ZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZThiNzNmLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanB0XzEuMC4wLioKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0IGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMjExYWYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyMDdiZi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIAotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIFJ1bnRpbWUKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjVlNTI4Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4zLjEucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSJXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgVXBkYXRlcyIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvLnByb2plY3QgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YTJiZjUuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnBhdGNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2J1aWxkLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM4MWZiMi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLXNyYy5pbmNsdWRlcyA9IGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLmpwdC5wYXRjaC5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanB0LnBhdGNoLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMTE1ZjQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanB0LnBhdGNoLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci0KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJCdWlsZCIgY29udGVudD0iQnVpbGQiPgotICAgPHRpdGxlPkphdmEgUGVyc2lzdGVuY2UgVG9vbHMgKEpUUCkgMS4wLjIgUGF0Y2hlczwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08aDE+SlRQIDIuMC4yIFBhdGNoZXM8L2gxPgotCi08aDI+RmVhdHVyZSBQYXRjaGVkOiBvcmcuZWNsaXBzZS5qcHQucGF0Y2g8L2gyPgotPGgzPlBsdWdpbihzKSByZXBsYWNlZDo8L2gzPgotPHVsPjxsaT5vcmcuZWNsaXBzZS5qcHQuZ2VuPC9saT48L3VsPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yMjAyOTcnPjIyMDI5NzwvYT4uIEVudGl0eSBnZW5lcmF0aW9uIGNyZWF0ZXMgRW1iZWRkYWJsZXMgd2l0aCBjb21waWxlIGVycm9ycyBpbiBzb21lIGNhc2VzLjwvcD4KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvZXBsLXYxMC5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQ1N2VhLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUphdmEgUGVyc2lzdGVuY2UgVG9vbHMgKEpUUCkgUGF0Y2hlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVwKLVBhdGNoKHMpIGZvciBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBUb29scy4gXG5cCi1TZWUgYnVnIDIyMDI5NyAoaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3MvMjIwMjk3KSBFbnRpdHkgZ2VuZXJhdGlvbiBjcmVhdGVzIEVtYmVkZGFibGVzIHdpdGggY29tcGlsZSBlcnJvcnMgaW4gc29tZSBjYXNlcyBcblwKLQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYtMDggT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2ZlYXR1cmUueG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmFlOTJiLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5wYXRjaCIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMi5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3BhdGNoZXMvIj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSJXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUGF0Y2hlcyIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvcGF0Y2hlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlIiB2ZXJzaW9uPSIxLjAuMi52MjAwODAyMTQwMTAwLTc3LTdfQ1lRQ0QyQ2FMWUNIQ0QiIHBhdGNoPSJ0cnVlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmdlbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2xpY2Vuc2UuaHRtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvLmN2c2lnbm9yZSBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyYWJmNy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSouYmluLmRpc3QuemlwCi1idWlsZC54bWwKLWZlYXR1cmVzCi1wbHVnaW5zCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrLy5wcm9qZWN0IGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxZDQ1My4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnNkazwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwMDkzOS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9lcGwtdjEwLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2ZlYXR1cmUucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGIxZmFiLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgcHJvamVjdCBTREsKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgcHJvamVjdCBTREsKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDE0LCAyMDEwXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1cblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAotXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAotXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS54bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGRjNzRmLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuc2RrIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMy4xLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdCIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9saWNlbnNlLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTQ0NjkzLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSouYmluLmRpc3QuemlwCi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpwdC50ZXN0c18xLjAuMC4qClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM0ODk5Yy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2FjYjY1Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTE6MDUgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjI2MDI5Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgcHJvamVjdCBUZXN0cwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OTRhZjkuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjMuMS5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udGVzdHMuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudGVzdHMuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy8ucHJvamVjdCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlhMjgyZi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD5VbnVzZWQgUHJvamVjdDwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC8ucHJvamVjdCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E2OWMyZi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdDwvbmFtZT4KLQk8Y29tbWVudD5VbnVzZWQgUHJvamVjdDwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMmFiZjcuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSouYmluLmRpc3QuemlwCi1idWlsZC54bWwKLWZlYXR1cmVzCi1wbHVnaW5zCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MDEzNzIuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmY2IxMTcuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgU0RLCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIHByb2plY3QgU0RLCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWRiYzNhLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjMuMS5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciCi0gICAgICBsaWNlbnNlLWZlYXR1cmU9Im9yZy5lY2xpcHNlLmxpY2Vuc2UiCi0gICAgICBsaWNlbnNlLWZlYXR1cmUtdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbl9zZGsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLmN2c2lnbm9yZSBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NDAxYTIuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qcHRfMS4wLjAuKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5wcm9qZWN0IGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MWIwNGMuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZWMyOWQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMDowOSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWZiZWRkLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0OyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjMuMS5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaHRtbCBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjA2YjEuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LmluaSBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg4YTMyNS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgInRpcHNBbmRUcmlja3NIcmVmIiBjb250YWlucyB0aGUgSGVscCB0b3BpYyBocmVmIHRvIGEgdGlwcyBhbmQgdHJpY2tzIHBhZ2UgCi0jIG9wdGlvbmFsCi10aXBzQW5kVHJpY2tzSHJlZj0vb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RpcHNfYW5kX3RyaWNrcy5odG0KLQotCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5tYXBwaW5ncyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LnByb3BlcnRpZXMgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzRhMTg2Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29sc1xuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA2LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2J1aWxkLnByb3BlcnRpZXMgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2NmYjBlLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5wbmcsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgY29tcG9uZW50LnhtbApkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvY29tcG9uZW50LnhtbCBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZjEzM2YuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQiPgotPGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPgotPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdCIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGIiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmRiLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5nZW4iIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC51dGlsaXR5IiBmcmFnbWVudD0iZmFsc2UiLz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5naWYgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9lY2xpcHNlMzIucG5nIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZmFjMS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvcGx1Z2luLnByb3BlcnRpZXMgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjMDU1YS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvLnByb2plY3QgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGIxMDZkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNTBkMTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpICAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEwYWFkMi4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBDb21tb24KLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIENvbW1vbgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTQwYzA4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZyIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUiIHZlcnNpb249IjEuMi4wIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQzNTg2ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIENvbW1vbiBTb3VyY2VcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNiwgMjAxMS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMzZTJlYi4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLmdpZixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8qKixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZiBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbCBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQwMGJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLQotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhNzlmMi4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgQ29tbW9uCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NzgzOWYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYjMyNGMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgQ29tbW9uCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgRWNsaXBzZUxpbmsgQ29tbW9uCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE2YmExZi4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIENvbW1vbiBTb3VyY2VcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNiwgMjAxMS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjZmNkNi4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLmdpZixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8qKixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZiBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbCBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQwMGJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLQotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhNzlmMi4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgQ29tbW9uCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMGUxMTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZmVhdHVyZS50ZW1wLmZvbGRlcgotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjczMzU0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjMxN2FlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjViNTFhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgQ29tbW9uIFNESwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgYXJjaGl2ZXMgZm9yIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSAtIEVjbGlwc2VMaW5rIENvbW1vbgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYjM1NmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMi4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBsaWNlbnNlLWZlYXR1cmU9Im9yZy5lY2xpcHNlLmxpY2Vuc2UiCi0gICAgICBsaWNlbnNlLWZlYXR1cmUtdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlLy5wcm9qZWN0IGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNkYWQwMy4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjg4NmJlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVkMzIwMC4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb21tb24KLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIENvbW1vbgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGYxYmE3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5icmFuZGluZyIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDBjMzMyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gQ29tbW9uIFNvdXJjZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA2LCAyMDExLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzNlMmViLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyoqLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDAwYmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotCi08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDEwNjc1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb21tb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3ODM5Zi4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk2ZmYzZi4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb21tb24KLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBDb21tb24KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDBjMzMyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gQ29tbW9uIFNvdXJjZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA2LCAyMDExLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNmY2Q2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyoqLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDAwYmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotCi08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDEwNjc1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb21tb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0IGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3ODNhNy4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvbW1vbi50ZXN0cy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGI5YzFhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi50ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGVmMjI4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gQ29tbW9uIEpVbml0IFRlc3RzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi0jIFRPUkVWSUVXIC0gdXBkYXRlU2l0ZU5hbWUKLXVwZGF0ZVNpdGVOYW1lPVdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgQ29tbW9uIEpVbml0IFRlc3RzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMTUwODAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjIuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZSIgdmVyc2lvbj0iMS4yLjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb25fc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwZTExNC4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mZWF0dXJlLnRlbXAuZm9sZGVyCi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb25fc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YjQ1NzQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb25fc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuY29tbW9uX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb25fc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTJlYTEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb25fc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NzgxNjguLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb25fc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb21tb24gU0RLCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSBhcmNoaXZlcyBmb3IgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIC0gQ29tbW9uCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb25fc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4ZjNlZi4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb25fc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvLmN2c2lnbm9yZSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvLnByb2plY3QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzk0MDExLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNjVlY2EuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmc7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvYWJvdXQuaHRtbCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2MDZiMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nL2Fib3V0LmluaSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzEwN2Q0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ0aXBzQW5kVHJpY2tzSHJlZiIgY29udGFpbnMgdGhlIEhlbHAgdG9waWMgaHJlZiB0byBhIHRpcHMgYW5kIHRyaWNrcyBwYWdlIAotIyBvcHRpb25hbAotdGlwc0FuZFRyaWNrc0hyZWY9L29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtCi0KLQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5icmFuZGluZy9hYm91dC5tYXBwaW5ncyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5icmFuZGluZy9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOTgyN2YuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb21tb25cblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IE9yYWNsZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDExLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMyMGUzYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvY29tcG9uZW50LnhtbCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQzN2VjOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nIj4KLTxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj4KLTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMDljMmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YjRlZWEwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb21tb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvLmNsYXNzcGF0aCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGU1YjBiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanN0LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9Im5vbmFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS8uY3ZzaWdub3JlIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS8ub3B0aW9ucyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg3ZWMzMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUgcGx1Z2luLgotCi0jIFR1cm4gb24gZGVidWdnaW5nIGZvciB0aGUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIHBsdWdpbi4KLW9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvLnByb2plY3QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MTNhMTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODRjZGFkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jRnJpIEFwciAwMSAxNzoxNDozNSBFRFQgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVhZmM2Yi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjEwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnBkZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy42LjAsNC4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy41LjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiCi1EYWxpLUNvbW1lbnQ6IFdlIGZyaWVuZCAndXRpbGl0eScgdG8gYWxsIG5vbi1FY2xpcHNlTGluaywgbm9uLXRlc3QgYnVuZGxlcwotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWw7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5nZW47Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5saWJwcm92OwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwubGlidmFsOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9uczsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5OwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmNvbW1hbmQ7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnM7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJwcm92LAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJ2YWwsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmNvbW1hbmQsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Ci1JbXBvcnQtUGFja2FnZTogY29tLmlibS5pY3UudGV4dDt2ZXJzaW9uPSI0LjAuMSIKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9hYm91dC5odG1sIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU5YzZmYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM4YTRhNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb21tb24gQ29yZQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotTElCUkFSWV9WQUxJREFUT1JTPUxpYnJhcnkgVmFsaWRhdG9ycwotUkVTT1VSQ0VfTE9DQVRPUlM9UmVzb3VyY2UgTG9jYXRvcnMKLQotSkFSX0NPTlRFTlQgPSBKQVIgQ29udGVudAotSkFWQV9QQUNLQUdFX0lORk9fQ09OVEVOVCA9IHBhY2thZ2UtaW5mby5qYXZhCi0KLU5PX09QX0xJQlJBUllfUFJPVklERVJfV0FSTklORyA9IExpYnJhcnkgY29uZmlndXJhdGlvbiBpcyBkaXNhYmxlZC4gVGhlIHVzZXIgbWF5IG5lZWQgdG8gY29uZmlndXJlIGZ1cnRoZXIgY2xhc3NwYXRoIGNoYW5nZXMgbGF0ZXIuCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvcGx1Z2luLnhtbCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTNlMjUzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy40Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotCi0gIENvbnRyaWJ1dG9yczoKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAtLT4KLSAKLTxwbHVnaW4+Ci0KLQk8IS0tICoqKioqIGV4dGVuc2lvbiBwb2ludHMgKioqKiogLS0+Ci0JCi0JPGV4dGVuc2lvbi1wb2ludAotCQlpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnJhcnlWYWxpZGF0b3JzIgotCQluYW1lPSIlTElCUkFSWV9WQUxJREFUT1JTIgotCQlzY2hlbWE9InNjaGVtYS9saWJyYXJ5VmFsaWRhdG9ycy5leHNkIi8+Ci0JCi0JCi0JPGV4dGVuc2lvbi1wb2ludAotCQlpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlTG9jYXRvcnMiCi0JCW5hbWU9IiVSRVNPVVJDRV9MT0NBVE9SUyIKLQkJc2NoZW1hPSJzY2hlbWEvcmVzb3VyY2VMb2NhdG9ycy5leHNkIi8+Ci0KLQotCTwhLS0gKioqKiogYWRhcHRlcnMgKioqKiogLS0+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotCi0JCTwhLS0gSVByb2plY3QgLT4gUHJvamVjdFJlc291cmNlTG9jYXRvciAtLT4KLQkJPGZhY3RvcnkKLQkJCWFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5Qcm9qZWN0QWRhcHRlckZhY3RvcnkiPgotCQkJPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLlByb2plY3RSZXNvdXJjZUxvY2F0b3IiLz4KLQkJPC9mYWN0b3J5PgotCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPCEtLSAqKioqKiBjb250ZW50IHR5cGVzICoqKioqIC0tPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUuY29udGVudFR5cGVzIj4KLQkKLQkJPCEtLSBKQVIgY29udGVudCB0eXBlIC0tPgotCQk8Y29udGVudC10eXBlCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmNvbnRlbnQuamFyIgotCQkJbmFtZT0iJUpBUl9DT05URU5UIgotCQkJZmlsZS1leHRlbnNpb25zPSJqYXIsIHppcCI+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LkJpbmFyeVNpZ25hdHVyZURlc2NyaWJlciI+Ci0JCQkJPHBhcmFtZXRlciBuYW1lPSJzaWduYXR1cmUiIHZhbHVlPSI1MCA0QiAwMyAwNCIvPgotCQkJPC9kZXNjcmliZXI+Ci0JCTwvY29udGVudC10eXBlPgotCQkKLSAgCQk8IS0tIHBhY2thZ2UtaW5mby5qYXZhIGNvbnRlbnQgdHlwZSAoZm9yIHBhY2thZ2UgYW5ub3RhdGlvbnMpIC0tPgotCQk8Y29udGVudC10eXBlCi0gICAgICAgCQlpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmNvbnRlbnQuamF2YVBhY2thZ2VJbmZvIgotICAgICAgICAJbmFtZT0iJUpBVkFfUEFDS0FHRV9JTkZPX0NPTlRFTlQiCi0gICAgICAgIAliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFTb3VyY2UiCi0gICAgICAgCSAJZmlsZS1uYW1lcz0icGFja2FnZS1pbmZvLmphdmEiCi0gICAgICAgIAlwcmlvcml0eT0ibm9ybWFsIj4KLSAgCQk8L2NvbnRlbnQtdHlwZT4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPCEtLSAqKioqKiBwcm9wZXJ0eSB0ZXN0ZXJzICoqKioqIC0tPgotCQotCTxleHRlbnNpb24gCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLnByb3BlcnR5VGVzdGVycyI+Ci0JCQotCQk8cHJvcGVydHlUZXN0ZXIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucHJvcGVydHlUZXN0ZXIubGlicmFyeVByb3ZpZGVyIgotCQkJdHlwZT0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5JTGlicmFyeVByb3ZpZGVyIgotCQkJbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUiCi0JCQlwcm9wZXJ0aWVzPSJpZCwgZXh0ZW5kc0lkIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5MaWJyYXJ5UHJvdmlkZXJQcm9wZXJ0eVRlc3RlciIvPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8IS0tICoqKioqIERhbGkgZXh0ZW5zaW9ucyAoZWF0IG91ciBvd24gZG9nZm9vZCkgKioqKiogLS0+Ci0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlTG9jYXRvcnMiPgotCQkKLQkJPHJlc291cmNlTG9jYXRvcgotCQkJaWQ9InNpbXBsZUphdmFSZXNvdXJjZUxvY2F0b3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLlNpbXBsZUphdmFSZXNvdXJjZUxvY2F0b3IiCi0JCQlwcmlvcml0eT0ibG93ZXN0Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJwcm9qZWN0Ij4KLQkJCQkJPHRlc3QgCi0JCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IiAKLQkJCQkJCXZhbHVlPSJqYXZhIiAKLQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIvPgotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZXNvdXJjZUxvY2F0b3I+Ci0JCQotCQk8cmVzb3VyY2VMb2NhdG9yCi0JCQlpZD0ibW9kdWxlUmVzb3VyY2VMb2NhdG9yIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5Nb2R1bGVSZXNvdXJjZUxvY2F0b3IiCi0JCQlwcmlvcml0eT0ibG93ZXIiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHdpdGggdmFyaWFibGU9InByb2plY3QiPgotCQkJCQk8YW5kPgotCQkJCQkJPHRlc3QgCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByb2plY3ROYXR1cmUiIAotCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlQ29yZU5hdHVyZSIgCi0JCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIi8+Ci0JCQkJCQk8bm90PgotCQkJCQkJCTx0ZXN0Ci0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCXZhbHVlPSJ3c3Qud2ViIgotCQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiLz4KLQkJCQkJCTwvbm90PgotCQkJCQk8L2FuZD4KLQkJCQk8L3dpdGg+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvcmVzb3VyY2VMb2NhdG9yPgotCQkKLQkJPHJlc291cmNlTG9jYXRvcgotCQkJaWQ9IndlYk1vZHVsZVJlc291cmNlTG9jYXRvciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuV2ViTW9kdWxlUmVzb3VyY2VMb2NhdG9yIgotCQkJcHJpb3JpdHk9ImxvdyI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0icHJvamVjdCI+Ci0JCQkJCTx0ZXN0IAotCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgCi0JCQkJCQl2YWx1ZT0ianN0LndlYiIgCi0JCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiLz4KLQkJCQk8L3dpdGg+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvcmVzb3VyY2VMb2NhdG9yPgotCQkKLQkJPHJlc291cmNlTG9jYXRvcgotCQkJaWQ9InBsdWdpblJlc291cmNlTG9jYXRvciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuUGx1Z2luUmVzb3VyY2VMb2NhdG9yIgotCQkJcHJpb3JpdHk9Im5vcm1hbCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0icHJvamVjdCI+Ci0JCQkJCTx0ZXN0IAotCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByb2plY3ROYXR1cmUiIAotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmUiIAotCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIi8+Ci0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3Jlc291cmNlTG9jYXRvcj4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPCEtLSAqKioqKiBXVFAgTGlicmFyeSBQcm92aWRlciBGcmFtZXdvcmsgSW50ZWdyYXRpb24gKioqKiogLS0+Ci0KLQk8ZXh0ZW5zaW9uIAotCQlwb2ludD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicmFyeVByb3ZpZGVycyI+Ci0JCQotCQk8cHJvdmlkZXIgCi0JCQlpZD0ianB0LW5vLW9wLWxpYnJhcnktcHJvdmlkZXIiIAotCQkJZXh0ZW5kcz0ibm8tb3AtbGlicmFyeS1wcm92aWRlciIKLQkJCWFic3RyYWN0PSJ0cnVlIj4KLQkJCTxwYXJhbSBuYW1lPSJ3YXJuaW5nIiB2YWx1ZT0iJU5PX09QX0xJQlJBUllfUFJPVklERVJfV0FSTklORyIvPgotCQk8L3Byb3ZpZGVyPgotCQotCTwvZXh0ZW5zaW9uPgotCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvcHJvcGVydHlfZmlsZXMvanB0X2NvbW1vbl9jb3JlLnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvcHJvcGVydHlfZmlsZXMvanB0X2NvbW1vbl9jb3JlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZWVmNTcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3Byb3BlcnR5X2ZpbGVzL2pwdF9jb21tb25fY29yZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1EQUxJX0pPQl9OQU1FPURhbGkKLURBTElfRVZFTlRfSEFORExFUl9USFJFQURfTkFNRT1EYWxpIEV2ZW50IEhhbmRsZXIKLUdFTkVSQVRJT05fQ1JFQVRJTkdfTEFVTkNIX0NPTkZJR19UQVNLPUNyZWF0aW5nIGxhdW5jaCBjb25maWd1cmF0aW9uCi1HRU5FUkFUSU9OX1NBVklOR19MQVVOQ0hfQ09ORklHX1RBU0s9U2F2aW5nIGxhdW5jaCBjb25maWd1cmF0aW9uCi1HRU5FUkFUSU9OX0xBVU5DSElOR19DT05GSUdfVEFTSz1MYXVuY2hpbmcgY29uZmlndXJhdGlvbgotUkVHSVNUUllfTUlTU0lOR19BVFRSSUJVVEU9TWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGUgJyd7MH0nJyBmb3IgZWxlbWVudCAnJ3sxfScnIGluIGV4dGVuc2lvbiAnJ3sxfScnIGZyb20gcGx1Zy1pbiAnJ3syfScnLgotUkVHSVNUUllfSU5WQUxJRF9WQUxVRT1JbnZhbGlkIHZhbHVlICcnezB9JycgZm9yICcnezF9JycgaW4gZXh0ZW5zaW9uICcnezJ9JycgZnJvbSBwbHVnLWluICcnezN9JycuCi1SRUdJU1RSWV9EVVBMSUNBVEU9QW4gZXh0ZW5zaW9uIG9mICcnezB9Jycgd2l0aCB0aGUgJyd7MX0nJyB2YWx1ZSBvZiAnJ3syfScnIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLVJFR0lTVFJZX0ZBSUxFRF9DTEFTU19MT0FEPVVuYWJsZSB0byBsb2FkIHRoZSBjbGFzcyAnJ3swfScnIGRlY2xhcmVkIGZvciB0aGUgZXh0ZW5zaW9uIHBvaW50ICcnezF9JycgaW4gdGhlIHBsdWctaW4gJyd7Mn0nJy4KLVJFR0lTVFJZX0ZBSUxFRF9JTlRFUkZBQ0VfQVNTSUdOTUVOVD1VbmFibGUgdG8gYXNzaWduIHRoZSBjbGFzcyAnJ3swfScnIGRlY2xhcmVkIGZvciB0aGUgZXh0ZW5zaW9uIHBvaW50ICcnezF9JycgaW4gdGhlIHBsdWctaW4gJyd7Mn0nJyB0byB0aGUgaW50ZXJmYWNlICcnezN9JycuCi1SRUdJU1RSWV9GQUlMRURfSU5TVEFOVElBVElPTj1VbmFibGUgdG8gaW5zdGFudGlhdGUgdGhlIGNsYXNzICcnezB9JycgZGVjbGFyZWQgZm9yIHRoZSBleHRlbnNpb24gcG9pbnQgJyd7MX0nJyBpbiB0aGUgcGx1Zy1pbiAnJ3syfScnLgotVVNFUl9MSUJSQVJZX1ZBTElEQVRPUl9fQ0xBU1NfTk9UX0ZPVU5EPVRoZSBjbGFzcyAnJ3swfScnIGlzIHJlcXVpcmVkIHRvIGJlIGluIHRoZSBzZWxlY3RlZCBsaWJyYXJpZXMuCi1WQUxJREFURV9DT05UQUlORVJfTk9UX1NQRUNJRklFRD1QYXJlbnQgZm9sZGVyIG11c3QgYmUgc3BlY2lmaWVkCi1WQUxJREFURV9GSUxFX05BTUVfTk9UX1NQRUNJRklFRD1GaWxlIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQKLVZBTElEQVRFX0ZJTEVfQUxSRUFEWV9FWElTVFM9RmlsZSBhbHJlYWR5IGV4aXN0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NjaGVtYS9saWJyYXJ5VmFsaWRhdG9ycy5leHNkIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NjaGVtYS9saWJyYXJ5VmFsaWRhdG9ycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmRhY2JiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zY2hlbWEvbGlicmFyeVZhbGlkYXRvcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIiBpZD0ibGlicmFyeVZhbGlkYXRvcnMiIG5hbWU9IkxpYnJhcnkgVmFsaWRhdG9ycyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBVc2VkIHRvIHByb3ZpZGUgY3VzdG9tIGxpYnJhcnkgdmFsaWRhdGlvbiB0byBKUFQgcHJvamVjdCBjb25maWd1cmF0aW9uLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ic2NoZW1hOi8vb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy9zY2hlbWEvZXhwcmVzc2lvbkxhbmd1YWdlLmV4c2QiLz4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcGluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImxpYnJhcnlWYWxpZGF0b3IiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJsaWJyYXJ5VmFsaWRhdG9yIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWNsYXJlcyBhIGxpYnJhcnkgdmFsaWRhdG9yLiAgU2VlICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJ2YWwuTGlicmFyeVZhbGlkYXRvciZsdDsvc2FtcCZndDsgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gbGlicmFyeSB2YWxpZGF0b3JzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlbmFibGVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGRlY2xhcmVkIGxpYnJhcnkgdmFsaWRhdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcywgd2hpY2ggaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlidmFsLkxpYnJhcnlWYWxpZGF0b3ImbHQ7L3NhbXAmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLmpwdC5jb3JlLmxpYnZhbC5MaWJyYXJ5VmFsaWRhdG9yIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEpQVCAzLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2JyJmd0OwotJmx0O3AmZ3Q7Ci1UaGUgZm9sbG93aW5nIGV4YW1wbGUgaXMgdGhlIGluY2x1ZGVkIGdlbmVyaWMgbGlicmFyeSB2YWxpZGF0b3IsIHdoaWNoIGlzIHVzZWQgZm9yIHVzZXIgbGlicmFyeSB2YWxpZGF0aW9uIGZvciBwcm9qZWN0cyBvZiB0aGUgZ2VuZXJpYyBKUEEgcGxhdGZvcm0gZ3JvdXAuCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uCi0gICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlicmFyeVZhbGlkYXRvcnMmcXVvdDsmZ3Q7Ci0gICAmbHQ7bGlicmFyeVZhbGlkYXRvcgotICAgICAgaWQ9JnF1b3Q7Z2VuZXJpY1VzZXJMaWJyYXJ5VmFsaWRhdG9yJnF1b3Q7Ci0gICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5saWJ2YWwuR2VuZXJpY0pwYVVzZXJMaWJyYXJ5VmFsaWRhdG9yJnF1b3Q7Jmd0OwotICAgICAgJmx0O2VuYWJsZW1lbnQmZ3Q7Ci0gICAgICAgICAmbHQ7d2l0aCB2YXJpYWJsZT0mcXVvdDtsaWJyYXJ5UHJvdmlkZXImcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGVzdCBwcm9wZXJ0eT0mcXVvdDtvcmcuZWNsaXBzZS5qcHQuY29yZS5leHRlbmRzSWQmcXVvdDsgdmFsdWU9JnF1b3Q7anBhLXVzZXItbGlicmFyeS1wcm92aWRlciZxdW90Oy8mZ3Q7Ci0gICAgICAgICAmbHQ7L3dpdGgmZ3Q7Ci0gICAgICAmbHQ7L2VuYWJsZW1lbnQmZ3Q7Ci0gICAmbHQ7L2xpYnJhcnlWYWxpZGF0b3ImZ3Q7Ci0mbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlpbmZvIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwJmd0OwotVGhlIGVuYWJsZW1lbnQgdmFyaWFibGVzIGluY2x1ZGU6Ci0mbHQ7dWwmZ3Q7Ci0mbHQ7bGkmZ3Q7JnF1b3Q7bGlicmFyeVByb3ZpZGVyJnF1b3Q7IHdoaWNoIGdpdmVzIHRoZSBjdXJyZW50IElMaWJyYXJ5UHJvdmlkZXIuJmx0Oy9saSZndDsKLSZsdDtsaSZndDsmcXVvdDtjb25maWcmcXVvdDsgd2hpY2ggZ2l2ZXMgdGhlIGN1cnJlbnQgSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy4mbHQ7L2xpJmd0OwotJmx0Oy91bCZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLVRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLWFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gCi1Db250cmlidXRvcnM6Ci1PcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc2NoZW1hL3Jlc291cmNlTG9jYXRvcnMuZXhzZCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zY2hlbWEvcmVzb3VyY2VMb2NhdG9ycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODJmNjg2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zY2hlbWEvcmVzb3VyY2VMb2NhdG9ycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUiIGlkPSJyZXNvdXJjZUxvY2F0b3JzIiBuYW1lPSJSZXNvdXJjZSBMb2NhdG9ycyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBVc2VkIHRvIHByb3ZpZGUgY3VzdG9tIChub24tSmF2YSkgcmVzb3VyY2UgbG9jYXRpb24gbG9naWMgdG8gSlBUIHByb2plY3RzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ic2NoZW1hOi8vb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy9zY2hlbWEvZXhwcmVzc2lvbkxhbmd1YWdlLmV4c2QiLz4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcGluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJlc291cmNlTG9jYXRvciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJyZXNvdXJjZUxvY2F0b3IiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlY2xhcmVzIGEgcmVzb3VyY2UgbG9jYXRvci4gIFNlZSAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuUmVzb3VyY2VMb2NhdG9yJmx0Oy9zYW1wJmd0OyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiByZXNvdXJjZSBsb2NhdG9ycy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZW5hYmxlbWVudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBkZWNsYXJlZCByZXNvdXJjZSBsb2NhdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcywgd2hpY2ggaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuUmVzb3VyY2VMb2NhdG9yJmx0Oy9zYW1wJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuUmVzb3VyY2VMb2NhdG9yIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJpb3JpdHkiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEluZGljYXRlcyB0aGUgcmVsYXRpdmUgcHJpb3JpdHkgb2YgdGhpcyBleHRlbnNpb24gdG8gb3RoZXIgZXh0ZW5zaW9ucy4gVXNlZCBieSB0aGUgcmVzb3VyY2UgbG9jYXRvciBtYW5hZ2VyIHRvIGRldGVybWluZSB3aGljaCBleHRlbnNpb24gc2hvdWxkIGJlIHVzZWQgaW4gdGhlIGNhc2UgdGhhdCBtdWx0aXBsZSBleHRlbnNpb25zIGFwcGx5IHRvIGEgZ2l2ZW4gcHJvamVjdC4gRGVmYXVsdHMgdG8gJnF1b3Q7bm9ybWFsJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgICAgPHNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ibG93ZXN0Ij4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Imxvd2VyIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImxvdyI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJub3JtYWwiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaGlnaCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJoaWdoZXIiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaGlnaGVzdCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgSlBUIDMuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YnImZ3Q7Ci0mbHQ7cCZndDsKLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpcyB0aGUgaW5jbHVkZWQgc2ltcGxlIEphdmEgcmVzb3VyY2UgbG9jYXRvciwgd2hpY2ggaXMgdXNlZCBmb3Igc2ltcGxlIEphdmEgcHJvamVjdHMuICBJdCBpcyBvZiAmcXVvdDtsb3dlc3QmcXVvdDsgcHJpb3JpdHksIHNpbmNlIGFsbCBKUFQgcHJvamVjdHMgd2lsbCBhdCB0aGVpciByb290cyBiZSBzaW1wbGUgSmF2YSBwcm9qZWN0cy4KLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSZsdDtleHRlbnNpb24gIAotIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZUxvY2F0b3JzJnF1b3Q7Jmd0OwotICZsdDtyZXNvdXJjZUxvY2F0b3IKLSAgaWQ9JnF1b3Q7c2ltcGxlSmF2YVJlc291cmNlTG9jYXRvciZxdW90OwotICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuU2ltcGxlSmF2YVJlc291cmNlTG9jYXRvciZxdW90OwotICBwcmlvcml0eT0mcXVvdDtsb3dlc3QmcXVvdDsKLSAgJmx0O2VuYWJsZW1lbnQmZ3Q7Ci0gICAmbHQ7d2l0aCB2YXJpYWJsZT0mcXVvdDtwcm9qZWN0JnF1b3Q7Jmd0OwotICAgICZsdDt0ZXN0IHByb3BlcnR5PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCZxdW90OyB2YWx1ZT0mcXVvdDtqYXZhJnF1b3Q7IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0mcXVvdDt0cnVlJnF1b3Q7LyZndDsKLSAgICZsdDsvd2l0aCZndDsKLSAgJmx0Oy9lbmFibGVtZW50Jmd0OwotICZsdDsvcmVzb3VyY2VMb2NhdG9yJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpaW5mbyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cCZndDsKLVRoZSBjb250cmlidXRlZCByZXNvdXJjZSBsb2NhdG9yIGNsYXNzIG11c3QgaW1wbGVtZW50ICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5SZXNvdXJjZUxvY2F0b3ImbHQ7L2NvZGUmZ3Q7LgotJmx0O3AmZ3Q7Ci1UaGUgZW5hYmxlbWVudCB2YXJpYWJsZXMgaW5jbHVkZToKLSZsdDt1bCZndDsKLSZsdDtsaSZndDsmcXVvdDtwcm9qZWN0JnF1b3Q7IHdoaWNoIGdpdmVzIHRoZSBjdXJyZW50ICZsdDtjb2RlJmd0O0lQcm9qZWN0Jmx0Oy9jb2RlJmd0Oy4mbHQ7L2xpJmd0OwotJmx0Oy91bCZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3AmZ3Q7VGhlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSBwbHVnLWluIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgcmVzb3VyY2UgbG9jYXRvcnM6Ci0mbHQ7dWwmZ3Q7Ci0mbHQ7bGkmZ3Q7c2ltcGxlSmF2YVJlc291cmNlTG9jYXRvciZsdDsvbGkmZ3Q7Ci0mbHQ7bGkmZ3Q7bW9kdWxlUmVzb3VyY2VMb2NhdG9yJmx0Oy9saSZndDsKLSZsdDtsaSZndDt3ZWJNb2R1bGVSZXNvdXJjZUxvY2F0b3ImbHQ7L2xpJmd0OwotJmx0O2xpJmd0O3BsdWdpblJlc291cmNlTG9jYXRvciZsdDsvbGkmZ3Q7Ci0mbHQ7L3VsJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLVRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLWFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gCi1Db250cmlidXRvcnM6Ci1PcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9Bbm5vdGF0aW9uUHJvdmlkZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL0Fubm90YXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTUxMzI5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL0Fubm90YXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaXMgdXNlZCB0byBwcm92aWRlIGFubm90YXRpb25zIGFuZCBuZXN0YWJsZSBhbm5vdGF0aW9ucy4gQW4gZXhjZXB0aW9uIHdpbGwKLSAqIGJlIHRocm93biBvbiBhbiBhdHRlbXB0IHRvIGJ1aWxkIGFuIGFubm90YXRpb24gdGhhdCBkb2VzIG5vdCBleGlzdC4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFubm90YXRpb25Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBhbm5vdGF0aW9ucy4KLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldEFubm90YXRpb25OYW1lcygpOwotCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZXMoKTsKLQotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZXMoKTsKLQotCVN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSk7Ci0KLQlTdHJpbmcgZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWUoU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOwotCi0JU3RyaW5nIGdldE5lc3RhYmxlRWxlbWVudE5hbWUoU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOwotCi0JLyoqCi0JICogQnVpbGQgYW4gYW5ub3RhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBuYW1lIGlzIHVuc3VwcG9ydGVkLgotCSAqIEBzZWUgI2dldEFubm90YXRpb25OYW1lcygpCi0JICovCi0JQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGFubm90YXRpb25OYW1lKTsKLQotCS8qKgotCSAqIEJ1aWxkIGEgbmVzdGFibGUgYW5ub3RhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgaW5kZXguCi0JICogVGhyb3cgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgbmFtZSBpcyB1bnN1cHBvcnRlZC4KLQkgKiBAc2VlICNnZXROZXN0YWJsZUFubm90YXRpb25OYW1lcygpCi0JICovCi0JTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbiBhbm5vdGF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEpEVCBhbm5vdGF0aW9uLgotCSAqIFRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gaXMgdW5zdXBwb3J0ZWQuCi0JICogQHNlZSAjZ2V0QW5ub3RhdGlvbk5hbWVzKCkKLQkgKi8KLQlBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbik7Ci0KLQkvKioKLQkgKiBCdWlsZCBhIG5lc3RhYmxlIGFubm90YXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSkRUIGFubm90YXRpb24gYW5kIGluZGV4LgotCSAqIFRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gaXMgdW5zdXBwb3J0ZWQuCi0JICogQHNlZSAjZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZXMoKQotCSAqLwotCU5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24sIGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhIG51bGwgYW5ub3RhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIGlzIHVuc3VwcG9ydGVkLgotCSAqIEBzZWUgI2dldEFubm90YXRpb25OYW1lcygpCi0JICovCi0JQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvR2VuZXJpY0Fubm90YXRpb25Qcm92aWRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvR2VuZXJpY0Fubm90YXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWVlNzM4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL0dlbmVyaWNBbm5vdGF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5Bbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci0KLS8qKgotICogRGVsZWdhdGUgdG8gYW5ub3RhdGlvbiBkZWZpbml0aW9uIHByb3ZpZGVycy4KLSAqIFRoZSBwbGF0Zm9ybSBmYWN0b3J5IHdpbGwgYnVpbGQgYW4gaW5zdGFuY2Ugb2YgdGhpcyBhbm5vdGF0aW9uIHByb3ZpZGVyLAotICogcGFzc2luZyBpbiB0aGUgYXBwcm9wcmlhdGUgYXJyYXkgb2YgYW5ub3RhdGlvbiBkZWZpbml0aW9uIHByb3ZpZGVycyBuZWNlc3NhcnkKLSAqIHRvIGJ1aWxkIHRoZSBhbm5vdGF0aW9ucyBmb3IgdGhlIHBsYXRmb3JtICh2ZW5kb3IgYW5kL29yIHZlcnNpb24pLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgR2VuZXJpY0Fubm90YXRpb25Qcm92aWRlcgotCWltcGxlbWVudHMgQW5ub3RhdGlvblByb3ZpZGVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbltdIGFubm90YXRpb25EZWZpbml0aW9uczsKLQotCXByaXZhdGUgZmluYWwgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbltdIG5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zOwotCQotCXB1YmxpYyBHZW5lcmljQW5ub3RhdGlvblByb3ZpZGVyKEFubm90YXRpb25EZWZpbml0aW9uW10gYW5ub3RhdGlvbkRlZmluaXRpb25zLCBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uW10gbmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hbm5vdGF0aW9uRGVmaW5pdGlvbnMgPSBhbm5vdGF0aW9uRGVmaW5pdGlvbnM7Ci0JCXRoaXMubmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMgPSBuZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uczsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEFubm90YXRpb25EZWZpbml0aW9uPiBnZXRBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxBbm5vdGF0aW9uRGVmaW5pdGlvbj4odGhpcy5hbm5vdGF0aW9uRGVmaW5pdGlvbnMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkRlZmluaXRpb24gZ2V0QW5ub3RhdGlvbkRlZmluaXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCWZvciAoQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gOiB0aGlzLmFubm90YXRpb25EZWZpbml0aW9ucykgewotCQkJaWYgKGFubm90YXRpb25EZWZpbml0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKGFubm90YXRpb25OYW1lKSkgewotCQkJCXJldHVybiBhbm5vdGF0aW9uRGVmaW5pdGlvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8QW5ub3RhdGlvbkRlZmluaXRpb24sIFN0cmluZz4oZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24pIHsKLQkJCQlyZXR1cm4gYW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uLCBTdHJpbmc+KGdldE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbikgewotCQkJCXJldHVybiBhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiwgU3RyaW5nPihnZXROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24pIHsKLQkJCQlyZXR1cm4gYW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvbkRlZmluaXRpb24oYW5ub3RhdGlvbk5hbWUpLmJ1aWxkQW5ub3RhdGlvbihwYXJlbnQsIGVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvbkRlZmluaXRpb24oamR0QW5ub3RhdGlvbi5nZXRFbGVtZW50TmFtZSgpKS5idWlsZEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmdldE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24oamR0QW5ub3RhdGlvbi5nZXRFbGVtZW50TmFtZSgpKS5idWlsZEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uLCBpbmRleCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldEFubm90YXRpb25EZWZpbml0aW9uKGFubm90YXRpb25OYW1lKS5idWlsZE51bGxBbm5vdGF0aW9uKHBhcmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24+IGdldE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbj4odGhpcy5uZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucyk7Ci0JfQotCi0JcHJvdGVjdGVkIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gZ2V0TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJZm9yIChOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uIDogdGhpcy5uZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucykgewotCQkJaWYgKGFubm90YXRpb25EZWZpbml0aW9uLmdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoYW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJcmV0dXJuIGFubm90YXRpb25EZWZpbml0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBOZXN0YWJsZUFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmdldE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24oYW5ub3RhdGlvbk5hbWUpLmJ1aWxkQW5ub3RhdGlvbihwYXJlbnQsIGVsZW1lbnQsIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiBnZXROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uRm9yQ29udGFpbmVyKGNvbnRhaW5lckFubm90YXRpb25OYW1lKS5nZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZShTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gZ2V0TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbihuZXN0YWJsZUFubm90YXRpb25OYW1lKS5nZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVFbGVtZW50TmFtZShTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gZ2V0TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbihuZXN0YWJsZUFubm90YXRpb25OYW1lKS5nZXRFbGVtZW50TmFtZSgpOwkJCi0JfQotCi0JcHJpdmF0ZSBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uIGdldE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25Gb3JDb250YWluZXIoU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lKSB7Ci0JCWZvciAoTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBuZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uIDogZ2V0TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSkgewotCQkJaWYgKG5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJcmV0dXJuIG5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvSnB0Q29tbW9uQ29yZVBsdWdpbi5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvSnB0Q29tbW9uQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2UwNmUzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL0pwdENvbW1vbkNvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLkpwdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwubGlidmFsLkxpYnJhcnlWYWxpZGF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJwcm92LkpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnZhbC5MaWJyYXJ5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vLyBUT0RPIGJqdiBtb3ZlIHRvICpwcml2YXRlKiBpbnRlcm5hbCBwYWNrYWdlIGFuZCBtb3ZlIGFsbCBwdWJsaWMgc3R1ZmYgdG8gYWRhcHRlcnMgZXRjLgotcHVibGljIGNsYXNzIEpwdENvbW1vbkNvcmVQbHVnaW4KLQlleHRlbmRzIEpwdFBsdWdpbgotewotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgY29uc3RhbnRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBwbHVnLWluIGlkZW50aWZpZXIgb2YgdGhlIGpwdCBjb21tb24gY29yZSBzdXBwb3J0Ci0JICogKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUiPC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSI7ICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEXyA9IFBMVUdJTl9JRCArICcuJzsKLQotCi0JLyoqCi0JICogVGhlIGNvbnRlbnQgdHlwZSBmb3IgSmF2YSBzb3VyY2UgY29kZSBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElDb250ZW50VHlwZSBKQVZBX1NPVVJDRV9DT05URU5UX1RZUEUgPSBnZXRDb250ZW50VHlwZShKYXZhQ29yZS5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpOwotCQotCS8qKgotCSAqIFRoZSByZXNvdXJjZSB0eXBlIGZvciBKYXZhIHNvdXJjZSBjb2RlIGZpbGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKcHRSZXNvdXJjZVR5cGUgSkFWQV9TT1VSQ0VfUkVTT1VSQ0VfVFlQRSA9IG5ldyBKcHRSZXNvdXJjZVR5cGUoSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKTsKLQkKLQkvKioKLQkgKiBUaGUgY29udGVudCB0eXBlIGZvciBKYXZhIGFyY2hpdmVzIChKQVJzKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElDb250ZW50VHlwZSBKQVJfQ09OVEVOVF9UWVBFID0gZ2V0SnB0Q29udGVudFR5cGUoImphciIpOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIHJlc291cmNlIHR5cGUgZm9yIEphdmEgYXJjaGl2ZXMgKEpBUnMpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnB0UmVzb3VyY2VUeXBlIEpBUl9SRVNPVVJDRV9UWVBFID0gbmV3IEpwdFJlc291cmNlVHlwZShKcHRDb21tb25Db3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpOwotCi0JLyoqCi0JICogVGhlIGNvbnRlbnQgdHlwZSBmb3IgcGFja2FnZS1pbmZvIEphdmEgY29kZSBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElDb250ZW50VHlwZSBKQVZBX1NPVVJDRV9QQUNLQUdFX0lORk9fQ09OVEVOVF9UWVBFID0gZ2V0SnB0Q29udGVudFR5cGUoImphdmFQYWNrYWdlSW5mbyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcmVzb3VyY2UgdHlwZSBmb3IgcGFja2FnZS1pbmZvIEphdmEgY29kZSBmaWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnB0UmVzb3VyY2VUeXBlIEpBVkFfU09VUkNFX1BBQ0tBR0VfSU5GT19SRVNPVVJDRV9UWVBFID0gbmV3IEpwdFJlc291cmNlVHlwZShKQVZBX1NPVVJDRV9QQUNLQUdFX0lORk9fQ09OVEVOVF9UWVBFKTsKLQkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKUFRfQ09OVEVOVF9QUkVGSVggPSBQTFVHSU5fSURfICsgImNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpQVF9DT05URU5UX1BSRUZJWF8gPSBKUFRfQ09OVEVOVF9QUkVGSVggKyAnLic7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbnRlbnRUeXBlIGdldEpwdENvbnRlbnRUeXBlKFN0cmluZyBqcHRDb250ZW50VHlwZSkgewotCQlyZXR1cm4gZ2V0Q29udGVudFR5cGUoSlBUX0NPTlRFTlRfUFJFRklYXyArIGpwdENvbnRlbnRUeXBlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPExpYnJhcnlWYWxpZGF0b3I+IGdldExpYnJhcnlWYWxpZGF0b3JzKAotCQkJSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBjb25maWcpIHsKLQkJcmV0dXJuIExpYnJhcnlWYWxpZGF0b3JNYW5hZ2VyLmluc3RhbmNlKCkuZ2V0TGlicmFyeVZhbGlkYXRvcnMoY29uZmlnKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHNpbmdsZXRvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBKcHRDb21tb25Db3JlUGx1Z2luIElOU1RBTkNFOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24gRGFsaSBjb21tb24gY29yZSBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnB0Q29tbW9uQ29yZVBsdWdpbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLQkJSU5TVEFOQ0UubG9nRXJyb3IobXNnKTsKLSAgICB9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBleGNlcHRpb24gb3IgZXJyb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCUlOU1RBTkNFLmxvZ0Vycm9yKHRocm93YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBhbmQgZXhjZXB0aW9uIG9yIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlJTlNUQU5DRS5sb2dFcnJvcihtc2csIHRocm93YWJsZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHBsdWctaW4gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEpwdENvbW1vbkNvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChJTlNUQU5DRSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gdGhpcyBjb252ZW50aW9uIGlzICp3YWNrKi4uLiAgfmJqdgotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkvLyBub3RoaW5nIHlldC4uLgotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQkvLyBub3RoaW5nIHlldC4uLgotCQl9IGZpbmFsbHkgewotCQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL0pwdFJlc291cmNlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL0pwdFJlc291cmNlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE4M2FkZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9KcHRSZXNvdXJjZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi0vKioKLSAqIExpc3RlbmVycyBhcmUgbm90aWZpZWQgd2hlbmV2ZXIgYW55dGhpbmcgaW4gdGhlIEpQVCByZXNvdXJjZSBtb2RlbCBjaGFuZ2VzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnB0UmVzb3VyY2VNb2RlbCB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBtb2RlbCdzIHJlc291cmNlIHR5cGUuIFRoaXMgY2FuIGNoYW5nZS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc291cmNlIHR5cGUgY2Fubm90IGJlIGRldGVybWluZWQsCi0JICogdGhlIGNvbnRlbnQgdHlwZSBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciB0aGUgdmVyc2lvbiBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlKcHRSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1vZGVsJ3MgZmlsZS4KLQkgKi8KLQlJRmlsZSBnZXRGaWxlKCk7Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRvIHRoZSByZXNvdXJjZSBtb2RlbCByZXN1bHQgaW4gZXZlbnRzLgotCSAqIEluIHBhcnRpY3VsYXIsIHRoZSBKUEEgcHJvamVjdCBwZXJmb3JtcyBhbiAidXBkYXRlIiB3aGVuZXZlciBhIHJlc291cmNlCi0JICogbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQl2b2lkIGFkZFJlc291cmNlTW9kZWxMaXN0ZW5lcihKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQHNlZSAjYWRkUmVzb3VyY2VNb2RlbExpc3RlbmVyKEpwdFJlc291cmNlTW9kZWxMaXN0ZW5lcikKLQkgKi8KLQl2b2lkIHJlbW92ZVJlc291cmNlTW9kZWxMaXN0ZW5lcihKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9KcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjYTZmZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9KcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlSW1wbDsKLQotLyoqCi0gKiBUaGUgbGlzdGVuZXIgaXMgbm90aWZpZWQgd2hlbmV2ZXIgYW55dGhpbmcgaW4gdGhlIEpQQSByZXNvdXJjZSBtb2RlbCBjaGFuZ2VzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyCi0JZXh0ZW5kcyBFdmVudExpc3RlbmVyCi17Ci0Jdm9pZCByZXNvdXJjZU1vZGVsQ2hhbmdlZChKcHRSZXNvdXJjZU1vZGVsIGpwYVJlc291cmNlTW9kZWwpOwotCQotCS8qKgotCSAqIE1vZGlmaWVkIHJlc291cmNlIGlzIGNsb3NlZCB3aXRob3V0IHNhdmluZwotCSAqIEBzZWUgVHJhbnNsYXRvclJlc291cmNlSW1wbCNpc1JldmVydGluZygpCi0JICovCi0Jdm9pZCByZXNvdXJjZU1vZGVsUmV2ZXJ0ZWQoSnB0UmVzb3VyY2VNb2RlbCBqcGFSZXNvdXJjZU1vZGVsKTsKLQkKLQl2b2lkIHJlc291cmNlTW9kZWxVbmxvYWRlZChKcHRSZXNvdXJjZU1vZGVsIGpwYVJlc291cmNlTW9kZWwpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvSnB0UmVzb3VyY2VUeXBlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9KcHRSZXNvdXJjZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg2MzU1ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9KcHRSZXNvdXJjZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBmaWxlIGNvbnRlbnQgdHlwZSBhbmQgdmVyc2lvbiBmb3IgSlBBIHJlc291cmNlcy4KLSAqIFRoaXMgaXMgYSB2YWx1ZSBvYmplY3QgdGhhdCBkZWZpbmVzIGFuIHtAbGluayAjZXF1YWxzKE9iamVjdCl9IG1ldGhvZC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgY2xhc3MgSnB0UmVzb3VyY2VUeXBlCi17Ci0JcHJpdmF0ZSBmaW5hbCBJQ29udGVudFR5cGUgY29udGVudFR5cGU7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyB2ZXJzaW9uOwotCi0KLQkvKioKLQkgKiBWZXJzaW9uIHVzZWQgd2hlbiB2ZXJzaW9uIGNhbiBub3QgYmUgZGV0ZXJtaW5lZCBvciB3aGVuIHRoZXJlIGlzIG5vCi0JICogc2Vuc2Ugb2YgdmVyc2lvbiAoZS5nLiBKYXZhKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRFVEVSTUlORURfVkVSU0lPTiA9ICI8dW5kZXRlcm1pbmVkPiI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIEpwdFJlc291cmNlVHlwZShJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJdGhpcyhjb250ZW50VHlwZSwgVU5ERVRFUk1JTkVEX1ZFUlNJT04pOwotCX0KLQotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlLCBTdHJpbmcgdmVyc2lvbikgewotCQlzdXBlcigpOwotCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJjb250ZW50IHR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICh2ZXJzaW9uID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOwotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCX0KLQotCi0JcHVibGljIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29udGVudFR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdGhpcy52ZXJzaW9uOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKChvYmogPT0gbnVsbCkgfHwgKG9iai5nZXRDbGFzcygpICE9IHRoaXMuZ2V0Q2xhc3MoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlKcHRSZXNvdXJjZVR5cGUgb3RoZXIgPSAoSnB0UmVzb3VyY2VUeXBlKSBvYmo7Ci0JCXJldHVybiB0aGlzLmNvbnRlbnRUeXBlLmVxdWFscyhvdGhlci5jb250ZW50VHlwZSkgJiYgdGhpcy52ZXJzaW9uLmVxdWFscyhvdGhlci52ZXJzaW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKLQkJaW50IGhhc2ggPSAxNzsKLQkJaGFzaCA9IGhhc2ggKiBwcmltZSArIHRoaXMuY29udGVudFR5cGUuaGFzaENvZGUoKTsKLQkJaGFzaCA9IGhhc2ggKiBwcmltZSArIHRoaXMudmVyc2lvbi5oYXNoQ29kZSgpOwotCQlyZXR1cm4gaGFzaDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlzYi5hcHBlbmQoIihjb250ZW50ID0gIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMuY29udGVudFR5cGUpOwotCQlzYi5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKCJ2ZXJzaW9uID0gIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMudmVyc2lvbik7Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9KcHRDb21tb25Db3JlTWVzc2FnZXMuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL0pwdENvbW1vbkNvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWU2ZTQwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL0pwdENvbW1vbkNvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIExvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IERhbGkgY29tbW9uIGNvcmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRDb21tb25Db3JlTWVzc2FnZXMgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgREFMSV9KT0JfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEQUxJX0VWRU5UX0hBTkRMRVJfVEhSRUFEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR0VORVJBVElPTl9DUkVBVElOR19MQVVOQ0hfQ09ORklHX1RBU0s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR0VORVJBVElPTl9TQVZJTkdfTEFVTkNIX0NPTkZJR19UQVNLOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdFTkVSQVRJT05fTEFVTkNISU5HX0NPTkZJR19UQVNLOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFR0lTVFJZX01JU1NJTkdfQVRUUklCVVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFR0lTVFJZX0lOVkFMSURfVkFMVUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVHSVNUUllfRFVQTElDQVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFR0lTVFJZX0ZBSUxFRF9DTEFTU19MT0FEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFR0lTVFJZX0ZBSUxFRF9JTlRFUkZBQ0VfQVNTSUdOTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRUdJU1RSWV9GQUlMRURfSU5TVEFOVElBVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVU0VSX0xJQlJBUllfVkFMSURBVE9SX19DTEFTU19OT1RfRk9VTkQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfQ09OVEFJTkVSX05PVF9TUEVDSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfRklMRV9OQU1FX05PVF9TUEVDSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfRklMRV9BTFJFQURZX0VYSVNUUzsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianB0X2NvbW1vbl9jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdENvbW1vbkNvcmVNZXNzYWdlcy5jbGFzczsKLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBCVU5ETEVfQ0xBU1MpOwotCX0KLQkKLQlwcml2YXRlIEpwdENvbW1vbkNvcmVNZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvSnB0UGx1Z2luLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9KcHRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJiZTcxMi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9KcHRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kZWJ1Zy5EZWJ1Z09wdGlvbnM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOwotCi0vKioKLSAqIENvbW1vbiBEYWxpIHBsdWctaW4gYmVoYXZpb3IuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKcHRQbHVnaW4KLQlleHRlbmRzIFBsdWdpbgotewotCXByb3RlY3RlZCBCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQ7Ci0JcHJvdGVjdGVkIFNlcnZpY2VUcmFja2VyPERlYnVnT3B0aW9ucywgRGVidWdPcHRpb25zPiBkZWJ1Z09wdGlvbnNTZXJ2aWNlVHJhY2tlcjsKLQotCi0JcHJvdGVjdGVkIEpwdFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbG9nZ2luZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBtZXNzYWdlIHdpdGggYSBzZXZlcml0eSBvZgotCSAqIHtAbGluayBJU3RhdHVzI0VSUk9SIEVSUk9SfS4KLQkgKiBAc2VlICNsb2coaW50LCBTdHJpbmcpCi0JICogQHNlZSBJU3RhdHVzCi0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcy5sb2coSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSk7Ci0gICAgfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSB3aXRoIHRoZSBzcGVjaWZpZWQgc2V2ZXJpdHkuCi0JICogQHNlZSBJU3RhdHVzI2dldFNldmVyaXR5KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICB0aGlzLmxvZyhzZXZlcml0eSwgbWVzc2FnZSwgbnVsbCk7Ci0gICAgfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIG9yIGVycm9yIHdpdGggYSBzZXZlcml0eSBvZgotCSAqIHtAbGluayBJU3RhdHVzI0VSUk9SIEVSUk9SfS4KLQkgKiBAc2VlICNsb2coaW50LCBUaHJvd2FibGUpCi0JICogQHNlZSBJU3RhdHVzCi0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoVGhyb3dhYmxlIHRocm93YWJsZSkgewotICAgICAgICB0aGlzLmxvZyhJU3RhdHVzLkVSUk9SLCB0aHJvd2FibGUpOwotCX0KLQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiBvciBlcnJvciB3aXRoIHRoZSBzcGVjaWZpZWQgc2V2ZXJpdHkuCi0JICogQHNlZSBJU3RhdHVzI2dldFNldmVyaXR5KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCXRoaXMubG9nKHNldmVyaXR5LCB0aHJvd2FibGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCB0aHJvd2FibGUpOwotCX0KLQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbiBvciBlcnJvciB3aXRoIGEgc2V2ZXJpdHkgb2YKLQkgKiB7QGxpbmsgSVN0YXR1cyNFUlJPUiBFUlJPUn0uCi0JICogQHNlZSAjbG9nKGludCwgU3RyaW5nLCBUaHJvd2FibGUpCi0JICogQHNlZSBJU3RhdHVzCi0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQl0aGlzLmxvZyhJU3RhdHVzLkVSUk9SLCBtc2csIHRocm93YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBhbmQgZXhjZXB0aW9uIG9yIGVycm9yCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIHNldmVyaXR5LgotCSAqIEBzZWUgSVN0YXR1cyNnZXRTZXZlcml0eSgpCi0JICogQHNlZSBJU3RhdHVzI2dldENvZGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtc2csIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJdGhpcy5sb2coc2V2ZXJpdHksIElTdGF0dXMuT0ssIG1zZywgdGhyb3dhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGFuZCBleGNlcHRpb24gb3IgZXJyb3IKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgc2V2ZXJpdHkgYW5kIGNvZGUuCi0JICogQHNlZSBJU3RhdHVzI2dldFNldmVyaXR5KCkKLQkgKiBAc2VlIElTdGF0dXMjZ2V0Q29kZSgpCi0JICovCi0JcHVibGljIHZvaWQgbG9nKGludCBzZXZlcml0eSwgaW50IGNvZGUsIFN0cmluZyBtc2csIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJdGhpcy5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgdGhpcy5nZXRQbHVnaW5JRCgpLCBjb2RlLCBtc2csIHRocm93YWJsZSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWJ1ZyBvcHRpb25zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGRlYnVnIG9wdGlvbiBhcyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgotCSAqIFJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm8gc3VjaCBvcHRpb24gaXMgZm91bmQuCi0JICogPHA+Ci0JICogVGhlIGRlYnVnIG9wdGlvbiBpcyB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBwbHVnLWluJ3MgZGVidWcgb3B0aW9ucwotCSAqIChlLmcuIGZvciB0aGUgcGx1Zy1pbiA8Y29kZT4ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIjwvY29kZT4sCi0JICogdGhlIHNwZWNpZmllZCBvcHRpb24gPGNvZGU+ImZvbyI8L2NvZGU+IHdpbGwgYmUgbWFwcGVkIHRvCi0JICogdGhlIHtAbGluayBQbGF0Zm9ybX0gb3B0aW9uCi0JICogPGNvZGU+Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9kZWJ1Zy9mb28iPC9jb2RlPikuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbkRlYnVnT3B0aW9uKFN0cmluZyBvcHRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkRlYnVnT3B0aW9uKG9wdGlvbiwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGRlYnVnIG9wdGlvbiBhcyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUgaWYgbm8gc3VjaCBvcHRpb24gaXMgZm91bmQuCi0JICogPHA+Ci0JICogVGhlIGRlYnVnIG9wdGlvbiBpcyB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBwbHVnLWluJ3MgZGVidWcgb3B0aW9ucwotCSAqIChlLmcuIGZvciB0aGUgcGx1Zy1pbiA8Y29kZT4ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIjwvY29kZT4sCi0JICogdGhlIHNwZWNpZmllZCBvcHRpb24gPGNvZGU+ImZvbyI8L2NvZGU+IHdpbGwgYmUgbWFwcGVkIHRvCi0JICogdGhlIHtAbGluayBQbGF0Zm9ybX0gb3B0aW9uCi0JICogPGNvZGU+Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9kZWJ1Zy9mb28iPC9jb2RlPikuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbkRlYnVnT3B0aW9uKFN0cmluZyBvcHRpb24sIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IHRoaXMuZ2V0RGVidWdPcHRpb24ob3B0aW9uKTsKLQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IGRlZmF1bHRWYWx1ZSA6IEJvb2xlYW4ucGFyc2VCb29sZWFuKHZhbHVlLnRyaW0oKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgZGVidWcgb3B0aW9uIGFzIGFuIDxjb2RlPmludDwvY29kZT4gdmFsdWUuCi0JICogUmV0dXJuIDxjb2RlPi0xPC9jb2RlPiBpZiBubyBzdWNoIG9wdGlvbiBpcyBmb3VuZC4KLQkgKiA8cD4KLQkgKiBUaGUgZGVidWcgb3B0aW9uIGlzIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHBsdWctaW4ncyBkZWJ1ZyBvcHRpb25zCi0JICogKGUuZy4gZm9yIHRoZSBwbHVnLWluIDxjb2RlPiJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUiPC9jb2RlPiwKLQkgKiB0aGUgc3BlY2lmaWVkIG9wdGlvbiA8Y29kZT4iZm9vIjwvY29kZT4gd2lsbCBiZSBtYXBwZWQgdG8KLQkgKiB0aGUge0BsaW5rIFBsYXRmb3JtfSBvcHRpb24KLQkgKiA8Y29kZT4ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL2RlYnVnL2ZvbyI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVnZXJEZWJ1Z09wdGlvbihTdHJpbmcgb3B0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmdldEludGVnZXJEZWJ1Z09wdGlvbihvcHRpb24sIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBkZWJ1ZyBvcHRpb24gYXMgYW4gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlIGlmIG5vIHN1Y2ggb3B0aW9uIGlzIGZvdW5kLgotCSAqIDxwPgotCSAqIFRoZSBkZWJ1ZyBvcHRpb24gaXMgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgcGx1Zy1pbidzIGRlYnVnIG9wdGlvbnMKLQkgKiAoZS5nLiBmb3IgdGhlIHBsdWctaW4gPGNvZGU+Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSI8L2NvZGU+LAotCSAqIHRoZSBzcGVjaWZpZWQgb3B0aW9uIDxjb2RlPiJmb28iPC9jb2RlPiB3aWxsIGJlIG1hcHBlZCB0bwotCSAqIHRoZSB7QGxpbmsgUGxhdGZvcm19IG9wdGlvbgotCSAqIDxjb2RlPiJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvZGVidWcvZm9vIjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZWdlckRlYnVnT3B0aW9uKFN0cmluZyBvcHRpb24sIGludCBkZWZhdWx0VmFsdWUpIHsKLQkJU3RyaW5nIHZhbHVlID0gdGhpcy5nZXREZWJ1Z09wdGlvbihvcHRpb24pOwotCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gZGVmYXVsdFZhbHVlIDogSW50ZWdlci5wYXJzZUludCh2YWx1ZS50cmltKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGRlYnVnIG9wdGlvbi4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCBvcHRpb24gaXMgZm91bmQuCi0JICogPHA+Ci0JICogVGhlIGRlYnVnIG9wdGlvbiBpcyB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBwbHVnLWluJ3MgZGVidWcgb3B0aW9ucwotCSAqIChlLmcuIGZvciB0aGUgcGx1Zy1pbiA8Y29kZT4ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIjwvY29kZT4sCi0JICogdGhlIHNwZWNpZmllZCBvcHRpb24gPGNvZGU+ImZvbyI8L2NvZGU+IHdpbGwgYmUgbWFwcGVkIHRvCi0JICogdGhlIHtAbGluayBQbGF0Zm9ybX0gb3B0aW9uCi0JICogPGNvZGU+Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9kZWJ1Zy9mb28iPC9jb2RlPikuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWJ1Z09wdGlvbihTdHJpbmcgb3B0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmdldERlYnVnT3B0aW9uKG9wdGlvbiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgZGVidWcgb3B0aW9uLgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUgaWYgbm8gc3VjaCBvcHRpb24gaXMgZm91bmQuCi0JICogPHA+Ci0JICogVGhlIGRlYnVnIG9wdGlvbiBpcyB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBwbHVnLWluJ3MgZGVidWcgb3B0aW9ucwotCSAqIChlLmcuIGZvciB0aGUgcGx1Zy1pbiA8Y29kZT4ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIjwvY29kZT4sCi0JICogdGhlIHNwZWNpZmllZCBvcHRpb24gPGNvZGU+ImZvbyI8L2NvZGU+IHdpbGwgYmUgbWFwcGVkIHRvCi0JICogdGhlIHtAbGluayBQbGF0Zm9ybX0gb3B0aW9uCi0JICogPGNvZGU+Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9kZWJ1Zy9mb28iPC9jb2RlPikuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWJ1Z09wdGlvbihTdHJpbmcgb3B0aW9uLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmlzRGVidWdnaW5nKCkgPyB0aGlzLmdldERlYnVnT3B0aW9uXyhvcHRpb24sIGRlZmF1bHRWYWx1ZSkgOiBkZWZhdWx0VmFsdWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWJ1Z09wdGlvbl8oU3RyaW5nIG9wdGlvbiwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShvcHRpb24pKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkZWJ1ZyBvcHRpb24gY2Fubm90IGJlIGJsYW5rIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmcgdmFsdWUgPSB0aGlzLmdldERlYnVnT3B0aW9uXyhvcHRpb24pOwotCQlyZXR1cm4gKHZhbHVlICE9IG51bGwpID8gdmFsdWUgOiBkZWZhdWx0VmFsdWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWJ1Z09wdGlvbl8oU3RyaW5nIG9wdGlvbikgewotCQlEZWJ1Z09wdGlvbnMgZGVidWdPcHRpb25zID0gdGhpcy5nZXREZWJ1Z09wdGlvbnMoKTsKLQkJcmV0dXJuIChkZWJ1Z09wdGlvbnMgPT0gbnVsbCkgPyBudWxsIDogZGVidWdPcHRpb25zLmdldE9wdGlvbih0aGlzLmdldFBsdWdpbkRlYnVnT3B0aW9uKCkgKyBvcHRpb24pOwotCX0KLQotCXByb3RlY3RlZCBEZWJ1Z09wdGlvbnMgZ2V0RGVidWdPcHRpb25zKCkgewotCQlTZXJ2aWNlVHJhY2tlcjxEZWJ1Z09wdGlvbnMsIERlYnVnT3B0aW9ucz4gdHJhY2tlciA9IHRoaXMuZ2V0RGVidWdPcHRpb25zU2VydmljZVRyYWNrZXIoKTsKLQkJcmV0dXJuICh0cmFja2VyID09IG51bGwpID8gbnVsbCA6IHRyYWNrZXIuZ2V0U2VydmljZSgpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIFNlcnZpY2VUcmFja2VyPERlYnVnT3B0aW9ucywgRGVidWdPcHRpb25zPiBnZXREZWJ1Z09wdGlvbnNTZXJ2aWNlVHJhY2tlcigpIHsKLQkJaWYgKHRoaXMuaXNBY3RpdmUoKSAmJiAodGhpcy5kZWJ1Z09wdGlvbnNTZXJ2aWNlVHJhY2tlciA9PSBudWxsKSkgewotCQkJdGhpcy5kZWJ1Z09wdGlvbnNTZXJ2aWNlVHJhY2tlciA9IHRoaXMuYnVpbGREZWJ1Z09wdGlvbnNTZXJ2aWNlVHJhY2tlcigpOwotCQkJdGhpcy5kZWJ1Z09wdGlvbnNTZXJ2aWNlVHJhY2tlci5vcGVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZGVidWdPcHRpb25zU2VydmljZVRyYWNrZXI7Ci0JfQotCi0JcHJpdmF0ZSBTZXJ2aWNlVHJhY2tlcjxEZWJ1Z09wdGlvbnMsIERlYnVnT3B0aW9ucz4gYnVpbGREZWJ1Z09wdGlvbnNTZXJ2aWNlVHJhY2tlcigpIHsKLQkJcmV0dXJuIG5ldyBTZXJ2aWNlVHJhY2tlcjxEZWJ1Z09wdGlvbnMsIERlYnVnT3B0aW9ucz4odGhpcy5idW5kbGVDb250ZXh0LCBEZWJ1Z09wdGlvbnMuY2xhc3MsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGx1Zy1pbidzIGRlYnVnIG9wdGlvbiBwYXRoLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGx1Z2luRGVidWdPcHRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmdldFBsdWdpbklEKCkgKyBERUJVR19PUFRJT05fU0NPUEU7Ci0JfQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX09QVElPTl9TQ09QRSA9ICIvZGVidWcvIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvLyAqKioqKioqKioqIHBsdWctaW4gbGlmZWN5Y2xlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJdGhpcy5idW5kbGVDb250ZXh0ID0gY29udGV4dDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJdGhpcy5zdG9wXygpOwotCQl9IGZpbmFsbHkgewotCQkJdGhpcy5idW5kbGVDb250ZXh0ID0gbnVsbDsKLQkJCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9wXygpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAodGhpcy5kZWJ1Z09wdGlvbnNTZXJ2aWNlVHJhY2tlciAhPSBudWxsKSB7Ci0JCQl0aGlzLmRlYnVnT3B0aW9uc1NlcnZpY2VUcmFja2VyLmNsb3NlKCk7Ci0JCQl0aGlzLmRlYnVnT3B0aW9uc1NlcnZpY2VUcmFja2VyID0gbnVsbDsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JCXJldHVybiB0aGlzLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwbHVnLWluIGlzIGFjdGl2ZTsgaS5lLiBpdCBoYXMgYmVlbgotCSAqIHtAbGluayAjc3RhcnQoQnVuZGxlQ29udGV4dCkgc3RhcnRlZH0uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzQWN0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5idW5kbGVDb250ZXh0ICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHBsdWctaW4gaXMgaW5hY3RpdmU7IGkuZS4gaXQgaGFzIGJlZW4KLQkgKiB7QGxpbmsgI3N0b3AoQnVuZGxlQ29udGV4dCkgc3RvcHBlZH0gb3Igbm90IHlldAotCSAqIHtAbGluayAjc3RhcnQoQnVuZGxlQ29udGV4dCkgc3RhcnRlZH0uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbmFjdGl2ZSgpIHsKLQkJcmV0dXJuICEgdGhpcy5pc0FjdGl2ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL0xpYnJhcnlQcm92aWRlclByb3BlcnR5VGVzdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9MaWJyYXJ5UHJvdmlkZXJQcm9wZXJ0eVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjNlMjFmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL0xpYnJhcnlQcm92aWRlclByb3BlcnR5VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5JTGlicmFyeVByb3ZpZGVyOwotCi0vKioKLSAqIFByb3BlcnR5IHRlc3RlciBmb3Ige0BsaW5rIElMaWJyYXJ5UHJvdmlkZXJ9LgotICogU2VlIDxjb2RlPm9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9wbHVnaW4ueG1sPC9jb2RlPgotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVByb3ZpZGVyUHJvcGVydHlUZXN0ZXIKLQlleHRlbmRzIFByb3BlcnR5VGVzdGVyCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5EU19JRCA9ICJleHRlbmRzSWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3RbXSBhcmdzLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotCQlpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBJTGlicmFyeVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gdGhpcy50ZXN0KChJTGlicmFyeVByb3ZpZGVyKSByZWNlaXZlciwgcHJvcGVydHksIGV4cGVjdGVkVmFsdWUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdGVzdChJTGlicmFyeVByb3ZpZGVyIGxpYnJhcnlQcm92aWRlciwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotCQlpZiAocHJvcGVydHkuZXF1YWxzKElEKSkgewotCQkJcmV0dXJuIGxpYnJhcnlQcm92aWRlci5nZXRJZCgpLmVxdWFscyhleHBlY3RlZFZhbHVlKTsKLQkJfQotCQlpZiAocHJvcGVydHkuZXF1YWxzKEVYVEVORFNfSUQpKSB7Ci0JCQl3aGlsZSAobGlicmFyeVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQlpZiAobGlicmFyeVByb3ZpZGVyLmdldElkKCkuZXF1YWxzKGV4cGVjdGVkVmFsdWUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlsaWJyYXJ5UHJvdmlkZXIgPSBsaWJyYXJ5UHJvdmlkZXIuZ2V0QmFzZVByb3ZpZGVyKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwkKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9nZW4vQWJzdHJhY3RKcHRHZW5lcmF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL2dlbi9BYnN0cmFjdEpwdEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmRkM2I4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL2dlbi9BYnN0cmFjdEpwdEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwuZ2VuOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hlc0xpc3RlbmVyMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5KcHRDb21tb25Db3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbi5Mb2NhdGlvbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKcHRHZW5lcmF0b3IKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5TX0RJUiA9ICJwbHVnaW5zLyI7CSAgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJVk1JbnN0YWxsIGpyZTsKLQlwcm90ZWN0ZWQgSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBsYXVuY2hDb25maWc7Ci0JcHJpdmF0ZSBJTGF1bmNoIGxhdW5jaDsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgcHJvamVjdExvY2F0aW9uOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVidWcgPSBmYWxzZTsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBYnN0cmFjdEpwdEdlbmVyYXRvcihJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5qYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotCQl0aGlzLnByb2plY3RMb2NhdGlvbiA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogYWJzdHJhY3QgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRNYWluVHlwZSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRMYXVuY2hDb25maWdOYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEJvb3RzdHJhcEphclByZWZpeCgpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkJvb3RzdHJhcCBKQVIgbm90IHNwZWNpZmllZC4iKTsgICAvLyROT04tTkxTLTEkOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzcGVjaWZ5UHJvZ3JhbUFyZ3VtZW50cygpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IExpc3Q8U3RyaW5nPiBidWlsZENsYXNzcGF0aCgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdHJ5IHsKLQkJCXRoaXMuanJlID0gdGhpcy5nZXRQcm9qZWN0SlJFKCk7Ci0JCQlpZiAodGhpcy5qcmUgPT0gbnVsbCkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gIkNvdWxkIG5vdCBpZGVudGlmeSB0aGUgVk0uIjsgLy8kTk9OLU5MUy0xJAotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQkJfQotCQkJdGhpcy5sYXVuY2hDb25maWcgPSB0aGlzLmJ1aWxkTGF1bmNoQ29uZmlndXJhdGlvbigpOwotCQl9IAotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlTdWJNb25pdG9yIHNtID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIDEwKTsKLQkJdGhpcy5wcmVHZW5lcmF0ZShzbS5uZXdDaGlsZCgyKSk7Ci0JCWlmIChzbS5pc0NhbmNlbGVkKCkpIHsKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCXNtLnN1YlRhc2soSnB0Q29tbW9uQ29yZU1lc3NhZ2VzLkdFTkVSQVRJT05fQ1JFQVRJTkdfTEFVTkNIX0NPTkZJR19UQVNLKTsKLQkJdGhpcy5pbml0aWFsaXplTGF1bmNoQ29uZmlndXJhdGlvbigpOwotCQlzbS53b3JrZWQoMSk7Ci0JCWlmIChzbS5pc0NhbmNlbGVkKCkpIHsKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJdGhpcy5hZGRMYXVuY2hMaXN0ZW5lcigpOwotCQlzbS53b3JrZWQoMSk7Ci0KLQkJaWYgKHNtLmlzQ2FuY2VsZWQoKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5sYXVuY2ggPSB0aGlzLnNhdmVBbmRMYXVuY2hDb25maWcoc20ubmV3Q2hpbGQoNikpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUxhdW5jaENvbmZpZ3VyYXRpb24oKSB7Ci0JCXRoaXMuc3BlY2lmeUpSRSgpOwotCQkKLQkJdGhpcy5zcGVjaWZ5UHJvamVjdCgpOyAKLQkJdGhpcy5zcGVjaWZ5TWFpblR5cGUoKTsJCi0JCQotCQl0aGlzLnNwZWNpZnlQcm9ncmFtQXJndW1lbnRzKCk7Ci0JCXRoaXMuc3BlY2lmeVdvcmtpbmdEaXIoKTsgCi0KLQkJdGhpcy5zcGVjaWZ5Q2xhc3NwYXRoUHJvcGVydGllcygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkTGF1bmNoTGlzdGVuZXIoKSB7Ci0KLQkJdGhpcy5nZXRMYXVuY2hNYW5hZ2VyKCkuYWRkTGF1bmNoTGlzdGVuZXIodGhpcy5idWlsZExhdW5jaExpc3RlbmVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcmVHZW5lcmF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JcHJvdGVjdGVkIHZvaWQgcG9zdEdlbmVyYXRlKCkgewotCQl0cnkgewotCQkJaWYoICEgdGhpcy5pc0RlYnVnKSB7Ci0JCQkJdGhpcy5yZW1vdmVMYXVuY2hDb25maWd1cmF0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLnJlZnJlc2hQcm9qZWN0KCk7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJdGhpcy5nZXRQcm9qZWN0KCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJTGF1bmNoZXNMaXN0ZW5lcjIgYnVpbGRMYXVuY2hMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJTGF1bmNoZXNMaXN0ZW5lcjIoKSB7Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGxhdW5jaGVzVGVybWluYXRlZChJTGF1bmNoW10gbGF1bmNoZXMpIHsKLQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgbGF1bmNoZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUxhdW5jaCBsYXVuY2ggPSBsYXVuY2hlc1tpXTsKLQkJCQkJaWYgKGxhdW5jaC5lcXVhbHMoQWJzdHJhY3RKcHRHZW5lcmF0b3IudGhpcy5nZXRMYXVuY2goKSkpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJQWJzdHJhY3RKcHRHZW5lcmF0b3IudGhpcy5wb3N0R2VuZXJhdGUoKTsKLQkJCQkJCQlBYnN0cmFjdEpwdEdlbmVyYXRvci50aGlzLmxhdW5jaCA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQlBYnN0cmFjdEpwdEdlbmVyYXRvci50aGlzLmdldExhdW5jaE1hbmFnZXIoKS5yZW1vdmVMYXVuY2hMaXN0ZW5lcih0aGlzKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGF1bmNoZXNBZGRlZChJTGF1bmNoW10gbGF1bmNoZXMpIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxhdW5jaGVzQ2hhbmdlZChJTGF1bmNoW10gbGF1bmNoZXMpIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxhdW5jaGVzUmVtb3ZlZChJTGF1bmNoW10gbGF1bmNoZXMpIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKioqKioqKiBTZXR0aW5nIExhdW5jaCBDb25maWd1cmF0aW9uICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBzcGVjaWZ5SlJFKCkgewotCQlTdHJpbmcganJlTmFtZSA9IHRoaXMuanJlLmdldE5hbWUoKTsgCi0JCVN0cmluZyB2bUlkID0gdGhpcy5qcmUuZ2V0Vk1JbnN0YWxsVHlwZSgpLmdldElkKCk7Ci0JCXRoaXMubGF1bmNoQ29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9KUkVfQ09OVEFJTkVSX1BBVEgsIGpyZU5hbWUpOwotCQl0aGlzLmxhdW5jaENvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfSlJFX0NPTlRBSU5FUl9QQVRILCB2bUlkKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNwZWNpZnlQcm9qZWN0KCkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSB0aGlzLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JCXRoaXMubGF1bmNoQ29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsIHByb2plY3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3BlY2lmeU1haW5UeXBlKCkgewotCQl0aGlzLmxhdW5jaENvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfTUFJTl9UWVBFX05BTUUsIHRoaXMuZ2V0TWFpblR5cGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3BlY2lmeUNsYXNzcGF0aFByb3BlcnRpZXMoKSAgewotCQlMaXN0PFN0cmluZz4gY2xhc3NwYXRoOwotCQl0cnkgewotCQkJY2xhc3NwYXRoID0gdGhpcy5idWlsZENsYXNzcGF0aCgpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBbiBlcnJvciBvY2N1cmVkIGdlbmVyYXRpbmcgYSBtZW1lbnRvIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmxhdW5jaENvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQ0xBU1NQQVRILCBjbGFzc3BhdGgpOwotCQl0aGlzLmxhdW5jaENvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfREVGQVVMVF9DTEFTU1BBVEgsIGZhbHNlKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENsYXNzcGF0aEVudHJ5ICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBnZXRTeXN0ZW1MaWJyYXJ5Q2xhc3NwYXRoRW50cnkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJSVBhdGggc3lzdGVtTGlic1BhdGggPSBuZXcgUGF0aChKYXZhUnVudGltZS5KUkVfQ09OVEFJTkVSKTsKLQkJcmV0dXJuIEphdmFSdW50aW1lLm5ld1J1bnRpbWVDb250YWluZXJDbGFzc3BhdGhFbnRyeShzeXN0ZW1MaWJzUGF0aCwgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeS5TVEFOREFSRF9DTEFTU0VTKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElSdW50aW1lQ2xhc3NwYXRoRW50cnkgZ2V0RGVmYXVsdFByb2plY3RDbGFzc3BhdGhFbnRyeSgpIHsKLQotCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IHByb2plY3RFbnRyeSA9IEphdmFSdW50aW1lLm5ld0RlZmF1bHRQcm9qZWN0Q2xhc3NwYXRoRW50cnkodGhpcy5qYXZhUHJvamVjdCk7Ci0JCXByb2plY3RFbnRyeS5zZXRDbGFzc3BhdGhQcm9wZXJ0eShJUnVudGltZUNsYXNzcGF0aEVudHJ5LlVTRVJfQ0xBU1NFUyk7Ci0JCQotCQlyZXR1cm4gcHJvamVjdEVudHJ5OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBnZXRBcmNoaXZlQ2xhc3NwYXRoRW50cnkoSVBhdGggYXJjaGl2ZVBhdGgpIHsKLQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBhcmNoaXZlRW50cnkgPSBKYXZhUnVudGltZS5uZXdBcmNoaXZlUnVudGltZUNsYXNzcGF0aEVudHJ5KGFyY2hpdmVQYXRoKTsKLQkJYXJjaGl2ZUVudHJ5LnNldENsYXNzcGF0aFByb3BlcnR5KElSdW50aW1lQ2xhc3NwYXRoRW50cnkuVVNFUl9DTEFTU0VTKTsKLQkJCi0JCXJldHVybiBhcmNoaXZlRW50cnk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJUnVudGltZUNsYXNzcGF0aEVudHJ5IGdldFZhcmlhYmxlUnVudGltZUNsYXNzcGF0aEVudHJ5KElQYXRoIHBhdGgpIHsKLQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSB2YXJFbnRyeSA9IEphdmFSdW50aW1lLm5ld1ZhcmlhYmxlUnVudGltZUNsYXNzcGF0aEVudHJ5KHBhdGgpOwotCQl2YXJFbnRyeS5zZXRDbGFzc3BhdGhQcm9wZXJ0eShJUnVudGltZUNsYXNzcGF0aEVudHJ5LlVTRVJfQ0xBU1NFUyk7Ci0JCXJldHVybiB2YXJFbnRyeTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExhdW5jaENvbmZpZyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBJTGF1bmNoIHNhdmVBbmRMYXVuY2hDb25maWcoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgMTApOwotCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbnVsbDsKLQkJSUxhdW5jaCByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJc20uc3ViVGFzayhKcHRDb21tb25Db3JlTWVzc2FnZXMuR0VORVJBVElPTl9TQVZJTkdfTEFVTkNIX0NPTkZJR19UQVNLKTsKLQkJCWNvbmZpZ3VyYXRpb24gPSB0aGlzLmxhdW5jaENvbmZpZy5kb1NhdmUoKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBzYXZlRXhjZXB0aW9uKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IHNhdmUgTGF1bmNoQ29uZmlnIiwgc2F2ZUV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlzbS53b3JrZWQoMSk7Ci0JCWlmIChzbS5pc0NhbmNlbGVkKCkpIHsKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzbS5zdWJUYXNrKEpwdENvbW1vbkNvcmVNZXNzYWdlcy5HRU5FUkFUSU9OX0xBVU5DSElOR19DT05GSUdfVEFTSyk7Ci0JCQlyZXN1bHQgPSBjb25maWd1cmF0aW9uLmxhdW5jaChJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSwgc20ubmV3Q2hpbGQoOSkpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGxhdW5jaEV4Y2VwdGlvbikgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIGxhdW5jaCIsIGxhdW5jaEV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vICoqKioqKioqKiogTWFpbiBhcmd1bWVudHMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGFwcGVuZERlYnVnQXJndW1lbnQoU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWlmICh0aGlzLmlzRGVidWcpIHsKLQkJCXNiLmFwcGVuZCgiIC1kZWJ1ZyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIFF1ZXJpZXMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBJTGF1bmNoIGdldExhdW5jaCgpIHsKLQkJcmV0dXJuIHRoaXMubGF1bmNoOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUxhdW5jaE1hbmFnZXIgZ2V0TGF1bmNoTWFuYWdlcigpIHsKLQkJcmV0dXJuIERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCk7Ci0JfQotCQotCXByaXZhdGUgSVZNSW5zdGFsbCBnZXRQcm9qZWN0SlJFKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gSmF2YVJ1bnRpbWUuZ2V0Vk1JbnN0YWxsKHRoaXMuamF2YVByb2plY3QpOwotCX0KLQotCS8vICoqKioqKioqKiogVXRpbGl0aWVzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBJUnVudGltZUNsYXNzcGF0aEVudHJ5IGdldEJvb3RzdHJhcEphckNsYXNzcGF0aEVudHJ5KCkgewotCQlyZXR1cm4gZ2V0QXJjaGl2ZUNsYXNzcGF0aEVudHJ5KHRoaXMuYnVpbGRCb290c3RyYXBKYXJQYXRoKCkpOwotCX0KLQotCXByb3RlY3RlZCBJUGF0aCBidWlsZEJvb3RzdHJhcEphclBhdGgoKSB7Ci0JCXJldHVybiB0aGlzLmZpbmRHZW5KYXJTdGFydGluZ1dpdGgodGhpcy5nZXRCb290c3RyYXBKYXJQcmVmaXgoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBJUGF0aCBmaW5kR2VuSmFyU3RhcnRpbmdXaXRoKFN0cmluZyBnZW5KYXJOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIGphckluc3RhbGxEaXIgPSB0aGlzLmdldEJ1bmRsZVBhcmVudERpcihKcHRDb21tb25Db3JlUGx1Z2luLlBMVUdJTl9JRCk7Ci0KLQkJCUxpc3Q8RmlsZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOwotCQkJdGhpcy5maW5kRmlsZVN0YXJ0aW5nV2l0aChnZW5KYXJOYW1lLCBqYXJJbnN0YWxsRGlyLCByZXN1bHQpOwotCQkJaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQ6ICIgKyBnZW5KYXJOYW1lICsgIiMuIy4jdiMjIy5qYXIgaW46ICIgKyBqYXJJbnN0YWxsRGlyKTsgICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCUZpbGUgZ2VuSmFyRmlsZSA9IHJlc3VsdC5nZXQoMCk7Ci0JCQlTdHJpbmcgZ2VuSmFyUGF0aCA9IGdlbkphckZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJcmV0dXJuIG5ldyBQYXRoKGdlbkphclBhdGgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogcHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgRmlsZSBnZXRCdW5kbGVQYXJlbnREaXIoU3RyaW5nIGJ1bmRsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCi0JCWlmIChQbGF0Zm9ybS5pbkRldmVsb3BtZW50TW9kZSgpKSB7Ci0JCQlMb2NhdGlvbiBlY2xpcHNlSG9tZUxvYyA9IFBsYXRmb3JtLmdldEluc3RhbGxMb2NhdGlvbigpOwotCQkJU3RyaW5nIGVjbGlwc2VIb21lID0gZWNsaXBzZUhvbWVMb2MuZ2V0VVJMKCkuZ2V0UGF0aCgpOwotCQkJaWYgKCAhIGVjbGlwc2VIb21lLmVuZHNXaXRoKFBMVUdJTlNfRElSKSkgewotCQkJCWVjbGlwc2VIb21lICs9IFBMVUdJTlNfRElSOwotCQkJfQotCQkJcmV0dXJuIG5ldyBGaWxlKGVjbGlwc2VIb21lKTsKLQkJfQotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGJ1bmRsZU5hbWUpOwotCQlyZXR1cm4gRmlsZUxvY2F0b3IuZ2V0QnVuZGxlRmlsZShidW5kbGUpLmdldFBhcmVudEZpbGUoKTsKLQl9Ci0KLQlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgYnVpbGRMYXVuY2hDb25maWd1cmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzLnJlbW92ZUxhdW5jaENvbmZpZ3VyYXRpb24oKTsKLQotCQlJTGF1bmNoTWFuYWdlciBtYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIHR5cGUgPSBtYW5hZ2VyLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5JRF9KQVZBX0FQUExJQ0FUSU9OKTsKLQotCQlyZXR1cm4gdHlwZS5uZXdJbnN0YW5jZShudWxsLCB0aGlzLmdldExhdW5jaENvbmZpZ05hbWUoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVMYXVuY2hDb25maWd1cmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUlMYXVuY2hNYW5hZ2VyIG1hbmFnZXIgPSB0aGlzLmdldExhdW5jaE1hbmFnZXIoKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIHR5cGUgPSBtYW5hZ2VyLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5JRF9KQVZBX0FQUExJQ0FUSU9OKTsKLQkKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBjb25maWd1cmF0aW9ucyA9IG1hbmFnZXIuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbnModHlwZSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmF0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25zW2ldOwotCQkJaWYgKGNvbmZpZ3VyYXRpb24uZ2V0TmFtZSgpLmVxdWFscyh0aGlzLmdldExhdW5jaENvbmZpZ05hbWUoKSkpIHsKLQkJCQljb25maWd1cmF0aW9uLmRlbGV0ZSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbmRGaWxlU3RhcnRpbmdXaXRoKFN0cmluZyBmaWxlTmFtZSwgRmlsZSBkaXJlY3RvcnksIExpc3Q8PyBzdXBlciBGaWxlPiBsaXN0KSB7Ci0JCWlmKGRpcmVjdG9yeS5saXN0RmlsZXMoKSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgZGlyZWN0b3J5OiAiICsgZGlyZWN0b3J5KTsgICAvLyROT04tTkxTLTEkCi0JCX0KLQkJZm9yIChGaWxlIGZpbGUgOiBkaXJlY3RvcnkubGlzdEZpbGVzKCkpIHsKLQkJCWlmIChmaWxlLmdldE5hbWUoKS5zdGFydHNXaXRoKGZpbGVOYW1lKSkgewotCQkJCWxpc3QuYWRkKGZpbGUpOwotCQkJfQotCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCXRoaXMuZmluZEZpbGVTdGFydGluZ1dpdGgoZmlsZU5hbWUsIGZpbGUsIGxpc3QpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzcGVjaWZ5V29ya2luZ0RpcigpIHsKLQkJRmlsZSB3b3JraW5nRGlyID0gbmV3IFBhdGgodGhpcy5wcm9qZWN0TG9jYXRpb24pLnRvRmlsZSgpOwotCQl0aGlzLmxhdW5jaENvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlksIHdvcmtpbmdEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlYnVnKGJvb2xlYW4gaXNEZWJ1ZykgewotCQl0aGlzLmlzRGVidWcgPSBpc0RlYnVnOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL2xpYnByb3YvSnB0T3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9saWJwcm92L0pwdE9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTFjNzNiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL2xpYnByb3YvSnB0T3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLmxpYnByb3Y7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJwcm92LkpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnZhbC5MaWJyYXJ5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguV3RwT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKcHRPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcKLQkJZXh0ZW5kcyBXdHBPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcKLQkJaW1wbGVtZW50cyBKcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIHsKLQkKLQlwcm90ZWN0ZWQgSnB0T3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIElTdGF0dXMgdmFsaWRhdGUoKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gc3VwZXIudmFsaWRhdGUoKTsKLQkJaWYgKCEgc3RhdHVzLmlzT0soKSkgewotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQkKLQkJZm9yIChMaWJyYXJ5VmFsaWRhdG9yIGxpYnJhcnlWYWxpZGF0b3IgOiBKcHRDb21tb25Db3JlUGx1Z2luLmdldExpYnJhcnlWYWxpZGF0b3JzKHRoaXMpKSB7Ci0JCQlzdGF0dXMgPSBsaWJyYXJ5VmFsaWRhdG9yLnZhbGlkYXRlKHRoaXMpOwotCQkJaWYgKCEgc3RhdHVzLmlzT0soKSkgewotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL2xpYnByb3YvSnB0VXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL2xpYnByb3YvSnB0VXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0ZjUyYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9saWJwcm92L0pwdFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLmxpYnByb3Y7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJwcm92LkpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnZhbC5MaWJyYXJ5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguV3RwVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEpwdFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnCi0JCWV4dGVuZHMgV3RwVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcKLQkJaW1wbGVtZW50cyBKcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIHsKLQkKLQlwcm90ZWN0ZWQgSnB0VXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0YXR1cyB2YWxpZGF0ZSgpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci52YWxpZGF0ZSgpOwotCQlpZiAoISBzdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCQotCQlmb3IgKExpYnJhcnlWYWxpZGF0b3IgbGlicmFyeVZhbGlkYXRvciA6IEpwdENvbW1vbkNvcmVQbHVnaW4uZ2V0TGlicmFyeVZhbGlkYXRvcnModGhpcykpIHsKLQkJCXN0YXR1cyA9IGxpYnJhcnlWYWxpZGF0b3IudmFsaWRhdGUodGhpcyk7Ci0JCQlpZiAoISBzdGF0dXMuaXNPSygpKSB7Ci0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvbGlidmFsL0xpYlZhbFV0aWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL2xpYnZhbC9MaWJWYWxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YWZiMGMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvbGlidmFsL0xpYlZhbFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLmxpYnZhbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldGVkUHJvamVjdEZyYW1ld29ya0phdmFQbHVnaW4uUExVR0lOX0lEOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLkpwdENvbW1vbkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0KLXB1YmxpYyBjbGFzcyBMaWJWYWxVdGlsIHsKLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGUoSXRlcmFibGU8SVBhdGg+IGxpYnJhcnlQYXRocywgU2V0PFN0cmluZz4gY2xhc3NOYW1lcykgewotCQlTZXQ8U3RyaW5nPiBjbGFzc0ZpbGVOYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJTWFwPFN0cmluZyxTdHJpbmc+IGNsYXNzRmlsZU5hbWVUb0NsYXNzTmFtZSA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7Ci0JCWZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IGNsYXNzTmFtZXMpIHsKLQkJCVN0cmluZyBjbGFzc0ZpbGVOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkJCWNsYXNzRmlsZU5hbWVzLmFkZChjbGFzc0ZpbGVOYW1lKTsKLQkJCWNsYXNzRmlsZU5hbWVUb0NsYXNzTmFtZS5wdXQoY2xhc3NGaWxlTmFtZSwgY2xhc3NOYW1lKTsKLQkJfQotCQkKLQkJZmluYWwgTWFwPFN0cmluZyxJbnRlZ2VyPiBjbGFzc0FwcGVhcmFuY2VDb3VudHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsSW50ZWdlcj4oKTsKLQkJCi0JCWZvciAoU3RyaW5nIGNsYXNzRmlsZU5hbWUgOiBjbGFzc0ZpbGVOYW1lcykgewotCQkJY2xhc3NBcHBlYXJhbmNlQ291bnRzLnB1dChjbGFzc0ZpbGVOYW1lLCAwKTsKLQkJfQotCQkKLQkJZm9yIChJUGF0aCBsaWJyYXJ5UGF0aCA6IGxpYnJhcnlQYXRocykgewotCQkJZmluYWwgRmlsZSBmaWxlID0gbGlicmFyeVBhdGgudG9GaWxlKCk7Ci0JCQkKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJWmlwRmlsZSB6aXAgPSBudWxsOwotCQkJCQotCQkJCXRyeSB7Ci0JCQkJCXppcCA9IG5ldyBaaXBGaWxlKGZpbGUpOwotCQkJCQkKLQkJCQkJZm9yIChFbnVtZXJhdGlvbjw/IGV4dGVuZHMgWmlwRW50cnk+IGl0ciA9IHppcC5lbnRyaWVzKCk7IGl0ci5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0JCQkJCQlmaW5hbCBaaXBFbnRyeSB6aXBFbnRyeSA9IGl0ci5uZXh0RWxlbWVudCgpOwotCQkJCQkJZmluYWwgU3RyaW5nIG5hbWUgPSB6aXBFbnRyeS5nZXROYW1lKCk7Ci0JCQkJCQkKLQkJCQkJCUludGVnZXIgY291bnQgPSBjbGFzc0FwcGVhcmFuY2VDb3VudHMuZ2V0KG5hbWUpOwotCQkJCQkJCi0JCQkJCQlpZiAoY291bnQgIT0gbnVsbCkgewotCQkJCQkJCWNsYXNzQXBwZWFyYW5jZUNvdW50cy5wdXQobmFtZSwgY291bnQgKyAxKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKHppcCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXppcC5jbG9zZSgpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoTWFwLkVudHJ5PFN0cmluZyxJbnRlZ2VyPiBlbnRyeSA6IGNsYXNzQXBwZWFyYW5jZUNvdW50cy5lbnRyeVNldCgpKSB7Ci0JCQlmaW5hbCBpbnQgY291bnQgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCi0JCQlpZiAoY291bnQgPT0gMCkgewotCQkJCWZpbmFsIFN0cmluZyBjbGFzc0ZpbGVOYW1lID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9IGNsYXNzRmlsZU5hbWVUb0NsYXNzTmFtZS5nZXQoY2xhc3NGaWxlTmFtZSk7Ci0JCQkJZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAKLQkJCQkJCU5MUy5iaW5kKEpwdENvbW1vbkNvcmVNZXNzYWdlcy5VU0VSX0xJQlJBUllfVkFMSURBVE9SX19DTEFTU19OT1RfRk9VTkQsIGNsYXNzTmFtZSk7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBtZXNzYWdlKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvbGlidmFsL0xpYnJhcnlWYWxpZGF0b3JDb25maWcuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL2xpYnZhbC9MaWJyYXJ5VmFsaWRhdG9yQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YTg0YWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvbGlidmFsL0xpYnJhcnlWYWxpZGF0b3JDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLmxpYnZhbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldGVkUHJvamVjdEZyYW1ld29ya0phdmFQbHVnaW4ubG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXZhbHVhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FdmFsdWF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5YUG9pbnRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlicHJvdi5KcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJ2YWwuTGlicmFyeVZhbGlkYXRvcjsKLQotcHVibGljIGNsYXNzIExpYnJhcnlWYWxpZGF0b3JDb25maWcgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19FWFBSX1ZBUiA9ICJjb25maWciOyAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQlJBUllfUFJPVklERVJfRVhQUl9WQVIgPSAibGlicmFyeVByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotCXByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKLQlwcml2YXRlIEV4cHJlc3Npb24gZW5hYmxlbWVudENvbmRpdGlvbjsKLQkKLQkKLQlMaWJyYXJ5VmFsaWRhdG9yQ29uZmlnKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gdGhpcy5pZDsKLQl9Ci0JCi0Jdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotCQlyZXR1cm4gdGhpcy5wbHVnaW5JZDsKLQl9Ci0JCi0Jdm9pZCBzZXRQbHVnaW5JZChTdHJpbmcgcGx1Z2luSWQpIHsKLQkJdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklkOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lOwotCX0KLQkKLQl2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCX0KLQkKLQlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFbmFibGVtZW50Q29uZGl0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5lbmFibGVtZW50Q29uZGl0aW9uOwotCX0KLQkKLQl2b2lkIHNldEVuYWJsZW1lbnRDb25kaXRpb24oRXhwcmVzc2lvbiBlbmFibGVtZW50Q29uZGl0aW9uKSB7Ci0JCXRoaXMuZW5hYmxlbWVudENvbmRpdGlvbiA9IGVuYWJsZW1lbnRDb25kaXRpb247Ci0JfQotCQotCXB1YmxpYyBMaWJyYXJ5VmFsaWRhdG9yIGdldExpYnJhcnlWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBYUG9pbnRUb29scy5pbnN0YW50aWF0ZSgKLQkJCQl0aGlzLnBsdWdpbklkLCBMaWJyYXJ5VmFsaWRhdG9yTWFuYWdlci5RVUFMSUZJRURfRVhURU5TSU9OX1BPSU5UX0lELCAKLQkJCQl0aGlzLmNsYXNzTmFtZSwgTGlicmFyeVZhbGlkYXRvci5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZEZvcihKcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGNvbmZpZykgewotCQlFdmFsdWF0aW9uQ29udGV4dCBldmFsQ29udGV4dCA9IG5ldyBFdmFsdWF0aW9uQ29udGV4dChudWxsLCBjb25maWcpOwotCQlldmFsQ29udGV4dC5zZXRBbGxvd1BsdWdpbkFjdGl2YXRpb24odHJ1ZSk7Ci0JCWV2YWxDb250ZXh0LmFkZFZhcmlhYmxlKENPTkZJR19FWFBSX1ZBUiwgY29uZmlnKTsKLQkJZXZhbENvbnRleHQuYWRkVmFyaWFibGUoTElCUkFSWV9QUk9WSURFUl9FWFBSX1ZBUiwgY29uZmlnLmdldExpYnJhcnlQcm92aWRlcigpKTsKLQkJCi0JCWlmICh0aGlzLmVuYWJsZW1lbnRDb25kaXRpb24gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlFdmFsdWF0aW9uUmVzdWx0IGV2YWxSZXN1bHQgPSB0aGlzLmVuYWJsZW1lbnRDb25kaXRpb24uZXZhbHVhdGUoZXZhbENvbnRleHQpOwotCQkJCQotCQkJCWlmIChldmFsUmVzdWx0ID09IEV2YWx1YXRpb25SZXN1bHQuRkFMU0UpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlsb2coZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL2xpYnZhbC9MaWJyYXJ5VmFsaWRhdG9yTWFuYWdlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvbGlidmFsL0xpYnJhcnlWYWxpZGF0b3JNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlN2MyZWIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvbGlidmFsL0xpYnJhcnlWYWxpZGF0b3JNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwubGlidmFsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlhQb2ludFRvb2xzLio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5YUG9pbnRUb29scy5YUG9pbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnByb3YuSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlidmFsLkxpYnJhcnlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLktleWVkU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZhbGlkYXRvck1hbmFnZXIgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJsaWJyYXJ5VmFsaWRhdG9ycyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfRVhURU5TSU9OX1BPSU5UX0lEID0gSnB0Q29tbW9uQ29yZVBsdWdpbi5QTFVHSU5fSURfICsgRVhURU5TSU9OX1BPSU5UX0lEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQlJBUllfVkFMSURBVE9SX0VMRU1FTlQgPSAibGlicmFyeVZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BVFRSSUJVVEUgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfQVRUUklCVVRFID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQUJMRU1FTlRfRUxFTUVOVCA9ICJlbmFibGVtZW50IjsgLy8kTk9OLU5MUy0xJAotCQotCQotCXByaXZhdGUgc3RhdGljIExpYnJhcnlWYWxpZGF0b3JNYW5hZ2VyIElOU1RBTkNFID0gbmV3IExpYnJhcnlWYWxpZGF0b3JNYW5hZ2VyKCk7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5VmFsaWRhdG9yTWFuYWdlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQlwcml2YXRlIEtleWVkU2V0PFN0cmluZywgTGlicmFyeVZhbGlkYXRvckNvbmZpZz4gbGlicmFyeVZhbGlkYXRvckNvbmZpZ3M7Ci0JCi0JCi0JcHJpdmF0ZSBMaWJyYXJ5VmFsaWRhdG9yTWFuYWdlcigpIHsKLQkJdGhpcy5saWJyYXJ5VmFsaWRhdG9yQ29uZmlncyA9IG5ldyBLZXllZFNldDxTdHJpbmcsIExpYnJhcnlWYWxpZGF0b3JDb25maWc+KCk7Ci0JCXJlYWRFeHRlbnNpb25zKCk7Ci0JfQotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIExpYnJhcnlWYWxpZGF0b3J9cyAKLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8TGlicmFyeVZhbGlkYXRvcj4gZ2V0TGlicmFyeVZhbGlkYXRvcnMoZmluYWwgSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBjb25maWcpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxMaWJyYXJ5VmFsaWRhdG9yPigKLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxMaWJyYXJ5VmFsaWRhdG9yQ29uZmlnLCBMaWJyYXJ5VmFsaWRhdG9yPigKLQkJCQkJCW5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxMaWJyYXJ5VmFsaWRhdG9yQ29uZmlnPigKLQkJCQkJCQkJdGhpcy5saWJyYXJ5VmFsaWRhdG9yQ29uZmlncy5nZXRJdGVtU2V0KCkpIHsKLQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoTGlicmFyeVZhbGlkYXRvckNvbmZpZyBvKSB7Ci0JCQkJCQkJCXJldHVybiBvLmlzRW5hYmxlZEZvcihjb25maWcpOwotCQkJCQkJCX0KLQkJCQkJCX0pIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBMaWJyYXJ5VmFsaWRhdG9yIHRyYW5zZm9ybShMaWJyYXJ5VmFsaWRhdG9yQ29uZmlnIG8pIHsKLQkJCQkJCXJldHVybiBvLmdldExpYnJhcnlWYWxpZGF0b3IoKTsKLQkJCQkJfQotCQkJCX0pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KExpYnJhcnlWYWxpZGF0b3IgbykgewotCQkJCXJldHVybiBvICE9IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWFkRXh0ZW5zaW9ucygpIHsKLQkJZmluYWwgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCi0JCWZpbmFsIElFeHRlbnNpb25Qb2ludCB4cG9pbnQgCi0JCQkJPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChRVUFMSUZJRURfRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJCi0JCWlmICh4cG9pbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCQotCQlmaW5hbCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4gY29uZmlncyA9IG5ldyBBcnJheUxpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PigpOwotCQkKLQkJZm9yIChJRXh0ZW5zaW9uIGV4dGVuc2lvbiA6IHhwb2ludC5nZXRFeHRlbnNpb25zKCkpIHsKLSAgICAgICAgCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgOiBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkpIHsKLSAgICAgICAgCQljb25maWdzLmFkZChlbGVtZW50KTsKLSAgICAgICAgCX0KLQkJfQotCQkKLQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA6IGNvbmZpZ3MpIHsKLQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoTElCUkFSWV9WQUxJREFUT1JfRUxFTUVOVCkpIHsKLSAgICAgICAgICAgICAgICByZWFkRXh0ZW5zaW9uKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWFkRXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQlmaW5hbCBMaWJyYXJ5VmFsaWRhdG9yQ29uZmlnIGx2Q29uZmlnID0gbmV3IExpYnJhcnlWYWxpZGF0b3JDb25maWcoKTsKLQkJCQotCQkJLy8gcGx1Zy1pbiBpZAotCQkJbHZDb25maWcuc2V0UGx1Z2luSWQoZWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSk7Ci0JCQkKLQkJCS8vIHJlc291cmNlIGxvY2F0b3IgaWQKLQkJCWx2Q29uZmlnLnNldElkKGZpbmRSZXF1aXJlZEF0dHJpYnV0ZShlbGVtZW50LCBJRF9BVFRSSUJVVEUpKTsKLQkJCQotCQkJaWYgKHRoaXMubGlicmFyeVZhbGlkYXRvckNvbmZpZ3MuY29udGFpbnNLZXkobHZDb25maWcuZ2V0SWQoKSkpIHsKLQkJCQlsb2dEdXBsaWNhdGVFeHRlbnNpb24oUVVBTElGSUVEX0VYVEVOU0lPTl9QT0lOVF9JRCwgSURfQVRUUklCVVRFLCBsdkNvbmZpZy5nZXRJZCgpKTsKLQkJCQl0aHJvdyBuZXcgWFBvaW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQkJCS8vIHJlc291cmNlIGxvY2F0b3IgY2xhc3MgbmFtZQotCQkJbHZDb25maWcuc2V0Q2xhc3NOYW1lKGZpbmRSZXF1aXJlZEF0dHJpYnV0ZShlbGVtZW50LCBDTEFTU19BVFRSSUJVVEUpKTsKLQkJCQotCQkJLy8gZW5hYmxlbWVudAotCQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGQgOiBlbGVtZW50LmdldENoaWxkcmVuKCkpIHsKLQkJCQlTdHJpbmcgY2hpbGROYW1lID0gY2hpbGQuZ2V0TmFtZSgpOwotCQkJCWlmIChjaGlsZE5hbWUuZXF1YWxzKEVOQUJMRU1FTlRfRUxFTUVOVCkpIHsKLQkJCQkJRXhwcmVzc2lvbiBleHByOwotCQkJCQl0cnkgewotCQkJCQkJZXhwciA9IEV4cHJlc3Npb25Db252ZXJ0ZXIuZ2V0RGVmYXVsdCgpLnBlcmZvcm0oY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWxvZyhlKTsKLQkJCQkJCXRocm93IG5ldyBYUG9pbnRFeGNlcHRpb24oKTsKLQkJCQkJfQotCQkJCQlsdkNvbmZpZy5zZXRFbmFibGVtZW50Q29uZGl0aW9uKGV4cHIpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJdGhpcy5saWJyYXJ5VmFsaWRhdG9yQ29uZmlncy5hZGRJdGVtKGx2Q29uZmlnLmdldElkKCksIGx2Q29uZmlnKTsKLQkJfQotCQljYXRjaCAoWFBvaW50RXhjZXB0aW9uIGUpIHsKLQkJCS8vIElnbm9yZSBhbmQgY29udGludWUuIFRoZSBwcm9ibGVtIGhhcyBhbHJlYWR5IGJlZW4gcmVwb3J0ZWQgdG8gdGhlIHVzZXIKLQkJCS8vIGluIHRoZSBsb2cuCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0Fic3RyYWN0SnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvQWJzdHJhY3RKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTA2ZjEyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvQWJzdHJhY3RKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLkpwdENvbW1vbkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5QbGF0Zm9ybVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5Qcm9qZWN0UmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyCi0JZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyCi0JaW1wbGVtZW50cyBKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzCi17Ci0JcHJvdGVjdGVkIEFic3RyYWN0SnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCVNldDxTdHJpbmc+IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBST0pFQ1QpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChDT05UQUlORVJfUEFUSCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEZJTEVfTkFNRSk7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09OVEFJTkVSX1BBVEgpKSB7Ci0JCQlJQ29udGFpbmVyIHNvdXJjZUxvY2F0aW9uID0gZ2V0RGVmYXVsdENvbnRhaW5lcigpOwotCQkJaWYgKHNvdXJjZUxvY2F0aW9uICE9IG51bGwgJiYgc291cmNlTG9jYXRpb24uZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gc291cmNlTG9jYXRpb24uZ2V0RnVsbFBhdGgoKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEZJTEVfTkFNRSkpIHsKLQkJCXJldHVybiBnZXREZWZhdWx0RmlsZU5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREZWZhdWx0RmlsZU5hbWUoKTsKLQotCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTlRBSU5FUl9QQVRIKQotCQkJCXx8IHByb3BlcnR5TmFtZS5lcXVhbHMoRklMRV9OQU1FKSkgewotCQkJc3RhdHVzID0gdmFsaWRhdGVDb250YWluZXJQYXRoQW5kRmlsZU5hbWUoKTsKLQkJfQotCQlpZiAoISBzdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlQ29udGFpbmVyUGF0aEFuZEZpbGVOYW1lKCkgewotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IGdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCS8vIHZlcmlmaWVzIGNvbnRhaW5lciBoYXMgYmVlbiBzcGVjaWZpZWQsIGJ1dCBzaG91bGQgYmUgdW5uZWNlc3NhcnkgaW4gbW9zdCBjYXNlcy4KLQkJCS8vIHRoZXJlIGlzIGFsbW9zdCBhbHdheXMgYSBkZWZhdWx0LCBhbmQgdGhlIG5ldyBmaWxlIHdpemFyZCBkb2VzIHRoaXMgdmFsaWRhdGlvbiBhcyB3ZWxsLgotCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJSVN0YXR1cy5FUlJPUiwgSnB0Q29tbW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsIAotCQkJCUpwdENvbW1vbkNvcmVNZXNzYWdlcy5WQUxJREFURV9DT05UQUlORVJfTk9UX1NQRUNJRklFRCk7Ci0JCX0KLQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0U3RyaW5nUHJvcGVydHkoRklMRV9OQU1FKTsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZmlsZU5hbWUpKSB7Ci0JCQkvLyB2ZXJpZmllcyBmaWxlIG5hbWUgaGFzIGJlZW4gc3BlY2lmaWVkLCBidXQgc2hvdWxkIGJlIHVubmVjZXNzYXJ5IGluIG1vc3QgY2FzZXMuCi0JCQkvLyB0aGVyZSBpcyBhbG1vc3QgYWx3YXlzIGEgZGVmYXVsdCwgYW5kIHRoZSBuZXcgZmlsZSB3aXphcmQgZG9lcyB0aGlzIHZhbGlkYXRpb24gYXMgd2VsbC4KLQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCUlTdGF0dXMuRVJST1IsIEpwdENvbW1vbkNvcmVQbHVnaW4uUExVR0lOX0lELAotCQkJCUpwdENvbW1vbkNvcmVNZXNzYWdlcy5WQUxJREFURV9GSUxFX05BTUVfTk9UX1NQRUNJRklFRCk7Ci0JCX0KLQkJaWYgKGNvbnRhaW5lci5nZXRGaWxlKG5ldyBQYXRoKGZpbGVOYW1lKSkuZXhpc3RzKCkpIHsKLQkJCS8vIHZlcmlmaWVzIGZpbGUgZG9lcyBub3QgZXhpc3QsIGJ1dCBzaG91bGQgYmUgdW5uZWNlc3NhcnkgaW4gbW9zdCBjYXNlcy4KLQkJCS8vIHRoZSBuZXcgZmlsZSB3aXphcmQgZG9lcyB0aGlzIHZhbGlkYXRpb24gYXMgd2VsbC4KLQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCUlTdGF0dXMuRVJST1IsIEpwdENvbW1vbkNvcmVQbHVnaW4uUExVR0lOX0lELAotCQkJCUpwdENvbW1vbkNvcmVNZXNzYWdlcy5WQUxJREFURV9GSUxFX0FMUkVBRFlfRVhJU1RTKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQotCS8vICoqKioqKioqKioqKioqKiogaGVscGVyIG1ldGhvZHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCXByb3RlY3RlZCBJUGF0aCBnZXRDb250YWluZXJQYXRoKCkgewotCQlyZXR1cm4gKElQYXRoKSB0aGlzLm1vZGVsLmdldFByb3BlcnR5KENPTlRBSU5FUl9QQVRIKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRhaW5lciBnZXRDb250YWluZXIoKSB7Ci0JCUlQYXRoIGNvbnRhaW5lclBhdGggPSBnZXRDb250YWluZXJQYXRoKCk7Ci0JCWlmIChjb250YWluZXJQYXRoID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOyAKLQkJfQotCQlyZXR1cm4gUGxhdGZvcm1Ub29scy5nZXRDb250YWluZXIoY29udGFpbmVyUGF0aCk7Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBnZXRQcm9qZWN0KGdldENvbnRhaW5lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdChJQ29udGFpbmVyIGNvbnRhaW5lcikgewotCQlyZXR1cm4gKGNvbnRhaW5lciA9PSBudWxsKSA/IG51bGwgOiBjb250YWluZXIuZ2V0UHJvamVjdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGJlc3QgZ3Vlc3Mgc291cmNlIGxvY2F0aW9uIGZvciB0aGUgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdAotCSAqLwotCXByb3RlY3RlZCBJQ29udGFpbmVyIGdldERlZmF1bHRDb250YWluZXIoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHRoaXMubW9kZWwuZ2V0UHJvcGVydHkoUFJPSkVDVCk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCVByb2plY3RSZXNvdXJjZUxvY2F0b3IgbG9jYXRvciA9IChQcm9qZWN0UmVzb3VyY2VMb2NhdG9yKSBwcm9qZWN0LmdldEFkYXB0ZXIoUHJvamVjdFJlc291cmNlTG9jYXRvci5jbGFzcyk7Ci0JCQlyZXR1cm4gbG9jYXRvci5nZXREZWZhdWx0UmVzb3VyY2VMb2NhdGlvbigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9KcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNjM1YzkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9KcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotcHVibGljIGludGVyZmFjZSBKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzCi17Ci0JLyoqCi0JICogT3B0aW9uYWwsIHR5cGUge0BsaW5rIElQcm9qZWN0fSwgZ2l2ZXMgYSBjbHVlIGFzIHRvIHRoZSBkZWZhdWx0IGNvbnRhaW5lciBwYXRoCi0JICovCi0JU3RyaW5nIFBST0pFQ1QgPSAiSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmVxdWlyZWQsIHR5cGUge0BsaW5rIElQYXRofSwgaWRlbnRpZmllcyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBjb250YWluZXIgaW4gd2hpY2ggCi0JICogdGhlIGZpbGUgc2hvdWxkIGJlIGNyZWF0ZWQKLQkgKi8KLQlTdHJpbmcgQ09OVEFJTkVSX1BBVEggPSAiSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT05UQUlORVJfUEFUSCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIHtAbGluayBTdHJpbmd9LCBpZGVudGlmaWVzIHRoZSBmaWxlIG5hbWUKLQkgKi8KLQlTdHJpbmcgRklMRV9OQU1FID0gIkpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvTW9kdWxlUmVzb3VyY2VMb2NhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9Nb2R1bGVSZXNvdXJjZUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc2MzE4ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9Nb2R1bGVSZXNvdXJjZUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5QbGF0Zm9ybVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgTW9kdWxlUmVzb3VyY2VMb2NhdG9yCi0JZXh0ZW5kcyBTaW1wbGVKYXZhUmVzb3VyY2VMb2NhdG9yCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBmb2xkZXIgcmVwcmVzZW50aW5nIHRoZSA8Y29kZT5NRVRBLUlORjwvY29kZT4gcnVudGltZSBsb2NhdGlvbi4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUNvbnRhaW5lciBnZXREZWZhdWx0UmVzb3VyY2VMb2NhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiB0aGlzLmdldFJvb3RGb2xkZXIocHJvamVjdCkuZ2V0Rm9sZGVyKE1FVEFfSU5GX1BBVEgpLmdldFVuZGVybHlpbmdGb2xkZXIoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElQYXRoIGdldFJlc291cmNlUGF0aChJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBydW50aW1lUGF0aCkgewotCQlyZXR1cm4gdGhpcy5nZXRSb290Rm9sZGVyKHByb2plY3QpLmdldEZpbGUocnVudGltZVBhdGgpLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZVBhdGgoSVByb2plY3QgcHJvamVjdCwgSVBhdGggcmVzb3VyY2VQYXRoKSB7Ci0JCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSB0aGlzLmdldFJvb3RGb2xkZXIocHJvamVjdCk7Ci0JCUlGaWxlIGZpbGUgPSBQbGF0Zm9ybVRvb2xzLmdldEZpbGUocmVzb3VyY2VQYXRoKTsKLQkJSVZpcnR1YWxGaWxlIHZGaWxlID0gdGhpcy5nZXRWaXJ0dWFsRmlsZShyb290Rm9sZGVyLCBmaWxlKTsKLQkJaWYgKHZGaWxlICE9IG51bGwpIHsKLQkJCXJldHVybiB2RmlsZS5nZXRSdW50aW1lUGF0aCgpLm1ha2VSZWxhdGl2ZSgpOwotCQl9Ci0JCS8vIGNvdWxkbid0IGZpbmQgaXQgLSB0cnkgdGhlIHN1cGVyLWNhc2UKLQkJcmV0dXJuIHN1cGVyLmdldFJ1bnRpbWVQYXRoKHByb2plY3QsIHJlc291cmNlUGF0aCk7Ci0JfQotCQotCXByb3RlY3RlZCBJVmlydHVhbEZpbGUgZ2V0VmlydHVhbEZpbGUoSVZpcnR1YWxGb2xkZXIgdkZvbGRlciwgSUZpbGUgZmlsZSkgewotCQl0cnkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VmlydHVhbEZpbGVfKHZGb2xkZXIsIGZpbGUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJVmlydHVhbEZpbGUgZ2V0VmlydHVhbEZpbGVfKElWaXJ0dWFsRm9sZGVyIHZGb2xkZXIsIElGaWxlIGZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZm9yIChJVmlydHVhbFJlc291cmNlIHZSZXNvdXJjZSA6IHZGb2xkZXIubWVtYmVycygpKSB7Ci0JCQlJVmlydHVhbEZpbGUgdkZpbGUgPSB0aGlzLmdldFZpcnR1YWxGaWxlKHZSZXNvdXJjZSwgZmlsZSk7Ci0JCQlpZiAodkZpbGUgIT0gbnVsbCkgewotCQkJCXJldHVybiB2RmlsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVZpcnR1YWxGaWxlIGdldFZpcnR1YWxGaWxlKElWaXJ0dWFsUmVzb3VyY2UgdlJlc291cmNlLCBJRmlsZSBmaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN3aXRjaCAodlJlc291cmNlLmdldFR5cGUoKSkgewotCQkJY2FzZSBJVmlydHVhbFJlc291cmNlLkZJTEU6Ci0JCQkJSVZpcnR1YWxGaWxlIHZGaWxlID0gKElWaXJ0dWFsRmlsZSkgdlJlc291cmNlOwotCQkJCXJldHVybiBmaWxlLmVxdWFscyh2RmlsZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSkgPyB2RmlsZSA6IG51bGw7Ci0JCQljYXNlIElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSOgotCQkJCS8vIHJlY3Vyc2UKLQkJCQlyZXR1cm4gdGhpcy5nZXRWaXJ0dWFsRmlsZV8oKElWaXJ0dWFsRm9sZGVyKSB2UmVzb3VyY2UsIGZpbGUpOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJVmlydHVhbEZvbGRlciBnZXRSb290Rm9sZGVyKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpLmdldFJvb3RGb2xkZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9QbHVnaW5SZXNvdXJjZUxvY2F0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL1BsdWdpblJlc291cmNlTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZThmMDcwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL1BsdWdpblJlc291cmNlTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5QbGF0Zm9ybVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5jb3JlLnByb2plY3QuSUJ1bmRsZVByb2plY3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgUGx1Z2luUmVzb3VyY2VMb2NhdG9yCi0JZXh0ZW5kcyBTaW1wbGVKYXZhUmVzb3VyY2VMb2NhdG9yCi17Ci0JQE92ZXJyaWRlCi0JcHVibGljIElDb250YWluZXIgZ2V0RGVmYXVsdFJlc291cmNlTG9jYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlJQ29udGFpbmVyIGJ1bmRsZVJvb3QgPSB0aGlzLmdldEJ1bmRsZVJvb3QocHJvamVjdCk7Ci0JCXJldHVybiAoYnVuZGxlUm9vdCAhPSBudWxsKSA/Ci0JCQkJYnVuZGxlUm9vdC5nZXRGb2xkZXIoTUVUQV9JTkZfUEFUSCkgOgotCQkJCXN1cGVyLmdldERlZmF1bHRSZXNvdXJjZUxvY2F0aW9uKHByb2plY3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJUGF0aCBnZXRSZXNvdXJjZVBhdGgoSVByb2plY3QgcHJvamVjdCwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJSUNvbnRhaW5lciBidW5kbGVSb290ID0gdGhpcy5nZXRCdW5kbGVSb290KHByb2plY3QpOwotCQlpZiAoYnVuZGxlUm9vdCAhPSBudWxsKSB7Ci0JCQlJUGF0aCByZXNvdXJjZVBhdGggPSBidW5kbGVSb290LmdldEZ1bGxQYXRoKCkuYXBwZW5kKHJ1bnRpbWVQYXRoKTsKLQkJCWlmIChwcm9qZWN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHJlc291cmNlUGF0aCkuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gcmVzb3VyY2VQYXRoOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZXNvdXJjZVBhdGgocHJvamVjdCwgcnVudGltZVBhdGgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lUGF0aChJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCByZXNvdXJjZVBhdGgpIHsKLQkJSUNvbnRhaW5lciBidW5kbGVSb290ID0gdGhpcy5nZXRCdW5kbGVSb290KHByb2plY3QpOwotCQlpZiAoYnVuZGxlUm9vdCAhPSBudWxsKSB7Ci0JCQlJRmlsZSBmaWxlID0gUGxhdGZvcm1Ub29scy5nZXRGaWxlKHJlc291cmNlUGF0aCk7Ci0JCQlpZiAoYnVuZGxlUm9vdC5jb250YWlucyhmaWxlKSkgewotCQkJCXJldHVybiByZXNvdXJjZVBhdGgubWFrZVJlbGF0aXZlVG8oYnVuZGxlUm9vdC5nZXRGdWxsUGF0aCgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UnVudGltZVBhdGgocHJvamVjdCwgcmVzb3VyY2VQYXRoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRhaW5lciBnZXRCdW5kbGVSb290KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmdldEJ1bmRsZVJvb3RfKHByb2plY3QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBwcm9ibGVtIGNyZWF0aW5nIGRlc2NyaXB0aW9uIG9uIGFuIGV4aXN0aW5nIHByb2plY3QKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElDb250YWluZXIgZ2V0QnVuZGxlUm9vdF8oSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQgPSBKcHRDb21tb25Db3JlUGx1Z2luLmluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0QnVuZGxlQ29udGV4dCgpOwotCQlpZiAoYnVuZGxlQ29udGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvamVjdDsKLQkJfQotCQlTZXJ2aWNlUmVmZXJlbmNlPElCdW5kbGVQcm9qZWN0U2VydmljZT4gc2VydmljZVJlZiA9IGJ1bmRsZUNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShJQnVuZGxlUHJvamVjdFNlcnZpY2UuY2xhc3MpOwotCQlpZiAoc2VydmljZVJlZiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvamVjdDsKLQkJfQotCQlJQnVuZGxlUHJvamVjdFNlcnZpY2Ugc2VydmljZSA9IGJ1bmRsZUNvbnRleHQuZ2V0U2VydmljZShzZXJ2aWNlUmVmKTsKLQkJaWYgKHNlcnZpY2UgPT0gbnVsbCkgewotCQkJYnVuZGxlQ29udGV4dC51bmdldFNlcnZpY2Uoc2VydmljZVJlZik7Ci0JCQlyZXR1cm4gcHJvamVjdDsKLQkJfQotCQlJUGF0aCBidW5kbGVSb290ID0gc2VydmljZS5nZXREZXNjcmlwdGlvbihwcm9qZWN0KS5nZXRCdW5kbGVSb290KCk7Ci0JCWJ1bmRsZUNvbnRleHQudW5nZXRTZXJ2aWNlKHNlcnZpY2VSZWYpOwotCQlyZXR1cm4gKGJ1bmRsZVJvb3QgPT0gbnVsbCkgPyBwcm9qZWN0IDogcHJvamVjdC5nZXRGb2xkZXIoYnVuZGxlUm9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIElCdW5kbGVQcm9qZWN0U2VydmljZSBnZXRCdW5kbGVQcm9qZWN0U2VydmljZSgpIHsKLQkJQnVuZGxlQ29udGV4dCBjb250ZXh0ID0gSnB0Q29tbW9uQ29yZVBsdWdpbi5pbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldEJ1bmRsZUNvbnRleHQoKTsKLQkJU2VydmljZVJlZmVyZW5jZTxJQnVuZGxlUHJvamVjdFNlcnZpY2U+IHJlZmVyZW5jZSA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShJQnVuZGxlUHJvamVjdFNlcnZpY2UuY2xhc3MpOwotCQlpZiAocmVmZXJlbmNlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlCdW5kbGVQcm9qZWN0U2VydmljZSBzZXJ2aWNlID0gY29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCWlmIChzZXJ2aWNlICE9IG51bGwpIHsKLQkJCWNvbnRleHQudW5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvUHJvamVjdEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9Qcm9qZWN0QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwZTM1Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9Qcm9qZWN0QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuUHJvamVjdFJlc291cmNlTG9jYXRvcjsKLQotLyoqCi0gKiBGYWN0b3J5IHRvIGJ1aWxkIERhbGkgYWRhcHRlcnMgZm9yIGFuIHtAbGluayBJUHJvamVjdH06PHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuUHJvamVjdFJlc291cmNlTG9jYXRvcn0KLSAqIDwvdWw+Ci0gKiBTZWUgPGNvZGU+b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3BsdWdpbi54bWw8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdEFkYXB0ZXJGYWN0b3J5Ci0JaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIEFEQVBURVJfTElTVCA9IG5ldyBDbGFzc1tdIHsKLQkJCVByb2plY3RSZXNvdXJjZUxvY2F0b3IuY2xhc3MKLQkJfTsKLQotCXB1YmxpYyBDbGFzczw/PltdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gQURBUFRFUl9MSVNUOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKSBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCXJldHVybiB0aGlzLmdldEFkYXB0ZXIoKElQcm9qZWN0KSBhZGFwdGFibGVPYmplY3QsIGFkYXB0ZXJUeXBlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3QgZ2V0QWRhcHRlcihJUHJvamVjdCBwcm9qZWN0LCBDbGFzczw/PiBhZGFwdGVyVHlwZSkgewotCQlpZiAoYWRhcHRlclR5cGUgPT0gUHJvamVjdFJlc291cmNlTG9jYXRvci5jbGFzcykgewotCQkJcmV0dXJuIHRoaXMuZ2V0UHJvamVjdFJlc291cmNlTG9jYXRvcihwcm9qZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9qZWN0UmVzb3VyY2VMb2NhdG9yIGdldFByb2plY3RSZXNvdXJjZUxvY2F0b3IoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb2plY3RSZXNvdXJjZUxvY2F0b3IocHJvamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvUmVzb3VyY2VMb2NhdG9yQ29uZmlnLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9SZXNvdXJjZUxvY2F0b3JDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJhMWIxOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9SZXNvdXJjZUxvY2F0b3JDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldGVkUHJvamVjdEZyYW1ld29ya0phdmFQbHVnaW4ubG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXZhbHVhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FdmFsdWF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5YUG9pbnRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotcHVibGljIGNsYXNzIFJlc291cmNlTG9jYXRvckNvbmZpZyAKLQkJaW1wbGVtZW50cyBDb21wYXJhYmxlPFJlc291cmNlTG9jYXRvckNvbmZpZz4gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfRU5BQkxFTUVOVF9WQVJJQUJMRSA9ICJwcm9qZWN0IjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIFN0cmluZyBwbHVnaW5JZDsKLQlwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7Ci0JcHJpdmF0ZSBQcmlvcml0eSBwcmlvcml0eTsKLQlwcml2YXRlIEV4cHJlc3Npb24gZW5hYmxlbWVudENvbmRpdGlvbjsKLQkKLQkKLQlSZXNvdXJjZUxvY2F0b3JDb25maWcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiB0aGlzLmlkOwotCX0KLQkKLQl2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCXJldHVybiB0aGlzLnBsdWdpbklkOwotCX0KLQkKLQl2b2lkIHNldFBsdWdpbklkKFN0cmluZyBwbHVnaW5JZCkgewotCQl0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jbGFzc05hbWU7Ci0JfQotCQotCXZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JfQotCQotCXB1YmxpYyBQcmlvcml0eSBnZXRQcmlvcml0eSgpIHsKLQkJcmV0dXJuIHRoaXMucHJpb3JpdHk7Ci0JfQotCQotCXZvaWQgc2V0UHJpb3JpdHkoUHJpb3JpdHkgcHJpb3JpdHkpIHsKLQkJdGhpcy5wcmlvcml0eSA9IHByaW9yaXR5OwotCX0KLQkKLQlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFbmFibGVtZW50Q29uZGl0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5lbmFibGVtZW50Q29uZGl0aW9uOwotCX0KLQkKLQl2b2lkIHNldEVuYWJsZW1lbnRDb25kaXRpb24oRXhwcmVzc2lvbiBlbmFibGVtZW50Q29uZGl0aW9uKSB7Ci0JCXRoaXMuZW5hYmxlbWVudENvbmRpdGlvbiA9IGVuYWJsZW1lbnRDb25kaXRpb247Ci0JfQotCQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gWFBvaW50VG9vbHMuaW5zdGFudGlhdGUoCi0JCQkJdGhpcy5wbHVnaW5JZCwgUmVzb3VyY2VMb2NhdG9yTWFuYWdlci5RVUFMSUZJRURfRVhURU5TSU9OX1BPSU5UX0lELCAKLQkJCQl0aGlzLmNsYXNzTmFtZSwgUmVzb3VyY2VMb2NhdG9yLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkRm9yKElQcm9qZWN0IHByb2plY3QpIHsKLQkJRXZhbHVhdGlvbkNvbnRleHQgZXZhbENvbnRleHQgPSBuZXcgRXZhbHVhdGlvbkNvbnRleHQobnVsbCwgcHJvamVjdCk7Ci0JCWV2YWxDb250ZXh0LnNldEFsbG93UGx1Z2luQWN0aXZhdGlvbih0cnVlKTsKLQkJZXZhbENvbnRleHQuYWRkVmFyaWFibGUoUFJPSkVDVF9FTkFCTEVNRU5UX1ZBUklBQkxFLCBwcm9qZWN0KTsKLQkJCi0JCWlmICh0aGlzLmVuYWJsZW1lbnRDb25kaXRpb24gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlFdmFsdWF0aW9uUmVzdWx0IGV2YWxSZXN1bHQgPSB0aGlzLmVuYWJsZW1lbnRDb25kaXRpb24uZXZhbHVhdGUoZXZhbENvbnRleHQpOwotCQkJCQotCQkJCWlmIChldmFsUmVzdWx0ID09IEV2YWx1YXRpb25SZXN1bHQuRkFMU0UpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlsb2coZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhSZXNvdXJjZUxvY2F0b3JDb25maWcgb3RoZXIpIHsKLQkJcmV0dXJuIFByaW9yaXR5LmNvbXBhcmUodGhpcy5wcmlvcml0eSwgb3RoZXIucHJpb3JpdHkpOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGVudW0gUHJpb3JpdHkgewotCQkKLQkJLyogVGhlIGxvd2VzdCBwcmlvcml0eSBmb3IgYSByZXNvdXJjZSBsb2NhdG9yICovCi0JCUxPV0VTVCg2LCAibG93ZXN0IiksIC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qIFRoZSBzZWNvbmQgbG93ZXN0IHByaW9yaXR5IGZvciBhIHJlc291cmNlIGxvY2F0b3IgKi8KLQkJTE9XRVIoNSwgImxvd2VyIiksIC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qIFRoZSB0aGlyZCBsb3dlc3QgcHJpb3JpdHkgZm9yIGEgcmVzb3VyY2UgbG9jYXRvciAqLwotCQlMT1coNCwgImxvdyIpLCAvLyROT04tTkxTLTEkCi0JCQotCQkvKiBUaGUgZGVmYXVsdCBwcmlvcml0eSBmb3IgYSByZXNvdXJjZSBsb2NhdG9yICovCi0JCU5PUk1BTCgzLCAibm9ybWFsIiksIC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qIFRoZSB0aGlyZCBoaWdoZXN0IHByaW9yaXR5IGZvciBhIHJlc291cmNlIGxvY2F0b3IgKi8KLQkJSElHSCgyLCAiaGlnaCIpLCAvLyROT04tTkxTLTEkCi0JCQotCQkvKiBUaGUgc2Vjb25kIGhpZ2hlc3QgcHJpb3JpdHkgZm9yIGEgcmVzb3VyY2UgbG9jYXRvciAqLwotCQlISUdIRVIoMSwgImhpZ2hlciIpLCAvLyROT04tTkxTLTEkCi0JCQotCQkvKiBUaGUgaGlnaGVzdCBwcmlvcml0eSBmb3IgYSByZXNvdXJjZSBsb2NhdG9yICovCi0JCUhJR0hFU1QoMCwgImhpZ2hlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJCi0JCXB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmUoUHJpb3JpdHkgcHJpb3JpdHkxLCBQcmlvcml0eSBwcmlvcml0eTIpIHsKLQkJCXJldHVybiBwcmlvcml0eTEudmFsdWUuY29tcGFyZVRvKHByaW9yaXR5Mi52YWx1ZSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBzdGF0aWMgUHJpb3JpdHkgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCQlpZiAobGl0ZXJhbCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIE5PUk1BTDsKLQkJCX0KLQkJCWZvciAoUHJpb3JpdHkgcHJpb3JpdHkgOiB2YWx1ZXMoKSkgewotCQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwobGl0ZXJhbCwgcHJpb3JpdHkubGl0ZXJhbCkpIHsKLQkJCQkJcmV0dXJuIHByaW9yaXR5OwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQkKLQkJcHJpdmF0ZSBJbnRlZ2VyIHZhbHVlOwotCQlwcml2YXRlIFN0cmluZyBsaXRlcmFsOwotCQkKLQkJCi0JCXByaXZhdGUgUHJpb3JpdHkoaW50IHZhbHVlLCBTdHJpbmcgbGl0ZXJhbCkgewotCQkJdGhpcy52YWx1ZSA9IEludGVnZXIudmFsdWVPZih2YWx1ZSk7Ci0JCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCQl9Ci0JCQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5saXRlcmFsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvUmVzb3VyY2VMb2NhdG9yTWFuYWdlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvUmVzb3VyY2VMb2NhdG9yTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDcxMDMxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL1Jlc291cmNlTG9jYXRvck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5YUG9pbnRUb29scy4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLlJlc291cmNlTG9jYXRvckNvbmZpZy5Qcmlvcml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5YUG9pbnRUb29scy5YUG9pbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5LZXllZFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VMb2NhdG9yTWFuYWdlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gInJlc291cmNlTG9jYXRvcnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX0VYVEVOU0lPTl9QT0lOVF9JRCA9IEpwdENvbW1vbkNvcmVQbHVnaW4uUExVR0lOX0lEXyArIEVYVEVOU0lPTl9QT0lOVF9JRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9MT0NBVE9SX0VMRU1FTlQgPSAicmVzb3VyY2VMb2NhdG9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FUVFJJQlVURSA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19BVFRSSUJVVEUgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfQVRUUklCVVRFID0gInByaW9yaXR5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQUJMRU1FTlRfRUxFTUVOVCA9ICJlbmFibGVtZW50IjsgLy8kTk9OLU5MUy0xJAotCQotCQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlTG9jYXRvck1hbmFnZXIgSU5TVEFOQ0UgPSBuZXcgUmVzb3VyY2VMb2NhdG9yTWFuYWdlcigpOwotCQotCQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VMb2NhdG9yTWFuYWdlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQlwcml2YXRlIEtleWVkU2V0PFN0cmluZywgUmVzb3VyY2VMb2NhdG9yQ29uZmlnPiByZXNvdXJjZUxvY2F0b3JDb25maWdzOwotCQotCQotCXByaXZhdGUgUmVzb3VyY2VMb2NhdG9yTWFuYWdlcigpIHsKLQkJdGhpcy5yZXNvdXJjZUxvY2F0b3JDb25maWdzID0gbmV3IEtleWVkU2V0PFN0cmluZywgUmVzb3VyY2VMb2NhdG9yQ29uZmlnPigpOwotCQlyZWFkRXh0ZW5zaW9ucygpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBSZXNvdXJjZUxvY2F0b3J9IG9mIGhpZ2hlc3QgcHJpb3JpdHkgdGhhdCBpcyBhY2NlcHRhYmxlCi0JICogZm9yIHRoZSBnaXZlbiBwcm9qZWN0Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQlJdGVyYWJsZTxSZXNvdXJjZUxvY2F0b3JDb25maWc+IHNvcnRlZENvbmZpZ3MgPSAKLQkJCQkvL21ha2UgUmVzb3VyY2VMb2NhdG9yQ29uZmlnIHdpdGggaGlnaGVyIHByaW9yaXR5IGdvIGZpcnN0Ci0JCQkJQ29sbGVjdGlvblRvb2xzLnNvcnQoCi0JCQkJCQluZXcgRmlsdGVyaW5nSXRlcmFibGU8UmVzb3VyY2VMb2NhdG9yQ29uZmlnPigKLQkJCQkJCQkJdGhpcy5yZXNvdXJjZUxvY2F0b3JDb25maWdzLmdldEl0ZW1TZXQoKSkgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChSZXNvdXJjZUxvY2F0b3JDb25maWcgbykgewotCQkJCQkJCQlyZXR1cm4gby5pc0VuYWJsZWRGb3IocHJvamVjdCkKLQkJCQkJCQkJCQkmJiBvLmdldFJlc291cmNlTG9jYXRvcigpICE9IG51bGw7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCWZvciAoUmVzb3VyY2VMb2NhdG9yQ29uZmlnIGNvbmZpZyA6IHNvcnRlZENvbmZpZ3MpIHsKLQkJCVJlc291cmNlTG9jYXRvciBsb2NhdG9yID0gY29uZmlnLmdldFJlc291cmNlTG9jYXRvcigpOwotCQkJaWYgKGxvY2F0b3IgIT0gbnVsbCkgewotCQkJCXJldHVybiBsb2NhdG9yOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVhZEV4dGVuc2lvbnMoKSB7Ci0JCWZpbmFsIElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQotCQlmaW5hbCBJRXh0ZW5zaW9uUG9pbnQgeHBvaW50IAotCQkJCT0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUVVBTElGSUVEX0VYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCQotCQlpZiAoeHBvaW50ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQkKLQkJZmluYWwgTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKLQkJCi0JCWZvciAoSUV4dGVuc2lvbiBleHRlbnNpb24gOiB4cG9pbnQuZ2V0RXh0ZW5zaW9ucygpKSB7Ci0gICAgICAgIAlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IDogZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKSB7Ci0gICAgICAgIAkJY29uZmlncy5hZGQoZWxlbWVudCk7Ci0gICAgICAgIAl9Ci0JCX0KLQkJCi0JCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgOiBjb25maWdzKSB7Ci0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFJFU09VUkNFX0xPQ0FUT1JfRUxFTUVOVCkpIHsKLSAgICAgICAgICAgICAgICByZWFkRXh0ZW5zaW9uKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWFkRXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQlmaW5hbCBSZXNvdXJjZUxvY2F0b3JDb25maWcgcmxDb25maWcgPSBuZXcgUmVzb3VyY2VMb2NhdG9yQ29uZmlnKCk7Ci0JCQkKLQkJCS8vIHBsdWctaW4gaWQKLQkJCXJsQ29uZmlnLnNldFBsdWdpbklkKGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpOwotCQkJCi0JCQkvLyByZXNvdXJjZSBsb2NhdG9yIGlkCi0JCQlybENvbmZpZy5zZXRJZChmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoZWxlbWVudCwgSURfQVRUUklCVVRFKSk7Ci0JCQkKLQkJCWlmICh0aGlzLnJlc291cmNlTG9jYXRvckNvbmZpZ3MuY29udGFpbnNLZXkocmxDb25maWcuZ2V0SWQoKSkpIHsKLQkJCQlsb2dEdXBsaWNhdGVFeHRlbnNpb24oUVVBTElGSUVEX0VYVEVOU0lPTl9QT0lOVF9JRCwgSURfQVRUUklCVVRFLCBybENvbmZpZy5nZXRJZCgpKTsKLQkJCQl0aHJvdyBuZXcgWFBvaW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQkJCS8vIHJlc291cmNlIGxvY2F0b3IgY2xhc3MgbmFtZQotCQkJcmxDb25maWcuc2V0Q2xhc3NOYW1lKGZpbmRSZXF1aXJlZEF0dHJpYnV0ZShlbGVtZW50LCBDTEFTU19BVFRSSUJVVEUpKTsKLQkJCQotCQkJLy8gcHJpb3JpdHkKLQkJCVN0cmluZyBwcmlvcml0eVN0cmluZyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFBSSU9SSVRZX0FUVFJJQlVURSkudHJpbSgpOwotCQkJUHJpb3JpdHkgcHJpb3JpdHkgPSBQcmlvcml0eS5nZXQocHJpb3JpdHlTdHJpbmcpOwotCQkJaWYgKHByaW9yaXR5ID09IG51bGwpIHsKLQkJCQlsb2dJbnZhbGlkVmFsdWUoZWxlbWVudCwgUFJJT1JJVFlfQVRUUklCVVRFLCBwcmlvcml0eVN0cmluZyk7Ci0JCQkJdGhyb3cgbmV3IFhQb2ludEV4Y2VwdGlvbigpOwotCQkJfQotCQkJcmxDb25maWcuc2V0UHJpb3JpdHkocHJpb3JpdHkpOwotCQkJCi0JCQkvLyBlbmFibGVtZW50Ci0JCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZCA6IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKSkgewotCQkJCVN0cmluZyBjaGlsZE5hbWUgPSBjaGlsZC5nZXROYW1lKCk7Ci0JCQkJaWYgKGNoaWxkTmFtZS5lcXVhbHMoRU5BQkxFTUVOVF9FTEVNRU5UKSkgewotCQkJCQlFeHByZXNzaW9uIGV4cHI7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlleHByID0gRXhwcmVzc2lvbkNvbnZlcnRlci5nZXREZWZhdWx0KCkucGVyZm9ybShjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJbG9nKGUpOwotCQkJCQkJdGhyb3cgbmV3IFhQb2ludEV4Y2VwdGlvbigpOwotCQkJCQl9Ci0JCQkJCXJsQ29uZmlnLnNldEVuYWJsZW1lbnRDb25kaXRpb24oZXhwcik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQl0aGlzLnJlc291cmNlTG9jYXRvckNvbmZpZ3MuYWRkSXRlbShybENvbmZpZy5nZXRJZCgpLCBybENvbmZpZyk7Ci0JCX0KLQkJY2F0Y2ggKFhQb2ludEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZ25vcmUgYW5kIGNvbnRpbnVlLiBUaGUgcHJvYmxlbSBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkIHRvIHRoZSB1c2VyCi0JCQkvLyBpbiB0aGUgbG9nLgotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvU2ltcGxlSmF2YVJlc291cmNlTG9jYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvU2ltcGxlSmF2YVJlc291cmNlTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDA5ZGY4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL1NpbXBsZUphdmFSZXNvdXJjZUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlBsYXRmb3JtVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFNpbXBsZUphdmFSZXNvdXJjZUxvY2F0b3IKLQlpbXBsZW1lbnRzIFJlc291cmNlTG9jYXRvcgotewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVBhdGggTUVUQV9JTkZfUEFUSCA9IG5ldyBQYXRoKEoyRUVDb25zdGFudHMuTUVUQV9JTkYpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb250YWluZXIgaXMgZWl0aGVyOjx1bD4KLQkgKiA8bGk+b24gdGhlIGNvcnJlc3BvbmRpbmcgSmF2YSBwcm9qZWN0J3MgY2xhc3NwYXRoOyBvcgotCSAqIDxsaT5pbiB0aGUgbm9uLUphdmEgcmVzb3VyY2VzLCBidXQgbm90IGluIHRoZSBwcm9qZWN0IG91dHB1dCBsb2NhdGlvbgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gcmVzb3VyY2VMb2NhdGlvbklzVmFsaWQoSVByb2plY3QgcHJvamVjdCwgSUNvbnRhaW5lciBjb250YWluZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLnJlc291cmNlTG9jYXRpb25Jc1ZhbGlkXyhwcm9qZWN0LCBjb250YWluZXIpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCS8vIGhhcHBlbnMgaWYgdGhlIEphdmEgcHJvamVjdCBkb2VzIG5vdCBleGlzdAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzb3VyY2VMb2NhdGlvbklzVmFsaWRfKElQcm9qZWN0IHByb2plY3QsIElDb250YWluZXIgY29udGFpbmVyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gdGhpcy5nZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKLQkJaWYgKGphdmFQcm9qZWN0LmlzT25DbGFzc3BhdGgoY29udGFpbmVyKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlJUGF0aCBvdXRwdXRQYXRoID0gamF2YVByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLQkJSVBhdGggY29udGFpbmVyUGF0aCA9IGNvbnRhaW5lci5nZXRGdWxsUGF0aCgpOwotCQlpZiAoY29udGFpbmVyLmVxdWFscyhwcm9qZWN0KSAmJiBvdXRwdXRQYXRoLmlzUHJlZml4T2YoY29udGFpbmVyUGF0aCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJaWYgKG91dHB1dFBhdGguaXNQcmVmaXhPZihjb250YWluZXJQYXRoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoT2JqZWN0IHJlc291cmNlIDogamF2YVByb2plY3QuZ2V0Tm9uSmF2YVJlc291cmNlcygpKSB7Ci0JCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQkJSUZvbGRlciBmb2xkZXIgPSAoSUZvbGRlcikgcmVzb3VyY2U7Ci0JCQkJaWYgKGZvbGRlci5nZXRGdWxsUGF0aCgpLmlzUHJlZml4T2YoY29udGFpbmVyUGF0aCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCByZXNvdXJjZSBsb2NhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0Ojx1bD4KLQkgKiA8bGk+dGhlIGZpcnN0IHBhY2thZ2UgZnJhZ21lbnQgcm9vdCAoc291cmNlIGZvbGRlcikgPGNvZGU+TUVUQS1JTkY8L2NvZGU+Ci0JICogICAgIGZvbGRlciBpZiBpdCBleGlzdHM7IG9yCi0JICogPGxpPnRoZSBwcm9qZWN0IHJvb3RlZCA8Y29kZT5NRVRBLUlORjwvY29kZT4gZm9sZGVyIGlmIGl0IGV4aXN0czsgb3IKLQkgKiA8bGk+dGhlIG5vbi1leGlzdGVudCA8Y29kZT5NRVRBLUlORjwvY29kZT4gZm9sZGVyIGluIHRoZSBmaXJzdCBwYWNrYWdlCi0JICogICAgIGZyYWdtZW50IHJvb3QgKHNvdXJjZSBmb2xkZXIpCi0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgSUNvbnRhaW5lciBnZXREZWZhdWx0UmVzb3VyY2VMb2NhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXREZWZhdWx0UmVzb3VyY2VMb2NhdGlvbl8ocHJvamVjdCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJLy8gaGFwcGVucyBpZiB0aGUgSmF2YSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IG9yIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZQotCQkJLy8gSmF2YSByZXNvdXJjZXMKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElDb250YWluZXIgZ2V0RGVmYXVsdFJlc291cmNlTG9jYXRpb25fKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29udGFpbmVyIGRlZmF1bHRMb2NhdGlvbiA9IG51bGw7Ci0JCWZvciAoSUNvbnRhaW5lciBzb3VyY2VGb2xkZXIgOiB0aGlzLmdldFNvdXJjZUZvbGRlcnMocHJvamVjdCkpIHsKLQkJCUlGb2xkZXIgbWV0YUluZkZvbGRlciA9IHNvdXJjZUZvbGRlci5nZXRGb2xkZXIoTUVUQV9JTkZfUEFUSCk7Ci0JCQlpZiAobWV0YUluZkZvbGRlci5leGlzdHMoKSkgewotCQkJCXJldHVybiBtZXRhSW5mRm9sZGVyOwotCQkJfQotCQkJaWYgKGRlZmF1bHRMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJLy8gc2F2ZSB0aGUgZmlyc3Qgb25lLCB0byB1c2UgaWYgbm9uZSBmb3VuZAotCQkJCWRlZmF1bHRMb2NhdGlvbiA9IG1ldGFJbmZGb2xkZXI7Ci0JCQl9Ci0JCX0KLQkJSUZvbGRlciBtZXRhSW5mRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoTUVUQV9JTkZfUEFUSCk7Ci0JCWlmIChtZXRhSW5mRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gbWV0YUluZkZvbGRlcjsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdExvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBJUGF0aCBnZXRSZXNvdXJjZVBhdGgoSVByb2plY3QgcHJvamVjdCwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmdldFJlc291cmNlUGF0aF8ocHJvamVjdCwgcnVudGltZVBhdGgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElQYXRoIGdldFJlc291cmNlUGF0aF8oSVByb2plY3QgcHJvamVjdCwgSVBhdGggcnVudGltZVBhdGgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGF0aCBkZWZhdWx0UmVzb3VyY2VQYXRoID0gbnVsbDsKLQkJZm9yIChJQ29udGFpbmVyIHNvdXJjZUZvbGRlciA6IHRoaXMuZ2V0U291cmNlRm9sZGVycyhwcm9qZWN0KSkgewotCQkJSVBhdGggcmVzb3VyY2VQYXRoID0gc291cmNlRm9sZGVyLmdldEZ1bGxQYXRoKCkuYXBwZW5kKHJ1bnRpbWVQYXRoKTsKLQkJCUlGaWxlIGZpbGUgPSBwcm9qZWN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHJlc291cmNlUGF0aCk7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCXJldHVybiBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0JCQl9Ci0JCQlpZiAoZGVmYXVsdFJlc291cmNlUGF0aCA9PSBudWxsKSB7Ci0JCQkJLy8gc2F2ZSB0aGUgZmlyc3Qgb25lLCB0byB1c2UgaWYgbm9uZSBmb3VuZAotCQkJCWRlZmF1bHRSZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGg7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRSZXNvdXJjZVBhdGg7Ci0JfQotCi0JcHVibGljIElQYXRoIGdldFJ1bnRpbWVQYXRoKElQcm9qZWN0IHByb2plY3QsIElQYXRoIHJlc291cmNlUGF0aCkgewotCQl0cnkgewotCQkJcmV0dXJuIHRoaXMuZ2V0UnVudGltZVBhdGhfKHByb2plY3QsIHJlc291cmNlUGF0aCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIHJlc291cmNlUGF0aC5tYWtlUmVsYXRpdmVUbyhwcm9qZWN0LmdldEZ1bGxQYXRoKCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElQYXRoIGdldFJ1bnRpbWVQYXRoXyhJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCByZXNvdXJjZVBhdGgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJRmlsZSBmaWxlID0gUGxhdGZvcm1Ub29scy5nZXRGaWxlKHJlc291cmNlUGF0aCk7Ci0JCWZvciAoSUNvbnRhaW5lciBzb3VyY2VGb2xkZXIgOiB0aGlzLmdldFNvdXJjZUZvbGRlcnMocHJvamVjdCkpIHsKLQkJCWlmIChzb3VyY2VGb2xkZXIuY29udGFpbnMoZmlsZSkpIHsKLQkJCQlyZXR1cm4gcmVzb3VyY2VQYXRoLm1ha2VSZWxhdGl2ZVRvKHNvdXJjZUZvbGRlci5nZXRGdWxsUGF0aCgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VQYXRoLm1ha2VSZWxhdGl2ZVRvKHByb2plY3QuZ2V0RnVsbFBhdGgoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPElDb250YWluZXI+IGdldFNvdXJjZUZvbGRlcnMoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxJUGFja2FnZUZyYWdtZW50Um9vdCwgSUNvbnRhaW5lcj4odGhpcy5nZXRTb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290cyhwcm9qZWN0KSwgUk9PVF9DT05UQUlORVJfVFJBTlNGT1JNRVIpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXI8SVBhY2thZ2VGcmFnbWVudFJvb3QsIElDb250YWluZXI+IFJPT1RfQ09OVEFJTkVSX1RSQU5TRk9STUVSID0gbmV3IFJvb3RDb250YWluZXJUcmFuc2Zvcm1lcigpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBSb290Q29udGFpbmVyVHJhbnNmb3JtZXIKLQkJaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxJUGFja2FnZUZyYWdtZW50Um9vdCwgSUNvbnRhaW5lcj4KLQl7Ci0JCXB1YmxpYyBJQ29udGFpbmVyIHRyYW5zZm9ybShJUGFja2FnZUZyYWdtZW50Um9vdCBwZnIpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtXyhwZnIpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQl9Ci0JCXByb3RlY3RlZCBJQ29udGFpbmVyIHRyYW5zZm9ybV8oSVBhY2thZ2VGcmFnbWVudFJvb3QgcGZyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCXJldHVybiAoSUNvbnRhaW5lcikgcGZyLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPElQYWNrYWdlRnJhZ21lbnRSb290PiBnZXRTb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290cyhJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxJUGFja2FnZUZyYWdtZW50Um9vdD4odGhpcy5nZXRQYWNrYWdlRnJhZ21lbnRSb290cyhwcm9qZWN0KSwgU09VUkNFX1JPT1RfRklMVEVSKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEZpbHRlcjxJUGFja2FnZUZyYWdtZW50Um9vdD4gU09VUkNFX1JPT1RfRklMVEVSID0gbmV3IFNvdXJjZVJvb3RGaWx0ZXIoKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgU291cmNlUm9vdEZpbHRlcgotCQlpbXBsZW1lbnRzIEZpbHRlcjxJUGFja2FnZUZyYWdtZW50Um9vdD4KLQl7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChJUGFja2FnZUZyYWdtZW50Um9vdCBwZnIpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHRoaXMuYWNjZXB0XyhwZnIpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQl9Ci0JCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdF8oSVBhY2thZ2VGcmFnbWVudFJvb3QgcGZyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCXJldHVybiBwZnIuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPElQYWNrYWdlRnJhZ21lbnRSb290PiBnZXRQYWNrYWdlRnJhZ21lbnRSb290cyhJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPElQYWNrYWdlRnJhZ21lbnRSb290Pih0aGlzLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzQXJyYXkocHJvamVjdCkpOwotCX0KLQotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdFtdIGdldFBhY2thZ2VGcmFnbWVudFJvb3RzQXJyYXkoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmdldEphdmFQcm9qZWN0KHByb2plY3QpLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvU2ltcGxlUHJvamVjdFJlc291cmNlTG9jYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvU2ltcGxlUHJvamVjdFJlc291cmNlTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWIxZDUyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL1NpbXBsZVByb2plY3RSZXNvdXJjZUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLlByb2plY3RSZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuUHJvamVjdEFkYXB0ZXJGYWN0b3J5Ci0gKiBAc2VlIFJlc291cmNlTG9jYXRvck1hbmFnZXIKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVByb2plY3RSZXNvdXJjZUxvY2F0b3IKLQlpbXBsZW1lbnRzIFByb2plY3RSZXNvdXJjZUxvY2F0b3IKLXsKLQlwcm90ZWN0ZWQgZmluYWwgSVByb2plY3QgcHJvamVjdDsKLQotCi0JcHVibGljIFNpbXBsZVByb2plY3RSZXNvdXJjZUxvY2F0b3IoSVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcigpOwotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlc291cmNlTG9jYXRpb25Jc1ZhbGlkKElDb250YWluZXIgY29udGFpbmVyKSB7Ci0JCVJlc291cmNlTG9jYXRvciByZXNvdXJjZUxvY2F0b3IgPSB0aGlzLmdldFJlc291cmNlTG9jYXRvcigpOwotCQlyZXR1cm4gKHJlc291cmNlTG9jYXRvciAhPSBudWxsKSAmJiByZXNvdXJjZUxvY2F0b3IucmVzb3VyY2VMb2NhdGlvbklzVmFsaWQodGhpcy5wcm9qZWN0LCBjb250YWluZXIpOwotCX0KLQotCXB1YmxpYyBJQ29udGFpbmVyIGdldERlZmF1bHRSZXNvdXJjZUxvY2F0aW9uKCkgewotCQlSZXNvdXJjZUxvY2F0b3IgcmVzb3VyY2VMb2NhdG9yID0gdGhpcy5nZXRSZXNvdXJjZUxvY2F0b3IoKTsKLQkJcmV0dXJuIChyZXNvdXJjZUxvY2F0b3IgPT0gbnVsbCkgPyBudWxsIDogcmVzb3VyY2VMb2NhdG9yLmdldERlZmF1bHRSZXNvdXJjZUxvY2F0aW9uKHRoaXMucHJvamVjdCk7Ci0JfQotCi0JcHVibGljIElQYXRoIGdldFJlc291cmNlUGF0aChJUGF0aCBydW50aW1lUGF0aCkgewotCQlSZXNvdXJjZUxvY2F0b3IgcmVzb3VyY2VMb2NhdG9yID0gdGhpcy5nZXRSZXNvdXJjZUxvY2F0b3IoKTsKLQkJcmV0dXJuIChyZXNvdXJjZUxvY2F0b3IgPT0gbnVsbCkgPyBudWxsIDogcmVzb3VyY2VMb2NhdG9yLmdldFJlc291cmNlUGF0aCh0aGlzLnByb2plY3QsIHJ1bnRpbWVQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZVBhdGgoSVBhdGggcmVzb3VyY2VQYXRoKSB7Ci0JCVJlc291cmNlTG9jYXRvciByZXNvdXJjZUxvY2F0b3IgPSB0aGlzLmdldFJlc291cmNlTG9jYXRvcigpOwotCQlyZXR1cm4gKHJlc291cmNlTG9jYXRvciA9PSBudWxsKSA/IG51bGwgOiByZXNvdXJjZUxvY2F0b3IuZ2V0UnVudGltZVBhdGgodGhpcy5wcm9qZWN0LCByZXNvdXJjZVBhdGgpOwotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRQbGF0Zm9ybUZpbGUoSVBhdGggcnVudGltZVBhdGgpIHsKLQkJSVBhdGggc291cmNlUGF0aCA9IHRoaXMuZ2V0UmVzb3VyY2VQYXRoKHJ1bnRpbWVQYXRoKTsKLQkJcmV0dXJuIChzb3VyY2VQYXRoID09IG51bGwpID8gbnVsbCA6IHRoaXMucHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShzb3VyY2VQYXRoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFJlc291cmNlTG9jYXRvck1hbmFnZXIuaW5zdGFuY2UoKS5nZXRSZXNvdXJjZUxvY2F0b3IodGhpcy5wcm9qZWN0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnByb2plY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL1dlYk1vZHVsZVJlc291cmNlTG9jYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvV2ViTW9kdWxlUmVzb3VyY2VMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMWNiNmIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvV2ViTW9kdWxlUmVzb3VyY2VMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJNb2R1bGVSZXNvdXJjZUxvY2F0b3IKLQlleHRlbmRzIE1vZHVsZVJlc291cmNlTG9jYXRvcgotewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVBhdGggV0VCX0lORl9DTEFTU0VTX1BBVEggPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFUyk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJUGF0aCBXRUJfTUVUQV9JTkZfUEFUSCA9IFdFQl9JTkZfQ0xBU1NFU19QQVRILmFwcGVuZChNRVRBX0lORl9QQVRIKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZm9sZGVyIHJlcHJlc2VudGluZyB0aGUgPGNvZGU+V0VCLUlORi9jbGFzc2VzL01FVEEtSU5GPC9jb2RlPgotCSAqIGxvY2F0aW9uLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJQ29udGFpbmVyIGdldERlZmF1bHRSZXNvdXJjZUxvY2F0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Um9vdEZvbGRlcihwcm9qZWN0KS5nZXRGb2xkZXIoV0VCX01FVEFfSU5GX1BBVEgpLmdldFVuZGVybHlpbmdGb2xkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGwgcmVzb3VyY2UgcGF0aCByZXByZXNlbnRpbmcgdGhlIHNwZWNpZmllZCBydW50aW1lIGxvY2F0aW9uCi0JICogYXBwZW5kZWQgdG8gdGhlIDxjb2RlPldFQi1JTkYvY2xhc3NlczwvY29kZT4gbG9jYXRpb24uCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElQYXRoIGdldFJlc291cmNlUGF0aChJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBydW50aW1lUGF0aCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzb3VyY2VQYXRoKHByb2plY3QsIFdFQl9JTkZfQ0xBU1NFU19QQVRILmFwcGVuZChydW50aW1lUGF0aCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lUGF0aChJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCByZXNvdXJjZVBhdGgpIHsKLQkJSVBhdGggcnVudGltZVBhdGggPSBzdXBlci5nZXRSdW50aW1lUGF0aChwcm9qZWN0LCByZXNvdXJjZVBhdGgpOwotCQlyZXR1cm4gV0VCX0lORl9DTEFTU0VTX1BBVEguaXNQcmVmaXhPZihydW50aW1lUGF0aCkgPwotCQkJCXJ1bnRpbWVQYXRoLm1ha2VSZWxhdGl2ZVRvKFdFQl9JTkZfQ0xBU1NFU19QQVRIKSA6Ci0JCQkJcnVudGltZVBhdGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YjYyMWQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5Bc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotCi0vKioKLSAqIEphdmEgcmVzb3VyY2UgY29udGFpbm1lbnQgaGllcmFyY2h5Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUKLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZU5vZGUKLXsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YVJlc291cmNlTm9kZSBwYXJlbnQ7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jaGVja1BhcmVudChwYXJlbnQpOwotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHBhcmVudCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1BhcmVudChKYXZhUmVzb3VyY2VOb2RlIHApIHsKLQkJaWYgKHAgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMucmVxdWlyZXNQYXJlbnQoKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIidwYXJlbnQnIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLmZvcmJpZHNQYXJlbnQoKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIidwYXJlbnQnIG11c3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlc1BhcmVudCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZm9yYmlkc1BhcmVudCgpIHsKLQkJcmV0dXJuICEgdGhpcy5yZXF1aXJlc1BhcmVudCgpOyAgLy8gYXNzdW1lICdwYXJlbnQnIGlzIG5vdCBvcHRpb25hbAotCX0KLQotCi0JLy8gKioqKioqKioqKiBjaGFuZ2Ugc3VwcG9ydCBjYWxsYmFjayBob29rICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIHRoaXMuYnVpbGRDaGFuZ2VTdXBwb3J0TGlzdGVuZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBBc3BlY3RDaGFuZ2VTdXBwb3J0Lkxpc3RlbmVyIGJ1aWxkQ2hhbmdlU3VwcG9ydExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFzcGVjdENoYW5nZVN1cHBvcnQuTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhc3BlY3RDaGFuZ2VkKFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCQkJQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlLnRoaXMuYXNwZWN0Q2hhbmdlZChhc3BlY3ROYW1lKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBpZ25vcmUgdGhlIGFzcGVjdCBuYW1lLCB3ZSBub3RpZnkgbGlzdGVuZXJzIG9mICpldmVyeSogY2hhbmdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXNwZWN0Q2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJdGhpcy5nZXRSb290KCkucmVzb3VyY2VNb2RlbENoYW5nZWQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YVJlc291cmNlTm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5Sb290QmluYXJ5Tm9kZSNnZXRSb290KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VDb21waWxhdGlvblVuaXQjZ2V0Um9vdCgpCi0JICovCi0JcHVibGljIFJvb3QgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50LmdldFJvb3QoKTsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Um9vdCgpLmdldEZpbGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvblByb3ZpZGVyIGdldEFubm90YXRpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Um9vdCgpLmdldEFubm90YXRpb25Qcm92aWRlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEFubm90YXRpb24uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE3ZTdiNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIFNpbXBsaWZ5IG51bGwgYW5ub3RhdGlvbiBjbGFzc2VzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOdWxsQW5ub3RhdGlvbjxBIGV4dGVuZHMgQW5ub3RhdGlvbj4KLQlleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlTm9kZQotCWltcGxlbWVudHMgQW5ub3RhdGlvbgotewotCi0JcHJvdGVjdGVkIE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBnZXRBc3RBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgZ2V0SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01hcHBpbmdBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV3QW5ub3RhdGlvbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVW5zZXQoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2Q6IENhc3QgdGhlIGFubm90YXRpb24ncyBwYXJlbnQgdG8gYQotCSAqIHBlcnNpc3RlbnQgbWVtYmVyLgotCSAqLwotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IGdldEFubm90YXRlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiAoSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCkgdGhpcy5wYXJlbnQ7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZDogQWRkIHRoZSB0eXBlIG9yIGF0dHJpYnV0ZSdzIGFubm90YXRpb24KLQkgKiBhbmQgcmV0dXJuIGl0LgotCSAqIFByZS1jb25kaXRpb246IFRoZSBhbm5vdGF0aW9uJ3MgcGFyZW50IG11c3QgYmUgYSBwZXJzaXN0ZW50IG1lbWJlcgotCSAqICh0eXBlIG9yIGF0dHJpYnV0ZSkuCi0JICovCi0JcHJvdGVjdGVkIEEgYWRkQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuYWRkQW5ub3RhdGlvbl8oKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgQSBhZGRBbm5vdGF0aW9uXygpIHsKLQkJcmV0dXJuIChBKSB0aGlzLmdldEFubm90YXRlZEVsZW1lbnQoKS5hZGRBbm5vdGF0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QWJzdHJhY3RUeXBlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlBYnN0cmFjdFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJkYWQ5MS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlBYnN0cmFjdFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLQotLyoqCi0gKiBiaW5hcnkgcGVyc2lzdGVudCB0eXBlCi0gKi8KLWFic3RyYWN0IGNsYXNzIEJpbmFyeUFic3RyYWN0VHlwZQotCWV4dGVuZHMgQmluYXJ5TWVtYmVyCi0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUKLXsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBTdHJpbmcgcXVhbGlmaWVkTmFtZTsKLQotCXByaXZhdGUgU3RyaW5nIHBhY2thZ2VOYW1lOwotCi0JcHJpdmF0ZSBTdHJpbmcgZGVjbGFyaW5nVHlwZU5hbWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbWVtYmVyVHlwZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEJpbmFyeUFic3RyYWN0VHlwZShKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSVR5cGUgdHlwZSkgewotCQlzdXBlcihwYXJlbnQsIG5ldyBUeXBlQWRhcHRlcih0eXBlKSk7Ci0JCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKHR5cGUpOwotCQl0aGlzLnF1YWxpZmllZE5hbWUgPSB0aGlzLmJ1aWxkUXVhbGlmaWVkTmFtZSh0eXBlKTsKLQkJdGhpcy5wYWNrYWdlTmFtZSA9IHRoaXMuYnVpbGRQYWNrYWdlTmFtZSh0eXBlKTsKLQkJdGhpcy5kZWNsYXJpbmdUeXBlTmFtZSA9IHRoaXMuYnVpbGREZWNsYXJpbmdUeXBlTmFtZSh0eXBlKTsKLQkJdGhpcy5tZW1iZXJUeXBlID0gdGhpcy5idWlsZE1lbWJlclR5cGUodHlwZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoSU1lbWJlciBtZW1iZXIpIHsKLQkJc3VwZXIudXBkYXRlKG1lbWJlcik7Ci0JCXRoaXMuc2V0TmFtZSh0aGlzLmJ1aWxkTmFtZSgoSVR5cGUpIG1lbWJlcikpOwotCQl0aGlzLnNldFF1YWxpZmllZE5hbWUodGhpcy5idWlsZFF1YWxpZmllZE5hbWUoKElUeXBlKSBtZW1iZXIpKTsKLQkJdGhpcy5zZXRQYWNrYWdlTmFtZSh0aGlzLmJ1aWxkUGFja2FnZU5hbWUoKElUeXBlKSBtZW1iZXIpKTsKLQkJdGhpcy5zZXREZWNsYXJpbmdUeXBlTmFtZSh0aGlzLmJ1aWxkRGVjbGFyaW5nVHlwZU5hbWUoKElUeXBlKSBtZW1iZXIpKTsKLQkJdGhpcy5zZXRNZW1iZXJUeXBlKHRoaXMuYnVpbGRNZW1iZXJUeXBlKChJVHlwZSkgbWVtYmVyKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBuYW1lCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZShJVHlwZSB0eXBlKSB7Ci0JCXJldHVybiB0eXBlLmdldEVsZW1lbnROYW1lKCk7Ci0JfQotCi0JLy8gKioqKiogcXVhbGlmaWVkIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnF1YWxpZmllZE5hbWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFF1YWxpZmllZE5hbWUoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucXVhbGlmaWVkTmFtZTsKLQkJdGhpcy5xdWFsaWZpZWROYW1lID0gcXVhbGlmaWVkTmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFFVQUxJRklFRF9OQU1FX1BST1BFUlRZLCBvbGQsIHF1YWxpZmllZE5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkUXVhbGlmaWVkTmFtZShJVHlwZSB0eXBlKSB7Ci0JCXJldHVybiB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpOyAgLy8gbm8gcGFyYW1ldGVycyBhcmUgaW5jbHVkZWQgaGVyZQotCX0KLQotCS8vICoqKioqIHBhY2thZ2UKLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5wYWNrYWdlTmFtZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnBhY2thZ2VOYW1lOwotCQl0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQQUNLQUdFX05BTUVfUFJPUEVSVFksIG9sZCwgcGFja2FnZU5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkUGFja2FnZU5hbWUoSVR5cGUgdHlwZSkgewotCQlyZXR1cm4gdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW4oSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSwgdGhpcy5wYWNrYWdlTmFtZSk7Ci0JfQotCi0JLy8gKioqKiogc291cmNlIGZvbGRlcgotCXB1YmxpYyBib29sZWFuIGlzSW4oSVBhY2thZ2VGcmFnbWVudFJvb3Qgc291cmNlRm9sZGVyKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VGb2xkZXIoKS5lcXVhbHMoc291cmNlRm9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFNvdXJjZUZvbGRlcigpIHsKLQkJcmV0dXJuIChJUGFja2FnZUZyYWdtZW50Um9vdCkgdGhpcy5nZXRNZW1iZXIoKS5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKTsKLQl9Ci0KLQkvLyAqKioqKiBkZWNsYXJpbmcgdHlwZSBuYW1lCi0JcHVibGljIFN0cmluZyBnZXREZWNsYXJpbmdUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVjbGFyaW5nVHlwZU5hbWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERlY2xhcmluZ1R5cGVOYW1lKFN0cmluZyBkZWNsYXJpbmdUeXBlTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWNsYXJpbmdUeXBlTmFtZTsKLQkJdGhpcy5kZWNsYXJpbmdUeXBlTmFtZSA9IGRlY2xhcmluZ1R5cGVOYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVDTEFSSU5HX1RZUEVfTkFNRV9QUk9QRVJUWSwgb2xkLCBkZWNsYXJpbmdUeXBlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREZWNsYXJpbmdUeXBlTmFtZShJVHlwZSB0eXBlKSB7Ci0JCUlUeXBlIGRlY2xhcmluZ1R5cGUgPSB0eXBlLmdldERlY2xhcmluZ1R5cGUoKTsKLQkJcmV0dXJuIChkZWNsYXJpbmdUeXBlID09IG51bGwpID8gbnVsbCA6IGRlY2xhcmluZ1R5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJyk7ICAvLyBubyBwYXJhbWV0ZXJzIGFyZSBpbmNsdWRlZCBoZXJlCi0JfQotCi0KLQkvLyAqKioqKiBtZW1iZXIKLQlwdWJsaWMgYm9vbGVhbiBpc01lbWJlclR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm1lbWJlclR5cGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE1lbWJlclR5cGUoYm9vbGVhbiBtZW1iZXJUeXBlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5tZW1iZXJUeXBlOwotCQl0aGlzLm1lbWJlclR5cGUgPSBtZW1iZXJUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTUVNQkVSX1RZUEVfUFJPUEVSVFksIG9sZCwgbWVtYmVyVHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkTWVtYmVyVHlwZShJVHlwZSB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdHlwZS5pc01lbWJlcigpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJVHlwZSBnZXRNZW1iZXIoKSB7Ci0JCXJldHVybiAoSVR5cGUpIHN1cGVyLmdldE1lbWJlcigpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VUeXBlPiBnZXRUeXBlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VFbnVtPiBnZXRFbnVtcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPEphdmFSZXNvdXJjZVR5cGU+IGdldEFsbFR5cGVzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUVudW0+IGdldEFsbEVudW1zKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIElUeXBlIGFkYXB0ZXIgKioqKioqKioqKgotCi0Jc3RhdGljIGNsYXNzIFR5cGVBZGFwdGVyCi0JCQlpbXBsZW1lbnRzIEFkYXB0ZXIgewotCQkKLQkJcHJpdmF0ZSBmaW5hbCBJVHlwZSB0eXBlOwotCQkKLQkJVHlwZUFkYXB0ZXIoSVR5cGUgdHlwZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJVHlwZSBnZXRFbGVtZW50KCkgewotCQkJcmV0dXJuIHRoaXMudHlwZTsKLQkJfQotCQkKLQkJcHVibGljIEl0ZXJhYmxlPElUeXBlUGFyYW1ldGVyPiBnZXRUeXBlUGFyYW1ldGVycygpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPElUeXBlUGFyYW1ldGVyPih0aGlzLnR5cGUuZ2V0VHlwZVBhcmFtZXRlcnMoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGptZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgSUFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9ucygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkJcmV0dXJuIHRoaXMudHlwZS5nZXRBbm5vdGF0aW9ucygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QW5ub3RhdGVkRWxlbWVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QW5ub3RhdGVkRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmI1MDkwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUFubm90YXRlZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5Bbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLQotLyoqCi0gKiBKYXZhIGJpbmFyeSBhbm5vdGF0ZWQgZWxlbWVudAotICovCi1hYnN0cmFjdCBjbGFzcyBCaW5hcnlBbm5vdGF0ZWRFbGVtZW50Ci0JZXh0ZW5kcyBCaW5hcnlOb2RlCi0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50Ci17Ci0JLyoqIEpEVCBhbm5vdGF0ZWQgZWxlbWVudCBhZGFwdGVyICovCi0JZmluYWwgQWRhcHRlciBhZGFwdGVyOwotCi0JLyoqCi0JICogQW5ub3RhdGlvbnMga2V5ZWQgYnkgYW5ub3RhdGlvbiBuYW1lOwotCSAqIG5vIGR1cGxpY2F0ZXMgKHRoZSBKYXZhIGNvbXBpbGVyIGRvZXMgbm90IGFsbG93IGR1cGxpY2F0ZSBhbm5vdGF0aW9ucykuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBIYXNodGFibGU8U3RyaW5nLCBBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBBbm5vdGF0aW9uPigpOwotCi0JLyoqCi0JICogQW5ub3RhdGlvbiBjb250YWluZXJzIGtleWVkIGJ5IDxlbT5uZXN0YWJsZTwvZW0+IGFubm90YXRpb24gbmFtZS4KLQkgKiBUaGlzIGlzIHVzZWQgdG8gc3RvcmUgYW5ub3RhdGlvbnMgdGhhdCBjYW4gYmUgYm90aCBzdGFuZGFsb25lIGFuZCBuZXN0ZWQKLQkgKiBhbmQgYXJlIG1vdmVkIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIHR3by4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEhhc2h0YWJsZTxTdHJpbmcsIEFubm90YXRpb25Db250YWluZXI+IGFubm90YXRpb25Db250YWluZXJzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIEFubm90YXRpb25Db250YWluZXI+KCk7Ci0KLQkvKioKLQkgKiBUaGVzZSBhcmUgYnVpbHQgYXMgbmVlZGVkLgotCSAqLwotCXByaXZhdGUgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgQW5ub3RhdGlvbj4gbnVsbEFubm90YXRpb25zQ2FjaGUgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgQW5ub3RhdGlvbj4oKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JQmluYXJ5QW5ub3RhdGVkRWxlbWVudChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQWRhcHRlciBhZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JCXRoaXMuaW5pdGlhbGl6ZUFubm90YXRpb25zKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVBbm5vdGF0aW9ucygpIHsKLQkJZm9yIChJQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogdGhpcy5nZXRKZHRBbm5vdGF0aW9ucygpKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oYW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQW5ub3RhdGlvbihJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCVN0cmluZyBqZHRBbm5vdGF0aW9uTmFtZSA9IGpkdEFubm90YXRpb24uZ2V0RWxlbWVudE5hbWUoKTsKLQkJLy8gY2hlY2sgd2hldGhlciB0aGUgYW5ub3RhdGlvbiBpcyBhIHZhbGlkIGNvbnRhaW5lciBhbm5vdGF0aW9uIGZpcnN0Ci0JCS8vIGJlY2F1c2UgY29udGFpbmVyIHZhbGlkYXRpb25zIGFyZSBhbHNvIHZhbGlkIGFubm90YXRpb25zCi0JCS8vIFRPRE8gcmVtb3ZlIGNvbnRhaW5lciBhbm5vdGF0aW9ucyBmcm9tIGxpc3Qgb2YgYW5ub3RhdGlvbnM/Pz8KLQkJaWYgKHRoaXMuYW5ub3RhdGlvbklzVmFsaWRDb250YWluZXIoamR0QW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQlTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSA9IHRoaXMuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZShqZHRBbm5vdGF0aW9uTmFtZSk7Ci0JCQlBbm5vdGF0aW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBBbm5vdGF0aW9uQ29udGFpbmVyKCk7Ci0JCQljb250YWluZXIuaW5pdGlhbGl6ZUZyb21Db250YWluZXJBbm5vdGF0aW9uKGpkdEFubm90YXRpb24pOwotCQkJdGhpcy5hbm5vdGF0aW9uQ29udGFpbmVycy5wdXQobmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgY29udGFpbmVyKTsKLQkJfQotCQllbHNlIGlmICh0aGlzLmFubm90YXRpb25Jc1ZhbGlkKGpkdEFubm90YXRpb25OYW1lKSkgewotCQkJdGhpcy5hbm5vdGF0aW9ucy5wdXQoamR0QW5ub3RhdGlvbk5hbWUsIHRoaXMuYnVpbGRBbm5vdGF0aW9uKGpkdEFubm90YXRpb24pKTsKLQkJfQotCQllbHNlIGlmICh0aGlzLmFubm90YXRpb25Jc1ZhbGlkTmVzdGFibGUoamR0QW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkvLyBpZiB3ZSBhbHJlYWR5IGhhdmUgYW4gYW5ub3RhdGlvbiBjb250YWluZXIgKGJlY2F1c2UgdGhlcmUgd2FzIGEgY29udGFpbmVyIGFubm90YXRpb24pCi0JCQkvLyBpZ25vcmUgdGhlIHN0YW5kYWxvbmUgbmVzdGFibGUgYW5ub3RhdGlvbgotCQkJaWYgKHRoaXMuYW5ub3RhdGlvbkNvbnRhaW5lcnMuZ2V0KGpkdEFubm90YXRpb25OYW1lKSA9PSBudWxsKSB7Ci0JCQkJQW5ub3RhdGlvbkNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgQW5ub3RhdGlvbkNvbnRhaW5lcigpOwotCQkJCWNvbnRhaW5lci5pbml0aWFsaXplRnJvbVN0YW5kYWxvbmVBbm5vdGF0aW9uKGpkdEFubm90YXRpb24pOwotCQkJCXRoaXMuYW5ub3RhdGlvbkNvbnRhaW5lcnMucHV0KGpkdEFubm90YXRpb25OYW1lLCBjb250YWluZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFubm90YXRpb25Jc1ZhbGlkKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuZ2V0QW5ub3RhdGlvbk5hbWVzKCksIGFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYW5ub3RhdGlvbklzVmFsaWRDb250YWluZXIoU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS5nZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZXMoKSwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhbm5vdGF0aW9uSXNWYWxpZE5lc3RhYmxlKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZXMoKSwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZUFubm90YXRpb25zKCk7Ci0JfQotCi0JLy8gVE9ETwotCXByaXZhdGUgdm9pZCB1cGRhdGVBbm5vdGF0aW9ucygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFubm90YXRpb25zICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxBbm5vdGF0aW9uPiBnZXRBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxBbm5vdGF0aW9uPih0aGlzLmFubm90YXRpb25zLnZhbHVlcygpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEFubm90YXRpb25zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbnMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRpb25zLmdldChhbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gZ2V0Tm9uTnVsbEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uTmFtZSk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiAhPSBudWxsKSA/IGFubm90YXRpb24gOiB0aGlzLmdldE51bGxBbm5vdGF0aW9uKGFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb24gZ2V0TnVsbEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5udWxsQW5ub3RhdGlvbnNDYWNoZSkgewotCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5udWxsQW5ub3RhdGlvbnNDYWNoZS5nZXQoYW5ub3RhdGlvbk5hbWUpOwotCQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgewotCQkJCWFubm90YXRpb24gPSB0aGlzLmJ1aWxkTnVsbEFubm90YXRpb24oYW5ub3RhdGlvbk5hbWUpOwotCQkJCXRoaXMubnVsbEFubm90YXRpb25zQ2FjaGUucHV0KGFubm90YXRpb25OYW1lLCBhbm5vdGF0aW9uKTsKLQkJCX0KLQkJCXJldHVybiBhbm5vdGF0aW9uOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldEFubm90YXRpb25Qcm92aWRlcigpLmJ1aWxkTnVsbEFubm90YXRpb24odGhpcywgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gdGhpcy5nZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS5idWlsZEFubm90YXRpb24odGhpcywgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbWJpbmF0aW9uIGFubm90YXRpb25zICoqKioqKioqKioKLQotCXByaXZhdGUgSXRlcmFibGU8TmVzdGFibGVBbm5vdGF0aW9uPiBnZXROZXN0YWJsZUFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbj4odGhpcy5nZXROZXN0YWJsZUFubm90YXRpb25MaXN0cygpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbj4+IGdldE5lc3RhYmxlQW5ub3RhdGlvbkxpc3RzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8QW5ub3RhdGlvbkNvbnRhaW5lciwgSXRlcmFibGU8TmVzdGFibGVBbm5vdGF0aW9uPj4odGhpcy5nZXRBbm5vdGF0aW9uQ29udGFpbmVycygpLCBBTk5PVEFUSU9OX0NPTlRBSU5FUl9ORVNURURfQU5OT1RBVElPTlNfVFJBTlNGT1JNRVIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zZm9ybWVyPEFubm90YXRpb25Db250YWluZXIsIEl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbj4+IEFOTk9UQVRJT05fQ09OVEFJTkVSX05FU1RFRF9BTk5PVEFUSU9OU19UUkFOU0ZPUk1FUiA9IG5ldyBBbm5vdGF0aW9uQ29udGFpbmVyTmVzdGVkQW5ub3RhdGlvbnNUcmFuc2Zvcm1lcigpOwotCXN0YXRpYyBmaW5hbCBjbGFzcyBBbm5vdGF0aW9uQ29udGFpbmVyTmVzdGVkQW5ub3RhdGlvbnNUcmFuc2Zvcm1lcgotCQlleHRlbmRzIFRyYW5zZm9ybWVyQWRhcHRlcjxBbm5vdGF0aW9uQ29udGFpbmVyLCBJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+PgotCXsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+IHRyYW5zZm9ybShBbm5vdGF0aW9uQ29udGFpbmVyIGNvbnRhaW5lcikgewotCQkJcmV0dXJuIGNvbnRhaW5lci5nZXROZXN0ZWRBbm5vdGF0aW9ucygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxBbm5vdGF0aW9uQ29udGFpbmVyPiBnZXRBbm5vdGF0aW9uQ29udGFpbmVycygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxBbm5vdGF0aW9uQ29udGFpbmVyPih0aGlzLmFubm90YXRpb25Db250YWluZXJzLnZhbHVlcygpKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbj4gZ2V0QW5ub3RhdGlvbnMoU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpIHsKLQkJQW5ub3RhdGlvbkNvbnRhaW5lciBjb250YWluZXIgPSB0aGlzLmFubm90YXRpb25Db250YWluZXJzLmdldChuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQkJcmV0dXJuIChjb250YWluZXIgIT0gbnVsbCkgPyBjb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbnMoKSA6IEVtcHR5TGlzdEl0ZXJhYmxlLjxOZXN0YWJsZUFubm90YXRpb24+IGluc3RhbmNlKCk7Ci0JfQotCi0KLQlwdWJsaWMgaW50IGdldEFubm90YXRpb25zU2l6ZShTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSkgewotCQlBbm5vdGF0aW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IHRoaXMuYW5ub3RhdGlvbkNvbnRhaW5lcnMuZ2V0KG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOwotCQlyZXR1cm4gKGNvbnRhaW5lciA9PSBudWxsKSA/IDAgOiBjb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbnNTaXplKCk7Ci0JfQotCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKGludCBpbmRleCwgU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpIHsKLQkJQW5ub3RhdGlvbkNvbnRhaW5lciBjb250YWluZXIgPSB0aGlzLmFubm90YXRpb25Db250YWluZXJzLmdldChuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQkJcmV0dXJuIChjb250YWluZXIgPT0gbnVsbCkgPyBudWxsIDogY29udGFpbmVyLmdldE5lc3RlZEFubm90YXRpb24oaW5kZXgpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8QW5ub3RhdGlvbj4gZ2V0Q29udGFpbmVyT3JTdGFuZGFsb25lTmVzdGFibGVBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEFubm90YXRpb25Db250YWluZXIsIEFubm90YXRpb24+KHRoaXMuZ2V0QW5ub3RhdGlvbkNvbnRhaW5lcnMoKSwgVE9QX0xFVkVMX0FOTk9UQVRJT05fQ09OVEFJTkVSX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lcjxBbm5vdGF0aW9uQ29udGFpbmVyLCBBbm5vdGF0aW9uPiBUT1BfTEVWRUxfQU5OT1RBVElPTl9DT05UQUlORVJfVFJBTlNGT1JNRVIgPSBuZXcgVG9wTGV2ZWxBbm5vdGF0aW9uQ29udGFpbmVyVHJhbnNmb3JtZXIoKTsKLQkvKiBDVSBwcml2YXRlICovIHN0YXRpYyBmaW5hbCBjbGFzcyBUb3BMZXZlbEFubm90YXRpb25Db250YWluZXJUcmFuc2Zvcm1lcgotCQlleHRlbmRzIFRyYW5zZm9ybWVyQWRhcHRlcjxBbm5vdGF0aW9uQ29udGFpbmVyLCBBbm5vdGF0aW9uPgotCXsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBbm5vdGF0aW9uIHRyYW5zZm9ybShBbm5vdGF0aW9uQ29udGFpbmVyIGNvbnRhaW5lcikgewotCQkJQW5ub3RhdGlvbiBjb250YWluZXJBbm5vdGF0aW9uID0gY29udGFpbmVyLmdldENvbnRhaW5lckFubm90YXRpb24oKTsKLQkJCXJldHVybiAoY29udGFpbmVyQW5ub3RhdGlvbiAhPSBudWxsKSA/IGNvbnRhaW5lckFubm90YXRpb24gOiBjb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbigwKTsKLQkJfQotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuYnVpbGRBbm5vdGF0aW9uKHRoaXMsIGpkdEFubm90YXRpb24sIGluZGV4KTsKLQl9Ci0KLQotCS8vICoqKioqIGFsbCBhbm5vdGF0aW9ucyAqKioqKgotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPEFubm90YXRpb24+IGdldFRvcExldmVsQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8QW5ub3RhdGlvbj4oCi0JCQkJCXRoaXMuZ2V0QW5ub3RhdGlvbnMoKSwKLQkJCQkJdGhpcy5nZXRDb250YWluZXJPclN0YW5kYWxvbmVOZXN0YWJsZUFubm90YXRpb25zKCkKLQkJCQkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGVkKCkgewotCQlyZXR1cm4gISB0aGlzLmlzVW5hbm5vdGF0ZWQoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNVbmFubm90YXRlZCgpIHsKLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbnMuaXNFbXB0eSgpICYmIHRoaXMuYW5ub3RhdGlvbkNvbnRhaW5lcnMuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGVkV2l0aEFueU9mKEl0ZXJhYmxlPFN0cmluZz4gYW5ub3RhdGlvbk5hbWVzKSB7Ci0JCWZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogdGhpcy5nZXRTaWduaWZpY2FudEFubm90YXRpb25zKCkpIHsKLQkJCWlmIChDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYW5ub3RhdGlvbk5hbWVzLCBhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgInNpZ25pZmljYW50IiBhbm5vdGF0aW9uczsKLQkgKiBpLmUuIGlnbm9yZSB0aGUgY29udGFpbmVyIGFubm90YXRpb25zICh0aGV5IGhhdmUgbm8gc2VtYW50aWNzKS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEl0ZXJhYmxlPEFubm90YXRpb24+IGdldFNpZ25pZmljYW50QW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8QW5ub3RhdGlvbj4oCi0JCQkJCXRoaXMuZ2V0QW5ub3RhdGlvbnMoKSwKLQkJCQkJdGhpcy5nZXROZXN0YWJsZUFubm90YXRpb25zKCkKLQkJCQkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBbm5vdGF0aW9uUHJvdmlkZXIgZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBJQW5ub3RhdGlvbltdIGdldEpkdEFubm90YXRpb25zKCkgewotCQl0cnkgewotCQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRBbm5vdGF0aW9ucygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBFTVBUWV9KRFRfQU5OT1RBVElPTl9BUlJBWTsKLQkJfQotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJQW5ub3RhdGlvbltdIEVNUFRZX0pEVF9BTk5PVEFUSU9OX0FSUkFZID0gbmV3IElBbm5vdGF0aW9uWzBdOwotCi0KLQkvLyAqKioqKioqKioqIElKYXZhRWxlbWVudCBhZGFwdGVyICoqKioqKioqKioKLQotCWludGVyZmFjZSBBZGFwdGVyIHsKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgYWRhcHRlcidzIEpEVCBlbGVtZW50IChJUGFja2FnZUZyYWdtZW50LCBJVHlwZSwgSUZpZWxkLCBJTWV0aG9kKS4KLQkJICovCi0JCUlKYXZhRWxlbWVudCBnZXRFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgYWRhcHRlcidzIGVsZW1lbnQncyBKRFQgYW5ub3RhdGlvbnMuCi0JCSAqLwotCQlJQW5ub3RhdGlvbltdIGdldEFubm90YXRpb25zKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdW5zdXBwb3J0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oaW50IGluZGV4LCBTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihpbnQgaW5kZXgsIFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyBzdGF0aWMgZmluYWwgSU1lbWJlclZhbHVlUGFpcltdIEVNUFRZX01FTUJFUl9WQUxVRV9QQUlSX0FSUkFZID0gbmV3IElNZW1iZXJWYWx1ZVBhaXJbMF07Ci0JLyogQ1UgcHJpdmF0ZSAqLyBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfT0JKRUNUX0FSUkFZID0gbmV3IE9iamVjdFswXTsKLQotCi0JLy8gKioqKioqKioqKiBhbm5vdGF0aW9uIGNvbnRhaW5lciAqKioqKioqKioqCi0KLQkvKiBDVSBwcml2YXRlICovIGNsYXNzIEFubm90YXRpb25Db250YWluZXIgewotCi0JCXByaXZhdGUgQW5ub3RhdGlvbiBjb250YWluZXJBbm5vdGF0aW9uOwotCi0JCXByaXZhdGUgZmluYWwgVmVjdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gbmVzdGVkQW5ub3RhdGlvbnMgPSBuZXcgVmVjdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4oKTsKLQotCQlBbm5vdGF0aW9uQ29udGFpbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXZvaWQgaW5pdGlhbGl6ZUZyb21Db250YWluZXJBbm5vdGF0aW9uKElBbm5vdGF0aW9uIGpkdENvbnRhaW5lckFubm90YXRpb24pIHsKLQkJCXRoaXMuaW5pdGlhbGl6ZU5lc3RlZEFubm90YXRpb25zKGpkdENvbnRhaW5lckFubm90YXRpb24pOwotCQkJdGhpcy5jb250YWluZXJBbm5vdGF0aW9uID0gQmluYXJ5QW5ub3RhdGVkRWxlbWVudC50aGlzLmJ1aWxkQW5ub3RhdGlvbihqZHRDb250YWluZXJBbm5vdGF0aW9uKTsKLQkJfQotCi0JCXZvaWQgaW5pdGlhbGl6ZU5lc3RlZEFubm90YXRpb25zKElBbm5vdGF0aW9uIGpkdENvbnRhaW5lckFubm90YXRpb24pIHsKLQkJCU9iamVjdFtdIGpkdE5lc3RlZEFubm90YXRpb25zID0gdGhpcy5nZXRKZHROZXN0ZWRBbm5vdGF0aW9ucyhqZHRDb250YWluZXJBbm5vdGF0aW9uKTsKLQkJCWludCBsZW4gPSBqZHROZXN0ZWRBbm5vdGF0aW9ucy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJSUFubm90YXRpb24gamR0TmVzdGVkQW5ub3RhdGlvbiA9IChJQW5ub3RhdGlvbikgamR0TmVzdGVkQW5ub3RhdGlvbnNbaV07Ci0JCQkJdGhpcy5hZGRBbm5vdGF0aW9uKGpkdE5lc3RlZEFubm90YXRpb24sIGkpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBPYmplY3RbXSBnZXRKZHROZXN0ZWRBbm5vdGF0aW9ucyhJQW5ub3RhdGlvbiBqZHRDb250YWluZXJBbm5vdGF0aW9uKSB7Ci0JCQlyZXR1cm4gQmluYXJ5QW5ub3RhdGVkRWxlbWVudC50aGlzLmdldEpkdE1lbWJlclZhbHVlcyhqZHRDb250YWluZXJBbm5vdGF0aW9uLCAidmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdm9pZCBpbml0aWFsaXplRnJvbVN0YW5kYWxvbmVBbm5vdGF0aW9uKElBbm5vdGF0aW9uIGpkdE5lc3RhYmxlQW5ub3RhdGlvbikgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKGpkdE5lc3RhYmxlQW5ub3RhdGlvbiwgMCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkQW5ub3RhdGlvbihJQW5ub3RhdGlvbiBqZHROZXN0YWJsZUFubm90YXRpb24sIGludCBpbmRleCkgewotCQkJdGhpcy5uZXN0ZWRBbm5vdGF0aW9ucy5hZGQoQmluYXJ5QW5ub3RhdGVkRWxlbWVudC50aGlzLmJ1aWxkQW5ub3RhdGlvbihqZHROZXN0YWJsZUFubm90YXRpb24sIGluZGV4KSk7Ci0JCX0KLQotCQlBbm5vdGF0aW9uIGdldENvbnRhaW5lckFubm90YXRpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb250YWluZXJBbm5vdGF0aW9uOwotCQl9Ci0KLQkJTGlzdEl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbj4gZ2V0TmVzdGVkQW5ub3RhdGlvbnMoKSB7Ci0JCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+KHRoaXMubmVzdGVkQW5ub3RhdGlvbnMpOwotCQl9Ci0KLQkJaW50IGdldE5lc3RlZEFubm90YXRpb25zU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLm5lc3RlZEFubm90YXRpb25zLnNpemUoKTsKLQkJfQotCi0JCU5lc3RhYmxlQW5ub3RhdGlvbiBnZXROZXN0ZWRBbm5vdGF0aW9uKGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMubmVzdGVkQW5ub3RhdGlvbnMuZ2V0KGluZGV4KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUFubm90YXRpb24uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEzNDUzYy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotCi0vKioKLSAqIEpBUiBhbm5vdGF0aW9uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCaW5hcnlBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlOb2RlCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uCi17Ci0JZmluYWwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbjsKLQotCXByb3RlY3RlZCBCaW5hcnlBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuamR0QW5ub3RhdGlvbiA9IGpkdEFubm90YXRpb247Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWVzIG9mIHRoZSBKRFQgYW5ub3RhdGlvbidzIG1lbWJlciB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0SmR0TWVtYmVyVmFsdWVzKFN0cmluZyBtZW1iZXJOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldEpkdE1lbWJlclZhbHVlcyh0aGlzLmpkdEFubm90YXRpb24sIG1lbWJlck5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIEpEVCBhbm5vdGF0aW9uJ3MgbWVtYmVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0SmR0TWVtYmVyVmFsdWUoU3RyaW5nIG1lbWJlck5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUodGhpcy5qZHRBbm5vdGF0aW9uLCBtZW1iZXJOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gZ2V0QXN0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JcHVibGljIHZvaWQgbmV3QW5ub3RhdGlvbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIE5lc3RhYmxlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUF0dHJpYnV0ZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZGVhZTguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIGJpbmFyeSBhdHRyaWJ1dGUgKGZpZWxkIG9yIHByb3BlcnR5KQotICovCi1hYnN0cmFjdCBjbGFzcyBCaW5hcnlBdHRyaWJ1dGUKLQlleHRlbmRzIEJpbmFyeU1lbWJlcgotCWltcGxlbWVudHMgSmF2YVJlc291cmNlQXR0cmlidXRlCi17Ci0JcHJpdmF0ZSBpbnQgbW9kaWZpZXJzOwotCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZU5hbWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdHlwZUlzSW50ZXJmYWNlOwotCi0JcHJpdmF0ZSBib29sZWFuIHR5cGVJc0VudW07Ci0KLQlwcml2YXRlIGJvb2xlYW4gdHlwZUlzQXJyYXk7Ci0JCi0JcHJpdmF0ZSBpbnQgdHlwZUFycmF5RGltZW5zaW9uYWxpdHk7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWU7Ci0KLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxTdHJpbmc+IHR5cGVTdXBlcmNsYXNzTmFtZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQotCXByaXZhdGUgZmluYWwgVmVjdG9yPFN0cmluZz4gdHlwZUludGVyZmFjZU5hbWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0KLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxTdHJpbmc+IHR5cGVUeXBlQXJndW1lbnROYW1lcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCi0KLQlwcm90ZWN0ZWQgQmluYXJ5QXR0cmlidXRlKEphdmFSZXNvdXJjZVR5cGUgcGFyZW50LCBBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBhZGFwdGVyKTsKLQkJSU1lbWJlciBtZW1iZXIgPSBhZGFwdGVyLmdldEVsZW1lbnQoKTsKLQkJdGhpcy5tb2RpZmllcnMgPSB0aGlzLmJ1aWxkTW9kaWZpZXJzKG1lbWJlcik7Ci0JCQotCQlTdHJpbmcgdHlwZVNpZ25hdHVyZSA9IGdldFR5cGVTaWduYXR1cmUoKTsKLQkJSXRlcmFibGU8SVR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0gZ2V0QWRhcHRlcigpLmdldFR5cGVQYXJhbWV0ZXJzKCk7Ci0JCXRoaXMudHlwZU5hbWUgPSBidWlsZFR5cGVOYW1lKHR5cGVTaWduYXR1cmUsIHR5cGVQYXJhbWV0ZXJzKTsKLQkJdGhpcy50eXBlSXNBcnJheSA9IGJ1aWxkVHlwZUlzQXJyYXkodHlwZVNpZ25hdHVyZSk7Ci0JCXRoaXMudHlwZUFycmF5RGltZW5zaW9uYWxpdHkgPSBidWlsZFR5cGVBcnJheURpbWVuc2lvbmFsaXR5KHR5cGVTaWduYXR1cmUpOwotCQl0aGlzLnR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lID0gYnVpbGRUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZSh0eXBlU2lnbmF0dXJlLCB0eXBlUGFyYW1ldGVycyk7Ci0JCXRoaXMudHlwZVR5cGVBcmd1bWVudE5hbWVzLmFkZEFsbChidWlsZFR5cGVUeXBlQXJndW1lbnROYW1lcyh0eXBlU2lnbmF0dXJlLCB0eXBlUGFyYW1ldGVycykpOwotCQkKLQkJSVR5cGUgdHlwZSA9IHRoaXMuZ2V0VHlwZShtZW1iZXIuZ2V0SmF2YVByb2plY3QoKSk7Ci0JCS8vIGlmIHRoZSB0eXBlIGlzIGFuIGFycmF5LCB0aGVuIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSBmYWxzZSBvciBlbXB0eQotCQl0aGlzLnR5cGVJc0ludGVyZmFjZSA9IHRoaXMuYnVpbGRUeXBlSXNJbnRlcmZhY2UodHlwZSk7Ci0JCXRoaXMudHlwZUlzRW51bSA9IHRoaXMuYnVpbGRUeXBlSXNFbnVtKHR5cGUpOwotCQl0aGlzLnR5cGVTdXBlcmNsYXNzTmFtZXMuYWRkQWxsKHRoaXMuYnVpbGRUeXBlU3VwZXJjbGFzc05hbWVzKHR5cGUpKTsKLQkJdGhpcy50eXBlSW50ZXJmYWNlTmFtZXMuYWRkQWxsKHRoaXMuYnVpbGRUeXBlSW50ZXJmYWNlTmFtZXModHlwZSkpOwotCX0KLQotCS8vICoqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJCi0JCVN0cmluZyB0eXBlU2lnbmF0dXJlID0gZ2V0VHlwZVNpZ25hdHVyZSgpOwotCQlJdGVyYWJsZTxJVHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSBnZXRBZGFwdGVyKCkuZ2V0VHlwZVBhcmFtZXRlcnMoKTsKLQkJc2V0VHlwZU5hbWUoYnVpbGRUeXBlTmFtZSh0eXBlU2lnbmF0dXJlLCB0eXBlUGFyYW1ldGVycykpOwotCQlzZXRUeXBlSXNBcnJheShidWlsZFR5cGVJc0FycmF5KHR5cGVTaWduYXR1cmUpKTsKLQkJc2V0VHlwZUFycmF5RGltZW5zaW9uYWxpdHkoYnVpbGRUeXBlQXJyYXlEaW1lbnNpb25hbGl0eSh0eXBlU2lnbmF0dXJlKSk7Ci0JCXNldFR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lKGJ1aWxkVHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUodHlwZVNpZ25hdHVyZSwgdHlwZVBhcmFtZXRlcnMpKTsKLQkJc2V0VHlwZVR5cGVBcmd1bWVudE5hbWVzKGJ1aWxkVHlwZVR5cGVBcmd1bWVudE5hbWVzKHR5cGVTaWduYXR1cmUsIHR5cGVQYXJhbWV0ZXJzKSk7Ci0JfQotCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKElNZW1iZXIgbWVtYmVyKSB7Ci0JCXN1cGVyLnVwZGF0ZShtZW1iZXIpOwotCQl0aGlzLnNldE1vZGlmaWVycyh0aGlzLmJ1aWxkTW9kaWZpZXJzKG1lbWJlcikpOwotCQkKLQkJSVR5cGUgdHlwZSA9IHRoaXMuZ2V0VHlwZShtZW1iZXIuZ2V0SmF2YVByb2plY3QoKSk7ICAvLyBpZiB0aGUgdHlwZSBpcyBhbiBhcnJheSwgdGhlbiB0aGUgZm9sbG93aW5nIHdpbGwgYmUgZmFsc2Ugb3IgZW1wdHkKLQkJdGhpcy5zZXRUeXBlSXNJbnRlcmZhY2UodGhpcy5idWlsZFR5cGVJc0ludGVyZmFjZSh0eXBlKSk7Ci0JCXRoaXMuc2V0VHlwZUlzRW51bSh0aGlzLmJ1aWxkVHlwZUlzRW51bSh0eXBlKSk7Ci0JCXRoaXMuc2V0VHlwZVN1cGVyY2xhc3NOYW1lcyh0aGlzLmJ1aWxkVHlwZVN1cGVyY2xhc3NOYW1lcyh0eXBlKSk7Ci0JCXRoaXMuc2V0VHlwZUludGVyZmFjZU5hbWVzKHRoaXMuYnVpbGRUeXBlSW50ZXJmYWNlTmFtZXModHlwZSkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQmluYXJ5UGVyc2lzdGVudE1lbWJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBBZGFwdGVyIGdldEFkYXB0ZXIoKSB7Ci0JCXJldHVybiAoQWRhcHRlcikgdGhpcy5hZGFwdGVyOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIEphdmFSZXNvdXJjZUF0dHJpYnV0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFSZXNvdXJjZVR5cGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFSZXNvdXJjZVR5cGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBZGFwdGVyKCkuZ2V0QXR0cmlidXRlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHR5cGVJc1N1YlR5cGVPZihTdHJpbmcgdG4pIHsKLQkJcmV0dXJuICgodGhpcy50eXBlTmFtZSAhPSBudWxsKSAmJiB0aGlzLnR5cGVOYW1lLmVxdWFscyh0bikpCi0JCQkJfHwgdGhpcy50eXBlSW50ZXJmYWNlTmFtZXMuY29udGFpbnModG4pCi0JCQkJfHwgdGhpcy50eXBlU3VwZXJjbGFzc05hbWVzLmNvbnRhaW5zKHRuKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0eXBlSXNWYXJpYWJsZVByaW1pdGl2ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnR5cGVOYW1lICE9IG51bGwpICYmIENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlKHRoaXMudHlwZU5hbWUpOwotCX0KLQotCS8vICoqKioqIG1vZGlmaWVycwotCXB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgewotCQlyZXR1cm4gdGhpcy5tb2RpZmllcnM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE1vZGlmaWVycyhpbnQgbW9kaWZpZXJzKSB7Ci0JCWludCBvbGQgPSB0aGlzLm1vZGlmaWVyczsKLQkJdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNT0RJRklFUlNfUFJPUEVSVFksIG9sZCwgbW9kaWZpZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiB6ZXJvIHNlZW1zIGxpa2UgYSByZWFzb25hYmxlIGRlZmF1bHQuLi4KLQkgKi8KLQlwcml2YXRlIGludCBidWlsZE1vZGlmaWVycyhJTWVtYmVyIG1lbWJlcikgewotCQl0cnkgewotCQkJcmV0dXJuIG1lbWJlci5nZXRGbGFncygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JLy8gKioqKiogdHlwZSBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZU5hbWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFR5cGVOYW1lKFN0cmluZyB0eXBlTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy50eXBlTmFtZTsKLQkJdGhpcy50eXBlTmFtZSA9IHR5cGVOYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9OQU1FX1BST1BFUlRZLCBvbGQsIHR5cGVOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUeXBlTmFtZShTdHJpbmcgdHlwZVNpZ25hdHVyZSwgSXRlcmFibGU8SVR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKSB7Ci0JCXJldHVybiBjb252ZXJ0VHlwZVNpZ25hdHVyZVRvVHlwZU5hbWUodHlwZVNpZ25hdHVyZSwgdHlwZVBhcmFtZXRlcnMpOwotCX0KLQotCS8vICoqKioqIHR5cGUgaXMgaW50ZXJmYWNlCi0JcHVibGljIGJvb2xlYW4gdHlwZUlzSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gdGhpcy50eXBlSXNJbnRlcmZhY2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFR5cGVJc0ludGVyZmFjZShib29sZWFuIHR5cGVJc0ludGVyZmFjZSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMudHlwZUlzSW50ZXJmYWNlOwotCQl0aGlzLnR5cGVJc0ludGVyZmFjZSA9IHR5cGVJc0ludGVyZmFjZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRZUEVfSVNfSU5URVJGQUNFX1BST1BFUlRZLCBvbGQsIHR5cGVJc0ludGVyZmFjZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkVHlwZUlzSW50ZXJmYWNlKElUeXBlIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAodHlwZSAhPSBudWxsKSAmJiB0eXBlLmlzSW50ZXJmYWNlKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLy8gKioqKiogdHlwZSBpcyBlbnVtCi0JcHVibGljIGJvb2xlYW4gdHlwZUlzRW51bSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZUlzRW51bTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VHlwZUlzRW51bShib29sZWFuIHR5cGVJc0VudW0pIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLnR5cGVJc0VudW07Ci0JCXRoaXMudHlwZUlzRW51bSA9IHR5cGVJc0VudW07Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX0lTX0VOVU1fUFJPUEVSVFksIG9sZCwgdHlwZUlzRW51bSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkVHlwZUlzRW51bShJVHlwZSB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKHR5cGUgIT0gbnVsbCkgJiYgdHlwZS5pc0VudW0oKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKiB0eXBlIGlzIGFycmF5Ci0JcHVibGljIGJvb2xlYW4gdHlwZUlzQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVJc0FycmF5OwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUeXBlSXNBcnJheShib29sZWFuIHR5cGVJc0FycmF5KSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy50eXBlSXNBcnJheTsKLQkJdGhpcy50eXBlSXNBcnJheSA9IHR5cGVJc0FycmF5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9JU19BUlJBWV9QUk9QRVJUWSwgb2xkLCB0eXBlSXNBcnJheSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkVHlwZUlzQXJyYXkoU3RyaW5nIHR5cGVTaWduYXR1cmUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlSXNBcnJheSh0eXBlU2lnbmF0dXJlKTsKLQl9Ci0JCi0JLy8gKioqKiogdHlwZSBhcnJheSBkaW1lbnNpb25hbGl0eQotCXB1YmxpYyBpbnQgZ2V0VHlwZUFycmF5RGltZW5zaW9uYWxpdHkoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVBcnJheURpbWVuc2lvbmFsaXR5OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VHlwZUFycmF5RGltZW5zaW9uYWxpdHkoaW50IHR5cGVBcnJheURpbWVuc2lvbmFsaXR5KSB7Ci0JCWludCBvbGQgPSB0aGlzLnR5cGVBcnJheURpbWVuc2lvbmFsaXR5OwotCQl0aGlzLnR5cGVBcnJheURpbWVuc2lvbmFsaXR5ID0gdHlwZUFycmF5RGltZW5zaW9uYWxpdHk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9BUlJBWV9ESU1FTlNJT05BTElUWV9QUk9QRVJUWSwgb2xkLCB0eXBlQXJyYXlEaW1lbnNpb25hbGl0eSk7Ci0JfQotCQotCXByaXZhdGUgaW50IGJ1aWxkVHlwZUFycmF5RGltZW5zaW9uYWxpdHkoU3RyaW5nIHR5cGVTaWduYXR1cmUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlQXJyYXlEaW1lbnNpb25hbGl0eSh0eXBlU2lnbmF0dXJlKTsKLSAJfQotCQotCS8vICoqKioqIHR5cGUgYXJyYXkgY29tcG9uZW50IHR5cGUgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUoU3RyaW5nIHR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lOwotCQl0aGlzLnR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lID0gdHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9BUlJBWV9DT01QT05FTlRfVFlQRV9OQU1FX1BST1BFUlRZLCBvbGQsIHR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZShTdHJpbmcgdHlwZVNpZ25hdHVyZSwgSXRlcmFibGU8SVR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKSB7Ci0JCWludCBhcnJheURpbWVuc2lvbmFsaXR5ID0gY29udmVydFR5cGVTaWduYXR1cmVUb1R5cGVBcnJheURpbWVuc2lvbmFsaXR5KHR5cGVTaWduYXR1cmUpOwotCQlyZXR1cm4gKGFycmF5RGltZW5zaW9uYWxpdHkgPT0gMCkgPyBudWxsIDogY29udmVydFR5cGVTaWduYXR1cmVUb1R5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lKHR5cGVTaWduYXR1cmUsIHR5cGVQYXJhbWV0ZXJzKTsKLSAJfQotCi0JLy8gKioqKiogdHlwZSBzdXBlcmNsYXNzIGhpZXJhcmNoeQotCXB1YmxpYyBMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRUeXBlU3VwZXJjbGFzc05hbWVzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxTdHJpbmc+KHRoaXMudHlwZVN1cGVyY2xhc3NOYW1lcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdHlwZVN1cGVyY2xhc3NOYW1lc0NvbnRhaW5zKFN0cmluZyBzdXBlcmNsYXNzTmFtZSkgewotCQlyZXR1cm4gdGhpcy50eXBlU3VwZXJjbGFzc05hbWVzLmNvbnRhaW5zKHN1cGVyY2xhc3NOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VHlwZVN1cGVyY2xhc3NOYW1lcyhMaXN0PFN0cmluZz4gdHlwZVN1cGVyY2xhc3NOYW1lcykgewotCQl0aGlzLnN5bmNocm9uaXplTGlzdCh0eXBlU3VwZXJjbGFzc05hbWVzLCB0aGlzLnR5cGVTdXBlcmNsYXNzTmFtZXMsIFRZUEVfU1VQRVJDTEFTU19OQU1FU19MSVNUKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFR5cGVTdXBlcmNsYXNzTmFtZXMoSVR5cGUgdHlwZSkgewotCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQotCQlBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0eXBlID0gdGhpcy5maW5kU3VwZXJjbGFzcyh0eXBlKTsKLQkJd2hpbGUgKHR5cGUgIT0gbnVsbCkgewotCQkJbmFtZXMuYWRkKHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpOyAgLy8gbm8gcGFyYW1ldGVycyBhcmUgaW5jbHVkZWQgaGVyZQotCQkJdHlwZSA9IHRoaXMuZmluZFN1cGVyY2xhc3ModHlwZSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCS8vICoqKioqIHR5cGUgaW50ZXJmYWNlIGhpZXJhcmNoeQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFR5cGVJbnRlcmZhY2VOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxTdHJpbmc+KHRoaXMudHlwZUludGVyZmFjZU5hbWVzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0eXBlSW50ZXJmYWNlTmFtZXNDb250YWlucyhTdHJpbmcgaW50ZXJmYWNlTmFtZSkgewotCQlyZXR1cm4gdGhpcy50eXBlSW50ZXJmYWNlTmFtZXMuY29udGFpbnMoaW50ZXJmYWNlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFR5cGVJbnRlcmZhY2VOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUludGVyZmFjZU5hbWVzKSB7Ci0JCXRoaXMuc3luY2hyb25pemVDb2xsZWN0aW9uKHR5cGVJbnRlcmZhY2VOYW1lcywgdGhpcy50eXBlSW50ZXJmYWNlTmFtZXMsIFRZUEVfSU5URVJGQUNFX05BTUVTX0NPTExFQ1RJT04pOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkVHlwZUludGVyZmFjZU5hbWVzKElUeXBlIHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0JCX0KLQotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCXdoaWxlICh0eXBlICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkSW50ZXJmYWNlTmFtZXNUbyh0eXBlLCBuYW1lcyk7Ci0JCQl0eXBlID0gdGhpcy5maW5kU3VwZXJjbGFzcyh0eXBlKTsKLQkJfQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEludGVyZmFjZU5hbWVzVG8oSVR5cGUgdHlwZSwgSGFzaFNldDxTdHJpbmc+IG5hbWVzKSB7Ci0JCWZvciAoU3RyaW5nIGludGVyZmFjZVNpZ25hdHVyZSA6IHRoaXMuZ2V0U3VwZXJJbnRlcmZhY2VUeXBlU2lnbmF0dXJlcyh0eXBlKSkgewotCQkJU3RyaW5nIGludGVyZmFjZU5hbWUgPSBjb252ZXJ0VHlwZVNpZ25hdHVyZVRvVHlwZU5hbWUoaW50ZXJmYWNlU2lnbmF0dXJlKTsKLQkJCW5hbWVzLmFkZChpbnRlcmZhY2VOYW1lKTsKLQkJCUlUeXBlIGludGVyZmFjZVR5cGUgPSB0aGlzLmZpbmRUeXBlKGludGVyZmFjZU5hbWUsIHR5cGUuZ2V0SmF2YVByb2plY3QoKSk7Ci0JCQlpZiAoaW50ZXJmYWNlVHlwZSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5hZGRJbnRlcmZhY2VOYW1lc1RvKGludGVyZmFjZVR5cGUsIG5hbWVzKTsgIC8vIHJlY3Vyc2UKLQkJCX0KLQkJfQotCX0KLQotCS8vICoqKioqIHR5cGUgdHlwZSBhcmd1bWVudCBuYW1lcwotCXB1YmxpYyBMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRUeXBlVHlwZUFyZ3VtZW50TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFN0cmluZz4odGhpcy50eXBlVHlwZUFyZ3VtZW50TmFtZXMpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZVR5cGVBcmd1bWVudE5hbWVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZVR5cGVBcmd1bWVudE5hbWVzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVUeXBlQXJndW1lbnROYW1lKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy50eXBlVHlwZUFyZ3VtZW50TmFtZXMuZ2V0KGluZGV4KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VHlwZVR5cGVBcmd1bWVudE5hbWVzKExpc3Q8U3RyaW5nPiB0eXBlVHlwZUFyZ3VtZW50TmFtZXMpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZUxpc3QodHlwZVR5cGVBcmd1bWVudE5hbWVzLCB0aGlzLnR5cGVUeXBlQXJndW1lbnROYW1lcywgVFlQRV9UWVBFX0FSR1VNRU5UX05BTUVTX0xJU1QpOwotCX0KLQkKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFR5cGVUeXBlQXJndW1lbnROYW1lcyhTdHJpbmcgdHlwZVNpZ25hdHVyZSwgSXRlcmFibGU8SVR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKSB7Ci0JCWludCBhcnJheURpbWVuc2lvbmFsaXR5ID0gY29udmVydFR5cGVTaWduYXR1cmVUb1R5cGVBcnJheURpbWVuc2lvbmFsaXR5KHR5cGVTaWduYXR1cmUpOwotCQlyZXR1cm4gKGFycmF5RGltZW5zaW9uYWxpdHkgIT0gMCkgPyBDb2xsZWN0aW9ucy48U3RyaW5nPmVtcHR5TGlzdCgpIDogY29udmVydFR5cGVTaWduYXR1cmVUb1R5cGVUeXBlQXJndW1lbnROYW1lcyh0eXBlU2lnbmF0dXJlLCB0eXBlUGFyYW1ldGVycyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCQotCXByaXZhdGUgU3RyaW5nIGdldFR5cGVTaWduYXR1cmUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRBZGFwdGVyKCkuZ2V0VHlwZVNpZ25hdHVyZSgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJVHlwZSBmaW5kU3VwZXJjbGFzcyhJVHlwZSB0eXBlKSB7Ci0JCXJldHVybiB0aGlzLmZpbmRUeXBlQnlTaWduYXR1cmUodGhpcy5nZXRTdXBlcmNsYXNzU2lnbmF0dXJlKHR5cGUpLCB0eXBlLmdldEphdmFQcm9qZWN0KCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN1cGVyY2xhc3NTaWduYXR1cmUoSVR5cGUgdHlwZSkgewotCQl0cnkgewotCQkJcmV0dXJuIHR5cGUuZ2V0U3VwZXJjbGFzc1R5cGVTaWduYXR1cmUoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0U3VwZXJJbnRlcmZhY2VUeXBlU2lnbmF0dXJlcyhJVHlwZSB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdHlwZS5nZXRTdXBlckludGVyZmFjZVR5cGVTaWduYXR1cmVzKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLkVNUFRZX1NUUklOR19BUlJBWTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVR5cGUgZmluZFR5cGVCeVNpZ25hdHVyZShTdHJpbmcgdHlwZVNpZ25hdHVyZSwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCXJldHVybiAodHlwZVNpZ25hdHVyZSA9PSBudWxsKSA/IG51bGwgOiBmaW5kVHlwZShjb252ZXJ0VHlwZVNpZ25hdHVyZVRvVHlwZU5hbWVfKHR5cGVTaWduYXR1cmUpLCBqYXZhUHJvamVjdCk7Ci0JfQotCi0JcHJpdmF0ZSBJVHlwZSBnZXRUeXBlKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlyZXR1cm4gKHRoaXMudHlwZU5hbWUgPT0gbnVsbCkgPyBudWxsIDogZmluZFR5cGUodGhpcy50eXBlTmFtZSwgamF2YVByb2plY3QpOwotCX0KLQotCXByaXZhdGUgc3RhdGljICBJVHlwZSBmaW5kVHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWROYW1lLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBqYXZhUHJvamVjdC5maW5kVHlwZShmdWxseVF1YWxpZmllZE5hbWUpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0KLQotCS8vICoqKioqKioqKiogYWRhcHRlcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRhcHQgYW4gSUZpZWxkIG9yIElNZXRob2QuCi0JICovCi0JaW50ZXJmYWNlIEFkYXB0ZXIKLQkJCWV4dGVuZHMgQmluYXJ5TWVtYmVyLkFkYXB0ZXIgewotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgZmllbGQgb3IgZ2V0dGVyIG1ldGhvZCdzICJhdHRyaWJ1dGUiIG5hbWUKLQkJICogKGUuZy4gZmllbGQgImZvbyIgLT4gImZvbyI7IG1ldGhvZCAiZ2V0Rm9vIiAtPiAiZm9vIikuCi0JCSAqLwotCQlTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpOwotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgYXR0cmlidXRlJ3MgdHlwZSBzaWduYXR1cmUuCi0JCSAqLwotCQlTdHJpbmcgZ2V0VHlwZVNpZ25hdHVyZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Q2xhc3NGaWxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlDbGFzc0ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0ZDAwOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlDbGFzc0ZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNsYXNzRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnQ7Ci0KLS8qKgotICogYmluYXJ5IGNsYXNzIGZpbGUKLSAqLwotZmluYWwgY2xhc3MgQmluYXJ5Q2xhc3NGaWxlCi0JZXh0ZW5kcyBCaW5hcnlOb2RlCi0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VDbGFzc0ZpbGUKLXsKLQkvKiogSkRUIGNsYXNzIGZpbGUgKi8KLQlwcml2YXRlIGZpbmFsIElDbGFzc0ZpbGUgY2xhc3NGaWxlOwotCi0JLyoqIGNsYXNzIGZpbGUncyB0eXBlICovCi0JcHJpdmF0ZSBmaW5hbCBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgdHlwZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIEpEVCB0eXBlIGdldHMgcGFzc2VkIGluIGJlY2F1c2UgdGhlIHBhY2thZ2UgZnJhZ21lbnQgaW5zcGVjdHMgaXQKLQkgKiBiZWZvcmVoYW5kIHRvIGRldGVybWluZSB3aGV0aGVyIGl0IGV4aXN0cyBhbmQgaXMgcmVsZXZhbnQuCi0JICovCi0JQmluYXJ5Q2xhc3NGaWxlKEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudCBwYXJlbnQsIElDbGFzc0ZpbGUgY2xhc3NGaWxlLCBJVHlwZSBqZHRUeXBlKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY2xhc3NGaWxlID0gY2xhc3NGaWxlOwotCQl0aGlzLnR5cGUgPSB0aGlzLmJ1aWxkVHlwZShqZHRUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBidWlsZFR5cGUoSVR5cGUgamR0VHlwZSkgewotCQl0cnkgewotCQkJaWYgKGpkdFR5cGUuaXNFbnVtKCkpIHsKLQkJCQlyZXR1cm4gbmV3IEJpbmFyeUVudW0odGhpcywgamR0VHlwZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gbmV3IEJpbmFyeVR5cGUodGhpcywgamR0VHlwZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5jbGFzc0ZpbGUuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmFSZXNvdXJjZUNsYXNzRmlsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGU7Ci0JfQotCi0JLy8gVE9ETwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0vLwkJdHlwZSh0aGlzLmNsYXNzRmlsZS5nZXRUeXBlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RW51bS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RW51bS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDE1MjRiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRW51bUNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7Ci0KLS8qKgotICogYmluYXJ5IGVudW0KLSAqLwotZmluYWwgY2xhc3MgQmluYXJ5RW51bQotCWV4dGVuZHMgQmluYXJ5QWJzdHJhY3RUeXBlCi0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VFbnVtCi17Ci0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8SmF2YVJlc291cmNlRW51bUNvbnN0YW50PiBlbnVtQ29uc3RhbnRzOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlCaW5hcnlFbnVtKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJVHlwZSB0eXBlKSB7Ci0JCXN1cGVyKHBhcmVudCwgdHlwZSk7Ci0JCXRoaXMuZW51bUNvbnN0YW50cyA9IHRoaXMuYnVpbGRFbnVtQ29uc3RhbnRzKCk7Ci0JfQotCi0JcHVibGljIEtpbmQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZC5FTlVNOwotCX0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZUVudW1Db25zdGFudHMoKTsKLQl9Ci0KLQkvLyBUT0RPCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUVudW1Db25zdGFudHMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCQotCQotCS8vICoqKioqKioqKiogSmF2YVJlc291cmNlRW51bSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQotCi0JLy8gKioqKioqKioqKiBlbnVtIGNvbnN0YW50cyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8SmF2YVJlc291cmNlRW51bUNvbnN0YW50PiBnZXRFbnVtQ29uc3RhbnRzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPEphdmFSZXNvdXJjZUVudW1Db25zdGFudD4odGhpcy5lbnVtQ29uc3RhbnRzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRW51bUNvbnN0YW50KEphdmFSZXNvdXJjZUVudW1Db25zdGFudCBlbnVtQ29uc3RhbnRzKSB7Ci0JCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihlbnVtQ29uc3RhbnRzLCB0aGlzLmVudW1Db25zdGFudHMsIEVOVU1TX0NPTExFQ1RJT04pOwotCX0KLQotCXByaXZhdGUgSmF2YVJlc291cmNlRW51bUNvbnN0YW50IGdldEVudW1Db25zdGFudChTdHJpbmcgZW51bUNvbnN0YW50TmFtZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQgZW51bUNvbnN0YW50IDogdGhpcy5nZXRFbnVtQ29uc3RhbnRzKCkpIHsKLQkJCWlmIChlbnVtQ29uc3RhbnQuaXNGb3IoZW51bUNvbnN0YW50TmFtZSwgb2NjdXJyZW5jZSkpIHsKLQkJCQlyZXR1cm4gZW51bUNvbnN0YW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVFbnVtQ29uc3RhbnRzKENvbGxlY3Rpb248SmF2YVJlc291cmNlRW51bUNvbnN0YW50PiByZW1vdmUpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKHJlbW92ZSwgdGhpcy5lbnVtQ29uc3RhbnRzLCBFTlVNU19DT0xMRUNUSU9OKTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQ+IGJ1aWxkRW51bUNvbnN0YW50cygpIHsKLQkJSXRlcmFibGU8SUZpZWxkPiBqZHRFbnVtQ29uc3RhbnRzID0gdGhpcy5nZXRFbnVtQ29uc3RhbnRzKHRoaXMuZ2V0TWVtYmVyKCkpOwotCQlWZWN0b3I8SmF2YVJlc291cmNlRW51bUNvbnN0YW50PiByZXN1bHQgPSBuZXcgVmVjdG9yPEphdmFSZXNvdXJjZUVudW1Db25zdGFudD4oQ29sbGVjdGlvblRvb2xzLnNpemUoamR0RW51bUNvbnN0YW50cykpOwotCQlmb3IgKElGaWVsZCBqZHRFbnVtQ29uc3RhbnQgOiBqZHRFbnVtQ29uc3RhbnRzKSB7Ci0JCQlyZXN1bHQuYWRkKHRoaXMuYnVpbGRFbnVtQ29uc3RhbnQoamR0RW51bUNvbnN0YW50KSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPElGaWVsZD4gZ2V0RW51bUNvbnN0YW50cyhJVHlwZSB0eXBlKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8SUZpZWxkPihDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5nZXRGaWVsZHModHlwZSkpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChJRmllbGQgamR0RmllbGQpIHsKLQkJCQlyZXR1cm4gaXNFbnVtQ29uc3RhbnQoamR0RmllbGQpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSUZpZWxkW10gZ2V0RmllbGRzKElUeXBlIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0eXBlLmdldEZpZWxkcygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBFTVBUWV9GSUVMRF9BUlJBWTsKLQkJfQotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmllbGRbXSBFTVBUWV9GSUVMRF9BUlJBWSA9IG5ldyBJRmllbGRbMF07Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbnVtQ29uc3RhbnQoSUZpZWxkIGZpZWxkKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmllbGQuaXNFbnVtQ29uc3RhbnQoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZUVudW1Db25zdGFudCBidWlsZEVudW1Db25zdGFudChJRmllbGQgamR0RW51bUNvbnN0YW50KSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RW51bUNvbnN0YW50KHRoaXMsIGpkdEVudW1Db25zdGFudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RW51bUNvbnN0YW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFbnVtQ29uc3RhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlMGMyNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFbnVtQ29uc3RhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRW51bUNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci0KLS8qKgotICogSmF2YSBiaW5hcnkgZW51bSBjb25zdGFudCwgSUZpZWxkIHRoYXQgcmV0dXJucyB0cnVlIHRvIGlzRW51bUNvbnN0YW50Ci0gKi8KLWZpbmFsIGNsYXNzIEJpbmFyeUVudW1Db25zdGFudAotCQlleHRlbmRzIEJpbmFyeU1lbWJlcgotCQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZUVudW1Db25zdGFudCB7Ci0JCi0JCi0JCi0JQmluYXJ5RW51bUNvbnN0YW50KEphdmFSZXNvdXJjZUVudW0gcGFyZW50LCBJRmllbGQgZW51bUNvbnN0YW50KXsKLQkJc3VwZXIocGFyZW50LCBuZXcgRW51bUNvbnN0YW50QWRhcHRlcihlbnVtQ29uc3RhbnQpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJRmllbGQgZ2V0TWVtYmVyKCkgewotCQlyZXR1cm4gKElGaWVsZCkgc3VwZXIuZ2V0TWVtYmVyKCk7Ci0JfQotCi0JLy8gKioqKioqKiogSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKgotCQotCXB1YmxpYyBLaW5kIGdldEtpbmQoKSB7Ci0JCXJldHVybiBLaW5kLkVOVU1fQ09OU1RBTlQ7Ci0JfQotCQotCQotCS8vICoqKioqKioqIEphdmFSZXNvdXJjZUVudW1Db25zdGFudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWVtYmVyKCkuZ2V0RWxlbWVudE5hbWUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBJRmllbGQgYWRhcHRlciAqKioqKioqKioqCi0KLQlzdGF0aWMgY2xhc3MgRW51bUNvbnN0YW50QWRhcHRlciAKLQkJCWltcGxlbWVudHMgQWRhcHRlciB7Ci0JCQotCQlwcml2YXRlIGZpbmFsIElGaWVsZCBlbnVtQ29uc3RhbnQ7Ci0JCQotCQlFbnVtQ29uc3RhbnRBZGFwdGVyKElGaWVsZCBlbnVtQ29uc3RhbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmVudW1Db25zdGFudCA9IGVudW1Db25zdGFudDsKLQkJfQotCQkKLQkJcHVibGljIElGaWVsZCBnZXRFbGVtZW50KCkgewotCQkJcmV0dXJuIHRoaXMuZW51bUNvbnN0YW50OwotCQl9Ci0JCQotCQlwdWJsaWMgSXRlcmFibGU8SVR5cGVQYXJhbWV0ZXI+IGdldFR5cGVQYXJhbWV0ZXJzKCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8SVR5cGVQYXJhbWV0ZXI+KHRoaXMuZW51bUNvbnN0YW50LmdldERlY2xhcmluZ1R5cGUoKS5nZXRUeXBlUGFyYW1ldGVycygpKTsKLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coam1lKTsKLQkJCX0KLQkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJQW5ub3RhdGlvbltdIGdldEFubm90YXRpb25zKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gdGhpcy5lbnVtQ29uc3RhbnQuZ2V0QW5ub3RhdGlvbnMoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUZpZWxkLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlGaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTIwNzE1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUZpZWxkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotCi0vKioKLSAqIGJpbmFyeSBmaWVsZAotICovCi1maW5hbCBjbGFzcyBCaW5hcnlGaWVsZAotCWV4dGVuZHMgQmluYXJ5QXR0cmlidXRlCi0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VGaWVsZAotewotCi0JQmluYXJ5RmllbGQoSmF2YVJlc291cmNlVHlwZSBwYXJlbnQsIElGaWVsZCBmaWVsZCkgewotCQlzdXBlcihwYXJlbnQsIG5ldyBGaWVsZEFkYXB0ZXIoZmllbGQpKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKiBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IGltcGxlbWVudGF0aW9uICoqKioqKioqCi0JCi0JcHVibGljIEtpbmQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIEtpbmQuRklFTEQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBhZGFwdGVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJRmllbGQgYWRhcHRlcgotCSAqLwotCXN0YXRpYyBjbGFzcyBGaWVsZEFkYXB0ZXIKLQkJCWltcGxlbWVudHMgQmluYXJ5QXR0cmlidXRlLkFkYXB0ZXIgewotCQkKLQkJZmluYWwgSUZpZWxkIGZpZWxkOwotCQkKLQkJRmllbGRBZGFwdGVyKElGaWVsZCBmaWVsZCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZmllbGQgPSBmaWVsZDsKLQkJfQotCQkKLQkJcHVibGljIElGaWVsZCBnZXRFbGVtZW50KCkgewotCQkJcmV0dXJuIHRoaXMuZmllbGQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJdGVyYWJsZTxJVHlwZVBhcmFtZXRlcj4gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxJVHlwZVBhcmFtZXRlcj4odGhpcy5maWVsZC5nZXREZWNsYXJpbmdUeXBlKCkuZ2V0VHlwZVBhcmFtZXRlcnMoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGptZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgSUFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9ucygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkJcmV0dXJuIHRoaXMuZmllbGQuZ2V0QW5ub3RhdGlvbnMoKTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuZmllbGQuZ2V0RWxlbWVudE5hbWUoKTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUeXBlU2lnbmF0dXJlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gdGhpcy5maWVsZC5nZXRUeXBlU2lnbmF0dXJlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlNZW1iZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU1lbWJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2IzOGY4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU1lbWJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLQotLyoqCi0gKiBiaW5hcnkgcGVyc2lzdGVudCBtZW1iZXIKLSAqLwotYWJzdHJhY3QgY2xhc3MgQmluYXJ5TWVtYmVyCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0ZWRFbGVtZW50Ci0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VNZW1iZXIKLXsKLQotCXByaXZhdGUgYm9vbGVhbiBmaW5hbF87ICAvLyAnZmluYWwnIGlzIGEgcmVzZXJ2ZWQgd29yZAotCXByaXZhdGUgYm9vbGVhbiB0cmFuc2llbnRfOyAgLy8gJ3RyYW5zaWVudCcgaXMgYSByZXNlcnZlZCB3b3JkCi0JcHJpdmF0ZSBib29sZWFuIHB1YmxpY187ICAvLyAncHVibGljJyBpcyBhIHJlc2VydmVkIHdvcmQKLQlwcml2YXRlIGJvb2xlYW4gc3RhdGljXzsgIC8vICdzdGF0aWMnIGlzIGEgcmVzZXJ2ZWQgd29yZAotCXByaXZhdGUgYm9vbGVhbiBwcm90ZWN0ZWRfOyAvLyAncHJvdGVjdGVkJyBpcyBhIHJlc2VydmVkIHdvcmQKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEJpbmFyeU1lbWJlcihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQWRhcHRlciBhZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgYWRhcHRlcik7Ci0JCUlNZW1iZXIgbWVtYmVyID0gYWRhcHRlci5nZXRFbGVtZW50KCk7Ci0JCXRoaXMuZmluYWxfID0gdGhpcy5idWlsZEZpbmFsKG1lbWJlcik7Ci0JCXRoaXMudHJhbnNpZW50XyA9IHRoaXMuYnVpbGRUcmFuc2llbnQobWVtYmVyKTsKLQkJdGhpcy5wdWJsaWNfID0gdGhpcy5idWlsZFB1YmxpYyhtZW1iZXIpOwotCQl0aGlzLnN0YXRpY18gPSB0aGlzLmJ1aWxkU3RhdGljKG1lbWJlcik7Ci0JCXRoaXMucHJvdGVjdGVkXyA9IHRoaXMuYnVpbGRQcm90ZWN0ZWQobWVtYmVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlKHRoaXMuZ2V0TWVtYmVyKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShJTWVtYmVyIG1lbWJlcikgewotCQl0aGlzLnNldEZpbmFsKHRoaXMuYnVpbGRGaW5hbChtZW1iZXIpKTsKLQkJdGhpcy5zZXRUcmFuc2llbnQodGhpcy5idWlsZFRyYW5zaWVudChtZW1iZXIpKTsKLQkJdGhpcy5zZXRQdWJsaWModGhpcy5idWlsZFB1YmxpYyhtZW1iZXIpKTsKLQkJdGhpcy5zZXRTdGF0aWModGhpcy5idWlsZFN0YXRpYyhtZW1iZXIpKTsKLQkJdGhpcy5zZXRQcm90ZWN0ZWQodGhpcy5idWlsZFByb3RlY3RlZChtZW1iZXIpKTsJCQotCX0KLQotCS8vICoqKioqKioqKiogc2ltcGxlIHN0YXRlICoqKioqKioqKioKLQotCS8vICoqKioqIGZpbmFsCi0JcHVibGljIGJvb2xlYW4gaXNGaW5hbCgpIHsKLQkJcmV0dXJuIHRoaXMuZmluYWxfOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRGaW5hbChib29sZWFuIGZpbmFsXykgewotCQlib29sZWFuIG9sZCA9IHRoaXMuZmluYWxfOwotCQl0aGlzLmZpbmFsXyA9IGZpbmFsXzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZJTkFMX1BST1BFUlRZLCBvbGQsIGZpbmFsXyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkRmluYWwoSU1lbWJlciBtZW1iZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBGbGFncy5pc0ZpbmFsKG1lbWJlci5nZXRGbGFncygpKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKiB0cmFuc2llbnQKLQlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zaWVudCgpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNpZW50XzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VHJhbnNpZW50KGJvb2xlYW4gdHJhbnNpZW50XykgewotCQlib29sZWFuIG9sZCA9IHRoaXMudHJhbnNpZW50XzsKLQkJdGhpcy50cmFuc2llbnRfID0gdHJhbnNpZW50XzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRSQU5TSUVOVF9QUk9QRVJUWSwgb2xkLCB0cmFuc2llbnRfKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYnVpbGRUcmFuc2llbnQoSU1lbWJlciBtZW1iZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBGbGFncy5pc1RyYW5zaWVudChtZW1iZXIuZ2V0RmxhZ3MoKSk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLy8gKioqKiogcHVibGljCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaWMoKSB7Ci0JCXJldHVybiB0aGlzLnB1YmxpY187Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFB1YmxpYyhib29sZWFuIHB1YmxpY18pIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLnB1YmxpY187Ci0JCXRoaXMucHVibGljXyA9IHB1YmxpY187Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQVUJMSUNfUFJPUEVSVFksIG9sZCwgcHVibGljXyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkUHVibGljKElNZW1iZXIgbWVtYmVyKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gRmxhZ3MuaXNQdWJsaWMobWVtYmVyLmdldEZsYWdzKCkpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8vICoqKioqIHN0YXRpYwotCXB1YmxpYyBib29sZWFuIGlzU3RhdGljKCkgewotCQlyZXR1cm4gdGhpcy5zdGF0aWNfOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTdGF0aWMoYm9vbGVhbiBzdGF0aWNfKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5zdGF0aWNfOwotCQl0aGlzLnN0YXRpY18gPSBzdGF0aWNfOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1RBVElDX1BST1BFUlRZLCBvbGQsIHN0YXRpY18pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBidWlsZFN0YXRpYyhJTWVtYmVyIG1lbWJlcikgewotCQl0cnkgewotCQkJcmV0dXJuIEZsYWdzLmlzU3RhdGljKG1lbWJlci5nZXRGbGFncygpKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKiBwcm90ZWN0ZWQKLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3RlY3RlZCgpIHsKLQkJcmV0dXJuIHRoaXMucHJvdGVjdGVkXzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UHJvdGVjdGVkKGJvb2xlYW4gcHJvdGVjdGVkXykgewotCQlib29sZWFuIG9sZCA9IHRoaXMucHJvdGVjdGVkXzsKLQkJdGhpcy5wcm90ZWN0ZWRfID0gcHJvdGVjdGVkXzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBST1RFQ1RFRF9QUk9QRVJUWSwgb2xkLCBwcm90ZWN0ZWRfKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYnVpbGRQcm90ZWN0ZWQoSU1lbWJlciBtZW1iZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBGbGFncy5pc1Byb3RlY3RlZChtZW1iZXIuZ2V0RmxhZ3MoKSk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBtaXNjZWxsYW5lb3VzICoqKioqKioqKioKLQotCUlNZW1iZXIgZ2V0TWVtYmVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBZGFwdGVyKCkuZ2V0RWxlbWVudCgpOwotCX0KLQotCXByaXZhdGUgQWRhcHRlciBnZXRBZGFwdGVyKCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpIHRoaXMuYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBTdHJpcCBvZmYgdGhlIHR5cGUgc2lnbmF0dXJlJ3MgcGFyYW1ldGVycyBpZiBwcmVzZW50LgotCSAqIENvbnZlcnQgdG8gYSByZWFkYWJsZSBzdHJpbmcuCi0JICovCi0Jc3RhdGljIFN0cmluZyBjb252ZXJ0VHlwZVNpZ25hdHVyZVRvVHlwZU5hbWUoU3RyaW5nIHR5cGVTaWduYXR1cmUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlTmFtZSh0eXBlU2lnbmF0dXJlLCBFbXB0eUl0ZXJhYmxlLjxJVHlwZVBhcmFtZXRlcj5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU3RyaXAgb2ZmIHRoZSB0eXBlIHNpZ25hdHVyZSdzIHBhcmFtZXRlcnMgaWYgcHJlc2VudC4KLQkgKiBDb252ZXJ0IHRvIGEgcmVhZGFibGUgc3RyaW5nLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgY29udmVydFR5cGVTaWduYXR1cmVUb1R5cGVOYW1lKFN0cmluZyB0eXBlU2lnbmF0dXJlLCBJdGVyYWJsZTxJVHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMpIHsKLQkJcmV0dXJuICh0eXBlU2lnbmF0dXJlID09IG51bGwpID8gbnVsbCA6IGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlTmFtZV8odHlwZVNpZ25hdHVyZSwgdHlwZVBhcmFtZXRlcnMpOwotCX0KLQkKLQkvKioKLQkgKiBubyBudWxsIGNoZWNrCi0JICovCi0Jc3RhdGljIFN0cmluZyBjb252ZXJ0VHlwZVNpZ25hdHVyZVRvVHlwZU5hbWVfKFN0cmluZyB0eXBlU2lnbmF0dXJlKSB7Ci0JCXJldHVybiBjb252ZXJ0VHlwZVNpZ25hdHVyZVRvVHlwZU5hbWUodHlwZVNpZ25hdHVyZSwgRW1wdHlJdGVyYWJsZS48SVR5cGVQYXJhbWV0ZXI+aW5zdGFuY2UoKSk7Ci0JfQotCQotCS8qKgotCSAqIG5vIG51bGwgY2hlY2sKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlTmFtZV8oU3RyaW5nIHR5cGVTaWduYXR1cmUsIEl0ZXJhYmxlPElUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycykgewotCQlTdHJpbmcgZXJhc3VyZVNpZ25hdHVyZSA9IFNpZ25hdHVyZS5nZXRUeXBlRXJhc3VyZSh0eXBlU2lnbmF0dXJlKTsKLQkJaWYgKFNpZ25hdHVyZS5nZXRUeXBlU2lnbmF0dXJlS2luZChlcmFzdXJlU2lnbmF0dXJlKSA9PSBTaWduYXR1cmUuVFlQRV9WQVJJQUJMRV9TSUdOQVRVUkUpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHR5cGVQYXJhbWV0ZXJOYW1lID0gU2lnbmF0dXJlLnRvU3RyaW5nKGVyYXN1cmVTaWduYXR1cmUpOwotCQkJCWZvciAoSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA6IHR5cGVQYXJhbWV0ZXJzKSB7Ci0JCQkJCWlmICh0eXBlUGFyYW1ldGVyTmFtZS5lcXVhbHModHlwZVBhcmFtZXRlci5nZXRFbGVtZW50TmFtZSgpKSkgewotCQkJCQkJU3RyaW5nW10gYm91bmRzID0gdHlwZVBhcmFtZXRlci5nZXRCb3VuZHNTaWduYXR1cmVzKCk7Ci0JCQkJCQlpZiAoYm91bmRzLmxlbmd0aCA+IDApIHsKLQkJCQkJCQlyZXR1cm4gY29udmVydFR5cGVTaWduYXR1cmVUb1R5cGVOYW1lXyhib3VuZHNbMF0sIHR5cGVQYXJhbWV0ZXJzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coam1lKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChTaWduYXR1cmUuZ2V0VHlwZVNpZ25hdHVyZUtpbmQoZXJhc3VyZVNpZ25hdHVyZSkgPT0gU2lnbmF0dXJlLkFSUkFZX1RZUEVfU0lHTkFUVVJFKSB7Ci0JCQlpbnQgZGltID0gU2lnbmF0dXJlLmdldEFycmF5Q291bnQoZXJhc3VyZVNpZ25hdHVyZSk7Ci0JCQlTdHJpbmcgYXJyYXlUeXBlTmFtZSA9IGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlTmFtZShTaWduYXR1cmUuZ2V0RWxlbWVudFR5cGUoZXJhc3VyZVNpZ25hdHVyZSksIHR5cGVQYXJhbWV0ZXJzKTsKLQkJCXJldHVybiBTaWduYXR1cmUudG9TdHJpbmcoU2lnbmF0dXJlLmNyZWF0ZUFycmF5U2lnbmF0dXJlKFNpZ25hdHVyZS5jcmVhdGVUeXBlU2lnbmF0dXJlKGFycmF5VHlwZU5hbWUsIHRydWUpLCBkaW0pKTsKLQkJfQotCQllbHNlIGlmIChTaWduYXR1cmUuZ2V0VHlwZVNpZ25hdHVyZUtpbmQoZXJhc3VyZVNpZ25hdHVyZSkgPT0gU2lnbmF0dXJlLldJTERDQVJEX1RZUEVfU0lHTkFUVVJFKSB7Ci0JCQkvLyBpZiBzaWduYXR1cmUgaXMgPyAod2lsZGNhcmQpIG9yID8gc3VwZXIgWCAoYm90dG9tIGJvdW5kZWQpLCByZXR1cm4gdG9wIGJvdW5kLCB3aGljaCBpcyBPYmplY3QKLQkJCWlmIChTdHJpbmcudmFsdWVPZihTaWduYXR1cmUuQ19TVEFSKS5lcXVhbHMoZXJhc3VyZVNpZ25hdHVyZSkgfHwgZXJhc3VyZVNpZ25hdHVyZS5zdGFydHNXaXRoKFN0cmluZy52YWx1ZU9mKFNpZ25hdHVyZS5DX1NVUEVSKSkpIHsKLQkJCQlyZXR1cm4gT2JqZWN0LmNsYXNzLmdldE5hbWUoKTsKLQkJCX0KLQkJCS8vIHJldHVybiB0b3AgYm91bmQKLQkJCXJldHVybiBTaWduYXR1cmUudG9TdHJpbmcoZXJhc3VyZVNpZ25hdHVyZS5zdWJzdHJpbmcoMSkpOwotCQl9Ci0JCXJldHVybiBTaWduYXR1cmUudG9TdHJpbmcoZXJhc3VyZVNpZ25hdHVyZSk7Ci0JfQotCQotCXN0YXRpYyBib29sZWFuIGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlSXNBcnJheShTdHJpbmcgdHlwZVNpZ25hdHVyZSkgewotCQlyZXR1cm4gKHR5cGVTaWduYXR1cmUgPT0gbnVsbCkgPyBmYWxzZSA6IFNpZ25hdHVyZS5nZXRUeXBlU2lnbmF0dXJlS2luZCh0eXBlU2lnbmF0dXJlKSA9PSBTaWduYXR1cmUuQVJSQVlfVFlQRV9TSUdOQVRVUkU7Ci0JfQotCQotCXN0YXRpYyBpbnQgY29udmVydFR5cGVTaWduYXR1cmVUb1R5cGVBcnJheURpbWVuc2lvbmFsaXR5KFN0cmluZyB0eXBlU2lnbmF0dXJlKSB7Ci0JCXJldHVybiAodHlwZVNpZ25hdHVyZSA9PSBudWxsKSA/IDAgOiBTaWduYXR1cmUuZ2V0QXJyYXlDb3VudCh0eXBlU2lnbmF0dXJlKTsKLQl9Ci0JCi0Jc3RhdGljIFN0cmluZyBjb252ZXJ0VHlwZVNpZ25hdHVyZVRvVHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUoU3RyaW5nIHR5cGVTaWduYXR1cmUsIEl0ZXJhYmxlPElUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycykgewotCQlyZXR1cm4gKHR5cGVTaWduYXR1cmUgPT0gbnVsbCkgPyBudWxsIDogY29udmVydFR5cGVTaWduYXR1cmVUb1R5cGVOYW1lKFNpZ25hdHVyZS5nZXRFbGVtZW50VHlwZSh0eXBlU2lnbmF0dXJlKSwgdHlwZVBhcmFtZXRlcnMpOwotCX0KLQkKLQkvKioKLQkgKiB0aGVzZSB0eXBlcyBjYW4gYmUgYXJyYXlzIChlLmcuICJqYXZhLmxhbmcuU3RyaW5nW10iKTsKLQkgKiBidXQgdGhleSB3b24ndCBoYXZlIGFueSBmdXJ0aGVyIG5lc3RlZCBnZW5lcmljIHR5cGUgYXJndW1lbnRzCi0JICogKGUuZy4gImphdmEudXRpbC5Db2xsZWN0aW9uPGphdmEubGFuZy5TdHJpbmc+IikKLQkgKi8KLQlzdGF0aWMgTGlzdDxTdHJpbmc+IGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlVHlwZUFyZ3VtZW50TmFtZXMoU3RyaW5nIHR5cGVTaWduYXR1cmUsIEl0ZXJhYmxlPElUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycykgewotCQlpZiAodHlwZVNpZ25hdHVyZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQkJCi0JCVN0cmluZ1tdIHR5cGVBcmd1bWVudFNpZ25hdHVyZXMgPSBTaWduYXR1cmUuZ2V0VHlwZUFyZ3VtZW50cyh0eXBlU2lnbmF0dXJlKTsKLQkJaWYgKHR5cGVBcmd1bWVudFNpZ25hdHVyZXMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCQkKLQkJQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4odHlwZUFyZ3VtZW50U2lnbmF0dXJlcy5sZW5ndGgpOwotCQlmb3IgKFN0cmluZyB0eXBlQXJndW1lbnRTaWduYXR1cmUgOiB0eXBlQXJndW1lbnRTaWduYXR1cmVzKSB7Ci0JCQluYW1lcy5hZGQoY29udmVydFR5cGVTaWduYXR1cmVUb1R5cGVOYW1lKHR5cGVBcmd1bWVudFNpZ25hdHVyZSwgdHlwZVBhcmFtZXRlcnMpKTsKLQkJfQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUHVibGljT3JQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmlzUHVibGljKCkgfHwgdGhpcy5pc1Byb3RlY3RlZCgpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIElNZW1iZXIgYWRhcHRlciAqKioqKioqKioqCi0KLQlpbnRlcmZhY2UgQWRhcHRlciBleHRlbmRzIEJpbmFyeUFubm90YXRlZEVsZW1lbnQuQWRhcHRlciB7Ci0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGFkYXB0ZXIncyBKRFQgbWVtYmVyIChJVHlwZSwgSUZpZWxkLCBJTWV0aG9kKS4KLQkJICovCi0JCUlNZW1iZXIgZ2V0RWxlbWVudCgpOwotCQkKLQkJSXRlcmFibGU8SVR5cGVQYXJhbWV0ZXI+IGdldFR5cGVQYXJhbWV0ZXJzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHVuc3VwcG9ydGVkIEphdmFSZXNvdXJjZU1lbWJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgQW5ub3RhdGlvbiBzZXRQcmltYXJ5QW5ub3RhdGlvbihTdHJpbmcgcHJpbWFyeUFubm90YXRpb25OYW1lLCBJdGVyYWJsZTxTdHJpbmc+IHN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRm9yKFN0cmluZyBtZW1iZXJOYW1lLCBpbnQgb2NjdXJyZW5jZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlNZXRob2QuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU1ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmRkOWJlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lk1ldGhvZFNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTmFtZVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBiaW5hcnkgbWV0aG9kCi0gKi8KLWZpbmFsIGNsYXNzIEJpbmFyeU1ldGhvZAotCQlleHRlbmRzIEJpbmFyeUF0dHJpYnV0ZQotCQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZU1ldGhvZCB7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNvbnN0cnVjdG9yOwotCQotCXByaXZhdGUgZmluYWwgVmVjdG9yPFN0cmluZz4gcGFyYW1ldGVyVHlwZU5hbWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCi0JCi0JQmluYXJ5TWV0aG9kKEphdmFSZXNvdXJjZVR5cGUgcGFyZW50LCBJTWV0aG9kIG1ldGhvZCkgewotCQlzdXBlcihwYXJlbnQsIG5ldyBNZXRob2RBZGFwdGVyKG1ldGhvZCkpOwotCX0KLQkKLQlwdWJsaWMgS2luZCBnZXRLaW5kKCkgewotCQlyZXR1cm4gSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kLk1FVEhPRDsKLQl9Ci0JCi0JLy8gKioqKiogb3ZlcnJpZGVzICoqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoSU1lbWJlciBtZW1iZXIpIHsKLQkJc3VwZXIudXBkYXRlKG1lbWJlcik7Ci0JCXRoaXMuc2V0Q29uc3RydWN0b3IodGhpcy5idWlsZENvbnN0cnVjdG9yKChJTWV0aG9kKSBtZW1iZXIpKTsKLQkJdGhpcy5zZXRQYXJhbWV0ZXJUeXBlTmFtZXModGhpcy5idWlsZFBhcmFtZXRlclR5cGVOYW1lcygoSU1ldGhvZCkgbWVtYmVyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JSU1ldGhvZCBnZXRNZW1iZXIoKSB7Ci0JCXJldHVybiAoSU1ldGhvZCkgc3VwZXIuZ2V0TWVtYmVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqIG1ldGhvZCBuYW1lICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKCkgewotCQlyZXR1cm4gZ2V0TWVtYmVyKCkuZ2V0RWxlbWVudE5hbWUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogcGFyYW1ldGVyIHR5cGUgbmFtZXMgKioqKioKLQkKLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0UGFyYW1ldGVyVHlwZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxTdHJpbmc+KHRoaXMucGFyYW1ldGVyVHlwZU5hbWVzKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXJUeXBlTmFtZShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMucGFyYW1ldGVyVHlwZU5hbWVzLmdldChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0UGFyYW1ldGVyc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmFtZXRlclR5cGVOYW1lcy5zaXplKCk7Ci0JfQotCQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkUGFyYW1ldGVyVHlwZU5hbWVzKElNZXRob2QgbWV0aG9kKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoSUxvY2FsVmFyaWFibGUgcGFyYW1ldGVyIDogdGhpcy5nZXRQYXJhbWV0ZXJzKG1ldGhvZCkpIHsKLQkJCW5hbWVzLmFkZChwYXJhbWV0ZXIuZ2V0RWxlbWVudE5hbWUoKSk7Ly9UT0RPIGlzIHRoaXMgcmlnaHQ/Ci0JCX0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQkKLQlwcml2YXRlIElMb2NhbFZhcmlhYmxlW10gZ2V0UGFyYW1ldGVycyhJTWV0aG9kIGpkdE1ldGhvZCkgewotCQl0cnkgewotCQkJcmV0dXJuIGpkdE1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFBhcmFtZXRlclR5cGVOYW1lcyhMaXN0PFN0cmluZz4gcGFyYW1ldGVyVHlwZU5hbWVzKSB7Ci0JCXRoaXMuc3luY2hyb25pemVMaXN0KHBhcmFtZXRlclR5cGVOYW1lcywgdGhpcy5wYXJhbWV0ZXJUeXBlTmFtZXMsIFBBUkFNRVRFUl9UWVBFX05BTUVTX0xJU1QpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb25zdHJ1Y3RvciAqKioqKgotCQotCXB1YmxpYyBib29sZWFuIGlzQ29uc3RydWN0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnN0cnVjdG9yOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0Q29uc3RydWN0b3IoYm9vbGVhbiBpc0NvbnN0cnVjdG9yKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5jb25zdHJ1Y3RvcjsKLQkJdGhpcy5jb25zdHJ1Y3RvciA9IGlzQ29uc3RydWN0b3I7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT05TVFJVQ1RPUl9QUk9QRVJUWSwgb2xkLCBpc0NvbnN0cnVjdG9yKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkQ29uc3RydWN0b3IoSU1ldGhvZCBtZXRob2QpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBtZXRob2QuaXNDb25zdHJ1Y3RvcigpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogYWRhcHRlcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogSU1ldGhvZCBhZGFwdGVyCi0JICovCi0Jc3RhdGljIGNsYXNzIE1ldGhvZEFkYXB0ZXIKLQkJCWltcGxlbWVudHMgQmluYXJ5QXR0cmlidXRlLkFkYXB0ZXIgewotCQkKLQkJZmluYWwgSU1ldGhvZCBtZXRob2Q7Ci0JCXN0YXRpYyBmaW5hbCBJTWV0aG9kW10gRU1QVFlfTUVUSE9EX0FSUkFZID0gbmV3IElNZXRob2RbMF07Ci0JCQotCQlNZXRob2RBZGFwdGVyKElNZXRob2QgbWV0aG9kKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5tZXRob2QgPSBtZXRob2Q7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJTWV0aG9kIGdldEVsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tZXRob2Q7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJdGVyYWJsZTxJVHlwZVBhcmFtZXRlcj4gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8SVR5cGVQYXJhbWV0ZXI+KAotCQkJCQkJbmV3IEFycmF5SXRlcmFibGU8SVR5cGVQYXJhbWV0ZXI+KHRoaXMubWV0aG9kLmdldFR5cGVQYXJhbWV0ZXJzKCkpLAotCQkJCQkJbmV3IEFycmF5SXRlcmFibGU8SVR5cGVQYXJhbWV0ZXI+KHRoaXMubWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKS5nZXRUeXBlUGFyYW1ldGVycygpKSk7Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGptZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgSUFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9ucygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkJcmV0dXJuIHRoaXMubWV0aG9kLmdldEFubm90YXRpb25zKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJCXJldHVybiBOYW1lVG9vbHMuY29udmVydEdldHRlclNldHRlck1ldGhvZE5hbWVUb1Byb3BlcnR5TmFtZSh0aGlzLm1ldGhvZC5nZXRFbGVtZW50TmFtZSgpKTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUeXBlU2lnbmF0dXJlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gdGhpcy5tZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TmFtZWRBbm5vdGF0aW9uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOYW1lZEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UzYjNmOC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOYW1lZEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLQotLyoqCi0gKiBVc2VkIGZvciBhbm5vdGF0aW9ucyB0aGF0IGhhdmUgbm8gYmVoYXZpb3IsIGp1c3QgYSBuYW1lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlOYW1lZEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLXsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGFubm90YXRpb25OYW1lOwotCi0JcHVibGljIEJpbmFyeU5hbWVkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbiwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMuYW5ub3RhdGlvbk5hbWUgPSBhbm5vdGF0aW9uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uTmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOb2RlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YTFlZWMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5BYnN0cmFjdEphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIEJpbmFyeSBjb252ZW5pZW5jZSBtZXRob2RzCi0gKi8KLS8vIFRPRE8gaG9wZWZ1bGx5IHRoaXMgY2xhc3MgY2FuIGdvIGF3YXkgd2l0aCBzb21lIHNvcnQgb2YgcmVmYWN0b3Jpbmcgb2YgdGhlCi0vLyBzb3VyY2UgYW5kIGJpbmFyeSBoaWVyYXJjaGllcy4uLgotcHVibGljIGFic3RyYWN0IGNsYXNzIEJpbmFyeU5vZGUKLQlleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlTm9kZQotewotCXByb3RlY3RlZCBCaW5hcnlOb2RlKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmFSZXNvdXJjZU5vZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiBudWxsOyAgLy8gb25seSBCaW5hcnlQYWNrYWdlRnJhZ21lbnRSb290IGhhcyBhIGZpbGUuLi4KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCS8vIG5vdGhpbmcgYnkgZGVmYXVsdAotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgZ2V0SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIHZhbHVlLXBhaXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgPGVtPnZhbHVlczwvZW0+IG9mIHRoZSBzcGVjaWZpZWQgSkRUIGFubm90YXRpb24ncyBtZW1iZXIgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0SmR0TWVtYmVyVmFsdWVzKElBbm5vdGF0aW9uIGpkdENvbnRhaW5lckFubm90YXRpb24sIFN0cmluZyBtZW1iZXJOYW1lKSB7Ci0JCU9iamVjdFtdIHZhbHVlcyA9IChPYmplY3RbXSkgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShqZHRDb250YWluZXJBbm5vdGF0aW9uLCBtZW1iZXJOYW1lKTsKLQkJcmV0dXJuICh2YWx1ZXMgIT0gbnVsbCkgPyB2YWx1ZXMgOiBFTVBUWV9PQkpFQ1RfQVJSQVk7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX09CSkVDVF9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgSkRUIGFubm90YXRpb24ncyBtZW1iZXIgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEpkdE1lbWJlclZhbHVlKElBbm5vdGF0aW9uIGpkdENvbnRhaW5lckFubm90YXRpb24sIFN0cmluZyBtZW1iZXJOYW1lKSB7Ci0JCUlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWVQYWlyKGpkdENvbnRhaW5lckFubm90YXRpb24sIG1lbWJlck5hbWUpOwotCQlyZXR1cm4gKHBhaXIgPT0gbnVsbCkgPyBudWxsIDogcGFpci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIEpEVCBhbm5vdGF0aW9uJ3MgbWVtYmVyLXZhbHVlIHBhaXIgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgSU1lbWJlclZhbHVlUGFpciBnZXRKZHRNZW1iZXJWYWx1ZVBhaXIoSUFubm90YXRpb24gamR0Q29udGFpbmVyQW5ub3RhdGlvbiwgU3RyaW5nIG1lbWJlck5hbWUpIHsKLQkJZm9yIChJTWVtYmVyVmFsdWVQYWlyIHBhaXIgOiB0aGlzLmdldEpkdE1lbWJlclZhbHVlUGFpcnMoamR0Q29udGFpbmVyQW5ub3RhdGlvbikpIHsKLQkJCWlmIChwYWlyLmdldE1lbWJlck5hbWUoKS5lcXVhbHMobWVtYmVyTmFtZSkpIHsKLQkJCQlyZXR1cm4gcGFpcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSU1lbWJlclZhbHVlUGFpcltdIGdldEpkdE1lbWJlclZhbHVlUGFpcnMoSUFubm90YXRpb24gamR0Q29udGFpbmVyQW5ub3RhdGlvbikgewotCQl0cnkgewotCQkJcmV0dXJuIGpkdENvbnRhaW5lckFubm90YXRpb24uZ2V0TWVtYmVyVmFsdWVQYWlycygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBFTVBUWV9NRU1CRVJfVkFMVUVfUEFJUl9BUlJBWTsKLQkJfQotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJTWVtYmVyVmFsdWVQYWlyW10gRU1QVFlfTUVNQkVSX1ZBTFVFX1BBSVJfQVJSQVkgPSBuZXcgSU1lbWJlclZhbHVlUGFpclswXTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVBhY2thZ2VGcmFnbWVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5UGFja2FnZUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZmRmODQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5UGFja2FnZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNsYXNzRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLQotLyoqCi0gKiBiaW5hcnkgcGFja2FnZSBmcmFnbWVudAotICovCi1maW5hbCBjbGFzcyBCaW5hcnlQYWNrYWdlRnJhZ21lbnQKLQlleHRlbmRzIEJpbmFyeU5vZGUKLQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudAotewotCS8qKiBKRFQgcGFja2FnZSBmcmFnbWVudCAqLwotCXByaXZhdGUgZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQ7Ci0KLQkvKioKLQkgKiBjbGFzcyBmaWxlcyBpbiB0aGUgcGFja2FnZSBmcmFnbWVudDsKLQkgKiB3ZSBvbmx5IGhvbGQgY2xhc3MgZmlsZXMvdHlwZXMgdGhhdCBhcmUgYWN0dWFsbHkgYW5ub3RhdGVkOwotCSAqIGlmIHRoZSB1bmFubm90YXRlZCB0eXBlcyBhcmUgbmVlZGVkIChlLmcuIGZvciBvcm0ueG1sIG9yIGFuCi0JICogaW5oZXJpdGFuY2UgdHJlZSkgdGhleSBjYW4gYmUgZGlzY292ZXJlZCBvbiB0aGUgY2xhc3NwYXRoIGFzIG5lZWRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgVmVjdG9yPEphdmFSZXNvdXJjZUNsYXNzRmlsZT4gY2xhc3NGaWxlcyA9IG5ldyBWZWN0b3I8SmF2YVJlc291cmNlQ2xhc3NGaWxlPigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlCaW5hcnlQYWNrYWdlRnJhZ21lbnQoSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCBwYXJlbnQsIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucGFja2FnZUZyYWdtZW50ID0gcGFja2FnZUZyYWdtZW50OwotCQl0aGlzLmNsYXNzRmlsZXMuYWRkQWxsKHRoaXMuYnVpbGRDbGFzc0ZpbGVzKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxKYXZhUmVzb3VyY2VDbGFzc0ZpbGU+IGJ1aWxkQ2xhc3NGaWxlcygpIHsKLQkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSB0aGlzLmdldEpEVENoaWxkcmVuKCk7Ci0JCUFycmF5TGlzdDxKYXZhUmVzb3VyY2VDbGFzc0ZpbGU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8SmF2YVJlc291cmNlQ2xhc3NGaWxlPihjaGlsZHJlbi5sZW5ndGgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYW5ub3RhdGlvbk5hbWVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5nZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS5nZXRBbm5vdGF0aW9uTmFtZXMoKSk7Ci0JCWZvciAoSUphdmFFbGVtZW50IGNoaWxkIDogY2hpbGRyZW4pIHsKLQkJCUlDbGFzc0ZpbGUgamR0Q2xhc3NGaWxlID0gKElDbGFzc0ZpbGUpIGNoaWxkOwotCQkJSVR5cGUgamR0VHlwZSA9IGpkdENsYXNzRmlsZS5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZUlzUmVsZXZhbnQoamR0VHlwZSwgYW5ub3RhdGlvbk5hbWVzKSkgewotCQkJCXJlc3VsdC5hZGQobmV3IEJpbmFyeUNsYXNzRmlsZSh0aGlzLCBqZHRDbGFzc0ZpbGUsIGpkdFR5cGUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vd2Ugd2lsbCBsaW1pdCB0byBjbGFzc2VzLCBpbnRlcmZhY2VzLCBhbmQgZW51bXMuIEFubm90YXRpb24gdHlwZXMgd2lsbCBiZSBpZ25vcmVkLgotCXN0YXRpYyBib29sZWFuIHR5cGVJc1JlbGV2YW50KElUeXBlIHR5cGUsIENvbGxlY3Rpb248U3RyaW5nPiBhbm5vdGF0aW9uTmFtZXMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAodHlwZSAhPSBudWxsKQotCQkJCQkmJiB0eXBlLmV4aXN0cygpCi0JCQkJCSYmICh0eXBlLmlzQ2xhc3MoKSB8fCB0eXBlLmlzSW50ZXJmYWNlKCkgfHwgdHlwZS5pc0VudW0oKSkKLQkJCQkJJiYgdHlwZUhhc0Fubm90YXRpb25zKHR5cGUsIGFubm90YXRpb25OYW1lcyk7IC8vIHdlIG9ubHkgaG9sZCBhbm5vdGF0ZWQgdHlwZXMKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXN0YXRpYyBib29sZWFuIHR5cGVIYXNBbm5vdGF0aW9ucyhJVHlwZSB0eXBlLCBDb2xsZWN0aW9uPFN0cmluZz4gYW5ub3RhdGlvbk5hbWVzKSB7Ci0JCUlBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnM7Ci0JCXRyeSB7Ci0JCQlhbm5vdGF0aW9ucyA9IHR5cGUuZ2V0QW5ub3RhdGlvbnMoKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKElBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgewotCQkJaWYgKGFubm90YXRpb25OYW1lcy5jb250YWlucyhhbm5vdGF0aW9uLmdldEVsZW1lbnROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vICoqKioqKioqKiogSmFyUmVzb3VyY2VOb2RlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlQ2xhc3NGaWxlcygpOwotCX0KLQotCS8vIFRPRE8KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2xhc3NGaWxlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEphdmFSZXNvdXJjZUNsYXNzRmlsZT4gZ2V0Q2xhc3NGaWxlcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8SmF2YVJlc291cmNlQ2xhc3NGaWxlPih0aGlzLmNsYXNzRmlsZXMpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q2xhc3NGaWxlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNsYXNzRmlsZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+IGdldFR5cGVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF2YVJlc291cmNlQ2xhc3NGaWxlLCBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+KHRoaXMuZ2V0Q2xhc3NGaWxlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgdHJhbnNmb3JtKEphdmFSZXNvdXJjZUNsYXNzRmlsZSBjbGFzc0ZpbGUpIHsKLQkJCQlyZXR1cm4gY2xhc3NGaWxlLmdldFR5cGUoKTsgIC8vIHdlIG9ubHkgaG9sZCBhbm5vdGF0ZWQgdHlwZXMKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwcml2YXRlIElKYXZhRWxlbWVudFtdIGdldEpEVENoaWxkcmVuKCkgewotCQl0cnkgewotCQkJcmV0dXJuIHRoaXMucGFja2FnZUZyYWdtZW50LmdldENoaWxkcmVuKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIEVNUFRZX0pBVkFfRUxFTUVOVF9BUlJBWTsKLQkJfQotCX0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElKYXZhRWxlbWVudFtdIEVNUFRZX0pBVkFfRUxFTUVOVF9BUlJBWSA9IG5ldyBJSmF2YUVsZW1lbnRbMF07Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVBhY2thZ2VGcmFnbWVudFJvb3QuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVBhY2thZ2VGcmFnbWVudFJvb3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI4NjVmMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlQYWNrYWdlRnJhZ21lbnRSb290LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLQotLyoqCi0gKiBiaW5hcnkgcGFja2FnZSBmcmFnbWVudCByb290Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlQYWNrYWdlRnJhZ21lbnRSb290Ci0JZXh0ZW5kcyBSb290QmluYXJ5Tm9kZQotCWltcGxlbWVudHMgSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdAotewotCS8qKiBKRFQgcGFja2FnZSBmcmFnbWVudCByb290ICovCi0JcHJpdmF0ZSBmaW5hbCBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290OwotCi0JLyoqIHBhY2thZ2UgZnJhZ21lbnRzIGluIHRoZSBKQVIgKi8KLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnQ+IHBhY2thZ2VGcmFnbWVudHMgPSBuZXcgVmVjdG9yPEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudD4oKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEJpbmFyeVBhY2thZ2VGcmFnbWVudFJvb3QoSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCwgQW5ub3RhdGlvblByb3ZpZGVyIGFubm90YXRpb25Qcm92aWRlcikgewotCQlzdXBlcihudWxsLCBhbm5vdGF0aW9uUHJvdmlkZXIpOyAgLy8gdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpcyB0aGUgcm9vdCBvZiBpdHMgc3ViLXRyZWUKLQkJdGhpcy5wYWNrYWdlRnJhZ21lbnRSb290ID0gcGFja2FnZUZyYWdtZW50Um9vdDsKLQkJdGhpcy5wYWNrYWdlRnJhZ21lbnRzLmFkZEFsbCh0aGlzLmJ1aWxkUGFja2FnZUZyYWdtZW50cygpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50PiBidWlsZFBhY2thZ2VGcmFnbWVudHMoKSB7Ci0JCUlKYXZhRWxlbWVudFtdIGpkdENoaWxkcmVuID0gdGhpcy5nZXRKRFRDaGlsZHJlbigpOwotCQlBcnJheUxpc3Q8SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudD4oamR0Q2hpbGRyZW4ubGVuZ3RoKTsKLQkJZm9yIChJSmF2YUVsZW1lbnQgY2hpbGQgOiBqZHRDaGlsZHJlbikgewotCQkJcmVzdWx0LmFkZChuZXcgQmluYXJ5UGFja2FnZUZyYWdtZW50KHRoaXMsIChJUGFja2FnZUZyYWdtZW50KSBjaGlsZCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIChJRmlsZSkgdGhpcy5wYWNrYWdlRnJhZ21lbnRSb290LmdldFJlc291cmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVQYWNrYWdlRnJhZ21lbnRzKCk7Ci0JfQotCi0JLy8gVE9ETwotCXByaXZhdGUgdm9pZCB1cGRhdGVQYWNrYWdlRnJhZ21lbnRzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YVJlc291cmNlTm9kZS5Sb290IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIE5COiB3ZSBob2xkIG9ubHkgYW5ub3RhdGVkIHR5cGVzCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4gZ2V0VHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPih0aGlzLnBlcnNpc3RlZFR5cGVzTGlzdHMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+PiBwZXJzaXN0ZWRUeXBlc0xpc3RzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50LCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+Pih0aGlzLmdldFBhY2thZ2VGcmFnbWVudHMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPiB0cmFuc2Zvcm0oSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50IGZyYWdtZW50KSB7Ci0JCQkJcmV0dXJuIGZyYWdtZW50LmdldFR5cGVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudD4gZ2V0UGFja2FnZUZyYWdtZW50cygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnQ+KHRoaXMucGFja2FnZUZyYWdtZW50cyk7Ci0JfQotCi0JcHVibGljIGludCBnZXRQYWNrYWdlRnJhZ21lbnRzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFja2FnZUZyYWdtZW50cy5zaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBJSmF2YUVsZW1lbnRbXSBnZXRKRFRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIEpEVFRvb2xzLmdldENoaWxkcmVuKHRoaXMucGFja2FnZUZyYWdtZW50Um9vdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlUeXBlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZTBiNmQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5NZXRob2RTaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOwotCi0vKioKLSAqIGJpbmFyeSB0eXBlCi0gKi8KLWZpbmFsIGNsYXNzIEJpbmFyeVR5cGUKLQlleHRlbmRzIEJpbmFyeUFic3RyYWN0VHlwZQotCWltcGxlbWVudHMgSmF2YVJlc291cmNlVHlwZQotewotCXByaXZhdGUgU3RyaW5nIHN1cGVyY2xhc3NRdWFsaWZpZWROYW1lOwotCi0JcHJpdmF0ZSBib29sZWFuIGFic3RyYWN0XzsgIC8vICdhYnN0cmFjdCcgaXMgYSByZXNlcnZlZCB3b3JkCi0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTm9BcmdDb25zdHJ1Y3RvcjsKLQotCXByaXZhdGUgYm9vbGVhbiBoYXNQcml2YXRlTm9BcmdDb25zdHJ1Y3RvcjsKLQotCXByaXZhdGUgZmluYWwgVmVjdG9yPEphdmFSZXNvdXJjZUZpZWxkPiBmaWVsZHM7Ci0KLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxKYXZhUmVzb3VyY2VNZXRob2Q+IG1ldGhvZHM7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCUJpbmFyeVR5cGUoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElUeXBlIHR5cGUpIHsKLQkJc3VwZXIocGFyZW50LCB0eXBlKTsKLQkJdGhpcy5zdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSA9IHRoaXMuYnVpbGRTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSh0eXBlKTsKLQkJdGhpcy5hYnN0cmFjdF8gPSB0aGlzLmJ1aWxkQWJzdHJhY3QodHlwZSk7Ci0JCXRoaXMuaGFzTm9BcmdDb25zdHJ1Y3RvciA9IHRoaXMuYnVpbGRIYXNOb0FyZ0NvbnN0cnVjdG9yKHR5cGUpOwotCQl0aGlzLmhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yID0gdGhpcy5idWlsZEhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yKHR5cGUpOwotCQl0aGlzLmZpZWxkcyA9IHRoaXMuYnVpbGRGaWVsZHModHlwZSk7Ci0JCXRoaXMubWV0aG9kcyA9IHRoaXMuYnVpbGRNZXRob2RzKHR5cGUpOwotCX0KLQotCXB1YmxpYyBLaW5kIGdldEtpbmQoKSB7Ci0JCXJldHVybiBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQuVFlQRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShJTWVtYmVyIG1lbWJlcikgewotCQlzdXBlci51cGRhdGUobWVtYmVyKTsKLQkJdGhpcy5zZXRTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSh0aGlzLmJ1aWxkU3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoKElUeXBlKSBtZW1iZXIpKTsKLQkJdGhpcy5zZXRBYnN0cmFjdCh0aGlzLmJ1aWxkQWJzdHJhY3QoKElUeXBlKSBtZW1iZXIpKTsKLQkJdGhpcy5zZXRIYXNOb0FyZ0NvbnN0cnVjdG9yKHRoaXMuYnVpbGRIYXNOb0FyZ0NvbnN0cnVjdG9yKChJVHlwZSkgbWVtYmVyKSk7Ci0JCXRoaXMuc2V0SGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3IodGhpcy5idWlsZEhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yKChJVHlwZSkgbWVtYmVyKSk7Ci0JCXRoaXMudXBkYXRlRmllbGRzKChJVHlwZSkgbWVtYmVyKTsKLQkJdGhpcy51cGRhdGVNZXRob2RzKChJVHlwZSkgbWVtYmVyKTsKLQl9Ci0KLQkvLyBUT0RPCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUZpZWxkcyhJVHlwZSB0eXBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vIFRPRE8KLQlwcml2YXRlIHZvaWQgdXBkYXRlTWV0aG9kcyhJVHlwZSB0eXBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCQotCQotCS8vICoqKioqKioqKiogSmF2YVJlc291cmNlVHlwZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBzdXBlcmNsYXNzIHF1YWxpZmllZCBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3VwZXJjbGFzc1F1YWxpZmllZE5hbWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFN1cGVyY2xhc3NRdWFsaWZpZWROYW1lKFN0cmluZyBzdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zdXBlcmNsYXNzUXVhbGlmaWVkTmFtZTsKLQkJdGhpcy5zdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSA9IHN1cGVyY2xhc3NRdWFsaWZpZWROYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1VQRVJDTEFTU19RVUFMSUZJRURfTkFNRV9QUk9QRVJUWSwgb2xkLCBzdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZShJVHlwZSB0eXBlKSB7Ci0JCXJldHVybiBjb252ZXJ0VHlwZVNpZ25hdHVyZVRvVHlwZU5hbWUodGhpcy5nZXRTdXBlcmNsYXNzVHlwZVNpZ25hdHVyZSh0eXBlKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3VwZXJjbGFzc1R5cGVTaWduYXR1cmUoSVR5cGUgdHlwZSkgewotCQl0cnkgewotCQkJcmV0dXJuIHR5cGUuZ2V0U3VwZXJjbGFzc1R5cGVTaWduYXR1cmUoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCi0JLy8gKioqKiogYWJzdHJhY3QKLQlwdWJsaWMgYm9vbGVhbiBpc0Fic3RyYWN0KCkgewotCQlyZXR1cm4gdGhpcy5hYnN0cmFjdF87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEFic3RyYWN0KGJvb2xlYW4gYWJzdHJhY3RfKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5hYnN0cmFjdF87Ci0JCXRoaXMuYWJzdHJhY3RfID0gYWJzdHJhY3RfOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQUJTVFJBQ1RfUFJPUEVSVFksIG9sZCwgYWJzdHJhY3RfKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYnVpbGRBYnN0cmFjdChJVHlwZSB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gRmxhZ3MuaXNBYnN0cmFjdCh0eXBlLmdldEZsYWdzKCkpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8vICoqKioqIG5vLWFyZyBjb25zdHJ1Y3RvcgotCXB1YmxpYyBib29sZWFuIGhhc05vQXJnQ29uc3RydWN0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmhhc05vQXJnQ29uc3RydWN0b3I7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEhhc05vQXJnQ29uc3RydWN0b3IoYm9vbGVhbiBoYXNOb0FyZ0NvbnN0cnVjdG9yKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5oYXNOb0FyZ0NvbnN0cnVjdG9yOwotCQl0aGlzLmhhc05vQXJnQ29uc3RydWN0b3IgPSBoYXNOb0FyZ0NvbnN0cnVjdG9yOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9fQVJHX0NPTlNUUlVDVE9SX1BST1BFUlRZLCBvbGQsIGhhc05vQXJnQ29uc3RydWN0b3IpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBidWlsZEhhc05vQXJnQ29uc3RydWN0b3IoSVR5cGUgdHlwZSkgewotCQlyZXR1cm4gdGhpcy5maW5kTm9BcmdDb25zdHJ1Y3Rvcih0eXBlKSAhPSBudWxsOwotCX0KLQotCXByaXZhdGUgSU1ldGhvZCBmaW5kTm9BcmdDb25zdHJ1Y3RvcihJVHlwZSB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlmb3IgKElNZXRob2QgbWV0aG9kIDogdHlwZS5nZXRNZXRob2RzKCkpIHsKLQkJCQlpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgewotCQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKiogcHJpdmF0ZSBuby1hcmcgY29uc3RydWN0b3IKLQlwdWJsaWMgYm9vbGVhbiBoYXNQcml2YXRlTm9BcmdDb25zdHJ1Y3RvcigpIHsKLQkJcmV0dXJuIHRoaXMuaGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3I7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yKGJvb2xlYW4gaGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3IpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yOwotCQl0aGlzLmhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yID0gaGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3I7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUklWQVRFX05PX0FSR19DT05TVFJVQ1RPUl9QUk9QRVJUWSwgb2xkLCBoYXNQcml2YXRlTm9BcmdDb25zdHJ1Y3Rvcik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkSGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3IoSVR5cGUgdHlwZSkgewotCQlJTWV0aG9kIG1ldGhvZCA9IHRoaXMuZmluZE5vQXJnQ29uc3RydWN0b3IodHlwZSk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbWV0aG9kICE9IG51bGwgJiYgRmxhZ3MuaXNQcml2YXRlKG1ldGhvZC5nZXRGbGFncygpKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKiogcHVibGljL3Byb3RlY3RlZCBuby1hcmcgY29uc3RydWN0b3IgKioqKioKLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNQdWJsaWNPclByb3RlY3RlZE5vQXJnQ29uc3RydWN0b3IoKSB7Ci0JCUl0ZXJhYmxlPEphdmFSZXNvdXJjZU1ldGhvZD4gY29uc3RydWN0b3JzID0gdGhpcy5nZXRDb25zdHJ1Y3RvcnMoKTsKLQkJaWYgKENvbGxlY3Rpb25Ub29scy5zaXplKGNvbnN0cnVjdG9ycykgPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgY29uc3RydWN0b3IgOiBjb25zdHJ1Y3RvcnMpIHsKLQkJCWlmIChjb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJzU2l6ZSgpID09IDApIHsKLQkJCQlyZXR1cm4gTW9kaWZpZXIuaXNQdWJsaWMoY29uc3RydWN0b3IuZ2V0TW9kaWZpZXJzKCkpCi0JCQkJCQl8fCBNb2RpZmllci5pc1Byb3RlY3RlZChjb25zdHJ1Y3Rvci5nZXRNb2RpZmllcnMoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNQdWJsaWNOb0FyZ0NvbnN0cnVjdG9yKCkgewotCQlJdGVyYWJsZTxKYXZhUmVzb3VyY2VNZXRob2Q+IGNvbnN0cnVjdG9ycyA9IHRoaXMuZ2V0Q29uc3RydWN0b3JzKCk7Ci0JCWlmIChDb2xsZWN0aW9uVG9vbHMuc2l6ZShjb25zdHJ1Y3RvcnMpID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWZvciAoSmF2YVJlc291cmNlTWV0aG9kIGNvbnN0cnVjdG9yIDogY29uc3RydWN0b3JzKSB7Ci0JCQlpZiAoY29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyc1NpemUoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIE1vZGlmaWVyLmlzUHVibGljKGNvbnN0cnVjdG9yLmdldE1vZGlmaWVycygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZU1ldGhvZD4gZ2V0Q29uc3RydWN0b3JzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEphdmFSZXNvdXJjZU1ldGhvZD4odGhpcy5nZXRNZXRob2RzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEphdmFSZXNvdXJjZU1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gbWV0aG9kLmlzQ29uc3RydWN0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlBbm5vdGF0ZWRGaWVsZHMoKSB7Ci0JCWZvciAoSmF2YVJlc291cmNlRmllbGQgZmllbGQgOiB0aGlzLmdldEZpZWxkcygpKSB7Ci0JCQlpZiAoZmllbGQuaXNBbm5vdGF0ZWQoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlBbm5vdGF0ZWRNZXRob2RzKCkgewotCQlmb3IgKEphdmFSZXNvdXJjZU1ldGhvZCBtZXRob2QgOiB0aGlzLmdldE1ldGhvZHMoKSkgewotCQkJaWYgKG1ldGhvZC5pc0Fubm90YXRlZCgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJVHlwZSBnZXRNZW1iZXIoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRNZW1iZXIoKTsKLQl9Ci0KLQkvLyBUd28gbW9yZSByZXF1aXJlbWVudHMgZm9yIGEgdmFsaWQgZXF1YWxzKCkgbWV0aG9kOgotCS8vIDEuIEl0IHNob3VsZCBiZSBwdWJsaWMgCi0JLy8gMi4gVGhlIHJldHVybiB0eXBlIHNob3VsZCBiZSBib29sZWFuCi0JLy8gQm90aCByZXF1aXJlbWVudHMgYXJlIHZhbGlkYXRlZCBieSB0aGUgY29tcGlsZXIgc28gdGhleSBhcmUgZXhjbHVkZWQgaGVyZQotCXB1YmxpYyBib29sZWFuIGhhc0VxdWFsc01ldGhvZCgpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgbWV0aG9kIDogdGhpcy5nZXRNZXRob2RzKCkpIHsKLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwobWV0aG9kLmdldE1ldGhvZE5hbWUoKSwgImVxdWFscyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJJiYgbWV0aG9kLmdldFBhcmFtZXRlcnNTaXplKCkgPT0gMQotCQkJCQkmJiBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwobWV0aG9kLmdldFBhcmFtZXRlclR5cGVOYW1lKDApLCBPYmplY3QuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBUd28gbW9yZSByZXF1aXJlbWVudHMgZm9yIGEgdmFsaWQgaGFzaENvZGUoKSBtZXRob2Q6Ci0JLy8gMS4gSXQgc2hvdWxkIGJlIHB1YmxpYyAKLQkvLyAyLiBUaGUgcmV0dXJuIHR5cGUgc2hvdWxkIGJlIGludAotCS8vIEJvdGggcmVxdWlyZW1lbnRzIGFyZSB2YWxpZGF0ZWQgYnkgdGhlIGNvbXBpbGVyIHNvIHRoZXkgYXJlIGV4Y2x1ZGVkIGhlcmUKLQlwdWJsaWMgYm9vbGVhbiBoYXNIYXNoQ29kZU1ldGhvZCgpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgbWV0aG9kIDogdGhpcy5nZXRNZXRob2RzKCkpIHsKLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwobWV0aG9kLmdldE1ldGhvZE5hbWUoKSwgImhhc2hDb2RlIikgLy8kTk9OLU5MUy0xJAotCQkJCQkmJiBtZXRob2QuZ2V0UGFyYW1ldGVyc1NpemUoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VNZXRob2QgZ2V0TWV0aG9kKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgbWV0aG9kIDogdGhpcy5nZXRNZXRob2RzKCkpIHsKLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwobWV0aG9kLmdldE1ldGhvZE5hbWUoKSwgcHJvcGVydHlOYW1lKSkgewotCQkJCXJldHVybiBtZXRob2Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKioqKioqKiBmaWVsZHMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUZpZWxkPiBnZXRGaWVsZHMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8SmF2YVJlc291cmNlRmllbGQ+KHRoaXMuZmllbGRzKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEZpZWxkKEphdmFSZXNvdXJjZUZpZWxkIGZpZWxkKSB7Ci0JCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihmaWVsZCwgdGhpcy5maWVsZHMsIEZJRUxEU19DT0xMRUNUSU9OKTsKLQl9Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZUZpZWxkIGdldEZpZWxkKFN0cmluZyBmaWVsZE5hbWUsIGludCBvY2N1cnJlbmNlKSB7Ci0JCWZvciAoSmF2YVJlc291cmNlRmllbGQgZmllbGQgOiB0aGlzLmdldEZpZWxkcygpKSB7Ci0JCQlpZiAoZmllbGQuaXNGb3IoZmllbGROYW1lLCBvY2N1cnJlbmNlKSkgewotCQkJCXJldHVybiBmaWVsZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRmllbGRzKENvbGxlY3Rpb248SmF2YVJlc291cmNlRmllbGQ+IHJlbW92ZSkgewotCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24ocmVtb3ZlLCB0aGlzLmZpZWxkcywgRklFTERTX0NPTExFQ1RJT04pOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPEphdmFSZXNvdXJjZUZpZWxkPiBidWlsZEZpZWxkcyhJVHlwZSB0eXBlKSB7Ci0JCUlGaWVsZFtdIGpkdEZpZWxkcyA9IHRoaXMuZ2V0RmllbGRzKHR5cGUpOwotCQlWZWN0b3I8SmF2YVJlc291cmNlRmllbGQ+IHJlc3VsdCA9IG5ldyBWZWN0b3I8SmF2YVJlc291cmNlRmllbGQ+KGpkdEZpZWxkcy5sZW5ndGgpOwotCQlmb3IgKElGaWVsZCBqZHRGaWVsZCA6IGpkdEZpZWxkcykgewotCQkJcmVzdWx0LmFkZCh0aGlzLmJ1aWxkRmllbGQoamR0RmllbGQpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgSUZpZWxkW10gZ2V0RmllbGRzKElUeXBlIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0eXBlLmdldEZpZWxkcygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBFTVBUWV9GSUVMRF9BUlJBWTsKLQkJfQotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmllbGRbXSBFTVBUWV9GSUVMRF9BUlJBWSA9IG5ldyBJRmllbGRbMF07Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZUZpZWxkIGJ1aWxkRmllbGQoSUZpZWxkIGpkdEZpZWxkKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RmllbGQodGhpcywgamR0RmllbGQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VNZXRob2Q+IGdldE1ldGhvZHMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8SmF2YVJlc291cmNlTWV0aG9kPih0aGlzLm1ldGhvZHMpOwotCX0KLQotCXByaXZhdGUgSmF2YVJlc291cmNlTWV0aG9kIGdldE1ldGhvZChNZXRob2RTaWduYXR1cmUgc2lnbmF0dXJlLCBpbnQgb2NjdXJyZW5jZSkgewotCQlmb3IgKEphdmFSZXNvdXJjZU1ldGhvZCBtZXRob2QgOiB0aGlzLmdldE1ldGhvZHMoKSkgewotCQkJaWYgKG1ldGhvZC5pc0ZvcihzaWduYXR1cmUsIG9jY3VycmVuY2UpKSB7Ci0JCQkJcmV0dXJuIG1ldGhvZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTWV0aG9kKEphdmFSZXNvdXJjZU1ldGhvZCBtZXRob2QpIHsKLQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKG1ldGhvZCwgdGhpcy5tZXRob2RzLCBNRVRIT0RTX0NPTExFQ1RJT04pOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVNZXRob2RzKENvbGxlY3Rpb248SmF2YVJlc291cmNlTWV0aG9kPiByZW1vdmUpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKHJlbW92ZSwgdGhpcy5tZXRob2RzLCBNRVRIT0RTX0NPTExFQ1RJT04pOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPEphdmFSZXNvdXJjZU1ldGhvZD4gYnVpbGRNZXRob2RzKElUeXBlIHR5cGUpIHsKLQkJSU1ldGhvZFtdIGpkdE1ldGhvZHMgPSB0aGlzLmdldE1ldGhvZHModHlwZSk7Ci0JCVZlY3RvcjxKYXZhUmVzb3VyY2VNZXRob2Q+IHJlc3VsdCA9IG5ldyBWZWN0b3I8SmF2YVJlc291cmNlTWV0aG9kPihqZHRNZXRob2RzLmxlbmd0aCk7Ci0JCWZvciAoSU1ldGhvZCBqZHRNZXRob2QgOiBqZHRNZXRob2RzKSB7Ci0JCQlyZXN1bHQuYWRkKHRoaXMuYnVpbGRNZXRob2QoamR0TWV0aG9kKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElNZXRob2RbXSBnZXRNZXRob2RzKElUeXBlIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0eXBlLmdldE1ldGhvZHMoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gRU1QVFlfTUVUSE9EX0FSUkFZOwotCQl9Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElNZXRob2RbXSBFTVBUWV9NRVRIT0RfQVJSQVkgPSBuZXcgSU1ldGhvZFswXTsKLQotCXByaXZhdGUgSmF2YVJlc291cmNlTWV0aG9kIGJ1aWxkTWV0aG9kKElNZXRob2QgamR0TWV0aG9kKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5TWV0aG9kKHRoaXMsIGpkdE1ldGhvZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlUeXBlQ2FjaGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVR5cGVDYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGM1Njg0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVR5cGVDYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5Bbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGVDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci0KLS8qKgotICogY2FjaGUgdXNlZCB0byBob2xkIGJpbmFyeSAiZXh0ZXJuYWwiIEphdmEgcmVzb3VyY2UgdHlwZXMKLSAqICh0eXBpY2FsbHkgZGVyaXZlZCBmcm9tIEpBUnMgb24gdGhlIHByb2plY3QncyBidWlsZCBwYXRoKQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5VHlwZUNhY2hlCi0JZXh0ZW5kcyBSb290QmluYXJ5Tm9kZQotCWltcGxlbWVudHMgSmF2YVJlc291cmNlVHlwZUNhY2hlCi17Ci0JLyoqIHBvcHVsYXRlZCBvbi1kZW1hbmQgKi8KLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxFbnRyeT4gZW50cmllcyA9IG5ldyBWZWN0b3I8RW50cnk+KCk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBCaW5hcnlUeXBlQ2FjaGUoQW5ub3RhdGlvblByb3ZpZGVyIGFubm90YXRpb25Qcm92aWRlcikgewotCQlzdXBlcihudWxsLCBhbm5vdGF0aW9uUHJvdmlkZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VOb2RlLlJvb3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4gZ2V0VHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxFbnRyeSwgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPih0aGlzLmdldEVudHJpZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHRyYW5zZm9ybShFbnRyeSBlbnRyeSkgewotCQkJCXJldHVybiBlbnRyeS50eXBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8RW50cnk+IGdldEVudHJpZXMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8RW50cnk+KHRoaXMuZW50cmllcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlQ2FjaGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRUeXBlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmVudHJpZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYWRkVHlwZShJVHlwZSBqZHRUeXBlKSB7Ci0JCUVudHJ5IGVudHJ5ID0gdGhpcy5idWlsZEVudHJ5KGpkdFR5cGUpOwotCQl0aGlzLmVudHJpZXMuYWRkKGVudHJ5KTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKFRZUEVTX0NPTExFQ1RJT04sIGVudHJ5LnR5cGUpOwotCQlyZXR1cm4gZW50cnkudHlwZTsKLQl9Ci0KLQlwcml2YXRlIEVudHJ5IGJ1aWxkRW50cnkoSVR5cGUgamR0VHlwZSkgewotCQlyZXR1cm4gbmV3IEVudHJ5KHRoaXMuYnVpbGRUeXBlKGpkdFR5cGUpLCBqZHRUeXBlLmdldFJlc291cmNlKCkpOwotCX0KLQotCS8vaWdub3JlIGFubm90YXRpb25zCi0JcHJpdmF0ZSBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYnVpbGRUeXBlKElUeXBlIGpkdFR5cGUpIHsKLQkJdHJ5IHsKLQkJCWlmIChqZHRUeXBlLmlzQ2xhc3MoKSB8fCBqZHRUeXBlLmlzSW50ZXJmYWNlKCkpIHsKLQkJCQlyZXR1cm4gbmV3IEJpbmFyeVR5cGUodGhpcywgamR0VHlwZSk7Ci0JCQl9Ci0JCQlpZiAoamR0VHlwZS5pc0VudW0oKSkgewotCQkJCXJldHVybiBuZXcgQmluYXJ5RW51bSh0aGlzLCBqZHRUeXBlKTsKLQkJCX0KLQkJfQotCQljYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlVHlwZXMoSUZpbGUgamFyRmlsZSkgewotCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCWZvciAoRW50cnkgZW50cnkgOiB0aGlzLmdldEVudHJpZXMoKSkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZW50cnkucmVzb3VyY2U7Ci0JCQlpZiAoKHJlc291cmNlICE9IG51bGwpICYmIHJlc291cmNlLmVxdWFscyhqYXJGaWxlKSkgewotCQkJCXRoaXMucmVtb3ZlRW50cnkoZW50cnkpOwotCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUVudHJ5KEVudHJ5IGVudHJ5KSB7Ci0JCXRoaXMuZW50cmllcy5yZW1vdmUoZW50cnkpOwotCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChUWVBFU19DT0xMRUNUSU9OLCBlbnRyeS50eXBlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIElnbm9yZSBjaGFuZ2VzIHRvIHRoaXMgY29sbGVjdGlvbi4gQWRkcyBjYW4gYmUgaWdub3JlZCBzaW5jZSB0aGV5IGFyZSB0cmlnZ2VyZWQKLQkgKiBieSByZXF1ZXN0cyB0aGF0IHdpbGwsIHRoZW1zZWx2ZXMsIHRyaWdnZXIgdXBkYXRlcyAodHlwaWNhbGx5IGR1cmluZyB0aGUKLQkgKiB1cGRhdGUgb2YgYW4gb2JqZWN0IHRoYXQgY2FsbHMgYSBzZXR0ZXIgd2l0aCB0aGUgbmV3bHktY3JlYXRlZCByZXNvdXJjZQotCSAqIHR5cGUpLiBEZWxldGVzIHdpbGwgYmUgYWNjb21wYW5pZWQgYnkgbWFudWFsIHVwZGF0ZXMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYXNwZWN0Q2hhbmdlZChTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlpZiAoKGFzcGVjdE5hbWUgIT0gbnVsbCkgJiYgISBhc3BlY3ROYW1lLmVxdWFscyhUWVBFU19DT0xMRUNUSU9OKSkgewotCQkJc3VwZXIuYXNwZWN0Q2hhbmdlZChhc3BlY3ROYW1lKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZW50cmllcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNhY2hlIGVudHJ5ICoqKioqKioqKioKLQotCS8qKgotCSAqIEFzc29jaWF0ZSBhIHR5cGUgd2l0aCBpdHMgcmVzb3VyY2UuCi0JICogVGhpcyB3aWxsIGJlIGEgSkFSIGluIHRoZSBjYXNlIG9mIGEgdHlwZSBsb2FkZWQgZnJvbSBhIEpBUiB0aGF0IGlzIGluCi0JICogdGhlIEVjbGlwc2Ugd29ya3NwYWNlLiBUaGUgcmVzb3VyY2Ugd2lsbCBiZSBudWxsIGZvciBhIHR5cGUgbG9hZGVkCi0JICogZnJvbSBhIEpBUiBvciBjbGFzcyBkaXJlY3Rvcnkgb3V0c2lkZSBvZiB0aGUgd29ya3NwYWNlLgotCSAqLwotCXN0YXRpYyBjbGFzcyBFbnRyeSB7Ci0JCWZpbmFsIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSB0eXBlOwotCQlmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2U7Ci0KLQkJRW50cnkoSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHR5cGUsIElSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMudHlwZSk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvUm9vdEJpbmFyeU5vZGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L1Jvb3RCaW5hcnlOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZmNmNjAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvUm9vdEJpbmFyeU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotCi0vKioKLSAqIEpBUiBhbmQgZXh0ZXJuYWwgdHlwZXMKLSAqLwotYWJzdHJhY3QgY2xhc3MgUm9vdEJpbmFyeU5vZGUKLQlleHRlbmRzIEJpbmFyeU5vZGUKLQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZU5vZGUuUm9vdAotewotCS8qKiBwbHVnZ2FibGUgYW5ub3RhdGlvbiBwcm92aWRlciAqLwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvblByb3ZpZGVyIGFubm90YXRpb25Qcm92aWRlcjsKLQotCS8qKiBsaXN0ZW5lcnMgbm90aWZpZWQgd2hlbmV2ZXIgdGhlIHJlc291cmNlIG1vZGVsIGNoYW5nZXMgKi8KLQlwcml2YXRlIGZpbmFsIExpc3RlbmVyTGlzdDxKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXI+IHJlc291cmNlTW9kZWxMaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PEpwdFJlc291cmNlTW9kZWxMaXN0ZW5lcj4oSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyLmNsYXNzKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCQotCVJvb3RCaW5hcnlOb2RlKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0aW9uUHJvdmlkZXIgYW5ub3RhdGlvblByb3ZpZGVyKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuYW5ub3RhdGlvblByb3ZpZGVyID0gYW5ub3RhdGlvblByb3ZpZGVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWlyZXNQYXJlbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUm9vdCBnZXRSb290KCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQW5ub3RhdGlvblByb3ZpZGVyIGdldEFubm90YXRpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvblByb3ZpZGVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VOb2RlLlJvb3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgcmVzb3VyY2VNb2RlbENoYW5nZWQoKSB7Ci0JCWZvciAoSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQlsaXN0ZW5lci5yZXNvdXJjZU1vZGVsQ2hhbmdlZCh0aGlzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBKcHRSZXNvdXJjZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIEpwdENvbW1vbkNvcmVQbHVnaW4uSkFSX1JFU09VUkNFX1RZUEU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2VNb2RlbExpc3RlbmVyKEpwdFJlc291cmNlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZU1vZGVsTGlzdGVuZXIoSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQWJzdHJhY3RUeXBlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBYnN0cmFjdFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZhNDJmMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBYnN0cmFjdFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5BYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZUludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogSmF2YSBzb3VyY2UgdHlwZQotICovCi1hYnN0cmFjdCBjbGFzcyBTb3VyY2VBYnN0cmFjdFR5cGU8QSBleHRlbmRzIEFic3RyYWN0VHlwZT4KLQlleHRlbmRzIFNvdXJjZU1lbWJlcjxBPgotCWltcGxlbWVudHMgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlCi17Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgU3RyaW5nIHF1YWxpZmllZE5hbWU7Ci0KLQlwcml2YXRlIFN0cmluZyBwYWNrYWdlTmFtZTsKLQotCXByaXZhdGUgU3RyaW5nIGRlY2xhcmluZ1R5cGVOYW1lOwotCi0JcHJpdmF0ZSBib29sZWFuIG1lbWJlclR5cGU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBTb3VyY2VBYnN0cmFjdFR5cGUoSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCwgQSB0eXBlKSB7Ci0JCXN1cGVyKGphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCwgdHlwZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShJQmluZGluZyBiaW5kaW5nKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYmluZGluZyk7Ci0JCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKChJVHlwZUJpbmRpbmcpIGJpbmRpbmcpOwotCQl0aGlzLnF1YWxpZmllZE5hbWUgPSB0aGlzLmJ1aWxkUXVhbGlmaWVkTmFtZSgoSVR5cGVCaW5kaW5nKSBiaW5kaW5nKTsKLQkJdGhpcy5wYWNrYWdlTmFtZSA9IHRoaXMuYnVpbGRQYWNrYWdlTmFtZSgoSVR5cGVCaW5kaW5nKSBiaW5kaW5nKTsKLQkJdGhpcy5kZWNsYXJpbmdUeXBlTmFtZSA9IHRoaXMuYnVpbGREZWNsYXJpbmdUeXBlTmFtZSgoSVR5cGVCaW5kaW5nKSBiaW5kaW5nKTsKLQkJdGhpcy5tZW1iZXJUeXBlID0gdGhpcy5idWlsZE1lbWJlclR5cGUoKElUeXBlQmluZGluZykgYmluZGluZyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHVwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZVdpdGgoSUJpbmRpbmcgYmluZGluZykgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGgoYmluZGluZyk7Ci0JCXRoaXMuc3luY05hbWUodGhpcy5idWlsZE5hbWUoKElUeXBlQmluZGluZykgYmluZGluZykpOwotCQl0aGlzLnN5bmNRdWFsaWZpZWROYW1lKHRoaXMuYnVpbGRRdWFsaWZpZWROYW1lKChJVHlwZUJpbmRpbmcpIGJpbmRpbmcpKTsKLQkJdGhpcy5zeW5jUGFja2FnZU5hbWUodGhpcy5idWlsZFBhY2thZ2VOYW1lKChJVHlwZUJpbmRpbmcpIGJpbmRpbmcpKTsKLQkJdGhpcy5zeW5jRGVjbGFyaW5nVHlwZU5hbWUodGhpcy5idWlsZERlY2xhcmluZ1R5cGVOYW1lKChJVHlwZUJpbmRpbmcpIGJpbmRpbmcpKTsKLQkJdGhpcy5zeW5jTWVtYmVyVHlwZSh0aGlzLmJ1aWxkTWVtYmVyVHlwZSgoSVR5cGVCaW5kaW5nKSBiaW5kaW5nKSk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKiogSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGltcGxlbWVudGF0aW9uICoqKioqKioqCi0KLQkvLyAqKioqKiBuYW1lCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jTmFtZShTdHJpbmcgYXN0TmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBhc3ROYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBhc3ROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoSVR5cGVCaW5kaW5nIGJpbmRpbmcpIHsKLQkJcmV0dXJuIChiaW5kaW5nID09IG51bGwpID8gbnVsbCA6IGJpbmRpbmcuZ2V0TmFtZSgpOwotCX0KLQotCS8vICoqKioqIHF1YWxpZmllZCBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5xdWFsaWZpZWROYW1lOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jUXVhbGlmaWVkTmFtZShTdHJpbmcgYXN0UXVhbGlmaWVkTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5xdWFsaWZpZWROYW1lOwotCQl0aGlzLnF1YWxpZmllZE5hbWUgPSBhc3RRdWFsaWZpZWROYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUVVBTElGSUVEX05BTUVfUFJPUEVSVFksIG9sZCwgYXN0UXVhbGlmaWVkTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRRdWFsaWZpZWROYW1lKElUeXBlQmluZGluZyBiaW5kaW5nKSB7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IG51bGwgOiBiaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKTsKLQl9Ci0KLQkvLyAqKioqKiBwYWNrYWdlIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5wYWNrYWdlTmFtZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1BhY2thZ2VOYW1lKFN0cmluZyBhc3RQYWNrYWdlTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5wYWNrYWdlTmFtZTsKLQkJdGhpcy5wYWNrYWdlTmFtZSA9IGFzdFBhY2thZ2VOYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUEFDS0FHRV9OQU1FX1BST1BFUlRZLCBvbGQsIGFzdFBhY2thZ2VOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFBhY2thZ2VOYW1lKElUeXBlQmluZGluZyBiaW5kaW5nKSB7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IG51bGwgOiBiaW5kaW5nLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7Ci0JfQotCi0JLy8gKioqKiogcGFja2FnZQotCXB1YmxpYyBib29sZWFuIGlzSW4oSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSwgdGhpcy5wYWNrYWdlTmFtZSk7Ci0JfQotCi0JLy8gKioqKiogc291cmNlIGZvbGRlcgotCXB1YmxpYyBib29sZWFuIGlzSW4oSVBhY2thZ2VGcmFnbWVudFJvb3Qgc291cmNlRm9sZGVyKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VGb2xkZXIoKS5lcXVhbHMoc291cmNlRm9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFNvdXJjZUZvbGRlcigpIHsKLQkJcmV0dXJuIChJUGFja2FnZUZyYWdtZW50Um9vdCkgdGhpcy5nZXRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoKS5nZXRDb21waWxhdGlvblVuaXQoKS5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKTsKLQl9Ci0KLQkvLyAqKioqKiBkZWNsYXJpbmcgdHlwZSBuYW1lCi0JcHVibGljIFN0cmluZyBnZXREZWNsYXJpbmdUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVjbGFyaW5nVHlwZU5hbWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNEZWNsYXJpbmdUeXBlTmFtZShTdHJpbmcgYXN0RGVjbGFyaW5nVHlwZU5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVjbGFyaW5nVHlwZU5hbWU7Ci0JCXRoaXMuZGVjbGFyaW5nVHlwZU5hbWUgPSBhc3REZWNsYXJpbmdUeXBlTmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFQ0xBUklOR19UWVBFX05BTUVfUFJPUEVSVFksIG9sZCwgYXN0RGVjbGFyaW5nVHlwZU5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVjbGFyaW5nVHlwZU5hbWUoSVR5cGVCaW5kaW5nIGJpbmRpbmcpIHsKLQkJaWYgKGJpbmRpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVR5cGVCaW5kaW5nIGRlY2xhcmluZ0NsYXNzID0gYmluZGluZy5nZXREZWNsYXJpbmdDbGFzcygpOwotCQlyZXR1cm4gKGRlY2xhcmluZ0NsYXNzID09IG51bGwpID8gbnVsbCA6IGRlY2xhcmluZ0NsYXNzLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZE5hbWUoKTsKLQl9Ci0KLQkvLyAqKioqKiBtZW1iZXIgdHlwZQotCXB1YmxpYyBib29sZWFuIGlzTWVtYmVyVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMubWVtYmVyVHlwZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY01lbWJlclR5cGUoYm9vbGVhbiBhc3RNZW1iZXJUeXBlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5tZW1iZXJUeXBlOwotCQl0aGlzLm1lbWJlclR5cGUgPSBhc3RNZW1iZXJUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTUVNQkVSX1RZUEVfUFJPUEVSVFksIG9sZCwgYXN0TWVtYmVyVHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkTWVtYmVyVHlwZShJVHlwZUJpbmRpbmcgYmluZGluZykgewotCQlyZXR1cm4gKGJpbmRpbmcgPT0gbnVsbCkgPyBmYWxzZSA6IGJpbmRpbmcuaXNNZW1iZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ291bnRlck1hcCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIENvdW50ZXJNYXAgewotCQlwcml2YXRlIGZpbmFsIEhhc2hNYXA8T2JqZWN0LCBTaW1wbGVJbnRSZWZlcmVuY2U+IGNvdW50ZXJzOwotCi0JCXByb3RlY3RlZCBDb3VudGVyTWFwKGludCBpbml0aWFsQ2FwYWNpdHkpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvdW50ZXJzID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBTaW1wbGVJbnRSZWZlcmVuY2U+KGluaXRpYWxDYXBhY2l0eSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBpbmNyZW1lbnRlZCBjb3VudCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JCSAqLwotCQlpbnQgaW5jcmVtZW50KE9iamVjdCBvKSB7Ci0JCQlTaW1wbGVJbnRSZWZlcmVuY2UgY291bnRlciA9IHRoaXMuY291bnRlcnMuZ2V0KG8pOwotCQkJaWYgKGNvdW50ZXIgPT0gbnVsbCkgewotCQkJCWNvdW50ZXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKCk7Ci0JCQkJdGhpcy5jb3VudGVycy5wdXQobywgY291bnRlcik7Ci0JCQl9Ci0JCQljb3VudGVyLmluY3JlbWVudCgpOwotCQkJcmV0dXJuIGNvdW50ZXIuZ2V0VmFsdWUoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQW5ub3RhdGVkRWxlbWVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQW5ub3RhdGVkRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzkzZTczLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUFubm90YXRlZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JQW5ub3RhdGlvbkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotCi0vKioKLSAqIEphdmEgc291cmNlIGFubm90YXRlZCBlbGVtZW50Ci0gKi8KLWFic3RyYWN0IGNsYXNzIFNvdXJjZUFubm90YXRlZEVsZW1lbnQ8RSBleHRlbmRzIEFubm90YXRlZEVsZW1lbnQ+Ci0JZXh0ZW5kcyBTb3VyY2VOb2RlCi0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50Ci17Ci0JZmluYWwgRSBhbm5vdGF0ZWRFbGVtZW50OwotCi0JLyoqCi0JICogQW5ub3RhdGlvbnMga2V5ZWQgYnkgYW5ub3RhdGlvbiBuYW1lOwotCSAqIG5vIGR1cGxpY2F0ZXMgKHRoZSBKYXZhIGNvbXBpbGVyIGRvZXMgbm90IGFsbG93IGR1cGxpY2F0ZSBhbm5vdGF0aW9ucykuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBIYXNodGFibGU8U3RyaW5nLCBBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBBbm5vdGF0aW9uPigpOwotCi0JLyoqCi0JICogQ2FjaGUgdGhlIG51bGwgYW5ub3RhdGlvbiBvYmplY3RzIG9yIHRoZXkgd2lsbCBiZSByZWJ1aWx0IG9uIGV2ZXJ5IGFjY2Vzcy4KLQkgKiBNYWtlIHRoaXMgYSBIYXNoTWFwIGZvciBwZXJmb3JtYW5jZSwgbm90IGNvbmNlcm5lZCB3aXRoIGR1cGxpY2F0ZSBjcmVhdGlvbiBhbmQKLQkgKiB1bmxpa2VseSB0aGF0IG11bHRpcGxlIHRocmVhZHMgd2lsbCBhY2Nlc3MgdGhpcy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBBbm5vdGF0aW9uPiBudWxsQW5ub3RhdGlvbkNhY2hlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBbm5vdGF0aW9uPigpOwotCi0JLyoqCi0JICogQW5ub3RhdGlvbiBjb250YWluZXJzIGtleWVkIGJ5IDxlbT5uZXN0YWJsZTwvZW0+IGFubm90YXRpb24gbmFtZS4KLQkgKiBUaGlzIGlzIHVzZWQgdG8gc3RvcmUgYW5ub3RhdGlvbnMgdGhhdCBjYW4gYmUgYm90aCBzdGFuZGFsb25lIGFuZCBuZXN0ZWQKLQkgKiBhbmQgYXJlIG1vdmVkIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIHR3by4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEhhc2h0YWJsZTxTdHJpbmcsIENvbWJpbmF0aW9uQW5ub3RhdGlvbkNvbnRhaW5lcj4gYW5ub3RhdGlvbkNvbnRhaW5lcnMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgQ29tYmluYXRpb25Bbm5vdGF0aW9uQ29udGFpbmVyPigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlTb3VyY2VBbm5vdGF0ZWRFbGVtZW50KEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBFIGFubm90YXRlZEVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5hbm5vdGF0ZWRFbGVtZW50ID0gYW5ub3RhdGVkRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBUaGVyZSBhcmUgMiBpbml0aWFsaXplIGNhbGxzLCAxIGZvciBBU1ROb2RlIGFuZCBvbmUgZm9yIElCaW5kaW5nLgotCSAqIFRoaXMgaXMgYSBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudCBiZWNhdXNlIGZpbmRpbmcgYSBNZXRob2REZWNsYXJhdGlvbgotCSAqIGZvciBhIFNvdXJjZU1ldGhvZCBpcyB2ZXJ5IG5vbi1wZXJmb3JtYW50LiBTb3VyY2VNZXRob2QgYWN0dWFsbHkgb3ZlcnJpZGVzCi0JICogdGhpcyBhcyB1bnN1cHBvcnRlZCBhbmQgaW5zdGVhZCB1c2VzIGluaXRpYWxpemUoTWV0aG9kRGVjbGFyYXRpb24pLgotCSAqIFRPRE8gY29udGludWUgdGhlIHBhdHRlcm4gaW4gU291cmNlTWV0aG9kIHdpdGggdGhlIG90aGVyIGNsYXNzZXMgaW4gdGhpcyBoaWVyYXJjaHkKLQkgKiB0cnlpbmcgbm90IHRvIGNoYW5nZSBtdWNoIEFQSSBpbiAzLjJNNwotCSAqIAotCSAqIFRoaXMgaXMgYWxzbyB0byBoYW5kbGUgbXVsdGlwbGUgZmllbGRzIGRlY2xhcmVkIGluIGEgc2luZ2xlIHN0YXRlbWVudDoKLQkgKiAJCXByaXZhdGUgaW50IGZvbywgYmFyOwotCSAqIEpEVEZpZWxkQXR0cmlidXRlLmdldEJvZHlEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQpIHJldHVybnMgdGhlIEZpZWxkRGVjbGFyYXRpb24KLQkgKiBpbiB0aGUgY2FsbCB0byBnZXRCb2R5RGVjbGFyYXRpb24sIHRoaXMgaXMgdGhlIEFTVE5vZGUgZm9yIGEgZmllbGQgYW5kCi0JICogaGFzIHRoZSBhbm5vdGF0aW9ucyBvbiBpdC4KLQkgKiBKRFRGaWVsZEF0dHJpYnV0ZS5nZXRCaW5kaW5nKENvbXBpbHRhdGlvblVuaXQpIHJldHVybnMgdGhlIElWYXJpYWJsZUJpbmRpbmcgb2YgdGhlIAotCSAqIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB3aGljaCBpcyB0aGUgQVNUTm9kZSBmb3IgdGhlIHBhcnRpY3VsYXIgZmllbGQuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLmluaXRpYWxpemUodGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZSh0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0QmluZGluZyhhc3RSb290KSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShJQmluZGluZyBiaW5kaW5nKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEdhdGhlciB1cCBhbGwgdGhlIHNpZ25pZmljYW50IEFTVCBhbm5vdGF0aW9ucwotCSAqIGFuZCBidWlsZCB0aGUgY29ycmVzcG9uZGluZyBEYWxpIGFubm90YXRpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoQVNUTm9kZSBub2RlKSB7Ci0JCUFubm90YXRpb25WaXNpdG9yIHZpc2l0b3IgPSBuZXcgQW5ub3RhdGlvblZpc2l0b3Iobm9kZSk7Ci0JCW5vZGUuYWNjZXB0KHZpc2l0b3IpOwotCQl0aGlzLmluaXRpYWxpemVBbm5vdGF0aW9ucyh2aXNpdG9yLmFzdEFubm90YXRpb25zKTsKLQkJLy8gY29udGFpbmVyIGFubm90YXRpb25zIHRha2UgcHJlY2VkZW5jZSBvdmVyLi4uCi0JCXRoaXMuaW5pdGlhbGl6ZUNvbnRhaW5lckFubm90YXRpb25zKHZpc2l0b3IuYXN0Q29udGFpbmVyQW5ub3RhdGlvbnMpOwotCQkvLyAuLi5zdGFuZGFsb25lIG5lc3RhYmxlIGFubm90YXRpb25zCi0JCXRoaXMuaW5pdGlhbGl6ZVN0YW5kYWxvbmVOZXN0YWJsZUFubm90YXRpb25zKHZpc2l0b3IuYXN0U3RhbmRhbG9uZU5lc3RhYmxlQW5ub3RhdGlvbnMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQW5ub3RhdGlvbnMoSGFzaE1hcDxTdHJpbmcsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uPiBhc3RBbm5vdGF0aW9ucykgewotCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uPiBlbnRyeSA6IGFzdEFubm90YXRpb25zLmVudHJ5U2V0KCkpIHsKLQkJCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IGVudHJ5LmdldEtleSgpOwotCQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYXN0QW5ub3RhdGlvbiA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbihhbm5vdGF0aW9uTmFtZSk7Ci0JCQlhbm5vdGF0aW9uLmluaXRpYWxpemUoKENvbXBpbGF0aW9uVW5pdCkgYXN0QW5ub3RhdGlvbi5nZXRSb290KCkpOyAgLy8gVE9ETyBwYXNzIHRoZSBBU1QgYW5ub3RhdGlvbiEKLQkJCXRoaXMuYW5ub3RhdGlvbnMucHV0KGFubm90YXRpb25OYW1lLCBhbm5vdGF0aW9uKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQ29udGFpbmVyQW5ub3RhdGlvbnMoSGFzaE1hcDxTdHJpbmcsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uPiBhc3RDb250YWluZXJBbm5vdGF0aW9ucykgewotCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uPiBlbnRyeSA6IGFzdENvbnRhaW5lckFubm90YXRpb25zLmVudHJ5U2V0KCkpIHsKLQkJCVN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSA9IGVudHJ5LmdldEtleSgpOwotCQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYXN0QW5ub3RhdGlvbiA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSA9IHRoaXMuZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZShjb250YWluZXJBbm5vdGF0aW9uTmFtZSk7Ci0JCQlDb21iaW5hdGlvbkFubm90YXRpb25Db250YWluZXIgY29udGFpbmVyID0gbmV3IENvbWJpbmF0aW9uQW5ub3RhdGlvbkNvbnRhaW5lcihuZXN0YWJsZUFubm90YXRpb25OYW1lLCBjb250YWluZXJBbm5vdGF0aW9uTmFtZSk7Ci0JCQljb250YWluZXIuaW5pdGlhbGl6ZUZyb21Db250YWluZXJBbm5vdGF0aW9uKGFzdEFubm90YXRpb24pOwotCQkJdGhpcy5hbm5vdGF0aW9uQ29udGFpbmVycy5wdXQobmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgY29udGFpbmVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplU3RhbmRhbG9uZU5lc3RhYmxlQW5ub3RhdGlvbnMoSGFzaE1hcDxTdHJpbmcsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uPiBhc3RTdGFuZGFsb25lTmVzdGFibGVBbm5vdGF0aW9ucykgewotCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uPiBlbnRyeSA6IGFzdFN0YW5kYWxvbmVOZXN0YWJsZUFubm90YXRpb25zLmVudHJ5U2V0KCkpIHsKLQkJCVN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBhc3RBbm5vdGF0aW9uID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCS8vIGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBhbm5vdGF0aW9uIGNvbnRhaW5lciAoYmVjYXVzZSB0aGVyZSB3YXMgYSBjb250YWluZXIgYW5ub3RhdGlvbikKLQkJCS8vIGlnbm9yZSB0aGUgc3RhbmRhbG9uZSBuZXN0YWJsZSBhbm5vdGF0aW9uCi0JCQlpZiAodGhpcy5hbm5vdGF0aW9uQ29udGFpbmVycy5nZXQobmVzdGFibGVBbm5vdGF0aW9uTmFtZSkgPT0gbnVsbCkgewotCQkJCUNvbWJpbmF0aW9uQW5ub3RhdGlvbkNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgQ29tYmluYXRpb25Bbm5vdGF0aW9uQ29udGFpbmVyKG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOwotCQkJCWNvbnRhaW5lci5pbml0aWFsaXplRnJvbVN0YW5kYWxvbmVBbm5vdGF0aW9uKGFzdEFubm90YXRpb24pOwotCQkJCXRoaXMuYW5ub3RhdGlvbkNvbnRhaW5lcnMucHV0KG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUsIGNvbnRhaW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlICNpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZVdpdGgodGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KSk7Ci0JCXRoaXMuc3luY2hyb25pemVXaXRoKHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRCaW5kaW5nKGFzdFJvb3QpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQVNUTm9kZSBib2R5RGVjbGFyYXRpb24pIHsKLQkJdGhpcy5zeW5jQW5ub3RhdGlvbnMoYm9keURlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZVdpdGgoSUJpbmRpbmcgYmluZGluZykgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYW5ub3RhdGlvbnMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEFubm90YXRpb24+IGdldEFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPEFubm90YXRpb24+KHRoaXMuYW5ub3RhdGlvbnMudmFsdWVzKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QW5ub3RhdGlvbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9ucy5zaXplKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJLy8gVE9ETyBvbmUgcmVhc29uIHdlIHNlYXJjaCB0aGUgY29udGFpbmVycyBpcyB2YWxpZGF0aW9uLCB3ZSBuZWVkIHRvIGhhdmUgc2VwYXJhdGUgQVBJIGZvciBnZXR0aW5nIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbi4KLQkJLy9UaGUgdmFsaWRhdGlvbiBpbiBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nIGlzIGFuIGV4YW1wbGUgCi0JCWlmICh0aGlzLmFubm90YXRpb25Jc1ZhbGlkQ29udGFpbmVyKGFubm90YXRpb25OYW1lKSkgewotCQkJQ29tYmluYXRpb25Bbm5vdGF0aW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IHRoaXMuYW5ub3RhdGlvbkNvbnRhaW5lcnMuZ2V0KHRoaXMuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uTmFtZSkpOwotCQkJcmV0dXJuIChjb250YWluZXIgPT0gbnVsbCkgPyBudWxsIDogY29udGFpbmVyLmdldENvbnRhaW5lckFubm90YXRpb24oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9ucy5nZXQoYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGdldE5vbk51bGxBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLnBlcmZvcm1hbnRHZXRBbm5vdGF0aW9uKGFubm90YXRpb25OYW1lKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uICE9IG51bGwpID8gYW5ub3RhdGlvbiA6IHRoaXMuZ2V0TnVsbEFubm90YXRpb24oYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRPRE8gcGVyZm9ybWFuY2UgLSBoYWNrIGZvciBwZXJmb3JtYW5jZSBzbyB3ZSBkb24ndCBoYXZlIHRvIGJyZWFrIEFQSSBpbiBNNy4KLQkgKiBPdXIgY2FsbHMgdG8gZ2V0Tm9uTnVsbEFubm90YXRpb24gYXJlIG5ldmVyIHVzZWQgZm9yIGNvbnRhaW5lciBhbm5vdGF0aW9ucywgc28gCi0JICogSSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIGF2b2lkIHRoZSBleHBlbnNpdmUge0BsaW5rICNhbm5vdGF0aW9uSXNWYWxpZENvbnRhaW5lcihTdHJpbmcpfSBjaGVjawotCSAqIGluIHtAbGluayAjZ2V0QW5ub3RhdGlvbihTdHJpbmcpfS4gSW4gdGhlIG5leHQgcmVsZWFzZSBJIHRoaW5rIHdlIG5lZWQKLQkgKiB0byBjaGFuZ2UgdGhlIGdlbkFubm90YXRpb24gYXBpIHRvIG5vdCBjaGVjayBmb3IgY29udGFpbmVyIGFubm90YXRpb25zIGFuZCBpbnN0ZWFkIGhhdmUKLQkgKiBzZXBhcmF0ZSBBUEkuIAotCSAqLwotCXByb3RlY3RlZCBBbm5vdGF0aW9uIHBlcmZvcm1hbnRHZXRBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9ucy5nZXQoYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbiBnZXROdWxsQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5udWxsQW5ub3RhdGlvbkNhY2hlLmdldChhbm5vdGF0aW9uTmFtZSk7Ci0JCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCWFubm90YXRpb24gPSB0aGlzLmJ1aWxkTnVsbEFubm90YXRpb24oYW5ub3RhdGlvbk5hbWUpOwotCQkJdGhpcy5udWxsQW5ub3RhdGlvbkNhY2hlLnB1dChhbm5vdGF0aW9uTmFtZSwgYW5ub3RhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldEFubm90YXRpb25Qcm92aWRlcigpLmJ1aWxkTnVsbEFubm90YXRpb24odGhpcywgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uKGFubm90YXRpb25OYW1lKTsKLQkJdGhpcy5hbm5vdGF0aW9ucy5wdXQoYW5ub3RhdGlvbk5hbWUsIGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uLm5ld0Fubm90YXRpb24oKTsKLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5hbm5vdGF0aW9ucy5yZW1vdmUoYW5ub3RhdGlvbk5hbWUpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlhbm5vdGF0aW9uLnJlbW92ZUFubm90YXRpb24oKTsKLQkJfQotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gYm9vbGVhbiBhbm5vdGF0aW9uSXNWYWxpZChTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldEFubm90YXRpb25Qcm92aWRlcigpLmdldEFubm90YXRpb25OYW1lcygpLCBhbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuYnVpbGRBbm5vdGF0aW9uKHRoaXMsIHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb21iaW5hdGlvbiBhbm5vdGF0aW9ucyAqKioqKioqKioqCi0KLQlwcml2YXRlIEl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbj4gZ2V0TmVzdGFibGVBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+KHRoaXMuZ2V0TmVzdGFibGVBbm5vdGF0aW9uTGlzdHMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+PiBnZXROZXN0YWJsZUFubm90YXRpb25MaXN0cygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPENvbWJpbmF0aW9uQW5ub3RhdGlvbkNvbnRhaW5lcl8sIEl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbj4+KHRoaXMuZ2V0QW5ub3RhdGlvbkNvbnRhaW5lcnMoKSwgQU5OT1RBVElPTl9DT05UQUlORVJfTkVTVEVEX0FOTk9UQVRJT05TX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lcjxDb21iaW5hdGlvbkFubm90YXRpb25Db250YWluZXJfLCBJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+PiBBTk5PVEFUSU9OX0NPTlRBSU5FUl9ORVNURURfQU5OT1RBVElPTlNfVFJBTlNGT1JNRVIgPSBuZXcgQW5ub3RhdGlvbkNvbnRhaW5lck5lc3RlZEFubm90YXRpb25zVHJhbnNmb3JtZXIoKTsKLQkvKiBDVSBwcml2YXRlICovIHN0YXRpYyBmaW5hbCBjbGFzcyBBbm5vdGF0aW9uQ29udGFpbmVyTmVzdGVkQW5ub3RhdGlvbnNUcmFuc2Zvcm1lcgotCQlleHRlbmRzIFRyYW5zZm9ybWVyQWRhcHRlcjxDb21iaW5hdGlvbkFubm90YXRpb25Db250YWluZXJfLCBJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+PgotCXsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+IHRyYW5zZm9ybShDb21iaW5hdGlvbkFubm90YXRpb25Db250YWluZXJfIGNvbnRhaW5lcikgewotCQkJcmV0dXJuIGNvbnRhaW5lci5nZXROZXN0ZWRBbm5vdGF0aW9ucygpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSXRlcmFibGU8Q29tYmluYXRpb25Bbm5vdGF0aW9uQ29udGFpbmVyPiBnZXRBbm5vdGF0aW9uQ29udGFpbmVycygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxDb21iaW5hdGlvbkFubm90YXRpb25Db250YWluZXI+KHRoaXMuYW5ub3RhdGlvbkNvbnRhaW5lcnMudmFsdWVzKCkpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8TmVzdGFibGVBbm5vdGF0aW9uPiBnZXRBbm5vdGF0aW9ucyhTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSkgewotCQlDb21iaW5hdGlvbkFubm90YXRpb25Db250YWluZXIgY29udGFpbmVyID0gdGhpcy5hbm5vdGF0aW9uQ29udGFpbmVycy5nZXQobmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JCXJldHVybiAoY29udGFpbmVyICE9IG51bGwpID8gY29udGFpbmVyLmdldE5lc3RlZEFubm90YXRpb25zKCkgOiBFbXB0eUxpc3RJdGVyYWJsZS48TmVzdGFibGVBbm5vdGF0aW9uPiBpbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QW5ub3RhdGlvbnNTaXplKFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKSB7Ci0JCUNvbWJpbmF0aW9uQW5ub3RhdGlvbkNvbnRhaW5lciBjb250YWluZXIgPSB0aGlzLmFubm90YXRpb25Db250YWluZXJzLmdldChuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQkJcmV0dXJuIChjb250YWluZXIgPT0gbnVsbCkgPyAwIDogY29udGFpbmVyLmdldE5lc3RlZEFubm90YXRpb25zU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBOZXN0YWJsZUFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihpbnQgaW5kZXgsIFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKSB7Ci0JCUNvbWJpbmF0aW9uQW5ub3RhdGlvbkNvbnRhaW5lciBjb250YWluZXIgPSB0aGlzLmFubm90YXRpb25Db250YWluZXJzLmdldChuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJzaXplOiAwIGluZGV4OiAiICsgaW5kZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lci5nZXROZXN0ZWRBbm5vdGF0aW9uKGluZGV4KTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS5nZXROZXN0YWJsZUFubm90YXRpb25OYW1lKGNvbnRhaW5lckFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQkvKiBDVSBwcml2YXRlICovIFN0cmluZyBnZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZShTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS5nZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZShuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQkvKiBDVSBwcml2YXRlICovIFN0cmluZyBnZXROZXN0YWJsZUVsZW1lbnROYW1lKFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldEFubm90YXRpb25Qcm92aWRlcigpLmdldE5lc3RhYmxlRWxlbWVudE5hbWUobmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKGludCBpbmRleCwgU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpIHsKLQkJQ29tYmluYXRpb25Bbm5vdGF0aW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IHRoaXMuYW5ub3RhdGlvbkNvbnRhaW5lcnMuZ2V0KG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCWNvbnRhaW5lciA9IG5ldyBDb21iaW5hdGlvbkFubm90YXRpb25Db250YWluZXIobmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JCQl0aGlzLmFubm90YXRpb25Db250YWluZXJzLnB1dChuZXN0YWJsZUFubm90YXRpb25OYW1lLCBjb250YWluZXIpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXIuYWRkTmVzdGVkQW5ub3RhdGlvbihpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKSB7Ci0JCXRoaXMuYW5ub3RhdGlvbkNvbnRhaW5lcnMuZ2V0KG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpLm1vdmVOZXN0ZWRBbm5vdGF0aW9uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihpbnQgaW5kZXgsIFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKSB7Ci0JCUNvbWJpbmF0aW9uQW5ub3RhdGlvbkNvbnRhaW5lciBjb250YWluZXIgPSB0aGlzLmFubm90YXRpb25Db250YWluZXJzLmdldChuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQkJY29udGFpbmVyLnJlbW92ZU5lc3RlZEFubm90YXRpb24oaW5kZXgpOwotCQlpZiAoY29udGFpbmVyLmlzRW1wdHkoKSkgewotCQkJdGhpcy5hbm5vdGF0aW9uQ29udGFpbmVycy5yZW1vdmUobmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKiBDVSBwcml2YXRlICovIGJvb2xlYW4gYW5ub3RhdGlvbklzVmFsaWRDb250YWluZXIoU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS5nZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZXMoKSwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gYm9vbGVhbiBhbm5vdGF0aW9uSXNWYWxpZE5lc3RhYmxlKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZXMoKSwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkTmVzdGFibGVBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmdldEFubm90YXRpb25Qcm92aWRlcigpLmJ1aWxkQW5ub3RhdGlvbih0aGlzLCB0aGlzLmFubm90YXRlZEVsZW1lbnQsIGFubm90YXRpb25OYW1lLCBpbmRleCk7Ci0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyB2b2lkIG5lc3RlZEFubm90YXRpb25BZGRlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE5lc3RhYmxlQW5ub3RhdGlvbiBhZGRlZEFubm90YXRpb24pIHsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKGNvbGxlY3Rpb25OYW1lLCBhZGRlZEFubm90YXRpb24pOwotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gdm9pZCBuZXN0ZWRBbm5vdGF0aW9uc1JlbW92ZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBOZXN0YWJsZUFubm90YXRpb24+IHJlbW92ZWRBbm5vdGF0aW9ucykgewotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRBbm5vdGF0aW9ucyk7Ci0JfQotCi0KLQkvLyAqKioqKiBhbGwgYW5ub3RhdGlvbnMgKioqKioKLQotCUFubm90YXRpb24gc2V0UHJpbWFyeUFubm90YXRpb24oU3RyaW5nIHByaW1hcnlBbm5vdGF0aW9uTmFtZSwgSXRlcmFibGU8U3RyaW5nPiBzdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKSB7Ci0JCS8vIGNsZWFyIG91dCBleHRyYW5lb3VzIGFubm90YXRpb25zCi0JCUhhc2hTZXQ8U3RyaW5nPiBhbm5vdGF0aW9uTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYW5ub3RhdGlvbk5hbWVzLCBzdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKTsKLQkJaWYgKHByaW1hcnlBbm5vdGF0aW9uTmFtZSAhPSBudWxsKSB7Ci0JCQlhbm5vdGF0aW9uTmFtZXMuYWRkKHByaW1hcnlBbm5vdGF0aW9uTmFtZSk7Ci0JCX0KLQkJdGhpcy5yZXRhaW5Bbm5vdGF0aW9ucyhhbm5vdGF0aW9uTmFtZXMpOwotCQl0aGlzLnJldGFpbkFubm90YXRpb25Db250YWluZXJzKGFubm90YXRpb25OYW1lcyk7Ci0KLQkJLy8gYWRkIHRoZSBwcmltYXJ5IGFubm90YXRpb24KLQkJaWYgKHByaW1hcnlBbm5vdGF0aW9uTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlBbm5vdGF0aW9uIHByaW1hcnlBbm5vdGF0aW9uID0gdGhpcy5nZXRBbm5vdGF0aW9uKHByaW1hcnlBbm5vdGF0aW9uTmFtZSk7Ci0JCWlmIChwcmltYXJ5QW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQlwcmltYXJ5QW5ub3RhdGlvbiA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uKHByaW1hcnlBbm5vdGF0aW9uTmFtZSk7Ci0JCQl0aGlzLmFubm90YXRpb25zLnB1dChwcmltYXJ5QW5ub3RhdGlvbk5hbWUsIHByaW1hcnlBbm5vdGF0aW9uKTsKLQkJCXByaW1hcnlBbm5vdGF0aW9uLm5ld0Fubm90YXRpb24oKTsKLQkJfQotCQlyZXR1cm4gcHJpbWFyeUFubm90YXRpb247Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJldGFpbkFubm90YXRpb25zKEhhc2hTZXQ8U3RyaW5nPiBhbm5vdGF0aW9uTmFtZXMpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmFubm90YXRpb25zKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIEFubm90YXRpb24+PiBzdHJlYW0gPSB0aGlzLmFubm90YXRpb25zLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJTWFwLkVudHJ5PFN0cmluZywgQW5ub3RhdGlvbj4gZW50cnkgPSBzdHJlYW0ubmV4dCgpOwotCQkJCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IGVudHJ5LmdldEtleSgpOwotCQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJaWYgKCAhIGFubm90YXRpb25OYW1lcy5jb250YWlucyhhbm5vdGF0aW9uTmFtZSkpIHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCQlhbm5vdGF0aW9uLnJlbW92ZUFubm90YXRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmV0YWluQW5ub3RhdGlvbkNvbnRhaW5lcnMoSGFzaFNldDxTdHJpbmc+IGFubm90YXRpb25OYW1lcykgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMuYW5ub3RhdGlvbkNvbnRhaW5lcnMpIHsKLQkJCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgQ29tYmluYXRpb25Bbm5vdGF0aW9uQ29udGFpbmVyPj4gc3RyZWFtID0gdGhpcy5hbm5vdGF0aW9uQ29udGFpbmVycy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCU1hcC5FbnRyeTxTdHJpbmcsIENvbWJpbmF0aW9uQW5ub3RhdGlvbkNvbnRhaW5lcj4gZW50cnkgPSBzdHJlYW0ubmV4dCgpOwotCQkJCVN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJQ29tYmluYXRpb25Bbm5vdGF0aW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJQW5ub3RhdGlvbiBjb250YWluZXJBbm5vdGF0aW9uID0gY29udGFpbmVyLmdldENvbnRhaW5lckFubm90YXRpb24oKTsKLQkJCQlpZiAoY29udGFpbmVyQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCWlmICggISBhbm5vdGF0aW9uTmFtZXMuY29udGFpbnMoY29udGFpbmVyLmdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkpKSB7Ci0JCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJCQljb250YWluZXJBbm5vdGF0aW9uLnJlbW92ZUFubm90YXRpb24oKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHN0YW5kYWxvbmUgIm5lc3RhYmxlIiBhbm5vdGF0aW9uCi0JCQkJCWlmICggISBhbm5vdGF0aW9uTmFtZXMuY29udGFpbnMobmVzdGFibGVBbm5vdGF0aW9uTmFtZSkpIHsKLQkJCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQkJCWNvbnRhaW5lci5nZXROZXN0ZWRBbm5vdGF0aW9uKDApLnJlbW92ZUFubm90YXRpb24oKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdhdGhlciB1cCBhbGwgdGhlIHNpZ25pZmljYW50IEFTVCBhbm5vdGF0aW9ucwotCSAqIGFuZCBhZGQgb3Igc3luYyB0aGUgY29ycmVzcG9uZGluZyBEYWxpIGFubm90YXRpb25zLgotCSAqLwotCXByaXZhdGUgdm9pZCBzeW5jQW5ub3RhdGlvbnMoQVNUTm9kZSBub2RlKSB7Ci0JCUFubm90YXRpb25WaXNpdG9yIHZpc2l0b3IgPSBuZXcgQW5ub3RhdGlvblZpc2l0b3Iobm9kZSk7Ci0JCW5vZGUuYWNjZXB0KHZpc2l0b3IpOwotCQl0aGlzLnN5bmNBbm5vdGF0aW9ucyh2aXNpdG9yLmFzdEFubm90YXRpb25zKTsKLQkJdGhpcy5zeW5jQW5ub3RhdGlvbkNvbnRhaW5lcnModmlzaXRvci5hc3RDb250YWluZXJBbm5vdGF0aW9ucywgdmlzaXRvci5hc3RTdGFuZGFsb25lTmVzdGFibGVBbm5vdGF0aW9ucyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNBbm5vdGF0aW9ucyhIYXNoTWFwPFN0cmluZywgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24+IGFzdEFubm90YXRpb25zKSB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uc1RvUmVtb3ZlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBbm5vdGF0aW9uPih0aGlzLmFubm90YXRpb25zKTsKLQkJSGFzaE1hcDxTdHJpbmcsIEFubm90YXRpb24+IGFubm90YXRpb25zVG9BZGQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFubm90YXRpb24+KCk7Ci0JCWZvciAoTWFwLkVudHJ5PFN0cmluZywgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24+IGVudHJ5IDogYXN0QW5ub3RhdGlvbnMuZW50cnlTZXQoKSkgewotCQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBhc3RBbm5vdGF0aW9uID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFubm90YXRpb25zVG9SZW1vdmUucmVtb3ZlKGFubm90YXRpb25OYW1lKTsKLQkJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCQlhbm5vdGF0aW9uID0gdGhpcy5idWlsZEFubm90YXRpb24oYW5ub3RhdGlvbk5hbWUpOwotCQkJCWFubm90YXRpb24uaW5pdGlhbGl6ZSgoQ29tcGlsYXRpb25Vbml0KSBhc3RBbm5vdGF0aW9uLmdldFJvb3QoKSk7ICAvLyBUT0RPIHBhc3MgdGhlIEFTVCBhbm5vdGF0aW9uIQotCQkJCWFubm90YXRpb25zVG9BZGQucHV0KGFubm90YXRpb25OYW1lLCBhbm5vdGF0aW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYW5ub3RhdGlvbi5zeW5jaHJvbml6ZVdpdGgoKENvbXBpbGF0aW9uVW5pdCkgYXN0QW5ub3RhdGlvbi5nZXRSb290KCkpOyAgLy8gVE9ETyBwYXNzIHRoZSBBU1QgYW5ub3RhdGlvbiEKLQkJCX0KLQkJfQotCi0JCWZvciAoU3RyaW5nIGFubm90YXRpb25OYW1lIDogYW5ub3RhdGlvbnNUb1JlbW92ZS5rZXlTZXQoKSkgewotCQkJdGhpcy5hbm5vdGF0aW9ucy5yZW1vdmUoYW5ub3RhdGlvbk5hbWUpOwotCQl9Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChBTk5PVEFUSU9OU19DT0xMRUNUSU9OLCBhbm5vdGF0aW9uc1RvUmVtb3ZlLnZhbHVlcygpKTsKLQotCQl0aGlzLmFubm90YXRpb25zLnB1dEFsbChhbm5vdGF0aW9uc1RvQWRkKTsKLQkJdGhpcy5maXJlSXRlbXNBZGRlZChBTk5PVEFUSU9OU19DT0xMRUNUSU9OLCBhbm5vdGF0aW9uc1RvQWRkLnZhbHVlcygpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0Fubm90YXRpb25Db250YWluZXJzKEhhc2hNYXA8U3RyaW5nLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbj4gYXN0Q29udGFpbmVyQW5ub3RhdGlvbnMsIEhhc2hNYXA8U3RyaW5nLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbj4gYXN0U3RhbmRhbG9uZU5lc3RhYmxlQW5ub3RhdGlvbnMpIHsKLQkJSGFzaE1hcDxTdHJpbmcsIENvbWJpbmF0aW9uQW5ub3RhdGlvbkNvbnRhaW5lcj4gY29udGFpbmVyc1RvUmVtb3ZlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb21iaW5hdGlvbkFubm90YXRpb25Db250YWluZXI+KHRoaXMuYW5ub3RhdGlvbkNvbnRhaW5lcnMpOwotCQlIYXNoTWFwPFN0cmluZywgQ29tYmluYXRpb25Bbm5vdGF0aW9uQ29udGFpbmVyPiBjb250YWluZXJzVG9BZGQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbWJpbmF0aW9uQW5ub3RhdGlvbkNvbnRhaW5lcj4oKTsKLQotCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uPiBlbnRyeSA6IGFzdENvbnRhaW5lckFubm90YXRpb25zLmVudHJ5U2V0KCkpIHsKLQkJCVN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSA9IGVudHJ5LmdldEtleSgpOwotCQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYXN0Q29udGFpbmVyQW5ub3RhdGlvbiA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSA9IHRoaXMuZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZShjb250YWluZXJBbm5vdGF0aW9uTmFtZSk7Ci0JCQlDb21iaW5hdGlvbkFubm90YXRpb25Db250YWluZXIgY29udGFpbmVyID0gY29udGFpbmVyc1RvUmVtb3ZlLnJlbW92ZShuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQkJCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJCWNvbnRhaW5lciA9IG5ldyBDb21iaW5hdGlvbkFubm90YXRpb25Db250YWluZXIobmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpOwotCQkJCWNvbnRhaW5lci5pbml0aWFsaXplRnJvbUNvbnRhaW5lckFubm90YXRpb24oYXN0Q29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCQkJY29udGFpbmVyc1RvQWRkLnB1dChuZXN0YWJsZUFubm90YXRpb25OYW1lLCBjb250YWluZXIpOwotCQkJfSBlbHNlIHsKLQkJCQljb250YWluZXIuc3luY2hyb25pemUoYXN0Q29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCQl9Ci0JCQkvLyBpZiBpdCBleGlzdHMsIHN0cmlwIG91dCB0aGUgc3RhbmRhbG9uZSBhbm5vdGF0aW9uCi0JCQkvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IGNvbnRhaW5lciBhbm5vdGF0aW9uCi0JCQlhc3RTdGFuZGFsb25lTmVzdGFibGVBbm5vdGF0aW9ucy5yZW1vdmUobmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JCX0KLQotCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uPiBlbnRyeSA6IGFzdFN0YW5kYWxvbmVOZXN0YWJsZUFubm90YXRpb25zLmVudHJ5U2V0KCkpIHsKLQkJCVN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBhc3ROZXN0YWJsZUFubm90YXRpb24gPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJQ29tYmluYXRpb25Bbm5vdGF0aW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IGNvbnRhaW5lcnNUb1JlbW92ZS5yZW1vdmUobmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCQljb250YWluZXIgPSBuZXcgQ29tYmluYXRpb25Bbm5vdGF0aW9uQ29udGFpbmVyKG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOwotCQkJCWNvbnRhaW5lci5pbml0aWFsaXplRnJvbVN0YW5kYWxvbmVBbm5vdGF0aW9uKGFzdE5lc3RhYmxlQW5ub3RhdGlvbik7Ci0JCQkJY29udGFpbmVyc1RvQWRkLnB1dChuZXN0YWJsZUFubm90YXRpb25OYW1lLCBjb250YWluZXIpOwotCQkJfSBlbHNlIHsKLQkJCQljb250YWluZXIuc3luY2hyb25pemVOZXN0YWJsZUFubm90YXRpb24oYXN0TmVzdGFibGVBbm5vdGF0aW9uKTsKLQkJCX0KLQkJfQotCi0JCUFycmF5TGlzdDxOZXN0YWJsZUFubm90YXRpb24+IHJlbW92ZWROZXN0YWJsZUFubm90YXRpb25zID0gbmV3IEFycmF5TGlzdDxOZXN0YWJsZUFubm90YXRpb24+KCk7Ci0JCWZvciAoU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUgOiBjb250YWluZXJzVG9SZW1vdmUua2V5U2V0KCkpIHsKLQkJCUNvbWJpbmF0aW9uQW5ub3RhdGlvbkNvbnRhaW5lciBjb250YWluZXIgPSB0aGlzLmFubm90YXRpb25Db250YWluZXJzLnJlbW92ZShuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwocmVtb3ZlZE5lc3RhYmxlQW5ub3RhdGlvbnMsIGNvbnRhaW5lci5nZXROZXN0ZWRBbm5vdGF0aW9ucygpKTsKLQkJfQotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoTkVTVEFCTEVfQU5OT1RBVElPTlNfQ09MTEVDVElPTiwgcmVtb3ZlZE5lc3RhYmxlQW5ub3RhdGlvbnMpOwotCi0JCUFycmF5TGlzdDxOZXN0YWJsZUFubm90YXRpb24+IGFkZGVkTmVzdGFibGVBbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8TmVzdGFibGVBbm5vdGF0aW9uPigpOwotCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIENvbWJpbmF0aW9uQW5ub3RhdGlvbkNvbnRhaW5lcj4gZW50cnkgOiBjb250YWluZXJzVG9BZGQuZW50cnlTZXQoKSkgewotCQkJU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCUNvbWJpbmF0aW9uQW5ub3RhdGlvbkNvbnRhaW5lciBjb250YWluZXIgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJdGhpcy5hbm5vdGF0aW9uQ29udGFpbmVycy5wdXQobmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgY29udGFpbmVyKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYWRkZWROZXN0YWJsZUFubm90YXRpb25zLCBjb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbnMoKSk7Ci0JCX0KLQkJdGhpcy5maXJlSXRlbXNBZGRlZChORVNUQUJMRV9BTk5PVEFUSU9OU19DT0xMRUNUSU9OLCBhZGRlZE5lc3RhYmxlQW5ub3RhdGlvbnMpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxBbm5vdGF0aW9uPiBnZXRUb3BMZXZlbEFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEFubm90YXRpb24+KAotCQkJCQl0aGlzLmdldEFubm90YXRpb25zKCksCi0JCQkJCXRoaXMuZ2V0Q29udGFpbmVyT3JTdGFuZGFsb25lTmVzdGFibGVBbm5vdGF0aW9ucygpCi0JCQkJKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEFubm90YXRpb24+IGdldENvbnRhaW5lck9yU3RhbmRhbG9uZU5lc3RhYmxlQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxDb21iaW5hdGlvbkFubm90YXRpb25Db250YWluZXJfLCBBbm5vdGF0aW9uPih0aGlzLmdldEFubm90YXRpb25Db250YWluZXJzKCksIFRPUF9MRVZFTF9BTk5PVEFUSU9OX0NPTlRBSU5FUl9UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXI8Q29tYmluYXRpb25Bbm5vdGF0aW9uQ29udGFpbmVyXywgQW5ub3RhdGlvbj4gVE9QX0xFVkVMX0FOTk9UQVRJT05fQ09OVEFJTkVSX1RSQU5TRk9STUVSID0gbmV3IFRvcExldmVsQW5ub3RhdGlvbkNvbnRhaW5lclRyYW5zZm9ybWVyKCk7Ci0Jc3RhdGljIGZpbmFsIGNsYXNzIFRvcExldmVsQW5ub3RhdGlvbkNvbnRhaW5lclRyYW5zZm9ybWVyCi0JCWV4dGVuZHMgVHJhbnNmb3JtZXJBZGFwdGVyPENvbWJpbmF0aW9uQW5ub3RhdGlvbkNvbnRhaW5lcl8sIEFubm90YXRpb24+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFubm90YXRpb24gdHJhbnNmb3JtKENvbWJpbmF0aW9uQW5ub3RhdGlvbkNvbnRhaW5lcl8gY29udGFpbmVyKSB7Ci0JCQlBbm5vdGF0aW9uIGNvbnRhaW5lckFubm90YXRpb24gPSBjb250YWluZXIuZ2V0Q29udGFpbmVyQW5ub3RhdGlvbigpOwotCQkJcmV0dXJuIChjb250YWluZXJBbm5vdGF0aW9uICE9IG51bGwpID8gY29udGFpbmVyQW5ub3RhdGlvbiA6IGNvbnRhaW5lci5nZXROZXN0ZWRBbm5vdGF0aW9uKDApOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBbm5vdGF0ZWQoKSB7Ci0JCXJldHVybiAhIHRoaXMuaXNVbmFubm90YXRlZCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVW5hbm5vdGF0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRpb25zLmlzRW1wdHkoKSAmJiB0aGlzLmFubm90YXRpb25Db250YWluZXJzLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRlZFdpdGhBbnlPZihJdGVyYWJsZTxTdHJpbmc+IGFubm90YXRpb25OYW1lcykgewotCQlmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IHRoaXMuZ2V0U2lnbmlmaWNhbnRBbm5vdGF0aW9ucygpKSB7Ci0JCQlpZiAoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGFubm90YXRpb25OYW1lcywgYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJzaWduaWZpY2FudCIgYW5ub3RhdGlvbnM7Ci0JICogaS5lLiBpZ25vcmUgdGhlIGNvbnRhaW5lciBhbm5vdGF0aW9ucyAodGhleSBoYXZlIG5vIHNlbWFudGljcykuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBJdGVyYWJsZTxBbm5vdGF0aW9uPiBnZXRTaWduaWZpY2FudEFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEFubm90YXRpb24+KAotCQkJCQl0aGlzLmdldEFubm90YXRpb25zKCksCi0JCQkJCXRoaXMuZ2V0TmVzdGFibGVBbm5vdGF0aW9ucygpCi0JCQkJKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyB0aGUgQVNUIGlzIG51bGwgZm9yIHZpcnR1YWwgSmF2YSBhdHRyaWJ1dGVzCi0JCS8vIFRPRE8gcmVtb3ZlIHRoZSBBU1QgbnVsbCBjaGVjayBvbmNlIHdlIHN0YXJ0IHN0b3JpbmcgdGV4dCByYW5nZXMKLQkJLy8gaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJldHVybiAoYXN0Um9vdCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkVGV4dFJhbmdlKHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyB0aGUgQVNUIGlzIG51bGwgZm9yIHZpcnR1YWwgSmF2YSBhdHRyaWJ1dGVzCi0JCS8vIFRPRE8gcmVtb3ZlIHRoZSBBU1QgbnVsbCBjaGVjayBvbmNlIHdlIHN0YXJ0IHN0b3JpbmcgdGV4dCByYW5nZXMKLQkJLy8gaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJldHVybiAoYXN0Um9vdCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQ29tYmluYXRpb25Bbm5vdGF0aW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IHRoaXMuYW5ub3RhdGlvbkNvbnRhaW5lcnMuZ2V0KG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGNvbnRhaW5lci5nZXRDb250YWluZXJBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCWFubm90YXRpb24gPSBjb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbigwKTsKLQkJfQotCQlyZXR1cm4gYW5ub3RhdGlvbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0UmFuZ2UgYnVpbGRUZXh0UmFuZ2UoQVNUTm9kZSBhc3ROb2RlKSB7Ci0JCXJldHVybiAoYXN0Tm9kZSA9PSBudWxsKSA/IG51bGwgOiBBU1RUb29scy5idWlsZFRleHRSYW5nZShhc3ROb2RlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQVNUIHZpc2l0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBhbm5vdGF0aW9uIHZpc2l0b3IgZ2F0aGVycyB1cCBhbGwgdGhlIDxlbT5zaWduaWZpY2FudDwvZW0+Ci0JICogKGkuZS4gbm9uLWR1cGxpY2F0ZSB3aXRoIGEgdmFsaWQgbmFtZSkgQVNUIGFubm90YXRpb25zCi0JICogY29udGFpbmVyIGFubm90YXRpb25zIGFuZCBzdGFuZGFsb25lIG5lc3RhYmxlIGFubm90YXRpb25zIGZvciBpdHMKLQkgKiB7QGxpbmsgI25vZGV9LgotCSAqLwotCS8qIENVIHByaXZhdGUgKi8gY2xhc3MgQW5ub3RhdGlvblZpc2l0b3IKLQkJCWV4dGVuZHMgQVNUVmlzaXRvcgotCXsKLQkJcHJpdmF0ZSBmaW5hbCBBU1ROb2RlIG5vZGU7Ci0JCWZpbmFsIEhhc2hNYXA8U3RyaW5nLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbj4gYXN0QW5ub3RhdGlvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uPigpOwotCQlmaW5hbCBIYXNoTWFwPFN0cmluZywgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24+IGFzdENvbnRhaW5lckFubm90YXRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbj4oKTsKLQkJZmluYWwgSGFzaE1hcDxTdHJpbmcsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uPiBhc3RTdGFuZGFsb25lTmVzdGFibGVBbm5vdGF0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24+KCk7Ci0KLQkJQW5ub3RhdGlvblZpc2l0b3IoQVNUTm9kZSBub2RlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5ub2RlID0gbm9kZTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJCXJldHVybiB0aGlzLnZpc2l0Xyhhbm5vdGF0aW9uKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJCXJldHVybiB0aGlzLnZpc2l0Xyhhbm5vdGF0aW9uKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNYXJrZXJBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJCXJldHVybiB0aGlzLnZpc2l0Xyhhbm5vdGF0aW9uKTsKLQkJfQotCi0JCS8qKgotCQkgKiBQcm9jZXNzIG9ubHkgdGhlIGFubm90YXRpb25zIGZvciB0aGUge0BsaW5rICNub2RlfTsgaWdub3JlIGFueSBjaGlsZHJlbi4KLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiB2aXNpdF8ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYXN0QW5ub3RhdGlvbikgewotCQkJaWYgKGFzdEFubm90YXRpb24uZ2V0UGFyZW50KCkgPT0gdGhpcy5ub2RlKSB7Ci0JCQkJdGhpcy52aXNpdENoaWxkQW5ub3RhdGlvbihhc3RBbm5vdGF0aW9uKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsgIC8vID0+IGRvICpub3QqIHZpc2l0IGNoaWxkcmVuCi0JCX0KLQotCQkvKioKLQkJICogRm9yIGVhY2ggYW5ub3RhdGlvbiBuYW1lIHdlIHNhdmUgb25seSB0aGUgZmlyc3Qgb25lCi0JCSAqIGFuZCBpZ25vcmUgZHVwbGljYXRlcy4KLQkJICovCi0JCXByaXZhdGUgdm9pZCB2aXNpdENoaWxkQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBhc3RBbm5vdGF0aW9uKSB7Ci0JCQlTdHJpbmcgYXN0QW5ub3RhdGlvbk5hbWUgPSB0aGlzLnJlc29sdmVBbm5vdGF0aW9uTmFtZShhc3RBbm5vdGF0aW9uKTsKLQkJCWlmIChhc3RBbm5vdGF0aW9uTmFtZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy8gY2hlY2sgd2hldGhlciB0aGUgYW5ub3RhdGlvbiBpcyBhIHZhbGlkIGNvbnRhaW5lciBhbm5vdGF0aW9uIGZpcnN0Ci0JCQkvLyBiZWNhdXNlIGNvbnRhaW5lciB2YWxpZGF0aW9ucyBhcmUgYWxzbyB2YWxpZCBhbm5vdGF0aW9ucwotCQkJLy8gVE9ETyByZW1vdmUgY29udGFpbmVyIGFubm90YXRpb25zIGZyb20gbGlzdCBvZiBhbm5vdGF0aW9ucz8/PwotCQkJaWYgKFNvdXJjZUFubm90YXRlZEVsZW1lbnQudGhpcy5hbm5vdGF0aW9uSXNWYWxpZENvbnRhaW5lcihhc3RBbm5vdGF0aW9uTmFtZSkpIHsKLQkJCQlpZiAodGhpcy5hc3RDb250YWluZXJBbm5vdGF0aW9ucy5nZXQoYXN0QW5ub3RhdGlvbk5hbWUpID09IG51bGwpIHsKLQkJCQkJdGhpcy5hc3RDb250YWluZXJBbm5vdGF0aW9ucy5wdXQoYXN0QW5ub3RhdGlvbk5hbWUsIGFzdEFubm90YXRpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKFNvdXJjZUFubm90YXRlZEVsZW1lbnQudGhpcy5hbm5vdGF0aW9uSXNWYWxpZChhc3RBbm5vdGF0aW9uTmFtZSkpIHsKLQkJCQlpZiAodGhpcy5hc3RBbm5vdGF0aW9ucy5nZXQoYXN0QW5ub3RhdGlvbk5hbWUpID09IG51bGwpIHsKLQkJCQkJdGhpcy5hc3RBbm5vdGF0aW9ucy5wdXQoYXN0QW5ub3RhdGlvbk5hbWUsIGFzdEFubm90YXRpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKFNvdXJjZUFubm90YXRlZEVsZW1lbnQudGhpcy5hbm5vdGF0aW9uSXNWYWxpZE5lc3RhYmxlKGFzdEFubm90YXRpb25OYW1lKSkgewotCQkJCWlmICh0aGlzLmFzdFN0YW5kYWxvbmVOZXN0YWJsZUFubm90YXRpb25zLmdldChhc3RBbm5vdGF0aW9uTmFtZSkgPT0gbnVsbCkgewotCQkJCQl0aGlzLmFzdFN0YW5kYWxvbmVOZXN0YWJsZUFubm90YXRpb25zLnB1dChhc3RBbm5vdGF0aW9uTmFtZSwgYXN0QW5ub3RhdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24ncyAoZnVsbHktcXVhbGlmaWVkKSBjbGFzcyBuYW1lLgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZUFubm90YXRpb25OYW1lKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGFzdEFubm90YXRpb24pIHsKLQkJCUlBbm5vdGF0aW9uQmluZGluZyBhbm5vdGF0aW9uQmluZGluZyA9IGFzdEFubm90YXRpb24ucmVzb2x2ZUFubm90YXRpb25CaW5kaW5nKCk7Ci0JCQlpZiAoYW5ub3RhdGlvbkJpbmRpbmcgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJSVR5cGVCaW5kaW5nIGFubm90YXRpb25UeXBlQmluZGluZyA9IGFubm90YXRpb25CaW5kaW5nLmdldEFubm90YXRpb25UeXBlKCk7Ci0JCQlyZXR1cm4gKGFubm90YXRpb25UeXBlQmluZGluZyA9PSBudWxsKSA/IG51bGwgOiBhbm5vdGF0aW9uVHlwZUJpbmRpbmcuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBub2RlKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBhbm5vdGF0aW9uIGNvbnRhaW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBVc2UgdGhpcyBpbnRlcmZhY2UgdG8gbWFrZSBzdGF0aWMgcmVmZXJlbmNlcyB0byB0aGUgYW5ub3RhdGlvbiBjb250YWluZXIuCi0JICogU29ydCBvZiBhIGhhY2suLi4uCi0JICogQHNlZSBBbm5vdGF0aW9uQ29udGFpbmVyTmVzdGVkQW5ub3RhdGlvbnNUcmFuc2Zvcm1lcgotCSAqIEBzZWUgVG9wTGV2ZWxBbm5vdGF0aW9uQ29udGFpbmVyVHJhbnNmb3JtZXIKLQkgKi8KLQlwcml2YXRlIGludGVyZmFjZSBDb21iaW5hdGlvbkFubm90YXRpb25Db250YWluZXJfIHsKLQkJQW5ub3RhdGlvbiBnZXRDb250YWluZXJBbm5vdGF0aW9uKCk7Ci0JCUxpc3RJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+IGdldE5lc3RlZEFubm90YXRpb25zKCk7Ci0JCU5lc3RhYmxlQW5ub3RhdGlvbiBnZXROZXN0ZWRBbm5vdGF0aW9uKGludCBpbmRleCk7Ci0JfQotCi0KLQkvKioKLQkgKiBBbm5vdGF0aW9uIGNvbnRhaW5lciBmb3IgdG9wLWxldmVsICJjb21iaW5hdGlvbiIgYW5ub3RhdGlvbnMgdGhhdCBhbGxvdwotCSAqIGEgc2luZ2xlIG5lc3RhYmxlIGFubm90YXRpb24gdG8gc3RhbmQgYWxvbmUsIG91dHNpZGUgb2YgaXRzIHN0YW5kYXJkCi0JICogY29udGFpbmVyIGFubm90YXRpb24sIGFuZCByZXByZXNlbnQgYSBzaW5nbGUtZWxlbWVudCBhcnJheS4KLQkgKi8KLQkvKiBDVSBwcml2YXRlICovIGNsYXNzIENvbWJpbmF0aW9uQW5ub3RhdGlvbkNvbnRhaW5lcgotCQlleHRlbmRzIEFubm90YXRpb25Db250YWluZXI8TmVzdGFibGVBbm5vdGF0aW9uPgotCQlpbXBsZW1lbnRzIENvbWJpbmF0aW9uQW5ub3RhdGlvbkNvbnRhaW5lcl8KLQl7Ci0JCS8qKgotCQkgKiBUaGUgbmFtZSBvZiB0aGUgbmVzdGFibGUgYW5ub3RhdGlvbiB0aGF0IGJlIGVpdGhlciBhIHRvcC1sZXZlbAotCQkgKiBzdGFuZGFsb25lIGFubm90YXRpb24gb3IgbmVzdGVkIHdpdGhpbiB0aGUgY29udGFpbmVyIGFubm90YXRpb24uCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lOwotCi0JCS8qKgotCQkgKiBUaGUgbmFtZSBvZiB0aGUgY29udGFpbmVyIGFubm90YXRpb24sIHVzZWQgdG8gYnVpbGQgdGhlCi0JCSAqIHtAbGluayAjY29udGFpbmVyQW5ub3RhdGlvbiBjb250YWluZXIgYW5ub3RhdGlvbn0gYXMgbmVjZXNzYXJ5LgotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29udGFpbmVyQW5ub3RhdGlvbk5hbWU7Ci0KLQkJLyoqCi0JCSAqIFRoaXMgaXMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGNvbnRhaW5lciBhbm5vdGF0aW9uIGRvZXMgbm90IGV4aXN0Ci0JCSAqIGJ1dCB0aGUgc3RhbmRhbG9uZSBuZXN0YWJsZSBhbm5vdGF0aW9uIGRvZXMuCi0JCSAqLwotCQlwcml2YXRlIEFubm90YXRpb24gY29udGFpbmVyQW5ub3RhdGlvbjsKLQotCi0JCUNvbWJpbmF0aW9uQW5ub3RhdGlvbkNvbnRhaW5lcihTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSkgewotCQkJdGhpcyhuZXN0YWJsZUFubm90YXRpb25OYW1lLCBTb3VyY2VBbm5vdGF0ZWRFbGVtZW50LnRoaXMuZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWUobmVzdGFibGVBbm5vdGF0aW9uTmFtZSkpOwotCQl9Ci0KLQkJQ29tYmluYXRpb25Bbm5vdGF0aW9uQ29udGFpbmVyKFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lLCBTdHJpbmcgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQlpZiAoKG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUgPT0gbnVsbCkgfHwgKGNvbnRhaW5lckFubm90YXRpb25OYW1lID09IG51bGwpKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLm5lc3RhYmxlQW5ub3RhdGlvbk5hbWUgPSBuZXN0YWJsZUFubm90YXRpb25OYW1lOwotCQkJdGhpcy5jb250YWluZXJBbm5vdGF0aW9uTmFtZSA9IGNvbnRhaW5lckFubm90YXRpb25OYW1lOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tQ29udGFpbmVyQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBhc3RDb250YWluZXJBbm5vdGF0aW9uKSB7Ci0JCQlzdXBlci5pbml0aWFsaXplRnJvbUNvbnRhaW5lckFubm90YXRpb24oYXN0Q29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCQl0aGlzLmNvbnRhaW5lckFubm90YXRpb24gPSB0aGlzLmJ1aWxkQ29udGFpbmVyQW5ub3RhdGlvbih0aGlzLmNvbnRhaW5lckFubm90YXRpb25OYW1lKTsKLQkJfQotCi0JCXByaXZhdGUgQW5ub3RhdGlvbiBidWlsZENvbnRhaW5lckFubm90YXRpb24oU3RyaW5nIG5hbWUpIHsKLQkJCXJldHVybiBTb3VyY2VBbm5vdGF0ZWRFbGVtZW50LnRoaXMuYnVpbGRBbm5vdGF0aW9uKG5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gZ2V0Q29udGFpbmVyQW5ub3RhdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmNvbnRhaW5lckFubm90YXRpb247Ci0JCX0KLQotCQlTdHJpbmcgZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb250YWluZXJBbm5vdGF0aW9uTmFtZTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGVsZW1lbnQgbmFtZSBvZiB0aGUgbmVzdGVkIGFubm90YXRpb25zCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJCXJldHVybiBTb3VyY2VBbm5vdGF0ZWRFbGVtZW50LnRoaXMuZ2V0TmVzdGFibGVFbGVtZW50TmFtZSh0aGlzLm5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmVzdGVkIGFubm90YXRpb24gbmFtZQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmVzdGVkQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uZXN0YWJsZUFubm90YXRpb25OYW1lOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBhIG5ldyBuZXN0ZWQgYW5ub3RhdGlvbiBhdCB0aGUgZ2l2ZW4gaW5kZXgKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkTmVzdGVkQW5ub3RhdGlvbihpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBTb3VyY2VBbm5vdGF0ZWRFbGVtZW50LnRoaXMuYnVpbGROZXN0YWJsZUFubm90YXRpb24odGhpcy5uZXN0YWJsZUFubm90YXRpb25OYW1lLCBpbmRleCk7Ci0JCX0KLQotCQl2b2lkIGluaXRpYWxpemVGcm9tU3RhbmRhbG9uZUFubm90YXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYXN0U3RhbmRhbG9uZU5lc3RhYmxlQW5ub3RhdGlvbikgewotCQkJTmVzdGFibGVBbm5vdGF0aW9uIG5lc3RlZEFubm90YXRpb24gPSB0aGlzLmJ1aWxkTmVzdGVkQW5ub3RhdGlvbigwKTsKLQkJCXRoaXMubmVzdGVkQW5ub3RhdGlvbnMuYWRkKG5lc3RlZEFubm90YXRpb24pOwotCQkJbmVzdGVkQW5ub3RhdGlvbi5pbml0aWFsaXplKChDb21waWxhdGlvblVuaXQpIGFzdFN0YW5kYWxvbmVOZXN0YWJsZUFubm90YXRpb24uZ2V0Um9vdCgpKTsgIC8vIFRPRE8gcGFzcyB0aGUgQVNUIGFubm90YXRpb24hCi0JCX0KLQotCQkvKioKLQkJICogSWYgd2UgZ2V0IGhlcmUsIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbiBkb2VzIDxlbT5ub3Q8L2VtPiBleGlzdCBidXQKLQkJICogdGhlIHN0YW5kYWxvbmUgbmVzdGFibGUgYW5ub3RhdGlvbiBkb2VzLgotCQkgKi8KLQkJdm9pZCBzeW5jaHJvbml6ZU5lc3RhYmxlQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBhc3RTdGFuZGFsb25lTmVzdGFibGVBbm5vdGF0aW9uKSB7Ci0JCQlpZiAodGhpcy5uZXN0ZWRBbm5vdGF0aW9ucy5zaXplKCkgPT0gMCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsgIC8vIHNob3VsZCBub3QgZ2V0IGhlcmUuLi4KLQkJCX0KLQotCQkJdGhpcy5jb250YWluZXJBbm5vdGF0aW9uID0gbnVsbDsKLQkJCXRoaXMubmVzdGVkQW5ub3RhdGlvbnMuZ2V0KDApLnN5bmNocm9uaXplV2l0aCgoQ29tcGlsYXRpb25Vbml0KSBhc3RTdGFuZGFsb25lTmVzdGFibGVBbm5vdGF0aW9uLmdldFJvb3QoKSk7ICAvLyBUT0RPIHBhc3MgdGhlIEFTVCBhbm5vdGF0aW9uIQotCQkJLy8gcmVtb3ZlIGFueSByZW1haW5pbmcgbmVzdGVkIGFubm90YXRpb25zCi0JCQl0aGlzLnN5bmNSZW1vdmVOZXN0ZWRBbm5vdGF0aW9ucygxKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGFkZE5lc3RlZEFubm90YXRpb24oaW50IGluZGV4KSB7Ci0JCQlpZiAoKHRoaXMubmVzdGVkQW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpICYmICh0aGlzLmNvbnRhaW5lckFubm90YXRpb24gPT0gbnVsbCkpIHsKLQkJCQl0aGlzLmNvbnRhaW5lckFubm90YXRpb24gPSB0aGlzLmJ1aWxkQ29udGFpbmVyQW5ub3RhdGlvbih0aGlzLmNvbnRhaW5lckFubm90YXRpb25OYW1lKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5hZGROZXN0ZWRBbm5vdGF0aW9uKGluZGV4KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIHJlbW92ZU5lc3RlZEFubm90YXRpb24oaW50IGluZGV4KSB7Ci0JCQlpZiAodGhpcy5uZXN0ZWRBbm5vdGF0aW9ucy5zaXplKCkgPT0gMikgewotCQkJCXRoaXMuY29udGFpbmVyQW5ub3RhdGlvbiA9IG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIucmVtb3ZlTmVzdGVkQW5ub3RhdGlvbihpbmRleCk7Ci0JCX0KLQotCQkvKioKLQkJICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gVGhpcyBpcyBhIDxlbT5jb2xsZWN0aW9uPC9lbT4gbmFtZS4KLQkJICogQHNlZSAjbmVzdGVkQW5ub3RhdGlvbkFkZGVkKGludCwgTmVzdGFibGVBbm5vdGF0aW9uKQotCQkgKiBAc2VlICNuZXN0ZWRBbm5vdGF0aW9uc1JlbW92ZWQoaW50LCBMaXN0KQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmVzdGVkQW5ub3RhdGlvbnNMaXN0TmFtZSgpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IENvbnZlcnQgdG8gYSA8ZW0+Y29sbGVjdGlvbjwvZW0+IGNoYW5nZS4KLQkJICovCi0JCUBPdmVycmlkZQotCQl2b2lkIG5lc3RlZEFubm90YXRpb25BZGRlZChpbnQgaW5kZXgsIE5lc3RhYmxlQW5ub3RhdGlvbiBhZGRlZEFubm90YXRpb24pIHsKLQkJCVNvdXJjZUFubm90YXRlZEVsZW1lbnQudGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRkZWQoTkVTVEFCTEVfQU5OT1RBVElPTlNfQ09MTEVDVElPTiwgYWRkZWRBbm5vdGF0aW9uKTsKLQkJfQotCi0JCS8qKgotCQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBDb252ZXJ0IHRvIGEgPGVtPmNvbGxlY3Rpb248L2VtPiBjaGFuZ2UuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJdm9pZCBuZXN0ZWRBbm5vdGF0aW9uc1JlbW92ZWQoaW50IGluZGV4LCBMaXN0PE5lc3RhYmxlQW5ub3RhdGlvbj4gcmVtb3ZlZEFubm90YXRpb25zKSB7Ci0JCQlTb3VyY2VBbm5vdGF0ZWRFbGVtZW50LnRoaXMubmVzdGVkQW5ub3RhdGlvbnNSZW1vdmVkKE5FU1RBQkxFX0FOTk9UQVRJT05TX0NPTExFQ1RJT04sIHJlbW92ZWRBbm5vdGF0aW9ucyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBbm5vdGF0aW9uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZWFlZjEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci0KLS8qKgotICogc29tZSBjb21tb24gc3RhdGUgYW5kIGJlaGF2aW9yIGZvciBKYXZhIHNvdXJjZSBhbm5vdGF0aW9uczsKLSAqIGFuZCBsb3RzIG9mIGNvbnZlbmllbmNlIG1ldGhvZHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNvdXJjZUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZU5vZGUKLQlpbXBsZW1lbnRzIEFubm90YXRpb24KLXsKLQlwcm90ZWN0ZWQgZmluYWwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50OwotCi0JcHJvdGVjdGVkIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhOwotCi0JcHJvdGVjdGVkIGZpbmFsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyOwotCi0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvciBmb3Igc3RyYWlnaHQgbWVtYmVyIGFubm90YXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgU291cmNlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQl0aGlzKHBhcmVudCwgZWxlbWVudCwgZGFhLCBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKGVsZW1lbnQsIGRhYSkpOwotCX0KLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciBuZXN0ZWQgYW5ub3RhdGlvbiAodHlwaWNhbGx5KQotCSAqLwotCXByb3RlY3RlZCBTb3VyY2VBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmFubm90YXRlZEVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLmRhYSA9IGRhYTsKLQkJdGhpcy5hbm5vdGF0aW9uQWRhcHRlciA9IGFubm90YXRpb25BZGFwdGVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VOb2RlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEFubm90YXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldEFzdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBuZXdBbm5vdGF0aW9uKCkgewotCQl0aGlzLmFubm90YXRpb25BZGFwdGVyLm5ld01hcmtlckFubm90YXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKCkgewotCQl0aGlzLmFubm90YXRpb25BZGFwdGVyLnJlbW92ZUFubm90YXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFN0cmluZ0VsZW1lbnRBZGFwdGVyKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3ModGhpcy5kYWEsIGVsZW1lbnROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRCb29sZWFuRWxlbWVudEFkYXB0ZXIoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yQm9vbGVhbnModGhpcy5kYWEsIGVsZW1lbnROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRJbnRlZ2VyRWxlbWVudEFkYXB0ZXIoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yTnVtYmVycyh0aGlzLmRhYSwgZWxlbWVudE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFN0cmluZ0VsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSkgewotCQlyZXR1cm4gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIGRhZWEpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRCb29sZWFuRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSkgewotCQlyZXR1cm4gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGJ1aWxkSW50ZWdlckVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgZGFlYSk7Ci0JfQotCi0JLyoqCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFubm90YXRpb24uCi0JICogSWYgdGhlIGFubm90YXRpb24gaXMgbWlzc2luZywgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0QW5ub3RhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyB0aGUgQVNUIGlzIG51bGwgZm9yIHZpcnR1YWwgSmF2YSBhdHRyaWJ1dGVzCi0JCS8vIFRPRE8gcmVtb3ZlIHRoZSBBU1QgbnVsbCBjaGVjayBvbmNlIHdlIHN0YXJ0IHN0b3JpbmcgdGV4dCByYW5nZXMKLQkJLy8gaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJldHVybiAoYXN0Um9vdCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkVGV4dFJhbmdlKHRoaXMuZ2V0QXN0QW5ub3RhdGlvbihhc3RSb290KSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKiBJZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaXMgbWlzc2luZywgcmV0dXJuIHRoZSBhbm5vdGF0aW9uJ3MgdGV4dCByYW5nZSBpbnN0ZWFkLgotCSAqLwotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0RWxlbWVudFRleHRSYW5nZShEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjw/PiBlbGVtZW50QWRhcHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmdldEFubm90YXRpb25FbGVtZW50VGV4dFJhbmdlKGVsZW1lbnRBZGFwdGVyLCBhc3RSb290KSwgYXN0Um9vdCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLiBJZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdGV4dCByYW5nZSBpcyBudWxsCi0JICogcmV0dXJuIHRoZSBtZW1iZXIncyB0ZXh0IHJhbmdlIGluc3RlYWQuCi0JICovCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRFbGVtZW50VGV4dFJhbmdlKFRleHRSYW5nZSBlbGVtZW50VGV4dFJhbmdlLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gKGVsZW1lbnRUZXh0UmFuZ2UgIT0gbnVsbCkgPyBlbGVtZW50VGV4dFJhbmdlIDogdGhpcy5nZXRBbm5vdGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4gUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBleGlzdHMgYW5kCi0JICogdG91Y2hlcyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWxlbWVudFRvdWNoZXMoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Pz4gZWxlbWVudEFkYXB0ZXIsIGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnRleHRSYW5nZVRvdWNoZXModGhpcy5nZXRBbm5vdGF0aW9uRWxlbWVudFRleHRSYW5nZShlbGVtZW50QWRhcHRlciwgYXN0Um9vdCksIHBvcyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHRleHQgcmFuZ2UgaXMgbm90Ci0JICogbnVsbCAobWVhbmluZyB0aGUgY29ycmVzcG9uZGluZyBBU1Qgbm9kZSBleGlzdHMpIGFuZCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgaXQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGV4dFJhbmdlVG91Y2hlcyhUZXh0UmFuZ2UgdGV4dFJhbmdlLCBpbnQgcG9zKSB7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpICYmIHRleHRSYW5nZS50b3VjaGVzKHBvcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIElmIHRoZSBlbGVtZW50IGlzIG1pc3NpbmcsIHJldHVybiBudWxsLgotCSAqLwotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0QW5ub3RhdGlvbkVsZW1lbnRUZXh0UmFuZ2UoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Pz4gYWRhcHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gdGhlIEFTVCBpcyBudWxsIGZvciB2aXJ0dWFsIEphdmEgYXR0cmlidXRlcwotCQkvLyBUT0RPIHJlbW92ZSB0aGUgQVNUIG51bGwgY2hlY2sgb25jZSB3ZSBzdGFydCBzdG9yaW5nIHRleHQgcmFuZ2VzCi0JCS8vIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlyZXR1cm4gKGFzdFJvb3QgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZFRleHRSYW5nZSh0aGlzLmdldEFubm90YXRpb25FbGVtZW50RXhwcmVzc2lvbihhZGFwdGVyLCBhc3RSb290KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgQVNUIERPTSBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBFeHByZXNzaW9uIGdldEFubm90YXRpb25FbGVtZW50RXhwcmVzc2lvbihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjw/PiBhZGFwdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gYWRhcHRlci5nZXRFeHByZXNzaW9uKHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRNb2RpZmllZERlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgcmFuZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgZXhwcmVzc2lvbiBhdCB0aGUgc3BlY2lmaWVkCi0JICogaW5kZXggb2YgdGhlIGVsZW1lbnQncyBhcnJheS4KLQkgKiBAZXhjZXB0aW9uIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlCi0JICovCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBzZWxlY3RBbm5vdGF0aW9uRWxlbWVudFRleHRSYW5nZShJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Pz4gYWRhcHRlciwgaW50IGluZGV4LCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyB0aGUgQVNUIGlzIG51bGwgZm9yIHZpcnR1YWwgSmF2YSBhdHRyaWJ1dGVzCi0JCS8vIFRPRE8gcmVtb3ZlIHRoZSBBU1QgbnVsbCBjaGVjayBvbmNlIHdlIHN0YXJ0IHN0b3JpbmcgdGV4dCByYW5nZXMKLQkJLy8gaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJldHVybiAoYXN0Um9vdCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkVGV4dFJhbmdlKHRoaXMuc2VsZWN0QW5ub3RhdGlvbkVsZW1lbnRFeHByZXNzaW9uKGFkYXB0ZXIsIGluZGV4LCBhc3RSb290KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBleHByZXNzaW9uIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhlIGVsZW1lbnQncyBhcnJheS4KLQkgKi8KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBzZWxlY3RBbm5vdGF0aW9uRWxlbWVudEV4cHJlc3Npb24oSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPD8+IGFkYXB0ZXIsIGludCBpbmRleCwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGFkYXB0ZXIuc2VsZWN0RXhwcmVzc2lvbih0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbihhc3RSb290KSwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgQVNUIG5vZGUuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBBU1Qgbm9kZSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGJ1aWxkVGV4dFJhbmdlKEFTVE5vZGUgYXN0Tm9kZSkgewotCQlyZXR1cm4gKGFzdE5vZGUgPT0gbnVsbCkgPyBudWxsIDogQVNUVG9vbHMuYnVpbGRUZXh0UmFuZ2UoYXN0Tm9kZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE5lc3RhYmxlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZnJvbSB7QGxpbmsgTmVzdGFibGVBbm5vdGF0aW9ufSBpbnRlcmZhY2UKLQkgKiBmb3Igc3ViY2xhc3Nlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgpIHsKLQkJdGhpcy5nZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKS5tb3ZlQW5ub3RhdGlvbihuZXdJbmRleCk7Ci0JfQotCi0JcHJpdmF0ZSBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gKEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcikgdGhpcy5hbm5vdGF0aW9uQWRhcHRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBdHRyaWJ1dGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODAyZDA5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci0KLS8qKgotICogSmF2YSBzb3VyY2UgYXR0cmlidXRlIChmaWVsZCBvciBtZXRob2QpCi0gKi8KLWFic3RyYWN0IGNsYXNzIFNvdXJjZUF0dHJpYnV0ZTxBIGV4dGVuZHMgQXR0cmlidXRlPgotCWV4dGVuZHMgU291cmNlTWVtYmVyPEE+Ci0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VBdHRyaWJ1dGUKLXsKLQlwcml2YXRlIGludCBtb2RpZmllcnM7Ci0KLQlwcml2YXRlIFN0cmluZyB0eXBlTmFtZTsKLQotCXByaXZhdGUgYm9vbGVhbiB0eXBlSXNJbnRlcmZhY2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdHlwZUlzRW51bTsKLQotCXByaXZhdGUgYm9vbGVhbiB0eXBlSXNBcnJheTsKLQkKLQlwcml2YXRlIGludCB0eXBlQXJyYXlEaW1lbnNpb25hbGl0eTsKLQkKLQlwcml2YXRlIFN0cmluZyB0eXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZTsKLQotCXByaXZhdGUgZmluYWwgVmVjdG9yPFN0cmluZz4gdHlwZVN1cGVyY2xhc3NOYW1lcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCi0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8U3RyaW5nPiB0eXBlSW50ZXJmYWNlTmFtZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQotCXByaXZhdGUgZmluYWwgVmVjdG9yPFN0cmluZz4gdHlwZVR5cGVBcmd1bWVudE5hbWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0KLQotCXByb3RlY3RlZCBTb3VyY2VBdHRyaWJ1dGUoSmF2YVJlc291cmNlVHlwZSBwYXJlbnQsIEEgYXR0cmlidXRlKXsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoSUJpbmRpbmcgYmluZGluZykgewotCQlzdXBlci5pbml0aWFsaXplKGJpbmRpbmcpOwotCQl0aGlzLm1vZGlmaWVycyA9IHRoaXMuYnVpbGRNb2RpZmllcnMoYmluZGluZyk7Ci0JfQotCi0JLyoqCi0JICogc3ViY2xhc3NlcyBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKElUeXBlQmluZGluZyBhdHRyaWJ1dGVUeXBlQmluZGluZykgewotCQl0aGlzLnR5cGVOYW1lID0gdGhpcy5idWlsZFR5cGVOYW1lKGF0dHJpYnV0ZVR5cGVCaW5kaW5nKTsKLQkJdGhpcy50eXBlSXNJbnRlcmZhY2UgPSB0aGlzLmJ1aWxkVHlwZUlzSW50ZXJmYWNlKGF0dHJpYnV0ZVR5cGVCaW5kaW5nKTsKLQkJdGhpcy50eXBlSXNFbnVtID0gdGhpcy5idWlsZFR5cGVJc0VudW0oYXR0cmlidXRlVHlwZUJpbmRpbmcpOwotCQl0aGlzLnR5cGVJc0FycmF5ID0gdGhpcy5idWlsZFR5cGVJc0FycmF5KGF0dHJpYnV0ZVR5cGVCaW5kaW5nKTsKLQkJdGhpcy50eXBlQXJyYXlEaW1lbnNpb25hbGl0eSA9IGJ1aWxkVHlwZUFycmF5RGltZW5zaW9uYWxpdHkoYXR0cmlidXRlVHlwZUJpbmRpbmcpOwotCQl0aGlzLnR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lID0gYnVpbGRUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZShhdHRyaWJ1dGVUeXBlQmluZGluZyk7Ci0JCXRoaXMudHlwZVN1cGVyY2xhc3NOYW1lcy5hZGRBbGwodGhpcy5idWlsZFR5cGVTdXBlcmNsYXNzTmFtZXMoYXR0cmlidXRlVHlwZUJpbmRpbmcpKTsKLQkJdGhpcy50eXBlSW50ZXJmYWNlTmFtZXMuYWRkQWxsKHRoaXMuYnVpbGRUeXBlSW50ZXJmYWNlTmFtZXMoYXR0cmlidXRlVHlwZUJpbmRpbmcpKTsKLQkJdGhpcy50eXBlVHlwZUFyZ3VtZW50TmFtZXMuYWRkQWxsKHRoaXMuYnVpbGRUeXBlVHlwZUFyZ3VtZW50TmFtZXMoYXR0cmlidXRlVHlwZUJpbmRpbmcpKTsJCQotCX0KLQotCi0JLy8gKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIucmVzb2x2ZVR5cGVzKGFzdFJvb3QpOwotCQl0aGlzLnJlc29sdmVUeXBlcyh0aGlzLmdldFR5cGVCaW5kaW5nKGFzdFJvb3QpKTsvL2J1aWxkIG9uY2UsIG1pbm9yIHBlcmZvcm1hbmNlIHR3ZWFrIGZvciBtYWpvciBiZW5lZml0Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZVR5cGVzKElUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotCQl0aGlzLnN5bmNUeXBlTmFtZSh0aGlzLmJ1aWxkVHlwZU5hbWUodHlwZUJpbmRpbmcpKTsKLQkJdGhpcy5zeW5jVHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUodGhpcy5idWlsZFR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lKHR5cGVCaW5kaW5nKSk7Ci0JCXRoaXMuc3luY1R5cGVTdXBlcmNsYXNzTmFtZXModGhpcy5idWlsZFR5cGVTdXBlcmNsYXNzTmFtZXModHlwZUJpbmRpbmcpKTsKLQkJdGhpcy5zeW5jVHlwZUludGVyZmFjZU5hbWVzKHRoaXMuYnVpbGRUeXBlSW50ZXJmYWNlTmFtZXModHlwZUJpbmRpbmcpKTsKLQkJdGhpcy5zeW5jVHlwZVR5cGVBcmd1bWVudE5hbWVzKHRoaXMuYnVpbGRUeXBlVHlwZUFyZ3VtZW50TmFtZXModHlwZUJpbmRpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBzdWJjbGFzc2VzIG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplV2l0aChJVHlwZUJpbmRpbmcgYXR0cmlidXRlVHlwZUJpbmRpbmcpIHsKLQkJdGhpcy5zeW5jVHlwZU5hbWUodGhpcy5idWlsZFR5cGVOYW1lKGF0dHJpYnV0ZVR5cGVCaW5kaW5nKSk7Ci0JCXRoaXMuc3luY1R5cGVJc0ludGVyZmFjZSh0aGlzLmJ1aWxkVHlwZUlzSW50ZXJmYWNlKGF0dHJpYnV0ZVR5cGVCaW5kaW5nKSk7Ci0JCXRoaXMuc3luY1R5cGVJc0VudW0odGhpcy5idWlsZFR5cGVJc0VudW0oYXR0cmlidXRlVHlwZUJpbmRpbmcpKTsKLQkJdGhpcy5zeW5jVHlwZUlzQXJyYXkodGhpcy5idWlsZFR5cGVJc0FycmF5KGF0dHJpYnV0ZVR5cGVCaW5kaW5nKSk7Ci0JCXRoaXMuc3luY1R5cGVBcnJheURpbWVuc2lvbmFsaXR5KHRoaXMuYnVpbGRUeXBlQXJyYXlEaW1lbnNpb25hbGl0eShhdHRyaWJ1dGVUeXBlQmluZGluZykpOwotCQl0aGlzLnN5bmNUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZSh0aGlzLmJ1aWxkVHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUoYXR0cmlidXRlVHlwZUJpbmRpbmcpKTsKLQkJdGhpcy5zeW5jVHlwZVN1cGVyY2xhc3NOYW1lcyh0aGlzLmJ1aWxkVHlwZVN1cGVyY2xhc3NOYW1lcyhhdHRyaWJ1dGVUeXBlQmluZGluZykpOwotCQl0aGlzLnN5bmNUeXBlSW50ZXJmYWNlTmFtZXModGhpcy5idWlsZFR5cGVJbnRlcmZhY2VOYW1lcyhhdHRyaWJ1dGVUeXBlQmluZGluZykpOwotCQl0aGlzLnN5bmNUeXBlVHlwZUFyZ3VtZW50TmFtZXModGhpcy5idWlsZFR5cGVUeXBlQXJndW1lbnROYW1lcyhhdHRyaWJ1dGVUeXBlQmluZGluZykpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplV2l0aChJQmluZGluZyBiaW5kaW5nKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aChiaW5kaW5nKTsKLQkJdGhpcy5zeW5jTW9kaWZpZXJzKHRoaXMuYnVpbGRNb2RpZmllcnMoYmluZGluZykpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKiBKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgaW1wbGVtZW50YXRpb24gKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVJlc291cmNlVHlwZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YVJlc291cmNlVHlwZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0QXR0cmlidXRlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHR5cGVJc1N1YlR5cGVPZihTdHJpbmcgdG4pIHsKLQkJaWYgKHRoaXMudHlwZU5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLnR5cGVOYW1lLmVxdWFscyh0bikKLQkJCQl8fCB0aGlzLnR5cGVJbnRlcmZhY2VOYW1lcy5jb250YWlucyh0bikKLQkJCQl8fCB0aGlzLnR5cGVTdXBlcmNsYXNzTmFtZXMuY29udGFpbnModG4pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHR5cGVJc1ZhcmlhYmxlUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gKHRoaXMudHlwZU5hbWUgIT0gbnVsbCkgJiYgQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmUodGhpcy50eXBlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElUeXBlQmluZGluZyBnZXRUeXBlQmluZGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldFR5cGVCaW5kaW5nKGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKiogbW9kaWZpZXJzCi0JcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7Ci0JCXJldHVybiB0aGlzLm1vZGlmaWVyczsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY01vZGlmaWVycyhpbnQgYXN0TW9kaWZpZXJzKSB7Ci0JCWludCBvbGQgPSB0aGlzLm1vZGlmaWVyczsKLQkJdGhpcy5tb2RpZmllcnMgPSBhc3RNb2RpZmllcnM7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNT0RJRklFUlNfUFJPUEVSVFksIG9sZCwgYXN0TW9kaWZpZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiB6ZXJvIHNlZW1zIGxpa2UgYSByZWFzb25hYmxlIGRlZmF1bHQuLi4KLQkgKi8KLQlwcml2YXRlIGludCBidWlsZE1vZGlmaWVycyhJQmluZGluZyBiaW5kaW5nKSB7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IDAgOiBiaW5kaW5nLmdldE1vZGlmaWVycygpOwotCX0KLQotCS8vICoqKioqIHR5cGUgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVOYW1lOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVHlwZU5hbWUoU3RyaW5nIGFzdFR5cGVOYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnR5cGVOYW1lOwotCQl0aGlzLnR5cGVOYW1lID0gYXN0VHlwZU5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX05BTUVfUFJPUEVSVFksIG9sZCwgYXN0VHlwZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIHRoaXMgY2FuIGJlIGFuIGFycmF5IChlLmcuICJqYXZhLmxhbmcuU3RyaW5nW10iKTsKLQkgKiBidXQgbm8gZ2VuZXJpYyB0eXBlIGFyZ3VtZW50cwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVHlwZU5hbWUoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7Ci0JCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJdHlwZUJpbmRpbmcgPSB0eXBlQmluZGluZy5nZXRFcmFzdXJlKCk7Ci0JCVN0cmluZyB0Yk5hbWUgPSB0eXBlQmluZGluZy5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCXJldHVybiAodGJOYW1lLmxlbmd0aCgpID09IDApID8gbnVsbCA6IHRiTmFtZTsKLQl9Ci0KLQkvLyAqKioqKiB0eXBlIGlzIGludGVyZmFjZQotCXB1YmxpYyBib29sZWFuIHR5cGVJc0ludGVyZmFjZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZUlzSW50ZXJmYWNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVHlwZUlzSW50ZXJmYWNlKGJvb2xlYW4gYXN0VHlwZUlzSW50ZXJmYWNlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy50eXBlSXNJbnRlcmZhY2U7Ci0JCXRoaXMudHlwZUlzSW50ZXJmYWNlID0gYXN0VHlwZUlzSW50ZXJmYWNlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9JU19JTlRFUkZBQ0VfUFJPUEVSVFksIG9sZCwgYXN0VHlwZUlzSW50ZXJmYWNlKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYnVpbGRUeXBlSXNJbnRlcmZhY2UoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7Ci0JCXJldHVybiAodHlwZUJpbmRpbmcgIT0gbnVsbCkgJiYgKCAhIHR5cGVCaW5kaW5nLmlzQXJyYXkoKSkgJiYgdHlwZUJpbmRpbmcuaXNJbnRlcmZhY2UoKTsKLQl9Ci0KLQkvLyAqKioqKiB0eXBlIGlzIGVudW0KLQlwdWJsaWMgYm9vbGVhbiB0eXBlSXNFbnVtKCkgewotCQlyZXR1cm4gdGhpcy50eXBlSXNFbnVtOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVHlwZUlzRW51bShib29sZWFuIGFzdFR5cGVJc0VudW0pIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLnR5cGVJc0VudW07Ci0JCXRoaXMudHlwZUlzRW51bSA9IGFzdFR5cGVJc0VudW07Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX0lTX0VOVU1fUFJPUEVSVFksIG9sZCwgYXN0VHlwZUlzRW51bSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkVHlwZUlzRW51bShJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKLQkJcmV0dXJuICh0eXBlQmluZGluZyAhPSBudWxsKSAmJiAoICEgdHlwZUJpbmRpbmcuaXNBcnJheSgpKSAmJiB0eXBlQmluZGluZy5pc0VudW0oKTsKLQl9Ci0KLQkvLyAqKioqKiB0eXBlIGlzIGFycmF5Ci0JcHVibGljIGJvb2xlYW4gdHlwZUlzQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVJc0FycmF5OwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVHlwZUlzQXJyYXkoYm9vbGVhbiBhc3RUeXBlSXNBcnJheSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMudHlwZUlzQXJyYXk7Ci0JCXRoaXMudHlwZUlzQXJyYXkgPSBhc3RUeXBlSXNBcnJheTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRZUEVfSVNfQVJSQVlfUFJPUEVSVFksIG9sZCwgYXN0VHlwZUlzQXJyYXkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBidWlsZFR5cGVJc0FycmF5KElUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotCQlyZXR1cm4gKHR5cGVCaW5kaW5nICE9IG51bGwpICYmIHR5cGVCaW5kaW5nLmlzQXJyYXkoKTsKLQl9Ci0JCi0JLy8gKioqKiogdHlwZSBhcnJheSBkaW1lbnNpb25hbGl0eQotCXB1YmxpYyBpbnQgZ2V0VHlwZUFycmF5RGltZW5zaW9uYWxpdHkoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVBcnJheURpbWVuc2lvbmFsaXR5OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3luY1R5cGVBcnJheURpbWVuc2lvbmFsaXR5KGludCBhc3RUeXBlQXJyYXlEaW1lbnNpb25hbGl0eSkgewotCQlpbnQgb2xkID0gdGhpcy50eXBlQXJyYXlEaW1lbnNpb25hbGl0eTsKLQkJdGhpcy50eXBlQXJyYXlEaW1lbnNpb25hbGl0eSA9IGFzdFR5cGVBcnJheURpbWVuc2lvbmFsaXR5OwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRZUEVfQVJSQVlfRElNRU5TSU9OQUxJVFlfUFJPUEVSVFksIG9sZCwgYXN0VHlwZUFycmF5RGltZW5zaW9uYWxpdHkpOwotCX0KLQkKLQlwcml2YXRlIGludCBidWlsZFR5cGVBcnJheURpbWVuc2lvbmFsaXR5KElUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotCQlyZXR1cm4gKHR5cGVCaW5kaW5nID09IG51bGwpID8gMCA6IHR5cGVCaW5kaW5nLmdldERpbWVuc2lvbnMoKTsKLQl9Ci0JCi0JLy8gKioqKiogdHlwZSBhcnJheSBjb21wb25lbnQgdHlwZSBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jVHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUoU3RyaW5nIGFzdFR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lOwotCQl0aGlzLnR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lID0gYXN0VHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9BUlJBWV9DT01QT05FTlRfVFlQRV9OQU1FX1BST1BFUlRZLCBvbGQsIGFzdFR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZShJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKLQkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwgfHwgISB0eXBlQmluZGluZy5pc0FycmF5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQkvLyB0aGUgY29tcG9uZW50IHR5cGUgb2YgU3RyaW5nW11bXSBpcyBhY3R1YWxseSBTdHJpbmdbXSwgd2hlcmVhcyB3ZSB3YW50IFN0cmluZwotCQl3aGlsZSAodHlwZUJpbmRpbmcuaXNBcnJheSgpKSB7Ci0JCQl0eXBlQmluZGluZyA9IHR5cGVCaW5kaW5nLmdldENvbXBvbmVudFR5cGUoKTsKLQkJCQotCQkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJLy8gYSB0eXBlIHZhcmlhYmxlIGlzIHdoYXQgaXMgZGVjbGFyZWQgYnkgYSBnZW5lcmljIHR5cGU7Ci0JCS8vIGUuZy4gIkUiIGlzIGEgdHlwZSB2YXJpYWJsZSBkZWNsYXJlZCBieSB0aGUgZ2VuZXJpYyB0eXBlICJDb2xsZWN0aW9uIiBpbgotCQkvLyAgICAgcHVibGljIGludGVyZmFjZSBDb2xsZWN0aW9uPEU+Ci0JCWlmICh0eXBlQmluZGluZy5pc1R5cGVWYXJpYWJsZSgpKSB7Ci0JCQkvLyBlLmcuICJFIGV4dGVuZHMgTnVtYmVyIiBoYXMgYW4gZXJhc3VyZSBvZiAiTnVtYmVyIgotCQkJdHlwZUJpbmRpbmcgPSB0eXBlQmluZGluZy5nZXRFcmFzdXJlKCk7Ci0JCX0KLQkJU3RyaW5nIHRiTmFtZSA9IHR5cGVCaW5kaW5nLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJcmV0dXJuICh0Yk5hbWUubGVuZ3RoKCkgPT0gMCkgPyBudWxsIDogdGJOYW1lOwotCX0KLQotCS8vICoqKioqIHR5cGUgc3VwZXJjbGFzcyBoaWVyYXJjaHkKLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0VHlwZVN1cGVyY2xhc3NOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLnR5cGVTdXBlcmNsYXNzTmFtZXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVHlwZVN1cGVyY2xhc3NOYW1lcyhMaXN0PFN0cmluZz4gYXN0VHlwZVN1cGVyY2xhc3NOYW1lcykgewotCQl0aGlzLnN5bmNocm9uaXplTGlzdChhc3RUeXBlU3VwZXJjbGFzc05hbWVzLCB0aGlzLnR5cGVTdXBlcmNsYXNzTmFtZXMsIFRZUEVfU1VQRVJDTEFTU19OQU1FU19MSVNUKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFR5cGVTdXBlcmNsYXNzTmFtZXMoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7Ci0JCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQkJQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdHlwZUJpbmRpbmcgPSB0eXBlQmluZGluZy5nZXRTdXBlcmNsYXNzKCk7Ci0JCXdoaWxlICh0eXBlQmluZGluZyAhPSBudWxsKSB7Ci0JCQluYW1lcy5hZGQodHlwZUJpbmRpbmcuZ2V0RXJhc3VyZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCQl0eXBlQmluZGluZyA9IHR5cGVCaW5kaW5nLmdldFN1cGVyY2xhc3MoKTsKLQkJfQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JLy8gKioqKiogdHlwZSBpbnRlcmZhY2UgaGllcmFyY2h5Ci0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0VHlwZUludGVyZmFjZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPFN0cmluZz4odGhpcy50eXBlSW50ZXJmYWNlTmFtZXMpOwotCX0KLQotLy8JcHJpdmF0ZSBib29sZWFuIHR5cGVJbnRlcmZhY2VOYW1lc0NvbnRhaW5zKFN0cmluZyBpbnRlcmZhY2VOYW1lKSB7Ci0vLwkJcmV0dXJuIHRoaXMudHlwZUludGVyZmFjZU5hbWVzLmNvbnRhaW5zKGludGVyZmFjZU5hbWUpOwotLy8JfQotLy8KLQlwcml2YXRlIHZvaWQgc3luY1R5cGVJbnRlcmZhY2VOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gYXN0VHlwZUludGVyZmFjZU5hbWVzKSB7Ci0JCXRoaXMuc3luY2hyb25pemVDb2xsZWN0aW9uKGFzdFR5cGVJbnRlcmZhY2VOYW1lcywgdGhpcy50eXBlSW50ZXJmYWNlTmFtZXMsIFRZUEVfSU5URVJGQUNFX05BTUVTX0NPTExFQ1RJT04pOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkVHlwZUludGVyZmFjZU5hbWVzKElUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0JCX0KLQkJSGFzaFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQl3aGlsZSAodHlwZUJpbmRpbmcgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRJbnRlcmZhY2VOYW1lc1RvKHR5cGVCaW5kaW5nLCBuYW1lcyk7Ci0JCQl0eXBlQmluZGluZyA9IHR5cGVCaW5kaW5nLmdldFN1cGVyY2xhc3MoKTsKLQkJfQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEludGVyZmFjZU5hbWVzVG8oSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLCBIYXNoU2V0PFN0cmluZz4gbmFtZXMpIHsKLQkJZm9yIChJVHlwZUJpbmRpbmcgaW50ZXJmYWNlQmluZGluZyA6IHR5cGVCaW5kaW5nLmdldEludGVyZmFjZXMoKSkgewotCQkJbmFtZXMuYWRkKGludGVyZmFjZUJpbmRpbmcuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0RXJhc3VyZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCQl0aGlzLmFkZEludGVyZmFjZU5hbWVzVG8oaW50ZXJmYWNlQmluZGluZywgbmFtZXMpOyAgLy8gcmVjdXJzZQotCQl9Ci0JfQotCi0JLy8gKioqKiogdHlwZSB0eXBlIGFyZ3VtZW50IG5hbWVzCi0JcHVibGljIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldFR5cGVUeXBlQXJndW1lbnROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLnR5cGVUeXBlQXJndW1lbnROYW1lcyk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlVHlwZUFyZ3VtZW50TmFtZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy50eXBlVHlwZUFyZ3VtZW50TmFtZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVR5cGVBcmd1bWVudE5hbWUoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnR5cGVUeXBlQXJndW1lbnROYW1lcy5nZXQoaW5kZXgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVHlwZVR5cGVBcmd1bWVudE5hbWVzKExpc3Q8U3RyaW5nPiBhc3RUeXBlVHlwZUFyZ3VtZW50TmFtZXMpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZUxpc3QoYXN0VHlwZVR5cGVBcmd1bWVudE5hbWVzLCB0aGlzLnR5cGVUeXBlQXJndW1lbnROYW1lcywgVFlQRV9UWVBFX0FSR1VNRU5UX05BTUVTX0xJU1QpOwotCX0KLQotCS8qKgotCSAqIHRoZXNlIHR5cGVzIGNhbiBiZSBhcnJheXMgKGUuZy4gImphdmEubGFuZy5TdHJpbmdbXSIpOwotCSAqIGJ1dCB0aGV5IHdvbid0IGhhdmUgYW55IGZ1cnRoZXIgbmVzdGVkIGdlbmVyaWMgdHlwZSBhcmd1bWVudHMKLQkgKiAoZS5nLiAiamF2YS51dGlsLkNvbGxlY3Rpb248amF2YS5sYW5nLlN0cmluZz4iKQotCSAqLwotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkVHlwZVR5cGVBcmd1bWVudE5hbWVzKElUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCQotCQlJVHlwZUJpbmRpbmdbXSB0eXBlQXJndW1lbnRzID0gdHlwZUJpbmRpbmcuZ2V0VHlwZUFyZ3VtZW50cygpOwotCQlpZiAodHlwZUFyZ3VtZW50cy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0KLQkJQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4odHlwZUFyZ3VtZW50cy5sZW5ndGgpOwotCQlmb3IgKElUeXBlQmluZGluZyB0eXBlQXJndW1lbnQgOiB0eXBlQXJndW1lbnRzKSB7Ci0JCQlpZiAodHlwZUFyZ3VtZW50ID09IG51bGwpIHsKLQkJCQluYW1lcy5hZGQobnVsbCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGUuZy4gIj8gZXh0ZW5kcyBOdW1iZXIiIGhhcyBhbiBlcmFzdXJlIG9mICJOdW1iZXIiCi0JCQkJSVR5cGVCaW5kaW5nIGVyYXN1cmUgPSB0eXBlQXJndW1lbnQuZ2V0RXJhc3VyZSgpOwotCQkJCW5hbWVzLmFkZChlcmFzdXJlLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUNvbXBpbGF0aW9uVW5pdC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQ29tcGlsYXRpb25Vbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNjk2NjUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQ29tcGlsYXRpb25Vbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5Bbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5MaXN0ZW5lckxpc3Q7Ci0KLS8qKgotICogSmF2YSBjb21waWxhdGlvbiB1bml0IChzb3VyY2UgZmlsZSkKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNvdXJjZUNvbXBpbGF0aW9uVW5pdAotCWV4dGVuZHMgU291cmNlTm9kZQotCWltcGxlbWVudHMgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0Ci17Ci0JLyoqIEpEVCBjb21waWxhdGlvbiB1bml0ICovCi0JZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQ7Ci0KLQkvKiogcGx1Z2dhYmxlIGFubm90YXRpb24gcHJvdmlkZXIgKi8KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25Qcm92aWRlciBhbm5vdGF0aW9uUHJvdmlkZXI7Ci0KLQkvKiogaW1wcm92ZWQgYW5ub3RhdGlvbiBmb3JtYXR0aW5nICovCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLQotCS8qKiBwbHVnZ2FibGUgZXhlY3V0b3IgdGhhdCBhbGxvd3MgdGhlIGRvY3VtZW50IHRvIGJlIG1vZGlmaWVkIG9uIGFub3RoZXIgdGhyZWFkICovCi0JcHJpdmF0ZSBmaW5hbCBDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3I7Ci0KLQkvKiogbGlzdGVuZXJzIG5vdGlmaWVkIHdoZW5ldmVyIHRoZSByZXNvdXJjZSBtb2RlbCBjaGFuZ2VzICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0ZW5lckxpc3Q8SnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyPiByZXNvdXJjZU1vZGVsTGlzdGVuZXJMaXN0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgU291cmNlQ29tcGlsYXRpb25Vbml0KAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlBbm5vdGF0aW9uUHJvdmlkZXIgYW5ub3RhdGlvblByb3ZpZGVyLCAKLQkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyLAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXN1cGVyKG51bGwpOyAgLy8gdGhlIEpQQSBjb21waWxhdGlvbiB1bml0IGlzIHRoZSByb290IG9mIGl0cyBzdWItdHJlZQotCQl0aGlzLmNvbXBpbGF0aW9uVW5pdCA9IGNvbXBpbGF0aW9uVW5pdDsKLQkJdGhpcy5hbm5vdGF0aW9uUHJvdmlkZXIgPSBhbm5vdGF0aW9uUHJvdmlkZXI7Ci0JCXRoaXMuYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgPSBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLQkJdGhpcy5tb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciA9IG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yOwotCQl0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PEpwdFJlc291cmNlTW9kZWxMaXN0ZW5lcj4oSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIG5ldmVyIGNhbGxlZD8KLQl9Ci0KLQl2b2lkIG9wZW5Db21waWxhdGlvblVuaXQoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmNvbXBpbGF0aW9uVW5pdC5vcGVuKG51bGwpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGRvIG5vdGhpbmcgLSB3ZSBqdXN0IHdvbid0IGhhdmUgYSBwcmltYXJ5IHR5cGUgaW4gdGhpcyBjYXNlCi0JCX0KLQl9Ci0KLQl2b2lkIGNsb3NlQ29tcGlsYXRpb25Vbml0KCkgewotCQl0cnkgewotCQkJdGhpcy5jb21waWxhdGlvblVuaXQuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBobW1tCi0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlc1BhcmVudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiAoSUZpbGUpIHRoaXMuY29tcGlsYXRpb25Vbml0LmdldFJlc291cmNlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBBbm5vdGF0aW9uUHJvdmlkZXIgZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uUHJvdmlkZXI7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VOb2RlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VOb2RlLlJvb3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgcmVzb3VyY2VNb2RlbENoYW5nZWQoKSB7Ci0JCWZvciAoSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQlsaXN0ZW5lci5yZXNvdXJjZU1vZGVsQ2hhbmdlZCh0aGlzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCkgewotCQlyZXR1cm4gdGhpcy5jb21waWxhdGlvblVuaXQ7Ci0JfQotCi0JcHVibGljIENvbW1hbmRFeGVjdXRvciBnZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3I7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBnZXRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpICB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29tcGlsYXRpb25Vbml0IGJ1aWxkQVNUUm9vdCgpIHsKLQkJcmV0dXJuIEFTVFRvb2xzLmJ1aWxkQVNUUm9vdCh0aGlzLmNvbXBpbGF0aW9uVW5pdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEpwYVJlc291cmNlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2VNb2RlbExpc3RlbmVyKEpwdFJlc291cmNlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZU1vZGVsTGlzdGVuZXIoSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNoYW5nZXMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoSmF2YVNvdXJjZSgpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZVdpdGgodGhpcy5idWlsZEFTVFJvb3QoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsICoqKioqKioqKioKLQotCVN0cmluZyBnZXRDb21waWxhdGlvblVuaXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVKYXZhRXh0ZW5zaW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmdldEVsZW1lbnROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHJlbW92ZUphdmFFeHRlbnNpb24oU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIuamF2YSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAoaW5kZXggPT0gLTEpID8gZmlsZU5hbWUgOiBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0TmFtZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVudW0uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVudW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRjNmI0NC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFbnVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bUNvbnN0YW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVudW1EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRURW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlSW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotCi0vKioKLSAqIEphdmEgc291cmNlIHR5cGUKLSAqLwotZmluYWwgY2xhc3MgU291cmNlRW51bQotCWV4dGVuZHMgU291cmNlQWJzdHJhY3RUeXBlPEVudW0+Ci0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VFbnVtCi17Ci0KLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQ+IGVudW1Db25zdGFudHM7Ci0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogYnVpbGQgdG9wLWxldmVsIHR5cGUKLQkgKi8KLQlzdGF0aWMgSmF2YVJlc291cmNlRW51bSBuZXdJbnN0YW5jZSgKLQkJCUphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQsCi0JCQlFbnVtRGVjbGFyYXRpb24gZW51bURlY2xhcmF0aW9uLAotCQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJRW51bSBfZW51bSA9IG5ldyBKRFRFbnVtKAotCQkJZW51bURlY2xhcmF0aW9uLAotCQkJCWphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5nZXRDb21waWxhdGlvblVuaXQoKSwKLQkJCQlqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuZ2V0TW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKSwKLQkJCQlqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuZ2V0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIoKSk7Ci0JCUphdmFSZXNvdXJjZUVudW0ganJlID0gbmV3IFNvdXJjZUVudW0oamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LCBfZW51bSk7Ci0JCWpyZS5pbml0aWFsaXplKGFzdFJvb3QpOwotCQlyZXR1cm4ganJlOwotCX0KLQotCS8qKgotCSAqIGJ1aWxkIG5lc3RlZCB0eXBlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBKYXZhUmVzb3VyY2VFbnVtIG5ld0luc3RhbmNlKAotCQkJSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCwKLQkJCVR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCUVudW1EZWNsYXJhdGlvbiBlbnVtRGVjbGFyYXRpb24sCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUVudW0gX2VudW0gPSBuZXcgSkRURW51bSgKLQkJCQlkZWNsYXJpbmdUeXBlLAotCQkJCWVudW1EZWNsYXJhdGlvbiwKLQkJCQlvY2N1cnJlbmNlLAotCQkJCWphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5nZXRDb21waWxhdGlvblVuaXQoKSwKLQkJCQlqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuZ2V0TW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKSwKLQkJCQlqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuZ2V0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIoKSk7Ci0JCUphdmFSZXNvdXJjZUVudW0ganJlID0gbmV3IFNvdXJjZUVudW0oamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LCBfZW51bSk7Ci0JCWpyZS5pbml0aWFsaXplKGFzdFJvb3QpOwotCQlyZXR1cm4ganJlOwotCX0KLQotCXByaXZhdGUgU291cmNlRW51bShKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LCBFbnVtIF9lbnVtKSB7Ci0JCXN1cGVyKGphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCwgX2VudW0pOwotCQl0aGlzLmVudW1Db25zdGFudHMgPSBuZXcgVmVjdG9yPEphdmFSZXNvdXJjZUVudW1Db25zdGFudD4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUVudW1Db25zdGFudHMoYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHVwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNFbnVtQ29uc3RhbnRzKGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTb3VyY2VBbm5vdGF0ZWRFbGVtZW50IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlc29sdmVUeXBlcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5yZXNvbHZlVHlwZXMoYXN0Um9vdCk7Ci0KLQkJZm9yIChKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQgZW51bUNvbnN0YW50IDogdGhpcy5nZXRFbnVtQ29uc3RhbnRzKCkpIHsKLQkJCWVudW1Db25zdGFudC5yZXNvbHZlVHlwZXMoYXN0Um9vdCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqIEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgaW1wbGVtZW50YXRpb24gKioqKioqKioKLQkKLQlwdWJsaWMgS2luZCBnZXRLaW5kKCkgewotCQlyZXR1cm4gS2luZC5FTlVNOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGVudW0gY29uc3RhbnRzICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQ+IGdldEVudW1Db25zdGFudHMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8SmF2YVJlc291cmNlRW51bUNvbnN0YW50Pih0aGlzLmVudW1Db25zdGFudHMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFbnVtQ29uc3RhbnQoSmF2YVJlc291cmNlRW51bUNvbnN0YW50IGVudW1Db25zdGFudCkgewotCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oZW51bUNvbnN0YW50LCB0aGlzLmVudW1Db25zdGFudHMsIEVOVU1fQ09OU1RBTlRTX0NPTExFQ1RJT04pOwotCX0KLQotCXByaXZhdGUgSmF2YVJlc291cmNlRW51bUNvbnN0YW50IGdldEVudW1Db25zdGFudChTdHJpbmcgZmllbGROYW1lLCBpbnQgb2NjdXJyZW5jZSkgewotCQlmb3IgKEphdmFSZXNvdXJjZUVudW1Db25zdGFudCBlbnVtQ29uc3RhbnQgOiB0aGlzLmdldEVudW1Db25zdGFudHMoKSkgewotCQkJaWYgKGVudW1Db25zdGFudC5pc0ZvcihmaWVsZE5hbWUsIG9jY3VycmVuY2UpKSB7Ci0JCQkJcmV0dXJuIGVudW1Db25zdGFudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRW51bUNvbnN0YW50cyhDb2xsZWN0aW9uPEphdmFSZXNvdXJjZUVudW1Db25zdGFudD4gcmVtb3ZlKSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihyZW1vdmUsIHRoaXMuZW51bUNvbnN0YW50cywgRU5VTV9DT05TVEFOVFNfQ09MTEVDVElPTik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVFbnVtQ29uc3RhbnRzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUVudW1Db25zdGFudERlY2xhcmF0aW9uW10gZW51bUNvbnN0YW50RGVjbGFyYXRpb25zID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldEVudW1Db25zdGFudHMoYXN0Um9vdCk7Ci0JCUNvdW50ZXJNYXAgY291bnRlcnMgPSBuZXcgQ291bnRlck1hcChlbnVtQ29uc3RhbnREZWNsYXJhdGlvbnMubGVuZ3RoKTsKLQkJZm9yIChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBlbnVtQ29uc3RhbnREZWNsYXJhdGlvbiA6IGVudW1Db25zdGFudERlY2xhcmF0aW9ucykgewotCQkJU3RyaW5nIGNvbnN0YW50TmFtZSA9IGVudW1Db25zdGFudERlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCWludCBvY2N1cnJlbmNlID0gY291bnRlcnMuaW5jcmVtZW50KGNvbnN0YW50TmFtZSk7Ci0JCQl0aGlzLmVudW1Db25zdGFudHMuYWRkKHRoaXMuYnVpbGRFbnVtQ29uc3RhbnQoY29uc3RhbnROYW1lLCBvY2N1cnJlbmNlLCBhc3RSb290KSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0VudW1Db25zdGFudHMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJRW51bUNvbnN0YW50RGVjbGFyYXRpb25bXSBlbnVtQ29uc3RhbnREZWNsYXJhdGlvbnMgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0RW51bUNvbnN0YW50cyhhc3RSb290KTsKLQkJQ291bnRlck1hcCBjb3VudGVycyA9IG5ldyBDb3VudGVyTWFwKGVudW1Db25zdGFudERlY2xhcmF0aW9ucy5sZW5ndGgpOwotCQlIYXNoU2V0PEphdmFSZXNvdXJjZUVudW1Db25zdGFudD4gZW51bUNvbnN0YW50c1RvUmVtb3ZlID0gbmV3IEhhc2hTZXQ8SmF2YVJlc291cmNlRW51bUNvbnN0YW50Pih0aGlzLmVudW1Db25zdGFudHMpOwotCQlmb3IgKEVudW1Db25zdGFudERlY2xhcmF0aW9uIGVudW1Db25zdGFudERlY2xhcmF0aW9uIDogZW51bUNvbnN0YW50RGVjbGFyYXRpb25zKSB7Ci0JCQlTdHJpbmcgY29uc3RhbnROYW1lID0gZW51bUNvbnN0YW50RGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJaW50IG9jY3VycmVuY2UgPSBjb3VudGVycy5pbmNyZW1lbnQoY29uc3RhbnROYW1lKTsKLQotCQkJSmF2YVJlc291cmNlRW51bUNvbnN0YW50IGVudW1Db25zdGFudCA9IHRoaXMuZ2V0RW51bUNvbnN0YW50KGNvbnN0YW50TmFtZSwgb2NjdXJyZW5jZSk7Ci0JCQlpZiAoZW51bUNvbnN0YW50ID09IG51bGwpIHsKLQkJCQl0aGlzLmFkZEVudW1Db25zdGFudCh0aGlzLmJ1aWxkRW51bUNvbnN0YW50KGNvbnN0YW50TmFtZSwgb2NjdXJyZW5jZSwgYXN0Um9vdCkpOwotCQkJfSBlbHNlIHsKLQkJCQllbnVtQ29uc3RhbnRzVG9SZW1vdmUucmVtb3ZlKGVudW1Db25zdGFudCk7Ci0JCQkJZW51bUNvbnN0YW50LnN5bmNocm9uaXplV2l0aChhc3RSb290KTsKLQkJCX0KLQkJfQotCQl0aGlzLnJlbW92ZUVudW1Db25zdGFudHMoZW51bUNvbnN0YW50c1RvUmVtb3ZlKTsKLQl9Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZUVudW1Db25zdGFudCBidWlsZEVudW1Db25zdGFudChTdHJpbmcgZmllbGROYW1lLCBpbnQgb2NjdXJyZW5jZSwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIFNvdXJjZUVudW1Db25zdGFudC5uZXdJbnN0YW5jZSh0aGlzLCB0aGlzLmFubm90YXRlZEVsZW1lbnQsIGZpZWxkTmFtZSwgb2NjdXJyZW5jZSwgdGhpcy5nZXRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoKSwgYXN0Um9vdCk7Ci0JfQotCi0KLQlwdWJsaWMgSXRlcmFibGU8SmF2YVJlc291cmNlVHlwZT4gZ2V0VHlwZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPEphdmFSZXNvdXJjZVR5cGU+IGdldEFsbFR5cGVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VFbnVtPiBnZXRFbnVtcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8SmF2YVJlc291cmNlRW51bT4gZ2V0QWxsRW51bXMoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPEphdmFSZXNvdXJjZUVudW0+KHRoaXMpOwotCX0KLQotCS8vICoqKioqKioqKiogQ291bnRlck1hcCAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb3VudGVyTWFwIHsKLQkJcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPE9iamVjdCwgU2ltcGxlSW50UmVmZXJlbmNlPiBjb3VudGVyczsKLQotCQlwcm90ZWN0ZWQgQ291bnRlck1hcChpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb3VudGVycyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgU2ltcGxlSW50UmVmZXJlbmNlPihpbml0aWFsQ2FwYWNpdHkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgaW5jcmVtZW50ZWQgY291bnQgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCQkgKi8KLQkJaW50IGluY3JlbWVudChPYmplY3QgbykgewotCQkJU2ltcGxlSW50UmVmZXJlbmNlIGNvdW50ZXIgPSB0aGlzLmNvdW50ZXJzLmdldChvKTsKLQkJCWlmIChjb3VudGVyID09IG51bGwpIHsKLQkJCQljb3VudGVyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQkJCXRoaXMuY291bnRlcnMucHV0KG8sIGNvdW50ZXIpOwotCQkJfQotCQkJY291bnRlci5pbmNyZW1lbnQoKTsKLQkJCXJldHVybiBjb3VudGVyLmdldFZhbHVlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVudW1Db25zdGFudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRW51bUNvbnN0YW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOWEwOGYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRW51bUNvbnN0YW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRURW51bUNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUVudW1Db25zdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRW51bUNvbnN0YW50OwotCi0vKioKLSAqIEphdmEgc291cmNlIGVudW0gY29uc3RhbnQKLSAqLwotZmluYWwgY2xhc3MgU291cmNlRW51bUNvbnN0YW50Ci0JZXh0ZW5kcyBTb3VyY2VNZW1iZXI8RW51bUNvbnN0YW50PgotCWltcGxlbWVudHMgSmF2YVJlc291cmNlRW51bUNvbnN0YW50Ci17Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgZW51bSBjb25zdGFudAotCSAqLwotCXN0YXRpYyBKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQgbmV3SW5zdGFuY2UoCi0JCQlKYXZhUmVzb3VyY2VFbnVtIHBhcmVudCwKLQkJCUVudW0gZGVjbGFyaW5nRW51bSwKLQkJCVN0cmluZyBuYW1lLAotCQkJaW50IG9jY3VycmVuY2UsCi0JCQlKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LAotCQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCi0JCUVudW1Db25zdGFudCBlbnVtQ29uc3RhbnQgPSBuZXcgSkRURW51bUNvbnN0YW50KAotCQkJCWRlY2xhcmluZ0VudW0sCi0JCQkJbmFtZSwKLQkJCQlvY2N1cnJlbmNlLAotCQkJCWphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5nZXRDb21waWxhdGlvblVuaXQoKSwKLQkJCQlqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuZ2V0TW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKSwKLQkJCQlqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuZ2V0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIoKSk7Ci0JCUphdmFSZXNvdXJjZUVudW1Db25zdGFudCBqcmVjID0gbmV3IFNvdXJjZUVudW1Db25zdGFudChwYXJlbnQsIGVudW1Db25zdGFudCk7Ci0JCWpyZWMuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJcmV0dXJuIGpyZWM7Ci0JfQotCQotCQotCXByaXZhdGUgU291cmNlRW51bUNvbnN0YW50KEphdmFSZXNvdXJjZUVudW0gcGFyZW50LCBFbnVtQ29uc3RhbnQgZW51bUNvbnN0YW50KXsKLQkJc3VwZXIocGFyZW50LCBlbnVtQ29uc3RhbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqIEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgaW1wbGVtZW50YXRpb24gKioqKioqKioKLQkKLQlwdWJsaWMgS2luZCBnZXRLaW5kKCkgewotCQlyZXR1cm4gS2luZC5FTlVNX0NPTlNUQU5UOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlc29sdmVUeXBlcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5yZXNvbHZlVHlwZXMoYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aChhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldE5hbWUoKSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqIEphdmFSZXNvdXJjZUVudW1Db25zdGFudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXROYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRmllbGQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUZpZWxkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNGU0YWIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5KRFRGaWVsZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRmllbGRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci0KLS8qKgotICogSmF2YSBzb3VyY2UgZmllbGQKLSAqLwotZmluYWwgY2xhc3MgU291cmNlRmllbGQKLQlleHRlbmRzIFNvdXJjZUF0dHJpYnV0ZTxGaWVsZEF0dHJpYnV0ZT4KLQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZUZpZWxkCi17Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgZmllbGQgYXR0cmlidXRlCi0JICovCi0Jc3RhdGljIEphdmFSZXNvdXJjZUZpZWxkIG5ld0luc3RhbmNlKAotCQkJSmF2YVJlc291cmNlVHlwZSBwYXJlbnQsCi0JCQlUeXBlIGRlY2xhcmluZ1R5cGUsCi0JCQlTdHJpbmcgbmFtZSwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQotCQlGaWVsZEF0dHJpYnV0ZSBmaWVsZCA9IG5ldyBKRFRGaWVsZEF0dHJpYnV0ZSgKLQkJCQlkZWNsYXJpbmdUeXBlLAotCQkJCW5hbWUsCi0JCQkJb2NjdXJyZW5jZSwKLQkJCQlqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuZ2V0Q29tcGlsYXRpb25Vbml0KCksCi0JCQkJamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmdldE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCksCi0JCQkJamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCkpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCBqcnBhID0gbmV3IFNvdXJjZUZpZWxkKHBhcmVudCwgZmllbGQpOwotCQlqcnBhLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXJldHVybiBqcnBhOwotCX0KLQkKLQkKLQlwcml2YXRlIFNvdXJjZUZpZWxkKEphdmFSZXNvdXJjZVR5cGUgcGFyZW50LCBGaWVsZEF0dHJpYnV0ZSBmaWVsZCl7Ci0JCXN1cGVyKHBhcmVudCwgZmllbGQpOwotCX0KLQotCS8vICoqKioqKioqIEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgaW1wbGVtZW50YXRpb24gKioqKioqKioKLQkKLQlwdWJsaWMgS2luZCBnZXRLaW5kKCkgewotCQlyZXR1cm4gS2luZC5GSUVMRDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKEFTVE5vZGUgbm9kZSkgewotCQlzdXBlci5pbml0aWFsaXplKG5vZGUpOwotCQl0aGlzLmluaXRpYWxpemUoKChGaWVsZERlY2xhcmF0aW9uKSBub2RlKS5nZXRUeXBlKCkucmVzb2x2ZUJpbmRpbmcoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKEFTVE5vZGUgbm9kZSkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGgobm9kZSk7Ci0JCXRoaXMuc3luY2hyb25pemVXaXRoKCgoRmllbGREZWNsYXJhdGlvbikgbm9kZSkuZ2V0VHlwZSgpLnJlc29sdmVCaW5kaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTWVtYmVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNZW1iZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgwZjE3NS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNZW1iZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotLyoqCi0gKiBKYXZhIHNvdXJjZSBtZW1iZXIgKGFubm90YXRpb25zLCAicGVyc2lzdGFibGUiKQotICovCi1hYnN0cmFjdCBjbGFzcyBTb3VyY2VNZW1iZXI8TSBleHRlbmRzIE1lbWJlcj4KLQlleHRlbmRzIFNvdXJjZUFubm90YXRlZEVsZW1lbnQ8TT4KLQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZU1lbWJlcgotewotCWJvb2xlYW4gZmluYWxfOyAgLy8gJ2ZpbmFsJyBpcyBhIHJlc2VydmVkIHdvcmQKLQotCWJvb2xlYW4gdHJhbnNpZW50XzsgIC8vICd0cmFuc2llbnQnIGlzIGEgcmVzZXJ2ZWQgd29yZAotCi0JYm9vbGVhbiBwdWJsaWNfOyAgLy8gJ3B1YmxpYycgaXMgYSByZXNlcnZlZCB3b3JkCi0KLQlib29sZWFuIHN0YXRpY187ICAvLyAnc3RhdGljJyBpcyBhIHJlc2VydmVkIHdvcmQKLQotCWJvb2xlYW4gcHJvdGVjdGVkXzsgLy8gJ3Byb3RlY3RlZCcgaXMgYSByZXNlcnZlZCB3b3JkCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlTb3VyY2VNZW1iZXIoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE0gbWVtYmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKElCaW5kaW5nIGJpbmRpbmcpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShiaW5kaW5nKTsKLQkJdGhpcy5maW5hbF8gPSB0aGlzLmJ1aWxkRmluYWwoYmluZGluZyk7Ci0JCXRoaXMudHJhbnNpZW50XyA9IHRoaXMuYnVpbGRUcmFuc2llbnQoYmluZGluZyk7Ci0JCXRoaXMucHVibGljXyA9IHRoaXMuYnVpbGRQdWJsaWMoYmluZGluZyk7Ci0JCXRoaXMuc3RhdGljXyA9IHRoaXMuYnVpbGRTdGF0aWMoYmluZGluZyk7Ci0JCXRoaXMucHJvdGVjdGVkXyA9IHRoaXMuYnVpbGRQcm90ZWN0ZWQoYmluZGluZyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVXaXRoKElCaW5kaW5nIGJpbmRpbmcpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGJpbmRpbmcpOwotCQl0aGlzLnN5bmNGaW5hbCh0aGlzLmJ1aWxkRmluYWwoYmluZGluZykpOwotCQl0aGlzLnN5bmNUcmFuc2llbnQodGhpcy5idWlsZFRyYW5zaWVudChiaW5kaW5nKSk7Ci0JCXRoaXMuc3luY1B1YmxpYyh0aGlzLmJ1aWxkUHVibGljKGJpbmRpbmcpKTsKLQkJdGhpcy5zeW5jU3RhdGljKHRoaXMuYnVpbGRTdGF0aWMoYmluZGluZykpOwotCQl0aGlzLnN5bmNQcm90ZWN0ZWQodGhpcy5idWlsZFByb3RlY3RlZChiaW5kaW5nKSk7Ci0JfQotCi0JLy8gKioqKiogZmluYWwKLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmFsKCkgewotCQlyZXR1cm4gdGhpcy5maW5hbF87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNGaW5hbChib29sZWFuIGFzdEZpbmFsKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5maW5hbF87Ci0JCXRoaXMuZmluYWxfID0gYXN0RmluYWw7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGSU5BTF9QUk9QRVJUWSwgb2xkLCBhc3RGaW5hbCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkRmluYWwoSUJpbmRpbmcgYmluZGluZykgewotCQlyZXR1cm4gKGJpbmRpbmcgPT0gbnVsbCkgPyBmYWxzZSA6IE1vZGlmaWVyLmlzRmluYWwoYmluZGluZy5nZXRNb2RpZmllcnMoKSk7Ci0JfQotCi0JLy8gKioqKiogdHJhbnNpZW50Ci0JcHVibGljIGJvb2xlYW4gaXNUcmFuc2llbnQoKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zaWVudF87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNUcmFuc2llbnQoYm9vbGVhbiBhc3RUcmFuc2llbnQpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLnRyYW5zaWVudF87Ci0JCXRoaXMudHJhbnNpZW50XyA9IGFzdFRyYW5zaWVudDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRSQU5TSUVOVF9QUk9QRVJUWSwgb2xkLCBhc3RUcmFuc2llbnQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBidWlsZFRyYW5zaWVudChJQmluZGluZyBiaW5kaW5nKSB7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IGZhbHNlIDogTW9kaWZpZXIuaXNUcmFuc2llbnQoYmluZGluZy5nZXRNb2RpZmllcnMoKSk7Ci0JfQotCi0JLy8gKioqKiogcHVibGljCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaWMoKSB7Ci0JCXJldHVybiB0aGlzLnB1YmxpY187Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNQdWJsaWMoYm9vbGVhbiBhc3RQdWJsaWMpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLnB1YmxpY187Ci0JCXRoaXMucHVibGljXyA9IGFzdFB1YmxpYzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBVQkxJQ19QUk9QRVJUWSwgb2xkLCBhc3RQdWJsaWMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBidWlsZFB1YmxpYyhJQmluZGluZyBiaW5kaW5nKSB7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IGZhbHNlIDogTW9kaWZpZXIuaXNQdWJsaWMoYmluZGluZy5nZXRNb2RpZmllcnMoKSk7Ci0JfQotCi0JLy8gKioqKiogc3RhdGljCi0JcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7Ci0JCXJldHVybiB0aGlzLnN0YXRpY187Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNTdGF0aWMoYm9vbGVhbiBhc3RTdGF0aWMpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLnN0YXRpY187Ci0JCXRoaXMuc3RhdGljXyA9IGFzdFN0YXRpYzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNUQVRJQ19QUk9QRVJUWSwgb2xkLCBhc3RTdGF0aWMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBidWlsZFN0YXRpYyhJQmluZGluZyBiaW5kaW5nKSB7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IGZhbHNlIDogTW9kaWZpZXIuaXNTdGF0aWMoYmluZGluZy5nZXRNb2RpZmllcnMoKSk7Ci0JfQotCQotCS8vICoqKioqIHByb3RlY3RlZAotCXB1YmxpYyBib29sZWFuIGlzUHJvdGVjdGVkKCkgewotCQlyZXR1cm4gdGhpcy5wcm90ZWN0ZWRfOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jUHJvdGVjdGVkKGJvb2xlYW4gYXN0UHJvdGVjdGVkKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5wcm90ZWN0ZWRfOwotCQl0aGlzLnByb3RlY3RlZF8gPSBhc3RQcm90ZWN0ZWQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9URUNURURfUFJPUEVSVFksIG9sZCwgYXN0UHJvdGVjdGVkKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYnVpbGRQcm90ZWN0ZWQoSUJpbmRpbmcgYmluZGluZykgewotCQlyZXR1cm4gKGJpbmRpbmcgPT0gbnVsbCkgPyBmYWxzZSA6IE1vZGlmaWVyLmlzUHJvdGVjdGVkKGJpbmRpbmcuZ2V0TW9kaWZpZXJzKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogbWlzY2VsbGFuZW91cyAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihTdHJpbmcgbWVtYmVyTmFtZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGVkRWxlbWVudC5tYXRjaGVzKG1lbWJlck5hbWUsIG9jY3VycmVuY2UpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBBbm5vdGF0aW9uIHNldFByaW1hcnlBbm5vdGF0aW9uKFN0cmluZyBwcmltYXJ5QW5ub3RhdGlvbk5hbWUsIEl0ZXJhYmxlPFN0cmluZz4gc3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcykgewotCQlyZXR1cm4gc3VwZXIuc2V0UHJpbWFyeUFubm90YXRpb24ocHJpbWFyeUFubm90YXRpb25OYW1lLCBzdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gZG8gbm90aGluZz8KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1B1YmxpY09yUHJvdGVjdGVkKCkgewotCQlyZXR1cm4gdGhpcy5pc1B1YmxpYygpIHx8IHRoaXMuaXNQcm90ZWN0ZWQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNZXRob2QuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU1ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTJkMmQ3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JTWV0aG9kQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUTWV0aG9kQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWV0aG9kQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5NZXRob2RTaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci0KLS8qKgotICogSmF2YSBzb3VyY2UgbWV0aG9kCi0gKi8KLWZpbmFsIGNsYXNzIFNvdXJjZU1ldGhvZAotCQlleHRlbmRzIFNvdXJjZUF0dHJpYnV0ZTxNZXRob2RBdHRyaWJ1dGU+Ci0JCWltcGxlbWVudHMgSmF2YVJlc291cmNlTWV0aG9kIHsKLQkKLQlib29sZWFuIGNvbnN0cnVjdG9yOwotCQotCXByaXZhdGUgZmluYWwgVmVjdG9yPFN0cmluZz4gcGFyYW1ldGVyVHlwZU5hbWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCi0JCi0JLyoqCi0JICogY29uc3RydWN0IG1ldGhvZAotCSAqLwotCXN0YXRpYyBKYXZhUmVzb3VyY2VNZXRob2QgbmV3SW5zdGFuY2UoCi0JCQlKYXZhUmVzb3VyY2VUeXBlIHBhcmVudCwKLQkJCVR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCU1ldGhvZFNpZ25hdHVyZSBzaWduYXR1cmUsCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQsCi0JCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotCQkKLQkJTWV0aG9kQXR0cmlidXRlIG1ldGhvZCA9IEpEVE1ldGhvZEF0dHJpYnV0ZS5uZXdJbnN0YW5jZSgKLQkJCQlkZWNsYXJpbmdUeXBlLAotCQkJCXNpZ25hdHVyZSwKLQkJCQlvY2N1cnJlbmNlLAotCQkJCWphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5nZXRDb21waWxhdGlvblVuaXQoKSwKLQkJCQlqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuZ2V0TW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKSwKLQkJCQlqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuZ2V0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIoKSk7Ci0JCUphdmFSZXNvdXJjZU1ldGhvZCBqcm0gPSBuZXcgU291cmNlTWV0aG9kKHBhcmVudCwgbWV0aG9kKTsKLQkJanJtLmluaXRpYWxpemUobWV0aG9kRGVjbGFyYXRpb24pOwotCQlyZXR1cm4ganJtOwotCX0KLQkKLQkKLQlwcml2YXRlIFNvdXJjZU1ldGhvZChKYXZhUmVzb3VyY2VUeXBlIHBhcmVudCwgTWV0aG9kQXR0cmlidXRlIG1ldGhvZCl7Ci0JCXN1cGVyKHBhcmVudCwgbWV0aG9kKTsKLQl9Ci0KLQkvL2NhbGwgaW5pdGlhbGl6ZShNZXRob2REZWNsYXJhdGlvbikgbm93IGZvciBwZXJmb3JtYW5jZQotCS8vdHJ5aW5nIHRvIG1pbmltaXplIEFQSSBjaGFuZ2VzLCB0aGlzIHNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIGludGVyZmFjZQotCS8vVE9ETyBvdGhlciBtZW1iZXJzIG9mIHRoaXMgaGllcmFyY2h5IHNob3VsZCBoYXZlIHNpbWlsYXIgaW5pdGlhbGl6ZSBtZXRob2RzCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKElCaW5kaW5nIGJpbmRpbmcpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShiaW5kaW5nKTsKLQkJdGhpcy5jb25zdHJ1Y3RvciA9IHRoaXMuYnVpbGRDb25zdHJ1Y3RvcigoSU1ldGhvZEJpbmRpbmcpIGJpbmRpbmcpOwotCQl0aGlzLnBhcmFtZXRlclR5cGVOYW1lcy5hZGRBbGwodGhpcy5idWlsZFBhcmFtZXRlclR5cGVOYW1lcygoSU1ldGhvZEJpbmRpbmcpIGJpbmRpbmcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUobWV0aG9kRGVjbGFyYXRpb24pOwotCQlJTWV0aG9kQmluZGluZyBiaW5kaW5nID0gbWV0aG9kRGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKTsKLQkJdGhpcy5pbml0aWFsaXplKGJpbmRpbmcuZ2V0UmV0dXJuVHlwZSgpKTsKLQkJdGhpcy5pbml0aWFsaXplKGJpbmRpbmcpOwotCQkKLQl9Ci0JCi0JCi0JLy8gKioqKioqKiogSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKgotCQotCXB1YmxpYyBLaW5kIGdldEtpbmQoKSB7Ci0JCXJldHVybiBLaW5kLk1FVEhPRDsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnJlc29sdmVUeXBlcyhhc3RSb290KTsKLQl9Ci0KLQkvL2NhbGwgc3luY2hyb25pemVXaXRoKE1ldGhvZERlY2xhcmF0aW9uKSBub3cgZm9yIHBlcmZvcm1hbmNlCi0JLy90cnlpbmcgdG8gbWluaW1pemUgQVBJIGNoYW5nZXMsIHRoaXMgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgaW50ZXJmYWNlCi0JLy9UT0RPIG90aGVyIG1lbWJlcnMgb2YgdGhpcyBoaWVyYXJjaHkgc2hvdWxkIGhhdmUgc2ltaWxhciBzeW5jaHJvbml6ZVdpdGggbWV0aG9kcwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKG1ldGhvZERlY2xhcmF0aW9uKTsKLQkJSU1ldGhvZEJpbmRpbmcgYmluZGluZyA9IG1ldGhvZERlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nKCk7Ci0JCXRoaXMuc3luY2hyb25pemVXaXRoKGJpbmRpbmcuZ2V0UmV0dXJuVHlwZSgpKTsKLQkJdGhpcy5zeW5jaHJvbml6ZVdpdGgoYmluZGluZyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKElCaW5kaW5nIGJpbmRpbmcpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGJpbmRpbmcpOwotCQl0aGlzLnN5bmNDb25zdHJ1Y3Rvcih0aGlzLmJ1aWxkQ29uc3RydWN0b3IoKElNZXRob2RCaW5kaW5nKSBiaW5kaW5nKSk7Ci0JCXRoaXMuc3luY1BhcmFtZXRlclR5cGVOYW1lcyh0aGlzLmJ1aWxkUGFyYW1ldGVyVHlwZU5hbWVzKChJTWV0aG9kQmluZGluZykgYmluZGluZykpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0TWV0aG9kTmFtZSgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWV0aG9kIG5hbWUgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0TmFtZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBwYXJhbWV0ZXIgdHlwZSBuYW1lcyAqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRQYXJhbWV0ZXJUeXBlTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFN0cmluZz4odGhpcy5wYXJhbWV0ZXJUeXBlTmFtZXMpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlclR5cGVOYW1lKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5wYXJhbWV0ZXJUeXBlTmFtZXMuZ2V0KGluZGV4KTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRQYXJhbWV0ZXJzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFyYW1ldGVyVHlwZU5hbWVzLnNpemUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNQYXJhbWV0ZXJUeXBlTmFtZXMoTGlzdDxTdHJpbmc+IGFzdFBhcmFtZXRlclR5cGVOYW1lcykgewotCQl0aGlzLnN5bmNocm9uaXplTGlzdChhc3RQYXJhbWV0ZXJUeXBlTmFtZXMsIHRoaXMucGFyYW1ldGVyVHlwZU5hbWVzLCBQQVJBTUVURVJfVFlQRV9OQU1FU19MSVNUKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRQYXJhbWV0ZXJUeXBlTmFtZXMoSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgewotCQlpZiAobWV0aG9kQmluZGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQkJQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChJVHlwZUJpbmRpbmcgcGFyYW1ldGVyVHlwZSA6IG1ldGhvZEJpbmRpbmcuZ2V0UGFyYW1ldGVyVHlwZXMoKSkgewotCQkJaWYgKHBhcmFtZXRlclR5cGUuaXNUeXBlVmFyaWFibGUoKSkgewotCQkJCS8vIGUuZy4gIkUgZXh0ZW5kcyBOdW1iZXIiIGhhcyBhbiBlcmFzdXJlIG9mICJOdW1iZXIiCi0JCQkJcGFyYW1ldGVyVHlwZSA9IHBhcmFtZXRlclR5cGUuZ2V0RXJhc3VyZSgpOwotCQkJfQotCQkJU3RyaW5nIHB0TmFtZSA9IHBhcmFtZXRlclR5cGUuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkJbmFtZXMuYWRkKHB0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb25zdHJ1Y3RvciAqKioqKgotCQotCXB1YmxpYyBib29sZWFuIGlzQ29uc3RydWN0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnN0cnVjdG9yOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3luY0NvbnN0cnVjdG9yKGJvb2xlYW4gYXN0Q29uc3RydWN0b3IpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmNvbnN0cnVjdG9yOwotCQl0aGlzLmNvbnN0cnVjdG9yID0gYXN0Q29uc3RydWN0b3I7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT05TVFJVQ1RPUl9QUk9QRVJUWSwgb2xkLCBhc3RDb25zdHJ1Y3Rvcik7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBidWlsZENvbnN0cnVjdG9yKElNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsKLQkJcmV0dXJuIG1ldGhvZEJpbmRpbmcgPT0gbnVsbCA/IGZhbHNlIDogbWV0aG9kQmluZGluZy5pc0NvbnN0cnVjdG9yKCk7Ci0JfQotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihNZXRob2RTaWduYXR1cmUgc2lnbmF0dXJlLCBpbnQgb2NjdXJyZW5jZSkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0ZWRFbGVtZW50Lm1hdGNoZXMoc2lnbmF0dXJlLCBvY2N1cnJlbmNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VOYW1lZEFubm90YXRpb24uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU5hbWVkQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGMxN2YzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU5hbWVkQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci0KLS8qKgotICogVXNlZCBmb3IgYW5ub3RhdGlvbnMgdGhhdCBoYXZlIG5vIGJlaGF2aW9yLCBqdXN0IGEgbmFtZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlTmFtZWRBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvbk5hbWU7Ci0KLQlwdWJsaWMgU291cmNlTmFtZWRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGFubm90YXRpb25OYW1lKSk7Ci0JCXRoaXMuYW5ub3RhdGlvbk5hbWUgPSBhbm5vdGF0aW9uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm90aGluZwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9ub3RoaW5nCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5hbm5vdGF0aW9uTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTm9kZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjBmMzFiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5BYnN0cmFjdEphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotCi0KLS8qKgotICogU291cmNlIGNvbnZlbmllbmNlIG1ldGhvZHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNvdXJjZU5vZGUKLQlleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlTm9kZQotewotCi0JcHJvdGVjdGVkIFNvdXJjZU5vZGUoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGdldEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCgpIHsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQpIHRoaXMuZ2V0Um9vdCgpOwotCX0KLQotCXByb3RlY3RlZCBDb21waWxhdGlvblVuaXQgYnVpbGRBU1RSb290KCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoKS5idWlsZEFTVFJvb3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBuZXN0ZWRBbm5vdGF0aW9uQWRkZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE5lc3RhYmxlQW5ub3RhdGlvbiBhZGRlZEFubm90YXRpb24pIHsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBuZXN0ZWRBbm5vdGF0aW9uc1JlbW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8PyBleHRlbmRzIE5lc3RhYmxlQW5ub3RhdGlvbj4gcmVtb3ZlZEFubm90YXRpb25zKSB7Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRBbm5vdGF0aW9ucyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb25Qcm92aWRlciBnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBbm5vdGF0aW9uUHJvdmlkZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYW5ub3RhdGlvbiBjb250YWluZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogQSBjb250YWluZXIgZm9yIG5lc3RlZCBhbm5vdGF0aW9ucy4gVGhlIG93bmVyIG9mIHRoZSBBbm5vdGF0aW9uQ29udGFpbmVyCi0JICogbmVlZHMgdG8gY2FsbAotCSAqIHtAbGluayAjaW5pdGlhbGl6ZUZyb21Db250YWluZXJBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uKX0KLQkgKiBvbiBpdC4KLQkgKiBAcGFyYW0gPEE+IHRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZSBuZXN0YWJsZSBhbm5vdGF0aW9ucwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBBbm5vdGF0aW9uQ29udGFpbmVyPEEgZXh0ZW5kcyBOZXN0YWJsZUFubm90YXRpb24+IHsKLQkJcHJvdGVjdGVkIGZpbmFsIFZlY3RvcjxBPiBuZXN0ZWRBbm5vdGF0aW9ucyA9IG5ldyBWZWN0b3I8QT4oKTsKLQotCQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkNvbnRhaW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBlbGVtZW50IG5hbWUgb2YgdGhlIG5lc3RlZCBhbm5vdGF0aW9ucwotCQkgKi8KLQkJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRFbGVtZW50TmFtZSgpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5lc3RlZCBhbm5vdGF0aW9uIG5hbWUKLQkJICovCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TmVzdGVkQW5ub3RhdGlvbk5hbWUoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIGEgbmV3IG5lc3RlZCBhbm5vdGF0aW9uIGF0IHRoZSBnaXZlbiBpbmRleAotCQkgKi8KLQkJcHJvdGVjdGVkIGFic3RyYWN0IEEgYnVpbGROZXN0ZWRBbm5vdGF0aW9uKGludCBpbmRleCk7Ci0KLQkJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Db250YWluZXJBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGFzdENvbnRhaW5lckFubm90YXRpb24pIHsKLQkJCS8vIGlnbm9yZSB0aGUgbmVzdGVkIEFTVCBhbm5vdGF0aW9ucyB0aGVtc2VsdmVzCi0JCQkvLyBUT0RPIChtYXliZSBzb21lZGF5IHdlIGNhbiB1c2UgdGhlbSBkdXJpbmcgaW5pdGlhbGl6YXRpb24uLi4pCi0JCQlpbnQgc2l6ZSA9IHRoaXMuZ2V0TmVzdGVkQXN0QW5ub3RhdGlvbnMoYXN0Q29udGFpbmVyQW5ub3RhdGlvbikuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlBIG5lc3RlZEFubm90YXRpb24gPSB0aGlzLmJ1aWxkTmVzdGVkQW5ub3RhdGlvbihpKTsKLQkJCQl0aGlzLm5lc3RlZEFubm90YXRpb25zLmFkZChpLCBuZXN0ZWRBbm5vdGF0aW9uKTsKLQkJCQluZXN0ZWRBbm5vdGF0aW9uLmluaXRpYWxpemUoKENvbXBpbGF0aW9uVW5pdCkgYXN0Q29udGFpbmVyQW5ub3RhdGlvbi5nZXRSb290KCkpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFN5bmNocm9uaXplIHRoZSByZXNvdXJjZSBtb2RlbCBhbm5vdGF0aW9ucyB3aXRoIHRob3NlIGluIHRoZSBzcGVjaWZpZWQgQVNULgotCQkgKiBUcmlnZ2VyIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCQkgKi8KLQkJcHVibGljIHZvaWQgc3luY2hyb25pemUob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYXN0Q29udGFpbmVyQW5ub3RhdGlvbikgewotCQkJQXJyYXlMaXN0PG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uPiBhc3RBbm5vdGF0aW9ucyA9IHRoaXMuZ2V0TmVzdGVkQXN0QW5ub3RhdGlvbnMoYXN0Q29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCQlJdGVyYXRvcjxvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbj4gYXN0QW5ub3RhdGlvblN0cmVhbSA9IGFzdEFubm90YXRpb25zLml0ZXJhdG9yKCk7Ci0KLQkJCWZvciAoQSBuZXN0ZWRBbm5vdGF0aW9uIDogdGhpcy5nZXROZXN0ZWRBbm5vdGF0aW9ucygpKSB7Ci0JCQkJaWYgKGFzdEFubm90YXRpb25TdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJCS8vIG1hdGNoaW5nIEFTVCBhbm5vdGF0aW9uIGlzIHByZXNlbnQgLSBzeW5jaHJvbml6ZSB0aGUgbmVzdGVkIGFubm90YXRpb24KLQkJCQkJYXN0QW5ub3RhdGlvblN0cmVhbS5uZXh0KCk7ICAvLyBUT0RPIHBhc3MgdGhpcyB0byB0aGUgdXBkYXRlCi0JCQkJCW5lc3RlZEFubm90YXRpb24uc3luY2hyb25pemVXaXRoKChDb21waWxhdGlvblVuaXQpIGFzdENvbnRhaW5lckFubm90YXRpb24uZ2V0Um9vdCgpKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBubyBtb3JlIEFTVCBhbm5vdGF0aW9ucyAtIHJlbW92ZSB0aGUgcmVtYWluaW5nIG5lc3RlZCBhbm5vdGF0aW9ucyBhbmQgZXhpdAotCQkJCQl0aGlzLnN5bmNSZW1vdmVOZXN0ZWRBbm5vdGF0aW9ucyhhc3RBbm5vdGF0aW9ucy5zaXplKCkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBhZGQgbmVzdGVkIGFubm90YXRpb25zIGZvciBhbnkgcmVtYWluaW5nIEFTVCBhbm5vdGF0aW9ucwotCQkJd2hpbGUgKGFzdEFubm90YXRpb25TdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJdGhpcy5zeW5jQWRkTmVzdGVkQW5ub3RhdGlvbihhc3RBbm5vdGF0aW9uU3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEE+IGdldE5lc3RlZEFubm90YXRpb25zKCkgewotCQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8QT4odGhpcy5uZXN0ZWRBbm5vdGF0aW9ucyk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE5lc3RlZEFubm90YXRpb25zU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLm5lc3RlZEFubm90YXRpb25zLnNpemUoKTsKLQkJfQotCi0JCXB1YmxpYyBBIGdldE5lc3RlZEFubm90YXRpb24oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5uZXN0ZWRBbm5vdGF0aW9ucy5nZXQoaW5kZXgpOwotCQl9Ci0KLQkJcHVibGljIEEgYWRkTmVzdGVkQW5ub3RhdGlvbihpbnQgaW5kZXgpIHsKLQkJCS8vIGFkZCBhIG5ldyBhbm5vdGF0aW9uIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuLi4KLQkJCWludCBzb3VyY2VJbmRleCA9IHRoaXMubmVzdGVkQW5ub3RhdGlvbnMuc2l6ZSgpOwotCQkJQSBuZXN0ZWRBbm5vdGF0aW9uID0gdGhpcy5idWlsZE5lc3RlZEFubm90YXRpb24oc291cmNlSW5kZXgpOwotCQkJdGhpcy5uZXN0ZWRBbm5vdGF0aW9ucy5hZGQoc291cmNlSW5kZXgsIG5lc3RlZEFubm90YXRpb24pOwotCQkJbmVzdGVkQW5ub3RhdGlvbi5uZXdBbm5vdGF0aW9uKCk7Ci0JCQluZXN0ZWRBbm5vdGF0aW9uLmluaXRpYWxpemUobmVzdGVkQW5ub3RhdGlvbi5nZXRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoKS5idWlsZEFTVFJvb3QoKSk7Ci0JCQkvLyAuLi50aGVuIG1vdmUgaXQgdG8gdGhlIHNwZWNpZmllZCBpbmRleAotCQkJdGhpcy5tb3ZlTmVzdGVkQW5ub3RhdGlvbihpbmRleCwgc291cmNlSW5kZXgpOwotCQkJcmV0dXJuIG5lc3RlZEFubm90YXRpb247Ci0JCX0KLQotCQlwdWJsaWMgQSBtb3ZlTmVzdGVkQW5ub3RhdGlvbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJaWYgKHRhcmdldEluZGV4ICE9IHNvdXJjZUluZGV4KSB7Ci0JCQkJcmV0dXJuIHRoaXMubW92ZU5lc3RlZEFubm90YXRpb25fKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBBIHJlbW92ZU5lc3RlZEFubm90YXRpb24oaW50IGluZGV4KSB7Ci0JCQlBIG5lc3RlZEFubm90YXRpb24gPSB0aGlzLm5lc3RlZEFubm90YXRpb25zLnJlbW92ZShpbmRleCk7Ci0JCQluZXN0ZWRBbm5vdGF0aW9uLnJlbW92ZUFubm90YXRpb24oKTsKLQkJCXRoaXMuc3luY0FzdEFubm90YXRpb25zQWZ0ZXJSZW1vdmUoaW5kZXgpOwotCQkJcmV0dXJuIG5lc3RlZEFubm90YXRpb247Ci0JCX0KLQotCQlwcml2YXRlIEEgbW92ZU5lc3RlZEFubm90YXRpb25fKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCQlBIG5lc3RlZEFubm90YXRpb24gPSBDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLm5lc3RlZEFubm90YXRpb25zLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpLmdldCh0YXJnZXRJbmRleCk7Ci0JCQl0aGlzLnN5bmNBc3RBbm5vdGF0aW9uc0FmdGVyTW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIG5lc3RlZEFubm90YXRpb24pOwotCQkJcmV0dXJuIG5lc3RlZEFubm90YXRpb247Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGEgbGlzdCBvZiB0aGUgbmVzdGVkIEFTVCBhbm5vdGF0aW9ucy4KLQkJICovCi0JCXByaXZhdGUgQXJyYXlMaXN0PG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uPiBnZXROZXN0ZWRBc3RBbm5vdGF0aW9ucyhvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBhc3RDb250YWluZXJBbm5vdGF0aW9uKSB7Ci0JCQlBcnJheUxpc3Q8b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24+KCk7Ci0JCQlpZiAoYXN0Q29udGFpbmVyQW5ub3RhdGlvbiA9PSBudWxsIHx8IGFzdENvbnRhaW5lckFubm90YXRpb24uaXNNYXJrZXJBbm5vdGF0aW9uKCkpIHsKLQkJCQkvLyBubyBuZXN0ZWQgYW5ub3RhdGlvbnMKLQkJCX0KLQkJCWVsc2UgaWYgKGFzdENvbnRhaW5lckFubm90YXRpb24uaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpIHsKLQkJCQlpZiAodGhpcy5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygidmFsdWUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCUV4cHJlc3Npb24gZXggPSAoKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGFzdENvbnRhaW5lckFubm90YXRpb24pLmdldFZhbHVlKCk7Ci0JCQkJCXRoaXMuYWRkQXN0QW5ub3RhdGlvbnNUbyhleCwgcmVzdWx0KTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBubyBuZXN0ZWQgYW5ub3RhdGlvbnMKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChhc3RDb250YWluZXJBbm5vdGF0aW9uLmlzTm9ybWFsQW5ub3RhdGlvbigpKSB7Ci0JCQkJTWVtYmVyVmFsdWVQYWlyIHBhaXIgPSB0aGlzLmdldE1lbWJlclZhbHVlUGFpcigoTm9ybWFsQW5ub3RhdGlvbikgYXN0Q29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCQkJaWYgKHBhaXIgPT0gbnVsbCkgewotCQkJCQkvLyBubyBuZXN0ZWQgYW5ub3RhdGlvbnMKLQkJCQl9IGVsc2UgewotCQkJCQl0aGlzLmFkZEFzdEFubm90YXRpb25zVG8ocGFpci5nZXRWYWx1ZSgpLCByZXN1bHQpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIHdoYXRldmVyIGFubm90YXRpb25zIGFyZSByZXByZXNlbnRlZCBieSB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24gdG8KLQkJICogdGhlIHNwZWNpZmllZCBsaXN0LiBEbyBub3QgYWRkIG51bGwgdG8gdGhlIGxpc3QgZm9yIGFueSBub24tYW5ub3RhdGlvbiBleHByZXNzaW9uLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGFkZEFzdEFubm90YXRpb25zVG8oRXhwcmVzc2lvbiBleHByZXNzaW9uLCBBcnJheUxpc3Q8b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24+IGFzdEFubm90YXRpb25zKSB7Ci0JCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7Ci0JCQkJLy9kbyBub3QgYWRkIG51bGwgdG8gdGhlIGxpc3QsIG5vdCBzdXJlIGhvdyB3ZSB3b3VsZCBnZXQgaGVyZS4uLgotCQkJfQotCQkJZWxzZSBpZiAoZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIpIHsKLQkJCQl0aGlzLmFkZEFzdEFubm90YXRpb25zVG8oKEFycmF5SW5pdGlhbGl6ZXIpIGV4cHJlc3Npb24sIGFzdEFubm90YXRpb25zKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGFzdEFubm90YXRpb24gPSB0aGlzLmdldEFzdEFubm90YXRpb25fKGV4cHJlc3Npb24pOwotCQkJCWlmIChhc3RBbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQkJYXN0QW5ub3RhdGlvbnMuYWRkKGFzdEFubm90YXRpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRBc3RBbm5vdGF0aW9uc1RvKEFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplciwgQXJyYXlMaXN0PG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uPiBhc3RBbm5vdGF0aW9ucykgewotCQkJTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyA9IHRoaXMuZXhwcmVzc2lvbnMoYXJyYXlJbml0aWFsaXplcik7Ci0JCQlmb3IgKEV4cHJlc3Npb24gZXhwcmVzc2lvbiA6IGV4cHJlc3Npb25zKSB7Ci0JCQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYXN0QW5ub3RhdGlvbiA9IGdldEFzdEFubm90YXRpb24oZXhwcmVzc2lvbik7Ci0JCQkJaWYgKGFzdEFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQlhc3RBbm5vdGF0aW9ucy5hZGQoYXN0QW5ub3RhdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHJpdmF0ZSBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zKEFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplcikgewotCQkJcmV0dXJuIGFycmF5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBJZiB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24gaXMgYW4gYW5ub3RhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgcmV0dXJuIGl0OwotCQkgKiBvdGhlcndpc2UgcmV0dXJuIG51bGwuCi0JCSAqLwotCQlwcml2YXRlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldEFzdEFubm90YXRpb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCQkvLyBub3Qgc3VyZSBob3cgdGhlIGV4cHJlc3Npb24gY291bGQgYmUgbnVsbC4uLgotCQkJcmV0dXJuIChleHByZXNzaW9uID09IG51bGwpID8gbnVsbCA6IGdldEFzdEFubm90YXRpb25fKGV4cHJlc3Npb24pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHByZS1jb25kaXRpb246IGV4cHJlc3Npb24gaXMgbm90IG51bGwKLQkJICovCi0JCXByaXZhdGUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gZ2V0QXN0QW5ub3RhdGlvbl8oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCQlzd2l0Y2ggKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSkgewotCQkJCWNhc2UgQVNUTm9kZS5OT1JNQUxfQU5OT1RBVElPTjoKLQkJCQljYXNlIEFTVE5vZGUuU0lOR0xFX01FTUJFUl9BTk5PVEFUSU9OOgotCQkJCWNhc2UgQVNUTm9kZS5NQVJLRVJfQU5OT1RBVElPTjoKLQkJCQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYXN0QW5ub3RhdGlvbiA9IChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbikgZXhwcmVzc2lvbjsKLQkJCQkJaWYgKHRoaXMuZ2V0UXVhbGlmaWVkTmFtZShhc3RBbm5vdGF0aW9uKS5lcXVhbHModGhpcy5nZXROZXN0ZWRBbm5vdGF0aW9uTmFtZSgpKSkgewotCQkJCQkJcmV0dXJuIGFzdEFubm90YXRpb247Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGFzdEFubm90YXRpb24pIHsKLQkJCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGFzdEFubm90YXRpb24ucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCQlpZiAodHlwZUJpbmRpbmcgIT0gbnVsbCkgewotCQkJCVN0cmluZyByZXNvbHZlZE5hbWUgPSB0eXBlQmluZGluZy5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCQkJaWYgKHJlc29sdmVkTmFtZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiByZXNvbHZlZE5hbWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGFzdEFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJfQotCi0JCXByaXZhdGUgTWVtYmVyVmFsdWVQYWlyIGdldE1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJCUxpc3Q8TWVtYmVyVmFsdWVQYWlyPiBwYWlycyA9IHRoaXMudmFsdWVzKGFubm90YXRpb24pOwotCQkJZm9yIChNZW1iZXJWYWx1ZVBhaXIgcGFpciA6IHBhaXJzKSB7Ci0JCQkJaWYgKHBhaXIuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyh0aGlzLmdldEVsZW1lbnROYW1lKCkpKSB7Ci0JCQkJCXJldHVybiBwYWlyOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXByaXZhdGUgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHZhbHVlcyhOb3JtYWxBbm5vdGF0aW9uIG5hKSB7Ci0JCQlyZXR1cm4gbmEudmFsdWVzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQW4gYW5ub3RhdGlvbiB3YXMgbW92ZWQgd2l0aGluIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiBjb250YWluZXIgZnJvbQotCQkgKiB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldCBpbmRleC4KLQkJICogU3luY2hyb25pemUgdGhlIEFTVCBhbm5vdGF0aW9ucyB3aXRoIHRoZSByZXNvdXJjZSBtb2RlbCBhbm5vdGF0aW9uIGNvbnRhaW5lciwKLQkJICogc3RhcnRpbmcgd2l0aCB0aGUgbG93ZXIgaW5kZXggdG8gcHJldmVudCBvdmVybGFwLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHN5bmNBc3RBbm5vdGF0aW9uc0FmdGVyTW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgQSBuZXN0ZWRBbm5vdGF0aW9uKSB7Ci0JCQkvLyBtb3ZlIHRoZSBKYXZhIGFubm90YXRpb24gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4uLgotCQkJbmVzdGVkQW5ub3RhdGlvbi5tb3ZlQW5ub3RhdGlvbih0aGlzLm5lc3RlZEFubm90YXRpb25zLnNpemUoKSk7Ci0JCQkvLyAuLi50aGVuIHNoaWZ0IHRoZSBvdGhlciBBU1QgYW5ub3RhdGlvbnMgb3ZlciBvbmUgc2xvdC4uLgotCQkJaWYgKHNvdXJjZUluZGV4IDwgdGFyZ2V0SW5kZXgpIHsKLQkJCQlmb3IgKGludCBpID0gc291cmNlSW5kZXg7IGkgPCB0YXJnZXRJbmRleDsgaSsrKSB7Ci0JCQkJCXRoaXMubmVzdGVkQW5ub3RhdGlvbnMuZ2V0KGkpLm1vdmVBbm5vdGF0aW9uKGkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpbnQgaSA9IHNvdXJjZUluZGV4OyBpID4gdGFyZ2V0SW5kZXg7IGktLSApIHsKLQkJCQkJdGhpcy5uZXN0ZWRBbm5vdGF0aW9ucy5nZXQoaSkubW92ZUFubm90YXRpb24oaSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gLi4udGhlbiBtb3ZlIHRoZSBBU1QgYW5ub3RhdGlvbiB0byB0aGUgbm93IGVtcHR5IHNsb3QgYXQgdGhlIHRhcmdldCBpbmRleAotCQkJbmVzdGVkQW5ub3RhdGlvbi5tb3ZlQW5ub3RhdGlvbih0YXJnZXRJbmRleCk7Ci0JCX0KLQotCQkvKioKLQkJICogQW4gYW5ub3RhdGlvbiB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiBjb250YWluZXIgYXQgdGhlCi0JCSAqIHNwZWNpZmllZCBpbmRleC4KLQkJICogU3luY2hyb25pemUgdGhlIEFTVCBhbm5vdGF0aW9ucyB3aXRoIHRoZSByZXNvdXJjZSBtb2RlbCBhbm5vdGF0aW9uIGNvbnRhaW5lciwKLQkJICogc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBpbmRleCB0byBwcmV2ZW50IG92ZXJsYXAuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc3luY0FzdEFubm90YXRpb25zQWZ0ZXJSZW1vdmUoaW50IGluZGV4KSB7Ci0JCQlmb3IgKGludCBpID0gaW5kZXg7IGkgPCB0aGlzLm5lc3RlZEFubm90YXRpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJLy8gdGhlIGluZGljZXMgYXJlIHRoZSBzYW1lIGJlY2F1c2UgdGhlIG1vZGVsIGFubm90YXRpb25zIGFyZQotCQkJCS8vIGFscmVhZHkgaW4gdGhlIHByb3BlciBsb2NhdGlvbnMgLSBpdCdzIHRoZSBBU1QgYW5ub3RhdGlvbnMgdGhhdAotCQkJCS8vIG5lZWQgdG8gYmUgbW92ZWQgdG8gdGhlIG1hdGNoaW5nIGxvY2F0aW9uCi0JCQkJdGhpcy5uZXN0ZWRBbm5vdGF0aW9ucy5nZXQoaSkubW92ZUFubm90YXRpb24oaSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgc3luY0FkZE5lc3RlZEFubm90YXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYXN0QW5ub3RhdGlvbikgewotCQkJaW50IGluZGV4ID0gdGhpcy5uZXN0ZWRBbm5vdGF0aW9ucy5zaXplKCk7Ci0JCQlBIG5lc3RlZEFubm90YXRpb24gPSB0aGlzLmJ1aWxkTmVzdGVkQW5ub3RhdGlvbihpbmRleCk7Ci0JCQluZXN0ZWRBbm5vdGF0aW9uLmluaXRpYWxpemUoKENvbXBpbGF0aW9uVW5pdCkgYXN0QW5ub3RhdGlvbi5nZXRSb290KCkpOwotCQkJdGhpcy5uZXN0ZWRBbm5vdGF0aW9ucy5hZGQoaW5kZXgsIG5lc3RlZEFubm90YXRpb24pOwotCQkJdGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRkZWQoaW5kZXgsIG5lc3RlZEFubm90YXRpb24pOwotCQl9Ci0KLQkJdm9pZCBuZXN0ZWRBbm5vdGF0aW9uQWRkZWQoaW50IGluZGV4LCBBIGFkZGVkQW5ub3RhdGlvbikgewotCQkJU291cmNlTm9kZS50aGlzLm5lc3RlZEFubm90YXRpb25BZGRlZCh0aGlzLmdldE5lc3RlZEFubm90YXRpb25zTGlzdE5hbWUoKSwgaW5kZXgsIGFkZGVkQW5ub3RhdGlvbik7Ci0JCX0KLQotCQkvKioKLQkJICogUmVtb3ZlIHRoZSBuZXN0ZWQgYW5ub3RhdGlvbnMgZnJvbSB0aGUgc3BlY2lmaWVkIGluZGV4IHRvIHRoZSBlbmQgb2YKLQkJICogdGhlIGxpc3QuCi0JCSAqLwotCQl2b2lkIHN5bmNSZW1vdmVOZXN0ZWRBbm5vdGF0aW9ucyhpbnQgaW5kZXgpIHsKLQkJCUxpc3Q8QT4gc3ViTGlzdCA9IHRoaXMubmVzdGVkQW5ub3RhdGlvbnMuc3ViTGlzdChpbmRleCwgdGhpcy5uZXN0ZWRBbm5vdGF0aW9ucy5zaXplKCkpOwotCQkJTGlzdDxBPiByZW1vdmVkQW5ub3RhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEE+KHN1Ykxpc3QpOwotCQkJc3ViTGlzdC5jbGVhcigpOwotCQkJdGhpcy5uZXN0ZWRBbm5vdGF0aW9uc1JlbW92ZWQoaW5kZXgsIHJlbW92ZWRBbm5vdGF0aW9ucyk7Ci0JCX0KLQotCQl2b2lkIG5lc3RlZEFubm90YXRpb25zUmVtb3ZlZChpbnQgaW5kZXgsIExpc3Q8QT4gcmVtb3ZlZEFubm90YXRpb25zKSB7Ci0JCQlTb3VyY2VOb2RlLnRoaXMubmVzdGVkQW5ub3RhdGlvbnNSZW1vdmVkKHRoaXMuZ2V0TmVzdGVkQW5ub3RhdGlvbnNMaXN0TmFtZSgpLCBpbmRleCwgcmVtb3ZlZEFubm90YXRpb25zKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5lc3RlZCBhbm5vdGF0aW9ucyBsaXN0IG5hbWUgZm9yIGZpcmluZyBwcm9wZXJ0eSBjaGFuZ2UKLQkJICogbm90aWZpY2F0aW9uLgotCQkgKi8KLQkJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXROZXN0ZWRBbm5vdGF0aW9uc0xpc3ROYW1lKCk7Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJCXJldHVybiB0aGlzLm5lc3RlZEFubm90YXRpb25zLmlzRW1wdHkoKTsKLQkJfQotCi0JCUFubm90YXRpb25Qcm92aWRlciBnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKSB7Ci0JCQlyZXR1cm4gU291cmNlTm9kZS50aGlzLmdldEFubm90YXRpb25Qcm92aWRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm5lc3RlZEFubm90YXRpb25zKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVBhY2thZ2UuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJmYmMwNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgUmVkIEhhdCwgSW5jLgotICAqIERpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2UgYnkgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAqIFRoaXMgcHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLAotICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgKgotICAqIENvbnRyaWJ1dG9yczoKLSAgKiAgICAgUmVkIEhhdCwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICAqICAgICBPcmFjbGUKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVBhY2thZ2VCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBEbWl0cnkgR2VyYXNrb3YKLSAqIFNvdXJjZSBwYWNrYWdlLWluZm8uamF2YQotICoKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVBhY2thZ2UKLQlleHRlbmRzIFNvdXJjZUFubm90YXRlZEVsZW1lbnQ8QW5ub3RhdGVkUGFja2FnZT4KLQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZVBhY2thZ2UKLXsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgcGFja2FnZSBpbmZvCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhUmVzb3VyY2VQYWNrYWdlIG5ld0luc3RhbmNlKAotCQkJSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IHBhcmVudCwKLQkJCVBhY2thZ2VEZWNsYXJhdGlvbiBkZWNsYXJpbmdQYWNrYWdlLAotCQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQW5ub3RhdGVkUGFja2FnZSBwYWNrID0gbmV3IEpEVFBhY2thZ2UoCi0JCQkJZGVjbGFyaW5nUGFja2FnZSwKLQkJCQlwYXJlbnQuZ2V0Q29tcGlsYXRpb25Vbml0KCksIAotCQkJCXBhcmVudC5nZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcigpLAotCQkJCXBhcmVudC5nZXRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSBqcnBwID0gbmV3IFNvdXJjZVBhY2thZ2UocGFyZW50LCBwYWNrKTsKLQkJanJwcC5pbml0aWFsaXplKGFzdFJvb3QpOwotCQlyZXR1cm4ganJwcDsKLQl9CQotCi0JcHJpdmF0ZSBTb3VyY2VQYWNrYWdlKAotCQkJSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IHBhcmVudCwKLQkJCUFubm90YXRlZFBhY2thZ2UgcGFjayl7Ci0JCXN1cGVyKHBhcmVudCwgcGFjayk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKElCaW5kaW5nIGJpbmRpbmcpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShiaW5kaW5nKTsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoKElQYWNrYWdlQmluZGluZykgYmluZGluZyk7Ci0JfQotCi0JLy8gKioqKioqKiogSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKgotCQotCXB1YmxpYyBLaW5kIGdldEtpbmQoKSB7Ci0JCXJldHVybiBLaW5kLlBBQ0tBR0U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmFSZXNvdXJjZVBhY2thZ2VJbmZvIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQkvLyAqKioqKiBuYW1lCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jTmFtZShTdHJpbmcgYXN0TmFtZSkgewotCQlpZiAodmFsdWVzQXJlRGlmZmVyZW50KGFzdE5hbWUsIHRoaXMubmFtZSkpewotCQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IGFzdE5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBhc3ROYW1lKTsKLQkJfQkJCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKElQYWNrYWdlQmluZGluZyBiaW5kaW5nKSB7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IG51bGwgOiBiaW5kaW5nLmdldE5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBjaGFuZ2VzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplV2l0aChJQmluZGluZyBiaW5kaW5nKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aChiaW5kaW5nKTsKLQkJdGhpcy5zeW5jTmFtZSh0aGlzLmJ1aWxkTmFtZSgoSVBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VQYWNrYWdlSW5mb0NvbXBpbGF0aW9uVW5pdC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlUGFja2FnZUluZm9Db21waWxhdGlvblVuaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVlMmFhZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VQYWNrYWdlSW5mb0NvbXBpbGF0aW9uVW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgUmVkIEhhdCwgSW5jLiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgUmVkIEhhdCwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2VJbmZvQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotCi0vKioKLSAqIEBhdXRob3IgRG1pdHJ5IEdlcmFza292Ci0gKiBTb3VyY2UgcGFja2FnZS1pbmZvLmphdmEKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VQYWNrYWdlSW5mb0NvbXBpbGF0aW9uVW5pdAotCWV4dGVuZHMgU291cmNlQ29tcGlsYXRpb25Vbml0Ci0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VQYWNrYWdlSW5mb0NvbXBpbGF0aW9uVW5pdCB7Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZVBhY2thZ2UgcGFja2FnZV87CQotCi0JcHVibGljIFNvdXJjZVBhY2thZ2VJbmZvQ29tcGlsYXRpb25Vbml0KAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlBbm5vdGF0aW9uUHJvdmlkZXIgYW5ub3RhdGlvblByb3ZpZGVyLCAKLQkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyLAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXN1cGVyKGNvbXBpbGF0aW9uVW5pdCwgYW5ub3RhdGlvblByb3ZpZGVyLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlciwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IpOyAgLy8gdGhlIEpQQSBjb21waWxhdGlvbiB1bml0IGlzIHRoZSByb290IG9mIGl0cyBzdWItdHJlZQotCQl0aGlzLnBhY2thZ2VfID0gdGhpcy5idWlsZFBhY2thZ2UoKTsKLQl9Ci0KLQotCXByaXZhdGUgSmF2YVJlc291cmNlUGFja2FnZSBidWlsZFBhY2thZ2UoKSB7Ci0JCXRoaXMub3BlbkNvbXBpbGF0aW9uVW5pdCgpOwotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KCk7Ci0JCXRoaXMuY2xvc2VDb21waWxhdGlvblVuaXQoKTsKLQkJcmV0dXJuIHRoaXMuYnVpbGRQYWNrYWdlKGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VOb2RlLlJvb3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4gZ2V0VHlwZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBnZXRQcmltYXJ5VHlwZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKcHRSZXNvdXJjZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9QQUNLQUdFX0lORk9fUkVTT1VSQ0VfVFlQRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBjaGFuZ2VzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNQYWNrYWdlKGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzKCkgewotCQkvL25vLW9wCi0JfQotCi0JLy8gKioqKioqKioqKiBwYWNrYWdlLWluZm8gKioqKioqKioqKgotCi0JcHVibGljIEphdmFSZXNvdXJjZVBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFja2FnZV87Ci0JfQotCi0JcHJpdmF0ZSBKYXZhUmVzb3VyY2VQYWNrYWdlIGJ1aWxkUGFja2FnZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFBhY2thZ2UoYXN0Um9vdCwgdGhpcy5nZXRQYWNrYWdlRGVjbGFyYXRpb24oYXN0Um9vdCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jUGFja2FnZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlQYWNrYWdlRGVjbGFyYXRpb24gcGQgPSB0aGlzLmdldFBhY2thZ2VEZWNsYXJhdGlvbihhc3RSb290KTsKLQkJaWYgKHBkID09IG51bGwpIHsKLQkJCXRoaXMuc3luY1BhY2thZ2VfKG51bGwpOwotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMucGFja2FnZV8gPT0gbnVsbCkgewotCQkJCXRoaXMuc3luY1BhY2thZ2VfKHRoaXMuYnVpbGRQYWNrYWdlKGFzdFJvb3QsIHBkKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMucGFja2FnZV8uc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQYWNrYWdlRGVjbGFyYXRpb24gZ2V0UGFja2FnZURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBhc3RSb290LmdldFBhY2thZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1BhY2thZ2VfKEphdmFSZXNvdXJjZVBhY2thZ2UgYXN0UGFja2FnZSkgewotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIG9sZCA9IHRoaXMucGFja2FnZV87Ci0JCXRoaXMucGFja2FnZV8gPSBhc3RQYWNrYWdlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUEFDS0FHRSwgb2xkLCBhc3RQYWNrYWdlKTsKLQl9Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZVBhY2thZ2UgYnVpbGRQYWNrYWdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290LCBQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBTb3VyY2VQYWNrYWdlLm5ld0luc3RhbmNlKHRoaXMsIHBhY2thZ2VEZWNsYXJhdGlvbiwgYXN0Um9vdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VUeXBlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMDgxMDUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JTWV0aG9kQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5BU1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuTWV0aG9kU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyZWVJdGVyYWJsZTsKLQotLyoqCi0gKiBKYXZhIHNvdXJjZSB0eXBlICh0eXBlIG9yIGludGVyZmFjZSkKLSAqLwotZmluYWwgY2xhc3MgU291cmNlVHlwZQotCWV4dGVuZHMgU291cmNlQWJzdHJhY3RUeXBlPFR5cGU+Ci0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VUeXBlCi17Ci0KLQlwcml2YXRlIFN0cmluZyBzdXBlcmNsYXNzUXVhbGlmaWVkTmFtZTsKLQotCXByaXZhdGUgYm9vbGVhbiBhYnN0cmFjdF87ICAvLyAnYWJzdHJhY3QnIGlzIGEgcmVzZXJ2ZWQgd29yZAotCi0JcHJpdmF0ZSBib29sZWFuIGhhc05vQXJnQ29uc3RydWN0b3I7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3I7Ci0KLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxKYXZhUmVzb3VyY2VUeXBlPiB0eXBlczsKLQotCXByaXZhdGUgZmluYWwgVmVjdG9yPEphdmFSZXNvdXJjZUVudW0+IGVudW1zOwotCi0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8SmF2YVJlc291cmNlRmllbGQ+IGZpZWxkczsKLQotCXByaXZhdGUgZmluYWwgVmVjdG9yPEphdmFSZXNvdXJjZU1ldGhvZD4gbWV0aG9kczsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogYnVpbGQgdG9wLWxldmVsIHR5cGUKLQkgKi8KLQlzdGF0aWMgSmF2YVJlc291cmNlVHlwZSBuZXdJbnN0YW5jZSgKLQkJCUphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQsCi0JCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLAotCQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVHlwZSB0eXBlID0gbmV3IEpEVFR5cGUoCi0JCQkJdHlwZURlY2xhcmF0aW9uLAotCQkJCWphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5nZXRDb21waWxhdGlvblVuaXQoKSwKLQkJCQlqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuZ2V0TW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKSwKLQkJCQlqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuZ2V0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIoKSk7Ci0JCUphdmFSZXNvdXJjZVR5cGUganJwdCA9IG5ldyBTb3VyY2VUeXBlKGphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCwgdHlwZSk7Ci0JCWpycHQuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJcmV0dXJuIGpycHQ7Ci0JfQotCi0JLyoqCi0JICogYnVpbGQgbmVzdGVkIHR5cGUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBKYXZhUmVzb3VyY2VUeXBlIG5ld0luc3RhbmNlKAotCQkJSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCwKLQkJCVR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVR5cGUgdHlwZSA9IG5ldyBKRFRUeXBlKAotCQkJCWRlY2xhcmluZ1R5cGUsCi0JCQkJdHlwZURlY2xhcmF0aW9uLAotCQkJCW9jY3VycmVuY2UsCi0JCQkJamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmdldENvbXBpbGF0aW9uVW5pdCgpLAotCQkJCWphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5nZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcigpLAotCQkJCWphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5nZXRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpKTsKLQkJSmF2YVJlc291cmNlVHlwZSBqcnB0ID0gbmV3IFNvdXJjZVR5cGUoamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LCB0eXBlKTsKLQkJanJwdC5pbml0aWFsaXplKGFzdFJvb3QpOwotCQlyZXR1cm4ganJwdDsKLQl9Ci0KLQlwcml2YXRlIFNvdXJjZVR5cGUoSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCwgVHlwZSB0eXBlKSB7Ci0JCXN1cGVyKGphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCwgdHlwZSk7Ci0JCXRoaXMudHlwZXMgPSBuZXcgVmVjdG9yPEphdmFSZXNvdXJjZVR5cGU+KCk7Ci0JCXRoaXMuZW51bXMgPSBuZXcgVmVjdG9yPEphdmFSZXNvdXJjZUVudW0+KCk7Ci0JCXRoaXMuZmllbGRzID0gbmV3IFZlY3RvcjxKYXZhUmVzb3VyY2VGaWVsZD4oKTsKLQkJdGhpcy5tZXRob2RzID0gbmV3IFZlY3RvcjxKYXZhUmVzb3VyY2VNZXRob2Q+KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLmluaXRpYWxpemVUeXBlcyhhc3RSb290KTsKLQkJdGhpcy5pbml0aWFsaXplRW51bXMoYXN0Um9vdCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUZpZWxkcyhhc3RSb290KTsKLQkJdGhpcy5pbml0aWFsaXplTWV0aG9kcyhhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKElCaW5kaW5nIGJpbmRpbmcpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShiaW5kaW5nKTsKLQkJdGhpcy5zdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSA9IHRoaXMuYnVpbGRTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSgoSVR5cGVCaW5kaW5nKSBiaW5kaW5nKTsKLQkJdGhpcy5hYnN0cmFjdF8gPSB0aGlzLmJ1aWxkQWJzdHJhY3QoKElUeXBlQmluZGluZykgYmluZGluZyk7Ci0JCXRoaXMuaGFzTm9BcmdDb25zdHJ1Y3RvciA9IHRoaXMuYnVpbGRIYXNOb0FyZ0NvbnN0cnVjdG9yKChJVHlwZUJpbmRpbmcpIGJpbmRpbmcpOwotCQl0aGlzLmhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yID0gdGhpcy5idWlsZEhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yKChJVHlwZUJpbmRpbmcpIGJpbmRpbmcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB1cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aChhc3RSb290KTsKLQkJdGhpcy5zeW5jVHlwZXMoYXN0Um9vdCk7Ci0JCXRoaXMuc3luY0VudW1zKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNGaWVsZHMoYXN0Um9vdCk7Ci0JCXRoaXMuc3luY01ldGhvZHMoYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVXaXRoKElCaW5kaW5nIGJpbmRpbmcpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGJpbmRpbmcpOwotCQl0aGlzLnN5bmNTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSh0aGlzLmJ1aWxkU3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoKElUeXBlQmluZGluZykgYmluZGluZykpOwotCQl0aGlzLnN5bmNBYnN0cmFjdCh0aGlzLmJ1aWxkQWJzdHJhY3QoKElUeXBlQmluZGluZykgYmluZGluZykpOwotCQl0aGlzLnN5bmNIYXNOb0FyZ0NvbnN0cnVjdG9yKHRoaXMuYnVpbGRIYXNOb0FyZ0NvbnN0cnVjdG9yKChJVHlwZUJpbmRpbmcpIGJpbmRpbmcpKTsKLQkJdGhpcy5zeW5jSGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3IodGhpcy5idWlsZEhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yKChJVHlwZUJpbmRpbmcpIGJpbmRpbmcpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU291cmNlQW5ub3RhdGVkRWxlbWVudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIucmVzb2x2ZVR5cGVzKGFzdFJvb3QpOwotCi0JCXRoaXMuc3luY1N1cGVyY2xhc3NRdWFsaWZpZWROYW1lKHRoaXMuYnVpbGRTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSh0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0QmluZGluZyhhc3RSb290KSkpOwotCi0JCWZvciAoSmF2YVJlc291cmNlRmllbGQgZmllbGQgOiB0aGlzLmdldEZpZWxkcygpKSB7Ci0JCQlmaWVsZC5yZXNvbHZlVHlwZXMoYXN0Um9vdCk7Ci0JCX0KLQotCQkvLyBhIG5ldyB0eXBlIGNhbiB0cmlnZ2VyIGEgbWV0aG9kIHBhcmFtZXRlciB0eXBlIHRvIGJlIGEgcmVzb2x2ZWQsCi0JCS8vIGZ1bGx5LXF1YWxpZmllZCBuYW1lLCBzbyB3ZSBuZWVkIHRvIHJlYnVpbGQgb3VyIGxpc3Qgb2YgbWV0aG9kczoKLQkJLy8gICAgICJzZXRGb28oRm9vKSIgaXMgbm90IHRoZSBzYW1lIGFzICJzZXRGb28oY29tLmJhci5Gb28pIgotCQkvLyBhbmQsIHZpY2UtdmVyc2EsIGEgcmVtb3ZlZCB0eXBlIGNhbiAidW5yZXNvbHZlIiBhIHBhcmFtZXRlciB0eXBlCi0JCXRoaXMuc3luY01ldGhvZHMoYXN0Um9vdCk7Ci0KLQkJLy8gdGhpcyBpcyBjb21tZW50ZWQgb3V0IGJlY2F1c2UgdGhlIGFib3ZlIHN5bmNNZXRob2RzKCkgY2FsbHMgCi0JCS8vIEphdmFSZXNvdXJjZU1ldGhvZC5zeXN5bmNocm9uaXplV2l0aChNZXRob2REZWNsYXJhdGlvbikKLQkJLy8gb24gYWxsIHRoZSBtZXRob2RzLiByZXNvbHZlVHlwZXMoKSBpcyBhIHN1YnNldCBvZiBzeW5jaHJvbml6ZVdpdGgoKQotCQkvLyBzbyBpdCBpcyByZWR1bmRhbnQgYW5kIGV4cGVuc2l2ZSB0byBkbyBib3RoIG9mIHRoZXNlLgotCQkvL2ZvciAoSmF2YVJlc291cmNlTWV0aG9kIG1ldGhvZCA6IHRoaXMuZ2V0TWV0aG9kcygpKSB7Ci0JCS8vCW1ldGhvZC5yZXNvbHZlVHlwZXMoYXN0Um9vdCk7Ci0JCS8vfQotCQlmb3IgKEphdmFSZXNvdXJjZVR5cGUgdHlwZSA6IHRoaXMuZ2V0VHlwZXMoKSkgewotCQkJdHlwZS5yZXNvbHZlVHlwZXMoYXN0Um9vdCk7Ci0JCX0KLQkJZm9yIChKYXZhUmVzb3VyY2VFbnVtIGVudW1fIDogdGhpcy5nZXRFbnVtcygpKSB7Ci0JCQllbnVtXy5yZXNvbHZlVHlwZXMoYXN0Um9vdCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqIEphdmFSZXNvdXJjZVR5cGUgaW1wbGVtZW50YXRpb24gKioqKioqKioKLQkKLQlwdWJsaWMgS2luZCBnZXRLaW5kKCkgewotCQlyZXR1cm4gS2luZC5UWVBFOwotCX0KLQkKLQkvLyAqKioqKiBzdXBlcmNsYXNzIHF1YWxpZmllZCBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3VwZXJjbGFzc1F1YWxpZmllZE5hbWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZShTdHJpbmcgYXN0U3VwZXJjbGFzc1F1YWxpZmllZE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3VwZXJjbGFzc1F1YWxpZmllZE5hbWU7Ci0JCXRoaXMuc3VwZXJjbGFzc1F1YWxpZmllZE5hbWUgPSBhc3RTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNVUEVSQ0xBU1NfUVVBTElGSUVEX05BTUVfUFJPUEVSVFksIG9sZCwgYXN0U3VwZXJjbGFzc1F1YWxpZmllZE5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkU3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoSVR5cGVCaW5kaW5nIGJpbmRpbmcpIHsKLQkJSVR5cGVCaW5kaW5nIHN1cGVyY2xhc3MgPSBiaW5kaW5nID09IG51bGwgPyBudWxsIDogYmluZGluZy5nZXRTdXBlcmNsYXNzKCk7Ci0JCXJldHVybiAoc3VwZXJjbGFzcyA9PSBudWxsKSA/IG51bGwgOiBzdXBlcmNsYXNzLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZE5hbWUoKTsKLQl9Ci0KLQkvLyAqKioqKiBhYnN0cmFjdAotCXB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoKSB7Ci0JCXJldHVybiB0aGlzLmFic3RyYWN0XzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0Fic3RyYWN0KGJvb2xlYW4gYXN0QWJzdHJhY3QpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmFic3RyYWN0XzsKLQkJdGhpcy5hYnN0cmFjdF8gPSBhc3RBYnN0cmFjdDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEFCU1RSQUNUX1BST1BFUlRZLCBvbGQsIGFzdEFic3RyYWN0KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYnVpbGRBYnN0cmFjdChJVHlwZUJpbmRpbmcgYmluZGluZykgewotCQlyZXR1cm4gKGJpbmRpbmcgPT0gbnVsbCkgPyBmYWxzZSA6IE1vZGlmaWVyLmlzQWJzdHJhY3QoYmluZGluZy5nZXRNb2RpZmllcnMoKSk7Ci0JfQotCi0JLy8gKioqKiogbm8tYXJnIGNvbnN0cnVjdG9yCi0JcHVibGljIGJvb2xlYW4gaGFzTm9BcmdDb25zdHJ1Y3RvcigpIHsKLQkJcmV0dXJuIHRoaXMuaGFzTm9BcmdDb25zdHJ1Y3RvcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0hhc05vQXJnQ29uc3RydWN0b3IoYm9vbGVhbiBhc3RIYXNOb0FyZ0NvbnN0cnVjdG9yKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5oYXNOb0FyZ0NvbnN0cnVjdG9yOwotCQl0aGlzLmhhc05vQXJnQ29uc3RydWN0b3IgPSBhc3RIYXNOb0FyZ0NvbnN0cnVjdG9yOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9fQVJHX0NPTlNUUlVDVE9SX1BST1BFUlRZLCBvbGQsIGFzdEhhc05vQXJnQ29uc3RydWN0b3IpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBidWlsZEhhc05vQXJnQ29uc3RydWN0b3IoSVR5cGVCaW5kaW5nIGJpbmRpbmcpIHsKLQkJcmV0dXJuIChiaW5kaW5nID09IG51bGwpID8gZmFsc2UgOiB0eXBlSGFzTm9BcmdDb25zdHJ1Y3RvcihiaW5kaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gdHlwZUhhc05vQXJnQ29uc3RydWN0b3IoSVR5cGVCaW5kaW5nIGJpbmRpbmcpIHsKLQkJcmV0dXJuIGZpbmROb0FyZ0NvbnN0cnVjdG9yKGJpbmRpbmcpICE9IG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgSU1ldGhvZEJpbmRpbmcgZmluZE5vQXJnQ29uc3RydWN0b3IoSVR5cGVCaW5kaW5nIGJpbmRpbmcpIHsKLQkJZm9yIChJTWV0aG9kQmluZGluZyBtZXRob2QgOiBiaW5kaW5nLmdldERlY2xhcmVkTWV0aG9kcygpKSB7Ci0JCQlpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgewotCQkJCWlmIChtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gMCkgewotCQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKiBwcml2YXRlIG5vLWFyZyBjb25zdHJ1Y3RvcgotCXB1YmxpYyBib29sZWFuIGhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yKCkgewotCQlyZXR1cm4gdGhpcy5oYXNQcml2YXRlTm9BcmdDb25zdHJ1Y3RvcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0hhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yKGJvb2xlYW4gYXN0SGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3IpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yOwotCQl0aGlzLmhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yID0gYXN0SGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3I7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUklWQVRFX05PX0FSR19DT05TVFJVQ1RPUl9QUk9QRVJUWSwgb2xkLCBhc3RIYXNQcml2YXRlTm9BcmdDb25zdHJ1Y3Rvcik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkSGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3IoSVR5cGVCaW5kaW5nIGJpbmRpbmcpIHsKLQkJcmV0dXJuIChiaW5kaW5nID09IG51bGwpID8gZmFsc2UgOiB0eXBlSGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3IoYmluZGluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHR5cGVIYXNQcml2YXRlTm9BcmdDb25zdHJ1Y3RvcihJVHlwZUJpbmRpbmcgYmluZGluZykgewotCQlJTWV0aG9kQmluZGluZyBtZXRob2QgPSBmaW5kTm9BcmdDb25zdHJ1Y3RvcihiaW5kaW5nKTsKLQkJcmV0dXJuIChtZXRob2QgIT0gbnVsbCkgJiYgTW9kaWZpZXIuaXNQcml2YXRlKG1ldGhvZC5nZXRNb2RpZmllcnMoKSk7Ci0JfQotCQotCQotCS8vICoqKioqIHB1YmxpYy9wcm90ZWN0ZWQgbm8tYXJnIGNvbnN0cnVjdG9yICoqKioqCi0JCi0JcHVibGljIGJvb2xlYW4gaGFzUHVibGljT3JQcm90ZWN0ZWROb0FyZ0NvbnN0cnVjdG9yKCkgewotCQlJdGVyYWJsZTxKYXZhUmVzb3VyY2VNZXRob2Q+IGNvbnN0cnVjdG9ycyA9IGdldENvbnN0cnVjdG9ycygpOwotCQlpZiAoQ29sbGVjdGlvblRvb2xzLnNpemUoY29uc3RydWN0b3JzKSA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlmb3IgKEphdmFSZXNvdXJjZU1ldGhvZCBjb25zdHJ1Y3RvciA6IGNvbnN0cnVjdG9ycykgewotCQkJaWYgKGNvbnN0cnVjdG9yLmdldFBhcmFtZXRlcnNTaXplKCkgPT0gMCkgewotCQkJCXJldHVybiBNb2RpZmllci5pc1B1YmxpYyhjb25zdHJ1Y3Rvci5nZXRNb2RpZmllcnMoKSkKLQkJCQkJCXx8IE1vZGlmaWVyLmlzUHJvdGVjdGVkKGNvbnN0cnVjdG9yLmdldE1vZGlmaWVycygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc1B1YmxpY05vQXJnQ29uc3RydWN0b3IoKSB7Ci0JCUl0ZXJhYmxlPEphdmFSZXNvdXJjZU1ldGhvZD4gY29uc3RydWN0b3JzID0gdGhpcy5nZXRDb25zdHJ1Y3RvcnMoKTsKLQkJaWYgKENvbGxlY3Rpb25Ub29scy5zaXplKGNvbnN0cnVjdG9ycykgPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgY29uc3RydWN0b3IgOiBjb25zdHJ1Y3RvcnMpIHsKLQkJCWlmIChjb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJzU2l6ZSgpID09IDApIHsKLQkJCQlyZXR1cm4gTW9kaWZpZXIuaXNQdWJsaWMoY29uc3RydWN0b3IuZ2V0TW9kaWZpZXJzKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlTWV0aG9kPiBnZXRDb25zdHJ1Y3RvcnMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8SmF2YVJlc291cmNlTWV0aG9kPih0aGlzLmdldE1ldGhvZHMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSmF2YVJlc291cmNlTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiBtZXRob2QuaXNDb25zdHJ1Y3RvcigpOwotCQkJfQotCQl9OwotCX0KLQkKLQotCS8vICoqKioqKioqKiogdHlwZXMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEphdmFSZXNvdXJjZVR5cGU+IGdldFR5cGVzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPEphdmFSZXNvdXJjZVR5cGU+KHRoaXMudHlwZXMpOyAgLy8gcmVhZC1vbmx5Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPEphdmFSZXNvdXJjZVR5cGU+IGdldEFsbFR5cGVzKCkgewotCQlyZXR1cm4gbmV3IFRyZWVJdGVyYWJsZTxKYXZhUmVzb3VyY2VUeXBlPih0aGlzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgSmF2YVJlc291cmNlVHlwZT4gY2hpbGRyZW4oSmF2YVJlc291cmNlVHlwZSB0eXBlKSB7Ci0JCQkJcmV0dXJuIHR5cGUuZ2V0VHlwZXMoKS5pdGVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSmF2YVJlc291cmNlVHlwZSBnZXRUeXBlKFN0cmluZyB0eXBlTmFtZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VUeXBlIHR5cGUgOiB0aGlzLmdldFR5cGVzKCkpIHsKLQkJCWlmICh0eXBlLmlzRm9yKHR5cGVOYW1lLCBvY2N1cnJlbmNlKSkgewotCQkJCXJldHVybiB0eXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRUeXBlKEphdmFSZXNvdXJjZVR5cGUgdHlwZSkgewotCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24odHlwZSwgdGhpcy50eXBlcywgVFlQRVNfQ09MTEVDVElPTik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVR5cGVzKENvbGxlY3Rpb248SmF2YVJlc291cmNlVHlwZT4gcmVtb3ZlKSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihyZW1vdmUsIHRoaXMudHlwZXMsIFRZUEVTX0NPTExFQ1RJT04pOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVHlwZURlY2xhcmF0aW9uW10gdHlwZURlY2xhcmF0aW9ucyA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRUeXBlcyhhc3RSb290KTsKLQkJQ291bnRlck1hcCBjb3VudGVycyA9IG5ldyBDb3VudGVyTWFwKHR5cGVEZWNsYXJhdGlvbnMubGVuZ3RoKTsKLQkJZm9yIChUeXBlRGVjbGFyYXRpb24gdGQgOiB0eXBlRGVjbGFyYXRpb25zKSB7Ci0JCQlTdHJpbmcgdGROYW1lID0gdGQuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJaW50IG9jY3VycmVuY2UgPSBjb3VudGVycy5pbmNyZW1lbnQodGROYW1lKTsKLQkJCXRoaXMudHlwZXMuYWRkKHRoaXMuYnVpbGRUeXBlKHRkLCBvY2N1cnJlbmNlLCBhc3RSb290KSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1R5cGVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVR5cGVEZWNsYXJhdGlvbltdIHR5cGVEZWNsYXJhdGlvbnMgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0VHlwZXMoYXN0Um9vdCk7Ci0JCUNvdW50ZXJNYXAgY291bnRlcnMgPSBuZXcgQ291bnRlck1hcCh0eXBlRGVjbGFyYXRpb25zLmxlbmd0aCk7Ci0JCUhhc2hTZXQ8SmF2YVJlc291cmNlVHlwZT4gdHlwZXNUb1JlbW92ZSA9IG5ldyBIYXNoU2V0PEphdmFSZXNvdXJjZVR5cGU+KHRoaXMudHlwZXMpOwotCQlmb3IgKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gOiB0eXBlRGVjbGFyYXRpb25zKSB7Ci0JCQlTdHJpbmcgdGROYW1lID0gdHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCWludCBvY2N1cnJlbmNlID0gY291bnRlcnMuaW5jcmVtZW50KHRkTmFtZSk7Ci0KLQkJCUphdmFSZXNvdXJjZVR5cGUgdHlwZSA9IHRoaXMuZ2V0VHlwZSh0ZE5hbWUsIG9jY3VycmVuY2UpOwotCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCXRoaXMuYWRkVHlwZSh0aGlzLmJ1aWxkVHlwZSh0eXBlRGVjbGFyYXRpb24sIG9jY3VycmVuY2UsIGFzdFJvb3QpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdHlwZXNUb1JlbW92ZS5yZW1vdmUodHlwZSk7Ci0JCQkJdHlwZS5zeW5jaHJvbml6ZVdpdGgoYXN0Um9vdCk7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5yZW1vdmVUeXBlcyh0eXBlc1RvUmVtb3ZlKTsKLQl9Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZVR5cGUgYnVpbGRUeXBlKFR5cGVEZWNsYXJhdGlvbiBuZXN0ZWRUeXBlRGVjbGFyYXRpb24sIGludCBvY2N1cnJlbmNlLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3SW5zdGFuY2UodGhpcy5nZXRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoKSwgdGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBuZXN0ZWRUeXBlRGVjbGFyYXRpb24sIG9jY3VycmVuY2UsIGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlbnVtcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8SmF2YVJlc291cmNlRW51bT4gZ2V0RW51bXMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8SmF2YVJlc291cmNlRW51bT4odGhpcy5lbnVtcyk7ICAvLyByZWFkLW9ubHkKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8SmF2YVJlc291cmNlRW51bT4gZ2V0QWxsRW51bXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldEVudW1zKCk7Ci0JfQotCi0JcHJpdmF0ZSBKYXZhUmVzb3VyY2VFbnVtIGdldEVudW0oU3RyaW5nIGVudW1OYW1lLCBpbnQgb2NjdXJyZW5jZSkgewotCQlmb3IgKEphdmFSZXNvdXJjZUVudW0gZW51bV8gOiB0aGlzLmdldEVudW1zKCkpIHsKLQkJCWlmIChlbnVtXy5pc0ZvcihlbnVtTmFtZSwgb2NjdXJyZW5jZSkpIHsKLQkJCQlyZXR1cm4gZW51bV87Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEVudW0oSmF2YVJlc291cmNlRW51bSBlbnVtXykgewotCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oZW51bV8sIHRoaXMuZW51bXMsIEVOVU1TX0NPTExFQ1RJT04pOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVFbnVtcyhDb2xsZWN0aW9uPEphdmFSZXNvdXJjZUVudW0+IHJlbW92ZSkgewotCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24ocmVtb3ZlLCB0aGlzLmVudW1zLCBFTlVNU19DT0xMRUNUSU9OKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUVudW1zKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUVudW1EZWNsYXJhdGlvbltdIGVudW1EZWNsYXJhdGlvbnMgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0RW51bXMoYXN0Um9vdCk7Ci0JCUNvdW50ZXJNYXAgY291bnRlcnMgPSBuZXcgQ291bnRlck1hcChlbnVtRGVjbGFyYXRpb25zLmxlbmd0aCk7Ci0JCWZvciAoRW51bURlY2xhcmF0aW9uIGVkIDogZW51bURlY2xhcmF0aW9ucykgewotCQkJU3RyaW5nIHRkTmFtZSA9IGVkLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCWludCBvY2N1cnJlbmNlID0gY291bnRlcnMuaW5jcmVtZW50KHRkTmFtZSk7Ci0JCQl0aGlzLmVudW1zLmFkZCh0aGlzLmJ1aWxkRW51bShlZCwgb2NjdXJyZW5jZSwgYXN0Um9vdCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNFbnVtcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlFbnVtRGVjbGFyYXRpb25bXSBlbnVtRGVjbGFyYXRpb25zID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldEVudW1zKGFzdFJvb3QpOwotCQlDb3VudGVyTWFwIGNvdW50ZXJzID0gbmV3IENvdW50ZXJNYXAoZW51bURlY2xhcmF0aW9ucy5sZW5ndGgpOwotCQlIYXNoU2V0PEphdmFSZXNvdXJjZUVudW0+IGVudW1zVG9SZW1vdmUgPSBuZXcgSGFzaFNldDxKYXZhUmVzb3VyY2VFbnVtPih0aGlzLmVudW1zKTsKLQkJZm9yIChFbnVtRGVjbGFyYXRpb24gZW51bURlY2xhcmF0aW9uIDogZW51bURlY2xhcmF0aW9ucykgewotCQkJU3RyaW5nIHRkTmFtZSA9IGVudW1EZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQlpbnQgb2NjdXJyZW5jZSA9IGNvdW50ZXJzLmluY3JlbWVudCh0ZE5hbWUpOwotCi0JCQlKYXZhUmVzb3VyY2VFbnVtIGVudW1fID0gdGhpcy5nZXRFbnVtKHRkTmFtZSwgb2NjdXJyZW5jZSk7Ci0JCQlpZiAoZW51bV8gPT0gbnVsbCkgewotCQkJCXRoaXMuYWRkRW51bSh0aGlzLmJ1aWxkRW51bShlbnVtRGVjbGFyYXRpb24sIG9jY3VycmVuY2UsIGFzdFJvb3QpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZW51bXNUb1JlbW92ZS5yZW1vdmUoZW51bV8pOwotCQkJCWVudW1fLnN5bmNocm9uaXplV2l0aChhc3RSb290KTsKLQkJCX0KLQkJfQotCQl0aGlzLnJlbW92ZUVudW1zKGVudW1zVG9SZW1vdmUpOwotCX0KLQotCXByaXZhdGUgSmF2YVJlc291cmNlRW51bSBidWlsZEVudW0oRW51bURlY2xhcmF0aW9uIG5lc3RlZEVudW1EZWNsYXJhdGlvbiwgaW50IG9jY3VycmVuY2UsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBTb3VyY2VFbnVtLm5ld0luc3RhbmNlKHRoaXMuZ2V0SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KCksIHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgbmVzdGVkRW51bURlY2xhcmF0aW9uLCBvY2N1cnJlbmNlLCBhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmllbGRzICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VGaWVsZD4gZ2V0RmllbGRzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPEphdmFSZXNvdXJjZUZpZWxkPih0aGlzLmZpZWxkcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEZpZWxkKEphdmFSZXNvdXJjZUZpZWxkIGZpZWxkKSB7Ci0JCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihmaWVsZCwgdGhpcy5maWVsZHMsIEZJRUxEU19DT0xMRUNUSU9OKTsKLQl9Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZUZpZWxkIGdldEZpZWxkKFN0cmluZyBmaWVsZE5hbWUsIGludCBvY2N1cnJlbmNlKSB7Ci0JCWZvciAoSmF2YVJlc291cmNlRmllbGQgZmllbGQgOiB0aGlzLmdldEZpZWxkcygpKSB7Ci0JCQlpZiAoZmllbGQuaXNGb3IoZmllbGROYW1lLCBvY2N1cnJlbmNlKSkgewotCQkJCXJldHVybiBmaWVsZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRmllbGRzKENvbGxlY3Rpb248SmF2YVJlc291cmNlRmllbGQ+IHJlbW92ZSkgewotCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24ocmVtb3ZlLCB0aGlzLmZpZWxkcywgRklFTERTX0NPTExFQ1RJT04pOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRmllbGRzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZERlY2xhcmF0aW9ucyA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRGaWVsZHMoYXN0Um9vdCk7Ci0JCUNvdW50ZXJNYXAgY291bnRlcnMgPSBuZXcgQ291bnRlck1hcChmaWVsZERlY2xhcmF0aW9ucy5sZW5ndGgpOwotCQlmb3IgKEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA6IGZpZWxkRGVjbGFyYXRpb25zKSB7Ci0JCQlmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCA6IGZyYWdtZW50cyhmaWVsZERlY2xhcmF0aW9uKSkgewotCQkJCVN0cmluZyBmaWVsZE5hbWUgPSBmcmFnbWVudC5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQkJaW50IG9jY3VycmVuY2UgPSBjb3VudGVycy5pbmNyZW1lbnQoZmllbGROYW1lKTsKLQkJCQl0aGlzLmZpZWxkcy5hZGQodGhpcy5idWlsZEZpZWxkKGZpZWxkTmFtZSwgb2NjdXJyZW5jZSwgYXN0Um9vdCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNGaWVsZHMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkRGVjbGFyYXRpb25zID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldEZpZWxkcyhhc3RSb290KTsKLQkJQ291bnRlck1hcCBjb3VudGVycyA9IG5ldyBDb3VudGVyTWFwKGZpZWxkRGVjbGFyYXRpb25zLmxlbmd0aCk7Ci0JCUhhc2hTZXQ8SmF2YVJlc291cmNlRmllbGQ+IGZpZWxkc1RvUmVtb3ZlID0gbmV3IEhhc2hTZXQ8SmF2YVJlc291cmNlRmllbGQ+KHRoaXMuZmllbGRzKTsKLQkJZm9yIChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gOiBmaWVsZERlY2xhcmF0aW9ucykgewotCQkJZm9yIChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZnJhZ21lbnQgOiBmcmFnbWVudHMoZmllbGREZWNsYXJhdGlvbikpIHsKLQkJCQlTdHJpbmcgZmllbGROYW1lID0gZnJhZ21lbnQuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJCWludCBvY2N1cnJlbmNlID0gY291bnRlcnMuaW5jcmVtZW50KGZpZWxkTmFtZSk7Ci0KLQkJCQlKYXZhUmVzb3VyY2VGaWVsZCBmaWVsZCA9IHRoaXMuZ2V0RmllbGQoZmllbGROYW1lLCBvY2N1cnJlbmNlKTsKLQkJCQlpZiAoZmllbGQgPT0gbnVsbCkgewotCQkJCQl0aGlzLmFkZEZpZWxkKHRoaXMuYnVpbGRGaWVsZChmaWVsZE5hbWUsIG9jY3VycmVuY2UsIGFzdFJvb3QpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmaWVsZHNUb1JlbW92ZS5yZW1vdmUoZmllbGQpOwotCQkJCQlmaWVsZC5zeW5jaHJvbml6ZVdpdGgoYXN0Um9vdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRoaXMucmVtb3ZlRmllbGRzKGZpZWxkc1RvUmVtb3ZlKTsKLQl9Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZUZpZWxkIGJ1aWxkRmllbGQoU3RyaW5nIGZpZWxkTmFtZSwgaW50IG9jY3VycmVuY2UsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBTb3VyY2VGaWVsZC5uZXdJbnN0YW5jZSh0aGlzLCB0aGlzLmFubm90YXRlZEVsZW1lbnQsIGZpZWxkTmFtZSwgb2NjdXJyZW5jZSwgdGhpcy5nZXRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoKSwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50PiBmcmFnbWVudHMoRmllbGREZWNsYXJhdGlvbiBmZCkgewotCQlyZXR1cm4gZmQuZnJhZ21lbnRzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEphdmFSZXNvdXJjZU1ldGhvZD4gZ2V0TWV0aG9kcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxKYXZhUmVzb3VyY2VNZXRob2Q+KHRoaXMubWV0aG9kcyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSmF2YVJlc291cmNlTWV0aG9kIGdldE1ldGhvZChDb2xsZWN0aW9uPEphdmFSZXNvdXJjZU1ldGhvZD4gbWV0aG9kcywgTWV0aG9kU2lnbmF0dXJlIHNpZ25hdHVyZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgewotCQkJaWYgKG1ldGhvZC5pc0ZvcihzaWduYXR1cmUsIG9jY3VycmVuY2UpKSB7Ci0JCQkJcmV0dXJuIG1ldGhvZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTWV0aG9kKEphdmFSZXNvdXJjZU1ldGhvZCBtZXRob2QpIHsKLQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKG1ldGhvZCwgdGhpcy5tZXRob2RzLCBNRVRIT0RTX0NPTExFQ1RJT04pOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVNZXRob2RzKENvbGxlY3Rpb248SmF2YVJlc291cmNlTWV0aG9kPiByZW1vdmUpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKHJlbW92ZSwgdGhpcy5tZXRob2RzLCBNRVRIT0RTX0NPTExFQ1RJT04pOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplTWV0aG9kcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZERlY2xhcmF0aW9ucyA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRNZXRob2RzKGFzdFJvb3QpOwotCQlDb3VudGVyTWFwIGNvdW50ZXJzID0gbmV3IENvdW50ZXJNYXAobWV0aG9kRGVjbGFyYXRpb25zLmxlbmd0aCk7Ci0JCWZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2REZWNsYXJhdGlvbnMpIHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBzaWduYXR1cmUgPSBBU1RUb29scy5idWlsZE1ldGhvZFNpZ25hdHVyZShtZXRob2REZWNsYXJhdGlvbik7Ci0JCQlpbnQgb2NjdXJyZW5jZSA9IGNvdW50ZXJzLmluY3JlbWVudChzaWduYXR1cmUpOwotCQkJdGhpcy5tZXRob2RzLmFkZCh0aGlzLmJ1aWxkTWV0aG9kKHNpZ25hdHVyZSwgb2NjdXJyZW5jZSwgbWV0aG9kRGVjbGFyYXRpb24pKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jTWV0aG9kcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZERlY2xhcmF0aW9ucyA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRNZXRob2RzKGFzdFJvb3QpOwotCQlDb3VudGVyTWFwIGNvdW50ZXJzID0gbmV3IENvdW50ZXJNYXAobWV0aG9kRGVjbGFyYXRpb25zLmxlbmd0aCk7Ci0JCUhhc2hTZXQ8SmF2YVJlc291cmNlTWV0aG9kPiBtZXRob2RzVG9SZW1vdmUgPSBuZXcgSGFzaFNldDxKYXZhUmVzb3VyY2VNZXRob2Q+KHRoaXMubWV0aG9kcyk7Ci0JCWZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2REZWNsYXJhdGlvbnMpIHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBzaWduYXR1cmUgPSBBU1RUb29scy5idWlsZE1ldGhvZFNpZ25hdHVyZShtZXRob2REZWNsYXJhdGlvbik7Ci0JCQlpbnQgb2NjdXJyZW5jZSA9IGNvdW50ZXJzLmluY3JlbWVudChzaWduYXR1cmUpOwotCi0JCQlKYXZhUmVzb3VyY2VNZXRob2QgbWV0aG9kID0gZ2V0TWV0aG9kKG1ldGhvZHNUb1JlbW92ZSwgc2lnbmF0dXJlLCBvY2N1cnJlbmNlKTsKLQkJCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJCXRoaXMuYWRkTWV0aG9kKHRoaXMuYnVpbGRNZXRob2Qoc2lnbmF0dXJlLCBvY2N1cnJlbmNlLCBtZXRob2REZWNsYXJhdGlvbikpOwotCQkJfSBlbHNlIHsKLQkJCQltZXRob2RzVG9SZW1vdmUucmVtb3ZlKG1ldGhvZCk7Ci0JCQkJbWV0aG9kLnN5bmNocm9uaXplV2l0aChtZXRob2REZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5yZW1vdmVNZXRob2RzKG1ldGhvZHNUb1JlbW92ZSk7Ci0JfQotCi0JcHJpdmF0ZSBKYXZhUmVzb3VyY2VNZXRob2QgYnVpbGRNZXRob2QoTWV0aG9kU2lnbmF0dXJlIHNpZ25hdHVyZSwgaW50IG9jY3VycmVuY2UsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBTb3VyY2VNZXRob2QubmV3SW5zdGFuY2UodGhpcywgdGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBzaWduYXR1cmUsIG9jY3VycmVuY2UsIHRoaXMuZ2V0SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KCksIG1ldGhvZERlY2xhcmF0aW9uKTsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIGhhc0FueUFubm90YXRlZEZpZWxkcygpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VGaWVsZCBmaWVsZCA6IHRoaXMuZ2V0RmllbGRzKCkpIHsKLQkJCWlmIChmaWVsZC5pc0Fubm90YXRlZCgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0FueUFubm90YXRlZE1ldGhvZHMoKSB7Ci0JCWZvciAoSmF2YVJlc291cmNlTWV0aG9kIG1ldGhvZCA6IHRoaXMuZ2V0TWV0aG9kcygpKSB7Ci0JCQlpZiAobWV0aG9kLmlzQW5ub3RhdGVkKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8vIFR3byBtb3JlIHJlcXVpcmVtZW50cyBmb3IgYSB2YWxpZCBlcXVhbHMoKSBtZXRob2Q6Ci0JLy8gMS4gSXQgc2hvdWxkIGJlIHB1YmxpYyAKLQkvLyAyLiBUaGUgcmV0dXJuIHR5cGUgc2hvdWxkIGJlIGJvb2xlYW4KLQkvLyBCb3RoIHJlcXVpcmVtZW50cyBhcmUgdmFsaWRhdGVkIGJ5IHRoZSBjb21waWxlciBzbyB0aGV5IGFyZSBleGNsdWRlZCBoZXJlCi0JcHVibGljIGJvb2xlYW4gaGFzRXF1YWxzTWV0aG9kKCkgewotCQlmb3IgKEphdmFSZXNvdXJjZU1ldGhvZCBtZXRob2QgOiB0aGlzLmdldE1ldGhvZHMoKSkgewotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChtZXRob2QuZ2V0TWV0aG9kTmFtZSgpLCAiZXF1YWxzIikgLy8kTk9OLU5MUy0xJAotCQkJCQkmJiBtZXRob2QuZ2V0UGFyYW1ldGVyc1NpemUoKSA9PSAxCi0JCQkJCSYmIFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZU5hbWUoMCksIE9iamVjdC5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvLyBUd28gbW9yZSByZXF1aXJlbWVudHMgZm9yIGEgdmFsaWQgaGFzaENvZGUoKSBtZXRob2Q6Ci0JLy8gMS4gSXQgc2hvdWxkIGJlIHB1YmxpYyAKLQkvLyAyLiBUaGUgcmV0dXJuIHR5cGUgc2hvdWxkIGJlIGludAotCS8vIEJvdGggcmVxdWlyZW1lbnRzIGFyZSB2YWxpZGF0ZWQgYnkgdGhlIGNvbXBpbGVyIHNvIHRoZXkgYXJlIGV4Y2x1ZGVkIGhlcmUKLQlwdWJsaWMgYm9vbGVhbiBoYXNIYXNoQ29kZU1ldGhvZCgpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgbWV0aG9kIDogdGhpcy5nZXRNZXRob2RzKCkpIHsKLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwobWV0aG9kLmdldE1ldGhvZE5hbWUoKSwgImhhc2hDb2RlIikgLy8kTk9OLU5MUy0xJAotCQkJCQkmJiBtZXRob2QuZ2V0UGFyYW1ldGVyc1NpemUoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgSmF2YVJlc291cmNlTWV0aG9kIGdldE1ldGhvZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWZvciAoSmF2YVJlc291cmNlTWV0aG9kIG1ldGhvZCA6IHRoaXMuZ2V0TWV0aG9kcygpKSB7Ci0JCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKG1ldGhvZC5nZXRNZXRob2ROYW1lKCksIHByb3BlcnR5TmFtZSkpIHsKLQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVR5cGVDb21waWxhdGlvblVuaXQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVR5cGVDb21waWxhdGlvblVuaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY1MzMzZi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VUeXBlQ29tcGlsYXRpb25Vbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci0KLS8qKgotICogSmF2YSBjb21waWxhdGlvbiB1bml0IChzb3VyY2UgZmlsZSkKLSAqIG5vbiBwYWNrYWdlLWluZm8uamF2YSBmaWxlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VUeXBlQ29tcGlsYXRpb25Vbml0Ci0JZXh0ZW5kcyBTb3VyY2VDb21waWxhdGlvblVuaXQKLXsKLQotCS8qKgotCSAqIFRoZSBwcmltYXJ5IHR5cGUgb2YgdGhlIEFTVCBjb21waWxhdGlvbiB1bml0LiBXZSBhcmUgbm90IGdvaW5nIHRvIGhhbmRsZQotCSAqIG11bHRpcGxlIHR5cGVzIGRlZmluZWQgaW4gYSBzaW5nbGUgY29tcGlsYXRpb24gdW5pdC4gRW50aXRpZXMgbXVzdCBoYXZlCi0JICogYSBwdWJsaWMvcHJvdGVjdGVkIG5vLWFyZyBjb25zdHJ1Y3RvciwgYW5kIHRoZXJlIGlzIG5vIHdheSB0byBhY2Nlc3MKLQkgKiB0aGUgY29uc3RydWN0b3IgaW4gYSBwYWNrYWdlIGNsYXNzICh3aGljaCBpcyB3aGF0IGFsbCB0b3AtbGV2ZWwsCi0JICogbm9uLXByaW1hcnkgY2xhc3NlcyBtdXN0IGJlKS4KLQkgKi8KLQlwcml2YXRlIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBwcmltYXJ5VHlwZTsJCi0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTb3VyY2VUeXBlQ29tcGlsYXRpb25Vbml0KAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlBbm5vdGF0aW9uUHJvdmlkZXIgYW5ub3RhdGlvblByb3ZpZGVyLCAKLQkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyLAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXN1cGVyKGNvbXBpbGF0aW9uVW5pdCwgYW5ub3RhdGlvblByb3ZpZGVyLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlciwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IpOyAgLy8gdGhlIGNvbXBpbGF0aW9uIHVuaXQgaXMgdGhlIHJvb3Qgb2YgaXRzIHN1Yi10cmVlCi0JCXRoaXMucHJpbWFyeVR5cGUgPSB0aGlzLmJ1aWxkUHJpbWFyeVR5cGUoKTsKLQl9Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBidWlsZFByaW1hcnlUeXBlKCkgewotCQl0aGlzLm9wZW5Db21waWxhdGlvblVuaXQoKTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSB0aGlzLmJ1aWxkQVNUUm9vdCgpOwotCQl0aGlzLmNsb3NlQ29tcGlsYXRpb25Vbml0KCk7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUHJpbWFyeVR5cGUoYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmFSZXNvdXJjZU5vZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ByaW1hcnlUeXBlKGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VOb2RlLlJvb3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogTkI6IHJldHVybiAqYWxsKiB0aGUgdHlwZXMgc2luY2Ugd2UgYnVpbGQgdGhlbSBhbGwKLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPiBnZXRUeXBlcygpIHsKLQkJcmV0dXJuICh0aGlzLnByaW1hcnlUeXBlID09IG51bGwpID8KLQkJCQlFbXB0eUl0ZXJhYmxlLjxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+aW5zdGFuY2UoKSA6Ci0JCQkJbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4odGhpcy5wcmltYXJ5VHlwZS5nZXRBbGxUeXBlcygpLCB0aGlzLnByaW1hcnlUeXBlLmdldEFsbEVudW1zKCkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIEpwYVJlc291cmNlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCQotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9SRVNPVVJDRV9UWVBFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzKCkgewotCQlpZiAodGhpcy5wcmltYXJ5VHlwZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnByaW1hcnlUeXBlLnJlc29sdmVUeXBlcyh0aGlzLmJ1aWxkQVNUUm9vdCgpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgZ2V0UHJpbWFyeVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnByaW1hcnlUeXBlOwotCX0KLQotCXByaXZhdGUgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGJ1aWxkUHJpbWFyeVR5cGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdGQgPSB0aGlzLmdldFByaW1hcnlUeXBlT3JFbnVtRGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JCXJldHVybiAodGQgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZFByaW1hcnlUeXBlKGFzdFJvb3QsIHRkKTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBzeW5jUHJpbWFyeVR5cGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdGQgPSB0aGlzLmdldFByaW1hcnlUeXBlT3JFbnVtRGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JCWlmICh0ZCA9PSBudWxsKSB7Ci0JCQl0aGlzLnN5bmNQcmltYXJ5VHlwZV8obnVsbCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5wcmltYXJ5VHlwZSA9PSBudWxsIHx8ICghdHlwZU1hdGNoZXNBU1ROb2RlVHlwZSh0aGlzLnByaW1hcnlUeXBlLCB0ZCkpKSB7Ci0JCQkJdGhpcy5zeW5jUHJpbWFyeVR5cGVfKHRoaXMuYnVpbGRQcmltYXJ5VHlwZShhc3RSb290LCB0ZCkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnByaW1hcnlUeXBlLnN5bmNocm9uaXplV2l0aChhc3RSb290KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE11c3QgYmUgbm9uLW51bGwgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGFuZCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiB0eXBlTWF0Y2hlc0FTVE5vZGVUeXBlKEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSB0eXBlLCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBhc3RUeXBlKSB7Ci0JCXJldHVybiB0eXBlLmdldEtpbmQoKS5nZXRBc3ROb2RlVHlwZSgpID09IGFzdFR5cGUuZ2V0Tm9kZVR5cGUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1ByaW1hcnlUeXBlXyhKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYXN0VHlwZSkgewotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgb2xkID0gdGhpcy5wcmltYXJ5VHlwZTsKLQkJdGhpcy5wcmltYXJ5VHlwZSA9IGFzdFR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFU19DT0xMRUNUSU9OLCBvbGQsIGFzdFR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCAqKioqKioqKioqCi0KLQlwcml2YXRlIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBidWlsZFByaW1hcnlUeXBlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290LCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKLQkJaWYgKHR5cGVEZWNsYXJhdGlvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuVFlQRV9ERUNMQVJBVElPTikgewotCQkJcmV0dXJuIFNvdXJjZVR5cGUubmV3SW5zdGFuY2UodGhpcywgKFR5cGVEZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uLCBhc3RSb290KTsKLQkJfQotCQllbHNlIGlmICh0eXBlRGVjbGFyYXRpb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkVOVU1fREVDTEFSQVRJT04pIHsKLQkJCXJldHVybiBTb3VyY2VFbnVtLm5ld0luc3RhbmNlKHRoaXMsIChFbnVtRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbiwgYXN0Um9vdCk7Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIGkuZS4gdGhlIHR5cGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBjb21waWxhdGlvbiB1bml0OwotCSAqIHJldHVybiB0aGUgZmlyc3QgY2xhc3MsIGludGVyZmFjZSBvciBlbnVtIChpZ25vcmUgYW5ub3RhdGlvbnMpIHdpdGgKLQkgKiB0aGUgc2FtZSBuYW1lIGFzIHRoZSBjb21waWxhdGlvbiB1bml0IChmaWxlKTsKLQkgKiBOQjogdGhpcyB0eXBlIGNvdWxkIGJlIGluIGVycm9yIGlmIHRoZXJlIGlzIGFuIGFubm90YXRpb24KLQkgKiB3aXRoIHRoZSBzYW1lIG5hbWUgcHJlY2VkaW5nIGl0IGluIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JICogCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIHBhcnNlciBkaWQgbm90IHJlc29sdmUgdGhlIHR5cGUgZGVjbGFyYXRpb24ncyBiaW5kaW5nLgotCSAqIFRoaXMgY2FuIG9jY3VyIGlmIHRoZSBwcm9qZWN0IEpSRSBpcyByZW1vdmVkIChidWcgMjI1MzMyKS4KLQkgKi8KLQlwcml2YXRlIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGdldFByaW1hcnlUeXBlT3JFbnVtRGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJU3RyaW5nIHByaW1hcnlUeXBlTmFtZSA9IHRoaXMuZ2V0UHJpbWFyeVR5cGVOYW1lKCk7Ci0JCWZvciAoQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gYXRkIDogdGhpcy50eXBlcyhhc3RSb290KSkgewotCQkJaWYgKHRoaXMubm9kZUlzUHJpbWFyeVR5cGVPckVudW1EZWNsYXJhdGlvbihhdGQsIHByaW1hcnlUeXBlTmFtZSkpIHsKLQkJCQlyZXR1cm4gKGF0ZC5yZXNvbHZlQmluZGluZygpID09IG51bGwpID8gbnVsbCA6IGF0ZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbm9kZUlzUHJpbWFyeVR5cGVPckVudW1EZWNsYXJhdGlvbihBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBhdGQsIFN0cmluZyBwcmltYXJ5VHlwZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMubm9kZUlzVHlwZU9yRW51bURlY2xhcmF0aW9uKGF0ZCkgJiYgCi0JCQkJKGF0ZC5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHByaW1hcnlUeXBlTmFtZSkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBub2RlSXNUeXBlT3JFbnVtRGVjbGFyYXRpb24oQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gYXRkKSB7Ci0JCXJldHVybiBhdGQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlRZUEVfREVDTEFSQVRJT04gfHwKLQkJCQlhdGQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkVOVU1fREVDTEFSQVRJT047Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJpbWFyeVR5cGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb21waWxhdGlvblVuaXROYW1lKCk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbj4gdHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGFzdFJvb3QudHlwZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L0NhbGxiYWNrSm9iU3luY2hyb25pemVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L0NhbGxiYWNrSm9iU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0N2QwMjcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9DYWxsYmFja0pvYlN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuY29tbWFuZC5Kb2JDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnMuQ2FsbGJhY2tTeW5jaHJvbml6ZXI7Ci0KLS8qKgotICogRXh0ZW5kIHRoZSBqb2Igc3luY2hyb25pemVyIHRvIG5vdGlmeSBsaXN0ZW5lcnMKLSAqIHdoZW4gYSBzeW5jaHJvbml6YXRpb24gImN5Y2xlIiBpcyBjb21wbGV0ZTsgaS5lLiB0aGUgc3luY2hyb25pemF0aW9uIGhhcywKLSAqIGZvciB0aGUgbW9tZW50LCBoYW5kbGVkIGV2ZXJ5ICJzeW5jaHJvbml6ZSIgcmVxdWVzdCBhbmQgcXVpZXNjZWQuCi0gKiBUaGlzIG5vdGlmaWNhdGlvbiBpcyA8ZW0+bm90PC9lbT4gZ3VhcmFudGVlZCB0byBvY2N1ciB3aXRoIDxlbT5ldmVyeTwvZW0+Ci0gKiBzeW5jaHJvbml6YXRpb24gImN5Y2xlIjsKLSAqIHNpbmNlIG90aGVyLCB1bnJlbGF0ZWQsIHN5bmNocm9uaXphdGlvbnMgY2FuIGJlIHRyaWdnZXJlZCBjb25jdXJyZW50bHk7Ci0gKiBwcmV2ZW50aW5nIHRoZSBzeW5jaHJvbml6YXRpb24gZnJvbSBxdWllc2NpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWxsYmFja0pvYlN5bmNocm9uaXplcgotCWV4dGVuZHMgSm9iU3luY2hyb25pemVyCi0JaW1wbGVtZW50cyBDYWxsYmFja1N5bmNocm9uaXplcgotewotCXByaXZhdGUgZmluYWwgTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNhbGxiYWNrIGpvYiBzeW5jaHJvbml6ZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgam9iIGNvbW1hbmQgdG8KLQkgKiBwZXJmb3JtIHRoZSBzeW5jaHJvbml6YXRpb24uIEFzc2lnbiB0aGUgZ2VuZXJhdGVkIEVjbGlwc2Ugam9iIHRoZQotCSAqIHNwZWNpZmllZCBuYW1lLgotCSAqLwotCXB1YmxpYyBDYWxsYmFja0pvYlN5bmNocm9uaXplcihTdHJpbmcgam9iTmFtZSwgSm9iQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXN1cGVyKGpvYk5hbWUsIGNvbW1hbmQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNhbGxiYWNrIGpvYiBzeW5jaHJvbml6ZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgam9iIGNvbW1hbmQgdG8KLQkgKiBwZXJmb3JtIHRoZSBzeW5jaHJvbml6YXRpb24uIEFzc2lnbiB0aGUgZ2VuZXJhdGVkIEVjbGlwc2Ugam9iIHRoZQotCSAqIHNwZWNpZmllZCBuYW1lIGFuZCBzY2hlZHVsaW5nIHJ1bGUuCi0JICovCi0JcHVibGljIENhbGxiYWNrSm9iU3luY2hyb25pemVyKFN0cmluZyBqb2JOYW1lLCBKb2JDb21tYW5kIGNvbW1hbmQsIElTY2hlZHVsaW5nUnVsZSBzY2hlZHVsaW5nUnVsZSkgewotCQlzdXBlcihqb2JOYW1lLCBjb21tYW5kLCBzY2hlZHVsaW5nUnVsZSk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBqb2IgdGhhdCB3aWxsIGxldCB1cyBrbm93IHdoZW4gdGhlIHN5bmNocm9uaXphdGlvbiBoYXMKLQkgKiBxdWllc2NlZC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlTeW5jaHJvbml6YXRpb25Kb2IgYnVpbGRKb2IoU3RyaW5nIGpvYk5hbWUsIEpvYkNvbW1hbmQgY29tbWFuZCwgSVNjaGVkdWxpbmdSdWxlIHNjaGVkdWxpbmdSdWxlKSB7Ci0JCXJldHVybiBuZXcgQ2FsbGJhY2tTeW5jaHJvbml6YXRpb25Kb2Ioam9iTmFtZSwgY29tbWFuZCwgc2NoZWR1bGluZ1J1bGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDYWxsYmFja1N5bmNocm9uaXplciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0Jdm9pZCBzeW5jaHJvbml6YXRpb25RdWllc2NlZCgpIHsKLQkJZm9yIChMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQlsaXN0ZW5lci5zeW5jaHJvbml6YXRpb25RdWllc2NlZCh0aGlzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6YXRpb24gam9iICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB7QGxpbmsgSm9iU3luY2hyb25pemVyLlN5bmNocm9uaXphdGlvbkpvYn0KLQkgKiB0byBub3RpZnkgdGhlIHN5bmNocm9uaXplciB3aGVuIHRoZSBzeW5jaHJvbml6YXRpb24gaGFzIHF1aWVzY2VkCi0JICogKGkuZS4gdGhlIGNvbW1hbmQgaGFzIGZpbmlzaGVkIGV4ZWN1dGluZyBhbmQgdGhlcmUgYXJlIG5vIGZ1cnRoZXIKLQkgKiByZXF1ZXN0cyBmb3Igc3luY2hyb25pemF0aW9uKS4KLQkgKiBCZWNhdXNlIHN5bmNocm9uaXphdGlvbiBvY2N1cnMgZHVyaW5nIHRoZSBqb2IncyBleGVjdXRpb24sCi0JICogbm8gb3RoZXIgdGhyZWFkIHdpbGwgYmUgYWJsZSB0bwotCSAqIGluaXRpYXRlIGFub3RoZXIgc3luY2hyb25pemF0aW9uIHVudGlsIHRoZSBzeW5jaHJvbml6ZXIncyBsaXN0ZW5lcnMgaGF2ZSBiZWVuCi0JICogbm90aWZpZWQuIE5vdGUgYWxzbywgdGhlIHN5bmNocm9uaXplcidzIGxpc3RlbmVycyBjYW4sIHRoZW1zZWx2ZXMsCi0JICogdHJpZ2dlciBhbm90aGVyIHN5bmNocm9uaXphdGlvbiAoYnkgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBjYWxsaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5zeW5jaHJvbml6ZXJzLlN5bmNocm9uaXplciNzeW5jaHJvbml6ZSgpfSk7Ci0JICogYnV0IHRoaXMgc3luY2hyb25pemF0aW9uIHdpbGwgbm90IG9jY3VyIHVudGlsIDxlbT5hZnRlcjwvZW0+IGFsbCB0aGUKLQkgKiBsaXN0ZW5lcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLgotCSAqLwotCWNsYXNzIENhbGxiYWNrU3luY2hyb25pemF0aW9uSm9iCi0JCWV4dGVuZHMgU3luY2hyb25pemF0aW9uSm9iCi0JewotCQkvKioKLQkJICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0IHRvIHRydWUsIHRoZSBqb2IgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHJ1bi4KLQkJICogV2UgbmVlZCB0aGlzIGJlY2F1c2Uge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiBKb2J9Ci0JCSAqIGhhcyBubyBwdWJsaWMgQVBJIGZvciBkaXNjb3ZlcmluZyB3aGV0aGVyIGEgam9iIGlzICJzY2hlZHVsZWQiLgotCQkgKi8KLQkJLy8gdXNlICd2b2xhdGlsZScgYmVjYXVzZSBzeW5jaHJvbml6YXRpb24gaXNuJ3QgcmVhbGx5IHJlcXVpcmVkCi0JCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBzY2hlZHVsZWQ7Ci0KLQotCQlDYWxsYmFja1N5bmNocm9uaXphdGlvbkpvYihTdHJpbmcgam9iTmFtZSwgSm9iQ29tbWFuZCBjb21tYW5kLCBJU2NoZWR1bGluZ1J1bGUgc2NoZWR1bGluZ1J1bGUpIHsKLQkJCXN1cGVyKGpvYk5hbWUsIGNvbW1hbmQsIHNjaGVkdWxpbmdSdWxlKTsKLQkJCXRoaXMuc2NoZWR1bGVkID0gZmFsc2U7Ci0JCX0KLQotCQkvKioKLQkJICogSWYgd2UgYXJlIGFsbG93aW5nIHRoZSBqb2IgdG8gYmUgc2NoZWR1bGVkIChpLmUuIHtAbGluayAjc3RhcnQoKX0KLQkJICogd2FzIGNhbGxlZCksIHNldCB0aGUgInNjaGVkdWxlZCIgZmxhZy4KLQkJICovCi0JCUBPdmVycmlkZQotCQl2b2lkIHN5bmNocm9uaXplKCkgewotCQkJaWYgKHRoaXMuc2hvdWxkU2NoZWR1bGUpIHsKLQkJCQl0aGlzLnNjaGVkdWxlZCA9IHRydWU7Ci0JCQl9Ci0JCQlzdXBlci5zeW5jaHJvbml6ZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENsZWFyIHRoZSAic2NoZWR1bGVkIiBmbGFnOyBwZXJmb3JtIHRoZSBzeW5jaHJvbml6YXRpb247IGFuZCwKLQkJICogaWYgdGhlICJzY2hlZHVsZWQiIGZsYWcgaXMgc3RpbGwgY2xlYXIgKGkuZS4gdGhlcmUgaGF2ZSBiZWVuIG5vCi0JCSAqIGZ1cnRoZXIgY2FsbHMgdG8ge0BsaW5rICNzeW5jaHJvbml6ZSgpfSksIG5vdGlmeSBvdXIgbGlzdGVuZXJzLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXRoaXMuc2NoZWR1bGVkID0gZmFsc2U7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnJ1bihtb25pdG9yKTsKLQkJCS8vIGhtbW0gLSB3ZSB3aWxsIG5vdGlmeSBsaXN0ZW5lcnMgZXZlbiB3aGVuIHdlIG91ciBqb2IgaXMgInN0b3BwZWQiOwotCQkJLy8gdGhhdCBzZWVtcyBvay4uLiAgfmJqdgotCQkJaWYgKCAhIHRoaXMuc2NoZWR1bGVkKSB7Ci0JCQkJQ2FsbGJhY2tKb2JTeW5jaHJvbml6ZXIudGhpcy5zeW5jaHJvbml6YXRpb25RdWllc2NlZCgpOwotCQkJfQotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCi0JCUBPdmVycmlkZQotCQl2b2lkIHN0b3AoKSB7Ci0JCQl0aGlzLnNjaGVkdWxlZCA9IGZhbHNlOwotCQkJc3VwZXIuc3RvcCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9JQ1VTdHJpbmdDb2xsYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9JQ1VTdHJpbmdDb2xsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTVmYTQzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvSUNVU3RyaW5nQ29sbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIFRoaXMgY29sbGF0b3Igc2ltcGx5IHdyYXBzIGFuIElDVTRKIGNvbGxhdG9yIGFuZCBpbXBsZW1lbnRzIGEKLSAqIHtAbGluayBTdHJpbmd9IHtAbGluayBDb21wYXJhdG9yfSAoaW5zdGVhZCBvZiBhbiB7QGxpbmsgT2JqZWN0fQotICoge0BsaW5rIENvbXBhcmF0b3J9LCB3aGljaCBpcyB3aGF0IHtAbGluayBDb2xsYXRvcn0gZG9lcywgbWltaWNraW5nIHRoZQotICogSkRLKD8pKS4KLSAqIAotICogQHNlZSBDb2xsYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSUNVU3RyaW5nQ29sbGF0b3IKLQlpbXBsZW1lbnRzIENvbXBhcmF0b3I8U3RyaW5nPgotewotCXByaXZhdGUgZmluYWwgQ29sbGF0b3IgY29sbGF0b3I7Ci0KLQotCS8qKgotCSAqIFdyYXAgdGhlIGRlZmF1bHQgY29sbGF0b3IuCi0JICogQHNlZSBDb2xsYXRvciNnZXRJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIElDVVN0cmluZ0NvbGxhdG9yKCkgewotCQl0aGlzKENvbGxhdG9yLmdldEluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIGNvbGxhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGxvY2FsZS4KLQkgKiBAc2VlIENvbGxhdG9yI2dldEluc3RhbmNlKExvY2FsZSkKLQkgKi8KLQlwdWJsaWMgSUNVU3RyaW5nQ29sbGF0b3IoTG9jYWxlIGxvY2FsZSkgewotCQl0aGlzKENvbGxhdG9yLmdldEluc3RhbmNlKGxvY2FsZSkpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBjb2xsYXRvci4KLQkgKi8KLQlwdWJsaWMgSUNVU3RyaW5nQ29sbGF0b3IoQ29sbGF0b3IgY29sbGF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb2xsYXRvciA9IGNvbGxhdG9yOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgc3RyaW5nMSwgU3RyaW5nIHN0cmluZzIpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGF0b3IuY29tcGFyZShzdHJpbmcxLCBzdHJpbmcyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmNvbGxhdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L0pEVFRvb2xzLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L0pEVFRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNDg1M2MuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9KRFRUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkZsYWdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFyZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ob3ROdWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotCi0vKioKLSAqIENvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGRlYWxpbmcgd2l0aCBKRFQgY29yZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSkRUVG9vbHMgewotCi0JLyoqCi0JICogV3JhcCBjaGVja2VkIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcGFja2FnZUZyYWdtZW50Um9vdElzU291cmNlRm9sZGVyKElQYWNrYWdlRnJhZ21lbnRSb290IHBmcikgewotCQl0cnkgewotCQkJcmV0dXJuIHBhY2thZ2VGcmFnbWVudFJvb3RJc1NvdXJjZUZvbGRlcl8ocGZyKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgYm9vbGVhbiBwYWNrYWdlRnJhZ21lbnRSb290SXNTb3VyY2VGb2xkZXJfKElQYWNrYWdlRnJhZ21lbnRSb290IHBmcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBwZnIuZXhpc3RzKCkgJiYgKHBmci5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgY2hlY2tlZCBleGNlcHRpb24gYW5kIGNoZWNrIGZvciBvdXQgb2Ygc3luYyB3b3Jrc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJSmF2YUVsZW1lbnRbXSBnZXRDaGlsZHJlbihJUGFyZW50IHBhcmVudCkgewotCQl0cnkgewotCQkJcmV0dXJuIHBhcmVudC5nZXRDaGlsZHJlbigpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGlnbm9yZSBGTkZFIC0gd2hpY2ggY2FuIGhhcHBlbiB3aGVuIHRoZSB3b3Jrc3BhY2UgaXMgb3V0IG9mIHN5bmMgd2l0aCBPL1MgZmlsZSBzeXN0ZW0KLQkJCWlmICggISAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbikpIHsKLQkJCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQl9Ci0JCQlyZXR1cm4gRU1QVFlfSkFWQV9FTEVNRU5UX0FSUkFZOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUphdmFFbGVtZW50W10gRU1QVFlfSkFWQV9FTEVNRU5UX0FSUkFZID0gbmV3IElKYXZhRWxlbWVudFswXTsKLQotCS8qKgotCSAqIENsaW1iIHRoZSBzcGVjaWZpZWQgdHlwZSdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBsb29raW5nIGZvciB0aGUgc3BlY2lmaWVkIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHlwZUlzU3ViVHlwZShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyBwb3RlbnRpYWxTdWJUeXBlLCBTdHJpbmcgcG90ZW50aWFsU3VwZXJUeXBlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdHlwZUlzU3ViVHlwZShqYXZhUHJvamVjdCwgamF2YVByb2plY3QuZmluZFR5cGUocG90ZW50aWFsU3ViVHlwZSksIGphdmFQcm9qZWN0LmZpbmRUeXBlKHBvdGVudGlhbFN1cGVyVHlwZSkpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0eXBlSXNTdWJUeXBlKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSVR5cGUgcG90ZW50aWFsU3ViVHlwZSwgU3RyaW5nIHBvdGVudGlhbFN1cGVyVHlwZSkgewotCQl0cnkgewotCQkJcmV0dXJuIHR5cGVJc1N1YlR5cGVfKGphdmFQcm9qZWN0LCBwb3RlbnRpYWxTdWJUeXBlLCBwb3RlbnRpYWxTdXBlclR5cGUpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHlwZUlzU3ViVHlwZV8oSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJVHlwZSBwb3RlbnRpYWxTdWJUeXBlLCBTdHJpbmcgcG90ZW50aWFsU3VwZXJUeXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHR5cGVJc1N1YlR5cGUoamF2YVByb2plY3QsIHBvdGVudGlhbFN1YlR5cGUsIGphdmFQcm9qZWN0LmZpbmRUeXBlKHBvdGVudGlhbFN1cGVyVHlwZSkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHlwZUlzU3ViVHlwZShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElUeXBlIHBvdGVudGlhbFN1YlR5cGUsIElUeXBlIHBvdGVudGlhbFN1cGVyVHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWlmICgocG90ZW50aWFsU3ViVHlwZSA9PSBudWxsKSB8fCAocG90ZW50aWFsU3VwZXJUeXBlID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCS8vIHNob3J0IGN1dCBpZiB0eXBlcyBhcmUgdGhlIHNhbWUKLQkJaWYgKHBvdGVudGlhbFN1YlR5cGUuZXF1YWxzKHBvdGVudGlhbFN1cGVyVHlwZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQkvLyBzaG9ydCBjdXQgaWYgcG90ZW50aWFsIHN1cGVydHlwZSBpcyBqYXZhLmxhbmcuT2JqZWN0Ci0JCWlmIChqYXZhUHJvamVjdC5maW5kVHlwZShPYmplY3QuY2xhc3MuZ2V0TmFtZSgpKS5lcXVhbHMocG90ZW50aWFsU3VwZXJUeXBlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCVN0cmluZyBwb3RlbnRpYWxTdXBlclR5cGVOYW1lID0gcG90ZW50aWFsU3VwZXJUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkKLQkJZm9yIChTdHJpbmcgc3VwZXJUeXBlTmFtZSA6IGdldFJlc29sdmVkU3VwZXJUeXBlTmFtZXMocG90ZW50aWFsU3ViVHlwZSkpIHsKLQkJCWlmIChzdXBlclR5cGVOYW1lLmVxdWFscyhwb3RlbnRpYWxTdXBlclR5cGVOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJCi0JCQkvLyByZWN1cnNlIGludG8gc3VwZXIgdHlwZQotCQkJaWYgKHR5cGVJc1N1YlR5cGUoamF2YVByb2plY3QsIGphdmFQcm9qZWN0LmZpbmRUeXBlKHN1cGVyVHlwZU5hbWUpLCBwb3RlbnRpYWxTdXBlclR5cGUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUncyBzdXBlcnR5cGVzIChjbGFzcyBhbmQgaW50ZXJmYWNlcykuCi0JICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSwgZm9yIHdoYXRldmVyIHJlYXNvbiwgeyBAbGluayBJVHlwZSNnZXRTdXBlckludGVyZmFjZU5hbWVzKCl9Ci0JICoge0BsaW5rIElUeXBlI2dldFN1cGVyY2xhc3NOYW1lKCl9IHJldHVybiB1bnF1YWxpZmllZCBuYW1lcyB3aGVuIHRoZSB0eXBlIGlzIGZyb20gSmF2YSBzb3VyY2UuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmFibGU8U3RyaW5nPiBnZXRSZXNvbHZlZFN1cGVyVHlwZU5hbWVzKElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJdGVyYWJsZTxTdHJpbmc+IG5vblJlc29sdmVkU3VwZXJUeXBlTmFtZXMgPSBnZXROb25SZXNvbHZlZFN1cGVyVHlwZU5hbWVzKHR5cGUpOwotCQlpZiAodHlwZS5pc0JpbmFyeSgpKSB7Ci0JCQkvLyBpZiB0eXBlIGlzIGJpbmFyeSwgdGhlIHR5cGVzIGFyZSBhbHJlYWR5IHJlc29sdmVkCi0JCQlyZXR1cm4gbm9uUmVzb2x2ZWRTdXBlclR5cGVOYW1lczsKLQkJfQotCQlBcnJheUxpc3Q8U3RyaW5nPiByZXNvbHZlZFN1cGVyVHlwZU5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoU3RyaW5nIHN1cGVyVHlwZU5hbWUgOiBub25SZXNvbHZlZFN1cGVyVHlwZU5hbWVzKSB7Ci0JCQlyZXNvbHZlZFN1cGVyVHlwZU5hbWVzLmFkZChyZXNvbHZlVHlwZSh0eXBlLCBzdXBlclR5cGVOYW1lKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVkU3VwZXJUeXBlTmFtZXM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgKHBvdGVudGlhbGx5KSBub24tcmVzb2x2ZWQgbmFtZXMgb2YgdGhlIHNwZWNpZmllZCB0eXBlJ3Mgc3VwZXJ0eXBlcyAoY2xhc3MgYW5kIGludGVyZmFjZXMpLgotCSAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UsIGZvciB3aGF0ZXZlciByZWFzb24sIHsgQGxpbmsgSVR5cGUjZ2V0U3VwZXJJbnRlcmZhY2VOYW1lcygpfSBhbmQKLQkgKiB7QGxpbmsgSVR5cGUjZ2V0U3VwZXJjbGFzc05hbWUoKX0gcmV0dXJuIHVucXVhbGlmaWVkIG5hbWVzIHdoZW4gdGhlIHR5cGUgaXMgZnJvbSBKYXZhIHNvdXJjZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJdGVyYWJsZTxTdHJpbmc+IGdldE5vblJlc29sdmVkU3VwZXJUeXBlTmFtZXMoSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4oCi0JCQkJCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxTdHJpbmc+KHR5cGUuZ2V0U3VwZXJjbGFzc05hbWUoKSksCi0JCQkJCQkJTm90TnVsbEZpbHRlci48U3RyaW5nPmluc3RhbmNlKCkpLAotCQkJCQluZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KHR5cGUuZ2V0U3VwZXJJbnRlcmZhY2VOYW1lcygpKSk7Ci0JfQotCi0JLyoqCi0JICogSnVzdCBncmFiIHRoZSBmaXJzdCBjYW5kaWRhdGUgdHlwZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVR5cGUoSVR5cGUgdHlwZSwgU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdW10gcmVzb2x2ZWRDbGFzc05hbWVzID0gdHlwZS5yZXNvbHZlVHlwZShjbGFzc05hbWUpOwotCQlpZiAocmVzb2x2ZWRDbGFzc05hbWVzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBwa2cgPSByZXNvbHZlZENsYXNzTmFtZXNbMF1bMF07Ci0JCVN0cmluZyBjbHMgPSByZXNvbHZlZENsYXNzTmFtZXNbMF1bMV07Ci0JCS8vIGNoZWNrIGZvciBkZWZhdWx0IHBhY2thZ2UKLQkJcmV0dXJuIChwa2cubGVuZ3RoKCkgPT0gMCkgPyBjbHMgOiAocGtnICsgJy4nICsgY2xzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElUeXBlIGZpbmRUeXBlKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGphdmFQcm9qZWN0LmZpbmRUeXBlKGZ1bGx5UXVhbGlmaWVkTmFtZSk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPElQYWNrYWdlRnJhZ21lbnRSb290PiBnZXRKYXZhU291cmNlRm9sZGVycyhJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxJUGFja2FnZUZyYWdtZW50Um9vdD4oCi0JCQkJZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoamF2YVByb2plY3QpLAotCQkJCVNPVVJDRV9QQUNLQUdFX0ZSQUdNRU5UX1JPT1RfRklMVEVSCi0JCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZpbHRlcjxJUGFja2FnZUZyYWdtZW50Um9vdD4gU09VUkNFX1BBQ0tBR0VfRlJBR01FTlRfUk9PVF9GSUxURVIgPQotCQluZXcgRmlsdGVyPElQYWNrYWdlRnJhZ21lbnRSb290PigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChJUGFja2FnZUZyYWdtZW50Um9vdCBwZnIpIHsKLQkJCQlyZXR1cm4gcGFja2FnZUZyYWdtZW50Um9vdElzU291cmNlRm9sZGVyKHBmcik7Ci0JCQl9Ci0JCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBJdGVyYWJsZTxJUGFja2FnZUZyYWdtZW50Um9vdD4gZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0UGFja2FnZUZyYWdtZW50Um9vdHNfKGphdmFQcm9qZWN0KTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmFibGU8SVBhY2thZ2VGcmFnbWVudFJvb3Q+IGdldFBhY2thZ2VGcmFnbWVudFJvb3RzXyhJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8SVBhY2thZ2VGcmFnbWVudFJvb3Q+KGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0eXBlSXNFbnVtKElUeXBlIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCWlmICh0eXBlLmlzRW51bSgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHR5cGVJc1NlcmlhbGl6YWJsZShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElUeXBlIHR5cGUpIHsKLQkJcmV0dXJuIHR5cGVJc1N1YlR5cGUoamF2YVByb2plY3QsIHR5cGUsIFNFUklBTElaQUJMRV9DTEFTU19OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJJQUxJWkFCTEVfQ0xBU1NfTkFNRSA9IGphdmEuaW8uU2VyaWFsaXphYmxlLmNsYXNzLmdldE5hbWUoKTsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NIYXNQdWJsaWNaZXJvQXJnQ29uc3RydWN0b3IoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChqYXZhUHJvamVjdCAhPSBudWxsICYmIGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQlJVHlwZSB0eXBlID0gZmluZFR5cGUoamF2YVByb2plY3QsIGNsYXNzTmFtZSk7Ci0JCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHR5cGVIYXNQdWJsaWNaZXJvQXJnQ29uc3RydWN0b3IodHlwZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0eXBlSGFzUHVibGljWmVyb0FyZ0NvbnN0cnVjdG9yKElUeXBlIHR5cGUpIHsKLQkJYm9vbGVhbiBoYXNEZWZpbmVkQ29uc3RydWN0b3IgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWZvciAoSU1ldGhvZCBtZXRob2QgOiB0eXBlLmdldE1ldGhvZHMoKSkgewotCQkJCWlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQkJCWlmICgobWV0aG9kLmdldE51bWJlck9mUGFyYW1ldGVycygpID09IDApICYmIChGbGFncy5pc1B1YmxpYyhtZXRob2QuZ2V0RmxhZ3MoKSkpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCQloYXNEZWZpbmVkQ29uc3RydWN0b3IgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCS8vV2hlbiB0aGVyZSdzIG5vIGRlZmluZWQgY29uc3RydWN0b3IsIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIGluIHBsYWNlLgotCQkJaWYgKCFoYXNEZWZpbmVkQ29uc3RydWN0b3IpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvSm9iU3luY2hyb25pemVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L0pvYlN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjhlOGUwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvSm9iU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuY29tbWFuZC5Kb2JDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycy5TeW5jaHJvbml6ZXI7Ci0KLS8qKgotICogVGhpcyBzeW5jaHJvbml6ZXIgd2lsbCBwZXJmb3JtIHN5bmNocm9uaXphdGlvbnMgaW4gYW4gRWNsaXBzZSBqb2Igb24gYQotICogc2VwYXJhdGUgdGhyZWFkLCBhbGxvd2luZyBjYWxscyB0byB7QGxpbmsgU3luY2hyb25pemVyI3N5bmNocm9uaXplKCl9Ci0gKiB0byByZXR1cm4gaW1tZWRpYXRlbHkuCi0gKiA8cD4KLSAqIElmIG5lY2Vzc2FyeSwgdGhlIGNsaWVudC1zdXBwbGllZCBqb2IgY29tbWFuZCBzaG91bGQgaGFuZGxlIGFueQotICogZXhjZXB0aW9ucyBhcHByb3ByaWF0ZWx5LiBBbHRob3VnaCwgdGhlIGRlZmF1bHQgZXhjZXB0aW9uLWhhbmRsaW5nIHByb3ZpZGVkCi0gKiBieSB0aGUgRWNsaXBzZSBKb2IgRnJhbWV3b3JrIGlzIHByb2JhYmx5IGFkZXF1YXRlIGluIG1vc3QgY2FzZXM6PHVsPgotICogPGxpPkFuIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb259Ci0gKiAgICAgcmVzdWx0cyBpbiBhIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzI0NBTkNFTF9TVEFUVVMgQ0FOQ0VMX1NUQVRVU30uCi0gKiA8bGk+QW55IG5vbi17QGxpbmsgVGhyZWFkRGVhdGh9IHtAbGluayBUaHJvd2FibGV9Ci0gKiAgICAgcmVzdWx0cyBpbiBhIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNFUlJPUiBFUlJPUn0KLSAqICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgSVN0YXR1c30KLSAqIDwvdWw+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuam9icy5Xb3JrZXIjcnVuKCkKLSAqLwotcHVibGljIGNsYXNzIEpvYlN5bmNocm9uaXplcgotCWltcGxlbWVudHMgU3luY2hyb25pemVyCi17Ci0JLyoqCi0JICogVGhlIHN5bmNocm9uaXphdGlvbiBpcyBwZXJmb3JtZWQgYnkgdGhpcyBqb2IuIFRoZSBzYW1lIGpvYiBpcyB1c2VkCi0JICogZm9yIGV2ZXJ5IHN0YXJ0L3N0b3AgY3ljbGUgKHNpbmNlIGEgam9iIGNhbiBiZSByZS1zdGFydGVkKS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN5bmNocm9uaXphdGlvbkpvYiBqb2I7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGpvYiBzeW5jaHJvbml6ZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgam9iIGNvbW1hbmQgdG8KLQkgKiBwZXJmb3JtIHRoZSBzeW5jaHJvbml6YXRpb24uIEFzc2lnbiB0aGUgZ2VuZXJhdGVkIEVjbGlwc2Ugam9iIHRoZQotCSAqIHNwZWNpZmllZCBuYW1lLgotCSAqLwotCXB1YmxpYyBKb2JTeW5jaHJvbml6ZXIoU3RyaW5nIGpvYk5hbWUsIEpvYkNvbW1hbmQgY29tbWFuZCkgewotCQl0aGlzKGpvYk5hbWUsIGNvbW1hbmQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGpvYiBzeW5jaHJvbml6ZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgam9iIGNvbW1hbmQgdG8KLQkgKiBwZXJmb3JtIHRoZSBzeW5jaHJvbml6YXRpb24uIEFzc2lnbiB0aGUgZ2VuZXJhdGVkIEVjbGlwc2Ugam9iIHRoZQotCSAqIHNwZWNpZmllZCBuYW1lIGFuZCBzY2hlZHVsaW5nIHJ1bGUuCi0JICovCi0JcHVibGljIEpvYlN5bmNocm9uaXplcihTdHJpbmcgam9iTmFtZSwgSm9iQ29tbWFuZCBjb21tYW5kLCBJU2NoZWR1bGluZ1J1bGUgc2NoZWR1bGluZ1J1bGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5qb2IgPSB0aGlzLmJ1aWxkSm9iKGpvYk5hbWUsIGNvbW1hbmQsIHNjaGVkdWxpbmdSdWxlKTsKLQl9Ci0KLQlTeW5jaHJvbml6YXRpb25Kb2IgYnVpbGRKb2IoU3RyaW5nIGpvYk5hbWUsIEpvYkNvbW1hbmQgY29tbWFuZCwgSVNjaGVkdWxpbmdSdWxlIHNjaGVkdWxpbmdSdWxlKSB7Ci0JCXJldHVybiBuZXcgU3luY2hyb25pemF0aW9uSm9iKGpvYk5hbWUsIGNvbW1hbmQsIHNjaGVkdWxpbmdSdWxlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3luY2hyb25pemVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsbG93IHRoZSBqb2IgdG8gYmUgc2NoZWR1bGVkLCBidXQgcG9zdHBvbmUgdGhlIGZpcnN0IHN5bmNocm9uaXphdGlvbgotCSAqIHVudGlsIHJlcXVlc3RlZCwgdmlhIHtAbGluayAjc3luY2hyb25pemUoKX0uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCXRoaXMuam9iLnN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogIlNjaGVkdWxlIiB0aGUgam9iLgotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKCkgewotCQl0aGlzLmpvYi5zeW5jaHJvbml6ZSgpOwotCX0KLQotCS8qKgotCSAqIFdhaXQgZm9yIHRoZSBjdXJyZW50IGpvYiBleGVjdXRpb24gdG8gY29tcGxldGUuCi0JICovCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJdGhpcy5qb2Iuc3RvcCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuam9iKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemF0aW9uIGpvYiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBqb2IgdGhhdCBnZXRzIHNjaGVkdWxlZCBieSB0aGUgam9iIHN5bmNocm9uaXplci4KLQkgKiBXaGVuIHRoZSBqb2IgaXMgcnVuIGl0IGV4ZWN1dGVzIHRoZSBjbGllbnQtc3VwcGxpZWQgam9iIGNvbW1hbmQuCi0JICovCi0Jc3RhdGljIGNsYXNzIFN5bmNocm9uaXphdGlvbkpvYgotCQlleHRlbmRzIEpvYgotCXsKLQkJLyoqCi0JCSAqIFRoZSBjbGllbnQtc3VwcGxpZWQgam9iIGNvbW1hbmQgdGhhdCBleGVjdXRlcyBldmVyeSB0aW1lIHRoZSBqb2IKLQkJICogcnVucy4KLQkJICovCi0JCXByaXZhdGUgZmluYWwgSm9iQ29tbWFuZCBjb21tYW5kOwotCi0JCS8qKgotCQkgKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQgdG8gZmFsc2UsIHRoZSBqb2IgZG9lcyBub3Qgc3RvcCBpbW1lZGlhdGVseTsKLQkJICogYnV0IGl0IHdpbGwgbm90IGJlIHNjaGVkdWxlZCB0byBydW4gYWdhaW4uCi0JCSAqLwotCQkvLyB1c2UgJ3ZvbGF0aWxlJyBiZWNhdXNlIHN5bmNocm9uaXphdGlvbiBpc24ndCByZWFsbHkgcmVxdWlyZWQKLQkJdm9sYXRpbGUgYm9vbGVhbiBzaG91bGRTY2hlZHVsZTsKLQotCi0JCVN5bmNocm9uaXphdGlvbkpvYihTdHJpbmcgam9iTmFtZSwgSm9iQ29tbWFuZCBjb21tYW5kLCBJU2NoZWR1bGluZ1J1bGUgc2NoZWR1bGluZ1J1bGUpIHsKLQkJCXN1cGVyKGpvYk5hbWUpOwotCQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQkJCXRoaXMuc2hvdWxkU2NoZWR1bGUgPSBmYWxzZTsKLQkJCXRoaXMuc2V0UnVsZShzY2hlZHVsaW5nUnVsZSk7Ci0JCX0KLQotCQkvKioKLQkJICogSnVzdCBzZXQgdGhlICJzaG91bGQgc2NoZWR1bGUiIGZsYWcgc28gdGhlIGpvYiA8ZW0+Y2FuPC9lbT4gYmUKLQkJICogc2NoZWR1bGVkOyBidXQgZG9uJ3QgYWN0dWFsbHkgc2NoZWR1bGUgaXQuCi0JCSAqLwotCQl2b2lkIHN0YXJ0KCkgewotCQkJaWYgKHRoaXMuc2hvdWxkU2NoZWR1bGUpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgU3luY2hyb25pemVyIHdhcyBub3Qgc3RvcHBlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdGhpcy5zaG91bGRTY2hlZHVsZSA9IHRydWU7Ci0JCX0KLQotCQkvKioKLQkJICogU2ltcGx5IHJlLXNjaGVkdWxlIHRoZSBqb2IsIGFsbG93aW5nIHRoZSBjdXJyZW50IGV4ZWN1dGlvbgotCQkgKiB0byBydW4gdG8gY29tcGxldGlvbiAoaS5lLiBkbyBub3QgdHJ5IHRvIGNhbmNlbCBpdCBwcmVtYXR1cmVseSkuCi0JCSAqIFRoaXMgc2hvdWxkIG1pbmltaXplIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGpvYiBpcyByZS1leGVjdXRlZAotCQkgKiAocmVjdXJzaXZlbHkgYW5kIG90aGVyd2lzZSkuCi0JCSAqLwotCQl2b2lkIHN5bmNocm9uaXplKCkgewotCQkJdGhpcy5zY2hlZHVsZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFueSB1bmNhdWdodCBleGNlcHRpb25zIHRocm93biBieSB0aGUgY29tbWFuZCB3aWxsIGJlIHJlYXNvbmFibHkKLQkJICogaGFuZGxlZCBieSB0aGUgSm9iIEZyYW1ld29yay4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmpvYnMuV29ya2VyI3J1bigpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJcmV0dXJuIHRoaXMuY29tbWFuZC5leGVjdXRlKG1vbml0b3IpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFByZXZlbnQgdGhlIGpvYiBmcm9tIHJ1bm5pbmcgYWdhaW4gYW5kIHdhaXQgZm9yIHRoZSBjdXJyZW50Ci0JCSAqIGV4ZWN1dGlvbiwgaWYgdGhlcmUgaXMgYW55LCB0byBlbmQgYmVmb3JlIHJldHVybmluZy4KLQkJICovCi0JCXZvaWQgc3RvcCgpIHsKLQkJCWlmICggISB0aGlzLnNob3VsZFNjaGVkdWxlKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIFN5bmNocm9uaXplciB3YXMgbm90IHN0YXJ0ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIHRoaXMgd2lsbCBwcmV2ZW50IHRoZSBqb2IgZnJvbSBiZWluZyBzY2hlZHVsZWQgdG8gcnVuIGFnYWluCi0JCQl0aGlzLnNob3VsZFNjaGVkdWxlID0gZmFsc2U7Ci0JCQkvLyB0aGlzIHdpbGwgY2FuY2VsIHRoZSBqb2IgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBzY2hlZHVsZWQsIGJ1dCBpcyBjdXJyZW50bHkgV0FJVElORwotCQkJdGhpcy5jYW5jZWwoKTsKLQkJCXRyeSB7Ci0JCQkJLy8gaWYgdGhlIGpvYiBpcyBjdXJyZW50bHkgUlVOTklORywgd2FpdCB1bnRpbCBpdCBpcyBkb25lIGJlZm9yZSByZXR1cm5pbmcKLQkJCQl0aGlzLmpvaW4oKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gdGhlIHRocmVhZCB0aGF0IGNhbGxlZCAjc3RvcCgpIHdhcyBpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIHRvCi0JCQkJLy8gam9pbiB0aGUgc3luY2hyb25pemF0aW9uIGpvYiAtIGlnbm9yZTsKLQkJCQkvLyAnc2hvdWxkU2NoZWR1bGUnIGlzIHN0aWxsIHNldCB0byAnZmFsc2UnLCBzbyB0aGUgam9iIGxvb3Agd2lsbCBzdGlsbCBzdG9wIC0gd2UKLQkJCQkvLyBqdXN0IHdvbid0IHdhaXQgYXJvdW5kIGZvciBpdC4uLgotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoaXMgaXMgcGFydCBvZiB0aGUgbm9ybWFsIHtAbGluayBKb2J9IGJlaGF2aW9yLiBCeSBkZWZhdWx0LCBpdCBpcwotCQkgKiBub3QgdXNlZCAoaS5lLiBpdCBhbHdheXMgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPikuCi0JCSAqIFdlIGltcGxlbWVudCBpdCBoZXJlLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIHNob3VsZFNjaGVkdWxlKCkgewotCQkJcmV0dXJuIHRoaXMuc2hvdWxkU2NoZWR1bGU7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L1BsYXRmb3JtVG9vbHMuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvUGxhdGZvcm1Ub29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjJjY2QxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvUGxhdGZvcm1Ub29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBBIGNvbGxlY3Rpb24gb2YgdXRpbGl0aWVzIGZvciBkZWFsaW5nIHdpdGggdGhlIEVjbGlwc2UgcGxhdGZvcm0gQVBJLgotICovCi1wdWJsaWMgY2xhc3MgUGxhdGZvcm1Ub29scyB7Ci0JLyoqCi0JICogQWRkIHNvbWUgR2VuZXJpYyBHb29kbmVzcyB0byB0aGUgbWV0aG9kIHNpZ25hdHVyZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlck1hbmFnZXIjZ2V0QWRhcHRlcihPYmplY3QsIENsYXNzKQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPEE+IEEgZ2V0QWRhcHRlcihPYmplY3QgbywgQ2xhc3M8QT4gYWRhcHRlclR5cGUpIHsKLQkJcmV0dXJuIChBKSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIobywgYWRhcHRlclR5cGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIElDb250YWluZXJ9IHdpdGggdGhlIHdvcmtzcGFjZSByZWxhdGl2ZSAiZnVsbCIgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNvbnRhaW5lciBnZXRDb250YWluZXIoSVBhdGggZnVsbENvbnRhaW5lclBhdGgpIHsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCS8vIGNoYW5nZWQgdG8gaGFuZGxlIG5vbi13b3Jrc3BhY2UgcHJvamVjdHMKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gZnVsbENvbnRhaW5lclBhdGguc2VnbWVudCgwKS50b1N0cmluZygpOwotCQlJUGF0aCBwcm9qZWN0UmVsYXRpdmVQYXRoID0gZnVsbENvbnRhaW5lclBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCWlmIChwcm9qZWN0UmVsYXRpdmVQYXRoLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHByb2plY3Q7Ci0JCX0KLQkJcmV0dXJuIHByb2plY3QuZ2V0Rm9sZGVyKHByb2plY3RSZWxhdGl2ZVBhdGgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBJRmlsZX0gd2l0aCB0aGUgd29ya3NwYWNlIHJlbGF0aXZlICJmdWxsIiBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKElQYXRoIGZ1bGxGaWxlUGF0aCkgewotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJLy8gY2hhbmdlZCB0byBoYW5kbGUgbm9uLXdvcmtzcGFjZSBwcm9qZWN0cwotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBmdWxsRmlsZVBhdGguc2VnbWVudCgwKS50b1N0cmluZygpOwotCQlJUGF0aCBwcm9qZWN0UmVsYXRpdmVQYXRoID0gZnVsbEZpbGVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSByb290LmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlyZXR1cm4gcHJvamVjdC5nZXRGaWxlKHByb2plY3RSZWxhdGl2ZVBhdGgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBmaWxlJ3MgY29udGVudCB0eXBlLAotCSAqIHVzaW5nIHRoZSBFY2xpcHNlIHBsYXRmb3JtJ3MgY29udGVudCB0eXBlIG1hbmFnZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoSUZpbGUgZmlsZSkgewotCQlTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLQkJSW5wdXRTdHJlYW0gZmlsZUNvbnRlbnRzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZpbGVDb250ZW50cyA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJLy8gc2VlbXMgbGlrZSB3ZSBjYW4gaWdub3JlIGFueSBleGNlcHRpb24gdGhhdCBtaWdodCBvY2N1ciBoZXJlOwotCQkJLy8gZS5nLiB3ZSBnZXQgYSBGTkZFIGlmIHRoZSB3b3Jrc3BhY2UgaXMgb3V0IG9mIHN5bmMgd2l0aCB0aGUgTy9TIGZpbGUgc3lzdGVtCi0JCQkvLyBKcHRDb3JlUGx1Z2luLmxvZyhleCk7Ci0KLQkJCS8vIGxvb2sgZm9yIGNvbnRlbnQgdHlwZSBiYXNlZCBvbiB0aGUgZmlsZSBuYW1lIG9ubHkoPykKLQkJCXJldHVybiBmaW5kQ29udGVudFR5cGVGb3IoZmlsZU5hbWUpOwotCQl9Ci0KLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvbnRlbnRUeXBlID0gZmluZENvbnRlbnRUeXBlRm9yKGZpbGVDb250ZW50cywgZmlsZU5hbWUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlmaWxlQ29udGVudHMuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250ZW50VHlwZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJQ29udGVudFR5cGUgZmluZENvbnRlbnRUeXBlRm9yKElucHV0U3RyZWFtIGZpbGVDb250ZW50cywgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKGZpbGVDb250ZW50cywgZmlsZU5hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElDb250ZW50VHlwZSBmaW5kQ29udGVudFR5cGVGb3IoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXJldHVybiBnZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoZmlsZU5hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElDb250ZW50VHlwZU1hbmFnZXIgZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0JfQotCi0JcHJpdmF0ZSBQbGF0Zm9ybVRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L1NpbXBsZVNjaGVkdWxpbmdSdWxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L1NpbXBsZVNjaGVkdWxpbmdSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNTkxNWEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9TaW1wbGVTY2hlZHVsaW5nUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSBqb2Igc2NoZWR1bGluZyBydWxlIHRoYXQgY29uZmxpY3RzIG9ubHkgd2l0aCBpdHNlbGYuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTaW1wbGVTY2hlZHVsaW5nUnVsZQotCWltcGxlbWVudHMgSVNjaGVkdWxpbmdSdWxlLCBTZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCXB1YmxpYyBTaW1wbGVTY2hlZHVsaW5nUnVsZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQlyZXR1cm4gcnVsZSA9PSB0aGlzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29uZmxpY3RpbmcoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJcmV0dXJuIHJ1bGUgPT0gdGhpczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L1NpbXBsZVRleHRSYW5nZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9TaW1wbGVUZXh0UmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2NGUzMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L1NpbXBsZVRleHRSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LkFic3RyYWN0VGV4dFJhbmdlOwotCi0vKioKLSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZgotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZSBUZXh0UmFuZ2V9LgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlVGV4dFJhbmdlCi0JZXh0ZW5kcyBBYnN0cmFjdFRleHRSYW5nZQotewotCXByaXZhdGUgZmluYWwgaW50IG9mZnNldDsKLQlwcml2YXRlIGZpbmFsIGludCBsZW5ndGg7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgbGluZU51bWJlcjsKLQotCi0JcHVibGljIFNpbXBsZVRleHRSYW5nZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgbGluZU51bWJlcikgewotCQlzdXBlcigpOwotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JCXRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0JfQotCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB0aGlzLm9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMubGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLQkJcmV0dXJuIHRoaXMubGluZU51bWJlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L1dvcmtzcGFjZVJ1bm5hYmxlQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9Xb3Jrc3BhY2VSdW5uYWJsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk1OGZlNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L1dvcmtzcGFjZVJ1bm5hYmxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElXb3Jrc3BhY2VSdW5uYWJsZX0uCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3Jrc3BhY2VSdW5uYWJsZUFkYXB0ZXIKLQlpbXBsZW1lbnRzIElXb3Jrc3BhY2VSdW5uYWJsZQotewotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gTk9QCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9YUG9pbnRUb29scy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9YUG9pbnRUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQyZmI1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvWFBvaW50VG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLkpwdENvbW1vbkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogVXRpbGl0aWVzIGZvciBleHRlbnNpb24gcG9pbnQgbWFuYWdlbWVudCwgdmFsaWRhdGlvbiwgZXRjLgotICovCi1wdWJsaWMgY2xhc3MgWFBvaW50VG9vbHMgewotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbmRSZXF1aXJlZEF0dHJpYnV0ZSgKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkKLQkJCXRocm93cyBYUG9pbnRFeGNlcHRpb24gewotCQkKLQkJU3RyaW5nIHZhbCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOwotCQlpZiAodmFsID09IG51bGwpIHsKLQkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoY29uZmlnRWxlbWVudCwgYXR0cmlidXRlTmFtZSk7Ci0JCQl0aHJvdyBuZXcgWFBvaW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHZhbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyA8VD4gVCBpbnN0YW50aWF0ZShTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBleHRlbnNpb25Qb2ludCwgU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8VD4gaW50ZXJmYXplKSB7Ci0JCUNsYXNzPFQ+IGNsYXp6ID0gbG9hZENsYXNzKHBsdWdpbklkLCBleHRlbnNpb25Qb2ludCwgY2xhc3NOYW1lLCBpbnRlcmZhemUpOwotCQlyZXR1cm4gKGNsYXp6ID09IG51bGwpID8gbnVsbCA6IGluc3RhbnRpYXRlKHBsdWdpbklkLCBleHRlbnNpb25Qb2ludCwgY2xhenopOwotICAgIH0KLQkKLQkvKioKLQkgKiBJbnN0YW50aWF0ZSB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgaW5zdGFudGlhdGUoU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQsIENsYXNzPFQ+IGNsYXp6KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gY2xhenoubmV3SW5zdGFuY2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dGYWlsZWRJbnN0YW50aWF0aW9uKGV4LCBwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnQsIGNsYXp6LmdldE5hbWUoKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgkKLQkgKiBMb2FkIHRoZSBzcGVjaWZpZWQgY2xhc3MgYW5kIGNhc3QgaXQgdG8gdGhlIHNwZWNpZmllZCBpbnRlcmZhY2UuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPFQ+IENsYXNzPFQ+IGxvYWRDbGFzcyhTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBleHRlbnNpb25Qb2ludCwgU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8VD4gaW50ZXJmYXplKSB7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCi0JCUNsYXNzPD8+IGNsYXp6OwotCQl0cnkgewotCQkJY2xhenogPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nRmFpbGVkQ2xhc3NMb2FkKGV4LCBwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnQsIGNsYXNzTmFtZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJaWYgKGludGVyZmF6ZS5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KSkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlDbGFzczxUPiBjbGF6elQgPSAoQ2xhc3M8VD4pIGNsYXp6OwotCQkJcmV0dXJuIGNsYXp6VDsKLQkJfQotCQkKLQkJbG9nRmFpbGVkSW50ZXJmYWNlQXNzaWdubWVudChwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnQsIGNsYXNzTmFtZSwgaW50ZXJmYXplLmdldE5hbWUoKSk7Ci0JCXJldHVybiBudWxsOwotICAgIH0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRHVwbGljYXRlRXh0ZW5zaW9uKFN0cmluZyBleHRlbnNpb25Qb2ludCwgU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJbG9nKEpwdENvbW1vbkNvcmVNZXNzYWdlcy5SRUdJU1RSWV9EVVBMSUNBVEUsIGV4dGVuc2lvblBvaW50LCBub2RlTmFtZSwgdmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nTWlzc2luZ0F0dHJpYnV0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJbG9nKEpwdENvbW1vbkNvcmVNZXNzYWdlcy5SRUdJU1RSWV9NSVNTSU5HX0FUVFJJQlVURSwKLQkJCQlhdHRyaWJ1dGVOYW1lLAotCQkJCWNvbmZpZ0VsZW1lbnQuZ2V0TmFtZSgpLAotCQkJCWNvbmZpZ0VsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0RXh0ZW5zaW9uUG9pbnRVbmlxdWVJZGVudGlmaWVyKCksCi0JCQkJY29uZmlnRWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSk7Ci0gICAgfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dJbnZhbGlkVmFsdWUoCi0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCwgU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgaW52YWxpZFZhbHVlKSB7Ci0JCQotCQlsb2coSnB0Q29tbW9uQ29yZU1lc3NhZ2VzLlJFR0lTVFJZX0lOVkFMSURfVkFMVUUsCi0JCQkJaW52YWxpZFZhbHVlLAotCQkJCW5vZGVOYW1lLAotCQkJCWNvbmZpZ0VsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0RXh0ZW5zaW9uUG9pbnRVbmlxdWVJZGVudGlmaWVyKCksCi0JCQkJY29uZmlnRWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgbG9nRmFpbGVkQ2xhc3NMb2FkKEV4Y2VwdGlvbiBleCwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQsIFN0cmluZyBjbGFzc05hbWUpIHsKLQkJbG9nKGV4LCBKcHRDb21tb25Db3JlTWVzc2FnZXMuUkVHSVNUUllfRkFJTEVEX0NMQVNTX0xPQUQsCi0JCQkJY2xhc3NOYW1lLAotCQkJCWV4dGVuc2lvblBvaW50LAotCQkJCXBsdWdpbklkKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dGYWlsZWRJbnRlcmZhY2VBc3NpZ25tZW50KAotCQkJU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQsIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBpbnRlcmZhY2VOYW1lKSB7Ci0JCQotCQlsb2coSnB0Q29tbW9uQ29yZU1lc3NhZ2VzLlJFR0lTVFJZX0ZBSUxFRF9JTlRFUkZBQ0VfQVNTSUdOTUVOVCwKLQkJCQljbGFzc05hbWUsCi0JCQkJZXh0ZW5zaW9uUG9pbnQsCi0JCQkJcGx1Z2luSWQsCi0JCQkJaW50ZXJmYWNlTmFtZSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgbG9nRmFpbGVkSW5zdGFudGlhdGlvbihFeGNlcHRpb24gZXgsIFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIGV4dGVuc2lvblBvaW50LCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWxvZyhleCwgSnB0Q29tbW9uQ29yZU1lc3NhZ2VzLlJFR0lTVFJZX0ZBSUxFRF9JTlNUQU5USUFUSU9OLAotCQkJCWNsYXNzTmFtZSwKLQkJCQlleHRlbnNpb25Qb2ludCwKLQkJCQlwbHVnaW5JZCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZywgU3RyaW5nLi4uIGJpbmRpbmdzKSB7Ci0JCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKE5MUy5iaW5kKG1zZywgYmluZGluZ3MpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZXgsIFN0cmluZyBtc2csIFN0cmluZy4uLiBiaW5kaW5ncykgewotCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhOTFMuYmluZChtc2csIGJpbmRpbmdzKSwgZXgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleCkgewotCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgWFBvaW50RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9jb21tYW5kL0Fic3RyYWN0U2luZ2xlVXNlUXVldWVpbmdKb2JDb21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvY29tbWFuZC9BYnN0cmFjdFNpbmdsZVVzZVF1ZXVlaW5nSm9iQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMjk4NTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9jb21tYW5kL0Fic3RyYWN0U2luZ2xlVXNlUXVldWVpbmdKb2JDb21tYW5kRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuY29tbWFuZC5Db21iaW5lZENvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5jb21tYW5kLkpvYkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5TdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLmNvbW1hbmQuQWJzdHJhY3RTaW5nbGVVc2VRdWV1ZWluZ0NvbW1hbmRFeGVjdXRvcjsKLQotLyoqCi0gKiBUaGlzIGpvYiBjb21tYW5kIGV4ZWN1dG9yIHdyYXBzIGFuZCBleHRlbmRzIGFuCi0gKiB7QGxpbmsgQWJzdHJhY3RTaW5nbGVVc2VRdWV1ZWluZ0NvbW1hbmRFeGVjdXRvcn0sCi0gKiBhZGRpbmcgc3VwcG9ydCBmb3IgZXhlY3V0aW5nIHtAbGluayBKb2JDb21tYW5kfXMuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFRoaXMgZXhlY3V0b3IgPGVtPmlnbm9yZXM8L2VtPiBhbnkKLSAqIHtAbGluayBJU2NoZWR1bGluZ1J1bGUgc2NoZWR1bGluZyBydWxlc30uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNpbmdsZVVzZVF1ZXVlaW5nSm9iQ29tbWFuZEV4ZWN1dG9yPEUxIGV4dGVuZHMgQWJzdHJhY3RTaW5nbGVVc2VRdWV1ZWluZ0NvbW1hbmRFeGVjdXRvcjxFMj4sIEUyIGV4dGVuZHMgU3RhdGVmdWxDb21tYW5kRXhlY3V0b3I+Ci0JaW1wbGVtZW50cyBDb21iaW5lZENvbW1hbmRFeGVjdXRvciwgU3RhdGVmdWxDb21tYW5kRXhlY3V0b3IKLXsKLQkvKioKLQkgKiBTaW5jZSB0aGUge0BsaW5rIEpvYkNvbW1hbmR9cyBhcmUgc2ltcGx5IGNvbnZlcnRlZCBpbnRvIHtAbGluayBDb21tYW5kfXMsCi0JICogd2UgY2FuIGRlbGVnYXRlIHRvIGFuIHtAbGluayBBYnN0cmFjdFNpbmdsZVVzZVF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yfS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRTEgY29tbWFuZEV4ZWN1dG9yOwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RTaW5nbGVVc2VRdWV1ZWluZ0pvYkNvbW1hbmRFeGVjdXRvcihFMSBjb21tYW5kRXhlY3V0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb21tYW5kRXhlY3V0b3IgPSBjb21tYW5kRXhlY3V0b3I7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFNpbmdsZVVzZVF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yI3N0YXJ0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJdGhpcy5jb21tYW5kRXhlY3V0b3Iuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0U2luZ2xlVXNlUXVldWVpbmdDb21tYW5kRXhlY3V0b3IjZXhlY3V0ZShDb21tYW5kKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXRoaXMuY29tbWFuZEV4ZWN1dG9yLmV4ZWN1dGUoY29tbWFuZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFNpbmdsZVVzZVF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yI2V4ZWN1dGUoQ29tbWFuZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCkgewotCQl0aGlzLmNvbW1hbmRFeGVjdXRvci5leGVjdXRlKG5ldyBKb2JDb21tYW5kQ29tbWFuZEFkYXB0ZXIoY29tbWFuZCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RTaW5nbGVVc2VRdWV1ZWluZ0NvbW1hbmRFeGVjdXRvciNleGVjdXRlKENvbW1hbmQpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQsIFN0cmluZyBqb2JOYW1lKSB7Ci0JCS8vIGlnbm9yZSAnam9iTmFtZScKLQkJdGhpcy5jb21tYW5kRXhlY3V0b3IuZXhlY3V0ZShuZXcgSm9iQ29tbWFuZENvbW1hbmRBZGFwdGVyKGNvbW1hbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0U2luZ2xlVXNlUXVldWVpbmdDb21tYW5kRXhlY3V0b3IjZXhlY3V0ZShDb21tYW5kKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kLCBTdHJpbmcgam9iTmFtZSwgSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJLy8gaWdub3JlICdqb2JOYW1lJyBhbmQgJ3J1bGUnCi0JCXRoaXMuY29tbWFuZEV4ZWN1dG9yLmV4ZWN1dGUobmV3IEpvYkNvbW1hbmRDb21tYW5kQWRhcHRlcihjb21tYW5kKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFNpbmdsZVVzZVF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yI3N1c3BlbmQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN1c3BlbmQoKSB7Ci0JCXRoaXMuY29tbWFuZEV4ZWN1dG9yLnN1c3BlbmQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0U2luZ2xlVXNlUXVldWVpbmdDb21tYW5kRXhlY3V0b3IjcmVzdW1lKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN1bWUoKSB7Ci0JCXRoaXMuY29tbWFuZEV4ZWN1dG9yLnJlc3VtZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RTaW5nbGVVc2VRdWV1ZWluZ0NvbW1hbmRFeGVjdXRvciNzdG9wKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy5jb21tYW5kRXhlY3V0b3Iuc3RvcCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY29tbWFuZEV4ZWN1dG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2NvbW1hbmQvQ29tbWFuZEpvYkNvbW1hbmRBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2NvbW1hbmQvQ29tbWFuZEpvYkNvbW1hbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YzUyMzEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9jb21tYW5kL0NvbW1hbmRKb2JDb21tYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5jb21tYW5kLkpvYkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQWRhcHQgYSB7QGxpbmsgQ29tbWFuZH0gdG8gdGhlIHtAbGluayBKb2JDb21tYW5kfSBpbnRlcmZhY2UuCi0gKiBOZWNlc3NhcmlseSwgdGhlIHByb2dyZXNzIG1vbml0b3IgaXMgaWdub3JlZCBhbmQgYSBzdGF0dXMgb2YKLSAqIE9LIGlzIHJldHVybmVkLgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWFuZEpvYkNvbW1hbmRBZGFwdGVyCi0JaW1wbGVtZW50cyBKb2JDb21tYW5kCi17Ci0JcHJpdmF0ZSBmaW5hbCBDb21tYW5kIGNvbW1hbmQ7Ci0KLQotCXB1YmxpYyBDb21tYW5kSm9iQ29tbWFuZEFkYXB0ZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChjb21tYW5kID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdGhpcy5jb21tYW5kLmV4ZWN1dGUoKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5jb21tYW5kKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2NvbW1hbmQvSm9iQ29tbWFuZENvbW1hbmRBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2NvbW1hbmQvSm9iQ29tbWFuZENvbW1hbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNjlhNWIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9jb21tYW5kL0pvYkNvbW1hbmRDb21tYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuY29tbWFuZC5Kb2JDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEFkYXB0IGEge0BsaW5rIEpvYkNvbW1hbmR9IHRvIHRoZSB7QGxpbmsgQ29tbWFuZH0gaW50ZXJmYWNlLgotICogTmVjZXNzYXJpbHkgcGFzc2luZyBpbiBhIDxlbT5udWxsPC9lbT4gcHJvZ3Jlc3MgbW9uaXRvcgotICogYW5kIGlnbm9yaW5nIHRoZSByZXR1cm5lZCBzdGF0dXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2JDb21tYW5kQ29tbWFuZEFkYXB0ZXIKLQlpbXBsZW1lbnRzIENvbW1hbmQKLXsKLQlwcml2YXRlIGZpbmFsIEpvYkNvbW1hbmQgam9iQ29tbWFuZDsKLQotCi0JcHVibGljIEpvYkNvbW1hbmRDb21tYW5kQWRhcHRlcihKb2JDb21tYW5kIGpvYkNvbW1hbmQpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGpvYkNvbW1hbmQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5qb2JDb21tYW5kID0gam9iQ29tbWFuZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQl0aGlzLmpvYkNvbW1hbmQuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmpvYkNvbW1hbmQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvY29tbWFuZC9Kb2JDb21tYW5kSm9iLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2NvbW1hbmQvSm9iQ29tbWFuZEpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDMxOGUxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvY29tbWFuZC9Kb2JDb21tYW5kSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuY29tbWFuZC5Kb2JDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmQ7Ci0KLS8qKgotICogQSBqb2IgdGhhdCBleGVjdXRlcyBhIHtAbGluayBKb2JDb21tYW5kIGpvYiBjb21tYW5kfSBvcgotICoge0BsaW5rIENvbW1hbmQgY29tbWFuZH0uCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2JDb21tYW5kSm9iCi0JZXh0ZW5kcyBKb2IKLXsKLQlwcml2YXRlIGZpbmFsIEpvYkNvbW1hbmQgY29tbWFuZDsKLQotCi0JcHVibGljIEpvYkNvbW1hbmRKb2IoU3RyaW5nIG5hbWUsIENvbW1hbmQgY29tbWFuZCkgewotCQl0aGlzKG5hbWUsIG5ldyBDb21tYW5kSm9iQ29tbWFuZEFkYXB0ZXIoY29tbWFuZCkpOwotCX0KLQotCXB1YmxpYyBKb2JDb21tYW5kSm9iKFN0cmluZyBuYW1lLCBKb2JDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCWlmIChjb21tYW5kID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gdGhpcy5jb21tYW5kLmV4ZWN1dGUobW9uaXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9jb21tYW5kL05vdGlmeWluZ1JlcGVhdGluZ0pvYkNvbW1hbmRXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2NvbW1hbmQvTm90aWZ5aW5nUmVwZWF0aW5nSm9iQ29tbWFuZFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU0OWY2Yi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2NvbW1hbmQvTm90aWZ5aW5nUmVwZWF0aW5nSm9iQ29tbWFuZFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5jb21tYW5kLk5vdGlmeWluZ1JlcGVhdGluZ0pvYkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuY29tbWFuZC5Kb2JDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmNvbW1hbmQuSm9iQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5FeGNlcHRpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5MaXN0ZW5lckxpc3Q7Ci0KLS8qKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuY29tbWFuZC5Ob3RpZnlpbmdSZXBlYXRpbmdDb21tYW5kV3JhcHBlcgotICovCi1wdWJsaWMgY2xhc3MgTm90aWZ5aW5nUmVwZWF0aW5nSm9iQ29tbWFuZFdyYXBwZXIKLQlleHRlbmRzIFJlcGVhdGluZ0pvYkNvbW1hbmRXcmFwcGVyCi0JaW1wbGVtZW50cyBOb3RpZnlpbmdSZXBlYXRpbmdKb2JDb21tYW5kCi17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbm90aWZ5aW5nIHJlcGVhdGluZyBjb21tYW5kIHdyYXBwZXIgdGhhdCBleGVjdXRlcyB0aGUKLQkgKiBzcGVjaWZpZWQgY29tbWFuZC4gQW55IGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSBjb21tYW5kIG9yIGxpc3RlbmVyCi0JICogd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIGhhbmRsZXIuCi0JICovCi0JcHVibGljIE5vdGlmeWluZ1JlcGVhdGluZ0pvYkNvbW1hbmRXcmFwcGVyKEpvYkNvbW1hbmQgY29tbWFuZCwgRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyKSB7Ci0JCXN1cGVyKGNvbW1hbmQsIGV4Y2VwdGlvbkhhbmRsZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5vdGlmeWluZyByZXBlYXRpbmcgY29tbWFuZCB3cmFwcGVyIHRoYXQgZXhlY3V0ZXMgdGhlCi0JICogc3BlY2lmaWVkIGNvbW1hbmQgYW5kIHVzZXMgdGhlIHNwZWNpZmllZCBjb21tYW5kIGV4ZWN1dG9yIHRvIGV4ZWN1dGUgdGhlCi0JICogd3JhcHBlZCBjb21tYW5kIHdoZW5ldmVyIGl0IGlzIG5vdCBhbHJlYWR5IGV4ZWN1dGluZy4KLQkgKiBBbnkgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNvbW1hbmQgb3IgbGlzdGVuZXIgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZQotCSAqIHNwZWNpZmllZCBleGNlcHRpb24gaGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgTm90aWZ5aW5nUmVwZWF0aW5nSm9iQ29tbWFuZFdyYXBwZXIoSm9iQ29tbWFuZCBjb21tYW5kLCBKb2JDb21tYW5kRXhlY3V0b3Igc3RhcnRDb21tYW5kRXhlY3V0b3IsIEV4Y2VwdGlvbkhhbmRsZXIgZXhjZXB0aW9uSGFuZGxlcikgewotCQlzdXBlcihjb21tYW5kLCBzdGFydENvbW1hbmRFeGVjdXRvciwgZXhjZXB0aW9uSGFuZGxlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCS8qIHByaXZhdGUgcHJvdGVjdGVkICovIElTdGF0dXMgZXhlY3V0ZUNvbW1hbmQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gc3VwZXIuZXhlY3V0ZUNvbW1hbmQobW9uaXRvcik7Ci0JCWlmICh0aGlzLnN0YXRlLmlzUXVpZXNjZWQoKSkgewotCQkJLy8gaG1tbSAtIHdlIHdpbGwgbm90aWZ5IGxpc3RlbmVycyBldmVuIHdoZW4gd2UgYXJlICJzdG9wcGVkIjsgdGhhdCBzZWVtcyBPSy4uLgotCQkJdGhpcy5leGVjdXRpb25RdWllc2NlZChtb25pdG9yKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBvdXIgbGlzdGVuZXJzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRpb25RdWllc2NlZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZm9yIChMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQl0aGlzLm5vdGlmeUxpc3RlbmVyKGxpc3RlbmVyLCBtb25pdG9yKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZnlMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlsaXN0ZW5lci5leGVjdXRpb25RdWllc2NlZCh0aGlzLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IGV4OyAgLy8gc2VlbXMgcmVhc29uYWJsZS4uLgotCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLQkJCXRoaXMuZXhjZXB0aW9uSGFuZGxlci5oYW5kbGVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9jb21tYW5kL1JlcGVhdGluZ0pvYkNvbW1hbmRXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2NvbW1hbmQvUmVwZWF0aW5nSm9iQ29tbWFuZFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UzNGE0Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2NvbW1hbmQvUmVwZWF0aW5nSm9iQ29tbWFuZFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmNvbW1hbmQuSm9iQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5jb21tYW5kLkpvYkNvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5jb21tYW5kLlJlcGVhdGluZ0pvYkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkV4Y2VwdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0YWNrVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5jb21tYW5kLlJlcGVhdGluZ0NvbW1hbmRTdGF0ZTsKLQotLyoqCi0gKiBXcmFwIGEgcmVwZWF0aW5nIHtAbGluayBKb2JDb21tYW5kfS4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gVGhlIHtAbGluayBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzIG1vbml0b3J9IHBhc3NlZCB0bwotICogdGhlIGpvYiBjb21tYW5kIHdyYXBwZXIgaXMgPGVtPmlnbm9yZWQ8L2VtPi4gVGhlIHtAbGluayBJUHJvZ3Jlc3NNb25pdG9yCi0gKiBwcm9ncmVzcyBtb25pdG9yfSBwYXNzZWQgdG8gdGhlIDxlbT53cmFwcGVkPC9lbT4gam9iIGNvbW1hbmQgaXMgZGV0ZXJtaW5lZCBieQotICogdGhlIHtAbGluayAjc3RhcnRDb21tYW5kRXhlY3V0b3Igc3RhcnQgY29tbWFuZCBleGVjdXRvcn0uIFRoYXQgc2FtZQotICoge0BsaW5rIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvcn0gaXMgcGFzc2VkIHRvIHRoZSA8ZW0+d3JhcHBlZDwvZW0+Ci0gKiBqb2IgY29tbWFuZCBmb3IgZXZlcnkgZXhlY3V0aW9uIGR1cmluZyBhbiBleGVjdXRpb24gImN5Y2xlIi4gSXQgaXMKLSAqIDxlbT5ub3Q8L2VtPiByZXNldCB3aXRoIGVhY2ggZXhlY3V0aW9uOyBzbyBzZXZlcmFsCi0gKiBleGVjdXRpb25zIG1heSB0YWtlIHBsYWNlIGJlZm9yZSBhIG5ldyBwcm9ncmVzcyBtb25pdG9yIGlzIHBhc3NlZCB0byB0aGUKLSAqIGNvbW1hbmQuCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5jb21tYW5kLlJlcGVhdGluZ0NvbW1hbmRXcmFwcGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBlYXRpbmdKb2JDb21tYW5kV3JhcHBlcgotCWltcGxlbWVudHMgUmVwZWF0aW5nSm9iQ29tbWFuZAotewotCS8qKgotCSAqIFRoZSBjbGllbnQtc3VwcGxpZWQgY29tbWFuZCB0aGF0IHBlcmZvcm1zIHRoZSBleGVjdXRpb24uIEl0IG1heQotCSAqIHRyaWdnZXIgZnVydGhlciBjYWxscyB0byB7QGxpbmsgI2V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvcil9Ci0JICogKGkuZS4gdGhlIDxlbT53cmFwcGVkPC9lbT4KLQkgKiBjb21tYW5kJ3MgZXhlY3V0aW9uIG1heSByZWN1cnNlIGJhY2sgdG8gdGhlIGNsaWVudCBjb2RlIHRoYXQgZXhlY3V0ZXMgdGhlCi0JICogPGVtPndyYXBwZXI8L2VtPiBjb21tYW5kKS4KLQkgKi8KLQkvKiBDVSBwcml2YXRlICovIGZpbmFsIEpvYkNvbW1hbmQgY29tbWFuZDsKLQotCS8qKgotCSAqIFRoZSBjb21tYW5kIGV4ZWN1dGVkIHdoZW5ldmVyIHRoZSB3cmFwcGVkIHtAbGluayAjY29tbWFuZH0gbXVzdCBiZQotCSAqIGV4ZWN1dGVkIGFuZCBpdCBpcyBub3QgYWxyZWFkeSBleGVjdXRpbmcuIElmIHRoZSB3cmFwcGVkIHtAbGluayAjY29tbWFuZH0KLQkgKiBpcyBhbHJlYWR5IGV4ZWN1dGluZywgaXQgd2lsbCBzaW1wbHkgYmUgcmUtZXhlY3V0ZWQgZGlyZWN0bHkgKG9uY2UgaXQgaGFzCi0JICogY29tcGxldGVkIGl0cyBjdXJyZW50IGV4ZWN1dGlvbiksIGFzIG9wcG9zZWQgdG8gY2FsbGluZyB0aGUgc3RhcnQKLQkgKiBjb21tYW5kLgotCSAqLwotCXByaXZhdGUgZmluYWwgSm9iQ29tbWFuZCBzdGFydENvbW1hbmQ7Ci0KLQkvKioKLQkgKiBUaGUgY2xpZW50LXN1cHBsaWVkIGNvbW1hbmQgZXhlY3V0b3IgdGhhdCBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdGhlCi0JICoge0BsaW5rICNzdGFydENvbW1hbmQgc3RhcnQgY29tbWFuZH0uIEJ5IGRlZmF1bHQsIHRoZSBzdGFydCBjb21tYW5kIGlzCi0JICogZXhlY3V0ZWQgZGlyZWN0bHk7IGJ1dCB0aGlzIGV4ZWN1dG9yIHByb3ZpZGVzIGEgaG9vayBmb3IgZXhlY3V0aW5nIHRoZQotCSAqIHtAbGluayAjc3RhcnRDb21tYW5kIHN0YXJ0IGNvbW1hbmR9IGFzeW5jaHJvbm91c2x5OyBhZnRlciB3aGljaCwKLQkgKiBzdWJzZXF1ZW50IG92ZXJsYXBwaW5nIGV4ZWN1dGlvbnMgYXJlIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHkuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBKb2JDb21tYW5kRXhlY3V0b3Igc3RhcnRDb21tYW5kRXhlY3V0b3I7Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgdGhlIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSA8ZW0+d3JhcHBlZDwvZW0+IGNvbW1hbmQuCi0JICovCi0JZmluYWwgRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyOwotCi0JLyoqCi0JICogVGhlIGNvbW1hbmQgd3JhcHBlcidzIHN0YXRlLgotCSAqLwotCWZpbmFsIFJlcGVhdGluZ0NvbW1hbmRTdGF0ZSBzdGF0ZTsKLQotCS8qKgotCSAqIExpc3Qgb2Ygc3RhY2sgdHJhY2VzIGZvciBlYWNoIChyZXBlYXRpbmcpIGludm9jYXRpb24gb2YgdGhlIGNvbW1hbmQsCi0JICogc3RhcnRpbmcgd2l0aCB0aGUgaW5pdGlhbCBpbnZvY2F0aW9uLiBUaGUgbGlzdCBpcyBjbGVhcmVkIHdpdGggZWFjaAotCSAqIGluaXRpYWwgaW52b2NhdGlvbiBvZiB0aGUgY29tbWFuZC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxTdGFja1RyYWNlPiBzdGFja1RyYWNlcyA9IGRlYnVnKCkgPyBuZXcgQXJyYXlMaXN0PFN0YWNrVHJhY2U+KCkgOiBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWJ1ZygpIHsKLQkJcmV0dXJuIEpwdENvbW1vbkNvcmVQbHVnaW4uaW5zdGFuY2UoKS5pc0RlYnVnZ2luZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVwZWF0aW5nIGNvbW1hbmQgd3JhcHBlciB0aGF0IGV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQKLQkgKiBjb21tYW5kLiBBbnkgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNvbW1hbmQgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZQotCSAqIHNwZWNpZmllZCBleGNlcHRpb24gaGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgUmVwZWF0aW5nSm9iQ29tbWFuZFdyYXBwZXIoSm9iQ29tbWFuZCBjb21tYW5kLCBFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIpIHsKLQkJdGhpcyhjb21tYW5kLCBKb2JDb21tYW5kRXhlY3V0b3IuRGVmYXVsdC5pbnN0YW5jZSgpLCBleGNlcHRpb25IYW5kbGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZXBlYXRpbmcgY29tbWFuZCB3cmFwcGVyIHRoYXQgZXhlY3V0ZXMgdGhlIHNwZWNpZmllZAotCSAqIGNvbW1hbmQgYW5kIHVzZXMgdGhlIHNwZWNpZmllZCBjb21tYW5kIGV4ZWN1dG9yIHRvIGV4ZWN1dGUgdGhlIHdyYXBwZWQKLQkgKiBjb21tYW5kIHdoZW5ldmVyIGl0IGlzIG5vdCBhbHJlYWR5IGV4ZWN1dGluZy4KLQkgKiBBbnkgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNvbW1hbmQgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZQotCSAqIHNwZWNpZmllZCBleGNlcHRpb24gaGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgUmVwZWF0aW5nSm9iQ29tbWFuZFdyYXBwZXIoSm9iQ29tbWFuZCBjb21tYW5kLCBKb2JDb21tYW5kRXhlY3V0b3Igc3RhcnRDb21tYW5kRXhlY3V0b3IsIEV4Y2VwdGlvbkhhbmRsZXIgZXhjZXB0aW9uSGFuZGxlcikgewotCQlzdXBlcigpOwotCQlpZiAoKGNvbW1hbmQgPT0gbnVsbCkgfHwgKHN0YXJ0Q29tbWFuZEV4ZWN1dG9yID09IG51bGwpIHx8IChleGNlcHRpb25IYW5kbGVyID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmNvbW1hbmQgPSBjb21tYW5kOwotCQl0aGlzLnN0YXJ0Q29tbWFuZEV4ZWN1dG9yID0gc3RhcnRDb21tYW5kRXhlY3V0b3I7Ci0JCXRoaXMuc3RhcnRDb21tYW5kID0gdGhpcy5idWlsZFN0YXJ0Sm9iQ29tbWFuZCgpOwotCQl0aGlzLmV4Y2VwdGlvbkhhbmRsZXIgPSBleGNlcHRpb25IYW5kbGVyOwotCQl0aGlzLnN0YXRlID0gdGhpcy5idWlsZFN0YXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSBKb2JDb21tYW5kIGJ1aWxkU3RhcnRKb2JDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IFN0YXJ0Sm9iQ29tbWFuZCgpOwotCX0KLQotCXByaXZhdGUgUmVwZWF0aW5nQ29tbWFuZFN0YXRlIGJ1aWxkU3RhdGUoKSB7Ci0JCXJldHVybiBuZXcgUmVwZWF0aW5nQ29tbWFuZFN0YXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFJlcGVhdGluZ0pvYkNvbW1hbmQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCXRoaXMuc3RhdGUuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdCBpcyBwb3NzaWJsZSB0byBjb21lIGJhY2sgaGVyZSBpZiB0aGUgd3JhcHBlZCBjb21tYW5kIHJlY3Vyc2VzCi0JICogdG8gdGhlIGNsaWVudCBhbmQgdHJpZ2dlcnMgYW5vdGhlciBleGVjdXRpb24uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmICh0aGlzLnN0YXRlLmlzUmVhZHlUb1N0YXJ0RXhlY3V0aW9uQ3ljbGUoKSkgewotCQkJaWYgKGRlYnVnKCkpIHsKLQkJCQl0aGlzLnN0YWNrVHJhY2VzLmNsZWFyKCk7Ci0JCQkJdGhpcy5zdGFja1RyYWNlcy5hZGQobmV3IFN0YWNrVHJhY2UoKSk7Ci0JCQl9Ci0JCQl0aGlzLmV4ZWN1dGVTdGFydENvbW1hbmQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChkZWJ1ZygpKSB7Ci0JCQkJdGhpcy5zdGFja1RyYWNlcy5hZGQobmV3IFN0YWNrVHJhY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyogcHJpdmF0ZSBwcm90ZWN0ZWQgKi8gdm9pZCBleGVjdXRlU3RhcnRDb21tYW5kKCkgewotCQl0aGlzLnN0YXJ0Q29tbWFuZEV4ZWN1dG9yLmV4ZWN1dGUodGhpcy5zdGFydENvbW1hbmQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLnN0YXRlLnN0b3AoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3RhcnQgY29tbWFuZC4KLQkgKiBAc2VlICNzdGFydENvbW1hbmRFeGVjdXRvcgotCSAqLwotCS8qIENVIHByaXZhdGUgKi8gY2xhc3MgU3RhcnRKb2JDb21tYW5kCi0JCWltcGxlbWVudHMgSm9iQ29tbWFuZAotCXsKLQkJcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXJldHVybiBSZXBlYXRpbmdKb2JDb21tYW5kV3JhcHBlci50aGlzLmV4ZWN1dGVfKG1vbml0b3IpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgUmVwZWF0aW5nSm9iQ29tbWFuZFdyYXBwZXIudGhpcy5jb21tYW5kKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgZXhlY3V0aW9uIGN5Y2xlLgotCSAqIEFueSBmdXJ0aGVyIGNhbGxzIHRvIHtAbGluayAjZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yKX0gd2lsbAotCSAqIHNpbXBseSBzZXQgdGhlIHtAbGluayAjc3RhdGV9IHRvICJyZXBlYXQiLAotCSAqIGNhdXNpbmcgdGhlIGNvbW1hbmQgdG8gZXhlY3V0ZSBhZ2Fpbi4KLQkgKi8KLQkvKiBDVSBwcml2YXRlICovIElTdGF0dXMgZXhlY3V0ZV8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmICh0aGlzLnN0YXRlLndhc1N0b3BwZWRCZWZvcmVGaXJzdEV4ZWN1dGlvbkNvdWxkU3RhcnQoKSkgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQlkbyB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQobW9uaXRvcik7Ci0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5DQU5DRUwpIHsKLQkJCQlyZXR1cm4gc3RhdHVzOyAgLy8gc2VlbXMgcmVhc29uYWJsZS4uLgotCQkJfQotCQl9IHdoaWxlICh0aGlzLnN0YXRlLmlzUmVwZWF0KCkpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjbGllbnQtc3VwcGxpZWQgY29tbWFuZC4gRG8gbm90IGFsbG93IGFueSB1bmhhbmRsZWQKLQkgKiBleGNlcHRpb25zIHRvIGtpbGwgdGhlIHdyYXBwZXIuIFBhc3MgdG8gdGhlIGV4Y2VwdGlvbiBoYW5kbGVyLgotCSAqIEBzZWUgTm90aWZ5aW5nUmVwZWF0aW5nSm9iQ29tbWFuZFdyYXBwZXIKLQkgKi8KLQkvKiBwcml2YXRlIHByb3RlY3RlZCAqLyBJU3RhdHVzIGV4ZWN1dGVDb21tYW5kKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJcmV0dXJuIHRoaXMuY29tbWFuZC5leGVjdXRlKG1vbml0b3IpOwotCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOyAgLy8gc2VlbXMgcmVhc29uYWJsZS4uLgotCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLQkJCXRoaXMuZXhjZXB0aW9uSGFuZGxlci5oYW5kbGVFeGNlcHRpb24oZXgpOwotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmNvbW1hbmQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvY29tbWFuZC9TaW1wbGVKb2JDb21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvY29tbWFuZC9TaW1wbGVKb2JDb21tYW5kRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZjODU4Yi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2NvbW1hbmQvU2ltcGxlSm9iQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5jb21tYW5kLkNvbWJpbmVkRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuY29tbWFuZC5Kb2JDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRCb29sZWFuOwotCi0vKioKLSAqIEEgY29tbWFuZCBleGVjdXRvciB0aGF0IHNjaGVkdWxlcyBhIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2IKLSAqIGpvYn0gdG8gW2FzeW5jaHJvbm91c2x5XSBleGVjdXRlIGVhY2gge0BsaW5rIEpvYkNvbW1hbmQgam9iIGNvbW1hbmR9IG9yCi0gKiB7QGxpbmsgQ29tbWFuZCBjb21tYW5kfS4KLSAqIFN5bmNocm9ub3VzIGNvbW1hbmQgZXhlY3V0aW9ucyBhcmUgY29vcmRpbmF0ZWQgd2l0aCB0aGUgam9iIHZpYSBhCi0gKiB7QGxpbmsgTG9jYWxKb2JDaGFuZ2VMaXN0ZW5lciBqb2IgbGlzdGVuZXJ9LgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlSm9iQ29tbWFuZEV4ZWN1dG9yCi0JaW1wbGVtZW50cyBDb21iaW5lZEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yCi17Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVmYXVsdEpvYk5hbWU7Ci0JcHJpdmF0ZSBmaW5hbCBJU2NoZWR1bGluZ1J1bGUgZGVmYXVsdEpvYlNjaGVkdWxpbmdSdWxlOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBqb2IgY29tbWFuZCBleGVjdXRvciB3aXRoIG5vIGRlZmF1bHQgam9iIG5hbWUgYW5kIG5vCi0JICogZGVmYXVsdCBzY2hlZHVsaW5nIHJ1bGUuCi0JICovCi0JcHVibGljIFNpbXBsZUpvYkNvbW1hbmRFeGVjdXRvcigpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBqb2IgY29tbWFuZCBleGVjdXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCBqb2IgbmFtZSBhbmQKLQkgKiBubyBkZWZhdWx0IHNjaGVkdWxpbmcgcnVsZS4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlSm9iQ29tbWFuZEV4ZWN1dG9yKFN0cmluZyBkZWZhdWx0Sm9iTmFtZSkgewotCQl0aGlzKGRlZmF1bHRKb2JOYW1lLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBqb2IgY29tbWFuZCBleGVjdXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCBqb2IgbmFtZSBhbmQKLQkgKiBkZWZhdWx0IHNjaGVkdWxpbmcgcnVsZS4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlSm9iQ29tbWFuZEV4ZWN1dG9yKFN0cmluZyBkZWZhdWx0Sm9iTmFtZSwgSVNjaGVkdWxpbmdSdWxlIGRlZmF1bHRKb2JTY2hlZHVsaW5nUnVsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmRlZmF1bHRKb2JOYW1lID0gZGVmYXVsdEpvYk5hbWU7Ci0JCXRoaXMuZGVmYXVsdEpvYlNjaGVkdWxpbmdSdWxlID0gZGVmYXVsdEpvYlNjaGVkdWxpbmdSdWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXRoaXMuZXhlY3V0ZShuZXcgQ29tbWFuZEpvYkNvbW1hbmRBZGFwdGVyKGNvbW1hbmQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3YWl0VG9FeGVjdXRlKENvbW1hbmQgY29tbWFuZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VG9FeGVjdXRlKG5ldyBDb21tYW5kSm9iQ29tbWFuZEFkYXB0ZXIoY29tbWFuZCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHdhaXRUb0V4ZWN1dGUoQ29tbWFuZCBjb21tYW5kLCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRUb0V4ZWN1dGUobmV3IENvbW1hbmRKb2JDb21tYW5kQWRhcHRlcihjb21tYW5kKSwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogQXNzaWduIHRoZSByZXN1bHRpbmcge0BsaW5rIEpvYn0gdGhlIGRlZmF1bHQgbmFtZSBhbmQgc2NoZWR1bGluZyBydWxlLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXRoaXMuZXhlY3V0ZShjb21tYW5kLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBBc3NpZ24gdGhlIHJlc3VsdGluZyB7QGxpbmsgSm9ifSB0aGUgZGVmYXVsdCBzY2hlZHVsaW5nIHJ1bGUuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQsIFN0cmluZyBqb2JOYW1lKSB7Ci0JCXRoaXMuZXhlY3V0ZShjb21tYW5kLCBqb2JOYW1lLCB0aGlzLmRlZmF1bHRKb2JTY2hlZHVsaW5nUnVsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQsIFN0cmluZyBqb2JOYW1lLCBJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQl0aGlzLmV4ZWN1dGVfKGNvbW1hbmQsIHRoaXMuYnVpbGRKb2JOYW1lKGpvYk5hbWUsIGNvbW1hbmQpLCBydWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiB0aGUgam9iIG5hbWUgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVfKEpvYkNvbW1hbmQgY29tbWFuZCwgU3RyaW5nIGpvYk5hbWUsIElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0JCUpvYiBqb2IgPSBuZXcgSm9iQ29tbWFuZEpvYihqb2JOYW1lLCBjb21tYW5kKTsKLQkJam9iLnNldFJ1bGUocnVsZSk7Ci0JCWpvYi5zY2hlZHVsZSgpOwotCX0KLQotCS8qKgotCSAqIEFzc2lnbiB0aGUgcmVzdWx0aW5nIHtAbGluayBKb2J9IHRoZSBkZWZhdWx0IG5hbWUgYW5kIHNjaGVkdWxpbmcgcnVsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VG9FeGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VG9FeGVjdXRlKGNvbW1hbmQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEFzc2lnbiB0aGUgcmVzdWx0aW5nIHtAbGluayBKb2J9IHRoZSBkZWZhdWx0IG5hbWUgYW5kIHNjaGVkdWxpbmcgcnVsZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9FeGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VG9FeGVjdXRlKGNvbW1hbmQsIG51bGwsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIEFzc2lnbiB0aGUgcmVzdWx0aW5nIHtAbGluayBKb2J9IHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgdGhlIGRlZmF1bHQKLQkgKiBzY2hlZHVsaW5nIHJ1bGUuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFRvRXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQsIFN0cmluZyBqb2JOYW1lKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRUb0V4ZWN1dGUoY29tbWFuZCwgam9iTmFtZSwgdGhpcy5kZWZhdWx0Sm9iU2NoZWR1bGluZ1J1bGUpOwotCX0KLQotCS8qKgotCSAqIEFzc2lnbiB0aGUgcmVzdWx0aW5nIHtAbGluayBKb2J9IHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgdGhlIGRlZmF1bHQKLQkgKiBzY2hlZHVsaW5nIHJ1bGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvRXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQsIFN0cmluZyBqb2JOYW1lLCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRUb0V4ZWN1dGUoY29tbWFuZCwgam9iTmFtZSwgdGhpcy5kZWZhdWx0Sm9iU2NoZWR1bGluZ1J1bGUsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIEFzc2lnbiB0aGUgcmVzdWx0aW5nIHtAbGluayBKb2J9IHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgc2NoZWR1bGluZyBydWxlLgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRUb0V4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kLCBTdHJpbmcgam9iTmFtZSwgSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFRvRXhlY3V0ZV8oY29tbWFuZCwgdGhpcy5idWlsZEpvYk5hbWUoam9iTmFtZSwgY29tbWFuZCksIHJ1bGUsIDApOwotCX0KLQotCS8qKgotCSAqIEFzc2lnbiB0aGUgcmVzdWx0aW5nIHtAbGluayBKb2J9IHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgc2NoZWR1bGluZyBydWxlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb0V4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kLCBTdHJpbmcgam9iTmFtZSwgSVNjaGVkdWxpbmdSdWxlIHJ1bGUsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFRvRXhlY3V0ZV8oY29tbWFuZCwgdGhpcy5idWlsZEpvYk5hbWUoam9iTmFtZSwgY29tbWFuZCksIHJ1bGUsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHRoZSBqb2IgbmFtZSBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBTY2hlZHVsZSBhIGpvYiB0aGF0IHdpbGwgbm90aWZ5IHVzIHdoZW4gaXQgaXMgZmluaXNoZWQuCi0JICogVGhlIGN1cnJlbnQgdGhyZWFkIHdpbGwgc3VzcGVuZCB1bnRpbCB0aGUgam9iIGlzIGZpbmlzaGVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB3YWl0VG9FeGVjdXRlXyhKb2JDb21tYW5kIGNvbW1hbmQsIFN0cmluZyBqb2JOYW1lLCBJU2NoZWR1bGluZ1J1bGUgcnVsZSwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAoKHRpbWVvdXQgPT0gMEwpICYmIEpvYi5nZXRKb2JNYW5hZ2VyKCkuaXNTdXNwZW5kZWQoKSkgewotCQkJLy8gdGhlIGpvYiBtYW5hZ2VyIGlzIHN1c3BlbmRlZCBkdXJpbmcgd29ya2JlbmNoIHN0YXJ0LXVwOwotCQkJLy8gc28gdGhpcyBtZXRob2Qgd2lsbCBsb2NrIHVwIGFjY29yZGluZ2x5LCB3aGljaCBpcyBub3QgYSBHb29kIFRoaW5nCi0JCQkvLyBpZiBpdCBpcyBjYWxsZWQgZnJvbSB0aGUgRWNsaXBzZSBNYWluIHRocmVhZCBkdXJpbmcgc3RhcnQtdXAKLQkJCS8vIChpLmUuIGRlYWRsb2NrISkKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUpvYiBqb2IgPSBuZXcgSm9iQ29tbWFuZEpvYihqb2JOYW1lLCBjb21tYW5kKTsKLQkJTG9jYWxKb2JDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMb2NhbEpvYkNoYW5nZUxpc3RlbmVyKCk7Ci0JCWpvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWpvYi5zZXRSdWxlKHJ1bGUpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBsaXN0ZW5lci53YWl0VW50aWxEb25lKHRpbWVvdXQpOwotCQl9IGZpbmFsbHkgewotCQkJam9iLnJlbW92ZUpvYkNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkSm9iTmFtZShTdHJpbmcgam9iTmFtZSwgT2JqZWN0IGNvbW1hbmQpIHsKLQkJaWYgKGpvYk5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGpvYk5hbWU7Ci0JCX0KLQkJaWYgKHRoaXMuZGVmYXVsdEpvYk5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuZGVmYXVsdEpvYk5hbWU7Ci0JCX0KLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdDbGFzc05hbWUoY29tbWFuZC5nZXRDbGFzcygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9iIGxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgam9iIGxpc3RlbmVyIG5vdGlmaWVzIGFueSBpbnRlcmVzdGVkIHRocmVhZHMgd2hlbiB0aGUKLQkgKiB7QGxpbmsgSm9iIGpvYn0gaXMgZG9uZS4KLQkgKi8KLQkvKiBDVSBwcml2YXRlICovIGNsYXNzIExvY2FsSm9iQ2hhbmdlTGlzdGVuZXIKLQkJZXh0ZW5kcyBKb2JDaGFuZ2VBZGFwdGVyCi0JewotCQlwcml2YXRlIGZpbmFsIFN5bmNocm9uaXplZEJvb2xlYW4gZG9uZSA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKGZhbHNlKTsKLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyLmRvbmUoZXZlbnQpOwotCQkJdGhpcy5kb25lLnNldFRydWUoKTsKLQkJfQotCi0JCWJvb2xlYW4gd2FpdFVudGlsRG9uZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gdGhpcy5kb25lLndhaXRVbnRpbFRydWUodGltZW91dCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2NvbW1hbmQvU2luZ2xlVXNlUXVldWVpbmdFeHRlbmRlZEpvYkNvbW1hbmRFeGVjdXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9jb21tYW5kL1NpbmdsZVVzZVF1ZXVlaW5nRXh0ZW5kZWRKb2JDb21tYW5kRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk1N2UzZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2NvbW1hbmQvU2luZ2xlVXNlUXVldWVpbmdFeHRlbmRlZEpvYkNvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5jb21tYW5kLkNvbWJpbmVkRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuY29tbWFuZC5Kb2JDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuU3RhdGVmdWxFeHRlbmRlZENvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuY29tbWFuZC5TaW5nbGVVc2VRdWV1ZWluZ0V4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBleGVjdXRvciB3cmFwcyBhbmQgZXh0ZW5kcyBhIHtAbGluayBTaW5nbGVVc2VRdWV1ZWluZ0V4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yfSwKLSAqIGFkZGluZyBzdXBwb3J0IGZvciBleGVjdXRpbmcge0BsaW5rIEpvYkNvbW1hbmR9cy4KLSAqLwotcHVibGljIGNsYXNzIFNpbmdsZVVzZVF1ZXVlaW5nRXh0ZW5kZWRKb2JDb21tYW5kRXhlY3V0b3IKLQlleHRlbmRzIEFic3RyYWN0U2luZ2xlVXNlUXVldWVpbmdKb2JDb21tYW5kRXhlY3V0b3I8U2luZ2xlVXNlUXVldWVpbmdFeHRlbmRlZENvbW1hbmRFeGVjdXRvciwgU3RhdGVmdWxFeHRlbmRlZENvbW1hbmRFeGVjdXRvcj4KLQlpbXBsZW1lbnRzIENvbWJpbmVkRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IsIFN0YXRlZnVsRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IKLXsKLQlwdWJsaWMgU2luZ2xlVXNlUXVldWVpbmdFeHRlbmRlZEpvYkNvbW1hbmRFeGVjdXRvcigpIHsKLQkJdGhpcyhuZXcgU2luZ2xlVXNlUXVldWVpbmdFeHRlbmRlZENvbW1hbmRFeGVjdXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgU2luZ2xlVXNlUXVldWVpbmdFeHRlbmRlZEpvYkNvbW1hbmRFeGVjdXRvcihFeHRlbmRlZENvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IpIHsKLQkJdGhpcyhuZXcgU2luZ2xlVXNlUXVldWVpbmdFeHRlbmRlZENvbW1hbmRFeGVjdXRvcihjb21tYW5kRXhlY3V0b3IpKTsKLQl9Ci0KLQlwdWJsaWMgU2luZ2xlVXNlUXVldWVpbmdFeHRlbmRlZEpvYkNvbW1hbmRFeGVjdXRvcihTdGF0ZWZ1bEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvcikgewotCQl0aGlzKG5ldyBTaW5nbGVVc2VRdWV1ZWluZ0V4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yKGNvbW1hbmRFeGVjdXRvcikpOwotCX0KLQotCXB1YmxpYyBTaW5nbGVVc2VRdWV1ZWluZ0V4dGVuZGVkSm9iQ29tbWFuZEV4ZWN1dG9yKFNpbmdsZVVzZVF1ZXVlaW5nRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXN1cGVyKGNvbW1hbmRFeGVjdXRvcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBTaW5nbGVVc2VRdWV1ZWluZ0V4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yI3dhaXRUb0V4ZWN1dGUoQ29tbWFuZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VG9FeGVjdXRlKENvbW1hbmQgY29tbWFuZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy5jb21tYW5kRXhlY3V0b3Iud2FpdFRvRXhlY3V0ZShjb21tYW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFNpbmdsZVVzZVF1ZXVlaW5nRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3Ijd2FpdFRvRXhlY3V0ZShDb21tYW5kLCBsb25nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb0V4ZWN1dGUoQ29tbWFuZCBjb21tYW5kLCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNvbW1hbmRFeGVjdXRvci53YWl0VG9FeGVjdXRlKGNvbW1hbmQsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgU2luZ2xlVXNlUXVldWVpbmdFeHRlbmRlZENvbW1hbmRFeGVjdXRvciN3YWl0VG9FeGVjdXRlKENvbW1hbmQpCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFRvRXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29tbWFuZEV4ZWN1dG9yLndhaXRUb0V4ZWN1dGUobmV3IEpvYkNvbW1hbmRDb21tYW5kQWRhcHRlcihjb21tYW5kKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBTaW5nbGVVc2VRdWV1ZWluZ0V4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yI3dhaXRUb0V4ZWN1dGUoQ29tbWFuZCwgbG9uZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9FeGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jb21tYW5kRXhlY3V0b3Iud2FpdFRvRXhlY3V0ZShuZXcgSm9iQ29tbWFuZENvbW1hbmRBZGFwdGVyKGNvbW1hbmQpLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFNpbmdsZVVzZVF1ZXVlaW5nRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3Ijd2FpdFRvRXhlY3V0ZShDb21tYW5kKQotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRUb0V4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kLCBTdHJpbmcgam9iTmFtZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJLy8gaWdub3JlICdqb2JOYW1lJwotCQl0aGlzLmNvbW1hbmRFeGVjdXRvci53YWl0VG9FeGVjdXRlKG5ldyBKb2JDb21tYW5kQ29tbWFuZEFkYXB0ZXIoY29tbWFuZCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgU2luZ2xlVXNlUXVldWVpbmdFeHRlbmRlZENvbW1hbmRFeGVjdXRvciN3YWl0VG9FeGVjdXRlKENvbW1hbmQsIGxvbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvRXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQsIFN0cmluZyBqb2JOYW1lLCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCS8vIGlnbm9yZSAnam9iTmFtZScKLQkJcmV0dXJuIHRoaXMuY29tbWFuZEV4ZWN1dG9yLndhaXRUb0V4ZWN1dGUobmV3IEpvYkNvbW1hbmRDb21tYW5kQWRhcHRlcihjb21tYW5kKSwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBTaW5nbGVVc2VRdWV1ZWluZ0V4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yI3dhaXRUb0V4ZWN1dGUoQ29tbWFuZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VG9FeGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCwgU3RyaW5nIGpvYk5hbWUsIElTY2hlZHVsaW5nUnVsZSBydWxlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkvLyBpZ25vcmUgJ2pvYk5hbWUnIGFuZCAncnVsZScKLQkJdGhpcy5jb21tYW5kRXhlY3V0b3Iud2FpdFRvRXhlY3V0ZShuZXcgSm9iQ29tbWFuZENvbW1hbmRBZGFwdGVyKGNvbW1hbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFNpbmdsZVVzZVF1ZXVlaW5nRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3Ijd2FpdFRvRXhlY3V0ZShDb21tYW5kLCBsb25nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb0V4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kLCBTdHJpbmcgam9iTmFtZSwgSVNjaGVkdWxpbmdSdWxlIHJ1bGUsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJLy8gaWdub3JlICdqb2JOYW1lJyBhbmQgJ3J1bGUnCi0JCXJldHVybiB0aGlzLmNvbW1hbmRFeGVjdXRvci53YWl0VG9FeGVjdXRlKG5ldyBKb2JDb21tYW5kQ29tbWFuZEFkYXB0ZXIoY29tbWFuZCksIHRpbWVvdXQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvY29tbWFuZC9TaW5nbGVVc2VRdWV1ZWluZ0pvYkNvbW1hbmRFeGVjdXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9jb21tYW5kL1NpbmdsZVVzZVF1ZXVlaW5nSm9iQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMjVkZTYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9jb21tYW5kL1NpbmdsZVVzZVF1ZXVlaW5nSm9iQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5jb21tYW5kLkpvYkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLlN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5jb21tYW5kLlNpbmdsZVVzZVF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBleGVjdXRvciB3cmFwcyBhbmQgZXh0ZW5kcyBhIHtAbGluayBTaW5nbGVVc2VRdWV1ZWluZ0NvbW1hbmRFeGVjdXRvcn0sCi0gKiBhZGRpbmcgc3VwcG9ydCBmb3IgZXhlY3V0aW5nIHtAbGluayBKb2JDb21tYW5kfXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGVVc2VRdWV1ZWluZ0pvYkNvbW1hbmRFeGVjdXRvcgotCWV4dGVuZHMgQWJzdHJhY3RTaW5nbGVVc2VRdWV1ZWluZ0pvYkNvbW1hbmRFeGVjdXRvcjxTaW5nbGVVc2VRdWV1ZWluZ0NvbW1hbmRFeGVjdXRvciwgU3RhdGVmdWxDb21tYW5kRXhlY3V0b3I+Ci17Ci0JcHVibGljIFNpbmdsZVVzZVF1ZXVlaW5nSm9iQ29tbWFuZEV4ZWN1dG9yKCkgewotCQl0aGlzKG5ldyBTaW5nbGVVc2VRdWV1ZWluZ0NvbW1hbmRFeGVjdXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgU2luZ2xlVXNlUXVldWVpbmdKb2JDb21tYW5kRXhlY3V0b3IoQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvcikgewotCQl0aGlzKG5ldyBTaW5nbGVVc2VRdWV1ZWluZ0NvbW1hbmRFeGVjdXRvcihjb21tYW5kRXhlY3V0b3IpKTsKLQl9Ci0KLQlwdWJsaWMgU2luZ2xlVXNlUXVldWVpbmdKb2JDb21tYW5kRXhlY3V0b3IoU3RhdGVmdWxDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXRoaXMobmV3IFNpbmdsZVVzZVF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yKGNvbW1hbmRFeGVjdXRvcikpOwotCX0KLQotCXB1YmxpYyBTaW5nbGVVc2VRdWV1ZWluZ0pvYkNvbW1hbmRFeGVjdXRvcihTaW5nbGVVc2VRdWV1ZWluZ0NvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IpIHsKLQkJc3VwZXIoY29tbWFuZEV4ZWN1dG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BU1RUb29scy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQVNUVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FmZGY0Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BU1RUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVZhcmlhYmxlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlNpbXBsZVRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkphdmFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5NZXRob2RTaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZUphdmFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVNZXRob2RTaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBtZXRob2RzIGZvciBkZWFsaW5nIHdpdGggSkRUIEFTVHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBU1RUb29scyB7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbiBBU1Qgd2l0aG91dCBtZXRob2QgYm9kaWVzIGZvciB0aGUgc3BlY2lmaWVkIGNvbXBpbGF0aW9uIHVuaXQKLQkgKiB3aXRoIGl0cyBiaW5kaW5ncyByZXNvbHZlZCAoYW5kIHRoZSByZXN1bHRhbnQgcGVyZm9ybWFuY2UgaGl0KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBidWlsZEFTVFJvb3QoSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKLQkJQVNUUGFyc2VyIHBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOwotCQlwYXJzZXIuc2V0U291cmNlKGNvbXBpbGF0aW9uVW5pdCk7Ci0JCXBhcnNlci5zZXRJZ25vcmVNZXRob2RCb2RpZXModHJ1ZSk7ICAvLyB3ZSBkb24ndCBuZWVkIG1ldGhvZCBib2RpZXMKLQkJcGFyc2VyLnNldFJlc29sdmVCaW5kaW5ncyh0cnVlKTsKLQkJcGFyc2VyLnNldEJpbmRpbmdzUmVjb3ZlcnkodHJ1ZSk7ICAvLyBzZWUgYnVncyAxOTYyMDAsIDIyMjczNQotCQlyZXR1cm4gKENvbXBpbGF0aW9uVW5pdCkgcGFyc2VyLmNyZWF0ZUFTVChudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSkRUIERPTSAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlRW51bShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChleHByZXNzaW9uLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgQVNUTm9kZS5RVUFMSUZJRURfTkFNRToKLQkJCWNhc2UgQVNUTm9kZS5TSU1QTEVfTkFNRToKLQkJCQlyZXR1cm4gcmVzb2x2ZUVudW0oKE5hbWUpIGV4cHJlc3Npb24pOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVFbnVtKE5hbWUgZW51bUV4cHJlc3Npb24pIHsKLQkJSUJpbmRpbmcgYmluZGluZyA9IGVudW1FeHByZXNzaW9uLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWlmIChiaW5kaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOyAgLy8gVE9ETyBmaWd1cmUgb3V0IHdoeSB0aGlzIGlzIG51bGwgc29tZXRpbWVzCi0JCX0KLQkJaWYgKGJpbmRpbmcuZ2V0S2luZCgpICE9IElCaW5kaW5nLlZBUklBQkxFKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IChJVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nOwotCQlyZXR1cm4gdmFyaWFibGVCaW5kaW5nLmdldFR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkgKyAnLicgKyB2YXJpYWJsZUJpbmRpbmcuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbiBpcyBhIHR5cGUgbGl0ZXJhbCwgcmV0dXJuIHRoZSB0eXBlJ3MgZnVsbHktCi0JICogcXVhbGlmaWVkIG5hbWUuIFJldHVybiBudWxsIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlJVHlwZUJpbmRpbmcgcmVzb2x2ZWRUeXBlQmluZGluZyA9IHJlc29sdmVUeXBlQmluZGluZyhleHByZXNzaW9uKTsKLQkJcmV0dXJuIChyZXNvbHZlZFR5cGVCaW5kaW5nID09IG51bGwpID8gbnVsbCA6IHJlc29sdmVkVHlwZUJpbmRpbmcuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24gaXMgYW4gYXJyYXkgaW5pdGlhbGl6ZXIsIHJldHVybiBhbiBhbiBpdGVyYWJsZQotCSAqIG9uIHRoZSB0eXBlcycgZnVsbHkgcXVhbGZpZmllZCBuYW1lcy4gIAotCSAqIFRoZSByZXN1bHRzIG1heSBpbmNsdWRlIG51bGxzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmFibGU8U3RyaW5nPiByZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lcyhFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPElUeXBlQmluZGluZywgU3RyaW5nPihyZXNvbHZlVHlwZUJpbmRpbmdzKGV4cHJlc3Npb24pKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKElUeXBlQmluZGluZyBvKSB7Ci0JCQkJcmV0dXJuIChvID09IG51bGwpID8gbnVsbCA6IG8uZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24gaXMgYSB0eXBlIGxpdGVyYWwsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZwotCSAqIHR5cGUgYmluZGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElUeXBlQmluZGluZyByZXNvbHZlVHlwZUJpbmRpbmcoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCWlmIChleHByZXNzaW9uICE9IG51bGwgJiYgZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuVFlQRV9MSVRFUkFMKSB7Ci0JCQlyZXR1cm4gKChUeXBlTGl0ZXJhbCkgZXhwcmVzc2lvbikuZ2V0VHlwZSgpLnJlc29sdmVCaW5kaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbiBpcyBhbiBhcnJheSBpbml0aWFsaXplciwgcmV0dXJuIGFuIGl0ZXJhYmxlIG9mCi0JICogdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSBiaW5kaW5ncyBmb3IgZWFjaCBzdWItZXhwcmVzc2lvbi4KLQkgKiBUaGUgcmVzdWx0IG1heSBpbmNsdWRlIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmFibGU8SVR5cGVCaW5kaW5nPiByZXNvbHZlVHlwZUJpbmRpbmdzKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlyZXR1cm4gKGV4cHJlc3Npb24gIT0gbnVsbCAmJiBleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUikgPwotCQkJCXJlc29sdmVUeXBlQmluZGluZ3MoKEFycmF5SW5pdGlhbGl6ZXIpIGV4cHJlc3Npb24pIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxJVHlwZUJpbmRpbmc+aW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmFibGU8SVR5cGVCaW5kaW5nPiByZXNvbHZlVHlwZUJpbmRpbmdzKEFycmF5SW5pdGlhbGl6ZXIgYXJyYXlFeHByZXNzaW9uKSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYWJsZTxFeHByZXNzaW9uPiBleHByZXNzaW9ucyA9IGFycmF5RXhwcmVzc2lvbi5leHByZXNzaW9ucygpOwotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8RXhwcmVzc2lvbiwgSVR5cGVCaW5kaW5nPihleHByZXNzaW9ucykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSVR5cGVCaW5kaW5nIHRyYW5zZm9ybShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJCQlyZXR1cm4gcmVzb2x2ZVR5cGVCaW5kaW5nKGV4cHJlc3Npb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1ldGhvZFNpZ25hdHVyZSBidWlsZE1ldGhvZFNpZ25hdHVyZShNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotCQlyZXR1cm4gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgKLQkJCQltZXRob2REZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksCi0JCQkJYnVpbGRQYXJhbWV0ZXJUeXBlcyhtZXRob2REZWNsYXJhdGlvbikKLQkJCSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZVtdIGJ1aWxkUGFyYW1ldGVyVHlwZXMoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLQkJTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gcGFyYW1ldGVycyhtZXRob2REZWNsYXJhdGlvbik7Ci0JCWludCBsZW4gPSBwYXJhbWV0ZXJzLnNpemUoKTsKLQkJSmF2YVR5cGVbXSBwYXJhbWV0ZXJUeXBlcyA9IG5ldyBKYXZhVHlwZVtsZW5dOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlJVHlwZUJpbmRpbmcgdHlwZSA9IHBhcmFtZXRlcnMuZ2V0KGkpLmdldFR5cGUoKS5yZXNvbHZlQmluZGluZygpOwotCQkJcGFyYW1ldGVyVHlwZXNbaV0gPSBTaW1wbGVKYXZhVHlwZS5idWlsZFNpbXBsZUphdmFUeXBlKHR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpLCB0eXBlLmdldERpbWVuc2lvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIHBhcmFtZXRlclR5cGVzOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIG1ldGhvZERlY2xhcmF0aW9uLnBhcmFtZXRlcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24gaXMgYSB0eXBlIGxpdGVyYWwgYW5kIHRoZSB0eXBlIGJpbmRpbmcKLQkgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgdHlwZSBuYW1lIGV4aXN0cyBpbiB0aGUgdHlwZQotCSAqIGxpdGVyYWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkgKHN1cGVyY2xhc3NlcyBhbmQgaW50ZXJmYWNlcykuCi0JICogUmV0dXJuIG51bGwgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0eXBlSXNTdWJUeXBlT2YoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgc2VhcmNoVHlwZU5hbWUpIHsKLQkJcmV0dXJuIGZpbmRUeXBlSW5IaWVyYXJjaHkoZXhwcmVzc2lvbiwgc2VhcmNoVHlwZU5hbWUpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHNwZWNpZmllZCBleHByZXNzaW9uIGlzIGEgdHlwZSBsaXRlcmFsLCByZXR1cm4gdGhlIHR5cGUgYmluZGluZwotCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0eXBlIG5hbWUgaWYgaXQgZXhpc3RzIGluIHRoZSB0eXBlCi0JICogbGl0ZXJhbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeSAoc3VwZXJjbGFzc2VzIGFuZCBpbnRlcmZhY2VzKS4KLQkgKiBSZXR1cm4gbnVsbCBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJVHlwZUJpbmRpbmcgZmluZFR5cGVJbkhpZXJhcmNoeShFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBzZWFyY2hUeXBlTmFtZSkgewotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSByZXNvbHZlVHlwZUJpbmRpbmcoZXhwcmVzc2lvbik7Ci0JCXJldHVybiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgPyBudWxsIDogZmluZFR5cGVJbkhpZXJhcmNoeSh0eXBlQmluZGluZywgc2VhcmNoVHlwZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGEgdHlwZSBiaW5kaW5nIHdpdGggdGhlIHNwZWNpZmllZCB0eXBlIG5hbWUgZXhpc3RzIGluCi0JICogdGhlIHNwZWNpZmllZCB0eXBlIGJpbmRpbmcncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkgKHN1cGVyY2xhc3NlcwotCSAqIGFuZCBpbnRlcmZhY2VzKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHlwZUlzU3ViVHlwZU9mKElUeXBlQmluZGluZyB0eXBlQmluZGluZywgU3RyaW5nIHNlYXJjaFR5cGVOYW1lKSB7Ci0JCXJldHVybiBmaW5kVHlwZUluSGllcmFyY2h5KHR5cGVCaW5kaW5nLCBzZWFyY2hUeXBlTmFtZSkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUgYmluZGluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgdHlwZSBuYW1lIGlmIGl0Ci0JICogZXhpc3RzIGluIHRoZSBzcGVjaWZpZWQgdHlwZSBiaW5kaW5nJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5IChzdXBlcmNsYXNzZXMKLQkgKiBhbmQgaW50ZXJmYWNlcykuIFJldHVybiBudWxsIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElUeXBlQmluZGluZyBmaW5kVHlwZUluSGllcmFyY2h5KElUeXBlQmluZGluZyB0eXBlQmluZGluZywgU3RyaW5nIHNlYXJjaFR5cGVOYW1lKSB7Ci0JCXJldHVybiBmaW5kVHlwZUluSGllcmFyY2h5KHR5cGVCaW5kaW5nLCBzZWFyY2hUeXBlTmFtZSwgbmV3IEhhc2hTZXQ8U3RyaW5nPigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJVHlwZUJpbmRpbmcgZmluZFR5cGVJbkhpZXJhcmNoeShJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcsIFN0cmluZyBzZWFyY2hUeXBlTmFtZSwgSGFzaFNldDxTdHJpbmc+IHZpc2l0ZWQpIHsKLQkJU3RyaW5nIHR5cGVOYW1lID0gdHlwZUJpbmRpbmcuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQlpZiAodmlzaXRlZC5jb250YWlucyh0eXBlTmFtZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICh0eXBlTmFtZS5lcXVhbHMoc2VhcmNoVHlwZU5hbWUpKSB7Ci0JCQlyZXR1cm4gdHlwZUJpbmRpbmc7Ci0JCX0KLQkJdmlzaXRlZC5hZGQodHlwZU5hbWUpOwotCQkKLQkJSVR5cGVCaW5kaW5nIGludGVyZmFjZUJpbmRpbmcgPSBmaW5kVHlwZUluSW50ZXJmYWNlcyh0eXBlQmluZGluZywgc2VhcmNoVHlwZU5hbWUsIHZpc2l0ZWQpOwotCQlpZiAoaW50ZXJmYWNlQmluZGluZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaW50ZXJmYWNlQmluZGluZzsKLQkJfQotCQkKLQkJcmV0dXJuIGZpbmRUeXBlSW5TdXBlcmNsYXNzZXModHlwZUJpbmRpbmcsIHNlYXJjaFR5cGVOYW1lLCB2aXNpdGVkKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJVHlwZUJpbmRpbmcgZmluZFR5cGVJbkludGVyZmFjZXMoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLCBTdHJpbmcgc2VhcmNoVHlwZU5hbWUsIEhhc2hTZXQ8U3RyaW5nPiB2aXNpdGVkKSB7Ci0JCUlUeXBlQmluZGluZ1tdIGludGVyZmFjZUJpbmRpbmdzID0gdHlwZUJpbmRpbmcuZ2V0SW50ZXJmYWNlcygpOwotCQlmb3IgKElUeXBlQmluZGluZyBpbnRlcmZhY2VCaW5kaW5nIDogaW50ZXJmYWNlQmluZGluZ3MpIHsgIC8vIHJlY3Vyc2UgdXAgaW50ZXJmYWNlcwotCQkJSVR5cGVCaW5kaW5nIHJlc3VsdCA9IGZpbmRUeXBlSW5IaWVyYXJjaHkoaW50ZXJmYWNlQmluZGluZywgc2VhcmNoVHlwZU5hbWUsIHZpc2l0ZWQpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0gCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElUeXBlQmluZGluZyBmaW5kVHlwZUluU3VwZXJjbGFzc2VzKElUeXBlQmluZGluZyB0eXBlQmluZGluZywgU3RyaW5nIHNlYXJjaFR5cGVOYW1lLCBIYXNoU2V0PFN0cmluZz4gdmlzaXRlZCkgewotCQlJVHlwZUJpbmRpbmcgc3VwZXJCaW5kaW5nID0gdHlwZUJpbmRpbmcuZ2V0U3VwZXJjbGFzcygpOwotCQlpZiAoc3VwZXJCaW5kaW5nICE9IG51bGwpIHsgIC8vIHJlY3Vyc2UgdXAgc3VwZXJjbGFzc2VzCi0JCQlJVHlwZUJpbmRpbmcgcmVzdWx0ID0gZmluZFR5cGVJbkhpZXJhcmNoeShzdXBlckJpbmRpbmcsIHNlYXJjaFR5cGVOYW1lLCB2aXNpdGVkKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQkKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBleHByZXNzaW9uIGlzIGEgdHlwZSBsaXRlcmFsIGFuZCB0aGUgdHlwZSBiaW5kaW5nCi0JICogY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGludGVyZmFjZSBuYW1lIGV4aXN0cyBpbiB0aGUgdHlwZQotCSAqIGxpdGVyYWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkgKHN1cGVyY2xhc3NlcyBhbmQgaW50ZXJmYWNlcykuCi0JICogUmV0dXJuIG51bGwgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0eXBlSW1wbGVtZW50c0ludGVyZmFjZShFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBzZWFyY2hJbnRlcmZhY2VOYW1lKSB7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHJlc29sdmVUeXBlQmluZGluZyhleHByZXNzaW9uKTsKLQkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZmluZEludGVyZmFjZUluSGllcmFyY2h5KHR5cGVCaW5kaW5nLCBzZWFyY2hJbnRlcmZhY2VOYW1lKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGEgdHlwZSBiaW5kaW5nIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlcmZhY2UgbmFtZSBleGlzdHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIHR5cGUgYmluZGluZydzIGluaGVyaXRhbmNlIGhpZXJhcmNoeSAoc3VwZXJjbGFzc2VzCi0JICogYW5kIGludGVyZmFjZXMpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0eXBlSW1wbGVtZW50c0ludGVyZmFjZShJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcsIFN0cmluZyBzZWFyY2hJbnRlcmZhY2VOYW1lKSB7Ci0JCXJldHVybiBmaW5kSW50ZXJmYWNlSW5IaWVyYXJjaHkodHlwZUJpbmRpbmcsIHNlYXJjaEludGVyZmFjZU5hbWUpICE9IG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElUeXBlQmluZGluZyBmaW5kSW50ZXJmYWNlSW5IaWVyYXJjaHkoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLCBTdHJpbmcgc2VhcmNoSW50ZXJmYWNlTmFtZSkgewotCQlIYXNoU2V0PFN0cmluZz4gdmlzaXRlZCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJSVR5cGVCaW5kaW5nIGludGVyZmFjZUJpbmRpbmcgPSBmaW5kVHlwZUluSW50ZXJmYWNlcyh0eXBlQmluZGluZywgc2VhcmNoSW50ZXJmYWNlTmFtZSwgdmlzaXRlZCk7Ci0JCWlmIChpbnRlcmZhY2VCaW5kaW5nICE9IG51bGwpIHsKLQkJCXJldHVybiBpbnRlcmZhY2VCaW5kaW5nOwotCQl9Ci0JCQotCQlyZXR1cm4gZmluZFR5cGVJblN1cGVyY2xhc3Nlcyh0eXBlQmluZGluZywgc2VhcmNoSW50ZXJmYWNlTmFtZSwgdmlzaXRlZCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgdGV4dCByYW5nZSBmb3IgdGhlIHNwZWNpZmllZCBBU1Qgbm9kZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHRSYW5nZSBidWlsZFRleHRSYW5nZShBU1ROb2RlIGFzdE5vZGUpIHsKLQkJcmV0dXJuIGJ1aWxkVGV4dFJhbmdlKGFzdE5vZGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSB0ZXh0IHJhbmdlIGZvciB0aGUgc3BlY2lmaWVkIEFTVCBub2RlIGlmIGl0IGRpZmZlcnMKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgdGV4dCByYW5nZSBvciB0aGUgc3BlY2lmaWVkIHRleHQgcmFuZ2UgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhlIEFTVCBub2RlIGFscmVhZHkgbWF0Y2hlcyB0aGUKLQkgKiBzcGVjaWZpZWQgdGV4dCByYW5nZSwgc2ltcGx5IHJldHVybiB0aGUgdGV4dCByYW5nZSB1bmNoYW5nZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0UmFuZ2UgYnVpbGRUZXh0UmFuZ2UoQVNUTm9kZSBhc3ROb2RlLCBUZXh0UmFuZ2UgdGV4dFJhbmdlKSB7Ci0JCWludCBvZmZzZXQgPSBhc3ROb2RlLmdldFN0YXJ0UG9zaXRpb24oKTsKLQkJaW50IGxlbmd0aCA9IGFzdE5vZGUuZ2V0TGVuZ3RoKCk7Ci0JCWludCBsaW5lTnVtYmVyID0gKChDb21waWxhdGlvblVuaXQpIGFzdE5vZGUuZ2V0Um9vdCgpKS5nZXRMaW5lTnVtYmVyKG9mZnNldCk7Ci0JCXJldHVybiAodGV4dFJhbmdlID09IG51bGwpID8KLQkJCQluZXcgU2ltcGxlVGV4dFJhbmdlKG9mZnNldCwgbGVuZ3RoLCBsaW5lTnVtYmVyKSA6Ci0JCQkJdGV4dFJhbmdlLmJ1aWxkVGV4dFJhbmdlKG9mZnNldCwgbGVuZ3RoLCBsaW5lTnVtYmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BYnN0cmFjdEFubm90YXRpb25BZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BYnN0cmFjdEFubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMzMzMjIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3RBbm5vdGF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEFkYXB0IGFuIGFubm90YXRlZCBlbGVtZW50IGFuZCBhIGRlY2xhcmF0aW9uIGFubm90YXRpb24gYWRhcHRlci4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QW5ub3RhdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBBbm5vdGF0aW9uQWRhcHRlciB7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQ7Ci0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgQWJzdHJhY3RBbm5vdGF0aW9uQWRhcHRlcihBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYW5ub3RhdGVkRWxlbWVudCA9IGFubm90YXRlZEVsZW1lbnQ7Ci0JCXRoaXMuZGFhID0gZGFhOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBbm5vdGF0aW9uQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmRhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRNb2RpZmllZERlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBuZXdNYXJrZXJBbm5vdGF0aW9uKCkgewotCQl0aGlzLmVkaXQodGhpcy5idWlsZE5ld01hcmtlckFubm90YXRpb25FZGl0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5lZGl0KHRoaXMuYnVpbGROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRWRpdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5ld05vcm1hbEFubm90YXRpb24oKSB7Ci0JCXRoaXMuZWRpdCh0aGlzLmJ1aWxkTmV3Tm9ybWFsQW5ub3RhdGlvbkVkaXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKCkgewotCQl0aGlzLmVkaXQodGhpcy5idWlsZFJlbW92ZUFubm90YXRpb25FZGl0b3IoKSk7Ci0JfQotCi0JcHVibGljIEFTVE5vZGUgZ2V0QXN0Tm9kZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5kYWEuZ2V0QXN0Tm9kZSh0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbihhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kYWEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGVkaXQoQW5ub3RhdGVkRWxlbWVudC5FZGl0b3IgZWRpdG9yKSB7Ci0JCXRoaXMuYW5ub3RhdGVkRWxlbWVudC5lZGl0KGVkaXRvcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY3RvcnkgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQW5ub3RhdGVkRWxlbWVudC5FZGl0b3IgYnVpbGROZXdNYXJrZXJBbm5vdGF0aW9uRWRpdG9yKCkgewotCQlyZXR1cm4gbmV3IE5ld01hcmtlckFubm90YXRpb25FZGl0b3IodGhpcy5kYWEpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0ZWRFbGVtZW50LkVkaXRvciBidWlsZE5ld1NpbmdsZU1lbWJlckFubm90YXRpb25FZGl0b3IoKSB7Ci0JCXJldHVybiBuZXcgTmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbkVkaXRvcih0aGlzLmRhYSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRlZEVsZW1lbnQuRWRpdG9yIGJ1aWxkTmV3Tm9ybWFsQW5ub3RhdGlvbkVkaXRvcigpIHsKLQkJcmV0dXJuIG5ldyBOZXdOb3JtYWxBbm5vdGF0aW9uRWRpdG9yKHRoaXMuZGFhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGVkRWxlbWVudC5FZGl0b3IgYnVpbGRSZW1vdmVBbm5vdGF0aW9uRWRpdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlbW92ZUFubm90YXRpb25FZGl0b3IodGhpcy5kYWEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE5ld01hcmtlckFubm90YXRpb25FZGl0b3IgaW1wbGVtZW50cyBBbm5vdGF0ZWRFbGVtZW50LkVkaXRvciB7Ci0JCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWE7Ci0KLQkJTmV3TWFya2VyQW5ub3RhdGlvbkVkaXRvcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZGFhID0gZGFhOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJdGhpcy5kYWEubmV3TWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBOZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRWRpdG9yIGltcGxlbWVudHMgQW5ub3RhdGVkRWxlbWVudC5FZGl0b3IgewotCQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhOwotCi0JCU5ld1NpbmdsZU1lbWJlckFubm90YXRpb25FZGl0b3IoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRhYSA9IGRhYTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCXRoaXMuZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTmV3Tm9ybWFsQW5ub3RhdGlvbkVkaXRvciBpbXBsZW1lbnRzIEFubm90YXRlZEVsZW1lbnQuRWRpdG9yIHsKLQkJcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTsKLQotCQlOZXdOb3JtYWxBbm5vdGF0aW9uRWRpdG9yKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kYWEgPSBkYWE7Ci0JCX0KLQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQl0aGlzLmRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFJlbW92ZUFubm90YXRpb25FZGl0b3IgaW1wbGVtZW50cyBBbm5vdGF0ZWRFbGVtZW50LkVkaXRvciB7Ci0JCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWE7Ci0KLQkJUmVtb3ZlQW5ub3RhdGlvbkVkaXRvcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZGFhID0gZGFhOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJdGhpcy5kYWEucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3REZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BYnN0cmFjdERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxYzRlZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BYnN0cmFjdERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uTmFtZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFic3RyYWN0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hbm5vdGF0aW9uTmFtZSA9IGFubm90YXRpb25OYW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBNYXJrZXJBbm5vdGF0aW9uIG5ld01hcmtlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlNYXJrZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLm5ld01hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0QXN0KCkpOwotCQl0aGlzLmFkZEFubm90YXRpb25BbmRJbXBvcnQoZGVjbGFyYXRpb24sIGFubm90YXRpb24pOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBuZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldEFzdCgpKTsKLQkJdGhpcy5hZGRBbm5vdGF0aW9uQW5kSW1wb3J0KGRlY2xhcmF0aW9uLCBhbm5vdGF0aW9uKTsKLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCi0JcHVibGljIE5vcm1hbEFubm90YXRpb24gbmV3Tm9ybWFsQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXRBc3QoKSk7Ci0JCXRoaXMuYWRkQW5ub3RhdGlvbkFuZEltcG9ydChkZWNsYXJhdGlvbiwgYW5ub3RhdGlvbik7Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgYXBwcm9wcmlhdGUgaW1wb3J0IHN0YXRlbWVudCwgdGhlbiBzaG9ydGVuIHRoZSBhbm5vdGF0aW9uJ3MKLQkgKiBuYW1lIGJlZm9yZSBhZGRpbmcgaXQgdG8gdGhlIGRlY2xhcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFubm90YXRpb25BbmRJbXBvcnQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCWFubm90YXRpb24uc2V0VHlwZU5hbWUoZGVjbGFyYXRpb24uZ2V0QXN0KCkubmV3TmFtZSh0aGlzLmdldFNvdXJjZUNvZGVBbm5vdGF0aW9uTmFtZShkZWNsYXJhdGlvbikpKTsKLQkJdGhpcy5hZGRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBhbm5vdGF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFubm90YXRpb24ncyBuYW1lIGFzIGl0IGNhbiBiZSB1c2VkIGluIHNvdXJjZSBjb2RlOwotCSAqIGkuZS4gaWYgd2UgY2FuIGFkZCBpdCB0byB0aGUgY29tcGlsYXRpb24gdW5pdCdzIGltcG9ydHMsIHJldHVybiB0aGUgc2hvcnQKLQkgKiBuYW1lOyBpZiB3ZSBjYW4ndCAoYmVjYXVzZSBvZiBhIGNvbGxpc2lvbiksIHJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUuCi0JICogTkI6IGFuIGltcG9ydCBtYXkgYmUgYWRkZWQgYXMgYSBzaWRlLWVmZmVjdCA6LSgKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNvdXJjZUNvZGVBbm5vdGF0aW9uTmFtZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi5hZGRJbXBvcnQodGhpcy5hbm5vdGF0aW9uTmFtZSkgPyB0aGlzLmdldFNob3J0QW5ub3RhdGlvbk5hbWUoKSA6IHRoaXMuYW5ub3RhdGlvbk5hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5hbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiB0byB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLAotCSAqIHJlcGxhY2luZyB0aGUgb3JpZ2luYWwgYW5ub3RhdGlvbiBpZiBwcmVzZW50LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZEFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKTsKLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGlzICdwdWJsaWMnIGJlY2F1c2Ugd2UgdXNlIGl0IGluIENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIKLQkgKiB0byBnZXQgdGhlIGFubm90YXRpb24gbmFtZSBmcm9tIGEgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbk5hbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGhlbHBlciBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBib29sZWFuIG5hbWVNYXRjaGVzKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlyZXR1cm4gdGhpcy5uYW1lTWF0Y2hlcyhkZWNsYXJhdGlvbiwgYW5ub3RhdGlvbiwgdGhpcy5hbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbmFtZU1hdGNoZXMoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uYW5ub3RhdGlvbklzTmFtZWQoYW5ub3RhdGlvbiwgbmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcmtlckFubm90YXRpb24gbmV3TWFya2VyQW5ub3RhdGlvbihBU1QgYXN0KSB7Ci0JCXJldHVybiB0aGlzLm5ld01hcmtlckFubm90YXRpb24oYXN0LCB0aGlzLmFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFya2VyQW5ub3RhdGlvbiBuZXdNYXJrZXJBbm5vdGF0aW9uKEFTVCBhc3QsIFN0cmluZyBuYW1lKSB7Ci0JCU1hcmtlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFzdC5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCWFubm90YXRpb24uc2V0VHlwZU5hbWUoYXN0Lm5ld05hbWUobmFtZSkpOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBuZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKEFTVCBhc3QpIHsKLQkJcmV0dXJuIHRoaXMubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihhc3QsIHRoaXMuYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oQVNUIGFzdCwgU3RyaW5nIG5hbWUpIHsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYXN0Lm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oKTsKLQkJYW5ub3RhdGlvbi5zZXRUeXBlTmFtZShhc3QubmV3TmFtZShuYW1lKSk7Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQotCXByb3RlY3RlZCBOb3JtYWxBbm5vdGF0aW9uIG5ld05vcm1hbEFubm90YXRpb24oQVNUIGFzdCkgewotCQlyZXR1cm4gdGhpcy5uZXdOb3JtYWxBbm5vdGF0aW9uKGFzdCwgdGhpcy5hbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIE5vcm1hbEFubm90YXRpb24gbmV3Tm9ybWFsQW5ub3RhdGlvbihBU1QgYXN0LCBTdHJpbmcgbmFtZSkgewotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhc3QubmV3Tm9ybWFsQW5ub3RhdGlvbigpOwotCQlhbm5vdGF0aW9uLnNldFR5cGVOYW1lKGFzdC5uZXdOYW1lKG5hbWUpKTsKLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTaG9ydEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gY29udmVydFRvU2hvcnROYW1lKHRoaXMuYW5ub3RhdGlvbk5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TaG9ydE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHZhbHVlcyhOb3JtYWxBbm5vdGF0aW9uIG5hKSB7Ci0JCXJldHVybiBuYS52YWx1ZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZDRkMWQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEdhdGhlciB0b2dldGhlciB0aGUgY29tbW9uIGltcGxlbWVudGF0aW9uIGJlaGF2aW9yLgotICogCi0gKiBXZSdyZSBzdGlsbCBmaWd1cmluZyBvdXQgSmF2YSBHZW5lcmljcyBoZXJlLi4uLiBUaGUgbWV0aG9kcyBpbiB0aGlzIGFic3RyYWN0Ci0gKiBjbGFzcyB3b3JrIGZpbmUgd2l0aCBhbnkgc3ViY2xhc3Mgb2YgRXhwcmVzc2lvbiBFOyBidXQgYSBDbGFzc0Nhc3RFeGNlcHRpb24KLSAqIHdpbGwgb2NjdXIgYXMgc29vbiBhcyB3ZSBjYWxsIGFueSBtZXRob2QgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcwotICogKGUuZy4gU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcikgdGhhdCBleHBlY3RzIGEgcGFydGljdWxhciBzdWJjbGFzcyBvZgotICogRXhwcmVzc2lvbiAoZS5nLiBTdHJpbmdMaXRlcmFsKS4KLSAqIAotICogQHBhcmFtIDxUPiB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZCB0byBhbmQgZnJvbSBhbiBleHByZXNzaW9uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXI8VD4KLQlpbXBsZW1lbnRzIEV4cHJlc3Npb25Db252ZXJ0ZXI8VD4KLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvYmplY3QgLT4gZXhwcmVzc2lvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgRXhwcmVzc2lvbiBjb252ZXJ0KFQgb2JqZWN0LCBBU1QgYXN0KSB7Ci0JCXJldHVybiAob2JqZWN0ID09IG51bGwpID8gdGhpcy5jb252ZXJ0TnVsbChhc3QpIDogdGhpcy5jb252ZXJ0T2JqZWN0KG9iamVjdCwgYXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGV4cHJlc3Npb24gZm9yIGEgPGNvZGU+bnVsbDwvY29kZT4gb2JqZWN0LgotCSAqIEJ5IGRlZmF1bHQsIGEgPGNvZGU+bnVsbDwvY29kZT4gb2JqZWN0IHdpbGwKLQkgKiBiZSBjb252ZXJ0ZWQgaW50byBhIDxjb2RlPm51bGw8L2NvZGU+IGV4cHJlc3Npb24uCi0JICovCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gY29udmVydE51bGwoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEFTVCBhc3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBvYmplY3QgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzZWUgI2NvbnZlcnQoT2JqZWN0LCBBU1QpCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEV4cHJlc3Npb24gY29udmVydE9iamVjdChUIG9iamVjdCwgQVNUIGFzdCk7Ci0KLQotCS8vICoqKioqKioqKiogZXhwcmVzc2lvbiAtPiBvYmplY3QgKioqKioqKioqKgotCi0JcHVibGljIFQgY29udmVydChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJcmV0dXJuIChleHByZXNzaW9uID09IG51bGwpID8gdGhpcy5jb252ZXJ0TnVsbCgpIDogdGhpcy5jb252ZXJ0RXhwcmVzc2lvbihleHByZXNzaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCBmb3IgYSA8Y29kZT5udWxsPC9jb2RlPiBleHByZXNzaW9uLgotCSAqIEJ5IGRlZmF1bHQsIGEgPGNvZGU+bnVsbDwvY29kZT4gZXhwcmVzc2lvbiB3aWxsCi0JICogYmUgY29udmVydGVkIGludG8gYSA8Y29kZT5udWxsPC9jb2RlPiBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIFQgY29udmVydE51bGwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbiBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNlZSAjY29udmVydChFeHByZXNzaW9uKQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBUIGNvbnZlcnRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbik7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BYnN0cmFjdEpEVFR5cGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0SkRUVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTI2NGY3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0SkRUVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb2R5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZEV4ZWN1dG9yOwotCi0vKioKLSAqIEFkYXB0IGFuZCBleHRlbmQgYSBKRFQgYWJzdHJhY3QgdHlwZS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SkRUVHlwZQotCWV4dGVuZHMgSkRUTWVtYmVyCi0JaW1wbGVtZW50cyBBYnN0cmFjdFR5cGUKLXsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCdzIHByaW1hcnkgdHlwZQotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEpEVFR5cGUoCi0JCQlBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcikgewotCQl0aGlzKHR5cGVEZWNsYXJhdGlvbiwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCdzIHByaW1hcnkgdHlwZQotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEpEVFR5cGUoCi0JCQlBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwKLQkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKSB7Ci0JCXRoaXMobnVsbCwgdHlwZURlY2xhcmF0aW9uLCAxLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcik7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIG5lc3RlZCB0eXBlcwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEpEVFR5cGUoCi0JCQlUeXBlIGRlY2xhcmluZ1R5cGUsCi0JCQlBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXRoaXMoZGVjbGFyaW5nVHlwZSwgdHlwZURlY2xhcmF0aW9uLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIG5lc3RlZCB0eXBlcwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEpEVFR5cGUoCi0JCQlUeXBlIGRlY2xhcmluZ1R5cGUsCi0JCQlBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLAotCQkJQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpIHsKLQkJc3VwZXIoZGVjbGFyaW5nVHlwZSwgdHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpOwotCX0KLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciB0ZXN0aW5nCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0SkRUVHlwZShUeXBlIGRlY2xhcmluZ1R5cGUsIFN0cmluZyBuYW1lLCBpbnQgb2NjdXJyZW5jZSwgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKLQkJc3VwZXIoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBDb21tYW5kRXhlY3V0b3IuRGVmYXVsdC5pbnN0YW5jZSgpLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFR5cGUgZ2V0RGVjbGFyaW5nVHlwZSgpIHsKLQkJcmV0dXJuIChUeXBlKSBzdXBlci5nZXREZWNsYXJpbmdUeXBlKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBNZW1iZXIvVHlwZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JcHVibGljIElUeXBlQmluZGluZyBnZXRCaW5kaW5nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHRkID0gdGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JCXJldHVybiAodGQgPT0gbnVsbCkgPyBudWxsIDogdGQucmVzb2x2ZUJpbmRpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBmaW5kIHRoZSB0eXBlJ3MgYm9keSBkZWNsYXJhdGlvbiBpbiB0aGUgc3BlY2lmaWVkIEFTVAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBnZXRCb2R5RGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVHlwZSBkZWNsYXJpbmdUeXBlID0gdGhpcy5nZXREZWNsYXJpbmdUeXBlKCk7Ci0JCWlmIChkZWNsYXJpbmdUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLmdldFRvcExldmVsVHlwZURlY2xhcmF0aW9uKGFzdFJvb3QpOwotCQl9Ci0JCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBkZWNsYXJpbmdUeXBlLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KTsKLQkJLy8gdGhlIHR5cGUgZGVjbGFyYXRpb24gY2FuIGJlIG51bGwgd2hlbiB0aGUgc291cmNlIGlzIGNvbXBsZXRlbHkgaG9zZWQKLQkJcmV0dXJuICh0eXBlRGVjbGFyYXRpb24gPT0gbnVsbCkgPyBudWxsIDogdGhpcy5nZXROZXN0ZWRUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gYm9keURlY2xhcmF0aW9uID0gdGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JCS8vIHRoZSBkZWNsYXJhdGlvbiBjYW4gYmUgbnVsbCBpZiB0aGUgcmVzb3VyY2UgaXMgb3V0IG9mIHN5bmMgd2l0aCB0aGUgZmlsZSBzeXN0ZW0KLQkJcmV0dXJuIChib2R5RGVjbGFyYXRpb24pID09IG51bGwgPyBudWxsIDogQVNUVG9vbHMuYnVpbGRUZXh0UmFuZ2UoYm9keURlY2xhcmF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsICoqKioqKioqKioKLQotCS8qKgotCSAqIHJldHVybiB0aGUgZmlyc3QgdG9wLWxldmVsIHR5cGUgaW4gdGhlIHNwZWNpZmllZCBBU1Qgd2l0aCBhIG1hdGNoaW5nIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gZ2V0VG9wTGV2ZWxUeXBlRGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZURlY2xhcmF0aW9uKHR5cGVzKGFzdFJvb3QpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gZ2V0VHlwZURlY2xhcmF0aW9uKExpc3Q8QWJzdHJhY3RUeXBlRGVjbGFyYXRpb24+IHR5cGVEZWNsYXJhdGlvbnMpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbnMudG9BcnJheShuZXcgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb25bdHlwZURlY2xhcmF0aW9ucy5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXN0ZWQgdHlwZSBkZWNsYXJhdGlvbiB3aXRoIG1hdGNoaW5nIG5hbWUgYW5kIG9jY3VycmVuY2Ugd2l0aGluIHRoZSBkZWNsYXJpbmcgdHlwZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBnZXROZXN0ZWRUeXBlRGVjbGFyYXRpb24oVHlwZURlY2xhcmF0aW9uIGRlY2xhcmluZ1R5cGVEZWNsYXJhdGlvbik7Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIHR5cGUgZGVjbGFyYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSBmcm9tIHRoZSBzcGVjaWZpZWQKLQkgKiBzZXQgb2YgdHlwZSBkZWNsYXJhdGlvbnMgKG1hdGNoIG5hbWUgYW5kIG9jY3VycmVuY2UpLgotCSAqIE9ubHkgcmV0dXJuIHR5cGUgb3IgZW51bSBkZWNsYXJhdGlvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gZ2V0VHlwZURlY2xhcmF0aW9uKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uW10gdHlwZURlY2xhcmF0aW9ucykgewotCQlTdHJpbmcgbmFtZSA9IHRoaXMuZ2V0TmFtZSgpOwotCQlpbnQgb2NjdXJyZW5jZSA9IHRoaXMuZ2V0T2NjdXJyZW5jZSgpOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA6IHR5cGVEZWNsYXJhdGlvbnMpIHsKLQkJCWlmICh0eXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCWNvdW50Kys7Ci0JCQkJaWYgKGNvdW50ID09IG9jY3VycmVuY2UpIHsKLQkJCQkJcmV0dXJuICh0eXBlRGVjbGFyYXRpb24uZ2V0Tm9kZVR5cGUoKSA9PSB0aGlzLmdldEFTVE5vZGVUeXBlKCkpID8gdHlwZURlY2xhcmF0aW9uIDogbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gcmV0dXJuIG51bGwgaWYgdGhlIHR5cGUgaXMgbm8gbG9uZ2VyIGluIHRoZSBzb3VyY2UgY29kZTsKLQkJLy8gdGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIGNvbnRleHQgbW9kZWwgaGFzIG5vdCB5ZXQKLQkJLy8gYmVlbiBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgcmVzb3VyY2UgbW9kZWwgYnV0IGlzIHN0aWxsCi0JCS8vIGFza2luZyBmb3IgYW4gQVNUTm9kZSAoZS5nLiBkdXJpbmcgYSBzZWxlY3Rpb24gZXZlbnQpCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0QVNUTm9kZVR5cGUoKTsKLQotCS8qKgotCSAqIHdlIG9ubHkgaW5zdGFudGlhdGUgYSBzaW5nbGUgdG9wLWxldmVsLCBub24tYW5ub3RhdGlvbgotCSAqIHR5cGUgcGVyIGNvbXBpbGF0aW9uIHVuaXQgKGkuZS4gYSBjbGFzcywgZW51bSwgb3IgaW50ZXJmYWNlKQotCSAqLwotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIExpc3Q8QWJzdHJhY3RUeXBlRGVjbGFyYXRpb24+IHR5cGVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBhc3RSb290LnR5cGVzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBFbnVtRGVjbGFyYXRpb25bXSBnZXRFbnVtcyhUeXBlRGVjbGFyYXRpb24gZGVjbGFyaW5nVHlwZURlY2xhcmF0aW9uKSB7Ci0JCUxpc3Q8Qm9keURlY2xhcmF0aW9uPiBiZCA9IGJvZHlEZWNsYXJhdGlvbnMoZGVjbGFyaW5nVHlwZURlY2xhcmF0aW9uKTsKLQkJaW50IHR5cGVDb3VudCA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8Qm9keURlY2xhcmF0aW9uPiBpdCA9IGJkLmxpc3RJdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJaWYgKGl0Lm5leHQoKS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRU5VTV9ERUNMQVJBVElPTikgewotCQkJCXR5cGVDb3VudCsrOwotCQkJfQotCQl9Ci0JCUVudW1EZWNsYXJhdGlvbltdIG1lbWJlckVudW1zID0gbmV3IEVudW1EZWNsYXJhdGlvblt0eXBlQ291bnRdOwotCQlpbnQgbmV4dCA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8Qm9keURlY2xhcmF0aW9uPiBpdCA9IGJkLmxpc3RJdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJQm9keURlY2xhcmF0aW9uIGRlY2wgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoZGVjbC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRU5VTV9ERUNMQVJBVElPTikgewotCQkJCW1lbWJlckVudW1zW25leHQrK10gPSAoRW51bURlY2xhcmF0aW9uKSBkZWNsOwotCQkJfQotCQl9Ci0JCXJldHVybiBtZW1iZXJFbnVtczsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIExpc3Q8Qm9keURlY2xhcmF0aW9uPiBib2R5RGVjbGFyYXRpb25zKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbi5ib2R5RGVjbGFyYXRpb25zKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3ROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BYnN0cmFjdE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUxMmY3MS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BYnN0cmFjdE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci0KLS8qKgotICogUHVsbCB0b2dldGhlciBzb21lIG9mIHRoZSBiZWhhdmlvciBjb21tb24gdG8KLSAqIHtAbGluayBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyfQotICogYW5kIHtAbGluayBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcn0KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgotCWV4dGVuZHMgQWJzdHJhY3REZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIG91dGVyQW5ub3RhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWU7Ci0KLQkvLyByZWR1Y2UgTkxTIGNoZWNrcwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBlbGVtZW50IG5hbWUgaXMgPGNvZGU+dmFsdWU8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBvdXRlckFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJdGhpcyhvdXRlckFubm90YXRpb25BZGFwdGVyLCBWQUxVRSwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBBYnN0cmFjdE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBvdXRlckFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlzdXBlcihhbm5vdGF0aW9uTmFtZSk7Ci0JCXRoaXMub3V0ZXJBbm5vdGF0aW9uQWRhcHRlciA9IG91dGVyQW5ub3RhdGlvbkFkYXB0ZXI7Ci0JCXRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJQW5ub3RhdGlvbiBvdXRlciA9IHRoaXMub3V0ZXJBbm5vdGF0aW9uQWRhcHRlci5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJaWYgKG91dGVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUV4cHJlc3Npb24gdmFsdWUgPSB0aGlzLmVsZW1lbnRWYWx1ZShvdXRlcik7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlBbm5vdGF0aW9uIGlubmVyID0gdGhpcy5nZXRBbm5vdGF0aW9uKHZhbHVlKTsKLQkJaWYgKGlubmVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCS8vIHJldHVybiB0aGUgYW5ub3RhdGlvbiBvbmx5IGlmIGl0IGhhcyBhIG1hdGNoaW5nIG5hbWUoPykKLQkJcmV0dXJuIHRoaXMubmFtZU1hdGNoZXMoZGVjbGFyYXRpb24sIGlubmVyKSA/IGlubmVyIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJQW5ub3RhdGlvbiBvdXRlciA9IHRoaXMub3V0ZXJBbm5vdGF0aW9uQWRhcHRlci5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJaWYgKG91dGVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlFeHByZXNzaW9uIHZhbHVlID0gdGhpcy5lbGVtZW50VmFsdWUob3V0ZXIpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIGhhY2sgdG8gYWxsb3cgc2hvcnQtY2lyY3VpdCB3aGVuIHRoZSB2YWx1ZSBpcyBhbiBhcnJheSBpbml0aWFsaXplcgotCQlpZiAodGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBvdXRlciwgdmFsdWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQW5ub3RhdGlvbiBpbm5lciA9IHRoaXMuYW5ub3RhdGlvblZhbHVlKHZhbHVlKTsKLQkJaWYgKGlubmVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyByZW1vdmUgdGhlIGFubm90YXRpb24gb25seSBpZiBpdCBoYXMgYSBtYXRjaGluZyBuYW1lKD8pCi0JCWlmICh0aGlzLm5hbWVNYXRjaGVzKGRlY2xhcmF0aW9uLCBpbm5lcikpIHsKLQkJCXRoaXMucmVtb3ZlRWxlbWVudEFuZE5vcm1hbGl6ZShkZWNsYXJhdGlvbiwgb3V0ZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIEFTVE5vZGUgZ2V0QXN0Tm9kZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCS8vIGlmIHRoZSBhbm5vdGF0aW9uIGlzIG1pc3NpbmcsIHJldHVybiB0aGUgb3V0ZXIgYW5ub3RhdGlvbidzIG5vZGUKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uICE9IG51bGwpID8gYW5ub3RhdGlvbiA6IHRoaXMub3V0ZXJBbm5vdGF0aW9uQWRhcHRlci5nZXRBc3ROb2RlKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gaW5uZXIpIHsKLQkJQW5ub3RhdGlvbiBvdXRlciA9IHRoaXMub3V0ZXJBbm5vdGF0aW9uQWRhcHRlci5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJaWYgKG91dGVyID09IG51bGwpIHsKLQkJCXRoaXMuYnVpbGROZXdPdXRlckFubm90YXRpb24oZGVjbGFyYXRpb24sIGlubmVyKTsKLQkJfSBlbHNlIGlmIChvdXRlci5pc01hcmtlckFubm90YXRpb24oKSkgewotCQkJdGhpcy5tb2RpZnlBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCAoTWFya2VyQW5ub3RhdGlvbikgb3V0ZXIsIGlubmVyKTsKLQkJfSBlbHNlIGlmIChvdXRlci5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSkgewotCQkJdGhpcy5tb2RpZnlBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgb3V0ZXIsIGlubmVyKTsKLQkJfSBlbHNlIGlmIChvdXRlci5pc05vcm1hbEFubm90YXRpb24oKSkgewotCQkJdGhpcy5tb2RpZnlBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCAoTm9ybWFsQW5ub3RhdGlvbikgb3V0ZXIsIGlubmVyKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVua25vd24gYW5ub3RhdGlvbiB0eXBlOiAiICsgb3V0ZXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWJzdHJhY3QgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYW5ub3RhdGlvbiBleHRyYWN0ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24sCi0JICogd2hpY2ggaXMgdGhlIHZhbHVlIG9mIHRoZSBhZGFwdGVyJ3MgZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKEV4cHJlc3Npb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGZyb20gdGhlIHNwZWNpZmllZCBleHByZXNzaW9uLAotCSAqIHdoaWNoIGlzIHRoZSB2YWx1ZSBvZiB0aGUgYWRhcHRlcidzIGVsZW1lbnQuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHJlbW92YWwgd2FzIHN1Y2Nlc3NmdWwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gcmVtb3ZlQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBBbm5vdGF0aW9uIG91dGVyLCBFeHByZXNzaW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBvdXRlciBhbm5vdGF0aW9uIHRvIHRoZQotCSAqIHNwZWNpZmllZCBpbm5lciBhbm5vdGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG1vZGlmeUFubm90YXRpb25WYWx1ZShTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG91dGVyLCBBbm5vdGF0aW9uIGlubmVyKTsKLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBtZW1iZXIgdmFsdWUgcGFpciB0byB0aGUKLQkgKiBzcGVjaWZpZWQgaW5uZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBtb2RpZnlNZW1iZXJWYWx1ZVBhaXIoTWVtYmVyVmFsdWVQYWlyIHBhaXIsIEFubm90YXRpb24gaW5uZXIpOwotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGdldE91dGVyQW5ub3RhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudE5hbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgdGhlIHNwZWNpZmllZCBleHByZXNzaW9uIGlzIGFuIGFubm90YXRpb24sIGNhc3QgaXQgdG8gYW4gYW5ub3RhdGlvbjsKLQkgKiBvdGhlcndpc2UgcmV0dXJuIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIEFubm90YXRpb24gYW5ub3RhdGlvblZhbHVlKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlzd2l0Y2ggKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBBU1ROb2RlLk5PUk1BTF9BTk5PVEFUSU9OOgotCQkJY2FzZSBBU1ROb2RlLlNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTjoKLQkJCWNhc2UgQVNUTm9kZS5NQVJLRVJfQU5OT1RBVElPTjoKLQkJCQlyZXR1cm4gKEFubm90YXRpb24pIGV4cHJlc3Npb247Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSA8ZW0+Zmlyc3Q8L2VtPiBhbm5vdGF0aW9uIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiwgY29udmVydGluZyB0aGUgYW5ub3RhdGlvbiBhcyBhcHByb3ByaWF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbGVtZW50QW5kTm9ybWFsaXplKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gb3V0ZXIpIHsKLQkJaWYgKG91dGVyLmlzTm9ybWFsQW5ub3RhdGlvbigpKSB7Ci0JCQl0aGlzLnJlbW92ZUVsZW1lbnRBbmROb3JtYWxpemUoZGVjbGFyYXRpb24sIChOb3JtYWxBbm5vdGF0aW9uKSBvdXRlcik7Ci0JCX0gZWxzZSBpZiAob3V0ZXIuaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpIHsKLQkJCXRoaXMucmVtb3ZlRWxlbWVudEFuZE5vcm1hbGl6ZShkZWNsYXJhdGlvbiwgKFNpbmdsZU1lbWJlckFubm90YXRpb24pIG91dGVyKTsKLQkJfSBlbHNlIGlmIChvdXRlci5pc01hcmtlckFubm90YXRpb24oKSkgewotCQkJdGhpcy5yZW1vdmVFbGVtZW50QW5kTm9ybWFsaXplKGRlY2xhcmF0aW9uLCAoTWFya2VyQW5ub3RhdGlvbikgb3V0ZXIpOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBhbm5vdGF0aW9uIHR5cGU6ICIgKyBvdXRlcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgPGVtPmZpcnN0PC9lbT4gYW5ub3RhdGlvbiBlbGVtZW50IHdpdGggdGhlIGFkYXB0ZXIncyBlbGVtZW50Ci0JICogbmFtZSBmcm9tIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbi4gQ29udmVydCB0aGUgYW5ub3RhdGlvbiB0bwotCSAqIGEgbWFya2VyIGFubm90YXRpb24gb3Igc2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uIGlmIGFwcHJvcHJpYXRlLgotCSAqIDxwcmU+Ci0JICogJiM2NDtPdXRlcihuYW1lPSJGcmVkIiwgZm9vPSYjNjQ7SW5uZXIpID0+ICYjNjQ7T3V0ZXIobmFtZT0iRnJlZCIpCi0JICogJiM2NDtPdXRlcihmb289JiM2NDtJbm5lcikgPT4gJiM2NDtPdXRlcgotCSAqIDwvcHJlPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUVsZW1lbnRBbmROb3JtYWxpemUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgTm9ybWFsQW5ub3RhdGlvbiBvdXRlcikgewotCQl0aGlzLnJlbW92ZUVsZW1lbnQob3V0ZXIpOwotCQl0aGlzLm5vcm1hbGl6ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIG91dGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gdGhlIGVsZW1lbnQgd2l0aAotCSAqIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCBuYW1lLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUVsZW1lbnQoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCWZvciAoSXRlcmF0b3I8TWVtYmVyVmFsdWVQYWlyPiBzdHJlYW0gPSB0aGlzLnZhbHVlcyhhbm5vdGF0aW9uKS5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU1lbWJlclZhbHVlUGFpciBwYWlyID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChwYWlyLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHModGhpcy5lbGVtZW50TmFtZSkpIHsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgbm9ybWFsIGFubm90YXRpb24gdG8gYSBtYXJrZXIgYW5ub3RhdGlvbiBvcgotCSAqIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbiBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3JtYWxpemVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIE5vcm1hbEFubm90YXRpb24gb3V0ZXIpIHsKLQkJTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHZhbHVlcyA9IHRoaXMudmFsdWVzKG91dGVyKTsKLQkJc3dpdGNoICh2YWx1ZXMuc2l6ZSgpKSB7Ci0JCQljYXNlIDA6Ci0JCQkJLy8gaWYgdGhlIGVsZW1lbnRzIGFyZSBhbGwgZ29uZSwgY29udmVydCB0aGUgYW5ub3RhdGlvbiB0byBhIG1hcmtlciBhbm5vdGF0aW9uCi0JCQkJdGhpcy5vdXRlckFubm90YXRpb25BZGFwdGVyLm5ld01hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCU1lbWJlclZhbHVlUGFpciBwYWlyID0gdmFsdWVzLmdldCgwKTsKLQkJCQlpZiAocGFpci5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKFZBTFVFKSkgewotCQkJCQkvLyBpZiB0aGUgbGFzdCByZW1haW5pbmcgZWxlbWVudCBpcyAndmFsdWUnLCBjb252ZXJ0IHRoZSBhbm5vdGF0aW9uIHRvIGEgc2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uCi0JCQkJCUV4cHJlc3Npb24gdnYgPSBwYWlyLmdldFZhbHVlKCk7Ci0JCQkJCXZ2ID0gKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodnYuZ2V0QVNUKCksIHZ2KTsKLQkJCQkJdGhpcy5vdXRlckFubm90YXRpb25BZGFwdGVyLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pLnNldFZhbHVlKHZ2KTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24gdG8gYSBtYXJrZXIgYW5ub3RhdGlvbgotCSAqIGlmIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCBuYW1lIGlzIDxjb2RlPnZhbHVlPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbGVtZW50QW5kTm9ybWFsaXplKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG91dGVyKSB7Ci0JCWlmICh0aGlzLmVsZW1lbnROYW1lLmVxdWFscyhWQUxVRSkpIHsKLQkJCXRoaXMub3V0ZXJBbm5vdGF0aW9uQWRhcHRlci5uZXdNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUVsZW1lbnRBbmROb3JtYWxpemUoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBNYXJrZXJBbm5vdGF0aW9uIG91dGVyKSB7Ci0JCS8vIE5PUAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlICpmaXJzdCogYW5ub3RhdGlvbiBlbGVtZW50Ci0JICogd2l0aCB0aGUgYWRhcHRlcidzIGVsZW1lbnQgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgYW5ub3RhdGlvbiBoYXMgbm8gc3VjaCBlbGVtZW50LgotCSAqIChBbiBlbGVtZW50IG5hbWUgb2YgInZhbHVlIiB3aWxsIHJldHVybiB0aGUgdmFsdWUgb2YgYSBzaW5nbGUKLQkgKiBtZW1iZXIgYW5ub3RhdGlvbi4pCi0JICovCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gZWxlbWVudFZhbHVlKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlpZiAoYW5ub3RhdGlvbi5pc05vcm1hbEFubm90YXRpb24oKSkgewotCQkJcmV0dXJuIHRoaXMuZWxlbWVudFZhbHVlKChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKTsKLQkJfQotCQlpZiAoYW5ub3RhdGlvbi5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSkgewotCQkJcmV0dXJuIHRoaXMuZWxlbWVudFZhbHVlKChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBlbGVtZW50VmFsdWUoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCU1lbWJlclZhbHVlUGFpciBwYWlyID0gdGhpcy5tZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbik7Ci0JCXJldHVybiAocGFpciA9PSBudWxsKSA/IG51bGwgOiBwYWlyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGFkYXB0ZXIncyBlbGVtZW50IG5hbWUgaXMgInZhbHVlIiwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUKLQkgKiBhbm5vdGF0aW9uLCBvdGhlcndpc2UgcmV0dXJuIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gZWxlbWVudFZhbHVlKFNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50TmFtZS5lcXVhbHMoVkFMVUUpID8gYW5ub3RhdGlvbi5nZXRWYWx1ZSgpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICpmaXJzdCogbWVtYmVyIHZhbHVlIHBhaXIgZm9yIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCBuYW1lLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiBoYXMgbm8gc3VjaCBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlmb3IgKE1lbWJlclZhbHVlUGFpciBwYWlyIDogdGhpcy52YWx1ZXMoYW5ub3RhdGlvbikpIHsKLQkJCWlmIChwYWlyLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHModGhpcy5lbGVtZW50TmFtZSkpIHsKLQkJCQlyZXR1cm4gcGFpcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIG5ldyBvdXRlciBhbm5vdGF0aW9uIGFuZCBhZGQgdGhlIHNwZWNpZmllZAotCSAqIGlubmVyIGFubm90YXRpb24gdG8gaXQ6Ci0JICogPHByZT4KLQkgKiAgICAgJiM2NDtPdXRlcigmIzY0O0lubmVyKQotCSAqIDwvcHJlPgotCSAqIG9yCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtPdXRlcihmb289JiM2NDtJbm5lcikKLQkgKiA8L3ByZT4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZE5ld091dGVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBBbm5vdGF0aW9uIGlubmVyKSB7Ci0JCWlmICh0aGlzLmVsZW1lbnROYW1lLmVxdWFscyhWQUxVRSkpIHsKLQkJCXRoaXMub3V0ZXJBbm5vdGF0aW9uQWRhcHRlci5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKS5zZXRWYWx1ZSh0aGlzLmJ1aWxkTmV3SW5uZXJFeHByZXNzaW9uKGlubmVyKSk7Ci0JCX0gZWxzZSB7Ci0JCQlMaXN0PE1lbWJlclZhbHVlUGFpcj4gdmFsdWVzID0gdGhpcy52YWx1ZXModGhpcy5vdXRlckFubm90YXRpb25BZGFwdGVyLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pKTsKLQkJCXZhbHVlcy5hZGQodGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIodGhpcy5idWlsZE5ld0lubmVyRXhwcmVzc2lvbihpbm5lcikpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGFuIGV4cHJlc3Npb24gdG8gYmUgYWRkZWQgdG8gYSBuZXcgb3V0ZXIgYW5ub3RhdGlvbgotCSAqIGZvciB0aGUgc3BlY2lmaWVkIGlubmVyIGFubm90YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEV4cHJlc3Npb24gYnVpbGROZXdJbm5lckV4cHJlc3Npb24oQW5ub3RhdGlvbiBpbm5lcik7Ci0KLQkvKioKLQkgKiBCdWlsZCBhIG5ldyBtZW1iZXIgdmFsdWUgcGFpciB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIE1lbWJlclZhbHVlUGFpciBuZXdNZW1iZXJWYWx1ZVBhaXIoU3RyaW5nIG5hbWUsIEV4cHJlc3Npb24gdmFsdWUpIHsKLQkJQVNUIGFzdCA9IHZhbHVlLmdldEFTVCgpOwotCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IGFzdC5uZXdNZW1iZXJWYWx1ZVBhaXIoKTsKLQkJcGFpci5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKG5hbWUpKTsKLQkJcGFpci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCXJldHVybiBwYWlyOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgbmV3IG1lbWJlciB2YWx1ZSBwYWlyIHdpdGggdGhlIGFkYXB0ZXIncyBlbGVtZW50IG5hbWUKLQkgKiBhbmQgdGhlIHNwZWNpZmllZCBpbm5lciBhbm5vdGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBNZW1iZXJWYWx1ZVBhaXIgbmV3TWVtYmVyVmFsdWVQYWlyKEV4cHJlc3Npb24gdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKHRoaXMuZWxlbWVudE5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpbm5lciBhbm5vdGF0aW9uIHRvIHRoZSBtYXJrZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtb2RpZnlBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBNYXJrZXJBbm5vdGF0aW9uIG91dGVyLCBBbm5vdGF0aW9uIGlubmVyKSB7Ci0JCXRoaXMuYnVpbGROZXdPdXRlckFubm90YXRpb24oZGVjbGFyYXRpb24sIGlubmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpbm5lciBhbm5vdGF0aW9uIHRvIHRoZSBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbW9kaWZ5QW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG91dGVyLCBBbm5vdGF0aW9uIGlubmVyKSB7Ci0JCWlmICh0aGlzLmVsZW1lbnROYW1lLmVxdWFscyhWQUxVRSkpIHsKLQkJCXRoaXMubW9kaWZ5QW5ub3RhdGlvblZhbHVlKG91dGVyLCBpbm5lcik7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLm1vZGlmeUFubm90YXRpb25Ob25WYWx1ZShkZWNsYXJhdGlvbiwgb3V0ZXIsIGlubmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGlubmVyIGFubm90YXRpb24gdG8gdGhlIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbiwKLQkgKiBjb252ZXJ0aW5nIGl0IHRvIGEgbm9ybWFsIGFubm90YXRpb246Ci0JICogPHByZT4KLQkgKiAgICAgJiM2NDtPdXRlcigibG9yZW0gaXBzdW0iKSA9PiAmIzY0O091dGVyKHZhbHVlPSJsb3JlbSBpcHN1bSIsIGZvbz0mIzY0O0lubmVyKQotCSAqIDwvcHJlPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1vZGlmeUFubm90YXRpb25Ob25WYWx1ZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG91dGVyLCBBbm5vdGF0aW9uIGlubmVyKSB7Ci0JCUV4cHJlc3Npb24gdnYgPSBvdXRlci5nZXRWYWx1ZSgpOwotCQl2diA9IChFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHZ2LmdldEFTVCgpLCB2dik7Ci0JCU5vcm1hbEFubm90YXRpb24gbmV3T3V0ZXIgPSB0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCUxpc3Q8TWVtYmVyVmFsdWVQYWlyPiB2YWx1ZXMgPSB0aGlzLnZhbHVlcyhuZXdPdXRlcik7Ci0JCXZhbHVlcy5hZGQodGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoVkFMVUUsIHZ2KSk7Ci0JCXZhbHVlcy5hZGQodGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIodGhpcy5idWlsZE5ld0lubmVyRXhwcmVzc2lvbihpbm5lcikpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpbm5lciBhbm5vdGF0aW9uIHRvIHRoZSBub3JtYWwgYW5ub3RhdGlvbjoKLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O091dGVyKGJhcj0ibG9yZW0gaXBzdW0iKSA9PiAmIzY0O091dGVyKGJhcj0ibG9yZW0gaXBzdW0iLCBmb289JiM2NDtJbm5lcikKLQkgKiA8L3ByZT4KLQkgKiBvcgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7SW5uZXIoImxvcmVtIGlwc3VtIikpID0+ICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7SW5uZXIpCi0JICogPC9wcmU+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgbW9kaWZ5QW5ub3RhdGlvbihAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgTm9ybWFsQW5ub3RhdGlvbiBvdXRlciwgQW5ub3RhdGlvbiBpbm5lcikgewotCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IHRoaXMubWVtYmVyVmFsdWVQYWlyKG91dGVyKTsKLQkJaWYgKHBhaXIgPT0gbnVsbCkgewotCQkJTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHZhbHVlcyA9IHRoaXMudmFsdWVzKG91dGVyKTsKLQkJCXZhbHVlcy5hZGQodGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoaW5uZXIpKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMubW9kaWZ5TWVtYmVyVmFsdWVQYWlyKHBhaXIsIGlubmVyKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDE5YTU2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLSAvKioKLSAqIEFkYXB0IGFuIGFubm90YXRlZCBlbGVtZW50IGFuZCBhIGRlY2xhcmF0aW9uIGFubm90YXRpb24gZWxlbWVudCBhZGFwdGVyLgotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQ7Ci0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPiBkYWVhOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXB1YmxpYyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4gZGFlYSkgewotCQlzdXBlcigpOwotCQl0aGlzLmFubm90YXRlZEVsZW1lbnQgPSBhbm5vdGF0ZWRFbGVtZW50OwotCQl0aGlzLmRhZWEgPSBkYWVhOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRhZWEuZ2V0VmFsdWUodGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldE1vZGlmaWVkRGVjbGFyYXRpb24oKSk7Ci0JfQotCi0JcHVibGljIFQgZ2V0VmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZGFlYS5nZXRWYWx1ZSh0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbihhc3RSb290KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSkgewotCQl0aGlzLmVkaXQodGhpcy5idWlsZFNldFZhbHVlRWRpdG9yKHZhbHVlKSk7Ci0JfQotCi0JcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5kYWVhLmdldEV4cHJlc3Npb24odGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldE1vZGlmaWVkRGVjbGFyYXRpb24oYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyBBU1ROb2RlIGdldEFzdE5vZGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZGFlYS5nZXRBc3ROb2RlKHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRNb2RpZmllZERlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmRhZWEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGVkaXQoQW5ub3RhdGVkRWxlbWVudC5FZGl0b3IgZWRpdG9yKSB7Ci0JCXRoaXMuYW5ub3RhdGVkRWxlbWVudC5lZGl0KGVkaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRlZEVsZW1lbnQuRWRpdG9yIGJ1aWxkU2V0VmFsdWVFZGl0b3IoVCB2YWx1ZSkgewotCQlyZXR1cm4gbmV3IFNldFZhbHVlRWRpdG9yPFQ+KHZhbHVlLCB0aGlzLmRhZWEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFNldFZhbHVlRWRpdG9yPFQ+IGltcGxlbWVudHMgQW5ub3RhdGVkRWxlbWVudC5FZGl0b3IgewotCQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+IGRhZWE7Ci0JCXByaXZhdGUgZmluYWwgVCB2YWx1ZTsKLQotCQlTZXRWYWx1ZUVkaXRvcihUIHZhbHVlLCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPiBkYWVhKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy5kYWVhID0gZGFlYTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCXRoaXMuZGFlYS5zZXRWYWx1ZSh0aGlzLnZhbHVlLCBkZWNsYXJhdGlvbik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzdhMDU0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBDb252ZXJ0IGFuIGFycmF5IGluaXRpYWxpemVyIG9yIHNpbmdsZSBleHByZXNzaW9uIHRvL2Zyb20gYW4gYXJyYXkgb2YKLSAqIHN0cmluZ3MgKGUuZy4geyJ0ZXh0MCIsICJ0ZXh0MSJ9KS4KLSAqIEUgaXMgdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb25zIHRvIGJlIGZvdW5kIGVpdGhlciBzdGFuZC1hbG9uZSBvcgotICogYXMgZWxlbWVudHMgaW4gdGhlIGFycmF5IGluaXRpYWxpemVyLgotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcgotCWV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZ1tdPgotCWltcGxlbWVudHMgSW5kZXhlZEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPgotewotCXByaXZhdGUgZmluYWwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGVsZW1lbnRDb252ZXJ0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIgYXJyYXlDb252ZXJ0ZXI7Ci0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbW92ZSB0aGUgYXJyYXkgaW5pdGlhbGl6ZXIgaWYgaXQgaXMgZW1wdHkuCi0JICovCi0JcHVibGljIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIoRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGVsZW1lbnRDb252ZXJ0ZXIpIHsKLQkJdGhpcyhlbGVtZW50Q29udmVydGVyLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcihFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gZWxlbWVudENvbnZlcnRlciwgYm9vbGVhbiByZW1vdmVBcnJheUluaXRpYWxpemVyV2hlbkVtcHR5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudENvbnZlcnRlciA9IGVsZW1lbnRDb252ZXJ0ZXI7Ci0JCXRoaXMuYXJyYXlDb252ZXJ0ZXIgPSBuZXcgU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyKGVsZW1lbnRDb252ZXJ0ZXIsIHJlbW92ZUFycmF5SW5pdGlhbGl6ZXJXaGVuRW1wdHkpOwotCX0KLQotCS8qKgotCSAqIGlmIHdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBzdHJpbmcgaW4gdGhlIGFycmF5IHJldHVybiB0aGUgc2luZ2xlIGV4cHJlc3Npb24sCi0JICogd2l0aG91dCBicmFjZXMsIGluc3RlYWQgb2YgYW4gYXJyYXkgaW5pdGlhbGl6ZXIKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBjb252ZXJ0T2JqZWN0KFN0cmluZ1tdIHN0cmluZ3MsIEFTVCBhc3QpIHsKLQkJcmV0dXJuIChzdHJpbmdzLmxlbmd0aCA9PSAxKSA/Ci0JCQkJdGhpcy5lbGVtZW50Q29udmVydGVyLmNvbnZlcnQoc3RyaW5nc1swXSwgYXN0KSA6Ci0JCQkJdGhpcy5hcnJheUNvbnZlcnRlci5jb252ZXJ0T2JqZWN0KHN0cmluZ3MsIGFzdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGNvbnZlcnROdWxsKCkgewotCQlyZXR1cm4gdGhpcy5hcnJheUNvbnZlcnRlci5jb252ZXJ0TnVsbCgpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGZvciBhIHNpbmdsZSBleHByZXNzaW9uIHdpdGggbm8gc3Vycm91bmRpbmcgYnJhY2VzLCBpbXBseWluZyBhCi0JICogc2luZ2xlLWVudHJ5IGFycmF5Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGNvbnZlcnRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlyZXR1cm4gKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSKSA/Ci0JCQkJdGhpcy5jb252ZXJ0QXJyYXlJbml0aWFsaXplcigoQXJyYXlJbml0aWFsaXplcikgZXhwcmVzc2lvbikgOgotCQkJCXRoaXMuY29udmVydE5vbkFycmF5SW5pdGlhbGl6ZXIoZXhwcmVzc2lvbik7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGNvbnZlcnRBcnJheUluaXRpYWxpemVyKEFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplcikgewotCQlyZXR1cm4gdGhpcy5hcnJheUNvbnZlcnRlci5jb252ZXJ0QXJyYXlJbml0aWFsaXplcihhcnJheUluaXRpYWxpemVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIGV4cHJlc3Npb24gaXMgPGVtPm5vdDwvZW0+IGFuIGFycmF5IGluaXRpYWxpemVyLgotCSAqIElmIHdlIGhhdmUgdHJvdWJsZSBjb252ZXJ0aW5nIHRoZSBzdGFuZGFsb25lIGV4cHJlc3Npb24sIHNpbXBseSByZXR1cm4gYW4KLQkgKiBlbXB0eSBhcnJheSAoYXMgb3Bwb3NlZCB0byBhbiBhcnJheSB3aXRoIGEgPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudCkuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGNvbnZlcnROb25BcnJheUluaXRpYWxpemVyKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlTdHJpbmcgZWxlbWVudCA9IHRoaXMuZWxlbWVudENvbnZlcnRlci5jb252ZXJ0KGV4cHJlc3Npb24pOwotCQlyZXR1cm4gKGVsZW1lbnQgPT0gbnVsbCkgPyBTdHJpbmdUb29scy5FTVBUWV9TVFJJTkdfQVJSQVkgOiBuZXcgU3RyaW5nW10geyBlbGVtZW50IH07Ci0JfQotCi0JcHVibGljIEV4cHJlc3Npb24gc2VsZWN0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24sIGludCBpbmRleCkgewotCQlpZiAoZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIpIHsKLQkJCXJldHVybiB0aGlzLmFycmF5Q29udmVydGVyLnNlbGVjdEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgaW5kZXgpOwotCQl9Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQkJfQotCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY3RvcnkgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCdWlsZCBhbiBleHByZXNzaW9uIGNvbnZlcnRlciBmb3IgYW4gYW5ub3RhdGlvbiBlbGVtZW50IG9mIHR5cGUgU3RyaW5nW10uCi0JICogICAgIEBGb28oYmFyPXsidGV4dDAiLCAidGV4dDEifSkKLQkgKiBvcgotCSAqICAgICBARm9vKGJhcj0idGV4dDAiKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlciBmb3JTdHJpbmdzKCkgewotCQlyZXR1cm4gbmV3IEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIoU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhbiBleHByZXNzaW9uIGNvbnZlcnRlciBmb3IgYW4gYW5ub3RhdGlvbiBlbGVtZW50IG9mIHR5cGUgPGVudW0+W10uCi0JICogICAgIEBGb28oYmFyPXtCQVosIEJBVH0pCi0JICogb3IKLQkgKiAgICAgQEZvbyhiYXI9QkFaKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlciBmb3JOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyKE5hbWVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCi0JLyoqCi0JICogQnVpbGQgYW4gZXhwcmVzc2lvbiBjb252ZXJ0ZXIgZm9yIGFuIGFubm90YXRpb24gZWxlbWVudCBvZiB0eXBlIENsYXNzW10uCi0JICogICAgIEBGb28oYmFyPXtCYXouY2xhc3MsIEJhdC5jbGFzc30pCi0JICogb3IKLQkgKiAgICAgQEZvbyhiYXI9QmF6LmNsYXNzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlciBmb3JUeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyKFR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Jvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9Cb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzNhNzE5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Jvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvb2xlYW5MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotCi0vKioKLSAqIENvbnZlcnQgYSBib29sZWFuIGxpdGVyYWwgdG8vZnJvbSBhIEJvb2xlYW4KLSAqIChlLmcuIEJvb2xlYW4uVFJVRSkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlcgotCWV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPEJvb2xlYW4+Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhwcmVzc2lvbkNvbnZlcnRlcjxCb29sZWFuPiBJTlNUQU5DRSA9IG5ldyBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPEJvb2xlYW4+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBCb29sZWFuTGl0ZXJhbCBjb252ZXJ0T2JqZWN0KEJvb2xlYW4gYm9vbGVhbk9iamVjdCwgQVNUIGFzdCkgewotCQlyZXR1cm4gYXN0Lm5ld0Jvb2xlYW5MaXRlcmFsKGJvb2xlYW5PYmplY3QuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBCb29sZWFuIGNvbnZlcnRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlPYmplY3QgdmFsdWUgPSBleHByZXNzaW9uLnJlc29sdmVDb25zdGFudEV4cHJlc3Npb25WYWx1ZSgpOwotCQlyZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgPyAoKEJvb2xlYW4pIHZhbHVlKSA6IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9DaGFyYWN0ZXJTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9DaGFyYWN0ZXJTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYjQ3MDUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQ2hhcmFjdGVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5DaGFyYWN0ZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotCi0vKioKLSAqIENvbnZlcnQgYSBjaGFyYWN0ZXIgbGl0ZXJhbCB0by9mcm9tIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgY2hhcmFjdGVyCi0gKiAoZS5nLiAiQSIpLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2hhcmFjdGVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcgotCWV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gSU5TVEFOQ0UgPSBuZXcgQ2hhcmFjdGVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgQ2hhcmFjdGVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYXJhY3RlckxpdGVyYWwgY29udmVydE9iamVjdChTdHJpbmcgc3RyaW5nLCBBU1QgYXN0KSB7Ci0JCUNoYXJhY3RlckxpdGVyYWwgY2hhcmFjdGVyTGl0ZXJhbCA9IGFzdC5uZXdDaGFyYWN0ZXJMaXRlcmFsKCk7Ci0JCWNoYXJhY3RlckxpdGVyYWwuc2V0Q2hhclZhbHVlKHN0cmluZy5jaGFyQXQoMCkpOwotCQlyZXR1cm4gY2hhcmFjdGVyTGl0ZXJhbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlPYmplY3QgdmFsdWUgPSBleHByZXNzaW9uLnJlc29sdmVDb25zdGFudEV4cHJlc3Npb25WYWx1ZSgpOwotCQlyZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSA/ICgoQ2hhcmFjdGVyKSB2YWx1ZSkudG9TdHJpbmcoKSA6IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZTA1YjIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIE1hbmlwdWxhdGUgYW4gYW5ub3RhdGlvbiB0aGF0IGVpdGhlciBvY2N1cnMgc3RhbmQtYWxvbmUsIGUuZy4KLSAqIDxwcmU+Ci0gKiAgICAgJiM2NDtJbm5lcigiemVybyIpCi0gKiAgICAgcHJpdmF0ZSBpbnQgaWQ7Ci0gKiA8L3ByZT4KLSAqICAgICAKLSAqIG9yIGlzIGVtYmVkZGVkIGluIGFuIGVsZW1lbnQgYXJyYXkgd2l0aGluIGFub3RoZXIgYW5ub3RhdGlvbiwgZS5nLgotICogPHByZT4KLSAqICAgICAmIzY0O091dGVyKGZvbz17JiM2NDtJbm5lcigiemVybyIpLCAmIzY0O0lubmVyKCJvbmUiKSwgJiM2NDtJbm5lcigidHdvIil9KQotICogICAgIHByaXZhdGUgaW50IGlkOwotICogICAgIAotICogICAgICAgICBhbm5vdGF0aW9uTmFtZSA9ICJJbm5lciIKLSAqICAgICAgICAgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUgPSAiT3V0ZXIiCi0gKiAgICAgICAgIGVsZW1lbnROYW1lID0gImZvbyIKLSAqICAgICAgICAgaW5kZXggPSAwLTIKLSAqIDwvcHJlPgotICogCi0gKiBUaGlzIGlzIGEgdXNlZnVsIHBhdHRlcm4gYmVjYXVzZSBhIGRlY2xhcmF0aW9uIGNhbm5vdCBoYXZlIG1vcmUKLSAqIHRoYW4gb25lIGFubm90YXRpb24gb2YgdGhlIHNhbWUgdHlwZSwgYW5kIGFsbG93aW5nIHRoZSBzdGFuZC1hbG9uZQotICogY29uZmlndXJhdGlvbiByZWR1Y2VzIGNsdXR0ZXIuCi0gKiA8YnI+Ci0gKiBOQjogVGhpcyBjb25maWd1cmF0aW9uIG9ubHkgbWFrZXMgc2Vuc2UgZm9yICJ0b3AtbGV2ZWwiIGFubm90YXRpb25zLCBhcwotICogb3Bwb3NlZCB0byAibmVzdGVkIiBhbm5vdGF0aW9ucy4gVGhpcyBpcyBiZWNhdXNlIGFubm90YXRpb24gZWxlbWVudHMKLSAqIGNhbiBvbmx5IGJlIGRlY2xhcmVkIHdpdGggYSB0eXBlIG9mIGEgc2luZ2xlIGFubm90YXRpb24gYW5kIGFubm90YXRpb25zCi0gKiBjYW5ub3QgYmUgcGFydCBvZiBhbiBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9ucyBjYW5ub3QgKmJvdGgqIGJlIHN1cHBvcnRlZDoKLSAqIDxwcmU+Ci0gKiAgICAgJiM2NDtGb28oYmFyPSYjNjQ7T3V0ZXIoLi4uKSkKLSAqICAgICBwcml2YXRlIGludCBpZDsKLSAqIAotICogICAgICYjNjQ7Rm9vKGJhcj0mIzY0O0lubmVyKC4uLikpICAvLyBub3QgYWxsb3dlZAotICogICAgIHByaXZhdGUgaW50IGlkOwotICogPC9wcmU+Ci0gKiAKLSAqIE5COiBCZWhhdmlvciBpcyB1bmRlZmluZWQgd2hlbiBib3RoIHRoZSBzdGFuZC1hbG9uZSBhbmQgdGhlIG5lc3RlZAotICogY29uZmlndXJhdGlvbnMgYW5ub3RhdGUgdGhlIHNhbWUgZGVjbGFyYXRpb24sIGUuZy4KLSAqIDxwcmU+Ci0gKiAgICAgLy8gdW5kZWZpbmVkIGJlaGF2aW9yCi0gKiAgICAgJiM2NDtJbm5lcigiemVybyIpCi0gKiAgICAgJiM2NDtPdXRlcihmb289eyYjNjQ7SW5uZXIoInplcm8iKSwgJiM2NDtJbm5lcigib25lIiksICYjNjQ7SW5uZXIoInR3byIpfSkKLSAqICAgICBwcml2YXRlIGludCBpZDsKLSAqIDwvcHJlPgotICovCi1wdWJsaWMgY2xhc3MgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgotCWltcGxlbWVudHMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIKLXsKLQotCS8qKgotCSAqIHRoaXMgYWRhcHRlciBpcyB1c2VkIHdoZW4gdGhlIGFubm90YXRpb24gaXMgInN0YW5kLWFsb25lIjoKLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O0lubmVyKCJ6ZXJvIikKLQkgKiA8L3ByZT4KLQkgKiBhbmQgaXMgb25seSB1c2VkIHdoZW4gdGhlIGluZGV4IGlzIDAgb3IgMQotCSAqLwotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBzdGFuZEFsb25lQW5ub3RhdGlvbkFkYXB0ZXI7Ci0KLQkvKioKLQkgKiB0aGlzIGFkYXB0ZXIgaXMgdXNlZCB3aGVuIHRoZSBhbm5vdGF0aW9uIGlzICJuZXN0ZWQiOgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7T3V0ZXIoZm9vPXsmIzY0O0lubmVyKCJ6ZXJvIiksICYjNjQ7SW5uZXIoIm9uZSIpfSkKLQkgKiA8L3ByZT4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIG5lc3RlZEFubm90YXRpb25BZGFwdGVyOwotCi0JLyoqCi0JICogdGhpcyBhZGFwdGVyIGlzIGZvciB0aGUgIm5lc3RlZCIgYW5ub3RhdGlvbiBhdCB0aGUgemVybyBpbmRleDsKLQkgKiBhbmQgaXMgb25seSB1c2VkIHdoZW4gdGhlIGluZGV4IGlzIDEKLQkgKi8KLQlwcml2YXRlIGZpbmFsIE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIHplcm9OZXN0ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLQotCS8vIHJlZHVjZSBOTFMgY2hlY2tzCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzICJ2YWx1ZSIKLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O0lubmVyKCJ6ZXJvIikKLQkgKiAgICAgJiM2NDtPdXRlcih7JiM2NDtJbm5lcigiemVybyIpLCAmIzY0O0lubmVyKCJvbmUiKX0pCi0JICogPC9wcmU+Ci0JICovCi0JcHVibGljIENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoU3RyaW5nIGFubm90YXRpb25OYW1lLCBTdHJpbmcgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUsIGludCBpbmRleCkgewotCQl0aGlzKGFubm90YXRpb25OYW1lLCBjb250YWluZXJBbm5vdGF0aW9uTmFtZSwgVkFMVUUsIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGVsZW1lbnROYW1lLCBpbnQgaW5kZXgpIHsKLQkJdGhpcyhuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihhbm5vdGF0aW9uTmFtZSksIG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGNvbnRhaW5lckFubm90YXRpb25OYW1lKSwgZWxlbWVudE5hbWUsIGluZGV4LCBhbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogZGVmYXVsdCBlbGVtZW50IG5hbWUgaXMgInZhbHVlIgotCSAqLwotCXB1YmxpYyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBzdGFuZEFsb25lQW5ub3RhdGlvbkFkYXB0ZXIsIAotCQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjb250YWluZXJBbm5vdGF0aW9uQWRhcHRlciwgCi0JCQlpbnQgaW5kZXgsIAotCQkJU3RyaW5nIG5lc3RlZEFubm90YXRpb25OYW1lCi0JKSB7Ci0JCXRoaXMoc3RhbmRBbG9uZUFubm90YXRpb25BZGFwdGVyLCBjb250YWluZXJBbm5vdGF0aW9uQWRhcHRlciwgVkFMVUUsIGluZGV4LCBuZXN0ZWRBbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JcHVibGljIENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIHN0YW5kQWxvbmVBbm5vdGF0aW9uQWRhcHRlciwgCi0JCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNvbnRhaW5lckFubm90YXRpb25BZGFwdGVyLCAKLQkJCVN0cmluZyBlbGVtZW50TmFtZSwgCi0JCQlpbnQgaW5kZXgsIAotCQkJU3RyaW5nIG5lc3RlZEFubm90YXRpb25OYW1lCi0JKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3RhbmRBbG9uZUFubm90YXRpb25BZGFwdGVyID0gc3RhbmRBbG9uZUFubm90YXRpb25BZGFwdGVyOwotCQl0aGlzLm5lc3RlZEFubm90YXRpb25BZGFwdGVyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGNvbnRhaW5lckFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgaW5kZXgsIG5lc3RlZEFubm90YXRpb25OYW1lKTsKLQkJdGhpcy56ZXJvTmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoY29udGFpbmVyQW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCAwLCBuZXN0ZWRBbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWlmICh0aGlzLmdldEluZGV4KCkgPT0gMCkgewotCQkJLy8gY2hlY2sgZm9yIHRoZSBzdGFuZC1hbG9uZSBhbm5vdGF0aW9uCi0JCQlBbm5vdGF0aW9uIHN0YW5kQWxvbmVBbm5vdGF0aW9uID0gdGhpcy5nZXRTdGFuZEFsb25lQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQlpZiAoc3RhbmRBbG9uZUFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiBzdGFuZEFsb25lQW5ub3RhdGlvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5nZXROZXN0ZWRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiA8cHJlPgotCSAqIFtub25lXSA9PiAmIzY0O0lubmVyCi0JICogICAgIG9yCi0JICogJiM2NDtJbm5lcigibG9yZW0gaXBzdW0iKSA9PiAmIzY0O0lubmVyCi0JICogICAgIG9yCi0JICogJiM2NDtJbm5lcih0ZXh0PSJsb3JlbSBpcHN1bSIpID0+ICYjNjQ7SW5uZXIKLQkgKiAgICAgb3IKLQkgKiAmIzY0O091dGVyKGZvbz17JiM2NDtJbm5lciwgJiM2NDtJbm5lcn0pID0+ICYjNjQ7T3V0ZXIoZm9vPXsmIzY0O0lubmVyLCAmIzY0O0lubmVyLCAmIzY0O0lubmVyfSkKLQkgKiAgICAgb3IKLQkgKiAmIzY0O091dGVyKGZvbz0mIzY0O0lubmVyKSA9PiAmIzY0O091dGVyKGZvbz17JiM2NDtJbm5lciwgJiM2NDtJbm5lcn0pCi0JICogICAgIG9yCi0JICogJiM2NDtJbm5lciA9PiAmIzY0O091dGVyKGZvbz17JiM2NDtJbm5lciwgJiM2NDtJbm5lcn0pCi0JICogICAgIGV0Yy4KLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgTWFya2VyQW5ub3RhdGlvbiBuZXdNYXJrZXJBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIChNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLm5ld0Fubm90YXRpb24oTUFSS0VSX0FOTk9UQVRJT05fRkFDVE9SWSwgZGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIHRoaXMubmV3QW5ub3RhdGlvbihTSU5HTEVfTUVNQkVSX0FOTk9UQVRJT05fRkFDVE9SWSwgZGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyBOb3JtYWxBbm5vdGF0aW9uIG5ld05vcm1hbEFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gKE5vcm1hbEFubm90YXRpb24pIHRoaXMubmV3QW5ub3RhdGlvbihOT1JNQUxfQU5OT1RBVElPTl9GQUNUT1JZLCBkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWlmICh0aGlzLmdldEluZGV4KCkgPT0gMCkgewotCQkJLy8gY2hlY2sgZm9yIHRoZSBzdGFuZC1hbG9uZSBhbm5vdGF0aW9uCi0JCQlpZiAodGhpcy5zdGFuZEFsb25lQW5ub3RhdGlvbklzUHJlc2VudChkZWNsYXJhdGlvbikpIHsKLQkJCQl0aGlzLnJlbW92ZVN0YW5kQWxvbmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJdGhpcy5yZW1vdmVOZXN0ZWRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJaWYgKHRoaXMubmVzdGVkRWxlbWVudENhbkJlQ29udmVydGVkVG9TdGFuZEFsb25lKGRlY2xhcmF0aW9uKSkgewotCQkJdGhpcy5jb252ZXJ0TGFzdEVsZW1lbnRBbm5vdGF0aW9uVG9TdGFuZEFsb25lQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQVNUTm9kZSBnZXRBc3ROb2RlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJLy8gaWYgdGhlIGFubm90YXRpb24gaXMgbWlzc2luZywgZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBhbm5vdGF0aW9uIGFkYXB0ZXIKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uICE9IG51bGwpID8gYW5ub3RhdGlvbiA6IHRoaXMubmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QXN0Tm9kZShkZWNsYXJhdGlvbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0SW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaW50IG9sZEluZGV4ID0gdGhpcy5nZXRJbmRleCgpOwotCQlpZiAobmV3SW5kZXggPT0gb2xkSW5kZXgpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUFubm90YXRpb24gc3RhbmRBbG9uZUFubm90YXRpb24gPSB0aGlzLmdldFN0YW5kQWxvbmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJaWYgKHN0YW5kQWxvbmVBbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCXRoaXMubW92ZU5lc3RlZEFubm90YXRpb24obmV3SW5kZXgsIGRlY2xhcmF0aW9uKTsKLQkJCWlmICh0aGlzLm5lc3RlZEVsZW1lbnRDYW5CZUNvbnZlcnRlZFRvU3RhbmRBbG9uZShkZWNsYXJhdGlvbikpIHsKLQkJCQl0aGlzLmNvbnZlcnRMYXN0RWxlbWVudEFubm90YXRpb25Ub1N0YW5kQWxvbmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgob2xkSW5kZXggPT0gMCkgJiYgKG5ld0luZGV4ID09IDEpKSB7Ci0JCQkJLy8gdGhpcyBpcyBvbmUgb2YgdHdvIHNpdHVhdGlvbnMgd2hlcmUgd2UgdHJhbnNpdGlvbiBmcm9tIHN0YW5kLWFsb25lIHRvIGNvbnRhaW5lcgotCQkJCXRoaXMubW92ZVN0YW5kQWxvbmVBbm5vdGF0aW9uVG9Db250YWluZXJBbm5vdGF0aW9uKHN0YW5kQWxvbmVBbm5vdGF0aW9uLCBkZWNsYXJhdGlvbik7Ci0JCQkJdGhpcy5tb3ZlTmVzdGVkQW5ub3RhdGlvbihuZXdJbmRleCwgZGVjbGFyYXRpb24pOwotCQkJfSBlbHNlIGlmIChuZXdJbmRleCA9PSAwKSB7Ci0JCQkJLy8gd2UgYXJlIG1vdmluZyBhICdudWxsJyBlbnRyeSBvbiB0b3Agb2YgdGhlIHN0YW5kLWFsb25lLCBzbyByZW1vdmUgaXQKLQkJCQl0aGlzLnJlbW92ZVN0YW5kQWxvbmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigib2xkIGluZGV4ID0gIiArIG9sZEluZGV4ICsgIjsgbmV3IGluZGV4ID0gIiArIG5ld0luZGV4KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBidWlsZCB0aGUgYXBwcm9wcmlhdGUgbmV3IGFubm90YXRpb24sCi0JICogd2hpY2ggbWF5IHJlcXVpcmUgbW92aW5nIHRoZSAwdGggYW5ub3RhdGlvbiBmcm9tICJzdGFuZC1hbG9uZSIgdG8gIm5lc3RlZCIKLQkgKi8KLQlwcml2YXRlIEFubm90YXRpb24gbmV3QW5ub3RhdGlvbihBbm5vdGF0aW9uRmFjdG9yeSBhbm5vdGF0aW9uRmFjdG9yeSwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlpZiAodGhpcy5nZXRJbmRleCgpID09ICAwKSB7Ci0JCQlyZXR1cm4gdGhpcy5uZXdaZXJvQW5ub3RhdGlvbihhbm5vdGF0aW9uRmFjdG9yeSwgZGVjbGFyYXRpb24pOwotCQl9Ci0JCWlmICh0aGlzLnplcm9OZXN0ZWRBbm5vdGF0aW9uSXNQcmVzZW50KGRlY2xhcmF0aW9uKSkgewotCQkJLy8gbWFuaXB1bGF0ZSB0aGUgY29udGFpbmVyIGFubm90YXRpb24gLSBpZ25vcmUgdGhlIHN0YW5kLWFsb25lIGFubm90YXRpb24oPykKLQkJCS8vIEBPdXRlcihmb289QElubmVyKCJ6ZXJvIikpID0+IEBPdXRlcihmb289e0BJbm5lcigiemVybyIpLCBASW5uZXJ9KQotCQkJLy8gICAgIG9yCi0JCQkvLyBAT3V0ZXIoZm9vPXtASW5uZXIoInplcm8iKSwgQElubmVyKCJvbmUiKX0pID0+IEBPdXRlcihmb289e0BJbm5lcigiemVybyIpLCBASW5uZXJ9KQotCQkJcmV0dXJuIGFubm90YXRpb25GYWN0b3J5Lm5ld0Fubm90YXRpb24odGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRhcHRlciwgZGVjbGFyYXRpb24pOwotCQl9Ci0KLQkJLy8gdGhpcyBpcyBvbmUgb2YgdHdvIHNpdHVhdGlvbnMgd2hlcmUgd2UgdHJhbnNpdGlvbiBmcm9tIHN0YW5kLWFsb25lIHRvIGNvbnRhaW5lcgotCQl0aGlzLm1vdmVTdGFuZEFsb25lQW5ub3RhdGlvblRvQ29udGFpbmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCS8vIG9uY2UgdGhlIHN0YW5kLWFsb25lIGFubm90YXRpb24gaXMgbW92ZWQgdG8gaW5kZXg9MCwgYnVpbGQgdGhlIG5ldyBhbm5vdGF0aW9uIGF0IGluZGV4PTEKLQkJcmV0dXJuIGFubm90YXRpb25GYWN0b3J5Lm5ld0Fubm90YXRpb24odGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRhcHRlciwgZGVjbGFyYXRpb24pOwotCX0KLQotCS8qKgotCSAqIHRoZSBpbmRleCBpcyAwIC0gYnVpbGQgdGhlIGFwcHJvcHJpYXRlIG5ldyBhbm5vdGF0aW9uLAotCSAqIHdoaWNoIG1heSBiZSBlaXRoZXIgInN0YW5kLWFsb25lIiBvciAibmVzdGVkIgotCSAqLwotCXByaXZhdGUgQW5ub3RhdGlvbiBuZXdaZXJvQW5ub3RhdGlvbihBbm5vdGF0aW9uRmFjdG9yeSBhbm5vdGF0aW9uRmFjdG9yeSwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlpZiAodGhpcy5zdGFuZEFsb25lQW5ub3RhdGlvbklzUHJlc2VudChkZWNsYXJhdGlvbikpIHsKLQkJCS8vIHJlcGxhY2UgdGhlIHN0YW5kLWFsb25lIGFubm90YXRpb24gLSBpZ25vcmUgdGhlIGNvbnRhaW5lciBhbm5vdGF0aW9uKD8pCi0JCQkvLyBASW5uZXIodGV4dD0ibG9yZW0gaXBzdW0iKSA9PiBASW5uZXIKLQkJCXJldHVybiBhbm5vdGF0aW9uRmFjdG9yeS5uZXdBbm5vdGF0aW9uKHRoaXMuc3RhbmRBbG9uZUFubm90YXRpb25BZGFwdGVyLCBkZWNsYXJhdGlvbik7Ci0JCX0KLQkJaWYgKHRoaXMuY29udGFpbmVyQW5ub3RhdGlvbklzUHJlc2VudChkZWNsYXJhdGlvbikpIHsKLQkJCS8vIG1hbmlwdWxhdGUgdGhlIGNvbnRhaW5lciBhbm5vdGF0aW9uCi0JCQkvLyBAT3V0ZXIoZm9vPUBJbm5lcih0ZXh0PSJsb3JlbSBpcHN1bSIpKSA9PiBAT3V0ZXIoZm9vPUBJbm5lcikKLQkJCXJldHVybiBhbm5vdGF0aW9uRmFjdG9yeS5uZXdBbm5vdGF0aW9uKHRoaXMubmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIsIGRlY2xhcmF0aW9uKTsKLQkJfQotCQkvLyBuZWl0aGVyIGFubm90YXRpb24gaXMgcHJlc2VudCAtIGFkZCBhIG5ldyBzdGFuZC1hbG9uZSBhbm5vdGF0aW9uCi0JCXJldHVybiBhbm5vdGF0aW9uRmFjdG9yeS5uZXdBbm5vdGF0aW9uKHRoaXMuc3RhbmRBbG9uZUFubm90YXRpb25BZGFwdGVyLCBkZWNsYXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogbW92ZSB0aGUgc3RhbmQtYWxvbmUgYW5ub3RhdGlvbiB0byB0aGUgY29udGFpbmVyIGFubm90YXRpb24gYXQgaW5kZXg9MAotCSAqLwotCXByaXZhdGUgdm9pZCBtb3ZlU3RhbmRBbG9uZUFubm90YXRpb25Ub0NvbnRhaW5lckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlBbm5vdGF0aW9uIHN0YW5kQWxvbmVBbm5vdGF0aW9uID0gdGhpcy5nZXRTdGFuZEFsb25lQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWlmIChzdGFuZEFsb25lQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0aGUgc3RhbmQtYWxvbmUgYW5ub3RhdGlvbiBpcyBtaXNzaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLm1vdmVTdGFuZEFsb25lQW5ub3RhdGlvblRvQ29udGFpbmVyQW5ub3RhdGlvbihzdGFuZEFsb25lQW5ub3RhdGlvbiwgZGVjbGFyYXRpb24pOwotCX0KLQotCS8qKgotCSAqIG1vdmUgdGhlIHNwZWNpZmllZCwgbm9uLW51bGwsIHN0YW5kLWFsb25lIGFubm90YXRpb24gdG8KLQkgKiB0aGUgY29udGFpbmVyIGFubm90YXRpb24gYXQgaW5kZXg9MAotCSAqLwotCXByaXZhdGUgdm9pZCBtb3ZlU3RhbmRBbG9uZUFubm90YXRpb25Ub0NvbnRhaW5lckFubm90YXRpb24oQW5ub3RhdGlvbiBzdGFuZEFsb25lQW5ub3RhdGlvbiwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlpZiAoc3RhbmRBbG9uZUFubm90YXRpb24uaXNNYXJrZXJBbm5vdGF0aW9uKCkpIHsKLQkJCXRoaXMuemVyb05lc3RlZEFubm90YXRpb25BZGFwdGVyLm5ld01hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl9IGVsc2UgaWYgKHN0YW5kQWxvbmVBbm5vdGF0aW9uLmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKSB7Ci0JCQlFeHByZXNzaW9uIHZ2ID0gKChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBzdGFuZEFsb25lQW5ub3RhdGlvbikuZ2V0VmFsdWUoKTsKLQkJCXZ2ID0gKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodnYuZ2V0QVNUKCksIHZ2KTsKLQkJCXRoaXMuemVyb05lc3RlZEFubm90YXRpb25BZGFwdGVyLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pLnNldFZhbHVlKHZ2KTsKLQkJfSBlbHNlIGlmIChzdGFuZEFsb25lQW5ub3RhdGlvbi5pc05vcm1hbEFubm90YXRpb24oKSkgewotCQkJTm9ybWFsQW5ub3RhdGlvbiBuZXdOQSA9IHRoaXMuemVyb05lc3RlZEFubm90YXRpb25BZGFwdGVyLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHZhbHVlcyA9IHRoaXMudmFsdWVzKG5ld05BKTsKLQkJCWZvciAoTWVtYmVyVmFsdWVQYWlyIHBhaXIgOiB0aGlzLnZhbHVlcygoTm9ybWFsQW5ub3RhdGlvbikgc3RhbmRBbG9uZUFubm90YXRpb24pKSB7Ci0JCQkJdmFsdWVzLmFkZCgoTWVtYmVyVmFsdWVQYWlyKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHBhaXIuZ2V0QVNUKCksIHBhaXIpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVua25vd24gYW5ub3RhdGlvbiB0eXBlOiAiICsgc3RhbmRBbG9uZUFubm90YXRpb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5yZW1vdmVTdGFuZEFsb25lQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHdoZXRoZXIgdGhlICJuZXN0ZWQiIGFubm90YXRpb24gY29udGFpbmVyIGhhcyBiZWVuIHJlZHVjZWQgdG8KLQkgKiBhIHNpbmdsZSBlbGVtZW50IChhbmQgdGhlIGFycmF5IGluaXRpYWxpemVyIGlzIGNvbnZlcnRlZCB0byBqdXN0Ci0JICogdGhlIHNpbmdsZSByZW1haW5pbmcgZWxlbWVudCkgYW5kIGNhbiBiZSBmdXJ0aGVyIGNvbnZlcnRlZCB0byB0aGUKLQkgKiAic3RhbmQtYWxvbmUiIGFubm90YXRpb246Ci0JICogPHByZT4KLQkgKiAgICAgJiM2NDtPdXRlcihmb289eyYjNjQ7SW5uZXIoInplcm8iKSwgJiM2NDtJbm5lcigib25lIil9KSA9PgotCSAqICAgICAmIzY0O091dGVyKGZvbz0mIzY0O0lubmVyKCJ6ZXJvIikpID0+Ci0JICogICAgICYjNjQ7SW5uZXIoInplcm8iKQotCSAqIDwvcHJlPgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBuZXN0ZWRFbGVtZW50Q2FuQmVDb252ZXJ0ZWRUb1N0YW5kQWxvbmUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlBbm5vdGF0aW9uIGNvbnRhaW5lckFubm90YXRpb24gPSB0aGlzLmdldENvbnRhaW5lckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlpZiAoY29udGFpbmVyQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGNvbnRhaW5lckFubm90YXRpb24uaXNNYXJrZXJBbm5vdGF0aW9uKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoY29udGFpbmVyQW5ub3RhdGlvbi5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSkgewotCQkJaWYgKHRoaXMuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoVkFMVUUpKSB7Ci0JCQkJcmV0dXJuICgoKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGNvbnRhaW5lckFubm90YXRpb24pLmdldFZhbHVlKCkuZ2V0Tm9kZVR5cGUoKSAhPSBBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSKQotCQkJCQkJJiYgKHRoaXMuemVyb05lc3RlZEFubm90YXRpb25BZGFwdGVyLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pICE9IG51bGwpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChjb250YWluZXJBbm5vdGF0aW9uLmlzTm9ybWFsQW5ub3RhdGlvbigpKSB7Ci0JCQlOb3JtYWxBbm5vdGF0aW9uIG5hID0gKE5vcm1hbEFubm90YXRpb24pIGNvbnRhaW5lckFubm90YXRpb247Ci0JCQlpZiAobmEudmFsdWVzKCkuc2l6ZSgpID09IDApIHsKLQkJCQlyZXR1cm4gZmFsc2U7ICAvLyB0aGVyZSBhcmUgbm8gZWxlbWVudHMgcHJlc2VudAotCQkJfQotCQkJaWYgKG5hLnZhbHVlcygpLnNpemUoKSAhPSAxKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlcmUgYXJlIG90aGVyIGVsZW1lbnRzIHByZXNlbnQgLSBsZWF2ZSB0aGVtIGFsbCBhbG9uZQotCQkJfQotCQkJTWVtYmVyVmFsdWVQYWlyIHBhaXIgPSAoTWVtYmVyVmFsdWVQYWlyKSBuYS52YWx1ZXMoKS5nZXQoMCk7Ci0JCQlpZiAodGhpcy5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhwYWlyLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gKHBhaXIuZ2V0VmFsdWUoKS5nZXROb2RlVHlwZSgpICE9IEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIpCi0JCQkJCQkmJiAodGhpcy56ZXJvTmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbikgIT0gbnVsbCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBhbm5vdGF0aW9uIHR5cGU6ICIgKyBjb250YWluZXJBbm5vdGF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIG1vdmUgdGhlIGFubm90YXRpb24gaW4gdGhlIGNvbnRhaW5lciBhbm5vdGF0aW9uIGF0IGluZGV4PTAKLQkgKiB0byB0aGUgc3RhbmQtYWxvbmUgYW5ub3RhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjb252ZXJ0TGFzdEVsZW1lbnRBbm5vdGF0aW9uVG9TdGFuZEFsb25lQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCUFubm90YXRpb24gbGFzdCA9IHRoaXMuemVyb05lc3RlZEFubm90YXRpb25BZGFwdGVyLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlpZiAobGFzdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0aGUgbGFzdCBuZXN0ZWQgYW5ub3RhdGlvbiBpcyBtaXNzaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChsYXN0LmlzTWFya2VyQW5ub3RhdGlvbigpKSB7Ci0JCQl0aGlzLm5ld1N0YW5kQWxvbmVNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJfSBlbHNlIGlmIChsYXN0LmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKSB7Ci0JCQlFeHByZXNzaW9uIHZ2ID0gKChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBsYXN0KS5nZXRWYWx1ZSgpOwotCQkJdnYgPSAoRXhwcmVzc2lvbikgQVNUTm9kZS5jb3B5U3VidHJlZSh2di5nZXRBU1QoKSwgdnYpOwotCQkJdGhpcy5uZXdTdGFuZEFsb25lU2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbikuc2V0VmFsdWUodnYpOwotCQl9IGVsc2UgaWYgKGxhc3QuaXNOb3JtYWxBbm5vdGF0aW9uKCkpIHsKLQkJCU5vcm1hbEFubm90YXRpb24gbmV3TkEgPSB0aGlzLm5ld1N0YW5kQWxvbmVOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCUxpc3Q8TWVtYmVyVmFsdWVQYWlyPiB2YWx1ZXMgPSB0aGlzLnZhbHVlcyhuZXdOQSk7Ci0JCQlmb3IgKE1lbWJlclZhbHVlUGFpciBwYWlyIDogdGhpcy52YWx1ZXMoKE5vcm1hbEFubm90YXRpb24pIGxhc3QpKSB7Ci0JCQkJdmFsdWVzLmFkZCgoTWVtYmVyVmFsdWVQYWlyKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHBhaXIuZ2V0QVNUKCksIHBhaXIpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVua25vd24gYW5ub3RhdGlvbiB0eXBlOiAiICsgbGFzdCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLnJlbW92ZUNvbnRhaW5lckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzdGFuZEFsb25lQW5ub3RhdGlvbklzUHJlc2VudChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmdldFN0YW5kQWxvbmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSAhPSBudWxsOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbiBnZXRTdGFuZEFsb25lQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLnN0YW5kQWxvbmVBbm5vdGF0aW9uQWRhcHRlci5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIE1hcmtlckFubm90YXRpb24gbmV3U3RhbmRBbG9uZU1hcmtlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5zdGFuZEFsb25lQW5ub3RhdGlvbkFkYXB0ZXIubmV3TWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5ld1N0YW5kQWxvbmVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuc3RhbmRBbG9uZUFubm90YXRpb25BZGFwdGVyLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCX0KLQotCXByaXZhdGUgTm9ybWFsQW5ub3RhdGlvbiBuZXdTdGFuZEFsb25lTm9ybWFsQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLnN0YW5kQWxvbmVBbm5vdGF0aW9uQWRhcHRlci5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlU3RhbmRBbG9uZUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzLnN0YW5kQWxvbmVBbm5vdGF0aW9uQWRhcHRlci5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb24gZ2V0TmVzdGVkQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLm5lc3RlZEFubm90YXRpb25BZGFwdGVyLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBtb3ZlTmVzdGVkQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJdGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5tb3ZlQW5ub3RhdGlvbihuZXdJbmRleCwgZGVjbGFyYXRpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVOZXN0ZWRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJdGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbmVyQW5ub3RhdGlvbklzUHJlc2VudChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRhaW5lckFubm90YXRpb24oZGVjbGFyYXRpb24pICE9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uIGdldENvbnRhaW5lckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5nZXRPdXRlckFubm90YXRpb25BZGFwdGVyKCkuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNvbnRhaW5lckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzLm5lc3RlZEFubm90YXRpb25BZGFwdGVyLmdldE91dGVyQW5ub3RhdGlvbkFkYXB0ZXIoKS5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gemVyb05lc3RlZEFubm90YXRpb25Jc1ByZXNlbnQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5nZXRaZXJvTmVzdGVkQW5ub3RhdGlvbihkZWNsYXJhdGlvbikgIT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb24gZ2V0WmVyb05lc3RlZEFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy56ZXJvTmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5lc3RlZEFubm90YXRpb25BZGFwdGVyLmdldEFubm90YXRpb25OYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5lc3RlZEFubm90YXRpb25BZGFwdGVyLmdldEVsZW1lbnROYW1lKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiB2YWx1ZXMoTm9ybWFsQW5ub3RhdGlvbiBuYSkgewotCQlyZXR1cm4gbmEudmFsdWVzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFubm90YXRpb24gZmFjdG9yaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIGRlZmluZSBpbnRlcmZhY2UgdGhhdCBhbGxvd3MgdXMgdG8gInJlLXVzZSIgdGhlIG5hc3R5IGNvZGUgaW4KLQkgKiAjbmV3QW5ub3RhdGlvbihBbm5vdGF0aW9uRmFjdG9yeSwgTW9kaWZpZWREZWNsYXJhdGlvbikKLQkgKi8KLQlwcml2YXRlIGludGVyZmFjZSBBbm5vdGF0aW9uRmFjdG9yeSB7Ci0JCUFubm90YXRpb24gbmV3QW5ub3RhdGlvbihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFkYXB0ZXIsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25GYWN0b3J5IE1BUktFUl9BTk5PVEFUSU9OX0ZBQ1RPUlkgPSBuZXcgQW5ub3RhdGlvbkZhY3RvcnkoKSB7Ci0JCXB1YmxpYyBBbm5vdGF0aW9uIG5ld0Fubm90YXRpb24oRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhZGFwdGVyLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5uZXdNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiTWFya2VyQW5ub3RhdGlvbkZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkZhY3RvcnkgU0lOR0xFX01FTUJFUl9BTk5PVEFUSU9OX0ZBQ1RPUlkgPSBuZXcgQW5ub3RhdGlvbkZhY3RvcnkoKSB7Ci0JCXB1YmxpYyBBbm5vdGF0aW9uIG5ld0Fubm90YXRpb24oRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhZGFwdGVyLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkZhY3RvcnkgTk9STUFMX0FOTk9UQVRJT05fRkFDVE9SWSA9IG5ldyBBbm5vdGF0aW9uRmFjdG9yeSgpIHsKLQkJcHVibGljIEFubm90YXRpb24gbmV3QW5ub3RhdGlvbihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFkYXB0ZXIsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCXJldHVybiBhZGFwdGVyLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJOb3JtYWxBbm5vdGF0aW9uRmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX07Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0NvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiOTM0ZjMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFdyYXAgYSBkZWNsYXJhdGlvbiBhbm5vdGF0aW9uIGVsZW1lbnQgYWRhcHRlciB0aGF0IGRlYWxzIHdpdGggQVNUCi0gKiBleHByZXNzaW9ucywgY29udmVydGluZyB0aGVtIHRvL2Zyb20gdmFyaW91cyBvdGhlciBvYmplY3RzLgotICogCi0gKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgYmUgcGFzc2VkIHRvIGFuZCByZXR1cm5lZCBieSB0aGUgYWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+Ci0JaW1wbGVtZW50cyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPgotewotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGFkYXB0ZXIgdGhhdCByZXR1cm5zIGFuZCB0YWtlcyBBU1QgZXhwcmVzc2lvbnMuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEV4cHJlc3Npb24+IGFkYXB0ZXI7Ci0KLQkvKioKLQkgKiBUaGUgY29udmVydGVyIHRoYXQgY29udmVydHMgQVNUIGV4cHJlc3Npb25zIHRvIG90aGVyIG9iamVjdHMKLQkgKiAoZS5nLiBTdHJpbmdzKS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRXhwcmVzc2lvbkNvbnZlcnRlcjxUPiBjb252ZXJ0ZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyA8Y29kZT52YWx1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBFeHByZXNzaW9uQ29udmVydGVyPFQ+IGNvbnZlcnRlcikgewotCQl0aGlzKG5ldyBFeHByZXNzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8RXhwcmVzc2lvbj4oYW5ub3RhdGlvbkFkYXB0ZXIpLCBjb252ZXJ0ZXIpOwotCX0KLQotCXB1YmxpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBFeHByZXNzaW9uQ29udmVydGVyPFQ+IGNvbnZlcnRlcikgewotCQl0aGlzKG5ldyBFeHByZXNzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8RXhwcmVzc2lvbj4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lKSwgY29udmVydGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEV4cHJlc3Npb24+IGFkYXB0ZXIsIEV4cHJlc3Npb25Db252ZXJ0ZXI8VD4gY29udmVydGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JCXRoaXMuY29udmVydGVyID0gY29udmVydGVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVCBnZXRWYWx1ZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHRoaXMuYWRhcHRlci5nZXRWYWx1ZShkZWNsYXJhdGlvbik7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlci5jb252ZXJ0KGV4cHJlc3Npb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFQgdmFsdWUsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uOwotCQl0cnkgewotCQkJZXhwcmVzc2lvbiA9IHRoaXMuY29udmVydGVyLmNvbnZlcnQodmFsdWUsIGRlY2xhcmF0aW9uLmdldEFzdCgpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBpZiB0aGVyZSBpcyBhIHByb2JsZW0gY29udmVydGluZyB0aGUgJ3ZhbHVlJyB0byBhbiBFeHByZXNzaW9uIHdlIGdldCB0aGlzIGV4Y2VwdGlvbgotCQkJcmV0dXJuOyAgLy8gZG9uJ3Qgc2V0IHRoZSB2YWx1ZSBpZiBpdCBpcyAiaWxsZWdhbCIKLQkJfQotCQl0aGlzLmFkYXB0ZXIuc2V0VmFsdWUoZXhwcmVzc2lvbiwgZGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldEV4cHJlc3Npb24oZGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyBBU1ROb2RlIGdldEFzdE5vZGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldEFzdE5vZGUoZGVjbGFyYXRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuYWRhcHRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY3Rvcnkgc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzIDxjb2RlPnZhbHVlPC9jb2RlPjsKLQkgKiB0aGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzIHN0cmluZyBjb25zdGFudCBleHByZXNzaW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZvclN0cmluZ3MoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGV4cHJlc3Npb24gY29udmVydGVyIGV4cGVjdHMgc3RyaW5nIGNvbnN0YW50IGV4cHJlc3Npb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZm9yU3RyaW5ncyhEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzIDxjb2RlPnZhbHVlPC9jb2RlPjsKLQkgKiB0aGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzIG51bWJlciBjb25zdGFudCBleHByZXNzaW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBmb3JOdW1iZXJzKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oYW5ub3RhdGlvbkFkYXB0ZXIsIE51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGV4cHJlc3Npb24gY29udmVydGVyIGV4cGVjdHMgbnVtYmVyIGNvbnN0YW50IGV4cHJlc3Npb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGZvck51bWJlcnMoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzIDxjb2RlPnZhbHVlPC9jb2RlPjsKLQkgKiB0aGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzIGJvb2xlYW4gY29uc3RhbnQgZXhwcmVzc2lvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZm9yQm9vbGVhbnMoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihhbm5vdGF0aW9uQWRhcHRlciwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZXhwcmVzc2lvbiBjb252ZXJ0ZXIgZXhwZWN0cyBib29sZWFuIGNvbnN0YW50IGV4cHJlc3Npb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGZvckJvb2xlYW5zKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyA8Y29kZT52YWx1ZTwvY29kZT47Ci0JICogdGhlIGRlZmF1bHQgZXhwcmVzc2lvbiBjb252ZXJ0ZXIgZXhwZWN0cyBjaGFyYWN0ZXIgY29uc3RhbnQgZXhwcmVzc2lvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBmb3JDaGFyYWN0ZXJzKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0aW9uQWRhcHRlciwgQ2hhcmFjdGVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzIGNoYXJhY3RlciBjb25zdGFudCBleHByZXNzaW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZvckNoYXJhY3RlcnMoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBDaGFyYWN0ZXJTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0RlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MjY0YTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkluc2VydEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGNsZWFuIHVwIHNvbWUgb2YgdGhlIG5hc3R5IEVjbGlwc2UgYW5ub3RhdGlvbgotICogZm9ybWF0dGluZyAob3IgbGFjayB0aGVyZW9mKTsgZS5nLiBhcnJheXMgb2YgYW5ub3RhdGlvbnMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIKLQlpbXBsZW1lbnRzIEFubm90YXRpb25FZGl0Rm9ybWF0dGVyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRPRE8KLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXQoSURvY3VtZW50IGRvYywgVGV4dEVkaXQgZWRpdFRyZWUpIHRocm93cyBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCVRleHRFZGl0W10gZWRpdHMgPSBlZGl0VHJlZS5nZXRDaGlsZHJlbigpOwotCQlpbnQgbGVuID0gZWRpdHMubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCU11bHRpVGV4dEVkaXQgZXh0cmFFZGl0cyA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCVRleHRFZGl0IGVkaXQxID0gZWRpdHNbaV07Ci0JCQlpZiAoICEgKGVkaXQxIGluc3RhbmNlb2YgSW5zZXJ0RWRpdCkpIHsKLQkJCQljb250aW51ZTsgIC8vIGlmIHRoZSBlZGl0IGlzIG5vdCBhbiBpbnNlcnQsIHNraXAgdG8gdGhlIG5leHQgZWRpdAotCQkJfQotCQkJSW5zZXJ0RWRpdCBpbnNlcnQxID0gKEluc2VydEVkaXQpIGVkaXQxOwotCQkJaW50IGogPSBpICsgMTsKLQkJCWlmIChqIDwgbGVuKSB7Ci0JCQkJVGV4dEVkaXQgZWRpdDIgPSBlZGl0c1tqXTsKLQkJCQlpZiAoZWRpdDIgaW5zdGFuY2VvZiBJbnNlcnRFZGl0KSB7Ci0JCQkJCUluc2VydEVkaXQgaW5zZXJ0MiA9IChJbnNlcnRFZGl0KSBlZGl0MjsKLQkJCQkJU3RyaW5nIHRleHQxID0gaW5zZXJ0MS5nZXRUZXh0KCk7Ci0JCQkJCVN0cmluZyB0ZXh0MiA9IGluc2VydDIuZ2V0VGV4dCgpOwotCQkJCQlpbnQgb2Zmc2V0MSA9IGluc2VydDEuZ2V0T2Zmc2V0KCk7Ci0JCQkJCWludCBvZmZzZXQyID0gaW5zZXJ0Mi5nZXRPZmZzZXQoKTsKLQkJCQkJaWYgKHRoaXMuc3RyaW5nSXNBbm5vdGF0aW9uKHRleHQxKSAmJiB0ZXh0Mi5lcXVhbHMoIiAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBhbiBhbm5vdGF0aW9uIHdhcyBpbnNlcnRlZCBiZWZvcmUgc29tZXRoaW5nIG9uIHRoZSBzYW1lIGxpbmU7Ci0JCQkJCQkvLyByZXBsYWNlIHRoZSB0cmFpbGluZyBzcGFjZSB3aXRoIGEgbmV3bGluZSBhbmQgYXBwcm9wcmlhdGUgaW5kZW50Ci0JCQkJCQlleHRyYUVkaXRzLmFkZENoaWxkKG5ldyBSZXBsYWNlRWRpdChvZmZzZXQyLCAxLCB0aGlzLmJ1aWxkQ1IoZG9jLCBvZmZzZXQyKSkpOwotCQkJCQkJaSsrOyAgLy8ganVtcCB0aGUgaW5kZXggcGFzdCAnZWRpdDInCi0JCQkJCQljb250aW51ZTsgIC8vIGdvIHRvIHRoZSBuZXh0IGVkaXQKLQkJCQkJfQotCQkJCQlpbnQgY29tbWExTGVuZ3RoID0gdGhpcy5jb21tYUxlbmd0aCh0ZXh0MSk7Ci0JCQkJCWlmICgoY29tbWExTGVuZ3RoICE9IDApICYmIHRoaXMuc3RyaW5nSXNBbm5vdGF0aW9uKHRleHQyKSkgewotCQkJCQkJLy8gYW4gYW5ub3RhdGlvbiB3YXMgaW5zZXJ0ZWQgaW4gYW4gYXJyYXkgaW5pdGlhbGl6ZXIgb24gdGhlCi0JCQkJCQkvLyBzYW1lIGxpbmUgYXMgdGhlIHByZXZpb3VzIGFycmF5IGVsZW1lbnQ7Ci0JCQkJCQkvLyByZXBsYWNlIHRoZSBwcmVjZWRpbmcgc3BhY2Ugd2l0aCBhIG5ld2xpbmUgYW5kIGFwcHJvcHJpYXRlIGluZGVudAotCQkJCQkJZXh0cmFFZGl0cy5hZGRDaGlsZChuZXcgUmVwbGFjZUVkaXQob2Zmc2V0MSArIGNvbW1hMUxlbmd0aCwgdGV4dDEubGVuZ3RoKCkgLSBjb21tYTFMZW5ndGgsIHRoaXMuYnVpbGRDUihkb2MsIG9mZnNldDEpKSk7Ci0JCQkJCQlpKys7ICAvLyBqdW1wIHRoZSBpbmRleCBwYXN0ICdlZGl0MicKLQkJCQkJCWNvbnRpbnVlOyAgLy8gZ28gdG8gdGhlIG5leHQgZWRpdAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdGhpcy5mb3JtYXRBcnJheUluaXRpYWxpemVyKGRvYywgaW5zZXJ0MSwgZXh0cmFFZGl0cyk7Ci0JCX0KLQkJZXh0cmFFZGl0cy5hcHBseShkb2MsIFRleHRFZGl0Lk5PTkUpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBpbnNlcnQgZWRpdCBpcyBpbnNlcnRpbmcgYW4gYW5ub3RhdGlvbiBjb250YWluaW5nIGFuIGFycmF5IG9mIGFubm90YXRpb25zIGFzCi0JICogaXRzIHZhbHVlIHRoZW4gZm9ybWF0IHRoZW0gbmljZWx5LgotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JtYXRBcnJheUluaXRpYWxpemVyKElEb2N1bWVudCBkb2MsIEluc2VydEVkaXQgaW5zZXJ0RWRpdCwgTXVsdGlUZXh0RWRpdCBleHRyYUVkaXRzKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmcgcyA9IGluc2VydEVkaXQuZ2V0VGV4dCgpOwotCQlpZiAoICEgdGhpcy5zdHJpbmdJc0Fubm90YXRpb24ocykpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJaW50IHBvcyA9IDE7ICAvLyBza2lwICdAJwotCQl3aGlsZSAocG9zIDwgbGVuKSB7Ci0JCQljaGFyIGMgPSBzLmNoYXJBdChwb3MpOwotCQkJcG9zKys7ICAvLyBidW1wIHRvIGp1c3QgcGFzdCBmaXJzdCAnKCcKLQkJCWlmIChjID09ICcoJykgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChwb3MgPT0gbGVuKSB7Ci0JCQlyZXR1cm47ICAvLyByZWFjaGVkIGVuZCBvZiBzdHJpbmcKLQkJfQotCQl3aGlsZSAocG9zIDwgbGVuKSB7Ci0JCQljaGFyIGMgPSBzLmNoYXJBdChwb3MpOwotCQkJcG9zKys7ICAvLyBidW1wIHRvIGp1c3QgcGFzdCBmaXJzdCAneycKLQkJCWlmIChjID09ICd7JykgewotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGMgIT0gJyAnKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmIChwb3MgPT0gbGVuKSB7Ci0JCQlyZXR1cm47ICAvLyByZWFjaGVkIGVuZCBvZiBzdHJpbmcKLQkJfQotCQkvLyBub3cgbG9vayBmb3IgJ0AnIG5vdCBpbnNpZGUgcGFyZW50aGVzZXMgYW5kIHB1dCBpbiAKLQkJLy8gbGluZSBkZWxpbWV0ZXIgYW5kIGluZGVudCBzdHJpbmcgYmVmb3JlIGVhY2gKLQkJaW50IG9mZnNldCA9IGluc2VydEVkaXQuZ2V0T2Zmc2V0KCk7Ci0JCVN0cmluZyBpbmRlbnQgPSBudWxsOwotCQlpbnQgcGFyZW5EZXB0aCA9IDA7Ci0JCXdoaWxlIChwb3MgPCBsZW4pIHsKLQkJCXN3aXRjaCAocy5jaGFyQXQocG9zKSkgewotCQkJCWNhc2UgJygnIDoKLQkJCQkJcGFyZW5EZXB0aCsrOwotCQkJCQlicmVhazsKLQkJCQljYXNlICcpJyA6Ci0JCQkJCXBhcmVuRGVwdGgtLTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnQCcgOgotCQkJCQlpZiAocGFyZW5EZXB0aCA9PSAwKSB7Ci0JCQkJCQlpZiAoaW5kZW50ID09IG51bGwpIHsKLQkJCQkJCQlpbmRlbnQgPSB0aGlzLmJ1aWxkQ1IoZG9jLCBvZmZzZXQsICJcdCIpOyAgLy8gVE9ETyB1c2UgdGFiIHByZWZlcmVuY2U/IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWV4dHJhRWRpdHMuYWRkQ2hpbGQobmV3IEluc2VydEVkaXQob2Zmc2V0ICsgcG9zLCBpbmRlbnQpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlICd9JyA6Ci0JCQkJCWlmIChwYXJlbkRlcHRoID09IDApIHsKLQkJCQkJCWV4dHJhRWRpdHMuYWRkQ2hpbGQobmV3IEluc2VydEVkaXQob2Zmc2V0ICsgcG9zLCB0aGlzLmJ1aWxkQ1IoZG9jLCBvZmZzZXQpKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwb3MrKzsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBsaW5lIGRlbGltZXRlciBhbmQgaW5kZW50aW5nIGNoYXJhY3RlcnMgCi0JICogbWF0Y2hpbmcgdGhlIGluZGVudCBsZXZlbCBvZiB0aGUgbGluZSBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXIgb2Zmc2V0Ci0JICogKGkuZS4gdGhlIG5ldyBsaW5lJ3MgaW5kZW50IG1hdGNoZXMgdGhlIGN1cnJlbnQgbGluZSkuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRDUihJRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5idWlsZENSKGRvYywgb2Zmc2V0LCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZENSKElEb2N1bWVudCBkb2MsIGludCBvZmZzZXQsIFN0cmluZyBzdWZmaXgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWludCBsaW5lID0gZG9jLmdldExpbmVPZk9mZnNldChvZmZzZXQpOwotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJc2IuYXBwZW5kKGRvYy5nZXRMaW5lRGVsaW1pdGVyKGxpbmUpKTsgIC8vIHVzZSBzYW1lIENSIGFzIGN1cnJlbnQgbGluZQotCi0JCWludCBvID0gZG9jLmdldExpbmVPZmZzZXQobGluZSk7ICAvLyBtYXRjaCB0aGUgd2hpdGVzcGFjZSBvZiB0aGUgY3VycmVudCBsaW5lCi0JCWNoYXIgYyA9IGRvYy5nZXRDaGFyKG8rKyk7Ci0JCXdoaWxlICgoYyA9PSAnICcpIHx8IChjID09ICdcdCcpKSB7Ci0JCQlzYi5hcHBlbmQoYyk7Ci0JCQljID0gZG9jLmdldENoYXIobysrKTsKLQkJfQotCQlzYi5hcHBlbmQoc3VmZml4KTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgYW4gYW5ub3RhdGlvbi4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc3RyaW5nSXNBbm5vdGF0aW9uKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIChzdHJpbmcubGVuZ3RoKCkgPiAxKSAmJiBzdHJpbmcuY2hhckF0KDApID09ICdAJzsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBhIHNpbmdsZSBjb21tYSwgcG9zc2libHkgc3Vycm91bmRlZCBieQotCSAqIHNwYWNlcywgcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHN1YnN0cmluZyBjb250YWluaW5nIHRoZQotCSAqIGluaXRpYWwgc3BhY2VzIGFuZCB0aGUgY29tbWEuCi0JICovCi0JcHJpdmF0ZSBpbnQgY29tbWFMZW5ndGgoU3RyaW5nIHN0cmluZykgewotCQlib29sZWFuIGNvbW1hID0gZmFsc2U7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWludCByZXN1bHQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlzd2l0Y2ggKHN0cmluZy5jaGFyQXQoaSkpIHsKLQkJCQljYXNlICcgJyA6Ci0JCQkJCWlmICggISBjb21tYSkgewotCQkJCQkJcmVzdWx0Kys7ICAvLyBzcGFjZSBwcmVjZWRpbmcgY29tbWEKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlICcsJyA6Ci0JCQkJCWlmIChjb21tYSkgewotCQkJCQkJcmV0dXJuIDA7ICAvLyBzZWNvbmQgY29tbWEhCi0JCQkJCX0KLQkJCQkJY29tbWEgPSB0cnVlOwotCQkJCQlyZXN1bHQrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIDA7ICAvLyBub24tY29tbWEsIG5vbi1zcGFjZSBjaGFyCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VsZW1lbnRBbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRWxlbWVudEFubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZjE0YTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRWxlbWVudEFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotCi0vKioKLSAqIEFkYXB0IGFuIGFubm90YXRlZCBlbGVtZW50IGFuZCBhIGRlY2xhcmF0aW9uIGFubm90YXRpb24gYWRhcHRlci4KLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlciBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvbkFkYXB0ZXIgewotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXB1YmxpYyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIoQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlzdXBlcihhbm5vdGF0ZWRFbGVtZW50LCBkYWEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2UzNDY3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEFkYXB0IGFuIGFubm90YXRlZCBlbGVtZW50IGFuZCBhbiBpbmRleGVkIGRlY2xhcmF0aW9uIGFubm90YXRpb24gYWRhcHRlci4KLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIKLQlleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvbkFkYXB0ZXIKLQlpbXBsZW1lbnRzIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcgotewotCXByaXZhdGUgZmluYWwgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJc3VwZXIoYW5ub3RhdGVkRWxlbWVudCwgaWRhYSk7Ci0JCXRoaXMuaWRhYSA9IGlkYWE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5pZGFhLmdldEluZGV4KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4KSB7Ci0JCXRoaXMuZWRpdCh0aGlzLmJ1aWxkTW92ZUFubm90YXRpb25FZGl0b3IobmV3SW5kZXgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBbm5vdGF0ZWRFbGVtZW50LkVkaXRvciBidWlsZE1vdmVBbm5vdGF0aW9uRWRpdG9yKGludCBuZXdJbmRleCkgewotCQlyZXR1cm4gbmV3IE1vdmVBbm5vdGF0aW9uRWRpdG9yKHRoaXMuaWRhYSwgbmV3SW5kZXgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE1vdmVBbm5vdGF0aW9uRWRpdG9yIGltcGxlbWVudHMgQW5ub3RhdGVkRWxlbWVudC5FZGl0b3IgewotCQlwcml2YXRlIGZpbmFsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWE7Ci0JCXByaXZhdGUgaW50IGluZGV4OwotCi0JCU1vdmVBbm5vdGF0aW9uRWRpdG9yKEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEsIGludCBpbmRleCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaWRhYSA9IGlkYWE7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCX0KLQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQl0aGlzLmlkYWEubW92ZUFubm90YXRpb24odGhpcy5pbmRleCwgZGVjbGFyYXRpb24pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9FbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjNhNzRiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFdyYXAgYSBkZWNsYXJhdGlvbiBhbm5vdGF0aW9uIGVsZW1lbnQgYWRhcHRlciBhbmQgc2ltcGx5Ci0gKiBhZGQgYW4gaW1wb3J0IGZvciB0aGUgZW51bXMgd2hlbiBuZWNlc3NhcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcgotCWltcGxlbWVudHMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+Ci17Ci0JLyoqCi0JICogVGhlIHdyYXBwZWQgYWRhcHRlciB0aGF0IHJldHVybnMgYW5kIHRha2VzIG5hbWUgc3RyaW5ncyAoZW51bXMpLgotCSAqLwotCXByaXZhdGUgZmluYWwgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZGFwdGVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBlbGVtZW50IG5hbWUgaXMgPGNvZGU+dmFsdWU8L2NvZGU+LgotCSAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbW92ZSB0aGUgYXJyYXkgaW5pdGlhbGl6ZXIgaWYgaXQgaXMgZW1wdHkuCi0JICovCi0JcHVibGljIEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJdGhpcyhhbm5vdGF0aW9uQWRhcHRlciwgVkFMVUUpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbW92ZSB0aGUgYXJyYXkgaW5pdGlhbGl6ZXIgaWYgaXQgaXMgZW1wdHkuCi0JICovCi0JcHVibGljIEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQl0aGlzKGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgYm9vbGVhbiByZW1vdmVBcnJheUluaXRpYWxpemVyV2hlbkVtcHR5KSB7Ci0JCXRoaXMobmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBidWlsZEV4cHJlc3Npb25Db252ZXJ0ZXIocmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eSkpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZ1tdPiBidWlsZEV4cHJlc3Npb25Db252ZXJ0ZXIoYm9vbGVhbiByZW1vdmVBcnJheUluaXRpYWxpemVyV2hlbkVtcHR5KSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcihOYW1lU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpLCByZW1vdmVBcnJheUluaXRpYWxpemVyV2hlbkVtcHR5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZGFwdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCS8vIGlnbm9yZSB0aGUgYWRhcHRlcidzIGdldFZhbHVlKCkgLSB3ZSB3YW50IHRoZSBleHByZXNzaW9uCi0JCXJldHVybiB0aGlzLnJlc29sdmUodGhpcy5hZGFwdGVyLmdldEV4cHJlc3Npb24oZGVjbGFyYXRpb24pLCBkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nW10gdmFsdWUsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJdGhpcy5hZGFwdGVyLnNldFZhbHVlKHRoaXMuY29udmVydFRvU291cmNlQ29kZU5hbWVzKHZhbHVlLCBkZWNsYXJhdGlvbiksIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRFeHByZXNzaW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQVNUTm9kZSBnZXRBc3ROb2RlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRBc3ROb2RlKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiByZXNvbHZlIHRoZSBlbnVtcywgd2hpY2ggY2FuIGJlCi0JICogICAgIG51bGwKLQkgKiBvcgotCSAqICAgICB7Rk9PLCBCQVIsIEJBWn0KLQkgKiBvcgotCSAqICAgICBGT08KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gcmVzb2x2ZShFeHByZXNzaW9uIGV4cHJlc3Npb24sIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLkVNUFRZX1NUUklOR19BUlJBWTsKLQkJfSBlbHNlIGlmIChleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUikgewotCQkJcmV0dXJuIHRoaXMucmVzb2x2ZUFycmF5KChBcnJheUluaXRpYWxpemVyKSBleHByZXNzaW9uLCBkZWNsYXJhdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdGhpcy5yZXNvbHZlU2luZ2xlRWxlbWVudChleHByZXNzaW9uLCBkZWNsYXJhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gcmVzb2x2ZUFycmF5KEFycmF5SW5pdGlhbGl6ZXIgYWksIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCUxpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPSB0aGlzLmV4cHJlc3Npb25zKGFpKTsKLQkJaW50IGxlbiA9IGV4cHJlc3Npb25zLnNpemUoKTsKLQkJU3RyaW5nW10gZW51bXMgPSBuZXcgU3RyaW5nW2xlbl07Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJZW51bXNbaV0gPSB0aGlzLnJlc29sdmVFbnVtKGV4cHJlc3Npb25zLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIGVudW1zOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSByZXNvbHZlU2luZ2xlRWxlbWVudChFeHByZXNzaW9uIGVudW1FeHByZXNzaW9uLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHt0aGlzLnJlc29sdmVFbnVtKGVudW1FeHByZXNzaW9uKX07Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlRW51bShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJcmV0dXJuIEFTVFRvb2xzLnJlc29sdmVFbnVtKGV4cHJlc3Npb24pOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyhBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIpIHsKLQkJcmV0dXJuIGFycmF5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252ZXJ0IHRoZSBmdWxseS1xdWFsaWZpZWQgZW51bXMgdG8gbmFtZXMgdGhhdCBjYW4gYmUgaW5zZXJ0ZWQgaW4gc291cmNlIGNvZGUKLQkgKiBOQjogaW1wb3J0cyBtYXkgYmUgYWRkZWQgYXMgYSBzaWRlLWVmZmVjdCA6LSgKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gY29udmVydFRvU291cmNlQ29kZU5hbWVzKFN0cmluZ1tdIGVudW1zLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWlmIChlbnVtcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpbnQgbGVuID0gZW51bXMubGVuZ3RoOwotCQlTdHJpbmdbXSBzb3VyY2VDb2RlTmFtZXMgPSBuZXcgU3RyaW5nW2xlbl07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXNvdXJjZUNvZGVOYW1lc1tpXSA9IHRoaXMuY29udmVydFRvU291cmNlQ29kZU5hbWUoZW51bXNbaV0sIGRlY2xhcmF0aW9uKTsKLQkJfQotCQlyZXR1cm4gc291cmNlQ29kZU5hbWVzOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU291cmNlQ29kZU5hbWUoU3RyaW5nIGVudW1fLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuY29udmVydFRvU291cmNlQ29kZU5hbWUoZW51bV8sIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxY2JlMjkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci0KLS8qKgotICogV3JhcCBhIGRlY2xhcmF0aW9uIGFubm90YXRpb24gZWxlbWVudCBhZGFwdGVyIGFuZCBzaW1wbHkKLSAqIGFkZCBhbiBpbXBvcnQgZm9yIHRoZSBlbnVtIHdoZW4gbmVjZXNzYXJ5LgotICovCi1wdWJsaWMgY2xhc3MgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyCi0JaW1wbGVtZW50cyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+Ci17Ci0JLyoqCi0JICogVGhlIHdyYXBwZWQgYWRhcHRlciB0aGF0IHJldHVybnMgYW5kIHRha2VzIG5hbWUgc3RyaW5ncyAoZW51bXMpLgotCSAqLwotCXByaXZhdGUgZmluYWwgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWRhcHRlcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzIDxjb2RlPnZhbHVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJdGhpcyhhbm5vdGF0aW9uQWRhcHRlciwgVkFMVUUpOwotCX0KLQotCXB1YmxpYyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXRoaXMobmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgTmFtZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSkpOwotCX0KLQotCXByb3RlY3RlZCBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWRhcHRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMucmVzb2x2ZSh0aGlzLmFkYXB0ZXIuZ2V0RXhwcmVzc2lvbihkZWNsYXJhdGlvbikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzLmFkYXB0ZXIuc2V0VmFsdWUoY29udmVydFRvU291cmNlQ29kZU5hbWUodmFsdWUsIGRlY2xhcmF0aW9uKSwgZGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldEV4cHJlc3Npb24oZGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyBBU1ROb2RlIGdldEFzdE5vZGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldEFzdE5vZGUoZGVjbGFyYXRpb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIHJlc29sdmUgdGhlIGVudW0KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmUoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiBBU1RUb29scy5yZXNvbHZlRW51bShleHByZXNzaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252ZXJ0IHRoZSBmdWxseS1xdWFsaWZpZWQgZW51bSBjb25zdGFudCB0byBhIHN0YXRpYyBpbXBvcnQgYW5kIHRoZSBjb25zdGFudCdzIHNob3J0IG5hbWUsIGUuZy4KLQkgKiAgICAgc3RhdGljIGltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5GZXRjaFR5cGUuRUFHRVI7Ci0JICogICAgIHJldHVybiAiRUFHRVIiCi0JICogaWYgdGhhdCBkb2Vzbid0IHdvcmssIGNvbnZlcnQgdG8gYSBub3JtYWwgaW1wb3J0IGFuZCB0aGUgY29uc3RhbnQncyBwYXJ0aWFsbHktcXVhbGlmaWVkIG5hbWUsIGUuZy4KLQkgKiAgICAgaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkZldGNoVHlwZTsKLQkgKiAgICAgcmV0dXJuICJGZXRjaFR5cGUuRUFHRVIiCi0JICogaWYgdGhhdCBkb2Vzbid0IHdvcmssIHNpbXBseSByZXR1cm4gdGhlIGNvbnN0YW50J3MgZnVsbHktcXVhbGlmaWVkIG5hbWUsIGUuZy4KLQkgKiAgICAgcmV0dXJuICJqYXZheC5wZXJzaXN0ZW5jZS5GZXRjaFR5cGUuRUFHRVIiCi0JICogTkI6IGFuIGltcG9ydCBtYXkgYmUgYWRkZWQgYXMgYSBzaWRlLWVmZmVjdCA6LSgKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9Tb3VyY2VDb2RlTmFtZShTdHJpbmcgZW51bUNvbnN0YW50TmFtZSwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gKGVudW1Db25zdGFudE5hbWUgPT0gbnVsbCkgPyBudWxsIDogY29udmVydFRvU291cmNlQ29kZU5hbWVfKGVudW1Db25zdGFudE5hbWUsIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBlbnVtIGNvbnN0YW50IG5hbWUgaXMgbm9uLW51bGw7Ci0JICogY29udmVydCBpdCB0byBpdHMgc2hvcnQgdmVyc2lvbiBpZiB3ZSBjYW4gYWRkIGEgc3RhdGljIGltcG9ydCBldGMuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU291cmNlQ29kZU5hbWVfKFN0cmluZyBlbnVtQ29uc3RhbnROYW1lLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWlmIChkZWNsYXJhdGlvbi5hZGRTdGF0aWNJbXBvcnQoZW51bUNvbnN0YW50TmFtZSkpIHsKLQkJCXJldHVybiBjb252ZXJ0VG9TaG9ydE5hbWUoZW51bUNvbnN0YW50TmFtZSk7Ci0JCX0KLQkJaWYgKGRlY2xhcmF0aW9uLmFkZEltcG9ydChjb252ZXJ0VG9UeXBlTmFtZShlbnVtQ29uc3RhbnROYW1lKSkpIHsKLQkJCXJldHVybiBjb252ZXJ0VG9QYXJ0aWFsbHlRdWFsaWZpZWROYW1lKGVudW1Db25zdGFudE5hbWUpOwotCQl9Ci0JCXJldHVybiBlbnVtQ29uc3RhbnROYW1lOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1Nob3J0TmFtZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgY29udmVydFRvVHlwZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGFzdEluZGV4T2YoJy4nKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgY29udmVydFRvUGFydGlhbGx5UXVhbGlmaWVkTmFtZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZignLicsIG5hbWUubGFzdEluZGV4T2YoJy4nKSAtIDEpICsgMSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9FeHByZXNzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0V4cHJlc3Npb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2IwMzcwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0V4cHJlc3Npb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIE1vc3Qgb2J2aW91cyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJmYWNlLgotICogQXNzdW1lIHRoZSBlbGVtZW50J3MgdmFsdWUgaXMgYW4gRXhwcmVzc2lvbi4KLSAqLwotcHVibGljIGNsYXNzIEV4cHJlc3Npb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxFIGV4dGVuZHMgRXhwcmVzc2lvbj4KLQlpbXBsZW1lbnRzIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEU+Ci17Ci0JLyoqCi0JICogQWRhcHRlciB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIGVsZW1lbnQncyBhbm5vdGF0aW9uLgotCSAqLwotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcjsKLQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSByZWxldmFudCBhbm5vdGF0aW9uIGVsZW1lbnQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyA8Y29kZT52YWx1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIEV4cHJlc3Npb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXRoaXMoYW5ub3RhdGlvbkFkYXB0ZXIsIFZBTFVFKTsKLQl9Ci0KLQlwdWJsaWMgRXhwcmVzc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQl0aGlzLmFubm90YXRpb25BZGFwdGVyID0gYW5ub3RhdGlvbkFkYXB0ZXI7Ci0JCXRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEUgZ2V0VmFsdWUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkvLyByZXR1cm4gdGhlIGV4cHJlc3Npb24gdW5tb2RpZmllZAotCQlyZXR1cm4gdGhpcy5nZXRFeHByZXNzaW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShFIHZhbHVlLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMuc2V0VmFsdWUodmFsdWUsIHRoaXMuYW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgRSBnZXRFeHByZXNzaW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZXhwcmVzc2lvbih0aGlzLmFubm90YXRpb25BZGFwdGVyLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pKTsKLQl9Ci0KLQlwdWJsaWMgQVNUTm9kZSBnZXRBc3ROb2RlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRXhwcmVzc2lvbiBleHAgPSB0aGlzLmdldEV4cHJlc3Npb24oZGVjbGFyYXRpb24pOwotCQlyZXR1cm4gKGV4cCAhPSBudWxsKSA/IGV4cCA6IHRoaXMuYW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QXN0Tm9kZShkZWNsYXJhdGlvbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5lbGVtZW50TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4cHJlc3Npb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBleHByZXNzaW9uIHZhbHVlIG9mIHRoZSAqZmlyc3QqIGFubm90YXRpb24gZWxlbWVudAotCSAqIHdpdGggdGhlIGFkYXB0ZXIncyBlbGVtZW50IG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGFubm90YXRpb24gaGFzIG5vIHN1Y2ggZWxlbWVudC4KLQkgKiAoQW4gZWxlbWVudCBuYW1lIG9mICJ2YWx1ZSIgd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIGEgc2luZ2xlCi0JICogbWVtYmVyIGFubm90YXRpb24uKQotCSAqLwotCXByb3RlY3RlZCBFIGV4cHJlc3Npb24oQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLmV4cHJlc3Npb25Ob0Fubm90YXRpb24oKTsKLQkJfQotCQlpZiAoYW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSkgewotCQkJcmV0dXJuIHRoaXMuZXhwcmVzc2lvbk1hcmtlckFubm90YXRpb24oKE1hcmtlckFubm90YXRpb24pIGFubm90YXRpb24pOwotCQl9Ci0JCWlmIChhbm5vdGF0aW9uLmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKSB7Ci0JCQlyZXR1cm4gdGhpcy5leHByZXNzaW9uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgYW5ub3RhdGlvbik7Ci0JCX0KLQkJaWYgKGFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpIHsKLQkJCXJldHVybiB0aGlzLmV4cHJlc3Npb25Ob3JtYWxBbm5vdGF0aW9uKChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGFubm90YXRpb24gdHlwZTogIiArIGFubm90YXRpb24pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIEUgZXhwcmVzc2lvbk5vQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBleHByZXNzaW9uIHZhbHVlIG9mIHRoZSAqZmlyc3QqIGFubm90YXRpb24gZWxlbWVudAotCSAqIHdpdGggdGhlIGFkYXB0ZXIncyBlbGVtZW50IG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGFubm90YXRpb24gaGFzIG5vIHN1Y2ggZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgRSBleHByZXNzaW9uTWFya2VyQW5ub3RhdGlvbihAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTWFya2VyQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZXhwcmVzc2lvbiB2YWx1ZSBvZiB0aGUgKmZpcnN0KiBhbm5vdGF0aW9uIGVsZW1lbnQKLQkgKiB3aXRoIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCBuYW1lLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBhbm5vdGF0aW9uIGhhcyBubyBzdWNoIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEUgZXhwcmVzc2lvblNpbmdsZU1lbWJlckFubm90YXRpb24oU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmRvd25jYXN0KHRoaXMuZWxlbWVudE5hbWUuZXF1YWxzKFZBTFVFKSA/IGFubm90YXRpb24uZ2V0VmFsdWUoKSA6IG51bGwpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgRSBkb3duY2FzdChFeHByZXNzaW9uIGUpIHsKLQkJcmV0dXJuIChFKSBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZXhwcmVzc2lvbiB2YWx1ZSBvZiB0aGUgKmZpcnN0KiBhbm5vdGF0aW9uIGVsZW1lbnQKLQkgKiB3aXRoIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCBuYW1lLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBhbm5vdGF0aW9uIGhhcyBubyBzdWNoIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEUgZXhwcmVzc2lvbk5vcm1hbEFubm90YXRpb24oTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCU1lbWJlclZhbHVlUGFpciBwYWlyID0gdGhpcy5tZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbik7Ci0JCXJldHVybiB0aGlzLmRvd25jYXN0KChwYWlyID09IG51bGwpID8gbnVsbCA6IHBhaXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNldCB2YWx1ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBzZXQgbm9uLW51bGwsIG5vbi1lbXB0eSB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEV4cHJlc3Npb24gdmFsdWUsIEFubm90YXRpb24gYW5ub3RhdGlvbiwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdGhpcy5yZW1vdmVFbGVtZW50KGFubm90YXRpb24sIGRlY2xhcmF0aW9uKTsKLQkJfQotCQllbHNlIGlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCXRoaXMuc2V0VmFsdWVOb0Fubm90YXRpb24odmFsdWUsIGRlY2xhcmF0aW9uKTsKLQkJfQotCQllbHNlIGlmIChhbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKSB7Ci0JCQl0aGlzLnNldFZhbHVlTWFya2VyQW5ub3RhdGlvbih2YWx1ZSwgKE1hcmtlckFubm90YXRpb24pIGFubm90YXRpb24sIGRlY2xhcmF0aW9uKTsKLQkJfQotCQllbHNlIGlmIChhbm5vdGF0aW9uLmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKSB7Ci0JCQl0aGlzLnNldFZhbHVlU2luZ2xlTWVtYmVyQW5ub3RhdGlvbih2YWx1ZSwgKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGFubm90YXRpb24sIGRlY2xhcmF0aW9uKTsKLQkJfQotCQllbHNlIGlmIChhbm5vdGF0aW9uLmlzTm9ybWFsQW5ub3RhdGlvbigpKSB7Ci0JCQl0aGlzLnNldFZhbHVlTm9ybWFsQW5ub3RhdGlvbih2YWx1ZSwgKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb24sIGRlY2xhcmF0aW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gYW5ub3RhdGlvbiB0eXBlOiAiICsgYW5ub3RhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIGFkZCBub24tbnVsbCwgbm9uLWVtcHR5IHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVOb0Fubm90YXRpb24oRXhwcmVzc2lvbiB2YWx1ZSwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlpZiAodGhpcy5lbGVtZW50TmFtZS5lcXVhbHMoVkFMVUUpKSB7Ci0JCQkvLyBARm9vKCJ4eHgiKQotCQkJdGhpcy5hbm5vdGF0aW9uQWRhcHRlci5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBARm9vKGJhcj0ieHh4IikKLQkJCXRoaXMuYWRkVmFsdWUodmFsdWUsIHRoaXMuYW5ub3RhdGlvbkFkYXB0ZXIubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbikpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWUoRXhwcmVzc2lvbiB2YWx1ZSwgTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXRoaXMuYWRkVmFsdWUodmFsdWUsIGFubm90YXRpb24sIHRoaXMuZWxlbWVudE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFZhbHVlKEV4cHJlc3Npb24gdmFsdWUsIE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGFubm90YXRpb25FbGVtZW50TmFtZSkgewotCQlBU1QgYXN0ID0gYW5ub3RhdGlvbi5nZXRBU1QoKTsKLQkJTWVtYmVyVmFsdWVQYWlyIHBhaXIgPSBhc3QubmV3TWVtYmVyVmFsdWVQYWlyKCk7Ci0JCXBhaXIuc2V0TmFtZShhc3QubmV3U2ltcGxlTmFtZShhbm5vdGF0aW9uRWxlbWVudE5hbWUpKTsKLQkJcGFpci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCUxpc3Q8TWVtYmVyVmFsdWVQYWlyPiB2YWx1ZXMgPSB0aGlzLnZhbHVlcyhhbm5vdGF0aW9uKTsKLQkJdmFsdWVzLmFkZChwYWlyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVNYXJrZXJBbm5vdGF0aW9uKEV4cHJlc3Npb24gdmFsdWUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBNYXJrZXJBbm5vdGF0aW9uIGFubm90YXRpb24sIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJLy8gQEZvbyA9PiBARm9vKCJ4eHgiKQotCQkvLyAgICAgb3IKLQkJLy8gQEZvbyA9PiBARm9vKGJhcj0ieHh4IikKLQkJdGhpcy5zZXRWYWx1ZU5vQW5ub3RhdGlvbih2YWx1ZSwgZGVjbGFyYXRpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlU2luZ2xlTWVtYmVyQW5ub3RhdGlvbihFeHByZXNzaW9uIHZhbHVlLCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24sIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaWYgKHRoaXMuZWxlbWVudE5hbWUuZXF1YWxzKFZBTFVFKSkgewotCQkJLy8gQEZvbygieXl5IikgPT4gQEZvbygieHh4IikKLQkJCWFubm90YXRpb24uc2V0VmFsdWUodmFsdWUpOwotCQl9IGVsc2UgewotCQkJLy8gQEZvbygieXl5IikgPT4gQEZvbyh2YWx1ZT0ieXl5IiwgYmFyPSJ4eHgiKQotCQkJRXhwcmVzc2lvbiB2diA9IGFubm90YXRpb24uZ2V0VmFsdWUoKTsKLQkJCXZ2ID0gKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodnYuZ2V0QVNUKCksIHZ2KTsKLQkJCU5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiA9IHRoaXMuYW5ub3RhdGlvbkFkYXB0ZXIubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl0aGlzLmFkZFZhbHVlKHZ2LCBub3JtYWxBbm5vdGF0aW9uLCBWQUxVRSk7Ci0JCQl0aGlzLmFkZFZhbHVlKHZhbHVlLCBub3JtYWxBbm5vdGF0aW9uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlTm9ybWFsQW5ub3RhdGlvbihFeHByZXNzaW9uIHZhbHVlLCBOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCU1lbWJlclZhbHVlUGFpciBwYWlyID0gdGhpcy5tZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbik7Ci0JCWlmIChwYWlyID09IG51bGwpIHsKLQkJCXRoaXMuYWRkVmFsdWUodmFsdWUsIGFubm90YXRpb24pOwotCQl9IGVsc2UgewotCQkJcGFpci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGVsZW1lbnQgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRWxlbWVudChBbm5vdGF0aW9uIGFubm90YXRpb24sIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgewotCQkJdGhpcy5yZW1vdmVFbGVtZW50Tm9Bbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJfQotCQllbHNlIGlmIChhbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKSB7Ci0JCQl0aGlzLnJlbW92ZUVsZW1lbnRNYXJrZXJBbm5vdGF0aW9uKChNYXJrZXJBbm5vdGF0aW9uKSBhbm5vdGF0aW9uLCBkZWNsYXJhdGlvbik7Ci0JCX0KLQkJZWxzZSBpZiAoYW5ub3RhdGlvbi5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSkgewotCQkJdGhpcy5yZW1vdmVFbGVtZW50U2luZ2xlTWVtYmVyQW5ub3RhdGlvbigoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgYW5ub3RhdGlvbiwgZGVjbGFyYXRpb24pOwotCQl9Ci0JCWVsc2UgaWYgKGFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpIHsKLQkJCXRoaXMucmVtb3ZlRWxlbWVudE5vcm1hbEFubm90YXRpb24oKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb24sIGRlY2xhcmF0aW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gYW5ub3RhdGlvbiB0eXBlOiAiICsgYW5ub3RhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUVsZW1lbnROb0Fubm90YXRpb24oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJLy8gdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBnb25lICg/KQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUVsZW1lbnRNYXJrZXJBbm5vdGF0aW9uKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBNYXJrZXJBbm5vdGF0aW9uIGFubm90YXRpb24sIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCS8vIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgZ29uZSAoPykKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbGVtZW50U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWlmICh0aGlzLmVsZW1lbnROYW1lLmVxdWFscyhWQUxVRSkpIHsKLQkJCS8vIEBGb28oInh4eCIpID0+IEBGb28KLQkJCXRoaXMuYW5ub3RhdGlvbkFkYXB0ZXIubmV3TWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQkvLyB0aGUgW25vbi0ndmFsdWUnXSBlbGVtZW50IGlzIGFscmVhZHkgZ29uZSAoPykKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUVsZW1lbnROb3JtYWxBbm5vdGF0aW9uKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlMaXN0PE1lbWJlclZhbHVlUGFpcj4gdmFsdWVzID0gdGhpcy52YWx1ZXMoYW5ub3RhdGlvbik7Ci0JCWlmICgodmFsdWVzLnNpemUoKSA9PSAxKSAmJiB2YWx1ZXMuZ2V0KDApLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHModGhpcy5lbGVtZW50TmFtZSkpIHsKLQkJCS8vIEBGb28oYmFyPSJ4eHgiKSA9PiBARm9vCi0JCQl0aGlzLmFubm90YXRpb25BZGFwdGVyLm5ld01hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl9IGVsc2UgewotCQkJdGhpcy5yZW1vdmVFbGVtZW50KGFubm90YXRpb24pOwotCQkJaWYgKHZhbHVlcy5zaXplKCkgPT0gMSkgewotCQkJCU1lbWJlclZhbHVlUGFpciBwYWlyID0gdmFsdWVzLmdldCgwKTsKLQkJCQlpZiAocGFpci5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKFZBTFVFKSkgewotCQkJCQkvLyBARm9vKGJhcj0ieHh4IiwgdmFsdWU9Inl5eSIpID0+IEBGb28oInl5eSIpCi0JCQkJCUV4cHJlc3Npb24gdnYgPSBwYWlyLmdldFZhbHVlKCk7Ci0JCQkJCXZ2ID0gKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodnYuZ2V0QVNUKCksIHZ2KTsKLQkJCQkJdGhpcy5hbm5vdGF0aW9uQWRhcHRlci5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKS5zZXRWYWx1ZSh2dik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gQEZvbyhiYXI9Inh4eCIsIGJhej0ieXl5IikgPT4gQEZvbyhiYXo9Inl5eSIpCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBARm9vKGJhcj0ieHh4IiwgYmF6PSJ5eXkiLCBqb289Inh4eCIpID0+IEBGb28oYmF6PSJ5eXkiLCBqb289Inh4eCIpCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlICpmaXJzdCogbWVtYmVyIHZhbHVlIHBhaXIgZnJvbSB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gZWxlbWVudAotCSAqIHdpdGggdGhlIGFkYXB0ZXIncyBlbGVtZW50IG5hbWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRWxlbWVudChOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJZm9yIChJdGVyYXRvcjxNZW1iZXJWYWx1ZVBhaXI+IHN0cmVhbSA9IHRoaXMudmFsdWVzKGFubm90YXRpb24pLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTWVtYmVyVmFsdWVQYWlyIHBhaXIgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHBhaXIuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyh0aGlzLmVsZW1lbnROYW1lKSkgewotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgKmZpcnN0KiBtZW1iZXIgdmFsdWUgcGFpciBmb3IgdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIGVsZW1lbnQKLQkgKiB3aXRoIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCBuYW1lLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBhbm5vdGF0aW9uIGhhcyBubyBzdWNoIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCWZvciAoTWVtYmVyVmFsdWVQYWlyIHBhaXIgOiB0aGlzLnZhbHVlcyhhbm5vdGF0aW9uKSkgewotCQkJaWYgKHBhaXIuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyh0aGlzLmVsZW1lbnROYW1lKSkgewotCQkJCXJldHVybiBwYWlyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0PE1lbWJlclZhbHVlUGFpcj4gdmFsdWVzKE5vcm1hbEFubm90YXRpb24gbmEpIHsKLQkJcmV0dXJuIG5hLnZhbHVlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvR2VuZXJpY1Zpc2l0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0dlbmVyaWNWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMTYwYWYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvR2VuZXJpY1Zpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFub255bW91c0NsYXNzRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5QWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUNyZWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFzc2VydFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJsb2NrQ29tbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9vbGVhbkxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJyZWFrU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5DYXN0RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ2F0Y2hDbGF1c2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNoYXJhY3RlckxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNsYXNzSW5zdGFuY2VDcmVhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db25kaXRpb25hbEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbnN0cnVjdG9ySW52b2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29udGludWVTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkRvU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbXB0eVN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW5oYW5jZWRGb3JTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVudW1Db25zdGFudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb25TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkQWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Gb3JTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklmU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JbXBvcnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSW5maXhFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Jbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSW5zdGFuY2VvZkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkphdmFkb2M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkxhYmVsZWRTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkxpbmVDb21tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZEludm9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kUmVmUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Nb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTnVsbExpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bWJlckxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUGFyYW1ldGVyaXplZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Qb3N0Zml4RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUHJlZml4RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUHJpbWl0aXZlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUXVhbGlmaWVkVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUmV0dXJuU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3VwZXJGaWVsZEFjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3VwZXJNZXRob2RJbnZvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Td2l0Y2hDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Td2l0Y2hTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN5bmNocm9uaXplZFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVGFnRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVGV4dEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlRoaXNFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UaHJvd1N0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHJ5U3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvblN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLldoaWxlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5XaWxkY2FyZFR5cGU7Ci0KLS8qKgotICogY29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC5kb20uR2VuZXJpY1Zpc2l0b3IKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNWaXNpdG9yIGV4dGVuZHMgQVNUVmlzaXRvciB7Ci0KLQlwdWJsaWMgR2VuZXJpY1Zpc2l0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEdlbmVyaWNWaXNpdG9yKGJvb2xlYW4gdmlzaXRKYXZhZG9jVGFncykgewotCQlzdXBlcih2aXNpdEphdmFkb2NUYWdzKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGhvb2tzIGZvciBzdWJjbGFzc2VzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBib29sZWFuIHZpc2l0XyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQVNUTm9kZSBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZFZpc2l0XyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQVNUTm9kZSBub2RlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlBY2Nlc3Mgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheUNyZWF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlJbml0aWFsaXplciBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEFycmF5VHlwZSBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEFzc2VydFN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEFzc2lnbm1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChCbG9jayBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEJvb2xlYW5MaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQnJlYWtTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChDYXN0RXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KENhdGNoQ2xhdXNlIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQ2hhcmFjdGVyTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KENsYXNzSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KENvbXBpbGF0aW9uVW5pdCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KENvbnRpbnVlU3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoRG9TdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChFbXB0eVN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChGaWVsZEFjY2VzcyBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEZpZWxkRGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChGb3JTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJZlN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEltcG9ydERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSW5maXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSW5zdGFuY2VvZkV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJbml0aWFsaXplciBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEphdmFkb2Mgbm9kZSkgewotCQlyZXR1cm4gKHN1cGVyLnZpc2l0KG5vZGUpKSA/IHZpc2l0Xyhub2RlKSA6IGZhbHNlOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChMYWJlbGVkU3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTnVsbExpdGVyYWwgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChOdW1iZXJMaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUGFja2FnZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUGFyZW50aGVzaXplZEV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQb3N0Zml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFByZWZpeEV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQcmltaXRpdmVUeXBlIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUXVhbGlmaWVkTmFtZSBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFJldHVyblN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFNpbXBsZU5hbWUgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW1wbGVUeXBlIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoU3RyaW5nTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoU3VwZXJGaWVsZEFjY2VzcyBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFN3aXRjaENhc2Ugbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUaGlzRXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFRocm93U3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVHJ5U3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZUxpdGVyYWwgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoV2hpbGVTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEJsb2NrQ29tbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEVuaGFuY2VkRm9yU3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoRW51bUNvbnN0YW50RGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChFbnVtRGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChMaW5lQ29tbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KE1hcmtlckFubm90YXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZW1iZXJSZWYgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZW1iZXJWYWx1ZVBhaXIgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2RSZWYgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2RSZWZQYXJhbWV0ZXIgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNb2RpZmllciBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KE5vcm1hbEFubm90YXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQYXJhbWV0ZXJpemVkVHlwZSBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFF1YWxpZmllZFR5cGUgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVGFnRWxlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFRleHRFbGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZVBhcmFtZXRlciBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFdpbGRjYXJkVHlwZSBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQXJyYXlBY2Nlc3Mgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFycmF5Q3JlYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFycmF5SW5pdGlhbGl6ZXIgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFycmF5VHlwZSBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQXNzZXJ0U3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChBc3NpZ25tZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChCbG9jayBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQm9vbGVhbkxpdGVyYWwgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEJyZWFrU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChDYXN0RXhwcmVzc2lvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQ2F0Y2hDbGF1c2Ugbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENoYXJhY3RlckxpdGVyYWwgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENsYXNzSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQ29tcGlsYXRpb25Vbml0IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQ29udGludWVTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KERvU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChFbXB0eVN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoRXhwcmVzc2lvblN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoRmllbGRBY2Nlc3Mgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEZpZWxkRGVjbGFyYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEZvclN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoSWZTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEltcG9ydERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChJbmZpeEV4cHJlc3Npb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEluc3RhbmNlb2ZFeHByZXNzaW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChJbml0aWFsaXplciBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoSmF2YWRvYyBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoTGFiZWxlZFN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE1ldGhvZEludm9jYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE51bGxMaXRlcmFsIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChOdW1iZXJMaXRlcmFsIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQYWNrYWdlRGVjbGFyYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQb3N0Zml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoUHJlZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoUHJpbWl0aXZlVHlwZSBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoUXVhbGlmaWVkTmFtZSBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoUmV0dXJuU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTaW1wbGVOYW1lIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTaW1wbGVUeXBlIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTdHJpbmdMaXRlcmFsIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU3VwZXJGaWVsZEFjY2VzcyBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTd2l0Y2hDYXNlIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN5bmNocm9uaXplZFN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVGhpc0V4cHJlc3Npb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFRocm93U3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChUcnlTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFR5cGVEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChUeXBlTGl0ZXJhbCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoV2hpbGVTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEJsb2NrQ29tbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoRW5oYW5jZWRGb3JTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEVudW1Db25zdGFudERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChFbnVtRGVjbGFyYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KExpbmVDb21tZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChNYXJrZXJBbm5vdGF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChNZW1iZXJSZWYgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE1lbWJlclZhbHVlUGFpciBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoTWV0aG9kUmVmIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChNZXRob2RSZWZQYXJhbWV0ZXIgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE1vZGlmaWVyIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChOb3JtYWxBbm5vdGF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQYXJhbWV0ZXJpemVkVHlwZSBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoUXVhbGlmaWVkVHlwZSBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVGFnRWxlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVGV4dEVsZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFR5cGVQYXJhbWV0ZXIgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFdpbGRjYXJkVHlwZSBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSW5kZXhlZENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSW5kZXhlZENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTg0YjVhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0luZGV4ZWRDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBXcmFwIGEgZGVjbGFyYXRpb24gYW5ub3RhdGlvbiBlbGVtZW50IGFkYXB0ZXIgdGhhdCBkZWFscyB3aXRoIEFTVAotICogYXJyYXkgZXhwcmVzc2lvbnMsIGNvbnZlcnRpbmcgdGhlbSB0by9mcm9tIHZhcmlvdXMgb3RoZXIgb2JqZWN0cy4KLSAqIAotICogQHBhcmFtIDxUPiB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGluIHRoZSBhcnJheSB0byBiZSBwYXNzZWQgdG8gYW5kCi0gKiByZXR1cm5lZCBieSB0aGUgYWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgSW5kZXhlZENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPgotCWV4dGVuZHMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFRbXT4KLQlpbXBsZW1lbnRzIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPgotewotCXB1YmxpYyBJbmRleGVkQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIEluZGV4ZWRFeHByZXNzaW9uQ29udmVydGVyPFQ+IGNvbnZlcnRlcikgewotCQlzdXBlcihhbm5vdGF0aW9uQWRhcHRlciwgY29udmVydGVyKTsKLQl9Ci0KLQlwdWJsaWMgSW5kZXhlZENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIEluZGV4ZWRFeHByZXNzaW9uQ29udmVydGVyPFQ+IGNvbnZlcnRlcikgewotCQlzdXBlcihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGNvbnZlcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIEluZGV4ZWRFeHByZXNzaW9uQ29udmVydGVyPFQ+IGdldENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIChJbmRleGVkRXhwcmVzc2lvbkNvbnZlcnRlcjxUPikgdGhpcy5jb252ZXJ0ZXI7Ci0JfQotCi0JcHVibGljIEV4cHJlc3Npb24gc2VsZWN0RXhwcmVzc2lvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udmVydGVyKCkuc2VsZWN0RXhwcmVzc2lvbih0aGlzLmdldEV4cHJlc3Npb24oZGVjbGFyYXRpb24pLCBpbmRleCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUQW5ub3RhdGVkRWxlbWVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUQW5ub3RhdGVkRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTE3MWZlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVEFubm90YXRlZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5Mb2NhdGlvbktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLQotLyoqCi0gKiBBZGFwdCBhbmQgZXh0ZW5kIGEgSkRUIG1lbWJlciB3aXRoIHNpbXBsaWZpZWQgYW5ub3RhdGlvbiBoYW5kbGluZy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEpEVEFubm90YXRlZEVsZW1lbnQKLQlpbXBsZW1lbnRzIEFubm90YXRlZEVsZW1lbnQKLXsKLQotCS8qKiB0aGUgYW5ub3RhdGVkIGVsZW1lbnQncyBuYW1lIChkdWgpICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIHRoZSBjb21waWxhdGlvbiB1bml0IChmaWxlKSBjb250YWluaW5nIHRoZSBhbm5vdGF0ZWQgZWxlbWVudDsKLQkgKiB1c2VkIGZvciBidWlsZGluZyBhbiBBU1Qgd2hlbiB3ZSBtb2RpZnkgdGhlIGFubm90YXRlZCBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSBmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdDsKLQotCS8qKgotCSAqIHRoaXMgYWxsb3dzIGNsaWVudHMgdG8gcHJvdmlkZSBhIHdheSB0byBtb2RpZnkgdGhlIGNvbXBpbGF0aW9uIHVuaXQKLQkgKiAoZmlsZSkgd2hlbiBpdCBpcyBvcGVuIGluIGFuIGVkaXRvciBhbmQgc2hvdWxkIGJlIG1vZGlmaWVkIG9uIHRoZSBVSQotCSAqIHRocmVhZAotCSAqLwotCXByaXZhdGUgZmluYWwgQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yOwotCi0JLyoqIHRoaXMgd2lsbCBmb3JtYXQgdGhlIGFubm90YXRlZCBlbGVtZW50J3MgYW5ub3RhdGlvbnMgYSBiaXQgKi8KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIEpEVEFubm90YXRlZEVsZW1lbnQoCi0JCQlTdHJpbmcgbmFtZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXRoaXMobmFtZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBKRFRBbm5vdGF0ZWRFbGVtZW50KAotCQkJU3RyaW5nIG5hbWUsCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwKLQkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuY29tcGlsYXRpb25Vbml0ID0gY29tcGlsYXRpb25Vbml0OwotCQl0aGlzLm1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yID0gbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3I7Ci0JCXRoaXMuYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgPSBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQW5ub3RhdGVkRWxlbWVudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IE1vZGlmaWVkRGVjbGFyYXRpb24gZ2V0TW9kaWZpZWREZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JcHVibGljIE1vZGlmaWVkRGVjbGFyYXRpb24gZ2V0TW9kaWZpZWREZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlZGl0aW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIEVkaXQgdGhlIG1lbWJlciB3aXRoIHRoZSBzcGVjaWZpZWQgZWRpdG9yLgotCSAqIFRoZSBlZGl0b3Igd2lsbCBiZSBpbnZva2VkIG9uY2UgdGhlIG1lbWJlcidzIGNvbXBpbGF0aW9uIHVuaXQKLQkgKiBpcyBpbiBhbiBlZGl0YWJsZSBzdGF0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlZGl0KEVkaXRvciBlZGl0b3IpIHsKLQkJdHJ5IHsKLQkJCXRoaXMuZWRpdF8oZWRpdG9yKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOQjogQmUgY2FyZWZ1bCBjaGFuZ2luZyB0aGlzIG1ldGhvZC4KLQkgKiBUaGluZ3MgdG8gbG9vayBvdXQgZm9yOgotCSAqICAgICAtIHdoZW4gZWRpdGluZyB2aWEgdGhlIEphdmFFZGl0b3IgdGhlcmUgaXMgbm8gbmVlZCB0byBjcmVhdGUgYSB3b3JraW5nIGNvcHkKLQkgKiAgICAgLSB3aGVuIGVkaXRpbmcgd2l0aG91dCBhbiBlZGl0b3Igb3IgdmlhIGEgc2ltcGxlIHRleHQgZWRpdG9yLCBhICJ3b3JraW5nIGNvcHkiIG11c3QgYmUgY3JlYXRlZC4KLQkgKiAgICAgICAgKGF0IGxlYXN0IGFzIGZhciBhcyBJIGNhbiB0ZWxsICB+a2ZtKQotCSAqICAgICAtIHNoYXJlZERvY3VtZW50IGlzIG9ubHkgZXZlciBmYWxzZSBpbiB0ZXN0cyAoaGVhZGxlc3MgbW9kZSkuICBJbiB0aGUgVUksIGV2ZW4gaWYgdGhlIGZpbGUKLQkgKiAgICAgICAgaXMgbm90IG9wZW4gaW4gYW4gZWRpdG9yLCBzaGFyZWREb2N1bWVudCBpcyBzdGlsbCB0cnVlIChidWZmZXIgaXMgbm90IG51bGwpCi0JICogICAgIC0gaWYgYSB3b3JraW5nIGNvcHkgaXMgY3JlYXRlZCwgdGhlbiB3ZSBtdXN0IGRpc2NhcmQgaXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlZGl0XyhFZGl0b3IgZWRpdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gY3JlYXRlV29ya2luZ0NvcHkgPSAhIHRoaXMuY29tcGlsYXRpb25Vbml0LmlzV29ya2luZ0NvcHkoKTsKLQkJaWYgKGNyZWF0ZVdvcmtpbmdDb3B5KSB7Ci0JCQl0aGlzLmNvbXBpbGF0aW9uVW5pdC5iZWNvbWVXb3JraW5nQ29weShudWxsKTsKLQkJfQotCi0JCUlUZXh0RmlsZUJ1ZmZlciBidWZmZXIgPSBGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKS5nZXRUZXh0RmlsZUJ1ZmZlcih0aGlzLmNvbXBpbGF0aW9uVW5pdC5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCksIExvY2F0aW9uS2luZC5OT1JNQUxJWkUpOwotCQlib29sZWFuIHNoYXJlZERvY3VtZW50ID0gKGJ1ZmZlciAhPSBudWxsKTsgIC8vIGRvY3VtZW50cyBhcmUgdHlwaWNhbGx5IHNoYXJlZCB3aGVuIHRoZXkgYXJlIGFscmVhZHkgb3BlbiBpbiBhbiBlZGl0b3IKLQkJSURvY3VtZW50IGRvYyA9IHNoYXJlZERvY3VtZW50ID8KLQkJCQlidWZmZXIuZ2V0RG9jdW1lbnQoKSA6Ci0JCQkJbmV3IERvY3VtZW50KHRoaXMuY29tcGlsYXRpb25Vbml0LmdldEJ1ZmZlcigpLmdldENvbnRlbnRzKCkpOwotCi0JCXRyeSB7Ci0JCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KCk7Ci0JCQlhc3RSb290LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsKLQkKLQkJCWVkaXRvci5lZGl0KHRoaXMuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbihhc3RSb290KSk7Ci0JCi0JCQlUZXh0RWRpdCBlZGl0cyA9IGFzdFJvb3QucmV3cml0ZShkb2MsIHRoaXMuY29tcGlsYXRpb25Vbml0LmdldEphdmFQcm9qZWN0KCkuZ2V0T3B0aW9ucyh0cnVlKSk7Ci0JCQlpZiAoc2hhcmVkRG9jdW1lbnQpIHsKLQkJCQl0aGlzLm1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLmV4ZWN1dGUobmV3IE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZChlZGl0cywgZG9jKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuYXBwbHlFZGl0cyhlZGl0cywgZG9jKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChjcmVhdGVXb3JraW5nQ29weSkgewotCQkJCS8vZGlzY2FyZFdvcmtpbmdDb3B5IG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYmVjb21lV29ya2luZ0NvcHkgaXMgY2FsbGVkLgotCQkJCXRoaXMuY29tcGlsYXRpb25Vbml0LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKGRvYy5nZXQoKSk7Ci0JCQkJdGhpcy5jb21waWxhdGlvblVuaXQuY29tbWl0V29ya2luZ0NvcHkodHJ1ZSwgbnVsbCk7ICAvLyB0cnVlPSJmb3JjZSIKLQkJCQl0aGlzLmNvbXBpbGF0aW9uVW5pdC5kaXNjYXJkV29ya2luZ0NvcHkoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGFwcGx5IHRoZSBzcGVjaWZpZWQgZWRpdHMgdG8gdGhlIHNwZWNpZmllZCBkb2N1bWVudCwKLQkgKiByZWZvcm1hdHRpbmcgdGhlIGRvY3VtZW50IGlmIG5lY2Vzc2FyeQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFwcGx5RWRpdHMoVGV4dEVkaXQgZWRpdHMsIElEb2N1bWVudCBkb2MpIHRocm93cyBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWVkaXRzLmFwcGx5KGRvYywgVGV4dEVkaXQuVVBEQVRFX1JFR0lPTlMpOwotCQl0aGlzLmFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmZvcm1hdChkb2MsIGVkaXRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcGlsYXRpb25Vbml0IGJ1aWxkQVNUUm9vdCgpIHsKLQkJcmV0dXJuIEFTVFRvb2xzLmJ1aWxkQVNUUm9vdCh0aGlzLmNvbXBpbGF0aW9uVW5pdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1vZGlmeSBzaGFyZWQgZG9jdW1lbnQgY29tbWFuZCBjbGFzcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBzaW1wbGUgY29tbWFuZCB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIG1lbWJlciB0byBhcHBseSB0aGUgZWRpdHMKLQkgKiBpbiB0aGUgc2FtZSB3YXkgYXMgaWYgdGhlIGRvY3VtZW50IHdlcmUgbm90IHNoYXJlZAotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmQKLQkJaW1wbGVtZW50cyBDb21tYW5kCi0JewotCQlwcml2YXRlIGZpbmFsIFRleHRFZGl0IGVkaXRzOwotCQlwcml2YXRlIGZpbmFsIElEb2N1bWVudCBkb2M7Ci0KLQkJcHJvdGVjdGVkIE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZChUZXh0RWRpdCBlZGl0cywgSURvY3VtZW50IGRvYykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZWRpdHMgPSBlZGl0czsKLQkJCXRoaXMuZG9jID0gZG9jOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRyeSB7Ci0JCQkJSkRUQW5ub3RhdGVkRWxlbWVudC50aGlzLmFwcGx5RWRpdHModGhpcy5lZGl0cywgdGhpcy5kb2MpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRFbnVtLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRFbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZWQ1OGIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRURW51bS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQWJzdHJhY3RUeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bUNvbnN0YW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVudW1EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kRXhlY3V0b3I7Ci0KLS8qKgotICogQWRhcHQgYW5kIGV4dGVuZCBhIEpEVCBlbnVtLgotICovCi1wdWJsaWMgY2xhc3MgSkRURW51bQotCWV4dGVuZHMgQWJzdHJhY3RKRFRUeXBlCi0JaW1wbGVtZW50cyBFbnVtCi17Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvciBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQncyBwcmltYXJ5IHR5cGUsIGFuIGVudW0KLQkgKi8KLQlwdWJsaWMgSkRURW51bSgKLQkJCUVudW1EZWNsYXJhdGlvbiBlbnVtRGVjbGFyYXRpb24sCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcikgewotCQl0aGlzKGVudW1EZWNsYXJhdGlvbiwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCdzIHByaW1hcnkgdHlwZSwgYW4gZW51bQotCSAqLwotCXB1YmxpYyBKRFRFbnVtKAotCQkJRW51bURlY2xhcmF0aW9uIGVudW1EZWNsYXJhdGlvbiwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLAotCQkJQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpIHsKLQkJc3VwZXIobnVsbCwgZW51bURlY2xhcmF0aW9uLCAxLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcik7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIG5lc3RlZCBlbnVtcwotCSAqLwotCXB1YmxpYyBKRFRFbnVtKAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJRW51bURlY2xhcmF0aW9uIGVudW1EZWNsYXJhdGlvbiwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IpIHsKLQkJdGhpcyhkZWNsYXJpbmdUeXBlLCBlbnVtRGVjbGFyYXRpb24sIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvciBmb3IgbmVzdGVkIGVudW1zCi0JICovCi0JcHVibGljIEpEVEVudW0oCi0JCQlUeXBlIGRlY2xhcmluZ1R5cGUsCi0JCQlFbnVtRGVjbGFyYXRpb24gZW51bURlY2xhcmF0aW9uLAotCQkJaW50IG9jY3VycmVuY2UsCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwKLQkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKSB7Ci0JCXN1cGVyKGRlY2xhcmluZ1R5cGUsIGVudW1EZWNsYXJhdGlvbiwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpOwotCX0KLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciB0ZXN0aW5nCi0JICovCi0JcHVibGljIEpEVEVudW0oVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgbmFtZSwgaW50IG9jY3VycmVuY2UsIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7Ci0JCXN1cGVyKGRlY2xhcmluZ1R5cGUsIG5hbWUsIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVudW1EZWNsYXJhdGlvbiBnZXRCb2R5RGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIChFbnVtRGVjbGFyYXRpb24pIHN1cGVyLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RhYmxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbltdIGdldEVudW1Db25zdGFudHMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJTGlzdDxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gZW51bUNvbnN0YW50cyA9IGVudW1Db25zdGFudHMoZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQkJcmV0dXJuIGVudW1Db25zdGFudHMudG9BcnJheShuZXcgRW51bUNvbnN0YW50RGVjbGFyYXRpb25bZW51bUNvbnN0YW50cy5zaXplKCldKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBMaXN0PEVudW1Db25zdGFudERlY2xhcmF0aW9uPiBlbnVtQ29uc3RhbnRzKEVudW1EZWNsYXJhdGlvbiBlZCkgewotCQlyZXR1cm4gZWQuZW51bUNvbnN0YW50cygpOwotCX0KLQotCQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVudW1EZWNsYXJhdGlvbiBnZXRUb3BMZXZlbFR5cGVEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gKEVudW1EZWNsYXJhdGlvbikgc3VwZXIuZ2V0VG9wTGV2ZWxUeXBlRGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVudW1EZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oTGlzdDxBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbj4gdHlwZURlY2xhcmF0aW9ucykgewotCQlyZXR1cm4gKEVudW1EZWNsYXJhdGlvbikgc3VwZXIuZ2V0VHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbnMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFbnVtRGVjbGFyYXRpb24gZ2V0TmVzdGVkVHlwZURlY2xhcmF0aW9uKFR5cGVEZWNsYXJhdGlvbiBkZWNsYXJpbmdUeXBlRGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZURlY2xhcmF0aW9uKGdldEVudW1zKGRlY2xhcmluZ1R5cGVEZWNsYXJhdGlvbikpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFbnVtRGVjbGFyYXRpb24gZ2V0VHlwZURlY2xhcmF0aW9uKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uW10gdHlwZURlY2xhcmF0aW9ucykgewotCQlyZXR1cm4gKEVudW1EZWNsYXJhdGlvbikgc3VwZXIuZ2V0VHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbnMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgZ2V0QVNUTm9kZVR5cGUoKSB7Ci0JCXJldHVybiBBU1ROb2RlLkVOVU1fREVDTEFSQVRJT047Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRURW51bUNvbnN0YW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRFbnVtQ29uc3RhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEzNTI5NS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRFbnVtQ29uc3RhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bUNvbnN0YW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVudW1EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVZhcmlhYmxlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FbnVtQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZEV4ZWN1dG9yOwotCi0vKioKLSAqIEFkYXB0IGFuZCBleHRlbmQgYSBKRFQgZW51bSBjb25zdGFudC4KLSAqLwotcHVibGljIGNsYXNzIEpEVEVudW1Db25zdGFudAotCWV4dGVuZHMgSkRUTWVtYmVyCi0JaW1wbGVtZW50cyBFbnVtQ29uc3RhbnQKLXsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBKRFRFbnVtQ29uc3RhbnQoCi0JCQlFbnVtIGRlY2xhcmluZ0VudW0sCi0JCQlTdHJpbmcgbmFtZSwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IpIHsKLQkJdGhpcyhkZWNsYXJpbmdFbnVtLCBuYW1lLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCQotCXB1YmxpYyBKRFRFbnVtQ29uc3RhbnQoCi0JCQlFbnVtIGRlY2xhcmluZ0VudW0sCi0JCQlTdHJpbmcgbmFtZSwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsCi0JCQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcikgewotCQlzdXBlcihkZWNsYXJpbmdFbnVtLCBuYW1lLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcik7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIHRlc3RpbmcKLQkgKi8KLQlwdWJsaWMgSkRURW51bUNvbnN0YW50KEVudW0gZGVjbGFyaW5nRW51bSwgU3RyaW5nIG5hbWUsIGludCBvY2N1cnJlbmNlLCBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCkgewotCQl0aGlzKGRlY2xhcmluZ0VudW0sIG5hbWUsIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgQ29tbWFuZEV4ZWN1dG9yLkRlZmF1bHQuaW5zdGFuY2UoKSwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFbnVtIGdldERlY2xhcmluZ1R5cGUoKSB7Ci0JCXJldHVybiAoRW51bSkgc3VwZXIuZ2V0RGVjbGFyaW5nVHlwZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogQW5ub3RhdGVkRWxlbWVudC9FbnVtQ29uc3RhbnQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIElWYXJpYWJsZUJpbmRpbmcgZ2V0QmluZGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkucmVzb2x2ZVZhcmlhYmxlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVudW1Db25zdGFudERlY2xhcmF0aW9uIGdldEJvZHlEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRTZWxlY3RlZERlY2xhcmF0aW9uKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IHRoaXMuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpOwotCQkvLyB0aGUgZGVjbGFyYXRpb24gY2FuIGJlIG51bGwgaWYgdGhlIHJlc291cmNlIGlzIG91dCBvZiBzeW5jIHdpdGggdGhlIGZpbGUgc3lzdGVtCi0JCXJldHVybiAoZGVjbGFyYXRpb24gPT0gbnVsbCkgPyBudWxsIDogQVNUVG9vbHMuYnVpbGRUZXh0UmFuZ2UoZGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvL0FzIGZhciBhcyBJIGNhbiB0ZWxsLCBlbnVtIGNvbnN0YW50cyBhcmUgYWx3YXlzICJwZXJzaXN0YWJsZSIsIAotCS8vdGhlcmUgYXJlIG5vIG1vZGlmaWVycyB5b3UgY2FuIGFkZCB0byBhbiBlbnVtIGNvbnN0YW50Ci0JcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0YWJsZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEVudW1Db25zdGFudERlY2xhcmF0aW9uIGdldFNlbGVjdGVkRGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJU3RyaW5nIG5hbWUgPSB0aGlzLmdldE5hbWUoKTsKLQkJaW50IG9jY3VycmVuY2UgPSB0aGlzLmdldE9jY3VycmVuY2UoKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBlbnVtQ29uc3RhbnREZWNsYXJhdGlvbiA6IHRoaXMuZ2V0RGVjbGFyaW5nVHlwZUVudW1Db25zdGFudERlY2xhcmF0aW9ucyhhc3RSb290KSkgewotCQkJaWYgKGVudW1Db25zdGFudERlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQljb3VudCsrOwotCQkJCWlmIChjb3VudCA9PSBvY2N1cnJlbmNlKSB7Ci0JCQkJCXJldHVybiBlbnVtQ29uc3RhbnREZWNsYXJhdGlvbjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gcmV0dXJuIG51bGwgaWYgdGhlIGZpZWxkIGlzIG5vIGxvbmdlciBpbiB0aGUgc291cmNlIGNvZGU7Ci0JCS8vIHRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSBjb250ZXh0IG1vZGVsIGhhcyBub3QgeWV0Ci0JCS8vIGJlZW4gc3luY2hyb25pemVkIHdpdGggdGhlIHJlc291cmNlIG1vZGVsIGJ1dCBpcyBzdGlsbAotCQkvLyBhc2tpbmcgZm9yIGFuIEFTVE5vZGUgKGUuZy4gZHVyaW5nIGEgc2VsZWN0aW9uIGV2ZW50KQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW51bUNvbnN0YW50RGVjbGFyYXRpb25bXSBnZXREZWNsYXJpbmdUeXBlRW51bUNvbnN0YW50RGVjbGFyYXRpb25zKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUxpc3Q8RW51bUNvbnN0YW50RGVjbGFyYXRpb24+IGVudW1Db25zdGFudHMgPSBlbnVtQ29uc3RhbnRzKHRoaXMuZ2V0RGVjbGFyaW5nVHlwZURlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQkJcmV0dXJuIGVudW1Db25zdGFudHMudG9BcnJheShuZXcgRW51bUNvbnN0YW50RGVjbGFyYXRpb25bZW51bUNvbnN0YW50cy5zaXplKCldKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBMaXN0PEVudW1Db25zdGFudERlY2xhcmF0aW9uPiBlbnVtQ29uc3RhbnRzKEVudW1EZWNsYXJhdGlvbiBlZCkgewotCQlyZXR1cm4gZWQuZW51bUNvbnN0YW50cygpOwotCX0KLQotCXByb3RlY3RlZCBFbnVtRGVjbGFyYXRpb24gZ2V0RGVjbGFyaW5nVHlwZURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldERlY2xhcmluZ1R5cGUoKS5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRURmllbGRBdHRyaWJ1dGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVEZpZWxkQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NjY4YmYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRURmllbGRBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRmllbGREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVmFyaWFibGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5GaWVsZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kRXhlY3V0b3I7Ci0KLS8qKgotICogQWRhcHQgYW5kIGV4dGVuZCBhIEpEVCBmaWVsZC4KLSAqIEF0dHJpYnV0ZSBiYXNlZCBvbiBhIEphdmEgZmllbGQsIGUuZy4KLSAqICAgICBwcml2YXRlIGludCBmb287Ci0gKi8KLXB1YmxpYyBjbGFzcyBKRFRGaWVsZEF0dHJpYnV0ZQotCWV4dGVuZHMgSkRUTWVtYmVyCi0JaW1wbGVtZW50cyBGaWVsZEF0dHJpYnV0ZQotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHVibGljIEpEVEZpZWxkQXR0cmlidXRlKAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJU3RyaW5nIG5hbWUsCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXRoaXMoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQlwdWJsaWMgSkRURmllbGRBdHRyaWJ1dGUoCi0JCQlUeXBlIGRlY2xhcmluZ1R5cGUsCi0JCQlTdHJpbmcgbmFtZSwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsCi0JCQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcikgewotCQlzdXBlcihkZWNsYXJpbmdUeXBlLCBuYW1lLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcik7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIHRlc3RpbmcKLQkgKi8KLQlwdWJsaWMgSkRURmllbGRBdHRyaWJ1dGUoVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgbmFtZSwgaW50IG9jY3VycmVuY2UsIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7Ci0JCXRoaXMoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBDb21tYW5kRXhlY3V0b3IuRGVmYXVsdC5pbnN0YW5jZSgpLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE1lbWJlci9BdHRyaWJ1dGUvRmllbGRBdHRyaWJ1dGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFR5cGUgZ2V0RGVjbGFyaW5nVHlwZSgpIHsKLQkJcmV0dXJuIChUeXBlKSBzdXBlci5nZXREZWNsYXJpbmdUeXBlKCk7Ci0JfQotCi0JcHVibGljIElWYXJpYWJsZUJpbmRpbmcgZ2V0QmluZGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRGcmFnbWVudChhc3RSb290KS5yZXNvbHZlQmluZGluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBGaWVsZERlY2xhcmF0aW9uIGdldEJvZHlEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRTZWxlY3RlZERlY2xhcmF0aW9uKGFzdFJvb3QsIEZJRUxEX0RFQ0xBUkFUSU9OX1NFTEVDVE9SKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50ID0gdGhpcy5nZXRGcmFnbWVudChhc3RSb290KTsKLQkJLy8gdGhlIGZyYWdtZW50IGNhbiBiZSBudWxsIGlmIHRoZSByZXNvdXJjZSBpcyBvdXQgb2Ygc3luYyB3aXRoIHRoZSBmaWxlIHN5c3RlbQotCQlyZXR1cm4gKGZyYWdtZW50ID09IG51bGwpID8gbnVsbCA6IEFTVFRvb2xzLmJ1aWxkVGV4dFJhbmdlKGZyYWdtZW50LmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIElUeXBlQmluZGluZyBnZXRUeXBlQmluZGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkuZ2V0VHlwZSgpLnJlc29sdmVCaW5kaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaWVsZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0YWJsZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJVmFyaWFibGVCaW5kaW5nIGJpbmRpbmcgPSB0aGlzLmdldEJpbmRpbmcoYXN0Um9vdCk7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IGZhbHNlIDogSlBUVG9vbHMuZmllbGRJc1BlcnNpc3RhYmxlKG5ldyBKUFRUb29sc0FkYXB0ZXIoYmluZGluZykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgVHlwZURlY2xhcmF0aW9uIGdldERlY2xhcmluZ1R5cGVEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBhc3N1bWUgdGhlIGRlY2xhcmluZyB0eXBlIGlzIG5vdCBhbiBlbnVtIG9yIGFubm90YXRpb24KLQkJLy8gc2luY2UgdGhleSBkbyBub3QgaGF2ZSBmaWVsZCBvciBtZXRob2QgZGVjbGFyYXRpb25zCi0JCXJldHVybiB0aGlzLmdldERlY2xhcmluZ1R5cGUoKS5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBnZXRGcmFnbWVudChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRTZWxlY3RlZERlY2xhcmF0aW9uKGFzdFJvb3QsIFZBUklBQkxFX0RFQ0xBUkFUSU9OX0ZSQUdNRU5UX1NFTEVDVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gZWl0aGVyIGEgRmllbGREZWNsYXJhdGlvbiBvciBhIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCwKLQkgKiBkZXBlbmRpbmcgb24gdGhlIHNwZWNpZmllZCBzZWxlY3RvcjsKLQkgKiAKLQkgKiBoYW5kbGUgbXVsdGlwbGUgZmllbGRzIGRlY2xhcmVkIGluIGEgc2luZ2xlIHN0YXRlbWVudDoKLQkgKiAgICAgcHJpdmF0ZSBpbnQgZm9vLCBiYXI7Ci0JICovCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgQVNUTm9kZT4gVCBnZXRTZWxlY3RlZERlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290LCBTZWxlY3RvcjxUPiBzZWxlY3RvcikgewotCQlTdHJpbmcgbmFtZSA9IHRoaXMuZ2V0TmFtZSgpOwotCQlpbnQgb2NjdXJyZW5jZSA9IHRoaXMuZ2V0T2NjdXJyZW5jZSgpOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA6IHRoaXMuZ2V0RGVjbGFyaW5nVHlwZUZpZWxkRGVjbGFyYXRpb25zKGFzdFJvb3QpKSB7Ci0JCQlmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCA6IGZyYWdtZW50cyhmaWVsZERlY2xhcmF0aW9uKSkgewotCQkJCWlmIChmcmFnbWVudC5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCWNvdW50Kys7Ci0JCQkJCWlmIChjb3VudCA9PSBvY2N1cnJlbmNlKSB7Ci0JCQkJCQlyZXR1cm4gc2VsZWN0b3Iuc2VsZWN0KGZpZWxkRGVjbGFyYXRpb24sIGZyYWdtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyByZXR1cm4gbnVsbCBpZiB0aGUgZmllbGQgaXMgbm8gbG9uZ2VyIGluIHRoZSBzb3VyY2UgY29kZTsKLQkJLy8gdGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIGNvbnRleHQgbW9kZWwgaGFzIG5vdCB5ZXQKLQkJLy8gYmVlbiBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgcmVzb3VyY2UgbW9kZWwgYnV0IGlzIHN0aWxsCi0JCS8vIGFza2luZyBmb3IgYW4gQVNUTm9kZSAoZS5nLiBkdXJpbmcgYSBzZWxlY3Rpb24gZXZlbnQpCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBGaWVsZERlY2xhcmF0aW9uW10gZ2V0RGVjbGFyaW5nVHlwZUZpZWxkRGVjbGFyYXRpb25zKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSB0aGlzLmdldERlY2xhcmluZ1R5cGVEZWNsYXJhdGlvbihhc3RSb290KTsKLQkJLy8gdGhlIGRlY2xhcmF0aW9uIGNhbiBiZSBudWxsIGlmIHRoZSByZXNvdXJjZSBpcyBvdXQgb2Ygc3luYyB3aXRoIHRoZSBmaWxlIHN5c3RlbQotCQlyZXR1cm4gKHR5cGVEZWNsYXJhdGlvbiA9PSBudWxsKSA/IEVNUFRZX0ZJRUxEX0RFQ0xBUkFUSU9OX0FSUkFZIDogdHlwZURlY2xhcmF0aW9uLmdldEZpZWxkcygpOwotCX0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEZpZWxkRGVjbGFyYXRpb25bXSBFTVBUWV9GSUVMRF9ERUNMQVJBVElPTl9BUlJBWSA9IG5ldyBGaWVsZERlY2xhcmF0aW9uWzBdOwotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ+IGZyYWdtZW50cyhGaWVsZERlY2xhcmF0aW9uIGZkKSB7Ci0JCXJldHVybiBmZC5mcmFnbWVudHMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU2VsZWN0b3IgKioqKioqKioqKgotCi0JLy8gSSdtIG5vdCBxdWl0ZSBzdXJlIHRoaXMgaW50ZXJmYWNlIGlzIHdvcnRoIHRoZSByZXN1bHRpbmcgb2JmdXNjYXRpb24sCi0JLy8gYnV0LCB0aGVuLCBJIGtlcHQgY2hhbmdpbmcgYm90aCBtZXRob2RzLCBzby4uLiAgfmJqdgotCXByb3RlY3RlZCBpbnRlcmZhY2UgU2VsZWN0b3I8VCBleHRlbmRzIEFTVE5vZGU+IHsKLQkJVCBzZWxlY3QoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uLCBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTZWxlY3RvcjxGaWVsZERlY2xhcmF0aW9uPiBGSUVMRF9ERUNMQVJBVElPTl9TRUxFQ1RPUiA9Ci0JCW5ldyBTZWxlY3RvcjxGaWVsZERlY2xhcmF0aW9uPigpIHsKLQkJCXB1YmxpYyBGaWVsZERlY2xhcmF0aW9uIHNlbGVjdChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24sIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIHsKLQkJCQlyZXR1cm4gZmllbGREZWNsYXJhdGlvbjsKLQkJCX0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCQkJcmV0dXJuICJmaWVsZCBkZWNsYXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkZJRUxEX0RFQ0xBUkFUSU9OX1NFTEVDVE9SIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTZWxlY3RvcjxWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ+IFZBUklBQkxFX0RFQ0xBUkFUSU9OX0ZSQUdNRU5UX1NFTEVDVE9SID0KLQkJbmV3IFNlbGVjdG9yPFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudD4oKSB7Ci0JCQlwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHNlbGVjdChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24sIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIHsKLQkJCQlyZXR1cm4gdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50OwotCQkJfQotCQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJCQlyZXR1cm4gInZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiVkFSSUFCTEVfREVDTEFSQVRJT05fRlJBR01FTlRfU0VMRUNUT1IiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0KLQotCS8vICoqKioqKioqKiogSlBUVG9vbHMgYWRhcHRlciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBKUFRUb29scyBuZWVkcyBhbiBhZGFwdGVyIHNvIGl0IGNhbiB3b3JrIHdpdGggZWl0aGVyIGFuIElGaWVsZAotCSAqIG9yIGFuIElWYXJpYWJsZUJpbmRpbmcgZXRjLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgSlBUVG9vbHNBZGFwdGVyIGltcGxlbWVudHMgSlBUVG9vbHMuRmllbGRBZGFwdGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBJVmFyaWFibGVCaW5kaW5nIGZpZWxkQmluZGluZzsKLQotCQlwcm90ZWN0ZWQgSlBUVG9vbHNBZGFwdGVyKElWYXJpYWJsZUJpbmRpbmcgZmllbGRCaW5kaW5nKSB7Ci0JCQlzdXBlcigpOwotCQkJaWYgKGZpZWxkQmluZGluZyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLmZpZWxkQmluZGluZyA9IGZpZWxkQmluZGluZzsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgewotCQkJcmV0dXJuIHRoaXMuZmllbGRCaW5kaW5nLmdldE1vZGlmaWVycygpOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRNZW1iZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVE1lbWJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDllNzk3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVE1lbWJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb2R5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmRFeGVjdXRvcjsKLQotLyoqCi0gKiBBZGFwdCBhbmQgZXh0ZW5kIGEgSkRUIG1lbWJlciB3aXRoIHNpbXBsaWZpZWQgYW5ub3RhdGlvbiBoYW5kbGluZy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEpEVE1lbWJlciBleHRlbmRzIEpEVEFubm90YXRlZEVsZW1lbnQKLQlpbXBsZW1lbnRzIE1lbWJlcgotewotCi0JLyoqIHRoaXMgd2lsbCBiZSBudWxsIGZvciB0aGUgcHJpbWFyeSB0eXBlICovCi0JcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFR5cGUgZGVjbGFyaW5nVHlwZTsKLQotCS8qKgotCSAqIG1lbWJlcnMgY2FuIG9jY3VyIG1vcmUgdGhhbiBvbmNlIGluIG5vbi1jb21waWxpbmcgc291cmNlOwotCSAqIGNvdW50IHN0YXJ0cyBhdCAxOyB0aGUgcHJpbWFyeSB0eXBlIHdpbGwgaGF2ZSBvY2N1cnJlbmNlIDEKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBvY2N1cnJlbmNlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIEpEVE1lbWJlcigKLQkJCUFic3RyYWN0VHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJU3RyaW5nIG5hbWUsCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXRoaXMoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBKRFRNZW1iZXIoCi0JCQlBYnN0cmFjdFR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCVN0cmluZyBuYW1lLAotCQkJaW50IG9jY3VycmVuY2UsCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwKLQkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKSB7Ci0JCXN1cGVyKG5hbWUsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKTsKLQkJdGhpcy5kZWNsYXJpbmdUeXBlID0gZGVjbGFyaW5nVHlwZTsKLQkJdGhpcy5vY2N1cnJlbmNlID0gb2NjdXJyZW5jZTsKLQl9Ci0KLQkvL2NvdmFyaWFudCBvdmVycmlkZQotCXB1YmxpYyBhYnN0cmFjdCBCb2R5RGVjbGFyYXRpb24gZ2V0Qm9keURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCQotCS8vICoqKioqKioqKiogTWVtYmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBNb2RpZmllZERlY2xhcmF0aW9uIGdldE1vZGlmaWVkRGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ldyBKRFRNb2RpZmllZERlY2xhcmF0aW9uKHRoaXMuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBtZW1iZXJOYW1lLCBpbnQgb2NjdXIpIHsKLQkJcmV0dXJuIG1lbWJlck5hbWUuZXF1YWxzKHRoaXMuZ2V0TmFtZSgpKSAmJiAob2NjdXIgPT0gdGhpcy5vY2N1cnJlbmNlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGludCBnZXRPY2N1cnJlbmNlKCkgewotCQlyZXR1cm4gdGhpcy5vY2N1cnJlbmNlOwotCX0KLQotCS8qKgotCSAqIHRoaXMgd2lsbCByZXR1cm4gbnVsbCBmb3IgYSB0b3AtbGV2ZWwgdHlwZQotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFR5cGUgZ2V0RGVjbGFyaW5nVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVjbGFyaW5nVHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRNZXRob2RBdHRyaWJ1dGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVE1ldGhvZEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2QzMWI0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVE1ldGhvZEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklNZXRob2RCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWV0aG9kQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5KYXZhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuTWV0aG9kU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTmFtZVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVNZXRob2RTaWduYXR1cmU7Ci0KLS8qKgotICogQWRhcHQgYW5kIGV4dGVuZCBhIEpEVCBtZXRob2QuCi0gKiBBdHRyaWJ1dGUgYmFzZWQgb24gYSBKYXZhIHByb3BlcnR5LCBlLmcuCi0gKiAgICAgcHJpdmF0ZSBpbnQgZ2V0Rm9vKCkgewotICogICAgICAgICByZXR1cm4gZm9vOwotICogICAgIH0KLSAqICAgICBwcml2YXRlIHZvaWQgc2V0Rm9vKGludCBmb28pIHsKLSAqICAgICAgICAgdGhpcy5mb28gPSBmb287Ci0gKiAgICAgfQotICovCi1wdWJsaWMgY2xhc3MgSkRUTWV0aG9kQXR0cmlidXRlCi0JZXh0ZW5kcyBKRFRNZW1iZXIKLQlpbXBsZW1lbnRzIE1ldGhvZEF0dHJpYnV0ZQotewotCS8qKiB3ZSBuZWVkIHRoZSBwYXJhbWV0ZXIgdHlwZXMgdG8gYnVpbGQgdGhlIG1ldGhvZCBzaWduYXR1cmUgKi8KLQlwcml2YXRlIGZpbmFsIEphdmFUeXBlW10gcGFyYW1ldGVyVHlwZXM7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgSkRUTWV0aG9kQXR0cmlidXRlIG5ld0luc3RhbmNlKAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJTWV0aG9kU2lnbmF0dXJlIHNpZ25hdHVyZSwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGRlY2xhcmluZ1R5cGUsIHNpZ25hdHVyZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSkRUTWV0aG9kQXR0cmlidXRlIG5ld0luc3RhbmNlKAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJTWV0aG9kU2lnbmF0dXJlIHNpZ25hdHVyZSwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsCi0JCQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcikgewotCQlyZXR1cm4gbmV3IEpEVE1ldGhvZEF0dHJpYnV0ZShkZWNsYXJpbmdUeXBlLCBzaWduYXR1cmUsIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKTsKLQl9Ci0KLQlwcml2YXRlIEpEVE1ldGhvZEF0dHJpYnV0ZSgKLQkJCVR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUsCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLAotCQkJQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpIHsKLQkJc3VwZXIoZGVjbGFyaW5nVHlwZSwgbWV0aG9kU2lnbmF0dXJlLmdldE5hbWUoKSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpOwotCQl0aGlzLnBhcmFtZXRlclR5cGVzID0gbWV0aG9kU2lnbmF0dXJlLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIHRlc3RpbmcKLQkgKi8KLQlwdWJsaWMgSkRUTWV0aG9kQXR0cmlidXRlKFR5cGUgZGVjbGFyaW5nVHlwZSwgU3RyaW5nIG5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVOYW1lcywgaW50IG9jY3VycmVuY2UsIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7Ci0JCXRoaXMoZGVjbGFyaW5nVHlwZSwgbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZShuYW1lLCBwYXJhbWV0ZXJUeXBlTmFtZXMpLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCksIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTWVtYmVyL0F0dHJpYnV0ZS9NZXRob2RBdHRyaWJ1dGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFR5cGUgZ2V0RGVjbGFyaW5nVHlwZSgpIHsKLQkJcmV0dXJuIChUeXBlKSBzdXBlci5nZXREZWNsYXJpbmdUeXBlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaWVsZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgSU1ldGhvZEJpbmRpbmcgZ2V0QmluZGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkucmVzb2x2ZUJpbmRpbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24gZ2V0Qm9keURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiB0aGlzLmdldERlY2xhcmluZ1R5cGVNZXRob2REZWNsYXJhdGlvbnMoYXN0Um9vdCkpIHsKLQkJCWlmICh0aGlzLm1hdGNoZXMobWV0aG9kRGVjbGFyYXRpb24pKSB7Ci0JCQkJY291bnQrKzsKLQkJCQlpZiAoY291bnQgPT0gdGhpcy5nZXRPY2N1cnJlbmNlKCkpIHsKLQkJCQkJcmV0dXJuIG1ldGhvZERlY2xhcmF0aW9uOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyByZXR1cm4gbnVsbCBpZiB0aGUgbWV0aG9kIGlzIG5vIGxvbmdlciBpbiB0aGUgc291cmNlIGNvZGU7Ci0JCS8vIHRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSBjb250ZXh0IG1vZGVsIGhhcyBub3QgeWV0Ci0JCS8vIGJlZW4gc3luY2hyb25pemVkIHdpdGggdGhlIHJlc291cmNlIG1vZGVsIGJ1dCBpcyBzdGlsbAotCQkvLyBhc2tpbmcgZm9yIGFuIEFTVE5vZGUgKGUuZy4gZHVyaW5nIGEgc2VsZWN0aW9uIGV2ZW50KQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKE1ldGhvZFNpZ25hdHVyZSBzaWduYXR1cmUsIGludCBvY2N1cnJlbmNlKSB7Ci0JCXJldHVybiB0aGlzLm1hdGNoZXMoc2lnbmF0dXJlKSAmJiAob2NjdXJyZW5jZSA9PSB0aGlzLmdldE9jY3VycmVuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlcyhNZXRob2RTaWduYXR1cmUgc2lnbmF0dXJlKSB7Ci0JCXJldHVybiBzaWduYXR1cmUuZ2V0TmFtZSgpLmVxdWFscyh0aGlzLmdldE5hbWUoKSkKLQkJCQkJJiYgQXJyYXlzLmVxdWFscyh0aGlzLnBhcmFtZXRlclR5cGVzLCBzaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlcyhNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5tYXRjaGVzKEFTVFRvb2xzLmJ1aWxkTWV0aG9kU2lnbmF0dXJlKG1ldGhvZERlY2xhcmF0aW9uKSk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBtZXRob2REZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgbWVtYmVyTmFtZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVc2UgI21hdGNoZXMoTWV0aG9kU2lnbmF0dXJlLCBpbnQpLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gdGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JCS8vIHRoZSBkZWNsYXJhdGlvbiBjYW4gYmUgbnVsbCBpZiB0aGUgcmVzb3VyY2UgaXMgb3V0IG9mIHN5bmMgd2l0aCB0aGUgZmlsZSBzeXN0ZW0KLQkJcmV0dXJuIChtZXRob2REZWNsYXJhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBBU1RUb29scy5idWlsZFRleHRSYW5nZShtZXRob2REZWNsYXJhdGlvbi5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIHJldHVybiAiZm9vIiBmb3IgYSBtZXRob2QgbmFtZWQgImdldEZvbyIsICJpc0ZvbyIsICJzZXRGb28iCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQlyZXR1cm4gTmFtZVRvb2xzLmNvbnZlcnRHZXR0ZXJTZXR0ZXJNZXRob2ROYW1lVG9Qcm9wZXJ0eU5hbWUodGhpcy5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBJVHlwZUJpbmRpbmcgZ2V0VHlwZUJpbmRpbmcoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IGdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KS5yZXNvbHZlQmluZGluZygpOwotCQlyZXR1cm4gKG1ldGhvZEJpbmRpbmcgPT0gbnVsbCkgPyBudWxsIDogbWV0aG9kQmluZGluZy5nZXRSZXR1cm5UeXBlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0YWJsZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJTWV0aG9kQmluZGluZyBiaW5kaW5nID0gdGhpcy5nZXRCaW5kaW5nKGFzdFJvb3QpOwotCQlyZXR1cm4gKGJpbmRpbmcgPT0gbnVsbCkgPyBmYWxzZSA6IEpQVFRvb2xzLm1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihuZXcgSlBUVG9vbHNBZGFwdGVyKGJpbmRpbmcpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFR5cGVEZWNsYXJhdGlvbiBnZXREZWNsYXJpbmdUeXBlRGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gYXNzdW1lIHRoZSBkZWNsYXJpbmcgdHlwZSBpcyBub3QgYW4gZW51bSBvciBhbm5vdGF0aW9uCi0JCS8vIHNpbmNlIHRoZXkgZG8gbm90IGhhdmUgZmllbGQgb3IgbWV0aG9kIGRlY2xhcmF0aW9ucwotCQlyZXR1cm4gdGhpcy5nZXREZWNsYXJpbmdUeXBlKCkuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBNZXRob2REZWNsYXJhdGlvbltdIGdldERlY2xhcmluZ1R5cGVNZXRob2REZWNsYXJhdGlvbnMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IHRoaXMuZ2V0RGVjbGFyaW5nVHlwZURlY2xhcmF0aW9uKGFzdFJvb3QpOwotCQkvLyB0aGUgZGVjbGFyYXRpb24gY2FuIGJlIG51bGwgaWYgdGhlIHJlc291cmNlIGlzIG91dCBvZiBzeW5jIHdpdGggdGhlIGZpbGUgc3lzdGVtCi0JCXJldHVybiAodHlwZURlY2xhcmF0aW9uID09IG51bGwpID8gRU1QVFlfTUVUSE9EX0RFQ0xBUkFUSU9OX0FSUkFZIDogdHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKTsKLQl9Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBNZXRob2REZWNsYXJhdGlvbltdIEVNUFRZX01FVEhPRF9ERUNMQVJBVElPTl9BUlJBWSA9IG5ldyBNZXRob2REZWNsYXJhdGlvblswXTsKLQotCi0JLy8gKioqKioqKioqKiBKUFRUb29scyBhZGFwdGVyICoqKioqKioqKioKLQotCS8qKgotCSAqIEpQVFRvb2xzIG5lZWRzIGFuIGFkYXB0ZXIgc28gaXQgY2FuIHdvcmsgd2l0aCBlaXRoZXIgYW4gSU1ldGhvZAotCSAqIG9yIGFuIElNZXRob2RCaW5kaW5nIGV0Yy4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFNpbXBsZUpQVFRvb2xzQWRhcHRlcgotCQlpbXBsZW1lbnRzIEpQVFRvb2xzLlNpbXBsZU1ldGhvZEFkYXB0ZXIKLQl7Ci0JCXByb3RlY3RlZCBmaW5hbCBJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nOwotCi0JCXByb3RlY3RlZCBTaW1wbGVKUFRUb29sc0FkYXB0ZXIoSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgewotCQkJc3VwZXIoKTsKLQkJCWlmIChtZXRob2RCaW5kaW5nID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMubWV0aG9kQmluZGluZyA9IG1ldGhvZEJpbmRpbmc7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKLQkJCXJldHVybiB0aGlzLm1ldGhvZEJpbmRpbmcuZ2V0TW9kaWZpZXJzKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFJldHVyblR5cGVFcmFzdXJlTmFtZSgpIHsKLQkJCUlUeXBlQmluZGluZyByZXR1cm5UeXBlID0gdGhpcy5tZXRob2RCaW5kaW5nLmdldFJldHVyblR5cGUoKTsKLQkJCXJldHVybiAocmV0dXJuVHlwZSA9PSBudWxsKSA/IG51bGwgOiByZXR1cm5UeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldEVyYXN1cmUoKS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCkgewotCQkJcmV0dXJuIHRoaXMubWV0aG9kQmluZGluZy5pc0NvbnN0cnVjdG9yKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEpQVFRvb2xzQWRhcHRlcgotCQlleHRlbmRzIFNpbXBsZUpQVFRvb2xzQWRhcHRlcgotCQlpbXBsZW1lbnRzIEpQVFRvb2xzLk1ldGhvZEFkYXB0ZXIKLQl7Ci0JCXByb3RlY3RlZCBKUFRUb29sc0FkYXB0ZXIoSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgewotCQkJc3VwZXIobWV0aG9kQmluZGluZyk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tZXRob2RCaW5kaW5nLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0UGFyYW1ldGVyc0xlbmd0aCgpIHsKLQkJCXJldHVybiB0aGlzLm1ldGhvZEJpbmRpbmcuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGg7Ci0JCX0KLQotCQlwdWJsaWMgSlBUVG9vbHMuU2ltcGxlTWV0aG9kQWRhcHRlciBnZXRTaWJsaW5nKFN0cmluZyBuYW1lKSB7Ci0JCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLm1ldGhvZEJpbmRpbmcuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLQkJCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlmb3IgKElNZXRob2RCaW5kaW5nIHNpYmxpbmcgOiB0eXBlQmluZGluZy5nZXREZWNsYXJlZE1ldGhvZHMoKSkgewotCQkJCWlmICgoc2libGluZy5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwKQotCQkJCQkJJiYgc2libGluZy5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCXJldHVybiBuZXcgU2ltcGxlSlBUVG9vbHNBZGFwdGVyKHNpYmxpbmcpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIEpQVFRvb2xzLlNpbXBsZU1ldGhvZEFkYXB0ZXIgZ2V0U2libGluZyhTdHJpbmcgbmFtZSwgU3RyaW5nIHBhcmFtZXRlclR5cGVFcmFzdXJlTmFtZSkgewotCQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdGhpcy5tZXRob2RCaW5kaW5nLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0JCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJZm9yIChJTWV0aG9kQmluZGluZyBzaWJsaW5nIDogdHlwZUJpbmRpbmcuZ2V0RGVjbGFyZWRNZXRob2RzKCkpIHsKLQkJCQlJVHlwZUJpbmRpbmdbXSBzaWJsaW5nUGFybVR5cGVzID0gc2libGluZy5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQkJCWlmICgoc2libGluZ1Bhcm1UeXBlcy5sZW5ndGggPT0gMSkKLQkJCQkJCSYmIHNpYmxpbmcuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKQotCQkJCQkJJiYgc2libGluZ1Bhcm1UeXBlc1swXS5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRFcmFzdXJlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhwYXJhbWV0ZXJUeXBlRXJhc3VyZU5hbWUpKSB7Ci0JCQkJCXJldHVybiBuZXcgU2ltcGxlSlBUVG9vbHNBZGFwdGVyKHNpYmxpbmcpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUTW9kaWZpZWREZWNsYXJhdGlvbi5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUTW9kaWZpZWREZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTY3ZTQ2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVE1vZGlmaWVkRGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9keURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklFeHRlbmRlZE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkltcG9ydERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU3ViSXRlcmF0b3JXcmFwcGVyOwotCi0vKioKLSAqIFdyYXAgYW55IG9mIHRoZSBBU1Qgbm9kZXMgdGhhdCBoYXZlIG1vZGlmaWVycyAoc3BlY2lmaWNhbGx5LCBhbm5vdGF0aW9ucyk7Ci0gKiBpLmUuIEJvZHlEZWNsYXJhdGlvbiwgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24sCi0gKiBhbmQgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIEpEVE1vZGlmaWVkRGVjbGFyYXRpb24KLQlpbXBsZW1lbnRzIE1vZGlmaWVkRGVjbGFyYXRpb24KLXsKLQlwcml2YXRlIGZpbmFsIEFkYXB0ZXIgYWRhcHRlcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHVibGljIEpEVE1vZGlmaWVkRGVjbGFyYXRpb24oQWRhcHRlciBhZGFwdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JfQotCi0JcHVibGljIEpEVE1vZGlmaWVkRGVjbGFyYXRpb24oQm9keURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMobmV3IEJvZHlEZWNsYXJhdGlvbkFkYXB0ZXIoZGVjbGFyYXRpb24pKTsKLQl9Ci0JCi0JcHVibGljIEpEVE1vZGlmaWVkRGVjbGFyYXRpb24oUGFja2FnZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMobmV3IFBhY2thZ2VEZWNsYXJhdGlvbkFkYXB0ZXIoZGVjbGFyYXRpb24pKTsJCQkKLQl9Ci0KLQlwdWJsaWMgSkRUTW9kaWZpZWREZWNsYXJhdGlvbihTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMobmV3IFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb25BZGFwdGVyKGRlY2xhcmF0aW9uKSk7Ci0JfQotCi0JcHVibGljIEpEVE1vZGlmaWVkRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gZGVjbGFyYXRpb24pIHsKLQkJdGhpcyhuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb25BZGFwdGVyKGRlY2xhcmF0aW9uKSk7Ci0JfQotCi0JcHVibGljIEpEVE1vZGlmaWVkRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBkZWNsYXJhdGlvbikgewotCQl0aGlzKG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50QWRhcHRlcihkZWNsYXJhdGlvbikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhbm5vdGF0aW9ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uTmFtZWQoU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3I8QW5ub3RhdGlvbj4gc3RyZWFtID0gdGhpcy5hbm5vdGF0aW9ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAodGhpcy5hbm5vdGF0aW9uSXNOYW1lZChhbm5vdGF0aW9uLCBhbm5vdGF0aW9uTmFtZSkpIHsKLQkJCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uTmFtZWQoU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3I8SUV4dGVuZGVkTW9kaWZpZXI+IHN0cmVhbSA9IHRoaXMuZ2V0TW9kaWZpZXJzKCkuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlJRXh0ZW5kZWRNb2RpZmllciBtb2RpZmllciA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAobW9kaWZpZXIuaXNBbm5vdGF0aW9uKCkpIHsKLQkJCQlpZiAodGhpcy5hbm5vdGF0aW9uSXNOYW1lZCgoQW5ub3RhdGlvbikgbW9kaWZpZXIsIGFubm90YXRpb25OYW1lKSkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlcGxhY2VBbm5vdGF0aW9uTmFtZWQoU3RyaW5nIG9sZEFubm90YXRpb25OYW1lLCBBbm5vdGF0aW9uIG5ld0Fubm90YXRpb24pIHsKLQkJTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gbW9kaWZpZXJzID0gdGhpcy5nZXRNb2RpZmllcnMoKTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8SUV4dGVuZGVkTW9kaWZpZXI+IHN0cmVhbSA9IG1vZGlmaWVycy5saXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlJRXh0ZW5kZWRNb2RpZmllciBtb2RpZmllciA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAobW9kaWZpZXIuaXNBbm5vdGF0aW9uKCkpIHsKLQkJCQlpZiAodGhpcy5hbm5vdGF0aW9uSXNOYW1lZCgoQW5ub3RhdGlvbikgbW9kaWZpZXIsIG9sZEFubm90YXRpb25OYW1lKSkgewotCQkJCQlzdHJlYW0uc2V0KG5ld0Fubm90YXRpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRoaXMuYWRkQW5ub3RhdGlvbihuZXdBbm5vdGF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIHRvIHRoZSBkZWNsYXJhdGlvbi4KLQkgKiBCeSBjb252ZW50aW9uIGFubm90YXRpb25zIHByZWNlZGUgdGhlICJzdGFuZGFyZCIgKEpMUzIpIG1vZGlmaWVyczsKLQkgKiB0aG91Z2gsIHRlY2huaWNhbGx5LCB0aGV5IGNhbiBiZSBpbnRlcnNwZXJzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gbW9kaWZpZXJzID0gdGhpcy5nZXRNb2RpZmllcnMoKTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8SUV4dGVuZGVkTW9kaWZpZXI+IHN0cmVhbSA9IG1vZGlmaWVycy5saXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5pc01vZGlmaWVyKCkpIHsKLQkJCQlzdHJlYW0ucHJldmlvdXMoKTsgIC8vIHB1dCB0aGUgYW5ub3RhdGlvbiAqYmVmb3JlKiB0aGUgZmlyc3QgInN0YW5kYXJkIiAoSkxTMikgbW9kaWZpZXIKLQkJCQlzdHJlYW0uYWRkKGFubm90YXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQltb2RpZmllcnMuYWRkKGFubm90YXRpb24pOyAgLy8ganVzdCB0YWNrIGl0IG9uIHRvIHRoZSBlbmQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlY2xhcmF0aW9uJ3MgYW5ub3RhdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEFubm90YXRpb24+IGFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IFN1Ykl0ZXJhdG9yV3JhcHBlcjxJRXh0ZW5kZWRNb2RpZmllciwgQW5ub3RhdGlvbj4odGhpcy5hbm5vdGF0aW9uc18oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPElFeHRlbmRlZE1vZGlmaWVyPiBhbm5vdGF0aW9uc18oKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8SUV4dGVuZGVkTW9kaWZpZXI+KHRoaXMuZ2V0TW9kaWZpZXJzKCkuaXRlcmF0b3IoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSUV4dGVuZGVkTW9kaWZpZXIgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmlzQW5ub3RhdGlvbigpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGQgaW1wb3J0ICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGFkZEltcG9ydChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWUuaW5kZXhPZignLicpID09IC0xKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsgIC8vIHRoZSBjbGFzcyBpcyBpbiB0aGUgZGVmYXVsdCBwYWNrYWdlIC0gbm8gbmVlZCBmb3IgaW1wb3J0Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYWRkSW1wb3J0KGNsYXNzTmFtZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZFN0YXRpY0ltcG9ydChTdHJpbmcgZW51bUNvbnN0YW50TmFtZSkgewotCQlpbnQgaW5kZXgxID0gZW51bUNvbnN0YW50TmFtZS5pbmRleE9mKCcuJyk7Ci0JCWlmIChpbmRleDEgPT0gLTEpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZW51bUNvbnN0YW50TmFtZSk7ICAvLyBzaG91bGRuJ3QgaGFwcGVuPwotCQl9Ci0JCWludCBpbmRleDIgPSBlbnVtQ29uc3RhbnROYW1lLmluZGV4T2YoJy4nLCBpbmRleDEgKyAxKTsKLQkJaWYgKGluZGV4MiA9PSAtMSkgewotCQkJcmV0dXJuIHRydWU7ICAvLyB0aGUgZW51bSBpcyBpbiB0aGUgZGVmYXVsdCBwYWNrYWdlIC0gbm8gbmVlZCBmb3IgaW1wb3J0Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYWRkSW1wb3J0KGVudW1Db25zdGFudE5hbWUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEltcG9ydChTdHJpbmcgaW1wb3J0TmFtZSwgYm9vbGVhbiBzdGF0aWNJbXBvcnQpIHsKLQkJQm9vbGVhbiBpbmNsdWRlID0gdGhpcy5pbXBvcnRzSW5jbHVkZShpbXBvcnROYW1lLCBzdGF0aWNJbXBvcnQpOwotCQlpZiAoaW5jbHVkZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaW5jbHVkZS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCi0JCUltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2xhcmF0aW9uID0gdGhpcy5nZXRBc3QoKS5uZXdJbXBvcnREZWNsYXJhdGlvbigpOwotCQlpbXBvcnREZWNsYXJhdGlvbi5zZXROYW1lKHRoaXMuZ2V0QXN0KCkubmV3TmFtZShpbXBvcnROYW1lKSk7Ci0JCWltcG9ydERlY2xhcmF0aW9uLnNldFN0YXRpYyhzdGF0aWNJbXBvcnQpOwotCQl0aGlzLmdldEltcG9ydHMoKS5hZGQoaW1wb3J0RGVjbGFyYXRpb24pOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBKdXN0IGEgYml0IGhhY2t5OgotCSAqICAgICBSZXR1cm4gQm9vbGVhbi5UUlVFIGlmIHRoZSBpbXBvcnQgaXMgYWxyZWFkeSBwcmVzZW50LgotCSAqICAgICBSZXR1cm4gQm9vbGVhbi5GQUxTRSBpZiBhIGNvbGxpZGluZyBpbXBvcnQgaXMgYWxyZWFkeSBwcmVzZW50LgotCSAqICAgICBSZXR1cm4gbnVsbCBpZiBhIG5ldyBpbXBvcnQgbWF5IGJlIGFkZGVkLgotCSAqIFRoaXMgaGFja2VyeSBhbGxvd3MgdXMgdG8gbG9vcCB0aHJvdWdoIHRoZSBpbXBvcnRzIG9ubHkgb25jZQotCSAqIChhbmQgY29tcG9zZSBvdXIgbWV0aG9kcykuCi0JICogUHJlLWNvbmRpdGlvbjogJ2ltcG9ydE5hbWUnIGlzIG5vdCBpbiB0aGUgImRlZmF1bHQiIHBhY2thZ2UgKGkuZS4gaXQgKmlzKiBxdWFsaWZpZWQpCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaW1wb3J0c0luY2x1ZGUoU3RyaW5nIGltcG9ydE5hbWUsIGJvb2xlYW4gc3RhdGljSW1wb3J0KSB7Ci0JCWludCBwZXJpb2QgPSBpbXBvcnROYW1lLmxhc3RJbmRleE9mKCcuJyk7ICAvLyBzaG91bGQgbm90IGJlIC0xCi0JCVN0cmluZyBpbXBvcnROYW1lUXVhbGlmaWVyID0gaW1wb3J0TmFtZS5zdWJzdHJpbmcoMCwgcGVyaW9kKTsKLQkJU3RyaW5nIHNob3J0SW1wb3J0TmFtZSA9IGltcG9ydE5hbWUuc3Vic3RyaW5nKHBlcmlvZCArIDEpOwotCQlyZXR1cm4gdGhpcy5pbXBvcnRzSW5jbHVkZShpbXBvcnROYW1lLCBpbXBvcnROYW1lUXVhbGlmaWVyLCBzaG9ydEltcG9ydE5hbWUsIHN0YXRpY0ltcG9ydCk7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNhbGN1bGF0ZSB0aGUgcXVhbGlmaWVyIGFuZCBzaG9ydCBuYW1lCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaW1wb3J0c0luY2x1ZGUoU3RyaW5nIGltcG9ydE5hbWUsIFN0cmluZyBpbXBvcnROYW1lUXVhbGlmaWVyLCBTdHJpbmcgc2hvcnRJbXBvcnROYW1lLCBib29sZWFuIHN0YXRpY0ltcG9ydCkgewotCQlmb3IgKEltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2xhcmF0aW9uIDogdGhpcy5nZXRJbXBvcnRzKCkpIHsKLQkJCWlmIChpbXBvcnREZWNsYXJhdGlvbi5pc1N0YXRpYygpID09IHN0YXRpY0ltcG9ydCkgewotCQkJCUJvb2xlYW4gbWF0Y2ggPSB0aGlzLmltcG9ydE1hdGNoZXMoaW1wb3J0RGVjbGFyYXRpb24sIGltcG9ydE5hbWUsIGltcG9ydE5hbWVRdWFsaWZpZXIsIHNob3J0SW1wb3J0TmFtZSk7Ci0JCQkJaWYgKG1hdGNoICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG1hdGNoOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB3ZSBzaG91bGQgYmUgYWJsZSB0byByZWx5IG9uIHRoZSBKRFQgbW9kZWwgaGVyZSwgc2luY2Ugd2UgYXJlIGxvb2tpbmcKLQkgKiBhdCBvYmplY3RzIHRoYXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2luZyB1bmRlcm5lYXRoIHVzLi4uCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaW1wb3J0TWF0Y2hlcyhJbXBvcnREZWNsYXJhdGlvbiBpbXBvcnREZWNsYXJhdGlvbiwgU3RyaW5nIGltcG9ydE5hbWUsIFN0cmluZyBpbXBvcnROYW1lUXVhbGlmaWVyLCBTdHJpbmcgc2hvcnRJbXBvcnROYW1lKSB7Ci0JCS8vIGV4YW1wbGVzOgotCQkvLyAnaW1wb3J0TmFtZScgaXMgImphdmEudXRpbC5EYXRlIgotCQkvLyAgICAgb3IKLQkJLy8gJ2ltcG9ydE5hbWUnIGlzICJqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFIgotCQlTdHJpbmcgaWRuID0gaW1wb3J0RGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQlpZiAoaW1wb3J0TmFtZS5lcXVhbHMoaWRuKSkgewotCQkJLy8gaW1wb3J0IGphdmEudXRpbC5EYXRlOyA9PiAiRGF0ZSIgd2lsbCByZXNvbHZlIHRvICJqYXZhLnV0aWwuRGF0ZSIKLQkJCS8vIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsgPT4gIlRZUEUiIHdpbGwgcmVzb2x2ZSB0byAiamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRSIKLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCX0KLQotCQlTdHJpbmcgc2hvcnRJRE4gPSBpZG4uc3Vic3RyaW5nKGlkbi5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JCWlmIChzaG9ydEltcG9ydE5hbWUuZXF1YWxzKHNob3J0SUROKSkgewotCQkJLy8gaW1wb3J0IGphdmEuc3FsLkRhdGU7ID0+IGFtYmlndW91cyByZXNvbHV0aW9uIG9mICJEYXRlIgotCQkJLy8gaW1wb3J0IHN0YXRpYyBvcmcuZm9vLkJhci5UWVBFOyA9PiBhbWJpZ3VvdXMgcmVzb2x1dGlvbiBvZiAiVFlQRSIKLQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQl9Ci0KLQkJaWYgKGltcG9ydERlY2xhcmF0aW9uLmlzT25EZW1hbmQoKSkgewotCQkJaWYgKGltcG9ydE5hbWVRdWFsaWZpZXIuZXF1YWxzKGlkbikpIHsKLQkJCQkvLyBpbXBvcnQgamF2YS51dGlsLio7ID0+ICJEYXRlIiB3aWxsIHJlc29sdmUgdG8gImphdmEudXRpbC5EYXRlIgotCQkJCS8vIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuKjsgPT4gIlRZUEUiIHdpbGwgcmVzb2x2ZSB0byAiamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRSIKLQkJCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQkJfQotCQkJaWYgKGltcG9ydERlY2xhcmF0aW9uLmlzU3RhdGljKCkpIHsKLQkJCQlpZiAodGhpcy5lbnVtUmVzb2x2ZXMoaWRuLCBzaG9ydEltcG9ydE5hbWUpKSB7Ci0JCQkJCS8vIGltcG9ydCBzdGF0aWMgb3JnLmZvby5CYXIuKjsgPT4gYW1iaWd1b3VzIHJlc29sdXRpb24gb2YgIlRZUEUiCi0JCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHRoaXMudHlwZVJlc29sdmVzKGlkbiArICcuJyArIHNob3J0SW1wb3J0TmFtZSkpIHsKLQkJCQkJLy8gaW1wb3J0IGphdmEuc3FsLio7ID0+IGFtYmlndW91cyByZXNvbHV0aW9uIG9mICJEYXRlIgotCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gbm8gbWF0Y2hlcyAtIE9LIHRvIGFkZCBleHBsaWNpdCBpbXBvcnQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW51bVJlc29sdmVzKFN0cmluZyBlbnVtVHlwZU5hbWUsIFN0cmluZyBlbnVtQ29uc3RhbnROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5lbnVtUmVzb2x2ZXNfKGVudW1UeXBlTmFtZSwgZW51bUNvbnN0YW50TmFtZSk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW51bVJlc29sdmVzXyhTdHJpbmcgZW51bVR5cGVOYW1lLCBTdHJpbmcgZW51bUNvbnN0YW50TmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlUeXBlIGpkdFR5cGUgPSB0aGlzLmZpbmRUeXBlXyhlbnVtVHlwZU5hbWUpOwotCQlpZiAoamR0VHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCAhIGpkdFR5cGUuaXNFbnVtKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKElGaWVsZCBqZHRGaWVsZCA6IGpkdFR5cGUuZ2V0RmllbGRzKCkpIHsKLQkJCWlmIChqZHRGaWVsZC5pc0VudW1Db25zdGFudCgpICYmIGpkdEZpZWxkLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKGVudW1Db25zdGFudE5hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHR5cGVSZXNvbHZlcyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5maW5kVHlwZShuYW1lKSAhPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJVHlwZSBmaW5kVHlwZShTdHJpbmcgbmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIHRoaXMuZmluZFR5cGVfKG5hbWUpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJVHlwZSBmaW5kVHlwZV8oU3RyaW5nIG5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5nZXRDb21waWxhdGlvblVuaXQoKS5nZXRKYXZhRWxlbWVudCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3Q8SW1wb3J0RGVjbGFyYXRpb24+IGdldEltcG9ydHMoKSB7Ci0JCXJldHVybiB0aGlzLmltcG9ydHModGhpcy5nZXRDb21waWxhdGlvblVuaXQoKSk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBhc3RSb290LmltcG9ydHMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYW5ub3RhdGlvbiBuYW1lIHJlc29sdXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gYW5ub3RhdGlvbklzTmFtZWQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRRdWFsaWZpZWROYW1lKGFubm90YXRpb24pLmVxdWFscyhuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTaW1wbHkgcmV0dXJuIHRoZSBhbm5vdGF0aW9uJ3MgdW5xdWFsaWZpZWQgbmFtZSBpZiB3ZSBjYW4ndCAicmVzb2x2ZSIgaXQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBhbm5vdGF0aW9uLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlpZiAodHlwZUJpbmRpbmcgIT0gbnVsbCkgewotCQkJU3RyaW5nIHJlc29sdmVkTmFtZSA9IHR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJCWlmIChyZXNvbHZlZE5hbWUgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXNvbHZlZE5hbWU7Ci0JCQl9Ci0JCX0KLQkJLy8gaGFjayg/KTogY2hlY2sgZm9yIGEgbWF0Y2hpbmcgaW1wb3J0IGJlY2F1c2Ugd2hlbiBtb3ZpbmcgYSBzdGFuZC1hbG9uZQotCQkvLyBhbm5vdGF0aW9uIHRvIGl0cyBjb250YWluZXIgaW4gQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgotCQkvLyB0aGUgY29udGFpbmVyJ3MgaW1wb3J0IGlzIGFkZGVkIGJ1dCB0aGVuIGl0IHdvbid0ICJyZXNvbHZlIiB1cG9uCi0JCS8vIHN1YnNlcXVlbnQgbG9va3VwcyAoYmVjYXVzZSB0aGUgcGFyc2VyIGhhc24ndCBoYWQgdGltZSB0byBydW4/KS4uLiA6LSgKLQkJcmV0dXJuIHRoaXMuY29udmVydFRvRnVsbENsYXNzTmFtZShhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIElmIG5lY2Vzc2FyeSwgdXNlIHRoZSBkZWNsYXJhdGlvbidzIGltcG9ydHMgdG8gY2FsY3VsYXRlIGEgZ3Vlc3MgYXMgdG8KLQkgKiB0aGUgc3BlY2lmaWVkIG5hbWUncyBmdWxseS1xdWFsaWZpZWQgZm9ybS4KLQkgKiBTaW1wbHkgcmV0dXJuIHRoZSB1bnF1YWxpZmllZCBuYW1lIGlmIHdlIGNhbid0ICJyZXNvbHZlIiBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb0Z1bGxDbGFzc05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJLy8gY2hlY2sgZm9yIGZ1bGx5LXF1YWxpZmllZCBuYW1lCi0JCXJldHVybiAobmFtZS5sYXN0SW5kZXhPZignLicpICE9IC0xKSA/IG5hbWUgOiB0aGlzLnJlc29sdmVBZ2FpbnN0SW1wb3J0cyhuYW1lLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogSWYgbmVjZXNzYXJ5LCB1c2UgdGhlIGRlY2xhcmF0aW9uJ3MgaW1wb3J0cyB0byBjYWxjdWxhdGUgYSBndWVzcyBhcyB0bwotCSAqIHRoZSBzcGVjaWZpZWQgbmFtZSdzIGZ1bGx5LXF1YWxpZmllZCBmb3JtLgotCSAqIFNpbXBseSByZXR1cm4gdGhlIHVucXVhbGlmaWVkIG5hbWUgaWYgd2UgY2FuJ3QgInJlc29sdmUiIGl0LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvRnVsbEVudW1Db25zdGFudE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaW50IGluZGV4MSA9IG5hbWUuaW5kZXhPZignLicpOwotCQlpZiAoaW5kZXgxID09IC0xKSB7Ci0JCQkvLyBzaG9ydCBuYW1lLCBlLmcuICJUWVBFIgotCQkJLy8gdHJ1ZSA9IGxvb2sgZm9yIHN0YXRpYyBpbXBvcnQgb2YgZW51bSBjb25zdGFudAotCQkJcmV0dXJuIHRoaXMucmVzb2x2ZUFnYWluc3RJbXBvcnRzKG5hbWUsIHRydWUpOwotCQl9Ci0KLQkJaW50IGluZGV4MiA9IG5hbWUuaW5kZXhPZignLicsIGluZGV4MSArIDEpOwotCQlpZiAoaW5kZXgyID09IC0xKSB7Ci0JCQkvLyBwYXJ0aWFsbHktcXVhbGlmaWVkIG5hbWUsIGUuZy4gIkVsZW1lbnRUeXBlLlRZUEUiCi0JCQkvLyBmYWxzZSA9IGxvb2sgcmVndWxhciBpbXBvcnQgb2YgZW51bSBjbGFzcywgbm90IHN0YXRpYyBpbXBvcnQgb2YgZW51bSBjb25zdGFudAotCQkJcmV0dXJuIHRoaXMucmVzb2x2ZUFnYWluc3RJbXBvcnRzKG5hbWUsIGZhbHNlKTsKLQkJfQotCi0JCS8vIGZ1bGx5LXF1YWxpZmllZCBuYW1lLCBlLmcuICJqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFIgotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBBdHRlbXB0IHRvIHJlc29sdmUgdGhlIHNwZWNpZmllZCAic2hvcnQiIG5hbWUgYWdhaW5zdCB0aGUgZGVjbGFyYXRpb24ncwotCSAqIGltcG9ydHMuIFJldHVybiB0aGUgbmFtZSB1bmNoYW5nZWQgaWYgd2UgY2FuJ3QgcmVzb2x2ZSBpdCAocGVyaGFwcyBpdCBpcwotCSAqIGluIHRoZSAiZGVmYXVsdCIgcGFja2FnZSkuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlQWdhaW5zdEltcG9ydHMoU3RyaW5nIHNob3J0TmFtZSwgYm9vbGVhbiBzdGF0aWNfKSB7Ci0JCWZvciAoSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbGFyYXRpb24gOiB0aGlzLmdldEltcG9ydHMoKSkgewotCQkJaWYgKGltcG9ydERlY2xhcmF0aW9uLmlzU3RhdGljKCkgPT0gc3RhdGljXykgewotCQkJCVN0cmluZyByZXNvbHZlZE5hbWUgPSB0aGlzLnJlc29sdmVBZ2FpbnN0SW1wb3J0KGltcG9ydERlY2xhcmF0aW9uLCBzaG9ydE5hbWUpOwotCQkJCWlmIChyZXNvbHZlZE5hbWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gcmVzb2x2ZWROYW1lOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2hvcnROYW1lOyAgLy8gImRlZmF1bHQiIHBhY2thZ2Ugb3IgdW5rbm93bgotCX0KLQotCS8qKgotCSAqIEF0dGVtcHQgdG8gcmVzb2x2ZSB0aGUgc3BlY2lmaWVkICJzaG9ydCIgbmFtZSBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQKLQkgKiBpbXBvcnQuIFJldHVybiB0aGUgcmVzb2x2ZWQgbmFtZSBpZiB0aGUgaW1wb3J0IHJlc29sdmVzIGl0OyBvdGhlcndpc2UKLQkgKiByZXR1cm4gbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVBZ2FpbnN0SW1wb3J0KEltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2xhcmF0aW9uLCBTdHJpbmcgc2hvcnROYW1lKSB7Ci0JCVN0cmluZyBpZG4gPSBpbXBvcnREZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCWlmIChpbXBvcnREZWNsYXJhdGlvbi5pc09uRGVtYW5kKCkpIHsKLQkJCVN0cmluZyBjYW5kaWRhdGUgPSBpZG4gKyAnLicgKyBzaG9ydE5hbWU7Ci0JCQlpZiAoaW1wb3J0RGVjbGFyYXRpb24uaXNTdGF0aWMoKSkgewotCQkJCWlmICh0aGlzLmVudW1SZXNvbHZlcyhpZG4sIHNob3J0TmFtZSkpIHsKLQkJCQkJcmV0dXJuIGNhbmRpZGF0ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICh0aGlzLnR5cGVSZXNvbHZlcyhjYW5kaWRhdGUpKSB7Ci0JCQkJCXJldHVybiBjYW5kaWRhdGU7Ci0JCQkJfQotCQkJfQotCQkJLy8gbm8gbWF0Y2gKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gZXhwbGljaXQgaW1wb3J0IC0gc2VlIHdoZXRoZXIgaXRzIGVuZCBtYXRjaGVzICdzaG9ydE5hbWUnCi0JCWludCBwZXJpb2QgPSBpZG4ubGVuZ3RoKCkgLSBzaG9ydE5hbWUubGVuZ3RoKCkgLSAxOwotCQlpZiAocGVyaW9kIDwgMSkgewotCQkJLy8gc29tZXRoaW5nIG11c3QgcHJlY2VkZSBwZXJpb2QKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICgoaWRuLmNoYXJBdChwZXJpb2QpID09ICcuJykgJiYgaWRuLmVuZHNXaXRoKHNob3J0TmFtZSkpIHsKLQkJCXJldHVybiBpZG47ICAvLyBwcm9iYWJsZSBleGFjdCBtYXRjaAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjZWxsYW5lb3VzIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIEFTVE5vZGUgZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmFkYXB0ZXIuZ2V0RGVjbGFyYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlY2xhcmF0aW9uJ3MgbGlzdCBvZiBtb2RpZmllcnMuCi0JICogRWxlbWVudCB0eXBlOiBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUV4dGVuZGVkTW9kaWZpZXIKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gZ2V0TW9kaWZpZXJzKCkgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldE1vZGlmaWVycygpOwotCX0KLQotCXB1YmxpYyBBU1QgZ2V0QXN0KCkgewotCQlyZXR1cm4gdGhpcy5nZXREZWNsYXJhdGlvbigpLmdldEFTVCgpOwotCX0KLQotCXByb3RlY3RlZCBDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCkgewotCQlyZXR1cm4gKENvbXBpbGF0aW9uVW5pdCkgdGhpcy5nZXREZWNsYXJhdGlvbigpLmdldFJvb3QoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmFkYXB0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlY2xhcmF0aW9uIGFkYXB0ZXIgaW50ZXJmYWNlIGFuZCBpbXBsZW1lbnRhdGlvbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogRGVmaW5lIGNvbW1vbiBwcm90b2NvbCBhbW9uZyB0aGUgdmFyaW91cyAiZGVjbGFyYXRpb25zIi4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIEFkYXB0ZXIgewotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGFkYXB0ZWQgImRlY2xhcmF0aW9uIi4KLQkJICovCi0JCUFTVE5vZGUgZ2V0RGVjbGFyYXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSAiZGVjbGFyYXRpb24iJ3MgbGlzdCBvZiBtb2RpZmllcnMuCi0JCSAqIEVsZW1lbnQgdHlwZTogb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklFeHRlbmRlZE1vZGlmaWVyCi0JCSAqLwotCQlMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBnZXRNb2RpZmllcnMoKTsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQm9keURlY2xhcmF0aW9uQWRhcHRlciBpbXBsZW1lbnRzIEFkYXB0ZXIgewotCQlwcml2YXRlIGZpbmFsIEJvZHlEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbjsKLQkJcHVibGljIEJvZHlEZWNsYXJhdGlvbkFkYXB0ZXIoQm9keURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uOwotCQl9Ci0JCXB1YmxpYyBBU1ROb2RlIGdldERlY2xhcmF0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb247Ci0JCX0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBnZXRNb2RpZmllcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbi5tb2RpZmllcnMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZGVjbGFyYXRpb24udG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQYWNrYWdlRGVjbGFyYXRpb25BZGFwdGVyIGltcGxlbWVudHMgQWRhcHRlciB7Ci0JCXByaXZhdGUgZmluYWwgUGFja2FnZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uOwotCQlwdWJsaWMgUGFja2FnZURlY2xhcmF0aW9uQWRhcHRlcihQYWNrYWdlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247Ci0JCX0KLQkJcHVibGljIEFTVE5vZGUgZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbjsKLQkJfQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IGdldE1vZGlmaWVycygpIHsKLQkJCXJldHVybiB0aGlzLmRlY2xhcmF0aW9uLmFubm90YXRpb25zKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmRlY2xhcmF0aW9uLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCQotCS8qcHVibGljIHN0YXRpYyBjbGFzcyBBU1ROb2RlQWRhcHRlciBpbXBsZW1lbnRzIEFkYXB0ZXIgewotCQlwcml2YXRlIGZpbmFsIEFTVE5vZGUgZGVjbGFyYXRpb247Ci0JCXB1YmxpYyBBU1ROb2RlQWRhcHRlcihBU1ROb2RlIGRlY2xhcmF0aW9uKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uOwotCQl9Ci0JCXB1YmxpYyBBU1ROb2RlIGdldERlY2xhcmF0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb247Ci0JCX0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBnZXRNb2RpZmllcnMoKSB7Ci0JCQlpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBCb2R5RGVjbGFyYXRpb24pIHsKLQkJCQlyZXR1cm4gKChCb2R5RGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uKS5tb2RpZmllcnMoKTsJCQkJCi0JCQl9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgUGFja2FnZURlY2xhcmF0aW9uKSB7Ci0JCQkJcmV0dXJuICgoUGFja2FnZURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbikuYW5ub3RhdGlvbnMoKTsJCQkJCi0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmRlY2xhcmF0aW9uLnRvU3RyaW5nKCkpOwotCQl9Ci0JfSovCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb25BZGFwdGVyIGltcGxlbWVudHMgQWRhcHRlciB7Ci0JCXByaXZhdGUgZmluYWwgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbjsKLQkJcHVibGljIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb25BZGFwdGVyKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247Ci0JCX0KLQkJcHVibGljIEFTVE5vZGUgZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbjsKLQkJfQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IGdldE1vZGlmaWVycygpIHsKLQkJCXJldHVybiB0aGlzLmRlY2xhcmF0aW9uLm1vZGlmaWVycygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kZWNsYXJhdGlvbi50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb25BZGFwdGVyIGltcGxlbWVudHMgQWRhcHRlciB7Ci0JCXByaXZhdGUgZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gZGVjbGFyYXRpb247Ci0JCXB1YmxpYyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbkFkYXB0ZXIoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gZGVjbGFyYXRpb24pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247Ci0JCX0KLQkJcHVibGljIEFTVE5vZGUgZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbjsKLQkJfQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IGdldE1vZGlmaWVycygpIHsKLQkJCXJldHVybiB0aGlzLmRlY2xhcmF0aW9uLm1vZGlmaWVycygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kZWNsYXJhdGlvbi50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudEFkYXB0ZXIgaW1wbGVtZW50cyBBZGFwdGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IGRlY2xhcmF0aW9uOwotCQlwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudEFkYXB0ZXIoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBkZWNsYXJhdGlvbikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbjsKLQkJfQotCQlwdWJsaWMgQVNUTm9kZSBnZXREZWNsYXJhdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmRlY2xhcmF0aW9uOwotCQl9Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gZ2V0TW9kaWZpZXJzKCkgewotCQkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb24ubW9kaWZpZXJzKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmRlY2xhcmF0aW9uLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRQYWNrYWdlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNTc5MjguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiBSZWQgSGF0LCBJbmMuIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgUmVkIEhhdCwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIE9yYWNsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JUGFja2FnZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmRFeGVjdXRvcjsKLQotcHVibGljIGNsYXNzIEpEVFBhY2thZ2UKLQlleHRlbmRzIEpEVEFubm90YXRlZEVsZW1lbnQgCi0JaW1wbGVtZW50cyBBbm5vdGF0ZWRQYWNrYWdlCi17Ci0JcHJvdGVjdGVkIEpEVFBhY2thZ2UoUGFja2FnZURlY2xhcmF0aW9uIGRlY2xhcmluZ1BhY2thZ2UsCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcikgewotCQlzdXBlcihkZWNsYXJpbmdQYWNrYWdlLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgCi0JCQkJY29tcGlsYXRpb25Vbml0LAotCQkJCW1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKTsKLQl9Ci0KLQlwdWJsaWMgSkRUUGFja2FnZSgKLQkJCVBhY2thZ2VEZWNsYXJhdGlvbiBkZWNsYXJpbmdQYWNrYWdlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsCi0JCQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcikgewotCQlzdXBlcihkZWNsYXJpbmdQYWNrYWdlLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwKLQkJCQljb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE1vZGlmaWVkRGVjbGFyYXRpb24gZ2V0TW9kaWZpZWREZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IEpEVE1vZGlmaWVkRGVjbGFyYXRpb24odGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyBJUGFja2FnZUJpbmRpbmcgZ2V0QmluZGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlQYWNrYWdlRGVjbGFyYXRpb24gcGQgPSB0aGlzLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KTsKLQkJcmV0dXJuIChwZCA9PSBudWxsKSA/IG51bGwgOiBwZC5yZXNvbHZlQmluZGluZygpOwotCX0KLQotCXB1YmxpYyBQYWNrYWdlRGVjbGFyYXRpb24gZ2V0Qm9keURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBhc3RSb290LmdldFBhY2thZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIEFTVFRvb2xzLmJ1aWxkVGV4dFJhbmdlKHRoaXMuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpLmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUVHlwZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGQzZGExLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVudW1EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRmllbGREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kRXhlY3V0b3I7Ci0KLS8qKgotICogQWRhcHQgYW5kIGV4dGVuZCBhIEpEVCB0eXBlLgotICovCi1wdWJsaWMgY2xhc3MgSkRUVHlwZQotCWV4dGVuZHMgQWJzdHJhY3RKRFRUeXBlCi0JaW1wbGVtZW50cyBUeXBlCi17Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvciBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQncyBwcmltYXJ5IHR5cGUKLQkgKi8KLQlwdWJsaWMgSkRUVHlwZSgKLQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sICAvLyBleGNsdWRlIGFubm90YXRpb25zIGFuZCBlbnVtcwotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IpIHsKLQkJdGhpcyh0eXBlRGVjbGFyYXRpb24sIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvciBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQncyBwcmltYXJ5IHR5cGUKLQkgKi8KLQlwdWJsaWMgSkRUVHlwZSgKLQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sICAvLyBleGNsdWRlIGFubm90YXRpb25zIGFuZCBlbnVtcwotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsCi0JCQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcikgewotCQl0aGlzKG51bGwsIHR5cGVEZWNsYXJhdGlvbiwgMSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpOwotCX0KLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciBuZXN0ZWQgdHlwZXMKLQkgKi8KLQlwdWJsaWMgSkRUVHlwZSgKLQkJCVR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sICAvLyBleGNsdWRlIGFubm90YXRpb25zIGFuZCBlbnVtcwotCQkJaW50IG9jY3VycmVuY2UsCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcikgewotCQl0aGlzKGRlY2xhcmluZ1R5cGUsIHR5cGVEZWNsYXJhdGlvbiwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciBuZXN0ZWQgdHlwZXMKLQkgKi8KLQlwdWJsaWMgSkRUVHlwZSgKLQkJCVR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sICAvLyBleGNsdWRlIGFubm90YXRpb25zIGFuZCBlbnVtcwotCQkJaW50IG9jY3VycmVuY2UsCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwKLQkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKSB7Ci0JCXN1cGVyKGRlY2xhcmluZ1R5cGUsIHR5cGVEZWNsYXJhdGlvbiwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpOwotCX0KLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciB0ZXN0aW5nCi0JICovCi0JcHVibGljIEpEVFR5cGUoVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgbmFtZSwgaW50IG9jY3VycmVuY2UsIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7Ci0JCXN1cGVyKGRlY2xhcmluZ1R5cGUsIG5hbWUsIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE1lbWJlci9UeXBlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIGZpbmQgdGhlIHR5cGUncyBib2R5IGRlY2xhcmF0aW9uIGluIHRoZSBzcGVjaWZpZWQgQVNUCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFR5cGVEZWNsYXJhdGlvbiBnZXRCb2R5RGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIChUeXBlRGVjbGFyYXRpb24pIHN1cGVyLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RhYmxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUlUeXBlQmluZGluZyBiaW5kaW5nID0gdGhpcy5nZXRCaW5kaW5nKGFzdFJvb3QpOwotCQlyZXR1cm4gKGJpbmRpbmcgPT0gbnVsbCkgPyBmYWxzZSA6IEpQVFRvb2xzLnR5cGVJc1BlcnNpc3RhYmxlKG5ldyBKUFRUb29sc0FkYXB0ZXIoYmluZGluZykpOwotCX0KLQotCXB1YmxpYyBUeXBlRGVjbGFyYXRpb25bXSBnZXRUeXBlcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkuZ2V0VHlwZXMoKTsKLQl9Ci0KLQlwdWJsaWMgRW51bURlY2xhcmF0aW9uW10gZ2V0RW51bXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEVudW1zKHRoaXMuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgRmllbGREZWNsYXJhdGlvbltdIGdldEZpZWxkcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkuZ2V0RmllbGRzKCk7Ci0JfQotCi0JcHVibGljIE1ldGhvZERlY2xhcmF0aW9uW10gZ2V0TWV0aG9kcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkuZ2V0TWV0aG9kcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGZpcnN0IHRvcC1sZXZlbCB0eXBlIGluIHRoZSBzcGVjaWZpZWQgQVNUIHdpdGggYSBtYXRjaGluZyBuYW1lCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFR5cGVEZWNsYXJhdGlvbiBnZXRUb3BMZXZlbFR5cGVEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gKFR5cGVEZWNsYXJhdGlvbikgc3VwZXIuZ2V0VG9wTGV2ZWxUeXBlRGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFR5cGVEZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oTGlzdDxBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbj4gdHlwZURlY2xhcmF0aW9ucykgewotCQlyZXR1cm4gKFR5cGVEZWNsYXJhdGlvbikgc3VwZXIuZ2V0VHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbnMpOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgbmVzdGVkIHR5cGUgd2l0aCBhIG1hdGNoaW5nIG5hbWUgYW5kIG9jY3VycmVuY2UKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVHlwZURlY2xhcmF0aW9uIGdldE5lc3RlZFR5cGVEZWNsYXJhdGlvbihUeXBlRGVjbGFyYXRpb24gZGVjbGFyaW5nVHlwZURlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVEZWNsYXJhdGlvbihkZWNsYXJpbmdUeXBlRGVjbGFyYXRpb24uZ2V0VHlwZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSB0eXBlIGRlY2xhcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUgZnJvbSB0aGUgc3BlY2lmaWVkCi0JICogc2V0IG9mIHR5cGUgZGVjbGFyYXRpb25zIChtYXRjaCBuYW1lIGFuZCBvY2N1cnJlbmNlKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUeXBlRGVjbGFyYXRpb24gZ2V0VHlwZURlY2xhcmF0aW9uKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uW10gdHlwZURlY2xhcmF0aW9ucykgewotCQlyZXR1cm4gKFR5cGVEZWNsYXJhdGlvbikgc3VwZXIuZ2V0VHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbnMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgZ2V0QVNUTm9kZVR5cGUoKSB7Ci0JCXJldHVybiBBU1ROb2RlLlRZUEVfREVDTEFSQVRJT047Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEpQVCB0b29scyBhZGFwdGVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgSlBUVG9vbHNBZGFwdGVyCi0JCWltcGxlbWVudHMgSlBUVG9vbHMuVHlwZUFkYXB0ZXIKLQl7Ci0JCXByaXZhdGUgZmluYWwgSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nOwotCQlwcm90ZWN0ZWQgSlBUVG9vbHNBZGFwdGVyKElUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotCQkJc3VwZXIoKTsKLQkJCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLnR5cGVCaW5kaW5nID0gdHlwZUJpbmRpbmc7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKLQkJCXJldHVybiB0aGlzLnR5cGVCaW5kaW5nLmdldE1vZGlmaWVycygpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNBbm5vdGF0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMudHlwZUJpbmRpbmcuaXNBbm5vdGF0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0Fub255bW91cygpIHsKLQkJCXJldHVybiB0aGlzLnR5cGVCaW5kaW5nLmlzQW5vbnltb3VzKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCQkJcmV0dXJuIHRoaXMudHlwZUJpbmRpbmcuaXNBcnJheSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNFbnVtKCkgewotCQkJcmV0dXJuIHRoaXMudHlwZUJpbmRpbmcuaXNFbnVtKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHsKLQkJCXJldHVybiB0aGlzLnR5cGVCaW5kaW5nLmlzSW50ZXJmYWNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0xvY2FsKCkgewotCQkJcmV0dXJuIHRoaXMudHlwZUJpbmRpbmcuaXNMb2NhbCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNNZW1iZXIoKSB7Ci0JCQlyZXR1cm4gdGhpcy50eXBlQmluZGluZy5pc01lbWJlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JCQlyZXR1cm4gdGhpcy50eXBlQmluZGluZy5pc1ByaW1pdGl2ZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSlBUVG9vbHMuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pQVFRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOTMwYzguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSlBUVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotCi0vKioKLSAqIENvbnZlbmllbmNlIG1ldGhvZHMgZm9yIEpQQS1yZWxhdGVkIHF1ZXJpZXMgY29uY2VybmluZyBKRFQgb2JqZWN0cy4KLSAqLwotLy9UT0RPIHRoaXMgbmVlZHMgdG8gbW92ZSBiZWNhdXNlIGl0IGlzIG9ubHkgdXNlZCBmb3IgSlBBCi1wdWJsaWMgY2xhc3MgSlBUVG9vbHMgewotCi0JLy8gKioqKioqKioqKiB0eXBlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdHlwZSBjYW4gYmUgInBlcnNpc3RlZCIsIGkuZS4gbWFya2VkIGFzCi0JICogRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzLCBFbWJlZGRhYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHR5cGVJc1BlcnNpc3RhYmxlKFR5cGVBZGFwdGVyIHR5cGVBZGFwdGVyKSB7Ci0JCWlmICh0eXBlQWRhcHRlci5pc0ludGVyZmFjZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHR5cGVBZGFwdGVyLmlzQW5ub3RhdGlvbigpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHR5cGVBZGFwdGVyLmlzRW51bSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHR5cGVBZGFwdGVyLmlzTG9jYWwoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICh0eXBlQWRhcHRlci5pc0Fub255bW91cygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHR5cGVBZGFwdGVyLmlzUHJpbWl0aXZlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZSg/KQotCQl9Ci0JCWlmICh0eXBlQWRhcHRlci5pc0FycmF5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZSg/KQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFF1ZXJpZXMgbmVlZGVkIHRvIGNhbGN1bGF0ZSB3aGV0aGVyIGEgdHlwZSBpcyAicGVyc2lzdGFibGUiLgotCSAqIEFkYXB0ZWQgdG8gSVR5cGVCaW5kaW5nIGFuZCBJVHlwZS4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIFR5cGVBZGFwdGVyIHsKLQkJaW50IGdldE1vZGlmaWVycygpOwotCQlib29sZWFuIGlzQW5ub3RhdGlvbigpOwotCQlib29sZWFuIGlzQW5vbnltb3VzKCk7Ci0JCWJvb2xlYW4gaXNBcnJheSgpOwotCQlib29sZWFuIGlzRW51bSgpOwotCQlib29sZWFuIGlzSW50ZXJmYWNlKCk7Ci0JCWJvb2xlYW4gaXNMb2NhbCgpOwotCQlib29sZWFuIGlzTWVtYmVyKCk7Ci0JCWJvb2xlYW4gaXNQcmltaXRpdmUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmllbGQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWVsZCBtYXkgYmUgInBlcnNpc3RlZCIuCi0JICogQWNjb3JkaW5nIHRvIHRoZSBzcGVjLCAiQWxsIG5vbi10cmFuc2llbnQgaW5zdGFuY2UgdmFyaWFibGVzIHRoYXQgYXJlIG5vdCAKLQkgKiBhbm5vdGF0ZWQgd2l0aCB0aGUgVHJhbnNpZW50IGFubm90YXRpb24gYXJlIHBlcnNpc3RlbnQuIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmaWVsZElzUGVyc2lzdGFibGUoRmllbGRBZGFwdGVyIGZpZWxkQWRhcHRlcikgewotCQlpbnQgbW9kaWZpZXJzID0gZmllbGRBZGFwdGVyLmdldE1vZGlmaWVycygpOwotCQlpZiAoTW9kaWZpZXIuaXNTdGF0aWMobW9kaWZpZXJzKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChNb2RpZmllci5pc1RyYW5zaWVudChtb2RpZmllcnMpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUXVlcmllcyBuZWVkZWQgdG8gY2FsY3VsYXRlIHdoZXRoZXIgYSBmaWVsZCBpcyAicGVyc2lzdGFibGUiLgotCSAqIEFkYXB0ZWQgdG8gSVZhcmlhYmxlQmluZGluZyBhbmQgSUZpZWxkLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgRmllbGRBZGFwdGVyIHsKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgZmllbGQncyBtb2RpZmllcnMuIFdlIHVzZSB0aGVzZSB0byBjaGVjayB3aGV0aGVyIHRoZQotCQkgKiBmaWVsZCBpcyBzdGF0aWMgb3IgdHJhbnNpZW50LgotCQkgKi8KLQkJaW50IGdldE1vZGlmaWVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZXRob2QgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBtZXRob2QgaXMgYSAiZ2V0dGVyIiBtZXRob2QgdGhhdAotCSAqIHJlcHJlc2VudHMgYSBwcm9wZXJ0eSB0aGF0IG1heSBiZSAicGVyc2lzdGVkIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKE1ldGhvZEFkYXB0ZXIgbWV0aG9kQWRhcHRlcikgewotCQlpZiAobWV0aG9kSGFzSW52YWxpZE1vZGlmaWVycyhtZXRob2RBZGFwdGVyKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChtZXRob2RBZGFwdGVyLmlzQ29uc3RydWN0b3IoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIHJldHVyblR5cGVOYW1lID0gbWV0aG9kQWRhcHRlci5nZXRSZXR1cm5UeXBlRXJhc3VyZU5hbWUoKTsKLQkJaWYgKHJldHVyblR5cGVOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIERPTSBtZXRob2QgYmluZGluZ3MgY2FuIGhhdmUgYSBudWxsIG5hbWUKLQkJfQotCQlpZiAocmV0dXJuVHlwZU5hbWUuZXF1YWxzKCJ2b2lkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChtZXRob2RIYXNQYXJhbWV0ZXJzKG1ldGhvZEFkYXB0ZXIpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlTdHJpbmcgbmFtZSA9IG1ldGhvZEFkYXB0ZXIuZ2V0TmFtZSgpOwotCQlpbnQgYmVnaW5JbmRleCA9IDA7Ci0JCWJvb2xlYW4gYm9vbGVhbkdldHRlciA9IGZhbHNlOwotCQlpZiAobmFtZS5zdGFydHNXaXRoKCJpcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChyZXR1cm5UeXBlTmFtZS5lcXVhbHMoImJvb2xlYW4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJYmVnaW5JbmRleCA9IDI7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoImdldCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWJlZ2luSW5kZXggPSAzOwotCQkJaWYgKHJldHVyblR5cGVOYW1lLmVxdWFscygiYm9vbGVhbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlib29sZWFuR2V0dGVyID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBjYXBpdGFsaXplZEF0dHJpYnV0ZU5hbWUgPSBuYW1lLnN1YnN0cmluZyhiZWdpbkluZGV4KTsKLQkJLy8gaWYgdGhlIHR5cGUgaGFzIGJvdGggbWV0aG9kczoKLQkJLy8gICAgIGJvb2xlYW4gaXNQcm9wZXJ0eSgpCi0JCS8vICAgICBib29sZWFuIGdldFByb3BlcnR5KCkKLQkJLy8gdGhlbiAjaXNQcm9wZXJ0eSgpIHRha2VzIHByZWNlZGVuY2UgYW5kIHdlIGlnbm9yZSAjZ2V0UHJvcGVydHkoKTsKLQkJLy8gYnV0IG9ubHkgaGF2aW5nICNnZXRQcm9wZXJ0eSgpIGlzIE9LIHRvbwotCQkvLyAoc2VlIHRoZSBKYXZhQmVhbnMgc3BlYyAxLjAxKQotCQlpZiAoYm9vbGVhbkdldHRlciAmJiBtZXRob2RIYXNWYWxpZFNpYmxpbmdJc01ldGhvZChtZXRob2RBZGFwdGVyLCBjYXBpdGFsaXplZEF0dHJpYnV0ZU5hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBzaW5jZSB0aGUgdHlwZSBhbHNvIGRlZmluZXMgI2lzUHJvcGVydHkoKSwgaWdub3JlICNnZXRQcm9wZXJ0eSgpCi0JCX0KLQkJcmV0dXJuIG1ldGhvZEhhc1ZhbGlkU2libGluZ1NldE1ldGhvZChtZXRob2RBZGFwdGVyLCBjYXBpdGFsaXplZEF0dHJpYnV0ZU5hbWUsIHJldHVyblR5cGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWV0aG9kJ3MgbW9kaWZpZXJzIHByZXZlbnQgaXQKLQkgKiBmcm9tIGJlaW5nIGEgZ2V0dGVyIG9yIHNldHRlciBmb3IgYSAicGVyc2lzdGVudCIgcHJvcGVydHkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtZXRob2RIYXNJbnZhbGlkTW9kaWZpZXJzKFNpbXBsZU1ldGhvZEFkYXB0ZXIgbWV0aG9kQWRhcHRlcikgewotCQlpbnQgbW9kaWZpZXJzID0gbWV0aG9kQWRhcHRlci5nZXRNb2RpZmllcnMoKTsKLQkJaWYgKE1vZGlmaWVyLmlzU3RhdGljKG1vZGlmaWVycykpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG1ldGhvZEhhc1BhcmFtZXRlcnMoTWV0aG9kQWRhcHRlciBtZXRob2RBZGFwdGVyKSB7Ci0JCXJldHVybiBtZXRob2RBZGFwdGVyLmdldFBhcmFtZXRlcnNMZW5ndGgoKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtZXRob2QgaGFzIGEgc2libGluZyAiaXMiIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZAotCSAqIHByb3BlcnR5IGFuZCB0aGF0IG1ldGhvZCBpcyB2YWxpZCBmb3IgYSAicGVyc2lzdGFibGUiIHByb3BlcnR5LgotCSAqIFByZS1jb25kaXRpb246IHRoZSBtZXRob2QgaXMgYSAiYm9vbGVhbiBnZXR0ZXIiIChlLmcuICdwdWJsaWMgYm9vbGVhbiBnZXRQcm9wZXJ0eSgpJyk7Ci0JICogdGhpcyBwcmV2ZW50cyB1cyBmcm9tIHJldHVybmluZyB0cnVlIHdoZW4gdGhlIG1ldGhvZCBpdHNlbGYgaXMgYW4KLQkgKiAiaXMiIG1ldGhvZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG1ldGhvZEhhc1ZhbGlkU2libGluZ0lzTWV0aG9kKE1ldGhvZEFkYXB0ZXIgbWV0aG9kQWRhcHRlciwgU3RyaW5nIGNhcGl0YWxpemVkQXR0cmlidXRlTmFtZSkgewotCQlTaW1wbGVNZXRob2RBZGFwdGVyIGlzTWV0aG9kQWRhcHRlciA9IG1ldGhvZEFkYXB0ZXIuZ2V0U2libGluZygiaXMiICsgY2FwaXRhbGl6ZWRBdHRyaWJ1dGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbWV0aG9kSXNWYWxpZFNpYmxpbmcoaXNNZXRob2RBZGFwdGVyLCAiYm9vbGVhbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1ldGhvZCBoYXMgYSBzaWJsaW5nICJzZXQiIG1ldGhvZAotCSAqIGFuZCB0aGF0IG1ldGhvZCBpcyB2YWxpZCBmb3IgYSAicGVyc2lzdGFibGUiIHByb3BlcnR5LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWV0aG9kSGFzVmFsaWRTaWJsaW5nU2V0TWV0aG9kKE1ldGhvZEFkYXB0ZXIgbWV0aG9kQWRhcHRlciwgU3RyaW5nIGNhcGl0YWxpemVkQXR0cmlidXRlTmFtZSwgU3RyaW5nIHBhcmFtZXRlclR5cGVFcmFzdXJlTmFtZSkgewotCQlTaW1wbGVNZXRob2RBZGFwdGVyIHNldE1ldGhvZEFkYXB0ZXIgPSBtZXRob2RBZGFwdGVyLmdldFNpYmxpbmcoInNldCIgKyBjYXBpdGFsaXplZEF0dHJpYnV0ZU5hbWUsIHBhcmFtZXRlclR5cGVFcmFzdXJlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG1ldGhvZElzVmFsaWRTaWJsaW5nKHNldE1ldGhvZEFkYXB0ZXIsICJ2b2lkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIG1ldGhvZCBpcyBhIHZhbGlkIHNpYmxpbmcgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgcmV0dXJuIHR5cGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtZXRob2RJc1ZhbGlkU2libGluZyhTaW1wbGVNZXRob2RBZGFwdGVyIG1ldGhvZEFkYXB0ZXIsIFN0cmluZyByZXR1cm5UeXBlTmFtZSkgewotCQlpZiAobWV0aG9kQWRhcHRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKG1ldGhvZEhhc0ludmFsaWRNb2RpZmllcnMobWV0aG9kQWRhcHRlcikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAobWV0aG9kQWRhcHRlci5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgcnROYW1lID0gbWV0aG9kQWRhcHRlci5nZXRSZXR1cm5UeXBlRXJhc3VyZU5hbWUoKTsKLQkJaWYgKHJ0TmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBET00gbWV0aG9kIGJpbmRpbmdzIGNhbiBoYXZlIGEgbnVsbCBuYW1lCi0JCX0KLQkJcmV0dXJuIHJ0TmFtZS5lcXVhbHMocmV0dXJuVHlwZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFF1ZXJpZXMgbmVlZGVkIHRvIGNhbGN1bGF0ZSB3aGV0aGVyIGEgbWV0aG9kIGlzICJwZXJzaXN0YWJsZSIuCi0JICogQWRhcHRlZCB0byBJTWV0aG9kQmluZGluZyBhbmQgSU1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIFNpbXBsZU1ldGhvZEFkYXB0ZXIgewotCQkvKioKLQkJICogUmV0dXJuIHRoZSBtZXRob2QncyBtb2RpZmllcnMuCi0JCSAqIFdlIHVzZSB0aGVzZSB0byBjaGVjayB3aGV0aGVyIHRoZSBtZXRob2QgaXMgc3RhdGljLCBmaW5hbCwgZXRjLgotCQkgKi8KLQkJaW50IGdldE1vZGlmaWVycygpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCdzIHJldHVybiB0eXBlIGVyYXN1cmUuCi0JCSAqIFdlIHVzZSB0aGlzIHRvIGNoZWNrIGZvcgotCQkgKiAgIC0gYm9vbGVhbiBnZXR0ZXJzCi0JCSAqICAgLSB2b2lkIHJldHVybiB0eXBlcwotCQkgKiAgIC0gbWF0Y2hpbmcgZ2V0dGVycyBhbmQgc2V0dGVycwotCQkgKi8KLQkJU3RyaW5nIGdldFJldHVyblR5cGVFcmFzdXJlTmFtZSgpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWV0aG9kIGlzIGEgY29uc3RydWN0b3IuCi0JCSAqLwotCQlib29sZWFuIGlzQ29uc3RydWN0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBRdWVyaWVzIG5lZWRlZCB0byBjYWxjdWxhdGUgd2hldGhlciBhIG1ldGhvZCBpcyAicGVyc2lzdGFibGUiLgotCSAqIEFkYXB0ZWQgdG8gSU1ldGhvZEJpbmRpbmcgYW5kIElNZXRob2QuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBNZXRob2RBZGFwdGVyIGV4dGVuZHMgU2ltcGxlTWV0aG9kQWRhcHRlciB7Ci0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG1ldGhvZCdzIG5hbWUuCi0JCSAqIFdlIHVzZSB0aGlzIHRvIGRldGVybWluZQotCQkgKiAgIC0gd2hldGhlciB0aGUgbWV0aG9kIGlzIGEgImdldHRlciIKLQkJICogICAtIHRoZSBwcm9wZXJ0eSBuYW1lIGltcGxpZWQgYnkgdGhlIGdldHRlcidzIG5hbWUKLQkJICovCi0JCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHBhcmFtdGVycyBkZWNsYXJlZCBieSB0aGUgbWV0aG9kLgotCQkgKiBXZSB1c2UgdGhpcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgbWV0aG9kIGlzIGEgImdldHRlciIuCi0JCSAqLwotCQlpbnQgZ2V0UGFyYW1ldGVyc0xlbmd0aCgpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG1ldGhvZCdzICJzaWJsaW5nIiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgbm8gcGFyYW1ldGVycy4KLQkJICogV2UgdXNlIHRoaXMgdG8gZmluZCBhbiAiaXMiIGJvb2xlYW4gZ2V0dGVyIHRoYXQgd291bGQgdGFrZSBwcmVjZWRlbmNlCi0JCSAqIG92ZXIgYSAiZ2V0IiBib29sZWFuIGdldHRlci4KLQkJICovCi0JCVNpbXBsZU1ldGhvZEFkYXB0ZXIgZ2V0U2libGluZyhTdHJpbmcgbmFtZSk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbWV0aG9kJ3MgInNpYmxpbmciIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBzaW5nbGUgcGFyYW1ldGVyLgotCQkgKiBXZSB1c2UgdGhpcyB0byBmaW5kIGEgbWF0Y2hpbmcgInNldHRlciIgZm9yIGEgcG9zc2libGUgImdldHRlciIuCi0JCSAqLwotCQlTaW1wbGVNZXRob2RBZGFwdGVyIGdldFNpYmxpbmcoU3RyaW5nIG5hbWUsIFN0cmluZyBwYXJhbWV0ZXJUeXBlRXJhc3VyZU5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdXBwcmVzc2VkIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBKUFRUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OYW1lU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmFtZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM5YmM0Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OYW1lU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotCi0vKioKLSAqIENvbnZlcnQgYSBuYW1lIHRvL2Zyb20gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBuYW1lL2lkZW50aWZpZXIKLSAqIChlLmcuICJjb20ueHh4LkZvby5WQUxVRTEiIG9yICJ2YWx1ZSIpLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTmFtZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIKLQlleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IElOU1RBTkNFID0gbmV3IE5hbWVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBOYW1lU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmFtZSBjb252ZXJ0T2JqZWN0KFN0cmluZyBzdHJpbmcsIEFTVCBhc3QpIHsKLQkJcmV0dXJuIGFzdC5uZXdOYW1lKHN0cmluZyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJc3dpdGNoIChleHByZXNzaW9uLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgQVNUTm9kZS5RVUFMSUZJRURfTkFNRToKLQkJCWNhc2UgQVNUTm9kZS5TSU1QTEVfTkFNRToKLQkJCQlyZXR1cm4gKChOYW1lKSBleHByZXNzaW9uKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L05lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L05lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdlYjk1Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci0KLS8qKgotICogTWFuaXB1bGF0ZSBhbiBhbm5vdGF0aW9uIHRoYXQgaXMgZW1iZWRkZWQgYXMgYW4gZWxlbWVudCB3aXRoaW4KLSAqIGFub3RoZXIgYW5ub3RhdGlvbiwgZS5nLgotICogPHByZT4KLSAqICAgICAmIzY0O091dGVyKGZvbz0mIzY0O0lubmVyKQotICogICAgIHByaXZhdGUgaW50IGlkOwotICogICAgICAgICBvdXRlckFubm90YXRpb25BZGFwdGVyID0gQW5ub3RhdGlvbkFkYXB0ZXI8JiM2NDtPdXRlcj4KLSAqICAgICAgICAgZWxlbWVudE5hbWUgPSAiZm9vIgotICogICAgICAgICBhbm5vdGF0aW9uTmFtZSA9ICJJbm5lciIKLSAqIDwvcHJlPgotICovCi1wdWJsaWMgY2xhc3MgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgotCWV4dGVuZHMgQWJzdHJhY3ROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyCi17Ci0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzIDxjb2RlPnZhbHVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIG91dGVyQW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlzdXBlcihvdXRlckFubm90YXRpb25BZGFwdGVyLCBhbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogZGVmYXVsdCBiZWhhdmlvciBpcyB0byByZW1vdmUgdGhlIG91dGVyIGFubm90YXRpb24gd2hlbiBpdCBpcyBlbXB0eQotCSAqLwotCXB1YmxpYyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgb3V0ZXJBbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJc3VwZXIob3V0ZXJBbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQWJzdHJhY3ROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oRXhwcmVzc2lvbiB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uVmFsdWUodmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFeHByZXNzaW9uIGJ1aWxkTmV3SW5uZXJFeHByZXNzaW9uKEFubm90YXRpb24gaW5uZXIpIHsKLQkJcmV0dXJuIGlubmVyOwotCX0KLQotCS8qKgotCSAqIHRoZSBhbm5vdGF0aW9uIGlzIHRoZSBleHByZXNzaW9uIGl0c2VsZiwgc28gdGhlIGFubm90YXRpb24gY2Fubm90IGJlCi0JICogInJlbW92ZWQiIGZyb20gaXRzZWxmIC0gcmV0dXJuICdmYWxzZScKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gb3V0ZXIsIEV4cHJlc3Npb24gdmFsdWUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIDxwcmU+Ci0JICogJiM2NDtPdXRlcigibG9yZW0gaXBzdW0iKSA9PiAmIzY0O091dGVyKCYjNjQ7SW5uZXIpCi0JICogPC9wcmU+Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbW9kaWZ5QW5ub3RhdGlvblZhbHVlKFNpbmdsZU1lbWJlckFubm90YXRpb24gb3V0ZXIsIEFubm90YXRpb24gaW5uZXIpIHsKLQkJLy8gcmVwbGFjZSg/KSB0aGUgY3VycmVudCBlbGVtZW50IHZhbHVlCi0JCW91dGVyLnNldFZhbHVlKGlubmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTaW1wbHkgc2V0IHRoZSBwYWlyJ3MgdmFsdWUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbW9kaWZ5TWVtYmVyVmFsdWVQYWlyKE1lbWJlclZhbHVlUGFpciBwYWlyLCBBbm5vdGF0aW9uIGlubmVyKSB7Ci0JCXBhaXIuc2V0VmFsdWUoaW5uZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L05lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZmQ3NDMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotCi0vKioKLSAqIE1hbmlwdWxhdGUgYW4gYW5ub3RhdGlvbiB0aGF0IGlzIGVtYmVkZGVkIGluIGFuIGVsZW1lbnQgYXJyYXkgd2l0aGluCi0gKiBhbm90aGVyIGFubm90YXRpb24sIGUuZy4KLSAqIDxwcmU+Ci0gKiAgICAgJiM2NDtPdXRlcihmb289eyYjNjQ7SW5uZXIoInplcm8iKSwgJiM2NDtJbm5lcigib25lIiksICYjNjQ7SW5uZXIoInR3byIpfSkKLSAqICAgICBwcml2YXRlIGludCBpZDsKLSAqICAgICAgICAgb3V0ZXJBbm5vdGF0aW9uQWRhcHRlciA9IEFubm90YXRpb25BZGFwdGVyPCYjNjQ7T3V0ZXI+Ci0gKiAgICAgICAgIGVsZW1lbnROYW1lID0gImZvbyIKLSAqICAgICAgICAgaW5kZXggPSAwLTIKLSAqICAgICAgICAgYW5ub3RhdGlvbk5hbWUgPSAiSW5uZXIiCi0gKiA8L3ByZT4KLSAqLwotcHVibGljIGNsYXNzIE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyCi0JZXh0ZW5kcyBBYnN0cmFjdE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIKLQlpbXBsZW1lbnRzIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyCi17Ci0JcHJpdmF0ZSBpbnQgaW5kZXg7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyA8Y29kZT52YWx1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIGludCBpbmRleCwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXN1cGVyKGFubm90YXRpb25BZGFwdGVyLCBhbm5vdGF0aW9uTmFtZSk7Ci0JCXRoaXMuaW5kZXggPSBpbmRleDsKLQl9Ci0KLQlwdWJsaWMgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBpbnQgaW5kZXgsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlzdXBlcihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGFubm90YXRpb25OYW1lKTsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBYnN0cmFjdE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihFeHByZXNzaW9uIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIpIHsKLQkJCXJldHVybiB0aGlzLmFubm90YXRpb24oKEFycmF5SW5pdGlhbGl6ZXIpIHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gKHRoaXMuaW5kZXggPT0gMCkgPyB0aGlzLmFubm90YXRpb25WYWx1ZSh2YWx1ZSkgOiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFeHByZXNzaW9uIGJ1aWxkTmV3SW5uZXJFeHByZXNzaW9uKEFubm90YXRpb24gaW5uZXIpIHsKLQkJcmV0dXJuICh0aGlzLmluZGV4ID09IDApID8gaW5uZXIgOiAoRXhwcmVzc2lvbikgdGhpcy5idWlsZE5ld0lubmVyQXJyYXlJbml0aWFsaXplcihpbm5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBBbm5vdGF0aW9uIG91dGVyLCBFeHByZXNzaW9uIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIpIHsKLQkJCXRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgb3V0ZXIsIChBcnJheUluaXRpYWxpemVyKSB2YWx1ZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBpZiBvdXIgaW5kZXggaXMgZ3JlYXRlciB0aGFuIHplcm8sIGJ1dCB3ZSBkb24ndCBoYXZlIGFuIGFycmF5LAotCQkvLyB0aGVuIHRoZSBhbm5vdGF0aW9uIG11c3QgYWxyZWFkeSBiZSBnb25lCi0JCXJldHVybiAodGhpcy5pbmRleCAhPSAwKTsKLQl9Ci0KLQkvKioKLQkgKiA8cHJlPgotCSAqICYjNjQ7T3V0ZXIoeyYjNjQ7SW5uZXIoMCksICYjNjQ7SW5uZXIoMSl9KSA9PiAmIzY0O091dGVyKHsmIzY0O0lubmVyKDApLCAmIzY0O0lubmVyKDEpLCAmIzY0O0lubmVyKDIpfSkKLQkgKiAgICAgb3IKLQkgKiAmIzY0O091dGVyKCJsb3JlbSBpcHN1bSIpID0+ICYjNjQ7T3V0ZXIoJiM2NDtJbm5lcigwKSkKLQkgKiAgICAgb3IKLQkgKiAmIzY0O091dGVyKCYjNjQ7SW5uZXIoMCkpID0+ICYjNjQ7T3V0ZXIoeyYjNjQ7SW5uZXIoMCksICYjNjQ7SW5uZXIoMSl9KQotCSAqIDwvcHJlPgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIG1vZGlmeUFubm90YXRpb25WYWx1ZShTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG91dGVyLCBBbm5vdGF0aW9uIGlubmVyKSB7Ci0JCXRoaXMubW9kaWZ5RXhwcmVzc2lvbihvdXRlciwgU0lOR0xFX01FTUJFUl9BTk5PVEFUSU9OX0VYUFJFU1NJT05fUFJPVklERVIsIGlubmVyKTsKLQl9Ci0KLQkvKioKLQkgKiA8cHJlPgotCSAqICYjNjQ7T3V0ZXIodGV4dD0ibG9yZW0gaXBzdW0iKSA9PiAmIzY0O091dGVyKHRleHQ9ImxvcmVtIGlwc3VtIiwgZm9vPSYjNjQ7SW5uZXIoMCkpCi0JICogICAgIG9yCi0JICogJiM2NDtPdXRlcihmb289eyYjNjQ7SW5uZXIoMCksICYjNjQ7SW5uZXIoMSl9KSA9PiAmIzY0O091dGVyKGZvbz17JiM2NDtJbm5lcigwKSwgJiM2NDtJbm5lcigxKSwgJiM2NDtJbm5lcigyKX0pCi0JICogICAgIG9yCi0JICogJiM2NDtPdXRlcihmb289ImxvcmVtIGlwc3VtIikgPT4gJiM2NDtPdXRlcihmb289JiM2NDtJbm5lcigwKSkKLQkgKiAgICAgb3IKLQkgKiAmIzY0O091dGVyKGZvbz0mIzY0O05vdElubmVyKSA9PiAmIzY0O091dGVyKGZvbz0mIzY0O0lubmVyKDApKQotCSAqICAgICBvcgotCSAqICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7SW5uZXIoMCkpID0+ICYjNjQ7T3V0ZXIoZm9vPXsmIzY0O0lubmVyKDApLCAmIzY0O0lubmVyKDEpfSkKLQkgKiA8L3ByZT4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBtb2RpZnlNZW1iZXJWYWx1ZVBhaXIoTWVtYmVyVmFsdWVQYWlyIHBhaXIsIEFubm90YXRpb24gaW5uZXIpIHsKLQkJdGhpcy5tb2RpZnlFeHByZXNzaW9uKHBhaXIsIE1FTUJFUl9WQUxVRV9QQUlSX0VYUFJFU1NJT05fUFJPVklERVIsIGlubmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMuaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogTW92ZSB0aGUgYW5ub3RhdGlvbiB0byB0aGUgc3BlY2lmaWVkIGluZGV4LCBsZWF2aW5nIGl0cyBvcmlnaW5hbAotCSAqIHBvc2l0aW9uIGNsZWFyZWQgb3V0LgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBuZXdJbmRleCwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlpbnQgb2xkSW5kZXggPSB0aGlzLmluZGV4OwotCQlpZiAobmV3SW5kZXggPT0gb2xkSW5kZXgpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUFubm90YXRpb24gb3JpZ2luYWwgPSB0aGlzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlpZiAob3JpZ2luYWwgPT0gbnVsbCkgewotCQkJdGhpcy5pbmRleCA9IG5ld0luZGV4OwotCQkJdGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsgIC8vIGNsZWFyIG91dCB0aGUgbmV3IGxvY2F0aW9uICg/KQotCQl9IGVsc2UgewotCQkJQW5ub3RhdGlvbiBjb3B5ID0gKEFubm90YXRpb24pIEFTVE5vZGUuY29weVN1YnRyZWUob3JpZ2luYWwuZ2V0QVNUKCksIG9yaWdpbmFsKTsKLQkJCXRoaXMuaW5kZXggPSBuZXdJbmRleDsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgY29weSk7ICAvLyBpbnN0YWxsIHRoZSBjb3B5IGluIHRoZSBuZXcgbG9jYXRpb24KLQkJCXRoaXMuaW5kZXggPSBvbGRJbmRleDsKLQkJCXRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7ICAvLyBnbyBiYWNrIGFuZCBjbGVhciBvdXQgdGhlIG9yaWdpbmFsIGxvY2F0aW9uIChBRlRFUiB0aGUgbW92ZSkKLQkJCXRoaXMuaW5kZXggPSBuZXdJbmRleDsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWRhcHRlcidzIGFubm90YXRpb24gZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGluaXRpYWxpemVyLgotCSAqLwotCXByaXZhdGUgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKEFycmF5SW5pdGlhbGl6ZXIgdmFsdWUpIHsKLQkJTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyA9IHRoaXMuZXhwcmVzc2lvbnModmFsdWUpOwotCQlyZXR1cm4gKHRoaXMuaW5kZXggPj0gZXhwcmVzc2lvbnMuc2l6ZSgpKSA/IG51bGwgOiB0aGlzLmFubm90YXRpb25WYWx1ZShleHByZXNzaW9ucy5nZXQodGhpcy5pbmRleCkpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgbmV3IGFycmF5IGluaXRpYWxpemVyIHRvIGhvbGQgdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uLAotCSAqIHBhZGRpbmcgaXQgd2l0aCAnbnVsbCcgbGl0ZXJhbHMgYXMgbmVjZXNzYXJ5Ci0JICovCi0JcHJpdmF0ZSBBcnJheUluaXRpYWxpemVyIGJ1aWxkTmV3SW5uZXJBcnJheUluaXRpYWxpemVyKEFubm90YXRpb24gaW5uZXIpIHsKLQkJQXJyYXlJbml0aWFsaXplciBhaSA9IGlubmVyLmdldEFTVCgpLm5ld0FycmF5SW5pdGlhbGl6ZXIoKTsKLQkJdGhpcy5hZGRJbm5lclRvRXhwcmVzc2lvbnMoaW5uZXIsIHRoaXMuZXhwcmVzc2lvbnMoYWkpKTsKLQkJcmV0dXJuIGFpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gdG8gdGhlIHNwZWNpZmllZCBhcnJheSBpbml0aWFsaXplciwKLQkgKiBwYWRkaW5nIGl0IHdpdGggJ251bGwnIGxpdGVyYWxzIGFzIG5lY2Vzc2FyeQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRJbm5lclRvRXhwcmVzc2lvbnMoQW5ub3RhdGlvbiBpbm5lciwgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucykgewotCQlpZiAoZXhwcmVzc2lvbnMuc2l6ZSgpID4gdGhpcy5pbmRleCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZXhwcmVzc2lvbnMgc2l6ZSBpcyBncmVhdGVyIHRoYW4gaW5kZXggKHNpemU6ICIgKyBleHByZXNzaW9ucy5zaXplKCkgKyAiICBpbmRleDogIiArIHRoaXMuaW5kZXggKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCXdoaWxlIChleHByZXNzaW9ucy5zaXplKCkgPCB0aGlzLmluZGV4KSB7Ci0JCQlleHByZXNzaW9ucy5hZGQoaW5uZXIuZ2V0QVNUKCkubmV3TnVsbExpdGVyYWwoKSk7Ci0JCX0KLQkJZXhwcmVzc2lvbnMuYWRkKGlubmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGFkYXB0ZXIncyBhbm5vdGF0aW9uIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBpbml0aWFsaXplci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBBbm5vdGF0aW9uIG91dGVyLCBBcnJheUluaXRpYWxpemVyIHZhbHVlKSB7Ci0JCUxpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPSB0aGlzLmV4cHJlc3Npb25zKHZhbHVlKTsKLQkJaWYgKHRoaXMuaW5kZXggPj0gZXhwcmVzc2lvbnMuc2l6ZSgpKSB7Ci0JCQlyZXR1cm47ICAvLyBhdm9pZCBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKD8pCi0JCX0KLQkJQW5ub3RhdGlvbiBpbm5lciA9IHRoaXMuYW5ub3RhdGlvblZhbHVlKGV4cHJlc3Npb25zLmdldCh0aGlzLmluZGV4KSk7Ci0JCWlmIChpbm5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCAhIHRoaXMubmFtZU1hdGNoZXMoZGVjbGFyYXRpb24sIGlubmVyKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh0aGlzLmluZGV4ID09IChleHByZXNzaW9ucy5zaXplKCkgLSAxKSkgewotCQkJZXhwcmVzc2lvbnMucmVtb3ZlKHRoaXMuaW5kZXgpOwotCQl9IGVsc2UgewotCQkJZXhwcmVzc2lvbnMuc2V0KHRoaXMuaW5kZXgsIHZhbHVlLmdldEFTVCgpLm5ld051bGxMaXRlcmFsKCkpOwotCQl9Ci0JCXRoaXMudHJpbUV4cHJlc3Npb25zKGRlY2xhcmF0aW9uLCBvdXRlciwgZXhwcmVzc2lvbnMpOwotCX0KLQotCS8qKgotCSAqIFN0cmlwIGFsbCB0aGUgbnVsbCBsaXRlcmFscyBvZmYgdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMKLQkgKiBhbmQgbm9ybWFsaXplIHRoZSBzcGVjaWZpZWQgb3V0ZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJpbUV4cHJlc3Npb25zKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gb3V0ZXIsIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMpIHsKLQkJLy8gc3RhcnQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdAotCQlmb3IgKGludCBpID0gZXhwcmVzc2lvbnMuc2l6ZSgpOyBpLS0gPiAwOyApIHsKLQkJCWlmIChleHByZXNzaW9ucy5nZXQoaSkuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLk5VTExfTElURVJBTCkgewotCQkJCWV4cHJlc3Npb25zLnJlbW92ZShpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnJlYWs7ICAvLyBzdG9wIHdpdGggdGhlIGZpcnN0IG5vbi1udWxsIGxpdGVyYWwgZW5jb3VudGVyZWQKLQkJCX0KLQkJfQotCQlzd2l0Y2ggKGV4cHJlc3Npb25zLnNpemUoKSkgewotCQkJY2FzZSAwOgotCQkJCXRoaXMucmVtb3ZlRWxlbWVudEFuZE5vcm1hbGl6ZShkZWNsYXJhdGlvbiwgb3V0ZXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCXRoaXMuY29udmVydEFycmF5VG9MYXN0UmVtYWluaW5nRXhwcmVzc2lvbihvdXRlciwgZXhwcmVzc2lvbnMuZ2V0KDApKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXaGVuIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgZWxlbWVudCBpbiBhbiBhcnJheSBpbml0aWFsaXplciwgY29udmVydCB0aGUKLQkgKiBleHByZXNzaW9uIHRvIGJlIGp1c3QgdGhlIHNpbmdsZSBlbGVtZW50OyBlLmcuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtGb28oeHh4PXsiYWJjIn0pID0+ICYjNjQ7Rm9vKHh4eD0iYWJjIikKLQkgKiBvcgotCSAqICAgICAmIzY0O0Zvbyh7ImFiYyJ9KSA9PiAmIzY0O0ZvbygiYWJjIikKLQkgKiA8L3ByZT4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY29udmVydEFycmF5VG9MYXN0UmVtYWluaW5nRXhwcmVzc2lvbihBbm5vdGF0aW9uIG91dGVyLCBFeHByZXNzaW9uIGxhc3RWYWx1ZSkgewotCQlsYXN0VmFsdWUgPSAoRXhwcmVzc2lvbikgQVNUTm9kZS5jb3B5U3VidHJlZShsYXN0VmFsdWUuZ2V0QVNUKCksIGxhc3RWYWx1ZSk7Ci0JCWlmIChvdXRlci5pc05vcm1hbEFubm90YXRpb24oKSkgewotCQkJdGhpcy5tZW1iZXJWYWx1ZVBhaXIoKE5vcm1hbEFubm90YXRpb24pIG91dGVyKS5zZXRWYWx1ZShsYXN0VmFsdWUpOwotCQl9IGVsc2UgaWYgKG91dGVyLmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKSB7Ci0JCQkoKFNpbmdsZU1lbWJlckFubm90YXRpb24pIG91dGVyKS5zZXRWYWx1ZShsYXN0VmFsdWUpOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5leHBlY3RlZCBhbm5vdGF0aW9uIHR5cGU6ICIgKyBvdXRlcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIE1hbmlwdWxhdGUgdGhlIHNwZWNpZmllZCBleHByZXNzaW9uIGFwcHJvcHJpYXRlbHkuCi0JICogSWYgaXQgaXMgYW4gYXJyYXkgaW5pdGlhbGl6ZXIsIGFkZCB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gdG8gaXQuCi0JICogSWYgaXQgaXMgbm90LCByZXBsYWNlIHRoZSBleHByZXNzaW9uIG9yIGNvbnZlcnQgaXQgaW50byBhbiBhcnJheQotCSAqIGluaXRpYWxpemVyLgotCSAqLwotCXByaXZhdGUgdm9pZCBtb2RpZnlFeHByZXNzaW9uKEFTVE5vZGUgbm9kZSwgRXhwcmVzc2lvblByb3ZpZGVyIGV4cFByb3ZpZGVyLCBBbm5vdGF0aW9uIGlubmVyKSB7Ci0JCUV4cHJlc3Npb24gdmFsdWUgPSBleHBQcm92aWRlci5nZXRFeHByZXNzaW9uKG5vZGUpOwotCQlpZiAodmFsdWUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSKSB7Ci0JCQkvLyBpZ25vcmUgdGhlIG90aGVyIGVudHJpZXMgaW4gdGhlIGFycmF5IGluaXRpYWxpemVyKD8pIC0gdGhleSBtYXkgbm90IGJlIG1hdGNoaW5nIEFubm90YXRpb25zLi4uCi0JCQlMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0gdGhpcy5leHByZXNzaW9ucygoQXJyYXlJbml0aWFsaXplcikgdmFsdWUpOwotCQkJaWYgKHRoaXMuaW5kZXggPj0gZXhwcmVzc2lvbnMuc2l6ZSgpKSB7Ci0JCQkJdGhpcy5hZGRJbm5lclRvRXhwcmVzc2lvbnMoaW5uZXIsIGV4cHJlc3Npb25zKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZXhwcmVzc2lvbnMuc2V0KHRoaXMuaW5kZXgsIGlubmVyKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLmluZGV4ID09IDApIHsKLQkJCQkvLyByZXBsYWNlIHdoYXRldmVyIHdhcyB0aGVyZSBiZWZvcmUKLQkJCQlleHBQcm92aWRlci5zZXRFeHByZXNzaW9uKG5vZGUsIGlubmVyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gY29udmVydCB0byBhbiBhcnJheQotCQkJCUFycmF5SW5pdGlhbGl6ZXIgYWkgPSBpbm5lci5nZXRBU1QoKS5uZXdBcnJheUluaXRpYWxpemVyKCk7Ci0JCQkJTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyA9IHRoaXMuZXhwcmVzc2lvbnMoYWkpOwotCQkJCWV4cHJlc3Npb25zLmFkZCgoRXhwcmVzc2lvbikgQVNUTm9kZS5jb3B5U3VidHJlZSh2YWx1ZS5nZXRBU1QoKSwgdmFsdWUpKTsKLQkJCQl0aGlzLmFkZElubmVyVG9FeHByZXNzaW9ucyhpbm5lciwgZXhwcmVzc2lvbnMpOwotCQkJCWV4cFByb3ZpZGVyLnNldEV4cHJlc3Npb24obm9kZSwgYWkpOwotCQkJfQotCQl9Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMoQXJyYXlJbml0aWFsaXplciBhaSkgewotCQlyZXR1cm4gYWkuZXhwcmVzc2lvbnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXhwcmVzc2lvbiBwcm92aWRlcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogZGVmaW5lIGludGVyZmFjZSB0aGF0IGFsbG93cyB1cyB0byAicmUtdXNlIiB0aGUgY29kZSBpbgotCSAqICNtb2RpZnlFeHByZXNzaW9uKEFTVE5vZGUsIEV4cHJlc3Npb25Qcm92aWRlciwgQW5ub3RhdGlvbikKLQkgKi8KLQlwcml2YXRlIGludGVyZmFjZSBFeHByZXNzaW9uUHJvdmlkZXIgewotCQlFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oQVNUTm9kZSBub2RlKTsKLQkJdm9pZCBzZXRFeHByZXNzaW9uKEFTVE5vZGUgbm9kZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHByZXNzaW9uUHJvdmlkZXIgTUVNQkVSX1ZBTFVFX1BBSVJfRVhQUkVTU0lPTl9QUk9WSURFUiA9IG5ldyBFeHByZXNzaW9uUHJvdmlkZXIoKSB7Ci0JCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oQVNUTm9kZSBub2RlKSB7Ci0JCQlyZXR1cm4gKChNZW1iZXJWYWx1ZVBhaXIpIG5vZGUpLmdldFZhbHVlKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihBU1ROb2RlIG5vZGUsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQkJKChNZW1iZXJWYWx1ZVBhaXIpIG5vZGUpLnNldFZhbHVlKGV4cHJlc3Npb24pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJNZW1iZXJWYWx1ZVBhaXJFeHByZXNzaW9uUHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhwcmVzc2lvblByb3ZpZGVyIFNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTl9FWFBSRVNTSU9OX1BST1ZJREVSID0gbmV3IEV4cHJlc3Npb25Qcm92aWRlcigpIHsKLQkJcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihBU1ROb2RlIG5vZGUpIHsKLQkJCXJldHVybiAoKFNpbmdsZU1lbWJlckFubm90YXRpb24pIG5vZGUpLmdldFZhbHVlKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihBU1ROb2RlIG5vZGUsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQkJKChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBub2RlKS5zZXRWYWx1ZShleHByZXNzaW9uKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHJlc3Npb25Qcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX07Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bGxBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTnVsbEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NGU5MzcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTnVsbEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbEFubm90YXRpb25FZGl0Rm9ybWF0dGVyCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcgotewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTnVsbEFubm90YXRpb25FZGl0Rm9ybWF0dGVyIElOU1RBTkNFID0gbmV3IE51bGxBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBOdWxsQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0KElEb2N1bWVudCBkb2MsIFRleHRFZGl0IGVkaXRUcmVlKSB0aHJvd3MgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQkvLyBubyBmb3JtYXR0aW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdWxsRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTnVsbERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmZTJkOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdWxsRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci0KLS8qKgotICogQmVoYXZpb3JsZXNzIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIKLQlpbXBsZW1lbnRzIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyCi17Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOdWxsRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBJTlNUQU5DRSA9IG5ldyBOdWxsRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBOdWxsRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE1hcmtlckFubm90YXRpb24gbmV3TWFya2VyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTm9ybWFsQW5ub3RhdGlvbiBuZXdOb3JtYWxBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgQVNUTm9kZSBnZXRBc3ROb2RlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTnVsbERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdWxsRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzZTYxNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdWxsRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotCi0vKioKLSAqIEJlaGF2aW9ybGVzcyBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE51bGxEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPgotCWltcGxlbWVudHMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4KLXsKLQotCS8vIHNpbmdsZXRvbgotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIgSU5TVEFOQ0UKLQkJCT0gbmV3IE51bGxEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyA8Uz4gRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Uz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTnVsbERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUIGdldFZhbHVlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIEFTVE5vZGUgZ2V0QXN0Tm9kZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpOwotCX0KLQotCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bGxFeHByZXNzaW9uQ29udmVydGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdWxsRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjQ1YTc0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bGxFeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIE5vIGNvbnZlcnNpb24uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsRXhwcmVzc2lvbkNvbnZlcnRlcgotCWltcGxlbWVudHMgRXhwcmVzc2lvbkNvbnZlcnRlcjxFeHByZXNzaW9uPgotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhwcmVzc2lvbkNvbnZlcnRlcjxFeHByZXNzaW9uPiBJTlNUQU5DRSA9IG5ldyBOdWxsRXhwcmVzc2lvbkNvbnZlcnRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPEV4cHJlc3Npb24+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE51bGxFeHByZXNzaW9uQ29udmVydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBFeHByZXNzaW9uIGNvbnZlcnQoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBBU1QgYXN0KSB7Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCXB1YmxpYyBFeHByZXNzaW9uIGNvbnZlcnQoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NWQyZDcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTnVtYmVyTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLQotLyoqCi0gKiBDb252ZXJ0IGEgbnVtYmVyIGxpdGVyYWwgdG8vZnJvbSBhbiBJbnRlZ2VyCi0gKiAoZS5nLiA1KS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXI8SW50ZWdlcj4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHByZXNzaW9uQ29udmVydGVyPEludGVnZXI+IElOU1RBTkNFID0gbmV3IE51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4cHJlc3Npb25Db252ZXJ0ZXI8SW50ZWdlcj4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOdW1iZXJMaXRlcmFsIGNvbnZlcnRPYmplY3QoSW50ZWdlciBpbnRlZ2VyLCBBU1QgYXN0KSB7Ci0JCXJldHVybiBhc3QubmV3TnVtYmVyTGl0ZXJhbChpbnRlZ2VyLnRvU3RyaW5nKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJbnRlZ2VyIGNvbnZlcnRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlPYmplY3QgdmFsdWUgPSBleHByZXNzaW9uLnJlc29sdmVDb25zdGFudEV4cHJlc3Npb25WYWx1ZSgpOwotCQlyZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikgPyAoKEludGVnZXIpIHZhbHVlKSA6IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9QcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvUHJpbWl0aXZlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IxNzUwMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9QcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QcmltaXRpdmVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLQotLyoqCi0gKiBDb252ZXJ0IGEgdHlwZSBsaXRlcmFsIHRvL2Zyb20gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBwcmltaXRpdmUgdHlwZQotICogKGUuZy4gImludCIpLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJpbWl0aXZlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIKLQlleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IElOU1RBTkNFID0gbmV3IFByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVHlwZUxpdGVyYWwgY29udmVydE9iamVjdChTdHJpbmcgc3RyaW5nLCBBU1QgYXN0KSB7Ci0JCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlIHR5cGUgPSBhc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLnRvQ29kZShzdHJpbmcpKTsKLQkJVHlwZUxpdGVyYWwgdHlwZUxpdGVyYWwgPSBhc3QubmV3VHlwZUxpdGVyYWwoKTsKLQkJdHlwZUxpdGVyYWwuc2V0VHlwZSh0eXBlKTsKLQkJcmV0dXJuIHR5cGVMaXRlcmFsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCWlmIChleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5UWVBFX0xJVEVSQUwpIHsKLQkJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlIHR5cGUgPSAoKFR5cGVMaXRlcmFsKSBleHByZXNzaW9uKS5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuUFJJTUlUSVZFX1RZUEUpIHsKLQkJCQlyZXR1cm4gKChQcmltaXRpdmVUeXBlKSB0eXBlKS5nZXRQcmltaXRpdmVUeXBlQ29kZSgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1Nob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWVlNTc0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1Nob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIGFubm90YXRpb24gZWxlbWVudCBhZGFwdGVyIGFuZCBzaG9ydC1jaXJjdWl0IHRoZQotICogI3NldFZhbHVlIG1ldGhvZCBpZiB0aGUgdmFsdWUgaGFzIG5vdCBjaGFuZ2VkLgotICovCi1wdWJsaWMgY2xhc3MgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+Ci0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4KLXsKLQkvKiogdGhlIHdyYXBwZWQgYWRhcHRlciAqLwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+IGFkYXB0ZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHVibGljIFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcihBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+IGRhZWEpIHsKLQkJdGhpcyhuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPihhbm5vdGF0ZWRFbGVtZW50LCBkYWVhKSk7Ci0JfQotCi0JcHVibGljIFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcihBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4gYWRhcHRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmFkYXB0ZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgVCBnZXRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFQgdmFsdWUpIHsKLQkJdGhpcy5zZXRWYWx1ZSh0aGlzLmFkYXB0ZXIuZ2V0VmFsdWUoKSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRFeHByZXNzaW9uKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBBU1ROb2RlIGdldEFzdE5vZGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRBc3ROb2RlKGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuYWRhcHRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogc2V0IHRoZSBhZGFwdGVyJ3MgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUgaWYgaXQKLQkgKiBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgc3BlY2lmaWVkIG9sZCB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFQgb2xkVmFsdWUsIFQgbmV3VmFsdWUpIHsKLQkJaWYgKG9sZFZhbHVlID09IG51bGwpIHsKLQkJCWlmIChuZXdWYWx1ZSA9PSBudWxsKSB7ICAvLyBudWxsID0+IG51bGwKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9IGVsc2UgeyAgLy8gbnVsbCA9PiBvYmplY3QKLQkJCQl0aGlzLmFkYXB0ZXIuc2V0VmFsdWUobmV3VmFsdWUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKG5ld1ZhbHVlID09IG51bGwpIHsgIC8vIG9iamVjdCA9PiBudWxsCi0JCQkJdGhpcy5hZGFwdGVyLnNldFZhbHVlKG51bGwpOwotCQkJfSBlbHNlIHsgIC8vIG9iamVjdCA9PiBvYmplY3QKLQkJCQlpZiAodGhpcy52YWx1ZXNBcmVFcXVhbChvbGRWYWx1ZSwgbmV3VmFsdWUpKSB7Ci0JCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQl9IGVsc2UgewotCQkJCQl0aGlzLmFkYXB0ZXIuc2V0VmFsdWUobmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGJvdGggdmFsdWVzIGFyZSBub24tbnVsbCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbHVlc0FyZUVxdWFsKFQgb2xkVmFsdWUsIFQgbmV3VmFsdWUpIHsKLQkJcmV0dXJuIG5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaG9ydENpcmN1aXRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2hvcnRDaXJjdWl0QXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY3NmJjMi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaG9ydENpcmN1aXRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBhbm5vdGF0aW9uIGVsZW1lbnQgYWRhcHRlciBhbmQgc2hvcnQtY2lyY3VpdCB0aGUKLSAqICNzZXRWYWx1ZSBtZXRob2QgaWYgdGhlIHZhbHVlIGhhcyBub3QgY2hhbmdlZC4gT3ZlcnJpZGVzICN2YWx1ZXNBcmVFcXVhbCgpCi0gKiB0byBjaGVjayBlcXVhbGl0eSBvbiBhcnJheXMKLSAqLwotcHVibGljIGNsYXNzIFNob3J0Q2lyY3VpdEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+Ci0JZXh0ZW5kcyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VFtdPgotewotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHVibGljIFNob3J0Q2lyY3VpdEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VFtdPiBkYWVhKSB7Ci0JCXN1cGVyKGFubm90YXRlZEVsZW1lbnQsIGRhZWEpOwotCX0KLQotCXB1YmxpYyBTaG9ydENpcmN1aXRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VFtdPiBhZGFwdGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsdWVzQXJlRXF1YWwoVFtdIG9sZFZhbHVlLCBUW10gbmV3VmFsdWUpIHsKLQkJcmV0dXJuIEFycmF5cy5lcXVhbHMobmV3VmFsdWUsIG9sZFZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1NpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1NpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk1ZGMxOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotCi0vKioKLSAqIE1hbmlwdWxhdGUgYW4gYW5ub3RhdGlvbiB3aXRoIGEgc3BlY2lmaWMgbmFtZSwgZS5nLgotICogPHByZT4KLSAqICAgICAmIzY0O0ZvbwotICogICAgIHByaXZhdGUgaW50IGlkOwotICogPC9wcmU+Ci0gKiAKLSAqIE5COgotICogSWYgdGhlIGRlY2xhcmF0aW9uIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYW5ub3RhdGlvbiB3aXRoIHRoZSBzYW1lCi0gKiBuYW1lLCB0aGUgYWRhcHRlciB3aWxsIGNvcnJlc3BvbmQgdG8gdGhlIGZpcnN0IGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkCi0gKiBuYW1lLiAoQWxzbyBub3RlIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgbm90IGFsbG93IGEgZGVjbGFyYXRpb24gdG8gYmUKLSAqIG1vZGlmaWVkIGJ5IG11bHRpcGxlIGFubm90YXRpb25zIHdpdGggdGhlIHNhbWUgbmFtZSwgaS5lLiBvZiB0aGUgc2FtZSB0eXBlOwotICogc28gaWYgdGhlcmUgKmFyZSogbXVsdGlwbGUgYW5ub3RhdGlvbnMgb2YgdGhlIHNhbWUgdHlwZSwgdGhlcmUgYXJlIGJpZ2dlcgotICogcHJvYmxlbXMgdG8gd29ycnkgYWJvdXQgdGhhbiB3aGljaCBhbm5vdGF0aW9uIHRoZSBhZGFwdGVyIG1hbmlwdWxhdGVzLikKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgewotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJc3VwZXIoYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWRlY2xhcmF0aW9uLnJlbW92ZUFubm90YXRpb25OYW1lZCh0aGlzLmdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZEFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCWRlY2xhcmF0aW9uLnJlcGxhY2VBbm5vdGF0aW9uTmFtZWQodGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpLCBhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQVNUTm9kZSBnZXRBc3ROb2RlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJLy8gaWYgdGhlIGFubm90YXRpb24gaXMgbWlzc2luZywgcmV0dXJuIHRoZSBkZWNsYXJhdGlvbgotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlyZXR1cm4gKGFubm90YXRpb24gIT0gbnVsbCkgPyBhbm5vdGF0aW9uIDogZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1NpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTZkYzVmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1NpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotCi0vKioKLSAqIENvbnZlcnQgYSB0eXBlIGxpdGVyYWwgdG8vZnJvbSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbXBsZSB0eXBlCi0gKiAoZS5nLiAiamF2YS5sYW5nLk9iamVjdCIpLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIKLQlleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IElOU1RBTkNFID0gbmV3IFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVHlwZUxpdGVyYWwgY29udmVydE9iamVjdChTdHJpbmcgc3RyaW5nLCBBU1QgYXN0KSB7Ci0JCU5hbWUgbmFtZSA9IGFzdC5uZXdOYW1lKHN0cmluZyk7Ci0JCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlIHR5cGUgPSBhc3QubmV3U2ltcGxlVHlwZShuYW1lKTsKLQkJVHlwZUxpdGVyYWwgdHlwZUxpdGVyYWwgPSBhc3QubmV3VHlwZUxpdGVyYWwoKTsKLQkJdHlwZUxpdGVyYWwuc2V0VHlwZSh0eXBlKTsKLQkJcmV0dXJuIHR5cGVMaXRlcmFsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCWlmIChleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5UWVBFX0xJVEVSQUwpIHsKLQkJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlIHR5cGUgPSAoKFR5cGVMaXRlcmFsKSBleHByZXNzaW9uKS5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuU0lNUExFX1RZUEUpIHsKLQkJCQlyZXR1cm4gKChTaW1wbGVUeXBlKSB0eXBlKS5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1N0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjBlMmNiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1N0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIENvbnZlcnQgYW4gYXJyYXkgaW5pdGlhbGl6ZXIgdG8vZnJvbSBhbiBhcnJheSBvZiBzdHJpbmdzCi0gKiAoZS5nLiA8Y29kZT57InRleHQwIiwgInRleHQxIn08L2NvZGU+KS4KLSAqIDxwPgotICogRG8gPGVtPm5vdDwvZW0+IHVzZSB0aGlzIGNsYXNzIGZvciBjb252ZXJ0aW5nIGFycmF5IGluaXRpYWxpemVycyBpbgotICogYW5ub3RhdGlvbiBlbGVtZW50czoKLSAqIEphdmE1IGhhcyBhIGJpdCBvZiBzeW50YWN0aWMgc3VnYXIgdGhhdCBhbGxvd3MgYSBzaW5nbGUtZWxlbWVudCBhcnJheQotICogaW5pdGlhbGl6ZXIgdG8gbm90IGhhdmUgY3VybHkgYnJhY2VzLiBUaGlzIGNvbnZlcnRlciB3aWxsIHJldHVybgotICogYW4gZW1wdHkgYXJyYXkgaWYgaXQgZW5jb3VudGVycyBhbnl0aGluZyBvdGhlciB0aGFuIGFuIGFycmF5IGluaXRpYWxpemVyLgotICogVXNlIHtAbGluayBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyfSBmb3IgY29udmVydGluZwotICogYW5ub3RhdGlvbiBlbGVtZW50cy4KLSAqIDxwPgotICogSW52YWxpZCBlbnRyaWVzIGluIHRoZSBhcnJheSBpbml0aWFsaXplciB3aWxsIHJlc3VsdCBpbiA8Y29kZT5udWxsPC9jb2RlPgotICogZWxlbWVudHMgaW4gdGhlIHJlc3VsdGluZyBzdHJpbmcgYXJyYXkuIFRoaXMgYWxsb3dzIGNsaWVudHMgdG8gbWFuaXB1bGF0ZQotICogZWxlbWVudHMgYXQgdGhlIGFwcHJvcHJpYXRlIGluZGV4LgotICovCi1wdWJsaWMgY2xhc3MgU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nW10+Ci0JaW1wbGVtZW50cyBJbmRleGVkRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gZWxlbWVudENvbnZlcnRlcjsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eTsKLQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVtb3ZlIHRoZSBhcnJheSBpbml0aWFsaXplciBpZiBpdCBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyKEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBlbGVtZW50Q29udmVydGVyKSB7Ci0JCXRoaXMoZWxlbWVudENvbnZlcnRlciwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcihFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gZWxlbWVudENvbnZlcnRlciwgYm9vbGVhbiByZW1vdmVBcnJheUluaXRpYWxpemVyV2hlbkVtcHR5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudENvbnZlcnRlciA9IGVsZW1lbnRDb252ZXJ0ZXI7Ci0JCXRoaXMucmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eSA9IHJlbW92ZUFycmF5SW5pdGlhbGl6ZXJXaGVuRW1wdHk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgbm9uLTxjb2RlPnByaXZhdGU8L2NvZGU+IHNvIGl0IGNhbiBiZSBjYWxsZWQgYnkKLQkgKiB7QGxpbmsgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcn0KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQXJyYXlJbml0aWFsaXplciBjb252ZXJ0T2JqZWN0KFN0cmluZ1tdIHN0cmluZ3MsIEFTVCBhc3QpIHsKLQkJaWYgKChzdHJpbmdzLmxlbmd0aCA9PSAwKSAmJiB0aGlzLnJlbW92ZUFycmF5SW5pdGlhbGl6ZXJXaGVuRW1wdHkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplciA9IGFzdC5uZXdBcnJheUluaXRpYWxpemVyKCk7Ci0JCUxpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPSB0aGlzLmV4cHJlc3Npb25zKGFycmF5SW5pdGlhbGl6ZXIpOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiBzdHJpbmdzKSB7Ci0JCQlleHByZXNzaW9ucy5hZGQodGhpcy5lbGVtZW50Q29udmVydGVyLmNvbnZlcnQoc3RyaW5nLCBhc3QpKTsKLQkJfQotCQlyZXR1cm4gYXJyYXlJbml0aWFsaXplcjsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMoQXJyYXlJbml0aWFsaXplciBhcnJheUluaXRpYWxpemVyKSB7Ci0JCXJldHVybiBhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgbm9uLTxjb2RlPnByaXZhdGU8L2NvZGU+IHNvIGl0IGNhbiBiZSBjYWxsZWQgYnkKLQkgKiB7QGxpbmsgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcn0KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gY29udmVydE51bGwoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5FTVBUWV9TVFJJTkdfQVJSQVk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGNvbnZlcnRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlyZXR1cm4gKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSKSA/Ci0JCQkJdGhpcy5jb252ZXJ0QXJyYXlJbml0aWFsaXplcigoQXJyYXlJbml0aWFsaXplcikgZXhwcmVzc2lvbikgOgotCQkJCVN0cmluZ1Rvb2xzLkVNUFRZX1NUUklOR19BUlJBWTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBub24tPGNvZGU+cHJpdmF0ZTwvY29kZT4gc28gaXQgY2FuIGJlIGNhbGxlZCBieQotCSAqIHtAbGluayBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyfQotCSAqLwotCVN0cmluZ1tdIGNvbnZlcnRBcnJheUluaXRpYWxpemVyKEFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplcikgewotCQlMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0gdGhpcy5leHByZXNzaW9ucyhhcnJheUluaXRpYWxpemVyKTsKLQkJaW50IGxlbiA9IGV4cHJlc3Npb25zLnNpemUoKTsKLQkJU3RyaW5nW10gc3RyaW5ncyA9IG5ldyBTdHJpbmdbbGVuXTsKLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlzdHJpbmdzW2ldID0gdGhpcy5lbGVtZW50Q29udmVydGVyLmNvbnZlcnQoZXhwcmVzc2lvbnMuZ2V0KGkpKTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nczsKLQl9Ci0KLQlwdWJsaWMgRXhwcmVzc2lvbiBzZWxlY3RFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgaW50IGluZGV4KSB7Ci0JCWlmIChleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUikgewotCQkJcmV0dXJuIHRoaXMuZXhwcmVzc2lvbnMoKEFycmF5SW5pdGlhbGl6ZXIpIGV4cHJlc3Npb24pLmdldChpbmRleCk7Ci0JCX0KLQkJdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1N0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1N0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBlODhiNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci0KLS8qKgotICogQ29udmVydCBhIHN0cmluZyBsaXRlcmFsIHRvL2Zyb20gYSBzdHJpbmcgKGUuZy4gInRleHQiKS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIKLQlleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IElOU1RBTkNFID0gbmV3IFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ0xpdGVyYWwgY29udmVydE9iamVjdChTdHJpbmcgc3RyaW5nLCBBU1QgYXN0KSB7Ci0JCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCXN0cmluZ0xpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKHN0cmluZyk7Ci0JCXJldHVybiBzdHJpbmdMaXRlcmFsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGV4cHJlc3Npb24ucmVzb2x2ZUNvbnN0YW50RXhwcmVzc2lvblZhbHVlKCk7Ci0JCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpID8gKFN0cmluZykgdmFsdWUgOiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1R5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZDFiNzQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUHJpbWl0aXZlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci0KLS8qKgotICogQ29udmVydCBhIHR5cGUgbGl0ZXJhbCB0by9mcm9tIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgCi0gKiBzaW1wbGUgdHlwZSAoZS5nLiAiamF2YS5sYW5nLk9iamVjdCIpIG9yIHByaW1pdGl2ZSB0eXBlIChlLmcuICJpbnQiKS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBJTlNUQU5DRSA9IG5ldyBUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFR5cGVMaXRlcmFsIGNvbnZlcnRPYmplY3QoU3RyaW5nIHN0cmluZywgQVNUIGFzdCkgewotCQlpZiAoUHJpbWl0aXZlVHlwZS50b0NvZGUoc3RyaW5nKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKFR5cGVMaXRlcmFsKSBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnQoc3RyaW5nLCBhc3QpOwotCQl9Ci0JCXJldHVybiAoVHlwZUxpdGVyYWwpIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydChzdHJpbmcsIGFzdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJU3RyaW5nIG5hbWUgPSBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnQoZXhwcmVzc2lvbik7Ci0JCXJldHVybiBuYW1lICE9IG51bGwgPyBuYW1lIDogUHJpbWl0aXZlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKS5jb252ZXJ0KGV4cHJlc3Npb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9Cb29sZWFuVHJhbnNsYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9Cb29sZWFuVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjI4MjVjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvdHJhbnNsYXRvcnMvQm9vbGVhblRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgQm9vbGVhblRyYW5zbGF0b3IKLQlleHRlbmRzIFRyYW5zbGF0b3IKLXsKLQlwdWJsaWMgQm9vbGVhblRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgc3RydWN0dXJhbEZlYXR1cmUsIEJPT0xFQU5fRkVBVFVSRSB8IEJPT0xFQU5fTE9XRVJDQVNFKTsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW5UcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgc3RydWN0dXJhbEZlYXR1cmUsIEJPT0xFQU5fRkVBVFVSRSB8IEJPT0xFQU5fTE9XRVJDQVNFIHwgc3R5bGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBzdHJpbmcsIEVPYmplY3Qgb3duZXIpIHsKLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihzdHJpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCB2YWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlyZXR1cm4gKChCb29sZWFuKSB2YWx1ZSkudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L3RyYW5zbGF0b3JzL0VtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvdHJhbnNsYXRvcnMvRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDk0NzA1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvdHJhbnNsYXRvcnMvRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogVGhpcyB0cmFuc2xhdG9yIGlzIHRvIGJlIHVzZWQgZm9yIGVtcHR5IHhtbCB0YWdzIHRoYXQgY29ycmVzcG9uZAotICogdG8gYSBib29sZWFuIGF0dHJpYnV0ZSBpbiB0aGUgZW1mIG1vZGVsLiAgCi0gKiBjYXNjYWRlLXBlcnNpc3QgaXMgYW4gZXhhbXBsZSBmcm9tIHRoZSBvcm0ueHNkOgotICogCi0gKiAJPHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHM+Ci0gKiAJCTxjYXNjYWRlLXBlcnNpc3QvPiAgICAgICAgCi0gKiAJPC9wZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzPiAgPT0+ICBjYXNjYWRlUGVyc2lzdCA9PSB0cnVlCi0gKiAKLSAqIHZzLgotICogCi0gKiAJPHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHM+ICAKLSAqIAk8L3BlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHM+ICA9PT4gIGNhc2NhZGVQZXJzaXN0ID09IGZhbHNlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IKLQlleHRlbmRzIFRyYW5zbGF0b3IKLXsKLQlwdWJsaWMgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJdGhpcyhkb21QYXRoQW5kTmFtZXMsIHN0cnVjdHVyYWxGZWF0dXJlLCBOT19TVFlMRSk7Ci0JfQotCi0JcHVibGljIEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlLCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgc3R5bGUgfCBFTVBUWV9UQUcgfCBCT09MRUFOX0ZFQVRVUkUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldE1PRlZhbHVlKEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCS8vIEkgYW0gb3ZlcnJpZGluZyB0aGlzIG1ldGhvZC4gIFRoaXMgaXMgc28gdGhlIHRhZyB3aWxsIGJlIHJlbW92ZWQgd2hlbiAKLQkJLy8gdGhlIHZhbHVlIGlzIGZhbHNlLgotCQkvLyBJJ20gbm90IHN1cmUgaWYgdGhpcyBpcyBhIGJ1ZyBpbiB0aGUgZWNvcmUgb3IgbWF5YmUgaW4gdGhlIHRyYW5zbGF0b3JzLCAKLQkJLy8gYnV0IEkgcmVhbGx5IGRvbid0IHRoaW5rIHRoYXQgd2Ugc2hvdWxkIGhhdmUgdG8gZGVwZW5kIG9uIHRoZSBib29sZWFuCi0JCS8vIGJlaW5nICJ1bnNldCIgdG8gcmVtb3ZlIHRoZSB0YWcuCi0JCUJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbikgc3VwZXIuZ2V0TU9GVmFsdWUobW9mT2JqZWN0KTsKLQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IG51bGwgOiB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IHZhbHVlIDogbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvdHJhbnNsYXRvcnMvRW51bWVyYXRlZFZhbHVlVHJhbnNsYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9FbnVtZXJhdGVkVmFsdWVUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzRiNGEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9FbnVtZXJhdGVkVmFsdWVUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW51bWVyYXRlZFZhbHVlVHJhbnNsYXRvcgotCWV4dGVuZHMgVHJhbnNsYXRvcgotewotCXB1YmxpYyBFbnVtZXJhdGVkVmFsdWVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlzdXBlcihkb21QYXRoQW5kTmFtZXMsIHN0cnVjdHVyYWxGZWF0dXJlKTsKLQl9Ci0JCi0JcHVibGljIEVudW1lcmF0ZWRWYWx1ZVRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlLCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgc3R5bGUpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmFibGU8Pz4gZ2V0RW51bWVyYXRlZE9iamVjdFZhbHVlcygpOwotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nIHN0cmluZywgRU9iamVjdCBvd25lcikgewotCQlmb3IgKE9iamVjdCBlYWNoIDogZ2V0RW51bWVyYXRlZE9iamVjdFZhbHVlcygpKSB7Ci0JCQlpZiAoZWFjaC50b1N0cmluZygpLmVxdWFscyhzdHJpbmcpKSB7Ci0JCQkJcmV0dXJuIGVhY2g7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlVG9TdHJpbmcoT2JqZWN0IHZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCXJldHVybiB2YWx1ZS50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvdHJhbnNsYXRvcnMvU2ltcGxlUm9vdFRyYW5zbGF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvdHJhbnNsYXRvcnMvU2ltcGxlUm9vdFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhjMjBkMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L3RyYW5zbGF0b3JzL1NpbXBsZVJvb3RUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUm9vdFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBSb290IHRyYW5zbGF0b3IgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgY2hpbGQgdHJhbnNsYXRvcnMgYW5kIG5vIHNwZWNpYWwKLSAqIGJlaGF2aW9yLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlUm9vdFRyYW5zbGF0b3IKLQlleHRlbmRzIFJvb3RUcmFuc2xhdG9yCi17Ci0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsKLQotCXB1YmxpYyBTaW1wbGVSb290VHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgZUNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlUm9vdFRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRUNsYXNzIGVDbGFzcywgVHJhbnNsYXRvcltdIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgZUNsYXNzKTsKLQkJdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwotCX0KLQotCS8qKgotCSAqIFdpZGVuIG1ldGhvZCBhY2Nlc3MgdG8gJ3B1YmxpYycuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbl8oKSB7Ci0JCXJldHVybiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSA/IEVNUFRZX1RSQU5TTEFUT1JfQVJSQVkgOiB0aGlzLmNoaWxkcmVuOwotCX0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JbXSBFTVBUWV9UUkFOU0xBVE9SX0FSUkFZID0gbmV3IFRyYW5zbGF0b3JbMF07Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHRyYW5zbGF0b3IncyBjaGlsZHJlbi4KLQkgKiBSZXR1cm4gdGhlIHRyYW5zbGF0b3IuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oVHJhbnNsYXRvcltdIGNoaWxkcmVuKSB7Ci0JCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCB0cmFuc2xhdG9yIHRvIHRoZSB0cmFuc2xhdG9yJ3MgbGlzdCBvZiBjaGlsZHJlbi4KLQkgKiBSZXR1cm4gdGhlIHRyYW5zbGF0b3IgZm9yIG1ldGhvZCBjaGFpbmluZy4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlUm9vdFRyYW5zbGF0b3IgYWRkQ2hpbGQoVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCXRoaXMuY2hpbGRyZW4gPSBBcnJheVRvb2xzLmFkZCh0aGlzLmdldENoaWxkcmVuXygpLCB0cmFuc2xhdG9yKTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgdHJhbnNsYXRvcnMgdG8gdGhlIHRyYW5zbGF0b3IncyBsaXN0IG9mIGNoaWxkcmVuLgotCSAqIFJldHVybiB0aGUgdHJhbnNsYXRvciBmb3IgbWV0aG9kIGNoYWluaW5nLgotCSAqLwotCXB1YmxpYyBTaW1wbGVSb290VHJhbnNsYXRvciBhZGRDaGlsZHJlbihUcmFuc2xhdG9yW10gdHJhbnNsYXRvcnMpIHsKLQkJdGhpcy5jaGlsZHJlbiA9IEFycmF5VG9vbHMuYWRkQWxsKHRoaXMuZ2V0Q2hpbGRyZW5fKCksIHRyYW5zbGF0b3JzKTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgdHJhbnNsYXRvciBmcm9tIHRoZSB0cmFuc2xhdG9yJ3MgbGlzdCBvZiBjaGlsZHJlbi4KLQkgKiBSZXR1cm4gdGhlIHRyYW5zbGF0b3IgZm9yIG1ldGhvZCBjaGFpbmluZy4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlUm9vdFRyYW5zbGF0b3IgcmVtb3ZlQ2hpbGQoVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCXRoaXMuY2hpbGRyZW4gPSBBcnJheVRvb2xzLnJlbW92ZSh0aGlzLmNoaWxkcmVuLCB0cmFuc2xhdG9yKTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgdHJhbnNsYXRvcnMgZnJvbSB0aGUgdHJhbnNsYXRvcidzIGxpc3Qgb2YgY2hpbGRyZW4uCi0JICogUmV0dXJuIHRoZSB0cmFuc2xhdG9yIGZvciBtZXRob2QgY2hhaW5pbmcuCi0JICovCi0JcHVibGljIFNpbXBsZVJvb3RUcmFuc2xhdG9yIHJlbW92ZUNoaWxkcmVuKFRyYW5zbGF0b3JbXSB0cmFuc2xhdG9ycykgewotCQl0aGlzLmNoaWxkcmVuID0gQXJyYXlUb29scy5yZW1vdmVBbGwodGhpcy5jaGlsZHJlbiwgKE9iamVjdFtdKSB0cmFuc2xhdG9ycyk7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9TaW1wbGVUcmFuc2xhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L3RyYW5zbGF0b3JzL1NpbXBsZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkYjAyNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L3RyYW5zbGF0b3JzL1NpbXBsZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JQYXRoOwotCi0vKioKLSAqIFRyYW5zbGF0b3IgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgY2hpbGQgdHJhbnNsYXRvcnMgYW5kIG5vIHNwZWNpYWwKLSAqIGJlaGF2aW9yLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlVHJhbnNsYXRvcgotCWV4dGVuZHMgVHJhbnNsYXRvcgotewotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY2hpbGRyZW47Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBlQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlU3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBlU3RydWN0dXJhbEZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlU3RydWN0dXJhbEZlYXR1cmUsIFRyYW5zbGF0b3JbXSBjaGlsZHJlbikgewotCQlzdXBlcihkb21QYXRoQW5kTmFtZXMsIGVTdHJ1Y3R1cmFsRmVhdHVyZSk7Ci0JCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlVHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFU3RydWN0dXJhbEZlYXR1cmUgZVN0cnVjdHVyYWxGZWF0dXJlLCBFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgZVN0cnVjdHVyYWxGZWF0dXJlLCBlQ2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgU2ltcGxlVHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFU3RydWN0dXJhbEZlYXR1cmUgZVN0cnVjdHVyYWxGZWF0dXJlLCBFQ2xhc3MgZUNsYXNzLCBUcmFuc2xhdG9yW10gY2hpbGRyZW4pIHsKLQkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBlU3RydWN0dXJhbEZlYXR1cmUsIGVDbGFzcyk7Ci0JCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlVHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFU3RydWN0dXJhbEZlYXR1cmUgZVN0cnVjdHVyYWxGZWF0dXJlLCBUcmFuc2xhdG9yUGF0aCB0cmFuc2xhdG9yUGF0aCkgewotCQlzdXBlcihkb21QYXRoQW5kTmFtZXMsIGVTdHJ1Y3R1cmFsRmVhdHVyZSwgdHJhbnNsYXRvclBhdGgpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlU3RydWN0dXJhbEZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoW10gdHJhbnNsYXRvclBhdGhzKSB7Ci0JCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgZVN0cnVjdHVyYWxGZWF0dXJlLCB0cmFuc2xhdG9yUGF0aHMpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlU3RydWN0dXJhbEZlYXR1cmUsIGludCBzdHlsZSkgewotCQlzdXBlcihkb21QYXRoQW5kTmFtZXMsIGVTdHJ1Y3R1cmFsRmVhdHVyZSwgc3R5bGUpOwotCX0KLQkKLQlwdWJsaWMgU2ltcGxlVHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIGludCBzdHlsZSwgRUNsYXNzIGVDbGFzcywgVHJhbnNsYXRvcltdIGNoaWxkcmVuKSB7Ci0JCXRoaXMoZG9tUGF0aEFuZE5hbWVzLCBhRmVhdHVyZSwgc3R5bGUpOwotCQlzZXRFTUZDbGFzcyhlQ2xhc3MpOwotCQl0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47Ci0JfQotCi0JcHVibGljIFNpbXBsZVRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRVN0cnVjdHVyYWxGZWF0dXJlIGVTdHJ1Y3R1cmFsRmVhdHVyZSwgaW50IHN0eWxlLCBUcmFuc2xhdG9yW10gY2hpbGRyZW4pIHsKLQkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBlU3RydWN0dXJhbEZlYXR1cmUsIHN0eWxlKTsKLQkJdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjaGlsZHJlbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXaWRlbiBtZXRob2QgYWNjZXNzIHRvICdwdWJsaWMnLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW5fKCkgewotCQlyZXR1cm4gKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgPyBFTVBUWV9UUkFOU0xBVE9SX0FSUkFZIDogdGhpcy5jaGlsZHJlbjsKLQl9Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yW10gRU1QVFlfVFJBTlNMQVRPUl9BUlJBWSA9IG5ldyBUcmFuc2xhdG9yWzBdOwotCi0JLyoqCi0JICogU2V0IHRoZSB0cmFuc2xhdG9yJ3MgY2hpbGRyZW4uCi0JICogUmV0dXJuIHRoZSB0cmFuc2xhdG9yLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoaWxkcmVuKFRyYW5zbGF0b3JbXSBjaGlsZHJlbikgewotCQl0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgdHJhbnNsYXRvciB0byB0aGUgdHJhbnNsYXRvcidzIGxpc3Qgb2YgY2hpbGRyZW4uCi0JICogUmV0dXJuIHRoZSB0cmFuc2xhdG9yIGZvciBtZXRob2QgY2hhaW5pbmcuCi0JICovCi0JcHVibGljIFNpbXBsZVRyYW5zbGF0b3IgYWRkQ2hpbGQoVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCXRoaXMuY2hpbGRyZW4gPSBBcnJheVRvb2xzLmFkZCh0aGlzLmdldENoaWxkcmVuXygpLCB0cmFuc2xhdG9yKTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgdHJhbnNsYXRvcnMgdG8gdGhlIHRyYW5zbGF0b3IncyBsaXN0IG9mIGNoaWxkcmVuLgotCSAqIFJldHVybiB0aGUgdHJhbnNsYXRvciBmb3IgbWV0aG9kIGNoYWluaW5nLgotCSAqLwotCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yIGFkZENoaWxkcmVuKFRyYW5zbGF0b3JbXSB0cmFuc2xhdG9ycykgewotCQl0aGlzLmNoaWxkcmVuID0gQXJyYXlUb29scy5hZGRBbGwodGhpcy5nZXRDaGlsZHJlbl8oKSwgdHJhbnNsYXRvcnMpOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCB0cmFuc2xhdG9yIGZyb20gdGhlIHRyYW5zbGF0b3IncyBsaXN0IG9mIGNoaWxkcmVuLgotCSAqIFJldHVybiB0aGUgdHJhbnNsYXRvciBmb3IgbWV0aG9kIGNoYWluaW5nLgotCSAqLwotCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yIHJlbW92ZUNoaWxkKFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCQl0aGlzLmNoaWxkcmVuID0gQXJyYXlUb29scy5yZW1vdmUodGhpcy5jaGlsZHJlbiwgdHJhbnNsYXRvcik7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHRyYW5zbGF0b3JzIGZyb20gdGhlIHRyYW5zbGF0b3IncyBsaXN0IG9mIGNoaWxkcmVuLgotCSAqIFJldHVybiB0aGUgdHJhbnNsYXRvciBmb3IgbWV0aG9kIGNoYWluaW5nLgotCSAqLwotCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yIHJlbW92ZUNoaWxkcmVuKFRyYW5zbGF0b3JbXSB0cmFuc2xhdG9ycykgewotCQl0aGlzLmNoaWxkcmVuID0gQXJyYXlUb29scy5yZW1vdmVBbGwodGhpcy5jaGlsZHJlbiwgKE9iamVjdFtdKSB0cmFuc2xhdG9ycyk7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvbGlicHJvdi9KcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9saWJwcm92L0pwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U1MjQ0OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9saWJwcm92L0pwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnByb3Y7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LklMaWJyYXJ5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0QmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyB7Ci0JCi0JSUZhY2V0ZWRQcm9qZWN0QmFzZSBnZXRGYWNldGVkUHJvamVjdCgpOwotCQotCUlMaWJyYXJ5UHJvdmlkZXIgZ2V0TGlicmFyeVByb3ZpZGVyKCk7Ci0JCi0JSVByb2plY3RGYWNldFZlcnNpb24gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvbGlidmFsL0xpYnJhcnlWYWxpZGF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2xpYnZhbC9MaWJyYXJ5VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMTVjNDMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvbGlidmFsL0xpYnJhcnlWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnZhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJwcm92LkpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBleHRlbmRlci1zdXBwbGllZCBsaWJyYXJ5IHZhbGlkYXRvcnMuICAKLSAqIEVhY2ggbGlicmFyeSB2YWxpZGF0b3IgbXVzdCBoYXZlIGEgemVyby1hcmcgY29uc3RydWN0b3IuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBMaWJyYXJ5VmFsaWRhdG9yIHsKLQkKLQlJU3RhdHVzIHZhbGlkYXRlKEpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY29uZmlnKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL1Byb2plY3RSZXNvdXJjZUxvY2F0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL1Byb2plY3RSZXNvdXJjZUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThjMDVkNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9Qcm9qZWN0UmVzb3VyY2VMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiBiZSByZXRyaWV2ZWQgdmlhIHRoZSBBZGFwdGVyIGZyYW1ld29yazoKLSAqIDxwcmU+Ci0gKiBJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KCJGb28gUHJvamVjdCIpOwotICogUHJvamVjdFJlc291cmNlTG9jYXRvciBsb2NhdG9yID0gKFByb2plY3RSZXNvdXJjZUxvY2F0b3IpIHByb2plY3QuZ2V0QWRhcHRlcihQcm9qZWN0UmVzb3VyY2VMb2NhdG9yLmNsYXNzKTsKLSAqIDwvcHJlPgotICogPHA+Ci0gKiBTZWUgPGNvZGU+b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3BsdWdpbi54bWw8L2NvZGU+LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4yCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5Qcm9qZWN0QWRhcHRlckZhY3RvcnkKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9qZWN0UmVzb3VyY2VMb2NhdG9yIHsKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciBpcyBhbiBhY2NlcHRhYmxlIChub24tSmF2YSkKLQkgKiByZXNvdXJjZSBsb2NhdGlvbiBmb3IgdGhlIGxvY2F0b3IncyBwcm9qZWN0LgotCSAqLwotCWJvb2xlYW4gcmVzb3VyY2VMb2NhdGlvbklzVmFsaWQoSUNvbnRhaW5lciBjb250YWluZXIpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBsb2NhdGlvbiBpbiB3aGljaCB0byBjcmVhdGUgbmV3IChub24tSmF2YSkgcmVzb3VyY2VzLgotCSAqLwotCUlDb250YWluZXIgZ2V0RGVmYXVsdFJlc291cmNlTG9jYXRpb24oKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHdvcmtzcGFjZSByZWxhdGl2ZSBhYnNvbHV0ZSByZXNvdXJjZSBwYXRoIGJlc3QgcmVwcmVzZW50ZWQgYnkKLQkgKiB0aGUgc3BlY2lmaWVkIHJ1bnRpbWUgcGF0aCBmb3IgdGhlIGxvY2F0b3IncyBwcm9qZWN0LgotCSAqLwotCUlQYXRoIGdldFJlc291cmNlUGF0aChJUGF0aCBydW50aW1lUGF0aCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBydW50aW1lIHBhdGggYmVzdCByZXByZXNlbnRlZCBieSB0aGUgc3BlY2lmaWVkIHdvcmtzcGFjZQotCSAqIHJlbGF0aXZlIGFic29sdXRlIHJlc291cmNlIHBhdGggZm9yIHRoZSBsb2NhdG9yJ3MgcHJvamVjdC4KLQkgKi8KLQlJUGF0aCBnZXRSdW50aW1lUGF0aChJUGF0aCByZXNvdXJjZVBhdGgpOwotCi0JLyoqCi0JICogUmV0dXJuIGFuIHtAbGluayBJRmlsZX0gdGhhdCBiZXN0IHJlcHJlc2VudHMgdGhlIHNwZWNpZmllZCBydW50aW1lCi0JICogbG9jYXRpb24uCi0JICovCi0JSUZpbGUgZ2V0UGxhdGZvcm1GaWxlKElQYXRoIHJ1bnRpbWVQYXRoKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL1Jlc291cmNlTG9jYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvUmVzb3VyY2VMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYjgyYmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvUmVzb3VyY2VMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLS8qKgotICogQ2xpZW50LWRlZmluZWQgcmVzb3VyY2UgbG9jYXRvci4KLSAqIDxwPgotICogU2VlIDxjb2RlPm9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9wbHVnaW4ueG1sPC9jb2RlPi4KLSAqIDxwPgotICogU2VlIDxjb2RlPm9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zY2hlbWEvcmVzb3VyY2VMb2NhdG9ycy5leHNkPC9jb2RlPi4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlTG9jYXRvciB7Ci0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb250YWluZXIgaXMgYW4gYWNjZXB0YWJsZSAobm9uLUphdmEpCi0JICogcmVzb3VyY2UgbG9jYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4KLQkgKi8KLQlib29sZWFuIHJlc291cmNlTG9jYXRpb25Jc1ZhbGlkKElQcm9qZWN0IHByb2plY3QsIElDb250YWluZXIgY29udGFpbmVyKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgbG9jYXRpb24gaW4gd2hpY2ggdG8gY3JlYXRlIG5ldyAobm9uLUphdmEpIHJlc291cmNlcy4KLQkgKi8KLQlJQ29udGFpbmVyIGdldERlZmF1bHRSZXNvdXJjZUxvY2F0aW9uKElQcm9qZWN0IHByb2plY3QpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgd29ya3NwYWNlIHJlbGF0aXZlIGFic29sdXRlIHJlc291cmNlIHBhdGggYmVzdCByZXByZXNlbnRlZCBieQotCSAqIHRoZSBzcGVjaWZpZWQgcnVudGltZSBwYXRoIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QuCi0JICovCi0JSVBhdGggZ2V0UmVzb3VyY2VQYXRoKElQcm9qZWN0IHByb2plY3QsIElQYXRoIHJ1bnRpbWVQYXRoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJ1bnRpbWUgcGF0aCBiZXN0IHJlcHJlc2VudGVkIGJ5IHRoZSBzcGVjaWZpZWQgd29ya3NwYWNlCi0JICogcmVsYXRpdmUgYWJzb2x1dGUgcmVzb3VyY2UgcGF0aCBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LgotCSAqLwotCUlQYXRoIGdldFJ1bnRpbWVQYXRoKElQcm9qZWN0IHByb2plY3QsIElQYXRoIHJlc291cmNlUGF0aCk7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0Fubm90YXRpb24uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGNkNWUwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci0KLS8qKgotICogQ29tbW9uIEphdmEgcmVzb3VyY2UgYW5ub3RhdGlvbiBiZWhhdmlvcgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQW5ub3RhdGlvbgotCWV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQotewotCS8qKgotCSAqIFJldHVybiB0aGUgYW5ub3RhdGlvbidzIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCBhcyBvcHBvc2VkIHRvIHRoZSB2YWx1ZSBvZgotCSAqIHRoZSBhbm5vdGF0aW9uJ3MgJ25hbWUnIGVsZW1lbnQuIEZvciBleGFtcGxlOgotCSAqICAgICBAY29tLmZvby5CYXIobmFtZT0iVGhvbWFzIikKLQkgKiAjZ2V0QW5ub3RhdGlvbk5hbWUoKSB3aWxsIHJldHVybiAiY29tLmZvby5CYXIiLgotCSAqIEluIHR5cGljYWwgc3ViY2xhc3NlcywgI2dldE5hbWUoKSB3b3VsZCByZXR1cm4gIlRob21hcyIuCi0JICovCi0JU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgSkRUIERPTSBhbm5vdGF0aW9uIGZyb20gdGhlIHNwZWNpZmllZAotCSAqIEFTVCBjb21waWxhdGlvbiB1bml0LgotCSAqLwotCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldEFzdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgSmF2YSBhbm5vdGF0aW9uIHRvIHRoZSBKRFQgRE9NLgotCSAqLwotCXZvaWQgbmV3QW5ub3RhdGlvbigpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBjb3JyZXNwb25kaW5nIEphdmEgYW5ub3RhdGlvbiBmcm9tIHRoZSBKRFQgRE9NLgotCSAqLwotCXZvaWQgcmVtb3ZlQW5ub3RhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYWxsIHRoZSBhbm5vdGF0aW9uJ3MgbWVtYmVyIHZhbHVlcyBhcmUgPGNvZGU+bnVsbDwvY29kZT47Ci0JICogaW1wbHlpbmcgdGhlIGFubm90YXRpb24gY2FuIGJlIHJlbW92ZWQgaWYgaXQgaGFzIG5vIHNlbWFudGljIHZhbHVlIGFzIGEKLQkgKiBtYXJrZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQlib29sZWFuIGlzVW5zZXQoKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRmNDUzZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci0KLS8qKgotICogVXNlZCB0byBidWlsZCBBbm5vdGF0aW9ucyBkaXNjb3ZlcmVkIGluIHRoZSBKYXZhIHNvdXJjZSBjb2RlLgotICogVG8gcHJvdmlkZSBuZXcgQW5ub3RhdGlvbkRlZmluaXRpb25zLCBjcmVhdGUgYSBuZXcgSmF4YlBsYXRmb3JtCi0gKiBieSBpbXBsZW1lbnRpbmcgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbi4KLSAqIAotICogQHNlZSBBbm5vdGF0aW9uCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGFubm90YXRpb24gdGhlIGRlZmluaXRpb24gd2lsbCBidWlsZCBpbiB0aGUKLQkgKiB2YXJpb3VzICNidWlsZC4uLiguLi4pIG1ldGhvZHMuCi0JICovCi0JU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCk7Ci0JCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhbiBhbm5vdGF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGFubm90YXRlZCBlbGVtZW50LgotCSAqLwotCUFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpOwotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYW4gYW5ub3RhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBKRFQgYW5ub3RhdGlvbgotCSAqIG9uIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGVkIGVsZW1lbnQuCi0JICovCi0JQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pOwotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSAibnVsbCIgYW5ub3RhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBhbm5vdGF0ZWQgZWxlbWVudC4KLQkgKiBPbmx5IGNlcnRhaW4gYW5ub3RhdGlvbnMgYXJlIHJlcXVpcmVkIHRvIGhhdmUgIm51bGwiIGltcGxlbWVudGF0aW9uczsKLQkgKiB0eXBpY2FsbHkgdGhlIGFubm90YXRpb25zIHdpdGggcmVhc29uYWJseSBjb21wbGV4IGRlZmF1bHQgYmVoYXZpb3IuCi0JICogVGhlICJudWxsIiBhbm5vdGF0aW9uIGlzIHVzZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgZGVmYXVsdCBjb250ZXh0IG1vZGVsLgotCSAqIFRoZSAibnVsbCIgYW5ub3RhdGlvbiBzaW1wbGlmaWVzIHRoZSBjb250ZXh0IG1vZGVsIGNvZGUsIGFsbG93aW5nIHRoZQotCSAqIGNvbnRleHQgbW9kZWwgdG8gc2ltcGx5IHNldCB2YXJpb3VzIGJpdHMgb2Ygc3RhdGUgKGUuZy4gJ25hbWUnKSBhbmQgdGhlCi0JICogIm51bGwiIGFubm90YXRpb24gd2lsbCBjcmVhdGUgYSBuZXcgInJlYWwiIGFubm90YXRpb24gYW5kIGZvcndhcmQgdGhlCi0JICogbmV3IHN0YXRlIHRvIGl0LiBUaGlzIHJlZHVjZXMgdGhlIG51bWJlciBvZiBudWxsIGNoZWNrcyBpbiB0aGUgY29udGV4dAotCSAqIG1vZGVsIChob3BlZnVsbHkpLgotCSAqLwotCUFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUFic3RyYWN0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjI4YTZlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQWJzdHJhY3RUeXBlRGVjbGFyYXRpb247Ci0KLS8qKgotICogSmF2YSBzb3VyY2UgY29kZSBvciBiaW5hcnkgdHlwZS4gIFRoaXMgY29ycmVzcG9uZHMgdG8gYSB7QGxpbmsgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb259Ci0gKiAod2hpY2ggaXMgd2h5IHRoZSBuYW1lIGlzIHNvbWV3aGF0IHdvbmt5LikKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZQotCQlleHRlbmRzIEphdmFSZXNvdXJjZU1lbWJlciB7Ci0JCi0JLyoqCi0JICogUHJvcGVydHkgY2hhbmdlIFN0cmluZyBmb3IgdGhlIHVucXVhbGlmaWVkIChzaG9ydCkgdHlwZSBuYW1lLgotCSAqIEBzZWUgSmF2YVJlc291cmNlTWVtYmVyI2dldE5hbWUoKQotCSAqLwotCVN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCB0eXBlIG5hbWUuCi0JICovCi0JU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKTsKLQkJU3RyaW5nIFFVQUxJRklFRF9OQU1FX1BST1BFUlRZID0gInF1YWxpZmllZE5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhY2thZ2UgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKTsKLQkJU3RyaW5nIFBBQ0tBR0VfTkFNRV9QUk9QRVJUWSA9ICJwYWNrYWdlTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdHlwZSdzICJkZWNsYXJpbmcgdHlwZSIuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB0eXBlIGlzIGEgdG9wLWxldmVsIHR5cGUuCi0JICovCi0JU3RyaW5nIGdldERlY2xhcmluZ1R5cGVOYW1lKCk7Ci0JCVN0cmluZyBERUNMQVJJTkdfVFlQRV9OQU1FX1BST1BFUlRZID0gImRlY2xhcmluZ1R5cGVOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgaXMgYSBtZW1iZXIgdHlwZS4KLQkgKi8KLQlib29sZWFuIGlzTWVtYmVyVHlwZSgpOwotCQlTdHJpbmcgTUVNQkVSX1RZUEVfUFJPUEVSVFkgPSAibWVtYmVyVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCWJvb2xlYW4gaXNJbihJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCk7Ci0KLQlib29sZWFuIGlzSW4oSVBhY2thZ2VGcmFnbWVudFJvb3Qgc291cmNlRm9sZGVyKTsKLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbW1lZGlhdGVseSBuZXN0ZWQgdHlwZXMgKGNsYXNzZXMgb3IgaW50ZXJmYWNlcywgbm90IGVudW1zIG9yIGFubm90YXRpb25zKSAoY2hpbGRyZW4pLgotCSAqLwotCUl0ZXJhYmxlPEphdmFSZXNvdXJjZVR5cGU+IGdldFR5cGVzKCk7Ci0JCVN0cmluZyBUWVBFU19DT0xMRUNUSU9OID0gInR5cGVzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgdHlwZXM7IHRoZSB0eXBlIGl0c2VsZiwgaXRzIGNoaWxkcmVuLCBpdHMgZ3JhbmRjaGlsZHJlbiwKLQkgKiBldGMuCi0JICovCi0JSXRlcmFibGU8SmF2YVJlc291cmNlVHlwZT4gZ2V0QWxsVHlwZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW1tZWRpYXRlbHkgbmVzdGVkIGVudW1zIChjaGlsZHJlbikuCi0JICovCi0JSXRlcmFibGU8SmF2YVJlc291cmNlRW51bT4gZ2V0RW51bXMoKTsKLQkJU3RyaW5nIEVOVU1TX0NPTExFQ1RJT04gPSAiZW51bXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBlbnVtczsgdGhlIGVudW0gaXRzZWxmLCBpdHMgY2hpbGRyZW4sIGl0cyBncmFuZGNoaWxkcmVuLAotCSAqIGV0Yy4KLQkgKi8KLQlJdGVyYWJsZTxKYXZhUmVzb3VyY2VFbnVtPiBnZXRBbGxFbnVtcygpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTc2ZDEyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5Bbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIEphdmEgc291cmNlIGNvZGUgb3IgYmluYXJ5IGFubm90YXRlZCBlbGVtZW50LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudAotCWV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQotewotCS8vICoqKioqKioqKiogYW5ub3RhdGlvbnMgKioqKioqKioqKgotCQotCS8qKgotCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgImFubm90YXRpb25zIiBjb2xsZWN0aW9uCi0JICovCi0JU3RyaW5nIEFOTk9UQVRJT05TX0NPTExFQ1RJT04gPSAiYW5ub3RhdGlvbnMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogU3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSAibmVzdGFibGVBbm5vdGF0aW9ucyIgY29sbGVjdGlvbgotCSAqLwotCVN0cmluZyBORVNUQUJMRV9BTk5PVEFUSU9OU19DT0xMRUNUSU9OID0gIm5lc3RhYmxlQW5ub3RhdGlvbnMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZW1iZXIncyBhbm5vdGF0aW9ucyBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFwcGVhci4KLQkgKiBEbyBub3QgcmV0dXJuIGR1cGxpY2F0ZSBhbm5vdGF0aW9ucyBhcyB0aGlzIGVycm9yIGlzIGhhbmRsZWQgYnkgdGhlIEphdmEKLQkgKiBjb21waWxlci4KLQkgKi8KLQlJdGVyYWJsZTxBbm5vdGF0aW9uPiBnZXRBbm5vdGF0aW9ucygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGFubm90YXRpb25zLgotCSAqLwotCWludCBnZXRBbm5vdGF0aW9uc1NpemUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogUmV0dXJuIHRoZSBmaXJzdCBpZiB0aGVyZSBhcmUgZHVwbGljYXRlcyBpbiB0aGUgc291cmNlIGNvZGUuCi0JICovCi0JQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGlmIHRoZXJlIGFyZSBkdXBsaWNhdGVzIGluIHRoZSBzb3VyY2UgY29kZS4KLQkgKiBEbyBub3QgcmV0dXJuIG51bGwsIGJ1dCBhIE51bGwgT2JqZWN0IGluc3RlYWQgaWYgbm8gYW5ub3RhdGlvbgotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGV4aXN0cyBpbiB0aGUgc291cmNlIGNvZGUuCi0JICovCi0JQW5ub3RhdGlvbiBnZXROb25OdWxsQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmVzdGFibGUgYW5ub3RhdGlvbnMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gdGhlIG9yZGVyIHRoYXQKLQkgKiB0aGV5IGFwcGVhci4KLQkgKiBJZiBuZXN0YWJsZSBhbmQgY29udGFpbmVyIGFubm90YXRpb25zIGFyZSBib3RoIHNwZWNpZmllZCBvbiB0aGUKLQkgKiBtZW1iZXIgZGlyZWN0bHksIHRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQKLQkgKi8KLQkvLyBUT0RPIHRpZSB0aGUgc2luZ3VsYXIgYW5kIHBsdXJhbCBhbm5vdGF0aW9ucyB0b2dldGhlciBzbyB3ZSBjYW4gZ2VuZXJhdGUKLQkvLyBhIHZhbGlkYXRpb24gZXJyb3Igd2hlbiBib3RoIGFyZSBzcGVjaWZpZWQKLQlMaXN0SXRlcmFibGU8TmVzdGFibGVBbm5vdGF0aW9uPiBnZXRBbm5vdGF0aW9ucyhTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbmVzdGFibGUgYW5ub3RhdGlvbnMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogSWYgbmVzdGFibGUgYW5kIGNvbnRhaW5lciBhbm5vdGF0aW9ucyBhcmUgYm90aCBzcGVjaWZpZWQgb24gdGhlCi0JICogbWVtYmVyIGRpcmVjdGx5LCB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkCi0JICovCi0JaW50IGdldEFubm90YXRpb25zU2l6ZShTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXN0YWJsZSBhbm5vdGF0aW9uIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogSWYgbmVzdGFibGUgYW5kIGNvbnRhaW5lciBhbm5vdGF0aW9ucyBhcmUgYm90aCBzcGVjaWZpZWQgb24gdGhlCi0JICogbWVtYmVyIGRpcmVjdGx5LCB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkCi0JICovCi0JTmVzdGFibGVBbm5vdGF0aW9uIGdldEFubm90YXRpb24oaW50IGluZGV4LCBTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JCi0JLyoqCi0JICogQWRkIGFuIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogUmV0dXJuIHRoZSBuZXdseS1jcmVhdGVkIGFubm90YXRpb24uCi0JICovCi0JQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSk7Ci0JCi0JLyoqCi0JICogQWRkIGEgbmV3IG5lc3RhYmxlIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogQ3JlYXRlIGEgbmV3IGNvbnRhaW5lciBhbm5vdGF0aW9uIGlmIG5lY2Vzc2FyeSBhbmQgYWRkIHRoZSBuZXN0YWJsZQotCSAqIGFubm90YXRpb24gdG8gaXQuCi0JICogSWYgYm90aCB0aGUgbmVzdGFibGUgYW5ub3RhdGlvbiBhbmQgdGhlIGNvbnRhaW5lciBhbm5vdGF0aW9uIGFscmVhZHkKLQkgKiBleGlzdCwgdGhlbiBhZGQgdG8gdGhlIGNvbnRhaW5lciBhbm5vdGF0aW9uLCBsZWF2aW5nIHRoZSBleGlzdGluZwotCSAqIG5lc3RhYmxlIGFubm90YXRpb24gYWxvbmUuCi0JICogSWYgb25seSB0aGUgbmVzdGFibGUgYW5ub3RhdGlvbiBleGlzdHMsIHRoZW4gY3JlYXRlIHRoZSBuZXcgY29udGFpbmVyCi0JICogYW5ub3RhdGlvbiBhbmQgbW92ZSB0aGUgZXhpc3RpbmcgbmVzdGFibGUgYW5ub3RhdGlvbiB0byBpdCBhbG9uZyB3aXRoCi0JICogdGhlIG5ldyBvbmUuIElmIG5laXRoZXIgYW5ub3RhdGlvbiBleGlzdHMsIHRoZW4gY3JlYXRlIGEgbmV3IG5lc3RhYmxlCi0JICogYW5ub3RhdGlvbi4KLQkgKi8KLQlOZXN0YWJsZUFubm90YXRpb24gYWRkQW5ub3RhdGlvbihpbnQgaW5kZXgsIFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQkKLQkvKioKLQkgKiBNb3ZlIHRoZSBuZXN0YWJsZSBhbm5vdGF0aW9uIGF0IHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGluZGV4LgotCSAqLwotCXZvaWQgbW92ZUFubm90YXRpb24oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgcmVtb3ZlQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOwotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG5lc3RhYmxlIGFubm90YXRpb24gZnJvbSB0aGUgY29udGFpbmVyIGFubm90YXRpb24gYXQgdGhlIHNwZWNpZmllZAotCSAqIGluZGV4LgotCSAqIElmIHRoZXJlIGlzIG5vIGNvbnRhaW5lciwgYXNzdW1lIHRoZSBpbmRleCBpcyB6ZXJvIGFuZCBqdXN0IHJlbW92ZSB0aGUgbmVzdGFibGUgYW5ub3RhdGlvbgotCSAqLwotCXZvaWQgcmVtb3ZlQW5ub3RhdGlvbihpbnQgaW5kZXgsIFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQkKLQkKLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnQncyAidG9wIGxldmVsIiBhbm5vdGF0aW9ucy4KLQkgKiBGb3IgImNvbWJpbmF0aW9uIiBhbm5vdGF0aW9ucyAoaS5lLiBhIHZpcnR1YWwgYXJyYXkgb2YgYW5ub3RhdGlvbnMgdGhhdAotCSAqIGNhbiBiZSBlaXRoZXIgYSBzaW5nbGUgPGVtPnN0YW5kYWxvbmU8L2VtPiBhbm5vdGF0aW9uIFtyZXByZXNlbnRpbmcgYW4KLQkgKiBhcnJheSBvZiBsZW5ndGggb25lXSBvciBhbiBhcnJheSBvZiBhbm5vdGF0aW9ucyB3aXRpbiBhCi0JICogPGVtPmNvbnRhaW5lcjwvZW0+IGFubm90YXRpb24pLCBvbmx5IHRoZSA8ZW0+Y29udGFpbmVyPC9lbT4gYW5ub3RhdGlvbiBpcwotCSAqIGluY2x1ZGVkIChpZiBpdCBpcyBwcmVzZW50KSBvciB0aGUgc2luZ2xlIDxlbT5zdGFuZGFsb25lPC9lbT4gYW5ub3RhdGlvbi4KLQkgKi8KLQlJdGVyYWJsZTxBbm5vdGF0aW9uPiBnZXRUb3BMZXZlbEFubm90YXRpb25zKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHVuZGVybHlpbmcgSkRUIG1lbWJlciBpcyBjdXJyZW50bHkgYW5ub3RhdGVkIHdpdGggYW55IHJlY29nbml6ZWQKLQkgKiBhbm5vdGF0aW9ucy4KLQkgKi8KLQlib29sZWFuIGlzQW5ub3RhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdW5kZXJseWluZyBKRFQgbWVtYmVyIGlzIGFubm90YXRlZCB3aXRoIGFueSBvZiB0aGUgZ2l2ZW4gYW5ub3RhdGlvbnMuCi0JICovCi0JYm9vbGVhbiBpc0Fubm90YXRlZFdpdGhBbnlPZihJdGVyYWJsZTxTdHJpbmc+IGFubm90YXRpb25OYW1lcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnQga2luZAotCSAqLwotCUtpbmQgZ2V0S2luZCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSBmb3IgdGhlIG1lbWJlcidzIG5hbWUuCi0JICovCi0JVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSBmb3IgdGhlIG5lc3RhYmxlIGFubm90YXRpb24gaWYgaXQgaXMgY3VycmVudGx5Ci0JICogdW5uZXN0ZWQuIElmIGl0IGlzIG5lc3RlZCwgcmV0dXJuIHRoZSB0ZXh0IHJhbmdlIGZvciB0aGUgY29ycmVzcG9uZGluZwotCSAqIGNvbnRhaW5lciBhbm5vdGF0aW9uLgotCSAqIAotCSAqIEBzZWUgQW5ub3RhdGlvblByb3ZpZGVyI2dldENvbnRhaW5lckFubm90YXRpb25OYW1lKFN0cmluZykKLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogVGhlIGtpbmQgb2YgamF2YSBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBlbnVtIEtpbmQgewotCQkKLQkJLyoqCi0JCSAqIFJlcHJlc2VudHMgYW4gYW5ub3RhdGFibGUgcGFja2FnZS4KLQkJICogQW4ge0BsaW5rIEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnR9IG9mIHtAbGluayBLaW5kfSBQQUNLQUdFIG1heSBzYWZlbHkgYmUgY2FzdCBhcyBhIAotCQkgKiB7QGxpbmsgSmF2YVJlc291cmNlUGFja2FnZX0KLQkJICovCi0JCVBBQ0tBR0UoQVNUTm9kZS5QQUNLQUdFX0RFQ0xBUkFUSU9OKSwKLQkJCi0JCS8qKgotCQkgKiBSZXByZXNlbnRzIGEgY2xhc3Mgb3IgaW50ZXJmYWNlLgotCQkgKiBBbiB7QGxpbmsgSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudH0gb2Yge0BsaW5rIEtpbmR9IFRZUEUgbWF5IHNhZmVseSBiZSBjYXN0IGFzIGEgCi0JCSAqIHtAbGluayBKYXZhUmVzb3VyY2VUeXBlfQotCQkgKi8KLQkJVFlQRShBU1ROb2RlLlRZUEVfREVDTEFSQVRJT04pLAotCQkKLQkJLyoqCi0JCSAqIFJlcHJlc2VudHMgYW4gZW51bS4KLQkJICogQW4ge0BsaW5rIEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnR9IG9mIHtAbGluayBLaW5kfSBFTlVNIG1heSBzYWZlbHkgYmUgY2FzdCBhcyBhIAotCQkgKiB7QGxpbmsgSmF2YVJlc291cmNlRW51bX0KLQkJICovCi0JCUVOVU0oQVNUTm9kZS5FTlVNX0RFQ0xBUkFUSU9OKSwKLQkJCi0JCS8qKgotCQkgKiBSZXByZXNlbnRzIGEgbWV0aG9kLgotCQkgKiBBbiB7QGxpbmsgSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudH0gb2Yge0BsaW5rIEtpbmR9IE1FVEhPRCBtYXkgc2FmZWx5IGJlIGNhc3QgYXMgYSAKLQkJICoge0BsaW5rIEphdmFSZXNvdXJjZU1ldGhvZH0KLQkJICovCi0JCU1FVEhPRChBU1ROb2RlLk1FVEhPRF9ERUNMQVJBVElPTiksCi0JCQotCQkvKioKLQkJICogUmVwcmVzZW50cyBhIHR5cGUgZmllbGQuCi0JCSAqIEFuIHtAbGluayBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50fSBvZiB7QGxpbmsgS2luZH0gRklFTEQgbWF5IHNhZmVseSBiZSBjYXN0IGFzIGEgCi0JCSAqIHtAbGluayBKYXZhUmVzb3VyY2VGaWVsZH0KLQkJICovCi0JCUZJRUxEKEFTVE5vZGUuRklFTERfREVDTEFSQVRJT04pLAotCQkKLQkJLyoqCi0JCSAqIFJlcHJlc2VudHMgYW4gZW51bSBjb25zdGFudC4KLQkJICogQW4ge0BsaW5rIEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnR9IG9mIHtAbGluayBLaW5kfSBFTlVNX0NPTlNUQU5UIG1heSBzYWZlbHkgYmUgY2FzdCBhcyBhIAotCQkgKiB7QGxpbmsgSmF2YVJlc291cmNlRW51bUNvbnN0YW50fQotCQkgKi8KLQkJRU5VTV9DT05TVEFOVChBU1ROb2RlLkVOVU1fQ09OU1RBTlRfREVDTEFSQVRJT04pOwotCi0KLQkJcHJpdmF0ZSBpbnQgYXN0Tm9kZVR5cGU7Ci0KLQkJS2luZChpbnQgYXN0Tm9kZVR5cGUpIHsKLQkJCXRoaXMuYXN0Tm9kZVR5cGUgPSBhc3ROb2RlVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0QXN0Tm9kZVR5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5hc3ROb2RlVHlwZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlQXR0cmlidXRlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjVjMjdlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIEphdmEgc291cmNlIGNvZGUgb3IgYmluYXJ5IGF0dHJpYnV0ZSAoZmllbGQvbWV0aG9kKQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlQXR0cmlidXRlCi0JZXh0ZW5kcyBKYXZhUmVzb3VyY2VNZW1iZXIKLXsKLQlKYXZhUmVzb3VyY2VUeXBlIGdldFBhcmVudCgpOwotCi0JSmF2YVJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUncyB0eXBlIGltcGxlbWVudHMgb3IgZXh0ZW5kcyB0aGUgc3BlY2lmaWVkCi0JICogdHlwZS4KLQkgKi8KLQlib29sZWFuIHR5cGVJc1N1YlR5cGVPZihTdHJpbmcgdHlwZU5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSdzIHR5cGUgaXMgYSAidmFyaWFibGUiIHByaW1pdGl2ZSB0eXBlCi0JICogKGkuZS4gYW55IHByaW1pdGl2ZSB0eXBlIGV4Y2VwdCAndm9pZCcpLgotCSAqLwotCWJvb2xlYW4gdHlwZUlzVmFyaWFibGVQcmltaXRpdmUoKTsKLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIKLQkgKi8KLQlpbnQgZ2V0TW9kaWZpZXJzKCk7Ci0JCVN0cmluZyBNT0RJRklFUlNfUFJPUEVSVFkgPSAibW9kaWZpZXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvbHZlZCwgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSdzIHR5cGUKLQkgKiAoZS5nLiAiamF2YS51dGlsLkNvbGxlY3Rpb24iIG9yICJieXRlW10iKS4KLQkgKiBJZiB0aGUgdHlwZSBpcyBhbiBhcnJheSwgdGhpcyBuYW1lIHdpbGwgaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyCi0JICogb2YgYnJhY2tldCBwYWlycy4KLQkgKiBUaGlzIG5hbWUgd2lsbCBub3QgaW5jbHVkZSB0aGUgdHlwZSdzIGdlbmVyaWMgdHlwZSBhcmd1bWVudHMKLQkgKiAoZS5nLiAiamF2YS51dGlsLkNvbGxlY3Rpb248amF2YS5sYW5nLlN0cmluZz4iIHdpbGwgb25seSByZXR1cm4KLQkgKiAiamF2YS51dGlsLkNvbGxlY3Rpb24iKS4KLQkgKiBAc2VlICNnZXRUeXBlVHlwZUFyZ3VtZW50TmFtZXMoKQotCSAqLwotCVN0cmluZyBnZXRUeXBlTmFtZSgpOwotCQlTdHJpbmcgVFlQRV9OQU1FX1BST1BFUlRZID0gInR5cGVOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSB0eXBlIGlzIGFuIGludGVyZmFjZS4KLQkgKi8KLQlib29sZWFuIHR5cGVJc0ludGVyZmFjZSgpOwotCQlTdHJpbmcgVFlQRV9JU19JTlRFUkZBQ0VfUFJPUEVSVFkgPSAidHlwZUlzSW50ZXJmYWNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSB0eXBlIGlzIGFuIGVudW0uCi0JICovCi0JYm9vbGVhbiB0eXBlSXNFbnVtKCk7Ci0JCVN0cmluZyBUWVBFX0lTX0VOVU1fUFJPUEVSVFkgPSAidHlwZUlzRW51bSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUgdHlwZSBpcyBhbiBhcnJheS4KLQkgKi8KLQlib29sZWFuIHR5cGVJc0FycmF5KCk7Ci0JCVN0cmluZyBUWVBFX0lTX0FSUkFZX1BST1BFUlRZID0gInR5cGVJc0FycmF5IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGltZW5zaW9uYWxpdHkgb2YgdGhlIGFycmF5LCAwIG90aGVyd2lzZS4KLQkgKiAoU3RyaW5nW11bXSAtPiAyLCBDb2xsZWN0aW9uPFN0cmluZz4gLT4gMCkKLQkgKi8KLQlpbnQgZ2V0VHlwZUFycmF5RGltZW5zaW9uYWxpdHkoKTsKLQkJU3RyaW5nIFRZUEVfQVJSQVlfRElNRU5TSU9OQUxJVFlfUFJPUEVSVFkgPSAidHlwZUFycmF5RGltZW5zaW9uYWxpdHkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb21wb25lbnQgdHlwZSBuYW1lIG9mIHRoZSBhcnJheSwgbnVsbCBvdGhlcndpc2UuCi0JICogKFN0cmluZ1tdW10gLT4gImphdmEubGFuZy5TdHJpbmciLCBDb2xsZWN0aW9uPFN0cmluZz4gLT4gbnVsbCkKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUoKTsKLQkJU3RyaW5nIFRZUEVfQVJSQVlfQ09NUE9ORU5UX1RZUEVfTkFNRV9QUk9QRVJUWSA9ICJ0eXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBhdHRyaWJ1dGUgdHlwZSdzIHN1cGVyY2xhc3Nlcy4KLQkgKi8KLQlMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRUeXBlU3VwZXJjbGFzc05hbWVzKCk7Ci0JCVN0cmluZyBUWVBFX1NVUEVSQ0xBU1NfTkFNRVNfTElTVCA9ICJ0eXBlU3VwZXJjbGFzc05hbWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgYXR0cmlidXRlIHR5cGUncyBpbnRlcmZhY2VzLgotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0VHlwZUludGVyZmFjZU5hbWVzKCk7Ci0JCVN0cmluZyBUWVBFX0lOVEVSRkFDRV9OQU1FU19DT0xMRUNUSU9OID0gInR5cGVJbnRlcmZhY2VOYW1lcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlJ3MgdHlwZSBhcmd1bWVudHMuCi0JICogVGhlIG5hbWUgZm9yIGFueSBhcmd1bWVudCB0aGF0IGlzIGFuIGFycmF5IHdpbGwgY29udGFpbiB0aGUgYXBwcm9wcmlhdGUKLQkgKiBudW1iZXIgb2YgYnJhY2tldCBwYWlycy4KLQkgKiBUaGUgbmFtZXMgd2lsbCBub3QgaW5jbHVkZSBhbnkgZnVydGhlciBnZW5lcmljIHR5cGUgYXJndW1lbnRzLgotCSAqLwotCUxpc3RJdGVyYWJsZTxTdHJpbmc+IGdldFR5cGVUeXBlQXJndW1lbnROYW1lcygpOwotCQlTdHJpbmcgVFlQRV9UWVBFX0FSR1VNRU5UX05BTUVTX0xJU1QgPSAidHlwZVR5cGVBcmd1bWVudE5hbWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JaW50IGdldFR5cGVUeXBlQXJndW1lbnROYW1lc1NpemUoKTsKLQotCVN0cmluZyBnZXRUeXBlVHlwZUFyZ3VtZW50TmFtZShpbnQgaW5kZXgpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUNsYXNzRmlsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VDbGFzc0ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJkYTA3Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUNsYXNzRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YTsKLQotCi0KLS8qKgotICogSmF2YSBjbGFzcyBmaWxlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVzb3VyY2VDbGFzc0ZpbGUKLQlleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZpbGUncyB0eXBlLgotCSAqLwotCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBnZXRUeXBlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTc1MmY0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kRXhlY3V0b3I7Ci0KLS8qKgotICogRGFsaSByZXNvdXJjZSBmb3IgSkRUIGNvbXBpbGF0aW9uIHVuaXQuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQKLQlleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUuUm9vdAotewotCS8qKgotCSAqIFJldHVybiB0aGUgY29ycmVzcG9uZGluZyBKRFQgY29tcGlsYXRpb24gdW5pdC4KLQkgKi8KLQlJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCdzIGFubm90YXRpb24gZm9ybWF0dGVyLiBUaGlzIGlzIHVzZWQgdG8gbWFrZSBhbnkKLQkgKiBtYW5pcHVsYXRlZCBhbm5vdGF0aW9ucyByZWFzb25hYmx5IHJlYWRhYmxlIGFmdGVyIGJlaW5nIHdyaXR0ZW4gdG8gdGhlCi0JICogSmF2YSBzb3VyY2UgZmlsZS4KLQkgKi8KLQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBnZXRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpOwotCi0JLyoqCi0JICogVGhpcyBhbGxvd3MgdGhlIHJlc291cmNlIG1vZGVsIHRvIG1vZGlmeSB0aGUgSmF2YSBzb3VyY2UgY29kZSBvbiB0aGUKLQkgKiBVSSB0aHJlYWQgd2hlbiBpdCBpcyBleGVjdXRpbmcgb24gYW5vdGhlciB0aHJlYWQuCi0JICovCi0JQ29tbWFuZEV4ZWN1dG9yIGdldE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCk7Ci0KLQkvKioKLQkgKiBSZXNvbHZlIHR5cGUgaW5mb3JtYXRpb24gdGhhdCBjb3VsZCBiZSBkZXBlbmRlbnQgb24gb3RoZXIgZmlsZXMgYmVpbmcKLQkgKiBhZGRlZC9yZW1vdmVkLgotCSAqLwotCXZvaWQgcmVzb2x2ZVR5cGVzKCk7Ci0KLQkvKioKLQkgKiBUaGUgcHJpbWFyeSB0eXBlIG9mIHRoZSBBU1QgY29tcGlsYXRpb24gdW5pdCwgY2FuIGJlIG51bGwuCi0JICogVGhpcyBpcyBuYW1lZCB0aGUgc2FtZSBhcyB0aGUgY29tcGlsYXRpb24gdW5pdC4KLQkgKi8KLQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgZ2V0UHJpbWFyeVR5cGUoKTsKLQotCS8qKgotCSAqIFNvbWV0aGluZyBpbiBKYXZhIGhhcyBjaGFuZ2VkICh0eXBpY2FsbHkgZWl0aGVyIHRoZSBjb21waWxhdGlvbiB1bml0J3MKLQkgKiBzb3VyY2UgY29kZSBvciB0aGUgSmF2YSBjbGFzc3BhdGgpOyBzeW5jaHJvbml6ZSB0aGUgY29tcGlsYXRpb24gdW5pdCdzCi0JICogc3RhdGUgd2l0aCB0aGUgSmF2YSBzb3VyY2UgY29kZSBldGMuCi0JICovCi0Jdm9pZCBzeW5jaHJvbml6ZVdpdGhKYXZhU291cmNlKCk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbiBBU1QgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0IHdpdGggaXRzIGJpbmRpbmdzIHJlc29sdmVkLgotCSAqLwotCUNvbXBpbGF0aW9uVW5pdCBidWlsZEFTVFJvb3QoKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlRW51bS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VFbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NGQ5NWEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VFbnVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhOwotCi0KLQotLyoqCi0gKiBKYXZhIHNvdXJjZSBjb2RlIG9yIGJpbmFyeSBlbnVtLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlRW51bQotCWV4dGVuZHMgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlCi17Ci0KLQotCS8vICoqKioqKioqKiogZW51bSBjb25zdGFudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbnVtJ3MgZW51bSBjb25zdGFudHMuCi0JICovCi0JSXRlcmFibGU8SmF2YVJlc291cmNlRW51bUNvbnN0YW50PiBnZXRFbnVtQ29uc3RhbnRzKCk7Ci0JCVN0cmluZyBFTlVNX0NPTlNUQU5UU19DT0xMRUNUSU9OID0gImVudW1Db25zdGFudHMiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUVudW1Db25zdGFudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcyYzRjNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUVudW1Db25zdGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBKYXZhIHNvdXJjZSBjb2RlIG9yIGJpbmFyeSBlbnVtIGNvbnN0YW50Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQKLQlleHRlbmRzIEphdmFSZXNvdXJjZU1lbWJlcgotewotCS8qKgotCSAqIFRoZSBKYXZhIHJlc291cmNlIGVudW0gY29uc3RhbnQncyBuYW1lIGRvZXMgbm90IGNoYW5nZS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUZpZWxkLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUZpZWxkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMTlmOTAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBKYXZhIHNvdXJjZSBjb2RlIG9yIGJpbmFyeSBmaWVsZAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlRmllbGQKLQlleHRlbmRzIEphdmFSZXNvdXJjZUF0dHJpYnV0ZQotewotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNZW1iZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlTWVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhY2JlZTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNZW1iZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotCi0vKioKLSAqIEphdmEgc291cmNlIGNvZGUgb3IgYmluYXJ5IHBlcnNpc3RlbnQgbWVtYmVyLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlTWVtYmVyCi0JZXh0ZW5kcyBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50Ci17Ci0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8vICoqKioqKioqKiogYW5ub3RhdGlvbnMgKioqKioqKioqKgotCQotCS8qKgotCSAqIFNldHMgdGhlIHNwZWNpZmllZCBwcmltYXJ5IGFubm90YXRpb24gYXMgdGhlIGZpcnN0IGFubm90YXRpb24sIGFuZCByZW1vdmVzIGFsbCBrbm93biAKLQkgKiBhbm5vdGF0aW9ucyAoaS5lLiBkb2VzIG5vdCByZW1vdmUgbm9uLXBlcnNpc3RlbmNlIGFubm90YXRpb25zKSB3aGljaCBhcmUgbm90IGluY2x1ZGVkCi0JICogaW4gdGhlIHN1cHBvcnRpbmcgYW5ub3RhdGlvbnMuCi0JICovCi0JQW5ub3RhdGlvbiBzZXRQcmltYXJ5QW5ub3RhdGlvbihTdHJpbmcgcHJpbWFyeUFubm90YXRpb25OYW1lLCBJdGVyYWJsZTxTdHJpbmc+IHN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMpOwotCi0KLQotCS8vICoqKioqKioqKiogbW9kaWZpZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtZW1iZXIgaXMgZmluYWwuCi0JICovCi0JYm9vbGVhbiBpc0ZpbmFsKCk7Ci0JCVN0cmluZyBGSU5BTF9QUk9QRVJUWSA9ICJmaW5hbCI7IC8vJE5PTi1OTFMtMSQKLQotCWJvb2xlYW4gaXNUcmFuc2llbnQoKTsKLQkJU3RyaW5nIFRSQU5TSUVOVF9QUk9QRVJUWSA9ICJ0cmFuc2llbnQiOyAvLyROT04tTkxTLTEkCi0KLQlib29sZWFuIGlzUHVibGljKCk7Ci0JCVN0cmluZyBQVUJMSUNfUFJPUEVSVFkgPSAicHVibGljIjsgLy8kTk9OLU5MUy0xJAotCi0JYm9vbGVhbiBpc1N0YXRpYygpOwotCQlTdHJpbmcgU1RBVElDX1BST1BFUlRZID0gInN0YXRpYyI7IC8vJE5PTi1OTFMtMSQKLQotCWJvb2xlYW4gaXNQcm90ZWN0ZWQoKTsKLQkJU3RyaW5nIFBST1RFQ1RFRF9QUk9QRVJUWSA9ICJwcm90ZWN0ZWQiOyAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgSmF2YSByZXNvdXJjZSBtZW1iZXIgaXMgZm9yIHRoZSBzcGVjaWZpZWQKLQkgKiBtZW1iZXIuCi0JICovCi0JYm9vbGVhbiBpc0ZvcihTdHJpbmcgbWVtYmVyTmFtZSwgaW50IG9jY3VycmVuY2UpOwotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXNvbHZlIHR5cGUgaW5mb3JtYXRpb24gdGhhdCBjb3VsZCBiZSBkZXBlbmRlbnQgb24gY2hhbmdlcyBlbHNld2hlcmUKLQkgKiBpbiB0aGUgd29ya3NwYWNlLgotCSAqLwotCXZvaWQgcmVzb2x2ZVR5cGVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBKYXZhIHJlc291cmNlIG1lbWJlciBpcyBwdWJsaWMgb3IgcHJvdGVjdGVkCi0JICovCi0JYm9vbGVhbiBpc1B1YmxpY09yUHJvdGVjdGVkKCk7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZU1ldGhvZC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxYTVjMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZU1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuTWV0aG9kU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIEphdmEgc291cmNlIGNvZGUgb3IgYmluYXJ5IG1ldGhvZAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlTWV0aG9kCi0JCWV4dGVuZHMgSmF2YVJlc291cmNlQXR0cmlidXRlIHsKLQkKLQkvLyAqKioqKiBtZXRob2QgbmFtZSAqKioqKgotCQotCS8qKgotCSAqIFRoZSBKYXZhIHJlc291cmNlIG1ldGhvZCdzIG5hbWUgZG9lcyBub3QgY2hhbmdlLgotCSAqLwotCVN0cmluZyBnZXRNZXRob2ROYW1lKCk7Ci0JCi0JCi0JLy8gKioqKiogcGFyYW1ldGVyIHR5cGUgbmFtZXMgKioqKioKLQkKLQlTdHJpbmcgUEFSQU1FVEVSX1RZUEVfTkFNRVNfTElTVCA9ICJwYXJhbWV0ZXJUeXBlTmFtZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0UGFyYW1ldGVyVHlwZU5hbWVzKCk7Ci0JCQotCVN0cmluZyBnZXRQYXJhbWV0ZXJUeXBlTmFtZShpbnQgaW5kZXgpOwotCQotCWludCBnZXRQYXJhbWV0ZXJzU2l6ZSgpOwotCQotCQotCS8vICoqKioqIGNvbnN0cnVjdG9yICoqKioqCi0JCi0JU3RyaW5nIENPTlNUUlVDVE9SX1BST1BFUlRZID0gImNvbnN0cnVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCQotCWJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpOwotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgSmF2YSByZXNvdXJjZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBpcyBmb3IgdGhlIHNwZWNpZmllZAotCSAqIG1ldGhvZC4KLQkgKi8KLQlib29sZWFuIGlzRm9yKE1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUsIGludCBvY2N1cnJlbmNlKTsKLQotCS8qKgotCSAqIENhbGwgdGhpcyBpbnN0ZWFkIG9mIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0KQotCSAqIFRPRE8gcmVtb3ZlIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0KSBmcm9tIHRoZSBoaWVyYXJjaHkKLQkgKi8KLQl2b2lkIGluaXRpYWxpemUoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pOwotCi0JLyoqCi0JICogQ2FsbCB0aGlzIGluc3RlYWQgb2Ygc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCkKLQkgKiBUT0RPIHJlbW92ZSBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0KSBmcm9tIHRoZSBoaWVyYXJjaHkKLQkgKi8KLQl2b2lkIHN5bmNocm9uaXplV2l0aChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbik7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZU5vZGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWU0NDZlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIEphdmEgcmVzb3VyY2Ugbm9kZXMgKHNvdXJjZSBjb2RlIG9yIGJpbmFyeSkuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVzb3VyY2VOb2RlCi0JZXh0ZW5kcyBNb2RlbAotewotCS8qKgotCSAqIFJldHVybiB0aGUgbm9kZSdzIHBhcmVudCBub2RlLgotCSAqLwotCUphdmFSZXNvdXJjZU5vZGUgZ2V0UGFyZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEVjbGlwc2UgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBKYXZhIHJlc291cmNlIG5vZGUKLQkgKiAodHlwaWNhbGx5IGVpdGhlciBhIEphdmEgc291cmNlIGNvZGUgZmlsZSBvciBhIEpBUikuCi0JICovCi0JSUZpbGUgZ2V0RmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByb290IG9mIHRoZSBKYXZhIHJlc291cmNlIGNvbnRhaW5tZW50IGhpZXJhcmNoeQotCSAqICh0eXBpY2FsbHkgZWl0aGVyIGEgY29tcGlsYXRpb24gdW5pdCBvciBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCkuCi0JICovCi0JUm9vdCBnZXRSb290KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFtzb3VyY2VdIG5vZGUncyByb290ICh0aGUgY29tcGlsYXRpb24gdW5pdCkuCi0JICovCi0JLy8gVE9ETyBnZXQgcmlkIG9mIHRoaXMgbWV0aG9kLi4uPwotCUphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBnZXRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgW3NvdXJjZV0gbm9kZSdzIHRleHQgcmFuZ2UgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQncyBmaWxlLgotCSAqLwotCVRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgW3NvdXJjZV0gbm9kZSBmcm9tIHRoZSBzcGVjaWZpZWQgQVNULgotCSAqLwotCXZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSB0aGUgW3NvdXJjZV0gbm9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgQVNULgotCSAqLwotCXZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCi0JLyoqCi0JICogUm9vdCBvZiBKYXZhIHJlc291cmNlIG1vZGVsIGNvbnRhaW5tZW50IGhpZXJhcmNoeS4KLQkgKi8KLQlpbnRlcmZhY2UgUm9vdAotCQkJZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlLCBKcHRSZXNvdXJjZU1vZGVsIHsKLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHJvb3QncyBKYXZhIHJlc291cmNlICJhYnN0cmFjdCIgdHlwZXMuCi0JCSAqLwotCQlJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+IGdldFR5cGVzKCk7Ci0JCQlTdHJpbmcgVFlQRVNfQ09MTEVDVElPTiA9ICJ0eXBlcyI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qKgotCQkgKiBDYWxsZWQgKHZpYSBhIGhvb2sgaW4gY2hhbmdlIG5vdGlmaWNhdGlvbikgd2hlbmV2ZXIgYW55dGhpbmcgaW4gdGhlCi0JCSAqIEphdmEgcmVzb3VyY2UgbW9kZWwgY2hhbmdlcy4gRm9yd2FyZGVkIHRvIGxpc3RlbmVycy4KLQkJICovCi0JCXZvaWQgcmVzb3VyY2VNb2RlbENoYW5nZWQoKTsKLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGFubm90YXRpb24gcHJvdmlkZXIgdGhhdCBzdXBwbGllcyB0aGUgYW5ub3RhdGlvbnMgZm91bmQKLQkJICogaW4gdGhlIEphdmEgcmVzb3VyY2UgbW9kZWwuCi0JCSAqLwotCQlBbm5vdGF0aW9uUHJvdmlkZXIgZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQYWNrYWdlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcxYjk1MS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICogQ29weXJpZ2h0IChjKSAyMDEwIFJlZCBIYXQsIEluYy4KLSAgKiBEaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlIGJ5IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgKiBUaGlzIHByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwKLSAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICoKLSAgKiBDb250cmlidXRvcjoKLSAgKiAgICAgUmVkIEhhdCwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIEBhdXRob3IgRG1pdHJ5IEdlcmFza292Ci0gKgotICogSmF2YSBzb3VyY2UgY29kZSBvZiBwYWNrYWdlLWluZm8KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlUGFja2FnZQotCQlleHRlbmRzIEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgewotCQotCS8qKgotCSAqIFRoZSBKYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgcGFja2FnZSdzIG5hbWUuCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3Y2ViMjcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuQW5ub3RhdGlvblByb3ZpZGVyOwotCi0KLQotLyoqCi0gKiBKYXZhIHBhY2thZ2UgZnJhZ21lbnQKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudAotCWV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQotewotCS8qKgotCSAqIFJldHVybiB0aGUgcGFja2FnZSBmcmFnbWVudCdzIGNsYXNzIGZpbGVzIHRoYXQgY29udGFpbiAiYW5ub3RhdGVkIiB0eXBlcy4KLQkgKiBBbm5vdGF0ZWQgd2l0aCB0aGUgYW5ub3RhdGlvbnMgd2UgY2FyZSBhYm91dCwgCi0JICogQHNlZSBBbm5vdGF0aW9uUHJvdmlkZXIKLQkgKi8KLQlJdGVyYWJsZTxKYXZhUmVzb3VyY2VDbGFzc0ZpbGU+IGdldENsYXNzRmlsZXMoKTsKLQkJU3RyaW5nIENMQVNTX0ZJTEVTX0NPTExFQ1RJT04gPSAiY2xhc3NGaWxlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgcGFja2FnZSBmcmFnbWVudCdzIGNsYXNzIGZpbGVzLgotCSAqLwotCWludCBnZXRDbGFzc0ZpbGVzU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYWNrYWdlIGZyYWdtZW50J3MgSmF2YSB0eXBlcy4KLQkgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgSmF2YVJlc291cmNlVHlwZXMgb2YgdGhlIGNsYXNzRmlsZXMuCi0JICovCi0JSXRlcmFibGU8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPiBnZXRUeXBlcygpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjA4MmM2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YTsKLQotCi0vKioKLSAqIEphdmEgcGFja2FnZSBmcmFnZW1lbnQgcm9vdAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdAotCWV4dGVuZHMgSmF2YVJlc291cmNlTm9kZS5Sb290Ci17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QncyBwYWNrYWdlIGZyYWdtZW50cy4KLQkgKi8KLQlJdGVyYWJsZTxKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnQ+IGdldFBhY2thZ2VGcmFnbWVudHMoKTsKLQkJU3RyaW5nIFBBQ0tBR0VfRlJBR01FTlRTX0NPTExFQ1RJT04gPSAicGFja2FnZUZyYWdtZW50cyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgcGFja2FnZSBmcmFnbWVudCByb290J3MgcGFja2FnZSBmcmFnbWVudHMuCi0JICovCi0JaW50IGdldFBhY2thZ2VGcmFnbWVudHNTaXplKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGFja2FnZUluZm9Db21waWxhdGlvblVuaXQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGFja2FnZUluZm9Db21waWxhdGlvblVuaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3MTYxNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBhY2thZ2VJbmZvQ29tcGlsYXRpb25Vbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIERhbGkgcmVzb3VyY2UgZm9yIEpEVCBjb21waWxhdGlvbiB1bml0IG5hbWVkIHBhY2thZ2UtaW5mby5qYXZhLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlUGFja2FnZUluZm9Db21waWxhdGlvblVuaXQKLQlleHRlbmRzIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdAotewotCUphdmFSZXNvdXJjZVBhY2thZ2UgZ2V0UGFja2FnZSgpOwotCQlTdHJpbmcgUEFDS0FHRSA9ICJwYWNrYWdlIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVR5cGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGYyMzcxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLQotLyoqCi0gKiBKYXZhIHNvdXJjZSBjb2RlIG9yIGJpbmFyeSBjbGFzcyBvciBpbnRlcmZhY2UuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVzb3VyY2VUeXBlCi0JZXh0ZW5kcyBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUKLXsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHR5cGUncyBzdXBlcmNsYXNzLgotCSAqLwotCVN0cmluZyBnZXRTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSgpOwotCQlTdHJpbmcgU1VQRVJDTEFTU19RVUFMSUZJRURfTkFNRV9QUk9QRVJUWSA9ICJzdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGlzIGFic3RyYWN0LgotCSAqLwotCWJvb2xlYW4gaXNBYnN0cmFjdCgpOwotCQlTdHJpbmcgQUJTVFJBQ1RfUFJPUEVSVFkgPSAiYWJzdHJhY3QiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBoYXMgYSBuby1hcmcgY29uc3RydWN0b3IgKHByaXZhdGUsIHByb3RlY3RlZCwgb3IgcHVibGljKQotCSAqLwotCWJvb2xlYW4gaGFzTm9BcmdDb25zdHJ1Y3RvcigpOwotCQlTdHJpbmcgTk9fQVJHX0NPTlNUUlVDVE9SX1BST1BFUlRZID0gIm5vQXJnQ29uc3RydWN0b3IiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBoYXMgYSBwcml2YXRlIG5vLWFyZyBjb25zdHJ1Y3RvcgotCSAqLwotCWJvb2xlYW4gaGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3IoKTsKLQkJU3RyaW5nIFBSSVZBVEVfTk9fQVJHX0NPTlNUUlVDVE9SX1BST1BFUlRZID0gInByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGhhcyBhIHB1YmxpYyBvciBwcm90ZWN0ZWQgbm8tYXJnIGNvbnN0cnVjdG9yCi0JICogPGVtPm9yPC9lbT4gb25seSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlib29sZWFuIGhhc1B1YmxpY09yUHJvdGVjdGVkTm9BcmdDb25zdHJ1Y3RvcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgaGFzIGEgcHVibGljIG5vLWFyZyBjb25zdHJ1Y3RvcgotCSAqIDxlbT5vcjwvZW0+IG9ubHkgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JYm9vbGVhbiBoYXNQdWJsaWNOb0FyZ0NvbnN0cnVjdG9yKCk7Ci0JCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGhhcyBhbnkgZmllbGQgdGhhdCBoYXZlIHJlbGV2YW50IGFubm90YXRpb25zCi0JICogb24gdGhlbSAod2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5mZXIgdGhlIHR5cGUncyBhY2Nlc3MgdHlwZSkuCi0JICovCi0JYm9vbGVhbiBoYXNBbnlBbm5vdGF0ZWRGaWVsZHMoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGhhcyBhbnkgZmllbGQgdGhhdCBoYXZlIHJlbGV2YW50IGFubm90YXRpb25zCi0JICogb24gdGhlbSAod2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5mZXIgdGhlIHR5cGUncyBhY2Nlc3MgdHlwZSkuCi0JICovCi0JYm9vbGVhbiBoYXNBbnlBbm5vdGF0ZWRNZXRob2RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBvdmVycmlkZXMgdGhlCi0JICoge0BsaW5rIE9iamVjdCNlcXVhbHMoT2JqZWN0KX0gbWV0aG9kLgotCSAqLwotCWJvb2xlYW4gaGFzRXF1YWxzTWV0aG9kKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgb3ZlcnJpZGVzIHRoZQotCSAqIHtAbGluayBPYmplY3QjaGFzaENvZGUoKX0gbWV0aG9kLgotCSAqLwotCWJvb2xlYW4gaGFzSGFzaENvZGVNZXRob2QoKTsKLQotCS8vICoqKioqKioqKiogZmllbGRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSdzIGZpZWxkcy4KLQkgKi8KLQlJdGVyYWJsZTxKYXZhUmVzb3VyY2VGaWVsZD4gZ2V0RmllbGRzKCk7Ci0JCVN0cmluZyBGSUVMRFNfQ09MTEVDVElPTiA9ICJmaWVsZHMiOyAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUncyBtZXRob2RzLiBUaGlzIHJldHVybnMgKmFsbCogbWV0aG9kcyBmcm9tIHRoZSBKRFQgVHlwZQotCSAqLwotCUl0ZXJhYmxlPEphdmFSZXNvdXJjZU1ldGhvZD4gZ2V0TWV0aG9kcygpOwotCQlTdHJpbmcgTUVUSE9EU19DT0xMRUNUSU9OID0gIm1ldGhvZHMiOyAvLyROT04tTkxTLTEkCi0KLQlKYXZhUmVzb3VyY2VNZXRob2QgZ2V0TWV0aG9kKFN0cmluZyBuYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlVHlwZUNhY2hlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVR5cGVDYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWQ1ZTdlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlVHlwZUNhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci0KLS8qKgotICogSmF2YSBwZXJzaXN0ZW50IHR5cGUgY2FjaGUgLSB1c2VkIHRvIGhvbGQgImV4dGVybmFsIiB0eXBlcwotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlVHlwZUNhY2hlCi0JZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlLlJvb3QKLXsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUncyB0eXBlcy4KLQkgKi8KLQlpbnQgZ2V0VHlwZXNTaXplKCk7Ci0KLQkvKioKLQkgKiBBZGQgYSBKYXZhIHJlc291cmNlIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgSkRUIHR5cGUgdG8gdGhlCi0JICogY2FjaGUuIFJldHVybiB0aGUgbmV3IHR5cGUuCi0JICovCi0JSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGFkZFR5cGUoSVR5cGUgamR0VHlwZSk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSB0eXBlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBKQVIgZmlsZS4KLQkgKiBSZXR1cm4gd2hldGhlciBhbnkgdHlwZXMgd2VyZSByZW1vdmVkLgotCSAqLwotCWJvb2xlYW4gcmVtb3ZlVHlwZXMoSUZpbGUgamFyRmlsZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVBbm5vdGF0aW9uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGQzNjRiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgZGVhbGluZyB3aXRoIGFubm90YXRpb25zIHRoYXQgY2FuIGJlICJuZXN0ZWQiIHdpdGhpbiBvdGhlcgotICogYW5ub3RhdGlvbnMsIHR5cGljYWxseSB3aXRoaW4gYXJyYXlzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmVzdGFibGVBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQW5ub3RhdGlvbiB7Ci0JCi0JLyoqCi0JICogTW92ZSB0aGUgYW5ub3RhdGlvbiB0byB0aGUgc3BlY2lmaWVkIGluZGV4IHdpdGhpbiBpdHMgY29udGFpbmVyIGFubm90YXRpb24uCi0JICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgYW5ub3RhdGlvbiBpcyBhY3R1YWxseSBuZXN0ZWQuCi0JICovCi0Jdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgaW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI5Nzg0Zi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLQotLyoqCi0gKiBVc2VkIHRvIGJ1aWxkIE5lc3RhYmxlQW5ub3RhdGlvbnMgZGlzY292ZXJlZCBpbiB0aGUgSmF2YSBzb3VyY2UgY29kZS4KLSAqIFRvIHByb3ZpZGUgbmV3IE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zLCBjcmVhdGUgYSBuZXcgSmF4YlBsYXRmb3JtCi0gKiBieSBpbXBsZW1lbnRpbmcgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbi4KLSAqIAotICogQHNlZSBOZXN0YWJsZUFubm90YXRpb24KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uIHRoZSBkZWZpbml0aW9uIHdpbGwgYnVpbGQgaW4gdGhlCi0JICogdmFyaW91cyAjYnVpbGQuLi4oLi4uKSBtZXRob2RzLgotCSAqLwotCVN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCk7Ci0KLQlTdHJpbmcgZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWUoKTsKLQotCVN0cmluZyBnZXRFbGVtZW50TmFtZSgpOwotCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhbiBhbm5vdGF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGFubm90YXRlZCBlbGVtZW50LgotCSAqLwotCU5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYW4gYW5ub3RhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBKRFQgYW5ub3RhdGlvbgotCSAqIG9uIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGVkIGVsZW1lbnQuCi0JICovCi0JTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbiwgaW50IGluZGV4KTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvQWJzdHJhY3RUZXh0UmFuZ2UuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvQWJzdHJhY3RUZXh0UmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2ZTY1My4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L0Fic3RyYWN0VGV4dFJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuU2ltcGxlVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBQYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHRleHQgcmFuZ2UuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUZXh0UmFuZ2UKLQlpbXBsZW1lbnRzIFRleHRSYW5nZQotewotCXByb3RlY3RlZCBBYnN0cmFjdFRleHRSYW5nZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlcyhpbnQgaW5kZXgpIHsKLQkJcmV0dXJuICh0aGlzLmdldE9mZnNldCgpIDw9IGluZGV4KSAmJiAoaW5kZXggPCB0aGlzLmdldEVuZCgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0b3VjaGVzKGludCBpbmRleCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0T2Zmc2V0KCkgPD0gaW5kZXgpICYmIChpbmRleCA8PSB0aGlzLmdldEVuZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZW5kIG9mZnNldCBpcyA8ZW0+ZXhjbHVzaXZlPC9lbT4sIGkuZS4gdGhlIGVsZW1lbnQgYXQgdGhlIGVuZCBvZmZzZXQKLQkgKiBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHJhbmdlLgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPZmZzZXQoKSArIHRoaXMuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBidWlsZFRleHRSYW5nZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgbGluZU51bWJlcikgewotCQlyZXR1cm4gKChvZmZzZXQgPT0gdGhpcy5nZXRPZmZzZXQoKSkgJiYKLQkJCQkobGVuZ3RoID09IHRoaXMuZ2V0TGVuZ3RoKCkpICYmCi0JCQkJKGxpbmVOdW1iZXIgPT0gdGhpcy5nZXRMaW5lTnVtYmVyKCkpKSA/Ci0JCQkJCXRoaXMgOgotCQkJCQluZXcgU2ltcGxlVGV4dFJhbmdlKG9mZnNldCwgbGVuZ3RoLCBsaW5lTnVtYmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKCAhIChvIGluc3RhbmNlb2YgVGV4dFJhbmdlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVRleHRSYW5nZSBvdGhlciA9IChUZXh0UmFuZ2UpIG87Ci0JCXJldHVybiAob3RoZXIuZ2V0T2Zmc2V0KCkgPT0gdGhpcy5nZXRPZmZzZXQoKSkKLQkJCQkmJiAob3RoZXIuZ2V0TGVuZ3RoKCkgPT0gdGhpcy5nZXRMZW5ndGgoKSkKLQkJCQkmJiAob3RoZXIuZ2V0TGluZU51bWJlcigpID09IHRoaXMuZ2V0TGluZU51bWJlcigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPZmZzZXQoKSBeIHRoaXMuZ2V0TGVuZ3RoKCkgXiB0aGlzLmdldExpbmVOdW1iZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgc3RhcnQgPSBTdHJpbmcudmFsdWVPZih0aGlzLmdldE9mZnNldCgpKTsKLQkJU3RyaW5nIGVuZCA9IFN0cmluZy52YWx1ZU9mKHRoaXMuZ2V0RW5kKCkpOwotCQlTdHJpbmcgbGluZSA9IFN0cmluZy52YWx1ZU9mKHRoaXMuZ2V0TGluZU51bWJlcigpKTsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgc3RhcnQgKyAiLCAiICsgZW5kICsgIiBbIiArIGxpbmUgKyAnXScpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L0JvZHlTb3VyY2VXcml0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvQm9keVNvdXJjZVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWFiZWViLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvQm9keVNvdXJjZVdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5JbmRlbnRpbmdQcmludFdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgSW5kZW50aW5nUHJpbnRXcml0ZXJ9IHdpdGggc29tZSBtZXRob2RzIHRoYXQgZmFjaWxpdGF0ZQotICogYnVpbGRpbmcgY2xhc3Mgc291cmNlIGNvZGUuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEJvZHlTb3VyY2VXcml0ZXIKLQlleHRlbmRzIEluZGVudGluZ1ByaW50V3JpdGVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZTsKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGNsYXNzTmFtZTsKLQkvLyBrZXkgPSBzaG9ydCBjbGFzcyBuYW1lOyB2YWx1ZSA9IGltcG9ydCBwYWNrYWdlCi0JcHJvdGVjdGVkIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPiBpbXBvcnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPigpOwotCi0JcHVibGljIEJvZHlTb3VyY2VXcml0ZXIoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXN1cGVyKG5ldyBTdHJpbmdXcml0ZXIoMjAwMCkpOwotCQl0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0JCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5vdXQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuICgoU3RyaW5nV3JpdGVyKSB0aGlzLm91dCkuZ2V0QnVmZmVyKCkubGVuZ3RoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbnRWaXNpYmlsaXR5KFN0cmluZyB2aXNpYmlsaXR5TW9kaWZpZXIpIHsKLQkJaWYgKHZpc2liaWxpdHlNb2RpZmllci5sZW5ndGgoKSAhPSAwKSB7Ci0JCQl0aGlzLnByaW50KHZpc2liaWxpdHlNb2RpZmllcik7Ci0JCQl0aGlzLnByaW50KCcgJyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXRoaXMucHJpbnQoJ0AnKTsKLQkJdGhpcy5wcmludFR5cGVEZWNsYXJhdGlvbihhbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbnRUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQl0aGlzLnByaW50KHRoaXMuYnVpbGRJbXBvcnRlZFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmludEZpZWxkKFN0cmluZyBmaWVsZE5hbWUsIFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIFN0cmluZyB2aXNpYmlsaXR5KSB7Ci0JCXRoaXMucHJpbnRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotCQl0aGlzLnByaW50VHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7Ci0JCXRoaXMucHJpbnQoJyAnKTsKLQkJdGhpcy5wcmludChmaWVsZE5hbWUpOwotCQl0aGlzLnByaW50KCc7Jyk7Ci0JCXRoaXMucHJpbnRsbigpOwotCQl0aGlzLnByaW50bG4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmludFBhcmFtZXRlcml6ZWRGaWVsZChTdHJpbmcgZmllbGROYW1lLCBTdHJpbmcgdHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgcGFyYW1ldGVyVHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgdmlzaWJpbGl0eSkgewotCQl0aGlzLnByaW50VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLQkJdGhpcy5wcmludFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCQl0aGlzLnByaW50KCc8Jyk7Ci0JCXRoaXMucHJpbnRUeXBlRGVjbGFyYXRpb24ocGFyYW1ldGVyVHlwZURlY2xhcmF0aW9uKTsKLQkJdGhpcy5wcmludCgnPicpOwotCQl0aGlzLnByaW50KCcgJyk7Ci0JCXRoaXMucHJpbnQoZmllbGROYW1lKTsKLQkJdGhpcy5wcmludCgnOycpOwotCQl0aGlzLnByaW50bG4oKTsKLQkJdGhpcy5wcmludGxuKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byBhIDxlbT5TdHJpbmcgTGl0ZXJhbDwvZW0+IGFuZCBwcmludCBpdCwKLQkgKiBhZGRpbmcgdGhlIHN1cnJvdW5kaW5nIGRvdWJsZS1xdW90ZXMgYW5kIGVzY2FwaW5nIGNoYXJhY3RlcnMKLQkgKiBhcyBuZWNlc3NhcnkuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRTdHJpbmdMaXRlcmFsKFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihzdHJpbmcsIHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbXBvcnRzICoqKioqKioqKioKLQotCS8vICoqKioqIHdyaXRpbmcKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBjbGFzcydzICJpbXBvcnRlZCIgbmFtZS4KLQkgKiBUaGUgY2xhc3MgZGVjbGFyYXRpb24gbXVzdCBiZSBvZiB0aGUgZm9ybToKLQkgKiAgICAgImludCIKLQkgKiAgICAgImludFtdIiAobm90ICJbSSIpCi0JICogICAgICJqYXZhLmxhbmcuT2JqZWN0IgotCSAqICAgICAiamF2YS5sYW5nLk9iamVjdFtdIiAobm90ICJbTGphdmEubGFuZy5PYmplY3Q7IikKLQkgKiAgICAgImphdmEudXRpbC5NYXAuRW50cnkiIChub3QgImphdmEudXRpbC5NYXAkRW50cnkiKQotCSAqICAgICAiamF2YS51dGlsLk1hcC5FbnRyeVtdW10iIChub3QgIltbTGphdmEudXRpbC5NYXAkRW50cnk7IikKLQkgKiAgICAgCi0JICogVG8gcmVhbGx5IGRvIHRoaXMgcmlnaHQsIHdlIHdvdWxkIG5lZWQgdG8gZ2F0aGVyIGFsbCB0aGUgdHlwZXMgZnJvbQotCSAqIHRoZSAidW5hbWVkIiAoZGVmYXVsdCkgcGFja2FnZSB0aGF0IHdlcmUgcmVmZXJlbmNlZCBpbiB0aGUKLQkgKiBjb21waWxhdGlvbiB1bml0IGJlZm9yZWhhbmQuICpBbnkqIGNvbGxpc2lvbnMgd2l0aCBvbmUgb2YgdGhlc2UKLQkgKiB0eXBlcyB3b3VsZCBoYXZlIHRvIGJlIGZ1bGx5IHF1YWxpZmllZCAod2hldGhlciBpdCB3YXMgZnJvbQotCSAqICdqYXZhLmxhbmcnIG9yIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdCkuCi0JICogSW4gb3RoZXIgd29yZHMsIGlmIHdlIGhhdmUgYW55IHR5cGVzIGZyb20gdGhlICJ1bm5hbWVkIiBwYWNrYWdlLAotCSAqIHJlc3VsdHMgYXJlIHVucHJlZGljdGFibGUuLi4uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZEltcG9ydGVkVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJaWYgKHRoaXMudHlwZURlY2xhcmF0aW9uSXNNZW1iZXJDbGFzcyh0eXBlRGVjbGFyYXRpb24pKSB7Ci0JCQkvLyBubyBuZWVkIGZvciBhbiBpbXBvcnQsIGp1c3QgcmV0dXJuIHRoZSBwYXJ0aWFsbHktcXVhbGlmaWVkIG5hbWUKLQkJCXJldHVybiB0aGlzLmJ1aWxkTWVtYmVyQ2xhc3NUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLQkJfQotCQlpbnQgbGFzdCA9IHR5cGVEZWNsYXJhdGlvbi5sYXN0SW5kZXhPZignLicpOwotCQlTdHJpbmcgY3VycmVudFBhY2thZ2VOYW1lID0gKGxhc3QgPT0gLTEpID8gIiIgOiB0eXBlRGVjbGFyYXRpb24uc3Vic3RyaW5nKDAsIGxhc3QpOwotCQlTdHJpbmcgc2hvcnRUeXBlRGVjbGFyYXRpb24gPSB0eXBlRGVjbGFyYXRpb24uc3Vic3RyaW5nKGxhc3QgKyAxKTsKLQkJU3RyaW5nIHNob3J0RWxlbWVudFR5cGVOYW1lID0gc2hvcnRUeXBlRGVjbGFyYXRpb247Ci0JCXdoaWxlIChzaG9ydEVsZW1lbnRUeXBlTmFtZS5lbmRzV2l0aCgiW10iKSkgewotCQkJc2hvcnRFbGVtZW50VHlwZU5hbWUgPSBzaG9ydEVsZW1lbnRUeXBlTmFtZS5zdWJzdHJpbmcoMCwgc2hvcnRFbGVtZW50VHlwZU5hbWUubGVuZ3RoKCkgLSAyKTsKLQkJfQotCQlJbXBvcnRQYWNrYWdlIHByZXYgPSB0aGlzLmltcG9ydHMuZ2V0KHNob3J0RWxlbWVudFR5cGVOYW1lKTsKLQkJaWYgKHByZXYgPT0gbnVsbCkgewotCQkJLy8gdGhpcyBpcyB0aGUgZmlyc3QgY2xhc3Mgd2l0aCB0aGlzIHNob3J0IGVsZW1lbnQgdHlwZSBuYW1lCi0JCQl0aGlzLmltcG9ydHMucHV0KHNob3J0RWxlbWVudFR5cGVOYW1lLCBuZXcgSW1wb3J0UGFja2FnZShjdXJyZW50UGFja2FnZU5hbWUpKTsKLQkJCXJldHVybiBzaG9ydFR5cGVEZWNsYXJhdGlvbjsKLQkJfQotCQlpZiAocHJldi5wYWNrYWdlTmFtZS5lcXVhbHMoY3VycmVudFBhY2thZ2VOYW1lKSkgewotCQkJLy8gdGhpcyBlbGVtZW50IHR5cGUgaGFzIGFscmVhZHkgYmVlbiBpbXBvcnRlZAotCQkJcmV0dXJuIHNob3J0VHlwZURlY2xhcmF0aW9uOwotCQl9Ci0JCWlmIChjdXJyZW50UGFja2FnZU5hbWUuZXF1YWxzKHRoaXMucGFja2FnZU5hbWUpICYmCi0JCQkJcHJldi5wYWNrYWdlTmFtZS5lcXVhbHMoImphdmEubGFuZyIpKSB7Ci0JCQkvLyB3ZSBmb3JjZSB0aGUgJ2phdmEubGFuZycgY2xhc3MgdG8gYmUgZXhwbGljaXRseSBpbXBvcnRlZAotCQkJcHJldi5jb2xsaXNpb24gPSB0cnVlOwotCQl9Ci0JCS8vIGFub3RoZXIgY2xhc3Mgd2l0aCB0aGUgc2FtZSBzaG9ydCBlbGVtZW50IHR5cGUgbmFtZSBoYXMgYmVlbgotCQkvLyBwcmV2aW91c2x5IGltcG9ydGVkLCBzbyB0aGlzIG9uZSBtdXN0IGJlIHVzZWQgZnVsbHktcXVhbGlmaWVkCi0JCXJldHVybiB0eXBlRGVjbGFyYXRpb247Ci0JfQotCi0JLyoqCi0JICogZS5nLiAiZm9vLmJhci5FbXBsb3llZS5QSyIgd2lsbCByZXR1cm4gdHJ1ZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHR5cGVEZWNsYXJhdGlvbklzTWVtYmVyQ2xhc3MoU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQlyZXR1cm4gKHR5cGVEZWNsYXJhdGlvbi5sZW5ndGgoKSA+IHRoaXMuY2xhc3NOYW1lLmxlbmd0aCgpKQotCQkJCSYmIHR5cGVEZWNsYXJhdGlvbi5zdGFydHNXaXRoKHRoaXMuY2xhc3NOYW1lKQotCQkJCSYmICh0eXBlRGVjbGFyYXRpb24uY2hhckF0KHRoaXMuY2xhc3NOYW1lLmxlbmd0aCgpKSA9PSAnLicpOwotCX0KLQotCS8qKgotCSAqIGUuZy4gImZvby5iYXIuRW1wbG95ZWUuUEsiIHdpbGwgcmV0dXJuICJFbXBsb3llZS5QSyIKLQkgKiB0aGlzIHByZXZlbnRzIGNvbGxpc2lvbnMgd2l0aCBvdGhlciBpbXBvcnRlZCBjbGFzc2VzIChlLmcuICJqb28uamFyLlBLIikKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkTWVtYmVyQ2xhc3NUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQlpbnQgaW5kZXggPSB0aGlzLnBhY2thZ2VOYW1lLmxlbmd0aCgpOwotCQlpZiAoaW5kZXggIT0gMCkgewotCQkJaW5kZXgrKzsgIC8vIGJ1bXAgcGFzdCB0aGUgJy4nCi0JCX0KLQkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbi5zdWJzdHJpbmcoaW5kZXgpOwotCX0KLQotCS8vICoqKioqIHJlYWRpbmcKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRJbXBvcnRzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTb3J0ZWRSZXF1aXJlZEltcG9ydHMoKTsKLQl9Ci0KLQkvKioKLQkgKiB0cmFuc2Zvcm0gb3VyIG1hcCBlbnRyaWVzIHRvIGNsYXNzIG5hbWVzCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U29ydGVkUmVxdWlyZWRJbXBvcnRzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8TWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4sIFN0cmluZz4odGhpcy5nZXRTb3J0ZWRSZXF1aXJlZEltcG9ydEVudHJpZXMoKSwgdGhpcy5idWlsZEltcG9ydEVudHJpZXNUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNmb3JtZXI8TWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4sIFN0cmluZz4gYnVpbGRJbXBvcnRFbnRyaWVzVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBJTVBPUlRfRU5UUklFU19UUkFOU0ZPUk1FUjsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRyYW5zZm9ybWVyPE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+LCBTdHJpbmc+IElNUE9SVF9FTlRSSUVTX1RSQU5TRk9STUVSID0gbmV3IEltcG9ydEVudHJpZXNUcmFuc2Zvcm1lcigpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBJbXBvcnRFbnRyaWVzVHJhbnNmb3JtZXIKLQkJaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxNYXAuRW50cnk8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPiwgU3RyaW5nPgotCXsKLQkJcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oRW50cnk8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPiBpbXBvcnRFbnRyeSkgewotCQkJU3RyaW5nIHBrZyA9IGltcG9ydEVudHJ5LmdldFZhbHVlKCkucGFja2FnZU5hbWU7Ci0JCQlTdHJpbmcgdHlwZSA9IGltcG9ydEVudHJ5LmdldEtleSgpOwotCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHBrZy5sZW5ndGgoKSArIDEgKyB0eXBlLmxlbmd0aCgpKTsKLQkJCXNiLmFwcGVuZChwa2cpOwotCQkJc2IuYXBwZW5kKCcuJyk7Ci0JCQlzYi5hcHBlbmQodHlwZSk7Ci0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHNvcnQgYnkgcGFja2FnZSBmaXJzdCwgdGhlbiBjbGFzcyAoKm5vdCogYnkgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUpCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+PiBnZXRTb3J0ZWRSZXF1aXJlZEltcG9ydEVudHJpZXMoKSB7Ci0JCVRyZWVTZXQ8TWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4+IHNvcnRlZEVudHJpZXMgPSBuZXcgVHJlZVNldDxNYXAuRW50cnk8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPj4odGhpcy5idWlsZEltcG9ydEVudHJpZXNDb21wYXJhdG9yKCkpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNvcnRlZEVudHJpZXMsIHRoaXMuZ2V0UmVxdWlyZWRJbXBvcnRFbnRyaWVzKCkpOwotCQlyZXR1cm4gc29ydGVkRW50cmllczsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcGFyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPj4gYnVpbGRJbXBvcnRFbnRyaWVzQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIElNUE9SVF9FTlRSSUVTX0NPTVBBUkFUT1I7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+PiBJTVBPUlRfRU5UUklFU19DT01QQVJBVE9SID0gbmV3IEltcG9ydEVudHJpZXNDb21wYXJhdG9yKCk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEltcG9ydEVudHJpZXNDb21wYXJhdG9yCi0JCWltcGxlbWVudHMgQ29tcGFyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPj4sIFNlcmlhbGl6YWJsZQotCXsKLQkJcHVibGljIGludCBjb21wYXJlKE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+IGUxLCBNYXAuRW50cnk8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPiBlMikgewotCQkJQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQkJaW50IHBrZyA9IGNvbGxhdG9yLmNvbXBhcmUoZTEuZ2V0VmFsdWUoKS5wYWNrYWdlTmFtZSwgZTIuZ2V0VmFsdWUoKS5wYWNrYWdlTmFtZSk7Ci0JCQlyZXR1cm4gKHBrZyA9PSAwKSA/IGNvbGxhdG9yLmNvbXBhcmUoZTEuZ2V0S2V5KCksIGUyLmdldEtleSgpKSA6IHBrZzsKLQkJfQotCX0KLQotCS8qKgotCSAqIHN0cmlwIG9mZiBhbnkgbm9uLXJlcXVpcmVkIGltcG9ydHMgKGUuZy4gImphdmEubGFuZy5PYmplY3QnKQotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxNYXAuRW50cnk8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPj4gZ2V0UmVxdWlyZWRJbXBvcnRFbnRyaWVzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+Pih0aGlzLmltcG9ydHMuZW50cnlTZXQoKSwgdGhpcy5idWlsZFJlcXVpcmVkSW1wb3J0RW50cmllc0ZpbHRlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsdGVyPE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+PiBidWlsZFJlcXVpcmVkSW1wb3J0RW50cmllc0ZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBSZXF1aXJlZEltcG9ydEVudHJpZXNGaWx0ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgUmVxdWlyZWRJbXBvcnRFbnRyaWVzRmlsdGVyCi0JCWltcGxlbWVudHMgRmlsdGVyPE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+PgotCXsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+IGltcG9ydEVudHJ5KSB7Ci0JCQlyZXR1cm4gdGhpcy5wYWNrYWdlTXVzdEJlSW1wb3J0ZWQoaW1wb3J0RW50cnkuZ2V0VmFsdWUoKSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBwYWNrYWdlTXVzdEJlSW1wb3J0ZWQoSW1wb3J0UGFja2FnZSBpbXBvcnRQYWNrYWdlKSB7Ci0JCQlTdHJpbmcgcGtnID0gaW1wb3J0UGFja2FnZS5wYWNrYWdlTmFtZTsKLQkJCWlmIChwa2cuZXF1YWxzKCIiKSkgewotCQkJCS8vIGNhbm5vdCBpbXBvcnQgYSB0eXBlIGZyb20gdGhlICJ1bm5hbWVkIiBwYWNrYWdlCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKHBrZy5lcXVhbHMoImphdmEubGFuZyIpKSB7Ci0JCQkJLy8gd2UgbXVzdCBpbXBvcnQgZnJvbSAnamF2YS5sYW5nJyBpZiB3ZSBhbHNvIGhhdmUgYSBjbGFzcyBpbiB0aGUgc2FtZSBwYWNrYWdlCi0JCQkJcmV0dXJuIGltcG9ydFBhY2thZ2UuY29sbGlzaW9uOwotCQkJfQotCQkJaWYgKHBrZy5lcXVhbHMoQm9keVNvdXJjZVdyaXRlci50aGlzLnBhY2thZ2VOYW1lKSkgewotCQkJCS8vIHdlIG5ldmVyIG5lZWQgdG8gaW1wb3J0IGEgY2xhc3MgZnJvbSB0aGUgc2FtZSBwYWNrYWdlCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXZSBuZWVkIGEgJ2NvbGxpc2lvbicgZmxhZyBmb3Igd2hlbiB3ZSBlbmNvdW50ZXIgYSBjbGFzcyBmcm9tCi0JICogJ2phdmEubGFuZycgZm9sbG93ZWQgYnkgYSBjbGFzcyBmcm9tIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQncwotCSAqIHBhY2thZ2UuIFdlIHdpbGwgbmVlZCB0byBpbmNsdWRlIHRoZSBleHBsaWNpdCBpbXBvcnQgb2YgdGhlCi0JICogJ2phdmEubGFuZycgY2xhc3MgYW5kIGFsbCB0aGUgcmVmZXJlbmNlcyB0byB0aGUgb3RoZXIgY2xhc3Mgd2lsbAotCSAqIGhhdmUgdG8gYmUgZnVsbHktcXVhbGlmaWVkLgotCSAqIAotCSAqIElmIHRoZSBjbGFzc2VzIGFyZSBlbmNvdW50ZXJlZCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIgKGkuZS4gdGhlIGNsYXNzCi0JICogZnJvbSB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0J3MgcGFja2FnZSBmb2xsb3dlZCBieSB0aGUgY2xhc3MKLQkgKiBmcm9tICdqYXZhLmxhbmcnKSwgd2UgZG8gKm5vdCogbmVlZCB0byBpbXBvcnQgdGhlIGZpcnN0IGNsYXNzIHdoaWxlCi0JICogYWxsIHRoZSByZWZlcmVuY2VzIHRvIHRoZSAnamF2YS5sYW5nJyBjbGFzcyB3aWxsIGJlIGZ1bGx5LXF1YWxpZmllZC4KLQkgKiAKLQkgKiBVbmZvcnR1bmF0ZWx5LCB3ZSBzdGlsbCBoYXZlIGEgcHJvYmxlbTogaWYgd2UgcmVmZXJlbmNlIGEgY2xhc3MgZnJvbQotCSAqICdqYXZhLmxhbmcnIGFuZCB0aGVyZSBpcyBhIGNvbmZsaWN0aW5nIGNsYXNzIGZyb20gdGhlIGN1cnJlbnQKLQkgKiBjb21waWxhdGlvbiB1bml0J3MgcGFja2FnZSAoYnV0IHRoYXQgY2xhc3MgaXMgKm5vdCogcmV2ZWFsZWQgdG8gdXMKLQkgKiBoZXJlKSwgdGhlIHNpbXBsZSBuYW1lIHdpbGwgYmUgcmVzb2x2ZWQgdG8gdGhlIG5vbi0namF2YS5sYW5nJyBjbGFzcy4KLQkgKiBVbmxlc3Mgd2Ugc2ltcGx5IGZvcmNlIGFuIGltcG9ydCBvZiAqYWxsKiAnamF2YS5sYW5nJyBjbGFzc2VzLi4uLiA6LSgKLQkgKiAKLQkgKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4gdmVyeSBvZnRlbi4gOi0pCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBJbXBvcnRQYWNrYWdlIHsKLQkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZTsKLQkJcHJvdGVjdGVkIGJvb2xlYW4gY29sbGlzaW9uID0gZmFsc2U7Ci0KLQkJcHJvdGVjdGVkIEltcG9ydFBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L1RleHRSYW5nZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9UZXh0UmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMxZGQ3Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L1RleHRSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBBIHRleHQgcmFuZ2UgZGVmaW5lcyB0aGUgb2Zmc2V0IGludG8sIGxlbmd0aCBvZiwgYW5kIGxpbmUgb2YgYSBwaWVjZQotICogb2YgdGV4dC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBUZXh0UmFuZ2UgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIHRleHQuCi0JICovCi0JaW50IGdldE9mZnNldCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0LgotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSByYW5nZSBpbmNsdWRlcyB0aGUgY2hhcmFjdGVyIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICovCi0JYm9vbGVhbiBpbmNsdWRlcyhpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHJhbmdlIHRvdWNoZXMgYW4gaW5zZXJ0aW9uIGN1cnNvciBhdCB0aGUKLQkgKiBzcGVjaWZpZWQgaW5kZXguCi0JICovCi0JYm9vbGVhbiB0b3VjaGVzKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSB0ZXh0LgotCSAqLwotCWludCBnZXRMaW5lTnVtYmVyKCk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgbmV3IHRleHQgcmFuZ2UgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWVzIGlmIHRoZXkgZGlmZmVyCi0JICogZnJvbSB0aGUgdGV4dCByYW5nZS4gSWYgdGhlIHNwZWNpZmllZCB2YWx1ZXMgbWF0Y2ggdGhlCi0JICogdGV4dCByYW5nZSwgc2ltcGx5IHJldHVybiB0aGUgdGV4dCByYW5nZSB1bmNoYW5nZWQuCi0JICovCi0JVGV4dFJhbmdlIGJ1aWxkVGV4dFJhbmdlKGludCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBsaW5lTnVtYmVyKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBvZmZzZXRzLCBsZW5ndGhzLCBhbmQgbGluZSBudW1iZXJzIGFyZSB0aGUgc2FtZS4KLQkgKi8KLQlib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGhhc2ggY29kZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB7QGxpbmsgT2JqZWN0I2VxdWFscyhPYmplY3QpfQotCSAqIGNvbnRyYWN0LgotCSAqLwotCWludCBoYXNoQ29kZSgpOwotCi0KLQkvKioKLQkgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbiBvZiB0ZXh0IHJhbmdlLgotCSAqLwotCWZpbmFsIGNsYXNzIEVtcHR5IGV4dGVuZHMgQWJzdHJhY3RUZXh0UmFuZ2UgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFRleHRSYW5nZSBJTlNUQU5DRSA9IG5ldyBFbXB0eSgpOwotCQlwdWJsaWMgc3RhdGljIFRleHRSYW5nZSBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRW1wdHkoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLQkJCXJldHVybiBJTWVzc2FnZS5MSU5FTk9fVU5TRVQ7Ci0JCX0KLQkJcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCQlyZXR1cm4gSU1lc3NhZ2UuT0ZGU0VUX1VOU0VUOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIElNZXNzYWdlLk9GRlNFVF9VTlNFVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9jb21tYW5kL0NvbWJpbmVkQ29tbWFuZEV4ZWN1dG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2NvbW1hbmQvQ29tYmluZWRDb21tYW5kRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyOTExYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2NvbW1hbmQvQ29tYmluZWRDb21tYW5kRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIENvbWJpbmUgdGhlIGpvYiBjb21tYW5kIGV4ZWN1dG9yIGFuZCBjb21tYW5kIGV4ZWN1dG9yIGludGVyZmFjZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbWJpbmVkQ29tbWFuZEV4ZWN1dG9yCi0JZXh0ZW5kcyBKb2JDb21tYW5kRXhlY3V0b3IsIENvbW1hbmRFeGVjdXRvcgotewotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tbWFuZCBleGVjdXRvciBpbnRlcmZhY2UKLQkgKiB0aGF0IHNpbXBseSBleGVjdXRlcyB0aGUgY29tbWFuZCB3aXRob3V0IGFueSBzb3J0IG9mIGVuaGFuY2VtZW50LgotCSAqLwotCWZpbmFsIGNsYXNzIERlZmF1bHQKLQkJaW1wbGVtZW50cyBDb21iaW5lZENvbW1hbmRFeGVjdXRvciwgU2VyaWFsaXphYmxlCi0JewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbWJpbmVkQ29tbWFuZEV4ZWN1dG9yIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJcHVibGljIHN0YXRpYyBDb21iaW5lZENvbW1hbmRFeGVjdXRvciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGVmYXVsdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQsIFN0cmluZyBqb2JOYW1lKSB7Ci0JCQl0aGlzLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQsIFN0cmluZyBqb2JOYW1lLCBJU2NoZWR1bGluZ1J1bGUgc2NoZWR1bGluZ1J1bGUpIHsKLQkJCXRoaXMuZXhlY3V0ZShjb21tYW5kKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tbWFuZCBleGVjdXRvciBpbnRlcmZhY2UKLQkgKiB0aGF0IGlnbm9yZXMgYW55IGNvbW1hbmRzLgotCSAqLwotCWZpbmFsIGNsYXNzIEluYWN0aXZlCi0JCWltcGxlbWVudHMgQ29tYmluZWRDb21tYW5kRXhlY3V0b3IsIFNlcmlhbGl6YWJsZQotCXsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBDb21iaW5lZENvbW1hbmRFeGVjdXRvciBJTlNUQU5DRSA9IG5ldyBJbmFjdGl2ZSgpOwotCQlwdWJsaWMgc3RhdGljIENvbWJpbmVkQ29tbWFuZEV4ZWN1dG9yIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBJbmFjdGl2ZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kLCBTdHJpbmcgam9iTmFtZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kLCBTdHJpbmcgam9iTmFtZSwgSVNjaGVkdWxpbmdSdWxlIHNjaGVkdWxpbmdSdWxlKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9jb21tYW5kL0NvbWJpbmVkRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvY29tbWFuZC9Db21iaW5lZEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYTU3MDEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9jb21tYW5kL0NvbWJpbmVkRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5FeHRlbmRlZENvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQ29tYmluZSB0aGUgc3luY2hyb25vdXNlIGpvYiBjb21tYW5kIGV4ZWN1dG9yIGFuZCBjb21tYW5kIGV4ZWN1dG9yCi0gKiBpbnRlcmZhY2VzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb21iaW5lZEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yCi0JZXh0ZW5kcyBDb21iaW5lZENvbW1hbmRFeGVjdXRvciwgRXh0ZW5kZWRKb2JDb21tYW5kRXhlY3V0b3IsIEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yCi17Ci0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21tYW5kIGV4ZWN1dG9yIGludGVyZmFjZQotCSAqIHRoYXQgc2ltcGx5IGV4ZWN1dGVzIHRoZSBjb21tYW5kIHdpdGhvdXQgYW55IHNvcnQgb2YgZW5oYW5jZW1lbnQuCi0JICovCi0JZmluYWwgY2xhc3MgRGVmYXVsdAotCQlpbXBsZW1lbnRzIENvbWJpbmVkRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IsIFNlcmlhbGl6YWJsZQotCXsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBDb21iaW5lZEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJcHVibGljIHN0YXRpYyBDb21iaW5lZEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEZWZhdWx0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2FpdFRvRXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIHdhaXRUb0V4ZWN1dGUoQ29tbWFuZCBjb21tYW5kLCBsb25nIHRpbWVvdXQpIHsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQpIHsKLQkJCWNvbW1hbmQuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCwgU3RyaW5nIGpvYk5hbWUpIHsKLQkJCXRoaXMuZXhlY3V0ZShjb21tYW5kKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCwgU3RyaW5nIGpvYk5hbWUsIElTY2hlZHVsaW5nUnVsZSBzY2hlZHVsaW5nUnVsZSkgewotCQkJdGhpcy5leGVjdXRlKGNvbW1hbmQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdhaXRUb0V4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQl0aGlzLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gd2FpdFRvRXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQsIGxvbmcgdGltZW91dCkgewotCQkJdGhpcy5leGVjdXRlKGNvbW1hbmQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2FpdFRvRXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQsIFN0cmluZyBqb2JOYW1lKSB7Ci0JCQl0aGlzLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gd2FpdFRvRXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQsIFN0cmluZyBqb2JOYW1lLCBsb25nIHRpbWVvdXQpIHsKLQkJCXRoaXMuZXhlY3V0ZShjb21tYW5kKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdhaXRUb0V4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kLCBTdHJpbmcgam9iTmFtZSwgSVNjaGVkdWxpbmdSdWxlIHNjaGVkdWxpbmdSdWxlKSB7Ci0JCQl0aGlzLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gd2FpdFRvRXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQsIFN0cmluZyBqb2JOYW1lLCBJU2NoZWR1bGluZ1J1bGUgc2NoZWR1bGluZ1J1bGUsIGxvbmcgdGltZW91dCkgewotCQkJdGhpcy5leGVjdXRlKGNvbW1hbmQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBTaW5nbGV0b24gaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbW1hbmQgZXhlY3V0b3IgaW50ZXJmYWNlCi0JICogdGhhdCBpZ25vcmVzIGFueSBjb21tYW5kcy4KLQkgKi8KLQlmaW5hbCBjbGFzcyBJbmFjdGl2ZQotCQlpbXBsZW1lbnRzIENvbWJpbmVkRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IsIFNlcmlhbGl6YWJsZQotCXsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBDb21iaW5lZEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yIElOU1RBTkNFID0gbmV3IEluYWN0aXZlKCk7Ci0JCXB1YmxpYyBzdGF0aWMgQ29tYmluZWRFeHRlbmRlZENvbW1hbmRFeGVjdXRvciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgSW5hY3RpdmUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJcHVibGljIHZvaWQgd2FpdFRvRXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9FeGVjdXRlKENvbW1hbmQgY29tbWFuZCwgbG9uZyB0aW1lb3V0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kLCBTdHJpbmcgam9iTmFtZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kLCBTdHJpbmcgam9iTmFtZSwgSVNjaGVkdWxpbmdSdWxlIHNjaGVkdWxpbmdSdWxlKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJcHVibGljIHZvaWQgd2FpdFRvRXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9FeGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJLy8gZG8gbm90aGluZwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2FpdFRvRXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQsIFN0cmluZyBqb2JOYW1lKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJcHVibGljIGJvb2xlYW4gd2FpdFRvRXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQsIFN0cmluZyBqb2JOYW1lLCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCB3YWl0VG9FeGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCwgU3RyaW5nIGpvYk5hbWUsIElTY2hlZHVsaW5nUnVsZSBzY2hlZHVsaW5nUnVsZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIHdhaXRUb0V4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kLCBTdHJpbmcgam9iTmFtZSwgSVNjaGVkdWxpbmdSdWxlIHNjaGVkdWxpbmdSdWxlLCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2NvbW1hbmQvRXh0ZW5kZWRKb2JDb21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvY29tbWFuZC9FeHRlbmRlZEpvYkNvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWM0YjVkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvY29tbWFuZC9FeHRlbmRlZEpvYkNvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuY29tbWFuZDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZXh0ZW5kcyB0aGUgbm9ybWFsIGNvbW1hbmQgZXhlY3V0b3IgdG8gYWxsb3cgdGhlIGNsaWVudAotICogdG8gY29udHJvbCB3aGVuIGEgY29tbWFuZCBpcyByZXF1aXJlZCB0byBiZSBleGVjdXRlZCBzeW5jaHJvbm91c2x5LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBFeHRlbmRlZEpvYkNvbW1hbmRFeGVjdXRvcgotCWV4dGVuZHMgSm9iQ29tbWFuZEV4ZWN1dG9yCi17Ci0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHNwZWNpZmllZCBjb21tYW5kIGlzIGV4ZWN1dGVkLgotCSAqIFRoZSBjb21tYW5kIGl0c2VsZiBtdXN0IGJlIGV4ZWN1dGVkIDxlbT5hZnRlcjwvZW0+IGFueSBvdGhlciBjb21tYW5kcwotCSAqIHByZXZpb3VzbHkgcGFzc2VkIHRvIHRoZSBjb21tYW5kIGV4ZWN1dG9yLiBUaGUgY29tbWFuZCBtYXkgb3IgbWF5Ci0JICogbm90IGJlIGFzc2lnbmVkIHRvIGEge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYn0KLQkgKiBmb3IgZXhlY3V0aW9uLgotCSAqIEBzZWUgI2V4ZWN1dGUoSm9iQ29tbWFuZCkKLQkgKi8KLQl2b2lkIHdhaXRUb0V4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgaXMgZXhlY3V0ZWQKLQkgKiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmCi0JICogdGhlIGNvbW1hbmQgd2FzIGV4ZWN1dGVkIGluIHRoZSBhbGxvdHRlZCB0aW1lOwotCSAqIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZCBhbmQgdGhlIGNvbW1hbmQgd2FzCi0JICogPGVtPm5vdDwvZW0+IGV4ZWN1dGVkLgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKiA8cD4KLQkgKiBUaGUgY29tbWFuZCBpdHNlbGYgbXVzdCBiZSBleGVjdXRlZCA8ZW0+YWZ0ZXI8L2VtPiBhbnkgb3RoZXIgY29tbWFuZHMKLQkgKiBwcmV2aW91c2x5IHBhc3NlZCB0byB0aGUgY29tbWFuZCBleGVjdXRvci4gVGhlIGNvbW1hbmQgbWF5IG9yIG1heQotCSAqIG5vdCBiZSBhc3NpZ25lZCB0byBhIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2J9Ci0JICogZm9yIGV4ZWN1dGlvbi4KLQkgKiBAc2VlICNleGVjdXRlKEpvYkNvbW1hbmQpCi0JICovCi0JYm9vbGVhbiB3YWl0VG9FeGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgaXMgZXhlY3V0ZWQuCi0JICogVGhlIGNvbW1hbmQgaXRzZWxmIG11c3QgYmUgZXhlY3V0ZWQgPGVtPmFmdGVyPC9lbT4gYW55IG90aGVyIGNvbW1hbmRzCi0JICogcHJldmlvdXNseSBwYXNzZWQgdG8gdGhlIGNvbW1hbmQgZXhlY3V0b3IuIFRoZSBjb21tYW5kIG1heSBvciBtYXkKLQkgKiBub3QgYmUgYXNzaWduZWQgdG8gYSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9ifQotCSAqIGZvciBleGVjdXRpb24uCi0JICogQHNlZSAjZXhlY3V0ZShKb2JDb21tYW5kLCBTdHJpbmcpCi0JICovCi0Jdm9pZCB3YWl0VG9FeGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCwgU3RyaW5nIGpvYk5hbWUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBpcyBleGVjdXRlZAotCSAqIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYKLQkgKiB0aGUgY29tbWFuZCB3YXMgZXhlY3V0ZWQgaW4gdGhlIGFsbG90dGVkIHRpbWU7Ci0JICogcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkIGFuZCB0aGUgY29tbWFuZCB3YXMKLQkgKiA8ZW0+bm90PC9lbT4gZXhlY3V0ZWQuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqIDxwPgotCSAqIFRoZSBjb21tYW5kIGl0c2VsZiBtdXN0IGJlIGV4ZWN1dGVkIDxlbT5hZnRlcjwvZW0+IGFueSBvdGhlciBjb21tYW5kcwotCSAqIHByZXZpb3VzbHkgcGFzc2VkIHRvIHRoZSBjb21tYW5kIGV4ZWN1dG9yLiBUaGUgY29tbWFuZCBtYXkgb3IgbWF5Ci0JICogbm90IGJlIGFzc2lnbmVkIHRvIGEge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYn0KLQkgKiBmb3IgZXhlY3V0aW9uLgotCSAqIEBzZWUgI2V4ZWN1dGUoSm9iQ29tbWFuZCwgU3RyaW5nKQotCSAqLwotCWJvb2xlYW4gd2FpdFRvRXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQsIFN0cmluZyBqb2JOYW1lLCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBpcyBleGVjdXRlZC4KLQkgKiBUaGUgY29tbWFuZCBpdHNlbGYgbXVzdCBiZSBleGVjdXRlZCA8ZW0+YWZ0ZXI8L2VtPiBhbnkgb3RoZXIgY29tbWFuZHMKLQkgKiBwcmV2aW91c2x5IHBhc3NlZCB0byB0aGUgY29tbWFuZCBleGVjdXRvci4gVGhlIGNvbW1hbmQgbWF5IG9yIG1heQotCSAqIG5vdCBiZSBhc3NpZ25lZCB0byBhIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2J9Ci0JICogZm9yIGV4ZWN1dGlvbi4KLQkgKiBAc2VlICNleGVjdXRlKEpvYkNvbW1hbmQsIFN0cmluZywgSVNjaGVkdWxpbmdSdWxlKQotCSAqLwotCXZvaWQgd2FpdFRvRXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQsIFN0cmluZyBqb2JOYW1lLCBJU2NoZWR1bGluZ1J1bGUgc2NoZWR1bGluZ1J1bGUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHNwZWNpZmllZCBjb21tYW5kIGlzIGV4ZWN1dGVkCi0JICogb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZgotCSAqIHRoZSBjb21tYW5kIHdhcyBleGVjdXRlZCBpbiB0aGUgYWxsb3R0ZWQgdGltZTsKLQkgKiByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQgYW5kIHRoZSBjb21tYW5kIHdhcwotCSAqIDxlbT5ub3Q8L2VtPiBleGVjdXRlZC4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICogPHA+Ci0JICogVGhlIGNvbW1hbmQgaXRzZWxmIG11c3QgYmUgZXhlY3V0ZWQgPGVtPmFmdGVyPC9lbT4gYW55IG90aGVyIGNvbW1hbmRzCi0JICogcHJldmlvdXNseSBwYXNzZWQgdG8gdGhlIGNvbW1hbmQgZXhlY3V0b3IuIFRoZSBjb21tYW5kIG1heSBvciBtYXkKLQkgKiBub3QgYmUgYXNzaWduZWQgdG8gYSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9ifQotCSAqIGZvciBleGVjdXRpb24uCi0JICogQHNlZSAjZXhlY3V0ZShKb2JDb21tYW5kLCBTdHJpbmcsIElTY2hlZHVsaW5nUnVsZSkKLQkgKi8KLQlib29sZWFuIHdhaXRUb0V4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kLCBTdHJpbmcgam9iTmFtZSwgSVNjaGVkdWxpbmdSdWxlIHNjaGVkdWxpbmdSdWxlLCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21tYW5kIGV4ZWN1dG9yIGludGVyZmFjZQotCSAqIHRoYXQgc2ltcGx5IGV4ZWN1dGVzIHRoZSBjb21tYW5kIHdpdGhvdXQgYW55IHNvcnQgb2YgZW5oYW5jZW1lbnQuCi0JICovCi0JZmluYWwgY2xhc3MgRGVmYXVsdAotCQlpbXBsZW1lbnRzIEV4dGVuZGVkSm9iQ29tbWFuZEV4ZWN1dG9yLCBTZXJpYWxpemFibGUKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRXh0ZW5kZWRKb2JDb21tYW5kRXhlY3V0b3IgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdCgpOwotCQlwdWJsaWMgc3RhdGljIEV4dGVuZGVkSm9iQ29tbWFuZEV4ZWN1dG9yIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEZWZhdWx0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCkgewotCQkJY29tbWFuZC5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kLCBTdHJpbmcgam9iTmFtZSkgewotCQkJdGhpcy5leGVjdXRlKGNvbW1hbmQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kLCBTdHJpbmcgam9iTmFtZSwgSVNjaGVkdWxpbmdSdWxlIHNjaGVkdWxpbmdSdWxlKSB7Ci0JCQl0aGlzLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2FpdFRvRXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQpIHsKLQkJCXRoaXMuZXhlY3V0ZShjb21tYW5kKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9FeGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCwgbG9uZyB0aW1lb3V0KSB7Ci0JCQl0aGlzLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCB3YWl0VG9FeGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCwgU3RyaW5nIGpvYk5hbWUpIHsKLQkJCXRoaXMuZXhlY3V0ZShjb21tYW5kKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9FeGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCwgU3RyaW5nIGpvYk5hbWUsIGxvbmcgdGltZW91dCkgewotCQkJdGhpcy5leGVjdXRlKGNvbW1hbmQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2FpdFRvRXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQsIFN0cmluZyBqb2JOYW1lLCBJU2NoZWR1bGluZ1J1bGUgc2NoZWR1bGluZ1J1bGUpIHsKLQkJCXRoaXMuZXhlY3V0ZShjb21tYW5kKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9FeGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCwgU3RyaW5nIGpvYk5hbWUsIElTY2hlZHVsaW5nUnVsZSBzY2hlZHVsaW5nUnVsZSwgbG9uZyB0aW1lb3V0KSB7Ci0JCQl0aGlzLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tbWFuZCBleGVjdXRvciBpbnRlcmZhY2UKLQkgKiB0aGF0IGlnbm9yZXMgYW55IGNvbW1hbmRzLgotCSAqLwotCWZpbmFsIGNsYXNzIEluYWN0aXZlCi0JCWltcGxlbWVudHMgRXh0ZW5kZWRKb2JDb21tYW5kRXhlY3V0b3IsIFNlcmlhbGl6YWJsZQotCXsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFeHRlbmRlZEpvYkNvbW1hbmRFeGVjdXRvciBJTlNUQU5DRSA9IG5ldyBJbmFjdGl2ZSgpOwotCQlwdWJsaWMgc3RhdGljIEV4dGVuZGVkSm9iQ29tbWFuZEV4ZWN1dG9yIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBJbmFjdGl2ZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCwgU3RyaW5nIGpvYk5hbWUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCwgU3RyaW5nIGpvYk5hbWUsIElTY2hlZHVsaW5nUnVsZSBzY2hlZHVsaW5nUnVsZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdhaXRUb0V4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJcHVibGljIGJvb2xlYW4gd2FpdFRvRXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdhaXRUb0V4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kLCBTdHJpbmcgam9iTmFtZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIHdhaXRUb0V4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kLCBTdHJpbmcgam9iTmFtZSwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJLy8gZG8gbm90aGluZwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2FpdFRvRXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQsIFN0cmluZyBqb2JOYW1lLCBJU2NoZWR1bGluZ1J1bGUgc2NoZWR1bGluZ1J1bGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9FeGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCwgU3RyaW5nIGpvYk5hbWUsIElTY2hlZHVsaW5nUnVsZSBzY2hlZHVsaW5nUnVsZSwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJLy8gZG8gbm90aGluZwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9jb21tYW5kL0ludGVycnVwdGlibGVKb2JDb21tYW5kLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2NvbW1hbmQvSW50ZXJydXB0aWJsZUpvYkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGViNjhkNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2NvbW1hbmQvSW50ZXJydXB0aWJsZUpvYkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuY29tbWFuZDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBTaW1wbGUgaW50ZXJmYWNlIGZvciBpbXBsZW1lbnRpbmcgdGhlIEdPRiBDb21tYW5kIGRlc2lnbiBwYXR0ZXJuCi0gKiBpbiBhbiBFY2xpcHNlIGpvYgotICogYW5kIGFsbG93cyBmb3IgdGhlIGNvbW1hbmQgdG8gdGhyb3cgYW4ge0BsaW5rIEludGVycnVwdGVkRXhjZXB0aW9ufS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuY29tbWFuZC5Kb2JDb21tYW5kCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW50ZXJydXB0aWJsZUpvYkNvbW1hbmQgewotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4gVGhlIHNlbWFudGljcyBvZiB0aGUgY29tbWFuZAotCSAqIGlzIGRldGVybWluZWQgYnkgdGhlIGNvbnRyYWN0IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyLgotCSAqIFRoZSBjb21tYW5kIHNob3VsZCBjaGVjaywgYXMgYXBwcm9wcmlhdGUsIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwcm9ncmVzcwotCSAqIG1vbml0b3IgaXMge0BsaW5rIElQcm9ncmVzc01vbml0b3IjaXNDYW5jZWxlZCgpICJjYW5jZWxlZCJ9OyBpZiBpdCBpcywKLQkgKiB0aGUgY29tbWFuZCBzaG91bGQgcmV0dXJuIGEgcmVzdWx0Ci0JICogc3RhdHVzIG9mIHNldmVyaXR5IHtAbGluayBJU3RhdHVzI0NBTkNFTH0uIFRoZSBzaW5nbGV0b24KLQkgKiBjYW5jZWwgc3RhdHVzIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzI0NBTkNFTF9TVEFUVVN9IGNhbiBiZSB1c2VkIGZvcgotCSAqIHRoaXMgcHVycG9zZS4KLQkgKiA8cD4KLQkgKiBOZXN0ZWQgbWV0aG9kcyBjYW4gYWxzbyBjaGVjayB0aGUgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIGFuZCwgaWYgaXQgaXMgImNhbmNlbGVkIiwgdGhyb3cgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9ufS4KLQkgKiAKLQkgKiBAc2VlIElQcm9ncmVzc01vbml0b3IjaXNDYW5jZWxlZCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2IjcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkgKi8KLQlJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJydXB0aWJsZSBqb2IgY29tbWFuZCBpbnRlcmZhY2UgdGhhdAotCSAqIHdpbGwgdGhyb3cgYW4gaW50ZXJydXB0ZWQgZXhjZXB0aW9uIHdoZW4gZXhlY3V0ZWQuCi0JICovCi0JZmluYWwgY2xhc3MgSW50ZXJydXB0ZWQKLQkJaW1wbGVtZW50cyBJbnRlcnJ1cHRpYmxlSm9iQ29tbWFuZCwgU2VyaWFsaXphYmxlCi0JewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVycnVwdGlibGVKb2JDb21tYW5kIElOU1RBTkNFID0gbmV3IEludGVycnVwdGVkKCk7Ci0JCXB1YmxpYyBzdGF0aWMgSW50ZXJydXB0aWJsZUpvYkNvbW1hbmQgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIEludGVycnVwdGVkKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2NvbW1hbmQvSm9iQ29tbWFuZC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9jb21tYW5kL0pvYkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcwZjQ5ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2NvbW1hbmQvSm9iQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuY29tbWFuZDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogU2ltcGxlIGludGVyZmFjZSBmb3IgaW1wbGVtZW50aW5nIHRoZSBHT0YgQ29tbWFuZCBkZXNpZ24gcGF0dGVybiBpbiBhbgotICogRWNsaXBzZSBqb2IuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpvYkNvbW1hbmQKLQlleHRlbmRzIEludGVycnVwdGlibGVKb2JDb21tYW5kCi17Ci0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4gVGhlIHNlbWFudGljcyBvZiB0aGUgY29tbWFuZAotCSAqIGlzIGRldGVybWluZWQgYnkgdGhlIGNvbnRyYWN0IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyLgotCSAqIFRoZSBjb21tYW5kIHNob3VsZCBjaGVjaywgYXMgYXBwcm9wcmlhdGUsIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwcm9ncmVzcwotCSAqIG1vbml0b3IgaXMge0BsaW5rIElQcm9ncmVzc01vbml0b3IjaXNDYW5jZWxlZCgpICJjYW5jZWxlZCJ9OyBpZiBpdCBpcywKLQkgKiB0aGUgY29tbWFuZCBzaG91bGQgcmV0dXJuIGEgcmVzdWx0Ci0JICogc3RhdHVzIG9mIHNldmVyaXR5IHtAbGluayBJU3RhdHVzI0NBTkNFTH0uIFRoZSBzaW5nbGV0b24KLQkgKiBjYW5jZWwgc3RhdHVzIHtAbGluayBTdGF0dXMjQ0FOQ0VMX1NUQVRVU30gY2FuIGJlIHVzZWQgZm9yCi0JICogdGhpcyBwdXJwb3NlLgotCSAqIDxwPgotCSAqIE5lc3RlZCBtZXRob2RzIGNhbiBhbHNvIGNoZWNrIHRoZSBwcm9ncmVzcyBtb25pdG9yCi0JICogYW5kLCBpZiBpdCBpcyAiY2FuY2VsZWQiLCB0aHJvdyBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb259LgotCSAqIAotCSAqIEBzZWUgSVByb2dyZXNzTW9uaXRvciNpc0NhbmNlbGVkKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCSAqLwotCUlTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0KLQkvKioKLQkgKiBTaW5nbGV0b24gaW1wbGVtZW50YXRpb24gb2YgdGhlIGpvYiBjb21tYW5kIGludGVyZmFjZSB0aGF0IHdpbGwgZG8KLQkgKiBub3RoaW5nIHdoZW4gZXhlY3V0ZWQuCi0JICovCi0JZmluYWwgY2xhc3MgTnVsbAotCQlpbXBsZW1lbnRzIEpvYkNvbW1hbmQsIFNlcmlhbGl6YWJsZQotCXsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBKb2JDb21tYW5kIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJcHVibGljIHN0YXRpYyBKb2JDb21tYW5kIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBTaW5nbGV0b24gaW1wbGVtZW50YXRpb24gb2YgdGhlIGpvYiBjb21tYW5kIGludGVyZmFjZSB0aGF0IHdpbGwgdGhyb3cgYW4KLQkgKiBleGNlcHRpb24gd2hlbiBleGVjdXRlZC4KLQkgKi8KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZAotCQlpbXBsZW1lbnRzIEpvYkNvbW1hbmQsIFNlcmlhbGl6YWJsZQotCXsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBKb2JDb21tYW5kIElOU1RBTkNFID0gbmV3IERpc2FibGVkKCk7Ci0JCXB1YmxpYyBzdGF0aWMgSm9iQ29tbWFuZCBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9jb21tYW5kL0pvYkNvbW1hbmRFeGVjdXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9jb21tYW5kL0pvYkNvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmUxYmNlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvY29tbWFuZC9Kb2JDb21tYW5kRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBjbGllbnRzIHRvIGNvbnRyb2wgaG93IGEgam9iIGNvbW1hbmQgaXMgZXhlY3V0ZWQuCi0gKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSBzZXJ2ZXIgcHJvdmlkZXMgdGhlIGNvbW1hbmQgYnV0IHRoZSBjbGllbnQgcHJvdmlkZXMKLSAqIHRoZSBjb250ZXh0IChlLmcuIHRoZSBjbGllbnQgd291bGQgbGlrZSB0byBleGVjdXRlIHRoZSBjb21tYW5kIHN5bmNocm9ub3VzbHkKLSAqIHJhdGhlciB0aGFuIGRpc3BhdGNoaW5nIGl0IHRvIGEgam9iIHF1ZXVlKS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSm9iQ29tbWFuZEV4ZWN1dG9yIHsKLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kLCBzeW5jaHJvbm91c2x5IG9yIGFzeW5jaHJvbm91c2x5LgotCSAqIENvbW1hbmRzIHdpdGggdGhlIHNhbWUgc2NoZWR1bGluZyBydWxlIG11c3QgYmUgZXhlY3V0ZWQgaW4gdGhlIG9yZGVyIGluCi0JICogd2hpY2ggdGhleSBhcmUgcGFzc2VkIHRvIHRoZSBjb21tYW5kIGV4ZWN1dG9yLgotCSAqIFRoZSBjb21tYW5kIG1heSBvciBtYXkgbm90IGJlIGFzc2lnbmVkIHRvIGEKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9ifSBmb3IgZXhlY3V0aW9uLgotCSAqLwotCXZvaWQgZXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQpOwotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQsIHN5bmNocm9ub3VzbHkgb3IgYXN5bmNocm9ub3VzbHkuCi0JICogQ29tbWFuZHMgd2l0aCB0aGUgc2FtZSBzY2hlZHVsaW5nIHJ1bGUgbXVzdCBiZSBleGVjdXRlZCBpbiB0aGUgb3JkZXIgaW4KLQkgKiB3aGljaCB0aGV5IGFyZSBwYXNzZWQgdG8gdGhlIGNvbW1hbmQgZXhlY3V0b3IuCi0JICogVGhlIGNvbW1hbmQgbWF5IG9yIG1heSBub3QgYmUgYXNzaWduZWQgdG8gYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2J9IGZvciBleGVjdXRpb24uCi0JICovCi0Jdm9pZCBleGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCwgU3RyaW5nIGpvYk5hbWUpOwotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQsIHN5bmNocm9ub3VzbHkgb3IgYXN5bmNocm9ub3VzbHkuCi0JICogQ29tbWFuZHMgd2l0aCB0aGUgc2FtZSBzY2hlZHVsaW5nIHJ1bGUgbXVzdCBiZSBleGVjdXRlZCBpbiB0aGUgb3JkZXIgaW4KLQkgKiB3aGljaCB0aGV5IGFyZSBwYXNzZWQgdG8gdGhlIGNvbW1hbmQgZXhlY3V0b3IuCi0JICogVGhlIGNvbW1hbmQgbWF5IG9yIG1heSBub3QgYmUgYXNzaWduZWQgdG8gYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2J9IGZvciBleGVjdXRpb24uCi0JICovCi0Jdm9pZCBleGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCwgU3RyaW5nIGpvYk5hbWUsIElTY2hlZHVsaW5nUnVsZSBzY2hlZHVsaW5nUnVsZSk7Ci0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tbWFuZCBleGVjdXRvciBpbnRlcmZhY2UKLQkgKiB0aGF0IHNpbXBseSBleGVjdXRlcyB0aGUgY29tbWFuZCB3aXRob3V0IGFueSBzb3J0IG9mIGVuaGFuY2VtZW50LgotCSAqLwotCWZpbmFsIGNsYXNzIERlZmF1bHQKLQkJaW1wbGVtZW50cyBKb2JDb21tYW5kRXhlY3V0b3IsIFNlcmlhbGl6YWJsZQotCXsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBKb2JDb21tYW5kRXhlY3V0b3IgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdCgpOwotCQlwdWJsaWMgc3RhdGljIEpvYkNvbW1hbmRFeGVjdXRvciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGVmYXVsdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZShKb2JDb21tYW5kIGNvbW1hbmQpIHsKLQkJCWNvbW1hbmQuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCwgU3RyaW5nIGpvYk5hbWUpIHsKLQkJCXRoaXMuZXhlY3V0ZShjb21tYW5kKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCwgU3RyaW5nIGpvYk5hbWUsIElTY2hlZHVsaW5nUnVsZSBzY2hlZHVsaW5nUnVsZSkgewotCQkJdGhpcy5leGVjdXRlKGNvbW1hbmQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21tYW5kIGV4ZWN1dG9yIGludGVyZmFjZQotCSAqIHRoYXQgaWdub3JlcyBhbnkgY29tbWFuZHMuCi0JICovCi0JZmluYWwgY2xhc3MgSW5hY3RpdmUKLQkJaW1wbGVtZW50cyBKb2JDb21tYW5kRXhlY3V0b3IsIFNlcmlhbGl6YWJsZQotCXsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBKb2JDb21tYW5kRXhlY3V0b3IgSU5TVEFOQ0UgPSBuZXcgSW5hY3RpdmUoKTsKLQkJcHVibGljIHN0YXRpYyBKb2JDb21tYW5kRXhlY3V0b3IgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIEluYWN0aXZlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKEpvYkNvbW1hbmQgY29tbWFuZCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kLCBTdHJpbmcgam9iTmFtZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSm9iQ29tbWFuZCBjb21tYW5kLCBTdHJpbmcgam9iTmFtZSwgSVNjaGVkdWxpbmdSdWxlIHNjaGVkdWxpbmdSdWxlKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9jb21tYW5kL05vdGlmeWluZ1JlcGVhdGluZ0pvYkNvbW1hbmQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvY29tbWFuZC9Ob3RpZnlpbmdSZXBlYXRpbmdKb2JDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MTA2MTguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9jb21tYW5kL05vdGlmeWluZ1JlcGVhdGluZ0pvYkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBFeHRlbmQgdGhlIHJlcGVhdGluZyBqb2IgY29tbWFuZCB0byBzdXBwb3J0IGxpc3RlbmVycyB0aGF0IGFyZSBub3RpZmllZAotICogd2hlbiBhbiBleGVjdXRpb24gImN5Y2xlIiBpcyBjb21wbGV0ZTsgaS5lLiB0aGUgam9iIGNvbW1hbmQgaGFzLAotICogZm9yIHRoZSBtb21lbnQsIGhhbmRsZWQgZXZlcnkgZXhlY3V0aW9uIHJlcXVlc3QgYW5kIHF1aWVzY2VkLgotICogVGhpcyBub3RpZmljYXRpb24gaXMgPGVtPm5vdDwvZW0+IGd1YXJhbnRlZWQgdG8gb2NjdXIgd2l0aCA8ZW0+ZXZlcnk8L2VtPgotICogZXhlY3V0aW9uICJjeWNsZSI7IHNpbmNlIG90aGVyLCB1bnJlbGF0ZWQsIGV4ZWN1dGlvbnMgY2FuIGJlIHRyaWdnZXJlZAotICogY29uY3VycmVudGx5LCBjYXVzaW5nIHRoZSAiY3ljbGUiIHRvIGNvbnRpbnVlLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBOb3RpZnlpbmdSZXBlYXRpbmdKb2JDb21tYW5kCi0JZXh0ZW5kcyBSZXBlYXRpbmdKb2JDb21tYW5kCi17Ci0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIuCi0JICovCi0Jdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBsaXN0ZW5lci4KLQkgKi8KLQl2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgbGlzdGVuZXJzIHRvIGJlIG5vdGlmaWVkIHdoZW5ldmVyIHRoZQotCSAqIGpvYiBjb21tYW5kIGhhcyBxdWllc2NlZC4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyCi0JCWV4dGVuZHMgRXZlbnRMaXN0ZW5lcgotCXsKLQkJLyoqCi0JCSAqIFRoZSBzcGVjaWZpZWQgam9iIGNvbW1hbmQgaGFzIHF1aWVzY2VkLgotCQkgKi8KLQkJSVN0YXR1cyBleGVjdXRpb25RdWllc2NlZChKb2JDb21tYW5kIGNvbW1hbmQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG51bGwgc2luZ2xldG9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbm90aWZ5aW5nIHJlcGVhdGluZyBjb21tYW5kIGludGVyZmFjZSB0aGF0Ci0JICogd2lsbCBkbyBub3RoaW5nIHdoZW4gZXhlY3V0ZWQuCi0JICovCi0JZmluYWwgY2xhc3MgTnVsbAotCQlpbXBsZW1lbnRzIE5vdGlmeWluZ1JlcGVhdGluZ0pvYkNvbW1hbmQsIFNlcmlhbGl6YWJsZQotCXsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBOb3RpZnlpbmdSZXBlYXRpbmdKb2JDb21tYW5kIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJcHVibGljIHN0YXRpYyBOb3RpZnlpbmdSZXBlYXRpbmdKb2JDb21tYW5kIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9jb21tYW5kL1JlcGVhdGluZ0pvYkNvbW1hbmQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvY29tbWFuZC9SZXBlYXRpbmdKb2JDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OTUyYjUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9jb21tYW5kL1JlcGVhdGluZ0pvYkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuY29tbWFuZDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFRoaXMgam9iIGNvbW1hbmQgd2lsbCBleGVjdXRlIHJlcGVhdGVkbHkgdGhlIG1pbmltdW0KLSAqIG51bWJlciBvZiB0aW1lcy4gVGhlIGFzc3VtcHRpb24gaXMgdGhlIGpvYiBjb21tYW5kJ3MgZWZmZWN0cyBhcmUKLSAqIGN1bXVsYXRpdmUoPyk7IGkuZS4gdGhlIGN1bXVsYXRpdmUgcmVzdWx0IG9mIG11bHRpcGxlIGV4ZWN1dGlvbnMgb2YgdGhlCi0gKiBqb2IgY29tbWFuZCBpcyBubyBkaWZmZXJlbnQgdGhhbiB0aGUgcmVzdWx0IG9mIGEgc2luZ2xlIGV4ZWN1dGlvbiBvZiB0aGUgam9iCi0gKiBjb21tYW5kLiBPbmNlIHRoZSBqb2IgY29tbWFuZCBpcyBleGVjdXRpbmcsIGFueSBmdXJ0aGVyIHJlcXVlc3RzIHRvIGV4ZWN1dGUKLSAqIHNpbXBseSB0cmlnZ2VyIGEgcmUtZXhlY3V0aW9uIG9mIHRoZSBqb2IgY29tbWFuZCBvbmNlIGl0IGhhcyBmaW5pc2hlZCBpdHMKLSAqIGN1cnJlbnQgZXhlY3V0aW9uLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZXBlYXRpbmdKb2JDb21tYW5kCi0JZXh0ZW5kcyBKb2JDb21tYW5kCi17Ci0JLyoqCi0JICogU3RhcnQgdGhlIGpvYiBjb21tYW5kLCBhbGxvd2luZyBpdCB0byBiZWdpbiBleGVjdXRpbmcgd2l0aCB0aGUgbmV4dCBjYWxsCi0JICogdG8ge0BsaW5rICNleGVjdXRlKElQcm9ncmVzc01vbml0b3IpfS4KLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB3aGVuIHRoZSBjb21tYW5kIGlzIG5vdCBzdG9wcGVkCi0JICovCi0Jdm9pZCBzdGFydCgpOwotCi0JLyoqCi0JICogU3RvcCB0aGUgam9iIGNvbW1hbmQ7IGlnbm9yZSBmdXJ0aGVyIGNhbGxzIHRvCi0JICoge0BsaW5rICNleGVjdXRlKElQcm9ncmVzc01vbml0b3IpfS4KLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB3aGVuIHRoZSBjb21tYW5kIGV4ZWN1dG9yIGlzIG5vdCBzdGFydGVkCi0JICovCi0Jdm9pZCBzdG9wKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uOwotCi0KLQkvKioKLQkgKiBTaW5nbGV0b24gaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlcGVhdGluZyBqb2IgY29tbWFuZCBpbnRlcmZhY2UgdGhhdAotCSAqIHdpbGwgZG8gbm90aGluZyB3aGVuIGV4ZWN1dGVkLgotCSAqLwotCWZpbmFsIGNsYXNzIE51bGwKLQkJaW1wbGVtZW50cyBSZXBlYXRpbmdKb2JDb21tYW5kLCBTZXJpYWxpemFibGUKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVwZWF0aW5nSm9iQ29tbWFuZCBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCXB1YmxpYyBzdGF0aWMgUmVwZWF0aW5nSm9iQ29tbWFuZCBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgTnVsbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQWJzdHJhY3RUeXBlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9BYnN0cmFjdFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJlN2EwNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9BYnN0cmFjdFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKLQotLyoqCi0gKiBBYnN0cmFjdFR5cGU6IGp1c3Qgc29tZSBjb3ZhcmlhbnQgb3ZlcnJpZGVzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWJzdHJhY3RUeXBlIGV4dGVuZHMgTWVtYmVyIHsKLQotCS8qKgotCSAqIENvdmFyaWFudCBvdmVycmlkZS4KLQkgKi8KLQlJVHlwZUJpbmRpbmcgZ2V0QmluZGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBDb3ZhcmlhbnQgb3ZlcnJpZGUuCi0JICovCi0JQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gZ2V0Qm9keURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0Fubm90YXRlZEVsZW1lbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0Fubm90YXRlZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlOTljZi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9Bbm5vdGF0ZWRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBEYWxpIG1hbmlwdWxhdGVzIGFubm90YXRpb25zIG9uIGVsZW1lbnRzIChwYWNrYWdlcywgdHlwZXMsIGZpZWxkcywgYW5kIG1ldGhvZHMpLgotICogVGhpcyBpbnRlcmZhY2Ugc2ltcGxpZmllcyB0aG9zZSBtYW5pcHVsYXRpb25zLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQW5ub3RhdGVkRWxlbWVudCB7Ci0KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhbm5vdGF0ZWQgZWxlbWVudCdzIGJvZHkgZGVjbGFyYXRpb24gZnJvbSB0aGUgc3BlY2lmaWVkIEFTVC4KLQkgKiBUaGlzIGNhbiBiZSBudWxsIGlmIHRoZSBhbm5vdGF0ZWQgZWxlbWVudCBpcyBubyBsb25nZXIgcHJlc2VudCBpbiB0aGUgQVNUCi0JICogYmVjYXVzZSB0aGUgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQgaW4gYW5vdGhlciB0aHJlYWQuCi0JICovCi0JQVNUTm9kZSBnZXRCb2R5RGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhbm5vdGF0ZWQgZWxlbWVudCdzIGJpbmRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIEFTVC4KLQkgKi8KLQlJQmluZGluZyBnZXRCaW5kaW5nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYW5ub3RhdGVkIGVsZW1lbnQncyAibW9kaWZpZWQiIGRlY2xhcmF0aW9uIGZyb20gdGhlIHNwZWNpZmllZCBBU1QuCi0JICovCi0JTW9kaWZpZWREZWNsYXJhdGlvbiBnZXRNb2RpZmllZERlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYW5ub3RhdGVkIGVsZW1lbnQncyAibW9kaWZpZWQiIGRlY2xhcmF0aW9uIGZyb20gYSBuZXdseS1nZW5lcmF0ZWQgQVNULgotCSAqLwotCU1vZGlmaWVkRGVjbGFyYXRpb24gZ2V0TW9kaWZpZWREZWNsYXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhbm5vdGF0ZWQgZWxlbWVudCdzIG5hbWUgdGV4dCByYW5nZSBmcm9tIHRoZSBzcGVjaWZpZWQgQVNULgotCSAqLwotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIEVkaXQgdGhlIGFubm90YXRlZCBlbGVtZW50J3MgZGVjbGFyYXRpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBlZGl0b3IuCi0JICovCi0Jdm9pZCBlZGl0KEVkaXRvciBlZGl0b3IpOwotCi0KLQkvLyAqKioqKioqKioqICJlZGl0b3IiIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgY2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIHdoZW4gdGhlIGFubm90YXRlZCBlbGVtZW50J3MKLQkgKiBjb21waWxhdGlvbiB1bml0L0FTVCBpcyBpbiBhIHN0YXRlIHRvIGJlIG1hbmlwdWxhdGVkLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgRWRpdG9yIHsKLQotCQkvKioKLQkJICogRWRpdCB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLiBBbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBkZWNsYXJhdGlvbgotCQkgKiB3aWxsIGJlIGNhcHR1cmVkIGFuZCBhcHBsaWVkIHRvIHRoZSBhbm5vdGF0ZWQgZWxlbWVudCdzIGNvbXBpbGF0aW9uIHVuaXQuCi0JCSAqLwotCQl2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0Fubm90YXRlZFBhY2thZ2UuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0Fubm90YXRlZFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhM2NjYy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9Bbm5vdGF0ZWRQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFJlZCBIYXQsIEluYy4KLSAqIERpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2UgYnkgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwKLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcjoKLSAqICAgICBSZWQgSGF0LCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JUGFja2FnZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlBhY2thZ2VEZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIERtaXRyeSBHZXJhc2tvdgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBBbm5vdGF0ZWRQYWNrYWdlIGV4dGVuZHMgQW5ub3RhdGVkRWxlbWVudCB7CQotCi0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCUlQYWNrYWdlQmluZGluZyBnZXRCaW5kaW5nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIENvdmFyaWFudCBvdmVycmlkZS4KLQkgKi8KLQlQYWNrYWdlRGVjbGFyYXRpb24gZ2V0Qm9keURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0Fubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYjA0YzQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLQotLyoqCi0gKiBBZGFwdCBhIEphdmEgYW5ub3RhdGlvbiB3aXRoIGEgc2ltcGxlLXRvLXVzZSBpbnRlcmZhY2UuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBBbm5vdGF0aW9uQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGNvbXBpbGF0aW9uIHVuaXQsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlCi0JICogYWRhcHRlcidzIGFubm90YXRpb24uCi0JICogQHNlZSAjZ2V0QW5ub3RhdGlvbigpCi0JICovCi0JQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIEJ1aWxkIGEgbmV3IG1hcmtlciBhbm5vdGF0aW9uLCByZXBsYWNpbmcgdGhlIG9yaWdpbmFsIGFubm90YXRpb24gaWYgcHJlc2VudC4KLQkgKi8KLQl2b2lkIG5ld01hcmtlckFubm90YXRpb24oKTsKLQotCS8qKgotCSAqIEJ1aWxkIGEgbmV3IHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbiwgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBhbm5vdGF0aW9uIGlmIHByZXNlbnQuCi0JICovCi0Jdm9pZCBuZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhIG5ldyBub3JtYWwgYW5ub3RhdGlvbiwgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBhbm5vdGF0aW9uIGlmIHByZXNlbnQuCi0JICovCi0Jdm9pZCBuZXdOb3JtYWxBbm5vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCByZW1vdmVBbm5vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEFTVCBub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFubm90YXRpb24uCi0JICogSWYgdGhlIGFubm90YXRpb24gaXMgbWlzc2luZywgcmV0dXJuIHRoZSBhbm5vdGF0aW9uJ3MgcGFyZW50IG5vZGUuCi0JICogQHNlZSAjZ2V0QXN0Tm9kZSgpCi0JICovCi0JQVNUTm9kZSBnZXRBc3ROb2RlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0Fubm90YXRpb25FZGl0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YjNhYzAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLQotLyoqCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciB7Ci0KLQkvKioKLQkgKiBSZXZpZXcgdGhlIHNwZWNpZmllZCBlZGl0cyBhbmQgZm9ybWF0IHRoZSBzcGVjaWZpZWQgZG9jdW1lbnQgYXMgbmVlZGVkLgotCSAqLwotCXZvaWQgZm9ybWF0KElEb2N1bWVudCBkb2MsIFRleHRFZGl0IGVkaXRUcmVlKSB0aHJvd3MgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0Fubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYzZlOTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci0KLS8qKgotICogQWRhcHQgYSBKYXZhIGFubm90YXRpb24gZWxlbWVudCB3aXRoIGEgc2ltcGxlLXRvLXVzZSBpbnRlcmZhY2UuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4gewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgYWRhcHRlcidzIGFubm90YXRpb24gZWxlbWVudC4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBpcyBub3QgcHJlc2VudC4KLQkgKiBJZiB0aGUgY29tcGlsYXRpb24gdW5pdCBpcyBhdmFpbGFibGUsICN2YWx1ZShDb21waWxhdGlvblVuaXQpCi0JICogbWlnaHQgYmUgbW9yZSBwZXJmb3JtYW50LgotCSAqIEBzZWUgI2dldFZhbHVlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQpCi0JICovCi0JVCBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogR2l2ZW4gdGhlIHNwZWNpZmllZCBjb21waWxhdGlvbiB1bml0LCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZQotCSAqIGFkYXB0ZXIncyBhbm5vdGF0aW9uIGVsZW1lbnQuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgaXMgbm90IHByZXNlbnQuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqLwotCVQgZ2V0VmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgYWRhcHRlcidzIGFubm90YXRpb24gZWxlbWVudC4KLQkgKiBTZXR0aW5nIHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCB0byBudWxsIHdpbGwgY2F1c2UKLQkgKiB0aGUgZWxlbWVudCB0byBiZSByZW1vdmVkIGZyb20gaXRzIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShUIHZhbHVlKTsKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBzcGVjaWZpZWQgY29tcGlsYXRpb24gdW5pdCwgcmV0dXJuIHRoZSBleHByZXNzaW9uIHZhbHVlIG9mIHRoZQotCSAqIGFkYXB0ZXIncyBhbm5vdGF0aW9uIGVsZW1lbnQuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgaXMgbm90IHByZXNlbnQuCi0JICogQHNlZSAjZ2V0RXhwcmVzc2lvbigpCi0JICovCi0JRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgQVNUIG5vZGUgY29ycmVzcG9uZGluZyB0byB0aGUgZWxlbWVudC4KLQkgKiBJZiB0aGUgZWxlbWVudCBpcyBtaXNzaW5nLCByZXR1cm4gdGhlIGFubm90YXRpb24ncyBub2RlLgotCSAqIEBzZWUgI2dldEFzdE5vZGUoKQotCSAqLwotCUFTVE5vZGUgZ2V0QXN0Tm9kZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0F0dHJpYnV0ZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZTE5ZDUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKLQotLyoqCi0gKiBBdHRyaWJ1dGVzIGFyZSBlaXRoZXIgcmVwcmVzZW50ZWQgYnkgZmllbGRzICgnZm9vJykgb3IgcHJvcGVydGllcy9tZXRob2QKLSAqIHBhaXJzICgnZ2V0Rm9vKCknLydzZXRGb28oKScpLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXR0cmlidXRlIGV4dGVuZHMgTWVtYmVyIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXR0cmlidXRlJ3MgbmFtZSwgYXMgb3Bwb3NlZCB0byB0aGUgbWVtYmVyJ3MgbmFtZQotCSAqIChlLmcuICJnZXRGb28oKSIgcmV0dXJucyAiZm9vIikuCi0JICovCi0JU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBiaW5kaW5nIGZvciB0aGUgYXR0cmlidXRlJ3MgZGVjbGFyZWQgdHlwZSwKLQkgKiBhcyBvcHBvc2VkIHRvIGl0cyBkZWNsYXJpbmcgdHlwZS4KLQkgKi8KLQlJVHlwZUJpbmRpbmcgZ2V0VHlwZUJpbmRpbmcoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyBhIGZpZWxkLgotCSAqLwotCWJvb2xlYW4gaXNGaWVsZCgpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOTNhMTYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBQcm92aWRlIGNsaWVudHMgd2l0aCBhIHBsdWdnYWJsZSB3YXkgdG8gbWFuaXB1bGF0ZSBhbgotICogYW5ub3RhdGlvbiBtb2RpZnlpbmcgYSAiZGVjbGFyYXRpb24iLgotICogCi0gKiBUT0RPIHNwZWNpZnkgaG93IG11bHRpcGxlIGFubm90YXRpb25zIHdpdGggdGhlIHNhbWUgbmFtZSBhcmUgdG8gYmUgaGFuZGxlZAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLCByZXR1cm4gdGhlIGFubm90YXRpb24uCi0JICovCi0JQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwotCi0JLyoqCi0JICogR2l2ZW4gdGhlIHNwZWNpZmllZCBkZWNsYXJhdGlvbiwgbW9kaWZ5IGl0IHdpdGgKLQkgKiBhIG5ldyBtYXJrZXIgYW5ub3RhdGlvbiwgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBhbm5vdGF0aW9uIGlmIHByZXNlbnQuCi0JICogUmV0dXJuIHRoZSBuZXcgYW5ub3RhdGlvbi4KLQkgKi8KLQlNYXJrZXJBbm5vdGF0aW9uIG5ld01hcmtlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLCBtb2RpZnkgaXQgd2l0aAotCSAqIGEgbmV3IHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbiwgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBhbm5vdGF0aW9uIGlmIHByZXNlbnQuCi0JICogUmV0dXJuIHRoZSBuZXcgYW5ub3RhdGlvbi4KLQkgKi8KLQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLCBtb2RpZnkgaXQgd2l0aAotCSAqIGEgbmV3IG5vcm1hbCBhbm5vdGF0aW9uLCByZXBsYWNpbmcgdGhlIG9yaWdpbmFsIGFubm90YXRpb24gaWYgcHJlc2VudC4KLQkgKiBSZXR1cm4gdGhlIG5ldyBhbm5vdGF0aW9uLgotCSAqLwotCU5vcm1hbEFubm90YXRpb24gbmV3Tm9ybWFsQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgYW5ub3RhdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQgZGVjbGFyYXRpb24uCi0JICovCi0Jdm9pZCByZW1vdmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwotCi0JLyoqCi0JICogR2l2ZW4gdGhlIHNwZWNpZmllZCBkZWNsYXJhdGlvbiwgcmV0dXJuIHRoZSBBU1Qgbm9kZQotCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFubm90YXRpb24uCi0JICogSWYgdGhlIGFubm90YXRpb24gaXMgbWlzc2luZywgcmV0dXJuIGl0cyBwYXJlbnQgbm9kZS4KLQkgKi8KLQlBU1ROb2RlIGdldEFzdE5vZGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0RlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWFlMWE2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0RlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotCi0vKioKLSAqIFByb3ZpZGUgY2xpZW50cyB3aXRoIGEgcGx1Z2dhYmxlIHdheSB0byBtYW5pcHVsYXRlIGFuCi0gKiBhbm5vdGF0aW9uIGVsZW1lbnQgbW9kaWZ5aW5nIGEgImRlY2xhcmF0aW9uIi4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgdG8gYmUgcGFzc2VkIHRvIGFuZCByZXR1cm5lZCBieSB0aGUgYWRhcHRlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+IHsKLQotCS8qKgotCSAqIFJlZHVjZSB0aGUgbnVtYmVyIG9mIE5MUyB3YXJuaW5ncy4KLQkgKi8KLQlTdHJpbmcgVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZQotCSAqIGFubm90YXRpb24gZWxlbWVudC4gUmV0dXJuIG51bGwgb3IgYW4gZW1wdHkgYXJyYXkKLQkgKiBpZiB0aGUgZWxlbWVudCBpcyBub3QgcHJlc2VudC4KLQkgKi8KLQlUIGdldFZhbHVlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwotCi0JLyoqCi0JICogR2l2ZW4gdGhlIHNwZWNpZmllZCBkZWNsYXJhdGlvbiwgc2V0IHRoZSB2YWx1ZSBvZiB0aGUKLQkgKiBhbm5vdGF0aW9uIGVsZW1lbnQuIFNldHRpbmcgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50Ci0JICogdG8gbnVsbCB3aWxsIGNhdXNlIHRoZSBlbGVtZW50IHRvIGJlIHJlbW92ZWQgZnJvbSBpdHMKLQkgKiBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgc2V0VmFsdWUoVCB2YWx1ZSwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLCByZXR1cm4gdGhlIGVsZW1lbnQncyB2YWx1ZSBleHByZXNzaW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGlzIG5vdCBwcmVzZW50LgotCSAqLwotCUV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKTsKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBzcGVjaWZpZWQgZGVjbGFyYXRpb24sIHJldHVybiB0aGUgQVNUIG5vZGUKLQkgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbGVtZW50J3MgdmFsdWUuCi0JICogSWYgdGhlIGVsZW1lbnQgaXMgbWlzc2luZywgcmV0dXJuIHRoZSBhbm5vdGF0aW9uJ3Mgbm9kZS4KLQkgKi8KLQlBU1ROb2RlIGdldEFzdE5vZGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9FbnVtLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9FbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNjkwYjEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvRW51bS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bURlY2xhcmF0aW9uOwotCi0vKioKLSAqIEVudW06IHNvbWUgY292YXJpYW50IG92ZXJyaWRlcyBwbHVzIGVudW1Db25zdGFudHMKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVudW0gZXh0ZW5kcyBBYnN0cmFjdFR5cGUgewotCi0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCUVudW1EZWNsYXJhdGlvbiBnZXRCb2R5RGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbnVtJ3MgY29uc3RhbnRzCi0JICovCi0JRW51bUNvbnN0YW50RGVjbGFyYXRpb25bXSBnZXRFbnVtQ29uc3RhbnRzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvRW51bUNvbnN0YW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9FbnVtQ29uc3RhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg2OTNkNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9FbnVtQ29uc3RhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bUNvbnN0YW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklWYXJpYWJsZUJpbmRpbmc7Ci0KLS8qKgotICogRW51bSBjb25zdGFudHMgYXJlIHBhcnQgb2YgRW51bXMKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVudW1Db25zdGFudCBleHRlbmRzIE1lbWJlciB7Ci0KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCUlWYXJpYWJsZUJpbmRpbmcgZ2V0QmluZGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBDb3ZhcmlhbnQgb3ZlcnJpZGUuCi0JICovCi0JRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZ2V0Qm9keURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDc1NjA5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLQotLyoqCi0gKiBEZWZpbmUgdGhlIHByb3RvY29sIGZvciBjb252ZXJ0aW5nIGFuIEFTVCBleHByZXNzaW9uIGJhY2sgYW5kIGZvcnRoCi0gKiBmcm9tIGFuIGFyYml0cmFyeSB0eXBlIChlLmcuIFN0cmluZ0xpdGVyYWwgPD0+IFN0cmluZykuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHBhcmFtIDxUPiB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZCB0byBhbmQgZnJvbSBhbiBleHByZXNzaW9uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXhwcmVzc2lvbkNvbnZlcnRlcjxUPiB7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIGFuCi0JICogZXhwcmVzc2lvbiB0aGF0IGlzIG93bmVkIGJ5IHRoZSBzcGVjaWZpZWQgQVNULgotCSAqIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBjb250cmFjdCBzcGVjaWZpZWQgYnkgdGhlIGNsaWVudC4KLQkgKi8KLQlFeHByZXNzaW9uIGNvbnZlcnQoVCBvYmplY3QsIEFTVCBhc3QpOwotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24gdG8gYW4gb2JqZWN0IG9mIHNvbWUKLQkgKiBwcmUtZGV0ZXJtaW5lZCB0eXBlLgotCSAqLwotCVQgY29udmVydChFeHByZXNzaW9uIGV4cHJlc3Npb24pOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvRmllbGRBdHRyaWJ1dGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0ZpZWxkQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMDE0YWMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvRmllbGRBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRmllbGREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVZhcmlhYmxlQmluZGluZzsKLQotLyoqCi0gKiBGaWVsZCBhdHRyaWJ1dGU6IGp1c3Qgc29tZSBjb3ZhcmlhbnQgb3ZlcnJpZGVzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmllbGRBdHRyaWJ1dGUgZXh0ZW5kcyBBdHRyaWJ1dGUgewotCi0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCUlWYXJpYWJsZUJpbmRpbmcgZ2V0QmluZGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBDb3ZhcmlhbnQgb3ZlcnJpZGUuCi0JICovCi0JRmllbGREZWNsYXJhdGlvbiBnZXRCb2R5RGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0luZGV4ZWRBbm5vdGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTVlOWNiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0luZGV4ZWRBbm5vdGF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQ7Ci0KLQotLyoqCi0gKiBBZGFwdCBhbiBpbmRleGVkIEphdmEgYW5ub3RhdGlvbiB3aXRoIGEgc2ltcGxlLXRvLXVzZSBpbnRlcmZhY2UuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBBbm5vdGF0aW9uQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYW5ub3RhdGlvbiBpcyBzaXR1YXRlZC4KLQkgKi8KLQlpbnQgZ2V0SW5kZXgoKTsKLQotCS8qKgotCSAqIE1vdmUgdGhlIGFubm90YXRpb24gdG8gdGhlIHNwZWNpZmllZCBpbmRleCwgbGVhdmluZyBpdHMgb3JpZ2luYWwKLQkgKiBwb3NpdGlvbiBjbGVhcmVkIG91dC4KLQkgKi8KLQl2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBuZXdJbmRleCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0luZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzhmMjFlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0luZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdDsKLQotCi0vKioKLSAqIEFsbG93IGNsaWVudHMgdG8gbWFuaXB1bGF0ZSBhbiBhbm5vdGF0aW9uIHdpdGhpbiBhbiBhcnJheSBvZiBhbm5vdGF0aW9ucy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGV4dGVuZHMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYW5ub3RhdGlvbiBpcyBzaXR1YXRlZC4KLQkgKi8KLQlpbnQgZ2V0SW5kZXgoKTsKLQotCS8qKgotCSAqIE1vdmUgdGhlIGFubm90YXRpb24gdG8gdGhlIHNwZWNpZmllZCBpbmRleCwgbGVhdmluZyBpdHMgb3JpZ2luYWwKLQkgKiBwb3NpdGlvbiBjbGVhcmVkIG91dC4KLQkgKi8KLQl2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBuZXdJbmRleCwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0luZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMmUwOTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotCi0vKioKLSAqIFByb3ZpZGUgY2xpZW50cyB3aXRoIGEgcGx1Z2dhYmxlIHdheSB0byBtYW5pcHVsYXRlIGFuIDxlbT5pbmRleGVkPC9lbT4KLSAqIGFubm90YXRpb24gZWxlbWVudCBtb2RpZnlpbmcgYSAiZGVjbGFyYXRpb24iLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBwYXJhbSA8VD4gdGhlIHR5cGUgb2YgdGhlIG9iamVjdHMgaW4gdGhlIGFycmF5IHRvIGJlIHBhc3NlZCB0byBhbmQgcmV0dXJuZWQKLSAqIGJ5IHRoZSBhZGFwdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+Ci0JZXh0ZW5kcyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUW10+Ci17Ci0JLyoqCi0JICogR2l2ZW4gdGhlIHNwZWNpZmllZCBkZWNsYXJhdGlvbiwgcmV0dXJuIHRoZSBleHByZXNzaW9uIGF0IHRoZSBzcGVjaWZpZWQKLQkgKiBpbmRleC4KLQkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZQotCSAqLwotCUV4cHJlc3Npb24gc2VsZWN0RXhwcmVzc2lvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgaW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvSW5kZXhlZEV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0luZGV4ZWRFeHByZXNzaW9uQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ODliYzYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvSW5kZXhlZEV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotCi0vKioKLSAqIEEgdHlwZSBvZiB7QGxpbmsgRXhwcmVzc2lvbkNvbnZlcnRlcn0gdGhhdCBjYW4gZnVydGhlciByZXRyaWV2ZSBzdWItZXhwcmVzc2lvbnMKLSAqIGJhc2VkIG9uIGluZGljZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJbmRleGVkRXhwcmVzc2lvbkNvbnZlcnRlcjxUPgotCWV4dGVuZHMgRXhwcmVzc2lvbkNvbnZlcnRlcjxUW10+Ci17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBleHByZXNzaW9uIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBleHByZXNzaW9uLgotCSAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKLQkgKi8KLQlFeHByZXNzaW9uIHNlbGVjdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uLCBpbnQgaW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvTWVtYmVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9NZW1iZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI5ZjM5OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9NZW1iZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLQotLyoqCi0gKiBEYWxpIG1hbmlwdWxhdGVzIGFubm90YXRpb25zIG9uIG1lbWJlcnMgKHR5cGVzLCBmaWVsZHMsIGFuZCBtZXRob2RzKS4KLSAqIFRoaXMgaW50ZXJmYWNlIHNpbXBsaWZpZXMgdGhvc2UgbWFuaXB1bGF0aW9ucy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1lbWJlciBleHRlbmRzIEFubm90YXRlZEVsZW1lbnQgewotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1lbWJlciBpcyBwZXJzaXN0YWJsZS4KLQkgKi8KLQlib29sZWFuIGlzUGVyc2lzdGFibGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1lbWJlciBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgbWVtYmVyCi0JICogYW5kIG9jY3VycmVuY2UuCi0JICovCi0JYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBtZW1iZXJOYW1lLCBpbnQgb2NjdXJyZW5jZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L01ldGhvZEF0dHJpYnV0ZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvTWV0aG9kQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlY2E5M2QuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvTWV0aG9kQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklNZXRob2RCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuTWV0aG9kU2lnbmF0dXJlOwotCi0vKioKLSAqIE1ldGhvZCBhdHRyaWJ1dGU6IGp1c3Qgc29tZSBjb3ZhcmlhbnQgb3ZlcnJpZGVzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kQXR0cmlidXRlIGV4dGVuZHMgQXR0cmlidXRlIHsKLQotCS8qKgotCSAqIENvdmFyaWFudCBvdmVycmlkZS4KLQkgKi8KLQlJTWV0aG9kQmluZGluZyBnZXRCaW5kaW5nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIENvdmFyaWFudCBvdmVycmlkZS4KLQkgKi8KLQlNZXRob2REZWNsYXJhdGlvbiBnZXRCb2R5RGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCBiZSB1c2VkIGluc3RlYWQgb2YgTWVtYmVyI21hdGNoZXMoU3RyaW5nLCBpbnQpLgotCSAqLwotCWJvb2xlYW4gbWF0Y2hlcyhNZXRob2RTaWduYXR1cmUgc2lnbmF0dXJlLCBpbnQgb2NjdXJyZW5jZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L01vZGlmaWVkRGVjbGFyYXRpb24uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L01vZGlmaWVkRGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMxZTUzOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9Nb2RpZmllZERlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIERlZmluZSBhIHdyYXBwZXIgdGhhdCBwcm92aWRlcyBhIGNvbW1vbiBwcm90b2NvbCBmb3IgYWxsIHRoZSB2YXJpb3VzIEFTVAotICogZGVjbGFyYXRpb25zIHRoYXQgaGF2ZSBtb2RpZmllcnMgKGkuZS4gdGhlcmUgYXJlIGEgbnVtYmVyIG9mIEFTVCBub2RlCi0gKiBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IHRoZSBtZXRob2QgI21vZGlmaWVycygpLCBidXQgdGhleSBkbyBub3QgaW1wbGVtZW50Ci0gKiBhIGNvbW1vbiBpbnRlcmZhY2UpOgotICogICAgIEJvZHlEZWNsYXJhdGlvbgotICogICAgIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24KLSAqICAgICBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbgotICogICAgIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGlmaWVkRGVjbGFyYXRpb24gewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZGVjbGFyYXRpb24iIEFTVCBub2RlLgotCSAqLwotCUFTVE5vZGUgZ2V0RGVjbGFyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgImRlY2xhcmF0aW9uIiBBU1QuCi0JICovCi0JQVNUIGdldEFzdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAqZmlyc3QqIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGRlY2xhcmF0aW9uIGhhcyBubyBzdWNoIGFubm90YXRpb24uCi0JICovCi0JQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uTmFtZWQoU3RyaW5nIGFubm90YXRpb25OYW1lKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgKmZpcnN0KiBhbm5vdGF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGZyb20gdGhlIGRlY2xhcmF0aW9uLgotCSAqLwotCXZvaWQgcmVtb3ZlQW5ub3RhdGlvbk5hbWVkKFN0cmluZyBhbm5vdGF0aW9uTmFtZSk7Ci0KLQkvKioKLQkgKiBSZXBsYWNlIHRoZSBzcGVjaWZpZWQgb2xkIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5ldyBhbm5vdGF0aW9uLgotCSAqIElmIHRoZXJlIGlzIG5vIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIHNpbXBseSBhZGQgdGhlIG5ldwotCSAqIGFubm90YXRpb24gdG8gdGhlIGRlY2xhcmF0aW9uJ3MgbW9kaWZpZXJzLgotCSAqLwotCXZvaWQgcmVwbGFjZUFubm90YXRpb25OYW1lZChTdHJpbmcgb2xkQW5ub3RhdGlvbk5hbWUsIEFubm90YXRpb24gbmV3QW5ub3RhdGlvbik7Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpbXBvcnQgdG8gdGhlIGRlY2xhcmF0aW9uJ3MgY29tcGlsYXRpb24gdW5pdC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYXBwcm9wcmlhdGUgaW1wb3J0IHdhcyBhZGRlZCB0byBvciBhbHJlYWR5IHByZXNlbnQgaW4KLQkgKiB0aGUgZGVjbGFyYXRpb24ncyBjb21waWxhdGlvbiB1bml0IChpLmUuIHRoZSBzcGVjaWZpZWQgY2xhc3MgY2FuIGJlCi0JICogc3Vic2VxdWVudGx5IHJlZmVyZW5jZWQgdXNpbmcgYSAic2hvcnQiIG5hbWUpLgotCSAqIEFsc28gcmV0dXJuIHRydWUgaWYgYW4gaW1wb3J0IHdhcyB1bm5lY2Vzc2FyeSAoaS5lLiB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogaXMgcGFydCBvZiB0aGUgImRlZmF1bHQiIHBhY2thZ2UpLgotCSAqIFRoaXMgZG9lcyBub3Qgc3VwcG9ydCBhZGRpbmcgYSAid2lsZGNhcmQiIGltcG9ydCAoZS5nLiAiamF2YS51dGlsLioiKS4KLQkgKi8KLQlib29sZWFuIGFkZEltcG9ydChTdHJpbmcgY2xhc3NOYW1lKTsKLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIHN0YXRpYyBpbXBvcnQgdG8gdGhlIGRlY2xhcmF0aW9uJ3MgY29tcGlsYXRpb24gdW5pdC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYXBwcm9wcmlhdGUgaW1wb3J0IHdhcyBhZGRlZCB0byBvciBhbHJlYWR5IHByZXNlbnQgaW4KLQkgKiB0aGUgZGVjbGFyYXRpb24ncyBjb21waWxhdGlvbiB1bml0IChpLmUuIHRoZSBzcGVjaWZpZWQgY29uc3RhbnQgY2FuIGJlCi0JICogc3Vic2VxdWVudGx5IHJlZmVyZW5jZWQgdXNpbmcgYSAic2hvcnQiIG5hbWUpLgotCSAqIEFsc28gcmV0dXJuIHRydWUgaWYgYW4gaW1wb3J0IHdhcyB1bm5lY2Vzc2FyeSAoaS5lLiB0aGUgc3BlY2lmaWVkIGVudW0KLQkgKiBpcyBwYXJ0IG9mIHRoZSAiZGVmYXVsdCIgcGFja2FnZSkuCi0JICogVGhpcyBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZyBhICJ3aWxkY2FyZCIgaW1wb3J0IChlLmcuICJqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS4qIikuCi0JICovCi0JYm9vbGVhbiBhZGRTdGF0aWNJbXBvcnQoU3RyaW5nIGVudW1Db25zdGFudE5hbWUpOwotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaW1wb3J0IHRvIHRoZSBkZWNsYXJhdGlvbidzIGNvbXBpbGF0aW9uIHVuaXQuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGFwcHJvcHJpYXRlIGltcG9ydCB3YXMgYWRkZWQgdG8gb3IgYWxyZWFkeSBwcmVzZW50IGluCi0JICogdGhlIGRlY2xhcmF0aW9uJ3MgY29tcGlsYXRpb24gdW5pdCAoaS5lLiB0aGUgc3BlY2lmaWVkIG5hbWUgY2FuIGJlCi0JICogc3Vic2VxdWVudGx5IHJlZmVyZW5jZWQgdXNpbmcgYSAic2hvcnQiIG5hbWUpLgotCSAqIEFsc28gcmV0dXJuIHRydWUgaWYgYW4gaW1wb3J0IHdhcyB1bm5lY2Vzc2FyeSAoaS5lLiB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogb3IgZW51bSBpcyBwYXJ0IG9mIHRoZSAiZGVmYXVsdCIgcGFja2FnZSkuCi0JICogVGhpcyBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZyBhICJ3aWxkY2FyZCIgaW1wb3J0IChlLmcuICJqYXZhLnV0aWwuKiIpLgotCSAqLwotCWJvb2xlYW4gYWRkSW1wb3J0KFN0cmluZyBpbXBvcnROYW1lLCBib29sZWFuIHN0YXRpY18pOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIGhhcyB0aGUgc3BlY2lmaWVkCi0JICogKGZ1bGx5LXF1YWxpZmllZCkgbmFtZSB3aXRoaW4gdGhlIGRlY2xhcmF0aW9uJ3MgY29udGV4dDsgaS5lLiBhdHRlbXB0Ci0JICogdG8gcmVzb2x2ZSB0aGUgYW5ub3RhdGlvbidzIG5hbWUgKHVzaW5nIGltcG9ydHMgZXRjLikgYW5kIHJldHVybgotCSAqIHdoZXRoZXIgaXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JYm9vbGVhbiBhbm5vdGF0aW9uSXNOYW1lZChBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBuYW1lKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvVHlwZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTNhNmE1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotCi0vKioKLSAqIFR5cGU6IG5lc3RlZFR5cGVzLCBuZXN0ZWRFbnVtcywgZmllbGRzLCBhbmQgbWV0aG9kcy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFR5cGUgZXh0ZW5kcyBBYnN0cmFjdFR5cGUgewotCi0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCVR5cGVEZWNsYXJhdGlvbiBnZXRCb2R5RGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlJ3MgbmVzdGVkIHR5cGVzIChkb2VzIG5vdCBpbmNsdWRlIGFubm90YXRpb25zIG9yIGVudW1zKS4KLQkgKi8KLQlUeXBlRGVjbGFyYXRpb25bXSBnZXRUeXBlcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUncyBuZXN0ZWQgZW51bXMuCi0JICovCi0JRW51bURlY2xhcmF0aW9uW10gZ2V0RW51bXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlJ3MgZmllbGRzLgotCSAqLwotCUZpZWxkRGVjbGFyYXRpb25bXSBnZXRGaWVsZHMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlJ3MgbWV0aG9kcy4KLQkgKi8KLQlNZXRob2REZWNsYXJhdGlvbltdIGdldE1ldGhvZHMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5jdnNpZ25vcmUgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5wcm9qZWN0IGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQyN2NhMC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2E1MzEyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lmh0bWwgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjA2YjEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5pbmkgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMxMDdkNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAidGlwc0FuZFRyaWNrc0hyZWYiIGNvbnRhaW5zIHRoZSBIZWxwIHRvcGljIGhyZWYgdG8gYSB0aXBzIGFuZCB0cmlja3MgcGFnZSAKLSMgb3B0aW9uYWwKLXRpcHNBbmRUcmlja3NIcmVmPS9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bQotCi0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjlmNjllLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgQ29tbW9uXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBPcmFjbGUgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAxMS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMjBlM2IuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2NvbXBvbmVudC54bWwgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MzNkMjUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZy9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZyI+Ci08ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+Ci08Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZyIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA5YzJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWE3OWYyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBDb21tb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvLmNsYXNzcGF0aCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDI2OTBmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0ibm9uYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJub25hY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJub25hY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9Im5vbmFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLy5jdnNpZ25vcmUgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLy5wcm9qZWN0IGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTc5YmQ5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMyMjA0My4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDY6MzEgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZDJkMGIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS5KcHRDb21tb25FY2xpcHNlTGlua0NvcmVQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjcuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjQuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjYwMCwyLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbDsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmxpYnZhbDsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZSIKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9hYm91dC5odG1sIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVlY2JiOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgc2NoZW1hcy8KLXNyYy5pbmNsdWRlcyA9IHNjaGVtYXMvCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzODY1ZDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gQ29tbW9uIEVjbGlwc2VMaW5rIENvcmUKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvcGx1Z2luLnhtbCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDNmOTI2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy40Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotCi0gIENvbnRyaWJ1dG9yczoKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAtLT4KLSAKLTxwbHVnaW4+Ci0JCi0JPCEtLQotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSogTGlicmFyeSBQcm92aWRlciBGcmFtZXdvcmsgSW50ZWdyYXRpb24gKgotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCS0tPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmRvd25sb2FkYWJsZUxpYnJhcmllcyI+Ci0JCQotCQk8aW1wb3J0LWRlZmluaXRpb25zIAotCQkJdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2RhbGkvZGV2L2VjbGlwc2VsaW5rL2VjbGlwc2VsaW5rLWRvd25sb2FkYWJsZS1saWJzLnhtbCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0icmVxdWVzdGluZ1Byb2plY3RGYWNldCI+Ci0JCQkJCTxvcj4KLQkJCQkJCTx0ZXN0IAotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIAotCQkJCQkJCXZhbHVlPSJqcHQuamF4YiIgCi0JCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIi8+Ci0JCQkJCQk8dGVzdCAKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IiAKLQkJCQkJCQl2YWx1ZT0ianB0LmpwYSIgCi0JCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIi8+Ci0JCQkJCTwvb3I+CQotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9pbXBvcnQtZGVmaW5pdGlvbnM+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTwhLS0KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIEVjbGlwc2VMaW5rIHNjaGVtYXMgICAgICAgICAgICAgICAgICAgICoKLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQktLT4KLQkKLQk8ZXh0ZW5zaW9uIAotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNhdGFsb2dDb250cmlidXRpb25zIj4KLQkJCi0JCTxjYXRhbG9nQ29udHJpYnV0aW9uIGlkPSJkZWZhdWx0Ij4KLQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMV8wLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzFfMC54c2QiLz4KLQkJCQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMV8xLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzFfMS54c2QiLz4KLQkJCQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMV8yLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzFfMi54c2QiLz4KLQkJCQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMl8wLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMC54c2QiLz4KLQkJCQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMl8xLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMS54c2QiLz4KLQkJCQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMl8yLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMi54c2QiLz4KLQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMl8zLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMy54c2QiLz4KLQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMl80LnhzZCIKLQkJCQl1cmk9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhL29yZy9lY2xpcHNlL3BlcnNpc3RlbmNlL2pwYS9lY2xpcHNlbGlua19vcm1fMl80LnhzZCIvPgotCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX294bV8yXzAueHNkIgotCQkJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19veG1fMl8wLnhzZCIvPgotCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX294bV8yXzEueHNkIgotCQkJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19veG1fMl8xLnhzZCIvPgotICAgCQkJCi0gICAJCQk8dXJpCi0gICAgICAgICAJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19veG1fMl8yLnhzZCIKLSAgICAgICAgIAkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX294bV8yXzIueHNkIi8+Ci0KLQkJCTx1cmkKLSAgICAgICAgIAkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX294bV8yXzMueHNkIgotICAgICAgICAgCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3htXzJfMy54c2QiLz4KLQotCQkJPHVyaQotICAgICAgICAgCQluYW1lPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfb3htXzJfNC54c2QiCi0gICAgICAgICAJCXVyaT0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tb3h5L29yZy9lY2xpcHNlL3BlcnNpc3RlbmNlL2pheGIvZWNsaXBzZWxpbmtfb3htXzJfNC54c2QiLz4KLQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMS4wLnhzZCIKLQkJCQl1cmk9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29yZS9vcmcvZWNsaXBzZS9wZXJzaXN0ZW5jZS9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMS4wLnhzZCIvPgotCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8xLjEueHNkIgotCQkJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMS4xLnhzZCIvPgotCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8xLjIueHNkIgotCQkJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMS4yLnhzZCIvPgotCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8yLjAueHNkIgotCQkJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMi4wLnhzZCIvPgotCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8yLjMueHNkIgotCQkJCXVyaT0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb3JlL29yZy9lY2xpcHNlL3BlcnNpc3RlbmNlL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8yLjMueHNkIi8+Ci0JCQkKLQkJCTx1cmkKLQkJCQluYW1lPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfc2Vzc2lvbnNfMS4wLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfc2Vzc2lvbnNfMS4wLnhzZCIvPgotCQkJCQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19zZXNzaW9uc18xLjEueHNkIgotCQkJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19zZXNzaW9uc18xLjEueHNkIi8+CQotCQkJCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMi54c2QiCi0JCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMi54c2QiLz4KLQkJCQkKLQkJCTx1cmkKLQkJCQluYW1lPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfc2Vzc2lvbnNfMi4wLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfc2Vzc2lvbnNfMi4wLnhzZCIvPgkKLQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19zZXNzaW9uc18yLjEueHNkIgotCQkJCXVyaT0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb3JlL29yZy9lY2xpcHNlL3BlcnNpc3RlbmNlL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzIuMS54c2QiLz4JCi0JCQkKLQkJPC9jYXRhbG9nQ29udHJpYnV0aW9uPgotCQkKLSAgICA8L2V4dGVuc2lvbj4KLQkKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3Byb3BlcnR5X2ZpbGVzL2pwdF9jb21tb25fZWNsaXBzZWxpbmtfY29yZS5wcm9wZXJ0aWVzIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3Byb3BlcnR5X2ZpbGVzL2pwdF9jb21tb25fZWNsaXBzZWxpbmtfY29yZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjdiYTkyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9wcm9wZXJ0eV9maWxlcy9qcHRfY29tbW9uX2VjbGlwc2VsaW5rX2NvcmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1FY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3Jfbm9FY2xpcHNlTGlua1ZlcnNpb249U2VsZWN0ZWQgbGlicmFyaWVzIGRvIG5vdCBpbmNsdWRlIHJlcXVpcmVkIEVjbGlwc2VMaW5rIGFubm90YXRpb24gY2xhc3Nlcy4KLUVjbGlwc2VMaW5rTGlicmFyeVZhbGlkYXRvcl9tdWx0aXBsZUVjbGlwc2VMaW5rVmVyc2lvbnM9VGhlcmUgYXJlIG11bHRpcGxlIHZlcnNpb25zIG9mIEVjbGlwc2VMaW5rIGluIHNlbGVjdGVkIGxpYnJhcmllcy4KLUVjbGlwc2VMaW5rTGlicmFyeVZhbGlkYXRvcl9pbXByb3BlckVjbGlwc2VMaW5rVmVyc2lvbj1FY2xpcHNlTGluayB2ZXJzaW9uIGRvZXMgbm90IG1lZXQgcGxhdGZvcm0gcmVxdWlyZW1lbnRzLgotCi1FTEpheGJVc2VyTGlicmFyeVZhbGlkYXRvcl9ub1hqY0NsYXNzZXM9Q2xhc3MgZ2VuZXJhdGlvbiBtYXkgbm90IGJlIGF2YWlsYWJsZSBpZiBjb20uc3VuLnRvb2xzLnhqYyBhbmQgY29tLnN1bi54bWwuYmluZCBqYXJzIGFyZSBub3Qgb24gcHJvamVjdCBjbGFzc3BhdGguCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMV8wLnhzZCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjFkMWRhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzEyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBvYmplY3QtcmVsYXRpb25hbCBtYXBwaW5nIGZpbGUgc2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6b3JtPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLSAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiAKLSAgdmVyc2lvbj0iMS4wIj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWVjbGlwc2VsaW5rX29ybV8xXzAueHNkIDEuMCAgRmVicnVhcnkgMSAyMDA4Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOmRvY3VtZW50YXRpb24+PCFbQ0RBVEFbCi0KLSAgICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgbmV3IG5hdGl2ZSBFY2xpcHNlTGluayBYTUwgbWV0YWRhdGEKLSAgICAgICBmb3JtYXQgdXNlZCBmb3IgSlBBIGFuZCBuYXRpdmUgZGVwbG95bWVudCB4bWwgZmlsZXMuIAotCi0gICAgIF1dPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiLz4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idmVyc2lvblR5cGUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWzAtOV0rKFwuWzAtOV0rKSoiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1tYXBwaW5ncyI+Ci0gICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbnRpdHktbWFwcGluZ3MgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGFuIG1hcHBpbmcKLSAgICAgICAgZmlsZS4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmb3VyIHR5cGVzIG9mIGVsZW1lbnRzOgotCi0gICAgICAgIDEuIFRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgY29udGFpbnMgbWV0YWRhdGEKLSAgICAgICAgZm9yIHRoZSBlbnRpcmUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIGlmIHRoaXMgZWxlbWVudAotICAgICAgICBvY2N1cnMgaW4gbXVsdGlwbGUgbWFwcGluZyBmaWxlcyB3aXRoaW4gdGhlIHNhbWUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgCi0gICAgICAgIDIuIFRoZSBwYWNrYWdlLCBzY2hlbWEsIGNhdGFsb2cgYW5kIGFjY2VzcyBlbGVtZW50cyBhcHBseSB0byBhbGwgb2YKLSAgICAgICAgdGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZGVmaW5lZCBpbgotICAgICAgICB0aGUgc2FtZSBmaWxlIGluIHdoaWNoIHRoZXkgb2NjdXIuCi0KLSAgICAgICAgMy4gVGhlIHNlcXVlbmNlLWdlbmVyYXRvciwgdGFibGUtZ2VuZXJhdG9yLCBuYW1lZC1xdWVyeSwKLSAgICAgICAgbmFtZWQtbmF0aXZlLXF1ZXJ5IGFuZCBzcWwtcmVzdWx0LXNldC1tYXBwaW5nIGVsZW1lbnRzIGFyZSBnbG9iYWwKLSAgICAgICAgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUKLSAgICAgICAgc2VxdWVuY2UtZ2VuZXJhdG9yIG9yIHRhYmxlLWdlbmVyYXRvciBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lCi0gICAgICAgIG9yIGRpZmZlcmVudCBtYXBwaW5nIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgYWxzbyAKLSAgICAgICAgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBuYW1lZC1xdWVyeSBvciBuYW1lZC1uYXRpdmUtcXVlcnkKLSAgICAgICAgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZSBvciBkaWZmZXJlbnQgbWFwcGluZyBmaWxlcyBpbiBhIAotICAgICAgICBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgIDQuIFRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGVhY2ggZGVmaW5lCi0gICAgICAgIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciBhIG1hbmFnZWQgcGVyc2lzdGVudCBjbGFzcy4gVGhlIG1hcHBpbmcKLSAgICAgICAgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZXNlIGVsZW1lbnRzIG1heSBiZSBjb21wbGV0ZSBvciBpdCBtYXkKLSAgICAgICAgYmUgcGFydGlhbC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIgCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFja2FnZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgICAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiIHR5cGU9Im9ybTptYXBwZWQtc3VwZXJjbGFzcyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiIHR5cGU9Im9ybTplbnRpdHkiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkYWJsZSIgdHlwZT0ib3JtOmVtYmVkZGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvblR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgZml4ZWQ9IjEuMCIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICA8L3hzZDplbGVtZW50PgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBNZXRhZGF0YSB0aGF0IGFwcGxpZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYW5kIG5vdCBqdXN0IHRvIAotICAgICAgICB0aGUgbWFwcGluZyBmaWxlIGluIHdoaWNoIGl0IGlzIGNvbnRhaW5lZC4gCi0KLSAgICAgICAgSWYgdGhlIHhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIGVsZW1lbnQgaXMgc3BlY2lmaWVkIHRoZW4gCi0gICAgICAgIHRoZSBjb21wbGV0ZSBzZXQgb2YgbWFwcGluZyBtZXRhZGF0YSBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQgCi0gICAgICAgIGlzIGNvbnRhaW5lZCBpbiB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+ICAgICAgICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlc2UgZGVmYXVsdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXMgYSB3aG9sZSAKLSAgICAgICAgdW5sZXNzIHRoZXkgYXJlIG92ZXJyaWRkZW4gYnkgbG9jYWwgYW5ub3RhdGlvbiBvciBYTUwgCi0gICAgICAgIGVsZW1lbnQgc2V0dGluZ3MuIAotICAgICAgICAKLSAgICAgICAgc2NoZW1hIC0gVXNlZCBhcyB0aGUgc2NoZW1hIGZvciBhbGwgdGFibGVzIG9yIHNlY29uZGFyeSB0YWJsZXMKLSAgICAgICAgICAgIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2F0YWxvZyAtIFVzZWQgYXMgdGhlIGNhdGFsb2cgZm9yIGFsbCB0YWJsZXMgb3Igc2Vjb25kYXJ5IHRhYmxlcwotICAgICAgICAgICAgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBhY2Nlc3MgLSBVc2VkIGFzIHRoZSBhY2Nlc3MgdHlwZSBmb3IgYWxsIG1hbmFnZWQgY2xhc3NlcyBpbgotICAgICAgICAgICAgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2FzY2FkZS1wZXJzaXN0IC0gQWRkcyBjYXNjYWRlLXBlcnNpc3QgdG8gdGhlIHNldCBvZiBjYXNjYWRlIG9wdGlvbnMKLSAgICAgICAgICAgIGluIGVudGl0eSByZWxhdGlvbnNoaXBzIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGVudGl0eS1saXN0ZW5lcnMgLSBMaXN0IG9mIGRlZmF1bHQgZW50aXR5IGxpc3RlbmVycyB0byBiZSBpbnZva2VkIAotICAgICAgICAgICAgb24gZWFjaCBlbnRpdHkgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYW4gZW50aXR5LiBJcyBhbGxvd2VkIHRvIGJlCi0gICAgICAgIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBhbm5vdGF0aW9ucy4KLSAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byAKLSAgICAgICAgaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBvbiB0aGUgZW50aXR5IGNsYXNzIChhbmQgaXRzIGZpZWxkcwotICAgICAgICBvciBwcm9wZXJ0aWVzKSBhcmUgdG8gYmUgcHJvY2Vzc2VkLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gCi0gICAgICAgIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIGZvciB0aGUgZW50aXR5IGFuZCBpdHMgc3ViZWxlbWVudHMgd2lsbCAKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUiIHR5cGU9Im9ybTp0YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIiB0eXBlPSJvcm06c2Vjb25kYXJ5LXRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaGVyaXRhbmNlIiB0eXBlPSJvcm06aW5oZXJpdGFuY2UiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXZhbHVlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgICAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06c3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGVzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBlbnRpdHkgZmllbGQgb3IgcHJvcGVydHkgbWFwcGluZ3MuCi0gICAgICAgIEl0IG1heSBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgdG8gaW5jbHVkZSBvbmx5IGEgc3Vic2V0IG9mIHRoZQotICAgICAgICBmaWVsZHMgb3IgcHJvcGVydGllcy4gSWYgbWV0YWRhdGEtY29tcGxldGUgZm9yIHRoZSBlbnRpdHkgaXMgdHJ1ZQotICAgICAgICB0aGVuIHRoZSByZW1haW5kZXIgb2YgdGhlIGF0dHJpYnV0ZXMgd2lsbCBiZSBkZWZhdWx0ZWQgYWNjb3JkaW5nCi0gICAgICAgIHRvIHRoZSBkZWZhdWx0IHJ1bGVzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9Im9ybTppZCIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRlZC1pZCIgdHlwZT0ib3JtOmVtYmVkZGVkLWlkIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljIiB0eXBlPSJvcm06YmFzaWMiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljLWNvbGxlY3Rpb24iIHR5cGU9Im9ybTpiYXNpYy1jb2xsZWN0aW9uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYy1tYXAiIHR5cGU9Im9ybTpiYXNpYy1tYXAiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW9uZSIgdHlwZT0ib3JtOm1hbnktdG8tb25lIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tbWFueSIgdHlwZT0ib3JtOm9uZS10by1tYW55IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tb25lIiB0eXBlPSJvcm06b25lLXRvLW9uZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZSIgdHlwZT0ib3JtOnZhcmlhYmxlLW9uZS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tbWFueSIgdHlwZT0ib3JtOm1hbnktdG8tbWFueSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkIiB0eXBlPSJvcm06ZW1iZWRkZWQiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zZm9ybWF0aW9uIiB0eXBlPSJvcm06dHJhbnNmb3JtYXRpb24iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zaWVudCIgdHlwZT0ib3JtOnRyYW5zaWVudCIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iYWNjZXNzLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgZGV0ZXJtaW5lcyBob3cgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIGFjY2Vzc2VzIHRoZQotICAgICAgICBzdGF0ZSBvZiBhbiBlbnRpdHkgb3IgZW1iZWRkZWQgb2JqZWN0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPUEVSVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWxpc3RlbmVycyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eUxpc3RlbmVycyB7Ci0gICAgICAgICAgQ2xhc3NbXSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lciIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktbGlzdGVuZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIGFuIGVudGl0eSBsaXN0ZW5lciB0byBiZSBpbnZva2VkIGF0IGxpZmVjeWNsZSBldmVudHMKLSAgICAgICAgZm9yIHRoZSBlbnRpdGllcyB0aGF0IGxpc3QgdGhpcyBsaXN0ZW5lci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXBlcnNpc3QiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVBlcnNpc3Qge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcGVyc2lzdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFBlcnNpc3Qge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVJlbW92ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RSZW1vdmUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVVwZGF0ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtbG9hZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdExvYWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvcGVydHkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgQSB1c2VyIGRlZmluZWQgbWFwcGluZydzIHByb3BlcnR5LgotCQlAVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBUWVBFfSkKLQkJQFJldGVudGlvbihSVU5USU1FKQotCQlwdWJsaWMgQGludGVyZmFjZSBQcm9wZXJ0eSB7Ci0JCQkvKioKLQkJCSogUHJvcGVydHkgbmFtZS4KLQkJCSovIAotCQkJU3RyaW5nIG5hbWUoKTsKLQkJCQotCQkJLyoqCi0JCQkqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBQcm9wZXJ0eSB2YWx1ZSwKLQkJCSogY29udmVydGVkIHRvIGFuIGluc3RhbmNlIG9mIHZhbHVlVHlwZS4KLQkJCSovIAotCQkJU3RyaW5nIHZhbHVlKCk7Ci0JCQkKLQkJCS8qKgotCQkJKiBQcm9wZXJ0eSB2YWx1ZSB0eXBlLgotCQkJKiBUaGUgdmFsdWUgY29udmVydGVkIHRvIHZhbHVlVHlwZSBieSBDb252ZXJzaW9uTWFuYWdlci4KLQkJCSogSWYgc3BlY2lmaWVkIG11c3QgYmUgYSBzaW1wbGUgdHlwZSB0aGF0IGNvdWxkIGJlIGhhbmRsZWQgYnkgCi0JCQkqIENvbnZlcnNpb25NYW5hZ2VyOiAKLQkJCSogbnVtZXJpY2FsLCBib29sZWFuLCB0ZW1wb3JhbC4gIAotCQkJKi8gCi0JCQlDbGFzcyB2YWx1ZVR5cGUoKSBkZWZhdWx0IFN0cmluZy5jbGFzczsKLQkJfQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktaGludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkgCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFF1ZXJ5SGludCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWROYXRpdmVRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOyAvL25hbWVkIFNxbFJlc3VsdFNldE1hcHBpbmcKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3FsUmVzdWx0U2V0TWFwcGluZyB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBFbnRpdHlSZXN1bHRbXSBlbnRpdGllcygpIGRlZmF1bHQge307Ci0gICAgICAgICAgQ29sdW1uUmVzdWx0W10gY29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LXJlc3VsdCIgdHlwZT0ib3JtOmVudGl0eS1yZXN1bHQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tcmVzdWx0IiB0eXBlPSJvcm06Y29sdW1uLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5UmVzdWx0IHsKLSAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcygpOwotICAgICAgICAgIEZpZWxkUmVzdWx0W10gZmllbGRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQtcmVzdWx0IiB0eXBlPSJvcm06ZmllbGQtcmVzdWx0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZW50aXR5LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQtcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGaWVsZFJlc3VsdCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uLXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uUmVzdWx0IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2Vjb25kYXJ5VGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcGtKb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgIH0KLQotICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuaXF1ZS1jb25zdHJhaW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBVbmlxdWVDb25zdHJhaW50IHsKLSAgICAgICAgICBTdHJpbmdbXSBjb2x1bW5OYW1lcygpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OwotICAgICAgICAgIGludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgcHJlY2lzaW9uCi0gICAgICAgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZ2VuZXJhdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gR2VuZXJhdGlvblR5cGUgeyBUQUJMRSwgU0VRVUVOQ0UsIElERU5USVRZLCBBVVRPIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUJMRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VRVUVOQ0UiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklERU5USVRZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVRPIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWNjZXNzLW1ldGhvZHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEF0dHJpYnV0ZU92ZXJyaWRlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIENvbHVtbiBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZC1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkQ2xhc3MgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiIHR5cGU9Im9ybTpnZW5lcmF0ZWQtdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkLWlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWRJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2llbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUcmFuc2llbnQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZlcnNpb24ge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWMgewotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiIHR5cGU9Im9ybTpsb2IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtdHJhbnNmb3JtZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCQkvKioKLQkJICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotCQkgKiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyB3cml0ZS1vbmx5LCBpdCBzaG91bGQgaGF2ZSBhIAotCQkgKiBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgY29sdW1uKHMpIAotCQkgKiB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotCQkgKiAgCi0JCSAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0JCSAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotCQkgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLQkJICogV3JpdGVUcmFuc2Zvcm1lcikuIAotCQkgKi8gCi0JCUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotCQlAUmV0ZW50aW9uKFJVTlRJTUUpCi0JCXB1YmxpYyBAaW50ZXJmYWNlIFJlYWRUcmFuc2Zvcm1lciB7Ci0JCSAgICAvKioKLQkJICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKLQkJICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5BdHRyaWJ1dGVUcmFuc2Zvcm1lciAKLQkJICAgICAqIGludGVyZmFjZS4gVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkLCBpdHMgCi0JCSAgICAgKiBidWlsZEF0dHJpYnV0ZVZhbHVlIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHZhbHVlIHRvIGJlIAotCQkgICAgICogYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZS4KLQkJICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotCQkgICAgICovIAotCQkgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQkJCi0JCSAgICAvKioKLQkJICAgICAqIFRoZSBtYXBwZWQgY2xhc3MgbXVzdCBoYXZlIGEgbWV0aG9kIHdpdGggdGhpcyBuYW1lIHdoaWNoIHJldHVybnMgCi0JCSAgICAgKiBhIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSBhdHRyaWJ1dGUgKG5vdCBhc3NpZ25zIHRoZSB2YWx1ZSB0byAKLQkJICAgICAqIHRoZSBhdHRyaWJ1dGUpLiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSAKLQkJICAgICAqIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotCQkgICAgICovIAotCQkgICAgU3RyaW5nIG1ldGhvZCgpIGRlZmF1bHQgIiI7Ci0JCX0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCQkvKioKLQkJICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotCQkgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotCQkgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLQkJICogV3JpdGVUcmFuc2Zvcm1lcikuCi0JCSAqICAKLQkJICogQSBzaW5nbGUgV3JpdGVUcmFuc2Zvcm1lciBtYXkgYmUgc3BlY2lmaWVkIGRpcmVjdGx5IG9uIHRoZSBtZXRob2Qgb3IgCi0JCSAqIGF0dHJpYnV0ZS4gTXVsdGlwbGUgV3JpdGVUcmFuc2Zvcm1lcnMgc2hvdWxkIGJlIHdyYXBwZWQgaW50byAKLQkJICogV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbi4gTm8gV3JpdGVUcmFuc2Zvcm1lcnMgc3BlY2lmaWVkIGZvciAKLQkJICogcmVhZC1vbmx5IG1hcHBpbmcuIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IAotCQkgKiBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSAKLQkJICogY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0JCSAqLyAKLQkJQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0JCUBSZXRlbnRpb24oUlVOVElNRSkKLQkJcHVibGljIEBpbnRlcmZhY2UgV3JpdGVUcmFuc2Zvcm1lciB7Ci0JCSAgICAvKioKLQkJICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKLQkJICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5GaWVsZFRyYW5zZm9ybWVyIAotCQkgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyBidWlsZEZpZWxkVmFsdWUgCi0JCSAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIAotCQkgICAgICogY29sdW1uLiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgCi0JCSAgICAgKiBzdXBwb3J0ZWQgdGhlIG1ldGhvZCBidWlsZEZpZWxkVmFsdWUgaW4gdGhlIGNsYXNzIHNob3VsZCBiZSAKLQkJICAgICAqIGRlZmluZWQgdG8gcmV0dXJuIHRoZSByZWxldmFudCBKYXZhIHR5cGUsIG5vdCBqdXN0IE9iamVjdCBhcyAKLQkJICAgICAqIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZSwgZm9yIGluc3RhbmNlOgotCQkgICAgICogcHVibGljIFRpbWUgYnVpbGRGaWVsZFZhbHVlKE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIGZpZWxkTmFtZSwgU2Vzc2lvbiBzZXNzaW9uKS4KLQkJICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotCQkgICAgICovIAotCQkgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQkJCi0JCSAgICAvKioKLQkJICAgICAqIFRoZSBtYXBwZWQgY2xhc3MgbXVzdCBoYXZlIGEgbWV0aG9kIHdpdGggdGhpcyBuYW1lIHdoaWNoIHJldHVybnMgCi0JCSAgICAgKiBhIHZhbHVlIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgZGF0YWJhc2UgY29sdW1uLgotCQkgICAgICogTm90ZSB0aGF0IGZvciBkZGwgZ2VuZXJhdGlvbiBhbmQgcmV0dXJuaW5nIHRvIGJlIHN1cHBvcnRlZCB0aGUgCi0JCSAgICAgKiBtZXRob2Qgc2hvdWxkIGJlIGRlZmluZWQgdG8gcmV0dXJuIGEgcGFydGljdWxhciB0eXBlLCBub3QganVzdCAKLQkJICAgICAqIE9iamVjdCwgZm9yIGluc3RhbmNlOgotCQkgICAgICogcHVibGljIFRpbWUgZ2V0U3RhcnRUaW1lKCkuCi0JCSAgICAgKiBUaGUgbWV0aG9kIG1heSByZXF1aXJlIGEgVHJhbnNpZW50IGFubm90YXRpb24gdG8gYXZvaWQgYmVpbmcgCi0JCSAgICAgKiBtYXBwZWQgYXMgQmFzaWMgYnkgZGVmYXVsdC4KLQkJICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotCQkgICAgICovIAotCQkgICAgU3RyaW5nIG1ldGhvZCgpIGRlZmF1bHQgIiI7Ci0JCQotCQkgICAgLyoqCi0JCSAgICAgKiBTcGVjaWZ5IGhlcmUgdGhlIGNvbHVtbiBpbnRvIHdoaWNoIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbi4KLQkJICAgICAqIFRoZSBvbmx5IGNhc2Ugd2hlbiB0aGlzIGNvdWxkIGJlIHNraXBwZWQgaXMgaWYgYSBzaW5nbGUgCi0JCSAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGFubm90YXRlcyBhbiBhdHRyaWJ1dGUgLSB0aGUgYXR0cmlidXRlJ3MgbmFtZSAKLQkJICAgICAqIHdpbGwgYmUgdXNlZCBhcyBhIGNvbHVtbiBuYW1lLgotCQkgICAgICovIAotCQkgICAgQ29sdW1uIGNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLQkJfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zZm9ybWF0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkJLyoqCi0JCSAqIFRyYW5zZm9ybWF0aW9uIGlzIGFuIG9wdGlvbmFsIGFubm90YXRpb24gZm9yIAotCQkgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0JCSAqIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBhbGxvd3MgdG8gbWFwIGFuIGF0dHJpYnV0ZSB0byBvbmUgb3IgbW9yZSAKLQkJICogZGF0YWJhc2UgY29sdW1ucy4KLQkJICogCi0JCSAqIFRyYW5zZm9ybWF0aW9uIGFubm90YXRpb24gaXMgYW4gb3B0aW9uYWwgcGFydCBvZiAKLQkJICogVHJhbnNmb3JtYXRpb25NYXBwaW5nIGRlZmluaXRpb24uIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIAotCQkgKiB3cml0ZS1vbmx5LCBpdCBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyAKLQkJICogdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0JCSAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0JCSAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotCQkgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLQkJICogV3JpdGVUcmFuc2Zvcm1lcikuIAotCQkgKi8gCi0JCUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotCQlAUmV0ZW50aW9uKFJVTlRJTUUpCi0JCXB1YmxpYyBAaW50ZXJmYWNlIFRyYW5zZm9ybWF0aW9uIHsKLQkJICAgIC8qKgotCQkgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLQkJICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0JCSAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAotCQkgICAgICogdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgCi0JCSAgICAgKiBoaW50IHRvIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCAKLQkJICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgotCQkgICAgICovCi0JCSAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotCQkgICAgCi0JCSAgICAvKioKLQkJICAgICAqIChPcHRpb25hbCkgVGhlIG9wdGlvbmFsIGVsZW1lbnQgaXMgYSBoaW50IGFzIHRvIHdoZXRoZXIgdGhlIHZhbHVlCi0JCSAgICAgKiAgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IG1heSBiZSBudWxsLiBJdCBpcyBkaXNyZWdhcmRlZAotCQkgICAgICogIGZvciBwcmltaXRpdmUgdHlwZXMsIHdoaWNoIGFyZSBjb25zaWRlcmVkIG5vbi1vcHRpb25hbC4KLQkJICAgICAqLwotCQkgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLQkJfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWFkLXRyYW5zZm9ybWVyIiB0eXBlPSJvcm06cmVhZC10cmFuc2Zvcm1lciIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndyaXRlLXRyYW5zZm9ybWVyIiB0eXBlPSJvcm06d3JpdGUtdHJhbnNmb3JtZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZldGNoLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBGZXRjaFR5cGUgeyBMQVpZLCBFQUdFUiB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEFaWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUFHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBMb2Ige30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGVtcG9yYWwgewotICAgICAgICAgIFRlbXBvcmFsVHlwZSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9Im9ybTp0ZW1wb3JhbC10eXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gVGVtcG9yYWxUeXBlIHsKLSAgICAgICAgICBEQVRFLCAvLyBqYXZhLnNxbC5EYXRlCi0gICAgICAgICAgVElNRSwgLy8gamF2YS5zcWwuVGltZQotICAgICAgICAgIFRJTUVTVEFNUCAvLyBqYXZhLnNxbC5UaW1lc3RhbXAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRBVEUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElNRSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FU1RBTVAiLz4KLSAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtZXJhdGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW51bWVyYXRlZCB7Ci0gICAgICAgICAgRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOmVudW0tdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW51bS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRW51bVR5cGUgewotICAgICAgICAgIE9SRElOQUwsCi0gICAgICAgICAgU1RSSU5HCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9SRElOQUwiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUUklORyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvT25lIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4gICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+ICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYXNjYWRlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBDYXNjYWRlVHlwZSB7IEFMTCwgUEVSU0lTVCwgTUVSR0UsIFJFTU9WRSwgUkVGUkVTSH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtYWxsIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW1lcmdlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVtb3ZlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvT25lIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+ICAgICAgIAotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gaW52ZXJzZUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZlcnNlLWpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1tYW55Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgR2VuZXJhdGVkVmFsdWUgewotICAgICAgICAgIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBBVVRPOwotICAgICAgICAgIFN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmdlbmVyYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcmRlci1ieSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQnkgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluaGVyaXRhbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5oZXJpdGFuY2UgewotICAgICAgICAgIEluaGVyaXRhbmNlVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgU0lOR0xFX1RBQkxFOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJpbmhlcml0YW5jZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gSW5oZXJpdGFuY2VUeXBlCi0gICAgICAgICAgeyBTSU5HTEVfVEFCTEUsIEpPSU5FRCwgVEFCTEVfUEVSX0NMQVNTfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJTkdMRV9UQUJMRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk9JTkVEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUJMRV9QRVJfQ0xBU1MiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yVmFsdWUgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIERpc2NyaW1pbmF0b3JUeXBlIHsgU1RSSU5HLCBDSEFSLCBJTlRFR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQVIiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVEVHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByaW1hcnlLZXlKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIkRUWVBFIjsKLSAgICAgICAgICBEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSgpIGRlZmF1bHQgU1RSSU5HOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAzMTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGVtYmVkZGFibGUgb2JqZWN0cy4gSXMgCi0gICAgICAgIGFsbG93ZWQgdG8gYmUgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgIHRoZSBhbm5vdGF0aW9ucy4gQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSAKLSAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkIAotICAgICAgICBpbiB0aGUgY2xhc3MuIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIAotICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGFibGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGEgbWFwcGVkIHN1cGVyY2xhc3MuIElzIAotICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgCi0gICAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHByb2Nlc3NlZCAKLSAgICAgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwgYmUgcmVjdXJzaXZlbHkgCi0gICAgICAgIGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcHBlZFN1cGVyY2xhc3N7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlIiB0eXBlPSJvcm06Y2FjaGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvcHktcG9saWN5IiB0eXBlPSJvcm06Y29weS1wb2xpY3kiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZXF1ZW5jZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgc2VxdWVuY2VOYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAxOwotICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXF1ZW5jZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5WYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMDsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJway1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAotICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudAotICAgICAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlciBpbnRlcmZhY2UuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgY29udmVydGVyQ2xhc3MoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUeXBlQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUKLSAgICAgICAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZSBmaWVsZCAKLSAgICAgICAgICAgKiBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IGZpZWxkIAotICAgICAgICAgICAqIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT2JqZWN0VHlwZUNvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlCi0gICAgICAgICAgICogYWNyb3NzIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgCi0gICAgICAgICAgICogZmllbGQgb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgY29udmVyc2lvbiB2YWx1ZXMgdG8gYmUgdXNlZCAKLSAgICAgICAgICAgKiB3aXRoIHRoZSBvYmplY3QgY29udmVydGVyLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnNpb25WYWx1ZVtdIGNvbnZlcnNpb25WYWx1ZXMoKTsKLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IGEgZGVmYXVsdCBvYmplY3QgdmFsdWUuIFVzZWQgZm9yIAotICAgICAgICAgICAgKiBsZWdhY3kgZGF0YSBpZiB0aGUgZGF0YSB2YWx1ZSBpcyBtaXNzaW5nLgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnNpb24tdmFsdWUiIHR5cGU9Im9ybTpjb252ZXJzaW9uLXZhbHVlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1vYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVyc2lvbi12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVyc2lvblZhbHVlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIGRhdGFiYXNlIHZhbHVlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBkYXRhVmFsdWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgb2JqZWN0IHZhbHVlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBvYmplY3RWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3RydWN0Q29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAotICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IAotICAgICAgICAgICAqIGltcGxlbWVudCB0aGUgRWNsaXBzZUxpbmsgaW50ZXJmYWNlIAotICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLmNvbnZlcnRlcnMuQ29udmVydGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGNvbnZlcnRlcigpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENvcHlQb2xpY3kgaXMgdXNlZCB0byBzZXQgYSAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5IG9uIGFuIEVudGl0eS4KLSAgICAgICAgICogSXQgaXMgcmVxdWlyZWQgdGhhdCBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5IGJlIHNwZWNpZmllZCAKLSAgICAgICAgICogYXMgdGhlIGFyZ3VtZW50LgotICAgICAgICAgKiAKLSAgICAgICAgICogQSBDb3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5IG9yIE1hcHBlZFN1cGVyY2xhc3MuCi0gICAgICAgICAqIAotICAgICAgICAgKiBGb3IgaW5zdGFuY2U6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENvcHlQb2xpY3koImV4YW1wbGUuTXlDb3B5UG9saWN5IikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvcHlQb2xpY3kgewotCi0gICAgICAgIC8qCi0gICAgICAgICogKFJlcXVpcmVkKQotICAgICAgICAqIFRoaXMgZGVmaW5lcyB0aGUgY2xhc3Mgb2YgdGhlIGNvcHkgcG9saWN5LiBJdCBtdXN0IHNwZWNpZnkgYSBjbGFzcyAKLSAgICAgICAgKiB0aGF0IGltcGxlbWVudHMgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5Ci0gICAgICAgICovCi0gICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5JbnN0YW50aWF0aW9uQ29weVBvbGljeSAKLSAgICAgICAgICogb24gYW4gRW50aXR5LiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB0aGUgZGVmYXVsdCBDb3B5UG9saWN5IGluIAotICAgICAgICAgKiBFY2xpcHNlTGluayBhbmQgdGhlcmVmb3JlIHRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaXMgb25seSB1c2VkIHRvIAotICAgICAgICAgKiBvdmVycmlkZSBvdGhlciB0eXBlcyBvZiBjb3B5IHBvbGljaWVzCi0gICAgICAgICAqIAotICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSBvciAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQEluc3RhbnRpYXRpb25Db3B5UG9saWN5IAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgewotICAgICAgICB9Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQ2xvbmVDb3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNsb25lQ29weVBvbGljeSBvbiBhbiAKLSAgICAgICAgICogRW50aXR5LiBBIENsb25lQ29weVBvbGljeSBtdXN0IHNwZWNpZnkgYXQgb25lIG9yIGJvdGggb2YgdGhlICJtZXRob2QiIAotICAgICAgICAgKiBvciAid29ya2luZ0NvcHlNZXRob2QiLiAid29ya2luZ0NvcHlNZXRob2QiIGlzIHVzZWQgdG8gY2xvbmUgb2JqZWN0cyAKLSAgICAgICAgICogdGhhdCB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSB1c2VyIGFzIHRoZXkgYXJlIHJlZ2lzdGVyZWQgaW4gCi0gICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgdHJhbnNhY3Rpb25hbCBtZWNoYW5pc20sIHRoZSBVbml0T2ZXb3JrLiAibWV0aG9kIiB3aWxsIAotICAgICAgICAgKiBiZSB1c2VkIGZvciB0aGUgY2xvbmUgdGhhdCBpcyB1c2VkIGZvciBjb21wYXJpc29uIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgRGVmZXJyZWRDaGFuZ2VEZXRlY3Rpb25Qb2xpY3kKLSAgICAgICAgICogIAotICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSBvciAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiKQotICAgICAgICAgKiAKLSAgICAgICAgICogb3I6Ci0gICAgICAgICAqIAotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kobWV0aG9kPSJteUNsb25lTWV0aG9kIiwgd29ya2luZ0NvcHlNZXRob2Q9Im15V29ya2luZ0NvcHlDbG9uZU1ldGhvZCIpCi0gICAgICAgICAqIAotICAgICAgICAgKiBvcjoKLSAgICAgICAgICogCi0gICAgICAgICAgQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KHdvcmtpbmdDb3B5TWV0aG9kTmFtZT0ibXlXb3JraW5nQ29weUNsb25lIikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENsb25lQ29weVBvbGljeSB7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCB0aGlzIGRlZmluZXMgCi0gICAgICAgICAgICAgKiBhIG1ldGhvZCB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBjbG9uZSB0aGF0IHdpbGwgYmUgdXNlZCAKLSAgICAgICAgICAgICAqIGZvciBjb21wYXJpc29uIGJ5Ci0gICAgICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpCi0gICAgICAgICAgICAgKiBFaXRoZXIgbWV0aG9kIG9yIHdvcmtpbmdDb3B5TWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkCi0gICAgICAgICAgICAgKiB0aGlzIGRlZmluZXMgYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCAKLSAgICAgICAgICAgICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG9iamVjdCByZXR1cm5lZCB3aGVuIHJlZ2lzdGVyaW5nIGFuIAotICAgICAgICAgICAgICogT2JqZWN0IGluIGFuIEVjbGlwc2VMaW5rIFVuaXRPZldvcmsKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIHdvcmtpbmdDb3B5TWV0aG9kKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IndvcmtpbmctY29weS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2xsZWN0aW9uVGFibGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGFibGUuIElmIGl0IGlzIG5vdCAKLSAgICAgICAgICAgKiBzcGVjaWZpZWQsIGl0IGlzIGRlZmF1bHRlZCB0byB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nOiAKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGVudGl0eTsgIl8iIDsgdGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCAKLSAgICAgICAgICAgKiBwcm9wZXJ0eSBvciBmaWVsZCBvZiB0aGUgc291cmNlIGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgY2F0YWxvZyBvZiB0aGUgdGFibGUuIEl0IGRlZmF1bHRzIHRvIHRoZSBwZXJzaXN0ZW5jZSAKLSAgICAgICAgICAgKiB1bml0IGRlZmF1bHQgY2F0YWxvZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgc2NoZW1hIG9mIHRoZSB0YWJsZS4gSXQgZGVmYXVsdHMgdG8gdGhlIHBlcnNpc3RlbmNlIAotICAgICAgICAgICAqIHVuaXQgZGVmYXVsdCBzY2hlbWEuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVc2VkIHRvIHNwZWNpZnkgYSBwcmltYXJ5IGtleSBjb2x1bW4gdGhhdCBpcyB1c2VkIGFzIGEgCi0gICAgICAgICAgICogZm9yZWlnbiBrZXkgdG8gam9pbiB0byBhbm90aGVyIHRhYmxlLiBJZiB0aGUgc291cmNlIGVudGl0eSB1c2VzIGEgCi0gICAgICAgICAgICogY29tcG9zaXRlIHByaW1hcnkga2V5LCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG11c3QgYmUgc3BlY2lmaWVkIAotICAgICAgICAgICAqIGZvciBlYWNoIGZpZWxkIG9mIHRoZSBjb21wb3NpdGUgcHJpbWFyeSBrZXkuIEluIGEgc2luZ2xlIHByaW1hcnkgCi0gICAgICAgICAgICoga2V5IGNhc2UsIGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gbWF5IG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkLiAKLSAgICAgICAgICAgKiBEZWZhdWx0aW5nIHdpbGwgYXBwbHkgb3RoZXJ3aXNlIGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICogbmFtZSwgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSBwcmltYXJ5IHRhYmxlIAotICAgICAgICAgICAqIG9mIHRoZSBzb3VyY2UgZW50aXR5LiByZWZlcmVuY2VkQ29sdW1uTmFtZSwgdGhlIHNhbWUgbmFtZSBvZiAKLSAgICAgICAgICAgKiBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlIHByaW1hcnkgdGFibGUgb2YgdGhlIHNvdXJjZSBlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OyAKLSAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVuaXF1ZSBjb25zdHJhaW50cyB0aGF0IGFyZSB0byBiZSBwbGFjZWQgb24gdGhlIHRhYmxlLiAKLSAgICAgICAgICAgKiBUaGVzZSBhcmUgb25seSB1c2VkIGlmIHRhYmxlIGdlbmVyYXRpb24gaXMgaW4gZWZmZWN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307IAotICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtY29sbGVjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljQ29sbGVjdGlvbiB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgdGhhdCAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgaGludCB0byAKLSAgICAgICAgICAgKiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gCi0gICAgICAgICAgICogTEFaWS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7IAotIAotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIHZhbHVlIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06Y29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljLW1hcCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljTWFwIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSB0aGF0IAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSBoaW50IHRvIAotICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAKLSAgICAgICAgICAgKiBMQVpZLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGRhdGEgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCBtYXAgCi0gICAgICAgICAgICoga2V5LiBJZiB0aGUgbmFtZSBvbiB0ZSBrZXkgY29sdW1uIGlzICIiLCB0aGUgbmFtZSB3aWxsIGRlZmF1bHQgdG86Ci0gICAgICAgICAgICogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9yIGZpZWxkOyAiX2tleSIuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uIGtleUNvbHVtbigpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSBrZXkgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAotICAgICAgICAgICAqIHRoZSBkaXJlY3QgbWFwIGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJ0IGtleUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHZhbHVlIGNvbnZlcnRlci4gRGVmYXVsdCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAgICAgICAqIHNwZWNpZnlpbmcgQENvbnZlcnQoIm5vbmUiKSwgbWVhbmluZyBubyBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgY29sdW1uIG1hcHBpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVydCB2YWx1ZUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIvPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIvPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06Y29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gSm9pbkZldGNoVHlwZSB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBpbm5lciBqb2luIGlzIHVzZWQgdG8gZmV0Y2ggdGhlIHJlbGF0ZWQgb2JqZWN0LgotICAgICAgICAgKiBUaGlzIGRvZXMgbm90IGFsbG93IGZvciBudWxsL2VtcHR5IHZhbHVlcy4KLSAgICAgICAgICovCi0gICAgICAgIElOTkVSLAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBpbm5lciBqb2luIGlzIHVzZWQgdG8gZmV0Y2ggdGhlIHJlbGF0ZWQgb2JqZWN0LgotICAgICAgICAgKiBUaGlzIGFsbG93cyBmb3IgbnVsbC9lbXB0eSB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBPVVRFUiwKLSAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOTkVSIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVRFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIG9wdGltaXN0aWMtbG9ja2luZyBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiAKLSAgICAgICAgICogb3B0aW1pc3RpYyBsb2NraW5nIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyAKLSAgICAgICAgICogZW50aXRpZXMuIEFuIG9wdGltaXN0aWMtbG9ja2luZyBzcGVjaWZpY2F0aW9uIGlzIHN1cHBvcnRlZCBvbgotICAgICAgICAgKiBhbiBlbnRpdHkgb3IgbWFwcGVkLXN1cGVyY2xhc3MuCi0gICAgICAgICAqIAotICAgICAgICAgKiBJdCBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIG9wdGltaXN0aWMtbG9ja2luZy10eXBlLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9wdGltaXN0aWNMb2NraW5nIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgdG8gdXNlLgotICAgICAgICAgICAqLwotICAgICAgICAgIE9wdGltaXN0aWNMb2NraW5nVHlwZSB0eXBlKCkgZGVmYXVsdCBWRVJTSU9OX0NPTFVNTjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRm9yIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgb2YgdHlwZSAKLSAgICAgICAgICAgKiBTRUxFQ1RFRF9DT0xVTU5TLCB0aGlzIGFubm90YXRpb24gbWVtYmVyIGJlY29tZXMgYSAoUmVxdWlyZWQpIAotICAgICAgICAgICAqIGZpZWxkLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbltdIHNlbGVjdGVkQ29sdW1ucygpIGRlZmF1bHQge307Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgd2hlcmUgdGhlIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgc2hvdWxkIAotICAgICAgICAgICAqIGNhc2NhZGUgbG9jay4gQ3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIHdpdGggVkVSU0lPTl9DT0xVTU4gbG9ja2luZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBib29sZWFuIGNhc2NhZGUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlbGVjdGVkLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAKLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXNjYWRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgc2ltcGxlIHR5cGUgdGhhdCBpcyB1c2VkIHdpdGhpbiBhbiBvcHRpbWlzdGljLWxvY2tpbmcgCi0gICAgICAgICAqIHNwZWNpZmljYXRpb24gdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBvcHRpbWlzdGljLWxvY2tpbmcgdGhhdAotICAgICAgICAgKiBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgZW50aXRpZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZW51bSBPcHRpbWlzdGljTG9ja2luZ1R5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIHBvbGljeSBjb21wYXJlcyBldmVyeSBmaWVsZCBpbiB0aGUgdGFibGUKLSAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQKLSAgICAgICAgICAgKiBoYXMgYmVlbiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAgICAgICAqLwotICAgICAgICAgIEFMTF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIG9ubHkgdGhlIGNoYW5nZWQgZmllbGRzCi0gICAgICAgICAgICogaW4gdGhlIFdIRVJFIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gSWYgYW55IGZpZWxkIGhhcyBiZWVuCi0gICAgICAgICAgICogY2hhbmdlZCwgYW4gb3B0aW1pc3RpYyBsb2NraW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gQSBkZWxldGUKLSAgICAgICAgICAgKiB3aWxsIG9ubHkgY29tcGFyZSB0aGUgcHJpbWFyeSBrZXkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ0hBTkdFRF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgY29tcGFyZXMgc2VsZWN0ZWQgZmllbGRzIGluIHRoZSBXSEVSRQotICAgICAgICAgICAqIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZSBvciBhIGRlbGV0ZS4gSWYgYW55IGZpZWxkIGhhcyBiZWVuCi0gICAgICAgICAgICogY2hhbmdlZCwgYW4gb3B0aW1pc3RpYyBsb2NraW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gTm90ZSB0aGF0Ci0gICAgICAgICAgICogdGhlIGZpZWxkcyBzcGVjaWZpZWQgbXVzdCBiZSBtYXBwZWQgYW5kIG5vdCBiZSBwcmltYXJ5IGtleXMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU0VMRUNURURfQ09MVU1OUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIHBvbGljeSBjb21wYXJlcyBhIHNpbmdsZSB2ZXJzaW9uIG51bWJlcgotICAgICAgICAgICAqIGluIHRoZSB3aGVyZSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUuIFRoZSB2ZXJzaW9uIGZpZWxkIG11c3QgYmUKLSAgICAgICAgICAgKiBtYXBwZWQgYW5kIG5vdCBiZSB0aGUgcHJpbWFyeSBrZXkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgVkVSU0lPTl9DT0xVTU4KLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTExfQ09MVU1OUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBTkdFRF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRUxFQ1RFRF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWRVJTSU9OX0NPTFVNTiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlIGFubm90YXRpb24gaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmludmFsaWRhdGlvbi5DYWNoZUludmFsaWRhdGlvblBvbGljeSAKLSAgICAgICAgICogd2hpY2ggc2V0cyBvYmplY3RzIGluIEVjbGlwc2VMaW5rJ3MgaWRlbnRpdHkgbWFwcyB0byBiZSBpbnZhbGlkIAotICAgICAgICAgKiBmb2xsb3dpbmcgZ2l2ZW4gcnVsZXMuIEJ5IGRlZmF1bHQgaW4gRWNsaXBzZUxpbmssIG9iamVjdHMgZG8gbm90IAotICAgICAgICAgKiBleHBpcmUgaW4gdGhlIGNhY2hlLiBTZXZlcmFsIGRpZmZlcmVudCBwb2xpY2llcyBhcmUgYXZhaWxhYmxlIHRvIAotICAgICAgICAgKiBhbGxvdyBvYmplY3RzIHRvIGV4cGlyZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGVUeXBlCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENhY2hlIGFub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHkgb3IgTWFwcGVkU3VwZXJjbGFzcy4gCi0gICAgICAgICAqIEluIHRoZSBjYXNlIG9mIGluaGVyaXRhbmNlLCBhIENhY2hlIGFubm90YXRpb24gc2hvdWxkIG9ubHkgYmUgZGVmaW5lZCAKLSAgICAgICAgICogb24gdGhlIHJvb3Qgb2YgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENhY2hlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNhY2hlIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2FjaGVUeXBlIHR5cGUoKSBkZWZhdWx0IFNPRlRfV0VBSzsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNpemUgb2YgY2FjaGUgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2l6ZSgpIGRlZmF1bHQgMTAwOwotCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgQ2FjaGVkIGluc3RhbmNlcyBpbiB0aGUgc2hhcmVkIGNhY2hlIG9yIGEgY2xpZW50IAotCSAgICAgICAgICogaXNvbGF0ZWQgY2FjaGUuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBib29sZWFuIHNoYXJlZCgpIGRlZmF1bHQgdHJ1ZTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBFeHBpcmUgY2FjaGVkIGluc3RhbmNlIGFmdGVyIGEgZml4IHBlcmlvZCBvZiB0aW1lIChtcykuIAotCSAgICAgICAgICogUXVlcmllcyBleGVjdXRlZCBhZ2FpbnN0IHRoZSBjYWNoZSBhZnRlciB0aGlzIHdpbGwgYmUgZm9yY2VkIGJhY2sgCi0JICAgICAgICAgKiB0byB0aGUgZGF0YWJhc2UgZm9yIGEgcmVmcmVzaGVkIGNvcHkKLQkgICAgICAgICAqLyAKLQkgICAgICAgIGludCBleHBpcnkoKSBkZWZhdWx0IC0xOyAvLyBtaW51cyBvbmUgaXMgbm8gZXhwaXJ5LgotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYSBzcGVjaWZpYyB0aW1lIG9mIGRheS4gUXVlcmllcyAKLQkgICAgICAgICAqIGV4ZWN1dGVkIGFnYWluc3QgdGhlIGNhY2hlIGFmdGVyIHRoaXMgd2lsbCBiZSBmb3JjZWQgYmFjayB0byB0aGUgCi0JICAgICAgICAgKiBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQotCSAgICAgICAgICovIAotCSAgICAgICAgVGltZU9mRGF5IGV4cGlyeVRpbWVPZkRheSgpIGRlZmF1bHQgQFRpbWVPZkRheShzcGVjaWZpZWQ9ZmFsc2UpOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIEZvcmNlIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlIHRvIGFsd2F5cyAKLQkgICAgICAgICAqIHJlZnJlc2ggdGhlIGNhY2hlLgotCSAgICAgICAgICovIAotCSAgICAgICAgYm9vbGVhbiBhbHdheXNSZWZyZXNoKCkgZGVmYXVsdCBmYWxzZTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBGb3IgYWxsIHF1ZXJpZXMgdGhhdCBnbyB0byB0aGUgZGF0YWJhc2UsIHJlZnJlc2ggdGhlCi0JICAgICAgICAgKiBjYWNoZSBvbmx5IGlmIHRoZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGRhdGFiYXNlIGJ5IGEgcXVlcnkgaXMgCi0JICAgICAgICAgKiBuZXdlciB0aGFuIHRoZSBkYXRhIGluIHRoZSBjYWNoZSAoYXMgZGV0ZXJtaW5lZCBieSB0aGUgb3B0aW1pc3RpYyAKLQkgICAgICAgICAqIGxvY2tpbmcgZmllbGQpCi0JICAgICAgICAgKi8gCi0JICAgICAgICBib29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcigpIGRlZmF1bHQgZmFsc2U7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgU2V0dGluZyB0byB0cnVlIHdpbGwgZm9yY2UgYWxsIHF1ZXJpZXMgdG8gYnlwYXNzIHRoZSAKLQkgICAgICAgICAqIGNhY2hlIGZvciBoaXRzIGJ1dCBzdGlsbCByZXNvbHZlIGFnYWluc3QgdGhlIGNhY2hlIGZvciBpZGVudGl0eS4gCi0JICAgICAgICAgKiBUaGlzIGZvcmNlcyBhbGwgcXVlcmllcyB0byBoaXQgdGhlIGRhdGFiYXNlLgotCSAgICAgICAgICovIAotCSAgICAgICAgYm9vbGVhbiBkaXNhYmxlSGl0cygpIGRlZmF1bHQgZmFsc2U7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhY2hlIGNvb3JkaW5hdGlvbiBtb2RlLgotCSAgICAgICAgICovIAotCSAgICAgICAgQ2FjaGVDb29yZGluYXRpb25UeXBlIGNvb3JkaW5hdGlvblR5cGUoKSBkZWZhdWx0IFNFTkRfT0JKRUNUX0NIQU5HRVM7Ci0JICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6Y2hvaWNlPgotCSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5IiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIi8+Ci0JICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnktdGltZS1vZi1kYXkiIHR5cGU9Im9ybTp0aW1lLW9mLWRheSIgbWluT2NjdXJzPSIwIi8+Ci0JICA8L3hzZDpjaG9pY2U+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2hhcmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOmNhY2hlLXR5cGUiLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsd2F5cy1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmcmVzaC1vbmx5LWlmLW5ld2VyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzYWJsZS1oaXRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29vcmRpbmF0aW9uLXR5cGUiIHR5cGU9Im9ybTpjYWNoZS1jb29yZGluYXRpb24tdHlwZSIvPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gCi0KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtdHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkKLQkgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDYWNoZVR5cGUgZW51bSBpcyB1c2VkIHdpdGggdGhlIENhY2hlIGFubm90YXRpb24gZm9yIGEgCi0gICAgICAgICAqIHBlcnNpc3RlbnQgY2xhc3MuIEl0IGRlZmluZXMgdGhlIHR5cGUgb2YgSWRlbnRpdHlNYXAvQ2FjaGUgdXNlZCBmb3IgCi0gICAgICAgICAqIHRoZSBjbGFzcy4gQnkgZGVmYXVsdCB0aGUgU09GVF9XRUFLIGNhY2hlIHR5cGUgaXMgdXNlZC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUgCi0gICAgICAgICAqLwotCSAgICAgIHB1YmxpYyBlbnVtIENhY2hlVHlwZSB7Ci0JICAgICAgICAvKioKLQkgICAgICAgICAqIFByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS4gQ2FjaGVzIGFsbCBvYmplY3RzCi0JICAgICAgICAgKiBhbmQgZG9lcyBub3QgcmVtb3ZlIHRoZW0uIAotCSAgICAgICAgICogV0FSTklORzogVGhpcyBtZXRob2QgbWF5IGJlIG1lbW9yeSBpbnRlbnNpdmUgd2hlbiBtYW55IG9iamVjdHMgYXJlIAotCSAgICAgICAgICogcmVhZC4KLQkgICAgICAgICAqLwotCSAgICAgICAgRlVMTCwKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogU2ltaWxhciB0byB0aGUgRlVMTCBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgdGhlIG1hcCBob2xkcyB0aGUKLQkgICAgICAgICAqIG9iamVjdHMgdXNpbmcgd2VhayByZWZlcmVuY2VzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZnVsbCBnYXJiYWdlCi0JICAgICAgICAgKiBjb2xsZWN0aW9uIGFuZCBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFdFQUssCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIEZVTEwgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlCi0JICAgICAgICAgKiBvYmplY3RzIHVzaW5nIHNvZnQgcmVmZXJlbmNlcy4gVGhpcyBtZXRob2QgYWxsb3dzIGZ1bGwgZ2FyYmFnZQotCSAgICAgICAgICogY29sbGVjdGlvbiB3aGVuIG1lbW9yeSBpcyBsb3cgYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQKLQkgICAgICAgICAqIGd1YXJhbnRlZWQgaWRlbnRpdHkuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFNPRlQsCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIFdFQUsgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IGl0IG1haW50YWlucyBhCi0JICAgICAgICAgKiBtb3N0LWZyZXF1ZW50bHktdXNlZCBzdWItY2FjaGUuIFRoZSBzaXplIG9mIHRoZSBzdWItY2FjaGUgaXMKLQkgICAgICAgICAqIHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiB0aGUgaWRlbnRpdHkgbWFwIGFzIHNwZWNpZmllZCBieQotCSAgICAgICAgICogZGVzY3JpcHRvcidzIHNldElkZW50aXR5TWFwU2l6ZSgpIG1ldGhvZC4gVGhlIHN1Yi1jYWNoZQotCSAgICAgICAgICogdXNlcyBzb2Z0IHJlZmVyZW5jZXMgdG8gZW5zdXJlIHRoYXQgdGhlc2Ugb2JqZWN0cyBhcmUKLQkgICAgICAgICAqIGdhcmJhZ2UtY29sbGVjdGVkIG9ubHkgaWYgdGhlIHN5c3RlbSBpcyBsb3cgb24gbWVtb3J5LgotCSAgICAgICAgICovCi0JICAgICAgICBTT0ZUX1dFQUssCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIElkZW50aWNhbCB0byB0aGUgc29mdCBjYWNoZSB3ZWFrIChTT0ZUX1dFQUspIGlkZW50aXR5IG1hcCBleGNlcHQgCi0JICAgICAgICAgKiB0aGF0IGl0IHVzZXMgaGFyZCByZWZlcmVuY2VzIGluIHRoZSBzdWItY2FjaGUuIFVzZSB0aGlzIGlkZW50aXR5IAotCSAgICAgICAgICogbWFwIGlmIHNvZnQgcmVmZXJlbmNlcyBkbyBub3QgYmVoYXZlIHByb3Blcmx5IG9uIHlvdXIgcGxhdGZvcm0uCi0JICAgICAgICAgKi8KLQkgICAgICAgIEhBUkRfV0VBSywKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogQSBjYWNoZSBpZGVudGl0eSBtYXAgbWFpbnRhaW5zIGEgZml4ZWQgbnVtYmVyIG9mIG9iamVjdHMKLQkgICAgICAgICAqIHNwZWNpZmllZCBieSB0aGUgYXBwbGljYXRpb24uIE9iamVjdHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUKLQkgICAgICAgICAqIG9uIGEgbGVhc3QtcmVjZW50bHktdXNlZCBiYXNpcy4gVGhpcyBtZXRob2QgYWxsb3dzIG9iamVjdAotCSAgICAgICAgICogaWRlbnRpdHkgZm9yIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgb2JqZWN0cy4KLQkgICAgICAgICAqIFdBUk5JTkc6IEZ1cm5pc2hlcyBjYWNoaW5nIGFuZCBpZGVudGl0eSwgYnV0IGRvZXMgbm90IGd1YXJhbnRlZSAKLQkgICAgICAgICAqIGlkZW50aXR5LgotCSAgICAgICAgICovCi0JICAgICAgICBDQUNIRSwKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogV0FSTklORzogRG9lcyBub3QgcHJlc2VydmUgb2JqZWN0IGlkZW50aXR5IGFuZCBkb2VzIG5vdCBjYWNoZSAKLQkgICAgICAgICAqIG9iamVjdHMuCi0JICAgICAgICAgKi8KLQkgICAgICAgIE5PTkUKLQkgICAgICB9Ci0JCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGVUxMIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldFQUsiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09GVCIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTT0ZUX1dFQUsiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEFSRF9XRUFLIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQ0hFIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLQkgIDwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS1jb29yZGluYXRpb24tdHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkKLQkgICAgICAvKiogCi0gICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUgCi0gICAgICAgICAqLyAKLQkgICAgICBwdWJsaWMgZW51bSBDYWNoZUNvb3JkaW5hdGlvblR5cGUgewotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBTZW5kcyBhIGxpc3Qgb2YgY2hhbmdlZCBvYmplY3RzIGluY2x1ZGluZyBkYXRhIGFib3V0IHRoZSBjaGFuZ2VzLgotCSAgICAgICAgICogVGhpcyBkYXRhIGlzIG1lcmdlZCBpbnRvIHRoZSByZWNlaXZpbmcgY2FjaGUuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFNFTkRfT0JKRUNUX0NIQU5HRVMsCi0JCi0JICAgICAgICAgLyoqCi0JICAgICAgICAgICogU2VuZHMgYSBsaXN0IG9mIHRoZSBpZGVudGl0aWVzIG9mIHRoZSBvYmplY3RzIHRoYXQgaGF2ZSBjaGFuZ2VkLiAKLQkgICAgICAgICAgKiBUaGUgcmVjZWl2aW5nIGNhY2hlIGludmFsaWRhdGVzIHRoZSBvYmplY3RzIChyYXRoZXIgdGhhbiBjaGFuZ2luZyAKLQkgICAgICAgICAgKiBhbnkgb2YgdGhlIGRhdGEpCi0JICAgICAgICAgICovCi0JICAgICAgICAgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsCi0JCi0JICAgICAgICAgLyoqCi0JICAgICAgICAgICogU2FtZSBhcyBTRU5EX09CSkVDVF9DSEFOR0VTIGV4Y2VwdCBpdCBhbHNvIGluY2x1ZGVzIGFueSBuZXdseQotCSAgICAgICAgICAqIGNyZWF0ZWQgb2JqZWN0cyBmcm9tIHRoZSB0cmFuc2FjdGlvbi4KLQkgICAgICAgICAgKi8KLQkgICAgICAgICBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywKLQkKLQkgICAgICAgICAvKioKLQkgICAgICAgICAgKiBEb2VzIG5vIGNhY2hlIGNvb3JkaW5hdGlvbi4KLQkgICAgICAgICAgKi8KLQkgICAgICAgICBOT05FCi0gICAgICAgIH0KLQkKLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTkRfT0JKRUNUX0NIQU5HRVMiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotCSAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGltZS1vZi1kYXkiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JCi0JICAgICAgQFRhcmdldCh7fSkKLQkgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0JICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGltZU9mRGF5IHsKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBIb3VyIG9mIHRoZSBkYXkuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBpbnQgaG91cigpIGRlZmF1bHQgMDsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBNaW51dGUgb2YgdGhlIGRheS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGludCBtaW51dGUoKSBkZWZhdWx0IDA7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgU2Vjb25kIG9mIHRoZSBkYXkuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBpbnQgc2Vjb25kKCkgZGVmYXVsdCAwOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIE1pbGxpc2Vjb25kIG9mIHRoZSBkYXkuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBpbnQgbWlsbGlzZWNvbmQoKSBkZWZhdWx0IDA7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIEludGVybmFsIHVzZS4gRG8gbm90IG1vZGlmeS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGJvb2xlYW4gc3BlY2lmaWVkKCkgZGVmYXVsdCB0cnVlOwotCSAgICAgIH0KLQkKLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJob3VyIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWludXRlIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2Vjb25kIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWlsbGlzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY2hhbmdldHJhY2tpbmcuT2JqZWN0Q2hhbmdlUG9saWN5IAotICAgICAgICAgKiB3aGljaCBjb21wdXRlcyBjaGFuZ2VzIHNldHMgZm9yIEVjbGlwc2VMaW5rJ3MgVW5pdE9mV29yayBjb21taXQgCi0gICAgICAgICAqIHByb2Nlc3MuIEFuIE9iamVjdENoYW5nZVBvbGljeSBpcyBzdG9yZWQgb24gYW4gRW50aXR5J3MgZGVzY3JpcHRvci4KLSAgICAgICAgICoKLSAgICAgICAgICogQSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uIG1heSBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5IG9yIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENoYW5nZVRyYWNraW5nIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNoYW5nZSB0cmFja2luZyB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIENoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZSgpIGRlZmF1bHQgQVVUTzsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZy10eXBlIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjaGFuZ2UtdHJhY2tpbmctdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uLiAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBDaGFuZ2VUcmFja2luZ1R5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFuIEFUVFJJQlVURSBjaGFuZ2UgdHJhY2tpbmcgdHlwZSBhbGxvd3MgY2hhbmdlIHRyYWNraW5nIGF0IHRoZQotICAgICAgICAgICAqIGF0dHJpYnV0ZSBsZXZlbCBvZiBhbiBvYmplY3QuIE9iamVjdHMgd2l0aCBjaGFuZ2VkIGF0dHJpYnV0ZXMgd2lsbAotICAgICAgICAgICAqIGJlIHByb2Nlc3NlZCBpbiB0aGUgY29tbWl0IHByb2Nlc3MgdG8gaW5jbHVkZSBhbnkgY2hhbmdlcyBpbiB0aGUgCi0gICAgICAgICAgICogcmVzdWx0cyBvZiB0aGUgY29tbWl0LiBVbmNoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQVRUUklCVVRFLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQW4gT0JKRUNUIGNoYW5nZSB0cmFja2luZyBwb2xpY3kgYWxsb3dzIGFuIG9iamVjdCB0byBjYWxjdWxhdGUgZm9yIAotICAgICAgICAgICAqIGl0c2VsZiB3aGV0aGVyIGl0IGhhcyBjaGFuZ2VkLiBDaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBwcm9jZXNzZWQgaW4gCi0gICAgICAgICAgICogdGhlIGNvbW1pdCBwcm9jZXNzIHRvIGluY2x1ZGUgYW55IGNoYW5nZXMgaW4gdGhlIHJlc3VsdHMgb2YgdGhlIAotICAgICAgICAgICAqIGNvbW1pdC4gVW5jaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIE9CSkVDVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEEgREVGRVJSRUQgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBkZWZlcnMgYWxsIGNoYW5nZSBkZXRlY3Rpb24gdG8KLSAgICAgICAgICAgKiB0aGUgVW5pdE9mV29yaydzIGNoYW5nZSBkZXRlY3Rpb24gcHJvY2Vzcy4gRXNzZW50aWFsbHksIHRoZSAKLSAgICAgICAgICAgKiBjYWxjdWxhdGVDaGFuZ2VzKCkgbWV0aG9kIHdpbGwgcnVuIGZvciBhbGwgb2JqZWN0cyBpbiBhIFVuaXRPZldvcmsuIAotICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgT2JqZWN0Q2hhbmdlUG9saWN5Ci0gICAgICAgICAgICovCi0gICAgICAgICAgREVGRVJSRUQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBXaWxsIG5vdCBzZXQgYW55IGNoYW5nZSB0cmFja2luZyBwb2xpY3kuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQVVUTwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVFRSSUJVVEUiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT0JKRUNUIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFRkVSUkVEIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLQkgIDwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1c3RvbWl6ZXIiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JCi0gICAgICAvKiogCi0gICAgICAgKiBUaGUgQ3VzdG9taXplciBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAKLSAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5zZXNzaW9ucy5mYWN0b3JpZXMuRGVzY3JpcHRvckN1c3RvbWl6ZXIgCi0gICAgICAgKiBpbnRlcmZhY2UgYW5kIGlzIHRvIHJ1biBhZ2FpbnN0IGFuIGVuZXRpdHkncyBjbGFzcyBkZXNjcmlwdG9yIGFmdGVyIGFsbCAKLSAgICAgICAqIG1ldGFkYXRhIHByb2Nlc3NpbmcgaGFzIGJlZW4gY29tcGxldGVkLgotICAgICAgICoKLSAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzIAotICAgICAgICogb3IgRW1iZWRkYWJsZSBjbGFzcy4gSW4gdGhlIGNhc2Ugb2YgaW5oZXJpdGFuY2UsIGEgQ3VzdG9taXplciBpcyBub3QgCi0gICAgICAgKiBpbmhlcml0ZWQgZnJvbSBpdHMgcGFyZW50IGNsYXNzZXMuIAotICAgICAgICovIAotCSAgICBAVGFyZ2V0KHtUWVBFfSkKLQkgICAgQFJldGVudGlvbihSVU5USU1FKQotCSAgICBwdWJsaWMgQGludGVyZmFjZSBDdXN0b21pemVyIHsKLQkgICAgICAvKioKLQkgICAgICAgKiAoUmVxdWlyZWQpIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGRlc2NyaXB0b3IgY3VzdG9taXplciBjbGFzcyB0aGF0IAotCSAgICAgICAqIHNob3VsZCBiZSBhcHBsaWVkIGZvciB0aGUgcmVsYXRlZCBlbnRpdHkgb3IgZW1iZWRkYWJsZSBjbGFzcy4KLQkgICAgICAgKi8KLQkgICAgICBDbGFzcyB2YWx1ZSgpOyAKLQkgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIGFsbG93cyB0aGUgZGVmaW5pdGlvbiBvZiAKLSAgICAgICAgICogcXVlcmllcyB0aGF0IGNhbGwgc3RvcmVkIHByb2NlZHVyZXMgYXMgbmFtZWQgcXVlcmllcy4KLSAgICAgICAgIAotICAgICAgICAgKiBBIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHkgb3IKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcy4gCi0gICAgICAgICAqLyAKLQkgICAgICBAVGFyZ2V0KHtUWVBFfSkKLQkgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0JICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSB7Ci0JICAgICAgICAvKioKLQkgICAgICAgICAqIChSZXF1aXJlZCkgVW5pcXVlIG5hbWUgdGhhdCByZWZlcmVuY2VzIHRoaXMgc3RvcmVkIHByb2NlZHVyZSBxdWVyeS4KLQkgICAgICAgICAqLwotCSAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBRdWVyeSBoaW50cy4KLQkgICAgICAgICAqLwotCSAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFJlZmVycyB0byB0aGUgY2xhc3Mgb2YgdGhlIHJlc3VsdC4KLQkgICAgICAgICAqLwotCSAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIFNRTFJlc3VsdE1hcHBpbmcuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgbmFtZSBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZS4KLQkgICAgICAgICAqLwotCSAgICAgICAgU3RyaW5nIHByb2NlZHVyZU5hbWUoKTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBXaGV0aGVyIHRoZSBxdWVyeSBzaG91bGQgcmV0dXJuIGEgcmVzdWx0IHNldC4KLQkgICAgICAgICAqLwotCSAgICAgICAgYm9vbGVhbiByZXR1cm5zUmVzdWx0U2V0KCkgZGVmYXVsdCB0cnVlOyAKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIGFyZ3VtZW50cyB0byB0aGUgc3RvcmVkIHByb2NlZHVyZS4KLQkgICAgICAgICAqLwotCSAgICAgICAgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyW10gcGFyYW1ldGVycygpIGRlZmF1bHQge307Ci0JICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpzZXF1ZW5jZT4KLQkgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgCi0JICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtZXRlciIgdHlwZT0ib3JtOnN0b3JlZC1wcm9jZWR1cmUtcGFyYW1ldGVyIiAKLQkgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCSAgICA8L3hzZDpzZXF1ZW5jZT4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmV0dXJucy1yZXN1bHQtc2V0IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCTwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBhbm5vdGF0aW9uIGlzIHVzZWQgd2l0aGluIGEgCi0gICAgICAgICAqIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbi4gCi0gICAgICAgICAqLyAKLQkgICAgICBAVGFyZ2V0KHt9KQotCSAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLQkgICAgICBwdWJsaWMgQGludGVyZmFjZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgewotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyLgotCSAgICAgICAgICovCi0JICAgICAgICBEaXJlY3Rpb24gZGlyZWN0aW9uKCkgZGVmYXVsdCBJTjsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBTdG9yZWQgcHJvY2VkdXJlIHBhcmFtZXRlciBuYW1lLgotCSAgICAgICAgICovCi0JICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIHF1ZXJ5IHBhcmFtZXRlciBuYW1lLgotCSAgICAgICAgICovCi0JICAgICAgICBTdHJpbmcgcXVlcnlQYXJhbWV0ZXIoKTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBKYXZhIGNsYXNzIGRlc2lyZWQgYmFjayBmcm9tIHRoZSBwcm9jZWR1cmUsIAotCSAgICAgICAgICogdGhpcyBpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgcHJvY2VkdXJlLgotCSAgICAgICAgICovCi0JICAgICAgICBDbGFzcyB0eXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBKREJDIHR5cGUgY29kZSwgdGhpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgCi0JICAgICAgICAgKiBmcm9tIHRoZSBwcm9jZWR1cmUuCi0JICAgICAgICAgKi8KLQkgICAgICAgIGludCBqZGJjVHlwZSgpIGRlZmF1bHQgLTE7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIEpEQkMgdHlwZSBuYW1lLCB0aGlzIG1heSBiZSByZXF1aXJlZCBmb3IgQVJSQVkgb3IgCi0JICAgICAgICAgKiBTVFJVQ1QgdHlwZXMuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFN0cmluZyBqZGJjVHlwZU5hbWUoKSBkZWZhdWx0ICIiOwotCSAgICAgIH0KLQkKLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXJlY3Rpb24iIHR5cGU9Im9ybTpkaXJlY3Rpb24tdHlwZSIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icXVlcnktcGFyYW1ldGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCQotCTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQkKLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlyZWN0aW9uLXR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYW5ub3RhdGlvbi4KLSAgICAgICAgICogSXQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgCi0gICAgICAgICAqIHBhcmFtZXRlcnMgb2YgYSBuYW1lZCBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgotICAgICAgICAgKi8KLQkgICAgICBwdWJsaWMgZW51bSBEaXJlY3Rpb24gewotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBJbnB1dCBwYXJhbWV0ZXIKLQkgICAgICAgICAqLwotCSAgICAgICAgSU4sCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIE91dHB1dCBwYXJhbWV0ZXIKLQkgICAgICAgICAqLwotCSAgICAgICAgT1VULAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBJbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlcgotCSAgICAgICAgICovCi0JICAgICAgICBJTl9PVVQsCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIE91dHB1dCBjdXJzb3IKLQkgICAgICAgICAqLwotCSAgICAgICAgT1VUX0NVUlNPUgotCSAgICAgIH0KLQkKLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVCIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTl9PVVQiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VUX0NVUlNPUiIvPgotCSAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQkKLQk8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0JCi0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJLyoqIAotCQkJCSAqIFZhcmlhYmxlIG9uZSB0byBvbmUgbWFwcGluZ3MgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGEgcG9pbnRlciAKLQkJCQkgKiByZWZlcmVuY2VzIGJldHdlZW4gYSBqYXZhIG9iamVjdCBhbmQgYW4gaW1wbGVtZW50ZXIgb2YgYW4gaW50ZXJmYWNlLiAKLQkJCQkgKiBUaGlzIG1hcHBpbmcgaXMgdXN1YWxseSByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBwb2ludGVyIChzdG9yZWQgaW4gYW4gCi0JCQkJICogaW5zdGFuY2UgdmFyaWFibGUpIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG9iamVjdHMuIEluIHRoZSAKLQkJCQkgKiByZWxhdGlvbmFsIGRhdGFiYXNlIHRhYmxlcywgdGhlc2UgbWFwcGluZ3MgYXJlIG5vcm1hbGx5IGltcGxlbWVudGVkIAotCQkJCSAqIHVzaW5nIGEgZm9yZWlnbiBrZXkgYW5kIGEgdHlwZSBjb2RlLgotCQkJCSAqIAotCQkJCSAqIEEgVmFyaWFibGVPbmVUb09uZSBjYW4gYmUgc3BlY2lmaWVkIHdpdGhpbiBhbiBFbnRpdHksIAotCQkJCSAqIE1hcHBlZFN1cGVyY2xhc3MgYW5kIEVtYmVkZGFibGUgY2xhc3MuIAotCQkJCSAqLyAKLQkJCQlAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgCi0JCQkJQFJldGVudGlvbihSVU5USU1FKQotCQkJCXB1YmxpYyBAaW50ZXJmYWNlIFZhcmlhYmxlT25lVG9PbmUgewotCQkJCSAgICAvKioKLQkJCQkgICAgICogKE9wdGlvbmFsKSBUaGUgaW50ZXJmYWNlIGNsYXNzIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUgCi0JCQkJICAgICAqIGFzc29jaWF0aW9uLiBJZiBub3Qgc3BlY2lmaWVkIGl0IHdpbGwgYmUgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSAKLQkJCQkgICAgICogb2YgdGhlIG9iamVjdCBiZWluZyByZWZlcmVuY2VkLgotCQkJCSAgICAgKi8KLQkJCQkgICAgQ2xhc3MgdGFyZ2V0SW50ZXJmYWNlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCQkJCSAgICAKLQkJCQkgICAgLyoqCi0JCQkJICAgICAqIChPcHRpb25hbCkgVGhlIG9wZXJhdGlvbnMgdGhhdCBtdXN0IGJlIGNhc2NhZGVkIHRvIHRoZSB0YXJnZXQgb2YgCi0JCQkJICAgICAqIHRoZSBhc3NvY2lhdGlvbi4KLQkJCQkgICAgICovCi0JCQkJICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0JCQkJICAgIAotCQkJCSAgICAvKioKLQkJCQkgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLQkJCQkgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLQkJCQkgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSAKLQkJCQkgICAgICogdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgCi0JCQkJICAgICAqIGhpbnQgdG8gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIAotCQkJCSAgICAgKiBkZWZhdWx0cyB0byBFQUdFUi4KLQkJCQkgICAgICovCi0JCQkJICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0JCQkJICAgIAotCQkJCSAgICAvKioKLQkJCQkgICAgICogKE9wdGlvbmFsKSBXaGV0aGVyIHRoZSBhc3NvY2lhdGlvbiBpcyBvcHRpb25hbC4gSWYgc2V0IHRvIGZhbHNlIAotCQkJCSAgICAgKiB0aGVuIGEgbm9uLW51bGwgcmVsYXRpb25zaGlwIG11c3QgYWx3YXlzIGV4aXN0LgotCQkJCSAgICAgKi8KLQkJCQkgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLQkJCQkgIAotCQkJCSAgICAvKioKLQkJCQkgICAgICogKE9wdGlvbmFsKSBUaGUgZGlzY3JpbWluYXRvciBjb2x1bW4gd2lsbCBob2xkIHRoZSB0eXBlIAotCQkJCSAgICAgKiBpbmRpY2F0b3JzLiBJZiB0aGUgRGlzY3JpbWluYXRvckNvbHVtbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbmFtZSAKLQkJCQkgICAgICogb2YgdGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIGRlZmF1bHRzIHRvICJEVFlQRSIgYW5kIHRoZSAKLQkJCQkgICAgICogZGlzY3JpbWluYXRvciB0eXBlIHRvIFNUUklORy4KLQkJCQkgICAgICovCi0JCQkJICAgIERpc2NyaW1pbmF0b3JDb2x1bW4gZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgQERpc2NyaW1pbmF0b3JDb2x1bW47Ci0JCQkJICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBsaXN0IG9mIGRpc2NyaW1pbmF0b3IgdHlwZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIAotICAgICAgICAgICAgICogdGhpcyBWYXJpYWJsZU9uZVRvT25lLiBJZiBub25lIGFyZSBzcGVjaWZpZWQgdGhlbiB0aG9zZSBlbnRpdGllcyAKLSAgICAgICAgICAgICAqIHdpdGhpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCB0aGF0IGltcGxlbWVudCB0aGUgdGFyZ2V0IGludGVyZmFjZSAKLSAgICAgICAgICAgICAqIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgdHlwZXMuIFRoZSBkaXNjcmltaW5hdG9yIHR5cGUgd2lsbCAKLSAgICAgICAgICAgICAqIGRlZmF1bHQgYXMgZm9sbG93czoKLSAgICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBTVFJJTkc6IEVudGl0eS5uYW1lKCkKLSAgICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBDSEFSOiBGaXJzdCBsZXR0ZXIgb2YgdGhlIAotICAgICAgICAgICAgICogICAgRW50aXR5IGNsYXNzCi0gICAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgSU5URUdFUjogVGhlIG5leHQgaW50ZWdlciBhZnRlciAKLSAgICAgICAgICAgICAqICAgIHRoZSBoaWdoZXN0IGludGVnZXIgZXhwbGljaXRseSBhZGRlZC4KLSAgICAgICAgICAgICAqLwotCQkJCSAgICBEaXNjcmltaW5hdG9yQ2xhc3NbXSBkaXNjcmltaW5hdG9yQ2xhc3NlcygpIGRlZmF1bHQge307Ci0JCQkJfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY2xhc3MiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNsYXNzIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1pbnRlcmZhY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBEaXNjcmltaW5hdG9yQ2xhc3MgaXMgdXNlZCB3aXRoaW4gYSBWYXJpYWJsZU9uZVRvT25lIGFubm90YXRpb24uCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7fSkgCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNsYXNzIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBkaXNjcmltaW5hdG9yIHRvIGJlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIAotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBkaXNjcmltaW5hdG9yKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjbGFzcyB0byB0aGUgaW5zdGFudGlhdGVkIHdpdGggdGhlIGdpdmVuIAotICAgICAgICAgICAqIGRpc2NyaW1pbmF0b3IuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImV4aXN0ZW5jZS10eXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICAgICAgLyoqCi0gICAgICAgICAgICogVGhlIEV4aXN0ZW5jZUNoZWNraW5nIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIAotICAgICAgICAgICAqIGNoZWNraW5nIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBlbnRpdGllcy4KLSAgICAgICAgICAgKiAKLSAgICAgICAgICAgKiBBbiBleGlzdGVuY2UtY2hlY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24gYW4gRW50aXR5IG9yIAotICAgICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MgYW5ub3RhdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFeGlzdGVuY2VDaGVja2luZyB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgU2V0IHRoZSBleGlzdGVuY2UgY2hlY2sgZm9yIGRldGVybWluaW5nCi0gICAgICAgICAgICAgKiBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgRXhpc3RlbmNlVHlwZSB2YWx1ZSgpIGRlZmF1bHQgQ0hFQ0tfQ0FDSEU7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCBhbmQgCi0gICAgICAgICAgICogaXQgaXMgaW4gdGhlIGNhY2hlLCB0aGVuIGl0IG11c3QgZXhpc3QuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ0hFQ0tfQ0FDSEUsCi0JCQkKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBQZXJmb3JtIGRvZXMgZXhpc3QgY2hlY2sgb24gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAqLwotICAgICAgICAgIENIRUNLX0RBVEFCQVNFLAotCQkJCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQXNzdW1lIHRoYXQgaWYgdGhlIG9iamVjdHMgcHJpbWFyeSBrZXkgZG9lcyBub3QgaW5jbHVkZSBudWxsIHRoZW4gCi0gICAgICAgICAgICogaXQgbXVzdCBleGlzdC4gVGhpcyBtYXkgYmUgdXNlZCBpZiB0aGUgYXBwbGljYXRpb24gZ3VhcmFudGVlcyBvciAKLSAgICAgICAgICAgKiBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2UgY2hlY2suCi0gICAgICAgICAgICovCi0gICAgICAgICAgQVNTVU1FX0VYSVNURU5DRSwKLQkJCQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFzc3VtZSB0aGF0IHRoZSBvYmplY3QgZG9lcyBub3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIAotICAgICAgICAgICAqIGFwcGxpY2F0aW9uIGd1YXJhbnRlZXMgb3IgZG9lcyBub3QgY2FyZSBhYm91dCB0aGUgZXhpc3RlbmNlIGNoZWNrLiAgCi0gICAgICAgICAgICogVGhpcyB3aWxsIGFsd2F5cyBmb3JjZSBhbiBpbnNlcnQgdG8gYmUgY2FsbGVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIEFTU1VNRV9OT05fRVhJU1RFTkNFCi0JCQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgkgCi0JICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRUNLX0NBQ0hFIiAvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19EQVRBQkFTRSIgLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX0VYSVNURU5DRSIgLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX05PTl9FWElTVEVOQ0UiLz4KLQkgIDwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+CQotCQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzFfMS54c2QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMV8xLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzZmYxNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMV8xLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMyNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gSmF2YSBQZXJzaXN0ZW5jZSBBUEkgb2JqZWN0LXJlbGF0aW9uYWwgbWFwcGluZyBmaWxlIHNjaGVtYSAtLT4KLTx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSIgCi0gIHhtbG5zOm9ybT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSIgCi0gIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgCi0gIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIgCi0gIHZlcnNpb249IjEuMSI+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIyllY2xpcHNlbGlua19vcm1fMV8xLnhzZCAxLjEgIEZlYnJ1YXJ5IDQgMjAwOQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpkb2N1bWVudGF0aW9uPjwhW0NEQVRBWwotCi0gICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIG5ldyBuYXRpdmUgRWNsaXBzZUxpbmsgWE1MIG1ldGFkYXRhCi0gICAgICAgZm9ybWF0IHVzZWQgZm9yIEpQQSBhbmQgbmF0aXZlIGRlcGxveW1lbnQgeG1sIGZpbGVzLiAKLQotICAgICBdXT48L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1wdHlUeXBlIi8+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InZlcnNpb25UeXBlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldKyhcLlswLTldKykqIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbWFwcGluZ3MiPgotICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZW50aXR5LW1hcHBpbmdzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBtYXBwaW5nCi0gICAgICAgIGZpbGUuIEl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZm91ciB0eXBlcyBvZiBlbGVtZW50czoKLQotICAgICAgICAxLiBUaGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IGNvbnRhaW5zIG1ldGFkYXRhCi0gICAgICAgIGZvciB0aGUgZW50aXJlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCBpZiB0aGlzIGVsZW1lbnQKLSAgICAgICAgb2NjdXJzIGluIG11bHRpcGxlIG1hcHBpbmcgZmlsZXMgd2l0aGluIHRoZSBzYW1lIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgIAotICAgICAgICAyLiBUaGUgcGFja2FnZSwgc2NoZW1hLCBjYXRhbG9nIGFuZCBhY2Nlc3MgZWxlbWVudHMgYXBwbHkgdG8gYWxsIG9mCi0gICAgICAgIHRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGRlZmluZWQgaW4KLSAgICAgICAgdGhlIHNhbWUgZmlsZSBpbiB3aGljaCB0aGV5IG9jY3VyLgotCi0gICAgICAgIDMuIFRoZSBzZXF1ZW5jZS1nZW5lcmF0b3IsIHRhYmxlLWdlbmVyYXRvciwgbmFtZWQtcXVlcnksCi0gICAgICAgIG5hbWVkLW5hdGl2ZS1xdWVyeSBhbmQgc3FsLXJlc3VsdC1zZXQtbWFwcGluZyBlbGVtZW50cyBhcmUgZ2xvYmFsCi0gICAgICAgIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lCi0gICAgICAgIHNlcXVlbmNlLWdlbmVyYXRvciBvciB0YWJsZS1nZW5lcmF0b3Igb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZQotICAgICAgICBvciBkaWZmZXJlbnQgbWFwcGluZyBmaWxlcyBpbiBhIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIGFsc28gCi0gICAgICAgIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUgbmFtZWQtcXVlcnkgb3IgbmFtZWQtbmF0aXZlLXF1ZXJ5Ci0gICAgICAgIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNhbWUgb3IgZGlmZmVyZW50IG1hcHBpbmcgZmlsZXMgaW4gYSAKLSAgICAgICAgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICA0LiBUaGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBlYWNoIGRlZmluZQotICAgICAgICB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBtYW5hZ2VkIHBlcnNpc3RlbnQgY2xhc3MuIFRoZSBtYXBwaW5nCi0gICAgICAgIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGVzZSBlbGVtZW50cyBtYXkgYmUgY29tcGxldGUgb3IgaXQgbWF5Ci0gICAgICAgIGJlIHBhcnRpYWwuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhY2thZ2UiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIiB0eXBlPSJvcm06bWFwcGVkLXN1cGVyY2xhc3MiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5IiB0eXBlPSJvcm06ZW50aXR5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGFibGUiIHR5cGU9Im9ybTplbWJlZGRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb25UeXBlIiAKLSAgICAgICAgICAgICAgICAgICAgIGZpeGVkPSIxLjEiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPC94c2Q6ZWxlbWVudD4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgTWV0YWRhdGEgdGhhdCBhcHBsaWVzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFuZCBub3QganVzdCB0byAKLSAgICAgICAgdGhlIG1hcHBpbmcgZmlsZSBpbiB3aGljaCBpdCBpcyBjb250YWluZWQuIAotCi0gICAgICAgIElmIHRoZSB4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSBlbGVtZW50IGlzIHNwZWNpZmllZCB0aGVuIAotICAgICAgICB0aGUgY29tcGxldGUgc2V0IG9mIG1hcHBpbmcgbWV0YWRhdGEgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0IAotICAgICAgICBpcyBjb250YWluZWQgaW4gdGhlIFhNTCBtYXBwaW5nIGZpbGVzIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPiAgICAgICAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZXNlIGRlZmF1bHRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFzIGEgd2hvbGUgCi0gICAgICAgIHVubGVzcyB0aGV5IGFyZSBvdmVycmlkZGVuIGJ5IGxvY2FsIGFubm90YXRpb24gb3IgWE1MIAotICAgICAgICBlbGVtZW50IHNldHRpbmdzLiAKLSAgICAgICAgCi0gICAgICAgIHNjaGVtYSAtIFVzZWQgYXMgdGhlIHNjaGVtYSBmb3IgYWxsIHRhYmxlcyBvciBzZWNvbmRhcnkgdGFibGVzCi0gICAgICAgICAgICB0aGF0IGFwcGx5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGNhdGFsb2cgLSBVc2VkIGFzIHRoZSBjYXRhbG9nIGZvciBhbGwgdGFibGVzIG9yIHNlY29uZGFyeSB0YWJsZXMKLSAgICAgICAgICAgIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgYWNjZXNzIC0gVXNlZCBhcyB0aGUgYWNjZXNzIHR5cGUgZm9yIGFsbCBtYW5hZ2VkIGNsYXNzZXMgaW4KLSAgICAgICAgICAgIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGNhc2NhZGUtcGVyc2lzdCAtIEFkZHMgY2FzY2FkZS1wZXJzaXN0IHRvIHRoZSBzZXQgb2YgY2FzY2FkZSBvcHRpb25zCi0gICAgICAgICAgICBpbiBlbnRpdHkgcmVsYXRpb25zaGlwcyBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBlbnRpdHktbGlzdGVuZXJzIC0gTGlzdCBvZiBkZWZhdWx0IGVudGl0eSBsaXN0ZW5lcnMgdG8gYmUgaW52b2tlZCAKLSAgICAgICAgICAgIG9uIGVhY2ggZW50aXR5IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGFuIGVudGl0eS4gSXMgYWxsb3dlZCB0byBiZQotICAgICAgICBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYW5ub3RhdGlvbnMuCi0gICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gCi0gICAgICAgIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgb24gdGhlIGVudGl0eSBjbGFzcyAoYW5kIGl0cyBmaWVsZHMKLSAgICAgICAgb3IgcHJvcGVydGllcykgYXJlIHRvIGJlIHByb2Nlc3NlZC4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIAotICAgICAgICB0aGUgZGVmYXVsdGluZyBydWxlcyBmb3IgdGhlIGVudGl0eSBhbmQgaXRzIHN1YmVsZW1lbnRzIHdpbGwgCi0gICAgICAgIGJlIHJlY3Vyc2l2ZWx5IGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJvcm06dGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY29uZGFyeS10YWJsZSIgdHlwZT0ib3JtOnNlY29uZGFyeS10YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleSIgdHlwZT0ib3JtOnByaW1hcnkta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmhlcml0YW5jZSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLXZhbHVlIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci12YWx1ZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlIiB0eXBlPSJvcm06Y2FjaGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvcHktcG9saWN5IiB0eXBlPSJvcm06Y29weS1wb2xpY3kiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGlzdGVuY2UtY2hlY2tpbmciIHR5cGU9Im9ybTpleGlzdGVuY2UtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgZWxlbWVudCBjb250YWlucyB0aGUgZW50aXR5IGZpZWxkIG9yIHByb3BlcnR5IG1hcHBpbmdzLgotICAgICAgICBJdCBtYXkgYmUgc3BhcnNlbHkgcG9wdWxhdGVkIHRvIGluY2x1ZGUgb25seSBhIHN1YnNldCBvZiB0aGUKLSAgICAgICAgZmllbGRzIG9yIHByb3BlcnRpZXMuIElmIG1ldGFkYXRhLWNvbXBsZXRlIGZvciB0aGUgZW50aXR5IGlzIHRydWUKLSAgICAgICAgdGhlbiB0aGUgcmVtYWluZGVyIG9mIHRoZSBhdHRyaWJ1dGVzIHdpbGwgYmUgZGVmYXVsdGVkIGFjY29yZGluZwotICAgICAgICB0byB0aGUgZGVmYXVsdCBydWxlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkIiB0eXBlPSJvcm06aWQiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQtaWQiIHR5cGU9Im9ybTplbWJlZGRlZC1pZCIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYyIgdHlwZT0ib3JtOmJhc2ljIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYy1jb2xsZWN0aW9uIiB0eXBlPSJvcm06YmFzaWMtY29sbGVjdGlvbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMtbWFwIiB0eXBlPSJvcm06YmFzaWMtbWFwIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1vbmUiIHR5cGU9Im9ybTptYW55LXRvLW9uZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW1hbnkiIHR5cGU9Im9ybTpvbmUtdG8tbWFueSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW9uZSIgdHlwZT0ib3JtOm9uZS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUiIHR5cGU9Im9ybTp2YXJpYWJsZS1vbmUtdG8tb25lIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW1hbnkiIHR5cGU9Im9ybTptYW55LXRvLW1hbnkiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRlZCIgdHlwZT0ib3JtOmVtYmVkZGVkIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2Zvcm1hdGlvbiIgdHlwZT0ib3JtOnRyYW5zZm9ybWF0aW9uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2llbnQiIHR5cGU9Im9ybTp0cmFuc2llbnQiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImFjY2Vzcy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGRldGVybWluZXMgaG93IHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBhY2Nlc3NlcyB0aGUKLSAgICAgICAgc3RhdGUgb2YgYW4gZW50aXR5IG9yIGVtYmVkZGVkIG9iamVjdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBST1BFUlRZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSUVMRCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlMaXN0ZW5lcnMgewotICAgICAgICAgIENsYXNzW10gdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXIiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWxpc3RlbmVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyBhbiBlbnRpdHkgbGlzdGVuZXIgdG8gYmUgaW52b2tlZCBhdCBsaWZlY3ljbGUgZXZlbnRzCi0gICAgICAgIGZvciB0aGUgZW50aXRpZXMgdGhhdCBsaXN0IHRoaXMgbGlzdGVuZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXBlcnNpc3QiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVSZW1vdmUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtdXBkYXRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtdXBkYXRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0VXBkYXRlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LWxvYWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RMb2FkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3BlcnR5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIEEgdXNlciBkZWZpbmVkIG1hcHBpbmcncyBwcm9wZXJ0eS4KLQkJQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgVFlQRX0pCi0JCUBSZXRlbnRpb24oUlVOVElNRSkKLQkJcHVibGljIEBpbnRlcmZhY2UgUHJvcGVydHkgewotCQkJLyoqCi0JCQkqIFByb3BlcnR5IG5hbWUuCi0JCQkqLyAKLQkJCVN0cmluZyBuYW1lKCk7Ci0JCQkKLQkJCS8qKgotCQkJKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgUHJvcGVydHkgdmFsdWUsCi0JCQkqIGNvbnZlcnRlZCB0byBhbiBpbnN0YW5jZSBvZiB2YWx1ZVR5cGUuCi0JCQkqLyAKLQkJCVN0cmluZyB2YWx1ZSgpOwotCQkJCi0JCQkvKioKLQkJCSogUHJvcGVydHkgdmFsdWUgdHlwZS4KLQkJCSogVGhlIHZhbHVlIGNvbnZlcnRlZCB0byB2YWx1ZVR5cGUgYnkgQ29udmVyc2lvbk1hbmFnZXIuCi0JCQkqIElmIHNwZWNpZmllZCBtdXN0IGJlIGEgc2ltcGxlIHR5cGUgdGhhdCBjb3VsZCBiZSBoYW5kbGVkIGJ5IAotCQkJKiBDb252ZXJzaW9uTWFuYWdlcjogCi0JCQkqIG51bWVyaWNhbCwgYm9vbGVhbiwgdGVtcG9yYWwuICAKLQkJCSovIAotCQkJQ2xhc3MgdmFsdWVUeXBlKCkgZGVmYXVsdCBTdHJpbmcuY2xhc3M7Ci0JCX0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIAotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWhpbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpIAotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBRdWVyeUhpbnQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkTmF0aXZlUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsgLy9uYW1lZCBTcWxSZXN1bHRTZXRNYXBwaW5nCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNxbFJlc3VsdFNldE1hcHBpbmcgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgRW50aXR5UmVzdWx0W10gZW50aXRpZXMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENvbHVtblJlc3VsdFtdIGNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1yZXN1bHQiIHR5cGU9Im9ybTplbnRpdHktcmVzdWx0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLXJlc3VsdCIgdHlwZT0ib3JtOmNvbHVtbi1yZXN1bHQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eVJlc3VsdCB7Ci0gICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MoKTsKLSAgICAgICAgICBGaWVsZFJlc3VsdFtdIGZpZWxkcygpIGRlZmF1bHQge307Ci0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkLXJlc3VsdCIgdHlwZT0ib3JtOmZpZWxkLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImVudGl0eS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRmllbGRSZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbigpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbHVtbi1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbHVtblJlc3VsdCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY29uZGFyeS10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlY29uZGFyeVRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbltdIHBrSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgICB9Ci0KLSAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludCB7Ci0gICAgICAgICAgU3RyaW5nW10gY29sdW1uTmFtZXMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgotICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5Db2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImdlbmVyYXRpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEdlbmVyYXRpb25UeXBlIHsgVEFCTEUsIFNFUVVFTkNFLCBJREVOVElUWSwgQVVUTyB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFUVVFTkNFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJREVOVElUWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjY2Vzcy1tZXRob2RzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBdHRyaWJ1dGVPdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBDb2x1bW4gY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEFzc29jaWF0aW9uT3ZlcnJpZGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQtY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZENsYXNzIHsKLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkLWlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWRJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNpZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHJhbnNpZW50IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZlcnNpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBWZXJzaW9uIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljIHsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiIHR5cGU9Im9ybTpnZW5lcmF0ZWQtdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIgdHlwZT0ib3JtOmxvYiIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW51bWVyYXRlZCIgdHlwZT0ib3JtOmVudW1lcmF0ZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC10cmFuc2Zvcm1lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JCS8qKgotCQkgKiBBbm5vdGF0aW9uIGZvciBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0JCSAqIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgCi0JCSAqIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgCi0JCSAqIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0JCSAqICAKLQkJICogQWxzbyB1bmxlc3MgaXQncyBhIHJlYWQtb25seSBtYXBwaW5nLCBlaXRoZXIgV3JpdGVUcmFuc2Zvcm1lciAKLQkJICogYW5ub3RhdGlvbiBvciBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uIHNob3VsZCBiZSBzcGVjaWZpZWQuIEVhY2ggCi0JCSAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCi0JCSAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVyKS4gCi0JCSAqLyAKLQkJQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0JCUBSZXRlbnRpb24oUlVOVElNRSkKLQkJcHVibGljIEBpbnRlcmZhY2UgUmVhZFRyYW5zZm9ybWVyIHsKLQkJICAgIC8qKgotCQkgICAgICogVXNlci1kZWZpbmVkIGNsYXNzIHRoYXQgbXVzdCBpbXBsZW1lbnQgdGhlIAotCQkgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MudHJhbnNmb3JtZXJzLkF0dHJpYnV0ZVRyYW5zZm9ybWVyIAotCQkgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyAKLQkJICAgICAqIGJ1aWxkQXR0cmlidXRlVmFsdWUgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFsdWUgdG8gYmUgCi0JCSAgICAgKiBhc3NpZ25lZCB0byB0aGUgYXR0cmlidXRlLgotCQkgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0JCSAgICAgKi8gCi0JCSAgICBDbGFzcyB0cmFuc2Zvcm1lckNsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCQkKLQkJICAgIC8qKgotCQkgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLQkJICAgICAqIGEgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZSAobm90IGFzc2lnbnMgdGhlIHZhbHVlIHRvIAotCQkgICAgICogdGhlIGF0dHJpYnV0ZSkuIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIAotCQkgICAgICogc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0JCSAgICAgKi8gCi0JCSAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLQkJfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3cml0ZS10cmFuc2Zvcm1lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JCS8qKgotCQkgKiBBbm5vdGF0aW9uIGZvciBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0JCSAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCi0JCSAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVyKS4KLQkJICogIAotCQkgKiBBIHNpbmdsZSBXcml0ZVRyYW5zZm9ybWVyIG1heSBiZSBzcGVjaWZpZWQgZGlyZWN0bHkgb24gdGhlIG1ldGhvZCBvciAKLQkJICogYXR0cmlidXRlLiBNdWx0aXBsZSBXcml0ZVRyYW5zZm9ybWVycyBzaG91bGQgYmUgd3JhcHBlZCBpbnRvIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uLiBObyBXcml0ZVRyYW5zZm9ybWVycyBzcGVjaWZpZWQgZm9yIAotCQkgKiByZWFkLW9ubHkgbWFwcGluZy4gVW5sZXNzIHRoZSBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgaXMgd3JpdGUtb25seSwgaXQgCi0JCSAqIHNob3VsZCBoYXZlIGEgUmVhZFRyYW5zZm9ybWVyLCBpdCBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIGRhdGFiYXNlIAotCQkgKiBjb2x1bW4ocykgdmFsdWUocylpbnRvIGF0dHJpYnV0ZSB2YWx1ZS4KLQkJICovIAotCQlAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLQkJQFJldGVudGlvbihSVU5USU1FKQotCQlwdWJsaWMgQGludGVyZmFjZSBXcml0ZVRyYW5zZm9ybWVyIHsKLQkJICAgIC8qKgotCQkgICAgICogVXNlci1kZWZpbmVkIGNsYXNzIHRoYXQgbXVzdCBpbXBsZW1lbnQgdGhlIAotCQkgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MudHJhbnNmb3JtZXJzLkZpZWxkVHJhbnNmb3JtZXIgCi0JCSAgICAgKiBpbnRlcmZhY2UuIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCwgaXRzIGJ1aWxkRmllbGRWYWx1ZSAKLQkJICAgICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgZGF0YWJhc2UgCi0JCSAgICAgKiBjb2x1bW4uIE5vdGUgdGhhdCBmb3IgZGRsIGdlbmVyYXRpb24gYW5kIHJldHVybmluZyB0byBiZSAKLQkJICAgICAqIHN1cHBvcnRlZCB0aGUgbWV0aG9kIGJ1aWxkRmllbGRWYWx1ZSBpbiB0aGUgY2xhc3Mgc2hvdWxkIGJlIAotCQkgICAgICogZGVmaW5lZCB0byByZXR1cm4gdGhlIHJlbGV2YW50IEphdmEgdHlwZSwgbm90IGp1c3QgT2JqZWN0IGFzIAotCQkgICAgICogZGVmaW5lZCBpbiB0aGUgaW50ZXJmYWNlLCBmb3IgaW5zdGFuY2U6Ci0JCSAgICAgKiBwdWJsaWMgVGltZSBidWlsZEZpZWxkVmFsdWUoT2JqZWN0IGluc3RhbmNlLCBTdHJpbmcgZmllbGROYW1lLCBTZXNzaW9uIHNlc3Npb24pLgotCQkgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0JCSAgICAgKi8gCi0JCSAgICBDbGFzcyB0cmFuc2Zvcm1lckNsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCQkKLQkJICAgIC8qKgotCQkgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLQkJICAgICAqIGEgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBkYXRhYmFzZSBjb2x1bW4uCi0JCSAgICAgKiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgc3VwcG9ydGVkIHRoZSAKLQkJICAgICAqIG1ldGhvZCBzaG91bGQgYmUgZGVmaW5lZCB0byByZXR1cm4gYSBwYXJ0aWN1bGFyIHR5cGUsIG5vdCBqdXN0IAotCQkgICAgICogT2JqZWN0LCBmb3IgaW5zdGFuY2U6Ci0JCSAgICAgKiBwdWJsaWMgVGltZSBnZXRTdGFydFRpbWUoKS4KLQkJICAgICAqIFRoZSBtZXRob2QgbWF5IHJlcXVpcmUgYSBUcmFuc2llbnQgYW5ub3RhdGlvbiB0byBhdm9pZCBiZWluZyAKLQkJICAgICAqIG1hcHBlZCBhcyBCYXNpYyBieSBkZWZhdWx0LgotCQkgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0JCSAgICAgKi8gCi0JCSAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLQkJCi0JCSAgICAvKioKLQkJICAgICAqIFNwZWNpZnkgaGVyZSB0aGUgY29sdW1uIGludG8gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuLgotCQkgICAgICogVGhlIG9ubHkgY2FzZSB3aGVuIHRoaXMgY291bGQgYmUgc2tpcHBlZCBpcyBpZiBhIHNpbmdsZSAKLQkJICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGVzIGFuIGF0dHJpYnV0ZSAtIHRoZSBhdHRyaWJ1dGUncyBuYW1lIAotCQkgICAgICogd2lsbCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWUuCi0JCSAgICAgKi8gCi0JCSAgICBDb2x1bW4gY29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotCQl9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCQkvKioKLQkJICogVHJhbnNmb3JtYXRpb24gaXMgYW4gb3B0aW9uYWwgYW5ub3RhdGlvbiBmb3IgCi0JCSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLlRyYW5zZm9ybWF0aW9uTWFwcGluZy4KLQkJICogVHJhbnNmb3JtYXRpb25NYXBwaW5nIGFsbG93cyB0byBtYXAgYW4gYXR0cmlidXRlIHRvIG9uZSBvciBtb3JlIAotCQkgKiBkYXRhYmFzZSBjb2x1bW5zLgotCQkgKiAKLQkJICogVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbiBpcyBhbiBvcHRpb25hbCBwYXJ0IG9mIAotCQkgKiBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgZGVmaW5pdGlvbi4gVW5sZXNzIHRoZSBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgaXMgCi0JCSAqIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgUmVhZFRyYW5zZm9ybWVyLCBpdCBkZWZpbmVzIAotCQkgKiB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgdmFsdWUocylpbnRvIGF0dHJpYnV0ZSB2YWx1ZS4KLQkJICogQWxzbyB1bmxlc3MgaXQncyBhIHJlYWQtb25seSBtYXBwaW5nLCBlaXRoZXIgV3JpdGVUcmFuc2Zvcm1lciAKLQkJICogYW5ub3RhdGlvbiBvciBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uIHNob3VsZCBiZSBzcGVjaWZpZWQuIEVhY2ggCi0JCSAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCi0JCSAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVyKS4gCi0JCSAqLyAKLQkJQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0JCUBSZXRlbnRpb24oUlVOVElNRSkKLQkJcHVibGljIEBpbnRlcmZhY2UgVHJhbnNmb3JtYXRpb24gewotCQkgICAgLyoqCi0JCSAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotCQkgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLQkJICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgCi0JCSAgICAgKiB0aGF0IHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSAKLQkJICAgICAqIGhpbnQgdG8gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIAotCQkgICAgICogZGVmYXVsdHMgdG8gRUFHRVIuCi0JCSAgICAgKi8KLQkJICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0JCSAgICAKLQkJICAgIC8qKgotCQkgICAgICogKE9wdGlvbmFsKSBUaGUgb3B0aW9uYWwgZWxlbWVudCBpcyBhIGhpbnQgYXMgdG8gd2hldGhlciB0aGUgdmFsdWUKLQkJICAgICAqICBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgbWF5IGJlIG51bGwuIEl0IGlzIGRpc3JlZ2FyZGVkCi0JCSAgICAgKiAgZm9yIHByaW1pdGl2ZSB0eXBlcywgd2hpY2ggYXJlIGNvbnNpZGVyZWQgbm9uLW9wdGlvbmFsLgotCQkgICAgICovCi0JCSAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotCQl9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWQtdHJhbnNmb3JtZXIiIHR5cGU9Im9ybTpyZWFkLXRyYW5zZm9ybWVyIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiIHR5cGU9Im9ybTp3cml0ZS10cmFuc2Zvcm1lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZldGNoLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBGZXRjaFR5cGUgeyBMQVpZLCBFQUdFUiB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEFaWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUFHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBMb2Ige30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGVtcG9yYWwgewotICAgICAgICAgIFRlbXBvcmFsVHlwZSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9Im9ybTp0ZW1wb3JhbC10eXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gVGVtcG9yYWxUeXBlIHsKLSAgICAgICAgICBEQVRFLCAvLyBqYXZhLnNxbC5EYXRlCi0gICAgICAgICAgVElNRSwgLy8gamF2YS5zcWwuVGltZQotICAgICAgICAgIFRJTUVTVEFNUCAvLyBqYXZhLnNxbC5UaW1lc3RhbXAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRBVEUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElNRSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FU1RBTVAiLz4KLSAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtZXJhdGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW51bWVyYXRlZCB7Ci0gICAgICAgICAgRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOmVudW0tdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW51bS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRW51bVR5cGUgewotICAgICAgICAgIE9SRElOQUwsCi0gICAgICAgICAgU1RSSU5HCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9SRElOQUwiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUUklORyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvT25lIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4gICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+ICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhc2NhZGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIENhc2NhZGVUeXBlIHsgQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNIfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1hbGwiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtbWVyZ2UiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZW1vdmUiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZWZyZXNoIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9PbmUgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+ICAgICAgIAotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5UYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBpbnZlcnNlSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludmVyc2Utam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgR2VuZXJhdGVkVmFsdWUgewotICAgICAgICAgIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBBVVRPOwotICAgICAgICAgIFN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmdlbmVyYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcmRlci1ieSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQnkgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluaGVyaXRhbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5oZXJpdGFuY2UgewotICAgICAgICAgIEluaGVyaXRhbmNlVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgU0lOR0xFX1RBQkxFOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJpbmhlcml0YW5jZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gSW5oZXJpdGFuY2VUeXBlCi0gICAgICAgICAgeyBTSU5HTEVfVEFCTEUsIEpPSU5FRCwgVEFCTEVfUEVSX0NMQVNTfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJTkdMRV9UQUJMRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk9JTkVEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUJMRV9QRVJfQ0xBU1MiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yVmFsdWUgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIERpc2NyaW1pbmF0b3JUeXBlIHsgU1RSSU5HLCBDSEFSLCBJTlRFR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQVIiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVEVHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByaW1hcnlLZXlKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIkRUWVBFIjsKLSAgICAgICAgICBEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSgpIGRlZmF1bHQgU1RSSU5HOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAzMTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGVtYmVkZGFibGUgb2JqZWN0cy4gSXMgCi0gICAgICAgIGFsbG93ZWQgdG8gYmUgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgIHRoZSBhbm5vdGF0aW9ucy4gQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSAKLSAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkIAotICAgICAgICBpbiB0aGUgY2xhc3MuIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIAotICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGFibGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhIG1hcHBlZCBzdXBlcmNsYXNzLiBJcyAKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCi0gICAgICAgIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5IAotICAgICAgICBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBwZWRTdXBlcmNsYXNze30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5IiB0eXBlPSJvcm06cHJpbWFyeS1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZSIgdHlwZT0ib3JtOmNhY2hlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGlzdGVuY2UtY2hlY2tpbmciIHR5cGU9Im9ybTpleGlzdGVuY2UtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2VxdWVuY2VHZW5lcmF0b3IgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHNlcXVlbmNlTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMTsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VxdWVuY2UtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUtZ2VuZXJhdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGVHZW5lcmF0b3IgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHBrQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHBrQ29sdW1uVmFsdWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDA7Ci0gICAgICAgICAgaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MDsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlIGFjcm9zcyAKLSAgICAgICAgICAgKiB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY29udmVydGVyIGNsYXNzIHRvIGJlIHVzZWQuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQKLSAgICAgICAgICAgKiB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuY29udmVydGVycy5Db252ZXJ0ZXIgaW50ZXJmYWNlLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGNvbnZlcnRlckNsYXNzKCk7IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHlwZUNvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlCi0gICAgICAgICAgICogYWNyb3NzIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVuY2UgZmllbGQgCi0gICAgICAgICAgICogb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgZGF0YVR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBlbnRpdHkuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVudCBmaWVsZCAKLSAgICAgICAgICAgKiBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBvYmplY3RUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9iamVjdFR5cGVDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZQotICAgICAgICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICAgICAgKiBmaWVsZCBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IAotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIGNvbnZlcnNpb24gdmFsdWVzIHRvIGJlIHVzZWQgCi0gICAgICAgICAgICogd2l0aCB0aGUgb2JqZWN0IGNvbnZlcnRlci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJzaW9uVmFsdWVbXSBjb252ZXJzaW9uVmFsdWVzKCk7Ci0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSBhIGRlZmF1bHQgb2JqZWN0IHZhbHVlLiBVc2VkIGZvciAKLSAgICAgICAgICAgICogbGVnYWN5IGRhdGEgaWYgdGhlIGRhdGEgdmFsdWUgaXMgbWlzc2luZy4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgIFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIiB0eXBlPSJvcm06Y29udmVyc2lvbi12YWx1ZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtb2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnZlcnNpb24tdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbnZlcnNpb25WYWx1ZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBkYXRhYmFzZSB2YWx1ZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgZGF0YVZhbHVlKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIG9iamVjdCB2YWx1ZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgb2JqZWN0VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9iamVjdC12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RydWN0LWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0cnVjdENvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlIGFjcm9zcyAKLSAgICAgICAgICAgKiB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY29udmVydGVyIGNsYXNzIHRvIGJlIHVzZWQuIFRoaXMgY2xhc3MgbXVzdCAKLSAgICAgICAgICAgKiBpbXBsZW1lbnQgdGhlIEVjbGlwc2VMaW5rIGludGVyZmFjZSAKLSAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBjb252ZXJ0ZXIoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogQSBDb3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGEgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ29weVBvbGljeSBvbiBhbiBFbnRpdHkuCi0gICAgICAgICAqIEl0IGlzIHJlcXVpcmVkIHRoYXQgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ29weVBvbGljeSBiZSBzcGVjaWZpZWQgCi0gICAgICAgICAqIGFzIHRoZSBhcmd1bWVudC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEEgQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcyBvciAKLSAgICAgICAgICogRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEZvciBpbnN0YW5jZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ29weVBvbGljeSgiZXhhbXBsZS5NeUNvcHlQb2xpY3kiKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29weVBvbGljeSB7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgKiAoUmVxdWlyZWQpCi0gICAgICAgICogVGhpcyBkZWZpbmVzIHRoZSBjbGFzcyBvZiB0aGUgY29weSBwb2xpY3kuIEl0IG11c3Qgc3BlY2lmeSBhIGNsYXNzIAotICAgICAgICAqIHRoYXQgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kKLSAgICAgICAgKi8KLSAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkluc3RhbnRpYXRpb25Db3B5UG9saWN5IAotICAgICAgICAgKiBvbiBhbiBFbnRpdHkuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHRoZSBkZWZhdWx0IENvcHlQb2xpY3kgaW4gCi0gICAgICAgICAqIEVjbGlwc2VMaW5rIGFuZCB0aGVyZWZvcmUgdGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBvbmx5IHVzZWQgdG8gCi0gICAgICAgICAqIG92ZXJyaWRlIG90aGVyIHR5cGVzIG9mIGNvcHkgcG9saWNpZXMKLSAgICAgICAgICogCi0gICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogRXhhbXBsZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBASW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbnN0YW50aWF0aW9uQ29weVBvbGljeSB7Ci0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogQSBDbG9uZUNvcHlQb2xpY3kgaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ2xvbmVDb3B5UG9saWN5IG9uIGFuIAotICAgICAgICAgKiBFbnRpdHkuIEEgQ2xvbmVDb3B5UG9saWN5IG11c3Qgc3BlY2lmeSBhdCBvbmUgb3IgYm90aCBvZiB0aGUgIm1ldGhvZCIgCi0gICAgICAgICAqIG9yICJ3b3JraW5nQ29weU1ldGhvZCIuICJ3b3JraW5nQ29weU1ldGhvZCIgaXMgdXNlZCB0byBjbG9uZSBvYmplY3RzIAotICAgICAgICAgKiB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlIHVzZXIgYXMgdGhleSBhcmUgcmVnaXN0ZXJlZCBpbiAKLSAgICAgICAgICogRWNsaXBzZUxpbmsncyB0cmFuc2FjdGlvbmFsIG1lY2hhbmlzbSwgdGhlIFVuaXRPZldvcmsuICJtZXRob2QiIHdpbGwgCi0gICAgICAgICAqIGJlIHVzZWQgZm9yIHRoZSBjbG9uZSB0aGF0IGlzIHVzZWQgZm9yIGNvbXBhcmlzb24gaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgICogRWNsaXBzZUxpbmsncyBEZWZlcnJlZENoYW5nZURldGVjdGlvblBvbGljeQotICAgICAgICAgKiAgCi0gICAgICAgICAqIEEgQ2xvbmVDb3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzCi0gICAgICAgICAqIG9yIEVtYmVkZGFibGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBFeGFtcGxlOgotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kobWV0aG9kPSJteUNsb25lTWV0aG9kIikKLSAgICAgICAgICogCi0gICAgICAgICAqIG9yOgotICAgICAgICAgKiAKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KG1ldGhvZD0ibXlDbG9uZU1ldGhvZCIsIHdvcmtpbmdDb3B5TWV0aG9kPSJteVdvcmtpbmdDb3B5Q2xvbmVNZXRob2QiKQotICAgICAgICAgKiAKLSAgICAgICAgICogb3I6Ci0gICAgICAgICAqIAotICAgICAgICAgIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeSh3b3JraW5nQ29weU1ldGhvZE5hbWU9Im15V29ya2luZ0NvcHlDbG9uZSIpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDbG9uZUNvcHlQb2xpY3kgewotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkKLSAgICAgICAgICAgICAqIEVpdGhlciBtZXRob2Qgb3Igd29ya2luZ0NvcHlNZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQgdGhpcyBkZWZpbmVzIAotICAgICAgICAgICAgICogYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCB3aWxsIGJlIHVzZWQgCi0gICAgICAgICAgICAgKiBmb3IgY29tcGFyaXNvbiBieQotICAgICAgICAgICAgICogRWNsaXBzZUxpbmsncyBEZWZlcnJlZENoYW5nZURldGVjdGlvblBvbGljeQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZAotICAgICAgICAgICAgICogdGhpcyBkZWZpbmVzIGEgbWV0aG9kIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNsb25lIHRoYXQgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBvYmplY3QgcmV0dXJuZWQgd2hlbiByZWdpc3RlcmluZyBhbiAKLSAgICAgICAgICAgICAqIE9iamVjdCBpbiBhbiBFY2xpcHNlTGluayBVbml0T2ZXb3JrCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyB3b3JraW5nQ29weU1ldGhvZCgpOwotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ3b3JraW5nLWNvcHktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sbGVjdGlvblRhYmxlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRhYmxlLiBJZiBpdCBpcyBub3QgCi0gICAgICAgICAgICogc3BlY2lmaWVkLCBpdCBpcyBkZWZhdWx0ZWQgdG8gdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGZvbGxvd2luZzogCi0gICAgICAgICAgICogdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBlbnRpdHk7ICJfIiA7IHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgCi0gICAgICAgICAgICogcHJvcGVydHkgb3IgZmllbGQgb2YgdGhlIHNvdXJjZSBlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhdGFsb2cgb2YgdGhlIHRhYmxlLiBJdCBkZWZhdWx0cyB0byB0aGUgcGVyc2lzdGVuY2UgCi0gICAgICAgICAgICogdW5pdCBkZWZhdWx0IGNhdGFsb2cuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNjaGVtYSBvZiB0aGUgdGFibGUuIEl0IGRlZmF1bHRzIHRvIHRoZSBwZXJzaXN0ZW5jZSAKLSAgICAgICAgICAgKiB1bml0IGRlZmF1bHQgc2NoZW1hLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVXNlZCB0byBzcGVjaWZ5IGEgcHJpbWFyeSBrZXkgY29sdW1uIHRoYXQgaXMgdXNlZCBhcyBhIAotICAgICAgICAgICAqIGZvcmVpZ24ga2V5IHRvIGpvaW4gdG8gYW5vdGhlciB0YWJsZS4gSWYgdGhlIHNvdXJjZSBlbnRpdHkgdXNlcyBhIAotICAgICAgICAgICAqIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSwgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBtdXN0IGJlIHNwZWNpZmllZCAKLSAgICAgICAgICAgKiBmb3IgZWFjaCBmaWVsZCBvZiB0aGUgY29tcG9zaXRlIHByaW1hcnkga2V5LiBJbiBhIHNpbmdsZSBwcmltYXJ5IAotICAgICAgICAgICAqIGtleSBjYXNlLCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG1heSBvcHRpb25hbGx5IGJlIHNwZWNpZmllZC4gCi0gICAgICAgICAgICogRGVmYXVsdGluZyB3aWxsIGFwcGx5IG90aGVyd2lzZSBhcyBmb2xsb3dzOgotICAgICAgICAgICAqIG5hbWUsIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgcHJpbWFyeSB0YWJsZSAKLSAgICAgICAgICAgKiBvZiB0aGUgc291cmNlIGVudGl0eS4gcmVmZXJlbmNlZENvbHVtbk5hbWUsIHRoZSBzYW1lIG5hbWUgb2YgCi0gICAgICAgICAgICogcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSBwcmltYXJ5IHRhYmxlIG9mIHRoZSBzb3VyY2UgZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsgCi0gCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVbmlxdWUgY29uc3RyYWludHMgdGhhdCBhcmUgdG8gYmUgcGxhY2VkIG9uIHRoZSB0YWJsZS4gCi0gICAgICAgICAgICogVGhlc2UgYXJlIG9ubHkgdXNlZCBpZiB0YWJsZSBnZW5lcmF0aW9uIGlzIGluIGVmZmVjdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OyAKLSAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljLWNvbGxlY3Rpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpY0NvbGxlY3Rpb24gewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCi0gICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCi0gICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAotICAgICAgICAgICAqIExBWlkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOyAKLSAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSB2YWx1ZSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IAotICAgICAgICAgICAqIGNvbGxlY3Rpb24gZGF0YS4gRGVmYXVsdHMgdG8gdGhlIHByb3BlcnR5IG9yIGZpZWxkIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uIHZhbHVlQ29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sbGVjdGlvbi10YWJsZSIgdHlwZT0ib3JtOmNvbGxlY3Rpb24tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtbWFwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNNYXAgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCi0gICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCi0gICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAotICAgICAgICAgICAqIExBWlkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IG1hcCAKLSAgICAgICAgICAgKiBrZXkuIElmIHRoZSBuYW1lIG9uIHRlIGtleSBjb2x1bW4gaXMgIiIsIHRoZSBuYW1lIHdpbGwgZGVmYXVsdCB0bzoKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb3IgZmllbGQ7ICJfS0VZIi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4ga2V5Q29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSBrZXkgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAotICAgICAgICAgICAqIHRoZSBkaXJlY3QgbWFwIGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJ0IGtleUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHZhbHVlIGNvbnZlcnRlci4gRGVmYXVsdCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAgICAgICAqIHNwZWNpZnlpbmcgQENvbnZlcnQoIm5vbmUiKSwgbWVhbmluZyBubyBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgY29sdW1uIG1hcHBpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVydCB2YWx1ZUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+ICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06Y29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEpvaW5GZXRjaFR5cGUgewotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBkb2VzIG5vdCBhbGxvdyBmb3IgbnVsbC9lbXB0eSB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBJTk5FUiwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBhbGxvd3MgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgotICAgICAgICAgKi8KLSAgICAgICAgT1VURVIsCi0gICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTk5FUiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VURVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAqIG9wdGltaXN0aWMgbG9ja2luZyBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgCi0gICAgICAgICAqIGVudGl0aWVzLiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24KLSAgICAgICAgICogYW4gZW50aXR5IG9yIG1hcHBlZC1zdXBlcmNsYXNzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSXQgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBvcHRpbWlzdGljLWxvY2tpbmctdHlwZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcHRpbWlzdGljTG9ja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHRvIHVzZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPcHRpbWlzdGljTG9ja2luZ1R5cGUgdHlwZSgpIGRlZmF1bHQgVkVSU0lPTl9DT0xVTU47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IG9mIHR5cGUgCi0gICAgICAgICAgICogU0VMRUNURURfQ09MVU1OUywgdGhpcyBhbm5vdGF0aW9uIG1lbWJlciBiZWNvbWVzIGEgKFJlcXVpcmVkKSAKLSAgICAgICAgICAgKiBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBzZWxlY3RlZENvbHVtbnMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHdoZXJlIHRoZSBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHNob3VsZCAKLSAgICAgICAgICAgKiBjYXNjYWRlIGxvY2suIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB3aXRoIFZFUlNJT05fQ09MVU1OIGxvY2tpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBjYXNjYWRlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWxlY3RlZC1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FzY2FkZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIHNpbXBsZSB0eXBlIHRoYXQgaXMgdXNlZCB3aXRoaW4gYW4gb3B0aW1pc3RpYy1sb2NraW5nIAotICAgICAgICAgKiBzcGVjaWZpY2F0aW9uIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2Ygb3B0aW1pc3RpYy1sb2NraW5nIHRoYXQKLSAgICAgICAgICogRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIG9yIGRlbGV0aW5nIGVudGl0aWVzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGVudW0gT3B0aW1pc3RpY0xvY2tpbmdUeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgZXZlcnkgZmllbGQgaW4gdGhlIHRhYmxlCi0gICAgICAgICAgICogaW4gdGhlIFdIRVJFIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZSBvciBhIGRlbGV0ZS4gSWYgYW55IGZpZWxkCi0gICAgICAgICAgICogaGFzIGJlZW4gY2hhbmdlZCwgYW4gb3B0aW1pc3RpYyBsb2NraW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBTExfQ09MVU1OUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIHBvbGljeSBjb21wYXJlcyBvbmx5IHRoZSBjaGFuZ2VkIGZpZWxkcwotICAgICAgICAgICAqIGluIHRoZSBXSEVSRSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUuIElmIGFueSBmaWVsZCBoYXMgYmVlbgotICAgICAgICAgICAqIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uIEEgZGVsZXRlCi0gICAgICAgICAgICogd2lsbCBvbmx5IGNvbXBhcmUgdGhlIHByaW1hcnkga2V5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENIQU5HRURfQ09MVU1OUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIGNvbXBhcmVzIHNlbGVjdGVkIGZpZWxkcyBpbiB0aGUgV0hFUkUKLSAgICAgICAgICAgKiBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUgb3IgYSBkZWxldGUuIElmIGFueSBmaWVsZCBoYXMgYmVlbgotICAgICAgICAgICAqIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uIE5vdGUgdGhhdAotICAgICAgICAgICAqIHRoZSBmaWVsZHMgc3BlY2lmaWVkIG11c3QgYmUgbWFwcGVkIGFuZCBub3QgYmUgcHJpbWFyeSBrZXlzLgotICAgICAgICAgICAqLwotICAgICAgICAgIFNFTEVDVEVEX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgYSBzaW5nbGUgdmVyc2lvbiBudW1iZXIKLSAgICAgICAgICAgKiBpbiB0aGUgd2hlcmUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlLiBUaGUgdmVyc2lvbiBmaWVsZCBtdXN0IGJlCi0gICAgICAgICAgICogbWFwcGVkIGFuZCBub3QgYmUgdGhlIHByaW1hcnkga2V5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFZFUlNJT05fQ09MVU1OCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUxMX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQU5HRURfQ09MVU1OUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VMRUNURURfQ09MVU1OUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkVSU0lPTl9DT0xVTU4iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkJLyoqIAotCQkgKiAgVGhlIFByaW1hcnlLZXkgYW5ub3RhdGlvbiBhbGxvd3MgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvZiB0aGUgSWQuCi0JCSAqICBBIHZhbGlkYXRpb24gcG9saWN5IGNhbiBiZSBnaXZlbiB0aGF0IGFsbG93cyBzcGVjaWZ5aW5nIGlmIHplcm8gaXMgYSB2YWxpZCBpZCB2YWx1ZS4KLQkJICogIFRoZSBzZXQgb2YgcHJpbWFyeSBrZXkgY29sdW1ucyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgcHJlY2lzZWx5LgotCQkgKiAKLQkJICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0JCSAqIEBzaW5jZSBFY2xpcHNlTGluayAxLjEKLQkJICovIAotCQlAVGFyZ2V0KHtUWVBFfSkKLQkJQFJldGVudGlvbihSVU5USU1FKQotCQlwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5IHsKLQkJICAgIC8qKgotCQkgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgaWQgdmFsaWRhdGlvbiBpcyBkb25lLgotCQkgICAgICogQnkgZGVmYXVsdCAwIGlzIG5vdCBhIHZhbGlkIGlkIHZhbHVlLCB0aGlzIGNhbiBiZSB1c2VkIHRvIGFsbG93IDAgaWQgdmFsdWVzLgotCQkgICAgICovCi0JCSAgICBJZFZhbGlkYXRpb24gdmFsaWRhdGlvbigpIGRlZmF1bHQgSWRWYWxpZGF0aW9uLlpFUk87IAotCQkKLQkJICAgIC8qKgotCQkgICAgICogKE9wdGlvbmFsKSBVc2VkIHRvIHNwZWNpZnkgdGhlIHByaW1hcnkga2V5IGNvbHVtbnMgZGlyZWN0bHkuCi0JCSAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgQElkIGlmIHRoZSBwcmltYXJ5IGtleSBpbmNsdWRlcyBhIG5vbiBiYXNpYyBmaWVsZCwKLQkJICAgICAqIHN1Y2ggYXMgYSBmb3JlaWduIGtleSwgb3IgYSBpbmhlcml0YW5jZSBkaXNjcmltaW5hdG9yLCBlbWJlZGRlZCwgb3IgdHJhbnNmb3JtYXRpb24gbWFwcGVkIGZpZWxkLgotCQkgICAgICovCi0JCSAgICBDb2x1bW5bXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLQkJfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsaWRhdGlvbiIgdHlwZT0ib3JtOmlkLXZhbGlkYXRpb24iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImlkLXZhbGlkYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCQkvKiogCi0JCSAqIFRoZSBJZFZhbGlkYXRpb24gZW51bSBkZXRlcm1pbmVzIHRoZSB0eXBlIHZhbHVlIHRoYXQgYXJlIHZhbGlkIGZvciBhbiBJZC4KLQkJICogQnkgZGVmYXVsdCBudWxsIGlzIG5vdCBhbGxvd2VkLCBhbmQgMCBpcyBub3QgYWxsb3cgZm9yIHNpbmdsZXRvbiBpZHMgb2YgbG9uZyBvciBpbnQgdHlwZS4KLQkJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgWkVSTyBmb3Igc2luZ2xldG9uIGlkcywgYW5kIE5VTEwgZm9yIGNvbXBvc2l0ZSBpZHMuCi0JCSAqIFRoaXMgY2FuIGJlIHNldCB1c2luZyB0aGUgQFByaW1hcnlLZXkgYW5ub3RhdGlvbiwgb3IgQ2xhc3NEZXNjcmlwdG9yIEFQSS4KLQkJICogCi0JCSAqIEBzZWUgUHJpbWFyeUtleQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLkNsYXNzRGVzY3JpcHRvciNzZXRJZFZhbGlkYXRpb24oSWRWYWxpZGF0aW9uKQotCQkgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLQkJICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMCAKLQkJICovIAotCQlwdWJsaWMgZW51bSBJZFZhbGlkYXRpb24gewotCQkgICAgLyoqCi0JCSAgICAgKiBPbmx5IG51bGwgaXMgbm90IGFsbG93ZWQgYXMgYW4gaWQgdmFsdWUsIDAgaXMgYWxsb3dlZC4KLQkJICAgICAqLwotCQkgICAgTlVMTCwKLQkJCi0JCSAgICAvKioKLQkJICAgICAqIG51bGwgYW5kIDAgYXJlIG5vdCBhbGxvd2VkLCAob25seSBpbnQgYW5kIGxvbmcpLgotCQkgICAgICovCi0JCSAgICBaRVJPLAotCQkKLQkJICAgIC8qKgotCQkgICAgICogTm8gaWQgdmFsaWRhdGlvbiBpcyBkb25lLgotCQkgICAgICovCi0JCSAgICBOT05FCi0JCX0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlVMTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWkVSTyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAgIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2FjaGUgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuaW52YWxpZGF0aW9uLkNhY2hlSW52YWxpZGF0aW9uUG9saWN5IAotICAgICAgICAgKiB3aGljaCBzZXRzIG9iamVjdHMgaW4gRWNsaXBzZUxpbmsncyBpZGVudGl0eSBtYXBzIHRvIGJlIGludmFsaWQgCi0gICAgICAgICAqIGZvbGxvd2luZyBnaXZlbiBydWxlcy4gQnkgZGVmYXVsdCBpbiBFY2xpcHNlTGluaywgb2JqZWN0cyBkbyBub3QgCi0gICAgICAgICAqIGV4cGlyZSBpbiB0aGUgY2FjaGUuIFNldmVyYWwgZGlmZmVyZW50IHBvbGljaWVzIGFyZSBhdmFpbGFibGUgdG8gCi0gICAgICAgICAqIGFsbG93IG9iamVjdHMgdG8gZXhwaXJlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZVR5cGUKLSAgICAgICAgICogCi0gICAgICAgICAqIEEgQ2FjaGUgYW5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvciBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICogSW4gdGhlIGNhc2Ugb2YgaW5oZXJpdGFuY2UsIGEgQ2FjaGUgYW5ub3RhdGlvbiBzaG91bGQgb25seSBiZSBkZWZpbmVkIAotICAgICAgICAgKiBvbiB0aGUgcm9vdCBvZiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2FjaGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgY2FjaGUgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDYWNoZVR5cGUgdHlwZSgpIGRlZmF1bHQgU09GVF9XRUFLOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgc2l6ZSBvZiBjYWNoZSB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBzaXplKCkgZGVmYXVsdCAxMDA7Ci0KLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBDYWNoZWQgaW5zdGFuY2VzIGluIHRoZSBzaGFyZWQgY2FjaGUgb3IgYSBjbGllbnQgCi0JICAgICAgICAgKiBpc29sYXRlZCBjYWNoZS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGJvb2xlYW4gc2hhcmVkKCkgZGVmYXVsdCB0cnVlOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYWZ0ZXIgYSBmaXggcGVyaW9kIG9mIHRpbWUgKG1zKS4gCi0JICAgICAgICAgKiBRdWVyaWVzIGV4ZWN1dGVkIGFnYWluc3QgdGhlIGNhY2hlIGFmdGVyIHRoaXMgd2lsbCBiZSBmb3JjZWQgYmFjayAKLQkgICAgICAgICAqIHRvIHRoZSBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQotCSAgICAgICAgICovIAotCSAgICAgICAgaW50IGV4cGlyeSgpIGRlZmF1bHQgLTE7IC8vIG1pbnVzIG9uZSBpcyBubyBleHBpcnkuCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgRXhwaXJlIGNhY2hlZCBpbnN0YW5jZSBhIHNwZWNpZmljIHRpbWUgb2YgZGF5LiBRdWVyaWVzIAotCSAgICAgICAgICogZXhlY3V0ZWQgYWdhaW5zdCB0aGUgY2FjaGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvcmNlZCBiYWNrIHRvIHRoZSAKLQkgICAgICAgICAqIGRhdGFiYXNlIGZvciBhIHJlZnJlc2hlZCBjb3B5Ci0JICAgICAgICAgKi8gCi0JICAgICAgICBUaW1lT2ZEYXkgZXhwaXJ5VGltZU9mRGF5KCkgZGVmYXVsdCBAVGltZU9mRGF5KHNwZWNpZmllZD1mYWxzZSk7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgRm9yY2UgYWxsIHF1ZXJpZXMgdGhhdCBnbyB0byB0aGUgZGF0YWJhc2UgdG8gYWx3YXlzIAotCSAgICAgICAgICogcmVmcmVzaCB0aGUgY2FjaGUuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBib29sZWFuIGFsd2F5c1JlZnJlc2goKSBkZWZhdWx0IGZhbHNlOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbGwgcXVlcmllcyB0aGF0IGdvIHRvIHRoZSBkYXRhYmFzZSwgcmVmcmVzaCB0aGUKLQkgICAgICAgICAqIGNhY2hlIG9ubHkgaWYgdGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgZGF0YWJhc2UgYnkgYSBxdWVyeSBpcyAKLQkgICAgICAgICAqIG5ld2VyIHRoYW4gdGhlIGRhdGEgaW4gdGhlIGNhY2hlIChhcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcHRpbWlzdGljIAotCSAgICAgICAgICogbG9ja2luZyBmaWVsZCkKLQkgICAgICAgICAqLyAKLQkgICAgICAgIGJvb2xlYW4gcmVmcmVzaE9ubHlJZk5ld2VyKCkgZGVmYXVsdCBmYWxzZTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBTZXR0aW5nIHRvIHRydWUgd2lsbCBmb3JjZSBhbGwgcXVlcmllcyB0byBieXBhc3MgdGhlIAotCSAgICAgICAgICogY2FjaGUgZm9yIGhpdHMgYnV0IHN0aWxsIHJlc29sdmUgYWdhaW5zdCB0aGUgY2FjaGUgZm9yIGlkZW50aXR5LiAKLQkgICAgICAgICAqIFRoaXMgZm9yY2VzIGFsbCBxdWVyaWVzIHRvIGhpdCB0aGUgZGF0YWJhc2UuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBib29sZWFuIGRpc2FibGVIaXRzKCkgZGVmYXVsdCBmYWxzZTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgY2FjaGUgY29vcmRpbmF0aW9uIG1vZGUuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSgpIGRlZmF1bHQgU0VORF9PQkpFQ1RfQ0hBTkdFUzsKLQkgICAgICB9Ci0JCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpjaG9pY2U+Ci0JICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnkiIHR5cGU9InhzZDppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiLz4KLQkgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4cGlyeS10aW1lLW9mLWRheSIgdHlwZT0ib3JtOnRpbWUtb2YtZGF5IiBtaW5PY2N1cnM9IjAiLz4KLQkgIDwveHNkOmNob2ljZT4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNpemUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaGFyZWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06Y2FjaGUtdHlwZSIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWx3YXlzLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZyZXNoLW9ubHktaWYtbmV3ZXIiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNhYmxlLWhpdHMiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb29yZGluYXRpb24tdHlwZSIgdHlwZT0ib3JtOmNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiAKLQotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS10eXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCQotCSAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlVHlwZSBlbnVtIGlzIHVzZWQgd2l0aCB0aGUgQ2FjaGUgYW5ub3RhdGlvbiBmb3IgYSAKLSAgICAgICAgICogcGVyc2lzdGVudCBjbGFzcy4gSXQgZGVmaW5lcyB0aGUgdHlwZSBvZiBJZGVudGl0eU1hcC9DYWNoZSB1c2VkIGZvciAKLSAgICAgICAgICogdGhlIGNsYXNzLiBCeSBkZWZhdWx0IHRoZSBTT0ZUX1dFQUsgY2FjaGUgdHlwZSBpcyB1c2VkLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSAKLSAgICAgICAgICovCi0JICAgICAgcHVibGljIGVudW0gQ2FjaGVUeXBlIHsKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogUHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LiBDYWNoZXMgYWxsIG9iamVjdHMKLQkgICAgICAgICAqIGFuZCBkb2VzIG5vdCByZW1vdmUgdGhlbS4gCi0JICAgICAgICAgKiBXQVJOSU5HOiBUaGlzIG1ldGhvZCBtYXkgYmUgbWVtb3J5IGludGVuc2l2ZSB3aGVuIG1hbnkgb2JqZWN0cyBhcmUgCi0JICAgICAgICAgKiByZWFkLgotCSAgICAgICAgICovCi0JICAgICAgICBGVUxMLAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBGVUxMIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCB0aGUgbWFwIGhvbGRzIHRoZQotCSAgICAgICAgICogb2JqZWN0cyB1c2luZyB3ZWFrIHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKLQkgICAgICAgICAqIGNvbGxlY3Rpb24gYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS4KLQkgICAgICAgICAqLwotCSAgICAgICAgV0VBSywKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogU2ltaWxhciB0byB0aGUgRlVMTCBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgdGhlIG1hcCBob2xkcyB0aGUKLQkgICAgICAgICAqIG9iamVjdHMgdXNpbmcgc29mdCByZWZlcmVuY2VzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZnVsbCBnYXJiYWdlCi0JICAgICAgICAgKiBjb2xsZWN0aW9uIHdoZW4gbWVtb3J5IGlzIGxvdyBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZAotCSAgICAgICAgICogZ3VhcmFudGVlZCBpZGVudGl0eS4KLQkgICAgICAgICAqLwotCSAgICAgICAgU09GVCwKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogU2ltaWxhciB0byB0aGUgV0VBSyBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgaXQgbWFpbnRhaW5zIGEKLQkgICAgICAgICAqIG1vc3QtZnJlcXVlbnRseS11c2VkIHN1Yi1jYWNoZS4gVGhlIHNpemUgb2YgdGhlIHN1Yi1jYWNoZSBpcwotCSAgICAgICAgICogcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBpZGVudGl0eSBtYXAgYXMgc3BlY2lmaWVkIGJ5Ci0JICAgICAgICAgKiBkZXNjcmlwdG9yJ3Mgc2V0SWRlbnRpdHlNYXBTaXplKCkgbWV0aG9kLiBUaGUgc3ViLWNhY2hlCi0JICAgICAgICAgKiB1c2VzIHNvZnQgcmVmZXJlbmNlcyB0byBlbnN1cmUgdGhhdCB0aGVzZSBvYmplY3RzIGFyZQotCSAgICAgICAgICogZ2FyYmFnZS1jb2xsZWN0ZWQgb25seSBpZiB0aGUgc3lzdGVtIGlzIGxvdyBvbiBtZW1vcnkuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFNPRlRfV0VBSywKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogSWRlbnRpY2FsIHRvIHRoZSBzb2Z0IGNhY2hlIHdlYWsgKFNPRlRfV0VBSykgaWRlbnRpdHkgbWFwIGV4Y2VwdCAKLQkgICAgICAgICAqIHRoYXQgaXQgdXNlcyBoYXJkIHJlZmVyZW5jZXMgaW4gdGhlIHN1Yi1jYWNoZS4gVXNlIHRoaXMgaWRlbnRpdHkgCi0JICAgICAgICAgKiBtYXAgaWYgc29mdCByZWZlcmVuY2VzIGRvIG5vdCBiZWhhdmUgcHJvcGVybHkgb24geW91ciBwbGF0Zm9ybS4KLQkgICAgICAgICAqLwotCSAgICAgICAgSEFSRF9XRUFLLAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBBIGNhY2hlIGlkZW50aXR5IG1hcCBtYWludGFpbnMgYSBmaXhlZCBudW1iZXIgb2Ygb2JqZWN0cwotCSAgICAgICAgICogc3BlY2lmaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gT2JqZWN0cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZQotCSAgICAgICAgICogb24gYSBsZWFzdC1yZWNlbnRseS11c2VkIGJhc2lzLiBUaGlzIG1ldGhvZCBhbGxvd3Mgb2JqZWN0Ci0JICAgICAgICAgKiBpZGVudGl0eSBmb3IgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBvYmplY3RzLgotCSAgICAgICAgICogV0FSTklORzogRnVybmlzaGVzIGNhY2hpbmcgYW5kIGlkZW50aXR5LCBidXQgZG9lcyBub3QgZ3VhcmFudGVlIAotCSAgICAgICAgICogaWRlbnRpdHkuCi0JICAgICAgICAgKi8KLQkgICAgICAgIENBQ0hFLAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBXQVJOSU5HOiBEb2VzIG5vdCBwcmVzZXJ2ZSBvYmplY3QgaWRlbnRpdHkgYW5kIGRvZXMgbm90IGNhY2hlIAotCSAgICAgICAgICogb2JqZWN0cy4KLQkgICAgICAgICAqLwotCSAgICAgICAgTk9ORQotCSAgICAgIH0KLQkKLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZVTEwiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0VBSyIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTT0ZUIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPRlRfV0VBSyIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQVJEX1dFQUsiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FDSEUiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotCSAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gIAotCi0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCQotCSAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSAKLSAgICAgICAgICovIAotCSAgICAgIHB1YmxpYyBlbnVtIENhY2hlQ29vcmRpbmF0aW9uVHlwZSB7Ci0JICAgICAgICAvKioKLQkgICAgICAgICAqIFNlbmRzIGEgbGlzdCBvZiBjaGFuZ2VkIG9iamVjdHMgaW5jbHVkaW5nIGRhdGEgYWJvdXQgdGhlIGNoYW5nZXMuCi0JICAgICAgICAgKiBUaGlzIGRhdGEgaXMgbWVyZ2VkIGludG8gdGhlIHJlY2VpdmluZyBjYWNoZS4KLQkgICAgICAgICAqLwotCSAgICAgICAgU0VORF9PQkpFQ1RfQ0hBTkdFUywKLQkKLQkgICAgICAgICAvKioKLQkgICAgICAgICAgKiBTZW5kcyBhIGxpc3Qgb2YgdGhlIGlkZW50aXRpZXMgb2YgdGhlIG9iamVjdHMgdGhhdCBoYXZlIGNoYW5nZWQuIAotCSAgICAgICAgICAqIFRoZSByZWNlaXZpbmcgY2FjaGUgaW52YWxpZGF0ZXMgdGhlIG9iamVjdHMgKHJhdGhlciB0aGFuIGNoYW5naW5nIAotCSAgICAgICAgICAqIGFueSBvZiB0aGUgZGF0YSkKLQkgICAgICAgICAgKi8KLQkgICAgICAgICBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywKLQkKLQkgICAgICAgICAvKioKLQkgICAgICAgICAgKiBTYW1lIGFzIFNFTkRfT0JKRUNUX0NIQU5HRVMgZXhjZXB0IGl0IGFsc28gaW5jbHVkZXMgYW55IG5ld2x5Ci0JICAgICAgICAgICogY3JlYXRlZCBvYmplY3RzIGZyb20gdGhlIHRyYW5zYWN0aW9uLgotCSAgICAgICAgICAqLwotCSAgICAgICAgIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLAotCQotCSAgICAgICAgIC8qKgotCSAgICAgICAgICAqIERvZXMgbm8gY2FjaGUgY29vcmRpbmF0aW9uLgotCSAgICAgICAgICAqLwotCSAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VORF9PQkpFQ1RfQ0hBTkdFUyIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JICA8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gIAotCi0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lLW9mLWRheSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkKLQkgICAgICBAVGFyZ2V0KHt9KQotCSAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLQkgICAgICBwdWJsaWMgQGludGVyZmFjZSBUaW1lT2ZEYXkgewotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIEhvdXIgb2YgdGhlIGRheS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGludCBob3VyKCkgZGVmYXVsdCAwOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIE1pbnV0ZSBvZiB0aGUgZGF5LgotCSAgICAgICAgICovIAotCSAgICAgICAgaW50IG1pbnV0ZSgpIGRlZmF1bHQgMDsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBTZWNvbmQgb2YgdGhlIGRheS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGludCBzZWNvbmQoKSBkZWZhdWx0IDA7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgTWlsbGlzZWNvbmQgb2YgdGhlIGRheS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGludCBtaWxsaXNlY29uZCgpIGRlZmF1bHQgMDsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogSW50ZXJuYWwgdXNlLiBEbyBub3QgbW9kaWZ5LgotCSAgICAgICAgICovIAotCSAgICAgICAgYm9vbGVhbiBzcGVjaWZpZWQoKSBkZWZhdWx0IHRydWU7Ci0JICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImhvdXIiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaW51dGUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaWxsaXNlY29uZCIgdHlwZT0ieHNkOmludGVnZXIiLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2hhbmdlLXRyYWNraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jaGFuZ2V0cmFja2luZy5PYmplY3RDaGFuZ2VQb2xpY3kgCi0gICAgICAgICAqIHdoaWNoIGNvbXB1dGVzIGNoYW5nZXMgc2V0cyBmb3IgRWNsaXBzZUxpbmsncyBVbml0T2ZXb3JrIGNvbW1pdCAKLSAgICAgICAgICogcHJvY2Vzcy4gQW4gT2JqZWN0Q2hhbmdlUG9saWN5IGlzIHN0b3JlZCBvbiBhbiBFbnRpdHkncyBkZXNjcmlwdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiBBIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24gbWF5IGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIG9yIEVtYmVkZGFibGUuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2hhbmdlVHJhY2tpbmcgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgY2hhbmdlIHRyYWNraW5nIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2hhbmdlVHJhY2tpbmdUeXBlIHZhbHVlKCkgZGVmYXVsdCBBVVRPOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nLXR5cGUiIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24uIAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBlbnVtIENoYW5nZVRyYWNraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQW4gQVRUUklCVVRFIGNoYW5nZSB0cmFja2luZyB0eXBlIGFsbG93cyBjaGFuZ2UgdHJhY2tpbmcgYXQgdGhlCi0gICAgICAgICAgICogYXR0cmlidXRlIGxldmVsIG9mIGFuIG9iamVjdC4gT2JqZWN0cyB3aXRoIGNoYW5nZWQgYXR0cmlidXRlcyB3aWxsCi0gICAgICAgICAgICogYmUgcHJvY2Vzc2VkIGluIHRoZSBjb21taXQgcHJvY2VzcyB0byBpbmNsdWRlIGFueSBjaGFuZ2VzIGluIHRoZSAKLSAgICAgICAgICAgKiByZXN1bHRzIG9mIHRoZSBjb21taXQuIFVuY2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVFRSSUJVVEUsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBbiBPQkpFQ1QgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBhbGxvd3MgYW4gb2JqZWN0IHRvIGNhbGN1bGF0ZSBmb3IgCi0gICAgICAgICAgICogaXRzZWxmIHdoZXRoZXIgaXQgaGFzIGNoYW5nZWQuIENoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIHByb2Nlc3NlZCBpbiAKLSAgICAgICAgICAgKiB0aGUgY29tbWl0IHByb2Nlc3MgdG8gaW5jbHVkZSBhbnkgY2hhbmdlcyBpbiB0aGUgcmVzdWx0cyBvZiB0aGUgCi0gICAgICAgICAgICogY29tbWl0LiBVbmNoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgT0JKRUNULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQSBERUZFUlJFRCBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGRlZmVycyBhbGwgY2hhbmdlIGRldGVjdGlvbiB0bwotICAgICAgICAgICAqIHRoZSBVbml0T2ZXb3JrJ3MgY2hhbmdlIGRldGVjdGlvbiBwcm9jZXNzLiBFc3NlbnRpYWxseSwgdGhlIAotICAgICAgICAgICAqIGNhbGN1bGF0ZUNoYW5nZXMoKSBtZXRob2Qgd2lsbCBydW4gZm9yIGFsbCBvYmplY3RzIGluIGEgVW5pdE9mV29yay4gCi0gICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBPYmplY3RDaGFuZ2VQb2xpY3kKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBERUZFUlJFRCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFdpbGwgbm90IHNldCBhbnkgY2hhbmdlIHRyYWNraW5nIHBvbGljeS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVVRPCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUVFJJQlVURSIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPQkpFQ1QiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVGRVJSRUQiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotCSAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9taXplciI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkKLSAgICAgIC8qKiAKLSAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotICAgICAgICogdGhlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvbmZpZy5EZXNjcmlwdG9yQ3VzdG9taXplciAKLSAgICAgICAqIGludGVyZmFjZSBhbmQgaXMgdG8gcnVuIGFnYWluc3QgYW4gZW5ldGl0eSdzIGNsYXNzIGRlc2NyaXB0b3IgYWZ0ZXIgYWxsIAotICAgICAgICogbWV0YWRhdGEgcHJvY2Vzc2luZyBoYXMgYmVlbiBjb21wbGV0ZWQuCi0gICAgICAgKgotICAgICAgICogVGhlIEN1c3RvbWl6ZXIgYW5ub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MgCi0gICAgICAgKiBvciBFbWJlZGRhYmxlIGNsYXNzLiBJbiB0aGUgY2FzZSBvZiBpbmhlcml0YW5jZSwgYSBDdXN0b21pemVyIGlzIG5vdCAKLSAgICAgICAqIGluaGVyaXRlZCBmcm9tIGl0cyBwYXJlbnQgY2xhc3Nlcy4gCi0gICAgICAgKi8gCi0JICAgIEBUYXJnZXQoe1RZUEV9KQotCSAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0JICAgIHB1YmxpYyBAaW50ZXJmYWNlIEN1c3RvbWl6ZXIgewotCSAgICAgIC8qKgotCSAgICAgICAqIChSZXF1aXJlZCkgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgZGVzY3JpcHRvciBjdXN0b21pemVyIGNsYXNzIHRoYXQgCi0JICAgICAgICogc2hvdWxkIGJlIGFwcGxpZWQgZm9yIHRoZSByZWxhdGVkIGVudGl0eSBvciBlbWJlZGRhYmxlIGNsYXNzLgotCSAgICAgICAqLwotCSAgICAgIENsYXNzIHZhbHVlKCk7IAotCSAgICB9Ci0JCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24gYWxsb3dzIHRoZSBkZWZpbml0aW9uIG9mIAotICAgICAgICAgKiBxdWVyaWVzIHRoYXQgY2FsbCBzdG9yZWQgcHJvY2VkdXJlcyBhcyBuYW1lZCBxdWVyaWVzLgotICAgICAgICAgCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvcgotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICovIAotCSAgICAgIEBUYXJnZXQoe1RZUEV9KQotCSAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLQkgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IHsKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKFJlcXVpcmVkKSBVbmlxdWUgbmFtZSB0aGF0IHJlZmVyZW5jZXMgdGhpcyBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgotCSAgICAgICAgICovCi0JICAgICAgICBTdHJpbmcgbmFtZSgpOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFF1ZXJ5IGhpbnRzLgotCSAgICAgICAgICovCi0JICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgUmVmZXJzIHRvIHRoZSBjbGFzcyBvZiB0aGUgcmVzdWx0LgotCSAgICAgICAgICovCi0JICAgICAgICBDbGFzcyByZXN1bHRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgU1FMUmVzdWx0TWFwcGluZy4KLQkgICAgICAgICAqLwotCSAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgotCSAgICAgICAgICovCi0JICAgICAgICBTdHJpbmcgcHJvY2VkdXJlTmFtZSgpOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIHF1ZXJ5IHNob3VsZCByZXR1cm4gYSByZXN1bHQgc2V0LgotCSAgICAgICAgICovCi0JICAgICAgICBib29sZWFuIHJldHVybnNSZXN1bHRTZXQoKSBkZWZhdWx0IHRydWU7IAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgYXJndW1lbnRzIHRvIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgotCSAgICAgICAgICovCi0JICAgICAgICBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCB7fTsKLQkgICAgICB9Ci0JCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOnNlcXVlbmNlPgotCSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgbWluT2NjdXJzPSIwIiAKLQkgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyIiB0eXBlPSJvcm06c3RvcmVkLXByb2NlZHVyZS1wYXJhbWV0ZXIiIAotCSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JICAgIDwveHNkOnNlcXVlbmNlPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByb2NlZHVyZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm5zLXJlc3VsdC1zZXQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0b3JlZC1wcm9jZWR1cmUtcGFyYW1ldGVyIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIGFubm90YXRpb24gaXMgdXNlZCB3aXRoaW4gYSAKLSAgICAgICAgICogTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uLiAKLSAgICAgICAgICovIAotCSAgICAgIEBUYXJnZXQoe30pCi0JICAgICAgQFJldGVudGlvbihSVU5USU1FKQotCSAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciB7Ci0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGRpcmVjdGlvbiBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZSBwYXJhbWV0ZXIuCi0JICAgICAgICAgKi8KLQkgICAgICAgIERpcmVjdGlvbiBkaXJlY3Rpb24oKSBkZWZhdWx0IElOOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyIG5hbWUuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgcXVlcnkgcGFyYW1ldGVyIG5hbWUuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFN0cmluZyBxdWVyeVBhcmFtZXRlcigpOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIEphdmEgY2xhc3MgZGVzaXJlZCBiYWNrIGZyb20gdGhlIHByb2NlZHVyZSwgCi0JICAgICAgICAgKiB0aGlzIGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBwcm9jZWR1cmUuCi0JICAgICAgICAgKi8KLQkgICAgICAgIENsYXNzIHR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIEpEQkMgdHlwZSBjb2RlLCB0aGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSByZXR1cm5lZCAKLQkgICAgICAgICAqIGZyb20gdGhlIHByb2NlZHVyZS4KLQkgICAgICAgICAqLwotCSAgICAgICAgaW50IGpkYmNUeXBlKCkgZGVmYXVsdCAtMTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgSkRCQyB0eXBlIG5hbWUsIHRoaXMgbWF5IGJlIHJlcXVpcmVkIGZvciBBUlJBWSBvciAKLQkgICAgICAgICAqIFNUUlVDVCB0eXBlcy4KLQkgICAgICAgICAqLwotCSAgICAgICAgU3RyaW5nIGpkYmNUeXBlTmFtZSgpIGRlZmF1bHQgIiI7Ci0JICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0ib3JtOmRpcmVjdGlvbi10eXBlIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJxdWVyeS1wYXJhbWV0ZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImpkYmMtdHlwZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImpkYmMtdHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JCi0JPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCQotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXJlY3Rpb24tdHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBhbm5vdGF0aW9uLgotICAgICAgICAgKiBJdCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRpcmVjdGlvbiBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZSAKLSAgICAgICAgICogcGFyYW1ldGVycyBvZiBhIG5hbWVkIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAqLwotCSAgICAgIHB1YmxpYyBlbnVtIERpcmVjdGlvbiB7Ci0JICAgICAgICAvKioKLQkgICAgICAgICAqIElucHV0IHBhcmFtZXRlcgotCSAgICAgICAgICovCi0JICAgICAgICBJTiwKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogT3V0cHV0IHBhcmFtZXRlcgotCSAgICAgICAgICovCi0JICAgICAgICBPVVQsCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIElucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyCi0JICAgICAgICAgKi8KLQkgICAgICAgIElOX09VVCwKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogT3V0cHV0IGN1cnNvcgotCSAgICAgICAgICovCi0JICAgICAgICBPVVRfQ1VSU09SCi0JICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VUIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOX09VVCIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVRfQ1VSU09SIi8+Ci0JICA8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCQotCTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQkKLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkvKiogCi0JCQkJICogVmFyaWFibGUgb25lIHRvIG9uZSBtYXBwaW5ncyBhcmUgdXNlZCB0byByZXByZXNlbnQgYSBwb2ludGVyIAotCQkJCSAqIHJlZmVyZW5jZXMgYmV0d2VlbiBhIGphdmEgb2JqZWN0IGFuZCBhbiBpbXBsZW1lbnRlciBvZiBhbiBpbnRlcmZhY2UuIAotCQkJCSAqIFRoaXMgbWFwcGluZyBpcyB1c3VhbGx5IHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIHBvaW50ZXIgKHN0b3JlZCBpbiBhbiAKLQkJCQkgKiBpbnN0YW5jZSB2YXJpYWJsZSkgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgb2JqZWN0cy4gSW4gdGhlIAotCQkJCSAqIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGVzLCB0aGVzZSBtYXBwaW5ncyBhcmUgbm9ybWFsbHkgaW1wbGVtZW50ZWQgCi0JCQkJICogdXNpbmcgYSBmb3JlaWduIGtleSBhbmQgYSB0eXBlIGNvZGUuCi0JCQkJICogCi0JCQkJICogQSBWYXJpYWJsZU9uZVRvT25lIGNhbiBiZSBzcGVjaWZpZWQgd2l0aGluIGFuIEVudGl0eSwgCi0JCQkJICogTWFwcGVkU3VwZXJjbGFzcyBhbmQgRW1iZWRkYWJsZSBjbGFzcy4gCi0JCQkJICovIAotCQkJCUBUYXJnZXQoe01FVEhPRCwgRklFTER9KSAKLQkJCQlAUmV0ZW50aW9uKFJVTlRJTUUpCi0JCQkJcHVibGljIEBpbnRlcmZhY2UgVmFyaWFibGVPbmVUb09uZSB7Ci0JCQkJICAgIC8qKgotCQkJCSAgICAgKiAoT3B0aW9uYWwpIFRoZSBpbnRlcmZhY2UgY2xhc3MgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZSAKLQkJCQkgICAgICogYXNzb2NpYXRpb24uIElmIG5vdCBzcGVjaWZpZWQgaXQgd2lsbCBiZSBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIAotCQkJCSAgICAgKiBvZiB0aGUgb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuCi0JCQkJICAgICAqLwotCQkJCSAgICBDbGFzcyB0YXJnZXRJbnRlcmZhY2UoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0JCQkJICAgIAotCQkJCSAgICAvKioKLQkJCQkgICAgICogKE9wdGlvbmFsKSBUaGUgb3BlcmF0aW9ucyB0aGF0IG11c3QgYmUgY2FzY2FkZWQgdG8gdGhlIHRhcmdldCBvZiAKLQkJCQkgICAgICogdGhlIGFzc29jaWF0aW9uLgotCQkJCSAgICAgKi8KLQkJCQkgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLQkJCQkgICAgCi0JCQkJICAgIC8qKgotCQkJCSAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotCQkJCSAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotCQkJCSAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAotCQkJCSAgICAgKiB0aGF0IHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSAKLQkJCQkgICAgICogaGludCB0byB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgCi0JCQkJICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgotCQkJCSAgICAgKi8KLQkJCQkgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLQkJCQkgICAgCi0JCQkJICAgIC8qKgotCQkJCSAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIGFzc29jaWF0aW9uIGlzIG9wdGlvbmFsLiBJZiBzZXQgdG8gZmFsc2UgCi0JCQkJICAgICAqIHRoZW4gYSBub24tbnVsbCByZWxhdGlvbnNoaXAgbXVzdCBhbHdheXMgZXhpc3QuCi0JCQkJICAgICAqLwotCQkJCSAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotCQkJCSAgCi0JCQkJICAgIC8qKgotCQkJCSAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiB3aWxsIGhvbGQgdGhlIHR5cGUgCi0JCQkJICAgICAqIGluZGljYXRvcnMuIElmIHRoZSBEaXNjcmltaW5hdG9yQ29sdW1uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuYW1lIAotCQkJCSAgICAgKiBvZiB0aGUgZGlzY3JpbWluYXRvciBjb2x1bW4gZGVmYXVsdHMgdG8gIkRUWVBFIiBhbmQgdGhlIAotCQkJCSAgICAgKiBkaXNjcmltaW5hdG9yIHR5cGUgdG8gU1RSSU5HLgotCQkJCSAgICAgKi8KLQkJCQkgICAgRGlzY3JpbWluYXRvckNvbHVtbiBkaXNjcmltaW5hdG9yQ29sdW1uKCkgZGVmYXVsdCBARGlzY3JpbWluYXRvckNvbHVtbjsKLQkJCQkgICAgCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBsaXN0IG9mIGRpc2NyaW1pbmF0b3IgdHlwZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIAotICAgICAgICAgICAgICAgICAgICAgKiB0aGlzIFZhcmlhYmxlT25lVG9PbmUuIElmIG5vbmUgYXJlIHNwZWNpZmllZCB0aGVuIHRob3NlIGVudGl0aWVzIAotICAgICAgICAgICAgICAgICAgICAgKiB3aXRoaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQgdGhhdCBpbXBsZW1lbnQgdGhlIHRhcmdldCBpbnRlcmZhY2UgCi0gICAgICAgICAgICAgICAgICAgICAqIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgdHlwZXMuIFRoZSBkaXNjcmltaW5hdG9yIHR5cGUgd2lsbCAKLSAgICAgICAgICAgICAgICAgICAgICogZGVmYXVsdCBhcyBmb2xsb3dzOgotICAgICAgICAgICAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgU1RSSU5HOiBFbnRpdHkubmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBDSEFSOiBGaXJzdCBsZXR0ZXIgb2YgdGhlIAotICAgICAgICAgICAgICAgICAgICAgKiAgICBFbnRpdHkgY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIElOVEVHRVI6IFRoZSBuZXh0IGludGVnZXIgYWZ0ZXIgCi0gICAgICAgICAgICAgICAgICAgICAqICAgIHRoZSBoaWdoZXN0IGludGVnZXIgZXhwbGljaXRseSBhZGRlZC4KLSAgICAgICAgICAgICAgICAgICAgICovCi0JCQkJICAgIERpc2NyaW1pbmF0b3JDbGFzc1tdIGRpc2NyaW1pbmF0b3JDbGFzc2VzKCkgZGVmYXVsdCB7fTsKLQkJCQl9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY2xhc3MiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNsYXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtaW50ZXJmYWNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgRGlzY3JpbWluYXRvckNsYXNzIGlzIHVzZWQgd2l0aGluIGEgVmFyaWFibGVPbmVUb09uZSBhbm5vdGF0aW9uLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe30pIAotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JDbGFzcyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgZGlzY3JpbWluYXRvciB0byBiZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlLiAKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvcigpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY2xhc3MgdG8gdGhlIGluc3RhbnRpYXRlZCB3aXRoIHRoZSBnaXZlbiAKLSAgICAgICAgICAgKiBkaXNjcmltaW5hdG9yLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3IiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJleGlzdGVuY2UtdHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgICAgIC8qKgotICAgICAgICAgICAqIFRoZSBFeGlzdGVuY2VDaGVja2luZyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiAKLSAgICAgICAgICAgKiBjaGVja2luZyBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgZW50aXRpZXMuCi0gICAgICAgICAgICogCi0gICAgICAgICAgICogQW4gZXhpc3RlbmNlLWNoZWNraW5nIHNwZWNpZmljYXRpb24gaXMgc3VwcG9ydGVkIG9uIGFuIEVudGl0eSBvciAKLSAgICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIGFubm90YXRpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRXhpc3RlbmNlQ2hlY2tpbmcgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNldCB0aGUgZXhpc3RlbmNlIGNoZWNrIGZvciBkZXRlcm1pbmluZwotICAgICAgICAgICAgICogaWYgYW4gaW5zZXJ0IG9yIHVwZGF0ZSBzaG91bGQgb2NjdXIgZm9yIGFuIG9iamVjdC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgIEV4aXN0ZW5jZVR5cGUgdmFsdWUoKSBkZWZhdWx0IENIRUNLX0NBQ0hFOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBc3N1bWUgdGhhdCBpZiB0aGUgb2JqZWN0cyBwcmltYXJ5IGtleSBkb2VzIG5vdCBpbmNsdWRlIG51bGwgYW5kIAotICAgICAgICAgICAqIGl0IGlzIGluIHRoZSBjYWNoZSwgdGhlbiBpdCBtdXN0IGV4aXN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIENIRUNLX0NBQ0hFLAotCQkJCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogUGVyZm9ybSBkb2VzIGV4aXN0IGNoZWNrIG9uIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDSEVDS19EQVRBQkFTRSwKLQkJCQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCB0aGVuIAotICAgICAgICAgICAqIGl0IG11c3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGd1YXJhbnRlZXMgb3IgCi0gICAgICAgICAgICogZG9lcyBub3QgY2FyZSBhYm91dCB0aGUgZXhpc3RlbmNlIGNoZWNrLgotICAgICAgICAgICAqLwotICAgICAgICAgIEFTU1VNRV9FWElTVEVOQ0UsCi0JCQkKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBc3N1bWUgdGhhdCB0aGUgb2JqZWN0IGRvZXMgbm90IGV4aXN0LiBUaGlzIG1heSBiZSB1c2VkIGlmIHRoZSAKLSAgICAgICAgICAgKiBhcHBsaWNhdGlvbiBndWFyYW50ZWVzIG9yIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4gIAotICAgICAgICAgICAqIFRoaXMgd2lsbCBhbHdheXMgZm9yY2UgYW4gaW5zZXJ0IHRvIGJlIGNhbGxlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBU1NVTUVfTk9OX0VYSVNURU5DRQotCQkKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4JIAotCSAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19DQUNIRSIgLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hFQ0tfREFUQUJBU0UiIC8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTU1VNRV9FWElTVEVOQ0UiIC8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTU1VNRV9OT05fRVhJU1RFTkNFIi8+Ci0JICA8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgkKLQkKLTwveHNkOnNjaGVtYT4KLQotCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMV8yLnhzZCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2MyYjI2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzUxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgCi0gdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uIAotIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgCi0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotCi0gQ29udHJpYnV0b3JzOgotICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gZnJvbSBPcmFjbGUgVG9wTGluawotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0tLT4KLQotPCEtLSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBvYmplY3QtcmVsYXRpb25hbCBtYXBwaW5nIGZpbGUgc2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6b3JtPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLSAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiAKLSAgdmVyc2lvbj0iMS4yIj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWVjbGlwc2VsaW5rX29ybV8xXzIueHNkIDEuMCAgRmVicnVhcnkgMSAyMDA4Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOmRvY3VtZW50YXRpb24+PCFbQ0RBVEFbCi0KLSAgICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgbmF0aXZlIEVjbGlwc2VsaW5rIFhNTCBtYXBwaW5nIGZpbGUKLSAgICAgICBUaGUgZmlsZSBtYXkgYmUgbmFtZWQgIk1FVEEtSU5GL2VjbGlwc2VsaW5rLW9ybS54bWwiIGluIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgIGFyY2hpdmUgb3IgaXQgbWF5IGJlIG5hbWVkIHNvbWUgb3RoZXIgbmFtZSB3aGljaCB3b3VsZCBiZQotICAgICAgIHVzZWQgdG8gbG9jYXRlIHRoZSBmaWxlIGFzIHJlc291cmNlIG9uIHRoZSBjbGFzc3BhdGguCi0gICAgICAgT2JqZWN0L3JlbGF0aW9uYWwgbWFwcGluZyBmaWxlcyBtdXN0IGluZGljYXRlIHRoZSBvYmplY3QvcmVsYXRpb25hbAotICAgICAgIG1hcHBpbmcgZmlsZSBzY2hlbWEgYnkgdXNpbmcgdGhlIHBlcnNpc3RlbmNlIG5hbWVzcGFjZToKLQotICAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0KLQotICAgICAgIGFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLSAgICAgICA8ZW50aXR5LW1hcHBpbmdzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIgotICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIAotICAgICAgIGVjbGlwc2VsaW5rX29ybV8xXzIueHNkCi0gICAgICAgdmVyc2lvbj0iMS4yIj4KLSAgICAgICAuLi4KLSAgICAgICA8L2VudGl0eS1tYXBwaW5ncz4KLQotICAgICBdXT48L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtcHR5VHlwZSIvPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idmVyc2lvblR5cGUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWzAtOV0rKFwuWzAtOV0rKSoiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhY2Nlc3MtbWV0aG9kcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2FjaGUgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuaW52YWxpZGF0aW9uLkNhY2hlSW52YWxpZGF0aW9uUG9saWN5IAotICAgICAgICAgKiB3aGljaCBzZXRzIG9iamVjdHMgaW4gRWNsaXBzZUxpbmsncyBpZGVudGl0eSBtYXBzIHRvIGJlIGludmFsaWQgCi0gICAgICAgICAqIGZvbGxvd2luZyBnaXZlbiBydWxlcy4gQnkgZGVmYXVsdCBpbiBFY2xpcHNlTGluaywgb2JqZWN0cyBkbyBub3QgCi0gICAgICAgICAqIGV4cGlyZSBpbiB0aGUgY2FjaGUuIFNldmVyYWwgZGlmZmVyZW50IHBvbGljaWVzIGFyZSBhdmFpbGFibGUgdG8gCi0gICAgICAgICAqIGFsbG93IG9iamVjdHMgdG8gZXhwaXJlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZVR5cGUKLSAgICAgICAgICogCi0gICAgICAgICAqIEEgQ2FjaGUgYW5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvciBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICogSW4gdGhlIGNhc2Ugb2YgaW5oZXJpdGFuY2UsIGEgQ2FjaGUgYW5ub3RhdGlvbiBzaG91bGQgb25seSBiZSBkZWZpbmVkIAotICAgICAgICAgKiBvbiB0aGUgcm9vdCBvZiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2FjaGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgY2FjaGUgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDYWNoZVR5cGUgdHlwZSgpIGRlZmF1bHQgU09GVF9XRUFLOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgc2l6ZSBvZiBjYWNoZSB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBzaXplKCkgZGVmYXVsdCAxMDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIENhY2hlZCBpbnN0YW5jZXMgaW4gdGhlIHNoYXJlZCBjYWNoZSBvciBhIGNsaWVudCAKLSAgICAgICAgICAgKiBpc29sYXRlZCBjYWNoZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBzaGFyZWQoKSBkZWZhdWx0IHRydWU7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYWZ0ZXIgYSBmaXggcGVyaW9kIG9mIHRpbWUgKG1zKS4gCi0gICAgICAgICAgICogUXVlcmllcyBleGVjdXRlZCBhZ2FpbnN0IHRoZSBjYWNoZSBhZnRlciB0aGlzIHdpbGwgYmUgZm9yY2VkIGJhY2sgCi0gICAgICAgICAgICogdG8gdGhlIGRhdGFiYXNlIGZvciBhIHJlZnJlc2hlZCBjb3B5Ci0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBleHBpcnkoKSBkZWZhdWx0IC0xOyAvLyBtaW51cyBvbmUgaXMgbm8gZXhwaXJ5LgotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBFeHBpcmUgY2FjaGVkIGluc3RhbmNlIGEgc3BlY2lmaWMgdGltZSBvZiBkYXkuIFF1ZXJpZXMgCi0gICAgICAgICAgICogZXhlY3V0ZWQgYWdhaW5zdCB0aGUgY2FjaGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvcmNlZCBiYWNrIHRvIHRoZSAKLSAgICAgICAgICAgKiBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBUaW1lT2ZEYXkgZXhwaXJ5VGltZU9mRGF5KCkgZGVmYXVsdCBAVGltZU9mRGF5KHNwZWNpZmllZD1mYWxzZSk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvcmNlIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlIHRvIGFsd2F5cyAKLSAgICAgICAgICAgKiByZWZyZXNoIHRoZSBjYWNoZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBhbHdheXNSZWZyZXNoKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRm9yIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlLCByZWZyZXNoIHRoZQotICAgICAgICAgICAqIGNhY2hlIG9ubHkgaWYgdGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgZGF0YWJhc2UgYnkgYSBxdWVyeSBpcyAKLSAgICAgICAgICAgKiBuZXdlciB0aGFuIHRoZSBkYXRhIGluIHRoZSBjYWNoZSAoYXMgZGV0ZXJtaW5lZCBieSB0aGUgb3B0aW1pc3RpYyAKLSAgICAgICAgICAgKiBsb2NraW5nIGZpZWxkKQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcigpIGRlZmF1bHQgZmFsc2U7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNldHRpbmcgdG8gdHJ1ZSB3aWxsIGZvcmNlIGFsbCBxdWVyaWVzIHRvIGJ5cGFzcyB0aGUgCi0gICAgICAgICAgICogY2FjaGUgZm9yIGhpdHMgYnV0IHN0aWxsIHJlc29sdmUgYWdhaW5zdCB0aGUgY2FjaGUgZm9yIGlkZW50aXR5LiAKLSAgICAgICAgICAgKiBUaGlzIGZvcmNlcyBhbGwgcXVlcmllcyB0byBoaXQgdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIGRpc2FibGVIaXRzKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhY2hlIGNvb3JkaW5hdGlvbiBtb2RlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSgpIGRlZmF1bHQgU0VORF9PQkpFQ1RfQ0hBTkdFUzsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5IiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5LXRpbWUtb2YtZGF5IiB0eXBlPSJvcm06dGltZS1vZi1kYXkiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOmNob2ljZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNoYXJlZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06Y2FjaGUtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsd2F5cy1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZnJlc2gtb25seS1pZi1uZXdlciIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNhYmxlLWhpdHMiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29vcmRpbmF0aW9uLXR5cGUiIHR5cGU9Im9ybTpjYWNoZS1jb29yZGluYXRpb24tdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+IAotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2FjaGVUeXBlIGVudW0gaXMgdXNlZCB3aXRoIHRoZSBDYWNoZSBhbm5vdGF0aW9uIGZvciBhIAotICAgICAgICAgKiBwZXJzaXN0ZW50IGNsYXNzLiBJdCBkZWZpbmVzIHRoZSB0eXBlIG9mIElkZW50aXR5TWFwL0NhY2hlIHVzZWQgZm9yIAotICAgICAgICAgKiB0aGUgY2xhc3MuIEJ5IGRlZmF1bHQgdGhlIFNPRlRfV0VBSyBjYWNoZSB0eXBlIGlzIHVzZWQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlIAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGVudW0gQ2FjaGVUeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBQcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuIENhY2hlcyBhbGwgb2JqZWN0cwotICAgICAgICAgICAqIGFuZCBkb2VzIG5vdCByZW1vdmUgdGhlbS4gCi0gICAgICAgICAgICogV0FSTklORzogVGhpcyBtZXRob2QgbWF5IGJlIG1lbW9yeSBpbnRlbnNpdmUgd2hlbiBtYW55IG9iamVjdHMgYXJlIAotICAgICAgICAgICAqIHJlYWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRlVMTCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIEZVTEwgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlCi0gICAgICAgICAgICogb2JqZWN0cyB1c2luZyB3ZWFrIHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGFuZCBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgV0VBSywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIEZVTEwgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlCi0gICAgICAgICAgICogb2JqZWN0cyB1c2luZyBzb2Z0IHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIHdoZW4gbWVtb3J5IGlzIGxvdyBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZAotICAgICAgICAgICAqIGd1YXJhbnRlZWQgaWRlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU09GVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIFdFQUsgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IGl0IG1haW50YWlucyBhCi0gICAgICAgICAgICogbW9zdC1mcmVxdWVudGx5LXVzZWQgc3ViLWNhY2hlLiBUaGUgc2l6ZSBvZiB0aGUgc3ViLWNhY2hlIGlzCi0gICAgICAgICAgICogcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBpZGVudGl0eSBtYXAgYXMgc3BlY2lmaWVkIGJ5Ci0gICAgICAgICAgICogZGVzY3JpcHRvcidzIHNldElkZW50aXR5TWFwU2l6ZSgpIG1ldGhvZC4gVGhlIHN1Yi1jYWNoZQotICAgICAgICAgICAqIHVzZXMgc29mdCByZWZlcmVuY2VzIHRvIGVuc3VyZSB0aGF0IHRoZXNlIG9iamVjdHMgYXJlCi0gICAgICAgICAgICogZ2FyYmFnZS1jb2xsZWN0ZWQgb25seSBpZiB0aGUgc3lzdGVtIGlzIGxvdyBvbiBtZW1vcnkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU09GVF9XRUFLLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogSWRlbnRpY2FsIHRvIHRoZSBzb2Z0IGNhY2hlIHdlYWsgKFNPRlRfV0VBSykgaWRlbnRpdHkgbWFwIGV4Y2VwdCAKLSAgICAgICAgICAgKiB0aGF0IGl0IHVzZXMgaGFyZCByZWZlcmVuY2VzIGluIHRoZSBzdWItY2FjaGUuIFVzZSB0aGlzIGlkZW50aXR5IAotICAgICAgICAgICAqIG1hcCBpZiBzb2Z0IHJlZmVyZW5jZXMgZG8gbm90IGJlaGF2ZSBwcm9wZXJseSBvbiB5b3VyIHBsYXRmb3JtLgotICAgICAgICAgICAqLwotICAgICAgICAgIEhBUkRfV0VBSywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEEgY2FjaGUgaWRlbnRpdHkgbWFwIG1haW50YWlucyBhIGZpeGVkIG51bWJlciBvZiBvYmplY3RzCi0gICAgICAgICAgICogc3BlY2lmaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gT2JqZWN0cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZQotICAgICAgICAgICAqIG9uIGEgbGVhc3QtcmVjZW50bHktdXNlZCBiYXNpcy4gVGhpcyBtZXRob2QgYWxsb3dzIG9iamVjdAotICAgICAgICAgICAqIGlkZW50aXR5IGZvciB0aGUgbW9zdCBjb21tb25seSB1c2VkIG9iamVjdHMuCi0gICAgICAgICAgICogV0FSTklORzogRnVybmlzaGVzIGNhY2hpbmcgYW5kIGlkZW50aXR5LCBidXQgZG9lcyBub3QgZ3VhcmFudGVlIAotICAgICAgICAgICAqIGlkZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENBQ0hFLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogV0FSTklORzogRG9lcyBub3QgcHJlc2VydmUgb2JqZWN0IGlkZW50aXR5IGFuZCBkb2VzIG5vdCBjYWNoZSAKLSAgICAgICAgICAgKiBvYmplY3RzLgotICAgICAgICAgICAqLwotICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlVMTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0VBSyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09GVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09GVF9XRUFLIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQVJEX1dFQUsiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQ0hFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiAgCi0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENhY2hlIGFubm90YXRpb24uCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlIAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBlbnVtIENhY2hlQ29vcmRpbmF0aW9uVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2VuZHMgYSBsaXN0IG9mIGNoYW5nZWQgb2JqZWN0cyBpbmNsdWRpbmcgZGF0YSBhYm91dCB0aGUgY2hhbmdlcy4KLSAgICAgICAgICAgKiBUaGlzIGRhdGEgaXMgbWVyZ2VkIGludG8gdGhlIHJlY2VpdmluZyBjYWNoZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRU5EX09CSkVDVF9DSEFOR0VTLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2VuZHMgYSBsaXN0IG9mIHRoZSBpZGVudGl0aWVzIG9mIHRoZSBvYmplY3RzIHRoYXQgaGF2ZSBjaGFuZ2VkLiAKLSAgICAgICAgICAgKiBUaGUgcmVjZWl2aW5nIGNhY2hlIGludmFsaWRhdGVzIHRoZSBvYmplY3RzIChyYXRoZXIgdGhhbiBjaGFuZ2luZyAKLSAgICAgICAgICAgKiBhbnkgb2YgdGhlIGRhdGEpCi0gICAgICAgICAgICovCi0gICAgICAgICAgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTYW1lIGFzIFNFTkRfT0JKRUNUX0NIQU5HRVMgZXhjZXB0IGl0IGFsc28gaW5jbHVkZXMgYW55IG5ld2x5Ci0gICAgICAgICAgICogY3JlYXRlZCBvYmplY3RzIGZyb20gdGhlIHRyYW5zYWN0aW9uLgotICAgICAgICAgICAqLwotICAgICAgICAgIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogRG9lcyBubyBjYWNoZSBjb29yZGluYXRpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgTk9ORQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRU5EX09CSkVDVF9DSEFOR0VTIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNoYW5nZXRyYWNraW5nLk9iamVjdENoYW5nZVBvbGljeSAKLSAgICAgICAgICogd2hpY2ggY29tcHV0ZXMgY2hhbmdlcyBzZXRzIGZvciBFY2xpcHNlTGluaydzIFVuaXRPZldvcmsgY29tbWl0IAotICAgICAgICAgKiBwcm9jZXNzLiBBbiBPYmplY3RDaGFuZ2VQb2xpY3kgaXMgc3RvcmVkIG9uIGFuIEVudGl0eSdzIGRlc2NyaXB0b3IuCi0gICAgICAgICAqCi0gICAgICAgICAqIEEgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbiBtYXkgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3Mgb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDaGFuZ2VUcmFja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBjaGFuZ2UgdHJhY2tpbmcgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDaGFuZ2VUcmFja2luZ1R5cGUgdmFsdWUoKSBkZWZhdWx0IEFVVE87Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmctdHlwZSIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24uIAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBlbnVtIENoYW5nZVRyYWNraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQW4gQVRUUklCVVRFIGNoYW5nZSB0cmFja2luZyB0eXBlIGFsbG93cyBjaGFuZ2UgdHJhY2tpbmcgYXQgdGhlCi0gICAgICAgICAgICogYXR0cmlidXRlIGxldmVsIG9mIGFuIG9iamVjdC4gT2JqZWN0cyB3aXRoIGNoYW5nZWQgYXR0cmlidXRlcyB3aWxsCi0gICAgICAgICAgICogYmUgcHJvY2Vzc2VkIGluIHRoZSBjb21taXQgcHJvY2VzcyB0byBpbmNsdWRlIGFueSBjaGFuZ2VzIGluIHRoZSAKLSAgICAgICAgICAgKiByZXN1bHRzIG9mIHRoZSBjb21taXQuIFVuY2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVFRSSUJVVEUsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBbiBPQkpFQ1QgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBhbGxvd3MgYW4gb2JqZWN0IHRvIGNhbGN1bGF0ZSBmb3IgCi0gICAgICAgICAgICogaXRzZWxmIHdoZXRoZXIgaXQgaGFzIGNoYW5nZWQuIENoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIHByb2Nlc3NlZCBpbiAKLSAgICAgICAgICAgKiB0aGUgY29tbWl0IHByb2Nlc3MgdG8gaW5jbHVkZSBhbnkgY2hhbmdlcyBpbiB0aGUgcmVzdWx0cyBvZiB0aGUgCi0gICAgICAgICAgICogY29tbWl0LiBVbmNoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgT0JKRUNULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQSBERUZFUlJFRCBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGRlZmVycyBhbGwgY2hhbmdlIGRldGVjdGlvbiB0bwotICAgICAgICAgICAqIHRoZSBVbml0T2ZXb3JrJ3MgY2hhbmdlIGRldGVjdGlvbiBwcm9jZXNzLiBFc3NlbnRpYWxseSwgdGhlIAotICAgICAgICAgICAqIGNhbGN1bGF0ZUNoYW5nZXMoKSBtZXRob2Qgd2lsbCBydW4gZm9yIGFsbCBvYmplY3RzIGluIGEgVW5pdE9mV29yay4gCi0gICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBPYmplY3RDaGFuZ2VQb2xpY3kKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBERUZFUlJFRCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFdpbGwgbm90IHNldCBhbnkgY2hhbmdlIHRyYWNraW5nIHBvbGljeS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVVRPCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUVFJJQlVURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT0JKRUNUIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERUZFUlJFRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1c3RvbWl6ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotICAgICAgICAgKiB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29uZmlnLkRlc2NyaXB0b3JDdXN0b21pemVyIAotICAgICAgICAgKiBpbnRlcmZhY2UgYW5kIGlzIHRvIHJ1biBhZ2FpbnN0IGFuIGVuZXRpdHkncyBjbGFzcyBkZXNjcmlwdG9yIGFmdGVyIGFsbCAKLSAgICAgICAgICogbWV0YWRhdGEgcHJvY2Vzc2luZyBoYXMgYmVlbiBjb21wbGV0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzIAotICAgICAgICAgKiBvciBFbWJlZGRhYmxlIGNsYXNzLiBJbiB0aGUgY2FzZSBvZiBpbmhlcml0YW5jZSwgYSBDdXN0b21pemVyIGlzIG5vdCAKLSAgICAgICAgICogaW5oZXJpdGVkIGZyb20gaXRzIHBhcmVudCBjbGFzc2VzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDdXN0b21pemVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGRlc2NyaXB0b3IgY3VzdG9taXplciBjbGFzcyB0aGF0IAotICAgICAgICAgICAqIHNob3VsZCBiZSBhcHBsaWVkIGZvciB0aGUgcmVsYXRlZCBlbnRpdHkgb3IgZW1iZWRkYWJsZSBjbGFzcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXJlY3Rpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYW5ub3RhdGlvbi4KLSAgICAgICAgICogSXQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgCi0gICAgICAgICAqIHBhcmFtZXRlcnMgb2YgYSBuYW1lZCBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGVudW0gRGlyZWN0aW9uIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnB1dCBwYXJhbWV0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJTiwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIE91dHB1dCBwYXJhbWV0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPVVQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIElOX09VVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIE91dHB1dCBjdXJzb3IKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPVVRfQ1VSU09SCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOX09VVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VUX0NVUlNPUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LW1hcHBpbmdzIj4KLSAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgZW50aXR5LW1hcHBpbmdzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBtYXBwaW5nCi0gICAgICAgICAgZmlsZS4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmb3VyIHR5cGVzIG9mIGVsZW1lbnRzOgotCi0gICAgICAgICAgMS4gVGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBjb250YWlucyBtZXRhZGF0YQotICAgICAgICAgIGZvciB0aGUgZW50aXJlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCBpZiB0aGlzIGVsZW1lbnQKLSAgICAgICAgICBvY2N1cnMgaW4gbXVsdGlwbGUgbWFwcGluZyBmaWxlcyB3aXRoaW4gdGhlIHNhbWUgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICAgIDIuIFRoZSBwYWNrYWdlLCBzY2hlbWEsIGNhdGFsb2cgYW5kIGFjY2VzcyBlbGVtZW50cyBhcHBseSB0byBhbGwgb2YKLSAgICAgICAgICB0aGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBkZWZpbmVkIGluCi0gICAgICAgICAgdGhlIHNhbWUgZmlsZSBpbiB3aGljaCB0aGV5IG9jY3VyLgotCi0gICAgICAgICAgMy4gVGhlIHNlcXVlbmNlLWdlbmVyYXRvciwgdGFibGUtZ2VuZXJhdG9yLCBuYW1lZC1xdWVyeSwKLSAgICAgICAgICBuYW1lZC1uYXRpdmUtcXVlcnkgYW5kIHNxbC1yZXN1bHQtc2V0LW1hcHBpbmcgZWxlbWVudHMgYXJlIGdsb2JhbAotICAgICAgICAgIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lCi0gICAgICAgICAgc2VxdWVuY2UtZ2VuZXJhdG9yIG9yIHRhYmxlLWdlbmVyYXRvciBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lCi0gICAgICAgICAgb3IgZGlmZmVyZW50IG1hcHBpbmcgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyBhbHNvCi0gICAgICAgICAgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBuYW1lZC1xdWVyeSwgbmFtZWQtbmF0aXZlLXF1ZXJ5LCBvcgotICAgICAgICAgIHJlc3VsdC1zZXQtbWFwcGluZyBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lIG9yIGRpZmZlcmVudCBtYXBwaW5nCi0gICAgICAgICAgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgICAgNC4gVGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZWFjaCBkZWZpbmUKLSAgICAgICAgICB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBtYW5hZ2VkIHBlcnNpc3RlbnQgY2xhc3MuIFRoZSBtYXBwaW5nCi0gICAgICAgICAgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZXNlIGVsZW1lbnRzIG1heSBiZSBjb21wbGV0ZSBvciBpdCBtYXkKLSAgICAgICAgICBiZSBwYXJ0aWFsLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhY2thZ2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgICAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyIgdHlwZT0ib3JtOm1hcHBlZC1zdXBlcmNsYXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiIHR5cGU9Im9ybTplbnRpdHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGFibGUiIHR5cGU9Im9ybTplbWJlZGRhYmxlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uVHlwZSIgZml4ZWQ9IjEuMiIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICA8L3hzZDplbGVtZW50PgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBFeGlzdGVuY2VDaGVja2luZyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiAKLSAgICAgICAgICogY2hlY2tpbmcgRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIGVudGl0aWVzLgotICAgICAgICAgKiAKLSAgICAgICAgICogQW4gZXhpc3RlbmNlLWNoZWNraW5nIHNwZWNpZmljYXRpb24gaXMgc3VwcG9ydGVkIG9uIGFuIEVudGl0eSBvciAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBhbm5vdGF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRXhpc3RlbmNlQ2hlY2tpbmcgewotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTZXQgdGhlIGV4aXN0ZW5jZSBjaGVjayBmb3IgZGV0ZXJtaW5pbmcKLSAgICAgICAgICAgKiBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIEV4aXN0ZW5jZVR5cGUgdmFsdWUoKSBkZWZhdWx0IENIRUNLX0NBQ0hFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCBhbmQgCi0gICAgICAgICAqIGl0IGlzIGluIHRoZSBjYWNoZSwgdGhlbiBpdCBtdXN0IGV4aXN0LgotICAgICAgICAgKi8KLSAgICAgICAgQ0hFQ0tfQ0FDSEUsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBlcmZvcm0gZG9lcyBleGlzdCBjaGVjayBvbiB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAqLwotICAgICAgICBDSEVDS19EQVRBQkFTRSwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQXNzdW1lIHRoYXQgaWYgdGhlIG9iamVjdHMgcHJpbWFyeSBrZXkgZG9lcyBub3QgaW5jbHVkZSBudWxsIHRoZW4gCi0gICAgICAgICAqIGl0IG11c3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGd1YXJhbnRlZXMgb3IgCi0gICAgICAgICAqIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4KLSAgICAgICAgICovCi0gICAgICAgIEFTU1VNRV9FWElTVEVOQ0UsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IHRoZSBvYmplY3QgZG9lcyBub3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIAotICAgICAgICAgKiBhcHBsaWNhdGlvbiBndWFyYW50ZWVzIG9yIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4gIAotICAgICAgICAgKiBUaGlzIHdpbGwgYWx3YXlzIGZvcmNlIGFuIGluc2VydCB0byBiZSBjYWxsZWQuCi0gICAgICAgICAqLwotICAgICAgICBBU1NVTUVfTk9OX0VYSVNURU5DRQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+ICAgIAotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRUNLX0NBQ0hFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19EQVRBQkFTRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX0VYSVNURU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX05PTl9FWElTVEVOQ0UiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4gCi0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIE1ldGFkYXRhIHRoYXQgYXBwbGllcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhbmQgbm90IGp1c3QgdG8gCi0gICAgICAgIHRoZSBtYXBwaW5nIGZpbGUgaW4gd2hpY2ggaXQgaXMgY29udGFpbmVkLiAKLQotICAgICAgICBJZiB0aGUgeG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUgZWxlbWVudCBpcyBzcGVjaWZpZWQsCi0gICAgICAgIHRoZSBjb21wbGV0ZSBzZXQgb2YgbWFwcGluZyBtZXRhZGF0YSBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgaXMgY29udGFpbmVkIGluIHRoZSBYTUwgbWFwcGluZyBmaWxlcyBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlc2UgZGVmYXVsdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXMgYSB3aG9sZQotICAgICAgICB1bmxlc3MgdGhleSBhcmUgb3ZlcnJpZGRlbiBieSBsb2NhbCBhbm5vdGF0aW9uIG9yIFhNTAotICAgICAgICBlbGVtZW50IHNldHRpbmdzLgotCi0gICAgICAgIHNjaGVtYSAtIFVzZWQgYXMgdGhlIHNjaGVtYSBmb3IgYWxsIHRhYmxlcywgc2Vjb25kYXJ5IHRhYmxlcywKLSAgICAgICAgICAgIGNvbGxlY3Rpb24gdGFibGVzLCBzZXF1ZW5jZSBnZW5lcmF0b3JzLCBhbmQgdGFibGUgZ2VuZXJhdG9ycwotICAgICAgICAgICAgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBjYXRhbG9nIC0gVXNlZCBhcyB0aGUgY2F0YWxvZyBmb3IgYWxsIHRhYmxlcywgc2Vjb25kYXJ5IHRhYmxlcywKLSAgICAgICAgICAgIGNvbGxlY3Rpb24gdGFibGVzLCBzZXF1ZW5jZSBnZW5lcmF0b3JzLCBhbmQgdGFibGUgZ2VuZXJhdG9ycwotICAgICAgICAgICAgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBhY2Nlc3MgLSBVc2VkIGFzIHRoZSBhY2Nlc3MgdHlwZSBmb3IgYWxsIG1hbmFnZWQgY2xhc3NlcyBpbgotICAgICAgICAgICAgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2FzY2FkZS1wZXJzaXN0IC0gQWRkcyBjYXNjYWRlLXBlcnNpc3QgdG8gdGhlIHNldCBvZiBjYXNjYWRlIG9wdGlvbnMKLSAgICAgICAgICAgIGluIGFsbCBlbnRpdHkgcmVsYXRpb25zaGlwcyBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBlbnRpdHktbGlzdGVuZXJzIC0gTGlzdCBvZiBkZWZhdWx0IGVudGl0eSBsaXN0ZW5lcnMgdG8gYmUgaW52b2tlZAotICAgICAgICAgICAgb24gZWFjaCBlbnRpdHkgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlbGltaXRlZC1pZGVudGlmaWVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGFuIGVudGl0eS4gSXMgYWxsb3dlZCB0byBiZQotICAgICAgICBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYW5ub3RhdGlvbnMuCi0gICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8KLSAgICAgICAgaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBvbiB0aGUgZW50aXR5IGNsYXNzIChhbmQgaXRzIGZpZWxkcwotICAgICAgICBvciBwcm9wZXJ0aWVzKSBhcmUgdG8gYmUgcHJvY2Vzc2VkLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4KLSAgICAgICAgdGhlIGRlZmF1bHRpbmcgcnVsZXMgZm9yIHRoZSBlbnRpdHkgYW5kIGl0cyBzdWItZWxlbWVudHMgd2lsbAotICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZSIgdHlwZT0ib3JtOnRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWNvbmRhcnktdGFibGUiIHR5cGU9Im9ybTpzZWNvbmRhcnktdGFibGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXkiIHR5cGU9Im9ybTpwcmltYXJ5LWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5oZXJpdGFuY2UiIHR5cGU9Im9ybTppbmhlcml0YW5jZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYWNoZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImFjY2Vzcy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGRldGVybWluZXMgaG93IHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBhY2Nlc3NlcyB0aGUKLSAgICAgICAgc3RhdGUgb2YgYW4gZW50aXR5IG9yIGVtYmVkZGVkIG9iamVjdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBST1BFUlRZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSUVMRCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0e307Ci0gICAgICAgICAgSm9pblRhYmxlIGpvaW5UYWJsZSgpIGRlZmF1bHQgQEpvaW5UYWJsZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEF0dHJpYnV0ZU92ZXJyaWRlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIENvbHVtbiBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGVzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBlbnRpdHkgZmllbGQgb3IgcHJvcGVydHkgbWFwcGluZ3MuCi0gICAgICAgIEl0IG1heSBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgdG8gaW5jbHVkZSBvbmx5IGEgc3Vic2V0IG9mIHRoZQotICAgICAgICBmaWVsZHMgb3IgcHJvcGVydGllcy4gSWYgbWV0YWRhdGEtY29tcGxldGUgZm9yIHRoZSBlbnRpdHkgaXMgdHJ1ZQotICAgICAgICB0aGVuIHRoZSByZW1haW5kZXIgb2YgdGhlIGF0dHJpYnV0ZXMgd2lsbCBiZSBkZWZhdWx0ZWQgYWNjb3JkaW5nCi0gICAgICAgIHRvIHRoZSBkZWZhdWx0IHJ1bGVzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkIiB0eXBlPSJvcm06aWQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkLWlkIiB0eXBlPSJvcm06ZW1iZWRkZWQtaWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljIiB0eXBlPSJvcm06YmFzaWMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYy1jb2xsZWN0aW9uIiB0eXBlPSJvcm06YmFzaWMtY29sbGVjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljLW1hcCIgdHlwZT0ib3JtOmJhc2ljLW1hcCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1vbmUiIHR5cGU9Im9ybTptYW55LXRvLW9uZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1tYW55IiB0eXBlPSJvcm06b25lLXRvLW1hbnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tb25lIiB0eXBlPSJvcm06b25lLXRvLW9uZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUiIHR5cGU9Im9ybTp2YXJpYWJsZS1vbmUtdG8tb25lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1tYW55IiB0eXBlPSJvcm06bWFueS10by1tYW55IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIiB0eXBlPSJvcm06ZWxlbWVudC1jb2xsZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgICAgICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkIiB0eXBlPSJvcm06ZW1iZWRkZWQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2Zvcm1hdGlvbiIgdHlwZT0ib3JtOnRyYW5zZm9ybWF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNpZW50IiB0eXBlPSJvcm06dHJhbnNpZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWMgewotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImdlbmVyYXRlZC12YWx1ZSIgdHlwZT0ib3JtOmdlbmVyYXRlZC12YWx1ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9iIiB0eXBlPSJvcm06bG9iIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYy1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNDb2xsZWN0aW9uIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSB0aGF0IAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSBoaW50IHRvIAotICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAKLSAgICAgICAgICAgKiBMQVpZLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsgCi0gCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgdmFsdWUgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCAKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGRhdGEuIERlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBvciBmaWVsZCBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbiB2YWx1ZUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTplY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtbWFwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNNYXAgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCi0gICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCi0gICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAotICAgICAgICAgICAqIExBWlkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IG1hcCAKLSAgICAgICAgICAgKiBrZXkuIElmIHRoZSBuYW1lIG9uIHRlIGtleSBjb2x1bW4gaXMgIiIsIHRoZSBuYW1lIHdpbGwgZGVmYXVsdCB0bzoKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb3IgZmllbGQ7ICJfS0VZIi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4ga2V5Q29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSBrZXkgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAotICAgICAgICAgICAqIHRoZSBkaXJlY3QgbWFwIGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJ0IGtleUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHZhbHVlIGNvbnZlcnRlci4gRGVmYXVsdCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAgICAgICAqIHNwZWNpZnlpbmcgQENvbnZlcnQoIm5vbmUiKSwgbWVhbmluZyBubyBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgY29sdW1uIG1hcHBpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVydCB2YWx1ZUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+ICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06ZWNsaXBzZWxpbmstY29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhc2NhZGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIENhc2NhZGVUeXBlIHsgQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNIfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1hbGwiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1tZXJnZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZW1vdmUiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsb25lLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5DbG9uZUNvcHlQb2xpY3kgb24gYW4gCi0gICAgICAgICAqIEVudGl0eS4gQSBDbG9uZUNvcHlQb2xpY3kgbXVzdCBzcGVjaWZ5IGF0IG9uZSBvciBib3RoIG9mIHRoZSAibWV0aG9kIiAKLSAgICAgICAgICogb3IgIndvcmtpbmdDb3B5TWV0aG9kIi4gIndvcmtpbmdDb3B5TWV0aG9kIiBpcyB1c2VkIHRvIGNsb25lIG9iamVjdHMgCi0gICAgICAgICAqIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgdXNlciBhcyB0aGV5IGFyZSByZWdpc3RlcmVkIGluIAotICAgICAgICAgKiBFY2xpcHNlTGluaydzIHRyYW5zYWN0aW9uYWwgbWVjaGFuaXNtLCB0aGUgVW5pdE9mV29yay4gIm1ldGhvZCIgd2lsbCAKLSAgICAgICAgICogYmUgdXNlZCBmb3IgdGhlIGNsb25lIHRoYXQgaXMgdXNlZCBmb3IgY29tcGFyaXNvbiBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5Ci0gICAgICAgICAqICAKLSAgICAgICAgICogQSBDbG9uZUNvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MKLSAgICAgICAgICogb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiKQotICAgICAgICAgKiAKLSAgICAgICAgICogb3I6Ci0gICAgICAgICAqIAotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kobWV0aG9kPSJteUNsb25lTWV0aG9kIiwgd29ya2luZ0NvcHlNZXRob2Q9Im15V29ya2luZ0NvcHlDbG9uZU1ldGhvZCIpCi0gICAgICAgICAqIAotICAgICAgICAgKiBvcjoKLSAgICAgICAgICogCi0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeSh3b3JraW5nQ29weU1ldGhvZE5hbWU9Im15V29ya2luZ0NvcHlDbG9uZSIpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDbG9uZUNvcHlQb2xpY3kgewotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkKLSAgICAgICAgICAgICAqIEVpdGhlciBtZXRob2Qgb3Igd29ya2luZ0NvcHlNZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQgdGhpcyBkZWZpbmVzIAotICAgICAgICAgICAgICogYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCB3aWxsIGJlIHVzZWQgCi0gICAgICAgICAgICAgKiBmb3IgY29tcGFyaXNvbiBieQotICAgICAgICAgICAgICogRWNsaXBzZUxpbmsncyBEZWZlcnJlZENoYW5nZURldGVjdGlvblBvbGljeQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZAotICAgICAgICAgICAgICogdGhpcyBkZWZpbmVzIGEgbWV0aG9kIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNsb25lIHRoYXQgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBvYmplY3QgcmV0dXJuZWQgd2hlbiByZWdpc3RlcmluZyBhbiAKLSAgICAgICAgICAgICAqIE9iamVjdCBpbiBhbiBFY2xpcHNlTGluayBVbml0T2ZXb3JrCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyB3b3JraW5nQ29weU1ldGhvZCgpOwotCi0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ3b3JraW5nLWNvcHktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2xsZWN0aW9uVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sbGVjdGlvblRhYmxlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRhYmxlLiBJZiBpdCBpcyBub3QgCi0gICAgICAgICAgICogc3BlY2lmaWVkLCBpdCBpcyBkZWZhdWx0ZWQgdG8gdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGZvbGxvd2luZzogCi0gICAgICAgICAgICogdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBlbnRpdHk7ICJfIiA7IHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgCi0gICAgICAgICAgICogcHJvcGVydHkgb3IgZmllbGQgb2YgdGhlIHNvdXJjZSBlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhdGFsb2cgb2YgdGhlIHRhYmxlLiBJdCBkZWZhdWx0cyB0byB0aGUgcGVyc2lzdGVuY2UgCi0gICAgICAgICAgICogdW5pdCBkZWZhdWx0IGNhdGFsb2cuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNjaGVtYSBvZiB0aGUgdGFibGUuIEl0IGRlZmF1bHRzIHRvIHRoZSBwZXJzaXN0ZW5jZSAKLSAgICAgICAgICAgKiB1bml0IGRlZmF1bHQgc2NoZW1hLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVXNlZCB0byBzcGVjaWZ5IGEgcHJpbWFyeSBrZXkgY29sdW1uIHRoYXQgaXMgdXNlZCBhcyBhIAotICAgICAgICAgICAqIGZvcmVpZ24ga2V5IHRvIGpvaW4gdG8gYW5vdGhlciB0YWJsZS4gSWYgdGhlIHNvdXJjZSBlbnRpdHkgdXNlcyBhIAotICAgICAgICAgICAqIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSwgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBtdXN0IGJlIHNwZWNpZmllZCAKLSAgICAgICAgICAgKiBmb3IgZWFjaCBmaWVsZCBvZiB0aGUgY29tcG9zaXRlIHByaW1hcnkga2V5LiBJbiBhIHNpbmdsZSBwcmltYXJ5IAotICAgICAgICAgICAqIGtleSBjYXNlLCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG1heSBvcHRpb25hbGx5IGJlIHNwZWNpZmllZC4gCi0gICAgICAgICAgICogRGVmYXVsdGluZyB3aWxsIGFwcGx5IG90aGVyd2lzZSBhcyBmb2xsb3dzOgotICAgICAgICAgICAqIG5hbWUsIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgcHJpbWFyeSB0YWJsZSAKLSAgICAgICAgICAgKiBvZiB0aGUgc291cmNlIGVudGl0eS4gcmVmZXJlbmNlZENvbHVtbk5hbWUsIHRoZSBzYW1lIG5hbWUgb2YgCi0gICAgICAgICAgICogcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSBwcmltYXJ5IHRhYmxlIG9mIHRoZSBzb3VyY2UgZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsgCi0gCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVbmlxdWUgY29uc3RyYWludHMgdGhhdCBhcmUgdG8gYmUgcGxhY2VkIG9uIHRoZSB0YWJsZS4gCi0gICAgICAgICAgICogVGhlc2UgYXJlIG9ubHkgdXNlZCBpZiB0YWJsZSBnZW5lcmF0aW9uIGlzIGluIGVmZmVjdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OyAKLSAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgotICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb252ZXJzaW9uVmFsdWUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgZGF0YWJhc2UgdmFsdWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGRhdGFWYWx1ZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBvYmplY3QgdmFsdWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG9iamVjdFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAotICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudAotICAgICAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlciBpbnRlcmZhY2UuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgY29udmVydGVyQ2xhc3MoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4tcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW5SZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgb24gYW4gRW50aXR5LgotICAgICAgICAgKiBJdCBpcyByZXF1aXJlZCB0aGF0IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgYmUgc3BlY2lmaWVkIAotICAgICAgICAgKiBhcyB0aGUgYXJndW1lbnQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3Mgb3IgCi0gICAgICAgICAqIEVtYmVkZGFibGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBGb3IgaW5zdGFuY2U6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENvcHlQb2xpY3koImV4YW1wbGUuTXlDb3B5UG9saWN5IikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvcHlQb2xpY3kgewotCi0gICAgICAgIC8qCi0gICAgICAgICogKFJlcXVpcmVkKQotICAgICAgICAqIFRoaXMgZGVmaW5lcyB0aGUgY2xhc3Mgb2YgdGhlIGNvcHkgcG9saWN5LiBJdCBtdXN0IHNwZWNpZnkgYSBjbGFzcyAKLSAgICAgICAgKiB0aGF0IGltcGxlbWVudHMgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5Ci0gICAgICAgICovCi0gICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICJEVFlQRSI7Ci0gICAgICAgICAgRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUoKSBkZWZhdWx0IFNUUklORzsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMzE7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIERpc2NyaW1pbmF0b3JDbGFzcyBpcyB1c2VkIHdpdGhpbiBhIFZhcmlhYmxlT25lVG9PbmUgYW5ub3RhdGlvbi4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHt9KSAKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ2xhc3MgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGRpc2NyaW1pbmF0b3IgdG8gYmUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3IoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNsYXNzIHRvIHRoZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gCi0gICAgICAgICAgICogZGlzY3JpbWluYXRvci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBEaXNjcmltaW5hdG9yVHlwZSB7IFNUUklORywgQ0hBUiwgSU5URUdFUiB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFSIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlRFR0VSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvclZhbHVlIHsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVsZW1lbnQtY29sbGVjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVsZW1lbnRDb2xsZWN0aW9uIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNsYXNzIiB0eXBlPSJvcm06bWFwLWtleS1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiIHR5cGU9Im9ybTpsb2IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMiI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06Y29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGVtYmVkZGFibGUgb2JqZWN0cy4gSXMKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUKLSAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkCi0gICAgICAgIGluIHRoZSBjbGFzcy4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRhYmxlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvcHktcG9saWN5IiB0eXBlPSJvcm06Y29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRlZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGVkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQtaWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktbGlzdGVuZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIGFuIGVudGl0eSBsaXN0ZW5lciB0byBiZSBpbnZva2VkIGF0IGxpZmVjeWNsZSBldmVudHMKLSAgICAgICAgZm9yIHRoZSBlbnRpdGllcyB0aGF0IGxpc3QgdGhpcyBsaXN0ZW5lci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlMaXN0ZW5lcnMgewotICAgICAgICAgIENsYXNzW10gdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXIiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5UmVzdWx0IHsKLSAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcygpOwotICAgICAgICAgIEZpZWxkUmVzdWx0W10gZmllbGRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQtcmVzdWx0IiB0eXBlPSJvcm06ZmllbGQtcmVzdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZW50aXR5LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBFbnVtVHlwZSB7Ci0gICAgICAgICAgT1JESU5BTCwKLSAgICAgICAgICBTVFJJTkcKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1JESU5BTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtZXJhdGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW51bWVyYXRlZCB7Ci0gICAgICAgICAgRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOmVudW0tdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEZldGNoVHlwZSB7IExBWlksIEVBR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQVpZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRmllbGRSZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbigpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImdlbmVyYXRlZC12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEdlbmVyYXRlZFZhbHVlIHsKLSAgICAgICAgICBHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgQVVUTzsKLSAgICAgICAgICBTdHJpbmcgZ2VuZXJhdG9yKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RyYXRlZ3kiIHR5cGU9Im9ybTpnZW5lcmF0aW9uLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmF0b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJnZW5lcmF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBHZW5lcmF0aW9uVHlwZSB7IFRBQkxFLCBTRVFVRU5DRSwgSURFTlRJVFksIEFVVE8gfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRVFVRU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURFTlRJVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkLWNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWRDbGFzcyB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJpZC12YWxpZGF0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgSWRWYWxpZGF0aW9uIGVudW0gZGV0ZXJtaW5lcyB0aGUgdHlwZSB2YWx1ZSB0aGF0IGFyZSB2YWxpZCBmb3IgYW4gSWQuCi0gICAgICAgICAqIEJ5IGRlZmF1bHQgbnVsbCBpcyBub3QgYWxsb3dlZCwgYW5kIDAgaXMgbm90IGFsbG93IGZvciBzaW5nbGV0b24gaWRzIG9mIGxvbmcgb3IgaW50IHR5cGUuCi0gICAgICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFpFUk8gZm9yIHNpbmdsZXRvbiBpZHMsIGFuZCBOVUxMIGZvciBjb21wb3NpdGUgaWRzLgotICAgICAgICAgKiBUaGlzIGNhbiBiZSBzZXQgdXNpbmcgdGhlIEBQcmltYXJ5S2V5IGFubm90YXRpb24sIG9yIENsYXNzRGVzY3JpcHRvciBBUEkuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIFByaW1hcnlLZXkKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5DbGFzc0Rlc2NyaXB0b3Ijc2V0SWRWYWxpZGF0aW9uKElkVmFsaWRhdGlvbikKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAxLjAgCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIGVudW0gSWRWYWxpZGF0aW9uIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogT25seSBudWxsIGlzIG5vdCBhbGxvd2VkIGFzIGFuIGlkIHZhbHVlLCAwIGlzIGFsbG93ZWQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE5VTEwsCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogbnVsbCBhbmQgMCBhcmUgbm90IGFsbG93ZWQsIChvbmx5IGludCBhbmQgbG9uZykuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFpFUk8sCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogTm8gaWQgdmFsaWRhdGlvbiBpcyBkb25lLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBOT05FCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlVMTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWkVSTyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluaGVyaXRhbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5oZXJpdGFuY2UgewotICAgICAgICAgIEluaGVyaXRhbmNlVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgU0lOR0xFX1RBQkxFOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJpbmhlcml0YW5jZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gSW5oZXJpdGFuY2VUeXBlIHsgU0lOR0xFX1RBQkxFLCBKT0lORUQsIFRBQkxFX1BFUl9DTEFTUyB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lOR0xFX1RBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT0lORUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFX1BFUl9DTEFTUyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkluc3RhbnRpYXRpb25Db3B5UG9saWN5IAotICAgICAgICAgKiBvbiBhbiBFbnRpdHkuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHRoZSBkZWZhdWx0IENvcHlQb2xpY3kgaW4gCi0gICAgICAgICAqIEVjbGlwc2VMaW5rIGFuZCB0aGVyZWZvcmUgdGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBvbmx5IHVzZWQgdG8gCi0gICAgICAgICAqIG92ZXJyaWRlIG90aGVyIHR5cGVzIG9mIGNvcHkgcG9saWNpZXMKLSAgICAgICAgICogCi0gICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogRXhhbXBsZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBASW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbnN0YW50aWF0aW9uQ29weVBvbGljeSB7Ci0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqb2luLWZldGNoLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBKb2luRmV0Y2hUeXBlIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIGlubmVyIGpvaW4gaXMgdXNlZCB0byBmZXRjaCB0aGUgcmVsYXRlZCBvYmplY3QuCi0gICAgICAgICAqIFRoaXMgZG9lcyBub3QgYWxsb3cgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgotICAgICAgICAgKi8KLSAgICAgICAgSU5ORVIsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIGlubmVyIGpvaW4gaXMgdXNlZCB0byBmZXRjaCB0aGUgcmVsYXRlZCBvYmplY3QuCi0gICAgICAgICAqIFRoaXMgYWxsb3dzIGZvciBudWxsL2VtcHR5IHZhbHVlcy4KLSAgICAgICAgICovCi0gICAgICAgIE9VVEVSLAotICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5ORVIiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVEVSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5UYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBpbnZlcnNlSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludmVyc2Utam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBMb2Ige30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvY2stbW9kZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIHB1YmxpYyBlbnVtIExvY2tNb2RlVHlwZSB7IFJFQUQsIFdSSVRFLCBPUFRJTUlTVElDLAotICAgICAgICBPUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCwgUEVTU0lNSVNUSUNfUkVBRCwgUEVTU0lNSVNUSUNfV1JJVEUsCi0gICAgICAgIFBFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCwgTk9ORX07Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVBRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1JJVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QVElNSVNUSUMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19SRUFEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19XUklURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1tYW55Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1jb2x1bW4iIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktZW51bWVyYXRlZCIgdHlwZT0ib3JtOmVudW1lcmF0ZWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9PbmUgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnktaWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlDbGFzcyB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleS1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgotICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5Sm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYSBtYXBwZWQgc3VwZXJjbGFzcy4gSXMKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUKLSAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkCi0gICAgICAgIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5Ci0gICAgICAgIGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcHBlZFN1cGVyY2xhc3N7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXkiIHR5cGU9Im9ybTpwcmltYXJ5LWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZSIgdHlwZT0ib3JtOmNhY2hlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNraW5nIiB0eXBlPSJvcm06ZXhpc3RlbmNlLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkTmF0aXZlUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsgLy9uYW1lZCBTcWxSZXN1bHRTZXRNYXBwaW5nCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jay1tb2RlIiB0eXBlPSJvcm06bG9jay1tb2RlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbiBhbGxvd3MgdGhlIGRlZmluaXRpb24gb2YgCi0gICAgICAgICAqIHF1ZXJpZXMgdGhhdCBjYWxsIHN0b3JlZCBwcm9jZWR1cmVzIGFzIG5hbWVkIHF1ZXJpZXMuCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvcgotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFVuaXF1ZSBuYW1lIHRoYXQgcmVmZXJlbmNlcyB0aGlzIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgUXVlcnkgaGludHMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBSZWZlcnMgdG8gdGhlIGNsYXNzIG9mIHRoZSByZXN1bHQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBTUUxSZXN1bHRNYXBwaW5nLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIG5hbWUgb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHByb2NlZHVyZU5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgV2hldGhlciB0aGUgcXVlcnkgc2hvdWxkIHJldHVybiBhIHJlc3VsdCBzZXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiByZXR1cm5zUmVzdWx0U2V0KCkgZGVmYXVsdCB0cnVlOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyBhcmd1bWVudHMgdG8gdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyW10gcGFyYW1ldGVycygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiIHR5cGU9Im9ybTpzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJldHVybnMtcmVzdWx0LXNldCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT2JqZWN0VHlwZUNvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlCi0gICAgICAgICAgICogYWNyb3NzIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgCi0gICAgICAgICAgICogZmllbGQgb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgY29udmVyc2lvbiB2YWx1ZXMgdG8gYmUgdXNlZCAKLSAgICAgICAgICAgKiB3aXRoIHRoZSBvYmplY3QgY29udmVydGVyLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnNpb25WYWx1ZVtdIGNvbnZlcnNpb25WYWx1ZXMoKTsKLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IGEgZGVmYXVsdCBvYmplY3QgdmFsdWUuIFVzZWQgZm9yIAotICAgICAgICAgICAgKiBsZWdhY3kgZGF0YSBpZiB0aGUgZGF0YSB2YWx1ZSBpcyBtaXNzaW5nLgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnNpb24tdmFsdWUiIHR5cGU9Im9ybTpjb252ZXJzaW9uLXZhbHVlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1vYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNsYXNzIiB0eXBlPSJvcm06bWFwLWtleS1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICA8eHNkOmNob2ljZT4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgIDwveHNkOmNob2ljZT4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JwaGFuLXJlbW92YWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBvcnBoYW5SZW1vdmFsKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnktaWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAqIG9wdGltaXN0aWMgbG9ja2luZyBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgCi0gICAgICAgICAqIGVudGl0aWVzLiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24KLSAgICAgICAgICogYW4gZW50aXR5IG9yIG1hcHBlZC1zdXBlcmNsYXNzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSXQgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBvcHRpbWlzdGljLWxvY2tpbmctdHlwZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcHRpbWlzdGljTG9ja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHRvIHVzZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPcHRpbWlzdGljTG9ja2luZ1R5cGUgdHlwZSgpIGRlZmF1bHQgVkVSU0lPTl9DT0xVTU47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IG9mIHR5cGUgCi0gICAgICAgICAgICogU0VMRUNURURfQ09MVU1OUywgdGhpcyBhbm5vdGF0aW9uIG1lbWJlciBiZWNvbWVzIGEgKFJlcXVpcmVkKSAKLSAgICAgICAgICAgKiBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBzZWxlY3RlZENvbHVtbnMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHdoZXJlIHRoZSBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHNob3VsZCAKLSAgICAgICAgICAgKiBjYXNjYWRlIGxvY2suIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB3aXRoIFZFUlNJT05fQ09MVU1OIGxvY2tpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBjYXNjYWRlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWxlY3RlZC1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FzY2FkZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmctdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBzaW1wbGUgdHlwZSB0aGF0IGlzIHVzZWQgd2l0aGluIGFuIG9wdGltaXN0aWMtbG9ja2luZyAKLSAgICAgICAgICogc3BlY2lmaWNhdGlvbiB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIG9wdGltaXN0aWMtbG9ja2luZyB0aGF0Ci0gICAgICAgICAqIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyBlbnRpdGllcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIE9wdGltaXN0aWNMb2NraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGV2ZXJ5IGZpZWxkIGluIHRoZSB0YWJsZQotICAgICAgICAgICAqIGluIHRoZSBXSEVSRSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUgb3IgYSBkZWxldGUuIElmIGFueSBmaWVsZAotICAgICAgICAgICAqIGhhcyBiZWVuIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgQUxMX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgb25seSB0aGUgY2hhbmdlZCBmaWVsZHMKLSAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBBIGRlbGV0ZQotICAgICAgICAgICAqIHdpbGwgb25seSBjb21wYXJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDSEFOR0VEX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBjb21wYXJlcyBzZWxlY3RlZCBmaWVsZHMgaW4gdGhlIFdIRVJFCi0gICAgICAgICAgICogY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBOb3RlIHRoYXQKLSAgICAgICAgICAgKiB0aGUgZmllbGRzIHNwZWNpZmllZCBtdXN0IGJlIG1hcHBlZCBhbmQgbm90IGJlIHByaW1hcnkga2V5cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRUxFQ1RFRF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGEgc2luZ2xlIHZlcnNpb24gbnVtYmVyCi0gICAgICAgICAgICogaW4gdGhlIHdoZXJlIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gVGhlIHZlcnNpb24gZmllbGQgbXVzdCBiZQotICAgICAgICAgICAqIG1hcHBlZCBhbmQgbm90IGJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBWRVJTSU9OX0NPTFVNTgotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMTF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFOR0VEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTEVDVEVEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZFUlNJT05fQ09MVU1OIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+ICAKLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJCeSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3JkZXItY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRpb24tbW9kZSIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbi12YWxpZGF0aW9uLW1vZGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcmRlci1jb2x1bW4tdmFsaWRhdGlvbi1tb2RlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZSB7Ci0gICAgICAgICAgTk9ORSwKLSAgICAgICAgICBDT1JSRUNUSU9OLAotICAgICAgICAgIEVYQ0VQVElPTgotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT1JSRUNUSU9OIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFWENFUFRJT04iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LWxvYWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RMb2FkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXBlcnNpc3QiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXJlbW92ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFJlbW92ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVSZW1vdmUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVVwZGF0ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogIFRoZSBQcmltYXJ5S2V5IGFubm90YXRpb24gYWxsb3dzIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb2YgdGhlIElkLgotICAgICAgICAgKiAgQSB2YWxpZGF0aW9uIHBvbGljeSBjYW4gYmUgZ2l2ZW4gdGhhdCBhbGxvd3Mgc3BlY2lmeWluZyBpZiB6ZXJvIGlzIGEgdmFsaWQgaWQgdmFsdWUuCi0gICAgICAgICAqICBUaGUgc2V0IG9mIHByaW1hcnkga2V5IGNvbHVtbnMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIHByZWNpc2VseS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMS4xCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5IHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIENvbmZpZ3VyZXMgd2hhdCBpZCB2YWxpZGF0aW9uIGlzIGRvbmUuCi0gICAgICAgICAgICogQnkgZGVmYXVsdCAwIGlzIG5vdCBhIHZhbGlkIGlkIHZhbHVlLCB0aGlzIGNhbiBiZSB1c2VkIHRvIGFsbG93IDAgaWQgdmFsdWVzLgotICAgICAgICAgICAqLwotICAgICAgICAgIElkVmFsaWRhdGlvbiB2YWxpZGF0aW9uKCkgZGVmYXVsdCBJZFZhbGlkYXRpb24uWkVSTzsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVzZWQgdG8gc3BlY2lmeSB0aGUgcHJpbWFyeSBrZXkgY29sdW1ucyBkaXJlY3RseS4KLSAgICAgICAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgQElkIGlmIHRoZSBwcmltYXJ5IGtleSBpbmNsdWRlcyBhIG5vbiBiYXNpYyBmaWVsZCwKLSAgICAgICAgICAgKiBzdWNoIGFzIGEgZm9yZWlnbiBrZXksIG9yIGEgaW5oZXJpdGFuY2UgZGlzY3JpbWluYXRvciwgZW1iZWRkZWQsIG9yIHRyYW5zZm9ybWF0aW9uIG1hcHBlZCBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsaWRhdGlvbiIgdHlwZT0ib3JtOmlkLXZhbGlkYXRpb24iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3BlcnR5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQSB1c2VyIGRlZmluZWQgbWFwcGluZydzIHByb3BlcnR5LgotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcm9wZXJ0eSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogUHJvcGVydHkgbmFtZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBQcm9wZXJ0eSB2YWx1ZSwKLSAgICAgICAgICAgKiBjb252ZXJ0ZWQgdG8gYW4gaW5zdGFuY2Ugb2YgdmFsdWVUeXBlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFByb3BlcnR5IHZhbHVlIHR5cGUuCi0gICAgICAgICAgICogVGhlIHZhbHVlIGNvbnZlcnRlZCB0byB2YWx1ZVR5cGUgYnkgQ29udmVyc2lvbk1hbmFnZXIuCi0gICAgICAgICAgICogSWYgc3BlY2lmaWVkIG11c3QgYmUgYSBzaW1wbGUgdHlwZSB0aGF0IGNvdWxkIGJlIGhhbmRsZWQgYnkgCi0gICAgICAgICAgICogQ29udmVyc2lvbk1hbmFnZXI6IAotICAgICAgICAgICAqIG51bWVyaWNhbCwgYm9vbGVhbiwgdGVtcG9yYWwuICAKLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2xhc3MgdmFsdWVUeXBlKCkgZGVmYXVsdCBTdHJpbmcuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktaGludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUXVlcnlIaW50IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC10cmFuc2Zvcm1lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbm5vdGF0aW9uIGZvciBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0gICAgICAgICAqIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgCi0gICAgICAgICAqIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgCi0gICAgICAgICAqIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSZWFkVHJhbnNmb3JtZXIgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVc2VyLWRlZmluZWQgY2xhc3MgdGhhdCBtdXN0IGltcGxlbWVudCB0aGUgCi0gICAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy50cmFuc2Zvcm1lcnMuQXR0cmlidXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAgICAgKiBpbnRlcmZhY2UuIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCwgaXRzIAotICAgICAgICAgICAgICogYnVpbGRBdHRyaWJ1dGVWYWx1ZSB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSAKLSAgICAgICAgICAgICAqIGFzc2lnbmVkIHRvIHRoZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIENsYXNzIHRyYW5zZm9ybWVyQ2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLSAgICAgICAgICAgICAqIGEgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZSAobm90IGFzc2lnbnMgdGhlIHZhbHVlIHRvIAotICAgICAgICAgICAgICogdGhlIGF0dHJpYnV0ZSkuIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIAotICAgICAgICAgICAgICogc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2Vjb25kYXJ5VGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcGtKb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlcXVlbmNlR2VuZXJhdG9yIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBzZXF1ZW5jZU5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAxOwotICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXF1ZW5jZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNxbFJlc3VsdFNldE1hcHBpbmcgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgRW50aXR5UmVzdWx0W10gZW50aXRpZXMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENvbHVtblJlc3VsdFtdIGNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktcmVzdWx0IiB0eXBlPSJvcm06ZW50aXR5LXJlc3VsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbi1yZXN1bHQiIHR5cGU9Im9ybTpjb2x1bW4tcmVzdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYW5ub3RhdGlvbiBpcyB1c2VkIHdpdGhpbiBhIAotICAgICAgICAgKiBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24uIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe30pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyLgotICAgICAgICAgICAqLwotICAgICAgICAgIERpcmVjdGlvbiBkaXJlY3Rpb24oKSBkZWZhdWx0IElOOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTdG9yZWQgcHJvY2VkdXJlIHBhcmFtZXRlciBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIHF1ZXJ5IHBhcmFtZXRlciBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBxdWVyeVBhcmFtZXRlcigpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBKYXZhIGNsYXNzIGRlc2lyZWQgYmFjayBmcm9tIHRoZSBwcm9jZWR1cmUsIAotICAgICAgICAgICAqIHRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB0eXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgSkRCQyB0eXBlIGNvZGUsIHRoaXMgZGVwZW5kZW50IG9uIHRoZSB0eXBlIHJldHVybmVkIAotICAgICAgICAgICAqIGZyb20gdGhlIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBpbnQgamRiY1R5cGUoKSBkZWZhdWx0IC0xOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgSkRCQyB0eXBlIG5hbWUsIHRoaXMgbWF5IGJlIHJlcXVpcmVkIGZvciBBUlJBWSBvciAKLSAgICAgICAgICAgKiBTVFJVQ1QgdHlwZXMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGpkYmNUeXBlTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0ib3JtOmRpcmVjdGlvbi10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InF1ZXJ5LXBhcmFtZXRlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iamRiYy10eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RydWN0LWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0cnVjdENvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlIGFjcm9zcyAKLSAgICAgICAgICAgKiB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY29udmVydGVyIGNsYXNzIHRvIGJlIHVzZWQuIFRoaXMgY2xhc3MgbXVzdCAKLSAgICAgICAgICAgKiBpbXBsZW1lbnQgdGhlIEVjbGlwc2VMaW5rIGludGVyZmFjZSAKLSAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBjb252ZXJ0ZXIoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5WYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMDsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRlbXBvcmFsIHsKLSAgICAgICAgICBUZW1wb3JhbFR5cGUgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJvcm06dGVtcG9yYWwtdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIFRlbXBvcmFsVHlwZSB7Ci0gICAgICAgICAgREFURSwgLy8gamF2YS5zcWwuRGF0ZQotICAgICAgICAgIFRJTUUsIC8vIGphdmEuc3FsLlRpbWUKLSAgICAgICAgICBUSU1FU1RBTVAgLy8gamF2YS5zcWwuVGltZXN0YW1wCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRBVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUVTVEFNUCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gIAotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGltZS1vZi1kYXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRpbWVPZkRheSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBIb3VyIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBob3VyKCkgZGVmYXVsdCAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBNaW51dGUgb2YgdGhlIGRheS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgaW50IG1pbnV0ZSgpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU2Vjb25kIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBzZWNvbmQoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIE1pbGxpc2Vjb25kIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBtaWxsaXNlY29uZCgpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEludGVybmFsIHVzZS4gRG8gbm90IG1vZGlmeS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBzcGVjaWZpZWQoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImhvdXIiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWludXRlIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNlY29uZCIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaWxsaXNlY29uZCIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogVHJhbnNmb3JtYXRpb24gaXMgYW4gb3B0aW9uYWwgYW5ub3RhdGlvbiBmb3IgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLlRyYW5zZm9ybWF0aW9uTWFwcGluZy4KLSAgICAgICAgICogVHJhbnNmb3JtYXRpb25NYXBwaW5nIGFsbG93cyB0byBtYXAgYW4gYXR0cmlidXRlIHRvIG9uZSBvciBtb3JlIAotICAgICAgICAgKiBkYXRhYmFzZSBjb2x1bW5zLgotICAgICAgICAgKiAKLSAgICAgICAgICogVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbiBpcyBhbiBvcHRpb25hbCBwYXJ0IG9mIAotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgZGVmaW5pdGlvbi4gVW5sZXNzIHRoZSBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgaXMgCi0gICAgICAgICAqIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgUmVhZFRyYW5zZm9ybWVyLCBpdCBkZWZpbmVzIAotICAgICAgICAgKiB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgdmFsdWUocylpbnRvIGF0dHJpYnV0ZSB2YWx1ZS4KLSAgICAgICAgICogQWxzbyB1bmxlc3MgaXQncyBhIHJlYWQtb25seSBtYXBwaW5nLCBlaXRoZXIgV3JpdGVUcmFuc2Zvcm1lciAKLSAgICAgICAgICogYW5ub3RhdGlvbiBvciBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uIHNob3VsZCBiZSBzcGVjaWZpZWQuIEVhY2ggCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCi0gICAgICAgICAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyKS4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHJhbnNmb3JtYXRpb24gewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgCi0gICAgICAgICAgICAgKiB0aGF0IHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSAKLSAgICAgICAgICAgICAqIGhpbnQgdG8gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIAotICAgICAgICAgICAgICogZGVmYXVsdHMgdG8gRUFHRVIuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgb3B0aW9uYWwgZWxlbWVudCBpcyBhIGhpbnQgYXMgdG8gd2hldGhlciB0aGUgdmFsdWUKLSAgICAgICAgICAgICAqICBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgbWF5IGJlIG51bGwuIEl0IGlzIGRpc3JlZ2FyZGVkCi0gICAgICAgICAgICAgKiAgZm9yIHByaW1pdGl2ZSB0eXBlcywgd2hpY2ggYXJlIGNvbnNpZGVyZWQgbm9uLW9wdGlvbmFsLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWQtdHJhbnNmb3JtZXIiIHR5cGU9Im9ybTpyZWFkLXRyYW5zZm9ybWVyIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiIHR5cGU9Im9ybTp3cml0ZS10cmFuc2Zvcm1lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2llbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUcmFuc2llbnQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUeXBlQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUKLSAgICAgICAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZSBmaWVsZCAKLSAgICAgICAgICAgKiBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IGZpZWxkIAotICAgICAgICAgICAqIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBWYXJpYWJsZSBvbmUgdG8gb25lIG1hcHBpbmdzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhIHBvaW50ZXIgCi0gICAgICAgICAqIHJlZmVyZW5jZXMgYmV0d2VlbiBhIGphdmEgb2JqZWN0IGFuZCBhbiBpbXBsZW1lbnRlciBvZiBhbiBpbnRlcmZhY2UuIAotICAgICAgICAgKiBUaGlzIG1hcHBpbmcgaXMgdXN1YWxseSByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBwb2ludGVyIChzdG9yZWQgaW4gYW4gCi0gICAgICAgICAqIGluc3RhbmNlIHZhcmlhYmxlKSBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBvYmplY3RzLiBJbiB0aGUgCi0gICAgICAgICAqIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGVzLCB0aGVzZSBtYXBwaW5ncyBhcmUgbm9ybWFsbHkgaW1wbGVtZW50ZWQgCi0gICAgICAgICAqIHVzaW5nIGEgZm9yZWlnbiBrZXkgYW5kIGEgdHlwZSBjb2RlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQSBWYXJpYWJsZU9uZVRvT25lIGNhbiBiZSBzcGVjaWZpZWQgd2l0aGluIGFuIEVudGl0eSwgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MgYW5kIEVtYmVkZGFibGUgY2xhc3MuIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSAKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBWYXJpYWJsZU9uZVRvT25lIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBpbnRlcmZhY2UgY2xhc3MgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZSAKLSAgICAgICAgICAgKiBhc3NvY2lhdGlvbi4gSWYgbm90IHNwZWNpZmllZCBpdCB3aWxsIGJlIGluZmVycmVkIGZyb20gdGhlIHR5cGUgCi0gICAgICAgICAgICogb2YgdGhlIG9iamVjdCBiZWluZyByZWZlcmVuY2VkLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHRhcmdldEludGVyZmFjZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG9wZXJhdGlvbnMgdGhhdCBtdXN0IGJlIGNhc2NhZGVkIHRvIHRoZSB0YXJnZXQgb2YgCi0gICAgICAgICAgICogdGhlIGFzc29jaWF0aW9uLgotICAgICAgICAgICAqLwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSAKLSAgICAgICAgICAgKiB0aGF0IHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSAKLSAgICAgICAgICAgKiBoaW50IHRvIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCAKLSAgICAgICAgICAgKiBkZWZhdWx0cyB0byBFQUdFUi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBXaGV0aGVyIHRoZSBhc3NvY2lhdGlvbiBpcyBvcHRpb25hbC4gSWYgc2V0IHRvIGZhbHNlIAotICAgICAgICAgICAqIHRoZW4gYSBub24tbnVsbCByZWxhdGlvbnNoaXAgbXVzdCBhbHdheXMgZXhpc3QuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIHdpbGwgaG9sZCB0aGUgdHlwZSAKLSAgICAgICAgICAgKiBpbmRpY2F0b3JzLiBJZiB0aGUgRGlzY3JpbWluYXRvckNvbHVtbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbmFtZSAKLSAgICAgICAgICAgKiBvZiB0aGUgZGlzY3JpbWluYXRvciBjb2x1bW4gZGVmYXVsdHMgdG8gIkRUWVBFIiBhbmQgdGhlIAotICAgICAgICAgICAqIGRpc2NyaW1pbmF0b3IgdHlwZSB0byBTVFJJTkcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRGlzY3JpbWluYXRvckNvbHVtbiBkaXNjcmltaW5hdG9yQ29sdW1uKCkgZGVmYXVsdCBARGlzY3JpbWluYXRvckNvbHVtbjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGxpc3Qgb2YgZGlzY3JpbWluYXRvciB0eXBlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggCi0gICAgICAgICAgICogdGhpcyBWYXJpYWJsZU9uZVRvT25lLiBJZiBub25lIGFyZSBzcGVjaWZpZWQgdGhlbiB0aG9zZSBlbnRpdGllcyAKLSAgICAgICAgICAgKiB3aXRoaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQgdGhhdCBpbXBsZW1lbnQgdGhlIHRhcmdldCBpbnRlcmZhY2UgCi0gICAgICAgICAgICogd2lsbCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiB0eXBlcy4gVGhlIGRpc2NyaW1pbmF0b3IgdHlwZSB3aWxsIAotICAgICAgICAgICAqIGRlZmF1bHQgYXMgZm9sbG93czoKLSAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgU1RSSU5HOiBFbnRpdHkubmFtZSgpCi0gICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIENIQVI6IEZpcnN0IGxldHRlciBvZiB0aGUgCi0gICAgICAgICAgICogICAgRW50aXR5IGNsYXNzCi0gICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIElOVEVHRVI6IFRoZSBuZXh0IGludGVnZXIgYWZ0ZXIgCi0gICAgICAgICAgICogICAgdGhlIGhpZ2hlc3QgaW50ZWdlciBleHBsaWNpdGx5IGFkZGVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIERpc2NyaW1pbmF0b3JDbGFzc1tdIGRpc2NyaW1pbmF0b3JDbGFzc2VzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNsYXNzIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jbGFzcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWludGVyZmFjZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JwaGFuLXJlbW92YWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZlcnNpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBWZXJzaW9uIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndyaXRlLXRyYW5zZm9ybWVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFubm90YXRpb24gZm9yIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLlRyYW5zZm9ybWF0aW9uTWFwcGluZy4KLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKLSAgICAgICAgICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIpLgotICAgICAgICAgKiAgCi0gICAgICAgICAqIEEgc2luZ2xlIFdyaXRlVHJhbnNmb3JtZXIgbWF5IGJlIHNwZWNpZmllZCBkaXJlY3RseSBvbiB0aGUgbWV0aG9kIG9yIAotICAgICAgICAgKiBhdHRyaWJ1dGUuIE11bHRpcGxlIFdyaXRlVHJhbnNmb3JtZXJzIHNob3VsZCBiZSB3cmFwcGVkIGludG8gCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24uIE5vIFdyaXRlVHJhbnNmb3JtZXJzIHNwZWNpZmllZCBmb3IgCi0gICAgICAgICAqIHJlYWQtb25seSBtYXBwaW5nLiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyB3cml0ZS1vbmx5LCBpdCAKLSAgICAgICAgICogc2hvdWxkIGhhdmUgYSBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgCi0gICAgICAgICAqIGNvbHVtbihzKSB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFdyaXRlVHJhbnNmb3JtZXIgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVc2VyLWRlZmluZWQgY2xhc3MgdGhhdCBtdXN0IGltcGxlbWVudCB0aGUgCi0gICAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy50cmFuc2Zvcm1lcnMuRmllbGRUcmFuc2Zvcm1lciAKLSAgICAgICAgICAgICAqIGludGVyZmFjZS4gVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkLCBpdHMgYnVpbGRGaWVsZFZhbHVlIAotICAgICAgICAgICAgICogd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBkYXRhYmFzZSAKLSAgICAgICAgICAgICAqIGNvbHVtbi4gTm90ZSB0aGF0IGZvciBkZGwgZ2VuZXJhdGlvbiBhbmQgcmV0dXJuaW5nIHRvIGJlIAotICAgICAgICAgICAgICogc3VwcG9ydGVkIHRoZSBtZXRob2QgYnVpbGRGaWVsZFZhbHVlIGluIHRoZSBjbGFzcyBzaG91bGQgYmUgCi0gICAgICAgICAgICAgKiBkZWZpbmVkIHRvIHJldHVybiB0aGUgcmVsZXZhbnQgSmF2YSB0eXBlLCBub3QganVzdCBPYmplY3QgYXMgCi0gICAgICAgICAgICAgKiBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2UsIGZvciBpbnN0YW5jZToKLSAgICAgICAgICAgICAqIHB1YmxpYyBUaW1lIGJ1aWxkRmllbGRWYWx1ZShPYmplY3QgaW5zdGFuY2UsIFN0cmluZyBmaWVsZE5hbWUsIFNlc3Npb24gc2Vzc2lvbikuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIENsYXNzIHRyYW5zZm9ybWVyQ2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLSAgICAgICAgICAgICAqIGEgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBkYXRhYmFzZSBjb2x1bW4uCi0gICAgICAgICAgICAgKiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgc3VwcG9ydGVkIHRoZSAKLSAgICAgICAgICAgICAqIG1ldGhvZCBzaG91bGQgYmUgZGVmaW5lZCB0byByZXR1cm4gYSBwYXJ0aWN1bGFyIHR5cGUsIG5vdCBqdXN0IAotICAgICAgICAgICAgICogT2JqZWN0LCBmb3IgaW5zdGFuY2U6Ci0gICAgICAgICAgICAgKiBwdWJsaWMgVGltZSBnZXRTdGFydFRpbWUoKS4KLSAgICAgICAgICAgICAqIFRoZSBtZXRob2QgbWF5IHJlcXVpcmUgYSBUcmFuc2llbnQgYW5ub3RhdGlvbiB0byBhdm9pZCBiZWluZyAKLSAgICAgICAgICAgICAqIG1hcHBlZCBhcyBCYXNpYyBieSBkZWZhdWx0LgotICAgICAgICAgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBTcGVjaWZ5IGhlcmUgdGhlIGNvbHVtbiBpbnRvIHdoaWNoIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbi4KLSAgICAgICAgICAgICAqIFRoZSBvbmx5IGNhc2Ugd2hlbiB0aGlzIGNvdWxkIGJlIHNraXBwZWQgaXMgaWYgYSBzaW5nbGUgCi0gICAgICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGFubm90YXRlcyBhbiBhdHRyaWJ1dGUgLSB0aGUgYXR0cmlidXRlJ3MgbmFtZSAKLSAgICAgICAgICAgICAqIHdpbGwgYmUgdXNlZCBhcyBhIGNvbHVtbiBuYW1lLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQ29sdW1uIGNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8yXzAueHNkIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYTIzYWMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNjI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAKLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCAKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gCi0gVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCAKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0KLSBDb250cmlidXRvcnM6Ci0gICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9yYWNsZSBUb3BMaW5rCi0gICAgIHR3YXJlIC0gdXBkYXRlIHZlcnNpb24gbnVtYmVyIHRvIDIuMAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0tLT4KLQotPCEtLSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBvYmplY3QtcmVsYXRpb25hbCBtYXBwaW5nIGZpbGUgc2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6b3JtPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLSAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiAKLSAgdmVyc2lvbj0iMi4wIj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWVjbGlwc2VsaW5rX29ybV8yXzAueHNkIDIuMCAgT2N0b2JlciA1IDIwMDgKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj48IVtDREFUQVsKLQotICAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBuYXRpdmUgRWNsaXBzZWxpbmsgWE1MIG1hcHBpbmcgZmlsZQotICAgICAgIFRoZSBmaWxlIG1heSBiZSBuYW1lZCAiTUVUQS1JTkYvZWNsaXBzZWxpbmstb3JtLnhtbCIgaW4gdGhlIHBlcnNpc3RlbmNlCi0gICAgICAgYXJjaGl2ZSBvciBpdCBtYXkgYmUgbmFtZWQgc29tZSBvdGhlciBuYW1lIHdoaWNoIHdvdWxkIGJlCi0gICAgICAgdXNlZCB0byBsb2NhdGUgdGhlIGZpbGUgYXMgcmVzb3VyY2Ugb24gdGhlIGNsYXNzcGF0aC4KLSAgICAgICBPYmplY3QvcmVsYXRpb25hbCBtYXBwaW5nIGZpbGVzIG11c3QgaW5kaWNhdGUgdGhlIG9iamVjdC9yZWxhdGlvbmFsCi0gICAgICAgbWFwcGluZyBmaWxlIHNjaGVtYSBieSB1c2luZyB0aGUgcGVyc2lzdGVuY2UgbmFtZXNwYWNlOgotCi0gICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybQotCi0gICAgICAgYW5kIGluZGljYXRlIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkgdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotICAgICAgIDxlbnRpdHktbWFwcGluZ3MgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iCi0gICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0gCi0gICAgICAgZWNsaXBzZWxpbmtfb3JtXzJfMC54c2QKLSAgICAgICB2ZXJzaW9uPSIyLjAiPgotICAgICAgIC4uLgotICAgICAgIDwvZW50aXR5LW1hcHBpbmdzPgotCi0gICAgIF1dPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1wdHlUeXBlIi8+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ2ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbMC05XSsoXC5bMC05XSspKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjY2Vzcy1tZXRob2RzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FjaGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDYWNoZSBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5pbnZhbGlkYXRpb24uQ2FjaGVJbnZhbGlkYXRpb25Qb2xpY3kgCi0gICAgICAgICAqIHdoaWNoIHNldHMgb2JqZWN0cyBpbiBFY2xpcHNlTGluaydzIGlkZW50aXR5IG1hcHMgdG8gYmUgaW52YWxpZCAKLSAgICAgICAgICogZm9sbG93aW5nIGdpdmVuIHJ1bGVzLiBCeSBkZWZhdWx0IGluIEVjbGlwc2VMaW5rLCBvYmplY3RzIGRvIG5vdCAKLSAgICAgICAgICogZXhwaXJlIGluIHRoZSBjYWNoZS4gU2V2ZXJhbCBkaWZmZXJlbnQgcG9saWNpZXMgYXJlIGF2YWlsYWJsZSB0byAKLSAgICAgICAgICogYWxsb3cgb2JqZWN0cyB0byBleHBpcmUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlVHlwZQotICAgICAgICAgKiAKLSAgICAgICAgICogQSBDYWNoZSBhbm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5IG9yIE1hcHBlZFN1cGVyY2xhc3MuIAotICAgICAgICAgKiBJbiB0aGUgY2FzZSBvZiBpbmhlcml0YW5jZSwgYSBDYWNoZSBhbm5vdGF0aW9uIHNob3VsZCBvbmx5IGJlIGRlZmluZWQgCi0gICAgICAgICAqIG9uIHRoZSByb290IG9mIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDYWNoZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBjYWNoZSB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIENhY2hlVHlwZSB0eXBlKCkgZGVmYXVsdCBTT0ZUX1dFQUs7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBzaXplIG9mIGNhY2hlIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgaW50IHNpemUoKSBkZWZhdWx0IDEwMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgQ2FjaGVkIGluc3RhbmNlcyBpbiB0aGUgc2hhcmVkIGNhY2hlIG9yIGEgY2xpZW50IAotICAgICAgICAgICAqIGlzb2xhdGVkIGNhY2hlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIHNoYXJlZCgpIGRlZmF1bHQgdHJ1ZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRXhwaXJlIGNhY2hlZCBpbnN0YW5jZSBhZnRlciBhIGZpeCBwZXJpb2Qgb2YgdGltZSAobXMpLiAKLSAgICAgICAgICAgKiBRdWVyaWVzIGV4ZWN1dGVkIGFnYWluc3QgdGhlIGNhY2hlIGFmdGVyIHRoaXMgd2lsbCBiZSBmb3JjZWQgYmFjayAKLSAgICAgICAgICAgKiB0byB0aGUgZGF0YWJhc2UgZm9yIGEgcmVmcmVzaGVkIGNvcHkKLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgaW50IGV4cGlyeSgpIGRlZmF1bHQgLTE7IC8vIG1pbnVzIG9uZSBpcyBubyBleHBpcnkuCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYSBzcGVjaWZpYyB0aW1lIG9mIGRheS4gUXVlcmllcyAKLSAgICAgICAgICAgKiBleGVjdXRlZCBhZ2FpbnN0IHRoZSBjYWNoZSBhZnRlciB0aGlzIHdpbGwgYmUgZm9yY2VkIGJhY2sgdG8gdGhlIAotICAgICAgICAgICAqIGRhdGFiYXNlIGZvciBhIHJlZnJlc2hlZCBjb3B5Ci0gICAgICAgICAgICovIAotICAgICAgICAgIFRpbWVPZkRheSBleHBpcnlUaW1lT2ZEYXkoKSBkZWZhdWx0IEBUaW1lT2ZEYXkoc3BlY2lmaWVkPWZhbHNlKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRm9yY2UgYWxsIHF1ZXJpZXMgdGhhdCBnbyB0byB0aGUgZGF0YWJhc2UgdG8gYWx3YXlzIAotICAgICAgICAgICAqIHJlZnJlc2ggdGhlIGNhY2hlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIGFsd2F5c1JlZnJlc2goKSBkZWZhdWx0IGZhbHNlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBGb3IgYWxsIHF1ZXJpZXMgdGhhdCBnbyB0byB0aGUgZGF0YWJhc2UsIHJlZnJlc2ggdGhlCi0gICAgICAgICAgICogY2FjaGUgb25seSBpZiB0aGUgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBkYXRhYmFzZSBieSBhIHF1ZXJ5IGlzIAotICAgICAgICAgICAqIG5ld2VyIHRoYW4gdGhlIGRhdGEgaW4gdGhlIGNhY2hlIChhcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcHRpbWlzdGljIAotICAgICAgICAgICAqIGxvY2tpbmcgZmllbGQpCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gcmVmcmVzaE9ubHlJZk5ld2VyKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU2V0dGluZyB0byB0cnVlIHdpbGwgZm9yY2UgYWxsIHF1ZXJpZXMgdG8gYnlwYXNzIHRoZSAKLSAgICAgICAgICAgKiBjYWNoZSBmb3IgaGl0cyBidXQgc3RpbGwgcmVzb2x2ZSBhZ2FpbnN0IHRoZSBjYWNoZSBmb3IgaWRlbnRpdHkuIAotICAgICAgICAgICAqIFRoaXMgZm9yY2VzIGFsbCBxdWVyaWVzIHRvIGhpdCB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZUhpdHMoKSBkZWZhdWx0IGZhbHNlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgY2FjaGUgY29vcmRpbmF0aW9uIG1vZGUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBjb29yZGluYXRpb25UeXBlKCkgZGVmYXVsdCBTRU5EX09CSkVDVF9DSEFOR0VTOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnkiIHR5cGU9InhzZDppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnktdGltZS1vZi1kYXkiIHR5cGU9Im9ybTp0aW1lLW9mLWRheSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6Y2hvaWNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNpemUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2hhcmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpjYWNoZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWx3YXlzLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmcmVzaC1vbmx5LWlmLW5ld2VyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2FibGUtaGl0cyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb29yZGluYXRpb24tdHlwZSIgdHlwZT0ib3JtOmNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gCi0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZS1pbnRlcmNlcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENhY2hlSW50ZXJjZXB0b3IgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlVHlwZSBlbnVtIGlzIHVzZWQgd2l0aCB0aGUgQ2FjaGUgYW5ub3RhdGlvbiBmb3IgYSAKLSAgICAgICAgICogcGVyc2lzdGVudCBjbGFzcy4gSXQgZGVmaW5lcyB0aGUgdHlwZSBvZiBJZGVudGl0eU1hcC9DYWNoZSB1c2VkIGZvciAKLSAgICAgICAgICogdGhlIGNsYXNzLiBCeSBkZWZhdWx0IHRoZSBTT0ZUX1dFQUsgY2FjaGUgdHlwZSBpcyB1c2VkLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSAKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIENhY2hlVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogUHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LiBDYWNoZXMgYWxsIG9iamVjdHMKLSAgICAgICAgICAgKiBhbmQgZG9lcyBub3QgcmVtb3ZlIHRoZW0uIAotICAgICAgICAgICAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIG1heSBiZSBtZW1vcnkgaW50ZW5zaXZlIHdoZW4gbWFueSBvYmplY3RzIGFyZSAKLSAgICAgICAgICAgKiByZWFkLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZVTEwsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBGVUxMIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCB0aGUgbWFwIGhvbGRzIHRoZQotICAgICAgICAgICAqIG9iamVjdHMgdXNpbmcgd2VhayByZWZlcmVuY2VzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZnVsbCBnYXJiYWdlCi0gICAgICAgICAgICogY29sbGVjdGlvbiBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFdFQUssCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBGVUxMIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCB0aGUgbWFwIGhvbGRzIHRoZQotICAgICAgICAgICAqIG9iamVjdHMgdXNpbmcgc29mdCByZWZlcmVuY2VzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZnVsbCBnYXJiYWdlCi0gICAgICAgICAgICogY29sbGVjdGlvbiB3aGVuIG1lbW9yeSBpcyBsb3cgYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQKLSAgICAgICAgICAgKiBndWFyYW50ZWVkIGlkZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFNPRlQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBXRUFLIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCBpdCBtYWludGFpbnMgYQotICAgICAgICAgICAqIG1vc3QtZnJlcXVlbnRseS11c2VkIHN1Yi1jYWNoZS4gVGhlIHNpemUgb2YgdGhlIHN1Yi1jYWNoZSBpcwotICAgICAgICAgICAqIHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiB0aGUgaWRlbnRpdHkgbWFwIGFzIHNwZWNpZmllZCBieQotICAgICAgICAgICAqIGRlc2NyaXB0b3IncyBzZXRJZGVudGl0eU1hcFNpemUoKSBtZXRob2QuIFRoZSBzdWItY2FjaGUKLSAgICAgICAgICAgKiB1c2VzIHNvZnQgcmVmZXJlbmNlcyB0byBlbnN1cmUgdGhhdCB0aGVzZSBvYmplY3RzIGFyZQotICAgICAgICAgICAqIGdhcmJhZ2UtY29sbGVjdGVkIG9ubHkgaWYgdGhlIHN5c3RlbSBpcyBsb3cgb24gbWVtb3J5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFNPRlRfV0VBSywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIElkZW50aWNhbCB0byB0aGUgc29mdCBjYWNoZSB3ZWFrIChTT0ZUX1dFQUspIGlkZW50aXR5IG1hcCBleGNlcHQgCi0gICAgICAgICAgICogdGhhdCBpdCB1c2VzIGhhcmQgcmVmZXJlbmNlcyBpbiB0aGUgc3ViLWNhY2hlLiBVc2UgdGhpcyBpZGVudGl0eSAKLSAgICAgICAgICAgKiBtYXAgaWYgc29mdCByZWZlcmVuY2VzIGRvIG5vdCBiZWhhdmUgcHJvcGVybHkgb24geW91ciBwbGF0Zm9ybS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBIQVJEX1dFQUssCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBIGNhY2hlIGlkZW50aXR5IG1hcCBtYWludGFpbnMgYSBmaXhlZCBudW1iZXIgb2Ygb2JqZWN0cwotICAgICAgICAgICAqIHNwZWNpZmllZCBieSB0aGUgYXBwbGljYXRpb24uIE9iamVjdHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUKLSAgICAgICAgICAgKiBvbiBhIGxlYXN0LXJlY2VudGx5LXVzZWQgYmFzaXMuIFRoaXMgbWV0aG9kIGFsbG93cyBvYmplY3QKLSAgICAgICAgICAgKiBpZGVudGl0eSBmb3IgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBvYmplY3RzLgotICAgICAgICAgICAqIFdBUk5JTkc6IEZ1cm5pc2hlcyBjYWNoaW5nIGFuZCBpZGVudGl0eSwgYnV0IGRvZXMgbm90IGd1YXJhbnRlZSAKLSAgICAgICAgICAgKiBpZGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDQUNIRSwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFdBUk5JTkc6IERvZXMgbm90IHByZXNlcnZlIG9iamVjdCBpZGVudGl0eSBhbmQgZG9lcyBub3QgY2FjaGUgCi0gICAgICAgICAgICogb2JqZWN0cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBOT05FCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZVTEwiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldFQUsiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPRlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPRlRfV0VBSyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEFSRF9XRUFLIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQUNIRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gIAotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS1jb29yZGluYXRpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBDYWNoZUNvb3JkaW5hdGlvblR5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNlbmRzIGEgbGlzdCBvZiBjaGFuZ2VkIG9iamVjdHMgaW5jbHVkaW5nIGRhdGEgYWJvdXQgdGhlIGNoYW5nZXMuCi0gICAgICAgICAgICogVGhpcyBkYXRhIGlzIG1lcmdlZCBpbnRvIHRoZSByZWNlaXZpbmcgY2FjaGUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU0VORF9PQkpFQ1RfQ0hBTkdFUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNlbmRzIGEgbGlzdCBvZiB0aGUgaWRlbnRpdGllcyBvZiB0aGUgb2JqZWN0cyB0aGF0IGhhdmUgY2hhbmdlZC4gCi0gICAgICAgICAgICogVGhlIHJlY2VpdmluZyBjYWNoZSBpbnZhbGlkYXRlcyB0aGUgb2JqZWN0cyAocmF0aGVyIHRoYW4gY2hhbmdpbmcgCi0gICAgICAgICAgICogYW55IG9mIHRoZSBkYXRhKQotICAgICAgICAgICAqLwotICAgICAgICAgIElOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2FtZSBhcyBTRU5EX09CSkVDVF9DSEFOR0VTIGV4Y2VwdCBpdCBhbHNvIGluY2x1ZGVzIGFueSBuZXdseQotICAgICAgICAgICAqIGNyZWF0ZWQgb2JqZWN0cyBmcm9tIHRoZSB0cmFuc2FjdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIERvZXMgbm8gY2FjaGUgY29vcmRpbmF0aW9uLgotICAgICAgICAgICAqLwotICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VORF9PQkpFQ1RfQ0hBTkdFUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2hhbmdlLXRyYWNraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jaGFuZ2V0cmFja2luZy5PYmplY3RDaGFuZ2VQb2xpY3kgCi0gICAgICAgICAqIHdoaWNoIGNvbXB1dGVzIGNoYW5nZXMgc2V0cyBmb3IgRWNsaXBzZUxpbmsncyBVbml0T2ZXb3JrIGNvbW1pdCAKLSAgICAgICAgICogcHJvY2Vzcy4gQW4gT2JqZWN0Q2hhbmdlUG9saWN5IGlzIHN0b3JlZCBvbiBhbiBFbnRpdHkncyBkZXNjcmlwdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiBBIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24gbWF5IGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIG9yIEVtYmVkZGFibGUuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2hhbmdlVHJhY2tpbmcgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgY2hhbmdlIHRyYWNraW5nIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2hhbmdlVHJhY2tpbmdUeXBlIHZhbHVlKCkgZGVmYXVsdCBBVVRPOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nLXR5cGUiIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjaGFuZ2UtdHJhY2tpbmctdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uLiAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBDaGFuZ2VUcmFja2luZ1R5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFuIEFUVFJJQlVURSBjaGFuZ2UgdHJhY2tpbmcgdHlwZSBhbGxvd3MgY2hhbmdlIHRyYWNraW5nIGF0IHRoZQotICAgICAgICAgICAqIGF0dHJpYnV0ZSBsZXZlbCBvZiBhbiBvYmplY3QuIE9iamVjdHMgd2l0aCBjaGFuZ2VkIGF0dHJpYnV0ZXMgd2lsbAotICAgICAgICAgICAqIGJlIHByb2Nlc3NlZCBpbiB0aGUgY29tbWl0IHByb2Nlc3MgdG8gaW5jbHVkZSBhbnkgY2hhbmdlcyBpbiB0aGUgCi0gICAgICAgICAgICogcmVzdWx0cyBvZiB0aGUgY29tbWl0LiBVbmNoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQVRUUklCVVRFLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQW4gT0JKRUNUIGNoYW5nZSB0cmFja2luZyBwb2xpY3kgYWxsb3dzIGFuIG9iamVjdCB0byBjYWxjdWxhdGUgZm9yIAotICAgICAgICAgICAqIGl0c2VsZiB3aGV0aGVyIGl0IGhhcyBjaGFuZ2VkLiBDaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBwcm9jZXNzZWQgaW4gCi0gICAgICAgICAgICogdGhlIGNvbW1pdCBwcm9jZXNzIHRvIGluY2x1ZGUgYW55IGNoYW5nZXMgaW4gdGhlIHJlc3VsdHMgb2YgdGhlIAotICAgICAgICAgICAqIGNvbW1pdC4gVW5jaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIE9CSkVDVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEEgREVGRVJSRUQgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBkZWZlcnMgYWxsIGNoYW5nZSBkZXRlY3Rpb24gdG8KLSAgICAgICAgICAgKiB0aGUgVW5pdE9mV29yaydzIGNoYW5nZSBkZXRlY3Rpb24gcHJvY2Vzcy4gRXNzZW50aWFsbHksIHRoZSAKLSAgICAgICAgICAgKiBjYWxjdWxhdGVDaGFuZ2VzKCkgbWV0aG9kIHdpbGwgcnVuIGZvciBhbGwgb2JqZWN0cyBpbiBhIFVuaXRPZldvcmsuIAotICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgT2JqZWN0Q2hhbmdlUG9saWN5Ci0gICAgICAgICAgICovCi0gICAgICAgICAgREVGRVJSRUQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBXaWxsIG5vdCBzZXQgYW55IGNoYW5nZSB0cmFja2luZyBwb2xpY3kuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQVVUTwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVFRSSUJVVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9CSkVDVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVGRVJSRUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjdXN0b21pemVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ3VzdG9taXplciBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAKLSAgICAgICAgICogdGhlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvbmZpZy5EZXNjcmlwdG9yQ3VzdG9taXplciAKLSAgICAgICAgICogaW50ZXJmYWNlIGFuZCBpcyB0byBydW4gYWdhaW5zdCBhbiBlbmV0aXR5J3MgY2xhc3MgZGVzY3JpcHRvciBhZnRlciBhbGwgCi0gICAgICAgICAqIG1ldGFkYXRhIHByb2Nlc3NpbmcgaGFzIGJlZW4gY29tcGxldGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBUaGUgQ3VzdG9taXplciBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcyAKLSAgICAgICAgICogb3IgRW1iZWRkYWJsZSBjbGFzcy4gSW4gdGhlIGNhc2Ugb2YgaW5oZXJpdGFuY2UsIGEgQ3VzdG9taXplciBpcyBub3QgCi0gICAgICAgICAqIGluaGVyaXRlZCBmcm9tIGl0cyBwYXJlbnQgY2xhc3Nlcy4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ3VzdG9taXplciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBkZXNjcmlwdG9yIGN1c3RvbWl6ZXIgY2xhc3MgdGhhdCAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgYXBwbGllZCBmb3IgdGhlIHJlbGF0ZWQgZW50aXR5IG9yIGVtYmVkZGFibGUgY2xhc3MuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlyZWN0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIGFubm90YXRpb24uCi0gICAgICAgICAqIEl0IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZGlyZWN0aW9uIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlIAotICAgICAgICAgKiBwYXJhbWV0ZXJzIG9mIGEgbmFtZWQgc3RvcmVkIHByb2NlZHVyZSBxdWVyeS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIERpcmVjdGlvbiB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogSW5wdXQgcGFyYW1ldGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgSU4sCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBPdXRwdXQgcGFyYW1ldGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgT1VULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogSW5wdXQgYW5kIG91dHB1dCBwYXJhbWV0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJTl9PVVQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBPdXRwdXQgY3Vyc29yCi0gICAgICAgICAgICovCi0gICAgICAgICAgT1VUX0NVUlNPUgotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VUIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTl9PVVQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVF9DVVJTT1IiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1tYXBwaW5ncyI+Ci0gICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIGVudGl0eS1tYXBwaW5ncyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYW4gbWFwcGluZwotICAgICAgICAgIGZpbGUuIEl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZm91ciB0eXBlcyBvZiBlbGVtZW50czoKLQotICAgICAgICAgIDEuIFRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgY29udGFpbnMgbWV0YWRhdGEKLSAgICAgICAgICBmb3IgdGhlIGVudGlyZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgaWYgdGhpcyBlbGVtZW50Ci0gICAgICAgICAgb2NjdXJzIGluIG11bHRpcGxlIG1hcHBpbmcgZmlsZXMgd2l0aGluIHRoZSBzYW1lIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgICAgICAyLiBUaGUgcGFja2FnZSwgc2NoZW1hLCBjYXRhbG9nIGFuZCBhY2Nlc3MgZWxlbWVudHMgYXBwbHkgdG8gYWxsIG9mCi0gICAgICAgICAgdGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZGVmaW5lZCBpbgotICAgICAgICAgIHRoZSBzYW1lIGZpbGUgaW4gd2hpY2ggdGhleSBvY2N1ci4KLQotICAgICAgICAgIDMuIFRoZSBzZXF1ZW5jZS1nZW5lcmF0b3IsIHRhYmxlLWdlbmVyYXRvciwgbmFtZWQtcXVlcnksCi0gICAgICAgICAgbmFtZWQtbmF0aXZlLXF1ZXJ5IGFuZCBzcWwtcmVzdWx0LXNldC1tYXBwaW5nIGVsZW1lbnRzIGFyZSBnbG9iYWwKLSAgICAgICAgICB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZQotICAgICAgICAgIHNlcXVlbmNlLWdlbmVyYXRvciBvciB0YWJsZS1nZW5lcmF0b3Igb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZQotICAgICAgICAgIG9yIGRpZmZlcmVudCBtYXBwaW5nIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgYWxzbwotICAgICAgICAgIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUgbmFtZWQtcXVlcnksIG5hbWVkLW5hdGl2ZS1xdWVyeSwgb3IKLSAgICAgICAgICByZXN1bHQtc2V0LW1hcHBpbmcgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZSBvciBkaWZmZXJlbnQgbWFwcGluZwotICAgICAgICAgIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICAgIDQuIFRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGVhY2ggZGVmaW5lCi0gICAgICAgICAgdGhlIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIGEgbWFuYWdlZCBwZXJzaXN0ZW50IGNsYXNzLiBUaGUgbWFwcGluZwotICAgICAgICAgIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGVzZSBlbGVtZW50cyBtYXkgYmUgY29tcGxldGUgb3IgaXQgbWF5Ci0gICAgICAgICAgYmUgcGFydGlhbC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIiB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWNrYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJvcm06c3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiIHR5cGU9Im9ybTptYXBwZWQtc3VwZXJjbGFzcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5IiB0eXBlPSJvcm06ZW50aXR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRhYmxlIiB0eXBlPSJvcm06ZW1iZWRkYWJsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvblR5cGUiIGZpeGVkPSIyLjAiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPC94c2Q6ZWxlbWVudD4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImV4aXN0ZW5jZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgRXhpc3RlbmNlQ2hlY2tpbmcgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAqIGNoZWNraW5nIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBlbnRpdGllcy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEFuIGV4aXN0ZW5jZS1jaGVja2luZyBzcGVjaWZpY2F0aW9uIGlzIHN1cHBvcnRlZCBvbiBhbiBFbnRpdHkgb3IgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MgYW5ub3RhdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEV4aXN0ZW5jZUNoZWNraW5nIHsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU2V0IHRoZSBleGlzdGVuY2UgY2hlY2sgZm9yIGRldGVybWluaW5nCi0gICAgICAgICAgICogaWYgYW4gaW5zZXJ0IG9yIHVwZGF0ZSBzaG91bGQgb2NjdXIgZm9yIGFuIG9iamVjdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBFeGlzdGVuY2VUeXBlIHZhbHVlKCkgZGVmYXVsdCBDSEVDS19DQUNIRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBc3N1bWUgdGhhdCBpZiB0aGUgb2JqZWN0cyBwcmltYXJ5IGtleSBkb2VzIG5vdCBpbmNsdWRlIG51bGwgYW5kIAotICAgICAgICAgKiBpdCBpcyBpbiB0aGUgY2FjaGUsIHRoZW4gaXQgbXVzdCBleGlzdC4KLSAgICAgICAgICovCi0gICAgICAgIENIRUNLX0NBQ0hFLAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQZXJmb3JtIGRvZXMgZXhpc3QgY2hlY2sgb24gdGhlIGRhdGFiYXNlLgotICAgICAgICAgKi8KLSAgICAgICAgQ0hFQ0tfREFUQUJBU0UsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCB0aGVuIAotICAgICAgICAgKiBpdCBtdXN0IGV4aXN0LiBUaGlzIG1heSBiZSB1c2VkIGlmIHRoZSBhcHBsaWNhdGlvbiBndWFyYW50ZWVzIG9yIAotICAgICAgICAgKiBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2UgY2hlY2suCi0gICAgICAgICAqLwotICAgICAgICBBU1NVTUVfRVhJU1RFTkNFLAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBc3N1bWUgdGhhdCB0aGUgb2JqZWN0IGRvZXMgbm90IGV4aXN0LiBUaGlzIG1heSBiZSB1c2VkIGlmIHRoZSAKLSAgICAgICAgICogYXBwbGljYXRpb24gZ3VhcmFudGVlcyBvciBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2UgY2hlY2suICAKLSAgICAgICAgICogVGhpcyB3aWxsIGFsd2F5cyBmb3JjZSBhbiBpbnNlcnQgdG8gYmUgY2FsbGVkLgotICAgICAgICAgKi8KLSAgICAgICAgQVNTVU1FX05PTl9FWElTVEVOQ0UKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPiAgICAKLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19DQUNIRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hFQ0tfREFUQUJBU0UiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTU1VNRV9FWElTVEVOQ0UiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTU1VNRV9OT05fRVhJU1RFTkNFIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+IAotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBNZXRhZGF0YSB0aGF0IGFwcGxpZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYW5kIG5vdCBqdXN0IHRvIAotICAgICAgICB0aGUgbWFwcGluZyBmaWxlIGluIHdoaWNoIGl0IGlzIGNvbnRhaW5lZC4gCi0KLSAgICAgICAgSWYgdGhlIHhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIGVsZW1lbnQgaXMgc3BlY2lmaWVkLAotICAgICAgICB0aGUgY29tcGxldGUgc2V0IG9mIG1hcHBpbmcgbWV0YWRhdGEgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGlzIGNvbnRhaW5lZCBpbiB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+ICAgICAgICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZXNlIGRlZmF1bHRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFzIGEgd2hvbGUKLSAgICAgICAgdW5sZXNzIHRoZXkgYXJlIG92ZXJyaWRkZW4gYnkgbG9jYWwgYW5ub3RhdGlvbiBvciBYTUwKLSAgICAgICAgZWxlbWVudCBzZXR0aW5ncy4KLQotICAgICAgICBzY2hlbWEgLSBVc2VkIGFzIHRoZSBzY2hlbWEgZm9yIGFsbCB0YWJsZXMsIHNlY29uZGFyeSB0YWJsZXMsCi0gICAgICAgICAgICBjb2xsZWN0aW9uIHRhYmxlcywgc2VxdWVuY2UgZ2VuZXJhdG9ycywgYW5kIHRhYmxlIGdlbmVyYXRvcnMKLSAgICAgICAgICAgIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2F0YWxvZyAtIFVzZWQgYXMgdGhlIGNhdGFsb2cgZm9yIGFsbCB0YWJsZXMsIHNlY29uZGFyeSB0YWJsZXMsCi0gICAgICAgICAgICBjb2xsZWN0aW9uIHRhYmxlcywgc2VxdWVuY2UgZ2VuZXJhdG9ycywgYW5kIHRhYmxlIGdlbmVyYXRvcnMKLSAgICAgICAgICAgIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgYWNjZXNzIC0gVXNlZCBhcyB0aGUgYWNjZXNzIHR5cGUgZm9yIGFsbCBtYW5hZ2VkIGNsYXNzZXMgaW4KLSAgICAgICAgICAgIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGNhc2NhZGUtcGVyc2lzdCAtIEFkZHMgY2FzY2FkZS1wZXJzaXN0IHRvIHRoZSBzZXQgb2YgY2FzY2FkZSBvcHRpb25zCi0gICAgICAgICAgICBpbiBhbGwgZW50aXR5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgZW50aXR5LWxpc3RlbmVycyAtIExpc3Qgb2YgZGVmYXVsdCBlbnRpdHkgbGlzdGVuZXJzIHRvIGJlIGludm9rZWQKLSAgICAgICAgICAgIG9uIGVhY2ggZW50aXR5IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWxpbWl0ZWQtaWRlbnRpZmllcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhbiBlbnRpdHkuIElzIGFsbG93ZWQgdG8gYmUKLSAgICAgICAgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGFubm90YXRpb25zLgotICAgICAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvCi0gICAgICAgIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgb24gdGhlIGVudGl0eSBjbGFzcyAoYW5kIGl0cyBmaWVsZHMKLSAgICAgICAgb3IgcHJvcGVydGllcykgYXJlIHRvIGJlIHByb2Nlc3NlZC4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuCi0gICAgICAgIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIGZvciB0aGUgZW50aXR5IGFuZCBpdHMgc3ViLWVsZW1lbnRzIHdpbGwKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUiIHR5cGU9Im9ybTp0YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIiB0eXBlPSJvcm06c2Vjb25kYXJ5LXRhYmxlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5IiB0eXBlPSJvcm06cHJpbWFyeS1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaGVyaXRhbmNlIiB0eXBlPSJvcm06aW5oZXJpdGFuY2UiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlIiB0eXBlPSJvcm06Y2FjaGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlLWludGVyY2VwdG9yIiB0eXBlPSJvcm06Y2FjaGUtaW50ZXJjZXB0b3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeS1yZWRpcmVjdG9ycyIgdHlwZT0ib3JtOnF1ZXJ5LXJlZGlyZWN0b3JzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNraW5nIiB0eXBlPSJvcm06ZXhpc3RlbmNlLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iYWNjZXNzLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgZGV0ZXJtaW5lcyBob3cgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIGFjY2Vzc2VzIHRoZQotICAgICAgICBzdGF0ZSBvZiBhbiBlbnRpdHkgb3IgZW1iZWRkZWQgb2JqZWN0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPUEVSVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBc3NvY2lhdGlvbk92ZXJyaWRlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpIGRlZmF1bHR7fTsKLSAgICAgICAgICBKb2luVGFibGUgam9pblRhYmxlKCkgZGVmYXVsdCBASm9pblRhYmxlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXR0cmlidXRlT3ZlcnJpZGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgQ29sdW1uIGNvbHVtbigpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZXMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgY29udGFpbnMgdGhlIGVudGl0eSBmaWVsZCBvciBwcm9wZXJ0eSBtYXBwaW5ncy4KLSAgICAgICAgSXQgbWF5IGJlIHNwYXJzZWx5IHBvcHVsYXRlZCB0byBpbmNsdWRlIG9ubHkgYSBzdWJzZXQgb2YgdGhlCi0gICAgICAgIGZpZWxkcyBvciBwcm9wZXJ0aWVzLiBJZiBtZXRhZGF0YS1jb21wbGV0ZSBmb3IgdGhlIGVudGl0eSBpcyB0cnVlCi0gICAgICAgIHRoZW4gdGhlIHJlbWFpbmRlciBvZiB0aGUgYXR0cmlidXRlcyB3aWxsIGJlIGRlZmF1bHRlZCBhY2NvcmRpbmcKLSAgICAgICAgdG8gdGhlIGRlZmF1bHQgcnVsZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9Im9ybTppZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQtaWQiIHR5cGU9Im9ybTplbWJlZGRlZC1pZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMiIHR5cGU9Im9ybTpiYXNpYyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljLWNvbGxlY3Rpb24iIHR5cGU9Im9ybTpiYXNpYy1jb2xsZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMtbWFwIiB0eXBlPSJvcm06YmFzaWMtbWFwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW9uZSIgdHlwZT0ib3JtOm1hbnktdG8tb25lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW1hbnkiIHR5cGU9Im9ybTpvbmUtdG8tbWFueSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1vbmUiIHR5cGU9Im9ybTpvbmUtdG8tb25lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZSIgdHlwZT0ib3JtOnZhcmlhYmxlLW9uZS10by1vbmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW1hbnkiIHR5cGU9Im9ybTptYW55LXRvLW1hbnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbGVtZW50LWNvbGxlY3Rpb24iIHR5cGU9Im9ybTplbGVtZW50LWNvbGxlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQiIHR5cGU9Im9ybTplbWJlZGRlZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zZm9ybWF0aW9uIiB0eXBlPSJvcm06dHJhbnNmb3JtYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2llbnQiIHR5cGU9Im9ybTp0cmFuc2llbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpYyB7Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiIHR5cGU9Im9ybTpsb2IiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljLWNvbGxlY3Rpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpY0NvbGxlY3Rpb24gewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCi0gICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCi0gICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAotICAgICAgICAgICAqIExBWlkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOyAKLSAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSB2YWx1ZSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IAotICAgICAgICAgICAqIGNvbGxlY3Rpb24gZGF0YS4gRGVmYXVsdHMgdG8gdGhlIHByb3BlcnR5IG9yIGZpZWxkIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uIHZhbHVlQ29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sbGVjdGlvbi10YWJsZSIgdHlwZT0ib3JtOmVjbGlwc2VsaW5rLWNvbGxlY3Rpb24tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYy1tYXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpY01hcCB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgdGhhdCAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgaGludCB0byAKLSAgICAgICAgICAgKiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gCi0gICAgICAgICAgICogTEFaWS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgbWFwIAotICAgICAgICAgICAqIGtleS4gSWYgdGhlIG5hbWUgb24gdGUga2V5IGNvbHVtbiBpcyAiIiwgdGhlIG5hbWUgd2lsbCBkZWZhdWx0IHRvOgotICAgICAgICAgICAqIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvciBmaWVsZDsgIl9LRVkiLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbiBrZXlDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIGtleSBjb252ZXJ0ZXIuIERlZmF1bHQgaXMgZXF1aXZhbGVudCB0byAKLSAgICAgICAgICAgKiBzcGVjaWZ5aW5nIEBDb252ZXJ0KCJub25lIiksIG1lYW5pbmcgbm8gY29udmVydGVyIHdpbGwgYmUgYWRkZWQgdG8gCi0gICAgICAgICAgICogdGhlIGRpcmVjdCBtYXAga2V5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnQga2V5Q29udmVydGVyKCkgZGVmYXVsdCBAQ29udmVydDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGRhdGEgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCAKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGRhdGEuIERlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBvciBmaWVsZCBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbiB2YWx1ZUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdmFsdWUgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBjb2x1bW4gbWFwcGluZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJ0IHZhbHVlQ29udmVydGVyKCkgZGVmYXVsdCBAQ29udmVydDsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJrZXktY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJrZXktY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4gICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjIiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+ICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTplY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FzY2FkZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gQ2FzY2FkZVR5cGUgeyBBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0h9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWFsbCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW1lcmdlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXJlbW92ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZWZyZXNoIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQ2xvbmVDb3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNsb25lQ29weVBvbGljeSBvbiBhbiAKLSAgICAgICAgICogRW50aXR5LiBBIENsb25lQ29weVBvbGljeSBtdXN0IHNwZWNpZnkgYXQgb25lIG9yIGJvdGggb2YgdGhlICJtZXRob2QiIAotICAgICAgICAgKiBvciAid29ya2luZ0NvcHlNZXRob2QiLiAid29ya2luZ0NvcHlNZXRob2QiIGlzIHVzZWQgdG8gY2xvbmUgb2JqZWN0cyAKLSAgICAgICAgICogdGhhdCB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSB1c2VyIGFzIHRoZXkgYXJlIHJlZ2lzdGVyZWQgaW4gCi0gICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgdHJhbnNhY3Rpb25hbCBtZWNoYW5pc20sIHRoZSBVbml0T2ZXb3JrLiAibWV0aG9kIiB3aWxsIAotICAgICAgICAgKiBiZSB1c2VkIGZvciB0aGUgY2xvbmUgdGhhdCBpcyB1c2VkIGZvciBjb21wYXJpc29uIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgRGVmZXJyZWRDaGFuZ2VEZXRlY3Rpb25Qb2xpY3kKLSAgICAgICAgICogIAotICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcwotICAgICAgICAgKiBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogRXhhbXBsZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KG1ldGhvZD0ibXlDbG9uZU1ldGhvZCIpCi0gICAgICAgICAqIAotICAgICAgICAgKiBvcjoKLSAgICAgICAgICogCi0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiLCB3b3JraW5nQ29weU1ldGhvZD0ibXlXb3JraW5nQ29weUNsb25lTWV0aG9kIikKLSAgICAgICAgICogCi0gICAgICAgICAqIG9yOgotICAgICAgICAgKiAKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KHdvcmtpbmdDb3B5TWV0aG9kTmFtZT0ibXlXb3JraW5nQ29weUNsb25lIikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENsb25lQ29weVBvbGljeSB7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCB0aGlzIGRlZmluZXMgCi0gICAgICAgICAgICAgKiBhIG1ldGhvZCB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBjbG9uZSB0aGF0IHdpbGwgYmUgdXNlZCAKLSAgICAgICAgICAgICAqIGZvciBjb21wYXJpc29uIGJ5Ci0gICAgICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpCi0gICAgICAgICAgICAgKiBFaXRoZXIgbWV0aG9kIG9yIHdvcmtpbmdDb3B5TWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkCi0gICAgICAgICAgICAgKiB0aGlzIGRlZmluZXMgYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCAKLSAgICAgICAgICAgICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG9iamVjdCByZXR1cm5lZCB3aGVuIHJlZ2lzdGVyaW5nIGFuIAotICAgICAgICAgICAgICogT2JqZWN0IGluIGFuIEVjbGlwc2VMaW5rIFVuaXRPZldvcmsKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIHdvcmtpbmdDb3B5TWV0aG9kKCk7Ci0KLSAgICAgICAgfQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IndvcmtpbmctY29weS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sbGVjdGlvbi10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbGxlY3Rpb25UYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVjbGlwc2VsaW5rLWNvbGxlY3Rpb24tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2xsZWN0aW9uVGFibGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGFibGUuIElmIGl0IGlzIG5vdCAKLSAgICAgICAgICAgKiBzcGVjaWZpZWQsIGl0IGlzIGRlZmF1bHRlZCB0byB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nOiAKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGVudGl0eTsgIl8iIDsgdGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCAKLSAgICAgICAgICAgKiBwcm9wZXJ0eSBvciBmaWVsZCBvZiB0aGUgc291cmNlIGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgY2F0YWxvZyBvZiB0aGUgdGFibGUuIEl0IGRlZmF1bHRzIHRvIHRoZSBwZXJzaXN0ZW5jZSAKLSAgICAgICAgICAgKiB1bml0IGRlZmF1bHQgY2F0YWxvZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgc2NoZW1hIG9mIHRoZSB0YWJsZS4gSXQgZGVmYXVsdHMgdG8gdGhlIHBlcnNpc3RlbmNlIAotICAgICAgICAgICAqIHVuaXQgZGVmYXVsdCBzY2hlbWEuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVc2VkIHRvIHNwZWNpZnkgYSBwcmltYXJ5IGtleSBjb2x1bW4gdGhhdCBpcyB1c2VkIGFzIGEgCi0gICAgICAgICAgICogZm9yZWlnbiBrZXkgdG8gam9pbiB0byBhbm90aGVyIHRhYmxlLiBJZiB0aGUgc291cmNlIGVudGl0eSB1c2VzIGEgCi0gICAgICAgICAgICogY29tcG9zaXRlIHByaW1hcnkga2V5LCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG11c3QgYmUgc3BlY2lmaWVkIAotICAgICAgICAgICAqIGZvciBlYWNoIGZpZWxkIG9mIHRoZSBjb21wb3NpdGUgcHJpbWFyeSBrZXkuIEluIGEgc2luZ2xlIHByaW1hcnkgCi0gICAgICAgICAgICoga2V5IGNhc2UsIGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gbWF5IG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkLiAKLSAgICAgICAgICAgKiBEZWZhdWx0aW5nIHdpbGwgYXBwbHkgb3RoZXJ3aXNlIGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICogbmFtZSwgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSBwcmltYXJ5IHRhYmxlIAotICAgICAgICAgICAqIG9mIHRoZSBzb3VyY2UgZW50aXR5LiByZWZlcmVuY2VkQ29sdW1uTmFtZSwgdGhlIHNhbWUgbmFtZSBvZiAKLSAgICAgICAgICAgKiBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlIHByaW1hcnkgdGFibGUgb2YgdGhlIHNvdXJjZSBlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OyAKLSAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVuaXF1ZSBjb25zdHJhaW50cyB0aGF0IGFyZSB0byBiZSBwbGFjZWQgb24gdGhlIHRhYmxlLiAKLSAgICAgICAgICAgKiBUaGVzZSBhcmUgb25seSB1c2VkIGlmIHRhYmxlIGdlbmVyYXRpb24gaXMgaW4gZWZmZWN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307IAotICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OwotICAgICAgICAgIGludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgcHJlY2lzaW9uCi0gICAgICAgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnZlcnNpb24tdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbnZlcnNpb25WYWx1ZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBkYXRhYmFzZSB2YWx1ZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgZGF0YVZhbHVlKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIG9iamVjdCB2YWx1ZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgb2JqZWN0VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9iamVjdC12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgCi0gICAgICAgICAgICogdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNvbnZlcnRlciBjbGFzcyB0byBiZSB1c2VkLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50Ci0gICAgICAgICAgICogdGhlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLmNvbnZlcnRlcnMuQ29udmVydGVyIGludGVyZmFjZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBjb252ZXJ0ZXJDbGFzcygpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbHVtbi1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbHVtblJlc3VsdCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogQSBDb3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGEgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ29weVBvbGljeSBvbiBhbiBFbnRpdHkuCi0gICAgICAgICAqIEl0IGlzIHJlcXVpcmVkIHRoYXQgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ29weVBvbGljeSBiZSBzcGVjaWZpZWQgCi0gICAgICAgICAqIGFzIHRoZSBhcmd1bWVudC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEEgQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcyBvciAKLSAgICAgICAgICogRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEZvciBpbnN0YW5jZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ29weVBvbGljeSgiZXhhbXBsZS5NeUNvcHlQb2xpY3kiKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29weVBvbGljeSB7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgKiAoUmVxdWlyZWQpCi0gICAgICAgICogVGhpcyBkZWZpbmVzIHRoZSBjbGFzcyBvZiB0aGUgY29weSBwb2xpY3kuIEl0IG11c3Qgc3BlY2lmeSBhIGNsYXNzIAotICAgICAgICAqIHRoYXQgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kKLSAgICAgICAgKi8KLSAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIkRUWVBFIjsKLSAgICAgICAgICBEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSgpIGRlZmF1bHQgU1RSSU5HOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAzMTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgRGlzY3JpbWluYXRvckNsYXNzIGlzIHVzZWQgd2l0aGluIGEgVmFyaWFibGVPbmVUb09uZSBhbm5vdGF0aW9uLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe30pIAotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JDbGFzcyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgZGlzY3JpbWluYXRvciB0byBiZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlLiAKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvcigpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY2xhc3MgdG8gdGhlIGluc3RhbnRpYXRlZCB3aXRoIHRoZSBnaXZlbiAKLSAgICAgICAgICAgKiBkaXNjcmltaW5hdG9yLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3IiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIERpc2NyaW1pbmF0b3JUeXBlIHsgU1RSSU5HLCBDSEFSLCBJTlRFR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQVIiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVEVHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yVmFsdWUgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRWxlbWVudENvbGxlY3Rpb24gewotICAgICAgICAgIENsYXNzIHRhcmdldENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1jb2x1bW4iIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktZW51bWVyYXRlZCIgdHlwZT0ib3JtOmVudW1lcmF0ZWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIgdHlwZT0ib3JtOmxvYiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTpjb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkYWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgZW1iZWRkYWJsZSBvYmplY3RzLiBJcwotICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCi0gICAgICAgIHRoZSBhbm5vdGF0aW9ucy4gQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZQotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQKLSAgICAgICAgaW4gdGhlIGNsYXNzLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGRlZmF1bHRpbmcgcnVsZXMgd2lsbAotICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGFibGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRlZC1pZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGVkSWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgYW4gZW50aXR5IGxpc3RlbmVyIHRvIGJlIGludm9rZWQgYXQgbGlmZWN5Y2xlIGV2ZW50cwotICAgICAgICBmb3IgdGhlIGVudGl0aWVzIHRoYXQgbGlzdCB0aGlzIGxpc3RlbmVyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWxpc3RlbmVycyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eUxpc3RlbmVycyB7Ci0gICAgICAgICAgQ2xhc3NbXSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lciIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlSZXN1bHQgewotICAgICAgICAgIENsYXNzIGVudGl0eUNsYXNzKCk7Ci0gICAgICAgICAgRmllbGRSZXN1bHRbXSBmaWVsZHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFN0cmluZyBkaXNjcmltaW5hdG9yQ29sdW1uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZC1yZXN1bHQiIHR5cGU9Im9ybTpmaWVsZC1yZXN1bHQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJlbnRpdHktY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW0tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEVudW1UeXBlIHsKLSAgICAgICAgICBPUkRJTkFMLAotICAgICAgICAgIFNUUklORwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUkRJTkFMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW1lcmF0ZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnVtZXJhdGVkIHsKLSAgICAgICAgICBFbnVtVHlwZSB2YWx1ZSgpIGRlZmF1bHQgT1JESU5BTDsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJvcm06ZW51bS10eXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRmV0Y2hUeXBlIHsgTEFaWSwgRUFHRVIgfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxBWlkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVBR0VSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQtcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGaWVsZFJlc3VsdCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgR2VuZXJhdGVkVmFsdWUgewotICAgICAgICAgIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBBVVRPOwotICAgICAgICAgIFN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmdlbmVyYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImdlbmVyYXRpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEdlbmVyYXRpb25UeXBlIHsgVEFCTEUsIFNFUVVFTkNFLCBJREVOVElUWSwgQVVUTyB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFUVVFTkNFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJREVOVElUWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiIHR5cGU9Im9ybTpnZW5lcmF0ZWQtdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQtY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZENsYXNzIHsKLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImlkLXZhbGlkYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBJZFZhbGlkYXRpb24gZW51bSBkZXRlcm1pbmVzIHRoZSB0eXBlIHZhbHVlIHRoYXQgYXJlIHZhbGlkIGZvciBhbiBJZC4KLSAgICAgICAgICogQnkgZGVmYXVsdCBudWxsIGlzIG5vdCBhbGxvd2VkLCBhbmQgMCBpcyBub3QgYWxsb3cgZm9yIHNpbmdsZXRvbiBpZHMgb2YgbG9uZyBvciBpbnQgdHlwZS4KLSAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgWkVSTyBmb3Igc2luZ2xldG9uIGlkcywgYW5kIE5VTEwgZm9yIGNvbXBvc2l0ZSBpZHMuCi0gICAgICAgICAqIFRoaXMgY2FuIGJlIHNldCB1c2luZyB0aGUgQFByaW1hcnlLZXkgYW5ub3RhdGlvbiwgb3IgQ2xhc3NEZXNjcmlwdG9yIEFQSS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgUHJpbWFyeUtleQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLkNsYXNzRGVzY3JpcHRvciNzZXRJZFZhbGlkYXRpb24oSWRWYWxpZGF0aW9uKQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMCAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBJZFZhbGlkYXRpb24gewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBPbmx5IG51bGwgaXMgbm90IGFsbG93ZWQgYXMgYW4gaWQgdmFsdWUsIDAgaXMgYWxsb3dlZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTlVMTCwKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBudWxsIGFuZCAwIGFyZSBub3QgYWxsb3dlZCwgKG9ubHkgaW50IGFuZCBsb25nKS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgWkVSTywKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBObyBpZCB2YWxpZGF0aW9uIGlzIGRvbmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVUxMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaRVJPIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmhlcml0YW5jZSB7Ci0gICAgICAgICAgSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBTSU5HTEVfVEFCTEU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06aW5oZXJpdGFuY2UtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUgeyBTSU5HTEVfVEFCTEUsIEpPSU5FRCwgVEFCTEVfUEVSX0NMQVNTIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSU5HTEVfVEFCTEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPSU5FRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEVfUEVSX0NMQVNTIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogQW4gSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgCi0gICAgICAgICAqIG9uIGFuIEVudGl0eS4gSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgaXMgdGhlIGRlZmF1bHQgQ29weVBvbGljeSBpbiAKLSAgICAgICAgICogRWNsaXBzZUxpbmsgYW5kIHRoZXJlZm9yZSB0aGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGlzIG9ubHkgdXNlZCB0byAKLSAgICAgICAgICogb3ZlcnJpZGUgb3RoZXIgdHlwZXMgb2YgY29weSBwb2xpY2llcwotICAgICAgICAgKiAKLSAgICAgICAgICogQW4gSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIG9yIEVtYmVkZGFibGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBFeGFtcGxlOgotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBJbnN0YW50aWF0aW9uQ29weVBvbGljeSAKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IHsKLSAgICAgICAgfQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5Db2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEpvaW5GZXRjaFR5cGUgewotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBkb2VzIG5vdCBhbGxvdyBmb3IgbnVsbC9lbXB0eSB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBJTk5FUiwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBhbGxvd3MgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgotICAgICAgICAgKi8KLSAgICAgICAgT1VURVIsCi0gICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTk5FUiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VURVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pblRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGludmVyc2VKb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW52ZXJzZS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvYiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIExvYiB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9jay1tb2RlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgcHVibGljIGVudW0gTG9ja01vZGVUeXBlIHsgUkVBRCwgV1JJVEUsIE9QVElNSVNUSUMsCi0gICAgICAgIE9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5ULCBQRVNTSU1JU1RJQ19SRUFELCBQRVNTSU1JU1RJQ19XUklURSwKLSAgICAgICAgUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5ULCBOT05FfTsKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRUFEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXUklURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU1JU1RJQyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFU1NJTUlTVElDX1JFQUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFU1NJTUlTVElDX1dSSVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWNvbHVtbiIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jbGFzcyIgdHlwZT0ib3JtOm1hcC1rZXktY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktdGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1lbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hbnlUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHMtaWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlDbGFzcyB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleS1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgotICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5Sm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYSBtYXBwZWQgc3VwZXJjbGFzcy4gSXMKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUKLSAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkCi0gICAgICAgIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5Ci0gICAgICAgIGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcHBlZFN1cGVyY2xhc3N7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXkiIHR5cGU9Im9ybTpwcmltYXJ5LWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZSIgdHlwZT0ib3JtOmNhY2hlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZS1pbnRlcmNlcHRvciIgdHlwZT0ib3JtOmNhY2hlLWludGVyY2VwdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNraW5nIiB0eXBlPSJvcm06ZXhpc3RlbmNlLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkTmF0aXZlUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsgLy9uYW1lZCBTcWxSZXN1bHRTZXRNYXBwaW5nCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jay1tb2RlIiB0eXBlPSJvcm06bG9jay1tb2RlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbiBhbGxvd3MgdGhlIGRlZmluaXRpb24gb2YgCi0gICAgICAgICAqIHF1ZXJpZXMgdGhhdCBjYWxsIHN0b3JlZCBwcm9jZWR1cmVzIGFzIG5hbWVkIHF1ZXJpZXMuCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvcgotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFVuaXF1ZSBuYW1lIHRoYXQgcmVmZXJlbmNlcyB0aGlzIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgUXVlcnkgaGludHMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBSZWZlcnMgdG8gdGhlIGNsYXNzIG9mIHRoZSByZXN1bHQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBTUUxSZXN1bHRNYXBwaW5nLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIG5hbWUgb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHByb2NlZHVyZU5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgV2hldGhlciB0aGUgcXVlcnkgc2hvdWxkIHJldHVybiBhIHJlc3VsdCBzZXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiByZXR1cm5zUmVzdWx0U2V0KCkgZGVmYXVsdCB0cnVlOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyBhcmd1bWVudHMgdG8gdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyW10gcGFyYW1ldGVycygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiIHR5cGU9Im9ybTpzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJldHVybnMtcmVzdWx0LXNldCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT2JqZWN0VHlwZUNvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlCi0gICAgICAgICAgICogYWNyb3NzIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgCi0gICAgICAgICAgICogZmllbGQgb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgY29udmVyc2lvbiB2YWx1ZXMgdG8gYmUgdXNlZCAKLSAgICAgICAgICAgKiB3aXRoIHRoZSBvYmplY3QgY29udmVydGVyLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnNpb25WYWx1ZVtdIGNvbnZlcnNpb25WYWx1ZXMoKTsKLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IGEgZGVmYXVsdCBvYmplY3QgdmFsdWUuIFVzZWQgZm9yIAotICAgICAgICAgICAgKiBsZWdhY3kgZGF0YSBpZiB0aGUgZGF0YSB2YWx1ZSBpcyBtaXNzaW5nLgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnNpb24tdmFsdWUiIHR5cGU9Im9ybTpjb252ZXJzaW9uLXZhbHVlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1vYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNsYXNzIiB0eXBlPSJvcm06bWFwLWtleS1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICA8eHNkOmNob2ljZT4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgIDwveHNkOmNob2ljZT4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JwaGFuLXJlbW92YWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBvcnBoYW5SZW1vdmFsKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBzLWlkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gb3B0aW1pc3RpYy1sb2NraW5nIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIAotICAgICAgICAgKiBvcHRpbWlzdGljIGxvY2tpbmcgRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIG9yIGRlbGV0aW5nIAotICAgICAgICAgKiBlbnRpdGllcy4gQW4gb3B0aW1pc3RpYy1sb2NraW5nIHNwZWNpZmljYXRpb24gaXMgc3VwcG9ydGVkIG9uCi0gICAgICAgICAqIGFuIGVudGl0eSBvciBtYXBwZWQtc3VwZXJjbGFzcy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEl0IGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgb3B0aW1pc3RpYy1sb2NraW5nLXR5cGUuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3B0aW1pc3RpY0xvY2tpbmcgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2Ygb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSB0byB1c2UuCi0gICAgICAgICAgICovCi0gICAgICAgICAgT3B0aW1pc3RpY0xvY2tpbmdUeXBlIHR5cGUoKSBkZWZhdWx0IFZFUlNJT05fQ09MVU1OOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBGb3IgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBvZiB0eXBlIAotICAgICAgICAgICAqIFNFTEVDVEVEX0NPTFVNTlMsIHRoaXMgYW5ub3RhdGlvbiBtZW1iZXIgYmVjb21lcyBhIChSZXF1aXJlZCkgCi0gICAgICAgICAgICogZmllbGQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uW10gc2VsZWN0ZWRDb2x1bW5zKCkgZGVmYXVsdCB7fTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB3aGVyZSB0aGUgb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBzaG91bGQgCi0gICAgICAgICAgICogY2FzY2FkZSBsb2NrLiBDdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgd2l0aCBWRVJTSU9OX0NPTFVNTiBsb2NraW5nLgotICAgICAgICAgICAqLwotICAgICAgICAgIGJvb2xlYW4gY2FzY2FkZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VsZWN0ZWQtY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgIAotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmctdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhc2NhZGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgc2ltcGxlIHR5cGUgdGhhdCBpcyB1c2VkIHdpdGhpbiBhbiBvcHRpbWlzdGljLWxvY2tpbmcgCi0gICAgICAgICAqIHNwZWNpZmljYXRpb24gdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBvcHRpbWlzdGljLWxvY2tpbmcgdGhhdAotICAgICAgICAgKiBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgZW50aXRpZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZW51bSBPcHRpbWlzdGljTG9ja2luZ1R5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIHBvbGljeSBjb21wYXJlcyBldmVyeSBmaWVsZCBpbiB0aGUgdGFibGUKLSAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQKLSAgICAgICAgICAgKiBoYXMgYmVlbiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAgICAgICAqLwotICAgICAgICAgIEFMTF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIG9ubHkgdGhlIGNoYW5nZWQgZmllbGRzCi0gICAgICAgICAgICogaW4gdGhlIFdIRVJFIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gSWYgYW55IGZpZWxkIGhhcyBiZWVuCi0gICAgICAgICAgICogY2hhbmdlZCwgYW4gb3B0aW1pc3RpYyBsb2NraW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gQSBkZWxldGUKLSAgICAgICAgICAgKiB3aWxsIG9ubHkgY29tcGFyZSB0aGUgcHJpbWFyeSBrZXkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ0hBTkdFRF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgY29tcGFyZXMgc2VsZWN0ZWQgZmllbGRzIGluIHRoZSBXSEVSRQotICAgICAgICAgICAqIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZSBvciBhIGRlbGV0ZS4gSWYgYW55IGZpZWxkIGhhcyBiZWVuCi0gICAgICAgICAgICogY2hhbmdlZCwgYW4gb3B0aW1pc3RpYyBsb2NraW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gTm90ZSB0aGF0Ci0gICAgICAgICAgICogdGhlIGZpZWxkcyBzcGVjaWZpZWQgbXVzdCBiZSBtYXBwZWQgYW5kIG5vdCBiZSBwcmltYXJ5IGtleXMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU0VMRUNURURfQ09MVU1OUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIHBvbGljeSBjb21wYXJlcyBhIHNpbmdsZSB2ZXJzaW9uIG51bWJlcgotICAgICAgICAgICAqIGluIHRoZSB3aGVyZSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUuIFRoZSB2ZXJzaW9uIGZpZWxkIG11c3QgYmUKLSAgICAgICAgICAgKiBtYXBwZWQgYW5kIG5vdCBiZSB0aGUgcHJpbWFyeSBrZXkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgVkVSU0lPTl9DT0xVTU4KLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTExfQ09MVU1OUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBTkdFRF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRUxFQ1RFRF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWRVJTSU9OX0NPTFVNTiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPiAgCi0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcmRlci1ieSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQnkgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9yZGVyLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb3JyZWN0aW9uLXR5cGUiIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4tY29ycmVjdGlvbi10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3JkZXItY29sdW1uLWNvcnJlY3Rpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIE9yZGVyQ29ycmVjdGlvblR5cGUgewotICAgICAgICAgIFJFQUQsCi0gICAgICAgICAgUkVBRF9XUklURSwKLSAgICAgICAgICBFWENFUFRJT04KLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVBRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVBRF9XUklURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVhDRVBUSU9OIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1sb2FkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0TG9hZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RSZW1vdmUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtdXBkYXRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0VXBkYXRlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcGVyc2lzdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXJlbW92ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtdXBkYXRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBUaGUgUHJpbWFyeUtleSBhbm5vdGF0aW9uIGFsbG93cyBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9mIHRoZSBJZC4KLSAgICAgICAgICogIEEgdmFsaWRhdGlvbiBwb2xpY3kgY2FuIGJlIGdpdmVuIHRoYXQgYWxsb3dzIHNwZWNpZnlpbmcgaWYgemVybyBpcyBhIHZhbGlkIGlkIHZhbHVlLgotICAgICAgICAgKiAgVGhlIHNldCBvZiBwcmltYXJ5IGtleSBjb2x1bW5zIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBwcmVjaXNlbHkuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMQotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJpbWFyeUtleSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgaWQgdmFsaWRhdGlvbiBpcyBkb25lLgotICAgICAgICAgICAqIEJ5IGRlZmF1bHQgMCBpcyBub3QgYSB2YWxpZCBpZCB2YWx1ZSwgdGhpcyBjYW4gYmUgdXNlZCB0byBhbGxvdyAwIGlkIHZhbHVlcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJZFZhbGlkYXRpb24gdmFsaWRhdGlvbigpIGRlZmF1bHQgSWRWYWxpZGF0aW9uLlpFUk87IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVc2VkIHRvIHNwZWNpZnkgdGhlIHByaW1hcnkga2V5IGNvbHVtbnMgZGlyZWN0bHkuCi0gICAgICAgICAgICogVGhpcyBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIEBJZCBpZiB0aGUgcHJpbWFyeSBrZXkgaW5jbHVkZXMgYSBub24gYmFzaWMgZmllbGQsCi0gICAgICAgICAgICogc3VjaCBhcyBhIGZvcmVpZ24ga2V5LCBvciBhIGluaGVyaXRhbmNlIGRpc2NyaW1pbmF0b3IsIGVtYmVkZGVkLCBvciB0cmFuc2Zvcm1hdGlvbiBtYXBwZWQgZmllbGQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uW10gY29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgIAotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRpb24iIHR5cGU9Im9ybTppZC12YWxpZGF0aW9uIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJpbWFyeUtleUpvaW5Db2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEEgdXNlciBkZWZpbmVkIG1hcHBpbmcncyBwcm9wZXJ0eS4KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgVFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJvcGVydHkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFByb3BlcnR5IG5hbWUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgUHJvcGVydHkgdmFsdWUsCi0gICAgICAgICAgICogY29udmVydGVkIHRvIGFuIGluc3RhbmNlIG9mIHZhbHVlVHlwZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBQcm9wZXJ0eSB2YWx1ZSB0eXBlLgotICAgICAgICAgICAqIFRoZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gdmFsdWVUeXBlIGJ5IENvbnZlcnNpb25NYW5hZ2VyLgotICAgICAgICAgICAqIElmIHNwZWNpZmllZCBtdXN0IGJlIGEgc2ltcGxlIHR5cGUgdGhhdCBjb3VsZCBiZSBoYW5kbGVkIGJ5IAotICAgICAgICAgICAqIENvbnZlcnNpb25NYW5hZ2VyOiAKLSAgICAgICAgICAgKiBudW1lcmljYWwsIGJvb2xlYW4sIHRlbXBvcmFsLiAgCi0gICAgICAgICAgICovIAotICAgICAgICAgIENsYXNzIHZhbHVlVHlwZSgpIGRlZmF1bHQgU3RyaW5nLmNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWhpbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFF1ZXJ5SGludCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LXJlZGlyZWN0b3JzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLUBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi1wdWJsaWMgQGludGVyZmFjZSBRdWVyeVJlZGlyZWN0b3JzIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIEFsbFF1ZXJpZXMgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZyBvYmplY3QgcXVlcnkKLSAgICAgKiB0aGF0IGRvZXMgbm90IGhhdmUgYSBtb3JlIHByZWNpc2UgcmVkaXJlY3RvciAobGlrZSB0aGUgCi0gICAgICogUmVhZE9iamVjdFF1ZXJ5IFJlZGlyZWN0b3IpIG9yIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAqIFF1ZXJ5IHJlZGlyZWN0b3JzIGFsbG93IHRoZSB1c2VyIHRvIGludGVyY2VwdCBxdWVyeSBleGVjdXRpb24gcHJldmVudGluZwotICAgICAqIGl0IG9yIGFsdGVybmF0ZWx5IHBlcmZvcm1pbmcgc29tZSBzaWRlIGVmZmVjdCBsaWtlIGF1ZGl0aW5nLgotICAgICAqIAotICAgICAqLwotICAgIENsYXNzIGFsbFF1ZXJpZXMoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFJlYWRBbGwgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIFJlYWRBbGxRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogRm9yIHVzZXJzIGV4ZWN1dGluZyBhIEpQQSBRdWVyeSB0aHJvdWdoIHRoZSBnZXRSZXN1bHRMaXN0KCkgQVBJIHRoaXMgaXMgdGhlIHJlZGlyZWN0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQKLSAgICAgKi8KLSAgICBDbGFzcyByZWFkQWxsKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgIAotICAgIC8qKgotICAgICAqIEEgRGVmYXVsdCBSZWFkT2JqZWN0IFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBSZWFkT2JqZWN0UXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAqIFF1ZXJ5IHJlZGlyZWN0b3JzIGFsbG93IHRoZSB1c2VyIHRvIGludGVyY2VwdCBxdWVyeSBleGVjdXRpb24gcHJldmVudGluZwotICAgICAqIGl0IG9yIGFsdGVybmF0ZWx5IHBlcmZvcm1pbmcgc29tZSBzaWRlIGVmZmVjdCBsaWtlIGF1ZGl0aW5nLgotICAgICAqIEZvciB1c2VycyBleGVjdXRpbmcgYSBKUEEgUXVlcnkgdGhyb3VnaCB0aGUgZ2V0U2luZ2xlUmVzdWx0KCkgQVBJIG9yIEVudGl0eU1hbmFnZXIuZmluZCgpIHRoaXMgaXMgdGhlIHJlZGlyZWN0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQKLSAgICAgKi8KLSAgICBDbGFzcyByZWFkT2JqZWN0KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgIAotICAgIC8qKgotICAgICAqIEEgRGVmYXVsdCBSZXBvcnRRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogUmVwb3J0UXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAqIFF1ZXJ5IHJlZGlyZWN0b3JzIGFsbG93IHRoZSB1c2VyIHRvIGludGVyY2VwdCBxdWVyeSBleGVjdXRpb24gcHJldmVudGluZwotICAgICAqIGl0IG9yIGFsdGVybmF0ZWx5IHBlcmZvcm1pbmcgc29tZSBzaWRlIGVmZmVjdCBsaWtlIGF1ZGl0aW5nLgotICAgICAqIEZvciB1c2VycyBleGVjdXRpbmcgYSBKUEEgUXVlcnkgdGhhdCBjb250YWlucyBhZ3JlZ2F0ZSBmdW5jdGlvbnMgb3Igc2VsZWN0cyBtdWx0aXBsZSBlbnRpdGllcyB0aGlzIGlzIHRoZSByZWRpcmVjdG9yIHRoYXQgd2lsbCBiZSBpbnZva2VkCi0gICAgICovCi0gICAgQ2xhc3MgcmVwb3J0KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgIAotICAgIC8qKgotICAgICAqIEEgRGVmYXVsdCBVcGRhdGUgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIFVwZGF0ZU9iamVjdFF1ZXJ5IG9yIFVwZGF0ZUFsbFF1ZXJ5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIHJlZGlyZWN0b3Igc2V0IGRpcmVjdGx5IG9uIHRoZSBxdWVyeS4KLSAgICAgKiBJbiBFY2xpcHNlTGluayBhbiBVcGRhdGVPYmplY3RRdWVyeSBpcyBleGVjdXRlZCB3aGVuZXZlciBmbHVzaGluZyBjaGFuZ2VzIHRvIHRoZSBkYXRhc291cmNlLgotICAgICAqIFF1ZXJ5IHJlZGlyZWN0b3JzIGFsbG93IHRoZSB1c2VyIHRvIGludGVyY2VwdCBxdWVyeSBleGVjdXRpb24gcHJldmVudGluZwotICAgICAqIGl0IG9yIGFsdGVybmF0ZWx5IHBlcmZvcm1pbmcgc29tZSBzaWRlIGVmZmVjdCBsaWtlIGF1ZGl0aW5nLgotICAgICAqLyAKLSAgICBDbGFzcyB1cGRhdGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IEluc2VydCBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogSW5zZXJ0T2JqZWN0UXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAqIEluIEVjbGlwc2VMaW5rIGFuIEluc2VydE9iamVjdFF1ZXJ5IGlzIGV4ZWN1dGVkIHdoZW4gcGVyc2lzdGluZyBhbiBvYmplY3QgdG8gdGhlIGRhdGFzb3VyY2UuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICovCi0gICAgQ2xhc3MgaW5zZXJ0KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgIAotICAgIC8qKgotICAgICAqIEEgRGVmYXVsdCBEZWxldGUgT2JqZWN0IFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBEZWxldGVPYmplY3RRdWVyeSBvciBEZWxldGVBbGxRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICovCi0gICAgQ2xhc3MgZGVsZXRlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi19Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsLXF1ZXJpZXMiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLWFsbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtb2JqZWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVwb3J0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGVsZXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtdHJhbnNmb3JtZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyB3cml0ZS1vbmx5LCBpdCBzaG91bGQgaGF2ZSBhIAotICAgICAgICAgKiBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgY29sdW1uKHMpIAotICAgICAgICAgKiB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotICAgICAgICAgKgotICAgICAgICAgKiBBbHNvIHVubGVzcyBpdCdzIGEgcmVhZC1vbmx5IG1hcHBpbmcsIGVpdGhlciBXcml0ZVRyYW5zZm9ybWVyIAotICAgICAgICAgKiBhbm5vdGF0aW9uIG9yIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24gc2hvdWxkIGJlIHNwZWNpZmllZC4gRWFjaCAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKLSAgICAgICAgICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIpLgotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUmVhZFRyYW5zZm9ybWVyIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXNlci1kZWZpbmVkIGNsYXNzIHRoYXQgbXVzdCBpbXBsZW1lbnQgdGhlIAotICAgICAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MudHJhbnNmb3JtZXJzLkF0dHJpYnV0ZVRyYW5zZm9ybWVyIAotICAgICAgICAgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyAKLSAgICAgICAgICAgICAqIGJ1aWxkQXR0cmlidXRlVmFsdWUgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFsdWUgdG8gYmUgCi0gICAgICAgICAgICAgKiBhc3NpZ25lZCB0byB0aGUgYXR0cmlidXRlLgotICAgICAgICAgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBDbGFzcyB0cmFuc2Zvcm1lckNsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRoZSBtYXBwZWQgY2xhc3MgbXVzdCBoYXZlIGEgbWV0aG9kIHdpdGggdGhpcyBuYW1lIHdoaWNoIHJldHVybnMgCi0gICAgICAgICAgICAgKiBhIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSBhdHRyaWJ1dGUgKG5vdCBhc3NpZ25zIHRoZSB2YWx1ZSB0byAKLSAgICAgICAgICAgICAqIHRoZSBhdHRyaWJ1dGUpLiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSAKLSAgICAgICAgICAgICAqIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZCgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY29uZGFyeS10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlY29uZGFyeVRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbltdIHBrSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZXF1ZW5jZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgc2VxdWVuY2VOYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMTsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VxdWVuY2UtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTcWxSZXN1bHRTZXRNYXBwaW5nIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIEVudGl0eVJlc3VsdFtdIGVudGl0aWVzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBDb2x1bW5SZXN1bHRbXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LXJlc3VsdCIgdHlwZT0ib3JtOmVudGl0eS1yZXN1bHQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tcmVzdWx0IiB0eXBlPSJvcm06Y29sdW1uLXJlc3VsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RvcmVkLXByb2NlZHVyZS1wYXJhbWV0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIGFubm90YXRpb24gaXMgdXNlZCB3aXRoaW4gYSAKLSAgICAgICAgICogTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHt9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgZGlyZWN0aW9uIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlIHBhcmFtZXRlci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBEaXJlY3Rpb24gZGlyZWN0aW9uKCkgZGVmYXVsdCBJTjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3RvcmVkIHByb2NlZHVyZSBwYXJhbWV0ZXIgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBxdWVyeSBwYXJhbWV0ZXIgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgcXVlcnlQYXJhbWV0ZXIoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgSmF2YSBjbGFzcyBkZXNpcmVkIGJhY2sgZnJvbSB0aGUgcHJvY2VkdXJlLCAKLSAgICAgICAgICAgKiB0aGlzIGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIEpEQkMgdHlwZSBjb2RlLCB0aGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSByZXR1cm5lZCAKLSAgICAgICAgICAgKiBmcm9tIHRoZSBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgaW50IGpkYmNUeXBlKCkgZGVmYXVsdCAtMTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIEpEQkMgdHlwZSBuYW1lLCB0aGlzIG1heSBiZSByZXF1aXJlZCBmb3IgQVJSQVkgb3IgCi0gICAgICAgICAgICogU1RSVUNUIHR5cGVzLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBqZGJjVHlwZU5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXJlY3Rpb24iIHR5cGU9Im9ybTpkaXJlY3Rpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJxdWVyeS1wYXJhbWV0ZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iamRiYy10eXBlIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImpkYmMtdHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTdHJ1Y3RDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgCi0gICAgICAgICAgICogdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNvbnZlcnRlciBjbGFzcyB0byBiZSB1c2VkLiBUaGlzIGNsYXNzIG11c3QgCi0gICAgICAgICAgICogaW1wbGVtZW50IHRoZSBFY2xpcHNlTGluayBpbnRlcmZhY2UgCi0gICAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuY29udmVydGVycy5Db252ZXJ0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgY29udmVydGVyKCk7IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUtZ2VuZXJhdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGVHZW5lcmF0b3IgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHBrQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHBrQ29sdW1uVmFsdWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDA7Ci0gICAgICAgICAgaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MDsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJway1jb2x1bW4tdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUZW1wb3JhbCB7Ci0gICAgICAgICAgVGVtcG9yYWxUeXBlIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOnRlbXBvcmFsLXR5cGUiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBUZW1wb3JhbFR5cGUgewotICAgICAgICAgIERBVEUsIC8vIGphdmEuc3FsLkRhdGUKLSAgICAgICAgICBUSU1FLCAvLyBqYXZhLnNxbC5UaW1lCi0gICAgICAgICAgVElNRVNUQU1QIC8vIGphdmEuc3FsLlRpbWVzdGFtcAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEQVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FU1RBTVAiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWUtb2YtZGF5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUaW1lT2ZEYXkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgSG91ciBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgaG91cigpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgTWludXRlIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBtaW51dGUoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2Vjb25kKCkgZGVmYXVsdCAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBNaWxsaXNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgbWlsbGlzZWNvbmQoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnRlcm5hbCB1c2UuIERvIG5vdCBtb2RpZnkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gc3BlY2lmaWVkKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJob3VyIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbnV0ZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWlsbGlzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zZm9ybWF0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uIGlzIGFuIG9wdGlvbmFsIGFubm90YXRpb24gZm9yIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBhbGxvd3MgdG8gbWFwIGFuIGF0dHJpYnV0ZSB0byBvbmUgb3IgbW9yZSAKLSAgICAgICAgICogZGF0YWJhc2UgY29sdW1ucy4KLSAgICAgICAgICogCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uIGFubm90YXRpb24gaXMgYW4gb3B0aW9uYWwgcGFydCBvZiAKLSAgICAgICAgICogVHJhbnNmb3JtYXRpb25NYXBwaW5nIGRlZmluaXRpb24uIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIAotICAgICAgICAgKiB3cml0ZS1vbmx5LCBpdCBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyAKLSAgICAgICAgICogdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRyYW5zZm9ybWF0aW9uIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAotICAgICAgICAgICAgICogdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgCi0gICAgICAgICAgICAgKiBoaW50IHRvIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCAKLSAgICAgICAgICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG9wdGlvbmFsIGVsZW1lbnQgaXMgYSBoaW50IGFzIHRvIHdoZXRoZXIgdGhlIHZhbHVlCi0gICAgICAgICAgICAgKiAgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IG1heSBiZSBudWxsLiBJdCBpcyBkaXNyZWdhcmRlZAotICAgICAgICAgICAgICogIGZvciBwcmltaXRpdmUgdHlwZXMsIHdoaWNoIGFyZSBjb25zaWRlcmVkIG5vbi1vcHRpb25hbC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWFkLXRyYW5zZm9ybWVyIiB0eXBlPSJvcm06cmVhZC10cmFuc2Zvcm1lciIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndyaXRlLXRyYW5zZm9ybWVyIiB0eXBlPSJvcm06d3JpdGUtdHJhbnNmb3JtZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNpZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHJhbnNpZW50IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHlwZUNvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlCi0gICAgICAgICAgICogYWNyb3NzIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVuY2UgZmllbGQgCi0gICAgICAgICAgICogb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgZGF0YVR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBlbnRpdHkuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVudCBmaWVsZCAKLSAgICAgICAgICAgKiBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBvYmplY3RUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFVuaXF1ZUNvbnN0cmFpbnQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmdbXSBjb2x1bW5OYW1lcygpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKiogCi0gICAgICAgICAqIFZhcmlhYmxlIG9uZSB0byBvbmUgbWFwcGluZ3MgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGEgcG9pbnRlciAKLSAgICAgICAgICogcmVmZXJlbmNlcyBiZXR3ZWVuIGEgamF2YSBvYmplY3QgYW5kIGFuIGltcGxlbWVudGVyIG9mIGFuIGludGVyZmFjZS4gCi0gICAgICAgICAqIFRoaXMgbWFwcGluZyBpcyB1c3VhbGx5IHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIHBvaW50ZXIgKHN0b3JlZCBpbiBhbiAKLSAgICAgICAgICogaW5zdGFuY2UgdmFyaWFibGUpIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG9iamVjdHMuIEluIHRoZSAKLSAgICAgICAgICogcmVsYXRpb25hbCBkYXRhYmFzZSB0YWJsZXMsIHRoZXNlIG1hcHBpbmdzIGFyZSBub3JtYWxseSBpbXBsZW1lbnRlZCAKLSAgICAgICAgICogdXNpbmcgYSBmb3JlaWduIGtleSBhbmQgYSB0eXBlIGNvZGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIFZhcmlhYmxlT25lVG9PbmUgY2FuIGJlIHNwZWNpZmllZCB3aXRoaW4gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBhbmQgRW1iZWRkYWJsZSBjbGFzcy4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIAotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZhcmlhYmxlT25lVG9PbmUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGludGVyZmFjZSBjbGFzcyB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhlIAotICAgICAgICAgICAqIGFzc29jaWF0aW9uLiBJZiBub3Qgc3BlY2lmaWVkIGl0IHdpbGwgYmUgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSAKLSAgICAgICAgICAgKiBvZiB0aGUgb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdGFyZ2V0SW50ZXJmYWNlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgb3BlcmF0aW9ucyB0aGF0IG11c3QgYmUgY2FzY2FkZWQgdG8gdGhlIHRhcmdldCBvZiAKLSAgICAgICAgICAgKiB0aGUgYXNzb2NpYXRpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAotICAgICAgICAgICAqIHRoYXQgdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIAotICAgICAgICAgICAqIGhpbnQgdG8gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIAotICAgICAgICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIGFzc29jaWF0aW9uIGlzIG9wdGlvbmFsLiBJZiBzZXQgdG8gZmFsc2UgCi0gICAgICAgICAgICogdGhlbiBhIG5vbi1udWxsIHJlbGF0aW9uc2hpcCBtdXN0IGFsd2F5cyBleGlzdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgZGlzY3JpbWluYXRvciBjb2x1bW4gd2lsbCBob2xkIHRoZSB0eXBlIAotICAgICAgICAgICAqIGluZGljYXRvcnMuIElmIHRoZSBEaXNjcmltaW5hdG9yQ29sdW1uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuYW1lIAotICAgICAgICAgICAqIG9mIHRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiBkZWZhdWx0cyB0byAiRFRZUEUiIGFuZCB0aGUgCi0gICAgICAgICAgICogZGlzY3JpbWluYXRvciB0eXBlIHRvIFNUUklORy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBEaXNjcmltaW5hdG9yQ29sdW1uIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0IEBEaXNjcmltaW5hdG9yQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbGlzdCBvZiBkaXNjcmltaW5hdG9yIHR5cGVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCAKLSAgICAgICAgICAgKiB0aGlzIFZhcmlhYmxlT25lVG9PbmUuIElmIG5vbmUgYXJlIHNwZWNpZmllZCB0aGVuIHRob3NlIGVudGl0aWVzIAotICAgICAgICAgICAqIHdpdGhpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCB0aGF0IGltcGxlbWVudCB0aGUgdGFyZ2V0IGludGVyZmFjZSAKLSAgICAgICAgICAgKiB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHR5cGVzLiBUaGUgZGlzY3JpbWluYXRvciB0eXBlIHdpbGwgCi0gICAgICAgICAgICogZGVmYXVsdCBhcyBmb2xsb3dzOgotICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBTVFJJTkc6IEVudGl0eS5uYW1lKCkKLSAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgQ0hBUjogRmlyc3QgbGV0dGVyIG9mIHRoZSAKLSAgICAgICAgICAgKiAgICBFbnRpdHkgY2xhc3MKLSAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgSU5URUdFUjogVGhlIG5leHQgaW50ZWdlciBhZnRlciAKLSAgICAgICAgICAgKiAgICB0aGUgaGlnaGVzdCBpbnRlZ2VyIGV4cGxpY2l0bHkgYWRkZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRGlzY3JpbWluYXRvckNsYXNzW10gZGlzY3JpbWluYXRvckNsYXNzZXMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY2xhc3MiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNsYXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtaW50ZXJmYWNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZlcnNpb24ge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuCi0gICAgICAgICAqICAKLSAgICAgICAgICogQSBzaW5nbGUgV3JpdGVUcmFuc2Zvcm1lciBtYXkgYmUgc3BlY2lmaWVkIGRpcmVjdGx5IG9uIHRoZSBtZXRob2Qgb3IgCi0gICAgICAgICAqIGF0dHJpYnV0ZS4gTXVsdGlwbGUgV3JpdGVUcmFuc2Zvcm1lcnMgc2hvdWxkIGJlIHdyYXBwZWQgaW50byAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbi4gTm8gV3JpdGVUcmFuc2Zvcm1lcnMgc3BlY2lmaWVkIGZvciAKLSAgICAgICAgICogcmVhZC1vbmx5IG1hcHBpbmcuIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IAotICAgICAgICAgKiBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSAKLSAgICAgICAgICogY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgV3JpdGVUcmFuc2Zvcm1lciB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKLSAgICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5GaWVsZFRyYW5zZm9ybWVyIAotICAgICAgICAgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyBidWlsZEZpZWxkVmFsdWUgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIAotICAgICAgICAgICAgICogY29sdW1uLiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgCi0gICAgICAgICAgICAgKiBzdXBwb3J0ZWQgdGhlIG1ldGhvZCBidWlsZEZpZWxkVmFsdWUgaW4gdGhlIGNsYXNzIHNob3VsZCBiZSAKLSAgICAgICAgICAgICAqIGRlZmluZWQgdG8gcmV0dXJuIHRoZSByZWxldmFudCBKYXZhIHR5cGUsIG5vdCBqdXN0IE9iamVjdCBhcyAKLSAgICAgICAgICAgICAqIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZSwgZm9yIGluc3RhbmNlOgotICAgICAgICAgICAgICogcHVibGljIFRpbWUgYnVpbGRGaWVsZFZhbHVlKE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIGZpZWxkTmFtZSwgU2Vzc2lvbiBzZXNzaW9uKS4KLSAgICAgICAgICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGUgbWFwcGVkIGNsYXNzIG11c3QgaGF2ZSBhIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSB3aGljaCByZXR1cm5zIAotICAgICAgICAgICAgICogYSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIGNvbHVtbi4KLSAgICAgICAgICAgICAqIE5vdGUgdGhhdCBmb3IgZGRsIGdlbmVyYXRpb24gYW5kIHJldHVybmluZyB0byBiZSBzdXBwb3J0ZWQgdGhlIAotICAgICAgICAgICAgICogbWV0aG9kIHNob3VsZCBiZSBkZWZpbmVkIHRvIHJldHVybiBhIHBhcnRpY3VsYXIgdHlwZSwgbm90IGp1c3QgCi0gICAgICAgICAgICAgKiBPYmplY3QsIGZvciBpbnN0YW5jZToKLSAgICAgICAgICAgICAqIHB1YmxpYyBUaW1lIGdldFN0YXJ0VGltZSgpLgotICAgICAgICAgICAgICogVGhlIG1ldGhvZCBtYXkgcmVxdWlyZSBhIFRyYW5zaWVudCBhbm5vdGF0aW9uIHRvIGF2b2lkIGJlaW5nIAotICAgICAgICAgICAgICogbWFwcGVkIGFzIEJhc2ljIGJ5IGRlZmF1bHQuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNwZWNpZnkgaGVyZSB0aGUgY29sdW1uIGludG8gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuLgotICAgICAgICAgICAgICogVGhlIG9ubHkgY2FzZSB3aGVuIHRoaXMgY291bGQgYmUgc2tpcHBlZCBpcyBpZiBhIHNpbmdsZSAKLSAgICAgICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGVzIGFuIGF0dHJpYnV0ZSAtIHRoZSBhdHRyaWJ1dGUncyBuYW1lIAotICAgICAgICAgICAgICogd2lsbCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWUuCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBDb2x1bW4gY29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KLQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMS54c2QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMl8xLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUzY2U1Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMl8xLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQxMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTwhLS0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4gCi08IS0tIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+IAotPCEtLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGZyb20gT3JhY2xlIFRvcExpbmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgIHR3YXJlIC0gdXBkYXRlIHZlcnNpb24gbnVtYmVyIHRvIDIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAgICAxMi8yLzIwMDktMi4xIEd1eSBQZWxsZXRpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgLSAyOTYyODk6IEFkZCBjdXJyZW50IGFubm90YXRpb24gbWV0YWRhdGEgc3VwcG9ydCBvbiBtYXBwZWQgc3VwZXJjbGFzc2VzIHRvIEVjbGlwc2VMaW5rLU9STS5YTUwgU2NoZW1hICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIC0gMjk2NjEyOiBBZGQgY3VycmVudCBhbm5vdGF0aW9uIG9ubHkgbWV0YWRhdGEgc3VwcG9ydCBvZiByZXR1cm4gaW5zZXJ0L3VwZGF0ZSB0byB0aGUgRWNsaXBzZUxpbmstT1JNLlhNTCBTY2hlbWEgICAgLS0+Ci08IS0tICAgICAgICAtIGZvcm1hdHRlZCB0byBtYXRjaCBvcm1fMl8wLnhzZCBzbyB0aGF0IHVzZXJzIGNhbiBlYXNpbHkgY29tcGFyZSB0aGUgdHdvIHNjaGVtYXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgNS80LzIwMTAtMi4xIEd1eSBQZWxsZXRpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIC0gMjI3MjE5OiBFeHBhbmQgRWNsaXBzZUxpbmstT1JNLlhNTCBzY2hlbWEgZnVuY3Rpb25hbGl0eSBmb3IgMi4xIHJlbGVhc2UgICh1cGRhdGUgdmVyc2lvbiB0byAyLjEpICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08IS0tIEphdmEgUGVyc2lzdGVuY2UgQVBJIG9iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZSBzY2hlbWEgLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iIAotICB4bWxuczpvcm09Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iIAotICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAotICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIAotICB2ZXJzaW9uPSIyLjEiPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpZWNsaXBzZWxpbmtfb3JtXzJfMS54c2QgMi4xICBBcHJpbCAwNSAyMDEwCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpkb2N1bWVudGF0aW9uPjwhW0NEQVRBWwotCi0gICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIG5hdGl2ZSBFY2xpcHNlbGluayBYTUwgbWFwcGluZyBmaWxlCi0gICAgICAgVGhlIGZpbGUgbWF5IGJlIG5hbWVkICJNRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiBpbiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICBhcmNoaXZlIG9yIGl0IG1heSBiZSBuYW1lZCBzb21lIG90aGVyIG5hbWUgd2hpY2ggd291bGQgYmUKLSAgICAgICB1c2VkIHRvIGxvY2F0ZSB0aGUgZmlsZSBhcyByZXNvdXJjZSBvbiB0aGUgY2xhc3NwYXRoLgotICAgICAgIE9iamVjdC9yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZXMgbXVzdCBpbmRpY2F0ZSB0aGUgb2JqZWN0L3JlbGF0aW9uYWwKLSAgICAgICBtYXBwaW5nIGZpbGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSBwZXJzaXN0ZW5jZSBuYW1lc3BhY2U6Ci0KLSAgICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtCi0KLSAgICAgICBhbmQgaW5kaWNhdGUgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieSB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0gICAgICAgPGVudGl0eS1tYXBwaW5ncyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSIKLSAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSAKLSAgICAgICBlY2xpcHNlbGlua19vcm1fMl8xLnhzZAotICAgICAgIHZlcnNpb249IjIuMSI+Ci0gICAgICAgLi4uCi0gICAgICAgPC9lbnRpdHktbWFwcGluZ3M+Ci0KLSAgICAgXV0+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiLz4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InZlcnNpb25UeXBlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldKyhcLlswLTldKykqIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWNjZXNzLW1ldGhvZHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlIGFubm90YXRpb24gaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmludmFsaWRhdGlvbi5DYWNoZUludmFsaWRhdGlvblBvbGljeSAKLSAgICAgICAgICogd2hpY2ggc2V0cyBvYmplY3RzIGluIEVjbGlwc2VMaW5rJ3MgaWRlbnRpdHkgbWFwcyB0byBiZSBpbnZhbGlkIAotICAgICAgICAgKiBmb2xsb3dpbmcgZ2l2ZW4gcnVsZXMuIEJ5IGRlZmF1bHQgaW4gRWNsaXBzZUxpbmssIG9iamVjdHMgZG8gbm90IAotICAgICAgICAgKiBleHBpcmUgaW4gdGhlIGNhY2hlLiBTZXZlcmFsIGRpZmZlcmVudCBwb2xpY2llcyBhcmUgYXZhaWxhYmxlIHRvIAotICAgICAgICAgKiBhbGxvdyBvYmplY3RzIHRvIGV4cGlyZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGVUeXBlCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENhY2hlIGFub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHkgb3IgTWFwcGVkU3VwZXJjbGFzcy4gCi0gICAgICAgICAqIEluIHRoZSBjYXNlIG9mIGluaGVyaXRhbmNlLCBhIENhY2hlIGFubm90YXRpb24gc2hvdWxkIG9ubHkgYmUgZGVmaW5lZCAKLSAgICAgICAgICogb24gdGhlIHJvb3Qgb2YgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENhY2hlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNhY2hlIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2FjaGVUeXBlIHR5cGUoKSBkZWZhdWx0IFNPRlRfV0VBSzsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNpemUgb2YgY2FjaGUgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2l6ZSgpIGRlZmF1bHQgMTAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDYWNoZWQgaW5zdGFuY2VzIGluIHRoZSBzaGFyZWQgY2FjaGUgb3IgYSBjbGllbnQgCi0gICAgICAgICAgICogaXNvbGF0ZWQgY2FjaGUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gc2hhcmVkKCkgZGVmYXVsdCB0cnVlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBFeHBpcmUgY2FjaGVkIGluc3RhbmNlIGFmdGVyIGEgZml4IHBlcmlvZCBvZiB0aW1lIChtcykuIAotICAgICAgICAgICAqIFF1ZXJpZXMgZXhlY3V0ZWQgYWdhaW5zdCB0aGUgY2FjaGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvcmNlZCBiYWNrIAotICAgICAgICAgICAqIHRvIHRoZSBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgZXhwaXJ5KCkgZGVmYXVsdCAtMTsgLy8gbWludXMgb25lIGlzIG5vIGV4cGlyeS4KLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRXhwaXJlIGNhY2hlZCBpbnN0YW5jZSBhIHNwZWNpZmljIHRpbWUgb2YgZGF5LiBRdWVyaWVzIAotICAgICAgICAgICAqIGV4ZWN1dGVkIGFnYWluc3QgdGhlIGNhY2hlIGFmdGVyIHRoaXMgd2lsbCBiZSBmb3JjZWQgYmFjayB0byB0aGUgCi0gICAgICAgICAgICogZGF0YWJhc2UgZm9yIGEgcmVmcmVzaGVkIGNvcHkKLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgVGltZU9mRGF5IGV4cGlyeVRpbWVPZkRheSgpIGRlZmF1bHQgQFRpbWVPZkRheShzcGVjaWZpZWQ9ZmFsc2UpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBGb3JjZSBhbGwgcXVlcmllcyB0aGF0IGdvIHRvIHRoZSBkYXRhYmFzZSB0byBhbHdheXMgCi0gICAgICAgICAgICogcmVmcmVzaCB0aGUgY2FjaGUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gYWx3YXlzUmVmcmVzaCgpIGRlZmF1bHQgZmFsc2U7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbGwgcXVlcmllcyB0aGF0IGdvIHRvIHRoZSBkYXRhYmFzZSwgcmVmcmVzaCB0aGUKLSAgICAgICAgICAgKiBjYWNoZSBvbmx5IGlmIHRoZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGRhdGFiYXNlIGJ5IGEgcXVlcnkgaXMgCi0gICAgICAgICAgICogbmV3ZXIgdGhhbiB0aGUgZGF0YSBpbiB0aGUgY2FjaGUgKGFzIGRldGVybWluZWQgYnkgdGhlIG9wdGltaXN0aWMgCi0gICAgICAgICAgICogbG9ja2luZyBmaWVsZCkKLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXIoKSBkZWZhdWx0IGZhbHNlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTZXR0aW5nIHRvIHRydWUgd2lsbCBmb3JjZSBhbGwgcXVlcmllcyB0byBieXBhc3MgdGhlIAotICAgICAgICAgICAqIGNhY2hlIGZvciBoaXRzIGJ1dCBzdGlsbCByZXNvbHZlIGFnYWluc3QgdGhlIGNhY2hlIGZvciBpZGVudGl0eS4gCi0gICAgICAgICAgICogVGhpcyBmb3JjZXMgYWxsIHF1ZXJpZXMgdG8gaGl0IHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBkaXNhYmxlSGl0cygpIGRlZmF1bHQgZmFsc2U7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBjYWNoZSBjb29yZGluYXRpb24gbW9kZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2FjaGVDb29yZGluYXRpb25UeXBlIGNvb3JkaW5hdGlvblR5cGUoKSBkZWZhdWx0IFNFTkRfT0JKRUNUX0NIQU5HRVM7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4cGlyeSIgdHlwZT0ieHNkOmludGVnZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4cGlyeS10aW1lLW9mLWRheSIgdHlwZT0ib3JtOnRpbWUtb2YtZGF5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaGFyZWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOmNhY2hlLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbHdheXMtcmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZyZXNoLW9ubHktaWYtbmV3ZXIiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzYWJsZS1oaXRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvb3JkaW5hdGlvbi10eXBlIiB0eXBlPSJvcm06Y2FjaGUtY29vcmRpbmF0aW9uLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiAKLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hlLWludGVyY2VwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2FjaGVJbnRlcmNlcHRvciB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDYWNoZVR5cGUgZW51bSBpcyB1c2VkIHdpdGggdGhlIENhY2hlIGFubm90YXRpb24gZm9yIGEgCi0gICAgICAgICAqIHBlcnNpc3RlbnQgY2xhc3MuIEl0IGRlZmluZXMgdGhlIHR5cGUgb2YgSWRlbnRpdHlNYXAvQ2FjaGUgdXNlZCBmb3IgCi0gICAgICAgICAqIHRoZSBjbGFzcy4gQnkgZGVmYXVsdCB0aGUgU09GVF9XRUFLIGNhY2hlIHR5cGUgaXMgdXNlZC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUgCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZW51bSBDYWNoZVR5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS4gQ2FjaGVzIGFsbCBvYmplY3RzCi0gICAgICAgICAgICogYW5kIGRvZXMgbm90IHJlbW92ZSB0aGVtLiAKLSAgICAgICAgICAgKiBXQVJOSU5HOiBUaGlzIG1ldGhvZCBtYXkgYmUgbWVtb3J5IGludGVuc2l2ZSB3aGVuIG1hbnkgb2JqZWN0cyBhcmUgCi0gICAgICAgICAgICogcmVhZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGVUxMLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2ltaWxhciB0byB0aGUgRlVMTCBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgdGhlIG1hcCBob2xkcyB0aGUKLSAgICAgICAgICAgKiBvYmplY3RzIHVzaW5nIHdlYWsgcmVmZXJlbmNlcy4gVGhpcyBtZXRob2QgYWxsb3dzIGZ1bGwgZ2FyYmFnZQotICAgICAgICAgICAqIGNvbGxlY3Rpb24gYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBXRUFLLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2ltaWxhciB0byB0aGUgRlVMTCBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgdGhlIG1hcCBob2xkcyB0aGUKLSAgICAgICAgICAgKiBvYmplY3RzIHVzaW5nIHNvZnQgcmVmZXJlbmNlcy4gVGhpcyBtZXRob2QgYWxsb3dzIGZ1bGwgZ2FyYmFnZQotICAgICAgICAgICAqIGNvbGxlY3Rpb24gd2hlbiBtZW1vcnkgaXMgbG93IGFuZCBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kCi0gICAgICAgICAgICogZ3VhcmFudGVlZCBpZGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTT0ZULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2ltaWxhciB0byB0aGUgV0VBSyBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgaXQgbWFpbnRhaW5zIGEKLSAgICAgICAgICAgKiBtb3N0LWZyZXF1ZW50bHktdXNlZCBzdWItY2FjaGUuIFRoZSBzaXplIG9mIHRoZSBzdWItY2FjaGUgaXMKLSAgICAgICAgICAgKiBwcm9wb3J0aW9uYWwgdG8gdGhlIHNpemUgb2YgdGhlIGlkZW50aXR5IG1hcCBhcyBzcGVjaWZpZWQgYnkKLSAgICAgICAgICAgKiBkZXNjcmlwdG9yJ3Mgc2V0SWRlbnRpdHlNYXBTaXplKCkgbWV0aG9kLiBUaGUgc3ViLWNhY2hlCi0gICAgICAgICAgICogdXNlcyBzb2Z0IHJlZmVyZW5jZXMgdG8gZW5zdXJlIHRoYXQgdGhlc2Ugb2JqZWN0cyBhcmUKLSAgICAgICAgICAgKiBnYXJiYWdlLWNvbGxlY3RlZCBvbmx5IGlmIHRoZSBzeXN0ZW0gaXMgbG93IG9uIG1lbW9yeS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTT0ZUX1dFQUssCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJZGVudGljYWwgdG8gdGhlIHNvZnQgY2FjaGUgd2VhayAoU09GVF9XRUFLKSBpZGVudGl0eSBtYXAgZXhjZXB0IAotICAgICAgICAgICAqIHRoYXQgaXQgdXNlcyBoYXJkIHJlZmVyZW5jZXMgaW4gdGhlIHN1Yi1jYWNoZS4gVXNlIHRoaXMgaWRlbnRpdHkgCi0gICAgICAgICAgICogbWFwIGlmIHNvZnQgcmVmZXJlbmNlcyBkbyBub3QgYmVoYXZlIHByb3Blcmx5IG9uIHlvdXIgcGxhdGZvcm0uCi0gICAgICAgICAgICovCi0gICAgICAgICAgSEFSRF9XRUFLLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQSBjYWNoZSBpZGVudGl0eSBtYXAgbWFpbnRhaW5zIGEgZml4ZWQgbnVtYmVyIG9mIG9iamVjdHMKLSAgICAgICAgICAgKiBzcGVjaWZpZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiBPYmplY3RzIGFyZSByZW1vdmVkIGZyb20gdGhlIGNhY2hlCi0gICAgICAgICAgICogb24gYSBsZWFzdC1yZWNlbnRseS11c2VkIGJhc2lzLiBUaGlzIG1ldGhvZCBhbGxvd3Mgb2JqZWN0Ci0gICAgICAgICAgICogaWRlbnRpdHkgZm9yIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgb2JqZWN0cy4KLSAgICAgICAgICAgKiBXQVJOSU5HOiBGdXJuaXNoZXMgY2FjaGluZyBhbmQgaWRlbnRpdHksIGJ1dCBkb2VzIG5vdCBndWFyYW50ZWUgCi0gICAgICAgICAgICogaWRlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ0FDSEUsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBXQVJOSU5HOiBEb2VzIG5vdCBwcmVzZXJ2ZSBvYmplY3QgaWRlbnRpdHkgYW5kIGRvZXMgbm90IGNhY2hlIAotICAgICAgICAgICAqIG9iamVjdHMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgTk9ORQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGVUxMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXRUFLIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTT0ZUIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTT0ZUX1dFQUsiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhBUkRfV0VBSyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FDSEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtY29vcmRpbmF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUgCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIGVudW0gQ2FjaGVDb29yZGluYXRpb25UeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTZW5kcyBhIGxpc3Qgb2YgY2hhbmdlZCBvYmplY3RzIGluY2x1ZGluZyBkYXRhIGFib3V0IHRoZSBjaGFuZ2VzLgotICAgICAgICAgICAqIFRoaXMgZGF0YSBpcyBtZXJnZWQgaW50byB0aGUgcmVjZWl2aW5nIGNhY2hlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFNFTkRfT0JKRUNUX0NIQU5HRVMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTZW5kcyBhIGxpc3Qgb2YgdGhlIGlkZW50aXRpZXMgb2YgdGhlIG9iamVjdHMgdGhhdCBoYXZlIGNoYW5nZWQuIAotICAgICAgICAgICAqIFRoZSByZWNlaXZpbmcgY2FjaGUgaW52YWxpZGF0ZXMgdGhlIG9iamVjdHMgKHJhdGhlciB0aGFuIGNoYW5naW5nIAotICAgICAgICAgICAqIGFueSBvZiB0aGUgZGF0YSkKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNhbWUgYXMgU0VORF9PQkpFQ1RfQ0hBTkdFUyBleGNlcHQgaXQgYWxzbyBpbmNsdWRlcyBhbnkgbmV3bHkKLSAgICAgICAgICAgKiBjcmVhdGVkIG9iamVjdHMgZnJvbSB0aGUgdHJhbnNhY3Rpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBEb2VzIG5vIGNhY2hlIGNvb3JkaW5hdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBOT05FCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTkRfT0JKRUNUX0NIQU5HRVMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY2hhbmdldHJhY2tpbmcuT2JqZWN0Q2hhbmdlUG9saWN5IAotICAgICAgICAgKiB3aGljaCBjb21wdXRlcyBjaGFuZ2VzIHNldHMgZm9yIEVjbGlwc2VMaW5rJ3MgVW5pdE9mV29yayBjb21taXQgCi0gICAgICAgICAqIHByb2Nlc3MuIEFuIE9iamVjdENoYW5nZVBvbGljeSBpcyBzdG9yZWQgb24gYW4gRW50aXR5J3MgZGVzY3JpcHRvci4KLSAgICAgICAgICoKLSAgICAgICAgICogQSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uIG1heSBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENoYW5nZVRyYWNraW5nIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNoYW5nZSB0cmFja2luZyB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIENoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZSgpIGRlZmF1bHQgQVVUTzsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZy10eXBlIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2hhbmdlLXRyYWNraW5nLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbi4gCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIGVudW0gQ2hhbmdlVHJhY2tpbmdUeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBbiBBVFRSSUJVVEUgY2hhbmdlIHRyYWNraW5nIHR5cGUgYWxsb3dzIGNoYW5nZSB0cmFja2luZyBhdCB0aGUKLSAgICAgICAgICAgKiBhdHRyaWJ1dGUgbGV2ZWwgb2YgYW4gb2JqZWN0LiBPYmplY3RzIHdpdGggY2hhbmdlZCBhdHRyaWJ1dGVzIHdpbGwKLSAgICAgICAgICAgKiBiZSBwcm9jZXNzZWQgaW4gdGhlIGNvbW1pdCBwcm9jZXNzIHRvIGluY2x1ZGUgYW55IGNoYW5nZXMgaW4gdGhlIAotICAgICAgICAgICAqIHJlc3VsdHMgb2YgdGhlIGNvbW1pdC4gVW5jaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIEFUVFJJQlVURSwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFuIE9CSkVDVCBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGFsbG93cyBhbiBvYmplY3QgdG8gY2FsY3VsYXRlIGZvciAKLSAgICAgICAgICAgKiBpdHNlbGYgd2hldGhlciBpdCBoYXMgY2hhbmdlZC4gQ2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgcHJvY2Vzc2VkIGluIAotICAgICAgICAgICAqIHRoZSBjb21taXQgcHJvY2VzcyB0byBpbmNsdWRlIGFueSBjaGFuZ2VzIGluIHRoZSByZXN1bHRzIG9mIHRoZSAKLSAgICAgICAgICAgKiBjb21taXQuIFVuY2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPQkpFQ1QsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBIERFRkVSUkVEIGNoYW5nZSB0cmFja2luZyBwb2xpY3kgZGVmZXJzIGFsbCBjaGFuZ2UgZGV0ZWN0aW9uIHRvCi0gICAgICAgICAgICogdGhlIFVuaXRPZldvcmsncyBjaGFuZ2UgZGV0ZWN0aW9uIHByb2Nlc3MuIEVzc2VudGlhbGx5LCB0aGUgCi0gICAgICAgICAgICogY2FsY3VsYXRlQ2hhbmdlcygpIG1ldGhvZCB3aWxsIHJ1biBmb3IgYWxsIG9iamVjdHMgaW4gYSBVbml0T2ZXb3JrLiAKLSAgICAgICAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IE9iamVjdENoYW5nZVBvbGljeQotICAgICAgICAgICAqLwotICAgICAgICAgIERFRkVSUkVELAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogV2lsbCBub3Qgc2V0IGFueSBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5LgotICAgICAgICAgICAqLwotICAgICAgICAgIEFVVE8KLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRUUklCVVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPQkpFQ1QiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFRkVSUkVEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVRPIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9taXplciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIEN1c3RvbWl6ZXIgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgCi0gICAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb25maWcuRGVzY3JpcHRvckN1c3RvbWl6ZXIgCi0gICAgICAgICAqIGludGVyZmFjZSBhbmQgaXMgdG8gcnVuIGFnYWluc3QgYW4gZW5ldGl0eSdzIGNsYXNzIGRlc2NyaXB0b3IgYWZ0ZXIgYWxsIAotICAgICAgICAgKiBtZXRhZGF0YSBwcm9jZXNzaW5nIGhhcyBiZWVuIGNvbXBsZXRlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogVGhlIEN1c3RvbWl6ZXIgYW5ub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MgCi0gICAgICAgICAqIG9yIEVtYmVkZGFibGUgY2xhc3MuIEluIHRoZSBjYXNlIG9mIGluaGVyaXRhbmNlLCBhIEN1c3RvbWl6ZXIgaXMgbm90IAotICAgICAgICAgKiBpbmhlcml0ZWQgZnJvbSBpdHMgcGFyZW50IGNsYXNzZXMuIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEN1c3RvbWl6ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgZGVzY3JpcHRvciBjdXN0b21pemVyIGNsYXNzIHRoYXQgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGFwcGxpZWQgZm9yIHRoZSByZWxhdGVkIGVudGl0eSBvciBlbWJlZGRhYmxlIGNsYXNzLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHZhbHVlKCk7IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpcmVjdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBhbm5vdGF0aW9uLgotICAgICAgICAgKiBJdCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRpcmVjdGlvbiBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZSAKLSAgICAgICAgICogcGFyYW1ldGVycyBvZiBhIG5hbWVkIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZW51bSBEaXJlY3Rpb24gewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIElucHV0IHBhcmFtZXRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIElOLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogT3V0cHV0IHBhcmFtZXRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIE9VVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIElucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgSU5fT1VULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogT3V0cHV0IGN1cnNvcgotICAgICAgICAgICAqLwotICAgICAgICAgIE9VVF9DVVJTT1IKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5fT1VUIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVRfQ1VSU09SIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbWFwcGluZ3MiPgotICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZW50aXR5LW1hcHBpbmdzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIG1hcHBpbmcKLSAgICAgICAgZmlsZS4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmb3VyIHR5cGVzIG9mIGVsZW1lbnRzOgotCi0gICAgICAgIDEuIFRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgY29udGFpbnMgbWV0YWRhdGEKLSAgICAgICAgZm9yIHRoZSBlbnRpcmUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIGlmIHRoaXMgZWxlbWVudAotICAgICAgICBvY2N1cnMgaW4gbXVsdGlwbGUgbWFwcGluZyBmaWxlcyB3aXRoaW4gdGhlIHNhbWUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgCi0gICAgICAgIDIuIFRoZSBwYWNrYWdlLCBzY2hlbWEsIGNhdGFsb2cgYW5kIGFjY2VzcyBlbGVtZW50cyBhcHBseSB0byBhbGwgb2YKLSAgICAgICAgdGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZGVmaW5lZCBpbgotICAgICAgICB0aGUgc2FtZSBmaWxlIGluIHdoaWNoIHRoZXkgb2NjdXIuCi0KLSAgICAgICAgMy4gVGhlIHNlcXVlbmNlLWdlbmVyYXRvciwgdGFibGUtZ2VuZXJhdG9yLCBuYW1lZC1xdWVyeSwKLSAgICAgICAgbmFtZWQtbmF0aXZlLXF1ZXJ5IGFuZCBzcWwtcmVzdWx0LXNldC1tYXBwaW5nIGVsZW1lbnRzIGFyZSBnbG9iYWwKLSAgICAgICAgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUKLSAgICAgICAgc2VxdWVuY2UtZ2VuZXJhdG9yIG9yIHRhYmxlLWdlbmVyYXRvciBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lCi0gICAgICAgIG9yIGRpZmZlcmVudCBtYXBwaW5nIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgYWxzbyAKLSAgICAgICAgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBuYW1lZC1xdWVyeSwgbmFtZWQtbmF0aXZlLXF1ZXJ5LCBvcgotICAgICAgICByZXN1bHQtc2V0LW1hcHBpbmcgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZSBvciBkaWZmZXJlbnQgbWFwcGluZyAKLSAgICAgICAgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgIDQuIFRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGVhY2ggZGVmaW5lCi0gICAgICAgIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciBhIG1hbmFnZWQgcGVyc2lzdGVudCBjbGFzcy4gVGhlIG1hcHBpbmcKLSAgICAgICAgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZXNlIGVsZW1lbnRzIG1heSBiZSBjb21wbGV0ZSBvciBpdCBtYXkKLSAgICAgICAgYmUgcGFydGlhbC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIgCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFja2FnZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4gICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcXVlcnkiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIiB0eXBlPSJvcm06bWFwcGVkLXN1cGVyY2xhc3MiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5IiB0eXBlPSJvcm06ZW50aXR5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGFibGUiIHR5cGU9Im9ybTplbWJlZGRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb25UeXBlIiAKLSAgICAgICAgICAgICAgICAgICAgIGZpeGVkPSIyLjEiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPC94c2Q6ZWxlbWVudD4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImV4aXN0ZW5jZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgRXhpc3RlbmNlQ2hlY2tpbmcgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAqIGNoZWNraW5nIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBlbnRpdGllcy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEFuIGV4aXN0ZW5jZS1jaGVja2luZyBzcGVjaWZpY2F0aW9uIGlzIHN1cHBvcnRlZCBvbiBhbiBFbnRpdHkgb3IgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MgYW5ub3RhdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEV4aXN0ZW5jZUNoZWNraW5nIHsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU2V0IHRoZSBleGlzdGVuY2UgY2hlY2sgZm9yIGRldGVybWluaW5nCi0gICAgICAgICAgICogaWYgYW4gaW5zZXJ0IG9yIHVwZGF0ZSBzaG91bGQgb2NjdXIgZm9yIGFuIG9iamVjdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBFeGlzdGVuY2VUeXBlIHZhbHVlKCkgZGVmYXVsdCBDSEVDS19DQUNIRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBc3N1bWUgdGhhdCBpZiB0aGUgb2JqZWN0cyBwcmltYXJ5IGtleSBkb2VzIG5vdCBpbmNsdWRlIG51bGwgYW5kIAotICAgICAgICAgKiBpdCBpcyBpbiB0aGUgY2FjaGUsIHRoZW4gaXQgbXVzdCBleGlzdC4KLSAgICAgICAgICovCi0gICAgICAgIENIRUNLX0NBQ0hFLAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQZXJmb3JtIGRvZXMgZXhpc3QgY2hlY2sgb24gdGhlIGRhdGFiYXNlLgotICAgICAgICAgKi8KLSAgICAgICAgQ0hFQ0tfREFUQUJBU0UsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCB0aGVuIAotICAgICAgICAgKiBpdCBtdXN0IGV4aXN0LiBUaGlzIG1heSBiZSB1c2VkIGlmIHRoZSBhcHBsaWNhdGlvbiBndWFyYW50ZWVzIG9yIAotICAgICAgICAgKiBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2UgY2hlY2suCi0gICAgICAgICAqLwotICAgICAgICBBU1NVTUVfRVhJU1RFTkNFLAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBc3N1bWUgdGhhdCB0aGUgb2JqZWN0IGRvZXMgbm90IGV4aXN0LiBUaGlzIG1heSBiZSB1c2VkIGlmIHRoZSAKLSAgICAgICAgICogYXBwbGljYXRpb24gZ3VhcmFudGVlcyBvciBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2UgY2hlY2suICAKLSAgICAgICAgICogVGhpcyB3aWxsIGFsd2F5cyBmb3JjZSBhbiBpbnNlcnQgdG8gYmUgY2FsbGVkLgotICAgICAgICAgKi8KLSAgICAgICAgQVNTVU1FX05PTl9FWElTVEVOQ0UKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPiAgICAKLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19DQUNIRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hFQ0tfREFUQUJBU0UiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTU1VNRV9FWElTVEVOQ0UiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTU1VNRV9OT05fRVhJU1RFTkNFIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+IAotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBNZXRhZGF0YSB0aGF0IGFwcGxpZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYW5kIG5vdCBqdXN0IHRvIAotICAgICAgICB0aGUgbWFwcGluZyBmaWxlIGluIHdoaWNoIGl0IGlzIGNvbnRhaW5lZC4gCi0KLSAgICAgICAgSWYgdGhlIHhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIGVsZW1lbnQgaXMgc3BlY2lmaWVkLAotICAgICAgICB0aGUgY29tcGxldGUgc2V0IG9mIG1hcHBpbmcgbWV0YWRhdGEgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0IAotICAgICAgICBpcyBjb250YWluZWQgaW4gdGhlIFhNTCBtYXBwaW5nIGZpbGVzIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+ICAgICAgICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlc2UgZGVmYXVsdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXMgYSB3aG9sZSAKLSAgICAgICAgdW5sZXNzIHRoZXkgYXJlIG92ZXJyaWRkZW4gYnkgbG9jYWwgYW5ub3RhdGlvbiBvciBYTUwgCi0gICAgICAgIGVsZW1lbnQgc2V0dGluZ3MuIAotICAgICAgICAKLSAgICAgICAgc2NoZW1hIC0gVXNlZCBhcyB0aGUgc2NoZW1hIGZvciBhbGwgdGFibGVzLCBzZWNvbmRhcnkgdGFibGVzLCBqb2luCi0gICAgICAgICAgICB0YWJsZXMsIGNvbGxlY3Rpb24gdGFibGVzLCBzZXF1ZW5jZSBnZW5lcmF0b3JzLCBhbmQgdGFibGUgCi0gICAgICAgICAgICBnZW5lcmF0b3JzIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2F0YWxvZyAtIFVzZWQgYXMgdGhlIGNhdGFsb2cgZm9yIGFsbCB0YWJsZXMsIHNlY29uZGFyeSB0YWJsZXMsIGpvaW4KLSAgICAgICAgICAgIHRhYmxlcywgY29sbGVjdGlvbiB0YWJsZXMsIHNlcXVlbmNlIGdlbmVyYXRvcnMsIGFuZCB0YWJsZSAKLSAgICAgICAgICAgIGdlbmVyYXRvcnMgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBkZWxpbWl0ZWQtaWRlbnRpZmllcnMgLSBVc2VkIHRvIHRyZWF0IGRhdGFiYXNlIGlkZW50aWZpZXJzIGFzCi0gICAgICAgICAgICBkZWxpbWl0ZWQgaWRlbnRpZmllcnMuCi0gICAgICAgIGFjY2VzcyAtIFVzZWQgYXMgdGhlIGFjY2VzcyB0eXBlIGZvciBhbGwgbWFuYWdlZCBjbGFzc2VzIGluCi0gICAgICAgICAgICB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBjYXNjYWRlLXBlcnNpc3QgLSBBZGRzIGNhc2NhZGUtcGVyc2lzdCB0byB0aGUgc2V0IG9mIGNhc2NhZGUgb3B0aW9ucwotICAgICAgICAgICAgaW4gYWxsIGVudGl0eSByZWxhdGlvbnNoaXBzIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGVudGl0eS1saXN0ZW5lcnMgLSBMaXN0IG9mIGRlZmF1bHQgZW50aXR5IGxpc3RlbmVycyB0byBiZSBpbnZva2VkIAotICAgICAgICAgICAgb24gZWFjaCBlbnRpdHkgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVsaW1pdGVkLWlkZW50aWZpZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGFuIGVudGl0eS4gSXMgYWxsb3dlZCB0byBiZQotICAgICAgICBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYW5ub3RhdGlvbnMuCi0gICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gCi0gICAgICAgIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgb24gdGhlIGVudGl0eSBjbGFzcyAoYW5kIGl0cyBmaWVsZHMKLSAgICAgICAgb3IgcHJvcGVydGllcykgYXJlIHRvIGJlIHByb2Nlc3NlZC4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIAotICAgICAgICB0aGUgZGVmYXVsdGluZyBydWxlcyBmb3IgdGhlIGVudGl0eSBhbmQgaXRzIHN1YmVsZW1lbnRzIHdpbGwgCi0gICAgICAgIGJlIHJlY3Vyc2l2ZWx5IGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJvcm06dGFibGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY29uZGFyeS10YWJsZSIgdHlwZT0ib3JtOnNlY29uZGFyeS10YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleSIgdHlwZT0ib3JtOnByaW1hcnkta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmhlcml0YW5jZSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcy1leHRyYWN0b3IiIHR5cGU9Im9ybTpjbGFzcy1leHRyYWN0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtaW50ZXJjZXB0b3IiIHR5cGU9Im9ybTpjYWNoZS1pbnRlcmNlcHRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmZXRjaC1ncm91cCIgdHlwZT0ib3JtOmZldGNoLWdyb3VwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeS1yZWRpcmVjdG9ycyIgdHlwZT0ib3JtOnF1ZXJ5LXJlZGlyZWN0b3JzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBhcmVudC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FjaGVhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGlzdGVuY2UtY2hlY2tpbmciIHR5cGU9Im9ybTpleGlzdGVuY2UtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iYWNjZXNzLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgZGV0ZXJtaW5lcyBob3cgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIGFjY2Vzc2VzIHRoZQotICAgICAgICBzdGF0ZSBvZiBhbiBlbnRpdHkgb3IgZW1iZWRkZWQgb2JqZWN0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPUEVSVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWSVJUVUFMIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0e307Ci0gICAgICAgICAgSm9pblRhYmxlIGpvaW5UYWJsZSgpIGRlZmF1bHQgQEpvaW5UYWJsZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEF0dHJpYnV0ZU92ZXJyaWRlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIENvbHVtbiBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgZWxlbWVudCBjb250YWlucyB0aGUgZW50aXR5IGZpZWxkIG9yIHByb3BlcnR5IG1hcHBpbmdzLgotICAgICAgICBJdCBtYXkgYmUgc3BhcnNlbHkgcG9wdWxhdGVkIHRvIGluY2x1ZGUgb25seSBhIHN1YnNldCBvZiB0aGUKLSAgICAgICAgZmllbGRzIG9yIHByb3BlcnRpZXMuIElmIG1ldGFkYXRhLWNvbXBsZXRlIGZvciB0aGUgZW50aXR5IGlzIHRydWUKLSAgICAgICAgdGhlbiB0aGUgcmVtYWluZGVyIG9mIHRoZSBhdHRyaWJ1dGVzIHdpbGwgYmUgZGVmYXVsdGVkIGFjY29yZGluZwotICAgICAgICB0byB0aGUgZGVmYXVsdCBydWxlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0ib3JtOmlkIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkLWlkIiB0eXBlPSJvcm06ZW1iZWRkZWQtaWQiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMiIHR5cGU9Im9ybTpiYXNpYyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMtY29sbGVjdGlvbiIgdHlwZT0ib3JtOmJhc2ljLWNvbGxlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYy1tYXAiIHR5cGU9Im9ybTpiYXNpYy1tYXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1vbmUiIHR5cGU9Im9ybTptYW55LXRvLW9uZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW1hbnkiIHR5cGU9Im9ybTpvbmUtdG8tbWFueSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW9uZSIgdHlwZT0ib3JtOm9uZS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUiIHR5cGU9Im9ybTp2YXJpYWJsZS1vbmUtdG8tb25lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1tYW55IiB0eXBlPSJvcm06bWFueS10by1tYW55IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIiB0eXBlPSJvcm06ZWxlbWVudC1jb2xsZWN0aW9uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQiIHR5cGU9Im9ybTplbWJlZGRlZCIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNmb3JtYXRpb24iIHR5cGU9Im9ybTp0cmFuc2Zvcm1hdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zaWVudCIgdHlwZT0ib3JtOnRyYW5zaWVudCIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljIHsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiIHR5cGU9Im9ybTpnZW5lcmF0ZWQtdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIgdHlwZT0ib3JtOmxvYiIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW51bWVyYXRlZCIgdHlwZT0ib3JtOmVudW1lcmF0ZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJldHVybi1pbnNlcnQiIHR5cGU9Im9ybTpyZXR1cm4taW5zZXJ0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm4tdXBkYXRlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYy1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNDb2xsZWN0aW9uIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSB0aGF0IAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSBoaW50IHRvIAotICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAKLSAgICAgICAgICAgKiBMQVpZLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsgCi0gCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgdmFsdWUgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCAKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGRhdGEuIERlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBvciBmaWVsZCBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbiB2YWx1ZUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTplY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC1mZXRjaCIgdHlwZT0ib3JtOmJhdGNoLWZldGNoIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljLW1hcCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljTWFwIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSB0aGF0IAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSBoaW50IHRvIAotICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAKLSAgICAgICAgICAgKiBMQVpZLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGRhdGEgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCBtYXAgCi0gICAgICAgICAgICoga2V5LiBJZiB0aGUgbmFtZSBvbiB0ZSBrZXkgY29sdW1uIGlzICIiLCB0aGUgbmFtZSB3aWxsIGRlZmF1bHQgdG86Ci0gICAgICAgICAgICogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9yIGZpZWxkOyAiX0tFWSIuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uIGtleUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUga2V5IGNvbnZlcnRlci4gRGVmYXVsdCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAgICAgICAqIHNwZWNpZnlpbmcgQENvbnZlcnQoIm5vbmUiKSwgbWVhbmluZyBubyBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byAKLSAgICAgICAgICAgKiB0aGUgZGlyZWN0IG1hcCBrZXkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVydCBrZXlDb252ZXJ0ZXIoKSBkZWZhdWx0IEBDb252ZXJ0OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IAotICAgICAgICAgICAqIGNvbGxlY3Rpb24gZGF0YS4gRGVmYXVsdHMgdG8gdGhlIHByb3BlcnR5IG9yIGZpZWxkIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uIHZhbHVlQ29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB2YWx1ZSBjb252ZXJ0ZXIuIERlZmF1bHQgaXMgZXF1aXZhbGVudCB0byAKLSAgICAgICAgICAgKiBzcGVjaWZ5aW5nIEBDb252ZXJ0KCJub25lIiksIG1lYW5pbmcgbm8gY29udmVydGVyIHdpbGwgYmUgYWRkZWQgdG8gCi0gICAgICAgICAgICogdGhlIHZhbHVlIGNvbHVtbiBtYXBwaW5nLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnQgdmFsdWVDb252ZXJ0ZXIoKSBkZWZhdWx0IEBDb252ZXJ0OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImtleS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImtleS1jb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMiI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4gICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sbGVjdGlvbi10YWJsZSIgdHlwZT0ib3JtOmVjbGlwc2VsaW5rLWNvbGxlY3Rpb24tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhdGNoLWZldGNoIiB0eXBlPSJvcm06YmF0Y2gtZmV0Y2giIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FzY2FkZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gQ2FzY2FkZVR5cGUgeyBBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0gsIERFVEFDSH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtYWxsIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW1lcmdlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVtb3ZlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWRldGFjaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsYXNzLWV4dHJhY3RvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENsYXNzRXh0cmFjdG9yIGFsbG93cyBmb3IgYSB1c2VyIGRlZmluZWQgY2xhc3MgaW5kaWNhdG9yIGluIHBsYWNlIG9mIAotICAgICAgICAgKiBwcm92aWRpbmcgYSBkaXNjcmltaW5hdG9yIGNvbHVtbi4gVGhlIGNsYXNzIGhhcyB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgICAgICAgKiAgLSBJdCBtdXN0IGV4dGVuZCB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuQ2xhc3NFeHRyYWN0b3IgCi0gICAgICAgICAqICAgIGNsYXNzIGFuZCBpbXBsZW1lbnQgdGhlIGV4dHJhY3RDbGFzc0Zyb21Sb3coUmVjb3JkLCBTZXNzaW9uKSBtZXRob2QuIAotICAgICAgICAgKiAgLSBUaGF0IG1ldGhvZCBtdXN0IHRha2UgYSBkYXRhYmFzZSByb3cgKGEgUmVjb3JkL01hcCkgYXMgYW4gYXJndW1lbnQgYW5kIAotICAgICAgICAgKiAgICBtdXN0IHJldHVybiB0aGUgY2xhc3MgdG8gdXNlIGZvciB0aGF0IHJvdy4gCi0gICAgICAgICAqIAotICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gZGVjaWRlIHdoaWNoIGNsYXNzIHRvIGluc3RhbnRpYXRlIHdoZW4gcmVhZGluZyAKLSAgICAgICAgICogZnJvbSB0aGUgZGF0YWJhc2UuIEl0IGlzIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIHBvcHVsYXRlIGFueSAKLSAgICAgICAgICogdHlwaW5nIGluZm9ybWF0aW9uIGluIHRoZSBkYXRhYmFzZSByZXF1aXJlZCB0byBkZXRlcm1pbmUgdGhlIGNsYXNzIGZyb20gdGhlIAotICAgICAgICAgKiByb3cuCi0gICAgICAgICAqIAotICAgICAgICAgKiBUaGUgQ2xhc3NFeHRyYWN0b3IgbXVzdCBvbmx5IGJlIHNldCBvbiB0aGUgcm9vdCBvZiBhbiBlbnRpdHkgY2xhc3Mgb3IKLSAgICAgICAgICogc3ViLWhpZXJhcmNoeSBpbiB3aGljaCBhIGRpZmZlcmVudCBpbmhlcml0YW5jZSBzdHJhdGVneSBpcyBhcHBsaWVkLiBUaGUgCi0gICAgICAgICAqIENsYXNzRXh0cmFjdG9yIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgU0lOR0xFX1RBQkxFIGFuZCBKT0lORUQgaW5oZXJpdGFuY2UgCi0gICAgICAgICAqIHN0cmF0ZWdpZXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBJZiBhIENsYXNzRXh0cmFjdG9yIGlzIHVzZWQgdGhlbiBhIERpc2NyaW1pbmF0b3JDb2x1bW4gY2Fubm90IGJlIHVzZWQuIEEgCi0gICAgICAgICAqIENsYXNzRXh0cmFjdG9yIGFsc28gY2Fubm90IGJlIHVzZWQgb24gZWl0aGVyIHRoZSByb290IG9yIGl0cyBzdWJjbGFzc2VzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSW4gYWRkaXRpb24sIGZvciBtb3JlIGNvbXBsZXggY29uZmlndXJhdGlvbnMgdXNpbmcgYSBDbGFzc0V4dHJhY3RvciBhbmQgYSAKLSAgICAgICAgICogU0lOR0xFX1RBQkxFIHN0cmF0ZWd5LCB0aGUgZGVzY3JpcHRvcidzIHdpdGhBbGxTdWJjbGFzc2VzIGFuZCBvbmx5SW5zdGFuY2VzIAotICAgICAgICAgKiBleHByZXNzaW9ucyBzaG91bGQgYmUgc2V0IHRocm91Z2ggdGhlIENsYXNzRXh0cmFjdG9yJ3MgaW5pdGlhbGl6ZSBtZXRob2QuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuSW5oZXJpdGFuY2VQb2xpY3kuc2V0V2l0aEFsbFN1YmNsYXNzZXNFeHByZXNzaW9uKEV4cHJlc3Npb24pCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuSW5oZXJpdGFuY2VQb2xpY3kuc2V0T25seUluc3RhbmNlc0V4cHJlc3Npb24oRXhwcmVzc2lvbikKLSAgICAgICAgICogCi0gICAgICAgICAqIEBhdXRob3IgR3V5IFBlbGxldGllcgotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4xIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENsYXNzRXh0cmFjdG9yIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKFJlcXVpcmVkKSBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBleHRyYWN0b3IgdGhhdCBzaG91bGQgYmUgCi0gICAgICAgICAgICAgKiBhcHBsaWVkIHRvIHRoaXMgZW50aXR5J3MgZGVzY3JpcHRvci4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ2xhc3MgdmFsdWUoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsb25lLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5DbG9uZUNvcHlQb2xpY3kgb24gYW4gCi0gICAgICAgICAqIEVudGl0eS4gQSBDbG9uZUNvcHlQb2xpY3kgbXVzdCBzcGVjaWZ5IGF0IG9uZSBvciBib3RoIG9mIHRoZSAibWV0aG9kIiAKLSAgICAgICAgICogb3IgIndvcmtpbmdDb3B5TWV0aG9kIi4gIndvcmtpbmdDb3B5TWV0aG9kIiBpcyB1c2VkIHRvIGNsb25lIG9iamVjdHMgCi0gICAgICAgICAqIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgdXNlciBhcyB0aGV5IGFyZSByZWdpc3RlcmVkIGluIAotICAgICAgICAgKiBFY2xpcHNlTGluaydzIHRyYW5zYWN0aW9uYWwgbWVjaGFuaXNtLCB0aGUgVW5pdE9mV29yay4gIm1ldGhvZCIgd2lsbCAKLSAgICAgICAgICogYmUgdXNlZCBmb3IgdGhlIGNsb25lIHRoYXQgaXMgdXNlZCBmb3IgY29tcGFyaXNvbiBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5Ci0gICAgICAgICAqICAKLSAgICAgICAgICogQSBDbG9uZUNvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MKLSAgICAgICAgICogb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiKQotICAgICAgICAgKiAKLSAgICAgICAgICogb3I6Ci0gICAgICAgICAqIAotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kobWV0aG9kPSJteUNsb25lTWV0aG9kIiwgd29ya2luZ0NvcHlNZXRob2Q9Im15V29ya2luZ0NvcHlDbG9uZU1ldGhvZCIpCi0gICAgICAgICAqIAotICAgICAgICAgKiBvcjoKLSAgICAgICAgICogCi0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeSh3b3JraW5nQ29weU1ldGhvZE5hbWU9Im15V29ya2luZ0NvcHlDbG9uZSIpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDbG9uZUNvcHlQb2xpY3kgewotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkKLSAgICAgICAgICAgICAqIEVpdGhlciBtZXRob2Qgb3Igd29ya2luZ0NvcHlNZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQgdGhpcyBkZWZpbmVzIAotICAgICAgICAgICAgICogYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCB3aWxsIGJlIHVzZWQgCi0gICAgICAgICAgICAgKiBmb3IgY29tcGFyaXNvbiBieQotICAgICAgICAgICAgICogRWNsaXBzZUxpbmsncyBEZWZlcnJlZENoYW5nZURldGVjdGlvblBvbGljeQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZAotICAgICAgICAgICAgICogdGhpcyBkZWZpbmVzIGEgbWV0aG9kIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNsb25lIHRoYXQgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBvYmplY3QgcmV0dXJuZWQgd2hlbiByZWdpc3RlcmluZyBhbiAKLSAgICAgICAgICAgICAqIE9iamVjdCBpbiBhbiBFY2xpcHNlTGluayBVbml0T2ZXb3JrCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyB3b3JraW5nQ29weU1ldGhvZCgpOwotCi0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ3b3JraW5nLWNvcHktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2xsZWN0aW9uVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sbGVjdGlvblRhYmxlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRhYmxlLiBJZiBpdCBpcyBub3QgCi0gICAgICAgICAgICogc3BlY2lmaWVkLCBpdCBpcyBkZWZhdWx0ZWQgdG8gdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGZvbGxvd2luZzogCi0gICAgICAgICAgICogdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBlbnRpdHk7ICJfIiA7IHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgCi0gICAgICAgICAgICogcHJvcGVydHkgb3IgZmllbGQgb2YgdGhlIHNvdXJjZSBlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhdGFsb2cgb2YgdGhlIHRhYmxlLiBJdCBkZWZhdWx0cyB0byB0aGUgcGVyc2lzdGVuY2UgCi0gICAgICAgICAgICogdW5pdCBkZWZhdWx0IGNhdGFsb2cuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNjaGVtYSBvZiB0aGUgdGFibGUuIEl0IGRlZmF1bHRzIHRvIHRoZSBwZXJzaXN0ZW5jZSAKLSAgICAgICAgICAgKiB1bml0IGRlZmF1bHQgc2NoZW1hLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVXNlZCB0byBzcGVjaWZ5IGEgcHJpbWFyeSBrZXkgY29sdW1uIHRoYXQgaXMgdXNlZCBhcyBhIAotICAgICAgICAgICAqIGZvcmVpZ24ga2V5IHRvIGpvaW4gdG8gYW5vdGhlciB0YWJsZS4gSWYgdGhlIHNvdXJjZSBlbnRpdHkgdXNlcyBhIAotICAgICAgICAgICAqIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSwgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBtdXN0IGJlIHNwZWNpZmllZCAKLSAgICAgICAgICAgKiBmb3IgZWFjaCBmaWVsZCBvZiB0aGUgY29tcG9zaXRlIHByaW1hcnkga2V5LiBJbiBhIHNpbmdsZSBwcmltYXJ5IAotICAgICAgICAgICAqIGtleSBjYXNlLCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG1heSBvcHRpb25hbGx5IGJlIHNwZWNpZmllZC4gCi0gICAgICAgICAgICogRGVmYXVsdGluZyB3aWxsIGFwcGx5IG90aGVyd2lzZSBhcyBmb2xsb3dzOgotICAgICAgICAgICAqIG5hbWUsIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgcHJpbWFyeSB0YWJsZSAKLSAgICAgICAgICAgKiBvZiB0aGUgc291cmNlIGVudGl0eS4gcmVmZXJlbmNlZENvbHVtbk5hbWUsIHRoZSBzYW1lIG5hbWUgb2YgCi0gICAgICAgICAgICogcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSBwcmltYXJ5IHRhYmxlIG9mIHRoZSBzb3VyY2UgZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsgCi0gCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVbmlxdWUgY29uc3RyYWludHMgdGhhdCBhcmUgdG8gYmUgcGxhY2VkIG9uIHRoZSB0YWJsZS4gCi0gICAgICAgICAgICogVGhlc2UgYXJlIG9ubHkgdXNlZCBpZiB0YWJsZSBnZW5lcmF0aW9uIGlzIGluIGVmZmVjdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OyAKLSAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgotICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVyc2lvbi12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVyc2lvblZhbHVlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIGRhdGFiYXNlIHZhbHVlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBkYXRhVmFsdWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgb2JqZWN0IHZhbHVlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBvYmplY3RWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlIGFjcm9zcyAKLSAgICAgICAgICAgKiB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY29udmVydGVyIGNsYXNzIHRvIGJlIHVzZWQuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQKLSAgICAgICAgICAgKiB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuY29udmVydGVycy5Db252ZXJ0ZXIgaW50ZXJmYWNlLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGNvbnZlcnRlckNsYXNzKCk7IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uLXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uUmVzdWx0IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENvcHlQb2xpY3kgaXMgdXNlZCB0byBzZXQgYSAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5IG9uIGFuIEVudGl0eS4KLSAgICAgICAgICogSXQgaXMgcmVxdWlyZWQgdGhhdCBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5IGJlIHNwZWNpZmllZCAKLSAgICAgICAgICogYXMgdGhlIGFyZ3VtZW50LgotICAgICAgICAgKiAKLSAgICAgICAgICogQSBDb3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzIG9yIAotICAgICAgICAgKiBFbWJlZGRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogRm9yIGluc3RhbmNlOgotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDb3B5UG9saWN5KCJleGFtcGxlLk15Q29weVBvbGljeSIpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb3B5UG9saWN5IHsKLQotICAgICAgICAvKgotICAgICAgICAqIChSZXF1aXJlZCkKLSAgICAgICAgKiBUaGlzIGRlZmluZXMgdGhlIGNsYXNzIG9mIHRoZSBjb3B5IHBvbGljeS4gSXQgbXVzdCBzcGVjaWZ5IGEgY2xhc3MgCi0gICAgICAgICogdGhhdCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ29weVBvbGljeQotICAgICAgICAqLwotICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiRFRZUEUiOwotICAgICAgICAgIERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKCkgZGVmYXVsdCBTVFJJTkc7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDMxOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci10eXBlIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBEaXNjcmltaW5hdG9yQ2xhc3MgaXMgdXNlZCB3aXRoaW4gYSBWYXJpYWJsZU9uZVRvT25lIGFubm90YXRpb24uCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7fSkgCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNsYXNzIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBkaXNjcmltaW5hdG9yIHRvIGJlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIAotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBkaXNjcmltaW5hdG9yKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjbGFzcyB0byB0aGUgaW5zdGFudGlhdGVkIHdpdGggdGhlIGdpdmVuIAotICAgICAgICAgICAqIGRpc2NyaW1pbmF0b3IuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRGlzY3JpbWluYXRvclR5cGUgeyBTVFJJTkcsIENIQVIsIElOVEVHRVIgfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUUklORyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBUiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5URUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yVmFsdWUgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVsZW1lbnQtY29sbGVjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVsZW1lbnRDb2xsZWN0aW9uIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWNvbHVtbiIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNsYXNzIiB0eXBlPSJvcm06bWFwLWtleS1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06dGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1lbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTplbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXR0cmlidXRlLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06dGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06ZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmxvYiIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTpjb2xsZWN0aW9uLXRhYmxlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkYWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgZW1iZWRkYWJsZSBvYmplY3RzLiBJcyAKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCi0gICAgICAgIGluIHRoZSBjbGFzcy4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwgCi0gICAgICAgIGJlIHJlY3Vyc2l2ZWx5IGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkYWJsZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkLWlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWRJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgYW4gZW50aXR5IGxpc3RlbmVyIHRvIGJlIGludm9rZWQgYXQgbGlmZWN5Y2xlIGV2ZW50cwotICAgICAgICBmb3IgdGhlIGVudGl0aWVzIHRoYXQgbGlzdCB0aGlzIGxpc3RlbmVyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlMaXN0ZW5lcnMgewotICAgICAgICAgIENsYXNzW10gdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXIiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eVJlc3VsdCB7Ci0gICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MoKTsKLSAgICAgICAgICBGaWVsZFJlc3VsdFtdIGZpZWxkcygpIGRlZmF1bHQge307Ci0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkLXJlc3VsdCIgdHlwZT0ib3JtOmZpZWxkLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImVudGl0eS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW0tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEVudW1UeXBlIHsKLSAgICAgICAgICBPUkRJTkFMLAotICAgICAgICAgIFNUUklORwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUkRJTkFMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtZXJhdGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW51bWVyYXRlZCB7Ci0gICAgICAgICAgRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOmVudW0tdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmZXRjaC1hdHRyaWJ1dGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGZXRjaEF0dHJpYnV0ZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgZmV0Y2ggYXR0cmlidXRlIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmV0Y2gtZ3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGZXRjaEdyb3VwIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBmZXRjaCBncm91cCBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBJbmRpY2F0ZXMgd2hldGhlciBhbGwgcmVsYXRpb25zaGlwIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgKiBzcGVjaWZpZWQgaW4gdGhlIGZldGNoIGdyb3VwIHNob3VsZCBiZSBsb2FkZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBsb2FkKCkgZGVmYXVsdCB0cnVlOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGxpc3Qgb2YgYXR0cmlidXRlcyB0byBmZXRjaC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiIHR5cGU9Im9ybTpmZXRjaC1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibG9hZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEZldGNoVHlwZSB7IExBWlksIEVBR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQVpZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEZpZWxkUmVzdWx0IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgR2VuZXJhdGVkVmFsdWUgewotICAgICAgICAgIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBBVVRPOwotICAgICAgICAgIFN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmdlbmVyYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJnZW5lcmF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBHZW5lcmF0aW9uVHlwZSB7IFRBQkxFLCBTRVFVRU5DRSwgSURFTlRJVFksIEFVVE8gfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRVFVRU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURFTlRJVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImdlbmVyYXRlZC12YWx1ZSIgdHlwZT0ib3JtOmdlbmVyYXRlZC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZC1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkQ2xhc3MgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImlkLXZhbGlkYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBJZFZhbGlkYXRpb24gZW51bSBkZXRlcm1pbmVzIHRoZSB0eXBlIHZhbHVlIHRoYXQgYXJlIHZhbGlkIGZvciBhbiBJZC4KLSAgICAgICAgICogQnkgZGVmYXVsdCBudWxsIGlzIG5vdCBhbGxvd2VkLCBhbmQgMCBpcyBub3QgYWxsb3cgZm9yIHNpbmdsZXRvbiBpZHMgb2YgbG9uZyBvciBpbnQgdHlwZS4KLSAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgWkVSTyBmb3Igc2luZ2xldG9uIGlkcywgYW5kIE5VTEwgZm9yIGNvbXBvc2l0ZSBpZHMuCi0gICAgICAgICAqIFRoaXMgY2FuIGJlIHNldCB1c2luZyB0aGUgQFByaW1hcnlLZXkgYW5ub3RhdGlvbiwgb3IgQ2xhc3NEZXNjcmlwdG9yIEFQSS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgUHJpbWFyeUtleQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLkNsYXNzRGVzY3JpcHRvciNzZXRJZFZhbGlkYXRpb24oSWRWYWxpZGF0aW9uKQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMCAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBJZFZhbGlkYXRpb24gewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBPbmx5IG51bGwgaXMgbm90IGFsbG93ZWQgYXMgYW4gaWQgdmFsdWUsIDAgaXMgYWxsb3dlZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTlVMTCwKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBudWxsIGFuZCAwIGFyZSBub3QgYWxsb3dlZCwgKG9ubHkgaW50IGFuZCBsb25nKS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgWkVSTywKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBObyBpZCB2YWxpZGF0aW9uIGlzIGRvbmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVUxMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaRVJPIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLWtleS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ29uZmlndXJlcyB3aGF0IHR5cGUgb2YgSWQgdmFsdWUgaXMgdXNlZCB0byBzdG9yZSB0aGUgb2JqZWN0IGluIHRoZSBjYWNoZS4KLSAgICAgICAgICAgICAqIFRoaXMgY2FuIGVpdGhlciBiZSB0aGUgYmFzaWMgSWQgdmFsdWUgZm9yIHNpbXBsZSBzaW5nbGV0b24gSWRzLAotICAgICAgICAgICAgICogb3IgYW4gb3B0aW1pemVkIENhY2hlS2V5IHR5cGUuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgUHJpbWFyeUtleSNjYWNoZUtleVR5cGUoKQotICAgICAgICAgICAgICogQHNlZSBDbGFzc0Rlc2NyaXB0b3Ijc2V0Q2FjaGVLZXlUeXBlKENhY2hlS2V5VHlwZSkKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgZW51bSBDYWNoZUtleVR5cGUgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoaXMgY2FuIG9ubHkgYmUgdXNlZCBmb3Igc2ltcGxlIHNpbmdsZXRvbiBJZHMsIHN1Y2ggYXMgbG9uZy9pbnQvU3RyaW5nLgotICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIHNpbXBsZSBzaW5nbGV0b24gSWRzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIElEX1ZBTFVFLAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogT3B0aW1pemVkIGNhY2hlIGtleSB0eXBlIHRoYXQgYWxsb3dzIGNvbXBvc2l0ZSBhbmQgY29tcGxleCB2YWx1ZXMuCi0gICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgY29tcG9zaXRlIG9yIGNvbXBsZXggSWRzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIENBQ0hFX0tFWSwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoZSBjYWNoZSBrZXkgdHlwZSBpcyBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZWQgZGVwZW5kaW5nIG9uIHdoYXQgaXMgb3B0aW1hbCBmb3IgdGhlIGNsYXNzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEFVVE8KLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURfVkFMVUUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQ0hFX0tFWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmhlcml0YW5jZSB7Ci0gICAgICAgICAgSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBTSU5HTEVfVEFCTEU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06aW5oZXJpdGFuY2UtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUKLSAgICAgICAgICB7IFNJTkdMRV9UQUJMRSwgSk9JTkVELCBUQUJMRV9QRVJfQ0xBU1N9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lOR0xFX1RBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT0lORUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFX1BFUl9DTEFTUyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5JbnN0YW50aWF0aW9uQ29weVBvbGljeSAKLSAgICAgICAgICogb24gYW4gRW50aXR5LiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB0aGUgZGVmYXVsdCBDb3B5UG9saWN5IGluIAotICAgICAgICAgKiBFY2xpcHNlTGluayBhbmQgdGhlcmVmb3JlIHRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaXMgb25seSB1c2VkIHRvIAotICAgICAgICAgKiBvdmVycmlkZSBvdGhlciB0eXBlcyBvZiBjb3B5IHBvbGljaWVzCi0gICAgICAgICAqIAotICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3Mgb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQEluc3RhbnRpYXRpb25Db3B5UG9saWN5IAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgewotICAgICAgICB9Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEpvaW5GZXRjaFR5cGUgewotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBkb2VzIG5vdCBhbGxvdyBmb3IgbnVsbC9lbXB0eSB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBJTk5FUiwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBhbGxvd3MgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgotICAgICAgICAgKi8KLSAgICAgICAgT1VURVIsCi0gICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTk5FUiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VURVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJiYXRjaC1mZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBwdWJsaWMgZW51bSBCYXRjaEZldGNoVHlwZSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3JtIG9mIGJhdGNoIHJlYWRpbmcuCi0gICAgICAgICAgICAgICAgICogVGhlIG9yaWdpbmFsIHF1ZXJ5J3Mgc2VsZWN0aW9uIGNyaXRlcmlhIGlzIGpvaW5lZCB3aXRoIHRoZSBiYXRjaCBxdWVyeS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBKT0lOLAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhpcyB1c2VzIGFuIFNRTCBFWElTVFMgYW5kIGEgc3ViLXNlbGVjdCBpbiB0aGUgYmF0Y2ggcXVlcnkgaW5zdGVhZCBvZiBhIGpvaW4uCi0gICAgICAgICAgICAgICAgICogVGhpcyBoYXMgdGhlIGFkdmFudGFnZSBvZiBub3QgcmVxdWlyaW5nIGFuIFNRTCBESVNUSU5DVCB3aGljaCBjYW4gaGF2ZSBpc3N1ZXMKLSAgICAgICAgICAgICAgICAgKiB3aXRoIExPQnMsIG9yIG1heSBiZSBtb3JlIGVmZmljaWVudCBmb3Igc29tZSB0eXBlcyBvZiBxdWVyaWVzIG9yIG9uIHNvbWUgZGF0YWJhc2VzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEVYSVNUUywKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoaXMgdXNlcyBhbiBTUUwgSU4gY2xhdXNlIGluIHRoZSBiYXRjaCBxdWVyeSBwYXNzaW5nIGluIHRoZSBzb3VyY2Ugb2JqZWN0IElkcy4KLSAgICAgICAgICAgICAgICAgKiBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIG9mIG9ubHkgc2VsZWN0aW5nIHRoZSBvYmplY3RzIG5vdCBhbHJlYWR5IGNvbnRhaW5lZCBpbiB0aGUgY2FjaGUsCi0gICAgICAgICAgICAgICAgICogYW5kIGNhbiB3b3JrIGJldHRlciB3aXRoIGN1cnNvcnMsIG9yIGlmIGpvaW5zIGNhbm5vdCBiZSB1c2VkLgotICAgICAgICAgICAgICAgICAqIFRoaXMgbWF5IG9ubHkgd29yayBmb3Igc2luZ2xldG9uIElkcyBvbiBzb21lIGRhdGFiYXNlcy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBJTiAgICAKLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPSU4iLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVYSVNUUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gaW52ZXJzZUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZlcnNlLWpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvYiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIExvYiB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvY2stbW9kZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gTG9ja01vZGVUeXBlIHsgUkVBRCwgV1JJVEUsIE9QVElNSVNUSUMsIE9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5ULCBQRVNTSU1JU1RJQ19SRUFELCBQRVNTSU1JU1RJQ19XUklURSwgUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5ULCBOT05FfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFQUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldSSVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUFRJTUlTVElDIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEVTU0lNSVNUSUNfUkVBRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEVTU0lNSVNUSUNfV1JJVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotCi0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWNvbHVtbiIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktdGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06ZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9PbmUgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPiAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBzLWlkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlDbGFzcyB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5Q29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7Ci0gICAgICAgICAgaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBwcmVjaXNpb24KLSAgICAgICAgICBpbnQgc2NhbGUoKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgc2NhbGUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhIG1hcHBlZCBzdXBlcmNsYXNzLiBJcyAKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCi0gICAgICAgIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5IAotICAgICAgICBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBwZWRTdXBlcmNsYXNze30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5IiB0eXBlPSJvcm06cHJpbWFyeS1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtaW50ZXJjZXB0b3IiIHR5cGU9Im9ybTpjYWNoZS1pbnRlcmNlcHRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmV0Y2gtZ3JvdXAiIHR5cGU9Im9ybTpmZXRjaC1ncm91cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvcHktcG9saWN5IiB0eXBlPSJvcm06Y29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgICAgICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnktcmVkaXJlY3RvcnMiIHR5cGU9Im9ybTpxdWVyeS1yZWRpcmVjdG9ycyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBhcmVudC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FjaGVhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGlzdGVuY2UtY2hlY2tpbmciIHR5cGU9Im9ybTpleGlzdGVuY2UtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkTmF0aXZlUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsgLy9uYW1lZCBTcWxSZXN1bHRTZXRNYXBwaW5nCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgTG9ja01vZGVUeXBlIGxvY2tNb2RlKCkgZGVmYXVsdCBOT05FOwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NrLW1vZGUiIHR5cGU9Im9ybTpsb2NrLW1vZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24gYWxsb3dzIHRoZSBkZWZpbml0aW9uIG9mIAotICAgICAgICAgKiBxdWVyaWVzIHRoYXQgY2FsbCBzdG9yZWQgcHJvY2VkdXJlcyBhcyBuYW1lZCBxdWVyaWVzLgotICAgICAgICAgKiBBIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHkgb3IKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcy4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBVbmlxdWUgbmFtZSB0aGF0IHJlZmVyZW5jZXMgdGhpcyBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFF1ZXJ5IGhpbnRzLgotICAgICAgICAgICAqLwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgUmVmZXJzIHRvIHRoZSBjbGFzcyBvZiB0aGUgcmVzdWx0LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgU1FMUmVzdWx0TWFwcGluZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZygpIGRlZmF1bHQgIiI7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBwcm9jZWR1cmVOYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIHF1ZXJ5IHNob3VsZCByZXR1cm4gYSByZXN1bHQgc2V0LgotICAgICAgICAgICAqLwotICAgICAgICAgIGJvb2xlYW4gcmV0dXJuc1Jlc3VsdFNldCgpIGRlZmF1bHQgdHJ1ZTsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgYXJndW1lbnRzIHRvIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyIiB0eXBlPSJvcm06c3RvcmVkLXByb2NlZHVyZS1wYXJhbWV0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJvY2VkdXJlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm5zLXJlc3VsdC1zZXQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9iamVjdFR5cGVDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZQotICAgICAgICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICAgICAgKiBmaWVsZCBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IAotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIGNvbnZlcnNpb24gdmFsdWVzIHRvIGJlIHVzZWQgCi0gICAgICAgICAgICogd2l0aCB0aGUgb2JqZWN0IGNvbnZlcnRlci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJzaW9uVmFsdWVbXSBjb252ZXJzaW9uVmFsdWVzKCk7Ci0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSBhIGRlZmF1bHQgb2JqZWN0IHZhbHVlLiBVc2VkIGZvciAKLSAgICAgICAgICAgICogbGVnYWN5IGRhdGEgaWYgdGhlIGRhdGEgdmFsdWUgaXMgbWlzc2luZy4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgIFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIiB0eXBlPSJvcm06Y29udmVyc2lvbi12YWx1ZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtb2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1tYW55Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWNvbHVtbiIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktdGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06ZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTptYXAta2V5LWpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgIDwveHNkOmNob2ljZT4KLSAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcGVkLWJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JwaGFuLXJlbW92YWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBvcnBoYW5SZW1vdmFsKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBzLWlkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAqIG9wdGltaXN0aWMgbG9ja2luZyBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgCi0gICAgICAgICAqIGVudGl0aWVzLiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24KLSAgICAgICAgICogYW4gZW50aXR5IG9yIG1hcHBlZC1zdXBlcmNsYXNzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSXQgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBvcHRpbWlzdGljLWxvY2tpbmctdHlwZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcHRpbWlzdGljTG9ja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHRvIHVzZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPcHRpbWlzdGljTG9ja2luZ1R5cGUgdHlwZSgpIGRlZmF1bHQgVkVSU0lPTl9DT0xVTU47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IG9mIHR5cGUgCi0gICAgICAgICAgICogU0VMRUNURURfQ09MVU1OUywgdGhpcyBhbm5vdGF0aW9uIG1lbWJlciBiZWNvbWVzIGEgKFJlcXVpcmVkKSAKLSAgICAgICAgICAgKiBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBzZWxlY3RlZENvbHVtbnMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHdoZXJlIHRoZSBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHNob3VsZCAKLSAgICAgICAgICAgKiBjYXNjYWRlIGxvY2suIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB3aXRoIFZFUlNJT05fQ09MVU1OIGxvY2tpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBjYXNjYWRlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWxlY3RlZC1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FzY2FkZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmctdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBzaW1wbGUgdHlwZSB0aGF0IGlzIHVzZWQgd2l0aGluIGFuIG9wdGltaXN0aWMtbG9ja2luZyAKLSAgICAgICAgICogc3BlY2lmaWNhdGlvbiB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIG9wdGltaXN0aWMtbG9ja2luZyB0aGF0Ci0gICAgICAgICAqIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyBlbnRpdGllcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIE9wdGltaXN0aWNMb2NraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGV2ZXJ5IGZpZWxkIGluIHRoZSB0YWJsZQotICAgICAgICAgICAqIGluIHRoZSBXSEVSRSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUgb3IgYSBkZWxldGUuIElmIGFueSBmaWVsZAotICAgICAgICAgICAqIGhhcyBiZWVuIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgQUxMX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgb25seSB0aGUgY2hhbmdlZCBmaWVsZHMKLSAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBBIGRlbGV0ZQotICAgICAgICAgICAqIHdpbGwgb25seSBjb21wYXJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDSEFOR0VEX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBjb21wYXJlcyBzZWxlY3RlZCBmaWVsZHMgaW4gdGhlIFdIRVJFCi0gICAgICAgICAgICogY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBOb3RlIHRoYXQKLSAgICAgICAgICAgKiB0aGUgZmllbGRzIHNwZWNpZmllZCBtdXN0IGJlIG1hcHBlZCBhbmQgbm90IGJlIHByaW1hcnkga2V5cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRUxFQ1RFRF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGEgc2luZ2xlIHZlcnNpb24gbnVtYmVyCi0gICAgICAgICAgICogaW4gdGhlIHdoZXJlIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gVGhlIHZlcnNpb24gZmllbGQgbXVzdCBiZQotICAgICAgICAgICAqIG1hcHBlZCBhbmQgbm90IGJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBWRVJTSU9OX0NPTFVNTgotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMTF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFOR0VEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTEVDVEVEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZFUlNJT05fQ09MVU1OIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+ICAKLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJCeSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9yZGVyLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29ycmVjdGlvbi10eXBlIiB0eXBlPSJvcm06b3JkZXItY29sdW1uLWNvcnJlY3Rpb24tdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWNvbHVtbi1jb3JyZWN0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBPcmRlckNvcnJlY3Rpb25UeXBlIHsKLSAgICAgICAgICBSRUFELAotICAgICAgICAgIFJFQURfV1JJVEUsCi0gICAgICAgICAgRVhDRVBUSU9OCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFQUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFQURfV1JJVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVYQ0VQVElPTiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LWxvYWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RMb2FkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcGVyc2lzdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVJlbW92ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVVwZGF0ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBUaGUgUHJpbWFyeUtleSBhbm5vdGF0aW9uIGFsbG93cyBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9mIHRoZSBJZC4KLSAgICAgICAgICogIEEgdmFsaWRhdGlvbiBwb2xpY3kgY2FuIGJlIGdpdmVuIHRoYXQgYWxsb3dzIHNwZWNpZnlpbmcgaWYgemVybyBpcyBhIHZhbGlkIGlkIHZhbHVlLgotICAgICAgICAgKiAgVGhlIHNldCBvZiBwcmltYXJ5IGtleSBjb2x1bW5zIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBwcmVjaXNlbHkuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMQotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJpbWFyeUtleSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgaWQgdmFsaWRhdGlvbiBpcyBkb25lLgotICAgICAgICAgICAqIEJ5IGRlZmF1bHQgMCBpcyBub3QgYSB2YWxpZCBpZCB2YWx1ZSwgdGhpcyBjYW4gYmUgdXNlZCB0byBhbGxvdyAwIGlkIHZhbHVlcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJZFZhbGlkYXRpb24gdmFsaWRhdGlvbigpIGRlZmF1bHQgSWRWYWxpZGF0aW9uLlpFUk87IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgY2FjaGUga2V5IHR5cGUgaXMgdXNlZCB0byBzdG9yZSB0aGUgb2JqZWN0IGluIHRoZSBjYWNoZS4KLSAgICAgICAgICAgKiBCeSBkZWZhdWx0IHRoZSB0eXBlIGlzIGRldGVybWluZWQgYnkgd2hhdCB0eXBlIGlzIG9wdGltYWwgZm9yIHRoZSBjbGFzcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDYWNoZUtleVR5cGUgY2FjaGVLZXlUeXBlKCkgZGVmYXVsdCBDYWNoZUtleVR5cGUuQVVUTzsKLSAgICAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVzZWQgdG8gc3BlY2lmeSB0aGUgcHJpbWFyeSBrZXkgY29sdW1ucyBkaXJlY3RseS4KLSAgICAgICAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgQElkIGlmIHRoZSBwcmltYXJ5IGtleSBpbmNsdWRlcyBhIG5vbiBiYXNpYyBmaWVsZCwKLSAgICAgICAgICAgKiBzdWNoIGFzIGEgZm9yZWlnbiBrZXksIG9yIGEgaW5oZXJpdGFuY2UgZGlzY3JpbWluYXRvciwgZW1iZWRkZWQsIG9yIHRyYW5zZm9ybWF0aW9uIG1hcHBlZCBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWxpZGF0aW9uIiB0eXBlPSJvcm06aWQtdmFsaWRhdGlvbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlLWtleS10eXBlIiB0eXBlPSJvcm06Y2FjaGUta2V5LXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEEgdXNlciBkZWZpbmVkIG1hcHBpbmcncyBwcm9wZXJ0eS4KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgVFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJvcGVydHkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFByb3BlcnR5IG5hbWUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgUHJvcGVydHkgdmFsdWUsCi0gICAgICAgICAgICogY29udmVydGVkIHRvIGFuIGluc3RhbmNlIG9mIHZhbHVlVHlwZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBQcm9wZXJ0eSB2YWx1ZSB0eXBlLgotICAgICAgICAgICAqIFRoZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gdmFsdWVUeXBlIGJ5IENvbnZlcnNpb25NYW5hZ2VyLgotICAgICAgICAgICAqIElmIHNwZWNpZmllZCBtdXN0IGJlIGEgc2ltcGxlIHR5cGUgdGhhdCBjb3VsZCBiZSBoYW5kbGVkIGJ5IAotICAgICAgICAgICAqIENvbnZlcnNpb25NYW5hZ2VyOiAKLSAgICAgICAgICAgKiBudW1lcmljYWwsIGJvb2xlYW4sIHRlbXBvcmFsLiAgCi0gICAgICAgICAgICovIAotICAgICAgICAgIENsYXNzIHZhbHVlVHlwZSgpIGRlZmF1bHQgU3RyaW5nLmNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWhpbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpIAotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBRdWVyeUhpbnQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktcmVkaXJlY3RvcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLXB1YmxpYyBAaW50ZXJmYWNlIFF1ZXJ5UmVkaXJlY3RvcnMgewotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgQWxsUXVlcmllcyBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nIG9iamVjdCBxdWVyeQotICAgICAqIHRoYXQgZG9lcyBub3QgaGF2ZSBhIG1vcmUgcHJlY2lzZSByZWRpcmVjdG9yIChsaWtlIHRoZSAKLSAgICAgKiBSZWFkT2JqZWN0UXVlcnkgUmVkaXJlY3Rvcikgb3IgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogCi0gICAgICovCi0gICAgQ2xhc3MgYWxsUXVlcmllcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIERlZmF1bHQgUmVhZEFsbCBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogUmVhZEFsbFF1ZXJ5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIHJlZGlyZWN0b3Igc2V0IGRpcmVjdGx5IG9uIHRoZSBxdWVyeS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKiBGb3IgdXNlcnMgZXhlY3V0aW5nIGEgSlBBIFF1ZXJ5IHRocm91Z2ggdGhlIGdldFJlc3VsdExpc3QoKSBBUEkgdGhpcyBpcyB0aGUgcmVkaXJlY3RvciB0aGF0IHdpbGwgYmUgaW52b2tlZAotICAgICAqLwotICAgIENsYXNzIHJlYWRBbGwoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFJlYWRPYmplY3QgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIFJlYWRPYmplY3RRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogRm9yIHVzZXJzIGV4ZWN1dGluZyBhIEpQQSBRdWVyeSB0aHJvdWdoIHRoZSBnZXRTaW5nbGVSZXN1bHQoKSBBUEkgb3IgRW50aXR5TWFuYWdlci5maW5kKCkgdGhpcyBpcyB0aGUgcmVkaXJlY3RvciB0aGF0IHdpbGwgYmUgaW52b2tlZAotICAgICAqLwotICAgIENsYXNzIHJlYWRPYmplY3QoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFJlcG9ydFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBSZXBvcnRRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogRm9yIHVzZXJzIGV4ZWN1dGluZyBhIEpQQSBRdWVyeSB0aGF0IGNvbnRhaW5zIGFncmVnYXRlIGZ1bmN0aW9ucyBvciBzZWxlY3RzIG11bHRpcGxlIGVudGl0aWVzIHRoaXMgaXMgdGhlIHJlZGlyZWN0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQKLSAgICAgKi8KLSAgICBDbGFzcyByZXBvcnQoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFVwZGF0ZSBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogVXBkYXRlT2JqZWN0UXVlcnkgb3IgVXBkYXRlQWxsUXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAqIEluIEVjbGlwc2VMaW5rIGFuIFVwZGF0ZU9iamVjdFF1ZXJ5IGlzIGV4ZWN1dGVkIHdoZW5ldmVyIGZsdXNoaW5nIGNoYW5nZXMgdG8gdGhlIGRhdGFzb3VyY2UuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICovIAotICAgIENsYXNzIHVwZGF0ZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIERlZmF1bHQgSW5zZXJ0IFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBJbnNlcnRPYmplY3RRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogSW4gRWNsaXBzZUxpbmsgYW4gSW5zZXJ0T2JqZWN0UXVlcnkgaXMgZXhlY3V0ZWQgd2hlbiBwZXJzaXN0aW5nIGFuIG9iamVjdCB0byB0aGUgZGF0YXNvdXJjZS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKi8KLSAgICBDbGFzcyBpbnNlcnQoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IERlbGV0ZSBPYmplY3QgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIERlbGV0ZU9iamVjdFF1ZXJ5IG9yIERlbGV0ZUFsbFF1ZXJ5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIHJlZGlyZWN0b3Igc2V0IGRpcmVjdGx5IG9uIHRoZSBxdWVyeS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKi8KLSAgICBDbGFzcyBkZWxldGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLX0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGwtcXVlcmllcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtYWxsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vYmplY3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXBvcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkZWxldGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC10cmFuc2Zvcm1lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbm5vdGF0aW9uIGZvciBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0gICAgICAgICAqIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgCi0gICAgICAgICAqIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgCi0gICAgICAgICAqIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSZWFkVHJhbnNmb3JtZXIgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVc2VyLWRlZmluZWQgY2xhc3MgdGhhdCBtdXN0IGltcGxlbWVudCB0aGUgCi0gICAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy50cmFuc2Zvcm1lcnMuQXR0cmlidXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAgICAgKiBpbnRlcmZhY2UuIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCwgaXRzIAotICAgICAgICAgICAgICogYnVpbGRBdHRyaWJ1dGVWYWx1ZSB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSAKLSAgICAgICAgICAgICAqIGFzc2lnbmVkIHRvIHRoZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIENsYXNzIHRyYW5zZm9ybWVyQ2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLSAgICAgICAgICAgICAqIGEgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZSAobm90IGFzc2lnbnMgdGhlIHZhbHVlIHRvIAotICAgICAgICAgICAgICogdGhlIGF0dHJpYnV0ZSkuIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIAotICAgICAgICAgICAgICogc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmV0dXJuLWluc2VydCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFJldHVybkluc2VydCB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEEgUmV0dXJuSW5zZXJ0IGFubm90YXRpb24gYWxsb3dzIGZvciBJTlNFUlQgb3BlcmF0aW9ucyB0byByZXR1cm4gCi0gICAgICAgICAgICAgKiB2YWx1ZXMgYmFjayBpbnRvIHRoZSBvYmplY3QgYmVpbmcgd3JpdHRlbi4gVGhpcyBhbGxvd3MgZm9yIHRhYmxlIAotICAgICAgICAgICAgICogZGVmYXVsdCB2YWx1ZXMsIHRyaWdnZXIgb3Igc3RvcmVkIHByb2NlZHVyZXMgY29tcHV0ZWQgdmFsdWVzIHRvIAotICAgICAgICAgICAgICogYmUgc2V0IGJhY2sgaW50byB0aGUgb2JqZWN0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBib29sZWFuIHJldHVybk9ubHkoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm4tb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWNvbmRhcnktdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZWNvbmRhcnlUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwa0pvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlcXVlbmNlR2VuZXJhdG9yIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBzZXF1ZW5jZU5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAxOwotICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXF1ZW5jZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTcWxSZXN1bHRTZXRNYXBwaW5nIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIEVudGl0eVJlc3VsdFtdIGVudGl0aWVzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBDb2x1bW5SZXN1bHRbXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LXJlc3VsdCIgdHlwZT0ib3JtOmVudGl0eS1yZXN1bHQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tcmVzdWx0IiB0eXBlPSJvcm06Y29sdW1uLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0b3JlZC1wcm9jZWR1cmUtcGFyYW1ldGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBhbm5vdGF0aW9uIGlzIHVzZWQgd2l0aGluIGEgCi0gICAgICAgICAqIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbi4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGRpcmVjdGlvbiBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZSBwYXJhbWV0ZXIuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRGlyZWN0aW9uIGRpcmVjdGlvbigpIGRlZmF1bHQgSU47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgcXVlcnkgcGFyYW1ldGVyIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHF1ZXJ5UGFyYW1ldGVyKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIEphdmEgY2xhc3MgZGVzaXJlZCBiYWNrIGZyb20gdGhlIHByb2NlZHVyZSwgCi0gICAgICAgICAgICogdGhpcyBpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgcHJvY2VkdXJlLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBKREJDIHR5cGUgY29kZSwgdGhpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgCi0gICAgICAgICAgICogZnJvbSB0aGUgcHJvY2VkdXJlLgotICAgICAgICAgICAqLwotICAgICAgICAgIGludCBqZGJjVHlwZSgpIGRlZmF1bHQgLTE7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBKREJDIHR5cGUgbmFtZSwgdGhpcyBtYXkgYmUgcmVxdWlyZWQgZm9yIEFSUkFZIG9yIAotICAgICAgICAgICAqIFNUUlVDVCB0eXBlcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgamRiY1R5cGVOYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlyZWN0aW9uIiB0eXBlPSJvcm06ZGlyZWN0aW9uLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icXVlcnktcGFyYW1ldGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImpkYmMtdHlwZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3RydWN0Q29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAotICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IAotICAgICAgICAgICAqIGltcGxlbWVudCB0aGUgRWNsaXBzZUxpbmsgaW50ZXJmYWNlIAotICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLmNvbnZlcnRlcnMuQ29udmVydGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGNvbnZlcnRlcigpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5WYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMDsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUZW1wb3JhbCB7Ci0gICAgICAgICAgVGVtcG9yYWxUeXBlIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOnRlbXBvcmFsLXR5cGUiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBUZW1wb3JhbFR5cGUgewotICAgICAgICAgIERBVEUsIC8vIGphdmEuc3FsLkRhdGUKLSAgICAgICAgICBUSU1FLCAvLyBqYXZhLnNxbC5UaW1lCi0gICAgICAgICAgVElNRVNUQU1QIC8vIGphdmEuc3FsLlRpbWVzdGFtcAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREFURSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUVTVEFNUCIvPgotICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWUtb2YtZGF5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUaW1lT2ZEYXkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgSG91ciBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgaG91cigpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgTWludXRlIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBtaW51dGUoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2Vjb25kKCkgZGVmYXVsdCAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBNaWxsaXNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgbWlsbGlzZWNvbmQoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnRlcm5hbCB1c2UuIERvIG5vdCBtb2RpZnkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gc3BlY2lmaWVkKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJob3VyIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbnV0ZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWlsbGlzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2Zvcm1hdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbiBpcyBhbiBvcHRpb25hbCBhbm5vdGF0aW9uIGZvciAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgYWxsb3dzIHRvIG1hcCBhbiBhdHRyaWJ1dGUgdG8gb25lIG9yIG1vcmUgCi0gICAgICAgICAqIGRhdGFiYXNlIGNvbHVtbnMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbiBhbm5vdGF0aW9uIGlzIGFuIG9wdGlvbmFsIHBhcnQgb2YgCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBkZWZpbml0aW9uLiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyAKLSAgICAgICAgICogd3JpdGUtb25seSwgaXQgc2hvdWxkIGhhdmUgYSBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgCi0gICAgICAgICAqIHRyYW5zZm9ybWF0aW9uIG9mIGRhdGFiYXNlIGNvbHVtbihzKSB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotICAgICAgICAgKiBBbHNvIHVubGVzcyBpdCdzIGEgcmVhZC1vbmx5IG1hcHBpbmcsIGVpdGhlciBXcml0ZVRyYW5zZm9ybWVyIAotICAgICAgICAgKiBhbm5vdGF0aW9uIG9yIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24gc2hvdWxkIGJlIHNwZWNpZmllZC4gRWFjaCAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKLSAgICAgICAgICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIpLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUcmFuc2Zvcm1hdGlvbiB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSAKLSAgICAgICAgICAgICAqIHRoYXQgdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIAotICAgICAgICAgICAgICogaGludCB0byB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgCi0gICAgICAgICAgICAgKiBkZWZhdWx0cyB0byBFQUdFUi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBvcHRpb25hbCBlbGVtZW50IGlzIGEgaGludCBhcyB0byB3aGV0aGVyIHRoZSB2YWx1ZQotICAgICAgICAgICAgICogIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSBtYXkgYmUgbnVsbC4gSXQgaXMgZGlzcmVnYXJkZWQKLSAgICAgICAgICAgICAqICBmb3IgcHJpbWl0aXZlIHR5cGVzLCB3aGljaCBhcmUgY29uc2lkZXJlZCBub24tb3B0aW9uYWwuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhZC10cmFuc2Zvcm1lciIgdHlwZT0ib3JtOnJlYWQtdHJhbnNmb3JtZXIiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3cml0ZS10cmFuc2Zvcm1lciIgdHlwZT0ib3JtOndyaXRlLXRyYW5zZm9ybWVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zaWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRyYW5zaWVudCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUeXBlQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUKLSAgICAgICAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZSBmaWVsZCAKLSAgICAgICAgICAgKiBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IGZpZWxkIAotICAgICAgICAgICAqIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKiogCi0gICAgICAgICAqIFZhcmlhYmxlIG9uZSB0byBvbmUgbWFwcGluZ3MgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGEgcG9pbnRlciAKLSAgICAgICAgICogcmVmZXJlbmNlcyBiZXR3ZWVuIGEgamF2YSBvYmplY3QgYW5kIGFuIGltcGxlbWVudGVyIG9mIGFuIGludGVyZmFjZS4gCi0gICAgICAgICAqIFRoaXMgbWFwcGluZyBpcyB1c3VhbGx5IHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIHBvaW50ZXIgKHN0b3JlZCBpbiBhbiAKLSAgICAgICAgICogaW5zdGFuY2UgdmFyaWFibGUpIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG9iamVjdHMuIEluIHRoZSAKLSAgICAgICAgICogcmVsYXRpb25hbCBkYXRhYmFzZSB0YWJsZXMsIHRoZXNlIG1hcHBpbmdzIGFyZSBub3JtYWxseSBpbXBsZW1lbnRlZCAKLSAgICAgICAgICogdXNpbmcgYSBmb3JlaWduIGtleSBhbmQgYSB0eXBlIGNvZGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIFZhcmlhYmxlT25lVG9PbmUgY2FuIGJlIHNwZWNpZmllZCB3aXRoaW4gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBhbmQgRW1iZWRkYWJsZSBjbGFzcy4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIAotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZhcmlhYmxlT25lVG9PbmUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGludGVyZmFjZSBjbGFzcyB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhlIAotICAgICAgICAgICAqIGFzc29jaWF0aW9uLiBJZiBub3Qgc3BlY2lmaWVkIGl0IHdpbGwgYmUgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSAKLSAgICAgICAgICAgKiBvZiB0aGUgb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdGFyZ2V0SW50ZXJmYWNlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgb3BlcmF0aW9ucyB0aGF0IG11c3QgYmUgY2FzY2FkZWQgdG8gdGhlIHRhcmdldCBvZiAKLSAgICAgICAgICAgKiB0aGUgYXNzb2NpYXRpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAotICAgICAgICAgICAqIHRoYXQgdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIAotICAgICAgICAgICAqIGhpbnQgdG8gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIAotICAgICAgICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIGFzc29jaWF0aW9uIGlzIG9wdGlvbmFsLiBJZiBzZXQgdG8gZmFsc2UgCi0gICAgICAgICAgICogdGhlbiBhIG5vbi1udWxsIHJlbGF0aW9uc2hpcCBtdXN0IGFsd2F5cyBleGlzdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgZGlzY3JpbWluYXRvciBjb2x1bW4gd2lsbCBob2xkIHRoZSB0eXBlIAotICAgICAgICAgICAqIGluZGljYXRvcnMuIElmIHRoZSBEaXNjcmltaW5hdG9yQ29sdW1uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuYW1lIAotICAgICAgICAgICAqIG9mIHRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiBkZWZhdWx0cyB0byAiRFRZUEUiIGFuZCB0aGUgCi0gICAgICAgICAgICogZGlzY3JpbWluYXRvciB0eXBlIHRvIFNUUklORy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBEaXNjcmltaW5hdG9yQ29sdW1uIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0IEBEaXNjcmltaW5hdG9yQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbGlzdCBvZiBkaXNjcmltaW5hdG9yIHR5cGVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCAKLSAgICAgICAgICAgKiB0aGlzIFZhcmlhYmxlT25lVG9PbmUuIElmIG5vbmUgYXJlIHNwZWNpZmllZCB0aGVuIHRob3NlIGVudGl0aWVzIAotICAgICAgICAgICAqIHdpdGhpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCB0aGF0IGltcGxlbWVudCB0aGUgdGFyZ2V0IGludGVyZmFjZSAKLSAgICAgICAgICAgKiB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHR5cGVzLiBUaGUgZGlzY3JpbWluYXRvciB0eXBlIHdpbGwgCi0gICAgICAgICAgICogZGVmYXVsdCBhcyBmb2xsb3dzOgotICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBTVFJJTkc6IEVudGl0eS5uYW1lKCkKLSAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgQ0hBUjogRmlyc3QgbGV0dGVyIG9mIHRoZSAKLSAgICAgICAgICAgKiAgICBFbnRpdHkgY2xhc3MKLSAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgSU5URUdFUjogVGhlIG5leHQgaW50ZWdlciBhZnRlciAKLSAgICAgICAgICAgKiAgICB0aGUgaGlnaGVzdCBpbnRlZ2VyIGV4cGxpY2l0bHkgYWRkZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRGlzY3JpbWluYXRvckNsYXNzW10gZGlzY3JpbWluYXRvckNsYXNzZXMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY2xhc3MiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNsYXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWludGVyZmFjZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JwaGFuLXJlbW92YWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZlcnNpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBWZXJzaW9uIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndyaXRlLXRyYW5zZm9ybWVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFubm90YXRpb24gZm9yIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLlRyYW5zZm9ybWF0aW9uTWFwcGluZy4KLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKLSAgICAgICAgICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIpLgotICAgICAgICAgKiAgCi0gICAgICAgICAqIEEgc2luZ2xlIFdyaXRlVHJhbnNmb3JtZXIgbWF5IGJlIHNwZWNpZmllZCBkaXJlY3RseSBvbiB0aGUgbWV0aG9kIG9yIAotICAgICAgICAgKiBhdHRyaWJ1dGUuIE11bHRpcGxlIFdyaXRlVHJhbnNmb3JtZXJzIHNob3VsZCBiZSB3cmFwcGVkIGludG8gCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24uIE5vIFdyaXRlVHJhbnNmb3JtZXJzIHNwZWNpZmllZCBmb3IgCi0gICAgICAgICAqIHJlYWQtb25seSBtYXBwaW5nLiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyB3cml0ZS1vbmx5LCBpdCAKLSAgICAgICAgICogc2hvdWxkIGhhdmUgYSBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgCi0gICAgICAgICAqIGNvbHVtbihzKSB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFdyaXRlVHJhbnNmb3JtZXIgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVc2VyLWRlZmluZWQgY2xhc3MgdGhhdCBtdXN0IGltcGxlbWVudCB0aGUgCi0gICAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy50cmFuc2Zvcm1lcnMuRmllbGRUcmFuc2Zvcm1lciAKLSAgICAgICAgICAgICAqIGludGVyZmFjZS4gVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkLCBpdHMgYnVpbGRGaWVsZFZhbHVlIAotICAgICAgICAgICAgICogd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBkYXRhYmFzZSAKLSAgICAgICAgICAgICAqIGNvbHVtbi4gTm90ZSB0aGF0IGZvciBkZGwgZ2VuZXJhdGlvbiBhbmQgcmV0dXJuaW5nIHRvIGJlIAotICAgICAgICAgICAgICogc3VwcG9ydGVkIHRoZSBtZXRob2QgYnVpbGRGaWVsZFZhbHVlIGluIHRoZSBjbGFzcyBzaG91bGQgYmUgCi0gICAgICAgICAgICAgKiBkZWZpbmVkIHRvIHJldHVybiB0aGUgcmVsZXZhbnQgSmF2YSB0eXBlLCBub3QganVzdCBPYmplY3QgYXMgCi0gICAgICAgICAgICAgKiBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2UsIGZvciBpbnN0YW5jZToKLSAgICAgICAgICAgICAqIHB1YmxpYyBUaW1lIGJ1aWxkRmllbGRWYWx1ZShPYmplY3QgaW5zdGFuY2UsIFN0cmluZyBmaWVsZE5hbWUsIFNlc3Npb24gc2Vzc2lvbikuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIENsYXNzIHRyYW5zZm9ybWVyQ2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLSAgICAgICAgICAgICAqIGEgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBkYXRhYmFzZSBjb2x1bW4uCi0gICAgICAgICAgICAgKiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgc3VwcG9ydGVkIHRoZSAKLSAgICAgICAgICAgICAqIG1ldGhvZCBzaG91bGQgYmUgZGVmaW5lZCB0byByZXR1cm4gYSBwYXJ0aWN1bGFyIHR5cGUsIG5vdCBqdXN0IAotICAgICAgICAgICAgICogT2JqZWN0LCBmb3IgaW5zdGFuY2U6Ci0gICAgICAgICAgICAgKiBwdWJsaWMgVGltZSBnZXRTdGFydFRpbWUoKS4KLSAgICAgICAgICAgICAqIFRoZSBtZXRob2QgbWF5IHJlcXVpcmUgYSBUcmFuc2llbnQgYW5ub3RhdGlvbiB0byBhdm9pZCBiZWluZyAKLSAgICAgICAgICAgICAqIG1hcHBlZCBhcyBCYXNpYyBieSBkZWZhdWx0LgotICAgICAgICAgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBTcGVjaWZ5IGhlcmUgdGhlIGNvbHVtbiBpbnRvIHdoaWNoIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbi4KLSAgICAgICAgICAgICAqIFRoZSBvbmx5IGNhc2Ugd2hlbiB0aGlzIGNvdWxkIGJlIHNraXBwZWQgaXMgaWYgYSBzaW5nbGUgCi0gICAgICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGFubm90YXRlcyBhbiBhdHRyaWJ1dGUgLSB0aGUgYXR0cmlidXRlJ3MgbmFtZSAKLSAgICAgICAgICAgICAqIHdpbGwgYmUgdXNlZCBhcyBhIGNvbHVtbiBuYW1lLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQ29sdW1uIGNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmF0Y2gtZmV0Y2giPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQmF0Y2hGZXRjaCBhbm5vdGF0aW9uIGNhbiBiZSB1c2VkIG9uIGFueSByZWxhdGlvbnNoaXAgbWFwcGluZywKLSAgICAgICAgICogKE9uZVRvT25lLCBNYW55VG9PbmUsIE9uZVRvTWFueSwgTWFueVRvTWFueSwgRWxlbWVudENvbGxlY3Rpb24sIEJhc2ljQ29sbGVjdGlvbiwgQmFzaWNNYXApLgotICAgICAgICAgKiBJdCBhbGxvd3MgdGhlIHJlbGF0ZWQgb2JqZWN0cyB0byBiZSBiYXRjaCByZWFkIGluIGEgc2luZ2xlIHF1ZXJ5LgotICAgICAgICAgKiBCYXRjaCBmZXRjaGluZyBjYW4gYWxzbyBiZSBzZXQgYXQgdGhlIHF1ZXJ5IGxldmVsLCBhbmQgaXQgaXMgCi0gICAgICAgICAqIG5vcm1hbGx5IHJlY29tbWVuZGVkIHRvIGRvIHNvIGFzIGFsbCBxdWVyaWVzIG1heSBub3QgcmVxdWlyZSBiYXRjaGluZy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4xCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXRjaEZldGNoIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBiYXRjaC1mZXRjaCB0byB1c2UuCi0gICAgICAgICAgICAgKiBFaXRoZXIgSk9JTiwgRVhJU1RTIG9yIElOLgotICAgICAgICAgICAgICogSk9JTiBpcyB0aGUgZGVmYXVsdC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIEJhdGNoRmV0Y2hUeXBlIHZhbHVlKCkgZGVmYXVsdCBCYXRjaEZldGNoVHlwZS5KT0lOOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIERlZmluZSB0aGUgZGVmYXVsdCBiYXRjaCBmZXRjaCBzaXplLgotICAgICAgICAgICAgICogVGhpcyBpcyBvbmx5IHVzZWQgZm9yIElOIHR5cGUgYmF0Y2ggcmVhZGluZyBhbmQgZGVmaW5lcwotICAgICAgICAgICAgICogdGhlIG51bWJlciBvZiBrZXlzIHVzZWQgaW4gZWFjaCBJTiBjbGF1c2UuCi0gICAgICAgICAgICAgKiBUaGUgZGVmYXVsdCBzaXplIGlzIDI1Niwgb3IgdGhlIHF1ZXJ5J3MgcGFnZVNpemUgZm9yIGN1cnNvciBxdWVyaWVzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpbnQgc2l6ZSgpIGRlZmF1bHQgLTE7Ci0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06YmF0Y2gtZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNpemUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLTwveHNkOnNjaGVtYT4KLQotCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMl8yLnhzZCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8yXzIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjMwMjllLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8yXzIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDc3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci08IS0tIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+IAotPCEtLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPiAKLTwhLS0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9yYWNsZSBUb3BMaW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgIHR3YXJlIC0gdXBkYXRlIHZlcnNpb24gbnVtYmVyIHRvIDIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgIDEyLzIvMjAwOS0yLjEgR3V5IFBlbGxldGllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIC0gMjk2Mjg5OiBBZGQgY3VycmVudCBhbm5vdGF0aW9uIG1ldGFkYXRhIHN1cHBvcnQgb24gbWFwcGVkIHN1cGVyY2xhc3NlcyB0byBFY2xpcHNlTGluay1PUk0uWE1MIFNjaGVtYSAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIC0gMjk2NjEyOiBBZGQgY3VycmVudCBhbm5vdGF0aW9uIG9ubHkgbWV0YWRhdGEgc3VwcG9ydCBvZiByZXR1cm4gaW5zZXJ0L3VwZGF0ZSB0byB0aGUgRWNsaXBzZUxpbmstT1JNLlhNTCBTY2hlbWEgICAgICAgICAtLT4KLTwhLS0gICAgICAgIC0gZm9ybWF0dGVkIHRvIG1hdGNoIG9ybV8yXzAueHNkIHNvIHRoYXQgdXNlcnMgY2FuIGVhc2lseSBjb21wYXJlIHRoZSB0d28gc2NoZW1hcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgIDUvNC8yMDEwLTIuMSBHdXkgUGVsbGV0aWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIC0gMjI3MjE5OiBFeHBhbmQgRWNsaXBzZUxpbmstT1JNLlhNTCBzY2hlbWEgZnVuY3Rpb25hbGl0eSBmb3IgMi4xIHJlbGVhc2UgICh1cGRhdGUgdmVyc2lvbiB0byAyLjEpICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgIDYvMTQvMjAxMC0yLjIgR3V5IFBlbGxldGllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIC0gMjQ3MDc4OiBlY2xpcHNlbGluay1vcm0ueG1sIHNjaGVtYSBzaG91bGQgYWxsb3cgbG9iIGFuZCBlbnVtZXJhdGVkIG9uIHZlcnNpb24gYW5kIGlkIG1hcHBpbmdzICh1cGRhdGUgdmVyc2lvbiB0byAyLjIpICAtLT4KLTwhLS0gICAgIDEwLzE1LzIwMTAtMi4yIEd1eSBQZWxsZXRpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgLSAzMjIwMDg6IEltcHJvdmUgdXNhYmlsaXR5IG9mIGFkZGl0aW9uYWwgY3JpdGVyaWEgYXBwbGllZCB0byBxdWVyaWVzIGF0IHRoZSBzZXNzaW9uL0VNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPCEtLSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBvYmplY3QtcmVsYXRpb25hbCBtYXBwaW5nIGZpbGUgc2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6b3JtPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLSAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiAKLSAgdmVyc2lvbj0iMi4yIj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWVjbGlwc2VsaW5rX29ybV8yXzIueHNkIDIuMiAgSnVuZSAxNCAyMDEwCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpkb2N1bWVudGF0aW9uPjwhW0NEQVRBWwotCi0gICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIG5hdGl2ZSBFY2xpcHNlbGluayBYTUwgbWFwcGluZyBmaWxlCi0gICAgICAgVGhlIGZpbGUgbWF5IGJlIG5hbWVkICJNRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiBpbiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICBhcmNoaXZlIG9yIGl0IG1heSBiZSBuYW1lZCBzb21lIG90aGVyIG5hbWUgd2hpY2ggd291bGQgYmUKLSAgICAgICB1c2VkIHRvIGxvY2F0ZSB0aGUgZmlsZSBhcyByZXNvdXJjZSBvbiB0aGUgY2xhc3NwYXRoLgotICAgICAgIE9iamVjdC9yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZXMgbXVzdCBpbmRpY2F0ZSB0aGUgb2JqZWN0L3JlbGF0aW9uYWwKLSAgICAgICBtYXBwaW5nIGZpbGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSBwZXJzaXN0ZW5jZSBuYW1lc3BhY2U6Ci0KLSAgICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtCi0KLSAgICAgICBhbmQgaW5kaWNhdGUgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieSB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0gICAgICAgPGVudGl0eS1tYXBwaW5ncyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSIKLSAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSAKLSAgICAgICBlY2xpcHNlbGlua19vcm1fMl8yLnhzZAotICAgICAgIHZlcnNpb249IjIuMiI+Ci0gICAgICAgLi4uCi0gICAgICAgPC9lbnRpdHktbWFwcGluZ3M+Ci0KLSAgICAgXV0+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiLz4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InZlcnNpb25UeXBlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldKyhcLlswLTldKykqIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWNjZXNzLW1ldGhvZHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWRkaXRpb25hbC1jcml0ZXJpYSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBhZGRpdGlvbmFsIGNyaXRlcmlhIGNhbiBiZSBzcGVjaWZpZWQgYXQgdGhlIEVudGl0eSBvciBNYXBwZWRTdXBlcmNsYXNzIAotICAgICAgICAgKiBsZXZlbC4gV2hlbiBzcGVjaWZpZWQgYXQgdGhlIG1hcHBlZCBzdXBlcmNsYXNzIGxldmVsLCBpdCBhcHBsaWVzIHRvIGFsbCAKLSAgICAgICAgICogaW5oZXJpdGluZyBlbnRpdGllcyB1bmxlc3MgdGhvc2UgZW50aXRpZXMgZGVmaW5lIHRoZWlyIG93biBhZGRpdGlvbmFsIAotICAgICAgICAgKiBjcml0ZXJpYSwgYXQgd2hpY2ggcG9pbnQgdGhlIGFkZGl0aW9uYWwgY3JpdGVyaWEgZnJvbSB0aGUgbWFwcGVkIHN1cGVyY2xhc3MgCi0gICAgICAgICAqIGlzIGlnbm9yZWQuICAKLSAgICAgICAgICoKLSAgICAgICAgICogVGhlIGFkZGl0aW9uYWwgY3JpdGVyaWEgc3VwcG9ydHMgYW55IHZhbGlkIEpQUUwgc3RyaW5nIGFuZCBtdXN0IHVzZSAndGhpcycgCi0gICAgICAgICAqIGFzIGFuIGFsaWFzIHRvIGZvcm0geW91ciBhZGRpdGlvbmFsIGNyaXRlcmlhLiBFLkcuLAotICAgICAgICAgKiAKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQWRkaXRpb25hbENyaXRlcmlhKCJ0aGlzLm51dC5zaXplID0gOk5VVF9TSVpFIGFuZCB0aGlzLm51dC5jb2xvciA9IDpOVVRfQ09MT1IiKQotICAgICAgICAgKiBwdWJsaWMgY2xhc3MgQm9sdCB7Li4ufQotICAgICAgICAgKiAKLSAgICAgICAgICogQWRkaXRpb25hbCBjcml0ZXJpYSBwYXJhbWV0ZXJzIGFyZSBhbHNvIGFjY2VwdGVkIGFuZCBhcmUgc2V0IHRocm91Z2ggCi0gICAgICAgICAqIHByb3BlcnRpZXMgb24gdGhlIGVudGl0eSBtYW5hZ2VyIGZhY3RvcnksIG9yIG9uIGFuIGVudGl0eSBtYW5hZ2VyLiBXaGVuIHNldCAKLSAgICAgICAgICogb24gdGhlIGVudGl0eSBtYW5hZ2VyLCB0aGUgcHJvcGVydGllcyBtdXN0IGJlIHNldCBiZWZvcmUgYW55IHF1ZXJ5IGV4ZWN1dGlvbgotICAgICAgICAgKiBhbmQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGZvciB0aGUgbGlmZSBzcGFuIG9mIHRoYXQgZW50aXR5IG1hbmFnZXIuCi0gICAgICAgICAqIAotICAgICAgICAgKiBQcm9wZXJ0aWVzIHNldCBvbiB0aGUgZW50aXR5IG1hbmFnZXIgd2lsbCBvdmVycmlkZSB0aG9zZSBzaW1pbGFybHkgbmFtZWQgCi0gICAgICAgICAqIHByb3BlcnRpZXMgc2V0IG9uIHRoZSBlbnRpdHkgbWFuYWdlciBmYWN0b3J5LgotICAgICAgICAgKgotICAgICAgICAgKiBBZGRpdGlvbmFsIGNyaXRlcmlhIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBhbnkgbmF0aXZlIHF1ZXJpZXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAYXV0aG9yIEd1eSBQZWxsZXRpZXIKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQWRkaXRpb25hbENyaXRlcmlhIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgSlBRTCBmcmFnbWVudCB0byB1c2UgYXMgdGhlIGFkZGl0aW9uYWwgY3JpdGVyaWEuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3JpdGVyaWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlIGFubm90YXRpb24gaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmludmFsaWRhdGlvbi5DYWNoZUludmFsaWRhdGlvblBvbGljeSAKLSAgICAgICAgICogd2hpY2ggc2V0cyBvYmplY3RzIGluIEVjbGlwc2VMaW5rJ3MgaWRlbnRpdHkgbWFwcyB0byBiZSBpbnZhbGlkIAotICAgICAgICAgKiBmb2xsb3dpbmcgZ2l2ZW4gcnVsZXMuIEJ5IGRlZmF1bHQgaW4gRWNsaXBzZUxpbmssIG9iamVjdHMgZG8gbm90IAotICAgICAgICAgKiBleHBpcmUgaW4gdGhlIGNhY2hlLiBTZXZlcmFsIGRpZmZlcmVudCBwb2xpY2llcyBhcmUgYXZhaWxhYmxlIHRvIAotICAgICAgICAgKiBhbGxvdyBvYmplY3RzIHRvIGV4cGlyZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGVUeXBlCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENhY2hlIGFub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHkgb3IgTWFwcGVkU3VwZXJjbGFzcy4gCi0gICAgICAgICAqIEluIHRoZSBjYXNlIG9mIGluaGVyaXRhbmNlLCBhIENhY2hlIGFubm90YXRpb24gc2hvdWxkIG9ubHkgYmUgZGVmaW5lZCAKLSAgICAgICAgICogb24gdGhlIHJvb3Qgb2YgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENhY2hlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNhY2hlIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2FjaGVUeXBlIHR5cGUoKSBkZWZhdWx0IFNPRlRfV0VBSzsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNpemUgb2YgY2FjaGUgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2l6ZSgpIGRlZmF1bHQgMTAwOwotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIChPcHRpb25hbCkgQ2FjaGVkIGluc3RhbmNlcyBpbiB0aGUgc2hhcmVkIGNhY2hlLAotICAgICAgICAgICogb3Igb25seSBhIHBlciBFbnRpdHlNYW5hZ2VyIGlzb2xhdGVkIGNhY2hlLgotICAgICAgICAgICogVGhlIGRlZmF1bHQgaXMgc2hhcmVkLgotICAgICAgICAgICogQGRlcHJlY2F0ZWQgIEFzIG9mIEVjbGlwc2VsaW5rIDIuMi4gIFNlZSB0aGUgYXR0cmlidXRlICdpc29sYXRpb24nCi0gICAgICAgICAgKi8gCi0gICAgICAgICAgQERlcHJlY2F0ZWQKLSAgICAgICAgICBib29sZWFuIHNoYXJlZCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAKLSAgICAgICAgIC8qKgotICAgICAgICAgICogKE9wdGlvbmFsKSBDb250cm9scyB0aGUgbGV2ZWwgb2YgY2FjaGluZyB0aGlzIEVudGl0eSB3aWxsIHVzZS4KLSAgICAgICAgICAqIFRoZSBkZWZhdWx0IGlzIENhY2hlSXNvbGF0aW9uVHlwZS5TSEFSRUQgd2hpY2ggaGFzIEVjbGlwc2VMaW5rCi0gICAgICAgICAgKiBDYWNoaW5nIGFsbCBFbnRpdGllcyBpbiB0aGUgU2hhcmVkIENhY2hlLgotICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb25maWcuQ2FjaGVJc29sYXRpb25UeXBlCi0gICAgICAgICAgKi8KLSAgICAgICAgICBDYWNoZUlzb2xhdGlvblR5cGUgaXNvbGF0aW9uKCkgZGVmYXVsdCBTSEFSRUQ7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYWZ0ZXIgYSBmaXggcGVyaW9kIG9mIHRpbWUgKG1zKS4gCi0gICAgICAgICAgICogUXVlcmllcyBleGVjdXRlZCBhZ2FpbnN0IHRoZSBjYWNoZSBhZnRlciB0aGlzIHdpbGwgYmUgZm9yY2VkIGJhY2sgCi0gICAgICAgICAgICogdG8gdGhlIGRhdGFiYXNlIGZvciBhIHJlZnJlc2hlZCBjb3B5Ci0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBleHBpcnkoKSBkZWZhdWx0IC0xOyAvLyBtaW51cyBvbmUgaXMgbm8gZXhwaXJ5LgotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBFeHBpcmUgY2FjaGVkIGluc3RhbmNlIGEgc3BlY2lmaWMgdGltZSBvZiBkYXkuIFF1ZXJpZXMgCi0gICAgICAgICAgICogZXhlY3V0ZWQgYWdhaW5zdCB0aGUgY2FjaGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvcmNlZCBiYWNrIHRvIHRoZSAKLSAgICAgICAgICAgKiBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBUaW1lT2ZEYXkgZXhwaXJ5VGltZU9mRGF5KCkgZGVmYXVsdCBAVGltZU9mRGF5KHNwZWNpZmllZD1mYWxzZSk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvcmNlIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlIHRvIGFsd2F5cyAKLSAgICAgICAgICAgKiByZWZyZXNoIHRoZSBjYWNoZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBhbHdheXNSZWZyZXNoKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRm9yIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlLCByZWZyZXNoIHRoZQotICAgICAgICAgICAqIGNhY2hlIG9ubHkgaWYgdGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgZGF0YWJhc2UgYnkgYSBxdWVyeSBpcyAKLSAgICAgICAgICAgKiBuZXdlciB0aGFuIHRoZSBkYXRhIGluIHRoZSBjYWNoZSAoYXMgZGV0ZXJtaW5lZCBieSB0aGUgb3B0aW1pc3RpYyAKLSAgICAgICAgICAgKiBsb2NraW5nIGZpZWxkKQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcigpIGRlZmF1bHQgZmFsc2U7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNldHRpbmcgdG8gdHJ1ZSB3aWxsIGZvcmNlIGFsbCBxdWVyaWVzIHRvIGJ5cGFzcyB0aGUgCi0gICAgICAgICAgICogY2FjaGUgZm9yIGhpdHMgYnV0IHN0aWxsIHJlc29sdmUgYWdhaW5zdCB0aGUgY2FjaGUgZm9yIGlkZW50aXR5LiAKLSAgICAgICAgICAgKiBUaGlzIGZvcmNlcyBhbGwgcXVlcmllcyB0byBoaXQgdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIGRpc2FibGVIaXRzKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhY2hlIGNvb3JkaW5hdGlvbiBtb2RlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSgpIGRlZmF1bHQgU0VORF9PQkpFQ1RfQ0hBTkdFUzsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5IiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5LXRpbWUtb2YtZGF5IiB0eXBlPSJvcm06dGltZS1vZi1kYXkiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOmNob2ljZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNoYXJlZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc29sYXRpb24iIHR5cGU9Im9ybTpjYWNoZS1pc29sYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpjYWNoZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWx3YXlzLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmcmVzaC1vbmx5LWlmLW5ld2VyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2FibGUtaGl0cyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb29yZGluYXRpb24tdHlwZSIgdHlwZT0ib3JtOmNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gCi0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZS1pbnRlcmNlcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENhY2hlSW50ZXJjZXB0b3IgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2FjaGVUeXBlIGVudW0gaXMgdXNlZCB3aXRoIHRoZSBDYWNoZSBhbm5vdGF0aW9uIGZvciBhIAotICAgICAgICAgKiBwZXJzaXN0ZW50IGNsYXNzLiBJdCBkZWZpbmVzIHRoZSB0eXBlIG9mIElkZW50aXR5TWFwL0NhY2hlIHVzZWQgZm9yIAotICAgICAgICAgKiB0aGUgY2xhc3MuIEJ5IGRlZmF1bHQgdGhlIFNPRlRfV0VBSyBjYWNoZSB0eXBlIGlzIHVzZWQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlIAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGVudW0gQ2FjaGVUeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBQcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuIENhY2hlcyBhbGwgb2JqZWN0cwotICAgICAgICAgICAqIGFuZCBkb2VzIG5vdCByZW1vdmUgdGhlbS4gCi0gICAgICAgICAgICogV0FSTklORzogVGhpcyBtZXRob2QgbWF5IGJlIG1lbW9yeSBpbnRlbnNpdmUgd2hlbiBtYW55IG9iamVjdHMgYXJlIAotICAgICAgICAgICAqIHJlYWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRlVMTCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIEZVTEwgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlCi0gICAgICAgICAgICogb2JqZWN0cyB1c2luZyB3ZWFrIHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGFuZCBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgV0VBSywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIEZVTEwgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlCi0gICAgICAgICAgICogb2JqZWN0cyB1c2luZyBzb2Z0IHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIHdoZW4gbWVtb3J5IGlzIGxvdyBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZAotICAgICAgICAgICAqIGd1YXJhbnRlZWQgaWRlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU09GVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIFdFQUsgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IGl0IG1haW50YWlucyBhCi0gICAgICAgICAgICogbW9zdC1mcmVxdWVudGx5LXVzZWQgc3ViLWNhY2hlLiBUaGUgc2l6ZSBvZiB0aGUgc3ViLWNhY2hlIGlzCi0gICAgICAgICAgICogcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBpZGVudGl0eSBtYXAgYXMgc3BlY2lmaWVkIGJ5Ci0gICAgICAgICAgICogZGVzY3JpcHRvcidzIHNldElkZW50aXR5TWFwU2l6ZSgpIG1ldGhvZC4gVGhlIHN1Yi1jYWNoZQotICAgICAgICAgICAqIHVzZXMgc29mdCByZWZlcmVuY2VzIHRvIGVuc3VyZSB0aGF0IHRoZXNlIG9iamVjdHMgYXJlCi0gICAgICAgICAgICogZ2FyYmFnZS1jb2xsZWN0ZWQgb25seSBpZiB0aGUgc3lzdGVtIGlzIGxvdyBvbiBtZW1vcnkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU09GVF9XRUFLLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogSWRlbnRpY2FsIHRvIHRoZSBzb2Z0IGNhY2hlIHdlYWsgKFNPRlRfV0VBSykgaWRlbnRpdHkgbWFwIGV4Y2VwdCAKLSAgICAgICAgICAgKiB0aGF0IGl0IHVzZXMgaGFyZCByZWZlcmVuY2VzIGluIHRoZSBzdWItY2FjaGUuIFVzZSB0aGlzIGlkZW50aXR5IAotICAgICAgICAgICAqIG1hcCBpZiBzb2Z0IHJlZmVyZW5jZXMgZG8gbm90IGJlaGF2ZSBwcm9wZXJseSBvbiB5b3VyIHBsYXRmb3JtLgotICAgICAgICAgICAqLwotICAgICAgICAgIEhBUkRfV0VBSywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEEgY2FjaGUgaWRlbnRpdHkgbWFwIG1haW50YWlucyBhIGZpeGVkIG51bWJlciBvZiBvYmplY3RzCi0gICAgICAgICAgICogc3BlY2lmaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gT2JqZWN0cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZQotICAgICAgICAgICAqIG9uIGEgbGVhc3QtcmVjZW50bHktdXNlZCBiYXNpcy4gVGhpcyBtZXRob2QgYWxsb3dzIG9iamVjdAotICAgICAgICAgICAqIGlkZW50aXR5IGZvciB0aGUgbW9zdCBjb21tb25seSB1c2VkIG9iamVjdHMuCi0gICAgICAgICAgICogV0FSTklORzogRnVybmlzaGVzIGNhY2hpbmcgYW5kIGlkZW50aXR5LCBidXQgZG9lcyBub3QgZ3VhcmFudGVlIAotICAgICAgICAgICAqIGlkZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENBQ0hFLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogV0FSTklORzogRG9lcyBub3QgcHJlc2VydmUgb2JqZWN0IGlkZW50aXR5IGFuZCBkb2VzIG5vdCBjYWNoZSAKLSAgICAgICAgICAgKiBvYmplY3RzLgotICAgICAgICAgICAqLwotICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlVMTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0VBSyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09GVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09GVF9XRUFLIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQVJEX1dFQUsiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQ0hFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtaXNvbGF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE9wdGlvbnMgZm9yIGhvdyBFbnRpdHkgaW5zdGFuY2VzIHNob3VsZCBiZSBzaGFyZWQgd2l0aGluIGFuIEVjbGlwc2VMaW5rIFBlcnNpc3RlbmNlIFVuaXQgLyBTZXJ2ZXJTZXNzaW9uCi0gICAgICAgICAqIEBzZWUgQ2xhc3NEZXNjcmlwdG9yI3NldENhY2hlSXNvbGF0aW9uVHlwZShDYWNoZUlzb2xhdGlvblR5cGUpCi0gICAgICAgICAqIEBhdXRob3IgR29yZG9uIFlvcmtlCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIENhY2hlSXNvbGF0aW9uVHlwZSB7Ci0gICAgICAgIAotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBFbnRpdHkgaW5zdGFuY2VzIHdpbGwgYmUgY2FjaGVkIHdpdGhpbiB0aGUgRW50aXR5TWFuYWdlckZhY3RvcnkvU2VydmVyU2Vzc2lvbiBsZXZlbC4KLSAgICAgICAgICAqIEFueSB1c2VyIHF1ZXJpZXMgZm9yIHNoYXJlZCBjYWNoZSBpbnN0YW5jZXMgKGllIFJlYWQtT25seSBxdWVyeSBoaW50KSB3aWxsIHJldHVybiBhbiBFbnRpdHkKLSAgICAgICAgICAqIGluc3RhbmNlIHRoYXQgbWF5IGJlIHNoYXJlZCBieSBtdWx0aXBsZSBjbGllbnRzLiAKLSAgICAgICAgICAqIAotICAgICAgICAgICogVGhpcyBzZXR0aW5nIGlzIHRoZSBkZWZhdWx0IGlzb2xhdGlvbiBsZXZlbC4KLSAgICAgICAgICAqLwotICAgICAgICAgU0hBUkVELAotICAgIAotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBFbnRpdHkgc3RhdGUgaW5mb3JtYXRpb24gd2lsbCBiZSBjYWNoZWQgaW4gdGhlIHNoYXJlZCBjYWNoZSBidXQgRW50aXR5Ci0gICAgICAgICAgKiBpbnN0YW5jZXMgd2lsbCBub3QgYmUgc2hhcmVkLiBBbnkgdXNlciBxdWVyaWVzIGZvciBzaGFyZWQgY2FjaGUgaW5zdGFuY2VzCi0gICAgICAgICAgKiAoaWUgUmVhZC1Pbmx5IHF1ZXJ5IGhpbnQpIHdpbGwgcmV0dXJuIGEgbmV3IEVudGl0eSBpbnN0YW5jZSB3aXRoIHRoZSBjYWNoZWQgc3RhdGUuCi0gICAgICAgICAgKiBUaGlzIHdpbGwgZW5zdXJlIHRoZSBpbnN0YW5jZSBpcyA8aT5wcm90ZWN0ZWQ8L2k+IGZyb20gYW55IGNvbmN1cnJlbnQKLSAgICAgICAgICAqIHN0YXRlIGNoYW5nZS4KLSAgICAgICAgICAqLwotICAgICAgICAgUFJPVEVDVEVELAotICAgIAotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBUaGUgRW50aXR5IGFuZCBpdHMgZGF0YSBpcyBub3Qgc3RvcmVkIGluIHRoZSBzaGFyZWQgY2FjaGUgYnV0IGlzCi0gICAgICAgICAgKiA8aT5pc29sYXRlZDwvaT4gdG8gdGhlIFBlcnNpc3RlbmNlIENvbnRleHQvVW5pdE9mV29yayBvcgotICAgICAgICAgICogSXNvbGF0ZWRDbGllbnRTZXNzaW9uLiBUaGlzIHNldHRpbmcgZWZmZWN0aXZlbHkgZGlzYWJsZXMgc2Vjb25kIGxldmVsCi0gICAgICAgICAgKiBjYWNoaW5nIGZvciB0aGlzIGVudGl0eSBhbmQgc2hvdWxkIGJlIHVzZWQgd2hlbiB1c2VycyBkbyBub3Qgd2FudCBjYWNoaW5nIGZvcgotICAgICAgICAgICogYSBwYXJ0aWN1bGFyIEVudGl0eS4KLSAgICAgICAgICAqLwotICAgICAgICAgSVNPTEFURUQ7Ci0gICAgICAgIAotICAgICAgICB9Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0hBUkVEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9URUNURUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklTT0xBVEVEIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiAgCi0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENhY2hlIGFubm90YXRpb24uCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlIAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBlbnVtIENhY2hlQ29vcmRpbmF0aW9uVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2VuZHMgYSBsaXN0IG9mIGNoYW5nZWQgb2JqZWN0cyBpbmNsdWRpbmcgZGF0YSBhYm91dCB0aGUgY2hhbmdlcy4KLSAgICAgICAgICAgKiBUaGlzIGRhdGEgaXMgbWVyZ2VkIGludG8gdGhlIHJlY2VpdmluZyBjYWNoZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRU5EX09CSkVDVF9DSEFOR0VTLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2VuZHMgYSBsaXN0IG9mIHRoZSBpZGVudGl0aWVzIG9mIHRoZSBvYmplY3RzIHRoYXQgaGF2ZSBjaGFuZ2VkLiAKLSAgICAgICAgICAgKiBUaGUgcmVjZWl2aW5nIGNhY2hlIGludmFsaWRhdGVzIHRoZSBvYmplY3RzIChyYXRoZXIgdGhhbiBjaGFuZ2luZyAKLSAgICAgICAgICAgKiBhbnkgb2YgdGhlIGRhdGEpCi0gICAgICAgICAgICovCi0gICAgICAgICAgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTYW1lIGFzIFNFTkRfT0JKRUNUX0NIQU5HRVMgZXhjZXB0IGl0IGFsc28gaW5jbHVkZXMgYW55IG5ld2x5Ci0gICAgICAgICAgICogY3JlYXRlZCBvYmplY3RzIGZyb20gdGhlIHRyYW5zYWN0aW9uLgotICAgICAgICAgICAqLwotICAgICAgICAgIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogRG9lcyBubyBjYWNoZSBjb29yZGluYXRpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgTk9ORQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRU5EX09CSkVDVF9DSEFOR0VTIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNoYW5nZXRyYWNraW5nLk9iamVjdENoYW5nZVBvbGljeSAKLSAgICAgICAgICogd2hpY2ggY29tcHV0ZXMgY2hhbmdlcyBzZXRzIGZvciBFY2xpcHNlTGluaydzIFVuaXRPZldvcmsgY29tbWl0IAotICAgICAgICAgKiBwcm9jZXNzLiBBbiBPYmplY3RDaGFuZ2VQb2xpY3kgaXMgc3RvcmVkIG9uIGFuIEVudGl0eSdzIGRlc2NyaXB0b3IuCi0gICAgICAgICAqCi0gICAgICAgICAqIEEgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbiBtYXkgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3Mgb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDaGFuZ2VUcmFja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBjaGFuZ2UgdHJhY2tpbmcgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDaGFuZ2VUcmFja2luZ1R5cGUgdmFsdWUoKSBkZWZhdWx0IEFVVE87Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmctdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24uIAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBlbnVtIENoYW5nZVRyYWNraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQW4gQVRUUklCVVRFIGNoYW5nZSB0cmFja2luZyB0eXBlIGFsbG93cyBjaGFuZ2UgdHJhY2tpbmcgYXQgdGhlCi0gICAgICAgICAgICogYXR0cmlidXRlIGxldmVsIG9mIGFuIG9iamVjdC4gT2JqZWN0cyB3aXRoIGNoYW5nZWQgYXR0cmlidXRlcyB3aWxsCi0gICAgICAgICAgICogYmUgcHJvY2Vzc2VkIGluIHRoZSBjb21taXQgcHJvY2VzcyB0byBpbmNsdWRlIGFueSBjaGFuZ2VzIGluIHRoZSAKLSAgICAgICAgICAgKiByZXN1bHRzIG9mIHRoZSBjb21taXQuIFVuY2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVFRSSUJVVEUsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBbiBPQkpFQ1QgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBhbGxvd3MgYW4gb2JqZWN0IHRvIGNhbGN1bGF0ZSBmb3IgCi0gICAgICAgICAgICogaXRzZWxmIHdoZXRoZXIgaXQgaGFzIGNoYW5nZWQuIENoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIHByb2Nlc3NlZCBpbiAKLSAgICAgICAgICAgKiB0aGUgY29tbWl0IHByb2Nlc3MgdG8gaW5jbHVkZSBhbnkgY2hhbmdlcyBpbiB0aGUgcmVzdWx0cyBvZiB0aGUgCi0gICAgICAgICAgICogY29tbWl0LiBVbmNoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgT0JKRUNULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQSBERUZFUlJFRCBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGRlZmVycyBhbGwgY2hhbmdlIGRldGVjdGlvbiB0bwotICAgICAgICAgICAqIHRoZSBVbml0T2ZXb3JrJ3MgY2hhbmdlIGRldGVjdGlvbiBwcm9jZXNzLiBFc3NlbnRpYWxseSwgdGhlIAotICAgICAgICAgICAqIGNhbGN1bGF0ZUNoYW5nZXMoKSBtZXRob2Qgd2lsbCBydW4gZm9yIGFsbCBvYmplY3RzIGluIGEgVW5pdE9mV29yay4gCi0gICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBPYmplY3RDaGFuZ2VQb2xpY3kKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBERUZFUlJFRCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFdpbGwgbm90IHNldCBhbnkgY2hhbmdlIHRyYWNraW5nIHBvbGljeS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVVRPCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUVFJJQlVURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT0JKRUNUIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERUZFUlJFRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1c3RvbWl6ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotICAgICAgICAgKiB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29uZmlnLkRlc2NyaXB0b3JDdXN0b21pemVyIAotICAgICAgICAgKiBpbnRlcmZhY2UgYW5kIGlzIHRvIHJ1biBhZ2FpbnN0IGFuIGVuZXRpdHkncyBjbGFzcyBkZXNjcmlwdG9yIGFmdGVyIGFsbCAKLSAgICAgICAgICogbWV0YWRhdGEgcHJvY2Vzc2luZyBoYXMgYmVlbiBjb21wbGV0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzIAotICAgICAgICAgKiBvciBFbWJlZGRhYmxlIGNsYXNzLiBJbiB0aGUgY2FzZSBvZiBpbmhlcml0YW5jZSwgYSBDdXN0b21pemVyIGlzIG5vdCAKLSAgICAgICAgICogaW5oZXJpdGVkIGZyb20gaXRzIHBhcmVudCBjbGFzc2VzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDdXN0b21pemVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGRlc2NyaXB0b3IgY3VzdG9taXplciBjbGFzcyB0aGF0IAotICAgICAgICAgICAqIHNob3VsZCBiZSBhcHBsaWVkIGZvciB0aGUgcmVsYXRlZCBlbnRpdHkgb3IgZW1iZWRkYWJsZSBjbGFzcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXJlY3Rpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYW5ub3RhdGlvbi4KLSAgICAgICAgICogSXQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgCi0gICAgICAgICAqIHBhcmFtZXRlcnMgb2YgYSBuYW1lZCBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGVudW0gRGlyZWN0aW9uIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnB1dCBwYXJhbWV0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJTiwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIE91dHB1dCBwYXJhbWV0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPVVQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIElOX09VVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIE91dHB1dCBjdXJzb3IKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPVVRfQ1VSU09SCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOX09VVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VUX0NVUlNPUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LW1hcHBpbmdzIj4KLSAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVudGl0eS1tYXBwaW5ncyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBtYXBwaW5nCi0gICAgICAgIGZpbGUuIEl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZm91ciB0eXBlcyBvZiBlbGVtZW50czoKLQotICAgICAgICAxLiBUaGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IGNvbnRhaW5zIG1ldGFkYXRhCi0gICAgICAgIGZvciB0aGUgZW50aXJlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCBpZiB0aGlzIGVsZW1lbnQKLSAgICAgICAgb2NjdXJzIGluIG11bHRpcGxlIG1hcHBpbmcgZmlsZXMgd2l0aGluIHRoZSBzYW1lIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgIAotICAgICAgICAyLiBUaGUgcGFja2FnZSwgc2NoZW1hLCBjYXRhbG9nIGFuZCBhY2Nlc3MgZWxlbWVudHMgYXBwbHkgdG8gYWxsIG9mCi0gICAgICAgIHRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGRlZmluZWQgaW4KLSAgICAgICAgdGhlIHNhbWUgZmlsZSBpbiB3aGljaCB0aGV5IG9jY3VyLgotCi0gICAgICAgIDMuIFRoZSBzZXF1ZW5jZS1nZW5lcmF0b3IsIHRhYmxlLWdlbmVyYXRvciwgbmFtZWQtcXVlcnksCi0gICAgICAgIG5hbWVkLW5hdGl2ZS1xdWVyeSBhbmQgc3FsLXJlc3VsdC1zZXQtbWFwcGluZyBlbGVtZW50cyBhcmUgZ2xvYmFsCi0gICAgICAgIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lCi0gICAgICAgIHNlcXVlbmNlLWdlbmVyYXRvciBvciB0YWJsZS1nZW5lcmF0b3Igb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZQotICAgICAgICBvciBkaWZmZXJlbnQgbWFwcGluZyBmaWxlcyBpbiBhIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIGFsc28gCi0gICAgICAgIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUgbmFtZWQtcXVlcnksIG5hbWVkLW5hdGl2ZS1xdWVyeSwgb3IKLSAgICAgICAgcmVzdWx0LXNldC1tYXBwaW5nIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNhbWUgb3IgZGlmZmVyZW50IG1hcHBpbmcgCi0gICAgICAgIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICA0LiBUaGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBlYWNoIGRlZmluZQotICAgICAgICB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBtYW5hZ2VkIHBlcnNpc3RlbnQgY2xhc3MuIFRoZSBtYXBwaW5nCi0gICAgICAgIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGVzZSBlbGVtZW50cyBtYXkgYmUgY29tcGxldGUgb3IgaXQgbWF5Ci0gICAgICAgIGJlIHBhcnRpYWwuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhY2thZ2UiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb25pbmciIHR5cGU9Im9ybTpwYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcGxpY2F0aW9uLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnJlcGxpY2F0aW9uLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm91bmQtcm9iaW4tcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06cm91bmQtcm9iaW4tcGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5uZWQtcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06cGlubmVkLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmFuZ2UtcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06cmFuZ2UtcGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1wYXJ0aXRpb25pbmciIHR5cGU9Im9ybTp2YWx1ZS1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imhhc2gtcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06aGFzaC1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaW9uLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnVuaW9uLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgICAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiIHR5cGU9Im9ybTptYXBwZWQtc3VwZXJjbGFzcyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiIHR5cGU9Im9ybTplbnRpdHkiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkYWJsZSIgdHlwZT0ib3JtOmVtYmVkZGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvblR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgZml4ZWQ9IjIuMiIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICA8L3hzZDplbGVtZW50PgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBFeGlzdGVuY2VDaGVja2luZyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiAKLSAgICAgICAgICogY2hlY2tpbmcgRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIGVudGl0aWVzLgotICAgICAgICAgKiAKLSAgICAgICAgICogQW4gZXhpc3RlbmNlLWNoZWNraW5nIHNwZWNpZmljYXRpb24gaXMgc3VwcG9ydGVkIG9uIGFuIEVudGl0eSBvciAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBhbm5vdGF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRXhpc3RlbmNlQ2hlY2tpbmcgewotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTZXQgdGhlIGV4aXN0ZW5jZSBjaGVjayBmb3IgZGV0ZXJtaW5pbmcKLSAgICAgICAgICAgKiBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIEV4aXN0ZW5jZVR5cGUgdmFsdWUoKSBkZWZhdWx0IENIRUNLX0NBQ0hFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCBhbmQgCi0gICAgICAgICAqIGl0IGlzIGluIHRoZSBjYWNoZSwgdGhlbiBpdCBtdXN0IGV4aXN0LgotICAgICAgICAgKi8KLSAgICAgICAgQ0hFQ0tfQ0FDSEUsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBlcmZvcm0gZG9lcyBleGlzdCBjaGVjayBvbiB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAqLwotICAgICAgICBDSEVDS19EQVRBQkFTRSwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQXNzdW1lIHRoYXQgaWYgdGhlIG9iamVjdHMgcHJpbWFyeSBrZXkgZG9lcyBub3QgaW5jbHVkZSBudWxsIHRoZW4gCi0gICAgICAgICAqIGl0IG11c3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGd1YXJhbnRlZXMgb3IgCi0gICAgICAgICAqIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4KLSAgICAgICAgICovCi0gICAgICAgIEFTU1VNRV9FWElTVEVOQ0UsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IHRoZSBvYmplY3QgZG9lcyBub3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIAotICAgICAgICAgKiBhcHBsaWNhdGlvbiBndWFyYW50ZWVzIG9yIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4gIAotICAgICAgICAgKiBUaGlzIHdpbGwgYWx3YXlzIGZvcmNlIGFuIGluc2VydCB0byBiZSBjYWxsZWQuCi0gICAgICAgICAqLwotICAgICAgICBBU1NVTUVfTk9OX0VYSVNURU5DRQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+ICAgIAotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRUNLX0NBQ0hFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19EQVRBQkFTRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX0VYSVNURU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX05PTl9FWElTVEVOQ0UiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4gCi0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIE1ldGFkYXRhIHRoYXQgYXBwbGllcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhbmQgbm90IGp1c3QgdG8gCi0gICAgICAgIHRoZSBtYXBwaW5nIGZpbGUgaW4gd2hpY2ggaXQgaXMgY29udGFpbmVkLiAKLQotICAgICAgICBJZiB0aGUgeG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUgZWxlbWVudCBpcyBzcGVjaWZpZWQsCi0gICAgICAgIHRoZSBjb21wbGV0ZSBzZXQgb2YgbWFwcGluZyBtZXRhZGF0YSBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQgCi0gICAgICAgIGlzIGNvbnRhaW5lZCBpbiB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGVzZSBkZWZhdWx0cyBhcmUgYXBwbGllZCB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhcyBhIHdob2xlIAotICAgICAgICB1bmxlc3MgdGhleSBhcmUgb3ZlcnJpZGRlbiBieSBsb2NhbCBhbm5vdGF0aW9uIG9yIFhNTCAKLSAgICAgICAgZWxlbWVudCBzZXR0aW5ncy4gCi0gICAgICAgIAotICAgICAgICBzY2hlbWEgLSBVc2VkIGFzIHRoZSBzY2hlbWEgZm9yIGFsbCB0YWJsZXMsIHNlY29uZGFyeSB0YWJsZXMsIGpvaW4KLSAgICAgICAgICAgIHRhYmxlcywgY29sbGVjdGlvbiB0YWJsZXMsIHNlcXVlbmNlIGdlbmVyYXRvcnMsIGFuZCB0YWJsZSAKLSAgICAgICAgICAgIGdlbmVyYXRvcnMgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBjYXRhbG9nIC0gVXNlZCBhcyB0aGUgY2F0YWxvZyBmb3IgYWxsIHRhYmxlcywgc2Vjb25kYXJ5IHRhYmxlcywgam9pbgotICAgICAgICAgICAgdGFibGVzLCBjb2xsZWN0aW9uIHRhYmxlcywgc2VxdWVuY2UgZ2VuZXJhdG9ycywgYW5kIHRhYmxlIAotICAgICAgICAgICAgZ2VuZXJhdG9ycyB0aGF0IGFwcGx5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGRlbGltaXRlZC1pZGVudGlmaWVycyAtIFVzZWQgdG8gdHJlYXQgZGF0YWJhc2UgaWRlbnRpZmllcnMgYXMKLSAgICAgICAgICAgIGRlbGltaXRlZCBpZGVudGlmaWVycy4KLSAgICAgICAgYWNjZXNzIC0gVXNlZCBhcyB0aGUgYWNjZXNzIHR5cGUgZm9yIGFsbCBtYW5hZ2VkIGNsYXNzZXMgaW4KLSAgICAgICAgICAgIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGNhc2NhZGUtcGVyc2lzdCAtIEFkZHMgY2FzY2FkZS1wZXJzaXN0IHRvIHRoZSBzZXQgb2YgY2FzY2FkZSBvcHRpb25zCi0gICAgICAgICAgICBpbiBhbGwgZW50aXR5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgZW50aXR5LWxpc3RlbmVycyAtIExpc3Qgb2YgZGVmYXVsdCBlbnRpdHkgbGlzdGVuZXJzIHRvIGJlIGludm9rZWQgCi0gICAgICAgICAgICBvbiBlYWNoIGVudGl0eSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWxpbWl0ZWQtaWRlbnRpZmllcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYW4gZW50aXR5LiBJcyBhbGxvd2VkIHRvIGJlCi0gICAgICAgIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBhbm5vdGF0aW9ucy4KLSAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byAKLSAgICAgICAgaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBvbiB0aGUgZW50aXR5IGNsYXNzIChhbmQgaXRzIGZpZWxkcwotICAgICAgICBvciBwcm9wZXJ0aWVzKSBhcmUgdG8gYmUgcHJvY2Vzc2VkLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gCi0gICAgICAgIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIGZvciB0aGUgZW50aXR5IGFuZCBpdHMgc3ViZWxlbWVudHMgd2lsbCAKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRkaXRpb25hbC1jcml0ZXJpYSIgdHlwZT0ib3JtOmFkZGl0aW9uYWwtY3JpdGVyaWEiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJvcm06dGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY29uZGFyeS10YWJsZSIgdHlwZT0ib3JtOnNlY29uZGFyeS10YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW9uLWRlbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluZGV4IiB0eXBlPSJvcm06aW5kZXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleSIgdHlwZT0ib3JtOnByaW1hcnkta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmhlcml0YW5jZSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcy1leHRyYWN0b3IiIHR5cGU9Im9ybTpjbGFzcy1leHRyYWN0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtaW50ZXJjZXB0b3IiIHR5cGU9Im9ybTpjYWNoZS1pbnRlcmNlcHRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmZXRjaC1ncm91cCIgdHlwZT0ib3JtOmZldGNoLWdyb3VwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJvcm06cGFydGl0aW9uaW5nLWdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgICAgICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnktcmVkaXJlY3RvcnMiIHR5cGU9Im9ybTpxdWVyeS1yZWRpcmVjdG9ycyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwYXJlbnQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNraW5nIiB0eXBlPSJvcm06ZXhpc3RlbmNlLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJwYXJ0aXRpb25pbmctZ3JvdXAiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFydGl0aW9uaW5nIiB0eXBlPSJvcm06cGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXBsaWNhdGlvbi1wYXJ0aXRpb25pbmciIHR5cGU9Im9ybTpyZXBsaWNhdGlvbi1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvdW5kLXJvYmluLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnJvdW5kLXJvYmluLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGlubmVkLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnBpbm5lZC1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJhbmdlLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnJhbmdlLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06dmFsdWUtcGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYXNoLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOmhhc2gtcGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlvbi1wYXJ0aXRpb25pbmciIHR5cGU9Im9ybTp1bmlvbi1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcnRpdGlvbmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0gICAgICAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImFjY2Vzcy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGRldGVybWluZXMgaG93IHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBhY2Nlc3NlcyB0aGUKLSAgICAgICAgc3RhdGUgb2YgYW4gZW50aXR5IG9yIGVtYmVkZGVkIG9iamVjdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBST1BFUlRZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSUVMRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVklSVFVBTCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEFzc29jaWF0aW9uT3ZlcnJpZGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdHt9OwotICAgICAgICAgIEpvaW5UYWJsZSBqb2luVGFibGUoKSBkZWZhdWx0IEBKb2luVGFibGU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBdHRyaWJ1dGVPdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBDb2x1bW4gY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZXMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgY29udGFpbnMgdGhlIGVudGl0eSBmaWVsZCBvciBwcm9wZXJ0eSBtYXBwaW5ncy4KLSAgICAgICAgSXQgbWF5IGJlIHNwYXJzZWx5IHBvcHVsYXRlZCB0byBpbmNsdWRlIG9ubHkgYSBzdWJzZXQgb2YgdGhlCi0gICAgICAgIGZpZWxkcyBvciBwcm9wZXJ0aWVzLiBJZiBtZXRhZGF0YS1jb21wbGV0ZSBmb3IgdGhlIGVudGl0eSBpcyB0cnVlCi0gICAgICAgIHRoZW4gdGhlIHJlbWFpbmRlciBvZiB0aGUgYXR0cmlidXRlcyB3aWxsIGJlIGRlZmF1bHRlZCBhY2NvcmRpbmcKLSAgICAgICAgdG8gdGhlIGRlZmF1bHQgcnVsZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9Im9ybTppZCIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRlZC1pZCIgdHlwZT0ib3JtOmVtYmVkZGVkLWlkIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljIiB0eXBlPSJvcm06YmFzaWMiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljLWNvbGxlY3Rpb24iIHR5cGU9Im9ybTpiYXNpYy1jb2xsZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMtbWFwIiB0eXBlPSJvcm06YmFzaWMtbWFwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tb25lIiB0eXBlPSJvcm06bWFueS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1tYW55IiB0eXBlPSJvcm06b25lLXRvLW1hbnkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1vbmUiIHR5cGU9Im9ybTpvbmUtdG8tb25lIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lIiB0eXBlPSJvcm06dmFyaWFibGUtb25lLXRvLW9uZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tbWFueSIgdHlwZT0ib3JtOm1hbnktdG8tbWFueSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVsZW1lbnQtY29sbGVjdGlvbiIgdHlwZT0ib3JtOmVsZW1lbnQtY29sbGVjdGlvbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkIiB0eXBlPSJvcm06ZW1iZWRkZWQiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zZm9ybWF0aW9uIiB0eXBlPSJvcm06dHJhbnNmb3JtYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2llbnQiIHR5cGU9Im9ybTp0cmFuc2llbnQiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpYyB7Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5kZXgiIHR5cGU9Im9ybTppbmRleCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiIHR5cGU9Im9ybTpsb2IiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm4taW5zZXJ0IiB0eXBlPSJvcm06cmV0dXJuLWluc2VydCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmV0dXJuLXVwZGF0ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtY29sbGVjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljQ29sbGVjdGlvbiB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgdGhhdCAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgaGludCB0byAKLSAgICAgICAgICAgKiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gCi0gICAgICAgICAgICogTEFaWS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7IAotIAotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIHZhbHVlIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06ZWNsaXBzZWxpbmstY29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1vbi1kZWxldGUiIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC1mZXRjaCIgdHlwZT0ib3JtOmJhdGNoLWZldGNoIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uY2FjaGVhYmxlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtbWFwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNNYXAgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCi0gICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCi0gICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAotICAgICAgICAgICAqIExBWlkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IG1hcCAKLSAgICAgICAgICAgKiBrZXkuIElmIHRoZSBuYW1lIG9uIHRlIGtleSBjb2x1bW4gaXMgIiIsIHRoZSBuYW1lIHdpbGwgZGVmYXVsdCB0bzoKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb3IgZmllbGQ7ICJfS0VZIi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4ga2V5Q29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSBrZXkgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAotICAgICAgICAgICAqIHRoZSBkaXJlY3QgbWFwIGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJ0IGtleUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHZhbHVlIGNvbnZlcnRlci4gRGVmYXVsdCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAgICAgICAqIHNwZWNpZnlpbmcgQENvbnZlcnQoIm5vbmUiKSwgbWVhbmluZyBubyBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgY29sdW1uIG1hcHBpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVydCB2YWx1ZUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+ICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06ZWNsaXBzZWxpbmstY29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1vbi1kZWxldGUiIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC1mZXRjaCIgdHlwZT0ib3JtOmJhdGNoLWZldGNoIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uY2FjaGVhYmxlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FzY2FkZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gQ2FzY2FkZVR5cGUgeyBBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0gsIERFVEFDSH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtYWxsIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW1lcmdlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVtb3ZlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWRldGFjaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsYXNzLWV4dHJhY3RvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENsYXNzRXh0cmFjdG9yIGFsbG93cyBmb3IgYSB1c2VyIGRlZmluZWQgY2xhc3MgaW5kaWNhdG9yIGluIHBsYWNlIG9mIAotICAgICAgICAgKiBwcm92aWRpbmcgYSBkaXNjcmltaW5hdG9yIGNvbHVtbi4gVGhlIGNsYXNzIGhhcyB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgICAgICAgKiAgLSBJdCBtdXN0IGV4dGVuZCB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuQ2xhc3NFeHRyYWN0b3IgCi0gICAgICAgICAqICAgIGNsYXNzIGFuZCBpbXBsZW1lbnQgdGhlIGV4dHJhY3RDbGFzc0Zyb21Sb3coUmVjb3JkLCBTZXNzaW9uKSBtZXRob2QuIAotICAgICAgICAgKiAgLSBUaGF0IG1ldGhvZCBtdXN0IHRha2UgYSBkYXRhYmFzZSByb3cgKGEgUmVjb3JkL01hcCkgYXMgYW4gYXJndW1lbnQgYW5kIAotICAgICAgICAgKiAgICBtdXN0IHJldHVybiB0aGUgY2xhc3MgdG8gdXNlIGZvciB0aGF0IHJvdy4gCi0gICAgICAgICAqIAotICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gZGVjaWRlIHdoaWNoIGNsYXNzIHRvIGluc3RhbnRpYXRlIHdoZW4gcmVhZGluZyAKLSAgICAgICAgICogZnJvbSB0aGUgZGF0YWJhc2UuIEl0IGlzIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIHBvcHVsYXRlIGFueSAKLSAgICAgICAgICogdHlwaW5nIGluZm9ybWF0aW9uIGluIHRoZSBkYXRhYmFzZSByZXF1aXJlZCB0byBkZXRlcm1pbmUgdGhlIGNsYXNzIGZyb20gdGhlIAotICAgICAgICAgKiByb3cuCi0gICAgICAgICAqIAotICAgICAgICAgKiBUaGUgQ2xhc3NFeHRyYWN0b3IgbXVzdCBvbmx5IGJlIHNldCBvbiB0aGUgcm9vdCBvZiBhbiBlbnRpdHkgY2xhc3Mgb3IKLSAgICAgICAgICogc3ViLWhpZXJhcmNoeSBpbiB3aGljaCBhIGRpZmZlcmVudCBpbmhlcml0YW5jZSBzdHJhdGVneSBpcyBhcHBsaWVkLiBUaGUgCi0gICAgICAgICAqIENsYXNzRXh0cmFjdG9yIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgU0lOR0xFX1RBQkxFIGFuZCBKT0lORUQgaW5oZXJpdGFuY2UgCi0gICAgICAgICAqIHN0cmF0ZWdpZXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBJZiBhIENsYXNzRXh0cmFjdG9yIGlzIHVzZWQgdGhlbiBhIERpc2NyaW1pbmF0b3JDb2x1bW4gY2Fubm90IGJlIHVzZWQuIEEgCi0gICAgICAgICAqIENsYXNzRXh0cmFjdG9yIGFsc28gY2Fubm90IGJlIHVzZWQgb24gZWl0aGVyIHRoZSByb290IG9yIGl0cyBzdWJjbGFzc2VzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSW4gYWRkaXRpb24sIGZvciBtb3JlIGNvbXBsZXggY29uZmlndXJhdGlvbnMgdXNpbmcgYSBDbGFzc0V4dHJhY3RvciBhbmQgYSAKLSAgICAgICAgICogU0lOR0xFX1RBQkxFIHN0cmF0ZWd5LCB0aGUgZGVzY3JpcHRvcidzIHdpdGhBbGxTdWJjbGFzc2VzIGFuZCBvbmx5SW5zdGFuY2VzIAotICAgICAgICAgKiBleHByZXNzaW9ucyBzaG91bGQgYmUgc2V0IHRocm91Z2ggdGhlIENsYXNzRXh0cmFjdG9yJ3MgaW5pdGlhbGl6ZSBtZXRob2QuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuSW5oZXJpdGFuY2VQb2xpY3kuc2V0V2l0aEFsbFN1YmNsYXNzZXNFeHByZXNzaW9uKEV4cHJlc3Npb24pCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuSW5oZXJpdGFuY2VQb2xpY3kuc2V0T25seUluc3RhbmNlc0V4cHJlc3Npb24oRXhwcmVzc2lvbikKLSAgICAgICAgICogCi0gICAgICAgICAqIEBhdXRob3IgR3V5IFBlbGxldGllcgotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4xIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENsYXNzRXh0cmFjdG9yIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKFJlcXVpcmVkKSBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBleHRyYWN0b3IgdGhhdCBzaG91bGQgYmUgCi0gICAgICAgICAgICAgKiBhcHBsaWVkIHRvIHRoaXMgZW50aXR5J3MgZGVzY3JpcHRvci4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ2xhc3MgdmFsdWUoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsb25lLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5DbG9uZUNvcHlQb2xpY3kgb24gYW4gCi0gICAgICAgICAqIEVudGl0eS4gQSBDbG9uZUNvcHlQb2xpY3kgbXVzdCBzcGVjaWZ5IGF0IG9uZSBvciBib3RoIG9mIHRoZSAibWV0aG9kIiAKLSAgICAgICAgICogb3IgIndvcmtpbmdDb3B5TWV0aG9kIi4gIndvcmtpbmdDb3B5TWV0aG9kIiBpcyB1c2VkIHRvIGNsb25lIG9iamVjdHMgCi0gICAgICAgICAqIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgdXNlciBhcyB0aGV5IGFyZSByZWdpc3RlcmVkIGluIAotICAgICAgICAgKiBFY2xpcHNlTGluaydzIHRyYW5zYWN0aW9uYWwgbWVjaGFuaXNtLCB0aGUgVW5pdE9mV29yay4gIm1ldGhvZCIgd2lsbCAKLSAgICAgICAgICogYmUgdXNlZCBmb3IgdGhlIGNsb25lIHRoYXQgaXMgdXNlZCBmb3IgY29tcGFyaXNvbiBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5Ci0gICAgICAgICAqICAKLSAgICAgICAgICogQSBDbG9uZUNvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MKLSAgICAgICAgICogb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiKQotICAgICAgICAgKiAKLSAgICAgICAgICogb3I6Ci0gICAgICAgICAqIAotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kobWV0aG9kPSJteUNsb25lTWV0aG9kIiwgd29ya2luZ0NvcHlNZXRob2Q9Im15V29ya2luZ0NvcHlDbG9uZU1ldGhvZCIpCi0gICAgICAgICAqIAotICAgICAgICAgKiBvcjoKLSAgICAgICAgICogCi0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeSh3b3JraW5nQ29weU1ldGhvZE5hbWU9Im15V29ya2luZ0NvcHlDbG9uZSIpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDbG9uZUNvcHlQb2xpY3kgewotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkKLSAgICAgICAgICAgICAqIEVpdGhlciBtZXRob2Qgb3Igd29ya2luZ0NvcHlNZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQgdGhpcyBkZWZpbmVzIAotICAgICAgICAgICAgICogYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCB3aWxsIGJlIHVzZWQgCi0gICAgICAgICAgICAgKiBmb3IgY29tcGFyaXNvbiBieQotICAgICAgICAgICAgICogRWNsaXBzZUxpbmsncyBEZWZlcnJlZENoYW5nZURldGVjdGlvblBvbGljeQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZAotICAgICAgICAgICAgICogdGhpcyBkZWZpbmVzIGEgbWV0aG9kIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNsb25lIHRoYXQgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBvYmplY3QgcmV0dXJuZWQgd2hlbiByZWdpc3RlcmluZyBhbiAKLSAgICAgICAgICAgICAqIE9iamVjdCBpbiBhbiBFY2xpcHNlTGluayBVbml0T2ZXb3JrCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyB3b3JraW5nQ29weU1ldGhvZCgpOwotCi0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ3b3JraW5nLWNvcHktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2xsZWN0aW9uVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjcmVhdGlvbi1zdWZmaXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWNsaXBzZWxpbmstY29sbGVjdGlvbi10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbGxlY3Rpb25UYWJsZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0YWJsZS4gSWYgaXQgaXMgbm90IAotICAgICAgICAgICAqIHNwZWNpZmllZCwgaXQgaXMgZGVmYXVsdGVkIHRvIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmc6IAotICAgICAgICAgICAqIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZW50aXR5OyAiXyIgOyB0aGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwIAotICAgICAgICAgICAqIHByb3BlcnR5IG9yIGZpZWxkIG9mIHRoZSBzb3VyY2UgZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBjYXRhbG9nIG9mIHRoZSB0YWJsZS4gSXQgZGVmYXVsdHMgdG8gdGhlIHBlcnNpc3RlbmNlIAotICAgICAgICAgICAqIHVuaXQgZGVmYXVsdCBjYXRhbG9nLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBzY2hlbWEgb2YgdGhlIHRhYmxlLiBJdCBkZWZhdWx0cyB0byB0aGUgcGVyc2lzdGVuY2UgCi0gICAgICAgICAgICogdW5pdCBkZWZhdWx0IHNjaGVtYS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVzZWQgdG8gc3BlY2lmeSBhIHByaW1hcnkga2V5IGNvbHVtbiB0aGF0IGlzIHVzZWQgYXMgYSAKLSAgICAgICAgICAgKiBmb3JlaWduIGtleSB0byBqb2luIHRvIGFub3RoZXIgdGFibGUuIElmIHRoZSBzb3VyY2UgZW50aXR5IHVzZXMgYSAKLSAgICAgICAgICAgKiBjb21wb3NpdGUgcHJpbWFyeSBrZXksIGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gbXVzdCBiZSBzcGVjaWZpZWQgCi0gICAgICAgICAgICogZm9yIGVhY2ggZmllbGQgb2YgdGhlIGNvbXBvc2l0ZSBwcmltYXJ5IGtleS4gSW4gYSBzaW5nbGUgcHJpbWFyeSAKLSAgICAgICAgICAgKiBrZXkgY2FzZSwgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBtYXkgb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQuIAotICAgICAgICAgICAqIERlZmF1bHRpbmcgd2lsbCBhcHBseSBvdGhlcndpc2UgYXMgZm9sbG93czoKLSAgICAgICAgICAgKiBuYW1lLCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlIHByaW1hcnkgdGFibGUgCi0gICAgICAgICAgICogb2YgdGhlIHNvdXJjZSBlbnRpdHkuIHJlZmVyZW5jZWRDb2x1bW5OYW1lLCB0aGUgc2FtZSBuYW1lIG9mIAotICAgICAgICAgICAqIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgcHJpbWFyeSB0YWJsZSBvZiB0aGUgc291cmNlIGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbltdIHByaW1hcnlLZXlKb2luQ29sdW1ucygpIGRlZmF1bHQge307IAotIAotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVW5pcXVlIGNvbnN0cmFpbnRzIHRoYXQgYXJlIHRvIGJlIHBsYWNlZCBvbiB0aGUgdGFibGUuIAotICAgICAgICAgICAqIFRoZXNlIGFyZSBvbmx5IHVzZWQgaWYgdGFibGUgZ2VuZXJhdGlvbiBpcyBpbiBlZmZlY3QuCi0gICAgICAgICAgICovCi0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsgCi0gICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY3JlYXRpb24tc3VmZml4IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OwotICAgICAgICAgIGludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgcHJlY2lzaW9uCi0gICAgICAgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb252ZXJzaW9uVmFsdWUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgZGF0YWJhc2UgdmFsdWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGRhdGFWYWx1ZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBvYmplY3QgdmFsdWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG9iamVjdFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAotICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudAotICAgICAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlciBpbnRlcmZhY2UuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgY29udmVydGVyQ2xhc3MoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXJ0aXRpb25pbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAgICAgLyoqIAotICAgICAgICAgICAgICogQSBQYXJ0aXRpb25pbmcgaXMgdXNlZCB0byBwYXJ0aXRpb24gdGhlIGRhdGEgZm9yIGEgY2xhc3MgYWNyb3NzIG11bHRpcGxlIGRpZmZlcmVuY2UgZGF0YWJhc2VzCi0gICAgICAgICAgICAgKiBvciBhY3Jvc3MgYSBkYXRhYmFzZSBjbHVzdGVyIHN1Y2ggYXMgT3JhY2xlIFJBQy4KLSAgICAgICAgICAgICAqIFBhcnRpdGlvbmluZyBjYW4gcHJvdmlkZSBpbXByb3ZlZCBzY2FsYWJpbGl0eSBieSBhbGxvd2luZyBtdWx0aXBsZSBkYXRhYmFzZSBtYWNoaW5lcyB0byBzZXJ2aWNlIHJlcXVlc3RzLgotICAgICAgICAgICAgICogVGhpcyBhbm5vdGF0aW9uIGNvbmZpZ3VyZXMgYSBjdXN0b20gUGFydGl0aW9uaW5nUG9saWN5LgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBJZiBtdWx0aXBsZSBwYXJ0aXRpb25zIGFyZSB1c2VkIHRvIHByb2Nlc3MgYSBzaW5nbGUgdHJhbnNhY3Rpb24sIEpUQSBzaG91bGQgYmUgdXNlZCBmb3IgcHJvcGVyIFhBIHRyYW5zYWN0aW9uIHN1cHBvcnQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIFBhcnRpdGlvbmluZyBjYW4gYmUgZW5hYmxlZCBvbiBhbiBFbnRpdHksIHJlbGF0aW9uc2hpcCwgcXVlcnksIG9yIHNlc3Npb24vcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgICAqIFBhcnRpdGlvbiBwb2xpY2llcyBhcmUgZ2xvYmFsbHkgbmFtZWQgdG8gYWxsb3cgcmV1c2UsCi0gICAgICAgICAgICAgKiB0aGUgcGFydGl0aW9uaW5nIHBvbGljeSBtdXN0IGFsc28gYmUgc2V0IHVzaW5nIHRoZSBAUGFydGl0aW9uZWQgYW5ub3RhdGlvbiB0byBiZSB1c2VkLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBAc2VlIFBhcnRpdGlvbmVkCi0gICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLnBhcnRpdGlvbmluZy5QYXJ0aXRpb25pbmdQb2xpY3kKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBhcnRpdGlvbmluZyB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoUmVxdWlyZWQpIEZ1bGwgcGFja2FnZS5jbGFzcyBuYW1lIG9mIGEgc3ViY2xhc3Mgb2YgUGFydGl0aW9uaW5nUG9saWN5LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIENsYXNzIHBhcnRpdGlvbmluZ0NsYXNzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJoYXNoLXBhcnRpdGlvbmluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgCi0gICAgICAgICAgICAvKiogCi0gICAgICAgICAgICAgKiBIYXNoUGFydGl0aW9uaW5nIHBhcnRpdGlvbnMgYWNjZXNzIHRvIGEgZGF0YWJhc2UgY2x1c3RlciBieSB0aGUgaGFzaCBvZiBhIGZpZWxkIHZhbHVlIGZyb20gdGhlIG9iamVjdCwKLSAgICAgICAgICAgICAqIHN1Y2ggYXMgdGhlIG9iamVjdCdzIGxvY2F0aW9uLCBvciB0ZW5hbnQuCi0gICAgICAgICAgICAgKiBUaGUgaGFzaCBpbmRleGVzIGludG8gdGhlIGxpc3Qgb2YgY29ubmVjdGlvbiBwb29scy4KLSAgICAgICAgICAgICAqIEFsbCB3cml0ZSBvciByZWFkIHJlcXVlc3QgZm9yIG9iamVjdCdzIHdpdGggdGhhdCBoYXNoIHZhbHVlIGFyZSBzZW50IHRvIHRoZSBzZXJ2ZXIuCi0gICAgICAgICAgICAgKiBJZiBhIHF1ZXJ5IGRvZXMgbm90IGluY2x1ZGUgdGhlIGZpZWxkIGFzIGEgcGFyYW1ldGVyLCB0aGVuIGl0IGNhbiBlaXRoZXIgYmUgc2VudAotICAgICAgICAgICAgICogdG8gYWxsIHNlcnZlcidzIGFuZCB1bmlvbmVkLCBvciBsZWZ0IHRvIHRoZSBzZXNpb24ncyBkZWZhdWx0IGJlaGF2aW9yLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLkhhc2hQYXJ0aXRpb25pbmdQb2xpY3kKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBIYXNoUGFydGl0aW9uaW5nIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoZSBkYXRhYmFzZSBjb2x1bW4gb3IgcXVlcnkgcGFyYW1ldGVyIHRvIHBhcnRpdGlvbiBxdWVyaWVzIGJ5LgotICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgdGhlIHRhYmxlIGNvbHVtbiBuYW1lLCBub3QgdGhlIGNsYXNzIGF0dHJpYnV0ZSBuYW1lLgotICAgICAgICAgICAgICAgICAqIFRoZSBjb2x1bW4gdmFsdWUgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgcXVlcnkgYW5kIHNob3VsZCBub3JtYWxseSBiZSBwYXJ0IG9mIHRoZSBvYmplY3QncyBJZC4KLSAgICAgICAgICAgICAgICAgKiBUaGlzIGNhbiBhbHNvIGJlIHRoZSBuYW1lIG9mIGEgcXVlcnkgcGFyYW1ldGVyLgotICAgICAgICAgICAgICAgICAqIElmIGEgcXVlcnkgZG9lcyBub3QgY29udGFpbiB0aGUgZmllbGQgdGhlIHF1ZXJ5IHdpbGwgbm90IGJlIHBhcnRpdGlvbmVkLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIENvbHVtbiBwYXJ0aXRpb25Db2x1bW4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIExpc3Qgb2YgY29ubmVjdGlvbiBwb29sIG5hbWVzIHRvIHBhcnRpdGlvbiBhY3Jvc3MuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gY29ubmVjdGlvblBvb2xzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBEZWZpbmVzIGlmIHF1ZXJpZXMgdGhhdCBkbyBub3QgY29udGFpbiB0aGUgcGFydGl0aW9uIGZpZWxkIHNob3VsZCBiZSBzZW50Ci0gICAgICAgICAgICAgICAgICogdG8gZXZlcnkgZGF0YWJhc2UgYW5kIGhhdmUgdGhlIHJlc3VsdCB1bmlvbmVkLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGJvb2xlYW4gdW5pb25VbnBhcnRpdGlvbmFibGVRdWVyaWVzKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24tY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvb2wiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pb24tdW5wYXJ0aXRpb25hYmxlLXF1ZXJpZXMiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmFuZ2UtcGFydGl0aW9uaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBSYW5nZVBhcnRpdGlvbmluZ1BvbGljeSBwYXJ0aXRpb25zIGFjY2VzcyB0byBhIGRhdGFiYXNlIGNsdXN0ZXIgYnkgYSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBvYmplY3QsCi0gICAgICAgICAqIHN1Y2ggYXMgdGhlIG9iamVjdCdzIGlkLCBsb2NhdGlvbiwgb3IgdGVuYW50LgotICAgICAgICAgKiBFYWNoIHNlcnZlciBpcyBhc3NpZ25lZCBhIHJhbmdlIG9mIHZhbHVlcy4KLSAgICAgICAgICogQWxsIHdyaXRlIG9yIHJlYWQgcmVxdWVzdCBmb3Igb2JqZWN0J3Mgd2l0aCB0aGF0IHZhbHVlIGFyZSBzZW50IHRvIHRoZSBzZXJ2ZXIuCi0gICAgICAgICAqIElmIGEgcXVlcnkgZG9lcyBub3QgaW5jbHVkZSB0aGUgZmllbGQgYXMgYSBwYXJhbWV0ZXIsIHRoZW4gaXQgY2FuIGVpdGhlciBiZSBzZW50Ci0gICAgICAgICAqIHRvIGFsbCBzZXJ2ZXIncyBhbmQgdW5pb25lZCwgb3IgbGVmdCB0byB0aGUgc2VzaW9uJ3MgZGVmYXVsdCBiZWhhdmlvci4KLSAgICAgICAgICogCi0gICAgICAgICAqIElmIG11bHRpcGxlIHBhcnRpdGlvbnMgYXJlIHVzZWQgdG8gcHJvY2VzcyBhIHNpbmdsZSB0cmFuc2FjdGlvbiwgSlRBIHNob3VsZCBiZSB1c2VkIGZvciBwcm9wZXIgWEEgdHJhbnNhY3Rpb24gc3VwcG9ydC4KLSAgICAgICAgICogCi0gICAgICAgICAqIFBhcnRpdGlvbmluZyBjYW4gYmUgZW5hYmxlZCBvbiBhbiBFbnRpdHksIHJlbGF0aW9uc2hpcCwgcXVlcnksIG9yIHNlc3Npb24vcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICogUGFydGl0aW9uIHBvbGljaWVzIGFyZSBnbG9iYWxseSBuYW1lZCB0byBhbGxvdyByZXVzZSwKLSAgICAgICAgICogdGhlIHBhcnRpdGlvbmluZyBwb2xpY3kgbXVzdCBhbHNvIGJlIHNldCB1c2luZyB0aGUgQFBhcnRpdGlvbmVkIGFubm90YXRpb24gdG8gYmUgdXNlZC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgUGFydGl0aW9uZWQKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5wYXJ0aXRpb25pbmcuUmFuZ2VQYXJ0aXRpb25pbmdQb2xpY3kKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSYW5nZVBhcnRpdGlvbmluZyB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRoZSBkYXRhYmFzZSBjb2x1bW4gb3IgcXVlcnkgcGFyYW1ldGVyIHRvIHBhcnRpdGlvbiBxdWVyaWVzIGJ5LgotICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgdGFibGUgY29sdW1uIG5hbWUsIG5vdCB0aGUgY2xhc3MgYXR0cmlidXRlIG5hbWUuCi0gICAgICAgICAgICAgKiBUaGUgY29sdW1uIHZhbHVlIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIHF1ZXJ5IGFuZCBzaG91bGQgbm9ybWFsbHkgYmUgcGFydCBvZiB0aGUgb2JqZWN0J3MgSWQuCi0gICAgICAgICAgICAgKiBUaGlzIGNhbiBhbHNvIGJlIHRoZSBuYW1lIG9mIGEgcXVlcnkgcGFyYW1ldGVyLgotICAgICAgICAgICAgICogSWYgYSBxdWVyeSBkb2VzIG5vdCBjb250YWluIHRoZSBmaWVsZCB0aGUgcXVlcnkgd2lsbCBub3QgYmUgcGFydGl0aW9uZWQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIENvbHVtbiBwYXJ0aXRpb25Db2x1bW4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoUmVxdWlyZWQpIExpc3Qgb2YgY29ubmVjdGlvbiBwb29sIG5hbWVzIHRvIGxvYWQgYmFsYW5jZSBhY3Jvc3MuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFJhbmdlUGFydGl0aW9uW10gcGFydGl0aW9ucygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIERlZmluZXMgaWYgcXVlcmllcyB0aGF0IGRvIG5vdCBjb250YWluIHRoZSBwYXJ0aXRpb24gZmllbGQgc2hvdWxkIGJlIHNlbnQKLSAgICAgICAgICAgICAqIHRvIGV2ZXJ5IGRhdGFiYXNlIGFuZCBoYXZlIHRoZSByZXN1bHQgdW5pb25lZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYm9vbGVhbiB1bmlvblVucGFydGl0aW9uYWJsZVF1ZXJpZXMoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiAqLwotICAgICAgICAgICAgQ2xhc3MgcGFydGl0aW9uVmFsdWVUeXBlKCkgZGVmYXVsdCBTdHJpbmcuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24tY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24iIHR5cGU9Im9ybTpyYW5nZS1wYXJ0aXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pb24tdW5wYXJ0aXRpb25hYmxlLXF1ZXJpZXMiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFydGl0aW9uLXZhbHVlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyYW5nZS1wYXJ0aXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAvKiogCi0gICAgICAgICAqIFJlcHJlc2VudCBhIHNwZWNpZmljIHJhbmdlIHBhcnRpdGlvbi4KLSAgICAgICAgICogVmFsdWVzID0gc3RhcnRWYWx1ZSBhbmQgPSBlbmRWYWx1ZSB3aWxsIGJlIHJvdXRlZCB0byB0aGUgY29ubmVjdGlvbiBwb29sLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBSYW5nZVBhcnRpdGlvbmluZ1BvbGljeQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLnBhcnRpdGlvbmluZy5SYW5nZVBhcnRpdGlvbmluZ1BvbGljeQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLnBhcnRpdGlvbmluZy5SYW5nZVBhcnRpdGlvbgotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFJhbmdlUGFydGl0aW9uIHsKLSAgICAgICAgICAgIC8qKiBUaGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByYW5nZSBzdGFydCB2YWx1ZS4gKi8KLSAgICAgICAgICAgIFN0cmluZyBzdGFydFZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIC8qKiBUaGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByYW5nZSBzdGFydCB2YWx1ZS4gKi8KLSAgICAgICAgICAgIFN0cmluZyBlbmRWYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgICAvKiogVGhlIGNvbm5lY3Rpb24gcG9vbCB0byByb3V0ZSBxdWVyaWVzIHRvIGZvciB0aGlzIHJhbmdlLiAqLwotICAgICAgICAgICAgU3RyaW5nIGNvbm5lY3Rpb25Qb29sKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0YXJ0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZW5kLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29ubmVjdGlvbi1wb29sIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsdWUtcGFydGl0aW9uaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBWYWx1ZVBhcnRpdGlvbmluZyBwYXJ0aXRpb25zIGFjY2VzcyB0byBhIGRhdGFiYXNlIGNsdXN0ZXIgYnkgYSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBvYmplY3QsCi0gICAgICAgICAqIHN1Y2ggYXMgdGhlIG9iamVjdCdzIGxvY2F0aW9uLCBvciB0ZW5hbnQuCi0gICAgICAgICAqIEVhY2ggdmFsdWUgaXMgYXNzaWduZWQgYSBzcGVjaWZpYyBzZXJ2ZXIuCi0gICAgICAgICAqIEFsbCB3cml0ZSBvciByZWFkIHJlcXVlc3QgZm9yIG9iamVjdCdzIHdpdGggdGhhdCB2YWx1ZSBhcmUgc2VudCB0byB0aGUgc2VydmVyLgotICAgICAgICAgKiBJZiBhIHF1ZXJ5IGRvZXMgbm90IGluY2x1ZGUgdGhlIGZpZWxkIGFzIGEgcGFyYW1ldGVyLCB0aGVuIGl0IGNhbiBlaXRoZXIgYmUgc2VudAotICAgICAgICAgKiB0byBhbGwgc2VydmVyJ3MgYW5kIHVuaW9uZWQsIG9yIGxlZnQgdG8gdGhlIHNlc2lvbidzIGRlZmF1bHQgYmVoYXZpb3IuCi0gICAgICAgICAqIAotICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLnBhcnRpdGlvbmluZy5WYWx1ZVBhcnRpdGlvbmluZ1BvbGljeQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZhbHVlUGFydGl0aW9uaW5nIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIGRhdGFiYXNlIGNvbHVtbiBvciBxdWVyeSBwYXJhbWV0ZXIgdG8gcGFydGl0aW9uIHF1ZXJpZXMgYnkuCi0gICAgICAgICAgICAgKiBUaGlzIGlzIHRoZSB0YWJsZSBjb2x1bW4gbmFtZSwgbm90IHRoZSBjbGFzcyBhdHRyaWJ1dGUgbmFtZS4KLSAgICAgICAgICAgICAqIFRoZSBjb2x1bW4gdmFsdWUgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgcXVlcnkgYW5kIHNob3VsZCBub3JtYWxseSBiZSBwYXJ0IG9mIHRoZSBvYmplY3QncyBJZC4KLSAgICAgICAgICAgICAqIFRoaXMgY2FuIGFsc28gYmUgdGhlIG5hbWUgb2YgYSBxdWVyeSBwYXJhbWV0ZXIuCi0gICAgICAgICAgICAgKiBJZiBhIHF1ZXJ5IGRvZXMgbm90IGNvbnRhaW4gdGhlIGZpZWxkIHRoZSBxdWVyeSB3aWxsIG5vdCBiZSBwYXJ0aXRpb25lZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ29sdW1uIHBhcnRpdGlvbkNvbHVtbigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiogU3RvcmUgdGhlIHZhbHVlIHBhcnRpdGlvbnMuIEVhY2ggcGFydGl0aW9uIG1hcHMgYSB2YWx1ZSB0byBhIGNvbm5lY3Rpb25Qb29sLiAqLwotICAgICAgICAgICAgVmFsdWVQYXJ0aXRpb25bXSBwYXJ0aXRpb25zKCk7Ci0gICAgCi0gICAgICAgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiAqLwotICAgICAgICAgICAgQ2xhc3MgcGFydGl0aW9uVmFsdWVUeXBlKCkgZGVmYXVsdCBTdHJpbmcuY2xhc3M7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgZGVmYXVsdCBjb25uZWN0aW9uIHBvb2wgaXMgdXNlZCBmb3IgYW55IHVubWFwcGVkIHZhbHVlcy4gKi8KLSAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0Q29ubmVjdGlvblBvb2woKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogRGVmaW5lcyBpZiBxdWVyaWVzIHRoYXQgZG8gbm90IGNvbnRhaW4gdGhlIHBhcnRpdGlvbiBmaWVsZCBzaG91bGQgYmUgc2VudAotICAgICAgICAgICAgICogdG8gZXZlcnkgZGF0YWJhc2UgYW5kIGhhdmUgdGhlIHJlc3VsdCB1bmlvbmVkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBib29sZWFuIHVuaW9uVW5wYXJ0aXRpb25hYmxlUXVlcmllcygpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24tY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24iIHR5cGU9Im9ybTp2YWx1ZS1wYXJ0aXRpb24iIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaW9uLXVucGFydGl0aW9uYWJsZS1xdWVyaWVzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQtY29ubmVjdGlvbi1wb29sIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFydGl0aW9uLXZhbHVlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZS1wYXJ0aXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAvKiogCi0gICAgICAgICAqIFJlcHJlc2VudCBhIHNwZWNpZmljIHZhbHVlIHBhcnRpdGlvbi4KLSAgICAgICAgICogVGhlIHZhbHVlIHdpbGwgYmUgcm91dGVkIHRvIHRoZSBjb25uZWN0aW9uIHBvb2wuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIFZhbHVlUGFydGl0aW9uaW5nUG9saWN5Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlZhbHVlUGFydGl0aW9uaW5nUG9saWN5Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlZhbHVlUGFydGl0aW9uCi0gICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4yCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVmFsdWVQYXJ0aXRpb24gewotICAgICAgICAgICAgLyoqIFRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJhbmdlIHN0YXJ0IHZhbHVlLiAqLwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqIFRoZSBjb25uZWN0aW9uIHBvb2wgdG8gcm91dGUgcXVlcmllcyB0byBmb3IgdGhpcyB2YWx1ZS4gKi8KLSAgICAgICAgICAgIFN0cmluZyBjb25uZWN0aW9uUG9vbCgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbm5lY3Rpb24tcG9vbCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJvdW5kLXJvYmluLXBhcnRpdGlvbmluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgCi0gICAgICAgICAgICAvKiogCi0gICAgICAgICAgICAgKiBSb3VuZFJvYmluUGFydGl0aW9uaW5nIHNlbmRzIHJlcXVlc3RzIGluIGEgcm91bmQgcm9iaW4gZmFzaGlvbiB0byB0aGUgc2V0IG9mIGNvbm5lY3Rpb24gcG9vbHMuCi0gICAgICAgICAgICAgKiBJdCBpcyBmb3IgbG9hZC1iYWxhbmNpbmcgcmVhZCBxdWVyaWVzIGFjcm9zcyBhIGNsdXN0ZXIgb2YgZGF0YWJhc2UgbWFjaGluZXMuCi0gICAgICAgICAgICAgKiBJdCByZXF1aXJlcyB0aGF0IHRoZSBmdWxsIGRhdGFiYXNlIGJlIHJlcGxpY2F0ZWQgb24gZWFjaCBtYWNoaW5lLCBzbyBkb2VzIG5vdCBzdXBwb3J0IHBhcnRpdGlvbmluZy4KLSAgICAgICAgICAgICAqIFRoZSBkYXRhIHNob3VsZCBlaXRoZXIgYmUgcmVhZC1vbmx5LCBvciB3cml0ZXMgc2hvdWxkIGJlIHJlcGxpY2F0ZWQgb24gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlJvdW5kUm9iaW5Qb2xpY3kKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSb3VuZFJvYmluUGFydGl0aW9uaW5nIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIChSZXF1aXJlZCkgTGlzdCBvZiBjb25uZWN0aW9uIHBvb2wgbmFtZXMgdG8gbG9hZCBiYWxhbmNlIGFjcm9zcy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBjb25uZWN0aW9uUG9vbHMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBUaGlzIGFsbG93cyBmb3IgYSBzZXQgb2YgZGF0YWJhc2UgdG8gYmUgd3JpdHRlbiB0byBhbmQga2VwdCBpbiBzeW5jaCwKLSAgICAgICAgICAgICAgICAgKiBhbmQgaGF2ZSByZWFkcyBsb2FkLWJhbGFuY2VkIGFjcm9zcyB0aGUgZGF0YWJhc2VzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVwbGljYXRlV3JpdGVzKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvb2wiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVwbGljYXRlLXdyaXRlcyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXBsaWNhdGlvbi1wYXJ0aXRpb25pbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAgICAgLyoqIAotICAgICAgICAgICAgICogUmVwbGljYXRpb25QYXJ0aXRpb25pbmcgc2VuZHMgcmVxdWVzdHMgdG8gYSBzZXQgb2YgY29ubmVjdGlvbiBwb29scy4KLSAgICAgICAgICAgICAqIEl0IGlzIGZvciByZXBsaWNhdGluZyBkYXRhIGFjcm9zcyBhIGNsdXN0ZXIgb2YgZGF0YWJhc2UgbWFjaGluZXMuCi0gICAgICAgICAgICAgKiBPbmx5IG1vZGlmaWNhdGlvbiBxdWVyaWVzIGFyZSByZXBsaWNhdGVkLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlJlcGxpY2F0aW9uUG9saWN5Ci0gICAgICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUmVwbGljYXRpb25QYXJ0aXRpb25pbmcgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogKFJlcXVpcmVkKSBMaXN0IG9mIGNvbm5lY3Rpb24gcG9vbCBuYW1lcyB0byBsb2FkIGJhbGFuY2UgYWNyb3NzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNvbm5lY3Rpb25Qb29scygpOwotICAgICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlvbi1wYXJ0aXRpb25pbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAgICAgLyoqIAotICAgICAgICAgICAgICogVW5pb25QYXJ0aXRpb25pbmcgc2VuZHMgcXVlcmllcyB0byBhbGwgY29ubmVjdGlvbiBwb29scyBhbmQgdW5pb25zIHRoZSByZXN1bHRzLgotICAgICAgICAgICAgICogVGhpcyBpcyBmb3IgcXVlcmllcyBvciByZWxhdGlvbnNoaXBzIHRoYXQgc3BhbiBwYXJ0aXRpb25zIHdoZW4gcGFydGl0aW9uaW5nIGlzIHVzZWQsCi0gICAgICAgICAgICAgKiBzdWNoIGFzIG9uIGEgTWFueVRvTWFueSBjcm9zcyBwYXJ0aXRpb24gcmVsYXRpb25zaGlwLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlVuaW9uUGFydGl0aW9uaW5nUG9saWN5Ci0gICAgICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVW5pb25QYXJ0aXRpb25pbmcgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogKFJlcXVpcmVkKSBMaXN0IG9mIGNvbm5lY3Rpb24gcG9vbCBuYW1lcyB0byBsb2FkIGJhbGFuY2UgYWNyb3NzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNvbm5lY3Rpb25Qb29scygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIERlZmluZXMgaWYgd3JpdGUgcXVlcmllcyBzaG91bGQgYmUgcmVwbGljYXRlZC4KLSAgICAgICAgICAgICAgICAgKiBXcml0ZXMgYXJlIG5vcm1hbGx5IG5vdCByZXBsaWNhdGVkIHdoZW4gdW5pb25pbmcsCi0gICAgICAgICAgICAgICAgICogYnV0IGNhbiBiZSBmb3IgTWFueVRvTWFueSByZWxhdGlvbnNoaXBzLCB3aGVuIHRoZSBqb2luIHRhYmxlIG5lZWRzIHRvIGJlIHJlcGxpY2F0ZWQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgYm9vbGVhbiByZXBsaWNhdGVXcml0ZXMoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXBsaWNhdGUtd3JpdGVzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBpbm5lZC1wYXJ0aXRpb25pbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAvKiogCi0gICAgICAgICAqIFBpbm5lZFBhcnRpdGlvbmluZyBwaW5zIHJlcXVlc3RzIHRvIGEgc2luZ2xlIGNvbm5lY3Rpb24gcG9vbC4KLSAgICAgICAgICogCi0gICAgICAgICAqIFBhcnRpdGlvbmluZyBjYW4gYmUgZW5hYmxlZCBvbiBhbiBFbnRpdHksIHJlbGF0aW9uc2hpcCwgcXVlcnksIG9yIHNlc3Npb24vcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlBpbm5lZFBhcnRpdGlvbmluZ1BvbGljeQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBpbm5lZFBhcnRpdGlvbmluZyB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRoZSBjb25uZWN0aW9uIHBvb2wgbmFtZSB0byBwaW4gcXVlcmllcyB0by4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIGNvbm5lY3Rpb25Qb29sKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb25uZWN0aW9uLXBvb2wiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4tcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW5SZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgb24gYW4gRW50aXR5LgotICAgICAgICAgKiBJdCBpcyByZXF1aXJlZCB0aGF0IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgYmUgc3BlY2lmaWVkIAotICAgICAgICAgKiBhcyB0aGUgYXJndW1lbnQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3Mgb3IgCi0gICAgICAgICAqIEVtYmVkZGFibGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBGb3IgaW5zdGFuY2U6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENvcHlQb2xpY3koImV4YW1wbGUuTXlDb3B5UG9saWN5IikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvcHlQb2xpY3kgewotCi0gICAgICAgIC8qCi0gICAgICAgICogKFJlcXVpcmVkKQotICAgICAgICAqIFRoaXMgZGVmaW5lcyB0aGUgY2xhc3Mgb2YgdGhlIGNvcHkgcG9saWN5LiBJdCBtdXN0IHNwZWNpZnkgYSBjbGFzcyAKLSAgICAgICAgKiB0aGF0IGltcGxlbWVudHMgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5Ci0gICAgICAgICovCi0gICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICJEVFlQRSI7Ci0gICAgICAgICAgRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUoKSBkZWZhdWx0IFNUUklORzsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMzE7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIERpc2NyaW1pbmF0b3JDbGFzcyBpcyB1c2VkIHdpdGhpbiBhIFZhcmlhYmxlT25lVG9PbmUgYW5ub3RhdGlvbi4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHt9KSAKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ2xhc3MgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGRpc2NyaW1pbmF0b3IgdG8gYmUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3IoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNsYXNzIHRvIHRoZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gCi0gICAgICAgICAgICogZGlzY3JpbWluYXRvci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBEaXNjcmltaW5hdG9yVHlwZSB7IFNUUklORywgQ0hBUiwgSU5URUdFUiB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFSIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlRFR0VSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JWYWx1ZSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRWxlbWVudENvbGxlY3Rpb24gewotICAgICAgICAgIENsYXNzIHRhcmdldENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTp0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTp0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTplbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bG9iIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjIiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sbGVjdGlvbi10YWJsZSIgdHlwZT0ib3JtOmNvbGxlY3Rpb24tdGFibGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW9uLWRlbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhdGNoLWZldGNoIiB0eXBlPSJvcm06YmF0Y2gtZmV0Y2giIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLQotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uY2FjaGVhYmxlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJvcm06cGFydGl0aW9uaW5nLWdyb3VwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBlbWJlZGRhYmxlIG9iamVjdHMuIElzIAotICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgCi0gICAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHByb2Nlc3NlZCAKLSAgICAgICAgaW4gdGhlIGNsYXNzLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGRlZmF1bHRpbmcgcnVsZXMgd2lsbCAKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRhYmxlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwYXJlbnQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkLWlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWRJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgYW4gZW50aXR5IGxpc3RlbmVyIHRvIGJlIGludm9rZWQgYXQgbGlmZWN5Y2xlIGV2ZW50cwotICAgICAgICBmb3IgdGhlIGVudGl0aWVzIHRoYXQgbGlzdCB0aGlzIGxpc3RlbmVyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlMaXN0ZW5lcnMgewotICAgICAgICAgIENsYXNzW10gdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXIiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eVJlc3VsdCB7Ci0gICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MoKTsKLSAgICAgICAgICBGaWVsZFJlc3VsdFtdIGZpZWxkcygpIGRlZmF1bHQge307Ci0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkLXJlc3VsdCIgdHlwZT0ib3JtOmZpZWxkLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImVudGl0eS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW0tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEVudW1UeXBlIHsKLSAgICAgICAgICBPUkRJTkFMLAotICAgICAgICAgIFNUUklORwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUkRJTkFMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtZXJhdGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW51bWVyYXRlZCB7Ci0gICAgICAgICAgRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOmVudW0tdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmZXRjaC1hdHRyaWJ1dGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGZXRjaEF0dHJpYnV0ZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgZmV0Y2ggYXR0cmlidXRlIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmV0Y2gtZ3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGZXRjaEdyb3VwIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBmZXRjaCBncm91cCBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBJbmRpY2F0ZXMgd2hldGhlciBhbGwgcmVsYXRpb25zaGlwIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgKiBzcGVjaWZpZWQgaW4gdGhlIGZldGNoIGdyb3VwIHNob3VsZCBiZSBsb2FkZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBsb2FkKCkgZGVmYXVsdCB0cnVlOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGxpc3Qgb2YgYXR0cmlidXRlcyB0byBmZXRjaC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiIHR5cGU9Im9ybTpmZXRjaC1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibG9hZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEZldGNoVHlwZSB7IExBWlksIEVBR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQVpZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEZpZWxkUmVzdWx0IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgR2VuZXJhdGVkVmFsdWUgewotICAgICAgICAgIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBBVVRPOwotICAgICAgICAgIFN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmdlbmVyYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJnZW5lcmF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBHZW5lcmF0aW9uVHlwZSB7IFRBQkxFLCBTRVFVRU5DRSwgSURFTlRJVFksIEFVVE8gfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRVFVRU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURFTlRJVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluZGV4IiB0eXBlPSJvcm06aW5kZXgiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImdlbmVyYXRlZC12YWx1ZSIgdHlwZT0ib3JtOmdlbmVyYXRlZC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZC1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkQ2xhc3MgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImlkLXZhbGlkYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBJZFZhbGlkYXRpb24gZW51bSBkZXRlcm1pbmVzIHRoZSB0eXBlIHZhbHVlIHRoYXQgYXJlIHZhbGlkIGZvciBhbiBJZC4KLSAgICAgICAgICogQnkgZGVmYXVsdCBudWxsIGlzIG5vdCBhbGxvd2VkLCBhbmQgMCBpcyBub3QgYWxsb3cgZm9yIHNpbmdsZXRvbiBpZHMgb2YgbG9uZyBvciBpbnQgdHlwZS4KLSAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgWkVSTyBmb3Igc2luZ2xldG9uIGlkcywgYW5kIE5VTEwgZm9yIGNvbXBvc2l0ZSBpZHMuCi0gICAgICAgICAqIFRoaXMgY2FuIGJlIHNldCB1c2luZyB0aGUgQFByaW1hcnlLZXkgYW5ub3RhdGlvbiwgb3IgQ2xhc3NEZXNjcmlwdG9yIEFQSS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgUHJpbWFyeUtleQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLkNsYXNzRGVzY3JpcHRvciNzZXRJZFZhbGlkYXRpb24oSWRWYWxpZGF0aW9uKQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMCAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBJZFZhbGlkYXRpb24gewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBPbmx5IG51bGwgaXMgbm90IGFsbG93ZWQgYXMgYW4gaWQgdmFsdWUsIDAgaXMgYWxsb3dlZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTlVMTCwKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBudWxsIGFuZCAwIGFyZSBub3QgYWxsb3dlZCwgKG9ubHkgaW50IGFuZCBsb25nKS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgWkVSTywKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBObyBpZCB2YWxpZGF0aW9uIGlzIGRvbmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVUxMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaRVJPIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLWtleS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ29uZmlndXJlcyB3aGF0IHR5cGUgb2YgSWQgdmFsdWUgaXMgdXNlZCB0byBzdG9yZSB0aGUgb2JqZWN0IGluIHRoZSBjYWNoZS4KLSAgICAgICAgICAgICAqIFRoaXMgY2FuIGVpdGhlciBiZSB0aGUgYmFzaWMgSWQgdmFsdWUgZm9yIHNpbXBsZSBzaW5nbGV0b24gSWRzLAotICAgICAgICAgICAgICogb3IgYW4gb3B0aW1pemVkIENhY2hlS2V5IHR5cGUuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgUHJpbWFyeUtleSNjYWNoZUtleVR5cGUoKQotICAgICAgICAgICAgICogQHNlZSBDbGFzc0Rlc2NyaXB0b3Ijc2V0Q2FjaGVLZXlUeXBlKENhY2hlS2V5VHlwZSkKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgZW51bSBDYWNoZUtleVR5cGUgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoaXMgY2FuIG9ubHkgYmUgdXNlZCBmb3Igc2ltcGxlIHNpbmdsZXRvbiBJZHMsIHN1Y2ggYXMgbG9uZy9pbnQvU3RyaW5nLgotICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIHNpbXBsZSBzaW5nbGV0b24gSWRzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIElEX1ZBTFVFLAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogT3B0aW1pemVkIGNhY2hlIGtleSB0eXBlIHRoYXQgYWxsb3dzIGNvbXBvc2l0ZSBhbmQgY29tcGxleCB2YWx1ZXMuCi0gICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgY29tcG9zaXRlIG9yIGNvbXBsZXggSWRzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIENBQ0hFX0tFWSwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoZSBjYWNoZSBrZXkgdHlwZSBpcyBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZWQgZGVwZW5kaW5nIG9uIHdoYXQgaXMgb3B0aW1hbCBmb3IgdGhlIGNsYXNzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEFVVE8KLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURfVkFMVUUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQ0hFX0tFWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmhlcml0YW5jZSB7Ci0gICAgICAgICAgSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBTSU5HTEVfVEFCTEU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06aW5oZXJpdGFuY2UtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUKLSAgICAgICAgICB7IFNJTkdMRV9UQUJMRSwgSk9JTkVELCBUQUJMRV9QRVJfQ0xBU1N9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lOR0xFX1RBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT0lORUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFX1BFUl9DTEFTUyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5JbnN0YW50aWF0aW9uQ29weVBvbGljeSAKLSAgICAgICAgICogb24gYW4gRW50aXR5LiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB0aGUgZGVmYXVsdCBDb3B5UG9saWN5IGluIAotICAgICAgICAgKiBFY2xpcHNlTGluayBhbmQgdGhlcmVmb3JlIHRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaXMgb25seSB1c2VkIHRvIAotICAgICAgICAgKiBvdmVycmlkZSBvdGhlciB0eXBlcyBvZiBjb3B5IHBvbGljaWVzCi0gICAgICAgICAqIAotICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3Mgb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQEluc3RhbnRpYXRpb25Db3B5UG9saWN5IAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgewotICAgICAgICB9Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEpvaW5GZXRjaFR5cGUgewotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBkb2VzIG5vdCBhbGxvdyBmb3IgbnVsbC9lbXB0eSB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBJTk5FUiwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBhbGxvd3MgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgotICAgICAgICAgKi8KLSAgICAgICAgT1VURVIsCi0gICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTk5FUiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VURVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJiYXRjaC1mZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBwdWJsaWMgZW51bSBCYXRjaEZldGNoVHlwZSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3JtIG9mIGJhdGNoIHJlYWRpbmcuCi0gICAgICAgICAgICAgICAgICogVGhlIG9yaWdpbmFsIHF1ZXJ5J3Mgc2VsZWN0aW9uIGNyaXRlcmlhIGlzIGpvaW5lZCB3aXRoIHRoZSBiYXRjaCBxdWVyeS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBKT0lOLAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhpcyB1c2VzIGFuIFNRTCBFWElTVFMgYW5kIGEgc3ViLXNlbGVjdCBpbiB0aGUgYmF0Y2ggcXVlcnkgaW5zdGVhZCBvZiBhIGpvaW4uCi0gICAgICAgICAgICAgICAgICogVGhpcyBoYXMgdGhlIGFkdmFudGFnZSBvZiBub3QgcmVxdWlyaW5nIGFuIFNRTCBESVNUSU5DVCB3aGljaCBjYW4gaGF2ZSBpc3N1ZXMKLSAgICAgICAgICAgICAgICAgKiB3aXRoIExPQnMsIG9yIG1heSBiZSBtb3JlIGVmZmljaWVudCBmb3Igc29tZSB0eXBlcyBvZiBxdWVyaWVzIG9yIG9uIHNvbWUgZGF0YWJhc2VzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEVYSVNUUywKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoaXMgdXNlcyBhbiBTUUwgSU4gY2xhdXNlIGluIHRoZSBiYXRjaCBxdWVyeSBwYXNzaW5nIGluIHRoZSBzb3VyY2Ugb2JqZWN0IElkcy4KLSAgICAgICAgICAgICAgICAgKiBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIG9mIG9ubHkgc2VsZWN0aW5nIHRoZSBvYmplY3RzIG5vdCBhbHJlYWR5IGNvbnRhaW5lZCBpbiB0aGUgY2FjaGUsCi0gICAgICAgICAgICAgICAgICogYW5kIGNhbiB3b3JrIGJldHRlciB3aXRoIGN1cnNvcnMsIG9yIGlmIGpvaW5zIGNhbm5vdCBiZSB1c2VkLgotICAgICAgICAgICAgICAgICAqIFRoaXMgbWF5IG9ubHkgd29yayBmb3Igc2luZ2xldG9uIElkcyBvbiBzb21lIGRhdGFiYXNlcy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBJTiAgICAKLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPSU4iLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVYSVNUUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gaW52ZXJzZUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZlcnNlLWpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjcmVhdGlvbi1zdWZmaXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBMb2Ige30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJsb2NrLW1vZGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIExvY2tNb2RlVHlwZSB7IFJFQUQsIFdSSVRFLCBPUFRJTUlTVElDLCBPUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCwgUEVTU0lNSVNUSUNfUkVBRCwgUEVTU0lNSVNUSUNfV1JJVEUsIFBFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCwgTk9ORX07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRUFEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXUklURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU1JU1RJQyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFU1NJTUlTVElDX1JFQUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFU1NJTUlTVElDX1dSSVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLQotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1tYW55Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1jb2x1bW4iIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNsYXNzIiB0eXBlPSJvcm06bWFwLWtleS1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTp0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXR0cmlidXRlLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtb24tZGVsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vbmNhY2hlYWJsZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0ib3JtOnBhcnRpdGlvbmluZy1ncm91cCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9PbmUgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPiAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vbmNhY2hlYWJsZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0ib3JtOnBhcnRpdGlvbmluZy1ncm91cCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBzLWlkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlDbGFzcyB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5Q29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7Ci0gICAgICAgICAgaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBwcmVjaXNpb24KLSAgICAgICAgICBpbnQgc2NhbGUoKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgc2NhbGUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhIG1hcHBlZCBzdXBlcmNsYXNzLiBJcyAKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCi0gICAgICAgIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5IAotICAgICAgICBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBwZWRTdXBlcmNsYXNze30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkZGl0aW9uYWwtY3JpdGVyaWEiIHR5cGU9Im9ybTphZGRpdGlvbmFsLWNyaXRlcmlhIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleSIgdHlwZT0ib3JtOnByaW1hcnkta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlIiB0eXBlPSJvcm06Y2FjaGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlLWludGVyY2VwdG9yIiB0eXBlPSJvcm06Y2FjaGUtaW50ZXJjZXB0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZldGNoLWdyb3VwIiB0eXBlPSJvcm06ZmV0Y2gtZ3JvdXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpncm91cCByZWY9Im9ybTpwYXJ0aXRpb25pbmctZ3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeS1yZWRpcmVjdG9ycyIgdHlwZT0ib3JtOnF1ZXJ5LXJlZGlyZWN0b3JzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFyZW50LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYWNoZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWROYXRpdmVRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOyAvL25hbWVkIFNxbFJlc3VsdFNldE1hcHBpbmcKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBMb2NrTW9kZVR5cGUgbG9ja01vZGUoKSBkZWZhdWx0IE5PTkU7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2stbW9kZSIgdHlwZT0ib3JtOmxvY2stbW9kZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbiBhbGxvd3MgdGhlIGRlZmluaXRpb24gb2YgCi0gICAgICAgICAqIHF1ZXJpZXMgdGhhdCBjYWxsIHN0b3JlZCBwcm9jZWR1cmVzIGFzIG5hbWVkIHF1ZXJpZXMuCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvcgotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFVuaXF1ZSBuYW1lIHRoYXQgcmVmZXJlbmNlcyB0aGlzIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgUXVlcnkgaGludHMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBSZWZlcnMgdG8gdGhlIGNsYXNzIG9mIHRoZSByZXN1bHQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBTUUxSZXN1bHRNYXBwaW5nLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIG5hbWUgb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHByb2NlZHVyZU5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgV2hldGhlciB0aGUgcXVlcnkgc2hvdWxkIHJldHVybiBhIHJlc3VsdCBzZXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiByZXR1cm5zUmVzdWx0U2V0KCkgZGVmYXVsdCB0cnVlOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyBhcmd1bWVudHMgdG8gdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyW10gcGFyYW1ldGVycygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiIHR5cGU9Im9ybTpzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJldHVybnMtcmVzdWx0LXNldCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT2JqZWN0VHlwZUNvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlCi0gICAgICAgICAgICogYWNyb3NzIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgCi0gICAgICAgICAgICogZmllbGQgb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgY29udmVyc2lvbiB2YWx1ZXMgdG8gYmUgdXNlZCAKLSAgICAgICAgICAgKiB3aXRoIHRoZSBvYmplY3QgY29udmVydGVyLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnNpb25WYWx1ZVtdIGNvbnZlcnNpb25WYWx1ZXMoKTsKLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IGEgZGVmYXVsdCBvYmplY3QgdmFsdWUuIFVzZWQgZm9yIAotICAgICAgICAgICAgKiBsZWdhY3kgZGF0YSBpZiB0aGUgZGF0YSB2YWx1ZSBpcyBtaXNzaW5nLgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnNpb24tdmFsdWUiIHR5cGU9Im9ybTpjb252ZXJzaW9uLXZhbHVlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1vYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW1hbnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb01hbnkgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jbGFzcyIgdHlwZT0ib3JtOm1hcC1rZXktY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06dGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1lbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTplbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgPC94c2Q6Y2hvaWNlPgotICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW9uLWRlbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhdGNoLWZldGNoIiB0eXBlPSJvcm06YmF0Y2gtZmV0Y2giIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uY2FjaGVhYmxlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJvcm06cGFydGl0aW9uaW5nLWdyb3VwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9ycGhhbi1yZW1vdmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9PbmUgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gb3JwaGFuUmVtb3ZhbCgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtb24tZGVsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vbmNhY2hlYWJsZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0ib3JtOnBhcnRpdGlvbmluZy1ncm91cCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBzLWlkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAqIG9wdGltaXN0aWMgbG9ja2luZyBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgCi0gICAgICAgICAqIGVudGl0aWVzLiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24KLSAgICAgICAgICogYW4gZW50aXR5IG9yIG1hcHBlZC1zdXBlcmNsYXNzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSXQgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBvcHRpbWlzdGljLWxvY2tpbmctdHlwZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcHRpbWlzdGljTG9ja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHRvIHVzZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPcHRpbWlzdGljTG9ja2luZ1R5cGUgdHlwZSgpIGRlZmF1bHQgVkVSU0lPTl9DT0xVTU47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IG9mIHR5cGUgCi0gICAgICAgICAgICogU0VMRUNURURfQ09MVU1OUywgdGhpcyBhbm5vdGF0aW9uIG1lbWJlciBiZWNvbWVzIGEgKFJlcXVpcmVkKSAKLSAgICAgICAgICAgKiBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBzZWxlY3RlZENvbHVtbnMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHdoZXJlIHRoZSBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHNob3VsZCAKLSAgICAgICAgICAgKiBjYXNjYWRlIGxvY2suIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB3aXRoIFZFUlNJT05fQ09MVU1OIGxvY2tpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBjYXNjYWRlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWxlY3RlZC1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FzY2FkZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmctdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBzaW1wbGUgdHlwZSB0aGF0IGlzIHVzZWQgd2l0aGluIGFuIG9wdGltaXN0aWMtbG9ja2luZyAKLSAgICAgICAgICogc3BlY2lmaWNhdGlvbiB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIG9wdGltaXN0aWMtbG9ja2luZyB0aGF0Ci0gICAgICAgICAqIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyBlbnRpdGllcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIE9wdGltaXN0aWNMb2NraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGV2ZXJ5IGZpZWxkIGluIHRoZSB0YWJsZQotICAgICAgICAgICAqIGluIHRoZSBXSEVSRSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUgb3IgYSBkZWxldGUuIElmIGFueSBmaWVsZAotICAgICAgICAgICAqIGhhcyBiZWVuIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgQUxMX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgb25seSB0aGUgY2hhbmdlZCBmaWVsZHMKLSAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBBIGRlbGV0ZQotICAgICAgICAgICAqIHdpbGwgb25seSBjb21wYXJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDSEFOR0VEX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBjb21wYXJlcyBzZWxlY3RlZCBmaWVsZHMgaW4gdGhlIFdIRVJFCi0gICAgICAgICAgICogY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBOb3RlIHRoYXQKLSAgICAgICAgICAgKiB0aGUgZmllbGRzIHNwZWNpZmllZCBtdXN0IGJlIG1hcHBlZCBhbmQgbm90IGJlIHByaW1hcnkga2V5cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRUxFQ1RFRF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGEgc2luZ2xlIHZlcnNpb24gbnVtYmVyCi0gICAgICAgICAgICogaW4gdGhlIHdoZXJlIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gVGhlIHZlcnNpb24gZmllbGQgbXVzdCBiZQotICAgICAgICAgICAqIG1hcHBlZCBhbmQgbm90IGJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBWRVJTSU9OX0NPTFVNTgotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMTF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFOR0VEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTEVDVEVEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZFUlNJT05fQ09MVU1OIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+ICAKLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJCeSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9yZGVyLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29ycmVjdGlvbi10eXBlIiB0eXBlPSJvcm06b3JkZXItY29sdW1uLWNvcnJlY3Rpb24tdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWNvbHVtbi1jb3JyZWN0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBPcmRlckNvcnJlY3Rpb25UeXBlIHsKLSAgICAgICAgICBSRUFELAotICAgICAgICAgIFJFQURfV1JJVEUsCi0gICAgICAgICAgRVhDRVBUSU9OCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFQUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFQURfV1JJVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVYQ0VQVElPTiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LWxvYWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RMb2FkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcGVyc2lzdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVJlbW92ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVVwZGF0ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBUaGUgUHJpbWFyeUtleSBhbm5vdGF0aW9uIGFsbG93cyBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9mIHRoZSBJZC4KLSAgICAgICAgICogIEEgdmFsaWRhdGlvbiBwb2xpY3kgY2FuIGJlIGdpdmVuIHRoYXQgYWxsb3dzIHNwZWNpZnlpbmcgaWYgemVybyBpcyBhIHZhbGlkIGlkIHZhbHVlLgotICAgICAgICAgKiAgVGhlIHNldCBvZiBwcmltYXJ5IGtleSBjb2x1bW5zIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBwcmVjaXNlbHkuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMQotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJpbWFyeUtleSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgaWQgdmFsaWRhdGlvbiBpcyBkb25lLgotICAgICAgICAgICAqIEJ5IGRlZmF1bHQgMCBpcyBub3QgYSB2YWxpZCBpZCB2YWx1ZSwgdGhpcyBjYW4gYmUgdXNlZCB0byBhbGxvdyAwIGlkIHZhbHVlcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJZFZhbGlkYXRpb24gdmFsaWRhdGlvbigpIGRlZmF1bHQgSWRWYWxpZGF0aW9uLlpFUk87IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgY2FjaGUga2V5IHR5cGUgaXMgdXNlZCB0byBzdG9yZSB0aGUgb2JqZWN0IGluIHRoZSBjYWNoZS4KLSAgICAgICAgICAgKiBCeSBkZWZhdWx0IHRoZSB0eXBlIGlzIGRldGVybWluZWQgYnkgd2hhdCB0eXBlIGlzIG9wdGltYWwgZm9yIHRoZSBjbGFzcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDYWNoZUtleVR5cGUgY2FjaGVLZXlUeXBlKCkgZGVmYXVsdCBDYWNoZUtleVR5cGUuQVVUTzsKLSAgICAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVzZWQgdG8gc3BlY2lmeSB0aGUgcHJpbWFyeSBrZXkgY29sdW1ucyBkaXJlY3RseS4KLSAgICAgICAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgQElkIGlmIHRoZSBwcmltYXJ5IGtleSBpbmNsdWRlcyBhIG5vbiBiYXNpYyBmaWVsZCwKLSAgICAgICAgICAgKiBzdWNoIGFzIGEgZm9yZWlnbiBrZXksIG9yIGEgaW5oZXJpdGFuY2UgZGlzY3JpbWluYXRvciwgZW1iZWRkZWQsIG9yIHRyYW5zZm9ybWF0aW9uIG1hcHBlZCBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWxpZGF0aW9uIiB0eXBlPSJvcm06aWQtdmFsaWRhdGlvbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlLWtleS10eXBlIiB0eXBlPSJvcm06Y2FjaGUta2V5LXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEEgdXNlciBkZWZpbmVkIG1hcHBpbmcncyBwcm9wZXJ0eS4KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgVFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJvcGVydHkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFByb3BlcnR5IG5hbWUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgUHJvcGVydHkgdmFsdWUsCi0gICAgICAgICAgICogY29udmVydGVkIHRvIGFuIGluc3RhbmNlIG9mIHZhbHVlVHlwZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBQcm9wZXJ0eSB2YWx1ZSB0eXBlLgotICAgICAgICAgICAqIFRoZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gdmFsdWVUeXBlIGJ5IENvbnZlcnNpb25NYW5hZ2VyLgotICAgICAgICAgICAqIElmIHNwZWNpZmllZCBtdXN0IGJlIGEgc2ltcGxlIHR5cGUgdGhhdCBjb3VsZCBiZSBoYW5kbGVkIGJ5IAotICAgICAgICAgICAqIENvbnZlcnNpb25NYW5hZ2VyOiAKLSAgICAgICAgICAgKiBudW1lcmljYWwsIGJvb2xlYW4sIHRlbXBvcmFsLiAgCi0gICAgICAgICAgICovIAotICAgICAgICAgIENsYXNzIHZhbHVlVHlwZSgpIGRlZmF1bHQgU3RyaW5nLmNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWhpbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpIAotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBRdWVyeUhpbnQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktcmVkaXJlY3RvcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLXB1YmxpYyBAaW50ZXJmYWNlIFF1ZXJ5UmVkaXJlY3RvcnMgewotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgQWxsUXVlcmllcyBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nIG9iamVjdCBxdWVyeQotICAgICAqIHRoYXQgZG9lcyBub3QgaGF2ZSBhIG1vcmUgcHJlY2lzZSByZWRpcmVjdG9yIChsaWtlIHRoZSAKLSAgICAgKiBSZWFkT2JqZWN0UXVlcnkgUmVkaXJlY3Rvcikgb3IgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogCi0gICAgICovCi0gICAgQ2xhc3MgYWxsUXVlcmllcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIERlZmF1bHQgUmVhZEFsbCBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogUmVhZEFsbFF1ZXJ5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIHJlZGlyZWN0b3Igc2V0IGRpcmVjdGx5IG9uIHRoZSBxdWVyeS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKiBGb3IgdXNlcnMgZXhlY3V0aW5nIGEgSlBBIFF1ZXJ5IHRocm91Z2ggdGhlIGdldFJlc3VsdExpc3QoKSBBUEkgdGhpcyBpcyB0aGUgcmVkaXJlY3RvciB0aGF0IHdpbGwgYmUgaW52b2tlZAotICAgICAqLwotICAgIENsYXNzIHJlYWRBbGwoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFJlYWRPYmplY3QgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIFJlYWRPYmplY3RRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogRm9yIHVzZXJzIGV4ZWN1dGluZyBhIEpQQSBRdWVyeSB0aHJvdWdoIHRoZSBnZXRTaW5nbGVSZXN1bHQoKSBBUEkgb3IgRW50aXR5TWFuYWdlci5maW5kKCkgdGhpcyBpcyB0aGUgcmVkaXJlY3RvciB0aGF0IHdpbGwgYmUgaW52b2tlZAotICAgICAqLwotICAgIENsYXNzIHJlYWRPYmplY3QoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFJlcG9ydFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBSZXBvcnRRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogRm9yIHVzZXJzIGV4ZWN1dGluZyBhIEpQQSBRdWVyeSB0aGF0IGNvbnRhaW5zIGFncmVnYXRlIGZ1bmN0aW9ucyBvciBzZWxlY3RzIG11bHRpcGxlIGVudGl0aWVzIHRoaXMgaXMgdGhlIHJlZGlyZWN0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQKLSAgICAgKi8KLSAgICBDbGFzcyByZXBvcnQoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFVwZGF0ZSBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogVXBkYXRlT2JqZWN0UXVlcnkgb3IgVXBkYXRlQWxsUXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAqIEluIEVjbGlwc2VMaW5rIGFuIFVwZGF0ZU9iamVjdFF1ZXJ5IGlzIGV4ZWN1dGVkIHdoZW5ldmVyIGZsdXNoaW5nIGNoYW5nZXMgdG8gdGhlIGRhdGFzb3VyY2UuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICovIAotICAgIENsYXNzIHVwZGF0ZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIERlZmF1bHQgSW5zZXJ0IFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBJbnNlcnRPYmplY3RRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogSW4gRWNsaXBzZUxpbmsgYW4gSW5zZXJ0T2JqZWN0UXVlcnkgaXMgZXhlY3V0ZWQgd2hlbiBwZXJzaXN0aW5nIGFuIG9iamVjdCB0byB0aGUgZGF0YXNvdXJjZS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKi8KLSAgICBDbGFzcyBpbnNlcnQoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IERlbGV0ZSBPYmplY3QgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIERlbGV0ZU9iamVjdFF1ZXJ5IG9yIERlbGV0ZUFsbFF1ZXJ5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIHJlZGlyZWN0b3Igc2V0IGRpcmVjdGx5IG9uIHRoZSBxdWVyeS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKi8KLSAgICBDbGFzcyBkZWxldGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLX0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGwtcXVlcmllcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtYWxsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vYmplY3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXBvcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkZWxldGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC10cmFuc2Zvcm1lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbm5vdGF0aW9uIGZvciBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0gICAgICAgICAqIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgCi0gICAgICAgICAqIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgCi0gICAgICAgICAqIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSZWFkVHJhbnNmb3JtZXIgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVc2VyLWRlZmluZWQgY2xhc3MgdGhhdCBtdXN0IGltcGxlbWVudCB0aGUgCi0gICAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy50cmFuc2Zvcm1lcnMuQXR0cmlidXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAgICAgKiBpbnRlcmZhY2UuIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCwgaXRzIAotICAgICAgICAgICAgICogYnVpbGRBdHRyaWJ1dGVWYWx1ZSB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSAKLSAgICAgICAgICAgICAqIGFzc2lnbmVkIHRvIHRoZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIENsYXNzIHRyYW5zZm9ybWVyQ2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLSAgICAgICAgICAgICAqIGEgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZSAobm90IGFzc2lnbnMgdGhlIHZhbHVlIHRvIAotICAgICAgICAgICAgICogdGhlIGF0dHJpYnV0ZSkuIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIAotICAgICAgICAgICAgICogc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmV0dXJuLWluc2VydCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFJldHVybkluc2VydCB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEEgUmV0dXJuSW5zZXJ0IGFubm90YXRpb24gYWxsb3dzIGZvciBJTlNFUlQgb3BlcmF0aW9ucyB0byByZXR1cm4gCi0gICAgICAgICAgICAgKiB2YWx1ZXMgYmFjayBpbnRvIHRoZSBvYmplY3QgYmVpbmcgd3JpdHRlbi4gVGhpcyBhbGxvd3MgZm9yIHRhYmxlIAotICAgICAgICAgICAgICogZGVmYXVsdCB2YWx1ZXMsIHRyaWdnZXIgb3Igc3RvcmVkIHByb2NlZHVyZXMgY29tcHV0ZWQgdmFsdWVzIHRvIAotICAgICAgICAgICAgICogYmUgc2V0IGJhY2sgaW50byB0aGUgb2JqZWN0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBib29sZWFuIHJldHVybk9ubHkoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm4tb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWNvbmRhcnktdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZWNvbmRhcnlUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwa0pvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjcmVhdGlvbi1zdWZmaXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZXF1ZW5jZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgc2VxdWVuY2VOYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMTsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VxdWVuY2UtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3FsUmVzdWx0U2V0TWFwcGluZyB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBFbnRpdHlSZXN1bHRbXSBlbnRpdGllcygpIGRlZmF1bHQge307Ci0gICAgICAgICAgQ29sdW1uUmVzdWx0W10gY29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1yZXN1bHQiIHR5cGU9Im9ybTplbnRpdHktcmVzdWx0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLXJlc3VsdCIgdHlwZT0ib3JtOmNvbHVtbi1yZXN1bHQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYW5ub3RhdGlvbiBpcyB1c2VkIHdpdGhpbiBhIAotICAgICAgICAgKiBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24uIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe30pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyLgotICAgICAgICAgICAqLwotICAgICAgICAgIERpcmVjdGlvbiBkaXJlY3Rpb24oKSBkZWZhdWx0IElOOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTdG9yZWQgcHJvY2VkdXJlIHBhcmFtZXRlciBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIHF1ZXJ5IHBhcmFtZXRlciBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBxdWVyeVBhcmFtZXRlcigpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBKYXZhIGNsYXNzIGRlc2lyZWQgYmFjayBmcm9tIHRoZSBwcm9jZWR1cmUsIAotICAgICAgICAgICAqIHRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB0eXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgSkRCQyB0eXBlIGNvZGUsIHRoaXMgZGVwZW5kZW50IG9uIHRoZSB0eXBlIHJldHVybmVkIAotICAgICAgICAgICAqIGZyb20gdGhlIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBpbnQgamRiY1R5cGUoKSBkZWZhdWx0IC0xOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgSkRCQyB0eXBlIG5hbWUsIHRoaXMgbWF5IGJlIHJlcXVpcmVkIGZvciBBUlJBWSBvciAKLSAgICAgICAgICAgKiBTVFJVQ1QgdHlwZXMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGpkYmNUeXBlTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0ib3JtOmRpcmVjdGlvbi10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InF1ZXJ5LXBhcmFtZXRlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iamRiYy10eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RydWN0LWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0cnVjdENvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlIGFjcm9zcyAKLSAgICAgICAgICAgKiB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY29udmVydGVyIGNsYXNzIHRvIGJlIHVzZWQuIFRoaXMgY2xhc3MgbXVzdCAKLSAgICAgICAgICAgKiBpbXBsZW1lbnQgdGhlIEVjbGlwc2VMaW5rIGludGVyZmFjZSAKLSAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBjb252ZXJ0ZXIoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNyZWF0aW9uLXN1ZmZpeCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5kZXgiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFsbG93IGEgZGF0YWJhc2UgSU5ERVggdG8gYmUgZGVmaW5lIHdoZW4gZ2VuZXJhdGluZyBEREwuCi0gICAgICAgICAqIFRoZSBASW5kZXggY2FuIGJlIGRlZmluZWQgb24gYSBFbnRpdHkgY2xhc3MsIG9yIG9uIGFuIGF0dHJpYnV0ZS4KLSAgICAgICAgICogVGhlIGNvbHVtbiBpcyBkZWZhdWx0ZWQgd2hlbiBkZWZpbmVkIG9uIGEgYXR0cmlidXRlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmRleCB7Ci0gICAgICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIElOREVYLCBkZWZhdWx0cyB0byBJTkRFWF8odGFibGUtbmFtZSkgKi8KLSAgICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgc2NoZW1hIG9mIHRoZSBJTkRFWCAqLwotICAgICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgY2F0YWxvZyBvZiB0aGUgSU5ERVggKi8KLSAgICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqIFRoZSB0YWJsZSB0byBkZWZpbmUgdGhlIGluZGV4IG9uLCBkZWZhdWx0cyB0byBlbnRpdGllcyBwcmltYXJ5IHRhYmxlLiAqLwotICAgICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNwZWNpZnkgdGhlIHNldCBvZiBjb2x1bW5zIHRvIGRlZmluZSB0aGUgaW5kZXggb24uCi0gICAgICAgICAgICAgKiBOb3QgcmVxdWlyZWQgd2hlbiBhbm5vdGF0ZWQgb24gYSBmaWVsZC9tZXRob2QuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5WYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMDsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY3JlYXRpb24tc3VmZml4IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUZW1wb3JhbCB7Ci0gICAgICAgICAgVGVtcG9yYWxUeXBlIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOnRlbXBvcmFsLXR5cGUiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBUZW1wb3JhbFR5cGUgewotICAgICAgICAgIERBVEUsIC8vIGphdmEuc3FsLkRhdGUKLSAgICAgICAgICBUSU1FLCAvLyBqYXZhLnNxbC5UaW1lCi0gICAgICAgICAgVElNRVNUQU1QIC8vIGphdmEuc3FsLlRpbWVzdGFtcAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREFURSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUVTVEFNUCIvPgotICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWUtb2YtZGF5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUaW1lT2ZEYXkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgSG91ciBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgaG91cigpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgTWludXRlIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBtaW51dGUoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2Vjb25kKCkgZGVmYXVsdCAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBNaWxsaXNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgbWlsbGlzZWNvbmQoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnRlcm5hbCB1c2UuIERvIG5vdCBtb2RpZnkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gc3BlY2lmaWVkKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJob3VyIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbnV0ZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWlsbGlzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2Zvcm1hdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbiBpcyBhbiBvcHRpb25hbCBhbm5vdGF0aW9uIGZvciAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgYWxsb3dzIHRvIG1hcCBhbiBhdHRyaWJ1dGUgdG8gb25lIG9yIG1vcmUgCi0gICAgICAgICAqIGRhdGFiYXNlIGNvbHVtbnMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbiBhbm5vdGF0aW9uIGlzIGFuIG9wdGlvbmFsIHBhcnQgb2YgCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBkZWZpbml0aW9uLiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyAKLSAgICAgICAgICogd3JpdGUtb25seSwgaXQgc2hvdWxkIGhhdmUgYSBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgCi0gICAgICAgICAqIHRyYW5zZm9ybWF0aW9uIG9mIGRhdGFiYXNlIGNvbHVtbihzKSB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotICAgICAgICAgKiBBbHNvIHVubGVzcyBpdCdzIGEgcmVhZC1vbmx5IG1hcHBpbmcsIGVpdGhlciBXcml0ZVRyYW5zZm9ybWVyIAotICAgICAgICAgKiBhbm5vdGF0aW9uIG9yIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24gc2hvdWxkIGJlIHNwZWNpZmllZC4gRWFjaCAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKLSAgICAgICAgICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIpLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUcmFuc2Zvcm1hdGlvbiB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSAKLSAgICAgICAgICAgICAqIHRoYXQgdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIAotICAgICAgICAgICAgICogaGludCB0byB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgCi0gICAgICAgICAgICAgKiBkZWZhdWx0cyB0byBFQUdFUi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBvcHRpb25hbCBlbGVtZW50IGlzIGEgaGludCBhcyB0byB3aGV0aGVyIHRoZSB2YWx1ZQotICAgICAgICAgICAgICogIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSBtYXkgYmUgbnVsbC4gSXQgaXMgZGlzcmVnYXJkZWQKLSAgICAgICAgICAgICAqICBmb3IgcHJpbWl0aXZlIHR5cGVzLCB3aGljaCBhcmUgY29uc2lkZXJlZCBub24tb3B0aW9uYWwuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhZC10cmFuc2Zvcm1lciIgdHlwZT0ib3JtOnJlYWQtdHJhbnNmb3JtZXIiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3cml0ZS10cmFuc2Zvcm1lciIgdHlwZT0ib3JtOndyaXRlLXRyYW5zZm9ybWVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNpZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHJhbnNpZW50IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFR5cGVDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZQotICAgICAgICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlLiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbmNlIGZpZWxkIAotICAgICAgICAgICAqIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgZmllbGQgCi0gICAgICAgICAgICogb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9iamVjdC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuaXF1ZS1jb25zdHJhaW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBVbmlxdWVDb25zdHJhaW50IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nW10gY29sdW1uTmFtZXMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKiAKLSAgICAgICAgICogVmFyaWFibGUgb25lIHRvIG9uZSBtYXBwaW5ncyBhcmUgdXNlZCB0byByZXByZXNlbnQgYSBwb2ludGVyIAotICAgICAgICAgKiByZWZlcmVuY2VzIGJldHdlZW4gYSBqYXZhIG9iamVjdCBhbmQgYW4gaW1wbGVtZW50ZXIgb2YgYW4gaW50ZXJmYWNlLiAKLSAgICAgICAgICogVGhpcyBtYXBwaW5nIGlzIHVzdWFsbHkgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgcG9pbnRlciAoc3RvcmVkIGluIGFuIAotICAgICAgICAgKiBpbnN0YW5jZSB2YXJpYWJsZSkgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgb2JqZWN0cy4gSW4gdGhlIAotICAgICAgICAgKiByZWxhdGlvbmFsIGRhdGFiYXNlIHRhYmxlcywgdGhlc2UgbWFwcGluZ3MgYXJlIG5vcm1hbGx5IGltcGxlbWVudGVkIAotICAgICAgICAgKiB1c2luZyBhIGZvcmVpZ24ga2V5IGFuZCBhIHR5cGUgY29kZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEEgVmFyaWFibGVPbmVUb09uZSBjYW4gYmUgc3BlY2lmaWVkIHdpdGhpbiBhbiBFbnRpdHksIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIGFuZCBFbWJlZGRhYmxlIGNsYXNzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVmFyaWFibGVPbmVUb09uZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgaW50ZXJmYWNlIGNsYXNzIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUgCi0gICAgICAgICAgICogYXNzb2NpYXRpb24uIElmIG5vdCBzcGVjaWZpZWQgaXQgd2lsbCBiZSBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIAotICAgICAgICAgICAqIG9mIHRoZSBvYmplY3QgYmVpbmcgcmVmZXJlbmNlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB0YXJnZXRJbnRlcmZhY2UoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBvcGVyYXRpb25zIHRoYXQgbXVzdCBiZSBjYXNjYWRlZCB0byB0aGUgdGFyZ2V0IG9mIAotICAgICAgICAgICAqIHRoZSBhc3NvY2lhdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgCi0gICAgICAgICAgICogdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgCi0gICAgICAgICAgICogaGludCB0byB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgCi0gICAgICAgICAgICogZGVmYXVsdHMgdG8gRUFHRVIuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgV2hldGhlciB0aGUgYXNzb2NpYXRpb24gaXMgb3B0aW9uYWwuIElmIHNldCB0byBmYWxzZSAKLSAgICAgICAgICAgKiB0aGVuIGEgbm9uLW51bGwgcmVsYXRpb25zaGlwIG11c3QgYWx3YXlzIGV4aXN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiB3aWxsIGhvbGQgdGhlIHR5cGUgCi0gICAgICAgICAgICogaW5kaWNhdG9ycy4gSWYgdGhlIERpc2NyaW1pbmF0b3JDb2x1bW4gaXMgbm90IHNwZWNpZmllZCwgdGhlIG5hbWUgCi0gICAgICAgICAgICogb2YgdGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIGRlZmF1bHRzIHRvICJEVFlQRSIgYW5kIHRoZSAKLSAgICAgICAgICAgKiBkaXNjcmltaW5hdG9yIHR5cGUgdG8gU1RSSU5HLgotICAgICAgICAgICAqLwotICAgICAgICAgIERpc2NyaW1pbmF0b3JDb2x1bW4gZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgQERpc2NyaW1pbmF0b3JDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBsaXN0IG9mIGRpc2NyaW1pbmF0b3IgdHlwZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIAotICAgICAgICAgICAqIHRoaXMgVmFyaWFibGVPbmVUb09uZS4gSWYgbm9uZSBhcmUgc3BlY2lmaWVkIHRoZW4gdGhvc2UgZW50aXRpZXMgCi0gICAgICAgICAgICogd2l0aGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHRoYXQgaW1wbGVtZW50IHRoZSB0YXJnZXQgaW50ZXJmYWNlIAotICAgICAgICAgICAqIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgdHlwZXMuIFRoZSBkaXNjcmltaW5hdG9yIHR5cGUgd2lsbCAKLSAgICAgICAgICAgKiBkZWZhdWx0IGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIFNUUklORzogRW50aXR5Lm5hbWUoKQotICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBDSEFSOiBGaXJzdCBsZXR0ZXIgb2YgdGhlIAotICAgICAgICAgICAqICAgIEVudGl0eSBjbGFzcwotICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBJTlRFR0VSOiBUaGUgbmV4dCBpbnRlZ2VyIGFmdGVyIAotICAgICAgICAgICAqICAgIHRoZSBoaWdoZXN0IGludGVnZXIgZXhwbGljaXRseSBhZGRlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBEaXNjcmltaW5hdG9yQ2xhc3NbXSBkaXNjcmltaW5hdG9yQ2xhc3NlcygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jbGFzcyIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY2xhc3MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vbmNhY2hlYWJsZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0ib3JtOnBhcnRpdGlvbmluZy1ncm91cCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtaW50ZXJmYWNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZlcnNpb24ge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmRleCIgdHlwZT0ib3JtOmluZGV4IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuCi0gICAgICAgICAqICAKLSAgICAgICAgICogQSBzaW5nbGUgV3JpdGVUcmFuc2Zvcm1lciBtYXkgYmUgc3BlY2lmaWVkIGRpcmVjdGx5IG9uIHRoZSBtZXRob2Qgb3IgCi0gICAgICAgICAqIGF0dHJpYnV0ZS4gTXVsdGlwbGUgV3JpdGVUcmFuc2Zvcm1lcnMgc2hvdWxkIGJlIHdyYXBwZWQgaW50byAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbi4gTm8gV3JpdGVUcmFuc2Zvcm1lcnMgc3BlY2lmaWVkIGZvciAKLSAgICAgICAgICogcmVhZC1vbmx5IG1hcHBpbmcuIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IAotICAgICAgICAgKiBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSAKLSAgICAgICAgICogY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgV3JpdGVUcmFuc2Zvcm1lciB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKLSAgICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5GaWVsZFRyYW5zZm9ybWVyIAotICAgICAgICAgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyBidWlsZEZpZWxkVmFsdWUgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIAotICAgICAgICAgICAgICogY29sdW1uLiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgCi0gICAgICAgICAgICAgKiBzdXBwb3J0ZWQgdGhlIG1ldGhvZCBidWlsZEZpZWxkVmFsdWUgaW4gdGhlIGNsYXNzIHNob3VsZCBiZSAKLSAgICAgICAgICAgICAqIGRlZmluZWQgdG8gcmV0dXJuIHRoZSByZWxldmFudCBKYXZhIHR5cGUsIG5vdCBqdXN0IE9iamVjdCBhcyAKLSAgICAgICAgICAgICAqIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZSwgZm9yIGluc3RhbmNlOgotICAgICAgICAgICAgICogcHVibGljIFRpbWUgYnVpbGRGaWVsZFZhbHVlKE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIGZpZWxkTmFtZSwgU2Vzc2lvbiBzZXNzaW9uKS4KLSAgICAgICAgICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGUgbWFwcGVkIGNsYXNzIG11c3QgaGF2ZSBhIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSB3aGljaCByZXR1cm5zIAotICAgICAgICAgICAgICogYSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIGNvbHVtbi4KLSAgICAgICAgICAgICAqIE5vdGUgdGhhdCBmb3IgZGRsIGdlbmVyYXRpb24gYW5kIHJldHVybmluZyB0byBiZSBzdXBwb3J0ZWQgdGhlIAotICAgICAgICAgICAgICogbWV0aG9kIHNob3VsZCBiZSBkZWZpbmVkIHRvIHJldHVybiBhIHBhcnRpY3VsYXIgdHlwZSwgbm90IGp1c3QgCi0gICAgICAgICAgICAgKiBPYmplY3QsIGZvciBpbnN0YW5jZToKLSAgICAgICAgICAgICAqIHB1YmxpYyBUaW1lIGdldFN0YXJ0VGltZSgpLgotICAgICAgICAgICAgICogVGhlIG1ldGhvZCBtYXkgcmVxdWlyZSBhIFRyYW5zaWVudCBhbm5vdGF0aW9uIHRvIGF2b2lkIGJlaW5nIAotICAgICAgICAgICAgICogbWFwcGVkIGFzIEJhc2ljIGJ5IGRlZmF1bHQuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNwZWNpZnkgaGVyZSB0aGUgY29sdW1uIGludG8gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuLgotICAgICAgICAgICAgICogVGhlIG9ubHkgY2FzZSB3aGVuIHRoaXMgY291bGQgYmUgc2tpcHBlZCBpcyBpZiBhIHNpbmdsZSAKLSAgICAgICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGVzIGFuIGF0dHJpYnV0ZSAtIHRoZSBhdHRyaWJ1dGUncyBuYW1lIAotICAgICAgICAgICAgICogd2lsbCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWUuCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBDb2x1bW4gY29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXRjaC1mZXRjaCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogQSBCYXRjaEZldGNoIGFubm90YXRpb24gY2FuIGJlIHVzZWQgb24gYW55IHJlbGF0aW9uc2hpcCBtYXBwaW5nLAotICAgICAgICAgKiAoT25lVG9PbmUsIE1hbnlUb09uZSwgT25lVG9NYW55LCBNYW55VG9NYW55LCBFbGVtZW50Q29sbGVjdGlvbiwgQmFzaWNDb2xsZWN0aW9uLCBCYXNpY01hcCkuCi0gICAgICAgICAqIEl0IGFsbG93cyB0aGUgcmVsYXRlZCBvYmplY3RzIHRvIGJlIGJhdGNoIHJlYWQgaW4gYSBzaW5nbGUgcXVlcnkuCi0gICAgICAgICAqIEJhdGNoIGZldGNoaW5nIGNhbiBhbHNvIGJlIHNldCBhdCB0aGUgcXVlcnkgbGV2ZWwsIGFuZCBpdCBpcyAKLSAgICAgICAgICogbm9ybWFsbHkgcmVjb21tZW5kZWQgdG8gZG8gc28gYXMgYWxsIHF1ZXJpZXMgbWF5IG5vdCByZXF1aXJlIGJhdGNoaW5nLgotICAgICAgICAgKiAKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjEKLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhdGNoRmV0Y2ggewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGJhdGNoLWZldGNoIHRvIHVzZS4KLSAgICAgICAgICAgICAqIEVpdGhlciBKT0lOLCBFWElTVFMgb3IgSU4uCi0gICAgICAgICAgICAgKiBKT0lOIGlzIHRoZSBkZWZhdWx0LgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQmF0Y2hGZXRjaFR5cGUgdmFsdWUoKSBkZWZhdWx0IEJhdGNoRmV0Y2hUeXBlLkpPSU47Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogRGVmaW5lIHRoZSBkZWZhdWx0IGJhdGNoIGZldGNoIHNpemUuCi0gICAgICAgICAgICAgKiBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgSU4gdHlwZSBiYXRjaCByZWFkaW5nIGFuZCBkZWZpbmVzCi0gICAgICAgICAgICAgKiB0aGUgbnVtYmVyIG9mIGtleXMgdXNlZCBpbiBlYWNoIElOIGNsYXVzZS4KLSAgICAgICAgICAgICAqIFRoZSBkZWZhdWx0IHNpemUgaXMgMjU2LCBvciB0aGUgcXVlcnkncyBwYWdlU2l6ZSBmb3IgY3Vyc29yIHF1ZXJpZXMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGludCBzaXplKCkgZGVmYXVsdCAtMTsKLSAgICAgICAgfQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpiYXRjaC1mZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotPC94c2Q6c2NoZW1hPgotCi0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8yXzMueHNkIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMDUyMWEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1NDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTwhLS0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4gCi08IS0tIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+IAotPCEtLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGZyb20gT3JhY2xlIFRvcExpbmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgdHdhcmUgLSB1cGRhdGUgdmVyc2lvbiBudW1iZXIgdG8gMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgMTIvMi8yMDA5LTIuMSBHdXkgUGVsbGV0aWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgLSAyOTYyODk6IEFkZCBjdXJyZW50IGFubm90YXRpb24gbWV0YWRhdGEgc3VwcG9ydCBvbiBtYXBwZWQgc3VwZXJjbGFzc2VzIHRvIEVjbGlwc2VMaW5rLU9STS5YTUwgU2NoZW1hICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgLSAyOTY2MTI6IEFkZCBjdXJyZW50IGFubm90YXRpb24gb25seSBtZXRhZGF0YSBzdXBwb3J0IG9mIHJldHVybiBpbnNlcnQvdXBkYXRlIHRvIHRoZSBFY2xpcHNlTGluay1PUk0uWE1MIFNjaGVtYSAgICAgICAgIC0tPgotPCEtLSAgICAgICAgLSBmb3JtYXR0ZWQgdG8gbWF0Y2ggb3JtXzJfMC54c2Qgc28gdGhhdCB1c2VycyBjYW4gZWFzaWx5IGNvbXBhcmUgdGhlIHR3byBzY2hlbWFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgNS80LzIwMTAtMi4xIEd1eSBQZWxsZXRpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgLSAyMjcyMTk6IEV4cGFuZCBFY2xpcHNlTGluay1PUk0uWE1MIHNjaGVtYSBmdW5jdGlvbmFsaXR5IGZvciAyLjEgcmVsZWFzZSAgKHVwZGF0ZSB2ZXJzaW9uIHRvIDIuMSkgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgNi8xNC8yMDEwLTIuMiBHdXkgUGVsbGV0aWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgLSAyNDcwNzg6IGVjbGlwc2VsaW5rLW9ybS54bWwgc2NoZW1hIHNob3VsZCBhbGxvdyBsb2IgYW5kIGVudW1lcmF0ZWQgb24gdmVyc2lvbiBhbmQgaWQgbWFwcGluZ3MgKHVwZGF0ZSB2ZXJzaW9uIHRvIDIuMikgIC0tPgotPCEtLSAgICAgMTAvMTUvMjAxMC0yLjIgR3V5IFBlbGxldGllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAtIDMyMjAwODogSW1wcm92ZSB1c2FiaWxpdHkgb2YgYWRkaXRpb25hbCBjcml0ZXJpYSBhcHBsaWVkIHRvIHF1ZXJpZXMgYXQgdGhlIHNlc3Npb24vRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgMDMvMjMvMjAxMS0yLjMgR3V5IFBlbGxldGllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAtIDMzNzMyMzogTXVsdGktdGVuYW50IHdpdGggc2hhcmVkIHNjaGVtYSBzdXBwb3J0IChwYXJ0IDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08IS0tIEphdmEgUGVyc2lzdGVuY2UgQVBJIG9iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZSBzY2hlbWEgLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iIAotICB4bWxuczpvcm09Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iIAotICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAotICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIAotICB2ZXJzaW9uPSIyLjMiPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpZWNsaXBzZWxpbmtfb3JtXzJfMy54c2QgMi4zICBNYXJjaCAyMyAyMDExCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpkb2N1bWVudGF0aW9uPjwhW0NEQVRBWwotCi0gICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIG5hdGl2ZSBFY2xpcHNlbGluayBYTUwgbWFwcGluZyBmaWxlCi0gICAgICAgVGhlIGZpbGUgbWF5IGJlIG5hbWVkICJNRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiBpbiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICBhcmNoaXZlIG9yIGl0IG1heSBiZSBuYW1lZCBzb21lIG90aGVyIG5hbWUgd2hpY2ggd291bGQgYmUKLSAgICAgICB1c2VkIHRvIGxvY2F0ZSB0aGUgZmlsZSBhcyByZXNvdXJjZSBvbiB0aGUgY2xhc3NwYXRoLgotICAgICAgIE9iamVjdC9yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZXMgbXVzdCBpbmRpY2F0ZSB0aGUgb2JqZWN0L3JlbGF0aW9uYWwKLSAgICAgICBtYXBwaW5nIGZpbGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSBwZXJzaXN0ZW5jZSBuYW1lc3BhY2U6Ci0KLSAgICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtCi0KLSAgICAgICBhbmQgaW5kaWNhdGUgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieSB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0gICAgICAgPGVudGl0eS1tYXBwaW5ncyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSIKLSAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSAKLSAgICAgICBlY2xpcHNlbGlua19vcm1fMl8zLnhzZAotICAgICAgIHZlcnNpb249IjIuMyI+Ci0gICAgICAgLi4uCi0gICAgICAgPC9lbnRpdHktbWFwcGluZ3M+Ci0KLSAgICAgXV0+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiLz4KLSAgCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ2ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbMC05XSsoXC5bMC05XSspKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InN1cHBvcnRlZC12ZXJzaW9ucy10eXBlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9Im9ybTp2ZXJzaW9uVHlwZSI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyLjAiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIuMSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMi4yIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyLjMiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4gCi0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWNjZXNzLW1ldGhvZHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWRkaXRpb25hbC1jcml0ZXJpYSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBhZGRpdGlvbmFsIGNyaXRlcmlhIGNhbiBiZSBzcGVjaWZpZWQgYXQgdGhlIEVudGl0eSBvciBNYXBwZWRTdXBlcmNsYXNzIAotICAgICAgICAgKiBsZXZlbC4gV2hlbiBzcGVjaWZpZWQgYXQgdGhlIG1hcHBlZCBzdXBlcmNsYXNzIGxldmVsLCBpdCBhcHBsaWVzIHRvIGFsbCAKLSAgICAgICAgICogaW5oZXJpdGluZyBlbnRpdGllcyB1bmxlc3MgdGhvc2UgZW50aXRpZXMgZGVmaW5lIHRoZWlyIG93biBhZGRpdGlvbmFsIAotICAgICAgICAgKiBjcml0ZXJpYSwgYXQgd2hpY2ggcG9pbnQgdGhlIGFkZGl0aW9uYWwgY3JpdGVyaWEgZnJvbSB0aGUgbWFwcGVkIHN1cGVyY2xhc3MgCi0gICAgICAgICAqIGlzIGlnbm9yZWQuICAKLSAgICAgICAgICoKLSAgICAgICAgICogVGhlIGFkZGl0aW9uYWwgY3JpdGVyaWEgc3VwcG9ydHMgYW55IHZhbGlkIEpQUUwgc3RyaW5nIGFuZCBtdXN0IHVzZSAndGhpcycgCi0gICAgICAgICAqIGFzIGFuIGFsaWFzIHRvIGZvcm0geW91ciBhZGRpdGlvbmFsIGNyaXRlcmlhLiBFLkcuLAotICAgICAgICAgKiAKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQWRkaXRpb25hbENyaXRlcmlhKCJ0aGlzLm51dC5zaXplID0gOk5VVF9TSVpFIGFuZCB0aGlzLm51dC5jb2xvciA9IDpOVVRfQ09MT1IiKQotICAgICAgICAgKiBwdWJsaWMgY2xhc3MgQm9sdCB7Li4ufQotICAgICAgICAgKiAKLSAgICAgICAgICogQWRkaXRpb25hbCBjcml0ZXJpYSBwYXJhbWV0ZXJzIGFyZSBhbHNvIGFjY2VwdGVkIGFuZCBhcmUgc2V0IHRocm91Z2ggCi0gICAgICAgICAqIHByb3BlcnRpZXMgb24gdGhlIGVudGl0eSBtYW5hZ2VyIGZhY3RvcnksIG9yIG9uIGFuIGVudGl0eSBtYW5hZ2VyLiBXaGVuIHNldCAKLSAgICAgICAgICogb24gdGhlIGVudGl0eSBtYW5hZ2VyLCB0aGUgcHJvcGVydGllcyBtdXN0IGJlIHNldCBiZWZvcmUgYW55IHF1ZXJ5IGV4ZWN1dGlvbgotICAgICAgICAgKiBhbmQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGZvciB0aGUgbGlmZSBzcGFuIG9mIHRoYXQgZW50aXR5IG1hbmFnZXIuCi0gICAgICAgICAqIAotICAgICAgICAgKiBQcm9wZXJ0aWVzIHNldCBvbiB0aGUgZW50aXR5IG1hbmFnZXIgd2lsbCBvdmVycmlkZSB0aG9zZSBzaW1pbGFybHkgbmFtZWQgCi0gICAgICAgICAqIHByb3BlcnRpZXMgc2V0IG9uIHRoZSBlbnRpdHkgbWFuYWdlciBmYWN0b3J5LgotICAgICAgICAgKgotICAgICAgICAgKiBBZGRpdGlvbmFsIGNyaXRlcmlhIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBhbnkgbmF0aXZlIHF1ZXJpZXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAYXV0aG9yIEd1eSBQZWxsZXRpZXIKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQWRkaXRpb25hbENyaXRlcmlhIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgSlBRTCBmcmFnbWVudCB0byB1c2UgYXMgdGhlIGFkZGl0aW9uYWwgY3JpdGVyaWEuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3JpdGVyaWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlIGFubm90YXRpb24gaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmludmFsaWRhdGlvbi5DYWNoZUludmFsaWRhdGlvblBvbGljeSAKLSAgICAgICAgICogd2hpY2ggc2V0cyBvYmplY3RzIGluIEVjbGlwc2VMaW5rJ3MgaWRlbnRpdHkgbWFwcyB0byBiZSBpbnZhbGlkIAotICAgICAgICAgKiBmb2xsb3dpbmcgZ2l2ZW4gcnVsZXMuIEJ5IGRlZmF1bHQgaW4gRWNsaXBzZUxpbmssIG9iamVjdHMgZG8gbm90IAotICAgICAgICAgKiBleHBpcmUgaW4gdGhlIGNhY2hlLiBTZXZlcmFsIGRpZmZlcmVudCBwb2xpY2llcyBhcmUgYXZhaWxhYmxlIHRvIAotICAgICAgICAgKiBhbGxvdyBvYmplY3RzIHRvIGV4cGlyZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGVUeXBlCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENhY2hlIGFub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHkgb3IgTWFwcGVkU3VwZXJjbGFzcy4gCi0gICAgICAgICAqIEluIHRoZSBjYXNlIG9mIGluaGVyaXRhbmNlLCBhIENhY2hlIGFubm90YXRpb24gc2hvdWxkIG9ubHkgYmUgZGVmaW5lZCAKLSAgICAgICAgICogb24gdGhlIHJvb3Qgb2YgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENhY2hlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNhY2hlIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2FjaGVUeXBlIHR5cGUoKSBkZWZhdWx0IFNPRlRfV0VBSzsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNpemUgb2YgY2FjaGUgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2l6ZSgpIGRlZmF1bHQgMTAwOwotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIChPcHRpb25hbCkgQ2FjaGVkIGluc3RhbmNlcyBpbiB0aGUgc2hhcmVkIGNhY2hlLAotICAgICAgICAgICogb3Igb25seSBhIHBlciBFbnRpdHlNYW5hZ2VyIGlzb2xhdGVkIGNhY2hlLgotICAgICAgICAgICogVGhlIGRlZmF1bHQgaXMgc2hhcmVkLgotICAgICAgICAgICogQGRlcHJlY2F0ZWQgIEFzIG9mIEVjbGlwc2VsaW5rIDIuMi4gIFNlZSB0aGUgYXR0cmlidXRlICdpc29sYXRpb24nCi0gICAgICAgICAgKi8gCi0gICAgICAgICAgQERlcHJlY2F0ZWQKLSAgICAgICAgICBib29sZWFuIHNoYXJlZCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAKLSAgICAgICAgIC8qKgotICAgICAgICAgICogKE9wdGlvbmFsKSBDb250cm9scyB0aGUgbGV2ZWwgb2YgY2FjaGluZyB0aGlzIEVudGl0eSB3aWxsIHVzZS4KLSAgICAgICAgICAqIFRoZSBkZWZhdWx0IGlzIENhY2hlSXNvbGF0aW9uVHlwZS5TSEFSRUQgd2hpY2ggaGFzIEVjbGlwc2VMaW5rCi0gICAgICAgICAgKiBDYWNoaW5nIGFsbCBFbnRpdGllcyBpbiB0aGUgU2hhcmVkIENhY2hlLgotICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb25maWcuQ2FjaGVJc29sYXRpb25UeXBlCi0gICAgICAgICAgKi8KLSAgICAgICAgICBDYWNoZUlzb2xhdGlvblR5cGUgaXNvbGF0aW9uKCkgZGVmYXVsdCBTSEFSRUQ7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYWZ0ZXIgYSBmaXggcGVyaW9kIG9mIHRpbWUgKG1zKS4gCi0gICAgICAgICAgICogUXVlcmllcyBleGVjdXRlZCBhZ2FpbnN0IHRoZSBjYWNoZSBhZnRlciB0aGlzIHdpbGwgYmUgZm9yY2VkIGJhY2sgCi0gICAgICAgICAgICogdG8gdGhlIGRhdGFiYXNlIGZvciBhIHJlZnJlc2hlZCBjb3B5Ci0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBleHBpcnkoKSBkZWZhdWx0IC0xOyAvLyBtaW51cyBvbmUgaXMgbm8gZXhwaXJ5LgotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBFeHBpcmUgY2FjaGVkIGluc3RhbmNlIGEgc3BlY2lmaWMgdGltZSBvZiBkYXkuIFF1ZXJpZXMgCi0gICAgICAgICAgICogZXhlY3V0ZWQgYWdhaW5zdCB0aGUgY2FjaGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvcmNlZCBiYWNrIHRvIHRoZSAKLSAgICAgICAgICAgKiBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBUaW1lT2ZEYXkgZXhwaXJ5VGltZU9mRGF5KCkgZGVmYXVsdCBAVGltZU9mRGF5KHNwZWNpZmllZD1mYWxzZSk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvcmNlIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlIHRvIGFsd2F5cyAKLSAgICAgICAgICAgKiByZWZyZXNoIHRoZSBjYWNoZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBhbHdheXNSZWZyZXNoKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRm9yIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlLCByZWZyZXNoIHRoZQotICAgICAgICAgICAqIGNhY2hlIG9ubHkgaWYgdGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgZGF0YWJhc2UgYnkgYSBxdWVyeSBpcyAKLSAgICAgICAgICAgKiBuZXdlciB0aGFuIHRoZSBkYXRhIGluIHRoZSBjYWNoZSAoYXMgZGV0ZXJtaW5lZCBieSB0aGUgb3B0aW1pc3RpYyAKLSAgICAgICAgICAgKiBsb2NraW5nIGZpZWxkKQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcigpIGRlZmF1bHQgZmFsc2U7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNldHRpbmcgdG8gdHJ1ZSB3aWxsIGZvcmNlIGFsbCBxdWVyaWVzIHRvIGJ5cGFzcyB0aGUgCi0gICAgICAgICAgICogY2FjaGUgZm9yIGhpdHMgYnV0IHN0aWxsIHJlc29sdmUgYWdhaW5zdCB0aGUgY2FjaGUgZm9yIGlkZW50aXR5LiAKLSAgICAgICAgICAgKiBUaGlzIGZvcmNlcyBhbGwgcXVlcmllcyB0byBoaXQgdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIGRpc2FibGVIaXRzKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhY2hlIGNvb3JkaW5hdGlvbiBtb2RlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSgpIGRlZmF1bHQgU0VORF9PQkpFQ1RfQ0hBTkdFUzsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5IiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5LXRpbWUtb2YtZGF5IiB0eXBlPSJvcm06dGltZS1vZi1kYXkiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOmNob2ljZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNoYXJlZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc29sYXRpb24iIHR5cGU9Im9ybTpjYWNoZS1pc29sYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpjYWNoZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWx3YXlzLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmcmVzaC1vbmx5LWlmLW5ld2VyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2FibGUtaGl0cyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb29yZGluYXRpb24tdHlwZSIgdHlwZT0ib3JtOmNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gCi0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZS1pbnRlcmNlcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENhY2hlSW50ZXJjZXB0b3IgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlVHlwZSBlbnVtIGlzIHVzZWQgd2l0aCB0aGUgQ2FjaGUgYW5ub3RhdGlvbiBmb3IgYSAKLSAgICAgICAgICogcGVyc2lzdGVudCBjbGFzcy4gSXQgZGVmaW5lcyB0aGUgdHlwZSBvZiBJZGVudGl0eU1hcC9DYWNoZSB1c2VkIGZvciAKLSAgICAgICAgICogdGhlIGNsYXNzLiBCeSBkZWZhdWx0IHRoZSBTT0ZUX1dFQUsgY2FjaGUgdHlwZSBpcyB1c2VkLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSAKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIENhY2hlVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogUHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LiBDYWNoZXMgYWxsIG9iamVjdHMKLSAgICAgICAgICAgKiBhbmQgZG9lcyBub3QgcmVtb3ZlIHRoZW0uIAotICAgICAgICAgICAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIG1heSBiZSBtZW1vcnkgaW50ZW5zaXZlIHdoZW4gbWFueSBvYmplY3RzIGFyZSAKLSAgICAgICAgICAgKiByZWFkLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZVTEwsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBGVUxMIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCB0aGUgbWFwIGhvbGRzIHRoZQotICAgICAgICAgICAqIG9iamVjdHMgdXNpbmcgd2VhayByZWZlcmVuY2VzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZnVsbCBnYXJiYWdlCi0gICAgICAgICAgICogY29sbGVjdGlvbiBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFdFQUssCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBGVUxMIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCB0aGUgbWFwIGhvbGRzIHRoZQotICAgICAgICAgICAqIG9iamVjdHMgdXNpbmcgc29mdCByZWZlcmVuY2VzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZnVsbCBnYXJiYWdlCi0gICAgICAgICAgICogY29sbGVjdGlvbiB3aGVuIG1lbW9yeSBpcyBsb3cgYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQKLSAgICAgICAgICAgKiBndWFyYW50ZWVkIGlkZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFNPRlQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBXRUFLIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCBpdCBtYWludGFpbnMgYQotICAgICAgICAgICAqIG1vc3QtZnJlcXVlbnRseS11c2VkIHN1Yi1jYWNoZS4gVGhlIHNpemUgb2YgdGhlIHN1Yi1jYWNoZSBpcwotICAgICAgICAgICAqIHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiB0aGUgaWRlbnRpdHkgbWFwIGFzIHNwZWNpZmllZCBieQotICAgICAgICAgICAqIGRlc2NyaXB0b3IncyBzZXRJZGVudGl0eU1hcFNpemUoKSBtZXRob2QuIFRoZSBzdWItY2FjaGUKLSAgICAgICAgICAgKiB1c2VzIHNvZnQgcmVmZXJlbmNlcyB0byBlbnN1cmUgdGhhdCB0aGVzZSBvYmplY3RzIGFyZQotICAgICAgICAgICAqIGdhcmJhZ2UtY29sbGVjdGVkIG9ubHkgaWYgdGhlIHN5c3RlbSBpcyBsb3cgb24gbWVtb3J5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFNPRlRfV0VBSywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIElkZW50aWNhbCB0byB0aGUgc29mdCBjYWNoZSB3ZWFrIChTT0ZUX1dFQUspIGlkZW50aXR5IG1hcCBleGNlcHQgCi0gICAgICAgICAgICogdGhhdCBpdCB1c2VzIGhhcmQgcmVmZXJlbmNlcyBpbiB0aGUgc3ViLWNhY2hlLiBVc2UgdGhpcyBpZGVudGl0eSAKLSAgICAgICAgICAgKiBtYXAgaWYgc29mdCByZWZlcmVuY2VzIGRvIG5vdCBiZWhhdmUgcHJvcGVybHkgb24geW91ciBwbGF0Zm9ybS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBIQVJEX1dFQUssCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBIGNhY2hlIGlkZW50aXR5IG1hcCBtYWludGFpbnMgYSBmaXhlZCBudW1iZXIgb2Ygb2JqZWN0cwotICAgICAgICAgICAqIHNwZWNpZmllZCBieSB0aGUgYXBwbGljYXRpb24uIE9iamVjdHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUKLSAgICAgICAgICAgKiBvbiBhIGxlYXN0LXJlY2VudGx5LXVzZWQgYmFzaXMuIFRoaXMgbWV0aG9kIGFsbG93cyBvYmplY3QKLSAgICAgICAgICAgKiBpZGVudGl0eSBmb3IgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBvYmplY3RzLgotICAgICAgICAgICAqIFdBUk5JTkc6IEZ1cm5pc2hlcyBjYWNoaW5nIGFuZCBpZGVudGl0eSwgYnV0IGRvZXMgbm90IGd1YXJhbnRlZSAKLSAgICAgICAgICAgKiBpZGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDQUNIRSwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFdBUk5JTkc6IERvZXMgbm90IHByZXNlcnZlIG9iamVjdCBpZGVudGl0eSBhbmQgZG9lcyBub3QgY2FjaGUgCi0gICAgICAgICAgICogb2JqZWN0cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBOT05FCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZVTEwiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldFQUsiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPRlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPRlRfV0VBSyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEFSRF9XRUFLIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQUNIRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS1pc29sYXRpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogT3B0aW9ucyBmb3IgaG93IEVudGl0eSBpbnN0YW5jZXMgc2hvdWxkIGJlIHNoYXJlZCB3aXRoaW4gYW4gRWNsaXBzZUxpbmsgUGVyc2lzdGVuY2UgVW5pdCAvIFNlcnZlclNlc3Npb24KLSAgICAgICAgICogQHNlZSBDbGFzc0Rlc2NyaXB0b3Ijc2V0Q2FjaGVJc29sYXRpb25UeXBlKENhY2hlSXNvbGF0aW9uVHlwZSkKLSAgICAgICAgICogQGF1dGhvciBHb3Jkb24gWW9ya2UKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGVudW0gQ2FjaGVJc29sYXRpb25UeXBlIHsKLSAgICAgICAgCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIEVudGl0eSBpbnN0YW5jZXMgd2lsbCBiZSBjYWNoZWQgd2l0aGluIHRoZSBFbnRpdHlNYW5hZ2VyRmFjdG9yeS9TZXJ2ZXJTZXNzaW9uIGxldmVsLgotICAgICAgICAgICogQW55IHVzZXIgcXVlcmllcyBmb3Igc2hhcmVkIGNhY2hlIGluc3RhbmNlcyAoaWUgUmVhZC1Pbmx5IHF1ZXJ5IGhpbnQpIHdpbGwgcmV0dXJuIGFuIEVudGl0eQotICAgICAgICAgICogaW5zdGFuY2UgdGhhdCBtYXkgYmUgc2hhcmVkIGJ5IG11bHRpcGxlIGNsaWVudHMuIAotICAgICAgICAgICogCi0gICAgICAgICAgKiBUaGlzIHNldHRpbmcgaXMgdGhlIGRlZmF1bHQgaXNvbGF0aW9uIGxldmVsLgotICAgICAgICAgICovCi0gICAgICAgICBTSEFSRUQsCi0gICAgCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIEVudGl0eSBzdGF0ZSBpbmZvcm1hdGlvbiB3aWxsIGJlIGNhY2hlZCBpbiB0aGUgc2hhcmVkIGNhY2hlIGJ1dCBFbnRpdHkKLSAgICAgICAgICAqIGluc3RhbmNlcyB3aWxsIG5vdCBiZSBzaGFyZWQuIEFueSB1c2VyIHF1ZXJpZXMgZm9yIHNoYXJlZCBjYWNoZSBpbnN0YW5jZXMKLSAgICAgICAgICAqIChpZSBSZWFkLU9ubHkgcXVlcnkgaGludCkgd2lsbCByZXR1cm4gYSBuZXcgRW50aXR5IGluc3RhbmNlIHdpdGggdGhlIGNhY2hlZCBzdGF0ZS4KLSAgICAgICAgICAqIFRoaXMgd2lsbCBlbnN1cmUgdGhlIGluc3RhbmNlIGlzIDxpPnByb3RlY3RlZDwvaT4gZnJvbSBhbnkgY29uY3VycmVudAotICAgICAgICAgICogc3RhdGUgY2hhbmdlLgotICAgICAgICAgICovCi0gICAgICAgICBQUk9URUNURUQsCi0gICAgCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFRoZSBFbnRpdHkgYW5kIGl0cyBkYXRhIGlzIG5vdCBzdG9yZWQgaW4gdGhlIHNoYXJlZCBjYWNoZSBidXQgaXMKLSAgICAgICAgICAqIDxpPmlzb2xhdGVkPC9pPiB0byB0aGUgUGVyc2lzdGVuY2UgQ29udGV4dC9Vbml0T2ZXb3JrIG9yCi0gICAgICAgICAgKiBJc29sYXRlZENsaWVudFNlc3Npb24uIFRoaXMgc2V0dGluZyBlZmZlY3RpdmVseSBkaXNhYmxlcyBzZWNvbmQgbGV2ZWwKLSAgICAgICAgICAqIGNhY2hpbmcgZm9yIHRoaXMgZW50aXR5IGFuZCBzaG91bGQgYmUgdXNlZCB3aGVuIHVzZXJzIGRvIG5vdCB3YW50IGNhY2hpbmcgZm9yCi0gICAgICAgICAgKiBhIHBhcnRpY3VsYXIgRW50aXR5LgotICAgICAgICAgICovCi0gICAgICAgICBJU09MQVRFRDsKLSAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSEFSRUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBST1RFQ1RFRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVNPTEFURUQiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtY29vcmRpbmF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUgCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIGVudW0gQ2FjaGVDb29yZGluYXRpb25UeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTZW5kcyBhIGxpc3Qgb2YgY2hhbmdlZCBvYmplY3RzIGluY2x1ZGluZyBkYXRhIGFib3V0IHRoZSBjaGFuZ2VzLgotICAgICAgICAgICAqIFRoaXMgZGF0YSBpcyBtZXJnZWQgaW50byB0aGUgcmVjZWl2aW5nIGNhY2hlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFNFTkRfT0JKRUNUX0NIQU5HRVMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTZW5kcyBhIGxpc3Qgb2YgdGhlIGlkZW50aXRpZXMgb2YgdGhlIG9iamVjdHMgdGhhdCBoYXZlIGNoYW5nZWQuIAotICAgICAgICAgICAqIFRoZSByZWNlaXZpbmcgY2FjaGUgaW52YWxpZGF0ZXMgdGhlIG9iamVjdHMgKHJhdGhlciB0aGFuIGNoYW5naW5nIAotICAgICAgICAgICAqIGFueSBvZiB0aGUgZGF0YSkKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNhbWUgYXMgU0VORF9PQkpFQ1RfQ0hBTkdFUyBleGNlcHQgaXQgYWxzbyBpbmNsdWRlcyBhbnkgbmV3bHkKLSAgICAgICAgICAgKiBjcmVhdGVkIG9iamVjdHMgZnJvbSB0aGUgdHJhbnNhY3Rpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBEb2VzIG5vIGNhY2hlIGNvb3JkaW5hdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBOT05FCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTkRfT0JKRUNUX0NIQU5HRVMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY2hhbmdldHJhY2tpbmcuT2JqZWN0Q2hhbmdlUG9saWN5IAotICAgICAgICAgKiB3aGljaCBjb21wdXRlcyBjaGFuZ2VzIHNldHMgZm9yIEVjbGlwc2VMaW5rJ3MgVW5pdE9mV29yayBjb21taXQgCi0gICAgICAgICAqIHByb2Nlc3MuIEFuIE9iamVjdENoYW5nZVBvbGljeSBpcyBzdG9yZWQgb24gYW4gRW50aXR5J3MgZGVzY3JpcHRvci4KLSAgICAgICAgICoKLSAgICAgICAgICogQSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uIG1heSBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENoYW5nZVRyYWNraW5nIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNoYW5nZSB0cmFja2luZyB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIENoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZSgpIGRlZmF1bHQgQVVUTzsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2hhbmdlLXRyYWNraW5nLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbi4gCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIGVudW0gQ2hhbmdlVHJhY2tpbmdUeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBbiBBVFRSSUJVVEUgY2hhbmdlIHRyYWNraW5nIHR5cGUgYWxsb3dzIGNoYW5nZSB0cmFja2luZyBhdCB0aGUKLSAgICAgICAgICAgKiBhdHRyaWJ1dGUgbGV2ZWwgb2YgYW4gb2JqZWN0LiBPYmplY3RzIHdpdGggY2hhbmdlZCBhdHRyaWJ1dGVzIHdpbGwKLSAgICAgICAgICAgKiBiZSBwcm9jZXNzZWQgaW4gdGhlIGNvbW1pdCBwcm9jZXNzIHRvIGluY2x1ZGUgYW55IGNoYW5nZXMgaW4gdGhlIAotICAgICAgICAgICAqIHJlc3VsdHMgb2YgdGhlIGNvbW1pdC4gVW5jaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIEFUVFJJQlVURSwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFuIE9CSkVDVCBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGFsbG93cyBhbiBvYmplY3QgdG8gY2FsY3VsYXRlIGZvciAKLSAgICAgICAgICAgKiBpdHNlbGYgd2hldGhlciBpdCBoYXMgY2hhbmdlZC4gQ2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgcHJvY2Vzc2VkIGluIAotICAgICAgICAgICAqIHRoZSBjb21taXQgcHJvY2VzcyB0byBpbmNsdWRlIGFueSBjaGFuZ2VzIGluIHRoZSByZXN1bHRzIG9mIHRoZSAKLSAgICAgICAgICAgKiBjb21taXQuIFVuY2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPQkpFQ1QsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBIERFRkVSUkVEIGNoYW5nZSB0cmFja2luZyBwb2xpY3kgZGVmZXJzIGFsbCBjaGFuZ2UgZGV0ZWN0aW9uIHRvCi0gICAgICAgICAgICogdGhlIFVuaXRPZldvcmsncyBjaGFuZ2UgZGV0ZWN0aW9uIHByb2Nlc3MuIEVzc2VudGlhbGx5LCB0aGUgCi0gICAgICAgICAgICogY2FsY3VsYXRlQ2hhbmdlcygpIG1ldGhvZCB3aWxsIHJ1biBmb3IgYWxsIG9iamVjdHMgaW4gYSBVbml0T2ZXb3JrLiAKLSAgICAgICAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IE9iamVjdENoYW5nZVBvbGljeQotICAgICAgICAgICAqLwotICAgICAgICAgIERFRkVSUkVELAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogV2lsbCBub3Qgc2V0IGFueSBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5LgotICAgICAgICAgICAqLwotICAgICAgICAgIEFVVE8KLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRUUklCVVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPQkpFQ1QiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFRkVSUkVEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVRPIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9taXplciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIEN1c3RvbWl6ZXIgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgCi0gICAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb25maWcuRGVzY3JpcHRvckN1c3RvbWl6ZXIgCi0gICAgICAgICAqIGludGVyZmFjZSBhbmQgaXMgdG8gcnVuIGFnYWluc3QgYW4gZW5ldGl0eSdzIGNsYXNzIGRlc2NyaXB0b3IgYWZ0ZXIgYWxsIAotICAgICAgICAgKiBtZXRhZGF0YSBwcm9jZXNzaW5nIGhhcyBiZWVuIGNvbXBsZXRlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogVGhlIEN1c3RvbWl6ZXIgYW5ub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MgCi0gICAgICAgICAqIG9yIEVtYmVkZGFibGUgY2xhc3MuIEluIHRoZSBjYXNlIG9mIGluaGVyaXRhbmNlLCBhIEN1c3RvbWl6ZXIgaXMgbm90IAotICAgICAgICAgKiBpbmhlcml0ZWQgZnJvbSBpdHMgcGFyZW50IGNsYXNzZXMuIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEN1c3RvbWl6ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgZGVzY3JpcHRvciBjdXN0b21pemVyIGNsYXNzIHRoYXQgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGFwcGxpZWQgZm9yIHRoZSByZWxhdGVkIGVudGl0eSBvciBlbWJlZGRhYmxlIGNsYXNzLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHZhbHVlKCk7IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpcmVjdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBhbm5vdGF0aW9uLgotICAgICAgICAgKiBJdCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRpcmVjdGlvbiBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZSAKLSAgICAgICAgICogcGFyYW1ldGVycyBvZiBhIG5hbWVkIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZW51bSBEaXJlY3Rpb24gewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIElucHV0IHBhcmFtZXRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIElOLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogT3V0cHV0IHBhcmFtZXRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIE9VVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIElucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgSU5fT1VULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogT3V0cHV0IGN1cnNvcgotICAgICAgICAgICAqLwotICAgICAgICAgIE9VVF9DVVJTT1IKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5fT1VUIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVRfQ1VSU09SIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbWFwcGluZ3MiPgotICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZW50aXR5LW1hcHBpbmdzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIG1hcHBpbmcKLSAgICAgICAgZmlsZS4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmb3VyIHR5cGVzIG9mIGVsZW1lbnRzOgotCi0gICAgICAgIDEuIFRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgY29udGFpbnMgbWV0YWRhdGEKLSAgICAgICAgZm9yIHRoZSBlbnRpcmUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIGlmIHRoaXMgZWxlbWVudAotICAgICAgICBvY2N1cnMgaW4gbXVsdGlwbGUgbWFwcGluZyBmaWxlcyB3aXRoaW4gdGhlIHNhbWUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgCi0gICAgICAgIDIuIFRoZSBwYWNrYWdlLCBzY2hlbWEsIGNhdGFsb2cgYW5kIGFjY2VzcyBlbGVtZW50cyBhcHBseSB0byBhbGwgb2YKLSAgICAgICAgdGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZGVmaW5lZCBpbgotICAgICAgICB0aGUgc2FtZSBmaWxlIGluIHdoaWNoIHRoZXkgb2NjdXIuCi0KLSAgICAgICAgMy4gVGhlIHNlcXVlbmNlLWdlbmVyYXRvciwgdGFibGUtZ2VuZXJhdG9yLCBuYW1lZC1xdWVyeSwKLSAgICAgICAgbmFtZWQtbmF0aXZlLXF1ZXJ5IGFuZCBzcWwtcmVzdWx0LXNldC1tYXBwaW5nIGVsZW1lbnRzIGFyZSBnbG9iYWwKLSAgICAgICAgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUKLSAgICAgICAgc2VxdWVuY2UtZ2VuZXJhdG9yIG9yIHRhYmxlLWdlbmVyYXRvciBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lCi0gICAgICAgIG9yIGRpZmZlcmVudCBtYXBwaW5nIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgYWxzbyAKLSAgICAgICAgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBuYW1lZC1xdWVyeSwgbmFtZWQtbmF0aXZlLXF1ZXJ5LCBvcgotICAgICAgICByZXN1bHQtc2V0LW1hcHBpbmcgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZSBvciBkaWZmZXJlbnQgbWFwcGluZyAKLSAgICAgICAgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgIDQuIFRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGVhY2ggZGVmaW5lCi0gICAgICAgIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciBhIG1hbmFnZWQgcGVyc2lzdGVudCBjbGFzcy4gVGhlIG1hcHBpbmcKLSAgICAgICAgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZXNlIGVsZW1lbnRzIG1heSBiZSBjb21wbGV0ZSBvciBpdCBtYXkKLSAgICAgICAgYmUgcGFydGlhbC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIgCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFja2FnZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbmFudC1kaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ib3JtOnRlbmFudC1kaXNjcmltaW5hdG9yLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb25pbmciIHR5cGU9Im9ybTpwYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcGxpY2F0aW9uLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnJlcGxpY2F0aW9uLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm91bmQtcm9iaW4tcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06cm91bmQtcm9iaW4tcGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5uZWQtcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06cGlubmVkLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmFuZ2UtcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06cmFuZ2UtcGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1wYXJ0aXRpb25pbmciIHR5cGU9Im9ybTp2YWx1ZS1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imhhc2gtcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06aGFzaC1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaW9uLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnVuaW9uLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLWZ1bmN0aW9uLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLWZ1bmN0aW9uLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1wbHNxbC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcGxzcWwtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcGxzcWwtc3RvcmVkLWZ1bmN0aW9uLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcGxzcWwtc3RvcmVkLWZ1bmN0aW9uLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwbHNxbC1yZWNvcmQiIHR5cGU9Im9ybTpwbHNxbC1yZWNvcmQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBsc3FsLXRhYmxlIiB0eXBlPSJvcm06cGxzcWwtdGFibGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiIHR5cGU9Im9ybTptYXBwZWQtc3VwZXJjbGFzcyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiIHR5cGU9Im9ybTplbnRpdHkiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkYWJsZSIgdHlwZT0ib3JtOmVtYmVkZGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06c3VwcG9ydGVkLXZlcnNpb25zLXR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iMi4zIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJleGlzdGVuY2UtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIEV4aXN0ZW5jZUNoZWNraW5nIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIAotICAgICAgICAgKiBjaGVja2luZyBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgZW50aXRpZXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBBbiBleGlzdGVuY2UtY2hlY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24gYW4gRW50aXR5IG9yIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIGFubm90YXRpb24uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFeGlzdGVuY2VDaGVja2luZyB7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNldCB0aGUgZXhpc3RlbmNlIGNoZWNrIGZvciBkZXRlcm1pbmluZwotICAgICAgICAgICAqIGlmIGFuIGluc2VydCBvciB1cGRhdGUgc2hvdWxkIG9jY3VyIGZvciBhbiBvYmplY3QuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRXhpc3RlbmNlVHlwZSB2YWx1ZSgpIGRlZmF1bHQgQ0hFQ0tfQ0FDSEU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQXNzdW1lIHRoYXQgaWYgdGhlIG9iamVjdHMgcHJpbWFyeSBrZXkgZG9lcyBub3QgaW5jbHVkZSBudWxsIGFuZCAKLSAgICAgICAgICogaXQgaXMgaW4gdGhlIGNhY2hlLCB0aGVuIGl0IG11c3QgZXhpc3QuCi0gICAgICAgICAqLwotICAgICAgICBDSEVDS19DQUNIRSwKLQotICAgICAgICAvKioKLSAgICAgICAgICogUGVyZm9ybSBkb2VzIGV4aXN0IGNoZWNrIG9uIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICovCi0gICAgICAgIENIRUNLX0RBVEFCQVNFLAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBc3N1bWUgdGhhdCBpZiB0aGUgb2JqZWN0cyBwcmltYXJ5IGtleSBkb2VzIG5vdCBpbmNsdWRlIG51bGwgdGhlbiAKLSAgICAgICAgICogaXQgbXVzdCBleGlzdC4gVGhpcyBtYXkgYmUgdXNlZCBpZiB0aGUgYXBwbGljYXRpb24gZ3VhcmFudGVlcyBvciAKLSAgICAgICAgICogZG9lcyBub3QgY2FyZSBhYm91dCB0aGUgZXhpc3RlbmNlIGNoZWNrLgotICAgICAgICAgKi8KLSAgICAgICAgQVNTVU1FX0VYSVNURU5DRSwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQXNzdW1lIHRoYXQgdGhlIG9iamVjdCBkb2VzIG5vdCBleGlzdC4gVGhpcyBtYXkgYmUgdXNlZCBpZiB0aGUgCi0gICAgICAgICAqIGFwcGxpY2F0aW9uIGd1YXJhbnRlZXMgb3IgZG9lcyBub3QgY2FyZSBhYm91dCB0aGUgZXhpc3RlbmNlIGNoZWNrLiAgCi0gICAgICAgICAqIFRoaXMgd2lsbCBhbHdheXMgZm9yY2UgYW4gaW5zZXJ0IHRvIGJlIGNhbGxlZC4KLSAgICAgICAgICovCi0gICAgICAgIEFTU1VNRV9OT05fRVhJU1RFTkNFCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4gICAgCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hFQ0tfQ0FDSEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRUNLX0RBVEFCQVNFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBU1NVTUVfRVhJU1RFTkNFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBU1NVTUVfTk9OX0VYSVNURU5DRSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPiAKLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgTWV0YWRhdGEgdGhhdCBhcHBsaWVzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFuZCBub3QganVzdCB0byAKLSAgICAgICAgdGhlIG1hcHBpbmcgZmlsZSBpbiB3aGljaCBpdCBpcyBjb250YWluZWQuIAotCi0gICAgICAgIElmIHRoZSB4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSBlbGVtZW50IGlzIHNwZWNpZmllZCwKLSAgICAgICAgdGhlIGNvbXBsZXRlIHNldCBvZiBtYXBwaW5nIG1ldGFkYXRhIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdCAKLSAgICAgICAgaXMgY29udGFpbmVkIGluIHRoZSBYTUwgbWFwcGluZyBmaWxlcyBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPiAgICAgICAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZXNlIGRlZmF1bHRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFzIGEgd2hvbGUgCi0gICAgICAgIHVubGVzcyB0aGV5IGFyZSBvdmVycmlkZGVuIGJ5IGxvY2FsIGFubm90YXRpb24gb3IgWE1MIAotICAgICAgICBlbGVtZW50IHNldHRpbmdzLiAKLSAgICAgICAgCi0gICAgICAgIHNjaGVtYSAtIFVzZWQgYXMgdGhlIHNjaGVtYSBmb3IgYWxsIHRhYmxlcywgc2Vjb25kYXJ5IHRhYmxlcywgam9pbgotICAgICAgICAgICAgdGFibGVzLCBjb2xsZWN0aW9uIHRhYmxlcywgc2VxdWVuY2UgZ2VuZXJhdG9ycywgYW5kIHRhYmxlIAotICAgICAgICAgICAgZ2VuZXJhdG9ycyB0aGF0IGFwcGx5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGNhdGFsb2cgLSBVc2VkIGFzIHRoZSBjYXRhbG9nIGZvciBhbGwgdGFibGVzLCBzZWNvbmRhcnkgdGFibGVzLCBqb2luCi0gICAgICAgICAgICB0YWJsZXMsIGNvbGxlY3Rpb24gdGFibGVzLCBzZXF1ZW5jZSBnZW5lcmF0b3JzLCBhbmQgdGFibGUgCi0gICAgICAgICAgICBnZW5lcmF0b3JzIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgZGVsaW1pdGVkLWlkZW50aWZpZXJzIC0gVXNlZCB0byB0cmVhdCBkYXRhYmFzZSBpZGVudGlmaWVycyBhcwotICAgICAgICAgICAgZGVsaW1pdGVkIGlkZW50aWZpZXJzLgotICAgICAgICBhY2Nlc3MgLSBVc2VkIGFzIHRoZSBhY2Nlc3MgdHlwZSBmb3IgYWxsIG1hbmFnZWQgY2xhc3NlcyBpbgotICAgICAgICAgICAgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2FzY2FkZS1wZXJzaXN0IC0gQWRkcyBjYXNjYWRlLXBlcnNpc3QgdG8gdGhlIHNldCBvZiBjYXNjYWRlIG9wdGlvbnMKLSAgICAgICAgICAgIGluIGFsbCBlbnRpdHkgcmVsYXRpb25zaGlwcyBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBlbnRpdHktbGlzdGVuZXJzIC0gTGlzdCBvZiBkZWZhdWx0IGVudGl0eSBsaXN0ZW5lcnMgdG8gYmUgaW52b2tlZCAKLSAgICAgICAgICAgIG9uIGVhY2ggZW50aXR5IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlbGltaXRlZC1pZGVudGlmaWVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVuYW50LWRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06dGVuYW50LWRpc2NyaW1pbmF0b3ItY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYW4gZW50aXR5LiBJcyBhbGxvd2VkIHRvIGJlCi0gICAgICAgIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBhbm5vdGF0aW9ucy4KLSAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byAKLSAgICAgICAgaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBvbiB0aGUgZW50aXR5IGNsYXNzIChhbmQgaXRzIGZpZWxkcwotICAgICAgICBvciBwcm9wZXJ0aWVzKSBhcmUgdG8gYmUgcHJvY2Vzc2VkLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gCi0gICAgICAgIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIGZvciB0aGUgZW50aXR5IGFuZCBpdHMgc3ViZWxlbWVudHMgd2lsbCAKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXVsdGl0ZW5hbnQiIHR5cGU9Im9ybTptdWx0aXRlbmFudCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRkaXRpb25hbC1jcml0ZXJpYSIgdHlwZT0ib3JtOmFkZGl0aW9uYWwtY3JpdGVyaWEiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJvcm06dGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY29uZGFyeS10YWJsZSIgdHlwZT0ib3JtOnNlY29uZGFyeS10YWJsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdCIgdHlwZT0ib3JtOnN0cnVjdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtb24tZGVsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5kZXgiIHR5cGU9Im9ybTppbmRleCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5IiB0eXBlPSJvcm06cHJpbWFyeS1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaGVyaXRhbmNlIiB0eXBlPSJvcm06aW5oZXJpdGFuY2UiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzLWV4dHJhY3RvciIgdHlwZT0ib3JtOmNsYXNzLWV4dHJhY3RvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZSIgdHlwZT0ib3JtOmNhY2hlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZS1pbnRlcmNlcHRvciIgdHlwZT0ib3JtOmNhY2hlLWludGVyY2VwdG9yIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZldGNoLWdyb3VwIiB0eXBlPSJvcm06ZmV0Y2gtZ3JvdXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpncm91cCByZWY9Im9ybTpwYXJ0aXRpb25pbmctZ3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtZnVuY3Rpb24tcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1zdG9yZWQtZnVuY3Rpb24tcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1wbHNxbC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcGxzcWwtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXBsc3FsLXN0b3JlZC1mdW5jdGlvbi1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXBsc3FsLXN0b3JlZC1mdW5jdGlvbi1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBsc3FsLXJlY29yZCIgdHlwZT0ib3JtOnBsc3FsLXJlY29yZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBsc3FsLXRhYmxlIiB0eXBlPSJvcm06cGxzcWwtdGFibGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06c3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5LXJlZGlyZWN0b3JzIiB0eXBlPSJvcm06cXVlcnktcmVkaXJlY3RvcnMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFyZW50LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYWNoZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJwYXJ0aXRpb25pbmctZ3JvdXAiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFydGl0aW9uaW5nIiB0eXBlPSJvcm06cGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXBsaWNhdGlvbi1wYXJ0aXRpb25pbmciIHR5cGU9Im9ybTpyZXBsaWNhdGlvbi1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvdW5kLXJvYmluLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnJvdW5kLXJvYmluLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGlubmVkLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnBpbm5lZC1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJhbmdlLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnJhbmdlLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06dmFsdWUtcGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYXNoLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOmhhc2gtcGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlvbi1wYXJ0aXRpb25pbmciIHR5cGU9Im9ybTp1bmlvbi1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcnRpdGlvbmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0gICAgICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAgIAotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iYWNjZXNzLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgZGV0ZXJtaW5lcyBob3cgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIGFjY2Vzc2VzIHRoZQotICAgICAgICBzdGF0ZSBvZiBhbiBlbnRpdHkgb3IgZW1iZWRkZWQgb2JqZWN0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPUEVSVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWSVJUVUFMIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBc3NvY2lhdGlvbk92ZXJyaWRlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpIGRlZmF1bHR7fTsKLSAgICAgICAgICBKb2luVGFibGUgam9pblRhYmxlKCkgZGVmYXVsdCBASm9pblRhYmxlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBdHRyaWJ1dGVPdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBDb2x1bW4gY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgZWxlbWVudCBjb250YWlucyB0aGUgZW50aXR5IGZpZWxkIG9yIHByb3BlcnR5IG1hcHBpbmdzLgotICAgICAgICBJdCBtYXkgYmUgc3BhcnNlbHkgcG9wdWxhdGVkIHRvIGluY2x1ZGUgb25seSBhIHN1YnNldCBvZiB0aGUKLSAgICAgICAgZmllbGRzIG9yIHByb3BlcnRpZXMuIElmIG1ldGFkYXRhLWNvbXBsZXRlIGZvciB0aGUgZW50aXR5IGlzIHRydWUKLSAgICAgICAgdGhlbiB0aGUgcmVtYWluZGVyIG9mIHRoZSBhdHRyaWJ1dGVzIHdpbGwgYmUgZGVmYXVsdGVkIGFjY29yZGluZwotICAgICAgICB0byB0aGUgZGVmYXVsdCBydWxlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0ib3JtOmlkIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkLWlkIiB0eXBlPSJvcm06ZW1iZWRkZWQtaWQiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMiIHR5cGU9Im9ybTpiYXNpYyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMtY29sbGVjdGlvbiIgdHlwZT0ib3JtOmJhc2ljLWNvbGxlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYy1tYXAiIHR5cGU9Im9ybTpiYXNpYy1tYXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1vbmUiIHR5cGU9Im9ybTptYW55LXRvLW9uZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW1hbnkiIHR5cGU9Im9ybTpvbmUtdG8tbWFueSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW9uZSIgdHlwZT0ib3JtOm9uZS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUiIHR5cGU9Im9ybTp2YXJpYWJsZS1vbmUtdG8tb25lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1tYW55IiB0eXBlPSJvcm06bWFueS10by1tYW55IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIiB0eXBlPSJvcm06ZWxlbWVudC1jb2xsZWN0aW9uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQiIHR5cGU9Im9ybTplbWJlZGRlZCIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNmb3JtYXRpb24iIHR5cGU9Im9ybTp0cmFuc2Zvcm1hdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zaWVudCIgdHlwZT0ib3JtOnRyYW5zaWVudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ib3JtOnN0cnVjdHVyZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFycmF5IiB0eXBlPSJvcm06YXJyYXkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpYyB7Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5kZXgiIHR5cGU9Im9ybTppbmRleCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiIHR5cGU9Im9ybTpsb2IiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm4taW5zZXJ0IiB0eXBlPSJvcm06cmV0dXJuLWluc2VydCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmV0dXJuLXVwZGF0ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYy1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNDb2xsZWN0aW9uIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSB0aGF0IAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSBoaW50IHRvIAotICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAKLSAgICAgICAgICAgKiBMQVpZLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsgCi0gCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgdmFsdWUgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCAKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGRhdGEuIERlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBvciBmaWVsZCBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbiB2YWx1ZUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTplY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC1mZXRjaCIgdHlwZT0ib3JtOmJhdGNoLWZldGNoIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uY2FjaGVhYmxlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtbWFwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNNYXAgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCi0gICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCi0gICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAotICAgICAgICAgICAqIExBWlkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IG1hcCAKLSAgICAgICAgICAgKiBrZXkuIElmIHRoZSBuYW1lIG9uIHRlIGtleSBjb2x1bW4gaXMgIiIsIHRoZSBuYW1lIHdpbGwgZGVmYXVsdCB0bzoKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb3IgZmllbGQ7ICJfS0VZIi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4ga2V5Q29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSBrZXkgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAotICAgICAgICAgICAqIHRoZSBkaXJlY3QgbWFwIGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJ0IGtleUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHZhbHVlIGNvbnZlcnRlci4gRGVmYXVsdCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAgICAgICAqIHNwZWNpZnlpbmcgQENvbnZlcnQoIm5vbmUiKSwgbWVhbmluZyBubyBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgY29sdW1uIG1hcHBpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVydCB2YWx1ZUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+ICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06ZWNsaXBzZWxpbmstY29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vbmNhY2hlYWJsZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhc2NhZGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIENhc2NhZGVUeXBlIHsgQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNILCBERVRBQ0h9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWFsbCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1tZXJnZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXJlbW92ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXJlZnJlc2giIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1kZXRhY2giIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsYXNzLWV4dHJhY3RvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENsYXNzRXh0cmFjdG9yIGFsbG93cyBmb3IgYSB1c2VyIGRlZmluZWQgY2xhc3MgaW5kaWNhdG9yIGluIHBsYWNlIG9mIAotICAgICAgICAgKiBwcm92aWRpbmcgYSBkaXNjcmltaW5hdG9yIGNvbHVtbi4gVGhlIGNsYXNzIGhhcyB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgICAgICAgKiAgLSBJdCBtdXN0IGV4dGVuZCB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuQ2xhc3NFeHRyYWN0b3IgCi0gICAgICAgICAqICAgIGNsYXNzIGFuZCBpbXBsZW1lbnQgdGhlIGV4dHJhY3RDbGFzc0Zyb21Sb3coUmVjb3JkLCBTZXNzaW9uKSBtZXRob2QuIAotICAgICAgICAgKiAgLSBUaGF0IG1ldGhvZCBtdXN0IHRha2UgYSBkYXRhYmFzZSByb3cgKGEgUmVjb3JkL01hcCkgYXMgYW4gYXJndW1lbnQgYW5kIAotICAgICAgICAgKiAgICBtdXN0IHJldHVybiB0aGUgY2xhc3MgdG8gdXNlIGZvciB0aGF0IHJvdy4gCi0gICAgICAgICAqIAotICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gZGVjaWRlIHdoaWNoIGNsYXNzIHRvIGluc3RhbnRpYXRlIHdoZW4gcmVhZGluZyAKLSAgICAgICAgICogZnJvbSB0aGUgZGF0YWJhc2UuIEl0IGlzIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIHBvcHVsYXRlIGFueSAKLSAgICAgICAgICogdHlwaW5nIGluZm9ybWF0aW9uIGluIHRoZSBkYXRhYmFzZSByZXF1aXJlZCB0byBkZXRlcm1pbmUgdGhlIGNsYXNzIGZyb20gdGhlIAotICAgICAgICAgKiByb3cuCi0gICAgICAgICAqIAotICAgICAgICAgKiBUaGUgQ2xhc3NFeHRyYWN0b3IgbXVzdCBvbmx5IGJlIHNldCBvbiB0aGUgcm9vdCBvZiBhbiBlbnRpdHkgY2xhc3Mgb3IKLSAgICAgICAgICogc3ViLWhpZXJhcmNoeSBpbiB3aGljaCBhIGRpZmZlcmVudCBpbmhlcml0YW5jZSBzdHJhdGVneSBpcyBhcHBsaWVkLiBUaGUgCi0gICAgICAgICAqIENsYXNzRXh0cmFjdG9yIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgU0lOR0xFX1RBQkxFIGFuZCBKT0lORUQgaW5oZXJpdGFuY2UgCi0gICAgICAgICAqIHN0cmF0ZWdpZXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBJZiBhIENsYXNzRXh0cmFjdG9yIGlzIHVzZWQgdGhlbiBhIERpc2NyaW1pbmF0b3JDb2x1bW4gY2Fubm90IGJlIHVzZWQuIEEgCi0gICAgICAgICAqIENsYXNzRXh0cmFjdG9yIGFsc28gY2Fubm90IGJlIHVzZWQgb24gZWl0aGVyIHRoZSByb290IG9yIGl0cyBzdWJjbGFzc2VzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSW4gYWRkaXRpb24sIGZvciBtb3JlIGNvbXBsZXggY29uZmlndXJhdGlvbnMgdXNpbmcgYSBDbGFzc0V4dHJhY3RvciBhbmQgYSAKLSAgICAgICAgICogU0lOR0xFX1RBQkxFIHN0cmF0ZWd5LCB0aGUgZGVzY3JpcHRvcidzIHdpdGhBbGxTdWJjbGFzc2VzIGFuZCBvbmx5SW5zdGFuY2VzIAotICAgICAgICAgKiBleHByZXNzaW9ucyBzaG91bGQgYmUgc2V0IHRocm91Z2ggdGhlIENsYXNzRXh0cmFjdG9yJ3MgaW5pdGlhbGl6ZSBtZXRob2QuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuSW5oZXJpdGFuY2VQb2xpY3kuc2V0V2l0aEFsbFN1YmNsYXNzZXNFeHByZXNzaW9uKEV4cHJlc3Npb24pCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuSW5oZXJpdGFuY2VQb2xpY3kuc2V0T25seUluc3RhbmNlc0V4cHJlc3Npb24oRXhwcmVzc2lvbikKLSAgICAgICAgICogCi0gICAgICAgICAqIEBhdXRob3IgR3V5IFBlbGxldGllcgotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4xIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENsYXNzRXh0cmFjdG9yIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKFJlcXVpcmVkKSBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBleHRyYWN0b3IgdGhhdCBzaG91bGQgYmUgCi0gICAgICAgICAgICAgKiBhcHBsaWVkIHRvIHRoaXMgZW50aXR5J3MgZGVzY3JpcHRvci4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ2xhc3MgdmFsdWUoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQ2xvbmVDb3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNsb25lQ29weVBvbGljeSBvbiBhbiAKLSAgICAgICAgICogRW50aXR5LiBBIENsb25lQ29weVBvbGljeSBtdXN0IHNwZWNpZnkgYXQgb25lIG9yIGJvdGggb2YgdGhlICJtZXRob2QiIAotICAgICAgICAgKiBvciAid29ya2luZ0NvcHlNZXRob2QiLiAid29ya2luZ0NvcHlNZXRob2QiIGlzIHVzZWQgdG8gY2xvbmUgb2JqZWN0cyAKLSAgICAgICAgICogdGhhdCB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSB1c2VyIGFzIHRoZXkgYXJlIHJlZ2lzdGVyZWQgaW4gCi0gICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgdHJhbnNhY3Rpb25hbCBtZWNoYW5pc20sIHRoZSBVbml0T2ZXb3JrLiAibWV0aG9kIiB3aWxsIAotICAgICAgICAgKiBiZSB1c2VkIGZvciB0aGUgY2xvbmUgdGhhdCBpcyB1c2VkIGZvciBjb21wYXJpc29uIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgRGVmZXJyZWRDaGFuZ2VEZXRlY3Rpb25Qb2xpY3kKLSAgICAgICAgICogIAotICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcwotICAgICAgICAgKiBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogRXhhbXBsZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KG1ldGhvZD0ibXlDbG9uZU1ldGhvZCIpCi0gICAgICAgICAqIAotICAgICAgICAgKiBvcjoKLSAgICAgICAgICogCi0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiLCB3b3JraW5nQ29weU1ldGhvZD0ibXlXb3JraW5nQ29weUNsb25lTWV0aG9kIikKLSAgICAgICAgICogCi0gICAgICAgICAqIG9yOgotICAgICAgICAgKiAKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KHdvcmtpbmdDb3B5TWV0aG9kTmFtZT0ibXlXb3JraW5nQ29weUNsb25lIikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENsb25lQ29weVBvbGljeSB7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCB0aGlzIGRlZmluZXMgCi0gICAgICAgICAgICAgKiBhIG1ldGhvZCB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBjbG9uZSB0aGF0IHdpbGwgYmUgdXNlZCAKLSAgICAgICAgICAgICAqIGZvciBjb21wYXJpc29uIGJ5Ci0gICAgICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpCi0gICAgICAgICAgICAgKiBFaXRoZXIgbWV0aG9kIG9yIHdvcmtpbmdDb3B5TWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkCi0gICAgICAgICAgICAgKiB0aGlzIGRlZmluZXMgYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCAKLSAgICAgICAgICAgICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG9iamVjdCByZXR1cm5lZCB3aGVuIHJlZ2lzdGVyaW5nIGFuIAotICAgICAgICAgICAgICogT2JqZWN0IGluIGFuIEVjbGlwc2VMaW5rIFVuaXRPZldvcmsKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIHdvcmtpbmdDb3B5TWV0aG9kKCk7Ci0KLSAgICAgICAgfQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IndvcmtpbmctY29weS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sbGVjdGlvbi10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbGxlY3Rpb25UYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNyZWF0aW9uLXN1ZmZpeCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sbGVjdGlvblRhYmxlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRhYmxlLiBJZiBpdCBpcyBub3QgCi0gICAgICAgICAgICogc3BlY2lmaWVkLCBpdCBpcyBkZWZhdWx0ZWQgdG8gdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGZvbGxvd2luZzogCi0gICAgICAgICAgICogdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBlbnRpdHk7ICJfIiA7IHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgCi0gICAgICAgICAgICogcHJvcGVydHkgb3IgZmllbGQgb2YgdGhlIHNvdXJjZSBlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhdGFsb2cgb2YgdGhlIHRhYmxlLiBJdCBkZWZhdWx0cyB0byB0aGUgcGVyc2lzdGVuY2UgCi0gICAgICAgICAgICogdW5pdCBkZWZhdWx0IGNhdGFsb2cuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNjaGVtYSBvZiB0aGUgdGFibGUuIEl0IGRlZmF1bHRzIHRvIHRoZSBwZXJzaXN0ZW5jZSAKLSAgICAgICAgICAgKiB1bml0IGRlZmF1bHQgc2NoZW1hLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVXNlZCB0byBzcGVjaWZ5IGEgcHJpbWFyeSBrZXkgY29sdW1uIHRoYXQgaXMgdXNlZCBhcyBhIAotICAgICAgICAgICAqIGZvcmVpZ24ga2V5IHRvIGpvaW4gdG8gYW5vdGhlciB0YWJsZS4gSWYgdGhlIHNvdXJjZSBlbnRpdHkgdXNlcyBhIAotICAgICAgICAgICAqIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSwgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBtdXN0IGJlIHNwZWNpZmllZCAKLSAgICAgICAgICAgKiBmb3IgZWFjaCBmaWVsZCBvZiB0aGUgY29tcG9zaXRlIHByaW1hcnkga2V5LiBJbiBhIHNpbmdsZSBwcmltYXJ5IAotICAgICAgICAgICAqIGtleSBjYXNlLCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG1heSBvcHRpb25hbGx5IGJlIHNwZWNpZmllZC4gCi0gICAgICAgICAgICogRGVmYXVsdGluZyB3aWxsIGFwcGx5IG90aGVyd2lzZSBhcyBmb2xsb3dzOgotICAgICAgICAgICAqIG5hbWUsIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgcHJpbWFyeSB0YWJsZSAKLSAgICAgICAgICAgKiBvZiB0aGUgc291cmNlIGVudGl0eS4gcmVmZXJlbmNlZENvbHVtbk5hbWUsIHRoZSBzYW1lIG5hbWUgb2YgCi0gICAgICAgICAgICogcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSBwcmltYXJ5IHRhYmxlIG9mIHRoZSBzb3VyY2UgZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsgCi0gCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVbmlxdWUgY29uc3RyYWludHMgdGhhdCBhcmUgdG8gYmUgcGxhY2VkIG9uIHRoZSB0YWJsZS4gCi0gICAgICAgICAgICogVGhlc2UgYXJlIG9ubHkgdXNlZCBpZiB0YWJsZSBnZW5lcmF0aW9uIGlzIGluIGVmZmVjdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OyAKLSAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjcmVhdGlvbi1zdWZmaXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgotICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb252ZXJzaW9uVmFsdWUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgZGF0YWJhc2UgdmFsdWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGRhdGFWYWx1ZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBvYmplY3QgdmFsdWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG9iamVjdFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAotICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudAotICAgICAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlciBpbnRlcmZhY2UuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgY29udmVydGVyQ2xhc3MoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXJ0aXRpb25pbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAgICAgLyoqIAotICAgICAgICAgICAgICogQSBQYXJ0aXRpb25pbmcgaXMgdXNlZCB0byBwYXJ0aXRpb24gdGhlIGRhdGEgZm9yIGEgY2xhc3MgYWNyb3NzIG11bHRpcGxlIGRpZmZlcmVuY2UgZGF0YWJhc2VzCi0gICAgICAgICAgICAgKiBvciBhY3Jvc3MgYSBkYXRhYmFzZSBjbHVzdGVyIHN1Y2ggYXMgT3JhY2xlIFJBQy4KLSAgICAgICAgICAgICAqIFBhcnRpdGlvbmluZyBjYW4gcHJvdmlkZSBpbXByb3ZlZCBzY2FsYWJpbGl0eSBieSBhbGxvd2luZyBtdWx0aXBsZSBkYXRhYmFzZSBtYWNoaW5lcyB0byBzZXJ2aWNlIHJlcXVlc3RzLgotICAgICAgICAgICAgICogVGhpcyBhbm5vdGF0aW9uIGNvbmZpZ3VyZXMgYSBjdXN0b20gUGFydGl0aW9uaW5nUG9saWN5LgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBJZiBtdWx0aXBsZSBwYXJ0aXRpb25zIGFyZSB1c2VkIHRvIHByb2Nlc3MgYSBzaW5nbGUgdHJhbnNhY3Rpb24sIEpUQSBzaG91bGQgYmUgdXNlZCBmb3IgcHJvcGVyIFhBIHRyYW5zYWN0aW9uIHN1cHBvcnQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIFBhcnRpdGlvbmluZyBjYW4gYmUgZW5hYmxlZCBvbiBhbiBFbnRpdHksIHJlbGF0aW9uc2hpcCwgcXVlcnksIG9yIHNlc3Npb24vcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgICAqIFBhcnRpdGlvbiBwb2xpY2llcyBhcmUgZ2xvYmFsbHkgbmFtZWQgdG8gYWxsb3cgcmV1c2UsCi0gICAgICAgICAgICAgKiB0aGUgcGFydGl0aW9uaW5nIHBvbGljeSBtdXN0IGFsc28gYmUgc2V0IHVzaW5nIHRoZSBAUGFydGl0aW9uZWQgYW5ub3RhdGlvbiB0byBiZSB1c2VkLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBAc2VlIFBhcnRpdGlvbmVkCi0gICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLnBhcnRpdGlvbmluZy5QYXJ0aXRpb25pbmdQb2xpY3kKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBhcnRpdGlvbmluZyB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoUmVxdWlyZWQpIEZ1bGwgcGFja2FnZS5jbGFzcyBuYW1lIG9mIGEgc3ViY2xhc3Mgb2YgUGFydGl0aW9uaW5nUG9saWN5LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIENsYXNzIHBhcnRpdGlvbmluZ0NsYXNzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJoYXNoLXBhcnRpdGlvbmluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgCi0gICAgICAgICAgICAvKiogCi0gICAgICAgICAgICAgKiBIYXNoUGFydGl0aW9uaW5nIHBhcnRpdGlvbnMgYWNjZXNzIHRvIGEgZGF0YWJhc2UgY2x1c3RlciBieSB0aGUgaGFzaCBvZiBhIGZpZWxkIHZhbHVlIGZyb20gdGhlIG9iamVjdCwKLSAgICAgICAgICAgICAqIHN1Y2ggYXMgdGhlIG9iamVjdCdzIGxvY2F0aW9uLCBvciB0ZW5hbnQuCi0gICAgICAgICAgICAgKiBUaGUgaGFzaCBpbmRleGVzIGludG8gdGhlIGxpc3Qgb2YgY29ubmVjdGlvbiBwb29scy4KLSAgICAgICAgICAgICAqIEFsbCB3cml0ZSBvciByZWFkIHJlcXVlc3QgZm9yIG9iamVjdCdzIHdpdGggdGhhdCBoYXNoIHZhbHVlIGFyZSBzZW50IHRvIHRoZSBzZXJ2ZXIuCi0gICAgICAgICAgICAgKiBJZiBhIHF1ZXJ5IGRvZXMgbm90IGluY2x1ZGUgdGhlIGZpZWxkIGFzIGEgcGFyYW1ldGVyLCB0aGVuIGl0IGNhbiBlaXRoZXIgYmUgc2VudAotICAgICAgICAgICAgICogdG8gYWxsIHNlcnZlcidzIGFuZCB1bmlvbmVkLCBvciBsZWZ0IHRvIHRoZSBzZXNpb24ncyBkZWZhdWx0IGJlaGF2aW9yLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLkhhc2hQYXJ0aXRpb25pbmdQb2xpY3kKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBIYXNoUGFydGl0aW9uaW5nIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoZSBkYXRhYmFzZSBjb2x1bW4gb3IgcXVlcnkgcGFyYW1ldGVyIHRvIHBhcnRpdGlvbiBxdWVyaWVzIGJ5LgotICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgdGhlIHRhYmxlIGNvbHVtbiBuYW1lLCBub3QgdGhlIGNsYXNzIGF0dHJpYnV0ZSBuYW1lLgotICAgICAgICAgICAgICAgICAqIFRoZSBjb2x1bW4gdmFsdWUgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgcXVlcnkgYW5kIHNob3VsZCBub3JtYWxseSBiZSBwYXJ0IG9mIHRoZSBvYmplY3QncyBJZC4KLSAgICAgICAgICAgICAgICAgKiBUaGlzIGNhbiBhbHNvIGJlIHRoZSBuYW1lIG9mIGEgcXVlcnkgcGFyYW1ldGVyLgotICAgICAgICAgICAgICAgICAqIElmIGEgcXVlcnkgZG9lcyBub3QgY29udGFpbiB0aGUgZmllbGQgdGhlIHF1ZXJ5IHdpbGwgbm90IGJlIHBhcnRpdGlvbmVkLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIENvbHVtbiBwYXJ0aXRpb25Db2x1bW4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIExpc3Qgb2YgY29ubmVjdGlvbiBwb29sIG5hbWVzIHRvIHBhcnRpdGlvbiBhY3Jvc3MuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gY29ubmVjdGlvblBvb2xzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBEZWZpbmVzIGlmIHF1ZXJpZXMgdGhhdCBkbyBub3QgY29udGFpbiB0aGUgcGFydGl0aW9uIGZpZWxkIHNob3VsZCBiZSBzZW50Ci0gICAgICAgICAgICAgICAgICogdG8gZXZlcnkgZGF0YWJhc2UgYW5kIGhhdmUgdGhlIHJlc3VsdCB1bmlvbmVkLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGJvb2xlYW4gdW5pb25VbnBhcnRpdGlvbmFibGVRdWVyaWVzKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24tY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvb2wiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pb24tdW5wYXJ0aXRpb25hYmxlLXF1ZXJpZXMiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmFuZ2UtcGFydGl0aW9uaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBSYW5nZVBhcnRpdGlvbmluZ1BvbGljeSBwYXJ0aXRpb25zIGFjY2VzcyB0byBhIGRhdGFiYXNlIGNsdXN0ZXIgYnkgYSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBvYmplY3QsCi0gICAgICAgICAqIHN1Y2ggYXMgdGhlIG9iamVjdCdzIGlkLCBsb2NhdGlvbiwgb3IgdGVuYW50LgotICAgICAgICAgKiBFYWNoIHNlcnZlciBpcyBhc3NpZ25lZCBhIHJhbmdlIG9mIHZhbHVlcy4KLSAgICAgICAgICogQWxsIHdyaXRlIG9yIHJlYWQgcmVxdWVzdCBmb3Igb2JqZWN0J3Mgd2l0aCB0aGF0IHZhbHVlIGFyZSBzZW50IHRvIHRoZSBzZXJ2ZXIuCi0gICAgICAgICAqIElmIGEgcXVlcnkgZG9lcyBub3QgaW5jbHVkZSB0aGUgZmllbGQgYXMgYSBwYXJhbWV0ZXIsIHRoZW4gaXQgY2FuIGVpdGhlciBiZSBzZW50Ci0gICAgICAgICAqIHRvIGFsbCBzZXJ2ZXIncyBhbmQgdW5pb25lZCwgb3IgbGVmdCB0byB0aGUgc2VzaW9uJ3MgZGVmYXVsdCBiZWhhdmlvci4KLSAgICAgICAgICogCi0gICAgICAgICAqIElmIG11bHRpcGxlIHBhcnRpdGlvbnMgYXJlIHVzZWQgdG8gcHJvY2VzcyBhIHNpbmdsZSB0cmFuc2FjdGlvbiwgSlRBIHNob3VsZCBiZSB1c2VkIGZvciBwcm9wZXIgWEEgdHJhbnNhY3Rpb24gc3VwcG9ydC4KLSAgICAgICAgICogCi0gICAgICAgICAqIFBhcnRpdGlvbmluZyBjYW4gYmUgZW5hYmxlZCBvbiBhbiBFbnRpdHksIHJlbGF0aW9uc2hpcCwgcXVlcnksIG9yIHNlc3Npb24vcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICogUGFydGl0aW9uIHBvbGljaWVzIGFyZSBnbG9iYWxseSBuYW1lZCB0byBhbGxvdyByZXVzZSwKLSAgICAgICAgICogdGhlIHBhcnRpdGlvbmluZyBwb2xpY3kgbXVzdCBhbHNvIGJlIHNldCB1c2luZyB0aGUgQFBhcnRpdGlvbmVkIGFubm90YXRpb24gdG8gYmUgdXNlZC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgUGFydGl0aW9uZWQKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5wYXJ0aXRpb25pbmcuUmFuZ2VQYXJ0aXRpb25pbmdQb2xpY3kKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSYW5nZVBhcnRpdGlvbmluZyB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRoZSBkYXRhYmFzZSBjb2x1bW4gb3IgcXVlcnkgcGFyYW1ldGVyIHRvIHBhcnRpdGlvbiBxdWVyaWVzIGJ5LgotICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgdGFibGUgY29sdW1uIG5hbWUsIG5vdCB0aGUgY2xhc3MgYXR0cmlidXRlIG5hbWUuCi0gICAgICAgICAgICAgKiBUaGUgY29sdW1uIHZhbHVlIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIHF1ZXJ5IGFuZCBzaG91bGQgbm9ybWFsbHkgYmUgcGFydCBvZiB0aGUgb2JqZWN0J3MgSWQuCi0gICAgICAgICAgICAgKiBUaGlzIGNhbiBhbHNvIGJlIHRoZSBuYW1lIG9mIGEgcXVlcnkgcGFyYW1ldGVyLgotICAgICAgICAgICAgICogSWYgYSBxdWVyeSBkb2VzIG5vdCBjb250YWluIHRoZSBmaWVsZCB0aGUgcXVlcnkgd2lsbCBub3QgYmUgcGFydGl0aW9uZWQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIENvbHVtbiBwYXJ0aXRpb25Db2x1bW4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoUmVxdWlyZWQpIExpc3Qgb2YgY29ubmVjdGlvbiBwb29sIG5hbWVzIHRvIGxvYWQgYmFsYW5jZSBhY3Jvc3MuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFJhbmdlUGFydGl0aW9uW10gcGFydGl0aW9ucygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIERlZmluZXMgaWYgcXVlcmllcyB0aGF0IGRvIG5vdCBjb250YWluIHRoZSBwYXJ0aXRpb24gZmllbGQgc2hvdWxkIGJlIHNlbnQKLSAgICAgICAgICAgICAqIHRvIGV2ZXJ5IGRhdGFiYXNlIGFuZCBoYXZlIHRoZSByZXN1bHQgdW5pb25lZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYm9vbGVhbiB1bmlvblVucGFydGl0aW9uYWJsZVF1ZXJpZXMoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiAqLwotICAgICAgICAgICAgQ2xhc3MgcGFydGl0aW9uVmFsdWVUeXBlKCkgZGVmYXVsdCBTdHJpbmcuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24tY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24iIHR5cGU9Im9ybTpyYW5nZS1wYXJ0aXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pb24tdW5wYXJ0aXRpb25hYmxlLXF1ZXJpZXMiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFydGl0aW9uLXZhbHVlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyYW5nZS1wYXJ0aXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAvKiogCi0gICAgICAgICAqIFJlcHJlc2VudCBhIHNwZWNpZmljIHJhbmdlIHBhcnRpdGlvbi4KLSAgICAgICAgICogVmFsdWVzID0gc3RhcnRWYWx1ZSBhbmQgPSBlbmRWYWx1ZSB3aWxsIGJlIHJvdXRlZCB0byB0aGUgY29ubmVjdGlvbiBwb29sLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBSYW5nZVBhcnRpdGlvbmluZ1BvbGljeQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLnBhcnRpdGlvbmluZy5SYW5nZVBhcnRpdGlvbmluZ1BvbGljeQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLnBhcnRpdGlvbmluZy5SYW5nZVBhcnRpdGlvbgotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFJhbmdlUGFydGl0aW9uIHsKLSAgICAgICAgICAgIC8qKiBUaGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByYW5nZSBzdGFydCB2YWx1ZS4gKi8KLSAgICAgICAgICAgIFN0cmluZyBzdGFydFZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIC8qKiBUaGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByYW5nZSBzdGFydCB2YWx1ZS4gKi8KLSAgICAgICAgICAgIFN0cmluZyBlbmRWYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgICAvKiogVGhlIGNvbm5lY3Rpb24gcG9vbCB0byByb3V0ZSBxdWVyaWVzIHRvIGZvciB0aGlzIHJhbmdlLiAqLwotICAgICAgICAgICAgU3RyaW5nIGNvbm5lY3Rpb25Qb29sKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0YXJ0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZW5kLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29ubmVjdGlvbi1wb29sIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsdWUtcGFydGl0aW9uaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBWYWx1ZVBhcnRpdGlvbmluZyBwYXJ0aXRpb25zIGFjY2VzcyB0byBhIGRhdGFiYXNlIGNsdXN0ZXIgYnkgYSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBvYmplY3QsCi0gICAgICAgICAqIHN1Y2ggYXMgdGhlIG9iamVjdCdzIGxvY2F0aW9uLCBvciB0ZW5hbnQuCi0gICAgICAgICAqIEVhY2ggdmFsdWUgaXMgYXNzaWduZWQgYSBzcGVjaWZpYyBzZXJ2ZXIuCi0gICAgICAgICAqIEFsbCB3cml0ZSBvciByZWFkIHJlcXVlc3QgZm9yIG9iamVjdCdzIHdpdGggdGhhdCB2YWx1ZSBhcmUgc2VudCB0byB0aGUgc2VydmVyLgotICAgICAgICAgKiBJZiBhIHF1ZXJ5IGRvZXMgbm90IGluY2x1ZGUgdGhlIGZpZWxkIGFzIGEgcGFyYW1ldGVyLCB0aGVuIGl0IGNhbiBlaXRoZXIgYmUgc2VudAotICAgICAgICAgKiB0byBhbGwgc2VydmVyJ3MgYW5kIHVuaW9uZWQsIG9yIGxlZnQgdG8gdGhlIHNlc2lvbidzIGRlZmF1bHQgYmVoYXZpb3IuCi0gICAgICAgICAqIAotICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLnBhcnRpdGlvbmluZy5WYWx1ZVBhcnRpdGlvbmluZ1BvbGljeQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZhbHVlUGFydGl0aW9uaW5nIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIGRhdGFiYXNlIGNvbHVtbiBvciBxdWVyeSBwYXJhbWV0ZXIgdG8gcGFydGl0aW9uIHF1ZXJpZXMgYnkuCi0gICAgICAgICAgICAgKiBUaGlzIGlzIHRoZSB0YWJsZSBjb2x1bW4gbmFtZSwgbm90IHRoZSBjbGFzcyBhdHRyaWJ1dGUgbmFtZS4KLSAgICAgICAgICAgICAqIFRoZSBjb2x1bW4gdmFsdWUgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgcXVlcnkgYW5kIHNob3VsZCBub3JtYWxseSBiZSBwYXJ0IG9mIHRoZSBvYmplY3QncyBJZC4KLSAgICAgICAgICAgICAqIFRoaXMgY2FuIGFsc28gYmUgdGhlIG5hbWUgb2YgYSBxdWVyeSBwYXJhbWV0ZXIuCi0gICAgICAgICAgICAgKiBJZiBhIHF1ZXJ5IGRvZXMgbm90IGNvbnRhaW4gdGhlIGZpZWxkIHRoZSBxdWVyeSB3aWxsIG5vdCBiZSBwYXJ0aXRpb25lZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ29sdW1uIHBhcnRpdGlvbkNvbHVtbigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiogU3RvcmUgdGhlIHZhbHVlIHBhcnRpdGlvbnMuIEVhY2ggcGFydGl0aW9uIG1hcHMgYSB2YWx1ZSB0byBhIGNvbm5lY3Rpb25Qb29sLiAqLwotICAgICAgICAgICAgVmFsdWVQYXJ0aXRpb25bXSBwYXJ0aXRpb25zKCk7Ci0gICAgCi0gICAgICAgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiAqLwotICAgICAgICAgICAgQ2xhc3MgcGFydGl0aW9uVmFsdWVUeXBlKCkgZGVmYXVsdCBTdHJpbmcuY2xhc3M7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgZGVmYXVsdCBjb25uZWN0aW9uIHBvb2wgaXMgdXNlZCBmb3IgYW55IHVubWFwcGVkIHZhbHVlcy4gKi8KLSAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0Q29ubmVjdGlvblBvb2woKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogRGVmaW5lcyBpZiBxdWVyaWVzIHRoYXQgZG8gbm90IGNvbnRhaW4gdGhlIHBhcnRpdGlvbiBmaWVsZCBzaG91bGQgYmUgc2VudAotICAgICAgICAgICAgICogdG8gZXZlcnkgZGF0YWJhc2UgYW5kIGhhdmUgdGhlIHJlc3VsdCB1bmlvbmVkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBib29sZWFuIHVuaW9uVW5wYXJ0aXRpb25hYmxlUXVlcmllcygpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24tY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24iIHR5cGU9Im9ybTp2YWx1ZS1wYXJ0aXRpb24iIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaW9uLXVucGFydGl0aW9uYWJsZS1xdWVyaWVzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQtY29ubmVjdGlvbi1wb29sIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFydGl0aW9uLXZhbHVlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZS1wYXJ0aXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAvKiogCi0gICAgICAgICAqIFJlcHJlc2VudCBhIHNwZWNpZmljIHZhbHVlIHBhcnRpdGlvbi4KLSAgICAgICAgICogVGhlIHZhbHVlIHdpbGwgYmUgcm91dGVkIHRvIHRoZSBjb25uZWN0aW9uIHBvb2wuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIFZhbHVlUGFydGl0aW9uaW5nUG9saWN5Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlZhbHVlUGFydGl0aW9uaW5nUG9saWN5Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlZhbHVlUGFydGl0aW9uCi0gICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4yCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVmFsdWVQYXJ0aXRpb24gewotICAgICAgICAgICAgLyoqIFRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJhbmdlIHN0YXJ0IHZhbHVlLiAqLwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqIFRoZSBjb25uZWN0aW9uIHBvb2wgdG8gcm91dGUgcXVlcmllcyB0byBmb3IgdGhpcyB2YWx1ZS4gKi8KLSAgICAgICAgICAgIFN0cmluZyBjb25uZWN0aW9uUG9vbCgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbm5lY3Rpb24tcG9vbCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJvdW5kLXJvYmluLXBhcnRpdGlvbmluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgCi0gICAgICAgICAgICAvKiogCi0gICAgICAgICAgICAgKiBSb3VuZFJvYmluUGFydGl0aW9uaW5nIHNlbmRzIHJlcXVlc3RzIGluIGEgcm91bmQgcm9iaW4gZmFzaGlvbiB0byB0aGUgc2V0IG9mIGNvbm5lY3Rpb24gcG9vbHMuCi0gICAgICAgICAgICAgKiBJdCBpcyBmb3IgbG9hZC1iYWxhbmNpbmcgcmVhZCBxdWVyaWVzIGFjcm9zcyBhIGNsdXN0ZXIgb2YgZGF0YWJhc2UgbWFjaGluZXMuCi0gICAgICAgICAgICAgKiBJdCByZXF1aXJlcyB0aGF0IHRoZSBmdWxsIGRhdGFiYXNlIGJlIHJlcGxpY2F0ZWQgb24gZWFjaCBtYWNoaW5lLCBzbyBkb2VzIG5vdCBzdXBwb3J0IHBhcnRpdGlvbmluZy4KLSAgICAgICAgICAgICAqIFRoZSBkYXRhIHNob3VsZCBlaXRoZXIgYmUgcmVhZC1vbmx5LCBvciB3cml0ZXMgc2hvdWxkIGJlIHJlcGxpY2F0ZWQgb24gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlJvdW5kUm9iaW5Qb2xpY3kKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSb3VuZFJvYmluUGFydGl0aW9uaW5nIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIChSZXF1aXJlZCkgTGlzdCBvZiBjb25uZWN0aW9uIHBvb2wgbmFtZXMgdG8gbG9hZCBiYWxhbmNlIGFjcm9zcy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBjb25uZWN0aW9uUG9vbHMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBUaGlzIGFsbG93cyBmb3IgYSBzZXQgb2YgZGF0YWJhc2UgdG8gYmUgd3JpdHRlbiB0byBhbmQga2VwdCBpbiBzeW5jaCwKLSAgICAgICAgICAgICAgICAgKiBhbmQgaGF2ZSByZWFkcyBsb2FkLWJhbGFuY2VkIGFjcm9zcyB0aGUgZGF0YWJhc2VzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVwbGljYXRlV3JpdGVzKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvb2wiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVwbGljYXRlLXdyaXRlcyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXBsaWNhdGlvbi1wYXJ0aXRpb25pbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAgICAgLyoqIAotICAgICAgICAgICAgICogUmVwbGljYXRpb25QYXJ0aXRpb25pbmcgc2VuZHMgcmVxdWVzdHMgdG8gYSBzZXQgb2YgY29ubmVjdGlvbiBwb29scy4KLSAgICAgICAgICAgICAqIEl0IGlzIGZvciByZXBsaWNhdGluZyBkYXRhIGFjcm9zcyBhIGNsdXN0ZXIgb2YgZGF0YWJhc2UgbWFjaGluZXMuCi0gICAgICAgICAgICAgKiBPbmx5IG1vZGlmaWNhdGlvbiBxdWVyaWVzIGFyZSByZXBsaWNhdGVkLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlJlcGxpY2F0aW9uUG9saWN5Ci0gICAgICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUmVwbGljYXRpb25QYXJ0aXRpb25pbmcgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogKFJlcXVpcmVkKSBMaXN0IG9mIGNvbm5lY3Rpb24gcG9vbCBuYW1lcyB0byBsb2FkIGJhbGFuY2UgYWNyb3NzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNvbm5lY3Rpb25Qb29scygpOwotICAgICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlvbi1wYXJ0aXRpb25pbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAgICAgLyoqIAotICAgICAgICAgICAgICogVW5pb25QYXJ0aXRpb25pbmcgc2VuZHMgcXVlcmllcyB0byBhbGwgY29ubmVjdGlvbiBwb29scyBhbmQgdW5pb25zIHRoZSByZXN1bHRzLgotICAgICAgICAgICAgICogVGhpcyBpcyBmb3IgcXVlcmllcyBvciByZWxhdGlvbnNoaXBzIHRoYXQgc3BhbiBwYXJ0aXRpb25zIHdoZW4gcGFydGl0aW9uaW5nIGlzIHVzZWQsCi0gICAgICAgICAgICAgKiBzdWNoIGFzIG9uIGEgTWFueVRvTWFueSBjcm9zcyBwYXJ0aXRpb24gcmVsYXRpb25zaGlwLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlVuaW9uUGFydGl0aW9uaW5nUG9saWN5Ci0gICAgICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVW5pb25QYXJ0aXRpb25pbmcgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogKFJlcXVpcmVkKSBMaXN0IG9mIGNvbm5lY3Rpb24gcG9vbCBuYW1lcyB0byBsb2FkIGJhbGFuY2UgYWNyb3NzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNvbm5lY3Rpb25Qb29scygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIERlZmluZXMgaWYgd3JpdGUgcXVlcmllcyBzaG91bGQgYmUgcmVwbGljYXRlZC4KLSAgICAgICAgICAgICAgICAgKiBXcml0ZXMgYXJlIG5vcm1hbGx5IG5vdCByZXBsaWNhdGVkIHdoZW4gdW5pb25pbmcsCi0gICAgICAgICAgICAgICAgICogYnV0IGNhbiBiZSBmb3IgTWFueVRvTWFueSByZWxhdGlvbnNoaXBzLCB3aGVuIHRoZSBqb2luIHRhYmxlIG5lZWRzIHRvIGJlIHJlcGxpY2F0ZWQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgYm9vbGVhbiByZXBsaWNhdGVXcml0ZXMoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXBsaWNhdGUtd3JpdGVzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBpbm5lZC1wYXJ0aXRpb25pbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAvKiogCi0gICAgICAgICAqIFBpbm5lZFBhcnRpdGlvbmluZyBwaW5zIHJlcXVlc3RzIHRvIGEgc2luZ2xlIGNvbm5lY3Rpb24gcG9vbC4KLSAgICAgICAgICogCi0gICAgICAgICAqIFBhcnRpdGlvbmluZyBjYW4gYmUgZW5hYmxlZCBvbiBhbiBFbnRpdHksIHJlbGF0aW9uc2hpcCwgcXVlcnksIG9yIHNlc3Npb24vcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlBpbm5lZFBhcnRpdGlvbmluZ1BvbGljeQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBpbm5lZFBhcnRpdGlvbmluZyB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRoZSBjb25uZWN0aW9uIHBvb2wgbmFtZSB0byBwaW4gcXVlcmllcyB0by4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIGNvbm5lY3Rpb25Qb29sKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb25uZWN0aW9uLXBvb2wiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4tcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW5SZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgb24gYW4gRW50aXR5LgotICAgICAgICAgKiBJdCBpcyByZXF1aXJlZCB0aGF0IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgYmUgc3BlY2lmaWVkIAotICAgICAgICAgKiBhcyB0aGUgYXJndW1lbnQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3Mgb3IgCi0gICAgICAgICAqIEVtYmVkZGFibGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBGb3IgaW5zdGFuY2U6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENvcHlQb2xpY3koImV4YW1wbGUuTXlDb3B5UG9saWN5IikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvcHlQb2xpY3kgewotCi0gICAgICAgIC8qCi0gICAgICAgICogKFJlcXVpcmVkKQotICAgICAgICAqIFRoaXMgZGVmaW5lcyB0aGUgY2xhc3Mgb2YgdGhlIGNvcHkgcG9saWN5LiBJdCBtdXN0IHNwZWNpZnkgYSBjbGFzcyAKLSAgICAgICAgKiB0aGF0IGltcGxlbWVudHMgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5Ci0gICAgICAgICovCi0gICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICJEVFlQRSI7Ci0gICAgICAgICAgRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUoKSBkZWZhdWx0IFNUUklORzsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMzE7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIERpc2NyaW1pbmF0b3JDbGFzcyBpcyB1c2VkIHdpdGhpbiBhIFZhcmlhYmxlT25lVG9PbmUgYW5ub3RhdGlvbi4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHt9KSAKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ2xhc3MgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGRpc2NyaW1pbmF0b3IgdG8gYmUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3IoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNsYXNzIHRvIHRoZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gCi0gICAgICAgICAgICogZGlzY3JpbWluYXRvci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBEaXNjcmltaW5hdG9yVHlwZSB7IFNUUklORywgQ0hBUiwgSU5URUdFUiB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFSIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlRFR0VSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvclZhbHVlIHsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRWxlbWVudENvbGxlY3Rpb24gewotICAgICAgICAgIENsYXNzIHRhcmdldENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTp0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTp0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTplbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bG9iIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjIiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sbGVjdGlvbi10YWJsZSIgdHlwZT0ib3JtOmNvbGxlY3Rpb24tdGFibGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW9uLWRlbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhdGNoLWZldGNoIiB0eXBlPSJvcm06YmF0Y2gtZmV0Y2giIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJub25jYWNoZWFibGUiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpncm91cCByZWY9Im9ybTpwYXJ0aXRpb25pbmctZ3JvdXAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbXBvc2l0ZS1tZW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcnJheSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBcnJheSB0eXBlcyBhcmUgZXh0ZW5kZWQgb2JqZWN0LXJlbGF0aW9uYWwgZGF0YS10eXBlcyBzdXBwb3J0ZWQgYnkgc29tZSBkYXRhYmFzZXMuCi0gICAgICAgICAqIEFycmF5IHR5cGVzIGFyZSB1c2VyIGRlZmluZSB0eXBlcyBpbiB0aGUgZGF0YWJhc2Ugc3VjaCBhcyBWQVJSQVkgdHlwZXMgb24gT3JhY2xlLgotICAgICAgICAgKiBBcnJheXMgY2FuIGNvbnRhaW5zIGJhc2ljIHR5cGVzIChWQVJDSEFSKSBvciBvdGhlciBTdHJ1Y3QgdHlwZXMsIGFuZCBjYW4gYmUgc3RvcmVkIGluCi0gICAgICAgICAqIGEgY29sdW1uIG9yIGluIGEgU3RydWN0IHR5cGUuCi0gICAgICAgICAqIFRoaXMgYW5ub3RhdGlvbiBjYW4gYmUgZGVmaW5lZCBvbiBhIGNvbGxlY3Rpb24gYXR0cmlidXRlIHRoYXQgaXMKLSAgICAgICAgICogcGVyc2lzdGVkIHRvIGFuIEFycmF5IHR5cGUuICBUaGUgY29sbGVjdGlvbiBjYW4gYmUgb2YgYmFzaWMgdHlwZXMsIG9yIGVtYmVkZGFibGUKLSAgICAgICAgICogY2xhc3MgbWFwcGVkIHVzaW5nIGEgU3RydWN0LgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5zdHJ1Y3R1cmVzLk9iamVjdFJlbGF0aW9uYWxEYXRhVHlwZURlc2NyaXB0b3IKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5zdHJ1Y3R1cmVzLkFycmF5TWFwcGluZwotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnN0cnVjdHVyZXMuT2JqZWN0QXJyYXlNYXBwaW5nCi0gICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4zCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBcnJheSB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGJhc2ljIG9yIGVtYmVkZGFibGUgY2xhc3MgdGhhdCBpcyB0aGUgZWxlbWVudAotICAgICAgICAgICAgICogdHlwZSBvZiB0aGUgY29sbGVjdGlvbi4gIFRoaXMgZWxlbWVudCBpcyBvcHRpb25hbCBvbmx5IGlmIHRoZQotICAgICAgICAgICAgICogY29sbGVjdGlvbiBmaWVsZCBvciBwcm9wZXJ0eSBpcyBkZWZpbmVkIHVzaW5nIEphdmEgZ2VuZXJpY3MsCi0gICAgICAgICAgICAgKiBhbmQgbXVzdCBiZSBzcGVjaWZpZWQgb3RoZXJ3aXNlLiAgSXQgZGVmYXVsdHMgdG8gdGhlCi0gICAgICAgICAgICAgKiBwYXJhbXRlcml6ZWQgdHlwZSBvZiB0aGUgY29sbGVjdGlvbiB3aGVuIGRlZmluZWQgdXNpbmcKLSAgICAgICAgICAgICAqIGdlbmVyaWNzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBkYXRhYmFzZSBuYW1lIG9mIHRoZSBkYXRhYmFzZSBhcnJheSBzdHJ1Y3R1cmUgdHlwZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIGRhdGFiYXNlVHlwZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpsb2IiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjIiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhYmFzZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBlbWJlZGRhYmxlIG9iamVjdHMuIElzIAotICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgCi0gICAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHByb2Nlc3NlZCAKLSAgICAgICAgaW4gdGhlIGNsYXNzLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGRlZmF1bHRpbmcgcnVsZXMgd2lsbCAKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRhYmxlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QiIHR5cGU9Im9ybTpzdHJ1Y3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvcHktcG9saWN5IiB0eXBlPSJvcm06Y29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwbHNxbC1yZWNvcmQiIHR5cGU9Im9ybTpwbHNxbC1yZWNvcmQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwbHNxbC10YWJsZSIgdHlwZT0ib3JtOnBsc3FsLXRhYmxlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwYXJlbnQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQtaWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktbGlzdGVuZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIGFuIGVudGl0eSBsaXN0ZW5lciB0byBiZSBpbnZva2VkIGF0IGxpZmVjeWNsZSBldmVudHMKLSAgICAgICAgZm9yIHRoZSBlbnRpdGllcyB0aGF0IGxpc3QgdGhpcyBsaXN0ZW5lci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlMaXN0ZW5lcnMgewotICAgICAgICAgIENsYXNzW10gdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXIiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5UmVzdWx0IHsKLSAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcygpOwotICAgICAgICAgIEZpZWxkUmVzdWx0W10gZmllbGRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQtcmVzdWx0IiB0eXBlPSJvcm06ZmllbGQtcmVzdWx0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZW50aXR5LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBFbnVtVHlwZSB7Ci0gICAgICAgICAgT1JESU5BTCwKLSAgICAgICAgICBTVFJJTkcKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1JESU5BTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtZXJhdGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW51bWVyYXRlZCB7Ci0gICAgICAgICAgRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOmVudW0tdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZldGNoLWF0dHJpYnV0ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEZldGNoQXR0cmlidXRlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBmZXRjaCBhdHRyaWJ1dGUgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZldGNoLWdyb3VwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRmV0Y2hHcm91cCB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgZmV0Y2ggZ3JvdXAgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgSW5kaWNhdGVzIHdoZXRoZXIgYWxsIHJlbGF0aW9uc2hpcCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICogc3BlY2lmaWVkIGluIHRoZSBmZXRjaCBncm91cCBzaG91bGQgYmUgbG9hZGVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIGJvb2xlYW4gbG9hZCgpIGRlZmF1bHQgdHJ1ZTsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgdG8gZmV0Y2guCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hBdHRyaWJ1dGVbXSBhdHRyaWJ1dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIiB0eXBlPSJvcm06ZmV0Y2gtYXR0cmlidXRlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImxvYWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEZldGNoVHlwZSB7IExBWlksIEVBR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQVpZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRmllbGRSZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbigpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImdlbmVyYXRlZC12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEdlbmVyYXRlZFZhbHVlIHsKLSAgICAgICAgICBHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgQVVUTzsKLSAgICAgICAgICBTdHJpbmcgZ2VuZXJhdG9yKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RyYXRlZ3kiIHR5cGU9Im9ybTpnZW5lcmF0aW9uLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmF0b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJnZW5lcmF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBHZW5lcmF0aW9uVHlwZSB7IFRBQkxFLCBTRVFVRU5DRSwgSURFTlRJVFksIEFVVE8gfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRVFVRU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURFTlRJVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5kZXgiIHR5cGU9Im9ybTppbmRleCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQtY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZENsYXNzIHsKLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImlkLXZhbGlkYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBJZFZhbGlkYXRpb24gZW51bSBkZXRlcm1pbmVzIHRoZSB0eXBlIHZhbHVlIHRoYXQgYXJlIHZhbGlkIGZvciBhbiBJZC4KLSAgICAgICAgICogQnkgZGVmYXVsdCBudWxsIGlzIG5vdCBhbGxvd2VkLCBhbmQgMCBpcyBub3QgYWxsb3cgZm9yIHNpbmdsZXRvbiBpZHMgb2YgbG9uZyBvciBpbnQgdHlwZS4KLSAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgWkVSTyBmb3Igc2luZ2xldG9uIGlkcywgYW5kIE5VTEwgZm9yIGNvbXBvc2l0ZSBpZHMuCi0gICAgICAgICAqIFRoaXMgY2FuIGJlIHNldCB1c2luZyB0aGUgQFByaW1hcnlLZXkgYW5ub3RhdGlvbiwgb3IgQ2xhc3NEZXNjcmlwdG9yIEFQSS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgUHJpbWFyeUtleQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLkNsYXNzRGVzY3JpcHRvciNzZXRJZFZhbGlkYXRpb24oSWRWYWxpZGF0aW9uKQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMCAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBJZFZhbGlkYXRpb24gewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBPbmx5IG51bGwgaXMgbm90IGFsbG93ZWQgYXMgYW4gaWQgdmFsdWUsIDAgaXMgYWxsb3dlZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTlVMTCwKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBudWxsIGFuZCAwIGFyZSBub3QgYWxsb3dlZCwgKG9ubHkgaW50IGFuZCBsb25nKS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgWkVSTywKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBObyBpZCB2YWxpZGF0aW9uIGlzIGRvbmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVUxMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaRVJPIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLWtleS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ29uZmlndXJlcyB3aGF0IHR5cGUgb2YgSWQgdmFsdWUgaXMgdXNlZCB0byBzdG9yZSB0aGUgb2JqZWN0IGluIHRoZSBjYWNoZS4KLSAgICAgICAgICAgICAqIFRoaXMgY2FuIGVpdGhlciBiZSB0aGUgYmFzaWMgSWQgdmFsdWUgZm9yIHNpbXBsZSBzaW5nbGV0b24gSWRzLAotICAgICAgICAgICAgICogb3IgYW4gb3B0aW1pemVkIENhY2hlS2V5IHR5cGUuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgUHJpbWFyeUtleSNjYWNoZUtleVR5cGUoKQotICAgICAgICAgICAgICogQHNlZSBDbGFzc0Rlc2NyaXB0b3Ijc2V0Q2FjaGVLZXlUeXBlKENhY2hlS2V5VHlwZSkKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgZW51bSBDYWNoZUtleVR5cGUgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoaXMgY2FuIG9ubHkgYmUgdXNlZCBmb3Igc2ltcGxlIHNpbmdsZXRvbiBJZHMsIHN1Y2ggYXMgbG9uZy9pbnQvU3RyaW5nLgotICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIHNpbXBsZSBzaW5nbGV0b24gSWRzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIElEX1ZBTFVFLAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogT3B0aW1pemVkIGNhY2hlIGtleSB0eXBlIHRoYXQgYWxsb3dzIGNvbXBvc2l0ZSBhbmQgY29tcGxleCB2YWx1ZXMuCi0gICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgY29tcG9zaXRlIG9yIGNvbXBsZXggSWRzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIENBQ0hFX0tFWSwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoZSBjYWNoZSBrZXkgdHlwZSBpcyBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZWQgZGVwZW5kaW5nIG9uIHdoYXQgaXMgb3B0aW1hbCBmb3IgdGhlIGNsYXNzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEFVVE8KLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURfVkFMVUUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQ0hFX0tFWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmhlcml0YW5jZSB7Ci0gICAgICAgICAgSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBTSU5HTEVfVEFCTEU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06aW5oZXJpdGFuY2UtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUKLSAgICAgICAgICB7IFNJTkdMRV9UQUJMRSwgSk9JTkVELCBUQUJMRV9QRVJfQ0xBU1N9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lOR0xFX1RBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT0lORUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFX1BFUl9DTEFTUyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkluc3RhbnRpYXRpb25Db3B5UG9saWN5IAotICAgICAgICAgKiBvbiBhbiBFbnRpdHkuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHRoZSBkZWZhdWx0IENvcHlQb2xpY3kgaW4gCi0gICAgICAgICAqIEVjbGlwc2VMaW5rIGFuZCB0aGVyZWZvcmUgdGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBvbmx5IHVzZWQgdG8gCi0gICAgICAgICAqIG92ZXJyaWRlIG90aGVyIHR5cGVzIG9mIGNvcHkgcG9saWNpZXMKLSAgICAgICAgICogCi0gICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogRXhhbXBsZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBASW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbnN0YW50aWF0aW9uQ29weVBvbGljeSB7Ci0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqb2luLWZldGNoLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBKb2luRmV0Y2hUeXBlIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIGlubmVyIGpvaW4gaXMgdXNlZCB0byBmZXRjaCB0aGUgcmVsYXRlZCBvYmplY3QuCi0gICAgICAgICAqIFRoaXMgZG9lcyBub3QgYWxsb3cgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgotICAgICAgICAgKi8KLSAgICAgICAgSU5ORVIsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIGlubmVyIGpvaW4gaXMgdXNlZCB0byBmZXRjaCB0aGUgcmVsYXRlZCBvYmplY3QuCi0gICAgICAgICAqIFRoaXMgYWxsb3dzIGZvciBudWxsL2VtcHR5IHZhbHVlcy4KLSAgICAgICAgICovCi0gICAgICAgIE9VVEVSLAotICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5ORVIiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVEVSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJiYXRjaC1mZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBwdWJsaWMgZW51bSBCYXRjaEZldGNoVHlwZSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3JtIG9mIGJhdGNoIHJlYWRpbmcuCi0gICAgICAgICAgICAgICAgICogVGhlIG9yaWdpbmFsIHF1ZXJ5J3Mgc2VsZWN0aW9uIGNyaXRlcmlhIGlzIGpvaW5lZCB3aXRoIHRoZSBiYXRjaCBxdWVyeS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBKT0lOLAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhpcyB1c2VzIGFuIFNRTCBFWElTVFMgYW5kIGEgc3ViLXNlbGVjdCBpbiB0aGUgYmF0Y2ggcXVlcnkgaW5zdGVhZCBvZiBhIGpvaW4uCi0gICAgICAgICAgICAgICAgICogVGhpcyBoYXMgdGhlIGFkdmFudGFnZSBvZiBub3QgcmVxdWlyaW5nIGFuIFNRTCBESVNUSU5DVCB3aGljaCBjYW4gaGF2ZSBpc3N1ZXMKLSAgICAgICAgICAgICAgICAgKiB3aXRoIExPQnMsIG9yIG1heSBiZSBtb3JlIGVmZmljaWVudCBmb3Igc29tZSB0eXBlcyBvZiBxdWVyaWVzIG9yIG9uIHNvbWUgZGF0YWJhc2VzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEVYSVNUUywKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoaXMgdXNlcyBhbiBTUUwgSU4gY2xhdXNlIGluIHRoZSBiYXRjaCBxdWVyeSBwYXNzaW5nIGluIHRoZSBzb3VyY2Ugb2JqZWN0IElkcy4KLSAgICAgICAgICAgICAgICAgKiBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIG9mIG9ubHkgc2VsZWN0aW5nIHRoZSBvYmplY3RzIG5vdCBhbHJlYWR5IGNvbnRhaW5lZCBpbiB0aGUgY2FjaGUsCi0gICAgICAgICAgICAgICAgICogYW5kIGNhbiB3b3JrIGJldHRlciB3aXRoIGN1cnNvcnMsIG9yIGlmIGpvaW5zIGNhbm5vdCBiZSB1c2VkLgotICAgICAgICAgICAgICAgICAqIFRoaXMgbWF5IG9ubHkgd29yayBmb3Igc2luZ2xldG9uIElkcyBvbiBzb21lIGRhdGFiYXNlcy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBJTiAgICAKLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPSU4iLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVYSVNUUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gaW52ZXJzZUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZlcnNlLWpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjcmVhdGlvbi1zdWZmaXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvYiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIExvYiB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9jay1tb2RlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBMb2NrTW9kZVR5cGUgeyBSRUFELCBXUklURSwgT1BUSU1JU1RJQywgT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQsIFBFU1NJTUlTVElDX1JFQUQsIFBFU1NJTUlTVElDX1dSSVRFLCBQRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQsIE5PTkV9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVBRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1JJVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QVElNSVNUSUMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19SRUFEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19XUklURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWNvbHVtbiIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktdGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06ZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1vbi1kZWxldGUiIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC1mZXRjaCIgdHlwZT0ib3JtOmJhdGNoLWZldGNoIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uY2FjaGVhYmxlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJvcm06cGFydGl0aW9uaW5nLWdyb3VwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvT25lIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4gICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhdGNoLWZldGNoIiB0eXBlPSJvcm06YmF0Y2gtZmV0Y2giIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJub25jYWNoZWFibGUiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpncm91cCByZWY9Im9ybTpwYXJ0aXRpb25pbmctZ3JvdXAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcy1pZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleS1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleUNsYXNzIHsKLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5LWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleUNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OwotICAgICAgICAgIGludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgcHJlY2lzaW9uCi0gICAgICAgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhIG1hcHBlZCBzdXBlcmNsYXNzLiBJcyAKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCi0gICAgICAgIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5IAotICAgICAgICBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBwZWRTdXBlcmNsYXNze30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im11bHRpdGVuYW50IiB0eXBlPSJvcm06bXVsdGl0ZW5hbnQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkZGl0aW9uYWwtY3JpdGVyaWEiIHR5cGU9Im9ybTphZGRpdGlvbmFsLWNyaXRlcmlhIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleSIgdHlwZT0ib3JtOnByaW1hcnkta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlIiB0eXBlPSJvcm06Y2FjaGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlLWludGVyY2VwdG9yIiB0eXBlPSJvcm06Y2FjaGUtaW50ZXJjZXB0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZldGNoLWdyb3VwIiB0eXBlPSJvcm06ZmV0Y2gtZ3JvdXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpncm91cCByZWY9Im9ybTpwYXJ0aXRpb25pbmctZ3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLWZ1bmN0aW9uLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLWZ1bmN0aW9uLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcGxzcWwtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXBsc3FsLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1wbHNxbC1zdG9yZWQtZnVuY3Rpb24tcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1wbHNxbC1zdG9yZWQtZnVuY3Rpb24tcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwbHNxbC1yZWNvcmQiIHR5cGU9Im9ybTpwbHNxbC1yZWNvcmQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwbHNxbC10YWJsZSIgdHlwZT0ib3JtOnBsc3FsLXRhYmxlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeS1yZWRpcmVjdG9ycyIgdHlwZT0ib3JtOnF1ZXJ5LXJlZGlyZWN0b3JzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFyZW50LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYWNoZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtdWx0aXRlbmFudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTXVsdGl0ZW5hbnQgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIG11bHRpLXRlbmFudCBzdHJhdGVneSB0byB1c2UuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE11bHRpdGVuYW50VHlwZSB2YWx1ZSgpIGRlZmF1bHQgTXVsdGl0ZW5hbnRUeXBlLlNJTkdMRV9UQUJMRTsKLSAgICAgICAgfQotIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVuYW50LWRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06dGVuYW50LWRpc2NyaW1pbmF0b3ItY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOm11bHRpdGVuYW50LXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im11bHRpdGVuYW50LXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBNdWx0aXRlbmFudFR5cGUgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBTcGVjaWZpZXMgdGhhdCB0YWJsZShzKSB0aGUgZW50aXR5IG1hcHMgdG8gaW5jbHVkZXMgcm93cyBmb3IgbXVsdGlwbGUgCi0gICAgICAgICAgICAgKiB0ZW5hbnRzLiBUaGUgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uKHMpIGFyZSB1c2VkIHdpdGggYXBwbGljYXRpb24gCi0gICAgICAgICAgICAgKiBjb250ZXh0IHZhbHVlcyB0byBsaW1pdCB3aGF0IGEgcGVyc2lzdGVuY2UgY29udGV4dCBjYW4gYWNjZXNzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTSU5HTEVfVEFCTEUsIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNwZWNpZmllcyB0aGF0IGRpZmZlcmVudCB0YWJsZXMgYXJlIHVzZWQgZm9yIGVhY2ggdGVuYW50LiBUaGUgdGFibGUgc2NhbiAKLSAgICAgICAgICAgICAqIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgbmFtZSwgc2NoZW1hL3RhYmxlc3BhY2UuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFRBQkxFX1BFUl9URU5BTlQsCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogU3BlY2lmaWVzIHRoYXQgdGhlIERCIHdpbGwgaGFuZGxlIHRoZSB0ZW5hbnQgZmlsdGVyaW5nIG9uIGFsbCBTRUxFQ1QsCi0gICAgICAgICAgICAgKiBVUERBVEUgYW5kIERFTEVURSBxdWVyaWVzLiBVc2luZyB0aGlzIHR5cGUgYXNzdW1lcyB0aGF0IHRoZSBwbGF0Zm9ybQotICAgICAgICAgICAgICogdXNlZCB3aXRoIHlvdXIgcGVyc2lzdGVuY2UgdW5pdCBkb2VzIGluZGVlZCBzdXBwb3J0IFZQRC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgVlBECi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJTkdMRV9UQUJMRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEVfUEVSX1RFTkFOVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVlBEIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZE5hdGl2ZVF1ZXJ5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBxdWVyeSgpOwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBDbGFzcyByZXN1bHRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZygpIGRlZmF1bHQgIiI7IC8vbmFtZWQgU3FsUmVzdWx0U2V0TWFwcGluZwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgTG9ja01vZGVUeXBlIGxvY2tNb2RlKCkgZGVmYXVsdCBOT05FOwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NrLW1vZGUiIHR5cGU9Im9ybTpsb2NrLW1vZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIGFsbG93cyB0aGUgZGVmaW5pdGlvbiBvZiAKLSAgICAgICAgICogcXVlcmllcyB0aGF0IGNhbGwgc3RvcmVkIHByb2NlZHVyZXMgYXMgbmFtZWQgcXVlcmllcy4KLSAgICAgICAgICogQSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5IG9yCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MuIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVW5pcXVlIG5hbWUgdGhhdCByZWZlcmVuY2VzIHRoaXMgc3RvcmVkIHByb2NlZHVyZSBxdWVyeS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBRdWVyeSBoaW50cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFJlZmVycyB0byB0aGUgY2xhc3Mgb2YgdGhlIHJlc3VsdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyByZXN1bHRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIFNRTFJlc3VsdE1hcHBpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgbmFtZSBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgcHJvY2VkdXJlTmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBXaGV0aGVyIHRoZSBxdWVyeSBzaG91bGQgcmV0dXJuIGEgcmVzdWx0IHNldC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBib29sZWFuIHJldHVybnNSZXN1bHRTZXQoKSBkZWZhdWx0IHRydWU7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIGlmIHRoZSBzdG9yZWQgcHJvY2VkdXJlIHJldHVybnMgbXVsdGlwbGUgcmVzdWx0IHNldHMuCi0gICAgICAgICAgICogVGhpcyBpcyBvbmx5IHJlbGV2YW50IG9uIGRhdGFiYXNlcyB0aGF0IHN1cHBvcnQgbXVsdGlwbGUgcmVzdWx0IHNldHMgZnJvbSBzdG9yZWQgcHJvY2VkdXJlcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBib29sZWFuIG11bHRpcGxlUmVzdWx0U2V0cygpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIGlmIHRoZSBzdG9yZWQgcHJvY2VkdXJlIHNob3VsZCBiZSBjYWxsZWQgYnkgaW5kZXggb3IgYnkgbmFtZS4KLSAgICAgICAgICAgKiBCeSBpbmRleCByZXF1aXJlcyB0aGF0IHRoZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYXJlIGRlZmluZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHByb2NlZHVyZSBvbiB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICogQnkgbmFtZSByZXF1aXJlcyB0aGUgZGF0YWJhc2UgcGxhdGZvcm0gc3VwcG9ydCBuYW1pbmcgcHJvY2VkdXJlIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBjYWxsQnlJbmRleCgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIGFyZ3VtZW50cyB0byB0aGUgc3RvcmVkIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtZXRlciIgdHlwZT0ib3JtOnN0b3JlZC1wcm9jZWR1cmUtcGFyYW1ldGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByb2NlZHVyZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmV0dXJucy1yZXN1bHQtc2V0IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11bHRpcGxlLXJlc3VsdC1zZXRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhbGwtYnktaW5kZXgiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtc3RvcmVkLWZ1bmN0aW9uLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeSBhbm5vdGF0aW9uIGFsbG93cyB0aGUgZGVmaW5pdGlvbiBvZiAKLSAgICAgICAgICogcXVlcmllcyB0aGF0IGNhbGwgc3RvcmVkIGZ1bmN0aW9uIGFzIG5hbWVkIHF1ZXJpZXMuCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5IGFubm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5IG9yCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MuIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBVbmlxdWUgbmFtZSB0aGF0IHJlZmVyZW5jZXMgdGhpcyBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFF1ZXJ5IGhpbnRzLgotICAgICAgICAgICAqLwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIFNRTFJlc3VsdE1hcHBpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgbmFtZSBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgZnVuY3Rpb25OYW1lKCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIGlmIHRoZSBzdG9yZWQgcHJvY2VkdXJlIHNob3VsZCBiZSBjYWxsZWQgYnkgaW5kZXggb3IgYnkgbmFtZS4KLSAgICAgICAgICAgKiBCeSBpbmRleCByZXF1aXJlcyB0aGF0IHRoZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYXJlIGRlZmluZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHByb2NlZHVyZSBvbiB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICogQnkgbmFtZSByZXF1aXJlcyB0aGUgZGF0YWJhc2UgcGxhdGZvcm0gc3VwcG9ydCBuYW1pbmcgcHJvY2VkdXJlIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBjYWxsQnlJbmRleCgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIGFyZ3VtZW50cyB0byB0aGUgc3RvcmVkIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIERlZmluZXMgcmV0dXJuIG9mIHRoZSBzdG9yZWQgZnVuY3Rpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyW10gcmV0dXJuUGFyYW1ldGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiIHR5cGU9Im9ybTpzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJldHVybi1wYXJhbWV0ZXIiIHR5cGU9Im9ybTpzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciIgbWluT2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZ1bmN0aW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYWxsLWJ5LWluZGV4IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXBsc3FsLXN0b3JlZC1mdW5jdGlvbi1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAvKiogCi0gICAgICAgICAgICAgKiBBIE5hbWVkUExTUUxTdG9yZWRGdW5jdGlvblF1ZXJ5IGFubm90YXRpb24gYWxsb3dzIHRoZSBkZWZpbml0aW9uIG9mIHF1ZXJpZXMgdGhhdCAKLSAgICAgICAgICAgICAqIGNhbGwgUExTUUwgc3RvcmVkIGZ1bmN0aW9ucyBhcyBuYW1lZCBxdWVyaWVzLgotICAgICAgICAgICAgICogVGhlIFBMU1FMIHN1cHBvcnQgYWRkcyBzdXBwb3J0IGZvciBjb21wbGV4IFBMU1FMIHR5cGVzIHN1Y2ggYXMgUkVDT1JEIGFuZCBUQUJMRSB0eXBlcywKLSAgICAgICAgICAgICAqIHRoYXQgYXJlIG5vdCBhY2Nlc3NpYmxlIGZyb20gSkRCQy4KLSAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICogQSBOYW1lZFBMU1FMU3RvcmVkRnVuY3Rpb25RdWVyeSBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvcgotICAgICAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcy4KLSAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4zCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkUExTUUxTdG9yZWRGdW5jdGlvblF1ZXJ5IHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoUmVxdWlyZWQpIFVuaXF1ZSBuYW1lIHRoYXQgcmVmZXJlbmNlcyB0aGlzIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIChPcHRpb25hbCkgUXVlcnkgaGludHMuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgU1FMUmVzdWx0TWFwcGluZy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZyBmdW5jdGlvbk5hbWUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgUExTUUxQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoUmVxdWlyZWQpIERlZmluZXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgc3RvcmVkIGZ1bmN0aW9uLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFBMU1FMUGFyYW1ldGVyIHJldHVyblBhcmFtZXRlcigpOwotICAgICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtZXRlciIgdHlwZT0ib3JtOnBsc3FsLXBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJldHVybi1wYXJhbWV0ZXIiIHR5cGU9Im9ybTpwbHNxbC1wYXJhbWV0ZXIiIG1pbk9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmdW5jdGlvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+ICAgIAotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtcGxzcWwtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAvKiogCi0gICAgICAgICAgICAgKiBBIFBMU1FMTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIGFsbG93cyB0aGUgZGVmaW5pdGlvbiBvZiBxdWVyaWVzIHRoYXQgCi0gICAgICAgICAgICAgKiBjYWxsIFBMU1FMIHN0b3JlZCBwcm9jZWR1cmVzIGFzIG5hbWVkIHF1ZXJpZXMuCi0gICAgICAgICAgICAgKiBUaGUgUExTUUwgc3VwcG9ydCBhZGRzIHN1cHBvcnQgZm9yIGNvbXBsZXggUExTUUwgdHlwZXMgc3VjaCBhcyBSRUNPUkQgYW5kIFRBQkxFIHR5cGVzLAotICAgICAgICAgICAgICogdGhhdCBhcmUgbm90IGFjY2Vzc2libGUgZnJvbSBKREJDLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBBIFBMU1FMTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvcgotICAgICAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcy4KLSAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4zCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkUExTUUxTdG9yZWRQcm9jZWR1cmVRdWVyeSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogKFJlcXVpcmVkKSBVbmlxdWUgbmFtZSB0aGF0IHJlZmVyZW5jZXMgdGhpcyBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFF1ZXJ5IGhpbnRzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIChPcHRpb25hbCkgUmVmZXJzIHRvIHRoZSBjbGFzcyBvZiB0aGUgcmVzdWx0LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgU1FMUmVzdWx0TWFwcGluZy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZyBwcm9jZWR1cmVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFBMU1FMUGFyYW1ldGVyW10gcGFyYW1ldGVycygpIGRlZmF1bHQge307Ci0gICAgICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyIiB0eXBlPSJvcm06cGxzcWwtcGFyYW1ldGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByb2NlZHVyZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1yZWNvcmQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgUExTUUxSZWNvcmQgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIGRlZmluZSBhIGRhdGFiYXNlIFBMU1FMIFJFQ09SRCB0eXBlLgotICAgICAgICAgKiBUaGlzIHR5cGUgY2FuIGJlIHVzZWQgd2l0aGluIFBMU1FMIHByb2NlZHVyZSBjYWxscy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgTmFtZWRQTFNRTFN0b3JlZFByb2NlZHVyZVF1ZXJ5Ci0gICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4zCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQTFNRTFJlY29yZCB7Ci0gICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBuYW1lIG9mIHRoZSByZWNvcmQgdHlwZSBpbiB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZSBPQkpFQ1QgVFlQRSB0aGF0IG1pcnJvcnMgdGhlIHJlY29yZCdzIHN0cnVjdHVyZS4KLSAgICAgICAgICAgICAqIFRoZSByZWNvcmQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8vZnJvbSB0aGlzIHR5cGUgc28gaXQgY2FuIGJlIHBhc3NlZCB0aHJvdWdoIEpEQkMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyBjb21wYXRpYmxlVHlwZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIEphdmEgY2xhc3MgdG8gbWFwIHRoZSBvYmplY3QtdHlwZSB0by4KLSAgICAgICAgICAgICAqIFRoaXMgY2xhc3MgbXVzdCBiZSBtYXBwZWQgdXNpbmcgYSBAU3RydWN0IGFubm90YXRpb24uCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIENsYXNzIGphdmFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChSZXF1aXJlZCkgRGVmaW5lcyB0aGUgZmllbGRzIGluIHRoZSByZWNvcmQgdHlwZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgUExTUUxQYXJhbWV0ZXJbXSBmaWVsZHMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0ib3JtOnBsc3FsLXBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb21wYXRpYmxlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIFBMU1FMUmVjb3JkIGFubm90YXRpb24gaXMgdXNlZCB0byBkZWZpbmUgYSBkYXRhYmFzZSBQTFNRTCBSRUNPUkQgdHlwZS4KLSAgICAgICAgICogVGhpcyB0eXBlIGNhbiBiZSB1c2VkIHdpdGhpbiBQTFNRTCBwcm9jZWR1cmUgY2FsbHMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIE5hbWVkUExTUUxTdG9yZWRQcm9jZWR1cmVRdWVyeQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMwotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUExTUUxSZWNvcmQgewotICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgbmFtZSBvZiB0aGUgcmVjb3JkIHR5cGUgaW4gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgbmFtZSBvZiB0aGUgZGF0YWJhc2UgT0JKRUNUIFRZUEUgdGhhdCBtaXJyb3JzIHRoZSByZWNvcmQncyBzdHJ1Y3R1cmUuCi0gICAgICAgICAgICAgKiBUaGUgcmVjb3JkIHdpbGwgYmUgY29udmVydGVkIHRvL2Zyb20gdGhpcyB0eXBlIHNvIGl0IGNhbiBiZSBwYXNzZWQgdGhyb3VnaCBKREJDLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgY29tcGF0aWJsZVR5cGUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBKYXZhIGNsYXNzIHRvIG1hcCB0aGUgb2JqZWN0LXR5cGUgdG8uCi0gICAgICAgICAgICAgKiBUaGlzIGNsYXNzIG11c3QgYmUgbWFwcGVkIHVzaW5nIGEgQFN0cnVjdCBhbm5vdGF0aW9uLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBDbGFzcyBqYXZhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoUmVxdWlyZWQpIERlZmluZXMgdGhlIGZpZWxkcyBpbiB0aGUgcmVjb3JkIHR5cGUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFBMU1FMUGFyYW1ldGVyW10gZmllbGRzKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb21wYXRpYmxlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuZXN0ZWQtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9iamVjdFR5cGVDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZQotICAgICAgICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICAgICAgKiBmaWVsZCBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IAotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIGNvbnZlcnNpb24gdmFsdWVzIHRvIGJlIHVzZWQgCi0gICAgICAgICAgICogd2l0aCB0aGUgb2JqZWN0IGNvbnZlcnRlci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJzaW9uVmFsdWVbXSBjb252ZXJzaW9uVmFsdWVzKCk7Ci0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSBhIGRlZmF1bHQgb2JqZWN0IHZhbHVlLiBVc2VkIGZvciAKLSAgICAgICAgICAgICogbGVnYWN5IGRhdGEgaWYgdGhlIGRhdGEgdmFsdWUgaXMgbWlzc2luZy4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgIFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIiB0eXBlPSJvcm06Y29udmVyc2lvbi12YWx1ZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtb2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW1hbnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb01hbnkgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jbGFzcyIgdHlwZT0ib3JtOm1hcC1rZXktY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06dGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1lbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTplbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgPC94c2Q6Y2hvaWNlPgotICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW9uLWRlbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhdGNoLWZldGNoIiB0eXBlPSJvcm06YmF0Y2gtZmV0Y2giIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uY2FjaGVhYmxlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJvcm06cGFydGl0aW9uaW5nLWdyb3VwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9ycGhhbi1yZW1vdmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBvcnBoYW5SZW1vdmFsKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1vbi1kZWxldGUiIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC1mZXRjaCIgdHlwZT0ib3JtOmJhdGNoLWZldGNoIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uY2FjaGVhYmxlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJvcm06cGFydGl0aW9uaW5nLWdyb3VwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9ycGhhbi1yZW1vdmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHMtaWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAqIG9wdGltaXN0aWMgbG9ja2luZyBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgCi0gICAgICAgICAqIGVudGl0aWVzLiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24KLSAgICAgICAgICogYW4gZW50aXR5IG9yIG1hcHBlZC1zdXBlcmNsYXNzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSXQgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBvcHRpbWlzdGljLWxvY2tpbmctdHlwZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcHRpbWlzdGljTG9ja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHRvIHVzZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPcHRpbWlzdGljTG9ja2luZ1R5cGUgdHlwZSgpIGRlZmF1bHQgVkVSU0lPTl9DT0xVTU47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IG9mIHR5cGUgCi0gICAgICAgICAgICogU0VMRUNURURfQ09MVU1OUywgdGhpcyBhbm5vdGF0aW9uIG1lbWJlciBiZWNvbWVzIGEgKFJlcXVpcmVkKSAKLSAgICAgICAgICAgKiBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBzZWxlY3RlZENvbHVtbnMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHdoZXJlIHRoZSBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHNob3VsZCAKLSAgICAgICAgICAgKiBjYXNjYWRlIGxvY2suIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB3aXRoIFZFUlNJT05fQ09MVU1OIGxvY2tpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBjYXNjYWRlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWxlY3RlZC1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FzY2FkZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmctdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBzaW1wbGUgdHlwZSB0aGF0IGlzIHVzZWQgd2l0aGluIGFuIG9wdGltaXN0aWMtbG9ja2luZyAKLSAgICAgICAgICogc3BlY2lmaWNhdGlvbiB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIG9wdGltaXN0aWMtbG9ja2luZyB0aGF0Ci0gICAgICAgICAqIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyBlbnRpdGllcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIE9wdGltaXN0aWNMb2NraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGV2ZXJ5IGZpZWxkIGluIHRoZSB0YWJsZQotICAgICAgICAgICAqIGluIHRoZSBXSEVSRSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUgb3IgYSBkZWxldGUuIElmIGFueSBmaWVsZAotICAgICAgICAgICAqIGhhcyBiZWVuIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgQUxMX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgb25seSB0aGUgY2hhbmdlZCBmaWVsZHMKLSAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBBIGRlbGV0ZQotICAgICAgICAgICAqIHdpbGwgb25seSBjb21wYXJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDSEFOR0VEX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBjb21wYXJlcyBzZWxlY3RlZCBmaWVsZHMgaW4gdGhlIFdIRVJFCi0gICAgICAgICAgICogY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBOb3RlIHRoYXQKLSAgICAgICAgICAgKiB0aGUgZmllbGRzIHNwZWNpZmllZCBtdXN0IGJlIG1hcHBlZCBhbmQgbm90IGJlIHByaW1hcnkga2V5cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRUxFQ1RFRF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGEgc2luZ2xlIHZlcnNpb24gbnVtYmVyCi0gICAgICAgICAgICogaW4gdGhlIHdoZXJlIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gVGhlIHZlcnNpb24gZmllbGQgbXVzdCBiZQotICAgICAgICAgICAqIG1hcHBlZCBhbmQgbm90IGJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBWRVJTSU9OX0NPTFVNTgotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMTF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFOR0VEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTEVDVEVEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZFUlNJT05fQ09MVU1OIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+ICAKLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJCeSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3JkZXItY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb3JyZWN0aW9uLXR5cGUiIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4tY29ycmVjdGlvbi10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3JkZXItY29sdW1uLWNvcnJlY3Rpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIE9yZGVyQ29ycmVjdGlvblR5cGUgewotICAgICAgICAgIFJFQUQsCi0gICAgICAgICAgUkVBRF9XUklURSwKLSAgICAgICAgICBFWENFUFRJT04KLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVBRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVBRF9XUklURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVhDRVBUSU9OIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1sb2FkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0TG9hZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RSZW1vdmUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtdXBkYXRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0VXBkYXRlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcGVyc2lzdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXJlbW92ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtdXBkYXRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBUaGUgUHJpbWFyeUtleSBhbm5vdGF0aW9uIGFsbG93cyBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9mIHRoZSBJZC4KLSAgICAgICAgICogIEEgdmFsaWRhdGlvbiBwb2xpY3kgY2FuIGJlIGdpdmVuIHRoYXQgYWxsb3dzIHNwZWNpZnlpbmcgaWYgemVybyBpcyBhIHZhbGlkIGlkIHZhbHVlLgotICAgICAgICAgKiAgVGhlIHNldCBvZiBwcmltYXJ5IGtleSBjb2x1bW5zIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBwcmVjaXNlbHkuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMQotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJpbWFyeUtleSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgaWQgdmFsaWRhdGlvbiBpcyBkb25lLgotICAgICAgICAgICAqIEJ5IGRlZmF1bHQgMCBpcyBub3QgYSB2YWxpZCBpZCB2YWx1ZSwgdGhpcyBjYW4gYmUgdXNlZCB0byBhbGxvdyAwIGlkIHZhbHVlcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJZFZhbGlkYXRpb24gdmFsaWRhdGlvbigpIGRlZmF1bHQgSWRWYWxpZGF0aW9uLlpFUk87IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgY2FjaGUga2V5IHR5cGUgaXMgdXNlZCB0byBzdG9yZSB0aGUgb2JqZWN0IGluIHRoZSBjYWNoZS4KLSAgICAgICAgICAgKiBCeSBkZWZhdWx0IHRoZSB0eXBlIGlzIGRldGVybWluZWQgYnkgd2hhdCB0eXBlIGlzIG9wdGltYWwgZm9yIHRoZSBjbGFzcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDYWNoZUtleVR5cGUgY2FjaGVLZXlUeXBlKCkgZGVmYXVsdCBDYWNoZUtleVR5cGUuQVVUTzsKLSAgICAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVzZWQgdG8gc3BlY2lmeSB0aGUgcHJpbWFyeSBrZXkgY29sdW1ucyBkaXJlY3RseS4KLSAgICAgICAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgQElkIGlmIHRoZSBwcmltYXJ5IGtleSBpbmNsdWRlcyBhIG5vbiBiYXNpYyBmaWVsZCwKLSAgICAgICAgICAgKiBzdWNoIGFzIGEgZm9yZWlnbiBrZXksIG9yIGEgaW5oZXJpdGFuY2UgZGlzY3JpbWluYXRvciwgZW1iZWRkZWQsIG9yIHRyYW5zZm9ybWF0aW9uIG1hcHBlZCBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWxpZGF0aW9uIiB0eXBlPSJvcm06aWQtdmFsaWRhdGlvbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlLWtleS10eXBlIiB0eXBlPSJvcm06Y2FjaGUta2V5LXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3BlcnR5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQSB1c2VyIGRlZmluZWQgbWFwcGluZydzIHByb3BlcnR5LgotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcm9wZXJ0eSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogUHJvcGVydHkgbmFtZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBQcm9wZXJ0eSB2YWx1ZSwKLSAgICAgICAgICAgKiBjb252ZXJ0ZWQgdG8gYW4gaW5zdGFuY2Ugb2YgdmFsdWVUeXBlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFByb3BlcnR5IHZhbHVlIHR5cGUuCi0gICAgICAgICAgICogVGhlIHZhbHVlIGNvbnZlcnRlZCB0byB2YWx1ZVR5cGUgYnkgQ29udmVyc2lvbk1hbmFnZXIuCi0gICAgICAgICAgICogSWYgc3BlY2lmaWVkIG11c3QgYmUgYSBzaW1wbGUgdHlwZSB0aGF0IGNvdWxkIGJlIGhhbmRsZWQgYnkgCi0gICAgICAgICAgICogQ29udmVyc2lvbk1hbmFnZXI6IAotICAgICAgICAgICAqIG51bWVyaWNhbCwgYm9vbGVhbiwgdGVtcG9yYWwuICAKLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2xhc3MgdmFsdWVUeXBlKCkgZGVmYXVsdCBTdHJpbmcuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktaGludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkgCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFF1ZXJ5SGludCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LXJlZGlyZWN0b3JzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUXVlcnlSZWRpcmVjdG9ycyB7Ci0gICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRoaXMgQWxsUXVlcmllcyBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nIG9iamVjdCBxdWVyeQotICAgICAgICAgICAgICogdGhhdCBkb2VzIG5vdCBoYXZlIGEgbW9yZSBwcmVjaXNlIHJlZGlyZWN0b3IgKGxpa2UgdGhlIAotICAgICAgICAgICAgICogUmVhZE9iamVjdFF1ZXJ5IFJlZGlyZWN0b3IpIG9yIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAgICAgICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICAgICAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBDbGFzcyBhbGxRdWVyaWVzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBBIERlZmF1bHQgUmVhZEFsbCBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICAgICAgICAgKiBSZWFkQWxsUXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAgICAgICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICAgICAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgICAgICAgICAqIEZvciB1c2VycyBleGVjdXRpbmcgYSBKUEEgUXVlcnkgdGhyb3VnaCB0aGUgZ2V0UmVzdWx0TGlzdCgpIEFQSSB0aGlzIGlzIHRoZSByZWRpcmVjdG9yIHRoYXQgd2lsbCBiZSBpbnZva2VkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIENsYXNzIHJlYWRBbGwoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEEgRGVmYXVsdCBSZWFkT2JqZWN0IFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgICAgICAgICAqIFJlYWRPYmplY3RRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICAgICAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgICAgICAgICAqIGl0IG9yIGFsdGVybmF0ZWx5IHBlcmZvcm1pbmcgc29tZSBzaWRlIGVmZmVjdCBsaWtlIGF1ZGl0aW5nLgotICAgICAgICAgICAgICogRm9yIHVzZXJzIGV4ZWN1dGluZyBhIEpQQSBRdWVyeSB0aHJvdWdoIHRoZSBnZXRTaW5nbGVSZXN1bHQoKSBBUEkgb3IgRW50aXR5TWFuYWdlci5maW5kKCkgdGhpcyBpcyB0aGUgcmVkaXJlY3RvciB0aGF0IHdpbGwgYmUgaW52b2tlZAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBDbGFzcyByZWFkT2JqZWN0KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBBIERlZmF1bHQgUmVwb3J0UXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAgICAgICAgICogUmVwb3J0UXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAgICAgICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICAgICAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgICAgICAgICAqIEZvciB1c2VycyBleGVjdXRpbmcgYSBKUEEgUXVlcnkgdGhhdCBjb250YWlucyBhZ3JlZ2F0ZSBmdW5jdGlvbnMgb3Igc2VsZWN0cyBtdWx0aXBsZSBlbnRpdGllcyB0aGlzIGlzIHRoZSByZWRpcmVjdG9yIHRoYXQgd2lsbCBiZSBpbnZva2VkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIENsYXNzIHJlcG9ydCgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQSBEZWZhdWx0IFVwZGF0ZSBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICAgICAgICAgKiBVcGRhdGVPYmplY3RRdWVyeSBvciBVcGRhdGVBbGxRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICAgICAgICAgKiBJbiBFY2xpcHNlTGluayBhbiBVcGRhdGVPYmplY3RRdWVyeSBpcyBleGVjdXRlZCB3aGVuZXZlciBmbHVzaGluZyBjaGFuZ2VzIHRvIHRoZSBkYXRhc291cmNlLgotICAgICAgICAgICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICAgICAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIENsYXNzIHVwZGF0ZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQSBEZWZhdWx0IEluc2VydCBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICAgICAgICAgKiBJbnNlcnRPYmplY3RRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICAgICAgICAgKiBJbiBFY2xpcHNlTGluayBhbiBJbnNlcnRPYmplY3RRdWVyeSBpcyBleGVjdXRlZCB3aGVuIHBlcnNpc3RpbmcgYW4gb2JqZWN0IHRvIHRoZSBkYXRhc291cmNlLgotICAgICAgICAgICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICAgICAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ2xhc3MgaW5zZXJ0KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBBIERlZmF1bHQgRGVsZXRlIE9iamVjdCBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICAgICAgICAgKiBEZWxldGVPYmplY3RRdWVyeSBvciBEZWxldGVBbGxRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICAgICAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgICAgICAgICAqIGl0IG9yIGFsdGVybmF0ZWx5IHBlcmZvcm1pbmcgc29tZSBzaWRlIGVmZmVjdCBsaWtlIGF1ZGl0aW5nLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBDbGFzcyBkZWxldGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsLXF1ZXJpZXMiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLWFsbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtb2JqZWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVwb3J0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGVsZXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtdHJhbnNmb3JtZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyB3cml0ZS1vbmx5LCBpdCBzaG91bGQgaGF2ZSBhIAotICAgICAgICAgKiBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgY29sdW1uKHMpIAotICAgICAgICAgKiB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotICAgICAgICAgKgotICAgICAgICAgKiBBbHNvIHVubGVzcyBpdCdzIGEgcmVhZC1vbmx5IG1hcHBpbmcsIGVpdGhlciBXcml0ZVRyYW5zZm9ybWVyIAotICAgICAgICAgKiBhbm5vdGF0aW9uIG9yIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24gc2hvdWxkIGJlIHNwZWNpZmllZC4gRWFjaCAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKLSAgICAgICAgICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIpLgotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUmVhZFRyYW5zZm9ybWVyIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXNlci1kZWZpbmVkIGNsYXNzIHRoYXQgbXVzdCBpbXBsZW1lbnQgdGhlIAotICAgICAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MudHJhbnNmb3JtZXJzLkF0dHJpYnV0ZVRyYW5zZm9ybWVyIAotICAgICAgICAgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyAKLSAgICAgICAgICAgICAqIGJ1aWxkQXR0cmlidXRlVmFsdWUgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFsdWUgdG8gYmUgCi0gICAgICAgICAgICAgKiBhc3NpZ25lZCB0byB0aGUgYXR0cmlidXRlLgotICAgICAgICAgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBDbGFzcyB0cmFuc2Zvcm1lckNsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRoZSBtYXBwZWQgY2xhc3MgbXVzdCBoYXZlIGEgbWV0aG9kIHdpdGggdGhpcyBuYW1lIHdoaWNoIHJldHVybnMgCi0gICAgICAgICAgICAgKiBhIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSBhdHRyaWJ1dGUgKG5vdCBhc3NpZ25zIHRoZSB2YWx1ZSB0byAKLSAgICAgICAgICAgICAqIHRoZSBhdHRyaWJ1dGUpLiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSAKLSAgICAgICAgICAgICAqIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZCgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJldHVybi1pbnNlcnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSZXR1cm5JbnNlcnQgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBBIFJldHVybkluc2VydCBhbm5vdGF0aW9uIGFsbG93cyBmb3IgSU5TRVJUIG9wZXJhdGlvbnMgdG8gcmV0dXJuIAotICAgICAgICAgICAgICogdmFsdWVzIGJhY2sgaW50byB0aGUgb2JqZWN0IGJlaW5nIHdyaXR0ZW4uIFRoaXMgYWxsb3dzIGZvciB0YWJsZSAKLSAgICAgICAgICAgICAqIGRlZmF1bHQgdmFsdWVzLCB0cmlnZ2VyIG9yIHN0b3JlZCBwcm9jZWR1cmVzIGNvbXB1dGVkIHZhbHVlcyB0byAKLSAgICAgICAgICAgICAqIGJlIHNldCBiYWNrIGludG8gdGhlIG9iamVjdC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYm9vbGVhbiByZXR1cm5Pbmx5KCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmV0dXJuLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2Vjb25kYXJ5VGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcGtKb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY3JlYXRpb24tc3VmZml4IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZXF1ZW5jZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgc2VxdWVuY2VOYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMTsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VxdWVuY2UtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTcWxSZXN1bHRTZXRNYXBwaW5nIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIEVudGl0eVJlc3VsdFtdIGVudGl0aWVzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBDb2x1bW5SZXN1bHRbXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LXJlc3VsdCIgdHlwZT0ib3JtOmVudGl0eS1yZXN1bHQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tcmVzdWx0IiB0eXBlPSJvcm06Y29sdW1uLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RvcmVkLXByb2NlZHVyZS1wYXJhbWV0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIGFubm90YXRpb24gaXMgdXNlZCB3aXRoaW4gYSAKLSAgICAgICAgICogTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHt9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgZGlyZWN0aW9uIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlIHBhcmFtZXRlci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBEaXJlY3Rpb24gZGlyZWN0aW9uKCkgZGVmYXVsdCBJTjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3RvcmVkIHByb2NlZHVyZSBwYXJhbWV0ZXIgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBxdWVyeSBwYXJhbWV0ZXIgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgcXVlcnlQYXJhbWV0ZXIoKTsKLSAgICAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZSBpZiB0aGUgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLCBvciBvcHRpb25hbCBhbmQgZGVmYXVsdGVkIGJ5IHRoZSBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgZmFsc2U7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIEphdmEgY2xhc3MgZGVzaXJlZCBiYWNrIGZyb20gdGhlIHByb2NlZHVyZSwgCi0gICAgICAgICAgICogdGhpcyBpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgcHJvY2VkdXJlLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBKREJDIHR5cGUgY29kZSwgdGhpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgCi0gICAgICAgICAgICogZnJvbSB0aGUgcHJvY2VkdXJlLgotICAgICAgICAgICAqLwotICAgICAgICAgIGludCBqZGJjVHlwZSgpIGRlZmF1bHQgLTE7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBKREJDIHR5cGUgbmFtZSwgdGhpcyBtYXkgYmUgcmVxdWlyZWQgZm9yIEFSUkFZIG9yIAotICAgICAgICAgICAqIFNUUlVDVCB0eXBlcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgamRiY1R5cGVOYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlyZWN0aW9uIiB0eXBlPSJvcm06ZGlyZWN0aW9uLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icXVlcnktcGFyYW1ldGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImpkYmMtdHlwZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1wYXJhbWV0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgLyoqIAotICAgICAgICAgICAgICogQSBQTFNRTFBhcmFtZXRlciBhbm5vdGF0aW9uIGlzIHVzZWQgd2l0aGluIGEgCi0gICAgICAgICAgICAgKiBOYW1lZFBMU1FMU3RvcmVkUHJvY2VkdXJlUXVlcnkgb3IgUExTUUxSZWNvcmQgYW5ub3RhdGlvbi4KLSAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICogQHNlZSBOYW1lZFBMU1FMU3RvcmVkUHJvY2VkdXJlUXVlcnkKLSAgICAgICAgICAgICAqIEBzZWUgUExTUUxSZWNvcmQKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMwotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBMU1FMUGFyYW1ldGVyIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIERpcmVjdGlvbiBkaXJlY3Rpb24oKSBkZWZhdWx0IElOOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogKFJlcXVpcmVkKSBTdG9yZWQgcHJvY2VkdXJlIHBhcmFtZXRlciBuYW1lLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHF1ZXJ5IHBhcmFtZXRlciBuYW1lLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZyBxdWVyeVBhcmFtZXRlcigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lIGlmIHRoZSBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQsIG9yIG9wdGlvbmFsIGFuZCBkZWZhdWx0ZWQgYnkgdGhlIHByb2NlZHVyZS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkYXRhYmFzZSBkYXRhLXR5cGUgZm9yIHRoZSBwYXJhbXRlci4KLSAgICAgICAgICAgICAgICAgKiBUaGlzIGVpdGhlciBvbmUgb2YgdGhlIHR5cGUgY29uc3RhbnRzIGRlZmluZWQgaW4gT3JhY2xlUExTUUxUeXBlcywgb3IgSkRCQ1R5cGVzLAotICAgICAgICAgICAgICAgICAqIG9yIGEgY3VzdG9tIHJlY29yZCBvciB0YWJsZSB0eXBlIG5hbWUuCi0gICAgICAgICAgICAgICAgICogQHNlZSBQTFNRTFJlY29yZAotICAgICAgICAgICAgICAgICAqIEBzZWUgT3JhY2xlUExTUUxUeXBlcwotICAgICAgICAgICAgICAgICAqIEBzZWUgSkRCQ1R5cGVzCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgU3RyaW5nIGRhdGFiYXNlVHlwZSgpIGRlZmF1bHQgIlZBUkNIQVIiOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG1heCBsZW5ndGggb2YgdGhlIGZpZWxkIHZhbHVlLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoT3B0aW9uYWwpIElmIGEgbnVtZXJpYywgdGhlIG1heCBzY2FsZSB2YWx1ZS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpbnQgc2NhbGUoKSBkZWZhdWx0IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoT3B0aW9uYWwpIElmIGEgbnVtZXJpYywgdGhlIG1heCBwcmVjaXNpb24gdmFsdWUuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0ib3JtOmRpcmVjdGlvbi10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InF1ZXJ5LXBhcmFtZXRlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGFiYXNlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTdHJ1Y3RDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgCi0gICAgICAgICAgICogdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNvbnZlcnRlciBjbGFzcyB0byBiZSB1c2VkLiBUaGlzIGNsYXNzIG11c3QgCi0gICAgICAgICAgICogaW1wbGVtZW50IHRoZSBFY2xpcHNlTGluayBpbnRlcmZhY2UgCi0gICAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuY29udmVydGVycy5Db252ZXJ0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgY29udmVydGVyKCk7IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RydWN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBTdHJ1Y3QgdHlwZXMgYXJlIGV4dGVuZGVkIG9iamVjdC1yZWxhdGlvbmFsIGRhdGEtdHlwZXMgc3VwcG9ydGVkIGJ5IHNvbWUgZGF0YWJhc2VzLgotICAgICAgICAgKiBTdHJ1Y3QgdHlwZXMgYXJlIHVzZXIgZGVmaW5lIHR5cGVzIGluIHRoZSBkYXRhYmFzZSBzdWNoIGFzIE9CSkVDVCB0eXBlcyBvbiBPcmFjbGUuCi0gICAgICAgICAqIFN0cnVjdHMgY2FuIG5vcm1hbGx5IGNvbnRhaW5zIEFycmF5cyAoVkFSUkFZKSBvciBvdGhlciBTdHJ1Y3QgdHlwZXMsIGFuZCBjYW4gYmUgc3RvcmVkIGluCi0gICAgICAgICAqIGEgY29sdW1uIG9yIGEgdGFibGUuCi0gICAgICAgICAqIFRoaXMgYW5ub3RhdGlvbiBkZWZpbmUgYSBjbGFzcyB0byBtYXAgdG8gYSBkYXRhYmFzZSBTdHJ1Y3QgdHlwZS4KLSAgICAgICAgICogVGhlIGNsYXNzIHNob3VsZCBub3JtYWxseSBiZSBhbiBFbWJlZGRhYmxlLCBidXQgY291bGQgYWxzbyBiZSBhbiBFbnRpdHkgaWYgc3RvcmVkIGluIGEgb2JqZWN0IHRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5zdHJ1Y3R1cmVzLk9iamVjdFJlbGF0aW9uYWxEYXRhVHlwZURlc2NyaXB0b3IKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5zdHJ1Y3R1cmVzLlN0cnVjdHVyZU1hcHBpbmcKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjMKLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0cnVjdCB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGRhdGFiYXNlIG5hbWUgb2YgdGhlIGRhdGFiYXNlIHN0cnVjdHVyZSB0eXBlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHRoZSBvcmRlciBvZiB0aGUgZmllbGRzIGNvbnRhaW5lZCBpbiB0aGUgZGF0YWJhc2Ugc3RydWN0dXJlIHR5cGUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZ1tdIGZpZWxkcygpIGRlZmF1bHQge307IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdHJ1Y3R1cmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFN0cnVjdCB0eXBlcyBhcmUgZXh0ZW5kZWQgb2JqZWN0LXJlbGF0aW9uYWwgZGF0YS10eXBlcyBzdXBwb3J0ZWQgYnkgc29tZSBkYXRhYmFzZXMuCi0gICAgICAgICAqIFN0cnVjdCB0eXBlcyBhcmUgdXNlciBkZWZpbmUgdHlwZXMgaW4gdGhlIGRhdGFiYXNlIHN1Y2ggYXMgT0JKRUNUIHR5cGVzIG9uIE9yYWNsZS4KLSAgICAgICAgICogU3RydWN0cyBjYW4gbm9ybWFsbHkgY29udGFpbnMgQXJyYXlzIChWQVJSQVkpIG9yIG90aGVyIFN0cnVjdCB0eXBlcywgYW5kIGNhbiBiZSBzdG9yZWQgaW4KLSAgICAgICAgICogYSBjb2x1bW4gb3IgYSB0YWJsZS4KLSAgICAgICAgICogVGhpcyBhbm5vdGF0aW9uIGNhbiBiZSBkZWZpbmVkIG9uIGEgZmllbGQvbWV0aG9kIHRvIGRlZmluZSBhbiBTdHJ1Y3R1cmVNYXBwaW5nIHRvIGFuIGVtYmVkZGVkIFN0cnVjdCB0eXBlLgotICAgICAgICAgKiBUaGUgdGFyZ2V0IEVtYmVkZGFibGUgbXVzdCBiZSBtYXBwZWQgdXNpbmcgdGhlIFN0cnVjdCBhbm5vdGF0aW9uLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBTdHJ1Y3QKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5zdHJ1Y3R1cmVzLk9iamVjdFJlbGF0aW9uYWxEYXRhVHlwZURlc2NyaXB0b3IKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5zdHJ1Y3R1cmVzLlN0cnVjdHVyZU1hcHBpbmcKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjMKLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0cnVjdHVyZSB7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjcmVhdGlvbi1zdWZmaXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5kZXgiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFsbG93IGEgZGF0YWJhc2UgSU5ERVggdG8gYmUgZGVmaW5lIHdoZW4gZ2VuZXJhdGluZyBEREwuCi0gICAgICAgICAqIFRoZSBASW5kZXggY2FuIGJlIGRlZmluZWQgb24gYSBFbnRpdHkgY2xhc3MsIG9yIG9uIGFuIGF0dHJpYnV0ZS4KLSAgICAgICAgICogVGhlIGNvbHVtbiBpcyBkZWZhdWx0ZWQgd2hlbiBkZWZpbmVkIG9uIGEgYXR0cmlidXRlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmRleCB7Ci0gICAgICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIElOREVYLCBkZWZhdWx0cyB0byBJTkRFWF8odGFibGUtbmFtZSkgKi8KLSAgICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgc2NoZW1hIG9mIHRoZSBJTkRFWCAqLwotICAgICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgY2F0YWxvZyBvZiB0aGUgSU5ERVggKi8KLSAgICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqIFRoZSB0YWJsZSB0byBkZWZpbmUgdGhlIGluZGV4IG9uLCBkZWZhdWx0cyB0byBlbnRpdGllcyBwcmltYXJ5IHRhYmxlLiAqLwotICAgICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNwZWNpZnkgdGhlIHNldCBvZiBjb2x1bW5zIHRvIGRlZmluZSB0aGUgaW5kZXggb24uCi0gICAgICAgICAgICAgKiBOb3QgcmVxdWlyZWQgd2hlbiBhbm5vdGF0ZWQgb24gYSBmaWVsZC9tZXRob2QuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLWdlbmVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlR2VuZXJhdG9yIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBwa0NvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB2YWx1ZUNvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBwa0NvbHVtblZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAwOwotICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjcmVhdGlvbi1zdWZmaXgiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJway1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGVtcG9yYWwgewotICAgICAgICAgIFRlbXBvcmFsVHlwZSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9Im9ybTp0ZW1wb3JhbC10eXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gVGVtcG9yYWxUeXBlIHsKLSAgICAgICAgICBEQVRFLCAvLyBqYXZhLnNxbC5EYXRlCi0gICAgICAgICAgVElNRSwgLy8gamF2YS5zcWwuVGltZQotICAgICAgICAgIFRJTUVTVEFNUCAvLyBqYXZhLnNxbC5UaW1lc3RhbXAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRBVEUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElNRSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FU1RBTVAiLz4KLSAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0ZW5hbnQtZGlzY3JpbWluYXRvci1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgQFRhcmdldCh7fSkgCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbiB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgY29sdW1uIHRvIGJlIHVzZWQgZm9yIHRoZSB0ZW5hbnQgZGlzY3JpbWluYXRvci4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICJURU5BTlRfSUQiOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgcHJvcGVydHkgdG8gYXBwbHkgdG8gdGhlIAotICAgICAgICAgICAgICogdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgY29udGV4dFByb3BlcnR5KCkgZGVmYXVsdCAiZWNsaXBzZWxpbmsudGVuYW50LWlkIjsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIG9iamVjdC9jb2x1bW4gdG8gdXNlIGFzIGEgY2xhc3MgZGlzY3JpbWluYXRvci4KLSAgICAgICAgICAgICAqIERlZmF1bHRzIHRvIHtAbGluayBEaXNjcmltaW5hdG9yVHlwZSNTVFJJTkcgRGlzY3JpbWluYXRvclR5cGUuU1RSSU5HfS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUoKSBkZWZhdWx0IERpc2NyaW1pbmF0b3JUeXBlLlNUUklORzsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBTUUwgZnJhZ21lbnQgdGhhdCBpcyB1c2VkIHdoZW4gZ2VuZXJhdGluZyB0aGUgRERMCi0gICAgICAgICAgICAgKiBmb3IgdGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uLgotICAgICAgICAgICAgICogRGVmYXVsdHMgdG8gdGhlIHByb3ZpZGVyLWdlbmVyYXRlZCBTUUwgdG8gY3JlYXRlIGEgY29sdW1uCi0gICAgICAgICAgICAgKiBvZiB0aGUgc3BlY2lmaWVkIGRpc2NyaW1pbmF0b3IgdHlwZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNvbHVtbiBsZW5ndGggZm9yIFN0cmluZy1iYXNlZCBkaXNjcmltaW5hdG9yIHR5cGVzLgotICAgICAgICAgICAgICogSWdub3JlZCBmb3Igb3RoZXIgZGlzY3JpbWluYXRvciB0eXBlcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMzE7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdGhhdCBjb250YWlucyB0aGUgY29sdW1uLgotICAgICAgICAgICAgICogSWYgYWJzZW50IHRoZSBjb2x1bW4gaXMgYXNzdW1lZCB0byBiZSBpbiB0aGUgcHJpbWFyeSB0YWJsZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uIGlzIHBhcnQgb2YgdGhlIHByaW1hcnkgCi0gICAgICAgICAgICAgKiBrZXkgb2YgdGhlIHRhYmxlcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYm9vbGVhbiBwcmltYXJ5S2V5KCkgZGVmYXVsdCBmYWxzZTsgCi0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29udGV4dC1wcm9wZXJ0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmltYXJ5LWtleSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWUtb2YtZGF5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUaW1lT2ZEYXkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgSG91ciBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgaG91cigpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgTWludXRlIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBtaW51dGUoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2Vjb25kKCkgZGVmYXVsdCAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBNaWxsaXNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgbWlsbGlzZWNvbmQoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnRlcm5hbCB1c2UuIERvIG5vdCBtb2RpZnkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gc3BlY2lmaWVkKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJob3VyIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbnV0ZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWlsbGlzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zZm9ybWF0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uIGlzIGFuIG9wdGlvbmFsIGFubm90YXRpb24gZm9yIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBhbGxvd3MgdG8gbWFwIGFuIGF0dHJpYnV0ZSB0byBvbmUgb3IgbW9yZSAKLSAgICAgICAgICogZGF0YWJhc2UgY29sdW1ucy4KLSAgICAgICAgICogCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uIGFubm90YXRpb24gaXMgYW4gb3B0aW9uYWwgcGFydCBvZiAKLSAgICAgICAgICogVHJhbnNmb3JtYXRpb25NYXBwaW5nIGRlZmluaXRpb24uIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIAotICAgICAgICAgKiB3cml0ZS1vbmx5LCBpdCBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyAKLSAgICAgICAgICogdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRyYW5zZm9ybWF0aW9uIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAotICAgICAgICAgICAgICogdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgCi0gICAgICAgICAgICAgKiBoaW50IHRvIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCAKLSAgICAgICAgICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG9wdGlvbmFsIGVsZW1lbnQgaXMgYSBoaW50IGFzIHRvIHdoZXRoZXIgdGhlIHZhbHVlCi0gICAgICAgICAgICAgKiAgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IG1heSBiZSBudWxsLiBJdCBpcyBkaXNyZWdhcmRlZAotICAgICAgICAgICAgICogIGZvciBwcmltaXRpdmUgdHlwZXMsIHdoaWNoIGFyZSBjb25zaWRlcmVkIG5vbi1vcHRpb25hbC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWFkLXRyYW5zZm9ybWVyIiB0eXBlPSJvcm06cmVhZC10cmFuc2Zvcm1lciIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndyaXRlLXRyYW5zZm9ybWVyIiB0eXBlPSJvcm06d3JpdGUtdHJhbnNmb3JtZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2llbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUcmFuc2llbnQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUeXBlQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUKLSAgICAgICAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZSBmaWVsZCAKLSAgICAgICAgICAgKiBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IGZpZWxkIAotICAgICAgICAgICAqIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKiAKLSAgICAgICAgICogVmFyaWFibGUgb25lIHRvIG9uZSBtYXBwaW5ncyBhcmUgdXNlZCB0byByZXByZXNlbnQgYSBwb2ludGVyIAotICAgICAgICAgKiByZWZlcmVuY2VzIGJldHdlZW4gYSBqYXZhIG9iamVjdCBhbmQgYW4gaW1wbGVtZW50ZXIgb2YgYW4gaW50ZXJmYWNlLiAKLSAgICAgICAgICogVGhpcyBtYXBwaW5nIGlzIHVzdWFsbHkgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgcG9pbnRlciAoc3RvcmVkIGluIGFuIAotICAgICAgICAgKiBpbnN0YW5jZSB2YXJpYWJsZSkgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgb2JqZWN0cy4gSW4gdGhlIAotICAgICAgICAgKiByZWxhdGlvbmFsIGRhdGFiYXNlIHRhYmxlcywgdGhlc2UgbWFwcGluZ3MgYXJlIG5vcm1hbGx5IGltcGxlbWVudGVkIAotICAgICAgICAgKiB1c2luZyBhIGZvcmVpZ24ga2V5IGFuZCBhIHR5cGUgY29kZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEEgVmFyaWFibGVPbmVUb09uZSBjYW4gYmUgc3BlY2lmaWVkIHdpdGhpbiBhbiBFbnRpdHksIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIGFuZCBFbWJlZGRhYmxlIGNsYXNzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVmFyaWFibGVPbmVUb09uZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgaW50ZXJmYWNlIGNsYXNzIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUgCi0gICAgICAgICAgICogYXNzb2NpYXRpb24uIElmIG5vdCBzcGVjaWZpZWQgaXQgd2lsbCBiZSBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIAotICAgICAgICAgICAqIG9mIHRoZSBvYmplY3QgYmVpbmcgcmVmZXJlbmNlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB0YXJnZXRJbnRlcmZhY2UoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBvcGVyYXRpb25zIHRoYXQgbXVzdCBiZSBjYXNjYWRlZCB0byB0aGUgdGFyZ2V0IG9mIAotICAgICAgICAgICAqIHRoZSBhc3NvY2lhdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgCi0gICAgICAgICAgICogdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgCi0gICAgICAgICAgICogaGludCB0byB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgCi0gICAgICAgICAgICogZGVmYXVsdHMgdG8gRUFHRVIuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgV2hldGhlciB0aGUgYXNzb2NpYXRpb24gaXMgb3B0aW9uYWwuIElmIHNldCB0byBmYWxzZSAKLSAgICAgICAgICAgKiB0aGVuIGEgbm9uLW51bGwgcmVsYXRpb25zaGlwIG11c3QgYWx3YXlzIGV4aXN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiB3aWxsIGhvbGQgdGhlIHR5cGUgCi0gICAgICAgICAgICogaW5kaWNhdG9ycy4gSWYgdGhlIERpc2NyaW1pbmF0b3JDb2x1bW4gaXMgbm90IHNwZWNpZmllZCwgdGhlIG5hbWUgCi0gICAgICAgICAgICogb2YgdGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIGRlZmF1bHRzIHRvICJEVFlQRSIgYW5kIHRoZSAKLSAgICAgICAgICAgKiBkaXNjcmltaW5hdG9yIHR5cGUgdG8gU1RSSU5HLgotICAgICAgICAgICAqLwotICAgICAgICAgIERpc2NyaW1pbmF0b3JDb2x1bW4gZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgQERpc2NyaW1pbmF0b3JDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBsaXN0IG9mIGRpc2NyaW1pbmF0b3IgdHlwZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIAotICAgICAgICAgICAqIHRoaXMgVmFyaWFibGVPbmVUb09uZS4gSWYgbm9uZSBhcmUgc3BlY2lmaWVkIHRoZW4gdGhvc2UgZW50aXRpZXMgCi0gICAgICAgICAgICogd2l0aGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHRoYXQgaW1wbGVtZW50IHRoZSB0YXJnZXQgaW50ZXJmYWNlIAotICAgICAgICAgICAqIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgdHlwZXMuIFRoZSBkaXNjcmltaW5hdG9yIHR5cGUgd2lsbCAKLSAgICAgICAgICAgKiBkZWZhdWx0IGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIFNUUklORzogRW50aXR5Lm5hbWUoKQotICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBDSEFSOiBGaXJzdCBsZXR0ZXIgb2YgdGhlIAotICAgICAgICAgICAqICAgIEVudGl0eSBjbGFzcwotICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBJTlRFR0VSOiBUaGUgbmV4dCBpbnRlZ2VyIGFmdGVyIAotICAgICAgICAgICAqICAgIHRoZSBoaWdoZXN0IGludGVnZXIgZXhwbGljaXRseSBhZGRlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBEaXNjcmltaW5hdG9yQ2xhc3NbXSBkaXNjcmltaW5hdG9yQ2xhc3NlcygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jbGFzcyIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY2xhc3MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vbmNhY2hlYWJsZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0ib3JtOnBhcnRpdGlvbmluZy1ncm91cCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtaW50ZXJmYWNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZlcnNpb24ge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmRleCIgdHlwZT0ib3JtOmluZGV4IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuCi0gICAgICAgICAqICAKLSAgICAgICAgICogQSBzaW5nbGUgV3JpdGVUcmFuc2Zvcm1lciBtYXkgYmUgc3BlY2lmaWVkIGRpcmVjdGx5IG9uIHRoZSBtZXRob2Qgb3IgCi0gICAgICAgICAqIGF0dHJpYnV0ZS4gTXVsdGlwbGUgV3JpdGVUcmFuc2Zvcm1lcnMgc2hvdWxkIGJlIHdyYXBwZWQgaW50byAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbi4gTm8gV3JpdGVUcmFuc2Zvcm1lcnMgc3BlY2lmaWVkIGZvciAKLSAgICAgICAgICogcmVhZC1vbmx5IG1hcHBpbmcuIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IAotICAgICAgICAgKiBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSAKLSAgICAgICAgICogY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgV3JpdGVUcmFuc2Zvcm1lciB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKLSAgICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5GaWVsZFRyYW5zZm9ybWVyIAotICAgICAgICAgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyBidWlsZEZpZWxkVmFsdWUgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIAotICAgICAgICAgICAgICogY29sdW1uLiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgCi0gICAgICAgICAgICAgKiBzdXBwb3J0ZWQgdGhlIG1ldGhvZCBidWlsZEZpZWxkVmFsdWUgaW4gdGhlIGNsYXNzIHNob3VsZCBiZSAKLSAgICAgICAgICAgICAqIGRlZmluZWQgdG8gcmV0dXJuIHRoZSByZWxldmFudCBKYXZhIHR5cGUsIG5vdCBqdXN0IE9iamVjdCBhcyAKLSAgICAgICAgICAgICAqIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZSwgZm9yIGluc3RhbmNlOgotICAgICAgICAgICAgICogcHVibGljIFRpbWUgYnVpbGRGaWVsZFZhbHVlKE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIGZpZWxkTmFtZSwgU2Vzc2lvbiBzZXNzaW9uKS4KLSAgICAgICAgICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGUgbWFwcGVkIGNsYXNzIG11c3QgaGF2ZSBhIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSB3aGljaCByZXR1cm5zIAotICAgICAgICAgICAgICogYSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIGNvbHVtbi4KLSAgICAgICAgICAgICAqIE5vdGUgdGhhdCBmb3IgZGRsIGdlbmVyYXRpb24gYW5kIHJldHVybmluZyB0byBiZSBzdXBwb3J0ZWQgdGhlIAotICAgICAgICAgICAgICogbWV0aG9kIHNob3VsZCBiZSBkZWZpbmVkIHRvIHJldHVybiBhIHBhcnRpY3VsYXIgdHlwZSwgbm90IGp1c3QgCi0gICAgICAgICAgICAgKiBPYmplY3QsIGZvciBpbnN0YW5jZToKLSAgICAgICAgICAgICAqIHB1YmxpYyBUaW1lIGdldFN0YXJ0VGltZSgpLgotICAgICAgICAgICAgICogVGhlIG1ldGhvZCBtYXkgcmVxdWlyZSBhIFRyYW5zaWVudCBhbm5vdGF0aW9uIHRvIGF2b2lkIGJlaW5nIAotICAgICAgICAgICAgICogbWFwcGVkIGFzIEJhc2ljIGJ5IGRlZmF1bHQuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNwZWNpZnkgaGVyZSB0aGUgY29sdW1uIGludG8gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuLgotICAgICAgICAgICAgICogVGhlIG9ubHkgY2FzZSB3aGVuIHRoaXMgY291bGQgYmUgc2tpcHBlZCBpcyBpZiBhIHNpbmdsZSAKLSAgICAgICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGVzIGFuIGF0dHJpYnV0ZSAtIHRoZSBhdHRyaWJ1dGUncyBuYW1lIAotICAgICAgICAgICAgICogd2lsbCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWUuCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBDb2x1bW4gY29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhdGNoLWZldGNoIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBIEJhdGNoRmV0Y2ggYW5ub3RhdGlvbiBjYW4gYmUgdXNlZCBvbiBhbnkgcmVsYXRpb25zaGlwIG1hcHBpbmcsCi0gICAgICAgICAqIChPbmVUb09uZSwgTWFueVRvT25lLCBPbmVUb01hbnksIE1hbnlUb01hbnksIEVsZW1lbnRDb2xsZWN0aW9uLCBCYXNpY0NvbGxlY3Rpb24sIEJhc2ljTWFwKS4KLSAgICAgICAgICogSXQgYWxsb3dzIHRoZSByZWxhdGVkIG9iamVjdHMgdG8gYmUgYmF0Y2ggcmVhZCBpbiBhIHNpbmdsZSBxdWVyeS4KLSAgICAgICAgICogQmF0Y2ggZmV0Y2hpbmcgY2FuIGFsc28gYmUgc2V0IGF0IHRoZSBxdWVyeSBsZXZlbCwgYW5kIGl0IGlzIAotICAgICAgICAgKiBub3JtYWxseSByZWNvbW1lbmRlZCB0byBkbyBzbyBhcyBhbGwgcXVlcmllcyBtYXkgbm90IHJlcXVpcmUgYmF0Y2hpbmcuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMQotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmF0Y2hGZXRjaCB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgYmF0Y2gtZmV0Y2ggdG8gdXNlLgotICAgICAgICAgICAgICogRWl0aGVyIEpPSU4sIEVYSVNUUyBvciBJTi4KLSAgICAgICAgICAgICAqIEpPSU4gaXMgdGhlIGRlZmF1bHQuCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBCYXRjaEZldGNoVHlwZSB2YWx1ZSgpIGRlZmF1bHQgQmF0Y2hGZXRjaFR5cGUuSk9JTjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBEZWZpbmUgdGhlIGRlZmF1bHQgYmF0Y2ggZmV0Y2ggc2l6ZS4KLSAgICAgICAgICAgICAqIFRoaXMgaXMgb25seSB1c2VkIGZvciBJTiB0eXBlIGJhdGNoIHJlYWRpbmcgYW5kIGRlZmluZXMKLSAgICAgICAgICAgICAqIHRoZSBudW1iZXIgb2Yga2V5cyB1c2VkIGluIGVhY2ggSU4gY2xhdXNlLgotICAgICAgICAgICAgICogVGhlIGRlZmF1bHQgc2l6ZSBpcyAyNTYsIG9yIHRoZSBxdWVyeSdzIHBhZ2VTaXplIGZvciBjdXJzb3IgcXVlcmllcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaW50IHNpemUoKSBkZWZhdWx0IC0xOwotICAgICAgICB9Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOmJhdGNoLWZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi08L3hzZDpzY2hlbWE+Ci0KLQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3htXzJfMC54c2QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19veG1fMl8wLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIxMGNlNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19veG1fMl8wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgCi0gdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uIAotIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgCi0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotCi0gQ29udHJpYnV0b3JzOgotICAgICBkbWNjYW5uIC0gTm92ZW1iZXIgMjQvMjAwOSAtIDIuMCAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLS0+Ci08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gICAgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9veG0iCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3htIiAKLSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgdmVyc2lvbj0iMi4wIj4KLQotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1iaW5kaW5ncyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2NoZW1hIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlcnMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtdHlwZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImphdmEtdHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hY2Nlc3Nvci10eXBlIiB0eXBlPSJ4bWwtYWNjZXNzLXR5cGUiIGRlZmF1bHQ9IlBVQkxJQ19NRU1CRVIiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hY2Nlc3Nvci1vcmRlciIgdHlwZT0ieG1sLWFjY2Vzcy1vcmRlciIgZGVmYXVsdD0iVU5ERUZJTkVEIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJqYXZhLXR5cGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXJvb3QtZWxlbWVudCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2VlLWFsc28iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJqYXZhLWF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImphdmEtYXR0cmlidXRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtdHJhbnNpZW50IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWN1c3RvbWl6ZXIiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWFjY2Vzc29yLXR5cGUiIHR5cGU9InhtbC1hY2Nlc3MtdHlwZSIgZGVmYXVsdD0iUFVCTElDX01FTUJFUiIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWFjY2Vzc29yLW9yZGVyIiB0eXBlPSJ4bWwtYWNjZXNzLW9yZGVyIiBkZWZhdWx0PSJVTkRFRklORUQiIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtYXR0cmlidXRlIiB0eXBlPSJqYXZhLWF0dHJpYnV0ZSIgLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iamF2YS1hdHRyaWJ1dGUiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLWF0dHJpYnV0ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tIEVudW1zIC0tPgotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9InhtbC1hY2Nlc3Mtb3JkZXIiPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUxQSEFCRVRJQ0FMIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTkRFRklORUQiIC8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9InhtbC1hY2Nlc3MtdHlwZSI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGSUVMRCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPUEVSVFkiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBVQkxJQ19NRU1CRVIiIC8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9InhtbC1ucy1mb3JtIj4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlVOUVVBTElGSUVEIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJRVUFMSUZJRUQiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlVOU0VUIiAvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT1QQUNLQUdFKSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtc2NoZW1hIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1ucyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlLXVyaSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtZm9ybS1kZWZhdWx0IiB0eXBlPSJ4bWwtbnMtZm9ybSIgZGVmYXVsdD0iVU5TRVQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVsZW1lbnQtZm9ybS1kZWZhdWx0IiB0eXBlPSJ4bWwtbnMtZm9ybSIgZGVmYXVsdD0iVU5TRVQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXJzIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9e0ZJRUxELE1FVEhPRCxQQUNLQUdFfSkgLS0+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9e1BBQ0tBR0UsRklFTEQsTUVUSE9ELFRZUEUsUEFSQU1FVEVSfSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyLkRFRkFVTFQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT17RklFTEQsTUVUSE9ELFRZUEV9KSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtdHJhbnNpZW50IiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSIgLz4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPVRZUEUpIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC10eXBlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHJvcC1vcmRlciI+Ci0gICAgICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1yb290LWVsZW1lbnQiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtc2VlLWFsc28iPgotICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9e0ZJRUxEfSkgIC0tPgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtGSUVMRCxNRVRIT0R9KSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYW55LWF0dHJpYnV0ZSIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiIC8+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYXR0cmlidXRlIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWlyZWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlkcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbGlzdCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWF0dGFjaG1lbnQtcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbWltZS10eXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYW55LWVsZW1lbnQiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW1peGVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYXgiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRvbS1oYW5kbGVyIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uVzNDRG9tSGFuZGxlciIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50IiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50LXdyYXBwZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtbWFwIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0LXZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmlsbGFibGUiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudC5ERUZBVUxUIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlkcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbGlzdCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWF0dGFjaG1lbnQtcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbWltZS10eXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudC13cmFwcGVyIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmlsbGFibGUiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC12YWx1ZSIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiIC8+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtbWFwIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJrZXkiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+IAotICAgIDwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX294bV8yXzEueHNkIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3htXzJfMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZWE4NDIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3htXzJfMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0NjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIAotIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAKLSBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLQotIENvbnRyaWJ1dG9yczoKLSAgICAgZG1jY2FubiAtIERlY2VtYmVyIDA4LzIwMDkgLSAyLjEgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS0tPgotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICAgIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3htIgotICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL294bSIgCi0gICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgIHZlcnNpb249IjIuMSI+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYmluZGluZ3MiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXNjaGVtYSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2NoZW1hLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXNjaGVtYS10eXBlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXJzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtcmVnaXN0cmllcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXJlZ2lzdHJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVudW1zIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZW51bSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtdHlwZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImphdmEtdHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hY2Nlc3Nvci10eXBlIiB0eXBlPSJ4bWwtYWNjZXNzLXR5cGUiIGRlZmF1bHQ9IlBVQkxJQ19NRU1CRVIiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hY2Nlc3Nvci1vcmRlciIgdHlwZT0ieG1sLWFjY2Vzcy1vcmRlciIgZGVmYXVsdD0iVU5ERUZJTkVEIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtcmVnaXN0cnkiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVsZW1lbnQtZGVjbCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiID4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLW1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHRWYWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJcdTAwMDAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNjb3BlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudERlY2wuR0xPQkFMIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdWJzdGl0dXRpb25IZWFkTmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iamF2YS10eXBlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1yb290LWVsZW1lbnQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXNlZS1hbHNvIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iamF2YS1hdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJqYXZhLWF0dHJpYnV0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXRyYW5zaWVudCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1jdXN0b21pemVyIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hY2Nlc3Nvci10eXBlIiB0eXBlPSJ4bWwtYWNjZXNzLXR5cGUiIGRlZmF1bHQ9IlBVQkxJQ19NRU1CRVIiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hY2Nlc3Nvci1vcmRlciIgdHlwZT0ieG1sLWFjY2Vzcy1vcmRlciIgZGVmYXVsdD0iVU5ERUZJTkVEIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaW5saW5lLWJpbmFyeS1kYXRhIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iamF2YS1hdHRyaWJ1dGUiIHR5cGU9ImphdmEtYXR0cmlidXRlIiAvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJqYXZhLWF0dHJpYnV0ZSIgYWJzdHJhY3Q9InRydWUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImphdmEtYXR0cmlidXRlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIHR5cGU9InhtbC1hY2Nlc3MtbWV0aG9kcyIgLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWFjY2Vzcy1tZXRob2RzIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJnZXQtbWV0aG9kIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSBFbnVtcyAtLT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtYWNjZXNzLW9yZGVyIj4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFMUEhBQkVUSUNBTCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVU5ERUZJTkVEIiAvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtYWNjZXNzLXR5cGUiPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRklFTEQiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBST1BFUlRZIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQVUJMSUNfTUVNQkVSIiAvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtbnMtZm9ybSI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTlFVQUxJRklFRCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUVVBTElGSUVEIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTlNFVCIgLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ieG1sLW1hcnNoYWwtbnVsbC1yZXByZXNlbnRhdGlvbiI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJYU0lfTklMIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQlNFTlRfTk9ERSIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRU1QVFlfTk9ERSIgLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9UEFDS0FHRSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXNjaGVtYSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtbnMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZS11cmkiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHJlZml4IiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLWZvcm0tZGVmYXVsdCIgdHlwZT0ieG1sLW5zLWZvcm0iIGRlZmF1bHQ9IlVOU0VUIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbGVtZW50LWZvcm0tZGVmYXVsdCIgdHlwZT0ieG1sLW5zLWZvcm0iIGRlZmF1bHQ9IlVOU0VUIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXNjaGVtYS10eXBlcyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEtdHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1qYXZhLXR5cGUtYWRhcHRlcnMiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT17RklFTEQsTUVUSE9ELFBBQ0tBR0V9KSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtc2NoZW1hLXR5cGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hVHlwZS5ERUZBVUxUIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT17UEFDS0FHRSxGSUVMRCxNRVRIT0QsVFlQRSxQQVJBTUVURVJ9KSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXIuREVGQVVMVCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtGSUVMRCxNRVRIT0QsVFlQRX0pIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC10cmFuc2llbnQiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIiAvPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9VFlQRSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVudW0iPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZW51bS12YWx1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImphdmEtZW51bSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZhLmxhbmcuU3RyaW5nIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtdHlwZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZhY3RvcnktY2xhc3MiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlLkRFRkFVTFQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZhY3RvcnktbWV0aG9kIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InByb3Atb3JkZXIiPgotICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtcm9vdC1lbGVtZW50Ij4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXNlZS1hbHNvIj4KLSAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtGSUVMRH0pICAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZW51bS12YWx1ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLWVudW0tdmFsdWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtGSUVMRCxNRVRIT0R9KSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYW55LWF0dHJpYnV0ZSIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3cml0ZS1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtcGF0aCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWF0dHJpYnV0ZSIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgLz4gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWlyZWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlkcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbGlzdCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlubGluZS1iaW5hcnktZGF0YSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWF0dGFjaG1lbnQtcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbWltZS10eXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3cml0ZS1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtcGF0aCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFueS1lbGVtZW50IiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbWl4ZWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxheCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZG9tLWhhbmRsZXIiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5XM0NEb21IYW5kbGVyIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXBhdGgiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50IiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5IiBtaW5PY2N1cnM9IjAiIC8+ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudC13cmFwcGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLW1hcCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEtdHlwZSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQtdmFsdWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuaWxsYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWlyZWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50LkRFRkFVTFQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaWRyZWYiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1saXN0IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaW5saW5lLWJpbmFyeS1kYXRhIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYXR0YWNobWVudC1yZWYiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1taW1lLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndyaXRlLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNkYXRhIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtcGF0aCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVsZW1lbnRzIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50IiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50LXdyYXBwZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZHJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWxpc3QiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudC1yZWYiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVsZW1lbnQtd3JhcHBlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50UmVmLkRFRkFVTFQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudC1yZWZzIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVsZW1lbnQtcmVmIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudC13cmFwcGVyIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtaW52ZXJzZS1yZWZlcmVuY2UiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVsZW1lbnQtd3JhcHBlciI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5pbGxhYmxlIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWlyZWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtdmFsdWUiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3cml0ZS1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjZGF0YSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtbWFwIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJrZXkiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+IAotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiIHR5cGU9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSIgLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieHNpLW5pbC1yZXByZXNlbnRzLW51bGwiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVtcHR5LW5vZGUtcmVwcmVzZW50cy1udWxsIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJudWxsLXJlcHJlc2VudGF0aW9uLWZvci14bWwiIHR5cGU9InhtbC1tYXJzaGFsLW51bGwtcmVwcmVzZW50YXRpb24iIC8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtbnVsbC1wb2xpY3kiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlzLXNldC1wZXJmb3JtZWQtZm9yLWFic2VudC1ub2RlIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWlzLXNldC1udWxsLXBvbGljeSIgc3Vic3RpdHV0aW9uR3JvdXA9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImlzLXNldC1wYXJhbWV0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpcy1zZXQtbWV0aG9kLW5hbWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotPC94czpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3htXzJfMi54c2QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19veG1fMl8yLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlMzdjNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19veG1fMl8yLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgCi0gdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uIAotIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgCi0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotCi0gQ29udHJpYnV0b3JzOgotICAgICBkbWNjYW5uIC0gT2N0b2JlciAxMi8yMDEwIC0gMi4yIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0tLT4KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgICB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL294bSIKLSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9veG0iIAotICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICB2ZXJzaW9uPSIyLjIiPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWJpbmRpbmdzIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXNjaGVtYS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEtdHlwZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVycyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXJlZ2lzdHJpZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1yZWdpc3RyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbnVtcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVudW0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJqYXZhLXR5cGVzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJqYXZhLXR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYWNjZXNzb3ItdHlwZSIgdHlwZT0ieG1sLWFjY2Vzcy10eXBlIiBkZWZhdWx0PSJQVUJMSUNfTUVNQkVSIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYWNjZXNzb3Itb3JkZXIiIHR5cGU9InhtbC1hY2Nlc3Mtb3JkZXIiIGRlZmF1bHQ9IlVOREVGSU5FRCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYWNrYWdlLW5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtcmVnaXN0cnkiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVsZW1lbnQtZGVjbCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiID4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLW1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHRWYWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJcdTAwMDAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNjb3BlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudERlY2wuR0xPQkFMIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdWJzdGl0dXRpb25IZWFkTmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtdHlwZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcm9vdC1lbGVtZW50IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zZWUtYWxzbyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWNsYXNzLWV4dHJhY3RvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcHJvcGVydGllcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtYXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iamF2YS1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN1cGVyLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYWNjZXNzb3Itb3JkZXIiIHR5cGU9InhtbC1hY2Nlc3Mtb3JkZXIiIGRlZmF1bHQ9IlVOREVGSU5FRCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWFjY2Vzc29yLXR5cGUiIHR5cGU9InhtbC1hY2Nlc3MtdHlwZSIgZGVmYXVsdD0iUFVCTElDX01FTUJFUiIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWN1c3RvbWl6ZXIiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWRpc2NyaW1pbmF0b3Itbm9kZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtZGlzY3JpbWluYXRvci12YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaW5saW5lLWJpbmFyeS1kYXRhIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXRyYW5zaWVudCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtYXR0cmlidXRlIiB0eXBlPSJqYXZhLWF0dHJpYnV0ZSIgLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iamF2YS1hdHRyaWJ1dGUiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLWF0dHJpYnV0ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFjY2Vzcy1tZXRob2RzIiB0eXBlPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIC8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hY2Nlc3MtbWV0aG9kcyI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ2V0LW1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2V0LW1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtY2xhc3MtZXh0cmFjdG9yIiB0eXBlPSJ4bWwtY2xhc3MtZXh0cmFjdG9yIiAvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY2xhc3MtZXh0cmFjdG9yIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtcHJvcGVydGllcyIgdHlwZT0ieG1sLXByb3BlcnRpZXMiIC8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1wcm9wZXJ0aWVzIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiA+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YS5sYW5nLlN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPCEtLSBFbnVtcyAtLT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtYWNjZXNzLW9yZGVyIj4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFMUEhBQkVUSUNBTCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVU5ERUZJTkVEIiAvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtYWNjZXNzLXR5cGUiPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRklFTEQiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBST1BFUlRZIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQVUJMSUNfTUVNQkVSIiAvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtbnMtZm9ybSI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTlFVQUxJRklFRCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUVVBTElGSUVEIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTlNFVCIgLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ieG1sLW1hcnNoYWwtbnVsbC1yZXByZXNlbnRhdGlvbiI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJYU0lfTklMIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQlNFTlRfTk9ERSIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRU1QVFlfTk9ERSIgLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9UEFDS0FHRSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXNjaGVtYSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtbnMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZS11cmkiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHJlZml4IiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLWZvcm0tZGVmYXVsdCIgdHlwZT0ieG1sLW5zLWZvcm0iIGRlZmF1bHQ9IlVOU0VUIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbGVtZW50LWZvcm0tZGVmYXVsdCIgdHlwZT0ieG1sLW5zLWZvcm0iIGRlZmF1bHQ9IlVOU0VUIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXNjaGVtYS10eXBlcyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEtdHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1qYXZhLXR5cGUtYWRhcHRlcnMiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT17RklFTEQsTUVUSE9ELFBBQ0tBR0V9KSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtc2NoZW1hLXR5cGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hVHlwZS5ERUZBVUxUIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT17UEFDS0FHRSxGSUVMRCxNRVRIT0QsVFlQRSxQQVJBTUVURVJ9KSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXIuREVGQVVMVCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtGSUVMRCxNRVRIT0QsVFlQRX0pIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC10cmFuc2llbnQiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIiAvPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9VFlQRSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVudW0iPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZW51bS12YWx1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImphdmEtZW51bSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZhLmxhbmcuU3RyaW5nIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtdHlwZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZhY3RvcnktY2xhc3MiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlLkRFRkFVTFQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZhY3RvcnktbWV0aG9kIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InByb3Atb3JkZXIiPgotICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtcm9vdC1lbGVtZW50Ij4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXNlZS1hbHNvIj4KLSAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtGSUVMRH0pICAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZW51bS12YWx1ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLWVudW0tdmFsdWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtGSUVMRCxNRVRIT0R9KSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYW55LWF0dHJpYnV0ZSIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3cml0ZS1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtcGF0aCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1hdHRyaWJ1dGUiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5IiBtaW5PY2N1cnM9IjAiIC8+ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcHJvcGVydGllcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2NoZW1hLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZHJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWtleSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWxpc3QiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pbmxpbmUtYmluYXJ5LWRhdGEiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hdHRhY2htZW50LXJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW1pbWUtdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29udGFpbmVyLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1wYXRoIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYW55LWVsZW1lbnQiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1wcm9wZXJ0aWVzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50LXJlZnMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW1peGVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYXgiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRvbS1oYW5kbGVyIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uVzNDRG9tSGFuZGxlciIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndyaXRlLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1wYXRoIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29udGFpbmVyLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVsZW1lbnQiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgLz4gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50LXdyYXBwZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtbWFwIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXNjaGVtYS10eXBlIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdC12YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5pbGxhYmxlIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29udGFpbmVyLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50LkRFRkFVTFQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaWRyZWYiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1rZXkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1saXN0IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaW5saW5lLWJpbmFyeS1kYXRhIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYXR0YWNobWVudC1yZWYiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1taW1lLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndyaXRlLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNkYXRhIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtcGF0aCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVsZW1lbnRzIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudC13cmFwcGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWpvaW4tbm9kZXMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlkcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbGlzdCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3cml0ZS1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXItdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudC1yZWYiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1hY2Nlc3MtbWV0aG9kcyIgdHlwZT0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVsZW1lbnQtd3JhcHBlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1wcm9wZXJ0aWVzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudFJlZi5ERUZBVUxUIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1taXhlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3cml0ZS1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50LXJlZnMiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFjY2Vzcy1tZXRob2RzIiB0eXBlPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudC1yZWYiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50LXdyYXBwZXIiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbWl4ZWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtaW52ZXJzZS1yZWZlcmVuY2UiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1wcm9wZXJ0aWVzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50LXdyYXBwZXIiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuaWxsYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXZhbHVlIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2RhdGEiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29udGFpbmVyLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLW1hcCI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ia2V5IiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idmFsdWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPiAKLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5IiB0eXBlPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiIC8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSIgYWJzdHJhY3Q9InRydWUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhzaS1uaWwtcmVwcmVzZW50cy1udWxsIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbXB0eS1ub2RlLXJlcHJlc2VudHMtbnVsbCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibnVsbC1yZXByZXNlbnRhdGlvbi1mb3IteG1sIiB0eXBlPSJ4bWwtbWFyc2hhbC1udWxsLXJlcHJlc2VudGF0aW9uIiBkZWZhdWx0PSJBQlNFTlRfTk9ERSIgLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1udWxsLXBvbGljeSIgc3Vic3RpdHV0aW9uR3JvdXA9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaXMtc2V0LXBlcmZvcm1lZC1mb3ItYWJzZW50LW5vZGUiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtaXMtc2V0LW51bGwtcG9saWN5IiBzdWJzdGl0dXRpb25Hcm91cD0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaXMtc2V0LXBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaXMtc2V0LW1ldGhvZC1uYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtdHJhbnNmb3JtYXRpb24iIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFjY2Vzcy1tZXRob2RzIiB0eXBlPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcHJvcGVydGllcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtcmVhZC10cmFuc2Zvcm1lciI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC13cml0ZS10cmFuc2Zvcm1lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1wYXRoIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtam9pbi1ub2RlcyIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIiA+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWpvaW4tbm9kZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtcGF0aCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQteG1sLXBhdGgiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotPC94czpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3htXzJfMy54c2QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19veG1fMl8zLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRhNGQ1NS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19veG1fMl8zLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU4OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgCi0gdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uIAotIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgCi0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotCi0gQ29udHJpYnV0b3JzOgotICAgICBkbWNjYW5uIC0gRGVjZW1iZXIgMjIvMjAxMCAtIDIuMyAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLS0+Ci08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gICAgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9veG0iCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3htIiAKLSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgdmVyc2lvbj0iMi4zIj4KLQotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1iaW5kaW5ncyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2NoZW1hIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2NoZW1hLXR5cGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlcnMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1yZWdpc3RyaWVzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcmVnaXN0cnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZW51bXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbnVtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iamF2YS10eXBlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iamF2YS10eXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWFjY2Vzc29yLXR5cGUiIHR5cGU9InhtbC1hY2Nlc3MtdHlwZSIgZGVmYXVsdD0iUFVCTElDX01FTUJFUiIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWFjY2Vzc29yLW9yZGVyIiB0eXBlPSJ4bWwtYWNjZXNzLW9yZGVyIiBkZWZhdWx0PSJVTkRFRklORUQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icGFja2FnZS1uYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW5hbWUtdHJhbnNmb3JtZXIiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3VwcG9ydGVkLXZlcnNpb25zIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtcmVnaXN0cnkiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVsZW1lbnQtZGVjbCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiID4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLW1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHRWYWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJcdTAwMDAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNjb3BlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudERlY2wuR0xPQkFMIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdWJzdGl0dXRpb25IZWFkTmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtdHlwZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcm9vdC1lbGVtZW50IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC12aXJ0dWFsLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zZWUtYWxzbyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWNsYXNzLWV4dHJhY3RvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcHJvcGVydGllcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtYXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iamF2YS1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN1cGVyLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYWNjZXNzb3Itb3JkZXIiIHR5cGU9InhtbC1hY2Nlc3Mtb3JkZXIiIGRlZmF1bHQ9IlVOREVGSU5FRCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWFjY2Vzc29yLXR5cGUiIHR5cGU9InhtbC1hY2Nlc3MtdHlwZSIgZGVmYXVsdD0iUFVCTElDX01FTUJFUiIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWN1c3RvbWl6ZXIiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWRpc2NyaW1pbmF0b3Itbm9kZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtZGlzY3JpbWluYXRvci12YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaW5saW5lLWJpbmFyeS1kYXRhIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXRyYW5zaWVudCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1uYW1lLXRyYW5zZm9ybWVyIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtYXR0cmlidXRlIiB0eXBlPSJqYXZhLWF0dHJpYnV0ZSIgLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iamF2YS1hdHRyaWJ1dGUiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLWF0dHJpYnV0ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFjY2Vzcy1tZXRob2RzIiB0eXBlPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIC8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hY2Nlc3MtbWV0aG9kcyI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ2V0LW1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNldC1tZXRob2QiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1jbGFzcy1leHRyYWN0b3IiIHR5cGU9InhtbC1jbGFzcy1leHRyYWN0b3IiIC8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jbGFzcy1leHRyYWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1wcm9wZXJ0aWVzIiB0eXBlPSJ4bWwtcHJvcGVydGllcyIgLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ieG1sLXByb3BlcnRpZXMiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtcHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiID4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUtdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZhLmxhbmcuU3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8IS0tIEVudW1zIC0tPgotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9InhtbC1hY2Nlc3Mtb3JkZXIiPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUxQSEFCRVRJQ0FMIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTkRFRklORUQiIC8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9InhtbC1hY2Nlc3MtdHlwZSI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGSUVMRCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPUEVSVFkiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBVQkxJQ19NRU1CRVIiIC8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9InhtbC1ucy1mb3JtIj4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlVOUVVBTElGSUVEIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJRVUFMSUZJRUQiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlVOU0VUIiAvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtbWFyc2hhbC1udWxsLXJlcHJlc2VudGF0aW9uIj4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlhTSV9OSUwiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFCU0VOVF9OT0RFIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFTVBUWV9OT0RFIiAvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJzdXBwb3J0ZWQtdmVyc2lvbnMiPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMi4wIi8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjIuMSIvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIyLjIiLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMi4zIi8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPiAKLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT1QQUNLQUdFKSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtc2NoZW1hIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1ucyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlLXVyaSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtZm9ybS1kZWZhdWx0IiB0eXBlPSJ4bWwtbnMtZm9ybSIgZGVmYXVsdD0iVU5TRVQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVsZW1lbnQtZm9ybS1kZWZhdWx0IiB0eXBlPSJ4bWwtbnMtZm9ybSIgZGVmYXVsdD0iVU5TRVQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtc2NoZW1hLXR5cGVzIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXNjaGVtYS10eXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWphdmEtdHlwZS1hZGFwdGVycyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtGSUVMRCxNRVRIT0QsUEFDS0FHRX0pIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1zY2hlbWEtdHlwZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWFUeXBlLkRFRkFVTFQiIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtQQUNLQUdFLEZJRUxELE1FVEhPRCxUWVBFLFBBUkFNRVRFUn0pIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlci5ERUZBVUxUIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9e0ZJRUxELE1FVEhPRCxUWVBFfSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXRyYW5zaWVudCIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiIC8+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT1UWVBFKSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZW51bSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbnVtLXZhbHVlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iamF2YS1lbnVtIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmEubGFuZy5TdHJpbmciIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC10eXBlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmFjdG9yeS1jbGFzcyIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGUuREVGQVVMVCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmFjdG9yeS1tZXRob2QiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHJvcC1vcmRlciI+Ci0gICAgICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1yb290LWVsZW1lbnQiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtc2VlLWFsc28iPgotICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXZpcnR1YWwtYWNjZXNzLW1ldGhvZHMiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImdldC1tZXRob2QiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iZ2V0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9InNldCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4bWwtdmlydHVhbC1hY2Nlc3MtbWV0aG9kcy1zY2hlbWEiIGRlZmF1bHQ9Ik5PREVTIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtdmlydHVhbC1hY2Nlc3MtbWV0aG9kcy1zY2hlbWEiPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ERVMiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFOWSIgLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9e0ZJRUxEfSkgIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbnVtLXZhbHVlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImphdmEtZW51bS12YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICAKLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9e0ZJRUxELE1FVEhPRH0pIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1hbnktYXR0cmlidXRlIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcHJvcGVydGllcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndyaXRlLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1wYXRoIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29udGFpbmVyLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWF0dHJpYnV0ZSIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgLz4gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1wcm9wZXJ0aWVzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWlyZWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlkcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwta2V5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbGlzdCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlubGluZS1iaW5hcnktZGF0YSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWF0dGFjaG1lbnQtcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbWltZS10eXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3cml0ZS1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXItdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXBhdGgiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1hbnktZWxlbWVudCIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVsZW1lbnQtcmVmcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbWl4ZWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxheCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZG9tLWhhbmRsZXIiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5XM0NEb21IYW5kbGVyIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXBhdGgiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXItdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudCIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSIgbWluT2NjdXJzPSIwIiAvPiAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVsZW1lbnQtd3JhcHBlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1tYXAiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcHJvcGVydGllcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2NoZW1hLXR5cGUiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0LXZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmlsbGFibGUiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXItdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQuREVGQVVMVCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZHJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWtleSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWxpc3QiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pbmxpbmUtYmluYXJ5LWRhdGEiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hdHRhY2htZW50LXJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW1pbWUtdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2RhdGEiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1wYXRoIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudHMiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVsZW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50LXdyYXBwZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcHJvcGVydGllcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtam9pbi1ub2RlcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaWRyZWYiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1saXN0IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndyaXRlLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50LXJlZiIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFjY2Vzcy1tZXRob2RzIiB0eXBlPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudC13cmFwcGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudFJlZi5ERUZBVUxUIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1taXhlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3cml0ZS1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50LXJlZnMiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFjY2Vzcy1tZXRob2RzIiB0eXBlPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudC1yZWYiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50LXdyYXBwZXIiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW1peGVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndyaXRlLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWludmVyc2UtcmVmZXJlbmNlIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcHJvcGVydGllcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXItdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudC13cmFwcGVyIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmlsbGFibGUiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC12YWx1ZSIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1wcm9wZXJ0aWVzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNkYXRhIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndyaXRlLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1tYXAiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImtleSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InZhbHVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4gCi0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSIgdHlwZT0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5IiAvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4c2ktbmlsLXJlcHJlc2VudHMtbnVsbCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZW1wdHktbm9kZS1yZXByZXNlbnRzLW51bGwiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im51bGwtcmVwcmVzZW50YXRpb24tZm9yLXhtbCIgdHlwZT0ieG1sLW1hcnNoYWwtbnVsbC1yZXByZXNlbnRhdGlvbiIgZGVmYXVsdD0iQUJTRU5UX05PREUiIC8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtbnVsbC1wb2xpY3kiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlzLXNldC1wZXJmb3JtZWQtZm9yLWFic2VudC1ub2RlIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWlzLXNldC1udWxsLXBvbGljeSIgc3Vic3RpdHV0aW9uR3JvdXA9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImlzLXNldC1wYXJhbWV0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlzLXNldC1tZXRob2QtbmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXRyYW5zZm9ybWF0aW9uIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1hY2Nlc3MtbWV0aG9kcyIgdHlwZT0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXJlYWQtdHJhbnNmb3JtZXIiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtd3JpdGUtdHJhbnNmb3JtZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtcGF0aCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWpvaW4tbm9kZXMiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSIgPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1qb2luLW5vZGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiID4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXBhdGgiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLXhtbC1wYXRoIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXItdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8xLjEueHNkIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfcGVyc2lzdGVuY2VfbWFwXzEuMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NDZlYWQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfcGVyc2lzdGVuY2VfbWFwXzEuMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MTgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uCi0gVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLQotIENvbnRyaWJ1dG9yczoKLSAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGZyb20gT3JhY2xlIFRvcExpbmsKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLS0+Ci08IS0tIEVjbGlwc2UgUGVyc2lzdGVuY2UgU2VydmljZSBQcm9qZWN0IDo6IE1hcCBTY2hlbWEgZmlsZSBmb3IgT1JNL09YTS9FSVMgLS0+Ci08eHNkOnNjaGVtYQotICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSIKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSIKLSAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgdmVyc2lvbj0iMS4xIgotICA+Ci0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtcGVyc2lzdGVuY2UiIHR5cGU9Im9iamVjdC1wZXJzaXN0ZW5jZSIgLz4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtcGVyc2lzdGVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBvYmplY3QtcGVyc2lzdGVuY2UgbWFwcGluZyBtb2R1bGUsIGEgc2V0IG9mIGNsYXNzLW1hcHBpbmctZGVzY3JpcHRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIG5hbWUgZm9yIHRoZSBtb2RlbCBiZWluZyBtYXBwZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3JzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBjbGFzcyBtYXBwaW5nIGRlc2NyaXB0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiIHR5cGU9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5mb3JtYXRpb24gb2YgaG93IGEgY2xhc3MgaXMgcGVyc2lzdGVkIHRvIGl0cyBkYXRhLXN0b3JlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJsb2dpbiIgdHlwZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGFzb3VyY2UgY29ubmVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJkZWZhdWx0LXRlbXBvcmFsLW11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBkZWZhdWx0IGZvciBob3cgRGF0ZSBhbmQgQ2FsZW5kYXIgdHlwZXMgYXJlIHVzZWQgd2l0aCBjaGFuZ2UgdHJhY2tpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QnkgZGVmYXVsdCB0aGV5IGFyZSBhc3N1bWVkIG5vdCB0byBiZSBjaGFuZ2VkIGRpcmVjdGx5IChvbmx5IHJlcGxhY2VkKS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBkZWZhdWx0PSJFY2xpcHNlIFBlcnNpc3RlbmNlIFNlcnZpY2VzIC0gMS4xIChCdWlsZCBZWU1NREQpIiBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGFzb3VyY2UgY29ubmVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBsYXRmb3JtLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHBsYXRmb3JtIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idXNlci1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0YXNvdXJjZSB1c2VyLW5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGFzb3VyY2UgcGFzc3dvcmQsIHRoaXMgaXMgc3RvcmVkIGluIGVuY3J5cHRlZCBmb3JtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImV4dGVybmFsLWNvbm5lY3Rpb24tcG9vbGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaWYgdGhlIGNvbm5lY3Rpb25zIGFyZSBtYW5hZ2VkIGJ5IHRoZSBkYXRhc291cmNlIGRyaXZlciwgYW5kIGEgbmV3IGNvbm5lY3Rpb24gc2hvdWxkIGJlIGFjcXVpcmUgcGVyIGNhbGwuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZXh0ZXJuYWwtdHJhbnNhY3Rpb24tY29udHJvbGxlciIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaWYgdGhlIHRyYW5zYWN0aW9uIGFyZSBtYW5hZ2VkIGJ5IGEgdHJhbnNhY3Rpb24gbWFuYWdlciwgYW5kIHNob3VsZCBub3QgYmUgbWFuYWdlZCBieSBUb3BMaW5rLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGFsc28gYmUgdXNlZCBpZiB0aGUgZGF0YXNvdXJjZSBkb2VzIG5vdCBzdXBwb3J0IHRyYW5zYWN0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlcXVlbmNpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNpbmcgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVmYXVsdC1zZXF1ZW5jZSIgdHlwZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmF1bHQgc2VxdWVuY2UuIFRoZSBuYW1lIGlzIG9wdGlvbmFsLiBJZiBubyBuYW1lIHByb3ZpZGVkIGFuIGVtcHR5IHN0cmluZyB3aWxsIGJlIHVzZWQgYXMgYSBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VxdWVuY2VzIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Ob24gZGVmYXVsdCBzZXF1ZW5jZXMuIE1ha2Ugc3VyZSBlYWNoIHNlcXVlbmNlIGhhcyB1bmlxdWUgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ic2VxdWVuY2UiIHR5cGU9InNlcXVlbmNlIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2UtbG9naW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgSkRCQyBkcml2ZXIgYW5kIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRyaXZlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEpEQkMgZHJpdmVyIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29ubmVjdGlvbi11cmwiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGwgSkRCQyBkcml2ZXIgY29ubmVjdGlvbiBVUkwuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJiaW5kLWFsbC1wYXJhbWV0ZXJzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgcGFyYW1ldGVyIGJpbmRpbmcgc2hvdWxkIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FjaGUtYWxsLXN0YXRlbWVudHMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBzdGF0ZW1lbnQgY2FjaGluZyBzaG91bGQgYmUgdXNlZC4gIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2l0aCBwYXJhbWV0ZXIgYmluZGluZywgdGhpcyBjYW5ub3QgYmUgdXNlZCB3aXRoIGV4dGVybmFsIGNvbm5lY3Rpb24gcG9vbGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImJ5dGUtYXJyYXktYmluZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIGJ5dGUgYXJyYXkgZGF0YS10eXBlcyBzaG91bGQgdXNlIGJpbmRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ic3RyaW5nLWJpbmRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBzdHJpbmcgZGF0YS10eXBlcyBzaG91bGQgdXNlIGJpbmRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIyNTYiIG5hbWU9InN0cmluZy1iaW5kaW5nLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0aGUgdGhyZXNob2xkIHN0cmluZyBzaXplIGZvciB1c2FnZSBvZiBzdHJpbmcgYmluZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJzdHJlYW1zLWZvci1iaW5kaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgbGFyZ2UgYnl0ZSBhcnJheSBhbmQgc3RyaW5nIGRhdGEtdHlwZXMgc2hvdWxkIGJlIGJvdW5kIGFzIHN0cmVhbXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZm9yY2UtZmllbGQtbmFtZXMtdG8tdXBwZXItY2FzZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIHRvIGZvcmNlIGFsbCBmaWVsZCBuYW1lcyB0byB1cHBlci1jYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0ib3B0aW1pemUtZGF0YS1jb252ZXJzaW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgZGF0YSBvcHRpbWl6YXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJ0cmltLXN0cmluZ3MiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBzdHJpbmcgdHJhaWxpbmcgYmxhbmtzIHNob3VsZCBiZSB0cmltbWVkLiAgVGhpcyBpcyBub3JtYWxseSByZXF1aXJlZCBmb3IgQ0hBUiBkYXRhLXR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXdyaXRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBiYXRjaCB3cml0aW5nIHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iamRiYy1iYXRjaC13cml0aW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB1c2luZyBiYXRjaCB3cml0aW5nLCBjb25maWd1cmUgaWYgdGhlIEpEQkMgZHJpdmVycyBiYXRjaCB3cml0aW5nIHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtbG9naW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgSkNBIGRyaXZlciBhbmQgRUlTIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbm5lY3Rpb24tc3BlYy1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIFRvcExpbmsgcGxhdGZvcm0gc3BlY2lmaWMgY29ubmVjdGlvbiBzcGVjIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29ubmVjdGlvbi1mYWN0b3J5LXVybCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgSk5ESSB1cmwgZm9yIHRoZSBtYW5hZ2VkIEpDQSBhZGFwdGVyJ3MgY29ubmVjdGlvbiBmYWN0b3J5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtbG9naW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgY29ubmVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIAk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAJCW5hbWU9ImVxdWFsLW5hbWVzcGFjZS1yZXNvbHZlcnMiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAJPHhzZDplbGVtZW50IG5hbWU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiCi0gICAgICAgIAkJdHlwZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSIgbWF4T2NjdXJzPSIxIgotICAgICAgICAJCW1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIAk8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5mb3JtYXRpb24gb2YgaG93IGEgY2xhc3MgaXMgcGVyc2lzdGVkIHRvIGl0cyBkYXRhLXN0b3JlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBpcyBhbiBhYnN0cmFjdCBkZWZpbml0aW9uIHRvIGFsbG93IGZsZXhpYmlsaXR5IGluIHRoZSB0eXBlcyBvZiBjbGFzc2VzIGFuZCBkYXRhc3RvcmVzIHBlcnNpc3RlZCwgaS5lLiBpbnRlcmZhY2VzLCBhYnN0cmFjdCBjbGFzc2VzLCBhZ2dyZWdhdGVzLCBub24tcmVsYXRpb25hbCBwZXJzaXN0ZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGJlaW5nIHBlcnNpc3RlZC4gIFRoZSBjbGFzcyBuYW1lIG11c3QgYmUgZnVsbCBxdWFsaWZpZWQgd2l0aCBpdHMgcGFja2FnZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeGFtcGxlOiA8Y2xhc3MgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSI+ZXhhbXBsZS5lbXBsb3llZS5pbXBsZW1lbnRhdGlvbi5FbXBsb3llZTwvY2xhc3M+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhbGlhcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBhbiBhbGlhcyBuYW1lIGNhbiBiZSBnaXZlbiBmb3IgdGhlIGNsYXNzLiAgVGhlIGFsaWFzIGlzIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGNsYXNzIGluIHBsYWNlIG9mIGl0cyBpbXBsZW1lbnRhdGlvbiBuYW1lLCBzdWNoIGFzIGluIHF1ZXJ5aW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4YW1wbGU6IDxhbGlhcyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIj5FbXBsb3llZTwvYWxpYXM+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmltYXJ5LWtleSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZmllbGRzL2NvbHVtbnMgdGhhdCBtYWtlIHVwIHRoZSBwcmltYXJ5IGtleSBvciB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBpcyB1c2VkIGZvciBjYWNoaW5nLCByZWxhdGlvbnNoaXBzLCBhbmQgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBwcmltYXJ5IGtleSBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaWYgdGhlIGNsYXNzIGlzIHJlYWQtb25seS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb3BlcnRpZXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IGZvciB1c2VyIGRlZmluZWQgcHJvcGVydGllcyB0byBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0icHJvcGVydHkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgdXNlciBkZWZpbmVkIHByb3BlcnR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmhlcml0YW5jZSIgdHlwZT0iaW5oZXJpdGFuY2UtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MgaXMgcmVsYXRlZCBpbiBpbmhlcml0YW5jZSBhbmQgaG93IHRoaXMgaW5oZXJpdGFuY2UgaXMgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZXZlbnRzIiB0eXBlPSJldmVudC1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHBlcnNpc3RlbnQgZXZlbnRzIGZvciB0aGlzIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcnlpbmciIHR5cGU9InF1ZXJ5LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZGVmaW5lZCBxdWVyaWVzIGZvciB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtbWFwcGluZ3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG1hcHBpbmdzIHRoYXQgZGVmaW5lIGhvdyB0aGUgY2xhc3MnIGF0dHJpYnV0ZXMgYXJlIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXR0cmlidXRlLW1hcHBpbmciIHR5cGU9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIGF0dHJpYnV0ZSBpcyBwZXJzaXN0ZWQuIFRoZSBhdHRyaWJ1dGUgbWFwcGluZyBkZWZpbml0aW9uIGlzIGV4dGVuZGFibGUgdG8gYWxsb3cgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVzY3JpcHRvci10eXBlIiB0eXBlPSJjbGFzcy1kZXNjcmlwdG9yLXR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGRlc2NyaXB0b3IgdHlwZSwgc3VjaCBhcyBhZ2dyZWdhdGUgb3IgaW5kZXBlbmRlbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnRlcmZhY2VzIiB0eXBlPSJpbnRlcmZhY2UtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBpbnRlcmZhY2VzIHRoYXQgdGhpcyBjbGFzcyBpbXBsZW1lbnRzLi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImxvY2tpbmciIHR5cGU9ImxvY2tpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBsb2NraW5nIGJlaGF2aW9yIGZvciB0aGUgY2xhc3MuICBTdWNoIGFzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gdmVyc2lvbiwgdGltZXN0YW1wIG9yIGNoYW5nZSBzZXQgb2YgY29sdW1ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlcXVlbmNpbmciIHR5cGU9InNlcXVlbmNpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIGdlbmVyYXRlZCB1bmlxdWUgaWQgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNhY2hpbmciIHR5cGU9ImNhY2hpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MnIGluc3RhbmNlcyBzaG91bGQgYmUgY2FjaGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVtb3RlLWNhY2hpbmciIHR5cGU9ImNhY2hpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MnIGluc3RhbmNlcyBzaG91bGQgYmUgY2FjaGVkIG9uIHJlbW90ZSBjbGllbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaGlzdG9yeS1wb2xpY3kiIHR5cGU9Imhpc3RvcnktcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBwYXN0IHZlcnNpb25zIG9mIG9iamVjdHMgYXJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YS1zdG9yZS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBoaXN0b3J5IHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybmluZy1wb2xpY3kiIHR5cGU9InJldHVybmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgcmV0dW5pbmcgcG9saWN5LiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIHJldHVybmluZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhbWVuZG1lbnQiIHR5cGU9ImFtZW5kbWVudCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgZm9yIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGFtZW5kZWQgb3IgY3VzdG9taXplZCB0aHJvdWdoIGEgY2xhc3MgQVBJIGFmdGVyIGxvYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnN0YW50aWF0aW9uIiB0eXBlPSJpbnN0YW50aWF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBpbnN0YW50aWF0aW9uIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvcHlpbmciIHR5cGU9ImNvcHktcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgb2JqZWN0IGNsb25pbmcvY29weWluZyBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcnkta2V5cyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBsaXN0IG9mIHF1ZXJ5IGtleXMgb3IgYWxpYXNlcyBmb3IgZGF0YWJhc2UgaW5mb3JtYXRpb24uICBUaGVzZSBjYW4gYmUgdXNlZCBpbiBxdWVyaWVzIGluc3RlYWQgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbiBuYW1lcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icXVlcnkta2V5IiB0eXBlPSJxdWVyeS1rZXkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIHF1ZXJ5aW5nIGRhdGFiYXNlIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbXAtcG9saWN5IiB0eXBlPSJjbXAtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5QbGFjZSBob2xkZXIgb2YgQ01QIGluZm9ybWF0aW9uIHNwZWNpZmljLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmV0Y2gtZ3JvdXBzIiB0eXBlPSJmZXRjaC1ncm91cHMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIGFsbCBwcmUtZGVmaW5lZCBmZXRjaCBncm91cHMgYXQgdGhlIGRlc2NyaXB0b3IgbGV2ZWw8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iY2hhbmdlLXBvbGljeSIgdHlwZT0iY2hhbmdlLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgdGhlIENoYW5nZSBQb2xpY3kgZm9yIHRoaXMgZGVzY3JpcHRvcjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIGZpeGVkPSIxMCIgbmFtZT0ic2NoZW1hLW1ham9yLXZlcnNpb24iIHR5cGU9InhzZDppbnRlZ2VyIiAvPgotICAgIDx4c2Q6YXR0cmlidXRlIGZpeGVkPSIwIiBuYW1lPSJzY2hlbWEtbWlub3ItdmVyc2lvbiIgdHlwZT0ieHNkOmludGVnZXIiIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2xhc3MtZGVzY3JpcHRvci10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY2xhc3MgZGVzY3JpcHRvciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW5kZXBlbmRlbnQiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZ2dyZWdhdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZ2dyZWdhdGUtY29sbGVjdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBvc2l0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBvc2l0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImludGVyZmFjZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnRlcmZhY2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgaW50ZXJmYWNlcyB0aGF0IGEgY2xhc3MgZGVzY3JpcHRvciBpbXBsZW1lbnRzLCBvciB0aGUgaW1wbGVtZW50aW9uIGNsYXNzIGZvciBhbiBpbnRlcmZhY2UgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgYSBzZXQgb2YgcHVibGljIGludGVyZmFjZXMgZm9yIHRoZSBjbGFzcyBjYW4gYmUgc3BlY2lmaWVkLiAgVGhpcyBhbGxvd3MgdGhlIGludGVyZmFjZSB0byBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPklmIHR3byBjbGFzc2VzIGltcGxlbWVudCB0aGUgc2FtZSBpbnRlcmZhY2UsIGFuIGludGVyZmFjZSBkZXNjcmlwdG9yIHNob3VsZCBiZSBkZWZpbmVkIGZvciB0aGUgaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYWxzbyBiZSB1c2VkIHRvIGRlZmluZSBpbmhlcml0YW5jZSBiZXR3ZWVuIGludGVyZmFjZSBkZXNjcmlwdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpbnRlcmZhY2UiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgaW50ZXJmYWNlIGNsYXNzIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhhbXBsZTogPGNsYXNzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiPmV4YW1wbGUuZW1wbG95ZWUuYXBpLkVtcGxveWVlPC9jbGFzcz48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpbXBsZW1lbnRvci1kZXNjcmlwdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB3aGljaCB0aGlzIGludGVyZmFjZSBpcyB0aGUgcHVibGljIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIHRoZSBpbnRlcmZhY2UgaGFzIG9ubHkgYSBzaW5nbGUgaW1wbGVtZW50b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhhbXBsZTogPGNsYXNzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiPmV4YW1wbGUuZW1wbG95ZWUuaW1wbC5FbXBsb3llZTwvY2xhc3M+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBjbG9uaW5nL2NvcHlpbmcgYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DcmVhdGVzIGEgY29weWluZyB0aHJvdWdoIGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlIHRvIGNvcHkgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29weS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsb25lLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBjbG9uaW5nL2NvcHlpbmcgYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZCB0aHJvdWdoIGEgY2xvbmUgbWV0aG9kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb3B5LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBjbG9uZSBtZXRob2Qgb24gdGhlIG9iamVjdCwgaS5lLiAnY2xvbmUnPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBpbnN0YW50aWF0aW9uIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgb24gdGhlIGZhY3RvcnkgdG8gaW5zdGFudGlhdGUgdGhlIG9iamVjdCBpbnN0YW5jZS4nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmYWN0b3J5LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGZhY3RvcnkgY2xhc3MgbmFtZS4nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmYWN0b3J5LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnN0YW50aWF0ZSB0aGUgZmFjdG9yeSBjbGFzcy4nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFtZW5kbWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIGNsYXNzIGFuZCBzdGF0aWMgbWV0aG9kIHRvIGJlIGNhbGxlZCB0byBhbGxvdyBmb3IgdGhlIGRlc2NyaXB0b3IgdG8gYmUgYW1lbmRlZCBvciBjdXN0b21pemVkIHRocm91Z2ggYSBjbGFzcyBBUEkgYWZ0ZXIgbG9hZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbWVuZG1lbnQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPiBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGFtZW5kbWVudCBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbWVuZG1lbnQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgc3RhdGljIGFtZW5kbWVudCBtZXRob2Qgb24gdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbmFsLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjbGFzcyBtYXBwaW5nIHRvIGEgcmVsYXRpb25hbCBkYXRhYmFzZSB0YWJsZShzKS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0YWJsZXMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgdGhlIHRhYmxlcyB0aGUgY2xhc3MgaXMgcGVyc2lzdGVkIHRvLiAgVHlwaWNhbGx5IGEgY2xhc3MgaXMgcGVyc2lzdGVkIHRvIGEgc2luZ2xlIHRhYmxlLCBidXQgbXVsdGlwbGUgdGFibGVzIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InRhYmxlIiB0eXBlPSJ0YWJsZSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiB0YWJsZXMgdGhhdCB0aGUgY2xhc3MgaXMgcGVyc2lzdGVkIHRvLiAgVGhpcyBpcyB0eXBpY2FsbHkgYSBzaW5nbGUgdGFibGUgYnV0IGNhbiBiZSBtdWx0aXBsZSwgb3IgZW1wdHkgZm9yIGluaGVyaXRhbmNlIG9yIGFnZ3JlZ2F0ZWQgY2xhc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXlzLWZvci1tdWx0aXBsZS10YWJsZSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIGZvcmVpZ24ga2V5IGZpZWxkIHJlZmVyZW5jZXMgdG8gYmUgZGVmaW5lIGZvciBtdWx0aXBsZSB0YWJsZSBkZXNjcmlwdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im11bHRpcGxlLXRhYmxlLWpvaW4tY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBjb21wbGV4IG11bHRpcGxlIHRhYmxlIGpvaW4gY29uZGl0aW9ucyBhbiBleHByZXNzaW9uIG1heSBiZSBwcm92aWRlZCBpbnN0ZWFkIG9mIHRoZSB0YWJsZSBmb3JlaWduIGtleSBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2ZXJzaW9uLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIGEgbnVtZXJpYyB2ZXJzaW9uIGZpZWxkL2NvbHVtbiB0aGF0IHRyYWNrcyBjaGFuZ2VzIGFuZCB0aGUgdmVyc2lvbiB0byBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvY2tpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVyc2lvbi1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgYW5kIG9wdGlvbmFsbHkgdGhlIHRhYmxlIG9mIHRoZSBjb2x1bW4gdGhhdCB0aGUgYXR0cmlidXRlIGlzIHN0b3JlZCBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0ic3RvcmUtdmVyc2lvbi1pbi1jYWNoZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgdmVyc2lvbiB2YWx1ZSBzaG91bGQgYmUgc3RvcmVkIGluIHRoZSBjYWNoZSwgb3IgaWYgaXQgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGltZXN0YW1wLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIHRpbWVzdGFtcCB2ZXJzaW9uIGNvbHVtbiB0aGF0IHRyYWNrcyBjaGFuZ2VzIGFuZCB0aGUgdmVyc2lvbiB0byBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZlcnNpb24tbG9ja2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJzZXJ2ZXItdGltZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgdGltZXN0YW1wIHNob3VsZCBiZSBvYnRhaW5lZCBsb2NhbGx5IG9yIGZyb20gdGhlIGRhdGFiYXNlIHNlcnZlci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWxsLWZpZWxkcy1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiBjb21wYXJpbmcgdGhlIG9yaWdpbmFsIHJlYWQgdmFsdWVzIG9mIGFsbCBmaWVsZHMgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2NraW5nLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2hhbmdlZC1maWVsZHMtbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gY29tcGFyaW5nIHRoZSBvcmlnaW5hbCByZWFkIHZhbHVlcyBvZiBvbmx5IHRoZSBjaGFuZ2VkIGZpZWxkcyBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvY2tpbmctcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWxlY3RlZC1maWVsZHMtbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gY29tcGFyaW5nIHRoZSBvcmlnaW5hbCByZWFkIHZhbHVlcyBvZiBhIHNwZWNpZmllZCBzZXQgb2YgZmllbGRzIG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdmFsdWVzIGluIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9ja2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgc2V0IG9mIGZpZWxkcyB0byBjb21wYXJlIG9uIHVwZGF0ZSBhbmQgZGVsZXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIGRhdGFiYXNlIGdlbmVyYXRlZCB1bmlxdWUgaWQgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBnZW5lcmF0b3IuICBUaGlzIGNvdWxkIGJlIHRoZSBuYW1lIG9mIGEgc2VxdWVuY2Ugb2JqZWN0LCBvciBhIHJvdyB2YWx1ZSBpbiBhIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgZmllbGQvY29sdW1uIHRoYXQgdGhlIGdlbmVyYXRlZCBzZXF1ZW5jZSBpZCBpcyBhc3NpZ25lZCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGNhY2hpbmcgdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZnVsbCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNhY2hlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id2Vhay1yZWZlcmVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzb2Z0LXJlZmVyZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNvZnQtY2FjaGUtd2Vhay1yZWZlcmVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJoYXJkLWNhY2hlLXdlYWstcmVmZXJlbmNlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzJyBpbnN0YW5jZXMgc2hvdWxkIGJlIGNhY2hlZCBhbmQgaG93IG9iamVjdCBpZGVudGl0eSBzaG91bGQgYmUgbWFpbnRhaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InNvZnQtY2FjaGUtd2Vhay1yZWZlcmVuY2UiIG5hbWU9ImNhY2hlLXR5cGUiIHR5cGU9ImNhY2hlLXR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHR5cGUgb2YgY2FjaGluZywgc3VjaCBhcyBMUlUsIHdlYWsgcmVmZXJlbmNlIG9yIG5vbmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIxMDAiIG5hbWU9ImNhY2hlLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBpbml0aWFsIG9yIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYWx3YXlzLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyByZWZyZXNoIGNhY2hlZCBvYmplY3RzIG9uIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ib25seS1yZWZyZXNoLWNhY2hlLWlmLW5ld2VyLXZlcnNpb24iIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIHJlZnJlc2ggaWYgdGhlIGNhY2hlZCBvYmplY3QgaXMgYW4gb2xkZXIgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJkaXNhYmxlLWNhY2hlLWhpdHMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EaXNhYmxlIG9idGFpbmluZyBjYWNoZSBoaXRzIG9uIHByaW1hcnkga2V5IHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYWx3YXlzLWNvbmZvcm0iIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBjb25mb3JtIHF1ZXJpZXMgd2l0aGluIGEgdHJhbnNhY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iaXNvbGF0ZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIG9iamVjdHMgb2YgdGhpcyB0eXBlIHNob3VsZCBiZSBpc29sYXRlZCBmcm9tIHRoZSBzaGFyZWQgY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJpc29sYXRlLW5ldy1kYXRhLWFmdGVyLXRyYW5zYWN0aW9uIiBuYW1lPSJ1bml0b2Z3b3JrLWlzb2xhdGlvbi1sZXZlbCIgdHlwZT0idW5pdG9md29yay1pc29sYXRpb24tbGV2ZWwiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IHRoZSB1bml0IG9mIHdvcmsgc2hvdWxkIGJlIGlzb2xhdGVkIHRvIHRoZSBzZXNzaW9uIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FjaGUtaW52YWxpZGF0aW9uLXBvbGljeSIgdHlwZT0iY2FjaGUtaW52YWxpZGF0aW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5LiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJjaGFuZ2Utc2V0IiBuYW1lPSJjYWNoZS1zeW5jLXR5cGUiIHR5cGU9ImNhY2hlLXN5bmMtdHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHR5cGUgb2YgY2FjaGUgc3luY2hyb25pemF0aW9uIHRvIGJlIHVzZWQgd2l0aCB0aGlzIGRlc2NyaXBvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FjaGUtaW52YWxpZGF0aW9uIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFic3RyYWN0IHN1cGVyY2xhc3MgZm9yIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY2llcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1cGRhdGUtcmVhZC10aW1lLW9uLXVwZGF0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vLWV4cGlyeS1jYWNoZS1pbnZhbGlkYXRpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeSB3aGVyZSBvYmplY3RzIGluIHRoZSBjYWNoZSBkbyBub3QgZXhwaXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjYWNoZS1pbnZhbGlkYXRpb24iIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWUtdG8tbGl2ZS1jYWNoZS1pbnZhbGlkYXRpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeSB3aGVyZSBvYmplY3RzIGxpdmUgYSBzcGVjaWZpYyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGFmdGVyIHRoZXkgYXJlIHJlYWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNhY2hlLWludmFsaWRhdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRpbWUtdG8tbGl2ZSIgdHlwZT0ieHNkOmxvbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYWlseS1jYWNoZS1pbnZhbGlkYXRpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q2FjaGUgaW52YWxpZGF0aW9uIFBvbGljeSB3aGVyZSBvYmplY3RzIGV4cGlyZSBhdCBhIHNwZWNpZmljIHRpbWUgZXZlcnkgZGF5PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNhY2hlLWludmFsaWRhdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4cGlyeS10aW1lIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJoaXN0b3J5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHBhc3QgdmVyc2lvbnMgb2Ygb2JqZWN0cyBhcmUgdG8gYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhLXN0b3JlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iaGFuZGxlLXdyaXRlcyIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLWRhdGFiYXNlLXRpbWUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaGlzdG9yeS10YWJsZXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIG5hbWVzIG9mIHRoZSBtaXJyb3JpbmcgaGlzdG9yaWNhbCB0YWJsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJoaXN0b3J5LXRhYmxlIiB0eXBlPSJoaXN0b3J5LXRhYmxlIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzdGFydC1maWVsZHMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHN0YXJ0IGZpZWxkcyBmb3IgZWFjaCBoaXN0b3JpY2FsIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ic3RhcnQtZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJlbmQtZmllbGRzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBlbmQgZmllbGRzIGZvciBlYWNoIGhpc3RvcmljYWwgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJlbmQtZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imhpc3RvcnktdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FYWNoIGVudHJ5IGlzIGEgc291cmNlIChkZXNjcmlwdG9yKSB0byBoaXN0b3J5IHRhYmxlIG5hbWUgYXNzb2NpYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIiIG5hbWU9InNvdXJjZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG5hbWU9Imhpc3RvcnkiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJldHVybmluZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHJldHVuaW5nIHBvbGljeS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyByZXR1cm5pbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMSIgbmFtZT0icmV0dXJuaW5nLWZpZWxkLWluZm9zIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyB0aGUgZmllbGRzIHRvIGJlIHJldHVybmVkIHRvZ2V0aGVyIHdpdGggdGhlIGZsYWdzIGRlZmluaW5nIHJldHVybmluZyBvcHRpb25zPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJyZXR1cm5pbmctZmllbGQtaW5mbyIgdHlwZT0icmV0dXJuaW5nLWZpZWxkLWluZm8iIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmV0dXJuaW5nLWZpZWxkLWluZm8iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5GaWVsZCB0byBiZSByZXR1cm5lZCB0b2dldGhlciB3aXRoIHR5cGUgYW5kIHRoZSBmbGFncyBkZWZpbmluZyByZXR1cm5pbmcgb3B0aW9ucy4gQXQgbGVhc3Qgb25lIG9mIGluc2VydCwgdXBkYXRlIHNob3VsZCBiZSB0cnVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHRhcmdldCByZWZlcmVuY2VkIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIHRvIGJlIHJldHVybmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Imluc2VydCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCBzaG91bGQgYmUgcmV0dW5lZCBhZnRlciBJbnNlcnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iaW5zZXJ0LW1vZGUtcmV0dXJuLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiBpbnNlcnQ9PXRydWUsIGluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCBzaG91bGQgbm90IGJlIGluc2VydGVkICh0cnVlKS4gSWYgaW5zZXJ0PT1mYWxzZSAtIGlnbm9yZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXBkYXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkIHNob3VsZCBiZSByZXR1bmVkIGFmdGVyIEluc2VydC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzIGlzIHJlbGF0ZWQgaW4gaW5oZXJpdGFuY2UgYW5kIGhvdyB0aGlzIGluaGVyaXRhbmNlIGlzIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBhcmVudC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHBhcmVudC9zdXBlcmNsYXNzIG9mIHRoZSBjbGFzcyBiZWluZyBwZXJzaXN0ZWQuICBUaGUgY2xhc3MgbmFtZSBtdXN0IGJlIGZ1bGwgcXVhbGlmaWVkICAgd2l0aCBpdHMgcGFja2FnZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InJlYWQtc3ViY2xhc3Nlcy1vbi1xdWVyaWVzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIGlmIHN1YmNsYXNzZXMgb2YgdGhlIGNsYXNzIHNob3VsZCBiZSByZXR1cm5lZCBvbiBxdWVyaWVzLCBvciBvbmx5IHRoZSBleGFjdCBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFsbC1zdWJjbGFzc2VzLXZpZXciIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgbmFtZSBvZiBhIHZpZXcgdGhhdCBqb2lucyBhbGwgb2YgdGhlIHN1YmNsYXNzJyB0YWJsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLWNsYXNzLW5hbWUtYXMtaW5kaWNhdG9yIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBzaG91bGQgYmUgdXNlZCBhcyB0aGUgY2xhc3MgdHlwZSBpbmRpY2F0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1leHRyYWN0aW9uLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgYSBtZXRob2Qgb24gdGhlIGNsYXNzIHRoYXQgdGFrZXMgdGhlIGNsYXNzJyByb3cgYXMgYXJndW1lbnQgYSBjb21wdXRlZCB0aGF0IGNsYXNzIHR5cGUgdG8gYmUgdXNlZCB0byBpbnN0YW50aWF0ZSBmcm9tIHRoZSByb3cuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgdHlwZSBmaWVsZC9jb2x1bW4gdGhhdCB0aGUgY2xhc3MgdHlwZSBpcyBzdG9yZWQgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyIgdHlwZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGNsYXNzIGluZGljYXRvciB2YWx1ZXMgYW5kIHRoZSBzdWJjbGFzc2VzIHRoZXkgbWFwIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtZXh0cmFjdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIGNsYXNzIGV4dHJhY3RvciBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvbmx5LWluc3RhbmNlcy1jcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBjcml0ZXJpYSB0aGF0IGZpbHRlcnMgb3V0IGFsbCBzaWJsaW5nIGFuZCBzdWJjbGFzcyBpbnN0YW5jZXMgb24gcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFsbC1zdWJjbGFzc2VzLWNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGNyaXRlcmlhIHRoYXQgZmlsdGVycyBvdXQgc2libGluZyBpbnN0YW5jZXMgb24gcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJvdXRlci1qb2luLXN1YmNsYXNzZXMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgaW5oZXJpdGFuY2UgcXVlcmllcyBzcGVjaWZ5IGlmIGFsbCBzdWJjbGFzc2VzIHNob3VsZCBiZSBvdXRlciBqb2luZWQsIGluc3RlYWQgb2YgYSBxdWVyeSBwZXIgc3ViY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InFuYW1lLWluaGVyaXRhbmNlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4dGVuZHMgaW5oZXJpdGFuY2UgcG9saWN5LiBBbGxvd3MgZm9yIHByZWZpeGVkIG5hbWVzIHRvIGJlIHJlc29sdmVkIGF0IHJ1bnRpbWUgdG8gZmluZCB0aGUgYXBwcm9yaWF0ZSBjbGFzczwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmhlcml0YW5jZS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgY2xhc3MgaW5kaWNhdG9yIHZhbHVlcyBhbmQgdGhlIHN1YmNsYXNzZXMgdGhleSBtYXAgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmciPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgdGhlIHR5cGUgbWFwcyB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcy1pbmRpY2F0b3IiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgdmFsdWUgdXNlZCB0byBkZWZpbmUgdGhlIGNsYXNzIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXZlbnQtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgcGVyc2lzdGVudCBldmVudHMgZm9yIHRoaXMgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJldmVudC1saXN0ZW5lcnMiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXZlbnQtbGlzdGVuZXIiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhbiBldmVudCBsaXN0ZW5lciBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGRlc2NyaXB0b3IgZXZlbnQgbGlzdGVuZXIgaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LWJ1aWxkLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIGJ1aWxkaW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmUtd3JpdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIHdyaXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3Qtd3JpdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgd3JpdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJlLWluc2VydC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgaW5zZXJ0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LWluc2VydC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBpbnNlcnRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByZS11cGRhdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIHVwZGF0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LXVwZGF0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciB1cGRhdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJlLWRlbGV0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgZGVsZXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtZGVsZXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIGRlbGV0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhYm91dC10by1pbnNlcnQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIGluc2VydGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWJvdXQtdG8tdXBkYXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSB1cGRhdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1jbG9uZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBjbG9uaW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LW1lcmdlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIG1lcmdpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtcmVmcmVzaC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciByZWZyZXNoaW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGRlZmluZWQgcXVlcmllcyBhbmQgcXVlcnkgcHJvcGVydGllcyBmb3IgdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcmllcyI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJxdWVyeSIgdHlwZT0icXVlcnkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgZGVmaW5pdGlvbiBmb3IgdGhlIGNsYXNzJyBpbnN0YW5jZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InRpbWVvdXQiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSB0aW1lb3V0IHRvIGFwcGx5IHRvIGFsbCBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iY2hlY2stY2FjaGUiIG5hbWU9ImV4aXN0ZW5jZSIgdHlwZT0iZXhpc3RlbmNlLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIGJlaGF2b2lyIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIGluc2VydCBvciB1cGRhdGUgc2hvdWxkIG9jY3VyIGZvciBhbiBvYmplY3QgdG8gYmUgY3VzdG9taXplZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imluc2VydC1xdWVyeSIgdHlwZT0iaW5zZXJ0LW9iamVjdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIGluc2VydCBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCBpbnNlcnQgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idXBkYXRlLXF1ZXJ5IiB0eXBlPSJ1cGRhdGUtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gdXBkYXRlIHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IHVwZGF0ZSBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtcXVlcnkiIHR5cGU9ImRlbGV0ZS1vYmplY3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSBkZWxldGUgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgZGVsZXRlIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRvZXMtZXhpc3QtcXVlcnkiIHR5cGU9ImRvZXMtZXhpc3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSBkb2VzIGV4aXN0IHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IGRlbGV0ZSBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWFkLW9iamVjdC1xdWVyeSIgdHlwZT0icmVhZC1vYmplY3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSByZWFkIG9iamVjdCBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCByZWFkIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlYWQtYWxsLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIHJlYWQgYWxsIHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IHJlYWQgYWxsIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJleGlzdGVuY2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGV4aXN0ZW5jZSBwb2xpY2llcyBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gaW5zZXJ0IG9yIHVwZGF0ZSBzaG91bGQgb2NjdXIgZm9yIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrLWNhY2hlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hlY2stZGF0YWJhc2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhc3N1bWUtZXhpc3RlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXNzdW1lLW5vbi1leGlzdGVuY2UiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgcXVlcnlpbmcgZGF0YWJhc2UgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5LWtleSBhbGlhcyBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS1zeW5jLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgdHlwZSBvZiBjYWNoZSBzeW5jaHJvbml6YXRpb24gdG8gdXNlIHdpdGggYSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW52YWxpZGF0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8tY2hhbmdlcyIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoYW5nZS1zZXQtd2l0aC1uZXctb2JqZWN0cyIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoYW5nZS1zZXQiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ1bml0b2Z3b3JrLWlzb2xhdGlvbi1sZXZlbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IHRoZSB1bml0IG9mIHdvcmsgaXNvbGF0ZWQgZnJvbSB0aGUgc2Vzc2lvbiBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVzZS1zZXNzaW9uLWNhY2hlLWFmdGVyLXRyYW5zYWN0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXNvbGF0ZS1uZXctZGF0YS1hZnRlci10cmFuc2FjdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imlzb2xhdGUtY2FjaGUtYWZ0ZXItdHJhbnNhY3Rpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpc29sYXRlLWNhY2hlLWFsd2F5cyIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtcXVlcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgYSBkYXRhYmFzZSBjb2x1bW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InF1ZXJ5LWtleSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQvY29sdW1uIGJlaW5nIGFsaWFzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uc2hpcC1xdWVyeS1rZXkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgYSBqb2luIHRvIGFub3RoZXIgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJxdWVyeS1rZXkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0YXJnZXQgcmVmZXJlbmNlZCBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGpvaW4gY29uZGl0aW9uIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IGNsYXNzJyB0YWJsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgam9pbiBjcml0ZXJpYSBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBjbGFzcycgdGFibGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUtcXVlcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgYSAxLTEgam9pbiB0byBhbm90aGVyIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLXF1ZXJ5LWtleSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW1hbnktcXVlcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgYSAxLW0gam9pbiBmcm9tIGFub3RoZXIgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLXF1ZXJ5LWtleSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtZGlyZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBmcm9tIGFuIGF0dGlyYnV0ZSB0byBhIHNpbXBsZSBmaWVsZCBkYXRhdHlwZSwgaS5lLiBTdHJpbmcsIE51bWJlciwgRGF0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIGFuZCBvcHRpb25hbGx5IHRoZSB0YWJsZSBvZiB0aGUgZmllbGQvY29sdW1uIHRoYXQgdGhlIGF0dHJpYnV0ZSBpcyBzdG9yZWQgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJudWxsLXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBhIHZhbHVlIHRoYXQgbnVsbCBkYXRhIHZhbHVlcyBzaG91bGQgYmUgY29udmVydGVkIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0idmFsdWUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGhvdyB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZSBvYmplY3QgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWNsYXNzaWZpY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBhdHRyaWJ1dGUgaXMgcGVyc2lzdGVkLiBUaGUgYXR0cmlidXRlIG1hcHBpbmcgZGVmaW5pdGlvbiBpcyBleHRlbmRhYmxlIHRvIGFsbG93IGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGF0dHJpYnV0ZSBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGF0dHJpYnV0ZSBpcyByZWFkLW9ubHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJnZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZ2V0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBzZXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvcGVydGllcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgZm9yIHVzZXIgZGVmaW5lZCBwcm9wZXJ0aWVzIHRvIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InByb3BlcnR5IiB0eXBlPSJwcm9wZXJ0eSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSB1c2VyIGRlZmluZWQgcHJvcGVydHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIHNpbXBsZSBhdHRyaWJ1dGUgaXMgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtZGlyZWN0LW1hcHBpbmciPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtZGlyZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBmcm9tIGFuIGF0dGlyYnV0ZSB0byBhIHNpbXBsZSBmaWVsZCBkYXRhdHlwZSwgaS5lLiBTdHJpbmcsIE51bWJlciwgRGF0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWRpcmVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpcy1jZGF0YSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibnVsbC1wb2xpY3kiIHR5cGU9ImFic3RyYWN0LW51bGwtcG9saWN5IiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWRpcmVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgZnJvbSBhbiBhdHRpcmJ1dGUgdG8gYSBzaW1wbGUgZmllbGQgZGF0YXR5cGUsIGkuZS4gU3RyaW5nLCBOdW1iZXIsIERhdGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWRpcmVjdC1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZmllbGQgdHJhbnNmb3JtYXRpb24gZm9yIGEgdHJhbnNmb3JtYXRpb24gbWFwcGluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLWJhc2VkLWZpZWxkLXRyYW5zZm9ybWF0aW9uIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zZm9ybWVyLWJhc2VkLWZpZWxkLXRyYW5zZm9ybWF0aW9uIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtdHJhbnNmb3JtYXRpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSB0cmFuc2Zvcm1hdGlvbiBtYXBwaW5nIHRoYXQgdXNlcyBKYXZhIGNvZGUgdG8gdHJhbnNmb3JtIGJldHdlZW4gdGhlIGRhdGEgYW5kIG9iamVjdCB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIGEgc2luZ2xlIGF0dHJpYnV0ZSBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcywgb3IgZmllbGQgb25seSBtYXBwaW5ncyBvciBhdHRyaWJ1dGUgb25seSBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0cmFuc2Zvcm1hdGlvbiBkZWZpbmVkIGluIHRoZSBkb21haW4gY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtdHJhbnNmb3JtZXIiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGNsYXNzIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0cmFuc2Zvcm1lci4gVXNlZCBpbiBwbGFjZSBvZiBhdHRyaWJ1dGUtdHJhbnNmb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkLXRyYW5zZm9ybWF0aW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgdHJhbnNmb3JtYXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iIHR5cGU9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiBhIHNpbmdsZSBhdHRyaWJ1dGUgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMsIG9yIGZpZWxkIG9ubHkgbWFwcGluZ3Mgb3IgYXR0cmlidXRlIG9ubHkgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiBhIHNpbmdsZSBhdHRyaWJ1dGUgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMsIG9yIGZpZWxkIG9ubHkgbWFwcGluZ3Mgb3IgYXR0cmlidXRlIG9ubHkgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiBhIHNpbmdsZSBhdHRyaWJ1dGUgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMsIG9yIGZpZWxkIG9ubHkgbWFwcGluZ3Mgb3IgYXR0cmlidXRlIG9ubHkgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFnZ3JlZ2F0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSByZWxhdGlvbnNoaXAgd2hlcmUgdGhlIHRhcmdldCBvYmplY3QgaXMgc3RyaWN0bHkgcHJpdmF0ZWx5IG93bmVkIGJ5IHRoZSBzb3VyY2Ugb2JqZWN0IGFuZCBzdG9yZXMgd2l0aGluIHRoZSBzb3VyY2Ugb2JqZWN0cyByb3c8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSB0YXJnZXQgY2xhc3Mgb2YgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImFsbG93LW51bGwiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgYSByb3cgb2YgYWxsIG51bGxzIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBudWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQtdHJhbnNsYXRpb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IGZvciB0aGUgbWFwcGluZyB0byB1c2UgZGlmZmVyZW50IGZpZWxkIG5hbWVzIHRoYW4gdGhlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC10cmFuc2xhdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb3VyY2UtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCBpbiB0aGUgc291cmNlIGRlc2NyaXB0b3IncyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCBpbiB0aGUgYWdncmVnYXRlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIGNsYXNzZXMgaXMgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHRhcmdldCBjbGFzcyBvZiB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHRhcmdldCBvYmplY3RzIGFyZSBwcml2YXRlbHkgb3duZWQgZGVwZW5kZW50IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBjcmVhdGUgb3BlcmF0aW9uIHNob3VsZCBiZSBjYXNjYWRlZCB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FzY2FkZS1tZXJnZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgY3JlYXRlIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FzY2FkZWQgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcmVmcmVzaCBvcGVyYXRpb24gc2hvdWxkIGJlIGNhc2NhZGVkIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYXNjYWRlLXJlbW92ZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcmVtb3ZlIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FzY2FkZWQgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS0xIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLW9uZS10by1vbmUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLTEgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvbmUtdG8tb25lLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1tYW55LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS1tIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgaW4gdGhlIHRhcmdldCBjbGFzcycgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRlbGV0ZS1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByZWxhdGVkIG9iamVjdHMgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1vbmUtdG8tbWFueS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtbSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic291cmNlLWZvcmVpZ24ta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0YXJnZXQtZm9yZWlnbi1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5LWdyb3VwaW5nLWVsZW1lbnQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRlbGV0ZS1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByZWxhdGVkIG9iamVjdHMgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIHNpbXBsZSB0eXBlcyByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIGEgc2V0IG9mIHNpbXBsZSBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJkYXRhLXJlYWQtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS10YWJsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBzb3VyY2UgcHJpbWFyeSBrZXkgYW5kIHRoZSBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXJlY3QtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZC9jb2x1bW4gaW4gdGhlIHJlZmVyZW5jZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgaW4gdGhlIHJlZmVyZW5jZSB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InZhbHVlLWNvbnZlcnRlciIgdHlwZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBob3cgdGhlIGRhdGEgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUgb2JqZWN0IHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5zZXJ0LXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGluc2VydCBhIHJvdyBpbnRvIHRoZSByZWZlcmVuY2UgdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYSByb3cgZnJvbSB0aGUgcmVmZXJlbmNlIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJvd3MgZnJvbSB0aGUgcmVmZXJlbmNlIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXNzaW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgc2Vzc2lvbiB0aGF0IGRlZmluZXMgdGhlIHJlZmVyZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imhpc3RvcnktcG9saWN5IiB0eXBlPSJoaXN0b3J5LXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBwYXN0IHZlcnNpb25zIG9mIHRoaXMgYXR0cmlidXRlIGFyZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGEtc3RvcmUuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gaGlzdG9yeSBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtbWFwLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gYSBzZXQgb2Yga2V5IHZhbHVlcyBwYWlycyBvZiBzaW1wbGUgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXJlY3Qta2V5LWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQvY29sdW1uIGluIHRoZSByZWZlcmVuY2UgdGFibGUgdGhhdCBzb3JlcyB0aGUgbWFwIGtleSBkYXRhIHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ia2V5LWNvbnZlcnRlciIgdHlwZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBob3cgdGhlIGtleSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9iamVjdCB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWdncmVnYXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLW0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlcyB3aGVyZSB0aGUgdGFyZ2V0IGluc3RhbmNlcyBhcmUgc3RyaWN0bHkgcHJpdmF0ZWx5IG93bmVkIGJ5IHRoZSBzb3VyY2Ugb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGluIHRoZSB0YXJnZXQgY2xhc3MnIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkZWxldGUtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcmVsYXRlZCBvYmplY3RzIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtLW0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxhdGlvbi10YWJsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcmVsYXRpb24gdGFibGUgdGhhdCBzdG9yZXMgdGhlIHNvdXJjZS90YXJnZXQgcHJpbWFyeSBrZXlzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZS1yZWxhdGlvbi1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGZyb20gdGhlIHJlbGF0aW9uYWwgdGFibGUgdG8gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LXJlbGF0aW9uLWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgZnJvbSB0aGUgcmVsYXRpb25hbCB0YWJsZSB0byB0aGUgdGFyZ2V0IGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5zZXJ0LXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGluc2VydCBhIHJvdyBpbnRvIHRoZSByZWxhdGlvbiB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhIHJvdyBmcm9tIHRoZSByZWxhdGlvbiB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByb3dzIGZyb20gdGhlIHJlbGF0aW9uIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJoaXN0b3J5LXBvbGljeSIgdHlwZT0iaGlzdG9yeS1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgcGFzdCB2ZXJzaW9ucyBvZiB0aGlzIGF0dHJpYnV0ZSBhcmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhLXN0b3JlLiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGhpc3RvcnkgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtMSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2UgdGhhdCBtYXkgYmUgb2Ygc2V2ZXJhbCB0eXBlcyByZWxhdGVkIHRocm91Z2ggYW4gaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idHlwZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgY29sdW1uIHRvIHN0b3JlIHRoZSBjbGFzcyB0eXBlIG9mIHRoZSByZWxhdGVkIG9iamVjdCBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JlaWduLWtleS10by1xdWVyeS1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygc291cmNlL3RhcmdldCBjb2x1bW4vcXVlcnkga2V5IHJlZmVyZW5jZXMgcmVsYXRpbmcgYSBmb3JlaWduIGtleSBpbiBvbmUgdGFibGUgdG8gdGhlIHF1ZXJ5IGtleXMgZGVmaW5pbmcgYSBwcmltYXJ5IG9yIHVuaXF1ZSBrZXkgdmFsdWUgaW4gdGhlIG90aGVyIGludGVyZmFjZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InF1ZXJ5LWtleS1yZWZlcmVuY2UiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJlZmVyZW5jZSBvZiBhIHNvdXJjZSB0YWJsZSBmb3JlaWduIGtleSBhbmQgYSB0YXJnZXQgaW50ZXJmYWNlIGRlc2NyaXB0b3IgcXVlcnkga2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic291cmNlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgZmllbGQvY29sdW1uIG5hbWUgaW4gdGhlIHNvdXJjZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtcXVlcnkta2V5IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeSBrZXkgbmFtZSBvZiB0aGUgdGFyZ2V0IGludGVyZmFjZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyIgdHlwZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgY2xhc3MgaW5kaWNhdG9yIHZhbHVlcyBhbmQgdGhlIHN1YmNsYXNzZXMgdGhleSBtYXAgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29udGFpbmVyL2NvbGxlY3Rpb24gdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbGxlY3Rpb24tdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbiBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic29ydGVkLWNvbGxlY3Rpb24tY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzb3J0ZWQgY29sbGVjdGlvbiB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb21wYXJhdG9yLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbXBhcml0b3IsIHVzZWQgdG8gY29tcGFyZSBvYmplY3RzIGluIHNvcnRpbmcgdGhlIGNvbGxlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imxpc3QtY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBsaXN0IGNvbGxlY3Rpb24gdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwIGNvbnRhaW5lciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtYXAta2V5LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIG1ldGhvZCB0byBjYWxsIG9uIHRoZSB0YXJnZXQgb2JqZWN0cyB0byBnZXQgdGhlIGtleSB2YWx1ZSBmb3IgdGhlIG1hcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LW1hcC1jb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRpcmVjdCBtYXAgY29udGFpbmVyIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjcm9sbGFibGUtY3Vyc29yLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzY3JvbGxhYmxlIGN1cnNvciBjb250YWluZXIgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3Vyc29yZWQtc3RyZWFtLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjdXJzb3JlZCBzdHJlYW0gY29udGFpbmVyIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluZGlyZWN0aW9uLXBvbGljeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGVmZXJyZWQgcmVhZCBpbmRpcmVjdGlvbiBtZWNoYW5pc20uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZS1ob2xkZXItaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB1c2FnZSBvZiB2YWx1ZSBob2xkZXJzIHRvIGltcGxlbWVudCBpbmRpcmVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5kaXJlY3Rpb24tcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm94eS1pbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHVzYWdlIG9mIHByb3hpZXMgdG8gaW1wbGVtZW50IGluZGlyZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmRpcmVjdGlvbi1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zcGFyZW50LWNvbGxlY3Rpb24taW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB1c2FnZSBvZiB0cmFuc3BhcmVudCBjb2xsZWN0aW9ucyB0byBpbXBsZW1lbnQgaW5kaXJlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29sbGVjdGlvbi10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gaW50ZXJmYWNlIHRvIHVzZSwgaS5lLiBMaXN0LCBTZXQsIE1hcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1hcC1rZXktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgbWV0aG9kIHRvIGNhbGwgb24gdGhlIHRhcmdldCBvYmplY3RzIHRvIGdldCB0aGUga2V5IHZhbHVlIGZvciB0aGUgbWFwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250YWluZXItaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB1c2FnZSBvZiBhIHVzZXIgZGVmaW5lZCBjb250YWluZXIgdG8gaW1wbGVtZW50IGluZGlyZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb250YWluZXIgaW1wbGVtZW50ZXIgdG8gdXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlc2FmZS1lbnVtZXJhdGlvbi1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UeXBlc2FmZSBFbnVtZXJhdGlvbiBjb252ZXJzaW9uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZhbHVlLWNvbnZlcnRlciIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1jb252ZXJzaW9uLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZGF0YSB0eXBlIGFuZCBhbiBvYmplY3QgdHlwZSBvZiB0aGUgYXR0cmlidXRlIHRvIGNvbnZlcnQgYmV0d2Vlbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvYmplY3QtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkYXRhLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZXMgc3RvcmFnZSBkYXRhIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcmlhbGl6ZWQtb2JqZWN0LWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgb2JqZWN0IHNlcmlhbGl6YXRpb24gdG8gY29udmVydCBiZXR3ZWVuIHRoZSBvYmplY3QgYW5kIGRhdGEgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgYXR0cmlidXRlcyBzdG9yYWdlIGRhdGEgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgbWFwcGluZyBvZiB2YWx1ZXMgZnJvbSBkYXRhYmFzZSB2YWx1ZXMgdXNlZCBpbiB0aGUgZmllbGQgYW5kIG9iamVjdCB2YWx1ZXMgdXNlZCBpbiB0aGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFuIG9wdGlvbmFsIGRlZmF1bHQgdmFsdWUgY2FuIGJlIHNwZWNpZmllZC4gIFRoaXMgdmFsdWUgaXMgdXNlZCBpZiBhIGRhdGFiYXNlIHR5cGUgaXMgbm90IGZvdW5kIGluIHRoZSB0eXBlIG1hcHBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1tYXBwaW5ncyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIG1hcHBpbmcgb2YgdmFsdWVzLiAgQm90aCB0aGUgb2JqZWN0IGFuZCBkYXRhYmFzZSB2YWx1ZXMgbXVzdCBiZSB1bmlxdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idHlwZS1tYXBwaW5nIiB0eXBlPSJ0eXBlLW1hcHBpbmciPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgb2JqZWN0IGFuZCBkYXRhIHZhbHVlIG1hcHBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS1vbmx5LXR5cGUtbWFwcGluZ3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgbWFwcGluZyBvZiBhZGRpdGlvbmFsIHZhbHVlcyB0aGF0IG1hcCBub24tdW5pcXVlIGRhdGEgdmFsdWVzIHRvIGEgdW5pcXVlIGF0dHJpYnV0ZSB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ0eXBlLW1hcHBpbmciIHR5cGU9InR5cGUtbWFwcGluZyI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBvYmplY3QgYW5kIGRhdGEgdmFsdWUgbWFwcGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgYW4gb2JqZWN0IGFuZCBkYXRhIHZhbHVlIG1hcHBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSB2YWx1ZSB0byB1c2UgaW4gdGhlIG9iamVjdCdzIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhLXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSB2YWx1ZSB0byB1c2UgaW4gdGhlIGRhdGFiYXNlIGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhYmFzZS1xdWVyeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkvaW50ZXJhY3Rpb24gYWdhaW5zdCBhIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJxdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0ibWFpbnRhaW4tY2FjaGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcnkgc2hvdWxkIGJ5cGFzcyB0aGUgY2FjaGUgY29tcGxldGVseS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpbmQtYWxsLXBhcmFtZXRlcnMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcnkgc2hvdWxkIHVzZSBwYXJhbWF0ZXIgYmluZGluZyBmb3IgYXJndW1lbnRzLCBvciBwcmludCB0aGUgYXJndW1lbnRzIGluLWxpbmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYWNoZS1zdGF0ZW1lbnQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcmllcyBzdGF0ZW1lbnQgc2hvdWxkIGJlIGNhY2hlZCwgdGhpcyBtdXN0IGJlIHVzZWQgd2l0aCBwYXJhbWV0ZXIgYmluZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InRpbWVvdXQiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIHRpbWVvdXQgdG8gY2FuY2VsIHRoZSBxdWVyeSBpbiBpZiB0aGUgcmVxdWVzdCB0YWtlcyB0b28gbG9uZyB0byBjb21wbGV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InByZXBhcmUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcnkgc2hvdWxkIHByZXBhcmUgYW5kIGNhY2hlIGl0cyBnZW5lcmF0ZWQgU1FMLCBvciByZWdlbmVyYXRlIHRoZSBTUUwgb24gZWFjaCBleGVjdXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYWxsIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3Igc3RhdGljIGNhbGxzIHRoZSBTUUwgb3IgU3RvcmVkIFByb2NlZHVyZSBjYWxsIGRlZmluaXRpb24gY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqb2luLWZldGNoLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgam9pbiBmZXRjaCBvcHRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlubmVyLWpvaW4iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvdXRlci1qb2luIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FzY2FkZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgY2FzY2FkZSBwb2xpY2llcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwcml2YXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhbHVlLXJlYWQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHJlYWRpbmcgYSBzaW5nbGUgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRpcmVjdC1yZWFkLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtcmVhZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgcmVhZGluZyBhIGNvbGxlY3Rpb24gb2YgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhLXJlYWQtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGEtcmVhZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgcmVhZGluZyByYXcgZGF0YS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVhZC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtcXVlcnkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciByZWFkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhY2hlLXF1ZXJ5LXJlc3VsdHMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcnkgc2hvdWxkIGNhY2hlIHRoZSBxdWVyeSByZXN1bHRzIHRvIGF2b2lkIGZ1dHVyZSBleGVjdXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWF4LXJvd3MiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byBmZXRjaCwgcmVzdWx0cyB3aWxsIGJlIHRydW5jdGF0ZSBvbiB0aGUgZGF0YWJhc2UgdG8gdGhpcyBzaXplLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmlyc3QtcmVzdWx0IiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgd2hlcmUgdG8gc3RhcnQgdGhlIGN1cnNvciBpbiBhIHJlc3VsdCBzZXQgcmV0dXJuZWQgZnJvbSB0aGUgZGF0YWJhc2UuIFJlc3VsdHMgcHJpb3IgdG8gdGhpcyBudW1iZXIgd2lsbCBub3QgYmUgYnVpbHQgaW50byBvYmplY3RzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmZXRjaC1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXNzIHRoZSBudW1iZXIgb2Ygcm93cyB0byBmZXRjaCBmcm9tIHRoZSBkYXRhYmFzZSBvbiBlYWNoIHJlc3VsdCBzZXQgbmV4dCBvcGVyYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxdWVyeS1yZXN1bHQtY2FjaGUtcG9saWN5IiB0eXBlPSJxdWVyeS1yZXN1bHQtY2FjaGUtcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IHRoZSBxdWVyeSByZXN1bHRzIHNob3VsZCBiZSBjYWNoZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LXJlc3VsdC1jYWNoZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIHF1ZXJ5J3MgcmVzdWx0cyBzaG91bGQgYmUgY2FjaGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW52YWxpZGF0aW9uLXBvbGljeSIgdHlwZT0iY2FjaGUtaW52YWxpZGF0aW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5LiBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjEwMCIgbmFtZT0ibWF4aW11bS1jYWNoZWQtcmVzdWx0cyIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIHF1ZXJ5IHJlc3VsdCBzZXRzIHRoYXQgd2lsbCBiZSBjYWNoZWQuIFRoZSBMUlUgcXVlcnkgcmVzdWx0cyB3aWxsIGJlIGRpc2NhcmRlZCB3aGVuIHRoZSBtYXggc2l6ZSBpcyByZWFjaGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgbWFuaXB1bGF0aW5nIGRhdGEuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtbW9kaWZ5LXF1ZXJ5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgbW9kaWZ5aW5nIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVwZGF0ZS1vYmplY3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHVwZGF0aW5nIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LW1vZGlmeS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5zZXJ0LW9iamVjdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgaW5zZXJ0aW5nIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LW1vZGlmeS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVsZXRlLW9iamVjdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgZGVsZXRpbmcgYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbW9kaWZ5LXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkb2VzLWV4aXN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBkZXRlcm1pbmluZyBpZiBhbiBvYmplY3QgZXhpc3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZXhpc3RlbmNlLWNoZWNrIiB0eXBlPSJleGlzdGVuY2UtY2hlY2siPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGV4aXN0ZW5jZSBjaGVjayBvcHRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNrIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGV4aXN0ZW5jZSBjaGVjayBvcHRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hlY2stY2FjaGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGVjay1kYXRhYmFzZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzc3VtZS1leGlzdGVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhc3N1bWUtbm9uLWV4aXN0ZW5jZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBkZWxldGluZyBhIGNyaXRlcmlhIG9mIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtbGV2ZWwtcmVhZC1xdWVyeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIG9iamVjdHMgKGFzIGFwcG9zZWQgdG8gZGF0YSkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlYWQtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbCBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3Mgb2Ygb2JqZWN0cyBiZWluZyBxdWVyaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHF1ZXJ5IHNob3VsZCByZWZyZXNoIGFueSBjYWNoZWQgb2JqZWN0cyBmcm9tIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZW1vdGUtcmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcXVlcnkgc2hvdWxkIHJlZnJlc2ggYW55IHJlbW90ZWx5IGNhY2hlZCBvYmplY3RzIGZyb20gdGhlIHNlcnZlci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImNhc2NhZGUtcG9saWN5IiB0eXBlPSJjYXNjYWRlLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJpZXMgc2V0dGluZ3MgKHN1Y2ggYXMgcmVmcmVzaCwgbWFpbnRhaW4tY2FjaGUpIHNob3VsZCBhcHBseSB0byB0aGUgb2JqZWN0J3MgcmVsYXRpb25zaGlwIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJwcmltYXJ5LWtleSIgbmFtZT0iY2FjaGUtdXNhZ2UiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBob3cgdGhlIHF1ZXJ5IHNob3VsZCBpbnRlcmFjdCB3aXRoIHRoZSBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImxvY2stbW9kZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBxdWVyeSBzaG91bGQgbG9jayB0aGUgcmVzdWx0aW5nIHJvd3Mgb24gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iZGlzdGluY3Qtc3RhdGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcXVlcnkgc2hvdWxkIGZpbHRlciBkaXN0aW5jdCByZXN1bHRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW4tbWVtb3J5LXF1ZXJ5aW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbiBtZW1vcnkgcXVlcnlpbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgZGVmYXVsdD0iaWdub3JlLWV4Y2VwdGlvbnMtcmV0dXJuLWNvbmZvcm1lZCIgbmFtZT0icG9saWN5IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IGluZGlyZWN0aW9uIG9yIHVuY29uZm9ybWFibGUgZXhwcmVzc2lvbnMgc2hvdWxkIGJlIHRyZWF0aW5nIHdpdGggaW4tbWVtb3J5IHF1ZXJ5aW5nIGFuZCBjb25mb3JtaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJ1c2UtZGVmYXVsdC1mZXRjaC1ncm91cCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgZGVmYXVsdCBmZXRjaCBncm91cCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmV0Y2gtZ3JvdXAiIHR5cGU9ImZldGNoLWdyb3VwIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBxdWVyeSB0byBwYXJ0aWFsbHkgZmV0Y2ggdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZldGNoLWdyb3VwLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBhIHByZS1kZWZpbmVkIG5hbWVkIGZldGNoIGdyb3VwIHRvIGFsbG93IHRoZSBxdWVyeSB0byBwYXJ0aWFsbHkgZmV0Y2ggdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UtZXhjbHVzaXZlLWNvbm5lY3Rpb24iIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGV4Y2x1c2l2ZSBjb25uZWN0aW9uIChWUEQpIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJqb2luZWQtYXR0cmlidXRlLWV4cHJlc3Npb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgYXR0cmlidXRlcyBiZWluZyBqb2luZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJleHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBmb3Igam9pbmluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIG9iamVjdHMgcmVzdWx0aW5nIGZyb20gdGhlIHF1ZXJ5IGFyZSByZWFkLW9ubHksIGFuZCB3aWxsIG5vdCBiZSByZWdpc3RlcmVkIGluIHRoZSB1bml0IG9mIHdvcmsuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ib3V0ZXItam9pbi1zdWJjbGFzc2VzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgaW5oZXJpdGFuY2UgcXVlcmllcyBzcGVjaWZ5IGlmIGFsbCBzdWJjbGFzc2VzIHNob3VsZCBiZSBvdXRlciBqb2luZWQsIGluc3RlYWQgb2YgYSBxdWVyeSBwZXIgc3ViY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBhIHNldCBvZiBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbGV2ZWwtcmVhZC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiYXRjaC1yZWFkLWF0dHJpYnV0ZS1leHByZXNzaW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYWxsIGF0dHJpYnV0ZXMgZm9yIGJhdGNoIHJlYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJleHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBmb3IgYmF0Y2ggcmVhZGluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvcmRlci1ieS1leHByZXNzaW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXRzIHRoZSBvcmRlciBleHByZXNzaW9ucyBmb3IgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIG9yZGVyaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC1vYmplY3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGEgc2luZ2xlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LWxldmVsLXJlYWQtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlcG9ydC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlF1ZXJ5IGZvciBpbmZvcm1hdGlvbiBhYm91dCBhIHNldCBvZiBvYmplY3RzIGluc3RlYWQgb2YgdGhlIG9iamVjdHMgdGhlbXNlbHZlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybi1jaG9pY2UiIHR5cGU9InJldHVybi1jaG9pY2UiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2ltcGxpZmllcyB0aGUgcmVzdWx0IGJ5IG9ubHkgcmV0dXJuaW5nIHRoZSBmaXJzdCByZXN1bHQsIGZpcnN0IHZhbHVlLCBvciBhbGwgYXR0cmlidXRlIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHJpZXZlLXByaW1hcnkta2V5cyIgdHlwZT0icmV0cmlldmUtcHJpbWFyeS1rZXlzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB3ZXRoZXIgdGhlIHByaW1hcnkga2V5IHZhbHVlcyBzaG91bGQgYWxzbyBiZSByZXRyaWV2ZWQgZm9yIHRoZSByZWZlcmVuY2UgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXBvcnQtaXRlbXMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SXRlbXMgdG8gYmUgc2VsZWN0ZWQsIHRoZXNlIGNvdWxkIGJlIGF0dHJpYnV0ZXMgb3IgYWdncmVnYXRlIGZ1bmN0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9Iml0ZW0iIHR5cGU9InJlcG9ydC1pdGVtIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gaXRlbSByZXF1ZXN0ZWQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZ3JvdXAtYnktZXhwcmVzc2lvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2V0cyBHUk9VUCBCWSBleHByZXNzaW9ucyBmb3IgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIGdyb3VwaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJyZXR1cm4tY2hvaWNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2ltcGxpZmllcyB0aGUgcmVzdWx0IGJ5IG9ubHkgcmV0dXJuaW5nIHRoZSBmaXJzdCByZXN1bHQsIGZpcnN0IHZhbHVlLCBvciBhbGwgYXR0cmlidXRlIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJldHVybi1zaW5nbGUtcmVzdWx0IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmV0dXJuLXNpbmdsZS12YWx1ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJldHVybi1zaW5nbGUtYXR0cmlidXRlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icmV0cmlldmUtcHJpbWFyeS1rZXlzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdldGhlciB0aGUgcHJpbWFyeSBrZXkgdmFsdWVzIHNob3VsZCBhbHNvIGJlIHJldHJpZXZlZCBmb3IgdGhlIHJlZmVyZW5jZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZ1bGwtcHJpbWFyeS1rZXkiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaXJzdC1wcmltYXJ5LWtleSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vLXByaW1hcnkta2V5IiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlcG9ydC1pdGVtIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBpdGVtIHJlcXVlc3RlZCBpbiBSZXBvcnRRdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5OYW1lIGdpdmVuIGZvciBpdGVtLCBjYW4gYmUgdXNlZCB0byByZXRpZXZlIHZhbHVlIGZyb20gcmVzdWx0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1leHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeHByZXNzaW9uIChwYXJ0aWFsKSB0aGF0IGRlc2NyaWJlcyB0aGUgYXR0cmlidXRlIHdhbnRlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXhwcmVzc2lvbiIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZmlsdGVyIGV4cHJlc3Npb24gdHJlZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcmVsYXRpb24gZXhwcmVzc2lvbiB0aGF0IGNvbXBhcmVzIHRvIGV4cHJlc3Npb25zIHRocm91Z2ggb3BlcmF0b3JzIHN1Y2ggYXMgZXF1YWwsIGxlc3NUaGFuLCBldGMuLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGVmdCIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmlnaHQiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRvciIgdHlwZT0ib3BlcmF0b3IiIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2ljLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZXhwcmVzc2lvbiBjb21wb3NlZCBvZiB0d28gc3ViLWV4cHJlc3Npb25zIGpvaW5lZCB0aHJvdWdoIGFuIG9wZXJhdG9yIHN1Y2ggYXMgQU5ELCBPUi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxlZnQiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJpZ2h0IiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0b3IiIHR5cGU9Im9wZXJhdG9yIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmdW5jdGlvbi1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgYSBmdW5jdGlvbiBhcHBsaWVkIHRvIGEgbGlzdCBvZiBzdWItZXhwcmVzc2lvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBmdW5jdGlvbiBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFyZ3VtZW50IGV4cHJlc3Npb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZnVuY3Rpb24iIHR5cGU9Im9wZXJhdG9yIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25zdGFudC1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIHZhbHVlLiAgSWYgdGhlIHZhbHVlIGlzIG51bGwgdGhlIHZhbHVlIHRhZyBjYW4gaXMgYWJzZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1rZXktZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiBxdWVyeS1rZXkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNlIiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYW55LW9mIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3V0ZXItam9pbiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2UiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXJhbWV0ZXItZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiBwYXJhbWV0ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzZS1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIGJ1aWxkZXIvYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcGVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBvcGVyYXRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzcWwtY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gU1FMIHF1ZXJ5IGxhbmd1YWdlIHN0cmluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGwgU1FMIHF1ZXJ5IHN0cmluZy4gIEFyZ3VtZW50cyBjYW4gYmUgc3BlY2lmaWVkIHRocm91Z2ggI2FyZy1uYW1lIHRva2VucyBpbiB0aGUgc3RyaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamJxbC1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBFSkItUUwgcXVlcnkgbGFuZ3VhZ2Ugc3RyaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYnFsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBFSkItUUwgcXVlcnkgc3RyaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdG9yZWQtcHJvY2VkdXJlLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBpbnZvY2F0aW9uIGRlZmluaXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvY2VkdXJlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjdXJzb3Itb3V0cHV0LXByb2NlZHVyZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBjYWxsIHRvIHVzZSBhIGN1cnNvciBvdXRwdXQgcGFyYW1ldGVyIHRvIGRlZmluZSB0aGUgcmVzdWx0IHNldC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhbmQgb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJwcm9jZWR1cmUtYXJndW1lbnQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhcmd1bWVudCB0byB0aGUgcHJvY2VkdXJlLiBUaGUgb3JkZXIgb2YgdGhlIGFyZ3VtZW50cyBtdXN0IG1hdGNoIHRoZSBwcm9jZWR1cmUgYXJndW1lbnRzIGlmIG5vdCBuYW1lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdG9yZWQtZnVuY3Rpb24tY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgZnVuY3Rpb24gaW52b2NhdGlvbiBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzdG9yZWQtcHJvY2VkdXJlLWNhbGwiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG5hbWU9InN0b3JlZC1mdW5jdGlvbi1yZXN1bHQiIHR5cGU9InByb2NlZHVyZS1vdXRwdXQtYXJndW1lbnQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgc3RvcmVkLWZ1bmN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBjYWxsIGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzdG9yZWQgcHJvY2VkdXJlIG5hbWUgb2YgdGhlIGFyZ3VtZW50LiBGb3IgaW5kZXhlZCBhcmd1bWVudCB0aGUgbmFtZSBpcyBub3QgcmVxdWlyZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkgbmFtZSBvZiB0aGUgYXJndW1lbnQuIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGFzIGRlZmluZSBpbiB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhcmd1bWVudCBjbGFzcyB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50LXNxbHR5cGUiIHR5cGU9InhzZDppbnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBKREJDIGludCB0eXBlIG9mIHRoZSBhcmd1bWVudCwgYXMgZGVmaW5lZCBpbiBqYXZhLmpkYmMuVHlwZXM8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudC1zcWx0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSB0eXBlIGlmIHByb2NlZHVyZS1hcmd1bWVudC1zcWx0eXBlIGlzIFNUUlVDVCBvciBBUlJBWTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnQtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcHJvY2VkdXJlIGFyZ3VtZW50IHZhbHVlIG1heWJlIGJlIHNwZWNpZmllZCBpZiBub3QgdXNpbmcgYSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvY2VkdXJlLW91dHB1dC1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGNhbGwgb3V0cHV0IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwcm9jZWR1cmUtYXJndW1lbnQiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb2NlZHVyZS1pbm91dHB1dC1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGNhbGwgb3V0cHV0IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwcm9jZWR1cmUtYXJndW1lbnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvdXRwdXQtYXJndW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkgbmFtZSBvZiB0aGUgYXJndW1lbnQuIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGFzIGRlZmluZSBpbiB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLXN0b3JlZC1wcm9jZWR1cmUtY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGludm9jYXRpb24gZGVmaW5pdGlvbiB3aG9zZSBhcmd1bWVudHMgY29udGFpbiBhdCBsZWFzdCBvbmUgT3JhY2xlIFBML1NRTCB0eXBlIHRoYXQgaGFzIG5vIEpEQkMgcmVwcmVzZW50YXRpb24gKGUuZy4gQk9PTEVBTiwgUExTX0lOVEVHRVIsIFBML1NRTCByZWNvcmQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb2NlZHVyZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFuZCBvdXRwdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYXJndW1lbnQgdG8gdGhlIHByb2NlZHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGV4IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGlyZWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqZGJjLXR5cGUiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtdHlwZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLXJlY29yZCI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29tcGF0aWJsZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImphdmEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZmllbGRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYXJndW1lbnQgdG8gdGhlIHByb2NlZHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb21wYXRpYmxlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iamF2YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5lc3RlZC10eXBlIiB0eXBlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhbiBFSVMgcmVjb3JkIGRhdGEgc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcmVjb3JkIHN0cnVjdHVyZSBuYW1lIHRoZSBkZXNjcmlwdG9yIG1hcHMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuYW1lc3BhY2UtcmVzb2x2ZXIiIHR5cGU9Im5hbWVzcGFjZS1yZXNvbHZlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZXNwYWNlIHJlc29sdmVyIGZvciB0aGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwcGVkLWludGVyYWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBFSVMgaW50ZXJhY3Rpb24gdXRpbGl6aW5nIE1hcHBlZFJlY29yZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LXJlc3VsdC1wYXRoIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBpbnB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im91dHB1dC1yZXN1bHQtcGF0aCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgb3V0cHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im91dHB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWludGVyYWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBFSVMgaW50ZXJhY3Rpb24gdXRpbGl6aW5nIFhNTCByZWNvcmRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtcmVjb3JkLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgdG8gdXNlIGZvciB0aGUgaW5wdXQgcmVjb3JkLCBpZiByZXF1aXJlZCBieSB0aGUgYWRhcHRlci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LXJvb3QtZWxlbWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBvdXRwdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1yZXN1bHQtcGF0aCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgaW5wdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtcmVzdWx0LXBhdGgiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIG91dHB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluZGV4ZWQtaW50ZXJhY3Rpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIEVJUyBpbnRlcmFjdGlvbiB1dGlsaXppbmcgSW5kZXhlZCByZWNvcmRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im91dHB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGludGVyYWN0aW9uIGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnQtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcHJvY2VkdXJlIGFyZ3VtZW50IHZhbHVlIG1heWJlIGJlIHNwZWNpZmllZCBpZiBub3QgdXNpbmcgYSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbnRlcmFjdGlvbiBuYW1lIG9mIHRoZSBhcmd1bWVudC4gRm9yIGluZGV4ZWQgYXJndW1lbnRzIHRoZSBuYW1lIGlzIG5vdCByZXF1aXJlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXJndW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkgbmFtZSBvZiB0aGUgYXJndW1lbi4gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgYXMgZGVmaW5lIGluIHRoZSBxdWVyeSwgb3IgdGhlIGRlc2NyaXB0b3IgZmllbGQgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1yZWxhdGlvbmFsLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjbGFzcyBtYXBwaW5nIHRvIGEgU3RydWN0dXJlIHR5cGUgaW4gYW4gb2JqZWN0LXJlbGF0aW9uYWwgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uYWwtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzdHJ1Y3R1cmUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIG9iamVjdCBzdHJ1Y3R1cmUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkLW9yZGVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBvcmRlcmVkIGxpc3Qgb2YgdGhlIGZpZWxkIGRlZmluZWQgaW4gdGhlIHN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5lc3RlZC10YWJsZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtbS9tLW0gcmVsYXRpb25zaGlwIHRoYXQgbWFrZXMgdXNlIG9mIHRoZSBvYmplY3QtcmVsYXRpb25hbCBuZXN0ZWQtdGFibGUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkL2NvbHVtbiBpbiB0aGUgc291cmNlIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBuZXN0ZWQtdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHR5cGUgbmFtZSBvZiB0aGUgbmVzdGVkLXRhYmxlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFycmF5LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBwcmltaXRpdmUvc2ltcGxlIHR5cGUgdmFsdWVzIHVzaW5nIHRoZSBvYmplY3QtcmVsYXRpb25hbCBhcnJheSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHR5cGUgbmFtZSBvZiB0aGUgc3RydWN0dXJlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1hcnJheS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0LXR5cGVzIHVzaW5nIHRoZSBvYmplY3QtcmVsYXRpb25hbCBhcnJheSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHR5cGUgbmFtZSBvZiB0aGUgc3RydWN0dXJlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0cnVjdHVyZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0cnVjdHVyZSBvZiBvYmplY3QtdHlwZXMgdXNpbmcgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHN0cnVjdHVyZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlZmVyZW5jZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHJlZmVyZW5jZSB0byBhbm90aGVyIG9iamVjdC10eXBlIHVzaW5nIHRoZSBvYmplY3QtcmVsYXRpb25hbCByZWZlcmVuY2UgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIGluIHRoZSBzb3VyY2UgdHlwZSB0aGF0IHN0b3JlcyB0aGUgcmVmZXJlbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtcmVsYXRpb25hbC1maWVsZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gT2JqZWN0UmVsYXRpb25hbERhdGFiYXNlRmllbGQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5lc3RlZC10eXBlLWZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC14bWwtdHlwZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRpcmVjdCBtYXBwaW5nIHRvIGFuIE9yYWNsZSBYREIgWE1MIFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRpcmVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWFkLXdob2xlLWRvY3VtZW50IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRpcmVjdCBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXIiIHR5cGU9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgaG93IHRoZSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9iamVjdCB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InZhbHVlLWNvbnZlcnRlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgYSB1c2VyIGRlZmluZWQgY29udmVydGVyIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb2xsZWN0aW9uLXJlZmVyZW5jZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtTSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIFhNTCBlbGVtZW50IHRvIHRoZSB0YXJnZXQgWE1MIGVsZW1lbnQgYmFzZWQgb24gYSBrZXkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhtbC1vYmplY3QtcmVmZXJlbmNlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lcnBvbGljeSIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZXMtc2luZ2xlLW5vZGUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLW9iamVjdC1yZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLTEgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBYTUwgZWxlbWVudCB0byB0aGUgdGFyZ2V0IFhNTCBlbGVtZW50IGJhc2VkIG9uIG9uZSBvciBtb3JlIGtleXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFnZ3JlZ2F0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic291cmNlLXRvLXRhcmdldC1rZXktZmllbGQtYXNzb2NpYXRpb24iIHR5cGU9ImZvcmVpZ24ta2V5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNvdXJjZS10by10YXJnZXQta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLWNkYXRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgbmVzdGVkIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIG5lc3RlZCBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0JICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLWF0dHJpYnV0ZSIgbWluT2NjdXJzPSIwIi8+Ci0JICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLWdldC1tZXRob2QiIG1pbk9jY3Vycz0iMCIvPgotCSAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1zZXQtbWV0aG9kIiBtaW5PY2N1cnM9IjAiLz4KLQk8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgbmVzdGVkIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIG9iamVjdCBtYXBwaW5nIGZvciBhbiBYTUwgbmVzdGVkIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLQkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItYXR0cmlidXRlIiBtaW5PY2N1cnM9IjAiLz4KLQkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItZ2V0LW1ldGhvZCIgbWluT2NjdXJzPSIwIi8+Ci0JICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXNldC1tZXRob2QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb21wb3NpdGUgb2JqZWN0IG1hcHBpbmcgZm9yIGFuIFhNTCBuZXN0ZWQgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJudWxsLXBvbGljeSIgdHlwZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBvYmplY3QgbWFwcGluZyBmb3IgYW4gWE1MIG5lc3RlZCBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhbiBYTUwgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZGVmYXVsdC1yb290LWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdGhlIGRlc2NyaXB0b3IgbWFwcyB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtcm9vdC1lbGVtZW50LWZpZWxkIiB0eXBlPSJub2RlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBYTUxGaWVsZCByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgcm9vdCBlbGVtZW50IG9mIHRoZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2hvdWxkLXByZXNlcnZlLWRvY3VtZW50IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgaWYgbm9kZXMgc2hvdWxkIGJlIGNhY2hlZCB0byBwcmVzZXJ2ZSB1bm1hcHBlZCBkYXRhPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuYW1lc3BhY2UtcmVzb2x2ZXIiIHR5cGU9Im5hbWVzcGFjZS1yZXNvbHZlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZXNwYWNlIHJlc29sdmVyIGZvciB0aGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNjaGVtYSIgdHlwZT0ic2NoZW1hLXJlZmVyZW5jZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbG9jYXRpb24gb2YgdGhlIFhNTCBTY2hlbWEuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hbnktY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBjb2xsZWN0aW9uIHRvIGFuIHhzOmFueSBkZWNsYXJhdGlvbiBvciB4czphbnlUeXBlIGVsZW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS14bWwtcm9vdCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ia2VlcC1hcy1lbGVtZW50LXBvbGljeSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hbnktYXR0cmlidXRlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gdG8gYW4geHM6YW55IGRlY2xhcmF0aW9uIG9yIHhzOmFueVR5cGUgZWxlbWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hbnktb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIHNpbmdsZSBvYmplY3QgdG8gYW4geHM6YW55IGRlY2xhcmF0aW9uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS14bWwtcm9vdCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtZnJhZ21lbnQtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgc2luZ2xlIE5vZGUgdG8gYSBmcmFnbWVudCBvZiBhbiBYTUwgZG9jdW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieG1sLWRpcmVjdC1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtZnJhZ21lbnQtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBjb2xsZWN0aW9uIG9mIE5vZGVzIHRvIGEgZnJhZ21lbnQgb2YgYW4gWE1MIGRvY3VtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1iaW5hcnktZGF0YS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBiaW5hcnkgb2JqZWN0IHRvIGJhc2U2NCBiaW5hcnk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieG1sLWRpcmVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpcy1zd2EtcmVmIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtaW1lLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2hvdWxkLWlubGluZS1kYXRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jaG9pY2UtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBjb2xsZWN0aW9uIHRvIGEgY2hvaWNlIHN0cnVjdHVyZSBpbiBhbiB4bWwgZG9jdW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItcG9saWN5IiB0eXBlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtdG8tY2xhc3MtYXNzb2NpYXRpb24iIHR5cGU9InhtbC1jaG9pY2UtZmllbGQtdG8tY2xhc3MtYXNzb2NpYXRpb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY2hvaWNlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBjb2xsZWN0aW9uIHRvIGEgY2hvaWNlIHN0cnVjdHVyZSBpbiBhbiB4bWwgZG9jdW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtdG8tY2xhc3MtYXNzb2NpYXRpb24iIHR5cGU9InhtbC1jaG9pY2UtZmllbGQtdG8tY2xhc3MtYXNzb2NpYXRpb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY2hvaWNlLWZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InhtbC1maWVsZCIgdHlwZT0ibm9kZSIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29udmVyc2lvbi1wYWlyIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InFuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIFhQYXRoIGV4cHJlc3Npb24gdG8gYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUgaW4gYW4gWE1MIGRvY3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zaXRpb24iIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBwb3NpdGlvbiBvZiB0aGUgbm9kZSBpbiB0aGUgcGFyZW50IHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0eXBlZC10ZXh0LWZpZWxkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0aGlzIGlzIGEgdHlwZWQgdGV4dCBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNpbmdsZS1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgaWYgZWFjaCBpdGVtIGluIHRoZSBjb2xsZWN0aW9uIGlzIGluIHRoZSBzYW1lIG5vZGUgaW5zdGVhZCBvZiBoYXZpbmcgb25lIG5vZGUgcGVyIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb248L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJzY2hlbWEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2NoZW1hIHR5cGUgb2YgdGhlIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ieG1sLXRvLWphdmEtY29udmVyc2lvbi1wYWlyIiB0eXBlPSJ4bWwtY29udmVyc2lvbi1wYWlyIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJqYXZhLXRvLXhtbC1jb252ZXJzaW9uLXBhaXIiIHR5cGU9InhtbC1jb252ZXJzaW9uLXBhaXIiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibGVhZi1lbGVtZW50LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHRoZSBlbGVtZW50cyB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlvbi1ub2RlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VXNlIHRvIHJlcHJlc2VudCBub2RlcyB3aGljaCBhcmUgbWFwcGVkIHRvIHVuaW9uczwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idHlwZWQtdGV4dC1maWVsZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgdGhpcyBpcyBhIHR5cGVkIHRleHQgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaW5nbGUtbm9kZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIGlmIGVhY2ggaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBpcyBpbiB0aGUgc2FtZSBub2RlIGluc3RlYWQgb2YgaGF2aW5nIG9uZSBub2RlIHBlciBpdGVtIGluIHRoZSBjb2xsZWN0aW9uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ic2NoZW1hLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNjaGVtYSB0eXBlIG9mIHRoZSBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InhtbC10by1qYXZhLWNvbnZlcnNpb24tcGFpciIgdHlwZT0ieG1sLWNvbnZlcnNpb24tcGFpciIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iamF2YS10by14bWwtY29udmVyc2lvbi1wYWlyIiB0eXBlPSJ4bWwtY29udmVyc2lvbi1wYWlyIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZXNwYWNlLXJlc29sdmVyIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJuYW1lc3BhY2VzIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ibmFtZXNwYWNlIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlZmF1bHQtbmFtZXNwYWNlLXVyaSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZXNwYWNlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZWZpeCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lc3BhY2UtdXJpIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY2hlbWEtcmVmZXJlbmNlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVzb3VyY2UiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hLWNvbnRleHQiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9kZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY2hlbWEtY2xhc3MtcGF0aC1yZWZlcmVuY2UiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNjaGVtYS1yZWZlcmVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjaGVtYS1maWxlLXJlZmVyZW5jZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2NoZW1hLXJlZmVyZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2NoZW1hLXVybC1yZWZlcmVuY2UiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNjaGVtYS1yZWZlcmVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iamF2YS1jaGFyYWN0ZXIiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImphdmEtdGltZXN0YW1wIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkYXRlVGltZSIgLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImphdmEtdXRpbC1kYXRlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkYXRlVGltZSIgLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXAtcG9saWN5Ij4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icGVzc2ltaXN0aWMtbG9ja2luZyIgdHlwZT0icGVzc2ltaXN0aWMtbG9ja2luZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY21wIGJlYW4tbGV2ZWwgcGVzc2ltaXN0aWMgbG9ja2luZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWZlci11bnRpbC1jb21taXQiIHR5cGU9ImRlZmVyLXVudGlsLWNvbW1pdCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBtb2RpZmljYXRpb24gZGVmZXJyYWwgbGV2ZWwgZm9yIG5vbi1kZWZlcnJlZCB3cml0ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJub24tZGVmZXJyZWQtY3JlYXRlLXRpbWUiIHR5cGU9Im5vbi1kZWZlcnJlZC1jcmVhdGUtdGltZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBwb2ludCBhdCB3aGljaCBpbnNlcnQgd2lsbCBiZSBpc3N1ZWQgdG8gRGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlc3NpbWlzdGljLWxvY2tpbmciPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ3YWl0IiBuYW1lPSJsb2NraW5nLW1vZGUiIHR5cGU9ImxvY2tpbmctbW9kZSIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkZWZlci11bnRpbC1jb21taXQiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbGwtbW9kaWZpY2F0aW9ucyIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVwZGF0ZS1tb2RpZmljYXRpb25zIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im5vbi1kZWZlcnJlZC1jcmVhdGUtdGltZSI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFmdGVyLWVqYmNyZWF0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFmdGVyLWVqYnBvc3RjcmVhdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmRlZmluZWQiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJsb2NraW5nLW1vZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Ib2xkcyB0aGUgcGVzc2ltaXN0aWMgbG9ja2luZyBtb2RlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id2FpdCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vLXdhaXQiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIiIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNlIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSI1MCIgbmFtZT0icHJlYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2UgcHJlYWxsb2NhdGlvbiBzaXplLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWZhdWx0LXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVmZXJlbmNlcyBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwgb3ZlcnJpZGluZyBpdHMgbmFtZSBhbmQgKG9wdGlvbmFsbHkpIHByZWFsbG9jYXRpb24gc2l6ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRvIHVzZSBwcmVhbGxvY2F0aW9uIHNpemUgb2YgZGVmYXVsdCBzZXF1ZW5jZSBvYmplY3QsIHNldCBwcmVhbGxvY2F0aW9uIHNpemUgdG8gMDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmF0aXZlLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGF0YWJhc2Ugc2VxdWVuY2UgbWVjaGFuaXNtIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRhYmxlIHNlcXVlbmNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFVRU5DRSIgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUV9OQU1FIiBuYW1lPSJuYW1lLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgbmFtZSBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFfQ09VTlQiIG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5hcnktdGFibGUtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5VbmFyeSB0YWJsZSBzZXF1ZW5jZSAtIHNlcXVlbmNlIG5hbWUgaXMgYSB0YWJsZSBuYW1lLCB0YWJsZSBoYXMgYSBzaW5nbGUgZmllbGQgYW5kIGEgc2luZ2xlIHJvdzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRVUVOQ0UiIG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sZmlsZS1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlhtbGZpbGUgc2VxdWVuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5YbWwgc2VxdWVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUVVFTkNFIiBuYW1lPSJyb290LWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUV9OQU1FIiBuYW1lPSJuYW1lLWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUV9DT1VOVCIgbmFtZT0iY291bnRlci1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlciBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZldGNoLWdyb3VwcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIGFsbCBwcmUtZGVmaW5lZCBmZXRjaCBncm91cHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWZhdWx0LWZldGNoLWdyb3VwIiB0eXBlPSJmZXRjaC1ncm91cCIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmZXRjaC1ncm91cCIgdHlwZT0iZmV0Y2gtZ3JvdXAiIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZldGNoLWdyb3VwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgdGhlIGZldGNoIGdyb3VwIGF0dHJpYnV0ZXMgaW5mby48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmV0Y2gtZ3JvdXAtYXR0cmlidXRlcyI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIGEgZmV0Y2ggZ3JvdXAncyBhdHRyaWJ1dGUgbGlzdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmZXRjaC1ncm91cC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBmb3IgdGhpcyBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVmZXJyZWQtZGV0ZWN0aW9uLWNoYW5nZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VzIGJhY2t1cCBjbG9uZSB0byBkZXRlY3QgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2hhbmdlLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LWxldmVsLWNoYW5nZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VzICJtYXJrIGRpcnR5IiB0byBkZXRlY3QgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2hhbmdlLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlLWxldmVsLWNoYW5nZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VzIGEgQ2hhbmdlVHJhY2tlciBmaXJpbmcgUHJvcGVydHlDaGFuZ2VFdmVudCdzIHRvIGRldGVjdCBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjaGFuZ2UtcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIE51bGwgUG9saWN5IGluIHVzZSBmb3IgdGhpcyByZWxhdGlvbnNoaXAgY3VycmVudGx5IGEgY2hvaWNlIG9mIFtOdWxsUG9saWN5IGFuZCBJc1NldE51bGxQb2xpY3ldLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InhzaS1uaWwtcmVwcmVzZW50cy1udWxsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJlbXB0eS1ub2RlLXJlcHJlc2VudHMtbnVsbCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJudWxsLXJlcHJlc2VudGF0aW9uLWZvci14bWwiIHR5cGU9Im1hcnNoYWwtbnVsbC1yZXByZXNlbnRhdGlvbiIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibnVsbC1wb2xpY3kiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJpcy1zZXQtcGVyZm9ybWVkLWZvci1hYnNlbnQtbm9kZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpcy1zZXQtbnVsbC1wb2xpY3kiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpcy1zZXQtbWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImlzLXNldC1wYXJhbWV0ZXItdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaXMtc2V0LXBhcmFtZXRlciIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibWFyc2hhbC1udWxsLXJlcHJlc2VudGF0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+V3JpdGUgbnVsbCwgbm8gdGFnKGRlZmF1bHQpIG9yIGFuIGVtcHR5IHRhZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhTSV9OSUwiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQlNFTlRfTk9ERSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVNUFRZX05PREUiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZ2VuZXJpYyBmaWVsZCBjb25jZXB0LCBzdWNoIGFzIGEgZGF0YWJhc2UgY29sdW1uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb2x1bW4gaW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGNvbHVtbidzIHRhYmxlLiBUaGlzIHRhYmxlIG11c3QgYmUgbGlzdGVkIGluIHRoZSBjbGFzcycgdGFibGVzLiBJZiBub3Qgc3BlY2lmaWVkIHRoZSBmaXJzdCB0YWJsZSBvZiB0aGUgY2xhc3Mgd2lsbCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6YXR0cmlidXRlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmb3JlaWduLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHNvdXJjZS90YXJnZXQgZmllbGQvY29sdW1uIHJlZmVyZW5jZXMgcmVsYXRpbmcgYSBmb3JlaWduIGtleSBpbiBvbmUgdGFibGUgdG8gdGhlIHByaW1hcnkgb3IgdW5pcXVlIGtleSBpbiBhbm90aGVyIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC1yZWZlcmVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByZWZlcmVuY2Ugb2YgYSBzb3VyY2UgdGFibGUgZm9yZWlnbiBrZXkgYW5kIGEgdGFyZ2V0IHRhYmxlIHByaW1hcnkga2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb3VyY2UtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgZmllbGQvY29sdW1uIG5hbWUgaW4gdGhlIHNvdXJjZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcHJpbWFyeSBvciB1bmlxdWUga2V5IGZpZWxkL2NvbHVtbiBuYW1lIGluIHRoZSB0YXJnZXQgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgc3BlY2lmaWNhdGlvbiBmb3IgcXVlcnlpbmcgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNlbGVjdGlvbiBjcml0ZXJpYSBvZiB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudHMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHF1ZXJ5IGFyZ3VtZW50cy4gVGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudCBtdXN0IG1hdGNoIHRoZSBvcmRlciBvZiB0aGUgYXJndW1lbnQgdmFsdWUgcGFzc2VkIHRvIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9InF1ZXJ5LWFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBxdWVyeS4gIFRoaXMgbmFtZSBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgYW5kIGV4ZWN1dGUgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3JpdGVyaWEiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBmaWx0ZXJpbmcgY2xhdXNlIG9mIGEgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgdHlwZSBuYW1lIG9mIHRoZSBhcmd1bWVudCBtYXkgYmUgcHJvdmlkZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIGNvbnN0YW50IHZhbHVlIGZvciB0aGUgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgdXNlciBkZWZpbmVkIHByb3BlcnR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6YW55VHlwZSIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHRhYmxlcyB0aGF0IHRoZSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8uICBUaGlzIGlzIHR5cGljYWxseSBhIHNpbmdsZSB0YWJsZSBidXQgY2FuIGJlIG11bHRpcGxlLCBvciBlbXB0eSBmb3IgaW5oZXJpdGFuY2Ugb3IgYWdncmVnYXRlZCBjbGFzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSB0YWJsZS4gIFRoZSBuYW1lIGNhbiBiZSBmdWxseSBxdWFsaWZpZWQgd2l0aCB0aGUgc2NoZW1hLCB0YWJsZXNwYWNlIG9yIGxpbmsuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgU3BlY2lmaWVzIGhvdyB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZQotICAgICAgICBvYmplY3QgdmFsdWUuCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gIAk8eHNkOnNlcXVlbmNlPgotICAJCTx4c2Q6ZWxlbWVudCBuYW1lPSJub2RlLW9yZGVyaW5nLXBvbGljeSIKLSAgCQkJdHlwZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIj4KLSAgCQk8L3hzZDplbGVtZW50PgotICAJPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUKLSAgICAJbmFtZT0iZGVzY3JpcHRvci1sZXZlbC1kb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAJPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vLWRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWJpbmRlci1wb2xpY3kiPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwZW5kLW5ldy1lbGVtZW50cy1vcmRlcmluZy1wb2xpY3kiPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imlnbm9yZS1uZXctZWxlbWVudHMtb3JkZXJpbmctcG9saWN5Ij4KLSAgICAJPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGl2ZS1wb3NpdGlvbi1vcmRlcmluZy1wb2xpY3kiPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMS4yLnhzZCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8xLjIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmE1Njk2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8xLjIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDI1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLgotIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0KLSBDb250cmlidXRvcnM6Ci0gICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9yYWNsZSBUb3BMaW5rCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS0tPgotPCEtLSBFY2xpcHNlIFBlcnNpc3RlbmNlIFNlcnZpY2UgUHJvamVjdCA6OiBNYXAgU2NoZW1hIGZpbGUgZm9yIE9STS9PWE0vRUlTIC0tPgotPHhzZDpzY2hlbWEKLSAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiCi0gIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gIHZlcnNpb249IjEuMiIKLSAgPgotICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXBlcnNpc3RlbmNlIiB0eXBlPSJvYmplY3QtcGVyc2lzdGVuY2UiIC8+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXBlcnNpc3RlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QW4gb2JqZWN0LXBlcnNpc3RlbmNlIG1hcHBpbmcgbW9kdWxlLCBhIHNldCBvZiBjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBuYW1lIGZvciB0aGUgbW9kZWwgYmVpbmcgbWFwcGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9ycyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgY2xhc3MgbWFwcGluZyBkZXNjcmlwdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIiB0eXBlPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZm9ybWF0aW9uIG9mIGhvdyBhIGNsYXNzIGlzIHBlcnNpc3RlZCB0byBpdHMgZGF0YS1zdG9yZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibG9naW4iIHR5cGU9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRhc291cmNlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZGVmYXVsdC10ZW1wb3JhbC1tdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgZGVmYXVsdCBmb3IgaG93IERhdGUgYW5kIENhbGVuZGFyIHR5cGVzIGFyZSB1c2VkIHdpdGggY2hhbmdlIHRyYWNraW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkJ5IGRlZmF1bHQgdGhleSBhcmUgYXNzdW1lZCBub3QgdG8gYmUgY2hhbmdlZCBkaXJlY3RseSAob25seSByZXBsYWNlZCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxdWVyaWVzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGxpc3Qgb2YgcXVlcmllcyB0byBiZSBzdG9yZWQgb24gdGhlIHNlc3Npb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InF1ZXJ5IiB0eXBlPSJkYXRhYmFzZS1xdWVyeSI+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgZGVmYXVsdD0iRWNsaXBzZSBQZXJzaXN0ZW5jZSBTZXJ2aWNlcyAtIDEuMSAoQnVpbGQgWVlNTUREKSIgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRhc291cmNlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwbGF0Zm9ybS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBwbGF0Zm9ybSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InVzZXItbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGFzb3VyY2UgdXNlci1uYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRhc291cmNlIHBhc3N3b3JkLCB0aGlzIGlzIHN0b3JlZCBpbiBlbmNyeXB0ZWQgZm9ybS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJleHRlcm5hbC1jb25uZWN0aW9uLXBvb2xpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGlmIHRoZSBjb25uZWN0aW9ucyBhcmUgbWFuYWdlZCBieSB0aGUgZGF0YXNvdXJjZSBkcml2ZXIsIGFuZCBhIG5ldyBjb25uZWN0aW9uIHNob3VsZCBiZSBhY3F1aXJlIHBlciBjYWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImV4dGVybmFsLXRyYW5zYWN0aW9uLWNvbnRyb2xsZXIiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGlmIHRoZSB0cmFuc2FjdGlvbiBhcmUgbWFuYWdlZCBieSBhIHRyYW5zYWN0aW9uIG1hbmFnZXIsIGFuZCBzaG91bGQgbm90IGJlIG1hbmFnZWQgYnkgVG9wTGluay48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBhbHNvIGJlIHVzZWQgaWYgdGhlIGRhdGFzb3VyY2UgZG9lcyBub3Qgc3VwcG9ydCB0cmFuc2FjdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXF1ZW5jaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jaW5nIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiIHR5cGU9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZhdWx0IHNlcXVlbmNlLiBUaGUgbmFtZSBpcyBvcHRpb25hbC4gSWYgbm8gbmFtZSBwcm92aWRlZCBhbiBlbXB0eSBzdHJpbmcgd2lsbCBiZSB1c2VkIGFzIGEgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlcXVlbmNlcyI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Tm9uIGRlZmF1bHQgc2VxdWVuY2VzLiBNYWtlIHN1cmUgZWFjaCBzZXF1ZW5jZSBoYXMgdW5pcXVlIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InNlcXVlbmNlIiB0eXBlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpEQkMgZHJpdmVyIGFuZCBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkcml2ZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKREJDIGRyaXZlciBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbm5lY3Rpb24tdXJsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxsIEpEQkMgZHJpdmVyIGNvbm5lY3Rpb24gVVJMLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iYmluZC1hbGwtcGFyYW1ldGVycyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIHBhcmFtZXRlciBiaW5kaW5nIHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhY2hlLWFsbC1zdGF0ZW1lbnRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgc3RhdGVtZW50IGNhY2hpbmcgc2hvdWxkIGJlIHVzZWQuICBUaGlzIHNob3VsZCBiZSB1c2VkIHdpdGggcGFyYW1ldGVyIGJpbmRpbmcsIHRoaXMgY2Fubm90IGJlIHVzZWQgd2l0aCBleHRlcm5hbCBjb25uZWN0aW9uIHBvb2xpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJieXRlLWFycmF5LWJpbmRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBieXRlIGFycmF5IGRhdGEtdHlwZXMgc2hvdWxkIHVzZSBiaW5kaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InN0cmluZy1iaW5kaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgc3RyaW5nIGRhdGEtdHlwZXMgc2hvdWxkIHVzZSBiaW5kaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMjU2IiBuYW1lPSJzdHJpbmctYmluZGluZy1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgdGhlIHRocmVzaG9sZCBzdHJpbmcgc2l6ZSBmb3IgdXNhZ2Ugb2Ygc3RyaW5nIGJpbmRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ic3RyZWFtcy1mb3ItYmluZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIGxhcmdlIGJ5dGUgYXJyYXkgYW5kIHN0cmluZyBkYXRhLXR5cGVzIHNob3VsZCBiZSBib3VuZCBhcyBzdHJlYW1zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImZvcmNlLWZpZWxkLW5hbWVzLXRvLXVwcGVyLWNhc2UiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0byBmb3JjZSBhbGwgZmllbGQgbmFtZXMgdG8gdXBwZXItY2FzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9Im9wdGltaXplLWRhdGEtY29udmVyc2lvbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGRhdGEgb3B0aW1pemF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0idHJpbS1zdHJpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgc3RyaW5nIHRyYWlsaW5nIGJsYW5rcyBzaG91bGQgYmUgdHJpbW1lZC4gIFRoaXMgaXMgbm9ybWFsbHkgcmVxdWlyZWQgZm9yIENIQVIgZGF0YS10eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC13cml0aW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgYmF0Y2ggd3JpdGluZyBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImpkYmMtYmF0Y2gtd3JpdGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgdXNpbmcgYmF0Y2ggd3JpdGluZywgY29uZmlndXJlIGlmIHRoZSBKREJDIGRyaXZlcnMgYmF0Y2ggd3JpdGluZyBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpDQSBkcml2ZXIgYW5kIEVJUyBjb25uZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb25uZWN0aW9uLXNwZWMtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBUb3BMaW5rIHBsYXRmb3JtIHNwZWNpZmljIGNvbm5lY3Rpb24gc3BlYyBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbm5lY3Rpb24tZmFjdG9yeS11cmwiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpOREkgdXJsIGZvciB0aGUgbWFuYWdlZCBKQ0EgYWRhcHRlcidzIGNvbm5lY3Rpb24gZmFjdG9yeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgCQluYW1lPSJlcXVhbC1uYW1lc3BhY2UtcmVzb2x2ZXJzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgCTx4c2Q6ZWxlbWVudCBuYW1lPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5IgotICAgICAgICAJCXR5cGU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiIG1heE9jY3Vycz0iMSIKLSAgICAgICAgCQltaW5PY2N1cnM9IjAiPgotICAgICAgICAJPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZm9ybWF0aW9uIG9mIGhvdyBhIGNsYXNzIGlzIHBlcnNpc3RlZCB0byBpdHMgZGF0YS1zdG9yZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgaXMgYW4gYWJzdHJhY3QgZGVmaW5pdGlvbiB0byBhbGxvdyBmbGV4aWJpbGl0eSBpbiB0aGUgdHlwZXMgb2YgY2xhc3NlcyBhbmQgZGF0YXN0b3JlcyBwZXJzaXN0ZWQsIGkuZS4gaW50ZXJmYWNlcywgYWJzdHJhY3QgY2xhc3NlcywgYWdncmVnYXRlcywgbm9uLXJlbGF0aW9uYWwgcGVyc2lzdGVuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBiZWluZyBwZXJzaXN0ZWQuICBUaGUgY2xhc3MgbmFtZSBtdXN0IGJlIGZ1bGwgcXVhbGlmaWVkIHdpdGggaXRzIHBhY2thZ2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhhbXBsZTogPGNsYXNzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiPmV4YW1wbGUuZW1wbG95ZWUuaW1wbGVtZW50YXRpb24uRW1wbG95ZWU8L2NsYXNzPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWxpYXMiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgYW4gYWxpYXMgbmFtZSBjYW4gYmUgZ2l2ZW4gZm9yIHRoZSBjbGFzcy4gIFRoZSBhbGlhcyBpcyBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBjbGFzcyBpbiBwbGFjZSBvZiBpdHMgaW1wbGVtZW50YXRpb24gbmFtZSwgc3VjaCBhcyBpbiBxdWVyeWluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeGFtcGxlOiA8YWxpYXMgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSI+RW1wbG95ZWU8L2FsaWFzPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJpbWFyeS1rZXkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGZpZWxkcy9jb2x1bW5zIHRoYXQgbWFrZSB1cCB0aGUgcHJpbWFyeSBrZXkgb3IgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgaXMgdXNlZCBmb3IgY2FjaGluZywgcmVsYXRpb25zaGlwcywgYW5kIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcHJpbWFyeSBrZXkgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGlmIHRoZSBjbGFzcyBpcyByZWFkLW9ubHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9wZXJ0aWVzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyBmb3IgdXNlciBkZWZpbmVkIHByb3BlcnRpZXMgdG8gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icHJvcGVydHkiIHR5cGU9InByb3BlcnR5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHVzZXIgZGVmaW5lZCBwcm9wZXJ0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5oZXJpdGFuY2UiIHR5cGU9ImluaGVyaXRhbmNlLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzIGlzIHJlbGF0ZWQgaW4gaW5oZXJpdGFuY2UgYW5kIGhvdyB0aGlzIGluaGVyaXRhbmNlIGlzIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImV2ZW50cyIgdHlwZT0iZXZlbnQtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBwZXJzaXN0ZW50IGV2ZW50cyBmb3IgdGhpcyBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InF1ZXJ5aW5nIiB0eXBlPSJxdWVyeS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGRlZmluZWQgcXVlcmllcyBmb3IgdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLW1hcHBpbmdzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBtYXBwaW5ncyB0aGF0IGRlZmluZSBob3cgdGhlIGNsYXNzJyBhdHRyaWJ1dGVzIGFyZSBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImF0dHJpYnV0ZS1tYXBwaW5nIiB0eXBlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBhdHRyaWJ1dGUgaXMgcGVyc2lzdGVkLiBUaGUgYXR0cmlidXRlIG1hcHBpbmcgZGVmaW5pdGlvbiBpcyBleHRlbmRhYmxlIHRvIGFsbG93IGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlc2NyaXB0b3ItdHlwZSIgdHlwZT0iY2xhc3MtZGVzY3JpcHRvci10eXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBkZXNjcmlwdG9yIHR5cGUsIHN1Y2ggYXMgYWdncmVnYXRlIG9yIGluZGVwZW5kZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW50ZXJmYWNlcyIgdHlwZT0iaW50ZXJmYWNlLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgaW50ZXJmYWNlcyB0aGF0IHRoaXMgY2xhc3MgaW1wbGVtZW50cy4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJsb2NraW5nIiB0eXBlPSJsb2NraW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgbG9ja2luZyBiZWhhdmlvciBmb3IgdGhlIGNsYXNzLiAgU3VjaCBhcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIHZlcnNpb24sIHRpbWVzdGFtcCBvciBjaGFuZ2Ugc2V0IG9mIGNvbHVtbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXF1ZW5jaW5nIiB0eXBlPSJzZXF1ZW5jaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBnZW5lcmF0ZWQgdW5pcXVlIGlkIHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYWNoaW5nIiB0eXBlPSJjYWNoaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzJyBpbnN0YW5jZXMgc2hvdWxkIGJlIGNhY2hlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlbW90ZS1jYWNoaW5nIiB0eXBlPSJjYWNoaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzJyBpbnN0YW5jZXMgc2hvdWxkIGJlIGNhY2hlZCBvbiByZW1vdGUgY2xpZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imhpc3RvcnktcG9saWN5IiB0eXBlPSJoaXN0b3J5LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgcGFzdCB2ZXJzaW9ucyBvZiBvYmplY3RzIGFyZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGEtc3RvcmUuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gaGlzdG9yeSBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm5pbmctcG9saWN5IiB0eXBlPSJyZXR1cm5pbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHJldHVuaW5nIHBvbGljeS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyByZXR1cm5pbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYW1lbmRtZW50IiB0eXBlPSJhbWVuZG1lbnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IGZvciB0aGUgZGVzY3JpcHRvciB0byBiZSBhbWVuZGVkIG9yIGN1c3RvbWl6ZWQgdGhyb3VnaCBhIGNsYXNzIEFQSSBhZnRlciBsb2FkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5zdGFudGlhdGlvbiIgdHlwZT0iaW5zdGFudGlhdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgaW5zdGFudGlhdGlvbiBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb3B5aW5nIiB0eXBlPSJjb3B5LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBjbG9uaW5nL2NvcHlpbmcgYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InF1ZXJ5LWtleXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgbGlzdCBvZiBxdWVyeSBrZXlzIG9yIGFsaWFzZXMgZm9yIGRhdGFiYXNlIGluZm9ybWF0aW9uLiAgVGhlc2UgY2FuIGJlIHVzZWQgaW4gcXVlcmllcyBpbnN0ZWFkIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4gbmFtZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InF1ZXJ5LWtleSIgdHlwZT0icXVlcnkta2V5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBxdWVyeWluZyBkYXRhYmFzZSBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY21wLXBvbGljeSIgdHlwZT0iY21wLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UGxhY2UgaG9sZGVyIG9mIENNUCBpbmZvcm1hdGlvbiBzcGVjaWZpYy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZldGNoLWdyb3VwcyIgdHlwZT0iZmV0Y2gtZ3JvdXBzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyBhbGwgcHJlLWRlZmluZWQgZmV0Y2ggZ3JvdXBzIGF0IHRoZSBkZXNjcmlwdG9yIGxldmVsPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImNoYW5nZS1wb2xpY3kiIHR5cGU9ImNoYW5nZS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIHRoZSBDaGFuZ2UgUG9saWN5IGZvciB0aGlzIGRlc2NyaXB0b3I8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBmaXhlZD0iMTAiIG5hbWU9InNjaGVtYS1tYWpvci12ZXJzaW9uIiB0eXBlPSJ4c2Q6aW50ZWdlciIgLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBmaXhlZD0iMCIgbmFtZT0ic2NoZW1hLW1pbm9yLXZlcnNpb24iIHR5cGU9InhzZDppbnRlZ2VyIiAvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNsYXNzLWRlc2NyaXB0b3ItdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNsYXNzIGRlc2NyaXB0b3IgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImluZGVwZW5kZW50IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWdncmVnYXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWdncmVnYXRlLWNvbGxlY3Rpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3NpdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3NpdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbnRlcmZhY2UiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZXJmYWNlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIGludGVyZmFjZXMgdGhhdCBhIGNsYXNzIGRlc2NyaXB0b3IgaW1wbGVtZW50cywgb3IgdGhlIGltcGxlbWVudGlvbiBjbGFzcyBmb3IgYW4gaW50ZXJmYWNlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IGEgc2V0IG9mIHB1YmxpYyBpbnRlcmZhY2VzIGZvciB0aGUgY2xhc3MgY2FuIGJlIHNwZWNpZmllZC4gIFRoaXMgYWxsb3dzIHRoZSBpbnRlcmZhY2UgdG8gYmUgdXNlZCB0byByZWZlciB0byB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0d28gY2xhc3NlcyBpbXBsZW1lbnQgdGhlIHNhbWUgaW50ZXJmYWNlLCBhbiBpbnRlcmZhY2UgZGVzY3JpcHRvciBzaG91bGQgYmUgZGVmaW5lZCBmb3IgdGhlIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGFsc28gYmUgdXNlZCB0byBkZWZpbmUgaW5oZXJpdGFuY2UgYmV0d2VlbiBpbnRlcmZhY2UgZGVzY3JpcHRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaW50ZXJmYWNlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGludGVyZmFjZSBjbGFzcyBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4YW1wbGU6IDxjbGFzcyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIj5leGFtcGxlLmVtcGxveWVlLmFwaS5FbXBsb3llZTwvY2xhc3M+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaW1wbGVtZW50b3ItZGVzY3JpcHRvciIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igd2hpY2ggdGhpcyBpbnRlcmZhY2UgaXMgdGhlIHB1YmxpYyBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiB0aGUgaW50ZXJmYWNlIGhhcyBvbmx5IGEgc2luZ2xlIGltcGxlbWVudG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4YW1wbGU6IDxjbGFzcyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIj5leGFtcGxlLmVtcGxveWVlLmltcGwuRW1wbG95ZWU8L2NsYXNzPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgY2xvbmluZy9jb3B5aW5nIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3JlYXRlcyBhIGNvcHlpbmcgdGhyb3VnaCBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSB0byBjb3B5IGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvcHktcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgY2xvbmluZy9jb3B5aW5nIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQgdGhyb3VnaCBhIGNsb25lIG1ldGhvZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29weS1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgY2xvbmUgbWV0aG9kIG9uIHRoZSBvYmplY3QsIGkuZS4gJ2Nsb25lJzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnN0YW50aWF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgaW5zdGFudGlhdGlvbiBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgbWV0aG9kIG9uIHRoZSBmYWN0b3J5IHRvIGluc3RhbnRpYXRlIHRoZSBvYmplY3QgaW5zdGFuY2UuJzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmFjdG9yeS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBmYWN0b3J5IGNsYXNzIG5hbWUuJzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmFjdG9yeS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gaW5zdGFudGlhdGUgdGhlIGZhY3RvcnkgY2xhc3MuJzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhbWVuZG1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSBjbGFzcyBhbmQgc3RhdGljIG1ldGhvZCB0byBiZSBjYWxsZWQgdG8gYWxsb3cgZm9yIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGFtZW5kZWQgb3IgY3VzdG9taXplZCB0aHJvdWdoIGEgY2xhc3MgQVBJIGFmdGVyIGxvYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYW1lbmRtZW50LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4gVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhbWVuZG1lbnQgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYW1lbmRtZW50LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhbWVuZG1lbnQgbWV0aG9kIG9uIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25hbC1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGUocykuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idGFibGVzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHRoZSB0YWJsZXMgdGhlIGNsYXNzIGlzIHBlcnNpc3RlZCB0by4gIFR5cGljYWxseSBhIGNsYXNzIGlzIHBlcnNpc3RlZCB0byBhIHNpbmdsZSB0YWJsZSwgYnV0IG11bHRpcGxlIHRhYmxlcyBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ0YWJsZSIgdHlwZT0idGFibGUiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgdGFibGVzIHRoYXQgdGhlIGNsYXNzIGlzIHBlcnNpc3RlZCB0by4gIFRoaXMgaXMgdHlwaWNhbGx5IGEgc2luZ2xlIHRhYmxlIGJ1dCBjYW4gYmUgbXVsdGlwbGUsIG9yIGVtcHR5IGZvciBpbmhlcml0YW5jZSBvciBhZ2dyZWdhdGVkIGNsYXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5cy1mb3ItbXVsdGlwbGUtdGFibGUiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBmb3JlaWduIGtleSBmaWVsZCByZWZlcmVuY2VzIHRvIGJlIGRlZmluZSBmb3IgbXVsdGlwbGUgdGFibGUgZGVzY3JpcHRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtdWx0aXBsZS10YWJsZS1qb2luLWNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgY29tcGxleCBtdWx0aXBsZSB0YWJsZSBqb2luIGNvbmRpdGlvbnMgYW4gZXhwcmVzc2lvbiBtYXkgYmUgcHJvdmlkZWQgaW5zdGVhZCBvZiB0aGUgdGFibGUgZm9yZWlnbiBrZXkgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbi1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiBhIG51bWVyaWMgdmVyc2lvbiBmaWVsZC9jb2x1bW4gdGhhdCB0cmFja3MgY2hhbmdlcyBhbmQgdGhlIHZlcnNpb24gdG8gYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2NraW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZlcnNpb24tZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIGFuZCBvcHRpb25hbGx5IHRoZSB0YWJsZSBvZiB0aGUgY29sdW1uIHRoYXQgdGhlIGF0dHJpYnV0ZSBpcyBzdG9yZWQgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InN0b3JlLXZlcnNpb24taW4tY2FjaGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHZlcnNpb24gdmFsdWUgc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgY2FjaGUsIG9yIGlmIGl0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWVzdGFtcC1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiB0aW1lc3RhbXAgdmVyc2lvbiBjb2x1bW4gdGhhdCB0cmFja3MgY2hhbmdlcyBhbmQgdGhlIHZlcnNpb24gdG8gYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2ZXJzaW9uLWxvY2tpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ic2VydmVyLXRpbWUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHRpbWVzdGFtcCBzaG91bGQgYmUgb2J0YWluZWQgbG9jYWxseSBvciBmcm9tIHRoZSBkYXRhYmFzZSBzZXJ2ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFsbC1maWVsZHMtbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gY29tcGFyaW5nIHRoZSBvcmlnaW5hbCByZWFkIHZhbHVlcyBvZiBhbGwgZmllbGRzIG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdmFsdWVzIGluIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9ja2luZy1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNoYW5nZWQtZmllbGRzLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIGNvbXBhcmluZyB0aGUgb3JpZ2luYWwgcmVhZCB2YWx1ZXMgb2Ygb25seSB0aGUgY2hhbmdlZCBmaWVsZHMgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2NraW5nLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VsZWN0ZWQtZmllbGRzLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIGNvbXBhcmluZyB0aGUgb3JpZ2luYWwgcmVhZCB2YWx1ZXMgb2YgYSBzcGVjaWZpZWQgc2V0IG9mIGZpZWxkcyBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvY2tpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHNldCBvZiBmaWVsZHMgdG8gY29tcGFyZSBvbiB1cGRhdGUgYW5kIGRlbGV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBkYXRhYmFzZSBnZW5lcmF0ZWQgdW5pcXVlIGlkIHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgZ2VuZXJhdG9yLiAgVGhpcyBjb3VsZCBiZSB0aGUgbmFtZSBvZiBhIHNlcXVlbmNlIG9iamVjdCwgb3IgYSByb3cgdmFsdWUgaW4gYSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIGZpZWxkL2NvbHVtbiB0aGF0IHRoZSBnZW5lcmF0ZWQgc2VxdWVuY2UgaWQgaXMgYXNzaWduZWQgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBjYWNoaW5nIHR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZ1bGwiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjYWNoZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IndlYWstcmVmZXJlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic29mdC1yZWZlcmVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzb2Z0LWNhY2hlLXdlYWstcmVmZXJlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaGFyZC1jYWNoZS13ZWFrLXJlZmVyZW5jZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoaW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcycgaW5zdGFuY2VzIHNob3VsZCBiZSBjYWNoZWQgYW5kIGhvdyBvYmplY3QgaWRlbnRpdHkgc2hvdWxkIGJlIG1haW50YWluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJzb2Z0LWNhY2hlLXdlYWstcmVmZXJlbmNlIiBuYW1lPSJjYWNoZS10eXBlIiB0eXBlPSJjYWNoZS10eXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSB0eXBlIG9mIGNhY2hpbmcsIHN1Y2ggYXMgTFJVLCB3ZWFrIHJlZmVyZW5jZSBvciBub25lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMTAwIiBuYW1lPSJjYWNoZS1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgaW5pdGlhbCBvciBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImFsd2F5cy1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgcmVmcmVzaCBjYWNoZWQgb2JqZWN0cyBvbiBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Im9ubHktcmVmcmVzaC1jYWNoZS1pZi1uZXdlci12ZXJzaW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byByZWZyZXNoIGlmIHRoZSBjYWNoZWQgb2JqZWN0IGlzIGFuIG9sZGVyIHZlcnNpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZGlzYWJsZS1jYWNoZS1oaXRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGlzYWJsZSBvYnRhaW5pbmcgY2FjaGUgaGl0cyBvbiBwcmltYXJ5IGtleSBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImFsd2F5cy1jb25mb3JtIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgY29uZm9ybSBxdWVyaWVzIHdpdGhpbiBhIHRyYW5zYWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Imlzb2xhdGVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiBvYmplY3RzIG9mIHRoaXMgdHlwZSBzaG91bGQgYmUgaXNvbGF0ZWQgZnJvbSB0aGUgc2hhcmVkIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iaXNvbGF0ZS1uZXctZGF0YS1hZnRlci10cmFuc2FjdGlvbiIgbmFtZT0idW5pdG9md29yay1pc29sYXRpb24tbGV2ZWwiIHR5cGU9InVuaXRvZndvcmstaXNvbGF0aW9uLWxldmVsIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyB0aGUgdW5pdCBvZiB3b3JrIHNob3VsZCBiZSBpc29sYXRlZCB0byB0aGUgc2Vzc2lvbiBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNhY2hlLWludmFsaWRhdGlvbi1wb2xpY3kiIHR5cGU9ImNhY2hlLWludmFsaWRhdGlvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iY2hhbmdlLXNldCIgbmFtZT0iY2FjaGUtc3luYy10eXBlIiB0eXBlPSJjYWNoZS1zeW5jLXR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSB0eXBlIG9mIGNhY2hlIHN5bmNocm9uaXphdGlvbiB0byBiZSB1c2VkIHdpdGggdGhpcyBkZXNjcmlwb3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hlLWludmFsaWRhdGlvbiIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BYnN0cmFjdCBzdXBlcmNsYXNzIGZvciBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWNpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXBkYXRlLXJlYWQtdGltZS1vbi11cGRhdGUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuby1leHBpcnktY2FjaGUtaW52YWxpZGF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kgd2hlcmUgb2JqZWN0cyBpbiB0aGUgY2FjaGUgZG8gbm90IGV4cGlyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2FjaGUtaW52YWxpZGF0aW9uIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lLXRvLWxpdmUtY2FjaGUtaW52YWxpZGF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kgd2hlcmUgb2JqZWN0cyBsaXZlIGEgc3BlY2lmaWMgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBhZnRlciB0aGV5IGFyZSByZWFkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjYWNoZS1pbnZhbGlkYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0aW1lLXRvLWxpdmUiIHR5cGU9InhzZDpsb25nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGFpbHktY2FjaGUtaW52YWxpZGF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNhY2hlIGludmFsaWRhdGlvbiBQb2xpY3kgd2hlcmUgb2JqZWN0cyBleHBpcmUgYXQgYSBzcGVjaWZpYyB0aW1lIGV2ZXJ5IGRheTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjYWNoZS1pbnZhbGlkYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnktdGltZSIgdHlwZT0ieHNkOmRhdGVUaW1lIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaGlzdG9yeS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBwYXN0IHZlcnNpb25zIG9mIG9iamVjdHMgYXJlIHRvIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YS1zdG9yZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImhhbmRsZS13cml0ZXMiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS1kYXRhYmFzZS10aW1lIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imhpc3RvcnktdGFibGVzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBuYW1lcyBvZiB0aGUgbWlycm9yaW5nIGhpc3RvcmljYWwgdGFibGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaGlzdG9yeS10YWJsZSIgdHlwZT0iaGlzdG9yeS10YWJsZSIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic3RhcnQtZmllbGRzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzdGFydCBmaWVsZHMgZm9yIGVhY2ggaGlzdG9yaWNhbCB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InN0YXJ0LWZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZW5kLWZpZWxkcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgZW5kIGZpZWxkcyBmb3IgZWFjaCBoaXN0b3JpY2FsIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZW5kLWZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJoaXN0b3J5LXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RWFjaCBlbnRyeSBpcyBhIHNvdXJjZSAoZGVzY3JpcHRvcikgdG8gaGlzdG9yeSB0YWJsZSBuYW1lIGFzc29jaWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iIiBuYW1lPSJzb3VyY2UiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBuYW1lPSJoaXN0b3J5IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXR1cm5pbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyByZXR1bmluZyBwb2xpY3kuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gcmV0dXJuaW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG5hbWU9InJldHVybmluZy1maWVsZC1pbmZvcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TGlzdHMgdGhlIGZpZWxkcyB0byBiZSByZXR1cm5lZCB0b2dldGhlciB3aXRoIHRoZSBmbGFncyBkZWZpbmluZyByZXR1cm5pbmcgb3B0aW9uczwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icmV0dXJuaW5nLWZpZWxkLWluZm8iIHR5cGU9InJldHVybmluZy1maWVsZC1pbmZvIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJldHVybmluZy1maWVsZC1pbmZvIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RmllbGQgdG8gYmUgcmV0dXJuZWQgdG9nZXRoZXIgd2l0aCB0eXBlIGFuZCB0aGUgZmxhZ3MgZGVmaW5pbmcgcmV0dXJuaW5nIG9wdGlvbnMuIEF0IGxlYXN0IG9uZSBvZiBpbnNlcnQsIHVwZGF0ZSBzaG91bGQgYmUgdHJ1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0YXJnZXQgcmVmZXJlbmNlZCBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCB0byBiZSByZXR1cm5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJpbnNlcnQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGQgc2hvdWxkIGJlIHJldHVuZWQgYWZ0ZXIgSW5zZXJ0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Imluc2VydC1tb2RlLXJldHVybi1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgaW5zZXJ0PT10cnVlLCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGQgc2hvdWxkIG5vdCBiZSBpbnNlcnRlZCAodHJ1ZSkuIElmIGluc2VydD09ZmFsc2UgLSBpZ25vcmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVwZGF0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCBzaG91bGQgYmUgcmV0dW5lZCBhZnRlciBJbnNlcnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcyBpcyByZWxhdGVkIGluIGluaGVyaXRhbmNlIGFuZCBob3cgdGhpcyBpbmhlcml0YW5jZSBpcyBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwYXJlbnQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBwYXJlbnQvc3VwZXJjbGFzcyBvZiB0aGUgY2xhc3MgYmVpbmcgcGVyc2lzdGVkLiAgVGhlIGNsYXNzIG5hbWUgbXVzdCBiZSBmdWxsIHF1YWxpZmllZCAgIHdpdGggaXRzIHBhY2thZ2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJyZWFkLXN1YmNsYXNzZXMtb24tcXVlcmllcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSBpZiBzdWJjbGFzc2VzIG9mIHRoZSBjbGFzcyBzaG91bGQgYmUgcmV0dXJuZWQgb24gcXVlcmllcywgb3Igb25seSB0aGUgZXhhY3QgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhbGwtc3ViY2xhc3Nlcy12aWV3IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgdGhlIG5hbWUgb2YgYSB2aWV3IHRoYXQgam9pbnMgYWxsIG9mIHRoZSBzdWJjbGFzcycgdGFibGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS1jbGFzcy1uYW1lLWFzLWluZGljYXRvciIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIGNsYXNzIHR5cGUgaW5kaWNhdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtZXh0cmFjdGlvbi1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIGEgbWV0aG9kIG9uIHRoZSBjbGFzcyB0aGF0IHRha2VzIHRoZSBjbGFzcycgcm93IGFzIGFyZ3VtZW50IGEgY29tcHV0ZWQgdGhhdCBjbGFzcyB0eXBlIHRvIGJlIHVzZWQgdG8gaW5zdGFudGlhdGUgZnJvbSB0aGUgcm93LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHR5cGUgZmllbGQvY29sdW1uIHRoYXQgdGhlIGNsYXNzIHR5cGUgaXMgc3RvcmVkIGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiIHR5cGU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBjbGFzcyBpbmRpY2F0b3IgdmFsdWVzIGFuZCB0aGUgc3ViY2xhc3NlcyB0aGV5IG1hcCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWV4dHJhY3RvciIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSBjbGFzcyBleHRyYWN0b3IgaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib25seS1pbnN0YW5jZXMtY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgY3JpdGVyaWEgdGhhdCBmaWx0ZXJzIG91dCBhbGwgc2libGluZyBhbmQgc3ViY2xhc3MgaW5zdGFuY2VzIG9uIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhbGwtc3ViY2xhc3Nlcy1jcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBjcml0ZXJpYSB0aGF0IGZpbHRlcnMgb3V0IHNpYmxpbmcgaW5zdGFuY2VzIG9uIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ib3V0ZXItam9pbi1zdWJjbGFzc2VzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGluaGVyaXRhbmNlIHF1ZXJpZXMgc3BlY2lmeSBpZiBhbGwgc3ViY2xhc3NlcyBzaG91bGQgYmUgb3V0ZXIgam9pbmVkLCBpbnN0ZWFkIG9mIGEgcXVlcnkgcGVyIHN1YmNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxbmFtZS1pbmhlcml0YW5jZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeHRlbmRzIGluaGVyaXRhbmNlIHBvbGljeS4gQWxsb3dzIGZvciBwcmVmaXhlZCBuYW1lcyB0byBiZSByZXNvbHZlZCBhdCBydW50aW1lIHRvIGZpbmQgdGhlIGFwcHJvcmlhdGUgY2xhc3M8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5oZXJpdGFuY2UtcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGNsYXNzIGluZGljYXRvciB2YWx1ZXMgYW5kIHRoZSBzdWJjbGFzc2VzIHRoZXkgbWFwIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIHRoZSB0eXBlIG1hcHMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MtaW5kaWNhdG9yIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIHZhbHVlIHVzZWQgdG8gZGVmaW5lIHRoZSBjbGFzcyB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImV2ZW50LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHBlcnNpc3RlbnQgZXZlbnRzIGZvciB0aGlzIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZXZlbnQtbGlzdGVuZXJzIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV2ZW50LWxpc3RlbmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYW4gZXZlbnQgbGlzdGVuZXIgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBkZXNjcmlwdG9yIGV2ZW50IGxpc3RlbmVyIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1idWlsZC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBidWlsZGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJlLXdyaXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSB3cml0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LXdyaXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIHdyaXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByZS1pbnNlcnQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIGluc2VydGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1pbnNlcnQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgaW5zZXJ0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmUtdXBkYXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSB1cGRhdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC11cGRhdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgdXBkYXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByZS1kZWxldGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIGRlbGV0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LWRlbGV0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBkZWxldGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWJvdXQtdG8taW5zZXJ0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSBpbnNlcnRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFib3V0LXRvLXVwZGF0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgdXBkYXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtY2xvbmUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgY2xvbmluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1tZXJnZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBtZXJnaW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LXJlZnJlc2gtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgcmVmcmVzaGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBkZWZpbmVkIHF1ZXJpZXMgYW5kIHF1ZXJ5IHByb3BlcnRpZXMgZm9yIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InF1ZXJpZXMiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icXVlcnkiIHR5cGU9InF1ZXJ5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IGRlZmluaXRpb24gZm9yIHRoZSBjbGFzcycgaW5zdGFuY2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgdGltZW91dCB0byBhcHBseSB0byBhbGwgcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImNoZWNrLWNhY2hlIiBuYW1lPSJleGlzdGVuY2UiIHR5cGU9ImV4aXN0ZW5jZS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBiZWhhdm9pciB1c2VkIHRvIGRldGVybWluZSBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0IHRvIGJlIGN1c3RvbWl6ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnNlcnQtcXVlcnkiIHR5cGU9Imluc2VydC1vYmplY3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSBpbnNlcnQgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgaW5zZXJ0IGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InVwZGF0ZS1xdWVyeSIgdHlwZT0idXBkYXRlLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIHVwZGF0ZSBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCB1cGRhdGUgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLXF1ZXJ5IiB0eXBlPSJkZWxldGUtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gZGVsZXRlIHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IGRlbGV0ZSBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkb2VzLWV4aXN0LXF1ZXJ5IiB0eXBlPSJkb2VzLWV4aXN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gZG9lcyBleGlzdCBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCBkZWxldGUgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVhZC1vYmplY3QtcXVlcnkiIHR5cGU9InJlYWQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gcmVhZCBvYmplY3QgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgcmVhZCBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWFkLWFsbC1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSByZWFkIGFsbCBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCByZWFkIGFsbCBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBleGlzdGVuY2UgcG9saWNpZXMgZm9yIGRldGVybWluaW5nIGlmIGFuIGluc2VydCBvciB1cGRhdGUgc2hvdWxkIG9jY3VyIGZvciBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGVjay1jYWNoZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrLWRhdGFiYXNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXNzdW1lLWV4aXN0ZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzc3VtZS1ub24tZXhpc3RlbmNlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIHF1ZXJ5aW5nIGRhdGFiYXNlIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeS1rZXkgYWxpYXMgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtc3luYy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHR5cGUgb2YgY2FjaGUgc3luY2hyb25pemF0aW9uIHRvIHVzZSB3aXRoIGEgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImludmFsaWRhdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vLWNoYW5nZXMiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGFuZ2Utc2V0LXdpdGgtbmV3LW9iamVjdHMiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGFuZ2Utc2V0IiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idW5pdG9md29yay1pc29sYXRpb24tbGV2ZWwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyB0aGUgdW5pdCBvZiB3b3JrIGlzb2xhdGVkIGZyb20gdGhlIHNlc3Npb24gY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1c2Utc2Vzc2lvbi1jYWNoZS1hZnRlci10cmFuc2FjdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imlzb2xhdGUtbmV3LWRhdGEtYWZ0ZXItdHJhbnNhY3Rpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpc29sYXRlLWNhY2hlLWFmdGVyLXRyYW5zYWN0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXNvbGF0ZS1jYWNoZS1hbHdheXMiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LXF1ZXJ5LWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIGEgZGF0YWJhc2UgY29sdW1uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJxdWVyeS1rZXkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkL2NvbHVtbiBiZWluZyBhbGlhc2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbnNoaXAtcXVlcnkta2V5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIGEgam9pbiB0byBhbm90aGVyIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icXVlcnkta2V5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdGFyZ2V0IHJlZmVyZW5jZWQgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBqb2luIGNvbmRpdGlvbiBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBjbGFzcycgdGFibGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGpvaW4gY3JpdGVyaWEgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgY2xhc3MnIHRhYmxlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lLXF1ZXJ5LWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIGEgMS0xIGpvaW4gdG8gYW5vdGhlciBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1xdWVyeS1rZXkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1tYW55LXF1ZXJ5LWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIGEgMS1tIGpvaW4gZnJvbSBhbm90aGVyIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1xdWVyeS1rZXkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LWRpcmVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgZnJvbSBhbiBhdHRpcmJ1dGUgdG8gYSBzaW1wbGUgZmllbGQgZGF0YXR5cGUsIGkuZS4gU3RyaW5nLCBOdW1iZXIsIERhdGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBhbmQgb3B0aW9uYWxseSB0aGUgdGFibGUgb2YgdGhlIGZpZWxkL2NvbHVtbiB0aGF0IHRoZSBhdHRyaWJ1dGUgaXMgc3RvcmVkIGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibnVsbC12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgYSB2YWx1ZSB0aGF0IG51bGwgZGF0YSB2YWx1ZXMgc2hvdWxkIGJlIGNvbnZlcnRlZCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9InZhbHVlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBob3cgdGhlIGRhdGEgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUgb2JqZWN0IHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1jbGFzc2lmaWNhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgYXR0cmlidXRlIGlzIHBlcnNpc3RlZC4gVGhlIGF0dHJpYnV0ZSBtYXBwaW5nIGRlZmluaXRpb24gaXMgZXh0ZW5kYWJsZSB0byBhbGxvdyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuICBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBhdHRyaWJ1dGUgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVhZC1vbmx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZ2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGdldCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgc2V0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb3BlcnRpZXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IGZvciB1c2VyIGRlZmluZWQgcHJvcGVydGllcyB0byBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0icHJvcGVydHkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgdXNlciBkZWZpbmVkIHByb3BlcnR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBzaW1wbGUgYXR0cmlidXRlIGlzIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWRpcmVjdC1tYXBwaW5nIj4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWRpcmVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgZnJvbSBhbiBhdHRpcmJ1dGUgdG8gYSBzaW1wbGUgZmllbGQgZGF0YXR5cGUsIGkuZS4gU3RyaW5nLCBOdW1iZXIsIERhdGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaXMtY2RhdGEiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im51bGwtcG9saWN5IiB0eXBlPSJhYnN0cmFjdC1udWxsLXBvbGljeSIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1kaXJlY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIGZyb20gYW4gYXR0aXJidXRlIHRvIGEgc2ltcGxlIGZpZWxkIGRhdGF0eXBlLCBpLmUuIFN0cmluZywgTnVtYmVyLCBEYXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1kaXJlY3QtbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGZpZWxkIHRyYW5zZm9ybWF0aW9uIGZvciBhIHRyYW5zZm9ybWF0aW9uIG1hcHBpbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1iYXNlZC1maWVsZC10cmFuc2Zvcm1hdGlvbiI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2Zvcm1lci1iYXNlZC1maWVsZC10cmFuc2Zvcm1hdGlvbiI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgdHJhbnNmb3JtYXRpb24gbWFwcGluZyB0aGF0IHVzZXMgSmF2YSBjb2RlIHRvIHRyYW5zZm9ybSBiZXR3ZWVuIHRoZSBkYXRhIGFuZCBvYmplY3QgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiBhIHNpbmdsZSBhdHRyaWJ1dGUgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMsIG9yIGZpZWxkIG9ubHkgbWFwcGluZ3Mgb3IgYXR0cmlidXRlIG9ubHkgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHJhbnNmb3JtYXRpb24gZGVmaW5lZCBpbiB0aGUgZG9tYWluIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLXRyYW5zZm9ybWVyIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBjbGFzcyBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHJhbnNmb3JtZXIuIFVzZWQgaW4gcGxhY2Ugb2YgYXR0cmlidXRlLXRyYW5zZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZC10cmFuc2Zvcm1hdGlvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIHRyYW5zZm9ybWF0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIiB0eXBlPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtYXRpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgYSBzaW5nbGUgYXR0cmlidXRlIG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzLCBvciBmaWVsZCBvbmx5IG1hcHBpbmdzIG9yIGF0dHJpYnV0ZSBvbmx5IG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtdHJhbnNmb3JtYXRpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgYSBzaW5nbGUgYXR0cmlidXRlIG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzLCBvciBmaWVsZCBvbmx5IG1hcHBpbmdzIG9yIGF0dHJpYnV0ZSBvbmx5IG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtdHJhbnNmb3JtYXRpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgYSBzaW5nbGUgYXR0cmlidXRlIG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzLCBvciBmaWVsZCBvbmx5IG1hcHBpbmdzIG9yIGF0dHJpYnV0ZSBvbmx5IG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhZ2dyZWdhdGUtb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcmVsYXRpb25zaGlwIHdoZXJlIHRoZSB0YXJnZXQgb2JqZWN0IGlzIHN0cmljdGx5IHByaXZhdGVseSBvd25lZCBieSB0aGUgc291cmNlIG9iamVjdCBhbmQgc3RvcmVzIHdpdGhpbiB0aGUgc291cmNlIG9iamVjdHMgcm93PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgdGFyZ2V0IGNsYXNzIG9mIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJhbGxvdy1udWxsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIGEgcm93IG9mIGFsbCBudWxscyBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgbnVsbC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkLXRyYW5zbGF0aW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyBmb3IgdGhlIG1hcHBpbmcgdG8gdXNlIGRpZmZlcmVudCBmaWVsZCBuYW1lcyB0aGFuIHRoZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtdHJhbnNsYXRpb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic291cmNlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgaW4gdGhlIHNvdXJjZSBkZXNjcmlwdG9yJ3MgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgaW4gdGhlIGFnZ3JlZ2F0ZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBjbGFzc2VzIGlzIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSB0YXJnZXQgY2xhc3Mgb2YgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSB0YXJnZXQgb2JqZWN0cyBhcmUgcHJpdmF0ZWx5IG93bmVkIGRlcGVuZGVudCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgY3JlYXRlIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FzY2FkZWQgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhc2NhZGUtbWVyZ2UiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGNyZWF0ZSBvcGVyYXRpb24gc2hvdWxkIGJlIGNhc2NhZGVkIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYXNjYWRlLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHJlZnJlc2ggb3BlcmF0aW9uIHNob3VsZCBiZSBjYXNjYWRlZCB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FzY2FkZS1yZW1vdmUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHJlbW92ZSBvcGVyYXRpb24gc2hvdWxkIGJlIGNhc2NhZGVkIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW9uZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtMSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1vbmUtdG8tb25lLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS0xIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib25lLXRvLW9uZS1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtbSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGluIHRoZSB0YXJnZXQgY2xhc3MnIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkZWxldGUtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcmVsYXRlZCBvYmplY3RzIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtb25lLXRvLW1hbnktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLW0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNvdXJjZS1mb3JlaWduLWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idGFyZ2V0LWZvcmVpZ24ta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleS1ncm91cGluZy1lbGVtZW50IiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkZWxldGUtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcmVsYXRlZCBvYmplY3RzIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBzaW1wbGUgdHlwZXMgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byBhIHNldCBvZiBzaW1wbGUgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0iZGF0YS1yZWFkLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtdGFibGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgc291cmNlIHByaW1hcnkga2V5IGFuZCB0aGUgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlyZWN0LWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQvY29sdW1uIGluIHRoZSByZWZlcmVuY2UgdGFibGUgdGhhdCBzdG9yZXMgdGhlIGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGluIHRoZSByZWZlcmVuY2UgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXIiIHR5cGU9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgaG93IHRoZSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9iamVjdCB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imluc2VydC1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBpbnNlcnQgYSByb3cgaW50byB0aGUgcmVmZXJlbmNlIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGEgcm93IGZyb20gdGhlIHJlZmVyZW5jZSB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByb3dzIGZyb20gdGhlIHJlZmVyZW5jZSB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2Vzc2lvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIHNlc3Npb24gdGhhdCBkZWZpbmVzIHRoZSByZWZlcmVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJoaXN0b3J5LXBvbGljeSIgdHlwZT0iaGlzdG9yeS1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgcGFzdCB2ZXJzaW9ucyBvZiB0aGlzIGF0dHJpYnV0ZSBhcmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhLXN0b3JlLiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGhpc3RvcnkgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LW1hcC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcCByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIGEgc2V0IG9mIGtleSB2YWx1ZXMgcGFpcnMgb2Ygc2ltcGxlIGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlyZWN0LWtleS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkL2NvbHVtbiBpbiB0aGUgcmVmZXJlbmNlIHRhYmxlIHRoYXQgc29yZXMgdGhlIG1hcCBrZXkgZGF0YSB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImtleS1jb252ZXJ0ZXIiIHR5cGU9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgaG93IHRoZSBrZXkgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZSBvYmplY3QgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFnZ3JlZ2F0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS1tIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZXMgd2hlcmUgdGhlIHRhcmdldCBpbnN0YW5jZXMgYXJlIHN0cmljdGx5IHByaXZhdGVseSBvd25lZCBieSB0aGUgc291cmNlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBpbiB0aGUgdGFyZ2V0IGNsYXNzJyB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGVsZXRlLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJlbGF0ZWQgb2JqZWN0cyBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1tYW55LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbS1tIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVsYXRpb24tdGFibGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBzb3VyY2UvdGFyZ2V0IHByaW1hcnkga2V5cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb3VyY2UtcmVsYXRpb24tZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBmcm9tIHRoZSByZWxhdGlvbmFsIHRhYmxlIHRvIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1yZWxhdGlvbi1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGZyb20gdGhlIHJlbGF0aW9uYWwgdGFibGUgdG8gdGhlIHRhcmdldCBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imluc2VydC1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBpbnNlcnQgYSByb3cgaW50byB0aGUgcmVsYXRpb24gdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYSByb3cgZnJvbSB0aGUgcmVsYXRpb24gdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcm93cyBmcm9tIHRoZSByZWxhdGlvbiB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaGlzdG9yeS1wb2xpY3kiIHR5cGU9Imhpc3RvcnktcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHBhc3QgdmVyc2lvbnMgb2YgdGhpcyBhdHRyaWJ1dGUgYXJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YS1zdG9yZS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBoaXN0b3J5IHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLTEgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlIHRoYXQgbWF5IGJlIG9mIHNldmVyYWwgdHlwZXMgcmVsYXRlZCB0aHJvdWdoIGFuIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InR5cGUtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIGNvbHVtbiB0byBzdG9yZSB0aGUgY2xhc3MgdHlwZSBvZiB0aGUgcmVsYXRlZCBvYmplY3QgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9yZWlnbi1rZXktdG8tcXVlcnkta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHNvdXJjZS90YXJnZXQgY29sdW1uL3F1ZXJ5IGtleSByZWZlcmVuY2VzIHJlbGF0aW5nIGEgZm9yZWlnbiBrZXkgaW4gb25lIHRhYmxlIHRvIHRoZSBxdWVyeSBrZXlzIGRlZmluaW5nIGEgcHJpbWFyeSBvciB1bmlxdWUga2V5IHZhbHVlIGluIHRoZSBvdGhlciBpbnRlcmZhY2UgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJxdWVyeS1rZXktcmVmZXJlbmNlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByZWZlcmVuY2Ugb2YgYSBzb3VyY2UgdGFibGUgZm9yZWlnbiBrZXkgYW5kIGEgdGFyZ2V0IGludGVyZmFjZSBkZXNjcmlwdG9yIHF1ZXJ5IGtleS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGZpZWxkL2NvbHVtbiBuYW1lIGluIHRoZSBzb3VyY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LXF1ZXJ5LWtleSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkga2V5IG5hbWUgb2YgdGhlIHRhcmdldCBpbnRlcmZhY2UgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiIHR5cGU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGNsYXNzIGluZGljYXRvciB2YWx1ZXMgYW5kIHRoZSBzdWJjbGFzc2VzIHRoZXkgbWFwIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbnRhaW5lci9jb2xsZWN0aW9uIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb2xsZWN0aW9uLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24gY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNvcnRlZC1jb2xsZWN0aW9uLWNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc29ydGVkIGNvbGxlY3Rpb24gdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29tcGFyYXRvci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb21wYXJpdG9yLCB1c2VkIHRvIGNvbXBhcmUgb2JqZWN0cyBpbiBzb3J0aW5nIHRoZSBjb2xsZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsaXN0LWNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbGlzdCBjb2xsZWN0aW9uIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1jb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcCBjb250YWluZXIgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWFwLWtleS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBtZXRob2QgdG8gY2FsbCBvbiB0aGUgdGFyZ2V0IG9iamVjdHMgdG8gZ2V0IHRoZSBrZXkgdmFsdWUgZm9yIHRoZSBtYXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1tYXAtY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgbWFwIGNvbnRhaW5lciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY3JvbGxhYmxlLWN1cnNvci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc2Nyb2xsYWJsZSBjdXJzb3IgY29udGFpbmVyIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1cnNvcmVkLXN0cmVhbS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY3Vyc29yZWQgc3RyZWFtIGNvbnRhaW5lciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmRpcmVjdGlvbi1wb2xpY3kiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRlZmVycmVkIHJlYWQgaW5kaXJlY3Rpb24gbWVjaGFuaXNtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsdWUtaG9sZGVyLWluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdXNhZ2Ugb2YgdmFsdWUgaG9sZGVycyB0byBpbXBsZW1lbnQgaW5kaXJlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluZGlyZWN0aW9uLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJveHktaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB1c2FnZSBvZiBwcm94aWVzIHRvIGltcGxlbWVudCBpbmRpcmVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5kaXJlY3Rpb24tcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc3BhcmVudC1jb2xsZWN0aW9uLWluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdXNhZ2Ugb2YgdHJhbnNwYXJlbnQgY29sbGVjdGlvbnMgdG8gaW1wbGVtZW50IGluZGlyZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbGxlY3Rpb24tdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIGludGVyZmFjZSB0byB1c2UsIGkuZS4gTGlzdCwgU2V0LCBNYXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtYXAta2V5LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIG1ldGhvZCB0byBjYWxsIG9uIHRoZSB0YXJnZXQgb2JqZWN0cyB0byBnZXQgdGhlIGtleSB2YWx1ZSBmb3IgdGhlIG1hcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udGFpbmVyLWluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdXNhZ2Ugb2YgYSB1c2VyIGRlZmluZWQgY29udGFpbmVyIHRvIGltcGxlbWVudCBpbmRpcmVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29udGFpbmVyIGltcGxlbWVudGVyIHRvIHVzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWxpc3QtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+TGlzdCBjb252ZXJ0ZXI8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvYmplY3QtY2xhc3MtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBsaXN0J3MgZWxlbWVudCB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPiAKLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZXNhZmUtZW51bWVyYXRpb24tY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VHlwZXNhZmUgRW51bWVyYXRpb24gY29udmVyc2lvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2YWx1ZS1jb252ZXJ0ZXIiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGUtY29udmVyc2lvbi1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGRhdGEgdHlwZSBhbmQgYW4gb2JqZWN0IHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSB0byBjb252ZXJ0IGJldHdlZW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib2JqZWN0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGF0YS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBhdHRyaWJ1dGVzIHN0b3JhZ2UgZGF0YSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJpYWxpemVkLW9iamVjdC1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VzIG9iamVjdCBzZXJpYWxpemF0aW9uIHRvIGNvbnZlcnQgYmV0d2VlbiB0aGUgb2JqZWN0IGFuZCBkYXRhIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZXMgc3RvcmFnZSBkYXRhIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIG1hcHBpbmcgb2YgdmFsdWVzIGZyb20gZGF0YWJhc2UgdmFsdWVzIHVzZWQgaW4gdGhlIGZpZWxkIGFuZCBvYmplY3QgdmFsdWVzIHVzZWQgaW4gdGhlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWZhdWx0LXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBvcHRpb25hbCBkZWZhdWx0IHZhbHVlIGNhbiBiZSBzcGVjaWZpZWQuICBUaGlzIHZhbHVlIGlzIHVzZWQgaWYgYSBkYXRhYmFzZSB0eXBlIGlzIG5vdCBmb3VuZCBpbiB0aGUgdHlwZSBtYXBwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtbWFwcGluZ3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBtYXBwaW5nIG9mIHZhbHVlcy4gIEJvdGggdGhlIG9iamVjdCBhbmQgZGF0YWJhc2UgdmFsdWVzIG11c3QgYmUgdW5pcXVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InR5cGUtbWFwcGluZyIgdHlwZT0idHlwZS1tYXBwaW5nIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIG9iamVjdCBhbmQgZGF0YSB2YWx1ZSBtYXBwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtb25seS10eXBlLW1hcHBpbmdzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIG1hcHBpbmcgb2YgYWRkaXRpb25hbCB2YWx1ZXMgdGhhdCBtYXAgbm9uLXVuaXF1ZSBkYXRhIHZhbHVlcyB0byBhIHVuaXF1ZSBhdHRyaWJ1dGUgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idHlwZS1tYXBwaW5nIiB0eXBlPSJ0eXBlLW1hcHBpbmciPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgb2JqZWN0IGFuZCBkYXRhIHZhbHVlIG1hcHBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIGFuIG9iamVjdCBhbmQgZGF0YSB2YWx1ZSBtYXBwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgdmFsdWUgdG8gdXNlIGluIHRoZSBvYmplY3QncyBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YS12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgdmFsdWUgdG8gdXNlIGluIHRoZSBkYXRhYmFzZSBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2UtcXVlcnkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5L2ludGVyYWN0aW9uIGFnYWluc3QgYSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9Im1haW50YWluLWNhY2hlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCBieXBhc3MgdGhlIGNhY2hlIGNvbXBsZXRlbHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaW5kLWFsbC1wYXJhbWV0ZXJzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCB1c2UgcGFyYW1hdGVyIGJpbmRpbmcgZm9yIGFyZ3VtZW50cywgb3IgcHJpbnQgdGhlIGFyZ3VtZW50cyBpbi1saW5lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FjaGUtc3RhdGVtZW50IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJpZXMgc3RhdGVtZW50IHNob3VsZCBiZSBjYWNoZWQsIHRoaXMgbXVzdCBiZSB1c2VkIHdpdGggcGFyYW1ldGVyIGJpbmRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSB0aW1lb3V0IHRvIGNhbmNlbCB0aGUgcXVlcnkgaW4gaWYgdGhlIHJlcXVlc3QgdGFrZXMgdG9vIGxvbmcgdG8gY29tcGxldGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJwcmVwYXJlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCBwcmVwYXJlIGFuZCBjYWNoZSBpdHMgZ2VuZXJhdGVkIFNRTCwgb3IgcmVnZW5lcmF0ZSB0aGUgU1FMIG9uIGVhY2ggZXhlY3V0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FsbCIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIHN0YXRpYyBjYWxscyB0aGUgU1FMIG9yIFN0b3JlZCBQcm9jZWR1cmUgY2FsbCBkZWZpbml0aW9uIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGpvaW4gZmV0Y2ggb3B0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbm5lci1qb2luIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib3V0ZXItam9pbiIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhc2NhZGUtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGNhc2NhZGUgcG9saWNpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icHJpdmF0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFsbCIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZS1yZWFkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciByZWFkaW5nIGEgc2luZ2xlIHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkaXJlY3QtcmVhZC1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LXJlYWQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHJlYWRpbmcgYSBjb2xsZWN0aW9uIG9mIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YS1yZWFkLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhLXJlYWQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHJlYWRpbmcgcmF3IGRhdGEuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlYWQtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLXF1ZXJ5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgcmVhZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYWNoZS1xdWVyeS1yZXN1bHRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCBjYWNoZSB0aGUgcXVlcnkgcmVzdWx0cyB0byBhdm9pZCBmdXR1cmUgZXhlY3V0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1heC1yb3dzIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gZmV0Y2gsIHJlc3VsdHMgd2lsbCBiZSB0cnVuY3RhdGUgb24gdGhlIGRhdGFiYXNlIHRvIHRoaXMgc2l6ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpcnN0LXJlc3VsdCIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHdoZXJlIHRvIHN0YXJ0IHRoZSBjdXJzb3IgaW4gYSByZXN1bHQgc2V0IHJldHVybmVkIGZyb20gdGhlIGRhdGFiYXNlLiBSZXN1bHRzIHByaW9yIHRvIHRoaXMgbnVtYmVyIHdpbGwgbm90IGJlIGJ1aWx0IGludG8gb2JqZWN0czwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmV0Y2gtc2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzcyB0aGUgbnVtYmVyIG9mIHJvd3MgdG8gZmV0Y2ggZnJvbSB0aGUgZGF0YWJhc2Ugb24gZWFjaCByZXN1bHQgc2V0IG5leHQgb3BlcmF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcnktcmVzdWx0LWNhY2hlLXBvbGljeSIgdHlwZT0icXVlcnktcmVzdWx0LWNhY2hlLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyB0aGUgcXVlcnkgcmVzdWx0cyBzaG91bGQgYmUgY2FjaGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1yZXN1bHQtY2FjaGUtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBxdWVyeSdzIHJlc3VsdHMgc2hvdWxkIGJlIGNhY2hlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImludmFsaWRhdGlvbi1wb2xpY3kiIHR5cGU9ImNhY2hlLWludmFsaWRhdGlvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeS4gQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIxMDAiIG5hbWU9Im1heGltdW0tY2FjaGVkLXJlc3VsdHMiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGRlZmluZXMgdGhlIG51bWJlciBvZiBxdWVyeSByZXN1bHQgc2V0cyB0aGF0IHdpbGwgYmUgY2FjaGVkLiBUaGUgTFJVIHF1ZXJ5IHJlc3VsdHMgd2lsbCBiZSBkaXNjYXJkZWQgd2hlbiB0aGUgbWF4IHNpemUgaXMgcmVhY2hlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIG1hbmlwdWxhdGluZyBkYXRhLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LW1vZGlmeS1xdWVyeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIG1vZGlmeWluZyBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1cGRhdGUtb2JqZWN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciB1cGRhdGluZyBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1tb2RpZnktcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc2VydC1vYmplY3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGluc2VydGluZyBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1tb2RpZnktcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlbGV0ZS1vYmplY3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGRlbGV0aW5nIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LW1vZGlmeS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZG9lcy1leGlzdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gb2JqZWN0IGV4aXN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImV4aXN0ZW5jZS1jaGVjayIgdHlwZT0iZXhpc3RlbmNlLWNoZWNrIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBleGlzdGVuY2UgY2hlY2sgb3B0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImV4aXN0ZW5jZS1jaGVjayI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBleGlzdGVuY2UgY2hlY2sgb3B0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrLWNhY2hlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hlY2stZGF0YWJhc2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhc3N1bWUtZXhpc3RlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXNzdW1lLW5vbi1leGlzdGVuY2UiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgZGVsZXRpbmcgYSBjcml0ZXJpYSBvZiBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LWxldmVsLXJlYWQtcXVlcnkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBvYmplY3RzIChhcyBhcHBvc2VkIHRvIGRhdGEpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWFkLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGwgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIG9mIG9iamVjdHMgYmVpbmcgcXVlcmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBxdWVyeSBzaG91bGQgcmVmcmVzaCBhbnkgY2FjaGVkIG9iamVjdHMgZnJvbSB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVtb3RlLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHF1ZXJ5IHNob3VsZCByZWZyZXNoIGFueSByZW1vdGVseSBjYWNoZWQgb2JqZWN0cyBmcm9tIHRoZSBzZXJ2ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJjYXNjYWRlLXBvbGljeSIgdHlwZT0iY2FzY2FkZS1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyaWVzIHNldHRpbmdzIChzdWNoIGFzIHJlZnJlc2gsIG1haW50YWluLWNhY2hlKSBzaG91bGQgYXBwbHkgdG8gdGhlIG9iamVjdCdzIHJlbGF0aW9uc2hpcCBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0icHJpbWFyeS1rZXkiIG5hbWU9ImNhY2hlLXVzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IHRoZSBxdWVyeSBzaG91bGQgaW50ZXJhY3Qgd2l0aCB0aGUgY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJsb2NrLW1vZGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcXVlcnkgc2hvdWxkIGxvY2sgdGhlIHJlc3VsdGluZyByb3dzIG9uIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImRpc3RpbmN0LXN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHF1ZXJ5IHNob3VsZCBmaWx0ZXIgZGlzdGluY3QgcmVzdWx0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluLW1lbW9yeS1xdWVyeWluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW4gbWVtb3J5IHF1ZXJ5aW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IGRlZmF1bHQ9Imlnbm9yZS1leGNlcHRpb25zLXJldHVybi1jb25mb3JtZWQiIG5hbWU9InBvbGljeSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyBpbmRpcmVjdGlvbiBvciB1bmNvbmZvcm1hYmxlIGV4cHJlc3Npb25zIHNob3VsZCBiZSB0cmVhdGluZyB3aXRoIGluLW1lbW9yeSBxdWVyeWluZyBhbmQgY29uZm9ybWluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0idXNlLWRlZmF1bHQtZmV0Y2gtZ3JvdXAiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGRlZmF1bHQgZmV0Y2ggZ3JvdXAgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZldGNoLWdyb3VwIiB0eXBlPSJmZXRjaC1ncm91cCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgcXVlcnkgdG8gcGFydGlhbGx5IGZldGNoIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmZXRjaC1ncm91cC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgYSBwcmUtZGVmaW5lZCBuYW1lZCBmZXRjaCBncm91cCB0byBhbGxvdyB0aGUgcXVlcnkgdG8gcGFydGlhbGx5IGZldGNoIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLWV4Y2x1c2l2ZS1jb25uZWN0aW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBleGNsdXNpdmUgY29ubmVjdGlvbiAoVlBEKSBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iam9pbmVkLWF0dHJpYnV0ZS1leHByZXNzaW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGF0dHJpYnV0ZXMgYmVpbmcgam9pbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIGpvaW5pbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiBvYmplY3RzIHJlc3VsdGluZyBmcm9tIHRoZSBxdWVyeSBhcmUgcmVhZC1vbmx5LCBhbmQgd2lsbCBub3QgYmUgcmVnaXN0ZXJlZCBpbiB0aGUgdW5pdCBvZiB3b3JrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Im91dGVyLWpvaW4tc3ViY2xhc3NlcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGluaGVyaXRhbmNlIHF1ZXJpZXMgc3BlY2lmeSBpZiBhbGwgc3ViY2xhc3NlcyBzaG91bGQgYmUgb3V0ZXIgam9pbmVkLCBpbnN0ZWFkIG9mIGEgcXVlcnkgcGVyIHN1YmNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgYSBzZXQgb2Ygb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LWxldmVsLXJlYWQtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmF0Y2gtcmVhZC1hdHRyaWJ1dGUtZXhwcmVzc2lvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGFsbCBhdHRyaWJ1dGVzIGZvciBiYXRjaCByZWFkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIGJhdGNoIHJlYWRpbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3JkZXItYnktZXhwcmVzc2lvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2V0cyB0aGUgb3JkZXIgZXhwcmVzc2lvbnMgZm9yIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBleHByZXNzaW9uIGZvciBvcmRlcmluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBhIHNpbmdsZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1sZXZlbC1yZWFkLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXBvcnQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5RdWVyeSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYSBzZXQgb2Ygb2JqZWN0cyBpbnN0ZWFkIG9mIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4tY2hvaWNlIiB0eXBlPSJyZXR1cm4tY2hvaWNlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNpbXBsaWZpZXMgdGhlIHJlc3VsdCBieSBvbmx5IHJldHVybmluZyB0aGUgZmlyc3QgcmVzdWx0LCBmaXJzdCB2YWx1ZSwgb3IgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXRyaWV2ZS1wcmltYXJ5LWtleXMiIHR5cGU9InJldHJpZXZlLXByaW1hcnkta2V5cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2V0aGVyIHRoZSBwcmltYXJ5IGtleSB2YWx1ZXMgc2hvdWxkIGFsc28gYmUgcmV0cmlldmVkIGZvciB0aGUgcmVmZXJlbmNlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVwb3J0LWl0ZW1zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkl0ZW1zIHRvIGJlIHNlbGVjdGVkLCB0aGVzZSBjb3VsZCBiZSBhdHRyaWJ1dGVzIG9yIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpdGVtIiB0eXBlPSJyZXBvcnQtaXRlbSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGl0ZW0gcmVxdWVzdGVkPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imdyb3VwLWJ5LWV4cHJlc3Npb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNldHMgR1JPVVAgQlkgZXhwcmVzc2lvbnMgZm9yIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBleHByZXNzaW9uIGZvciBncm91cGluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icmV0dXJuLWNob2ljZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNpbXBsaWZpZXMgdGhlIHJlc3VsdCBieSBvbmx5IHJldHVybmluZyB0aGUgZmlyc3QgcmVzdWx0LCBmaXJzdCB2YWx1ZSwgb3IgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXR1cm4tc2luZ2xlLXJlc3VsdCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJldHVybi1zaW5nbGUtdmFsdWUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXR1cm4tc2luZ2xlLWF0dHJpYnV0ZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InJldHJpZXZlLXByaW1hcnkta2V5cyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB3ZXRoZXIgdGhlIHByaW1hcnkga2V5IHZhbHVlcyBzaG91bGQgYWxzbyBiZSByZXRyaWV2ZWQgZm9yIHRoZSByZWZlcmVuY2UgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmdWxsLXByaW1hcnkta2V5IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmlyc3QtcHJpbWFyeS1rZXkiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuby1wcmltYXJ5LWtleSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXBvcnQtaXRlbSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gaXRlbSByZXF1ZXN0ZWQgaW4gUmVwb3J0UXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TmFtZSBnaXZlbiBmb3IgaXRlbSwgY2FuIGJlIHVzZWQgdG8gcmV0aWV2ZSB2YWx1ZSBmcm9tIHJlc3VsdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhwcmVzc2lvbiAocGFydGlhbCkgdGhhdCBkZXNjcmliZXMgdGhlIGF0dHJpYnV0ZSB3YW50ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImV4cHJlc3Npb24iIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZpbHRlciBleHByZXNzaW9uIHRyZWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbi1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHJlbGF0aW9uIGV4cHJlc3Npb24gdGhhdCBjb21wYXJlcyB0byBleHByZXNzaW9ucyB0aHJvdWdoIG9wZXJhdG9ycyBzdWNoIGFzIGVxdWFsLCBsZXNzVGhhbiwgZXRjLi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxlZnQiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJpZ2h0IiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0b3IiIHR5cGU9Im9wZXJhdG9yIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2dpYy1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgdHdvIHN1Yi1leHByZXNzaW9ucyBqb2luZWQgdGhyb3VnaCBhbiBvcGVyYXRvciBzdWNoIGFzIEFORCwgT1IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsZWZ0IiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyaWdodCIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdG9yIiB0eXBlPSJvcGVyYXRvciIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZnVuY3Rpb24tZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBleHByZXNzaW9uIGNvbXBvc2VkIG9mIGEgZnVuY3Rpb24gYXBwbGllZCB0byBhIGxpc3Qgb2Ygc3ViLWV4cHJlc3Npb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZnVuY3Rpb24gYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhcmd1bWVudCBleHByZXNzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZ1bmN0aW9uIiB0eXBlPSJvcGVyYXRvciIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29uc3RhbnQtZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiB2YWx1ZS4gIElmIHRoZSB2YWx1ZSBpcyBudWxsIHRoZSB2YWx1ZSB0YWcgY2FuIGlzIGFic2VudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnkta2V5LWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gcXVlcnkta2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzZSIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFueS1vZiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im91dGVyLWpvaW4iIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNlIiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGFyYW1ldGVyLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gcGFyYW1ldGVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2UtZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiBidWlsZGVyL2Jhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3BlcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgb3BlcmF0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3FsLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIFNRTCBxdWVyeSBsYW5ndWFnZSBzdHJpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxsIFNRTCBxdWVyeSBzdHJpbmcuICBBcmd1bWVudHMgY2FuIGJlIHNwZWNpZmllZCB0aHJvdWdoICNhcmctbmFtZSB0b2tlbnMgaW4gdGhlIHN0cmluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpicWwtY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gRUpCLVFMIHF1ZXJ5IGxhbmd1YWdlIHN0cmluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamJxbCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgRUpCLVFMIHF1ZXJ5IHN0cmluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RvcmVkLXByb2NlZHVyZS1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgaW52b2NhdGlvbiBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb2NlZHVyZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY3Vyc29yLW91dHB1dC1wcm9jZWR1cmUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgY2FsbCB0byB1c2UgYSBjdXJzb3Igb3V0cHV0IHBhcmFtZXRlciB0byBkZWZpbmUgdGhlIHJlc3VsdCBzZXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgaW5wdXQgYW5kIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0icHJvY2VkdXJlLWFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYXJndW1lbnQgdG8gdGhlIHByb2NlZHVyZS4gVGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudHMgbXVzdCBtYXRjaCB0aGUgcHJvY2VkdXJlIGFyZ3VtZW50cyBpZiBub3QgbmFtZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RvcmVkLWZ1bmN0aW9uLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIGZ1bmN0aW9uIGludm9jYXRpb24gZGVmaW5pdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic3RvcmVkLXByb2NlZHVyZS1jYWxsIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBuYW1lPSJzdG9yZWQtZnVuY3Rpb24tcmVzdWx0IiB0eXBlPSJwcm9jZWR1cmUtb3V0cHV0LWFyZ3VtZW50Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHN0b3JlZC1mdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgY2FsbCBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc3RvcmVkIHByb2NlZHVyZSBuYW1lIG9mIHRoZSBhcmd1bWVudC4gRm9yIGluZGV4ZWQgYXJndW1lbnQgdGhlIG5hbWUgaXMgbm90IHJlcXVpcmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IG5hbWUgb2YgdGhlIGFyZ3VtZW50LiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudCBhcyBkZWZpbmUgaW4gdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYXJndW1lbnQgY2xhc3MgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudC1zcWx0eXBlIiB0eXBlPSJ4c2Q6aW50Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgSkRCQyBpbnQgdHlwZSBvZiB0aGUgYXJndW1lbnQsIGFzIGRlZmluZWQgaW4gamF2YS5qZGJjLlR5cGVzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQtc3FsdHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgdHlwZSBpZiBwcm9jZWR1cmUtYXJndW1lbnQtc3FsdHlwZSBpcyBTVFJVQ1Qgb3IgQVJSQVk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50LXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHByb2NlZHVyZSBhcmd1bWVudCB2YWx1ZSBtYXliZSBiZSBzcGVjaWZpZWQgaWYgbm90IHVzaW5nIGEgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb2NlZHVyZS1vdXRwdXQtYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBjYWxsIG91dHB1dCBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icHJvY2VkdXJlLWFyZ3VtZW50IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9jZWR1cmUtaW5vdXRwdXQtYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBjYWxsIG91dHB1dCBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icHJvY2VkdXJlLWFyZ3VtZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3V0cHV0LWFyZ3VtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IG5hbWUgb2YgdGhlIGFyZ3VtZW50LiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudCBhcyBkZWZpbmUgaW4gdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1zdG9yZWQtcHJvY2VkdXJlLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBpbnZvY2F0aW9uIGRlZmluaXRpb24gd2hvc2UgYXJndW1lbnRzIGNvbnRhaW4gYXQgbGVhc3Qgb25lIE9yYWNsZSBQTC9TUUwgdHlwZSB0aGF0IGhhcyBubyBKREJDIHJlcHJlc2VudGF0aW9uIChlLmcuIEJPT0xFQU4sIFBMU19JTlRFR0VSLCBQTC9TUUwgcmVjb3JkKS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhbmQgb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFyZ3VtZW50IHRvIHRoZSBwcm9jZWR1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRleCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamRiYy10eXBlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLXR5cGUiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1yZWNvcmQiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbXBhdGlibGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJqYXZhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGZpZWxkcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFyZ3VtZW50IHRvIHRoZSBwcm9jZWR1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtY29sbGVjdGlvbiI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29tcGF0aWJsZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImphdmEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuZXN0ZWQtdHlwZSIgdHlwZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNsYXNzIG1hcHBpbmcgdG8gYW4gRUlTIHJlY29yZCBkYXRhIHN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHJlY29yZCBzdHJ1Y3R1cmUgbmFtZSB0aGUgZGVzY3JpcHRvciBtYXBzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZXNwYWNlLXJlc29sdmVyIiB0eXBlPSJuYW1lc3BhY2UtcmVzb2x2ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWVzcGFjZSByZXNvbHZlciBmb3IgdGhlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1pbnRlcmFjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gRUlTIGludGVyYWN0aW9uIHV0aWxpemluZyBNYXBwZWRSZWNvcmQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1yZXN1bHQtcGF0aCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgaW5wdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtcmVzdWx0LXBhdGgiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIG91dHB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1pbnRlcmFjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gRUlTIGludGVyYWN0aW9uIHV0aWxpemluZyBYTUwgcmVjb3Jkcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LXJlY29yZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIHRvIHVzZSBmb3IgdGhlIGlucHV0IHJlY29yZCwgaWYgcmVxdWlyZWQgYnkgdGhlIGFkYXB0ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1yb290LWVsZW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgb3V0cHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtcmVzdWx0LXBhdGgiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIGlucHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0LXJlc3VsdC1wYXRoIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBvdXRwdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgaW5wdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBvdXRwdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmRleGVkLWludGVyYWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBFSVMgaW50ZXJhY3Rpb24gdXRpbGl6aW5nIEluZGV4ZWQgcmVjb3Jkcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImludGVyYWN0aW9uLWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBpbnRlcmFjdGlvbiBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50LXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHByb2NlZHVyZSBhcmd1bWVudCB2YWx1ZSBtYXliZSBiZSBzcGVjaWZpZWQgaWYgbm90IHVzaW5nIGEgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW50ZXJhY3Rpb24gbmFtZSBvZiB0aGUgYXJndW1lbnQuIEZvciBpbmRleGVkIGFyZ3VtZW50cyB0aGUgbmFtZSBpcyBub3QgcmVxdWlyZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFyZ3VtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IG5hbWUgb2YgdGhlIGFyZ3VtZW4uIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGFzIGRlZmluZSBpbiB0aGUgcXVlcnksIG9yIHRoZSBkZXNjcmlwdG9yIGZpZWxkIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtcmVsYXRpb25hbC1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhIFN0cnVjdHVyZSB0eXBlIGluIGFuIG9iamVjdC1yZWxhdGlvbmFsIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbmFsLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgc3RydWN0dXJlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZC1vcmRlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgb3JkZXJlZCBsaXN0IG9mIHRoZSBmaWVsZCBkZWZpbmVkIGluIHRoZSBzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuZXN0ZWQtdGFibGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLW0vbS1tIHJlbGF0aW9uc2hpcCB0aGF0IG1ha2VzIHVzZSBvZiB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgbmVzdGVkLXRhYmxlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZC9jb2x1bW4gaW4gdGhlIHNvdXJjZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgbmVzdGVkLXRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBvYmplY3QtcmVsYXRpb25hbCB0eXBlIG5hbWUgb2YgdGhlIG5lc3RlZC10YWJsZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcnJheS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgcHJpbWl0aXZlL3NpbXBsZSB0eXBlIHZhbHVlcyB1c2luZyB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgYXJyYXkgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBvYmplY3QtcmVsYXRpb25hbCB0eXBlIG5hbWUgb2YgdGhlIHN0cnVjdHVyZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtYXJyYXktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIG9iamVjdC10eXBlcyB1c2luZyB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgYXJyYXkgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBvYmplY3QtcmVsYXRpb25hbCB0eXBlIG5hbWUgb2YgdGhlIHN0cnVjdHVyZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdHJ1Y3R1cmUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdHJ1Y3R1cmUgb2Ygb2JqZWN0LXR5cGVzIHVzaW5nIHRoZSBvYmplY3QtcmVsYXRpb25hbCBzdHJ1Y3R1cmUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBvYmplY3QtdHlwZSB1c2luZyB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgcmVmZXJlbmNlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCBpbiB0aGUgc291cmNlIHR5cGUgdGhhdCBzdG9yZXMgdGhlIHJlZmVyZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXJlbGF0aW9uYWwtZmllbGQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIE9iamVjdFJlbGF0aW9uYWxEYXRhYmFzZUZpZWxkPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuZXN0ZWQtdHlwZS1maWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QteG1sLXR5cGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgbWFwcGluZyB0byBhbiBPcmFjbGUgWERCIFhNTCBUeXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkaXJlY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVhZC13aG9sZS1kb2N1bWVudCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGhvdyB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZSBvYmplY3QgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGEgdXNlciBkZWZpbmVkIGNvbnZlcnRlciBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29sbGVjdGlvbi1yZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLU0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBYTUwgZWxlbWVudCB0byB0aGUgdGFyZ2V0IFhNTCBlbGVtZW50IGJhc2VkIG9uIGEga2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4bWwtb2JqZWN0LXJlZmVyZW5jZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXJwb2xpY3kiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VzLXNpbmdsZS1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLW9iamVjdC1yZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLTEgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBYTUwgZWxlbWVudCB0byB0aGUgdGFyZ2V0IFhNTCBlbGVtZW50IGJhc2VkIG9uIG9uZSBvciBtb3JlIGtleXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFnZ3JlZ2F0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic291cmNlLXRvLXRhcmdldC1rZXktZmllbGQtYXNzb2NpYXRpb24iIHR5cGU9ImZvcmVpZ24ta2V5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNvdXJjZS10by10YXJnZXQta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLWNkYXRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJudWxsLXBvbGljeSIgdHlwZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgbmVzdGVkIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIG5lc3RlZCBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItZ2V0LW1ldGhvZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1zZXQtbWV0aG9kIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2VlcC1hcy1lbGVtZW50LXBvbGljeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIG5lc3RlZCBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBvYmplY3QgbWFwcGluZyBmb3IgYW4gWE1MIG5lc3RlZCBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0JICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLWF0dHJpYnV0ZSIgbWluT2NjdXJzPSIwIi8+Ci0JICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLWdldC1tZXRob2QiIG1pbk9jY3Vycz0iMCIvPgotCSAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1zZXQtbWV0aG9kIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIG9iamVjdCBtYXBwaW5nIGZvciBhbiBYTUwgbmVzdGVkIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibnVsbC1wb2xpY3kiIHR5cGU9ImFic3RyYWN0LW51bGwtcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImtlZXAtYXMtZWxlbWVudC1wb2xpY3kiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBvYmplY3QgbWFwcGluZyBmb3IgYW4gWE1MIG5lc3RlZCBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhbiBYTUwgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZGVmYXVsdC1yb290LWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdGhlIGRlc2NyaXB0b3IgbWFwcyB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtcm9vdC1lbGVtZW50LWZpZWxkIiB0eXBlPSJub2RlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBYTUxGaWVsZCByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgcm9vdCBlbGVtZW50IG9mIHRoZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2hvdWxkLXByZXNlcnZlLWRvY3VtZW50IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgaWYgbm9kZXMgc2hvdWxkIGJlIGNhY2hlZCB0byBwcmVzZXJ2ZSB1bm1hcHBlZCBkYXRhPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuYW1lc3BhY2UtcmVzb2x2ZXIiIHR5cGU9Im5hbWVzcGFjZS1yZXNvbHZlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZXNwYWNlIHJlc29sdmVyIGZvciB0aGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNjaGVtYSIgdHlwZT0ic2NoZW1hLXJlZmVyZW5jZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbG9jYXRpb24gb2YgdGhlIFhNTCBTY2hlbWEuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVzdWx0LWFsd2F5cy14bWwtcm9vdCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYW55LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiB0byBhbiB4czphbnkgZGVjbGFyYXRpb24gb3IgeHM6YW55VHlwZSBlbGVtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UteG1sLXJvb3QiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImtlZXAtYXMtZWxlbWVudC1wb2xpY3kiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hbnktYXR0cmlidXRlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gdG8gYW4geHM6YW55IGRlY2xhcmF0aW9uIG9yIHhzOmFueVR5cGUgZWxlbWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmNsdWRlLW5hbWVzcGFjZS1kZWNsYXJhdGlvbiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5jbHVkZS1zY2hlbWEtaW5zdGFuY2UiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldXNlLWNvbnRhaW5lciIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYW55LW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBzaW5nbGUgb2JqZWN0IHRvIGFuIHhzOmFueSBkZWNsYXJhdGlvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UteG1sLXJvb3QiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImtlZXAtYXMtZWxlbWVudC1wb2xpY3kiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtZnJhZ21lbnQtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgc2luZ2xlIE5vZGUgdG8gYSBmcmFnbWVudCBvZiBhbiBYTUwgZG9jdW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieG1sLWRpcmVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWZyYWdtZW50LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiBvZiBOb2RlcyB0byBhIGZyYWdtZW50IG9mIGFuIFhNTCBkb2N1bWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYmluYXJ5LWRhdGEtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgYmluYXJ5IG9iamVjdCB0byBiYXNlNjQgYmluYXJ5PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhtbC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaXMtc3dhLXJlZiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWltZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNob3VsZC1pbmxpbmUtZGF0YSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1iaW5hcnktZGF0YS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGJpbmFyeSBvYmplY3QgdG8gYmFzZTY0IGJpbmFyeTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4bWwtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLXN3YS1yZWYiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1pbWUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaG91bGQtaW5saW5lLWRhdGEiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNob2ljZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gdG8gYSBjaG9pY2Ugc3RydWN0dXJlIGluIGFuIHhtbCBkb2N1bWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1wb2xpY3kiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiIgdHlwZT0ieG1sLWNob2ljZS1maWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNob2ljZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiB0byBhIGNob2ljZSBzdHJ1Y3R1cmUgaW4gYW4geG1sIGRvY3VtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIiB0eXBlPSJ4bWwtY2hvaWNlLWZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNob2ljZS1maWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtZmllbGQiIHR5cGU9Im5vZGUiIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNvbnZlcnNpb24tcGFpciI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJub2RlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBYUGF0aCBleHByZXNzaW9uIHRvIGFuIGVsZW1lbnQgb3IgYXR0cmlidXRlIGluIGFuIFhNTCBkb2N1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcG9zaXRpb24gb2YgdGhlIG5vZGUgaW4gdGhlIHBhcmVudCB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idHlwZWQtdGV4dC1maWVsZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgdGhpcyBpcyBhIHR5cGVkIHRleHQgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaW5nbGUtbm9kZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIGlmIGVhY2ggaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBpcyBpbiB0aGUgc2FtZSBub2RlIGluc3RlYWQgb2YgaGF2aW5nIG9uZSBub2RlIHBlciBpdGVtIGluIHRoZSBjb2xsZWN0aW9uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ic2NoZW1hLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNjaGVtYSB0eXBlIG9mIHRoZSBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InhtbC10by1qYXZhLWNvbnZlcnNpb24tcGFpciIgdHlwZT0ieG1sLWNvbnZlcnNpb24tcGFpciIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iamF2YS10by14bWwtY29udmVyc2lvbi1wYWlyIiB0eXBlPSJ4bWwtY29udmVyc2lvbi1wYWlyIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImxlYWYtZWxlbWVudC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB0aGUgZWxlbWVudHMgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXMtcmVxdWlyZWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuaW9uLW5vZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2UgdG8gcmVwcmVzZW50IG5vZGVzIHdoaWNoIGFyZSBtYXBwZWQgdG8gdW5pb25zPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0eXBlZC10ZXh0LWZpZWxkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0aGlzIGlzIGEgdHlwZWQgdGV4dCBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNpbmdsZS1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgaWYgZWFjaCBpdGVtIGluIHRoZSBjb2xsZWN0aW9uIGlzIGluIHRoZSBzYW1lIG5vZGUgaW5zdGVhZCBvZiBoYXZpbmcgb25lIG5vZGUgcGVyIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb248L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJzY2hlbWEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2NoZW1hIHR5cGUgb2YgdGhlIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ieG1sLXRvLWphdmEtY29udmVyc2lvbi1wYWlyIiB0eXBlPSJ4bWwtY29udmVyc2lvbi1wYWlyIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJqYXZhLXRvLXhtbC1jb252ZXJzaW9uLXBhaXIiIHR5cGU9InhtbC1jb252ZXJzaW9uLXBhaXIiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lc3BhY2UtcmVzb2x2ZXIiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9Im5hbWVzcGFjZXMiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJuYW1lc3BhY2UiIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdC1uYW1lc3BhY2UtdXJpIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lc3BhY2UiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVzcGFjZS11cmkiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjaGVtYS1yZWZlcmVuY2UiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXNvdXJjZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEtY29udGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJub2RlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjaGVtYS1jbGFzcy1wYXRoLXJlZmVyZW5jZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2NoZW1hLXJlZmVyZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2NoZW1hLWZpbGUtcmVmZXJlbmNlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzY2hlbWEtcmVmZXJlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY2hlbWEtdXJsLXJlZmVyZW5jZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2NoZW1hLXJlZmVyZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqYXZhLWNoYXJhY3RlciI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iamF2YS10aW1lc3RhbXAiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRhdGVUaW1lIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iamF2YS11dGlsLWRhdGUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRhdGVUaW1lIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtcC1wb2xpY3kiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwZXNzaW1pc3RpYy1sb2NraW5nIiB0eXBlPSJwZXNzaW1pc3RpYy1sb2NraW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjbXAgYmVhbi1sZXZlbCBwZXNzaW1pc3RpYyBsb2NraW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmVyLXVudGlsLWNvbW1pdCIgdHlwZT0iZGVmZXItdW50aWwtY29tbWl0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIG1vZGlmaWNhdGlvbiBkZWZlcnJhbCBsZXZlbCBmb3Igbm9uLWRlZmVycmVkIHdyaXRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5vbi1kZWZlcnJlZC1jcmVhdGUtdGltZSIgdHlwZT0ibm9uLWRlZmVycmVkLWNyZWF0ZS10aW1lIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHBvaW50IGF0IHdoaWNoIGluc2VydCB3aWxsIGJlIGlzc3VlZCB0byBEYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVzc2ltaXN0aWMtbG9ja2luZyI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IndhaXQiIG5hbWU9ImxvY2tpbmctbW9kZSIgdHlwZT0ibG9ja2luZy1tb2RlIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRlZmVyLXVudGlsLWNvbW1pdCI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFsbC1tb2RpZmljYXRpb25zIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idXBkYXRlLW1vZGlmaWNhdGlvbnMiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibm9uLWRlZmVycmVkLWNyZWF0ZS10aW1lIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWZ0ZXItZWpiY3JlYXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWZ0ZXItZWpicG9zdGNyZWF0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVuZGVmaW5lZCIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvY2tpbmctbW9kZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkhvbGRzIHRoZSBwZXNzaW1pc3RpYyBsb2NraW5nIG1vZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3YWl0IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8td2FpdCIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IiIgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2UgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjUwIiBuYW1lPSJwcmVhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jZSBwcmVhbGxvY2F0aW9uIHNpemUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZWZlcmVuY2VzIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LCBvdmVycmlkaW5nIGl0cyBuYW1lIGFuZCAob3B0aW9uYWxseSkgcHJlYWxsb2NhdGlvbiBzaXplLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VG8gdXNlIHByZWFsbG9jYXRpb24gc2l6ZSBvZiBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwgc2V0IHByZWFsbG9jYXRpb24gc2l6ZSB0byAwPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYXRpdmUtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EYXRhYmFzZSBzZXF1ZW5jZSBtZWNoYW5pc20gdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGFibGUgc2VxdWVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUVVFTkNFIiBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX05BTUUiIG5hbWU9Im5hbWUtZmllbGQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUV9DT1VOVCIgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmFyeS10YWJsZS1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVuYXJ5IHRhYmxlIHNlcXVlbmNlIC0gc2VxdWVuY2UgbmFtZSBpcyBhIHRhYmxlIG5hbWUsIHRhYmxlIGhhcyBhIHNpbmdsZSBmaWVsZCBhbmQgYSBzaW5nbGUgcm93PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFVRU5DRSIgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWxmaWxlLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sZmlsZSBzZXF1ZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlhtbCBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRVUVOQ0UiIG5hbWU9InJvb3QtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX05BTUUiIG5hbWU9Im5hbWUtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX0NPVU5UIiBuYW1lPSJjb3VudGVyLWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmV0Y2gtZ3JvdXBzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgYWxsIHByZS1kZWZpbmVkIGZldGNoIGdyb3Vwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtZmV0Y2gtZ3JvdXAiIHR5cGU9ImZldGNoLWdyb3VwIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZldGNoLWdyb3VwIiB0eXBlPSJmZXRjaC1ncm91cCIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmV0Y2gtZ3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyB0aGUgZmV0Y2ggZ3JvdXAgYXR0cmlidXRlcyBpbmZvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmZXRjaC1ncm91cC1hdHRyaWJ1dGVzIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgYSBmZXRjaCBncm91cCdzIGF0dHJpYnV0ZSBsaXN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZldGNoLWdyb3VwLWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjaGFuZ2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGZvciB0aGlzIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWZlcnJlZC1kZXRlY3Rpb24tY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgYmFja3VwIGNsb25lIHRvIGRldGVjdCBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjaGFuZ2UtcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtbGV2ZWwtY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgIm1hcmsgZGlydHkiIHRvIGRldGVjdCBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjaGFuZ2UtcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtbGV2ZWwtY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgYSBDaGFuZ2VUcmFja2VyIGZpcmluZyBQcm9wZXJ0eUNoYW5nZUV2ZW50J3MgdG8gZGV0ZWN0IGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNoYW5nZS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgTnVsbCBQb2xpY3kgaW4gdXNlIGZvciB0aGlzIHJlbGF0aW9uc2hpcCBjdXJyZW50bHkgYSBjaG9pY2Ugb2YgW051bGxQb2xpY3kgYW5kIElzU2V0TnVsbFBvbGljeV0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ieHNpLW5pbC1yZXByZXNlbnRzLW51bGwiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImVtcHR5LW5vZGUtcmVwcmVzZW50cy1udWxsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im51bGwtcmVwcmVzZW50YXRpb24tZm9yLXhtbCIgdHlwZT0ibWFyc2hhbC1udWxsLXJlcHJlc2VudGF0aW9uIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJudWxsLXBvbGljeSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImlzLXNldC1wZXJmb3JtZWQtZm9yLWFic2VudC1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlzLXNldC1udWxsLXBvbGljeSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLXNldC1tZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaXMtc2V0LXBhcmFtZXRlci10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpcy1zZXQtcGFyYW1ldGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJtYXJzaGFsLW51bGwtcmVwcmVzZW50YXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Xcml0ZSBudWxsLCBubyB0YWcoZGVmYXVsdCkgb3IgYW4gZW1wdHkgdGFnLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWFNJX05JTCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFCU0VOVF9OT0RFIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRU1QVFlfTk9ERSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBnZW5lcmljIGZpZWxkIGNvbmNlcHQsIHN1Y2ggYXMgYSBkYXRhYmFzZSBjb2x1bW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbHVtbiBpbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgY29sdW1uJ3MgdGFibGUuIFRoaXMgdGFibGUgbXVzdCBiZSBsaXN0ZWQgaW4gdGhlIGNsYXNzJyB0YWJsZXMuIElmIG5vdCBzcGVjaWZpZWQgdGhlIGZpcnN0IHRhYmxlIG9mIHRoZSBjbGFzcyB3aWxsIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNxbC10eXBlY29kZSIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4ob3B0aW9uYWwgZmllbGQpIFRoZSBKREJDIHR5cGVjb2RlIG9mIHRoaXMgY29sdW1uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+KG9wdGlvbmFsIGZpZWxkKSBOYW1lIG9mIHRoZSBKREJDIHR5cGVjb2RlIGZvciB0aGlzIGNvbHVtbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6YXR0cmlidXRlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmb3JlaWduLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHNvdXJjZS90YXJnZXQgZmllbGQvY29sdW1uIHJlZmVyZW5jZXMgcmVsYXRpbmcgYSBmb3JlaWduIGtleSBpbiBvbmUgdGFibGUgdG8gdGhlIHByaW1hcnkgb3IgdW5pcXVlIGtleSBpbiBhbm90aGVyIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC1yZWZlcmVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByZWZlcmVuY2Ugb2YgYSBzb3VyY2UgdGFibGUgZm9yZWlnbiBrZXkgYW5kIGEgdGFyZ2V0IHRhYmxlIHByaW1hcnkga2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb3VyY2UtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgZmllbGQvY29sdW1uIG5hbWUgaW4gdGhlIHNvdXJjZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcHJpbWFyeSBvciB1bmlxdWUga2V5IGZpZWxkL2NvbHVtbiBuYW1lIGluIHRoZSB0YXJnZXQgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgc3BlY2lmaWNhdGlvbiBmb3IgcXVlcnlpbmcgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNlbGVjdGlvbiBjcml0ZXJpYSBvZiB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudHMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHF1ZXJ5IGFyZ3VtZW50cy4gVGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudCBtdXN0IG1hdGNoIHRoZSBvcmRlciBvZiB0aGUgYXJndW1lbnQgdmFsdWUgcGFzc2VkIHRvIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9InF1ZXJ5LWFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBxdWVyeS4gIFRoaXMgbmFtZSBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgYW5kIGV4ZWN1dGUgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3JpdGVyaWEiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBmaWx0ZXJpbmcgY2xhdXNlIG9mIGEgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgdHlwZSBuYW1lIG9mIHRoZSBhcmd1bWVudCBtYXkgYmUgcHJvdmlkZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIGNvbnN0YW50IHZhbHVlIGZvciB0aGUgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgdXNlciBkZWZpbmVkIHByb3BlcnR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6YW55VHlwZSIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHRhYmxlcyB0aGF0IHRoZSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8uICBUaGlzIGlzIHR5cGljYWxseSBhIHNpbmdsZSB0YWJsZSBidXQgY2FuIGJlIG11bHRpcGxlLCBvciBlbXB0eSBmb3IgaW5oZXJpdGFuY2Ugb3IgYWdncmVnYXRlZCBjbGFzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSB0YWJsZS4gIFRoZSBuYW1lIGNhbiBiZSBmdWxseSBxdWFsaWZpZWQgd2l0aCB0aGUgc2NoZW1hLCB0YWJsZXNwYWNlIG9yIGxpbmsuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgU3BlY2lmaWVzIGhvdyB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZQotICAgICAgICBvYmplY3QgdmFsdWUuCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gIAk8eHNkOnNlcXVlbmNlPgotICAJCTx4c2Q6ZWxlbWVudCBuYW1lPSJub2RlLW9yZGVyaW5nLXBvbGljeSIKLSAgCQkJdHlwZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIj4KLSAgCQk8L3hzZDplbGVtZW50PgotICAJPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUKLSAgICAJbmFtZT0iZGVzY3JpcHRvci1sZXZlbC1kb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAJPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vLWRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWJpbmRlci1wb2xpY3kiPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwZW5kLW5ldy1lbGVtZW50cy1vcmRlcmluZy1wb2xpY3kiPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imlnbm9yZS1uZXctZWxlbWVudHMtb3JkZXJpbmctcG9saWN5Ij4KLSAgICAJPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGl2ZS1wb3NpdGlvbi1vcmRlcmluZy1wb2xpY3kiPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMi4wLnhzZCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8yLjAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTNiOWVhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8yLjAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDI1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLgotIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0KLSBDb250cmlidXRvcnM6Ci0gICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9yYWNsZSBUb3BMaW5rCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS0tPgotPCEtLSBFY2xpcHNlIFBlcnNpc3RlbmNlIFNlcnZpY2UgUHJvamVjdCA6OiBNYXAgU2NoZW1hIGZpbGUgZm9yIE9STS9PWE0vRUlTIC0tPgotPHhzZDpzY2hlbWEKLSAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiCi0gIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gIHZlcnNpb249IjIuMCIKLSAgPgotICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXBlcnNpc3RlbmNlIiB0eXBlPSJvYmplY3QtcGVyc2lzdGVuY2UiIC8+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXBlcnNpc3RlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QW4gb2JqZWN0LXBlcnNpc3RlbmNlIG1hcHBpbmcgbW9kdWxlLCBhIHNldCBvZiBjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBuYW1lIGZvciB0aGUgbW9kZWwgYmVpbmcgbWFwcGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9ycyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgY2xhc3MgbWFwcGluZyBkZXNjcmlwdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIiB0eXBlPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZm9ybWF0aW9uIG9mIGhvdyBhIGNsYXNzIGlzIHBlcnNpc3RlZCB0byBpdHMgZGF0YS1zdG9yZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibG9naW4iIHR5cGU9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRhc291cmNlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZGVmYXVsdC10ZW1wb3JhbC1tdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgZGVmYXVsdCBmb3IgaG93IERhdGUgYW5kIENhbGVuZGFyIHR5cGVzIGFyZSB1c2VkIHdpdGggY2hhbmdlIHRyYWNraW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkJ5IGRlZmF1bHQgdGhleSBhcmUgYXNzdW1lZCBub3QgdG8gYmUgY2hhbmdlZCBkaXJlY3RseSAob25seSByZXBsYWNlZCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxdWVyaWVzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGxpc3Qgb2YgcXVlcmllcyB0byBiZSBzdG9yZWQgb24gdGhlIHNlc3Npb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InF1ZXJ5IiB0eXBlPSJkYXRhYmFzZS1xdWVyeSI+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgZGVmYXVsdD0iRWNsaXBzZSBQZXJzaXN0ZW5jZSBTZXJ2aWNlcyAtIDIuMCAoQnVpbGQgWVlNTUREKSIgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRhc291cmNlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwbGF0Zm9ybS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBwbGF0Zm9ybSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InVzZXItbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGFzb3VyY2UgdXNlci1uYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRhc291cmNlIHBhc3N3b3JkLCB0aGlzIGlzIHN0b3JlZCBpbiBlbmNyeXB0ZWQgZm9ybS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJleHRlcm5hbC1jb25uZWN0aW9uLXBvb2xpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGlmIHRoZSBjb25uZWN0aW9ucyBhcmUgbWFuYWdlZCBieSB0aGUgZGF0YXNvdXJjZSBkcml2ZXIsIGFuZCBhIG5ldyBjb25uZWN0aW9uIHNob3VsZCBiZSBhY3F1aXJlIHBlciBjYWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImV4dGVybmFsLXRyYW5zYWN0aW9uLWNvbnRyb2xsZXIiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGlmIHRoZSB0cmFuc2FjdGlvbiBhcmUgbWFuYWdlZCBieSBhIHRyYW5zYWN0aW9uIG1hbmFnZXIsIGFuZCBzaG91bGQgbm90IGJlIG1hbmFnZWQgYnkgVG9wTGluay48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBhbHNvIGJlIHVzZWQgaWYgdGhlIGRhdGFzb3VyY2UgZG9lcyBub3Qgc3VwcG9ydCB0cmFuc2FjdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXF1ZW5jaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jaW5nIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiIHR5cGU9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZhdWx0IHNlcXVlbmNlLiBUaGUgbmFtZSBpcyBvcHRpb25hbC4gSWYgbm8gbmFtZSBwcm92aWRlZCBhbiBlbXB0eSBzdHJpbmcgd2lsbCBiZSB1c2VkIGFzIGEgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlcXVlbmNlcyI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Tm9uIGRlZmF1bHQgc2VxdWVuY2VzLiBNYWtlIHN1cmUgZWFjaCBzZXF1ZW5jZSBoYXMgdW5pcXVlIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InNlcXVlbmNlIiB0eXBlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpEQkMgZHJpdmVyIGFuZCBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkcml2ZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKREJDIGRyaXZlciBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbm5lY3Rpb24tdXJsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxsIEpEQkMgZHJpdmVyIGNvbm5lY3Rpb24gVVJMLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iYmluZC1hbGwtcGFyYW1ldGVycyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIHBhcmFtZXRlciBiaW5kaW5nIHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhY2hlLWFsbC1zdGF0ZW1lbnRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgc3RhdGVtZW50IGNhY2hpbmcgc2hvdWxkIGJlIHVzZWQuICBUaGlzIHNob3VsZCBiZSB1c2VkIHdpdGggcGFyYW1ldGVyIGJpbmRpbmcsIHRoaXMgY2Fubm90IGJlIHVzZWQgd2l0aCBleHRlcm5hbCBjb25uZWN0aW9uIHBvb2xpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJieXRlLWFycmF5LWJpbmRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBieXRlIGFycmF5IGRhdGEtdHlwZXMgc2hvdWxkIHVzZSBiaW5kaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InN0cmluZy1iaW5kaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgc3RyaW5nIGRhdGEtdHlwZXMgc2hvdWxkIHVzZSBiaW5kaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMjU2IiBuYW1lPSJzdHJpbmctYmluZGluZy1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgdGhlIHRocmVzaG9sZCBzdHJpbmcgc2l6ZSBmb3IgdXNhZ2Ugb2Ygc3RyaW5nIGJpbmRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ic3RyZWFtcy1mb3ItYmluZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIGxhcmdlIGJ5dGUgYXJyYXkgYW5kIHN0cmluZyBkYXRhLXR5cGVzIHNob3VsZCBiZSBib3VuZCBhcyBzdHJlYW1zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImZvcmNlLWZpZWxkLW5hbWVzLXRvLXVwcGVyLWNhc2UiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0byBmb3JjZSBhbGwgZmllbGQgbmFtZXMgdG8gdXBwZXItY2FzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9Im9wdGltaXplLWRhdGEtY29udmVyc2lvbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGRhdGEgb3B0aW1pemF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0idHJpbS1zdHJpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgc3RyaW5nIHRyYWlsaW5nIGJsYW5rcyBzaG91bGQgYmUgdHJpbW1lZC4gIFRoaXMgaXMgbm9ybWFsbHkgcmVxdWlyZWQgZm9yIENIQVIgZGF0YS10eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC13cml0aW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgYmF0Y2ggd3JpdGluZyBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImpkYmMtYmF0Y2gtd3JpdGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgdXNpbmcgYmF0Y2ggd3JpdGluZywgY29uZmlndXJlIGlmIHRoZSBKREJDIGRyaXZlcnMgYmF0Y2ggd3JpdGluZyBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpDQSBkcml2ZXIgYW5kIEVJUyBjb25uZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb25uZWN0aW9uLXNwZWMtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBUb3BMaW5rIHBsYXRmb3JtIHNwZWNpZmljIGNvbm5lY3Rpb24gc3BlYyBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbm5lY3Rpb24tZmFjdG9yeS11cmwiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpOREkgdXJsIGZvciB0aGUgbWFuYWdlZCBKQ0EgYWRhcHRlcidzIGNvbm5lY3Rpb24gZmFjdG9yeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBuYW1lPSJlcXVhbC1uYW1lc3BhY2UtcmVzb2x2ZXJzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5IgotICAgICAgICAgICAgICAgIHR5cGU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiIG1heE9jY3Vycz0iMSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZm9ybWF0aW9uIG9mIGhvdyBhIGNsYXNzIGlzIHBlcnNpc3RlZCB0byBpdHMgZGF0YS1zdG9yZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgaXMgYW4gYWJzdHJhY3QgZGVmaW5pdGlvbiB0byBhbGxvdyBmbGV4aWJpbGl0eSBpbiB0aGUgdHlwZXMgb2YgY2xhc3NlcyBhbmQgZGF0YXN0b3JlcyBwZXJzaXN0ZWQsIGkuZS4gaW50ZXJmYWNlcywgYWJzdHJhY3QgY2xhc3NlcywgYWdncmVnYXRlcywgbm9uLXJlbGF0aW9uYWwgcGVyc2lzdGVuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBiZWluZyBwZXJzaXN0ZWQuICBUaGUgY2xhc3MgbmFtZSBtdXN0IGJlIGZ1bGwgcXVhbGlmaWVkIHdpdGggaXRzIHBhY2thZ2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhhbXBsZTogPGNsYXNzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiPmV4YW1wbGUuZW1wbG95ZWUuaW1wbGVtZW50YXRpb24uRW1wbG95ZWU8L2NsYXNzPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWxpYXMiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgYW4gYWxpYXMgbmFtZSBjYW4gYmUgZ2l2ZW4gZm9yIHRoZSBjbGFzcy4gIFRoZSBhbGlhcyBpcyBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBjbGFzcyBpbiBwbGFjZSBvZiBpdHMgaW1wbGVtZW50YXRpb24gbmFtZSwgc3VjaCBhcyBpbiBxdWVyeWluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeGFtcGxlOiA8YWxpYXMgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSI+RW1wbG95ZWU8L2FsaWFzPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJpbWFyeS1rZXkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGZpZWxkcy9jb2x1bW5zIHRoYXQgbWFrZSB1cCB0aGUgcHJpbWFyeSBrZXkgb3IgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgaXMgdXNlZCBmb3IgY2FjaGluZywgcmVsYXRpb25zaGlwcywgYW5kIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcHJpbWFyeSBrZXkgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGlmIHRoZSBjbGFzcyBpcyByZWFkLW9ubHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9wZXJ0aWVzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyBmb3IgdXNlciBkZWZpbmVkIHByb3BlcnRpZXMgdG8gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icHJvcGVydHkiIHR5cGU9InByb3BlcnR5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHVzZXIgZGVmaW5lZCBwcm9wZXJ0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5oZXJpdGFuY2UiIHR5cGU9ImluaGVyaXRhbmNlLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzIGlzIHJlbGF0ZWQgaW4gaW5oZXJpdGFuY2UgYW5kIGhvdyB0aGlzIGluaGVyaXRhbmNlIGlzIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImV2ZW50cyIgdHlwZT0iZXZlbnQtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBwZXJzaXN0ZW50IGV2ZW50cyBmb3IgdGhpcyBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InF1ZXJ5aW5nIiB0eXBlPSJxdWVyeS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGRlZmluZWQgcXVlcmllcyBmb3IgdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLW1hcHBpbmdzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBtYXBwaW5ncyB0aGF0IGRlZmluZSBob3cgdGhlIGNsYXNzJyBhdHRyaWJ1dGVzIGFyZSBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImF0dHJpYnV0ZS1tYXBwaW5nIiB0eXBlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBhdHRyaWJ1dGUgaXMgcGVyc2lzdGVkLiBUaGUgYXR0cmlidXRlIG1hcHBpbmcgZGVmaW5pdGlvbiBpcyBleHRlbmRhYmxlIHRvIGFsbG93IGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlc2NyaXB0b3ItdHlwZSIgdHlwZT0iY2xhc3MtZGVzY3JpcHRvci10eXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBkZXNjcmlwdG9yIHR5cGUsIHN1Y2ggYXMgYWdncmVnYXRlIG9yIGluZGVwZW5kZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW50ZXJmYWNlcyIgdHlwZT0iaW50ZXJmYWNlLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgaW50ZXJmYWNlcyB0aGF0IHRoaXMgY2xhc3MgaW1wbGVtZW50cy4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJsb2NraW5nIiB0eXBlPSJsb2NraW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgbG9ja2luZyBiZWhhdmlvciBmb3IgdGhlIGNsYXNzLiAgU3VjaCBhcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIHZlcnNpb24sIHRpbWVzdGFtcCBvciBjaGFuZ2Ugc2V0IG9mIGNvbHVtbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXF1ZW5jaW5nIiB0eXBlPSJzZXF1ZW5jaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBnZW5lcmF0ZWQgdW5pcXVlIGlkIHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYWNoaW5nIiB0eXBlPSJjYWNoaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzJyBpbnN0YW5jZXMgc2hvdWxkIGJlIGNhY2hlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlbW90ZS1jYWNoaW5nIiB0eXBlPSJjYWNoaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzJyBpbnN0YW5jZXMgc2hvdWxkIGJlIGNhY2hlZCBvbiByZW1vdGUgY2xpZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imhpc3RvcnktcG9saWN5IiB0eXBlPSJoaXN0b3J5LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgcGFzdCB2ZXJzaW9ucyBvZiBvYmplY3RzIGFyZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGEtc3RvcmUuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gaGlzdG9yeSBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm5pbmctcG9saWN5IiB0eXBlPSJyZXR1cm5pbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHJldHVuaW5nIHBvbGljeS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyByZXR1cm5pbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYW1lbmRtZW50IiB0eXBlPSJhbWVuZG1lbnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IGZvciB0aGUgZGVzY3JpcHRvciB0byBiZSBhbWVuZGVkIG9yIGN1c3RvbWl6ZWQgdGhyb3VnaCBhIGNsYXNzIEFQSSBhZnRlciBsb2FkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5zdGFudGlhdGlvbiIgdHlwZT0iaW5zdGFudGlhdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgaW5zdGFudGlhdGlvbiBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb3B5aW5nIiB0eXBlPSJjb3B5LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBjbG9uaW5nL2NvcHlpbmcgYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InF1ZXJ5LWtleXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgbGlzdCBvZiBxdWVyeSBrZXlzIG9yIGFsaWFzZXMgZm9yIGRhdGFiYXNlIGluZm9ybWF0aW9uLiAgVGhlc2UgY2FuIGJlIHVzZWQgaW4gcXVlcmllcyBpbnN0ZWFkIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4gbmFtZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InF1ZXJ5LWtleSIgdHlwZT0icXVlcnkta2V5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBxdWVyeWluZyBkYXRhYmFzZSBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY21wLXBvbGljeSIgdHlwZT0iY21wLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UGxhY2UgaG9sZGVyIG9mIENNUCBpbmZvcm1hdGlvbiBzcGVjaWZpYy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZldGNoLWdyb3VwcyIgdHlwZT0iZmV0Y2gtZ3JvdXBzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyBhbGwgcHJlLWRlZmluZWQgZmV0Y2ggZ3JvdXBzIGF0IHRoZSBkZXNjcmlwdG9yIGxldmVsPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImNoYW5nZS1wb2xpY3kiIHR5cGU9ImNoYW5nZS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIHRoZSBDaGFuZ2UgUG9saWN5IGZvciB0aGlzIGRlc2NyaXB0b3I8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBmaXhlZD0iMTAiIG5hbWU9InNjaGVtYS1tYWpvci12ZXJzaW9uIiB0eXBlPSJ4c2Q6aW50ZWdlciIgLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBmaXhlZD0iMCIgbmFtZT0ic2NoZW1hLW1pbm9yLXZlcnNpb24iIHR5cGU9InhzZDppbnRlZ2VyIiAvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNsYXNzLWRlc2NyaXB0b3ItdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNsYXNzIGRlc2NyaXB0b3IgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImluZGVwZW5kZW50IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWdncmVnYXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWdncmVnYXRlLWNvbGxlY3Rpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3NpdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3NpdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbnRlcmZhY2UiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZXJmYWNlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIGludGVyZmFjZXMgdGhhdCBhIGNsYXNzIGRlc2NyaXB0b3IgaW1wbGVtZW50cywgb3IgdGhlIGltcGxlbWVudGlvbiBjbGFzcyBmb3IgYW4gaW50ZXJmYWNlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IGEgc2V0IG9mIHB1YmxpYyBpbnRlcmZhY2VzIGZvciB0aGUgY2xhc3MgY2FuIGJlIHNwZWNpZmllZC4gIFRoaXMgYWxsb3dzIHRoZSBpbnRlcmZhY2UgdG8gYmUgdXNlZCB0byByZWZlciB0byB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0d28gY2xhc3NlcyBpbXBsZW1lbnQgdGhlIHNhbWUgaW50ZXJmYWNlLCBhbiBpbnRlcmZhY2UgZGVzY3JpcHRvciBzaG91bGQgYmUgZGVmaW5lZCBmb3IgdGhlIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGFsc28gYmUgdXNlZCB0byBkZWZpbmUgaW5oZXJpdGFuY2UgYmV0d2VlbiBpbnRlcmZhY2UgZGVzY3JpcHRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaW50ZXJmYWNlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGludGVyZmFjZSBjbGFzcyBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4YW1wbGU6IDxjbGFzcyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIj5leGFtcGxlLmVtcGxveWVlLmFwaS5FbXBsb3llZTwvY2xhc3M+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaW1wbGVtZW50b3ItZGVzY3JpcHRvciIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igd2hpY2ggdGhpcyBpbnRlcmZhY2UgaXMgdGhlIHB1YmxpYyBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiB0aGUgaW50ZXJmYWNlIGhhcyBvbmx5IGEgc2luZ2xlIGltcGxlbWVudG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4YW1wbGU6IDxjbGFzcyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIj5leGFtcGxlLmVtcGxveWVlLmltcGwuRW1wbG95ZWU8L2NsYXNzPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgY2xvbmluZy9jb3B5aW5nIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3JlYXRlcyBhIGNvcHlpbmcgdGhyb3VnaCBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSB0byBjb3B5IGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvcHktcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgY2xvbmluZy9jb3B5aW5nIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQgdGhyb3VnaCBhIGNsb25lIG1ldGhvZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29weS1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgY2xvbmUgbWV0aG9kIG9uIHRoZSBvYmplY3QsIGkuZS4gJ2Nsb25lJzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnN0YW50aWF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgaW5zdGFudGlhdGlvbiBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgbWV0aG9kIG9uIHRoZSBmYWN0b3J5IHRvIGluc3RhbnRpYXRlIHRoZSBvYmplY3QgaW5zdGFuY2UuJzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmFjdG9yeS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBmYWN0b3J5IGNsYXNzIG5hbWUuJzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmFjdG9yeS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gaW5zdGFudGlhdGUgdGhlIGZhY3RvcnkgY2xhc3MuJzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhbWVuZG1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSBjbGFzcyBhbmQgc3RhdGljIG1ldGhvZCB0byBiZSBjYWxsZWQgdG8gYWxsb3cgZm9yIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGFtZW5kZWQgb3IgY3VzdG9taXplZCB0aHJvdWdoIGEgY2xhc3MgQVBJIGFmdGVyIGxvYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYW1lbmRtZW50LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4gVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhbWVuZG1lbnQgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYW1lbmRtZW50LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhbWVuZG1lbnQgbWV0aG9kIG9uIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25hbC1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGUocykuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idGFibGVzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHRoZSB0YWJsZXMgdGhlIGNsYXNzIGlzIHBlcnNpc3RlZCB0by4gIFR5cGljYWxseSBhIGNsYXNzIGlzIHBlcnNpc3RlZCB0byBhIHNpbmdsZSB0YWJsZSwgYnV0IG11bHRpcGxlIHRhYmxlcyBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ0YWJsZSIgdHlwZT0idGFibGUiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgdGFibGVzIHRoYXQgdGhlIGNsYXNzIGlzIHBlcnNpc3RlZCB0by4gIFRoaXMgaXMgdHlwaWNhbGx5IGEgc2luZ2xlIHRhYmxlIGJ1dCBjYW4gYmUgbXVsdGlwbGUsIG9yIGVtcHR5IGZvciBpbmhlcml0YW5jZSBvciBhZ2dyZWdhdGVkIGNsYXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5cy1mb3ItbXVsdGlwbGUtdGFibGUiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBmb3JlaWduIGtleSBmaWVsZCByZWZlcmVuY2VzIHRvIGJlIGRlZmluZSBmb3IgbXVsdGlwbGUgdGFibGUgZGVzY3JpcHRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtdWx0aXBsZS10YWJsZS1qb2luLWNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgY29tcGxleCBtdWx0aXBsZSB0YWJsZSBqb2luIGNvbmRpdGlvbnMgYW4gZXhwcmVzc2lvbiBtYXkgYmUgcHJvdmlkZWQgaW5zdGVhZCBvZiB0aGUgdGFibGUgZm9yZWlnbiBrZXkgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbi1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiBhIG51bWVyaWMgdmVyc2lvbiBmaWVsZC9jb2x1bW4gdGhhdCB0cmFja3MgY2hhbmdlcyBhbmQgdGhlIHZlcnNpb24gdG8gYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2NraW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZlcnNpb24tZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIGFuZCBvcHRpb25hbGx5IHRoZSB0YWJsZSBvZiB0aGUgY29sdW1uIHRoYXQgdGhlIGF0dHJpYnV0ZSBpcyBzdG9yZWQgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InN0b3JlLXZlcnNpb24taW4tY2FjaGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHZlcnNpb24gdmFsdWUgc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgY2FjaGUsIG9yIGlmIGl0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWVzdGFtcC1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiB0aW1lc3RhbXAgdmVyc2lvbiBjb2x1bW4gdGhhdCB0cmFja3MgY2hhbmdlcyBhbmQgdGhlIHZlcnNpb24gdG8gYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2ZXJzaW9uLWxvY2tpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ic2VydmVyLXRpbWUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHRpbWVzdGFtcCBzaG91bGQgYmUgb2J0YWluZWQgbG9jYWxseSBvciBmcm9tIHRoZSBkYXRhYmFzZSBzZXJ2ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFsbC1maWVsZHMtbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gY29tcGFyaW5nIHRoZSBvcmlnaW5hbCByZWFkIHZhbHVlcyBvZiBhbGwgZmllbGRzIG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdmFsdWVzIGluIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9ja2luZy1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNoYW5nZWQtZmllbGRzLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIGNvbXBhcmluZyB0aGUgb3JpZ2luYWwgcmVhZCB2YWx1ZXMgb2Ygb25seSB0aGUgY2hhbmdlZCBmaWVsZHMgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2NraW5nLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VsZWN0ZWQtZmllbGRzLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIGNvbXBhcmluZyB0aGUgb3JpZ2luYWwgcmVhZCB2YWx1ZXMgb2YgYSBzcGVjaWZpZWQgc2V0IG9mIGZpZWxkcyBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvY2tpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHNldCBvZiBmaWVsZHMgdG8gY29tcGFyZSBvbiB1cGRhdGUgYW5kIGRlbGV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBkYXRhYmFzZSBnZW5lcmF0ZWQgdW5pcXVlIGlkIHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgZ2VuZXJhdG9yLiAgVGhpcyBjb3VsZCBiZSB0aGUgbmFtZSBvZiBhIHNlcXVlbmNlIG9iamVjdCwgb3IgYSByb3cgdmFsdWUgaW4gYSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIGZpZWxkL2NvbHVtbiB0aGF0IHRoZSBnZW5lcmF0ZWQgc2VxdWVuY2UgaWQgaXMgYXNzaWduZWQgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBjYWNoaW5nIHR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZ1bGwiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjYWNoZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IndlYWstcmVmZXJlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic29mdC1yZWZlcmVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzb2Z0LWNhY2hlLXdlYWstcmVmZXJlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaGFyZC1jYWNoZS13ZWFrLXJlZmVyZW5jZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoaW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcycgaW5zdGFuY2VzIHNob3VsZCBiZSBjYWNoZWQgYW5kIGhvdyBvYmplY3QgaWRlbnRpdHkgc2hvdWxkIGJlIG1haW50YWluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJzb2Z0LWNhY2hlLXdlYWstcmVmZXJlbmNlIiBuYW1lPSJjYWNoZS10eXBlIiB0eXBlPSJjYWNoZS10eXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSB0eXBlIG9mIGNhY2hpbmcsIHN1Y2ggYXMgTFJVLCB3ZWFrIHJlZmVyZW5jZSBvciBub25lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMTAwIiBuYW1lPSJjYWNoZS1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgaW5pdGlhbCBvciBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImFsd2F5cy1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgcmVmcmVzaCBjYWNoZWQgb2JqZWN0cyBvbiBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Im9ubHktcmVmcmVzaC1jYWNoZS1pZi1uZXdlci12ZXJzaW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byByZWZyZXNoIGlmIHRoZSBjYWNoZWQgb2JqZWN0IGlzIGFuIG9sZGVyIHZlcnNpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZGlzYWJsZS1jYWNoZS1oaXRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGlzYWJsZSBvYnRhaW5pbmcgY2FjaGUgaGl0cyBvbiBwcmltYXJ5IGtleSBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImFsd2F5cy1jb25mb3JtIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgY29uZm9ybSBxdWVyaWVzIHdpdGhpbiBhIHRyYW5zYWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Imlzb2xhdGVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiBvYmplY3RzIG9mIHRoaXMgdHlwZSBzaG91bGQgYmUgaXNvbGF0ZWQgZnJvbSB0aGUgc2hhcmVkIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iaXNvbGF0ZS1uZXctZGF0YS1hZnRlci10cmFuc2FjdGlvbiIgbmFtZT0idW5pdG9md29yay1pc29sYXRpb24tbGV2ZWwiIHR5cGU9InVuaXRvZndvcmstaXNvbGF0aW9uLWxldmVsIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyB0aGUgdW5pdCBvZiB3b3JrIHNob3VsZCBiZSBpc29sYXRlZCB0byB0aGUgc2Vzc2lvbiBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNhY2hlLWludmFsaWRhdGlvbi1wb2xpY3kiIHR5cGU9ImNhY2hlLWludmFsaWRhdGlvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iY2hhbmdlLXNldCIgbmFtZT0iY2FjaGUtc3luYy10eXBlIiB0eXBlPSJjYWNoZS1zeW5jLXR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSB0eXBlIG9mIGNhY2hlIHN5bmNocm9uaXphdGlvbiB0byBiZSB1c2VkIHdpdGggdGhpcyBkZXNjcmlwb3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hlLWludmFsaWRhdGlvbiIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BYnN0cmFjdCBzdXBlcmNsYXNzIGZvciBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWNpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXBkYXRlLXJlYWQtdGltZS1vbi11cGRhdGUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuby1leHBpcnktY2FjaGUtaW52YWxpZGF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kgd2hlcmUgb2JqZWN0cyBpbiB0aGUgY2FjaGUgZG8gbm90IGV4cGlyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2FjaGUtaW52YWxpZGF0aW9uIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lLXRvLWxpdmUtY2FjaGUtaW52YWxpZGF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kgd2hlcmUgb2JqZWN0cyBsaXZlIGEgc3BlY2lmaWMgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBhZnRlciB0aGV5IGFyZSByZWFkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjYWNoZS1pbnZhbGlkYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0aW1lLXRvLWxpdmUiIHR5cGU9InhzZDpsb25nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGFpbHktY2FjaGUtaW52YWxpZGF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNhY2hlIGludmFsaWRhdGlvbiBQb2xpY3kgd2hlcmUgb2JqZWN0cyBleHBpcmUgYXQgYSBzcGVjaWZpYyB0aW1lIGV2ZXJ5IGRheTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjYWNoZS1pbnZhbGlkYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnktdGltZSIgdHlwZT0ieHNkOmRhdGVUaW1lIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaGlzdG9yeS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBwYXN0IHZlcnNpb25zIG9mIG9iamVjdHMgYXJlIHRvIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YS1zdG9yZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImhhbmRsZS13cml0ZXMiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS1kYXRhYmFzZS10aW1lIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imhpc3RvcnktdGFibGVzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBuYW1lcyBvZiB0aGUgbWlycm9yaW5nIGhpc3RvcmljYWwgdGFibGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaGlzdG9yeS10YWJsZSIgdHlwZT0iaGlzdG9yeS10YWJsZSIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic3RhcnQtZmllbGRzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzdGFydCBmaWVsZHMgZm9yIGVhY2ggaGlzdG9yaWNhbCB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InN0YXJ0LWZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZW5kLWZpZWxkcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgZW5kIGZpZWxkcyBmb3IgZWFjaCBoaXN0b3JpY2FsIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZW5kLWZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJoaXN0b3J5LXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RWFjaCBlbnRyeSBpcyBhIHNvdXJjZSAoZGVzY3JpcHRvcikgdG8gaGlzdG9yeSB0YWJsZSBuYW1lIGFzc29jaWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iIiBuYW1lPSJzb3VyY2UiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBuYW1lPSJoaXN0b3J5IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXR1cm5pbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyByZXR1bmluZyBwb2xpY3kuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gcmV0dXJuaW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG5hbWU9InJldHVybmluZy1maWVsZC1pbmZvcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TGlzdHMgdGhlIGZpZWxkcyB0byBiZSByZXR1cm5lZCB0b2dldGhlciB3aXRoIHRoZSBmbGFncyBkZWZpbmluZyByZXR1cm5pbmcgb3B0aW9uczwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icmV0dXJuaW5nLWZpZWxkLWluZm8iIHR5cGU9InJldHVybmluZy1maWVsZC1pbmZvIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJldHVybmluZy1maWVsZC1pbmZvIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RmllbGQgdG8gYmUgcmV0dXJuZWQgdG9nZXRoZXIgd2l0aCB0eXBlIGFuZCB0aGUgZmxhZ3MgZGVmaW5pbmcgcmV0dXJuaW5nIG9wdGlvbnMuIEF0IGxlYXN0IG9uZSBvZiBpbnNlcnQsIHVwZGF0ZSBzaG91bGQgYmUgdHJ1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0YXJnZXQgcmVmZXJlbmNlZCBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCB0byBiZSByZXR1cm5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJpbnNlcnQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGQgc2hvdWxkIGJlIHJldHVuZWQgYWZ0ZXIgSW5zZXJ0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Imluc2VydC1tb2RlLXJldHVybi1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgaW5zZXJ0PT10cnVlLCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGQgc2hvdWxkIG5vdCBiZSBpbnNlcnRlZCAodHJ1ZSkuIElmIGluc2VydD09ZmFsc2UgLSBpZ25vcmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVwZGF0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCBzaG91bGQgYmUgcmV0dW5lZCBhZnRlciBJbnNlcnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcyBpcyByZWxhdGVkIGluIGluaGVyaXRhbmNlIGFuZCBob3cgdGhpcyBpbmhlcml0YW5jZSBpcyBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwYXJlbnQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBwYXJlbnQvc3VwZXJjbGFzcyBvZiB0aGUgY2xhc3MgYmVpbmcgcGVyc2lzdGVkLiAgVGhlIGNsYXNzIG5hbWUgbXVzdCBiZSBmdWxsIHF1YWxpZmllZCAgIHdpdGggaXRzIHBhY2thZ2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJyZWFkLXN1YmNsYXNzZXMtb24tcXVlcmllcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSBpZiBzdWJjbGFzc2VzIG9mIHRoZSBjbGFzcyBzaG91bGQgYmUgcmV0dXJuZWQgb24gcXVlcmllcywgb3Igb25seSB0aGUgZXhhY3QgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhbGwtc3ViY2xhc3Nlcy12aWV3IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgdGhlIG5hbWUgb2YgYSB2aWV3IHRoYXQgam9pbnMgYWxsIG9mIHRoZSBzdWJjbGFzcycgdGFibGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS1jbGFzcy1uYW1lLWFzLWluZGljYXRvciIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIGNsYXNzIHR5cGUgaW5kaWNhdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtZXh0cmFjdGlvbi1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIGEgbWV0aG9kIG9uIHRoZSBjbGFzcyB0aGF0IHRha2VzIHRoZSBjbGFzcycgcm93IGFzIGFyZ3VtZW50IGEgY29tcHV0ZWQgdGhhdCBjbGFzcyB0eXBlIHRvIGJlIHVzZWQgdG8gaW5zdGFudGlhdGUgZnJvbSB0aGUgcm93LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHR5cGUgZmllbGQvY29sdW1uIHRoYXQgdGhlIGNsYXNzIHR5cGUgaXMgc3RvcmVkIGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiIHR5cGU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBjbGFzcyBpbmRpY2F0b3IgdmFsdWVzIGFuZCB0aGUgc3ViY2xhc3NlcyB0aGV5IG1hcCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWV4dHJhY3RvciIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSBjbGFzcyBleHRyYWN0b3IgaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib25seS1pbnN0YW5jZXMtY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgY3JpdGVyaWEgdGhhdCBmaWx0ZXJzIG91dCBhbGwgc2libGluZyBhbmQgc3ViY2xhc3MgaW5zdGFuY2VzIG9uIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhbGwtc3ViY2xhc3Nlcy1jcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBjcml0ZXJpYSB0aGF0IGZpbHRlcnMgb3V0IHNpYmxpbmcgaW5zdGFuY2VzIG9uIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ib3V0ZXItam9pbi1zdWJjbGFzc2VzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGluaGVyaXRhbmNlIHF1ZXJpZXMgc3BlY2lmeSBpZiBhbGwgc3ViY2xhc3NlcyBzaG91bGQgYmUgb3V0ZXIgam9pbmVkLCBpbnN0ZWFkIG9mIGEgcXVlcnkgcGVyIHN1YmNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxbmFtZS1pbmhlcml0YW5jZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeHRlbmRzIGluaGVyaXRhbmNlIHBvbGljeS4gQWxsb3dzIGZvciBwcmVmaXhlZCBuYW1lcyB0byBiZSByZXNvbHZlZCBhdCBydW50aW1lIHRvIGZpbmQgdGhlIGFwcHJvcmlhdGUgY2xhc3M8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5oZXJpdGFuY2UtcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGNsYXNzIGluZGljYXRvciB2YWx1ZXMgYW5kIHRoZSBzdWJjbGFzc2VzIHRoZXkgbWFwIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIHRoZSB0eXBlIG1hcHMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MtaW5kaWNhdG9yIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIHZhbHVlIHVzZWQgdG8gZGVmaW5lIHRoZSBjbGFzcyB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImV2ZW50LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHBlcnNpc3RlbnQgZXZlbnRzIGZvciB0aGlzIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZXZlbnQtbGlzdGVuZXJzIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV2ZW50LWxpc3RlbmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYW4gZXZlbnQgbGlzdGVuZXIgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBkZXNjcmlwdG9yIGV2ZW50IGxpc3RlbmVyIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1idWlsZC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBidWlsZGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJlLXdyaXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSB3cml0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LXdyaXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIHdyaXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByZS1pbnNlcnQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIGluc2VydGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1pbnNlcnQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgaW5zZXJ0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmUtdXBkYXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSB1cGRhdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC11cGRhdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgdXBkYXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByZS1kZWxldGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIGRlbGV0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LWRlbGV0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBkZWxldGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWJvdXQtdG8taW5zZXJ0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSBpbnNlcnRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFib3V0LXRvLXVwZGF0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgdXBkYXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtY2xvbmUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgY2xvbmluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1tZXJnZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBtZXJnaW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LXJlZnJlc2gtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgcmVmcmVzaGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBkZWZpbmVkIHF1ZXJpZXMgYW5kIHF1ZXJ5IHByb3BlcnRpZXMgZm9yIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InF1ZXJpZXMiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icXVlcnkiIHR5cGU9InF1ZXJ5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IGRlZmluaXRpb24gZm9yIHRoZSBjbGFzcycgaW5zdGFuY2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgdGltZW91dCB0byBhcHBseSB0byBhbGwgcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImNoZWNrLWNhY2hlIiBuYW1lPSJleGlzdGVuY2UiIHR5cGU9ImV4aXN0ZW5jZS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBiZWhhdm9pciB1c2VkIHRvIGRldGVybWluZSBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0IHRvIGJlIGN1c3RvbWl6ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnNlcnQtcXVlcnkiIHR5cGU9Imluc2VydC1vYmplY3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSBpbnNlcnQgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgaW5zZXJ0IGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InVwZGF0ZS1xdWVyeSIgdHlwZT0idXBkYXRlLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIHVwZGF0ZSBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCB1cGRhdGUgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLXF1ZXJ5IiB0eXBlPSJkZWxldGUtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gZGVsZXRlIHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IGRlbGV0ZSBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkb2VzLWV4aXN0LXF1ZXJ5IiB0eXBlPSJkb2VzLWV4aXN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gZG9lcyBleGlzdCBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCBkZWxldGUgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVhZC1vYmplY3QtcXVlcnkiIHR5cGU9InJlYWQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gcmVhZCBvYmplY3QgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgcmVhZCBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWFkLWFsbC1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSByZWFkIGFsbCBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCByZWFkIGFsbCBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBleGlzdGVuY2UgcG9saWNpZXMgZm9yIGRldGVybWluaW5nIGlmIGFuIGluc2VydCBvciB1cGRhdGUgc2hvdWxkIG9jY3VyIGZvciBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGVjay1jYWNoZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrLWRhdGFiYXNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXNzdW1lLWV4aXN0ZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzc3VtZS1ub24tZXhpc3RlbmNlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIHF1ZXJ5aW5nIGRhdGFiYXNlIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeS1rZXkgYWxpYXMgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtc3luYy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHR5cGUgb2YgY2FjaGUgc3luY2hyb25pemF0aW9uIHRvIHVzZSB3aXRoIGEgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImludmFsaWRhdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vLWNoYW5nZXMiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGFuZ2Utc2V0LXdpdGgtbmV3LW9iamVjdHMiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGFuZ2Utc2V0IiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idW5pdG9md29yay1pc29sYXRpb24tbGV2ZWwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyB0aGUgdW5pdCBvZiB3b3JrIGlzb2xhdGVkIGZyb20gdGhlIHNlc3Npb24gY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1c2Utc2Vzc2lvbi1jYWNoZS1hZnRlci10cmFuc2FjdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imlzb2xhdGUtbmV3LWRhdGEtYWZ0ZXItdHJhbnNhY3Rpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpc29sYXRlLWNhY2hlLWFmdGVyLXRyYW5zYWN0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXNvbGF0ZS1jYWNoZS1hbHdheXMiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LXF1ZXJ5LWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIGEgZGF0YWJhc2UgY29sdW1uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJxdWVyeS1rZXkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkL2NvbHVtbiBiZWluZyBhbGlhc2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbnNoaXAtcXVlcnkta2V5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIGEgam9pbiB0byBhbm90aGVyIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icXVlcnkta2V5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdGFyZ2V0IHJlZmVyZW5jZWQgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBqb2luIGNvbmRpdGlvbiBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBjbGFzcycgdGFibGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGpvaW4gY3JpdGVyaWEgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgY2xhc3MnIHRhYmxlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lLXF1ZXJ5LWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIGEgMS0xIGpvaW4gdG8gYW5vdGhlciBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1xdWVyeS1rZXkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1tYW55LXF1ZXJ5LWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIGEgMS1tIGpvaW4gZnJvbSBhbm90aGVyIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1xdWVyeS1rZXkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LWRpcmVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgZnJvbSBhbiBhdHRpcmJ1dGUgdG8gYSBzaW1wbGUgZmllbGQgZGF0YXR5cGUsIGkuZS4gU3RyaW5nLCBOdW1iZXIsIERhdGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBhbmQgb3B0aW9uYWxseSB0aGUgdGFibGUgb2YgdGhlIGZpZWxkL2NvbHVtbiB0aGF0IHRoZSBhdHRyaWJ1dGUgaXMgc3RvcmVkIGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibnVsbC12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgYSB2YWx1ZSB0aGF0IG51bGwgZGF0YSB2YWx1ZXMgc2hvdWxkIGJlIGNvbnZlcnRlZCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9InZhbHVlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBob3cgdGhlIGRhdGEgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUgb2JqZWN0IHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1jbGFzc2lmaWNhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgYXR0cmlidXRlIGlzIHBlcnNpc3RlZC4gVGhlIGF0dHJpYnV0ZSBtYXBwaW5nIGRlZmluaXRpb24gaXMgZXh0ZW5kYWJsZSB0byBhbGxvdyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuICBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBhdHRyaWJ1dGUgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVhZC1vbmx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZ2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGdldCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgc2V0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb3BlcnRpZXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IGZvciB1c2VyIGRlZmluZWQgcHJvcGVydGllcyB0byBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0icHJvcGVydHkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgdXNlciBkZWZpbmVkIHByb3BlcnR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBzaW1wbGUgYXR0cmlidXRlIGlzIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWRpcmVjdC1tYXBwaW5nIj4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWRpcmVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgZnJvbSBhbiBhdHRpcmJ1dGUgdG8gYSBzaW1wbGUgZmllbGQgZGF0YXR5cGUsIGkuZS4gU3RyaW5nLCBOdW1iZXIsIERhdGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaXMtY2RhdGEiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im51bGwtcG9saWN5IiB0eXBlPSJhYnN0cmFjdC1udWxsLXBvbGljeSIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1kaXJlY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIGZyb20gYW4gYXR0aXJidXRlIHRvIGEgc2ltcGxlIGZpZWxkIGRhdGF0eXBlLCBpLmUuIFN0cmluZywgTnVtYmVyLCBEYXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1kaXJlY3QtbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGZpZWxkIHRyYW5zZm9ybWF0aW9uIGZvciBhIHRyYW5zZm9ybWF0aW9uIG1hcHBpbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1iYXNlZC1maWVsZC10cmFuc2Zvcm1hdGlvbiI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2Zvcm1lci1iYXNlZC1maWVsZC10cmFuc2Zvcm1hdGlvbiI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgdHJhbnNmb3JtYXRpb24gbWFwcGluZyB0aGF0IHVzZXMgSmF2YSBjb2RlIHRvIHRyYW5zZm9ybSBiZXR3ZWVuIHRoZSBkYXRhIGFuZCBvYmplY3QgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiBhIHNpbmdsZSBhdHRyaWJ1dGUgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMsIG9yIGZpZWxkIG9ubHkgbWFwcGluZ3Mgb3IgYXR0cmlidXRlIG9ubHkgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHJhbnNmb3JtYXRpb24gZGVmaW5lZCBpbiB0aGUgZG9tYWluIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLXRyYW5zZm9ybWVyIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBjbGFzcyBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHJhbnNmb3JtZXIuIFVzZWQgaW4gcGxhY2Ugb2YgYXR0cmlidXRlLXRyYW5zZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZC10cmFuc2Zvcm1hdGlvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIHRyYW5zZm9ybWF0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIiB0eXBlPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtYXRpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgYSBzaW5nbGUgYXR0cmlidXRlIG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzLCBvciBmaWVsZCBvbmx5IG1hcHBpbmdzIG9yIGF0dHJpYnV0ZSBvbmx5IG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtdHJhbnNmb3JtYXRpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgYSBzaW5nbGUgYXR0cmlidXRlIG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzLCBvciBmaWVsZCBvbmx5IG1hcHBpbmdzIG9yIGF0dHJpYnV0ZSBvbmx5IG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtdHJhbnNmb3JtYXRpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgYSBzaW5nbGUgYXR0cmlidXRlIG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzLCBvciBmaWVsZCBvbmx5IG1hcHBpbmdzIG9yIGF0dHJpYnV0ZSBvbmx5IG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhZ2dyZWdhdGUtb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcmVsYXRpb25zaGlwIHdoZXJlIHRoZSB0YXJnZXQgb2JqZWN0IGlzIHN0cmljdGx5IHByaXZhdGVseSBvd25lZCBieSB0aGUgc291cmNlIG9iamVjdCBhbmQgc3RvcmVzIHdpdGhpbiB0aGUgc291cmNlIG9iamVjdHMgcm93PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgdGFyZ2V0IGNsYXNzIG9mIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJhbGxvdy1udWxsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIGEgcm93IG9mIGFsbCBudWxscyBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgbnVsbC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkLXRyYW5zbGF0aW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyBmb3IgdGhlIG1hcHBpbmcgdG8gdXNlIGRpZmZlcmVudCBmaWVsZCBuYW1lcyB0aGFuIHRoZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtdHJhbnNsYXRpb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic291cmNlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgaW4gdGhlIHNvdXJjZSBkZXNjcmlwdG9yJ3MgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgaW4gdGhlIGFnZ3JlZ2F0ZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBjbGFzc2VzIGlzIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSB0YXJnZXQgY2xhc3Mgb2YgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSB0YXJnZXQgb2JqZWN0cyBhcmUgcHJpdmF0ZWx5IG93bmVkIGRlcGVuZGVudCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgY3JlYXRlIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FzY2FkZWQgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhc2NhZGUtbWVyZ2UiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGNyZWF0ZSBvcGVyYXRpb24gc2hvdWxkIGJlIGNhc2NhZGVkIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYXNjYWRlLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHJlZnJlc2ggb3BlcmF0aW9uIHNob3VsZCBiZSBjYXNjYWRlZCB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FzY2FkZS1yZW1vdmUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHJlbW92ZSBvcGVyYXRpb24gc2hvdWxkIGJlIGNhc2NhZGVkIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW9uZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtMSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1vbmUtdG8tb25lLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS0xIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib25lLXRvLW9uZS1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtbSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGluIHRoZSB0YXJnZXQgY2xhc3MnIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkZWxldGUtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcmVsYXRlZCBvYmplY3RzIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtb25lLXRvLW1hbnktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLW0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNvdXJjZS1mb3JlaWduLWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idGFyZ2V0LWZvcmVpZ24ta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleS1ncm91cGluZy1lbGVtZW50IiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkZWxldGUtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcmVsYXRlZCBvYmplY3RzIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBzaW1wbGUgdHlwZXMgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byBhIHNldCBvZiBzaW1wbGUgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0iZGF0YS1yZWFkLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtdGFibGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgc291cmNlIHByaW1hcnkga2V5IGFuZCB0aGUgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlyZWN0LWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQvY29sdW1uIGluIHRoZSByZWZlcmVuY2UgdGFibGUgdGhhdCBzdG9yZXMgdGhlIGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGluIHRoZSByZWZlcmVuY2UgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXIiIHR5cGU9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgaG93IHRoZSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9iamVjdCB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imluc2VydC1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBpbnNlcnQgYSByb3cgaW50byB0aGUgcmVmZXJlbmNlIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGEgcm93IGZyb20gdGhlIHJlZmVyZW5jZSB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByb3dzIGZyb20gdGhlIHJlZmVyZW5jZSB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2Vzc2lvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIHNlc3Npb24gdGhhdCBkZWZpbmVzIHRoZSByZWZlcmVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJoaXN0b3J5LXBvbGljeSIgdHlwZT0iaGlzdG9yeS1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgcGFzdCB2ZXJzaW9ucyBvZiB0aGlzIGF0dHJpYnV0ZSBhcmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhLXN0b3JlLiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGhpc3RvcnkgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LW1hcC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcCByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIGEgc2V0IG9mIGtleSB2YWx1ZXMgcGFpcnMgb2Ygc2ltcGxlIGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlyZWN0LWtleS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkL2NvbHVtbiBpbiB0aGUgcmVmZXJlbmNlIHRhYmxlIHRoYXQgc29yZXMgdGhlIG1hcCBrZXkgZGF0YSB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImtleS1jb252ZXJ0ZXIiIHR5cGU9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgaG93IHRoZSBrZXkgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZSBvYmplY3QgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFnZ3JlZ2F0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS1tIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZXMgd2hlcmUgdGhlIHRhcmdldCBpbnN0YW5jZXMgYXJlIHN0cmljdGx5IHByaXZhdGVseSBvd25lZCBieSB0aGUgc291cmNlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBpbiB0aGUgdGFyZ2V0IGNsYXNzJyB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGVsZXRlLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJlbGF0ZWQgb2JqZWN0cyBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1tYW55LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbS1tIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVsYXRpb24tdGFibGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBzb3VyY2UvdGFyZ2V0IHByaW1hcnkga2V5cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb3VyY2UtcmVsYXRpb24tZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBmcm9tIHRoZSByZWxhdGlvbmFsIHRhYmxlIHRvIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1yZWxhdGlvbi1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGZyb20gdGhlIHJlbGF0aW9uYWwgdGFibGUgdG8gdGhlIHRhcmdldCBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imluc2VydC1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBpbnNlcnQgYSByb3cgaW50byB0aGUgcmVsYXRpb24gdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYSByb3cgZnJvbSB0aGUgcmVsYXRpb24gdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcm93cyBmcm9tIHRoZSByZWxhdGlvbiB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaGlzdG9yeS1wb2xpY3kiIHR5cGU9Imhpc3RvcnktcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHBhc3QgdmVyc2lvbnMgb2YgdGhpcyBhdHRyaWJ1dGUgYXJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YS1zdG9yZS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBoaXN0b3J5IHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLTEgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlIHRoYXQgbWF5IGJlIG9mIHNldmVyYWwgdHlwZXMgcmVsYXRlZCB0aHJvdWdoIGFuIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InR5cGUtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIGNvbHVtbiB0byBzdG9yZSB0aGUgY2xhc3MgdHlwZSBvZiB0aGUgcmVsYXRlZCBvYmplY3QgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9yZWlnbi1rZXktdG8tcXVlcnkta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHNvdXJjZS90YXJnZXQgY29sdW1uL3F1ZXJ5IGtleSByZWZlcmVuY2VzIHJlbGF0aW5nIGEgZm9yZWlnbiBrZXkgaW4gb25lIHRhYmxlIHRvIHRoZSBxdWVyeSBrZXlzIGRlZmluaW5nIGEgcHJpbWFyeSBvciB1bmlxdWUga2V5IHZhbHVlIGluIHRoZSBvdGhlciBpbnRlcmZhY2UgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJxdWVyeS1rZXktcmVmZXJlbmNlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByZWZlcmVuY2Ugb2YgYSBzb3VyY2UgdGFibGUgZm9yZWlnbiBrZXkgYW5kIGEgdGFyZ2V0IGludGVyZmFjZSBkZXNjcmlwdG9yIHF1ZXJ5IGtleS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGZpZWxkL2NvbHVtbiBuYW1lIGluIHRoZSBzb3VyY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LXF1ZXJ5LWtleSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkga2V5IG5hbWUgb2YgdGhlIHRhcmdldCBpbnRlcmZhY2UgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiIHR5cGU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGNsYXNzIGluZGljYXRvciB2YWx1ZXMgYW5kIHRoZSBzdWJjbGFzc2VzIHRoZXkgbWFwIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbnRhaW5lci9jb2xsZWN0aW9uIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb2xsZWN0aW9uLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24gY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNvcnRlZC1jb2xsZWN0aW9uLWNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc29ydGVkIGNvbGxlY3Rpb24gdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29tcGFyYXRvci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb21wYXJpdG9yLCB1c2VkIHRvIGNvbXBhcmUgb2JqZWN0cyBpbiBzb3J0aW5nIHRoZSBjb2xsZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsaXN0LWNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbGlzdCBjb2xsZWN0aW9uIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1jb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcCBjb250YWluZXIgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWFwLWtleS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBtZXRob2QgdG8gY2FsbCBvbiB0aGUgdGFyZ2V0IG9iamVjdHMgdG8gZ2V0IHRoZSBrZXkgdmFsdWUgZm9yIHRoZSBtYXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1tYXAtY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgbWFwIGNvbnRhaW5lciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY3JvbGxhYmxlLWN1cnNvci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc2Nyb2xsYWJsZSBjdXJzb3IgY29udGFpbmVyIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1cnNvcmVkLXN0cmVhbS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY3Vyc29yZWQgc3RyZWFtIGNvbnRhaW5lciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmRpcmVjdGlvbi1wb2xpY3kiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRlZmVycmVkIHJlYWQgaW5kaXJlY3Rpb24gbWVjaGFuaXNtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsdWUtaG9sZGVyLWluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdXNhZ2Ugb2YgdmFsdWUgaG9sZGVycyB0byBpbXBsZW1lbnQgaW5kaXJlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluZGlyZWN0aW9uLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJveHktaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB1c2FnZSBvZiBwcm94aWVzIHRvIGltcGxlbWVudCBpbmRpcmVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5kaXJlY3Rpb24tcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc3BhcmVudC1jb2xsZWN0aW9uLWluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdXNhZ2Ugb2YgdHJhbnNwYXJlbnQgY29sbGVjdGlvbnMgdG8gaW1wbGVtZW50IGluZGlyZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbGxlY3Rpb24tdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIGludGVyZmFjZSB0byB1c2UsIGkuZS4gTGlzdCwgU2V0LCBNYXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtYXAta2V5LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIG1ldGhvZCB0byBjYWxsIG9uIHRoZSB0YXJnZXQgb2JqZWN0cyB0byBnZXQgdGhlIGtleSB2YWx1ZSBmb3IgdGhlIG1hcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udGFpbmVyLWluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdXNhZ2Ugb2YgYSB1c2VyIGRlZmluZWQgY29udGFpbmVyIHRvIGltcGxlbWVudCBpbmRpcmVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29udGFpbmVyIGltcGxlbWVudGVyIHRvIHVzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWxpc3QtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+TGlzdCBjb252ZXJ0ZXI8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvYmplY3QtY2xhc3MtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBsaXN0J3MgZWxlbWVudCB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPiAKLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZXNhZmUtZW51bWVyYXRpb24tY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VHlwZXNhZmUgRW51bWVyYXRpb24gY29udmVyc2lvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2YWx1ZS1jb252ZXJ0ZXIiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGUtY29udmVyc2lvbi1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGRhdGEgdHlwZSBhbmQgYW4gb2JqZWN0IHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSB0byBjb252ZXJ0IGJldHdlZW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib2JqZWN0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGF0YS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBhdHRyaWJ1dGVzIHN0b3JhZ2UgZGF0YSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJpYWxpemVkLW9iamVjdC1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VzIG9iamVjdCBzZXJpYWxpemF0aW9uIHRvIGNvbnZlcnQgYmV0d2VlbiB0aGUgb2JqZWN0IGFuZCBkYXRhIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZXMgc3RvcmFnZSBkYXRhIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIG1hcHBpbmcgb2YgdmFsdWVzIGZyb20gZGF0YWJhc2UgdmFsdWVzIHVzZWQgaW4gdGhlIGZpZWxkIGFuZCBvYmplY3QgdmFsdWVzIHVzZWQgaW4gdGhlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWZhdWx0LXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBvcHRpb25hbCBkZWZhdWx0IHZhbHVlIGNhbiBiZSBzcGVjaWZpZWQuICBUaGlzIHZhbHVlIGlzIHVzZWQgaWYgYSBkYXRhYmFzZSB0eXBlIGlzIG5vdCBmb3VuZCBpbiB0aGUgdHlwZSBtYXBwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtbWFwcGluZ3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBtYXBwaW5nIG9mIHZhbHVlcy4gIEJvdGggdGhlIG9iamVjdCBhbmQgZGF0YWJhc2UgdmFsdWVzIG11c3QgYmUgdW5pcXVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InR5cGUtbWFwcGluZyIgdHlwZT0idHlwZS1tYXBwaW5nIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIG9iamVjdCBhbmQgZGF0YSB2YWx1ZSBtYXBwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtb25seS10eXBlLW1hcHBpbmdzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIG1hcHBpbmcgb2YgYWRkaXRpb25hbCB2YWx1ZXMgdGhhdCBtYXAgbm9uLXVuaXF1ZSBkYXRhIHZhbHVlcyB0byBhIHVuaXF1ZSBhdHRyaWJ1dGUgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idHlwZS1tYXBwaW5nIiB0eXBlPSJ0eXBlLW1hcHBpbmciPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgb2JqZWN0IGFuZCBkYXRhIHZhbHVlIG1hcHBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIGFuIG9iamVjdCBhbmQgZGF0YSB2YWx1ZSBtYXBwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgdmFsdWUgdG8gdXNlIGluIHRoZSBvYmplY3QncyBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YS12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgdmFsdWUgdG8gdXNlIGluIHRoZSBkYXRhYmFzZSBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2UtcXVlcnkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5L2ludGVyYWN0aW9uIGFnYWluc3QgYSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9Im1haW50YWluLWNhY2hlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCBieXBhc3MgdGhlIGNhY2hlIGNvbXBsZXRlbHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaW5kLWFsbC1wYXJhbWV0ZXJzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCB1c2UgcGFyYW1hdGVyIGJpbmRpbmcgZm9yIGFyZ3VtZW50cywgb3IgcHJpbnQgdGhlIGFyZ3VtZW50cyBpbi1saW5lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FjaGUtc3RhdGVtZW50IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJpZXMgc3RhdGVtZW50IHNob3VsZCBiZSBjYWNoZWQsIHRoaXMgbXVzdCBiZSB1c2VkIHdpdGggcGFyYW1ldGVyIGJpbmRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSB0aW1lb3V0IHRvIGNhbmNlbCB0aGUgcXVlcnkgaW4gaWYgdGhlIHJlcXVlc3QgdGFrZXMgdG9vIGxvbmcgdG8gY29tcGxldGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJwcmVwYXJlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCBwcmVwYXJlIGFuZCBjYWNoZSBpdHMgZ2VuZXJhdGVkIFNRTCwgb3IgcmVnZW5lcmF0ZSB0aGUgU1FMIG9uIGVhY2ggZXhlY3V0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FsbCIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIHN0YXRpYyBjYWxscyB0aGUgU1FMIG9yIFN0b3JlZCBQcm9jZWR1cmUgY2FsbCBkZWZpbml0aW9uIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGpvaW4gZmV0Y2ggb3B0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbm5lci1qb2luIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib3V0ZXItam9pbiIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhc2NhZGUtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGNhc2NhZGUgcG9saWNpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icHJpdmF0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFsbCIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZS1yZWFkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciByZWFkaW5nIGEgc2luZ2xlIHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkaXJlY3QtcmVhZC1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LXJlYWQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHJlYWRpbmcgYSBjb2xsZWN0aW9uIG9mIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YS1yZWFkLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhLXJlYWQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHJlYWRpbmcgcmF3IGRhdGEuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlYWQtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLXF1ZXJ5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgcmVhZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYWNoZS1xdWVyeS1yZXN1bHRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCBjYWNoZSB0aGUgcXVlcnkgcmVzdWx0cyB0byBhdm9pZCBmdXR1cmUgZXhlY3V0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1heC1yb3dzIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gZmV0Y2gsIHJlc3VsdHMgd2lsbCBiZSB0cnVuY3RhdGUgb24gdGhlIGRhdGFiYXNlIHRvIHRoaXMgc2l6ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpcnN0LXJlc3VsdCIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHdoZXJlIHRvIHN0YXJ0IHRoZSBjdXJzb3IgaW4gYSByZXN1bHQgc2V0IHJldHVybmVkIGZyb20gdGhlIGRhdGFiYXNlLiBSZXN1bHRzIHByaW9yIHRvIHRoaXMgbnVtYmVyIHdpbGwgbm90IGJlIGJ1aWx0IGludG8gb2JqZWN0czwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmV0Y2gtc2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzcyB0aGUgbnVtYmVyIG9mIHJvd3MgdG8gZmV0Y2ggZnJvbSB0aGUgZGF0YWJhc2Ugb24gZWFjaCByZXN1bHQgc2V0IG5leHQgb3BlcmF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcnktcmVzdWx0LWNhY2hlLXBvbGljeSIgdHlwZT0icXVlcnktcmVzdWx0LWNhY2hlLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyB0aGUgcXVlcnkgcmVzdWx0cyBzaG91bGQgYmUgY2FjaGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1yZXN1bHQtY2FjaGUtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBxdWVyeSdzIHJlc3VsdHMgc2hvdWxkIGJlIGNhY2hlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImludmFsaWRhdGlvbi1wb2xpY3kiIHR5cGU9ImNhY2hlLWludmFsaWRhdGlvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeS4gQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIxMDAiIG5hbWU9Im1heGltdW0tY2FjaGVkLXJlc3VsdHMiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGRlZmluZXMgdGhlIG51bWJlciBvZiBxdWVyeSByZXN1bHQgc2V0cyB0aGF0IHdpbGwgYmUgY2FjaGVkLiBUaGUgTFJVIHF1ZXJ5IHJlc3VsdHMgd2lsbCBiZSBkaXNjYXJkZWQgd2hlbiB0aGUgbWF4IHNpemUgaXMgcmVhY2hlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIG1hbmlwdWxhdGluZyBkYXRhLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LW1vZGlmeS1xdWVyeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIG1vZGlmeWluZyBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1cGRhdGUtb2JqZWN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciB1cGRhdGluZyBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1tb2RpZnktcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc2VydC1vYmplY3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGluc2VydGluZyBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1tb2RpZnktcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlbGV0ZS1vYmplY3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGRlbGV0aW5nIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LW1vZGlmeS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZG9lcy1leGlzdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gb2JqZWN0IGV4aXN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImV4aXN0ZW5jZS1jaGVjayIgdHlwZT0iZXhpc3RlbmNlLWNoZWNrIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBleGlzdGVuY2UgY2hlY2sgb3B0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImV4aXN0ZW5jZS1jaGVjayI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBleGlzdGVuY2UgY2hlY2sgb3B0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrLWNhY2hlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hlY2stZGF0YWJhc2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhc3N1bWUtZXhpc3RlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXNzdW1lLW5vbi1leGlzdGVuY2UiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgZGVsZXRpbmcgYSBjcml0ZXJpYSBvZiBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LWxldmVsLXJlYWQtcXVlcnkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBvYmplY3RzIChhcyBhcHBvc2VkIHRvIGRhdGEpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWFkLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGwgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIG9mIG9iamVjdHMgYmVpbmcgcXVlcmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBxdWVyeSBzaG91bGQgcmVmcmVzaCBhbnkgY2FjaGVkIG9iamVjdHMgZnJvbSB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVtb3RlLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHF1ZXJ5IHNob3VsZCByZWZyZXNoIGFueSByZW1vdGVseSBjYWNoZWQgb2JqZWN0cyBmcm9tIHRoZSBzZXJ2ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJjYXNjYWRlLXBvbGljeSIgdHlwZT0iY2FzY2FkZS1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyaWVzIHNldHRpbmdzIChzdWNoIGFzIHJlZnJlc2gsIG1haW50YWluLWNhY2hlKSBzaG91bGQgYXBwbHkgdG8gdGhlIG9iamVjdCdzIHJlbGF0aW9uc2hpcCBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0icHJpbWFyeS1rZXkiIG5hbWU9ImNhY2hlLXVzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IHRoZSBxdWVyeSBzaG91bGQgaW50ZXJhY3Qgd2l0aCB0aGUgY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJsb2NrLW1vZGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcXVlcnkgc2hvdWxkIGxvY2sgdGhlIHJlc3VsdGluZyByb3dzIG9uIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImRpc3RpbmN0LXN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHF1ZXJ5IHNob3VsZCBmaWx0ZXIgZGlzdGluY3QgcmVzdWx0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluLW1lbW9yeS1xdWVyeWluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW4gbWVtb3J5IHF1ZXJ5aW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IGRlZmF1bHQ9Imlnbm9yZS1leGNlcHRpb25zLXJldHVybi1jb25mb3JtZWQiIG5hbWU9InBvbGljeSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyBpbmRpcmVjdGlvbiBvciB1bmNvbmZvcm1hYmxlIGV4cHJlc3Npb25zIHNob3VsZCBiZSB0cmVhdGluZyB3aXRoIGluLW1lbW9yeSBxdWVyeWluZyBhbmQgY29uZm9ybWluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0idXNlLWRlZmF1bHQtZmV0Y2gtZ3JvdXAiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGRlZmF1bHQgZmV0Y2ggZ3JvdXAgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZldGNoLWdyb3VwIiB0eXBlPSJmZXRjaC1ncm91cCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgcXVlcnkgdG8gcGFydGlhbGx5IGZldGNoIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmZXRjaC1ncm91cC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgYSBwcmUtZGVmaW5lZCBuYW1lZCBmZXRjaCBncm91cCB0byBhbGxvdyB0aGUgcXVlcnkgdG8gcGFydGlhbGx5IGZldGNoIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLWV4Y2x1c2l2ZS1jb25uZWN0aW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBleGNsdXNpdmUgY29ubmVjdGlvbiAoVlBEKSBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iam9pbmVkLWF0dHJpYnV0ZS1leHByZXNzaW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGF0dHJpYnV0ZXMgYmVpbmcgam9pbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIGpvaW5pbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiBvYmplY3RzIHJlc3VsdGluZyBmcm9tIHRoZSBxdWVyeSBhcmUgcmVhZC1vbmx5LCBhbmQgd2lsbCBub3QgYmUgcmVnaXN0ZXJlZCBpbiB0aGUgdW5pdCBvZiB3b3JrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Im91dGVyLWpvaW4tc3ViY2xhc3NlcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGluaGVyaXRhbmNlIHF1ZXJpZXMgc3BlY2lmeSBpZiBhbGwgc3ViY2xhc3NlcyBzaG91bGQgYmUgb3V0ZXIgam9pbmVkLCBpbnN0ZWFkIG9mIGEgcXVlcnkgcGVyIHN1YmNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgYSBzZXQgb2Ygb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LWxldmVsLXJlYWQtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmF0Y2gtcmVhZC1hdHRyaWJ1dGUtZXhwcmVzc2lvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGFsbCBhdHRyaWJ1dGVzIGZvciBiYXRjaCByZWFkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIGJhdGNoIHJlYWRpbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3JkZXItYnktZXhwcmVzc2lvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2V0cyB0aGUgb3JkZXIgZXhwcmVzc2lvbnMgZm9yIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBleHByZXNzaW9uIGZvciBvcmRlcmluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBhIHNpbmdsZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1sZXZlbC1yZWFkLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXBvcnQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5RdWVyeSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYSBzZXQgb2Ygb2JqZWN0cyBpbnN0ZWFkIG9mIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4tY2hvaWNlIiB0eXBlPSJyZXR1cm4tY2hvaWNlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNpbXBsaWZpZXMgdGhlIHJlc3VsdCBieSBvbmx5IHJldHVybmluZyB0aGUgZmlyc3QgcmVzdWx0LCBmaXJzdCB2YWx1ZSwgb3IgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXRyaWV2ZS1wcmltYXJ5LWtleXMiIHR5cGU9InJldHJpZXZlLXByaW1hcnkta2V5cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2V0aGVyIHRoZSBwcmltYXJ5IGtleSB2YWx1ZXMgc2hvdWxkIGFsc28gYmUgcmV0cmlldmVkIGZvciB0aGUgcmVmZXJlbmNlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVwb3J0LWl0ZW1zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkl0ZW1zIHRvIGJlIHNlbGVjdGVkLCB0aGVzZSBjb3VsZCBiZSBhdHRyaWJ1dGVzIG9yIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpdGVtIiB0eXBlPSJyZXBvcnQtaXRlbSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGl0ZW0gcmVxdWVzdGVkPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imdyb3VwLWJ5LWV4cHJlc3Npb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNldHMgR1JPVVAgQlkgZXhwcmVzc2lvbnMgZm9yIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBleHByZXNzaW9uIGZvciBncm91cGluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icmV0dXJuLWNob2ljZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNpbXBsaWZpZXMgdGhlIHJlc3VsdCBieSBvbmx5IHJldHVybmluZyB0aGUgZmlyc3QgcmVzdWx0LCBmaXJzdCB2YWx1ZSwgb3IgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXR1cm4tc2luZ2xlLXJlc3VsdCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJldHVybi1zaW5nbGUtdmFsdWUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXR1cm4tc2luZ2xlLWF0dHJpYnV0ZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InJldHJpZXZlLXByaW1hcnkta2V5cyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB3ZXRoZXIgdGhlIHByaW1hcnkga2V5IHZhbHVlcyBzaG91bGQgYWxzbyBiZSByZXRyaWV2ZWQgZm9yIHRoZSByZWZlcmVuY2UgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmdWxsLXByaW1hcnkta2V5IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmlyc3QtcHJpbWFyeS1rZXkiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuby1wcmltYXJ5LWtleSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXBvcnQtaXRlbSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gaXRlbSByZXF1ZXN0ZWQgaW4gUmVwb3J0UXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TmFtZSBnaXZlbiBmb3IgaXRlbSwgY2FuIGJlIHVzZWQgdG8gcmV0aWV2ZSB2YWx1ZSBmcm9tIHJlc3VsdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhwcmVzc2lvbiAocGFydGlhbCkgdGhhdCBkZXNjcmliZXMgdGhlIGF0dHJpYnV0ZSB3YW50ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImV4cHJlc3Npb24iIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZpbHRlciBleHByZXNzaW9uIHRyZWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbi1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHJlbGF0aW9uIGV4cHJlc3Npb24gdGhhdCBjb21wYXJlcyB0byBleHByZXNzaW9ucyB0aHJvdWdoIG9wZXJhdG9ycyBzdWNoIGFzIGVxdWFsLCBsZXNzVGhhbiwgZXRjLi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxlZnQiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJpZ2h0IiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0b3IiIHR5cGU9Im9wZXJhdG9yIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2dpYy1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgdHdvIHN1Yi1leHByZXNzaW9ucyBqb2luZWQgdGhyb3VnaCBhbiBvcGVyYXRvciBzdWNoIGFzIEFORCwgT1IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsZWZ0IiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyaWdodCIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdG9yIiB0eXBlPSJvcGVyYXRvciIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZnVuY3Rpb24tZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBleHByZXNzaW9uIGNvbXBvc2VkIG9mIGEgZnVuY3Rpb24gYXBwbGllZCB0byBhIGxpc3Qgb2Ygc3ViLWV4cHJlc3Npb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZnVuY3Rpb24gYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhcmd1bWVudCBleHByZXNzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZ1bmN0aW9uIiB0eXBlPSJvcGVyYXRvciIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29uc3RhbnQtZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiB2YWx1ZS4gIElmIHRoZSB2YWx1ZSBpcyBudWxsIHRoZSB2YWx1ZSB0YWcgY2FuIGlzIGFic2VudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnkta2V5LWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gcXVlcnkta2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzZSIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFueS1vZiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im91dGVyLWpvaW4iIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNlIiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGFyYW1ldGVyLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gcGFyYW1ldGVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2UtZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiBidWlsZGVyL2Jhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3BlcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgb3BlcmF0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3FsLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIFNRTCBxdWVyeSBsYW5ndWFnZSBzdHJpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxsIFNRTCBxdWVyeSBzdHJpbmcuICBBcmd1bWVudHMgY2FuIGJlIHNwZWNpZmllZCB0aHJvdWdoICNhcmctbmFtZSB0b2tlbnMgaW4gdGhlIHN0cmluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpicWwtY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gRUpCLVFMIHF1ZXJ5IGxhbmd1YWdlIHN0cmluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamJxbCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgRUpCLVFMIHF1ZXJ5IHN0cmluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RvcmVkLXByb2NlZHVyZS1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgaW52b2NhdGlvbiBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb2NlZHVyZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY3Vyc29yLW91dHB1dC1wcm9jZWR1cmUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgY2FsbCB0byB1c2UgYSBjdXJzb3Igb3V0cHV0IHBhcmFtZXRlciB0byBkZWZpbmUgdGhlIHJlc3VsdCBzZXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgaW5wdXQgYW5kIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0icHJvY2VkdXJlLWFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYXJndW1lbnQgdG8gdGhlIHByb2NlZHVyZS4gVGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudHMgbXVzdCBtYXRjaCB0aGUgcHJvY2VkdXJlIGFyZ3VtZW50cyBpZiBub3QgbmFtZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RvcmVkLWZ1bmN0aW9uLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIGZ1bmN0aW9uIGludm9jYXRpb24gZGVmaW5pdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic3RvcmVkLXByb2NlZHVyZS1jYWxsIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBuYW1lPSJzdG9yZWQtZnVuY3Rpb24tcmVzdWx0IiB0eXBlPSJwcm9jZWR1cmUtb3V0cHV0LWFyZ3VtZW50Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHN0b3JlZC1mdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgY2FsbCBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc3RvcmVkIHByb2NlZHVyZSBuYW1lIG9mIHRoZSBhcmd1bWVudC4gRm9yIGluZGV4ZWQgYXJndW1lbnQgdGhlIG5hbWUgaXMgbm90IHJlcXVpcmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IG5hbWUgb2YgdGhlIGFyZ3VtZW50LiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudCBhcyBkZWZpbmUgaW4gdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYXJndW1lbnQgY2xhc3MgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudC1zcWx0eXBlIiB0eXBlPSJ4c2Q6aW50Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgSkRCQyBpbnQgdHlwZSBvZiB0aGUgYXJndW1lbnQsIGFzIGRlZmluZWQgaW4gamF2YS5qZGJjLlR5cGVzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQtc3FsdHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgdHlwZSBpZiBwcm9jZWR1cmUtYXJndW1lbnQtc3FsdHlwZSBpcyBTVFJVQ1Qgb3IgQVJSQVk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50LXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHByb2NlZHVyZSBhcmd1bWVudCB2YWx1ZSBtYXliZSBiZSBzcGVjaWZpZWQgaWYgbm90IHVzaW5nIGEgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb2NlZHVyZS1vdXRwdXQtYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBjYWxsIG91dHB1dCBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icHJvY2VkdXJlLWFyZ3VtZW50IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9jZWR1cmUtaW5vdXRwdXQtYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBjYWxsIG91dHB1dCBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icHJvY2VkdXJlLWFyZ3VtZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3V0cHV0LWFyZ3VtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IG5hbWUgb2YgdGhlIGFyZ3VtZW50LiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudCBhcyBkZWZpbmUgaW4gdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1zdG9yZWQtcHJvY2VkdXJlLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBpbnZvY2F0aW9uIGRlZmluaXRpb24gd2hvc2UgYXJndW1lbnRzIGNvbnRhaW4gYXQgbGVhc3Qgb25lIE9yYWNsZSBQTC9TUUwgdHlwZSB0aGF0IGhhcyBubyBKREJDIHJlcHJlc2VudGF0aW9uIChlLmcuIEJPT0xFQU4sIFBMU19JTlRFR0VSLCBQTC9TUUwgcmVjb3JkKS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhbmQgb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFyZ3VtZW50IHRvIHRoZSBwcm9jZWR1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRleCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamRiYy10eXBlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLXR5cGUiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1yZWNvcmQiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbXBhdGlibGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJqYXZhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGZpZWxkcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFyZ3VtZW50IHRvIHRoZSBwcm9jZWR1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtY29sbGVjdGlvbiI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29tcGF0aWJsZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImphdmEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuZXN0ZWQtdHlwZSIgdHlwZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNsYXNzIG1hcHBpbmcgdG8gYW4gRUlTIHJlY29yZCBkYXRhIHN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHJlY29yZCBzdHJ1Y3R1cmUgbmFtZSB0aGUgZGVzY3JpcHRvciBtYXBzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZXNwYWNlLXJlc29sdmVyIiB0eXBlPSJuYW1lc3BhY2UtcmVzb2x2ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWVzcGFjZSByZXNvbHZlciBmb3IgdGhlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1pbnRlcmFjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gRUlTIGludGVyYWN0aW9uIHV0aWxpemluZyBNYXBwZWRSZWNvcmQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1yZXN1bHQtcGF0aCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgaW5wdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtcmVzdWx0LXBhdGgiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIG91dHB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1pbnRlcmFjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gRUlTIGludGVyYWN0aW9uIHV0aWxpemluZyBYTUwgcmVjb3Jkcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LXJlY29yZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIHRvIHVzZSBmb3IgdGhlIGlucHV0IHJlY29yZCwgaWYgcmVxdWlyZWQgYnkgdGhlIGFkYXB0ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1yb290LWVsZW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgb3V0cHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtcmVzdWx0LXBhdGgiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIGlucHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0LXJlc3VsdC1wYXRoIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBvdXRwdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgaW5wdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBvdXRwdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmRleGVkLWludGVyYWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBFSVMgaW50ZXJhY3Rpb24gdXRpbGl6aW5nIEluZGV4ZWQgcmVjb3Jkcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImludGVyYWN0aW9uLWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBpbnRlcmFjdGlvbiBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50LXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHByb2NlZHVyZSBhcmd1bWVudCB2YWx1ZSBtYXliZSBiZSBzcGVjaWZpZWQgaWYgbm90IHVzaW5nIGEgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW50ZXJhY3Rpb24gbmFtZSBvZiB0aGUgYXJndW1lbnQuIEZvciBpbmRleGVkIGFyZ3VtZW50cyB0aGUgbmFtZSBpcyBub3QgcmVxdWlyZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFyZ3VtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IG5hbWUgb2YgdGhlIGFyZ3VtZW4uIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGFzIGRlZmluZSBpbiB0aGUgcXVlcnksIG9yIHRoZSBkZXNjcmlwdG9yIGZpZWxkIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtcmVsYXRpb25hbC1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhIFN0cnVjdHVyZSB0eXBlIGluIGFuIG9iamVjdC1yZWxhdGlvbmFsIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbmFsLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgc3RydWN0dXJlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZC1vcmRlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgb3JkZXJlZCBsaXN0IG9mIHRoZSBmaWVsZCBkZWZpbmVkIGluIHRoZSBzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuZXN0ZWQtdGFibGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLW0vbS1tIHJlbGF0aW9uc2hpcCB0aGF0IG1ha2VzIHVzZSBvZiB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgbmVzdGVkLXRhYmxlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZC9jb2x1bW4gaW4gdGhlIHNvdXJjZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgbmVzdGVkLXRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBvYmplY3QtcmVsYXRpb25hbCB0eXBlIG5hbWUgb2YgdGhlIG5lc3RlZC10YWJsZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcnJheS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgcHJpbWl0aXZlL3NpbXBsZSB0eXBlIHZhbHVlcyB1c2luZyB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgYXJyYXkgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBvYmplY3QtcmVsYXRpb25hbCB0eXBlIG5hbWUgb2YgdGhlIHN0cnVjdHVyZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtYXJyYXktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIG9iamVjdC10eXBlcyB1c2luZyB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgYXJyYXkgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBvYmplY3QtcmVsYXRpb25hbCB0eXBlIG5hbWUgb2YgdGhlIHN0cnVjdHVyZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdHJ1Y3R1cmUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdHJ1Y3R1cmUgb2Ygb2JqZWN0LXR5cGVzIHVzaW5nIHRoZSBvYmplY3QtcmVsYXRpb25hbCBzdHJ1Y3R1cmUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBvYmplY3QtdHlwZSB1c2luZyB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgcmVmZXJlbmNlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCBpbiB0aGUgc291cmNlIHR5cGUgdGhhdCBzdG9yZXMgdGhlIHJlZmVyZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXJlbGF0aW9uYWwtZmllbGQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIE9iamVjdFJlbGF0aW9uYWxEYXRhYmFzZUZpZWxkPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuZXN0ZWQtdHlwZS1maWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QteG1sLXR5cGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgbWFwcGluZyB0byBhbiBPcmFjbGUgWERCIFhNTCBUeXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkaXJlY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVhZC13aG9sZS1kb2N1bWVudCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGhvdyB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZSBvYmplY3QgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGEgdXNlciBkZWZpbmVkIGNvbnZlcnRlciBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29sbGVjdGlvbi1yZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLU0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBYTUwgZWxlbWVudCB0byB0aGUgdGFyZ2V0IFhNTCBlbGVtZW50IGJhc2VkIG9uIGEga2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4bWwtb2JqZWN0LXJlZmVyZW5jZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXJwb2xpY3kiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VzLXNpbmdsZS1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLW9iamVjdC1yZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLTEgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBYTUwgZWxlbWVudCB0byB0aGUgdGFyZ2V0IFhNTCBlbGVtZW50IGJhc2VkIG9uIG9uZSBvciBtb3JlIGtleXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFnZ3JlZ2F0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic291cmNlLXRvLXRhcmdldC1rZXktZmllbGQtYXNzb2NpYXRpb24iIHR5cGU9ImZvcmVpZ24ta2V5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNvdXJjZS10by10YXJnZXQta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLWNkYXRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJudWxsLXBvbGljeSIgdHlwZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgbmVzdGVkIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIG5lc3RlZCBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItZ2V0LW1ldGhvZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1zZXQtbWV0aG9kIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2VlcC1hcy1lbGVtZW50LXBvbGljeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIG5lc3RlZCBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBvYmplY3QgbWFwcGluZyBmb3IgYW4gWE1MIG5lc3RlZCBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLWF0dHJpYnV0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLWdldC1tZXRob2QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1zZXQtbWV0aG9kIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIG9iamVjdCBtYXBwaW5nIGZvciBhbiBYTUwgbmVzdGVkIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibnVsbC1wb2xpY3kiIHR5cGU9ImFic3RyYWN0LW51bGwtcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImtlZXAtYXMtZWxlbWVudC1wb2xpY3kiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBvYmplY3QgbWFwcGluZyBmb3IgYW4gWE1MIG5lc3RlZCBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhbiBYTUwgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZGVmYXVsdC1yb290LWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdGhlIGRlc2NyaXB0b3IgbWFwcyB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtcm9vdC1lbGVtZW50LWZpZWxkIiB0eXBlPSJub2RlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBYTUxGaWVsZCByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgcm9vdCBlbGVtZW50IG9mIHRoZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2hvdWxkLXByZXNlcnZlLWRvY3VtZW50IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgaWYgbm9kZXMgc2hvdWxkIGJlIGNhY2hlZCB0byBwcmVzZXJ2ZSB1bm1hcHBlZCBkYXRhPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuYW1lc3BhY2UtcmVzb2x2ZXIiIHR5cGU9Im5hbWVzcGFjZS1yZXNvbHZlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZXNwYWNlIHJlc29sdmVyIGZvciB0aGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNjaGVtYSIgdHlwZT0ic2NoZW1hLXJlZmVyZW5jZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbG9jYXRpb24gb2YgdGhlIFhNTCBTY2hlbWEuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVzdWx0LWFsd2F5cy14bWwtcm9vdCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYW55LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiB0byBhbiB4czphbnkgZGVjbGFyYXRpb24gb3IgeHM6YW55VHlwZSBlbGVtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UteG1sLXJvb3QiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImtlZXAtYXMtZWxlbWVudC1wb2xpY3kiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hbnktYXR0cmlidXRlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gdG8gYW4geHM6YW55IGRlY2xhcmF0aW9uIG9yIHhzOmFueVR5cGUgZWxlbWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmNsdWRlLW5hbWVzcGFjZS1kZWNsYXJhdGlvbiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5jbHVkZS1zY2hlbWEtaW5zdGFuY2UiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldXNlLWNvbnRhaW5lciIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYW55LW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBzaW5nbGUgb2JqZWN0IHRvIGFuIHhzOmFueSBkZWNsYXJhdGlvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UteG1sLXJvb3QiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImtlZXAtYXMtZWxlbWVudC1wb2xpY3kiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtZnJhZ21lbnQtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgc2luZ2xlIE5vZGUgdG8gYSBmcmFnbWVudCBvZiBhbiBYTUwgZG9jdW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieG1sLWRpcmVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWZyYWdtZW50LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiBvZiBOb2RlcyB0byBhIGZyYWdtZW50IG9mIGFuIFhNTCBkb2N1bWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYmluYXJ5LWRhdGEtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgYmluYXJ5IG9iamVjdCB0byBiYXNlNjQgYmluYXJ5PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhtbC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaXMtc3dhLXJlZiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWltZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNob3VsZC1pbmxpbmUtZGF0YSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1iaW5hcnktZGF0YS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGJpbmFyeSBvYmplY3QgdG8gYmFzZTY0IGJpbmFyeTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4bWwtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLXN3YS1yZWYiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1pbWUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaG91bGQtaW5saW5lLWRhdGEiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNob2ljZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gdG8gYSBjaG9pY2Ugc3RydWN0dXJlIGluIGFuIHhtbCBkb2N1bWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1wb2xpY3kiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiIgdHlwZT0ieG1sLWNob2ljZS1maWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNob2ljZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiB0byBhIGNob2ljZSBzdHJ1Y3R1cmUgaW4gYW4geG1sIGRvY3VtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIiB0eXBlPSJ4bWwtY2hvaWNlLWZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNob2ljZS1maWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtZmllbGQiIHR5cGU9Im5vZGUiIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNvbnZlcnNpb24tcGFpciI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJub2RlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBYUGF0aCBleHByZXNzaW9uIHRvIGFuIGVsZW1lbnQgb3IgYXR0cmlidXRlIGluIGFuIFhNTCBkb2N1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcG9zaXRpb24gb2YgdGhlIG5vZGUgaW4gdGhlIHBhcmVudCB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idHlwZWQtdGV4dC1maWVsZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgdGhpcyBpcyBhIHR5cGVkIHRleHQgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaW5nbGUtbm9kZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIGlmIGVhY2ggaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBpcyBpbiB0aGUgc2FtZSBub2RlIGluc3RlYWQgb2YgaGF2aW5nIG9uZSBub2RlIHBlciBpdGVtIGluIHRoZSBjb2xsZWN0aW9uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ic2NoZW1hLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNjaGVtYSB0eXBlIG9mIHRoZSBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InhtbC10by1qYXZhLWNvbnZlcnNpb24tcGFpciIgdHlwZT0ieG1sLWNvbnZlcnNpb24tcGFpciIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iamF2YS10by14bWwtY29udmVyc2lvbi1wYWlyIiB0eXBlPSJ4bWwtY29udmVyc2lvbi1wYWlyIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImxlYWYtZWxlbWVudC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB0aGUgZWxlbWVudHMgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXMtcmVxdWlyZWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuaW9uLW5vZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2UgdG8gcmVwcmVzZW50IG5vZGVzIHdoaWNoIGFyZSBtYXBwZWQgdG8gdW5pb25zPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0eXBlZC10ZXh0LWZpZWxkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0aGlzIGlzIGEgdHlwZWQgdGV4dCBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNpbmdsZS1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgaWYgZWFjaCBpdGVtIGluIHRoZSBjb2xsZWN0aW9uIGlzIGluIHRoZSBzYW1lIG5vZGUgaW5zdGVhZCBvZiBoYXZpbmcgb25lIG5vZGUgcGVyIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb248L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJzY2hlbWEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2NoZW1hIHR5cGUgb2YgdGhlIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ieG1sLXRvLWphdmEtY29udmVyc2lvbi1wYWlyIiB0eXBlPSJ4bWwtY29udmVyc2lvbi1wYWlyIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJqYXZhLXRvLXhtbC1jb252ZXJzaW9uLXBhaXIiIHR5cGU9InhtbC1jb252ZXJzaW9uLXBhaXIiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lc3BhY2UtcmVzb2x2ZXIiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9Im5hbWVzcGFjZXMiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJuYW1lc3BhY2UiIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdC1uYW1lc3BhY2UtdXJpIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lc3BhY2UiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVzcGFjZS11cmkiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjaGVtYS1yZWZlcmVuY2UiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXNvdXJjZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEtY29udGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJub2RlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjaGVtYS1jbGFzcy1wYXRoLXJlZmVyZW5jZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2NoZW1hLXJlZmVyZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2NoZW1hLWZpbGUtcmVmZXJlbmNlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzY2hlbWEtcmVmZXJlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY2hlbWEtdXJsLXJlZmVyZW5jZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2NoZW1hLXJlZmVyZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqYXZhLWNoYXJhY3RlciI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iamF2YS10aW1lc3RhbXAiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRhdGVUaW1lIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iamF2YS11dGlsLWRhdGUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRhdGVUaW1lIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtcC1wb2xpY3kiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwZXNzaW1pc3RpYy1sb2NraW5nIiB0eXBlPSJwZXNzaW1pc3RpYy1sb2NraW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjbXAgYmVhbi1sZXZlbCBwZXNzaW1pc3RpYyBsb2NraW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmVyLXVudGlsLWNvbW1pdCIgdHlwZT0iZGVmZXItdW50aWwtY29tbWl0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIG1vZGlmaWNhdGlvbiBkZWZlcnJhbCBsZXZlbCBmb3Igbm9uLWRlZmVycmVkIHdyaXRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5vbi1kZWZlcnJlZC1jcmVhdGUtdGltZSIgdHlwZT0ibm9uLWRlZmVycmVkLWNyZWF0ZS10aW1lIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHBvaW50IGF0IHdoaWNoIGluc2VydCB3aWxsIGJlIGlzc3VlZCB0byBEYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVzc2ltaXN0aWMtbG9ja2luZyI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IndhaXQiIG5hbWU9ImxvY2tpbmctbW9kZSIgdHlwZT0ibG9ja2luZy1tb2RlIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRlZmVyLXVudGlsLWNvbW1pdCI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFsbC1tb2RpZmljYXRpb25zIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idXBkYXRlLW1vZGlmaWNhdGlvbnMiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibm9uLWRlZmVycmVkLWNyZWF0ZS10aW1lIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWZ0ZXItZWpiY3JlYXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWZ0ZXItZWpicG9zdGNyZWF0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVuZGVmaW5lZCIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvY2tpbmctbW9kZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkhvbGRzIHRoZSBwZXNzaW1pc3RpYyBsb2NraW5nIG1vZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3YWl0IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8td2FpdCIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IiIgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2UgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjUwIiBuYW1lPSJwcmVhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jZSBwcmVhbGxvY2F0aW9uIHNpemUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZWZlcmVuY2VzIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LCBvdmVycmlkaW5nIGl0cyBuYW1lIGFuZCAob3B0aW9uYWxseSkgcHJlYWxsb2NhdGlvbiBzaXplLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VG8gdXNlIHByZWFsbG9jYXRpb24gc2l6ZSBvZiBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwgc2V0IHByZWFsbG9jYXRpb24gc2l6ZSB0byAwPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYXRpdmUtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EYXRhYmFzZSBzZXF1ZW5jZSBtZWNoYW5pc20gdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGFibGUgc2VxdWVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUVVFTkNFIiBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX05BTUUiIG5hbWU9Im5hbWUtZmllbGQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUV9DT1VOVCIgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmFyeS10YWJsZS1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVuYXJ5IHRhYmxlIHNlcXVlbmNlIC0gc2VxdWVuY2UgbmFtZSBpcyBhIHRhYmxlIG5hbWUsIHRhYmxlIGhhcyBhIHNpbmdsZSBmaWVsZCBhbmQgYSBzaW5nbGUgcm93PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFVRU5DRSIgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWxmaWxlLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sZmlsZSBzZXF1ZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlhtbCBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRVUVOQ0UiIG5hbWU9InJvb3QtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX05BTUUiIG5hbWU9Im5hbWUtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX0NPVU5UIiBuYW1lPSJjb3VudGVyLWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmV0Y2gtZ3JvdXBzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgYWxsIHByZS1kZWZpbmVkIGZldGNoIGdyb3Vwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtZmV0Y2gtZ3JvdXAiIHR5cGU9ImZldGNoLWdyb3VwIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZldGNoLWdyb3VwIiB0eXBlPSJmZXRjaC1ncm91cCIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmV0Y2gtZ3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyB0aGUgZmV0Y2ggZ3JvdXAgYXR0cmlidXRlcyBpbmZvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmZXRjaC1ncm91cC1hdHRyaWJ1dGVzIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgYSBmZXRjaCBncm91cCdzIGF0dHJpYnV0ZSBsaXN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZldGNoLWdyb3VwLWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjaGFuZ2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGZvciB0aGlzIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWZlcnJlZC1kZXRlY3Rpb24tY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgYmFja3VwIGNsb25lIHRvIGRldGVjdCBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjaGFuZ2UtcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtbGV2ZWwtY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgIm1hcmsgZGlydHkiIHRvIGRldGVjdCBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjaGFuZ2UtcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtbGV2ZWwtY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgYSBDaGFuZ2VUcmFja2VyIGZpcmluZyBQcm9wZXJ0eUNoYW5nZUV2ZW50J3MgdG8gZGV0ZWN0IGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNoYW5nZS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgTnVsbCBQb2xpY3kgaW4gdXNlIGZvciB0aGlzIHJlbGF0aW9uc2hpcCBjdXJyZW50bHkgYSBjaG9pY2Ugb2YgW051bGxQb2xpY3kgYW5kIElzU2V0TnVsbFBvbGljeV0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ieHNpLW5pbC1yZXByZXNlbnRzLW51bGwiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImVtcHR5LW5vZGUtcmVwcmVzZW50cy1udWxsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im51bGwtcmVwcmVzZW50YXRpb24tZm9yLXhtbCIgdHlwZT0ibWFyc2hhbC1udWxsLXJlcHJlc2VudGF0aW9uIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJudWxsLXBvbGljeSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImlzLXNldC1wZXJmb3JtZWQtZm9yLWFic2VudC1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlzLXNldC1udWxsLXBvbGljeSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLXNldC1tZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaXMtc2V0LXBhcmFtZXRlci10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpcy1zZXQtcGFyYW1ldGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJtYXJzaGFsLW51bGwtcmVwcmVzZW50YXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Xcml0ZSBudWxsLCBubyB0YWcoZGVmYXVsdCkgb3IgYW4gZW1wdHkgdGFnLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWFNJX05JTCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFCU0VOVF9OT0RFIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRU1QVFlfTk9ERSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBnZW5lcmljIGZpZWxkIGNvbmNlcHQsIHN1Y2ggYXMgYSBkYXRhYmFzZSBjb2x1bW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbHVtbiBpbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgY29sdW1uJ3MgdGFibGUuIFRoaXMgdGFibGUgbXVzdCBiZSBsaXN0ZWQgaW4gdGhlIGNsYXNzJyB0YWJsZXMuIElmIG5vdCBzcGVjaWZpZWQgdGhlIGZpcnN0IHRhYmxlIG9mIHRoZSBjbGFzcyB3aWxsIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNxbC10eXBlY29kZSIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4ob3B0aW9uYWwgZmllbGQpIFRoZSBKREJDIHR5cGVjb2RlIG9mIHRoaXMgY29sdW1uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+KG9wdGlvbmFsIGZpZWxkKSBOYW1lIG9mIHRoZSBKREJDIHR5cGVjb2RlIGZvciB0aGlzIGNvbHVtbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6YXR0cmlidXRlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmb3JlaWduLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHNvdXJjZS90YXJnZXQgZmllbGQvY29sdW1uIHJlZmVyZW5jZXMgcmVsYXRpbmcgYSBmb3JlaWduIGtleSBpbiBvbmUgdGFibGUgdG8gdGhlIHByaW1hcnkgb3IgdW5pcXVlIGtleSBpbiBhbm90aGVyIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC1yZWZlcmVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByZWZlcmVuY2Ugb2YgYSBzb3VyY2UgdGFibGUgZm9yZWlnbiBrZXkgYW5kIGEgdGFyZ2V0IHRhYmxlIHByaW1hcnkga2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb3VyY2UtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgZmllbGQvY29sdW1uIG5hbWUgaW4gdGhlIHNvdXJjZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcHJpbWFyeSBvciB1bmlxdWUga2V5IGZpZWxkL2NvbHVtbiBuYW1lIGluIHRoZSB0YXJnZXQgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgc3BlY2lmaWNhdGlvbiBmb3IgcXVlcnlpbmcgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNlbGVjdGlvbiBjcml0ZXJpYSBvZiB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudHMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHF1ZXJ5IGFyZ3VtZW50cy4gVGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudCBtdXN0IG1hdGNoIHRoZSBvcmRlciBvZiB0aGUgYXJndW1lbnQgdmFsdWUgcGFzc2VkIHRvIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9InF1ZXJ5LWFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBxdWVyeS4gIFRoaXMgbmFtZSBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgYW5kIGV4ZWN1dGUgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3JpdGVyaWEiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBmaWx0ZXJpbmcgY2xhdXNlIG9mIGEgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgdHlwZSBuYW1lIG9mIHRoZSBhcmd1bWVudCBtYXkgYmUgcHJvdmlkZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIGNvbnN0YW50IHZhbHVlIGZvciB0aGUgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgdXNlciBkZWZpbmVkIHByb3BlcnR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6YW55VHlwZSIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHRhYmxlcyB0aGF0IHRoZSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8uICBUaGlzIGlzIHR5cGljYWxseSBhIHNpbmdsZSB0YWJsZSBidXQgY2FuIGJlIG11bHRpcGxlLCBvciBlbXB0eSBmb3IgaW5oZXJpdGFuY2Ugb3IgYWdncmVnYXRlZCBjbGFzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSB0YWJsZS4gIFRoZSBuYW1lIGNhbiBiZSBmdWxseSBxdWFsaWZpZWQgd2l0aCB0aGUgc2NoZW1hLCB0YWJsZXNwYWNlIG9yIGxpbmsuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgU3BlY2lmaWVzIGhvdyB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZQotICAgICAgICBvYmplY3QgdmFsdWUuCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vZGUtb3JkZXJpbmctcG9saWN5IgotICAgICAgICAgICAgdHlwZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpjb21wbGV4VHlwZT4KLQotCi0gICAgPHhzZDpjb21wbGV4VHlwZQotICAgICAgICBuYW1lPSJkZXNjcmlwdG9yLWxldmVsLWRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm8tZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYmluZGVyLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcHBlbmQtbmV3LWVsZW1lbnRzLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWdub3JlLW5ldy1lbGVtZW50cy1vcmRlcmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aXZlLXBvc2l0aW9uLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMC54c2QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19zZXNzaW9uc18xLjAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODMxYWYwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAKLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCAKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gCi0gVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCAKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0KLSBDb250cmlidXRvcnM6Ci0gICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9yYWNsZSBUb3BMaW5rCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS0tPgotPCEtLSAKLQotWE1MIFNjaGVtYSBkZWZpbml0aW9uIGZvciB0aGUgRWNsaXBzZSBQZXJzaXN0ZW5jZSBTZXJ2aWNlcyBQcm9qZWN0IFNlc3Npb24gQ29uZmlndXJhdGlvbiBmaWxlLiBJbnN0YW5jZXMKLW9mIHRoaXMgZmlsZSBhcmUgdHlwaWNhbGx5IGxvY2F0ZWQgYXM6ICdNRVRBLUlORi9zZXNzaW9ucy54bWwnCi0KLSAtLT4KLQotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdmVyc2lvbj0iMS4wIj4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbnMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgcm9vdCBlbGVtZW50IGFuZCBleGlzdHMgb25seSBmb3IgWE1MCi0gICAgICAgICAgICAgICAgc3RydWN0dXJlCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbiIgdHlwZT0ic2Vzc2lvbiIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBub2RlIGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgYSBwYXJ0aWN1bGFyIHNlc3Npb24KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljIGVsZW1lbnQgdXNlZCB0byBkZXNjcmliZSBhIHN0cmluZyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRzIHRoZSBuYW1lIG9mIGFuIGl0ZW0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2ZXItcGxhdGZvcm0iIHR5cGU9InNlcnZlci1wbGF0Zm9ybSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUtY29tbWFuZCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gZWxlbWVudCB0aGF0IGRlZmluZSB0aGUgUmVtb3RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZCBNb2R1bGUgdGhhdCBjYW4gYWxzbyBiZSB1c2VkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlIHN5bmNocm9uaXphdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5uZWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIGRlZmF1bHQ9IkVjbGlwc2VMaW5rQ29tbWFuZENoYW5uZWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHJlbW90ZS1jb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbW1hbmRzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiByZW1vdGUtY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRldGVybWluZSB3aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBmZWF0dXJlcywgdGhlIFJDTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtc3luYyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgZWxlbWVudC4gSXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJucyBvbiBjYWNoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXphdGlvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93IHNlbmRpbmcgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nIGNhY2hlIHN5bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zcG9ydCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idHJhbnNwb3J0LW1hbmFnZXIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHJlbW90ZS1jb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGVmaW5lcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgbWVjaGFuaXNtIG9mIHRoZSBSQ00uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHJhbnNwb3J0IG1lY2hhbmlzbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIFJNSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZlbnQtbGlzdGVuZXItY2xhc3NlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iZXZlbnQtbGlzdGVuZXItY2xhc3NlcyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvZmlsZXIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgcmVwcmVzZW50cyBpZiB0aGUgcHJvZmlsZXIgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBieSB0aGUgc2Vzc2lvbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZG1zIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZWNsaXBzZWxpbmsiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2VwdGlvbi1oYW5kbGVyLWNsYXNzIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBjbGFzcyB0aGF0IHRoZSBzZXNzaW9uIHdpbGwgdXNlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgZXhjZXB0aW9ucyBnZW5lcmF0ZWQgZnJvbSB3aXRoaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nZ2luZyIgdHlwZT0ibG9nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9nZ2luZyBvcHRpb25zCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi1jdXN0b21pemVyLWNsYXNzIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBzZXNzaW9uIGN1c3RvbWl6ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIHRvIHJ1biBvbiBhIGxvYWRlZCBzZXNzaW9uLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZlci1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBub2RlIGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd2hpY2ggc2VydmVyCi0gICAgICAgICAgICAgICAgcGxhdGZvcm0gdG8gdXNlLCBKVEEgc2V0dGluZ3MgYW5kIHJ1bnRpbWUgc2VydmljZXMKLSAgICAgICAgICAgICAgICBzZXR0aW5ncwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmFibGUtcnVudGltZS1zZXJ2aWNlcyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50LiBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIEpNWCBNQmVhbiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGluZyBydW50aW1lIHNlcnZpY2VzIGlzIGRlcGxveWVkLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuYWJsZS1qdGEiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudC4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgc2Vzc2lvbiB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ3JhdGUgd2l0aCB0aGUgSlRBIChpLmUuIHdoZXRoZXIgdGhlIHNlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYSB0cmFuc2FjdGlvbiBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcy4gVGhlIGNob2ljZSBvZiBzZXJ2ZXItY2xhc3Mgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBiZSBjaG9zZW4gYmFzZWQgb24gdGhlIHRyYW5zYWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9tLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLnNlcnZlci5DdXN0b21TZXJ2ZXJQbGF0Zm9ybSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBzdWJjbGFzcyBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5zZXJ2ZXIuUGxhdGZvcm1CYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNwZWNpZnkgd2hpY2ggc2VydmVyIHBsYXRmb3JtIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImV4dGVybmFsLXRyYW5zYWN0aW9uLWNvbnRyb2xsZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai05MDMtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotOTA0LXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTEwMTItcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotMTAxMy1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai0xMTExLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTYxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy03MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtODEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTktcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTEwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNDAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS01MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTUxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNjAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS02MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamJvc3MtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24tYnJva2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFByb3ZpZGVzIGEgc2luZ2xlIHZpZXcgdG8gYSBzZXNzaW9uIHRoYXQKLSAgICAgICAgICAgICAgICB0cmFuc3BhcmVudGx5IGFjY2Vzc2VzIG11bHRwbGUgZGF0YWJhc2VzLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlc3Npb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwcm9qZWN0Ij4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhtbCI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0icHJvamVjdCIgLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjbGFzcyI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0icHJvamVjdCIgLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2Utc2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGUgc2Vzc2lvbiBpcyB0aGUgcHJpbWFyeSBpbnRlcmZhY2UgaW50byBFY2xpcHNlTGluaywgdGhlCi0gICAgICAgICAgICAgICAgYXBwbGljYXRpb24gc2hvdWxkIGRvIGFsbCBvZiBpdHMgcmVhZGluZyBhbmQgd3JpdGluZyBvZgotICAgICAgICAgICAgICAgIG9iamVjdHMgdGhyb3VnaCB0aGUgc2Vzc2lvbi4gVGhlIHNlc3Npb24gYWxzbyBtYW5hZ2VzCi0gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zIGFuZCB1bml0cyBvZiB3b3JrLiBUaGUgZGF0YWJhc2Ugc2Vzc2lvbiBpcwotICAgICAgICAgICAgICAgIGludGVuZGVkIGZvciB1c2FnZSBpbiB0d28tdGllciBjbGllbnQtc2VydmVyCi0gICAgICAgICAgICAgICAgYXBwbGljYXRpb25zLiBBbHRob3VnaCBpdCBjb3VsZCBiZSB1c2VkIGluIGEgc2VydmVyCi0gICAgICAgICAgICAgICAgc2l0dWF0aW9uLCBpdCBpcyBsaW1pdHRlZCB0byBvbmx5IGhhdmluZyBhIHNpbmdsZQotICAgICAgICAgICAgICAgIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIG9ubHkgYWxsb3dzIGEgc2luZ2xlIG9wZW4KLSAgICAgICAgICAgICAgICBkYXRhYmFzZSB0cmFuc2FjdGlvbi4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXNzaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1wcm9qZWN0IiB0eXBlPSJwcm9qZWN0IgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcHJvamVjdCAoY2xhc3Mgb3IgeG1sKSB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZCBhcyB0aGUgcHJpbWFyeSBwcm9qZWN0IGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkZGl0aW9uYWwtcHJvamVjdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InByb2plY3QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbCBwcm9qZWN0cyB3aWxsIGhhdmUgdGhlaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMgYXBwZW5kZWQgdG8gdGhlIHByaW1hcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2luIiB0eXBlPSJsb2dpbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2ZXItc2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBJcyBhbiBleHRlbnNpb24gb2YgYSBEYXRhYmFzZVNlc3Npb24KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1zZXNzaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1wb29scyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uIHBvb2xzIGFyZSBvbmx5IGZvciB1c2FnZSB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsIGNvbm5lY3Rpb24gcG9vbGluZyBhbmQgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBiZSB1c2VkIGlmIHVzaW5nIGV4dGVybmFsIGNvbm5lY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhZC1jb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJyZWFkLWNvbm5lY3Rpb24tcG9vbCIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IndyaXRlLWNvbm5lY3Rpb24tcG9vbCIgdHlwZT0iY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InNlcXVlbmNlLWNvbm5lY3Rpb24tcG9vbCIgdHlwZT0iY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGlzIHRhZyB0byB1c2UgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlIGNvbm5lY3Rpb24gcG9vbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iY29ubmVjdGlvbi1wb29sIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvbGljeSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImNvbm5lY3Rpb24tcG9saWN5IiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29ubmVjdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVXNlZCB0byBzcGVjaWZ5IGhvdyBkZWZhdWx0IGNsaWVudCBzZXNzaW9ucyBhcmUgYWNxdWlyZWQKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVzaXZlLWNvbm5lY3Rpb24iIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGlmIGFuIGV4Y2x1c2l2ZSBjb25uZWN0aW9uIHNob3VsZCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBmb3IgcmVhZHMsIHJlcXVpcmVkIGZvciBWUEQsIG9yIHVzZXIgYmFzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgc2VjdXJpdHkuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGF6eSIgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBpZiBhIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGFjcXVpcmVkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgaGVsZCB1cGZyb250IGluIHRoZSBjbGllbnQgc2Vzc2lvbiwgb3Igb25seQotICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgd2hlbiBuZWVkZWQgYW5kIHRoZW4gcmVsZWFzZWQuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyBjb21tb24gZmllbGRzIGZvciBkYXRhYmFzZS1sb2dpbiBhbmQgZWlzLWxvZ2luCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBsYXRmb3JtLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgcGxhdGZvcm0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VyLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBsb2dpbiBhcyB3ZWxsIGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgU3luY2hyb25pemF0aW9uIGZlYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmludGVybmFsLnNlY3VyaXR5LkpDRUVuY3J5cHRvciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGxvZ2luIGFzIHdlbGwgYXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZSBTeW5jaHJvbml6YXRpb24gZmVhdHVyZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgbG9naW4gYXMgd2VsbCBhcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlIFN5bmNocm9uaXphdGlvbiBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtcXVhbGlmaWVyIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIGRlZmF1bHQgcXVhbGlmaWVyIGZvciBhbGwgdGFibGVzLiBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgdGhlIGNyZWF0b3Igb2YgdGhlIHRhYmxlIG9yIGRhdGFiYXNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0YWJsZSBleGlzdHMgb24uIFRoaXMgaXMgcmVxdWlyZWQgYnkgc29tZQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VzIHN1Y2ggYXMgT3JhY2xlIGFuZCBEQjIuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZXJuYWwtY29ubmVjdGlvbi1wb29saW5nIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0byB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIHNob3VsZCB1c2UgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIGNvbm5lY3Rpb24gcG9vbAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVybmFsLXRyYW5zYWN0aW9uLWNvbnRyb2xsZXIiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSBpZiB0aGUgc2Vzc2lvbiB3aWxsIGJlIHVzaW5nIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCB0cmFuc2FjdGlvbiBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2luZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNpbmcgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ic2VxdWVuY2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHNlcXVlbmNlLiBUaGUgbmFtZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwuIElmIG5vIG5hbWUgcHJvdmlkZWQgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5IHN0cmluZyB3aWxsIGJlIHVzZWQgYXMgYSBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbiBkZWZhdWx0IHNlcXVlbmNlcy4gTWFrZSBzdXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHNlcXVlbmNlIGhhcyB1bmlxdWUgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ic2VxdWVuY2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgYSBsb2dpbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIEl0IGlzIHVzZWQgdG8gZGVmaW5lIGV4dHJhIHByb3BlcnRpZXMgb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dpbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2UtbG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgSG9sZHMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIGNvbm5lY3QKLSAgICAgICAgICAgICAgICB0byBhIEpEQkMgZHJpdmVyLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZ2luIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZHJpdmVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkcml2ZXIgY2xhc3MgaXMgdGhlIEphdmEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBmb3IgdGhlIEpEQkMgZHJpdmVyIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCAoZS5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bi5qZGJjLm9kYmMuSmRiY09kYmNEcml2ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tdXJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIFVSTCB0aGF0IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YXNvdXJjZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBVUkwgb2YgYSBkYXRhc291cmNlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSB1c2VkIGJ5IHRoZSBzZXNzaW9uIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxvb2t1cCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibG9va3VwLWVudW0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiaW5kLWFsbC1wYXJhbWV0ZXJzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBiaW5kIGFsbCBhcmd1bWVudHMgdG8gYW55Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNRTCBzdGF0ZW1lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZS1hbGwtc3RhdGVtZW50cyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHByZXBhcmVkIHN0YXRlbWVudHMgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNhY2hlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJ5dGUtYXJyYXktYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBiaW5kaW5nIGZvciBsYXJnZSBiaW5hcnkgZGF0YS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCBFY2xpcHNlTGluayB3aWxsIHByaW50IHRoaXMgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBoZXggdGhyb3VnaCB0aGUgSkRCQyBiaW5hcnkgZXhjYXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXVzZS4gQm90aCBiaW5kaW5nIGFuZCBwcmludGluZyBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlvdXMgbGltaXRzIG9uIGFsbCBkYXRhYmFzZXMgKGUuZy4gNWsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAzMmspLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RyaW5nLWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSBpZiBzdHJpbmdzIHNob3VsZCBiZSBib3VuZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlZCB0byBoZWxwIGJlYW4gaW50cm9zcGVjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cmVhbXMtZm9yLWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2Ugc3RyZWFtcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdG9yZSBsYXJnZSBiaW5hcnkgZGF0YS4gVGhpcyBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZSB0aGUgbWF4IHNpemUgZm9yIHJlYWRpbmcvd3JpdGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBzb21lIEpEQkMgZHJpdmVycy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcmNlLWZpZWxkLW5hbWVzLXRvLXVwcGVyLWNhc2UiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHNldHRpbmcgY2FuIGJlIHVzZWQgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGV4cGVjdHMgdXBwZXIgY2FzZSBidXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlIGRvZXMgbm90IHJldHVybiBjb25zaXN0ZW50IGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gZGlmZmVyZW50IGRhdGFiYXNlcykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWl6ZS1kYXRhLWNvbnZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIGRyaXZlciBsZXZlbCBkYXRhIGNvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uIGlzIGVuYWJsZWQuIFRoaXMgY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkIGFzIHNvbWUgZHJpdmVycyBwZXJmb3JtIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiB0aGVtc2VsdmVzIGluY29ycmVjdGx5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJpbS1zdHJpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IENIQVIgZmllbGQgdmFsdWVzIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmcgYmxhbmtzIHRyaW1tZWQsIHRoaXMgY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC13cml0aW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGJhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmcuIFRoaXMgZmFjaWxpdHkgYWxsb3dzIG11bHRpcGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIG9wZXJhdGlvbnMgdG8gYmUgc3VibWl0dGVkIHRvIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2UgZm9yIHByb2Nlc3NpbmcgYXQgb25jZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VibWl0dGluZyBtdWx0aXBsZSB1cGRhdGVzIHRvZ2V0aGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIGluZGl2aWR1YWxseSwgY2FuIGdyZWF0bHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZSBwZXJmb3JtYW5jZSBpbiBzb21lIHNpdHVhdGlvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqZGJjLWJhdGNoLXdyaXRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmcgdGhpcyB0YWcgd2l0aCB0cnVlIGluZGljYXRlcyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayB0aGF0IHRoZSBKREJDIGRyaXZlciBzdXBwb3J0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCB3cml0aW5nLiBFY2xpcHNlTGluaydzIGludGVybmFsIGJhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmcgaXMgZGlzYWJsZWQuIFNldHRpbmcgdGhpcyB0YWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBmYWxzZSBpbmRpY2F0ZXMgdG8gRWNsaXBzZUxpbmsgdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRCQyBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBiYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nLiBUaGlzIHdpbGwgcmV2ZXJ0IHRvIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW91ciB3aGljaCBpcyB0byBkZWxlZ2F0ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluaydzIGludGVybmFsIGJhdGNoIHdyaXRpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXgtYmF0Y2gtd3JpdGluZy1zaXplIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjMyMDAwIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3cgZm9yIHRoZSBtYXggYmF0Y2ggd3JpdGluZyBzaXplIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNldC4gVGhpcyBhbGxvd3MgZm9yIHRoZSBiYXRjaCBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGxpbWl0ZWQgYXMgbW9zdCBkYXRhYmFzZSBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdCBsaW1pdHMuIFRoZSBzaXplIGlzIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMsIHRoZSBkZWZhdWx0IGlzIDMyMDAwIGJ1dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBkYXRhYmFzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmF0aXZlLXNxbCIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSBzcGVjaWZpYyBzcWwgZ3JhbW1hciBub3QgSkRCQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYy4gVGhpcyBpcyBiZWNhdXNlIHVuZm9ydHVuYXRlbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29tZSBicmlkZ2VzIHRvIG5vdCBzdXBwb3J0IHRoZSBmdWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpEQkMgc3RhbmRhcmQuIEJ5IGRlZmF1bHQgRWNsaXBzZUxpbmsgdXNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgSkRCQyBzcWwgZ3JhbW1hci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXJzIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpncm91cCByZWY9InN0cnVjdC1jb252ZXJ0ZXJzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWhlYWx0aC12YWxpZGF0ZWQtb24tZXJyb3IiIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0cnVlIHdpbGwgY2F1c2UgRWNsaXBzZUxpbmsgdG8gcGluZyBkYXRhYmFzZSB0byBkZXRlcm1pbmUgaWYgYW4gU1FMRXhjZXB0aW9uIHdhcyBjYXVzZSBieSBhIGNvbW11bmljYXRpb24gZmFpbHVyZTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnktcmV0cnktYXR0ZW1wdC1jb3VudCIgdHlwZT0ieHNkOmludGVnZXIiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIGF0dGVtcHRzIEVjbGlwc2VMaW5rIHdpbGwgbWFrZSBpZiBFY2xpcHNlTGluayBpcyBhdHRlbXB0aW5nIHRvIHJldHJ5IGEgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJkZWxheS1iZXR3ZWVuLXJlY29ubmVjdC1hdHRlbXB0cyIgdHlwZT0ieHNkOmludGVnZXIiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0aGUgdGltZSBpbiBtaWxpc2Vjb25kcyB0aGF0IEVjbGlwc2VMaW5rIHdpbGwgd2FpdCBiZXR3ZWVuIGF0dGVtcHRzIHRvIHJlY29ubmVjdCBpZiBFY2xpcHNlTGluayBpcyBhdHRlbXB0aW5nIHRvIHJldHJ5IGEgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5nLXNxbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3ZlcnJpZGUgdGhlIHBsYXRmb3JtIHNwZWNpZmljIFNRTCB0aGF0IEVjbGlwc2VMaW5rIHdpbGwgaXNzdWUgdG8gYSBjb25uZWN0aW9uIHRvIGRldGVybWluZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBsaXZlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9va3VwLWVudW0iPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29tcG9zaXRlLW5hbWUiIC8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3VuZC1uYW1lIiAvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiBhbmQgZGF0YXNvdXJjZQotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGNvbm5lY3QgdGhyb3VnaCBFSVMsCi0gICAgICAgICAgICAgICAgLSBQcm92aWRlIGEgSk5ESSBuYW1lIHRvIHRoZSBDb25uZWN0aW9uRmFjdG9yeSBhbmQgdXNlCi0gICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgZ2V0Q29ubmVjdGlvbiAtIFByb3ZpZGUgYSBKTkRJIG5hbWUgdG8gdGhlCi0gICAgICAgICAgICAgICAgQ29ubmVjdGlvbkZhY3RvcnksIGFuZCBhIGRyaXZlciBzcGVjaWZpYyBDb25uZWN0aW9uU3BlYwotICAgICAgICAgICAgICAgIHRvIHBhc3MgdG8gdGhlIGdldENvbm5lY3Rpb24gLSBDb25uZWN0IGluIGEgbm9uLW1hbmFnZWQKLSAgICAgICAgICAgICAgICB3YXkgZGlyZWN0bHkgdG8gdGhlIGRyaXZlciBzcGVjaWZpYyBDb25uZWN0aW9uRmFjdG9yeSBBbgotICAgICAgICAgICAgICAgIEVJU0Nvbm5lY3Rpb25TcGVjIG11c3QgYmUgcHJvdmlkZWQgdG8gZGVmaW5lIGhvdyB0bwotICAgICAgICAgICAgICAgIGNvbm5lY3QgdG8gdGhlIEVJUyBhZGFwdGVyLiBUaGUgRUlTIHBsYXRmb3JtIGNhbiBiZSB1c2VkCi0gICAgICAgICAgICAgICAgdG8gcHJvdmlkZSBkYXRhc291cmNlL2RyaXZlciBzcGVjaWZpYyBiZWhhdm9pciBzdWNoIGFzCi0gICAgICAgICAgICAgICAgSW50ZXJhY3Rpb25TcGVjIGFuZCBSZWNvcmQgY29udmVyc2lvbi4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2dpbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tc3BlYy1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tZmFjdG9yeS11cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgbG9naW4gYW5kIHBsYXRmb3JtIHR5cGUgdG8gYmUgdXNlZAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZ2luIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbm5lY3Rpb24tcG9vbCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBVc2VkIHRvIHNwZWNpZnkgaG93IGNvbm5lY3Rpb25zIHNob3VsZCBiZSBwb29sZWQgaW4gYQotICAgICAgICAgICAgICAgIHNlcnZlciBzZXNzaW9uLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1heC1jb25uZWN0aW9ucyIgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtYXggbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBpbiB0aGUgcG9vbAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbi1jb25uZWN0aW9ucyIgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtaW4gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgd2lsbCBhd2F5cyBiZQotICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dpbiIgdHlwZT0ibG9naW4iIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLWNvbm5lY3Rpb24tcG9vbCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGUgcmVhZCBjb25uZWN0aW9uIHBvb2wgaXMgdXNlZCBmb3IgcmVhZCBhY2Nlc3MgdGhyb3VnaAotICAgICAgICAgICAgICAgIHRoZSBzZXJ2ZXIgc2Vzc2lvbi4gQW55IG9mIHRoZSBjb25uZWN0aW9uIHBvb2xzIGNhbiBiZQotICAgICAgICAgICAgICAgIHVzZWQgZm9yIHRoZSByZWFkIHBvb2wgaG93ZXZlciB0aGlzIGlzIHRoZSBkZWZhdWx0LiBUaGlzCi0gICAgICAgICAgICAgICAgcG9vbCBhbGxvd3MgZm9yIGNvbmN1cnJlbnQgcmVhZHMgYWdhaW5zdCB0aGUgc2FtZSBKREJDCi0gICAgICAgICAgICAgICAgY29ubmVjdGlvbiBhbmQgcmVxdWlyZXMgdGhhdCB0aGUgSkRCQyBjb25uZWN0aW9uIHN1cHBvcnQKLSAgICAgICAgICAgICAgICBjb25jdXJyZW50IHJlYWQgYWNjZXNzLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbm5lY3Rpb24tcG9vbCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1c2l2ZSIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMgZnJvbSB0aGUgcmVhZCBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2wgYXJlIGV4Y2x1c2l2ZSBvciBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgY29tbW9uIGxvZ2dpbmcgb3B0aW9ucwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImphdmEtbG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG9wdGlvbnMgb2YgdGhlIEphdmEgbG9nCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9nIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nZ2luZy1vcHRpb25zIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibG9nZ2luZy1vcHRpb25zIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWNsaXBzZWxpbmstbG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG9wdGlvbnMgb2YgdGhlIEVjbGlwc2VMaW5rIGxvZwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZy1sZXZlbCIgZGVmYXVsdD0iaW5mbyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBsb2cgbGV2ZWwgZm9yIGxvZ2dpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvZmYiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNldmVyZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id2FybmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW5mbyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29uZmlnIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5lIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5lciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluZXN0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbGwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgb2YgdGhlIGZpbGUgdG8gd3JpdGUgdGhlIGxvZ2dpbmcgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2dpbmctb3B0aW9ucyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImxvZ2dpbmctb3B0aW9ucyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZlci1sb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgb3B0aW9ucyBvZiB0aGUgU2VydmVyIGxvZwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZyIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2dnaW5nLW9wdGlvbnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZy1leGNlcHRpb24tc3RhY2t0cmFjZSIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgZXhjZXB0aW9uIHN0YWNrdHJhY2UuIFdpdGhvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZWxlbWVudCwgdGhlIHN0YWNrdHJhY2UgaXMgbG9nZ2VkIGZvciBGSU5FUgotICAgICAgICAgICAgICAgICAgICAgICAgb3IgbGVzcyAoRklORVNUKQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LXRocmVhZCIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgdGhyZWFkLiBXaXRob3V0IHRoaXMgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0aHJlYWQgaXMgbG9nZ2VkIGZvciBGSU5FIG9yIGxlc3MgKEZJTkVSIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICBGSU5FU1QpCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtc2Vzc2lvbiIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBzZXNzaW9uLiBXaXRob3V0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsIHRoZSBzZXNzaW9uIGlzIGFsd2F5cyBwcmludGVkCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtY29ubmVjdGlvbiIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBjb25uZWN0aW9uLiBXaXRob3V0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsIHRoZSBjb25uZWN0aW9uIGlzIGFsd2F5cyBwcmludGVkCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtZGF0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBkYXRlLiBXaXRob3V0IHRoaXMgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkYXRlIGlzIGFsd2F5cyBwcmludGVkCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIHRyYW5zcG9ydCBtZWNoYW5pc20gb2YgdGhlIFJDTS4KLSAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB0cmFuc3BvcnQgbWVjaGFuaXNtIGlzIFJNSQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbi1jb25uZWN0aW9uLWVycm9yIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9IkRpc2NhcmRDb25uZWN0aW9uIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGFuZCBoYXMgdmFsdWUgb2YgIkRpc2NhcmRDb25uZWN0aW9uIiBvcgotICAgICAgICAgICAgICAgICAgICAgICAgIktlZXBDb25uZWN0aW9uIi4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIHRvIGEgUkNNIHNlcnZpY2Ugc2hvdWxkIGJlIGRyb3BwZWQgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGEgY29tbXVuaWNhdGlvbiBlcnJvciB3aXRoIHRoYXQgUkNNCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBlbGVtZW50IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAiRGlzY2FyZENvbm5lY3Rpb24iLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2VlcENvbm5lY3Rpb24iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjYXJkQ29ubmVjdGlvbiIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm1pLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZWZpbmVzIHRoZSBSTUkgdHJhbnNwb3J0IG1lY2hhbmlzbS4gVGhlCi0gICAgICAgICAgICAgICAgZGVmYXVsdCBuYW1pbmcgc2VydmljZSBpcyBKTkRJCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZW5kLW1vZGUiIGRlZmF1bHQ9IkFzeW5jaHJvbm91cyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybWkgZWxlbWVudCBhbmQgaGFzIHZhbHVlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3luY2hyb25vdXMiIG9yICJTeW5jaHJvbm91cyIuIEl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluZXMgd2hldGhlciB0aGUgUkNNIHByb3BhZ2F0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBhbmQgZG9lcyBub3Qgd2FpdCBmb3IgY29tbWFuZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2ggaXRzIGV4ZWN1dGlvbiBpbiBhc3luY2hyb25vdXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSBvciB3YWl0IGZvciBjb21tYW5kIHRvIGZpbmlzaCBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uIGluIHN5bmNocm9ub3VzIG1vZGUuIFRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgZWxlbWVudCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXN5bmNocm9ub3VzIi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3luY2hyb25vdXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5bmNocm9ub3VzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NvdmVyeSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtaSBlbGVtZW50LiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvdmVyeSBzZXR0aW5ncyBzaG91bGQgYmUgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGEgZGVmYXVsdCBEaXNjb3Zlcnkgd2l0aCBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBzZXR0aW5ncyBpcyBjcmVhdGVkIHdoZW4gdGhlIHJtaQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGlzIHNwZWNpZmllZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJtdWx0aWNhc3QtZ3JvdXAtYWRkcmVzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IjIyNi4xMC4xMi42NCIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXVsdGljYXN0LXBvcnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMzEyMSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYW5ub3VuY2VtZW50LWRlbGF5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjEwMDAiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiBkaXNjb3ZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVuZW50LiBJdCBkZXRlcm1pbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhlIG11bHRpY2FzdCBncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIHNob3VsZCBiZSBjaGFuZ2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgaXMgIjEwMDAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWNrZXQtdGltZS10by1saXZlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiBkaXNjb3ZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVuZW50LiBJdCBkZXRlcm1pbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhlIHRpbWUtdG8tbGl2ZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGFja2V0cyB0aGF0IGFyZSBzZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIERpc2NvdmVyeSdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHN0aWNhc3Qgc29ja2V0IHNob3VsZCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkLiBUaGUgZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGlzIGVsZW1lbnQgaXMgIjIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqbmRpLW5hbWluZy1zZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImpuZGktbmFtaW5nLXNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJybWktcmVnaXN0cnktbmFtaW5nLXNlcnZpY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHJtaSBlbGVtZW5lbnQuIEl0IGRldGVybWluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgUk1JIHJlZ2lzdHJ5IHNob3VsZCBiZSB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbmFtaW5nIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm1pLWlpb3AtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBSTUktSUlPUCB0cmFuc3BvcnQgbWVjaGFuaXNtIG9mCi0gICAgICAgICAgICAgICAgdGhlIFJDTS4gVGhlIGRlZmF1bHQgbmFtaW5nIHNlcnZpY2UgaXMgSk5ESQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJtaS10cmFuc3BvcnQiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam1zLXRvcGljLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgSk1TIHRvcGljIHRyYW5zcG9ydCBtZWNoYW5pc20KLSAgICAgICAgICAgICAgICBvZiB0aGUgUkNNCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1ob3N0LXVybCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLWNvbm5lY3Rpb24tZmFjdG9yeS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iam1zL0VjbGlwc2VMaW5rVG9waWNDb25uZWN0aW9uRmFjdG9yeSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJqbXMvRWNsaXBzZUxpbmtUb3BpYyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam5kaS1uYW1pbmctc2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImpuZGktbmFtaW5nLXNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai1qZ3JvdXBzLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgT0M0SiBKR3JvdXBzIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgIG1lY2hhbmlzbSBvZiB0aGUgUkNNCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2Utc2luZ2xlLXRocmVhZGVkLW5vdGlmaWNhdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdW4tY29yYmEtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBTdW4gQ09SQkEgdHJhbnNwb3J0IG1lY2hhbmlzbQotICAgICAgICAgICAgICAgIG9mIHRoZSBSQ00KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1c2VyLWRlZmluZWQtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRldGVybWluZXMgd2hldGhlciBhIHVzZXIgaW1wbGVtZW50ZWQKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnQgbWVjaGFuaXNtIHRoYXQgc2hvdWxkIGJlIHVzZWQuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnQtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpuZGktbmFtaW5nLXNlcnZpY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmRpLW5hbWluZy1zZXJ2aWNlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBVUkwgZm9yIG5hbWluZyBzZXJ2aWNlIHNob3VsZCBiZSBjaGFuZ2VkLiAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VyLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iYWRtaW4iIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmludGVybmFsLnNlY3VyaXR5LkpDRUVuY3J5cHRvciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0icGFzc3dvcmQiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDwhLS0gIFRPRE86IE5lZWQgdG8gaGF2ZSBhIG5vbiBPcmFjbGUtQVMgZGVmYXVsdCBvciByb3V0ZSB0aHJvdWdoIHNlcnZlciBwbGF0Zm9ybSBieSBkZWZhdWx0IC0tPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXRpYWwtY29udGV4dC1mYWN0b3J5LW5hbWUiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJjb20uZXZlcm1pbmQuc2VydmVyLnJtaS5STUlJbml0aWFsQ29udGV4dEZhY3RvcnkiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmRpLW5hbWluZy1zZXJ2aWNlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsIGNvbnRleHQgZmFjdG9yeSBjbGFzcyBmb3IgbmFtaW5nIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjaGFuZ2VkLiAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmRpLW5hbWluZy1zZXJ2aWNlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWluZyBzZXJ2aWNlIHJlcXVpcmVzIGV4dHJhIHByb3BlcnR5IHRoYXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBkZWZpbmVkIGJ5IEVjbGlwc2VMaW5rIGJ1dCBpdCBpcyByZXF1aXJlZCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgYXBwbGljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmdyb3VwIG5hbWU9ImV2ZW50LWxpc3RlbmVyLWNsYXNzZXMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV2ZW50LWxpc3RlbmVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmdyb3VwPgotICAgIDx4c2Q6Z3JvdXAgbmFtZT0ic3RydWN0LWNvbnZlcnRlcnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Z3JvdXA+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2UgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmVhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9IjUwIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2UgcHJlYWxsb2NhdGlvbiBzaXplLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgUmVmZXJlbmNlcyBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwgb3ZlcnJpZGluZyBpdHMgbmFtZQotICAgICAgICAgICAgICAgIGFuZCAob3B0aW9uYWxseSkgcHJlYWxsb2NhdGlvbiBzaXplLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUbyB1c2UgcHJlYWxsb2NhdGlvbiBzaXplIG9mIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LAotICAgICAgICAgICAgICAgIHNldCBwcmVhbGxvY2F0aW9uIHNpemUgdG8gMAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hdGl2ZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEYXRhYmFzZSBzZXF1ZW5jZSBtZWNoYW5pc20gdXNlZC4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UYWJsZSBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRVUVOQ0UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZS1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUV9OQU1FIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFfQ09VTlQiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuYXJ5LXRhYmxlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFVuYXJ5IHRhYmxlIHNlcXVlbmNlIC0gc2VxdWVuY2UgbmFtZSBpcyBhIHRhYmxlIG5hbWUsCi0gICAgICAgICAgICAgICAgdGFibGUgaGFzIGEgc2luZ2xlIGZpZWxkIGFuZCBhIHNpbmdsZSByb3cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFVRU5DRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sZmlsZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5YbWxmaWxlIHNlcXVlbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sIHNlcXVlbmNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9vdC1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRVUVOQ0UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZS1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRX05BTUUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY291bnRlci1lbGVtZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iU0VRX0NPVU5UIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19zZXNzaW9uc18xLjEueHNkIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfc2Vzc2lvbnNfMS4xLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg3MmExNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19zZXNzaW9uc18xLjEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTU4NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIENvcHlyaWdodCAoYykgMTk5OCwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotCi0gQ29udHJpYnV0b3JzOgotICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gZnJvbSBPcmFjbGUgVG9wTGluawotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAKLS0tPgotPCEtLSAKLQotWE1MIFNjaGVtYSBkZWZpbml0aW9uIGZvciB0aGUgRWNsaXBzZSBQZXJzaXN0ZW5jZSBTZXJ2aWNlcyBQcm9qZWN0IFNlc3Npb24gQ29uZmlndXJhdGlvbiBmaWxlLiBJbnN0YW5jZXMKLW9mIHRoaXMgZmlsZSBhcmUgdHlwaWNhbGx5IGxvY2F0ZWQgYXM6ICdNRVRBLUlORi9zZXNzaW9ucy54bWwnCi0KLSAtLT4KLQotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdmVyc2lvbj0iMS4xIj4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbnMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgcm9vdCBlbGVtZW50IGFuZCBleGlzdHMgb25seSBmb3IgWE1MCi0gICAgICAgICAgICAgICAgc3RydWN0dXJlCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbiIgdHlwZT0ic2Vzc2lvbiIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBub2RlIGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgYSBwYXJ0aWN1bGFyIHNlc3Npb24KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljIGVsZW1lbnQgdXNlZCB0byBkZXNjcmliZSBhIHN0cmluZyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRzIHRoZSBuYW1lIG9mIGFuIGl0ZW0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2ZXItcGxhdGZvcm0iIHR5cGU9InNlcnZlci1wbGF0Zm9ybSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUtY29tbWFuZCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gZWxlbWVudCB0aGF0IGRlZmluZSB0aGUgUmVtb3RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZCBNb2R1bGUgdGhhdCBjYW4gYWxzbyBiZSB1c2VkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlIHN5bmNocm9uaXphdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5uZWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIGRlZmF1bHQ9IkVjbGlwc2VMaW5rQ29tbWFuZENoYW5uZWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHJlbW90ZS1jb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbW1hbmRzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiByZW1vdGUtY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRldGVybWluZSB3aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBmZWF0dXJlcywgdGhlIFJDTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtc3luYyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgZWxlbWVudC4gSXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJucyBvbiBjYWNoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXphdGlvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93IHNlbmRpbmcgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nIGNhY2hlIHN5bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zcG9ydCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idHJhbnNwb3J0LW1hbmFnZXIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHJlbW90ZS1jb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGVmaW5lcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgbWVjaGFuaXNtIG9mIHRoZSBSQ00uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHJhbnNwb3J0IG1lY2hhbmlzbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIFJNSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZlbnQtbGlzdGVuZXItY2xhc3NlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iZXZlbnQtbGlzdGVuZXItY2xhc3NlcyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvZmlsZXIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgcmVwcmVzZW50cyBpZiB0aGUgcHJvZmlsZXIgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBieSB0aGUgc2Vzc2lvbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZG1zIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZWNsaXBzZWxpbmsiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2VwdGlvbi1oYW5kbGVyLWNsYXNzIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBjbGFzcyB0aGF0IHRoZSBzZXNzaW9uIHdpbGwgdXNlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgZXhjZXB0aW9ucyBnZW5lcmF0ZWQgZnJvbSB3aXRoaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nZ2luZyIgdHlwZT0ibG9nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9nZ2luZyBvcHRpb25zCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi1jdXN0b21pemVyLWNsYXNzIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBzZXNzaW9uIGN1c3RvbWl6ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIHRvIHJ1biBvbiBhIGxvYWRlZCBzZXNzaW9uLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZlci1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBub2RlIGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd2hpY2ggc2VydmVyCi0gICAgICAgICAgICAgICAgcGxhdGZvcm0gdG8gdXNlLCBKVEEgc2V0dGluZ3MgYW5kIHJ1bnRpbWUgc2VydmljZXMKLSAgICAgICAgICAgICAgICBzZXR0aW5ncwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmFibGUtcnVudGltZS1zZXJ2aWNlcyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50LiBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIEpNWCBNQmVhbiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGluZyBydW50aW1lIHNlcnZpY2VzIGlzIGRlcGxveWVkLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuYWJsZS1qdGEiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudC4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgc2Vzc2lvbiB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ3JhdGUgd2l0aCB0aGUgSlRBIChpLmUuIHdoZXRoZXIgdGhlIHNlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYSB0cmFuc2FjdGlvbiBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcy4gVGhlIGNob2ljZSBvZiBzZXJ2ZXItY2xhc3Mgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBiZSBjaG9zZW4gYmFzZWQgb24gdGhlIHRyYW5zYWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9tLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLnNlcnZlci5DdXN0b21TZXJ2ZXJQbGF0Zm9ybSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBzdWJjbGFzcyBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5zZXJ2ZXIuUGxhdGZvcm1CYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNwZWNpZnkgd2hpY2ggc2VydmVyIHBsYXRmb3JtIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImV4dGVybmFsLXRyYW5zYWN0aW9uLWNvbnRyb2xsZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai05MDMtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotOTA0LXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTEwMTItcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotMTAxMy1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai0xMTExLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTYxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy03MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtODEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTktcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTEwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNDAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS01MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTUxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNjAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS02MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamJvc3MtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24tYnJva2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFByb3ZpZGVzIGEgc2luZ2xlIHZpZXcgdG8gYSBzZXNzaW9uIHRoYXQKLSAgICAgICAgICAgICAgICB0cmFuc3BhcmVudGx5IGFjY2Vzc2VzIG11bHRwbGUgZGF0YWJhc2VzLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlc3Npb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwcm9qZWN0Ij4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhtbCI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0icHJvamVjdCIgLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjbGFzcyI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0icHJvamVjdCIgLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2Utc2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGUgc2Vzc2lvbiBpcyB0aGUgcHJpbWFyeSBpbnRlcmZhY2UgaW50byBFY2xpcHNlTGluaywgdGhlCi0gICAgICAgICAgICAgICAgYXBwbGljYXRpb24gc2hvdWxkIGRvIGFsbCBvZiBpdHMgcmVhZGluZyBhbmQgd3JpdGluZyBvZgotICAgICAgICAgICAgICAgIG9iamVjdHMgdGhyb3VnaCB0aGUgc2Vzc2lvbi4gVGhlIHNlc3Npb24gYWxzbyBtYW5hZ2VzCi0gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zIGFuZCB1bml0cyBvZiB3b3JrLiBUaGUgZGF0YWJhc2Ugc2Vzc2lvbiBpcwotICAgICAgICAgICAgICAgIGludGVuZGVkIGZvciB1c2FnZSBpbiB0d28tdGllciBjbGllbnQtc2VydmVyCi0gICAgICAgICAgICAgICAgYXBwbGljYXRpb25zLiBBbHRob3VnaCBpdCBjb3VsZCBiZSB1c2VkIGluIGEgc2VydmVyCi0gICAgICAgICAgICAgICAgc2l0dWF0aW9uLCBpdCBpcyBsaW1pdHRlZCB0byBvbmx5IGhhdmluZyBhIHNpbmdsZQotICAgICAgICAgICAgICAgIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIG9ubHkgYWxsb3dzIGEgc2luZ2xlIG9wZW4KLSAgICAgICAgICAgICAgICBkYXRhYmFzZSB0cmFuc2FjdGlvbi4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXNzaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1wcm9qZWN0IiB0eXBlPSJwcm9qZWN0IgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcHJvamVjdCAoY2xhc3Mgb3IgeG1sKSB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZCBhcyB0aGUgcHJpbWFyeSBwcm9qZWN0IGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkZGl0aW9uYWwtcHJvamVjdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InByb2plY3QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbCBwcm9qZWN0cyB3aWxsIGhhdmUgdGhlaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMgYXBwZW5kZWQgdG8gdGhlIHByaW1hcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2luIiB0eXBlPSJsb2dpbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2ZXItc2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBJcyBhbiBleHRlbnNpb24gb2YgYSBEYXRhYmFzZVNlc3Npb24KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1zZXNzaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1wb29scyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uIHBvb2xzIGFyZSBvbmx5IGZvciB1c2FnZSB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsIGNvbm5lY3Rpb24gcG9vbGluZyBhbmQgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBiZSB1c2VkIGlmIHVzaW5nIGV4dGVybmFsIGNvbm5lY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhZC1jb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJyZWFkLWNvbm5lY3Rpb24tcG9vbCIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IndyaXRlLWNvbm5lY3Rpb24tcG9vbCIgdHlwZT0iY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InNlcXVlbmNlLWNvbm5lY3Rpb24tcG9vbCIgdHlwZT0iY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGlzIHRhZyB0byB1c2UgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlIGNvbm5lY3Rpb24gcG9vbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iY29ubmVjdGlvbi1wb29sIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvbGljeSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImNvbm5lY3Rpb24tcG9saWN5IiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29ubmVjdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVXNlZCB0byBzcGVjaWZ5IGhvdyBkZWZhdWx0IGNsaWVudCBzZXNzaW9ucyBhcmUgYWNxdWlyZWQKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVzaXZlLWNvbm5lY3Rpb24iIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGlmIGFuIGV4Y2x1c2l2ZSBjb25uZWN0aW9uIHNob3VsZCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBmb3IgcmVhZHMsIHJlcXVpcmVkIGZvciBWUEQsIG9yIHVzZXIgYmFzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgc2VjdXJpdHkuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGF6eSIgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBpZiBhIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGFjcXVpcmVkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgaGVsZCB1cGZyb250IGluIHRoZSBjbGllbnQgc2Vzc2lvbiwgb3Igb25seQotICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgd2hlbiBuZWVkZWQgYW5kIHRoZW4gcmVsZWFzZWQuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyBjb21tb24gZmllbGRzIGZvciBkYXRhYmFzZS1sb2dpbiBhbmQgZWlzLWxvZ2luCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBsYXRmb3JtLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgcGxhdGZvcm0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VyLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBsb2dpbiBhcyB3ZWxsIGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgU3luY2hyb25pemF0aW9uIGZlYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmludGVybmFsLnNlY3VyaXR5LkpDRUVuY3J5cHRvciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGxvZ2luIGFzIHdlbGwgYXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZSBTeW5jaHJvbml6YXRpb24gZmVhdHVyZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgbG9naW4gYXMgd2VsbCBhcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlIFN5bmNocm9uaXphdGlvbiBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtcXVhbGlmaWVyIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIGRlZmF1bHQgcXVhbGlmaWVyIGZvciBhbGwgdGFibGVzLiBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgdGhlIGNyZWF0b3Igb2YgdGhlIHRhYmxlIG9yIGRhdGFiYXNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0YWJsZSBleGlzdHMgb24uIFRoaXMgaXMgcmVxdWlyZWQgYnkgc29tZQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VzIHN1Y2ggYXMgT3JhY2xlIGFuZCBEQjIuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZXJuYWwtY29ubmVjdGlvbi1wb29saW5nIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0byB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIHNob3VsZCB1c2UgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIGNvbm5lY3Rpb24gcG9vbAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVybmFsLXRyYW5zYWN0aW9uLWNvbnRyb2xsZXIiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSBpZiB0aGUgc2Vzc2lvbiB3aWxsIGJlIHVzaW5nIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCB0cmFuc2FjdGlvbiBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2luZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNpbmcgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ic2VxdWVuY2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHNlcXVlbmNlLiBUaGUgbmFtZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwuIElmIG5vIG5hbWUgcHJvdmlkZWQgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5IHN0cmluZyB3aWxsIGJlIHVzZWQgYXMgYSBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbiBkZWZhdWx0IHNlcXVlbmNlcy4gTWFrZSBzdXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHNlcXVlbmNlIGhhcyB1bmlxdWUgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ic2VxdWVuY2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgYSBsb2dpbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIEl0IGlzIHVzZWQgdG8gZGVmaW5lIGV4dHJhIHByb3BlcnRpZXMgb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dpbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2UtbG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgSG9sZHMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIGNvbm5lY3QKLSAgICAgICAgICAgICAgICB0byBhIEpEQkMgZHJpdmVyLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZ2luIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZHJpdmVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkcml2ZXIgY2xhc3MgaXMgdGhlIEphdmEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBmb3IgdGhlIEpEQkMgZHJpdmVyIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCAoZS5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bi5qZGJjLm9kYmMuSmRiY09kYmNEcml2ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tdXJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIFVSTCB0aGF0IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YXNvdXJjZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBVUkwgb2YgYSBkYXRhc291cmNlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSB1c2VkIGJ5IHRoZSBzZXNzaW9uIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxvb2t1cCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibG9va3VwLWVudW0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiaW5kLWFsbC1wYXJhbWV0ZXJzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBiaW5kIGFsbCBhcmd1bWVudHMgdG8gYW55Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNRTCBzdGF0ZW1lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZS1hbGwtc3RhdGVtZW50cyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHByZXBhcmVkIHN0YXRlbWVudHMgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNhY2hlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJ5dGUtYXJyYXktYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBiaW5kaW5nIGZvciBsYXJnZSBiaW5hcnkgZGF0YS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCBFY2xpcHNlTGluayB3aWxsIHByaW50IHRoaXMgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBoZXggdGhyb3VnaCB0aGUgSkRCQyBiaW5hcnkgZXhjYXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXVzZS4gQm90aCBiaW5kaW5nIGFuZCBwcmludGluZyBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlvdXMgbGltaXRzIG9uIGFsbCBkYXRhYmFzZXMgKGUuZy4gNWsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAzMmspLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RyaW5nLWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSBpZiBzdHJpbmdzIHNob3VsZCBiZSBib3VuZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlZCB0byBoZWxwIGJlYW4gaW50cm9zcGVjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cmVhbXMtZm9yLWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2Ugc3RyZWFtcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdG9yZSBsYXJnZSBiaW5hcnkgZGF0YS4gVGhpcyBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZSB0aGUgbWF4IHNpemUgZm9yIHJlYWRpbmcvd3JpdGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBzb21lIEpEQkMgZHJpdmVycy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcmNlLWZpZWxkLW5hbWVzLXRvLXVwcGVyLWNhc2UiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHNldHRpbmcgY2FuIGJlIHVzZWQgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGV4cGVjdHMgdXBwZXIgY2FzZSBidXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlIGRvZXMgbm90IHJldHVybiBjb25zaXN0ZW50IGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gZGlmZmVyZW50IGRhdGFiYXNlcykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWl6ZS1kYXRhLWNvbnZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIGRyaXZlciBsZXZlbCBkYXRhIGNvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uIGlzIGVuYWJsZWQuIFRoaXMgY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkIGFzIHNvbWUgZHJpdmVycyBwZXJmb3JtIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiB0aGVtc2VsdmVzIGluY29ycmVjdGx5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJpbS1zdHJpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IENIQVIgZmllbGQgdmFsdWVzIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmcgYmxhbmtzIHRyaW1tZWQsIHRoaXMgY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC13cml0aW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGJhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmcuIFRoaXMgZmFjaWxpdHkgYWxsb3dzIG11bHRpcGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIG9wZXJhdGlvbnMgdG8gYmUgc3VibWl0dGVkIHRvIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2UgZm9yIHByb2Nlc3NpbmcgYXQgb25jZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VibWl0dGluZyBtdWx0aXBsZSB1cGRhdGVzIHRvZ2V0aGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIGluZGl2aWR1YWxseSwgY2FuIGdyZWF0bHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZSBwZXJmb3JtYW5jZSBpbiBzb21lIHNpdHVhdGlvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqZGJjLWJhdGNoLXdyaXRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmcgdGhpcyB0YWcgd2l0aCB0cnVlIGluZGljYXRlcyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayB0aGF0IHRoZSBKREJDIGRyaXZlciBzdXBwb3J0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCB3cml0aW5nLiBFY2xpcHNlTGluaydzIGludGVybmFsIGJhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmcgaXMgZGlzYWJsZWQuIFNldHRpbmcgdGhpcyB0YWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBmYWxzZSBpbmRpY2F0ZXMgdG8gRWNsaXBzZUxpbmsgdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRCQyBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBiYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nLiBUaGlzIHdpbGwgcmV2ZXJ0IHRvIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW91ciB3aGljaCBpcyB0byBkZWxlZ2F0ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluaydzIGludGVybmFsIGJhdGNoIHdyaXRpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXgtYmF0Y2gtd3JpdGluZy1zaXplIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjMyMDAwIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3cgZm9yIHRoZSBtYXggYmF0Y2ggd3JpdGluZyBzaXplIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNldC4gVGhpcyBhbGxvd3MgZm9yIHRoZSBiYXRjaCBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGxpbWl0ZWQgYXMgbW9zdCBkYXRhYmFzZSBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdCBsaW1pdHMuIFRoZSBzaXplIGlzIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMsIHRoZSBkZWZhdWx0IGlzIDMyMDAwIGJ1dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBkYXRhYmFzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmF0aXZlLXNxbCIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSBzcGVjaWZpYyBzcWwgZ3JhbW1hciBub3QgSkRCQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYy4gVGhpcyBpcyBiZWNhdXNlIHVuZm9ydHVuYXRlbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29tZSBicmlkZ2VzIHRvIG5vdCBzdXBwb3J0IHRoZSBmdWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpEQkMgc3RhbmRhcmQuIEJ5IGRlZmF1bHQgRWNsaXBzZUxpbmsgdXNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgSkRCQyBzcWwgZ3JhbW1hci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXJzIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpncm91cCByZWY9InN0cnVjdC1jb252ZXJ0ZXJzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWhlYWx0aC12YWxpZGF0ZWQtb24tZXJyb3IiIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0cnVlIHdpbGwgY2F1c2UgRWNsaXBzZUxpbmsgdG8gcGluZyBkYXRhYmFzZSB0byBkZXRlcm1pbmUgaWYgYW4gU1FMRXhjZXB0aW9uIHdhcyBjYXVzZSBieSBhIGNvbW11bmljYXRpb24gZmFpbHVyZTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnktcmV0cnktYXR0ZW1wdC1jb3VudCIgdHlwZT0ieHNkOmludGVnZXIiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIGF0dGVtcHRzIEVjbGlwc2VMaW5rIHdpbGwgbWFrZSBpZiBFY2xpcHNlTGluayBpcyBhdHRlbXB0aW5nIHRvIHJldHJ5IGEgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJkZWxheS1iZXR3ZWVuLXJlY29ubmVjdC1hdHRlbXB0cyIgdHlwZT0ieHNkOmludGVnZXIiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0aGUgdGltZSBpbiBtaWxpc2Vjb25kcyB0aGF0IEVjbGlwc2VMaW5rIHdpbGwgd2FpdCBiZXR3ZWVuIGF0dGVtcHRzIHRvIHJlY29ubmVjdCBpZiBFY2xpcHNlTGluayBpcyBhdHRlbXB0aW5nIHRvIHJldHJ5IGEgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5nLXNxbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3ZlcnJpZGUgdGhlIHBsYXRmb3JtIHNwZWNpZmljIFNRTCB0aGF0IEVjbGlwc2VMaW5rIHdpbGwgaXNzdWUgdG8gYSBjb25uZWN0aW9uIHRvIGRldGVybWluZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBsaXZlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9va3VwLWVudW0iPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29tcG9zaXRlLW5hbWUiIC8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3VuZC1uYW1lIiAvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiBhbmQgZGF0YXNvdXJjZQotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGNvbm5lY3QgdGhyb3VnaCBFSVMsCi0gICAgICAgICAgICAgICAgLSBQcm92aWRlIGEgSk5ESSBuYW1lIHRvIHRoZSBDb25uZWN0aW9uRmFjdG9yeSBhbmQgdXNlCi0gICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgZ2V0Q29ubmVjdGlvbiAtIFByb3ZpZGUgYSBKTkRJIG5hbWUgdG8gdGhlCi0gICAgICAgICAgICAgICAgQ29ubmVjdGlvbkZhY3RvcnksIGFuZCBhIGRyaXZlciBzcGVjaWZpYyBDb25uZWN0aW9uU3BlYwotICAgICAgICAgICAgICAgIHRvIHBhc3MgdG8gdGhlIGdldENvbm5lY3Rpb24gLSBDb25uZWN0IGluIGEgbm9uLW1hbmFnZWQKLSAgICAgICAgICAgICAgICB3YXkgZGlyZWN0bHkgdG8gdGhlIGRyaXZlciBzcGVjaWZpYyBDb25uZWN0aW9uRmFjdG9yeSBBbgotICAgICAgICAgICAgICAgIEVJU0Nvbm5lY3Rpb25TcGVjIG11c3QgYmUgcHJvdmlkZWQgdG8gZGVmaW5lIGhvdyB0bwotICAgICAgICAgICAgICAgIGNvbm5lY3QgdG8gdGhlIEVJUyBhZGFwdGVyLiBUaGUgRUlTIHBsYXRmb3JtIGNhbiBiZSB1c2VkCi0gICAgICAgICAgICAgICAgdG8gcHJvdmlkZSBkYXRhc291cmNlL2RyaXZlciBzcGVjaWZpYyBiZWhhdm9pciBzdWNoIGFzCi0gICAgICAgICAgICAgICAgSW50ZXJhY3Rpb25TcGVjIGFuZCBSZWNvcmQgY29udmVyc2lvbi4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2dpbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tc3BlYy1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tZmFjdG9yeS11cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWxvZ2luIj4KLSAgICAJPHhzZDphbm5vdGF0aW9uPgotICAgIAkJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgIAkJCURlZmluZXMgbG9naW4gYW5kIHBsYXRmb3JtIHR5cGUgdG8gYmUgdXNlZAotICAgIAkJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAJPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAJPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZ2luIj4KLSAgICAJCQk8eHNkOnNlcXVlbmNlPgotICAgIAkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZXF1YWwtbmFtZXNwYWNlLXJlc29sdmVycyIKLSAgICAJCQkJCXR5cGU9InhzZDpib29sZWFuIiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCI+Ci0gICAgCQkJCTwveHNkOmVsZW1lbnQ+Ci0gICAgCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5IgotICAgIAkJCQkJbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiCi0gICAgCQkJCQl0eXBlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLQotICAgIAkJCQk8L3hzZDplbGVtZW50PgotICAgIAkJCTwveHNkOnNlcXVlbmNlPgotICAgIAkJPC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbm5lY3Rpb24tcG9vbCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBVc2VkIHRvIHNwZWNpZnkgaG93IGNvbm5lY3Rpb25zIHNob3VsZCBiZSBwb29sZWQgaW4gYQotICAgICAgICAgICAgICAgIHNlcnZlciBzZXNzaW9uLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1heC1jb25uZWN0aW9ucyIgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtYXggbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBpbiB0aGUgcG9vbAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbi1jb25uZWN0aW9ucyIgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtaW4gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgd2lsbCBhd2F5cyBiZQotICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dpbiIgdHlwZT0ibG9naW4iIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLWNvbm5lY3Rpb24tcG9vbCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGUgcmVhZCBjb25uZWN0aW9uIHBvb2wgaXMgdXNlZCBmb3IgcmVhZCBhY2Nlc3MgdGhyb3VnaAotICAgICAgICAgICAgICAgIHRoZSBzZXJ2ZXIgc2Vzc2lvbi4gQW55IG9mIHRoZSBjb25uZWN0aW9uIHBvb2xzIGNhbiBiZQotICAgICAgICAgICAgICAgIHVzZWQgZm9yIHRoZSByZWFkIHBvb2wgaG93ZXZlciB0aGlzIGlzIHRoZSBkZWZhdWx0LiBUaGlzCi0gICAgICAgICAgICAgICAgcG9vbCBhbGxvd3MgZm9yIGNvbmN1cnJlbnQgcmVhZHMgYWdhaW5zdCB0aGUgc2FtZSBKREJDCi0gICAgICAgICAgICAgICAgY29ubmVjdGlvbiBhbmQgcmVxdWlyZXMgdGhhdCB0aGUgSkRCQyBjb25uZWN0aW9uIHN1cHBvcnQKLSAgICAgICAgICAgICAgICBjb25jdXJyZW50IHJlYWQgYWNjZXNzLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbm5lY3Rpb24tcG9vbCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1c2l2ZSIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMgZnJvbSB0aGUgcmVhZCBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2wgYXJlIGV4Y2x1c2l2ZSBvciBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgY29tbW9uIGxvZ2dpbmcgb3B0aW9ucwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImphdmEtbG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG9wdGlvbnMgb2YgdGhlIEphdmEgbG9nCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9nIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nZ2luZy1vcHRpb25zIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibG9nZ2luZy1vcHRpb25zIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWNsaXBzZWxpbmstbG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG9wdGlvbnMgb2YgdGhlIEVjbGlwc2VMaW5rIGxvZwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZy1sZXZlbCIgZGVmYXVsdD0iaW5mbyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBsb2cgbGV2ZWwgZm9yIGxvZ2dpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvZmYiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNldmVyZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id2FybmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW5mbyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29uZmlnIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5lIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5lciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluZXN0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbGwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgb2YgdGhlIGZpbGUgdG8gd3JpdGUgdGhlIGxvZ2dpbmcgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2dpbmctb3B0aW9ucyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImxvZ2dpbmctb3B0aW9ucyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZlci1sb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgb3B0aW9ucyBvZiB0aGUgU2VydmVyIGxvZwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZyIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2dnaW5nLW9wdGlvbnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZy1leGNlcHRpb24tc3RhY2t0cmFjZSIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgZXhjZXB0aW9uIHN0YWNrdHJhY2UuIFdpdGhvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZWxlbWVudCwgdGhlIHN0YWNrdHJhY2UgaXMgbG9nZ2VkIGZvciBGSU5FUgotICAgICAgICAgICAgICAgICAgICAgICAgb3IgbGVzcyAoRklORVNUKQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LXRocmVhZCIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgdGhyZWFkLiBXaXRob3V0IHRoaXMgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0aHJlYWQgaXMgbG9nZ2VkIGZvciBGSU5FIG9yIGxlc3MgKEZJTkVSIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICBGSU5FU1QpCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtc2Vzc2lvbiIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBzZXNzaW9uLiBXaXRob3V0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsIHRoZSBzZXNzaW9uIGlzIGFsd2F5cyBwcmludGVkCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtY29ubmVjdGlvbiIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBjb25uZWN0aW9uLiBXaXRob3V0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsIHRoZSBjb25uZWN0aW9uIGlzIGFsd2F5cyBwcmludGVkCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtZGF0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBkYXRlLiBXaXRob3V0IHRoaXMgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkYXRlIGlzIGFsd2F5cyBwcmludGVkCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIHRyYW5zcG9ydCBtZWNoYW5pc20gb2YgdGhlIFJDTS4KLSAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB0cmFuc3BvcnQgbWVjaGFuaXNtIGlzIFJNSQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbi1jb25uZWN0aW9uLWVycm9yIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9IkRpc2NhcmRDb25uZWN0aW9uIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGFuZCBoYXMgdmFsdWUgb2YgIkRpc2NhcmRDb25uZWN0aW9uIiBvcgotICAgICAgICAgICAgICAgICAgICAgICAgIktlZXBDb25uZWN0aW9uIi4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIHRvIGEgUkNNIHNlcnZpY2Ugc2hvdWxkIGJlIGRyb3BwZWQgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGEgY29tbXVuaWNhdGlvbiBlcnJvciB3aXRoIHRoYXQgUkNNCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBlbGVtZW50IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAiRGlzY2FyZENvbm5lY3Rpb24iLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2VlcENvbm5lY3Rpb24iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjYXJkQ29ubmVjdGlvbiIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm1pLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZWZpbmVzIHRoZSBSTUkgdHJhbnNwb3J0IG1lY2hhbmlzbS4gVGhlCi0gICAgICAgICAgICAgICAgZGVmYXVsdCBuYW1pbmcgc2VydmljZSBpcyBKTkRJCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZW5kLW1vZGUiIGRlZmF1bHQ9IkFzeW5jaHJvbm91cyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybWkgZWxlbWVudCBhbmQgaGFzIHZhbHVlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3luY2hyb25vdXMiIG9yICJTeW5jaHJvbm91cyIuIEl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluZXMgd2hldGhlciB0aGUgUkNNIHByb3BhZ2F0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBhbmQgZG9lcyBub3Qgd2FpdCBmb3IgY29tbWFuZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2ggaXRzIGV4ZWN1dGlvbiBpbiBhc3luY2hyb25vdXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSBvciB3YWl0IGZvciBjb21tYW5kIHRvIGZpbmlzaCBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uIGluIHN5bmNocm9ub3VzIG1vZGUuIFRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgZWxlbWVudCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXN5bmNocm9ub3VzIi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3luY2hyb25vdXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5bmNocm9ub3VzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NvdmVyeSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtaSBlbGVtZW50LiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvdmVyeSBzZXR0aW5ncyBzaG91bGQgYmUgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGEgZGVmYXVsdCBEaXNjb3Zlcnkgd2l0aCBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBzZXR0aW5ncyBpcyBjcmVhdGVkIHdoZW4gdGhlIHJtaQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGlzIHNwZWNpZmllZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJtdWx0aWNhc3QtZ3JvdXAtYWRkcmVzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IjIyNi4xMC4xMi42NCIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXVsdGljYXN0LXBvcnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMzEyMSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYW5ub3VuY2VtZW50LWRlbGF5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjEwMDAiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiBkaXNjb3ZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVuZW50LiBJdCBkZXRlcm1pbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhlIG11bHRpY2FzdCBncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIHNob3VsZCBiZSBjaGFuZ2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgaXMgIjEwMDAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWNrZXQtdGltZS10by1saXZlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiBkaXNjb3ZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVuZW50LiBJdCBkZXRlcm1pbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhlIHRpbWUtdG8tbGl2ZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGFja2V0cyB0aGF0IGFyZSBzZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIERpc2NvdmVyeSdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHN0aWNhc3Qgc29ja2V0IHNob3VsZCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkLiBUaGUgZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGlzIGVsZW1lbnQgaXMgIjIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqbmRpLW5hbWluZy1zZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImpuZGktbmFtaW5nLXNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJybWktcmVnaXN0cnktbmFtaW5nLXNlcnZpY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHJtaSBlbGVtZW5lbnQuIEl0IGRldGVybWluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgUk1JIHJlZ2lzdHJ5IHNob3VsZCBiZSB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbmFtaW5nIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm1pLWlpb3AtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBSTUktSUlPUCB0cmFuc3BvcnQgbWVjaGFuaXNtIG9mCi0gICAgICAgICAgICAgICAgdGhlIFJDTS4gVGhlIGRlZmF1bHQgbmFtaW5nIHNlcnZpY2UgaXMgSk5ESQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJtaS10cmFuc3BvcnQiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam1zLXRvcGljLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgSk1TIHRvcGljIHRyYW5zcG9ydCBtZWNoYW5pc20KLSAgICAgICAgICAgICAgICBvZiB0aGUgUkNNCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1ob3N0LXVybCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLWNvbm5lY3Rpb24tZmFjdG9yeS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iam1zL0VjbGlwc2VMaW5rVG9waWNDb25uZWN0aW9uRmFjdG9yeSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJqbXMvRWNsaXBzZUxpbmtUb3BpYyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam5kaS1uYW1pbmctc2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImpuZGktbmFtaW5nLXNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai1qZ3JvdXBzLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgT0M0SiBKR3JvdXBzIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgIG1lY2hhbmlzbSBvZiB0aGUgUkNNCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2Utc2luZ2xlLXRocmVhZGVkLW5vdGlmaWNhdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdW4tY29yYmEtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBTdW4gQ09SQkEgdHJhbnNwb3J0IG1lY2hhbmlzbQotICAgICAgICAgICAgICAgIG9mIHRoZSBSQ00KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1c2VyLWRlZmluZWQtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRldGVybWluZXMgd2hldGhlciBhIHVzZXIgaW1wbGVtZW50ZWQKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnQgbWVjaGFuaXNtIHRoYXQgc2hvdWxkIGJlIHVzZWQuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnQtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpuZGktbmFtaW5nLXNlcnZpY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmRpLW5hbWluZy1zZXJ2aWNlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBVUkwgZm9yIG5hbWluZyBzZXJ2aWNlIHNob3VsZCBiZSBjaGFuZ2VkLiAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VyLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iYWRtaW4iIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmludGVybmFsLnNlY3VyaXR5LkpDRUVuY3J5cHRvciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0icGFzc3dvcmQiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDwhLS0gIFRPRE86IE5lZWQgdG8gaGF2ZSBhIG5vbiBXZWJMb2dpYyAocHJldmlvdXNseSBPQzRKKSBkZWZhdWx0IG9yIHJvdXRlIHRocm91Z2ggc2VydmVyIHBsYXRmb3JtIGJ5IGRlZmF1bHQgLS0+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdGlhbC1jb250ZXh0LWZhY3RvcnktbmFtZSIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9IndlYmxvZ2ljLmpuZGkuV0xJbml0aWFsQ29udGV4dEZhY3RvcnkiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmRpLW5hbWluZy1zZXJ2aWNlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsIGNvbnRleHQgZmFjdG9yeSBjbGFzcyBmb3IgbmFtaW5nIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjaGFuZ2VkLiAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmRpLW5hbWluZy1zZXJ2aWNlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWluZyBzZXJ2aWNlIHJlcXVpcmVzIGV4dHJhIHByb3BlcnR5IHRoYXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBkZWZpbmVkIGJ5IEVjbGlwc2VMaW5rIGJ1dCBpdCBpcyByZXF1aXJlZCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgYXBwbGljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmdyb3VwIG5hbWU9ImV2ZW50LWxpc3RlbmVyLWNsYXNzZXMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV2ZW50LWxpc3RlbmVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmdyb3VwPgotICAgIDx4c2Q6Z3JvdXAgbmFtZT0ic3RydWN0LWNvbnZlcnRlcnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Z3JvdXA+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2UgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmVhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9IjUwIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2UgcHJlYWxsb2NhdGlvbiBzaXplLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgUmVmZXJlbmNlcyBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwgb3ZlcnJpZGluZyBpdHMgbmFtZQotICAgICAgICAgICAgICAgIGFuZCAob3B0aW9uYWxseSkgcHJlYWxsb2NhdGlvbiBzaXplLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUbyB1c2UgcHJlYWxsb2NhdGlvbiBzaXplIG9mIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LAotICAgICAgICAgICAgICAgIHNldCBwcmVhbGxvY2F0aW9uIHNpemUgdG8gMAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hdGl2ZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEYXRhYmFzZSBzZXF1ZW5jZSBtZWNoYW5pc20gdXNlZC4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UYWJsZSBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRVUVOQ0UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZS1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUV9OQU1FIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFfQ09VTlQiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuYXJ5LXRhYmxlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFVuYXJ5IHRhYmxlIHNlcXVlbmNlIC0gc2VxdWVuY2UgbmFtZSBpcyBhIHRhYmxlIG5hbWUsCi0gICAgICAgICAgICAgICAgdGFibGUgaGFzIGEgc2luZ2xlIGZpZWxkIGFuZCBhIHNpbmdsZSByb3cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFVRU5DRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sZmlsZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5YbWxmaWxlIHNlcXVlbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sIHNlcXVlbmNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9vdC1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRVUVOQ0UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZS1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRX05BTUUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY291bnRlci1lbGVtZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iU0VRX0NPVU5UIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCVRoaXMgZWxlbWVudCBzcGVjaWZpZXMgd2hpY2ggZG9jdW1lbnQgcHJlc2VydmF0aW9uCi0gICAgICAgIAkJc3RyYXRlZ3kgd2lsbCBiZSB1c2VkLgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAJCTx4c2Q6ZWxlbWVudCBuYW1lPSJub2RlLW9yZGVyaW5nLXBvbGljeSIKLSAgICAJCQl0eXBlPSJub2RlLW9yZGVyaW5nLXBvbGljeSIgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiPgotICAgIAkJPC94c2Q6ZWxlbWVudD4KLSAgICAJPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij4KLSAgICAJPHhzZDphbm5vdGF0aW9uPgotICAgIAkJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgIAkJCVRoaXMgZWxlbWVudCBzcGVjaWZpZXMgd2hpY2ggbm9kZSBvcmRlcmluZyBzdHJhdGVneSB3aWxsCi0gICAgCQkJYmUgdXNlZC4KLSAgICAJCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgCTwveHNkOmFubm90YXRpb24+PC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlCi0gICAgCW5hbWU9ImRlc2NyaXB0b3ItbGV2ZWwtZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBEb2N1bWVudFByZXNlcnZhdGlvbiBQb2xpY3kgdGhhdAotICAgICAgICAJCWFjY2Vzc2VzIHRoZSBzZXNzaW9uIGNhY2hlIHRvIHN0b3JlIE9iamVjdHMgYW5kIHRoZWlyCi0gICAgICAgIAkJYXNzb2NpYXRlZCBub2Rlcy4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuby1kb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUEgRG9jdW1lbnRQcmVzZXJ2YXRpb25Qb2xpY3kgdG8gaW5kaWNhdGUgdGhhdCBubwotICAgICAgICAJCWRvY3VtZW50IHByZXNlcnZhdGlvbiB3b3JrIHNob3VsZCBiZSBkb25lLgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1iaW5kZXItcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIERvY3VtZW50UHJlc2VydmF0aW9uUG9saWN5IHRoYXQKLSAgICAgICAgCQltYWludGFpbnMgYmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIGJldHdlZW4gSmF2YQotICAgICAgICAJCU9iamVjdHMgYW5kIHRoZSBYTUxOb2RlcyB0aGV5IG9yaWdpbmF0ZWQgZnJvbS4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcHBlbmQtbmV3LWVsZW1lbnRzLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBOb2RlT3JkZXJpbmdQb2xpY3kgdGhhdCBzaW1wbHkKLSAgICAgICAgCQlhcHBlbmRzIHRoZSBuZXcgY2hpbGQgZWxlbWVudCB0byB0aGUgcGFyZW50LgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZ25vcmUtbmV3LWVsZW1lbnRzLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBOb2RlT3JkZXJpbmdQb2xpY3kgdGhhdCBpZ25vcmVzIGFueQotICAgICAgICAJCW5ldyBlbGVtZW50cyB3aGVuIHVwZGF0aW5nIGEgY2FjaGVkIGRvY3VtZW50LgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGl2ZS1wb3NpdGlvbi1vcmRlcmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgTm9kZU9yZGVyaW5nUG9saWN5IHRoYXQgYWRkcyBuZXcKLSAgICAgICAgCQllbGVtZW50cyB0byBhbiBYTUwgRG9jdW1lbnQgYmFzZWQgb24gdGhlIGxhc3QgdXBkYXRlZAotICAgICAgICAJCXNpYmxpbmcgaW4gdGhlaXIgY29udGV4dC4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMi54c2QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19zZXNzaW9uc18xLjIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTgyNDI3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0KLSBDb250cmlidXRvcnM6Ci0gICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9yYWNsZSBUb3BMaW5rCi0gICAgIHR3YXJlIC0gdXBkYXRlIHZlcnNpb24gbnVtYmVyIHRvIDEuMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAKLS0tPgotPCEtLSAKLQotWE1MIFNjaGVtYSBkZWZpbml0aW9uIGZvciB0aGUgRWNsaXBzZSBQZXJzaXN0ZW5jZSBTZXJ2aWNlcyBQcm9qZWN0IFNlc3Npb24gQ29uZmlndXJhdGlvbiBmaWxlLiBJbnN0YW5jZXMKLW9mIHRoaXMgZmlsZSBhcmUgdHlwaWNhbGx5IGxvY2F0ZWQgYXM6ICdNRVRBLUlORi9zZXNzaW9ucy54bWwnCi0KLSAtLT4KLQotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdmVyc2lvbj0iMS4yIj4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbnMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgcm9vdCBlbGVtZW50IGFuZCBleGlzdHMgb25seSBmb3IgWE1MCi0gICAgICAgICAgICAgICAgc3RydWN0dXJlCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbiIgdHlwZT0ic2Vzc2lvbiIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBub2RlIGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgYSBwYXJ0aWN1bGFyIHNlc3Npb24KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljIGVsZW1lbnQgdXNlZCB0byBkZXNjcmliZSBhIHN0cmluZyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRzIHRoZSBuYW1lIG9mIGFuIGl0ZW0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2ZXItcGxhdGZvcm0iIHR5cGU9InNlcnZlci1wbGF0Zm9ybSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUtY29tbWFuZCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gZWxlbWVudCB0aGF0IGRlZmluZSB0aGUgUmVtb3RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZCBNb2R1bGUgdGhhdCBjYW4gYWxzbyBiZSB1c2VkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlIHN5bmNocm9uaXphdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5uZWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIGRlZmF1bHQ9IkVjbGlwc2VMaW5rQ29tbWFuZENoYW5uZWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHJlbW90ZS1jb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbW1hbmRzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiByZW1vdGUtY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRldGVybWluZSB3aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBmZWF0dXJlcywgdGhlIFJDTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtc3luYyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgZWxlbWVudC4gSXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJucyBvbiBjYWNoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXphdGlvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93IHNlbmRpbmcgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nIGNhY2hlIHN5bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zcG9ydCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idHJhbnNwb3J0LW1hbmFnZXIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHJlbW90ZS1jb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGVmaW5lcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgbWVjaGFuaXNtIG9mIHRoZSBSQ00uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHJhbnNwb3J0IG1lY2hhbmlzbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIFJNSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZlbnQtbGlzdGVuZXItY2xhc3NlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iZXZlbnQtbGlzdGVuZXItY2xhc3NlcyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvZmlsZXIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgcmVwcmVzZW50cyBpZiB0aGUgcHJvZmlsZXIgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBieSB0aGUgc2Vzc2lvbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZG1zIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZWNsaXBzZWxpbmsiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2VwdGlvbi1oYW5kbGVyLWNsYXNzIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBjbGFzcyB0aGF0IHRoZSBzZXNzaW9uIHdpbGwgdXNlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgZXhjZXB0aW9ucyBnZW5lcmF0ZWQgZnJvbSB3aXRoaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nZ2luZyIgdHlwZT0ibG9nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9nZ2luZyBvcHRpb25zCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi1jdXN0b21pemVyLWNsYXNzIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBzZXNzaW9uIGN1c3RvbWl6ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIHRvIHJ1biBvbiBhIGxvYWRlZCBzZXNzaW9uLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZlci1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBub2RlIGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd2hpY2ggc2VydmVyCi0gICAgICAgICAgICAgICAgcGxhdGZvcm0gdG8gdXNlLCBKVEEgc2V0dGluZ3MgYW5kIHJ1bnRpbWUgc2VydmljZXMKLSAgICAgICAgICAgICAgICBzZXR0aW5ncwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmFibGUtcnVudGltZS1zZXJ2aWNlcyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50LiBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIEpNWCBNQmVhbiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGluZyBydW50aW1lIHNlcnZpY2VzIGlzIGRlcGxveWVkLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuYWJsZS1qdGEiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudC4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgc2Vzc2lvbiB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ3JhdGUgd2l0aCB0aGUgSlRBIChpLmUuIHdoZXRoZXIgdGhlIHNlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYSB0cmFuc2FjdGlvbiBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcy4gVGhlIGNob2ljZSBvZiBzZXJ2ZXItY2xhc3Mgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBiZSBjaG9zZW4gYmFzZWQgb24gdGhlIHRyYW5zYWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9tLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLnNlcnZlci5DdXN0b21TZXJ2ZXJQbGF0Zm9ybSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBzdWJjbGFzcyBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5zZXJ2ZXIuUGxhdGZvcm1CYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNwZWNpZnkgd2hpY2ggc2VydmVyIHBsYXRmb3JtIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImV4dGVybmFsLXRyYW5zYWN0aW9uLWNvbnRyb2xsZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai05MDMtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotOTA0LXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTEwMTItcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotMTAxMy1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai0xMTExLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTYxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy03MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtODEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTktcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTEwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNDAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS01MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTUxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNjAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS02MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamJvc3MtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24tYnJva2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFByb3ZpZGVzIGEgc2luZ2xlIHZpZXcgdG8gYSBzZXNzaW9uIHRoYXQKLSAgICAgICAgICAgICAgICB0cmFuc3BhcmVudGx5IGFjY2Vzc2VzIG11bHRwbGUgZGF0YWJhc2VzLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlc3Npb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwcm9qZWN0Ij4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhtbCI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0icHJvamVjdCIgLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjbGFzcyI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0icHJvamVjdCIgLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2Utc2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGUgc2Vzc2lvbiBpcyB0aGUgcHJpbWFyeSBpbnRlcmZhY2UgaW50byBFY2xpcHNlTGluaywgdGhlCi0gICAgICAgICAgICAgICAgYXBwbGljYXRpb24gc2hvdWxkIGRvIGFsbCBvZiBpdHMgcmVhZGluZyBhbmQgd3JpdGluZyBvZgotICAgICAgICAgICAgICAgIG9iamVjdHMgdGhyb3VnaCB0aGUgc2Vzc2lvbi4gVGhlIHNlc3Npb24gYWxzbyBtYW5hZ2VzCi0gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zIGFuZCB1bml0cyBvZiB3b3JrLiBUaGUgZGF0YWJhc2Ugc2Vzc2lvbiBpcwotICAgICAgICAgICAgICAgIGludGVuZGVkIGZvciB1c2FnZSBpbiB0d28tdGllciBjbGllbnQtc2VydmVyCi0gICAgICAgICAgICAgICAgYXBwbGljYXRpb25zLiBBbHRob3VnaCBpdCBjb3VsZCBiZSB1c2VkIGluIGEgc2VydmVyCi0gICAgICAgICAgICAgICAgc2l0dWF0aW9uLCBpdCBpcyBsaW1pdHRlZCB0byBvbmx5IGhhdmluZyBhIHNpbmdsZQotICAgICAgICAgICAgICAgIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIG9ubHkgYWxsb3dzIGEgc2luZ2xlIG9wZW4KLSAgICAgICAgICAgICAgICBkYXRhYmFzZSB0cmFuc2FjdGlvbi4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXNzaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1wcm9qZWN0IiB0eXBlPSJwcm9qZWN0IgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcHJvamVjdCAoY2xhc3Mgb3IgeG1sKSB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZCBhcyB0aGUgcHJpbWFyeSBwcm9qZWN0IGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkZGl0aW9uYWwtcHJvamVjdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InByb2plY3QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbCBwcm9qZWN0cyB3aWxsIGhhdmUgdGhlaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMgYXBwZW5kZWQgdG8gdGhlIHByaW1hcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2luIiB0eXBlPSJsb2dpbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2ZXItc2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBJcyBhbiBleHRlbnNpb24gb2YgYSBEYXRhYmFzZVNlc3Npb24KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1zZXNzaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1wb29scyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uIHBvb2xzIGFyZSBvbmx5IGZvciB1c2FnZSB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsIGNvbm5lY3Rpb24gcG9vbGluZyBhbmQgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBiZSB1c2VkIGlmIHVzaW5nIGV4dGVybmFsIGNvbm5lY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhZC1jb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJyZWFkLWNvbm5lY3Rpb24tcG9vbCIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IndyaXRlLWNvbm5lY3Rpb24tcG9vbCIgdHlwZT0iY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InNlcXVlbmNlLWNvbm5lY3Rpb24tcG9vbCIgdHlwZT0iY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGlzIHRhZyB0byB1c2UgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlIGNvbm5lY3Rpb24gcG9vbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iY29ubmVjdGlvbi1wb29sIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvbGljeSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImNvbm5lY3Rpb24tcG9saWN5IiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29ubmVjdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVXNlZCB0byBzcGVjaWZ5IGhvdyBkZWZhdWx0IGNsaWVudCBzZXNzaW9ucyBhcmUgYWNxdWlyZWQKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVzaXZlLWNvbm5lY3Rpb24iIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGlmIGFuIGV4Y2x1c2l2ZSBjb25uZWN0aW9uIHNob3VsZCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBmb3IgcmVhZHMsIHJlcXVpcmVkIGZvciBWUEQsIG9yIHVzZXIgYmFzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgc2VjdXJpdHkuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGF6eSIgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBpZiBhIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGFjcXVpcmVkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgaGVsZCB1cGZyb250IGluIHRoZSBjbGllbnQgc2Vzc2lvbiwgb3Igb25seQotICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgd2hlbiBuZWVkZWQgYW5kIHRoZW4gcmVsZWFzZWQuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyBjb21tb24gZmllbGRzIGZvciBkYXRhYmFzZS1sb2dpbiBhbmQgZWlzLWxvZ2luCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBsYXRmb3JtLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgcGxhdGZvcm0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VyLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBsb2dpbiBhcyB3ZWxsIGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgU3luY2hyb25pemF0aW9uIGZlYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmludGVybmFsLnNlY3VyaXR5LkpDRUVuY3J5cHRvciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGxvZ2luIGFzIHdlbGwgYXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZSBTeW5jaHJvbml6YXRpb24gZmVhdHVyZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgbG9naW4gYXMgd2VsbCBhcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlIFN5bmNocm9uaXphdGlvbiBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtcXVhbGlmaWVyIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIGRlZmF1bHQgcXVhbGlmaWVyIGZvciBhbGwgdGFibGVzLiBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgdGhlIGNyZWF0b3Igb2YgdGhlIHRhYmxlIG9yIGRhdGFiYXNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0YWJsZSBleGlzdHMgb24uIFRoaXMgaXMgcmVxdWlyZWQgYnkgc29tZQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VzIHN1Y2ggYXMgT3JhY2xlIGFuZCBEQjIuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZXJuYWwtY29ubmVjdGlvbi1wb29saW5nIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0byB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIHNob3VsZCB1c2UgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIGNvbm5lY3Rpb24gcG9vbAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVybmFsLXRyYW5zYWN0aW9uLWNvbnRyb2xsZXIiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSBpZiB0aGUgc2Vzc2lvbiB3aWxsIGJlIHVzaW5nIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCB0cmFuc2FjdGlvbiBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2luZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNpbmcgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ic2VxdWVuY2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHNlcXVlbmNlLiBUaGUgbmFtZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwuIElmIG5vIG5hbWUgcHJvdmlkZWQgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5IHN0cmluZyB3aWxsIGJlIHVzZWQgYXMgYSBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbiBkZWZhdWx0IHNlcXVlbmNlcy4gTWFrZSBzdXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHNlcXVlbmNlIGhhcyB1bmlxdWUgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ic2VxdWVuY2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgYSBsb2dpbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIEl0IGlzIHVzZWQgdG8gZGVmaW5lIGV4dHJhIHByb3BlcnRpZXMgb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dpbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2UtbG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgSG9sZHMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIGNvbm5lY3QKLSAgICAgICAgICAgICAgICB0byBhIEpEQkMgZHJpdmVyLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZ2luIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZHJpdmVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkcml2ZXIgY2xhc3MgaXMgdGhlIEphdmEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBmb3IgdGhlIEpEQkMgZHJpdmVyIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCAoZS5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bi5qZGJjLm9kYmMuSmRiY09kYmNEcml2ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tdXJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIFVSTCB0aGF0IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YXNvdXJjZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBVUkwgb2YgYSBkYXRhc291cmNlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSB1c2VkIGJ5IHRoZSBzZXNzaW9uIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxvb2t1cCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibG9va3VwLWVudW0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiaW5kLWFsbC1wYXJhbWV0ZXJzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBiaW5kIGFsbCBhcmd1bWVudHMgdG8gYW55Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNRTCBzdGF0ZW1lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZS1hbGwtc3RhdGVtZW50cyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHByZXBhcmVkIHN0YXRlbWVudHMgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNhY2hlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJ5dGUtYXJyYXktYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBiaW5kaW5nIGZvciBsYXJnZSBiaW5hcnkgZGF0YS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCBFY2xpcHNlTGluayB3aWxsIHByaW50IHRoaXMgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBoZXggdGhyb3VnaCB0aGUgSkRCQyBiaW5hcnkgZXhjYXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXVzZS4gQm90aCBiaW5kaW5nIGFuZCBwcmludGluZyBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlvdXMgbGltaXRzIG9uIGFsbCBkYXRhYmFzZXMgKGUuZy4gNWsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAzMmspLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RyaW5nLWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSBpZiBzdHJpbmdzIHNob3VsZCBiZSBib3VuZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlZCB0byBoZWxwIGJlYW4gaW50cm9zcGVjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cmVhbXMtZm9yLWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2Ugc3RyZWFtcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdG9yZSBsYXJnZSBiaW5hcnkgZGF0YS4gVGhpcyBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZSB0aGUgbWF4IHNpemUgZm9yIHJlYWRpbmcvd3JpdGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBzb21lIEpEQkMgZHJpdmVycy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcmNlLWZpZWxkLW5hbWVzLXRvLXVwcGVyLWNhc2UiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHNldHRpbmcgY2FuIGJlIHVzZWQgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGV4cGVjdHMgdXBwZXIgY2FzZSBidXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlIGRvZXMgbm90IHJldHVybiBjb25zaXN0ZW50IGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gZGlmZmVyZW50IGRhdGFiYXNlcykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWl6ZS1kYXRhLWNvbnZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIGRyaXZlciBsZXZlbCBkYXRhIGNvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uIGlzIGVuYWJsZWQuIFRoaXMgY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkIGFzIHNvbWUgZHJpdmVycyBwZXJmb3JtIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiB0aGVtc2VsdmVzIGluY29ycmVjdGx5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJpbS1zdHJpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IENIQVIgZmllbGQgdmFsdWVzIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmcgYmxhbmtzIHRyaW1tZWQsIHRoaXMgY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC13cml0aW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGJhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmcuIFRoaXMgZmFjaWxpdHkgYWxsb3dzIG11bHRpcGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIG9wZXJhdGlvbnMgdG8gYmUgc3VibWl0dGVkIHRvIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2UgZm9yIHByb2Nlc3NpbmcgYXQgb25jZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VibWl0dGluZyBtdWx0aXBsZSB1cGRhdGVzIHRvZ2V0aGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIGluZGl2aWR1YWxseSwgY2FuIGdyZWF0bHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZSBwZXJmb3JtYW5jZSBpbiBzb21lIHNpdHVhdGlvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqZGJjLWJhdGNoLXdyaXRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmcgdGhpcyB0YWcgd2l0aCB0cnVlIGluZGljYXRlcyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayB0aGF0IHRoZSBKREJDIGRyaXZlciBzdXBwb3J0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCB3cml0aW5nLiBFY2xpcHNlTGluaydzIGludGVybmFsIGJhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmcgaXMgZGlzYWJsZWQuIFNldHRpbmcgdGhpcyB0YWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBmYWxzZSBpbmRpY2F0ZXMgdG8gRWNsaXBzZUxpbmsgdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRCQyBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBiYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nLiBUaGlzIHdpbGwgcmV2ZXJ0IHRvIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW91ciB3aGljaCBpcyB0byBkZWxlZ2F0ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluaydzIGludGVybmFsIGJhdGNoIHdyaXRpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXgtYmF0Y2gtd3JpdGluZy1zaXplIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjMyMDAwIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3cgZm9yIHRoZSBtYXggYmF0Y2ggd3JpdGluZyBzaXplIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNldC4gVGhpcyBhbGxvd3MgZm9yIHRoZSBiYXRjaCBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGxpbWl0ZWQgYXMgbW9zdCBkYXRhYmFzZSBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdCBsaW1pdHMuIFRoZSBzaXplIGlzIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMsIHRoZSBkZWZhdWx0IGlzIDMyMDAwIGJ1dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBkYXRhYmFzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmF0aXZlLXNxbCIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSBzcGVjaWZpYyBzcWwgZ3JhbW1hciBub3QgSkRCQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYy4gVGhpcyBpcyBiZWNhdXNlIHVuZm9ydHVuYXRlbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29tZSBicmlkZ2VzIHRvIG5vdCBzdXBwb3J0IHRoZSBmdWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpEQkMgc3RhbmRhcmQuIEJ5IGRlZmF1bHQgRWNsaXBzZUxpbmsgdXNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgSkRCQyBzcWwgZ3JhbW1hci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXJzIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpncm91cCByZWY9InN0cnVjdC1jb252ZXJ0ZXJzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWhlYWx0aC12YWxpZGF0ZWQtb24tZXJyb3IiIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0cnVlIHdpbGwgY2F1c2UgRWNsaXBzZUxpbmsgdG8gcGluZyBkYXRhYmFzZSB0byBkZXRlcm1pbmUgaWYgYW4gU1FMRXhjZXB0aW9uIHdhcyBjYXVzZSBieSBhIGNvbW11bmljYXRpb24gZmFpbHVyZTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnktcmV0cnktYXR0ZW1wdC1jb3VudCIgdHlwZT0ieHNkOmludGVnZXIiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIGF0dGVtcHRzIEVjbGlwc2VMaW5rIHdpbGwgbWFrZSBpZiBFY2xpcHNlTGluayBpcyBhdHRlbXB0aW5nIHRvIHJldHJ5IGEgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJkZWxheS1iZXR3ZWVuLXJlY29ubmVjdC1hdHRlbXB0cyIgdHlwZT0ieHNkOmludGVnZXIiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0aGUgdGltZSBpbiBtaWxpc2Vjb25kcyB0aGF0IEVjbGlwc2VMaW5rIHdpbGwgd2FpdCBiZXR3ZWVuIGF0dGVtcHRzIHRvIHJlY29ubmVjdCBpZiBFY2xpcHNlTGluayBpcyBhdHRlbXB0aW5nIHRvIHJldHJ5IGEgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5nLXNxbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3ZlcnJpZGUgdGhlIHBsYXRmb3JtIHNwZWNpZmljIFNRTCB0aGF0IEVjbGlwc2VMaW5rIHdpbGwgaXNzdWUgdG8gYSBjb25uZWN0aW9uIHRvIGRldGVybWluZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBsaXZlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9va3VwLWVudW0iPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29tcG9zaXRlLW5hbWUiIC8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3VuZC1uYW1lIiAvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiBhbmQgZGF0YXNvdXJjZQotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGNvbm5lY3QgdGhyb3VnaCBFSVMsCi0gICAgICAgICAgICAgICAgLSBQcm92aWRlIGEgSk5ESSBuYW1lIHRvIHRoZSBDb25uZWN0aW9uRmFjdG9yeSBhbmQgdXNlCi0gICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgZ2V0Q29ubmVjdGlvbiAtIFByb3ZpZGUgYSBKTkRJIG5hbWUgdG8gdGhlCi0gICAgICAgICAgICAgICAgQ29ubmVjdGlvbkZhY3RvcnksIGFuZCBhIGRyaXZlciBzcGVjaWZpYyBDb25uZWN0aW9uU3BlYwotICAgICAgICAgICAgICAgIHRvIHBhc3MgdG8gdGhlIGdldENvbm5lY3Rpb24gLSBDb25uZWN0IGluIGEgbm9uLW1hbmFnZWQKLSAgICAgICAgICAgICAgICB3YXkgZGlyZWN0bHkgdG8gdGhlIGRyaXZlciBzcGVjaWZpYyBDb25uZWN0aW9uRmFjdG9yeSBBbgotICAgICAgICAgICAgICAgIEVJU0Nvbm5lY3Rpb25TcGVjIG11c3QgYmUgcHJvdmlkZWQgdG8gZGVmaW5lIGhvdyB0bwotICAgICAgICAgICAgICAgIGNvbm5lY3QgdG8gdGhlIEVJUyBhZGFwdGVyLiBUaGUgRUlTIHBsYXRmb3JtIGNhbiBiZSB1c2VkCi0gICAgICAgICAgICAgICAgdG8gcHJvdmlkZSBkYXRhc291cmNlL2RyaXZlciBzcGVjaWZpYyBiZWhhdm9pciBzdWNoIGFzCi0gICAgICAgICAgICAgICAgSW50ZXJhY3Rpb25TcGVjIGFuZCBSZWNvcmQgY29udmVyc2lvbi4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2dpbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tc3BlYy1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tZmFjdG9yeS11cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWxvZ2luIj4KLSAgICAJPHhzZDphbm5vdGF0aW9uPgotICAgIAkJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgIAkJCURlZmluZXMgbG9naW4gYW5kIHBsYXRmb3JtIHR5cGUgdG8gYmUgdXNlZAotICAgIAkJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAJPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAJPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZ2luIj4KLSAgICAJCQk8eHNkOnNlcXVlbmNlPgotICAgIAkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZXF1YWwtbmFtZXNwYWNlLXJlc29sdmVycyIKLSAgICAJCQkJCXR5cGU9InhzZDpib29sZWFuIiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCI+Ci0gICAgCQkJCTwveHNkOmVsZW1lbnQ+Ci0gICAgCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5IgotICAgIAkJCQkJbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiCi0gICAgCQkJCQl0eXBlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLQotICAgIAkJCQk8L3hzZDplbGVtZW50PgotICAgIAkJCTwveHNkOnNlcXVlbmNlPgotICAgIAkJPC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbm5lY3Rpb24tcG9vbCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBVc2VkIHRvIHNwZWNpZnkgaG93IGNvbm5lY3Rpb25zIHNob3VsZCBiZSBwb29sZWQgaW4gYQotICAgICAgICAgICAgICAgIHNlcnZlciBzZXNzaW9uLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1heC1jb25uZWN0aW9ucyIgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtYXggbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBpbiB0aGUgcG9vbAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbi1jb25uZWN0aW9ucyIgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtaW4gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgd2lsbCBhd2F5cyBiZQotICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dpbiIgdHlwZT0ibG9naW4iIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLWNvbm5lY3Rpb24tcG9vbCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGUgcmVhZCBjb25uZWN0aW9uIHBvb2wgaXMgdXNlZCBmb3IgcmVhZCBhY2Nlc3MgdGhyb3VnaAotICAgICAgICAgICAgICAgIHRoZSBzZXJ2ZXIgc2Vzc2lvbi4gQW55IG9mIHRoZSBjb25uZWN0aW9uIHBvb2xzIGNhbiBiZQotICAgICAgICAgICAgICAgIHVzZWQgZm9yIHRoZSByZWFkIHBvb2wgaG93ZXZlciB0aGlzIGlzIHRoZSBkZWZhdWx0LiBUaGlzCi0gICAgICAgICAgICAgICAgcG9vbCBhbGxvd3MgZm9yIGNvbmN1cnJlbnQgcmVhZHMgYWdhaW5zdCB0aGUgc2FtZSBKREJDCi0gICAgICAgICAgICAgICAgY29ubmVjdGlvbiBhbmQgcmVxdWlyZXMgdGhhdCB0aGUgSkRCQyBjb25uZWN0aW9uIHN1cHBvcnQKLSAgICAgICAgICAgICAgICBjb25jdXJyZW50IHJlYWQgYWNjZXNzLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbm5lY3Rpb24tcG9vbCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1c2l2ZSIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMgZnJvbSB0aGUgcmVhZCBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2wgYXJlIGV4Y2x1c2l2ZSBvciBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgY29tbW9uIGxvZ2dpbmcgb3B0aW9ucwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImphdmEtbG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG9wdGlvbnMgb2YgdGhlIEphdmEgbG9nCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9nIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nZ2luZy1vcHRpb25zIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibG9nZ2luZy1vcHRpb25zIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWNsaXBzZWxpbmstbG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG9wdGlvbnMgb2YgdGhlIEVjbGlwc2VMaW5rIGxvZwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZy1sZXZlbCIgZGVmYXVsdD0iaW5mbyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBsb2cgbGV2ZWwgZm9yIGxvZ2dpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvZmYiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNldmVyZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id2FybmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW5mbyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29uZmlnIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5lIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5lciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluZXN0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbGwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgb2YgdGhlIGZpbGUgdG8gd3JpdGUgdGhlIGxvZ2dpbmcgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2dpbmctb3B0aW9ucyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImxvZ2dpbmctb3B0aW9ucyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZlci1sb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgb3B0aW9ucyBvZiB0aGUgU2VydmVyIGxvZwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZyIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2dnaW5nLW9wdGlvbnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZy1leGNlcHRpb24tc3RhY2t0cmFjZSIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgZXhjZXB0aW9uIHN0YWNrdHJhY2UuIFdpdGhvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZWxlbWVudCwgdGhlIHN0YWNrdHJhY2UgaXMgbG9nZ2VkIGZvciBGSU5FUgotICAgICAgICAgICAgICAgICAgICAgICAgb3IgbGVzcyAoRklORVNUKQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LXRocmVhZCIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgdGhyZWFkLiBXaXRob3V0IHRoaXMgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0aHJlYWQgaXMgbG9nZ2VkIGZvciBGSU5FIG9yIGxlc3MgKEZJTkVSIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICBGSU5FU1QpCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtc2Vzc2lvbiIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBzZXNzaW9uLiBXaXRob3V0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsIHRoZSBzZXNzaW9uIGlzIGFsd2F5cyBwcmludGVkCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtY29ubmVjdGlvbiIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBjb25uZWN0aW9uLiBXaXRob3V0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsIHRoZSBjb25uZWN0aW9uIGlzIGFsd2F5cyBwcmludGVkCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtZGF0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBkYXRlLiBXaXRob3V0IHRoaXMgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkYXRlIGlzIGFsd2F5cyBwcmludGVkCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIHRyYW5zcG9ydCBtZWNoYW5pc20gb2YgdGhlIFJDTS4KLSAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB0cmFuc3BvcnQgbWVjaGFuaXNtIGlzIFJNSQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbi1jb25uZWN0aW9uLWVycm9yIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9IkRpc2NhcmRDb25uZWN0aW9uIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGFuZCBoYXMgdmFsdWUgb2YgIkRpc2NhcmRDb25uZWN0aW9uIiBvcgotICAgICAgICAgICAgICAgICAgICAgICAgIktlZXBDb25uZWN0aW9uIi4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIHRvIGEgUkNNIHNlcnZpY2Ugc2hvdWxkIGJlIGRyb3BwZWQgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGEgY29tbXVuaWNhdGlvbiBlcnJvciB3aXRoIHRoYXQgUkNNCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBlbGVtZW50IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAiRGlzY2FyZENvbm5lY3Rpb24iLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2VlcENvbm5lY3Rpb24iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjYXJkQ29ubmVjdGlvbiIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm1pLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZWZpbmVzIHRoZSBSTUkgdHJhbnNwb3J0IG1lY2hhbmlzbS4gVGhlCi0gICAgICAgICAgICAgICAgZGVmYXVsdCBuYW1pbmcgc2VydmljZSBpcyBKTkRJCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZW5kLW1vZGUiIGRlZmF1bHQ9IkFzeW5jaHJvbm91cyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybWkgZWxlbWVudCBhbmQgaGFzIHZhbHVlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3luY2hyb25vdXMiIG9yICJTeW5jaHJvbm91cyIuIEl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluZXMgd2hldGhlciB0aGUgUkNNIHByb3BhZ2F0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBhbmQgZG9lcyBub3Qgd2FpdCBmb3IgY29tbWFuZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2ggaXRzIGV4ZWN1dGlvbiBpbiBhc3luY2hyb25vdXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSBvciB3YWl0IGZvciBjb21tYW5kIHRvIGZpbmlzaCBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uIGluIHN5bmNocm9ub3VzIG1vZGUuIFRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgZWxlbWVudCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXN5bmNocm9ub3VzIi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3luY2hyb25vdXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5bmNocm9ub3VzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NvdmVyeSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtaSBlbGVtZW50LiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvdmVyeSBzZXR0aW5ncyBzaG91bGQgYmUgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGEgZGVmYXVsdCBEaXNjb3Zlcnkgd2l0aCBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBzZXR0aW5ncyBpcyBjcmVhdGVkIHdoZW4gdGhlIHJtaQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGlzIHNwZWNpZmllZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJtdWx0aWNhc3QtZ3JvdXAtYWRkcmVzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IjIyNi4xMC4xMi42NCIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXVsdGljYXN0LXBvcnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMzEyMSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYW5ub3VuY2VtZW50LWRlbGF5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjEwMDAiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiBkaXNjb3ZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVuZW50LiBJdCBkZXRlcm1pbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhlIG11bHRpY2FzdCBncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIHNob3VsZCBiZSBjaGFuZ2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgaXMgIjEwMDAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWNrZXQtdGltZS10by1saXZlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiBkaXNjb3ZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVuZW50LiBJdCBkZXRlcm1pbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhlIHRpbWUtdG8tbGl2ZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGFja2V0cyB0aGF0IGFyZSBzZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIERpc2NvdmVyeSdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHN0aWNhc3Qgc29ja2V0IHNob3VsZCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkLiBUaGUgZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGlzIGVsZW1lbnQgaXMgIjIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqbmRpLW5hbWluZy1zZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImpuZGktbmFtaW5nLXNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJybWktcmVnaXN0cnktbmFtaW5nLXNlcnZpY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHJtaSBlbGVtZW5lbnQuIEl0IGRldGVybWluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgUk1JIHJlZ2lzdHJ5IHNob3VsZCBiZSB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbmFtaW5nIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm1pLWlpb3AtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBSTUktSUlPUCB0cmFuc3BvcnQgbWVjaGFuaXNtIG9mCi0gICAgICAgICAgICAgICAgdGhlIFJDTS4gVGhlIGRlZmF1bHQgbmFtaW5nIHNlcnZpY2UgaXMgSk5ESQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJtaS10cmFuc3BvcnQiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam1zLXRvcGljLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgSk1TIHRvcGljIHRyYW5zcG9ydCBtZWNoYW5pc20KLSAgICAgICAgICAgICAgICBvZiB0aGUgUkNNCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1ob3N0LXVybCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLWNvbm5lY3Rpb24tZmFjdG9yeS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iam1zL0VjbGlwc2VMaW5rVG9waWNDb25uZWN0aW9uRmFjdG9yeSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJqbXMvRWNsaXBzZUxpbmtUb3BpYyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam5kaS1uYW1pbmctc2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImpuZGktbmFtaW5nLXNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai1qZ3JvdXBzLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgT0M0SiBKR3JvdXBzIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgIG1lY2hhbmlzbSBvZiB0aGUgUkNNCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2Utc2luZ2xlLXRocmVhZGVkLW5vdGlmaWNhdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdW4tY29yYmEtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBTdW4gQ09SQkEgdHJhbnNwb3J0IG1lY2hhbmlzbQotICAgICAgICAgICAgICAgIG9mIHRoZSBSQ00KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1c2VyLWRlZmluZWQtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRldGVybWluZXMgd2hldGhlciBhIHVzZXIgaW1wbGVtZW50ZWQKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnQgbWVjaGFuaXNtIHRoYXQgc2hvdWxkIGJlIHVzZWQuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnQtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpuZGktbmFtaW5nLXNlcnZpY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmRpLW5hbWluZy1zZXJ2aWNlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBVUkwgZm9yIG5hbWluZyBzZXJ2aWNlIHNob3VsZCBiZSBjaGFuZ2VkLiAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VyLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iYWRtaW4iIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmludGVybmFsLnNlY3VyaXR5LkpDRUVuY3J5cHRvciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0icGFzc3dvcmQiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDwhLS0gIFRPRE86IE5lZWQgdG8gaGF2ZSBhIG5vbiBXZWJMb2dpYyAocHJldmlvdXNseSBPQzRKKSBkZWZhdWx0IG9yIHJvdXRlIHRocm91Z2ggc2VydmVyIHBsYXRmb3JtIGJ5IGRlZmF1bHQgLS0+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdGlhbC1jb250ZXh0LWZhY3RvcnktbmFtZSIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9IndlYmxvZ2ljLmpuZGkuV0xJbml0aWFsQ29udGV4dEZhY3RvcnkiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmRpLW5hbWluZy1zZXJ2aWNlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsIGNvbnRleHQgZmFjdG9yeSBjbGFzcyBmb3IgbmFtaW5nIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjaGFuZ2VkLiAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmRpLW5hbWluZy1zZXJ2aWNlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWluZyBzZXJ2aWNlIHJlcXVpcmVzIGV4dHJhIHByb3BlcnR5IHRoYXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBkZWZpbmVkIGJ5IEVjbGlwc2VMaW5rIGJ1dCBpdCBpcyByZXF1aXJlZCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgYXBwbGljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmdyb3VwIG5hbWU9ImV2ZW50LWxpc3RlbmVyLWNsYXNzZXMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV2ZW50LWxpc3RlbmVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmdyb3VwPgotICAgIDx4c2Q6Z3JvdXAgbmFtZT0ic3RydWN0LWNvbnZlcnRlcnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Z3JvdXA+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2UgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmVhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9IjUwIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2UgcHJlYWxsb2NhdGlvbiBzaXplLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgUmVmZXJlbmNlcyBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwgb3ZlcnJpZGluZyBpdHMgbmFtZQotICAgICAgICAgICAgICAgIGFuZCAob3B0aW9uYWxseSkgcHJlYWxsb2NhdGlvbiBzaXplLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUbyB1c2UgcHJlYWxsb2NhdGlvbiBzaXplIG9mIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LAotICAgICAgICAgICAgICAgIHNldCBwcmVhbGxvY2F0aW9uIHNpemUgdG8gMAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hdGl2ZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEYXRhYmFzZSBzZXF1ZW5jZSBtZWNoYW5pc20gdXNlZC4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UYWJsZSBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRVUVOQ0UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZS1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUV9OQU1FIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFfQ09VTlQiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuYXJ5LXRhYmxlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFVuYXJ5IHRhYmxlIHNlcXVlbmNlIC0gc2VxdWVuY2UgbmFtZSBpcyBhIHRhYmxlIG5hbWUsCi0gICAgICAgICAgICAgICAgdGFibGUgaGFzIGEgc2luZ2xlIGZpZWxkIGFuZCBhIHNpbmdsZSByb3cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFVRU5DRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sZmlsZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5YbWxmaWxlIHNlcXVlbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sIHNlcXVlbmNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9vdC1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRVUVOQ0UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZS1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRX05BTUUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY291bnRlci1lbGVtZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iU0VRX0NPVU5UIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCVRoaXMgZWxlbWVudCBzcGVjaWZpZXMgd2hpY2ggZG9jdW1lbnQgcHJlc2VydmF0aW9uCi0gICAgICAgIAkJc3RyYXRlZ3kgd2lsbCBiZSB1c2VkLgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAJCTx4c2Q6ZWxlbWVudCBuYW1lPSJub2RlLW9yZGVyaW5nLXBvbGljeSIKLSAgICAJCQl0eXBlPSJub2RlLW9yZGVyaW5nLXBvbGljeSIgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiPgotICAgIAkJPC94c2Q6ZWxlbWVudD4KLSAgICAJPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij4KLSAgICAJPHhzZDphbm5vdGF0aW9uPgotICAgIAkJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgIAkJCVRoaXMgZWxlbWVudCBzcGVjaWZpZXMgd2hpY2ggbm9kZSBvcmRlcmluZyBzdHJhdGVneSB3aWxsCi0gICAgCQkJYmUgdXNlZC4KLSAgICAJCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgCTwveHNkOmFubm90YXRpb24+PC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlCi0gICAgCW5hbWU9ImRlc2NyaXB0b3ItbGV2ZWwtZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBEb2N1bWVudFByZXNlcnZhdGlvbiBQb2xpY3kgdGhhdAotICAgICAgICAJCWFjY2Vzc2VzIHRoZSBzZXNzaW9uIGNhY2hlIHRvIHN0b3JlIE9iamVjdHMgYW5kIHRoZWlyCi0gICAgICAgIAkJYXNzb2NpYXRlZCBub2Rlcy4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuby1kb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUEgRG9jdW1lbnRQcmVzZXJ2YXRpb25Qb2xpY3kgdG8gaW5kaWNhdGUgdGhhdCBubwotICAgICAgICAJCWRvY3VtZW50IHByZXNlcnZhdGlvbiB3b3JrIHNob3VsZCBiZSBkb25lLgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1iaW5kZXItcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIERvY3VtZW50UHJlc2VydmF0aW9uUG9saWN5IHRoYXQKLSAgICAgICAgCQltYWludGFpbnMgYmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIGJldHdlZW4gSmF2YQotICAgICAgICAJCU9iamVjdHMgYW5kIHRoZSBYTUxOb2RlcyB0aGV5IG9yaWdpbmF0ZWQgZnJvbS4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcHBlbmQtbmV3LWVsZW1lbnRzLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBOb2RlT3JkZXJpbmdQb2xpY3kgdGhhdCBzaW1wbHkKLSAgICAgICAgCQlhcHBlbmRzIHRoZSBuZXcgY2hpbGQgZWxlbWVudCB0byB0aGUgcGFyZW50LgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZ25vcmUtbmV3LWVsZW1lbnRzLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBOb2RlT3JkZXJpbmdQb2xpY3kgdGhhdCBpZ25vcmVzIGFueQotICAgICAgICAJCW5ldyBlbGVtZW50cyB3aGVuIHVwZGF0aW5nIGEgY2FjaGVkIGRvY3VtZW50LgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGl2ZS1wb3NpdGlvbi1vcmRlcmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgTm9kZU9yZGVyaW5nUG9saWN5IHRoYXQgYWRkcyBuZXcKLSAgICAgICAgCQllbGVtZW50cyB0byBhbiBYTUwgRG9jdW1lbnQgYmFzZWQgb24gdGhlIGxhc3QgdXBkYXRlZAotICAgICAgICAJCXNpYmxpbmcgaW4gdGhlaXIgY29udGV4dC4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzIuMC54c2QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19zZXNzaW9uc18yLjAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODQ4MjFlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzIuMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0KLSBDb250cmlidXRvcnM6Ci0gICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9yYWNsZSBUb3BMaW5rCi0gICAgIHR3YXJlIC0gdXBkYXRlIHZlcnNpb24gbnVtYmVyIHRvIDIuMAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAKLS0tPgotPCEtLSAKLQotWE1MIFNjaGVtYSBkZWZpbml0aW9uIGZvciB0aGUgRWNsaXBzZSBQZXJzaXN0ZW5jZSBTZXJ2aWNlcyBQcm9qZWN0IFNlc3Npb24gQ29uZmlndXJhdGlvbiBmaWxlLiBJbnN0YW5jZXMKLW9mIHRoaXMgZmlsZSBhcmUgdHlwaWNhbGx5IGxvY2F0ZWQgYXM6ICdNRVRBLUlORi9zZXNzaW9ucy54bWwnCi0KLSAtLT4KLQotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdmVyc2lvbj0iMi4wIj4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbnMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgcm9vdCBlbGVtZW50IGFuZCBleGlzdHMgb25seSBmb3IgWE1MCi0gICAgICAgICAgICAgICAgc3RydWN0dXJlCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbiIgdHlwZT0ic2Vzc2lvbiIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBub2RlIGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgYSBwYXJ0aWN1bGFyIHNlc3Npb24KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljIGVsZW1lbnQgdXNlZCB0byBkZXNjcmliZSBhIHN0cmluZyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRzIHRoZSBuYW1lIG9mIGFuIGl0ZW0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2ZXItcGxhdGZvcm0iIHR5cGU9InNlcnZlci1wbGF0Zm9ybSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUtY29tbWFuZCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gZWxlbWVudCB0aGF0IGRlZmluZSB0aGUgUmVtb3RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZCBNb2R1bGUgdGhhdCBjYW4gYWxzbyBiZSB1c2VkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlIHN5bmNocm9uaXphdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5uZWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIGRlZmF1bHQ9IkVjbGlwc2VMaW5rQ29tbWFuZENoYW5uZWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHJlbW90ZS1jb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbW1hbmRzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiByZW1vdGUtY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRldGVybWluZSB3aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBmZWF0dXJlcywgdGhlIFJDTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtc3luYyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgZWxlbWVudC4gSXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJucyBvbiBjYWNoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXphdGlvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93IHNlbmRpbmcgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nIGNhY2hlIHN5bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zcG9ydCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idHJhbnNwb3J0LW1hbmFnZXIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHJlbW90ZS1jb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGVmaW5lcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgbWVjaGFuaXNtIG9mIHRoZSBSQ00uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHJhbnNwb3J0IG1lY2hhbmlzbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIFJNSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZlbnQtbGlzdGVuZXItY2xhc3NlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iZXZlbnQtbGlzdGVuZXItY2xhc3NlcyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvZmlsZXIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgcmVwcmVzZW50cyBpZiB0aGUgcHJvZmlsZXIgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBieSB0aGUgc2Vzc2lvbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZG1zIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZWNsaXBzZWxpbmsiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2VwdGlvbi1oYW5kbGVyLWNsYXNzIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBjbGFzcyB0aGF0IHRoZSBzZXNzaW9uIHdpbGwgdXNlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgZXhjZXB0aW9ucyBnZW5lcmF0ZWQgZnJvbSB3aXRoaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nZ2luZyIgdHlwZT0ibG9nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9nZ2luZyBvcHRpb25zCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi1jdXN0b21pemVyLWNsYXNzIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBzZXNzaW9uIGN1c3RvbWl6ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIHRvIHJ1biBvbiBhIGxvYWRlZCBzZXNzaW9uLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZlci1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBub2RlIGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd2hpY2ggc2VydmVyCi0gICAgICAgICAgICAgICAgcGxhdGZvcm0gdG8gdXNlLCBKVEEgc2V0dGluZ3MgYW5kIHJ1bnRpbWUgc2VydmljZXMKLSAgICAgICAgICAgICAgICBzZXR0aW5ncwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmFibGUtcnVudGltZS1zZXJ2aWNlcyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50LiBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIEpNWCBNQmVhbiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGluZyBydW50aW1lIHNlcnZpY2VzIGlzIGRlcGxveWVkLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuYWJsZS1qdGEiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudC4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgc2Vzc2lvbiB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ3JhdGUgd2l0aCB0aGUgSlRBIChpLmUuIHdoZXRoZXIgdGhlIHNlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYSB0cmFuc2FjdGlvbiBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcy4gVGhlIGNob2ljZSBvZiBzZXJ2ZXItY2xhc3Mgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBiZSBjaG9zZW4gYmFzZWQgb24gdGhlIHRyYW5zYWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9tLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLnNlcnZlci5DdXN0b21TZXJ2ZXJQbGF0Zm9ybSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBzdWJjbGFzcyBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5zZXJ2ZXIuUGxhdGZvcm1CYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNwZWNpZnkgd2hpY2ggc2VydmVyIHBsYXRmb3JtIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImV4dGVybmFsLXRyYW5zYWN0aW9uLWNvbnRyb2xsZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai05MDMtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotOTA0LXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTEwMTItcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotMTAxMy1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai0xMTExLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTYxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy03MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtODEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTktcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTEwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNDAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS01MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTUxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNjAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS02MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTctcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Impib3NzLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLWJyb2tlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBQcm92aWRlcyBhIHNpbmdsZSB2aWV3IHRvIGEgc2Vzc2lvbiB0aGF0Ci0gICAgICAgICAgICAgICAgdHJhbnNwYXJlbnRseSBhY2Nlc3NlcyBtdWx0cGxlIGRhdGFiYXNlcy4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXNzaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icHJvamVjdCI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ4bWwiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InByb2plY3QiIC8+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2xhc3MiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InByb2plY3QiIC8+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLXNlc3Npb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhlIHNlc3Npb24gaXMgdGhlIHByaW1hcnkgaW50ZXJmYWNlIGludG8gRWNsaXBzZUxpbmssIHRoZQotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNob3VsZCBkbyBhbGwgb2YgaXRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgb2YKLSAgICAgICAgICAgICAgICBvYmplY3RzIHRocm91Z2ggdGhlIHNlc3Npb24uIFRoZSBzZXNzaW9uIGFsc28gbWFuYWdlcwotICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9ucyBhbmQgdW5pdHMgb2Ygd29yay4gVGhlIGRhdGFiYXNlIHNlc3Npb24gaXMKLSAgICAgICAgICAgICAgICBpbnRlbmRlZCBmb3IgdXNhZ2UgaW4gdHdvLXRpZXIgY2xpZW50LXNlcnZlcgotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9ucy4gQWx0aG91Z2ggaXQgY291bGQgYmUgdXNlZCBpbiBhIHNlcnZlcgotICAgICAgICAgICAgICAgIHNpdHVhdGlvbiwgaXQgaXMgbGltaXR0ZWQgdG8gb25seSBoYXZpbmcgYSBzaW5nbGUKLSAgICAgICAgICAgICAgICBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBvbmx5IGFsbG93cyBhIHNpbmdsZSBvcGVuCi0gICAgICAgICAgICAgICAgZGF0YWJhc2UgdHJhbnNhY3Rpb24uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2Vzc2lvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnktcHJvamVjdCIgdHlwZT0icHJvamVjdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHByb2plY3QgKGNsYXNzIG9yIHhtbCkgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQgYXMgdGhlIHByaW1hcnkgcHJvamVjdCBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZGRpdGlvbmFsLXByb2plY3QiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJwcm9qZWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWwgcHJvamVjdHMgd2lsbCBoYXZlIHRoZWlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzIGFwcGVuZGVkIHRvIHRoZSBwcmltYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dpbiIgdHlwZT0ibG9naW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmVyLXNlc3Npb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgSXMgYW4gZXh0ZW5zaW9uIG9mIGEgRGF0YWJhc2VTZXNzaW9uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2Utc2Vzc2lvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbHMiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbiBwb29scyBhcmUgb25seSBmb3IgdXNhZ2Ugd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCBjb25uZWN0aW9uIHBvb2xpbmcgYW5kIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYmUgdXNlZCBpZiB1c2luZyBleHRlcm5hbCBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWQtY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icmVhZC1jb25uZWN0aW9uLXBvb2wiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJ3cml0ZS1jb25uZWN0aW9uLXBvb2wiIHR5cGU9ImNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJzZXF1ZW5jZS1jb25uZWN0aW9uLXBvb2wiIHR5cGU9ImNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhpcyB0YWcgdG8gdXNlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSBjb25uZWN0aW9uIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImNvbm5lY3Rpb24tcG9vbCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1wb2xpY3kiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJjb25uZWN0aW9uLXBvbGljeSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbm5lY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFVzZWQgdG8gc3BlY2lmeSBob3cgZGVmYXVsdCBjbGllbnQgc2Vzc2lvbnMgYXJlIGFjcXVpcmVkCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1c2l2ZS1jb25uZWN0aW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBpZiBhbiBleGNsdXNpdmUgY29ubmVjdGlvbiBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgZm9yIHJlYWRzLCByZXF1aXJlZCBmb3IgVlBELCBvciB1c2VyIGJhc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICByZWFkIHNlY3VyaXR5LgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxhenkiIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgaWYgYSBjb25uZWN0aW9uIHNob3VsZCBiZSBhY3F1aXJlZCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlbGQgdXBmcm9udCBpbiB0aGUgY2xpZW50IHNlc3Npb24sIG9yIG9ubHkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkIHdoZW4gbmVlZGVkIGFuZCB0aGVuIHJlbGVhc2VkLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgY29tbW9uIGZpZWxkcyBmb3IgZGF0YWJhc2UtbG9naW4gYW5kIGVpcy1sb2dpbgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwbGF0Zm9ybS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlIHBsYXRmb3JtCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBuYW1lCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlci1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgbG9naW4gYXMgd2VsbCBhcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlIFN5bmNocm9uaXphdGlvbiBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5jcnlwdGlvbi1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5zZWN1cml0eS5KQ0VFbmNyeXB0b3IiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBsb2dpbiBhcyB3ZWxsIGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgU3luY2hyb25pemF0aW9uIGZlYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGxvZ2luIGFzIHdlbGwgYXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZSBTeW5jaHJvbml6YXRpb24gZmVhdHVyZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLXF1YWxpZmllciIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRoZSBkZWZhdWx0IHF1YWxpZmllciBmb3IgYWxsIHRhYmxlcy4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIHRoZSBjcmVhdG9yIG9mIHRoZSB0YWJsZSBvciBkYXRhYmFzZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGFibGUgZXhpc3RzIG9uLiBUaGlzIGlzIHJlcXVpcmVkIGJ5IHNvbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlcyBzdWNoIGFzIE9yYWNsZSBhbmQgREIyLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVybmFsLWNvbm5lY3Rpb24tcG9vbGluZyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBzaG91bGQgdXNlIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBjb25uZWN0aW9uIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlcm5hbC10cmFuc2FjdGlvbi1jb250cm9sbGVyIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRvIHRydWUgaWYgdGhlIHNlc3Npb24gd2lsbCBiZSB1c2luZyBhbgotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgdHJhbnNhY3Rpb24gY29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jaW5nIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LXNlcXVlbmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InNlcXVlbmNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBzZXF1ZW5jZS4gVGhlIG5hbWUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsLiBJZiBubyBuYW1lIHByb3ZpZGVkIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSBzdHJpbmcgd2lsbCBiZSB1c2VkIGFzIGEgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb24gZGVmYXVsdCBzZXF1ZW5jZXMuIE1ha2Ugc3VyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBzZXF1ZW5jZSBoYXMgdW5pcXVlIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InNlcXVlbmNlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIGEgbG9naW4uCi0gICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyB1c2VkIHRvIGRlZmluZSBleHRyYSBwcm9wZXJ0aWVzIG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgbG9naW4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIEhvbGRzIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBjb25uZWN0Ci0gICAgICAgICAgICAgICAgdG8gYSBKREJDIGRyaXZlci4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2dpbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRyaXZlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZHJpdmVyIGNsYXNzIGlzIHRoZSBKYXZhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgZm9yIHRoZSBKREJDIGRyaXZlciB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgKGUuZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW4uamRiYy5vZGJjLkpkYmNPZGJjRHJpdmVyLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXVybCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBVUkwgdGhhdCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRhdGFzb3VyY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgVVJMIG9mIGEgZGF0YXNvdXJjZSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgYmUgdXNlZCBieSB0aGUgc2Vzc2lvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsb29rdXAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Imxvb2t1cC1lbnVtIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmluZC1hbGwtcGFyYW1ldGVycyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gYmluZCBhbGwgYXJndW1lbnRzIHRvIGFueQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUwgc3RhdGVtZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtYWxsLXN0YXRlbWVudHMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciBwcmVwYXJlZCBzdGF0ZW1lbnRzIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjYWNoZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJieXRlLWFycmF5LWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgYmluZGluZyBmb3IgbGFyZ2UgYmluYXJ5IGRhdGEuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgRWNsaXBzZUxpbmsgd2lsbCBwcmludCB0aGlzIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgaGV4IHRocm91Z2ggdGhlIEpEQkMgYmluYXJ5IGV4Y2FwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF1c2UuIEJvdGggYmluZGluZyBhbmQgcHJpbnRpbmcgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpb3VzIGxpbWl0cyBvbiBhbGwgZGF0YWJhc2VzIChlLmcuIDVrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMzJrKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cmluZy1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRvIHRydWUgaWYgc3RyaW5ncyBzaG91bGQgYmUgYm91bmQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgdG8gaGVscCBiZWFuIGludHJvc3BlY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJlYW1zLWZvci1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIHN0cmVhbXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3RvcmUgbGFyZ2UgYmluYXJ5IGRhdGEuIFRoaXMgY2FuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHJvdmUgdGhlIG1heCBzaXplIGZvciByZWFkaW5nL3dyaXRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gc29tZSBKREJDIGRyaXZlcnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JjZS1maWVsZC1uYW1lcy10by11cHBlci1jYXNlIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBzZXR0aW5nIGNhbiBiZSB1c2VkIGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBleHBlY3RzIHVwcGVyIGNhc2UgYnV0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSBkb2VzIG5vdCByZXR1cm4gY29uc2lzdGVudCBjYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIGRpZmZlcmVudCBkYXRhYmFzZXMpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pemUtZGF0YS1jb252ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciBkcml2ZXIgbGV2ZWwgZGF0YSBjb252ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbiBpcyBlbmFibGVkLiBUaGlzIGNhbiBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCBhcyBzb21lIGRyaXZlcnMgcGVyZm9ybSBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gdGhlbXNlbHZlcyBpbmNvcnJlY3RseS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyaW0tc3RyaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCBDSEFSIGZpZWxkIHZhbHVlcyBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nIGJsYW5rcyB0cmltbWVkLCB0aGlzIGNhbiBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtd3JpdGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZSBiYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nLiBUaGlzIGZhY2lsaXR5IGFsbG93cyBtdWx0aXBsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSBvcGVyYXRpb25zIHRvIGJlIHN1Ym1pdHRlZCB0byBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlIGZvciBwcm9jZXNzaW5nIGF0IG9uY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Ym1pdHRpbmcgbXVsdGlwbGUgdXBkYXRlcyB0b2dldGhlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBpbmRpdmlkdWFsbHksIGNhbiBncmVhdGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHJvdmUgcGVyZm9ybWFuY2UgaW4gc29tZSBzaXR1YXRpb25zLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamRiYy1iYXRjaC13cml0aW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nIHRoaXMgdGFnIHdpdGggdHJ1ZSBpbmRpY2F0ZXMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgdGhhdCB0aGUgSkRCQyBkcml2ZXIgc3VwcG9ydHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2ggd3JpdGluZy4gRWNsaXBzZUxpbmsncyBpbnRlcm5hbCBiYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nIGlzIGRpc2FibGVkLiBTZXR0aW5nIHRoaXMgdGFnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggZmFsc2UgaW5kaWNhdGVzIHRvIEVjbGlwc2VMaW5rIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpEQkMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgYmF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGluZy4gVGhpcyB3aWxsIHJldmVydCB0byB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvdXIgd2hpY2ggaXMgdG8gZGVsZWdhdGUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsncyBpbnRlcm5hbCBiYXRjaCB3cml0aW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWF4LWJhdGNoLXdyaXRpbmctc2l6ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIzMjAwMCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93IGZvciB0aGUgbWF4IGJhdGNoIHdyaXRpbmcgc2l6ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzZXQuIFRoaXMgYWxsb3dzIGZvciB0aGUgYmF0Y2ggc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBsaW1pdGVkIGFzIG1vc3QgZGF0YWJhc2UgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3QgbGltaXRzLiBUaGUgc2l6ZSBpcyBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzLCB0aGUgZGVmYXVsdCBpcyAzMjAwMCBidXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWwgdmFsdWUgZGVwZW5kcyBvbiB0aGUgZGF0YWJhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hdGl2ZS1zcWwiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2Ugc3BlY2lmaWMgc3FsIGdyYW1tYXIgbm90IEpEQkMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWMuIFRoaXMgaXMgYmVjYXVzZSB1bmZvcnR1bmF0ZWx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWUgYnJpZGdlcyB0byBub3Qgc3VwcG9ydCB0aGUgZnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKREJDIHN0YW5kYXJkLiBCeSBkZWZhdWx0IEVjbGlwc2VMaW5rIHVzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEpEQkMgc3FsIGdyYW1tYXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVycyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJzdHJ1Y3QtY29udmVydGVycyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1oZWFsdGgtdmFsaWRhdGVkLW9uLWVycm9yIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgdHJ1ZSB3aWxsIGNhdXNlIEVjbGlwc2VMaW5rIHRvIHBpbmcgZGF0YWJhc2UgdG8gZGV0ZXJtaW5lIGlmIGFuIFNRTEV4Y2VwdGlvbiB3YXMgY2F1c2UgYnkgYSBjb21tdW5pY2F0aW9uIGZhaWx1cmU8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5LXJldHJ5LWF0dGVtcHQtY291bnQiIHR5cGU9InhzZDppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgdGhlIG51bWJlciBvZiBhdHRlbXB0cyBFY2xpcHNlTGluayB3aWxsIG1ha2UgaWYgRWNsaXBzZUxpbmsgaXMgYXR0ZW1wdGluZyB0byByZXRyeSBhIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZGVsYXktYmV0d2Vlbi1yZWNvbm5lY3QtYXR0ZW1wdHMiIHR5cGU9InhzZDppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgdGhlIHRpbWUgaW4gbWlsaXNlY29uZHMgdGhhdCBFY2xpcHNlTGluayB3aWxsIHdhaXQgYmV0d2VlbiBhdHRlbXB0cyB0byByZWNvbm5lY3QgaWYgRWNsaXBzZUxpbmsgaXMgYXR0ZW1wdGluZyB0byByZXRyeSBhIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icGluZy1zcWwiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk92ZXJyaWRlIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBTUUwgdGhhdCBFY2xpcHNlTGluayB3aWxsIGlzc3VlIHRvIGEgY29ubmVjdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgbGl2ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Imxvb2t1cC1lbnVtIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBvc2l0ZS1uYW1lIiAvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29tcG91bmQtbmFtZSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gYW5kIGRhdGFzb3VyY2UKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLiBUaGVyZSBhcmUgdGhyZWUgd2F5cyB0byBjb25uZWN0IHRocm91Z2ggRUlTLAotICAgICAgICAgICAgICAgIC0gUHJvdmlkZSBhIEpOREkgbmFtZSB0byB0aGUgQ29ubmVjdGlvbkZhY3RvcnkgYW5kIHVzZQotICAgICAgICAgICAgICAgIHRoZSBkZWZhdWx0IGdldENvbm5lY3Rpb24gLSBQcm92aWRlIGEgSk5ESSBuYW1lIHRvIHRoZQotICAgICAgICAgICAgICAgIENvbm5lY3Rpb25GYWN0b3J5LCBhbmQgYSBkcml2ZXIgc3BlY2lmaWMgQ29ubmVjdGlvblNwZWMKLSAgICAgICAgICAgICAgICB0byBwYXNzIHRvIHRoZSBnZXRDb25uZWN0aW9uIC0gQ29ubmVjdCBpbiBhIG5vbi1tYW5hZ2VkCi0gICAgICAgICAgICAgICAgd2F5IGRpcmVjdGx5IHRvIHRoZSBkcml2ZXIgc3BlY2lmaWMgQ29ubmVjdGlvbkZhY3RvcnkgQW4KLSAgICAgICAgICAgICAgICBFSVNDb25uZWN0aW9uU3BlYyBtdXN0IGJlIHByb3ZpZGVkIHRvIGRlZmluZSBob3cgdG8KLSAgICAgICAgICAgICAgICBjb25uZWN0IHRvIHRoZSBFSVMgYWRhcHRlci4gVGhlIEVJUyBwbGF0Zm9ybSBjYW4gYmUgdXNlZAotICAgICAgICAgICAgICAgIHRvIHByb3ZpZGUgZGF0YXNvdXJjZS9kcml2ZXIgc3BlY2lmaWMgYmVoYXZvaXIgc3VjaCBhcwotICAgICAgICAgICAgICAgIEludGVyYWN0aW9uU3BlYyBhbmQgUmVjb3JkIGNvbnZlcnNpb24uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9naW4iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXNwZWMtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWZhY3RvcnktdXJsIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1sb2dpbiI+Ci0gICAgCTx4c2Q6YW5ub3RhdGlvbj4KLSAgICAJCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAJCQlEZWZpbmVzIGxvZ2luIGFuZCBwbGF0Zm9ybSB0eXBlIHRvIGJlIHVzZWQKLSAgICAJCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgCTwveHNkOmFubm90YXRpb24+Ci0gICAgCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2dpbiI+Ci0gICAgCQkJPHhzZDpzZXF1ZW5jZT4KLSAgICAJCQkJPHhzZDplbGVtZW50IG5hbWU9ImVxdWFsLW5hbWVzcGFjZS1yZXNvbHZlcnMiCi0gICAgCQkJCQl0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiPgotICAgIAkJCQk8L3hzZDplbGVtZW50PgotICAgIAkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSIKLSAgICAJCQkJCW1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIgotICAgIAkJCQkJdHlwZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0KLSAgICAJCQkJPC94c2Q6ZWxlbWVudD4KLSAgICAJCQk8L3hzZDpzZXF1ZW5jZT4KLSAgICAJCTwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25uZWN0aW9uLXBvb2wiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVXNlZCB0byBzcGVjaWZ5IGhvdyBjb25uZWN0aW9ucyBzaG91bGQgYmUgcG9vbGVkIGluIGEKLSAgICAgICAgICAgICAgICBzZXJ2ZXIgc2Vzc2lvbi4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXgtY29ubmVjdGlvbnMiIHR5cGU9InhzZDppbnRlZ2VyIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWF4IG51bWJlciBvZiBjb25uZWN0aW9ucyB0aGF0IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgaW4gdGhlIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtaW4tY29ubmVjdGlvbnMiIHR5cGU9InhzZDppbnRlZ2VyIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWluIG51bWJlciBvZiBjb25uZWN0aW9ucyB0aGF0IHdpbGwgYXdheXMgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBwb29sCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9naW4iIHR5cGU9ImxvZ2luIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC1jb25uZWN0aW9uLXBvb2wiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhlIHJlYWQgY29ubmVjdGlvbiBwb29sIGlzIHVzZWQgZm9yIHJlYWQgYWNjZXNzIHRocm91Z2gKLSAgICAgICAgICAgICAgICB0aGUgc2VydmVyIHNlc3Npb24uIEFueSBvZiB0aGUgY29ubmVjdGlvbiBwb29scyBjYW4gYmUKLSAgICAgICAgICAgICAgICB1c2VkIGZvciB0aGUgcmVhZCBwb29sIGhvd2V2ZXIgdGhpcyBpcyB0aGUgZGVmYXVsdC4gVGhpcwotICAgICAgICAgICAgICAgIHBvb2wgYWxsb3dzIGZvciBjb25jdXJyZW50IHJlYWRzIGFnYWluc3QgdGhlIHNhbWUgSkRCQwotICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gYW5kIHJlcXVpcmVzIHRoYXQgdGhlIEpEQkMgY29ubmVjdGlvbiBzdXBwb3J0Ci0gICAgICAgICAgICAgICAgY29uY3VycmVudCByZWFkIGFjY2Vzcy4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb25uZWN0aW9uLXBvb2wiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdXNpdmUiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zIGZyb20gdGhlIHJlYWQgY29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sIGFyZSBleGNsdXNpdmUgb3Igbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIGNvbW1vbiBsb2dnaW5nIG9wdGlvbnMKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqYXZhLWxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBvcHRpb25zIG9mIHRoZSBKYXZhIGxvZwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2dpbmctb3B0aW9ucyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImxvZ2dpbmctb3B0aW9ucyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVjbGlwc2VsaW5rLWxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBvcHRpb25zIG9mIHRoZSBFY2xpcHNlTGluayBsb2cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2ciPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2ctbGV2ZWwiIGRlZmF1bHQ9ImluZm8iCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgbG9nIGxldmVsIGZvciBsb2dnaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib2ZmIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzZXZlcmUiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Indhcm5pbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImluZm8iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbmZpZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluZXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmVzdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lIG9mIHRoZSBmaWxlIHRvIHdyaXRlIHRoZSBsb2dnaW5nIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dnaW5nLW9wdGlvbnMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJsb2dnaW5nLW9wdGlvbnMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2ZXItbG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG9wdGlvbnMgb2YgdGhlIFNlcnZlciBsb2cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2ciIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9nZ2luZy1vcHRpb25zIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2ctZXhjZXB0aW9uLXN0YWNrdHJhY2UiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIGV4Y2VwdGlvbiBzdGFja3RyYWNlLiBXaXRob3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGVsZW1lbnQsIHRoZSBzdGFja3RyYWNlIGlzIGxvZ2dlZCBmb3IgRklORVIKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yIGxlc3MgKEZJTkVTVCkKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmludC10aHJlYWQiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIHRocmVhZC4gV2l0aG91dCB0aGlzIGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGhyZWFkIGlzIGxvZ2dlZCBmb3IgRklORSBvciBsZXNzIChGSU5FUiBvcgotICAgICAgICAgICAgICAgICAgICAgICAgRklORVNUKQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LXNlc3Npb24iIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgc2Vzc2lvbi4gV2l0aG91dCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LCB0aGUgc2Vzc2lvbiBpcyBhbHdheXMgcHJpbnRlZAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LWNvbm5lY3Rpb24iIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgY29ubmVjdGlvbi4gV2l0aG91dCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LCB0aGUgY29ubmVjdGlvbiBpcyBhbHdheXMgcHJpbnRlZAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LWRhdGUiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgZGF0ZS4gV2l0aG91dCB0aGlzIGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0ZSBpcyBhbHdheXMgcHJpbnRlZAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSB0cmFuc3BvcnQgbWVjaGFuaXNtIG9mIHRoZSBSQ00uCi0gICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHJhbnNwb3J0IG1lY2hhbmlzbSBpcyBSTUkKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib24tY29ubmVjdGlvbi1lcnJvciIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJEaXNjYXJkQ29ubmVjdGlvbiIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBhbmQgaGFzIHZhbHVlIG9mICJEaXNjYXJkQ29ubmVjdGlvbiIgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICJLZWVwQ29ubmVjdGlvbiIuIEl0IGRldGVybWluZXMgd2hldGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiB0byBhIFJDTSBzZXJ2aWNlIHNob3VsZCBiZSBkcm9wcGVkIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBhIGNvbW11bmljYXRpb24gZXJyb3Igd2l0aCB0aGF0IFJDTQotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgZWxlbWVudCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2NhcmRDb25uZWN0aW9uIi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktlZXBDb25uZWN0aW9uIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2FyZENvbm5lY3Rpb24iIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJtaS10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGVmaW5lcyB0aGUgUk1JIHRyYW5zcG9ydCBtZWNoYW5pc20uIFRoZQotICAgICAgICAgICAgICAgIGRlZmF1bHQgbmFtaW5nIHNlcnZpY2UgaXMgSk5ESQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VuZC1tb2RlIiBkZWZhdWx0PSJBc3luY2hyb25vdXMiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1pIGVsZW1lbnQgYW5kIGhhcyB2YWx1ZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXN5bmNocm9ub3VzIiBvciAiU3luY2hyb25vdXMiLiBJdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIFJDTSBwcm9wYWdhdGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgYW5kIGRvZXMgbm90IHdhaXQgZm9yIGNvbW1hbmQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoIGl0cyBleGVjdXRpb24gaW4gYXN5bmNocm9ub3VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgb3Igd2FpdCBmb3IgY29tbWFuZCB0byBmaW5pc2ggaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbiBpbiBzeW5jaHJvbm91cyBtb2RlLiBUaGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzeW5jaHJvbm91cyIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXN5bmNocm9ub3VzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeW5jaHJvbm91cyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjb3ZlcnkiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybWkgZWxlbWVudC4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNjb3Zlcnkgc2V0dGluZ3Mgc2hvdWxkIGJlIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBhIGRlZmF1bHQgRGlzY292ZXJ5IHdpdGggaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgc2V0dGluZ3MgaXMgY3JlYXRlZCB3aGVuIHRoZSBybWkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBpcyBzcGVjaWZpZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ibXVsdGljYXN0LWdyb3VwLWFkZHJlc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSIyMjYuMTAuMTIuNjQiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im11bHRpY2FzdC1wb3J0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjMxMjEiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFubm91bmNlbWVudC1kZWxheSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIxMDAwIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgZGlzY292ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbmVudC4gSXQgZGV0ZXJtaW5lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRoZSBtdWx0aWNhc3QgZ3JvdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBzaG91bGQgYmUgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGlzICIxMDAwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFja2V0LXRpbWUtdG8tbGl2ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIyIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgZGlzY292ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbmVudC4gSXQgZGV0ZXJtaW5lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRoZSB0aW1lLXRvLWxpdmUgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhY2tldHMgdGhhdCBhcmUgc2VudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBEaXNjb3ZlcnkncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWxzdGljYXN0IHNvY2tldCBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZC4gVGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhpcyBlbGVtZW50IGlzICIyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam5kaS1uYW1pbmctc2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqbmRpLW5hbWluZy1zZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icm1pLXJlZ2lzdHJ5LW5hbWluZy1zZXJ2aWNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBybWkgZWxlbWVuZW50LiBJdCBkZXRlcm1pbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIFJNSSByZWdpc3RyeSBzaG91bGQgYmUgdXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWluZyBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJtaS1paW9wLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgUk1JLUlJT1AgdHJhbnNwb3J0IG1lY2hhbmlzbSBvZgotICAgICAgICAgICAgICAgIHRoZSBSQ00uIFRoZSBkZWZhdWx0IG5hbWluZyBzZXJ2aWNlIGlzIEpOREkKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJybWktdHJhbnNwb3J0IiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imptcy10b3BpYy10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIEpNUyB0b3BpYyB0cmFuc3BvcnQgbWVjaGFuaXNtCi0gICAgICAgICAgICAgICAgb2YgdGhlIFJDTQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtaG9zdC11cmwiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1jb25uZWN0aW9uLWZhY3RvcnktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIGRlZmF1bHQ9Imptcy9FY2xpcHNlTGlua1RvcGljQ29ubmVjdGlvbkZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iam1zL0VjbGlwc2VMaW5rVG9waWMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpuZGktbmFtaW5nLXNlcnZpY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqbmRpLW5hbWluZy1zZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotamdyb3Vwcy10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIE9DNEogSkdyb3VwcyB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICBtZWNoYW5pc20gb2YgdGhlIFJDTQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlLXNpbmdsZS10aHJlYWRlZC1ub3RpZmljYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3VuLWNvcmJhLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgU3VuIENPUkJBIHRyYW5zcG9ydCBtZWNoYW5pc20KLSAgICAgICAgICAgICAgICBvZiB0aGUgUkNNCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idXNlci1kZWZpbmVkLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgYSB1c2VyIGltcGxlbWVudGVkCi0gICAgICAgICAgICAgICAgdHJhbnNwb3J0IG1lY2hhbmlzbSB0aGF0IHNob3VsZCBiZSB1c2VkLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNwb3J0LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqbmRpLW5hbWluZy1zZXJ2aWNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgam5kaS1uYW1pbmctc2VydmljZS4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgVVJMIGZvciBuYW1pbmcgc2VydmljZSBzaG91bGQgYmUgY2hhbmdlZC4gCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlci1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImFkbWluIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5jcnlwdGlvbi1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5zZWN1cml0eS5KQ0VFbmNyeXB0b3IiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InBhc3N3b3JkIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8IS0tICBUT0RPOiBOZWVkIHRvIGhhdmUgYSBub24gV2ViTG9naWMgKHByZXZpb3VzbHkgT0M0SikgZGVmYXVsdCBvciByb3V0ZSB0aHJvdWdoIHNlcnZlciBwbGF0Zm9ybSBieSBkZWZhdWx0IC0tPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXRpYWwtY29udGV4dC1mYWN0b3J5LW5hbWUiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ3ZWJsb2dpYy5qbmRpLldMSW5pdGlhbENvbnRleHRGYWN0b3J5IgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgam5kaS1uYW1pbmctc2VydmljZS4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbCBjb250ZXh0IGZhY3RvcnkgY2xhc3MgZm9yIG5hbWluZyBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgY2hhbmdlZC4gCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgam5kaS1uYW1pbmctc2VydmljZS4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1pbmcgc2VydmljZSByZXF1aXJlcyBleHRyYSBwcm9wZXJ0eSB0aGF0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBub3QgZGVmaW5lZCBieSBFY2xpcHNlTGluayBidXQgaXQgaXMgcmVxdWlyZWQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VyIGFwcGxpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpncm91cCBuYW1lPSJldmVudC1saXN0ZW5lci1jbGFzc2VzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJldmVudC1saXN0ZW5lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpncm91cD4KLSAgICA8eHNkOmdyb3VwIG5hbWU9InN0cnVjdC1jb252ZXJ0ZXJzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmdyb3VwPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2Ugb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSI1MCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlIHByZWFsbG9jYXRpb24gc2l6ZS4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWZhdWx0LXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFJlZmVyZW5jZXMgZGVmYXVsdCBzZXF1ZW5jZSBvYmplY3QsIG92ZXJyaWRpbmcgaXRzIG5hbWUKLSAgICAgICAgICAgICAgICBhbmQgKG9wdGlvbmFsbHkpIHByZWFsbG9jYXRpb24gc2l6ZS4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVG8gdXNlIHByZWFsbG9jYXRpb24gc2l6ZSBvZiBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwKLSAgICAgICAgICAgICAgICBzZXQgcHJlYWxsb2NhdGlvbiBzaXplIHRvIDAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYXRpdmUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2Ugc2VxdWVuY2UgbWVjaGFuaXNtIHVzZWQuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGFibGUgc2VxdWVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUVVFTkNFIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUtZmllbGQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFfTkFNRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3VudGVyLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRX0NPVU5UIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmFyeS10YWJsZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBVbmFyeSB0YWJsZSBzZXF1ZW5jZSAtIHNlcXVlbmNlIG5hbWUgaXMgYSB0YWJsZSBuYW1lLAotICAgICAgICAgICAgICAgIHRhYmxlIGhhcyBhIHNpbmdsZSBmaWVsZCBhbmQgYSBzaW5nbGUgcm93Ci0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3VudGVyLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRVUVOQ0UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbGZpbGUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sZmlsZSBzZXF1ZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlhtbCBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvb3QtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUVVFTkNFIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUV9OQU1FIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdW50ZXItZWxlbWVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIGRlZmF1bHQ9IlNFUV9DT1VOVCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHdoaWNoIGRvY3VtZW50IHByZXNlcnZhdGlvbgotICAgICAgICAJCXN0cmF0ZWd5IHdpbGwgYmUgdXNlZC4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgCQk8eHNkOmVsZW1lbnQgbmFtZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiCi0gICAgCQkJdHlwZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIj4KLSAgICAJCTwveHNkOmVsZW1lbnQ+Ci0gICAgCTwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgCTx4c2Q6YW5ub3RhdGlvbj4KLSAgICAJCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAJCQlUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHdoaWNoIG5vZGUgb3JkZXJpbmcgc3RyYXRlZ3kgd2lsbAotICAgIAkJCWJlIHVzZWQuCi0gICAgCQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIAk8L3hzZDphbm5vdGF0aW9uPjwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZQotICAgIAluYW1lPSJkZXNjcmlwdG9yLWxldmVsLWRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgRG9jdW1lbnRQcmVzZXJ2YXRpb24gUG9saWN5IHRoYXQKLSAgICAgICAgCQlhY2Nlc3NlcyB0aGUgc2Vzc2lvbiBjYWNoZSB0byBzdG9yZSBPYmplY3RzIGFuZCB0aGVpcgotICAgICAgICAJCWFzc29jaWF0ZWQgbm9kZXMuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm8tZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBIERvY3VtZW50UHJlc2VydmF0aW9uUG9saWN5IHRvIGluZGljYXRlIHRoYXQgbm8KLSAgICAgICAgCQlkb2N1bWVudCBwcmVzZXJ2YXRpb24gd29yayBzaG91bGQgYmUgZG9uZS4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYmluZGVyLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBEb2N1bWVudFByZXNlcnZhdGlvblBvbGljeSB0aGF0Ci0gICAgICAgIAkJbWFpbnRhaW5zIGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIEphdmEKLSAgICAgICAgCQlPYmplY3RzIGFuZCB0aGUgWE1MTm9kZXMgdGhleSBvcmlnaW5hdGVkIGZyb20uCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwZW5kLW5ldy1lbGVtZW50cy1vcmRlcmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgTm9kZU9yZGVyaW5nUG9saWN5IHRoYXQgc2ltcGx5Ci0gICAgICAgIAkJYXBwZW5kcyB0aGUgbmV3IGNoaWxkIGVsZW1lbnQgdG8gdGhlIHBhcmVudC4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWdub3JlLW5ldy1lbGVtZW50cy1vcmRlcmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgTm9kZU9yZGVyaW5nUG9saWN5IHRoYXQgaWdub3JlcyBhbnkKLSAgICAgICAgCQluZXcgZWxlbWVudHMgd2hlbiB1cGRhdGluZyBhIGNhY2hlZCBkb2N1bWVudC4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpdmUtcG9zaXRpb24tb3JkZXJpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIE5vZGVPcmRlcmluZ1BvbGljeSB0aGF0IGFkZHMgbmV3Ci0gICAgICAgIAkJZWxlbWVudHMgdG8gYW4gWE1MIERvY3VtZW50IGJhc2VkIG9uIHRoZSBsYXN0IHVwZGF0ZWQKLSAgICAgICAgCQlzaWJsaW5nIGluIHRoZWlyIGNvbnRleHQuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vZWNsaXBzZWxpbmsvY29yZS9KcHRDb21tb25FY2xpcHNlTGlua0NvcmVQbHVnaW4uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9lY2xpcHNlbGluay9jb3JlL0pwdENvbW1vbkVjbGlwc2VMaW5rQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGNiNDU2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9lY2xpcHNlbGluay9jb3JlL0pwdENvbW1vbkVjbGlwc2VMaW5rQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIEpwdENvbW1vbkVjbGlwc2VMaW5rQ29yZVBsdWdpbgotCQlleHRlbmRzIFBsdWdpbiB7Ci0JCi0JLy8gKioqKioqKioqKiBwdWJsaWMgY29uc3RhbnRzICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBUaGUgcGx1Zy1pbiBpZGVudGlmaWVyIG9mIHRoZSBqcHQgY29tbW9uIGNvcmUgc3VwcG9ydAotCSAqICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUiOyAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRF8gPSBQTFVHSU5fSUQgKyAnLic7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBzaW5nbGV0b24gKioqKioqKioqKgotCQotCXByaXZhdGUgc3RhdGljIEpwdENvbW1vbkVjbGlwc2VMaW5rQ29yZVBsdWdpbiBJTlNUQU5DRTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbiBqcHQgY29tbW9uIGVjbGlwc2VsaW5rIGNvcmUgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdENvbW1vbkVjbGlwc2VMaW5rQ29yZVBsdWdpbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHB1YmxpYyBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgc3RhdHVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgSU5TVEFOQ0UuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotCQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBudWxsKSk7Ci0gICAgfQotCQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiBvciBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCB0aHJvd2FibGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCB0aHJvd2FibGUpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBwbHVnLWluIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoSU5TVEFOQ0UgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIHRoaXMgY29udmVudGlvbiBpcyAqd2FjayouLi4gIH5ianYKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJLy8gbm90aGluZyB5ZXQuLi4KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQkvLyBub3RoaW5nIHlldC4uLgkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlTWVzc2FnZXMuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0pwdENvbW1vbkVjbGlwc2VMaW5rQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YWY3MDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEpwdENvbW1vbkVjbGlwc2VMaW5rQ29yZU1lc3NhZ2VzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3Jfbm9FY2xpcHNlTGlua1ZlcnNpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtMaWJyYXJ5VmFsaWRhdG9yX211bHRpcGxlRWNsaXBzZUxpbmtWZXJzaW9uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3JfaW1wcm9wZXJFY2xpcHNlTGlua1ZlcnNpb247Ci0JCi0JLy8gVE9ETyAtIG1vdmUgdG8ganB0LmpheGIuZWNsaXBzZWxpbmsuY29yZSB3aGVuIHRoZXJlIGFyZSBtZXNzYWdlcyB0aGVyZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVMSmF4YlVzZXJMaWJyYXJ5VmFsaWRhdG9yX25vWGpjQ2xhc3NlczsKLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianB0X2NvbW1vbl9lY2xpcHNlbGlua19jb3JlIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdENvbW1vbkVjbGlwc2VMaW5rQ29yZU1lc3NhZ2VzLmNsYXNzOwotCQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7Ci0JfQotCQotCXByaXZhdGUgSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2xpYnZhbC9FY2xpcHNlTGlua0xpYlZhbFV0aWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2xpYnZhbC9FY2xpcHNlTGlua0xpYlZhbFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkNTJhYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9saWJ2YWwvRWNsaXBzZUxpbmtMaWJWYWxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5saWJ2YWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlRvb2xGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNsYXNzRmlsZVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklGaWVsZEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLkpwdENvbW1vbkVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTGliVmFsVXRpbCB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFZFUlNJT05fQ0xBU1NfUEFUSCA9ICJvcmcvZWNsaXBzZS9wZXJzaXN0ZW5jZS9WZXJzaW9uLmNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBWRVJTSU9OX0ZJRUxEX05BTUUgPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGUoSXRlcmFibGU8SUNsYXNzcGF0aEVudHJ5PiBsaWJyYXJ5RW50cmllcywgU2V0PFZlcnNpb25SYW5nZT4gdmVyc2lvblJhbmdlcykgewotCQlWZXJzaW9uIHZlcnNpb24gPSBudWxsOwotCQlmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IGxpYnJhcnlFbnRyaWVzKSB7Ci0JCQlTdHJpbmcgdmVyc2lvblN0cmluZyA9IG51bGw7Ci0JCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKSB7Ci0JCQkJSUNsYXNzRmlsZVJlYWRlciBjbGFzc1JlYWRlciA9IAotCQkJCQkJVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcigKLQkJCQkJCQllbnRyeS5nZXRQYXRoKCkudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCksIFZFUlNJT05fQ0xBU1NfUEFUSCwgSUNsYXNzRmlsZVJlYWRlci5GSUVMRF9JTkZPUyk7Ci0JCQkJaWYgKGNsYXNzUmVhZGVyICE9IG51bGwpIHsKLQkJCQkJZm9yIChJRmllbGRJbmZvIGZpZWxkIDogY2xhc3NSZWFkZXIuZ2V0RmllbGRJbmZvcygpKSB7Ci0JCQkJCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKGZpZWxkLmdldE5hbWUoKSwgVkVSU0lPTl9GSUVMRF9OQU1FLnRvQ2hhckFycmF5KCkpKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJdmVyc2lvblN0cmluZyA9IGZpZWxkLmdldENvbnN0YW50VmFsdWVBdHRyaWJ1dGUoKS5nZXRDb25zdGFudFZhbHVlKCkuZ2V0U3RyaW5nVmFsdWUoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCS8vIHBvdGVudGlhbGx5IGEgYml0IGNvdWxkIGdvIHdyb25nIHdpdGggdGhhdCBsYXN0IGxpbmUsIGJ1dCBpZiBhbnkKLQkJCQkJCQkJLy8gYXNzdW1wdGlvbnMgYXJlbid0IG1ldCwgdGhlcmUncyBubyB2YWx1ZQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAodmVyc2lvblN0cmluZyAhPSBudWxsKSB7Ci0JCQkJCWlmICh2ZXJzaW9uICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRDb21tb25FY2xpcHNlTGlua0NvcmVQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQlKcHRDb21tb25FY2xpcHNlTGlua0NvcmVNZXNzYWdlcy5FY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3JfbXVsdGlwbGVFY2xpcHNlTGlua1ZlcnNpb25zKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZlcnNpb24gPSBuZXcgVmVyc2lvbih2ZXJzaW9uU3RyaW5nKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKHZlcnNpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsIEpwdENvbW1vbkVjbGlwc2VMaW5rQ29yZVBsdWdpbi5QTFVHSU5fSUQsIAotCQkJCQlKcHRDb21tb25FY2xpcHNlTGlua0NvcmVNZXNzYWdlcy5FY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3Jfbm9FY2xpcHNlTGlua1ZlcnNpb24pOwotCQl9Ci0JCQotCQlmb3IgKFZlcnNpb25SYW5nZSB2ZXJzaW9uUmFuZ2UgOiB2ZXJzaW9uUmFuZ2VzKSB7Ci0JCQlpZiAoISB2ZXJzaW9uUmFuZ2UuaXNJbmNsdWRlZCh2ZXJzaW9uKSkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQkJSVN0YXR1cy5FUlJPUiwgSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlUGx1Z2luLlBMVUdJTl9JRCwgCi0JCQkJCQlKcHRDb21tb25FY2xpcHNlTGlua0NvcmVNZXNzYWdlcy5FY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3JfaW1wcm9wZXJFY2xpcHNlTGlua1ZlcnNpb24pOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLy5jbGFzc3BhdGggYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNGZiMzguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanN0LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLy5jdnNpZ25vcmUgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLy5wcm9qZWN0IGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZkZTk2Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWI3OGRhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBNYXIgMjEgMTc6Mzk6MTMgRURUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJlMDhlYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLkpwdENvbW1vblVpUGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZHJhdzJkO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZTtidW5kbGUtdmVyc2lvbj0iWzMuNy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjEwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMy4xMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIgotRGFsaS1Db21tZW50OiAqTk8qIEVjbGlwc2VMaW5rIGZyaWVuZHMhCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2U7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0OwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWw7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eTsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpheGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5LnN3dDsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpheGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpemFyZHM7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UKLUltcG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS50ZXh0O3ZlcnNpb249IjQuMC4xIgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9hYm91dC5odG1sIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYzc4MGUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2FmOTBlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXBsdWdpbk5hbWU9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIENvbW1vbiBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF9jb21tb25fdWkucHJvcGVydGllcyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvcHJvcGVydHlfZmlsZXMvanB0X2NvbW1vbl91aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDNhMTk1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvcHJvcGVydHlfZmlsZXMvanB0X2NvbW1vbl91aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUJvb2xlYW5fVHJ1ZT1UcnVlCi1Cb29sZWFuX0ZhbHNlPUZhbHNlCi0KLU5vbmVTZWxlY3RlZD08Tm9uZT4KLURlZmF1bHRFbXB0eT1EZWZhdWx0Ci1EZWZhdWx0V2l0aE9uZVBhcmFtPURlZmF1bHQgKHswfSkKLQotQWRkUmVtb3ZlUGFuZV9BZGRCdXR0b25UZXh0PUFkZC4uLgotQWRkUmVtb3ZlUGFuZV9SZW1vdmVCdXR0b25UZXh0PVJlbW92ZQotQ2hvb3NlclBhbmVfYnJvd3NlQnV0dG9uPUJyb3dzZS4uLgotQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dNZXNzYWdlPSZFbnRlciB0eXBlIG5hbWUgcHJlZml4IG9yIHBhdHRlcm4gKCosID8sIG9yIGNhbWVsIGNhc2UpOgotQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dUaXRsZT1DbGFzcyBTZWxlY3Rpb24KLVBhY2thZ2VDaG9vc2VyUGFuZV9kaWFsb2dUaXRsZT1QYWNrYWdlIFNlbGVjdGlvbgotUGFja2FnZUNob29zZXJQYW5lX2RpYWxvZ01lc3NhZ2U9JkVudGVyIHBhY2thZ2UgbmFtZSBwcmVmaXggb3IgcGF0dGVybiAoKiA9IGFueSBzdHJpbmcsID8gPSAgYW55IGNoYXJhY3Rlcik6Ci1FbnVtQ29tYm9WaWV3ZXJfZGVmYXVsdD1EZWZhdWx0ICgpCi1FbnVtQ29tYm9WaWV3ZXJfZGVmYXVsdFdpdGhEZWZhdWx0PURlZmF1bHQgKHswfSkKLU5ld05hbWVTdGF0ZU9iamVjdF9uYW1lTXVzdEJlU3BlY2lmaWVkPUEgbmFtZSBtdXN0IGJlIHNwZWNpZmllZC4KLU5ld05hbWVTdGF0ZU9iamVjdF9uYW1lQWxyZWFkeUV4aXN0cz1BbiBvYmplY3Qgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMuCi0KLU9wdGlvbmFsTWVzc2FnZURpYWxvZ19kb05vdFNob3dXYXJuaW5nPURvIG5vdCBzaG93IHRoaXMgJm1lc3NhZ2UgYWdhaW4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvSnB0Q29tbW9uVWlQbHVnaW4uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvSnB0Q29tbW9uVWlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcyODI3OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL0pwdENvbW1vblVpUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogRGFsaSBVSSBwbHVnLWluLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIEpwdENvbW1vblVpUGx1Z2luIAotCWV4dGVuZHMgSnB0VUlQbHVnaW4KLXsKLQkvLyAqKioqKioqKioqIGNvbnN0YW50cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgcGx1Zy1pbiBpZGVudGlmaWVyIG9mIEpQVCBDb21tb24gVUkgc3VwcG9ydCAodmFsdWUge0B2YWx1ZX0pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRF8gPSBQTFVHSU5fSUQgKyAnLic7Ci0KLQkvLyAqKioqKioqKioqIHNpbmdsZXRvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBKcHRDb21tb25VaVBsdWdpbiBJTlNUQU5DRTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBKUFQgVUkgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdENvbW1vblVpUGx1Z2luIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxvZ2dpbmcgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIElOU1RBTkNFLmxvZ0Vycm9yKG1zZyk7Ci0gICAgfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0gICAgICAgIElOU1RBTkNFLmxvZ0Vycm9yKHRocm93YWJsZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSnB0Q29tbW9uVWlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChJTlNUQU5DRSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gdGhpcyBjb252ZW50aW9uIGlzICp3YWNrKi4uLiAgfmJqdgotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkvLyBub3RoaW5nIHlldC4uLgotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQkvLyBub3RoaW5nIHlldC4uLgotCQl9IGZpbmFsbHkgewotCQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvV2lkZ2V0RmFjdG9yeS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9XaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNzE1NGEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9XaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRhdGVUaW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5IeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotCi0vKioKLSAqIEEgd2lkZ2V0IGZhY3RvcnkgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGFuIFNXVCB3aWRnZXQgYmFzZWQgb24gdGhlIHJpZ2h0Ci0gKiBzdHlsZS4gU29tZSBzdHlsZSBzaG93cyB0aGUgd2lkZ2V0cyBkaWZmZXJlbnRseSwgZm9yIGluc3RhbmNlLCB0aGUgZmxhdCBzdHlsZQotICogc2hvd3MgdGhlIHdpZGdldHMgd2l0aCBsZXNzIGJvcmRlcnMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4KLSAqIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nCi0gKiBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdAotICogY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdpZGdldEZhY3RvcnkgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyByZWd1bGFyIGJ1dHRvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqLwotCUJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBub24tZWRpdGFibGUgY3VzdG9tIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBkZXByZWNhdGVkCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqLwotCUBEZXByZWNhdGVkCi0JQ0NvbWJvIGNyZWF0ZUNDb21ibyhDb21wb3NpdGUgcGFyZW50KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY2hlY2sgYm94IGJ1dHRvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqLwotCUJ1dHRvbiBjcmVhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG5vbi1lZGl0YWJsZSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21ibzwvY29kZT4KLQkgKi8KLQlDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgcGFyZW50KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IERhdGVUaW1lLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBzdHlsZSBUaGUgc3R5bGUgaXMgdG8gdGVsbCB0aGUgdHlwZSBvZiB3aWRnZXQKLQkgKiAoPGNvZGU+U1dULkRBVEU8L2NvZGU+IG9yIDxjb2RlPlNXVC5USU1FPC9jb2RlPiBvciA8Y29kZT5TV1QuQ0FMRU5EQVI8L2NvZGU+KQotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+RGF0ZVRpbWU8L2NvZGU+Ci0JICovCi0JRGF0ZVRpbWUgY3JlYXRlRGF0ZVRpbWUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIGN1c3RvbSA8Y29kZT5DQ29tYm88L2NvZGU+LgotCSAqCi0JICogQGRlcHJlY2F0ZWQKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICovCi0JQERlcHJlY2F0ZWQKLQlDQ29tYm8gY3JlYXRlRWRpdGFibGVDQ29tYm8oQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbWJvPC9jb2RlPgotCSAqLwotCUNvbWJvIGNyZWF0ZUVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRpdGxlZCBwYW5lIChncm91cCBib3gpLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0aXRsZSBUaGUgZ3JvdXAgcGFuZSdzIHRpdGxlCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Hcm91cDwvY29kZT4KLQkgKi8KLQlHcm91cCBjcmVhdGVHcm91cChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGl0bGUpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsYWJlbCB0aGF0IGlzIHNob3duIGFzIGEgaHlwZXJsaW5rLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0IFRoZSBsYWJlbCdzIHRleHQKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkh5cGVybGluazwvY29kZT4KLQkgKi8KLQlIeXBlcmxpbmsgY3JlYXRlSHlwZXJsaW5rKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgbGFiZWwncyB0ZXh0Ci0JICogQHJldHVybiBBIG5ldyA8Y29kZT5MYWJlbDwvY29kZT4KLQkgKi8KLQlMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgbGFiZWxUZXh0KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGlzdC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gc3R5bGUgVGhlIHN0eWxlIGlzIHVzdWFsbHkgdG8gdGVsbCB3aGF0IHR5cGUgb2Ygc2VsZWN0aW9uCi0JICogKDxjb2RlPlNXVC5NVUxUSTwvY29kZT4gb3IgPGNvZGU+U1dULlNJTkdMRTwvY29kZT4pCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5MYWJlbDwvY29kZT4KLQkgKi8KLQlMaXN0IGNyZWF0ZUxpc3QoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHN0eWxlKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGFiZWwgdGhhdCBjYW4gYmUgd3JhcHBlZCBvbiBtdWx0aXBsZSBsaW5lcy4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSBsYWJlbCdzIHRleHQKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkZvcm1UZXh0PC9jb2RlPgotCSAqLwotCUZvcm1UZXh0IGNyZWF0ZU11bHRpTGluZUxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBsYWJlbFRleHQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlZGl0YWJsZSB0ZXh0IGFyZWEuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHBhcmVudCBUaGUgbnVtYmVyIG9mIGxpbmVzIHRoZSB0ZXh0IGFyZWEgc2hvdWxkIGRpc3BsYXkKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+Ci0JICovCi0JVGV4dCBjcmVhdGVNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlZGl0YWJsZSB0ZXh0IGZpZWxkIHRoYXQgaGFuZGxlcyBwYXNzd29yZC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+Ci0JICovCi0JVGV4dCBjcmVhdGVQYXNzd29yZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lcik7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHB1c2ggYnV0dG9uICh0b2dnbGUgYmV0d2VlbiBzZWxlY3RlZCBhbmQgdW5zZWxlY3RlZCkuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKi8KLQlCdXR0b24gY3JlYXRlUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHJhZGlvIGJ1dHRvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqLwotCUJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNlY3Rpb24sIHdoaWNoIGlzIGEgY29sbGFwc2FibGUgcGFuZSB3aXRoIGEgdGl0bGUgYmFyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBzdHlsZSBUaGUgc3R5bGUgb2YgdGhlIHRpdGxlIGJhciwgd2hpY2ggY2FuIGJlCi0JICogPGNvZGU+RXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFPC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5FeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUjwvY29kZT4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+Ci0JICovCi0JU2VjdGlvbiBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNwaW5uZXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5TcGlubmVyPC9jb2RlPgotCSAqLwotCVNwaW5uZXIgY3JlYXRlU3Bpbm5lcihDb21wb3NpdGUgcGFyZW50KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdGFibGUuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHN0eWxlIFRoZSBzdHlsZSB0byBhcHBseSB0byB0aGUgdGFibGUKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRhYmxlPC9jb2RlPgotCSAqLwotCVRhYmxlIGNyZWF0ZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIHRleHQgZmllbGQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UZXh0PC9jb2RlPgotCSAqLwotCVRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdHJpLXN0YXRlIGNoZWNrIGJveC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+QnV0dG9uPC9jb2RlPiB0aGF0IGhhcyAzIHNlbGVjdGlvbiBzdGF0ZXMKLQkgKi8KLQlCdXR0b24gY3JlYXRlVHJpU3RhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9KcHRDb21tb25VaU1lc3NhZ2VzLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL0pwdENvbW1vblVpTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlMTQzMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL0pwdENvbW1vblVpTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBMb2NhbGl6ZWQgbWVzc2FnZXMgdXNlZCBieSBEYWxpIFVJLgotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSnB0Q29tbW9uVWlNZXNzYWdlcyB7Ci0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJvb2xlYW5fVHJ1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCb29sZWFuX0ZhbHNlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRFbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vbmVTZWxlY3RlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFJlbW92ZVBhbmVfQWRkQnV0dG9uVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRSZW1vdmVQYW5lX1JlbW92ZUJ1dHRvblRleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDaG9vc2VyUGFuZV9icm93c2VCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzQ2hvb3NlclBhbmVfZGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFja2FnZUNob29zZXJQYW5lX2RpYWxvZ01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFja2FnZUNob29zZXJQYW5lX2RpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudW1Db21ib1ZpZXdlcl9kZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudW1Db21ib1ZpZXdlcl9kZWZhdWx0V2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3TmFtZVN0YXRlT2JqZWN0X25hbWVBbHJlYWR5RXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld05hbWVTdGF0ZU9iamVjdF9uYW1lTXVzdEJlU3BlY2lmaWVkOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wdGlvbmFsTWVzc2FnZURpYWxvZ19kb05vdFNob3dXYXJuaW5nOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF9jb21tb25fdWkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQlVORExFX0NMQVNTID0gSnB0Q29tbW9uVWlNZXNzYWdlcy5jbGFzczsKLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBCVU5ETEVfQ0xBU1MpOwotCX0KLQotCXByaXZhdGUgSnB0Q29tbW9uVWlNZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL0pwdFVJUGx1Z2luLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL0pwdFVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYmUyZDUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9KcHRVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGVidWcuRGVidWdPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLnV0aWwudHJhY2tlci5TZXJ2aWNlVHJhY2tlcjsKLQotLyoqCi0gKiBDb21tb24gRGFsaSBVSSBwbHVnLWluIGJlaGF2aW9yLgotICogU2VlIEpwdFBsdWdpbgotICovCi1wdWJsaWMgY2xhc3MgSnB0VUlQbHVnaW4KLQlleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4KLXsKLQlwcm90ZWN0ZWQgQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0OwotCXByb3RlY3RlZCBTZXJ2aWNlVHJhY2tlcjxEZWJ1Z09wdGlvbnMsIERlYnVnT3B0aW9ucz4gZGVidWdPcHRpb25zU2VydmljZVRyYWNrZXI7Ci0KLQotCXByb3RlY3RlZCBKcHRVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbG9nZ2luZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBtZXNzYWdlIHdpdGggYSBzZXZlcml0eSBvZgotCSAqIHtAbGluayBJU3RhdHVzI0VSUk9SIEVSUk9SfS4KLQkgKiBAc2VlICNsb2coaW50LCBTdHJpbmcpCi0JICogQHNlZSBJU3RhdHVzCi0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcy5sb2coSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSk7Ci0gICAgfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSB3aXRoIHRoZSBzcGVjaWZpZWQgc2V2ZXJpdHkuCi0JICogQHNlZSBJU3RhdHVzI2dldFNldmVyaXR5KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICB0aGlzLmxvZyhzZXZlcml0eSwgbWVzc2FnZSwgbnVsbCk7Ci0gICAgfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIG9yIGVycm9yIHdpdGggYSBzZXZlcml0eSBvZgotCSAqIHtAbGluayBJU3RhdHVzI0VSUk9SIEVSUk9SfS4KLQkgKiBAc2VlICNsb2coaW50LCBUaHJvd2FibGUpCi0JICogQHNlZSBJU3RhdHVzCi0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoVGhyb3dhYmxlIHRocm93YWJsZSkgewotICAgICAgICB0aGlzLmxvZyhJU3RhdHVzLkVSUk9SLCB0aHJvd2FibGUpOwotCX0KLQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiBvciBlcnJvciB3aXRoIHRoZSBzcGVjaWZpZWQgc2V2ZXJpdHkuCi0JICogQHNlZSBJU3RhdHVzI2dldFNldmVyaXR5KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCXRoaXMubG9nKHNldmVyaXR5LCB0aHJvd2FibGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCB0aHJvd2FibGUpOwotCX0KLQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbiBvciBlcnJvciB3aXRoIGEgc2V2ZXJpdHkgb2YKLQkgKiB7QGxpbmsgSVN0YXR1cyNFUlJPUiBFUlJPUn0uCi0JICogQHNlZSAjbG9nKGludCwgU3RyaW5nLCBUaHJvd2FibGUpCi0JICogQHNlZSBJU3RhdHVzCi0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQl0aGlzLmxvZyhJU3RhdHVzLkVSUk9SLCBtc2csIHRocm93YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBhbmQgZXhjZXB0aW9uIG9yIGVycm9yCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIHNldmVyaXR5LgotCSAqIEBzZWUgSVN0YXR1cyNnZXRTZXZlcml0eSgpCi0JICogQHNlZSBJU3RhdHVzI2dldENvZGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtc2csIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJdGhpcy5sb2coc2V2ZXJpdHksIElTdGF0dXMuT0ssIG1zZywgdGhyb3dhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGFuZCBleGNlcHRpb24gb3IgZXJyb3IKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgc2V2ZXJpdHkgYW5kIGNvZGUuCi0JICogQHNlZSBJU3RhdHVzI2dldFNldmVyaXR5KCkKLQkgKiBAc2VlIElTdGF0dXMjZ2V0Q29kZSgpCi0JICovCi0JcHVibGljIHZvaWQgbG9nKGludCBzZXZlcml0eSwgaW50IGNvZGUsIFN0cmluZyBtc2csIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJdGhpcy5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgdGhpcy5nZXRQbHVnaW5JRCgpLCBjb2RlLCBtc2csIHRocm93YWJsZSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWJ1ZyBvcHRpb25zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGRlYnVnIG9wdGlvbiBhcyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgotCSAqIFJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm8gc3VjaCBvcHRpb24gaXMgZm91bmQuCi0JICogPHA+Ci0JICogVGhlIGRlYnVnIG9wdGlvbiBpcyB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBwbHVnLWluJ3MgZGVidWcgb3B0aW9ucwotCSAqIChlLmcuIGZvciB0aGUgcGx1Zy1pbiA8Y29kZT4ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIjwvY29kZT4sCi0JICogdGhlIHNwZWNpZmllZCBvcHRpb24gPGNvZGU+ImZvbyI8L2NvZGU+IHdpbGwgYmUgbWFwcGVkIHRvCi0JICogdGhlIHtAbGluayBQbGF0Zm9ybX0gb3B0aW9uCi0JICogPGNvZGU+Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9kZWJ1Zy9mb28iPC9jb2RlPikuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbkRlYnVnT3B0aW9uKFN0cmluZyBvcHRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkRlYnVnT3B0aW9uKG9wdGlvbiwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGRlYnVnIG9wdGlvbiBhcyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUgaWYgbm8gc3VjaCBvcHRpb24gaXMgZm91bmQuCi0JICogPHA+Ci0JICogVGhlIGRlYnVnIG9wdGlvbiBpcyB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBwbHVnLWluJ3MgZGVidWcgb3B0aW9ucwotCSAqIChlLmcuIGZvciB0aGUgcGx1Zy1pbiA8Y29kZT4ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIjwvY29kZT4sCi0JICogdGhlIHNwZWNpZmllZCBvcHRpb24gPGNvZGU+ImZvbyI8L2NvZGU+IHdpbGwgYmUgbWFwcGVkIHRvCi0JICogdGhlIHtAbGluayBQbGF0Zm9ybX0gb3B0aW9uCi0JICogPGNvZGU+Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9kZWJ1Zy9mb28iPC9jb2RlPikuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbkRlYnVnT3B0aW9uKFN0cmluZyBvcHRpb24sIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IHRoaXMuZ2V0RGVidWdPcHRpb24ob3B0aW9uKTsKLQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IGRlZmF1bHRWYWx1ZSA6IEJvb2xlYW4ucGFyc2VCb29sZWFuKHZhbHVlLnRyaW0oKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgZGVidWcgb3B0aW9uIGFzIGFuIDxjb2RlPmludDwvY29kZT4gdmFsdWUuCi0JICogUmV0dXJuIDxjb2RlPi0xPC9jb2RlPiBpZiBubyBzdWNoIG9wdGlvbiBpcyBmb3VuZC4KLQkgKiA8cD4KLQkgKiBUaGUgZGVidWcgb3B0aW9uIGlzIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHBsdWctaW4ncyBkZWJ1ZyBvcHRpb25zCi0JICogKGUuZy4gZm9yIHRoZSBwbHVnLWluIDxjb2RlPiJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUiPC9jb2RlPiwKLQkgKiB0aGUgc3BlY2lmaWVkIG9wdGlvbiA8Y29kZT4iZm9vIjwvY29kZT4gd2lsbCBiZSBtYXBwZWQgdG8KLQkgKiB0aGUge0BsaW5rIFBsYXRmb3JtfSBvcHRpb24KLQkgKiA8Y29kZT4ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL2RlYnVnL2ZvbyI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVnZXJEZWJ1Z09wdGlvbihTdHJpbmcgb3B0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmdldEludGVnZXJEZWJ1Z09wdGlvbihvcHRpb24sIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBkZWJ1ZyBvcHRpb24gYXMgYW4gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlIGlmIG5vIHN1Y2ggb3B0aW9uIGlzIGZvdW5kLgotCSAqIDxwPgotCSAqIFRoZSBkZWJ1ZyBvcHRpb24gaXMgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgcGx1Zy1pbidzIGRlYnVnIG9wdGlvbnMKLQkgKiAoZS5nLiBmb3IgdGhlIHBsdWctaW4gPGNvZGU+Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSI8L2NvZGU+LAotCSAqIHRoZSBzcGVjaWZpZWQgb3B0aW9uIDxjb2RlPiJmb28iPC9jb2RlPiB3aWxsIGJlIG1hcHBlZCB0bwotCSAqIHRoZSB7QGxpbmsgUGxhdGZvcm19IG9wdGlvbgotCSAqIDxjb2RlPiJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvZGVidWcvZm9vIjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZWdlckRlYnVnT3B0aW9uKFN0cmluZyBvcHRpb24sIGludCBkZWZhdWx0VmFsdWUpIHsKLQkJU3RyaW5nIHZhbHVlID0gdGhpcy5nZXREZWJ1Z09wdGlvbihvcHRpb24pOwotCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gZGVmYXVsdFZhbHVlIDogSW50ZWdlci5wYXJzZUludCh2YWx1ZS50cmltKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGRlYnVnIG9wdGlvbi4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCBvcHRpb24gaXMgZm91bmQuCi0JICogPHA+Ci0JICogVGhlIGRlYnVnIG9wdGlvbiBpcyB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBwbHVnLWluJ3MgZGVidWcgb3B0aW9ucwotCSAqIChlLmcuIGZvciB0aGUgcGx1Zy1pbiA8Y29kZT4ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIjwvY29kZT4sCi0JICogdGhlIHNwZWNpZmllZCBvcHRpb24gPGNvZGU+ImZvbyI8L2NvZGU+IHdpbGwgYmUgbWFwcGVkIHRvCi0JICogdGhlIHtAbGluayBQbGF0Zm9ybX0gb3B0aW9uCi0JICogPGNvZGU+Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9kZWJ1Zy9mb28iPC9jb2RlPikuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWJ1Z09wdGlvbihTdHJpbmcgb3B0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmdldERlYnVnT3B0aW9uKG9wdGlvbiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgZGVidWcgb3B0aW9uLgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUgaWYgbm8gc3VjaCBvcHRpb24gaXMgZm91bmQuCi0JICogPHA+Ci0JICogVGhlIGRlYnVnIG9wdGlvbiBpcyB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBwbHVnLWluJ3MgZGVidWcgb3B0aW9ucwotCSAqIChlLmcuIGZvciB0aGUgcGx1Zy1pbiA8Y29kZT4ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIjwvY29kZT4sCi0JICogdGhlIHNwZWNpZmllZCBvcHRpb24gPGNvZGU+ImZvbyI8L2NvZGU+IHdpbGwgYmUgbWFwcGVkIHRvCi0JICogdGhlIHtAbGluayBQbGF0Zm9ybX0gb3B0aW9uCi0JICogPGNvZGU+Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9kZWJ1Zy9mb28iPC9jb2RlPikuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWJ1Z09wdGlvbihTdHJpbmcgb3B0aW9uLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmlzRGVidWdnaW5nKCkgPyB0aGlzLmdldERlYnVnT3B0aW9uXyhvcHRpb24sIGRlZmF1bHRWYWx1ZSkgOiBkZWZhdWx0VmFsdWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWJ1Z09wdGlvbl8oU3RyaW5nIG9wdGlvbiwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShvcHRpb24pKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkZWJ1ZyBvcHRpb24gY2Fubm90IGJlIGJsYW5rIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmcgdmFsdWUgPSB0aGlzLmdldERlYnVnT3B0aW9uXyhvcHRpb24pOwotCQlyZXR1cm4gKHZhbHVlICE9IG51bGwpID8gdmFsdWUgOiBkZWZhdWx0VmFsdWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWJ1Z09wdGlvbl8oU3RyaW5nIG9wdGlvbikgewotCQlEZWJ1Z09wdGlvbnMgZGVidWdPcHRpb25zID0gdGhpcy5nZXREZWJ1Z09wdGlvbnMoKTsKLQkJcmV0dXJuIChkZWJ1Z09wdGlvbnMgPT0gbnVsbCkgPyBudWxsIDogZGVidWdPcHRpb25zLmdldE9wdGlvbih0aGlzLmdldFBsdWdpbkRlYnVnT3B0aW9uKCkgKyBvcHRpb24pOwotCX0KLQotCXByb3RlY3RlZCBEZWJ1Z09wdGlvbnMgZ2V0RGVidWdPcHRpb25zKCkgewotCQlTZXJ2aWNlVHJhY2tlcjxEZWJ1Z09wdGlvbnMsIERlYnVnT3B0aW9ucz4gdHJhY2tlciA9IHRoaXMuZ2V0RGVidWdPcHRpb25zU2VydmljZVRyYWNrZXIoKTsKLQkJcmV0dXJuICh0cmFja2VyID09IG51bGwpID8gbnVsbCA6IHRyYWNrZXIuZ2V0U2VydmljZSgpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIFNlcnZpY2VUcmFja2VyPERlYnVnT3B0aW9ucywgRGVidWdPcHRpb25zPiBnZXREZWJ1Z09wdGlvbnNTZXJ2aWNlVHJhY2tlcigpIHsKLQkJaWYgKHRoaXMuaXNBY3RpdmUoKSAmJiAodGhpcy5kZWJ1Z09wdGlvbnNTZXJ2aWNlVHJhY2tlciA9PSBudWxsKSkgewotCQkJdGhpcy5kZWJ1Z09wdGlvbnNTZXJ2aWNlVHJhY2tlciA9IHRoaXMuYnVpbGREZWJ1Z09wdGlvbnNTZXJ2aWNlVHJhY2tlcigpOwotCQkJdGhpcy5kZWJ1Z09wdGlvbnNTZXJ2aWNlVHJhY2tlci5vcGVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZGVidWdPcHRpb25zU2VydmljZVRyYWNrZXI7Ci0JfQotCi0JcHJpdmF0ZSBTZXJ2aWNlVHJhY2tlcjxEZWJ1Z09wdGlvbnMsIERlYnVnT3B0aW9ucz4gYnVpbGREZWJ1Z09wdGlvbnNTZXJ2aWNlVHJhY2tlcigpIHsKLQkJcmV0dXJuIG5ldyBTZXJ2aWNlVHJhY2tlcjxEZWJ1Z09wdGlvbnMsIERlYnVnT3B0aW9ucz4odGhpcy5idW5kbGVDb250ZXh0LCBEZWJ1Z09wdGlvbnMuY2xhc3MsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGx1Zy1pbidzIGRlYnVnIG9wdGlvbiBwYXRoLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGx1Z2luRGVidWdPcHRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmdldFBsdWdpbklEKCkgKyBERUJVR19PUFRJT05fU0NPUEU7Ci0JfQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX09QVElPTl9TQ09QRSA9ICIvZGVidWcvIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvLyAqKioqKioqKioqIHBsdWctaW4gbGlmZWN5Y2xlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJdGhpcy5idW5kbGVDb250ZXh0ID0gY29udGV4dDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJdGhpcy5zdG9wXygpOwotCQl9IGZpbmFsbHkgewotCQkJdGhpcy5idW5kbGVDb250ZXh0ID0gbnVsbDsKLQkJCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9wXygpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAodGhpcy5kZWJ1Z09wdGlvbnNTZXJ2aWNlVHJhY2tlciAhPSBudWxsKSB7Ci0JCQl0aGlzLmRlYnVnT3B0aW9uc1NlcnZpY2VUcmFja2VyLmNsb3NlKCk7Ci0JCQl0aGlzLmRlYnVnT3B0aW9uc1NlcnZpY2VUcmFja2VyID0gbnVsbDsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JCXJldHVybiB0aGlzLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwbHVnLWluIGlzIGFjdGl2ZTsgaS5lLiBpdCBoYXMgYmVlbgotCSAqIHtAbGluayAjc3RhcnQoQnVuZGxlQ29udGV4dCkgc3RhcnRlZH0uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzQWN0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5idW5kbGVDb250ZXh0ICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHBsdWctaW4gaXMgaW5hY3RpdmU7IGkuZS4gaXQgaGFzIGJlZW4KLQkgKiB7QGxpbmsgI3N0b3AoQnVuZGxlQ29udGV4dCkgc3RvcHBlZH0gb3Igbm90IHlldAotCSAqIHtAbGluayAjc3RhcnQoQnVuZGxlQ29udGV4dCkgc3RhcnRlZH0uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbmFjdGl2ZSgpIHsKLQkJcmV0dXJuICEgdGhpcy5pc0FjdGl2ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvVHJhY2luZy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9UcmFjaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MjYwMTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9UcmFjaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5KcHRDb21tb25VaVBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIHRyYWNpbmcgY2xhc3MgbWFuYWdlcyB0byBjb252ZXJ0IHRoZSBzdHJpbmcgdmFsdWUgaW50byBib29sZWFuIHZhbHVlcyBvcgotICogaW50ZWdlciB2YWx1ZXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFjaW5nIGRlYnVnIGZsYWdzLiBUaG9zZSBmbGFncwotICogYXJlIHNwZWNpZmllZCBpbiB0aGUgLm9wdGlvbnMgZmlsZS4gVGhlIHN1cHBvcnRlZCBrZXlzIGFyZSBkZWZpbmVkIGhlcmUgYXMKLSAqIGNvbnN0YW50cyBmb3IgcXVpY2sgcmVmZXJlbmNlLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmFjaW5nCi17Ci0JLyoqCi0JICogQSBjb25zdGFudCB1c2VkIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggIi9kZWJ1ZyIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUcgPSAiL2RlYnVnIjsKLQotCS8qKgotCSAqIEEgY29uc3RhbnQgdXNlZCB0byByZXRyaWV2ZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoICIvZGVidWcvdWkvZGIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0RCID0gIi9kZWJ1Zy91aS9kYiI7Ci0KLQkvKioKLQkgKiBBIGNvbnN0YW50IHVzZWQgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCAiL2RlYnVnL3VpL2RldGFpbHNWaWV3Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9ERVRBSUxTX1ZJRVcgPSAiL2RlYnVnL3VpL2RldGFpbHNWaWV3IjsKLQotCS8qKgotCSAqIEEgY29uc3RhbnQgdXNlZCB0byByZXRyaWV2ZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoICIvZGVidWcvdWkvbGF5b3V0Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9MQVlPVVQgPSAiL2RlYnVnL3VpL2xheW91dCI7Ci0KLQkvKioKLQkgKiBBIGNvbnN0YW50IHVzZWQgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCAiL3VuaXQtdGVzdHMiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOSVRfVEVTVFMgPSAiL3VuaXQtdGVzdHMiOwotCi0JLyoqCi0JICogQ2FuJ3QgaW5zdGFudGlhdGUgdGhpcyA8Y29kZT5UcmFjaW5nPC9jb2RlPiBjbGFzcy4KLQkgKi8KLQlwcml2YXRlIFRyYWNpbmcoKQotCXsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUcmFjaW5nIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGRlYnVnIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmxhZy4gVGhlIGRlZmF1bHQKLQkgKiB2YWx1ZSBpcyA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gZmxhZyBUaGUgZmxhZyB0byByZXRyaWV2ZSB0aGUgZGVidWcgdmFsdWUsIHdoaWNoIHNob3VsZCBiZQotCSAqIGNvbnRhaW5lZCBpbiB0aGUgLm9wdGlvbnMgZmlsZSwgdGhlIGZsYWcgc2hvdWxkIHN0YXJ0IHdpdGggIi8iCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gZmxhZyBpcyBhY3RpdmU7IDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBib29sZWFuRGVidWdPcHRpb24oU3RyaW5nIGZsYWcpCi0JewotCQlyZXR1cm4gYm9vbGVhbkRlYnVnT3B0aW9uKGZsYWcsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGRlYnVnIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmxhZy4KLQkgKgotCSAqIEBwYXJhbSBmbGFnIFRoZSBmbGFnIHRvIHJldHJpZXZlIHRoZSBkZWJ1ZyB2YWx1ZSwgd2hpY2ggc2hvdWxkIGJlCi0JICogY29udGFpbmVkIGluIHRoZSAub3B0aW9ucyBmaWxlLCB0aGUgZmxhZyBzaG91bGQgc3RhcnQgd2l0aCAiLyIKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIGlmIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlCi0JICogZ2l2ZW4gZmxhZyBjb3VsZCBub3QgYmUgZm91bmQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBmbGFnIGlzIGFjdGl2ZTsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGJvb2xlYW5EZWJ1Z09wdGlvbihTdHJpbmcgZmxhZywgYm9vbGVhbiBkZWZhdWx0VmFsdWUpCi0JewotCQlTdHJpbmcgc3RyaW5nID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oSnB0Q29tbW9uVWlQbHVnaW4uUExVR0lOX0lEICsgZmxhZyk7Ci0JCXJldHVybiAoc3RyaW5nID09IG51bGwpID8gZGVmYXVsdFZhbHVlIDogQm9vbGVhbi5wYXJzZUJvb2xlYW4oc3RyaW5nLnRyaW0oKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBkZWJ1ZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZsYWcuIFRoZSBkZWZhdWx0IHZhbHVlCi0JICogaXMgMC4KLQkgKgotCSAqIEBwYXJhbSBmbGFnIFRoZSBmbGFnIHRvIHJldHJpZXZlIHRoZSBkZWJ1ZyB2YWx1ZSwgd2hpY2ggc2hvdWxkIGJlCi0JICogY29udGFpbmVkIGluIHRoZSAub3B0aW9ucyBmaWxlLCB0aGUgZmxhZyBzaG91bGQgc3RhcnQgd2l0aCAiLyIKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZsYWcsIG9yIHRoZSBnaXZlbiBkZWZhdWx0Ci0JICogdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpbnREZWJ1Z09wdGlvbihTdHJpbmcgZmxhZykKLQl7Ci0JCXJldHVybiBpbnREZWJ1Z09wdGlvbihmbGFnLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGRlYnVnIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmxhZy4KLQkgKgotCSAqIEBwYXJhbSBmbGFnIFRoZSBmbGFnIHRvIHJldHJpZXZlIHRoZSBkZWJ1ZyB2YWx1ZSwgd2hpY2ggc2hvdWxkIGJlCi0JICogY29udGFpbmVkIGluIHRoZSAub3B0aW9ucyBmaWxlLCB0aGUgZmxhZyBzaG91bGQgc3RhcnQgd2l0aCAiLyIKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIGlmIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlCi0JICogZ2l2ZW4gZmxhZyBjb3VsZCBub3QgYmUgZm91bmQKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZsYWcsIG9yIHRoZSBnaXZlbiBkZWZhdWx0Ci0JICogdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpbnREZWJ1Z09wdGlvbihTdHJpbmcgZmxhZywgaW50IGRlZmF1bHRWYWx1ZSkKLQl7Ci0JCVN0cmluZyBzdHJpbmcgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihKcHRDb21tb25VaVBsdWdpbi5QTFVHSU5fSUQgKyBmbGFnKTsKLQkJcmV0dXJuIChzdHJpbmcgPT0gbnVsbCkgPyAgZGVmYXVsdFZhbHVlIDogSW50ZWdlci5wYXJzZUludChzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIGdpdmVuIG1lc3NhZ2VzLCBhcHBlbmRzIGl0IHdpdGggdGhpcyBwbHVnLWluIGlkLgotCSAqCi0JICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkKLQl7Ci0JCVN5c3RlbS5vdXQucHJpbnQoIlsiICsgSnB0Q29tbW9uVWlQbHVnaW4uUExVR0lOX0lEICsgIl0gIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGRlYnVnIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmxhZy4gVGhlIGRlZmF1bHQgdmFsdWUKLQkgKiBpcyBhbiBlbXB0eSBzdHJpbmcuCi0JICoKLQkgKiBAcGFyYW0gZmxhZyBUaGUgZmxhZyB0byByZXRyaWV2ZSB0aGUgZGVidWcgdmFsdWUsIHdoaWNoIHNob3VsZCBiZQotCSAqIGNvbnRhaW5lZCBpbiB0aGUgLm9wdGlvbnMgZmlsZSwgdGhlIGZsYWcgc2hvdWxkIHN0YXJ0IHdpdGggIi8iCi0JICogQHJldHVybiBUaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLCBvciB0aGUgZ2l2ZW4gZGVmYXVsdAotCSAqIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaW5nRGVidWdPcHRpb24oU3RyaW5nIGZsYWcpCi0JewotCQlyZXR1cm4gc3RyaW5nRGVidWdPcHRpb24oZmxhZywgIiIpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGVidWcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLgotCSAqCi0JICogQHBhcmFtIGZsYWcgVGhlIGZsYWcgdG8gcmV0cmlldmUgdGhlIGRlYnVnIHZhbHVlLCB3aGljaCBzaG91bGQgYmUKLQkgKiBjb250YWluZWQgaW4gdGhlIC5vcHRpb25zIGZpbGUsIHRoZSBmbGFnIHNob3VsZCBzdGFydCB3aXRoICIvIgotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkgKiBnaXZlbiBmbGFnIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmxhZywgb3IgdGhlIGdpdmVuIGRlZmF1bHQKLQkgKiB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmluZ0RlYnVnT3B0aW9uKFN0cmluZyBmbGFnLCBTdHJpbmcgZGVmYXVsdFZhbHVlKQotCXsKLQkJU3RyaW5nIHN0cmluZyA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKEpwdENvbW1vblVpUGx1Z2luLlBMVUdJTl9JRCArIGZsYWcpOwotCQlyZXR1cm4gKHN0cmluZyAhPSBudWxsKSA/IHN0cmluZyA6IGRlZmF1bHRWYWx1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2RpYWxvZ3MvT3B0aW9uYWxNZXNzYWdlRGlhbG9nLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2RpYWxvZ3MvT3B0aW9uYWxNZXNzYWdlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjgxZmMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9kaWFsb2dzL09wdGlvbmFsTWVzc2FnZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0vKioKLSAqIEEgPGNvZGU+T3B0aW9uYWxNZXNzYWdlRGlhbG9nPC9jb2RlPiBpcyBhIGRpYWxvZyB0aGF0IGhhcyBhIGNoZWNrIGJveCBhbGxvd2luZyB0aGUKLSAqIG9wdGlvbiB0byBubyBsb25nZXIgc2hvdyB0aGUgZGlhbG9nIGluIHRoZSBmdXR1cmUuIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgT3B0aW9uYWxNZXNzYWdlRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tCT1hfVEVYVCA9IEpwdENvbW1vblVpTWVzc2FnZXMuT3B0aW9uYWxNZXNzYWdlRGlhbG9nX2RvTm90U2hvd1dhcm5pbmc7Ci0KLQkvLyBEaWFsb2cgc3RvcmUgaWQgY29uc3RhbnRzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JFX0lEID0gIk9wdGlvbmFsTWVzc2FnZURpYWxvZy5oaWRlLiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9TSE9XTiA9IElEaWFsb2dDb25zdGFudHMuQ0xJRU5UX0lEICsgMTsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGlkOwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2hlY2tCb3hUZXh0OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBkaWFsb2cgd2l0aCB0aGUgZ2l2ZW4gcGFyZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqICAgICAgICAgICAgb2JqZWN0IHRoYXQgcmV0dXJucyB0aGUgY3VycmVudCBwYXJlbnQgc2hlbGwgCi0JICovCi0JcHVibGljIE9wdGlvbmFsTWVzc2FnZURpYWxvZyhTdHJpbmcgaWQsIFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsIFN0cmluZyBkaWFsb2dNZXNzYWdlLCBpbnQgZGlhbG9nVHlwZSwgU3RyaW5nW10gYnV0dG9uTGFiZWxzLCBpbnQgZGVmYXVsdEJ1dHRvbkluZGV4KSB7Ci0JCXRoaXMoaWQsIHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgZGlhbG9nTWVzc2FnZSwgZGlhbG9nVHlwZSwgYnV0dG9uTGFiZWxzLCBkZWZhdWx0QnV0dG9uSW5kZXgsIENIRUNLQk9YX1RFWFQpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgZGlhbG9nIHdpdGggdGhlIGdpdmVuIHBhcmVudCBhbmQgYSBjaGVja2JveCB3aXRoIHRoZSBsYWJlbGVkIHdpdGggdGhlIHRleHQgaW4gPGNvZGU+Y2hlY2tCb3hUZXh0PC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqICAgICAgICAgICAgb2JqZWN0IHRoYXQgcmV0dXJucyB0aGUgY3VycmVudCBwYXJlbnQgc2hlbGwgCi0JICovCQotCXB1YmxpYyBPcHRpb25hbE1lc3NhZ2VEaWFsb2coU3RyaW5nIGlkLCBTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLCBTdHJpbmcgZGlhbG9nTWVzc2FnZSwgaW50IGRpYWxvZ1R5cGUsIFN0cmluZ1tdIGJ1dHRvbkxhYmVscywgaW50IGRlZmF1bHRCdXR0b25JbmRleCwgU3RyaW5nIGNoZWNrQm94VGV4dCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIG51bGwsIGRpYWxvZ01lc3NhZ2UsIGRpYWxvZ1R5cGUsIGJ1dHRvbkxhYmVscywgZGVmYXVsdEJ1dHRvbkluZGV4KTsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLmNoZWNrQm94VGV4dCA9IGNoZWNrQm94VGV4dDsKLQl9Ci0JCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgCWZpbmFsIEJ1dHRvbiBjaGVja2JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgIAljaGVja2JveC5zZXRUZXh0KHRoaXMuY2hlY2tCb3hUZXh0KTsKLSAgICAJY2hlY2tib3guc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAJY2hlY2tib3guc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgCWNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNldERpYWxvZ0VuYWJsZWQoaWQsICEoKEJ1dHRvbillLndpZGdldCkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotICAgIAl9KTsKLSAgICAJcmV0dXJuIGNoZWNrYm94OwotICAgIH0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBkaWFsb2cgc2V0dGluZ3MKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNldHRpbmdzIHRvIGJlIHVzZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncz0gSmF2YVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJc2V0dGluZ3M9IHNldHRpbmdzLmdldFNlY3Rpb24oU1RPUkVfSUQpOwotCQlpZiAoc2V0dGluZ3MgPT0gbnVsbCkKLQkJCXNldHRpbmdzPSBKYXZhUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpLmFkZE5ld1NlY3Rpb24oU1RPUkVfSUQpOwotCQlyZXR1cm4gc2V0dGluZ3M7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VycyB3aGV0aGVyIHRoZSBvcHRpb25hbCBkaWFsb2cgaXMgZW5hYmxlZCBhbmQgc2hvdWxkIGJlIHNob3duLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RpYWxvZ0VuYWJsZWQoU3RyaW5nIGtleSkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3M9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCXJldHVybiAhc2V0dGluZ3MuZ2V0Qm9vbGVhbihrZXkpOwotCX0KLQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGUgb3B0aW9uYWwgZGlhbG9nIGlzIGVuYWJsZWQgYW5kIHNob3VsZCBiZSBzaG93bi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGlhbG9nRW5hYmxlZChTdHJpbmcga2V5LCBib29sZWFuIGlzRW5hYmxlZCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3M9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCXNldHRpbmdzLnB1dChrZXksICFpc0VuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIENsZWFycyBhbGwgcmVtZW1iZXJlZCBpbmZvcm1hdGlvbiBhYm91dCBoaWRkZW4gZGlhbG9ncwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhckFsbFJlbWVtYmVyZWRTdGF0ZXMoKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncz0gSmF2YVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJc2V0dGluZ3MuYWRkTmV3U2VjdGlvbihTVE9SRV9JRCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9BYnN0cmFjdEl0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvQWJzdHJhY3RJdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZmM0Y2EuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9BYnN0cmFjdEl0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBBYnN0cmFjdCB7QGxpbmsgSXRlbUxhYmVsUHJvdmlkZXJ9IHRoYXQgcHJvdmlkZXMgc3VwcG9ydCBmb3IgbGlzdGVuaW5nIHRvIGFuCi0gKiB7QGxpbmsgI2l0ZW19IGFuZCBub3RpZnlpbmcgdGhlCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlci5NYW5hZ2VyIG1hbmFnZXJ9Ci0gKiB3aGVuZXZlciB0aGUgaXRlbSBjaGFuZ2VzIGluIGEgc2lnbmlmaWNhbnQgd2F5LgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIGNhbiBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBtZXRob2RzIGlmIHRoZSBjb3JyZXNwb25kaW5nIGFzcGVjdHMKLSAqIG9mIHRoZSB7QGxpbmsgI2l0ZW19IGNoYW5nZTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNidWlsZEltYWdlTW9kZWwoKX08YnI+Ci0gKiAJICAgUmV0dXJuIGEge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH0gdGhhdCByZXByZXNlbnRzIHRoZSBpdGVtJ3MgaW1hZ2UKLSAqIDxsaT57QGxpbmsgI2J1aWxkVGV4dE1vZGVsKCl9PGJyPgotICogCSAgIFJldHVybiBhIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9IHRoYXQgcmVwcmVzZW50cyB0aGUgaXRlbSdzIHRleHQKLSAqIDxsaT57QGxpbmsgI2J1aWxkRGVzY3JpcHRpb25Nb2RlbCgpfTxicj4KLSAqIAkgICBSZXR1cm4gYSB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfSB0aGF0IHJlcHJlc2VudHMgdGhlIGl0ZW0ncyBkZXNjcmlwdGlvbgotICogPC91bD4KLSAqIEFsdGVybmF0aXZlbHksIHN1YmNsYXNzZXMgY2FuIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIG1ldGhvZHMgaWYgdGhlCi0gKiBjb3JyZXNwb25kaW5nIGFzcGVjdHMgb2YgdGhlIHtAbGluayAjaXRlbX0gZG8gPGVtPm5vdDwvZW0+IGNoYW5nZTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNnZXRJbWFnZSgpfTxicj4KLSAqIAkgICBSZXR1cm4gdGhlIGl0ZW0ncyBpbWFnZQotICogPGxpPntAbGluayAjZ2V0VGV4dCgpfTxicj4KLSAqIAkgICBSZXR1cm4gdGhlIGl0ZW0ncyB0ZXh0Ci0gKiA8bGk+e0BsaW5rICNnZXREZXNjcmlwdGlvbigpfTxicj4KLSAqIAkgICBSZXR1cm4gdGhlIGl0ZW0ncyBkZXNjcmlwdGlvbgotICogPC91bD4KLSAqIEZvciBlYWNoIGFzcGVjdCAoaW1hZ2UsIHRleHQsIGFuZCBkZXNjcmlwdGlvbikgb25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgdHdvCi0gKiBtZXRob2RzIG11c3QgYmUgb3ZlcnJpZGRlbi4KLSAqIAotICogQHNlZSBTdGF0aWNJdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEl0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXI8ST4KLQlpbXBsZW1lbnRzIEl0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXIKLXsKLQlwcm90ZWN0ZWQgZmluYWwgSXRlbUxhYmVsUHJvdmlkZXIuTWFuYWdlciBtYW5hZ2VyOwotCi0JcHJvdGVjdGVkIGZpbmFsIEkgaXRlbTsKLQotCXByb3RlY3RlZCB2b2xhdGlsZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIHZvbGF0aWxlIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gaW1hZ2VNb2RlbDsKLQotCXByb3RlY3RlZCB2b2xhdGlsZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0TW9kZWw7Ci0KLQlwcm90ZWN0ZWQgdm9sYXRpbGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZGVzY3JpcHRpb25Nb2RlbDsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0SXRlbUV4dGVuZGVkTGFiZWxQcm92aWRlcihJIGl0ZW0sIEl0ZW1MYWJlbFByb3ZpZGVyLk1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLml0ZW0gPSBpdGVtOwotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbWFnZSAqKioqKioqKioqCi0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldEltYWdlTW9kZWwoKS5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW1hZ2UgbW9kZWwgKGxhenktaW5pdGlhbGl6ZWQpLgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBnZXRJbWFnZU1vZGVsKCkgewotCQlpZiAodGhpcy5pbWFnZU1vZGVsID09IG51bGwpIHsKLQkJCXRoaXMuaW1hZ2VNb2RlbCA9IHRoaXMuYnVpbGRJbWFnZU1vZGVsKCk7Ci0JCQl0aGlzLmVuZ2FnZUltYWdlTW9kZWwoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5pbWFnZU1vZGVsOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpbWFnZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUltYWdlTW9kZWwoKSB7Ci0JCXRoaXMuaW1hZ2VNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5nZXRMaXN0ZW5lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VJbWFnZU1vZGVsKCkgewotCQl0aGlzLmltYWdlTW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2VJbWFnZU1vZGVsKCkgewotCQlpZiAodGhpcy5pbWFnZU1vZGVsICE9IG51bGwpIHsKLQkJCXRoaXMuZGlzZW5nYWdlSW1hZ2VNb2RlbCgpOwotCQkJdGhpcy5pbWFnZU1vZGVsID0gbnVsbDsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB0ZXh0ICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGV4dE1vZGVsKCkuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgbW9kZWwgKGxhenktaW5pdGlhbGl6ZWQpLgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZ2V0VGV4dE1vZGVsKCkgewotCQlpZiAodGhpcy50ZXh0TW9kZWwgPT0gbnVsbCkgewotCQkJdGhpcy50ZXh0TW9kZWwgPSB0aGlzLmJ1aWxkVGV4dE1vZGVsKCk7Ci0JCQl0aGlzLmVuZ2FnZVRleHRNb2RlbCgpOwotCQl9Ci0JCXJldHVybiB0aGlzLnRleHRNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0ZXh0IG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRNb2RlbCgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVGV4dE1vZGVsKCkgewotCQl0aGlzLnRleHRNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5nZXRMaXN0ZW5lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VUZXh0TW9kZWwoKSB7Ci0JCXRoaXMudGV4dE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlVGV4dE1vZGVsKCkgewotCQlpZiAodGhpcy50ZXh0TW9kZWwgIT0gbnVsbCkgewotCQkJdGhpcy5kaXNlbmdhZ2VUZXh0TW9kZWwoKTsKLQkJCXRoaXMudGV4dE1vZGVsID0gbnVsbDsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZXNjcmlwdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5nZXREZXNjcmlwdGlvbk1vZGVsKCkuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlc2NyaXB0aW9uIG1vZGVsIChsYXp5LWluaXRpYWxpemVkKS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGdldERlc2NyaXB0aW9uTW9kZWwoKSB7Ci0JCWlmICh0aGlzLmRlc2NyaXB0aW9uTW9kZWwgPT0gbnVsbCkgewotCQkJdGhpcy5kZXNjcmlwdGlvbk1vZGVsID0gdGhpcy5idWlsZERlc2NyaXB0aW9uTW9kZWwoKTsKLQkJCXRoaXMuZW5nYWdlRGVzY3JpcHRpb25Nb2RlbCgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmRlc2NyaXB0aW9uTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgZGVzY3JpcHRpb24gbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVzY3JpcHRpb25Nb2RlbCgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlRGVzY3JpcHRpb25Nb2RlbCgpIHsKLQkJdGhpcy5kZXNjcmlwdGlvbk1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmdldExpc3RlbmVyKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZURlc2NyaXB0aW9uTW9kZWwoKSB7Ci0JCXRoaXMuZGVzY3JpcHRpb25Nb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZURlc2NyaXB0aW9uTW9kZWwoKSB7Ci0JCWlmICh0aGlzLmRlc2NyaXB0aW9uTW9kZWwgIT0gbnVsbCkgewotCQkJdGhpcy5kaXNlbmdhZ2VEZXNjcmlwdGlvbk1vZGVsKCk7Ci0JCQl0aGlzLmRlc2NyaXB0aW9uTW9kZWwgPSBudWxsOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBnZXRMaXN0ZW5lcigpIHsKLQkJaWYgKHRoaXMubGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhpcy5saXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmxpc3RlbmVyOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgbGlzdGVuZXIgdGhhdCB3aWxsIGxpc3RlbiB0byB0aGUge0BsaW5rICNpbWFnZU1vZGVsfSwKLQkgKiB7QGxpbmsgI3RleHRNb2RlbH0sIGFuZCB7QGxpbmsgI2Rlc2NyaXB0aW9uTW9kZWx9LgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKiBDVSBwcml2YXRlICovIGNsYXNzIExpc3RlbmVyCi0JCWV4dGVuZHMgUHJvcGVydHlDaGFuZ2VBZGFwdGVyCi0JewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCUFic3RyYWN0SXRlbUV4dGVuZGVkTGFiZWxQcm92aWRlci50aGlzLml0ZW1DaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQkvKiBDVSBwcml2YXRlICovIHZvaWQgaXRlbUNoYW5nZWQoKSB7Ci0JCXRoaXMubWFuYWdlci51cGRhdGVMYWJlbCh0aGlzLml0ZW0pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXNwb3NlICoqKioqKioqKioKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmRpc3Bvc2VJbWFnZU1vZGVsKCk7Ci0JCXRoaXMuZGlzcG9zZVRleHRNb2RlbCgpOwotCQl0aGlzLmRpc3Bvc2VEZXNjcmlwdGlvbk1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVtKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0Fic3RyYWN0SXRlbVN0cnVjdHVyZWRTdGF0ZVByb3ZpZGVyTWFuYWdlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9BYnN0cmFjdEl0ZW1TdHJ1Y3R1cmVkU3RhdGVQcm92aWRlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJmNDY3Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0Fic3RyYWN0SXRlbVN0cnVjdHVyZWRTdGF0ZVByb3ZpZGVyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5TdHJ1Y3R1cmVkU3RhdGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUnVubmFibGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBUaGlzIHByb3ZpZGVyIG1haW50YWlucyBjYWNoZXMgb2YgaXRlbSBjb250ZW50IGFuZCBsYWJlbCBwcm92aWRlcnMsIGVhY2gKLSAqIGtleWVkIGJ5IGl0ZW0uIFRoaXMgYWxsb3dzIHRoZSBwcm92aWRlcnMgdG8gbGlzdGVuIHRvIHRoZSBpdGVtcyBhbmQgdXBkYXRlCi0gKiB0aGUgdmlld2VyIGFzIG5lY2Vzc2FyeS4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gVGhpcyBjbGFzcywgaWYgdXNlZCBhcyBhIGxhYmVsIHByb3ZpZGVyIHNob3VsZCB0eXBpY2FsbHkKLSAqIGJlIHVzZWQgYWxzbyBhcyBhIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBzYW1lIHZpZXdlci4gT3RoZXJ3aXNlLCB0aGUgaXRlbQotICogbGFiZWwgcHJvdmlkZXJzIHdpbGwgbm90IGJlIGRpc3Bvc2VkIHVudGlsIHRoZSB2aWV3ZXIgaXMgZGlzcG9zZWQ7IGJlY2F1c2UKLSAqIHRoZSBpdGVtIGxhYmVsIHByb3ZpZGVycyBhcmUgZGlzcG9zZWQgKGhlcmUpIGFzIHRoZWlyIGFzc29jaWF0ZWQgaXRlbXMgYXJlCi0gKiBkaXNwb3NlZCBieSB0aGVpciBpdGVtIGNvbnRlbnQgcHJvdmlkZXJzLCB3aGljaCBhcmUgbGlzdGVuaW5nIHRvIHRoZSBpdGVtcy4KLSAqIFRoaXMgaXMgb25seSBhIHByb2JsZW0gaWYgdGhlIGl0ZW1zIGluIHRoZSB0cmVlIGNhbiBiZSByZW1vdmVkLCB0aHVzIGxlYWtpbmcKLSAqIHN0YWxlIGl0ZW0gbGFiZWwgcHJvdmlkZXJzIGluIHRoZSBtYW5hZ2VyJ3MgY2FjaGUuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzCi0gKiB0byBkaXNhbGxvdyB1c2luZyB0aGUgbWFuYWdlciBhcyBvbmx5IGEgbGFiZWwgcHJvdmlkZXIgKHNlZQotICoge0BsaW5rICNjaGVja1ZpZXdlcigpfSkuCi0gKiAKLSAqIEBzZWUgSXRlbVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAqIEBzZWUgSXRlbUV4dGVuZGVkTGFiZWxQcm92aWRlcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJdGVtU3RydWN0dXJlZFN0YXRlUHJvdmlkZXJNYW5hZ2VyPFYgZXh0ZW5kcyBTdHJ1Y3R1cmVkVmlld2VyLCBDUCBleHRlbmRzIEl0ZW1TdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyPgotCWV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIKLQlpbXBsZW1lbnRzIFN0cnVjdHVyZWRTdGF0ZVByb3ZpZGVyLCBJdGVtU3RydWN0dXJlZENvbnRlbnRQcm92aWRlci5NYW5hZ2VyLCBJdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyLk1hbmFnZXIKLXsKLQkvKioKLQkgKiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEl0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXJGYWN0b3J5IGl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLQotCXByb3RlY3RlZCBmaW5hbCBIYXNoTWFwPE9iamVjdCwgQ1A+IGl0ZW1Db250ZW50UHJvdmlkZXJzID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBDUD4oKTsKLQotCXByb3RlY3RlZCBmaW5hbCBIYXNoTWFwPE9iamVjdCwgSXRlbUV4dGVuZGVkTGFiZWxQcm92aWRlcj4gaXRlbUxhYmVsUHJvdmlkZXJzID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBJdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyPigpOwotCi0JcHJvdGVjdGVkIHZvbGF0aWxlIFYgdmlld2VyOwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RJdGVtU3RydWN0dXJlZFN0YXRlUHJvdmlkZXJNYW5hZ2VyKEl0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXJGYWN0b3J5IGl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSA9IGl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udGVudCBwcm92aWRlciAqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2LCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlpZiAob2xkSW5wdXQgIT0gbmV3SW5wdXQpIHsKLQkJCXRoaXMuZGlzcG9zZVByb3ZpZGVycygpOwotCQl9Ci0JCXRoaXMudmlld2VyID0gKFYpIHY7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJQ1AgcHJvdmlkZXIgPSB0aGlzLmdldEl0ZW1Db250ZW50UHJvdmlkZXIoaW5wdXRFbGVtZW50KTsKLQkJcmV0dXJuIChwcm92aWRlciA9PSBudWxsKSA/IEVNUFRZX0FSUkFZIDogcHJvdmlkZXIuZ2V0RWxlbWVudHMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGFiZWwgcHJvdmlkZXIgKioqKioqKioqKgotCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCUl0ZW1MYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gdGhpcy5nZXRJdGVtTGFiZWxQcm92aWRlcihlbGVtZW50KTsKLQkJcmV0dXJuIChwcm92aWRlciA9PSBudWxsKSA/IG51bGwgOnByb3ZpZGVyLmdldEltYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCUl0ZW1MYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gdGhpcy5nZXRJdGVtTGFiZWxQcm92aWRlcihlbGVtZW50KTsKLQkJcmV0dXJuIChwcm92aWRlciA9PSBudWxsKSA/IG51bGwgOiBwcm92aWRlci5nZXRUZXh0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihPYmplY3QgZWxlbWVudCkgewotCQlJdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gdGhpcy5nZXRJdGVtTGFiZWxQcm92aWRlcihlbGVtZW50KTsKLQkJcmV0dXJuIChwcm92aWRlciA9PSBudWxsKSA/IG51bGwgOiBwcm92aWRlci5nZXREZXNjcmlwdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpdGVtIHByb3ZpZGVyIGNhY2hlcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIENQIGdldEl0ZW1Db250ZW50UHJvdmlkZXIoT2JqZWN0IGl0ZW0pIHsKLQkJQ1AgcHJvdmlkZXIgPSB0aGlzLml0ZW1Db250ZW50UHJvdmlkZXJzLmdldChpdGVtKTsKLQkJaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLQkJCWlmICggISB0aGlzLml0ZW1Db250ZW50UHJvdmlkZXJzLmNvbnRhaW5zS2V5KGl0ZW0pKSB7ICAvLyBudWxsIGlzIGFuIGFsbG93ZWQgdmFsdWUKLQkJCQlwcm92aWRlciA9IHRoaXMuYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKGl0ZW0pOwotCQkJCXRoaXMuaXRlbUNvbnRlbnRQcm92aWRlcnMucHV0KGl0ZW0sIHByb3ZpZGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvdmlkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IENQIGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcihPYmplY3QgaXRlbSk7Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIEl0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXIgZ2V0SXRlbUxhYmVsUHJvdmlkZXIoT2JqZWN0IGl0ZW0pIHsKLQkJSXRlbUV4dGVuZGVkTGFiZWxQcm92aWRlciBwcm92aWRlciA9IHRoaXMuaXRlbUxhYmVsUHJvdmlkZXJzLmdldChpdGVtKTsKLQkJaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLQkJCWlmICggISB0aGlzLml0ZW1MYWJlbFByb3ZpZGVycy5jb250YWluc0tleShpdGVtKSkgeyAgLy8gbnVsbCBpcyBhbiBhbGxvd2VkIHZhbHVlCi0JCQkJcHJvdmlkZXIgPSB0aGlzLmJ1aWxkSXRlbUxhYmVsUHJvdmlkZXIoaXRlbSk7Ci0JCQkJdGhpcy5pdGVtTGFiZWxQcm92aWRlcnMucHV0KGl0ZW0sIHByb3ZpZGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvdmlkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXIgYnVpbGRJdGVtTGFiZWxQcm92aWRlcihPYmplY3QgaXRlbSkgewotCQl0aGlzLmNoZWNrVmlld2VyKCk7Ci0JCXJldHVybiAodGhpcy5pdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5pdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuYnVpbGRQcm92aWRlcihpdGVtLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdmlld2VyIHBhc3NlcyBpdHNlbGYgdG8gaXRzIGNvbnRlbnQgcHJvdmlkZXI7IHNvIGl0IHdpbGwgYmUKLQkgKiBpbml0aWFsaXplZCBieSB0aGUgdGltZSB3ZSBnZXQgaGVyZSBpZiB0aGlzIHByb3ZpZGVyIGlzIHRoZQotCSAqIHZpZXdlcidzIGNvbnRlbnQgcHJvdmlkZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tWaWV3ZXIoKSB7Ci0JCWlmICh0aGlzLnZpZXdlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIHByb3ZpZGVyIG11c3QgYmUgdXNlZCBhcyBhIGNvbnRlbnQgcHJvdmlkZXIgKmFzIHdlbGwgYXMqIGEgbGFiZWwgcHJvdmlkZXIuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB1cGRhdGUgZWxlbWVudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogRGlzcGF0Y2ggdG8gdGhlIFVJIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZShuZXcgVXBkYXRlRWxlbWVudHNSdW5uYWJsZShpbnB1dEVsZW1lbnQpKTsKLQl9Ci0KLQkvKiBDVSBwcml2YXRlICovIGNsYXNzIFVwZGF0ZUVsZW1lbnRzUnVubmFibGUKLQkJZXh0ZW5kcyBSdW5uYWJsZUFkYXB0ZXIKLQl7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IGlucHV0RWxlbWVudDsKLQkJVXBkYXRlRWxlbWVudHNSdW5uYWJsZShPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pbnB1dEVsZW1lbnQgPSBpbnB1dEVsZW1lbnQ7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCUFic3RyYWN0SXRlbVN0cnVjdHVyZWRTdGF0ZVByb3ZpZGVyTWFuYWdlci50aGlzLnVwZGF0ZUVsZW1lbnRzXyh0aGlzLmlucHV0RWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHNwZWNpZmllZCBpdGVtJ3MgZWxlbWVudHMuCi0JICovCi0JLyogQ1UgcHJpdmF0ZSAqLyB2b2lkIHVwZGF0ZUVsZW1lbnRzXyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmICh0aGlzLnZpZXdlcklzQWxpdmUoKSkgewotCQkJdGhpcy52aWV3ZXIucmVmcmVzaChpbnB1dEVsZW1lbnQpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHVwZGF0ZSBsYWJlbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBEaXNwYXRjaCB0byB0aGUgVUkgdGhyZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUxhYmVsKE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMuZXhlY3V0ZShuZXcgVXBkYXRlTGFiZWxSdW5uYWJsZShpdGVtKSk7Ci0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyBjbGFzcyBVcGRhdGVMYWJlbFJ1bm5hYmxlCi0JCWV4dGVuZHMgUnVubmFibGVBZGFwdGVyCi0JewotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBpdGVtOwotCQlVcGRhdGVMYWJlbFJ1bm5hYmxlKE9iamVjdCBpdGVtKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVtID0gaXRlbTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJQWJzdHJhY3RJdGVtU3RydWN0dXJlZFN0YXRlUHJvdmlkZXJNYW5hZ2VyLnRoaXMudXBkYXRlTGFiZWxfKHRoaXMuaXRlbSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHNwZWNpZmllZCBpdGVtJ3MgbGFiZWwuCi0JICovCi0JLyogQ1UgcHJpdmF0ZSAqLyB2b2lkIHVwZGF0ZUxhYmVsXyhPYmplY3QgaXRlbSkgewotCQlpZiAodGhpcy52aWV3ZXJJc0FsaXZlKCkpIHsKLQkJCXRoaXMuZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKG5ldyBMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50KHRoaXMsIGl0ZW0pKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB1cGRhdGUgZGVzY3JpcHRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdXBkYXRlRGVzY3JpcHRpb24oT2JqZWN0IGl0ZW0pIHsKLQkJLy8gTk9QIC0gY3VycmVudGx5IHRoZXJlIGlzIG5vIHdheSBhZmZlY3QgdGhlIHN0YXR1cyBiYXI7Ci0JCS8vIGl0IGlzIHVwZGF0ZWQgd2hlbiB0aGUgdmlld2VyJ3Mgc2VsZWN0aW9uIGNoYW5nZXMKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCVNXVFV0aWwuZXhlY3V0ZSh0aGlzLnZpZXdlciwgcnVubmFibGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZpZXdlcklzQWxpdmUoKSB7Ci0JCUNvbnRyb2wgY29udHJvbCA9ICh0aGlzLnZpZXdlciA9PSBudWxsKSA/IG51bGwgOiB0aGlzLnZpZXdlci5nZXRDb250cm9sKCk7Ci0JCXJldHVybiAoY29udHJvbCAhPSBudWxsKSAmJiAhIGNvbnRyb2wuaXNEaXNwb3NlZCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXNwb3NlICoqKioqKioqKioKLQotCS8qKgotCSAqIERpc3Bvc2VzIGFsbCBpdGVtcwotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmRpc3Bvc2VQcm92aWRlcnMoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaXNwb3NlUHJvdmlkZXJzKCkgewotCQkvLyBjb2RlZCB0aGlzIHdheSBiZWNhdXNlIHRoZSBpdGVtIHByb3ZpZGVycyB3aWxsIGNhbGwgYmFjayB0byB0aGlzCi0JCS8vIG1hbmFnZXIgdG8gZGlzcG9zZSB0aGVpciBjaGlsZHJlbiB3aGVuIHRoZXkgYXJlIGRpc3Bvc2VkCi0JCXdoaWxlICggISB0aGlzLml0ZW1Db250ZW50UHJvdmlkZXJzLmlzRW1wdHkoKSkgewotCQkJdGhpcy5kaXNwb3NlXyh0aGlzLml0ZW1Db250ZW50UHJvdmlkZXJzLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJfQotCQkvLyBkaXNwb3NlIHRoZSBsYWJlbCBwcm92aWRlcnMgZm9yIGFueSBpdGVtcyB0aGF0IGRpZCBub3QgaGF2ZSBhIGNvbnRlbnQgcHJvdmlkZXI7Ci0JCS8vIGFsdGhvdWdoIHRoYXQgaXMgbW9zdCBsaWtlbHkgYSBidWcsIGl0IGlzIGFsbG93ZWQgYW5kIGhhbmRsZWQKLQkJd2hpbGUgKCEgdGhpcy5pdGVtTGFiZWxQcm92aWRlcnMuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmRpc3Bvc2VfKHRoaXMuaXRlbUxhYmVsUHJvdmlkZXJzLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3Bvc2UgdGhlIHNwZWNpZmllZCBpdGVtJ3MgY29udGVudCBhbmQgbGFiZWwgcHJvdmlkZXJzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkaXNwb3NlKE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMuZGlzcG9zZV8oaXRlbSk7Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VfKE9iamVjdCBpdGVtKSB7Ci0JCUl0ZW1TdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGljcCA9IHRoaXMuaXRlbUNvbnRlbnRQcm92aWRlcnMucmVtb3ZlKGl0ZW0pOwotCQlpZiAoaWNwICE9IG51bGwpIHsKLQkJCWljcC5kaXNwb3NlKCk7Ci0JCX0KLQkJSXRlbUxhYmVsUHJvdmlkZXIgaWxwID0gdGhpcy5pdGVtTGFiZWxQcm92aWRlcnMucmVtb3ZlKGl0ZW0pOwotCQlpZiAoaWxwICE9IG51bGwpIHsKLQkJCWlscC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0Fic3RyYWN0SXRlbVRyZWVDb250ZW50UHJvdmlkZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvQWJzdHJhY3RJdGVtVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzliNWE2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvQWJzdHJhY3RJdGVtVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLS8qKgotICogQWJzdHJhY3Qge0BsaW5rIEl0ZW1UcmVlQ29udGVudFByb3ZpZGVyfSB0aGF0IHByb3ZpZGVzIHN1cHBvcnQgZm9yIGxpc3RlbmluZyB0byBhbgotICoge0BsaW5rICNpdGVtfSBhbmQgbm90aWZ5aW5nIHRoZQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbVRyZWVDb250ZW50UHJvdmlkZXIuTWFuYWdlciBtYW5hZ2VyfQotICogd2hlbmV2ZXIgdGhlIGl0ZW0ncyBjaGlsZHJlbiBjaGFuZ2UgaW4gYSBzaWduaWZpY2FudCB3YXkuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBtZXRob2Q6PHVsPgotICogPGxpPntAbGluayAjYnVpbGRDaGlsZHJlbk1vZGVsKCl9PGJyPgotICogCSAgIFJldHVybiBhIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0gdGhhdCByZXByZXNlbnRzIHRoZSBpdGVtJ3MgY2hpbGRyZW4KLSAqIDwvdWw+Ci0gKiAKLSAqIEBzZWUgU3RhdGljSXRlbVRyZWVDb250ZW50UHJvdmlkZXIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SXRlbVRyZWVDb250ZW50UHJvdmlkZXI8SSwgQz4KLQlpbXBsZW1lbnRzIEl0ZW1UcmVlQ29udGVudFByb3ZpZGVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE1hbmFnZXIgbWFuYWdlcjsKLQotCXByb3RlY3RlZCBmaW5hbCBJIGl0ZW07Ci0KLQlwcm90ZWN0ZWQgdm9sYXRpbGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8Qz4gY2hpbGRyZW5Nb2RlbDsKLQotCXByb3RlY3RlZCB2b2xhdGlsZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgY2hpbGRyZW5MaXN0ZW5lcjsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0SXRlbVRyZWVDb250ZW50UHJvdmlkZXIoSSBpdGVtLCBNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5pdGVtID0gaXRlbTsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hpbGRyZW4gKioqKioqKioqKgotCi0JLyoqCi0JICogVHlwaWNhbCBpbXBsZW1lbnRhdGlvbiBmb3IgYSB0cmVlLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4oKTsKLQl9Ci0KLQkvLyBUT0RPIGJqdgotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbigpIHsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIEFycmF5VG9vbHMuYXJyYXkodGhpcy5nZXRDaGlsZHJlbk1vZGVsKCkpOwotCQkJfSBjYXRjaCAoQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCS8vIHRyeSBhZ2FpbiAtIGhhY2s6IG5lZWQgdG8gbWFrZSB2YWx1ZSBtb2RlbCBzdHVmZiB0aHJlYWQtc2FmZS4uLgotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjaGlsZHJlbiBtb2RlbCAobGF6eS1pbml0aWFsaXplZCkuCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxDPiBnZXRDaGlsZHJlbk1vZGVsKCkgewotCQlpZiAodGhpcy5jaGlsZHJlbk1vZGVsID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW5Nb2RlbCA9IHRoaXMuYnVpbGRDaGlsZHJlbk1vZGVsKCk7Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ2hpbGRyZW5MaXN0ZW5lcigpOwotCQkJdGhpcy5lbmdhZ2VDaGlsZHJlbk1vZGVsKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW5Nb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjaGlsZHJlbiBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29sbGVjdGlvblZhbHVlTW9kZWw8Qz4gYnVpbGRDaGlsZHJlbk1vZGVsKCk7Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB3aXRoIHBvdGVudGlhbGx5IG1vcmUgZWZmaWNpZW50IGxvZ2ljLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGlsZHJlbk1vZGVsKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJdGhpcy5jaGlsZHJlbk1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuY2hpbGRyZW5MaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJdGhpcy5jaGlsZHJlbk1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuY2hpbGRyZW5MaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRDaGlsZHJlbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoaWxkcmVuTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgQ2hpbGRyZW5MaXN0ZW5lcgotCQlleHRlbmRzIENvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyCi0JewotCQlAT3ZlcnJpZGUKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQlBYnN0cmFjdEl0ZW1UcmVlQ29udGVudFByb3ZpZGVyLnRoaXMuY2hpbGRyZW5BZGRlZCgoSXRlcmFibGU8Qz4pIGV2ZW50LmdldEl0ZW1zKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQlBYnN0cmFjdEl0ZW1UcmVlQ29udGVudFByb3ZpZGVyLnRoaXMuY2hpbGRyZW5SZW1vdmVkKChJdGVyYWJsZTxDPikgZXZlbnQuZ2V0SXRlbXMoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gQW55IHJlbW92ZWQgY2hpbGRyZW4gd2lsbCBtYWxpbmdlciB1bnRpbCB0aGUKLQkJICogbWFuYWdlciBpdHNlbGYgaXMgZGlzcG9zZWQuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlBYnN0cmFjdEl0ZW1UcmVlQ29udGVudFByb3ZpZGVyLnRoaXMuY2hpbGRyZW5DaGFuZ2VkKCk7Ci0JCX0KLQotCQkvKioKLQkJICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gQW55IHJlbW92ZWQgY2hpbGRyZW4gd2lsbCBtYWxpbmdlciB1bnRpbCB0aGUKLQkJICogbWFuYWdlciBpdHNlbGYgaXMgZGlzcG9zZWQuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCUFic3RyYWN0SXRlbVRyZWVDb250ZW50UHJvdmlkZXIudGhpcy5jaGlsZHJlbkNoYW5nZWQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoaWxkcmVuQWRkZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEl0ZXJhYmxlPEM+IGNoaWxkcmVuKSB7Ci0JCXRoaXMubWFuYWdlci51cGRhdGVDaGlsZHJlbih0aGlzLml0ZW0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoaWxkcmVuUmVtb3ZlZChJdGVyYWJsZTxDPiBjaGlsZHJlbikgewotCQl0aGlzLm1hbmFnZXIudXBkYXRlQ2hpbGRyZW4odGhpcy5pdGVtKTsKLQkJZm9yIChPYmplY3QgY2hpbGQgOiBjaGlsZHJlbikgewotCQkJdGhpcy5tYW5hZ2VyLmRpc3Bvc2UoY2hpbGQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKCkgewotCQl0aGlzLm1hbmFnZXIudXBkYXRlQ2hpbGRyZW4odGhpcy5pdGVtKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGlzcG9zZSAqKioqKioqKioqCi0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW5Nb2RlbCAhPSBudWxsKSB7Ci0JCQl0aGlzLmRpc3Bvc2VfKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiB7QGxpbmsgI2NoaWxkcmVuTW9kZWx9IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlXygpIHsKLQkJZm9yIChPYmplY3QgY2hpbGQgOiB0aGlzLmNoaWxkcmVuTW9kZWwpIHsKLQkJCXRoaXMubWFuYWdlci5kaXNwb3NlKGNoaWxkKTsKLQkJfQotCQl0aGlzLmRpc2VuZ2FnZUNoaWxkcmVuTW9kZWwoKTsKLQkJdGhpcy5jaGlsZHJlbk1vZGVsID0gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZW0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvQWJzdHJhY3RTZWxlY3Rpb25Qcm92aWRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9BYnN0cmFjdFNlbGVjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkN2U2ZWQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9BYnN0cmFjdFNlbGVjdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLmNvbW1vbi5FdmVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogUHJvdmlkZSBzdXBwb3J0IGZvciB7QGxpbmsgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb24gY2hhbmdlCi0gKiBsaXN0ZW5lcnN9IGFuZCB7QGxpbmsgI2ZpcmVTZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24pIHRoZSBzYWZlIGZpcmluZyBvZgotICogZXZlbnRzfS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VsZWN0aW9uUHJvdmlkZXIKLQlleHRlbmRzIEV2ZW50TWFuYWdlcgotCWltcGxlbWVudHMgSVNlbGVjdGlvblByb3ZpZGVyCi17Ci0JcHJvdGVjdGVkIEFic3RyYWN0U2VsZWN0aW9uUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5hZGRMaXN0ZW5lck9iamVjdChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5yZW1vdmVMaXN0ZW5lck9iamVjdChsaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVNlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBzZWxlY3Rpb24pOwotCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IHRoaXMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCVNhZmVSdW5uZXIucnVuKG5ldyBMaXN0ZW5lck5vdGlmaWVyKGxpc3RlbmVyLCBldmVudCkpOwotICAgICAgICB9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVyIG5vdGlmaWVyICoqKioqKioqKioKLQotCS8qKgotCSAqIEEgcnVubmFibGUgdGhhdCBmb3J3YXJkcyBhbiBldmVudCB0byBhIGxpc3RlbmVyIGFuZCBoYW5kbGVzIGFueQotCSAqIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSBsaXN0ZW5lciBieSBub3RpZnlpbmcgdGhlIHVzZXIgdmlhIGEgZGlhbG9nLgotCSAqLwotCS8qIENVIHByaXZhdGUgKi8gY2xhc3MgTGlzdGVuZXJOb3RpZmllcgotCQlleHRlbmRzIFNhZmVSdW5uYWJsZQotCXsKLQkJcHJpdmF0ZSBmaW5hbCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyOwotCQlwcml2YXRlIGZpbmFsIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudDsKLQotCQlMaXN0ZW5lck5vdGlmaWVyKE9iamVjdCBsaXN0ZW5lciwgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5saXN0ZW5lciA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBsaXN0ZW5lcjsKLQkJCXRoaXMuZXZlbnQgPSBldmVudDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRoaXMubGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZCh0aGlzLmV2ZW50KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0ZW5lcik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0FyY2hpdmVGaWxlVmlld2VyRmlsdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0FyY2hpdmVGaWxlVmlld2VyRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZmY1NTEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9BcmNoaXZlRmlsZVZpZXdlckZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLkpwdENvbW1vblVpUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgZmlsdGVyIHdpbGwgZGVueSBzaG93aW5nIGFueSBmaWxlIHRoYXQgYXJlIG5vdCBKQVIgZmlsZXMgb3IgZm9sZGVycwotICogdGhhdCBkb24ndCBjb250YWluIGFueSBKQVIgZmlsZXMgaW4gaXRzIHN1Yi1oaWVyYXJjaHkuIAotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZUZpbGVWaWV3ZXJGaWx0ZXIgCi0JZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gYXJjaGl2ZUV4dGVuc2lvbnM9IHsgImphciIsICJ6aXAiIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkKLQkKLQlwdWJsaWMgQXJjaGl2ZUZpbGVWaWV3ZXJGaWx0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHNlbGVjdCgKLQkJCVZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlyZXR1cm4gaXNBcmNoaXZlUGF0aCgoKElGaWxlKWVsZW1lbnQpLmdldEZ1bGxQYXRoKCkpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKSBlbGVtZW50OwotCQkJdHJ5IHsKLQkJCQlmb3IgKElSZXNvdXJjZSBlYWNoIDogZm9sZGVyLm1lbWJlcnMoKSkgewotCQkJCQlpZiAoc2VsZWN0KHZpZXdlciwgZm9sZGVyLCBlYWNoKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCS8vIGp1c3Qgc2tpcCB0aGlzIG9uZSwgdGhlbgotCQkJCUpwdENvbW1vblVpUGx1Z2luLmxvZyhjZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcmNoaXZlUGF0aChJUGF0aCBwYXRoKSB7Ci0JCVN0cmluZyBleHQ9IHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOwotCQlpZiAoZXh0ICE9IG51bGwgJiYgZXh0Lmxlbmd0aCgpICE9IDApIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBhcmNoaXZlRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChleHQuZXF1YWxzSWdub3JlQ2FzZShhcmNoaXZlRXh0ZW5zaW9uc1tpXSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9CQkKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvQ29udGVudFByb3ZpZGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0NvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzZmNzc0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJQ29udGVudFByb3ZpZGVyfS4KLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRQcm92aWRlcgotCWltcGxlbWVudHMgSUNvbnRlbnRQcm92aWRlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIElDb250ZW50UHJvdmlkZXIgTlVMTF9QUk9WSURFUiA9IG5ldyBDb250ZW50UHJvdmlkZXIoKTsKLQotCXB1YmxpYyBzdGF0aWMgSUNvbnRlbnRQcm92aWRlciBudWxsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBOVUxMX1BST1ZJREVSOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvRW1wdHlTZWxlY3Rpb24uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvRW1wdHlTZWxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg5ZDBmNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0VtcHR5U2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEVtcHR5IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJU2VsZWN0aW9ufS4KLSAqIEltcGxlbWVudGVkIGFzIGEgc2luZ2xldG9uLgotICovCi1wdWJsaWMgY2xhc3MgRW1wdHlTZWxlY3Rpb24KLQlpbXBsZW1lbnRzIElTZWxlY3Rpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTZWxlY3Rpb24gSU5TVEFOQ0UgPSBuZXcgRW1wdHlTZWxlY3Rpb24oKTsKLQotCXB1YmxpYyBzdGF0aWMgSVNlbGVjdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBhIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVtcHR5U2VsZWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvSW1hZ2VJbWFnZURlc2NyaXB0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvSW1hZ2VJbWFnZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIwNzllMC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0ltYWdlSW1hZ2VEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLQotLyoqCi0gKiBJbWFnZSBkZXNjcmlwdG9yIGZvciBhbiBpbWFnZS4KLSAqLwotcHVibGljIGNsYXNzIEltYWdlSW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgSW1hZ2VEZXNjcmlwdG9yIAotewotCQotCXByaXZhdGUgSW1hZ2UgZkltYWdlOwotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBJbWFnSW1hZ2VEZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBJbWFnZUltYWdlRGVzY3JpcHRvcihJbWFnZSBpbWFnZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmZJbWFnZSA9IGltYWdlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gKG9iaiAhPSBudWxsKSAmJiBnZXRDbGFzcygpLmVxdWFscyhvYmouZ2V0Q2xhc3MoKSkgJiYgdGhpcy5mSW1hZ2UuZXF1YWxzKCgoSW1hZ2VJbWFnZURlc2NyaXB0b3IpIG9iaikuZkltYWdlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlRGF0YSBnZXRJbWFnZURhdGEoKSB7Ci0JCXJldHVybiB0aGlzLmZJbWFnZS5nZXRJbWFnZURhdGEoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuZkltYWdlLmhhc2hDb2RlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9JdGVtU3RydWN0dXJlZFN0YXRlUHJvdmlkZXJNYW5hZ2VyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0l0ZW1TdHJ1Y3R1cmVkU3RhdGVQcm92aWRlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3YzFkNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0l0ZW1TdHJ1Y3R1cmVkU3RhdGVQcm92aWRlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci0KLS8qKgotICogQHNlZSBBYnN0cmFjdEl0ZW1TdHJ1Y3R1cmVkU3RhdGVQcm92aWRlck1hbmFnZXIKLSAqLwotcHVibGljIGNsYXNzIEl0ZW1TdHJ1Y3R1cmVkU3RhdGVQcm92aWRlck1hbmFnZXIKLQlleHRlbmRzIEFic3RyYWN0SXRlbVN0cnVjdHVyZWRTdGF0ZVByb3ZpZGVyTWFuYWdlcjxTdHJ1Y3R1cmVkVmlld2VyLCBJdGVtU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcj4KLXsKLQkvKioKLQkgKiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSXRlbVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJGYWN0b3J5IGl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotCi0KLQlwdWJsaWMgSXRlbVN0cnVjdHVyZWRTdGF0ZVByb3ZpZGVyTWFuYWdlcihJdGVtU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckZhY3RvcnkgaXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkpIHsKLQkJdGhpcyhpdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEl0ZW1TdHJ1Y3R1cmVkU3RhdGVQcm92aWRlck1hbmFnZXIoSXRlbVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJGYWN0b3J5IGl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LCBJdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyRmFjdG9yeSBpdGVtTGFiZWxQcm92aWRlckZhY3RvcnkpIHsKLQkJc3VwZXIoaXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KTsKLQkJaWYgKGl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuaXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgPSBpdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlbVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKE9iamVjdCBpdGVtKSB7Ci0JCXJldHVybiB0aGlzLml0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmJ1aWxkUHJvdmlkZXIoaXRlbSwgdGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9JdGVtVHJlZVN0YXRlUHJvdmlkZXJNYW5hZ2VyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0l0ZW1UcmVlU3RhdGVQcm92aWRlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkNDBlZi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0l0ZW1UcmVlU3RhdGVQcm92aWRlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1UcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbVRyZWVDb250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuVHJlZVN0YXRlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJ1bm5hYmxlQWRhcHRlcjsKLQotLyoqCi0gKiBAc2VlIEFic3RyYWN0SXRlbVN0cnVjdHVyZWRTdGF0ZVByb3ZpZGVyTWFuYWdlcgotICogQHNlZSBJdGVtVHJlZUNvbnRlbnRQcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgSXRlbVRyZWVTdGF0ZVByb3ZpZGVyTWFuYWdlcgotCWV4dGVuZHMgQWJzdHJhY3RJdGVtU3RydWN0dXJlZFN0YXRlUHJvdmlkZXJNYW5hZ2VyPFRyZWVWaWV3ZXIsIEl0ZW1UcmVlQ29udGVudFByb3ZpZGVyPgotCWltcGxlbWVudHMgVHJlZVN0YXRlUHJvdmlkZXIsIEl0ZW1UcmVlQ29udGVudFByb3ZpZGVyLk1hbmFnZXIKLXsKLQkvKioKLQkgKiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSXRlbVRyZWVDb250ZW50UHJvdmlkZXJGYWN0b3J5IGl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotCi0KLQlwdWJsaWMgSXRlbVRyZWVTdGF0ZVByb3ZpZGVyTWFuYWdlcihJdGVtVHJlZUNvbnRlbnRQcm92aWRlckZhY3RvcnkgaXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkpIHsKLQkJdGhpcyhpdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEl0ZW1UcmVlU3RhdGVQcm92aWRlck1hbmFnZXIoSXRlbVRyZWVDb250ZW50UHJvdmlkZXJGYWN0b3J5IGl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LCBJdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyRmFjdG9yeSBpdGVtTGFiZWxQcm92aWRlckZhY3RvcnkpIHsKLQkJc3VwZXIoaXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KTsKLQkJaWYgKGl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuaXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgPSBpdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJlZSBjb250ZW50IHByb3ZpZGVyICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCUl0ZW1UcmVlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gdGhpcy5nZXRJdGVtQ29udGVudFByb3ZpZGVyKGVsZW1lbnQpOwotCQlyZXR1cm4gKHByb3ZpZGVyICE9IG51bGwpICYmIHByb3ZpZGVyLmhhc0NoaWxkcmVuKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCUl0ZW1UcmVlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gdGhpcy5nZXRJdGVtQ29udGVudFByb3ZpZGVyKHBhcmVudEVsZW1lbnQpOwotCQlyZXR1cm4gKHByb3ZpZGVyID09IG51bGwpID8gRU1QVFlfQVJSQVkgOiBwcm92aWRlci5nZXRDaGlsZHJlbigpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCUl0ZW1UcmVlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gdGhpcy5nZXRJdGVtQ29udGVudFByb3ZpZGVyKGVsZW1lbnQpOwotCQlyZXR1cm4gKHByb3ZpZGVyID09IG51bGwpID8gbnVsbCA6IHByb3ZpZGVyLmdldFBhcmVudCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVtVHJlZUNvbnRlbnRQcm92aWRlciBidWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoT2JqZWN0IGl0ZW0pIHsKLQkJcmV0dXJuIHRoaXMuaXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuYnVpbGRQcm92aWRlcihpdGVtLCB0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdXBkYXRlIGNoaWxkcmVuICoqKioqKioqKioKLQotCS8qKgotCSAqIERpc3BhdGNoIHRvIHRoZSBVSSB0aHJlYWQuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlQ2hpbGRyZW4oT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlTV1RVdGlsLmV4ZWN1dGUodGhpcy52aWV3ZXIsIG5ldyBVcGRhdGVDaGlsZHJlblJ1bm5hYmxlKGlucHV0RWxlbWVudCkpOwotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gY2xhc3MgVXBkYXRlQ2hpbGRyZW5SdW5uYWJsZQotCQlleHRlbmRzIFJ1bm5hYmxlQWRhcHRlcgotCXsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3QgZWxlbWVudDsKLQkJVXBkYXRlQ2hpbGRyZW5SdW5uYWJsZShPYmplY3QgZWxlbWVudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCUl0ZW1UcmVlU3RhdGVQcm92aWRlck1hbmFnZXIudGhpcy51cGRhdGVDaGlsZHJlbl8odGhpcy5lbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgc3BlY2lmaWVkIGl0ZW0ncyBjaGlsZHJlbi4KLQkgKi8KLQkvKiBDVSBwcml2YXRlICovIHZvaWQgdXBkYXRlQ2hpbGRyZW5fKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmICh0aGlzLnZpZXdlcklzQWxpdmUoKSkgewotCQkJdGhpcy52aWV3ZXIucmVmcmVzaChlbGVtZW50LCBmYWxzZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0xhYmVsUHJvdmlkZXJBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0xhYmVsUHJvdmlkZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZTdhYzEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9MYWJlbFByb3ZpZGVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElMYWJlbFByb3ZpZGVyTGlzdGVuZXJ9LgotICovCi1wdWJsaWMgY2xhc3MgTGFiZWxQcm92aWRlckFkYXB0ZXIKLQlpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIKLXsKLQlwdWJsaWMgdm9pZCBsYWJlbFByb3ZpZGVyQ2hhbmdlZChMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL05hdmlnYXRvckNvbnRlbnRQcm92aWRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9OYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdiYTEzNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL05hdmlnYXRvckNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbUV4dGVuZGVkTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtVHJlZUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5UcmVlU3RhdGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25Db250ZW50RXh0ZW5zaW9uU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkNvbnRlbnRQcm92aWRlcjsKLQotLyoqCi0gKiBUaGlzIGNvbnRlbnQgcHJvdmlkZXIgZGVsZWdhdGVzIHRvIGEge0BsaW5rIFRyZWVTdGF0ZVByb3ZpZGVyfSB0aGF0IGlzCi0gKiBzaGFyZWQgd2l0aCBhIHBhcnRuZXIge0BsaW5rIE5hdmlnYXRvckxhYmVsUHJvdmlkZXIgbGFiZWwgcHJvdmlkZXJ9LgotICogPHA+Ci0gKiBDb25jcmV0ZSBzdWJjbGFzc2VzIG9mIHRoaXMgcHJvdmlkZXIgY2FuIGJlIHVzZWQgYXMgdGhlIGNvbnRlbnQgcHJvdmlkZXIKLSAqIGluIGV4dGVuc2lvbnMgb2YgPGNvZGU+b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLm5hdmlnYXRvckNvbnRlbnQ8L2NvZGU+LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyCi0JaW1wbGVtZW50cyBJQ29tbW9uQ29udGVudFByb3ZpZGVyCi17Ci0JcHJvdGVjdGVkIFRyZWVTdGF0ZVByb3ZpZGVyIGRlbGVnYXRlOwotCi0KLQkvKioKLQkgKiBNdXN0IHVzZSB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yIGJlY2F1c2UgdGhlIHByb3ZpZGVyIGlzIGluc3RhbnRpYXRlZAotCSAqIGJ5IHRoZSBOYXZpZ2F0b3IgQ29udGVudCBleHRlbnNpb24gcG9pbnQKLQkgKiAoPGNvZGU+b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLm5hdmlnYXRvckNvbnRlbnQ8L2NvZGU+KS4KLQkgKi8KLQlwcm90ZWN0ZWQgTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb250ZW50IHByb3ZpZGVyIGlzIGluaXRpYWxpemVkIGZpcnN0OyBzbyB3ZSBidWlsZCB0aGUgZGVsZWdhdGUKLQkgKiBoZXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUNvbW1vbkNvbnRlbnRFeHRlbnNpb25TaXRlIGNvbmZpZykgewotCQl0aGlzLmRlbGVnYXRlID0gdGhpcy5idWlsZERlbGVnYXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRyZWVTdGF0ZVByb3ZpZGVyIGJ1aWxkRGVsZWdhdGUoKSB7Ci0JCXJldHVybiBuZXcgSXRlbVRyZWVTdGF0ZVByb3ZpZGVyTWFuYWdlcigKLQkJCQl0aGlzLmJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSwKLQkJCQl0aGlzLmJ1aWxkSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCkKLQkJCSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgZmFjdG9yeSB0aGF0IHdpbGwgYnVpbGQgaXRlbSBjb250ZW50IHByb3ZpZGVycyBmb3IgdGhlCi0JICogYXBwcm9wcmlhdGUgaXRlbXMgaW4gdGhlIG5hdmlnYXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlbVRyZWVDb250ZW50UHJvdmlkZXJGYWN0b3J5IGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGZhY3RvcnkgdGhhdCB3aWxsIGJ1aWxkIGl0ZW0gbGFiZWwgcHJvdmlkZXJzIGZvciB0aGUKLQkgKiBhcHByb3ByaWF0ZSBpdGVtcyBpbiB0aGUgbmF2aWdhdG9yLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyRmFjdG9yeSBidWlsZEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpOwotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciBjb21tb25WaWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCXRoaXMuZGVsZWdhdGUuaW5wdXRDaGFuZ2VkKGNvbW1vblZpZXdlciwgb2xkSW5wdXQsIG5ld0lucHV0KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkvLyBuZXZlciBjYWxsZWQ/Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0UGFyZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiB0aGlzLmhhc0NoaWxkcmVuXyhlbGVtZW50KSB8fCB0aGlzLmRlbGVnYXRlLmhhc0NoaWxkcmVuKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBoYXMgY2hpbGRyZW4uIFRoaXMgbWV0aG9kIGhhbmRsZXMKLQkgKiBhbnkgZWxlbWVudCB0aGF0IGlzIDxlbT5ub3Q8L2VtPiBoYW5kbGVkIGJ5IHRoZSB7QGxpbmsgI2RlbGVnYXRlfSBidXQgaXMKLQkgKiB0aGUgcGFyZW50IG9mIGVsZW1lbnQocykgdGhhdCA8ZW0+YXJlPC9lbT4gaGFuZGxlZCBieSB0aGUKLQkgKiB7QGxpbmsgI2RlbGVnYXRlfSAoaS5lLiBhbnkgdGhpcmQtcGFydHkgZWxlbWVudCB0aGF0IGlzIHRvIGhvbGQgdGhlCi0JICogcHJvdmlkZXIncyBlbGVtZW50czsgZS5nLiBhIHByb2plY3QpLiBSZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZQotCSAqIGVsZW1lbnQgaXMgdG8gYmUgaGFuZGxlZCBieSB0aGUge0BsaW5rICNkZWxlZ2F0ZX0uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaGFzQ2hpbGRyZW5fKE9iamVjdCBlbGVtZW50KTsKLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW5fKGVsZW1lbnQpOwotCQlyZXR1cm4gKGNoaWxkcmVuICE9IG51bGwpID8gY2hpbGRyZW4gOiB0aGlzLmRlbGVnYXRlLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQncyBjaGlsZHJlbi4gVGhpcyBtZXRob2QgaGFuZGxlcwotCSAqIGFueSBlbGVtZW50IHRoYXQgaXMgPGVtPm5vdDwvZW0+IGhhbmRsZWQgYnkgdGhlIHtAbGluayAjZGVsZWdhdGV9IGJ1dCBpcwotCSAqIHRoZSBwYXJlbnQgb2YgZWxlbWVudChzKSB0aGF0IDxlbT5hcmU8L2VtPiBoYW5kbGVkIGJ5IHRoZQotCSAqIHtAbGluayAjZGVsZWdhdGV9IChpLmUuIGFueSB0aGlyZC1wYXJ0eSBlbGVtZW50IHRoYXQgaXMgdG8gaG9sZCB0aGUKLQkgKiBwcm92aWRlcidzIGVsZW1lbnRzOyBlLmcuIGEgcHJvamVjdCkuIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiBlbGVtZW50IGlzIHRvIGJlIGhhbmRsZWQgYnkgdGhlIHtAbGluayAjZGVsZWdhdGV9LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3RbXSBnZXRDaGlsZHJlbl8oT2JqZWN0IGVsZW1lbnQpOwotCi0JcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJLy8gVE9ETwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc3RvcmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCS8vIFRPRE8KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmRlbGVnYXRlLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE5hdmlnYXRvckxhYmVsUHJvdmlkZXIjZ2V0RGVsZWdhdGUoKQotCSAqLwotCVRyZWVTdGF0ZVByb3ZpZGVyIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL05hdmlnYXRvckxhYmVsUHJvdmlkZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvTmF2aWdhdG9yTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODVhZTk3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvTmF2aWdhdG9yTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuTGFiZWxQcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5UcmVlU3RhdGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQ29udGVudEV4dGVuc2lvblNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25MYWJlbFByb3ZpZGVyOwotCi0vKioKLSAqIEBzZWUgTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyCi0gKiA8cD4KLSAqIFRoaXMgcHJvdmlkZXIgY2FuIGJlIHVzZWQgYXMgdGhlIGxhYmVsIHByb3ZpZGVyCi0gKiBpbiBleHRlbnNpb25zIG9mIDxjb2RlPm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50PC9jb2RlPi4KLSAqLwotcHVibGljIGNsYXNzIE5hdmlnYXRvckxhYmVsUHJvdmlkZXIKLQlleHRlbmRzIEJhc2VMYWJlbFByb3ZpZGVyCi0JaW1wbGVtZW50cyBJQ29tbW9uTGFiZWxQcm92aWRlcgotewotCS8qKgotCSAqICJQYXJ0bmVyIiBjb250ZW50IHByb3ZpZGVyIHRoYXQgaG9sZHMgdGhlIHRyZWUKLQkgKiBzdGF0ZSBwcm92aWRlci4KLQkgKi8KLQlwcml2YXRlIE5hdmlnYXRvckNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBMaXN0ZW4gdG8gdGhlIGRlbGVnYXRlIHByb3ZpZGVyIGFuZCBmb3J3YXJkIGFueSBldmVudHMuCi0JICovCi0JcHJpdmF0ZSBEZWxlZ2F0ZUxpc3RlbmVyIGRlbGVnYXRlTGlzdGVuZXI7Ci0KLQotCXB1YmxpYyBOYXZpZ2F0b3JMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUNvbW1vbkNvbnRlbnRFeHRlbnNpb25TaXRlIGNvbmZpZykgewotCQl0aGlzLmNvbnRlbnRQcm92aWRlciA9IChOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIpIGNvbmZpZy5nZXRFeHRlbnNpb24oKS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJdGhpcy5kZWxlZ2F0ZUxpc3RlbmVyID0gbmV3IERlbGVnYXRlTGlzdGVuZXIoKTsKLQkJdGhpcy5nZXREZWxlZ2F0ZSgpLmFkZExpc3RlbmVyKHRoaXMuZGVsZWdhdGVMaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGVsZWdhdGUoKS5pc0xhYmVsUHJvcGVydHkoZWxlbWVudCwgcHJvcGVydHkpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gdGhpcy5nZXREZWxlZ2F0ZSgpLmdldEltYWdlKGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gdGhpcy5nZXREZWxlZ2F0ZSgpLmdldFRleHQoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gdGhpcy5nZXREZWxlZ2F0ZSgpLmdldERlc2NyaXB0aW9uKGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCS8vIFRPRE8KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQkvLyBUT0RPCi0JfQotCi0JcHJpdmF0ZSBUcmVlU3RhdGVQcm92aWRlciBnZXREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29udGVudFByb3ZpZGVyLmdldERlbGVnYXRlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogTkI6IFRoZSBkZWxlZ2F0ZSB3aWxsIHJlbW92ZSBvdXIgbGlzdGVuZXIgd2hlbiBpdCBpcyBkaXNwb3NlZAotCSAqIGluIHtAbGluayBOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpfS4gOi0oCi0JICogQHNlZSBCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlbGVnYXRlIGxpc3RlbmVyICoqKioqKioqKioKLQotCS8qIENVIHByaXZhdGUgKi8gY2xhc3MgRGVsZWdhdGVMaXN0ZW5lcgotCQlleHRlbmRzIExhYmVsUHJvdmlkZXJBZGFwdGVyCi0JewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgbGFiZWxQcm92aWRlckNoYW5nZWQoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgewotCQkJTmF2aWdhdG9yTGFiZWxQcm92aWRlci50aGlzLmxhYmVsUHJvdmlkZXJDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gdm9pZCBsYWJlbFByb3ZpZGVyQ2hhbmdlZChMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGZvcndhcmQgdGhlIGV2ZW50IHdpdGggKnRoaXMqIHByb3ZpZGVyIGFzIHRoZSBzb3VyY2UKLQkJdGhpcy5maXJlTGFiZWxQcm92aWRlckNoYW5nZWQobmV3IExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQodGhpcywgZXZlbnQuZ2V0RWxlbWVudHMoKSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvUnVubmFibGVXaXRoUHJvZ3Jlc3NBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL1J1bm5hYmxlV2l0aFByb2dyZXNzQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzJhMGZhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvUnVubmFibGVXaXRoUHJvZ3Jlc3NBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJUnVubmFibGVXaXRoUHJvZ3Jlc3N9LgotICovCi1wdWJsaWMgY2xhc3MgUnVubmFibGVXaXRoUHJvZ3Jlc3NBZGFwdGVyCi0JaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MKLXsKLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkvLyBOT1AKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL1NlbGVjdGlvbkNoYW5nZWRBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL1NlbGVjdGlvbkNoYW5nZWRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NWFjMWMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9TZWxlY3Rpb25DaGFuZ2VkQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn0uCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25DaGFuZ2VkQWRhcHRlcgotCWltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotewotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL1NpbXBsZUl0ZW1UcmVlU3RhdGVQcm92aWRlckZhY3RvcnlQcm92aWRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9TaW1wbGVJdGVtVHJlZVN0YXRlUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0ZTcwNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL1NpbXBsZUl0ZW1UcmVlU3RhdGVQcm92aWRlckZhY3RvcnlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1UcmVlQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1UcmVlU3RhdGVQcm92aWRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJdGVtVHJlZVN0YXRlUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXJ9LgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlSXRlbVRyZWVTdGF0ZVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyCi0JaW1wbGVtZW50cyBJdGVtVHJlZVN0YXRlUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXIKLXsKLQlwcml2YXRlIGZpbmFsIEl0ZW1UcmVlQ29udGVudFByb3ZpZGVyRmFjdG9yeSBjb250ZW50UHJvdmlkZXJGYWN0b3J5OwotCXByaXZhdGUgZmluYWwgSXRlbUV4dGVuZGVkTGFiZWxQcm92aWRlckZhY3RvcnkgbGFiZWxQcm92aWRlckZhY3Rvcnk7Ci0KLQotCXB1YmxpYyBTaW1wbGVJdGVtVHJlZVN0YXRlUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXIoCi0JCQlJdGVtVHJlZUNvbnRlbnRQcm92aWRlckZhY3RvcnkgY29udGVudFByb3ZpZGVyRmFjdG9yeSwKLQkJCUl0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXJGYWN0b3J5IGxhYmVsUHJvdmlkZXJGYWN0b3J5Ci0JKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29udGVudFByb3ZpZGVyRmFjdG9yeSA9IGNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci0JCXRoaXMubGFiZWxQcm92aWRlckZhY3RvcnkgPSBsYWJlbFByb3ZpZGVyRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgSXRlbVRyZWVDb250ZW50UHJvdmlkZXJGYWN0b3J5IGdldEl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gdGhpcy5jb250ZW50UHJvdmlkZXJGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBJdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyRmFjdG9yeSBnZXRJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiB0aGlzLmxhYmVsUHJvdmlkZXJGYWN0b3J5OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvU2ltcGxlTWVzc2FnZVRyZWVDb250ZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL1NpbXBsZU1lc3NhZ2VUcmVlQ29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTAxOWVmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvU2ltcGxlTWVzc2FnZVRyZWVDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBUcmVlIGNvbnRlbnQgd2l0aCBhIHJvb3Qgd2l0aCBhIHNpbmdsZSBjaGlsZCwgdGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlCi0gKiBkaXNwbGF5ZWQgaW4gdGhlIHRyZWUgd2lkZ2V0LgotICogPHA+Ci0gKiBUbyBkaXNwbGF5IGEgbWVzc2FnZSBpbiBhIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXJ9OgotICogPHByZT4KLSAqICAgICBUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSAuLi47Ci0gKiAgICAgdHJlZVZpZXdlci5zZXRJbnB1dChudWxsKTsKLSAqICAgICB0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihTaW1wbGVNZXNzYWdlVHJlZUNvbnRlbnQuY29udGVudFByb3ZpZGVyKCkpOwotICogICAgIHRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihTaW1wbGVNZXNzYWdlVHJlZUNvbnRlbnQubGFiZWxQcm92aWRlcigpKTsKLSAqICAgICB0cmVlVmlld2VyLnNldElucHV0KG5ldyBTaW1wbGVNZXNzYWdlVHJlZUNvbnRlbnQoIm1lc3NhZ2UiKSk7Ci0gKiA8L3ByZT4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZU1lc3NhZ2VUcmVlQ29udGVudCB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKLQotCXB1YmxpYyBTaW1wbGVNZXNzYWdlVHJlZUNvbnRlbnQoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIHRoaXMubWVzc2FnZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJlZSBjb250ZW50IHByb3ZpZGVyICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gQ09OVEVOVF9QUk9WSURFUjsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJVHJlZUNvbnRlbnRQcm92aWRlciBDT05URU5UX1BST1ZJREVSID0gbmV3IENvbnRlbnRQcm92aWRlcigpOwotCi0JLyoqCi0JICogQ29udGVudCBwcm92aWRlciBmb3IgbWVzc2FnZSB0cmVlIGNvbnRlbnQuCi0JICovCi0JLyogQ1UgcHJpdmF0ZSAqLyBzdGF0aWMgY2xhc3MgQ29udGVudFByb3ZpZGVyCi0JCWV4dGVuZHMgVHJlZUNvbnRlbnRQcm92aWRlcgotCXsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBTaW1wbGVNZXNzYWdlVHJlZUNvbnRlbnQpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTaW1wbGVNZXNzYWdlVHJlZUNvbnRlbnQpIHsKLQkJCQlTdHJpbmcgbXNnID0gKChTaW1wbGVNZXNzYWdlVHJlZUNvbnRlbnQpIGVsZW1lbnQpLmdldE1lc3NhZ2UoKTsKLQkJCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgbXNnIH07Ci0JCQl9Ci0JCQlyZXR1cm4gRU1QVFlfQVJSQVk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGFiZWwgcHJvdmlkZXIgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gTEFCRUxfUFJPVklERVI7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUxhYmVsUHJvdmlkZXIgTEFCRUxfUFJPVklERVIgPSBuZXcgTGFiZWxQcm92aWRlcigpOwotCi0JLyoqCi0JICogTGFiZWwgcHJvdmlkZXIgZm9yIG1lc3NhZ2UgdHJlZSBjb250ZW50LgotCSAqLwotCS8qIENVIHByaXZhdGUgKi8gc3RhdGljIGNsYXNzIExhYmVsUHJvdmlkZXIKLQkJZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXIKLQl7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiAoZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZykgPyAoU3RyaW5nKSBlbGVtZW50IDogbnVsbDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9TdGF0aWNJdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL1N0YXRpY0l0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzM2EwMC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL1N0YXRpY0l0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbUV4dGVuZGVkTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogSXRlbSBsYWJlbCBwcm92aWRlciB0aGF0IGNvbnRhaW5zIHVuY2hhbmdpbmcgaW1hZ2UsIHRleHQsIGFuZCBkZXNjcmlwdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFN0YXRpY0l0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXIKLQlleHRlbmRzIFN0YXRpY0l0ZW1MYWJlbFByb3ZpZGVyCi0JaW1wbGVtZW50cyBJdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVtIGxhYmVsIHByb3ZpZGVyIHRoYXQgcmV0dXJucyB0aGUgc3BlY2lmaWVkIHRleHQKLQkgKiBidXQgbm8gaW1hZ2UuIFRoZSBwcm92aWRlciB3aWxsIGFsc28gcmV0dXJuIHRoZSBzcGVjaWZpZWQgdGV4dCBhcyB0aGUKLQkgKiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RhdGljSXRlbUV4dGVuZGVkTGFiZWxQcm92aWRlcihTdHJpbmcgdGV4dCkgewotCQl0aGlzKG51bGwsIHRleHQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVtIGxhYmVsIHByb3ZpZGVyIHRoYXQgcmV0dXJucyB0aGUgc3BlY2lmaWVkIGltYWdlCi0JICogYW5kIHRleHQuIFRoZSBwcm92aWRlciB3aWxsIGFsc28gcmV0dXJuIHRoZSBzcGVjaWZpZWQgdGV4dCBhcyB0aGUKLQkgKiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RhdGljSXRlbUV4dGVuZGVkTGFiZWxQcm92aWRlcihJbWFnZSBpbWFnZSwgU3RyaW5nIHRleHQpIHsKLQkJdGhpcyhpbWFnZSwgdGV4dCwgdGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZW0gbGFiZWwgcHJvdmlkZXIgdGhhdCByZXR1cm5zIHRoZSBzcGVjaWZpZWQgaW1hZ2UsIHRleHQsCi0JICogYW5kIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBTdGF0aWNJdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyKEltYWdlIGltYWdlLCBTdHJpbmcgdGV4dCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGltYWdlLCB0ZXh0KTsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvU3RhdGljSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvU3RhdGljSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk0MTVmMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL1N0YXRpY0l0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogSXRlbSBsYWJlbCBwcm92aWRlciB0aGF0IGNvbnRhaW5zIHVuY2hhbmdpbmcgaW1hZ2UgYW5kIHRleHQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0aWNJdGVtTGFiZWxQcm92aWRlcgotCWltcGxlbWVudHMgSXRlbUxhYmVsUHJvdmlkZXIKLXsKLQlwcm90ZWN0ZWQgZmluYWwgSW1hZ2UgaW1hZ2U7Ci0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyB0ZXh0OwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZW0gbGFiZWwgcHJvdmlkZXIgdGhhdCByZXR1cm5zIHRoZSBzcGVjaWZpZWQgdGV4dCBidXQKLQkgKiBubyBpbWFnZS4KLQkgKi8KLQlwdWJsaWMgU3RhdGljSXRlbUxhYmVsUHJvdmlkZXIoU3RyaW5nIHRleHQpIHsKLQkJdGhpcyhudWxsLCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlbSBsYWJlbCBwcm92aWRlciB0aGF0IHJldHVybnMgdGhlIHNwZWNpZmllZCBpbWFnZQotCSAqIGFuZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBTdGF0aWNJdGVtTGFiZWxQcm92aWRlcihJbWFnZSBpbWFnZSwgU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pbWFnZSA9IGltYWdlOwotCQl0aGlzLnRleHQgPSB0ZXh0OwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIHRoaXMuaW1hZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGhpcy50ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIE5PUAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMudGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9TdGF0aWNJdGVtVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9TdGF0aWNJdGVtVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWRkY2UxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvU3RhdGljSXRlbVRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEl0ZW0gdHJlZSBjb250ZW50IHByb3ZpZGVyIHRoYXQgY29udGFpbnMgdW5jaGFuZ2luZyBwYXJlbnQgYW5kIGNoaWxkcmVuLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbVRyZWVDb250ZW50UHJvdmlkZXIuTnVsbAotICovCi1wdWJsaWMgY2xhc3MgU3RhdGljSXRlbVRyZWVDb250ZW50UHJvdmlkZXIKLQlpbXBsZW1lbnRzIEl0ZW1UcmVlQ29udGVudFByb3ZpZGVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBwYXJlbnQ7Ci0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdFtdIGNoaWxkcmVuOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZW0gdHJlZSBjb250ZW50IHByb3ZpZGVyIGZvciBhbiBpdGVtIHdpdGggbmVpdGhlcgotCSAqIGEgcGFyZW50IG5vciBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgU3RhdGljSXRlbVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZW0gdHJlZSBjb250ZW50IHByb3ZpZGVyIGZvciBhbiBpdGVtIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIHBhcmVudCBidXQgbm8gY2hpbGRyZW4uCi0JICovCi0JcHVibGljIFN0YXRpY0l0ZW1UcmVlQ29udGVudFByb3ZpZGVyKE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcyhwYXJlbnQsIEVNUFRZX0FSUkFZKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlbSB0cmVlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIGFuIGl0ZW0gd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogcGFyZW50IGFuZCBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgU3RhdGljSXRlbVRyZWVDb250ZW50UHJvdmlkZXIoT2JqZWN0IHBhcmVudCwgT2JqZWN0W10gY2hpbGRyZW4pIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKCkgewotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50OwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gTk9QCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9TdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL1N0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkxYzE1My4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL1N0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyfS4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLQlleHRlbmRzIENvbnRlbnRQcm92aWRlcgotCWltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBOVUxMX1BST1ZJREVSID0gbmV3IFN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKTsKLQotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgbnVsbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gTlVMTF9QUk9WSURFUjsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gRU1QVFlfQVJSQVk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL1N0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL1N0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhOTUzMDEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9TdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RMaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgY2FuIGJlIHVzZWQgdG8ga2VlcCBhbiBBYnN0cmFjdExpc3RWaWV3ZXIKLSAqIChlLmcuIGEgTGlzdFZpZXdlciBvciBDb21ib1ZpZXdlcikgaW4gc3luY2ggd2l0aCBhIExpc3RWYWx1ZU1vZGVsCi0gKiAob3IgYSBDb2xsZWN0aW9uVmFsdWVNb2RlbCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyQWRhcHRlcgotCWltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLXsKLQkvKiogVGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWwgbGlzdEhvbGRlcjsKLQotCS8qKiBUaGUgbGlzdCB2aWV3ZXIgd2Uga2VlcCBpbiBzeW5jaCB3aXRoIHRoZSBtb2RlbCBsaXN0LiAqLwotCXByb3RlY3RlZCBmaW5hbCBBYnN0cmFjdExpc3RWaWV3ZXIgbGlzdFZpZXdlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIGZvcndhcmQgY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbGlzdCB2aWV3ZXIgdG8gdGhlIHNwZWNpZmllZCBsaXN0IGhvbGRlciBzbyB0aGV5Ci0JICogc3RheSBpbiBzeW5jaC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyIGFkYXB0KEFic3RyYWN0TGlzdFZpZXdlciBsaXN0Vmlld2VyLCBMaXN0VmFsdWVNb2RlbCBsaXN0SG9sZGVyKSB7Ci0JCS8vIHdlIG5lZWQgb25seSBjb25zdHJ1Y3QgdGhlIGFkYXB0ZXIgYW5kIGl0IHdpbGwgaG9vayB1cCB0byB0aGUgbGlzdCB2aWV3ZXIgZXRjLgotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyKGxpc3RWaWV3ZXIsIGxpc3RIb2xkZXIpOwotCX0KLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbGlzdCB2aWV3ZXIgdG8gdGhlIHNwZWNpZmllZCBsaXN0IGhvbGRlciBzbyB0aGV5Ci0JICogc3RheSBpbiBzeW5jaC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyIGFkYXB0KEFic3RyYWN0TGlzdFZpZXdlciBsaXN0Vmlld2VyLCBDb2xsZWN0aW9uVmFsdWVNb2RlbCBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCS8vIHdlIG5lZWQgb25seSBjb25zdHJ1Y3QgdGhlIGFkYXB0ZXIgYW5kIGl0IHdpbGwgaG9vayB1cCB0byB0aGUgbGlzdCB2aWV3ZXIgZXRjLgotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyKGxpc3RWaWV3ZXIsIGNvbGxlY3Rpb25Ib2xkZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyKEFic3RyYWN0TGlzdFZpZXdlciBsaXN0Vmlld2VyLCBMaXN0VmFsdWVNb2RlbCBsaXN0SG9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmxpc3RWaWV3ZXIgPSBsaXN0Vmlld2VyOwotCQl0aGlzLmxpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHRoaXMpOwotCQkvLyB0aGUgbGlzdCB2aWV3ZXIgd2lsbCBjYWxsIGJhY2sgdG8gI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotCQl0aGlzLmxpc3RWaWV3ZXIuc2V0SW5wdXQobGlzdEhvbGRlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyKEFic3RyYWN0TGlzdFZpZXdlciBsaXN0Vmlld2VyLCBDb2xsZWN0aW9uVmFsdWVNb2RlbCBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXRoaXMobGlzdFZpZXdlciwgbmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIoY29sbGVjdGlvbkhvbGRlcikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJCVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLnRoaXMuaXRlbXNBZGRlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJCVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLnRoaXMuaXRlbXNSZW1vdmVkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCQlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyQWRhcHRlci50aGlzLml0ZW1zUmVwbGFjZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLnRoaXMuaXRlbXNNb3ZlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCQlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyQWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlpZiAoaW5wdXRFbGVtZW50ICE9IHRoaXMubGlzdEhvbGRlcikgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBpbnB1dCBlbGVtZW50OiAiICsgaW5wdXRFbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgbGlzdCB2aWV3ZXIsIHNvIGRvbid0IHVwZGF0ZSB0aGUgbGlzdCB2aWV3ZXIgaGVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKHZpZXdlciAhPSB0aGlzLmxpc3RWaWV3ZXIpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgdmlld2VyOiAiICsgdmlld2VyKTsKLQkJfQotCQlpZiAob2xkSW5wdXQgIT0gdGhpcy5saXN0SG9sZGVyKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIG9sZCBpbnB1dDogIiArIG9sZElucHV0KTsKLQkJfQotCQl0aGlzLm1vZGVsQ2hhbmdlZCgoTGlzdFZhbHVlTW9kZWwpIG9sZElucHV0LCAoTGlzdFZhbHVlTW9kZWwpIG5ld0lucHV0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nIC0gbGlzdGVuZXJzIHNob3VsZCd2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBpbiAjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgbW9kZWxDaGFuZ2VkKExpc3RWYWx1ZU1vZGVsIG9sZE1vZGVsLCBMaXN0VmFsdWVNb2RlbCBuZXdNb2RlbCkgewotCQlpZiAob2xkTW9kZWwgIT0gbnVsbCkgewotCQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JCXRoaXMubGlzdEhvbGRlciA9IG5ld01vZGVsOwotCQlpZiAobmV3TW9kZWwgIT0gbnVsbCkgewotCQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB1bmRlcmx5aW5nIGxpc3QgbW9kZWwuCi0JICovCi0JcHVibGljIExpc3RWYWx1ZU1vZGVsIG1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdW5kZXJseWluZyBsaXN0IG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsKExpc3RWYWx1ZU1vZGVsIGxpc3RIb2xkZXIpIHsKLQkJLy8gdGhlIGxpc3Qgdmlld2VyIHdpbGwgY2FsbCBiYWNrIHRvICNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQkJdGhpcy5saXN0Vmlld2VyLnNldElucHV0KGxpc3RIb2xkZXIpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdW5kZXJseWluZyBjb2xsZWN0aW9uIG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsIGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJdGhpcy5zZXRNb2RlbChuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcihjb2xsZWN0aW9uSG9sZGVyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBhZGRlZCB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCWludCBpID0gZS5nZXRJbmRleCgpOwotCQlmb3IgKE9iamVjdCBpdGVtIDogZS5nZXRJdGVtcygpKSB7Ci0JCQl0aGlzLmxpc3RWaWV3ZXIuaW5zZXJ0KGl0ZW0sIGkrKyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJdGhpcy5saXN0Vmlld2VyLnJlbW92ZShBcnJheVRvb2xzLmFycmF5KGUuZ2V0SXRlbXMoKSwgZS5nZXRJdGVtc1NpemUoKSkpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVwbGFjZWQgaW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4KLQkgKiBTeW5jaHJvbml6ZSB0aGUgbGlzdCB2aWV3ZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJdGhpcy5saXN0Vmlld2VyLnJlbW92ZShBcnJheVRvb2xzLmFycmF5KGUuZ2V0T2xkSXRlbXMoKSwgZS5nZXRJdGVtc1NpemUoKSkpOwotCQlpbnQgaSA9IGUuZ2V0SW5kZXgoKTsKLQkJZm9yIChPYmplY3QgaXRlbSA6IGUuZ2V0TmV3SXRlbXMoKSkgewotCQkJdGhpcy5saXN0Vmlld2VyLmluc2VydChpdGVtLCBpKyspOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBtb3ZlZCBpbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQlpbnQgbGVuID0gZS5nZXRMZW5ndGgoKTsKLQkJT2JqZWN0W10gaXRlbXMgPSBuZXcgT2JqZWN0W2xlbl07Ci0JCWludCBvZmZzZXQgPSBlLmdldFNvdXJjZUluZGV4KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWl0ZW1zW2ldID0gdGhpcy5saXN0SG9sZGVyLmdldChvZmZzZXQgKyBpKTsKLQkJfQotCQl0aGlzLmxpc3RWaWV3ZXIucmVtb3ZlKGl0ZW1zKTsKLQotCQlvZmZzZXQgPSBlLmdldFRhcmdldEluZGV4KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXRoaXMubGlzdFZpZXdlci5pbnNlcnQoaXRlbXNbaV0sIG9mZnNldCArIGkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdCB3YXMgY2xlYXJlZC4KLQkgKiBTeW5jaHJvbml6ZSB0aGUgbGlzdCB2aWV3ZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoKSB7Ci0JCXRoaXMubGlzdFZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdCBoYXMgY2hhbmdlZCAiZHJhbWF0aWNhbGx5Ii4KLQkgKiBTeW5jaHJvbml6ZSB0aGUgbGlzdCB2aWV3ZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoKSB7Ci0JCXRoaXMubGlzdFZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9UcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZmNiY2QuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9UcmVlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJVHJlZUNvbnRlbnRQcm92aWRlcn0uCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlQ29udGVudFByb3ZpZGVyCi0JZXh0ZW5kcyBTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0JaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIElUcmVlQ29udGVudFByb3ZpZGVyIE5VTExfUFJPVklERVIgPSBuZXcgVHJlZUNvbnRlbnRQcm92aWRlcigpOwotCi0JcHVibGljIHN0YXRpYyBJVHJlZUNvbnRlbnRQcm92aWRlciBudWxsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBOVUxMX1BST1ZJREVSOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpIHsKLQkJLy8gdHlwaWNhbCB0cmVlIGltcGxlbWVudGF0aW9uCi0JCXJldHVybiB0aGlzLmdldENoaWxkcmVuKGlucHV0KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBFTVBUWV9BUlJBWTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjOTQyMzguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUnVubmFibGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIFNXVAotICogVUkgdGhyZWFkLCBhc3luY2hyb25vdXNseSBpZiBuZWNlc3NhcnkuCi0gKiAKLSAqIEBzZWUgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLSAqLwotcHVibGljIGNsYXNzIFNXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHVibGljIFNXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlKG5ldyBJdGVtc0FkZGVkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQkvKiBDVSBwcml2YXRlICovIGNsYXNzIEl0ZW1zQWRkZWRSdW5uYWJsZQotCQlleHRlbmRzIFJ1bm5hYmxlQWRhcHRlcgotCXsKLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQ7Ci0JCUl0ZW1zQWRkZWRSdW5uYWJsZShDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmV2ZW50ID0gZXZlbnQ7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVNXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc0FkZGVkXyh0aGlzLmV2ZW50KTsKLQkJfQotCX0KLQotCXZvaWQgaXRlbXNBZGRlZF8oQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGUobmV3IEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyBjbGFzcyBJdGVtc1JlbW92ZWRSdW5uYWJsZQotCQlleHRlbmRzIFJ1bm5hYmxlQWRhcHRlcgotCXsKLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQ7Ci0JCUl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZXZlbnQgPSBldmVudDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zUmVtb3ZlZF8odGhpcy5ldmVudCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGl0ZW1zUmVtb3ZlZF8oQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGUobmV3IENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQkvKiBDVSBwcml2YXRlICovIGNsYXNzIENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUKLQkJZXh0ZW5kcyBSdW5uYWJsZUFkYXB0ZXIKLQl7Ci0JCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQ7Ci0JCUNvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmV2ZW50ID0gZXZlbnQ7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVNXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZF8odGhpcy5ldmVudCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGNvbGxlY3Rpb25DbGVhcmVkXyhDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlKG5ldyBDb2xsZWN0aW9uQ2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyBjbGFzcyBDb2xsZWN0aW9uQ2hhbmdlZFJ1bm5hYmxlCi0JCWV4dGVuZHMgUnVubmFibGVBZGFwdGVyCi0JewotCQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudDsKLQkJQ29sbGVjdGlvbkNoYW5nZWRSdW5uYWJsZShDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmV2ZW50ID0gZXZlbnQ7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVNXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZF8odGhpcy5ldmVudCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkXyhDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICoge0BsaW5rIFNXVFV0aWwjZXhlY3V0ZShSdW5uYWJsZSl9IHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nIHtAbGluayBTV1RVdGlsI3N5bmNFeGVjKFJ1bm5hYmxlKX0gY2FuIHNvbXRpbWVzIG1ha2UgdGhpbmdzCi0JICogbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlKFJ1bm5hYmxlIHIpIHsKLQkJU1dUVXRpbC5leGVjdXRlKHIpOwotLy8JCVNXVFV0aWwuc3luY0V4ZWMocik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTV1QoIiArIHRoaXMubGlzdGVuZXIgKyAnKSc7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMzdiNjAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUnVubmFibGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBsaXN0IGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIFNXVAotICogVUkgdGhyZWFkLCBhc3luY2hyb25vdXNseSBpZiBuZWNlc3NhcnkuCi0gKiAKLSAqIEBzZWUgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLSAqLwotcHVibGljIGNsYXNzIFNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIExpc3RDaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHVibGljIFNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlKG5ldyBJdGVtc0FkZGVkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQkvKiBDVSBwcml2YXRlICovIGNsYXNzIEl0ZW1zQWRkZWRSdW5uYWJsZQotCQlleHRlbmRzIFJ1bm5hYmxlQWRhcHRlcgotCXsKLQkJcHJpdmF0ZSBmaW5hbCBMaXN0QWRkRXZlbnQgZXZlbnQ7Ci0JCUl0ZW1zQWRkZWRSdW5uYWJsZShMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmV2ZW50ID0gZXZlbnQ7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc0FkZGVkXyh0aGlzLmV2ZW50KTsKLQkJfQotCX0KLQotCXZvaWQgaXRlbXNBZGRlZF8oTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGUobmV3IEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyBjbGFzcyBJdGVtc1JlbW92ZWRSdW5uYWJsZQotCQlleHRlbmRzIFJ1bm5hYmxlQWRhcHRlcgotCXsKLQkJcHJpdmF0ZSBmaW5hbCBMaXN0UmVtb3ZlRXZlbnQgZXZlbnQ7Ci0JCUl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZXZlbnQgPSBldmVudDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zUmVtb3ZlZF8odGhpcy5ldmVudCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGl0ZW1zUmVtb3ZlZF8oTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlKG5ldyBJdGVtc01vdmVkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQkvKiBDVSBwcml2YXRlICovIGNsYXNzIEl0ZW1zTW92ZWRSdW5uYWJsZQotCQlleHRlbmRzIFJ1bm5hYmxlQWRhcHRlcgotCXsKLQkJcHJpdmF0ZSBmaW5hbCBMaXN0TW92ZUV2ZW50IGV2ZW50OwotCQlJdGVtc01vdmVkUnVubmFibGUoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZXZlbnQgPSBldmVudDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zTW92ZWRfKHRoaXMuZXZlbnQpOwotCQl9Ci0JfQotCi0Jdm9pZCBpdGVtc01vdmVkXyhMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNNb3ZlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZShuZXcgSXRlbXNSZXBsYWNlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyBjbGFzcyBJdGVtc1JlcGxhY2VkUnVubmFibGUKLQkJZXh0ZW5kcyBSdW5uYWJsZUFkYXB0ZXIKLQl7Ci0JCXByaXZhdGUgZmluYWwgTGlzdFJlcGxhY2VFdmVudCBldmVudDsKLQkJSXRlbXNSZXBsYWNlZFJ1bm5hYmxlKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmV2ZW50ID0gZXZlbnQ7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlcGxhY2VkXyh0aGlzLmV2ZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXhlY3V0ZShuZXcgTGlzdENsZWFyZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCXZvaWQgaXRlbXNSZXBsYWNlZF8oTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gY2xhc3MgTGlzdENsZWFyZWRSdW5uYWJsZQotCQlleHRlbmRzIFJ1bm5hYmxlQWRhcHRlcgotCXsKLQkJcHJpdmF0ZSBmaW5hbCBMaXN0Q2xlYXJFdmVudCBldmVudDsKLQkJTGlzdENsZWFyZWRSdW5uYWJsZShMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZXZlbnQgPSBldmVudDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLmxpc3RDbGVhcmVkXyh0aGlzLmV2ZW50KTsKLQkJfQotCX0KLQotCXZvaWQgbGlzdENsZWFyZWRfKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubGlzdENsZWFyZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmV4ZWN1dGUobmV3IExpc3RDaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQl9Ci0KLQkvKiBDVSBwcml2YXRlICovIGNsYXNzIExpc3RDaGFuZ2VkUnVubmFibGUKLQkJZXh0ZW5kcyBSdW5uYWJsZUFkYXB0ZXIKLQl7Ci0JCXByaXZhdGUgZmluYWwgTGlzdENoYW5nZUV2ZW50IGV2ZW50OwotCQlMaXN0Q2hhbmdlZFJ1bm5hYmxlKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZXZlbnQgPSBldmVudDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLmxpc3RDaGFuZ2VkXyh0aGlzLmV2ZW50KTsKLQkJfQotCX0KLQotCXZvaWQgbGlzdENoYW5nZWRfKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiB7QGxpbmsgU1dUVXRpbCNleGVjdXRlKFJ1bm5hYmxlKX0gc2VlbXMgdG8gd29yayBPSzsKLQkgKiBidXQgdXNpbmcge0BsaW5rIFNXVFV0aWwjc3luY0V4ZWMoUnVubmFibGUpfSBjYW4gc29tdGltZXMgbWFrZSB0aGluZ3MKLQkgKiBtb3JlIHByZWRpY3RhYmxlIHdoZW4gZGVidWdnaW5nLCBhdCB0aGUgcmlzayBvZiBkZWFkbG9ja3MuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGUoUnVubmFibGUgcikgewotCQlTV1RVdGlsLmV4ZWN1dGUocik7Ci0vLwkJU1dUVXRpbC5zeW5jRXhlYyhyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlNXVCgiICsgdGhpcy5saXN0ZW5lciArICcpJzsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTJlMjE1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJ1bm5hYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGFuZCBmb3J3YXJkIGV2ZW50cyB0byBpdCBvbiB0aGUgU1dUCi0gKiBVSSB0aHJlYWQsIGFzeW5jaHJvbm91c2x5IGlmIG5lY2Vzc2FyeS4gSWYgdGhlIGV2ZW50IGFycml2ZWQgb24gdGhlIFVJCi0gKiB0aHJlYWQgdGhhdCBpcyBwcm9iYWJseSBiZWNhdXNlIGl0IHdhcyBpbml0aWF0ZWQgYnkgYSBVSSB3aWRnZXQ7IGFzIGEKLSAqIHJlc3VsdCwgd2Ugd2FudCB0byBsb29wIGJhY2sgc3luY2hyb25vdXNseSBzbyB0aGUgZXZlbnRzIGNhbiBiZQotICogc2hvcnQtY2lyY3VpdGVkLiAoVHlwaWNhbGx5LCB0aGUgYWRhcHRlcihzKSBiZXR3ZWVuIGEgPGVtPnByb3BlcnR5PC9lbT4gYW5kCi0gKiBpdHMgY29ycmVzcG9uZGluZyBVSSB3aWRnZXQgYXJlIHJlYWQtd3JpdGU7IGFzIG9wcG9zZWQgdG8gdGhlIGFkYXB0ZXIocykKLSAqIGJldHdlZW4gYSA8ZW0+Y29sbGVjdGlvbjwvZW0+IChvciA8ZW0+bGlzdDwvZW0+KSBhbmQgaXRzIFVJIHdpZGdldCwgd2hpY2gKLSAqIGlzIHJlYWQtb25seS4pCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXB1YmxpYyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlKG5ldyBQcm9wZXJ0eUNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gY2xhc3MgUHJvcGVydHlDaGFuZ2VkUnVubmFibGUKLQkJZXh0ZW5kcyBSdW5uYWJsZUFkYXB0ZXIKLQl7Ci0JCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQkJUHJvcGVydHlDaGFuZ2VkUnVubmFibGUoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZXZlbnQgPSBldmVudDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5wcm9wZXJ0eUNoYW5nZWRfKHRoaXMuZXZlbnQpOwotCQl9Ci0JfQotCi0Jdm9pZCBwcm9wZXJ0eUNoYW5nZWRfKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIHtAbGluayBTV1RVdGlsI2V4ZWN1dGUoUnVubmFibGUpfSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyB7QGxpbmsgU1dUVXRpbCNzeW5jRXhlYyhSdW5uYWJsZSl9IGNhbiBzb210aW1lcyBtYWtlIHRoaW5ncwotCSAqIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZShSdW5uYWJsZSByKSB7Ci0JCVNXVFV0aWwuZXhlY3V0ZShyKTsKLS8vCQlTV1RVdGlsLnN5bmNFeGVjKHIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiU1dUKCIgKyB0aGlzLmxpc3RlbmVyICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MzdiZjQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUnVubmFibGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBTV1QKLSAqIFVJIHRocmVhZCwgYXN5bmNocm9ub3VzbHkgaWYgbmVjZXNzYXJ5LgotICogCi0gKiBAc2VlIFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgU3RhdGVDaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgZmluYWwgU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXB1YmxpYyBTV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5leGVjdXRlKG5ldyBTdGF0ZUNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gY2xhc3MgU3RhdGVDaGFuZ2VkUnVubmFibGUKLQkJZXh0ZW5kcyBSdW5uYWJsZUFkYXB0ZXIKLQl7Ci0JCXByaXZhdGUgZmluYWwgU3RhdGVDaGFuZ2VFdmVudCBldmVudDsKLQkJU3RhdGVDaGFuZ2VkUnVubmFibGUoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZXZlbnQgPSBldmVudDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU1dUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5zdGF0ZUNoYW5nZWRfKHRoaXMuZXZlbnQpOwotCQl9Ci0JfQotCi0Jdm9pZCBzdGF0ZUNoYW5nZWRfKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5zdGF0ZUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIHtAbGluayBTV1RVdGlsI2V4ZWN1dGUoUnVubmFibGUpfSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyB7QGxpbmsgU1dUVXRpbCNzeW5jRXhlYyhSdW5uYWJsZSl9IGNhbiBzb210aW1lcyBtYWtlIHRoaW5ncwotCSAqIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZShSdW5uYWJsZSByKSB7Ci0JCVNXVFV0aWwuZXhlY3V0ZShyKTsKLS8vCQlTV1RVdGlsLnN5bmNFeGVjKHIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiU1dUKCIgKyB0aGlzLmxpc3RlbmVyICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0pwdFByb2plY3RQcm9wZXJ0aWVzUGFnZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0pwdFByb2plY3RQcm9wZXJ0aWVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzM5YjI4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvcHJvcGVydGllcy9KcHRQcm9qZWN0UHJvcGVydGllc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5BYnN0cmFjdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LkxpYnJhcnlJbnN0YWxsRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmxpYnByb3YuTGlicmFyeUZhY2V0UHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VzLklXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC5GYWNldHNQcm9wZXJ0eVBhZ2U7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEpwdFByb2plY3RQcm9wZXJ0aWVzUGFnZQotCQlleHRlbmRzIExpYnJhcnlGYWNldFByb3BlcnR5UGFnZSB7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJUHJvamVjdD4gcHJvamVjdE1vZGVsOwotCXByb3RlY3RlZCBmaW5hbCBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLlRyaWdnZXIgdHJpZ2dlcjsKLQotCXByb3RlY3RlZCBmaW5hbCBDaGFuZ2VMaXN0ZW5lciB2YWxpZGF0aW9uTGlzdGVuZXI7Ci0KLQotCXB1YmxpYyBKcHRQcm9qZWN0UHJvcGVydGllc1BhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5wcm9qZWN0TW9kZWwgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPElQcm9qZWN0PigpOwotCQl0aGlzLnRyaWdnZXIgPSBuZXcgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5UcmlnZ2VyKCk7Ci0KLQkJdGhpcy5idWlsZE1vZGVscygpOwotCi0JCXRoaXMudmFsaWRhdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZFZhbGlkYXRpb25MaXN0ZW5lcigpOwotCX0KLQotCi0JLyoqCi0JICogQnVpbGQgYW55IGFkZGl0aW9uYWwgbW9kZWxzIG5lZWRlZCBieSB0aGlzIHBhZ2UuICBUaGUgcHJvamVjdCBtb2RlbCBoYXMgYmVlbiBjcmVhdGVkIGF0IHRoaXMKLQkgKiBwb2ludC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBidWlsZE1vZGVscygpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZsYWdJc1NldChQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZmxhZ01vZGVsKSB7Ci0JCUJvb2xlYW4gZmxhZyA9IGZsYWdNb2RlbC5nZXRWYWx1ZSgpOwotCQlyZXR1cm4gKGZsYWcgIT0gbnVsbCkgJiYgZmxhZy5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlicmFyeUZhY2V0UHJvcGVydHlQYWdlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZExpYnJhcnlQcm92aWRlckxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpYnJhcnlQcm92aWRlckxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIExpYnJhcnlQcm92aWRlckxpc3RlbmVyCi0JCWltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLQl7Ci0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHksIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlICkgewotCQkJaWYgKExpYnJhcnlJbnN0YWxsRGVsZWdhdGUuUFJPUF9BVkFJTEFCTEVfUFJPVklERVJTLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCQlKcHRQcm9qZWN0UHJvcGVydGllc1BhZ2UudGhpcy5hZGp1c3RMaWJyYXJ5UHJvdmlkZXJzKCk7Ci0JCQl9Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkanVzdExpYnJhcnlQcm92aWRlcnMoKTsKLQotCi0JLy8gKioqKioqKioqKiBwYWdlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZVBhZ2VDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmICh0aGlzLnByb2plY3RNb2RlbC5nZXRWYWx1ZSgpICE9IG51bGwpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTGlzdGVuZXJzKCk7Ci0JCX0KLQotCQl0aGlzLnByb2plY3RNb2RlbC5zZXRWYWx1ZSh0aGlzLmdldFByb2plY3QoKSk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQl0aGlzLmNyZWF0ZVdpZGdldHMoY29tcG9zaXRlKTsKLQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0KLQkJdGhpcy5hZGp1c3RMaWJyYXJ5UHJvdmlkZXJzKCk7Ci0KLQkJdGhpcy5lbmdhZ2VMaXN0ZW5lcnMoKTsKLQkJdGhpcy51cGRhdGVWYWxpZGF0aW9uKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBzcGVjaWZpYyB3aWRnZXRzLiAgTGF5b3V0IGFuZCB2YWxpZGF0aW9uIHdpbGwgYmUgdGFrZW4gY2FyZSBvZi4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjcmVhdGVXaWRnZXRzKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQl0aGlzLmVuZ2FnZVZhbGlkYXRpb25MaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJdGhpcy5kaXNlbmdhZ2VWYWxpZGF0aW9uTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGluayBidWlsZEZhY2V0c1BhZ2VMaW5rKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxpbmsgZmFjZXRzUGFnZUxpbmsgPSB0aGlzLmJ1aWxkTGluayhwYXJlbnQsIHRleHQpOwotCQlmYWNldHNQYWdlTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgRmFjZXRzUGFnZUxpbmtMaXN0ZW5lcigpKTsgIC8vIHRoZSBsaW5rIHdpbGwgYmUgR0NlZAotCQlyZXR1cm4gZmFjZXRzUGFnZUxpbms7Ci0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyBjbGFzcyBGYWNldHNQYWdlTGlua0xpc3RlbmVyCi0JCWV4dGVuZHMgU2VsZWN0aW9uQWRhcHRlcgotCXsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUpwdFByb2plY3RQcm9wZXJ0aWVzUGFnZS50aGlzLm9wZW5Qcm9qZWN0RmFjZXRzUGFnZSgpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuUHJvamVjdEZhY2V0c1BhZ2UoKSB7Ci0JCSgoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpdGhpcy5nZXRDb250YWluZXIoKSkub3BlblBhZ2UoRmFjZXRzUHJvcGVydHlQYWdlLklELCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBEb24ndCBhbGxvdyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjb21wdXRlU2l6ZSgpfQotCSAqIHRvIGNhY2hlIHRoZSBwYWdlJ3Mgc2l6ZSwgc2luY2UgdGhlIHNpemUgb2YgdGhlICJMaWJyYXJ5IiBwYW5lbCBjYW4KLQkgKiBjaGFuZ2UgZGVwZW5kaW5nIG9uIHRoZSB1c2VyJ3Mgc2VsZWN0aW9uIGZyb20gdGhlIGRyb3AtZG93biBsaXN0LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZG9Db21wdXRlU2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB3aWRnZXRzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBCdXR0b24gYnVpbGRDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBpbnQgaG9yaXpvbnRhbFNwYW4sIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQnV0dG9uKHBhcmVudCwgaG9yaXpvbnRhbFNwYW4sIHRleHQsIFNXVC5DSEVDSyk7Ci0JfQotCi0JcHJvdGVjdGVkIEJ1dHRvbiBidWlsZFJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbiwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRCdXR0b24ocGFyZW50LCBob3Jpem9udGFsU3BhbiwgdGV4dCwgU1dULlJBRElPKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGJ1aWxkQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbiwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FIHwgc3R5bGUpOwotCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCXByb3RlY3RlZCBDb21ibyBidWlsZERyb3BEb3duKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGREcm9wRG93bihwYXJlbnQsIDEpOwotCX0KLQotCXByb3RlY3RlZCBDb21ibyBidWlsZERyb3BEb3duKENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbikgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQljb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCXByb3RlY3RlZCBMYWJlbCBidWlsZExhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJvdGVjdGVkIExpbmsgYnVpbGRMaW5rKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxpbmsgbGluayA9IG5ldyBMaW5rKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsaW5rLnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPSy9SZXZlcnQvQXBwbHkgYmVoYXZpb3IgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlzdXBlci5wZXJmb3JtT2soKTsKLQotCQl0cnkgewotCQkJLy8gdHJ1ZT1mb3JrOyBmYWxzZT11bmNhbmNlbGxhYmxlCi0JCQl0aGlzLmJ1aWxkT2tQcm9ncmVzc01vbml0b3JEaWFsb2coKS5ydW4odHJ1ZSwgZmFsc2UsIHRoaXMuYnVpbGRPa1J1bm5hYmxlV2l0aFByb2dyZXNzKCkpOwotCQl9Ci0JCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJLy8gc2hvdWxkICpub3QqIGhhcHBlbi4uLgotCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIElSdW5uYWJsZUNvbnRleHQgYnVpbGRPa1Byb2dyZXNzTW9uaXRvckRpYWxvZygpIHsKLQkJcmV0dXJuIG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2codGhpcy5nZXRTaGVsbCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGJ1aWxkT2tSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJcmV0dXJuIG5ldyBPa1J1bm5hYmxlV2l0aFByb2dyZXNzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIE9rUnVubmFibGVXaXRoUHJvZ3Jlc3MKLQkJaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MKLQl7Ci0JCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQlJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJdHJ5IHsKLQkJCQkvLyB0aGUgYnVpbGQgd2UgZXhlY3V0ZSBpbiAjcGVyZm9ybU9rXygpIGxvY2tzIHRoZSB3b3Jrc3BhY2Ugcm9vdCwKLQkJCQkvLyBzbyB3ZSBuZWVkIHRvIHVzZSB0aGUgd29ya3NwYWNlIHJvb3QgYXMgb3VyIHNjaGVkdWxpbmcgcnVsZSBoZXJlCi0JCQkJd3MucnVuKAotCQkJCQkJbmV3IE9rV29ya3NwYWNlUnVubmFibGUoKSwKLQkJCQkJCXdzLmdldFJvb3QoKSwKLQkJCQkJCUlXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLAotCQkJCQkJbW9uaXRvcgotCQkJCQkpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQotCQkvKiBjbGFzcyBwcml2YXRlICovIGNsYXNzIE9rV29ya3NwYWNlUnVubmFibGUKLQkJCWltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlKcHRQcm9qZWN0UHJvcGVydGllc1BhZ2UudGhpcy5wZXJmb3JtT2tfKG1vbml0b3IpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9LL1JldmVydC9BcHBseSBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKiBDVSBwcml2YXRlICovIHZvaWQgcGVyZm9ybU9rXyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuaXNCdWZmZXJpbmcoKSkgewotCQkJYm9vbGVhbiByZWJ1aWxkID0gdGhpcy5wcm9qZWN0UmVidWlsZFJlcXVpcmVkKCk7Ci0JCQl0aGlzLnRyaWdnZXIuYWNjZXB0KCk7Ci0JCQlpZiAocmVidWlsZCkgewotCQkJCXRoaXMucmVidWlsZFByb2plY3QoKTsKLQkJCX0KLQkJCXRoaXMuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgbW9uaXRvcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBwcm9qZWN0UmVidWlsZFJlcXVpcmVkKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZWJ1aWxkUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW55IG9mIHRoZSBtb2RlbHMgYXJlIGJ1ZmZlcmluZyBhIGNoYW5nZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNCdWZmZXJpbmcoKSB7Ci0JCWZvciAoQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBtb2RlbCA6IHRoaXMuYnVpbGRCdWZmZXJlZE1vZGVscygpKSB7Ci0JCQlpZiAobW9kZWwuaXNCdWZmZXJpbmcoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltdIGJ1aWxkQnVmZmVyZWRNb2RlbHMoKTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCXRoaXMudHJpZ2dlci5yZXNldCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXNwb3NlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlTGlzdGVuZXJzKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsaWRhdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFZhbGlkYXRpb25MaXN0ZW5lcigpOwotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gY2xhc3MgVmFsaWRhdGlvbkxpc3RlbmVyCi0JCWV4dGVuZHMgQWJzdHJhY3RDaGFuZ2VMaXN0ZW5lcgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIG1vZGVsQ2hhbmdlZCgpIHsKLQkJCUpwdFByb2plY3RQcm9wZXJ0aWVzUGFnZS50aGlzLnZhbGlkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJaWYgKCAhIHRoaXMuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy51cGRhdGVWYWxpZGF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5nYWdlVmFsaWRhdGlvbkxpc3RlbmVyKCkgewotCQlmb3IgKE1vZGVsIG1vZGVsIDogdGhpcy5idWlsZFZhbGlkYXRpb25Nb2RlbHMoKSkgewotCQkJbW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy52YWxpZGF0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IE1vZGVsW10gYnVpbGRWYWxpZGF0aW9uTW9kZWxzKCk7Ci0KLQlwcml2YXRlIHZvaWQgZGlzZW5nYWdlVmFsaWRhdGlvbkxpc3RlbmVyKCkgewotCQlmb3IgKE1vZGVsIG1vZGVsIDogdGhpcy5idWlsZFJldmVyc2VWYWxpZGF0aW9uTW9kZWxzKCkpIHsKLQkJCW1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMudmFsaWRhdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBNb2RlbFtdIGJ1aWxkUmV2ZXJzZVZhbGlkYXRpb25Nb2RlbHMoKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLnJldmVyc2UodGhpcy5idWlsZFZhbGlkYXRpb25Nb2RlbHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIEVSUk9SX1NUQVRVUyA9IEludGVnZXIudmFsdWVPZihJU3RhdHVzLkVSUk9SKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgV0FSTklOR19TVEFUVVMgPSBJbnRlZ2VyLnZhbHVlT2YoSVN0YXR1cy5XQVJOSU5HKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgSU5GT19TVEFUVVMgPSBJbnRlZ2VyLnZhbHVlT2YoSVN0YXR1cy5JTkZPKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgT0tfU1RBVFVTID0gSW50ZWdlci52YWx1ZU9mKElTdGF0dXMuT0spOwotCi0JcHJvdGVjdGVkIElTdGF0dXMgYnVpbGRJbmZvU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkU3RhdHVzKElTdGF0dXMuSU5GTywgbWVzc2FnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgYnVpbGRXYXJuaW5nU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkU3RhdHVzKElTdGF0dXMuV0FSTklORywgbWVzc2FnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgYnVpbGRFcnJvclN0YXR1cyhTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gdGhpcy5idWlsZFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBtZXNzYWdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBidWlsZFN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCBKcHRDb21tb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElTdGF0dXMgcGVyZm9ybVZhbGlkYXRpb24oKSB7Ci0JCUhhc2hNYXA8SW50ZWdlciwgQXJyYXlMaXN0PElTdGF0dXM+PiBzdGF0dXNlcyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEFycmF5TGlzdDxJU3RhdHVzPj4oKTsKLQkJc3RhdHVzZXMucHV0KEVSUk9SX1NUQVRVUywgbmV3IEFycmF5TGlzdDxJU3RhdHVzPigpKTsKLQkJc3RhdHVzZXMucHV0KFdBUk5JTkdfU1RBVFVTLCBuZXcgQXJyYXlMaXN0PElTdGF0dXM+KCkpOwotCQlzdGF0dXNlcy5wdXQoSU5GT19TVEFUVVMsIG5ldyBBcnJheUxpc3Q8SVN0YXR1cz4oKSk7Ci0JCXN0YXR1c2VzLnB1dChPS19TVEFUVVMsIG5ldyBBcnJheUxpc3Q8SVN0YXR1cz4oKSk7Ci0KLQkJLyogbGlicmFyeSBwcm92aWRlciAqLwotCQl0aGlzLmFkZFN0YXR1cyhzdXBlci5wZXJmb3JtVmFsaWRhdGlvbigpLCBzdGF0dXNlcyk7Ci0JCXRoaXMucGVyZm9ybVZhbGlkYXRpb24oc3RhdHVzZXMpOwotCi0JCUFycmF5TGlzdDxJU3RhdHVzPiBsaXN0ID0gc3RhdHVzZXMuZ2V0KEVSUk9SX1NUQVRVUyk7Ci0JCWlmICggISBsaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGxpc3QuZ2V0KDApOwotCQl9Ci0JCWxpc3QgPSBzdGF0dXNlcy5nZXQoV0FSTklOR19TVEFUVVMpOwotCQlpZiAoICEgbGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBsaXN0LmdldCgwKTsKLQkJfQotCQlsaXN0ID0gc3RhdHVzZXMuZ2V0KElORk9fU1RBVFVTKTsKLQkJaWYgKCAhIGxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbGlzdC5nZXQoMCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcGVyZm9ybVZhbGlkYXRpb24oTWFwPEludGVnZXIsIEFycmF5TGlzdDxJU3RhdHVzPj4gc3RhdHVzZXMpOwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3RhdHVzKElTdGF0dXMgc3RhdHVzLCBNYXA8SW50ZWdlciwgQXJyYXlMaXN0PElTdGF0dXM+PiBzdGF0dXNlcykgewotCQlzdGF0dXNlcy5nZXQoSW50ZWdlci52YWx1ZU9mKHN0YXR1cy5nZXRTZXZlcml0eSgpKSkuYWRkKHN0YXR1cyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGNkOTg4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L0Fic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgcHJvdmlkZXMgYSBtb3JlIG9iamVjdC1vcmllbnRlZCBpbnRlcmZhY2UgdG8gdGhlIGl0ZW1zIGFuZAotICogc2VsZWN0ZWQgaXRlbSBpbiBhIGNvbWJvLgotICogPHA+Ci0gKiA8Yj5saXN0SG9sZGVyPC9iPiBjb250YWlucyB0aGUgaXRlbXMgaW4gdGhlIGNvbWJvLjxicj4KLSAqIDxiPnNlbGVjdGVkSXRlbUhvbGRlcjwvYj4gY29udGFpbnMgdGhlIGl0ZW1zIGluICdsaXN0SG9sZGVyJyB0aGF0IGFyZQotICogc2VsZWN0ZWQgaW4gdGhlIGNvbWJvLgotICoKLSAqIEBwYXJhbSA8RT4gVGhlIHR5cGUgb2YgdGhlIGl0ZW1zIGluIDxiPmxpc3RIb2xkZXI8L2I+Ci0gKiBAc2VlIENvbWJvTW9kZWxBZGFwdGVyCi0gKiBAc2VlIENDb21ib01vZGVsQWRhcHRlcgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPEU+IHsKLQotCS8vICoqKioqKioqKiogbW9kZWwgKioqKioqKioqKgotCS8qKgotCSAqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIGNvbWJvJ3MgY29udGVudHMgd2l0aAotCSAqIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtSG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgY29tYm8ncyBzZWxlY3Rpb24gd2l0aCB0aGUKLQkgKiBtb2RlbCBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIGNvbnZlcnRlciB0aGF0IGNvbnZlcnRzIGl0ZW1zIGluIHRoZSBtb2RlbCBsaXN0Ci0JICogdG8gc3RyaW5ncyB0aGF0IGNhbiBiZSBwdXQgaW4gdGhlIGNvbWJvLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyOwotCi0JLy8gKioqKioqKioqKiBVSSAqKioqKioqKioqCi0JLyoqCi0JICogVGhlIGNvbWJvIHdlIGtlZXAgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvSG9sZGVyIGNvbWJvSG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSBvdXIgc2VsZWN0aW9uIGxpc3QgaG9sZGVyCi0JICogd2l0aCB0aGUgY29tYm8ncyB0ZXh0LgotCSAqLwotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBjb21ib01vZGlmeUxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSBvdXIgc2VsZWN0aW9uIGxpc3QgaG9sZGVyCi0JICogd2l0aCB0aGUgY29tYm8ncyBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkxpc3RlbmVyIGNvbWJvU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDbGllbnRzIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gc2VsZWN0aW9uIGNoYW5nZSBldmVudHMuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RlbmVyTGlzdDxTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0OwotCi0JLyoqCi0JICogQ2xpZW50cyB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIGRvdWJsZSBjbGljayBldmVudHMuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RlbmVyTGlzdDxEb3VibGVDbGlja0xpc3RlbmVyPiBkb3VibGVDbGlja0xpc3RlbmVyTGlzdDsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgY29tYm8KLQkgKiBpcyBkaXNwb3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRGlzcG9zZUxpc3RlbmVyIGNvbWJvRGlzcG9zZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciwgc2VsZWN0aW9ucyBob2xkZXIsIGNvbWJvLCBhbmQKLQkgKiBzdHJpbmcgY29udmVydGVyIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcigKLQkJCUxpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIsCi0JCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCUNvbWJvSG9sZGVyIGNvbWJvSG9sZGVyLAotCQkJU3RyaW5nQ29udmVydGVyPEU+IHN0cmluZ0NvbnZlcnRlcikKLQl7Ci0JCXN1cGVyKCk7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChsaXN0SG9sZGVyLCAgICAgICAgICJUaGUgaG9sZGVyIG9mIHRoZSBpdGVtcyIpOwotCQlBc3NlcnQuaXNOb3ROdWxsKHNlbGVjdGVkSXRlbUhvbGRlciwgIlRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0gY2Fubm90IGJlIG51bGwiKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChjb21ib0hvbGRlciwgICAgICAgICJUaGUgaG9sZGVyIG9mIHRoZSBjb21ibyB3aWRnZXQgY2Fubm90IGJlIG51bGwiKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChzdHJpbmdDb252ZXJ0ZXIsICAgICJUaGUgc3RyaW5nIGNvbnZlcnRlciBjYW5ub3QgYmUgbnVsbCIpOwotCi0JCXRoaXMubGlzdEhvbGRlciAgICAgICAgID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIgPSBzZWxlY3RlZEl0ZW1Ib2xkZXI7Ci0JCXRoaXMuY29tYm9Ib2xkZXIgICAgICAgID0gY29tYm9Ib2xkZXI7Ci0JCXRoaXMuc3RyaW5nQ29udmVydGVyICAgID0gc3RyaW5nQ29udmVydGVyOwotCi0JCXRoaXMubGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNlbGVjdGVkSXRlbUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNFZGl0YWJsZSgpKSB7Ci0JCQl0aGlzLmNvbWJvTW9kaWZ5TGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29tYm9Nb2RpZnlMaXN0ZW5lcigpOwotCQkJdGhpcy5jb21ib0hvbGRlci5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzLmNvbWJvTW9kaWZ5TGlzdGVuZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5jb21ib1NlbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZENvbWJvU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5jb21ib1NlbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCi0JCXRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0ID0gdGhpcy5idWlsZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdCgpOwotCQl0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJMaXN0ID0gdGhpcy5idWlsZERvdWJsZUNsaWNrTGlzdGVuZXJMaXN0KCk7Ci0KLQkJdGhpcy5jb21ib0Rpc3Bvc2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRDb21ib0Rpc3Bvc2VMaXN0ZW5lcigpOwotCQl0aGlzLmNvbWJvSG9sZGVyLmFkZERpc3Bvc2VMaXN0ZW5lcih0aGlzLmNvbWJvRGlzcG9zZUxpc3RlbmVyKTsKLQotCQl0aGlzLnN5bmNocm9uaXplQ29tYm8oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci50aGlzLmxpc3RJdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLnRoaXMubGlzdEl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLnRoaXMubGlzdEl0ZW1zTW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci50aGlzLmxpc3RJdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLnRoaXMuc2VsZWN0ZWRJdGVtQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgYnVpbGRDb21ib01vZGlmeUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotCQkJCUFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIudGhpcy5jb21ib1NlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb21ibyBtb2RpZnkgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZENvbWJvU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLnRoaXMuY29tYm9TZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29tYm8gbW9kaWZ5IGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdGVuZXJMaXN0PERvdWJsZUNsaWNrTGlzdGVuZXI+IGJ1aWxkRG91YmxlQ2xpY2tMaXN0ZW5lckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgTGlzdGVuZXJMaXN0PERvdWJsZUNsaWNrTGlzdGVuZXI+KERvdWJsZUNsaWNrTGlzdGVuZXIuY2xhc3MpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0ZW5lckxpc3Q8U2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGJ1aWxkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IExpc3RlbmVyTGlzdDxTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4oU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuY2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBEaXNwb3NlTGlzdGVuZXIgYnVpbGRDb21ib0Rpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLnRoaXMuY29tYm9EaXNwb3NlZChldmVudCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbWJvIGRpc3Bvc2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplQ29tYm8oKSB7Ci0JCXRoaXMuc3luY2hyb25pemVDb21ib0l0ZW1zKCk7Ci0JCXRoaXMuc3luY2hyb25pemVDb21ib1NlbGVjdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdHJpbmcgY29udmVydGVyICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHNldFN0cmluZ0NvbnZlcnRlcihTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoc3RyaW5nQ29udmVydGVyLCAiVGhlIFN0cmluZ0NvbnZlcnRlciBjYW5ub3QgYmUgbnVsbCIpOwotCQl0aGlzLnN0cmluZ0NvbnZlcnRlciA9IHN0cmluZ0NvbnZlcnRlcjsKLQkJdGhpcy5zeW5jaHJvbml6ZUNvbWJvKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlIHRoZSBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIHNwZWNpZmllZCBpdGVtIHRvIGEKLQkgKiBzdHJpbmcgdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIGNvbWJvLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydChFIGl0ZW0pIHsKLQkJcmV0dXJuIHRoaXMuc3RyaW5nQ29udmVydGVyLmNvbnZlcnRUb1N0cmluZyhpdGVtKTsKLQl9Ci0KLQkvKioKLQkgKiBCcnV0ZSBmb3JjZSBzeW5jaHJvbml6YXRpb24gb2YgY29tYm8gd2l0aCB0aGUgbW9kZWwgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZUNvbWJvSXRlbXMoKSB7Ci0JCWlmICh0aGlzLmNvbWJvSG9sZGVyLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBsZW4gPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbbGVuXTsKLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxlbjsgaW5kZXgrKykgewotCQkJaXRlbXNbaW5kZXhdID0gdGhpcy5jb252ZXJ0KHRoaXMubGlzdEhvbGRlci5nZXQoaW5kZXgpKTsKLQkJfQotCQl0cnkgewotCQkJdGhpcy5jb21ib0hvbGRlci5zZXRQb3B1bGF0aW5nKHRydWUpOwotCQkJdGhpcy5jb21ib0hvbGRlci5zZXRJdGVtcyhpdGVtcyk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLnNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGNvbWJvLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RJdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBjb3VudCA9IHRoaXMuY29tYm9Ib2xkZXIuZ2V0SXRlbUNvdW50KCk7Ci0JCWludCBpbmRleCA9IGV2ZW50LmdldEluZGV4KCk7Ci0KLQkJZm9yIChFIGl0ZW0gOiB0aGlzLmdldEl0ZW1zKGV2ZW50KSkgewotCQkJdGhpcy5jb21ib0hvbGRlci5hZGQodGhpcy5jb252ZXJ0KGl0ZW0pLCBpbmRleCsrKTsKLQkJfQotCi0JCS8vIFdoZW4gdGhlIGNvbWJvIGlzIHBvcHVsYXRlZCwgaXQncyBwb3NzaWJsZSB0aGUgc2VsZWN0aW9uIHdhcyBhbHJlYWR5Ci0JCS8vIHNldCBidXQgbm8gaXRlbXMgd2FzIGZvdW5kLCByZXN5bmMgdGhlIHNlbGVjdGVkIGl0ZW0KLQkJc3luY2hyb25pemVDb21ib1NlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBjb21iby4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmNvbWJvSG9sZGVyLnNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0JCXRyeSB7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLnJlbW92ZShldmVudC5nZXRJbmRleCgpLCBldmVudC5nZXRJbmRleCgpICsgZXZlbnQuZ2V0SXRlbXNTaXplKCkgLSAxKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0UG9wdWxhdGluZyhmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgY29tYm8uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgdGFyZ2V0ID0gZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKTsKLQkJaW50IHNvdXJjZSA9IGV2ZW50LmdldFNvdXJjZUluZGV4KCk7Ci0JCWludCBsZW4gPSBldmVudC5nZXRMZW5ndGgoKTsKLQkJaW50IGxvU3RhcnQgPSBNYXRoLm1pbih0YXJnZXQsIHNvdXJjZSk7Ci0JCWludCBoaVN0YXJ0ID0gTWF0aC5tYXgodGFyZ2V0LCBzb3VyY2UpOwotCQkvLyBtYWtlIGEgY29weSBvZiB0aGUgYWZmZWN0ZWQgaXRlbXMuLi4KLQkJU3RyaW5nW10gc3ViQXJyYXkgPSBBcnJheVRvb2xzLnN1YkFycmF5KHRoaXMuY29tYm9Ib2xkZXIuZ2V0SXRlbXMoKSwgbG9TdGFydCwgaGlTdGFydCArIGxlbiAtIGxvU3RhcnQpOwotCQkvLyAuLi5tb3ZlIHRoZW0gYXJvdW5kLi4uCi0JCXN1YkFycmF5ID0gQXJyYXlUb29scy5tb3ZlKHN1YkFycmF5LCB0YXJnZXQgLSBsb1N0YXJ0LCBzb3VyY2UgLSBsb1N0YXJ0LCBsZW4pOwotCQkvLyAuLi5hbmQgdGhlbiBwdXQgdGhlbSBiYWNrCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzdWJBcnJheS5sZW5ndGg7IGluZGV4KyspIHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0SXRlbShsb1N0YXJ0ICsgaW5kZXgsIHN1YkFycmF5W2luZGV4XSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgY29tYm8uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgaW5kZXggPSBldmVudC5nZXRJbmRleCgpOwotCQlpbnQgc2VsZWN0aW9uSW5kZXggPSB0aGlzLmNvbWJvSG9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCS8vZml4aW5nIGJ1ZyAyNjkxMDAgYnkgc2V0dGluZyB0aGUgcG9wdWxhdGluZyBmbGFnIHRvIHRydWUKLQkJdGhpcy5jb21ib0hvbGRlci5zZXRQb3B1bGF0aW5nKHRydWUpOwotCQl0cnkgewotCQkJZm9yIChFIGl0ZW0gOiB0aGlzLmdldE5ld0l0ZW1zKGV2ZW50KSkgewotCQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0SXRlbShpbmRleCsrLCB0aGlzLmNvbnZlcnQoaXRlbSkpOwotCQkJfQotCQkJaWYgKHNlbGVjdGlvbkluZGV4ID09IDApIHsKLQkJCQl0aGlzLmNvbWJvSG9sZGVyLnNldFRleHQodGhpcy5jb21ib0hvbGRlci5nZXRJdGVtcygpWzBdKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0UG9wdWxhdGluZyhmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgY29tYm8uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5jb21ib0hvbGRlci5zZXRQb3B1bGF0aW5nKHRydWUpOwotCQl0cnkgewotCQkJdGhpcy5jb21ib0hvbGRlci5yZW1vdmVBbGwoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0UG9wdWxhdGluZyhmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgY29tYm8uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc3luY2hyb25pemVDb21ibygpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKExpc3RBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldE5ld0l0ZW1zKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0TmV3SXRlbXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2VsZWN0ZWQgaXRlbXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGludCBpbmRleE9mKEUgaXRlbSkgewotCQlpbnQgbGVuZ3RoID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgewotCQkJaWYgKHZhbHVlc0FyZUVxdWFsKHRoaXMubGlzdEhvbGRlci5nZXQoaW5kZXgpLCBpdGVtKSkgewotCQkJCXJldHVybiBpbmRleDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVDb21ib1NlbGVjdGlvbigpIHsKLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNEaXNwb3NlZCgpIHx8IHRoaXMuY29tYm9Ib2xkZXIuaXNQb3B1bGF0aW5nKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUUgc2VsZWN0ZWRWYWx1ZSA9IHRoaXMuc2VsZWN0ZWRJdGVtSG9sZGVyLmdldFZhbHVlKCk7Ci0JCWlmICh0aGlzLmNvbWJvSG9sZGVyLmdldFRleHQoKS5lcXVhbHMoc2VsZWN0ZWRWYWx1ZSkpIHsKLQkJCS8vaWYgdGhlIHNlbGVjdGlvbiBpcyBzdGlsbCB0aGUgc2FtZSwgZG9uJ3QgcmVzZXQgaXQKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmNvbWJvSG9sZGVyLnNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0JCXRyeSB7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLmRlc2VsZWN0QWxsKCk7Ci0JCQlTdHJpbmcgc2VsZWN0ZWRJdGVtID0gdGhpcy5jb252ZXJ0KHNlbGVjdGVkVmFsdWUpOwotCQkJaWYgKHNlbGVjdGVkSXRlbSA9PSBudWxsKSB7Ci0JCQkJc2VsZWN0ZWRJdGVtID0gIiI7Ci0JCQl9Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLnNldFRleHQoc2VsZWN0ZWRJdGVtKTsKLQkJCXRoaXMubm90aWZ5TGlzdGVuZXJzKHNlbGVjdGVkVmFsdWUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdGhpcy5jb21ib0hvbGRlci5zZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGVkSXRlbUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnN5bmNocm9uaXplQ29tYm9TZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdmFsdWVzIGFyZSBlcXVhbCwgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbnVsbCBjaGVja3MuCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGF0dHJpYnV0ZSB2YWx1ZSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiB2YWx1ZXNBcmVFcXVhbChPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0JCWlmICgodmFsdWUxID09IG51bGwpICYmICh2YWx1ZTIgPT0gbnVsbCkpIHsKLQkJCXJldHVybiB0cnVlOwkvLyBib3RoIGFyZSBudWxsCi0JCX0KLQkJaWYgKCh2YWx1ZTEgPT0gbnVsbCkgfHwgKHZhbHVlMiA9PSBudWxsKSkgewotCQkJcmV0dXJuIGZhbHNlOwkvLyBvbmUgaXMgbnVsbCBidXQgdGhlIG90aGVyIGlzIG5vdAotCQl9Ci0JCXJldHVybiB2YWx1ZTEuZXF1YWxzKHZhbHVlMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb21ibyBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgY29tYm9TZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc2VsZWN0aW9uQ2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbWJvU2VsZWN0aW9uQ2hhbmdlZChNb2RpZnlFdmVudCBldmVudCkgewotCQl0aGlzLnNlbGVjdGlvbkNoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKCkgewotCQlpZiAoIXRoaXMuY29tYm9Ib2xkZXIuaXNQb3B1bGF0aW5nKCkpIHsKLQkJCUUgc2VsZWN0ZWRJdGVtID0gdGhpcy5zZWxlY3RlZEl0ZW0oKTsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0UG9wdWxhdGluZyh0cnVlKTsKLQkJCXRyeSB7Ci0JCQkJdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUoc2VsZWN0ZWRJdGVtKTsKLQkJCQl0aGlzLm5vdGlmeUxpc3RlbmVycyhzZWxlY3RlZEl0ZW0pOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJdGhpcy5jb21ib0hvbGRlci5zZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZnlMaXN0ZW5lcnMoRSBzZWxlY3RlZEl0ZW0pIHsKLQkJaWYgKHRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0LnNpemUoKSA+IDApIHsKLQkJCVNlbGVjdGlvbkNoYW5nZUV2ZW50PEU+IHNjRXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlRXZlbnQ8RT4odGhpcywgc2VsZWN0ZWRJdGVtKTsKLQkJCWZvciAoU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgOiB0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCXNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQoc2NFdmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgRSBzZWxlY3RlZEl0ZW0oKSB7Ci0JCWlmICh0aGlzLmNvbWJvSG9sZGVyLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0VkaXRhYmxlKCkpIHsKLQkJCVN0cmluZyB0ZXh0ID0gdGhpcy5jb21ib0hvbGRlci5nZXRUZXh0KCk7Ci0KLQkJCWlmICh0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJZm9yIChpbnQgaW5kZXggPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOyAtLWluZGV4ID49IDA7ICkgewotCQkJCUUgaXRlbSA9IHRoaXMubGlzdEhvbGRlci5nZXQoaW5kZXgpOwotCQkJCVN0cmluZyB2YWx1ZSA9IHRoaXMuY29udmVydChpdGVtKTsKLQkJCQlpZiAodmFsdWVzQXJlRXF1YWwodGV4dCwgdmFsdWUpKSB7Ci0JCQkJCXJldHVybiBpdGVtOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gVE9ETzogRmluZCBhIHdheSB0byBwcmV2ZW50IHRoaXMgdHlwZSBjYXN0IChpdCdsbCB3b3JrIGlmIEUgaXMKLQkJCS8vIFN0cmluZyBidXQgaXQgd29uJ3Qgd29yayBpZiBFIGlzIHNvbWV0aGluZyBlbHNlKSwgbWF5YmUgdXNlIGEKLQkJCS8vIEJpZGlTdHJpbmdDb252ZXJ0ZXIgaW5zdGVhZCBvZiBTdHJpbmdDb252ZXJ0ZXIKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIChFKSB0ZXh0OwotCQkJfQotCQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlpbnQgaW5kZXggPSB0aGlzLmNvbWJvSG9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0KLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXIuZ2V0KGluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb21ib0RvdWJsZUNsaWNrZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lckxpc3Quc2l6ZSgpID4gMCkgewotCQkJLy8gdGhlcmUgc2hvdWxkIGJlIG9ubHkgYSBzaW5nbGUgaXRlbSBzZWxlY3RlZCBkdXJpbmcgYSBkb3VibGUtY2xpY2soPykKLQkJCUUgc2VsZWN0aW9uID0gdGhpcy5saXN0SG9sZGVyLmdldCh0aGlzLmNvbWJvSG9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJRG91YmxlQ2xpY2tFdmVudDxFPiBkY0V2ZW50ID0gbmV3IERvdWJsZUNsaWNrRXZlbnQ8RT4odGhpcywgc2VsZWN0aW9uKTsKLQkJCWZvciAoRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPiBkb3VibGVDbGlja0xpc3RlbmVyIDogdGhpcy5kb3VibGVDbGlja0xpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWRvdWJsZUNsaWNrTGlzdGVuZXIuZG91YmxlQ2xpY2soZGNFdmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGlzcG9zZSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb21ib0Rpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkvLyB0aGUgY29tYm8gaXMgbm90IHlldCAiZGlzcG9zZWQiIHdoZW4gd2UgcmVjZWl2ZSB0aGlzIGV2ZW50Ci0JCS8vIHNvIHdlIGNhbiBzdGlsbCByZW1vdmUgb3VyIGxpc3RlbmVycwotCQl0aGlzLmNvbWJvSG9sZGVyLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLmNvbWJvRGlzcG9zZUxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNFZGl0YWJsZSgpKSB7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMuY29tYm9Nb2RpZnlMaXN0ZW5lcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuY29tYm9TZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQkJdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SG9sZGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZG91YmxlIGNsaWNrIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihEb3VibGVDbGlja0xpc3RlbmVyPEU+IGxpc3RlbmVyKSB7Ci0JCXRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb3VibGVDbGlja0xpc3RlbmVyKERvdWJsZUNsaWNrTGlzdGVuZXI8RT4gbGlzdGVuZXIpIHsKLQkJdGhpcy5kb3VibGVDbGlja0xpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBpbnRlcmZhY2UgRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPiBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCQl2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQ8RT4gZXZlbnQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRG91YmxlQ2xpY2tFdmVudDxFPiBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQkJcHJpdmF0ZSBmaW5hbCBFIHNlbGVjdGlvbjsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHJvdGVjdGVkIERvdWJsZUNsaWNrRXZlbnQoQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxFPiBzb3VyY2UsIEUgc2VsZWN0aW9uKSB7Ci0JCQlzdXBlcihzb3VyY2UpOwotCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8RT4gZ2V0U291cmNlKCkgewotCQkJcmV0dXJuIChBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPEU+KSBzdXBlci5nZXRTb3VyY2UoKTsKLQkJfQotCi0JCXB1YmxpYyBFIHNlbGVjdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLnNlbGVjdGlvbjsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZWxlY3Rpb24gc3VwcG9ydCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFPiBsaXN0ZW5lcikgewotCQl0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+IGxpc3RlbmVyKSB7Ci0JCXRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFPiBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCQl2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlRXZlbnQ8RT4gZXZlbnQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2VsZWN0aW9uQ2hhbmdlRXZlbnQ8RT4gZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0JCXByaXZhdGUgZmluYWwgRSBzZWxlY3RlZEl0ZW07Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXByb3RlY3RlZCBTZWxlY3Rpb25DaGFuZ2VFdmVudChBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPEU+IHNvdXJjZSwgRSBzZWxlY3RlZEl0ZW0pIHsKLQkJCXN1cGVyKHNvdXJjZSk7Ci0JCQl0aGlzLnNlbGVjdGVkSXRlbSA9IHNlbGVjdGVkSXRlbTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8RT4gZ2V0U291cmNlKCkgewotCQkJcmV0dXJuIChBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPEU+KSBzdXBlci5nZXRTb3VyY2UoKTsKLQkJfQotCi0JCXB1YmxpYyBFIHNlbGVjdGVkSXRlbSgpIHsKLQkJCXJldHVybiB0aGlzLnNlbGVjdGVkSXRlbTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogSW50ZXJuYWwgbWVtYmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgaG9sZGVyIGlzIHJlcXVpcmVkIGZvciBzdXBwb3J0aW5nIDxjb2RlPkNvbWJvPC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5DQ29tYm88L2NvZGU+IHRyYW5zcGFyZW50bHkuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnRlcmZhY2UgQ29tYm9Ib2xkZXIgewotCQl2b2lkIGFkZChTdHJpbmcgaXRlbSwgaW50IGluZGV4KTsKLQkJdm9pZCBhZGREaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGRpc3Bvc2VMaXN0ZW5lcik7Ci0JCXZvaWQgYWRkTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIpOwotCQl2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdm9pZCBkZXNlbGVjdEFsbCgpOwotCQlpbnQgZ2V0SXRlbUNvdW50KCk7Ci0JCVN0cmluZ1tdIGdldEl0ZW1zKCk7Ci0JCWludCBnZXRTZWxlY3Rpb25JbmRleCgpOwotCQlTdHJpbmcgZ2V0VGV4dCgpOwotCQlib29sZWFuIGlzRGlzcG9zZWQoKTsKLQkJYm9vbGVhbiBpc0VkaXRhYmxlKCk7Ci0JCWJvb2xlYW4gaXNQb3B1bGF0aW5nKCk7Ci0JCXZvaWQgcmVtb3ZlRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBkaXNwb3NlTGlzdGVuZXIpOwotCQl2b2lkIHJlbW92ZU1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyKTsKLQkJdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXZvaWQgc2V0SXRlbShpbnQgaW5kZXgsIFN0cmluZyBpdGVtKTsKLQkJdm9pZCBzZXRJdGVtcyhTdHJpbmdbXSBpdGVtcyk7Ci0JCXZvaWQgc2V0UG9wdWxhdGluZyhib29sZWFuIHBvcHVsYXRpbmcpOwotCQl2b2lkIHNldFRleHQoU3RyaW5nIGl0ZW0pOwotCQl2b2lkIHJlbW92ZShpbnQgc3RhcnQsIGludCBlbmQpOwotCQl2b2lkIHJlbW92ZUFsbCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L0NvbHVtbkFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L0NvbHVtbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhmODZmOC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9Db2x1bW5BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgaXMgdXNlZCBieSB0aGUgdGFibGUgbW9kZWwgYWRhcHRlciB0byBjb252ZXJ0IGEgbW9kZWwgb2JqZWN0Ci0gKiBpbnRvIHRoZSBtb2RlbHMgdXNlZCBmb3IgZWFjaCBvZiB0aGUgY2VsbHMgZm9yIHRoZSBvYmplY3QncyBjb3JyZXNwb25kaW5nIHJvdwotICogaW4gdGhlIHRhYmxlLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbHVtbkFkYXB0ZXI8Vj4gewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsIG1vZGVscyBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogdGhhdCBjb3JyZXNwb25kcyB0byBhIHNpbmdsZSByb3cgaW4gdGhlIHRhYmxlLgotCSAqLwotCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSBjZWxsTW9kZWxzKFYgc3ViamVjdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgdGFibGUuIFR5cGljYWxseSB0aGlzIGlzIHN0YXRpYy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBjb2x1bW5zCi0JICovCi0JaW50IGNvbHVtbkNvdW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKgotCSAqIEBwYXJhbSBjb2x1bW5JbmRleCBUaGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZXRyaWV2ZSBpdHMgZGlzcGxheSB0ZXh0Ci0JICogQHJldHVybiBUaGUgZGlzcGxheSB0ZXh0IG9mIHRoZSBjb2x1bW4KLQkgKi8KLQlTdHJpbmcgY29sdW1uTmFtZShpbnQgY29sdW1uSW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sdW1uIGlzIGVkaXRhYmxlLiBUeXBpY2FsbHkgdGhpcyBpcyB0aGUKLQkgKiBzYW1lIGZvciBldmVyeSByb3cuCi0JICoKLQkgKiBAcGFyYW0gY29sdW1uSW5kZXggVGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gZm9yIHdoaWNoIHdlIGRldGVybWluZSBpZgotCSAqIHRoZSBjb250ZW50IGNhbiBiZSBtb2RpZmllZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gYWxsb3cgZWRpdGluZyBvZiB0aGUgY2VsbCBhdCB0aGUgZ2l2ZW4KLQkgKiBjb2x1bW4gaW5kZXg7IDxjb2RlPmZhbHNlPC9jb2RlPiB0byBrZWVwIGl0IG5vdCBlZGl0YWJsZQotCSAqLwotLy8JYm9vbGVhbiBjb2x1bW5Jc0VkaXRhYmxlKGludCBjb2x1bW5JbmRleCk7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9Db21ib01vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvQ29tYm9Nb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYyMDRkYy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9Db21ib01vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotCi0vKioKLSAqIFRoaXMgYWRhcHRlciBwcm92aWRlcyBhIG1vcmUgb2JqZWN0LW9yaWVudGVkIGludGVyZmFjZSB0byB0aGUgaXRlbXMgYW5kCi0gKiBzZWxlY3RlZCBpdGVtIGluIGEgPGNvZGU+Q29tYm88L2NvZGU+LgotICogPHA+Ci0gKiA8Yj5saXN0SG9sZGVyPC9iPiBjb250YWlucyB0aGUgaXRlbXMgaW4gdGhlIDxjb2RlPkNvbWJvPC9jb2RlPi48YnI+Ci0gKiA8Yj5zZWxlY3RlZEl0ZW1Ib2xkZXI8L2I+IGNvbnRhaW5zIHRoZSBpdGVtcyBpbiAnbGlzdEhvbGRlcicgdGhhdCBhcmUKLSAqIHNlbGVjdGVkIGluIHRoZSA8Y29kZT5Db21ibzwvY29kZT4uCi0gKgotICogQHBhcmFtIDxFPiBUaGUgdHlwZSBvZiB0aGUgaXRlbXMgaW4gPGI+bGlzdEhvbGRlcjwvYj4KLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb21ib01vZGVsQWRhcHRlcjxFPiBleHRlbmRzIEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8RT4gewotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGNvbWJvLgotCSAqIFVzZSB0aGUgZGVmYXVsdCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKLQkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGNvbWJvLCB3aGljaCBjYWxscyAjdG9TdHJpbmcoKSBvbiB0aGUKLQkgKiBpdGVtcyBpbiB0aGUgbW9kZWwgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb21ib01vZGVsQWRhcHRlcjxUPiBhZGFwdCgKLQkJCUxpc3RWYWx1ZU1vZGVsPFQ+IGxpc3RIb2xkZXIsCi0JCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCUNvbWJvIGNvbWJvKQotCXsKLQkJcmV0dXJuIGFkYXB0KAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCWNvbWJvLAotCQkJU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFQ+aW5zdGFuY2UoKQotCQkpOwotCX0KLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCBhbmQgc2VsZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgY29tYm8uCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBjb21iby4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb21ib01vZGVsQWRhcHRlcjxUPiBhZGFwdCgKLQkJCUxpc3RWYWx1ZU1vZGVsPFQ+IGxpc3RIb2xkZXIsCi0JCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCUNvbWJvIGNvbWJvLAotCQkJU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcikKLQl7Ci0JCXJldHVybiBuZXcgQ29tYm9Nb2RlbEFkYXB0ZXI8VD4oCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJY29tYm8sCi0JCQlzdHJpbmdDb252ZXJ0ZXIKLQkJKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGxpc3QgaG9sZGVyLCBzZWxlY3Rpb25zIGhvbGRlciwgY29tYm8sIGFuZAotCSAqIHN0cmluZyBjb252ZXJ0ZXIgYXJlIHJlcXVpcmVkLgotCSAqLwotCXByb3RlY3RlZCBDb21ib01vZGVsQWRhcHRlcigKLQkJCUxpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIsCi0JCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCUNvbWJvIGNvbWJvLAotCQkJU3RyaW5nQ29udmVydGVyPEU+IHN0cmluZ0NvbnZlcnRlcikKLQl7Ci0JCXN1cGVyKGxpc3RIb2xkZXIsCi0JCSAgICAgIHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJICAgICAgbmV3IFNXVENvbWJvSG9sZGVyKGNvbWJvKSwKLQkJICAgICAgc3RyaW5nQ29udmVydGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSW50ZXJuYWwgbWVtYmVyICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFNXVENvbWJvSG9sZGVyIGltcGxlbWVudHMgQ29tYm9Ib2xkZXIgewotCQlwcml2YXRlIGZpbmFsIENvbWJvIGNvbWJvOwotCQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gZWRpdGFibGU7Ci0JCXByaXZhdGUgU3RyaW5nIHNlbGVjdGVkSXRlbTsKLQotCQlTV1RDb21ib0hvbGRlcihDb21ibyBjb21ibykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY29tYm8gICAgPSBjb21ibzsKLQkJCXRoaXMuZWRpdGFibGUgPSAoY29tYm8uZ2V0U3R5bGUoKSAmIFNXVC5SRUFEX09OTFkpID09IDA7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIGl0ZW0sIGludCBpbmRleCkgewotCQkJdGhpcy5jb21iby5hZGQoaXRlbSwgaW5kZXgpOwotCi0JCQkvLyBJdCBpcyBwb3NzaWJsZSB0aGUgc2VsZWN0ZWQgaXRlbSB3YXMgc2V0IGJlZm9yZSB0aGUgY29tYm8gaXMgYmVpbmcKLQkJCS8vIHBvcHVsYXRlZCwgdXBkYXRlIHRoZSBzZWxlY3RlZCBpdGVtIGlmIGl0J3MgbWF0Y2hlcyB0aGUgaXRlbSBiZWluZwotCQkJLy8gYWRkZWQKLQkJCWlmICgodGhpcy5zZWxlY3RlZEl0ZW0gIT0gbnVsbCkgJiYgdGhpcy5zZWxlY3RlZEl0ZW0uZXF1YWxzKGl0ZW0pKSB7Ci0JCQkJdGhpcy5zZXRUZXh0KHRoaXMuc2VsZWN0ZWRJdGVtKTsKLQkJCQl0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGREaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGRpc3Bvc2VMaXN0ZW5lcikgewotCQkJdGhpcy5jb21iby5hZGREaXNwb3NlTGlzdGVuZXIoZGlzcG9zZUxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZE1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyKSB7Ci0JCQl0aGlzLmNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyKSB7Ci0JCQl0aGlzLmNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRlc2VsZWN0QWxsKCkgewotCQkJdGhpcy5jb21iby5kZXNlbGVjdEFsbCgpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRJdGVtQ291bnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21iby5nZXRJdGVtQ291bnQoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmdbXSBnZXRJdGVtcygpIHsKLQkJCXJldHVybiB0aGlzLmNvbWJvLmdldEl0ZW1zKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldFNlbGVjdGlvbkluZGV4KCkgewotCQkJcmV0dXJuIHRoaXMuY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJCXJldHVybiB0aGlzLmNvbWJvLmdldFRleHQoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21iby5pc0Rpc3Bvc2VkKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQkJcmV0dXJuIHRoaXMuZWRpdGFibGU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1BvcHVsYXRpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21iby5nZXREYXRhKCJwb3B1bGF0aW5nIikgPT0gQm9vbGVhbi5UUlVFOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKGludCBzdGFydCwgaW50IGVuZCkgewotCQkJdGhpcy5jb21iby5yZW1vdmUoc3RhcnQsIGVuZCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7Ci0JCQl0aGlzLmNvbWJvLnJlbW92ZUFsbCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBkaXNwb3NlTGlzdGVuZXIpIHsKLQkJCXRoaXMuY29tYm8ucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKGRpc3Bvc2VMaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lcikgewotCQkJdGhpcy5jb21iby5yZW1vdmVNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lcikgewotCQkJdGhpcy5jb21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRJdGVtKGludCBpbmRleCwgU3RyaW5nIGl0ZW0pIHsKLQkJCXRoaXMuY29tYm8uc2V0SXRlbShpbmRleCwgaXRlbSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRJdGVtcyhTdHJpbmdbXSBpdGVtcykgewotCQkJdGhpcy5jb21iby5zZXRJdGVtcyhpdGVtcyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRQb3B1bGF0aW5nKGJvb2xlYW4gcG9wdWxhdGluZykgewotCQkJdGhpcy5jb21iby5zZXREYXRhKCJwb3B1bGF0aW5nIiwgQm9vbGVhbi52YWx1ZU9mKHBvcHVsYXRpbmcpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIGl0ZW0pIHsKLQotCQkJLy8gS2VlcCB0cmFjayBvZiB0aGUgc2VsZWN0ZWQgaXRlbSBzaW5jZSBpdCdzIHBvc3NpYmxlIHRoZSBzZWxlY3RlZAotCQkJLy8gaXRlbSBpcyBiZWZvcmUgdGhlIGNvbWJvIGlzIHBvcHVsYXRlZAotCQkJaWYgKHRoaXMuY29tYm8uZ2V0SXRlbUNvdW50KCkgPT0gMCkgewotCQkJCXRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKLQkJCX0KLQkJCXRoaXMuY29tYm8uc2V0VGV4dChpdGVtKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L0RhdGVUaW1lTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9EYXRlVGltZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzYxN2I1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L0RhdGVUaW1lTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRhdGVUaW1lOwotCi0vKioKLSAqIFRoaXMgYWRhcHRlciBjYW4gYmUgdXNlZCB0byBrZWVwIGEgRGF0ZVRpbWUgd2lkZ2V0IGluIHN5bmNoIHdpdGgKLSAqIG1vZGVsIGludGVnZXJzIGhvdXJzLCBtaW51dGVzLCBhbmQgc2Vjb25kcy4gIEhhcyBkZWZhdWx0IGhvdXJzLAotICogbWludXRlcyBhbmQgc2Vjb25kcyBvZiAwIHdoaWNoIGNvcnJlc3BvbmRzIHRvIDEyOjAwOjAwIEFNLiBUaGlzIG1vZGVsCi0gKiBhZGFwdGVyIGNhbiBvbmx5IGJlIHVzZWQgZm9yIGEgRGF0ZVRpbWUgd2lkZ2V0IHdpdGggdGhlIHN0eWxlIFNXVC5USU1FCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIERhdGVUaW1lTW9kZWxBZGFwdGVyIHsKLQotCS8qKgotCSAqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgaG91cnMgaW50ZWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBob3Vyc0hvbGRlcjsKLQkKLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIG1pbnV0ZXMgaW50ZWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBtaW51dGVzSG9sZGVyOwotCQotCS8qKgotCSAqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgc2Vjb25kcyBpbnRlZ2VyLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IHNlY29uZHNIb2xkZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBkYXRlVGltZSdzIHNlbGVjdGlvbiBzdGF0ZSB3aXRoCi0JICogdGhlIG1vZGVsIGhvdXJzIGludGVnZXIuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaG91cnNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIGRhdGVUaW1lJ3Mgc2VsZWN0aW9uIHN0YXRlIHdpdGgKLQkgKiB0aGUgbW9kZWwgbWludXRlcyBpbnRlZ2VyLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIG1pbnV0ZXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIGRhdGVUaW1lJ3Mgc2VsZWN0aW9uIHN0YXRlIHdpdGgKLQkgKiB0aGUgbW9kZWwgc2Vjb25kcyBpbnRlZ2VyLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHNlY29uZHNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhlIGRhdGVUaW1lIHdlIGtlZXAgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsIGludGVnZXJzLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBEYXRlVGltZSBkYXRlVGltZTsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgb3VyIHNlbGVjdGlvbiBudW1iZXIgaG9sZGVyCi0JICogd2l0aCB0aGUgc3Bpbm5lcidzIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTZWxlY3Rpb25MaXN0ZW5lciBkYXRlVGltZVNlbGVjdGlvbkxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzdG9wIGxpc3RlbmluZyB0byBzdHVmZiB3aGVuIHRoZSBkYXRlVGltZQotCSAqIGlzIGRpc3Bvc2VkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBEaXNwb3NlTGlzdGVuZXIgZGF0ZVRpbWVEaXNwb3NlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGxvY2sgaXMgdXNlZCB0byBwcmV2ZW50IHRoZSBsaXN0ZW5lcnMgdG8gYmUgbm90aWZpZWQgd2hlbiB0aGUgdmFsdWUKLQkgKiBjaGFuZ2VzIGZyb20gdGhlIHNwaW5uZXIgb3IgZnJvbSB0aGUgaG9sZGVyLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBsb2NrZWQ7Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbW9kZWwgaW50ZWdlciBob2xkZXJzIHRvIHRoZSBzcGVjaWZpZWQgZGF0ZVRpbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBEYXRlVGltZU1vZGVsQWRhcHRlciBhZGFwdCgKLQkJCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gaG91cnNIb2xkZXIsCi0JCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG1pbnV0ZXNIb2xkZXIsCi0JCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IHNlY29uZHNIb2xkZXIsCi0JCQlEYXRlVGltZSBkYXRlVGltZSkKLQl7Ci0JCXJldHVybiBuZXcgRGF0ZVRpbWVNb2RlbEFkYXB0ZXIoaG91cnNIb2xkZXIsIG1pbnV0ZXNIb2xkZXIsIHNlY29uZHNIb2xkZXIsIGRhdGVUaW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGhvdXJzSG9sZGVyLCBtaW51dGVzSG9sZGVyLCBzZWNvbmRzSG9sZGVyLCBhbmQgZGF0ZVRpbWUgYXJlIHJlcXVpcmVkCi0JICovCi0JcHJvdGVjdGVkIERhdGVUaW1lTW9kZWxBZGFwdGVyKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gaG91cnNIb2xkZXIsCi0JCQkJCQkJCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG1pbnV0ZXNIb2xkZXIsCi0JCQkJCQkJCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IHNlY29uZHNIb2xkZXIsCi0JCQkJCQkJCQlEYXRlVGltZSBkYXRlVGltZSkgewotCQlzdXBlcigpOwotCQlpZiAoKGhvdXJzSG9sZGVyID09IG51bGwpIAotCQkJfHwgKG1pbnV0ZXNIb2xkZXIgPT0gbnVsbCkgCi0JCQl8fCAoc2Vjb25kc0hvbGRlciA9PSBudWxsKSAKLQkJCXx8IChkYXRlVGltZSA9PSBudWxsKSkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5ob3Vyc0hvbGRlciA9IGhvdXJzSG9sZGVyOwotCQl0aGlzLm1pbnV0ZXNIb2xkZXIgPSBtaW51dGVzSG9sZGVyOwotCQl0aGlzLnNlY29uZHNIb2xkZXIgPSBzZWNvbmRzSG9sZGVyOwotCQl0aGlzLmRhdGVUaW1lID0gZGF0ZVRpbWU7Ci0KLQkJdGhpcy5ob3Vyc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkSG91cnNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuaG91cnNIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuaG91cnNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLm1pbnV0ZXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZE1pbnV0ZXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMubWludXRlc0hvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5taW51dGVzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zZWNvbmRzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTZWNvbmRzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNlY29uZHNIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2Vjb25kc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkKLQkJdGhpcy5kYXRlVGltZVNlbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZERhdGVUaW1lU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5kYXRlVGltZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmRhdGVUaW1lU2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCXRoaXMuZGF0ZVRpbWVEaXNwb3NlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRGF0ZVRpbWVEaXNwb3NlTGlzdGVuZXIoKTsKLQkJdGhpcy5kYXRlVGltZS5hZGREaXNwb3NlTGlzdGVuZXIodGhpcy5kYXRlVGltZURpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy51cGRhdGVEYXRlVGltZUhvdXJzKGhvdXJzSG9sZGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnVwZGF0ZURhdGVUaW1lTWludXRlcyhtaW51dGVzSG9sZGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnVwZGF0ZURhdGVUaW1lU2Vjb25kcyhzZWNvbmRzSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEhvdXJzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkSG91cnNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEhvdXJzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJRGF0ZVRpbWVNb2RlbEFkYXB0ZXIudGhpcy5ob3Vyc0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiZGF0ZVRpbWUgaG91cnMgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE1pbnV0ZXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRNaW51dGVzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRNaW51dGVzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJRGF0ZVRpbWVNb2RlbEFkYXB0ZXIudGhpcy5taW51dGVzQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJkYXRlVGltZSBtaW51dGVzIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWNvbmRzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkU2Vjb25kc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2Vjb25kc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCURhdGVUaW1lTW9kZWxBZGFwdGVyLnRoaXMuc2Vjb25kc0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiZGF0ZVRpbWUgc2Vjb25kcyBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkRGF0ZVRpbWVTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlEYXRlVGltZU1vZGVsQWRhcHRlci50aGlzLmRhdGVUaW1lU2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CQkJCQotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJkYXRlVGltZSBzZWxlY3Rpb24gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBEaXNwb3NlTGlzdGVuZXIgYnVpbGREYXRlVGltZURpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlEYXRlVGltZU1vZGVsQWRhcHRlci50aGlzLmRhdGVUaW1lRGlzcG9zZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiZGF0ZVRpbWUgZGlzcG9zZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1vZGVsIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBob3Vyc0NoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoIXRoaXMubG9ja2VkKSB7Ci0JCQl0aGlzLnVwZGF0ZURhdGVUaW1lSG91cnMoKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbWludXRlc0NoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoIXRoaXMubG9ja2VkKSB7Ci0JCQl0aGlzLnVwZGF0ZURhdGVUaW1lTWludXRlcygoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWNvbmRzQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICghdGhpcy5sb2NrZWQpIHsKLQkJCXRoaXMudXBkYXRlRGF0ZVRpbWVTZWNvbmRzKChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogZGF0ZVRpbWUgZXZlbnRzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGRhdGVUaW1lU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCF0aGlzLmxvY2tlZCkgewotCQkJdGhpcy5sb2NrZWQgPSB0cnVlOwotCQkJdHJ5IHsKLQkJCQkvL3RvbyBiYWQgdGhleSBkaWRuJ3Qgc3BsaXQgdGhlIGV2ZW50IHVwCi0JCQkJaG91cnNTZWxlY3RlZCgpOwotCQkJCW1pbnV0ZXNTZWxlY3RlZCgpOwotCQkJCXNlY29uZHNTZWxlY3RlZCgpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJdGhpcy5sb2NrZWQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBob3Vyc1NlbGVjdGVkKCkgewotCQlJbnRlZ2VyIGhvdXJzID0gbnVsbDsKLQkJaWYgKHRoaXMuZGF0ZVRpbWUuZ2V0SG91cnMoKSAhPSAwKSB7Ci0JCQlob3VycyA9IEludGVnZXIudmFsdWVPZih0aGlzLmRhdGVUaW1lLmdldEhvdXJzKCkpOwotCQl9Ci0JCXRoaXMuaG91cnNIb2xkZXIuc2V0VmFsdWUoaG91cnMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBtaW51dGVzU2VsZWN0ZWQoKSB7Ci0JCUludGVnZXIgbWludXRlcyA9IG51bGw7Ci0JCWlmICh0aGlzLmRhdGVUaW1lLmdldE1pbnV0ZXMoKSAhPSAwKSB7Ci0JCQltaW51dGVzID0gSW50ZWdlci52YWx1ZU9mKHRoaXMuZGF0ZVRpbWUuZ2V0TWludXRlcygpKTsKLQkJfQotCQl0aGlzLm1pbnV0ZXNIb2xkZXIuc2V0VmFsdWUobWludXRlcyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNlY29uZHNTZWxlY3RlZCgpIHsKLQkJSW50ZWdlciBzZWNvbmRzID0gbnVsbDsKLQkJaWYgKHRoaXMuZGF0ZVRpbWUuZ2V0U2Vjb25kcygpICE9IDApIHsKLQkJCXNlY29uZHMgPSBJbnRlZ2VyLnZhbHVlT2YodGhpcy5kYXRlVGltZS5nZXRTZWNvbmRzKCkpOwotCQl9Ci0JCXRoaXMuc2Vjb25kc0hvbGRlci5zZXRWYWx1ZShzZWNvbmRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkYXRlVGltZURpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkvLyB0aGUgZGF0ZVRpbWUgaXMgbm90IHlldCAiZGlzcG9zZWQiIHdoZW4gd2UgcmVjZWl2ZSB0aGlzIGV2ZW50Ci0JCS8vIHNvIHdlIGNhbiBzdGlsbCByZW1vdmUgb3VyIGxpc3RlbmVycwotCQl0aGlzLmRhdGVUaW1lLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLmRhdGVUaW1lRGlzcG9zZUxpc3RlbmVyKTsKLQkJdGhpcy5kYXRlVGltZS5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmRhdGVUaW1lU2VsZWN0aW9uTGlzdGVuZXIpOwotCQl0aGlzLmhvdXJzSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmhvdXJzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubWludXRlc0hvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5taW51dGVzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuc2Vjb25kc0hvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zZWNvbmRzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiB1cGRhdGUgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGF0ZVRpbWVIb3VycyhJbnRlZ2VyIGhvdXJzKSB7Ci0JCWlmICh0aGlzLmRhdGVUaW1lLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChob3VycyA9PSBudWxsKSB7Ci0JCQlob3VycyA9IEludGVnZXIudmFsdWVPZigwKTsvL1RPRE8gZGVmYXVsdEhvdXJzCi0JCX0KLQkJdGhpcy5sb2NrZWQgPSB0cnVlOwotCQl0cnkgewotCQkJdGhpcy5kYXRlVGltZS5zZXRIb3Vycyhob3Vycy5pbnRWYWx1ZSgpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRoaXMubG9ja2VkID0gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGF0ZVRpbWVNaW51dGVzKEludGVnZXIgbWludXRlcykgewotCQlpZiAodGhpcy5kYXRlVGltZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobWludXRlcyA9PSBudWxsKSB7Ci0JCQltaW51dGVzID0gSW50ZWdlci52YWx1ZU9mKDApOy8vVE9ETyBkZWZhdWx0TWludXRlcwotCQl9Ci0JCXRoaXMubG9ja2VkID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCXRoaXMuZGF0ZVRpbWUuc2V0TWludXRlcyhtaW51dGVzLmludFZhbHVlKCkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdGhpcy5sb2NrZWQgPSBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEYXRlVGltZVNlY29uZHMoSW50ZWdlciBzZWNvbmRzKSB7Ci0JCWlmICh0aGlzLmRhdGVUaW1lLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChzZWNvbmRzID09IG51bGwpIHsKLQkJCXNlY29uZHMgPSBJbnRlZ2VyLnZhbHVlT2YoMCk7Ly9UT0RPIGRlZmF1bHRTZWNvbmRzCi0JCX0KLQkJdGhpcy5sb2NrZWQgPSB0cnVlOwotCQl0cnkgewotCQkJdGhpcy5kYXRlVGltZS5zZXRTZWNvbmRzKHNlY29uZHMuaW50VmFsdWUoKSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0aGlzLmxvY2tlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaG91cnNIb2xkZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L0Rpc3Bvc2VBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9EaXNwb3NlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzY1YTU1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L0Rpc3Bvc2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotCi0vKioKLSAqIENvbnZlbmllbmNlIFNXVCBkaXNwb3NlIGxpc3RlbmVyLgotICovCi1wdWJsaWMgY2xhc3MgRGlzcG9zZUFkYXB0ZXIKLQlpbXBsZW1lbnRzIERpc3Bvc2VMaXN0ZW5lcgotewotCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCS8vIE5PUAotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9TcGlubmVyTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9TcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZWJjNzAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotCi0vKioKLSAqCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNwaW5uZXJNb2RlbEFkYXB0ZXIgewotCi0JLyoqCi0JICogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIHNwaW5uZXIncyBjb250ZW50cyB3aXRoCi0JICogdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFRoZSBzcGlubmVyIHdlIGtlZXAgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsIHN0cmluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3Bpbm5lciBzcGlubmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSBvdXIgc2VsZWN0aW9uIG51bWJlciBob2xkZXIKLQkgKiB3aXRoIHRoZSBzcGlubmVyJ3MgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIE1vZGlmeUxpc3RlbmVyIHNwaW5uZXJNb2RpZnlMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgc3Bpbm5lcgotCSAqIGlzIGRpc3Bvc2VkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBEaXNwb3NlTGlzdGVuZXIgc3Bpbm5lckRpc3Bvc2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFRoZSB2YWx1ZSBzaG93biB3aGVuIHRoZSBudW1iZXIgaG9sZGVyJ3MgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGludCBkZWZhdWx0VmFsdWU7Ci0KLQkvKioKLQkgKiBUaGlzIGxvY2sgaXMgdXNlZCB0byBwcmV2ZW50IHRoZSBsaXN0ZW5lcnMgdG8gYmUgbm90aWZpZWQgd2hlbiB0aGUgdmFsdWUKLQkgKiBjaGFuZ2VzIGZyb20gdGhlIHNwaW5uZXIgb3IgZnJvbSB0aGUgaG9sZGVyLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBsb2NrZWQ7Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCBhbmQgc2VsZWN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIHNwaW5uZXIuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBzcGlubmVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3Bpbm5lck1vZGVsQWRhcHRlciBhZGFwdCgKLQkJCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyLAotCQkJU3Bpbm5lciBzcGlubmVyLAotCQkJaW50IGRlZmF1bHRWYWx1ZSkKLQl7Ci0JCXJldHVybiBuZXcgU3Bpbm5lck1vZGVsQWRhcHRlcihudW1iZXJIb2xkZXIsIHNwaW5uZXIsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciwgc2VsZWN0aW9ucyBob2xkZXIsIGxpc3QgYm94LCBhbmQKLQkgKiBzdHJpbmcgY29udmVydGVyIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3Bpbm5lck1vZGVsQWRhcHRlcihNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGlubmVyIHNwaW5uZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcigpOwotCQlpZiAoKG51bWJlckhvbGRlciA9PSBudWxsKSB8fCAoc3Bpbm5lciA9PSBudWxsKSkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5udW1iZXJIb2xkZXIgPSBudW1iZXJIb2xkZXI7Ci0JCXRoaXMuc3Bpbm5lciA9IHNwaW5uZXI7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMubnVtYmVySG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuc3Bpbm5lck1vZGlmeUxpc3RlbmVyID0gdGhpcy5idWlsZFNwaW5uZXJNb2RpZnlMaXN0ZW5lcigpOwotCQl0aGlzLnNwaW5uZXIuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcy5zcGlubmVyTW9kaWZ5TGlzdGVuZXIpOwotCi0JCXRoaXMuc3Bpbm5lckRpc3Bvc2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTcGlubmVyRGlzcG9zZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc3Bpbm5lci5hZGREaXNwb3NlTGlzdGVuZXIodGhpcy5zcGlubmVyRGlzcG9zZUxpc3RlbmVyKTsKLQotCQl0aGlzLnVwZGF0ZVNwaW5uZXIobnVtYmVySG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlci50aGlzLnZhbHVlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzcGlubmVyIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgYnVpbGRTcGlubmVyTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlTcGlubmVyTW9kZWxBZGFwdGVyLnRoaXMuc3Bpbm5lck1vZGlmaWVkKGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic3Bpbm5lciBzZWxlY3Rpb24gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBEaXNwb3NlTGlzdGVuZXIgYnVpbGRTcGlubmVyRGlzcG9zZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXIudGhpcy5zcGlubmVyRGlzcG9zZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic3Bpbm5lciBkaXNwb3NlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbW9kZWwgZXZlbnRzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICghdGhpcy5sb2NrZWQpIHsKLQkJCXRoaXMudXBkYXRlU3Bpbm5lcigoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3Bpbm5lciBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgc3Bpbm5lck1vZGlmaWVkKE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCWlmICghdGhpcy5sb2NrZWQpIHsKLQkJCXRoaXMubG9ja2VkID0gdHJ1ZTsKLQkJCXRyeSB7Ci0JCQkJdGhpcy5udW1iZXJIb2xkZXIuc2V0VmFsdWUodGhpcy5zcGlubmVyLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXRoaXMubG9ja2VkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzcGlubmVyRGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHRoZSBzcGlubmVyIGlzIG5vdCB5ZXQgImRpc3Bvc2VkIiB3aGVuIHdlIHJlY2VpdmUgdGhpcyBldmVudAotCQkvLyBzbyB3ZSBjYW4gc3RpbGwgcmVtb3ZlIG91ciBsaXN0ZW5lcnMKLQkJdGhpcy5zcGlubmVyLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLnNwaW5uZXJEaXNwb3NlTGlzdGVuZXIpOwotCQl0aGlzLnNwaW5uZXIucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcy5zcGlubmVyTW9kaWZ5TGlzdGVuZXIpOwotCQl0aGlzLm51bWJlckhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHVwZGF0ZSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGlubmVyKEludGVnZXIgdmFsdWUpIHsKLQkJaWYgKHRoaXMuc3Bpbm5lci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyB0aGUgbW9kZWwgY2FuIGJlIG51bGwsIGJ1dCB0aGUgc3Bpbm5lciBjYW5ub3QKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gZGVmYXVsdFZhbHVlOwotCQl9Ci0JCXRoaXMubG9ja2VkID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCXRoaXMuc3Bpbm5lci5zZXRTZWxlY3Rpb24odmFsdWUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdGhpcy5sb2NrZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm51bWJlckhvbGRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvVGFibGVJdGVtTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9UYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhlOTI0OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9UYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIHRhYmxlIGl0ZW0gaW4gc3luY2ggd2l0aCB0aGUgcHJvcGVydGllcyBvZgotICogYSBtb2RlbC4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGFibGVJdGVtTW9kZWxBZGFwdGVyIHsKLQotCS8qKiBUaGUgdGFibGUgaXRlbSB3ZSBzeW5jaHJvbml6ZSB3aXRoIHRoZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGFibGVJdGVtIHRhYmxlSXRlbTsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgYnV0dG9uCi0JICogaXMgZGlzcG9zZWQuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIERpc3Bvc2VMaXN0ZW5lciB0YWJsZUl0ZW1EaXNwb3NlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDbGllbnQtc3VwcGxpZWQgYWRhcHRlciB0aGF0IHByb3ZpZGVzIHdpdGggdGhlIHZhcmlvdXMgY29sdW1uIHNldHRpbmdzIGFuZAotCSAqIGNvbnZlcnRzIHRoZSBvYmplY3RzIGluIHRoZSBMVk0gaW50byBhbiBhcnJheSBvZiBjZWxsIG1vZGVscy4KLQkgKi8KLQlwcml2YXRlIENvbHVtbkFkYXB0ZXI8T2JqZWN0PiBjb2x1bW5BZGFwdGVyOwotCi0JLyoqCi0JICogVGhlIHZhbHVlIG1vZGVscyB1c2VkIHRvIGxpc3RlbiB0byBlYWNoIHByb3BlcnR5IHRoYXQgYXJlIGRpc3BsYXkgYnkgdGhlCi0JICogdGFibGUgaXRlbS4KLQkgKi8KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSB2YWx1ZUhvbGRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgbGlzdCBvZiA8Y29kZT5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPC9jb2RlPnMgdXNlZCB0byBiZSBub3RpZmllZCB3aGVuCi0JICogdGhlIHByb3BlcnRpZXMgb2YgdGhlIG1vZGVsIGJlaW5nIGRpc3BsYXkgaW50byBhIHJvdyBjaGFuZ2UuCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10gcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnM7Ci0KLQkvKioKLQkgKiBUaGUgbGFiZWwgdXNlZCB0byBmb3JtYXQgdGhlIG9iamVjdHMgaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKi8KLQlwcml2YXRlIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBib29sZWFuIHRvIHRoZSBzcGVjaWZpZWQgYnV0dG9uLgotCSAqIElmIHRoZSBib29sZWFuIGlzIG51bGwsIHRoZSBidXR0b24ncyB2YWx1ZSB3aWxsIGJlICJ1bnNlbGVjdGVkIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRhYmxlSXRlbU1vZGVsQWRhcHRlciBhZGFwdChUYWJsZUl0ZW0gdGFibGVJdGVtLCBDb2x1bW5BZGFwdGVyPD8+IGNvbHVtbkFkYXB0ZXIsIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlyZXR1cm4gbmV3IFRhYmxlSXRlbU1vZGVsQWRhcHRlcih0YWJsZUl0ZW0sIGNvbHVtbkFkYXB0ZXIsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgYm9vbGVhbiBob2xkZXIgYW5kIGJ1dHRvbiBhcmUgcmVxdWlyZWQuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIFRhYmxlSXRlbU1vZGVsQWRhcHRlcihUYWJsZUl0ZW0gdGFibGVJdGVtLCBDb2x1bW5BZGFwdGVyPD8+IGNvbHVtbkFkYXB0ZXIsIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlzdXBlcigpOwotCQlpZiAodGFibGVJdGVtID09IG51bGwgfHwgY29sdW1uQWRhcHRlciA9PSBudWxsIHx8IGxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy50YWJsZUl0ZW0gPSB0YWJsZUl0ZW07Ci0JCXRoaXMubGFiZWxQcm92aWRlciA9IGxhYmVsUHJvdmlkZXI7Ci0JCXRoaXMuY29sdW1uQWRhcHRlciA9IChDb2x1bW5BZGFwdGVyPE9iamVjdD4pIGNvbHVtbkFkYXB0ZXI7Ci0KLQkJdGhpcy50YWJsZUl0ZW1EaXNwb3NlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGFibGVJdGVtRGlzcG9zZUxpc3RlbmVyKCk7Ci0JCXRoaXMudGFibGVJdGVtLmFkZERpc3Bvc2VMaXN0ZW5lcih0aGlzLnRhYmxlSXRlbURpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy52YWx1ZUhvbGRlcnMgPSB0aGlzLmNvbHVtbkFkYXB0ZXIuY2VsbE1vZGVscyh0YWJsZUl0ZW0uZ2V0RGF0YSgpKTsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpOwotCi0JCWZvciAoaW50IGluZGV4ID0gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbkNvdW50KCk7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQl0YWJsZUl0ZW1DaGFuZ2VkKGluZGV4LCB0YWJsZUl0ZW0uZ2V0RGF0YSgpLCBmYWxzZSk7Ci0JCQl2YWx1ZUhvbGRlcnNbaW5kZXhdLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyc1tpbmRleF0pOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltdIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltjb2x1bW5BZGFwdGVyLmNvbHVtbkNvdW50KCldOwotCQlmb3IgKGludCBpbmRleCA9IGxpc3RlbmVycy5sZW5ndGg7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQlsaXN0ZW5lcnNbaW5kZXhdID0gYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGluZGV4KTsKLQkJfQotCQlyZXR1cm4gbGlzdGVuZXJzOwotCX0KLQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKAotCQkJdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKGluZGV4KQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgVGFibGVJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihpbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIERpc3Bvc2VMaXN0ZW5lciBidWlsZFRhYmxlSXRlbURpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIudGhpcy50YWJsZUl0ZW1EaXNwb3NlZChldmVudCk7Ci0JCQl9Ci0JCSAgICBAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJUYWJsZUl0ZW0gZGlzcG9zZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHRhYmxlSXRlbUNoYW5nZWQoaW50IGluZGV4LCBPYmplY3Qgc3ViamVjdCwgYm9vbGVhbiByZXZhbGlkYXRlKSB7Ci0KLQkJaWYgKCF0aGlzLnRhYmxlSXRlbS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMudXBkYXRlVGFibGVJdGVtVGV4dChpbmRleCwgc3ViamVjdCk7Ci0JCQl0aGlzLnVwZGF0ZVRhYmxlSXRlbUltYWdlKGluZGV4LCBzdWJqZWN0KTsKLQotCQkJaWYgKHJldmFsaWRhdGUpIHsKLQkJCQl0aGlzLmxheW91dFRhYmxlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlVGFibGVJdGVtVGV4dChpbnQgaW5kZXgsIE9iamVjdCBzdWJqZWN0KSB7Ci0JCVN0cmluZyB0ZXh0ID0gdGhpcy5sYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQoc3ViamVjdCwgaW5kZXgpOwotCQlpZiAodGV4dCA9PSBudWxsKSB7Ci0JCQl0ZXh0ID0gIiI7Ci0JCX0KLQkJdGhpcy50YWJsZUl0ZW0uc2V0VGV4dChpbmRleCwgdGV4dCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVRhYmxlSXRlbUltYWdlKGludCBpbmRleCwgT2JqZWN0IHN1YmplY3QpIHsKLQkJSW1hZ2UgaW1hZ2UgPSB0aGlzLmxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uSW1hZ2Uoc3ViamVjdCwgaW5kZXgpOwotCQl0aGlzLnRhYmxlSXRlbS5zZXRJbWFnZShpbmRleCwgaW1hZ2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBsYXlvdXRUYWJsZSgpIHsKLQkJLy8gUmVmcmVzaCB0aGUgdGFibGUgaW4gb3JkZXIgdG8gc2hvdyB0aGUgc2Nyb2xsYmFyIGlmIHJlcXVpcmVkCi0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0aGlzLnRhYmxlSXRlbS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKTsKLQkJY29udGFpbmVyLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWNvbnRhaW5lci5sYXlvdXQoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGRpc3Bvc2UgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgdGFibGVJdGVtRGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHRoZSBidXR0b24gaXMgbm90IHlldCAiZGlzcG9zZWQiIHdoZW4gd2UgcmVjZWl2ZSB0aGlzIGV2ZW50Ci0JCS8vIHNvIHdlIGNhbiBzdGlsbCByZW1vdmUgb3VyIGxpc3RlbmVycwotCQl0aGlzLnRhYmxlSXRlbS5yZW1vdmVEaXNwb3NlTGlzdGVuZXIodGhpcy50YWJsZUl0ZW1EaXNwb3NlTGlzdGVuZXIpOwotCi0JCWZvciAoaW50IGluZGV4ID0gdmFsdWVIb2xkZXJzLmxlbmd0aDsgLS1pbmRleCA+PSAwOyApIHsKLQkJCXZhbHVlSG9sZGVyc1tpbmRleF0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzW2luZGV4XSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci0KLSAgIHByaXZhdGUgY2xhc3MgVGFibGVJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCi0gICAJcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7Ci0KLSAgIAlUYWJsZUl0ZW1Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGludCBpbmRleCkgewotICAgCQlzdXBlcigpOwotICAgCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0gICAJfQotCi0gICAJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgIAkJaWYgKCF0YWJsZUl0ZW0uaXNEaXNwb3NlZCgpKSB7Ci0gICAJCQlUYWJsZSB0YWJsZSA9IHRhYmxlSXRlbS5nZXRQYXJlbnQoKTsKLSAgIAkJCXRhYmxlSXRlbUNoYW5nZWQoaW5kZXgsIHRhYmxlSXRlbS5nZXREYXRhKCksIHRhYmxlLmdldENvbHVtbkNvdW50KCkgPT0gMCk7Ci0gICAJCX0KLSAgIAl9Ci0gICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvVGFibGVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L1RhYmxlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMDE3MmYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvVGFibGVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotCi0vKioKLSAqIFRoaXMgYWRhcHRlciBwcm92aWRlcyBhIG1vcmUgb2JqZWN0LW9yaWVudGVkIGludGVyZmFjZSB0byB0aGUgaXRlbXMgYW5kCi0gKiBzZWxlY3RlZCBpdGVtcyBpbiBhIHRhYmxlLgotICoge0BsaW5rICNsaXN0SG9sZGVyfSBjb250YWlucyB0aGUgZGF0YSBvZiBhIHNpbmdsZSBjb2x1bW4gaW4gdGhlIHRhYmxlLgotICoge0BsaW5rICNzZWxlY3RlZEl0ZW1zSG9sZGVyfSBjb250YWlucyB0aGUgZGF0YSBvZiBhIHNpbmdsZSBjb2x1bW4gaW4KLSAqIHtAbGluayAjbGlzdEhvbGRlcn0gdGhhdCBhcmUgc2VsZWN0ZWQgaW4gdGhlIHRhYmxlLgotICovCi0vLyBUT0RPIGJqdgotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGFibGVNb2RlbEFkYXB0ZXI8RT4gewotCi0JLy8gKioqKioqKioqKiBtb2RlbCAqKioqKioqKioqCi0JLyoqCi0JICogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgdGFibGUncyBjb250ZW50cyB3aXRoCi0JICogdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHNlbGVjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbXNIb2xkZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSB0YWJsZSdzIHNlbGVjdGlvbiB3aXRoCi0JICogdGhlIG1vZGVsIHNlbGVjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBzZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGUgdGFibGUgd2Uga2VlcCBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgbW9kZWwgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGFibGUgdGFibGU7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIG91ciBzZWxlY3Rpb24gbGlzdCBob2xkZXIKLQkgKiB3aXRoIHRoZSB0YWJsZSdzIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU2VsZWN0aW9uTGlzdGVuZXIgdGFibGVTZWxlY3Rpb25MaXN0ZW5lcjsKLQotCS8qKgotCSAqIENsaWVudHMgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdGVuZXJMaXN0PFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+PiBzZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3Q7Ci0KLQkvKioKLQkgKiBDbGllbnRzIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gZG91YmxlIGNsaWNrIGV2ZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdGVuZXJMaXN0PERvdWJsZUNsaWNrTGlzdGVuZXI8RT4+IGRvdWJsZUNsaWNrTGlzdGVuZXJMaXN0OwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzdG9wIGxpc3RlbmluZyB0byBzdHVmZiB3aGVuIHRoZSB0YWJsZQotCSAqIGlzIGRpc3Bvc2VkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBEaXNwb3NlTGlzdGVuZXIgdGFibGVEaXNwb3NlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGxhYmVsIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIHRvIGNvbnZlcnQgYSBwcm9wZXJ0eSBhdCBhIGNvbHVtbiBpbmRleAotCSAqIHRvIGEgc3RyaW5nIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGUgY29sdW1uIGFkYXB0ZXIgaXMgcmVzcG9uc2libGUgdG8gcmV0dXJuIHRoZSBjb3VudCBvZiBjb2x1bW5zIGFuZCB0bwotCSAqIGNyZWF0ZSB0aGUgdmFsdWUgaG9sZGVycyBmb3IgYWxsIHRoZSBwcm9wZXJ0aWVzLgotCSAqLwotCXByaXZhdGUgQ29sdW1uQWRhcHRlcjxFPiBjb2x1bW5BZGFwdGVyOwotCi0JLyoqCi0JICogS2VlcHMgdHJhY2sgb2YgdGhlIDxjb2RlPlRhYmxlSXRlbU1vZGVsQWRhcHRlcjwvY29kZT5zIHRoYXQgd2VyZSBjcmVhdGVkCi0JICogZm9yIGVhY2ggaXRlbSBvZiB0aGUgbGlzdCBob2xkZXIuCi0JICovCi0JcHJpdmF0ZSBMaXN0PFRhYmxlSXRlbU1vZGVsQWRhcHRlcj4gdGFibGVJdGVtTW9kZWxBZGFwdGVyczsKLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBsaXN0IG1vZGVsIGFuZCBzZWxlY3Rpb24gdG8gdGhlIHNwZWNpZmllZCB0YWJsZS4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKLQkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFRhYmxlTW9kZWxBZGFwdGVyPFQ+IGFkYXB0KAotCQkJTGlzdFZhbHVlTW9kZWw8VD4gbGlzdEhvbGRlciwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlUYWJsZSB0YWJsZSwKLQkJCUNvbHVtbkFkYXB0ZXI8VD4gY29sdW1uQWRhcHRlciwKLQkJCUlUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQkKLQkJcmV0dXJuIG5ldyBUYWJsZU1vZGVsQWRhcHRlcjxUPigKLQkJCWxpc3RIb2xkZXIsCi0JCQluZXcgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8VD4oc2VsZWN0ZWRJdGVtSG9sZGVyKSwKLQkJCXRhYmxlLAotCQkJY29sdW1uQWRhcHRlciwKLQkJCWxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQkvKioKLQkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIGxpc3QgbW9kZWwgYW5kIHNlbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIHRhYmxlLgotCSAqIFRoZSBzcGVjaWZpZWQgc2VsZWN0aW9uIG1vZGVsIHdpbGwgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIHRhYmxlLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgdGFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVGFibGVNb2RlbEFkYXB0ZXI8VD4gYWRhcHQoCi0JCQlMaXN0VmFsdWVNb2RlbDxUPiBsaXN0SG9sZGVyLAotCQkJTW9kaWZpYWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFQ+IHNlbGVjdGlvbk1vZGVsLAotCQkJVGFibGUgdGFibGUsCi0JCQlDb2x1bW5BZGFwdGVyPFQ+IGNvbHVtbkFkYXB0ZXIsCi0JCQlJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJCi0JCVRhYmxlTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSAKLQkJCQluZXcgVGFibGVNb2RlbEFkYXB0ZXI8VD4oCi0JCQkJCWxpc3RIb2xkZXIsCi0JCQkJCXNlbGVjdGlvbk1vZGVsLAotCQkJCQl0YWJsZSwKLQkJCQkJY29sdW1uQWRhcHRlciwKLQkJCQkJbGFiZWxQcm92aWRlcik7Ci0JCWFkYXB0ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoYnVpbGRTeW5jTGlzdGVuZXIoc2VsZWN0aW9uTW9kZWwpKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIDxUPiBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFN5bmNMaXN0ZW5lcigKLQkJCQlmaW5hbCBNb2RpZmlhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw8VD4gc2VsZWN0aW9uTW9kZWwpIHsKLQkJCi0JCXJldHVybiBuZXcgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJc2VsZWN0aW9uTW9kZWwuc2V0VmFsdWVzKENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShldmVudC5zZWxlY3Rpb24oKSkpOwotCQkJfQotCQl9OwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciwgc2VsZWN0aW9ucyBob2xkZXIsIHRhYmxlLCBhbmQKLQkgKiBzdHJpbmcgY29udmVydGVyIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgVGFibGVNb2RlbEFkYXB0ZXIoCi0JCQlMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLAotCQkJQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtc0hvbGRlciwKLQkJCVRhYmxlIHRhYmxlLAotCQkJQ29sdW1uQWRhcHRlcjxFPiBjb2x1bW5BZGFwdGVyLAotCQkJSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKQotCXsKLQkJc3VwZXIoKTsKLQkJaWYgKChsaXN0SG9sZGVyID09IG51bGwpIHx8IChzZWxlY3RlZEl0ZW1zSG9sZGVyID09IG51bGwpIHx8ICh0YWJsZSA9PSBudWxsKSB8fCAobGFiZWxQcm92aWRlciA9PSBudWxsKSkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1zSG9sZGVyID0gc2VsZWN0ZWRJdGVtc0hvbGRlcjsKLQkJdGhpcy50YWJsZSA9IHRhYmxlOwotCQl0aGlzLmNvbHVtbkFkYXB0ZXIgPSBjb2x1bW5BZGFwdGVyOwotCQl0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOwotCQl0aGlzLnRhYmxlSXRlbU1vZGVsQWRhcHRlcnMgPSBuZXcgQXJyYXlMaXN0PFRhYmxlSXRlbU1vZGVsQWRhcHRlcj4oY29sdW1uQWRhcHRlci5jb2x1bW5Db3VudCgpKTsKLQotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNlbGVjdGVkSXRlbXNIb2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMudGFibGVTZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRUYWJsZVNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMudGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy50YWJsZVNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQl0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdCA9IHRoaXMuYnVpbGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QoKTsKLQkJdGhpcy5kb3VibGVDbGlja0xpc3RlbmVyTGlzdCA9IHRoaXMuYnVpbGREb3VibGVDbGlja0xpc3RlbmVyTGlzdCgpOwotCi0JCXRoaXMudGFibGVEaXNwb3NlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGFibGVEaXNwb3NlTGlzdGVuZXIoKTsKLQkJdGhpcy50YWJsZS5hZGREaXNwb3NlTGlzdGVuZXIodGhpcy50YWJsZURpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zeW5jaHJvbml6ZVRhYmxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMubGlzdEl0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMubGlzdEl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLmxpc3RJdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMubGlzdEl0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiVGFibGVNb2RlbEFkYXB0ZXIgbGlzdCBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5zZWxlY3RlZEl0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMuc2VsZWN0ZWRJdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLnNlbGVjdGVkSXRlbXNDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiVGFibGVNb2RlbEFkYXB0ZXIgc2VsZWN0ZWQgaXRlbXMgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFRhYmxlU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMudGFibGVTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMudGFibGVEb3VibGVDbGlja2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIlRhYmxlTW9kZWxBZGFwdGVyIHRhYmxlIHNlbGVjdGlvbiBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoeyJyYXd0eXBlcyIsICJ1bmNoZWNrZWQifSkKLQlwcm90ZWN0ZWQgTGlzdGVuZXJMaXN0PERvdWJsZUNsaWNrTGlzdGVuZXI8RT4+IGJ1aWxkRG91YmxlQ2xpY2tMaXN0ZW5lckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgTGlzdGVuZXJMaXN0KERvdWJsZUNsaWNrTGlzdGVuZXIuY2xhc3MpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKHsicmF3dHlwZXMiLCAidW5jaGVja2VkIn0pCi0JcHJvdGVjdGVkIExpc3RlbmVyTGlzdDxTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFPj4gYnVpbGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgTGlzdGVuZXJMaXN0KFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGlzcG9zZUxpc3RlbmVyIGJ1aWxkVGFibGVEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy50YWJsZURpc3Bvc2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIlRhYmxlTW9kZWxBZGFwdGVyIHRhYmxlIGRpc3Bvc2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplVGFibGUoKSB7Ci0JCXRoaXMuc3luY2hyb25pemVUYWJsZUNvbHVtbnMoKTsKLQkJdGhpcy5zeW5jaHJvbml6ZVRhYmxlSXRlbXMoKTsKLQkJdGhpcy5zeW5jaHJvbml6ZVRhYmxlU2VsZWN0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgKioqKioqKioqKgotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGFibGUgY29sdW1zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplVGFibGVDb2x1bW5zKCkgewotCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBjb2x1bW5Db3VudCA9IHRoaXMuY29sdW1uQWRhcHRlci5jb2x1bW5Db3VudCgpOwotCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjb2x1bW5Db3VudDsgaW5kZXgrKykgewotCQkJVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGhpcy50YWJsZSwgU1dULk5VTEwsIGluZGV4KTsKLQkJCXRhYmxlQ29sdW1uLnNldE1vdmVhYmxlKGZhbHNlKTsKLQkJCXRhYmxlQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCXRhYmxlQ29sdW1uLnNldFdpZHRoKDEwMCk7Ci0KLQkJCVN0cmluZyBjb2x1bW5OYW1lID0gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbk5hbWUoaW5kZXgpOwotCi0JCQlpZiAoY29sdW1uTmFtZSA9PSBudWxsKSB7Ci0JCQkJY29sdW1uTmFtZSA9ICIiOwotCQkJfQotCi0JCQl0YWJsZUNvbHVtbi5zZXRUZXh0KGNvbHVtbk5hbWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQnJ1dGUgZm9yY2Ugc3luY2hyb25pemF0aW9uIG9mIHRhYmxlIHdpdGggdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVUYWJsZUl0ZW1zKCkgewotCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoaW50IGluZGV4ID0gdGhpcy50YWJsZS5nZXRJdGVtQ291bnQoKTsgLS1pbmRleCA+PSAwOyApIHsKLQkJCXRoaXMudGFibGUucmVtb3ZlKGluZGV4KTsKLQkJCXRoaXMudGFibGVJdGVtTW9kZWxBZGFwdGVycy5yZW1vdmUoaW5kZXgpOwotCQl9Ci0KLQkJaW50IGl0ZW1Db3VudCA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0KLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGl0ZW1Db3VudDsgaW5kZXgrKykgewotCi0JCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gbmV3IFRhYmxlSXRlbSh0aGlzLnRhYmxlLCBTV1QuTlVMTCwgaW5kZXgpOwotCQkJdGFibGVJdGVtLnNldERhdGEodGhpcy5saXN0SG9sZGVyLmdldChpbmRleCkpOwotCi0JCQlUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIgYWRhcHRlciA9IHRoaXMuYnVpbGRJdGVtTW9kZWwodGFibGVJdGVtKTsKLQkJCXRoaXMudGFibGVJdGVtTW9kZWxBZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgdGFibGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0KLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgaW5kZXggPSBldmVudC5nZXRJbmRleCgpOwotCi0JCWZvciAoRSBpdGVtIDogdGhpcy5nZXRJdGVtcyhldmVudCkpIHsKLQotCQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IG5ldyBUYWJsZUl0ZW0odGhpcy50YWJsZSwgU1dULk5VTEwsIGluZGV4KTsKLQkJCXRhYmxlSXRlbS5zZXREYXRhKGl0ZW0pOwotCi0JCQlUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIgYWRhcHRlciA9IHRoaXMuYnVpbGRJdGVtTW9kZWwodGFibGVJdGVtKTsKLQkJCXRoaXMudGFibGVJdGVtTW9kZWxBZGFwdGVycy5hZGQoaW5kZXgrKywgYWRhcHRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgdGFibGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQotCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRoaXMudGFibGUucmVtb3ZlKGV2ZW50LmdldEluZGV4KCksIGV2ZW50LmdldEluZGV4KCkgKyBldmVudC5nZXRJdGVtc1NpemUoKSAtIDEpOwotCi0JCWZvciAoaW50IGluZGV4ID0gZXZlbnQuZ2V0SW5kZXgoKSArIGV2ZW50LmdldEl0ZW1zU2l6ZSgpOyAtLWluZGV4ID49IGV2ZW50LmdldEluZGV4KCk7ICkgewotCQkJdGhpcy50YWJsZUl0ZW1Nb2RlbEFkYXB0ZXJzLnJlbW92ZShpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgdGFibGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCi0JCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IGxlbmd0aCAgICAgICAgPSBldmVudC5nZXRMZW5ndGgoKTsKLQkJaW50IHNvdXJjZUluZGV4ICAgPSBldmVudC5nZXRTb3VyY2VJbmRleCgpOwotCQlpbnQgdGFyZ2V0SW5kZXggICA9IGV2ZW50LmdldFRhcmdldEluZGV4KCk7Ci0JCWludCBsb3dTdGFydEluZGV4ID0gTWF0aC5taW4odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJaW50IGhpU3RhcnRJbmRleCAgPSBNYXRoLm1heCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCi0JCU9iamVjdFtdIGl0ZW1zID0gbmV3IE9iamVjdFtoaVN0YXJ0SW5kZXggLSBsb3dTdGFydEluZGV4ICsgbGVuZ3RoXTsKLQkJaW50IGl0ZW1zSW5kZXggPSBpdGVtcy5sZW5ndGg7Ci0KLQkJLy8gUmVtb3ZlIHRoZSBUYWJsZUl0ZW1zIHdyYXBwaW5nIHRoZSBtb3ZlZCBpdGVtcwotCQlmb3IgKGludCBpbmRleCA9IGhpU3RhcnRJbmRleCArIGxlbmd0aDsgLS1pbmRleCA+PSBsb3dTdGFydEluZGV4OyApIHsKLQotCQkJVGFibGVJdGVtTW9kZWxBZGFwdGVyIHRhYmxlSXRlbU1vZGVsID0gdGhpcy50YWJsZUl0ZW1Nb2RlbEFkYXB0ZXJzLmdldChpbmRleCk7Ci0JCQlpdGVtc1stLWl0ZW1zSW5kZXhdID0gdGFibGVJdGVtTW9kZWwudGFibGVJdGVtLmdldERhdGEoKTsKLQotCQkJLy8gUmVtb3ZlIHRoZSBUYWJsZUl0ZW0sIHdoaWNoIHdpbGwgYWxzbyBkaXNwb3NlIFRhYmxlSXRlbU1vZGVsQWRhcHRlcgotCQkJdGhpcy50YWJsZS5yZW1vdmUoaW5kZXgpOwotCQl9Ci0KLQkJLy8gTW92ZSB0aGUgaXRlbXMgc28gdGhleSBjYW4gcmV0cmlldmVkIGluIHRoZSByaWdodCBvcmRlciB3aGVuCi0JCS8vIHJlLWNyZWF0aW5nIHRoZSBUYWJsZUl0ZW1zCi0JCUFycmF5VG9vbHMubW92ZSgKLQkJCWl0ZW1zLAotCQkJdGFyZ2V0SW5kZXggLSBsb3dTdGFydEluZGV4LAotCQkJc291cmNlSW5kZXggLSBsb3dTdGFydEluZGV4LAotCQkJbGVuZ3RoCi0JCSk7Ci0KLQkJaXRlbXNJbmRleCA9IDA7Ci0KLQkJLy8gQWRkIFRhYmxlSXRlbXMgZm9yIHRoZSBtb3ZlZCBpdGVtcwotCQlmb3IgKGludCBpbmRleCA9IGxvd1N0YXJ0SW5kZXg7IGluZGV4IDw9IGhpU3RhcnRJbmRleCArIGxlbmd0aCAtIDE7IGluZGV4KyspIHsKLQotCQkJLy8gQ3JlYXRlIHRoZSBuZXcgVGFibGVJdGVtCi0JCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gbmV3IFRhYmxlSXRlbSh0aGlzLnRhYmxlLCBTV1QuTlVMTCwgaW5kZXgpOwotCQkJdGFibGVJdGVtLnNldERhdGEoaXRlbXNbaXRlbXNJbmRleCsrXSk7Ci0KLQkJCS8vIEFkYXB0IGl0IHdpdGggYSBtb2RlbCBhZGFwdGVyCi0JCQlUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIgYWRhcHRlciA9IHRoaXMuYnVpbGRJdGVtTW9kZWwodGFibGVJdGVtKTsKLQkJCXRoaXMudGFibGVJdGVtTW9kZWxBZGFwdGVycy5zZXQoaW5kZXgsIGFkYXB0ZXIpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIFRhYmxlSXRlbU1vZGVsQWRhcHRlciBidWlsZEl0ZW1Nb2RlbChUYWJsZUl0ZW0gdGFibGVJdGVtKSB7Ci0JCXJldHVybiBUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQl0YWJsZUl0ZW0sCi0JCQl0aGlzLmNvbHVtbkFkYXB0ZXIsCi0JCQl0aGlzLmxhYmVsUHJvdmlkZXIKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgdGFibGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCByb3dJbmRleCA9IGV2ZW50LmdldEluZGV4KCk7Ci0KLQkJZm9yIChFIGl0ZW0gOiB0aGlzLmdldE5ld0l0ZW1zKGV2ZW50KSkgewotCQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IHRoaXMudGFibGUuZ2V0SXRlbShyb3dJbmRleCk7Ci0JCQl0YWJsZUl0ZW0uc2V0RGF0YShpdGVtKTsKLQotCQkJVGFibGVJdGVtTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSB0aGlzLnRhYmxlSXRlbU1vZGVsQWRhcHRlcnMuZ2V0KHJvd0luZGV4KTsKLQotCQkJaW50IGNvbHVtbkNvdW50ID0gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbkNvdW50KCk7Ci0JCQlib29sZWFuIHJldmFsaWRhdGUgPSAoY29sdW1uQ291bnQgPT0gMSk7Ci0KLQkJCWZvciAoaW50IGNvbHVtbkluZGV4ID0gY29sdW1uQ291bnQ7IC0tY29sdW1uSW5kZXggPj0gMDsgKSB7Ci0JCQkJYWRhcHRlci50YWJsZUl0ZW1DaGFuZ2VkKGNvbHVtbkluZGV4LCB0YWJsZUl0ZW0uZ2V0RGF0YSgpLCByZXZhbGlkYXRlKTsKLQkJCX0KLQotCQkJcm93SW5kZXgrKzsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSB0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy50YWJsZS5yZW1vdmVBbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgdGFibGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnN5bmNocm9uaXplVGFibGVJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKExpc3RBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldE5ld0l0ZW1zKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0TmV3SXRlbXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2VsZWN0ZWQgaXRlbXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGludCBpbmRleE9mKEUgaXRlbSkgewotCQlpbnQgbGVuID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKHRoaXMubGlzdEhvbGRlci5nZXQoaSkgPT0gaXRlbSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZVRhYmxlU2VsZWN0aW9uKCkgewotCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFt0aGlzLnNlbGVjdGVkSXRlbXNIb2xkZXIuc2l6ZSgpXTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEUgc2VsZWN0ZWRJdGVtSG9sZGVyIDogdGhpcy5zZWxlY3RlZEl0ZW1zSG9sZGVyKSB7Ci0JCQlpbmRpY2VzW2krK10gPSB0aGlzLmluZGV4T2Yoc2VsZWN0ZWRJdGVtSG9sZGVyKTsKLQkJfQotCQl0aGlzLnRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JCXRoaXMudGFibGUuc2VsZWN0KGluZGljZXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGVkSXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy50YWJsZS5zZWxlY3QodGhpcy5nZXRJbmRpY2VzKGV2ZW50LmdldEl0ZW1zU2l6ZSgpLCB0aGlzLmdldEl0ZW1zKGV2ZW50KSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGVkSXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLnRhYmxlLmRlc2VsZWN0KHRoaXMuZ2V0SW5kaWNlcyhldmVudC5nZXRJdGVtc1NpemUoKSwgdGhpcy5nZXRJdGVtcyhldmVudCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50W10gZ2V0SW5kaWNlcyhpbnQgaXRlbXNTaXplLCBJdGVyYWJsZTxFPiBpdGVtcykgewotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFtpdGVtc1NpemVdOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoRSBpdGVtIDogaXRlbXMpIHsKLQkJCWluZGljZXNbaSsrXSA9IHRoaXMuaW5kZXhPZihpdGVtKTsKLQkJfQotCQlyZXR1cm4gaW5kaWNlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RlZEl0ZW1zQ2xlYXJlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy50YWJsZS5kZXNlbGVjdEFsbCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGVkSXRlbXNDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZVRhYmxlU2VsZWN0aW9uKCk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0SXRlbXMoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0SXRlbXMoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgYm94IGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZVNlbGVjdGlvbkNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlTZWxlY3Rpb25DaGFuZ2VFdmVudDxFPiBzY0V2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZUV2ZW50PEU+KHRoaXMsIHRoaXMuc2VsZWN0ZWRJdGVtcygpKTsKLQkJCWZvciAoU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgOiB0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCXNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQoc2NFdmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxFPiBzZWxlY3RlZEl0ZW1zKCkgewotCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotCQl9Ci0JCUFycmF5TGlzdDxFPiBzZWxlY3RlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFPih0aGlzLnRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQlmb3IgKGludCBzZWxlY3Rpb25JbmRleCA6IHRoaXMudGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKSB7Ci0JCQlzZWxlY3RlZEl0ZW1zLmFkZCh0aGlzLmxpc3RIb2xkZXIuZ2V0KHNlbGVjdGlvbkluZGV4KSk7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGVkSXRlbXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGFibGVEb3VibGVDbGlja2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodGhpcy5kb3VibGVDbGlja0xpc3RlbmVyTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkvLyB0aGVyZSBzaG91bGQgYmUgb25seSBhIHNpbmdsZSBpdGVtIHNlbGVjdGVkIGR1cmluZyBhIGRvdWJsZS1jbGljayg/KQotCQkJRSBzZWxlY3Rpb24gPSB0aGlzLmxpc3RIb2xkZXIuZ2V0KHRoaXMudGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQlEb3VibGVDbGlja0V2ZW50PEU+IGRjRXZlbnQgPSBuZXcgRG91YmxlQ2xpY2tFdmVudDxFPih0aGlzLCBzZWxlY3Rpb24pOwotCQkJZm9yIChEb3VibGVDbGlja0xpc3RlbmVyPEU+IGRvdWJsZUNsaWNrTGlzdGVuZXIgOiB0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJZG91YmxlQ2xpY2tMaXN0ZW5lci5kb3VibGVDbGljayhkY0V2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXNwb3NlICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHRhYmxlRGlzcG9zZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIERpc3Bvc2VFdmVudCBldmVudCkgewotCQkvLyB0aGUgdGFibGUgaXMgbm90IHlldCAiZGlzcG9zZWQiIHdoZW4gd2UgcmVjZWl2ZSB0aGlzIGV2ZW50Ci0JCS8vIHNvIHdlIGNhbiBzdGlsbCByZW1vdmUgb3VyIGxpc3RlbmVycwotCQl0aGlzLnRhYmxlLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLnRhYmxlRGlzcG9zZUxpc3RlbmVyKTsKLQkJdGhpcy50YWJsZS5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLnRhYmxlU2VsZWN0aW9uTGlzdGVuZXIpOwotCQl0aGlzLnNlbGVjdGVkSXRlbXNIb2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SG9sZGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZG91YmxlIGNsaWNrIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihEb3VibGVDbGlja0xpc3RlbmVyPEU+IGxpc3RlbmVyKSB7Ci0JCXRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb3VibGVDbGlja0xpc3RlbmVyKERvdWJsZUNsaWNrTGlzdGVuZXI8RT4gbGlzdGVuZXIpIHsKLQkJdGhpcy5kb3VibGVDbGlja0xpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBpbnRlcmZhY2UgRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPiBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCQl2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQ8RT4gZXZlbnQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRG91YmxlQ2xpY2tFdmVudDxFPiBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQkJcHJpdmF0ZSBmaW5hbCBFIHNlbGVjdGlvbjsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHJvdGVjdGVkIERvdWJsZUNsaWNrRXZlbnQoVGFibGVNb2RlbEFkYXB0ZXI8RT4gc291cmNlLCBFIHNlbGVjdGlvbikgewotCQkJc3VwZXIoc291cmNlKTsKLQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBUYWJsZU1vZGVsQWRhcHRlcjxFPiBnZXRTb3VyY2UoKSB7Ci0JCQlyZXR1cm4gKFRhYmxlTW9kZWxBZGFwdGVyPEU+KSBzdXBlci5nZXRTb3VyY2UoKTsKLQkJfQotCi0JCXB1YmxpYyBFIHNlbGVjdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLnNlbGVjdGlvbjsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlbGVjdGlvbiBzdXBwb3J0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+IGxpc3RlbmVyKSB7Ci0JCXRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gbGlzdGVuZXIpIHsKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+IGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0JCXZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VFdmVudDxFPiBldmVudCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTZWxlY3Rpb25DaGFuZ2VFdmVudDxFPiBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPEU+IHNlbGVjdGlvbjsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHJvdGVjdGVkIFNlbGVjdGlvbkNoYW5nZUV2ZW50KFRhYmxlTW9kZWxBZGFwdGVyPEU+IHNvdXJjZSwgQ29sbGVjdGlvbjxFPiBzZWxlY3Rpb24pIHsKLQkJCXN1cGVyKHNvdXJjZSk7Ci0JCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgVGFibGVNb2RlbEFkYXB0ZXI8RT4gZ2V0U291cmNlKCkgewotCQkJcmV0dXJuIChUYWJsZU1vZGVsQWRhcHRlcjxFPikgc3VwZXIuZ2V0U291cmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3I8RT4gc2VsZWN0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9UcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9UcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMGVlMWYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlRyaVN0YXRlQ2hlY2tCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIHRyaS1zdGF0ZSBjaGVjayBib3ggaW4gc3luY2ggd2l0aAotICogYSBtb2RlbCBCb29sZWFuIHdoZXJlIHRoZSB2YWx1ZSBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIgewotCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgYm9vbGVhbi4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgYnV0dG9uJ3Mgc2VsZWN0aW9uIHN0YXRlIHdpdGgKLQkgKiB0aGUgbW9kZWwgYm9vbGVhbi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBib29sZWFuQ2hhbmdlTGlzdGVuZXI7Ci0KLQkvKiogVGhlIGNoZWNrIGJveC90b2dnbGUgYnV0dG9uIHdlIHN5bmNocm9uaXplIHdpdGggdGhlIG1vZGVsIGJvb2xlYW4uICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyaVN0YXRlQ2hlY2tCb3ggYnV0dG9uOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgbW9kZWwgYm9vbGVhbiB3aXRoCi0JICogdGhlIGJ1dHRvbidzIHNlbGVjdGlvbiBzdGF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU2VsZWN0aW9uTGlzdGVuZXIgYnV0dG9uU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHN0dWZmIHdoZW4gdGhlIGJ1dHRvbgotCSAqIGlzIGRpc3Bvc2VkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBEaXNwb3NlTGlzdGVuZXIgYnV0dG9uRGlzcG9zZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgYm9vbGVhbiB0byB0aGUgc3BlY2lmaWVkIGJ1dHRvbi4KLQkgKiBJZiB0aGUgYm9vbGVhbiBpcyBudWxsLCB0aGUgYnV0dG9uJ3MgdmFsdWUgd2lsbCBiZSAicGFydGlhbGx5IGNoZWNrZWQiCi0JICogKGkuZS4gdGhlIGJ1dHRvbiB3aWxsIGJlIGNoZWNrZWQgYnV0IGdyYXllZCBvdXQpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlciBhZGFwdChNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsIFRyaVN0YXRlQ2hlY2tCb3ggYnV0dG9uKSB7Ci0JCXJldHVybiBuZXcgVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlcihib29sZWFuSG9sZGVyLCBidXR0b24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgYm9vbGVhbiBob2xkZXIgYW5kIGJ1dHRvbiBhcmUgcmVxdWlyZWQuCi0JICovCi0JcHJvdGVjdGVkIFRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLCBUcmlTdGF0ZUNoZWNrQm94IGJ1dHRvbikgewotCQlzdXBlcigpOwotCi0JCUFzc2VydC5pc05vdE51bGwoYm9vbGVhbkhvbGRlciwgIlRoZSBib29sZWFuIGhvbGRlciBjYW5ub3QgYmUgbnVsbCIpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGJ1dHRvbiwgIlRoZSBjaGVjayBib3ggY2Fubm90IGJlIG51bGwiKTsKLQotCQl0aGlzLmJvb2xlYW5Ib2xkZXIgPSBib29sZWFuSG9sZGVyOwotCQl0aGlzLmJ1dHRvbiA9IGJ1dHRvbjsKLQotCQl0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5ib29sZWFuSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5idXR0b25EaXNwb3NlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnV0dG9uRGlzcG9zZUxpc3RlbmVyKCk7Ci0JCXRoaXMuYnV0dG9uLmFkZERpc3Bvc2VMaXN0ZW5lcih0aGlzLmJ1dHRvbkRpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5idXR0b25TZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQl0aGlzLnNldEJ1dHRvblNlbGVjdGlvbih0aGlzLmJvb2xlYW5Ib2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyLnRoaXMuYm9vbGVhbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidHJpLXN0YXRlIGJvb2xlYW4gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci50aGlzLmJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyaS1zdGF0ZSBidXR0b24gc2VsZWN0aW9uIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGlzcG9zZUxpc3RlbmVyIGJ1aWxkQnV0dG9uRGlzcG9zZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCVRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIudGhpcy5idXR0b25EaXNwb3NlZChldmVudCk7Ci0JCQl9Ci0JCSAgICBAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmktc3RhdGUgYnV0dG9uIGRpc3Bvc2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgYnV0dG9uLgotCSAqIElmIHRoZSBuZXcgbW9kZWwgdmFsdWUgaXMgbnVsbCwgdXNlIHRoZSBhZGFwdGVyJ3MgZGVmYXVsdCB2YWx1ZQotCSAqICh3aGljaCBpcyB0eXBpY2FsbHkgZmFsc2UpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJvb2xlYW5DaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZXRCdXR0b25TZWxlY3Rpb24oKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEJ1dHRvblNlbGVjdGlvbihCb29sZWFuIHNlbGVjdGlvbikgewotCQlpZiAodGhpcy5idXR0b24uaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5idXR0b24uc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhlIGJ1dHRvbiBoYXMgYmVlbiAic2VsZWN0ZWQiIC0gc3luY2hyb25pemUgdGhlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmJ1dHRvbi5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUoYnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGlzcG9zZSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25EaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdGhlIGJ1dHRvbiBpcyBub3QgeWV0ICJkaXNwb3NlZCIgd2hlbiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQKLQkJLy8gc28gd2UgY2FuIHN0aWxsIHJlbW92ZSBvdXIgbGlzdGVuZXJzCi0JCXRoaXMuYnV0dG9uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIpOwotCQl0aGlzLmJ1dHRvbi5yZW1vdmVEaXNwb3NlTGlzdGVuZXIodGhpcy5idXR0b25EaXNwb3NlTGlzdGVuZXIpOwotCQl0aGlzLmJvb2xlYW5Ib2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmJvb2xlYW5Ib2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL0NvbnRyb2xBbGlnbmVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvQ29udHJvbEFsaWduZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiZDFlZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvQ29udHJvbEFsaWduZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSB0byBzZXQgYSBwcmVmZXJyZWQgd2lkdGggb24gdGhlIHJlZ2lzdGVyZWQgd2lkZ2V0cwotICogKGVpdGhlciA8Y29kZT5Db250cm9sPC9jb2RlPiBvciA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4pIGJhc2VkIG9uIHRoZQotICogd2lkZXN0IHdpZGdldC4KLSAqIDxwPgotICogSW1wb3J0YW50OiBUaGUgbGF5b3V0IGRhdGEgaGFzIHRvIGJlIGEgPGNvZGU+R3JpZERhdGE8L2NvZGU+LiBJZiBub25lIGlzIHNldCwKLSAqIHRoZW4gYSBuZXcgPGNvZGU+R3JpZERhdGE8L2NvZGU+IGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4KLSAqIDxwPgotICogSGVyZSBhbiBleGFtcGxlIG9mIHRoZSByZXN1bHQgaWYgdGhpcyBhbGlnbmVyIGlzIHVzZWQgdG8gYWxpZ24gY29udHJvbHMKLSAqIHdpdGhpbiBlaXRoZXIgb25lIG9yIHR3byBncm91cCBib3hlcywgdGhlIGNvbnRyb2xzIGFkZGVkIGFyZSB0aGUgbGFiZWxzIGluCi0gKiB0aGlzIGNhc2UuIEl0IGlzIGFsc28gcG9zc2libGUgdG8gYWxpZ24gY29udHJvbHMgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlCi0gKiBtYWluIGNvbXBvbmVudCwgYSBzcGFjZXIgY2FuIGJlIHVzZWQgZm9yIGV4dHJhIHNwYWNlLgotICogPHA+Ci0gKiBIZXJlJ3MgYW4gZXhhbXBsZToKLSAqIDxwcmU+Ci0gKiAtIEdyb3VwIEJveCAxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IE5hbWU6ICAgICAgICAgICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCcm93c2UuLi4gfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IFByZWFsbG9jYXRpb24gU2l6ZTogfCAgICAgfEl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICB8Ci0gKiB8IERlc2NyaXB0b3I6ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogLSBHcm91cCBCb3ggMiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgfAotICogfCBNYXBwaW5nIFR5cGU6ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFZ8ICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgfAotICogfCBDaGVjayBpbiBTY3JpcHQ6ICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250cm9sQWxpZ25lcgotewotCS8qKgotCSAqIEZsYWcgdXNlZCB0byBwcmV2ZW50IGEgdmFsaWRhdGlvbiBzbyBpdCBjYW4gYmUgZG9uZSBhZnRlciBhbiBvcGVyYXRpb24KLQkgKiBjb21wbGV0ZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGF1dG9WYWxpZGF0ZTsKLQotCS8qKgotCSAqIFRoZSB1dGlsaXR5IGNsYXNzIHVzZWQgdG8gc3VwcG9ydCBib3VuZCBwcm9wZXJ0aWVzLgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbjxMaXN0ZW5lcj4gY2hhbmdlU3VwcG9ydDsKLQotCS8qKgotCSAqIFRoZSBsaXN0ZW5lciBhZGRlZCB0byBlYWNoIG9mIHRoZSBjb250cm9scyB0aGF0IGxpc3RlbnMgb25seSB0byBhIHRleHQKLQkgKiBjaGFuZ2UuCi0JICovCi0JcHJpdmF0ZSBMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCS8qKgotCSAqIFByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbiB3aGVuIHJlY2FsY3VsYXRpbmcgdGhlIHByZWZlcnJlZCB3aWR0aC4KLQkgKiBUaGlzIGhhcHBlbnMgaW4gYW4gaGllcmFyY2h5IG9mIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPnMuIFRoZSBsb2NrCi0JICogaGFzIHRvIGJlIHBsYWNlZCBoZXJlIGFuZCBub3QgaW4gdGhlIHtAbGluayBDb250cm9sQWxpZ25lcldyYXBwZXJ9LgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBsb2NrZWQ7Ci0KLQkvKioKLQkgKiBUaGUgbGVuZ3RoIG9mIHRoZSB3aWRlc3QgY29udHJvbC4gSWYgdGhlIGxlbmd0aCB3YXMgbm90IGNhbGN1bGF0ZWQsIHRoZW4KLQkgKiB0aGlzIHZhbHVlIGlzIDAuCi0JICovCi0JcHJpdmF0ZSBpbnQgbWF4aW11bVdpZHRoOwotCi0JLyoqCi0JICogVGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFdyYXBwZXJ9cyBlbmNhcHN1bGF0aW5nIGVpdGhlciA8Y29kZT5Db250cm9sPC9jb2RlPnMKLQkgKiBvciB7QGxpbmsgQ29udHJvbEFsaWduZXJ9cy4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb248V3JhcHBlcj4gd3JhcHBlcnM7Ci0KLQkvKioKLQkgKiBBIG51bGwtPGNvZGU+UG9pbnQ8L2NvZGU+IG9iamVjdCB1c2VkIHRvIGNsZWFyIHRoZSBwcmVmZXJyZWQgc2l6ZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQb2ludCBERUZBVUxUX1NJWkUgPSBuZXcgUG9pbnQoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCS8qKgotCSAqIFRoZSB0eXBlcyBvZiBldmVudHMgdG8gbGlzdGVuIGluIG9yZGVyIHRvIHByb3Blcmx5IGFkanVzdCB0aGUgc2l6ZSBvZiBhbGwKLQkgKiB0aGUgd2lkZ2V0cy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBFVkVOVF9UWVBFUyA9IHsKLQkJU1dULkRpc3Bvc2UsCi0JCVNXVC5IaWRlLAotCQlTV1QuUmVzaXplLAotCQlTV1QuU2hvdwotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ29udHJvbEFsaWduZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250cm9scyBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5Db250cm9sPC9jb2RlPnMKLQkgKi8KLQlwdWJsaWMgQ29udHJvbEFsaWduZXIoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHMpIHsKLQkJdGhpcygpOwotCQlhZGRBbGxDb250cm9scyhjb250cm9scyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gY29udHJvbC4gSXRzIHdpZHRoIHdpbGwgYmUgdXNlZCBhbG9uZyB3aXRoIHRoZSB3aWR0aCBvZiBhbGwKLQkgKiB0aGUgb3RoZXIgcmVnaXN0ZXJlZCBjb250cm9scyBpbiBvcmRlciB0byBnZXQgdGhlIGdyZWF0ZXIgd2l0ZGggYW5kIHVzZQotCSAqIGl0IGFzIHRoZSB3aWR0aCBmb3IgYWxsIHRoZSBjb250cm9scy4KLQkgKgotCSAqIEBwYXJhbSBjb250cm9sIFRoZSA8Y29kZT5Db250cm9sPC9jb2RlPiB0byBiZSBhZGRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChDb250cm9sIGNvbnRyb2wpIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRyb2wsICJDYW4ndCBhZGQgbnVsbCB0byB0aGlzIENvbnRyb2xBbGlnbmVyIik7Ci0KLQkJV3JhcHBlciB3cmFwcGVyID0gYnVpbGRXcmFwcGVyKGNvbnRyb2wpOwotCQl3cmFwcGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJd3JhcHBlcnMuYWRkKHdyYXBwZXIpOwotCi0JCXJldmFsaWRhdGUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGNvbnRyb2wuIEl0cyB3aWR0aCB3aWxsIGJlIHVzZWQgYWxvbmcgd2l0aCB0aGUgd2lkdGggb2YgYWxsCi0JICogdGhlIG90aGVyIHJlZ2lzdGVyZWQgY29udHJvbHMgaW4gb3JkZXIgdG8gZ2V0IHRoZSBncmVhdGVyIHdpdGRoIGFuZCB1c2UKLQkgKiBpdCBhcyB0aGUgd2lkdGggZm9yIGFsbCB0aGUgY29udHJvbHMuCi0JICoKLQkgKiBAcGFyYW0gY29udHJvbEFsaWduZXIgVGhlIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiB0byBiZSBhZGRlZAotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIENhbid0IGFkZCB0aGUgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+Ci0JICogdG8gaXRzZWxmCi0JICovCi0JcHVibGljIHZvaWQgYWRkKENvbnRyb2xBbGlnbmVyIGNvbnRyb2xBbGlnbmVyKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChjb250cm9sQWxpZ25lciwgIkNhbid0IGFkZCBudWxsIHRvIHRoaXMgQ29udHJvbEFsaWduZXIiKTsKLQkJQXNzZXJ0LmlzTGVnYWwoY29udHJvbEFsaWduZXIgIT0gdGhpcywgIkNhbid0IGFkZCB0aGUgQ29udHJvbEFsaWduZXIgdG8gaXRzZWxmIik7Ci0KLQkJV3JhcHBlciB3cmFwcGVyID0gYnVpbGRXcmFwcGVyKGNvbnRyb2xBbGlnbmVyKTsKLQkJd3JhcHBlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXdyYXBwZXJzLmFkZCh3cmFwcGVyKTsKLQotCQlpZiAoIWNvbnRyb2xBbGlnbmVyLndyYXBwZXJzLmlzRW1wdHkoKSkgewotCQkJcmV2YWxpZGF0ZShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBpdGVtcyBjb250YWluZWQgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24gaW50byB0aGlzCi0JICogPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+LiBUaGUgcHJlZmVycmVkIHdpZHRoIG9mIGVhY2ggaXRlbSB3aWxsIGJlCi0JICogdXNlZCBhbG9uZyB3aXRoIHRoZSB3aWR0aCBvZiBhbGwgdGhlIG90aGVyIGl0ZW1zIGluIG9yZGVyIHRvIGdldCB0aGUKLQkgKiB3aWRlc3QgY29udHJvbCBhbmQgdXNlIGl0cyB3aWR0aCBhcyB0aGUgd2lkdGggZm9yIGFsbCB0aGUgY29udHJvbHMuCi0JICoKLQkgKiBAcGFyYW0gYWxpZ25lcnMgVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+cwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFsbENvbnRyb2xBbGlnbmVycyhDb2xsZWN0aW9uPENvbnRyb2xBbGlnbmVyPiBhbGlnbmVycykgewotCi0JCS8vIERlYWN0aXZhdGUgdGhlIGF1dG8gdmFsaWRhdGlvbiB3aGlsZSBhZGRpbmcgYWxsIHRoZSBDb250cm9scyBhbmQvb3IKLQkJLy8gQ29udHJvbEFsaWduZXJzIGluIG9yZGVyIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UKLQkJYm9vbGVhbiBvbGRBdXRvVmFsaWRhdGUgPSBhdXRvVmFsaWRhdGU7Ci0JCWF1dG9WYWxpZGF0ZSA9IGZhbHNlOwotCi0JCWZvciAoQ29udHJvbEFsaWduZXIgYWxpZ25lciA6IGFsaWduZXJzKSB7Ci0JCQlhZGQoYWxpZ25lcik7Ci0JCX0KLQotCQlhdXRvVmFsaWRhdGUgPSBvbGRBdXRvVmFsaWRhdGU7Ci0JCXJldmFsaWRhdGUoZmFsc2UpOwotCX0KLQotICAgLyoqCi0JICogQWRkcyB0aGUgaXRlbXMgY29udGFpbmVkIGluIHRoZSBnaXZlbiBjb2xsZWN0aW9uIGludG8gdGhpcwotCSAqIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPi4gVGhlIHByZWZlcnJlZCB3aWR0aCBvZiBlYWNoIGl0ZW0gd2lsbCBiZQotCSAqIHVzZWQgYWxvbmcgd2l0aCB0aGUgd2lkdGggb2YgYWxsIHRoZSBvdGhlciBpdGVtcyBpbiBvcmRlciB0byBnZXQgdGhlCi0JICogd2lkZXN0IGNvbnRyb2wgYW5kIHVzZSBpdHMgd2lkdGggYXMgdGhlIHdpZHRoIGZvciBhbGwgdGhlIGNvbnRyb2xzLgotCSAqCi0JICogQHBhcmFtIGNvbnRyb2xzIFRoZSBjb2xsZWN0aW9uIG9mIDxjb2RlPkNvbnRyb2w8L2NvZGU+cwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFsbENvbnRyb2xzKENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzKSB7Ci0KLQkJLy8gRGVhY3RpdmF0ZSB0aGUgYXV0byB2YWxpZGF0aW9uIHdoaWxlIGFkZGluZyBhbGwgdGhlIENvbnRyb2xzIGFuZC9vcgotCQkvLyBDb250cm9sQWxpZ25lcnMgaW4gb3JkZXIgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZQotCQlib29sZWFuIG9sZEF1dG9WYWxpZGF0ZSA9IGF1dG9WYWxpZGF0ZTsKLQkJYXV0b1ZhbGlkYXRlID0gZmFsc2U7Ci0KLQkJZm9yIChDb250cm9sIGNvbnRyb2wgOiBjb250cm9scykgewotCQkJYWRkKGNvbnRyb2wpOwotCQl9Ci0KLQkJYXV0b1ZhbGlkYXRlID0gb2xkQXV0b1ZhbGlkYXRlOwotCQlyZXZhbGlkYXRlKGZhbHNlKTsKLQl9Ci0KLSAgIC8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIDxjb2RlPkNvbnRyb0xpc3RlbmVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgPGNvZGU+TGlzdGVuZXI8L2NvZGU+IHRvIGJlIGFkZGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJaWYgKGNoYW5nZVN1cHBvcnQgPT0gbnVsbCkgewotCQkgICAgY2hhbmdlU3VwcG9ydCA9IG5ldyBBcnJheUxpc3Q8TGlzdGVuZXI+KCk7Ci0JCX0KLQotCQljaGFuZ2VTdXBwb3J0LmFkZChsaXN0ZW5lcik7Ci0gICB9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPldyYXBwZXI8L2NvZGU+IHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBnaXZlbiBzb3VyY2UuCi0JICoKLQkgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCB0byBiZSB3cmFwcGVkCi0JICogQHJldHVybiBBIG5ldyB7QGxpbmsgV3JhcHBlcn0KLQkgKi8KLQlwcml2YXRlIFdyYXBwZXIgYnVpbGRXcmFwcGVyKENvbnRyb2wgY29udHJvbCkgewotCQlyZXR1cm4gbmV3IENvbnRyb2xXcmFwcGVyKGNvbnRyb2wpOwotCX0KLQotICAgLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5XcmFwcGVyPC9jb2RlPiB0aGF0IGVuY2Fwc3VsYXRlcyB0aGUgZ2l2ZW4gc291cmNlLgotCSAqCi0JICogQHBhcmFtIENvbnRyb2xBbGlnbmVyIFRoZSA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4gdG8gYmUgd3JhcHBlZAotCSAqIEByZXR1cm4gQSBuZXcge0BsaW5rIENvbnRyb2xBbGlnbmVyV3JhcHBlcn0KLQkgKi8KLQlwcml2YXRlIFdyYXBwZXIgYnVpbGRXcmFwcGVyKENvbnRyb2xBbGlnbmVyIENvbnRyb2xBbGlnbmVyKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbEFsaWduZXJXcmFwcGVyKENvbnRyb2xBbGlnbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIHRoZSB3aWR0aCB0YWtlbiBieSB0aGUgd2lkZ2V0cyBhbmQgcmV0dXJucyB0aGUgbWF4aW11bSB3aWR0aC4KLQkgKgotCSAqIEBwYXJhbSByZWNhbGN1bGF0ZVNpemUgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gcmVjYWxjdWxhdGUgdGhlIHByZWZlcnJlZCBzaXplCi0JICogb2YgYWxsIHRoZSB3cmFwcGVycyBjb250YWluZWQgd2l0aGluIHRoZW0gcmF0aGVyIHRoYW4gdXNpbmcgdGhlIGNhY2hlZAotCSAqIHNpemU7IDxjb2RlPmZhbHNlPC9jb2RlPiB0byB1c2UgdGhlIGNhY2hlZCBzaXplCi0JICovCi0JcHJpdmF0ZSBpbnQgY2FsY3VsYXRlV2lkdGgoYm9vbGVhbiByZWNhbGN1bGF0ZVNpemUpIHsKLQotCQlpbnQgd2lkdGggPSAwOwotCi0JCWZvciAoV3JhcHBlciB3cmFwcGVyIDogd3JhcHBlcnMpIHsKLQkJCVBvaW50IHNpemUgPSB3cmFwcGVyLmNhY2hlZFNpemUoKTsKLQotCQkJLy8gVGhlIHNpemUgaGFzIG5vdCBiZWVuIGNhbGN1bGF0ZWQgeWV0Ci0JCQlpZiAocmVjYWxjdWxhdGVTaXplIHx8IChzaXplLnggPT0gMCkpIHsKLQkJCQlzaXplID0gd3JhcHBlci5jYWxjdWxhdGVTaXplKCk7Ci0JCQl9Ci0KLQkJCS8vIE9ubHkga2VlcCB0aGUgZ3JlYXRlc3Qgd2lkdGgKLQkJCXdpZHRoID0gTWF0aC5tYXgoc2l6ZS54LCB3aWR0aCk7Ci0JCX0KLQotCQlyZXR1cm4gd2lkdGg7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0cyBhIGJvdW5kIHByb3BlcnR5IGNoYW5nZS4KLQkgKgotCSAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgb2xkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSAoYXMgYW4gaW50KQotCSAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSAoYXMgYW4gaW50KQotCSAqLwotCXByaXZhdGUgdm9pZCBjb250cm9sUmVzaXplZChpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotCi0JCWlmICgoY2hhbmdlU3VwcG9ydCAhPSBudWxsKSAmJiAob2xkVmFsdWUgIT0gbmV3VmFsdWUpKSB7Ci0JCQlFdmVudCBldmVudCAgPSBuZXcgRXZlbnQoKTsKLQkJCWV2ZW50LndpZGdldCA9IFNXVFV0aWwuZ2V0U2hlbGwoKTsKLQkJCWV2ZW50LmRhdGEgICA9IHRoaXM7Ci0KLQkJCWZvciAoTGlzdGVuZXIgbGlzdGVuZXIgOiBjaGFuZ2VTdXBwb3J0KSB7Ci0JCQkJbGlzdGVuZXIuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhpcyA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4sIHRoaXMgY2FuIGltcHJvdmUgdGhlIHNwZWVkIG9mCi0JICogZGlzcG9zaW5nIGEgcGFuZS4gV2hlbiBhIHBhbmUgaXMgZGlzcG9zZWQsIHRoaXMgYWxpZ25lciBkb2Vzbid0IG5lZWQgdG8KLQkgKiByZXZhbGlkYXRlIGl0cyBzaXplIHVwb24gZGlzcG9zZSBvZiBpdHMgd2lkZ2V0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCi0JCWZvciAoSXRlcmF0b3I8V3JhcHBlcj4gaXRlciA9IHdyYXBwZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCVdyYXBwZXIgd3JhcHBlciA9IGl0ZXIubmV4dCgpOwotCQkJd3JhcHBlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQlpdGVyLnJlbW92ZSgpOwotCQl9Ci0KLQkJdGhpcy53cmFwcGVycy5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgd2lkZXN0IGNvbnRyb2wuIElmIHRoZSBsZW5ndGggd2FzIG5vdAotCSAqIGNhbGN1bGF0ZWQsIHRoZW4gdGhpcyB2YWx1ZSBpcyAwLgotCSAqCi0JICogQHJldHVybiBUaGUgd2lkdGggb2YgdGhlIHdpZGVzdCBjb250cm9sIG9yIDAgaWYgdGhlIGxlbmd0aCBoYXMgbm90IGJlZW4KLQkgKiBjYWxjdWxhdGVkIHlldAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4aW11bVdpZHRoKCkgewotCQlyZXR1cm4gbWF4aW11bVdpZHRoOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCi0JCXRoaXMuYXV0b1ZhbGlkYXRlID0gdHJ1ZTsKLQkJdGhpcy5tYXhpbXVtV2lkdGggPSAwOwotCQl0aGlzLmxpc3RlbmVyICAgICA9IG5ldyBMaXN0ZW5lckhhbmRsZXIoKTsKLQkJdGhpcy53cmFwcGVycyAgICAgPSBuZXcgQXJyYXlMaXN0PFdyYXBwZXI+KCk7Ci0JfQotCi0JLyoqCi0JICogSW52YWxpZGF0ZXMgdGhlIHNpemUgb2YgdGhlIGdpdmVuIG9iamVjdC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgdG8gYmUgaW52YWxpZGF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW52YWxpZGF0ZShPYmplY3Qgc291cmNlKSB7Ci0KLQkJV3JhcHBlciB3cmFwcGVyID0gcmV0cmlldmVXcmFwcGVyKHNvdXJjZSk7Ci0KLQkJaWYgKCF3cmFwcGVyLmxvY2tlZCgpKSB7Ci0JCQlQb2ludCBzaXplID0gd3JhcHBlci5jYWNoZWRTaXplKCk7Ci0JCQlzaXplLnggPSBzaXplLnkgPSAwOwotCQkJd3JhcHBlci5zZXRTaXplKERFRkFVTFRfU0laRSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBtYXhpbXVtIGxlbmd0aCBiYXNlZCBvbiB0aGUgd2lkZXN0IGNvbnRyb2wuIFRoaXMgbWV0aG9kcwotCSAqIGRvZXMgbm90IHVwZGF0ZSB0aGUgd2lkdGggb2YgdGhlIGNvbnRyb2xzLgotCSAqCi0JICogQHBhcmFtIHJlY2FsY3VsYXRlU2l6ZSA8Y29kZT50cnVlPC9jb2RlPiB0byByZWNhbGN1bGF0ZSB0aGUgcHJlZmVycmVkIHNpemUKLQkgKiBvZiBhbGwgdGhlIHdyYXBwZXJzIGNvbnRhaW5lZCB3aXRoaW4gdGhlbSByYXRoZXIgdGhhbiB1c2luZyB0aGUgY2FjaGVkCi0JICogc2l6ZTsgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHVzZSB0aGUgY2FjaGVkIHNpemUKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVjYWxjdWxhdGVXaWR0aChib29sZWFuIHJlY2FsY3VsYXRlU2l6ZSkgewotCi0JCWludCB3aWR0aCA9IGNhbGN1bGF0ZVdpZHRoKHJlY2FsY3VsYXRlU2l6ZSk7Ci0KLQkJdHJ5IHsKLQkJCWxvY2tlZCA9IHRydWU7Ci0JCQlzZXRNYXhpbXVtV2lkdGgod2lkdGgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbG9ja2VkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBjb250cm9sLiBJdHMgcHJlZmVycmVkIHdpZHRoIHdpbGwgbm90IGJlIHVzZWQgd2hlbgotCSAqIGNhbGN1bGF0aW5nIHRoZSBwcmVmZXJyZWQgd2lkdGguCi0JICoKLQkgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCB0byBiZSByZW1vdmVkCi0JICogQGV4Y2VwdGlvbiBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gSWYgdGhlIGdpdmVuIDxjb2RlPkNvbnRyb2w8L2NvZGU+IGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoQ29udHJvbCBjb250cm9sKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChjb250cm9sLCAiVGhlIENvbnRyb2wgdG8gcmVtb3ZlIGNhbm5vdCBiZSBudWxsIik7Ci0KLQkJV3JhcHBlciB3cmFwcGVyID0gcmV0cmlldmVXcmFwcGVyKGNvbnRyb2wpOwotCQl3cmFwcGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJd3JhcHBlcnMucmVtb3ZlKHdyYXBwZXIpOwotCi0JCXJldmFsaWRhdGUodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+LiBJdHMgcHJlZmVycmVkIHdpZHRoCi0JICogd2lsbCBub3QgYmUgdXNlZCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBwcmVmZXJyZWQgd2l0ZGguCi0JICoKLQkgKiBAcGFyYW0gY29udHJvbEFsaWduZXIgVGhlIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiB0byBiZSByZW1vdmVkCi0JICogQGV4Y2VwdGlvbiBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gSWYgdGhlIGdpdmVuIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPgotCSAqIGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKENvbnRyb2xBbGlnbmVyIGNvbnRyb2xBbGlnbmVyKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChjb250cm9sQWxpZ25lciwgIlRoZSBDb250cm9sQWxpZ25lciB0byByZW1vdmUgY2Fubm90IGJlIG51bGwiKTsKLQotCQlXcmFwcGVyIHdyYXBwZXIgPSByZXRyaWV2ZVdyYXBwZXIoY29udHJvbEFsaWduZXIpOwotCQl3cmFwcGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJd3JhcHBlcnMucmVtb3ZlKHdyYXBwZXIpOwotCi0JCXJldmFsaWRhdGUodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gPGNvZGU+TGlzdGVuZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIFRoZSA8Y29kZT5MaXN0ZW5lcjwvY29kZT4gdG8gYmUgcmVtb3ZlZAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCi0JCWNoYW5nZVN1cHBvcnQucmVtb3ZlKGxpc3RlbmVyKTsKLQotCQlpZiAoY2hhbmdlU3VwcG9ydC5pc0VtcHR5KCkpIHsKLQkJCWNoYW5nZVN1cHBvcnQgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSA8Y29kZT5XcmFwcGVyPC9jb2RlPiB0aGF0IGlzIGVuY2Fwc3VsYXRpbmcgdGhlIGdpdmVuIG9iamVjdC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgRWl0aGVyIGEgPGNvZGU+Q29udHJvbDwvY29kZT4gb3IgYSA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4KLQkgKiBAcmV0dXJuIEl0cyA8Y29kZT5XcmFwcGVyPC9jb2RlPgotCSAqLwotCXByaXZhdGUgV3JhcHBlciByZXRyaWV2ZVdyYXBwZXIoT2JqZWN0IHNvdXJjZSkgewotCi0JCWZvciAoV3JhcHBlciB3cmFwcGVyIDogd3JhcHBlcnMpIHsKLQkJCWlmICh3cmFwcGVyLnNvdXJjZSgpID09IHNvdXJjZSkgewotCQkJCXJldHVybiB3cmFwcGVyOwotCQkJfQotCQl9Ci0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgcmV0cmlldmUgdGhlIFdyYXBwZXIgZm9yICIgKyBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBjb3VudCBvZiBjb250cm9sIGlzIGdyZWF0ZXIgdGhhbiBvbmUgYW5kIHtAbGluayAjaXNBdXRvVmFsaWRhdGUoKX0KLQkgKiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCB0aGVuIHRoZSBzaXplIG9mIGFsbCB0aGUgcmVnaXN0ZXJlZAotCSAqIDxjb2RlPkNvbnRyb2w8L2NvZGU+cyB3aWxsIGJlIHVkcGF0ZWQuCi0JICoKLQkgKiBAcGFyYW0gcmVjYWxjdWxhdGVTaXplIDxjb2RlPnRydWU8L2NvZGU+IHRvIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZQotCSAqIG9mIGFsbCB0aGUgd3JhcHBlcnMgY29udGFpbmVkIHdpdGhpbiB0aGVtIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBjYWNoZWQKLQkgKiBzaXplOyA8Y29kZT5mYWxzZTwvY29kZT4gdG8gdXNlIHRoZSBjYWNoZWQgc2l6ZQotCSAqLwotCXByaXZhdGUgdm9pZCByZXZhbGlkYXRlKGJvb2xlYW4gcmVjYWxjdWxhdGVTaXplKSB7Ci0KLQkJaWYgKGF1dG9WYWxpZGF0ZSkgewotCQkJcmVjYWxjdWxhdGVXaWR0aChyZWNhbGN1bGF0ZVNpemUpOwotCQkJdXBkYXRlV3JhcHBlclNpemUocmVjYWxjdWxhdGVTaXplKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJhc2VzIG9uIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIGdpdmVuIDxjb2RlPkV2ZW50PC9jb2RlPiwKLQkgKiByZXNpemUgdGhlIGNvbnRyb2xzLgotCSAqCi0JICogQHBhcmFtIGV2ZW50IFRoZSA8Y29kZT5FdmVudDwvY29kZT4gc2VudCBieSB0aGUgVUkgdGhyZWFkIHdoZW4gdGhlIHN0YXRlCi0JICogb2YgYSB3aWRnZXQgY2hhbmdlZAotCSAqLwotCXByaXZhdGUgdm9pZCByZXZhbGlkYXRlKEV2ZW50IGV2ZW50KSB7Ci0KLQkJLy8gV2UgZG9uJ3QgbmVlZCB0byByZXZhbGlkYXRlIGR1cmluZyBhIHJldmFsaWRhdGlvbiBwcm9jZXNzCi0JCWlmIChsb2NrZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCU9iamVjdCBzb3VyY2U7Ci0KLQkJaWYgKGV2ZW50LndpZGdldCAhPSBTV1RVdGlsLmdldFNoZWxsKCkpIHsKLQkJCXNvdXJjZSA9IGV2ZW50LndpZGdldDsKLQkJCUNvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBzb3VyY2U7Ci0KLQkJCS8vIFdoZW4gYSBkaWFsb2cgaXMgb3BlbmVkLCB3ZSBuZWVkIHRvIGFjdHVhbGx5IGZvcmNlIGEgbGF5b3V0IG9mCi0JCQkvLyB0aGUgY29udHJvbHMsIHRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgY29udHJvbCBpcyBhY3R1YWxseQotCQkJLy8gbm90IHZpc2libGUgd2hlbiB0aGUgcHJlZmVycmVkIHdpZHRoIGlzIGNhY3VsYXRlZAotCQkJaWYgKGNvbnRyb2wgPT0gY29udHJvbC5nZXRTaGVsbCgpKSB7Ci0JCQkJaWYgKGV2ZW50LnR5cGUgPT0gU1dULkRpc3Bvc2UpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCXNvdXJjZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzb3VyY2UgPSBldmVudC5kYXRhOwotCQl9Ci0KLQkJLy8gRWl0aGVyIHJlbW92ZSB0aGUgQ29udHJvbFdyYXBwZXIgaWYgdGhlIHdpZGdldCB3YXMgZGlzcG9zZWQgb3IKLQkJLy8gaW52YWxpZGF0ZSB0aGUgd2lkZ2V0IGluIG9yZGVyIHRvIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZQotCQlpZiAoc291cmNlICE9IG51bGwpIHsKLQkJCWlmIChldmVudC50eXBlID09IFNXVC5EaXNwb3NlKSB7Ci0JCQkJV3JhcHBlciB3cmFwcGVyID0gcmV0cmlldmVXcmFwcGVyKHNvdXJjZSk7Ci0JCQkJd3JhcHBlcnMucmVtb3ZlKHdyYXBwZXIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW52YWxpZGF0ZShzb3VyY2UpOwotCQkJfQotCQl9Ci0KLQkJLy8gTm93IHJldmFsaWRhdGUgYWxsIHRoZSBDb250cm9scyBhbmQgQ29udHJvbEFsaWduZXJzCi0JCXJldmFsaWRhdGUodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSB3aWRlc3QgY29udHJvbC4gSWYgdGhlIGxlbmd0aCB3YXMgbm90IGNhbHVsY2F0ZWQsCi0JICogdGhlbiB0aGlzIHZhbHVlIGlzIDAuCi0JICoKLQkgKiBAcGFyYW0gbWF4aW11bVdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgd2lkZXN0IGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0TWF4aW11bVdpZHRoKGludCBtYXhpbXVtV2lkdGgpIHsKLQotCQlpbnQgb2xkTWF4aW11bVdpZHRoID0gdGhpcy5tYXhpbXVtV2lkdGg7Ci0JCXRoaXMubWF4aW11bVdpZHRoID0gbWF4aW11bVdpZHRoOwotCQljb250cm9sUmVzaXplZChvbGRNYXhpbXVtV2lkdGgsIG1heGltdW1XaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gSW5mb3JtYXRpb24gYWJvdXQgdGhpcyBvYmplY3QKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKCJtYXhpbXVtV2lkdGg9Iik7Ci0JCXNiLmFwcGVuZChtYXhpbXVtV2lkdGgpOwotCQlzYi5hcHBlbmQoIiwgd3JhcHBlcnM9Iik7Ci0JCXNiLmFwcGVuZCh3cmFwcGVycyk7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzaXplIG9mIGV2ZXJ5IDxjb2RlPldyYXBwZXI8L2NvZGU+IGJhc2VkIG9uIHRoZSBtYXhpbXVtIHdpZHRoLgotCSAqCi0JICogQHBhcmFtIGZvcmNlUmV2YWxpZGF0ZSA8Y29kZT50cnVlPC9jb2RlPiB0byByZXZhbGlkYXRlIHRoZSB3cmFwcGVyJ3Mgc2l6ZQotCSAqIGV2ZW4gdGhvdWdoIGl0cyBjdXJyZW50IHNpemUgbWlnaHQgYmUgdGhlIHNhbWUgYXMgdGhlIG1heGltdW0gd2lkdGg7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG9ubHkgcmV2YWxpZGF0ZSB0aGUgd3JhcHBlcnMgd2l0aCBhIGRpZmZlcmVudCB3aWR0aAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVXcmFwcGVyU2l6ZShib29sZWFuIGZvcmNlUmV2YWxpZGF0ZSkgewotCi0JCWZvciAoV3JhcHBlciB3cmFwcGVyIDogd3JhcHBlcnMpIHsKLQkJCVBvaW50IGNhY2hlZFNpemUgPSB3cmFwcGVyLmNhY2hlZFNpemUoKTsKLQotCQkJLy8gTm8gbmVlZCB0byBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIHdyYXBwZXIgc2luY2UgaXQncyBhbHdheXMgdXNpbmcKLQkJCS8vIHRoZSBtYXhpbXVtIHdpZHRoCi0JCQlpZiAoZm9yY2VSZXZhbGlkYXRlIHx8IChjYWNoZWRTaXplLnggIT0gbWF4aW11bVdpZHRoKSkgewotCQkJCVBvaW50IHNpemUgPSBuZXcgUG9pbnQobWF4aW11bVdpZHRoLCBjYWNoZWRTaXplLnkpOwotCQkJCXdyYXBwZXIuc2V0U2l6ZShzaXplKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgPGNvZGU+V3JhcHBlcjwvY29kZT4gZW5jYXBzdWxhdGVzIGEge0BsaW5rIENvbnRyb2xBbGlnbmVyfS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIENvbnRyb2xBbGlnbmVyV3JhcHBlciBpbXBsZW1lbnRzIFdyYXBwZXIgewotCQkvKioKLQkJICogVGhlIGNhY2hlZCBzaXplLCB3aGljaCBpcyB7QGxpbmsgQ29udHJvbEFsaWduZXIjbWF4aW11bVdpZHRofS4KLQkJICovCi0JCXByaXZhdGUgZmluYWwgUG9pbnQgY2FjaGVkU2l6ZTsKLQotCQkvKioKLQkJICogVGhlIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiBlbmNhcHN1bGF0ZWQgYnkgdGhpcwotCQkgKiA8Y29kZT5XcmFwcGVyPC9jb2RlPi4KLQkJICovCi0JCXByaXZhdGUgZmluYWwgQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXI7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udHJvbEFsaWduZXJXcmFwcGVyPC9jb2RlPiB0aGF0IGVuY2Fwc3VsYXRlcwotCQkgKiB0aGUgZ2l2ZW4gPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+LgotCQkgKgotCQkgKiBAcGFyYW0gY29udHJvbEFsaWduZXIgVGhlIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiB0byBiZQotCQkgKiBlbmNhcHN1bGF0ZWQgYnkgdGhpcyA8Y29kZT5XcmFwcGVyPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBDb250cm9sQWxpZ25lcldyYXBwZXIoQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvbnRyb2xBbGlnbmVyID0gY29udHJvbEFsaWduZXI7Ci0JCQl0aGlzLmNhY2hlZFNpemUgICAgID0gbmV3IFBvaW50KGNvbnRyb2xBbGlnbmVyLm1heGltdW1XaWR0aCwgMCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJY29udHJvbEFsaWduZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIFBvaW50IGNhY2hlZFNpemUoKSB7Ci0JCQljYWNoZWRTaXplLnggPSBjb250cm9sQWxpZ25lci5tYXhpbXVtV2lkdGg7Ci0JCQlyZXR1cm4gY2FjaGVkU2l6ZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBQb2ludCBjYWxjdWxhdGVTaXplKCkgewotCi0JCQlQb2ludCBzaXplID0gbmV3IFBvaW50KGNvbnRyb2xBbGlnbmVyLmNhbGN1bGF0ZVdpZHRoKGZhbHNlKSwgMCk7Ci0KLQkJCWlmIChzaXplLnggIT0gU1dULkRFRkFVTFQpIHsKLQkJCQljYWNoZWRTaXplLnggPSBzaXplLng7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljYWNoZWRTaXplLnggPSAwOwotCQkJfQotCi0JCQlpZiAoc2l6ZS55ICE9IFNXVC5ERUZBVUxUKSB7Ci0JCQkJY2FjaGVkU2l6ZS55ID0gc2l6ZS55OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY2FjaGVkU2l6ZS55ID0gMDsKLQkJCX0KLQotCQkJcmV0dXJuIHNpemU7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBsb2NrZWQoKSB7Ci0JCQlyZXR1cm4gY29udHJvbEFsaWduZXIubG9ja2VkOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCWNvbnRyb2xBbGlnbmVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFNpemUoUG9pbnQgc2l6ZSkgewotCi0JCQlpZiAoc2l6ZSA9PSBERUZBVUxUX1NJWkUpIHsKLQkJCQljb250cm9sQWxpZ25lci5tYXhpbXVtV2lkdGggPSAwOwotCQkJfQotCQkJZWxzZSBpZiAoY29udHJvbEFsaWduZXIubWF4aW11bVdpZHRoICE9IHNpemUueCkgewotCQkJCWNvbnRyb2xBbGlnbmVyLm1heGltdW1XaWR0aCA9IHNpemUueDsKLQkJCQljb250cm9sQWxpZ25lci51cGRhdGVXcmFwcGVyU2l6ZSh0cnVlKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBPYmplY3Qgc291cmNlKCkgewotCQkJcmV0dXJuIGNvbnRyb2xBbGlnbmVyOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0KLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXNiLmFwcGVuZCgiQ2FjaGVkIHNpemU9Iik7Ci0JCQlzYi5hcHBlbmQoY2FjaGVkU2l6ZSk7Ci0JCQlzYi5hcHBlbmQoIiwgQ29udHJvbEFsaWduZXI9Iik7Ci0JCQlzYi5hcHBlbmQoY29udHJvbEFsaWduZXIpOwotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyA8Y29kZT5XcmFwcGVyPC9jb2RlPiBlbmNhcHN1bGF0ZXMgYSB7QGxpbmsgQ29udHJvbH0uCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBDb250cm9sV3JhcHBlciBpbXBsZW1lbnRzIFdyYXBwZXIgewotCQkvKioKLQkJICogVGhlIGNhY2hlZCBzaXplLCB3aGljaCBpcyBjb250cm9sJ3Mgc2l6ZS4KLQkJICovCi0JCXByaXZhdGUgUG9pbnQgY2FjaGVkU2l6ZTsKLQotCQkvKioKLQkJICogVGhlIGNvbnRyb2wgdG8gYmUgZW5jYXBzdWxhdGVkIGJ5IHRoaXMgPGNvZGU+V3JhcHBlcjwvY29kZT4uCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIENvbnRyb2wgY29udHJvbDsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5jb250cm9sV3JhcHBlcjwvY29kZT4gdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIGdpdmVuCi0JCSAqIGNvbnRyb2wuCi0JCSAqCi0JCSAqIEBwYXJhbSBjb250cm9sIFRoZSBjb250cm9sIHRvIGJlIGVuY2Fwc3VsYXRlZCBieSB0aGlzIDxjb2RlPldyYXBwZXI8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIENvbnRyb2xXcmFwcGVyKENvbnRyb2wgY29udHJvbCkgewotCQkJc3VwZXIoKTsKLQotCQkJdGhpcy5jb250cm9sICAgID0gY29udHJvbDsKLQkJCXRoaXMuY2FjaGVkU2l6ZSA9IG5ldyBQb2ludCgwLCAwKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJCWZvciAoaW50IGV2ZW50VHlwZSA6IEVWRU5UX1RZUEVTKSB7Ci0JCQkJY29udHJvbC5hZGRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBQb2ludCBjYWNoZWRTaXplKCkgewotCQkJcmV0dXJuIGNhY2hlZFNpemU7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgUG9pbnQgY2FsY3VsYXRlU2l6ZSgpIHsKLQotCQkJY2FjaGVkU2l6ZSA9IGNvbnRyb2wuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLQotCQkJLy8gVXBkYXRlIHJpZ2h0IGF3YXkgdGhlIGNvbnRyb2wncyBHcmlkRGF0YQotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIGNvbnRyb2wuZ2V0TGF5b3V0RGF0YSgpOwotCi0JCQlpZiAoZ3JpZERhdGEgPT0gbnVsbCkgewotCQkJCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJCQljb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJfQotCi0JCQlncmlkRGF0YS53aWR0aEhpbnQgID0gY2FjaGVkU2l6ZS54OwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGNhY2hlZFNpemUueTsKLQotCQkJLy8gTWFrZSBzdXJlIHRoZSBzaXplIGlzIG5vdCAtMQotCQkJaWYgKGNhY2hlZFNpemUueCA9PSBTV1QuREVGQVVMVCkgewotCQkJCWNhY2hlZFNpemUueCA9IDA7Ci0JCQl9Ci0KLQkJCWlmIChjYWNoZWRTaXplLnkgPT0gU1dULkRFRkFVTFQpIHsKLQkJCQljYWNoZWRTaXplLnkgPSAwOwotCQkJfQotCi0JCQlyZXR1cm4gY2FjaGVkU2l6ZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGxvY2tlZCgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJCWZvciAoaW50IGV2ZW50VHlwZSA6IEVWRU5UX1RZUEVTKSB7Ci0JCQkJY29udHJvbC5yZW1vdmVMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFNpemUoUG9pbnQgc2l6ZSkgewotCi0JCQlpZiAoY29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIFVwZGF0ZSB0aGUgR3JpZERhdGEgd2l0aCB0aGUgbmV3IHNpemUKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gKEdyaWREYXRhKSBjb250cm9sLmdldExheW91dERhdGEoKTsKLQotCQkJaWYgKGdyaWREYXRhID09IG51bGwpIHsKLQkJCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCX0KLQotCQkJZ3JpZERhdGEud2lkdGhIaW50ICA9IHNpemUueDsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSBzaXplLnk7Ci0KLQkJCS8vIEZvcmNlIHRoZSBjb250cm9sIHRvIGJlIHJlc2l6ZWQsIGFuZCB0ZWxsIGl0cyBwYXJlbnQgdG8gbGF5b3V0Ci0JCQkvLyBpdHMgd2lkZ2V0cwotCQkJaWYgKHNpemUueCA+IDApIHsKLS8vCQkJCWxvY2tlZCA9IHRydWU7Ci0vLwkJCQl0cnkgIHsKLS8vLy8JCQkJCWNvbnRyb2wuZ2V0UGFyZW50KCkubGF5b3V0KG5ldyBDb250cm9sW10geyBjb250cm9sIH0pOwotLy8JCQkJCWNvbnRyb2wuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUpOwotLy8JCQkJfQotLy8JCQkJZmluYWxseSB7Ci0vLwkJCQkJbG9ja2VkID0gZmFsc2U7Ci0vLwkJCQl9Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGNvbnRyb2wuZ2V0Qm91bmRzKCk7Ci0KLQkJCQkvLyBPbmx5IHVwZGF0ZSB0aGUgY29udHJvbCdzIHdpZHRoIGlmIGl0J3MKLQkJCQkvLyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBzaXplCi0JCQkJaWYgKGJvdW5kcy53aWR0aCAhPSBzaXplLngpIHsKLQkJCQkJbG9ja2VkID0gdHJ1ZTsKLQotCQkJCQl0cnkgewotLy8JCQkJCQljb250cm9sLnNldEJvdW5kcyhib3VuZHMueCwgYm91bmRzLnksIHNpemUueCwgc2l6ZS55KTsKLQkJCQkJCWNvbnRyb2wuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUpOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkKLQkJCQkJewotCQkJCQkJbG9ja2VkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgQ29udHJvbCBzb3VyY2UoKSB7Ci0JCQlyZXR1cm4gY29udHJvbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCi0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzYi5hcHBlbmQoIkNhY2hlZCBzaXplPSIpOwotCQkJc2IuYXBwZW5kKGNhY2hlZFNpemUpOwotCQkJc2IuYXBwZW5kKCIsIENvbnRyb2w9Iik7Ci0JCQlzYi5hcHBlbmQoY29udHJvbCk7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbGlzdGVuZXIgYWRkZWQgdG8gZWFjaCBvZiB0aGUgY29udHJvbCB0aGF0IGlzIG5vdGlmaWVkIGluIG9yZGVyIHRvCi0JICogcmV2YWxpZGF0ZSB0aGUgcHJlZmVycmVkIHNpemUuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBMaXN0ZW5lckhhbmRsZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlDb250cm9sQWxpZ25lci50aGlzLnJldmFsaWRhdGUoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyA8Y29kZT5XcmFwcGVyPC9jb2RlPiBoZWxwcyB0byBlbmNhcHN1bGF0ZSBoZXRlcm9nZW5lb3VzIG9iamVjdHMgYW5kCi0JICogYXBwbHkgdGhlIHNhbWUgYmVoYXZpb3Igb24gdGhlbS4KLQkgKi8KLQlwcml2YXRlIGludGVyZmFjZSBXcmFwcGVyIHsKLQkgICAvKioKLQkJICogQWRkcyB0aGUgZ2l2ZW4gPGNvZGU+TGlzdGVuZXI8L2NvZGU+IHRvIHdyYXBwZWQgb2JqZWN0IGluIG9yZGVyIHRvCi0JCSAqIHJlY2VpdmUgbm90aWZpY2F0aW9uIHdoZW4gaXRzIHByb3BlcnR5IGNoYW5nZWQuCi0JCSAqCi0JCSAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgPGNvZGU+TGlzdGVuZXI8L2NvZGU+IHRvIGJlIGFkZGVkCi0JCSAqLwotCQl2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgY2FjaGVkIHNpemUgb2YgdGhlIGVuY2Fwc3VsYXRlZCBzb3VyY2UuCi0JCSAqCi0JCSAqIEByZXR1cm4gQSBub24tPGNvZGU+bnVsbDwvY29kZT4gPGNvZGU+UG9pbnQ8L2NvZGU+IHdoZXJlIHRoZSB4IGlzIHRoZQotCQkgKiB3aWR0aCBhbmQgdGhlIHkgaXMgdGhlIGhlaWdodCBvZiB0aGUgd2lkZ2V0Ci0JCSAqLwotCQlQb2ludCBjYWNoZWRTaXplKCk7Ci0KLQkJLyoqCi0JCSAqIENhbGN1bGF0ZXMgdGhlIHByZWZlcnJlZCBzaXplIHRoZSB3cmFwcGVkIG9iamVjdCB3b3VsZCB0YWtlIGJ5IGl0c2VsZi4KLQkJICoKLQkJICogQHJldHVybiBUaGUgY2FsY3VsYXRlZCBzaXplCi0JCSAqLwotCQlQb2ludCBjYWxjdWxhdGVTaXplKCk7Ci0KLQkJLyoqCi0JCSAqIFByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbiB3aGVuIHJlY2FsY3VsYXRpbmcgdGhlIHByZWZlcnJlZCB3aWR0aC4KLQkJICogVGhpcyBoYXBwZW5zIGluIGFuIGhpZXJhcmNoeSBvZiA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT5zLgotCQkgKgotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHRvIHByZXZlbnQgdGhpcyA8Y29kZT5XcmFwcGVyPC9jb2RlPiBmcm9tCi0JCSAqIGJlaW5nIGludmFsaWRhdGVkOyBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JCSAqLwotCQlib29sZWFuIGxvY2tlZCgpOwotCi0JCS8qKgotCQkgKiBSZW1vdmVzIHRoZSBnaXZlbiA8Y29kZT5MaXN0ZW5lcjwvY29kZT4uCi0JCSAqCi0JCSAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgPGNvZGU+TGlzdGVuZXI8L2NvZGU+IHRvIGJlIHJlbW92ZWQKLQkJICovCi0JCXZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBzaXplIG9uIHRoZSBlbmNhcHN1bGF0ZWQgc291cmNlLgotCQkgKgotCQkgKiBAcGFyYW0gc2l6ZSBUaGUgbmV3IHNpemUKLQkJICovCi0JCXZvaWQgc2V0U2l6ZShQb2ludCBzaXplKTsKLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgZW5jYXBzdWxhdGVkIG9iamVjdC4KLQkJICoKLQkJICogQHJldHVybiBUaGUgb2JqZWN0IHRoYXQgaXMgYmVlbiB3cmFwcGVkCi0JCSAqLwotCQlPYmplY3Qgc291cmNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9Db250cm9sU3dpdGNoZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9Db250cm9sU3dpdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkNjQ3MS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvQ29udHJvbFN3aXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi0vKioKLSAqIFRoaXMgY29udHJvbGxlciBpcyByZXNwb25zaWJsZSB0byBzd2l0Y2ggdGhlIGFjdGl2ZSBwYWdlIGJhc2VkIG9uIGEgdmFsdWUuIEEKLSAqIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiBpcyB1c2VkIHRvIHRyYW5zZm9ybWVkIHRoYXQgdmFsdWUgaW50byBhCi0gKiA8Y29kZT5Db250cm9sPC9jb2RlPi4KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbnRyb2xTd2l0Y2hlcgotewotCS8qKgotCSAqIFRoZSB3aWRnZXQgdGhhdCBpcyB1c2VkIHRvIHNob3cgdGhlIGFjdGl2ZSA8Y29kZT5Db250cm9sPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIFBhZ2VCb29rIHBhZ2VCb29rOwotCi0JLyoqCi0JICogVGhlIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUgaW50byBhCi0JICogPGNvZGU+Q29udHJvbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjw/LCBDb250cm9sPiBjb250cm9sVHJhbnNmb3JtZXI7Ci0KLQlwcml2YXRlIExhYmVsIGVtcHR5TGFiZWw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xTd2l0Y2hlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3dpdGNoSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJldHJpZXZlCi0JICogdGhlIHJpZ2h0IDxjb2RlPkNvbnRyb2w8L2NvZGU+IHdoZW4gcGFzc2VkIHRvIHRoZSBnaXZlbiB0cmFuc2Zvcm1lcgotCSAqIEBwYXJhbSBjb250cm9sVHJhbnNmb3JtZXIgVGhlIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUgaW50byBhCi0JICogPGNvZGU+Q29udHJvbDwvY29kZT4KLQkgKiBAcGFyYW0gcGFnZUJvb2sgVGhlIDxjb2RlPlBhZ2VCb29rPC9jb2RlPiB1c2VkIGZvciBzd2l0Y2hpbmcgdGhlIDxjb2RlPkNvbnRyb2w8L2NvZGU+Ci0JICovCi0JcHVibGljIDxUPiBDb250cm9sU3dpdGNoZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzd2l0Y2hIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtZXI8VCwgQ29udHJvbD4gY29udHJvbFRyYW5zZm9ybWVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2VCb29rIHBhZ2VCb29rKQotCXsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZShzd2l0Y2hIb2xkZXIsIGNvbnRyb2xUcmFuc2Zvcm1lciwgcGFnZUJvb2spOwotCX0KLQotCXB1YmxpYyA8VD4gQ29udHJvbFN3aXRjaGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3dpdGNoSG9sZGVyLAotCQkJCQkJCQlDb250cm9sIGNvbnRyb2wsCi0JCQkJCQkJCVBhZ2VCb29rIHBhZ2VCb29rKQotCXsKLQkJdGhpcyhzd2l0Y2hIb2xkZXIsIGJ1aWxkTnVsbENvbnRyb2xUcmFuc2Zvcm1lcihjb250cm9sKSwgcGFnZUJvb2spOwotCX0KLQotCXByaXZhdGUgc3RhdGljIDxUPiBUcmFuc2Zvcm1lcjxULCBDb250cm9sPiBidWlsZE51bGxDb250cm9sVHJhbnNmb3JtZXIoZmluYWwgQ29udHJvbCBjb250cm9sKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8VCwgQ29udHJvbD4oKSB7Ci0JCQlwdWJsaWMgQ29udHJvbCB0cmFuc2Zvcm0oVCBtb2RlbCkgewotCQkJCWlmIChtb2RlbCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gY29udHJvbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc3dpdGNoSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVyPD8sIENvbnRyb2w+IGNvbnRyb2xUcmFuc2Zvcm1lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBQYWdlQm9vayBwYWdlQm9vaykKLQl7Ci0JCXRoaXMucGFnZUJvb2sgICAgICAgID0gcGFnZUJvb2s7Ci0JCXRoaXMuY29udHJvbFRyYW5zZm9ybWVyID0gY29udHJvbFRyYW5zZm9ybWVyOwotCi0JCXRoaXMuZW1wdHlMYWJlbCA9IHRoaXMuYnVpbGRFbXB0eUxhYmVsKCk7Ci0KLQkJc3dpdGNoSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQlidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKQotCQkpOwotCi0JCXN3aXRjaFBhZ2VzKHN3aXRjaEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQkvL0J1aWxkIGFuIGVtcHR5IGxhYmVsIHRvIGRpc3BsYXkgaW4gdGhlIHBhZ2UgYm9vayB3aGVuIHRoZSBjb250cm9sVHJhbnNmb3JtZXIgcmV0dXJucyBudWxsLgotCS8vU1dULlNIQURPV19OT05FIG1ha2VzIHRoZSBsaW5lIHNlcGFyYXRvciBub3QgdmlzaWJsZQotCS8vVGhpcyBpcyB0aGUgYmVzdCB3ZSBjYW4gY29tZSB1cCB3aXRoIGZvciBhbiBlbXB0eSBwYWdlCi0JcHJpdmF0ZSBMYWJlbCBidWlsZEVtcHR5TGFiZWwoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWwodGhpcy5wYWdlQm9vaywgU1dULlNFUEFSQVRPUiB8IFNXVC5TSEFET1dfTk9ORSB8IFNXVC5IT1JJWk9OVEFMKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKAotCQkJYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlzd2l0Y2hQYWdlcyhlLmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFN3aXRjaGVzIHRoZSBhY3RpdmUgcGFnZSBieSB0cmFuc2Zvcm1pbmcgdGhlIGdpdmVuIHZhbHVlIGludG8gaXRzCi0JICogY29ycmVzcG9uZGluZyBjb250cm9sLgotCSAqCi0JICogQHBhcmFtIHZhbHVlIFRoZSBzdGF0ZSBwYXNzZWQgdG8gdGhlIHRyYW5zZm9ybWVyIGluIG9yZGVyIHRvIHJldHJpZXZlIHRoZQotCSAqIG5ldyBjb250cm9sCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN3aXRjaFBhZ2VzKE9iamVjdCB2YWx1ZSkgewotCQlpZiAodGhpcy5wYWdlQm9vay5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFJldHJpZXZlIHRoZSBDb250cm9sIGZvciB0aGUgbmV3IHZhbHVlCi0JCUNvbnRyb2wgcGFnZSA9IHRyYW5zZm9ybSh2YWx1ZSk7Ci0KLQkJaWYgKHBhZ2UgPT0gbnVsbCkgewotCQkJLy9Ob3RlOiBXZSBjYW4ndCBwYXNzIGluIG51bGwgZHVlIHRvIGEgYnVnIGluIFBhZ2VCb29rCi0JCQlwYWdlID0gdGhpcy5lbXB0eUxhYmVsOwotCQl9Ci0JCXRoaXMucGFnZUJvb2suc2hvd1BhZ2UocGFnZSk7Ci0KLQkJLy8gUmV2YWxpZGF0ZSB0aGUgcGFyZW50cyBpbiBvcmRlciB0byB1cGRhdGUgdGhlIGxheW91dAotCQlTV1RVdGlsLnJlZmxvdyh0aGlzLnBhZ2VCb29rKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIENvbnRyb2wgdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gKChUcmFuc2Zvcm1lcjxPYmplY3QsIENvbnRyb2w+KSB0aGlzLmNvbnRyb2xUcmFuc2Zvcm1lcikudHJhbnNmb3JtKHZhbHVlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL0xhYmVsZWRCdXR0b24uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQnV0dG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZDZkMjkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL0xhYmVsZWRCdXR0b24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotCi0vKioKLSAqIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5MYWJlbGVkQ29udHJvbDwvY29kZT4gdGhhdCB1cGRhdGVzIGEKLSAqIDxjb2RlPkJ1dHRvbjwvY29kZT4gd2hlbiByZXF1aXJlZC4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgTGFiZWxlZEJ1dHRvbiBpbXBsZW1lbnRzIExhYmVsZWRDb250cm9sCi17Ci0JLyoqCi0JICogVGhlIGJ1dHRvbiB0byBiZSB1cGRhdGVkIHdpdGggYSBkaWZmZXJlbnQgaWNvbiBhbmQgdGV4dC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBidXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkxhYmVsZWRCdXR0b248L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uIHRoYXQgd2lsbCBoYXZlIGl0cyB0ZXh0IGFuZCBpY29uIHVwZGF0ZWQgd2hlbgotCSAqIHJlcXVpcmVkCi0JICogQGV4Y2VwdGlvbiBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gSWYgdGhlIGdpdmVuIDxjb2RlPkJ1dHRvbjwvY29kZT4gaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBMYWJlbGVkQnV0dG9uKEJ1dHRvbiBidXR0b24pIHsKLQkJc3VwZXIoKTsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGJ1dHRvbiwgIlRoZSBidXR0b24gY2Fubm90IGJlIG51bGwiKTsKLQkJdGhpcy5idXR0b24gPSBidXR0b247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJaWYgKCF0aGlzLmJ1dHRvbi5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuYnV0dG9uLnNldEltYWdlKGltYWdlKTsKLQkJCXRoaXMuYnV0dG9uLmdldFBhcmVudCgpLmxheW91dCh0cnVlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKCF0aGlzLmJ1dHRvbi5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCQl0aGlzLmJ1dHRvbi5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvTGFiZWxlZENvbnRyb2wuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQ29udHJvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2VmMGRjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQ29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogVGhpcyA8Y29kZT5MYWJlbGVkQ29udHJvbDwvY29kZT4gaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSBhIHdpZGdldCBhbmQgdXBkYXRlCi0gKiBpdHMgcHJvcGVydGllcyAoaWNvbiBhbmQgdGV4dCkuCi0gKgotICogQHNlZSBMYWJlbGVkQnV0dG9uCi0gKiBAc2VlIExhYmVsZWRMYWJlbAotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExhYmVsZWRDb250cm9sIHsKLQkvKioKLQkgKiBQYXNzZXMgdGhlIGltYWdlIHNvIHRoZSB3cmFwcGVkIGNvbXBvbmVudCBjYW4gcmVjZWl2ZSBpdC4KLQkgKgotCSAqIEBwYXJhbSBpbWFnZSBUaGUgbmV3IDxjb2RlPkltYWdlPC9jb2RlPgotCSAqLwotCXZvaWQgc2V0SW1hZ2UoSW1hZ2UgaW1hZ2UpOwotCi0JLyoqCi0JICogUGFzc2VzIHRoZSB0ZXh0IHNvIHRoZSB3cmFwcGVkIGNvbXBvbmVudCBjYW4gcmVjZWl2ZSBpdC4KLQkgKgotCSAqIEBwYXJhbSB0ZXh0IFRoZSBuZXcgdGV4dAotCSAqLwotCXZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCk7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvTGFiZWxlZENvbnRyb2xVcGRhdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvTGFiZWxlZENvbnRyb2xVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZTk4MTMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBUaGlzIHVwZGF0ZXIgaXMgcmVzcG9uc2libGUgdG8gdXBkYXRlIHRoZSA8Y29kZT5MYWJlbGVkQ29udHJvbDwvY29kZT4gd2hlbgotICogdGhlIHRleHQgYW5kIHRoZSBpY29uIG5lZWQgdG8gY2hhbmdlLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIgewotCi0JLyoqCi0JICogVGhlIHdyYXBwZXIgYXJvdW5kIGEgY29udHJvbCB0aGF0IGhhcyB0ZXh0IGFuZCBpY29uLgotCSAqLwotCXByaXZhdGUgTGFiZWxlZENvbnRyb2wgbGFiZWxlZENvbnRyb2w7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkxhYmVsZWRDb250cm9sVXBkYXRlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gbGFiZWxlZENvbnRyb2wgVGhlIHdyYXBwZXIgYXJvdW5kIHRoZSBjb250cm9sIHRoYXQgbmVlZHMgdG8KLQkgKiBoYXZlIGl0cyB0ZXh0IHVwZGF0ZWQKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIHRoaXMgY2xhc3Mgd2lsbCBsaXN0ZW4gZm9yIGNoYW5nZXMKLQkgKi8KLQlwdWJsaWMgTGFiZWxlZENvbnRyb2xVcGRhdGVyKExhYmVsZWRDb250cm9sIGxhYmVsZWRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlcikKLQl7Ci0JCXRoaXMobGFiZWxlZENvbnRyb2wsIHRleHRIb2xkZXIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TGFiZWxlZENvbnRyb2xVcGRhdGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBsYWJlbGVkQ29udHJvbCBUaGUgd3JhcHBlciBhcm91bmQgdGhlIGNvbnRyb2wgdGhhdCBuZWVkcyB0bwotCSAqIGhhdmUgaXRzIGltYWdlIGFuZCB0ZXh0IHVwZGF0ZWQKLQkgKiBAcGFyYW0gaW1hZ2VIb2xkZXIgVGhlIGhvbGRlciB0aGlzIGNsYXNzIHdpbGwgbGlzdGVuIGZvciBjaGFuZ2VzIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHRleHQgbmV2ZXIgY2hhbmdlcwotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgdGhpcyBjbGFzcyB3aWxsIGxpc3RlbiBmb3IgY2hhbmdlcyBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbWFnZSBuZXZlciBjaGFuZ2VzCi0JICovCi0JcHVibGljIExhYmVsZWRDb250cm9sVXBkYXRlcihMYWJlbGVkQ29udHJvbCBsYWJlbGVkQ29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGltYWdlSG9sZGVyKQotCXsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZShsYWJlbGVkQ29udHJvbCwgdGV4dEhvbGRlciwgaW1hZ2VIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEljb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcihidWlsZEljb25MaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkSWNvbkxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUxhYmVsZWRDb250cm9sVXBkYXRlci50aGlzLnNldEltYWdlKChJbWFnZSkgZS5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiTGFiZWxlZENvbnRyb2xVcGRhdGVyLmltYWdlTGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFRleHRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcihidWlsZFRleHRMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVGV4dExpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUxhYmVsZWRDb250cm9sVXBkYXRlci50aGlzLnNldFRleHQoKFN0cmluZykgZS5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiTGFiZWxlZENvbnRyb2xVcGRhdGVyLnRleHRMaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoTGFiZWxlZENvbnRyb2wgbGFiZWxlZENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGltYWdlSG9sZGVyKQotCXsKLQkJQXNzZXJ0LmlzTm90TnVsbChsYWJlbGVkQ29udHJvbCwgIlRoZSBMYWJlbGVkQ29udHJvbCBjYW5ub3QgYmUgbnVsbCIpOwotCi0JCXRoaXMubGFiZWxlZENvbnRyb2wgPSBsYWJlbGVkQ29udHJvbDsKLQotCQlpZiAodGV4dEhvbGRlciAhPSBudWxsKSB7Ci0JCQl0ZXh0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWlsZFRleHRMaXN0ZW5lcigpKTsKLQkJCXNldFRleHQodGV4dEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJfQotCi0JCWlmIChpbWFnZUhvbGRlciAhPSBudWxsKSB7Ci0JCQlpbWFnZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVpbGRJY29uTGlzdGVuZXIoKSk7Ci0JCQlzZXRJbWFnZShpbWFnZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRJbWFnZShJbWFnZSBpY29uKSB7Ci0JCWxhYmVsZWRDb250cm9sLnNldEltYWdlKGljb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0KLQkJaWYgKHRleHQgPT0gbnVsbCkgewotCQkJdGV4dCA9ICIiOwotCQl9Ci0KLQkJbGFiZWxlZENvbnRyb2wuc2V0VGV4dCh0ZXh0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL0xhYmVsZWRMYWJlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL0xhYmVsZWRMYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzRlZjA2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9MYWJlbGVkTGFiZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLS8qKgotICogQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPkxhYmVsZWRDb250cm9sPC9jb2RlPiB0aGF0IHVwZGF0ZXMgYW4KLSAqIDxjb2RlPkxhYmVsPC9jb2RlPiB3aGVuIHJlcXVpcmVkLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBMYWJlbGVkTGFiZWwgaW1wbGVtZW50cyBMYWJlbGVkQ29udHJvbAotewotCS8qKgotCSAqIFRoZSBsYWJlbCB0byBiZSB1cGRhdGVkIHdpdGggYSBkaWZmZXJlbnQgaWNvbiBhbmQgdGV4dC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIExhYmVsIGxhYmVsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5MYWJlbGVkQnV0dG9uPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgdGhhdCB3aWxsIGhhdmUgaXRzIHRleHQgYW5kIGljb24gdXBkYXRlZCB3aGVuCi0JICogcmVxdWlyZWQKLQkgKiBAZXhjZXB0aW9uIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBJZiB0aGUgZ2l2ZW4gPGNvZGU+TGFiZWw8L2NvZGU+IGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTGFiZWxlZExhYmVsKExhYmVsIGxhYmVsKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChsYWJlbCwgIlRoZSBsYWJlbCBjYW5ub3QgYmUgbnVsbCIpOwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJaWYgKCF0aGlzLmxhYmVsLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5sYWJlbC5zZXRJbWFnZShpbWFnZSk7Ci0JCQl0aGlzLmxhYmVsLmdldFBhcmVudCgpLmxheW91dCh0cnVlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKCF0aGlzLmxhYmVsLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5sYWJlbC5zZXRUZXh0KHRleHQpOwotCQkJdGhpcy5sYWJlbC5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvUGFuZUVuYWJsZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9QYW5lRW5hYmxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjE1YzcyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9QYW5lRW5hYmxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIDxjb2RlPlBhbmVFbmFibGVyPC9jb2RlPiBrZWVwcyB0aGUgImVuYWJsZWQiIHN0YXRlIG9mIGEgY29sbGVjdGlvbiBvZgotICogY29udHJvbHMgaW4gc3luY2ggd2l0aCB0aGUgcHJvdmlkZWQgYm9vbGVhbiBob2xkZXIuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQYW5lRW5hYmxlciBleHRlbmRzIFN0YXRlQ29udHJvbGxlcgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZUVuYWJsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IChpLmUuIGRpc2FibGVkKS4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIHdob3NlICJlbmFibGVkIiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUKLQkgKiBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICovCi0JcHVibGljIFBhbmVFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICBQYW5lPD8+IHBhbmUpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIHBhbmUsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVFbmFibGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBkaXNhYmxlZCkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZXMgVGhlIGNvbGxlY3Rpb24gb2YgcGFuZXMgd2hvc2UgImVuYWJsZWQiIHN0YXRlIGlzIGtlcHQgaW4gc3luYwotCSAqIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgUGFuZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIFBhbmU8Pz4uLi4gcGFuZXMpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHBhbmVzKSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZUVuYWJsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgd2hvc2UgImVuYWJsZWQiIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZQotCSAqIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFBhbmVFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICBQYW5lPD8+IHBhbmUsCi0JICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuc2luZ2xldG9uSXRlcmF0b3IocGFuZSksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVFbmFibGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lcyBUaGUgY29sbGVjdGlvbiBvZiBwYW5lcyB3aG9zZSAiZW5hYmxlZCIgc3RhdGUgaXMga2VwdCBpbiBzeW5jCi0JICogd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgUGFuZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIFBhbmU8Pz5bXSBwYW5lcywKLQkgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihwYW5lcyksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5CYXNlSnBhQ29udHJvbGxlckVuYWJsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlCi0JICogb2YqIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBkaXNhYmxlZCkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZXMgVGhlIGNvbGxlY3Rpb24gb2YgcGFuZXMgd2hvc2UgImVuYWJsZWQiIHN0YXRlIGlzIGtlcHQgaW4gc3luYwotCSAqIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgUGFuZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIFBhbmU8Pz4+IHBhbmVzKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBwYW5lcywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QmFzZUpwYUNvbnRyb2xsZXJFbmFibGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lcyBUaGUgY29sbGVjdGlvbiBvZiBwYW5lcyB3aG9zZSAiZW5hYmxlZCIgc3RhdGUgaXMga2VwdCBpbiBzeW5jCi0JICogd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgUGFuZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIFBhbmU8Pz4+IHBhbmVzLAotCSAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgcGFuZXMuaXRlcmF0b3IoKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkJhc2VKcGFDb250cm9sbGVyRW5hYmxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gKGkuZS4gZGlzYWJsZWQpLgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmVzIEFuIGl0ZXJhdG9yIG9uIHRoZSBjb2xsZWN0aW9uIG9mIHBhbmVzIHdob3NlICJlbmFibGVkIiBzdGF0ZQotCSAqIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICovCi0JcHVibGljIFBhbmVFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjw/IGV4dGVuZHMgUGFuZTw/Pj4gcGFuZXMpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIHBhbmVzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5CYXNlSnBhQ29udHJvbGxlckVuYWJsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmVzIEFuIGl0ZXJhdG9yIG9uIHRoZSBjb2xsZWN0aW9uIG9mIHBhbmVzIHdob3NlICJlbmFibGVkIiBzdGF0ZQotCSAqIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBQYW5lRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8PyBleHRlbmRzIFBhbmU8Pz4+IHBhbmVzLAotCSAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXN1cGVyKGJvb2xlYW5Ib2xkZXIsIHdyYXAocGFuZXMpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248Q29udHJvbEhvbGRlcj4gd3JhcChJdGVyYXRvcjw/IGV4dGVuZHMgUGFuZTw/Pj4gcGFuZXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFBhbmU8Pz4sIENvbnRyb2xIb2xkZXI+KHBhbmVzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb250cm9sSG9sZGVyIHRyYW5zZm9ybShQYW5lPD8+IHBhbmUpIHsKLQkJCQlyZXR1cm4gbmV3IFBhbmVIb2xkZXIocGFuZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaG9sZGVyIGhvbGRzIG9udG8gYW4gPGNvZGU+UGFuZTwvY29kZT4gYW5kIHVwZGF0ZSBpdHMgZW5hYmxlZAotCSAqIHN0YXRlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFBhbmVIb2xkZXIgaW1wbGVtZW50cyBDb250cm9sSG9sZGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBQYW5lPD8+IHBhbmU7Ci0KLQkJUGFuZUhvbGRlcihQYW5lPD8+IHBhbmUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnBhbmUgPSBwYW5lOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdXBkYXRlU3RhdGUoYm9vbGVhbiBzdGF0ZSkgewotCQkJaWYgKCF0aGlzLnBhbmUuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCXRoaXMucGFuZS5lbmFibGVXaWRnZXRzKHN0YXRlKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvUGFuZVZpc2liaWxpdHlFbmFibGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvUGFuZVZpc2liaWxpdHlFbmFibGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwODE4MzkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL1BhbmVWaXNpYmlsaXR5RW5hYmxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyA8Y29kZT5QYW5lVmlzaWJpbGl0eUVuYWJsZXI8L2NvZGU+IGtlZXBzIHRoZSAidmlzaWJsZSIgc3RhdGUgb2YgYQotICogY29sbGVjdGlvbiBvZiBjb250cm9scyBpbiBzeW5jaCB3aXRoIHRoZSBwcm92aWRlZCBib29sZWFuIGhvbGRlci4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIFBhbmVWaXNpYmlsaXR5RW5hYmxlciBleHRlbmRzIFN0YXRlQ29udHJvbGxlcgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZVZpc2liaWxpdHlFbmFibGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBub3QgdmlzaWJsZSkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSB3aG9zZSAidmlzaWJsZSIgc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlCi0JICogYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCXB1YmxpYyBQYW5lVmlzaWJpbGl0eUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5lPD8+IHBhbmUpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIHBhbmUsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVWaXNpYmlsaXR5RW5hYmxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gKGkuZS4gbm90IHZpc2libGUpLgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmVzIFRoZSBjb2xsZWN0aW9uIG9mIHBhbmVzIHdob3NlICJ2aXNpYmxlIiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMKLQkgKiB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICovCi0JcHVibGljIFBhbmVWaXNpYmlsaXR5RW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhbmU8Pz4uLi4gcGFuZXMpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHBhbmVzKSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZVZpc2liaWxpdHlFbmFibGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIHdob3NlICJ2aXNpYmxlIiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUKLQkgKiBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBQYW5lVmlzaWJpbGl0eUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5lPD8+IHBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKHBhbmUpLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lVmlzaWJpbGl0eUVuYWJsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmVzIFRoZSBjb2xsZWN0aW9uIG9mIHBhbmVzIHdob3NlICJ2aXNpYmxlIiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMKLQkgKiB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBQYW5lVmlzaWJpbGl0eUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5lPD8+W10gcGFuZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKHBhbmVzKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVWaXNpYmlsaXR5RW5hYmxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gKGkuZS4gbm90IHZpc2libGUpLgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmVzIFRoZSBjb2xsZWN0aW9uIG9mIHBhbmVzIHdob3NlICJ2aXNpYmxlIiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMKLQkgKiB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICovCi0JcHVibGljIFBhbmVWaXNpYmlsaXR5RW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIFBhbmU8Pz4+IHBhbmVzKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBwYW5lcywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZVZpc2liaWxpdHlFbmFibGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lcyBUaGUgY29sbGVjdGlvbiBvZiBwYW5lcyB3aG9zZSAidmlzaWJsZSIgc3RhdGUgaXMga2VwdCBpbiBzeW5jCi0JICogd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgUGFuZVZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgUGFuZTw/Pj4gcGFuZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgcGFuZXMuaXRlcmF0b3IoKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVWaXNpYmlsaXR5RW5hYmxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gKGkuZS4gbm90IHZpc2libGUpLgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmVzIEFuIGl0ZXJhdG9yIG9uIHRoZSBjb2xsZWN0aW9uIG9mIHBhbmVzIHdob3NlICJ2aXNpYmxlIiBzdGF0ZQotCSAqIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICovCi0JcHVibGljIFBhbmVWaXNpYmlsaXR5RW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPD8gZXh0ZW5kcyBQYW5lPD8+PiBwYW5lcykgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgcGFuZXMsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVWaXNpYmlsaXR5RW5hYmxlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZXMgQW4gaXRlcmF0b3Igb24gdGhlIGNvbGxlY3Rpb24gb2YgcGFuZXMgd2hvc2UgInZpc2libGUiIHN0YXRlCi0JICogaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFBhbmVWaXNpYmlsaXR5RW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPD8gZXh0ZW5kcyBQYW5lPD8+PiBwYW5lcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJc3VwZXIoYm9vbGVhbkhvbGRlciwgd3JhcChwYW5lcyksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxDb250cm9sSG9sZGVyPiB3cmFwKEl0ZXJhdG9yPD8gZXh0ZW5kcyBQYW5lPD8+PiBwYW5lcykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24obmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8UGFuZTw/PiwgQ29udHJvbEhvbGRlcj4ocGFuZXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbnRyb2xIb2xkZXIgdHJhbnNmb3JtKFBhbmU8Pz4gcGFuZSkgewotCQkJCXJldHVybiBuZXcgUGFuZUhvbGRlcihwYW5lKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBob2xkZXIgaG9sZHMgb250byBhbiA8Y29kZT5QYW5lPC9jb2RlPiBhbmQgdXBkYXRlIGl0cyB2aXNpYmxlCi0JICogc3RhdGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFuZUhvbGRlciBpbXBsZW1lbnRzIENvbnRyb2xIb2xkZXIgewotCQlwcml2YXRlIGZpbmFsIFBhbmU8Pz4gcGFuZTsKLQotCQlQYW5lSG9sZGVyKFBhbmU8Pz4gcGFuZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucGFuZSA9IHBhbmU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1cGRhdGVTdGF0ZShib29sZWFuIHN0YXRlKSB7Ci0JCQl0aGlzLnBhbmUuc2V0VmlzaWJsZShzdGF0ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvU1dUVXRpbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL1NXVFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFhMzk1Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvU1dUVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLk9wZW5TdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotCi0vKioKLSAqIEEgc3VpdGUgb2YgdXRpbGl0eSBtZXRob2RzIHJlbGF0ZWQgdG8gdGhlIHVzZXIgaW50ZXJmYWNlLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU1dUVXRpbCB7Ci0KLQkvKioKLQkgKiBAc2VlIERpc3BsYXkjYXN5bmNFeGVjKFJ1bm5hYmxlKQotCSAqIEBzZWUgI3N5bmNFeGVjKFJ1bm5hYmxlKQotCSAqIEBzZWUgI3RpbWVyRXhlYyhpbnQsIFJ1bm5hYmxlKQotCSAqIEBzZWUgI2V4ZWN1dGUoUnVubmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzeW5jRXhlYyhSdW5uYWJsZSBydW5uYWJsZSkgewotCQlnZXREaXNwbGF5KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIERpc3BsYXkjc3luY0V4ZWMoUnVubmFibGUpCi0JICogQHNlZSAjYXN5bmNFeGVjKFJ1bm5hYmxlKQotCSAqIEBzZWUgI3RpbWVyRXhlYyhpbnQsIFJ1bm5hYmxlKQotCSAqIEBzZWUgI2V4ZWN1dGUoUnVubmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHN5bmNFeGVjKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCWdldERpc3BsYXkoKS5zeW5jRXhlYyhydW5uYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoZSBzdGFuZGFyZCBkZWxheS4KLQkgKiBAc2VlIE9wZW5TdHJhdGVneSNnZXRQb3N0U2VsZWN0aW9uRGVsYXkoKQotCSAqIEBzZWUgI3RpbWVyRXhlYyhpbnQsIFJ1bm5hYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxheWVkRXhlYyhSdW5uYWJsZSBydW5uYWJsZSkgewotCQl0aW1lckV4ZWMoT3BlblN0cmF0ZWd5LmdldFBvc3RTZWxlY3Rpb25EZWxheSgpLCBydW5uYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBEaXNwbGF5I3RpbWVyRXhlYyhpbnQsIFJ1bm5hYmxlKQotCSAqIEBzZWUgI2FzeW5jRXhlYyhSdW5uYWJsZSkKLQkgKiBAc2VlICNzeW5jRXhlYyhSdW5uYWJsZSkKLQkgKiBAc2VlICNleGVjdXRlKFJ1bm5hYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0aW1lckV4ZWMoaW50IG1pbGxpc2Vjb25kcywgUnVubmFibGUgcnVubmFibGUpIHsKLQkJZ2V0RGlzcGxheSgpLnRpbWVyRXhlYyhtaWxsaXNlY29uZHMsIHJ1bm5hYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgcnVubmFibGUgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHRoZSBVSSB0aHJlYWQ7Ci0JICogb3RoZXJ3aXNlIGFzeW5jaHJvdW5vdXNseSBkaXNwYXRjaCB0aGUgcnVubmFibGUgdG8gdGhlIFVJIHRocmVhZCwKLQkgKiByZXR1cm5pbmcgaW1tZWRpYXRlbHkuIFRoaXMgaXMgdXNlZnVsIGZvciBldmVudCBoYW5kbGVycyB3aGVuIGl0IGlzIG5vdAotCSAqIG9idmlvdXNseSB3aGV0aGVyIHRoZSBldmVudHMgYXJlIGZpcmVkIG9uIHRoZSBVSSB0aHJlYWQuCi0JICogCi0JICogQHNlZSBEaXNwbGF5I2FzeW5jRXhlYyhSdW5uYWJsZSkKLQkgKiBAc2VlICNhc3luY0V4ZWMoUnVubmFibGUpCi0JICogQHNlZSAjc3luY0V4ZWMoUnVubmFibGUpCi0JICogQHNlZSAjdGltZXJFeGVjKGludCwgUnVubmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGV4ZWN1dGUoUnVubmFibGUgcnVubmFibGUpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkaXNwbGF5ICE9IG51bGwpIHsKLQkJCS8vIHRoZSBjdXJyZW50IHRocmVhZCBpcyB0aGUgVUkgdGhyZWFkCi0JCQlydW5uYWJsZS5ydW4oKTsKLQkJfSBlbHNlIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgcnVubmFibGUgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHRoZSBzcGVjaWZpZWQKLQkgKiB2aWV3ZXIncyB0aHJlYWQ7Ci0JICogb3RoZXJ3aXNlIGFzeW5jaHJvdW5vdXNseSBkaXNwYXRjaCB0aGUgcnVubmFibGUgdG8gdGhlIHZpZXdlcidzIHRocmVhZCwKLQkgKiByZXR1cm5pbmcgaW1tZWRpYXRlbHkuIFRoaXMgaXMgdXNlZnVsIGZvciBldmVudCBoYW5kbGVycyB3aGVuIGl0IGlzIG5vdAotCSAqIG9idmlvdXNseSB3aGV0aGVyIHRoZSBldmVudHMgYXJlIGZpcmVkIG9uIHRoZSB2aWV3ZXIncyB0aHJlYWQuCi0JICogCi0JICogQHNlZSAjZXhlY3V0ZShSdW5uYWJsZSkKLQkgKiBAc2VlIERpc3BsYXkjYXN5bmNFeGVjKFJ1bm5hYmxlKQotCSAqIEBzZWUgI2FzeW5jRXhlYyhSdW5uYWJsZSkKLQkgKiBAc2VlICNzeW5jRXhlYyhSdW5uYWJsZSkKLQkgKiBAc2VlICN0aW1lckV4ZWMoaW50LCBSdW5uYWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZXhlY3V0ZShWaWV3ZXIgdmlld2VyLCBSdW5uYWJsZSBydW5uYWJsZSkgewotCQlleGVjdXRlKHZpZXdlci5nZXRDb250cm9sKCksIHJ1bm5hYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgcnVubmFibGUgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHRoZSBzcGVjaWZpZWQKLQkgKiBjb250cm9sJ3MgdGhyZWFkOwotCSAqIG90aGVyd2lzZSBhc3luY2hyb3Vub3VzbHkgZGlzcGF0Y2ggdGhlIHJ1bm5hYmxlIHRvIHRoZSBjb250cm9sJ3MgdGhyZWFkLAotCSAqIHJldHVybmluZyBpbW1lZGlhdGVseS4gVGhpcyBpcyB1c2VmdWwgZm9yIGV2ZW50IGhhbmRsZXJzIHdoZW4gaXQgaXMgbm90Ci0JICogb2J2aW91c2x5IHdoZXRoZXIgdGhlIGV2ZW50cyBhcmUgZmlyZWQgb24gdGhlIGNvbnRyb2wncyB0aHJlYWQuCi0JICogCi0JICogQHNlZSAjZXhlY3V0ZShSdW5uYWJsZSkKLQkgKiBAc2VlIERpc3BsYXkjYXN5bmNFeGVjKFJ1bm5hYmxlKQotCSAqIEBzZWUgI2FzeW5jRXhlYyhSdW5uYWJsZSkKLQkgKiBAc2VlICNzeW5jRXhlYyhSdW5uYWJsZSkKLQkgKiBAc2VlICN0aW1lckV4ZWMoaW50LCBSdW5uYWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZXhlY3V0ZShDb250cm9sIGNvbnRyb2wsIFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCWV4ZWN1dGUoY29udHJvbC5nZXREaXNwbGF5KCksIHJ1bm5hYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgcnVubmFibGUgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHRoZSBzcGVjaWZpZWQKLQkgKiBkaXNwbGF5J3MgdGhyZWFkOwotCSAqIG90aGVyd2lzZSBhc3luY2hyb3Vub3VzbHkgZGlzcGF0Y2ggdGhlIHJ1bm5hYmxlIHRvIHRoZSBkaXNwbGF5J3MgdGhyZWFkLAotCSAqIHJldHVybmluZyBpbW1lZGlhdGVseS4gVGhpcyBpcyB1c2VmdWwgZm9yIGV2ZW50IGhhbmRsZXJzIHdoZW4gaXQgaXMgbm90Ci0JICogb2J2aW91c2x5IHdoZXRoZXIgdGhlIGV2ZW50cyBhcmUgZmlyZWQgb24gdGhlIGRpc3BsYXkncyB0aHJlYWQuCi0JICogCi0JICogQHNlZSAjZXhlY3V0ZShSdW5uYWJsZSkKLQkgKiBAc2VlIERpc3BsYXkjYXN5bmNFeGVjKFJ1bm5hYmxlKQotCSAqIEBzZWUgI2FzeW5jRXhlYyhSdW5uYWJsZSkKLQkgKiBAc2VlICNzeW5jRXhlYyhSdW5uYWJsZSkKLQkgKiBAc2VlICN0aW1lckV4ZWMoaW50LCBSdW5uYWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZXhlY3V0ZShEaXNwbGF5IGRpc3BsYXksIFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCWlmIChkaXNwbGF5LmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpIHsKLQkJCS8vIHRoZSBjdXJyZW50IHRocmVhZCBpcyB0aGUgZGlzcGxheSdzIHRocmVhZAotCQkJcnVubmFibGUucnVuKCk7Ci0JCX0gZWxzZSB7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgdGhlIGN1cnJlbnQgc2hlbGwuIElmIHRoZSBjdXJyZW50IHRocmVhZCBpcwotCSAqIG5vdCB0aGUgVUkgdGhyZWFkLCB0aGVuIGFuIGludmFsaWQgdGhyZWFkIGFjY2VzcyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBzaGVsbCwgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNoZWxsIGdldFNoZWxsKCkgewotCQkvLyBSZXRyaWV2ZSB0aGUgYWN0aXZlIHNoZWxsLCB3aGljaCBjYW4gYmUgdGhlIHNoZWxsIGZyb20gYW55IHdpbmRvdwotCQlTaGVsbCBzaGVsbCA9IGdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQlpZiAoc2hlbGwgIT0gbnVsbCkgewotCQkJcmV0dXJuIHNoZWxsOwotCQl9Ci0KLQkJLy8gTm8gc2hlbGwgY291bGQgYmUgZm91bmQsIHJldmVydCBiYWNrIHRvIHRoZSBhY3RpdmUgd29ya2JlbmNoIHdpbmRvdwotCQlzaGVsbCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJcmV0dXJuIChzaGVsbCAhPSBudWxsKSA/IHNoZWxsIDogbmV3IFNoZWxsKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtb3N0IGFwcHJvcHJpYXRlIHtAbGluayBEaXNwbGF5IGRpc3BsYXl9OyBpLmUuIHJldHVybiB0aGUKLQkgKiB7QGxpbmsgRGlzcGxheSNnZXRDdXJyZW50KCkgZGlzcGxheSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgdGhyZWFkfQotCSAqIGlmIGl0IGlzIHByZXNlbnQ7IG90aGVyd2lzZSByZXR1cm4gdGhlCi0JICoge0BsaW5rIERpc3BsYXkjZ2V0RGVmYXVsdCgpIGRlZmF1bHQgZGlzcGxheX0uCi0JICovCi0JcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlyZXR1cm4gKGRpc3BsYXkgIT0gbnVsbCkgPyBkaXNwbGF5IDogRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogQ2VudGVyIHRoZSBzcGVjaWZpZWQgc2hlbGwgd2l0aGluIGl0cyBkaXNwbGF5LgotCSAqIDxwPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFRoaXMgd2lsbCBub3QgbG9vayB0b28gZ29vZCBvbiBhIGR1YWwgbW9uaXRvciBzeXN0ZW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNlbnRlcihTaGVsbCBzaGVsbCkgewotCQlzaGVsbC5zZXRCb3VuZHMoY2FsY3VsYXRlQ2VudGVyZWRCb3VuZHMoc2hlbGwuZ2V0Qm91bmRzKCksIHNoZWxsLmdldERpc3BsYXkoKS5nZXRCb3VuZHMoKSkpOwotCX0KLQotCS8qKgotCSAqIENlbnRlciB0aGUgc3BlY2lmaWVkIHNoZWxsIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHBhcmVudCBzaGVsbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2VudGVyKFNoZWxsIHNoZWxsLCBTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzaGVsbC5zZXRCb3VuZHMoY2FsY3VsYXRlQ2VudGVyZWRCb3VuZHMoc2hlbGwuZ2V0Qm91bmRzKCksIHBhcmVudFNoZWxsLmdldEJvdW5kcygpKSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIHRoZSBib3VuZHMgKHdpdGhpbiB0aGUgc2Vjb25kIHNwZWNpZmllZCByZWN0YW5nbGUncyBjb29yZGluYXRlCi0JICogc3lzdGVtKSB0aGF0IHdvdWxkIGNlbnRlciB0aGUgZmlyc3Qgc3BlY2lmaWVkIHJlY3RhbmdsZQotCSAqIHdpdGggcmVzcGVjdCB0byB0aGUgc2Vjb25kIHNwZWNpZmllZCByZWN0YW5nbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBSZWN0YW5nbGUgY2FsY3VsYXRlQ2VudGVyZWRCb3VuZHMoUmVjdGFuZ2xlIHJlY3RhbmdsZTEsIFJlY3RhbmdsZSByZWN0YW5nbGUyKSB7Ci0JCXJldHVybiBjYWxjdWxhdGVDZW50ZXJlZEJvdW5kcyhyZWN0YW5nbGUxLndpZHRoLCByZWN0YW5nbGUxLmhlaWdodCwgcmVjdGFuZ2xlMi54LCByZWN0YW5nbGUyLnksIHJlY3RhbmdsZTIud2lkdGgsIHJlY3RhbmdsZTIuaGVpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGUgdGhlIGJvdW5kcyAod2l0aGluIHRoZSBzZWNvbmQgc3BlY2lmaWVkIHJlY3RhbmdsZSdzIGNvb3JkaW5hdGUKLQkgKiBzeXN0ZW0pIHRoYXQgd291bGQgY2VudGVyIHRoZSBmaXJzdCBzcGVjaWZpZWQgcmVjdGFuZ2xlCi0JICogd2l0aCByZXNwZWN0IHRvIHRoZSBzZWNvbmQgc3BlY2lmaWVkIHJlY3RhbmdsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlY3RhbmdsZSBjYWxjdWxhdGVDZW50ZXJlZEJvdW5kcyhQb2ludCBzaXplMSwgUG9pbnQgc2l6ZTIpIHsKLQkJcmV0dXJuIGNhbGN1bGF0ZUNlbnRlcmVkQm91bmRzKHNpemUxLngsIHNpemUxLnksIHNpemUyLngsIHNpemUyLnkpOwotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZSB0aGUgcG9pbnQgKHdpdGhpbiB0aGUgc2Vjb25kIHNwZWNpZmllZCByZWN0YW5nbGUncyBjb29yZGluYXRlCi0JICogc3lzdGVtKSB0aGF0IHdvdWxkIGNlbnRlciB0aGUgZmlyc3Qgc3BlY2lmaWVkIHJlY3RhbmdsZQotCSAqIHdpdGggcmVzcGVjdCB0byB0aGUgc2Vjb25kIHNwZWNpZmllZCByZWN0YW5nbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBSZWN0YW5nbGUgY2FsY3VsYXRlQ2VudGVyZWRCb3VuZHMoaW50IHdpZHRoMSwgaW50IGhlaWdodDEsIGludCB3aWR0aDIsIGludCBoZWlnaHQyKSB7Ci0JCXJldHVybiBjYWxjdWxhdGVDZW50ZXJlZEJvdW5kcyh3aWR0aDEsIGhlaWdodDEsIDAsIDAsIHdpZHRoMiwgaGVpZ2h0Mik7Ci0JfQotCi0KLQkvKioKLQkgKiBDYWxjdWxhdGUgdGhlIHBvaW50ICh3aXRoaW4gdGhlIHNlY29uZCBzcGVjaWZpZWQgcmVjdGFuZ2xlJ3MgY29vcmRpbmF0ZQotCSAqIHN5c3RlbSkgdGhhdCB3b3VsZCBjZW50ZXIgdGhlIGZpcnN0IHNwZWNpZmllZCByZWN0YW5nbGUKLQkgKiB3aXRoIHJlc3BlY3QgdG8gdGhlIHNlY29uZCBzcGVjaWZpZWQgcmVjdGFuZ2xlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVjdGFuZ2xlIGNhbGN1bGF0ZUNlbnRlcmVkQm91bmRzKGludCB3aWR0aDEsIGludCBoZWlnaHQxLCBpbnQgeDIsIGludCB5MiwgaW50IHdpZHRoMiwgaW50IGhlaWdodDIpIHsKLQkJcmV0dXJuIG5ldyBSZWN0YW5nbGUoeDIgKyAoKHdpZHRoMiAtIHdpZHRoMSkgLyAyKSwgeTIgKyAoKGhlaWdodDIgLSBoZWlnaHQxKSAvIDIpLCB3aWR0aDEsIGhlaWdodDEpOwotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZSB0aGUgcG9pbnQgKHdpdGhpbiB0aGUgc2Vjb25kIHNwZWNpZmllZCByZWN0YW5nbGUncyBjb29yZGluYXRlCi0JICogc3lzdGVtKSB0aGF0IHdvdWxkIGNlbnRlciB0aGUgZmlyc3Qgc3BlY2lmaWVkIHJlY3RhbmdsZQotCSAqIHdpdGggcmVzcGVjdCB0byB0aGUgc2Vjb25kIHNwZWNpZmllZCByZWN0YW5nbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBQb2ludCBjYWxjdWxhdGVDZW50ZXJlZFBvc2l0aW9uKFJlY3RhbmdsZSByZWN0YW5nbGUxLCBSZWN0YW5nbGUgcmVjdGFuZ2xlMikgewotCQlyZXR1cm4gY2FsY3VsYXRlQ2VudGVyZWRQb3NpdGlvbihyZWN0YW5nbGUxLndpZHRoLCByZWN0YW5nbGUxLmhlaWdodCwgcmVjdGFuZ2xlMi54LCByZWN0YW5nbGUyLnksIHJlY3RhbmdsZTIud2lkdGgsIHJlY3RhbmdsZTIuaGVpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGUgdGhlIHBvaW50ICh3aXRoaW4gdGhlIHNlY29uZCBzcGVjaWZpZWQgcmVjdGFuZ2xlJ3MgY29vcmRpbmF0ZQotCSAqIHN5c3RlbSkgdGhhdCB3b3VsZCBjZW50ZXIgdGhlIGZpcnN0IHNwZWNpZmllZCByZWN0YW5nbGUKLQkgKiB3aXRoIHJlc3BlY3QgdG8gdGhlIHNlY29uZCBzcGVjaWZpZWQgcmVjdGFuZ2xlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUG9pbnQgY2FsY3VsYXRlQ2VudGVyZWRQb3NpdGlvbihQb2ludCBzaXplMSwgUG9pbnQgc2l6ZTIpIHsKLQkJcmV0dXJuIGNhbGN1bGF0ZUNlbnRlcmVkUG9zaXRpb24oc2l6ZTEueCwgc2l6ZTEueSwgc2l6ZTIueCwgc2l6ZTIueSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIHRoZSBwb2ludCAod2l0aGluIHRoZSBzZWNvbmQgc3BlY2lmaWVkIHJlY3RhbmdsZSdzIGNvb3JkaW5hdGUKLQkgKiBzeXN0ZW0pIHRoYXQgd291bGQgY2VudGVyIHRoZSBmaXJzdCBzcGVjaWZpZWQgcmVjdGFuZ2xlCi0JICogd2l0aCByZXNwZWN0IHRvIHRoZSBzZWNvbmQgc3BlY2lmaWVkIHJlY3RhbmdsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBvaW50IGNhbGN1bGF0ZUNlbnRlcmVkUG9zaXRpb24oaW50IHdpZHRoMSwgaW50IGhlaWdodDEsIGludCB3aWR0aDIsIGludCBoZWlnaHQyKSB7Ci0JCXJldHVybiBjYWxjdWxhdGVDZW50ZXJlZFBvc2l0aW9uKHdpZHRoMSwgaGVpZ2h0MSwgMCwgMCwgd2lkdGgyLCBoZWlnaHQyKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGUgdGhlIHBvaW50ICh3aXRoaW4gdGhlIHNlY29uZCBzcGVjaWZpZWQgcmVjdGFuZ2xlJ3MgY29vcmRpbmF0ZQotCSAqIHN5c3RlbSkgdGhhdCB3b3VsZCBjZW50ZXIgdGhlIGZpcnN0IHNwZWNpZmllZCByZWN0YW5nbGUKLQkgKiB3aXRoIHJlc3BlY3QgdG8gdGhlIHNlY29uZCBzcGVjaWZpZWQgcmVjdGFuZ2xlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUG9pbnQgY2FsY3VsYXRlQ2VudGVyZWRQb3NpdGlvbihpbnQgd2lkdGgxLCBpbnQgaGVpZ2h0MSwgaW50IHgyLCBpbnQgeTIsIGludCB3aWR0aDIsIGludCBoZWlnaHQyKSB7Ci0JCXJldHVybiBuZXcgUG9pbnQoeDIgKyAoKHdpZHRoMiAtIHdpZHRoMSkgLyAyKSwgeTIgKyAoKGhlaWdodDIgLSBoZWlnaHQxKSAvIDIpKTsKLQl9Ci0KLQkvKioKLQkgKiBUd2Vha3MgdGhlIGdpdmVuIDxjb2RlPkNvbWJvPC9jb2RlPiB0byByZW1vdmUgdGhlIGRlZmF1bHQgdmFsdWUgd2hlbiB0aGUKLQkgKiB3aWRnZXQgcmVjZWl2ZXMgdGhlIGZvY3VzIGFuZCB0byBzaG93IHRoZSBkZWZhdWx0IHdoZW4gdGhlIHdpZGdldCBsb3NlcwotCSAqIHRoZSBmb2N1cy4KLQkgKgotCSAqIEBwYXJhbSBjb21ibyBUaGUgd2lkZ2V0IGhhdmluZyBhIGRlZmF1bHQgdmFsdWUgdGhhdCBpcyBhbHdheXMgYXQgdGhlCi0JICogYmVnaW5uaW5nIG9mIHRoZSBsaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIoQ29tYm8gY29tYm8pIHsKLQkJQ29tYm9IYW5kbGVyIGhhbmRsZXIgPSBuZXcgQ29tYm9IYW5kbGVyKCk7Ci0JCWNvbWJvLmFkZEZvY3VzTGlzdGVuZXIoaGFuZGxlcik7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKGhhbmRsZXIpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VGFibGVIZWlnaHRIaW50KFRhYmxlIHRhYmxlLCBpbnQgcm93cykgewotCQlpZiAodGFibGUuZ2V0Rm9udCgpLmVxdWFscyhKRmFjZVJlc291cmNlcy5nZXREZWZhdWx0Rm9udCgpKSkKLQkJCXRhYmxlLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0RGlhbG9nRm9udCgpKTsKLQkJaW50IHJlc3VsdD0gdGFibGUuZ2V0SXRlbUhlaWdodCgpICogcm93cyArIHRhYmxlLmdldEhlYWRlckhlaWdodCgpOwotCQlpZiAodGFibGUuZ2V0TGluZXNWaXNpYmxlKCkpCi0JCQlyZXN1bHQrPSB0YWJsZS5nZXRHcmlkTGluZVdpZHRoKCkgKiAocm93cyAtIDEpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbGF5cyBvdXQgdGhlIHBhcmVudHMgb2YgdGhlIDxjb2RlPkNvbnRyb2w8L2NvZGU+LiBUaGlzIHdhcyB0YWtlbiBmcm9tCi0JICogdGhlIHdpZGdldCA8Y29kZT5TZWN0aW9uPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIHRvIHJldmFsaWRhdGUgYXMgd2VsbCBhcyBpdHMgcGFyZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZsb3coQ29tcG9zaXRlIHBhbmUpIHsKLQotCQlmb3IgKENvbXBvc2l0ZSBjb21wb3NpdGUgPSBwYW5lOyBjb21wb3NpdGUgIT0gbnVsbDsgKSB7Ci0JCQljb21wb3NpdGUuc2V0UmVkcmF3KGZhbHNlKTsKLQkJCWNvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLQotCQkJaWYgKGNvbXBvc2l0ZSBpbnN0YW5jZW9mIFNjcm9sbGVkRm9ybSB8fCBjb21wb3NpdGUgaW5zdGFuY2VvZiBTaGVsbCkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJZm9yIChDb21wb3NpdGUgY29tcG9zaXRlID0gcGFuZTsgY29tcG9zaXRlICE9IG51bGw7ICkgewotCQkJY29tcG9zaXRlLmxheW91dCh0cnVlKTsKLQkJCWNvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLQotCQkJaWYgKGNvbXBvc2l0ZSBpbnN0YW5jZW9mIFNjcm9sbGVkRm9ybSkgewotCQkJCSgoU2Nyb2xsZWRGb3JtKSBjb21wb3NpdGUpLnJlZmxvdyh0cnVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWZvciAoQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHBhbmU7IGNvbXBvc2l0ZSAhPSBudWxsOyApIHsKLQkJCWNvbXBvc2l0ZS5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQljb21wb3NpdGUgPSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0KLQkJCWlmIChjb21wb3NpdGUgaW5zdGFuY2VvZiBTY3JvbGxlZEZvcm0gfHwgY29tcG9zaXRlIGluc3RhbmNlb2YgU2hlbGwpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgdGhlIFVJIGV2ZW50IHRocmVhZC4KLQkgKgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQncyB0aGUgVUkgZXZlbnQgdGhyZWFkLCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdWlUaHJlYWQoKSB7Ci0JCXJldHVybiBEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHRoZSBVSSBldmVudCB0aHJlYWQgYnkgdXNpbmcgdGhlCi0JICogdGhyZWFkIGZyb20gd2hpY2ggdGhlIGdpdmVuIHZpZXdlcidzIGRpc3BsYXkgd2FzIGluc3RhbnRpYXRlZC4KLQkgKgotCSAqIEBwYXJhbSB2aWV3ZXIgVGhlIHZpZXdlciB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgY3VycmVudCB0aHJlYWQKLQkgKiBpcyB0aGUgVUkgZXZlbnQgdGhyZWFkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgdGhlIFVJIGV2ZW50IHRocmVhZDsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHVpVGhyZWFkKFZpZXdlciB2aWV3ZXIpIHsKLQkJcmV0dXJuIHVpVGhyZWFkKHZpZXdlci5nZXRDb250cm9sKCkpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHRoZSBVSSBldmVudCB0aHJlYWQgYnkgdXNpbmcgdGhlCi0JICogdGhyZWFkIGZyb20gd2hpY2ggdGhlIGdpdmVuIHdpZGdldCdzIGRpc3BsYXkgd2FzIGluc3RhbnRpYXRlZC4KLQkgKgotCSAqIEBwYXJhbSB3aWRnZXQgVGhlIHdpZGdldCB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgY3VycmVudCB0aHJlYWQKLQkgKiBpcyB0aGUgVUkgZXZlbnQgdGhyZWFkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgdGhlIFVJIGV2ZW50IHRocmVhZDsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHVpVGhyZWFkKFdpZGdldCB3aWRnZXQpIHsKLQkJcmV0dXJuIHdpZGdldC5nZXREaXNwbGF5KCkuZ2V0VGhyZWFkKCkgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlciBpcyByZXNwb25zaWJsZSBmb3IgcmVtb3ZpbmcgdGhlIGRlZmF1bHQgdmFsdWUgd2hlbiB0aGUgY29tYm8KLQkgKiBoYXMgdGhlIGZvY3VzIG9yIHdoZW4gdGhlIHNlbGVjdGVkIGl0ZW0gaXMgdGhlIGRlZmF1bHQgdmFsdWUgYW5kIHRvIHNlbGVjdAotCSAqIGl0IHdoZW4gdGhlIGNvbWJvIGxvc2VzIHRoZSBmb2N1cy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb21ib0hhbmRsZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb2N1c0xpc3RlbmVyIHsKLQotCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKSBlLndpZGdldDsKLQotCQkJaWYgKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMCkgewkKLQkJCQkvLyBUaGUgdGV4dCBzZWxlY3Rpb24gaGFzIHRvIGJlIGNoYW5nZWQgb3V0c2lkZSBvZiB0aGUgY29udGV4dCBvZiB0aGlzCi0JCQkJLy8gbGlzdGVuZXIgb3RoZXJ3aXNlIHRoZSBjb21ibyB3b24ndCB1cGRhdGUgYmVjYXVzZSBpdCdzIGN1cnJlbnRseQotCQkJCS8vIG5vdGlmeWluZyBpdHMgbGlzdGVuZXJzCi0JCQkJYXN5bmNFeGVjKG5ldyBTZWxlY3RUZXh0KGNvbWJvKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkvL2RvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCi0JCQlDb21ibyBjb21ibyA9IChDb21ibykgZS53aWRnZXQ7Ci0KLQkJCWlmIChjb21iby5pc0ZvY3VzQ29udHJvbCgpICYmCi0JCQkgICAgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAwKSB7Ci0KLQkJCQkvLyBUaGUgdGV4dCBoYXMgdG8gYmUgY2hhbmdlZCBvdXRzaWRlIG9mIHRoZSBjb250ZXh0IG9mIHRoaXMKLQkJCQkvLyBsaXN0ZW5lciBvdGhlcndpc2UgdGhlIGNvbWJvIHdvbid0IHVwZGF0ZSBiZWNhdXNlIGl0J3MgY3VycmVudGx5Ci0JCQkJLy8gbm90aWZ5aW5nIGl0cyBsaXN0ZW5lcnMKLQkJCQlhc3luY0V4ZWMobmV3IE1vZGlmeVRleHQoY29tYm8pKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgY2xhc3MgTW9kaWZ5VGV4dCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJCXByaXZhdGUgZmluYWwgQ29tYm8gY29tYm87Ci0KLQkJCXB1YmxpYyBNb2RpZnlUZXh0KENvbWJvIGNvbWJvKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCQl0aGlzLmNvbWJvID0gY29tYm87Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAodGhpcy5jb21iby5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgdGV4dCA9IHRoaXMuY29tYm8uZ2V0VGV4dCgpOwotCi0JCQkJaWYgKHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl0ZXh0ID0gdGhpcy5jb21iby5nZXRJdGVtKDApOwotCQkJCQl0aGlzLmNvbWJvLnNldFRleHQodGV4dCk7Ci0JCQkJfQotCi0JCQkJdGhpcy5jb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDAsIHRleHQubGVuZ3RoKCkpKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgY2xhc3MgU2VsZWN0VGV4dCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJCXByaXZhdGUgZmluYWwgQ29tYm8gY29tYm87Ci0KLQkJCXB1YmxpYyBTZWxlY3RUZXh0KENvbWJvIGNvbWJvKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCQl0aGlzLmNvbWJvID0gY29tYm87Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAodGhpcy5jb21iby5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgdGV4dCA9IHRoaXMuY29tYm8uZ2V0VGV4dCgpOwotCQkJCXRoaXMuY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCB0ZXh0Lmxlbmd0aCgpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL1N0YXRlQ29udHJvbGxlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL1N0YXRlQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzMxM2U2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9TdGF0ZUNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPlN0YXRlQ29udHJvbGxlcjwvY29kZT4ga2VlcHMgdGhlIHN0YXRlIG9mIGEgY29sbGVjdGlvbiBvZiB3aWRnZXRzIGluCi0gKiBzeW5jaCB3aXRoIHRoZSBwcm92aWRlZCBib29sZWFuIGhvbGRlci4KLSAqCi0gKiBAc2VlIENvbnRyb2xFbmFibGVyCi0gKiBAc2VlIENvbnRyb2xWaXNpYmlsaXR5RW5hYmxlcgotICogQHNlZSBQYW5lRW5hYmxlcgotICogQHNlZSBQYW5lVmlzaWJpbGl0eUVuYWJsZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1hYnN0cmFjdCBjbGFzcyBTdGF0ZUNvbnRyb2xsZXIKLXsKLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBjb250cm9sSG9sZGVycyB3aXRoIGNoYW5nZXMKLQkgKiBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJvb2xlYW5DaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqLwotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXI7Ci0KLQkvKioKLQkgKiBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPnMgd2hvc2Ugc3RhdGUgaXMga2VwdCBpbiBzeW5jCi0JICogd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZS4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb248Q29udHJvbEhvbGRlcj4gY29udHJvbEhvbGRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgc3RhdGU7IGZvciB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4uIFRoZSBkZWZhdWx0IFtkZWZhdWx0IHZhbHVlXSBpcyA8Y29kZT5mYWxzZTxjb2RlPi4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZGVmYXVsdFZhbHVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TdGF0ZUNvbnRyb2xsZXI8L2NvZGU+LgotCSAqLwotCVN0YXRlQ29udHJvbGxlcigpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U3RhdGVDb250cm9sbGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9sSG9sZGVycyBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPnMgd2hvc2UKLQkgKiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCVN0YXRlQ29udHJvbGxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxDb250cm9sSG9sZGVyPiBjb250cm9sSG9sZGVycykgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgY29udHJvbEhvbGRlcnMsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlN0YXRlQ29udHJvbGxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbEhvbGRlcnMgVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q29udHJvbEhvbGRlcjwvY29kZT5zIHdob3NlCi0JICogc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JU3RhdGVDb250cm9sbGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPENvbnRyb2xIb2xkZXI+IGNvbnRyb2xIb2xkZXJzLAotCSAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXRoaXMoKTsKLQkJaW5pdGlhbGl6ZShib29sZWFuSG9sZGVyLCBjb250cm9sSG9sZGVycywgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlN0YXRlQ29udHJvbGxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbEhvbGRlciBUaGUgPGNvZGU+Q29udHJvbEhvbGRlcjwvY29kZT4gd2hvc2Ugc3RhdGUgaXMga2VwdAotCSAqIGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCVN0YXRlQ29udHJvbGxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgQ29udHJvbEhvbGRlciBjb250cm9sSG9sZGVyKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBjb250cm9sSG9sZGVyLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TdGF0ZUNvbnRyb2xsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xIb2xkZXJzIFRoZSBjb2xsZWN0aW9uIG9mIDxjb2RlPkNvbnRyb2xIb2xkZXI8L2NvZGU+cyB3aG9zZQotCSAqIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICovCi0JU3RhdGVDb250cm9sbGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICBDb250cm9sSG9sZGVyLi4uIGNvbnRyb2xIb2xkZXJzKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihjb250cm9sSG9sZGVycyksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlN0YXRlQ29udHJvbGxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbEhvbGRlciBUaGUgPGNvZGU+Q29udHJvbEhvbGRlcjwvY29kZT4gd2hvc2Ugc3RhdGUgaXMga2VwdAotCSAqIGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlTdGF0ZUNvbnRyb2xsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgIENvbnRyb2xIb2xkZXIgY29udHJvbEhvbGRlciwKLQkgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIG5ldyBDb250cm9sSG9sZGVyW10geyBjb250cm9sSG9sZGVyIH0sIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlN0YXRlQ29udHJvbGxlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbEhvbGRlcnMgVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q29udHJvbEhvbGRlcjwvY29kZT5zIHdob3NlCi0JICogc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JU3RhdGVDb250cm9sbGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICBDb250cm9sSG9sZGVyW10gY29udHJvbEhvbGRlcnMsCi0JICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJdGhpcygpOwotCQl0aGlzLmluaXRpYWxpemUoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oY29udHJvbEhvbGRlcnMpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U3RhdGVDb250cm9sbGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9sSG9sZGVycyBBbiBpdGVyYXRvciBvbiB0aGUgY29sbGVjdGlvbiBvZgotCSAqIDxjb2RlPkNvbnRyb2xIb2xkZXI8L2NvZGU+cyB3aG9zZSBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbgotCSAqIGhvbGRlcidzIHZhbHVlCi0JICovCi0JU3RhdGVDb250cm9sbGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICBJdGVyYXRvcjxDb250cm9sSG9sZGVyPiBjb250cm9sSG9sZGVycykgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oY29udHJvbEhvbGRlcnMpLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TdGF0ZUNvbnRyb2xsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xIb2xkZXJzIEFuIGl0ZXJhdG9yIG9uIHRoZSBjb2xsZWN0aW9uIG9mCi0JICogPGNvZGU+Q29udHJvbEhvbGRlcjwvY29kZT5zIHdob3NlIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuCi0JICogaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JU3RhdGVDb250cm9sbGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICBJdGVyYXRvcjxDb250cm9sSG9sZGVyPiBjb250cm9sSG9sZGVycywKLQkgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKCk7Ci0JCWluaXRpYWxpemUoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oY29udHJvbEhvbGRlcnMpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJvb2xlYW4gcHJpbWl0aXZlIG9mIHRoZSBnaXZlbiA8Y29kZT5Cb29sZWFuPC9jb2RlPiB2YWx1ZSBidXQKLQkgKiBhbHNvIGNoZWNrcyBmb3IgPGNvZGU+bnVsbDwvY29kZT4sIGlmIHRoYXQgaXMgdGhlIGNhc2UsIHRoZW4KLQkgKiB7QGxpbmsgI2RlZmF1bHRWYWx1ZX0gaXMgcmV0dXJuZWQuCi0JICoKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIDxjb2RlPkJvb2xlYW48L2NvZGU+IHZhbHVlIHRvIGJlIHJldHVybmVkIGFzIGEgcHJpbWl0aXZlCi0JICogQHJldHVybiBUaGUgcHJpbWl0aXZlIG9mIHRoZSBnaXZlbiB2YWx1ZSBvciB7QGxpbmsgI2RlZmF1bHRWYWx1ZX13aGVuIHRoZQotCSAqIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYm9vbGVhblZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKLQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IHRoaXMuZGVmYXVsdFZhbHVlIDogdmFsdWUuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxpc3RlbmVyIGZvciB0aGUgYm9vbGVhbiBob2xkZXIuCi0JICoKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKAotCQkJYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXJfKCkKLQkJKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJTdGF0ZUNvbnRyb2xsZXIuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIiOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsaXN0ZW5lciBmb3IgdGhlIGJvb2xlYW4gaG9sZGVyLgotCSAqCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPC9jb2RlPgotCSAqLwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlU3RhdGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiU3RhdGVDb250cm9sbGVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gPGNvZGU+SXRlcmF0b3I8L2NvZGU+IG92ZXIgdGhlIGNvbGxlY3Rpb24gb2YKLQkgKiA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPnMuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBpdGVyYXRpb24gb2YgPGNvZGU+Q29udHJvbEhvbGRlcjwvY29kZT5zCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEl0ZXJhdG9yPENvbnRyb2xIb2xkZXI+IGNvbnRyb2xIb2xkZXJzKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8Q29udHJvbEhvbGRlcj4odGhpcy5jb250cm9sSG9sZGVycyk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyA8Y29kZT5TdGF0ZUNvbnRyb2xsZXI8L2NvZGU+IGJ5IGJ1aWxkaW5nIHRoZSBhcHByb3ByaWF0ZQotCSAqIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIDxjb2RlPlN0YXRlQ29udHJvbGxlcjwvY29kZT4gd2l0aCB0aGUgZ2l2ZW4gc3RhdGUuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbEhvbGRlcnMgQSA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPnMgd2hvc2UgZW5hYmxlbWVudCBzdGF0ZQotCSAqIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JCQkJCQkJCQkgIENvbGxlY3Rpb248Q29udHJvbEhvbGRlcj4gY29udHJvbEhvbGRlcnMsCi0JCQkJCQkJCQkgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChib29sZWFuSG9sZGVyLCAgIlRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdmFsdWUgY2Fubm90IGJlIG51bGwiKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChjb250cm9sSG9sZGVycywgIlRoZSBjb2xsZWN0aW9uIG9mIENvbnRyb2xIb2xkZXJzIGNhbm5vdCBiZSBudWxsIik7Ci0KLQkJdGhpcy5jb250cm9sSG9sZGVycyA9IG5ldyBBcnJheUxpc3Q8Q29udHJvbEhvbGRlcj4oY29udHJvbEhvbGRlcnMpOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSAgID0gZGVmYXVsdFZhbHVlOwotCQl0aGlzLmJvb2xlYW5Ib2xkZXIgID0gYm9vbGVhbkhvbGRlcjsKLQotCQl0aGlzLmJvb2xlYW5Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCXRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyCi0JCSk7Ci0KLQkJdGhpcy51cGRhdGVTdGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSBjb250cm9sIGhvbGRlcnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdGUoKSB7Ci0JCXRoaXMudXBkYXRlU3RhdGUoYm9vbGVhblZhbHVlKHRoaXMuYm9vbGVhbkhvbGRlci5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgc3RhdGUgb2YgdGhlIDxjb2RlPkNvbnRyb2w8L2NvZGU+cy4KLQkgKgotCSAqIEBwYXJhbSBzdGF0ZSBUaGUgbmV3IHN0YXRlIHRoZSB3aWRnZXRzIG5lZWQgdG8gaGF2ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXRlKGJvb2xlYW4gc3RhdGUpIHsKLQkJZm9yIChDb250cm9sSG9sZGVyIGNvbnRyb2xIb2xkZXIgOiB0aGlzLmNvbnRyb2xIb2xkZXJzKSB7Ci0JCQljb250cm9sSG9sZGVyLnVwZGF0ZVN0YXRlKHN0YXRlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBob2xkZXIgb2YgdGhlIGFjdHVhbCB3aWRnZXQuCi0JICovCi0Jc3RhdGljIGludGVyZmFjZSBDb250cm9sSG9sZGVyIHsKLQotCQkvKioKLQkJICogVXBkYXRlcyB0aGUgc3RhdGUgb2YgdGhlIHdyYXBwZWQgY29udHJvbC4KLQkJICoKLQkJICogQHBhcmFtIHN0YXRlIFRoZSBuZXcgc3RhdGUgdGhlIGNvbnRyb2wgc2hvdWxkIGhhdmUKLQkJICovCi0JCXZvaWQgdXBkYXRlU3RhdGUoYm9vbGVhbiBzdGF0ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL1RhYmxlTGF5b3V0Q29tcG9zaXRlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvVGFibGVMYXlvdXRDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE4NzkwYy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvVGFibGVMYXlvdXRDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIGNvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS51dGlsLlRhYmxlTGF5b3V0Q29tcG9zaXRlCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGF5b3V0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtblBpeGVsRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci0KLS8qKgotICogQSBzcGVjaWFsIGNvbXBvc2l0ZSB0byBsYXlvdXQgY29sdW1ucyBpbnNpZGUgYSB0YWJsZS4gVGhlIGNvbXBvc2l0ZSBpcyBuZWVkZWQgc2luY2Ugd2UgaGF2ZQotICogdG8gbGF5b3V0IHRoZSBjb2x1bW5zICJiZWZvcmUiIHRoZSBhY3R1YWwgdGFibGUgZ2V0cyBsYXlvdXRlZC4gSGVuY2Ugd2UgY2FuJ3QgdXNlIGEgbm9ybWFsCi0gKiBsYXlvdXQgbWFuYWdlci4KLSAqIDxwPgotICogWFhYOiBTaG91bGQgc3dpdGNoIHRvIHVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LlRhYmxlQ29sdW1uTGF5b3V0fS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFRhYmxlTGF5b3V0Q29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgZXh0cmEgcGl4ZWxzIHRha2VuIGFzIGhvcml6b250YWwgdHJpbSBieSB0aGUgdGFibGUgY29sdW1uLgotCSAqIFRvIGVuc3VyZSB0aGVyZSBhcmUgTiBwaXhlbHMgYXZhaWxhYmxlIGZvciB0aGUgY29udGVudCBvZiB0aGUgY29sdW1uLAotCSAqIGFzc2lnbiBOK0NPTFVNTl9UUklNIGZvciB0aGUgY29sdW1uIHdpZHRoLgotCSAqIDxwPgotCSAqIFhYWDogU2hvdWxkIGVpdGhlciBzd2l0Y2ggdG8gdXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuVGFibGVDb2x1bW5MYXlvdXR9IG9yIGdldCBBUEkgZnJvbSBKRmFjZSBvciBTV1QsIHNlZTogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxODQ4MwotCSAqIDwvcD4KLQkgKgotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgQ09MVU1OX1RSSU07Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHBsYXRmb3JtPSBTV1QuZ2V0UGxhdGZvcm0oKTsKLQkJaWYgKCJ3aW4zMiIuZXF1YWxzKHBsYXRmb3JtKSkgLy8kTk9OLU5MUy0xJAotCQkJQ09MVU1OX1RSSU09IDQ7Ci0JCWVsc2UgaWYgKCJjYXJib24iLmVxdWFscyhwbGF0Zm9ybSkpIC8vJE5PTi1OTFMtMSQKLQkJCUNPTFVNTl9UUklNPSAyNDsKLQkJZWxzZQotCQkJQ09MVU1OX1RSSU09IDM7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGNvbHVtbnM9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGFibGVMYXlvdXRDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZSB0aGUgU1dUIHN0eWxlCi0JICovCi0JcHVibGljIFRhYmxlTGF5b3V0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICAgICAgYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGFyZWE9IGdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICAgICAgICBUYWJsZSB0YWJsZT0gKFRhYmxlKWdldENoaWxkcmVuKClbMF07Ci0gICAgICAgICAgICAgICAgUG9pbnQgcHJlZmVycmVkU2l6ZT0gY29tcHV0ZVRhYmxlU2l6ZSh0YWJsZSk7Ci0gICAgICAgICAgICAgICAgaW50IHdpZHRoPSBhcmVhLndpZHRoIC0gMiAqIHRhYmxlLmdldEJvcmRlcldpZHRoKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZlcnJlZFNpemUueSA+IGFyZWEuaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFN1YnRyYWN0IHRoZSBzY3JvbGxiYXIgd2lkdGggZnJvbSB0aGUgdG90YWwgY29sdW1uIHdpZHRoCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmIGEgdmVydGljYWwgc2Nyb2xsYmFyIHdpbGwgYmUgcmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgUG9pbnQgdkJhclNpemUgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgd2lkdGggLT0gdkJhclNpemUueDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGF5b3V0VGFibGUodGFibGUsIHdpZHRoLCBhcmVhLCB0YWJsZS5nZXRTaXplKCkueCA8IGFyZWEud2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmV3IGNvbHVtbiBvZiBkYXRhIHRvIHRoaXMgdGFibGUgbGF5b3V0LgotCSAqCi0JICogQHBhcmFtIGRhdGEgdGhlIGNvbHVtbiBsYXlvdXQgZGF0YQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbHVtbkRhdGEoQ29sdW1uTGF5b3V0RGF0YSBkYXRhKSB7Ci0JCWNvbHVtbnMuYWRkKGRhdGEpOwotCX0KLQotCS8vLS0tLSBIZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCXByaXZhdGUgUG9pbnQgY29tcHV0ZVRhYmxlU2l6ZShUYWJsZSB0YWJsZSkgewotCQlQb2ludCByZXN1bHQ9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJaW50IHdpZHRoPSAwOwotCQlpbnQgc2l6ZT0gY29sdW1ucy5zaXplKCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBzaXplOyArK2kpIHsKLQkJCUNvbHVtbkxheW91dERhdGEgbGF5b3V0RGF0YT0gKENvbHVtbkxheW91dERhdGEpIGNvbHVtbnMuZ2V0KGkpOwotCQkJaWYgKGxheW91dERhdGEgaW5zdGFuY2VvZiBDb2x1bW5QaXhlbERhdGEpIHsKLQkJCQlDb2x1bW5QaXhlbERhdGEgY29sPSAoQ29sdW1uUGl4ZWxEYXRhKSBsYXlvdXREYXRhOwotCQkJCXdpZHRoICs9IGNvbC53aWR0aDsKLQkJCQlpZiAoY29sLmFkZFRyaW0pIHsKLQkJCQkJd2lkdGggKz0gQ09MVU1OX1RSSU07Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChsYXlvdXREYXRhIGluc3RhbmNlb2YgQ29sdW1uV2VpZ2h0RGF0YSkgewotCQkJCUNvbHVtbldlaWdodERhdGEgY29sPSAoQ29sdW1uV2VpZ2h0RGF0YSkgbGF5b3V0RGF0YTsKLQkJCQl3aWR0aCArPSBjb2wubWluaW11bVdpZHRoOwotCQkJfSBlbHNlIHsKLQkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiVW5rbm93biBjb2x1bW4gbGF5b3V0IGRhdGEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWlmICh3aWR0aCA+IHJlc3VsdC54KQotCQkJcmVzdWx0Lng9IHdpZHRoOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBsYXlvdXRUYWJsZShUYWJsZSB0YWJsZSwgaW50IHdpZHRoLCBSZWN0YW5nbGUgYXJlYSwgYm9vbGVhbiBpbmNyZWFzZSkgewotCQkvLyBYWFg6IExheW91dCBpcyBiZWluZyBjYWxsZWQgd2l0aCBhbiBpbnZhbGlkIHZhbHVlIHRoZSBmaXJzdCB0aW1lCi0JCS8vIGl0IGlzIGJlaW5nIGNhbGxlZCBvbiBMaW51eC4gVGhpcyBtZXRob2QgcmVzZXRzIHRoZQotCQkvLyBMYXlvdXQgdG8gbnVsbCBzbyB3ZSBtYWtlIHN1cmUgd2UgcnVuIGl0IG9ubHkgd2hlbgotCQkvLyB0aGUgdmFsdWUgaXMgT0suCi0JCWlmICh3aWR0aCA8PSAxKQotCQkJcmV0dXJuOwotCi0JCVRhYmxlQ29sdW1uW10gdGFibGVDb2x1bW5zPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JCWludCBzaXplPSBNYXRoLm1pbihjb2x1bW5zLnNpemUoKSwgdGFibGVDb2x1bW5zLmxlbmd0aCk7Ci0JCWludFtdIHdpZHRocz0gbmV3IGludFtzaXplXTsKLQkJaW50IGZpeGVkV2lkdGg9IDA7Ci0JCWludCBudW1iZXJPZldlaWdodENvbHVtbnM9IDA7Ci0JCWludCB0b3RhbFdlaWdodD0gMDsKLQotCQkvLyBGaXJzdCBjYWxjIHNwYWNlIG9jY3VwaWVkIGJ5IGZpeGVkIGNvbHVtbnMKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJQ29sdW1uTGF5b3V0RGF0YSBjb2w9IChDb2x1bW5MYXlvdXREYXRhKSBjb2x1bW5zLmdldChpKTsKLQkJCWlmIChjb2wgaW5zdGFuY2VvZiBDb2x1bW5QaXhlbERhdGEpIHsKLQkJCQlDb2x1bW5QaXhlbERhdGEgY3BkPSAoQ29sdW1uUGl4ZWxEYXRhKSBjb2w7Ci0JCQkJaW50IHBpeGVscz0gY3BkLndpZHRoOwotCQkJCWlmIChjcGQuYWRkVHJpbSkgewotCQkJCQlwaXhlbHMgKz0gQ09MVU1OX1RSSU07Ci0JCQkJfQotCQkJCXdpZHRoc1tpXT0gcGl4ZWxzOwotCQkJCWZpeGVkV2lkdGggKz0gcGl4ZWxzOwotCQkJfSBlbHNlIGlmIChjb2wgaW5zdGFuY2VvZiBDb2x1bW5XZWlnaHREYXRhKSB7Ci0JCQkJQ29sdW1uV2VpZ2h0RGF0YSBjdz0gKENvbHVtbldlaWdodERhdGEpIGNvbDsKLQkJCQludW1iZXJPZldlaWdodENvbHVtbnMrKzsKLQkJCQkvLyBmaXJzdCB0aW1lLCB1c2UgdGhlIHdlaWdodCBzcGVjaWZpZWQgYnkgdGhlIGNvbHVtbiBkYXRhLCBvdGhlcndpc2UgdXNlIHRoZSBhY3R1YWwgd2lkdGggYXMgdGhlIHdlaWdodAotCQkJCS8vIGludCB3ZWlnaHQgPSBmaXJzdFRpbWUgPyBjdy53ZWlnaHQgOiB0YWJsZUNvbHVtbnNbaV0uZ2V0V2lkdGgoKTsKLQkJCQlpbnQgd2VpZ2h0PSBjdy53ZWlnaHQ7Ci0JCQkJdG90YWxXZWlnaHQgKz0gd2VpZ2h0OwotCQkJfSBlbHNlIHsKLQkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiVW5rbm93biBjb2x1bW4gbGF5b3V0IGRhdGEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJLy8gRG8gd2UgaGF2ZSBjb2x1bW5zIHRoYXQgaGF2ZSBhIHdlaWdodAotCQlpZiAobnVtYmVyT2ZXZWlnaHRDb2x1bW5zID4gMCkgewotCQkJLy8gTm93IGRpc3RyaWJ1dGUgdGhlIHJlc3QgdG8gdGhlIGNvbHVtbnMgd2l0aCB3ZWlnaHQuCi0JCQlpbnQgcmVzdD0gd2lkdGggLSBmaXhlZFdpZHRoOwotCQkJaW50IHRvdGFsRGlzdHJpYnV0ZWQ9IDA7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCQkJQ29sdW1uTGF5b3V0RGF0YSBjb2w9IChDb2x1bW5MYXlvdXREYXRhKSBjb2x1bW5zLmdldChpKTsKLQkJCQlpZiAoY29sIGluc3RhbmNlb2YgQ29sdW1uV2VpZ2h0RGF0YSkgewotCQkJCQlDb2x1bW5XZWlnaHREYXRhIGN3PSAoQ29sdW1uV2VpZ2h0RGF0YSkgY29sOwotCQkJCQkvLyBjYWxjdWxhdGUgd2VpZ2h0IGFzIGFib3ZlCi0JCQkJCS8vIGludCB3ZWlnaHQgPSBmaXJzdFRpbWUgPyBjdy53ZWlnaHQgOiB0YWJsZUNvbHVtbnNbaV0uZ2V0V2lkdGgoKTsKLQkJCQkJaW50IHdlaWdodD0gY3cud2VpZ2h0OwotCQkJCQlpbnQgcGl4ZWxzPSB0b3RhbFdlaWdodCA9PSAwID8gMCA6IHdlaWdodCAqIHJlc3QgLyB0b3RhbFdlaWdodDsKLQkJCQkJaWYgKHBpeGVscyA8IGN3Lm1pbmltdW1XaWR0aCkKLQkJCQkJCXBpeGVscz0gY3cubWluaW11bVdpZHRoOwotCQkJCQl0b3RhbERpc3RyaWJ1dGVkICs9IHBpeGVsczsKLQkJCQkJd2lkdGhzW2ldPSBwaXhlbHM7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBEaXN0cmlidXRlIGFueSByZW1haW5pbmcgcGl4ZWxzIHRvIGNvbHVtbnMgd2l0aCB3ZWlnaHQuCi0JCQlpbnQgZGlmZj0gcmVzdCAtIHRvdGFsRGlzdHJpYnV0ZWQ7Ci0JCQlmb3IgKGludCBpPSAwOyBkaWZmID4gMDsgKytpKSB7Ci0JCQkJaWYgKGkgPT0gc2l6ZSkKLQkJCQkJaT0gMDsKLQkJCQlDb2x1bW5MYXlvdXREYXRhIGNvbD0gKENvbHVtbkxheW91dERhdGEpIGNvbHVtbnMuZ2V0KGkpOwotCQkJCWlmIChjb2wgaW5zdGFuY2VvZiBDb2x1bW5XZWlnaHREYXRhKSB7Ci0JCQkJCSsrd2lkdGhzW2ldOwotCQkJCQktLWRpZmY7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGluY3JlYXNlKSB7Ci0JCQl0YWJsZS5zZXRTaXplKGFyZWEud2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJfQotCQlmb3IgKGludCBpPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0YWJsZUNvbHVtbnNbaV0uc2V0V2lkdGgod2lkdGhzW2ldKTsKLQkJfQotCQlpZiAoIWluY3JlYXNlKSB7Ci0JCQl0YWJsZS5zZXRTaXplKGFyZWEud2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9BYnN0cmFjdFVpQ29tbWFuZEV4ZWN1dG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvQWJzdHJhY3RVaUNvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzhmZmQ2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9BYnN0cmFjdFVpQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLmNvbW1hbmQuQ29tbWFuZFJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5jb21tYW5kLlN5bmNocm9uaXppbmdDb21tYW5kOwotCi0vKioKLSAqIEdhdGhlciB0aGUgdGlueSBiaXQgb2YgY29tbW9uIGJlaGF2aW9yLgotICovCi1hYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFVpQ29tbWFuZEV4ZWN1dG9yCi0JaW1wbGVtZW50cyBFeHRlbmRlZENvbW1hbmRFeGVjdXRvcgotewotCUFic3RyYWN0VWlDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JUnVubmFibGUgYnVpbGRSdW5uYWJsZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kUnVubmFibGUoY29tbWFuZCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogQSBjb21tb24gd2F5IHRvIHB1dCBhIHRpbWUgY29uc3RyYWludCBvbiBhIGNvbW1hbmQgZGlzcGF0Y2hlZAotCSAqIHRvIHRoZSBVSSB0aHJlYWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvRXhlY3V0ZShDb21tYW5kIGNvbW1hbmQsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRpbWVvdXQgPT0gMEwpIHsKLQkJCXRoaXMud2FpdFRvRXhlY3V0ZShjb21tYW5kKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gY29uZmlndXJlIHRoZSBzeW5jIGNvbW1hbmQgdG8gZXhlY3V0ZSB0aGUgY2xpZW50IGNvbW1hbmQKLQkJU3luY2hyb25pemluZ0NvbW1hbmQgc3luY0NvbW1hbmQgPSBuZXcgU3luY2hyb25pemluZ0NvbW1hbmQoY29tbWFuZCk7Ci0KLQkJLy8gZGlzcGF0Y2ggdGhlIHN5bmMgY29tbWFuZCB0byB0aGUgVUkgdGhyZWFkLi4uCi0JCVNXVFV0aWwuYXN5bmNFeGVjKHRoaXMuYnVpbGRSdW5uYWJsZShzeW5jQ29tbWFuZCkpOwotCi0JCS8vIC4uLmFuZCB3YWl0IGZvciBpdCB0byBleGVjdXRlCi0JCXRyeSB7Ci0JCQlyZXR1cm4gc3luY0NvbW1hbmQud2FpdEZvckV4ZWN1dGlvbih0aW1lb3V0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCXN5bmNDb21tYW5kLnJlbGVhc2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9Bc3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L0FzeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MDVmNTMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L0FzeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3I7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGV4ZWN1dG9yIGFzeW5jaHJvbm91c2x5IGV4ZWN1dGVzIGEge0BsaW5rIENvbW1hbmQgY29tbWFuZH0KLSAqIG9uIHRoZSBVSSB0aHJlYWQuCi0gKiA8cD4KLSAqIFRoaXMgY29tbWFuZCBleGVjdXRvciBhbGxvd3MgYSBub24tVUkgcHJvY2VzcyB0byBtb2RpZnkgYW55IG9iamVjdHMKLSAqIGFzc29jaWF0ZWQgd2l0aCBkb2N1bWVudHMgdGhhdCBhcmUgY3VycmVudGx5IGRpc3BsYXllZCBpbiB0aGUgVUkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBc3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvcgotCWV4dGVuZHMgQWJzdHJhY3RVaUNvbW1hbmRFeGVjdXRvcgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IgSU5TVEFOQ0UgPSBuZXcgQXN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IoKTsKLQotCXB1YmxpYyBzdGF0aWMgRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JcHJpdmF0ZSBBc3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQlTV1RVdGlsLmFzeW5jRXhlYyh0aGlzLmJ1aWxkUnVubmFibGUoY29tbWFuZCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdhaXRUb0V4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCVNXVFV0aWwuc3luY0V4ZWModGhpcy5idWlsZFJ1bm5hYmxlKGNvbW1hbmQpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvUGFnZUFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9QYWdlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjc0OTRiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9QYWdlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSVBhZ2VMaXN0ZW5lcn0uCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWdlQWRhcHRlcgotCWltcGxlbWVudHMgSVBhZ2VMaXN0ZW5lcgotewotCXB1YmxpYyB2b2lkIHBhZ2VPcGVuZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIHBhZ2VBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIHBhZ2VDbG9zZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9QYXJ0QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L1BhcnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyN2JlYTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L1BhcnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJUGFydExpc3RlbmVyfS4KLSAqLwotcHVibGljIGNsYXNzIFBhcnRBZGFwdGVyCi0JaW1wbGVtZW50cyBJUGFydExpc3RlbmVyCi17Ci0JcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvUGFydEFkYXB0ZXIyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvUGFydEFkYXB0ZXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MTc2YTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L1BhcnRBZGFwdGVyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2U7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElQYXJ0TGlzdGVuZXIyfS4KLSAqLwotcHVibGljIGNsYXNzIFBhcnRBZGFwdGVyMgotCWltcGxlbWVudHMgSVBhcnRMaXN0ZW5lcjIKLXsKLQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBwYXJ0VmlzaWJsZShJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgcGFydElucHV0Q2hhbmdlZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgcGFydEhpZGRlbihJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvUHJvcGVydHlBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvUHJvcGVydHlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzOTgwOGEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L1Byb3BlcnR5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVByb3BlcnR5TGlzdGVuZXI7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElQcm9wZXJ0eUxpc3RlbmVyfS4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5QWRhcHRlcgotCWltcGxlbWVudHMgSVByb3BlcnR5TGlzdGVuZXIKLXsKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IHNvdXJjZSwgaW50IHByb3BJZCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L1N5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9TeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYmU4ZjMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L1N5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5FeHRlbmRlZENvbW1hbmRFeGVjdXRvcjsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgZXhlY3V0b3Igc3luY2hyb25vdXNseSBleGVjdXRlcyBhIHtAbGluayBDb21tYW5kIGNvbW1hbmR9Ci0gKiBvbiB0aGUgVUkgdGhyZWFkLgotICogPHA+Ci0gKiBUaGlzIGNvbW1hbmQgZXhlY3V0b3IgYWxsb3dzIGEgbm9uLVVJIHByb2Nlc3MgdG8gbW9kaWZ5IGFueSBvYmplY3RzCi0gKiBhc3NvY2lhdGVkIHdpdGggZG9jdW1lbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBkaXNwbGF5ZWQgaW4gdGhlIFVJLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvcgotCWV4dGVuZHMgQWJzdHJhY3RVaUNvbW1hbmRFeGVjdXRvcgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IgSU5TVEFOQ0UgPSBuZXcgU3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvcigpOwotCi0JcHVibGljIHN0YXRpYyBFeHRlbmRlZENvbW1hbmRFeGVjdXRvciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQlwcml2YXRlIFN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJU1dUVXRpbC5zeW5jRXhlYyh0aGlzLmJ1aWxkUnVubmFibGUoY29tbWFuZCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdhaXRUb0V4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXRoaXMuZXhlY3V0ZShjb21tYW5kKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvV2luZG93QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L1dpbmRvd0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE4ZTA4YS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvV2luZG93QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElXaW5kb3dMaXN0ZW5lcn0uCi0gKi8KLXB1YmxpYyBjbGFzcyBXaW5kb3dBZGFwdGVyCi0JaW1wbGVtZW50cyBJV2luZG93TGlzdGVuZXIKLXsKLQlwdWJsaWMgdm9pZCB3aW5kb3dPcGVuZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCB3aW5kb3dBY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCB3aW5kb3dEZWFjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQWJzdHJhY3RMaXN0V2lkZ2V0QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9BYnN0cmFjdExpc3RXaWRnZXRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZGY0NTIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9BYnN0cmFjdExpc3RXaWRnZXRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogQWxsIHRoZSAibGlzdCB3aWRnZXRzIiBhcmUgc3ViY2xhc3NlcyBvZiB7QGxpbmsgV2lkZ2V0fTsgc28gd2UgY2FuIHByb3ZpZGUKLSAqIGEgc21pZGdlbiBvZiBjb21tb24gYmVoYXZpb3IgaGVyZS4KLSAqLwotYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMaXN0V2lkZ2V0QWRhcHRlcjxXIGV4dGVuZHMgV2lkZ2V0PgotCWltcGxlbWVudHMgTGlzdFdpZGdldE1vZGVsQmluZGluZy5MaXN0V2lkZ2V0Ci17Ci0JZmluYWwgVyB3aWRnZXQ7Ci0KLQlBYnN0cmFjdExpc3RXaWRnZXRBZGFwdGVyKFcgd2lkZ2V0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMud2lkZ2V0ID0gd2lkZ2V0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCXJldHVybiB0aGlzLndpZGdldC5pc0Rpc3Bvc2VkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLndpZGdldC5hZGREaXNwb3NlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy53aWRnZXQucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9Cb29sZWFuQnV0dG9uTW9kZWxCaW5kaW5nLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0Jvb2xlYW5CdXR0b25Nb2RlbEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjMTljNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0Jvb2xlYW5CdXR0b25Nb2RlbEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLQotLyoqCi0gKiBUaGlzIGJpbmRpbmcgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIGNoZWNrLWJveCwgdG9nZ2xlIGJ1dHRvbiwgb3IgcmFkaW8gYnV0dG9uCi0gKiAic2VsZWN0aW9uIiBzeW5jaHJvbml6ZWQgd2l0aCBhIG1vZGVsIGJvb2xlYW4uCi0gKiAKLSAqIEBzZWUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbAotICogQHNlZSBCdXR0b24KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1maW5hbCBjbGFzcyBCb29sZWFuQnV0dG9uTW9kZWxCaW5kaW5nIHsKLQotCS8vICoqKioqIG1vZGVsCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgYm9vbGVhbi4gKi8KLQlwcml2YXRlIGZpbmFsIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgYnV0dG9uJ3Mgc2VsZWN0aW9uIHN0YXRlIHdpdGgKLQkgKiB0aGUgbW9kZWwgYm9vbGVhbi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYm9vbGVhbkNoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgdGhlIGNoZWNrLWJveC90b2dnbGUgYnV0dG9uL3JhZGlvIGJ1dHRvbjsKLQkgKiBmb3Igd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBUaGUgZGVmYXVsdCBbZGVmYXVsdCB2YWx1ZV0gaXMgPGNvZGU+ZmFsc2U8L2NvZGU+IChpLmUuIHRoZSBjaGVjay1ib3gKLQkgKiBpcyB1bmNoZWNrZWQvdG9nZ2xlIGJ1dHRvbiBwb3BwZWQgb3V0L3JhZGlvIGJ1dHRvbiB1bmNoZWNrZWQpLgotCSAqLwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBkZWZhdWx0VmFsdWU7Ci0KLQkvLyAqKioqKiBVSQotCS8qKiBUaGUgY2hlY2stYm94L3RvZ2dsZSBidXR0b24vcmFkaW8gYnV0dG9uIHdlIHN5bmNocm9uaXplIHdpdGggdGhlIG1vZGVsIGJvb2xlYW4uICovCi0JcHJpdmF0ZSBmaW5hbCBCdXR0b24gYnV0dG9uOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgbW9kZWwgYm9vbGVhbiB3aXRoCi0JICogdGhlIGJ1dHRvbidzIHNlbGVjdGlvbiBzdGF0ZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFNlbGVjdGlvbkxpc3RlbmVyIGJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzdG9wIGxpc3RlbmluZyB0byBzdHVmZiB3aGVuIHRoZSBidXR0b24KLQkgKiBpcyBkaXNwb3NlZC4gKENyaXRpY2FsIGZvciBwcmV2ZW50aW5nIG1lbW9yeSBsZWFrcy4pCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBEaXNwb3NlTGlzdGVuZXIgYnV0dG9uRGlzcG9zZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gbW9kZWwgYW5kIGJ1dHRvbiBhcmUgcmVxdWlyZWQuCi0JICovCi0JQm9vbGVhbkJ1dHRvbk1vZGVsQmluZGluZyhNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgQnV0dG9uIGJ1dHRvbiwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChib29sZWFuTW9kZWwgPT0gbnVsbCkgfHwgKGJ1dHRvbiA9PSBudWxsKSkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5ib29sZWFuTW9kZWwgPSBib29sZWFuTW9kZWw7Ci0JCXRoaXMuYnV0dG9uID0gYnV0dG9uOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQotCQl0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5ib29sZWFuTW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLmJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCXRoaXMuYnV0dG9uRGlzcG9zZUxpc3RlbmVyID0gdGhpcy5idWlsZEJ1dHRvbkRpc3Bvc2VMaXN0ZW5lcigpOwotCQl0aGlzLmJ1dHRvbi5hZGREaXNwb3NlTGlzdGVuZXIodGhpcy5idXR0b25EaXNwb3NlTGlzdGVuZXIpOwotCi0JCXRoaXMuc2V0QnV0dG9uU2VsZWN0aW9uKHRoaXMuYm9vbGVhbk1vZGVsLmdldFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlCb29sZWFuQnV0dG9uTW9kZWxCaW5kaW5nLnRoaXMuYm9vbGVhbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiYm9vbGVhbiBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQm9vbGVhbkJ1dHRvbk1vZGVsQmluZGluZy50aGlzLmJ1dHRvblNlbGVjdGVkKCk7Ci0JCQl9Ci0JCSAgICBAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJidXR0b24gc2VsZWN0aW9uIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIERpc3Bvc2VMaXN0ZW5lciBidWlsZEJ1dHRvbkRpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlCb29sZWFuQnV0dG9uTW9kZWxCaW5kaW5nLnRoaXMuYnV0dG9uRGlzcG9zZWQoKTsKLQkJCX0KLQkJICAgIEBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImJ1dHRvbiBkaXNwb3NlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYm9vbGVhbiBtb2RlbCBldmVudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGJ1dHRvbi4KLQkgKiBJZiB0aGUgbmV3IG1vZGVsIHZhbHVlIGlzIG51bGwsIHVzZSB0aGUgYmluZGluZydzIGRlZmF1bHQgdmFsdWUKLQkgKiAod2hpY2ggaXMgdHlwaWNhbGx5IGZhbHNlKS4KLQkgKi8KLQkvKiBDVSBwcml2YXRlICovIHZvaWQgYm9vbGVhbkNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnNldEJ1dHRvblNlbGVjdGlvbigoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEJ1dHRvblNlbGVjdGlvbihCb29sZWFuIGIpIHsKLQkJaWYgKCAhIHRoaXMuYnV0dG9uLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5idXR0b24uc2V0U2VsZWN0aW9uKHRoaXMuYm9vbGVhblZhbHVlKGIpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBib29sZWFuVmFsdWUoQm9vbGVhbiBiKSB7Ci0JCXJldHVybiAoYiAhPSBudWxsKSA/IGIuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYnV0dG9uIGV2ZW50cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgYnV0dG9uIGhhcyBiZWVuICJzZWxlY3RlZCIgLSBzeW5jaHJvbml6ZSB0aGUgbW9kZWwuCi0JICovCi0JLyogQ1UgcHJpdmF0ZSAqLyB2b2lkIGJ1dHRvblNlbGVjdGVkKCkgewotCQlpZiAoICEgdGhpcy5idXR0b24uaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmJvb2xlYW5Nb2RlbC5zZXRWYWx1ZShCb29sZWFuLnZhbHVlT2YodGhpcy5idXR0b24uZ2V0U2VsZWN0aW9uKCkpKTsKLQkJfQotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gdm9pZCBidXR0b25EaXNwb3NlZCgpIHsKLQkJLy8gdGhlIGJ1dHRvbiBpcyBub3QgeWV0ICJkaXNwb3NlZCIgd2hlbiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQKLQkJLy8gc28gd2UgY2FuIHN0aWxsIHJlbW92ZSBvdXIgbGlzdGVuZXJzCi0JCXRoaXMuYnV0dG9uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIpOwotCQl0aGlzLmJ1dHRvbi5yZW1vdmVEaXNwb3NlTGlzdGVuZXIodGhpcy5idXR0b25EaXNwb3NlTGlzdGVuZXIpOwotCQl0aGlzLmJvb2xlYW5Nb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuYm9vbGVhbk1vZGVsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQm9vbGVhblN0YXRlQ29udHJvbGxlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9Cb29sZWFuU3RhdGVDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YzU4MDAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9Cb29sZWFuU3RhdGVDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuRGlzcG9zZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJ1bm5hYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogVGhpcyBjb250cm9sbGVyIGVuYWJsZXMgYSBib29sZWFuIG1vZGVsIHRvIGNvbnRyb2wgZWl0aGVyIHRoZQotICogPGVtPmVuYWJsZWQ8L2VtPiBvciA8ZW0+dmlzaWJsZTwvZW0+IHByb3BlcnRpZXMgb2YgU1dUIGNvbnRyb2xzOyBpLmUuIHRoZQotICogY29udHJvbHMnIHByb3BlcnRpZXMgYXJlIGtlcHQgaW4gc3luY2ggd2l0aCB0aGUgYm9vbGVhbiBtb2RlbCwKLSAqIGJ1dCA8ZW0+bm90PC9lbT4gdmljZS12ZXJzYS4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IG1hbmFnZSB0aGUgbGlzdGVuZXJzOyBpLmUuIHRoZSBlbmdhZ2luZyBhbmQgZGlzZW5nYWdpbmcgb2YKLSAqIHRoZSBib29sZWFuIG1vZGVsIGFuZCB0aGUgY29udHJvbChzKS4KLSAqIAotICogQHNlZSBQcm9wZXJ0eVZhbHVlTW9kZWwKLSAqIEBzZWUgQ29udHJvbCNzZXRFbmFibGVkKGJvb2xlYW4pCi0gKiBAc2VlIENvbnRyb2wjc2V0VmlzaWJsZShib29sZWFuKQotICovCi1hYnN0cmFjdCBjbGFzcyBCb29sZWFuU3RhdGVDb250cm9sbGVyIHsKLQotCS8qKgotCSAqIFRoZSBjb250cm9sbGluZyBib29sZWFuIG1vZGVsLgotCSAqLwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbDsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIGNvbnRyb2wgc3RhdGVzIHdpdGgKLQkgKiBjaGFuZ2VzIGluIHRoZSB2YWx1ZSBvZiB0aGUgYm9vbGVhbiBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYm9vbGVhbkNoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzdG9wIGxpc3RlbmluZyB0byBzdHVmZiB3aGVuIGFsbCB0aGUKLQkgKiBjb250cm9scyBhcmUgZGlzcG9zZWQuIChDcml0aWNhbCBmb3IgcHJldmVudGluZyBtZW1vcnkgbGVha3MuKQotCSAqLwotCXByaXZhdGUgZmluYWwgRGlzcG9zZUxpc3RlbmVyIGNvbnRyb2xEaXNwb3NlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgc3RhdGU7IGZvciB3aGVuIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4gVGhlIGRlZmF1bHQgW2RlZmF1bHQgdmFsdWVdIGlzIDxjb2RlPmZhbHNlPGNvZGU+LgotCSAqLwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBkZWZhdWx0VmFsdWU7Ci0KLQkvKioKLQkgKiBUaGUgYWRhcHRlciBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlICdlbmFibGVkJyBvciAndmlzaWJsZScgcHJvcGVydHkgaXMKLQkgKiBjb250cm9sbGVkLgotCSAqLwotCXByaXZhdGUgZmluYWwgQWRhcHRlciBhZGFwdGVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gbW9kZWwgYW5kIHRoZSBhZGFwdGVyIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlCb29sZWFuU3RhdGVDb250cm9sbGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIGJvb2xlYW4gZGVmYXVsdFZhbHVlLCBBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChib29sZWFuTW9kZWwgPT0gbnVsbCkgfHwgKGFkYXB0ZXIgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuYm9vbGVhbk1vZGVsID0gYm9vbGVhbk1vZGVsOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQkJdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsKLQotCQl0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5jb250cm9sRGlzcG9zZUxpc3RlbmVyID0gdGhpcy5idWlsZENvbnRyb2xEaXNwb3NlTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyBjbGFzcyBCb29sZWFuQ2hhbmdlTGlzdGVuZXIKLQkJZXh0ZW5kcyBQcm9wZXJ0eUNoYW5nZUFkYXB0ZXIKLQl7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJQm9vbGVhblN0YXRlQ29udHJvbGxlci50aGlzLmJvb2xlYW5DaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgRGlzcG9zZUxpc3RlbmVyIGJ1aWxkQ29udHJvbERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sRGlzcG9zZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyBjbGFzcyBDb250cm9sRGlzcG9zZUxpc3RlbmVyCi0JCWV4dGVuZHMgRGlzcG9zZUFkYXB0ZXIKLQl7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCS8vIHRoZSBjb250cm9sIGlzIG5vdCB5ZXQgImRpc3Bvc2VkIiB3aGVuIHdlIHJlY2VpdmUgdGhpcyBldmVudAotCQkJLy8gc28gd2UgY2FuIHN0aWxsIHJlbW92ZSBvdXIgbGlzdGVuZXIKLQkJCUJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIudGhpcy5jb250cm9sRGlzcG9zZWQoKENvbnRyb2wpIGV2ZW50LndpZGdldCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYm9vbGVhbiBtb2RlbCAqKioqKioqKioqCi0KLQl2b2lkIGVuZ2FnZUJvb2xlYW5Nb2RlbCgpIHsKLQkJdGhpcy5ib29sZWFuTW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQl2b2lkIGRpc2VuZ2FnZUJvb2xlYW5Nb2RlbCgpIHsKLQkJdGhpcy5ib29sZWFuTW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYm9vbGVhbiBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBjb250cm9scy4KLQkgKiBJZiB0aGUgbmV3IGJvb2xlYW4gbW9kZWwgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHVzZSB0aGUgY29udHJvbGxlcidzCi0JICogZGVmYXVsdCB2YWx1ZSAod2hpY2ggaXMgdHlwaWNhbGx5IGZhbHNlKS4KLQkgKi8KLQkvKiBDVSBwcml2YXRlICovIHZvaWQgYm9vbGVhbkNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnNldENvbnRyb2xTdGF0ZSgoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0KLQlib29sZWFuIGdldEJvb2xlYW5WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYm9vbGVhblZhbHVlKHRoaXMuYm9vbGVhbk1vZGVsLmdldFZhbHVlKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBib29sZWFuVmFsdWUoQm9vbGVhbiBiKSB7Ci0JCXJldHVybiAoYiAhPSBudWxsKSA/IGIuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udHJvbCAqKioqKioqKioqCi0KLQl2b2lkIGVuZ2FnZUNvbnRyb2woQ29udHJvbCBjb250cm9sKSB7Ci0JCWNvbnRyb2wuYWRkRGlzcG9zZUxpc3RlbmVyKHRoaXMuY29udHJvbERpc3Bvc2VMaXN0ZW5lcik7Ci0JfQotCi0Jdm9pZCBkaXNlbmdhZ2VDb250cm9sKENvbnRyb2wgY29udHJvbCkgewotCQljb250cm9sLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLmNvbnRyb2xEaXNwb3NlTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDb250cm9sU3RhdGUoQm9vbGVhbiBjb250cm9sU3RhdGUpIHsKLQkJdGhpcy5zZXRDb250cm9sU3RhdGUodGhpcy5ib29sZWFuVmFsdWUoY29udHJvbFN0YXRlKSk7Ci0JfQotCi0JYWJzdHJhY3Qgdm9pZCBzZXRDb250cm9sU3RhdGUoYm9vbGVhbiBjb250cm9sU3RhdGUpOwotCi0Jdm9pZCBzZXRDb250cm9sU3RhdGUoQ29udHJvbCBjb250cm9sLCBib29sZWFuIGNvbnRyb2xTdGF0ZSkgewotCQlTV1RVdGlsLmV4ZWN1dGUobmV3IFNldENvbnRyb2xTdGF0ZVJ1bm5hYmxlKGNvbnRyb2wsIGNvbnRyb2xTdGF0ZSkpOwotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gY2xhc3MgU2V0Q29udHJvbFN0YXRlUnVubmFibGUKLQkJZXh0ZW5kcyBSdW5uYWJsZUFkYXB0ZXIKLQl7Ci0JCXByaXZhdGUgZmluYWwgQ29udHJvbCBjb250cm9sOwotCQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gY29udHJvbFN0YXRlOwotCQlTZXRDb250cm9sU3RhdGVSdW5uYWJsZShDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gY29udHJvbFN0YXRlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb250cm9sID0gY29udHJvbDsKLQkJCXRoaXMuY29udHJvbFN0YXRlID0gY29udHJvbFN0YXRlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlCb29sZWFuU3RhdGVDb250cm9sbGVyLnRoaXMuc2V0Q29udHJvbFN0YXRlXyh0aGlzLmNvbnRyb2wsIHRoaXMuY29udHJvbFN0YXRlKTsKLQkJfQotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gdm9pZCBzZXRDb250cm9sU3RhdGVfKENvbnRyb2wgY29udHJvbCwgYm9vbGVhbiBjb250cm9sU3RhdGUpIHsKLQkJaWYgKCAhIGNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmFkYXB0ZXIuc2V0U3RhdGUoY29udHJvbCwgY29udHJvbFN0YXRlKTsKLQkJfQotCX0KLQotCXZvaWQgY29udHJvbERpc3Bvc2VkKENvbnRyb2wgY29udHJvbCkgewotCQl0aGlzLmRpc2VuZ2FnZUNvbnRyb2woY29udHJvbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5ib29sZWFuTW9kZWwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGFwdGVyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQlpbnRlcmZhY2UgQWRhcHRlciB7Ci0JCXZvaWQgc2V0U3RhdGUoQ29udHJvbCBjb250cm9sLCBib29sZWFuIGNvbnRyb2xTdGF0ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9Ecm9wRG93bkxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0Ryb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiMjZjYy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0Ryb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGlzIGJpbmRpbmcgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIGRyb3AtZG93biBsaXN0IGJveCdzIHNlbGVjdGlvbgotICogc3luY2hyb25pemVkIHdpdGggYSBtb2RlbC4gVGhlIHNlbGVjdGlvbiBjYW4gYmUgbW9kaWZpZWQgYnkgZWl0aGVyIHRoZQotICogZHJvcC1kb3duIGxpc3QgYm94IG9yIHRoZSBtb2RlbCwgc28gY2hhbmdlcyBtdXN0IGJlIGNvb3JkaW5hdGVkLgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBBIHNlbGVjdGVkIGl0ZW0gdmFsdWUgb2YgPGNvZGU+bnVsbDwvY29kZT4gY2FuIGJlIHVzZWQKLSAqIHRvIGNsZWFyIHRoZSBkcm9wLWRvd24gbGlzdCBib3gncyBzZWxlY3Rpb24uIElmIDxjb2RlPm51bGw8L2NvZGU+IGlzIGEKLSAqIHZhbGlkIGl0ZW0gaW4gdGhlIG1vZGVsIGxpc3QsIGFuIGludmFsaWQgc2VsZWN0ZWQgaXRlbSBjYW4gYmUgdXNlZCB0byBjbGVhcgotICogdGhlIHNlbGVjdGlvbi4KLSAqIAotICogQHNlZSBMaXN0VmFsdWVNb2RlbAotICogQHNlZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsCi0gKiBAc2VlIERyb3BEb3duTGlzdEJveAotICogQHNlZSBTV1RUb29scwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLWZpbmFsIGNsYXNzIERyb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmc8RT4KLQlpbXBsZW1lbnRzIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuU2VsZWN0aW9uQmluZGluZwotewotCS8vICoqKioqIG1vZGVsCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgbGlzdCBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbDsKLQotCS8qKgotCSAqIEEgd3JpdGFibGUgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgc2VsZWN0aW9uLgotCSAqLwotCXByaXZhdGUgZmluYWwgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1Nb2RlbDsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIGRyb3AtZG93biBsaXN0IGJveCdzCi0JICogc2VsZWN0aW9uIHdpdGggdGhlIG1vZGVsIHNlbGVjdGlvbi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXI7Ci0KLQkvLyAqKioqKiBVSQotCS8qKgotCSAqIFRoZSBkcm9wLWRvd24gbGlzdCBib3ggd2hvc2Ugc2VsZWN0aW9uIHdlIGtlZXAgc3luY2hyb25pemVkCi0JICogd2l0aCB0aGUgbW9kZWwgc2VsZWN0aW9uLgotCSAqLwotCXByaXZhdGUgZmluYWwgRHJvcERvd25MaXN0Qm94IGRyb3Bkb3duTGlzdEJveDsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgb3VyIHNlbGVjdGVkIGl0ZW0gaG9sZGVyCi0JICogd2l0aCB0aGUgZHJvcC1kb3duIGxpc3QgYm94J3Mgc2VsZWN0aW9uLgotCSAqLwotCXByaXZhdGUgZmluYWwgU2VsZWN0aW9uTGlzdGVuZXIgZHJvcGRvd25MaXN0Qm94U2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSBhbGwgcGFyYW1ldGVycyBhcmUgcmVxdWlyZWQuCi0JICovCi0JRHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQmluZGluZygKLQkJCUxpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwKLQkJCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtTW9kZWwsCi0JCQlEcm9wRG93bkxpc3RCb3ggZHJvcGRvd25MaXN0Qm94Ci0JKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgobGlzdE1vZGVsID09IG51bGwpIHx8IChzZWxlY3RlZEl0ZW1Nb2RlbCA9PSBudWxsKSB8fCAoZHJvcGRvd25MaXN0Qm94ID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RNb2RlbCA9IGxpc3RNb2RlbDsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1Nb2RlbCA9IHNlbGVjdGVkSXRlbU1vZGVsOwotCQl0aGlzLmRyb3Bkb3duTGlzdEJveCA9IGRyb3Bkb3duTGlzdEJveDsKLQotCQl0aGlzLnNlbGVjdGVkSXRlbUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFNlbGVjdGVkSXRlbUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtTW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcGRvd25MaXN0Qm94U2VsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRHJvcERvd25MaXN0Qm94U2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5kcm9wZG93bkxpc3RCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5kcm9wZG93bkxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCURyb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcudGhpcy5zZWxlY3RlZEl0ZW1DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInNlbGVjdGVkIGl0ZW0gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGREcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQmluZGluZy50aGlzLmRyb3BEb3duTGlzdEJveFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQmluZGluZy50aGlzLmRyb3BEb3duTGlzdEJveERvdWJsZUNsaWNrZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiZHJvcC1kb3duIGxpc3QgYm94IHNlbGVjdGlvbiBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuU2VsZWN0aW9uQmluZGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBNb2RpZnlpbmcgdGhlIGRyb3AtZG93biBsaXNiIGJveCdzIHNlbGVjdGVkIGl0ZW0gcHJvZ3JhbW1hdGljYWxseSBkb2VzCi0JICogbm90IHRyaWdnZXIgYSBTZWxlY3Rpb25FdmVudC4KLQkgKiA8cD4KLQkgKiBQcmUtY29uZGl0aW9uOiBUaGUgZHJvcC1kb3duIGxpc3QgYm94IGlzIG5vdCBkaXNwb3NlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKSB7Ci0JCWludCBvbGRJbmRleCA9IHRoaXMuZHJvcGRvd25MaXN0Qm94LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCUUgdmFsdWUgPSB0aGlzLnNlbGVjdGVkSXRlbU1vZGVsLmdldFZhbHVlKCk7Ci0JCWludCBuZXdJbmRleCA9IHRoaXMuaW5kZXhPZih2YWx1ZSk7Ci0JCWlmICgob2xkSW5kZXggIT0gLTEpICYmIChuZXdJbmRleCAhPSAtMSkgJiYgKG5ld0luZGV4ICE9IG9sZEluZGV4KSkgewotCQkJdGhpcy5kcm9wZG93bkxpc3RCb3guZGVzZWxlY3Qob2xkSW5kZXgpOwotCQl9Ci0JCWlmIChuZXdJbmRleCA9PSAtMSkgewotCQkJdGhpcy5kcm9wZG93bkxpc3RCb3guZGVzZWxlY3RBbGwoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChuZXdJbmRleCAhPSBvbGRJbmRleCkgewotCQkJCXRoaXMuZHJvcGRvd25MaXN0Qm94LnNlbGVjdChuZXdJbmRleCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmRyb3Bkb3duTGlzdEJveC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmRyb3Bkb3duTGlzdEJveFNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1Nb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlbGVjdGVkIGl0ZW0gKioqKioqKioqKgotCi0Jdm9pZCBzZWxlY3RlZEl0ZW1DaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMuZHJvcGRvd25MaXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5zZWxlY3RlZEl0ZW1DaGFuZ2VkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnlpbmcgdGhlIGRyb3AtZG93biBsaXN0IGJveCdzIHNlbGVjdGVkIGl0ZW0gcHJvZ3JhbW1hdGljYWxseSBkb2VzCi0JICogbm90IHRyaWdnZXIgYSBTZWxlY3Rpb25FdmVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2VsZWN0ZWRJdGVtQ2hhbmdlZF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQlwcml2YXRlIGludCBpbmRleE9mKEUgaXRlbSkgewotCQlpbnQgbGVuID0gdGhpcy5saXN0TW9kZWwuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy5saXN0TW9kZWwuZ2V0KGkpLCBpdGVtKSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCS8vIGlmICdudWxsJyBpcyBub3QgaW4gdGhlIGxpc3QsIHVzZSBpdCB0byBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCWlmIChpdGVtID09IG51bGwpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQkvLyBXZSBjYW4gZ2V0IGhlcmUgdmlhIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCQkvLyAxLiBUaGUgc2VsZWN0ZWQgaXRlbSBtb2RlbCBpcyBpbnZhbGlkIGFuZCBub3QgaW4gc3luYyB3aXRoIHRoZSBsaXN0Ci0JCS8vICAgIG1vZGVsLiBUaGlzIGlzIG5vdCBnb29kIGFuZCB3ZSBkb24ndCBtYWtlIHRoaXMgKHByb2dyYW1taW5nCi0JCS8vICAgIGVycm9yKSBvYnZpb3VzIChlLmcuIHZpYSBhbiBleGNlcHRpb24pLiA6LSgKLQkJLy8gMi4gSWYgYm90aCB0aGUgc2VsZWN0ZWQgaXRlbSBtb2RlbCBhbmQgdGhlIGxpc3QgbW9kZWwgYXJlIGRlcGVuZGVudAotCQkvLyAgICBvbiB0aGUgc2FtZSB1bmRlcmx5aW5nIG1vZGVsLCB0aGUgc2VsZWN0ZWQgaXRlbSBtb2RlbCBtYXkgcmVjZWl2ZQotCQkvLyAgICBpdHMgZXZlbnQgZmlyc3QsIHJlc3VsdGluZyBpbiBhIG1pc3NpbmcgaXRlbS4gVGhpcyB3aWxsIHJlc29sdmUKLQkJLy8gICAgaXRzZWxmIG9uY2UgdGhlIGxpc3QgbW9kZWwgcmVjZWl2ZXMgaXRzIGV2ZW50IGFuZCBzeW5jaHJvbml6ZXMKLQkJLy8gICAgd2l0aCB0aGUgc2FtZSB1bmRlcmx5aW5nIG1vZGVsLiBUaGlzIHNpdHVhdGlvbiBpcyBhY2NlcHRhYmxlLgotCQlyZXR1cm4gLTE7Ci0KLS8vIFRoaXMgaXMgd2hhdCB3ZSB1c2VkIHRvIGRvOgotLy8JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNlbGVjdGVkIGl0ZW0gbm90IGZvdW5kOiAiICsgaXRlbSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbWJvLWJveCBldmVudHMgKioqKioqKioqKgotCi0Jdm9pZCBkcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmRyb3Bkb3duTGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuZHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQ2hhbmdlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0Jdm9pZCBkcm9wRG93bkxpc3RCb3hEb3VibGVDbGlja2VkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmRyb3Bkb3duTGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuZHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQ2hhbmdlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BEb3duTGlzdEJveFNlbGVjdGlvbkNoYW5nZWRfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQl0aGlzLnNlbGVjdGVkSXRlbU1vZGVsLnNldFZhbHVlKHRoaXMuZ2V0RHJvcERvd25MaXN0Qm94U2VsZWN0ZWRJdGVtKCkpOwotCX0KLQotCXByaXZhdGUgRSBnZXREcm9wRG93bkxpc3RCb3hTZWxlY3RlZEl0ZW0oKSB7Ci0JCWludCBzZWxlY3Rpb25JbmRleCA9IHRoaXMuZHJvcGRvd25MaXN0Qm94LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCXJldHVybiAoc2VsZWN0aW9uSW5kZXggPT0gLTEpID8gbnVsbCA6IHRoaXMubGlzdE1vZGVsLmdldChzZWxlY3Rpb25JbmRleCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5zZWxlY3RlZEl0ZW1Nb2RlbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkYXB0ZXIgaW50ZXJmYWNlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkYXB0ZXIgdXNlZCBieSB0aGUgZHJvcC1kb3duIGxpc3QgYm94IHNlbGVjdGlvbiBiaW5kaW5nIHRvIHF1ZXJ5IGFuZCBtYW5pcHVsYXRlCi0JICogdGhlIGRyb3AtZG93biBsaXN0IGJveC4KLQkgKi8KLQlpbnRlcmZhY2UgRHJvcERvd25MaXN0Qm94IHsKLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbWJvLWJveCBpcyAiZGlzcG9zZWQiLgotCQkgKi8KLQkJYm9vbGVhbiBpc0Rpc3Bvc2VkKCk7Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgc3BlY2lmaWVkIHNlbGVjdGlvbiBsaXN0ZW5lciB0byB0aGUgY29tYm8tYm94LgotCQkgKi8KLQkJdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHNlbGVjdGlvbiBsaXN0ZW5lciBmcm9tIHRoZSBjb21iby1ib3guCi0JCSAqLwotCQl2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgY29tYm8tYm94J3Mgc2VsZWN0aW9uLgotCQkgKi8KLQkJaW50IGdldFNlbGVjdGlvbkluZGV4KCk7Ci0KLQkJLyoqCi0JCSAqIFNlbGVjdCB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoZSBjb21iby1ib3guCi0JCSAqLwotCQl2b2lkIHNlbGVjdChpbnQgaW5kZXgpOwotCi0JCS8qKgotCQkgKiBEZXNlbGVjdCB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoZSBjb21iby1ib3guCi0JCSAqLwotCQl2b2lkIGRlc2VsZWN0KGludCBpbmRleCk7Ci0KLQkJLyoqCi0JCSAqIENsZWFyIHRoZSBjb21iby1ib3gncyBzZWxlY3Rpb24uCi0JCSAqLwotCQl2b2lkIGRlc2VsZWN0QWxsKCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg2NzYyNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0xpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLQotLyoqCi0gKiBUaGlzIGJpbmRpbmcgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIGxpc3QgYm94J3Mgc2VsZWN0aW9uCi0gKiBzeW5jaHJvbml6ZWQgd2l0aCBhIG1vZGVsLiBUaGUgc2VsZWN0aW9uIGNhbiBiZSBtb2RpZmllZCBieSBlaXRoZXIgdGhlIGxpc3QKLSAqIGJveCBvciB0aGUgbW9kZWwsIHNvIGNoYW5nZXMgbXVzdCBiZSBjb29yZGluYXRlZC4KLSAqIAotICogQHNlZSBMaXN0VmFsdWVNb2RlbAotICogQHNlZSBNb2RpZmlhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWwKLSAqIEBzZWUgTGlzdAotICogQHNlZSBTV1RUb29scwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLWZpbmFsIGNsYXNzIExpc3RCb3hTZWxlY3Rpb25CaW5kaW5nPEU+Ci0JaW1wbGVtZW50cyBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLlNlbGVjdGlvbkJpbmRpbmcKLXsKLQkvLyAqKioqKiBtb2RlbAotCS8qKgotCSAqIFRoZSB1bmRlcmx5aW5nIGxpc3QgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0VmFsdWVNb2RlbDxFPiBsaXN0TW9kZWw7Ci0KLQkvKioKLQkgKiBBIHdyaXRhYmxlIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHNlbGVjdGlvbnMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBNb2RpZmlhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtc01vZGVsOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgbGlzdCBib3gncyBzZWxlY3Rpb24gd2l0aAotCSAqIHRoZSBtb2RlbCBzZWxlY3Rpb25zLgotCSAqLwotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcjsKLQotCS8vICoqKioqIFVJCi0JLyoqCi0JICogVGhlIGxpc3QgYm94IHdob3NlIHNlbGVjdGlvbiB3ZSBrZWVwIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbCBzZWxlY3Rpb25zLgotCSAqLwotCXByaXZhdGUgZmluYWwgTGlzdCBsaXN0Qm94OwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSBvdXIgc2VsZWN0ZWQgaXRlbXMgaG9sZGVyCi0JICogd2l0aCB0aGUgbGlzdCBib3gncyBzZWxlY3Rpb24uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0Qm94U2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSBhbGwgcGFyYW1ldGVycyBhcmUgcmVxdWlyZWQuCi0JICovCi0JTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcoCi0JCQlMaXN0VmFsdWVNb2RlbDxFPiBsaXN0TW9kZWwsCi0JCQlNb2RpZmlhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtc01vZGVsLAotCQkJTGlzdCBsaXN0Qm94Ci0JKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgobGlzdE1vZGVsID09IG51bGwpIHx8IChzZWxlY3RlZEl0ZW1zTW9kZWwgPT0gbnVsbCkgfHwgKGxpc3RCb3ggPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdE1vZGVsID0gbGlzdE1vZGVsOwotCQl0aGlzLnNlbGVjdGVkSXRlbXNNb2RlbCA9IHNlbGVjdGVkSXRlbXNNb2RlbDsKLQkJdGhpcy5saXN0Qm94ID0gbGlzdEJveDsKLQotCQl0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1zTW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMubGlzdEJveFNlbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmxpc3RCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5saXN0Qm94U2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCUxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLnRoaXMuc2VsZWN0ZWRJdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Qm94U2VsZWN0aW9uQmluZGluZy50aGlzLnNlbGVjdGVkSXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcudGhpcy5zZWxlY3RlZEl0ZW1zQ2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Qm94U2VsZWN0aW9uQmluZGluZy50aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInNlbGVjdGVkIGl0ZW1zIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkTGlzdEJveFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Qm94U2VsZWN0aW9uQmluZGluZy50aGlzLmxpc3RCb3hTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLnRoaXMubGlzdEJveERvdWJsZUNsaWNrZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBib3ggc2VsZWN0aW9uIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFdpZGdldE1vZGVsQmluZGluZy5TZWxlY3Rpb25CaW5kaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIE1vZGlmeWluZyB0aGUgbGlzdCBib3gncyBzZWxlY3RlZCBpdGVtcyBwcm9ncmFtbWF0aWNhbGx5IGRvZXMgbm90Ci0JICogdHJpZ2dlciBhIFNlbGVjdGlvbkV2ZW50LgotCSAqIAotCSAqIFByZS1jb25kaXRpb246IFRoZSBsaXN0LWJveCBpcyBub3QgZGlzcG9zZWQuCi0JICovCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVMaXN0V2lkZ2V0U2VsZWN0aW9uKCkgewotCQlpbnQgc2VsZWN0ZWRJdGVtc1NpemUgPSB0aGlzLnNlbGVjdGVkSXRlbXNNb2RlbC5zaXplKCk7Ci0JCWludFtdIHNlbGVjdCA9IG5ldyBpbnRbc2VsZWN0ZWRJdGVtc1NpemVdOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoRSBpdGVtIDogdGhpcy5zZWxlY3RlZEl0ZW1zTW9kZWwpIHsKLQkJCXNlbGVjdFtpKytdID0gdGhpcy5pbmRleE9mKGl0ZW0pOwotCQl9Ci0KLQkJaW50IGxpc3RTaXplID0gdGhpcy5saXN0TW9kZWwuc2l6ZSgpOwotCQlpbnRbXSBkZXNlbGVjdCA9IG5ldyBpbnRbbGlzdFNpemUgLSBzZWxlY3RlZEl0ZW1zU2l6ZV07Ci0JCWkgPSAwOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGxpc3RTaXplOyBqKyspIHsKLQkJCWlmICggISBBcnJheVRvb2xzLmNvbnRhaW5zKHNlbGVjdCwgaikpIHsKLQkJCQlkZXNlbGVjdFtpKytdID0gajsKLQkJCX0KLQkJfQotCi0JCWludFtdIG9sZCA9IEFycmF5VG9vbHMuc29ydCh0aGlzLmxpc3RCb3guZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkJc2VsZWN0ID0gQXJyYXlUb29scy5zb3J0KHNlbGVjdCk7Ci0JCWlmICggISBBcnJheXMuZXF1YWxzKHNlbGVjdCwgb2xkKSkgewotCQkJdGhpcy5saXN0Qm94LmRlc2VsZWN0KGRlc2VsZWN0KTsKLQkJCXRoaXMubGlzdEJveC5zZWxlY3Qoc2VsZWN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMubGlzdEJveC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtc01vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2VsZWN0ZWQgaXRlbXMgKioqKioqKioqKgotCi0Jdm9pZCBzZWxlY3RlZEl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmxpc3RCb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnNlbGVjdGVkSXRlbXNBZGRlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5aW5nIHRoZSBsaXN0IGJveCdzIHNlbGVjdGVkIGl0ZW1zIHByb2dyYW1tYXRpY2FsbHkgZG9lcyBub3QKLQkgKiB0cmlnZ2VyIGEgU2VsZWN0aW9uRXZlbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdGVkSXRlbXNBZGRlZF8oQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2V2ZW50LmdldEl0ZW1zU2l6ZSgpXTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0SXRlbXMoZXZlbnQpKSB7Ci0JCQlpbmRpY2VzW2krK10gPSB0aGlzLmluZGV4T2YoaXRlbSk7Ci0JCX0KLQkJdGhpcy5saXN0Qm94LnNlbGVjdChpbmRpY2VzKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgSXRlcmFibGU8RT4gZ2V0SXRlbXMoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0Jdm9pZCBzZWxlY3RlZEl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMubGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuc2VsZWN0ZWRJdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1vZGlmeWluZyB0aGUgbGlzdCBib3gncyBzZWxlY3RlZCBpdGVtcyBwcm9ncmFtbWF0aWNhbGx5IGRvZXMgbm90Ci0JICogdHJpZ2dlciBhIFNlbGVjdGlvbkV2ZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCBzZWxlY3RlZEl0ZW1zUmVtb3ZlZF8oQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2V2ZW50LmdldEl0ZW1zU2l6ZSgpXTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0SXRlbXMoZXZlbnQpKSB7Ci0JCQlpbmRpY2VzW2krK10gPSB0aGlzLmluZGV4T2YoaXRlbSk7Ci0JCX0KLQkJdGhpcy5saXN0Qm94LmRlc2VsZWN0KGluZGljZXMpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBJdGVyYWJsZTxFPiBnZXRJdGVtcyhDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQl2b2lkIHNlbGVjdGVkSXRlbXNDbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmxpc3RCb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnNlbGVjdGVkSXRlbXNDbGVhcmVkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnlpbmcgdGhlIGxpc3QgYm94J3Mgc2VsZWN0ZWQgaXRlbXMgcHJvZ3JhbW1hdGljYWxseSBkb2VzIG5vdAotCSAqIHRyaWdnZXIgYSBTZWxlY3Rpb25FdmVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2VsZWN0ZWRJdGVtc0NsZWFyZWRfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RCb3guZGVzZWxlY3RBbGwoKTsKLQl9Ci0KLQl2b2lkIHNlbGVjdGVkSXRlbXNDaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoICEgdGhpcy5saXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdGVkSXRlbXNDaGFuZ2VkXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc3luY2hyb25pemVMaXN0V2lkZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgaW5kZXhPZihFIGl0ZW0pIHsKLQkJaW50IGxlbiA9IHRoaXMubGlzdE1vZGVsLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMubGlzdE1vZGVsLmdldChpKSwgaXRlbSkpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQkvLyBzZWUgY29tbWVudCBpbiBEcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLmluZGV4T2YoRSkKLQkJcmV0dXJuIC0xOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGJveCBldmVudHMgKioqKioqKioqKgotCi0Jdm9pZCBsaXN0Qm94U2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQlpZiAoICEgdGhpcy5saXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5saXN0Qm94U2VsZWN0aW9uQ2hhbmdlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0Jdm9pZCBsaXN0Qm94RG91YmxlQ2xpY2tlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQlpZiAoICEgdGhpcy5saXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5saXN0Qm94U2VsZWN0aW9uQ2hhbmdlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxpc3RCb3hTZWxlY3Rpb25DaGFuZ2VkXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1zTW9kZWwuc2V0VmFsdWVzKHRoaXMuZ2V0TGlzdEJveFNlbGVjdGVkSXRlbXMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxFPiBnZXRMaXN0Qm94U2VsZWN0ZWRJdGVtcygpIHsKLQkJQXJyYXlMaXN0PEU+IHNlbGVjdGVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEU+KHRoaXMubGlzdEJveC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkJZm9yIChpbnQgc2VsZWN0aW9uSW5kZXggOiB0aGlzLmxpc3RCb3guZ2V0U2VsZWN0aW9uSW5kaWNlcygpKSB7Ci0JCQlzZWxlY3RlZEl0ZW1zLmFkZCh0aGlzLmxpc3RNb2RlbC5nZXQoc2VsZWN0aW9uSW5kZXgpKTsKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWRJdGVtczsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnNlbGVjdGVkSXRlbXNNb2RlbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0xpc3RXaWRnZXRNb2RlbEJpbmRpbmcuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvTGlzdFdpZGdldE1vZGVsQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGI5ZTdjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvTGlzdFdpZGdldE1vZGVsQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5LnN3dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGlzIGJpbmRpbmcgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIGxpc3Qgd2lkZ2V0J3MgY29udGVudHMKLSAqIHN5bmNocm9uaXplZCB3aXRoIGEgbW9kZWwuIFRoZSBsaXN0IHdpZGdldCBuZXZlciBhbHRlcnMKLSAqIGl0cyBjb250ZW50cyBkaXJlY3RseTsgYWxsIGNoYW5nZXMgYXJlIGRyaXZlbiBieSB0aGUgbW9kZWwuCi0gKiAKLSAqIEBzZWUgTGlzdFZhbHVlTW9kZWwKLSAqIEBzZWUgU3RyaW5nQ29udmVydGVyCi0gKiBAc2VlIExpc3RXaWRnZXQKLSAqIEBzZWUgU2VsZWN0aW9uQmluZGluZwotICogQHNlZSBTV1RUb29scwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLWZpbmFsIGNsYXNzIExpc3RXaWRnZXRNb2RlbEJpbmRpbmc8RT4gewotCi0JLy8gKioqKiogbW9kZWwKLQkvKioKLQkgKiBUaGUgdW5kZXJseWluZyBsaXN0IG1vZGVsLgotCSAqLwotCXByaXZhdGUgZmluYWwgTGlzdFZhbHVlTW9kZWw8RT4gbGlzdE1vZGVsOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgbGlzdCB3aWRnZXQncyBjb250ZW50cyB3aXRoCi0JICogdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBjb252ZXJ0ZXIgdGhhdCBjb252ZXJ0cyBpdGVtcyBpbiB0aGUgbW9kZWwgbGlzdAotCSAqIHRvIHN0cmluZ3MgdGhhdCBjYW4gYmUgcHV0IGluIHRoZSBsaXN0IHdpZGdldC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZ0NvbnZlcnRlcjxFPiBzdHJpbmdDb252ZXJ0ZXI7Ci0KLQkvLyAqKioqKiBVSQotCS8qKgotCSAqIEFuIGFkYXB0ZXIgb24gdGhlIGxpc3Qgd2lkZ2V0IHdlIGtlZXAgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0V2lkZ2V0IGxpc3RXaWRnZXQ7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHN0dWZmIHdoZW4gdGhlIGxpc3Qgd2lkZ2V0Ci0JICogaXMgZGlzcG9zZWQuIChDcml0aWNhbCBmb3IgcHJldmVudGluZyBtZW1vcnkgbGVha3MuKQotCSAqLwotCXByaXZhdGUgZmluYWwgRGlzcG9zZUxpc3RlbmVyIGxpc3RXaWRnZXREaXNwb3NlTGlzdGVuZXI7Ci0KLQkvLyAqKioqKiBzZWxlY3Rpb24KLQkvKioKLQkgKiBXaWRnZXQtc3BlY2lmaWMgc2VsZWN0aW9uIGJpbmRpbmcuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTZWxlY3Rpb25CaW5kaW5nIHNlbGVjdGlvbkJpbmRpbmc7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSBhbGwgcGFyYW1ldGVycyBhcmUgcmVxdWlyZWQuCi0JICovCi0JTGlzdFdpZGdldE1vZGVsQmluZGluZygKLQkJCUxpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwKLQkJCUxpc3RXaWRnZXQgbGlzdFdpZGdldCwKLQkJCVN0cmluZ0NvbnZlcnRlcjxFPiBzdHJpbmdDb252ZXJ0ZXIsCi0JCQlTZWxlY3Rpb25CaW5kaW5nIHNlbGVjdGlvbkJpbmRpbmcKLQkpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChsaXN0TW9kZWwgPT0gbnVsbCkgfHwgKGxpc3RXaWRnZXQgPT0gbnVsbCkgfHwgKHN0cmluZ0NvbnZlcnRlciA9PSBudWxsKSB8fCAoc2VsZWN0aW9uQmluZGluZyA9PSBudWxsKSkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0TW9kZWwgPSBsaXN0TW9kZWw7Ci0JCXRoaXMubGlzdFdpZGdldCA9IGxpc3RXaWRnZXQ7Ci0JCXRoaXMuc3RyaW5nQ29udmVydGVyID0gc3RyaW5nQ29udmVydGVyOwotCQl0aGlzLnNlbGVjdGlvbkJpbmRpbmcgPSBzZWxlY3Rpb25CaW5kaW5nOwotCi0JCXRoaXMubGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLmxpc3RXaWRnZXREaXNwb3NlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdFdpZGdldERpc3Bvc2VMaXN0ZW5lcigpOwotCQl0aGlzLmxpc3RXaWRnZXQuYWRkRGlzcG9zZUxpc3RlbmVyKHRoaXMubGlzdFdpZGdldERpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zeW5jaHJvbml6ZUxpc3RXaWRnZXQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLnRoaXMubGlzdEl0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJCUxpc3RXaWRnZXRNb2RlbEJpbmRpbmcudGhpcy5saXN0SXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCUxpc3RXaWRnZXRNb2RlbEJpbmRpbmcudGhpcy5saXN0SXRlbXNNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLnRoaXMubGlzdEl0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLnRoaXMubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFdpZGdldE1vZGVsQmluZGluZy50aGlzLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgRGlzcG9zZUxpc3RlbmVyIGJ1aWxkTGlzdFdpZGdldERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLnRoaXMubGlzdFdpZGdldERpc3Bvc2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3Qgd2lkZ2V0IGRpc3Bvc2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEJydXRlIGZvcmNlIHN5bmNocm9uaXphdGlvbiBvZiBsaXN0IHdpZGdldCB3aXRoIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXByaXZhdGUgdm9pZCBzeW5jaHJvbml6ZUxpc3RXaWRnZXQoKSB7Ci0JCWlmICggISB0aGlzLmxpc3RXaWRnZXQuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnN5bmNocm9uaXplTGlzdFdpZGdldF8oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jaHJvbml6ZUxpc3RXaWRnZXRfKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPih0aGlzLmxpc3RNb2RlbC5zaXplKCkpOwotCQlmb3IgKEUgaXRlbSA6IHRoaXMubGlzdE1vZGVsKSB7Ci0JCQlpdGVtcy5hZGQodGhpcy5jb252ZXJ0KGl0ZW0pKTsKLQkJfQotCQl0aGlzLmxpc3RXaWRnZXQuc2V0SXRlbXMoaXRlbXMudG9BcnJheShuZXcgU3RyaW5nW2l0ZW1zLnNpemUoKV0pKTsKLQotCQkvLyBub3cgdGhhdCB0aGUgbGlzdCBoYXMgY2hhbmdlZCwgd2UgbmVlZCB0byBzeW5jaCB0aGUgc2VsZWN0aW9uCi0JCXRoaXMuc2VsZWN0aW9uQmluZGluZy5zeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgbGlzdCB3aWRnZXQuCi0JICovCi0Jdm9pZCBsaXN0SXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMubGlzdFdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMubGlzdEl0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsaXN0SXRlbXNBZGRlZF8oTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCWludCBpID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJZm9yIChFIGl0ZW0gOiB0aGlzLmdldEl0ZW1zKGV2ZW50KSkgewotCQkJdGhpcy5saXN0V2lkZ2V0LmFkZCh0aGlzLmNvbnZlcnQoaXRlbSksIGkrKyk7Ci0JCX0KLQotCQkvLyBub3cgdGhhdCB0aGUgbGlzdCBoYXMgY2hhbmdlZCwgd2UgbmVlZCB0byBzeW5jaCB0aGUgc2VsZWN0aW9uCi0JCXRoaXMuc2VsZWN0aW9uQmluZGluZy5zeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgSXRlcmFibGU8RT4gZ2V0SXRlbXMoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGxpc3Qgd2lkZ2V0LgotCSAqLwotCXZvaWQgbGlzdEl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMubGlzdFdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMubGlzdEl0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxpc3RJdGVtc1JlbW92ZWRfKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RXaWRnZXQucmVtb3ZlKGV2ZW50LmdldEluZGV4KCksIGV2ZW50LmdldEluZGV4KCkgKyBldmVudC5nZXRJdGVtc1NpemUoKSAtIDEpOwotCi0JCS8vIG5vdyB0aGF0IHRoZSBsaXN0IGhhcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHN5bmNoIHRoZSBzZWxlY3Rpb24KLQkJdGhpcy5zZWxlY3Rpb25CaW5kaW5nLnN5bmNocm9uaXplTGlzdFdpZGdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBsaXN0IHdpZGdldC4KLQkgKi8KLQl2b2lkIGxpc3RJdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMubGlzdFdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMubGlzdEl0ZW1zTW92ZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsaXN0SXRlbXNNb3ZlZF8oTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlpbnQgdGFyZ2V0ID0gZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKTsKLQkJaW50IHNvdXJjZSA9IGV2ZW50LmdldFNvdXJjZUluZGV4KCk7Ci0JCWludCBsZW4gPSBldmVudC5nZXRMZW5ndGgoKTsKLQkJaW50IGxvU3RhcnQgPSBNYXRoLm1pbih0YXJnZXQsIHNvdXJjZSk7Ci0JCWludCBoaVN0YXJ0ID0gTWF0aC5tYXgodGFyZ2V0LCBzb3VyY2UpOwotCQkvLyBtYWtlIGEgY29weSBvZiB0aGUgYWZmZWN0ZWQgaXRlbXMuLi4KLQkJU3RyaW5nW10gc3ViQXJyYXkgPSBBcnJheVRvb2xzLnN1YkFycmF5KHRoaXMubGlzdFdpZGdldC5nZXRJdGVtcygpLCBsb1N0YXJ0LCBoaVN0YXJ0ICsgbGVuKTsKLQkJLy8gLi4ubW92ZSB0aGVtIGFyb3VuZC4uLgotCQlzdWJBcnJheSA9IEFycmF5VG9vbHMubW92ZShzdWJBcnJheSwgdGFyZ2V0IC0gbG9TdGFydCwgc291cmNlIC0gbG9TdGFydCwgbGVuKTsKLQkJLy8gLi4uYW5kIHRoZW4gcHV0IHRoZW0gYmFjawotCQlpbnQgaSA9IGxvU3RhcnQ7Ci0JCWZvciAoU3RyaW5nIGl0ZW0gOiBzdWJBcnJheSkgewotCQkJdGhpcy5saXN0V2lkZ2V0LnNldEl0ZW0oaSsrLCBpdGVtKTsKLQkJfQotCi0JCS8vIG5vdyB0aGF0IHRoZSBsaXN0IGhhcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHN5bmNoIHRoZSBzZWxlY3Rpb24KLQkJdGhpcy5zZWxlY3Rpb25CaW5kaW5nLnN5bmNocm9uaXplTGlzdFdpZGdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBsaXN0IHdpZGdldC4KLQkgKi8KLQl2b2lkIGxpc3RJdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMubGlzdFdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMubGlzdEl0ZW1zUmVwbGFjZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsaXN0SXRlbXNSZXBsYWNlZF8oTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlpbnQgaSA9IGV2ZW50LmdldEluZGV4KCk7Ci0JCWZvciAoRSBpdGVtIDogdGhpcy5nZXROZXdJdGVtcyhldmVudCkpIHsKLQkJCXRoaXMubGlzdFdpZGdldC5zZXRJdGVtKGkrKywgdGhpcy5jb252ZXJ0KGl0ZW0pKTsKLQkJfQotCi0JCS8vIG5vdyB0aGF0IHRoZSBsaXN0IGhhcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHN5bmNoIHRoZSBzZWxlY3Rpb24KLQkJdGhpcy5zZWxlY3Rpb25CaW5kaW5nLnN5bmNocm9uaXplTGlzdFdpZGdldFNlbGVjdGlvbigpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBJdGVyYWJsZTxFPiBnZXROZXdJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldE5ld0l0ZW1zKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGxpc3Qgd2lkZ2V0LgotCSAqLwotCXZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMubGlzdFdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMubGlzdENsZWFyZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsaXN0Q2xlYXJlZF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdFdpZGdldC5yZW1vdmVBbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgbGlzdCB3aWRnZXQuCi0JICovCi0Jdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMubGlzdFdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMubGlzdENoYW5nZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsaXN0Q2hhbmdlZF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnN5bmNocm9uaXplTGlzdFdpZGdldF8oKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhlIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgc3BlY2lmaWVkIGl0ZW0gdG8gYQotCSAqIHN0cmluZyB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCB3aWRnZXQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY29udmVydChFIGl0ZW0pIHsKLQkJcmV0dXJuIHRoaXMuc3RyaW5nQ29udmVydGVyLmNvbnZlcnRUb1N0cmluZyhpdGVtKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCB3aWRnZXQgZXZlbnRzICoqKioqKioqKioKLQotCXZvaWQgbGlzdFdpZGdldERpc3Bvc2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdGhlIGxpc3Qgd2lkZ2V0IGlzIG5vdCB5ZXQgImRpc3Bvc2VkIiB3aGVuIHdlIHJlY2VpdmUgdGhpcyBldmVudAotCQkvLyBzbyB3ZSBjYW4gc3RpbGwgcmVtb3ZlIG91ciBsaXN0ZW5lcnMKLQkJdGhpcy5saXN0V2lkZ2V0LnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLmxpc3RXaWRnZXREaXNwb3NlTGlzdGVuZXIpOwotCQl0aGlzLmxpc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5zZWxlY3Rpb25CaW5kaW5nLmRpc3Bvc2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RNb2RlbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkYXB0ZXIgaW50ZXJmYWNlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGFwdGVyIHVzZWQgYnkgdGhlIGxpc3Qgd2lkZ2V0IG1vZGVsIGJpbmRpbmcgdG8gcXVlcnkgYW5kIG1hbmlwdWxhdGUKLQkgKiB0aGUgd2lkZ2V0LgotCSAqLwotCWludGVyZmFjZSBMaXN0V2lkZ2V0IHsKLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3Qgd2lkZ2V0IGlzICJkaXNwb3NlZCIuCi0JCSAqLwotCQlib29sZWFuIGlzRGlzcG9zZWQoKTsKLQotCQkvKioKLQkJICogQWRkIHRoZSBzcGVjaWZpZWQgZGlzcG9zZSBsaXN0ZW5lciB0byB0aGUgbGlzdCB3aWRnZXQuCi0JCSAqLwotCQl2b2lkIGFkZERpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JCS8qKgotCQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBkaXNwb3NlIGxpc3RlbmVyIGZyb20gdGhlIGxpc3Qgd2lkZ2V0LgotCQkgKi8KLQkJdm9pZCByZW1vdmVEaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBsaXN0IHdpZGdldCdzIGl0ZW1zLgotCQkgKi8KLQkJU3RyaW5nW10gZ2V0SXRlbXMoKTsKLQotCQkvKioKLQkJICogU2V0IHRoZSBsaXN0IHdpZGdldCdzIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBpbmRleCB0byB0aGUgc3BlY2lmaWVkIGl0ZW0uCi0JCSAqLwotCQl2b2lkIHNldEl0ZW0oaW50IGluZGV4LCBTdHJpbmcgaXRlbSk7Ci0KLQkJLyoqCi0JCSAqIFNldCB0aGUgbGlzdCB3aWRnZXQncyBpdGVtcy4KLQkJICovCi0JCXZvaWQgc2V0SXRlbXMoU3RyaW5nW10gaXRlbXMpOwotCi0JCS8qKgotCQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtIHRvIHRoZSBsaXN0IHdpZGdldCdzIGl0ZW1zIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JCSAqLwotCQl2b2lkIGFkZChTdHJpbmcgaXRlbSwgaW50IGluZGV4KTsKLQotCQkvKioKLQkJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb2YgaXRlbXMgZnJvbSB0aGUgbGlzdCB3aWRnZXQncyBpdGVtcy4KLQkJICovCi0JCXZvaWQgcmVtb3ZlKGludCBzdGFydCwgaW50IGVuZCk7Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSBhbGwgdGhlIGl0ZW1zIGZyb20gdGhlIGxpc3Qgd2lkZ2V0LgotCQkgKi8KLQkJdm9pZCByZW1vdmVBbGwoKTsKLQotCX0KLQotCi0JLyoqCi0JICogV2lkZ2V0LXNwZWNpZmljIHNlbGVjdGlvbiBiaW5kaW5nIHRoYXQgaXMgY29udHJvbGxlZCBieSB0aGUgbGlzdCB3aWRnZXQKLQkgKiBtb2RlbCBiaW5kaW5nLgotCSAqLwotCWludGVyZmFjZSBTZWxlY3Rpb25CaW5kaW5nIHsKLQotCQkvKioKLQkJICogU3luY2hyb25pemUgdGhlIHNlbGVjdGlvbiBiaW5kaW5nJ3Mgd2lkZ2V0IHdpdGggdGhlIHNlbGVjdGlvbiBtb2RlbC4KLQkJICogPHA+Ci0JCSAqIFByZS1jb25kaXRpb246IFRoZSB3aWRnZXQgaXMgbm90IGRpc3Bvc2VkLgotCQkgKi8KLQkJdm9pZCBzeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIHdpZGdldCBoYXMgYmVlbiBkaXNwb3NlZDsgZGlzcG9zZSB0aGUgc2VsZWN0aW9uIGJpbmRpbmcuCi0JCSAqLwotCQl2b2lkIGRpc3Bvc2UoKTsKLQotCi0JCS8qKgotCQkgKiBVc2VmdWwgZm9yIGxpc3QgYm94ZXMgdGhhdCBpZ25vcmUgdGhlIHNlbGVjdGlvbi4KLQkJICovCi0JCWZpbmFsIGNsYXNzIE51bGwgaW1wbGVtZW50cyBTZWxlY3Rpb25CaW5kaW5nIHsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU2VsZWN0aW9uQmluZGluZyBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCQlwdWJsaWMgc3RhdGljIFNlbGVjdGlvbkJpbmRpbmcgaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJTZWxlY3Rpb25CaW5kaW5nLk51bGwiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9NdWx0aUNvbnRyb2xCb29sZWFuU3RhdGVDb250cm9sbGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L011bHRpQ29udHJvbEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM0OGFkOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L011bHRpQ29udHJvbEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNuYXBzaG90Q2xvbmVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBUaGlzIGNvbnRyb2xsZXIgZW5hYmxlcyBhIGJvb2xlYW4gbW9kZWwgdG8gY29udHJvbCBlaXRoZXIgdGhlCi0gKiA8ZW0+ZW5hYmxlZDwvZW0+IG9yIDxlbT52aXNpYmxlPC9lbT4gcHJvcGVydGllcyBvZiBhIHNldCBvZiBTV1QgY29udHJvbHM7Ci0gKiBpLmUuIHRoZSBjb250cm9scycgcHJvcGVydGllcyBhcmUga2VwdCBpbiBzeW5jaCB3aXRoIHRoZSBib29sZWFuIG1vZGVsLAotICogYnV0IDxlbT5ub3Q8L2VtPiB2aWNlLXZlcnNhLgotICogCi0gKiBAc2VlIFByb3BlcnR5VmFsdWVNb2RlbAotICogQHNlZSBDb2xsZWN0aW9uVmFsdWVNb2RlbAotICogQHNlZSBDb250cm9sI3NldEVuYWJsZWQoYm9vbGVhbikKLSAqIEBzZWUgQ29udHJvbCNzZXRWaXNpYmxlKGJvb2xlYW4pCi0gKi8KLWZpbmFsIGNsYXNzIE11bHRpQ29udHJvbEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIKLQlleHRlbmRzIEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIKLXsKLQkvKioKLQkgKiBUaGUgc2V0IG9mIGNvbnRyb2xzIHdob3NlIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIG1vZGVsLgotCSAqLwotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzTW9kZWw7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIGNsaWVudHMgdG8gYWRkL3JlbW92ZSBjb250cm9scy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBjb250cm9sc0xpc3RlbmVyOwotCi0JLyoqCi0JICogQ2FjaGUgb2YgY29udHJvbHMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBIYXNoU2V0PENvbnRyb2w+IGNvbnRyb2xzID0gbmV3IEhhc2hTZXQ8Q29udHJvbD4oKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBib29sZWFuIG1vZGVsLCB0aGUgY29udHJvbHMgbW9kZWwsIGFuZCB0aGUgYWRhcHRlciBhcmUgcmVxdWlyZWQuCi0JICovCi0JTXVsdGlDb250cm9sQm9vbGVhblN0YXRlQ29udHJvbGxlcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsCi0JCQlDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHNNb2RlbCwKLQkJCWJvb2xlYW4gZGVmYXVsdFZhbHVlLAotCQkJQWRhcHRlciBhZGFwdGVyCi0JKSB7Ci0JCXN1cGVyKGJvb2xlYW5Nb2RlbCwgZGVmYXVsdFZhbHVlLCBhZGFwdGVyKTsKLQkJaWYgKGNvbnRyb2xzTW9kZWwgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb250cm9sc01vZGVsID0gY29udHJvbHNNb2RlbDsKLQkJdGhpcy5jb250cm9sc0xpc3RlbmVyID0gdGhpcy5idWlsZENvbnRyb2xzTGlzdGVuZXIoKTsKLQkJdGhpcy5hZGRDb250cm9scyhjb250cm9sc01vZGVsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRDb250cm9sc0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbnRyb2xzTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKiBDVSBwcml2YXRlICovIGNsYXNzIENvbnRyb2xzTGlzdGVuZXIKLQkJZXh0ZW5kcyBDb2xsZWN0aW9uQ2hhbmdlQWRhcHRlcgotCXsKLQkJQE92ZXJyaWRlCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJTXVsdGlDb250cm9sQm9vbGVhblN0YXRlQ29udHJvbGxlci50aGlzLmFkZENvbnRyb2xzKChJdGVyYWJsZTw/IGV4dGVuZHMgQ29udHJvbD4pIGV2ZW50LmdldEl0ZW1zKCkpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJTXVsdGlDb250cm9sQm9vbGVhblN0YXRlQ29udHJvbGxlci50aGlzLnJlbW92ZUNvbnRyb2xzKChJdGVyYWJsZTw/IGV4dGVuZHMgQ29udHJvbD4pIGV2ZW50LmdldEl0ZW1zKCkpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJTXVsdGlDb250cm9sQm9vbGVhblN0YXRlQ29udHJvbGxlci50aGlzLmNsZWFyQ29udHJvbHMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJTXVsdGlDb250cm9sQm9vbGVhblN0YXRlQ29udHJvbGxlci50aGlzLmNsZWFyQ29udHJvbHMoKTsKLQkJCU11bHRpQ29udHJvbEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIudGhpcy5hZGRDb250cm9scygoSXRlcmFibGU8PyBleHRlbmRzIENvbnRyb2w+KSBldmVudC5nZXRDb2xsZWN0aW9uKCkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnRyb2xzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXZvaWQgc2V0Q29udHJvbFN0YXRlKGJvb2xlYW4gY29udHJvbFN0YXRlKSB7Ci0JCWZvciAoQ29udHJvbCBjb250cm9sIDogdGhpcy5jb250cm9scykgewotCQkJdGhpcy5zZXRDb250cm9sU3RhdGUoY29udHJvbCwgY29udHJvbFN0YXRlKTsKLQkJfQotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gdm9pZCBhZGRDb250cm9scyhJdGVyYWJsZTw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHNfKSB7Ci0JCWZvciAoQ29udHJvbCBjb250cm9sIDogY29udHJvbHNfKSB7Ci0JCQl0aGlzLmFkZENvbnRyb2woY29udHJvbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ29udHJvbChDb250cm9sIGNvbnRyb2wpIHsKLQkJaWYgKHRoaXMuY29udHJvbHMuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmVuZ2FnZUJvb2xlYW5Nb2RlbCgpOwotCQkJdGhpcy5jb250cm9sc01vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuY29udHJvbHNMaXN0ZW5lcik7Ci0JCX0KLQkJaWYgKHRoaXMuY29udHJvbHMuYWRkKGNvbnRyb2wpKSB7Ci0JCQl0aGlzLmVuZ2FnZUNvbnRyb2woY29udHJvbCk7Ci0JCQkvLyB3YWl0IHVudGlsIHRoZSBtb2RlbHMgYXJlIGVuZ2FnZWQgdG8gZ2V0IHRoZSBib29sZWFuIHZhbHVlLi4uIDotKQotCQkJdGhpcy5zZXRDb250cm9sU3RhdGUoY29udHJvbCwgdGhpcy5nZXRCb29sZWFuVmFsdWUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkdXBsaWNhdGUgY29udHJvbDogIiArIGNvbnRyb2wpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiBDVSBwcml2YXRlICovIHZvaWQgY2xlYXJDb250cm9scygpIHsKLQkJdGhpcy5yZW1vdmVDb250cm9scyhuZXcgU25hcHNob3RDbG9uZUl0ZXJhYmxlPENvbnRyb2w+KHRoaXMuY29udHJvbHMpKTsKLQl9Ci0KLQkvKiBDVSBwcml2YXRlICovIHZvaWQgcmVtb3ZlQ29udHJvbHMoSXRlcmFibGU8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzXykgewotCQlmb3IgKENvbnRyb2wgY29udHJvbCA6IGNvbnRyb2xzXykgewotCQkJdGhpcy5kaXNlbmdhZ2VDb250cm9sKGNvbnRyb2wpOwotCQkJdGhpcy5yZW1vdmVDb250cm9sKGNvbnRyb2wpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNvbnRyb2woQ29udHJvbCBjb250cm9sKSB7Ci0JCXRoaXMuY29udHJvbHMucmVtb3ZlKGNvbnRyb2wpOwotCQlpZiAodGhpcy5jb250cm9scy5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuY29udHJvbHNNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmNvbnRyb2xzTGlzdGVuZXIpOwotCQkJdGhpcy5kaXNlbmdhZ2VCb29sZWFuTW9kZWwoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgY29udHJvbERpc3Bvc2VkKENvbnRyb2wgY29udHJvbCkgewotCQlzdXBlci5jb250cm9sRGlzcG9zZWQoY29udHJvbCk7Ci0JCXRoaXMucmVtb3ZlQ29udHJvbChjb250cm9sKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NXVENvbWJvQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9TV1RDb21ib0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyNTI0ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NXVENvbWJvQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLQotLyoqCi0gKiBBZGFwdCBhbiBTV1Qge0BsaW5rIENvbWJvfSB0byB0aGUgbGlzdCB3aWRnZXQgZXhwZWN0ZWQgYnkKLSAqIHtAbGluayBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nfSBhbmQgdGhlCi0gKiBkcm9wLWRvd24gbGlzdCBib3ggZXhwZWN0ZWQgYnkge0BsaW5rIERyb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmd9LgotICovCi1maW5hbCBjbGFzcyBTV1RDb21ib0FkYXB0ZXIKLQlleHRlbmRzIEFic3RyYWN0TGlzdFdpZGdldEFkYXB0ZXI8Q29tYm8+Ci0JaW1wbGVtZW50cyBEcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLkRyb3BEb3duTGlzdEJveAotewotCVNXVENvbWJvQWRhcHRlcihDb21ibyBjb21ibykgewotCQlzdXBlcihjb21ibyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLkxpc3RXaWRnZXQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmdbXSBnZXRJdGVtcygpIHsKLQkJcmV0dXJuIHRoaXMud2lkZ2V0LmdldEl0ZW1zKCk7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEl0ZW0oaW50IGluZGV4LCBTdHJpbmcgaXRlbSkgewotCQl0aGlzLndpZGdldC5zZXRJdGVtKGluZGV4LCBpdGVtKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0SXRlbXMoU3RyaW5nW10gaXRlbXMpIHsKLQkJdGhpcy53aWRnZXQuc2V0SXRlbXMoaXRlbXMpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIGl0ZW0sIGludCBpbmRleCkgewotCQl0aGlzLndpZGdldC5hZGQoaXRlbSwgaW5kZXgpOwotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCXRoaXMud2lkZ2V0LnJlbW92ZShzdGFydCwgZW5kKTsKLQl9Ci0JcHVibGljIHZvaWQgcmVtb3ZlQWxsKCkgewotCQl0aGlzLndpZGdldC5yZW1vdmVBbGwoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENvbWJvQm94U2VsZWN0aW9uQmluZGluZy5Db21ib0JveCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy53aWRnZXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLndpZGdldC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCXB1YmxpYyBpbnQgZ2V0U2VsZWN0aW9uSW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLndpZGdldC5nZXRTZWxlY3Rpb25JbmRleCgpOwotCX0KLQlwdWJsaWMgdm9pZCBzZWxlY3QoaW50IGluZGV4KSB7Ci0JCXRoaXMud2lkZ2V0LnNlbGVjdChpbmRleCk7Ci0JfQotCXB1YmxpYyB2b2lkIGRlc2VsZWN0KGludCBpbmRleCkgewotCQl0aGlzLndpZGdldC5kZXNlbGVjdChpbmRleCk7Ci0JfQotCXB1YmxpYyB2b2lkIGRlc2VsZWN0QWxsKCkgewotCQl0aGlzLndpZGdldC5kZXNlbGVjdEFsbCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvU1dUTGlzdEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvU1dUTGlzdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3YmUxYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NXVExpc3RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci0KLS8qKgotICogQWRhcHQgYW4gU1dUIHtAbGluayBMaXN0fSB0byB0aGUgbGlzdCB3aWRnZXQgZXhwZWN0ZWQgYnkKLSAqIHtAbGluayBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nfS4KLSAqLwotZmluYWwgY2xhc3MgU1dUTGlzdEFkYXB0ZXIKLQlleHRlbmRzIEFic3RyYWN0TGlzdFdpZGdldEFkYXB0ZXI8TGlzdD4KLXsKLQlTV1RMaXN0QWRhcHRlcihMaXN0IGxpc3QpIHsKLQkJc3VwZXIobGlzdCk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMud2lkZ2V0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy53aWRnZXQucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0SXRlbXMoKSB7Ci0JCXJldHVybiB0aGlzLndpZGdldC5nZXRJdGVtcygpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRJdGVtKGludCBpbmRleCwgU3RyaW5nIGl0ZW0pIHsKLQkJdGhpcy53aWRnZXQuc2V0SXRlbShpbmRleCwgaXRlbSk7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEl0ZW1zKFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCXRoaXMud2lkZ2V0LnNldEl0ZW1zKGl0ZW1zKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkKFN0cmluZyBpdGVtLCBpbnQgaW5kZXgpIHsKLQkJdGhpcy53aWRnZXQuYWRkKGl0ZW0sIGluZGV4KTsKLQl9Ci0JcHVibGljIHZvaWQgcmVtb3ZlKGludCBzdGFydCwgaW50IGVuZCkgewotCQl0aGlzLndpZGdldC5yZW1vdmUoc3RhcnQsIGVuZCk7Ci0JfQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHsKLQkJdGhpcy53aWRnZXQucmVtb3ZlQWxsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9TV1RUb29scy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9TV1RUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODM0YmI4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvU1dUVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJpdFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0vKioKLSAqIFZhcmlvdXMgU1dUIHRvb2xzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBTV1RUb29scyB7Ci0KLQkvLyAqKioqKioqKioqIGNoZWNrLWJveC9yYWRpbyBidXR0b24vdG9nZ2xlIGJ1dHRvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCaW5kIHRoZSBzcGVjaWZpZWQgYnV0dG9uIChjaGVjay1ib3gsIHJhZGlvIGJ1dHRvbiwgb3IgdG9nZ2xlIGJ1dHRvbikKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGJvb2xlYW4gbW9kZWwuCi0JICogSWYgdGhlIGJvb2xlYW4gbW9kZWwgaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGJ1dHRvbidzICdzZWxlY3Rpb24nIHN0YXRlIHdpbGwKLQkgKiBiZSA8Y29kZT5mYWxzZTxjb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYmluZChNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgQnV0dG9uIGJ1dHRvbikgewotCQliaW5kKGJvb2xlYW5Nb2RlbCwgYnV0dG9uLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQmluZCB0aGUgc3BlY2lmaWVkIGJ1dHRvbiAoY2hlY2stYm94LCByYWRpbyBidXR0b24sIG9yIHRvZ2dsZSBidXR0b24pCi0JICogdG8gdGhlIHNwZWNpZmllZCBib29sZWFuIG1vZGVsLgotCSAqIElmIHRoZSBib29sZWFuIG1vZGVsIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBidXR0b24ncyAnc2VsZWN0aW9uJyBzdGF0ZSB3aWxsCi0JICogYmUgdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBiaW5kKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBCdXR0b24gYnV0dG9uLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQkvLyB0aGUgbmV3IGJpbmRpbmcgd2lsbCBhZGQgaXRzZWxmIGFzIGEgbGlzdGVuZXIgdG8gdGhlIGJvb2xlYW4gbW9kZWwgYW5kIHRoZSBidXR0b24KLQkJbmV3IEJvb2xlYW5CdXR0b25Nb2RlbEJpbmRpbmcoYm9vbGVhbk1vZGVsLCBidXR0b24sIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRleHQgZmllbGQgKioqKioqKioqKgotCi0JLyoqCi0JICogQmluZCB0aGUgc3BlY2lmaWVkIHRleHQgbW9kZWwgdG8gdGhlIHNwZWNpZmllZCB0ZXh0IGZpZWxkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IHZvaWQgYmluZChNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dE1vZGVsLCBUZXh0IHRleHRGaWVsZCkgewotCQkvLyB0aGUgbmV3IGJpbmRpbmcgd2lsbCBhZGQgaXRzZWxmIGFzIGEgbGlzdGVuZXIgdG8gdGhlIHRleHQgbW9kZWwgYW5kIHRoZSB0ZXh0IGZpZWxkCi0JCW5ldyBUZXh0RmllbGRNb2RlbEJpbmRpbmcodGV4dE1vZGVsLCB0ZXh0RmllbGQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGJveCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCaW5kIHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYm94LgotCSAqIFRoZSBsaXN0IGJveCBzZWxlY3Rpb24gaXMgaWdub3JlZC4KLQkgKiBVc2UgdGhlIGRlZmF1bHQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBsaXN0IGJveCwgd2hpY2ggY2FsbHMge0BsaW5rIE9iamVjdCN0b1N0cmluZygpfQotCSAqIG9uIHRoZSBpdGVtcyBpbiB0aGUgbW9kZWwgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiB2b2lkIGJpbmQoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdE1vZGVsLCBMaXN0IGxpc3RCb3gpIHsKLQkJYmluZChsaXN0TW9kZWwsIGxpc3RCb3gsIFN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEJpbmQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBib3guCi0JICogVGhlIGxpc3QgYm94IHNlbGVjdGlvbiBpcyBpZ25vcmVkLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3guCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gdm9pZCBiaW5kKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwgTGlzdCBsaXN0Qm94LCBTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyKSB7Ci0JCWJpbmQobGlzdE1vZGVsLCBuZXcgU1dUTGlzdEFkYXB0ZXIobGlzdEJveCksIHN0cmluZ0NvbnZlcnRlcik7Ci0JfQotCi0JLyoqCi0JICogQmluZCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYm94LgotCSAqIFVzZSB0aGUgZGVmYXVsdCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKLQkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxpc3QgYm94LCB3aGljaCBjYWxscyB7QGxpbmsgT2JqZWN0I3RvU3RyaW5nKCl9Ci0JICogb24gdGhlIGl0ZW1zIGluIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IHZvaWQgYmluZChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0TW9kZWwsIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtTW9kZWwsIExpc3QgbGlzdEJveCkgewotCQliaW5kKGxpc3RNb2RlbCwgc2VsZWN0ZWRJdGVtTW9kZWwsIGxpc3RCb3gsIFN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCBhbmQgc2VsZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBib3guCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBsaXN0IGJveC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiB2b2lkIGJpbmQoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdE1vZGVsLCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbU1vZGVsLCBMaXN0IGxpc3RCb3gsIFN0cmluZ0NvbnZlcnRlcjxFPiBzdHJpbmdDb252ZXJ0ZXIpIHsKLQkJY2hlY2tGb3JTaW5nbGVTZWxlY3Rpb25TdHlsZShsaXN0Qm94KTsKLQkJYmluZChsaXN0TW9kZWwsIG5ldyBNb2RpZmlhYmxlUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4oc2VsZWN0ZWRJdGVtTW9kZWwpLCBsaXN0Qm94LCBzdHJpbmdDb252ZXJ0ZXIpOwotCX0KLQotCS8qKgotCSAqIEJpbmQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IGFuZCBzZWxlY3Rpb25zIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBib3guCi0JICogVXNlIHRoZSBkZWZhdWx0IHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3gsIHdoaWNoIGNhbGxzIHtAbGluayBPYmplY3QjdG9TdHJpbmcoKX0KLQkgKiBvbiB0aGUgaXRlbXMgaW4gdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gdm9pZCBiaW5kKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwgTW9kaWZpYWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbXNNb2RlbCwgTGlzdCBsaXN0Qm94KSB7Ci0JCWJpbmQobGlzdE1vZGVsLCBzZWxlY3RlZEl0ZW1zTW9kZWwsIGxpc3RCb3gsIFN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEJpbmQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IGFuZCBzZWxlY3Rpb25zIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBib3guCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBsaXN0IGJveC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiB2b2lkIGJpbmQoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdE1vZGVsLCBNb2RpZmlhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtc01vZGVsLCBMaXN0IGxpc3RCb3gsIFN0cmluZ0NvbnZlcnRlcjxFPiBzdHJpbmdDb252ZXJ0ZXIpIHsKLQkJYmluZCgKLQkJCWxpc3RNb2RlbCwKLQkJCW5ldyBTV1RMaXN0QWRhcHRlcihsaXN0Qm94KSwKLQkJCXN0cmluZ0NvbnZlcnRlciwKLQkJCW5ldyBMaXN0Qm94U2VsZWN0aW9uQmluZGluZzxFPihsaXN0TW9kZWwsIHNlbGVjdGVkSXRlbXNNb2RlbCwgbGlzdEJveCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRm9yU2luZ2xlU2VsZWN0aW9uU3R5bGUoTGlzdCBsaXN0Qm94KSB7Ci0JCWlmICggISBCaXRUb29scy5mbGFnSXNTZXQobGlzdEJveC5nZXRTdHlsZSgpLCBTV1QuU0lOR0xFKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibGlzdCBib3ggbXVzdCBiZSBzaW5nbGUtc2VsZWN0aW9uOiAiICsgbGlzdEJveCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogZHJvcC1kb3duIGxpc3QgYm94ICoqKioqKioqKioKLQotCS8qKgotCSAqIEJpbmQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IGFuZCBzZWxlY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBkcm9wLWRvd24gbGlzdCBib3guCi0JICogVXNlIHRoZSBkZWZhdWx0IHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZHJvcC1kb3duIGxpc3QgYm94LCB3aGljaCBjYWxscyB7QGxpbmsgT2JqZWN0I3RvU3RyaW5nKCl9Ci0JICogb24gdGhlIGl0ZW1zIGluIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IHZvaWQgYmluZChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0TW9kZWwsIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtTW9kZWwsIENvbWJvIGRyb3BEb3duTGlzdEJveCkgewotCQliaW5kKGxpc3RNb2RlbCwgc2VsZWN0ZWRJdGVtTW9kZWwsIGRyb3BEb3duTGlzdEJveCwgU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IGFuZCBzZWxlY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBkcm9wLWRvd24gbGlzdCBib3guCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBkcm9wLWRvd24gbGlzdCBib3guCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gdm9pZCBiaW5kKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1Nb2RlbCwgQ29tYm8gZHJvcERvd25MaXN0Qm94LCBTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyKSB7Ci0JCWNoZWNrRm9yUmVhZE9ubHlTdHlsZShkcm9wRG93bkxpc3RCb3gpOwotCQlTV1RDb21ib0FkYXB0ZXIgY29tYm9BZGFwdGVyID0gbmV3IFNXVENvbWJvQWRhcHRlcihkcm9wRG93bkxpc3RCb3gpOwotCQliaW5kKAotCQkJbGlzdE1vZGVsLAotCQkJY29tYm9BZGFwdGVyLAotCQkJc3RyaW5nQ29udmVydGVyLAotCQkJbmV3IERyb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmc8RT4obGlzdE1vZGVsLCBzZWxlY3RlZEl0ZW1Nb2RlbCwgY29tYm9BZGFwdGVyKQotCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tGb3JSZWFkT25seVN0eWxlKFdpZGdldCBjb21ib0JveCkgewotCQlpZiAoICEgQml0VG9vbHMuZmxhZ0lzU2V0KGNvbWJvQm94LmdldFN0eWxlKCksIFNXVC5SRUFEX09OTFkpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjb21iby1ib3ggbXVzdCBiZSByZWFkLW9ubHk6ICIgKyBjb21ib0JveCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCAid2lkZ2V0IiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCaW5kIHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCB0byB0aGUgc3BlY2lmaWVkIGxpc3Qgd2lkZ2V0LgotCSAqIFRoZSBsaXN0IHdpZGdldCdzIHNlbGVjdGlvbiBpcyBpZ25vcmVkLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3guCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IHZvaWQgYmluZChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0TW9kZWwsIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuTGlzdFdpZGdldCBsaXN0V2lkZ2V0LCBTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyKSB7Ci0JCWJpbmQobGlzdE1vZGVsLCBsaXN0V2lkZ2V0LCBzdHJpbmdDb252ZXJ0ZXIsIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuU2VsZWN0aW9uQmluZGluZy5OdWxsLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEJpbmQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IHRvIHRoZSBzcGVjaWZpZWQgbGlzdCB3aWRnZXQuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgc2VsZWN0aW9uIGJpbmRpbmcgdG8gY29udHJvbCB0aGUgbGlzdCB3aWRnZXQncyBzZWxlY3Rpb24uCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBsaXN0IGJveC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gdm9pZCBiaW5kKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwgTGlzdFdpZGdldE1vZGVsQmluZGluZy5MaXN0V2lkZ2V0IGxpc3RXaWRnZXQsIFN0cmluZ0NvbnZlcnRlcjxFPiBzdHJpbmdDb252ZXJ0ZXIsIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuU2VsZWN0aW9uQmluZGluZyBzZWxlY3Rpb25CaW5kaW5nKSB7Ci0JCS8vIHRoZSBuZXcgYmluZGluZyB3aWxsIGFkZCBpdHNlbGYgYXMgYSBsaXN0ZW5lciB0byB0aGUgdmFsdWUgbW9kZWxzIGFuZCB0aGUgbGlzdCBib3gKLQkJbmV3IExpc3RXaWRnZXRNb2RlbEJpbmRpbmc8RT4obGlzdE1vZGVsLCBsaXN0V2lkZ2V0LCBzdHJpbmdDb252ZXJ0ZXIsIHNlbGVjdGlvbkJpbmRpbmcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiAnZW5hYmxlZCcgc3RhdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+ZW5hYmxlZDwvZW0+IHN0YXRlcyB3aWxsIGJlIDxjb2RlPmZhbHNlPGNvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sRW5hYmxlZFN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIENvbnRyb2wuLi4gY29udHJvbHMpIHsKLQkJY29udHJvbEVuYWJsZWRTdGF0ZShib29sZWFuTW9kZWwsIGNvbnRyb2xzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+ZW5hYmxlZDwvZW0+IHN0YXRlcyB3aWxsIGJlIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udHJvbEVuYWJsZWRTdGF0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb250cm9sW10gY29udHJvbHMsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCXN3aXRjaCAoY29udHJvbHMubGVuZ3RoKSB7Ci0JCQljYXNlIDA6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZW1wdHkgY29udHJvbHMgYXJyYXk6ICIgKyBBcnJheXMudG9TdHJpbmcoY29udHJvbHMpKTsKLQkJCWNhc2UgMToKLQkJCQljb250cm9sRW5hYmxlZFN0YXRlKGJvb2xlYW5Nb2RlbCwgY29udHJvbHNbMF0sIGRlZmF1bHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWNvbnRyb2xFbmFibGVkU3RhdGUoYm9vbGVhbk1vZGVsLCBuZXcgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8Q29udHJvbD4oY29udHJvbHMpLCBkZWZhdWx0VmFsdWUpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+ZW5hYmxlZDwvZW0+IHN0YXRlcyB3aWxsIGJlIDxjb2RlPmZhbHNlPGNvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sRW5hYmxlZFN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9scykgewotCQljb250cm9sRW5hYmxlZFN0YXRlKGJvb2xlYW5Nb2RlbCwgY29udHJvbHMsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb250cm9sIHRoZSA8ZW0+ZW5hYmxlZDwvZW0+IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbHMgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbi4gSWYgdGhlIGJvb2xlYW4gaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGNvbnRyb2xzJwotCSAqIDxlbT5lbmFibGVkPC9lbT4gc3RhdGVzIHdpbGwgYmUgdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sRW5hYmxlZFN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9scywgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJY29udHJvbEVuYWJsZWRTdGF0ZShib29sZWFuTW9kZWwsIG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb250cm9sPihjb250cm9scyksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+ZW5hYmxlZDwvZW0+IHN0YXRlcyB3aWxsIGJlIDxjb2RlPmZhbHNlPGNvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sRW5hYmxlZFN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9sc01vZGVsKSB7Ci0JCWNvbnRyb2xFbmFibGVkU3RhdGUoYm9vbGVhbk1vZGVsLCBjb250cm9sc01vZGVsLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+ZW5hYmxlZDwvZW0+IHN0YXRlcyB3aWxsIGJlIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udHJvbEVuYWJsZWRTdGF0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHNNb2RlbCwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJY29udHJvbChib29sZWFuTW9kZWwsIGNvbnRyb2xzTW9kZWwsIGRlZmF1bHRWYWx1ZSwgRU5BQkxFRF9BREFQVEVSKTsKLQl9Ci0KLQkvKioKLQkgKiBDb250cm9sIHRoZSA8ZW0+ZW5hYmxlZDwvZW0+IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuLiBJZiB0aGUgYm9vbGVhbiBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgY29udHJvbCdzCi0JICogPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZSB3aWxsIGJlIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udHJvbEVuYWJsZWRTdGF0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCWNvbnRyb2woYm9vbGVhbk1vZGVsLCBjb250cm9sLCBkZWZhdWx0VmFsdWUsIEVOQUJMRURfQURBUFRFUik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9vbGVhblN0YXRlQ29udHJvbGxlci5BZGFwdGVyIEVOQUJMRURfQURBUFRFUiA9Ci0JCQluZXcgQm9vbGVhblN0YXRlQ29udHJvbGxlci5BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNldFN0YXRlKENvbnRyb2wgY29udHJvbCwgYm9vbGVhbiBiKSB7Ci0JCQkJCWNvbnRyb2wuc2V0RW5hYmxlZChiKTsKLQkJCQl9Ci0JCQl9OwotICAgCi0KLQkvLyAqKioqKioqKioqICd2aXNpYmxlJyBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb250cm9sIHRoZSA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbHMgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbi4gSWYgdGhlIGJvb2xlYW4gaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGNvbnRyb2xzJwotCSAqIDxlbT52aXNpYmxlPC9lbT4gc3RhdGVzIHdpbGwgYmUgPGNvZGU+ZmFsc2U8Y29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnRyb2xWaXNpYmxlU3RhdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgQ29udHJvbC4uLiBjb250cm9scykgewotCQljb250cm9sVmlzaWJsZVN0YXRlKGJvb2xlYW5Nb2RlbCwgY29udHJvbHMsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb250cm9sIHRoZSA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbHMgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbi4gSWYgdGhlIGJvb2xlYW4gaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGNvbnRyb2xzJwotCSAqIDxlbT52aXNpYmxlPC9lbT4gc3RhdGVzIHdpbGwgYmUgdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sVmlzaWJsZVN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIENvbnRyb2xbXSBjb250cm9scywgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJc3dpdGNoIChjb250cm9scy5sZW5ndGgpIHsKLQkJCWNhc2UgMDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJlbXB0eSBjb250cm9scyBhcnJheTogIiArIEFycmF5cy50b1N0cmluZyhjb250cm9scykpOwotCQkJY2FzZSAxOgotCQkJCWNvbnRyb2xWaXNpYmxlU3RhdGUoYm9vbGVhbk1vZGVsLCBjb250cm9sc1swXSwgZGVmYXVsdFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJY29udHJvbFZpc2libGVTdGF0ZShib29sZWFuTW9kZWwsIG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb250cm9sPihjb250cm9scyksIGRlZmF1bHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb250cm9sIHRoZSA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbHMgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbi4gSWYgdGhlIGJvb2xlYW4gaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGNvbnRyb2xzJwotCSAqIDxlbT52aXNpYmxlPC9lbT4gc3RhdGVzIHdpbGwgYmUgPGNvZGU+ZmFsc2U8Y29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnRyb2xWaXNpYmxlU3RhdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgSXRlcmFibGU8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzKSB7Ci0JCWNvbnRyb2xWaXNpYmxlU3RhdGUoYm9vbGVhbk1vZGVsLCBjb250cm9scywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENvbnRyb2wgdGhlIDxlbT52aXNpYmxlPC9lbT4gc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBjb250cm9scyB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuLiBJZiB0aGUgYm9vbGVhbiBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgY29udHJvbHMnCi0JICogPGVtPnZpc2libGU8L2VtPiBzdGF0ZXMgd2lsbCBiZSB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnRyb2xWaXNpYmxlU3RhdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgSXRlcmFibGU8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQljb250cm9sVmlzaWJsZVN0YXRlKGJvb2xlYW5Nb2RlbCwgbmV3IFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsPENvbnRyb2w+KGNvbnRyb2xzKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb250cm9sIHRoZSA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbHMgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbi4gSWYgdGhlIGJvb2xlYW4gaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGNvbnRyb2xzJwotCSAqIDxlbT52aXNpYmxlPC9lbT4gc3RhdGVzIHdpbGwgYmUgPGNvZGU+ZmFsc2U8Y29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnRyb2xWaXNpYmxlU3RhdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzTW9kZWwpIHsKLQkJY29udHJvbFZpc2libGVTdGF0ZShib29sZWFuTW9kZWwsIGNvbnRyb2xzTW9kZWwsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb250cm9sIHRoZSA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbHMgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbi4gSWYgdGhlIGJvb2xlYW4gaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGNvbnRyb2xzJwotCSAqIDxlbT52aXNpYmxlPC9lbT4gc3RhdGVzIHdpbGwgYmUgdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sVmlzaWJsZVN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9sc01vZGVsLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQljb250cm9sKGJvb2xlYW5Nb2RlbCwgY29udHJvbHNNb2RlbCwgZGVmYXVsdFZhbHVlLCBWSVNJQkxFX0FEQVBURVIpOwotCX0KLQotCS8qKgotCSAqIENvbnRyb2wgdGhlIDxlbT52aXNpYmxlPC9lbT4gc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBjb250cm9sIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9sJ3MKLQkgKiA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlIHdpbGwgYmUgdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sVmlzaWJsZVN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIENvbnRyb2wgY29udHJvbCwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJY29udHJvbChib29sZWFuTW9kZWwsIGNvbnRyb2wsIGRlZmF1bHRWYWx1ZSwgVklTSUJMRV9BREFQVEVSKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBCb29sZWFuU3RhdGVDb250cm9sbGVyLkFkYXB0ZXIgVklTSUJMRV9BREFQVEVSID0KLQkJCW5ldyBCb29sZWFuU3RhdGVDb250cm9sbGVyLkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2V0U3RhdGUoQ29udHJvbCBjb250cm9sLCBib29sZWFuIGIpIHsKLQkJCQkJY29udHJvbC5zZXRWaXNpYmxlKGIpOwotCQkJCX0KLQkJCX07Ci0gICAKLQotCS8vICoqKioqKioqKiogYm9vbGVhbiBzdGF0ZSBjb250cm9sbGVyICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udHJvbChQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHNNb2RlbCwgYm9vbGVhbiBkZWZhdWx0VmFsdWUsIEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuQWRhcHRlciBhZGFwdGVyKSB7Ci0JCS8vIHRoZSBuZXcgY29udHJvbGxlciB3aWxsIGFkZCBpdHNlbGYgYXMgYSBsaXN0ZW5lciB0byB0aGUgdmFsdWUgbW9kZWwgYW5kIHRoZSBjb250cm9scwotCQluZXcgTXVsdGlDb250cm9sQm9vbGVhblN0YXRlQ29udHJvbGxlcihib29sZWFuTW9kZWwsIGNvbnRyb2xzTW9kZWwsIGRlZmF1bHRWYWx1ZSwgYWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb250cm9sKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIENvbnRyb2wgY29udHJvbCwgYm9vbGVhbiBkZWZhdWx0VmFsdWUsIEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuQWRhcHRlciBhZGFwdGVyKSB7Ci0JCS8vIHRoZSBuZXcgY29udHJvbGxlciB3aWxsIGFkZCBpdHNlbGYgYXMgYSBsaXN0ZW5lciB0byB0aGUgdmFsdWUgbW9kZWwgYW5kIHRoZSBjb250cm9scwotCQluZXcgU2ltcGxlQm9vbGVhblN0YXRlQ29udHJvbGxlcihib29sZWFuTW9kZWwsIGNvbnRyb2wsIGRlZmF1bHRWYWx1ZSwgYWRhcHRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBTV1RUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NpbXBsZUJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvU2ltcGxlQm9vbGVhblN0YXRlQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTAzNjQ4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvU2ltcGxlQm9vbGVhblN0YXRlQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIFRoaXMgY29udHJvbGxlciBlbmFibGVzIGEgYm9vbGVhbiBtb2RlbCB0byBjb250cm9sIGVpdGhlciB0aGUKLSAqIDxlbT5lbmFibGVkPC9lbT4gb3IgPGVtPnZpc2libGU8L2VtPiBwcm9wZXJ0aWVzIG9mIGFuIFNXVCBjb250cm9sOyBpLmUuIHRoZQotICogY29udHJvbCdzIHByb3BlcnR5IGlzIGtlcHQgaW4gc3luY2ggd2l0aCB0aGUgYm9vbGVhbiBtb2RlbCwKLSAqIGJ1dCA8ZW0+bm90PC9lbT4gdmljZS12ZXJzYS4KLSAqIDxwPgotICogT25jZSB0aGUgY29udHJvbCBpcyBkaXNwb3NlZCwgdGhpcyBjb250cm9sbGVyIGlzIGthcHV0LgotICogCi0gKiBAc2VlIFByb3BlcnR5VmFsdWVNb2RlbAotICogQHNlZSBDb250cm9sI3NldEVuYWJsZWQoYm9vbGVhbikKLSAqIEBzZWUgQ29udHJvbCNzZXRWaXNpYmxlKGJvb2xlYW4pCi0gKi8KLWZpbmFsIGNsYXNzIFNpbXBsZUJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIKLQlleHRlbmRzIEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIKLXsKLQlwcml2YXRlIGZpbmFsIENvbnRyb2wgY29udHJvbDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBib29sZWFuIG1vZGVsLCB0aGUgY29udHJvbCwgYW5kIHRoZSBhZGFwdGVyIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlTaW1wbGVCb29sZWFuU3RhdGVDb250cm9sbGVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwKLQkJCUNvbnRyb2wgY29udHJvbCwKLQkJCWJvb2xlYW4gZGVmYXVsdFZhbHVlLAotCQkJQWRhcHRlciBhZGFwdGVyCi0JKSB7Ci0JCXN1cGVyKGJvb2xlYW5Nb2RlbCwgZGVmYXVsdFZhbHVlLCBhZGFwdGVyKTsKLQkJaWYgKGNvbnRyb2wgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb250cm9sID0gY29udHJvbDsKLQkJdGhpcy5lbmdhZ2VCb29sZWFuTW9kZWwoKTsKLQkJdGhpcy5lbmdhZ2VDb250cm9sKGNvbnRyb2wpOwotCQl0aGlzLnNldENvbnRyb2xTdGF0ZShjb250cm9sLCB0aGlzLmdldEJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udHJvbHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jdm9pZCBzZXRDb250cm9sU3RhdGUoYm9vbGVhbiBjb250cm9sU3RhdGUpIHsKLQkJdGhpcy5zZXRDb250cm9sU3RhdGUodGhpcy5jb250cm9sLCBjb250cm9sU3RhdGUpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgY29udHJvbERpc3Bvc2VkKENvbnRyb2wgYykgewotCQlzdXBlci5jb250cm9sRGlzcG9zZWQoYyk7Ci0JCXRoaXMuZGlzZW5nYWdlQm9vbGVhbk1vZGVsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9UZXh0RmllbGRNb2RlbEJpbmRpbmcuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvVGV4dEZpZWxkTW9kZWxCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MmVhOGEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9UZXh0RmllbGRNb2RlbEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBUaGlzIGJpbmRpbmcgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIHRleHQgZmllbGQKLSAqIHN5bmNocm9uaXplZCB3aXRoIGEgbW9kZWwgdGV4dC9zdHJpbmcuCi0gKiAKLSAqIEBzZWUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbAotICogQHNlZSBUZXh0Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotY2xhc3MgVGV4dEZpZWxkTW9kZWxCaW5kaW5nIHsKLQotCS8qKgotCSAqIFRoZSB0ZXh0IG1vZGVsIHdlIGtlZXAgc3luY2hyb25pemVkIHdpdGggdGhlIHRleHQgZmllbGQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dE1vZGVsOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgdGV4dCBmaWVsZCdzIGNvbnRlbnRzIHdpdGgKLQkgKiB0aGUgdGV4dCBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdGV4dE1vZGVsQ2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGUgdGV4dCBmaWVsZCB3ZSBrZWVwIHN5bmNocm9uaXplZCB3aXRoIHRoZSB0ZXh0IG1vZGVsLgotCSAqLwotCXByaXZhdGUgZmluYWwgVGV4dCB0ZXh0RmllbGQ7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIG91ciB0ZXh0IG1vZGVsCi0JICogd2l0aCB0aGUgdGV4dCBmaWVsZCdzIGNvbnRlbnRzLgotCSAqLwotCXByaXZhdGUgZmluYWwgTW9kaWZ5TGlzdGVuZXIgdGV4dEZpZWxkTW9kaWZ5TGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHN0dWZmIHdoZW4gdGhlIHRleHQgZmllbGQKLQkgKiBpcyBkaXNwb3NlZC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIERpc3Bvc2VMaXN0ZW5lciB0ZXh0RmllbGREaXNwb3NlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBIbW0uLi4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2V0dGluZ1RleHRGaWVsZFRleHQgPSBmYWxzZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB0ZXh0IG1vZGVsIGFuZCB0ZXh0IGZpZWxkIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlUZXh0RmllbGRNb2RlbEJpbmRpbmcoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRNb2RlbCwgVGV4dCB0ZXh0RmllbGQpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKCh0ZXh0TW9kZWwgPT0gbnVsbCkgfHwgKHRleHRGaWVsZCA9PSBudWxsKSkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy50ZXh0TW9kZWwgPSB0ZXh0TW9kZWw7Ci0JCXRoaXMudGV4dEZpZWxkID0gdGV4dEZpZWxkOwotCi0JCXRoaXMudGV4dE1vZGVsQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGV4dE1vZGVsQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy50ZXh0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudGV4dE1vZGVsQ2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMudGV4dEZpZWxkTW9kaWZ5TGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGV4dEZpZWxkTW9kaWZ5TGlzdGVuZXIoKTsKLQkJdGhpcy50ZXh0RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcy50ZXh0RmllbGRNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJdGhpcy50ZXh0RmllbGREaXNwb3NlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGV4dEZpZWxkRGlzcG9zZUxpc3RlbmVyKCk7Ci0JCXRoaXMudGV4dEZpZWxkLmFkZERpc3Bvc2VMaXN0ZW5lcih0aGlzLnRleHRGaWVsZERpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zZXRUZXh0RmllbGRUZXh0KHRleHRNb2RlbC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVGV4dE1vZGVsQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFRleHRNb2RlbENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRUZXh0TW9kZWxDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGV4dEZpZWxkTW9kZWxCaW5kaW5nLnRoaXMudGV4dE1vZGVsQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0ZXh0IGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIGJ1aWxkVGV4dEZpZWxkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGV4dEZpZWxkTW9kZWxCaW5kaW5nLnRoaXMudGV4dEZpZWxkTW9kaWZpZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRleHQgZmllbGQgbW9kaWZ5IGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIERpc3Bvc2VMaXN0ZW5lciBidWlsZFRleHRGaWVsZERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlUZXh0RmllbGRNb2RlbEJpbmRpbmcudGhpcy50ZXh0RmllbGREaXNwb3NlZCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidGV4dCBmaWVsZCBkaXNwb3NlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGV4dCBtb2RlbCBldmVudHMgKioqKioqKioqKgotCi0JLyogQ1UgcHJpdmF0ZSAqLyB2b2lkIHRleHRNb2RlbENoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoICEgdGhpcy50ZXh0RmllbGQuaXNEaXNwb3NlZCgpKSB7ICAvLyA/Pz8KLQkJCXRoaXMuc2V0VGV4dEZpZWxkVGV4dCgoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUZXh0RmllbGRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCS8vIHRoZSB0ZXh0IG1vZGVsIGNhbiBiZSBudWxsLCBidXQgdGhlIHRleHQgZmllbGQgY2Fubm90Ci0JCXRoaXMuc2V0VGV4dEZpZWxkVGV4dF8oKHRleHQgPT0gbnVsbCkgPyAiIiA6IHRleHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUZXh0RmllbGRUZXh0XyhTdHJpbmcgdGV4dCkgewotCQlpZiAoICEgdGV4dC5lcXVhbHModGhpcy50ZXh0RmllbGQuZ2V0VGV4dCgpKSkgeyAgLy8gPz8/Ci0JCQl0aGlzLnNldFRleHRGaWVsZFRleHRfXyh0ZXh0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUZXh0RmllbGRUZXh0X18oU3RyaW5nIHRleHQpIHsKLQkJdGhpcy5zZXR0aW5nVGV4dEZpZWxkVGV4dCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRleHRGaWVsZC5zZXRUZXh0KHRleHQpOwotCQl9IGZpbmFsbHkgewotCQkJdGhpcy5zZXR0aW5nVGV4dEZpZWxkVGV4dCA9IGZhbHNlOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRleHQgZmllbGQgZXZlbnRzICoqKioqKioqKioKLQotCS8qIENVIHByaXZhdGUgKi8gdm9pZCB0ZXh0RmllbGRNb2RpZmllZCgpIHsKLQkJaWYgKCAhIHRoaXMuc2V0dGluZ1RleHRGaWVsZFRleHQpIHsKLQkJCXRoaXMuc2V0VGV4dE1vZGVsVGV4dCh0aGlzLnRleHRGaWVsZC5nZXRUZXh0KCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFRleHRNb2RlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKCAhIHRleHQuZXF1YWxzKHRoaXMudGV4dE1vZGVsLmdldFZhbHVlKCkpKSB7ICAvLyA/Pz8KLQkJCXRoaXMudGV4dE1vZGVsLnNldFZhbHVlKHRleHQpOwotCQl9Ci0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyB2b2lkIHRleHRGaWVsZERpc3Bvc2VkKCkgewotCQkvLyB0aGUgdGV4dCBmaWVsZCBpcyBub3QgeWV0ICJkaXNwb3NlZCIgd2hlbiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQKLQkJLy8gc28gd2UgY2FuIHN0aWxsIHJlbW92ZSBvdXIgbGlzdGVuZXJzCi0JCXRoaXMudGV4dEZpZWxkLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLnRleHRGaWVsZERpc3Bvc2VMaXN0ZW5lcik7Ci0JCXRoaXMudGV4dEZpZWxkLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMudGV4dEZpZWxkTW9kaWZ5TGlzdGVuZXIpOwotCQl0aGlzLnRleHRNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy50ZXh0TW9kZWxDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy50ZXh0TW9kZWwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0FkZFJlbW92ZUxpc3RQYW5lLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvQWRkUmVtb3ZlTGlzdFBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEwOTU3OS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvQWRkUmVtb3ZlTGlzdFBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LkNvbHVtbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXIuU2VsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXIuU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+IHVzZXMgYSA8Y29kZT5UYWJsZTwvY29kZT4KLSAqIGFzIGl0cyBtYWluIHdpZGdldCwgYSA8Y29kZT5MaXN0PC9jb2RlPiBjYW4ndCBiZSB1c2VkIGJlY2F1c2UgaXQgZG9lc24ndAotICogc3VwcG9ydCBzaG93aW5nIGltYWdlcy4gSG93ZXZlciwgdGhlIHRhYmxlIGlzIGRpc3BsYXllZCBsaWtlIGEgbGlzdC4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3Qgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0gfAotICogfCB8IEl0ZW0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQWRkLi4uICB8IHwKLSAqIHwgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAtLS0tLS0tLS0tLSB8Ci0gKiB8IHwgSXRlbSBuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgRWRpdC4uLiB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAtLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgUmVtb3ZlICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAtLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQWRkUmVtb3ZlTGlzdFBhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEFkZFJlbW92ZVBhbmU8VD4KLXsKLQotCS8qKgotCSAqIFRoZSBtYWluIHdpZGdldCBvZiB0aGlzIGFkZC9yZW1vdmUgcGFuZS4KLQkgKi8KLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVMaXN0UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgdGFibGUgaG9sZGVyJ3MgaXRlbXMKLQkgKi8KLQlwdWJsaWMgQWRkUmVtb3ZlTGlzdFBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsCi0JCSAgICAgIHBhcmVudCwKLQkJICAgICAgYWRhcHRlciwKLQkJICAgICAgbGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBsYWJlbFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFkZFJlbW92ZUxpc3RQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSB0YWJsZSBob2xkZXIncyBpdGVtcwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcGFuZQotCSAqLwotCXB1YmxpYyBBZGRSZW1vdmVMaXN0UGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwKLQkJICAgICAgcGFyZW50LAotCQkgICAgICBhZGFwdGVyLAotCQkgICAgICBsaXN0SG9sZGVyLAotCQkgICAgICBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgIGxhYmVsUHJvdmlkZXIsCi0JCSAgICAgIGhlbHBJZCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVMaXN0UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgdGFibGUgaG9sZGVyJ3MgaXRlbXMKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHBhbmUKLQkgKiBAcGFyYW0gcGFyZW50TWFuYWdlUGFuZSA8Y29kZT50cnVlPC9jb2RlPiB0byBoYXZlIHRoZSBwYXJlbnQgcGFuZSBtYW5hZ2UKLQkgKiB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGlzIHBhbmUKLQkgKi8KLQlwdWJsaWMgQWRkUmVtb3ZlTGlzdFBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwYXJlbnRNYW5hZ2VQYW5lKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwKLQkJICAgICAgcGFyZW50LAotCQkgICAgICBhZGFwdGVyLAotCQkgICAgICBsaXN0SG9sZGVyLAotCQkgICAgICBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgIGxhYmVsUHJvdmlkZXIsCi0JCSAgICAgIGhlbHBJZCwKLQkJICAgICAgcGFyZW50TWFuYWdlUGFuZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVMaXN0UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIHRhYmxlIGhvbGRlcidzIGl0ZW1zCi0JICovCi0JcHVibGljIEFkZFJlbW92ZUxpc3RQYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwKLQkJICAgICAgc3ViamVjdEhvbGRlciwKLQkJICAgICAgcGFyZW50LAotCQkgICAgICBhZGFwdGVyLAotCQkgICAgICBsaXN0SG9sZGVyLAotCQkgICAgICBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgIGxhYmVsUHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlTGlzdFBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0Ci0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSB0YWJsZSBob2xkZXIncyBpdGVtcwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcGFuZQotCSAqLwotCXB1YmxpYyBBZGRSZW1vdmVMaXN0UGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsCi0JCSAgICAgIHN1YmplY3RIb2xkZXIsCi0JCSAgICAgIHBhcmVudCwKLQkJICAgICAgYWRhcHRlciwKLQkJICAgICAgbGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBsYWJlbFByb3ZpZGVyLAotCQkgICAgICBoZWxwSWQpOwotCX0KLQotCXByaXZhdGUgQ29sdW1uQWRhcHRlcjxPYmplY3Q+IGJ1aWxkQ29sdW1uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb2x1bW5BZGFwdGVyPE9iamVjdD4oKSB7Ci0JCQlwdWJsaWMgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltdIGNlbGxNb2RlbHMoT2JqZWN0IHN1YmplY3QpIHsKLQkJCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gdmFsdWVIb2xkZXJzID0gbmV3IE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bMV07Ci0JCQkJdmFsdWVIb2xkZXJzWzBdID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KHN1YmplY3QpOwotCQkJCXJldHVybiB2YWx1ZUhvbGRlcnM7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgY29sdW1uQ291bnQoKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgY29sdW1uTmFtZShpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQlyZXR1cm4gIiI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQlzdXBlci5pdGVtc0FkZGVkKGUpOwotCQlyZXZhbGlkYXRlTGF5b3V0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJc3VwZXIuaXRlbXNNb3ZlZChlKTsKLQkJcmV2YWxpZGF0ZUxheW91dCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQlzdXBlci5pdGVtc1JlbW92ZWQoZSk7Ci0JCXJldmFsaWRhdGVMYXlvdXQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQlzdXBlci5pdGVtc1JlcGxhY2VkKGUpOwotCQlyZXZhbGlkYXRlTGF5b3V0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJc3VwZXIubGlzdENoYW5nZWQoZSk7Ci0JCXJldmFsaWRhdGVMYXlvdXQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCXN1cGVyLmxpc3RDbGVhcmVkKGUpOwotCQlyZXZhbGlkYXRlTGF5b3V0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV2YWxpZGF0ZXMgdGhlIHRhYmxlIGxheW91dCBhZnRlciB0aGUgbGlzdCBvZiBpdGVtcyBoYXMgY2hhbmdlZC4gVGhlCi0JICogbGF5b3V0IGhhcyB0byBiZSBkb25lIGluIGEgbmV3IFVJIHRocmVhZCBiZWNhdXNlIG91ciBsaXN0ZW5lciBtaWdodCBiZQotCSAqIG5vdGlmaWVkIGJlZm9yZSB0aGUgdGFibGUgaGFzIGJlZW4gdXBkYXRlZCAodGFibGUgY29sdW1uIGFkZGVkIG9yIHJlbW92ZWQpLgotCSAqLwotCXByaXZhdGUgdm9pZCByZXZhbGlkYXRlTGF5b3V0KCkgewotCQlTV1RVdGlsLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7IHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmICghdGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJdGFibGUuZ2V0UGFyZW50KCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCQl0YWJsZS5nZXRQYXJlbnQoKS5sYXlvdXQoKTsKLQkJCX0KLQkJfX0pOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoCi0JCQlidWlsZFNlbGVjdGVkSXRlbVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3RlZEl0ZW1Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCWlmICh0YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlnZXRTZWxlY3Rpb25Nb2RlbCgpLnNldFNlbGVjdGVkVmFsdWUoZS5nZXROZXdWYWx1ZSgpKTsKLQkJCQl1cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxPYmplY3Q+IGJ1aWxkU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8T2JqZWN0PigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlRXZlbnQ8T2JqZWN0PiBlKSB7Ci0JCQkJQWRkUmVtb3ZlTGlzdFBhbmUudGhpcy5zZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgYWRkVGFibGVDb250YWluZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGFkZFBhbmUoY29udGFpbmVyLCBidWlsZFRhYmxlQ29udGFpbmVyTGF5b3V0KCkpOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJpdmF0ZSBMYXlvdXQgYnVpbGRUYWJsZUNvbnRhaW5lckxheW91dCgpIHsKLQkJcmV0dXJuIG5ldyBMYXlvdXQoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aEhpbnQsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodEhpbnQsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0KLQkJCQlUYWJsZSB0YWJsZSA9IChUYWJsZSkgY29tcG9zaXRlLmdldENoaWxkcmVuKClbMF07Ci0JCQkJVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW4oMCk7Ci0JCQkJaW50IGNvbHVtbldpZHRoID0gdGFibGVDb2x1bW4uZ2V0V2lkdGgoKTsKLQkJCQlwYWNrQ29sdW1uKHRhYmxlKTsKLQotCQkJCS8vIENhbGN1bGF0ZSB0aGUgdGFibGUgc2l6ZSBhbmQgYWRqdXN0IGl0IHdpdGggdGhlIGhpbnRzCi0JCQkJUG9pbnQgc2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJCQlpZiAod2lkdGhIaW50ICE9IFNXVC5ERUZBVUxUKSB7Ci0JCQkJCXNpemUueCA9IHdpZHRoSGludDsKLQkJCQl9Ci0KLQkJCQlpZiAoaGVpZ2h0SGludCAhPSBTV1QuREVGQVVMVCkgewotCQkJCQlzaXplLnkgPSBoZWlnaHRIaW50OwotCQkJCX0KLQotCQkJCS8vIFJldmVydCB0aGUgY29sdW1uJ3Mgd2lkdGggdG8gaXRzIGN1cnJlbnQgdmFsdWUKLQkJCQl0YWJsZS5zZXRSZWRyYXcoZmFsc2UpOwotCQkJCXRhYmxlLnNldExheW91dERlZmVycmVkKHRydWUpOwotCQkJCXRhYmxlQ29sdW1uLnNldFdpZHRoKGNvbHVtbldpZHRoKTsKLQkJCQl0YWJsZS5zZXRMYXlvdXREZWZlcnJlZChmYWxzZSk7Ci0JCQkJdGFibGUuc2V0UmVkcmF3KHRydWUpOwotCi0JCQkJcmV0dXJuIHNpemU7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgYm9vbGVhbiBpc1ZlcnRpY2FsU2Nyb2xsYmFyQmFyVmlzaWJsZShUYWJsZSB0YWJsZSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWN0YW5nbGUgY2xpZW50QXJlYSkgewotCi0JCQkJLy8gR2V0IHRoZSBoZWlnaHQgb2YgYWxsIHRoZSByb3dzCi0JCQkJaW50IGhlaWdodCA9IHRhYmxlLmdldEl0ZW1Db3VudCgpICogdGFibGUuZ2V0SXRlbUhlaWdodCgpOwotCi0JCQkJLy8gUmVtb3ZlIHRoZSBib3JkZXIgZnJvbSB0aGUgaGVpZ2h0Ci0JCQkJaGVpZ2h0ICs9ICh0YWJsZS5nZXRCb3JkZXJXaWR0aCgpICogMik7Ci0KLQkJCQlyZXR1cm4gKGNsaWVudEFyZWEuaGVpZ2h0IDwgaGVpZ2h0KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0KLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLQotCQkJCWlmIChib3VuZHMud2lkdGggPiAwKSB7Ci0KLQkJCQkJVGFibGUgdGFibGUgPSAoVGFibGUpIGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpWzBdOwotCQkJCQl0YWJsZS5zZXRCb3VuZHMoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQotCQkJCQl1cGRhdGVUYWJsZUNvbHVtbldpZHRoKAotCQkJCQkJdGFibGUsCi0JCQkJCQlib3VuZHMud2lkdGgsCi0JCQkJCQlpc1ZlcnRpY2FsU2Nyb2xsYmFyQmFyVmlzaWJsZSh0YWJsZSwgYm91bmRzKQotCQkJCQkpOwotCQkJCX0KLQkJCX0KLQotCQkJcHJpdmF0ZSB2b2lkIHBhY2tDb2x1bW4oVGFibGUgdGFibGUpIHsKLQotCQkJCVRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKDApOwotCi0JCQkJdGFibGUuc2V0UmVkcmF3KGZhbHNlKTsKLQkJCQl0YWJsZS5zZXRMYXlvdXREZWZlcnJlZCh0cnVlKTsKLQkJCQl0YWJsZUNvbHVtbi5wYWNrKCk7Ci0JCQkJdGFibGUuc2V0TGF5b3V0RGVmZXJyZWQoZmFsc2UpOwotCQkJCXRhYmxlLnNldFJlZHJhdyh0cnVlKTsKLQotCQkJCS8vIENhY2hlIHRoZSBjb2x1bW4gd2lkdGggc28gaXQgY2FuIGJlIHVzZWQgaW4KLQkJCQkvLyB1cGRhdGVUYWJsZUNvbHVtbldpZHRoKCkgd2hlbiBkZXRlcm1pbmUgd2hpY2ggd2lkdGggdG8gdXNlCi0JCQkJdGFibGUuc2V0RGF0YSgKLQkJCQkJImNvbHVtbi53aWR0aCIsCi0JCQkJCUludGVnZXIudmFsdWVPZih0YWJsZUNvbHVtbi5nZXRXaWR0aCgpKQotCQkJCSk7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgdm9pZCB1cGRhdGVUYWJsZUNvbHVtbldpZHRoKFRhYmxlIHRhYmxlLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB2ZXJ0aWNhbFNjcm9sbGJhckJhclZpc2libGUpIHsKLQotCQkJCS8vIFJlbW92ZSB0aGUgYm9yZGVyIGZyb20gdGhlIHdpZHRoCi0JCQkJd2lkdGggLT0gKHRhYmxlLmdldEJvcmRlcldpZHRoKCkgKiAyKTsKLQotCQkJCS8vIFJlbW92ZSB0aGUgc2Nyb2xsYmFyIGZyb20gdGhlIHdpZHRoIGlmIGl0IGlzIHNob3duCi0JCQkJaWYgKHZlcnRpY2FsU2Nyb2xsYmFyQmFyVmlzaWJsZSkgewotCQkJCQl3aWR0aCAtPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKS54OwotCQkJCX0KLQotCQkJCVRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKDApOwotCi0JCQkJLy8gUmV0cmlldmUgdGhlIGNhY2hlZCBjb2x1bW4gd2lkdGgsIHdoaWNoIGlzIHJlcXVpcmVkIGZvcgotCQkJCS8vIGRldGVybWluaW5nIHdoaWNoIHdpZHRoIHRvIHVzZSAodGhlIGNvbHVtbiB3aWR0aCBvciB0aGUKLQkJCQkvLyBjYWxjdWxhdGVkIHdpZHRoKQotCQkJCUludGVnZXIgY29sdW1uV2l0ZGggPSAoSW50ZWdlcikgdGFibGUuZ2V0RGF0YSgiY29sdW1uLndpZHRoIik7Ci0KLQkJCQkvLyBVc2UgdGhlIGNhbGN1bGF0ZWQgd2lkdGggaWYgdGhlIGNvbHVtbiBpcyBzbWFsbGVyLCBvdGhlcndpc2UKLQkJCQkvLyB1c2UgdGhlIGNvbHVtbiB3aWR0aCBhbmQgYSBob3Jpem9udGFsIHNjcm9sbCBiYXIgd2lsbCBzaG93IHVwCi0JCQkJd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgY29sdW1uV2l0ZGgpOwotCi0JCQkJLy8gQWRqdXN0IHRoZSBjb2x1bW4gd2lkdGgKLQkJCQl0YWJsZUNvbHVtbi5zZXRXaWR0aCh3aWR0aCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJVGFibGVMYWJlbFByb3ZpZGVyIGJ1aWxkVGFibGVMYWJlbFByb3ZpZGVyKElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCXJldHVybiBuZXcgVGFibGVMYWJlbFByb3ZpZGVyKChJTGFiZWxQcm92aWRlcikgbGFiZWxQcm92aWRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmxlIGdldE1haW5Db250cm9sKCkgewotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1haW5Db21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJdGFibGUgPSBhZGRVbm1hbmFnZWRUYWJsZSgKLQkJCWFkZFRhYmxlQ29udGFpbmVyKGNvbnRhaW5lciksCi0JCQlTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEksCi0JCQloZWxwSWQKLQkJKTsKLQotCi0JCVRhYmxlTW9kZWxBZGFwdGVyIG1vZGVsID0gVGFibGVNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQkoTGlzdFZhbHVlTW9kZWw8T2JqZWN0PikgbGlzdEhvbGRlciwKLQkJCWdldFNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkVGFibGVMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpCi0JCSk7Ci0KLQkJbW9kZWwuYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQotCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCWJ1aWxkU2VsZWN0ZWRJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpCi0JCSk7Ci0KLQkJaW5pdGlhbGl6ZVRhYmxlKHRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgZ2l2ZW4gdGFibGUsIHdoaWNoIGFjdHMgbGlrZSBhIGxpc3QgaW4gb3VyIGNhc2UuCi0JICoKLQkgKiBAcGFyYW0gdGFibGUgVGhlIG1haW4gd2lkZ2V0IG9mIHRoaXMgcGFuZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUYWJsZShUYWJsZSB0YWJsZSkgewotCi0JCXRhYmxlLnNldERhdGEoImNvbHVtbi53aWR0aCIsIG5ldyBJbnRlZ2VyKDApKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZCwgdXBkYXRlICgxKSB0aGUgc2VsZWN0ZWQgaXRlbSBob2xkZXIsICgyKSB0aGUKLQkgKiBzZWxlY3Rpb24gbW9kZWwgYW5kICgzKSB0aGUgYnV0dG9ucy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGdldFNlbGVjdGVkSXRlbUhvbGRlcigpOwotCQlPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgc2VsZWN0aW9uTW9kZWwgPSBnZXRTZWxlY3Rpb25Nb2RlbCgpOwotCQlpbnQgc2VsZWN0aW9uQ291bnQgPSB0aGlzLnRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCk7Ci0KLQkJaWYgKHNlbGVjdGlvbkNvdW50ID09IDApIHsKLQkJCXNlbGVjdGVkSXRlbUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJCXNlbGVjdGlvbk1vZGVsLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0aW9uQ291bnQgIT0gMSkgewotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkJc2VsZWN0aW9uTW9kZWwuY2xlYXJTZWxlY3Rpb24oKTsKLQotCQkJZm9yIChpbnQgaW5kZXggOiB0aGlzLnRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSkgewotCQkJCXNlbGVjdGlvbk1vZGVsLmFkZFNlbGVjdGlvbkludGVydmFsKGluZGV4LCBpbmRleCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnQgc2VsZWN0ZWRJbmRleCA9IHRoaXMudGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCU9iamVjdCBzZWxlY3RlZEl0ZW0gPSBnZXRMaXN0SG9sZGVyKCkuZ2V0KHNlbGVjdGVkSW5kZXgpOwotCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUoc2VsZWN0ZWRJdGVtKTsKLQkJCXNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoc2VsZWN0ZWRJdGVtKTsKLQkJfQotCi0JCXVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGxhYmVsIHByb3ZpZGVyIHNpbXBseSBkZWxlZ2F0ZXMgdGhlIHJlbmRlcmluZyB0byB0aGUgcHJvdmlkZWQKLQkgKiA8Y29kZT5JTGFiZWxQcm92aWRlcjwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0KLQkJVGFibGVMYWJlbFByb3ZpZGVyKElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBsYWJlbFByb3ZpZGVyLmdldEltYWdlKGVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBsYWJlbFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0FkZFJlbW92ZVBhbmUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9BZGRSZW1vdmVQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZDc2NjEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0FkZFJlbW92ZVBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGRlZmluaXRpb24gb2YgYSBwYW5lIHRoYXQgaGFzIGJ1dHRvbnMgZm9yIGFkZGluZywgcmVtb3ZpbmcgYW5kCi0gKiBwb3NzaWJseSBlZGl0aW5nIHRoZSBpdGVtcy4KLSAqCi0gKiBAc2VlIEFkZFJlbW92ZUxpc3RQYW5lCi0gKgotICogQHZlcnNpb24gMS4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBZGRSZW1vdmVQYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHJpdmF0ZSBBZGFwdGVyIGFkYXB0ZXI7Ci0JcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uOwotCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRhaW5lcjsKLQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlZDsKLQlwcml2YXRlIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlcjsKLQlwcml2YXRlIEJ1dHRvbiBvcHRpb25hbEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiByZW1vdmVCdXR0b247Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0ZWRJdGVtSG9sZGVyOwotCXByaXZhdGUgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIHNlbGVjdGlvbk1vZGVsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBhZGFwdGVyIFRoaXMgPGNvZGU+QWRhcHRlcjwvY29kZT4gaXMgdXNlZCB0byBkaWN0YWN0ZSB0aGUgYmVoYXZpb3IKLQkgKiBvZiB0aGlzIDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+IGFuZCBieSBkZWxlZ2F0aW5nIHRvIGl0IHNvbWUgb2YgdGhlCi0JICogYmVoYXZpb3IKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIGxpc3QgaG9sZGVyJ3MgaXRlbXMKLQkgKi8KLQlwcm90ZWN0ZWQgQWRkUmVtb3ZlUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQotCQl0aGlzKHBhcmVudFBhbmUsCi0JCSAgICAgcGFyZW50LAotCQkgICAgIGFkYXB0ZXIsCi0JCSAgICAgbGlzdEhvbGRlciwKLQkJICAgICBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgbGFiZWxQcm92aWRlciwKLQkJICAgICBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGFkYXB0ZXIgVGhpcyA8Y29kZT5BZGFwdGVyPC9jb2RlPiBpcyB1c2VkIHRvIGRpY3RhY3RlIHRoZSBiZWhhdmlvcgotCSAqIG9mIHRoaXMgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4gYW5kIGJ5IGRlbGVnYXRpbmcgdG8gaXQgc29tZSBvZiB0aGUKLQkgKiBiZWhhdmlvcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgbGlzdCBob2xkZXIncyBpdGVtcwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcGFuZQotCSAqLwotCXByb3RlY3RlZCBBZGRSZW1vdmVQYW5lKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJdGhpcyhwYXJlbnRQYW5lLAotCQkgICAgIHBhcmVudCwKLQkJICAgICBhZGFwdGVyLAotCQkgICAgIGxpc3RIb2xkZXIsCi0JCSAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgIGxhYmVsUHJvdmlkZXIsCi0JCSAgICAgaGVscElkLAotCQkgICAgIHRydWUpOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGFkYXB0ZXIgVGhpcyA8Y29kZT5BZGFwdGVyPC9jb2RlPiBpcyB1c2VkIHRvIGRpY3RhY3RlIHRoZSBiZWhhdmlvcgotCSAqIG9mIHRoaXMgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4gYW5kIGJ5IGRlbGVnYXRpbmcgdG8gaXQgc29tZSBvZiB0aGUKLQkgKiBiZWhhdmlvcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgbGlzdCBob2xkZXIncyBpdGVtcwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcGFuZQotCSAqIEBwYXJhbSBwYXJlbnRNYW5hZ2VQYW5lIDxjb2RlPnRydWU8L2NvZGU+IHRvIGhhdmUgdGhlIHBhcmVudCBwYW5lIG1hbmFnZQotCSAqIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoaXMgcGFuZQotCSAqLwotCXByb3RlY3RlZCBBZGRSZW1vdmVQYW5lKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkLCAKLQkgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHBhcmVudE1hbmFnZVBhbmUpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIHRydWUsIHBhcmVudE1hbmFnZVBhbmUpOwotCi0JCWluaXRpYWxpemUoCi0JCQlhZGFwdGVyLAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCWxhYmVsUHJvdmlkZXIKLQkJKTsKLQotCQlpbml0aWFsaXplTGF5b3V0KAotCQkJYWRhcHRlciwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlsYWJlbFByb3ZpZGVyLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdAotCSAqIEBwYXJhbSBhZGFwdGVyIFRoaXMgPGNvZGU+QWRhcHRlcjwvY29kZT4gaXMgdXNlZCB0byBkaWN0YWN0ZSB0aGUgYmVoYXZpb3IKLQkgKiBvZiB0aGlzIDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+IGFuZCBieSBkZWxlZ2F0aW5nIHRvIGl0IHNvbWUgb2YgdGhlCi0JICogYmVoYXZpb3IKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICovCi0JcHJvdGVjdGVkIEFkZFJlbW92ZVBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0KLQkJdGhpcyhwYXJlbnRQYW5lLAotCQkgICAgIHN1YmplY3RIb2xkZXIsCi0JCSAgICAgcGFyZW50LAotCQkgICAgIGFkYXB0ZXIsCi0JCSAgICAgbGlzdEhvbGRlciwKLQkJICAgICBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgbGFiZWxQcm92aWRlciwKLQkJICAgICBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0Ci0JICogQHBhcmFtIGFkYXB0ZXIgVGhpcyA8Y29kZT5BZGFwdGVyPC9jb2RlPiBpcyB1c2VkIHRvIGRpY3RhY3RlIHRoZSBiZWhhdmlvcgotCSAqIG9mIHRoaXMgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4gYW5kIGJ5IGRlbGVnYXRpbmcgdG8gaXQgc29tZSBvZiB0aGUKLQkgKiBiZWhhdmlvcgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIGxpc3QgaG9sZGVyJ3MgaXRlbXMKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHBhbmUKLQkgKi8KLQlwcm90ZWN0ZWQgQWRkUmVtb3ZlUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0KLQkJaW5pdGlhbGl6ZSgKLQkJCWFkYXB0ZXIsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJbGFiZWxQcm92aWRlcgotCQkpOwotCi0JCWluaXRpYWxpemVMYXlvdXQoCi0JCQlhZGFwdGVyLAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCWxhYmVsUHJvdmlkZXIsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlcyB0aGUgcG9zc2liaWxpdHkgdG8gYWRkIGJ1dHRvbnMgYWZ0ZXIgdGhlIEFkZCBidXR0b24gYW5kIGJlZm9yZSB0aGUKLQkgKiBvcHRpb25hbCBidXR0b24uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhlIGJ1dHRvbnMKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDdXN0b21CdXR0b25BZnRlckFkZEJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlcyB0aGUgcG9zc2liaWxpdHkgdG8gYWRkIGJ1dHRvbnMgYWZ0ZXIgdGhlIG9wdGlvbmFsIGJ1dHRvbiBhbmQgYmVmb3JlCi0JICogdGhlIFJlbW92ZSBidXR0b24uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhlIGJ1dHRvbnMKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDdXN0b21CdXR0b25BZnRlck9wdGlvbmFsQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IEFkZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW0oKSB7Ci0JCWFkYXB0ZXIuYWRkTmV3SXRlbShzZWxlY3Rpb25Nb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IEluaXRpYWxpemUKLQkgKi8KLQlwcm90ZWN0ZWQgQWRhcHRlciBidWlsZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIEBjYXRlZ29yeSBBZGQKLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGFkZEFkZEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBhZGRVbm1hbmFnZWRCdXR0b24oCi0JCQlwYXJlbnQsCi0JCQlhZGFwdGVyLmFkZEJ1dHRvblRleHQoKSwKLQkJCWJ1aWxkQWRkSXRlbUFjdGlvbigpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IEFkZAotCSAqLwotCXByaXZhdGUgUnVubmFibGUgYnVpbGRBZGRJdGVtQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFkZFJlbW92ZVBhbmUudGhpcy5hZGRJdGVtKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcihidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJCUFkZFJlbW92ZVBhbmUudGhpcy5pdGVtc0FkZGVkKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCUFkZFJlbW92ZVBhbmUudGhpcy5pdGVtc01vdmVkKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCQlBZGRSZW1vdmVQYW5lLnRoaXMuaXRlbXNSZW1vdmVkKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCUFkZFJlbW92ZVBhbmUudGhpcy5pdGVtc1JlcGxhY2VkKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUFkZFJlbW92ZVBhbmUudGhpcy5saXN0Q2hhbmdlZChlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCUFkZFJlbW92ZVBhbmUudGhpcy5saXN0Q2xlYXJlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCU9iamVjdCBzZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGVkSXRlbUhvbGRlci5nZXRWYWx1ZSgpOwotCi0JCWlmIChzZWxlY3RlZEl0ZW0gPT0gbnVsbCkgewotCQkJdXBkYXRlQnV0dG9ucygpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhlLmdldEl0ZW1zKCksIHNlbGVjdGVkSXRlbSkpIHsKLQkJCXRoaXMuc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkJdXBkYXRlQnV0dG9ucygpOwotCQl9CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQl1cGRhdGVCdXR0b25zKCk7Ci0JfQotCQotCQotCS8qKgotCSAqIEBjYXRlZ29yeSBPcHRpb24KLQkgKi8KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkT3B0aW9uYWxBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQWRkUmVtb3ZlUGFuZS50aGlzLmVkaXRJdGVtKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IE9wdGlvbgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gYWRkT3B0aW9uYWxCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gYWRkVW5tYW5hZ2VkQnV0dG9uKAotCQkJY29udGFpbmVyLAotCQkJYWRhcHRlci5vcHRpb25hbEJ1dHRvblRleHQoKSwKLQkJCWJ1aWxkT3B0aW9uYWxBY3Rpb24oKQotCQkpOwotCX0KLQotCS8qKgotCSAqIEBjYXRlZ29yeSBBZGQKLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGFkZFJlbW92ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBhZGRVbm1hbmFnZWRCdXR0b24oCi0JCQlwYXJlbnQsCi0JCQlhZGFwdGVyLnJlbW92ZUJ1dHRvblRleHQoKSwKLQkJCWJ1aWxkUmVtb3ZlSXRlbXNBY3Rpb24oKQotCQkpOwotCX0KLQotCS8qKgotCSAqIEBjYXRlZ29yeSBSZW1vdmUKLQkgKi8KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUmVtb3ZlSXRlbXNBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQWRkUmVtb3ZlUGFuZS50aGlzLnJlbW92ZUl0ZW1zKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBidWlsZFJvd1NlbGVjdGlvbk1vZGVsKExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RNb2RlbCkgewotCQlyZXR1cm4gbmV3IE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbChuZXcgTGlzdE1vZGVsQWRhcHRlcihsaXN0TW9kZWwpKTsKLQl9Ci0KLQkvKioKLQkgKiBAY2F0ZWdvcnkgT3B0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZWRpdEl0ZW0oKSB7Ci0JCXRoaXMuYWRhcHRlci5vcHRpb25PblNlbGVjdGlvbihnZXRTZWxlY3Rpb25Nb2RlbCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCi0JCXN1cGVyLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0JCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Ci0KLQkJaWYgKCF0aGlzLmdldE1haW5Db250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmdldE1haW5Db250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJfQotCi0JCXRoaXMudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgZ2V0Q29udGFpbmVyKCkgewotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCBJQmFzZUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RWYWx1ZU1vZGVsPD8+IGdldExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBsaXN0SG9sZGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMKLQkgKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgQ29tcG9zaXRlIGdldE1haW5Db250cm9sKCk7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGdldFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJcmV0dXJuIHNlbGVjdGVkSXRlbUhvbGRlcjsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGdldFNlbGVjdGlvbk1vZGVsKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBhZGQvcmVtb3ZlIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gYWRhcHRlciBUaGlzIDxjb2RlPkFkYXB0ZXI8L2NvZGU+IGlzIHVzZWQgdG8gZGljdGFjdGUgdGhlIGJlaGF2aW9yCi0JICogb2YgdGhpcyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPiBhbmQgYnkgZGVsZWdhdGluZyB0byBpdCBzb21lIG9mIHRoZQotCSAqIGJlaGF2aW9yCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICoKLQkgKiBAY2F0ZWdvcnkgSW5pdGlhbGl6YXRpb24KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKQotCXsKLQkJdGhpcy5saXN0SG9sZGVyICAgICAgICAgPSBsaXN0SG9sZGVyOwotCQl0aGlzLmxhYmVsUHJvdmlkZXIgICAgICA9IGxhYmVsUHJvdmlkZXI7Ci0JCXRoaXMuYWRhcHRlciAgICAgICAgICAgID0gKGFkYXB0ZXIgPT0gbnVsbCkgPyBidWlsZEFkYXB0ZXIoKSA6IGFkYXB0ZXI7Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtSG9sZGVyID0gKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0Pikgc2VsZWN0ZWRJdGVtSG9sZGVyOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsICAgICA9IG5ldyBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwobmV3IExpc3RNb2RlbEFkYXB0ZXIobGlzdEhvbGRlcikpOwotCi0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoCi0JCQlMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywKLQkJCWJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgcGFuZSBjb250YWluaW5nIHRoZSBidXR0b25zIChBZGQsIG9wdGlvbmFsIChpZiByZXF1aXJlZCkKLQkgKiBhbmQgUmVtb3ZlKS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgYnV0dG9ucwotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCdXR0b25QYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBoZWxwSWQpIHsKLQotCQljb250YWluZXIgPSBhZGRTdWJQYW5lKGNvbnRhaW5lcik7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCAgICAgICA9IFNXVC5UT1A7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBBZGQgYnV0dG9uCi0JCXRoaXMuYWRkQnV0dG9uID0gYWRkQWRkQnV0dG9uKGNvbnRhaW5lcik7Ci0JCWFkZEFsaWduUmlnaHQodGhpcy5hZGRCdXR0b24pOwotCi0JCS8vIEN1c3RvbSBidXR0b24KLQkJYWRkQ3VzdG9tQnV0dG9uQWZ0ZXJBZGRCdXR0b24oY29udGFpbmVyLCBoZWxwSWQpOwotCi0JCS8vIE9wdGlvbmFsIGJ1dHRvbgotCQlpZiAodGhpcy5hZGFwdGVyLmhhc09wdGlvbmFsQnV0dG9uKCkpIHsKLQkJCXRoaXMub3B0aW9uYWxCdXR0b24gPSBhZGRPcHRpb25hbEJ1dHRvbihjb250YWluZXIpOwotCQkJYWRkQWxpZ25SaWdodCh0aGlzLm9wdGlvbmFsQnV0dG9uKTsKLQkJfQotCi0JCS8vIEN1c3RvbSBidXR0b24KLQkJYWRkQ3VzdG9tQnV0dG9uQWZ0ZXJPcHRpb25hbEJ1dHRvbihjb250YWluZXIsIGhlbHBJZCk7Ci0KLQkJLy8gUmVtb3ZlIGJ1dHRvbgotCQlyZW1vdmVCdXR0b24gPSBhZGRSZW1vdmVCdXR0b24oY29udGFpbmVyKTsKLQkJYWRkQWxpZ25SaWdodChyZW1vdmVCdXR0b24pOwotCi0JCS8vIFVwZGF0ZSB0aGUgaGVscCB0b3BpYyBJRAotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGFkZEJ1dHRvbiwgaGVscElkKTsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJlbW92ZUJ1dHRvbiwgaGVscElkKTsKLQotCQkJaWYgKG9wdGlvbmFsQnV0dG9uICE9IG51bGwpIHsKLQkJCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscChvcHRpb25hbEJ1dHRvbiwgaGVscElkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgYWRkL3JlbW92ZSBwYW5lIGJ5IGNyZWF0aW5nIHRoZSB3aWRnZXRzLiBUaGUgc3ViY2xhc3MgaXMKLQkgKiByZXF1aXJlZCB0byBidWlsZCB0aGUgbWFpbiB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gYWRhcHRlciBUaGlzIDxjb2RlPkFkYXB0ZXI8L2NvZGU+IGlzIHVzZWQgdG8gZGljdGFjdGUgdGhlIGJlaGF2aW9yCi0JICogb2YgdGhpcyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPiBhbmQgYnkgZGVsZWdhdGluZyB0byBpdCBzb21lIG9mIHRoZQotCSAqIGJlaGF2aW9yCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBwYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChBZGFwdGVyIGFkYXB0ZXIsCi0gICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLSAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0gICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJaW5pdGlhbGl6ZU1haW5Db21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlhZGFwdGVyLAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCWxhYmVsUHJvdmlkZXIsCi0JCQloZWxwSWQpOwotCi0JCWluaXRpYWxpemVCdXR0b25QYW5lKGNvbnRhaW5lciwgaGVscElkKTsKLQkJZW5hYmxlV2lkZ2V0cyhnZXRTdWJqZWN0KCkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmNvbnRhaW5lciA9IGFkZFN1YlBhbmUoY29udGFpbmVyLCAyLCAwLCAwLCAwLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgbWFpbiB3aWRnZXQgb2YgdGhpcyBhZGQvcmVtb3ZlIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGFkYXB0ZXIgVGhpcyA8Y29kZT5BZGFwdGVyPC9jb2RlPiBpcyB1c2VkIHRvIGRpY3RhY3RlIHRoZSBiZWhhdmlvcgotCSAqIG9mIHRoaXMgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4gYW5kIGJ5IGRlbGVnYXRpbmcgdG8gaXQgc29tZSBvZiB0aGUKLQkgKiBiZWhhdmlvcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgbGlzdCBob2xkZXIncyBpdGVtcwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcGFuZSBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IHdhcyBub3Qgc3BlY2lmaWVkCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZU1haW5Db21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpOwotCi0JLyoqCi0JICogQGNhdGVnb3J5IFJlbW92ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zKCkgewotCi0JCS8vIEtlZXAgdHJhY2sgb2YgdGhlIHNlbGVjdGVkIGluZGljZXMgc28gd2UgY2FuIHNlbGVjdCBhbiBpdGVtCi0JCS8vIGJlZm9yZSB0aGUgbG93ZXN0IGluZGV4Ci0JCWludFtdIGluZGljZXMgPSBzZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZEluZGljZXMoKTsKLQkJQXJyYXlzLnNvcnQoaW5kaWNlcyk7Ci0KLQkJLy8gTm90aWZ5IHRoZSBhZGFwdGVyIHRvIHJlbW92ZSB0aGUgc2VsZWN0ZWQgaXRlbXMKLQkJYWRhcHRlci5yZW1vdmVTZWxlY3RlZEl0ZW1zKHNlbGVjdGlvbk1vZGVsKTsKLQotCQkvLyBTZWxlY3QgYSBuZXcgaXRlbQotCQlpZiAoZ2V0TGlzdEhvbGRlcigpLnNpemUoKSA+IDApIHsKLQkJCWludCBpbmRleCA9IE1hdGgubWluKGluZGljZXNbMF0sIGdldExpc3RIb2xkZXIoKS5zaXplKCkgLSAxKTsKLQkJCU9iamVjdCBpdGVtID0gZ2V0TGlzdEhvbGRlcigpLmdldChpbmRleCk7Ci0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUoaXRlbSk7Ci0JCX0KLQkJLy8gVGhlIGxpc3QgaXMgZW1wdHksIGNsZWFyIHRoZSB2YWx1ZQotCQllbHNlIHsKLQkJCXNlbGVjdGVkSXRlbUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlbGVjdHMgdGhlIGdpdmVuIHZhbHVlLCB3aGljaCBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyBzZWxlY3RlZCB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkSXRlbShPYmplY3QgdmFsdWUpIHsKLQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAY2F0ZWdvcnkgVXBkYXRlQnV0dG9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUFkZEJ1dHRvbihCdXR0b24gYWRkQnV0dG9uKSB7Ci0JCWFkZEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIEBjYXRlZ29yeSBVcGRhdGVCdXR0b25zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9ucygpIHsKLQkJaWYgKCFjb250YWluZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQl1cGRhdGVBZGRCdXR0b24oYWRkQnV0dG9uKTsKLQkJCXVwZGF0ZVJlbW92ZUJ1dHRvbihyZW1vdmVCdXR0b24pOwotCQkJdXBkYXRlT3B0aW9uYWxCdXR0b24ob3B0aW9uYWxCdXR0b24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IFVwZGF0ZUJ1dHRvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVPcHRpb25hbEJ1dHRvbihCdXR0b24gb3B0aW9uYWxCdXR0b24pIHsKLQkJaWYgKG9wdGlvbmFsQnV0dG9uICE9IG51bGwpIHsKLQkJCW9wdGlvbmFsQnV0dG9uLnNldEVuYWJsZWQoCi0JCQkJZW5hYmxlZCAmJgotCQkJCWFkYXB0ZXIuZW5hYmxlT3B0aW9uT25TZWxlY3Rpb25DaGFuZ2Uoc2VsZWN0aW9uTW9kZWwpCi0JCQkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IFVwZGF0ZUJ1dHRvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSZW1vdmVCdXR0b24oQnV0dG9uIHJlbW92ZUJ1dHRvbikgewotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZCgKLQkJCWVuYWJsZWQgJiYKLQkJCWFkYXB0ZXIuZW5hYmxlUmVtb3ZlT25TZWxlY3Rpb25DaGFuZ2Uoc2VsZWN0aW9uTW9kZWwpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+QWRhcHRlcjwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFkYXB0ZXIgaW1wbGVtZW50cyBBZGFwdGVyIHsKLQotCQkvKioKLQkJICogVGhlIHRleHQgb2YgdGhlIGFkZCBidXR0b24uCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBhZGRCdXR0b25UZXh0OwotCi0JCS8qKgotCQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG9wdGlvbmFsIGJ1dHRvbiBzaG91bGQgYmUgc2hvd24gb3Igbm90LgotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIGhhc09wdGlvbmFsQnV0dG9uOwotCi0JCS8qKgotCQkgKiBUaGUgdGV4dCBvZiB0aGUgb3B0aW9uYWwgYnV0dG9uLCBpZiB1c2VkLgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0OwotCi0JCS8qKgotCQkgKiBUaGUgdGV4dCBvZiB0aGUgcmVtb3ZlIGJ1dHRvbi4KLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIHJlbW92ZUJ1dHRvblRleHQ7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RBZGFwdGVyPC9jb2RlPiB3aXRoIGRlZmF1bHQgdGV4dCBmb3IgdGhlCi0JCSAqIGFkZCBhbmQgcmVtb3ZlIGJ1dHRvbnMuCi0JCSAqLwotCQlwdWJsaWMgQWJzdHJhY3RBZGFwdGVyKCkgewotCQkJdGhpcyhKcHRDb21tb25VaU1lc3NhZ2VzLkFkZFJlbW92ZVBhbmVfQWRkQnV0dG9uVGV4dCwKLQkJCQlKcHRDb21tb25VaU1lc3NhZ2VzLkFkZFJlbW92ZVBhbmVfUmVtb3ZlQnV0dG9uVGV4dCk7Ci0JCX0KLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEFkYXB0ZXI8L2NvZGU+IHdpdGggZGVmYXVsdCB0ZXh0IGZvciB0aGUKLQkJICogYWRkIGFuZCByZW1vdmUgYnV0dG9ucy4KLQkJICoKLQkJICogQHBhcmFtIGhhc09wdGlvbmFsQnV0dG9uIDxjb2RlPnRydWU8L2NvZGU+IHRvIHNob3cgYW4gb3B0aW9uYWwgYnV0dG9uCi0JCSAqIGFuZCB0byB1c2UgdGhlIGJlaGF2aW9yIHJlbGF0ZWQgdG8gdGhlIG9wdGlvbmFsIGJ1dHRvbjsKLQkJICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCB1c2UgaXQKLQkJICovCi0JCXB1YmxpYyBBYnN0cmFjdEFkYXB0ZXIoYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbikgewotCQkJdGhpcygpOwotCQkJdGhpcy5zZXRIYXNPcHRpb25hbEJ1dHRvbihoYXNPcHRpb25hbEJ1dHRvbik7Ci0JCX0KLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEFkYXB0ZXI8L2NvZGU+IHdpdGggZGVmYXVsdCB0ZXh0IGZvciB0aGUKLQkJICogYWRkIGFuZCByZW1vdmUgYnV0dG9ucy4KLQkJICoKLQkJICogQHBhcmFtIG9wdGlvbmFsQnV0dG9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgb3B0aW9uYWwgYnV0dG9uLCB3aGljaCBtZWFucwotCQkgKiB0aGUgb3B0aW9uYWwgYnV0dG9uIHdpbGwgYmUgc2hvd24KLQkJICovCi0JCXB1YmxpYyBBYnN0cmFjdEFkYXB0ZXIoU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dCkgewotCQkJdGhpcyh0cnVlKTsKLQkJCXRoaXMuc2V0T3B0aW9uYWxCdXR0b25UZXh0KG9wdGlvbmFsQnV0dG9uVGV4dCk7Ci0JCX0KLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEFkYXB0ZXI8L2NvZGU+LgotCQkgKgotCQkgKiBAcGFyYW0gYWRkQnV0dG9uVGV4dCBUaGUgYWRkIGJ1dHRvbidzIHRleHQKLQkJICogQHBhcmFtIHJlbW92ZUJ1dHRvblRleHQgVGhlIHJlbW92ZSBidXR0b24ncyB0ZXh0Ci0JCSAqLwotCQlwdWJsaWMgQWJzdHJhY3RBZGFwdGVyKFN0cmluZyBhZGRCdXR0b25UZXh0LAotCQkgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZW1vdmVCdXR0b25UZXh0KSB7Ci0KLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmFkZEJ1dHRvblRleHQgICAgPSBhZGRCdXR0b25UZXh0OwotCQkJdGhpcy5yZW1vdmVCdXR0b25UZXh0ID0gcmVtb3ZlQnV0dG9uVGV4dDsKLQkJfQotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0QWRhcHRlcjwvY29kZT4uCi0JCSAqCi0JCSAqIEBwYXJhbSBhZGRCdXR0b25UZXh0IFRoZSBhZGQgYnV0dG9uJ3MgdGV4dAotCQkgKiBAcGFyYW0gcmVtb3ZlQnV0dG9uVGV4dCBUaGUgcmVtb3ZlIGJ1dHRvbidzIHRleHQKLQkJICogQHBhcmFtIG9wdGlvbmFsQnV0dG9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgb3B0aW9uYWwgYnV0dG9uLCB3aGljaCBtZWFucwotCQkgKiB0aGUgb3B0aW9uYWwgYnV0dG9uIHdpbGwgYmUgc2hvd24KLQkJICovCi0JCXB1YmxpYyBBYnN0cmFjdEFkYXB0ZXIoU3RyaW5nIGFkZEJ1dHRvblRleHQsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbW92ZUJ1dHRvblRleHQsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dCkgewotCi0JCQl0aGlzKG9wdGlvbmFsQnV0dG9uVGV4dCk7Ci0JCQl0aGlzLnNldEFkZEJ1dHRvblRleHQoYWRkQnV0dG9uVGV4dCk7Ci0JCQl0aGlzLnNldFJlbW92ZUJ1dHRvblRleHQocmVtb3ZlQnV0dG9uVGV4dCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGFkZEJ1dHRvblRleHQoKSB7Ci0JCQlyZXR1cm4gYWRkQnV0dG9uVGV4dDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGVuYWJsZU9wdGlvbk9uU2VsZWN0aW9uQ2hhbmdlKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCXJldHVybiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXNTaXplKCkgPT0gMTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGVuYWJsZVJlbW92ZU9uU2VsZWN0aW9uQ2hhbmdlKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCXJldHVybiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpICE9IG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbigpIHsKLQkJCXJldHVybiBoYXNPcHRpb25hbEJ1dHRvbjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KCkgewotCQkJcmV0dXJuIG9wdGlvbmFsQnV0dG9uVGV4dDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIG9wdGlvbk9uU2VsZWN0aW9uKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgcmVtb3ZlQnV0dG9uVGV4dCgpIHsKLQkJCXJldHVybiByZW1vdmVCdXR0b25UZXh0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIENoYW5nZXMgdGhlIHRleHQgb2YgdGhlIGFkZCBidXR0b24uIFRoaXMgbWV0aG9kIGhhcyB0byBiZSBjYWxsZWQgYmVmb3JlCi0JCSAqIHRoZSA8Y29kZT5BZGRSZW1vdmVMaXN0UGFuZTwvY29kZT4gaXMgaW5pdGlhbGl6ZWQuCi0JCSAqCi0JCSAqIEBwYXJhbSBhZGRCdXR0b25UZXh0IFRoZSBhZGQgYnV0dG9uJ3MgdGV4dAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0QWRkQnV0dG9uVGV4dChTdHJpbmcgYWRkQnV0dG9uVGV4dCkgewotCQkJdGhpcy5hZGRCdXR0b25UZXh0ID0gYWRkQnV0dG9uVGV4dDsKLQkJfQotCi0JCS8qKgotCQkgKiBDaGFuZ2VzIHRoZSBzdGF0ZSBvZiB0aGUgb3B0aW9uYWwgYnV0dG9uLCBtZWFuaW5nIGlmIGl0IHNob3VsZCBiZSBzaG93bgotCQkgKiBiZXR3ZWVuIHRoZSBhZGQgYW5kIHJlbW92ZSBidXR0b25zIG9yIG5vdC4KLQkJICoKLQkJICogQHBhcmFtIGhhc09wdGlvbmFsQnV0dG9uIDxjb2RlPnRydWU8L2NvZGU+IHRvIHNob3cgYW4gb3B0aW9uYWwgYnV0dG9uCi0JCSAqIGFuZCB0byB1c2UgdGhlIGJlaGF2aW9yIHJlbGF0ZWQgdG8gdGhlIG9wdGlvbmFsIGJ1dHRvbjsKLQkJICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCB1c2UgaXQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEhhc09wdGlvbmFsQnV0dG9uKGJvb2xlYW4gaGFzT3B0aW9uYWxCdXR0b24pIHsKLQkJCXRoaXMuaGFzT3B0aW9uYWxCdXR0b24gPSBoYXNPcHRpb25hbEJ1dHRvbjsKLQkJfQotCi0JCS8qKgotCQkgKiBDaGFuZ2VzIHRoZSB0ZXh0IG9mIHRoZSBvcHRpb25hbCBidXR0b24uIFRoaXMgbWV0aG9kIGhhcyB0byBiZSBjYWxsZWQKLQkJICogYmVmb3JlIHRoZSA8Y29kZT5BZGRSZW1vdmVMaXN0UGFuZTwvY29kZT4gaXMgaW5pdGlhbGl6ZWQuIFRoaXMgZG9lcyBub3QKLQkJICogbWFrZSB0aGUgb3B0aW9uYWwgYnV0dG9uIHZpc2libGUuCi0JCSAqCi0JCSAqIEBwYXJhbSBvcHRpb25hbEJ1dHRvblRleHQgVGhlIG9wdGlvbmFsIGJ1dHRvbidzIHRleHQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsQnV0dG9uVGV4dChTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KSB7Ci0JCQl0aGlzLm9wdGlvbmFsQnV0dG9uVGV4dCA9IG9wdGlvbmFsQnV0dG9uVGV4dDsKLQkJfQotCi0JCS8qKgotCQkgKiBDaGFuZ2VzIHRoZSB0ZXh0IG9mIHRoZSByZW1vdmUgYnV0dG9uLiBUaGlzIG1ldGhvZCBoYXMgdG8gYmUgY2FsbGVkCi0JCSAqIGJlZm9yZSB0aGUgPGNvZGU+QWRkUmVtb3ZlTGlzdFBhbmU8L2NvZGU+IGlzIGluaXRpYWxpemVkLgotCQkgKgotCQkgKiBAcGFyYW0gcmVtb3ZlQnV0dG9uVGV4dCBUaGUgcmVtb3ZlIGJ1dHRvbidzIHRleHQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFJlbW92ZUJ1dHRvblRleHQoU3RyaW5nIHJlbW92ZUJ1dHRvblRleHQpIHsKLQkJCXRoaXMucmVtb3ZlQnV0dG9uVGV4dCA9IHJlbW92ZUJ1dHRvblRleHQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkYXB0ZXIgaXMgdXNlZCB0byBwZXJmb3JtIHRoZSBhY3R1YWwgYWN0aW9uIHdoZW4gYWRkaW5nIGEgbmV3IGl0ZW0KLQkgKiBvciByZW1vdmluZyB0aGUgc2VsZWN0ZWQgaXRlbXMuIEl0IGlzIHBvc3NpYmxlIHRvIGFkZCBhbiBvcHRpb25hbCBidXR0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQWRhcHRlciB7Ci0KLQkJLyoqCi0JCSAqIFRoZSBhZGQgYnV0dG9uJ3MgdGV4dC4KLQkJICoKLQkJICogQHJldHVybiBUaGUgdGV4dCBzaG93biBvbiB0aGUgYWRkIGJ1dHRvbgotCQkgKi8KLQkJU3RyaW5nIGFkZEJ1dHRvblRleHQoKTsKLQotCQkvKioKLQkJICogSW52b2tlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgdGhlIEFkZCBidXR0b24uCi0JCSAqLwotCQl2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0KLQkJLyoqCi0JCSAqIEludm9rZWQgd2hlbiBzZWxlY3Rpb24gY2hhbmdlcy4gSW1wbGVtZW50YXRpb24gZGljdGF0ZXMgd2hldGhlciBidXR0b24KLQkJICogc2hvdWxkIGJlIGVuYWJsZWQuCi0JCSAqLwotCQlib29sZWFuIGVuYWJsZU9wdGlvbk9uU2VsZWN0aW9uQ2hhbmdlKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpOwotCi0JCS8qKgotCQkgKiBJbnZva2VkIHdoZW4gc2VsZWN0aW9uIGNoYW5nZXMuIEltcGxlbWVudGF0aW9uIGRpY3RhdGVzIHdoZXRoZXIgcmVtb3ZlIGJ1dHRvbgotCQkgKiBzaG91bGQgYmUgZW5hYmxlZC4KLQkJICovCi0JCWJvb2xlYW4gZW5hYmxlUmVtb3ZlT25TZWxlY3Rpb25DaGFuZ2UoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0KLQkJLyoqCi0JCSAqIERldGVybWluZXMgd2hldGhlciBhbiBvcHRpb25hbCBidXR0b24gc2hvdWxkIGJlIGFkZGVkIGJldHdlZW4gdGhlIGFkZAotCQkgKiBhbmQgcmVtb3ZlIGJ1dHRvbnMuCi0JCSAqCi0JCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gc2hvdyBhbiBvcHRpb25hbCBidXR0b24gYW5kIHRvIHVzZSB0aGUKLQkJICogYmVoYXZpb3IgcmVsYXRlZCB0byB0aGUgb3B0aW9uYWwgYnV0dG9uOyA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IHVzZQotCQkgKiBpdAotCQkgKi8KLQkJYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbigpOwotCi0JCS8qKgotCQkgKiBSZXNvdXJjZSBzdHJpbmcga2V5IGZvciB0aGUgb3B0aW9uYWwgYnV0dG9uLgotCQkgKi8KLQkJU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dCgpOwotCi0JCS8qKgotCQkgKiBJbnZva2VkIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyB0aGUgb3B0aW9uYWwgYnV0dG9uCi0JCSAqLwotCQl2b2lkIG9wdGlvbk9uU2VsZWN0aW9uKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpOwotCi0JCS8qKgotCQkgKiBUaGUgcmVtb3ZlIGJ1dHRvbidzIHRleHQuCi0JCSAqCi0JCSAqIEByZXR1cm4gVGhlIHRleHQgc2hvd24gb24gdGhlIHJlbW92ZSBidXR0b24KLQkJICovCi0JCVN0cmluZyByZW1vdmVCdXR0b25UZXh0KCk7Ci0KLQkJLyoqCi0JCSAqIEludm9rZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIHRoZSBSZW1vdmUgYnV0dG9uLgotCQkgKi8KLQkJdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvQWRkUmVtb3ZlVGFibGVQYW5lLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvQWRkUmVtb3ZlVGFibGVQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNTY4MDkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0FkZFJlbW92ZVRhYmxlUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuQ29sdW1uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5UYWJsZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5UYWJsZU1vZGVsQWRhcHRlci5TZWxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5UYWJsZU1vZGVsQWRhcHRlci5TZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+IHVzZXMgYSA8Y29kZT5UYWJsZTwvY29kZT4KLSAqIGFzIGl0cyBtYWluIHdpZGdldC4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tIHwKLSAqIHwgfCBDb2x1bW4gMSB8IENvbHVtbiAyIHwgLi4uICAgfCBDb2x1bW4gaSB8IC4uLiAgIHwgQ29sdW5tIG4gfCB8IEFkZC4uLiAgfCB8Ci0gKiB8IHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICB8ICAgICAgICAgIHwgICAgICAgfCAgICAgICAgICB8IC0tLS0tLS0tLS0tIHwKLSAqIHwgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8IEVkaXQuLi4gfCB8Ci0gKiB8IHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgIHwgICAgICAgICAgfCAgICAgICB8ICAgICAgICAgIHwgLS0tLS0tLS0tLS0gfAotICogfCB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IC0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgfCAgICAgICAgICB8ICAgICAgIHwgICAgICAgICAgfCB8IFJlbW92ZSAgfCB8Ci0gKiB8IHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBZGRSZW1vdmVUYWJsZVBhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEFkZFJlbW92ZVBhbmU8VD4KLXsKLQkvKioKLQkgKiBGbGFnIHVzZWQgdG8gcHJldmVudCBjaXJjdWxhcgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBsb2NrZWQ7Ci0KLQkvKioKLQkgKiBUaGUgbWFpbiB3aWRnZXQgb2YgdGhpcyBhZGQvcmVtb3ZlIHBhbmUuCi0JICovCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlVGFibGVQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICovCi0JcHVibGljIEFkZFJlbW92ZVRhYmxlUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsCi0JCSAgICAgIHBhcmVudCwKLQkJICAgICAgYWRhcHRlciwKLQkJICAgICAgbGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBsYWJlbFByb3ZpZGVyKTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlVGFibGVQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBwYW5lCi0JICovCi0JcHVibGljIEFkZFJlbW92ZVRhYmxlUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLAotCQkgICAgICBwYXJlbnQsCi0JCSAgICAgIGFkYXB0ZXIsCi0JCSAgICAgIGxpc3RIb2xkZXIsCi0JCSAgICAgIHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJICAgICAgbGFiZWxQcm92aWRlciwKLQkJICAgICAgaGVscElkKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFkZFJlbW92ZVRhYmxlUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIGxpc3QgaG9sZGVyJ3MgaXRlbXMKLQkgKi8KLQlwdWJsaWMgQWRkUmVtb3ZlVGFibGVQYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLAotCQkgICAgICBzdWJqZWN0SG9sZGVyLAotCQkgICAgICBwYXJlbnQsCi0JCSAgICAgIGFkYXB0ZXIsCi0JCSAgICAgIGxpc3RIb2xkZXIsCi0JCSAgICAgIHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJICAgICAgbGFiZWxQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVUYWJsZVBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0Ci0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBwYW5lCi0JICovCi0JcHVibGljIEFkZFJlbW92ZVRhYmxlUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsCi0JCSAgICAgIHN1YmplY3RIb2xkZXIsCi0JCSAgICAgIHBhcmVudCwKLQkJICAgICAgYWRhcHRlciwKLQkJICAgICAgbGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBsYWJlbFByb3ZpZGVyLAotCQkgICAgICBoZWxwSWQpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBDb2x1bW5BZGFwdGVyPD8+IGJ1aWxkQ29sdW1uQWRhcHRlcigpOwotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4oKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3RlZEl0ZW1Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKAotCQkJYnVpbGRTZWxlY3RlZEl0ZW1Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAodGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpZiAoIWxvY2tlZCkgewotCQkJCQlsb2NrZWQgPSB0cnVlOwotCi0JCQkJCXRyeSB7Ci0JCQkJCQlPYmplY3QgdmFsdWUgPSBlLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlnZXRTZWxlY3Rpb25Nb2RlbCgpLnNldFNlbGVjdGVkVmFsdWUoZS5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJCWludCBpbmRleCA9IC0xOwotCi0JCQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCWluZGV4ID0gQ29sbGVjdGlvblRvb2xzLmluZGV4T2YoZ2V0TGlzdEhvbGRlcigpLml0ZXJhdG9yKCksIHZhbHVlKTsKLQkJCQkJCX0KLQotCQkJCQkJdGFibGUuc2VsZWN0KGluZGV4KTsKLQkJCQkJCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCWxvY2tlZCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8T2JqZWN0PiBidWlsZFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPE9iamVjdD4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZUV2ZW50PE9iamVjdD4gZSkgewotCQkJCUFkZFJlbW92ZVRhYmxlUGFuZS50aGlzLnNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGFibGUgZ2V0TWFpbkNvbnRyb2woKSB7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFpbkNvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpCi0JewotCQl0YWJsZSA9IGFkZFVubWFuYWdlZFRhYmxlKGNvbnRhaW5lciwgaGVscElkKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQotCQlUYWJsZU1vZGVsQWRhcHRlcjxPYmplY3Q+IHRhYmxlTW9kZWwgPSBUYWJsZU1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCShMaXN0VmFsdWVNb2RlbDxPYmplY3Q+KSBsaXN0SG9sZGVyLAotCQkJYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKLQkJCXRhYmxlLAotCQkJKENvbHVtbkFkYXB0ZXI8T2JqZWN0PikgYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQkoSVRhYmxlTGFiZWxQcm92aWRlcikgbGFiZWxQcm92aWRlcgotCQkpOwotCi0JCXRhYmxlTW9kZWwuYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQotCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCWJ1aWxkU2VsZWN0ZWRJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZCwgdXBkYXRlICgxKSB0aGUgc2VsZWN0ZWQgaXRlbSBob2xkZXIsICgyKSB0aGUKLQkgKiBzZWxlY3Rpb24gbW9kZWwgYW5kICgzKSB0aGUgYnV0dG9ucy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQotCQlpZiAobG9ja2VkKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlsb2NrZWQgPSB0cnVlOwotCi0JCXRyeSB7Ci0JCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gZ2V0U2VsZWN0ZWRJdGVtSG9sZGVyKCk7Ci0JCQlPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgc2VsZWN0aW9uTW9kZWwgPSBnZXRTZWxlY3Rpb25Nb2RlbCgpOwotCQkJaW50IHNlbGVjdGlvbkNvdW50ID0gdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQotCQkJaWYgKHNlbGVjdGlvbkNvdW50ID09IDApIHsKLQkJCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCQkJc2VsZWN0aW9uTW9kZWwuY2xlYXJTZWxlY3Rpb24oKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHNlbGVjdGlvbkNvdW50ICE9IDEpIHsKLQkJCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCQkJc2VsZWN0aW9uTW9kZWwuY2xlYXJTZWxlY3Rpb24oKTsKLQotCQkJCWZvciAoaW50IGluZGV4IDogdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKSB7Ci0JCQkJCXNlbGVjdGlvbk1vZGVsLmFkZFNlbGVjdGlvbkludGVydmFsKGluZGV4LCBpbmRleCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IHNlbGVjdGVkSW5kZXggPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCU9iamVjdCBzZWxlY3RlZEl0ZW0gPSBnZXRMaXN0SG9sZGVyKCkuZ2V0KHNlbGVjdGVkSW5kZXgpOwotCi0JCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKHNlbGVjdGVkSXRlbSk7Ci0JCQkJc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZShzZWxlY3RlZEl0ZW0pOwotCQkJfQotCi0JCQl1cGRhdGVCdXR0b25zKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlsb2NrZWQgPSBmYWxzZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9DaG9vc2VyUGFuZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0Nob29zZXJQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YTJmYTcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0Nob29zZXJQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBBIGNob29zZXIgaXMgc2ltcGx5IGEgcGFuZSB3aXRoIHRocmVlIHdpZGdldHMsIHRoZSBsYWJlbCBvbiB0aGUgbGVmdCwgYSBtYWluCi0gKiB3aWRnZXQsIHVzdWFsbHkgYSB0ZXh0IGZpZWxkLCBhbmQgYSByaWdodCB3aWRnZXQgd2hpY2ggaXMgdXN1YWxseSBhIGJyb3dzZQotICogYnV0dG9uLgotICoKLSAqIEBzZWUgQ2xhc3NDaG9vc2VyUGFuZQotICogQHNlZSBQYWNrYWdlQ2hvb3NlclBhbmUKLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENob29zZXJQYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JLyoqCi0JICogVGhlIGNvbnRyb2wgc2hvd24gYWZ0ZXIgdGhlIGxhYmVsIChsZWZ0IGNvbnRyb2wpLgotCSAqLwotCXByaXZhdGUgQ29udHJvbCBtYWluQ29udHJvbDsKLQotCS8qKgotCSAqIFRoZSBjb250cm9sIHNob3duIGFmdGVyIHRoZSBtYWluIGNvbnRyb2wuCi0JICovCi0JcHJpdmF0ZSBDb250cm9sIHJpZ2h0Q29udHJvbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2hvb3NlclBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDaG9vc2VyUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2hvb3NlclBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIENob29zZXJQYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2hvb3NlclBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGVuYWJsZWRNb2RlbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5tYWluQ29udHJvbCAgPSBhZGRNYWluQ29udHJvbChjb250YWluZXIpOwotCQl0aGlzLnJpZ2h0Q29udHJvbCA9IGFkZFJpZ2h0Q29udHJvbChjb250YWluZXIpOwotCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlhZGRMZWZ0Q29udHJvbChjb250YWluZXIpLAotCQkJdGhpcy5tYWluQ29udHJvbCwKLQkJCXRoaXMucmlnaHRDb250cm9sLAotCQkJZ2V0SGVscElkKCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBsZWZ0IGNvbnRyb2wuIEJ5IGRlZmF1bHQgYSBsYWJlbCBpcyBjcmVhdGVkIGFuZCBpdHMgdGV4dCBpcwotCSAqIHJldHJpZXZlZCBieSB7QGxpbmsgI2dldExhYmVsVGV4dCgpfS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGxlZnQgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGFkZExlZnRDb250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIGFkZExhYmVsKGNvbnRhaW5lciwgZ2V0TGFiZWxUZXh0KCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSB0ZXh0IG9mIHRoZSBsYWJlbC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5Ci0JICoge0BsaW5rICNidWlsZExlZnRDb250cm9sKENvbXBvc2l0ZSl9LgotCSAqCi0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIHRleHQgb2YgdGhlIGxlZnQgY29udHJvbCAod2hpY2ggaXMgYSBsYWJlbCBieQotCSAqIGRlZmF1bHQpCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRMYWJlbFRleHQoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1haW4gY29udHJvbCBvZiB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBtYWluIGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29udHJvbCBhZGRNYWluQ29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHJpZ2h0IGNvbnRyb2wuIEJ5IGRlZmF1bHQgYSBicm93c2UgYnV0dG9uIGlzIGNyZWF0ZWQgYW5kIGl0cwotCSAqIGFjdGlvbiBpcyBwZXJmb3JtZWQgYnkge0BsaW5rICNidWlsZEJyb3dzZUFjdGlvbigpfSBhbmQgaXRzIHRleHQgaXMKLQkgKiByZXRyaWV2ZWQgYnkge0BsaW5rICNnZXRCcm93c2VCdXR0b25UZXh0KCl9LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgcmlnaHQgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGFkZFJpZ2h0Q29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBhZGRCdXR0b24oCi0JCQljb250YWluZXIsCi0JCQlnZXRCcm93c2VCdXR0b25UZXh0KCksCi0JCQlidWlsZEJyb3dzZUFjdGlvbigpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBvZiB0aGUgYnJvd3NlIGJ1dHRvbi4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5Ci0JICoge0BsaW5rICNidWlsZFJpZ2h0Q29udHJvbChDb21wb3NpdGUpfS4KLQkgKgotCSAqIEByZXR1cm4gIkJyb3dzZS4uLiIKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEJyb3dzZUJ1dHRvblRleHQoKSB7Ci0JCXJldHVybiBKcHRDb21tb25VaU1lc3NhZ2VzLkNob29zZXJQYW5lX2Jyb3dzZUJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBhY3Rpb24gcmVzcG9uc2libGUgdG8gcGVyZm9ybSB0aGUgYWN0aW9uIHdoZW4gdGhlIEJyb3dzZSBpcwotCSAqIGNsaWNrZWQuCi0JICoKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlJ1bm5hYmxlPC9jb2RlPiBwZXJmb3JtaW5nIHRoZSBhY3R1YWwgYWN0aW9uIG9mIHRoZQotCSAqIGJ1dHRvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBSdW5uYWJsZSBidWlsZEJyb3dzZUFjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGVscCB0b3BpYyBJRCBmb3IgdGhlIGNvbnRyb2xzIG9mIHRoaXMgcGFuZS4KLQkgKgotCSAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQgb3RoZXJ3aXNlIHRoZSBzdWJjbGFzcyBjYW4gcmV0dXJuIGFuIElECi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9DbGFzc0Nob29zZXJDb21ib1BhbmUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9DbGFzc0Nob29zZXJDb21ib1BhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwZWIzYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvQ2xhc3NDaG9vc2VyQ29tYm9QYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLmNvbnRlbnRhc3Npc3QuQ29udHJvbENvbnRlbnRBc3Npc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogVGhpcyBjaG9vc2VyIGFsbG93cyB0aGUgdXNlciB0byBjaG9vc2UgYSB0eXBlIHdoZW4gYnJvd3NpbmcgYW5kIGl0IGFkZHMgY29kZQotICogY29tcGxldGlvbiBzdXBwb3J0IHRvIHRoZSB0ZXh0IGZpZWxkLCB3aGljaCBpcyB0aGUgbWFpbiBjb21wb25lbnQuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IExhYmVsOiB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYICB8IHwgQnJvd3NlLi4uIHwgfAotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGFzc0Nob29zZXJDb21ib1BhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIENsYXNzQ2hvb3NlclBhbmU8VD4KLXsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2xhc3NDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIENsYXNzQ2hvb3NlckNvbWJvUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2xhc3NDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2xhc3NDaG9vc2VyQ29tYm9QYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgYWRkTWFpbkNvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21wb3NpdGUgc3ViUGFuZSA9IGFkZFN1YlBhbmUoY29udGFpbmVyKTsKLSAgICAJQ29tYm8gY29tYm8gPSB0aGlzLmFkZENsYXNzQ29tYm8oc3ViUGFuZSk7Ci0KLQkJQ29udHJvbENvbnRlbnRBc3Npc3RIZWxwZXIuY3JlYXRlQ29tYm9Db250ZW50QXNzaXN0YW50KAotCQkJY29tYm8sCi0JCQlqYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3IKLQkJKTsKLQotCQlyZXR1cm4gc3ViUGFuZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbWJvIGFkZENsYXNzQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gdGhpcy5hZGRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJdGhpcy5idWlsZENsYXNzTGlzdEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFRleHRIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRDbGFzc0NvbnZlcnRlcigpCi0JCSk7Ci0gCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENsYXNzTGlzdEhvbGRlcigpOwotCQotCXByb3RlY3RlZCBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZENsYXNzQ29udmVydGVyKCkgewotCQlyZXR1cm4gU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuaW5zdGFuY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0NsYXNzQ2hvb3NlclBhbmUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9DbGFzc0Nob29zZXJQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMmM1NDIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0NsYXNzQ2hvb3NlclBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLmNvbnRlbnRhc3Npc3QuQ29udHJvbENvbnRlbnRBc3Npc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLmNvbnRlbnRhc3Npc3QuSmF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLk5ld0NsYXNzQ3JlYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0NsYXNzV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuSnB0Q29tbW9uVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5DbGFzc05hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkh5cGVybGluazsKLQotLyoqCi0gKiBUaGlzIGNob29zZXIgYWxsb3dzIHRoZSB1c2VyIHRvIGNob29zZSBhIHR5cGUgd2hlbiBicm93c2luZyBhbmQgaXQgYWRkcyBjb2RlCi0gKiBjb21wbGV0aW9uIHN1cHBvcnQgdG8gdGhlIHRleHQgZmllbGQsIHdoaWNoIGlzIHRoZSBtYWluIGNvbXBvbmVudC4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIHwgTGFiZWw6IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCcm93c2UuLi4gfCB8Ci0gKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NDaG9vc2VyUGFuZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgQ2hvb3NlclBhbmU8VD4KLXsKLQkvKioKLQkgKiBUaGUgY29kZSBjb21wbGV0aW9uIG1hbmFnZXIuCi0JICovCi0JcHJvdGVjdGVkIEphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvciBqYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3I7Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc3ViamVjdENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DbGFzc0Nob29zZXJQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2xhc3NDaG9vc2VyUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2xhc3NDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2xhc3NDaG9vc2VyUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2xhc3NDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2xhc3NDaG9vc2VyUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGVuYWJsZWRNb2RlbCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZW5hYmxlZE1vZGVsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0KLQkJLy8gVE9ETyBidWcgMTU2MTg1IC0gd2hlbiB0aGlzIGlzIGZpeGVkIHRoZXJlIHNob3VsZCBiZSBhcGkgZm9yIHRoaXMKLQkJdGhpcy5qYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3IgPSBidWlsZEphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvcigpOwotCi0JCXRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zdWJqZWN0Q2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuY2xhc3NDaG9vc2VyU3ViamVjdENoYW5nZWQoZ2V0U3ViamVjdCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yIGJ1aWxkSmF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlyZXR1cm4gbmV3IEphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvcihmYWxzZSwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDbGFzc0Nob29zZXJQYW5lLnRoaXMuY2xhc3NDaG9vc2VyU3ViamVjdENoYW5nZWQoKFQpIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xhc3NDaG9vc2VyU3ViamVjdENoYW5nZWQoVCBuZXdTdWJqZWN0KSB7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gbnVsbDsKLQkJaWYgKG5ld1N1YmplY3QgIT0gbnVsbCkgewotCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKLQkJCWlmIChyb290ICE9IG51bGwpIHsKLQkJCQlwYWNrYWdlRnJhZ21lbnQgPSByb290LmdldFBhY2thZ2VGcmFnbWVudCgiIik7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5qYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3Iuc2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VGcmFnbWVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgYWRkTGVmdENvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpZiggISB0aGlzLmFsbG93VHlwZUNyZWF0aW9uKCkpIHsKLQkJCXJldHVybiBzdXBlci5hZGRMZWZ0Q29udHJvbChjb250YWluZXIpOwotCQl9Ci0JCUh5cGVybGluayBsYWJlbExpbmsgPSB0aGlzLmFkZEh5cGVybGluayhjb250YWluZXIsCi0JCQl0aGlzLmdldExhYmVsVGV4dCgpLAotCQkJdGhpcy5idWlsZEh5cGVyTGlua0FjdGlvbigpCi0JCSk7Ci0JCXJldHVybiBsYWJlbExpbms7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEh5cGVyTGlua0FjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlDbGFzc0Nob29zZXJQYW5lLnRoaXMuaHlwZXJMaW5rU2VsZWN0ZWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoeXBlckxpbmtTZWxlY3RlZCgpIHsKLQkJSVR5cGUgdHlwZSA9IHJlc29sdmVKZHRUeXBlKCk7Ci0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCW9wZW5JbkVkaXRvcih0eXBlKTsJCi0JCX0KLQkJZWxzZSBpZiAoYWxsb3dUeXBlQ3JlYXRpb24oKSl7Ci0JCQljcmVhdGVUeXBlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIElUeXBlIHJlc29sdmVKZHRUeXBlKCkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gdGhpcy5nZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpOwotCQlpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBKRFRUb29scy5maW5kVHlwZSh0aGlzLmdldEphdmFQcm9qZWN0KCksIGNsYXNzTmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVR5cGUoKSB7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCi0JCU5ld0NsYXNzV2l6YXJkUGFnZSBuZXdDbGFzc1dpemFyZFBhZ2UgPSBuZXcgTmV3Q2xhc3NXaXphcmRQYWdlKCk7Ci0JCW5ld0NsYXNzV2l6YXJkUGFnZS5pbml0KHNlbGVjdGlvbik7Ci0JCW5ld0NsYXNzV2l6YXJkUGFnZS5zZXRTdXBlckNsYXNzKGdldFN1cGVyY2xhc3NOYW1lKCksIHRydWUpOwotCQluZXdDbGFzc1dpemFyZFBhZ2Uuc2V0U3VwZXJJbnRlcmZhY2VzKGdldFN1cGVySW50ZXJmYWNlTmFtZXMoKSwgdHJ1ZSk7Ci0JCVN0cmluZyBxdWFsaWZpZWRDbGFzc05hbWUgPSB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKCk7Ci0JCWlmICghU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShxdWFsaWZpZWRDbGFzc05hbWUpKSB7Ci0JCQluZXdDbGFzc1dpemFyZFBhZ2Uuc2V0VHlwZU5hbWUoQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUocXVhbGlmaWVkQ2xhc3NOYW1lKSwgdHJ1ZSk7Ci0JCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUocXVhbGlmaWVkQ2xhc3NOYW1lKTsKLQkJCW5ld0NsYXNzV2l6YXJkUGFnZS5zZXRQYWNrYWdlRnJhZ21lbnQoZ2V0Rmlyc3RKYXZhU291cmNlRm9sZGVyKCkuZ2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lKSwgdHJ1ZSk7Ci0JCX0KLQkJTmV3Q2xhc3NDcmVhdGlvbldpemFyZCB3aXphcmQgPSBuZXcgTmV3Q2xhc3NDcmVhdGlvbldpemFyZChuZXdDbGFzc1dpemFyZFBhZ2UsIGZhbHNlKTsKLQkJd2l6YXJkLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgc2VsZWN0aW9uKTsKLQotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWludCBkUmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGRSZXN1bHQgPT0gV2luZG93Lk9LKSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gKG5ld0NsYXNzV2l6YXJkUGFnZS5nZXRDcmVhdGVkVHlwZSgpKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpKTsKLQkJCXNldENsYXNzTmFtZShjbGFzc05hbWUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKTsKLQkKLQkvKioKLQkgKiBPdmVycmlkZSB0aGlzIHRvIGNoYW5nZSB0aGUgZW5jbG9zaW5nIHR5cGUgc2VwYXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIGNoYXIgZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJcmV0dXJuICckJzsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGUgdGhpcyB0byBzZXQgYSBzdXBlcmNsYXNzIGluIHRoZSBOZXcgQ2xhc3Mgd2l6YXJkLiAgSWYgbm8gY2xhc3MgaXMgY2hvc2VuLCAKLQkgKiBjbGlja2luZyB0aGUgaHlwZXJsaW5rIGxhYmVsIHdpbGwgb3BlbiB0aGUgbmV3IGNsYXNzIHdpemFyZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN1cGVyY2xhc3NOYW1lKCkgewotCQlyZXR1cm4gIiI7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgdG8gc2V0IGEgc3VwZXIgaW50ZXJmYWNlIGluIHRoZSBOZXcgQ2xhc3Mgd2l6YXJkLiAgSWYgbm8gY2xhc3MgaXMgY2hvc2VuLCAKLQkgKiBjbGlja2luZyB0aGUgaHlwZXJsaW5rIGxhYmVsIHdpbGwgb3BlbiB0aGUgbmV3IGNsYXNzIHdpemFyZC4KLQkgKiBAc2VlIGdldFN1cGVySW50ZXJmYWNlTmFtZQotCSAqLwotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gZ2V0U3VwZXJJbnRlcmZhY2VOYW1lcygpIHsKLQkJcmV0dXJuIGdldFN1cGVySW50ZXJmYWNlTmFtZSgpICE9IG51bGwgPyBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGdldFN1cGVySW50ZXJmYWNlTmFtZSgpKSA6IENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCk7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgdG8gc2V0IGEgc3VwZXIgaW50ZXJmYWNlIGluIHRoZSBOZXcgQ2xhc3Mgd2l6YXJkLiAgSWYgbm8gY2xhc3MgaXMgY2hvc2VuLCAKLQkgKiBjbGlja2luZyB0aGUgaHlwZXJsaW5rIGxhYmVsIHdpbGwgb3BlbiB0aGUgbmV3IGNsYXNzIHdpemFyZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN1cGVySW50ZXJmYWNlTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgaWYgaXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBhbGxvdyB0aGUgdXNlciB0byBjcmVhdGUgYSBuZXcgdHlwZS4KLQkgKiBUaGlzIHdpbGwgZGV0ZXJtaW5lIHdoZXRoZXIgY2xpY2tpbmcgdGhlIGh5cGVybGluayBvcGVucyB0aGUgTmV3IENsYXNzIHdpemFyZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhbGxvd1R5cGVDcmVhdGlvbigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG9wZW5JbkVkaXRvcihJVHlwZSB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlKYXZhVUkub3BlbkluRWRpdG9yKHR5cGUsIHRydWUsIHRydWUpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0Q29tbW9uVWlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRDb21tb25VaVBsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCk7Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIFJ1bm5hYmxlIGJ1aWxkQnJvd3NlQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXByb21wdFR5cGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBhZGRNYWluQ29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbXBvc2l0ZSBzdWJQYW5lID0gYWRkU3ViUGFuZShjb250YWluZXIpOwotCQlUZXh0IHRleHQgPSBhZGRUZXh0KHN1YlBhbmUsIGJ1aWxkVGV4dEhvbGRlcigpKTsKLQotCQlDb250cm9sQ29udGVudEFzc2lzdEhlbHBlci5jcmVhdGVUZXh0Q29udGVudEFzc2lzdGFudCgKLQkJCXRleHQsCi0JCQlqYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3IKLQkJKTsKLQotCQlyZXR1cm4gc3ViUGFuZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB2YWx1ZSBob2xkZXIgb2YgdGhlIHN1YmplY3QncyBwcm9wZXJ0eS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGhvbGRlciBvZiB0aGUgY2xhc3MgbmFtZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCk7Ci0KLQkvKioKLQkgKiBQcm9tcHRzIHRoZSB1c2VyIHRoZSBPcGVuIFR5cGUgZGlhbG9nLgotCSAqCi0JICogQHJldHVybiBFaXRoZXIgdGhlIHNlbGVjdGVkIHR5cGUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHVzZXIKLQkgKiBjYW5jZWxsZWQgdGhlIGRpYWxvZwotCSAqLwotCXByb3RlY3RlZCBJVHlwZSBjaG9vc2VUeXBlKCkgewotCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7IGdldEphdmFQcm9qZWN0KCkgfTsKLQkJSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotCQlTZWxlY3Rpb25EaWFsb2cgdHlwZVNlbGVjdGlvbkRpYWxvZzsKLQotCQl0cnkgewotCQkJdHlwZVNlbGVjdGlvbkRpYWxvZyA9IEphdmFVSS5jcmVhdGVUeXBlRGlhbG9nKAotCQkJCWdldFNoZWxsKCksCi0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKSwKLQkJCQlzY29wZSwKLQkJCQlnZXRUeXBlRGlhbG9nU3R5bGUoKSwKLQkJCQlmYWxzZSwKLQkJCQlTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGdldENsYXNzTmFtZSgpKSA/ICIiIDogQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUoZ2V0Q2xhc3NOYW1lKCkpCi0JCQkpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0Q29tbW9uVWlQbHVnaW4ubG9nKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldFRpdGxlKEpwdENvbW1vblVpTWVzc2FnZXMuQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dUaXRsZSk7Ci0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0TWVzc2FnZShKcHRDb21tb25VaU1lc3NhZ2VzLkNsYXNzQ2hvb3NlclBhbmVfZGlhbG9nTWVzc2FnZSk7Ci0KLQkJaWYgKHR5cGVTZWxlY3Rpb25EaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJcmV0dXJuIChJVHlwZSkgdHlwZVNlbGVjdGlvbkRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0VHlwZURpYWxvZ1N0eWxlKCkgewotCQlyZXR1cm4gSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0NMQVNTRVM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNsYXNzIG5hbWUgZnJvbSBpdHMgc3ViamVjdC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGNsYXNzIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBpcyBkZWZpbmVkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDbGFzc05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgKCcuJyBxdWFsaWZpY2F0aW9uKQotCSAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIGdldENsYXNzTmFtZSgpIGRvZXMgbm90IHJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzc05hbWUoKSA9PSBudWxsID8gbnVsbCA6IHRoaXMuZ2V0Q2xhc3NOYW1lKCkucmVwbGFjZSgnJCcsICcuJyk7Ci0JfQotCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290IGdldEZpcnN0SmF2YVNvdXJjZUZvbGRlcigpIHsKLQkJSXRlcmF0b3I8SVBhY2thZ2VGcmFnbWVudFJvb3Q+IGkgPSBKRFRUb29scy5nZXRKYXZhU291cmNlRm9sZGVycyhnZXRKYXZhUHJvamVjdCgpKS5pdGVyYXRvcigpOwotCQlyZXR1cm4gaS5oYXNOZXh0KCkgPyBpLm5leHQoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIGJyb3dzZSBidXR0b24gd2FzIGNsaWNrZWQsIGl0cyBhY3Rpb24gaW52b2tlcyB0aGlzIGFjdGlvbiB3aGljaCBzaG91bGQKLQkgKiBwcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGEgY2xhc3MgYW5kIHNldCBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9tcHRUeXBlKCkgewotCQlJVHlwZSB0eXBlID0gdGhpcy5jaG9vc2VUeXBlKCk7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKSk7Ci0JCQlzZXRDbGFzc05hbWUoY2xhc3NOYW1lKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkgewotCQl0cnkgewotCQkJcmV0dXJuIHRoaXMuZ2V0SmF2YVByb2plY3QoKS5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpWzBdOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vblVpUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN1YmplY3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0NvbWJvUGFuZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0NvbWJvUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDQ2ZWQxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9Db21ib1BhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFBhbmUgd2l0aCBjb21ibyBib3ggc3VwcG9ydCBmb3IgYXV0b21hdGljIHVwZGF0aW5nIG9mOgotICogIC0gc2VsZWN0ZWQgdmFsdWUKLSAqICAtIGRlZmF1bHQgdmFsdWUKLSAqICAtIHZhbHVlIGNob2ljZXMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbWJvUGFuZTxUIGV4dGVuZHMgTW9kZWw+Ci0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JLyoqCi0JICogVGhlIG1haW4gKG9ubHkpIHdpZGdldCBvZiB0aGlzIHBhbmUuCi0JICovCi0JcHJvdGVjdGVkIENvbWJvIGNvbWJvQm94OwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXByb3RlY3RlZCBDb21ib1BhbmUoCi0JCQlQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCQotCXByb3RlY3RlZCBDb21ib1BhbmUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCQotCXByb3RlY3RlZCBDb21ib1BhbmUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGVuYWJsZWRNb2RlbCkgewotCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGVuYWJsZWRNb2RlbCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmNvbWJvQm94ID0gdGhpcy5hZGRFZGl0YWJsZUNvbWJvKGNvbnRhaW5lcik7Ci0JCXRoaXMuY29tYm9Cb3guYWRkTW9kaWZ5TGlzdGVuZXIodGhpcy5idWlsZE1vZGlmeUxpc3RlbmVyKCkpOwotCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIodGhpcy5jb21ib0JveCk7Ci0JfQotCQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBidWlsZE1vZGlmeUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJQ29tYm9QYW5lLnRoaXMuY29tYm9Cb3hNb2RpZmllZCgpOwotCQkJfQotCQl9OwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHR5cGljYWwgb3ZlcnJpZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBvc3NpYmxlIHZhbHVlcyB0byBiZSBhZGRlZCB0byB0aGUgY29tYm8gZHVyaW5nCi0JICogcG9wdWxhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmFibGU8U3RyaW5nPiBnZXRWYWx1ZXMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29tYm8gaXMgdG8gYWRkIGEgZGVmYXVsdCB2YWx1ZSB0byB0aGUgY2hvaWNlcwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVzZXNEZWZhdWx0VmFsdWUoKSB7Ci0JCS8vIGRlZmF1bHQgcmVzcG9uc2UgaXMgJ3RydWUnCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGRlZmF1bHQgaXMKLQkgKiBzcGVjaWZpZWQuIFRoaXMgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIHdoZW4gdGhlIHN1YmplY3QgaXMgbm9uLW51bGwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgc3ViamVjdC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZSBzdWJqZWN0IGlzIG5vbi1udWxsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VmFsdWUoKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIHNwZWNpZmllZCB2YWx1ZSBhcyB0aGUgbmV3IHZhbHVlIG9uIHRoZSBzdWJqZWN0LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCXRoaXMudXBkYXRlU2VsZWN0ZWRJdGVtKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXN1cGVyLmRvUG9wdWxhdGUoKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbWJvQm94KCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogcG9wdWxhdGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIFBvcHVsYXRlIHRoZSBjb21iby1ib3ggbGlzdCBieSBjbGVhcmluZyBpdCwgdGhlbiBhZGRpbmcgZmlyc3QgdGhlIGRlZmF1bHQKLQkgKiB2YWx1ZSwgaWYgYXZhaWxhYmxlLCBhbmQgdGhlbiB0aGUgcG9zc2libGUgY2hvaWNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUNvbWJvQm94KCkgewotCQl0aGlzLmNvbWJvQm94LnJlbW92ZUFsbCgpOwotCQkKLQkJaWYgKHVzZXNEZWZhdWx0VmFsdWUoKSkgewotCQkJdGhpcy5jb21ib0JveC5hZGQodGhpcy5idWlsZERlZmF1bHRWYWx1ZUVudHJ5KCkpOwotCQl9Ci0JCQkKLQkJZm9yIChTdHJpbmcgdmFsdWUgOiB0aGlzLmdldFZhbHVlcygpKSB7Ci0JCQl0aGlzLmNvbWJvQm94LmFkZCh2YWx1ZSk7Ci0JCX0KLQkJCi0JCXRoaXMudXBkYXRlU2VsZWN0ZWRJdGVtXygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFZhbHVlRW50cnkoKSB7Ci0JCWlmIChnZXRTdWJqZWN0KCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIEpwdENvbW1vblVpTWVzc2FnZXMuTm9uZVNlbGVjdGVkOwotCQl9Ci0JCVN0cmluZyBkZWZhdWx0VmFsdWUgPSB0aGlzLmdldERlZmF1bHRWYWx1ZSgpOwotCQlyZXR1cm4gKGRlZmF1bHRWYWx1ZSA9PSBudWxsKSA/IHRoaXMuYnVpbGROdWxsRGVmYXVsdFZhbHVlRW50cnkoKSA6IHRoaXMuYnVpbGROb25OdWxsRGVmYXVsdFZhbHVlRW50cnkoZGVmYXVsdFZhbHVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZE51bGxEZWZhdWx0VmFsdWVFbnRyeSgpIHsKLQkJcmV0dXJuIEpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdEVtcHR5OwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkTm9uTnVsbERlZmF1bHRWYWx1ZUVudHJ5KFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQlkZWZhdWx0VmFsdWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZWxlY3RlZEl0ZW0oKSB7Ci0JCS8vIG1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB1cCB0byBkYXRlICg/Pz8gfmJqdikKLQkJaWYgKHVzZXNEZWZhdWx0VmFsdWUoKSkgewotCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZUVudHJ5ID0gdGhpcy5idWlsZERlZmF1bHRWYWx1ZUVudHJ5KCk7Ci0JCQlpZiAoICEgdGhpcy5jb21ib0JveC5nZXRJdGVtKDApLmVxdWFscyhkZWZhdWx0VmFsdWVFbnRyeSkpIHsKLQkJCQl0aGlzLmNvbWJvQm94LnJlbW92ZSgwKTsKLQkJCQl0aGlzLmNvbWJvQm94LmFkZChkZWZhdWx0VmFsdWVFbnRyeSwgMCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXRoaXMudXBkYXRlU2VsZWN0ZWRJdGVtXygpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzZWxlY3RlZCBpdGVtIGJ5IHNlbGVjdGluZyB0aGUgY3VycmVudCB2YWx1ZSwgaWYgbm90Ci0JICogPGNvZGU+bnVsbDwvY29kZT4sIG9yIHNlbGVjdCB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBvbmUgaXMgYXZhaWxhYmxlLAotCSAqIG90aGVyd2lzZSByZW1vdmUgdGhlIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZWxlY3RlZEl0ZW1fKCkgewotCQlTdHJpbmcgdmFsdWUgPSAodGhpcy5nZXRTdWJqZWN0KCkgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5nZXRWYWx1ZSgpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJaWYgKHVzZXNEZWZhdWx0VmFsdWUoKSkgewotCQkJCS8vIHNlbGVjdCB0aGUgZGVmYXVsdCB2YWx1ZQotCQkJCXRoaXMuY29tYm9Cb3guc2VsZWN0KDApOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5jb21ib0JveC5zZXRUZXh0KCIiKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIHNlbGVjdCB0aGUgbmV3IHZhbHVlCi0JCQlpZiAoICEgdmFsdWUuZXF1YWxzKHRoaXMuY29tYm9Cb3guZ2V0VGV4dCgpKSkgewotCQkJCS8vIFRoaXMgcHJldmVudHMgdGhlIGN1cnNvciBmcm9tIGJlaW5nIHNldCBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgKGJ1ZyAyMzQ0MTgpLgotCQkJCS8vIFRoZSByZWFzb24gd2UgYXJlIGhpdHRpbmcgdGhpcyBtZXRob2QgYXQgYWxsIGlzIGJlY2F1c2UgdGhlCi0JCQkJLy8gY29udGV4dCBtb2RlbCBpcyB1cGRhdGluZyBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCBpbiBhIHdheQotCQkJCS8vIHRoYXQgY2F1c2VzIGNoYW5nZSBub3RpZmljYXRpb25zIHRvIGJlIGZpcmVkICh0aGUgYW5ub3RhdGlvbgotCQkJCS8vIGlzIGFkZGVkIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hhbmdlIG5vdGlmaWNhdGlvbiBvY2N1cnMKLQkJCQkvLyBvbiB0aGUgdXBkYXRlIHRocmVhZCwgYW5kIHRoZW4gdGhlIG5hbWUgaXMgc2V0LCB0aGVzZSAyCi0JCQkJLy8gdGhyZWFkcyBjYW4gZ2V0IGluIHRoZSB3cm9uZyBvcmRlcikuCi0JCQkJLy8gVGhlICN2YWx1ZUNoYW5nZWQoKSBtZXRob2Qgc2V0cyB0aGUgcG9wdWxhdGluZyBmbGFnIHRvIHRydWUsCi0JCQkJLy8gYnV0IGluIHRoaXMgY2FzZSBpdCBpcyBhbHJlYWR5IHNldCBiYWNrIHRvIGZhbHNlIHdoZW4gd2UKLQkJCQkvLyByZWNlaXZlIG5vdGlmaWNhdGlvbiBiYWNrIGZyb20gdGhlIG1vZGVsIGJlY2F1c2UgaXQgaGFzCi0JCQkJLy8gbW92ZWQgdG8gdGhlIHVwZGF0ZSB0aHJlYWQgYW5kIHRoZW4ganVtcHMgYmFjayBvbiB0aGUgVUkgdGhyZWFkLgotCQkJCXRoaXMuY29tYm9Cb3guc2V0VGV4dCh2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVwb3B1bGF0ZUNvbWJvQm94KCkgewotCQlpZiAoICEgdGhpcy5jb21ib0JveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMucmVwb3B1bGF0ZSgpOwotCQl9Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogY29tYm8tYm94IGxpc3RlbmVyIGNhbGxiYWNrICoqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGNvbWJvQm94TW9kaWZpZWQoKSB7Ci0JCWlmICggISB0aGlzLmlzUG9wdWxhdGluZygpKSB7Ci0JCQl0aGlzLnZhbHVlQ2hhbmdlZCh0aGlzLmNvbWJvQm94LmdldFRleHQoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhlIGNvbWJvLWJveCBzZWxlY3Rpb24gaGFzIGNoYW5nZWQsIHVwZGF0ZSB0aGUgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqIElmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCBhbmQgdGhlIHN1YmplY3QgaXMgbnVsbCwgd2UgY2FuIGJ1aWxkIGEgc3ViamVjdAotCSAqIGJlZm9yZSBzZXR0aW5nIHRoZSB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVQgc3ViamVjdCA9IHRoaXMuZ2V0U3ViamVjdCgpOwotCQlTdHJpbmcgb2xkVmFsdWU7Ci0JCWlmIChzdWJqZWN0ID09IG51bGwpIHsKLQkJCWlmICh0aGlzLm51bGxTdWJqZWN0SXNOb3RBbGxvd2VkKCkpIHsKLQkJCQlyZXR1cm47ICAvLyBubyBzdWJqZWN0IHRvIHNldCB0aGUgdmFsdWUgb24KLQkJCX0KLQkJCW9sZFZhbHVlID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCW9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQl9Ci0JCQotCQkvLyBjb252ZXJ0IGVtcHR5IHN0cmluZyBvciBkZWZhdWx0IHRvIG51bGwKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkobmV3VmFsdWUpIHx8IHRoaXMudmFsdWVJc0RlZmF1bHQobmV3VmFsdWUpKSB7Ci0JCQluZXdWYWx1ZSA9IG51bGw7Ci0JCX0KLQkJCi0JCS8vIHNldCB0aGUgbmV3IHZhbHVlIGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgdmFsdWUKLQkJaWYgKFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudChvbGRWYWx1ZSwgbmV3VmFsdWUpKSB7Ci0JCQl0aGlzLnNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJdGhpcy5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRoaXMuc2V0UG9wdWxhdGluZyhmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgd2UgY2FuIHNldCB0aGUgdmFsdWUgd2hlbiB0aGUgc3ViamVjdCBpcyBudWxsCi0JICogKGkuZS4gI3NldFZhbHVlKFN0cmluZykgd2lsbCBjb25zdHJ1Y3QgdGhlIHN1YmplY3QgaWYgbmVjZXNzYXJ5KS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBudWxsU3ViamVjdElzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBudWxsU3ViamVjdElzTm90QWxsb3dlZCgpIHsKLQkJcmV0dXJuICEgdGhpcy5udWxsU3ViamVjdElzQWxsb3dlZCgpOwotCX0KLQkKLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiB2YWx1ZSBpcyBub3QgbnVsbAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbHVlSXNEZWZhdWx0KFN0cmluZyB2YWx1ZSkgewotCQlpZiAoISB1c2VzRGVmYXVsdFZhbHVlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gKHRoaXMuY29tYm9Cb3guZ2V0SXRlbUNvdW50KCkgPiAwKQotCQkJCSYmIHZhbHVlLmVxdWFscyh0aGlzLmNvbWJvQm94LmdldEl0ZW0oMCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9EZWZhdWx0V2lkZ2V0RmFjdG9yeS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0RlZmF1bHRXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZjRkYzMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0RlZmF1bHRXaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EYXRlVGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5IeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcExheW91dDsKLQotLyoqCi0gKiBUaGlzIDxjb2RlPldpZGdldEZhY3Rvcnk8L2NvZGU+IHNpbXBseSBjcmVhdGVzIHBsYWluIFNXVCB3aWRnZXRzLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFdpZGdldEZhY3RvcnkgaW1wbGVtZW50cyBXaWRnZXRGYWN0b3J5IHsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyA8Y29kZT5JV2lkZ2V0RmFjdG9yeTwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBXaWRnZXRGYWN0b3J5IElOU1RBTkNFID0gbmV3IERlZmF1bHRXaWRnZXRGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRlZmF1bHRXaWRnZXRGYWN0b3J5PC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIERlZmF1bHRXaWRnZXRGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPklXaWRnZXRGYWN0b3J5PC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPklXaWRnZXRGYWN0b3J5PC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV2lkZ2V0RmFjdG9yeSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVCdXR0b24ocGFyZW50LCB0ZXh0LCBTV1QuTlVMTCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBidXR0b24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gc3R5bGUgVGhlIHN0eWxlIHRvIGFwcGx5IHRvIHRoZSBidXR0b24sIHdoaWNoIGRldGVybWluZXMgaXRzIHR5cGU6Ci0JICogdG9nZ2xlLCBwdXNoLCBjaGVjayBib3gsIHJhZGlvCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBzdHlsZSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBDQ29tYm8gY3JlYXRlQ0NvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBDQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlQnV0dG9uKHBhcmVudCwgdGV4dCwgU1dULkNIRUNLKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIENvbWJvIGNyZWF0ZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQl9Ci0JCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBEYXRlVGltZSBjcmVhdGVEYXRlVGltZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJcmV0dXJuIG5ldyBEYXRlVGltZShwYXJlbnQsIHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgQ0NvbWJvIGNyZWF0ZUVkaXRhYmxlQ0NvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBDQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIENvbWJvIGNyZWF0ZUVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IENvbWJvKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBHcm91cCBjcmVhdGVHcm91cChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGl0bGUpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWdyb3VwLnNldFRleHQodGl0bGUpOwotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBIeXBlcmxpbmsgY3JlYXRlSHlwZXJsaW5rKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUh5cGVybGluayBoeXBlcmxpbmsgPSBuZXcgSHlwZXJsaW5rKHBhcmVudCwgU1dULk5VTEwpOwotCQloeXBlcmxpbmsuc2V0VGV4dCh0ZXh0KTsKLQkJcmV0dXJuIGh5cGVybGluazsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuV1JBUCk7Ci0JCWxhYmVsLnNldFRleHQobGFiZWxUZXh0KTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgTGlzdCBjcmVhdGVMaXN0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlyZXR1cm4gbmV3IExpc3QocGFyZW50LCBTV1QuQk9SREVSIHwgc3R5bGUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgRm9ybVRleHQgY3JlYXRlTXVsdGlMaW5lTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCkgewotCi0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCVRhYmxlV3JhcExheW91dCBsYXlvdXQgPSBuZXcgVGFibGVXcmFwTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zICAgPSAxOwotCQlsYXlvdXQuYm90dG9tTWFyZ2luID0gMDsKLQkJbGF5b3V0LmxlZnRNYXJnaW4gICA9IDA7Ci0JCWxheW91dC5yaWdodE1hcmdpbiAgPSAwOwotCQlsYXlvdXQudG9wTWFyZ2luICAgID0gMDsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCi0JCUZvcm1Ub29sa2l0IHdpZGdldEZhY3RvcnkgPSBuZXcgRm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7Ci0JCUZvcm1UZXh0IHRleHQgPSB3aWRnZXRGYWN0b3J5LmNyZWF0ZUZvcm1UZXh0KGNvbnRhaW5lciwgdHJ1ZSk7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQl0ZXh0LnNldFRleHQobGFiZWxUZXh0LCBmYWxzZSwgZmFsc2UpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgVGV4dCBjcmVhdGVNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBUZXh0IGNyZWF0ZVBhc3N3b3JkVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUEFTU1dPUkQpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQnV0dG9uIGNyZWF0ZVB1c2hCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlQnV0dG9uKHBhcmVudCwgdGV4dCwgU1dULlBVU0gpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIHRleHQsIFNXVC5SQURJTyk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXJldHVybiBuZXcgU2VjdGlvbihwYXJlbnQsIHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFNwaW5uZXIgY3JlYXRlU3Bpbm5lcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgU3Bpbm5lcihwYXJlbnQsIFNXVC5OVUxMKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFRhYmxlIGNyZWF0ZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlyZXR1cm4gbmV3IFRhYmxlKHBhcmVudCwgU1dULkJPUkRFUiB8IHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQnV0dG9uIGNyZWF0ZVRyaVN0YXRlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJVHJpU3RhdGVDaGVja0JveCBjaGVja0JveCA9IG5ldyBUcmlTdGF0ZUNoZWNrQm94KHBhcmVudCwgdGV4dCwgdGhpcyk7Ci0JCXJldHVybiBjaGVja0JveC5nZXRDaGVja0JveCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRGlhbG9nLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZWNhZjUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlRpdGxlQXJlYURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBkaWFsb2cgdXNpbmcgYSAic3RhdGUgb2JqZWN0IiAobW9kZWwgb2JqZWN0KQotICogZm9yIGJlaGF2aW9yLgotICogPHA+Ci0gKiBUaGUgbWFpbiBwYW5lIG9mIHRoaXMgZGlhbG9nIHNob3VsZCBiZSBleHRlbmRpbmcgPGNvZGU+RGlhbG9nUGFuZTwvY29kZT4KLSAqIGZvciBjcmVhdGluZyB0aGUgcmlnaHQgdHlwZSBvZiB3aWRnZXRzIGFuZCBpdCBoYXMgdGhlICJzdGF0ZSBvYmplY3QiIChzdWJqZWN0KQotICogYmVoYXZpb3IgYnVpbHQtaW4uCi0gKgotICogQHNlZSBOb2RlCi0gKiBAc2VlIERpYWxvZ1BhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlhbG9nPFQgZXh0ZW5kcyBOb2RlPiBleHRlbmRzIFRpdGxlQXJlYURpYWxvZwotewotCS8qKgotCSAqIFRoZSBtYWluIGNvbnRlbnQgcGFuZSBvZiB0aGlzIGRpYWxvZy4KLQkgKi8KLQlwcml2YXRlIERpYWxvZ1BhbmU8Pz4gcGFuZTsKLQotCS8qKgotCSAqIFRoZSBob2xkZXIgb2YgdGhlICJzdGF0ZSBvYmplY3QiIHVzZWQgYnkgdGhpcyBkaWFsb2cuCi0JICovCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXI7Ci0KLQkvKioKLQkgKiBDYWNoZXMgdGhlIHRpdGxlIHRleHQgdW50aWwgdGhlIGRpYWxvZyBpcyBjcmVhdGVkIGFuZCB0aGUgZGlhbG9nJ3Mgc2hlbGwKLQkgKiBuZWVkcyB0byBiZSBjb25maWd1cmVkLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EaWFsb2c8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCi0JICovCi0JcHJvdGVjdGVkIERpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJdGhpcyhwYXJlbnQsICIiKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRpYWxvZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gdGl0bGUgVGhlIGRpYWxvZydzIHRpdGxlCi0JICovCi0JcHJvdGVjdGVkIERpYWxvZyhTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgbWFpbiBwYW5lIG9mIHRoaXMgZGlhbG9nLiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIG9ubHkKLQkgKiB3aGVuIHRoZSBkaWFsb2cgaXMgcmVxdWVzdGVkIHRvIHNob3cgb24gc2NyZWVuIGFuZCBub3QgZHVyaW5nCi0JICogaW5pdGlhbGl6YXRpb24uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgdG8gd2hpY2ggdGhlIHdpZGdldHMgc2hvdWxkIGJlIGFkZGVkIHRvLAotCSAqIHRoZSBsYXlvdXQgaXMgYWxyZWFkeSBzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRGlhbG9nUGFuZTw/PiBidWlsZExheW91dChDb21wb3NpdGUgY29udGFpbmVyKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHN0YXRlIG9iamVjdCAobW9kZWwgb2JqZWN0KSB0aGF0IHdpbGwgYmUgdXNlZCB0byBrZWVwIHRyYWNrCi0JICogb2YgdGhlIGluZm9ybWF0aW9uIGVudGVyZWQgaW4gdGhpcyBkaWFsb2cuIFRoZSBzdGF0ZSBvYmplY3Qgd2lsbCBiZSBzdG9yZWQKLQkgKiBpbiB0aGUgc3ViamVjdCBob2xkZXIgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcge0BsaW5rICNzdWJqZWN0KCl9LgotCSAqCi0JICogQHJldHVybiBBIG5ldyBzdGF0ZSBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgVCBidWlsZFN0YXRlT2JqZWN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSA8Y29kZT5WYWxpZGF0b3I8L2NvZGU+IHRoYXQgd2lsbCBiZSBub3RpZmllZCB3aGVuIGNoYW5nZXMgYXJlCi0JICogbWFkZSB0byB0aGUgc3RhdGUgb2JqZWN0LgotCSAqCi0JICogQHJldHVybiBUaGUgdmFsaWRhdG9yIHRoYXQgd2lsbCBiZSBzZXQgb24gdGhlIHN0YXRlIG9iamVjdAotCSAqLwotCU5vZGUuVmFsaWRhdG9yIGJ1aWxkVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gTm9kZS5OVUxMX1ZBTElEQVRPUjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQotCQkvLyBEaXNwb3NlIHRoZSBwYW5lIGluIG9yZGVyIHRvIHJlbW92ZSBhbnkgbGlzdGVuZXJzIHRoYXQgY291bGQKLQkJLy8gaGF2ZSBiZWVuIGluc3RhbGxlZCBvdXRzaWRlIHRoZSBzY3JvcGUgb2YgdGhlIHN0YXRlIG9iamVjdAotCQlpZiAocGFuZSAhPSBudWxsKSB7Ci0JCQlwYW5lLmRpc3Bvc2UoKTsKLQkJCXBhbmUgPSBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dChnZXRUaXRsZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotCQlzdXBlci5jcmVhdGUoKTsKLQkJaW5zdGFsbFN1YmplY3QoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChoYXNUaXRsZUFyZWEoKSkgewotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCX0KLQotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdENvbnRlbnQocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IG1haW4gY29udGFpbmVyIG9mIHRoaXMgZGlhbG9nIHdoZW4gdGhlIHRpdGxlIGFyZWEgaXMKLQkgKiBub3QgcmVxdWlyZWQuIFRoZSB0b3AgcGFydCBpcyB0aGUgZGlhbG9nIGFyZWEgcG9wdWxhdGVkIGJ5IHRoZSBzdWJjbGFzcwotCSAqIGFuZCB0aGUgbG93ZXIgcGFydCBpcyB0aGUgYnV0dG9uIHBhbmUgaGF2aW5nIHRoZSBPSyBhbmQgQ2FuY2VsIGJ1dHRvbnMuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUKLQkgKi8KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVEZWZhdWx0Q29udGVudChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgICAgICA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCAgICA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCAgICAgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhjb21wb3NpdGUpOwotCQlkaWFsb2dBcmVhID0gY3JlYXRlRGlhbG9nQXJlYShjb21wb3NpdGUpOwotCQlidXR0b25CYXIgID0gY3JlYXRlQnV0dG9uQmFyKGNvbXBvc2l0ZSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCS8vIElmIHRoZSB0aXRsZSBhcmVhIG5lZWRzIHRvIGJlIHNob3duLCB0aGVuIGxlYXZlIHRoZSBzdXBlcmNsYXNzIHRvCi0JCS8vIGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IHdpZGdldHMKLQkJaWYgKGhhc1RpdGxlQXJlYSgpKSB7Ci0JCQlwYXJlbnQgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCX0KLQotCQkvLyBDcmVhdGUgdGhlIG1haW4gYXJlYSdzIGNvbnRhaW5lcgotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCAgICAgICAgID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlICAgPSB0cnVlOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSB0aGUgY29udGVudCBwYW5lCi0JCXBhbmUgPSBidWlsZExheW91dChjb250YWluZXIpOwotCi0JCS8vIEluaXRpYWxpemUgdGhlIFVJIHBhcnQsIHdoaWNoIHJlcXVpcmVzIHRoZSB3aWRnZXRzIGJlaW5nIGNyZWF0ZWQKLQkJaW5pdGlhbGl6ZVVJKCk7Ci0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRlc2NyaXB0aW9uIGFyZWEgKHdoZXJlIGEgdGl0bGUsIGRlc2NyaXB0aW9uIGFuZAotCSAqIGltYWdlKSBzaG91bGQgYmUgdmlzaWJsZSBvciBoaWRkZW4uIDxjb2RlPlZhbGlkYXRpbmdEaWFsb2c8L2NvZGU+Ci0JICogYXV0b21hdGljYWxseSBzaG93IHRoZSBkZXNjcmlwdGlvbiBhcmVhIGluIG9yZGVyIHRvIHNob3cgcHJvYmxlbXMuCi0JICoKLQkgKiBAcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBieSBkZWZhdWx0LCB3aGljaCBtZWFucyB0aGUgbWV0aG9kcyB1c2VkIHRvCi0JICogdXBkYXRlIHRoZSB0aXRsZSwgZGVzY3JpcHRpb24gYW5kIGltYWdlIHNob3VsZG4ndCBiZSBjYWxsZWQ7IDxjb2RlPnRydWU8L2NvZGU+Ci0JICogdG8gbWFrZSB0aGUgZGVzY3JpcHRpb24gcGFuZSB2aXNpYmxlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzVGl0bGVBcmVhKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGVscHMgc3lzdGVtLgotCSAqCi0JICogQHJldHVybiBUaGUgcGxhdGZvcm0ncyBoZWxwIHN5c3RlbQotCSAqCi0JICogQGNhdGVnb3J5IEhlbHBlcgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJV29ya2JlbmNoSGVscFN5c3RlbSBnZXRIZWxwU3lzdGVtKCkgewotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBkaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUPigpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBVSSBwYXJ0IG9mIHRoaXMgZGlhbG9nLCB0aGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgd2lkZ2V0cwotCSAqIGhhdmUgYmVlbiBjcmVhdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVVSSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBzdGF0ZSBvYmplY3QsIGlmIG9uZSBpcyBuZWVkZWQgYW5kIGluc3RhbGwgYSA8Y29kZT5WYWxpZGF0b3I8L2NvZGU+Ci0JICogaW4gb3JkZXIgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gb2YgY2hhbmdlcyBkb25lIHRvIHRoYXQgc3RhdGUgb2JqZWN0LiBUaGUKLQkgKiBzdWJqZWN0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgc3ViamVjdCBob2xkZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxTdWJqZWN0KCkgewotCi0JCVQgc3ViamVjdCA9IGJ1aWxkU3RhdGVPYmplY3QoKTsKLQotCQlpZiAoc3ViamVjdCAhPSBudWxsKSB7Ci0JCQlzdWJqZWN0LnNldFZhbGlkYXRvcihidWlsZFZhbGlkYXRvcigpKTsKLQkJfQotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUoc3ViamVjdCk7Ci0JfQotCi0JLyoqCi0JICogR2l2ZXMgYWNjZXNzIHRvIHRoZSBkaWFsb2cncyBtYWluIHBhbmUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBwYW5lIHNob3dpbmcgdGhlIGN1c3RvbSB3aWRnZXRzCi0JICovCi0JcHJvdGVjdGVkIERpYWxvZ1BhbmU8Pz4gZ2V0UGFuZSgpIHsKLQkJcmV0dXJuIHBhbmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3ViamVjdCBvZiB0aGlzIGRpYWxvZy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHN1YmplY3Qgb2YgdGhpcyBkaWFsb2cgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3ViamVjdCB3YXMKLQkgKiB1c2VkCi0JICovCi0JcHVibGljIFQgZ2V0U3ViamVjdCgpIHsKLQkJcmV0dXJuIHN1YmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBzdWJqZWN0IGhvbGRlciB1c2VkIHRvIGJlIHBhc3NlZCB0byB0aGUgZGlhbG9nIHBhbmUsIHdoaWNoIGlzCi0JICogYW4gaW5zdGFuY2Ugb2YgPGNvZGU+RGlhbG9nUGFuZTwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IGdldFN1YmplY3RIb2xkZXIoKSB7Ci0JCXJldHVybiBzdWJqZWN0SG9sZGVyOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGlhbG9nJ3MgdGl0bGUuIFRoZSB0aXRsZSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIHdpbGwgYmUKLQkgKiByZXR1cm5lZCBieSBkZWZhdWx0IGJ1dCBpZiBpdCB3YXNuJ3Qgc3BlY2lmaWVkLCB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZAotCSAqIHRvIHJldHVybiBpdC4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIHRoZSB0aXRsZSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIG9yIGEgZGlmZmVyZW50IHRpdGxlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgZGlhbG9nIHdhcyBjYW5jZWxsZWQgb3Igbm90LgotCSAqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGlhbG9nIHdhcyBjYW5jZWxsZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGl0IHdhcyBjb25maXJtZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiB3YXNDYW5jZWxsZWQoKSB7Ci0JCXJldHVybiBnZXRSZXR1cm5Db2RlKCkgPT0gQ0FOQ0VMOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgZGlhbG9nIHdhcyBjb25maXJtZWQgb3Igbm90LgotCSAqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGlhbG9nIHdhcyBjb25maXJtZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGl0IHdhcyBjYW5jZWxsZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiB3YXNDb25maXJtZWQoKSB7Ci0JCXJldHVybiBnZXRSZXR1cm5Db2RlKCkgPT0gT0s7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9EaWFsb2dQYW5lLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRGlhbG9nUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjNjZDBjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9EaWFsb2dQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IHBhbmUgdG8gdXNlIHdoZW4gdGhlIHBhbmUgaXMgc2hvd24gaW4gYW4gPGNvZGU+RGlhbG9nPC9jb2RlPi4KLSAqCi0gKiBAc2VlIERpYWxvZwotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlhbG9nUGFuZTxUIGV4dGVuZHMgTm9kZT4gZXh0ZW5kcyBQYW5lPFQ+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGlhbG9nUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRyb2xsZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhbG9nUGFuZShEaWFsb2dQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EaWFsb2dQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqIEBwYXJhbSBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIHdpZGdldHMKLQkgKiB0aGlzIHBhbmUgYWxpZ25lZCB3aXRoIHRoZSB3aWRnZXRzIG9mIHRoZSBnaXZlbiBwYXJlbnQgY29udHJvbGxlcjsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGFsaWduIHRoZW0KLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBEaWFsb2dQYW5lKERpYWxvZ1BhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRpYWxvZ1BhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhbG9nUGFuZShEaWFsb2dQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRpYWxvZ1BhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICogQHBhcmFtIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgd2lkZ2V0cwotCSAqIHRoaXMgcGFuZSBhbGlnbmVkIHdpdGggdGhlIHdpZGdldHMgb2YgdGhlIGdpdmVuIHBhcmVudCBjb250cm9sbGVyOwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxpZ24gdGhlbQotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIERpYWxvZ1BhbmUoRGlhbG9nUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cykgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EaWFsb2dQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBEaWFsb2dQYW5lKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIERlZmF1bHRXaWRnZXRGYWN0b3J5Lmluc3RhbmNlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRW51bUNvbWJvVmlld2VyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRW51bUNvbWJvVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNDJlZjMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1Db21ib1ZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotLyoqCi0gKiBUaGlzIHBhbmUgc2ltcGx5IHNob3dzIGEgY29tYm8gd2hlcmUgaXRzIGRhdGEgaXMgcG9wdWxhdGluZyB0aHJvdWdoCi0gKiB7QGxpbmsgI2Nob2ljZXMoKX0gYW5kIGEgZGVmYXVsdCB2YWx1ZSBjYW4gYWxzbyBiZSBhZGRlZC4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1hYnN0cmFjdCBjbGFzcyBFbnVtQ29tYm9WaWV3ZXI8VCBleHRlbmRzIE1vZGVsLCBWPiBleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBUaGUgbWFpbiB3aWRnZXQgb2YgdGhpcyBwYW5lLgotCSAqLwotCXByaXZhdGUgQ29tYm9WaWV3ZXIgY29tYm9WaWV3ZXI7Ci0KLQkvKioKLQkgKiBBIGNvbnN0YW50IHVzZWQgdG8gcmVwcmVzZW50IHRoZSA8Y29kZT5udWxsPC9jb2RlPiB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX1ZBTFVFID0gIm51bGwiOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnVtQ29tYm9WaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICovCi0JRW51bUNvbWJvVmlld2VyKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnVtQ29tYm9WaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICovCi0JRW51bUNvbWJvVmlld2VyKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnVtQ29tYm9WaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqLwotCUVudW1Db21ib1ZpZXdlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGxpc3Qgb2YgY2hvaWNlcyBhbmQgYWRkIGFuIGV4dHJhIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZQotCSAqIGRlZmF1bHQgdmFsdWUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBjb21ibydzIGNob2ljZXMgaW5jbHVkaW5nIHRoZSBkZWZhdWx0IHZhbHVlCi0JICovCi0JcHJpdmF0ZSBPYmplY3RbXSBidWlsZENob2ljZXMoKSB7Ci0JCVZbXSBjaG9pY2VzID0gZ2V0Q2hvaWNlcygpOwotCQlpZiAoc29ydENob2ljZXMoKSkgewotCQkJQXJyYXlzLnNvcnQoY2hvaWNlcywgYnVpbGRDb21wYXJhdG9yKCkpOwotCQl9Ci0KLQkJT2JqZWN0W10gZXh0ZW5kZWRDaG9pY2VzID0gbmV3IE9iamVjdFtjaG9pY2VzLmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGNob2ljZXMsIDAsIGV4dGVuZGVkQ2hvaWNlcywgMSwgY2hvaWNlcy5sZW5ndGgpOwotCQlleHRlbmRlZENob2ljZXNbMF0gPSBOVUxMX1ZBTFVFOwotCi0JCXJldHVybiBleHRlbmRlZENob2ljZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgdG8gc29ydCB0aGUgY2hvaWNlcyBpbiBhbHBoYWJldGljYWwgb3JkZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSA8Y29kZT5Db21ib1ZpZXdlcjwvY29kZT4gd2l0aCB0aGUgcmlnaHQgY29tYm8gd2lkZ2V0cy4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgY29tYm8KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbWJvVmlld2VyPC9jb2RlPiBjb250YWluaW5nIHRoZSByaWdodCBjb21ibyB3aWRnZXQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tYm9WaWV3ZXIgYWRkQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gYWRkQ29tYm9WaWV3ZXIoY29udGFpbmVyLCBidWlsZExhYmVsUHJvdmlkZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPE9iamVjdD4gYnVpbGRDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8T2JqZWN0PigpIHsKLQkJCWZpbmFsIExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IGJ1aWxkTGFiZWxQcm92aWRlcigpOwotCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMSA9IHRoaXMubGFiZWxQcm92aWRlci5nZXRUZXh0KHZhbHVlMSk7Ci0JCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcyID0gdGhpcy5sYWJlbFByb3ZpZGVyLmdldFRleHQodmFsdWUyKTsKLQkJCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGRpc3BsYXlTdHJpbmcxLCBkaXNwbGF5U3RyaW5nMik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGlzcGxheSBzdHJpbmcgZm9yIHRoZSBnaXZlbiBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCBpcyB0aGUKLQkgKiB2aXJ0dWFsIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlIHRoZW4gaXRzIGRpc3BsYXkgc3RyaW5nIHdpbGwgYmUgIkRlZmF1bHQiCi0JICogYXBwZW5kZWQgYnkgdGhlIGFjdHVhbCBkZWZhdWx0IHZhbHVlLCBpZiBpdCBleGlzdHMuCi0JICoKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQgaW50byBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZwotCSAqIEByZXR1cm4gVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGlzcGxheVN0cmluZyhPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IE5VTExfVkFMVUUpIHsKLQkJCVYgZGVmYXVsdFZhbHVlID0gKGdldFN1YmplY3QoKSAhPSBudWxsKSA/IGdldERlZmF1bHRWYWx1ZSgpIDogbnVsbDsKLQotCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBkaXNwbGF5U3RyaW5nKGRlZmF1bHRWYWx1ZSk7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKEpwdENvbW1vblVpTWVzc2FnZXMuRW51bUNvbWJvVmlld2VyX2RlZmF1bHRXaXRoRGVmYXVsdCwgZGlzcGxheVN0cmluZyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbERpc3BsYXlTdHJpbmcoKTsKLQkJfQotCi0JCXJldHVybiBkaXNwbGF5U3RyaW5nKChWKSB2YWx1ZSk7Ci0JfQotCi0JZmluYWwgTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZyhlbGVtZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIElTZWxlY3Rpb24gYnVpbGRTZWxlY3Rpb24oKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IChnZXRTdWJqZWN0KCkgIT0gbnVsbCkgPyBnZXRWYWx1ZSgpIDogbnVsbDsKLQotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdmFsdWUgPSBOVUxMX1ZBTFVFOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgYnVpbGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQlpZiAoIWlzUG9wdWxhdGluZygpKSB7Ci0JCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCXZhbHVlQ2hhbmdlZChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwb3NzaWJsZSBjaG9pY2VzIHRvIHNob3cgaW4gdGhlIHZpZXdlci4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGl0ZW1zIHRvIHNob3cgaW4gdGhlIGNvbWJvcwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBWW10gZ2V0Q2hvaWNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSwgdGhpcyBtZXRob2QgaXMgbm90IGNhbGxlZCBpZiB0aGUgc3ViamVjdCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqCi0JICogQHJldHVybiBUaGUgdmFsdWUgdGhhdCBpcyBkZWNsYXJlZCBhcyBiZWluZyB0aGUgZGVmYXVsdCB3aGVuIGl0IGlzIG5vdAotCSAqIGRlZmluZWQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBWIGdldERlZmF1bHRWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdmFsdWUuCi0JICoKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRyYW5zbGF0ZSBpbnRvIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nCi0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIHRleHQgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZGlzcGxheVN0cmluZyhWIHZhbHVlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSBzdHJpbmcgZm9yIGEgbnVsbCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG51bGxEaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gbnVsbDsgLy9JIHdvdWxkIHJhdGhlciBkaXNwbGF5IG5vdGhpbmcgdGhhbiAiRGVmYXVsdCgpIgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXN1cGVyLmRvUG9wdWxhdGUoKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbWJvKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucwotCSAqCi0JICogQHJldHVybgotCSAqLwotCWZpbmFsIENvbWJvVmlld2VyIGdldENvbWJvVmlld2VyKCkgewotCQlyZXR1cm4gdGhpcy5jb21ib1ZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHN1YmplY3QncyB2YWx1ZS4gVGhlIHN1YmplY3QgaXMgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBzdWJqZWN0JyB2YWx1ZSwgd2hpY2ggY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFYgZ2V0VmFsdWUoKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuY29tYm9WaWV3ZXIgPSB0aGlzLmFkZENvbWJvVmlld2VyKGNvbnRhaW5lcik7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGJ1aWxkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkpOwotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgY29tYm8gYnkgcmUtYWRkaW5nIGFsbCB0aGUgaXRlbXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tYm8oKSB7Ci0KLQkJcmVtb3ZlQWxsKCk7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuYWRkKGJ1aWxkQ2hvaWNlcygpKTsKLQkJdXBkYXRlU2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCXRoaXMucG9wdWxhdGVDb21ibygpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIHRoZSBpdGVtcyBmcm9tIHRoZSBjb21iby4KLQkgKi8KLQlhYnN0cmFjdCB2b2lkIHJlbW92ZUFsbCgpOwotCi0JLyoqCi0JICogUmVxdWVzdHMgdGhlIGdpdmVuIG5ldyB2YWx1ZSBiZSBzZXQgb24gdGhlIHN1YmplY3QuCi0JICoKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSB0byBiZSBzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRWYWx1ZShWIHZhbHVlKTsKLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGN1cnNvciwgd2hpY2ggaXMgcmVxdWlyZWQgdG8gc2hvdyB0aGUgZW50aXJlIHNlbGVjdGVkIGl0ZW0KLQkgKiB3aXRoaW4gdGhlIGNvbWJvJ3MgYXJlYS4KLQkgKi8KLQlhYnN0cmFjdCB2b2lkIHVwZGF0ZUN1cnNvcigpOwotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgY29tYm8ncyBzZWxlY3RlZCBpdGVtLgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVTZWxlY3Rpb24oKSB7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKGJ1aWxkU2VsZWN0aW9uKCkpOwotCQl1cGRhdGVDdXJzb3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc2VsZWN0aW9uIGNoYW5nZXMsIG5vdGlmeSB0aGUgc3ViY2xhc3MgdG8gc2V0IHRoZSB2YWx1ZS4KLQkgKgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHNlbGVjdGVkIGl0ZW0KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHZvaWQgdmFsdWVDaGFuZ2VkKE9iamVjdCB2YWx1ZSkgewotCi0JCS8vIENvbnZlcnQgdGhlIGRlZmF1bHQgIm51bGwiIHZhbHVlIHRvIGEgcmVhbCBudWxsCi0JCWlmICh2YWx1ZSA9PSBOVUxMX1ZBTFVFKSB7Ci0JCQl2YWx1ZSA9IG51bGw7Ci0JCX0KLQotCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCXRyeSB7Ci0JCQlzZXRWYWx1ZSgoVikgdmFsdWUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJc2V0UG9wdWxhdGluZyhmYWxzZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRW51bURpYWxvZ0NvbWJvVmlld2VyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRW51bURpYWxvZ0NvbWJvVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZGM5MDEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1EaWFsb2dDb21ib1ZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyA8Y29kZT5FbnVtQ29tYm9WaWV3ZXI8L2NvZGU+IHNob3VsZCBiZSB1c2VkIHdpdGhpbiBhIGRpYWxvZyBwYW5lLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW51bURpYWxvZ0NvbWJvVmlld2VyPFQgZXh0ZW5kcyBNb2RlbCwgVj4KLQlleHRlbmRzIEVudW1Db21ib1ZpZXdlcjxULCBWPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW51bURpYWxvZ0NvbWJvVmlld2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBFbnVtRGlhbG9nQ29tYm9WaWV3ZXIoRGlhbG9nUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQKLQkpIHsKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudW1EaWFsb2dDb21ib1ZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgRW51bURpYWxvZ0NvbWJvVmlld2VyKERpYWxvZ1BhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQKLQkpIHsKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm8gZ2V0Q29tYm8oKSB7Ci0JCXJldHVybiBnZXRDb21ib1ZpZXdlcigpLmdldENvbWJvKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCByZW1vdmVBbGwoKSB7Ci0JCWdldENvbWJvKCkucmVtb3ZlQWxsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCB1cGRhdGVDdXJzb3IoKSB7Ci0JCWdldENvbWJvKCkuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCAwKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1Gb3JtQ29tYm9WaWV3ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9FbnVtRm9ybUNvbWJvVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YTFjMGUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1Gb3JtQ29tYm9WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgPGNvZGU+RW51bUNvbWJvVmlld2VyPC9jb2RlPiBzaG91bGQgYmUgdXNlZCB3aXRoaW4gYSBmb3JtIHBhbmUuCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbnVtRm9ybUNvbWJvVmlld2VyPFQgZXh0ZW5kcyBNb2RlbCwgVj4KLQlleHRlbmRzIEVudW1Db21ib1ZpZXdlcjxULCBWPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW51bUZvcm1Db21ib1ZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgRW51bUZvcm1Db21ib1ZpZXdlcihQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQKLQkpIHsKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudW1Gb3JtQ29tYm9WaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICovCi0JcHJvdGVjdGVkIEVudW1Gb3JtQ29tYm9WaWV3ZXIoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50Ci0JKSB7Ci0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvIGdldENvbWJvKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb21ib1ZpZXdlcigpLmdldENvbWJvKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCByZW1vdmVBbGwoKSB7Ci0JCWdldENvbWJvKCkucmVtb3ZlQWxsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCB1cGRhdGVDdXJzb3IoKSB7Ci0JCWdldENvbWJvKCkuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCAwKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0ZpbGVDaG9vc2VyQ29tYm9QYW5lLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRmlsZUNob29zZXJDb21ib1BhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI0N2JhZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRmlsZUNob29zZXJDb21ib1BhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBUaGlzIGNob29zZXIgYWxsb3dzIHRoZSB1c2VyIHRvIGNob29zZSBhIGZpbGUgd2hlbiBicm93c2luZy4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIHwgTGFiZWw6IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwgfCBCcm93c2UuLi4gfCB8Ci0gKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbGVDaG9vc2VyQ29tYm9QYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBGaWxlQ2hvb3NlclBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkZpbGVDaG9vc2VyQ29tYm9QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRmlsZUNob29zZXJDb21ib1BhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RmlsZUNob29zZXJDb21ib1BhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEZpbGVDaG9vc2VyQ29tYm9QYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGFkZE1haW5Db250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCi0JCXJldHVybiBhZGRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJdGhpcy5idWlsZExpc3RIb2xkZXIoKSwKLQkJCXRoaXMuZ2V0VGV4dEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFN0cmluZ0NvbnZlcnRlcigpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGlzdCBob2xkZXIgb2YgdGhlIGNvbWJvIGJveC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigKLQkJCXRoaXMuYnVpbGREZWZhdWx0TGlzdCgpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBsaXN0IG9mIHRoZSBjb21ibyBib3guCi0JICovCi0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBidWlsZERlZmF1bHRMaXN0KCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0aGlzLmdldERlZmF1bHRTdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29tYm8gYm94LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmYXVsdFN0cmluZygpOwotCQotCS8qKgotCSAqIFRoZSBjb252ZXJ0ZXIgcmVzcG9uc2libGUgdG8gdHJhbnNmb3JtIGVhY2ggY29tYm8gYm94IGl0ZW0KLQkgKiBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkU3RyaW5nQ29udmVydGVyKCkgewotCQlyZXR1cm4gU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFN0cmluZz5pbnN0YW5jZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9GaWxlQ2hvb3NlclBhbmUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9GaWxlQ2hvb3NlclBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFlYmZjMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRmlsZUNob29zZXJQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5KcHRDb21tb25VaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNob29zZXIgYWxsb3dzIHRoZSB1c2VyIHRvIGNob29zZSBhIGZpbGUgd2hlbiBicm93c2luZy4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIHwgTGFiZWw6IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCcm93c2UuLi4gfCB8Ci0gKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlsZUNob29zZXJQYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBDaG9vc2VyUGFuZTxUPgotewotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkZpbGVDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEZpbGVDaG9vc2VyUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5GaWxlQ2hvb3NlclBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEZpbGVDaG9vc2VyUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZmluYWwgUnVubmFibGUgYnVpbGRCcm93c2VBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcHJvbXB0RmlsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIDxjb2RlPlZpZXdlckZpbHRlcjwvY29kZT4gdGhhdCB3aWxsIGZpbHRlciB0aGUgY29udGVudCBvZiB0aGUKLQkgKiBkaWFsb2cgYW5kIG9ubHkgZGlzcGxheXMgd2hhdCBpcyB2YWxpZC4KLQkgKgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Vmlld2VyRmlsdGVyPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBWaWV3ZXJGaWx0ZXIgYnVpbGRGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVmlld2VyRmlsdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwKLQkJCSAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcGFyZW50RWxlbWVudCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCkgewotCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgYWRkTWFpbkNvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gdGhpcy5hZGRUZXh0KGNvbnRhaW5lciwgdGhpcy50ZXh0SG9sZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB2YWx1ZSBob2xkZXIgb2YgdGhlIHN1YmplY3QncyBwcm9wZXJ0eS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGhvbGRlciBvZiB0aGUgY2xhc3MgbmFtZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB2YWxpZGF0b3IgdGhhdCB3aWxsIHNob3cgYSBzdGF0dXMgbWVzc2FnZSBiYXNlZCBvbiB3aGF0IGlzCi0JICogc2VsZWN0ZWQgaW4gdGhlIHNlbGVjdGlvbiBkaWFsb2cuCi0JICoKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgYnVpbGRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcigpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikgewotCi0JCQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggIT0gMSkgewotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRDb21tb25VaVBsdWdpbi5QTFVHSU5fSUQsICIiKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKcHRDb21tb25VaVBsdWdpbi5QTFVHSU5fSUQsICIiKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24gZGlhbG9nJ3MgdGl0bGUuCi0JICoKLQkgKiBAcmV0dXJuIEEgbm9uLTxjb2RlPm51bGw8L2NvZGU+IHN0cmluZwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGlhbG9nVGl0bGUoKTsKLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgcHJvamVjdCBwYXRoIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBzZWxlY3Rpb24gZGlhbG9nLgotCSAqCi0JICogQHJldHVybiBUaGUgcHJvamVjdCBwYXRoIHVzZWQgdG8gZGlzcGxheSBpdHMgY29udGVudCBpbiBhIHNlbGVjdGlvbiBkaWFsb2cKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFByb2plY3RQYXRoKCk7Ci0KLQlwcm90ZWN0ZWQgIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBnZXRUZXh0SG9sZGVyKCkgewotCQlyZXR1cm4gdGhpcy50ZXh0SG9sZGVyOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJdGhpcy50ZXh0SG9sZGVyID0gdGhpcy5idWlsZFRleHRIb2xkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYnJvd3NlIGJ1dHRvbiB3YXMgY2xpY2tlZCwgaXRzIGFjdGlvbiBpbnZva2VzIHRoaXMgYWN0aW9uIHdoaWNoIHNob3VsZAotCSAqIHByb21wdCB0aGUgdXNlciB0byBzZWxlY3QgYSBmaWxlIGFuZCBzZXQgaXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvbXB0RmlsZSgpIHsKLQkJU3RyaW5nIHByb2plY3RQYXRoPSB0aGlzLmdldFByb2plY3RQYXRoKCk7Ci0KLQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhnZXRTaGVsbCgpKTsKLQkJZGlhbG9nLnNldFRleHQodGhpcy5nZXREaWFsb2dUaXRsZSgpKTsKLQkJZGlhbG9nLnNldEZpbHRlclBhdGgocHJvamVjdFBhdGgpOwotCQlTdHJpbmcgZmlsZVBhdGggPSBkaWFsb2cub3BlbigpOwotCQlpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotCQkJRmlsZUNob29zZXJQYW5lLnRoaXMudGV4dEhvbGRlci5zZXRWYWx1ZShmaWxlUGF0aCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRm9sZGVyQ2hvb3NlckNvbWJvUGFuZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0ZvbGRlckNob29zZXJDb21ib1BhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjY2U4YS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRm9sZGVyQ2hvb3NlckNvbWJvUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0KLS8qKgotICogVGhpcyBjaG9vc2VyIGFsbG93cyB0aGUgdXNlciB0byBjaG9vc2UgYSBmb2xkZXIgd2hlbiBicm93c2luZy4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIHwgTGFiZWw6IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwgfCBCcm93c2UuLi4gfCB8Ci0gKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEZvbGRlckNob29zZXJDb21ib1BhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEZvbGRlckNob29zZXJQYW5lPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Gb2xkZXJDaG9vc2VyQ29tYm9QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRm9sZGVyQ2hvb3NlckNvbWJvUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkZvbGRlckNob29zZXJDb21ib1BhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEZvbGRlckNob29zZXJDb21ib1BhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGFkZE1haW5Db250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCi0JCXJldHVybiBhZGRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJdGhpcy5idWlsZExpc3RIb2xkZXIoKSwKLQkJCXRoaXMuZ2V0VGV4dEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFN0cmluZ0NvbnZlcnRlcigpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGlzdCBob2xkZXIgb2YgdGhlIGNvbWJvIGJveC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigKLQkJCXRoaXMuYnVpbGREZWZhdWx0TGlzdCgpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBsaXN0IG9mIHRoZSBjb21ibyBib3guCi0JICovCi0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBidWlsZERlZmF1bHRMaXN0KCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0aGlzLmdldERlZmF1bHRTdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29tYm8gYm94LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmYXVsdFN0cmluZygpOwotCQotCS8qKgotCSAqIFRoZSBjb252ZXJ0ZXIgcmVzcG9uc2libGUgdG8gdHJhbnNmb3JtIGVhY2ggY29tYm8gYm94IGl0ZW0KLQkgKiBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkU3RyaW5nQ29udmVydGVyKCkgewotCQlyZXR1cm4gU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFN0cmluZz5pbnN0YW5jZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0ZvbGRlckNob29zZXJQYW5lLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRm9sZGVyQ2hvb3NlclBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkwMmQzMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRm9sZGVyQ2hvb3NlclBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotCi0vKioKLSAqIFRoaXMgY2hvb3NlciBhbGxvd3MgdGhlIHVzZXIgdG8gY2hvb3NlIGEgZm9sZGVyIHdoZW4gYnJvd3NpbmcuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IExhYmVsOiB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQnJvd3NlLi4uIHwgfAotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGb2xkZXJDaG9vc2VyUGFuZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgQ2hvb3NlclBhbmU8VD4KLXsKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Gb2xkZXJDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEZvbGRlckNob29zZXJQYW5lKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Rm9sZGVyQ2hvb3NlclBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEZvbGRlckNob29zZXJQYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZmluYWwgUnVubmFibGUgYnVpbGRCcm93c2VBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcHJvbXB0Rm9sZGVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgYWRkTWFpbkNvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gdGhpcy5hZGRUZXh0KGNvbnRhaW5lciwgdGhpcy50ZXh0SG9sZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB2YWx1ZSBob2xkZXIgb2YgdGhlIHN1YmplY3QncyBwcm9wZXJ0eS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGhvbGRlciBvZiB0aGUgY2xhc3MgbmFtZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHRvIGJlIHNob3duIGluIHRoZSBzZWxlY3Rpb24gZGlhbG9nLgotCSAqCi0JICogQHJldHVybiBBIG5vbi08Y29kZT5udWxsPC9jb2RlPiBzdHJpbmcgc2hvd24gYWJvdmUgdGhlIHRleHQgZmllbGQgb2YgdGhlCi0JICogc2VsZWN0aW9uIGRpYWxvZwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGlhbG9nTWVzc2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0aW9uIGRpYWxvZydzIHRpdGxlLgotCSAqCi0JICogQHJldHVybiBBIG5vbi08Y29kZT5udWxsPC9jb2RlPiBzdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERpYWxvZ1RpdGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRoIHRoYXQgdGhlIGRpYWxvZyB3aWxsIHVzZSB0byBmaWx0ZXIgdGhlIGRpcmVjdG9yaWVzIGl0Ci0JICogc2hvd3MgdG8gdGhlIGFyZ3VtZW50LCB3aGljaCBtYXkgYmUgbnVsbC4gSWYgdGhlIHN0cmluZyBpcyBudWxsLCB0aGVuIHRoZQotCSAqIG9wZXJhdGluZyBzeXN0ZW0ncyBkZWZhdWx0IGZpbHRlciBwYXRoIHdpbGwgYmUgdXNlZC4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhlIHBhdGggc3RyaW5nIGlzIHBsYXRmb3JtIGRlcGVuZGVudC4gRm9yIGNvbnZlbmllbmNlLCBlaXRoZXIKLQkgKiAnLycgb3IgJ1wnIGNhbiBiZSB1c2VkIGFzIGEgcGF0aCBzZXBhcmF0b3IuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiBUaGUgZmlsdGVyIHBhdGgKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpbHRlclBhdGgoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCAgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGdldFRleHRIb2xkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnRleHRIb2xkZXI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLnRleHRIb2xkZXIgPSB0aGlzLmJ1aWxkVGV4dEhvbGRlcigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBicm93c2UgYnV0dG9uIHdhcyBjbGlja2VkLCBpdHMgYWN0aW9uIGludm9rZXMgdGhpcyBhY3Rpb24gd2hpY2ggc2hvdWxkCi0JICogcHJvbXB0IHRoZSB1c2VyIHRvIHNlbGVjdCBhIGZvbGRlciBhbmQgc2V0IGl0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb21wdEZvbGRlcigpIHsKLQotCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhnZXRTaGVsbCgpKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UodGhpcy5nZXREaWFsb2dNZXNzYWdlKCkpOwotCQlkaWFsb2cuc2V0VGV4dCh0aGlzLmdldERpYWxvZ1RpdGxlKCkpOwotCQlkaWFsb2cuc2V0RmlsdGVyUGF0aCh0aGlzLmZpbHRlclBhdGgoKSk7Ci0JCVN0cmluZyBkaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCi0JCWlmIChkaXJlY3RvcnkgIT0gbnVsbCkgewotCQkJdGhpcy50ZXh0SG9sZGVyLnNldFZhbHVlKGRpcmVjdG9yeSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRm9ybVdpZGdldEZhY3RvcnkuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9Gb3JtV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTEzMDJmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9Gb3JtV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGF0ZVRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLS8qKgotICogVGhpcyA8Y29kZT5XaWRnZXRGYWN0b3J5PC9jb2RlPiBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgdGhlIHdpZGdldHMKLSAqIHVzaW5nIHRoZSA8Y29kZT5Gb3JtVG9vbGtpdDwvY29kZT4gaW4gb3JkZXIgdXNlIHRoZSBmb3JtIHN0eWxlIChmbGF0LXN0eWxlKQotICogbG9vayBhbmQgZmVlbC4KLSAqCi0gKiBAc2VlIEZvcm1Ub29sa2l0Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEZvcm1XaWRnZXRGYWN0b3J5IGltcGxlbWVudHMgV2lkZ2V0RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgYWN0dWFsIGZhY3RvcnkgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBuZXcgd2lkZ2V0cy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEZvcm1Ub29sa2l0IHdpZGdldEZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkZvcm1XaWRnZXRGYWN0b3J5PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBhY3R1YWwgZmFjdG9yeSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIG5ldwotCSAqIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgRm9ybVdpZGdldEZhY3RvcnkoRm9ybVRvb2xraXQgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcigpOwotCi0JCUFzc2VydC5pc05vdE51bGwod2lkZ2V0RmFjdG9yeSwgIlRoZSB3aWRnZXQgZmFjdG9yeSBjYW5ub3QgYmUgbnVsbCIpOwotCQl0aGlzLndpZGdldEZhY3RvcnkgPSB3aWRnZXRGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIFdyYXBzIHRoZSBnaXZlbiA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IGludG8gYSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPgotCSAqIGluIG9yZGVyIHRvIGhhdmUgdGhlIHdpZGdldHMnIGJvcmRlciBwYWludGVkLiBFeGNlcHQgZm9yIDxjb2RlPkNDb21ibzwvY29kZT4sCi0JICogdGhlIHRvcCBhbmQgYm90dG9tIG1hcmdpbnMgaGF2ZSB0byBiZSAyIHBpeGVsIGFuZCB0aGUgbGVmdCBhbmQgcmlnaHQKLQkgKiBtYXJnaW5zIGhhdmUgdG8gYmUgMSBwaXhlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBvZiB0aGUgc3ViLXBhbmUKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdGhhdCBoYXMgdGhlIG5lY2Vzc2FyeSBzcGFjZSB0byBwYWludAotCSAqIHRoZSBib3JkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUJvcmRlckNvbnRhaW5lcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBjcmVhdGVCb3JkZXJDb250YWluZXIoY29udGFpbmVyLCAyLCAxKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVCb3JkZXJDb250YWluZXIoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IG1hcmdpbkhlaWdodCwgaW50IG1hcmdpbldpZHRoKSB7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBtYXJnaW5IZWlnaHQ7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCAgPSBtYXJnaW5XaWR0aDsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0KLQkJY29udGFpbmVyID0gd2lkZ2V0RmFjdG9yeS5jcmVhdGVDb21wb3NpdGUoY29udGFpbmVyKTsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0JCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBjcmVhdGVCdXR0b24ocGFyZW50LCB0ZXh0LCBTV1QuTlVMTCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBidXR0b24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gc3R5bGUgVGhlIHN0eWxlIHRvIGFwcGx5IHRvIHRoZSBidXR0b24sIHdoaWNoIGRldGVybWluZXMgaXRzIHR5cGU6Ci0JICogdG9nZ2xlLCBwdXNoLCBjaGVjayBib3gsIHJhZGlvCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5jcmVhdGVCdXR0b24ocGFyZW50LCB0ZXh0LCBTV1QuRkxBVCB8IHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgQ0NvbWJvIGNyZWF0ZUNDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVDQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbWJvLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBzdHlsZSBUaGUgc3R5bGUgdG8gYXBwbHkgdG8gdGhlIGNvbWJvLCB1c3VhbGx5IHJlYWQtb25seSwgZmxhdAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBDQ29tYm8gY3JlYXRlQ0NvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlwYXJlbnQgPSBjcmVhdGVCb3JkZXJDb250YWluZXIocGFyZW50LCAxLCAxKTsKLQotCQlDQ29tYm8gY29tYm8gPSBuZXcgQ0NvbWJvKHBhcmVudCwgc3R5bGUpOwotCQl3aWRnZXRGYWN0b3J5LmFkYXB0KGNvbWJvLCB0cnVlLCBmYWxzZSk7Ci0KLQkJLy8gQnVnemlsbGEgMTQ1ODM3IC0gd29ya2Fyb3VuZCBmb3Igbm8gYm9yZGVycyBvbiBXaW5kb3dzIFhQCi0JCWlmICh3aWRnZXRGYWN0b3J5LmdldEJvcmRlclN0eWxlKCkgPT0gU1dULkJPUkRFUikgewotCQkJY29tYm8uc2V0RGF0YShGb3JtVG9vbGtpdC5LRVlfRFJBV19CT1JERVIsIEZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJfQotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEJ1dHRvbiBjcmVhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gY3JlYXRlQnV0dG9uKHBhcmVudCwgdGV4dCwgU1dULkNIRUNLKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIENvbWJvIGNyZWF0ZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkgfCBTV1QuRkxBVCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVDb21wb3NpdGUocGFyZW50KTsKLQl9Ci0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBEYXRlVGltZSBjcmVhdGVEYXRlVGltZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJcGFyZW50ID0gY3JlYXRlQm9yZGVyQ29udGFpbmVyKHBhcmVudCk7Ci0KLQkJRGF0ZVRpbWUgZGF0ZVRpbWUgPSBuZXcgRGF0ZVRpbWUocGFyZW50LCBzdHlsZSB8IFNXVC5GTEFUKTsKLQkJZGF0ZVRpbWUuc2V0RGF0YShGb3JtVG9vbGtpdC5LRVlfRFJBV19CT1JERVIsIEZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJdGhpcy53aWRnZXRGYWN0b3J5LmFkYXB0KGRhdGVUaW1lLCB0cnVlLCBmYWxzZSk7Ci0KLQkJcmV0dXJuIGRhdGVUaW1lOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBDQ29tYm8gY3JlYXRlRWRpdGFibGVDQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlQ0NvbWJvKHBhcmVudCwgU1dULk5VTEwpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQ29tYm8gY3JlYXRlRWRpdGFibGVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkZMQVQpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBHcm91cCBjcmVhdGVHcm91cChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGl0bGUpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWdyb3VwLnNldFRleHQodGl0bGUpOwotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBIeXBlcmxpbmsgY3JlYXRlSHlwZXJsaW5rKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiB3aWRnZXRGYWN0b3J5LmNyZWF0ZUh5cGVybGluayhwYXJlbnQsIHRleHQsIFNXVC5GTEFUKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBsYWJlbFRleHQpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlTGFiZWwoY29udGFpbmVyLCBsYWJlbFRleHQsIFNXVC5XUkFQKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIExpc3QgY3JlYXRlTGlzdChDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3R5bGUpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IExpc3QoY29udGFpbmVyLCBTV1QuRkxBVCB8IHN0eWxlKTsKLQkJbGlzdC5zZXREYXRhKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUiwgRm9ybVRvb2xraXQuVEVYVF9CT1JERVIpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEZvcm1UZXh0IGNyZWF0ZU11bHRpTGluZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQpIHsKLQotCQlDb21wb3NpdGUgY29udGFpbmVyID0gd2lkZ2V0RmFjdG9yeS5jcmVhdGVDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJVGFibGVXcmFwTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZVdyYXBMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgICA9IDE7Ci0JCWxheW91dC5ib3R0b21NYXJnaW4gPSAwOwotCQlsYXlvdXQubGVmdE1hcmdpbiAgID0gMDsKLQkJbGF5b3V0LnJpZ2h0TWFyZ2luICA9IDA7Ci0JCWxheW91dC50b3BNYXJnaW4gICAgPSAwOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJRm9ybVRleHQgdGV4dCA9IHdpZGdldEZhY3RvcnkuY3JlYXRlRm9ybVRleHQoY29udGFpbmVyLCB0cnVlKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKSk7Ci0JCXRleHQuc2V0VGV4dChsYWJlbFRleHQsIGZhbHNlLCBmYWxzZSk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBUZXh0IGNyZWF0ZU11bHRpTGluZVRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlVGV4dChwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBUZXh0IGNyZWF0ZVBhc3N3b3JkVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVUZXh0KHBhcmVudCwgU1dULlBBU1NXT1JEKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEJ1dHRvbiBjcmVhdGVQdXNoQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBjcmVhdGVCdXR0b24ocGFyZW50LCB0ZXh0LCBTV1QuUFVTSCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIHRleHQsIFNXVC5SQURJTyk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXJldHVybiB3aWRnZXRGYWN0b3J5LmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBTV1QuRkxBVCB8IHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFNwaW5uZXIgY3JlYXRlU3Bpbm5lcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXBhcmVudCA9IGNyZWF0ZUJvcmRlckNvbnRhaW5lcihwYXJlbnQpOwotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyKHBhcmVudCwgU1dULkZMQVQpOwotCQlzcGlubmVyLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLCBGb3JtVG9vbGtpdC5URVhUX0JPUkRFUik7Ci0JCXdpZGdldEZhY3RvcnkuYWRhcHQoc3Bpbm5lciwgdHJ1ZSwgZmFsc2UpOwotCi0JCXJldHVybiBzcGlubmVyOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgVGFibGUgY3JlYXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCVRhYmxlIHRhYmxlID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVRhYmxlKHBhcmVudCwgU1dULkJPUkRFUiB8IHN0eWxlKTsKLQkJdGFibGUuc2V0RGF0YShGb3JtVG9vbGtpdC5LRVlfRFJBV19CT1JERVIsIEZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZVRleHQocGFyZW50LCBTV1QuTk9ORSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlVGV4dChwYXJlbnQsIG51bGwsIFNXVC5CT1JERVIgfCBTV1QuRkxBVCB8IHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEJ1dHRvbiBjcmVhdGVUcmlTdGF0ZUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsIHRleHQsIHRoaXMpOwotCQlyZXR1cm4gY2hlY2tCb3guZ2V0Q2hlY2tCb3goKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY3R1YWwgZmFjdG9yeSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIG5ldyB3aWRnZXRzLgotCSAqCi0JICogQHJldHVybiBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGUgd2lkZ2V0cyB3aXRoIHRoZSBmb3JtIHN0eWxlIChmbGF0LXN0eWxlKQotCSAqLwotCXB1YmxpYyBGb3JtVG9vbGtpdCBnZXRXaWRnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0ludGVnZXJDb21iby5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0ludGVnZXJDb21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2FlZjQwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9JbnRlZ2VyQ29tYm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRmllbGREZWNvcmF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgaXMgYSByZXBsYWNlbWVudCBmb3IgYSBTcGlubmVyLiAgSXQgaXMgYSBjb21ibyB0aGF0IG9ubHkgYWNjZXB0cyBpbnRlZ2Vycy4KLSAqIEl0IGFsc28gaW5jbHVkZXMgYSBEZWZhdWx0IG9wdGlvbiBpbiB0aGUgY29tYm8uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbnRlZ2VyQ29tYm88VCBleHRlbmRzIE1vZGVsPgotCWV4dGVuZHMgUGFuZTxUPgotewotCi0JLyoqCi0JICogVGhlIG1haW4gKG9ubHkpIHdpZGdldCBvZiB0aGlzIHBhbmUuCi0JICovCi0JcHJpdmF0ZSBDb21ibyBjb21ib0JveDsKLQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBkZWZhdWx0VmFsdWVIb2xkZXI7Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEludGVnZXJDb21ibygKLQkJCQkJCVBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JCQkJCQlDb21wb3NpdGUgcGFyZW50Ci0JKSB7Ci0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIEludGVnZXJDb21ibygKLQkJCQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQKLQkpIHsKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgQ29tYm8gZ2V0Q29tYm8oKSB7Ci0JCXJldHVybiB0aGlzLmNvbWJvQm94OwotCX0KLQkKLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmRlZmF1bHRWYWx1ZUhvbGRlciA9IGJ1aWxkRGVmYXVsdFN0cmluZ0hvbGRlcigpOwotCQl0aGlzLmNvbWJvQm94ID0gdGhpcy5hZGRJbnRlZ2VyQ29tYm8oY29udGFpbmVyKTsKLQotCQlpbnQgbWFyZ2luID0gRmllbGREZWNvcmF0aW9uUmVnaXN0cnkuZ2V0RGVmYXVsdCgpLmdldE1heGltdW1EZWNvcmF0aW9uV2lkdGgoKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTDsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IG1hcmdpbjsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQl0aGlzLmNvbWJvQm94LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJdGhpcy5jb21ib0JveC5hZGRWZXJpZnlMaXN0ZW5lcih0aGlzLmJ1aWxkVmVyaWZ5TGlzdGVuZXIoKSk7Ci0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcih0aGlzLmNvbWJvQm94KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbWJvIGFkZEludGVnZXJDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJCWNvbnRhaW5lciwKLQkJCQlnZXRMYWJlbFRleHQoKSwKLQkJCQlidWlsZERlZmF1bHRMaXN0SG9sZGVyKCksCi0JCQkJYnVpbGRTZWxlY3RlZEl0ZW1TdHJpbmdIb2xkZXIoKSwKLQkJCQlnZXRIZWxwSWQoKQotCQkJCSk7Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgVmVyaWZ5TGlzdGVuZXIgYnVpbGRWZXJpZnlMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBWZXJpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZSkgewotCQkJCUludGVnZXJDb21iby50aGlzLnZlcmlmeUNvbWJvQm94KGUpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPih0aGlzLmRlZmF1bHRWYWx1ZUhvbGRlcik7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0U3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXIsIFN0cmluZz4oYnVpbGREZWZhdWx0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSW50ZWdlciB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBKcHRDb21tb25VaU1lc3NhZ2VzLk5vbmVTZWxlY3RlZDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLnRyYW5zZm9ybSh2YWx1ZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZVN0cmluZyh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRWYWx1ZVN0cmluZyhJbnRlZ2VyIGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJSnB0Q29tbW9uVWlNZXNzYWdlcy5EZWZhdWx0V2l0aE9uZVBhcmFtLAotCQkJCWRlZmF1bHRWYWx1ZQotCQkJKTsKLQl9Ci0JCi0JLyogQ1UgcHJpdmF0ZSAqLyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWVIb2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU2VsZWN0ZWRJdGVtU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlciwgU3RyaW5nPihidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEludGVnZXIgdikgewotCQkJCXJldHVybiAodiA9PSBudWxsKSA/IGdldERlZmF1bHRWYWx1ZVN0cmluZygpIDogdi50b1N0cmluZygpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIHJldmVyc2VUcmFuc2Zvcm1fKFN0cmluZyB2KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZih2KTsKLQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gaWYgdGhlIGRlZmF1bHQgaXMgc2VsZWN0ZWQgZnJvbSB0aGUgY29tYm8sIHNldCBsZW5ndGggdG8gbnVsbAotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKioqKioqKiBhYnN0cmFjdCBtZXRob2RzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldExhYmVsVGV4dCgpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0SGVscElkKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCk7Ci0KLQkvLyAqKioqKioqKioqIGNvbWJvLWJveCB2ZXJpZnkgbGlzdGVuZXIgY2FsbGJhY2sgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5Q29tYm9Cb3goVmVyaWZ5RXZlbnQgZSkgewotCQlpZiAoZS5jaGFyYWN0ZXIgPT0gJ1xiJykgewotCQkJLy9pZ25vcmUgYmFja3NwYWNlCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGUudGV4dC5lcXVhbHMoIiIpIC8vRGVmYXVsdFZhbHVlSGFuZGxlciBzZXRzIHRoZSB0ZXh0IHRvICIiIC8vJE5PTi1OTFMtMSQKLQkJCQl8fCBlLnRleHQuZXF1YWxzKHRoaXMuZGVmYXVsdFZhbHVlSG9sZGVyLmdldFZhbHVlKCkpKSB7IAotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlJbnRlZ2VyLnBhcnNlSW50KGUudGV4dCk7Ci0JCX0KLQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCWUuZG9pdCA9IGZhbHNlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL05ld05hbWVEaWFsb2cuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9OZXdOYW1lRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4N2NlMjEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL05ld05hbWVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogVGhlIGRpYWxvZyB1c2VkIHRvIHJlcXVlc3RzIGEgbmFtZSBmcm9tIHRoZSB1c2VyLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgTmV3TmFtZURpYWxvZyBleHRlbmRzIFZhbGlkYXRpbmdEaWFsb2c8TmV3TmFtZVN0YXRlT2JqZWN0PgotewotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCXByaXZhdGUgSW1hZ2UgZGVzY3JpcHRpb25JbWFnZTsKLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvblRpdGxlOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsVGV4dDsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5OZXdOYW1lRGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqIEBwYXJhbSBkaWFsb2dUaXRsZQotCSAqIEBwYXJhbSBkZXNjcmlwdGlvblRpdGxlCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uSW1hZ2UKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gbmFtZXMKLQkgKi8KLQlOZXdOYW1lRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLAotCSAgICAgICAgICAgICAgU3RyaW5nIGRpYWxvZ1RpdGxlLAotCSAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uVGl0bGUsCi0JICAgICAgICAgICAgICBJbWFnZSBkZXNjcmlwdGlvbkltYWdlLAotCSAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uLAotCSAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgIFN0cmluZyBuYW1lLAotCSAgICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzKQotCXsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlKTsKLQotCQl0aGlzLm5hbWUgICAgICAgICAgICAgPSBuYW1lOwotCQl0aGlzLm5hbWVzICAgICAgICAgICAgPSBuYW1lczsKLQkJdGhpcy5sYWJlbFRleHQgICAgICAgID0gbGFiZWxUZXh0OwotCQl0aGlzLmRlc2NyaXB0aW9uICAgICAgPSBkZXNjcmlwdGlvbjsKLQkJdGhpcy5kZXNjcmlwdGlvbkltYWdlID0gZGVzY3JpcHRpb25JbWFnZTsKLQkJdGhpcy5kZXNjcmlwdGlvblRpdGxlID0gZGVzY3JpcHRpb25UaXRsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGlhbG9nUGFuZTxOZXdOYW1lU3RhdGVPYmplY3Q+IGJ1aWxkTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBOZXdOYW1lRGlhbG9nUGFuZShjb250YWluZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOZXdOYW1lU3RhdGVPYmplY3QgYnVpbGRTdGF0ZU9iamVjdCgpIHsKLQkJcmV0dXJuIG5ldyBOZXdOYW1lU3RhdGVPYmplY3QobmFtZSwgbmFtZXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0KLQkJTmV3TmFtZURpYWxvZ1BhbmUgcGFuZSA9IChOZXdOYW1lRGlhbG9nUGFuZSkgZ2V0UGFuZSgpOwotCQlwYW5lLnNlbGVjdEFsbCgpOwotCi0JCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJbWFnZSBnZXREZXNjcmlwdGlvbkltYWdlKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb25JbWFnZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvblRpdGxlKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb25UaXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQsIHdoaWNoIGlzIHRoZSBuZXcgbmFtZSB0aGUgdXNlciBlbnRlcmVkLgotCSAqCi0JICogQHJldHVybiBUaGUgbmFtZSB0aGUgdXNlciBlbnRlcmVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldE5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIE5ld05hbWVEaWFsb2dQYW5lIGV4dGVuZHMgRGlhbG9nUGFuZTxOZXdOYW1lU3RhdGVPYmplY3Q+IHsKLQotCQlwcml2YXRlIFRleHQgdGV4dDsKLQotCQlOZXdOYW1lRGlhbG9nUGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihOZXdOYW1lRGlhbG9nLnRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBwYXJlbnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TmV3TmFtZVN0YXRlT2JqZWN0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgTmV3TmFtZVN0YXRlT2JqZWN0Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5nZXROYW1lKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQlzdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJCXRleHQgPSBhZGRMYWJlbGVkVGV4dCgKLQkJCQljb250YWluZXIsCi0JCQkJbGFiZWxUZXh0LAotCQkJCWJ1aWxkTmFtZUhvbGRlcigpCi0JCQkpOwotCQl9Ci0KLQkJdm9pZCBzZWxlY3RBbGwoKSB7Ci0JCQl0ZXh0LnNlbGVjdEFsbCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL05ld05hbWVEaWFsb2dCdWlsZGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvTmV3TmFtZURpYWxvZ0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE0MmMwNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvTmV3TmFtZURpYWxvZ0J1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRoaXMgYnVpbGRlciBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgYSBmdWxseSBpbml0aWFsaXplZAotICogPGNvZGU+TmV3TmFtZURpYWxvZzwvY29kZT4gb25jZSBhbGwgdGhlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNldC4KLSAqCi0gKiBAc2VlIE5ld05hbWVEaWFsb2cKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgTmV3TmFtZURpYWxvZ0J1aWxkZXIgewotCi0JLyoqCi0JICogVGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGVzY3JpcHRpb24gYXJlYS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCS8qKgotCSAqIFRoZSBpbWFnZSBvZiB0aGUgZGVzY3JpcHRpb24gYXJlYS4KLQkgKi8KLQlwcml2YXRlIEltYWdlIGRlc2NyaXB0aW9uSW1hZ2U7Ci0KLQkvKioKLQkgKiBUaGUgdGl0bGUgdG8gc2hvdyBpbiB0aGUgZGVzY3JpcHRpb24gYXJlYS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvblRpdGxlOwotCi0JLyoqCi0JICogVGhlIHRpdGxlIG9mIHRoZSBuZXcgbmFtZSBkaWFsb2cuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGlhbG9nVGl0bGU7Ci0KLQkvKioKLQkgKiBUaGUgdGV4dCBmaWVsZCdzIGxhYmVsLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGxhYmVsVGV4dDsKLQotCS8qKgotCSAqIFRoZSBpbml0aWFsIGlucHV0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGluaXRpYWwgdmFsdWUgY2FuIGJlCi0JICogc3BlY2lmaWVkLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBuYW1lcyB0aGF0IGNhbid0IGJlIHVzZWQgb3IgYW4gZW1wdHkgY29sbGVjdGlvbiBpZiBub25lCi0JICogYXJlIGF2YWlsYWJsZS4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBuYW1lczsKLQotCS8qKgotCSAqIFRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIG5ldyBuYW1lIGRpYWxvZy4KLQkgKi8KLQlwcml2YXRlIFNoZWxsIHBhcmVudFNoZWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5OZXdOYW1lRGlhbG9nQnVpbGRlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwgVGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgbmV3IG5hbWUgZGlhbG9nCi0JICovCi0JcHVibGljIE5ld05hbWVEaWFsb2dCdWlsZGVyKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemUocGFyZW50U2hlbGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRpYWxvZyB0aGF0IHdpbGwgYmUgdXNlZCB0byByZXF1ZXN0IGEgbmV3IG5hbWUgZnJvbSB0aGUgdXNlci4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGluaXRpYWxpemVkIGRpYWxvZwotCSAqLwotCXB1YmxpYyBOZXdOYW1lRGlhbG9nIGJ1aWxkRGlhbG9nKCkgewotCQlyZXR1cm4gbmV3IE5ld05hbWVEaWFsb2coCi0JCQlwYXJlbnRTaGVsbCwKLQkJCWRpYWxvZ1RpdGxlLAotCQkJZGVzY3JpcHRpb25UaXRsZSwKLQkJCWRlc2NyaXB0aW9uSW1hZ2UsCi0JCQlkZXNjcmlwdGlvbiwKLQkJCWxhYmVsVGV4dCwKLQkJCW5hbWUsCi0JCQluYW1lcwotCQkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgYnVpbGRlci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCBUaGUgcGFyZW50IHNoZWxsIG9mIHRoZSBuZXcgbmFtZSBkaWFsb2cKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChwYXJlbnRTaGVsbCwgIlRoZSBwYXJlbnQgc2hlbGwgY2Fubm90IGJlIG51bGwiKTsKLQotCQl0aGlzLnBhcmVudFNoZWxsID0gcGFyZW50U2hlbGw7Ci0JCXRoaXMubmFtZXMgICAgICAgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiB0byBiZSBzaG93biBpbiB0aGUgZGVzY3JpcHRpb24gYXJlYSB1bmRlciB0aGUgdGl0bGUuCi0JICoKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGVzY3JpcHRpb24gYXJlYQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1hZ2UgdG8gYmUgc2hvd24gdG8gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGRlc2NyaXB0aW9uIGFyZWEuCi0JICoKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb25JbWFnZSBUaGUgaW1hZ2Ugb2YgdGhlIGRlc2NyaXB0aW9uIGFyZWEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbkltYWdlKEltYWdlIGRlc2NyaXB0aW9uSW1hZ2UpIHsKLQkJdGhpcy5kZXNjcmlwdGlvbkltYWdlID0gZGVzY3JpcHRpb25JbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0aXRsZSB0byBiZSBzaG93biBpbiB0aGUgZGVzY3JpcHRpb24gYXJlYS4KLQkgKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvblRpdGxlIFRoZSB0aXRsZSB0byBzaG93IGluIHRoZSBkZXNjcmlwdGlvbiBhcmVhCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb25UaXRsZShTdHJpbmcgZGVzY3JpcHRpb25UaXRsZSkgewotCQl0aGlzLmRlc2NyaXB0aW9uVGl0bGUgPSBkZXNjcmlwdGlvblRpdGxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRpYWxvZydzIHRpdGxlLgotCSAqCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlIFRoZSB0aXRsZSBvZiB0aGUgbmV3IG5hbWUgZGlhbG9nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlhbG9nVGl0bGUoU3RyaW5nIGRpYWxvZ1RpdGxlKSB7Ci0JCXRoaXMuZGlhbG9nVGl0bGUgPSBkaWFsb2dUaXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleGlzdGluZyBuYW1lcyB0aGF0IHdpbGwgYmUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgdGV4dCBmaWVsZCdzCi0JICogaW5wdXQgYW5kIHByZXZlbnQgdGhlIHVzZXIgZnJvbSB1c2luZyBpdC4KLQkgKgotCSAqIEBwYXJhbSBuYW1lcyBUaGUgY29sbGVjdGlvbiBvZiBuYW1lcyB0aGF0IGNhbid0IGJlIHVzZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGlzdGluZ05hbWVzKEl0ZXJhdG9yPFN0cmluZz4gbmFtZXMpIHsKLQkJdGhpcy5uYW1lcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKG5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0ZXh0IHRvIGxhYmVsIHRoZSB0ZXh0IGZpZWxkLgotCSAqCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBmaWVsZCdzIGxhYmVsCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyBsYWJlbFRleHQpIHsKLQkJdGhpcy5sYWJlbFRleHQgPSBsYWJlbFRleHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5pdGlhbCBuYW1lIGlmIG9uZSBleGlzdHMuIEl0IGlzIHZhbGlkIHRvIGxlYXZlIHRoaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIHRoZSB1c2VyIGhhcyB0byBlbnRlciBzb21ldGhpbmcuCi0JICoKLQkgKiBAcGFyYW0gbmFtZSBUaGUgaW5pdGlhbCBpbnB1dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvTmV3TmFtZVN0YXRlT2JqZWN0LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvTmV3TmFtZVN0YXRlT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NmJhZTIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL05ld05hbWVTdGF0ZU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZS5BYnN0cmFjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Qcm9ibGVtOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHN0YXRlIG9iamVjdCB1c2VkIGJ5IHRoZSA8Y29kZT5OZXdOYW1lRGlhbG9nPC9jb2RlPiwgd2hpY2ggc3RvcmVzCi0gKiB0aGUgY3VycmVudCBuYW1lIGFuZCB2YWxpZGF0ZXMgaXQgd2hlbiBpdCBpcyBtb2RpZmllZC4KLSAqCi0gKiBAc2VlIE5ld05hbWVEaWFsb2cKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1maW5hbCBjbGFzcyBOZXdOYW1lU3RhdGVPYmplY3QgZXh0ZW5kcyBBYnN0cmFjdE5vZGUKLXsKLQkvKioKLQkgKiBUaGUgaW5pdGlhbCBpbnB1dCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBpbml0aWFsIHZhbHVlIGNhbiBiZQotCSAqIHNwZWNpZmllZC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogVGhlIGNvbGxlY3Rpb24gb2YgbmFtZXMgdGhhdCBjYW4ndCBiZSB1c2VkIG9yIGFuIGVtcHR5IGNvbGxlY3Rpb24gaWYgbm9uZQotCSAqIGFyZSBhdmFpbGFibGUuCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXM7Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+VmFsaWRhdG9yPC9jb2RlPiB1c2VkIHRvIHZhbGlkYXRlIHRoaXMgc3RhdGUgb2JqZWN0LgotCSAqLwotCXByaXZhdGUgVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotCS8qKgotCSAqIE5vdGlmaWVzIGEgY2hhbmdlIGluIHRoZSBuYW1lIHByb3BlcnR5LgotCSAqLwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TmV3TmFtZVN0YXRlT2JqZWN0PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIFRoZSBpbml0aWFsIGlucHV0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGluaXRpYWwgdmFsdWUgY2FuCi0JICogYmUgc3BlY2lmaWVkCi0JICogQHBhcmFtIG5hbWVzIFRoZSBjb2xsZWN0aW9uIG9mIG5hbWVzIHRoYXQgY2FuJ3QgYmUgdXNlZCBvciBhbiBlbXB0eQotCSAqIGNvbGxlY3Rpb24gaWYgbm9uZSBhcmUgYXZhaWxhYmxlCi0JICovCi0JTmV3TmFtZVN0YXRlT2JqZWN0KFN0cmluZyBuYW1lLCBDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXMpIHsKLQkJc3VwZXIobnVsbCk7Ci0KLQkJdGhpcy5uYW1lICA9IG5hbWU7Ci0JCXRoaXMubmFtZXMgPSBuYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIG5hbWUgcHJvcGVydHkuCi0JICoKLQkgKiBAcGFyYW0gY3VycmVudFByb2JsZW1zIFRoZSBsaXN0IHRvIHdoaWNoIDxjb2RlPlByb2JsZW08L2NvZGU+cyBjYW4gYmUKLQkgKiBhZGRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGROYW1lUHJvYmxlbXMoTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpIHsKLQotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShuYW1lKSkgewotCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oSnB0Q29tbW9uVWlNZXNzYWdlcy5OZXdOYW1lU3RhdGVPYmplY3RfbmFtZU11c3RCZVNwZWNpZmllZCwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUikpOwotCQl9Ci0JCWVsc2UgaWYgKG5hbWVzLmNvbnRhaW5zKG5hbWUudHJpbSgpKSkgewotCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oSnB0Q29tbW9uVWlNZXNzYWdlcy5OZXdOYW1lU3RhdGVPYmplY3RfbmFtZUFscmVhZHlFeGlzdHMsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpCi0JewotCQlzdXBlci5hZGRQcm9ibGVtc1RvKGN1cnJlbnRQcm9ibGVtcyk7Ci0JCWFkZE5hbWVQcm9ibGVtcyhjdXJyZW50UHJvYmxlbXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNoZWNrUGFyZW50KE5vZGUgcGFyZW50Tm9kZSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBuYW1lIHN0b3JlZCBpbiB0aGlzIHN0YXRlIG9iamVjdC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCVN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IG5hbWUgc3RvcmVkIGluIHRoaXMgc3RhdGUgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogY2xlYXIgaXQuCi0JICoKLQkgKiBAcGFyYW0gbmFtZSBUaGUgbmV3IG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcihWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9QYWNrYWdlQ2hvb3NlclBhbmUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9QYWNrYWdlQ2hvb3NlclBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk5OGYzMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvUGFja2FnZUNob29zZXJQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuY29udGVudGFzc2lzdC5Db250cm9sQ29udGVudEFzc2lzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuY29udGVudGFzc2lzdC5KYXZhUGFja2FnZUNvbXBsZXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5KcHRDb21tb25VaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiBUaGlzIGNob29zZXIgYWxsb3dzIHRoZSB1c2VyIHRvIGNob29zZSBhIHBhY2thZ2Ugd2hlbiBicm93c2luZyBhbmQgaXQgYWRkcwotICogY29kZSBjb21wbGV0aW9uIHN1cHBvcnQgdG8gdGhlIHRleHQgZmllbGQsIHdoaWNoIGlzIHRoZSBtYWluIGNvbXBvbmVudC4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIHwgTGFiZWw6IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCcm93c2UuLi4gfCB8Ci0gKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFBhY2thZ2VDaG9vc2VyUGFuZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgQ2hvb3NlclBhbmU8VD4KLXsKLQkvKioKLQkgKiBUaGUgY29kZSBjb21wbGV0aW9uIG1hbmFnZXIuCi0JICovCi0JcHJpdmF0ZSBKYXZhUGFja2FnZUNvbXBsZXRpb25Qcm9jZXNzb3IgamF2YVBhY2thZ2VDb21wbGV0aW9uUHJvY2Vzc29yOwotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHN1YmplY3RDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFja2FnZUNob29zZXJQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgUGFja2FnZUNob29zZXJQYW5lKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhY2thZ2VDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgUGFja2FnZUNob29zZXJQYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQotCQkvLyBUT0RPIGJ1ZyAxNTYxODUgLSB3aGVuIHRoaXMgaXMgZml4ZWQgdGhlcmUgc2hvdWxkIGJlIGFwaSBmb3IgdGhpcwotCQl0aGlzLmphdmFQYWNrYWdlQ29tcGxldGlvblByb2Nlc3NvciA9IG5ldyBKYXZhUGFja2FnZUNvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQluZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKEphdmFFbGVtZW50TGFiZWxQcm92aWRlci5TSE9XX1JPT1QpCi0JCSk7Ci0JCXRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zdWJqZWN0Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnBhY2thZ2VDaG9vc2VyU3ViamVjdENoYW5nZWQoZ2V0U3ViamVjdCgpKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJUGFja2FnZUNob29zZXJQYW5lLnRoaXMucGFja2FnZUNob29zZXJTdWJqZWN0Q2hhbmdlZCgoVCkgZS5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwYWNrYWdlQ2hvb3NlclN1YmplY3RDaGFuZ2VkKFQgbmV3U3ViamVjdCkgewotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gbnVsbDsKLQkJaWYgKG5ld1N1YmplY3QgIT0gbnVsbCkgewotCQkJcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKLQkJfQotCQl0aGlzLmphdmFQYWNrYWdlQ29tcGxldGlvblByb2Nlc3Nvci5zZXRQYWNrYWdlRnJhZ21lbnRSb290KHJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCBSdW5uYWJsZSBidWlsZEJyb3dzZUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwcm9tcHRQYWNrYWdlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgYWRkTWFpbkNvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21wb3NpdGUgc3ViUGFuZSA9IGFkZFN1YlBhbmUoY29udGFpbmVyKTsKLQotCQlUZXh0IHRleHQgPSBhZGRUZXh0KHN1YlBhbmUsIGJ1aWxkVGV4dEhvbGRlcigpKTsKLQotCQlJbWFnZSBpbWFnZSA9IEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRGaWVsZERlY29yYXRpb24oRmllbGREZWNvcmF0aW9uUmVnaXN0cnkuREVDX0NPTlRFTlRfUFJPUE9TQUwpLmdldEltYWdlKCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gaW1hZ2UuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlDb250cm9sQ29udGVudEFzc2lzdEhlbHBlci5jcmVhdGVUZXh0Q29udGVudEFzc2lzdGFudCgKLQkJCXRleHQsCi0JCQlqYXZhUGFja2FnZUNvbXBsZXRpb25Qcm9jZXNzb3IKLQkJKTsKLQotCQlyZXR1cm4gc3ViUGFuZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB2YWx1ZSBob2xkZXIgb2YgdGhlIHN1YmplY3QncyBwcm9wZXJ0eS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGhvbGRlciBvZiB0aGUgcGFja2FnZSBuYW1lCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKTsKLQotCS8qKgotCSAqIFByb21wdHMgdGhlIHVzZXIgdGhlIE9wZW4gUGFja2FnZSBkaWFsb2cuCi0JICoKLQkgKiBAcmV0dXJuIEVpdGhlciB0aGUgc2VsZWN0ZWQgcGFja2FnZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdXNlcgotCSAqIGNhbmNlbGxlZCB0aGUgZGlhbG9nCi0JICovCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnQgY2hvb3NlUGFja2FnZSgpIHsKLQotCQlTZWxlY3Rpb25EaWFsb2cgc2VsZWN0aW9uRGlhbG9nOwotCi0JCXRyeSB7Ci0JCQlzZWxlY3Rpb25EaWFsb2cgPSBKYXZhVUkuY3JlYXRlUGFja2FnZURpYWxvZygKLQkJCQlnZXRTaGVsbCgpLAotCQkJCWdldFBhY2thZ2VGcmFnbWVudFJvb3QoKQotCQkJKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdENvbW1vblVpUGx1Z2luLmxvZyhlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJc2VsZWN0aW9uRGlhbG9nLnNldFRpdGxlKEpwdENvbW1vblVpTWVzc2FnZXMuUGFja2FnZUNob29zZXJQYW5lX2RpYWxvZ1RpdGxlKTsKLQkJc2VsZWN0aW9uRGlhbG9nLnNldE1lc3NhZ2UoSnB0Q29tbW9uVWlNZXNzYWdlcy5QYWNrYWdlQ2hvb3NlclBhbmVfZGlhbG9nTWVzc2FnZSk7Ci0KLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrID0gZ2V0UGFja2FnZUZyYWdtZW50KCk7Ci0KLQkJaWYgKHBhY2sgIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uRGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb25zKG5ldyBPYmplY3RbXSB7IHBhY2sgfSk7Ci0JCX0KLQotCQlpZiAoc2VsZWN0aW9uRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXJldHVybiAoSVBhY2thZ2VGcmFnbWVudCkgc2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBuYW1lIGZyb20gaXRzIHN1YmplY3QuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBwYWNrYWdlIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBpcyBkZWZpbmVkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpOwotCi0JLyoqCi0JICogVGhlIGJyb3dzZSBidXR0b24gd2FzIGNsaWNrZWQsIGl0cyBhY3Rpb24gaW52b2tlcyB0aGlzIGFjdGlvbiB3aGljaCBzaG91bGQKLQkgKiBwcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGEgcGFja2FnZSBhbmQgc2V0IGl0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb21wdFBhY2thZ2UoKSB7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gY2hvb3NlUGFja2FnZSgpOwotCi0JCWlmIChwYWNrYWdlRnJhZ21lbnQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gcGFja2FnZUZyYWdtZW50LmdldEVsZW1lbnROYW1lKCk7Ci0JCQl0aGlzLnNldFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRQYWNrYWdlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpOwotCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IGdldFBhY2thZ2VGcmFnbWVudCgpIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0UGFja2FnZU5hbWUoKTsKLQotCQlpZiAocGFja2FnZU5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpLmdldFBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKClbMF07Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uVWlQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9QYW5lLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDMzNzFlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9QYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LkNvbWJvTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LkRhdGVUaW1lTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LlNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuQ29udHJvbEFsaWduZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRCdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRDb250cm9sVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ob25OdWxsQm9vbGVhblRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGF0ZVRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5IeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgZGVmaW5pdGlvbiBvZiBhIHBhbmUgd2hpY2ggaG9sZHMgb250byBhIDxjb2RlPlByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4KLSAqIHRoYXQgY29udGFpbnMgdGhlIHN1YmplY3Qgb2YgdGhpcyBwYW5lLgotICogPHA+Ci0gKiBJdCBhbHNvIGNvbnRhaW5zIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGJ1aWxkaW5nIGJ1dHRvbnMsIGxhYmVscywgY2hlY2sKLSAqIGJveGVzLCBhbmQgcmFkaW8gYnV0dG9ucywgZXRjLgotICogPHA+Ci0gKiBJdCBpcyBwb3NzaWJsZSB0byBlYXNpbHkgbGlzdGVuIHRvIGFueSBwcm9wZXJ0eSBjaGFuZ2VzIGNvbWluZyBmcm9tIHRoZQotICogc3ViamVjdCwge0BsaW5rICNhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb24pfSBpcyBzcGVjaWZ5IHdoaWNoIHByb3BlcnRpZXMKLSAqIGFyZSBvZiBpbnRlcmVzdCBhbmQge0BsaW5rICNwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nKX0gaXMgdXNlZCB0byBub3RpZnkgdGhlCi0gKiBwYW5lIHdoZW4gdGhlIHByb3BlcnR5IGhhcyBjaGFuZ2VkLgotICoKLSAqIEBzZWUgRm9ybVBhbmUKLSAqIEBzZWUgRGlhbG9nUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYW5lPFQgZXh0ZW5kcyBNb2RlbD4KLXsKLQkvKioKLQkgKiBUaGUgbGlzdGVuZXIgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzdWJqZWN0IGluIG9yZGVyIHRvIGJlIG5vdGlmaWVkIHdoZW4gYQotCSAqIHByb3BlcnR5IGhhcyBjaGFuZ2VkLCB0aGUgcHJvcGVydHkgbmFtZXMgYXJlIGRldGVybWluZWQgYnkKLQkgKiB7QGxpbmsgI3Byb3BlcnR5TmFtZXMoKX0uCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGFzcGVjdENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhlIGNvbnRhaW5lciBvZiB0aGlzIGNvbXBvc2l0ZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIENvbXBvc2l0ZSBjb250YWluZXI7Ci0KLQkvKioKLQkgKiBUaGUgYWxpZ25lciByZXNwb25zaWJsZSB0byBhbGlnbiB0aGUgbGVmdCBjb250cm9scy4KLQkgKi8KLQlwcml2YXRlIENvbnRyb2xBbGlnbmVyIGxlZnRDb250cm9sQWxpZ25lcjsKLQotCS8qKgotCSAqIEZsYWcgdXNlZCB0byBzdG9wIHRoZSBjaXJjdWxhciBwb3B1bGF0aW9uIG9mIHdpZGdldHMuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHBvcHVsYXRpbmc7Ci0KLQkvKioKLQkgKiBUaGUgYWxpZ25lciByZXNwb25zaWJsZSB0byBhbGlnbiB0aGUgbGVmdCBjb250cm9scy4KLQkgKi8KLQlwcml2YXRlIENvbnRyb2xBbGlnbmVyIHJpZ2h0Q29udHJvbEFsaWduZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc3ViamVjdCBob2xkZXIgaW4gb3JkZXIgdG8KLQkgKiBhdXRvbWF0aWNhbGx5IHJlcG9wdWxhdGUgdGhpcyBwYW5lIHdpdGggdGhlIG5ldyBzdWJqZWN0LgotCSAqLwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzdWJqZWN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGUgc3ViamVjdCBvZiB0aGlzIHBhbmUuCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlcjsKLQotCS8qKgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIHJlZ2lzdGVyZWQgc3ViLXBhbmVzIHdpbGwgYmUgYXV0b21hdGljYWxseSBub3RpZmllZAotCSAqIHdoZW4gbGlzdGVuZXJzIG5lZWQgdG8gYmUgZW5nYWdlZCBvciBkaXNlbmdhZ2VkIG9yIHdoZW4gdG8gcG9wdWxhdGUgaXRzCi0JICogd2lkZ2V0cy4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb248UGFuZTw/Pj4gc3ViUGFuZXM7Ci0KLQkvKioKLQkgKiBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzLgotCSAqLwotCXByaXZhdGUgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5OwotCi0JLyoqCi0JICogVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q29udHJvbDwvY29kZT5zIHRoYXQgYXJlIGRpc3BsYXllZCBpbiB0aGlzIHBhbmUsCi0JICogd2hpY2ggd2lsbCBoYXZlIHRoZWlyIGVuYWJsZW1lbnQgc3RhdGUgdXBkYXRlZCB3aGVuCi0JICoge0BsaW5rICNlbmFibGVXaWRnZXRzKGJvb2xlYW4pfSBpcyBjYWxsZWQuCi0JICovCi0JcHJpdmF0ZSBBcnJheUxpc3Q8Q29udHJvbD4gbWFuYWdlZFdpZGdldHM7Ci0KLQkvKioKLQkgKiBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5QYW5lPC9jb2RlPnMgdGhhdCBhcmUgZGlzcGxheWVkIGluIHRoaXMgcGFuZSwKLQkgKiB3aGljaCB3aWxsIGhhdmUgdGhlaXIgZW5hYmxlbWVudCBzdGF0ZSB1cGRhdGVkIHdoZW4KLQkgKiB7QGxpbmsgI2VuYWJsZVdpZGdldHMoYm9vbGVhbil9IGlzIGNhbGxlZC4KLQkgKi8KLQlwcml2YXRlIEFycmF5TGlzdDxQYW5lPD8+PiBtYW5hZ2VkU3ViUGFuZXM7Ci0KLQkvKioKLQkgKiBUaGlzIGVuYWJsZWQgbW9kZWwgaXMgdXNlZCB0byBzdG9yZSB0aGUgcGFuZSdzIGJhc2UgZW5hYmxlbWVudCBzdGF0ZS4KLQkgKiBJZiBBUEkgaXMgY2FsbGVkIHRvIHNldCB0aGUgcGFuZSBlbmFibGVkLCB0aGlzIG1vZGVsIGdldHMgdXBkYXRlZC4gIElmIHRoZSBwYW5lIGlzIHRoZXJlYnkKLQkgKiBmdWxseSBlbmFibGVkIChjb250cm9sbGVyIGVuYWJsZWQgbW9kZWwgaXMgYWxzbyBpbiBhZ3JlZW1lbnQpIHRoZSBwYW5lJ3Mgd2lkZ2V0cyBhcmUgc2V0Ci0JICogZW5hYmxlZC4KLQkgKiBAc2VlICNnZXRDb21iaW5lZEVuYWJsZWRNb2RlbCgpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJhc2VFbmFibGVkTW9kZWwKLQkJCT0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpOwotCi0JLyoqCi0JICogVGhpcyBlbmFibGVkIG1vZGVsIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBwYW5lJ3MgZW5hYmxlbWVudCBhcyBjb250cm9sbGVkIGJ5IG90aGVyIHdpZGdldHMsCi0JICogdGVzdHMsIGV0Yy4gKGZvciBleGFtcGxlIGEgcmFkaW8gYnV0dG9uKQotCSAqIElmIHRoaXMgbW9kZWwgaXMgY2hhbmdlZCwgYW5kIHRoZSBwYW5lIGlzIHRoZXJlYnkgZnVsbHkgZW5hYmxlZCAoYmFzZSBlbmFibGVkIG1vZGVsIGlzIGFsc28KLQkgKiBpbiBhZ3JlZW1lbnQpIHRoZSBwYW5lJ3Mgd2lkZ2V0cyBhcmUgc2V0IGVuYWJsZWQuCi0JICogQHNlZSAjZ2V0Q29tYmluZWRFbmFibGVkTW9kZWwoKQotCSAqLwotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGNvbnRyb2xsZXJFbmFibGVkTW9kZWw7Ci0KLQkvKioKLQkgKiBUaGUgImFuZCIgY29tYmluYXRpb24gb2Yge0BsaW5rICNiYXNlRW5hYmxlZE1vZGVsfSBhbmQge0BsaW5rICNjb250cm9sbGVyRW5hYmxlZE1vZGVsfQotCSAqLwotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGNvbWJpbmVkRW5hYmxlZE1vZGVsOwotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGNvbWJpbmVkRW5hYmxlZE1vZGVsTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIFBhbmUoCi0JCQlQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXRoaXMocGFyZW50UGFuZSwgcGFyZW50LCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICogQHBhcmFtIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgd2lkZ2V0cwotCSAqIHRoaXMgcGFuZSBhbGlnbmVkIHdpdGggdGhlIHdpZGdldHMgb2YgdGhlIGdpdmVuIHBhcmVudCBwYW5lOwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxpZ24gdGhlbQotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIFBhbmUoCi0JCQlQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIGJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cykgewotCi0JCXRoaXMoCi0JCQlwYXJlbnRQYW5lLAotCQkJcGFyZW50UGFuZS5nZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlwYXJlbnQsCi0JCQlhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICogQHBhcmFtIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgd2lkZ2V0cwotCSAqIHRoaXMgcGFuZSBhbGlnbmVkIHdpdGggdGhlIHdpZGdldHMgb2YgdGhlIGdpdmVuIHBhcmVudCBwYW5lOwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxpZ24gdGhlbQotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIFBhbmUoCi0JCQlQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIGJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywKLQkgICAgICAgIGJvb2xlYW4gcGFyZW50TWFuYWdlUGFuZSkgewotCi0JCXRoaXMoCi0JCQlwYXJlbnRQYW5lLAotCQkJcGFyZW50UGFuZS5nZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlwYXJlbnQsCi0JCQlhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzLAotCQkJcGFyZW50TWFuYWdlUGFuZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIFBhbmUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJdGhpcyhwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHRydWUpOwotCX0KLQotCXByb3RlY3RlZCBQYW5lKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwpIHsKLQotCQl0aGlzKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgdHJ1ZSwgZW5hYmxlZE1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICogQHBhcmFtIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgd2lkZ2V0cwotCSAqIHRoaXMgcGFuZSBhbGlnbmVkIHdpdGggdGhlIHdpZGdldHMgb2YgdGhlIGdpdmVuIHBhcmVudCBwYW5lOwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxpZ24gdGhlbQotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIFBhbmUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7Ci0KLQkJdGhpcyhwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMsIHRydWUpOwotCX0KLQotCXByb3RlY3RlZCBQYW5lKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCWJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwpIHsKLQotCQl0aGlzKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywgdHJ1ZSwgZW5hYmxlZE1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICogQHBhcmFtIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgd2lkZ2V0cwotCSAqIHRoaXMgcGFuZSBhbGlnbmVkIHdpdGggdGhlIHdpZGdldHMgb2YgdGhlIGdpdmVuIHBhcmVudCBwYW5lOwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxpZ24gdGhlbQotCSAqIEBwYXJhbSBwYXJlbnRNYW5hZ2VQYW5lIDxjb2RlPnRydWU8L2NvZGU+IHRvIGhhdmUgdGhlIHBhcmVudCBwYW5lIG1hbmFnZQotCSAqIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoaXMgcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIFBhbmUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzLAotCQkJYm9vbGVhbiBwYXJlbnRNYW5hZ2VQYW5lKSB7Ci0KLQkJdGhpcyhzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHBhcmVudFBhbmUuZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJdGhpcy5pbml0aWFsaXplKHBhcmVudFBhbmUsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMsIHBhcmVudE1hbmFnZVBhbmUpOwotCX0KLQotCXByb3RlY3RlZCBQYW5lKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCWJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywKLQkJCWJvb2xlYW4gcGFyZW50TWFuYWdlUGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwpIHsKLQotCQl0aGlzKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgcGFyZW50UGFuZS5nZXRXaWRnZXRGYWN0b3J5KCkpOwotCQl0aGlzLmluaXRpYWxpemUocGFyZW50UGFuZSwgYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywgcGFyZW50TWFuYWdlUGFuZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUVuYWJsZWRNb2RlbChlbmFibGVkTW9kZWwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIFBhbmUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoKTsKLQkJdGhpcy5pbml0aWFsaXplKHN1YmplY3RIb2xkZXIsIHdpZGdldEZhY3RvcnkpOwotCQl0aGlzLmNvbnRhaW5lciA9IHRoaXMuYWRkQ29udGFpbmVyKHBhcmVudCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUxheW91dCh0aGlzLmNvbnRhaW5lcik7Ci0JCXRoaXMuZW5nYWdlU3ViamVjdEhvbGRlcigpOwotCQl0aGlzLmVuZ2FnZUxpc3RlbmVycyhnZXRTdWJqZWN0KCkpOwotCQl0aGlzLnBvcHVsYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChzdWJqZWN0SG9sZGVyLCAiVGhlIHN1YmplY3QgaG9sZGVyIGNhbm5vdCBiZSBudWxsIik7Ci0KLQkJdGhpcy5zdWJqZWN0SG9sZGVyICAgICAgICAgPSAoUHJvcGVydHlWYWx1ZU1vZGVsPFQ+KSBzdWJqZWN0SG9sZGVyOwotCQl0aGlzLndpZGdldEZhY3RvcnkgICAgICAgICA9IHdpZGdldEZhY3Rvcnk7Ci0JCXRoaXMuc3ViUGFuZXMgICAgICAgICAgICAgID0gbmV3IEFycmF5TGlzdDxQYW5lPD8+PigpOwotCQl0aGlzLm1hbmFnZWRXaWRnZXRzICAgICAgICA9IG5ldyBBcnJheUxpc3Q8Q29udHJvbD4oKTsKLQkJdGhpcy5tYW5hZ2VkU3ViUGFuZXMgICAgICAgPSBuZXcgQXJyYXlMaXN0PFBhbmU8Pz4+KCk7Ci0JCXRoaXMubGVmdENvbnRyb2xBbGlnbmVyICAgID0gbmV3IENvbnRyb2xBbGlnbmVyKCk7Ci0JCXRoaXMucmlnaHRDb250cm9sQWxpZ25lciAgID0gbmV3IENvbnRyb2xBbGlnbmVyKCk7Ci0JCXRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmFzcGVjdENoYW5nZUxpc3RlbmVyICA9IHRoaXMuYnVpbGRBc3BlY3RDaGFuZ2VMaXN0ZW5lcigpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyB0aGlzIHBhbmUgd2l0aCB0aGUgcGFyZW50IHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUKLQkgKiBAcGFyYW0gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyA8Y29kZT50cnVlPC9jb2RlPiB0byBtYWtlIHRoZSB3aWRnZXRzCi0JICogdGhpcyBwYW5lIGFsaWduZWQgd2l0aCB0aGUgd2lkZ2V0cyBvZiB0aGUgZ2l2ZW4gcGFyZW50IHBhbmU7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCBhbGlnbiB0aGVtCi0JICogQHBhcmFtIHBhcmVudE1hbmFnZVBhbmUgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gaGF2ZSB0aGUgcGFyZW50IHBhbmUgbWFuYWdlCi0JICogdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhpcyBwYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgSW5pdGlhbGl6YXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCWJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywKLQkgICAgICAgIGJvb2xlYW4gcGFyZW50TWFuYWdlUGFuZSkgewotCi0JCS8vIFJlZ2lzdGVyIHRoaXMgcGFuZSB3aXRoIHRoZSBwYXJlbnQgcGFuZSwgaXQgd2lsbCBjYWxsIHRoZSBtZXRob2RzCi0JCS8vIGF1dG9tYXRpY2FsbHkgKGVuZ2FnZUxpc3RlbmVycygpLCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSwgcG9wdWxhdGUoKSwKLQkJLy8gZGlzcG9zZSgpLCBldGMpCi0JCXBhcmVudFBhbmUucmVnaXN0ZXJTdWJQYW5lKHRoaXMpOwotCi0JCWlmIChwYXJlbnRNYW5hZ2VQYW5lKSB7Ci0JCQlwYXJlbnRQYW5lLm1hbmFnZVN1YlBhbmUodGhpcyk7Ci0JCX0KLQotCQkvLyBBbGlnbiB0aGUgbGVmdCBhbmQgcmlnaHQgY29udHJvbHMgd2l0aCB0aGUgY29udHJvbHMgZnJvbSB0aGUgcGFyZW50Ci0JCS8vIHBhbmUKLQkJaWYgKGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKLQkJCXBhcmVudFBhbmUuYWRkQWxpZ25MZWZ0KHRoaXMpOwotCQkJcGFyZW50UGFuZS5hZGRBbGlnblJpZ2h0KHRoaXMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVFbmFibGVkTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGVuYWJsZWRNb2RlbCkgewotCQl0aGlzLmNvbnRyb2xsZXJFbmFibGVkTW9kZWwgPSBlbmFibGVkTW9kZWw7Ci0JCXRoaXMuY29tYmluZWRFbmFibGVkTW9kZWwgPQotCQkJCUNvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwuYW5kKHRoaXMuYmFzZUVuYWJsZWRNb2RlbCwgdGhpcy5jb250cm9sbGVyRW5hYmxlZE1vZGVsKTsKLQkJdGhpcy5jb21iaW5lZEVuYWJsZWRNb2RlbExpc3RlbmVyID0gYnVpbGRDb21iaW5lZEVuYWJsZWRNb2RlbExpc3RlbmVyKCk7Ci0JCXRoaXMuY29tYmluZWRFbmFibGVkTW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuY29tYmluZWRFbmFibGVkTW9kZWxMaXN0ZW5lcik7Ci0JCWVuYWJsZVdpZGdldHNfKGdldENvbWJpbmVkRW5hYmxlbWVudCgpKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDb21iaW5lZEVuYWJsZWRNb2RlbExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKGJ1aWxkQ29udHJvbGxlckVuYWJsZWRNb2RlbExpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDb250cm9sbGVyRW5hYmxlZE1vZGVsTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlQYW5lLnRoaXMuY29udHJvbGxlckVuYWJsZW1lbnRDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGxheW91dCBvZiB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKTsKLQotCXByaXZhdGUgdm9pZCBtYW5hZ2VXaWRnZXQoQ29udHJvbCBjb250cm9sKSB7Ci0JCWlmICh0aGlzLm1hbmFnZWRXaWRnZXRzLmNvbnRhaW5zKGNvbnRyb2wpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5tYW5hZ2VkV2lkZ2V0cy5hZGQoY29udHJvbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1hbmFnZVN1YlBhbmUoUGFuZTw/PiBzdWJQYW5lKSB7Ci0JCWlmICh0aGlzLm1hbmFnZWRTdWJQYW5lcy5jb250YWlucyhzdWJQYW5lKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubWFuYWdlZFN1YlBhbmVzLmFkZChzdWJQYW5lKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBwYW5lJ3Mgd2lkZ2V0cyAodGhvc2UgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQgd2l0aCBpdHMKLQkgKiBsZWZ0IDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPikgdG8gdGhpcyBwYW5lJ3MgbGVmdAotCSAqIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiBzbyB0aGF0IHRoZWlyIHdpZHRoIGNhbiBiZSBhZGp1c3RlZCB0byBoYXZlCi0JICogdGhlIHdpZHRoIG9mIHRoZSB3aWRlc3Qgd2lkZ2V0LgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgY29udGFpbmluZyB0aGUgd2lkZ2V0cyB0byBhZGQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRBbGlnbkxlZnQoUGFuZTw/PiBjb250YWluZXIpIHsKLQkJdGhpcy5sZWZ0Q29udHJvbEFsaWduZXIuYWRkKGNvbnRhaW5lci5sZWZ0Q29udHJvbEFsaWduZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGNvbnRyb2wgdG8gdGhlIGNvbGxlY3Rpb24gb2Ygd2lkZ2V0cyB0aGF0IGhhdmUgdGhlaXIgd2lkdGgKLQkgKiBhZGp1c3Qgd2l0aCB0aGUgd2lkdGggb2YgdGhlIHdpZGVzdCB3aWRnZXQuIFRoZSBsZWZ0IGFsaWdubWVudCBpcyB1c3VhbGx5Ci0JICogdXNlZCBmb3IgbGFiZWxzLgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgdG8gYWRkCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkQWxpZ25MZWZ0KENvbnRyb2wgY29udHJvbCkgewotCQl0aGlzLmxlZnRDb250cm9sQWxpZ25lci5hZGQoY29udHJvbCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gcGFuZSdzIHdpZGdldHMgKHRob3NlIHRoYXQgd2VyZSByZWdpc3RlcmVkIHdpdGggaXRzCi0JICogcmlnaHQgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+KSB0byB0aGlzIHBhbmUncyByaWdodAotCSAqIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiBzbyB0aGF0IHRoZWlyIHdpZHRoIGNhbiBiZSBhZGp1c3RlZCB0byBoYXZlCi0JICogdGhlIHdpZHRoIG9mIHRoZSB3aWRlc3Qgd2lkZ2V0LgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgY29udGFpbmluZyB0aGUgd2lkZ2V0cyB0byBhZGQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRBbGlnblJpZ2h0KFBhbmU8Pz4gY29udGFpbmVyKSB7Ci0JCXRoaXMucmlnaHRDb250cm9sQWxpZ25lci5hZGQoY29udGFpbmVyLnJpZ2h0Q29udHJvbEFsaWduZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGNvbnRyb2wgdG8gdGhlIGNvbGxlY3Rpb24gb2Ygd2lkZ2V0cyB0aGF0IGhhdmUgdGhlaXIgd2lkdGgKLQkgKiBhZGp1c3Qgd2l0aCB0aGUgd2lkdGggb2YgdGhlIHdpZGVzdCB3aWRnZXQuIFRoZSBsZWZ0IGFsaWdubWVudCBpcyB1c3VhbGx5Ci0JICogdXNlZCBmb3IgYnV0dG9ucy4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIHRvIGFkZAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZEFsaWduUmlnaHQoQ29udHJvbCBjb250cm9sKSB7Ci0JCXRoaXMucmlnaHRDb250cm9sQWxpZ25lci5hZGQoY29udHJvbCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gcGFuZSdzIGNvbnRyb2xzICh0aG9zZSB0aGF0IHdlcmUgcmVnaXN0ZXJlZCBmb3IKLQkgKiBhbGlnbm1lbnQpIGZyb20gdGhpcyBwYW5lLgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgY29udGFpbmluZyB0aGUgd2lkZ2V0cyB0byBhZGQgZm9yCi0JICogYWxpZ25tZW50Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkUGFuZUZvckFsaWdubWVudChQYW5lPD8+IGNvbnRhaW5lcikgewotCQlhZGRBbGlnbkxlZnQoY29udGFpbmVyKTsKLQkJYWRkQWxpZ25SaWdodChjb250YWluZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYW55IHByb3BlcnR5IG5hbWVzIHRvIHRoZSBnaXZlbiBjb2xsZWN0aW9uIGluIG9yZGVyIHRvIGJlIG5vdGlmaWVkCi0JICogd2hlbiB0aGUgYWN0dWFsIHByb3BlcnR5IGNoYW5nZXMgaW4gdGhlIHN1YmplY3QuCi0JICoKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lcyBUaGUgY29sbGVjdGlvbiBvZiBwcm9wZXJ0eSBuYW1lcyB0byByZWdpc3RlciB3aXRoIHRoZQotCSAqIHN1YmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQXNwZWN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoYnVpbGRBc3BlY3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQXNwZWN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJLy9zdWJqZWN0KCkgY291bGQgaGF2ZSBjaGFuZ2VkIG9yIGlzIG51bGwgYmVjYXVzZSBvZiB0aGUgcG9zc2liaWxpdHkgb2YKLQkJCQkvLyJqdW1waW5nIiBvbiB0aGUgVUkgdGhyZWFkIGhlcmUgYW5kIGEgc2VsZWN0aW9uIGNoYW5nZSBvY2N1cmluZwotCQkJCWlmIChlLmdldFNvdXJjZSgpID09IGdldFN1YmplY3QoKSkgewotCQkJCQl1cGRhdGVQYW5lKGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGJ1dHRvbiB1c2luZyB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYnV0dG9uQWN0aW9uIFRoZSBhY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBidXR0b24gaXMgcHJlc3NlZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYWRkQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIGJ1dHRvbkFjdGlvbikgewotCi0JCXJldHVybiB0aGlzLmFkZEJ1dHRvbihjb250YWluZXIsIHRleHQsIG51bGwsIGJ1dHRvbkFjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bm1hbmFnZWQgPGNvZGU+QnV0dG9uPC9jb2RlPiB3aWRnZXQuICBVbm1hbmFnZWQgbWVhbnMKLQkgKiB0aGF0IHRoaXMgUGFuZSB3aWxsIG5vdCBoYW5kbGUgdGhlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldC4KLQkgKiBUaGUgb3duaW5nIG9iamVjdCB3aWxsIGhhbmRsZSBpdCB3aXRoIGl0cyBvd24gUGFuZUVuYWJsZXIgb3IgQ29udHJvbEVuYWJsZXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYnV0dG9uQWN0aW9uIFRoZSBhY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBidXR0b24gaXMgcHJlc3NlZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYWRkVW5tYW5hZ2VkQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIGJ1dHRvbkFjdGlvbikgewotCi0JCXJldHVybiB0aGlzLmFkZFVubWFuYWdlZEJ1dHRvbihjb250YWluZXIsIHRleHQsIG51bGwsIGJ1dHRvbkFjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBidXR0b24gdXNpbmcgdGhlIGdpdmVuIGluZm9ybWF0aW9uLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBidXR0b25UZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGNoZWNrIGJveAotCSAqIEBwYXJhbSBidXR0b25BY3Rpb24gVGhlIGFjdGlvbiB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGJ1dHRvbiBpcyBwcmVzc2VkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEJ1dHRvbiBhZGRCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIGJ1dHRvbkFjdGlvbikgewotCi0JCUJ1dHRvbiBidXR0b24gPSBhZGRVbm1hbmFnZWRCdXR0b24oY29udGFpbmVyLCB0ZXh0LCBoZWxwSWQsIGJ1dHRvbkFjdGlvbik7Ci0JCXRoaXMubWFuYWdlV2lkZ2V0KGJ1dHRvbik7Ci0KLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCA8Y29kZT5CdXR0b248L2NvZGU+IHdpZGdldC4gIFVubWFuYWdlZCBtZWFucwotCSAqIHRoYXQgdGhpcyBQYW5lIHdpbGwgbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LgotCSAqIFRoZSBvd25pbmcgb2JqZWN0IHdpbGwgaGFuZGxlIGl0IHdpdGggaXRzIG93biBQYW5lRW5hYmxlciBvciBDb250cm9sRW5hYmxlci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBjaGVjayBib3gKLQkgKiBAcGFyYW0gYnV0dG9uQWN0aW9uIFRoZSBhY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBidXR0b24gaXMgcHJlc3NlZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgQnV0dG9uIGFkZFVubWFuYWdlZEJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVubmFibGUgYnV0dG9uQWN0aW9uKSB7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVCdXR0b24oY29udGFpbmVyLCB0ZXh0KTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYnV0dG9uQWN0aW9uLnJ1bigpOwotCQkJfQotCQl9KTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGJ1dHRvbiwgaGVscElkKTsKLQkJfQotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTEw7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbGF5b3V0IHdpbGwgbGVhdmUgc3BhY2UgZm9yIGRlY29yYXRpb25zIG9uIHdpZGdldHMuCi0JICogV2hldGhlciBkZWNvcmF0ZWQgb3Igbm90LCBhbGwgb2YgdGhlIHdpZGdldHMgbmVlZCB0aGUgc2FtZSBpbmRlbnQKLSAJICogc28gdGhhdCB0aGV5IGFsaWduIHByb3Blcmx5LgotCSAqLwotCXByb3RlY3RlZCBHcmlkRGF0YSBnZXRGaWVsZEdyaWREYXRhKCkgewotCQlpbnQgbWFyZ2luID0gRmllbGREZWNvcmF0aW9uUmVnaXN0cnkuZ2V0RGVmYXVsdCgpCi0JCQkJLmdldE1heGltdW1EZWNvcmF0aW9uV2lkdGgoKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZGF0YS53aWR0aEhpbnQgPSBJRGlhbG9nQ29uc3RhbnRzLkVOVFJZX0ZJRUxEX1dJRFRIICsgbWFyZ2luOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSBtYXJnaW47Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY2hlY2sgYm94IHVzaW5nIHRoZSBnaXZlbiBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGlvbiBzdGF0ZQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBjaGVjayBib3gKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGFkZENoZWNrQm94KAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFN0cmluZyBidXR0b25UZXh0LAotCSAgICAgICAgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZFRvZ2dsZUJ1dHRvbigKLQkJCXBhcmVudCwKLQkJCWJ1dHRvblRleHQsCi0JCQlib29sZWFuSG9sZGVyLAotCQkJaGVscElkLAotCQkJU1dULkNIRUNLKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGFkZENoZWNrQm94KAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBidXR0b25UZXh0LAotCQkJTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCQkJU3RyaW5nIGhlbHBJZCwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwpIHsKLQotCQlCdXR0b24gYnV0dG9uID0gdGhpcy5hZGRVbm1hbmFnZWRUb2dnbGVCdXR0b24ocGFyZW50LCBidXR0b25UZXh0LCBib29sZWFuSG9sZGVyLCBoZWxwSWQsIFNXVC5DSEVDSyk7Ci0JCXRoaXMuY29udHJvbEVuYWJsZWRTdGF0ZShlbmFibGVkTW9kZWwsIGJ1dHRvbik7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPiB0aGF0IGNhbiBiZSBjb2xsYXBzZWQuIEEgc3ViLXBhbmUgaXMKLQkgKiBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzIGl0cyBjbGllbnQgYW5kIGlzIHRoZSByZXR1cm5lZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0Ci0JICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCUNvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCXNlY3Rpb25UZXh0LAotCQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5GQUxTRSkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4gdGhhdCBjYW4gYmUgY29sbGFwc2VkLiBBIHN1Yi1wYW5lIGlzCi0JICogYXV0b21hdGljYWxseSBhZGRlZCBhcyBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAotCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIHNlY3Rpb24ncyBkZXNjcmlwdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlzZWN0aW9uVGV4dCwKLQkJCWRlc2NyaXB0aW9uLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKQotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4uIEEgc3ViLXBhbmUgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcwotCSAqIGl0cyBjbGllbnQgYW5kIGlzIHRoZSByZXR1cm5lZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0Ci0JICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgotCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHNlY3Rpb24gdG8gY3JlYXRlCi0JICogQHBhcmFtIGV4cGFuZGVkU3RhdGVIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB0aGF0IHdpbGwgZGljdGF0ZQotCSAqIHdoZW4gdG8gZXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgQ29tcG9zaXRlIGFkZENvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZXhwYW5kZWRTdGF0ZUhvbGRlcikgewotCi0JCXJldHVybiBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyLCBzZWN0aW9uVGV4dCwgbnVsbCwgdHlwZSwgZXhwYW5kZWRTdGF0ZUhvbGRlcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBzZWN0aW9uJ3MgZGVzY3JpcHRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIHdhcyBwcm92aWRlZAotCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHNlY3Rpb24gdG8gY3JlYXRlCi0JICogQHBhcmFtIGV4cGFuZGVkU3RhdGVIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB0aGF0IHdpbGwgZGljdGF0ZQotCSAqIHdoZW4gdG8gZXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgQ29tcG9zaXRlIGFkZENvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGV4cGFuZGVkU3RhdGVIb2xkZXIpIHsKLQotCQlDb21wb3NpdGUgc3ViUGFuZSA9IHRoaXMuYWRkU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCXNlY3Rpb25UZXh0LAotCQkJZGVzY3JpcHRpb24sCi0JCQlFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCB0eXBlCi0JCSk7Ci0KLQkJU2VjdGlvbiBzZWN0aW9uID0gKFNlY3Rpb24pIHN1YlBhbmUuZ2V0UGFyZW50KCk7Ci0KLQkJZXhwYW5kZWRTdGF0ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJYnVpbGRFeHBhbmRlZFN0YXRlQ2hhbmdlTGlzdGVuZXIoc2VjdGlvbikKLQkJKTsKLQotCQlzZWN0aW9uLnNldEV4cGFuZGVkKAotCQkJZXhwYW5kZWRTdGF0ZUhvbGRlci5nZXRWYWx1ZSgpICE9IG51bGwgPyBleHBhbmRlZFN0YXRlSG9sZGVyLmdldFZhbHVlKCkgOiB0cnVlCi0JCSk7Ci0KLQkJcmV0dXJuIHN1YlBhbmU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHBhcmFtIGV4cGFuZGVkU3RhdGVIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB0aGF0IHdpbGwgZGljdGF0ZQotCSAqIHdoZW4gdG8gZXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZXhwYW5kZWRTdGF0ZUhvbGRlcikgewotCi0JCXJldHVybiB0aGlzLmFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCXNlY3Rpb25UZXh0LAotCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUsCi0JCQlleHBhbmRlZFN0YXRlSG9sZGVyCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBzZWN0aW9uJ3MgZGVzY3JpcHRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBleHBhbmRlZFN0YXRlSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdGhhdCB3aWxsIGRpY3RhdGUKLQkgKiB3aGVuIHRvIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgc2VjdGlvbgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZENvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGV4cGFuZGVkU3RhdGVIb2xkZXIpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlzZWN0aW9uVGV4dCwKLQkJCWRlc2NyaXB0aW9uLAotCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUsCi0JCQlleHBhbmRlZFN0YXRlSG9sZGVyCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCB3aGljaCBjYW4gYmUgdHlwZWQgY2FzdCBkaXJlY3RseSBhcyBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHBhcmFtIGV4cGFuZGVkU3RhdGVIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB0aGF0IHdpbGwgZGljdGF0ZQotCSAqIHdoZW4gdG8gZXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkQ29sbGFwc2libGVTdWJTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBleHBhbmRlZFN0YXRlSG9sZGVyKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJc2VjdGlvblRleHQsCi0JCQlTV1QuTlVMTCwKLQkJCWV4cGFuZGVkU3RhdGVIb2xkZXIKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG5vbi1lZGl0YWJsZSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm8gYWRkQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21ibyBjb21ibyA9IHRoaXMuYWRkVW5tYW5hZ2VkQ29tYm8oY29udGFpbmVyKTsKLQkJdGhpcy5tYW5hZ2VXaWRnZXQoY29tYm8pOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBub24tZWRpdGFibGUgPGNvZGU+Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBDb21ibyBhZGRVbm1hbmFnZWRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbWJvIGNvbWJvID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUNvbWJvKGNvbnRhaW5lcik7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZ2V0RmllbGRHcmlkRGF0YSgpKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbm9uLWVkaXRhYmxlIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBzdHJpbmdDb252ZXJ0ZXIgVGhlIGNvbnZlcnRlciByZXNwb25zaWJsZSB0byB0cmFuc2Zvcm0gZWFjaCBpdGVtCi0JICogaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDb21ibyBhZGRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29udmVydGVyPFY+IHN0cmluZ0NvbnZlcnRlcikgewotCi0JCUNvbWJvIGNvbWJvID0gdGhpcy5hZGRDb21ibyhjb250YWluZXIpOwotCi0JCUNvbWJvTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCWNvbWJvLAotCQkJc3RyaW5nQ29udmVydGVyCi0JCSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbm9uLWVkaXRhYmxlIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBzdHJpbmdDb252ZXJ0ZXIgVGhlIGNvbnZlcnRlciByZXNwb25zaWJsZSB0byB0cmFuc2Zvcm0gZWFjaCBpdGVtCi0JICogaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSA8Vj4gQ29tYm8gYWRkVW5tYW5hZ2VkQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMuYWRkVW5tYW5hZ2VkQ29tYm8oY29udGFpbmVyKTsKLQotCQlDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQljb21ibywKLQkJCXN0cmluZ0NvbnZlcnRlcgotCQkpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGFkZENvbWJvKAotCQkJQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkJCUxpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCVN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZW5hYmxlZE1vZGVsKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSB0aGlzLmFkZFVubWFuYWdlZENvbWJvKGNvbnRhaW5lciwgbGlzdEhvbGRlciwgc2VsZWN0ZWRJdGVtSG9sZGVyLCBzdHJpbmdDb252ZXJ0ZXIpOwotCQl0aGlzLmNvbnRyb2xFbmFibGVkU3RhdGUoZW5hYmxlZE1vZGVsLCBjb21ibyk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbWJvVmlld2VyPC9jb2RlPiB1c2luZyBhIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcHJvdmlkZXIgcmVzcG9uc2libGUgdG8gY29udmVydCB0aGUgY29tYm8ncyBpdGVtcwotCSAqIGludG8gaHVtYW4gcmVhZGFibGUgc3RyaW5ncwotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm9WaWV3ZXI8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvVmlld2VyIGFkZENvbWJvVmlld2VyKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMuYWRkQ29tYm8oY29udGFpbmVyKTsKLQkJQ29tYm9WaWV3ZXIgdmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbWJvKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWFpbiBjb250YWluZXIgb2YgdGhpcyBwYW5lLiBUaGUgbGF5b3V0IGFuZCBsYXlvdXQgZGF0YSBhcmUKLQkgKiBhdXRvbWF0aWNhbGx5IHNldC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdGhhdCB3aWxsIGhvbGRzIGFsbCB0aGUKLQkgKiB3aWRnZXRzIGNyZWF0ZWQgYnkgdGhpcyBwYW5lIHRocm91Z2gge0BsaW5rICNpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSl9Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gdGhpcy5hZGRTdWJQYW5lKHBhcmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDb21ibyBhZGRFZGl0YWJsZUNvbWJvKAotCQkJQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkJCUxpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCVN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZW5hYmxlZE1vZGVsKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSB0aGlzLmFkZFVubWFuYWdlZEVkaXRhYmxlQ29tYm8oY29udGFpbmVyLCBsaXN0SG9sZGVyLCBzZWxlY3RlZEl0ZW1Ib2xkZXIsIHN0cmluZ0NvbnZlcnRlcik7Ci0JCXRoaXMuY29udHJvbEVuYWJsZWRTdGF0ZShlbmFibGVkTW9kZWwsIGNvbWJvKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBDb21ibyBhZGRFZGl0YWJsZUNvbWJvKAotCQkJQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUNvbWJvIGNvbWJvID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUVkaXRhYmxlQ29tYm8oY29udGFpbmVyKTsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZXRGaWVsZEdyaWREYXRhKCkpOwotCQl0aGlzLm1hbmFnZVdpZGdldChjb21ibyk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBzdHJpbmdDb252ZXJ0ZXIgVGhlIGNvbnZlcnRlciByZXNwb25zaWJsZSB0byB0cmFuc2Zvcm0gZWFjaCBpdGVtCi0JICogaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDb21ibyBhZGRFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSB0aGlzLmFkZEVkaXRhYmxlQ29tYm8oY29udGFpbmVyKTsKLQotCQlDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQljb21ibywKLQkJCXN0cmluZ0NvbnZlcnRlcgotCQkpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIDxjb2RlPkNvbWJvVmlld2VyPC9jb2RlPiB1c2luZyBhIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcHJvdmlkZXIgcmVzcG9uc2libGUgdG8gY29udmVydCB0aGUgY29tYm8ncyBpdGVtcwotCSAqIGludG8gaHVtYW4gcmVhZGFibGUgc3RyaW5ncwotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm9WaWV3ZXI8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvVmlld2VyIGFkZEVkaXRhYmxlQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSB0aGlzLmFkZEVkaXRhYmxlQ29tYm8oY29udGFpbmVyKTsKLQkJQ29tYm9WaWV3ZXIgdmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbWJvKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRXhwYW5kZWRTdGF0ZUNoYW5nZUxpc3RlbmVyKGZpbmFsIFNlY3Rpb24gc2VjdGlvbikgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKGJ1aWxkRXhwYW5kZWRTdGF0ZUNoYW5nZUxpc3RlbmVyXyhzZWN0aW9uKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRXhwYW5kZWRTdGF0ZUNoYW5nZUxpc3RlbmVyXyhmaW5hbCBTZWN0aW9uIHNlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKGZpbmFsIFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbikgZS5nZXROZXdWYWx1ZSgpOwotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gQm9vbGVhbi5UUlVFOwotCQkJCX0KLQkJCQlzZWN0aW9uLnNldEV4cGFuZGVkKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkh5cGVybGluazwvY29kZT4gdGhhdCB3aWxsIGludm9rZWQgdGhlIGdpdmVuCi0JICogPGNvZGU+UnVubmFibGU8L2NvZGU+IHdoZW4gc2VsZWN0ZWQuIFRoZSBnaXZlbiBhY3Rpb24gaXMgYWx3YXlzIGludm9rZWQKLQkgKiBmcm9tIHRoZSBVSSB0aHJlYWQuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHQgVGhlIGh5cGVybGluaydzIHRleHQKLQkgKiBAcGFyYW0gaHlwZXJMaW5rQWN0aW9uIFRoZSBhY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBsaW5rIHdhcyBzZWxlY3RlZAotCSAqIHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5IeXBlcmxpbms8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEh5cGVybGluayBhZGRIeXBlcmxpbmsoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVubmFibGUgaHlwZXJMaW5rQWN0aW9uKSB7Ci0KLQkJSHlwZXJsaW5rIGxpbmsgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlSHlwZXJsaW5rKHBhcmVudCwgdGV4dCk7Ci0JCXRoaXMubWFuYWdlV2lkZ2V0KGxpbmspOwotCi0JCWxpbmsuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCi0JCQkJSHlwZXJsaW5rIGh5cGVyTGluayA9IChIeXBlcmxpbmspIGUud2lkZ2V0OwotCi0JCQkJaWYgKGh5cGVyTGluay5pc0VuYWJsZWQoKSkgewotCQkJCQloeXBlckxpbmtBY3Rpb24ucnVuKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxhYmVsIHVzaW5nIHRoZSBnaXZlbiBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSBsYWJlbCdzIHRleHQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGFiZWwgYWRkTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0KLQkJTGFiZWwgbGFiZWwgPSBhZGRVbm1hbmFnZWRMYWJlbChjb250YWluZXIsIGxhYmVsVGV4dCk7Ci0JCW1hbmFnZVdpZGdldChsYWJlbCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGFiZWwgYWRkTGFiZWwoCi0JCQlDb21wb3NpdGUgY29udGFpbmVyLAotCQkJU3RyaW5nIGxhYmVsVGV4dCwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwKLQkpIHsKLQkJTGFiZWwgbGFiZWwgPSB0aGlzLmFkZFVubWFuYWdlZExhYmVsKGNvbnRhaW5lciwgbGFiZWxUZXh0KTsKLQkJdGhpcy5jb250cm9sRW5hYmxlZFN0YXRlKGVuYWJsZWRNb2RlbCwgbGFiZWwpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bm1hbmFnZWQgPGNvZGU+TGFiZWw8L2NvZGU+IHdpZGdldC4gIFVubWFuYWdlZCBtZWFucwotCSAqIHRoYXQgdGhpcyBQYW5lIHdpbGwgbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LgotCSAqIFRoZSBvd25pbmcgb2JqZWN0IHdpbGwgaGFuZGxlIGl0IHdpdGggaXRzIG93biBQYW5lRW5hYmxlciBvciBDb250cm9sRW5hYmxlci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSBsYWJlbCdzIHRleHQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIExhYmVsIGFkZFVubWFuYWdlZExhYmVsKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCkgewotCi0JCXJldHVybiB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlTGFiZWwoY29udGFpbmVyLCBsYWJlbFRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgbm9uLWVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aAotCSAqIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGFkZExhYmVsZWRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMuYWRkQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJc3RyaW5nQ29udmVydGVyCi0JCSk7Ci0KLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJKGNvbWJvLmdldFBhcmVudCgpICE9IGNvbnRhaW5lcikgPyBjb21iby5nZXRQYXJlbnQoKSA6IGNvbWJvLAotCQkJcmlnaHRDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgbm9uLWVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aAotCSAqIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGFkZExhYmVsZWRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZENvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXN0cmluZ0NvbnZlcnRlciwKLQkJCW51bGwsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsZWZ0Q29udHJvbCBUaGUgd2lkZ2V0IHNob3duIHRvIHRoZSBsZWZ0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBjZW50ZXJDb250cm9sIFRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkTGFiZWxlZENvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLAotCQkJCQkJCQkJCQkJCUNvbnRyb2wgbGVmdENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCBjZW50ZXJDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQkvLyBDb250YWluZXIgZm9yIHRoZSBsYWJlbCBhbmQgbWFpbiBjb21wb3NpdGUKLQkJY29udGFpbmVyID0gdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgMywgMCwgMCwgMCwgMCk7Ci0KLQkJLy8gTGVmdCBjb250cm9sCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQkJbGVmdENvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJLy8gUmUtcGFyZW50IHRoZSBsZWZ0IGNvbnRyb2wgdG8gdGhlIG5ldyBzdWIgcGFuZQotCQlsZWZ0Q29udHJvbC5zZXRQYXJlbnQoY29udGFpbmVyKTsKLQkJdGhpcy5hZGRBbGlnbkxlZnQobGVmdENvbnRyb2wpOwotCi0KLQkJLy8gUmUtcGFyZW50IHRoZSBjZW50ZXIgY29udHJvbCB0byB0aGUgbmV3IHN1YiBwYW5lCi0JCWNlbnRlckNvbnRyb2wuc2V0UGFyZW50KGNvbnRhaW5lcik7Ci0KLQkJLy8gUmVnaXN0ZXIgdGhlIGhlbHAgaWQgZm9yIHRoZSBjZW50ZXIgY29udHJvbAotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNlbnRlckNvbnRyb2wsIGhlbHBJZCk7Ci0JCX0KLQotCQkvLyBSaWdodCBjb250cm9sCi0JCWlmIChyaWdodENvbnRyb2wgPT0gbnVsbCkgewotCQkJQ29tcG9zaXRlIHNwYWNlciA9IHRoaXMuYWRkUGFuZShjb250YWluZXIpOwotCQkJc3BhY2VyLnNldExheW91dCh0aGlzLmJ1aWxkU3BhY2VyTGF5b3V0KCkpOwotCQkJcmlnaHRDb250cm9sID0gc3BhY2VyOwotCQl9Ci0JCWVsc2UgewotCQkJcmlnaHRDb250cm9sLnNldFBhcmVudChjb250YWluZXIpOwotCi0JCQkvLyBSZWdpc3RlciB0aGUgaGVscCBpZCBmb3IgdGhlIHJpZ2h0IGNvbnRyb2wKLQkJCWlmIChoZWxwSWQgIT0gbnVsbCkgewotCQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJpZ2h0Q29udHJvbCwgaGVscElkKTsKLQkJCX0KLQkJfQotCi0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotCQlyaWdodENvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXRoaXMuYWRkQWxpZ25SaWdodChyaWdodENvbnRyb2wpOwotCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGNlbnRlciBjb250cm9sCi0JICogQHBhcmFtIGNlbnRlckNvbnRyb2wgVGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29udHJvbAotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkTGFiZWxlZENvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLAotCQkJCQkJCQkJCQkJCUNvbnRyb2wgbGFiZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCBjZW50ZXJDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWwsCi0JCQljZW50ZXJDb250cm9sLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29tcG9zaXRlIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbCB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgdG8gbGFiZWwgdGhlIG1haW4gY29tcG9zaXRlCi0JICogQHBhcmFtIGNlbnRlclBhbmUgVGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlCi0JICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSBsYWJlbCBhbmQgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRMYWJlbGVkQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5lPD8+IGNlbnRlclBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQljZW50ZXJQYW5lLmdldENvbnRyb2woKSwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29tcG9zaXRlIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbCB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgdG8gbGFiZWwgdGhlIG1haW4gY29tcG9zaXRlCi0JICogQHBhcmFtIGNlbnRlckNvbnRyb2wgVGhlIG1haW4gd2lkZ2V0Ci0JICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSBsYWJlbCBhbmQgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRMYWJlbGVkQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIGNlbnRlckNvbnRyb2wpIHsKLQotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQljZW50ZXJDb250cm9sLAotCQkJbnVsbCwKLQkJCW51bGwKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbXBvc2l0ZSBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwgdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IHRvIGxhYmVsIHRoZSBtYWluIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjZW50ZXJDb250cm9sIFRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkTGFiZWxlZENvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCBjZW50ZXJDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJdGhpcy5hZGRMYWJlbChjb250YWluZXIsIGxhYmVsVGV4dCksCi0JCQljZW50ZXJDb250cm9sLAotCQkJcmlnaHRDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb21wb3NpdGUgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCB0byBsYWJlbCB0aGUgbWFpbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZExhYmVsZWRDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgY2VudGVyQ29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJTGFiZWwgbGFiZWwgPSB0aGlzLmFkZExhYmVsKGNvbnRhaW5lciwgbGFiZWxUZXh0KTsKLQotCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWwsCi0JCQljZW50ZXJDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGVmdENvbnRyb2wgVGhlIHdpZGdldCBzaG93biB0byB0aGUgbGVmdCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm8gYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZnlMaXN0ZW5lciBjb21ib0xpc3RlbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSB0aGlzLmFkZEVkaXRhYmxlQ29tYm8oY29udGFpbmVyKTsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIoY29tYm9MaXN0ZW5lcik7Ci0KLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJKGNvbWJvLmdldFBhcmVudCgpICE9IGNvbnRhaW5lcikgPyBjb21iby5nZXRQYXJlbnQoKSA6IGNvbWJvLAotCQkJcmlnaHRDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGFuIGVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aCB0aGUKLQkgKiBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGNvbWJvTGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBub3RpZmllZCB3aGVuIHRoZSBzZWxlY3Rpb24KLQkgKiBjaGFuZ2VzCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvIGFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZ5TGlzdGVuZXIgY29tYm9MaXN0ZW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCWNvbWJvTGlzdGVuZXIsCi0JCQludWxsLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGVmdENvbnRyb2wgVGhlIHdpZGdldCBzaG93biB0byB0aGUgbGVmdCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcHJvdmlkZXIgcmVzcG9uc2libGUgdG8gY29udmVydCB0aGUgY29tYm8ncyBpdGVtcwotCSAqIGludG8gaHVtYW4gcmVhZGFibGUgc3RyaW5ncwotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21ibyBhZGRMYWJlbGVkRWRpdGFibGVDb21ib1ZpZXdlcihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmeUxpc3RlbmVyIGNvbWJvTGlzdGVuZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJQ29tYm9WaWV3ZXIgY29tYm9WaWV3ZXIgPSB0aGlzLmFkZEVkaXRhYmxlQ29tYm9WaWV3ZXIoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFByb3ZpZGVyCi0JCSk7Ci0KLQkJQ29tYm8gY29tYm8gPSBjb21ib1ZpZXdlci5nZXRDb21ibygpOwotCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihjb21ib0xpc3RlbmVyKTsKLQotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQkoY29tYm8uZ2V0UGFyZW50KCkgIT0gY29udGFpbmVyKSA/IGNvbWJvLmdldFBhcmVudCgpIDogY29tYm8sCi0JCQlyaWdodENvbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYW4gZWRpdGFibGUgY29tYm8gbGFiZWxlZCB3aXRoIHRoZQotCSAqIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gY29tYm9MaXN0ZW5lciBUaGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNlbGVjdGlvbgotCSAqIGNoYW5nZXMKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcHJvdmlkZXIgcmVzcG9uc2libGUgdG8gY29udmVydCB0aGUgY29tYm8ncyBpdGVtcwotCSAqIGludG8gaHVtYW4gcmVhZGFibGUgc3RyaW5ncwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21ibyBhZGRMYWJlbGVkRWRpdGFibGVDb21ib1ZpZXdlcihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmeUxpc3RlbmVyIGNvbWJvTGlzdGVuZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRFZGl0YWJsZUNvbWJvVmlld2VyKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJY29tYm9MaXN0ZW5lciwKLQkJCWxhYmVsUHJvdmlkZXIsCi0JCQludWxsLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYW4gZWRpdGFibGUgY29tYm8gbGFiZWxlZCB3aXRoIHRoZQotCSAqIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ29tYm8gYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxWPmluc3RhbmNlKCksCi0JCQludWxsLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIHN0cmluZ0NvbnZlcnRlciBUaGUgY29udmVydGVyIHJlc3BvbnNpYmxlIHRvIHRyYW5zZm9ybSBlYWNoIGl0ZW0KLQkgKiBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0JICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgY29udHJvbCBzaG93biB0byB0aGUgcmlnaHQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCUNvbWJvIGNvbWJvID0gdGhpcy5hZGRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXN0cmluZ0NvbnZlcnRlcgotCQkpOwotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCShjb21iby5nZXRQYXJlbnQoKSAhPSBjb250YWluZXIpID8gY29tYm8uZ2V0UGFyZW50KCkgOiBjb21ibywKLQkJCXJpZ2h0Q29udHJvbCwKLQkJCWhlbHBJZAotCQkpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhbiBlZGl0YWJsZSBjb21ibyBsYWJlbGVkIHdpdGggdGhlCi0JICogZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIHN0cmluZ0NvbnZlcnRlciBUaGUgY29udmVydGVyIHJlc3BvbnNpYmxlIHRvIHRyYW5zZm9ybSBlYWNoIGl0ZW0KLQkgKiBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJc3RyaW5nQ29udmVydGVyLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgYXJlYSdzIGxhYmVsCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGxpbmVDb3VudCBUaGUgbnVtYmVyIG9mIGxpbmVzIHRoZSB0ZXh0IGFyZWEgc2hvdWxkIGRpc3BsYXkKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSB0ZXh0IGZpZWxkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZExhYmVsZWRNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZUNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVRleHQgdGV4dCA9IHRoaXMuYWRkTXVsdGlMaW5lVGV4dChjb250YWluZXIsIHRleHRIb2xkZXIsIGxpbmVDb3VudCk7Ci0KLQkJY29udGFpbmVyID0gdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJdGV4dCwKLQkJCWhlbHBJZAotCQkpOwotCi0JCWludCB0ZXh0SGVpZ2h0ID0gdGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLnk7Ci0KLQkJLy8gU3BlY2lmeSB0aGUgbnVtYmVyIG9mIGxpbmVzIHRoZSB0ZXh0IGFyZWEgc2hvdWxkIGRpc3BsYXkKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIHRleHQuZ2V0TGF5b3V0RGF0YSgpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkgKiBsaW5lQ291bnQ7Ci0KLQkJLy8gTW92ZSB0aGUgbGFiZWwgdG8gdGhlIHRvcCBvZiBpdHMgY2VsbAotCQlDb250cm9sIGxhYmVsID0gY29udGFpbmVyLmdldENoaWxkcmVuKClbMF07Ci0JCWludCBsYWJlbEhlaWdodCA9IGxhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueTsKLQotCQlncmlkRGF0YSA9IChHcmlkRGF0YSkgbGFiZWwuZ2V0TGF5b3V0RGF0YSgpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ICAgKz0gKE1hdGguYWJzKHRleHRIZWlnaHQgLSBsYWJlbEhlaWdodCkgLyAyKTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCi0JICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkTGFiZWxlZFBhc3N3b3JkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlcikgewotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRQYXNzd29yZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQl0ZXh0SG9sZGVyLAotCQkJbnVsbAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgZmllbGQncyBsYWJlbAotCSAqIEBwYXJhbSByaWdodENvbXBvbmVudCBUaGUgY29tcG9uZW50IHRvIGJlIHBsYWNlZCB0byB0aGUgcmlnaHQgb2YgdGhlIHRleHQKLQkgKiBmaWVsZAotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHRleHQgZmllbGQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkTGFiZWxlZFBhc3N3b3JkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLmFkZFBhc3N3b3JkVGV4dChjb250YWluZXIsIHRleHRIb2xkZXIpOwotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCXRleHQsCi0JCQlyaWdodENvbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCi0JICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSB0ZXh0IGZpZWxkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZExhYmVsZWRQYXNzd29yZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkUGFzc3dvcmRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJdGV4dEhvbGRlciwKLQkJCW51bGwsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNwaW5uZXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgbGFiZWwncyB0ZXh0Ci0JICogQHBhcmFtIG51bWJlckhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBpbnRlZ2VyIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgc2hvd24gd2hlbiB0aGUgaG9sZGVyIGhhcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBtaW5pbXVtVmFsdWUgVGhlIG1pbmltdW0gdmFsdWUgdGhhdCB0aGUgc3Bpbm5lciB3aWxsIGFsbG93Ci0JICogQHBhcmFtIG1heGltdW1WYWx1ZSBUaGUgbWF4aW11bSB2YWx1ZSB0aGF0IHRoZSBzcGlubmVyIHdpbGwgYWxsb3cKLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSB3aWRnZXQgdG8gYmUgcGxhY2VkIHRvIHRoZSByaWdodCBvZiBzcGlubmVyCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgc3Bpbm5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+U3Bpbm5lcjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3Bpbm5lciBhZGRMYWJlbGVkU3Bpbm5lcihDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5pbXVtVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4aW11bVZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gdGhpcy5hZGRTcGlubmVyKAotCQkJcGFyZW50LAotCQkJbnVtYmVySG9sZGVyLAotCQkJZGVmYXVsdFZhbHVlLAotCQkJbWluaW11bVZhbHVlLAotCQkJbWF4aW11bVZhbHVlLAotCQkJaGVscElkCi0JCSk7Ci0JCUxhYmVsIGxhYmVsID0gYWRkTGFiZWwocGFyZW50LCBsYWJlbFRleHQpOwotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJcGFyZW50LAotCQkJbGFiZWwsCi0JCQkoc3Bpbm5lci5nZXRQYXJlbnQoKSAhPSBwYXJlbnQpID8gc3Bpbm5lci5nZXRQYXJlbnQoKSA6IHNwaW5uZXIsCi0JCQlyaWdodENvbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IChHcmlkRGF0YSkgc3Bpbm5lci5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0KLQkJcmV0dXJuIHNwaW5uZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtYW5hZ2VkIHNwaW5uZXIuIE1hbmFnZWQgbWVhbnMgdGhhdCB0aGlzIFBhbmUgd2lsbAotCSAqIGhhbmRsZSBlbmFibGluZy9kaXNhYmxpbmcgb2YgdGhpcyB3aWRnZXQgaWYgYSBQYW5lRW5hYmxlciBpcyB1c2VkLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBudW1iZXJIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgaW50ZWdlciB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHNob3duIHdoZW4gdGhlIGhvbGRlciBoYXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gbWluaW11bVZhbHVlIFRoZSBtaW5pbXVtIHZhbHVlIHRoYXQgdGhlIHNwaW5uZXIgd2lsbCBhbGxvdwotCSAqIEBwYXJhbSBtYXhpbXVtVmFsdWUgVGhlIG1heGltdW0gdmFsdWUgdGhhdCB0aGUgc3Bpbm5lciB3aWxsIGFsbG93Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGJ1dHRvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+U3Bpbm5lcjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3Bpbm5lciBhZGRTcGlubmVyKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluaW11bVZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4aW11bVZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gYWRkVW5tYW5hZ2VkU3Bpbm5lcihwYXJlbnQsIG51bWJlckhvbGRlciwgZGVmYXVsdFZhbHVlLCBtaW5pbXVtVmFsdWUsIG1heGltdW1WYWx1ZSwgaGVscElkKTsKLQkJdGhpcy5tYW5hZ2VXaWRnZXQoc3Bpbm5lcik7Ci0JCXJldHVybiBzcGlubmVyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5tYW5hZ2VkIHNwaW5uZXIuICBVbm1hbmFnZWQgbWVhbnMgdGhhdCB0aGlzIFBhbmUgd2lsbAotCSAqIG5vdCBoYW5kbGUgdGhlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldC4gIFRoZSBvd25pbmcgb2JqZWN0IHdpbGwgaGFuZGxlCi0JICogaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIG9yIENvbnRyb2xFbmFibGVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBudW1iZXJIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgaW50ZWdlciB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHNob3duIHdoZW4gdGhlIGhvbGRlciBoYXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gbWluaW11bVZhbHVlIFRoZSBtaW5pbXVtIHZhbHVlIHRoYXQgdGhlIHNwaW5uZXIgd2lsbCBhbGxvdwotCSAqIEBwYXJhbSBtYXhpbXVtVmFsdWUgVGhlIG1heGltdW0gdmFsdWUgdGhhdCB0aGUgc3Bpbm5lciB3aWxsIGFsbG93Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGJ1dHRvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+U3Bpbm5lcjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIFNwaW5uZXIgYWRkVW5tYW5hZ2VkU3Bpbm5lcihDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbmltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heGltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVTcGlubmVyKHBhcmVudCk7Ci0JCXNwaW5uZXIuc2V0TWluaW11bShtaW5pbXVtVmFsdWUpOwotCQlzcGlubmVyLnNldE1heGltdW0obWF4aW11bVZhbHVlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBnZXRGaWVsZEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQkJc3Bpbm5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlTcGlubmVyTW9kZWxBZGFwdGVyLmFkYXB0KG51bWJlckhvbGRlciwgc3Bpbm5lciwgZGVmYXVsdFZhbHVlKTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNwaW5uZXIsIGhlbHBJZCk7Ci0JCX0KLQotCQlyZXR1cm4gc3Bpbm5lcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1hbmFnZWQgRGF0ZVRpbWUgb2YgdHlwZSBTV1QuVElNRS4gIE1hbmFnZWQgbWVhbnMgdGhhdCB0aGlzIFBhbmUgd2lsbAotCSAqIGhhbmRsZSBlbmFibGluZy9kaXNhYmxpbmcgb2YgdGhpcyB3aWRnZXQgaWYgYSBQYW5lRW5hYmxlciBpcyB1c2VkLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBob3Vyc0hvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBob3VycyBpbnRlZ2VyIHZhbHVlCi0JICogQHBhcmFtIG1pbnV0ZXNIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgbWludXRlcyBpbnRlZ2VyIHZhbHVlCi0JICogQHBhcmFtIHNlY29uZHNIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2Vjb25kcyBpbnRlZ2VyIHZhbHVlCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGRhdGVUaW1lCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5EYXRlVGltZTwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRGF0ZVRpbWUgYWRkRGF0ZVRpbWUoQ29tcG9zaXRlIHBhcmVudCwKLQkJCQkJCQkJCQkJTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBob3Vyc0hvbGRlciwKLQkJCQkJCQkJCQkJTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBtaW51dGVzSG9sZGVyLAotCQkJCQkJCQkJCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IHNlY29uZHNIb2xkZXIsCi0JCQkJCQkJCQkJCVN0cmluZyBoZWxwSWQpIHsKLQotCQlEYXRlVGltZSBkYXRlVGltZSA9IHRoaXMuYWRkVW5tYW5hZ2VkRGF0ZVRpbWUocGFyZW50LCBob3Vyc0hvbGRlciwgbWludXRlc0hvbGRlciwgc2Vjb25kc0hvbGRlciwgaGVscElkKTsKLQkJdGhpcy5tYW5hZ2VXaWRnZXQoZGF0ZVRpbWUpOwotCi0JCXJldHVybiBkYXRlVGltZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgRGF0ZVRpbWUgYWRkRGF0ZVRpbWUoCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBob3Vyc0hvbGRlciwKLQkJCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbWludXRlc0hvbGRlciwKLQkJCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gc2Vjb25kc0hvbGRlciwKLQkJCVN0cmluZyBoZWxwSWQsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZW5hYmxlZE1vZGVsCi0JKSB7Ci0JCURhdGVUaW1lIGRhdGVUaW1lID0gdGhpcy5hZGRVbm1hbmFnZWREYXRlVGltZShwYXJlbnQsIGhvdXJzSG9sZGVyLCBtaW51dGVzSG9sZGVyLCBzZWNvbmRzSG9sZGVyLCBoZWxwSWQpOwotCQl0aGlzLmNvbnRyb2xFbmFibGVkU3RhdGUoZW5hYmxlZE1vZGVsLCBkYXRlVGltZSk7Ci0JCXJldHVybiBkYXRlVGltZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCBEYXRlVGltZSBvZiB0eXBlIFNXVC5USU1FLiAgVW5tYW5hZ2VkIG1lYW5zIHRoYXQgdGhpcyBQYW5lIHdpbGwKLQkgKiBub3QgaGFuZGxlIHRoZSBlbmFibGluZy9kaXNhYmxpbmcgb2YgdGhpcyB3aWRnZXQuICBUaGUgb3duaW5nIG9iamVjdCB3aWxsIGhhbmRsZQotCSAqIGl0IHdpdGggaXRzIG93biBQYW5lRW5hYmxlciBvciBDb250cm9sRW5hYmxlci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaG91cnNIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgaG91cnMgaW50ZWdlciB2YWx1ZQotCSAqIEBwYXJhbSBtaW51dGVzSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG1pbnV0ZXMgaW50ZWdlciB2YWx1ZQotCSAqIEBwYXJhbSBzZWNvbmRzSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlY29uZHMgaW50ZWdlciB2YWx1ZQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBkYXRlVGltZQotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+RGF0ZVRpbWU8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBEYXRlVGltZSBhZGRVbm1hbmFnZWREYXRlVGltZShDb21wb3NpdGUgcGFyZW50LAotCQkJCQkJCQkJCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGhvdXJzSG9sZGVyLAotCQkJCQkJCQkJCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG1pbnV0ZXNIb2xkZXIsCi0JCQkJCQkJCQkJCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gc2Vjb25kc0hvbGRlciwKLQkJCQkJCQkJCQkJU3RyaW5nIGhlbHBJZCkgewotCi0JCURhdGVUaW1lIGRhdGVUaW1lID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZURhdGVUaW1lKHBhcmVudCwgU1dULlRJTUUpOwotCi0JCURhdGVUaW1lTW9kZWxBZGFwdGVyLmFkYXB0KGhvdXJzSG9sZGVyLCBtaW51dGVzSG9sZGVyLCBzZWNvbmRzSG9sZGVyLCBkYXRlVGltZSk7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscChkYXRlVGltZSwgaGVscElkKTsKLQkJfQotCi0JCXJldHVybiBkYXRlVGltZTsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlZGl0YWJsZSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gc3RyaW5nQ29udmVydGVyIFRoZSBjb252ZXJ0ZXIgcmVzcG9uc2libGUgdG8gdHJhbnNmb3JtIGVhY2ggaXRlbQotCSAqIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIDxWPiBDb21ibyBhZGRVbm1hbmFnZWRFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSBhZGRVbm1hbmFnZWRFZGl0YWJsZUNvbWJvKGNvbnRhaW5lcik7Ci0KLQkJQ29tYm9Nb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJY29tYm8sCi0JCQlzdHJpbmdDb252ZXJ0ZXIKLQkJKTsKLQotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIENvbWJvIGFkZFVubWFuYWdlZEVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUNvbWJvIGNvbWJvID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUVkaXRhYmxlQ29tYm8oY29udGFpbmVyKTsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZXRGaWVsZEdyaWREYXRhKCkpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSB0ZXh0IGZpZWxkIGFzIHRoZSBjZW50ZXIgY29udHJvbAotCSAqIGxhYmVsZWQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZExhYmVsZWRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkVGV4dChjb250YWluZXIsIGxhYmVsVGV4dCwgdGV4dEhvbGRlciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSB0ZXh0IGZpZWxkIGFzIHRoZSBjZW50ZXIgY29udHJvbAotCSAqIGxhYmVsZWQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBmaWVsZCdzIGxhYmVsCi0JICogQHBhcmFtIHJpZ2h0Q29tcG9uZW50IFRoZSBjb21wb25lbnQgdG8gYmUgcGxhY2VkIHRvIHRoZSByaWdodCBvZiB0aGUgdGV4dAotCSAqIGZpZWxkCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgdGV4dCBmaWVsZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRMYWJlbGVkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbXBvbmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLmFkZFRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyKTsKLQotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQl0ZXh0LAotCQkJcmlnaHRDb21wb25lbnQsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JLyoqCi0JICoKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCi0JICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IGZpZWxkJ3MgbGFiZWwKLQkgKiBAcGFyYW0gcmlnaHRDb21wb25lbnQgVGhlIGNvbXBvbmVudCB0byBiZSBwbGFjZWQgdG8gdGhlIHJpZ2h0IG9mIHRoZSB0ZXh0Ci0JICogZmllbGQKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSB0ZXh0IGZpZWxkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZExhYmVsZWRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCBsYWJlbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbXBvbmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLmFkZFRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyKTsKLQotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbCwKLQkJCXRleHQsCi0JCQlyaWdodENvbXBvbmVudCwKLQkJCWhlbHBJZAotCQkpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHRleHQgZmllbGQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkTGFiZWxlZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCXRleHRIb2xkZXIsCi0JCQludWxsLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSB0ZXh0IGZpZWxkIGFzIHRoZSBjZW50ZXIgY29udHJvbAotCSAqIGxhYmVsZWQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgdGV4dCBmaWVsZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRMYWJlbGVkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWwgbGFiZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsLAotCQkJdGV4dEhvbGRlciwKLQkJCW51bGwsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxpc3QgYW5kIG5vdGlmeSB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGhvbGRlciB3aGVuIHRoZQotCSAqIHNlbGVjdGlvbiBjaGFuZ2VzLiBJZiB0aGUgc2VsZWN0aW9uIGNvdW50IGlzIGRpZmZlcmVudCB0aGFuIG9uZSB0aGFuIHRoZQotCSAqIGhvbGRlciB3aWxsIHJlY2VpdmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHJhZGlvIGJ1dHRvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+TGlzdDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdCBhZGRMaXN0KENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRMaXN0KAotCQkJY29udGFpbmVyLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCksCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxpc3QgYW5kIG5vdGlmeSB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGhvbGRlciB3aGVuIHRoZQotCSAqIHNlbGVjdGlvbiBjaGFuZ2VzLiBJZiB0aGUgc2VsZWN0aW9uIGNvdW50IGlzIGRpZmZlcmVudCB0aGFuIG9uZSB0aGFuIHRoZQotCSAqIGhvbGRlciB3aWxsIHJlY2VpdmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHNlbGVjdGlvbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB1bmlxdWUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyByYWRpbyBidXR0b24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkxpc3Q8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3QgYWRkTGlzdChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc2VsZWN0aW9uSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJTGlzdCBsaXN0ID0gdGhpcy5hZGRVbm1hbmFnZWRMaXN0KGNvbnRhaW5lciwgc2VsZWN0aW9uSG9sZGVyLCBoZWxwSWQpOwotCQl0aGlzLm1hbmFnZVdpZGdldChsaXN0KTsKLQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCBsaXN0IGFuZCBub3RpZnkgdGhlIGdpdmVuIHNlbGVjdGlvbiBob2xkZXIgd2hlbiB0aGUKLQkgKiBzZWxlY3Rpb24gY2hhbmdlcy4gSWYgdGhlIHNlbGVjdGlvbiBjb3VudCBpcyBkaWZmZXJlbnQgdGhhbiBvbmUgdGhhbiB0aGUKLQkgKiBob2xkZXIgd2lsbCByZWNlaXZlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIFVubWFuYWdlZCBtZWFucyB0aGF0IHRoaXMgUGFuZSB3aWxsIG5vdCBoYW5kbGUgdGhlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldC4KLQkgKiBUaGUgb3duaW5nIG9iamVjdCB3aWxsIGhhbmRsZSBpdCB3aXRoIGl0cyBvd24gUGFuZUVuYWJsZXIgb3IgQ29udHJvbEVuYWJsZXIuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHNlbGVjdGlvbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB1bmlxdWUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyByYWRpbyBidXR0b24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkxpc3Q8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBMaXN0IGFkZFVubWFuYWdlZExpc3QoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHNlbGVjdGlvbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCUxpc3QgbGlzdCA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVMaXN0KAotCQkJY29udGFpbmVyLAotCQkJU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5NVUxUSQotCQkpOwotCi0JCWxpc3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIoYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25Ib2xkZXIpKTsKLQkJbGlzdC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGxpc3QsIGhlbHBJZCk7Ci0JCX0KLQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxhYmxlIGV4cGFuZGluZyBvbiBtdWx0aXBsZSBsaW5lcy4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSBsYWJlbCdzIHRleHQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRm9ybVRleHQgYWRkTXVsdGlMaW5lTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQpIHsKLQotCQlGb3JtVGV4dCBsYWJlbCA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVNdWx0aUxpbmVMYWJlbChjb250YWluZXIsIGxhYmVsVGV4dCk7Ci0JCW1hbmFnZVdpZGdldChsYWJlbCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldCB0aGF0IGhhcyBtdWx0aXBsZSBsaW5lcy4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAotCSAqCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZU11bHRpTGluZVRleHQoY29udGFpbmVyKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdldEZpZWxkR3JpZERhdGEoKSk7Ci0JCXRoaXMubWFuYWdlV2lkZ2V0KHRleHQpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0IHRoYXQgaGFzIG11bHRpcGxlIGxpbmVzLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsaW5lQ291bnQgVGhlIG51bWJlciBvZiBsaW5lcyB0aGUgdGV4dCBhcmVhIHNob3VsZCBkaXNwbGF5Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHRleHQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZE11bHRpTGluZVRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lQ291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRNdWx0aUxpbmVUZXh0KGNvbnRhaW5lcik7Ci0JCWFkanVzdE11bHRpTGluZVRleHRMYXlvdXQoY29udGFpbmVyLCBsaW5lQ291bnQsIHRleHQsIHRleHQuZ2V0TGluZUhlaWdodCgpKTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRleHQsIGhlbHBJZCk7Ci0JCX0KLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldCB0aGF0IGhhcyBtdWx0aXBsZSBsaW5lcy4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gbGluZUNvdW50IFRoZSBudW1iZXIgb2YgbGluZXMgdGhlIHRleHQgYXJlYSBzaG91bGQgZGlzcGxheQotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVDb3VudCkgewotCi0JCXJldHVybiB0aGlzLmFkZE11bHRpTGluZVRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyLCBsaW5lQ291bnQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0IHRoYXQgaGFzIG11bHRpcGxlIGxpbmVzLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0ZXh0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZUNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgbGluZUNvdW50LCBoZWxwSWQpOwotCQlTV1RUb29scy5iaW5kKHRleHRIb2xkZXIsIHRleHQpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBBZGp1c3RzIHRoZSBsYXlvdXQgb2YgdGhlIGdpdmVuIGNvbnRhaW5lciBzbyB0aGF0IHRoZSB0ZXh0IGNvbnRyb2wgaGFzIHRoZSBjb3JyZWN0IGFtb3VudCBvZgotCSAqIGxpbmVzIGJ5IGRlZmF1bHQuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRqdXN0TXVsdGlMaW5lVGV4dExheW91dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVDb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lSGVpZ2h0KSB7Ci0KLQkJaW50IHRleHRIZWlnaHQgPSB0ZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueTsKLQotCQkvLyBTcGVjaWZ5IHRoZSBudW1iZXIgb2YgbGluZXMgdGhlIHRleHQgYXJlYSBzaG91bGQgZGlzcGxheQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IChHcmlkRGF0YSkgdGV4dC5nZXRMYXlvdXREYXRhKCk7Ci0JCWlmIChncmlkRGF0YSA9PSBudWxsKSB7Ci0JCQlncmlkRGF0YSA9IHRoaXMuZ2V0RmllbGRHcmlkRGF0YSgpOwotCQkJdGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gbGluZUhlaWdodCAqIGxpbmVDb3VudDsKLQotCQkvLyBNb3ZlIHRoZSBsYWJlbCB0byB0aGUgdG9wIG9mIGl0cyBjZWxsCi0JCUNvbnRyb2wgbGFiZWwgPSBjb250YWluZXIuZ2V0Q2hpbGRyZW4oKVswXTsKLQkJaW50IGxhYmVsSGVpZ2h0ID0gbGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55OwotCi0JCWdyaWREYXRhID0gKEdyaWREYXRhKSBsYWJlbC5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKLQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgICArPSAoTWF0aC5hYnModGV4dEhlaWdodCAtIGxhYmVsSGVpZ2h0KSAvIDIpOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhZ2VCb29rPC9jb2RlPiBhbmQgc2V0IHRoZSBwcm9wZXIgbGF5b3V0IGFuZCBsYXlvdXQKLQkgKiBkYXRhLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+UGFnZUJvb2s8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFBhZ2VCb29rIGFkZFBhZ2VCb29rKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlQYWdlQm9vayBwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJldHVybiBwYWdlQm9vazsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB3aXRob3V0IHNwZWNpZnlpbmcgYW55IGxheW91dCBtYW5hZ2VyLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IG9mIHRoZSBuZXcgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVDb21wb3NpdGUocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB1c2luZyB0aGUgZ2l2ZW4gbGF5b3V0IG1hbmFnZXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgb2YgdGhlIG5ldyBjb250YWluZXIKLQkgKiBAcGFyYW0gbGF5b3V0IFRoZSBsYXlvdXQgbWFuYWdlciBvZiB0aGUgbmV3IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgY29udGFpbmVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIExheW91dCBsYXlvdXQpIHsKLQotCQljb250YWluZXIgPSB0aGlzLmFkZFBhbmUoY29udGFpbmVyKTsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRQYXNzd29yZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlcikgewotCi0JCVRleHQgdGV4dCA9IHRoaXMuYWRkUGFzc3dvcmRUZXh0KGNvbnRhaW5lcik7Ci0JCVNXVFRvb2xzLmJpbmQodGV4dEhvbGRlciwgdGV4dCk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRQYXNzd29yZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCVRleHQgdGV4dCA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVQYXNzd29yZFRleHQoY29udGFpbmVyKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdldEZpZWxkR3JpZERhdGEoKSk7Ci0KLQkJdGhpcy5tYW5hZ2VXaWRnZXQodGV4dCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgcHVzaCBidXR0b24gdXNpbmcgdGhlIGdpdmVuIGluZm9ybWF0aW9uLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBidXR0b25UZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGJ1dHRvbkFjdGlvbiBUaGUgYWN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgYnV0dG9uIGlzIHByZXNzZWQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGFkZFB1c2hCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnV0dG9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSdW5uYWJsZSBidXR0b25BY3Rpb24pIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRQdXNoQnV0dG9uKHBhcmVudCwgYnV0dG9uVGV4dCwgbnVsbCwgYnV0dG9uQWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHB1c2ggYnV0dG9uIHVzaW5nIHRoZSBnaXZlbiBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBidXR0b25BY3Rpb24gVGhlIGFjdGlvbiB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGJ1dHRvbiBpcyBwcmVzc2VkCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHJhZGlvIGJ1dHRvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYWRkUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBidXR0b25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVubmFibGUgYnV0dG9uQWN0aW9uKSB7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVQdXNoQnV0dG9uKHBhcmVudCwgYnV0dG9uVGV4dCk7Ci0JCW1hbmFnZVdpZGdldChidXR0b24pOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlidXR0b25BY3Rpb24ucnVuKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGJ1dHRvbiwgaGVscElkKTsKLQkJfQotCi0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjaGVjayBib3ggdXNpbmcgdGhlIGdpdmVuIGluZm9ybWF0aW9uLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBidXR0b25UZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0aW9uIHN0YXRlCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHJhZGlvIGJ1dHRvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYWRkUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJ1dHRvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZFRvZ2dsZUJ1dHRvbigKLQkJCXBhcmVudCwKLQkJCWJ1dHRvblRleHQsCi0JCQlib29sZWFuSG9sZGVyLAotCQkJaGVscElkLAotCQkJU1dULlJBRElPCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCkgewotCi0JCXJldHVybiB0aGlzLmFkZFNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlzZWN0aW9uVGV4dCwKLQkJCUV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2Ygc2VjdGlvbiB0byBjcmVhdGUKLQkgKiBAcGFyYW0gZXhwYW5kZWRTdGF0ZUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBib29sZWFuIHRoYXQgd2lsbCBkaWN0YXRlCi0JICogd2hlbiB0byBleHBhbmQgb3IgY29sbGFwc2UgdGhlIHNlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZWN0aW9uPC9jb2RlPidzIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgYWRkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkU2VjdGlvbihjb250YWluZXIsIHNlY3Rpb25UZXh0LCBudWxsLCB0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LiBBIHN1Yi1wYW5lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMKLQkgKiBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAotCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIHNlY3Rpb24ncyBkZXNjcmlwdGlvbgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCXNlY3Rpb25UZXh0LAotCQkJZGVzY3JpcHRpb24sCi0JCQlFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUgotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4uIEEgc3ViLXBhbmUgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcwotCSAqIGl0cyBjbGllbnQgYW5kIGlzIHRoZSByZXR1cm5lZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0Ci0JICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgc2VjdGlvbidzIGRlc2NyaXB0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiB3YXMgcHJvdmlkZXIKLQkgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBzZWN0aW9uIHRvIGNyZWF0ZQotCSAqIEBwYXJhbSBleHBhbmRlZFN0YXRlSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdGhhdCB3aWxsIGRpY3RhdGUKLQkgKiB3aGVuIHRvIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgc2VjdGlvbgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIENvbXBvc2l0ZSBhZGRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSkgewotCi0JCVNlY3Rpb24gc2VjdGlvbiA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVTZWN0aW9uKGNvbnRhaW5lciwgdHlwZSB8ICgoZGVzY3JpcHRpb24gIT0gbnVsbCkgPyBTZWN0aW9uLkRFU0NSSVBUSU9OIDogU1dULk5VTEwpKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJc2VjdGlvbi5zZXRUZXh0KHNlY3Rpb25UZXh0KTsKLQkJc2VjdGlvbi5tYXJnaW5XaWR0aCAgPSAwOwotCQlzZWN0aW9uLm1hcmdpbkhlaWdodCA9IDA7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQl9Ci0KLQkJQ29tcG9zaXRlIHN1YlBhbmUgPSB0aGlzLmFkZFN1YlBhbmUoc2VjdGlvbik7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KHN1YlBhbmUpOwotCi0JCXJldHVybiBzdWJQYW5lOwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcihmaW5hbCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc2VsZWN0aW9uSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBlLndpZGdldDsKLQkJCQlTdHJpbmdbXSBzZWxlY3RlZEl0ZW1zID0gbGlzdC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoKHNlbGVjdGVkSXRlbXMgPT0gbnVsbCkgfHwgKHNlbGVjdGVkSXRlbXMubGVuZ3RoICE9IDEpKSB7Ci0JCQkJCXNlbGVjdGlvbkhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNlbGVjdGlvbkhvbGRlci5zZXRWYWx1ZShzZWxlY3RlZEl0ZW1zWzBdKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGF5b3V0IHJlc3BvbnNpYmxlIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHNwYWNlciBjcmVhdGVkCi0JICogZm9yIHRoZSByaWdodCBjb250cm9sIHdoZW4gbm9uZSB3YXMgZ2l2ZW4uIFRoZSBzcGFjZXIgaGVscHMgdG8gYWxpZ24gYWxsCi0JICogdGhlIHJpZ2h0IGNvbnRyb2xzLgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgTGF5b3V0IGJ1aWxkU3BhY2VyTGF5b3V0KCkgewotCQlyZXR1cm4gbmV3IExheW91dCgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoSGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0SGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQotCQkJCXJldHVybiBuZXcgUG9pbnQod2lkdGhIaW50LCBoZWlnaHRIaW50KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSkgY29tcG9zaXRlLmdldExheW91dERhdGEoKTsKLQkJCQljb21wb3NpdGUuc2V0Qm91bmRzKDAsIDAsIGRhdGEud2lkdGhIaW50LCBkYXRhLmhlaWdodEhpbnQpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlQYW5lLnRoaXMuc3ViamVjdENoYW5nZWQoKFQpIGUuZ2V0T2xkVmFsdWUoKSwgKFQpIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRTdWJQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIHRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRvcE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgYXQgdGhlIHRvcCBvZiB0aGUgcGFuZQotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZFN1YlBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHRvcE1hcmdpbikgewotCQlyZXR1cm4gdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgdG9wTWFyZ2luLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0b3BNYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIGF0IHRoZSB0b3Agb2YgdGhlIHBhbmUKLQkgKiBAcGFyYW0gbGVmdE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgdG8gdGhlIGxlZnQgb2YgdGhlIHBhbmUKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRTdWJQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcE1hcmdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdE1hcmdpbikgewotCi0JCXJldHVybiB0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCB0b3BNYXJnaW4sIGxlZnRNYXJnaW4sIDAsIDApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUsIHRoZSBuZXcgd2lkZ2V0Ci0JICogd2lsbCBoYXZlIGl0cyBsYXlvdXQgYW5kIGxheW91dCBkYXRhIGFscmVhZHkgaW5pdGlhbGl6ZWQsIHRoZSBsYXlvdXQgd2lsbAotCSAqIGJlIGEgPGNvZGU+R3JpZExheW91dDwvY29kZT4gd2l0aCAxIGNvbHVtbi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdG9wTWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCBhdCB0aGUgdG9wIG9mIHRoZSBwYW5lCi0JICogQHBhcmFtIGxlZnRNYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIHRvIHRoZSBsZWZ0IG9mIHRoZSBwYW5lCi0JICogQHBhcmFtIGJvdHRvbU1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFuZQotCSAqIEBwYXJhbSByaWdodE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgdG8gdGhlIHJpZ2h0IG9mIHRoZSBwYW5lCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkU3ViUGFuZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3BNYXJnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnRNYXJnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJvdHRvbU1hcmdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmlnaHRNYXJnaW4pIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRTdWJQYW5lKAotCQkJY29udGFpbmVyLAotCQkJMSwKLQkJCXRvcE1hcmdpbiwKLQkJCWxlZnRNYXJnaW4sCi0JCQlib3R0b21NYXJnaW4sCi0JCQlyaWdodE1hcmdpbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZSwgdGhlIG5ldyB3aWRnZXQKLQkgKiB3aWxsIGhhdmUgaXRzIGxheW91dCBhbmQgbGF5b3V0IGRhdGEgYWxyZWFkeSBpbml0aWFsaXplZCwgdGhlIGxheW91dCB3aWxsCi0JICogYmUgYSA8Y29kZT5HcmlkTGF5b3V0PC9jb2RlPiB3aXRoIDEgY29sdW1uLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0b3BNYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIGF0IHRoZSB0b3Agb2YgdGhlIHBhbmUKLQkgKiBAcGFyYW0gbGVmdE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgdG8gdGhlIGxlZnQgb2YgdGhlIHBhbmUKLQkgKiBAcGFyYW0gYm90dG9tTWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCBhdCB0aGUgYm90dG9tIG9mIHRoZSBwYW5lCi0JICogQHBhcmFtIHJpZ2h0TWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCB0byB0aGUgcmlnaHQgb2YgdGhlIHBhbmUKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRTdWJQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbHVtbkNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3BNYXJnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnRNYXJnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJvdHRvbU1hcmdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmlnaHRNYXJnaW4pIHsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KGNvbHVtbkNvdW50LCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCAgICA9IHRvcE1hcmdpbjsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgICA9IGxlZnRNYXJnaW47Ci0JCWxheW91dC5tYXJnaW5Cb3R0b20gPSBib3R0b21NYXJnaW47Ci0JCWxheW91dC5tYXJnaW5SaWdodCAgPSByaWdodE1hcmdpbjsKLQotCQljb250YWluZXIgPSB0aGlzLmFkZFBhbmUoY29udGFpbmVyLCBsYXlvdXQpOwotCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCB3aGljaCBjYW4gYmUgdHlwZWQgY2FzdCBkaXJlY3RseSBhcyBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkU3ViU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCkgewotCi0JCXJldHVybiB0aGlzLmFkZENvbGxhcHNpYmxlU3ViU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCXNlY3Rpb25UZXh0LAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB0YWJsZS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gc3R5bGUgVGhlIHN0eWxlIHRvIGFwcGx5IHRvIHRoZSB0YWJsZQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0YWJsZSBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGhlbHAgSUQgaXMgcmVxdWlyZWQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRhYmxlPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUYWJsZSBhZGRUYWJsZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBhZGRVbm1hbmFnZWRUYWJsZShjb250YWluZXIsIHN0eWxlLCBoZWxwSWQpOwotCQl0aGlzLm1hbmFnZVdpZGdldCh0YWJsZSk7Ci0KLQkJcmV0dXJuIHRhYmxlOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCB0YWJsZS4gIFVubWFuYWdlZCBtZWFucyB0aGF0IHRoaXMgUGFuZSB3aWxsCi0JICogbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LiAgVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUKLQkgKiBpdCB3aXRoIGl0cyBvd24gUGFuZUVuYWJsZXIgb3IgQ29udHJvbEVuYWJsZXIuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHN0eWxlIFRoZSBzdHlsZSB0byBhcHBseSB0byB0aGUgdGFibGUKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgdGFibGUgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBoZWxwIElEIGlzIHJlcXVpcmVkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UYWJsZTwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGFibGUgYWRkVW5tYW5hZ2VkVGFibGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVRhYmxlIHRhYmxlID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVRhYmxlKGNvbnRhaW5lciwgc3R5bGUpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgICA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gdGFibGUuZ2V0SXRlbUhlaWdodCgpICogNDsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0YWJsZSwgaGVscElkKTsKLQkJfQotCi0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRhYmxlLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0YWJsZSBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGhlbHAgSUQgaXMgcmVxdWlyZWQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRhYmxlPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUYWJsZSBhZGRUYWJsZShDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkVGFibGUoCi0JCQljb250YWluZXIsCi0JCQlTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEksCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCB0YWJsZS4gIFVubWFuYWdlZCBtZWFucyB0aGF0IHRoaXMgUGFuZSB3aWxsCi0JICogbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LiAgVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUKLQkgKiBpdCB3aXRoIGl0cyBvd24gUGFuZUVuYWJsZXIgb3IgQ29udHJvbEVuYWJsZXIuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHRhYmxlIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaGVscCBJRCBpcyByZXF1aXJlZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGFibGU8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRhYmxlIGFkZFVubWFuYWdlZFRhYmxlKENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRVbm1hbmFnZWRUYWJsZSgKLQkJCWNvbnRhaW5lciwKLQkJCVNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWFuYWdlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRVbm1hbmFnZWRUZXh0KGNvbnRhaW5lcik7Ci0JCXRoaXMubWFuYWdlV2lkZ2V0KHRleHQpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQuICBVbm1hbmFnZWQgbWVhbnMKLQkgKiB0aGF0IHRoaXMgUGFuZSB3aWxsIG5vdCBoYW5kbGUgdGhlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldC4KLQkgKiBUaGUgb3duaW5nIG9iamVjdCB3aWxsIGhhbmRsZSBpdCB3aXRoIGl0cyBvd24gUGFuZUVuYWJsZXIgb3IgQ29udHJvbEVuYWJsZXIuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIFRleHQgYWRkVW5tYW5hZ2VkVGV4dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCVRleHQgdGV4dCA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVUZXh0KGNvbnRhaW5lcik7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZXRGaWVsZEdyaWREYXRhKCkpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgdGV4dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRUZXh0KGNvbnRhaW5lcik7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0ZXh0LCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bm1hbmFnZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0LiAgVW5tYW5hZ2VkIG1lYW5zCi0JICogdGhhdCB0aGlzIFBhbmUgd2lsbCBub3QgaGFuZGxlIHRoZSBlbmFibGluZy9kaXNhYmxpbmcgb2YgdGhpcyB3aWRnZXQuCi0JICogVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUgaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIG9yIENvbnRyb2xFbmFibGVyLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0ZXh0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIFRleHQgYWRkVW5tYW5hZ2VkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRVbm1hbmFnZWRUZXh0KGNvbnRhaW5lcik7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0ZXh0LCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkVGV4dChjb250YWluZXIsIHRleHRIb2xkZXIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0ZXh0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRUZXh0KGNvbnRhaW5lciwgaGVscElkKTsKLQkJU1dUVG9vbHMuYmluZCh0ZXh0SG9sZGVyLCB0ZXh0KTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRUZXh0KAotCQkJQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkJCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCQkJU3RyaW5nIGhlbHBJZCwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwKLQkpIHsKLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRVbm1hbmFnZWRUZXh0KGNvbnRhaW5lciwgdGV4dEhvbGRlciwgaGVscElkKTsKLQkJdGhpcy5jb250cm9sRW5hYmxlZFN0YXRlKGVuYWJsZWRNb2RlbCwgdGV4dCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5tYW5hZ2VkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldC4gIFVubWFuYWdlZCBtZWFucwotCSAqIHRoYXQgdGhpcyBQYW5lIHdpbGwgbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LgotCSAqIFRoZSBvd25pbmcgb2JqZWN0IHdpbGwgaGFuZGxlIGl0IHdpdGggaXRzIG93biBQYW5lRW5hYmxlciBvciBDb250cm9sRW5hYmxlci4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgdGV4dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBUZXh0IGFkZFVubWFuYWdlZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLmFkZFVubWFuYWdlZFRleHQoY29udGFpbmVyLCBoZWxwSWQpOwotCQlTV1RUb29scy5iaW5kKHRleHRIb2xkZXIsIHRleHQpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHdpdGggYSB0aXRsZWQgYm9yZGVyLgotCSAqCi0JICogQHBhcmFtIHRpdGxlIFRoZSB0ZXh0IG9mIHRoZSB0aXRsZWQgYm9yZGVyCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB3aXRoIGEgdGl0bGVkIGJvcmRlcgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBHcm91cCBhZGRUaXRsZWRHcm91cChDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgdGl0bGUpIHsKLQkJcmV0dXJuIHRoaXMuYWRkVGl0bGVkR3JvdXAoY29udGFpbmVyLCB0aXRsZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgd2l0aCBhIHRpdGxlZCBib3JkZXIuCi0JICoKLQkgKiBAcGFyYW0gdGl0bGUgVGhlIHRleHQgb2YgdGhlIHRpdGxlZCBib3JkZXIKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGdyb3VwCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHdpdGggYSB0aXRsZWQgYm9yZGVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEdyb3VwIGFkZFRpdGxlZEdyb3VwKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIGFkZFRpdGxlZEdyb3VwKGNvbnRhaW5lciwgdGl0bGUsIDEsIGhlbHBJZCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgd2l0aCBhIHRpdGxlZCBib3JkZXIuCi0JICoKLQkgKiBAcGFyYW0gdGl0bGUgVGhlIHRleHQgb2YgdGhlIHRpdGxlZCBib3JkZXIKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGdyb3VwCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHdpdGggYSB0aXRsZWQgYm9yZGVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEdyb3VwIGFkZFRpdGxlZEdyb3VwKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sdW1uQ291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJR3JvdXAgZ3JvdXAgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlR3JvdXAoY29udGFpbmVyLCB0aXRsZSk7Ci0JCS8vbWFuYWdlV2lkZ2V0KGdyb3VwKTsgVE9ETyB1bnN1cmUgaWYgSSB3YW50IHRvIG1hbmFnZSBncm91cHMsCi0JCS8vYWxzbyBzaG91bGQgcHJvYmFibHkgcmVuYW1lIHRoaXMgYWRkVW5tYW5hZ2VkVGl0bGVkUGFuZQotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KGNvbHVtbkNvdW50LCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCAgICA9IDU7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ICAgPSA1OwotCQlsYXlvdXQubWFyZ2luQm90dG9tID0gNTsKLQkJbGF5b3V0Lm1hcmdpblJpZ2h0ICA9IDU7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCi0JCWlmIChoZWxwSWQgIT0gbnVsbCkgewotCQkJZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIGhlbHBJZCk7Ci0JCX0KLQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bm1hbmFnZWQgbmV3IHRvZ2dsZSBidXR0b24gKHJhZGlvIGJ1dHRvbiBvciBjaGVjayBib3gpLgotCSAqIFVubWFuYWdlZCBtZWFucyAgdGhhdCB0aGlzIFBhbmUgd2lsbCBub3QgaGFuZGxlIHRoZSBlbmFibGluZy9kaXNhYmxpbmcKLQkgKiBvZiB0aGlzIHdpZGdldC4gVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUgaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyCi0JICogb3IgQ29udHJvbEVuYWJsZXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3Rpb24gc3RhdGUKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgYnV0dG9uCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBCdXR0b24gYWRkVW5tYW5hZ2VkVG9nZ2xlQnV0dG9uKAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFN0cmluZyBidXR0b25UZXh0LAotCSAgICAgICAgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgU3RyaW5nIGhlbHBJZCwKLQkgICAgICAgIGludCB0b2dnbGVCdXR0b25UeXBlKSB7Ci0KLQkJQnV0dG9uIGJ1dHRvbjsKLQotCQlpZiAodG9nZ2xlQnV0dG9uVHlwZSA9PSBTV1QuUFVTSCkgewotCQkJYnV0dG9uID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVB1c2hCdXR0b24ocGFyZW50LCBidXR0b25UZXh0KTsKLQkJfQotCQllbHNlIGlmICh0b2dnbGVCdXR0b25UeXBlID09IFNXVC5SQURJTykgewotCQkJYnV0dG9uID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVJhZGlvQnV0dG9uKHBhcmVudCwgYnV0dG9uVGV4dCk7Ci0JCX0KLQkJZWxzZSBpZiAodG9nZ2xlQnV0dG9uVHlwZSA9PSBTV1QuQ0hFQ0spIHsKLQkJCWJ1dHRvbiA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVDaGVja0JveChwYXJlbnQsIGJ1dHRvblRleHQpOwotCQl9Ci0JCWVsc2UgewotCQkJYnV0dG9uID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUJ1dHRvbihwYXJlbnQsIGJ1dHRvblRleHQpOwotCQl9Ci0KLQkJYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQlTV1RUb29scy5iaW5kKGJvb2xlYW5Ib2xkZXIsIGJ1dHRvbik7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscChidXR0b24sIGhlbHBJZCk7Ci0JCX0KLQotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdG9nZ2xlIGJ1dHRvbiAocmFkaW8gYnV0dG9uIG9yIGNoZWNrIGJveCkgdXNpbmcgdGhlIGdpdmVuCi0JICogaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3Rpb24gc3RhdGUKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgYnV0dG9uCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBCdXR0b24gYWRkVG9nZ2xlQnV0dG9uKAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFN0cmluZyBidXR0b25UZXh0LAotCSAgICAgICAgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgU3RyaW5nIGhlbHBJZCwKLQkgICAgICAgIGludCB0b2dnbGVCdXR0b25UeXBlKSB7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IGFkZFVubWFuYWdlZFRvZ2dsZUJ1dHRvbigKLQkJCQlwYXJlbnQsCi0JCQkJYnV0dG9uVGV4dCwKLQkJCQlib29sZWFuSG9sZGVyLAotCQkJCWhlbHBJZCwKLQkJCQl0b2dnbGVCdXR0b25UeXBlKTsKLQkJdGhpcy5tYW5hZ2VXaWRnZXQoYnV0dG9uKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNoZWNrIGJveCB0aGF0IGNhbiBoYXZlIDMgc2VsZWN0aW9uIHN0YXRlcyAoc2VsZWN0ZWQsCi0JICogdW5zZWxlY3RlZCBhbmQgcGFydGlhbGx5IHNlbGVjdGVkLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB2YWx1ZSB3aGVyZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIG1lYW5zIHBhcnRpYWxseSBzZWxlY3RlZAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBjaGVjayBib3gKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRyaVN0YXRlQ2hlY2tCb3g8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyaVN0YXRlQ2hlY2tCb3ggYWRkVHJpU3RhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVHJpU3RhdGVDaGVja0JveCBjaGVja0JveCA9IG5ldyBUcmlTdGF0ZUNoZWNrQm94KAotCQkJcGFyZW50LAotCQkJdGV4dCwKLQkJCXRoaXMuZ2V0V2lkZ2V0RmFjdG9yeSgpCi0JCSk7Ci0KLQkJdGhpcy5tYW5hZ2VXaWRnZXQoY2hlY2tCb3guZ2V0Q2hlY2tCb3goKSk7Ci0KLQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCWJvb2xlYW5Ib2xkZXIsCi0JCQljaGVja0JveAotCQkpOwotCi0JCWlmIChoZWxwSWQgIT0gbnVsbCkgewotCQkJZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY2hlY2tCb3guZ2V0Q2hlY2tCb3goKSwgaGVscElkKTsKLQkJfQotCi0JCXJldHVybiBjaGVja0JveDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNoZWNrIGJveCB0aGF0IGNhbiBoYXZlIDMgc2VsZWN0aW9uIHN0YXRlcyAoc2VsZWN0ZWQsCi0JICogdW5zZWxlY3RlZCBhbmQgcGFydGlhbGx5IHNlbGVjdGVkLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB2YWx1ZSB3aGVyZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIG1lYW5zIHBhcnRpYWxseSBzZWxlY3RlZAotCSAqIEBwYXJhbSBzdHJpbmdIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3RyaW5nIHRvIHB1dCBpbiBwYXJlbnRoZXNpcyBhZnRlcgotCSAqIHRoZSBjaGVjayBib3gncyB0ZXh0IHdoZW4gaXQgaXMgcGFydGlhbGx5IHNlbGVjdGVkCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGNoZWNrIGJveAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VHJpU3RhdGVDaGVja0JveDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVHJpU3RhdGVDaGVja0JveCBhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc3RyaW5nSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUcmlTdGF0ZUNoZWNrQm94IGNoZWNrQm94ID0gdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94KAotCQkJcGFyZW50LAotCQkJdGV4dCwKLQkJCWJvb2xlYW5Ib2xkZXIsCi0JCQloZWxwSWQKLQkJKTsKLQotCQluZXcgTGFiZWxlZENvbnRyb2xVcGRhdGVyKAotCQkJbmV3IExhYmVsZWRCdXR0b24oY2hlY2tCb3guZ2V0Q2hlY2tCb3goKSksCi0JCQlzdHJpbmdIb2xkZXIKLQkJKTsKLQotCQlyZXR1cm4gY2hlY2tCb3g7Ci0JfQotCi0JLyoqCi0JICogUmVxdWVzdHMgdGhpcyBwYW5lIHRvIHBvcHVsYXRlIGl0cyB3aWRnZXRzIHdpdGggdGhlIHN1YmplY3QncyB2YWx1ZXMuCi0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQl0aGlzLmxvZyhUcmFjaW5nLlVJX0xBWU9VVCwgIiAgIC0+ZG9Qb3B1bGF0ZSgpIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbnRyb2xFbmFibGVkU3RhdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgQ29udHJvbC4uLiBjb250cm9scykgewotCQl0aGlzLmNvbnRyb2xFbmFibGVkU3RhdGVfKHRoaXMud3JhcEVuYWJsZWRNb2RlbChib29sZWFuTW9kZWwpLCBjb250cm9scyk7Ci0JfQotCi0JLyoqCi0JICogQXNzdW1lIHRoZSAiZW5hYmxlZCIgbW9kZWxzIGNhbiByZXR1cm4gbnVsbCAod2hpY2ggaXMgdHlwaWNhbCB3aXRoIGFzcGVjdAotCSAqIGFkYXB0ZXJzIGV0Yy4pLgotCSAqLwotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHdyYXBFbmFibGVkTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIEJvb2xlYW4+KGJvb2xlYW5Nb2RlbCwgTm9uTnVsbEJvb2xlYW5UcmFuc2Zvcm1lci5GQUxTRSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbnRyb2xFbmFibGVkU3RhdGVfKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIENvbnRyb2wuLi4gY29udHJvbHMpIHsKLQkJU1dUVG9vbHMuY29udHJvbEVuYWJsZWRTdGF0ZSh0aGlzLmFuZEVuYWJsZWRNb2RlbChib29sZWFuTW9kZWwpLCBjb250cm9scyk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZ2V0Q29tYmluZWRFbmFibGVkTW9kZWwoKSB7Ci0JCXJldHVybiAodGhpcy5jb21iaW5lZEVuYWJsZWRNb2RlbCAhPSBudWxsKSA/IHRoaXMuY29tYmluZWRFbmFibGVkTW9kZWwgOiB0aGlzLmJhc2VFbmFibGVkTW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGdldENvbWJpbmVkRW5hYmxlbWVudCgpIHsKLQkJQm9vbGVhbiBlbmFibGVkID0gZ2V0Q29tYmluZWRFbmFibGVkTW9kZWwoKS5nZXRWYWx1ZSgpOwotCQlyZXR1cm4gKGVuYWJsZWQgPT0gbnVsbCkgPyB0cnVlIDogZW5hYmxlZC5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBhbmRFbmFibGVkTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCkgewotCQlyZXR1cm4gQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbC5hbmQoZ2V0Q29tYmluZWRFbmFibGVkTW9kZWwoKSwgYm9vbGVhbk1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cm9sbGVyRW5hYmxlbWVudENoYW5nZWQoKSB7Ci0JCWVuYWJsZVdpZGdldHNfKGdldENvbWJpbmVkRW5hYmxlbWVudCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBlbmFibGVtZW50IHN0YXRlIG9mIHRoZSB3aWRnZXRzIG9mIHRoaXMgcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBlbmFibGVkIDxjb2RlPnRydWU8L2NvZGU+IHRvIGVuYWJsZSB0aGUgd2lkZ2V0cyBvciA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiB0byBkaXNhYmxlIHRoZW0KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCQl0aGlzLmJhc2VFbmFibGVkTW9kZWwuc2V0VmFsdWUoQm9vbGVhbi52YWx1ZU9mKGVuYWJsZWQpKTsKLQkJZW5hYmxlV2lkZ2V0c18oZ2V0Q29tYmluZWRFbmFibGVtZW50KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBlbmFibGVXaWRnZXRzXyhib29sZWFuIGVuYWJsZWQpIHsKLQkJaWYgKCEgdGhpcy5jb250YWluZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQlmb3IgKENvbnRyb2wgY29udHJvbCA6IHRoaXMubWFuYWdlZFdpZGdldHMpIHsKLQkJCQljb250cm9sLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQl9Ci0KLQkJCWZvciAoUGFuZTw/PiBzdWJQYW5lIDogdGhpcy5tYW5hZ2VkU3ViUGFuZXMpIHsKLQkJCQlzdWJQYW5lLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5nYWdlU3ViamVjdEhvbGRlcigpIHsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN1YmplY3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogZW5nYWdlIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycyhUIHN1YmplY3QpIHsKLQkJaWYgKHN1YmplY3QgIT0gbnVsbCkgewotCQkJdGhpcy5lbmdhZ2VMaXN0ZW5lcnNfKHN1YmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogc3BlY2lmaWVkIHN1YmplY3QgaXMgbm90IG51bGwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnNfKFQgc3ViamVjdCkgewotCQl0aGlzLmxvZyhUcmFjaW5nLlVJX0xBWU9VVCwgIiAgIC0+ZW5nYWdlTGlzdGVuZXJzXygiICsgc3ViamVjdCArICcpJyk7Ci0KLQkJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5nZXRQcm9wZXJ0eU5hbWVzKCkpIHsKLQkJCXN1YmplY3QuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMuYXNwZWN0Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZGlzZW5nYWdlIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycyhUIHN1YmplY3QpIHsKLQkJaWYgKHN1YmplY3QgIT0gbnVsbCkgewotCQkJdGhpcy5kaXNlbmdhZ2VMaXN0ZW5lcnNfKHN1YmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogc3BlY2lmaWVkIHN1YmplY3QgaXMgbm90IG51bGwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnNfKFQgc3ViamVjdCkgewotCQl0aGlzLmxvZyhUcmFjaW5nLlVJX0xBWU9VVCwgIiAgIC0+ZGlzZW5nYWdlTGlzdGVuZXJzXygiICsgc3ViamVjdCArICcpJyk7Ci0KLQkJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5nZXRQcm9wZXJ0eU5hbWVzKCkpIHsKLQkJCXN1YmplY3QucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMuYXNwZWN0Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc2VuZ2FnZVN1YmplY3RIb2xkZXIoKSB7Ci0JCXRoaXMuc3ViamVjdEhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zdWJqZWN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1haW4gPGNvZGU+Q29udHJvbDwvY29kZT4gb2YgdGhpcyBwYW5lLgotCSAqCi0JICogQHJldHVybiBUaGUgbWFpbiBjb250YWluZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdWJqZWN0IGhvbGRlciB1c2VkIGJ5IHRoaXMgcGFuZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdAotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxUPiBnZXRTdWJqZWN0SG9sZGVyKCkgewotCQlyZXR1cm4gdGhpcy5zdWJqZWN0SG9sZGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSB3aWRnZXRzLgotCSAqCi0JICogQHJldHVybiBUaGUgZmFjdG9yeSB1c2VkIGJ5IHRoaXMgcGFuZSB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgV2lkZ2V0RmFjdG9yeSBnZXRXaWRnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gdGhpcy53aWRnZXRGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1hcmdpbiB0YWtlbiBieSBhIGdyb3VwIGJveCwgd2hpY2ggaXMgdGhlIG51bWJlciBvZiBwaXhlbCB0aGUKLQkgKiBncm91cCBib3ggYm9yZGVyIGFuZCBpdHMgbWFyZ2luIHRha2VzIGJlZm9yZSBkaXNwbGF5aW5nIGl0cyB3aWRnZXRzIHBsdXMKLQkgKiA1IHBpeGVscyBzaW5jZSB0aGUgd2lkZ2V0cyBpbnNpZGUgb2YgdGhlIGdyb3VwIGJveCBhbmQgdGhlIGJvcmRlciBzaG91bGQKLQkgKiBoYXZlIHRoYXQgZXh0cmEgNSBwaXhlbHMuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSB3aWR0aCB0YWtlbiBieSB0aGUgZ3JvdXAgYm94IGJvcmRlciB3aXRoIGl0cyBtYXJnaW4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgaW50IGdldEdyb3VwQm94TWFyZ2luKCkgewotCQlHcm91cCBncm91cCA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVHcm91cChTV1RVdGlsLmdldFNoZWxsKCksICIiKTsKLQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBncm91cC5nZXRDbGllbnRBcmVhKCk7Ci0JCWdyb3VwLmRpc3Bvc2UoKTsKLQkJcmV0dXJuIGNsaWVudEFyZWEueCArIDU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGVscHMgc3lzdGVtLgotCSAqCi0JICogQHJldHVybiBUaGUgcGxhdGZvcm0ncyBoZWxwIHN5c3RlbQotCSAqCi0JICogQGNhdGVnb3J5IEhlbHBlcgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJV29ya2JlbmNoSGVscFN5c3RlbSBnZXRIZWxwU3lzdGVtKCkgewotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIKLQkgKgotCSAqIEByZXR1cm4KLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzUG9wdWxhdGluZygpIHsKLQkJcmV0dXJuIHRoaXMucG9wdWxhdGluZzsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBnaXZlbiBtZXNzYWdlIGlmIHRoZSA8Y29kZT5UcmFjaW5nLkRFQlVHX0xBWU9VVDwvY29kZT4gaXMgZW5hYmxlZC4KLQkgKgotCSAqIEBwYXJhbSBmbGFnCi0JICogQHBhcmFtIG1lc3NhZ2UgVGhlIGxvZ2dpbmcgbWVzc2FnZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgZmxhZywgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKGZsYWcuZXF1YWxzKFRyYWNpbmcuVUlfTEFZT1VUKSAmJiBUcmFjaW5nLmJvb2xlYW5EZWJ1Z09wdGlvbihUcmFjaW5nLlVJX0xBWU9VVCkpIHsKLQkJCXRoaXMubG9nKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7Ci0JCUNsYXNzPD8+IHRoaXNDbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IHRoaXNDbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0KLQkJaWYgKHRoaXNDbGFzcy5pc0Fub255bW91c0NsYXNzKCkpIHsKLQkJCWNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NOYW1lLmluZGV4T2YoJyQnKSk7Ci0JCQljbGFzc05hbWUgKz0gIi0+IiArIHRoaXNDbGFzcy5nZXRTdXBlcmNsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCQl9Ci0KLQkJVHJhY2luZy5sb2coY2xhc3NOYW1lICsgIjogIiArIG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgcGFuZSB0byBwb3B1bGF0ZSBpdHNlbGYgdXNpbmcgdGhlIHN1YmplY3QncyBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZSgpIHsKLQkJaWYgKCF0aGlzLmNvbnRhaW5lci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMubG9nKFRyYWNpbmcuVUlfTEFZT1VULCAicG9wdWxhdGUoKSIpOwotCQkJdGhpcy5yZXBvcHVsYXRlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgc3ViamVjdCdzIHByb3BlcnR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZQotCSAqIGhhcyBjaGFuZ2VkLgotCSAqCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgcHJvcGVydHkgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5IGNoYW5nZQotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIG5hbWVzIHRvIGxpc3RlbiBmb3IgcHJvcGVydGllcyBjaGFuZ2luZyBmcm9tIHRoZQotCSAqIHN1YmplY3QuCi0JICoKLQkgKiBAcmV0dXJuIEEgbm9uLTxjb2RlPm51bGw8L2NvZGU+IGxpc3Qgb2YgcHJvcGVydHkgbmFtZXMKLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gcHJvcGVydHlOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlhZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBwYW5lJ3Mgd2lkZ2V0cyAodGhvc2UgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQgd2l0aAotCSAqIGl0cyBsZWZ0IDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPikgZnJvbSB0aGlzIHBhbmUncyBsZWZ0Ci0JICogPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+IHNvIHRoYXQgdGhlaXIgd2lkdGggd2lsbCBubyBsb25nZXIgYmUgYWRqdXN0ZWQKLQkgKiB3aXRoIHRoZSB3aWR0aCBvZiB0aGUgd2lkZXN0IHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIGNvbnRhaW5pbmcgdGhlIHdpZGdldHMgdG8gcmVtb3ZlCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVtb3ZlQWxpZ25MZWZ0KFBhbmU8Pz4gcGFuZSkgewotCQl0aGlzLmxlZnRDb250cm9sQWxpZ25lci5yZW1vdmUocGFuZS5sZWZ0Q29udHJvbEFsaWduZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGNvbnRyb2wgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiB3aWRnZXRzIHRoYXQgYXJlIGFsaWduZWQKLQkgKiB0byBoYXZlIHRoZSBzYW1lIHdpZHRoIHdoZW4gdGhleSBhcmUgc2hvd24gdG8gdGhlIGxlZnQgc2lkZSBvZiB0aGUgMwotCSAqIHdpZGdldCBjb2x1bXMuCi0JICoKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSB0byByZW1vdmUsIGl0cyB3aWR0aCB3aWxsIG5vIGxvbmdlciBiZQotCSAqIGFqdXN0ZWQgdG8gYmUgdGhlIHdpZHRoIG9mIHRoZSBsb25nZXN0IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlbW92ZUFsaWduTGVmdChDb250cm9sIGNvbnRyb2wpIHsKLQkJdGhpcy5sZWZ0Q29udHJvbEFsaWduZXIucmVtb3ZlKGNvbnRyb2wpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIHBhbmUncyB3aWRnZXRzICh0aG9zZSB0aGF0IHdlcmUgcmVnaXN0ZXJlZCB3aXRoCi0JICogaXRzIHJpZ2h0IDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPikgZnJvbSB0aGlzIHBhbmUncyByaWdodAotCSAqIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiBzbyB0aGF0IHRoZWlyIHdpZHRoIHdpbGwgbm8gbG9uZ2VyIGJlIGFkanVzdGVkCi0JICogd2l0aCB0aGUgd2lkdGggb2YgdGhlIHdpZGVzdCB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSBjb250YWluaW5nIHRoZSB3aWRnZXRzIHRvIHJlbW92ZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlbW92ZUFsaWduUmlnaHQoUGFuZTw/PiBwYW5lKSB7Ci0JCXRoaXMucmlnaHRDb250cm9sQWxpZ25lci5yZW1vdmUocGFuZS5yaWdodENvbnRyb2xBbGlnbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBjb250cm9sIGZyb20gdGhlIGNvbGxlY3Rpb24gb2Ygd2lkZ2V0cyB0aGF0IGFyZSBhbGlnbmVkCi0JICogdG8gaGF2ZSB0aGUgc2FtZSB3aWR0aCB3aGVuIHRoZXkgYXJlIHNob3duIHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSAzCi0JICogd2lkZ2V0IGNvbHVtcy4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIHRvIHJlbW92ZSwgaXRzIHdpZHRoIHdpbGwgbm8gbG9uZ2VyIGJlCi0JICogYWp1c3RlZCB0byBiZSB0aGUgd2lkdGggb2YgdGhlIGxvbmdlc3Qgd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVtb3ZlQWxpZ25SaWdodChDb250cm9sIGNvbnRyb2wpIHsKLQkJdGhpcy5yaWdodENvbnRyb2xBbGlnbmVyLnJlbW92ZShjb250cm9sKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBwYW5lJ3MgY29udHJvbHMgKHRob3NlIHRoYXQgd2VyZSByZWdpc3RlcmVkIGZvcgotCSAqIGFsaWdubWVudCkgZnJvbSB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSBjb250YWluaW5nIHRoZSB3aWRnZXRzIHRoYXQgbm8gbG9uZ2VyCi0JICogcmVxdWlyZXMgdGhlaXIgd2lkdGggYWRqdXN0ZWQgd2l0aCB0aGUgd2lkdGggb2YgdGhlIGxvbmdlc3Qgd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVtb3ZlUGFuZUZvckFsaWdubWVudChQYW5lPD8+IHBhbmUpIHsKLQkJcmVtb3ZlQWxpZ25MZWZ0KHBhbmUpOwotCQlyZW1vdmVBbGlnblJpZ2h0KHBhbmUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCAocGVyaGFwcyBpbnRlcm5hbGx5KSB3aGVuIHRoaXMgbmVlZHMgdG8gcmVwb3B1bGF0ZQotCSAqIGJ1dCB0aGUgb2JqZWN0IG9mIGludGVyZXN0IGhhcyBub3QgY2hhbmdlZC4KLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlcG9wdWxhdGUoKSB7Ci0KLQkJdGhpcy5sb2coVHJhY2luZy5VSV9MQVlPVVQsICIgICAtPnJlcG9wdWxhdGUoKSIpOwotCi0JCS8vIFBvcHVsYXRlIHRoaXMgcGFuZQotCQl0cnkgewotCQkJc2V0UG9wdWxhdGluZyh0cnVlKTsKLQkJCWRvUG9wdWxhdGUoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQl9Ci0KLQkJLy8gQXNrIHRoZSBzdWItcGFuZXMgdG8gcmVwb3B1bGF0ZSB0aGVtc2VsdmVzCi0JCWZvciAoUGFuZTw/PiBzdWJQYW5lIDogdGhpcy5zdWJQYW5lcykgewotCQkJc3ViUGFuZS5yZXBvcHVsYXRlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbnRlcm5hbCBmbGFnIHRoYXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgcGFuZSBpcyBiZWluZwotCSAqIHBvcHVsYXRlZCBvciBub3QuIER1cmluZyBwb3B1bGF0aW9uLCBpdCBpcyByZXF1aXJlZCB0byBub3QgdXBkYXRlIHRoZQotCSAqIHdpZGdldHMgd2hlbiB0aGUgbW9kZWwgaXMgdXBkYXRlZCBub3IgdG8gdXBkYXRlIHRoZSBtb2RlbCB3aGVuIHRoZSB3aWRnZXRzCi0JICogYXJlIGJlaW5nIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbCdzIHZhbHVlcy4KLQkgKgotCSAqIEBwYXJhbSBwb3B1bGF0aW5nCi0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRQb3B1bGF0aW5nKGJvb2xlYW4gcG9wdWxhdGluZykgewotCQl0aGlzLnBvcHVsYXRpbmcgPSBwb3B1bGF0aW5nOwotCX0KLQotCS8qKgotCSAqIEVpdGhlciBzaG93IG9yIGhpZGVzIHRoaXMgcGFuZS4KLQkgKgotCSAqIEBwYXJhbSB2aXNpYmxlIFRoZSBuZXcgdmlzaWJpbGl0eSBzdGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCWlmICghdGhpcy5jb250YWluZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmNvbnRhaW5lci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmVhcmVzdCA8Y29kZT5TaGVsbDwvY29kZT4gZGlzcGxheWluZyB0aGUgbWFpbiB3aWRnZXQgb2YgdGhpcwotCSAqIHBhbmUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBuZWFyZXN0IHdpbmRvdyBkaXNwbGF5aW5nIHRoaXMgcGFuZQotCSAqLwotCXB1YmxpYyBmaW5hbCBTaGVsbCBnZXRTaGVsbCgpIHsKLQkJcmV0dXJuIHRoaXMuY29udGFpbmVyLmdldFNoZWxsKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3ViamVjdCBvZiB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBzdWJqZWN0IGlmIHRoaXMgcGFuZSB3YXMgbm90IGRpc3Bvc2VkOyA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIGl0IHdhcwotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHVibGljIFQgZ2V0U3ViamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuc3ViamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0IGhhcyBjaGFuZ2VkLCBkaXNjb25uZWN0cyBhbnkgbGlzdGVuZXJzIGZyb20gdGhlIG9sZCBzdWJqZWN0Ci0JICogYW5kIGNvbm5lY3RzIHRob3NlIGxpc3RlbmVycyBvbnRvIHRoZSBuZXcgc3ViamVjdC4KLQkgKgotCSAqIEBwYXJhbSBvbGRzdWJqZWN0IFRoZSBvbGQgc3ViamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIHdhcyBzZXQKLQkgKiBAcGFyYW0gbmV3U3ViamVjdCBUaGUgbmV3IHN1YmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBuZWVkcyB0byBiZQotCSAqIHNldAotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc3ViamVjdENoYW5nZWQoVCBvbGRTdWJqZWN0LCBUIG5ld1N1YmplY3QpIHsKLQkJaWYgKCF0aGlzLmNvbnRhaW5lci5pc0Rpc3Bvc2VkKCkpIHsKLQotCQkJdGhpcy5sb2coVHJhY2luZy5VSV9MQVlPVVQsICJzdWJqZWN0Q2hhbmdlZCgpIik7Ci0JCQl0aGlzLmRpc2VuZ2FnZUxpc3RlbmVycyhvbGRTdWJqZWN0KTsKLQotCQkJdGhpcy5yZXBvcHVsYXRlKCk7Ci0KLQkJCXRoaXMuZW5nYWdlTGlzdGVuZXJzKG5ld1N1YmplY3QpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBSZWdpc3RlcnMgYW5vdGhlciA8Y29kZT5QYW5lPC9jb2RlPiB3aXRoIHRoaXMgb25lIHNvIGl0IGNhbgotCSAqIGJlIGF1dG9tYXRpY2FsbHkgbm90aWZpZWQgYWJvdXQgY2VydGFpbiBldmVudHMgc3VjaCBhcyBlbmdhZ2luZyBvcgotCSAqIGRpc2VuZ2FnaW5nIHRoZSBsaXN0ZW5lcnMsIGV0Yy4KLQkgKgotCSAqIEBwYXJhbSBzdWJQYW5lIFRoZSBzdWItcGFuZSB0byByZWdpc3RlcgotCSAqCi0JICogQGNhdGVnb3J5IENvbnRyb2xsZXIKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZWdpc3RlclN1YlBhbmUoUGFuZTw/PiBzdWJQYW5lKSB7Ci0JCXRoaXMuc3ViUGFuZXMuYWRkKHN1YlBhbmUpOwotCX0KLQotCS8qKgotCSAqIFVucmVnaXN0ZXJzIHRoZSBnaXZlbiA8Y29kZT5QYW5lPC9jb2RlPiBmcm9tIHRoaXMgb25lIHNvIGl0Ci0JICogY2FuIG5vIGxvbmdlciBiZSBhdXRvbWF0aWNhbGx5IG5vdGlmaWVkIGFib3V0IGNlcnRhaW4gZXZlbnRzIHN1Y2ggYXMKLQkgKiBlbmdhZ2luZyBvciBkaXNlbmdhZ2luZyB0aGUgbGlzdGVuZXJzLCBldGMuCi0JICoKLQkgKiBAcGFyYW0gc3ViUGFuZSBUaGUgc3ViLXBhbmUgdG8gdW5yZWdpc3RlcgotCSAqCi0JICogQGNhdGVnb3J5IENvbnRyb2xsZXIKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCB1bnJlZ2lzdGVyU3ViUGFuZShQYW5lPD8+IHN1YlBhbmUpIHsKLQkJdGhpcy5zdWJQYW5lcy5yZW1vdmUoc3ViUGFuZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhbmUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoIWlzUG9wdWxhdGluZygpICYmICF0aGlzLmNvbnRhaW5lci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMucG9wdWxhdGluZyA9IHRydWU7Ci0KLQkJCXRyeSB7Ci0JCQkJcHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQl0aGlzLnBvcHVsYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMubG9nKFRyYWNpbmcuVUlfTEFZT1VULCAiZGlzcG9zZSgpIik7Ci0KLQkJLy8gRGlzcG9zZSB0aGlzIHBhbmUKLQkJdGhpcy5kaXNlbmdhZ2VMaXN0ZW5lcnMoZ2V0U3ViamVjdCgpKTsKLQkJdGhpcy5kaXNlbmdhZ2VTdWJqZWN0SG9sZGVyKCk7Ci0KLQkJaWYgKHRoaXMuY29tYmluZWRFbmFibGVkTW9kZWwgIT0gbnVsbCAmJiB0aGlzLmNvbWJpbmVkRW5hYmxlZE1vZGVsTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJdGhpcy5jb21iaW5lZEVuYWJsZWRNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5jb21iaW5lZEVuYWJsZWRNb2RlbExpc3RlbmVyKTsKLQkJfQotCi0JCXRoaXMubGVmdENvbnRyb2xBbGlnbmVyLmRpc3Bvc2UoKTsKLQkJdGhpcy5yaWdodENvbnRyb2xBbGlnbmVyLmRpc3Bvc2UoKTsKLQotCQkvLyBBc2sgdGhlIHN1Yi1wYW5lcyB0byBkaXNwb3NlIHRoZW1zZWx2ZXMKLQkJZm9yIChQYW5lPD8+IHN1YlBhbmUgOiB0aGlzLnN1YlBhbmVzKSB7Ci0JCQlzdWJQYW5lLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9Qcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL1Byb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMzEzZmIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL1Byb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgPGNvZGU+V2lkZ2V0RmFjdG9yeTwvY29kZT4gaXMgcmVzcG9uc2libGUgdG8gY3JlYXRlIHRoZSB3aWRnZXRzIHVzaW5nCi0gKiA8Y29kZT5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTwvY29kZT4gaW4gb3JkZXIgdXNlIHRoZSBmb3JtIHN0eWxlCi0gKiAoZmxhdC1zdHlsZSkgbG9vayBhbmQgZmVlbC4KLSAqCi0gKiBAc2VlIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeQotCWV4dGVuZHMgRm9ybVdpZGdldEZhY3RvcnkKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5PC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkoKSB7Ci0JCXRoaXMobmV3IFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeShUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBHcm91cCBjcmVhdGVHcm91cChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGl0bGUpIHsKLQkJcmV0dXJuIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVHcm91cChwYXJlbnQsIHRpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGdldFdpZGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpIHN1cGVyLmdldFdpZGdldEZhY3RvcnkoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL1RyaVN0YXRlQ2hlY2tCb3guamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9UcmlTdGF0ZUNoZWNrQm94LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNTM1NzAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL1RyaVN0YXRlQ2hlY2tCb3guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyA8Y29kZT5UcmlTdGF0ZUNoZWNrQm94PC9jb2RlPiBjYW4gZGlzcGxheSBvbmUgb2YgdGhyZWUgc3RhdGVzOgotICogdW5jaGVja2VkLCBjaGVja2VkLCBvciBwYXJ0aWFsbHkgY2hlY2tlZC4gSXQgY2FuIGJlIG1vZGlmaWVkIHZpYSBhIG1vdXNlCi0gKiBzZWxlY3Rpb24sIHZpYSBhIGtleWJvYXJkIHNlbGVjdGlvbiwgb3IgcHJvZ3JhbW1hdGljYWxseS4gVGhlIHNlbGVjdGlvbiBzdGF0ZSBpcwotICogcmVwcmVzZW50ZWQgYnkgYSA8Y29kZT5Cb29sZWFuPC9jb2RlPiB2YWx1ZSB3aGVyZSBhIDxjb2RlPm51bGw8L2NvZGU+Ci0gKiB2YWx1ZSBtZWFucyBwYXJ0aWFsbHkgY2hlY2tlZC4KLSAqIDxwPgotICogVGhlIG9yZGVyIG9mIHN0YXRlIGNoYW5nZXMgaXM6IHVuY2hlY2tlZCAtPiBwYXJ0aWFsbHkgY2hlY2tlZCAtPiBjaGVja2VkLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmlTdGF0ZUNoZWNrQm94IHsKLQkvKioKLQkgKiBBIGNoZWNrIGJveCBidXR0b24uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBCdXR0b24gYnV0dG9uOwotCi0JLyoqCi0JICogVGhlIGN1cnJlbnQgc2VsZWN0aW9uIHN0YXRlLgotCSAqLwotCXByaXZhdGUgVHJpU3RhdGUgc3RhdGU7Ci0KLQkvKioKLQkgKiBUaGUgcG9zc2libGUgc2VsZWN0aW9ucy4KLQkgKi8KLQllbnVtIFRyaVN0YXRlIHsKLQkJQ0hFQ0tFRCwKLQkJUEFSVElBTExZX0NIRUNLRUQsCi0JCVVOQ0hFQ0tFRAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VHJpU3RhdGVDaGVja0JveDwvY29kZT4gd2l0aCBubyB0ZXh0LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSBjaGVjayBib3gKLQkgKi8KLQlwdWJsaWMgVHJpU3RhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJdGhpcyhwYXJlbnQsIG51bGwsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VHJpU3RhdGVDaGVja0JveDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQgVGhlIGNoZWNrIGJveCdzIHRleHQKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgY2hlY2sgYm94Ci0JICovCi0JcHVibGljIFRyaVN0YXRlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zdGF0ZSA9IFRyaVN0YXRlLlVOQ0hFQ0tFRDsKLQkJdGhpcy5idXR0b24gPSB3aWRnZXRGYWN0b3J5LmNyZWF0ZUNoZWNrQm94KHBhcmVudCwgdGV4dCk7Ci0JCXRoaXMuYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2Q6IEFkZHMgYSBkaXNwb3NlIGxpc3RlbmVyIHRvIHRoZSBjaGVjayBib3guCi0JICogVGhlIHNvdXJjZSBvZiBhbnkgZXZlbnRzIHNlbnQgdG8gdGhlIGxpc3RlbmVyIHdpbGwgYmUgdGhlIGNoZWNrIGJveCB3aWRnZXQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBkaXNwb3NlTGlzdGVuZXIpIHsKLQkJdGhpcy5idXR0b24uYWRkRGlzcG9zZUxpc3RlbmVyKGRpc3Bvc2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kOiBBZGRzIGEgc2VsZWN0aW9uIGxpc3RlbmVyIHRvIHRoZSBjaGVjayBib3guCi0JICogVGhlIHNvdXJjZSBvZiBhbnkgZXZlbnRzIHNlbnQgdG8gdGhlIGxpc3RlbmVyIHdpbGwgYmUgdGhlIGNoZWNrIGJveCB3aWRnZXQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIpIHsKLQkJdGhpcy5idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJVHJpU3RhdGVDaGVja0JveC50aGlzLmNoZWNrQm94Q2xpY2tlZCgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFRoZSBjaGVjayBib3ggd2FzIGNsaWNrZWQsIGNoYW5nZSB0aGUgdHJpLXN0YXRlIHRvIHRoZSBuZXh0IHZhbHVlIGFuZAotCSAqIHVwZGF0ZSB0aGUgY2hlY2sgYm94J3Mgc3RhdGUuCi0JICovCi0Jdm9pZCBjaGVja0JveENsaWNrZWQoKSB7Ci0JCXRoaXMuc3RhdGUgPSB0aGlzLm5leHRTdGF0ZSgpOwotCQl0aGlzLnVwZGF0ZUNoZWNrQm94KCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhlIGNoZWNrIGJveCB3aWRnZXQuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5idXR0b24uZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPkJ1dHRvbjwvY29kZT4gdXNlZCB0byBzaG93IGEgdHJpLXN0YXRlIGNoZWNrIGJveC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPkJ1dHRvbjwvY29kZT4gdXNlZCB0byBzaG93IGEgdHJpLXN0YXRlIGNoZWNrIGJveAotCSAqLwotCXB1YmxpYyBCdXR0b24gZ2V0Q2hlY2tCb3goKSB7Ci0JCXJldHVybiB0aGlzLmJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGVjayBib3gncyBpbWFnZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGNoZWNrIGJveCdzIGltYWdlLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIHRoaXMuYnV0dG9uLmdldEltYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hlY2sgYm94J3Mgc2VsZWN0aW9uIHN0YXRlLgotCSAqCi0JICogQHJldHVybiBFaXRoZXIgPGNvZGU+dHJ1ZTwvY29kZT4gb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBjaGVja2VkIG9yCi0JICogdW5jaGVja2VkOyBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3IgcGFydGlhbGx5IHNlbGVjdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gKHRoaXMuc3RhdGUgPT0gVHJpU3RhdGUuUEFSVElBTExZX0NIRUNLRUQpID8gbnVsbCA6IEJvb2xlYW4udmFsdWVPZih0aGlzLnN0YXRlID09IFRyaVN0YXRlLkNIRUNLRUQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoZWNrIGJveCdzIHRleHQuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSB0ZXh0IG9mIHRoZSBjaGVjayBib3gKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0aGlzLmJ1dHRvbi5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjaGVjayBib3ggaXMgZGlzcG9zZWQuCi0JICoKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBib3ggaXMgZGlzcG9zZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCXJldHVybiB0aGlzLmJ1dHRvbi5pc0Rpc3Bvc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjaGVjayBib3ggaXMgZW5hYmxlZC4KLQkgKgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIGJveCBpcyBlbmFibGVkOyA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiB0aGlzLmJ1dHRvbi5pc0VuYWJsZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZXh0IHN0YXRlOgotCSAqICAgICBVTkNIRUNLRUQgLT4gUEFSVElBTExZX0NIRUNLRUQKLQkgKiAgICAgUEFSVElBTExZX0NIRUNLRUQgLT4gQ0hFQ0tFRAotCSAqICAgICBDSEVDS0VEIC0+IFVOQ0hFQ0tFRAotCSAqLwotCXByaXZhdGUgVHJpU3RhdGUgbmV4dFN0YXRlKCkgewotCQlzd2l0Y2ggKHRoaXMuc3RhdGUpIHsKLQkJCWNhc2UgVU5DSEVDS0VEOgotCQkJCXJldHVybiBUcmlTdGF0ZS5QQVJUSUFMTFlfQ0hFQ0tFRDsKLQkJCWNhc2UgUEFSVElBTExZX0NIRUNLRUQ6Ci0JCQkJcmV0dXJuIFRyaVN0YXRlLkNIRUNLRUQ7Ci0JCQljYXNlIENIRUNLRUQ6Ci0JCQkJcmV0dXJuIFRyaVN0YXRlLlVOQ0hFQ0tFRDsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIHN0YXRlOiAiICsgdGhpcy5zdGF0ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kOiBSZW1vdmVzIGEgZGlzcG9zZSBsaXN0ZW5lciBmcm9tIHRoZSBjaGVjayBib3guCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBkaXNwb3NlTGlzdGVuZXIpIHsKLQkJdGhpcy5idXR0b24ucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKGRpc3Bvc2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kOiBSZW1vdmVzIGEgc2VsZWN0aW9uIGxpc3RlbmVyIGZyb20gdGhlIGNoZWNrIGJveC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lcikgewotCQl0aGlzLmJ1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlcyB0aGUgY2hlY2sgYm94J3MgZW5hYmxlbWVudCBzdGF0ZS4KLQkgKgotCSAqIEBwYXJhbSBlbmFibGVkIDxjb2RlPnRydWU8L2NvZGU+IHRvIGVuYWJsZSB0aGUgY2hlY2sgYm94IG9yIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIHRvIGRpc2FibGUgaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQl0aGlzLmJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNoZWNrIGJveCdzIGltYWdlLgotCSAqCi0JICogQHBhcmFtIGltYWdlIFRoZSBuZXcgaW1hZ2Ugb2YgdGhlIGNoZWNrIGJveAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIGltYWdlKSB7Ci0JCXRoaXMuYnV0dG9uLnNldEltYWdlKGltYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBjaGVjayBib3gncyBzZWxlY3Rpb24gc3RhdGUuCi0JICoKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIEVpdGhlciA8Y29kZT50cnVlPC9jb2RlPiBvciA8Y29kZT5mYWxzZTwvY29kZT4gZm9yCi0JICogY2hlY2tlZCBhbmQgdW5jaGVja2VkOyBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3IgcGFydGlhbGx5IHNlbGVjdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKEJvb2xlYW4gc2VsZWN0aW9uKSB7Ci0JCVRyaVN0YXRlIG9sZCA9IHRoaXMuc3RhdGU7Ci0JCXRoaXMuc3RhdGUgPSB0aGlzLnN0YXRlRm9yQm9vbGVhbihzZWxlY3Rpb24pOwotCQlpZiAob2xkICE9IHRoaXMuc3RhdGUpIHsKLQkJCXRoaXMudXBkYXRlQ2hlY2tCb3goKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNoZWNrIGJveCdzIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gdGV4dCBUaGUgbmV3IHRleHQgb2YgdGhlIGNoZWNrIGJveAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJdGhpcy5idXR0b24uc2V0VGV4dCh0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0cmktc3RhdGUgY29ycmVzcG9uZGluZyB0byB0aGUgYm9vbGVhbi4KLQkgKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24gVGhlIGJvb2xlYW4gdG8gYmUgY29udmVydGVkIHRvIGEgdHJpLXN0YXRlCi0JICovCi0JcHJpdmF0ZSBUcmlTdGF0ZSBzdGF0ZUZvckJvb2xlYW4oQm9vbGVhbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIChzZWxlY3Rpb24gPT0gbnVsbCkgPyBUcmlTdGF0ZS5QQVJUSUFMTFlfQ0hFQ0tFRCA6Ci0JCQlzZWxlY3Rpb24uYm9vbGVhblZhbHVlKCkgPyBUcmlTdGF0ZS5DSEVDS0VEIDogVHJpU3RhdGUuVU5DSEVDS0VEOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiB0aGUgb2YgdGhlIGNoZWNrIGJveCBiYXNlZCBvbiB0aGUgdHJpLXN0YXRlCi0JICogdmFsdWUuCi0JICovCi0Jdm9pZCB1cGRhdGVDaGVja0JveCgpIHsKLQkJc3dpdGNoICh0aGlzLnN0YXRlKSB7Ci0JCQljYXNlIFVOQ0hFQ0tFRDoKLQkJCQl0aGlzLmJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCXRoaXMuYnV0dG9uLnNldEdyYXllZChmYWxzZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBBUlRJQUxMWV9DSEVDS0VEOgotCQkJCXRoaXMuYnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQl0aGlzLmJ1dHRvbi5zZXRHcmF5ZWQodHJ1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENIRUNLRUQ6Ci0JCQkJdGhpcy5idXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCXRoaXMuYnV0dG9uLnNldEdyYXllZChmYWxzZSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVua25vd24gc3RhdGU6ICIgKyB0aGlzLnN0YXRlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9WYWxpZGF0aW5nRGlhbG9nLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvVmFsaWRhdGluZ0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGI2Y2RmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9WYWxpZGF0aW5nRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGUuUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGlzIGRpYWxvZyBpcyBzaW1pbGFyIHRvIGl0IHN1cGVyY2xhc3MsIDxjb2RlPkRpYWxvZzwvY29kZT4sIHdpdGgKLSAqIHRoZSBhZGRlZCB2YWx1ZSBvZiBhbiBlcnJvciBtZXNzYWdlIGxhYmVsIGJlbG93IHRoZSBtYWluIHBhbmVsLiBBIHN1YmNsYXNzCi0gKiBjYW4gc2V0IHRoaXMgZXJyb3IgbWVzc2FnZSBhcyBuZWVkZWQgc28gdGhhdCBpdCBjYW4gaW5mb3JtIHRoZSB1c2VyIHNvbWV0aGluZwotICogaW5jb3JyZWN0IGhhcyBiZWVuIGVudGVyZWQuCi0gKiA8cD4KLSAqIElmIHRoZXJlIGlzIGFuIGVycm9yIG1lc3NhZ2UsIGl0IHdpbGwgYmUgc2hvd24uIElmIHRoZXJlIGlzIGEgd2FybmluZwotICogbWVzc2FnZSwgaXQgd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuIFdhcm5pbmcgbWVzc2FnZXMKLSAqIGhhdmUgYSBkaWZmZXJlbnQgaWNvbiB0aGFuIGVycm9yIG1lc3NhZ2VzLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFsaWRhdGluZ0RpYWxvZzxUIGV4dGVuZHMgTm9kZT4gZXh0ZW5kcyBEaWFsb2c8VD4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WYWxpZGF0aW5nRGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW5nRGlhbG9nKFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VmFsaWRhdGluZ0RpYWxvZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gdGl0bGUgVGhlIGRpYWxvZydzIHRpdGxlCi0JICovCi0JcHVibGljIFZhbGlkYXRpbmdEaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIocGFyZW50LCB0aXRsZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JZmluYWwgTm9kZS5WYWxpZGF0b3IgYnVpbGRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgTm9kZS5WYWxpZGF0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYXVzZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVzdW1lKCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJCQlWYWxpZGF0aW5nRGlhbG9nLnRoaXMudmFsaWRhdGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIG1lc3NhZ2VzIGZyb20gdGhlIGRlc2NyaXB0aW9uIHBhbmUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBjbGVhck1lc3NhZ2UoKXsKLQkJc2V0TWVzc2FnZShnZXREZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgZGVzY3JpcHRpb24gcGFuZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBjbGVhckVycm9yTWVzc2FnZSgpIHsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIHNob3duIGluIHRoZSBkZXNjcmlwdGlvbiBwYW5lLgotCSAqCi0JICogQHJldHVybiBUaGUgZGVzY3JpcHRpb24gdW5kZXIgdGhlIGRlc2NyaXB0aW9uJ3MgdGl0bGUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBzaG93biBpbiB0aGUgZGVzY3JpcHRpb24gcGFuZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGltYWdlIG9mIHRoZSBkZXNjcmlwdGlvbiBwYW5lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgaXMKLQkgKiByZXF1aXJlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXREZXNjcmlwdGlvbkltYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0aXRsZSBvZiB0aGUgZGVzY3JpcHRpb24gcGFuZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHRpdGxlIHNob3duIGluIHRoZSBkZXNjcmlwdGlvbiBwYW5lCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvblRpdGxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbFNpemUoKSB7Ci0JCVBvaW50IHJlc3VsdCA9IGdldFNoZWxsKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJUG9pbnQgcGFuZVNpemUgPSBnZXRQYW5lKCkuZ2V0Q29udHJvbCgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWludCB3aWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQwMCk7Ci0JCXJlc3VsdC54ID0gTWF0aC5tYXgod2lkdGgsIHBhbmVTaXplLngpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGhhc1RpdGxlQXJlYSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVVJKCkgewotCi0JCXN1cGVyLmluaXRpYWxpemVVSSgpOwotCi0JCS8vIFVwZGF0ZSB0aGUgZGVzY3JpcHRpb24gdGl0bGUKLQkJU3RyaW5nIGRlc2NyaXB0aW9uVGl0bGUgPSBnZXREZXNjcmlwdGlvblRpdGxlKCk7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uVGl0bGUgIT0gbnVsbCkgewotCQkJc2V0VGl0bGUoZGVzY3JpcHRpb25UaXRsZSk7Ci0JCX0KLQotCQkvLyBVcGRhdGUgdGhlIGRlc2NyaXB0aW9uIHRpdGxlCi0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IGdldERlc2NyaXB0aW9uKCk7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCXNldE1lc3NhZ2UoZGVzY3JpcHRpb24pOwotCQl9Ci0KLQkJLy8gVXBkYXRlIHRoZSBkZXNjcmlwdGlvbiBpbWFnZQotCQlJbWFnZSBpbWFnZSA9IGdldERlc2NyaXB0aW9uSW1hZ2UoKTsKLQotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJc2V0VGl0bGVJbWFnZShpbWFnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBkZXNjcmlwdGlvbiBwYW5lIGJ5IHNob3dpbmcgdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UgYW5kIGZvcm1hdAotCSAqIHRoZSB0ZXh0IHdpdGggdGhlIGdpdmVuIGxpc3Qgb2YgYXJndW1lbnRzIGlmIGFueSBleGlzdHMuCi0JICoKLQkgKiBAcGFyYW0gZXJyb3JNZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlIHRvIHNob3cgaW4gdGhlIGRlc2NyaXB0aW9uIHBhbmUKLQkgKiBAcGFyYW0gYXJndW1lbnRzIFRoZSBsaXN0IG9mIGFyZ3VtZW50cyB1c2VkIHRvIGZvcm1hdCB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlLCBPYmplY3QuLi4gYXJndW1lbnRzKSB7Ci0JCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChlcnJvck1lc3NhZ2UsIGFyZ3VtZW50cykpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGRlc2NyaXB0aW9uIHBhbmUgYnkgc2hvd2luZyB0aGUgZ2l2ZW4gd2FybmluZyBtZXNzYWdlIGFuZCBmb3JtYXQKLQkgKiB0aGUgdGV4dCB3aXRoIHRoZSBnaXZlbiBsaXN0IG9mIGFyZ3VtZW50cyBpZiBhbnkgZXhpc3RzLgotCSAqCi0JICogQHBhcmFtIHdhcm5pbmdNZXNzYWdlIFRoZSB3YXJuaW5nIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGVzY3JpcHRpb24gcGFuZQotCSAqIEBwYXJhbSBhcmd1bWVudHMgVGhlIGxpc3Qgb2YgYXJndW1lbnRzIHVzZWQgdG8gZm9ybWF0IHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0V2FybmluZ01lc3NhZ2UoU3RyaW5nIHdhcm5pbmdNZXNzYWdlLCBPYmplY3QuLi4gYXJndW1lbnRzKSB7Ci0JCXNldE1lc3NhZ2UoTkxTLmJpbmQod2FybmluZ01lc3NhZ2UsIGFyZ3VtZW50cyksIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZXJyb3IgbWVzc2FnZSwgZWl0aGVyIHNob3dzIHRoZSBmaXJzdCBlcnJvciBwcm9ibGVtIG9yIGhpZGVzCi0JICogdGhlIGVycm9yIHBhbmUuIElmIHRoZSBwcm9ncmVzcyBiYXIgaXMgc2hvd24sIHRoZW4gdGhlIGVycm9yIG1lc3NhZ2Ugd2lsbAotCSAqIG5vdCBiZSBzaG93bi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlTWVzc2FnZSgpIHsKLQkJaWYgKGdldFN1YmplY3QoKS5icmFuY2hQcm9ibGVtc1NpemUoKSA9PSAwKSB7Ci0JCQljbGVhck1lc3NhZ2UoKTsKLQkJfSBlbHNlIHsKLQkJCQlmb3IgKExpc3RJdGVyYXRvcjxQcm9ibGVtPiBwcm9ibGVtcyA9IGdldFN1YmplY3QoKS5icmFuY2hQcm9ibGVtcygpOyBwcm9ibGVtcy5oYXNOZXh0KCk7KXsKLQkJCQkJUHJvYmxlbSBwcm9ibGVtID0gcHJvYmxlbXMubmV4dCgpOwotCQkJCQlpZiAocHJvYmxlbS5tZXNzYWdlVHlwZSgpID09IElNZXNzYWdlUHJvdmlkZXIuRVJST1IpewotCQkJCQkJdGhpcy5zZXRFcnJvck1lc3NhZ2UocHJvYmxlbS5tZXNzYWdlS2V5KCksIHByb2JsZW0ubWVzc2FnZUFyZ3VtZW50cygpKTsKLQkJCQkJfSAKLQkJCQkJZWxzZSBpZiAocHJvYmxlbS5tZXNzYWdlVHlwZSgpID09IElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyl7Ci0JCQkJCQl0aGlzLnNldFdhcm5pbmdNZXNzYWdlKHByb2JsZW0ubWVzc2FnZUtleSgpLCBwcm9ibGVtLm1lc3NhZ2VBcmd1bWVudHMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCX0KLQkJaWYgKCF0aGlzLmNvbnRhaW5zRXJyb3JNZXNzYWdlKCkpewotCQkJY2xlYXJFcnJvck1lc3NhZ2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBjb250YWluc0Vycm9yTWVzc2FnZSgpewotCQlib29sZWFuIGVycm9yID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFByb2JsZW0+IHByb2JsZW1zID0gZ2V0U3ViamVjdCgpLmJyYW5jaFByb2JsZW1zKCk7IHByb2JsZW1zLmhhc05leHQoKTspewotCQkJUHJvYmxlbSBwcm9ibGVtID0gcHJvYmxlbXMubmV4dCgpOwotCQkJaWYgKHByb2JsZW0ubWVzc2FnZVR5cGUoKSA9PUlNZXNzYWdlUHJvdmlkZXIuRVJST1IpewotCQkJCWVycm9yID0gdHJ1ZTsKLQkJCX0gCi0JCX0KLQkJcmV0dXJuIGVycm9yOwotCX0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIHN0YXRlIG9iamVjdCBhbmQgYmFzZWQgb24gaXRzIHN0YXR1cywgdXBkYXRlIHRoZSBkZXNjcmlwdGlvbgotCSAqIHBhbmUgdG8gc2hvdyB0aGUgZmlyc3QgZXJyb3IgaWYgYW55IGV4aXN0cyBhbmQgdXBkYXRlIHRoZSBlbmFibGVtZW50IG9mCi0JICogdGhlIE9LIGJ1dHRvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCWdldFN1YmplY3QoKS52YWxpZGF0ZUJyYW5jaCgpOwotCQl1cGRhdGVNZXNzYWdlKCk7Ci0JCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZCghY29udGFpbnNFcnJvck1lc3NhZ2UoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2l6YXJkcy9KYXZhUHJvamVjdFdpemFyZFBhZ2UuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2l6YXJkcy9KYXZhUHJvamVjdFdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEwOTU3YS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpemFyZHMvSmF2YVByb2plY3RXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqICBKYXZhUHJvamVjdFdpemFyZFBhZ2UKLSAqLwotcHVibGljIGNsYXNzIEphdmFQcm9qZWN0V2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVzdGluYXRpb25MYWJlbDsKLQlwcml2YXRlIFRhYmxlIHByb2plY3RUYWJsZTsKLQlwcml2YXRlIFRhYmxlVmlld2VyIHByb2plY3RUYWJsZVZpZXdlcjsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgU0VMRUNUX1BST0pFQ1RfUEFHRV9OQU1FID0gIlNlbGVjdEphdmFQcm9qZWN0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGludCBQUk9KRUNUX05BTUVfQ09MVU1OX0lOREVYID0gMDsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCQotCXB1YmxpYyBKYXZhUHJvamVjdFdpemFyZFBhZ2UoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCXN1cGVyKFNFTEVDVF9QUk9KRUNUX1BBR0VfTkFNRSk7Ci0KLQkJdGhpcy5qYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotCX0KLQkKLQkvLyAqKioqKioqKioqIElEaWFsb2dQYWdlIGltcGxlbWVudGF0aW9uICAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJdGhpcy5idWlsZExhYmVsKGNvbXBvc2l0ZSwgdGhpcy5kZXN0aW5hdGlvbkxhYmVsKTsKLQkJCi0JCXRoaXMucHJvamVjdFRhYmxlID0gdGhpcy5idWlsZFByb2plY3RUYWJsZShjb21wb3NpdGUsIHRoaXMuYnVpbGRQcm9qZWN0VGFibGVTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJCi0JCXRoaXMucHJvamVjdFRhYmxlVmlld2VyID0gdGhpcy5idWlsZFByb2plY3RUYWJsZVZpZXdlcigKLQkJCQkJCQkJCQkJCXRoaXMucHJvamVjdFRhYmxlLCAKLQkJCQkJCQkJCQkJCXRoaXMuYnVpbGRQcm9qZWN0VGFibGVMYWJlbFByb3ZpZGVyKCksIAotCQkJCQkJCQkJCQkJdGhpcy5idWlsZFByb2plY3RUYWJsZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJdGhpcy5maWxsUHJvamVjdExpc3QoKTsKLQkJdGhpcy5zZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCXRoaXMuc2V0VGFibGVTZWxlY3Rpb24odGhpcy5qYXZhUHJvamVjdCk7Ci0JCXRoaXMudmFsaWRhdGUoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVycyAqKioqKioqKioqCi0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkUHJvamVjdFRhYmxlU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNlbGVjdGVkUHJvamVjdENoYW5nZWQoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJQcm9tcHRQcm9qZWN0V2l6YXJkUGFnZSBwcm9qZWN0IHRhYmxlIHNlbGVjdGlvbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVyIGNhbGxiYWNrcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RlZFByb2plY3RDaGFuZ2VkKCkgewotCQlpZih0aGlzLnByb2plY3RUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpICE9IC0xKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9ICB0aGlzLnByb2plY3RUYWJsZS5nZXRJdGVtKHRoaXMucHJvamVjdFRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gaXRlbS5nZXRUZXh0KDApOwotCQkJaWYoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShwcm9qZWN0TmFtZSkpIHsKLQotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkJCXRoaXMuc2V0SmF2YVByb2plY3QoSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpKTsKLQkJCQl0aGlzLnZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLy8gKioqKioqKioqKiBpbnRyYS13aXphcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXN0aW5hdGlvbkxhYmVsKFN0cmluZyBkZXN0aW5hdGlvbkxhYmVsKSB7Ci0JCXRoaXMuZGVzdGluYXRpb25MYWJlbCA9IGRlc3RpbmF0aW9uTGFiZWw7Ci0JfQotCi0JLy8gKioqKioqKioqKiBwcm90ZWN0ZWQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWJsZVNlbGVjdGlvbihJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJaWYoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJCWZvcihUYWJsZUl0ZW0gaXRlbTogdGhpcy5wcm9qZWN0VGFibGUuZ2V0SXRlbXMoKSkgewotCQkJCWlmKGl0ZW0uZ2V0VGV4dCgwKS5lcXVhbHMocHJvamVjdE5hbWUpKSB7Ci0JCQkJCXRoaXMucHJvamVjdFRhYmxlLnNldFNlbGVjdGlvbihpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZmlsbFByb2plY3RMaXN0KCkgewotCQl0aGlzLnByb2plY3RUYWJsZVZpZXdlci5zZXRJbnB1dCh0aGlzLmdldFNvcnRlZEphdmFQcm9qZWN0c05hbWVzKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCXRoaXMuc2V0UGFnZUNvbXBsZXRlKHRoaXMucHJvamVjdFRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkgIT0gLTEpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0SmF2YVByb2plY3QoSUphdmFQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5qYXZhUHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRTb3J0ZWRKYXZhUHJvamVjdHNOYW1lcygpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydCh0aGlzLmdldEphdmFQcm9qZWN0c05hbWVzKCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0SmF2YVByb2plY3RzTmFtZXMoKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmFycmF5KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SVByb2plY3QsIFN0cmluZz4odGhpcy5nZXRKYXZhUHJvamVjdHMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKElQcm9qZWN0IHByb2plY3QpIHsKLQkJCQkJcmV0dXJuIHByb2plY3QuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX0sCi0JCQluZXcgU3RyaW5nWzBdKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPElQcm9qZWN0PiBnZXRKYXZhUHJvamVjdHMoKSB7Ci0JICAgcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxJUHJvamVjdD4oQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5nZXRQcm9qZWN0cygpKSkgewotCSAgICAgIEBPdmVycmlkZQotCSAgICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdChJUHJvamVjdCBuZXh0KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIG5leHQuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkgICAgICB9Ci0JICAgfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8SVByb2plY3Q+IGdldFByb2plY3RzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8SVByb2plY3Q+KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzc2VzICoqKioqKioqKioKLQotCXByaXZhdGUgZmluYWwgY2xhc3MgUHJvamVjdFRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJaWYoY29sdW1uSW5kZXggPT0gUFJPSkVDVF9OQU1FX0NPTFVNTl9JTkRFWCkKLQkJCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShvcmcuZWNsaXBzZS51aS5pZGUuSURFLlNoYXJlZEltYWdlcy5JTUdfT0JKX1BST0pFQ1QpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJYXNzZXJ0IGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmc7Ci0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAoU3RyaW5nKWVsZW1lbnQ7Ci0JCQlpZihjb2x1bW5JbmRleCA9PSBQUk9KRUNUX05BTUVfQ09MVU1OX0lOREVYKQotCQkJCXJldHVybiBwcm9qZWN0TmFtZTsKLQkJCXJldHVybiBudWxsOwotCQl9CQkKLQl9Ci0KLQlwcml2YXRlIGZpbmFsIGNsYXNzIFByb2plY3RUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJcmV0dXJuICgoU3RyaW5nW10paW5wdXRFbGVtZW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkge30KLQl9Ci0KLQkvLyAqKioqKioqKioqIFVJIGNvbXBvbmVudHMgKioqKioqKioqKgotCQotCXByaXZhdGUgSVRhYmxlTGFiZWxQcm92aWRlciBidWlsZFByb2plY3RUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvamVjdFRhYmxlTGFiZWxQcm92aWRlcigpOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgYnVpbGRQcm9qZWN0VGFibGVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvamVjdFRhYmxlQ29udGVudFByb3ZpZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMYWJlbCBidWlsZExhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlIGJ1aWxkUHJvamVjdFRhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCVRhYmxlVmlld2VyIHRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCwgCi0JCQkJCQkJCQkJCQlTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5WSVJUVUFMKTsJCQotCi0JCVRhYmxlIHRhYmxlID0gdGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgYnVpbGRQcm9qZWN0VGFibGVWaWV3ZXIoVGFibGUgcGFyZW50LCBJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCi0JCVRhYmxlVmlld2VyIHRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCk7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQlyZXR1cm4gdGFibGVWaWV3ZXI7Ci0JfQotfQkKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvRXh0ZW5kZWRMYWJlbFByb3ZpZGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL0V4dGVuZGVkTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTk2MDY4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvRXh0ZW5kZWRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JRGVzY3JpcHRpb25Qcm92aWRlcjsKLQotLyoqCi0gKiBDb21iaW5lIHByb3ZpZGVyIGludGVyZmFjZXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYSBzaW5nbGUgcHJvdmlkZXIgdGhhdCBjYW4KLSAqIGJlIHVzZWQgYXMgYm90aCBhIGxhYmVsIGFuZCBkZXNjcmlwdGlvbiBwcm92aWRlciBmb3IgYSB0cmVlLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBFeHRlbmRlZExhYmVsUHJvdmlkZXIKLQlleHRlbmRzIElMYWJlbFByb3ZpZGVyLCBJRGVzY3JpcHRpb25Qcm92aWRlcgotewotCS8vIGNvbWJpbmUgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9JdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL0l0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY5NDQ1OS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL0l0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSBjYW4gYmUgdXNlZCB0byBtYWludGFpbiB0aGUgbGFiZWwgKGltYWdlCi0gKiBhbmQgdGV4dCkgYW5kIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgaXRlbS4gVGhlIGltcGxlbWVudGF0aW9uIHdpbGwgbW9uaXRvcgotICogdGhlIGl0ZW0gZm9yIGFueSBjaGFuZ2VzIHRoYXQgYWZmZWN0IHRoZSBkZXNjcmlwdGlvbiBhbmQgZm9yd2FyZCB0aGVtCi0gKiBhcHByb3ByaWF0ZWx5IHRvIHRoZSB7QGxpbmsgTWFuYWdlcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklEZXNjcmlwdGlvblByb3ZpZGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSXRlbUV4dGVuZGVkTGFiZWxQcm92aWRlcgotCWV4dGVuZHMgSXRlbUxhYmVsUHJvdmlkZXIKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgcHJvdmlkZXIncyBpdGVtLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklEZXNjcmlwdGlvblByb3ZpZGVyI2dldERlc2NyaXB0aW9uKE9iamVjdCkKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIEFuIGl0ZW0gZXh0ZW5kZWQgbGFiZWwgcHJvdmlkZXIncyBtYW5hZ2VyIGlzIG5vdGlmaWVkIHdoZW5ldmVyIHRoZSBpdGVtJ3MKLQkgKiBkZXNjcmlwdGlvbiBoYXMgY2hhbmdlZC4KLQkgKi8KLQlpbnRlcmZhY2UgTWFuYWdlcgotCQlleHRlbmRzIEl0ZW1MYWJlbFByb3ZpZGVyLk1hbmFnZXIKLQl7Ci0JCS8qKgotCQkgKiBUaGUgZGVzY3JpcHRpb24gZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSBoYXMgY2hhbmdlZC4gVXBkYXRlIGFwcHJvcHJpYXRlbHkuCi0JCSAqLwotCQl2b2lkIHVwZGF0ZURlc2NyaXB0aW9uKE9iamVjdCBpdGVtKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL0l0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL0l0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjc1ZGUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9JdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2U7Ci0KLS8qKgotICogRmFjdG9yeSBpbnRlcmZhY2UgZm9yIGNvbnN0cnVjdGluZyBpdGVtIGV4dGVuZGVkIGxhYmVsIHByb3ZpZGVycy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSXRlbUV4dGVuZGVkTGFiZWxQcm92aWRlckZhY3RvcnkgewotCS8qKgotCSAqIEJ1aWxkIGFuIGV4dGVuZGVkIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0uCi0JICovCi0JSXRlbUV4dGVuZGVkTGFiZWxQcm92aWRlciBidWlsZFByb3ZpZGVyKE9iamVjdCBpdGVtLCBJdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyLk1hbmFnZXIgbWFuYWdlcik7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL0l0ZW1MYWJlbFByb3ZpZGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL0l0ZW1MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMWE4ZTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9JdGVtTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiBiZSB1c2VkIHRvIG1haW50YWluIHRoZSBsYWJlbCAoaW1hZ2UsCi0gKiBhbmQgdGV4dCkgb2YgYSBzcGVjaWZpYyBpdGVtLiBUaGUgaW1wbGVtZW50YXRpb24gd2lsbCBtb25pdG9yCi0gKiB0aGUgaXRlbSBmb3IgYW55IGNoYW5nZXMgdGhhdCBhZmZlY3QgdGhlIGxhYmVsIGFuZCBmb3J3YXJkIHRoZW0gYXBwcm9wcmlhdGVseQotICogdG8gdGhlIHtAbGluayBNYW5hZ2VyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEl0ZW1MYWJlbFByb3ZpZGVyIHsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltYWdlIGZvciB0aGUgcHJvdmlkZXIncyBpdGVtLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShPYmplY3QpCi0JICovCi0JSW1hZ2UgZ2V0SW1hZ2UoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgZm9yIHRoZSBwcm92aWRlcidzIGl0ZW0uCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpOwotCQotCS8qKgotCSAqIERpc3Bvc2UgdGhlIGl0ZW0gbGFiZWwgcHJvdmlkZXIuCi0JICogUmVtb3ZlIGFueSBpdGVtIGxpc3RlbmVycyBhcyBhcHByb3ByaWF0ZS4KLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKTsKLQotCi0JLyoqCi0JICogQW4gaXRlbSBsYWJlbCBwcm92aWRlcidzIG1hbmFnZXIgaXMgbm90aWZpZWQgd2hlbmV2ZXIgdGhlIGl0ZW0ncwotCSAqIGxhYmVsIGhhcyBjaGFuZ2VkLgotCSAqLwotCWludGVyZmFjZSBNYW5hZ2VyIHsKLQkJLyoqCi0JCSAqIFRoZSBsYWJlbCAoaW1hZ2UgYW5kL29yIHRleHQpIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gaGFzIGNoYW5nZWQuCi0JCSAqIFVwZGF0ZSBhcHByb3ByaWF0ZWx5LgotCQkgKi8KLQkJdm9pZCB1cGRhdGVMYWJlbChPYmplY3QgaXRlbSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9JdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YzI1ZDMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9JdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlOwotCi0vKioKLSAqIEZhY3RvcnkgaW50ZXJmYWNlIGZvciBjb25zdHJ1Y3RpbmcgaXRlbSBsYWJlbCBwcm92aWRlcnMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSB7Ci0JLyoqCi0JICogQnVpbGQgYSBsYWJlbCBwcm92aWRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtLgotCSAqLwotCUl0ZW1MYWJlbFByb3ZpZGVyIGJ1aWxkUHJvdmlkZXIoT2JqZWN0IGl0ZW0sIEl0ZW1MYWJlbFByb3ZpZGVyLk1hbmFnZXIgbWFuYWdlcik7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL0l0ZW1TdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL0l0ZW1TdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZGJmZTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9JdGVtU3RydWN0dXJlZENvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSBjYW4gYmUgdXNlZCB0byBtYWludGFpbiB0aGUgZWxlbWVudHMKLSAqIG9mIGEgc3BlY2lmaWMgaW5wdXQgZWxlbWVudC4gVGhlIGltcGxlbWVudGF0aW9uIHdpbGwgbW9uaXRvcgotICogdGhlIGl0ZW0gZm9yIGFueSBjaGFuZ2VzIHRoYXQgYWZmZWN0IHRoZSBlbGVtZW50cyBhbmQgZm9yd2FyZCB0aGVtCi0gKiBhcHByb3ByaWF0ZWx5IHRvIHRoZSB7QGxpbmsgTWFuYWdlcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcgotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSXRlbVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCS8qKgotCSAqIFJldHVybiB0aGUgaW5wdXQgZWxlbWVudCdzIGVsZW1lbnRzLgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+Ci0JICogV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBpdGVtIGlzIGFuIDxlbT5pbnB1dDwvZW0+IGVsZW1lbnQuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlPYmplY3RbXSBnZXRFbGVtZW50cygpOwotCi0JLyoqCi0JICogRGlzcG9zZSB0aGUgaXRlbSBjb250ZW50IHByb3ZpZGVyLgotCSAqIFJlbW92ZSBhbnkgaXRlbSBsaXN0ZW5lcnMgYXMgYXBwcm9wcmlhdGUuCi0JICovCi0Jdm9pZCBkaXNwb3NlKCk7Ci0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIGNvbnN0YW50IGZvciB3aGVuIG5vIGNoaWxkcmVuIGFyZSBwcmVzZW50LgotCSAqLwotCU9iamVjdFtdIEVNUFRZX0FSUkFZID0gbmV3IE9iamVjdFswXTsKLQotCi0JLyoqCi0JICogQW4gaXRlbSBzdHJ1Y3R1cmVkIGNvbnRlbnQgcHJvdmlkZXIncyBtYW5hZ2VyIGlzIG5vdGlmaWVkIHdoZW5ldmVyIHRoZQotCSAqIGlucHV0IGVsZW1lbnQncyBlbGVtZW50cyBoYXZlIGNoYW5nZWQuCi0JICovCi0JaW50ZXJmYWNlIE1hbmFnZXIgewotCQkvKioKLQkJICogVGhlIGVsZW1lbnRzIGZvciB0aGUgc3BlY2lmaWVkIGlucHV0IGVsZW1lbnQgaGF2ZSBjaGFuZ2VkLgotCQkgKiBVcGRhdGUgYXBwcm9wcmlhdGVseS4KLQkJICovCi0JCXZvaWQgdXBkYXRlRWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBzcGVjaWZpZWQgZWxlbWVudCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGlucHV0IGVsZW1lbnQuCi0JCSAqIERpc3Bvc2Ugb2YgdGhlIGVsZW1lbnQncyBwcm92aWRlcnMsIGlmIG5lY2Vzc2FyeS4KLQkJICovCi0JCXZvaWQgZGlzcG9zZShPYmplY3QgZWxlbWVudCk7Ci0JfQotCi0KLQkvKioKLQkgKiBBICJudWxsIiBpdGVtIHN0cnVjdHVyZWQgY29udGVudCBwcm92aWRlciB0aGF0IGhhcyBubyBlbGVtZW50cy4KLQkgKi8KLQlmaW5hbCBjbGFzcyBOdWxsCi0JCWltcGxlbWVudHMgSXRlbVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsIFNlcmlhbGl6YWJsZQotCXsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBJdGVtU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCXB1YmxpYyBzdGF0aWMgSXRlbVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cygpIHsKLQkJCXJldHVybiBFTVBUWV9BUlJBWTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJLy8gTk9QCi0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9JdGVtU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvSXRlbVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZjE2OGUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9JdGVtU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZTsKLQotLyoqCi0gKiBGYWN0b3J5IGludGVyZmFjZSBmb3IgY29uc3RydWN0aW5nIGl0ZW0gY29udGVudCBwcm92aWRlcnMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEl0ZW1TdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyRmFjdG9yeSB7Ci0JLyoqCi0JICogQnVpbGQgYSBzdHJ1Y3R1cmVkIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbS4KLQkgKi8KLQlJdGVtU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBidWlsZFByb3ZpZGVyKE9iamVjdCBpdGVtLCBJdGVtU3RydWN0dXJlZENvbnRlbnRQcm92aWRlci5NYW5hZ2VyIG1hbmFnZXIpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9JdGVtVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9JdGVtVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmMzZDkwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvSXRlbVRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgdG8gbWFpbnRhaW4gdGhlIGNvbnRlbnQgb2YgYQotICogc3BlY2lmaWMgdHJlZSBlbGVtZW50LiBUaGUgaW1wbGVtZW50YXRpb24gd2lsbCBtb25pdG9yIHRoZSBlbGVtZW50IGZvciBhbnkKLSAqIGNoYW5nZXMgdGhhdCBhZmZlY3QgdGhlIGVsZW1lbnQncyBjaGlsZHJlbiBhbmQgZm9yd2FyZCB0aGVtCi0gKiBhcHByb3ByaWF0ZWx5IHRvIHRoZSB7QGxpbmsgTWFuYWdlcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcgotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJdGVtVHJlZUNvbnRlbnRQcm92aWRlcgotCWV4dGVuZHMgSXRlbVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZW0ncyBwYXJlbnQuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChPYmplY3QpCi0JICovCi0JT2JqZWN0IGdldFBhcmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGl0ZW0gaGFzIGNoaWxkcmVuLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihPYmplY3QpCi0JICovCi0JYm9vbGVhbiBoYXNDaGlsZHJlbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVtJ3MgY2hpbGRyZW4uCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlPYmplY3RbXSBnZXRDaGlsZHJlbigpOwotCi0KLQkvKioKLQkgKiBBbiBpdGVtIHRyZWUgY29udGVudCBwcm92aWRlcidzIG1hbmFnZXIgaXMgbm90aWZpZWQgd2hlbmV2ZXIgdGhlCi0JICogaXRlbSdzIGNoaWxkcmVuIGhhdmUgY2hhbmdlZC4KLQkgKi8KLQlpbnRlcmZhY2UgTWFuYWdlcgotCQlleHRlbmRzIEl0ZW1TdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLk1hbmFnZXIKLQl7Ci0JCS8qKgotCQkgKiBUaGUgY2hpbGRyZW4gZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBoYXZlIGNoYW5nZWQuCi0JCSAqIFVwZGF0ZSBhcHByb3ByaWF0ZWx5LgotCQkgKi8KLQkJdm9pZCB1cGRhdGVDaGlsZHJlbihPYmplY3QgZWxlbWVudCk7Ci0JfQotCi0KLQkvKioKLQkgKiBBICJudWxsIiBpdGVtIHRyZWUgY29udGVudCBwcm92aWRlciB0aGF0IGhhcyBubyBlbGVtZW50cywgcGFyZW50LAotCSAqIG9yIHBhcmVudC4KLQkgKi8KLQlmaW5hbCBjbGFzcyBOdWxsCi0JCWltcGxlbWVudHMgSXRlbVRyZWVDb250ZW50UHJvdmlkZXIsIFNlcmlhbGl6YWJsZQotCXsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBJdGVtU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCXB1YmxpYyBzdGF0aWMgSXRlbVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cygpIHsKLQkJCXJldHVybiBFTVBUWV9BUlJBWTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbigpIHsKLQkJCXJldHVybiBFTVBUWV9BUlJBWTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJLy8gTk9QCi0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9JdGVtVHJlZUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvSXRlbVRyZWVDb250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyN2EyYjQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9JdGVtVHJlZUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlOwotCi0vKioKLSAqIEZhY3RvcnkgaW50ZXJmYWNlIGZvciBjb25zdHJ1Y3RpbmcgaXRlbSB0cmVlIGNvbnRlbnQgcHJvdmlkZXJzLgotICogVHlwaWNhbGx5IHVzZWQgYnkge0BsaW5rIEl0ZW1UcmVlQ29udGVudFByb3ZpZGVyLk1hbmFnZXIgaXRlbSB0cmVlIGNvbnRlbnQKLSAqIHByb3ZpZGVyIG1hbmFnZXJzfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSXRlbVRyZWVDb250ZW50UHJvdmlkZXJGYWN0b3J5IHsKLQkvKioKLQkgKiBCdWlsZCBhIHRyZWUgY29udGVudCBwcm92aWRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBwcm92aWRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtLgotCSAqLwotCUl0ZW1UcmVlQ29udGVudFByb3ZpZGVyIGJ1aWxkUHJvdmlkZXIoT2JqZWN0IGl0ZW0sIEl0ZW1UcmVlQ29udGVudFByb3ZpZGVyLk1hbmFnZXIgbWFuYWdlcik7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL0l0ZW1UcmVlU3RhdGVQcm92aWRlckZhY3RvcnlQcm92aWRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9JdGVtVHJlZVN0YXRlUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg2NmE3Zi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL0l0ZW1UcmVlU3RhdGVQcm92aWRlckZhY3RvcnlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlOwotCi0vKioKLSAqIFRoaXMgcHJvdmlkZXIgc3VwcGxpZXMgdGhlIGZhY3RvcmllcyB1c2VkIGJ5IGEgdHJlZSB2aWV3IHRvIGJ1aWxkCi0gKiB0aGUgY29udGVudCBhbmQgbGFiZWxzIGl0cyB0cmVlLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJdGVtVHJlZVN0YXRlUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXIgewotCS8qKgotCSAqIFJldHVybiBhIGZhY3RvcnkgdG8gYmUgdXNlZCB0byBjcmVhdGUge0BsaW5rIEl0ZW1UcmVlQ29udGVudFByb3ZpZGVyfXMKLQkgKiBmb3IgYSB0cmVlIHZpZXcuCi0JICovCi0JSXRlbVRyZWVDb250ZW50UHJvdmlkZXJGYWN0b3J5IGdldEl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgZmFjdG9yeSB0byBiZSB1c2VkIHRvIGNyZWF0ZSB7QGxpbmsgSXRlbUV4dGVuZGVkTGFiZWxQcm92aWRlcn1zCi0JICogZm9yIGEgdHJlZSB2aWV3LgotCSAqLwotCUl0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXJGYWN0b3J5IGdldEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9TdHJ1Y3R1cmVkU3RhdGVQcm92aWRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9TdHJ1Y3R1cmVkU3RhdGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjdiODc2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvU3RydWN0dXJlZFN0YXRlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci0KLS8qKgotICogQ29tYmluZSBhbGwgdGhlIHZhcmlvdXMgcHJvdmlkZXIgaW50ZXJmYWNlcyB0byBiZSBpbXBsZW1lbnRlZCBieSBhIHNpbmdsZQotICogcHJvdmlkZXIgdGhhdCBjYW4gYmUgdXNlZCBhcyBib3RoIGEgY29udGVudCBhbmQgbGFiZWwgcHJvdmlkZXIgZm9yIGEKLSAqIHN0cnVjdHVyZWQgdmlld2VyLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBTdHJ1Y3R1cmVkU3RhdGVQcm92aWRlcgotCWV4dGVuZHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsIEV4dGVuZGVkTGFiZWxQcm92aWRlcgotewotCS8qKgotCSAqIENvbnZlbmllbmNlIGNvbnN0YW50IGZvciB3aGVuIG5vIGVsZW1lbnRzIGFyZSBwcmVzZW50LgotCSAqLwotCU9iamVjdFtdIEVNUFRZX0FSUkFZID0gbmV3IE9iamVjdFswXTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvVHJlZVN0YXRlUHJvdmlkZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvVHJlZVN0YXRlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM2ZTQzMi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL1RyZWVTdGF0ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotCi0vKioKLSAqIENvbWJpbmUgYWxsIHRoZSB2YXJpb3VzIHByb3ZpZGVyIGludGVyZmFjZXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYSBzaW5nbGUKLSAqIHByb3ZpZGVyIHRoYXQgY2FuIGJlIHVzZWQgYXMgYm90aCBhIGNvbnRlbnQgYW5kIGxhYmVsIHByb3ZpZGVyIGZvciBhCi0gKiB0cmVlIHZpZXdlci4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHJlZVN0YXRlUHJvdmlkZXIKLQlleHRlbmRzIFN0cnVjdHVyZWRTdGF0ZVByb3ZpZGVyLCBJVHJlZUNvbnRlbnRQcm92aWRlcgotewotCS8vIGNvbWJpbmUgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Ly5jbGFzc3BhdGggYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvLmN2c2lnbm9yZSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvLnByb2plY3QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZTZlNTcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDUzMTRmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVHVlIE1hciAwOCAxMjowNjo1MSBFU1QgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTViMGJhNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eQotQnVuZGxlLVZlcnNpb246IDIuMS4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLURhbGktQ29tbWVudC0xOiAqTk8qIEVjbGlwc2VMaW5rIGZyaWVuZHMhCi1EYWxpLUNvbW1lbnQtMjogdGhlIFVJLXJlbGF0ZWQgcGFja2FnZXMgYXJlIGZyaWVuZHMgd2l0aCBvbmx5IFVJIHBsdWctaW5zCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIsCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuY29tbWFuZDsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIsCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuZW51bWVyYXRpb25zOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWksCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIsCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWw7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWksCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dDsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmczsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbCwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycwpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L2Fib3V0Lmh0bWwgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvYnVpbGQucHJvcGVydGllcyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDI0NDY1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L2NvbXBvbmVudC54bWwgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBjM2E1MC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotCi0gIENvbnRyaWJ1dG9yczoKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAtLT4KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eSI+PGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5IiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvcGx1Z2luLnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2OTNjZDQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb21tb24gVXRpbGl0eQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvQm9vbGVhblJlZmVyZW5jZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvQm9vbGVhblJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTczNTI4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0Jvb2xlYW5SZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgYSBjb250YWluZXIgZm9yIGhvbGRpbmcgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB0aGF0IGNhbm5vdCBiZQotICogY2hhbmdlZCBieSBjbGllbnRzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBCb29sZWFuUmVmZXJlbmNlIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBlcXVhbCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JYm9vbGVhbiBpcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIG5vdCBlcXVhbCB0bwotCSAqIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JYm9vbGVhbiBpc05vdChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JYm9vbGVhbiBpc1RydWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqLwotCWJvb2xlYW4gaXNGYWxzZSgpOwotCi0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICovCi0JZmluYWwgY2xhc3MgVmFsdWUgewotCQlwdWJsaWMgc3RhdGljIEJvb2xlYW5SZWZlcmVuY2Ugb2YoYm9vbGVhbiB2YWx1ZSkgewotCQkJcmV0dXJuIHZhbHVlID8gVHJ1ZS5pbnN0YW5jZSgpIDogRmFsc2UuaW5zdGFuY2UoKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZWFkLW9ubHkgYm9vbGVhbiByZWZlcmVuY2UgaW50ZXJmYWNlCi0JICogd2hvc2UgdmFsdWUgaXMgYWx3YXlzIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCWZpbmFsIGNsYXNzIFRydWUKLQkJaW1wbGVtZW50cyBCb29sZWFuUmVmZXJlbmNlLCBTZXJpYWxpemFibGUKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhblJlZmVyZW5jZSBJTlNUQU5DRSA9IG5ldyBUcnVlKCk7Ci0KLQkJcHVibGljIHN0YXRpYyBCb29sZWFuUmVmZXJlbmNlIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIFRydWUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzKGJvb2xlYW4gdmFsdWUpIHsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzTm90KGJvb2xlYW4gdmFsdWUpIHsKLQkJCXJldHVybiAhIHZhbHVlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNUcnVlKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0ZhbHNlKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlt0cnVlXSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVhZC1vbmx5IGJvb2xlYW4gcmVmZXJlbmNlIGludGVyZmFjZQotCSAqIHdob3NlIHZhbHVlIGlzIGFsd2F5cyA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICovCi0JZmluYWwgY2xhc3MgRmFsc2UKLQkJaW1wbGVtZW50cyBCb29sZWFuUmVmZXJlbmNlLCBTZXJpYWxpemFibGUKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhblJlZmVyZW5jZSBJTlNUQU5DRSA9IG5ldyBGYWxzZSgpOwotCi0JCXB1YmxpYyBzdGF0aWMgQm9vbGVhblJlZmVyZW5jZSBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBGYWxzZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBnZXRWYWx1ZSgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzKGJvb2xlYW4gdmFsdWUpIHsKLQkJCXJldHVybiAhIHZhbHVlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNOb3QoYm9vbGVhbiB2YWx1ZSkgewotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNUcnVlKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNGYWxzZSgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJbZmFsc2VdIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0V4Y2VwdGlvbkhhbmRsZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0V4Y2VwdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxOTQ4YS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9FeGNlcHRpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBTaW1wbGUgaW50ZXJmYWNlIGZvciBhbGxvd2luZyBjbGllbnRzIHRvIHBhc3MgYW4gZXhjZXB0aW9uIGhhbmRsZXIgdG8gYQotICogc2VydmljZSAoZS5nLiB0byBsb2cgdGhlIGV4Y2VwdGlvbikuIFRoaXMgaXMgcGFydGljdWxhcmx5IGhlbHBmdWwgaWYgdGhlCi0gKiBzZXJ2aWNlIGV4ZWN1dGVzIG9uIGFub3RoZXIsIHBvc3NpYmx5IGluYWNjZXNzaWJsZSwgdGhyZWFkLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBFeGNlcHRpb25IYW5kbGVyIHsKLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIHdhcyB0aHJvd24uIEhhbmRsZSBpdCBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSB0KTsKLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgaW50ZXJmYWNlIHRoYXQgZG9lcwotCSAqIG5vdGhpbmcgd2l0aCB0aGUgZXhjZXB0aW9uLgotCSAqLwotCWZpbmFsIGNsYXNzIE51bGwKLQkJaW1wbGVtZW50cyBFeGNlcHRpb25IYW5kbGVyLCBTZXJpYWxpemFibGUKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRXhjZXB0aW9uSGFuZGxlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCXB1YmxpYyBzdGF0aWMgRXhjZXB0aW9uSGFuZGxlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgTnVsbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSB0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBleGNlcHRpb24gaGFuZGxlciBpbnRlcmZhY2UgdGhhdAotCSAqIHdyYXBzIHRoZSBleGNlcHRpb24gaW4gYSBydW50aW1lIGV4Y2VwdGlvbiBhbmQgdGhyb3dzIGl0LgotCSAqLwotCWZpbmFsIGNsYXNzIFJ1bnRpbWUKLQkJaW1wbGVtZW50cyBFeGNlcHRpb25IYW5kbGVyLCBTZXJpYWxpemFibGUKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRXhjZXB0aW9uSGFuZGxlciBJTlNUQU5DRSA9IG5ldyBSdW50aW1lKCk7Ci0JCXB1YmxpYyBzdGF0aWMgRXhjZXB0aW9uSGFuZGxlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgUnVudGltZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSB0KSB7Ci0JCQkvLyByZS10aHJvdyB0aGUgZXhjZXB0aW9uIHVuY2hlY2tlZAotCQkJaWYgKHQgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0JCQkJdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIHQ7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9GaWx0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWUwMWY2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5OwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFVzZWQgYnkgdmFyaW91cyAicGx1Z2dhYmxlIiBjbGFzc2VzIHRvIGZpbHRlciBvYmplY3RzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHBhcmFtIDxUPiB0aGUgdHlwZSBvZiBvYmplY3RzIHRvIGJlIGZpbHRlcmVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmlsdGVyPFQ+IHsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzICJhY2NlcHRlZCIgYnkgdGhlCi0JICogZmlsdGVyLiBUaGUgc2VtYW50aWNzIG9mICJhY2NlcHQiIGlzIGRldGVybWluZWQgYnkgdGhlCi0JICogY29udHJhY3QgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLgotCSAqLwotCWJvb2xlYW4gYWNjZXB0KFQgbyk7Ci0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZmlsdGVyIGludGVyZmFjZSB0aGF0IGFjY2VwdHMgYWxsIHRoZQotCSAqIG9iamVjdHMgKGkuZS4gaXQgZG9lcyBubyBmaWx0ZXJpbmcpLgotCSAqLwotCWZpbmFsIGNsYXNzIFRyYW5zcGFyZW50PFM+Ci0JCWltcGxlbWVudHMgRmlsdGVyPFM+LCBTZXJpYWxpemFibGUKLQl7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsdGVyIElOU1RBTkNFID0gbmV3IFRyYW5zcGFyZW50KCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBGaWx0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIFRyYW5zcGFyZW50KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBub3RoaW5nIGlzIGZpbHRlcmVkIC0gZXZlcnl0aGluZyBpcyBhY2NlcHRlZAotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoUyBvKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaW5nbGV0b24gaW1wbGVtZW50YXRpb24gb2YgdGhlIGZpbHRlciBpbnRlcmZhY2UgdGhhdCBhY2NlcHRzIG5vbmUgb2YgdGhlCi0JICogb2JqZWN0cyAoaS5lLiBpdCBmaWx0ZXJzIG91dCBhbGwgdGhlIG9iamVjdHMpLgotCSAqLwotCWZpbmFsIGNsYXNzIE9wYXF1ZTxTPgotCQlpbXBsZW1lbnRzIEZpbHRlcjxTPiwgU2VyaWFsaXphYmxlCi0JewotCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbHRlciBJTlNUQU5DRSA9IG5ldyBPcGFxdWUoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFI+IEZpbHRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgT3BhcXVlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBldmVyeXRoaW5nIGlzIGZpbHRlcmVkIC0gbm90aGluZyBpcyBhY2NlcHRlZAotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoUyBvKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBmaWx0ZXIgaW50ZXJmYWNlIHRoYXQgdGhyb3dzIGFuIGV4Y2VwdGlvbgotCSAqIGlmIGNhbGxlZC4KLQkgKi8KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPgotCQlpbXBsZW1lbnRzIEZpbHRlcjxTPiwgU2VyaWFsaXphYmxlCi0JewotCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbHRlciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gRmlsdGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChTIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0luZGVudGluZ1ByaW50V3JpdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9JbmRlbnRpbmdQcmludFdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzBhMDFhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0luZGVudGluZ1ByaW50V3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgUHJpbnRXcml0ZXJ9IHRvIGF1dG9tYXRpY2FsbHkgaW5kZW50IG5ldyBsaW5lcy4KLSAqLwotcHVibGljIGNsYXNzIEluZGVudGluZ1ByaW50V3JpdGVyCi0JZXh0ZW5kcyBQcmludFdyaXRlcgotewotCXByaXZhdGUgZmluYWwgU3RyaW5nIGluZGVudDsKLQlwcml2YXRlIGludCBpbmRlbnRMZXZlbDsKLQlwcml2YXRlIGJvb2xlYW4gbmVlZHNJbmRlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX0lOREVOVCA9ICJcdCI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgd3JpdGVyIHRoYXQgaW5kZW50cyB3aXRoIHRhYnMuCi0JICovCi0JcHVibGljIEluZGVudGluZ1ByaW50V3JpdGVyKFdyaXRlciBvdXQpIHsKLQkJdGhpcyhvdXQsIERFRkFVTFRfSU5ERU5UKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB3cml0ZXIgdGhhdCBpbmRlbnRzIHdpdGggdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICovCi0JcHVibGljIEluZGVudGluZ1ByaW50V3JpdGVyKFdyaXRlciBvdXQsIFN0cmluZyBpbmRlbnQpIHsKLQkJdGhpcyhvdXQsIGluZGVudCwgMCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgd3JpdGVyIHRoYXQgaW5kZW50cyB3aXRoIHRoZSBzcGVjaWZpZWQgc3RyaW5nCi0JICogYW5kIGJlZ2lucyB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZW50IGxldmVsLgotCSAqLwotCXB1YmxpYyBJbmRlbnRpbmdQcmludFdyaXRlcihXcml0ZXIgb3V0LCBTdHJpbmcgaW5kZW50LCBpbnQgaW5pdGlhbEluZGVudExldmVsKSB7Ci0JCXN1cGVyKG91dCk7Ci0JCXRoaXMuaW5kZW50ID0gaW5kZW50OwotCQl0aGlzLmluZGVudExldmVsID0gaW5pdGlhbEluZGVudExldmVsOwotCQl0aGlzLm5lZWRzSW5kZW50ID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgZmxhZyBzbyBmb2xsb3dpbmcgbGluZSBpcyBpbmRlbnRlZC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcmludGxuKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJc3VwZXIucHJpbnRsbigpOwotCQkJdGhpcy5uZWVkc0luZGVudCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludCB0aGUgYXBwcm9wcmlhdGUgaW5kZW50LgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCBwcmludEluZGVudCgpIHsKLQkJaWYgKHRoaXMubmVlZHNJbmRlbnQpIHsKLQkJCXRoaXMubmVlZHNJbmRlbnQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSB0aGlzLmluZGVudExldmVsOyBpLS0gPiAwOyApIHsKLQkJCQl0aGlzLnByaW50KHRoaXMuaW5kZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFdyaXRlIGEgcG9ydGlvbiBvZiBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdyaXRlKGNoYXIgYnVmW10sIGludCBvZmYsIGludCBsZW4pIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKLQkJCXRoaXMucHJpbnRJbmRlbnQoKTsKLQkJCXN1cGVyLndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogV3JpdGUgYSBzaW5nbGUgY2hhcmFjdGVyLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdyaXRlKGludCBjKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5sb2NrKSB7Ci0JCQl0aGlzLnByaW50SW5kZW50KCk7Ci0JCQlzdXBlci53cml0ZShjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFdyaXRlIGEgcG9ydGlvbiBvZiBhIHN0cmluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgcywgaW50IG9mZiwgaW50IGxlbikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJdGhpcy5wcmludEluZGVudCgpOwotCQkJc3VwZXIud3JpdGUocywgb2ZmLCBsZW4pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQnVtcCB0aGUgaW5kZW50IGxldmVsLgotCSAqLwotCXB1YmxpYyB2b2lkIGluZGVudCgpIHsKLQkJdGhpcy5pbmNyZW1lbnRJbmRlbnRMZXZlbCgpOwotCX0KLQotCS8qKgotCSAqIERlY3JlbWVudCB0aGUgaW5kZW50IGxldmVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZGVudCgpIHsKLQkJdGhpcy5kZWNyZW1lbnRJbmRlbnRMZXZlbCgpOwotCX0KLQotCS8qKgotCSAqIEJ1bXAgdGhlIGluZGVudCBsZXZlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbmNyZW1lbnRJbmRlbnRMZXZlbCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKLQkJCXRoaXMuaW5kZW50TGV2ZWwrKzsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlY3JlbWVudCB0aGUgaW5kZW50IGxldmVsLgotCSAqLwotCXB1YmxpYyB2b2lkIGRlY3JlbWVudEluZGVudExldmVsKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJdGhpcy5pbmRlbnRMZXZlbC0tOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IGluZGVudCBsZXZlbC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEluZGVudExldmVsKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJcmV0dXJuIHRoaXMuaW5kZW50TGV2ZWw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBbGxvdyB0aGUgaW5kZW50IGxldmVsIHRvIGJlIHNldCBkaXJlY3RseS4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIGluZGVudCBsZXZlbC4KLQkgKi8KLQlwdWJsaWMgaW50IHNldEluZGVudExldmVsKGludCBpbmRlbnRMZXZlbCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJaW50IG9sZCA9IHRoaXMuaW5kZW50TGV2ZWw7Ci0JCQl0aGlzLmluZGVudExldmVsID0gaW5kZW50TGV2ZWw7Ci0JCQlyZXR1cm4gb2xkOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9KYXZhVHlwZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvSmF2YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIwMTlkNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9KYXZhVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5OwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBkZXNjcmliZXMgYSBKYXZhIHR5cGU7IGkuZS4gaXRzICJlbGVtZW50IHR5cGUiCi0gKiBhbmQgaXRzICJhcnJheSBkZXB0aCIuIFRoZSBlbGVtZW50IHR5cGUgaXMgcmVmZXJlbmNlZCBieSBuYW1lLAotICogYWxsb3dpbmcgdXMgdG8gcmVmZXJlbmNlIGNsYXNzZXMgdGhhdCBhcmUgbm90IChvciBjYW5ub3QgYmUpIGxvYWRlZC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFUeXBlIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdHlwZSdzICJlbGVtZW50IHR5cGUiLgotCSAqIEEgbWVtYmVyIHR5cGUgd2lsbCBoYXZlIG9uZSBvciBtb3JlIDxjb2RlPickJzwvY29kZT4gY2hhcmFjdGVycyBpbiBpdHMgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RWxlbWVudFR5cGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUncyAiYXJyYXkgZGVwdGgiLgotCSAqLwotCWludCBnZXRBcnJheURlcHRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBpcyBhbiBhcnJheSAoaS5lLiBpdHMgImFycmF5IGRlcHRoIiBpcyBncmVhdGVyCi0JICogdGhhbiB6ZXJvKS4KLQkgKi8KLQlib29sZWFuIGlzQXJyYXkoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGlzIGEgInByaW1pdGl2ZSIgKGUuZy4gPGNvZGU+aW50PC9jb2RlPiwgPGNvZGU+ZmxvYXQ8L2NvZGU+KS4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiA8Y29kZT52b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZTwvY29kZT4KLQkgKi8KLQlib29sZWFuIGlzUHJpbWl0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBpcyBhICJwcmltaXRpdmUgd3JhcHBlciIgKGUuZy4ge0BsaW5rIGphdmEubGFuZy5JbnRlZ2VyfSwKLQkgKiB7QGxpbmsgamF2YS5sYW5nLkZsb2F0fSkuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gPGNvZGU+dm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWU8L2NvZGU+Ci0JICovCi0JYm9vbGVhbiBpc1ByaW1pdGl2ZVdyYXBwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGlzIGEgInZhcmlhYmxlIHByaW1pdGl2ZSIgKGUuZy4gPGNvZGU+aW50PC9jb2RlPiwgPGNvZGU+ZmxvYXQ8L2NvZGU+LAotCSAqIGJ1dCBub3QgPGNvZGU+dm9pZDwvY29kZT4pLgotCSAqIDxwPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IHZhcmlhYmxlcyBjYW5ub3QgYmUgZGVjbGFyZWQgPGNvZGU+dm9pZDwvY29kZT4KLQkgKi8KLQlib29sZWFuIGlzVmFyaWFibGVQcmltaXRpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGlzIGEgInZhcmlhYmxlIHByaW1pdGl2ZSB3cmFwcGVyIiAoZS5nLgotCSAqIHtAbGluayBqYXZhLmxhbmcuSW50ZWdlcn0sIHtAbGluayBqYXZhLmxhbmcuRmxvYXR9LAotCSAqIGJ1dCBub3Qge0BsaW5rIGphdmEubGFuZy5Wb2lkfSkuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gdmFyaWFibGVzIGNhbm5vdCBiZSBkZWNsYXJlZCA8Y29kZT52b2lkPC9jb2RlPgotCSAqLwotCWJvb2xlYW4gaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSdzIGVsZW1lbnQgdHlwZSBhbmQgYXJyYXkgZGVwdGguCi0JICovCi0JQ2xhc3M8Pz4gZ2V0SmF2YUNsYXNzKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIHR5cGUncyBuYW1lIHRoYXQgbWF0Y2hlcyB0aGF0Ci0JICogcmV0dXJuZWQgYnkge0BsaW5rIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCl9Ci0JICogKGUuZy4gPGNvZGU+IltbSiI8L2NvZGU+LCA8Y29kZT4iW0xqYXZhLmxhbmcuT2JqZWN0OyI8L2NvZGU+LAotCSAqIDxjb2RlPiJqYXZhLnV0aWwuTWFwJEVudHJ5IjwvY29kZT4pLgotCSAqLwotCVN0cmluZyBnZXRKYXZhQ2xhc3NOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICovCi0JYm9vbGVhbiBlcXVhbHMoU3RyaW5nIG90aGVyRWxlbWVudFR5cGVOYW1lLCBpbnQgb3RoZXJBcnJheURlcHRoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGRlc2NyaWJlcyB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICovCi0JYm9vbGVhbiBkZXNjcmliZXMoU3RyaW5nIGNsYXNzTmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBkZXNjcmliZXMgdG8gdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqLwotCWJvb2xlYW4gZGVzY3JpYmVzKENsYXNzPD8+IGphdmFDbGFzcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICovCi0JYm9vbGVhbiBlcXVhbHMoSmF2YVR5cGUgb3RoZXIpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSB0eXBlJ3MgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGluIHNvdXJjZSBjb2RlOjx1bD4KLQkgKiA8bGk+PGNvZGU+IltbSiI8L2NvZGU+ID0+IDxjb2RlPiJsb25nW11bXSI8L2NvZGU+Ci0JICogPGxpPjxjb2RlPiJqYXZhLnV0aWwuTWFwJEVudHJ5IjwvY29kZT4gPT4gPGNvZGU+ImphdmEudXRpbC5NYXAuRW50cnkiPC9jb2RlPgotCSAqIDwvdWw+Ci0JICovCi0JU3RyaW5nIGRlY2xhcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHZlcnNpb24gb2YgdGhlIHR5cGUncyBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgaW4gc291cmNlIGNvZGU6PHVsPgotCSAqIDxsaT48Y29kZT4iW1tKIjwvY29kZT4gPT4gPGNvZGU+ImxvbmdbXVtdIjwvY29kZT4KLQkgKiA8bGk+PGNvZGU+ImphdmEudXRpbC5NYXAkRW50cnkiPC9jb2RlPiA9PiA8Y29kZT4iamF2YS51dGlsLk1hcC5FbnRyeSI8L2NvZGU+Ci0JICogPC91bD4KLQkgKi8KLQl2b2lkIGFwcGVuZERlY2xhcmF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0KLQkvKioKLQkgKiBQcmludCB0aGUgdmVyc2lvbiBvZiB0aGUgdHlwZSdzIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBpbiBzb3VyY2UgY29kZTo8dWw+Ci0JICogPGxpPjxjb2RlPiJbW0oiPC9jb2RlPiA9PiA8Y29kZT4ibG9uZ1tdW10iPC9jb2RlPgotCSAqIDxsaT48Y29kZT4iamF2YS51dGlsLk1hcCRFbnRyeSI8L2NvZGU+ID0+IDxjb2RlPiJqYXZhLnV0aWwuTWFwLkVudHJ5IjwvY29kZT4KLQkgKiA8L3VsPgotCSAqLwotCXZvaWQgcHJpbnREZWNsYXJhdGlvbk9uKFByaW50V3JpdGVyIHB3KTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvTWV0aG9kU2lnbmF0dXJlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9NZXRob2RTaWduYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJlNzkzYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9NZXRob2RTaWduYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5OwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZGVzY3JpYmVzIGEgSmF2YSBtZXRob2Qgc2lnbmF0dXJlOyBpLmUuIGl0cyAibmFtZSIKLSAqIGFuZCBpdHMgInBhcmFtZXRlciB0eXBlcyIuIFRoZSBwYXJhbWV0ZXIgdHlwZXMgYXJlIHJlZmVyZW5jZWQgYnkgbmFtZSwKLSAqIGFsbG93aW5nIHVzIHRvIHJlZmVyZW5jZSBjbGFzc2VzIHRoYXQgYXJlIG5vdCAob3IgY2Fubm90IGJlKSBsb2FkZWQuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RTaWduYXR1cmUgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QncyBuYW1lLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCdzIHBhcmFtZXRlciB0eXBlcy4KLQkgKi8KLQlKYXZhVHlwZVtdIGdldFBhcmFtZXRlclR5cGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWV0aG9kIHNpZ25hdHVyZSBkZXNjcmliZXMgdGhlIHNwZWNpZmllZCBtZXRob2QuCi0JICovCi0JYm9vbGVhbiBkZXNjcmliZXMoTWV0aG9kIG1ldGhvZCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWV0aG9kIHNpZ25hdHVyZSBlcXVhbHMgdGhlIHNwZWNpZmllZCBzaWduYXR1cmUuCi0JICovCi0JYm9vbGVhbiBlcXVhbHMoU3RyaW5nIG90aGVyTmFtZSwgSmF2YVR5cGVbXSBvdGhlclBhcmFtZXRlclR5cGVzKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtZXRob2Qgc2lnbmF0dXJlIGVxdWFscyB0aGUgc3BlY2lmaWVkIHNpZ25hdHVyZS4KLQkgKi8KLQlib29sZWFuIGVxdWFscyhNZXRob2RTaWduYXR1cmUgb3RoZXIpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXRob2QncyBzaWduYXR1cmU6PHA+Ci0JICogPGNvZGU+ImZvbyhpbnQsIGphdmEubGFuZy5TdHJpbmcpIjwvY29kZT4KLQkgKi8KLQlTdHJpbmcgZ2V0U2lnbmF0dXJlKCk7Ci0KLQkvKioKLQkgKiBBcHBlbmQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1ldGhvZCdzIHNpZ25hdHVyZTo8cD4KLQkgKiA8Y29kZT4iZm9vKGludCwgamF2YS5sYW5nLlN0cmluZykiPC9jb2RlPgotCSAqLwotCXZvaWQgYXBwZW5kU2lnbmF0dXJlVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0KLQkvKioKLQkgKiBQcmludCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kJ3Mgc2lnbmF0dXJlOjxwPgotCSAqIDxjb2RlPiJmb28oaW50LCBqYXZhLmxhbmcuU3RyaW5nKSI8L2NvZGU+Ci0JICovCi0Jdm9pZCBwcmludFNpZ25hdHVyZU9uKFByaW50V3JpdGVyIHB3KTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvTW9kaWZpYWJsZU9iamVjdFJlZmVyZW5jZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvTW9kaWZpYWJsZU9iamVjdFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmJkMGE3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L01vZGlmaWFibGVPYmplY3RSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5OwotCi0vKioKLSAqIFByb3ZpZGUgYSBjb250YWluZXIgZm9yIHBhc3NpbmcgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIGNoYW5nZWQgYnkgdGhlIHJlY2lwaWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBNb2RpZmlhYmxlT2JqZWN0UmVmZXJlbmNlPFY+Ci0JZXh0ZW5kcyBPYmplY3RSZWZlcmVuY2U8Vj4KLXsKLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlLgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JViBzZXRWYWx1ZShWIHZhbHVlKTsKLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlWIHNldE51bGwoKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L09iamVjdFJlZmVyZW5jZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvT2JqZWN0UmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YjZiYTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvT2JqZWN0UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTsKLQotLyoqCi0gKiBQcm92aWRlIGEgY29udGFpbmVyIGZvciBob2xkaW5nIGFuIG9iamVjdCB0aGF0IGNhbm5vdCBiZSBjaGFuZ2VkLgotICogCi0gKiBAc2VlIE1vZGlmaWFibGVPYmplY3RSZWZlcmVuY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBPYmplY3RSZWZlcmVuY2U8Vj4gewotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZS4KLQkgKi8KLQlWIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCWJvb2xlYW4gdmFsdWVFcXVhbHMoT2JqZWN0IG9iamVjdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIHZhbHVlTm90RXF1YWwoT2JqZWN0IG9iamVjdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlib29sZWFuIGlzTnVsbCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCWJvb2xlYW4gaXNOb3ROdWxsKCk7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9jb21tYW5kL0NvbW1hbmQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2NvbW1hbmQvQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTdiZDU2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2NvbW1hbmQvQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBTaW1wbGUgaW50ZXJmYWNlIGZvciBpbXBsZW1lbnRpbmcgdGhlIEdPRiBDb21tYW5kIGRlc2lnbiBwYXR0ZXJuLAotICogYW5kIGl0IGRvZXNuJ3QgY2FycnkgdGhlIGJhZ2dhZ2Ugb2Yge0BsaW5rIGphdmEubGFuZy5SdW5uYWJsZX0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1hbmQKLQlleHRlbmRzIEludGVycnVwdGlibGVDb21tYW5kCi17Ci0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4gVGhlIHNlbWFudGljcyBvZiB0aGUgY29tbWFuZAotCSAqIGlzIGRldGVybWluZWQgYnkgdGhlIGNvbnRyYWN0IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyLgotCSAqLwotCXZvaWQgZXhlY3V0ZSgpOwotCi0KLQkvKioKLQkgKiBTaW5nbGV0b24gaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbW1hbmQgaW50ZXJmYWNlIHRoYXQgd2lsbCBkbyBub3RoaW5nCi0JICogd2hlbiBleGVjdXRlZC4KLQkgKi8KLQlmaW5hbCBjbGFzcyBOdWxsCi0JCWltcGxlbWVudHMgQ29tbWFuZCwgU2VyaWFsaXphYmxlCi0JewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1hbmQgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQlwdWJsaWMgc3RhdGljIENvbW1hbmQgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21tYW5kIGludGVyZmFjZSB0aGF0IHdpbGwgdGhyb3cgYW4KLQkgKiBleGNlcHRpb24gd2hlbiBleGVjdXRlZC4KLQkgKi8KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZAotCQlpbXBsZW1lbnRzIENvbW1hbmQsIFNlcmlhbGl6YWJsZQotCXsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBDb21tYW5kIElOU1RBTkNFID0gbmV3IERpc2FibGVkKCk7Ci0JCXB1YmxpYyBzdGF0aWMgQ29tbWFuZCBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvY29tbWFuZC9Db21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2NvbW1hbmQvQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YzhhZjYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvY29tbWFuZC9Db21tYW5kRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgYWxsb3dzIGNsaWVudHMgdG8gY29udHJvbCBob3cgYSBjb21tYW5kIGlzIGV4ZWN1dGVkLgotICogVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgc2VydmVyIHByb3ZpZGVzIHRoZSBjb21tYW5kIGJ1dCB0aGUgY2xpZW50IHByb3ZpZGVzCi0gKiB0aGUgY29udGV4dCAoZS5nLiB0aGUgY2xpZW50IHdvdWxkIGxpa2UgdG8gZGlzcGF0Y2ggdGhlIGNvbW1hbmQgdG8gdGhlIFVJCi0gKiB0aHJlYWQpLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tYW5kRXhlY3V0b3IgewotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQsIHN5bmNocm9ub3VzbHkgb3IgYXN5bmNocm9ub3VzbHkuCi0JICogVGhlIGNvbW1hbmRzIHRoZW1zZWx2ZXMgbXVzdCBiZSBleGVjdXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2gKLQkgKiB0aGV5IGFyZSBwYXNzZWQgdG8gdGhlIGNvbW1hbmQgZXhlY3V0b3IgKGF0IGxlYXN0IHdoZW4gcGFzc2VkCi0JICogZnJvbSBjbGllbnRzIGV4ZWN1dGluZyBvbiB0aGUgc2FtZSB0aHJlYWQpLgotCSAqLwotCXZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpOwotCi0KLQkvKioKLQkgKiBTaW5nbGV0b24gaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbW1hbmQgZXhlY3V0b3IgaW50ZXJmYWNlCi0JICogdGhhdCBzaW1wbHkgZXhlY3V0ZXMgdGhlIGNvbW1hbmQgd2l0aG91dCBhbnkgc29ydCBvZiBlbmhhbmNlbWVudC4KLQkgKi8KLQlmaW5hbCBjbGFzcyBEZWZhdWx0Ci0JCWltcGxlbWVudHMgQ29tbWFuZEV4ZWN1dG9yLCBTZXJpYWxpemFibGUKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tbWFuZEV4ZWN1dG9yIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJcHVibGljIHN0YXRpYyBDb21tYW5kRXhlY3V0b3IgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIERlZmF1bHQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tbWFuZCBleGVjdXRvciBpbnRlcmZhY2UKLQkgKiB0aGF0IGlnbm9yZXMgYW55IGNvbW1hbmRzLgotCSAqLwotCWZpbmFsIGNsYXNzIEluYWN0aXZlCi0JCWltcGxlbWVudHMgQ29tbWFuZEV4ZWN1dG9yLCBTZXJpYWxpemFibGUKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tbWFuZEV4ZWN1dG9yIElOU1RBTkNFID0gbmV3IEluYWN0aXZlKCk7Ci0JCXB1YmxpYyBzdGF0aWMgQ29tbWFuZEV4ZWN1dG9yIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBJbmFjdGl2ZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9jb21tYW5kL0V4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9jb21tYW5kL0V4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYmI1YzUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvY29tbWFuZC9FeHRlbmRlZENvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZXh0ZW5kcyB0aGUgbm9ybWFsIGNvbW1hbmQgZXhlY3V0b3I7IGl0IGFsbG93cyB0aGUgY2xpZW50Ci0gKiB0byBzcGVjaWZ5IHdoZW4gYSBjb21tYW5kIDxlbT5tdXN0PC9lbT4gYmUgZXhlY3V0ZWQgc3luY2hyb25vdXNseS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IKLQlleHRlbmRzIENvbW1hbmRFeGVjdXRvcgotewotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBpcyBleGVjdXRlZC4KLQkgKiBUaGUgY29tbWFuZCBpdHNlbGYgbXVzdCBiZSBleGVjdXRlZCA8ZW0+YWZ0ZXI8L2VtPiBhbnkgb3RoZXIgY29tbWFuZHMKLQkgKiBwcmV2aW91c2x5IHBhc3NlZCB0byB0aGUgY29tbWFuZCBleGVjdXRvciAoYXQgbGVhc3Qgd2hlbiBwYXNzZWQKLQkgKiBmcm9tIGNsaWVudHMgZXhlY3V0aW5nIG9uIHRoZSBzYW1lIHRocmVhZCkuCi0JICogQHNlZSAjZXhlY3V0ZShDb21tYW5kKQotCSAqLwotCXZvaWQgd2FpdFRvRXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBpcyBleGVjdXRlZAotCSAqIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYKLQkgKiB0aGUgY29tbWFuZCB3YXMgZXhlY3V0ZWQgaW4gdGhlIGFsbG90dGVkIHRpbWU7Ci0JICogcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkIGFuZCB0aGUgY29tbWFuZCB3YXMKLQkgKiA8ZW0+bm90PC9lbT4gZXhlY3V0ZWQuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqIDxwPgotCSAqIFRoZSBjb21tYW5kIGl0c2VsZiBtdXN0IGJlIGV4ZWN1dGVkIDxlbT5hZnRlcjwvZW0+IGFueSBvdGhlciBjb21tYW5kcwotCSAqIHByZXZpb3VzbHkgcGFzc2VkIHRvIHRoZSBjb21tYW5kIGV4ZWN1dG9yIChhdCBsZWFzdCB3aGVuIHBhc3NlZAotCSAqIGZyb20gY2xpZW50cyBleGVjdXRpbmcgb24gdGhlIHNhbWUgdGhyZWFkKS4KLQkgKiBAc2VlICNleGVjdXRlKENvbW1hbmQpCi0JICovCi0JYm9vbGVhbiB3YWl0VG9FeGVjdXRlKENvbW1hbmQgY29tbWFuZCwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tbWFuZCBleGVjdXRvciBpbnRlcmZhY2UKLQkgKiB0aGF0IHNpbXBseSBleGVjdXRlcyB0aGUgY29tbWFuZCB3aXRob3V0IGFueSBzb3J0IG9mIGVuaGFuY2VtZW50LgotCSAqLwotCWZpbmFsIGNsYXNzIERlZmF1bHQKLQkJaW1wbGVtZW50cyBFeHRlbmRlZENvbW1hbmRFeGVjdXRvciwgU2VyaWFsaXphYmxlCi0JewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJcHVibGljIHN0YXRpYyBFeHRlbmRlZENvbW1hbmRFeGVjdXRvciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGVmYXVsdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdhaXRUb0V4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9FeGVjdXRlKENvbW1hbmQgY29tbWFuZCwgbG9uZyB0aW1lb3V0KSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21tYW5kIGV4ZWN1dG9yIGludGVyZmFjZQotCSAqIHRoYXQgaWdub3JlcyBhbnkgY29tbWFuZHMuCi0JICovCi0JZmluYWwgY2xhc3MgSW5hY3RpdmUKLQkJaW1wbGVtZW50cyBFeHRlbmRlZENvbW1hbmRFeGVjdXRvciwgU2VyaWFsaXphYmxlCi0JewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yIElOU1RBTkNFID0gbmV3IEluYWN0aXZlKCk7Ci0JCXB1YmxpYyBzdGF0aWMgRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIEluYWN0aXZlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdhaXRUb0V4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJcHVibGljIGJvb2xlYW4gd2FpdFRvRXhlY3V0ZShDb21tYW5kIGNvbW1hbmQsIGxvbmcgdGltZW91dCkgewotCQkJLy8gZG8gbm90aGluZwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvY29tbWFuZC9JbnRlcnJ1cHRpYmxlQ29tbWFuZC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvY29tbWFuZC9JbnRlcnJ1cHRpYmxlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2JmYWE3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2NvbW1hbmQvSW50ZXJydXB0aWJsZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogU2ltcGxlIGludGVyZmFjZSBmb3IgaW1wbGVtZW50aW5nIHRoZSBHT0YgQ29tbWFuZCBkZXNpZ24gcGF0dGVybgotICogYW5kIGFsbG93cyBmb3IgdGhlIGNvbW1hbmQgdG8gdGhyb3cgYW4ge0BsaW5rIEludGVycnVwdGVkRXhjZXB0aW9ufS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEludGVycnVwdGlibGVDb21tYW5kIHsKLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuIFRoZSBzZW1hbnRpY3Mgb2YgdGhlIGNvbW1hbmQKLQkgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlci4KLQkgKi8KLQl2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJydXB0aWJsZSBjb21tYW5kIGludGVyZmFjZSB0aGF0Ci0JICogd2lsbCB0aHJvdyBhbiBpbnRlcnJ1cHRlZCBleGNlcHRpb24gd2hlbiBleGVjdXRlZC4KLQkgKi8KLQlmaW5hbCBjbGFzcyBJbnRlcnJ1cHRlZAotCQlpbXBsZW1lbnRzIEludGVycnVwdGlibGVDb21tYW5kLCBTZXJpYWxpemFibGUKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZXJydXB0aWJsZUNvbW1hbmQgSU5TVEFOQ0UgPSBuZXcgSW50ZXJydXB0ZWQoKTsKLQkJcHVibGljIHN0YXRpYyBJbnRlcnJ1cHRpYmxlQ29tbWFuZCBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgSW50ZXJydXB0ZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2NvbW1hbmQvSW50ZXJydXB0aWJsZUNvbW1hbmRFeGVjdXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvY29tbWFuZC9JbnRlcnJ1cHRpYmxlQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZWM0ZDEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvY29tbWFuZC9JbnRlcnJ1cHRpYmxlQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBjbGllbnRzIHRvIGNvbnRyb2wgaG93IGFuIGludGVycnVwdGlibGUgY29tbWFuZCBpcyBleGVjdXRlZC4KLSAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIHNlcnZlciBwcm92aWRlcyB0aGUgY29tbWFuZCBidXQgdGhlIGNsaWVudCBwcm92aWRlcwotICogdGhlIGNvbnRleHQgKGUuZy4gdGhlIGNsaWVudCB3b3VsZCBsaWtlIHRvIGRpc3BhdGNoIHRoZSBjb21tYW5kIHRvIHRoZSBVSQotICogdGhyZWFkKS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZEV4ZWN1dG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW50ZXJydXB0aWJsZUNvbW1hbmRFeGVjdXRvciB7Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZC4KLQkgKi8KLQl2b2lkIGV4ZWN1dGUoSW50ZXJydXB0aWJsZUNvbW1hbmQgY29tbWFuZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uOwotCi0KLQkvKioKLQkgKiBTaW5nbGV0b24gaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVycnVwdGlibGUgY29tbWFuZCBleGVjdXRvciBpbnRlcmZhY2UKLQkgKiB0aGF0IHNpbXBseSBleGVjdXRlcyB0aGUgY29tbWFuZCB3aXRob3V0IGFueSBzb3J0IG9mIGVuaGFuY2VtZW50LgotCSAqLwotCWZpbmFsIGNsYXNzIERlZmF1bHQKLQkJaW1wbGVtZW50cyBJbnRlcnJ1cHRpYmxlQ29tbWFuZEV4ZWN1dG9yLCBTZXJpYWxpemFibGUKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZXJydXB0aWJsZUNvbW1hbmRFeGVjdXRvciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0KCk7Ci0JCXB1YmxpYyBzdGF0aWMgSW50ZXJydXB0aWJsZUNvbW1hbmRFeGVjdXRvciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGVmYXVsdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZShJbnRlcnJ1cHRpYmxlQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvY29tbWFuZC9Ob3RpZnlpbmdSZXBlYXRpbmdDb21tYW5kLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9jb21tYW5kL05vdGlmeWluZ1JlcGVhdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA3NmEyMC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9jb21tYW5kL05vdGlmeWluZ1JlcGVhdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEV4dGVuZCB0aGUgcmVwZWF0aW5nIGNvbW1hbmQgdG8gc3VwcG9ydCBsaXN0ZW5lcnMgdGhhdCBhcmUgbm90aWZpZWQKLSAqIHdoZW4gYW4gZXhlY3V0aW9uICJjeWNsZSIgaXMgY29tcGxldGU7IGkuZS4gdGhlIGNvbW1hbmQgaGFzLAotICogZm9yIHRoZSBtb21lbnQsIGhhbmRsZWQgZXZlcnkgZXhlY3V0aW9uIHJlcXVlc3QgYW5kIHF1aWVzY2VkLgotICogVGhpcyBub3RpZmljYXRpb24gaXMgPGVtPm5vdDwvZW0+IGd1YXJhbnRlZWQgdG8gb2NjdXIgd2l0aCA8ZW0+ZXZlcnk8L2VtPgotICogZXhlY3V0aW9uICJjeWNsZSI7IHNpbmNlIG90aGVyLCB1bnJlbGF0ZWQsIGV4ZWN1dGlvbnMgY2FuIGJlIHRyaWdnZXJlZAotICogY29uY3VycmVudGx5LCBjYXVzaW5nIHRoZSAiY3ljbGUiIHRvIGNvbnRpbnVlLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBOb3RpZnlpbmdSZXBlYXRpbmdDb21tYW5kCi0JZXh0ZW5kcyBSZXBlYXRpbmdDb21tYW5kCi17Ci0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIuCi0JICovCi0Jdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBsaXN0ZW5lci4KLQkgKi8KLQl2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgbGlzdGVuZXJzIHRvIGJlIG5vdGlmaWVkIHdoZW5ldmVyIHRoZQotCSAqIGNvbW1hbmQgaGFzIHF1aWVzY2VkLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTGlzdGVuZXIKLQkJZXh0ZW5kcyBFdmVudExpc3RlbmVyCi0JewotCQkvKioKLQkJICogVGhlIHNwZWNpZmllZCBjb21tYW5kIGhhcyBxdWllc2NlZC4KLQkJICovCi0JCXZvaWQgZXhlY3V0aW9uUXVpZXNjZWQoQ29tbWFuZCBjb21tYW5kKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbnVsbCBzaW5nbGV0b24gKioqKioqKioqKgotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBub3RpZnlpbmcgcmVwZWF0aW5nIGNvbW1hbmQgaW50ZXJmYWNlCi0JICogdGhhdCB3aWxsIGRvIG5vdGhpbmcgd2hlbiBleGVjdXRlZC4KLQkgKi8KLQlmaW5hbCBjbGFzcyBOdWxsCi0JCWltcGxlbWVudHMgTm90aWZ5aW5nUmVwZWF0aW5nQ29tbWFuZCwgU2VyaWFsaXphYmxlCi0JewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIE5vdGlmeWluZ1JlcGVhdGluZ0NvbW1hbmQgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQlwdWJsaWMgc3RhdGljIE5vdGlmeWluZ1JlcGVhdGluZ0NvbW1hbmQgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvY29tbWFuZC9SZXBlYXRpbmdDb21tYW5kLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9jb21tYW5kL1JlcGVhdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczZjJjMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9jb21tYW5kL1JlcGVhdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIHdpbGwgZXhlY3V0ZSByZXBlYXRlZGx5IHRoZSBtaW5pbXVtCi0gKiBudW1iZXIgb2YgdGltZXMuIFRoZSBhc3N1bXB0aW9uIGlzIHRoZSBjb21tYW5kJ3MgZWZmZWN0cyBhcmUKLSAqIGN1bXVsYXRpdmUoPyk7IGkuZS4gdGhlIGN1bXVsYXRpdmUgcmVzdWx0IG9mIG11bHRpcGxlIGV4ZWN1dGlvbnMgb2YgdGhlCi0gKiBjb21tYW5kIGlzIG5vIGRpZmZlcmVudCB0aGFuIHRoZSByZXN1bHQgb2YgYSBzaW5nbGUgZXhlY3V0aW9uIG9mIHRoZSBjb21tYW5kLgotICogT25jZSB0aGUgY29tbWFuZCBpcyBleGVjdXRpbmcsIGFueSBmdXJ0aGVyIHJlcXVlc3RzIHRvIGV4ZWN1dGUgc2ltcGx5IHRyaWdnZXIKLSAqIGEgcmUtZXhlY3V0aW9uIG9mIHRoZSBjb21tYW5kIG9uY2UgaXQgaGFzIGZpbmlzaGVkIGl0cyBjdXJyZW50IGV4ZWN1dGlvbi4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVwZWF0aW5nQ29tbWFuZAotCWV4dGVuZHMgQ29tbWFuZAotewotCS8qKgotCSAqIFN0YXJ0IHRoZSBjb21tYW5kLCBhbGxvd2luZyBpdCB0byBiZWdpbiBleGVjdXRpbmcgd2l0aCB0aGUgbmV4dCBjYWxsIHRvCi0JICoge0BsaW5rICNleGVjdXRlKCl9LgotCSAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdoZW4gdGhlIGNvbW1hbmQgaXMgbm90IHN0b3BwZWQKLQkgKi8KLQl2b2lkIHN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTdG9wIHRoZSBjb21tYW5kOyBpZ25vcmUgZnVydGhlciBjYWxscyB0byB7QGxpbmsgI2V4ZWN1dGUoKX0uCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gd2hlbiB0aGUgY29tbWFuZCBleGVjdXRvciBpcyBub3Qgc3RhcnRlZAotCSAqLwotCXZvaWQgc3RvcCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXBlYXRpbmcgY29tbWFuZCBpbnRlcmZhY2UgdGhhdCB3aWxsIGRvCi0JICogbm90aGluZyB3aGVuIGV4ZWN1dGVkLgotCSAqLwotCWZpbmFsIGNsYXNzIE51bGwKLQkJaW1wbGVtZW50cyBSZXBlYXRpbmdDb21tYW5kLCBTZXJpYWxpemFibGUKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVwZWF0aW5nQ29tbWFuZCBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCXB1YmxpYyBzdGF0aWMgUmVwZWF0aW5nQ29tbWFuZCBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgTnVsbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2NvbW1hbmQvU3RhdGVmdWxDb21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2NvbW1hbmQvU3RhdGVmdWxDb21tYW5kRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlNjZmNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9jb21tYW5kL1N0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kOwotCi0vKioKLSAqIEFkZCB0aGUgYWJpbGl0eSB0byBzdGFydCBhbmQgc3RvcCB0aGUgY29tbWFuZCBleGVjdXRvci4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RhdGVmdWxDb21tYW5kRXhlY3V0b3IKLQlleHRlbmRzIENvbW1hbmRFeGVjdXRvcgotewotCS8qKgotCSAqIFN0YXJ0IHRoZSBjb21tYW5kIGV4ZWN1dG9yLgotCSAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdoZW4gdGhlIGNvbW1hbmQgZXhlY3V0b3IgaXMgbm90IHN0b3BwZWQKLQkgKi8KLQl2b2lkIHN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTdG9wIHRoZSBjb21tYW5kIGV4ZWN1dG9yLgotCSAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdoZW4gdGhlIGNvbW1hbmQgZXhlY3V0b3IgaXMgbm90IHN0YXJ0ZWQKLQkgKi8KLQl2b2lkIHN0b3AoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9jb21tYW5kL1N0YXRlZnVsRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2NvbW1hbmQvU3RhdGVmdWxFeHRlbmRlZENvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjg3NGZhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2NvbW1hbmQvU3RhdGVmdWxFeHRlbmRlZENvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZDsKLQotLyoqCi0gKiBBZGQgdGhlIGFiaWxpdHkgdG8gc3RhcnQgYW5kIHN0b3AgdGhlIGNvbW1hbmQgZXhlY3V0b3IuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXRlZnVsRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IKLQlleHRlbmRzIFN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yLCBFeHRlbmRlZENvbW1hbmRFeGVjdXRvcgotewotCS8vIGNvbWJpbmUgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQWJzdHJhY3RBc3NvY2lhdGlvbi5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQWJzdHJhY3RBc3NvY2lhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDRkOTVjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0Fic3RyYWN0QXNzb2NpYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIEltcGxlbWVudCBzb21lIG9mIHRoZSBtZXRob2RzIGluIHtAbGluayBBc3NvY2lhdGlvbn0gdGhhdCBjYW4KLSAqIGJlIGRlZmluZWQgaW4gdGVybXMgb2YgdGhlIG90aGVyIG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFzc29jaWF0aW9uPEssIFY+Ci0JaW1wbGVtZW50cyBBc3NvY2lhdGlvbjxLLCBWPgotewotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0QXNzb2NpYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBBc3NvY2lhdGlvbjw/LCA/PikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlBc3NvY2lhdGlvbjw/LCA/PiBvdGhlciA9IChBc3NvY2lhdGlvbjw/LCA/PikgbzsKLQkJcmV0dXJuIHRoaXMua2V5RXF1YWxzKG90aGVyKSAmJiB0aGlzLnZhbHVlRXF1YWxzKG90aGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBrZXlFcXVhbHMoQXNzb2NpYXRpb248PywgPz4gb3RoZXIpIHsKLQkJT2JqZWN0IGtleSA9IHRoaXMuZ2V0S2V5KCk7Ci0JCXJldHVybiAoa2V5ID09IG51bGwpID8KLQkJCQkob3RoZXIuZ2V0S2V5KCkgPT0gbnVsbCkgOgotCQkJCWtleS5lcXVhbHMob3RoZXIuZ2V0S2V5KCkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbHVlRXF1YWxzKEFzc29jaWF0aW9uPD8sID8+IG90aGVyKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/Ci0JCQkJKG90aGVyLmdldFZhbHVlKCkgPT0gbnVsbCkgOgotCQkJCXZhbHVlLmVxdWFscyhvdGhlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMua2V5SGFzaENvZGUoKSBeIHRoaXMudmFsdWVIYXNoQ29kZSgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQga2V5SGFzaENvZGUoKSB7Ci0JCU9iamVjdCBrZXkgPSB0aGlzLmdldEtleSgpOwotCQlyZXR1cm4gKGtleSA9PSBudWxsKSA/IDAgOiBrZXkuaGFzaENvZGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IHZhbHVlSGFzaENvZGUoKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IDAgOiB2YWx1ZS5oYXNoQ29kZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRLZXkoKSArICIgPT4gIiArIHRoaXMuZ2V0VmFsdWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQWJzdHJhY3RCb29sZWFuUmVmZXJlbmNlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9BYnN0cmFjdEJvb2xlYW5SZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU2ZjFiMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9BYnN0cmFjdEJvb2xlYW5SZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIENvbnZlbmllbmNlIGFic3RyYWN0IGNsYXNzIGZvciBib29sZWFuIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbnMuCi0gKiBTdWJjbGFzc2VzIG5lZWQgb25seSBpbXBsZW1lbnQ8dWw+Ci0gKiA8bGk+e0BsaW5rICNnZXRWYWx1ZSgpfQotICogPGxpPntAbGluayAjc2V0VmFsdWUoYm9vbGVhbil9Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCb29sZWFuUmVmZXJlbmNlCi0JaW1wbGVtZW50cyBNb2RpZmlhYmxlQm9vbGVhblJlZmVyZW5jZQotewotCXByb3RlY3RlZCBBYnN0cmFjdEJvb2xlYW5SZWZlcmVuY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXMoYm9vbGVhbiB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWx1ZSgpID09IHZhbHVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTm90KGJvb2xlYW4gdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsdWUoKSAhPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1RydWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGYWxzZSgpIHsKLQkJcmV0dXJuICEgdGhpcy5nZXRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGZsaXAoKSB7Ci0JCXJldHVybiB0aGlzLnNldFZhbHVlKCAhIHRoaXMuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2V0Tm90KGJvb2xlYW4gdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWUoICEgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNldFRydWUoKSB7Ci0JCXJldHVybiB0aGlzLnNldFZhbHVlKHRydWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNldEZhbHNlKCkgewotCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZShmYWxzZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogT2JqZWN0IGlkZW50aXR5IGlzIGNyaXRpY2FsIHRvIGJvb2xlYW4gcmVmZXJlbmNlcy4KLQkgKiBUaGVyZSBpcyBubyByZWFzb24gZm9yIHR3byBkaWZmZXJlbnQgYm9vbGVhbiByZWZlcmVuY2VzIHRvIGJlCi0JICogPGVtPmVxdWFsPC9lbT4uCi0JICogCi0JICogQHNlZSAjaXMoYm9vbGVhbikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSAjZXF1YWxzKE9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gJ1snICsgU3RyaW5nLnZhbHVlT2YodGhpcy5nZXRWYWx1ZSgpKSArICddJzsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9BYnN0cmFjdFRyYW5zZm9ybWVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9BYnN0cmFjdFRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YTRlMmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQWJzdHJhY3RUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgdHJhbnNmb3JtZXIgdGhhdCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBvcmlnaW5hbAotICogb2JqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+OyBvdGhlcndpc2UgaXQgY2FsbHMge0BsaW5rICN0cmFuc2Zvcm1fKE9iamVjdCl9LAotICogd2hpY2ggaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJhbnNmb3JtZXI8VDEsIFQyPgotCWV4dGVuZHMgVHJhbnNmb3JtZXJBZGFwdGVyPFQxLCBUMj4KLXsKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgVDIgdHJhbnNmb3JtKFQxIG8pIHsKLQkJcmV0dXJuIChvID09IG51bGwpID8gbnVsbCA6IHRoaXMudHJhbnNmb3JtXyhvKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBvYmplY3Q7IGl0cyB2YWx1ZSBpcyBndWFyYW50ZWVkIHRvIGJlIG5vdAotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBUMiB0cmFuc2Zvcm1fKFQxIG8pOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQXJyYXlUb29scy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQXJyYXlUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjE1MjAyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0FycmF5VG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci0KLS8qKgotICogQXJyYXktcmVsYXRlZCB1dGlsaXR5IG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBcnJheVRvb2xzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX09CSkVDVF9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gRU1QVFlfQ0hBUl9BUlJBWSA9IG5ldyBjaGFyWzBdOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gRU1QVFlfSU5UX0FSUkFZID0gbmV3IGludFswXTsKLQotCS8vICoqKioqKioqKiogaW5zdGFudGlhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgd2l0aCB0aGUgc2FtZSBsZW5ndGgKLQkgKiBhbmQgdGhlIHNhbWUgY29tcG9uZW50IHR5cGUgYXMgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubmV3QXJyYXkoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBuZXdBcnJheShFW10gYXJyYXkpIHsKLQkJcmV0dXJuIG5ld0FycmF5KGFycmF5LCBhcnJheS5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgbGVuZ3RoCi0JICogYW5kIHRoZSBzYW1lIGNvbXBvbmVudCB0eXBlIGFzIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLm5ld0FycmF5KE9iamVjdFtdIGFycmF5LCBpbnQgbGVuZ3RoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gbmV3QXJyYXkoRVtdIGFycmF5LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBuZXdBcnJheShjb21wb25lbnRUeXBlKGFycmF5KSwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBhcnJheSdzIGNvbXBvbmVudCB0eXBlLCB3aXRoIGFwcHJvcHJpYXRlIHN1cHBvcnQKLQkgKiBmb3IgZ2VuZXJpY3MuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQ2xhc3M8PyBleHRlbmRzIEU+IGNvbXBvbmVudFR5cGUoRVtdIGFycmF5KSB7Ci0JCUNsYXNzPD8+IHJhd0NvbXBvbmVudFR5cGUgPSBhcnJheS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUNsYXNzPD8gZXh0ZW5kcyBFPiBjb21wb25lbnRUeXBlID0gKENsYXNzPD8gZXh0ZW5kcyBFPikgcmF3Q29tcG9uZW50VHlwZTsKLQkJcmV0dXJuIGNvbXBvbmVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBjb21wb25lbnQgdHlwZSBhbmQgbGVuZ3RoLAotCSAqIHdpdGggYXBwcm9wcmlhdGUgc3VwcG9ydCBmb3IgZ2VuZXJpY3MuIFRoZSBjb21wb25lbnQgdHlwZSBjYW5ub3QgYmUgYQotCSAqIHByaW1pdGl2ZSB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBuZXdBcnJheShDbGFzczw/IGV4dGVuZHMgRT4gY29tcG9uZW50VHlwZSwgaW50IGxlbmd0aCkgewotCQlpZiAoY29tcG9uZW50VHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBcnJheSBjbGFzcyBjYW5ub3QgYmUgcHJpbWl0aXZlOiAiICsgY29tcG9uZW50VHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbmV3QXJyYXlfKGNvbXBvbmVudFR5cGUsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBjb21wb25lbnQgdHlwZSBpcyBub3QgYSBwcmltaXRpdmUgY2xhc3MKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIG5ld0FycmF5XyhDbGFzczw/IGV4dGVuZHMgRT4gY29tcG9uZW50VHlwZSwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gKEVbXSkgKChjb21wb25lbnRUeXBlID09IE9CSkVDVF9DTEFTUykgPwotCQkJCW5ldyBPYmplY3RbbGVuZ3RoXSA6Ci0JCQkJQXJyYXkubmV3SW5zdGFuY2UoY29tcG9uZW50VHlwZSwgbGVuZ3RoKSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPE9iamVjdD4gT0JKRUNUX0NMQVNTID0gT2JqZWN0LmNsYXNzOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnNpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS50b0FycmF5KCk8L2NvZGU+Ci0JICogQHNlZSBDb2xsZWN0aW9uI3RvQXJyYXkoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gYXJyYXkoSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGFycmF5KGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS50b0FycmF5KCk8L2NvZGU+Ci0JICogQHNlZSBDb2xsZWN0aW9uI3RvQXJyYXkoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gYXJyYXkoSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIGFycmF5KGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZTsKLQkgKiB0aGUgcnVudGltZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBhcnJheSBpcyB0aGF0IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogSWYgdGhlIGl0ZXJhYmxlIGZpdHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwgaXQgaXMgcmV0dXJuZWQgdGhlcmVpbi4KLQkgKiBPdGhlcndpc2UsIGEgbmV3IGFycmF5IGlzIGFsbG9jYXRlZCB3aXRoIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGFuZCB0aGUgc2l6ZSBvZiB0aGUgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUudG9BcnJheShPYmplY3RbXSk8L2NvZGU+Ci0JICogQHNlZSBDb2xsZWN0aW9uI3RvQXJyYXkoT2JqZWN0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFycmF5KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgRVtdIGFycmF5KSB7Ci0JCXJldHVybiBhcnJheShpdGVyYWJsZS5pdGVyYXRvcigpLCBhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZTsKLQkgKiB0aGUgcnVudGltZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBhcnJheSBpcyB0aGF0IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogSWYgdGhlIGl0ZXJhYmxlIGZpdHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwgaXQgaXMgcmV0dXJuZWQgdGhlcmVpbi4KLQkgKiBPdGhlcndpc2UsIGEgbmV3IGFycmF5IGlzIGFsbG9jYXRlZCB3aXRoIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGFuZCB0aGUgc2l6ZSBvZiB0aGUgaXRlcmFibGUuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS50b0FycmF5KE9iamVjdFtdKTwvY29kZT4KLQkgKiBAc2VlIENvbGxlY3Rpb24jdG9BcnJheShPYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYXJyYXkoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplLCBFW10gYXJyYXkpIHsKLQkJcmV0dXJuIGFycmF5KGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IudG9BcnJheSgpPC9jb2RlPgotCSAqIEBzZWUgQ29sbGVjdGlvbiN0b0FycmF5KCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGFycmF5KEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPwotCQkJCUNvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhdG9yKS50b0FycmF5KCkgOgotCQkJCUVNUFRZX09CSkVDVF9BUlJBWTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IudG9BcnJheSgpPC9jb2RlPgotCSAqIEBzZWUgQ29sbGVjdGlvbiN0b0FycmF5KCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGFycmF5KEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPwotCQkJCUNvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpLnRvQXJyYXkoKSA6Ci0JCQkJRU1QVFlfT0JKRUNUX0FSUkFZOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3I7Ci0JICogdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgYXJyYXkgaXMgdGhhdCBvZiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIElmIHRoZSBpdGVyYXRvciBmaXRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXksIGl0IGlzIHJldHVybmVkIHRoZXJlaW4uCi0JICogT3RoZXJ3aXNlLCBhIG5ldyBhcnJheSBpcyBhbGxvY2F0ZWQgd2l0aCB0aGUgcnVudGltZSB0eXBlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBhbmQgdGhlIHNpemUgb2YgdGhlIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLnRvQXJyYXkoT2JqZWN0W10pPC9jb2RlPgotCSAqIEBzZWUgQ29sbGVjdGlvbiN0b0FycmF5KE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhcnJheShJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIEVbXSBhcnJheSkgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8KLQkJCQlDb2xsZWN0aW9uVG9vbHMubGlzdChpdGVyYXRvcikudG9BcnJheShhcnJheSkgOgotCQkJCWVtcHR5QXJyYXkoYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3I7Ci0JICogdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgYXJyYXkgaXMgdGhhdCBvZiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIElmIHRoZSBpdGVyYXRvciBmaXRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXksIGl0IGlzIHJldHVybmVkIHRoZXJlaW4uCi0JICogT3RoZXJ3aXNlLCBhIG5ldyBhcnJheSBpcyBhbGxvY2F0ZWQgd2l0aCB0aGUgcnVudGltZSB0eXBlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBhbmQgdGhlIHNpemUgb2YgdGhlIGl0ZXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IudG9BcnJheShPYmplY3RbXSk8L2NvZGU+Ci0JICogQHNlZSBDb2xsZWN0aW9uI3RvQXJyYXkoT2JqZWN0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFycmF5KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSwgRVtdIGFycmF5KSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPwotCQkJCUNvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpLnRvQXJyYXkoYXJyYXkpIDoKLQkJCQllbXB0eUFycmF5KGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgc3BlY2lmaWVkIGFycmF5IGlzIGVtcHR5LCByZXR1cm4gaXQ7Ci0JICogb3RoZXJ3aXNlLCBzZXQgaXRzIGZpcnN0IGVsZW1lbnQgdG8gbnVsbC4KLQkgKiBAc2VlIENvbGxlY3Rpb24jdG9BcnJheShPYmplY3RbXSkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGVtcHR5QXJyYXkoRVtdIGFycmF5KSB7Ci0JCXJldHVybiAoYXJyYXkubGVuZ3RoID09IDApID8gYXJyYXkgOiBjbGVhckZpcnN0KGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNwZWNpZmllZCBhcnJheSdzIGZpcnN0IGVsZW1lbnQgdG8gbnVsbCBhbmQgYW5kIHJldHVybiB0aGUgYXJyYXkuCi0JICogQXNzdW1lIHRoZSBhcnJheSBsZW5ndGggPiAwLgotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gY2xlYXJGaXJzdChFW10gYXJyYXkpIHsKLQkJYXJyYXlbMF0gPSBudWxsOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkZCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGZvbGxvd2VkIGJ5IHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIGJlIGFkZGVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGQoT2JqZWN0W10gYXJyYXksIE9iamVjdCBvKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkKEVbXSBhcnJheSwgRSB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXksIGxlbiArIDEpOwotCQlpZiAobGVuID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBsZW4pOwotCQl9Ci0JCXJlc3VsdFtsZW5dID0gdmFsdWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFkZGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4LCBPYmplY3Qgbyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZChFW10gYXJyYXksIGludCBpbmRleCwgRSB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXksIGxlbiArIDEpOwotCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJfQotCQlyZXN1bHRbaW5kZXhdID0gdmFsdWU7Ci0JCWlmIChpbmRleCA8IGxlbikgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXgsIHJlc3VsdCwgaW5kZXggKyAxLCBsZW4gLSBpbmRleCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGZvbGxvd2VkIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUgdG8gYmUgYWRkZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZChjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGFkZChjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbiArIDFdOwotCQlpZiAobGVuID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBsZW4pOwotCQl9Ci0JCXJlc3VsdFtsZW5dID0gdmFsdWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgYWRkZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkKGNoYXJbXSBhcnJheSwgaW50IGluZGV4LCBjaGFyIHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBhZGQoY2hhcltdIGFycmF5LCBpbnQgaW5kZXgsIGNoYXIgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbiArIDFdOwotCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJfQotCQlyZXN1bHRbaW5kZXhdID0gdmFsdWU7Ci0JCWlmIChpbmRleCA8IGxlbikgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXgsIHJlc3VsdCwgaW5kZXggKyAxLCBsZW4gLSBpbmRleCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGZvbGxvd2VkIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUgdG8gYmUgYWRkZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZChpbnRbXSBhcnJheSwgaW50IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGFkZChpbnRbXSBhcnJheSwgaW50IHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbbGVuICsgMV07Ci0JCWlmIChsZW4gPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGxlbik7Ci0JCX0KLQkJcmVzdWx0W2xlbl0gPSB2YWx1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSBhZGRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGQoaW50W10gYXJyYXksIGludCBpbmRleCwgaW50IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGFkZChpbnRbXSBhcnJheSwgaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtsZW4gKyAxXTsKLQkJaWYgKGluZGV4ID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCX0KLQkJcmVzdWx0W2luZGV4XSA9IHZhbHVlOwotCQlpZiAoaW5kZXggPCBsZW4pIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluZGV4LCByZXN1bHQsIGluZGV4ICsgMSwgbGVuIC0gaW5kZXgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkZCBhbGwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICo8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKE9iamVjdFtdIGFycmF5LCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb24uc2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBjb2xsZWN0aW9uIHNpemUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24sIGludCBjb2xsZWN0aW9uU2l6ZSkgewotCQlyZXR1cm4gKGNvbGxlY3Rpb25TaXplID09IDApID8gYXJyYXkgOiBhZGRBbGxfKGFycmF5LCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBjb2xsZWN0aW9uIGlzIG5vbi1lbXB0eQotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsXyhFW10gYXJyYXksIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIGFkZEFsbF8oYXJyYXksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb24uc2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgY29sbGVjdGlvbiBzaXplID4gemVybwotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsXyhFW10gYXJyYXksIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24sIGludCBjb2xsZWN0aW9uU2l6ZSkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5LCBjb2xsZWN0aW9uLCBhcnJheS5sZW5ndGgsIGNvbGxlY3Rpb25TaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgY29sbGVjdGlvbiBzaXplID4gemVybzsgY2hlY2sgYXJyYXkgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uLCBpbnQgYXJyYXlMZW5ndGgsIGludCBjb2xsZWN0aW9uU2l6ZSkgewotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8KLQkJCQljb2xsZWN0aW9uLnRvQXJyYXkobmV3QXJyYXkoYXJyYXksIGNvbGxlY3Rpb25TaXplKSkgOgotCQkJCWFkZEFsbF8oYXJyYXksIGNvbGxlY3Rpb24sIGFycmF5TGVuZ3RoLCBjb2xsZWN0aW9uU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IGxlbmd0aCBhbmQgY29sbGVjdGlvbiBzaXplID4gemVybwotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsXyhFW10gYXJyYXksIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24sIGludCBhcnJheUxlbmd0aCwgaW50IGNvbGxlY3Rpb25TaXplKSB7Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgYXJyYXlMZW5ndGggKyBjb2xsZWN0aW9uU2l6ZSk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgYXJyYXlMZW5ndGgpOwotCQlpbnQgaSA9IGFycmF5TGVuZ3RoOwotCQlmb3IgKEUgZWxlbWVudCA6IGNvbGxlY3Rpb24pIHsKLQkJCXJlc3VsdFtpKytdID0gZWxlbWVudDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5LCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5LCBpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gYWRkQWxsXyhhcnJheSwgQ29sbGVjdGlvblRvb2xzLmxpc3QoaXRlcmF0b3IpKSA6IGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBhZGRBbGxfKGFycmF5LCBDb2xsZWN0aW9uVG9vbHMubGlzdChpdGVyYXRvciwgaXRlcmF0b3JTaXplKSkgOiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IDEgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBhcnJheSAyLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5MSwgRS4uLiBhcnJheTIpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkyLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgYXJyYXkgMiBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXkxLCBFW10gYXJyYXkyLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXkyTGVuZ3RoID09IDApID8gYXJyYXkxIDogYWRkQWxsXyhhcnJheTEsIGFycmF5MiwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMiBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGxfKEVbXSBhcnJheTEsIEVbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkxLmxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMiBsZW5ndGggPiAwOyBjaGVjayBhcnJheSAxIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheTEsIEVbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheTFMZW5ndGggPT0gMCkgPyBhcnJheTIgOiBhZGRBbGxfKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGJvdGggYXJyYXkgbGVuZ3RocyA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbF8oRVtdIGFycmF5MSwgRVtdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXkxLCBhcnJheTFMZW5ndGggKyBhcnJheTJMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBhcnJheTFMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MiwgMCwgcmVzdWx0LCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIGZpcnN0IHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBvYmplY3RzIGluIHRoZSBzZWNvbmQKLQkgKiBzcGVjaWZpZWQgYXJyYXkgYWRkZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKE9iamVjdFtdIGFycmF5MSwgaW50IGluZGV4LCBPYmplY3RbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5MSwgaW50IGluZGV4LCBFLi4uIGFycmF5MikgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkyLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgYXJyYXkgMiBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXkxLCBpbnQgaW5kZXgsIEVbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheTJMZW5ndGggPT0gMCkgPyBhcnJheTEgOiBhZGRBbGxfKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMiBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGxfKEVbXSBhcnJheTEsIGludCBpbmRleCwgRVtdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkxLmxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMiBsZW5ndGggPiAwOyBjaGVjayBhcnJheSAxIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheTEsIGludCBpbmRleCwgRVtdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5MUxlbmd0aCA9PSAwKSA/Ci0JCQkJCWFycmF5MiA6Ci0JCQkJCShpbmRleCA9PSBhcnJheTFMZW5ndGgpID8gIC8vICdhcnJheTInIGFkZGVkIHRvIGVuZCBvZiAnYXJyYXkxJwotCQkJCQkJYWRkQWxsXyhhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpIDoKLQkJCQkJCWFkZEFsbF8oYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGJvdGggYXJyYXkgbGVuZ3RocyA+IDAgYW5kIGluZGV4ICE9IGFycmF5IDEgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGxfKEVbXSBhcnJheTEsIGludCBpbmRleCwgRVtdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXkxLCBhcnJheTFMZW5ndGggKyBhcnJheTJMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGluZGV4LCBhcnJheTJMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgaW5kZXgsIHJlc3VsdCwgaW5kZXggKyBhcnJheTJMZW5ndGgsIGFycmF5MUxlbmd0aCAtIGluZGV4KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGluc2VydGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4LCBDb2xsZWN0aW9uIGMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheSwgaW5kZXgsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb24uc2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBjb2xsZWN0aW9uIHNpemUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbiwgaW50IGNvbGxlY3Rpb25TaXplKSB7Ci0JCXJldHVybiAoY29sbGVjdGlvblNpemUgPT0gMCkgPyBhcnJheSA6IGFkZEFsbF8oYXJyYXksIGluZGV4LCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGNvbGxlY3Rpb24gc2l6ZSA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbF8oRVtdIGFycmF5LCBpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24sIGludCBjb2xsZWN0aW9uU2l6ZSkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5LCBpbmRleCwgY29sbGVjdGlvbiwgYXJyYXkubGVuZ3RoLCBjb2xsZWN0aW9uU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGNvbGxlY3Rpb24gc2l6ZSA+IDA7IGNoZWNrIGFycmF5IGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uLCBpbnQgYXJyYXlMZW5ndGgsIGludCBjb2xsZWN0aW9uU2l6ZSkgewotCQlpZiAoYXJyYXlMZW5ndGggPT0gMCkgewotCQkJaWYgKGluZGV4ID09IDApIHsKLQkJCQlyZXR1cm4gY29sbGVjdGlvbi50b0FycmF5KG5ld0FycmF5KGFycmF5LCBjb2xsZWN0aW9uU2l6ZSkpOwotCQkJfQotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkluZGV4OiAiICsgaW5kZXggKyAiLCBTaXplOiAwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiAoaW5kZXggPT0gYXJyYXlMZW5ndGgpID8gIC8vICdjb2xsZWN0aW9uJyBhZGRlZCB0byBlbmQgb2YgJ2FycmF5JwotCQkJCWFkZEFsbF8oYXJyYXksIGNvbGxlY3Rpb24sIGFycmF5TGVuZ3RoLCBjb2xsZWN0aW9uU2l6ZSkgOgotCQkJCWFkZEFsbF8oYXJyYXksIGluZGV4LCBjb2xsZWN0aW9uLCBhcnJheUxlbmd0aCwgY29sbGVjdGlvblNpemUpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSBsZW5ndGggYW5kIGNvbGxlY3Rpb24gc2l6ZSA+IDAgYW5kIGluZGV4ICE9IGFycmF5IGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsXyhFW10gYXJyYXksIGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbiwgaW50IGFycmF5TGVuZ3RoLCBpbnQgY29sbGVjdGlvblNpemUpIHsKLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5LCBhcnJheUxlbmd0aCArIGNvbGxlY3Rpb25TaXplKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCWludCBpID0gaW5kZXg7Ci0JCWZvciAoRSBpdGVtIDogY29sbGVjdGlvbikgewotCQkJcmVzdWx0W2krK10gPSBpdGVtOwotCQl9Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluZGV4LCByZXN1bHQsIGluZGV4ICsgY29sbGVjdGlvblNpemUsIGFycmF5TGVuZ3RoIC0gaW5kZXgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGluc2VydGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4LCBJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIGludCBpbmRleCwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXksIGluZGV4LCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoT2JqZWN0W10gYXJyYXksIGludCBpbmRleCwgSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBpbnQgaW5kZXgsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5LCBpbmRleCwgaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvciBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoT2JqZWN0W10gYXJyYXksIGludCBpbmRleCwgSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBpbnQgaW5kZXgsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gYWRkQWxsXyhhcnJheSwgaW5kZXgsIENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhdG9yKSkgOiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvciBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4LCBJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIGludCBpbmRleCwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBhZGRBbGxfKGFycmF5LCBpbmRleCwgQ29sbGVjdGlvblRvb2xzLmxpc3QoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSkpIDogYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGNvbGxlY3Rpb24gaXMgbm9uLWVtcHR5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGxfKEVbXSBhcnJheSwgaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBhZGRBbGxfKGFycmF5LCBpbmRleCwgY29sbGVjdGlvbiwgY29sbGVjdGlvbi5zaXplKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgMSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IDIuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBhZGRBbGwoY2hhcltdIGFycmF5MSwgY2hhci4uLiBhcnJheTIpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkyLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgYXJyYXkgMiBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gYWRkQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheTJMZW5ndGggPT0gMCkgPyBhcnJheTEgOiBhZGRBbGxfKGFycmF5MSwgYXJyYXkyLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAyIGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gYWRkQWxsXyhjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5MS5sZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDIgbGVuZ3RoID4gMDsgY2hlY2sgYXJyYXkgMSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gYWRkQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheTFMZW5ndGggPT0gMCkgPyBhcnJheTIgOiBhZGRBbGxfKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGJvdGggYXJyYXkgbGVuZ3RocyA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gYWRkQWxsXyhjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhclthcnJheTFMZW5ndGggKyBhcnJheTJMZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBhcnJheTFMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MiwgMCwgcmVzdWx0LCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIGZpcnN0IHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBvYmplY3RzIGluIHRoZSBzZWNvbmQKLQkgKiBzcGVjaWZpZWQgYXJyYXkgYWRkZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkKGNoYXJbXSBhcnJheTEsIGludCBpbmRleCwgY2hhcltdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gYWRkQWxsKGNoYXJbXSBhcnJheTEsIGludCBpbmRleCwgY2hhci4uLiBhcnJheTIpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5Mi5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGFycmF5IDIgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGFkZEFsbChjaGFyW10gYXJyYXkxLCBpbnQgaW5kZXgsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheTJMZW5ndGggPT0gMCkgPyBhcnJheTEgOiBhZGRBbGxfKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMiBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGFkZEFsbF8oY2hhcltdIGFycmF5MSwgaW50IGluZGV4LCBjaGFyW10gYXJyYXkyLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTEubGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAyIGxlbmd0aCA+IDA7IGNoZWNrIGFycmF5IDEgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGFkZEFsbChjaGFyW10gYXJyYXkxLCBpbnQgaW5kZXgsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheTFMZW5ndGggPT0gMCkgPwotCQkJCQlhcnJheTIgOgotCQkJCQkoaW5kZXggPT0gYXJyYXkxTGVuZ3RoKSA/ICAvLyAnYXJyYXkyJyBhZGRlZCB0byBlbmQgb2YgJ2FycmF5MScKLQkJCQkJCWFkZEFsbF8oYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKSA6Ci0JCQkJCQlhZGRBbGxfKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBib3RoIGFycmF5IGxlbmd0aHMgPiAwIGFuZCBpbmRleCAhPSBhcnJheSAxIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBhZGRBbGxfKGNoYXJbXSBhcnJheTEsIGludCBpbmRleCwgY2hhcltdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbYXJyYXkxTGVuZ3RoICsgYXJyYXkyTGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MiwgMCwgcmVzdWx0LCBpbmRleCwgYXJyYXkyTGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIGluZGV4LCByZXN1bHQsIGluZGV4ICsgYXJyYXkyTGVuZ3RoLCBhcnJheTFMZW5ndGggLSBpbmRleCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSAxIGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgMi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGFkZEFsbChpbnRbXSBhcnJheTEsIGludC4uLiBhcnJheTIpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkyLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgYXJyYXkgMiBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBhZGRBbGwoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheTJMZW5ndGggPT0gMCkgPyBhcnJheTEgOiBhZGRBbGxfKGFycmF5MSwgYXJyYXkyLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAyIGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBhZGRBbGxfKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5MS5sZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDIgbGVuZ3RoID4gMDsgY2hlY2sgYXJyYXkgMSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBhZGRBbGwoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheTFMZW5ndGggPT0gMCkgPyBhcnJheTIgOiBhZGRBbGxfKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGJvdGggYXJyYXkgbGVuZ3RocyA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBhZGRBbGxfKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbYXJyYXkxTGVuZ3RoICsgYXJyYXkyTGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIDAsIHJlc3VsdCwgMCwgYXJyYXkxTGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTIsIDAsIHJlc3VsdCwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgb2JqZWN0cyBpbiB0aGUgc2Vjb25kCi0JICogc3BlY2lmaWVkIGFycmF5IGFkZGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZChpbnRbXSBhcnJheTEsIGludCBpbmRleCwgaW50W10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGFkZEFsbChpbnRbXSBhcnJheTEsIGludCBpbmRleCwgaW50Li4uIGFycmF5MikgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkyLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgYXJyYXkgMiBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBhZGRBbGwoaW50W10gYXJyYXkxLCBpbnQgaW5kZXgsIGludFtdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IGFkZEFsbF8oYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAyIGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBhZGRBbGxfKGludFtdIGFycmF5MSwgaW50IGluZGV4LCBpbnRbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5MS5sZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDIgbGVuZ3RoID4gMDsgY2hlY2sgYXJyYXkgMSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBhZGRBbGwoaW50W10gYXJyYXkxLCBpbnQgaW5kZXgsIGludFtdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5MUxlbmd0aCA9PSAwKSA/Ci0JCQkJCWFycmF5MiA6Ci0JCQkJCShpbmRleCA9PSBhcnJheTFMZW5ndGgpID8gIC8vICdhcnJheTInIGFkZGVkIHRvIGVuZCBvZiAnYXJyYXkxJwotCQkJCQkJYWRkQWxsXyhhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpIDoKLQkJCQkJCWFkZEFsbF8oYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGJvdGggYXJyYXkgbGVuZ3RocyA+IDAgYW5kIGluZGV4ICE9IGFycmF5IDEgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gYWRkQWxsXyhpbnRbXSBhcnJheTEsIGludCBpbmRleCwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbYXJyYXkxTGVuZ3RoICsgYXJyYXkyTGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MiwgMCwgcmVzdWx0LCBpbmRleCwgYXJyYXkyTGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIGluZGV4LCByZXN1bHQsIGluZGV4ICsgYXJyYXkyTGVuZ3RoLCBhcnJheTFMZW5ndGggLSBpbmRleCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsZWFyICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhbiBlbXB0eSBhcnJheSB3aXRoIHRoZSBzYW1lIGNvbXBvbmVudCB0eXBlIGFzIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmNsZWFyKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gY2xlYXIoRVtdIGFycmF5KSB7Ci0JCXJldHVybiAoYXJyYXkubGVuZ3RoID09IDApID8gYXJyYXkgOiBuZXdBcnJheShhcnJheSwgMCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbmNhdGVuYXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgZWxlbWVudHMgaW4gYWxsIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheXMsIGNvbmNhdGVuYXRlZCBpbiB0aGUgc3BlY2lmaWVkIG9yZGVyLgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBidWlsZGluZyBjb25zdGFudCBhcnJheXMgb3V0IG9mIG90aGVyIGNvbnN0YW50IGFycmF5cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuY29uY2F0ZW5hdGUoT2JqZWN0W10uLi4gYXJyYXlzKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gY29uY2F0ZW5hdGUoRVtdLi4uIGFycmF5cykgewotCQlpbnQgbGVuID0gMDsKLQkJZm9yIChFW10gYXJyYXkgOiBhcnJheXMpIHsKLQkJCWxlbiArPSBhcnJheS5sZW5ndGg7Ci0JCX0KLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5c1swXSwgbGVuKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWludCBjdXJyZW50ID0gMDsKLQkJZm9yIChFW10gYXJyYXkgOiBhcnJheXMpIHsKLQkJCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJCWlmIChhcnJheUxlbmd0aCA+IDApIHsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIGN1cnJlbnQsIGFycmF5TGVuZ3RoKTsKLQkJCQljdXJyZW50ICs9IGFycmF5TGVuZ3RoOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSBlbGVtZW50cyBpbiAgYWxsIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheXMsIGNvbmNhdGVuYXRlZCBpbiB0aGUgc3BlY2lmaWVkIG9yZGVyLgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBidWlsZGluZyBjb25zdGFudCBhcnJheXMgb3V0IG90aGVyIGNvbnN0YW50IGFycmF5cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuY29uY2F0ZW5hdGUoY2hhcltdLi4uIGFycmF5cyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29uY2F0ZW5hdGUoY2hhcltdLi4uIGFycmF5cykgewotCQlpbnQgbGVuID0gMDsKLQkJZm9yIChjaGFyW10gYXJyYXkgOiBhcnJheXMpIHsKLQkJCWxlbiArPSBhcnJheS5sZW5ndGg7Ci0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1QVFlfQ0hBUl9BUlJBWTsKLQkJfQotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuXTsKLQkJaW50IGN1cnJlbnQgPSAwOwotCQlmb3IgKGNoYXJbXSBhcnJheSA6IGFycmF5cykgewotCQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQkJaWYgKGFycmF5TGVuZ3RoICE9IDApIHsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIGN1cnJlbnQsIGFycmF5TGVuZ3RoKTsKLQkJCQljdXJyZW50ICs9IGFycmF5TGVuZ3RoOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSBlbGVtZW50cyBpbiAgYWxsIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheXMsIGNvbmNhdGVuYXRlZCBpbiB0aGUgc3BlY2lmaWVkIG9yZGVyLgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBidWlsZGluZyBjb25zdGFudCBhcnJheXMgb3V0IG90aGVyIGNvbnN0YW50IGFycmF5cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuY29uY2F0ZW5hdGUoaW50W10uLi4gYXJyYXlzKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGNvbmNhdGVuYXRlKGludFtdLi4uIGFycmF5cykgewotCQlpbnQgbGVuID0gMDsKLQkJZm9yIChpbnRbXSBhcnJheSA6IGFycmF5cykgewotCQkJbGVuICs9IGFycmF5Lmxlbmd0aDsKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9JTlRfQVJSQVk7Ci0JCX0KLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtsZW5dOwotCQlpbnQgY3VycmVudCA9IDA7Ci0JCWZvciAoaW50W10gYXJyYXkgOiBhcnJheXMpIHsKLQkJCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJCWlmIChhcnJheUxlbmd0aCAhPSAwKSB7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCBjdXJyZW50LCBhcnJheUxlbmd0aCk7Ci0JCQkJY3VycmVudCArPSBhcnJheUxlbmd0aDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250YWlucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5IGNvbnRhaW5zIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb250YWlucyhPYmplY3RbXSBhcnJheSwgT2JqZWN0IG8pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhPYmplY3RbXSBhcnJheSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBjb250YWlucyhhcnJheSwgdmFsdWUsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgYXJyYXkgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhPYmplY3RbXSBhcnJheSwgT2JqZWN0IHZhbHVlLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheUxlbmd0aCA9PSAwKSA/IGZhbHNlIDogY29udGFpbnNfKGFycmF5LCB2YWx1ZSwgYXJyYXlMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSBsZW5ndGggPiAwCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zXyhPYmplY3RbXSBhcnJheSwgT2JqZWN0IHZhbHVlLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSBhcnJheUxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGFycmF5W2ldID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IGFycmF5TGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAodmFsdWUuZXF1YWxzKGFycmF5W2ldKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgY29udGFpbnMgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmNvbnRhaW5zKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewotCQlyZXR1cm4gY29udGFpbnMoYXJyYXksIHZhbHVlLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGFycmF5IGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheUxlbmd0aCA9PSAwKSA/IGZhbHNlIDogY29udGFpbnNfKGFycmF5LCB2YWx1ZSwgYXJyYXlMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWluc18oY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJZm9yIChpbnQgaSA9IGFycmF5TGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheVtpXSA9PSB2YWx1ZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5IGNvbnRhaW5zIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb250YWlucyhpbnRbXSBhcnJheSwgaW50IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoaW50W10gYXJyYXksIGludCB2YWx1ZSkgewotCQlyZXR1cm4gY29udGFpbnMoYXJyYXksIHZhbHVlLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGFycmF5IGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoaW50W10gYXJyYXksIGludCB2YWx1ZSwgaW50IGFycmF5TGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXlMZW5ndGggPT0gMCkgPyBmYWxzZSA6IGNvbnRhaW5zXyhhcnJheSwgdmFsdWUsIGFycmF5TGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnNfKGludFtdIGFycmF5LCBpbnQgdmFsdWUsIGludCBhcnJheUxlbmd0aCkgewotCQlmb3IgKGludCBpID0gYXJyYXlMZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250YWlucyBhbGwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb250YWluc0FsbChPYmplY3RbXSBhcnJheSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoYXJyYXksIGNvbGxlY3Rpb24uaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChhcnJheSwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCS8vIHVzZSBoYXNoZWQgbG9va3VwCi0JCUhhc2hTZXQ8T2JqZWN0PiBzZXQgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KGFycmF5KTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaWYgKCAhIHNldC5jb250YWlucyhpdGVyYXRvci5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgMSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheSAyLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb250YWluc0FsbChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0Li4uIGFycmF5MikgewotCQkvLyB1c2UgaGFzaGVkIGxvb2t1cAotCQlIYXNoU2V0PE9iamVjdD4gc2V0ID0gQ29sbGVjdGlvblRvb2xzLnNldChhcnJheTEpOwotCQlmb3IgKGludCBpID0gYXJyYXkyLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgc2V0LmNvbnRhaW5zKGFycmF5MltpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSAxIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IDIuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmNvbnRhaW5zQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChjaGFyW10gYXJyYXkxLCBjaGFyLi4uIGFycmF5MikgewotCQlmb3IgKGludCBpID0gYXJyYXkyLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgY29udGFpbnMoYXJyYXkxLCBhcnJheTJbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgMSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheSAyLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb250YWluc0FsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKGludFtdIGFycmF5MSwgaW50Li4uIGFycmF5MikgewotCQlmb3IgKGludCBpID0gYXJyYXkyLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgY29udGFpbnMoYXJyYXkxLCBhcnJheTJbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaWZmICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBhcnJheXMgdGhhdCBhcmUgZGlmZmVyZW50LCBiZWdpbm5pbmcgYXQgdGhlIGVuZC4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBpZGVudGljYWwsIHJldHVybiAtMS4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBkaWZmZXJlbnQgc2l6ZXMsIHJldHVybiB0aGUgaW5kZXggb2YgdGhlCi0JICogbGFzdCBlbGVtZW50IGluIHRoZSBsb25nZXIgYXJyYXkuCi0JICogVXNlIHRoZSBlbGVtZW50cycge0BsaW5rIE9iamVjdCNlcXVhbHMoT2JqZWN0KX0gbWV0aG9kIHRvIGNvbXBhcmUgdGhlCi0JICogZWxlbWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZGlmZkVuZChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlpbnQgbGVuMSA9IGFycmF5MS5sZW5ndGg7Ci0JCWludCBsZW4yID0gYXJyYXkyLmxlbmd0aDsKLQkJaWYgKGxlbjEgIT0gbGVuMikgewotCQkJcmV0dXJuIE1hdGgubWF4KGxlbjEsIGxlbjIpIC0gMTsKLQkJfQotCQlmb3IgKGludCBpID0gbGVuMSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlPYmplY3QgbyA9IGFycmF5MVtpXTsKLQkJCWlmIChvID09IG51bGwpIHsKLQkJCQlpZiAoYXJyYXkyW2ldICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoICEgby5lcXVhbHMoYXJyYXkyW2ldKSkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmFuZ2Ugb2YgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gW3NpemUsIC0xXS4KLQkgKiBVc2UgdGhlIGVsZW1lbnRzJyB7QGxpbmsgT2JqZWN0I2VxdWFscyhPYmplY3QpfSBtZXRob2QgdG8gY29tcGFyZSB0aGUKLQkgKiBlbGVtZW50cy4KLQkgKiBAc2VlICNkaWZmU3RhcnQoT2JqZWN0W10sIE9iamVjdFtdKQotCSAqIEBzZWUgI2RpZmZFbmQoT2JqZWN0W10sIE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmFuZ2UgZGlmZlJhbmdlKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCWludCBlbmQgPSBkaWZmRW5kKGFycmF5MSwgYXJyYXkyKTsKLQkJaWYgKGVuZCA9PSAtMSkgewotCQkJLy8gdGhlIGxpc3RzIGFyZSBpZGVudGljYWwsIHRoZSBzdGFydCBpcyB0aGUgc2l6ZSBvZiB0aGUgdHdvIGxpc3RzCi0JCQlyZXR1cm4gbmV3IFJhbmdlKGFycmF5MS5sZW5ndGgsIGVuZCk7Ci0JCX0KLQkJLy8gdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQsIGNhbGN1bGF0ZSB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlCi0JCXJldHVybiBuZXcgUmFuZ2UoZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogYXJyYXlzIHRoYXQgYXJlIGRpZmZlcmVudC4gSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4KLQkgKiB0aGUgc2l6ZSBvZiB0aGUgdHdvIGFycmF5cyAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCkuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgZGlmZmVyZW50IHNpemVzIGFuZCBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNob3J0ZXIgYXJyYXkgbWF0Y2ggdGhlaXIgY29ycmVzcG9uZGluZyBlbGVtZW50cyBpbgotCSAqIHRoZSBsb25nZXIgYXJyYXksIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc2hvcnRlciBhcnJheQotCSAqIChpLmUuIG9uZSBwYXN0IHRoZSBsYXN0IGluZGV4IG9mIHRoZSBzaG9ydGVyIGFycmF5KS4KLQkgKiBVc2UgdGhlIGVsZW1lbnRzJyB7QGxpbmsgT2JqZWN0I2VxdWFscyhPYmplY3QpfSBtZXRob2QgdG8gY29tcGFyZSB0aGUKLQkgKiBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBkaWZmU3RhcnQoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJaW50IGVuZCA9IE1hdGgubWluKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVuZDsgaSsrKSB7Ci0JCQlPYmplY3QgbyA9IGFycmF5MVtpXTsKLQkJCWlmIChvID09IG51bGwpIHsKLQkJCQlpZiAoYXJyYXkyW2ldICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoICEgby5lcXVhbHMoYXJyYXkyW2ldKSkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVuZDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaWRlbnRpdHkgZGlmZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogYXJyYXlzIHRoYXQgYXJlIGRpZmZlcmVudCwgYmVnaW5uaW5nIGF0IHRoZSBlbmQuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gLTEuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgZGlmZmVyZW50IHNpemVzLCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZQotCSAqIGxhc3QgZWxlbWVudCBpbiB0aGUgbG9uZ2VyIGFycmF5LgotCSAqIFVzZSBvYmplY3QgaWRlbnRpdHkgdG8gY29tcGFyZSB0aGUgZWxlbWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaWRlbnRpdHlEaWZmRW5kKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCWludCBsZW4xID0gYXJyYXkxLmxlbmd0aDsKLQkJaW50IGxlbjIgPSBhcnJheTIubGVuZ3RoOwotCQlpZiAobGVuMSAhPSBsZW4yKSB7Ci0JCQlyZXR1cm4gTWF0aC5tYXgobGVuMSwgbGVuMikgLSAxOwotCQl9Ci0JCWZvciAoaW50IGkgPSBsZW4xIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCWlmIChhcnJheTFbaV0gIT0gYXJyYXkyW2ldKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmFuZ2Ugb2YgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gW3NpemUsIC0xXS4KLQkgKiBVc2Ugb2JqZWN0IGlkZW50aXR5IHRvIGNvbXBhcmUgdGhlIGVsZW1lbnRzLgotCSAqIEBzZWUgI2lkZW50aXR5RGlmZlN0YXJ0KE9iamVjdFtdLCBPYmplY3RbXSkKLQkgKiBAc2VlICNpZGVudGl0eURpZmZFbmQoT2JqZWN0W10sIE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmFuZ2UgaWRlbnRpdHlEaWZmUmFuZ2UoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJaW50IGVuZCA9IGlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5Mik7Ci0JCWlmIChlbmQgPT0gLTEpIHsKLQkJCS8vIHRoZSBsaXN0cyBhcmUgaWRlbnRpY2FsLCB0aGUgc3RhcnQgaXMgdGhlIHNpemUgb2YgdGhlIHR3byBsaXN0cwotCQkJcmV0dXJuIG5ldyBSYW5nZShhcnJheTEubGVuZ3RoLCBlbmQpOwotCQl9Ci0JCS8vIHRoZSBsaXN0cyBhcmUgZGlmZmVyZW50LCBjYWxjdWxhdGUgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZQotCQlyZXR1cm4gbmV3IFJhbmdlKGlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogYXJyYXlzIHRoYXQgYXJlIGRpZmZlcmVudC4gSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4KLQkgKiB0aGUgc2l6ZSBvZiB0aGUgdHdvIGFycmF5cyAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCkuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgZGlmZmVyZW50IHNpemVzIGFuZCBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNob3J0ZXIgYXJyYXkgbWF0Y2ggdGhlaXIgY29ycmVzcG9uZGluZyBlbGVtZW50cyBpbgotCSAqIHRoZSBsb25nZXIgYXJyYXksIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc2hvcnRlciBhcnJheQotCSAqIChpLmUuIG9uZSBwYXN0IHRoZSBsYXN0IGluZGV4IG9mIHRoZSBzaG9ydGVyIGFycmF5KS4KLQkgKiBVc2Ugb2JqZWN0IGlkZW50aXR5IHRvIGNvbXBhcmUgdGhlIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGlkZW50aXR5RGlmZlN0YXJ0KE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCWludCBlbmQgPSBNYXRoLm1pbihhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbmQ7IGkrKykgewotCQkJaWYgKGFycmF5MVtpXSAhPSBhcnJheTJbaV0pIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW5kOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlbGVtZW50cyBhcmUgaWRlbnRpY2FsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXlzIGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmlkZW50aWNhbChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVsZW1lbnRzQXJlSWRlbnRpY2FsKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCWlmIChhcnJheTEgPT0gYXJyYXkyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoYXJyYXkxID09IG51bGwgfHwgYXJyYXkyID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgbGVuZ3RoID0gYXJyYXkxLmxlbmd0aDsKLQkJaWYgKGFycmF5Mi5sZW5ndGggIT0gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYXJyYXkxW2ldICE9IGFycmF5MltpXSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5kZXggb2YgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5pbmRleE9mKE9iamVjdFtdIGFycmF5LCBPYmplY3Qgbyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZihPYmplY3RbXSBhcnJheSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJaWYgKGFycmF5W2ldID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoYXJyYXlbaV0pKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5pZGVudGl0eUluZGV4T2YoT2JqZWN0W10gYXJyYXksIE9iamVjdCBvKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpZGVudGl0eUluZGV4T2YoT2JqZWN0W10gYXJyYXksIE9iamVjdCB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoYXJyYXlbaV0gPT0gdmFsdWUpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5pbmRleE9mKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZihjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBvciByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuaW5kZXhPZihpbnRbXSBhcnJheSwgaW50IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnNlcnRpb24gaW5kZXggb2YgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXhpbXVtIGluZGV4IG9mIHdoZXJlIHRoZSBzcGVjaWZpZWQgY29tcGFyYWJsZSBvYmplY3QKLQkgKiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byB0aGUgc3BlY2lmaWVkIHNvcnRlZCBhcnJheSBhbmQgc3RpbGwga2VlcAotCSAqIHRoZSBhcnJheSBzb3J0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4gaW50IGluc2VydGlvbkluZGV4T2YoRVtdIHNvcnRlZEFycmF5LCBDb21wYXJhYmxlPEU+IHZhbHVlKSB7Ci0JCWludCBsZW4gPSBzb3J0ZWRBcnJheS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmICh2YWx1ZS5jb21wYXJlVG8oc29ydGVkQXJyYXlbaV0pIDwgMCkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXhpbXVtIGluZGV4IG9mIHdoZXJlIHRoZSBzcGVjaWZpZWQgY29tcGFyYWJsZSBvYmplY3QKLQkgKiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byB0aGUgc3BlY2lmaWVkIHNvcnRlZCBhcnJheSBhbmQgc3RpbGwga2VlcAotCSAqIHRoZSBhcnJheSBzb3J0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gaW50IGluc2VydGlvbkluZGV4T2YoRVtdIHNvcnRlZEFycmF5LCBFIHZhbHVlLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlpbnQgbGVuID0gc29ydGVkQXJyYXkubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoY29tcGFyYXRvci5jb21wYXJlKHZhbHVlLCBzb3J0ZWRBcnJheVtpXSkgPCAwKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGFzdCBpbmRleCBvZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBhcnJheTsKLQkgKiByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubGFzdEluZGV4T2YoT2JqZWN0W10gYXJyYXksIE9iamVjdCBvKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBsYXN0SW5kZXhPZihPYmplY3RbXSBhcnJheSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoYXJyYXlbaV0gPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAodmFsdWUuZXF1YWxzKGFycmF5W2ldKSkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5sYXN0SW5kZXhPZihjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewotCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheVtpXSA9PSB2YWx1ZSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBvciByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubGFzdEluZGV4T2YoaW50W10gYXJyYXksIGludCB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgbGFzdEluZGV4T2YoaW50W10gYXJyYXksIGludCB2YWx1ZSkgewotCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheVtpXSA9PSB2YWx1ZSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWluL21heCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNoYXJhY3RlciBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgbWluaW11bSB2YWx1ZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubWluKGNoYXJbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyIG1pbihjaGFyLi4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCQlpbnQgbGFzdCA9IGxlbiAtIDE7Ci0JCWNoYXIgbWluID0gYXJyYXlbbGFzdF07Ci0JCWZvciAoaW50IGkgPSBsYXN0OyBpLS0gPiAwOyApIHsKLQkJCWNoYXIgYyA9IGFycmF5W2ldOwotCQkJaWYgKGMgPCBtaW4pIHsKLQkJCQltaW4gPSBjOwotCQkJfQotCQl9Ci0JCXJldHVybiBtaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbnRlZ2VyIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBtaW5pbXVtIHZhbHVlLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5taW4oaW50W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IG1pbihpbnQuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JCWludCBsYXN0ID0gbGVuIC0gMTsKLQkJaW50IG1pbiA9IGFycmF5W2xhc3RdOwotCQlmb3IgKGludCBpID0gbGFzdDsgaS0tID4gMDsgKSB7Ci0JCQlpbnQgeCA9IGFycmF5W2ldOwotCQkJaWYgKHggPCBtaW4pIHsKLQkJCQltaW4gPSB4OwotCQkJfQotCQl9Ci0JCXJldHVybiBtaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjaGFyYWN0ZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIG1heGltdW0gdmFsdWUuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLm1heChjaGFyW10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhciBtYXgoY2hhci4uLiBhcnJheSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0KLQkJaW50IGxhc3QgPSBsZW4gLSAxOwotCQljaGFyIG1heCA9IGFycmF5W2xhc3RdOwotCQlmb3IgKGludCBpID0gbGFzdDsgaS0tID4gMDsgKSB7Ci0JCQljaGFyIGMgPSBhcnJheVtpXTsKLQkJCWlmIChjID4gbWF4KSB7Ci0JCQkJbWF4ID0gYzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW50ZWdlciBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgbWF4aW11bSB2YWx1ZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubWF4KGludFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBtYXgoaW50Li4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCQlpbnQgbGFzdCA9IGxlbiAtIDE7Ci0JCWludCBtYXggPSBhcnJheVtsYXN0XTsKLQkJZm9yIChpbnQgaSA9IGxhc3Q7IGktLSA+IDA7ICkgewotCQkJaW50IHggPSBhcnJheVtpXTsKLQkJCWlmICh4ID4gbWF4KSB7Ci0JCQkJbWF4ID0geDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb3ZlICoqKioqKioqKioKLQotCS8qKgotCSAqIE1vdmUgYW4gZWxlbWVudCBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0Ci0JICogaW5kZXguIFJldHVybiB0aGUgYWx0ZXJlZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubW92ZShPYmplY3RbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBtb3ZlKEVbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJcmV0dXJuICh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgPyBhcnJheSA6IG1vdmVfKGFycmF5LCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0YXJnZXQgaW5kZXggIT0gc291cmNlIGluZGV4Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBtb3ZlXyhFW10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUUgdGVtcCA9IGFycmF5W3NvdXJjZUluZGV4XTsKLQkJaWYgKHRhcmdldEluZGV4IDwgc291cmNlSW5kZXgpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHRhcmdldEluZGV4LCBhcnJheSwgdGFyZ2V0SW5kZXggKyAxLCBzb3VyY2VJbmRleCAtIHRhcmdldEluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHNvdXJjZUluZGV4ICsgMSwgYXJyYXksIHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCAtIHNvdXJjZUluZGV4KTsKLQkJfQotCQlhcnJheVt0YXJnZXRJbmRleF0gPSB0ZW1wOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBlbGVtZW50cyBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0Ci0JICogaW5kZXguIFJldHVybiB0aGUgYWx0ZXJlZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubW92ZShPYmplY3RbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBtb3ZlKEVbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJaWYgKCh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgfHwgKGxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWlmIChsZW5ndGggPT0gMSkgewotCQkJcmV0dXJuIG1vdmVfKGFycmF5LCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl9Ci0JCUVbXSB0ZW1wID0gbmV3QXJyYXkoYXJyYXksIGxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHNvdXJjZUluZGV4LCB0ZW1wLCAwLCBsZW5ndGgpOwotCQlpZiAodGFyZ2V0SW5kZXggPCBzb3VyY2VJbmRleCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgdGFyZ2V0SW5kZXgsIGFycmF5LCB0YXJnZXRJbmRleCArIGxlbmd0aCwgc291cmNlSW5kZXggLSB0YXJnZXRJbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCArIGxlbmd0aCwgYXJyYXksIHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCAtIHNvdXJjZUluZGV4KTsKLQkJfQotCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIGFycmF5LCB0YXJnZXRJbmRleCwgbGVuZ3RoKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIE1vdmUgYW4gZWxlbWVudCBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0Ci0JICogaW5kZXguIFJldHVybiB0aGUgYWx0ZXJlZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubW92ZShpbnRbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gbW92ZShpbnRbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJcmV0dXJuICh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgPyBhcnJheSA6IG1vdmVfKGFycmF5LCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0YXJnZXRJbmRleCAhPSBzb3VyY2VJbmRleAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIG1vdmVfKGludFtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlpbnQgdGVtcCA9IGFycmF5W3NvdXJjZUluZGV4XTsKLQkJaWYgKHRhcmdldEluZGV4IDwgc291cmNlSW5kZXgpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHRhcmdldEluZGV4LCBhcnJheSwgdGFyZ2V0SW5kZXggKyAxLCBzb3VyY2VJbmRleCAtIHRhcmdldEluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHNvdXJjZUluZGV4ICsgMSwgYXJyYXksIHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCAtIHNvdXJjZUluZGV4KTsKLQkJfQotCQlhcnJheVt0YXJnZXRJbmRleF0gPSB0ZW1wOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBlbGVtZW50cyBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0Ci0JICogaW5kZXguIFJldHVybiB0aGUgYWx0ZXJlZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubW92ZShpbnRbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gbW92ZShpbnRbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJaWYgKCh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgfHwgKGxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWlmIChsZW5ndGggPT0gMSkgewotCQkJcmV0dXJuIG1vdmVfKGFycmF5LCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl9Ci0JCWludFtdIHRlbXAgPSBuZXcgaW50W2xlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHNvdXJjZUluZGV4LCB0ZW1wLCAwLCBsZW5ndGgpOwotCQlpZiAodGFyZ2V0SW5kZXggPCBzb3VyY2VJbmRleCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgdGFyZ2V0SW5kZXgsIGFycmF5LCB0YXJnZXRJbmRleCArIGxlbmd0aCwgc291cmNlSW5kZXggLSB0YXJnZXRJbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCArIGxlbmd0aCwgYXJyYXksIHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCAtIHNvdXJjZUluZGV4KTsKLQkJfQotCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIGFycmF5LCB0YXJnZXRJbmRleCwgbGVuZ3RoKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIE1vdmUgYW4gZWxlbWVudCBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0Ci0JICogaW5kZXguIFJldHVybiB0aGUgYWx0ZXJlZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubW92ZShjaGFyW10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBtb3ZlKGNoYXJbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJcmV0dXJuICh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgPyBhcnJheSA6IG1vdmVfKGFycmF5LCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0YXJnZXRJbmRleCAhPSBzb3VyY2VJbmRleAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBtb3ZlXyhjaGFyW10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCWNoYXIgdGVtcCA9IGFycmF5W3NvdXJjZUluZGV4XTsKLQkJaWYgKHRhcmdldEluZGV4IDwgc291cmNlSW5kZXgpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHRhcmdldEluZGV4LCBhcnJheSwgdGFyZ2V0SW5kZXggKyAxLCBzb3VyY2VJbmRleCAtIHRhcmdldEluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHNvdXJjZUluZGV4ICsgMSwgYXJyYXksIHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCAtIHNvdXJjZUluZGV4KTsKLQkJfQotCQlhcnJheVt0YXJnZXRJbmRleF0gPSB0ZW1wOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBlbGVtZW50cyBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0Ci0JICogaW5kZXguIFJldHVybiB0aGUgYWx0ZXJlZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubW92ZShjaGFyW10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBtb3ZlKGNoYXJbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJaWYgKCh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgfHwgKGxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWlmIChsZW5ndGggPT0gMSkgewotCQkJcmV0dXJuIG1vdmVfKGFycmF5LCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl9Ci0JCWNoYXJbXSB0ZW1wID0gbmV3IGNoYXJbbGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc291cmNlSW5kZXgsIHRlbXAsIDAsIGxlbmd0aCk7Ci0JCWlmICh0YXJnZXRJbmRleCA8IHNvdXJjZUluZGV4KSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCB0YXJnZXRJbmRleCwgYXJyYXksIHRhcmdldEluZGV4ICsgbGVuZ3RoLCBzb3VyY2VJbmRleCAtIHRhcmdldEluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHNvdXJjZUluZGV4ICsgbGVuZ3RoLCBhcnJheSwgc291cmNlSW5kZXgsIHRhcmdldEluZGV4IC0gc291cmNlSW5kZXgpOwotCQl9Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgYXJyYXksIHRhcmdldEluZGV4LCBsZW5ndGgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZShPYmplY3RbXSBhcnJheSwgT2JqZWN0IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlKEVbXSBhcnJheSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50QXRJbmRleChhcnJheSwgaW5kZXhPZihhcnJheSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZShjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZShjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpIHsKLQkJcmV0dXJuIHJlbW92ZUVsZW1lbnRBdEluZGV4KGFycmF5LCBpbmRleE9mKGFycmF5LCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlKGludFtdIGFycmF5LCBpbnQgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmVtb3ZlKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJcmV0dXJuIHJlbW92ZUVsZW1lbnRBdEluZGV4KGFycmF5LCBpbmRleE9mKGFycmF5LCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVGaXJzdChPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUZpcnN0KEVbXSBhcnJheSkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudEF0SW5kZXgoYXJyYXksIDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVGaXJzdChjaGFyW10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZUZpcnN0KGNoYXJbXSBhcnJheSkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudEF0SW5kZXgoYXJyYXksIDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVGaXJzdChpbnRbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZW1vdmVGaXJzdChpbnRbXSBhcnJheSkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudEF0SW5kZXgoYXJyYXksIDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgbGFzdCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUxhc3QoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVMYXN0KEVbXSBhcnJheSkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudEF0SW5kZXgoYXJyYXksIGFycmF5Lmxlbmd0aCAtIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgbGFzdCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUxhc3QoY2hhcltdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVMYXN0KGNoYXJbXSBhcnJheSkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudEF0SW5kZXgoYXJyYXksIGFycmF5Lmxlbmd0aCAtIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgbGFzdCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUxhc3QoaW50W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmVtb3ZlTGFzdChpbnRbXSBhcnJheSkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudEF0SW5kZXgoYXJyYXksIGFycmF5Lmxlbmd0aCAtIDEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgYWxsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsKEVbXSBhcnJheSwgSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHJlbW92ZUFsbChhcnJheSwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbChFW10gYXJyYXksIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiByZW1vdmVBbGwoYXJyYXksIGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYXRvciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUFsbChPYmplY3RbXSBhcnJheSwgSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVBbGwoRVtdIGFycmF5LCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQkvLyBjb252ZXJ0IHRvIGEgc2V0IHRvIHRha2UgYWR2YW50YWdlIG9mIGhhc2hlZCBsb29rLXVwCi0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyByZW1vdmVBbGxfKGFycmF5LCBDb2xsZWN0aW9uVG9vbHMuc2V0KGl0ZXJhdG9yKSkgOiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsKEVbXSBhcnJheSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJLy8gY29udmVydCB0byBhIHNldCB0byB0YWtlIGFkdmFudGFnZSBvZiBoYXNoZWQgbG9vay11cAotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gcmVtb3ZlQWxsXyhhcnJheSwgQ29sbGVjdGlvblRvb2xzLnNldChpdGVyYXRvciwgaXRlcmF0b3JTaXplKSkgOiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVBbGwoT2JqZWN0W10gYXJyYXksIENvbGxlY3Rpb24gY29sbGVjdGlvbik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbChFW10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gY29sbGVjdGlvbi5pc0VtcHR5KCkgPyBhcnJheSA6IHJlbW92ZUFsbF8oYXJyYXksIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBjb2xsZWN0aW9uIGlzIG5vbi1lbXB0eQotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsXyhFW10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gcmVtb3ZlQWxsKGFycmF5LCBjb2xsZWN0aW9uLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBjb2xsZWN0aW9uIGlzIG5vbi1lbXB0eTsgY2hlY2sgYXJyYXkgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSByZW1vdmVBbGwoRVtdIGFycmF5LCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIGludCBhcnJheUxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gYXJyYXkgOiByZW1vdmVBbGxfKGFycmF5LCBjb2xsZWN0aW9uLCBhcnJheUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGNvbGxlY3Rpb24gaXMgbm9uLWVtcHR5IGFuZCBhcnJheSBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSByZW1vdmVBbGxfKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJLy8gYnVpbGQgdGhlIGluZGljZXMgb2YgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIHRvIHJlbWFpbgotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFthcnJheUxlbmd0aF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoICEgY29sbGVjdGlvbi5jb250YWlucyhhcnJheVtpXSkpIHsKLQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJfQotCQl9Ci0JCWlmIChqID09IGFycmF5TGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYXJyYXk7ICAvLyBub3RoaW5nIHdhcyByZW1vdmVkCi0JCX0KLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5LCBqKTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5W2luZGljZXNbaV1dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIGZpcnN0IHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNlY29uZCBzcGVjaWZpZWQgYXJyYXkgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVBbGwoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVBbGwoRVtdIGFycmF5MSwgT2JqZWN0Li4uIGFycmF5MikgewotCQkvLyBjb252ZXJ0IHRvIGEgc2V0IHRvIHRha2UgYWR2YW50YWdlIG9mIGhhc2hlZCBsb29rLXVwCi0JCXJldHVybiAoYXJyYXkyLmxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IHJlbW92ZUFsbF8oYXJyYXkxLCBDb2xsZWN0aW9uVG9vbHMuc2V0KGFycmF5MikpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzZWNvbmQgc3BlY2lmaWVkIGFycmF5IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMjcmVtb3ZlQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZUFsbChjaGFyW10gYXJyYXkxLCBjaGFyLi4uIGFycmF5MikgewotCQlpZiAoYXJyYXkyLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXkxOwotCQl9Ci0JCWludCBhcnJheTFMZW5ndGggPSBhcnJheTEubGVuZ3RoOwotCQlpZiAoYXJyYXkxTGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBhcnJheTE7Ci0JCX0KLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbYXJyYXkxTGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5MUxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoICEgY29udGFpbnMoYXJyYXkyLCBhcnJheTFbaV0pKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheTFMZW5ndGgpIHsKLQkJCXJldHVybiBhcnJheTE7ICAvLyBub3RoaW5nIHdhcyByZW1vdmVkCi0JCX0KLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2pdOwotCQlpbnQgcmVzdWx0TGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gYXJyYXkxW2luZGljZXNbaV1dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIGZpcnN0IHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNlY29uZCBzcGVjaWZpZWQgYXJyYXkgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cyNyZW1vdmVBbGwoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmVtb3ZlQWxsKGludFtdIGFycmF5MSwgaW50Li4uIGFycmF5MikgewotCQlpZiAoYXJyYXkyLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXkxOwotCQl9Ci0JCWludCBhcnJheTFMZW5ndGggPSBhcnJheTEubGVuZ3RoOwotCQlpZiAoYXJyYXkxTGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBhcnJheTE7Ci0JCX0KLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbYXJyYXkxTGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5MUxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoICEgY29udGFpbnMoYXJyYXkyLCBhcnJheTFbaV0pKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheTFMZW5ndGgpIHsKLQkJCXJldHVybiBhcnJheTE7ICAvLyBub3RoaW5nIHdhcyByZW1vdmVkCi0JCX0KLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtqXTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5MVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgYWxsIG9jY3VycmVuY2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIG9jY3VycmVuY2VzIG9mCi0JICogdGhlIHNwZWNpZmllZCBlbGVtZW50IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoT2JqZWN0W10gYXJyYXksIE9iamVjdCB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbE9jY3VycmVuY2VzKEVbXSBhcnJheSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKGFycmF5TGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFthcnJheUxlbmd0aF07Ci0JCWludCBqID0gMDsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSBhcnJheUxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGFycmF5W2ldICE9IG51bGwpIHsKLQkJCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoICEgdmFsdWUuZXF1YWxzKGFycmF5W2ldKSkgewotCQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5OyAgLy8gbm90aGluZyB3YXMgcmVtb3ZlZAotCQl9Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgaik7Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIG9jY3VycmVuY2VzIG9mCi0JICogdGhlIHNwZWNpZmllZCBlbGVtZW50IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVBbGxPY2N1cnJlbmNlcyhjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoYXJyYXlMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5TGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gYXJyYXlMZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldICE9IHZhbHVlKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5OyAgLy8gbm90aGluZyB3YXMgcmVtb3ZlZAotCQl9Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltqXTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5W2luZGljZXNbaV1dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgb2NjdXJyZW5jZXMgb2YKLQkgKiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhpbnRbXSBhcnJheSwgaW50IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJlbW92ZUFsbE9jY3VycmVuY2VzKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoYXJyYXlMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5TGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gYXJyYXlMZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldICE9IHZhbHVlKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5OyAgLy8gbm90aGluZyB3YXMgcmVtb3ZlZAotCQl9Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbal07Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgZHVwbGljYXRlIGVsZW1lbnRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlbW92ZSBhbnkgZHVwbGljYXRlIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiB3aGlsZSBtYWludGFpbmluZyB0aGUgb3JkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKEUuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCUFycmF5TGlzdDxFPiB0ZW1wID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoYXJyYXkpOwotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKHRlbXAsIGxlbikgPwotCQkJCQl0ZW1wLnRvQXJyYXkobmV3QXJyYXkoYXJyYXksIHRlbXAuc2l6ZSgpKSkgOgotCQkJCQlhcnJheTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGVsZW1lbnQgYXQgaW5kZXggKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudCByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVFbGVtZW50QXRJbmRleChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlRWxlbWVudEF0SW5kZXgoRVtdIGFycmF5LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHJlbW92ZUVsZW1lbnRzQXRJbmRleChhcnJheSwgaW5kZXgsIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlRWxlbWVudEF0SW5kZXgoY2hhcltdIGFycmF5LCBpbnQgaW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZUVsZW1lbnRBdEluZGV4KGNoYXJbXSBhcnJheSwgaW50IGluZGV4KSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50c0F0SW5kZXgoYXJyYXksIGluZGV4LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUVsZW1lbnRBdEluZGV4KGludFtdIGFycmF5LCBpbnQgaW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmVtb3ZlRWxlbWVudEF0SW5kZXgoaW50W10gYXJyYXksIGludCBpbmRleCkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudHNBdEluZGV4KGFycmF5LCBpbmRleCwgMSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBlbGVtZW50cyBhdCBpbmRleCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50cyByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoT2JqZWN0W10gYXJyYXksIGludCBpbmRleCwgaW50IGxlbmd0aCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUVsZW1lbnRzQXRJbmRleChFW10gYXJyYXksIGludCBpbmRleCwgaW50IGxlbmd0aCkgewotCQlpZiAobGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCWludCBuZXdMZW5ndGggPSBhcnJheUxlbmd0aCAtIGxlbmd0aDsKLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5LCBuZXdMZW5ndGgpOwotCQlpZiAoKG5ld0xlbmd0aCA9PSAwKSAmJiAoaW5kZXggPT0gMCkpIHsKLQkJCXJldHVybiByZXN1bHQ7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCWlmIChpbmRleCAhPSAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJfQotCQlpbnQgbGVuZ3RoMiA9IG5ld0xlbmd0aCAtIGluZGV4OwotCQlpZiAobGVuZ3RoMiAhPSAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpbmRleCArIGxlbmd0aCwgcmVzdWx0LCBpbmRleCwgbGVuZ3RoMik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50cyByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoY2hhcltdIGFycmF5LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlRWxlbWVudHNBdEluZGV4KGNoYXJbXSBhcnJheSwgaW50IGluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmIChsZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJaW50IG5ld0xlbmd0aCA9IGFycmF5TGVuZ3RoIC0gbGVuZ3RoOwotCQlpZiAoKG5ld0xlbmd0aCA9PSAwKSAmJiAoaW5kZXggPT0gMCkpIHsKLQkJCXJldHVybiBFTVBUWV9DSEFSX0FSUkFZOyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJfQotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbmV3TGVuZ3RoXTsKLQkJaWYgKGluZGV4ICE9IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQl9Ci0JCWludCBsZW5ndGgyID0gbmV3TGVuZ3RoIC0gaW5kZXg7Ci0JCWlmIChsZW5ndGgyICE9IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluZGV4ICsgbGVuZ3RoLCByZXN1bHQsIGluZGV4LCBsZW5ndGgyKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChpbnRbXSBhcnJheSwgaW50IGluZGV4LCBpbnQgbGVuZ3RoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmVtb3ZlRWxlbWVudHNBdEluZGV4KGludFtdIGFycmF5LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlpbnQgbmV3TGVuZ3RoID0gYXJyYXlMZW5ndGggLSBsZW5ndGg7Ci0JCWlmICgobmV3TGVuZ3RoID09IDApICYmIChpbmRleCA9PSAwKSkgewotCQkJcmV0dXJuIEVNUFRZX0lOVF9BUlJBWTsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtuZXdMZW5ndGhdOwotCQlpZiAoaW5kZXggIT0gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCX0KLQkJaW50IGxlbmd0aDIgPSBuZXdMZW5ndGggLSBpbmRleDsKLQkJaWYgKGxlbmd0aDIgIT0gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXggKyBsZW5ndGgsIHJlc3VsdCwgaW5kZXgsIGxlbmd0aDIpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlcGxhY2UgYWxsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgb2xkIHZhbHVlIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZS4gUmV0dXJuIHRoZSBhbHRlcmVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZXBsYWNlQWxsKE9iamVjdFtdIGFycmF5LCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlcGxhY2VBbGwoRVtdIGFycmF5LCBPYmplY3Qgb2xkVmFsdWUsIEUgbmV3VmFsdWUpIHsKLQkJaWYgKG9sZFZhbHVlID09IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmIChhcnJheVtpXSA9PSBudWxsKSB7Ci0JCQkJCWFycmF5W2ldID0gbmV3VmFsdWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKG9sZFZhbHVlLmVxdWFscyhhcnJheVtpXSkpIHsKLQkJCQkJYXJyYXlbaV0gPSBuZXdWYWx1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgb2xkIHZhbHVlIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZS4gUmV0dXJuIHRoZSBhbHRlcmVkIGFycmF5LgotCSAqPHA+Ci0JICogPGNvZGU+IEFycmF5cy5yZXBsYWNlQWxsKGludFtdIGFycmF5LCBpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZXBsYWNlQWxsKGludFtdIGFycmF5LCBpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheVtpXSA9PSBvbGRWYWx1ZSkgewotCQkJCWFycmF5W2ldID0gbmV3VmFsdWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgb2xkIHZhbHVlIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZS4gUmV0dXJuIHRoZSBhbHRlcmVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZXBsYWNlQWxsKGNoYXJbXSBhcnJheSwgY2hhciBvbGRWYWx1ZSwgY2hhciBuZXdWYWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVwbGFjZUFsbChjaGFyW10gYXJyYXksIGNoYXIgb2xkVmFsdWUsIGNoYXIgbmV3VmFsdWUpIHsKLQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYXJyYXlbaV0gPT0gb2xkVmFsdWUpIHsKLQkJCQlhcnJheVtpXSA9IG5ld1ZhbHVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmV0YWluIGFsbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXRhaW4gaW4gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJldGFpbkFsbChPYmplY3RbXSBhcnJheSwgSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXlMZW5ndGggPT0gMCkgPyBhcnJheSA6IHJldGFpbkFsbChhcnJheSwgYXJyYXlMZW5ndGgsIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZXRhaW5BbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gYXJyYXkgOiByZXRhaW5BbGwoYXJyYXksIGFycmF5TGVuZ3RoLCBpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmV0YWluQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJldGFpbkFsbChFW10gYXJyYXksIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheUxlbmd0aCA9PSAwKSA/IGFycmF5IDogcmV0YWluQWxsKGFycmF5LCBhcnJheUxlbmd0aCwgaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZXRhaW5BbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gYXJyYXkgOiByZXRhaW5BbGwoYXJyYXksIGFycmF5TGVuZ3RoLCBpdGVyYXRvciwgaXRlcmF0b3JTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgaW50IGFycmF5TGVuZ3RoLCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8KLQkJCQlyZXRhaW5BbGxfKGFycmF5LCBDb2xsZWN0aW9uVG9vbHMuc2V0KGl0ZXJhdG9yKSwgYXJyYXlMZW5ndGgpIDoKLQkJCQluZXdBcnJheShhcnJheSwgMCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIHJldGFpbkFsbChFW10gYXJyYXksIGludCBhcnJheUxlbmd0aCwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/Ci0JCQkJcmV0YWluQWxsXyhhcnJheSwgQ29sbGVjdGlvblRvb2xzLnNldChpdGVyYXRvciwgaXRlcmF0b3JTaXplKSwgYXJyYXlMZW5ndGgpIDoKLQkJCQluZXdBcnJheShhcnJheSwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJldGFpbkFsbChPYmplY3RbXSBhcnJheSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheUxlbmd0aCA9PSAwKSA/IGFycmF5IDogcmV0YWluQWxsKGFycmF5LCBjb2xsZWN0aW9uLCBhcnJheUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIHJldGFpbkFsbChFW10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgaW50IGFycmF5TGVuZ3RoKSB7Ci0JCXJldHVybiBjb2xsZWN0aW9uLmlzRW1wdHkoKSA/Ci0JCQkJbmV3QXJyYXkoYXJyYXksIDApIDoKLQkJCQlyZXRhaW5BbGxfKGFycmF5LCBjb2xsZWN0aW9uLCBhcnJheUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGNvbGxlY3Rpb24gaXMgbm9uLWVtcHR5IGFuZCBhcnJheSBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGxfKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbYXJyYXlMZW5ndGhdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykgewotCQkJaWYgKGNvbGxlY3Rpb24uY29udGFpbnMoYXJyYXlbaV0pKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5OyAgLy8gZXZlcnl0aGluZyB3YXMgcmV0YWluZWQKLQkJfQotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXksIGopOwotCQlpbnQgcmVzdWx0TGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gYXJyYXlbaW5kaWNlc1tpXV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgZmlyc3Qgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2Vjb25kIHNwZWNpZmllZCBhcnJheSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJldGFpbkFsbChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJldGFpbkFsbChFW10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJaW50IGFycmF5MUxlbmd0aCA9IGFycmF5MS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXkxTGVuZ3RoID09IDApID8KLQkJCQlhcnJheTEgOgotCQkJCShhcnJheTIubGVuZ3RoID09IDApID8KLQkJCQkJbmV3QXJyYXkoYXJyYXkxLCAwKSA6Ci0JCQkJCXJldGFpbkFsbChhcnJheTEsIENvbGxlY3Rpb25Ub29scy5zZXQoYXJyYXkyKSwgYXJyYXkxTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgZmlyc3Qgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2Vjb25kIHNwZWNpZmllZCBhcnJheSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJldGFpbkFsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZXRhaW5BbGwoY2hhcltdIGFycmF5MSwgY2hhci4uLiBhcnJheTIpIHsKLQkJaW50IGFycmF5MUxlbmd0aCA9IGFycmF5MS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXkxTGVuZ3RoID09IDApID8gYXJyYXkxIDogcmV0YWluQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAxIGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gcmV0YWluQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgpIHsKLQkJaW50IGFycmF5Mkxlbmd0aCA9IGFycmF5Mi5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXkyTGVuZ3RoID09IDApID8gRU1QVFlfQ0hBUl9BUlJBWSA6IHJldGFpbkFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBib3RoIGFycmF5IGxlbmd0aHMgPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHJldGFpbkFsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5MUxlbmd0aF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheTFMZW5ndGg7IGkrKykgewotCQkJaWYgKGNvbnRhaW5zXyhhcnJheTIsIGFycmF5MVtpXSwgYXJyYXkyTGVuZ3RoKSkgewotCQkJCWluZGljZXNbaisrXSA9IGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGogPT0gYXJyYXkxTGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYXJyYXkxOyAgLy8gZXZlcnl0aGluZyB3YXMgcmV0YWluZWQKLQkJfQotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbal07Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheTFbaW5kaWNlc1tpXV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgZmlyc3Qgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2Vjb25kIHNwZWNpZmllZCBhcnJheSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJldGFpbkFsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZXRhaW5BbGwoaW50W10gYXJyYXkxLCBpbnQuLi4gYXJyYXkyKSB7Ci0JCWludCBhcnJheTFMZW5ndGggPSBhcnJheTEubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5MUxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IHJldGFpbkFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMSBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gcmV0YWluQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoKSB7Ci0JCWludCBhcnJheTJMZW5ndGggPSBhcnJheTIubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IEVNUFRZX0lOVF9BUlJBWSA6IHJldGFpbkFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBib3RoIGFycmF5IGxlbmd0aHMgPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gcmV0YWluQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5MUxlbmd0aF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheTFMZW5ndGg7IGkrKykgewotCQkJaWYgKGNvbnRhaW5zXyhhcnJheTIsIGFycmF5MVtpXSwgYXJyYXkyTGVuZ3RoKSkgewotCQkJCWluZGljZXNbaisrXSA9IGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGogPT0gYXJyYXkxTGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYXJyYXkxOyAgLy8gZXZlcnl0aGluZyB3YXMgcmV0YWluZWQKLQkJfQotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2pdOwotCQlpbnQgcmVzdWx0TGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gYXJyYXkxW2luZGljZXNbaV1dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJldmVyc2UgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSwgcmV2ZXJzZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJldmVyc2UoT2JqZWN0Li4uIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmV2ZXJzZShFLi4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICgobGVuID09IDApIHx8IChsZW4gPT0gMSkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlmb3IgKGludCBpID0gMCwgbWlkID0gbGVuID4+IDEsIGogPSBsZW4gLSAxOyBpIDwgbWlkOyBpKyssIGotLSkgewotCQkJc3dhcChhcnJheSwgaSwgaik7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXksIHJldmVyc2VkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZXZlcnNlKGNoYXIuLi4gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJldmVyc2UoY2hhci4uLiBhcnJheSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDAsIG1pZCA9IGxlbiA+PiAxLCBqID0gbGVuIC0gMTsgaSA8IG1pZDsgaSsrLCBqLS0pIHsKLQkJCXN3YXAoYXJyYXksIGksIGopOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5LCByZXZlcnNlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmV2ZXJzZShpbnQuLi4gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmV2ZXJzZShpbnQuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWZvciAoaW50IGkgPSAwLCBtaWQgPSBsZW4gPj4gMSwgaiA9IGxlbiAtIDE7IGkgPCBtaWQ7IGkrKywgai0tKSB7Ci0JCQlzd2FwKGFycmF5LCBpLCBqKTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJvdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJvdGF0ZWQgYXJyYXkgYWZ0ZXIgcm90YXRpbmcgaXQgb25lIHBvc2l0aW9uLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yb3RhdGUoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByb3RhdGUoRS4uLiBhcnJheSkgewotCQlyZXR1cm4gcm90YXRlKGFycmF5LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJvdGF0ZWQgYXJyYXkgYWZ0ZXIgcm90YXRpbmcgaXQgdGhlIHNwZWNpZmllZCBkaXN0YW5jZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucm90YXRlKE9iamVjdFtdIGFycmF5LCBpbnQgZGlzdGFuY2UpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByb3RhdGUoRVtdIGFycmF5LCBpbnQgZGlzdGFuY2UpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWRpc3RhbmNlID0gZGlzdGFuY2UgJSBsZW47Ci0JCWlmIChkaXN0YW5jZSA8IDApIHsKLQkJCWRpc3RhbmNlICs9IGxlbjsKLQkJfQotCQlpZiAoZGlzdGFuY2UgPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWZvciAoaW50IGN5Y2xlU3RhcnQgPSAwLCBuTW92ZWQgPSAwOyBuTW92ZWQgIT0gbGVuOyBjeWNsZVN0YXJ0KyspIHsKLQkJCUUgZGlzcGxhY2VkID0gYXJyYXlbY3ljbGVTdGFydF07Ci0JCQlpbnQgaSA9IGN5Y2xlU3RhcnQ7Ci0JCQlkbyB7Ci0JCQkJaSArPSBkaXN0YW5jZTsKLQkJCQlpZiAoaSA+PSBsZW4pIHsKLQkJCQkJaSAtPSBsZW47Ci0JCQkJfQotCQkJCUUgdGVtcCA9IGFycmF5W2ldOwotCQkJCWFycmF5W2ldID0gZGlzcGxhY2VkOwotCQkJCWRpc3BsYWNlZCA9IHRlbXA7Ci0JCQkJbk1vdmVkICsrOwotCQkJfSB3aGlsZSAoaSAhPSBjeWNsZVN0YXJ0KTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByb3RhdGVkIGFycmF5IGFmdGVyIHJvdGF0aW5nIGl0IG9uZSBwb3NpdGlvbi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucm90YXRlKGNoYXJbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcm90YXRlKGNoYXIuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIHJvdGF0ZShhcnJheSwgMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByb3RhdGVkIGFycmF5IGFmdGVyIHJvdGF0aW5nIGl0IHRoZSBzcGVjaWZpZWQgZGlzdGFuY2UuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJvdGF0ZShjaGFyW10gYXJyYXksIGludCBkaXN0YW5jZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcm90YXRlKGNoYXJbXSBhcnJheSwgaW50IGRpc3RhbmNlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICgobGVuID09IDApIHx8IChsZW4gPT0gMSkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlkaXN0YW5jZSA9IGRpc3RhbmNlICUgbGVuOwotCQlpZiAoZGlzdGFuY2UgPCAwKSB7Ci0JCQlkaXN0YW5jZSArPSBsZW47Ci0JCX0KLQkJaWYgKGRpc3RhbmNlID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlmb3IgKGludCBjeWNsZVN0YXJ0ID0gMCwgbk1vdmVkID0gMDsgbk1vdmVkICE9IGxlbjsgY3ljbGVTdGFydCsrKSB7Ci0JCQljaGFyIGRpc3BsYWNlZCA9IGFycmF5W2N5Y2xlU3RhcnRdOwotCQkJaW50IGkgPSBjeWNsZVN0YXJ0OwotCQkJZG8gewotCQkJCWkgKz0gZGlzdGFuY2U7Ci0JCQkJaWYgKGkgPj0gbGVuKSB7Ci0JCQkJCWkgLT0gbGVuOwotCQkJCX0KLQkJCQljaGFyIHRlbXAgPSBhcnJheVtpXTsKLQkJCQlhcnJheVtpXSA9IGRpc3BsYWNlZDsKLQkJCQlkaXNwbGFjZWQgPSB0ZW1wOwotCQkJCW5Nb3ZlZCArKzsKLQkJCX0gd2hpbGUgKGkgIT0gY3ljbGVTdGFydCk7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm90YXRlZCBhcnJheSBhZnRlciByb3RhdGluZyBpdCBvbmUgcG9zaXRpb24uCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJvdGF0ZShpbnRbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByb3RhdGUoaW50Li4uIGFycmF5KSB7Ci0JCXJldHVybiByb3RhdGUoYXJyYXksIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm90YXRlZCBhcnJheSBhZnRlciByb3RhdGluZyBpdCB0aGUgc3BlY2lmaWVkIGRpc3RhbmNlLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yb3RhdGUoaW50W10gYXJyYXksIGludCBkaXN0YW5jZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByb3RhdGUoaW50W10gYXJyYXksIGludCBkaXN0YW5jZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZGlzdGFuY2UgPSBkaXN0YW5jZSAlIGxlbjsKLQkJaWYgKGRpc3RhbmNlIDwgMCkgewotCQkJZGlzdGFuY2UgKz0gbGVuOwotCQl9Ci0JCWlmIChkaXN0YW5jZSA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZm9yIChpbnQgY3ljbGVTdGFydCA9IDAsIG5Nb3ZlZCA9IDA7IG5Nb3ZlZCAhPSBsZW47IGN5Y2xlU3RhcnQrKykgewotCQkJaW50IGRpc3BsYWNlZCA9IGFycmF5W2N5Y2xlU3RhcnRdOwotCQkJaW50IGkgPSBjeWNsZVN0YXJ0OwotCQkJZG8gewotCQkJCWkgKz0gZGlzdGFuY2U7Ci0JCQkJaWYgKGkgPj0gbGVuKSB7Ci0JCQkJCWkgLT0gbGVuOwotCQkJCX0KLQkJCQlpbnQgdGVtcCA9IGFycmF5W2ldOwotCQkJCWFycmF5W2ldID0gZGlzcGxhY2VkOwotCQkJCWRpc3BsYWNlZCA9IHRlbXA7Ci0JCQkJbk1vdmVkICsrOwotCQkJfSB3aGlsZSAoaSAhPSBjeWNsZVN0YXJ0KTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNodWZmbGUgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmFuZG9tIFJBTkRPTSA9IG5ldyBSYW5kb20oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgInNodWZmbGluZyIgaXQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnNodWZmbGUoT2JqZWN0Li4uIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gc2h1ZmZsZShFLi4uIGFycmF5KSB7Ci0JCXJldHVybiBzaHVmZmxlKGFycmF5LCBSQU5ET00pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgInNodWZmbGluZyIgaXQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnNodWZmbGUoT2JqZWN0W10gYXJyYXksIFJhbmRvbSByKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gc2h1ZmZsZShFW10gYXJyYXksIFJhbmRvbSByYW5kb20pIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJc3dhcChhcnJheSwgaSwgcmFuZG9tLm5leHRJbnQobGVuKSk7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgInNodWZmbGluZyIgaXQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnNodWZmbGUoY2hhci4uLiBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gc2h1ZmZsZShjaGFyLi4uIGFycmF5KSB7Ci0JCXJldHVybiBzaHVmZmxlKGFycmF5LCBSQU5ET00pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgInNodWZmbGluZyIgaXQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnNodWZmbGUoY2hhcltdIGFycmF5LCBSYW5kb20gcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gc2h1ZmZsZShjaGFyW10gYXJyYXksIFJhbmRvbSByYW5kb20pIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJc3dhcChhcnJheSwgaSwgcmFuZG9tLm5leHRJbnQobGVuKSk7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgInNodWZmbGluZyIgaXQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnNodWZmbGUoaW50Li4uIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHNodWZmbGUoaW50Li4uIGFycmF5KSB7Ci0JCXJldHVybiBzaHVmZmxlKGFycmF5LCBSQU5ET00pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgInNodWZmbGluZyIgaXQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnNodWZmbGUoaW50W10gYXJyYXksIFJhbmRvbSByKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHNodWZmbGUoaW50W10gYXJyYXksIFJhbmRvbSByYW5kb20pIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJc3dhcChhcnJheSwgaSwgcmFuZG9tLm5leHRJbnQobGVuKSk7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdWItYXJyYXkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgc3ViLWFycmF5IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkgd2l0aCBlbGVtZW50cyBjb3BpZWQgZnJvbQotCSAqIHRoZSBzcGVjaWZpZWQgcmFuZ2UuIFRoZSAiZnJvbSIgaW5kZXggaXMgaW5jbHVzaXZlOyB0aGUgInRvIiBpbmRleCBpcyBleGNsdXNpdmUuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnN1YkFycmF5KEVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzdWJBcnJheShFW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCWludCBsZW4gPSB0b0luZGV4IC0gZnJvbUluZGV4OwotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXksIGxlbik7Ci0JCWlmIChsZW4gPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBmcm9tSW5kZXgsIHJlc3VsdCwgMCwgbGVuKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN1Yi1hcnJheSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5IHdpdGggZWxlbWVudHMgY29waWVkIGZyb20KLQkgKiB0aGUgc3BlY2lmaWVkIHJhbmdlLiBUaGUgImZyb20iIGluZGV4IGlzIGluY2x1c2l2ZTsgdGhlICJ0byIgaW5kZXggaXMgZXhjbHVzaXZlLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5zdWJBcnJheShpbnRbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gc3ViQXJyYXkoaW50W10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCWludCBsZW4gPSB0b0luZGV4IC0gZnJvbUluZGV4OwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9JTlRfQVJSQVk7Ci0JCX0KLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtsZW5dOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBmcm9tSW5kZXgsIHJlc3VsdCwgMCwgbGVuKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItYXJyYXkgb2YgdGhlIHNwZWNpZmllZCBhcnJheSB3aXRoIGVsZW1lbnRzIGNvcGllZCBmcm9tCi0JICogdGhlIHNwZWNpZmllZCByYW5nZS4gVGhlICJmcm9tIiBpbmRleCBpcyBpbmNsdXNpdmU7IHRoZSAidG8iIGluZGV4IGlzIGV4Y2x1c2l2ZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBBcnJheXMuc3ViQXJyYXkoY2hhcltdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCk8L2NvZGU+Ci0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHN1YkFycmF5KGNoYXJbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJaW50IGxlbiA9IHRvSW5kZXggLSBmcm9tSW5kZXg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIEVNUFRZX0NIQVJfQVJSQVk7Ci0JCX0KLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbl07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGZyb21JbmRleCwgcmVzdWx0LCAwLCBsZW4pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzd2FwICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBlbGVtZW50cyBoYXZlIGJlZW4gInN3YXBwZWQiLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5zd2FwKE9iamVjdFtdIGFycmF5LCBpbnQgaSwgaW50IGopPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzd2FwKEVbXSBhcnJheSwgaW50IGksIGludCBqKSB7Ci0JCXJldHVybiAoaSA9PSBqKSA/IGFycmF5IDogc3dhcF8oYXJyYXksIGksIGopOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0aGUgaW5kaWNlcyBhcmUgZGlmZmVyZW50Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBzd2FwXyhFW10gYXJyYXksIGludCBpLCBpbnQgaikgewotCQlFIHRlbXAgPSBhcnJheVtpXTsKLQkJYXJyYXlbaV0gPSBhcnJheVtqXTsKLQkJYXJyYXlbal0gPSB0ZW1wOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIGhhdmUgYmVlbiAic3dhcHBlZCIuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnN3YXAoY2hhcltdIGFycmF5LCBpbnQgaSwgaW50IGopPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHN3YXAoY2hhcltdIGFycmF5LCBpbnQgaSwgaW50IGopIHsKLQkJcmV0dXJuIChpID09IGopID8gYXJyYXkgOiBzd2FwXyhhcnJheSwgaSwgaik7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBpbmRpY2VzIGFyZSBkaWZmZXJlbnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gc3dhcF8oY2hhcltdIGFycmF5LCBpbnQgaSwgaW50IGopIHsKLQkJY2hhciB0ZW1wID0gYXJyYXlbaV07Ci0JCWFycmF5W2ldID0gYXJyYXlbal07Ci0JCWFycmF5W2pdID0gdGVtcDsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBlbGVtZW50cyBoYXZlIGJlZW4gInN3YXBwZWQiLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5zd2FwKGludFtdIGFycmF5LCBpbnQgaSwgaW50IGopPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gc3dhcChpbnRbXSBhcnJheSwgaW50IGksIGludCBqKSB7Ci0JCXJldHVybiAoaSA9PSBqKSA/IGFycmF5IDogc3dhcF8oYXJyYXksIGksIGopOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0aGUgaW5kaWNlcyBhcmUgZGlmZmVyZW50Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gc3dhcF8oaW50W10gYXJyYXksIGludCBpLCBpbnQgaikgewotCQlpbnQgdGVtcCA9IGFycmF5W2ldOwotCQlhcnJheVtpXSA9IGFycmF5W2pdOwotCQlhcnJheVtqXSA9IHRlbXA7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXJyYXlzIGVuaGFuY2VtZW50cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoYm9vbGVhbltdLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbltdIGZpbGwoYm9vbGVhbltdIGFycmF5LCBib29sZWFuIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoYm9vbGVhbltdLCBpbnQsIGludCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW5bXSBmaWxsKGJvb2xlYW5bXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIGJvb2xlYW4gdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGJ5dGVbXSwgYnl0ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBmaWxsKGJ5dGVbXSBhcnJheSwgYnl0ZSB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGJ5dGVbXSwgaW50LCBpbnQsIGJ5dGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlW10gZmlsbChieXRlW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBieXRlIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChjaGFyW10sIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gZmlsbChjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChjaGFyW10sIGludCwgaW50LCBjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGZpbGwoY2hhcltdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgY2hhciB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoZG91YmxlW10sIGRvdWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGRvdWJsZVtdIGZpbGwoZG91YmxlW10gYXJyYXksIGRvdWJsZSB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGRvdWJsZVtdLCBpbnQsIGludCwgZG91YmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZG91YmxlW10gZmlsbChkb3VibGVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIGRvdWJsZSB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoZmxvYXRbXSwgZmxvYXQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmbG9hdFtdIGZpbGwoZmxvYXRbXSBhcnJheSwgZmxvYXQgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChmbG9hdFtdLCBpbnQsIGludCwgZmxvYXQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmbG9hdFtdIGZpbGwoZmxvYXRbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIGZsb2F0IHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChpbnRbXSwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gZmlsbChpbnRbXSBhcnJheSwgaW50IHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoaW50W10sIGludCwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBmaWxsKGludFtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgaW50IHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChPYmplY3RbXSwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBmaWxsKEVbXSBhcnJheSwgRSB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKE9iamVjdFtdLCBpbnQsIGludCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBmaWxsKEVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIEUgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGxvbmdbXSwgbG9uZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGxvbmdbXSBmaWxsKGxvbmdbXSBhcnJheSwgbG9uZyB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGxvbmdbXSwgaW50LCBpbnQsIGxvbmcpCi0JICovCi0JcHVibGljIHN0YXRpYyBsb25nW10gZmlsbChsb25nW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBsb25nIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChzaG9ydFtdLCBzaG9ydCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHNob3J0W10gZmlsbChzaG9ydFtdIGFycmF5LCBzaG9ydCB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKHNob3J0W10sIGludCwgaW50LCBzaG9ydCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHNob3J0W10gZmlsbChzaG9ydFtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgc2hvcnQgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGJ5dGVbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBzb3J0KGJ5dGUuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGJ5dGVbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlW10gc29ydChieXRlW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGNoYXJbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBzb3J0KGNoYXIuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGNoYXJbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gc29ydChjaGFyW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGRvdWJsZVtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZG91YmxlW10gc29ydChkb3VibGUuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGRvdWJsZVtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGRvdWJsZVtdIHNvcnQoZG91YmxlW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGZsb2F0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyBmbG9hdFtdIHNvcnQoZmxvYXQuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGZsb2F0W10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmxvYXRbXSBzb3J0KGZsb2F0W10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGludFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gc29ydChpbnQuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGludFtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHNvcnQoaW50W10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzb3J0KEUuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KE9iamVjdFtdLCBDb21wYXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzb3J0KEVbXSBhcnJheSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGNvbXBhcmF0b3IpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KE9iamVjdFtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gc29ydChFW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KE9iamVjdFtdLCBpbnQsIGludCwgQ29tcGFyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gc29ydChFW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCBjb21wYXJhdG9yKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChsb25nW10pCi0JICovCi0JcHVibGljIHN0YXRpYyBsb25nW10gc29ydChsb25nLi4uIGFycmF5KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChsb25nW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgbG9uZ1tdIHNvcnQobG9uZ1tdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChzaG9ydFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgc2hvcnRbXSBzb3J0KHNob3J0Li4uIGFycmF5KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChzaG9ydFtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHNob3J0W10gc29ydChzaG9ydFtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgQXJyYXlUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Bc3NvY2lhdGlvbi5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQXNzb2NpYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyMjZiNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Bc3NvY2lhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLS8qKgotICogU3RyYWlnaHRmb3J3YXJkIGRlZmluaXRpb24gb2YgYW4gb2JqZWN0IHBhaXJpbmcuCi0gKiBUaGUga2V5IGlzIGltbXV0YWJsZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBBc3NvY2lhdGlvbjxLLCBWPiB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFzc29jaWF0aW9uJ3Mga2V5LgotCSAqLwotCUsgZ2V0S2V5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFzc29jaWF0aW9uJ3MgdmFsdWUuCi0JICovCi0JViBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0IHRoZSBhc3NvY2lhdGlvbidzIHZhbHVlLgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JViBzZXRWYWx1ZShWIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBhc3NvY2lhdGlvbnMnIGtleXMgYW5kIHZhbHVlcwotCSAqIGFyZSBlcXVhbC4KLQkgKi8KLQlib29sZWFuIGVxdWFscyhPYmplY3Qgbyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBoYXNoIGNvZGUgYmFzZWQgb24gdGhlIGFzc29jaWF0aW9uJ3MKLQkgKiBrZXkgYW5kIHZhbHVlLgotCSAqLwotCWludCBoYXNoQ29kZSgpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9CYWcuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0JhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2VjZjk3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0JhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotCi0vKioKLSAqIEEgY29sbGVjdGlvbiB0aGF0IGFsbG93cyBkdXBsaWNhdGUgZWxlbWVudHMuCi0gKiA8cD4KLSAqIFRoZSA8Y29kZT5CYWc8L2NvZGU+IGludGVyZmFjZSBwbGFjZXMgYWRkaXRpb25hbCBzdGlwdWxhdGlvbnMsCi0gKiBiZXlvbmQgdGhvc2UgaW5oZXJpdGVkIGZyb20gdGhlIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbn0gaW50ZXJmYWNlLAotICogb24gdGhlIGNvbnRyYWN0cyBvZiB0aGUge0BsaW5rICNlcXVhbHMoT2JqZWN0KX0gYW5kIHtAbGluayAjaGFzaENvZGUoKX0gbWV0aG9kcy4KLSAqIAotICogQHNlZSBIYXNoQmFnCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBCYWc8RT4gZXh0ZW5kcyBqYXZhLnV0aWwuQ29sbGVjdGlvbjxFPiB7Ci0KLQkvKioKLQkgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB3aXRoIHRoaXMgYmFnIGZvciBlcXVhbGl0eS4gUmV0dXJucwotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGFsc28gYSBiYWcsIHRoZSB0d28gYmFncwotCSAqIGhhdmUgdGhlIHNhbWUgc2l6ZSwgYW5kIGV2ZXJ5IG1lbWJlciBvZiB0aGUgc3BlY2lmaWVkIGJhZyBpcwotCSAqIGNvbnRhaW5lZCBpbiB0aGlzIGJhZyB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBvY2N1cnJlbmNlcyAob3IgZXF1aXZhbGVudGx5LAotCSAqIGV2ZXJ5IG1lbWJlciBvZiB0aGlzIGJhZyBpcyBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZCBiYWcgd2l0aCB0aGUgc2FtZQotCSAqIG51bWJlciBvZiBvY2N1cnJlbmNlcykuIFRoaXMgZGVmaW5pdGlvbiBlbnN1cmVzIHRoYXQgdGhlCi0JICogZXF1YWxzIG1ldGhvZCB3b3JrcyBwcm9wZXJseSBhY3Jvc3MgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiB0aGUKLQkgKiBiYWcgaW50ZXJmYWNlLgotCSAqLwotCWJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBiYWcuIFRoZSBoYXNoIGNvZGUgb2YgYSBiYWcgaXMKLQkgKiBkZWZpbmVkIHRvIGJlIHRoZSBzdW0gb2YgdGhlIGhhc2ggY29kZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBiYWcsCi0JICogd2hlcmUgdGhlIGhhc2hjb2RlIG9mIGEgPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudCBpcyBkZWZpbmVkIHRvIGJlIHplcm8uCi0JICogVGhpcyBlbnN1cmVzIHRoYXQgPGNvZGU+YjEuZXF1YWxzKGIyKTwvY29kZT4gaW1wbGllcyB0aGF0Ci0JICogPGNvZGU+YjEuaGFzaENvZGUoKSA9PSBiMi5oYXNoQ29kZSgpPC9jb2RlPiBmb3IgYW55IHR3byBiYWdzCi0JICogPGNvZGU+YjE8L2NvZGU+IGFuZCA8Y29kZT5iMjwvY29kZT4sIGFzIHJlcXVpcmVkIGJ5IHRoZSBnZW5lcmFsCi0JICogY29udHJhY3Qgb2YgdGhlIHtAbGluayBPYmplY3QjaGFzaENvZGUoKX0gbWV0aG9kLgotCSAqLwotCWludCBoYXNoQ29kZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHNwZWNpZmllZCBvYmplY3Qgb2NjdXJzIGluIHRoZSBiYWcuCi0JICovCi0JaW50IGNvdW50KE9iamVjdCBvKTsKLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG9iamVjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB0aW1lcyB0byB0aGUgYmFnLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBiYWcgY2hhbmdlZC4KLQkgKi8KLQlib29sZWFuIGFkZChFIG8sIGludCBjb3VudCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QKLQkgKiBmcm9tIHRoZSBiYWcuIFJldHVybiB3aGV0aGVyIHRoZSBiYWcgY2hhbmdlZC4KLQkgKi8KLQlib29sZWFuIHJlbW92ZShPYmplY3QgbywgaW50IGNvdW50KTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgZWFjaCBpdGVtIGluIHRoZSBiYWcKLQkgKiBvbmNlIGFuZCBvbmx5IG9uY2UsIGlycmVzcGVjdGl2ZSBvZiBob3cgbWFueSB0aW1lcwotCSAqIHRoZSBpdGVtIHdhcyBhZGRlZCB0byB0aGUgYmFnLgotCSAqLwotCWphdmEudXRpbC5JdGVyYXRvcjxFPiB1bmlxdWVJdGVyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdW5pcXVlIGl0ZW1zIGluIHRoZSBiYWcuCi0JICovCi0JaW50IHVuaXF1ZUNvdW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIGFuIGVudHJ5IGZvciBlYWNoIGl0ZW0gaW4gdGhlIGJhZwotCSAqIG9uY2UgYW5kIG9ubHkgb25jZSwgaXJyZXNwZWN0aXZlIG9mIGhvdyBtYW55IHRpbWVzCi0JICogdGhlIGl0ZW0gd2FzIGFkZGVkIHRvIHRoZSBiYWcuIFRoZSBlbnRyeSB3aWxsIGluZGljYXRlIHRoZSBpdGVtJ3MKLQkgKiBjb3VudC4KLQkgKi8KLQlqYXZhLnV0aWwuSXRlcmF0b3I8RW50cnk8RT4+IGVudHJpZXMoKTsKLQotCi0JLyoqCi0JICogQSBiYWcgZW50cnkgKGVsZW1lbnQtY291bnQgcGFpcikuCi0JICogVGhlIHtAbGluayBCYWcjZW50cmllcygpfSBtZXRob2QgcmV0dXJucyBhbiBpdGVyYXRvciB3aG9zZQotCSAqIGVsZW1lbnRzIGFyZSBvZiB0aGlzIGNsYXNzLiBUaGUgPGVtPm9ubHk8L2VtPiB3YXkgdG8gb2J0YWluIGEgcmVmZXJlbmNlCi0JICogdG8gYSBiYWcgZW50cnkgaXMgZnJvbSB0aGUgaXRlcmF0b3IgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QuIFRoZXNlCi0JICogPGNvZGU+QmFnLkVudHJ5PC9jb2RlPiBvYmplY3RzIGFyZSB2YWxpZCA8ZW0+b25seTwvZW0+IGZvciB0aGUgZHVyYXRpb24KLQkgKiBvZiB0aGUgaXRlcmF0aW9uOyBtb3JlIGZvcm1hbGx5LCB0aGUgYmVoYXZpb3Igb2YgYSBiYWcgZW50cnkgaXMKLQkgKiB1bmRlZmluZWQgaWYgdGhlIGJhY2tpbmcgYmFnIGhhcyBiZWVuIG1vZGlmaWVkIGFmdGVyIHRoZSBlbnRyeSB3YXMKLQkgKiByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IsIGV4Y2VwdCB0aHJvdWdoIHRoZSB7QGxpbmsgI3NldENvdW50KGludCl9Ci0JICogb3BlcmF0aW9uIG9uIHRoZSBiYWcgZW50cnkuCi0JICovCi0JaW50ZXJmYWNlIEVudHJ5PEU+IHsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBlbnRyeSdzIGVsZW1lbnQuCi0JCSAqLwotCQlFIGdldEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIGVudHJ5J3MgY291bnQ7IGkuZS4gdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZW50cnkncyBlbGVtZW50Ci0JCSAqIG9jY3VycyBpbiB0aGUgYmFnLgotCQkgKiBAc2VlIEJhZyNjb3VudChPYmplY3QpCi0JCSAqLwotCQlpbnQgZ2V0Q291bnQoKTsKLQotCQkvKioKLQkJICogU2V0IHRoZSBlbnRyeSdzIGNvdW50OyBpLmUuIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGVudHJ5J3MgZWxlbWVudAotCQkgKiBvY2N1cnMgaW4gdGhlIGJhZy4gVGhlIG5ldyBjb3VudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLgotCQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIGNvdW50IG9mIHRoZSBlbnRyeSdzIGVsZW1lbnQuCi0JCSAqIE5COiBVc2Uge0BsaW5rIEl0ZXJhdG9yI3JlbW92ZSgpfSB0byBzZXQgdGhlCi0JCSAqIGNvdW50IHRvIHplcm8uCi0JCSAqLwotCQlpbnQgc2V0Q291bnQoaW50IGNvdW50KTsKLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudHJ5IGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0OwotCQkgKiBpLmUuIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGEgPGNvZGU+QmFnLkVudHJ5PC9jb2RlPiBhbmQgaXRzCi0JCSAqIGVsZW1lbnQgYW5kIGNvdW50IGFyZSB0aGUgc2FtZSBhcyB0aGUgZW50cnkncy4KLQkJICovCi0JCWJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGVudHJ5J3MgaGFzaCBjb2RlLgotCQkgKi8KLQkJaW50IGhhc2hDb2RlKCk7Ci0KLQl9Ci0KLQotCWZpbmFsIGNsYXNzIEVtcHR5PEU+IGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uPEU+IGltcGxlbWVudHMgQmFnPEU+LCBTZXJpYWxpemFibGUgewotCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEJhZyBJTlNUQU5DRSA9IG5ldyBFbXB0eSgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8VD4gQmFnPFQ+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBFbXB0eSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxFPiB1bmlxdWVJdGVyYXRvcigpIHsKLQkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCX0KLQkJcHVibGljIGludCB1bmlxdWVDb3VudCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBpbnQgY291bnQoT2JqZWN0IG8pIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxCYWcuRW50cnk8RT4+IGVudHJpZXMoKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbywgaW50IGNvdW50KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gYWRkKEUgbywgaW50IGNvdW50KSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZiAobyA9PSB0aGlzKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBCYWc8Pz4pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuICgoQmFnPD8+KSBvKS5zaXplKCkgPT0gMDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0JpZGlGaWx0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0JpZGlGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE1ZGM4Zi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9CaWRpRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci0KLS8qKgotICogVXNlZCBieSB2YXJpb3VzICJwbHVnZ2FibGUiIGNsYXNzZXMgdG8gZmlsdGVyIG9iamVjdHMKLSAqIGluIGJvdGggZGlyZWN0aW9ucy4KLSAqIAotICogSWYgYW55b25lIGNhbiBjb21lIHVwIHdpdGggYSBiZXR0ZXIgY2xhc3MgbmFtZQotICogYW5kL29yIG1ldGhvZCBuYW1lLCBJIHdvdWxkIGxvdmUgdG8gaGVhciBpdC4gIH5ianYKLSAqLwotcHVibGljIGludGVyZmFjZSBCaWRpRmlsdGVyPFQ+Ci0JZXh0ZW5kcyBGaWx0ZXI8VD4KLXsKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyAiYWNjZXB0ZWQiIGJ5IHRoZQotCSAqICJyZXZlcnNlIiBmaWx0ZXIuIFdoYXQgdGhhdCBtZWFucyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjbGllbnQuCi0JICovCi0JYm9vbGVhbiByZXZlcnNlQWNjZXB0KFQgbyk7Ci0KLQotCWZpbmFsIGNsYXNzIE51bGw8Uz4KLQkJaW1wbGVtZW50cyBCaWRpRmlsdGVyPFM+LCBTZXJpYWxpemFibGUKLQl7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaUZpbHRlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBCaWRpRmlsdGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBub3RoaW5nIGlzIGZpbHRlcmVkIC0gZXZlcnl0aGluZyBpcyBhY2NlcHRlZAotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoUyBvKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBub3RoaW5nIGlzICJyZXZlcnNlLWZpbHRlcmVkIiAtIGV2ZXJ5dGhpbmcgaXMgYWNjZXB0ZWQKLQkJcHVibGljIGJvb2xlYW4gcmV2ZXJzZUFjY2VwdChTIG8pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCWZpbmFsIGNsYXNzIE9wYXF1ZTxTPgotCQlpbXBsZW1lbnRzIEJpZGlGaWx0ZXI8Uz4sIFNlcmlhbGl6YWJsZQotCXsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpRmlsdGVyIElOU1RBTkNFID0gbmV3IE9wYXF1ZSgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gQmlkaUZpbHRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgT3BhcXVlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBldmVyeXRoaW5nIGlzIGZpbHRlcmVkIC0gbm90aGluZyBpcyBhY2NlcHRlZAotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoUyBvKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gZXZlcnl0aGluZyBpcyAicmV2ZXJzZS1maWx0ZXJlZCIgLSBub3RoaW5nIGlzIGFjY2VwdGVkCi0JCXB1YmxpYyBib29sZWFuIHJldmVyc2VBY2NlcHQoUyBvKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0JZmluYWwgY2xhc3MgRGlzYWJsZWQ8Uz4KLQkJaW1wbGVtZW50cyBCaWRpRmlsdGVyPFM+LCBTZXJpYWxpemFibGUKLQl7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaUZpbHRlciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gQmlkaUZpbHRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoUyBvKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJcHVibGljIGJvb2xlYW4gcmV2ZXJzZUFjY2VwdChTIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0JpZGlTdHJpbmdDb252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0JpZGlTdHJpbmdDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3ZWJkYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9CaWRpU3RyaW5nQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBVc2VkIGJ5IHZhcmlvdXMgInBsdWdnYWJsZSIgY2xhc3NlcyB0byB0cmFuc2Zvcm0gb2JqZWN0cwotICogaW50byBzdHJpbmdzIGFuZCB2aWNlIHZlcnNhLgotICogCi0gKiBJZiBhbnlvbmUgY2FuIGNvbWUgdXAgd2l0aCBhIGJldHRlciBjbGFzcyBuYW1lCi0gKiBhbmQvb3IgbWV0aG9kIG5hbWUsIEkgd291bGQgbG92ZSB0byBoZWFyIGl0LiAgfmJqdgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJpZGlTdHJpbmdDb252ZXJ0ZXI8VD4KLQlleHRlbmRzIFN0cmluZ0NvbnZlcnRlcjxUPgotewotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBzdHJpbmcgaW50byBhbiBvYmplY3QuCi0JICogVGhlIHNlbWFudGljcyBvZiAiY29udmVydCB0byBvYmplY3QiIGlzIGRldGVybWluZWQgYnkgdGhlCi0JICogY29udHJhY3QgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLgotCSAqIFR5cGljYWxseSwgaWYgdGhlIHN0cmluZyBpcyBudWxsLCBudWxsIGlzIHJldHVybmVkLgotCSAqLwotCVQgY29udmVydFRvT2JqZWN0KFN0cmluZyBzKTsKLQotCi0JZmluYWwgY2xhc3MgRGVmYXVsdDxTPgotCQlpbXBsZW1lbnRzIEJpZGlTdHJpbmdDb252ZXJ0ZXI8Uz4sIFNlcmlhbGl6YWJsZQotCXsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpU3RyaW5nQ29udmVydGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFI+IEJpZGlTdHJpbmdDb252ZXJ0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIERlZmF1bHQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHNpbXBseSByZXR1cm4gdGhlIG9iamVjdCdzICN0b1N0cmluZygpIHJlc3VsdAotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTIG8pIHsKLQkJCXJldHVybiAobyA9PSBudWxsKSA/IG51bGwgOiBvLnRvU3RyaW5nKCk7Ci0JCX0KLQkJLy8gc2ltcGx5IHJldHVybiB0aGUgc3RyaW5nCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgUyBjb252ZXJ0VG9PYmplY3QoU3RyaW5nIHMpIHsKLQkJCXJldHVybiAoUykgczsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPgotCQlpbXBsZW1lbnRzIEJpZGlTdHJpbmdDb252ZXJ0ZXI8Uz4sIFNlcmlhbGl6YWJsZQotCXsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpU3RyaW5nQ29udmVydGVyIElOU1RBTkNFID0gbmV3IERpc2FibGVkKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBCaWRpU3RyaW5nQ29udmVydGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFMgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBTIGNvbnZlcnRUb09iamVjdChTdHJpbmcgcykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0JZmluYWwgY2xhc3MgQm9vbGVhbkNvbnZlcnRlcgotCQlpbXBsZW1lbnRzIEJpZGlTdHJpbmdDb252ZXJ0ZXI8Qm9vbGVhbj4sIFNlcmlhbGl6YWJsZQotCXsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpU3RyaW5nQ29udmVydGVyPEJvb2xlYW4+IElOU1RBTkNFID0gbmV3IEJvb2xlYW5Db252ZXJ0ZXIoKTsKLQkJcHVibGljIHN0YXRpYyBCaWRpU3RyaW5nQ29udmVydGVyPEJvb2xlYW4+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBCb29sZWFuQ29udmVydGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvKiogUmV0dXJuICJ0cnVlIiBpZiB0aGUgQm9vbGVhbiBpcyB0cnVlLCBvdGhlcndpc2UgcmV0dXJuICJmYWxzZSIuICovCi0JCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEJvb2xlYW4gYikgewotCQkJcmV0dXJuIChiID09IG51bGwpID8gbnVsbCA6IGIudG9TdHJpbmcoKTsKLQkJfQotCQkvKiogUmV0dXJuIEJvb2xlYW4uVFJVRSBpZiB0aGUgc3RyaW5nIGlzICJ0cnVlIiAoY2FzZS1pbnNlbnNpdGl2ZSksIG90aGVyd2lzZSByZXR1cm4gQm9vbGVhbi5GQUxTRS4gKi8KLQkJcHVibGljIEJvb2xlYW4gY29udmVydFRvT2JqZWN0KFN0cmluZyBzKSB7Ci0JCQlyZXR1cm4gKHMgPT0gbnVsbCkgPyBudWxsIDogQm9vbGVhbi52YWx1ZU9mKHMpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCWZpbmFsIGNsYXNzIEludGVnZXJDb252ZXJ0ZXIKLQkJaW1wbGVtZW50cyBCaWRpU3RyaW5nQ29udmVydGVyPEludGVnZXI+LCBTZXJpYWxpemFibGUKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaVN0cmluZ0NvbnZlcnRlcjxJbnRlZ2VyPiBJTlNUQU5DRSA9IG5ldyBJbnRlZ2VyQ29udmVydGVyKCk7Ci0JCXB1YmxpYyBzdGF0aWMgQmlkaVN0cmluZ0NvbnZlcnRlcjxJbnRlZ2VyPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgSW50ZWdlckNvbnZlcnRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLyoqIEludGVnZXIncyAjdG9TdHJpbmcoKSB3b3JrcyB3ZWxsLiAqLwotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhJbnRlZ2VyIGludGVnZXIpIHsKLQkJCXJldHVybiAoaW50ZWdlciA9PSBudWxsKSA/IG51bGwgOiBpbnRlZ2VyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJLyoqIENvbnZlcnQgdGhlIHN0cmluZyB0byBhbiBJbnRlZ2VyLCBpZiBwb3NzaWJsZS4gKi8KLQkJcHVibGljIEludGVnZXIgY29udmVydFRvT2JqZWN0KFN0cmluZyBzKSB7Ci0JCQlyZXR1cm4gKHMgPT0gbnVsbCkgPyBudWxsIDogSW50ZWdlci52YWx1ZU9mKHMpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0JpZGlUcmFuc2Zvcm1lci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQmlkaVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MTZhZjQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQmlkaVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFVzZWQgYnkgdmFyaW91cyAicGx1Z2dhYmxlIiBjbGFzc2VzIHRvIHRyYW5zZm9ybSBvYmplY3RzCi0gKiBpbiBib3RoIGRpcmVjdGlvbnMuCi0gKiAKLSAqIElmIGFueW9uZSBjYW4gY29tZSB1cCB3aXRoIGEgYmV0dGVyIGNsYXNzIG5hbWUKLSAqIGFuZC9vciBtZXRob2QgbmFtZSwgSSB3b3VsZCBsb3ZlIHRvIGhlYXIgaXQuICB+Ymp2Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmlkaVRyYW5zZm9ybWVyPFQxLCBUMj4KLQlleHRlbmRzIFRyYW5zZm9ybWVyPFQxLCBUMj4KLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJyZXZlcnNlLXRyYW5zZm9ybWVkIiBvYmplY3QuCi0JICogVGhlIHNlbWFudGljcyBvZiAicmV2ZXJzZS10cmFuc2Zvcm0iIGlzIGRldGVybWluZWQgYnkgdGhlCi0JICogY29udHJhY3QgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLgotCSAqLwotCVQxIHJldmVyc2VUcmFuc2Zvcm0oVDIgbyk7Ci0KLQotCWZpbmFsIGNsYXNzIE51bGw8UzEsIFMyPgotCQlpbXBsZW1lbnRzIEJpZGlUcmFuc2Zvcm1lcjxTMSwgUzI+LCBTZXJpYWxpemFibGUKLQl7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaVRyYW5zZm9ybWVyIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFIxLCBSMj4gQmlkaVRyYW5zZm9ybWVyPFIxLCBSMj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHNpbXBseSByZXR1cm4gdGhlIG9iamVjdCwgdW5jaGFuZ2VkCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgUzIgdHJhbnNmb3JtKFMxIG8pIHsKLQkJCXJldHVybiAoUzIpIG87Ci0JCX0KLQkJLy8gc2ltcGx5IHJldHVybiB0aGUgb2JqZWN0LCB1bmNoYW5nZWQKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBTMSByZXZlcnNlVHJhbnNmb3JtKFMyIG8pIHsKLQkJCXJldHVybiAoUzEpIG87Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0JZmluYWwgY2xhc3MgRGlzYWJsZWQ8UzEsIFMyPgotCQlpbXBsZW1lbnRzIEJpZGlUcmFuc2Zvcm1lcjxTMSwgUzI+LCBTZXJpYWxpemFibGUKLQl7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaVRyYW5zZm9ybWVyIElOU1RBTkNFID0gbmV3IERpc2FibGVkKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSMSwgUjI+IEJpZGlUcmFuc2Zvcm1lcjxSMSwgUjI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBTMiB0cmFuc2Zvcm0oUzEgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBTMSByZXZlcnNlVHJhbnNmb3JtKFMyIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0JpdFRvb2xzLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9CaXRUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGNiZjdjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0JpdFRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLS8qKgotICogQXNzb3J0ZWQgYml0IHRvb2xzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaXRUb29scyB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ1RvQ2hlY2snIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmxhZ0lzU2V0KGludCBmbGFncywgaW50IGZsYWdUb0NoZWNrKSB7Ci0JCXJldHVybiBhbGxGbGFnc0FyZVNldChmbGFncywgZmxhZ1RvQ2hlY2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnVG9DaGVjaycgdHVybmVkIG9mZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmxhZ0lzT2ZmKGludCBmbGFncywgaW50IGZsYWdUb0NoZWNrKSB7Ci0JCXJldHVybiBhbGxGbGFnc0FyZU9mZihmbGFncywgZmxhZ1RvQ2hlY2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgT05MWSB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdUb0NoZWNrJyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9ubHlGbGFnSXNTZXQoaW50IGZsYWdzLCBpbnQgZmxhZ1RvQ2hlY2spIHsKLQkJcmV0dXJuIG9ubHlGbGFnc0FyZVNldChmbGFncywgZmxhZ1RvQ2hlY2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgT05MWSB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdUb0NoZWNrJyB0dXJuZWQgb2ZmLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvbmx5RmxhZ0lzT2ZmKGludCBmbGFncywgaW50IGZsYWdUb0NoZWNrKSB7Ci0JCXJldHVybiBvbmx5RmxhZ3NBcmVPZmYoZmxhZ3MsIGZsYWdUb0NoZWNrKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIGFsbCB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbGxGbGFnc0FyZVNldChpbnQgZmxhZ3MsIGludCBmbGFnc1RvQ2hlY2spIHsKLQkJcmV0dXJuIChmbGFncyAmIGZsYWdzVG9DaGVjaykgPT0gZmxhZ3NUb0NoZWNrOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYWxsIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyB0dXJuZWQgb2ZmLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbGxGbGFnc0FyZU9mZihpbnQgZmxhZ3MsIGludCBmbGFnc1RvQ2hlY2spIHsKLQkJcmV0dXJuIChmbGFncyAmIGZsYWdzVG9DaGVjaykgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIE9OTFkgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb25seUZsYWdzQXJlU2V0KGludCBmbGFncywgaW50IGZsYWdzVG9DaGVjaykgewotCQlyZXR1cm4gYWxsRmxhZ3NBcmVTZXQoZmxhZ3MsIGZsYWdzVG9DaGVjaykgJiYgYWxsRmxhZ3NBcmVPZmYoZmxhZ3MsIH5mbGFnc1RvQ2hlY2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgT05MWSB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgdHVybmVkIG9mZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb25seUZsYWdzQXJlT2ZmKGludCBmbGFncywgaW50IGZsYWdzVG9DaGVjaykgewotCQlyZXR1cm4gYWxsRmxhZ3NBcmVPZmYoZmxhZ3MsIGZsYWdzVG9DaGVjaykgJiYgYWxsRmxhZ3NBcmVTZXQoZmxhZ3MsIH5mbGFnc1RvQ2hlY2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYW55IG9uZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbnlGbGFnc0FyZVNldChpbnQgZmxhZ3MsIGludCBmbGFnc1RvQ2hlY2spIHsKLQkJcmV0dXJuIChmbGFncyAmIGZsYWdzVG9DaGVjaykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIGFueSBvbmUgb2YgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHR1cm5lZCBvZmYuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFueUZsYWdzQXJlT2ZmKGludCBmbGFncywgaW50IGZsYWdzVG9DaGVjaykgewotCQlyZXR1cm4gKGZsYWdzICYgZmxhZ3NUb0NoZWNrKSAhPSBmbGFnc1RvQ2hlY2s7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBhbGwgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWxsRmxhZ3NBcmVTZXQoaW50IGZsYWdzLCBpbnQuLi4gZmxhZ3NUb0NoZWNrKSB7Ci0JCWZvciAoaW50IGkgPSBmbGFnc1RvQ2hlY2subGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBhbGxGbGFnc0FyZVNldChmbGFncywgZmxhZ3NUb0NoZWNrW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIGFsbCB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgdHVybmVkIG9mZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWxsRmxhZ3NBcmVPZmYoaW50IGZsYWdzLCBpbnQuLi4gZmxhZ3NUb0NoZWNrKSB7Ci0JCWZvciAoaW50IGkgPSBmbGFnc1RvQ2hlY2subGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBhbGxGbGFnc0FyZU9mZihmbGFncywgZmxhZ3NUb0NoZWNrW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIE9OTFkgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb25seUZsYWdzQXJlU2V0KGludCBmbGFncywgaW50Li4uIGZsYWdzVG9DaGVjaykgewotCQlpbnQgY29tYmluZWRGbGFncyA9IG9yRmxhZ3MoZmxhZ3NUb0NoZWNrKTsKLQkJcmV0dXJuIGFsbEZsYWdzQXJlU2V0KGZsYWdzLCBjb21iaW5lZEZsYWdzKSAmJiBhbGxGbGFnc0FyZU9mZihmbGFncywgfmNvbWJpbmVkRmxhZ3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgT05MWSB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgdHVybmVkIG9mZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb25seUZsYWdzQXJlT2ZmKGludCBmbGFncywgaW50Li4uIGZsYWdzVG9DaGVjaykgewotCQlpbnQgY29tYmluZWRGbGFncyA9IG9yRmxhZ3MoZmxhZ3NUb0NoZWNrKTsKLQkJcmV0dXJuIGFsbEZsYWdzQXJlT2ZmKGZsYWdzLCBjb21iaW5lZEZsYWdzKSAmJiBhbGxGbGFnc0FyZVNldChmbGFncywgfmNvbWJpbmVkRmxhZ3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYW55IG9uZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbnlGbGFnc0FyZVNldChpbnQgZmxhZ3MsIGludC4uLiBmbGFnc1RvQ2hlY2spIHsKLQkJZm9yIChpbnQgaSA9IGZsYWdzVG9DaGVjay5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFueUZsYWdzQXJlU2V0KGZsYWdzLCBmbGFnc1RvQ2hlY2tbaV0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYW55IG9uZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgdHVybmVkIG9mZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYW55RmxhZ3NBcmVPZmYoaW50IGZsYWdzLCBpbnQuLi4gZmxhZ3NUb0NoZWNrKSB7Ci0JCWZvciAoaW50IGkgPSBmbGFnc1RvQ2hlY2subGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhbnlGbGFnc0FyZU9mZihmbGFncywgZmxhZ3NUb0NoZWNrW2ldKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBPUiBhbGwgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIHRvZ2V0aGVyIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBvckZsYWdzKGludC4uLiBmbGFncykgewotCQlpbnQgbGFzdCA9IGZsYWdzLmxlbmd0aCAtIDE7Ci0JCWludCByZXN1bHQgPSBmbGFnc1tsYXN0XTsKLQkJZm9yIChpbnQgaSA9IGxhc3Q7IGktLSA+IDA7ICkgewotCQkJcmVzdWx0IHw9IGZsYWdzW2ldOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQU5EIGFsbCB0aGUgc3BlY2lmaWVkICdmbGFncycgdG9nZXRoZXIgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGFuZEZsYWdzKGludC4uLiBmbGFncykgewotCQlpbnQgbGFzdCA9IGZsYWdzLmxlbmd0aCAtIDE7Ci0JCWludCByZXN1bHQgPSBmbGFnc1tsYXN0XTsKLQkJZm9yIChpbnQgaSA9IGxhc3Q7IGktLSA+IDA7ICkgewotCQkJcmVzdWx0ICY9IGZsYWdzW2ldOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogWE9SIGFsbCB0aGUgc3BlY2lmaWVkICdmbGFncycgdG9nZXRoZXIgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHhvckZsYWdzKGludC4uLiBmbGFncykgewotCQlpbnQgbGFzdCA9IGZsYWdzLmxlbmd0aCAtIDE7Ci0JCWludCByZXN1bHQgPSBmbGFnc1tsYXN0XTsKLQkJZm9yIChpbnQgaSA9IGxhc3Q7IGktLSA+IDA7ICkgewotCQkJcmVzdWx0IF49IGZsYWdzW2ldOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBCaXRUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Cb29sZWFuVG9vbHMuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0Jvb2xlYW5Ub29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODNjMGYxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0Jvb2xlYW5Ub29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIEFzc29ydGVkICJDYXBpdGFsLUIgQm9vbGVhbiIgb3BlcmF0aW9ucy4KLSAqLwotIC8vIGNvbW1lbnRlZCBjb2RlIGlzIGp1c3QgcGxheWluZyBhcm91bmQgd2l0aCBidWlsZGluZyAqZXZlcnl0aGluZyogZnJvbSBOQU5ECi1wdWJsaWMgZmluYWwgY2xhc3MgQm9vbGVhblRvb2xzIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgTk9UIG9mIHRoZSBzcGVjaWZpZWQgQm9vbGVhbi4KLQkgKiBCb29sZWFuI25vdCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBCb29sZWFuIG5vdChCb29sZWFuIGIpIHsKLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZiggISBiLmJvb2xlYW5WYWx1ZSgpKTsKLS8vCQlyZXR1cm4gbmFuZChiLCBiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEFORCBvZiB0aGUgc3BlY2lmaWVkIEJvb2xlYW5zLgotCSAqIEJvb2xlYW4jYW5kKEJvb2xlYW4pCi0JICovCi0JcHVibGljIHN0YXRpYyBCb29sZWFuIGFuZChCb29sZWFuIGIxLCBCb29sZWFuIGIyKSB7Ci0JCXJldHVybiBCb29sZWFuLnZhbHVlT2YoYjEuYm9vbGVhblZhbHVlKCkgJiYgYjIuYm9vbGVhblZhbHVlKCkpOwotLy8JCUJvb2xlYW4gbmFuZCA9IG5hbmQoYjEsIGIyKTsKLS8vCQlyZXR1cm4gbmFuZChuYW5kLCBuYW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIE9SIG9mIHRoZSBzcGVjaWZpZWQgQm9vbGVhbnMuCi0JICogQm9vbGVhbiNvcihCb29sZWFuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQm9vbGVhbiBvcihCb29sZWFuIGIxLCBCb29sZWFuIGIyKSB7Ci0JCXJldHVybiBCb29sZWFuLnZhbHVlT2YoYjEuYm9vbGVhblZhbHVlKCkgfHwgYjIuYm9vbGVhblZhbHVlKCkpOwotLy8JCUJvb2xlYW4gbmFuZCA9IG5hbmQoYjEsIGIyKTsKLS8vCQlCb29sZWFuIHhvciA9IG5hbmQobmFuZChiMSwgbmFuZCksIG5hbmQoYjIsIG5hbmQpKTsKLS8vCQlCb29sZWFuIGFuZCA9IG5hbmQobmFuZCwgbmFuZCk7Ci0vLwkJQm9vbGVhbiBuYW5kMiA9IG5hbmQoeG9yLCBhbmQpOwotLy8JCXJldHVybiBuYW5kKG5hbmQoeG9yLCBuYW5kMiksIG5hbmQoYW5kLCBuYW5kMikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgWE9SIG9mIHRoZSBzcGVjaWZpZWQgQm9vbGVhbnMuCi0JICogQm9vbGVhbiN4b3IoQm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJvb2xlYW4geG9yKEJvb2xlYW4gYjEsIEJvb2xlYW4gYjIpIHsKLQkJcmV0dXJuIGFuZChvcihiMSwgYjIpLCBuYW5kKGIxLCBiMikpOwotLy8JCUJvb2xlYW4gbmFuZCA9IG5hbmQoYjEsIGIyKTsKLS8vCQlyZXR1cm4gbmFuZChuYW5kKGIxLCBuYW5kKSwgbmFuZChiMiwgbmFuZCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgTkFORCBvZiB0aGUgc3BlY2lmaWVkIEJvb2xlYW5zLgotCSAqIEJvb2xlYW4jbmFuZChCb29sZWFuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQm9vbGVhbiBuYW5kKEJvb2xlYW4gYjEsIEJvb2xlYW4gYjIpIHsKLQkJcmV0dXJuIG5vdChhbmQoYjEsIGIyKSk7Ci0vLwkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZiggISAoYjEuYm9vbGVhblZhbHVlKCkgJiYgYjIuYm9vbGVhblZhbHVlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIE5PUiBvZiB0aGUgc3BlY2lmaWVkIEJvb2xlYW5zLgotCSAqIEJvb2xlYW4jbm9yKEJvb2xlYW4pCi0JICovCi0JcHVibGljIHN0YXRpYyBCb29sZWFuIG5vcihCb29sZWFuIGIxLCBCb29sZWFuIGIyKSB7Ci0JCXJldHVybiBub3Qob3IoYjEsIGIyKSk7Ci0vLwkJQm9vbGVhbiBuYW5kID0gbmFuZChiMSwgYjIpOwotLy8JCUJvb2xlYW4geG9yID0gbmFuZChuYW5kKGIxLCBuYW5kKSwgbmFuZChiMiwgbmFuZCkpOwotLy8JCUJvb2xlYW4gYW5kID0gbmFuZChuYW5kLCBuYW5kKTsKLS8vCQlCb29sZWFuIG5hbmQyID0gbmFuZCh4b3IsIGFuZCk7Ci0vLwkJQm9vbGVhbiBuYW5kMyA9IG5hbmQobmFuZCh4b3IsIG5hbmQyKSwgbmFuZChhbmQsIG5hbmQyKSk7Ci0vLwkJcmV0dXJuIG5hbmQobmFuZDMsIG5hbmQzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFhOT1Igb2YgdGhlIHNwZWNpZmllZCBCb29sZWFucy4KLQkgKiBCb29sZWFuI3hub3IoQm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJvb2xlYW4geG5vcihCb29sZWFuIGIxLCBCb29sZWFuIGIyKSB7Ci0JCXJldHVybiBub3QoeG9yKGIxLCBiMikpOwotLy8JCUJvb2xlYW4gbmFuZCA9IG5hbmQoYjEsIGIyKTsKLS8vCQlCb29sZWFuIHhvciA9IG5hbmQobmFuZChiMSwgbmFuZCksIG5hbmQoYjIsIG5hbmQpKTsKLS8vCQlyZXR1cm4gbmFuZCh4b3IsIHhvcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBCb29sZWFuVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ2xhc3NOYW1lLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9DbGFzc05hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmNGJlMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9DbGFzc05hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIENvbnZlbmllbmNlIG1ldGhvZHMgcmVsYXRlZCB0byBKYXZhIGNsYXNzIG5hbWVzIGFzIHJldHVybmVkIGJ5Ci0gKiB7QGxpbmsgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKX0uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDbGFzc05hbWUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRF9DTEFTU19OQU1FID0gUmVmbGVjdGlvblRvb2xzLlZPSURfQ0xBU1MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZPSURfV1JBUFBFUl9DTEFTU19OQU1FID0gUmVmbGVjdGlvblRvb2xzLlZPSURfV1JBUFBFUl9DTEFTUy5nZXROYW1lKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUkVGRVJFTkNFX0NMQVNTX0NPREUgPSAnTCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFJFRkVSRU5DRV9DTEFTU19OQU1FX0RFTElNSVRFUiA9ICc7JzsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYW4gYXJyYXkgdHlwZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcnJheShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWUuY2hhckF0KDApID09ICdbJzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJlbGVtZW50IHR5cGUiIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGVsZW1lbnQgdHlwZSBpcyB0aGUgYmFzZSB0eXBlIGhlbGQgYnkgYW4gYXJyYXkgdHlwZS4KLQkgKiBOb24tYXJyYXkgdHlwZXMgc2ltcGx5IHJldHVybiB0aGVtc2VsdmVzLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRUeXBlTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWludCBkZXB0aCA9IGdldEFycmF5RGVwdGgoY2xhc3NOYW1lKTsKLQkJaWYgKGRlcHRoID09IDApIHsKLQkJCS8vIHRoZSBuYW1lIGlzIGluIHRoZSBmb3JtOiAiamF2YS5sYW5nLk9iamVjdCIgb3IgImludCIKLQkJCXJldHVybiBjbGFzc05hbWU7Ci0JCX0KLQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlTmFtZV8oY2xhc3NOYW1lLCBkZXB0aCk7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogYXJyYXkgZGVwdGggaXMgbm90IHplcm8KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudFR5cGVOYW1lXyhTdHJpbmcgY2xhc3NOYW1lLCBpbnQgYXJyYXlEZXB0aCkgewotCQlpbnQgbGFzdCA9IGNsYXNzTmFtZS5sZW5ndGgoKSAtIDE7Ci0JCWlmIChjbGFzc05hbWUuY2hhckF0KGFycmF5RGVwdGgpID09IFJFRkVSRU5DRV9DTEFTU19DT0RFKSB7Ci0JCQkvLyB0aGUgbmFtZSBpcyBpbiB0aGUgZm9ybTogIltbW0xqYXZhLmxhbmcuT2JqZWN0OyIKLQkJCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKGFycmF5RGVwdGggKyAxLCBsYXN0KTsJLy8gZHJvcCB0aGUgdHJhaWxpbmcgJzsnCi0JCX0KLQkJLy8gdGhlIG5hbWUgaXMgaW4gdGhlIGZvcm06ICJbW1tJIgotCQlyZXR1cm4gZm9yQ29kZShjbGFzc05hbWUuY2hhckF0KGxhc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhcnJheSBkZXB0aCIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZGVwdGggaXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGZvciBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBoYXZlIGEgZGVwdGggb2YgemVyby4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRBcnJheURlcHRoKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaW50IGRlcHRoID0gMDsKLQkJd2hpbGUgKGNsYXNzTmFtZS5jaGFyQXQoZGVwdGgpID09ICdbJykgewotCQkJZGVwdGgrKzsKLQkJfQotCQlyZXR1cm4gZGVwdGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgY2xhc3MncyBjb21wb25lbnQgdHlwZS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBub3QgYW4gYXJyYXkgdHlwZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb21wb25lbnRUeXBlTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXN3aXRjaCAoZ2V0QXJyYXlEZXB0aChjbGFzc05hbWUpKSB7Ci0JCQljYXNlIDA6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQljYXNlIDE6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlTmFtZV8oY2xhc3NOYW1lLCAxKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBjbGFzcydzIHNpbXBsZSBuYW1lLgotCSAqIFJldHVybiBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhbm9ueW1vdXMuCi0JICogPHA+Ci0JICogVGhlIHNpbXBsZSBuYW1lIG9mIGFuIGFycmF5IHR5cGUgaXMgdGhlIHNpbXBsZSBuYW1lIG9mIHRoZQotCSAqIGNvbXBvbmVudCB0eXBlIHdpdGggPGNvZGU+IltdIjwvY29kZT4gYXBwZW5kZWQuIEluIHBhcnRpY3VsYXIsCi0JICogdGhlIHNpbXBsZSBuYW1lIG9mIGFuIGFycmF5IHR5cGUgd2hvc2UgY29tcG9uZW50IHR5cGUgaXMKLQkgKiBhbm9ueW1vdXMgaXMgc2ltcGx5IDxjb2RlPiJbXSI8L2NvZGU+LgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldFNpbXBsZU5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNpbXBsZU5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gaXNBcnJheShjbGFzc05hbWUpID8KLQkJCQlnZXRTaW1wbGVOYW1lKGdldENvbXBvbmVudFR5cGVOYW1lKGNsYXNzTmFtZSkpICsgIltdIiA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTaW1wbGVOYW1lXyhjbGFzc05hbWUpOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHNwZWNpZmllZCBjbGFzcyBpcyBub3QgYW4gYXJyYXkgdHlwZQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTaW1wbGVOYW1lXyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWludCBpbmRleCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignJCcpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsgIC8vICJ0b3AtbGV2ZWwiIGNsYXNzIC0gc3RyaXAgcGFja2FnZSBuYW1lCi0JCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCQl9Ci0KLQkJaW50IGxlbiA9IGNsYXNzTmFtZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9ICsraW5kZXg7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKCAhIGNoYXJJc0FzY2lpRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpKSkpIHsKLQkJCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhpKTsgIC8vICJtZW1iZXIiIG9yICJsb2NhbCIgY2xhc3MKLQkJCX0KLQkJfQotCQkvLyBhbGwgdGhlIGNoYXJhY3RlcnMgcGFzdCB0aGUgJyQnIGFyZSBBU0NJSSBkaWdpdHMgKCJhbm9ueW1vdXMiIGNsYXNzKQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBjbGFzcydzIHBhY2thZ2UgbmFtZSAoZS5nLgotCSAqIDxjb2RlPiJqYXZhLmxhbmcuT2JqZWN0IjwvY29kZT4gcmV0dXJucwotCSAqIDxjb2RlPiJqYXZhLmxhbmciPC9jb2RlPikuCi0JICogUmV0dXJuIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzOjx1bD4KLQkgKiA8bGk+aW4gdGhlICJkZWZhdWx0IiBwYWNrYWdlCi0JICogPGxpPmFuIGFycmF5IGNsYXNzCi0JICogPGxpPmEgcHJpbXRpdmUgY2xhc3MKLQkgKiA8L3VsPgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldFBhY2thZ2UoKQotCSAqIEBzZWUgamF2YS5sYW5nLlBhY2thZ2UjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoaXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpbnQgbGFzdFBlcmlvZCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlyZXR1cm4gKGxhc3RQZXJpb2QgPT0gLTEpID8gIiIgOiBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGxhc3RQZXJpb2QpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ0b3AtbGV2ZWwiIGNsYXNzLAotCSAqIGFzIG9wcG9zZWQgdG8gYSAibWVtYmVyIiwgImxvY2FsIiwgb3IgImFub255bW91cyIgY2xhc3MsCi0JICogdXNpbmcgdGhlIHN0YW5kYXJkIEpESyBuYW1pbmcgY29udmVudGlvbnMgKGkuZS4gdGhlIGNsYXNzCi0JICogbmFtZSBkb2VzIE5PVCBjb250YWluIGEgPGNvZGU+JyQnPC9jb2RlPikuCi0JICogQSAidG9wLWxldmVsIiBjbGFzcyBjYW4gYmUgZWl0aGVyIHRoZSAicHJpbWFyeSIgKHB1YmxpYykgY2xhc3MgZGVmaW5lZAotCSAqIGluIGEgZmlsZS9jb21waWxhdGlvbiB1bml0IChpLmUuIHRoZSBjbGFzcyB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgaXRzCi0JICogZmlsZSdzIHNpbXBsZSBiYXNlIG5hbWUpIG9yIGEgIm5vbi1wcmltYXJ5IiAocGFja2FnZSB2aXNpYmxlKSBjbGFzcwotCSAqIChpLmUuIHRoZSBvdGhlciB0b3AtbGV2ZWwgY2xhc3NlcyBkZWZpbmVkIGluIGEgZmlsZSkuCi0JICogQSAidG9wLWxldmVsIiBjbGFzcyBjYW4gY29udGFpbiBhbnkgb2YgdGhlIG90aGVyIHR5cGVzIG9mIGNsYXNzZXMuIAotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RvcExldmVsKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGlzQXJyYXkoY2xhc3NOYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBjbGFzc05hbWUubGFzdEluZGV4T2YoJyQnKSA9PSAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgIm1lbWJlciIgY2xhc3MsCi0JICogYXMgb3Bwb3NlZCB0byBhICJ0b3AtbGV2ZWwiLCAibG9jYWwiLCBvciAiYW5vbnltb3VzIiBjbGFzcywKLQkgKiB1c2luZyB0aGUgc3RhbmRhcmQgSkRLIG5hbWluZyBjb252ZW50aW9uIChpLmUuIHRoZSBjbGFzcwotCSAqIG5hbWUgZW5kcyB3aXRoIGEgPGNvZGU+JyQnPC9jb2RlPiBmb2xsb3dlZCBieSBhIGxlZ2FsIGNsYXNzIG5hbWU7IGUuZy4KLQkgKiA8Y29kZT4iVG9wTGV2ZWxDbGFzcyQxTG9jYWxDbGFzcyRNZW1iZXJDbGFzcyI8L2NvZGU+KS4KLQkgKiBBICJtZW1iZXIiIGNsYXNzIGNhbiBiZSBlaXRoZXIgIm5lc3RlZCIgKHN0YXRpYykgb3IgImlubmVyIjsKLQkgKiBidXQgdGhlcmUgaXMgbm8gd2F5IHRvIGRldGVybWluZSB3aGljaCBmcm9tIHRoZSBjbGFzcydzIG5hbWUuCi0JICogQSAibWVtYmVyIiBjbGFzcyBjYW4gY29udGFpbiAibG9jYWwiLCAiYW5vbnltb3VzIiwgb3Igb3RoZXIKLQkgKiAibWVtYmVyIiBjbGFzc2VzOyBhbmQgdmljZS12ZXJzYS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZW1iZXIoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoaXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCckJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIGZhbHNlOwkvLyAidG9wLWxldmVsIiBjbGFzcwotCQl9Ci0JCS8vIHRoZSBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGRvbGxhciBzaWduIGNhbm5vdCBiZSBhbiBBU0NJSSBkaWdpdAotCQlyZXR1cm4gISBjaGFySXNBc2NpaURpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoKytpbmRleCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAibG9jYWwiIGNsYXNzLAotCSAqIGFzIG9wcG9zZWQgdG8gYSAidG9wLWxldmVsIiwgIm1lbWJlciIsIG9yICJhbm9ueW1vdXMiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBKREsgbmFtaW5nIGNvbnZlbnRpb24gKGkuZS4gdGhlIGNsYXNzIG5hbWUKLQkgKiBlbmRzIHdpdGggPGNvZGU+IiRubm5YWFgiPC9jb2RlPiwKLQkgKiB3aGVyZSB0aGUgPGNvZGU+JyQnPC9jb2RlPiBpcwotCSAqIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mIG51bWVyaWMgZGlnaXRzIHdoaWNoIGFyZSBmb2xsb3dlZCBieSB0aGUKLQkgKiBsb2NhbCBjbGFzcyBuYW1lOyBlLmcuIDxjb2RlPiJUb3BMZXZlbENsYXNzJDFMb2NhbENsYXNzIjwvY29kZT4pLgotCSAqIEEgImxvY2FsIiBjbGFzcyBjYW4gY29udGFpbiAibWVtYmVyIiwgImFub255bW91cyIsIG9yIG90aGVyCi0JICogImxvY2FsIiBjbGFzc2VzOyBhbmQgdmljZS12ZXJzYS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2NhbChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChpc0FycmF5KGNsYXNzTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgaW5kZXggPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJyQnKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gZmFsc2U7CS8vICJ0b3AtbGV2ZWwiIGNsYXNzCi0JCX0KLQkJaWYgKCAhIGNoYXJJc0FzY2lpRGlnaXQoY2xhc3NOYW1lLmNoYXJBdCgrK2luZGV4KSkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vICJtZW1iZXIiIGNsYXNzCi0JCX0KLQkJaW50IGxlbiA9IGNsYXNzTmFtZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9ICsraW5kZXg7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKCAhIGNoYXJJc0FzY2lpRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkvLyBhbGwgdGhlIGNoYXJhY3RlcnMgcGFzdCB0aGUgJyQnIGFyZSBBU0NJSSBkaWdpdHMgKCJhbm9ueW1vdXMiIGNsYXNzKQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhbiAiYW5vbnltb3VzIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgInRvcC1sZXZlbCIsICJtZW1iZXIiLCBvciAibG9jYWwiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBKREsgbmFtaW5nIGNvbnZlbnRpb24gKGkuZS4gdGhlIGNsYXNzCi0JICogbmFtZSBlbmRzIHdpdGggPGNvZGU+IiRubm4iPC9jb2RlPiB3aGVyZSBhbGwgdGhlIGNoYXJhY3RlcnMgcGFzdCB0aGUKLQkgKiBsYXN0IDxjb2RlPickJzwvY29kZT4gYXJlIEFTQ0lJIG51bWVyaWMgZGlnaXRzOwotCSAqIGUuZy4gPGNvZGU+IlRvcExldmVsQ2xhc3MkMSI8L2NvZGU+KS4KLQkgKiBBbiAiYW5vbnltb3VzIiBjbGFzcyBjYW4gY29udGFpbiAibWVtYmVyIiwgImxvY2FsIiwgb3Igb3RoZXIKLQkgKiAiYW5vbnltb3VzIiBjbGFzc2VzOyBhbmQgdmljZS12ZXJzYS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbm9ueW1vdXMoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoaXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCckJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIGZhbHNlOwkvLyAidG9wLWxldmVsIiBjbGFzcwotCQl9Ci0JCWlmICggISBjaGFySXNBc2NpaURpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoKytpbmRleCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyAibWVtYmVyIiBjbGFzcwotCQl9Ci0JCWludCBsZW4gPSBjbGFzc05hbWUubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSArK2luZGV4OyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmICggISBjaGFySXNBc2NpaURpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoaSkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOyAgLy8gImxvY2FsIiBjbGFzcwotCQkJfQotCQl9Ci0JCS8vIGFsbCB0aGUgY2hhcmFjdGVycyBwYXN0IHRoZSAnJCcgYXJlIEFTQ0lJIGRpZ2l0cyAoImFub255bW91cyIgY2xhc3MpCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIHtAbGluayBDaGFyYWN0ZXIjaXNEaWdpdChjaGFyKX0gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBmb3Igc29tZSBub24tQVNDSUkKLQkgKiBkaWdpdHMuIFRoaXMgbWV0aG9kIGRvZXMgbm90LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hhcklzQXNjaWlEaWdpdChjaGFyIGMpIHsKLQkJcmV0dXJuICgnMCcgPD0gYykgJiYgKGMgPD0gJzknKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInJlZmVyZW5jZSIKLQkgKiBjbGFzcyAoaS5lLiBuZWl0aGVyIDxjb2RlPnZvaWQ8L2NvZGU+IG5vciBvbmUgb2YgdGhlIHByaW1pdGl2ZSB2YXJpYWJsZSBjbGFzc2VzLAotCSAqIDxjb2RlPmJvb2xlYW48L2NvZGU+LCA8Y29kZT5pbnQ8L2NvZGU+LCA8Y29kZT5mbG9hdDwvY29kZT4sIGV0Yy4pLgotCSAqIDxwPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IDxjb2RlPnZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlZmVyZW5jZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiAhIGlzUHJpbWl0aXZlKGNsYXNzTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhIHByaW1pdGl2ZQotCSAqIGNsYXNzIChpLmUuIDxjb2RlPnZvaWQ8L2NvZGU+IG9yIG9uZSBvZiB0aGUgcHJpbWl0aXZlIHZhcmlhYmxlIGNsYXNzZXMsCi0JICogPGNvZGU+Ym9vbGVhbjwvY29kZT4sIDxjb2RlPmludDwvY29kZT4sIDxjb2RlPmZsb2F0PC9jb2RlPiwgZXRjLikuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gPGNvZGU+dm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWU8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGlzQXJyYXkoY2xhc3NOYW1lKSB8fCAoY2xhc3NOYW1lLmxlbmd0aCgpID4gUmVmbGVjdGlvblRvb2xzLk1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCWZvciAoUmVmbGVjdGlvblRvb2xzLlByaW1pdGl2ZSBwcmltaXRpdmUgOiBSZWZsZWN0aW9uVG9vbHMuUFJJTUlUSVZFUykgewotCQkJaWYgKGNsYXNzTmFtZS5lcXVhbHMocHJpbWl0aXZlLmphdmFDbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSBwcmltaXRpdmUgd3JhcHBlcgotCSAqIGNsYXNzIChpLmUuIDxjb2RlPmphdmEubGFuZy5Wb2lkPC9jb2RlPiBvciBvbmUgb2YgdGhlIHByaW1pdGl2ZQotCSAqIHZhcmlhYmxlIHdyYXBwZXIgY2xhc3NlcywgPGNvZGU+amF2YS5sYW5nLkJvb2xlYW48L2NvZGU+LAotCSAqIDxjb2RlPmphdmEubGFuZy5JbnRlZ2VyPC9jb2RlPiwgPGNvZGU+amF2YS5sYW5nLkZsb2F0PC9jb2RlPiwgZXRjLikuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gPGNvZGU+dm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWU8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlV3JhcHBlcihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChpc0FycmF5KGNsYXNzTmFtZSkgfHwgKGNsYXNzTmFtZS5sZW5ndGgoKSA+IFJlZmxlY3Rpb25Ub29scy5NQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCWZvciAoUmVmbGVjdGlvblRvb2xzLlByaW1pdGl2ZSBwcmltaXRpdmUgOiBSZWZsZWN0aW9uVG9vbHMuUFJJTUlUSVZFUykgewotCQkJaWYgKGNsYXNzTmFtZS5lcXVhbHMocHJpbWl0aXZlLndyYXBwZXJDbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAidmFyaWFibGUiIHByaW1pdGl2ZQotCSAqIGNsYXNzIChpLmUuIDxjb2RlPmJvb2xlYW48L2NvZGU+LCA8Y29kZT5pbnQ8L2NvZGU+LCA8Y29kZT5mbG9hdDwvY29kZT4sIGV0Yy4sCi0JICogYnV0IG5vdCA8Y29kZT52b2lkPC9jb2RlPikuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gPGNvZGU+dm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWU8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFyaWFibGVQcmltaXRpdmUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gaXNQcmltaXRpdmUoY2xhc3NOYW1lKQotCQkJJiYgKCAhIGNsYXNzTmFtZS5lcXVhbHMoVk9JRF9DTEFTU19OQU1FKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ2YXJpYWJsZSIgcHJpbWl0aXZlIHdyYXBwZXIKLQkgKiBjbGFzcyAoaS5lLiA8Y29kZT5qYXZhLmxhbmcuQm9vbGVhbjwvY29kZT4sCi0JICogPGNvZGU+amF2YS5sYW5nLkludGVnZXI8L2NvZGU+LCA8Y29kZT5qYXZhLmxhbmcuRmxvYXQ8L2NvZGU+LCBldGMuLAotCSAqIGJ1dCBub3QgPGNvZGU+amF2YS5sYW5nLlZvaWQ8L2NvZGU+KS4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiA8Y29kZT52b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gaXNQcmltaXRpdmVXcmFwcGVyKGNsYXNzTmFtZSkKLQkJCSYmICggISBjbGFzc05hbWUuZXF1YWxzKFZPSURfV1JBUFBFUl9DTEFTU19OQU1FKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcmltaXRpdmUgd3JhcHBlciBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBwcmltaXRpdmUgY2xhc3MuIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIG5vdCBhIHByaW1pdGl2ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXcmFwcGVyQ2xhc3NOYW1lKFN0cmluZyBwcmltaXRpdmVDbGFzc05hbWUpIHsKLQkJZm9yIChSZWZsZWN0aW9uVG9vbHMuUHJpbWl0aXZlIHByaW1pdGl2ZSA6IFJlZmxlY3Rpb25Ub29scy5QUklNSVRJVkVTKSB7Ci0JCQlpZiAocHJpbWl0aXZlLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKHByaW1pdGl2ZUNsYXNzTmFtZSkpIHsKLQkJCQlyZXR1cm4gcHJpbWl0aXZlLndyYXBwZXJDbGFzcy5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcmltaXRpdmUgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkCi0JICogcHJpbWl0aXZlIHdyYXBwZXIgY2xhc3MuIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogaXMgbm90IGEgcHJpbWl0aXZlIHdyYXBwZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJpbWl0aXZlQ2xhc3NOYW1lKFN0cmluZyBwcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lKSB7Ci0JCWZvciAoUmVmbGVjdGlvblRvb2xzLlByaW1pdGl2ZSBwcmltaXRpdmUgOiBSZWZsZWN0aW9uVG9vbHMuUFJJTUlUSVZFUykgewotCQkJaWYgKHByaW1pdGl2ZS53cmFwcGVyQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhwcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lKSkgewotCQkJCXJldHVybiBwcmltaXRpdmUuamF2YUNsYXNzLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR3byBjbGFzcyBuYW1lcyBhcmUgZXF1aXZhbGVudCwgZ2l2ZW4gYXV0b2JveGluZy4KLQkgKiAoZS5nLiAiamF2YS5sYW5nLkludGVnZXIiIGFuZCAiaW50IiBzaG91bGQgYmUgZXF1aXZhbGVudCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXJlQXV0b2JveEVxdWl2YWxlbnRzKFN0cmluZyBjbGFzc05hbWUxLCBTdHJpbmcgY2xhc3NOYW1lMikgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwoY2xhc3NOYW1lMSwgY2xhc3NOYW1lMikKLQkJCXx8IFRvb2xzLnZhbHVlc0FyZUVxdWFsKGdldFByaW1pdGl2ZUNsYXNzTmFtZShjbGFzc05hbWUxKSwgY2xhc3NOYW1lMikKLQkJCXx8IFRvb2xzLnZhbHVlc0FyZUVxdWFsKGdldFdyYXBwZXJDbGFzc05hbWUoY2xhc3NOYW1lMSksIGNsYXNzTmFtZTIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmltaXRpdmUgY29kZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcmltaXRpdmUgY2xhc3MgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBwcmltaXRpdmUgY2xhc3MgY29kZS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBjb2RlCi0JICogaXMgbm90IGEgcHJpbWl0aXZlIGNsYXNzIGNvZGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9yQ29kZShpbnQgY2xhc3NDb2RlKSB7Ci0JCXJldHVybiBmb3JDb2RlKChjaGFyKSBjbGFzc0NvZGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJpbWl0aXZlIGNsYXNzIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgcHJpbWl0aXZlIGNsYXNzIGNvZGUuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgY29kZQotCSAqIGlzIG5vdCBhIHByaW1pdGl2ZSBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvckNvZGUoY2hhciBjbGFzc0NvZGUpIHsKLQkJQ2xhc3M8Pz4gcHJpbWl0aXZlQ2xhc3MgPSBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NGb3JDb2RlKGNsYXNzQ29kZSk7Ci0JCXJldHVybiAocHJpbWl0aXZlQ2xhc3MgPT0gbnVsbCkgPyBudWxsIDogcHJpbWl0aXZlQ2xhc3MuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgY29kZSBmb3IgdGhlIHNwZWNpZmllZCBwcmltaXRpdmUgY2xhc3MuCi0JICogUmV0dXJuIDxjb2RlPjA8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBpcyBub3QgYSBwcmltaXRpdmUgY2xhc3MuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyIGdldENvZGVGb3JDbGFzc05hbWUoU3RyaW5nIHByaW1pdGl2ZUNsYXNzTmFtZSkgewotCQlpZiAoKCAhIGlzQXJyYXkocHJpbWl0aXZlQ2xhc3NOYW1lKSkgJiYgKHByaW1pdGl2ZUNsYXNzTmFtZS5sZW5ndGgoKSA8PSBSZWZsZWN0aW9uVG9vbHMuTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSCkpIHsKLQkJCWZvciAoUmVmbGVjdGlvblRvb2xzLlByaW1pdGl2ZSBwcmltaXRpdmUgOiBSZWZsZWN0aW9uVG9vbHMuUFJJTUlUSVZFUykgewotCQkJCWlmIChwcmltaXRpdmUuamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMocHJpbWl0aXZlQ2xhc3NOYW1lKSkgewotCQkJCQlyZXR1cm4gcHJpbWl0aXZlLmNvZGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCXN0YXRpYyB2b2lkIGFwcGVuZChTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChSRUZFUkVOQ0VfQ0xBU1NfQ09ERSk7Ci0JCXNiLmFwcGVuZChjbGFzc05hbWUpOwotCQlzYi5hcHBlbmQoUkVGRVJFTkNFX0NMQVNTX05BTUVfREVMSU1JVEVSKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3VwcHJlc3NlZCBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgQ2xhc3NOYW1lKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0NsYXNzcGF0aC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ2xhc3NwYXRoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNjU3ZDUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ2xhc3NwYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLS8qKgotICogPGNvZGU+Q2xhc3NwYXRoPC9jb2RlPiBtb2RlbHMgYSBKYXZhIGNsYXNzcGF0aCwgd2hpY2ggY29uc2lzdHMgb2YgYSBsaXN0IG9mCi0gKiB7QGxpbmsgRW50cnl9cywgZWFjaCBvZiB3aGljaCBjb250YWluIEphdmEgY2xhc3Nlcy4gVGhlIGNsYXNzcGF0aCBjYW4gcmV0dXJuCi0gKiB0aGUgbmFtZXMgb2YgY2xhc3NlcyBmb3VuZCBpbiBpdCBldGMuIFRoZXJlIGFyZSBhIG51bWJlciBvZiBzdGF0aWMKLSAqIGNvbnZlbmllbmNlIG1ldGhvZHMgdGhhdCBjYW4gYmUgdXNlIHRvIGNvbnN0cnVjdCA8Y29kZT5DbGFzc3BhdGg8L2NvZGU+cwotICogY29ycmVzcG9uZGluZyB0byB0aGUgSmF2YSBjbGFzc3BhdGggZXRjLgotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoCi0JaW1wbGVtZW50cyBTZXJpYWxpemFibGUKLXsKLQkvKiogVGhlIGVudHJpZXMgaW4gdGhlIGNsYXNzcGF0aCAqLwotCXByaXZhdGUgZmluYWwgRW50cnlbXSBlbnRyaWVzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLy8gKioqKiogZmFjdG9yeSBtZXRob2RzIGZvciAic3RhbmRhcmQiIGNsYXNzcGF0aHMgKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSAiYm9vdCIgY2xhc3NwYXRoLiBUaGlzIGluY2x1ZGVzIDxjb2RlPnJ0LmphcjwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzc3BhdGggYm9vdENsYXNzcGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc3BhdGgoU3lzdGVtLmdldFByb3BlcnR5KCJzdW4uYm9vdC5jbGFzcy5wYXRoIikpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIFJldHVybiBhICJ2aXJ0dWFsIGNsYXNzcGF0aCIgdGhhdCBjb250YWlucyBhbGwgdGhlIGphcnMKLQkgKiB0aGF0IHdvdWxkIGJlIHVzZWQgYnkgdGhlIEphdmEgRXh0ZW5zaW9uIE1lY2hhbmlzbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzcGF0aCBqYXZhRXh0ZW5zaW9uQ2xhc3NwYXRoKCkgewotCQlGaWxlW10gZGlycyA9IGphdmFFeHRlbnNpb25EaXJlY3RvcmllcygpOwotCQlMaXN0PFN0cmluZz4gamFyRmlsZU5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoRmlsZSBkaXIgOiBkaXJzKSB7Ci0JCQlpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlhZGRKYXJGaWxlTmFtZXNUbyhkaXIsIGphckZpbGVOYW1lcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBDbGFzc3BhdGgoamFyRmlsZU5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgInN5c3RlbSIgY2xhc3NwYXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3NwYXRoIGphdmFDbGFzc3BhdGgoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NwYXRoKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB1bnJldG91Y2hlZCAiY29tcGxldGUiIGNsYXNzcGF0aC4KLQkgKiBUaGlzIGluY2x1ZGVzIHRoZSBib290IGNsYXNzcGF0aCwgdGhlIEphdmEgRXh0ZW5zaW9uCi0JICogTWVjaGFuaXNtIGNsYXNzcGF0aCwgYW5kIHRoZSBub3JtYWwgInN5c3RlbSIgY2xhc3NwYXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3NwYXRoIGNvbXBsZXRlQ2xhc3NwYXRoKCkgewotCQlyZXR1cm4gbmV3IENsYXNzcGF0aChuZXcgQ2xhc3NwYXRoW10gewotCQkJCWJvb3RDbGFzc3BhdGgoKSwKLQkJCQlqYXZhRXh0ZW5zaW9uQ2xhc3NwYXRoKCksCi0JCQkJamF2YUNsYXNzcGF0aCgpCi0JCX0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNsYXNzcGF0aCB0aGF0IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3NwYXRoIGNsYXNzcGF0aEZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc3BhdGgobG9jYXRpb25Gb3IoamF2YUNsYXNzKSk7Ci0JfQotCi0KLQkvLyAqKioqKiBmaWxlID0+IGNsYXNzICoqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IGEgcmVsYXRpdmUgZmlsZSBuYW1lIHRvIGEgY2xhc3MgbmFtZTsgdGhpcyB3aWxsIHdvcmsgZm9yCi0JICogYW55IGZpbGUgdGhhdCBoYXMgYSBzaW5nbGUgZXh0ZW5zaW9uIGJleW9uZCB0aGUgYmFzZQotCSAqIGNsYXNzIG5hbWU6PHVsPgotCSAqIDxsaT48Y29kZT4iamF2YS9sYW5nL1N0cmluZy5jbGFzcyI8L2NvZGU+IGlzIGNvbnZlcnRlZCB0byA8Y29kZT4iamF2YS5sYW5nLlN0cmluZyI8L2NvZGU+Ci0JICogPGxpPjxjb2RlPiJqYXZhL2xhbmcvU3RyaW5nLmphdmEiPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8gPGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvQ2xhc3NOYW1lKFN0cmluZyBjbGFzc0ZpbGVOYW1lKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBGaWxlVG9vbHMuc3RyaXBFeHRlbnNpb24oY2xhc3NGaWxlTmFtZSk7Ci0JCS8vIGRvIHRoaXMgZm9yIGFyY2hpdmUgZW50cnkgbmFtZXMKLQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoJy8nLCAnLicpOwotCQkvLyBkbyB0aGlzIGZvciBPL1Mtc3BlY2lmaWMgZmlsZSBuYW1lcwotCQlpZiAoRmlsZS5zZXBhcmF0b3JDaGFyICE9ICcvJykgewotCQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLicpOwotCQl9Ci0JCXJldHVybiBjbGFzc05hbWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhIGZpbGUgdG8gYSBjbGFzcyBuYW1lOwotCSAqIGUuZy4gPGNvZGU+RmlsZShqYXZhL2xhbmcvU3RyaW5nLmNsYXNzKTwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9DbGFzc05hbWUoRmlsZSBjbGFzc0ZpbGUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0NsYXNzTmFtZShjbGFzc0ZpbGUuZ2V0UGF0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGEgcmVsYXRpdmUgZmlsZSBuYW1lIHRvIGEgY2xhc3M7Ci0JICogZS5nLiA8Y29kZT4iamF2YS9sYW5nL1N0cmluZy5jbGFzcyI8L2NvZGU+IGlzIGNvbnZlcnRlZCB0bwotCSAqIDxjb2RlPmphdmEubGFuZy5TdHJpbmcuY2xhc3M8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY29udmVydFRvQ2xhc3MoU3RyaW5nIGNsYXNzRmlsZU5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIENsYXNzLmZvck5hbWUoY29udmVydFRvQ2xhc3NOYW1lKGNsYXNzRmlsZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGEgcmVsYXRpdmUgZmlsZSB0byBhIGNsYXNzOwotCSAqIGUuZy4gPGNvZGU+RmlsZShqYXZhL2xhbmcvU3RyaW5nLmNsYXNzKTwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+amF2YS5sYW5nLlN0cmluZy5jbGFzczwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjb252ZXJ0VG9DbGFzcyhGaWxlIGNsYXNzRmlsZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gY29udmVydFRvQ2xhc3MoY2xhc3NGaWxlLmdldFBhdGgoKSk7Ci0JfQotCi0KLQkvLyAqKioqKiBjbGFzcyA9PiBKQVIgZW50cnkgKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyBuYW1lIHRvIGFuIGFyY2hpdmUgZW50cnkgbmFtZSBiYXNlOwotCSAqIGUuZy4gPGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT4iamF2YS9sYW5nL1N0cmluZyI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0FyY2hpdmVFbnRyeU5hbWVCYXNlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZS5yZXBsYWNlKCcuJywgJy8nKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIHRvIGFuIGFyY2hpdmUgZW50cnkgbmFtZSBiYXNlOwotCSAqIGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZy5jbGFzczwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+ImphdmEvbGFuZy9TdHJpbmciPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9BcmNoaXZlRW50cnlOYW1lQmFzZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0FyY2hpdmVFbnRyeU5hbWVCYXNlKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSB0byBhbiBhcmNoaXZlIGNsYXNzIGZpbGUgZW50cnkgbmFtZTsKLQkgKiBlLmcuIDxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nIjwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+ImphdmEvbGFuZy9TdHJpbmcuY2xhc3MiPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9BcmNoaXZlQ2xhc3NGaWxlRW50cnlOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0FyY2hpdmVFbnRyeU5hbWVCYXNlKGNsYXNzTmFtZSkgKyAiLmNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYW4gYXJjaGl2ZSBjbGFzcyBmaWxlIGVudHJ5IG5hbWU7Ci0JICogZS5nLiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nLmNsYXNzPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT4iamF2YS9sYW5nL1N0cmluZy5jbGFzcyI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0FyY2hpdmVDbGFzc0ZpbGVFbnRyeU5hbWUoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9BcmNoaXZlQ2xhc3NGaWxlRW50cnlOYW1lKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQotCS8vICoqKioqIGNsYXNzID0+IGZpbGUgKC5jbGFzcyBvciAuamF2YSkgKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyBuYW1lIHRvIGEgZmlsZSBuYW1lIGJhc2UgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuIDxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nIjwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+ImphdmEvbGFuZy9TdHJpbmciPC9jb2RlPiBvbiBVbml4IGFuZAotCSAqIDxjb2RlPiJqYXZhXFxsYW5nXFxTdHJpbmciPC9jb2RlPiBvbiBXaW5kb3dzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0ZpbGVOYW1lQmFzZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIGZpbGUgbmFtZSBiYXNlIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nLmNsYXNzPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT4iamF2YS9sYW5nL1N0cmluZyI8L2NvZGU+IG9uIFVuaXggYW5kCi0JICogPGNvZGU+ImphdmFcXGxhbmdcXFN0cmluZyI8L2NvZGU+IG9uIFdpbmRvd3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvRmlsZU5hbWVCYXNlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY29udmVydFRvRmlsZU5hbWVCYXNlKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSB0byBhIGNsYXNzIGZpbGUgbmFtZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gPGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT4iamF2YS9sYW5nL1N0cmluZy5jbGFzcyI8L2NvZGU+IG9uIFVuaXggYW5kCi0JICogPGNvZGU+ImphdmFcXGxhbmdcXFN0cmluZy5jbGFzcyI8L2NvZGU+IG9uIFdpbmRvd3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvQ2xhc3NGaWxlTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9GaWxlTmFtZUJhc2UoY2xhc3NOYW1lKSArICIuY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIGNsYXNzIGZpbGUgbmFtZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZy5jbGFzczwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+ImphdmEvbGFuZy9TdHJpbmcuY2xhc3MiPC9jb2RlPiBvbiBVbml4IGFuZAotCSAqIDxjb2RlPiJqYXZhXFxsYW5nXFxTdHJpbmcuY2xhc3MiPC9jb2RlPiBvbiBXaW5kb3dzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSB0byBhIGNsYXNzIGZpbGUgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuIDxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nIjwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+RmlsZShqYXZhL2xhbmcvU3RyaW5nLmNsYXNzKTwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb0NsYXNzRmlsZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBuZXcgRmlsZShjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGNsYXNzTmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYSBjbGFzcyBmaWxlIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nLmNsYXNzPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT5GaWxlKGphdmEvbGFuZy9TdHJpbmcuY2xhc3MpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvQ2xhc3NGaWxlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY29udmVydFRvQ2xhc3NGaWxlKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSB0byBhIGphdmEgZmlsZSBuYW1lIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiA8Y29kZT4iamF2YS5sYW5nLlN0cmluZyI8L2NvZGU+IGlzIGNvbnZlcnRlZCB0bwotCSAqIDxjb2RlPiJqYXZhL2xhbmcvU3RyaW5nLmphdmEiPC9jb2RlPiBvbiBVbml4bCBhbmQKLQkgKiA8Y29kZT4iamF2YVxcbGFuZ1xcU3RyaW5nLmphdmEiPC9jb2RlPiBvbiBXaW5kb3dzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0phdmFGaWxlTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9GaWxlTmFtZUJhc2UoY2xhc3NOYW1lKSArICIuamF2YSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYSBqYXZhIGZpbGUgbmFtZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZy5jbGFzczwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+ImphdmEvbGFuZy9TdHJpbmcuamF2YSI8L2NvZGU+IG9uIFVuaXggYW5kCi0JICogPGNvZGU+ImphdmFcXGxhbmdcXFN0cmluZy5qYXZhIjwvY29kZT4gb24gV2luZG93cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9KYXZhRmlsZU5hbWUoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9KYXZhRmlsZU5hbWUoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIG5hbWUgdG8gYSBqYXZhIGZpbGUgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuIDxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nIjwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+RmlsZShqYXZhL2xhbmcvU3RyaW5nLmphdmEpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvSmF2YUZpbGUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gbmV3IEZpbGUoY29udmVydFRvSmF2YUZpbGVOYW1lKGNsYXNzTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIGphdmEgZmlsZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZy5jbGFzczwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+RmlsZShqYXZhL2xhbmcvU3RyaW5nLmphdmEpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvSmF2YUZpbGUoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9KYXZhRmlsZShqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqIGNsYXNzID0+IHJlc291cmNlICoqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYSByZXNvdXJjZSBuYW1lOwotCSAqIGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZy5jbGFzczwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+Ii9qYXZhL2xhbmcvU3RyaW5nLmNsYXNzIjwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvUmVzb3VyY2VOYW1lKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gJy8nICsgY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShqYXZhQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIHJlc291cmNlOwotCSAqIGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZy5jbGFzczwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+VVJMKGphcjpmaWxlOi9DOi9qZGsvMS40LjJfMDQvanJlL2xpYi9ydC5qYXIhL2phdmEvbGFuZy9TdHJpbmcuY2xhc3MpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBjb252ZXJ0VG9SZXNvdXJjZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGphdmFDbGFzcy5nZXRSZXNvdXJjZShjb252ZXJ0VG9SZXNvdXJjZU5hbWUoamF2YUNsYXNzKSk7Ci0JfQotCi0KLQkvLyAqKioqKiB1dGlsaXRpZXMgKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmlsZSBpcyBhbiBhcmNoaXZlIGZpbGU7Ci0JICogaS5lLiBpdHMgbmFtZSBlbmRzIHdpdGggPGNvZGU+Ii56aXAiPC9jb2RlPiBvciA8Y29kZT4iLmphciI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmaWxlTmFtZUlzQXJjaGl2ZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJU3RyaW5nIGV4dCA9IEZpbGVUb29scy5leHRlbnNpb24oZmlsZU5hbWUpLnRvTG93ZXJDYXNlKCk7Ci0JCXJldHVybiBleHQuZXF1YWxzKCIuamFyIikgfHwgZXh0LmVxdWFscygiLnppcCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIGlzIGFuIGFyY2hpdmUgZmlsZTsKLQkgKiBpLmUuIGl0cyBuYW1lIGVuZHMgd2l0aCA8Y29kZT4iLnppcCI8L2NvZGU+IG9yIDxjb2RlPiIuamFyIjwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZpbGVJc0FyY2hpdmUoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBmaWxlTmFtZUlzQXJjaGl2ZShmaWxlLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGF0IHNob3VsZCBiZSB0aGUgZnVsbHktcXVhbGlmaWVkIGZpbGUgbmFtZQotCSAqIGZvciB0aGUgSlJFIHJ1bnRpbWUgSkFSOwotCSAqIGUuZy4gPGNvZGU+IkM6XGpkazEuNC4yXzA0XGpyZVxsaWJccnQuamFyIjwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnRKYXJOYW1lKCkgewotCQlyZXR1cm4gbG9jYXRpb25Gb3IoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbG9jYXRpb24gZnJvbSB3aGVyZSB0aGUgc3BlY2lmaWVkIGNsYXNzIHdhcyBsb2FkZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYXRpb25Gb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCVVSTCB1cmwgPSBjb252ZXJ0VG9SZXNvdXJjZShqYXZhQ2xhc3MpOwotCQlTdHJpbmcgcGF0aDsKLQkJdHJ5IHsKLQkJCXBhdGggPSBGaWxlVG9vbHMuYnVpbGRGaWxlKHVybCkuZ2V0UGF0aCgpOwotCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCQlTdHJpbmcgcHJvdG9jb2wgPSB1cmwuZ2V0UHJvdG9jb2woKS50b0xvd2VyQ2FzZSgpOwotCQlpZiAocHJvdG9jb2wuZXF1YWxzKCJqYXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBpZiB0aGUgY2xhc3MgaXMgaW4gYSBKQVIsIHRoZSBVUkwgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0JCQkvLyAgICAgamFyOmZpbGU6L0M6L2pkay8xLjQuMl8wNC9qcmUvbGliL3J0LmphciEvamF2YS9sYW5nL1N0cmluZy5jbGFzcwotCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGguaW5kZXhPZignIScpKTsKLQkJfSBlbHNlIGlmIChwcm90b2NvbC5lcXVhbHMoImZpbGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBpZiB0aGUgY2xhc3MgaXMgaW4gYSBkaXJlY3RvcnksIHRoZSBVUkwgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0JCQkvLyAgICAgZmlsZTovQzovZGV2L21haW4vbXdkZXYvY2xhc3Mvb3JnL2VjbGlwc2UvZGFsaS91dGlsaXR5L0NsYXNzcGF0aC5jbGFzcwotCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSBjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGphdmFDbGFzcykubGVuZ3RoKCkgLSAxKTsKLQkJfSBlbHNlIGlmIChwcm90b2NvbC5lcXVhbHMoImJ1bmRsZXJlc291cmNlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gaWYgdGhlIGNsYXNzIGlzIGluIGEgYnVuZGxlIHJlc291cmNlIChFY2xpcHNlPyksIHRoZSBVUkwgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0JCQkvLyAgICAgYnVuZGxlcmVzb3VyY2U6Ly80My9vcmcvZWNsaXBzZS9kYWxpL3V0aWxpdHkvQ2xhc3NwYXRoLmNsYXNzCi0JCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIGNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoamF2YUNsYXNzKS5sZW5ndGgoKSAtIDEpOwotCQl9Ci0KLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbih1cmwudG9TdHJpbmcoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGlyZWN0b3JpZXMgdXNlZCBieSB0aGUgSmF2YSBFeHRlbnNpb24gTWVjaGFuaXNtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZVtdIGphdmFFeHRlbnNpb25EaXJlY3RvcmllcygpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0ZpbGVzKGphdmFFeHRlbnNpb25EaXJlY3RvcnlOYW1lcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRpcmVjdG9yeSBuYW1lcyB1c2VkIGJ5IHRoZSBKYXZhIEV4dGVuc2lvbiBNZWNoYW5pc20uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBqYXZhRXh0ZW5zaW9uRGlyZWN0b3J5TmFtZXMoKSB7Ci0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuZXh0LmRpcnMiKS5zcGxpdChGaWxlLnBhdGhTZXBhcmF0b3IpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvLyAqKioqKiBpbnRlcm5hbCAqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZVtdIGNvbnZlcnRUb0ZpbGVzKFN0cmluZ1tdIGZpbGVOYW1lcykgewotCQlGaWxlW10gZmlsZXMgPSBuZXcgRmlsZVtmaWxlTmFtZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IGZpbGVOYW1lcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJZmlsZXNbaV0gPSBuZXcgRmlsZShmaWxlTmFtZXNbaV0pOwotCQl9Ci0JCXJldHVybiBmaWxlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEphckZpbGVOYW1lc1RvKEZpbGUgZGlyLCBMaXN0PFN0cmluZz4gamFyRmlsZU5hbWVzKSB7Ci0JCUZpbGVbXSBqYXJGaWxlcyA9IGphckZpbGVzSW4oZGlyKTsKLQkJZm9yIChGaWxlIGphckZpbGUgOiBqYXJGaWxlcykgewotCQkJamFyRmlsZU5hbWVzLmFkZChGaWxlVG9vbHMuY2Fub25pY2FsRmlsZShqYXJGaWxlKS5nZXRQYXRoKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZVtdIGphckZpbGVzSW4oRmlsZSBkaXJlY3RvcnkpIHsKLQkJcmV0dXJuIGRpcmVjdG9yeS5saXN0RmlsZXMoamFyRmlsZUZpbHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBGaWxlRmlsdGVyIGphckZpbGVGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRmlsZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKLQkJCQlyZXR1cm4gRmlsZVRvb2xzLmV4dGVuc2lvbihmaWxlLmdldE5hbWUoKSkudG9Mb3dlckNhc2UoKS5lcXVhbHMoIi5qYXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2xhc3NwYXRoIHdpdGggdGhlIHNwZWNpZmllZCBlbnRyaWVzLgotCSAqLwotCXByaXZhdGUgQ2xhc3NwYXRoKEVudHJ5W10gZW50cmllcykgewotCQlzdXBlcigpOwotCQl0aGlzLmVudHJpZXMgPSBlbnRyaWVzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNsYXNzcGF0aCB3aXRoIHRoZSBzcGVjaWZpZWQgZW50cmllcy4KLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoKFN0cmluZy4uLiBmaWxlTmFtZXMpIHsKLQkJdGhpcyhidWlsZEVudHJpZXMoZmlsZU5hbWVzKSk7Ci0JfQotCi0JLyoqCi0JICogU2tpcCBlbXB0eSBmaWxlIG5hbWVzIGJlY2F1c2UgdGhleSB3aWxsIGVuZCB1cCBleHBhbmRpbmcgdG8gdGhlIGN1cnJlbnQKLQkgKiB3b3JraW5nIGRpcmVjdG9yeSwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudC4gRW1wdHkgZmlsZSBuYW1lcyBhY3R1YWxseQotCSAqIG9jY3VyIHdpdGggc29tZSBmcmVxdWVuY3k7IHN1Y2ggYXMgd2hlbiB0aGUgY2xhc3NwYXRoIGhhcyBiZWVuIGJ1aWx0IHVwCi0JICogZHluYW1pY2FsbHkgd2l0aCB0b28gbWFueSBzZXBhcmF0b3JzLiBGb3IgZXhhbXBsZTo8cHJlPgotCSAqICAgICAiQzpcZGV2XGZvby5qYXI7O0M6XGRldlxiYXIuamFyIgotCSAqIDwvcHJlPndpbGwgYmUgcGFyc2VkIGludG8gdGhyZWUgZmlsZSBuYW1lczo8cHJlPgotCSAqICAgICB7ICJDOlxkZXZcZm9vLmphciIsICIiLCAiQzpcZGV2XGJhci5qYXIiIH0KLQkgKiA8L3ByZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBFbnRyeVtdIGJ1aWxkRW50cmllcyhTdHJpbmdbXSBmaWxlTmFtZXMpIHsKLQkJTGlzdDxFbnRyeT4gZW50cmllcyA9IG5ldyBBcnJheUxpc3Q8RW50cnk+KCk7Ci0JCWZvciAoU3RyaW5nIGZpbGVOYW1lIDogZmlsZU5hbWVzKSB7Ci0JCQlpZiAoKGZpbGVOYW1lICE9IG51bGwpICYmIChmaWxlTmFtZS5sZW5ndGgoKSAhPSAwKSkgewotCQkJCWVudHJpZXMuYWRkKG5ldyBFbnRyeShmaWxlTmFtZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbnRyaWVzLnRvQXJyYXkobmV3IEVudHJ5W2VudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2xhc3NwYXRoIHdpdGggdGhlIHNwZWNpZmllZCBwYXRoLgotCSAqLwotCXB1YmxpYyBDbGFzc3BhdGgoU3RyaW5nIHBhdGgpIHsKLQkJdGhpcyhwYXRoLnNwbGl0KEZpbGUucGF0aFNlcGFyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNsYXNzcGF0aCB3aXRoIHRoZSBzcGVjaWZpZWQgZW50cmllcy4KLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoKEl0ZXJhYmxlPFN0cmluZz4gZmlsZU5hbWVzKSB7Ci0JCXRoaXMoQXJyYXlUb29scy5hcnJheShmaWxlTmFtZXMsIFN0cmluZ1Rvb2xzLkVNUFRZX1NUUklOR19BUlJBWSkpOwotCX0KLQotCS8qKgotCSAqIENvbnNvbGlkYXRlIHRoZSBzcGVjaWZpZWQgY2xhc3NwYXRocyBpbnRvIGEgc2luZ2xlIGNsYXNzcGF0aC4KLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoKENsYXNzcGF0aC4uLiBjbGFzc3BhdGhzKSB7Ci0JCXRoaXMoY29uc29saWRhdGVFbnRyaWVzKGNsYXNzcGF0aHMpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBFbnRyeVtdIGNvbnNvbGlkYXRlRW50cmllcyhDbGFzc3BhdGhbXSBjbGFzc3BhdGhzKSB7Ci0JCUxpc3Q8RW50cnk+IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PEVudHJ5PigpOwotCQlmb3IgKENsYXNzcGF0aCBjbGFzc3BhdGggOiBjbGFzc3BhdGhzKSB7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGVudHJpZXMsIGNsYXNzcGF0aC5nZXRFbnRyaWVzKCkpOwotCQl9Ci0JCXJldHVybiBlbnRyaWVzLnRvQXJyYXkobmV3IEVudHJ5W2VudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzc3BhdGgncyBlbnRyaWVzLgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTxFbnRyeT4gZ2V0RW50cmllcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPEVudHJ5Pih0aGlzLmVudHJpZXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3NwYXRoJ3MgcGF0aC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JCWludCBtYXggPSB0aGlzLmVudHJpZXMubGVuZ3RoIC0gMTsKLQkJaWYgKG1heCA9PSAtMSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMDApOwotCQkvLyBzdG9wIG9uZSBzaG9ydCBvZiB0aGUgZW5kIG9mIHRoZSBhcnJheQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5lbnRyaWVzW2ldLmdldEZpbGVOYW1lKCkpOwotCQkJc2IuYXBwZW5kKEZpbGUucGF0aFNlcGFyYXRvckNoYXIpOwotCQl9Ci0JCXNiLmFwcGVuZCh0aGlzLmVudHJpZXNbbWF4XS5nZXRGaWxlTmFtZSgpKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoIHRoZSBjbGFzc3BhdGggZm9yIHRoZSBzcGVjaWZpZWQgKHVucXVhbGlmaWVkKSBmaWxlCi0JICogYW5kIHJldHVybiBpdHMgZW50cnkuIFJldHVybiBudWxsIGlmIGFuIGVudHJ5IGlzIG5vdCBmb3VuZC4KLQkgKiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIHVzZSB0aGlzIG1ldGhvZCB0byBmaW5kIHRoZSBlbnRyeQotCSAqIGZvciA8Y29kZT4icnQuamFyIjwvY29kZT4gb3IgPGNvZGU+InRvcGxpbmsuamFyIjwvY29kZT4uCi0JICovCi0JcHVibGljIEVudHJ5IGdldEVudHJ5Rm9yRmlsZU5hbWVkKFN0cmluZyBzaG9ydEZpbGVOYW1lKSB7Ci0JCWZvciAoRW50cnkgZW50cnkgOiB0aGlzLmVudHJpZXMpIHsKLQkJCWlmIChlbnRyeS5nZXRGaWxlKCkuZ2V0TmFtZSgpLmVxdWFscyhzaG9ydEZpbGVOYW1lKSkgewotCQkJCXJldHVybiBlbnRyeTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGVudHJ5IGZpbGUgaW4gdGhlIGNsYXNzcGF0aAotCSAqIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBSZXR1cm4gbnVsbCBpZiBhbiBlbnRyeSBpcyBub3QgZm91bmQuCi0JICovCi0JcHVibGljIEVudHJ5IGdldEVudHJ5Rm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCVN0cmluZyByZWxhdGl2ZUNsYXNzRmlsZU5hbWUgPSBjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGNsYXNzTmFtZSk7Ci0JCVN0cmluZyBhcmNoaXZlRW50cnlOYW1lID0gY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShjbGFzc05hbWUpOwotCQlmb3IgKEVudHJ5IGVudHJ5IDogdGhpcy5lbnRyaWVzKSB7Ci0JCQlpZiAoZW50cnkuY29udGFpbnMocmVsYXRpdmVDbGFzc0ZpbGVOYW1lLCBhcmNoaXZlRW50cnlOYW1lKSkgewotCQkJCXJldHVybiBlbnRyeTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIG9uIHRoZSBjbGFzc3BhdGgsCi0JICogd2l0aCBkdXBsaWNhdGVzIHJlbW92ZWQuCi0JICogQHNlZSAjY2xhc3NOYW1lcygpCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2xhc3NOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3NOYW1lcyhGaWx0ZXIuVHJhbnNwYXJlbnQuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIG9uIHRoZSBjbGFzc3BhdGgKLQkgKiBhbmQgYWNjZXB0ZWQgYnkgdGhlIHNwZWNpZmllZCBmaWx0ZXIsIHdpdGggZHVwbGljYXRlcyByZW1vdmVkLgotCSAqIEBzZWUgI2NsYXNzTmFtZXMoRmlsdGVyKQotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENsYXNzTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigxMDAwMCk7Ci0JCXRoaXMuYWRkQ2xhc3NOYW1lc1RvKGNsYXNzTmFtZXMsIGZpbHRlcik7Ci0JCXJldHVybiBjbGFzc05hbWVzOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDbGFzc05hbWVzVG8oQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMpIHsKLQkJdGhpcy5hZGRDbGFzc05hbWVzVG8oY2xhc3NOYW1lcywgRmlsdGVyLlRyYW5zcGFyZW50LjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBvbiB0aGUgY2xhc3NwYXRoCi0JICogYW5kIGFjY2VwdGVkIGJ5IHRoZSBzcGVjaWZpZWQgZmlsdGVyIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDbGFzc05hbWVzVG8oQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMsIEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlmb3IgKEVudHJ5IGVudHJ5IDogdGhpcy5lbnRyaWVzKSB7Ci0JCQllbnRyeS5hZGRDbGFzc05hbWVzVG8oY2xhc3NOYW1lcywgZmlsdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aC4KLQkgKiBKdXN0IGEgYml0IG1vcmUgcGVyZm9ybWFudCB0aGFuIHtAbGluayAjZ2V0Q2xhc3NOYW1lcygpfS4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjbGFzc05hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5jbGFzc05hbWVzKEZpbHRlci5UcmFuc3BhcmVudC48U3RyaW5nPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aAotCSAqIHRoYXQgYXJlIGFjY2VwdGVkIGJ5IHRoZSBzcGVjaWZpZWQgZmlsdGVyLgotCSAqIEp1c3QgYSBiaXQgbW9yZSBwZXJmb3JtYW50IHRoYW4ge0BsaW5rICNnZXRDbGFzc05hbWVzKEZpbHRlcil9LgotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNsYXNzTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPih0aGlzLmVudHJ5Q2xhc3NOYW1lc0l0ZXJhdG9ycyhmaWx0ZXIpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPEl0ZXJhdG9yPFN0cmluZz4+IGVudHJ5Q2xhc3NOYW1lc0l0ZXJhdG9ycyhmaW5hbCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEVudHJ5LCBJdGVyYXRvcjxTdHJpbmc+PihuZXcgQXJyYXlJdGVyYXRvcjxFbnRyeT4odGhpcy5lbnRyaWVzKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiB0cmFuc2Zvcm0oRW50cnkgZW50cnkpIHsKLQkJCQlyZXR1cm4gZW50cnkuY2xhc3NOYW1lcyhmaWx0ZXIpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhICJjb21wcmVzc2VkIiB2ZXJzaW9uIG9mIHRoZSBjbGFzc3BhdGggd2l0aCBpdHMKLQkgKiBkdXBsaWNhdGUgZW50cmllcyBlbGltaW5hdGVkLgotCSAqLwotCXB1YmxpYyBDbGFzc3BhdGggY29tcHJlc3NlZCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc3BhdGgoQXJyYXlUb29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyh0aGlzLmVudHJpZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBjbGFzc3BhdGggdG8gYW4gYXJyYXkgb2YgVVJMcwotCSAqICh0aGF0IGNhbiBiZSB1c2VkIHRvIGluc3RhbnRpYXRlIGEge0BsaW5rIGphdmEubmV0LlVSTENsYXNzTG9hZGVyfSkuCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPFVSTD4gZ2V0VVJMcygpIHsKLQkJaW50IGxlbiA9IHRoaXMuZW50cmllcy5sZW5ndGg7Ci0JCVVSTFtdIHVybHMgPSBuZXcgVVJMW2xlbl07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXVybHNbaV0gPSB0aGlzLmVudHJpZXNbaV0uZ2V0VVJMKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPFVSTD4odXJscyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5nZXRQYXRoKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbGFzc3BhdGggZW50cnkgKioqKioqKioqKgotCi0JLyoqCi0JICogPGNvZGU+RW50cnk8L2NvZGU+IG1vZGVscyBhIEphdmEgY2xhc3NwYXRoIGVudHJ5LCB3aGljaCBjYW4gYmUgZWl0aGVyIGEKLQkgKiBkaXJlY3RvcnkgY29udGFpbmluZyA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGVzIG9yIGEgSkFSIGZpbGUgKG9yLAotCSAqIHNpbWlsYXJseSwgYSA8Y29kZT4uemlwPC9jb2RlPiBmaWxlKS4gVGhlIGVudHJ5IGNhbiByZXR1cm4gdGhlIG5hbWVzIG9mCi0JICogY2xhc3NlcyBmb3VuZCBpbiBpdCBldGMuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBFbnRyeQotCQlpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQotCXsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsZU5hbWU7Ci0JCXByaXZhdGUgZmluYWwgRmlsZSBmaWxlOwotCQlwcml2YXRlIGZpbmFsIEZpbGUgY2Fub25pY2FsRmlsZTsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlFbnRyeShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQlpZiAoKGZpbGVOYW1lID09IG51bGwpIHx8IChmaWxlTmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIidmaWxlTmFtZScgbXVzdCBiZSBub24tZW1wdHkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOwotCQkJdGhpcy5maWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQkJdGhpcy5jYW5vbmljYWxGaWxlID0gRmlsZVRvb2xzLmNhbm9uaWNhbEZpbGUodGhpcy5maWxlKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5maWxlTmFtZTsKLQkJfQotCi0JCXB1YmxpYyBGaWxlIGdldEZpbGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5maWxlOwotCQl9Ci0KLQkJcHVibGljIEZpbGUgZ2V0Q2Fub25pY2FsRmlsZSgpIHsKLQkJCXJldHVybiB0aGlzLmNhbm9uaWNhbEZpbGU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENhbm9uaWNhbEZpbGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuY2Fub25pY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmICggISAobyBpbnN0YW5jZW9mIEVudHJ5KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiAoKEVudHJ5KSBvKS5jYW5vbmljYWxGaWxlLmVxdWFscyh0aGlzLmNhbm9uaWNhbEZpbGUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jYW5vbmljYWxGaWxlLmhhc2hDb2RlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBlbnRyeSdzICJjYW5vbmljYWwiIFVSTC4KLQkJICovCi0JCXB1YmxpYyBVUkwgZ2V0VVJMKCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gdGhpcy5jYW5vbmljYWxGaWxlLnRvVVJJKCkudG9VUkwoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRyeSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb250YWlucyhqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50cnkgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCXJldHVybiB0aGlzLmNvbnRhaW5zKGNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoY2xhc3NOYW1lKSwgY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShjbGFzc05hbWUpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50cnkgY29udGFpbnMgZWl0aGVyIHRoZSBzcGVjaWZpZWQgcmVsYXRpdmUKLQkJICogY2xhc3MgZmlsZSBvciB0aGUgc3BlY2lmaWVkIGFyY2hpdmUgZW50cnkuCi0JCSAqIE5vdCB0aGUgcHJldHRpZXN0IHNpZ25hdHVyZSwgYnV0IGl0J3MgaW50ZXJuYWwuLi4uCi0JCSAqLwotCQlib29sZWFuIGNvbnRhaW5zKFN0cmluZyByZWxhdGl2ZUNsYXNzRmlsZU5hbWUsIFN0cmluZyBhcmNoaXZlRW50cnlOYW1lKSB7Ci0JCQlpZiAoICEgdGhpcy5jYW5vbmljYWxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKHRoaXMuY2Fub25pY2FsRmlsZS5pc0RpcmVjdG9yeSgpICYmIChuZXcgRmlsZSh0aGlzLmNhbm9uaWNhbEZpbGUsIHJlbGF0aXZlQ2xhc3NGaWxlTmFtZSkpLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gKGZpbGVJc0FyY2hpdmUodGhpcy5jYW5vbmljYWxGaWxlKSAmJiB0aGlzLmFyY2hpdmVDb250YWluc0VudHJ5KGFyY2hpdmVFbnRyeU5hbWUpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50cnkncyBhcmNoaXZlIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZW50cnkuCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gYXJjaGl2ZUNvbnRhaW5zRW50cnkoU3RyaW5nIHppcEVudHJ5TmFtZSkgewotCQkJWmlwRmlsZSB6aXBGaWxlID0gbnVsbDsKLQkJCVppcEVudHJ5IHppcEVudHJ5ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJemlwRmlsZSA9IG5ldyBaaXBGaWxlKHRoaXMuY2Fub25pY2FsRmlsZSk7Ci0JCQkJemlwRW50cnkgPSB6aXBGaWxlLmdldEVudHJ5KHppcEVudHJ5TmFtZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCS8vIHNvbWV0aGluZyBpcyB3cm9uZywgbGVhdmUgdGhlIGVudHJ5IG51bGwKLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKHppcEZpbGUgIT0gbnVsbCkgewotCQkJCQkJemlwRmlsZS5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJemlwRW50cnkgPSBudWxsOwkvLyBzb21ldGhpbmcgaXMgd3JvbmcsIGNsZWFyIG91dCB0aGUgZW50cnkKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gemlwRW50cnkgIT0gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIGluIHRoZSBlbnRyeS4KLQkJICogQHNlZSAjY2xhc3NOYW1lcygpCi0JCSAqLwotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDbGFzc05hbWVzKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3NOYW1lcyhGaWx0ZXIuVHJhbnNwYXJlbnQuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIGluIHRoZSBlbnRyeQotCQkgKiBhbmQgYWNjZXB0ZWQgYnkgdGhlIHNwZWNpZmllZCBmaWx0ZXIuCi0JCSAqIEBzZWUgI2NsYXNzTmFtZXMoRmlsdGVyKQotCQkgKi8KLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2xhc3NOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCUNvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDIwMDApOwotCQkJdGhpcy5hZGRDbGFzc05hbWVzVG8oY2xhc3NOYW1lcywgZmlsdGVyKTsKLQkJCXJldHVybiBjbGFzc05hbWVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgaW4gdGhlIGVudHJ5Ci0JCSAqIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkJICovCi0JCXB1YmxpYyB2b2lkIGFkZENsYXNzTmFtZXNUbyhDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcykgewotCQkJdGhpcy5hZGRDbGFzc05hbWVzVG8oY2xhc3NOYW1lcywgRmlsdGVyLlRyYW5zcGFyZW50LjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBpbiB0aGUgZW50cnkKLQkJICogYW5kIGFjY2VwdGVkIGJ5IHRoZSBzcGVjaWZpZWQgZmlsdGVyIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkJICovCi0JCXB1YmxpYyB2b2lkIGFkZENsYXNzTmFtZXNUbyhDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQlpZiAodGhpcy5jYW5vbmljYWxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJaWYgKHRoaXMuY2Fub25pY2FsRmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCXRoaXMuYWRkQ2xhc3NOYW1lc0ZvckRpcmVjdG9yeVRvKGNsYXNzTmFtZXMsIGZpbHRlcik7Ci0JCQkJfSBlbHNlIGlmIChmaWxlSXNBcmNoaXZlKHRoaXMuY2Fub25pY2FsRmlsZSkpIHsKLQkJCQkJdGhpcy5hZGRDbGFzc05hbWVzRm9yQXJjaGl2ZVRvKGNsYXNzTmFtZXMsIGZpbHRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQKLQkJICogdW5kZXIgdGhlIGVudHJ5J3MgZGlyZWN0b3J5IGFuZCBhY2NlcHRlZCBieQotCQkgKiB0aGUgc3BlY2lmaWVkIGZpbHRlciB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgYWRkQ2xhc3NOYW1lc0ZvckRpcmVjdG9yeVRvKENvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCWludCBzdGFydCA9IHRoaXMuY2Fub25pY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5sZW5ndGgoKSArIDE7Ci0JCQlmb3IgKEl0ZXJhdG9yPEZpbGU+IHN0cmVhbSA9IHRoaXMuY2xhc3NGaWxlc0ZvckRpcmVjdG9yeSgpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29udmVydFRvQ2xhc3NOYW1lKHN0cmVhbS5uZXh0KCkuZ2V0QWJzb2x1dGVQYXRoKCkuc3Vic3RyaW5nKHN0YXJ0KSk7Ci0JCQkJaWYgKGZpbHRlci5hY2NlcHQoY2xhc3NOYW1lKSkgewotCQkJCQljbGFzc05hbWVzLmFkZChjbGFzc05hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIHRoZSBjbGFzcyBmaWxlcyBkaXNjb3ZlcmVkCi0JCSAqIHVuZGVyIHRoZSBlbnRyeSdzIGRpcmVjdG9yeS4KLQkJICovCi0JCXByaXZhdGUgSXRlcmF0b3I8RmlsZT4gY2xhc3NGaWxlc0ZvckRpcmVjdG9yeSgpIHsKLQkJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8RmlsZT4oRmlsZVRvb2xzLmZpbGVzSW5UcmVlKHRoaXMuY2Fub25pY2FsRmlsZSkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoRmlsZSBuZXh0KSB7Ci0JCQkJCXJldHVybiBFbnRyeS50aGlzLmZpbGVOYW1lTWlnaHRCZUZvckNsYXNzRmlsZShuZXh0LmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkCi0JCSAqIGluIHRoZSBlbnRyeSdzIGFyY2hpdmUgZmlsZSBhbmQgYWNjZXB0ZWQgYnkgdGhlCi0JCSAqIHNwZWNpZmllZCBmaWx0ZXIgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGFkZENsYXNzTmFtZXNGb3JBcmNoaXZlVG8oQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMsIEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJWmlwRmlsZSB6aXBGaWxlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJemlwRmlsZSA9IG5ldyBaaXBGaWxlKHRoaXMuY2Fub25pY2FsRmlsZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJCWZvciAoRW51bWVyYXRpb248PyBleHRlbmRzIFppcEVudHJ5PiBzdHJlYW0gPSB6aXBGaWxlLmVudHJpZXMoKTsgc3RyZWFtLmhhc01vcmVFbGVtZW50cygpOyApIHsKLQkJCQlaaXBFbnRyeSB6aXBFbnRyeSA9IHN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQkJCVN0cmluZyB6aXBFbnRyeU5hbWUgPSB6aXBFbnRyeS5nZXROYW1lKCk7Ci0JCQkJaWYgKHRoaXMuZmlsZU5hbWVNaWdodEJlRm9yQ2xhc3NGaWxlKHppcEVudHJ5TmFtZSkpIHsKLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbnZlcnRUb0NsYXNzTmFtZSh6aXBFbnRyeU5hbWUpOwotCQkJCQlpZiAoZmlsdGVyLmFjY2VwdChjbGFzc05hbWUpKSB7Ci0JCQkJCQljbGFzc05hbWVzLmFkZChjbGFzc05hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdHJ5IHsKLQkJCQl6aXBGaWxlLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpbGUgbWlnaHQgYmUgYSBKYXZhIGNsYXNzIGZpbGUuCi0JCSAqIFRoZSBmaWxlIG5hbWUgbXVzdCBhdCBsZWFzdCBlbmQgd2l0aCA8Y29kZT4iLmNsYXNzIjwvY29kZT4gYW5kIGNvbnRhaW4gbm8gc3BhY2VzLgotCQkgKiAoTmVpdGhlciBjbGFzcyBuYW1lcyBub3IgcGFja2FnZSBuYW1lcyBtYXkgY29udGFpbiBzcGFjZXMuKQotCQkgKiBXaGV0aGVyIGl0IGFjdHVhbGx5IGlzIGEgY2xhc3MgZmlsZSB3aWxsIG5lZWQgdG8gYmUgZGV0ZXJtaW5lZCBieQotCQkgKiBhIGNsYXNzIGxvYWRlci4KLQkJICovCi0JCWJvb2xlYW4gZmlsZU5hbWVNaWdodEJlRm9yQ2xhc3NGaWxlKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gRmlsZVRvb2xzLmV4dGVuc2lvbihuYW1lKS50b0xvd2VyQ2FzZSgpLmVxdWFscygiLmNsYXNzIikgLy8kTk9OLU5MUy0xJAotCQkJCQkmJiAobmFtZS5pbmRleE9mKCcgJykgPT0gLTEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aC4KLQkJICogSnVzdCBhIGJpdCBtb3JlIHBlcmZvcm1hbnQgdGhhbiB7QGxpbmsgI2dldENsYXNzTmFtZXMoKX0uCi0JCSAqLwotCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjbGFzc05hbWVzKCkgewotCQkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lcyhGaWx0ZXIuVHJhbnNwYXJlbnQuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIG9uIHRoZSBjbGFzc3BhdGgKLQkJICogdGhhdCBhcmUgYWNjZXB0ZWQgYnkgdGhlIHNwZWNpZmllZCBmaWx0ZXIuCi0JCSAqIEp1c3QgYSBiaXQgbW9yZSBwZXJmb3JtYW50IHRoYW4ge0BsaW5rICNnZXRDbGFzc05hbWVzKEZpbHRlcil9LgotCQkgKi8KLQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCWlmICh0aGlzLmNhbm9uaWNhbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlpZiAodGhpcy5jYW5vbmljYWxGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lc0ZvckRpcmVjdG9yeShmaWx0ZXIpOwotCQkJCX0KLQkJCQlpZiAoZmlsZUlzQXJjaGl2ZSh0aGlzLmNhbm9uaWNhbEZpbGUpKSB7Ci0JCQkJCXJldHVybiB0aGlzLmNsYXNzTmFtZXNGb3JBcmNoaXZlKGZpbHRlcik7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkCi0JCSAqIHVuZGVyIHRoZSBlbnRyeSdzIGRpcmVjdG9yeSBhbmQgYWNjZXB0ZWQgYnkKLQkJICogdGhlIHNwZWNpZmllZCBmaWx0ZXIuCi0JCSAqLwotCQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NOYW1lc0ZvckRpcmVjdG9yeShGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nPih0aGlzLmNsYXNzTmFtZXNGb3JEaXJlY3RvcnkoKSwgZmlsdGVyKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUcmFuc2Zvcm0gdGhlIGNsYXNzIGZpbGVzIHRvIGNsYXNzIG5hbWVzLgotCQkgKi8KLQkJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGNsYXNzTmFtZXNGb3JEaXJlY3RvcnkoKSB7Ci0JCQlmaW5hbCBpbnQgc3RhcnQgPSB0aGlzLmNhbm9uaWNhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkubGVuZ3RoKCkgKyAxOwotCQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEZpbGUsIFN0cmluZz4odGhpcy5jbGFzc0ZpbGVzRm9yRGlyZWN0b3J5KCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShGaWxlIGYpIHsKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb0NsYXNzTmFtZShmLmdldEFic29sdXRlUGF0aCgpLnN1YnN0cmluZyhzdGFydCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZAotCQkgKiBpbiB0aGUgZW50cnkncyBhcmNoaXZlIGZpbGUgYW5kIGFjY2VwdGVkIGJ5IHRoZQotCQkgKiBzcGVjaWZpZWQgZmlsdGVyLgotCQkgKi8KLQkJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGNsYXNzTmFtZXNGb3JBcmNoaXZlKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJLy8gd2UgY2FuJ3Qgc2ltcGx5IHdyYXAgaXRlcmF0b3JzIGhlcmUgYmVjYXVzZSB3ZSBuZWVkIHRvIGNsb3NlIHRoZSBhcmNoaXZlIGZpbGUuLi4KLQkJCVppcEZpbGUgemlwRmlsZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXppcEZpbGUgPSBuZXcgWmlwRmlsZSh0aGlzLmNhbm9uaWNhbEZpbGUpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQkJfQotCQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KHppcEZpbGUuc2l6ZSgpKTsKLQkJCWZvciAoRW51bWVyYXRpb248PyBleHRlbmRzIFppcEVudHJ5PiBzdHJlYW0gPSB6aXBGaWxlLmVudHJpZXMoKTsgc3RyZWFtLmhhc01vcmVFbGVtZW50cygpOyApIHsKLQkJCQlaaXBFbnRyeSB6aXBFbnRyeSA9IHN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQkJCVN0cmluZyB6aXBFbnRyeU5hbWUgPSB6aXBFbnRyeS5nZXROYW1lKCk7Ci0JCQkJaWYgKHRoaXMuZmlsZU5hbWVNaWdodEJlRm9yQ2xhc3NGaWxlKHppcEVudHJ5TmFtZSkpIHsKLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbnZlcnRUb0NsYXNzTmFtZSh6aXBFbnRyeU5hbWUpOwotCQkJCQlpZiAoZmlsdGVyLmFjY2VwdChjbGFzc05hbWUpKSB7Ci0JCQkJCQljbGFzc05hbWVzLmFkZChjbGFzc05hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdHJ5IHsKLQkJCQl6aXBGaWxlLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2xhc3NOYW1lcy5pdGVyYXRvcigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29sbGVjdGluZ0V4Y2VwdGlvbkhhbmRsZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0NvbGxlY3RpbmdFeGNlcHRpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZjkwZWIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29sbGVjdGluZ0V4Y2VwdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRXhjZXB0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNuYXBzaG90Q2xvbmVJdGVyYWJsZTsKLQotLyoqCi0gKiBBbiBleGNlcHRpb24gaGFuZGxlciB0aGF0IGNvbGxlY3RzIGFuZCBob2xkIHRoZSBleGNlcHRpb25zIGhhbmRlZCB0byBpdC4KLSAqIFRoZXkgY2FuIGJlIHJldHJpZXZlZCBhdCBhIGxhdGVyIHRpbWUgdmlhIGNhbGxzIHRvIHtAbGluayAjZ2V0RXhjZXB0aW9ucygpfQotICogYW5kIHt7QGxpbmsgI2NsZWFyRXhjZXB0aW9ucygpfS4KLSAqLwotcHVibGljIGNsYXNzIENvbGxlY3RpbmdFeGNlcHRpb25IYW5kbGVyCi0JaW1wbGVtZW50cyBFeGNlcHRpb25IYW5kbGVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8VGhyb3dhYmxlPiBleGNlcHRpb25zID0gbmV3IFZlY3RvcjxUaHJvd2FibGU+KCk7Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIHQpIHsKLQkJdGhpcy5leGNlcHRpb25zLmFkZCh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgbGlzdCBvZiBleGNlcHRpb25zIGhhbmRsZWQgYnkgdGhlIGhhbmRsZXIgc28gZmFyLgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTxUaHJvd2FibGU+IGdldEV4Y2VwdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgU25hcHNob3RDbG9uZUl0ZXJhYmxlPFRocm93YWJsZT4odGhpcy5leGNlcHRpb25zKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IGxpc3Qgb2YgZXhjZXB0aW9ucyBoYW5kbGVkIGJ5IHRoZSBoYW5kbGVyCi0JICogc28gZmFyLgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTxUaHJvd2FibGU+IGNsZWFyRXhjZXB0aW9ucygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmV4Y2VwdGlvbnMpIHsKLQkJCUl0ZXJhYmxlPFRocm93YWJsZT4gcmVzdWx0ID0gbmV3IFNuYXBzaG90Q2xvbmVJdGVyYWJsZTxUaHJvd2FibGU+KHRoaXMuZXhjZXB0aW9ucyk7Ci0JCQl0aGlzLmV4Y2VwdGlvbnMuY2xlYXIoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmV4Y2VwdGlvbnMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0NvbGxlY3Rpb25Ub29scy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMGMxZDEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tQWNjZXNzOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU3VwZXJJdGVyYXRvcldyYXBwZXI7Ci0KLS8qKgotICoge0BsaW5rIENvbGxlY3Rpb259LXJlbGF0ZWQgdXRpbGl0eSBtZXRob2RzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29sbGVjdGlvblRvb2xzIHsKLQotCS8vICoqKioqKioqKiogYWRkIGFsbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5hZGRBbGwoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGFkZEFsbChjb2xsZWN0aW9uLCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5hZGRBbGwoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBzaXplKSB7Ci0JCXJldHVybiBhZGRBbGwoY29sbGVjdGlvbiwgaXRlcmFibGUuaXRlcmF0b3IoKSwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24uYWRkQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gc3VwZXIgRT4gY29sbGVjdGlvbiwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBhZGRBbGxfKGNvbGxlY3Rpb24sIGl0ZXJhdG9yKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0aGUgaXRlcmF0b3IgaXMgbm90IGVtcHR5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsXyhDb2xsZWN0aW9uPD8gc3VwZXIgRT4gY29sbGVjdGlvbiwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbW9kaWZpZWQgfD0gY29sbGVjdGlvbi5hZGQoaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24uYWRkQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gc3VwZXIgRT4gY29sbGVjdGlvbiwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gY29sbGVjdGlvbi5hZGRBbGwobGlzdChpdGVyYXRvciwgc2l6ZSkpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24uYWRkQWxsKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gc3VwZXIgRT4gY29sbGVjdGlvbiwgRS4uLiBhcnJheSkgewotCQlyZXR1cm4gKGFycmF5Lmxlbmd0aCA9PSAwKSA/IGZhbHNlIDogYWRkQWxsXyhjb2xsZWN0aW9uLCBhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBhcnJheSBpcyBub3QgZW1wdHkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGxfKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBFLi4uIGFycmF5KSB7Ci0JCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJZm9yIChFIGVsZW1lbnQgOiBhcnJheSkgewotCQkJbW9kaWZpZWQgfD0gY29sbGVjdGlvbi5hZGQoZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkxpc3QuYWRkQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChMaXN0PD8gc3VwZXIgRT4gbGlzdCwgaW50IGluZGV4LCBJdGVyYWJsZTxFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gYWRkQWxsKGxpc3QsIGluZGV4LCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5MaXN0LmFkZEFsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGwoTGlzdDw/IHN1cGVyIEU+IGxpc3QsIGludCBpbmRleCwgSXRlcmFibGU8RT4gaXRlcmFibGUsIGludCBzaXplKSB7Ci0JCXJldHVybiBhZGRBbGwobGlzdCwgaW5kZXgsIGl0ZXJhYmxlLml0ZXJhdG9yKCksIHNpemUpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkxpc3QuYWRkQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChMaXN0PD8gc3VwZXIgRT4gbGlzdCwgaW50IGluZGV4LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IGxpc3QuYWRkQWxsKGluZGV4LCBsaXN0KGl0ZXJhdG9yKSkgOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5MaXN0LmFkZEFsbChJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGwoTGlzdDw/IHN1cGVyIEU+IGxpc3QsIGludCBpbmRleCwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gbGlzdC5hZGRBbGwoaW5kZXgsIGxpc3QoaXRlcmF0b3IsIHNpemUpKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkxpc3QuYWRkQWxsKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChMaXN0PD8gc3VwZXIgRT4gbGlzdCwgaW50IGluZGV4LCBFLi4uIGFycmF5KSB7Ci0JCXJldHVybiAoYXJyYXkubGVuZ3RoID09IDApID8gZmFsc2UgOiBsaXN0LmFkZEFsbChpbmRleCwgQXJyYXlzLmFzTGlzdChhcnJheSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiYWcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBlbnVtZXJhdGlvbi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5IYXNoQmFnKEVudW1lcmF0aW9uIGVudW1lcmF0aW9uKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGJhZyhFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb24pIHsKLQkJcmV0dXJuIGJhZyhlbnVtZXJhdGlvbiwgbmV3IEhhc2hCYWc8RT4oKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBlbnVtZXJhdGlvbi4KLQkgKiBUaGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hCYWcoRW51bWVyYXRpb24gZW51bWVyYXRpb24pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gYmFnKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBFPiBlbnVtZXJhdGlvbiwgaW50IGVudW1lcmF0aW9uU2l6ZSkgewotCQlyZXR1cm4gYmFnKGVudW1lcmF0aW9uLCBuZXcgSGFzaEJhZzxFPihlbnVtZXJhdGlvblNpemUpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBiYWcoRW51bWVyYXRpb248PyBleHRlbmRzIEU+IGVudW1lcmF0aW9uLCBIYXNoQmFnPEU+IGJhZykgewotCQl3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCWJhZy5hZGQoZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKSk7Ci0JCX0KLQkJcmV0dXJuIGJhZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBiYWcgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hCYWcoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gYmFnKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gYmFnKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGJhZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5IYXNoQmFnKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGJhZyhJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIGJhZyhpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGJhZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+SGFzaEJhZyhJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBiYWcoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBiYWcoaXRlcmF0b3IsIG5ldyBIYXNoQmFnPEU+KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGJhZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5IYXNoQmFnKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGJhZyhJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJcmV0dXJuIGJhZyhpdGVyYXRvciwgbmV3IEhhc2hCYWc8RT4oaXRlcmF0b3JTaXplKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gYmFnKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgSGFzaEJhZzxFPiBiYWcpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJYmFnLmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JCXJldHVybiBiYWc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5IYXNoQmFnKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGJhZyhFLi4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCUhhc2hCYWc8RT4gYmFnID0gbmV3IEhhc2hCYWc8RT4obGVuKTsKLQkJZm9yIChFIGl0ZW0gOiBhcnJheSkgewotCQkJYmFnLmFkZChpdGVtKTsKLQkJfQotCQlyZXR1cm4gYmFnOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gY29sbGVjdGlvbihFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb24pIHsKLQkJcmV0dXJuIGJhZyhlbnVtZXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgZW51bWVyYXRpb24uCi0JICogVGhlIHNwZWNpZmllZCBlbnVtZXJhdGlvbiBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGNvbGxlY3Rpb24oRW51bWVyYXRpb248PyBleHRlbmRzIEU+IGVudW1lcmF0aW9uLCBpbnQgZW51bWVyYXRpb25TaXplKSB7Ci0JCXJldHVybiBiYWcoZW51bWVyYXRpb24sIGVudW1lcmF0aW9uU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBjb2xsZWN0aW9uKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gY29sbGVjdGlvbihpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gY29sbGVjdGlvbihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIGNvbGxlY3Rpb24oaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGNvbGxlY3Rpb24oSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBiYWcoaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBjb2xsZWN0aW9uKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlyZXR1cm4gYmFnKGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gY29sbGVjdGlvbihFLi4uIGFycmF5KSB7Ci0JCXJldHVybiBiYWcoYXJyYXkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250YWlucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uIGNvbnRhaW5zIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkVudW1lcmF0aW9uLmNvbnRhaW5zKE9iamVjdCBvKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoRW51bWVyYXRpb248Pz4gZW51bWVyYXRpb24sIE9iamVjdCB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJaWYgKGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlpZiAodmFsdWUuZXF1YWxzKGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBjb250YWlucyB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5jb250YWlucyhPYmplY3Qgbyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zKGl0ZXJhYmxlLml0ZXJhdG9yKCksIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGNvbnRhaW5zIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmNvbnRhaW5zKE9iamVjdCBvKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCWlmIChpdGVyYXRvci5uZXh0KCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKHZhbHVlLmVxdWFscyhpdGVyYXRvci5uZXh0KCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnRhaW5zIGFsbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5jb250YWluc0FsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGNvbGxlY3Rpb24sIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLmNvbnRhaW5zQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoICEgY29sbGVjdGlvbi5jb250YWlucyhpdGVyYXRvci5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLmNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBPYmplY3QuLi4gYXJyYXkpIHsKLQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgY29sbGVjdGlvbi5jb250YWlucyhhcnJheVtpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmNvbnRhaW5zQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGl0ZXJhYmxlLml0ZXJhdG9yKCksIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmNvbnRhaW5zQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZSAxIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIDIuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuY29udGFpbnNBbGwoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUxLml0ZXJhdG9yKCksIGl0ZXJhYmxlMi5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIDEgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgMi4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIDEgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuY29udGFpbnNBbGwoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIGludCBpdGVyYWJsZTFTaXplLCBJdGVyYWJsZTw/PiBpdGVyYWJsZTIpIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGl0ZXJhYmxlMS5pdGVyYXRvcigpLCBpdGVyYWJsZTFTaXplLCBpdGVyYWJsZTIuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5jb250YWluc0FsbChJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5jb250YWluc0FsbChJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplLCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplLCBpdGVyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5jb250YWluc0FsbChPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBPYmplY3QuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGl0ZXJhYmxlLml0ZXJhdG9yKCksIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYWJsZTw/PiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSwgT2JqZWN0Li4uIGFycmF5KSB7Ci0JCXJldHVybiBjb250YWluc0FsbChpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUsIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IuY29udGFpbnNBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gc2V0KGl0ZXJhdG9yKS5jb250YWluc0FsbChjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5jb250YWluc0FsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBzZXQoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSkuY29udGFpbnNBbGwoY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5jb250YWluc0FsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoc2V0KGl0ZXJhdG9yKSwgaXRlcmFibGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5jb250YWluc0FsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplLCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoc2V0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpLCBpdGVyYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciAxIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIDIuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IuY29udGFpbnNBbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvcjEsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoc2V0KGl0ZXJhdG9yMSksIGl0ZXJhdG9yMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciAxIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIDIuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciAxIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmNvbnRhaW5zQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IxLCBpbnQgaXRlcmF0b3IxU2l6ZSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IyKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChzZXQoaXRlcmF0b3IxLCBpdGVyYXRvcjFTaXplKSwgaXRlcmF0b3IyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIE9iamVjdC4uLiBhcnJheSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoc2V0KGl0ZXJhdG9yKSwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5jb250YWluc0FsbChPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplLCBPYmplY3QuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKHNldChpdGVyYXRvciwgaXRlcmF0b3JTaXplKSwgYXJyYXkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaWZmICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBsaXN0cyB0aGF0IGFyZSBkaWZmZXJlbnQsIGJlZ2lubmluZyBhdCB0aGUgZW5kLgotCSAqIElmIHRoZSBsaXN0cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gLTEuCi0JICogSWYgdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQgc2l6ZXMsIHJldHVybiB0aGUgaW5kZXggb2YgdGhlCi0JICogbGFzdCBlbGVtZW50IGluIHRoZSBsb25nZXIgbGlzdC4KLQkgKiBVc2UgdGhlIGVsZW1lbnRzJyB7QGxpbmsgT2JqZWN0I2VxdWFscyhPYmplY3QpfSBtZXRob2QgdG8gY29tcGFyZSB0aGUKLQkgKiBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9ucy5kaWZmRW5kKExpc3QgbGlzdDEsIExpc3QgbGlzdDIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRpZmZFbmQoTGlzdDw/PiBsaXN0MSwgTGlzdDw/PiBsaXN0MikgewotCQlyZXR1cm4gQXJyYXlUb29scy5kaWZmRW5kKGxpc3QxLnRvQXJyYXkoKSwgbGlzdDIudG9BcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJhbmdlIG9mIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBhcnJheXMgdGhhdCBhcmUgZGlmZmVyZW50LgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGlkZW50aWNhbCwgcmV0dXJuIFtzaXplLCAtMV0uCi0JICogVXNlIHRoZSBlbGVtZW50cycge0BsaW5rIE9iamVjdCNlcXVhbHMoT2JqZWN0KX0gbWV0aG9kIHRvIGNvbXBhcmUgdGhlCi0JICogZWxlbWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbnMuZGlmZlJhbmdlKExpc3QgbGlzdDEsIExpc3QgbGlzdDIpPC9jb2RlPgotCSAqIEBzZWUgI2RpZmZTdGFydChMaXN0LCBMaXN0KQotCSAqIEBzZWUgI2RpZmZFbmQoTGlzdCwgTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJhbmdlIGRpZmZSYW5nZShMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmRpZmZSYW5nZShsaXN0MS50b0FycmF5KCksIGxpc3QyLnRvQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGxpc3RzIHRoYXQgYXJlIGRpZmZlcmVudC4gSWYgdGhlIGxpc3RzIGFyZSBpZGVudGljYWwsIHJldHVybgotCSAqIHRoZSBzaXplIG9mIHRoZSB0d28gbGlzdHMgKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXgpLgotCSAqIElmIHRoZSBsaXN0cyBhcmUgZGlmZmVyZW50IHNpemVzIGFuZCBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNob3J0ZXIgbGlzdCBtYXRjaCB0aGVpciBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluCi0JICogdGhlIGxvbmdlciBsaXN0LCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIHNob3J0ZXIgbGlzdAotCSAqIChpLmUuIG9uZSBwYXN0IHRoZSBsYXN0IGluZGV4IG9mIHRoZSBzaG9ydGVyIGxpc3QpLgotCSAqIFVzZSB0aGUgZWxlbWVudHMnIHtAbGluayBPYmplY3QjZXF1YWxzKE9iamVjdCl9IG1ldGhvZCB0byBjb21wYXJlIHRoZQotCSAqIGVsZW1lbnRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb25zLmRpZmZTdGFydChMaXN0IGxpc3QxLCBMaXN0IGxpc3QyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBkaWZmU3RhcnQoTGlzdDw/PiBsaXN0MSwgTGlzdDw/PiBsaXN0MikgewotCQlyZXR1cm4gQXJyYXlUb29scy5kaWZmU3RhcnQobGlzdDEudG9BcnJheSgpLCBsaXN0Mi50b0FycmF5KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpZGVudGl0eSBkaWZmICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBsaXN0cyB0aGF0IGFyZSBkaWZmZXJlbnQsIGJlZ2lubmluZyBhdCB0aGUgZW5kLgotCSAqIElmIHRoZSBsaXN0cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gLTEuCi0JICogSWYgdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQgc2l6ZXMsIHJldHVybiB0aGUgaW5kZXggb2YgdGhlCi0JICogbGFzdCBlbGVtZW50IGluIHRoZSBsb25nZXIgbGlzdC4KLQkgKiBVc2Ugb2JqZWN0IGlkZW50aXR5IHRvIGNvbXBhcmUgdGhlIGVsZW1lbnRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb25zLmlkZW50aXR5RGlmZkVuZChMaXN0IGxpc3QxLCBMaXN0IGxpc3QyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpZGVudGl0eURpZmZFbmQoTGlzdDw/PiBsaXN0MSwgTGlzdDw/PiBsaXN0MikgewotCQlyZXR1cm4gQXJyYXlUb29scy5pZGVudGl0eURpZmZFbmQobGlzdDEudG9BcnJheSgpLCBsaXN0Mi50b0FycmF5KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmFuZ2Ugb2YgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gW3NpemUsIC0xXS4KLQkgKiBVc2Ugb2JqZWN0IGlkZW50aXR5IHRvIGNvbXBhcmUgdGhlIGVsZW1lbnRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb25zLmlkZW50aXR5RGlmZlN0YXJ0KExpc3QgbGlzdDEsIExpc3QgbGlzdDIpPC9jb2RlPgotCSAqIEBzZWUgI2lkZW50aXR5RGlmZlN0YXJ0KExpc3QsIExpc3QpCi0JICogQHNlZSAjaWRlbnRpdHlEaWZmRW5kKExpc3QsIExpc3QpCi0JICovCi0JcHVibGljIHN0YXRpYyBSYW5nZSBpZGVudGl0eURpZmZSYW5nZShMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGxpc3QxLnRvQXJyYXkoKSwgbGlzdDIudG9BcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogbGlzdHMgdGhhdCBhcmUgZGlmZmVyZW50LiBJZiB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCwgcmV0dXJuCi0JICogdGhlIHNpemUgb2YgdGhlIHR3byBsaXN0cyAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCkuCi0JICogSWYgdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQgc2l6ZXMgYW5kIGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2hvcnRlciBsaXN0IG1hdGNoIHRoZWlyIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4KLQkgKiB0aGUgbG9uZ2VyIGxpc3QsIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc2hvcnRlciBsaXN0Ci0JICogKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNob3J0ZXIgbGlzdCkuCi0JICogVXNlIG9iamVjdCBpZGVudGl0eSB0byBjb21wYXJlIHRoZSBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9ucy5pZGVudGl0eURpZmZTdGFydChMaXN0IGxpc3QxLCBMaXN0IGxpc3QyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpZGVudGl0eURpZmZTdGFydChMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGxpc3QxLnRvQXJyYXkoKSwgbGlzdDIudG9BcnJheSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZWxlbWVudHMgYXJlIGVxdWFsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGVzIGRvIG5vdCByZXR1cm4gdGhlIHNhbWUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc2FtZSBvcmRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWxlbWVudHNBcmVEaWZmZXJlbnQoSXRlcmFibGU8Pz4gaXRlcmFibGUxLCBJdGVyYWJsZTw/PiBpdGVyYWJsZTIpIHsKLQkJcmV0dXJuIGVsZW1lbnRzQXJlRGlmZmVyZW50KGl0ZXJhYmxlMS5pdGVyYXRvcigpLCBpdGVyYWJsZTIuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvcnMgZG8gbm90IHJldHVybiB0aGUgc2FtZSBlbGVtZW50cwotCSAqIGluIHRoZSBzYW1lIG9yZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbGVtZW50c0FyZURpZmZlcmVudChJdGVyYXRvcjw/PiBpdGVyYXRvcjEsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMikgewotCQlyZXR1cm4gISBlbGVtZW50c0FyZUVxdWFsKGl0ZXJhdG9yMSwgaXRlcmF0b3IyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlcyByZXR1cm4gZXF1YWwgZWxlbWVudHMKLQkgKiBpbiB0aGUgc2FtZSBvcmRlci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5lbGVtZW50c0FyZUVxdWFsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWxlbWVudHNBcmVFcXVhbChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQlyZXR1cm4gZWxlbWVudHNBcmVFcXVhbChpdGVyYWJsZTEuaXRlcmF0b3IoKSwgaXRlcmFibGUyLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3JzIHJldHVybiBlcXVhbCBlbGVtZW50cwotCSAqIGluIHRoZSBzYW1lIG9yZGVyLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmVsZW1lbnRzQXJlRXF1YWwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbGVtZW50c0FyZUVxdWFsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IyKSB7Ci0JCXdoaWxlIChpdGVyYXRvcjEuaGFzTmV4dCgpICYmIGl0ZXJhdG9yMi5oYXNOZXh0KCkpIHsKLQkJCWlmIChUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQoaXRlcmF0b3IxLm5leHQoKSwgaXRlcmF0b3IyLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICEgKGl0ZXJhdG9yMS5oYXNOZXh0KCkgfHwgaXRlcmF0b3IyLmhhc05leHQoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGVsZW1lbnRzIGFyZSBpZGVudGljYWwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZXMgcmV0dXJuIHRoZSBzYW1lIGVsZW1lbnRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmlkZW50aWNhbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVsZW1lbnRzQXJlSWRlbnRpY2FsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMSwgSXRlcmFibGU8Pz4gaXRlcmFibGUyKSB7Ci0JCXJldHVybiBlbGVtZW50c0FyZUlkZW50aWNhbChpdGVyYWJsZTEuaXRlcmF0b3IoKSwgaXRlcmFibGUyLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3JzIHJldHVybiB0aGUgc2FtZSBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5pZGVudGljYWwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbGVtZW50c0FyZUlkZW50aWNhbChJdGVyYXRvcjw/PiBpdGVyYXRvcjEsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMikgewotCQl3aGlsZSAoaXRlcmF0b3IxLmhhc05leHQoKSAmJiBpdGVyYXRvcjIuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoaXRlcmF0b3IxLm5leHQoKSAhPSBpdGVyYXRvcjIubmV4dCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiAhIChpdGVyYXRvcjEuaGFzTmV4dCgpIHx8IGl0ZXJhdG9yMi5oYXNOZXh0KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGVzIGRvIDxlbT5ub3Q8L2VtPiByZXR1cm4gdGhlIHNhbWUKLQkgKiBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5ub3RJZGVudGljYWwoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbGVtZW50c0FyZU5vdElkZW50aWNhbChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQlyZXR1cm4gZWxlbWVudHNBcmVOb3RJZGVudGljYWwoaXRlcmFibGUxLml0ZXJhdG9yKCksIGl0ZXJhYmxlMi5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9ycyBkbyA8ZW0+bm90PC9lbT4gcmV0dXJuIHRoZSBzYW1lCi0JICogZWxlbWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3Iubm90SWRlbnRpY2FsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWxlbWVudHNBcmVOb3RJZGVudGljYWwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IxLCBJdGVyYXRvcjw/PiBpdGVyYXRvcjIpIHsKLQkJcmV0dXJuICEgZWxlbWVudHNBcmVJZGVudGljYWwoaXRlcmF0b3IxLCBpdGVyYXRvcjIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBnZXQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpbmRleAotCSAqIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuZ2V0KGludCBpbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRSBnZXQoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGdldChpdGVyYWJsZS5pdGVyYXRvcigpLCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpbmRleAotCSAqIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IuZ2V0KGludCBpbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRSBnZXQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgaW5kZXgpIHsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlFIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaSsrID09IGluZGV4KSB7Ci0JCQkJcmV0dXJuIG5leHQ7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oU3RyaW5nLnZhbHVlT2YoaW5kZXgpICsgJzonICsgU3RyaW5nLnZhbHVlT2YoaSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBoYXNoIGNvZGUgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJaWYgKGl0ZXJhYmxlID09IG51bGwpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWludCBoYXNoID0gMTsKLQkJZm9yIChPYmplY3QgZWxlbWVudCA6IGl0ZXJhYmxlKSB7Ci0JCQloYXNoID0gMzEgKiBoYXNoICsgKGVsZW1lbnQgPT0gbnVsbCA/IDAgOiBlbGVtZW50Lmhhc2hDb2RlKCkpOwotCQl9Ci0JCXJldHVybiBoYXNoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmRleCBvZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGU7Ci0JICogcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuaW5kZXhPZihPYmplY3Qgbyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZihJdGVyYWJsZTw/PiBpdGVyYWJsZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBpbmRleE9mKGl0ZXJhYmxlLml0ZXJhdG9yKCksIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3I7Ci0JICogcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IuaW5kZXhPZihPYmplY3Qgbyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZihJdGVyYXRvcjw/PiBpdGVyYXRvciwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaXRlcmF0b3IuaGFzTmV4dCgpOyBpKyspIHsKLQkJCQlpZiAoaXRlcmF0b3IubmV4dCgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGl0ZXJhdG9yLmhhc05leHQoKTsgaSsrKSB7Ci0JCQkJaWYgKHZhbHVlLmVxdWFscyhpdGVyYXRvci5uZXh0KCkpKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluc2VydGlvbiBpbmRleCBvZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaW5kZXggb2Ygd2hlcmUgdGhlIHNwZWNpZmllZCBjb21wYXJhYmxlIG9iamVjdAotCSAqIGNhbiBiZSBpbnNlcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgc29ydGVkIGxpc3QgYW5kIHN0aWxsIGtlZXAKLQkgKiB0aGUgbGlzdCBzb3J0ZWQuIElmIHRoZSBzcGVjaWZpZWQgc29ydGVkIGxpc3QgaXMgYW4gaW5zdGFuY2Ugb2YKLQkgKiB7QGxpbmsgUmFuZG9tQWNjZXNzfSByZXR1cm4gdGhlIDxlbT5tYXhpbXVtPC9lbT4gaW5zZXJ0aW9uIGluZGV4OwotCSAqIG90aGVyd2lzZSByZXR1cm4gdGhlIDxlbT5taW5pbXVtPC9lbT4gaW5zZXJ0aW9uIGluZGV4LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IGludCBpbnNlcnRpb25JbmRleE9mKExpc3Q8RT4gc29ydGVkTGlzdCwgQ29tcGFyYWJsZTxFPiB2YWx1ZSkgewotCQlpZiAoc29ydGVkTGlzdCBpbnN0YW5jZW9mIFJhbmRvbUFjY2VzcykgewotCQkJZm9yIChpbnQgaSA9IHNvcnRlZExpc3Quc2l6ZSgpOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAodmFsdWUuY29tcGFyZVRvKHNvcnRlZExpc3QuZ2V0KGkpKSA+PSAwKSB7Ci0JCQkJCXJldHVybiBpICsgMTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpbnQgaSA9IDA7Ci0JCWZvciAoRSBlbGVtZW50IDogc29ydGVkTGlzdCkgewotCQkJaWYgKHZhbHVlLmNvbXBhcmVUbyhlbGVtZW50KSA8PSAwKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCQlpKys7Ci0JCX0KLQkJcmV0dXJuIGk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGluZGV4IG9mIHdoZXJlIHRoZSBzcGVjaWZpZWQgY29tcGFyYWJsZSBvYmplY3QKLQkgKiBjYW4gYmUgaW5zZXJ0ZWQgaW50byB0aGUgc3BlY2lmaWVkIHNvcnRlZCBsaXN0IGFuZCBzdGlsbCBrZWVwCi0JICogdGhlIGxpc3Qgc29ydGVkLiBJZiB0aGUgc3BlY2lmaWVkIHNvcnRlZCBsaXN0IGlzIGFuIGluc3RhbmNlIG9mCi0JICoge0BsaW5rIFJhbmRvbUFjY2Vzc30gcmV0dXJuIHRoZSA8ZW0+bWF4aW11bTwvZW0+IGluc2VydGlvbiBpbmRleDsKLQkgKiBvdGhlcndpc2UgcmV0dXJuIHRoZSA8ZW0+bWluaW11bTwvZW0+IGluc2VydGlvbiBpbmRleC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBpbnQgaW5zZXJ0aW9uSW5kZXhPZihMaXN0PEU+IHNvcnRlZExpc3QsIEUgdmFsdWUsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCWlmIChzb3J0ZWRMaXN0IGluc3RhbmNlb2YgUmFuZG9tQWNjZXNzKSB7Ci0JCQlmb3IgKGludCBpID0gc29ydGVkTGlzdC5zaXplKCk7IGktLSA+IDA7ICkgewotCQkJCWlmIChjb21wYXJhdG9yLmNvbXBhcmUodmFsdWUsIHNvcnRlZExpc3QuZ2V0KGkpKSA+PSAwKSB7Ci0JCQkJCXJldHVybiBpICsgMTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpbnQgaSA9IDA7Ci0JCWZvciAoRSBlbGVtZW50IDogc29ydGVkTGlzdCkgewotCQkJaWYgKGNvbXBhcmF0b3IuY29tcGFyZSh2YWx1ZSwgZWxlbWVudCkgPD0gMCkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQkJaSsrOwotCQl9Ci0JCXJldHVybiBpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpdGVyYWJsZS9pdGVyYXRvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmFibGUgb24gdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLml0ZXJhYmxlKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBJdGVyYWJsZTxFPiBpdGVyYWJsZShFLi4uIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxFPihhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5pdGVyYXRvcihPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSXRlcmF0b3I8RT4gaXRlcmF0b3IoRS4uLiBhcnJheSkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8RT4oYXJyYXkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsYXN0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlJ3MgbGFzdCBlbGVtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmxhc3QoKTwvY29kZT4KLQkgKiAKLSAgICAgKiBAZXhjZXB0aW9uIGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uIGl0ZXJhYmxlIGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEUgbGFzdChJdGVyYWJsZTxFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gbGFzdChpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBpdGVyYXRvcidzIGxhc3QgZWxlbWVudC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5sYXN0KCk8L2NvZGU+Ci0JICogCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpdGVyYXRvciBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFIGxhc3QoSXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKLQkJRSBsYXN0OwotCQlkbyB7Ci0JCQlsYXN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQl9IHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpOwotCQlyZXR1cm4gbGFzdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGFzdCBpbmRleCBvZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZTsKLQkgKiByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5sYXN0SW5kZXhPZihPYmplY3QgbykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBsYXN0SW5kZXhPZihJdGVyYWJsZTw/PiBpdGVyYWJsZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBsYXN0SW5kZXhPZihpdGVyYWJsZS5pdGVyYXRvcigpLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGU7Ci0JICogcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5sYXN0SW5kZXhPZihPYmplY3QgbykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBsYXN0SW5kZXhPZihJdGVyYWJsZTw/PiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBsYXN0SW5kZXhPZihpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvcjsKLQkgKiByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5sYXN0SW5kZXhPZihPYmplY3QgbykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBsYXN0SW5kZXhPZihJdGVyYXRvcjw/PiBpdGVyYXRvciwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBsaXN0KGl0ZXJhdG9yKS5sYXN0SW5kZXhPZih2YWx1ZSkgOiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvcjsKLQkgKiByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmxhc3RJbmRleE9mKE9iamVjdCBvKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplLCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IGxpc3QoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSkubGFzdEluZGV4T2YodmFsdWUpIDogLTE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUudG9MaXN0KCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQXJyYXlMaXN0PEU+IGxpc3QoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBsaXN0KGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUudG9MaXN0KCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQXJyYXlMaXN0PEU+IGxpc3QoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiBsaXN0KGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IudG9MaXN0KCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQXJyYXlMaXN0PEU+IGxpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBsaXN0KGl0ZXJhdG9yLCBuZXcgQXJyYXlMaXN0PEU+KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IudG9MaXN0KCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQXJyYXlMaXN0PEU+IGxpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBsaXN0KGl0ZXJhdG9yLCBuZXcgQXJyYXlMaXN0PEU+KGl0ZXJhdG9yU2l6ZSkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIDxFPiBBcnJheUxpc3Q8RT4gbGlzdChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIEFycmF5TGlzdDxFPiBsaXN0KSB7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWxpc3QuYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogVW5saWtlIHtAbGluayBBcnJheXMjYXNMaXN0KE9iamVjdFtdKX0sIHRoZSBsaXN0Ci0JICogaXMgbW9kaWZpYWJsZSBhbmQgaXMgbm90IGJhY2tlZCBieSB0aGUgYXJyYXkuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQXJyYXlMaXN0PEU+IGxpc3QoRS4uLiBhcnJheSkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxFPihBcnJheXMuYXNMaXN0KGFycmF5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubGlzdEl0ZXJhdG9yKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIGxpc3RJdGVyYXRvcihhcnJheSwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhlIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5saXN0SXRlcmF0b3IoT2JqZWN0W10gYXJyYXksIGludCBpbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcihFW10gYXJyYXksIGludCBzdGFydCkgewotCQlyZXR1cm4gbGlzdEl0ZXJhdG9yKGFycmF5LCBzdGFydCwgYXJyYXkubGVuZ3RoIC0gc3RhcnQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXkKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoZSBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubGlzdEl0ZXJhdG9yKE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoRVtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxFPihhcnJheSwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1vdmUgKioqKioqKioqKgotCi0JLyoqCi0JICogTW92ZSBhbiBlbGVtZW50IGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQKLQkgKiBpbmRleC4gUmV0dXJuIHRoZSBhbHRlcmVkIGxpc3QuCi0JICogPHA+Ci0JICogPGNvZGU+TGlzdC5tb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IG1vdmUoTGlzdDxFPiBsaXN0LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlyZXR1cm4gKHRhcmdldEluZGV4ID09IHNvdXJjZUluZGV4KSA/IGxpc3QgOiBtb3ZlXyhsaXN0LCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0YXJnZXRJbmRleCAhPSBzb3VyY2VJbmRleAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBMaXN0PEU+IG1vdmVfKExpc3Q8RT4gbGlzdCwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJaWYgKGxpc3QgaW5zdGFuY2VvZiBSYW5kb21BY2Nlc3MpIHsKLQkJCS8vIG1vdmUgZWxlbWVudHMsIGxlYXZpbmcgdGhlIGxpc3QgaW4gcGxhY2UKLQkJCUUgdGVtcCA9IGxpc3QuZ2V0KHNvdXJjZUluZGV4KTsKLQkJCWlmICh0YXJnZXRJbmRleCA8IHNvdXJjZUluZGV4KSB7Ci0JCQkJZm9yIChpbnQgaSA9IHNvdXJjZUluZGV4OyBpLS0gPiB0YXJnZXRJbmRleDsgKSB7Ci0JCQkJCWxpc3Quc2V0KGkgKyAxLCBsaXN0LmdldChpKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBpID0gc291cmNlSW5kZXg7IGkgPCB0YXJnZXRJbmRleDsgaSsrKSB7Ci0JCQkJCWxpc3Quc2V0KGksIGxpc3QuZ2V0KGkgKyAxKSk7Ci0JCQkJfQotCQkJfQotCQkJbGlzdC5zZXQodGFyZ2V0SW5kZXgsIHRlbXApOwotCQl9IGVsc2UgewotCQkJLy8gcmVtb3ZlIHRoZSBlbGVtZW50IGFuZCByZS1hZGQgaXQgYXQgdGhlIHRhcmdldCBpbmRleAotCQkJbGlzdC5hZGQodGFyZ2V0SW5kZXgsIGxpc3QucmVtb3ZlKHNvdXJjZUluZGV4KSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBlbGVtZW50cyBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0Ci0JICogaW5kZXguIFJldHVybiB0aGUgYWx0ZXJlZCBsaXN0LgotCSAqIDxwPgotCSAqIDxjb2RlPkxpc3QubW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBtb3ZlKExpc3Q8RT4gbGlzdCwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJaWYgKCh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgfHwgKGxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGxpc3Q7Ci0JCX0KLQkJaWYgKGxlbmd0aCA9PSAxKSB7Ci0JCQlyZXR1cm4gbW92ZV8obGlzdCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCQlpZiAobGlzdCBpbnN0YW5jZW9mIFJhbmRvbUFjY2VzcykgewotCQkJLy8gbW92ZSBlbGVtZW50cywgbGVhdmluZyB0aGUgbGlzdCBpbiBwbGFjZQotCQkJQXJyYXlMaXN0PEU+IHRlbXAgPSBuZXcgQXJyYXlMaXN0PEU+KGxpc3Quc3ViTGlzdChzb3VyY2VJbmRleCwgc291cmNlSW5kZXggKyBsZW5ndGgpKTsKLQkJCWlmICh0YXJnZXRJbmRleCA8IHNvdXJjZUluZGV4KSB7Ci0JCQkJZm9yIChpbnQgaSA9IHNvdXJjZUluZGV4OyBpLS0gPiB0YXJnZXRJbmRleDsgKSB7Ci0JCQkJCWxpc3Quc2V0KGkgKyBsZW5ndGgsIGxpc3QuZ2V0KGkpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaW50IGkgPSBzb3VyY2VJbmRleDsgaSA8IHRhcmdldEluZGV4OyBpKyspIHsKLQkJCQkJbGlzdC5zZXQoaSwgbGlzdC5nZXQoaSArIGxlbmd0aCkpOwotCQkJCX0KLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlsaXN0LnNldCh0YXJnZXRJbmRleCArIGksIHRlbXAuZ2V0KGkpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIHJlbW92ZSB0aGUgZWxlbWVudHMgYW5kIHJlLWFkZCB0aGVtIGF0IHRoZSB0YXJnZXQgaW5kZXgKLQkJCWxpc3QuYWRkQWxsKHRhcmdldEluZGV4LCByZW1vdmVFbGVtZW50c0F0SW5kZXgobGlzdCwgc291cmNlSW5kZXgsIGxlbmd0aCkpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgYWxsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmVtb3ZlQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHJlbW92ZUFsbChjb2xsZWN0aW9uLCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmVtb3ZlQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIHJlbW92ZUFsbChjb2xsZWN0aW9uLCBpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmVtb3ZlQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IGNvbGxlY3Rpb24ucmVtb3ZlQWxsKHNldChpdGVyYXRvcikpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLnJlbW92ZUFsbChJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBjb2xsZWN0aW9uLnJlbW92ZUFsbChzZXQoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSkpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5yZW1vdmVBbGwoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBPYmplY3QuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIChhcnJheS5sZW5ndGggPT0gMCkgPyBmYWxzZSA6IGNvbGxlY3Rpb24ucmVtb3ZlQWxsKHNldChhcnJheSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgYWxsIG9jY3VycmVuY2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50Ci0JICogZnJvbSB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLnJlbW92ZUFsbE9jY3VycmVuY2VzKE9iamVjdCB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUFsbE9jY3VycmVuY2VzKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgT2JqZWN0IHZhbHVlKSB7Ci0JCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8Pz4gc3RyZWFtID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoc3RyZWFtLm5leHQoKSA9PSBudWxsKSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKHZhbHVlLmVxdWFscyhzdHJlYW0ubmV4dCgpKSkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgZWxlbWVudHMgYXQgaW5kZXggKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBlbGVtZW50cyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIFJldHVybiB0aGUgcmVtb3ZlZCBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5MaXN0LnJlbW92ZShpbnQgaW5kZXgsIGludCBsZW5ndGgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEFycmF5TGlzdDxFPiByZW1vdmVFbGVtZW50c0F0SW5kZXgoTGlzdDxFPiBsaXN0LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLQkJTGlzdDxFPiBzdWJMaXN0ID0gbGlzdC5zdWJMaXN0KGluZGV4LCBpbmRleCArIGxlbmd0aCk7Ci0JCUFycmF5TGlzdDxFPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEU+KHN1Ykxpc3QpOwotCQlzdWJMaXN0LmNsZWFyKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBkdXBsaWNhdGUgZWxlbWVudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIGFueSBkdXBsaWNhdGUgZWxlbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIGxpc3QsCi0JICogd2hpbGUgbWFpbnRhaW5pbmcgdGhlIG9yZGVyLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiByZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhMaXN0PEU+IGxpc3QpIHsKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJaWYgKChzaXplID09IDApIHx8IChzaXplID09IDEpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKGxpc3QsIHNpemUpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBsaXN0IGlzIG5vbi1lbXB0eQotCSAqLwotCXN0YXRpYyA8RT4gYm9vbGVhbiByZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhMaXN0PEU+IGxpc3QsIGludCBzaXplKSB7Ci0JCUxpbmtlZEhhc2hTZXQ8RT4gdGVtcCA9IG5ldyBMaW5rZWRIYXNoU2V0PEU+KHNpemUpOwkJLy8gdGFrZSBhZHZhbnRhZ2Ugb2YgaGFzaGVkIGxvb2stdXAKLQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQlmb3IgKEUgaXRlbSA6IGxpc3QpIHsKLQkJCWlmICggISB0ZW1wLmFkZChpdGVtKSkgewotCQkJCW1vZGlmaWVkID0gdHJ1ZTsgIC8vIGR1cGxpY2F0ZSBpdGVtCi0JCQl9Ci0JCX0KLQkJaWYgKG1vZGlmaWVkKSB7Ci0JCQlpbnQgaSA9IDA7Ci0JCQlmb3IgKEUgZSA6IHRlbXApIHsKLQkJCQlsaXN0LnNldChpLCBlKTsKLQkJCQlpKys7Ci0JCQl9Ci0JCQlpbnQgdGVtcFNpemUgPSB0ZW1wLnNpemUoKTsKLQkJCWZvciAoaSA9IGxpc3Quc2l6ZSgpOyBpLS0gPiB0ZW1wU2l6ZTsgKSB7Ci0JCQkJbGlzdC5yZW1vdmUoaSk7ICAvLyBwdWxsIG9mZiB0aGUgZW5kCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXRhaW4gYWxsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldGFpbiBvbmx5IHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5yZXRhaW5BbGwoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gcmV0YWluQWxsKGNvbGxlY3Rpb24sIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiBvbmx5IHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLnJldGFpbkFsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiByZXRhaW5BbGwoY29sbGVjdGlvbiwgaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gb25seSB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmV0YWluQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJcmV0dXJuIGNvbGxlY3Rpb24ucmV0YWluQWxsKHNldChpdGVyYXRvcikpOwotCQl9Ci0JCWlmIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWNvbGxlY3Rpb24uY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIG9ubHkgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmV0YWluQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJcmV0dXJuIGNvbGxlY3Rpb24ucmV0YWluQWxsKHNldChpdGVyYXRvciwgaXRlcmF0b3JTaXplKSk7Ci0JCX0KLQkJaWYgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJY29sbGVjdGlvbi5jbGVhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gb25seSB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmV0YWluQWxsKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgT2JqZWN0Li4uIGFycmF5KSB7Ci0JCWlmIChhcnJheS5sZW5ndGggPiAwKSB7Ci0JCQlyZXR1cm4gY29sbGVjdGlvbi5yZXRhaW5BbGwoc2V0KGFycmF5KSk7Ci0JCX0KLQkJaWYgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJY29sbGVjdGlvbi5jbGVhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmV2ZXJzZSBsaXN0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgd2l0aCBlbnRyaWVzIGluIHJldmVyc2Ugb3JkZXIgZnJvbSB0aG9zZQotCSAqIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUucmV2ZXJzZUxpc3QoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBBcnJheUxpc3Q8RT4gcmV2ZXJzZUxpc3QoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiByZXZlcnNlTGlzdChpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IHdpdGggZW50cmllcyBpbiByZXZlcnNlIG9yZGVyIGZyb20gdGhvc2UKLQkgKiByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUucmV2ZXJzZUxpc3QoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBBcnJheUxpc3Q8RT4gcmV2ZXJzZUxpc3QoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiByZXZlcnNlTGlzdChpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgd2l0aCBlbnRyaWVzIGluIHJldmVyc2Ugb3JkZXIgZnJvbSB0aG9zZQotCSAqIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IucmV2ZXJzZUxpc3QoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBBcnJheUxpc3Q8RT4gcmV2ZXJzZUxpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiAoQXJyYXlMaXN0PEU+KSByZXZlcnNlKGxpc3QoaXRlcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IHdpdGggZW50cmllcyBpbiByZXZlcnNlIG9yZGVyIGZyb20gdGhvc2UKLQkgKiByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IucmV2ZXJzZUxpc3QoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBBcnJheUxpc3Q8RT4gcmV2ZXJzZUxpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gKEFycmF5TGlzdDxFPikgcmV2ZXJzZShsaXN0KGl0ZXJhdG9yLCBzaXplKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJvdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gInJvdGF0ZWQiIGJ5IG9uZSBwb3NpdGlvbi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5MaXN0LnJvdGF0ZSgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gcm90YXRlKExpc3Q8RT4gbGlzdCkgewotCQlyZXR1cm4gcm90YXRlKGxpc3QsIDEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZXQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5IYXNoU2V0KEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoU2V0PEU+IHNldChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHNldChpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SGFzaFNldChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaFNldDxFPiBzZXQoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiBzZXQoaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hTZXQoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hTZXQ8RT4gc2V0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gc2V0KGl0ZXJhdG9yLCBuZXcgSGFzaFNldDxFPigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SGFzaFNldChJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaFNldDxFPiBzZXQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBzZXQoaXRlcmF0b3IsIG5ldyBIYXNoU2V0PEU+KGl0ZXJhdG9yU2l6ZSkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIDxFPiBIYXNoU2V0PEU+IHNldChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIEhhc2hTZXQ8RT4gc2V0KSB7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXNldC5hZGQoaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gc2V0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+SGFzaFNldChPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaFNldDxFPiBzZXQoRS4uLiBhcnJheSkgewotCQlIYXNoU2V0PEU+IHNldCA9IG5ldyBIYXNoU2V0PEU+KGFycmF5Lmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7KSB7Ci0JCQlzZXQuYWRkKGFycmF5W2ldKTsKLQkJfQotCQlyZXR1cm4gc2V0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzaW5nbGV0b24gaXRlcmF0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBvbmx5IHRoZSBzaW5nbGUsCi0JICogc3BlY2lmaWVkIG9iamVjdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3QudG9JdGVyYXRvcigpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEl0ZXJhdG9yPEU+IHNpbmdsZXRvbkl0ZXJhdG9yKEUgdmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4odmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3IgdGhhdCByZXR1cm5zIG9ubHkgdGhlIHNpbmdsZSwKLQkgKiBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIDxwPgotCSAqIDxjb2RlPk9iamVjdC50b0xpc3RJdGVyYXRvcigpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3RJdGVyYXRvcjxFPiBzaW5nbGV0b25MaXN0SXRlcmF0b3IoRSB2YWx1ZSkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4odmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzaXplICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuc2l6ZSgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHNpemUoSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHNpemUoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5zaXplKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgc2l6ZShJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlpbnQgc2l6ZSA9IDA7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCXNpemUrKzsKLQkJfQotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBpcyBlbXB0eQotCSAqIChTaG9ydGN1dHMgdGhlIGl0ZXJhdG9yIHJhdGhlciB0aGFuIGNhbGN1bGF0aW5nIHRoZSBlbnRpcmUgc2l6ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbXB0eShJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gaXNFbXB0eShpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBpcyBlbXB0eQotCSAqIChTaG9ydGN1dHMgdGhlIGl0ZXJhdG9yIHJhdGhlciB0aGFuIGNhbGN1bGF0aW5nIHRoZSBlbnRpcmUgc2l6ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbXB0eShJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlyZXR1cm4gISBpdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogc29ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgc29ydGVkIGVsZW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuc29ydCgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IEl0ZXJhYmxlPEU+IHNvcnQoSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHNvcnQoaXRlcmFibGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBzb3J0ZWQgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLnNvcnQoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBJdGVyYWJsZTxFPiBzb3J0KEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiBzb3J0KGl0ZXJhYmxlLCBudWxsLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBzb3J0ZWQgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5zb3J0KENvbXBhcmF0b3IgY29tcGFyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSXRlcmFibGU8RT4gc29ydChJdGVyYWJsZTxFPiBpdGVyYWJsZSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnQobGlzdChpdGVyYWJsZSksIGNvbXBhcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBzb3J0ZWQgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLnNvcnQoQ29tcGFyYXRvciBjb21wYXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBJdGVyYWJsZTxFPiBzb3J0KEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvciwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gc29ydChsaXN0KGl0ZXJhYmxlLCBpdGVyYWJsZVNpemUpLCBjb21wYXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLnNvcnQoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBMaXN0SXRlcmF0b3I8RT4gc29ydChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnQoaXRlcmF0b3IsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlcmF0b3IgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5zb3J0KCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4gTGlzdEl0ZXJhdG9yPEU+IHNvcnQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBzb3J0KGl0ZXJhdG9yLCBudWxsLCBpdGVyYXRvclNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlcmF0b3IgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3Iuc29ydChDb21wYXJhdG9yIGNvbXBhcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3RJdGVyYXRvcjxFPiBzb3J0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnQobGlzdChpdGVyYXRvciksIGNvbXBhcmF0b3IpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlcmF0b3IgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5zb3J0KENvbXBhcmF0b3IgY29tcGFyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdEl0ZXJhdG9yPEU+IHNvcnQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlyZXR1cm4gc29ydChsaXN0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpLCBjb21wYXJhdG9yKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc29ydGVkIHNldCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5UcmVlU2V0KEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBUcmVlU2V0PEU+IHNvcnRlZFNldChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPlRyZWVTZXQoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IFRyZWVTZXQ8RT4gc29ydGVkU2V0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gc29ydGVkU2V0KGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiBhbmQgY29tcGFyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5UcmVlU2V0KEl0ZXJhYmxlIGl0ZXJhYmxlLCBDb21wYXJhdG9yIGMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFRyZWVTZXQ8RT4gc29ydGVkU2V0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChpdGVyYWJsZS5pdGVyYXRvcigpLCBjb21wYXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZQotCSAqIGFuZCBjb21wYXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+VHJlZVNldChJdGVyYWJsZSBpdGVyYWJsZSwgQ29tcGFyYXRvciBjKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBUcmVlU2V0PEU+IHNvcnRlZFNldChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQoaXRlcmFibGUuaXRlcmF0b3IoKSwgY29tcGFyYXRvciwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5UcmVlU2V0KEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBUcmVlU2V0PEU+IHNvcnRlZFNldChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChpdGVyYXRvciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5UcmVlU2V0KEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBUcmVlU2V0PEU+IHNvcnRlZFNldChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChpdGVyYXRvciwgbnVsbCwgaXRlcmF0b3JTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIGFuZCBjb21wYXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPlRyZWVTZXQoSXRlcmF0b3IgaXRlcmF0b3IsIENvbXBhcmF0b3IgYyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gVHJlZVNldDxFPiBzb3J0ZWRTZXQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlyZXR1cm4gc29ydGVkU2V0KGxpc3QoaXRlcmF0b3IpLCBjb21wYXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIGFuZCBjb21wYXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+VHJlZVNldChJdGVyYXRvciBpdGVyYXRvciwgQ29tcGFyYXRvciBjKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBUcmVlU2V0PEU+IHNvcnRlZFNldChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQobGlzdChpdGVyYXRvciwgaXRlcmF0b3JTaXplKSwgY29tcGFyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IFRyZWVTZXQ8RT4gc29ydGVkU2V0KExpc3Q8RT4gbGlzdCwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJVHJlZVNldDxFPiBzb3J0ZWRTZXQgPSBuZXcgVHJlZVNldDxFPihjb21wYXJhdG9yKTsKLQkJc29ydGVkU2V0LmFkZEFsbChsaXN0KTsKLQkJcmV0dXJuIHNvcnRlZFNldDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5UcmVlU2V0KE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBUcmVlU2V0PEU+IHNvcnRlZFNldChFLi4uIGFycmF5KSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQoYXJyYXksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFycmF5Ci0JICogYW5kIGNvbXBhcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+VHJlZVNldChPYmplY3RbXSBhcnJheSwgQ29tcGFyYXRvciBjKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBUcmVlU2V0PEU+IHNvcnRlZFNldChFW10gYXJyYXksIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCVRyZWVTZXQ8RT4gc29ydGVkU2V0ID0gbmV3IFRyZWVTZXQ8RT4oY29tcGFyYXRvcik7Ci0JCXNvcnRlZFNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChhcnJheSkpOwotCQlyZXR1cm4gc29ydGVkU2V0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPbGQgU2Nob29sIFZlY3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBsZWdhY3kgY29kZSB0aGF0IHJlcXVpcmVzIGEge0BsaW5rIFZlY3Rvcn0uCi0JICogPHA+Ci0JICogPGNvZGU+VmVjdG9yKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBWZWN0b3I8RT4gdmVjdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gdmVjdG9yKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHZlY3RvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIGxlZ2FjeSBjb2RlIHRoYXQgcmVxdWlyZXMgYSB7QGxpbmsgVmVjdG9yfS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5WZWN0b3IoSXRlcmFibGUgaXRlcmFibGUsIGludCBzaXplKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBWZWN0b3I8RT4gdmVjdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJcmV0dXJuIHZlY3RvcihpdGVyYWJsZS5pdGVyYXRvcigpLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBsZWdhY3kgY29kZSB0aGF0IHJlcXVpcmVzIGEge0BsaW5rIFZlY3Rvcn0uCi0JICogPHA+Ci0JICogPGNvZGU+VmVjdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBWZWN0b3I8RT4gdmVjdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gdmVjdG9yKGl0ZXJhdG9yLCBuZXcgVmVjdG9yPEU+KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHZlY3RvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIGxlZ2FjeSBjb2RlIHRoYXQgcmVxdWlyZXMgYSB7QGxpbmsgVmVjdG9yfS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5WZWN0b3IoSXRlcmF0b3IgaXRlcmF0b3IsIGludCBzaXplKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBWZWN0b3I8RT4gdmVjdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IHNpemUpIHsKLQkJcmV0dXJuIHZlY3RvcihpdGVyYXRvciwgbmV3IFZlY3RvcjxFPihzaXplKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IFZlY3RvcjxFPiB2ZWN0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBWZWN0b3I8RT4gdikgewotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQl2LmFkZEVsZW1lbnQoaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gdjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBsZWdhY3kgY29kZSB0aGF0IHJlcXVpcmVzIGEge0BsaW5rIFZlY3Rvcn0uCi0JICogPHA+Ci0JICogPGNvZGU+VmVjdG9yKE9iamVjdC4uLiBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gVmVjdG9yPEU+IHZlY3RvcihFLi4uIGFycmF5KSB7Ci0JCVZlY3RvcjxFPiB2ID0gbmV3IFZlY3RvcjxFPihhcnJheS5sZW5ndGgpOwotCQlmb3IgKEUgaXRlbSA6IGFycmF5KSB7Ci0JCQl2LmFkZEVsZW1lbnQoaXRlbSk7Ci0JCX0KLQkJcmV0dXJuIHY7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNpbmdsZS11c2UgSXRlcmFibGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgb25lLXVzZSB7QGxpbmsgSXRlcmFibGV9IGZvciB0aGUgc3BlY2lmaWVkIHtAbGluayBJdGVyYXRvcn0uCi0JICogVGhyb3cgYW4ge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gaWYge0BsaW5rIEl0ZXJhYmxlI2l0ZXJhdG9yKCl9Ci0JICogaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgotCSAqIEFzIHN1Y2gsIHRoaXMgdXRpbGl0eSBzaG91bGQgb25seSBiZSB1c2VkIGluIG9uZS11c2Ugc2l0dWF0aW9ucywgc3VjaCBhcwotCSAqIGEgZm9yZWFjaCBsb29wLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFNpbmdsZVVzZUl0ZXJhYmxlPEU+KGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgb25lLXRpbWUgdXNlIGl0ZXJhYmxlIHRoYXQgY2FuIHJldHVybiBhIHNpbmdsZSBpdGVyYXRvci4KLQkgKiBPbmNlIHRoZSBpdGVyYXRvciBpcyByZXR1cm5lZCB0aGUgaXRlcmFibGUgaXMgbm8gbG9uZ2VyIHZhbGlkLgotCSAqIEFzIHN1Y2gsIHRoaXMgdXRpbGl0eSBzaG91bGQgb25seSBiZSB1c2VkIGluIG9uZS10aW1lIHVzZSBzaXR1YXRpb25zLAotCSAqIHN1Y2ggYXMgYSAnZm9yLWVhY2gnIGxvb3AuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGVVc2VJdGVyYWJsZTxFPiBpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+IHsKLQkJcHJpdmF0ZSBJdGVyYXRvcjxFPiBpdGVyYXRvcjsKLQotCQlwdWJsaWMgU2luZ2xlVXNlSXRlcmFibGUoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJaWYgKGl0ZXJhdG9yID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuaXRlcmF0b3IgPSBuZXcgU3VwZXJJdGVyYXRvcldyYXBwZXI8RT4oaXRlcmF0b3IpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQkJaWYgKHRoaXMuaXRlcmF0b3IgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlJdGVyYXRvcjxFPiByZXN1bHQgPSB0aGlzLml0ZXJhdG9yOwotCQkJdGhpcy5pdGVyYXRvciA9IG51bGw7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9yKTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGphdmEudXRpbC5Db2xsZWN0aW9ucyBlbmhhbmNlbWVudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZXN0aW5hdGlvbiBsaXN0IGFmdGVyIHRoZSBzb3VyY2UgbGlzdCBoYXMgYmVlbiBjb3BpZWQgaW50byBpdC4KLQkgKiBAc2VlIENvbGxlY3Rpb25zI2NvcHkoTGlzdCwgTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IGNvcHkoTGlzdDxFPiBkZXN0LCBMaXN0PD8gZXh0ZW5kcyBFPiBzcmMpIHsKLQkJQ29sbGVjdGlvbnMuY29weShkZXN0LCBzcmMpOwotCQlyZXR1cm4gZGVzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBDb2xsZWN0aW9ucyNmaWxsKExpc3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IGZpbGwoTGlzdDxFPiBsaXN0LCBFIHZhbHVlKSB7Ci0JCUNvbGxlY3Rpb25zLmZpbGwobGlzdCwgdmFsdWUpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gInJldmVyc2VkIi4KLQkgKiBAc2VlIENvbGxlY3Rpb25zI3JldmVyc2UoTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHJldmVyc2UoTGlzdDxFPiBsaXN0KSB7Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UobGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAicm90YXRlZCIuCi0JICogQHNlZSBDb2xsZWN0aW9ucyNyb3RhdGUoTGlzdCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gcm90YXRlKExpc3Q8RT4gbGlzdCwgaW50IGRpc3RhbmNlKSB7Ci0JCUNvbGxlY3Rpb25zLnJvdGF0ZShsaXN0LCBkaXN0YW5jZSk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAic2h1ZmZsZWQiLgotCSAqIEBzZWUgQ29sbGVjdGlvbnMjc2h1ZmZsZShMaXN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gc2h1ZmZsZShMaXN0PEU+IGxpc3QpIHsKLQkJQ29sbGVjdGlvbnMuc2h1ZmZsZShsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IGFmdGVyIGl0IGhhcyBiZWVuICJzaHVmZmxlZCIuCi0JICogQHNlZSBDb2xsZWN0aW9ucyNzaHVmZmxlKExpc3QsIFJhbmRvbSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHNodWZmbGUoTGlzdDxFPiBsaXN0LCBSYW5kb20gcmFuZG9tKSB7Ci0JCUNvbGxlY3Rpb25zLnNodWZmbGUobGlzdCwgcmFuZG9tKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIE5COiBUaGUgbGlzdCBpcyBzb3J0ZWQgaW4gcGxhY2UgYXMgYSBzaWRlLWVmZmVjdC4KLQkgKiBAc2VlIENvbGxlY3Rpb25zI3NvcnQoTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBMaXN0PEU+IHNvcnQoTGlzdDxFPiBsaXN0KSB7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBOQjogVGhlIGxpc3QgaXMgc29ydGVkIGluIHBsYWNlIGFzIGEgc2lkZS1lZmZlY3QuCi0JICogQHNlZSBDb2xsZWN0aW9ucyNzb3J0KExpc3QsIENvbXBhcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBzb3J0KExpc3Q8RT4gbGlzdCwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJQ29sbGVjdGlvbnMuc29ydChsaXN0LCBjb21wYXJhdG9yKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IGFmdGVyIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMgaGF2ZSBiZWVuICJzd2FwcGVkIi4KLQkgKiBAc2VlIENvbGxlY3Rpb25zI3N3YXAoTGlzdCwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBzd2FwKExpc3Q8RT4gbGlzdCwgaW50IGksIGludCBqKSB7Ci0JCUNvbGxlY3Rpb25zLnN3YXAobGlzdCwgaSwgaik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvblRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0NvbXBvc2l0ZUV4Y2VwdGlvbi5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29tcG9zaXRlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYjUxMjguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29tcG9zaXRlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBQcm92aWRlIGEgd2F5IGZvciBtdWx0aXBsZSBleGNlcHRpb25zIHRvIGJlIHBhY2thZ2VkIGFuZCByZXBvcnRlZC4KLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZUV4Y2VwdGlvbgotCWV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgotewotCXByaXZhdGUgZmluYWwgVGhyb3dhYmxlW10gZXhjZXB0aW9uczsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBleGNlcHRpb25zIGxpc3QgbXVzdCBub3QgYmUgZW1wdHkuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUV4Y2VwdGlvbihDb2xsZWN0aW9uPFRocm93YWJsZT4gZXhjZXB0aW9ucykgewotCQl0aGlzKGV4Y2VwdGlvbnMudG9BcnJheShuZXcgVGhyb3dhYmxlW2V4Y2VwdGlvbnMuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgZXhjZXB0aW9ucyBsaXN0IG11c3Qgbm90IGJlIGVtcHR5LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVFeGNlcHRpb24oVGhyb3dhYmxlW10gZXhjZXB0aW9ucykgewotCQkvLyBwcm92aWRlIGEgbGlzdCBvZiB0aGUgbmVzdGVkIGV4Y2VwdGlvbnMgYW5kCi0JCS8vIGdyYWIgdGhlIGZpcnN0IGV4Y2VwdGlvbiBhbmQgbWFrZSBpdCB0aGUgImNhdXNlIgotCQlzdXBlcihidWlsZE1lc3NhZ2UoZXhjZXB0aW9ucykpOwotCQl0aGlzLmV4Y2VwdGlvbnMgPSBleGNlcHRpb25zOwotCX0KLQotCXB1YmxpYyBUaHJvd2FibGVbXSBnZXRFeGNlcHRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5leGNlcHRpb25zOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBidWlsZE1lc3NhZ2UoVGhyb3dhYmxlW10gZXhjZXB0aW9ucykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJc2IuYXBwZW5kKGV4Y2VwdGlvbnMubGVuZ3RoKTsKLQkJc2IuYXBwZW5kKCIgZXhjZXB0aW9uczogIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKCdbJyk7Ci0JCWZvciAoVGhyb3dhYmxlIGV4IDogZXhjZXB0aW9ucykgewotCQkJc2IuYXBwZW5kKGV4LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJCXNiLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNiLnNldExlbmd0aChzYi5sZW5ndGgoKSAtIDIpOyAgLy8gY2hvcCBvZmYgdHJhaWxpbmcgY29tbWEKLQkJc2IuYXBwZW5kKCddJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFN0cmVhbSBzKSB7Ci0JCXN5bmNocm9uaXplZCAocykgewotCQkJcy5wcmludGxuKHRoaXMpOwotCQkJZm9yIChTdGFja1RyYWNlRWxlbWVudCBlbGVtZW50IDogdGhpcy5nZXRTdGFja1RyYWNlKCkpIHsKLQkJCQlzLnByaW50KCJcdGF0ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJcy5wcmludGxuKGVsZW1lbnQpOwotCQkJfQotCQkJaW50IGkgPSAxOwotCQkJZm9yIChUaHJvd2FibGUgZXggOiB0aGlzLmV4Y2VwdGlvbnMpIHsKLQkJCQlzLnByaW50KCJOZXN0ZWQgZXhjZXB0aW9uICIpOyAvLyROT04tTkxTLTEkCi0JCQkJcy5wcmludChpKyspOwotCQkJCXMucHJpbnQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlleC5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRXcml0ZXIgcykgewotCQlzeW5jaHJvbml6ZWQgKHMpIHsKLQkJCXMucHJpbnRsbih0aGlzKTsKLQkJCWZvciAoU3RhY2tUcmFjZUVsZW1lbnQgZWxlbWVudCA6IHRoaXMuZ2V0U3RhY2tUcmFjZSgpKSB7Ci0JCQkJcy5wcmludCgiXHRhdCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXMucHJpbnRsbihlbGVtZW50KTsKLQkJCX0KLQkJCWludCBpID0gMTsKLQkJCWZvciAoVGhyb3dhYmxlIGV4IDogdGhpcy5leGNlcHRpb25zKSB7Ci0JCQkJcy5wcmludCgiTmVzdGVkIGV4Y2VwdGlvbiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXMucHJpbnQoaSsrKTsKLQkJCQlzLnByaW50KCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJZXgucHJpbnRTdGFja1RyYWNlKHMpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWRmYmY0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0NvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkV4Y2VwdGlvbkhhbmRsZXI7Ci0KLS8qKgotICogQSA8Y29kZT5Db25zdW1lclRocmVhZENvb3JkaW5hdG9yPC9jb2RlPiBjb250cm9scyB0aGUgY3JlYXRpb24sCi0gKiBzdGFydGluZywgYW5kIHN0b3BwaW5nIG9mIGEgZ2VuZXJhbCBwdXJwb3NlICJjb25zdW1lciIgdGhyZWFkLiBDb25zdHJ1Y3QKLSAqIHRoZSBjb29yZGluYXRvciB3aXRoIGEge0BsaW5rIENvbnN1bWVyfSB0aGF0IGJvdGggd2FpdHMgZm9yIHRoZSBwcm9kdWNlcgotICogdG8gInByb2R1Y2UiIHNvbWV0aGluZyB0byAiY29uc3VtZSIgYW5kLCBvbmNlIHRoZSB3YWl0IGlzIG92ZXIsCi0gKiAiY29uc3VtZXMiIHdoYXRldmVyIGlzIGF2YWlsYWJsZS4KLSAqLwotcHVibGljIGNsYXNzIENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IgewotCS8qKgotCSAqIFRoZSBydW5uYWJsZSBwYXNzZWQgdG8gdGhlIGNvbnN1bWVyIHRocmVhZCBlYWNoIHRpbWUgaXQgaXMgYnVpbHQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBydW5uYWJsZTsKLQotCS8qKgotCSAqIENsaWVudC1zdXBwbGllZCB0aHJlYWQgZmFjdG9yeS4gRGVmYXVsdHMgdG8gYSBzdHJhaWdodGZvcndhcmQKLQkgKiBpbXBsZW1lbnRhdGlvbi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeTsKLQotCS8qKgotCSAqIE9wdGlvbmFsLCBjbGllbnQtc3VwcGxpZWQgbmFtZSBmb3IgdGhlIGNvbnN1bWVyIHRocmVhZC4KLQkgKiBJZiBudWxsLCB0aGUgSkRLIGFzc2lnbnMgYSBuYW1lLgotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHRocmVhZE5hbWU7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3VtZXIgaXMgZXhlY3V0ZWQgb24gdGhpcyB0aHJlYWQuIEEgbmV3IHRocmVhZCBpcyBidWlsdAotCSAqIGZvciBldmVyeSBzdGFydC9zdG9wIGN5Y2xlIChzaW5jZSBhIHRocmVhZCBjYW5ub3QgYmUgc3RhcnRlZCBtb3JlIHRoYW4KLQkgKiBvbmNlKS4KLQkgKi8KLQlwcml2YXRlIHZvbGF0aWxlIFRocmVhZCB0aHJlYWQ7Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgdGhlIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSBjb25zdW1lci4KLQkgKi8KLQkvKiBDVSBwcml2YXRlICovIGZpbmFsIEV4Y2VwdGlvbkhhbmRsZXIgZXhjZXB0aW9uSGFuZGxlcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29uc3VtZXIgdGhyZWFkIGNvb3JkaW5hdG9yIGZvciB0aGUgc3BlY2lmaWVkIGNvbnN1bWVyLgotCSAqIFVzZSBzaW1wbGUgSkRLIHRocmVhZChzKSBmb3IgdGhlIGNvbnN1bWVyIHRocmVhZChzKS4KLQkgKiBBbGxvdyB0aGUgY29uc3VtZXIgdGhyZWFkKHMpIHRvIGJlIGFzc2lnbmVkIEpESy1nZW5lcmF0ZWQgbmFtZXMuCi0JICogQW55IGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSBjb25zdW1lciB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlCi0JICogc3BlY2lmaWVkIGV4Y2VwdGlvbiBoYW5kbGVyLgotCSAqLwotCXB1YmxpYyBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yKENvbnN1bWVyIGNvbnN1bWVyLCBFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIpIHsKLQkJdGhpcyhjb25zdW1lciwgbnVsbCwgZXhjZXB0aW9uSGFuZGxlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29uc3VtZXIgdGhyZWFkIGNvb3JkaW5hdG9yIGZvciB0aGUgc3BlY2lmaWVkIGNvbnN1bWVyLgotCSAqIEFzc2lnbiB0aGUgY29uc3VtZXIgdGhyZWFkKHMpIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBVc2Ugc2ltcGxlIEpESyB0aHJlYWQocykgZm9yIHRoZSBjb25zdW1lciB0aHJlYWQocykuCi0JICogQW55IGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSBjb25zdW1lciB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlCi0JICogc3BlY2lmaWVkIGV4Y2VwdGlvbiBoYW5kbGVyLgotCSAqLwotCXB1YmxpYyBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yKENvbnN1bWVyIGNvbnN1bWVyLCBTdHJpbmcgdGhyZWFkTmFtZSwgRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyKSB7Ci0JCXRoaXMoY29uc3VtZXIsIFNpbXBsZVRocmVhZEZhY3RvcnkuaW5zdGFuY2UoKSwgdGhyZWFkTmFtZSwgZXhjZXB0aW9uSGFuZGxlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29uc3VtZXIgdGhyZWFkIGNvb3JkaW5hdG9yIGZvciB0aGUgc3BlY2lmaWVkIGNvbnN1bWVyLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHRocmVhZCBmYWN0b3J5IHRvIGNvbnN0cnVjdCB0aGUgY29uc3VtZXIgdGhyZWFkKHMpLgotCSAqIEFzc2lnbiB0aGUgY29uc3VtZXIgdGhyZWFkKHMpIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBBbnkgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNvbnN1bWVyIHdpbGwgYmUgaGFuZGxlZCBieSB0aGUKLQkgKiBzcGVjaWZpZWQgZXhjZXB0aW9uIGhhbmRsZXIuCi0JICovCi0JcHVibGljIENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IoQ29uc3VtZXIgY29uc3VtZXIsIFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSwgU3RyaW5nIHRocmVhZE5hbWUsIEV4Y2VwdGlvbkhhbmRsZXIgZXhjZXB0aW9uSGFuZGxlcikgewotCQlzdXBlcigpOwotCQl0aGlzLnJ1bm5hYmxlID0gdGhpcy5idWlsZFJ1bm5hYmxlKGNvbnN1bWVyKTsKLQkJaWYgKCh0aHJlYWRGYWN0b3J5ID09IG51bGwpIHx8ICgoZXhjZXB0aW9uSGFuZGxlciA9PSBudWxsKSkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMudGhyZWFkRmFjdG9yeSA9IHRocmVhZEZhY3Rvcnk7Ci0JCXRoaXMudGhyZWFkTmFtZSA9IHRocmVhZE5hbWU7Ci0JCXRoaXMuZXhjZXB0aW9uSGFuZGxlciA9IGV4Y2VwdGlvbkhhbmRsZXI7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKENvbnN1bWVyIGNvbnN1bWVyKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGVDb25zdW1lcihjb25zdW1lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpZmVjeWNsZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCBzdGFydCB0aGUgY29uc3VtZXIgdGhyZWFkLgotCSAqIAotCSAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBjb29yZGluYXRvciBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoKSB7Ci0JCWlmICh0aGlzLnRocmVhZCAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3Qgc3RvcHBlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMudGhyZWFkID0gdGhpcy5idWlsZFRocmVhZCgpOwotCQl0aGlzLnRocmVhZC5zdGFydCgpOwotCX0KLQotCXByaXZhdGUgVGhyZWFkIGJ1aWxkVGhyZWFkKCkgewotCQlUaHJlYWQgdCA9IHRoaXMudGhyZWFkRmFjdG9yeS5uZXdUaHJlYWQodGhpcy5ydW5uYWJsZSk7Ci0JCWlmICh0aGlzLnRocmVhZE5hbWUgIT0gbnVsbCkgewotCQkJdC5zZXROYW1lKHRoaXMudGhyZWFkTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHQ7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJydXB0IHRoZSBjb25zdW1lciB0aHJlYWQgc28gdGhhdCBpdCBzdG9wcyBleGVjdXRpbmcgYXQgdGhlCi0JICogZW5kIG9mIGl0cyBjdXJyZW50IGl0ZXJhdGlvbi4gU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwKLQkgKiB0aGUgY29uc3VtZXIgdGhyZWFkIGlzIGZpbmlzaGVkIGV4ZWN1dGluZy4gSWYgYW55IHVuY2F1Z2h0Ci0JICogZXhjZXB0aW9ucyB3ZXJlIHRocm93biB3aGlsZSB0aGUgY29uc3VtZXIgdGhyZWFkIHdhcyBleGVjdXRpbmcsCi0JICogd3JhcCB0aGVtIGluIGEgY29tcG9zaXRlIGV4Y2VwdGlvbiBhbmQgdGhyb3cgdGhlIGNvbXBvc2l0ZSBleGNlcHRpb24uCi0JICogCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGNvb3JkaW5hdG9yIGhhcyBub3QgYmVlbiBzdGFydGVkCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGhpcy50aHJlYWQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm90IHN0YXJ0ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLnRocmVhZC5pbnRlcnJ1cHQoKTsKLQkJdGhpcy50aHJlYWQuam9pbigpOwotCQl0aGlzLnRocmVhZCA9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy50aHJlYWQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdW1lciB0aHJlYWQgcnVubmFibGUgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUnVubmFibGV9IGlzIGEgbG9uZy1ydW5uaW5nIGNvbnN1bWVyIHRoYXQKLQkgKiB3aWxsIHJlcGVhdGVkbHkgZXhlY3V0ZSB0aGUgY29uc3VtZXIge0BsaW5rIENvbnN1bWVyI2NvbnN1bWUoKX0gbWV0aG9kLgotCSAqIFdpdGggZWFjaCBpdGVyYXRpb24sIHRoZSBjb25zdW1lciB0aHJlYWQgd2lsbCB3YWl0Ci0JICogdW50aWwgdGhlIG90aGVyIGNvbnN1bWVyIG1ldGhvZCwge0BsaW5rIENvbnN1bWVyI3dhaXRGb3JQcm9kdWNlcigpfSwgYWxsb3dzIHRoZQotCSAqIGNvbnN1bWVyIHRocmVhZCB0byBwcm9jZWVkIChpLmUuIHRoZXJlIGlzIHNvbWV0aGluZyBmb3IgdGhlIGNvbnN1bWVyIHRvCi0JICogY29uc3VtZSkuIE9uY2Uge0BsaW5rIENvbnN1bWVyI2NvbnN1bWUoKX0gaXMgZmluaXNoZWQsIHRoZSB0aHJlYWQgd2lsbCBxdWllc2NlCi0JICogdW50aWwge0BsaW5rIENvbnN1bWVyI3dhaXRGb3JQcm9kdWNlcigpfSByZXR1cm5zIGFnYWluLgotCSAqIFN0b3AgdGhlIHRocmVhZCBieSBjYWxsaW5nIHtAbGluayBUaHJlYWQjaW50ZXJydXB0KCl9LgotCSAqLwotCXByaXZhdGUgY2xhc3MgUnVubmFibGVDb25zdW1lcgotCQlpbXBsZW1lbnRzIFJ1bm5hYmxlCi0JewotCQkvKioKLQkJICogQ2xpZW50LXN1cHBsaWVkIGNvbnN1bWVyIHRoYXQgY29udHJvbHMgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGNvbnN1bWUKLQkJICogYW5kIHRoZSBjb25zdW1pbmcgaXRzZWxmLgotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBDb25zdW1lciBjb25zdW1lcjsKLQotCQlSdW5uYWJsZUNvbnN1bWVyKENvbnN1bWVyIGNvbnN1bWVyKSB7Ci0JCQlzdXBlcigpOwotCQkJaWYgKGNvbnN1bWVyID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuY29uc3VtZXIgPSBjb25zdW1lcjsKLQkJfQotCi0JCS8qKgotCQkgKiBMb29wIHdoaWxlIHRoaXMgdGhyZWFkIGhhcyBub3QgYmVlbiBpbnRlcnJ1cHRlZCBieSBhbm90aGVyIHRocmVhZC4KLQkJICogSW4gZWFjaCBsb29wOiBQYXVzZSBleGVjdXRpb24gdW50aWwge0BsaW5rIENvbnN1bWVyI3dhaXRGb3JQcm9kdWNlcigpfQotCQkgKiBhbGxvd3MgdXMgdG8gcHJvY2VlZC4KLQkJICogPHA+Ci0JCSAqIElmIHRoaXMgdGhyZWFkIGlzIGludGVycnVwdGVkIDxlbT5kdXJpbmc8L2VtPiB7QGxpbmsgQ29uc3VtZXIjY29uc3VtZSgpfSwKLQkJICogdGhlIGNhbGwgdG8ge0BsaW5rIFRocmVhZCNpc0ludGVycnVwdGVkKCl9IHdpbGwgc3RvcCB0aGUgbG9vcC4gSWYgdGhpcyB0aHJlYWQgaXMKLQkJICogaW50ZXJydXB0ZWQgZHVyaW5nIHRoZSBjYWxsIHRvIHtAbGluayBDb25zdW1lciN3YWl0Rm9yUHJvZHVjZXIoKX0sCi0JCSAqIHdlIHdpbGwgY2F0Y2ggdGhlIHtAbGluayBJbnRlcnJ1cHRlZEV4Y2VwdGlvbn0gYW5kIHN0b3AgdGhlIGxvb3AgYWxzby4KLQkJICogCi0JCSAqIEBzZWUgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvciNzdG9wKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXdoaWxlICggISBUaHJlYWQuY3VycmVudFRocmVhZCgpLmlzSW50ZXJydXB0ZWQoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXRoaXMuY29uc3VtZXIud2FpdEZvclByb2R1Y2VyKCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gd2Ugd2VyZSBpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nLCBtdXN0IGJlIFF1aXR0aW4nIFRpbWUKLQkJCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsgIC8vIHNldCB0aGUgVGhyZWFkJ3MgaW50ZXJydXB0IHN0YXR1cwotCQkJCQlyZXR1cm47Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJCQlDb25zdW1lclRocmVhZENvb3JkaW5hdG9yLnRoaXMuZXhjZXB0aW9uSGFuZGxlci5oYW5kbGVFeGNlcHRpb24oZXgpOwotCQkJCQlyZXR1cm47ICAvLyBobW1tLi4uIGtpbGwgdGhlIHRocmVhZD8KLQkJCQl9Ci0JCQkJdGhpcy5jb25zdW1lKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogRGVsZWdhdGUgdG8gdGhlIGNvbnN1bWVyIHtAbGluayBDb25zdW1lciNjb25zdW1lKCl9IG1ldGhvZC4KLQkJICogRG8gbm90IGFsbG93IGFueSB1bmhhbmRsZWQgZXhjZXB0aW9ucyB0byBraWxsIHRoZSB0aHJlYWQuCi0JCSAqIFBhc3MgdGhlbSB0byB0aGUgZXhjZXB0aW9uIGhhbmRsZXIuCi0JCSAqIEBzZWUgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvciNzdG9wKCkKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjb25zdW1lKCkgewotCQkJdHJ5IHsKLQkJCQl0aGlzLmNvbnN1bWVyLmNvbnN1bWUoKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCQlDb25zdW1lclRocmVhZENvb3JkaW5hdG9yLnRoaXMuZXhjZXB0aW9uSGFuZGxlci5oYW5kbGVFeGNlcHRpb24oZXgpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN1bWVyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgY2xpZW50cyB0aGF0IGNvbnRyb2xzOjx1bD4KLQkgKiA8bGk+d2hlbiB0aGUgY29uc3VtZXIgdGhyZWFkIHN1c3BlbmRzLCB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gY29uc3VtZQotCSAqIDxsaT50aGUgY29uc3VtaW5nIG9mIHdoYXRldmVyIGlzIGJlaW5nIHByb2R1Y2VkCi0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIENvbnN1bWVyIHsKLQkJLyoqCi0JCSAqIFdhaXQgZm9yIHNvbWV0aGluZyB0byBjb25zdW1lLgotCQkgKiBUaHJvdyBhbiB7QGxpbmsgSW50ZXJydXB0ZWRFeGNlcHRpb259IGlmIHRoZSB0aHJlYWQgaXMgaW50ZXJydXB0ZWQuCi0JCSAqLwotCQl2b2lkIHdhaXRGb3JQcm9kdWNlcigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLQotCQkvKioKLQkJICogQ29uc3VtZSB3aGF0ZXZlciBpcyBjdXJyZW50bHkgYXZhaWxhYmxlLgotCQkgKi8KLQkJdm9pZCBjb25zdW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvRmlsZVRvb2xzLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9GaWxlVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlOTNhNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9GaWxlVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLS8qKgotICogQXNzb3J0ZWQgZmlsZSB0b29sczoKLSAqIC0gZGVsZXRlIGVudGlyZSB0cmVlcyBvZiBkaXJlY3RvcmllcyBhbmQgZmlsZXMKLSAqIC0gYnVpbGQgaXRlcmF0b3JzIG9uIGVudGlyZSB0cmVlcyBvZiBkaXJlY3RvcmllcyBhbmQgZmlsZXMKLSAqIC0gYnVpbGQgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5Ci0gKiAtICJjYW5vbml6ZSIgZmlsZXMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZpbGVUb29scyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0hPTUVfRElSRUNUT1JZX05BTUUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9URU1QT1JBUllfRElSRUNUT1JZX05BTUUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX1RFTVBPUkFSWV9ESVJFQ1RPUllfTkFNRSA9ICJ0bXBkaXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSUkVOVF9XT1JLSU5HX0RJUkVDVE9SWV9OQU1FID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogQSBsaXN0IG9mIHNvbWUgaW52YWxpZCBmaWxlIG5hbWUgY2hhcmFjdGVycy4KLQkJCQk6IGlzIHRoZSBmaWxlbmFtZSBzZXBhcmF0b3IgaW4gTWFjT1MgYW5kIHRoZSBkcml2ZSBpbmRpY2F0b3IgaW4gRE9TCi0JCQkJKiBpcyBhIERPUyB3aWxkY2FyZCBjaGFyYWN0ZXIKLQkJCQl8IGlzIGEgRE9TIHJlZGlyZWN0aW9uIGNoYXJhY3RlcgotCQkJCSYgaXMgb3VyIG93biBlc2NhcGUgY2hhcmFjdGVyCi0JCQkJLyBpcyB0aGUgZmlsZW5hbWUgc2VwYXJhdG9yIGluIFVuaXggYW5kIHRoZSBjb21tYW5kIG9wdGlvbiB0YWcgaW4gRE9TCi0JCQkJXCBpcyB0aGUgZmlsZW5hbWUgc2VwYXJhdG9yIGluIERPUy9XaW5kb3dzIGFuZCB0aGUgZXNjYXBlIGNoYXJhY3RlciBpbiBVbml4Ci0JCQkJOyBpcyA/Pz8KLQkJCQk/IGlzIGEgRE9TIHdpbGRjYXJkIGNoYXJhY3RlcgotCQkJCVsgaXMgPz8/Ci0JCQkJXSBpcyA/Pz8KLQkJCQk9IGlzID8/PwotCQkJCSsgaXMgPz8/Ci0JCQkJPCBpcyBhIERPUyByZWRpcmVjdGlvbiBjaGFyYWN0ZXIKLQkJCQk+IGlzIGEgRE9TIHJlZGlyZWN0aW9uIGNoYXJhY3RlcgotCQkJCSIgaXMgdXNlZCBieSBET1MgdG8gZGVsaW1pdCBmaWxlIG5hbWVzIHdpdGggc3BhY2VzCi0JCQkJLCBpcyA/Pz8KLSAgICAgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBJTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMgPSB7ICc6JywgJyonLCAnfCcsICcmJywgJy8nLCAnXFwnLCAnOycsICc/JywgJ1snLCAnXScsICc9JywgJysnLCAnPCcsICc+JywgJyInLCAnLCcgfTsKLQotCS8qKiBUaGlzIGVuY29kZXIgd2lsbCBjb252ZXJ0IHN0cmluZ3MgaW50byB2YWxpZCBmaWxlIG5hbWVzLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU3RyaW5nRW5jb2RlciBGSUxFX05BTUVfRU5DT0RFUiA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKElOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUyk7Ci0KLQkvKiogV2luZG93cyBmaWxlcyB0aGF0IGFyZSByZWRpcmVjdGVkIHRvIGRldmljZXMgZXRjLiAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFdJTkRPV1NfUkVTRVJWRURfRklMRV9OQU1FUyA9IHsKLQkJImNvbiIsCi0JCSJhdXgiLAotCQkiY29tMSIsICJjb20yIiwgImNvbTMiLCAiY29tNCIsICJjb201IiwgImNvbTYiLCAiY29tNyIsICJjb204IiwgImNvbTkiLAotCQkibHB0MSIsICJscHQyIiwgImxwdDMiLCAibHB0NCIsICJscHQ1IiwgImxwdDYiLCAibHB0NyIsICJscHQ4IiwgImxwdDkiLAotCQkicHJuIiwKLQkJIm51bCIKLQl9OwotCi0JLyoqIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIHNob3J0ZW5lZCBmaWxlIG5hbWUuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCA9IDYwOwotCi0KLQkvLyAqKioqKioqKioqIGRlbGV0aW5nIGRpcmVjdG9yaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIERlbGV0ZSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBhbmQgYWxsIG9mIGl0cyBjb250ZW50cy4KLQkgKiA8ZW0+VVNFIFdJVEggQ0FSRS48L2VtPgotCSAqIEZpbGUjZGVsZXRlQWxsKCk/Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURpcmVjdG9yeShTdHJpbmcgZGlyZWN0b3J5TmFtZSkgewotCQlkZWxldGVEaXJlY3RvcnkobmV3IEZpbGUoZGlyZWN0b3J5TmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBEZWxldGUgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgYW5kIGFsbCBvZiBpdHMgY29udGVudHMuCi0JICogPGVtPlVTRSBXSVRIIENBUkUuPC9lbT4KLQkgKiBGaWxlI2RlbGV0ZUFsbCgpPwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEaXJlY3RvcnkoRmlsZSBkaXJlY3RvcnkpIHsKLQkJZGVsZXRlRGlyZWN0b3J5Q29udGVudHMoZGlyZWN0b3J5KTsKLQkJaWYgKCAhIGRpcmVjdG9yeS5kZWxldGUoKSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInVuYWJsZSB0byBkZWxldGUgZGlyZWN0b3J5OiAiICsgZGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCS8qKgotCSAqIERlbGV0ZSB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkKLQkgKiAoYnV0IG5vdCB0aGUgZGlyZWN0b3J5IGl0c2VsZikuCi0JICogPGVtPlVTRSBXSVRIIENBUkUuPC9lbT4KLQkgKiBGaWxlI2RlbGV0ZUZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRGlyZWN0b3J5Q29udGVudHMoU3RyaW5nIGRpcmVjdG9yeU5hbWUpIHsKLQkJZGVsZXRlRGlyZWN0b3J5Q29udGVudHMobmV3IEZpbGUoZGlyZWN0b3J5TmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBEZWxldGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5Ci0JICogKGJ1dCBub3QgdGhlIGRpcmVjdG9yeSBpdHNlbGYpLgotCSAqIDxlbT5VU0UgV0lUSCBDQVJFLjwvZW0+Ci0JICogRmlsZSNkZWxldGVGaWxlcygpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKEZpbGUgZGlyZWN0b3J5KSB7Ci0JCWZvciAoRmlsZSBmaWxlIDogZGlyZWN0b3J5Lmxpc3RGaWxlcygpKSB7Ci0JCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJZGVsZXRlRGlyZWN0b3J5KGZpbGUpOwkvLyByZWN1cnNlIHRocm91Z2ggc3ViZGlyZWN0b3JpZXMKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCAhIGZpbGUuZGVsZXRlKCkpIHsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInVuYWJsZSB0byBkZWxldGUgZmlsZTogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBjb3B5aW5nIGZpbGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvcGllcyB0aGUgY29udGVudCBvZiB0aGUgc291cmNlIGZpbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGZpbGUuCi0JICogRmlsZSNjb3B5KEZpbGUgZGVzdGluYXRpb25GaWxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5VG9GaWxlKEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0aW5hdGlvbkZpbGUpCi0JCXRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJRmlsZUNoYW5uZWwgc291cmNlQ2hhbm5lbCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc291cmNlRmlsZSkuZ2V0Q2hhbm5lbCgpOwotCQlGaWxlQ2hhbm5lbCBkZXN0aW5hdGlvbkNoYW5uZWwgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0aW5hdGlvbkZpbGUpLmdldENoYW5uZWwoKTsKLQkJdHJ5IHsKLQkJCWRlc3RpbmF0aW9uQ2hhbm5lbC50cmFuc2ZlckZyb20oc291cmNlQ2hhbm5lbCwgMCwgc291cmNlQ2hhbm5lbC5zaXplKCkpOwotCQl9IGZpbmFsbHkgewotCQkJc291cmNlQ2hhbm5lbC5jbG9zZSgpOwotCQkJZGVzdGluYXRpb25DaGFubmVsLmNsb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29waWVzIHRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZSB0byBhIGZpbGUgYnkKLQkgKiB0aGUgc2FtZSBuYW1lIGluIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCi0JICogRmlsZSNjb3B5VG9EaXJlY3RvcnkoRmlsZSBkZXN0aW5hdGlvbkRpcmVjdG9yeSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weVRvRGlyZWN0b3J5KEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0aW5hdGlvbkRpcmVjdG9yeSkKLQkJdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQlGaWxlIGRlc3RpbmF0aW9uRmlsZSA9IG5ldyBGaWxlKGRlc3RpbmF0aW9uRGlyZWN0b3J5LCBzb3VyY2VGaWxlLmdldE5hbWUoKSk7Ci0JCWlmICggISBkZXN0aW5hdGlvbkZpbGUuZXhpc3RzKCkgJiYgISBkZXN0aW5hdGlvbkZpbGUuY3JlYXRlTmV3RmlsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY3JlYXRlTmV3RmlsZSgpIGZhaWxlZDogIiArIGRlc3RpbmF0aW9uRmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljb3B5VG9GaWxlKHNvdXJjZUZpbGUsIGRlc3RpbmF0aW9uRmlsZSk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBpdGVyYXRvcmluZyBvdmVyIGZpbGVzIGFuZCBkaXJlY3RvcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIHRoZSBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KLQkgKiBUaGUgaXRlcmF0b3Igd2lsbCBza2lwIG92ZXIgc3ViZGlyZWN0b3JpZXMuCi0JICogRmlsZSNmaWxlcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBmaWxlc0luKFN0cmluZyBkaXJlY3RvcnlOYW1lKSB7Ci0JCXJldHVybiBmaWxlc0luKG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgZmlsZXMgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogVGhlIGl0ZXJhdG9yIHdpbGwgc2tpcCBvdmVyIHN1YmRpcmVjdG9yaWVzLgotCSAqIEZpbGUjZmlsZXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZmlsZXNJbihGaWxlIGRpcmVjdG9yeSkgewotCQlyZXR1cm4gZmlsZXNJbihkaXJlY3RvcnkubGlzdEZpbGVzKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBmaWxlc0luKEZpbGVbXSBmaWxlcykgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEZpbGU+KG5ldyBBcnJheUl0ZXJhdG9yPEZpbGU+KGZpbGVzKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoRmlsZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuaXNGaWxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIHN1YmRpcmVjdG9yaWVzCi0JICogaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogRmlsZSNzdWJEaXJlY3RvcmllcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBkaXJlY3Rvcmllc0luKFN0cmluZyBkaXJlY3RvcnlOYW1lKSB7Ci0JCXJldHVybiBkaXJlY3Rvcmllc0luKG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgc3ViZGlyZWN0b3JpZXMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KLQkgKiBGaWxlI3N1YkRpcmVjdG9yaWVzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzSW4oRmlsZSBkaXJlY3RvcnkpIHsKLQkJcmV0dXJuIGRpcmVjdG9yaWVzSW4oZGlyZWN0b3J5Lmxpc3RGaWxlcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJbihGaWxlW10gZmlsZXMpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxGaWxlPihuZXcgQXJyYXlJdGVyYXRvcjxGaWxlPihmaWxlcykpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEZpbGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmlzRGlyZWN0b3J5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIGZpbGVzIHVuZGVyIHRoZSBzcGVjaWZpZWQKLQkgKiBkaXJlY3RvcnksIHJlY3Vyc2luZyBpbnRvIHN1YmRpcmVjdG9yaWVzLgotCSAqIFRoZSBpdGVyYXRvciB3aWxsIHNraXAgb3ZlciB0aGUgc3ViZGlyZWN0b3JpZXMgdGhlbXNlbHZlcy4KLQkgKiBGaWxlI2ZpbGVzUmVjdXJzZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBmaWxlc0luVHJlZShTdHJpbmcgZGlyZWN0b3J5TmFtZSkgewotCQlyZXR1cm4gZmlsZXNJblRyZWUobmV3IEZpbGUoZGlyZWN0b3J5TmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIHRoZSBmaWxlcyB1bmRlciB0aGUgc3BlY2lmaWVkCi0JICogZGlyZWN0b3J5LCByZWN1cnNpbmcgaW50byBzdWJkaXJlY3Rvcmllcy4KLQkgKiBUaGUgaXRlcmF0b3Igd2lsbCBza2lwIG92ZXIgdGhlIHN1YmRpcmVjdG9yaWVzIHRoZW1zZWx2ZXMuCi0JICogRmlsZSNmaWxlc1JlY3Vyc2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZmlsZXNJblRyZWUoRmlsZSBkaXJlY3RvcnkpIHsKLQkJcmV0dXJuIGZpbGVzSW5UcmVlQXNTZXQoZGlyZWN0b3J5KS5pdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFNldDxGaWxlPiBmaWxlc0luVHJlZUFzU2V0KEZpbGUgZGlyZWN0b3J5KSB7Ci0JCVNldDxGaWxlPiBmaWxlcyA9IG5ldyBIYXNoU2V0PEZpbGU+KDEwMDAwKTsKLQkJYWRkRmlsZXNJblRyZWVUbyhkaXJlY3RvcnksIGZpbGVzKTsKLQkJcmV0dXJuIGZpbGVzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRmlsZXNJblRyZWVUbyhGaWxlIGRpcmVjdG9yeSwgQ29sbGVjdGlvbjxGaWxlPiBhbGxGaWxlcykgewotCQlmb3IgKEZpbGUgZmlsZSA6IGRpcmVjdG9yeS5saXN0RmlsZXMoKSkgewotCQkJaWYgKGZpbGUuaXNGaWxlKCkpIHsKLQkJCQlhbGxGaWxlcy5hZGQoZmlsZSk7Ci0JCQl9IGVsc2UgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCWFkZEZpbGVzSW5UcmVlVG8oZmlsZSwgYWxsRmlsZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgZGlyZWN0b3JpZXMgdW5kZXIgdGhlIHNwZWNpZmllZAotCSAqIGRpcmVjdG9yeSwgcmVjdXJzaW5nIGludG8gc3ViZGlyZWN0b3JpZXMuCi0JICogRmlsZSNzdWJEaXJlY3Rvcmllc1JlY3Vyc2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJblRyZWUoU3RyaW5nIGRpcmVjdG9yeU5hbWUpIHsKLQkJcmV0dXJuIGRpcmVjdG9yaWVzSW5UcmVlKG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgZGlyZWN0b3JpZXMgdW5kZXIgdGhlIHNwZWNpZmllZAotCSAqIGRpcmVjdG9yeSwgcmVjdXJzaW5nIGludG8gc3ViZGlyZWN0b3JpZXMuCi0JICogRmlsZSNzdWJEaXJlY3Rvcmllc1JlY3Vyc2UoKQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJblRyZWUoRmlsZSBkaXJlY3RvcnkpIHsKLQkJRmlsZVtdIGZpbGVzID0gZGlyZWN0b3J5Lmxpc3RGaWxlcygpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEZpbGU+KGRpcmVjdG9yaWVzSW4oZmlsZXMpLCBkaXJlY3Rvcmllc0luVHJlZXMoZGlyZWN0b3JpZXNJbihmaWxlcykpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJblRyZWVzKEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8RmlsZT4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxGaWxlLCBJdGVyYXRvcjxGaWxlPj4oZGlyZWN0b3JpZXMpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8RmlsZT4gdHJhbnNmb3JtKEZpbGUgbmV4dCkgewotCQkJCQlyZXR1cm4gRmlsZVRvb2xzLmRpcmVjdG9yaWVzSW5UcmVlKG5leHQpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIHNob3J0IGZpbGUgbmFtZSBtYW5pcHVsYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyaXAgdGhlIGV4dGVuc2lvbiBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lCi0JICogYW5kIHJldHVybiB0aGUgcmVzdWx0LiBJZiB0aGUgZmlsZSBuYW1lIGhhcyBubwotCSAqIGV4dGVuc2lvbiwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkCi0JICogRmlsZSNiYXNlUGF0aCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBFeHRlbnNpb24oU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIGZpbGVOYW1lOwotCQl9Ci0JCXJldHVybiBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCX0KLQkKLQkvKioKLQkgKiBTdHJpcCB0aGUgZXh0ZW5zaW9uIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlJ3MgbmFtZQotCSAqIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gSWYgdGhlIGZpbGUncyBuYW1lIGhhcyBubwotCSAqIGV4dGVuc2lvbiwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkCi0JICogRmlsZSNiYXNlUGF0aCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBFeHRlbnNpb24oRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBzdHJpcEV4dGVuc2lvbihmaWxlLmdldFBhdGgoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBleHRlbnNpb24sIGluY2x1ZGluZyB0aGUgZG90LCBvZiB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZS4KLQkgKiBJZiB0aGUgZmlsZSBuYW1lIGhhcyBubyBleHRlbnNpb24sIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuCi0JICogRmlsZSNleHRlbnNpb24oKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVuc2lvbihTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaW50IGluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZmlsZU5hbWUuc3Vic3RyaW5nKGluZGV4KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBleHRlbnNpb24sIGluY2x1ZGluZyB0aGUgZG90LCBvZiB0aGUgc3BlY2lmaWVkIGZpbGUncyBuYW1lLgotCSAqIElmIHRoZSBmaWxlJ3MgbmFtZSBoYXMgbm8gZXh0ZW5zaW9uLCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgotCSAqIEZpbGUjZXh0ZW5zaW9uKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlbnNpb24oRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBleHRlbnNpb24oZmlsZS5nZXRQYXRoKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0ZW1wb3JhcnkgZGlyZWN0b3JpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhbiBlbXB0eSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdpdGggdGhlIHNwZWNpZmllZAotCSAqIG5hbWUuIElmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgY2xlYXJlZCBvdXQuCi0JICogVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgSmF2YSB0ZW1wb3JhcnkgZGlyZWN0b3J5LAotCSAqIGFzIGluZGljYXRlZCBieSB0aGUgU3lzdGVtIHByb3BlcnR5ICJqYXZhLmlvLnRtcGRpciIuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGVtcHR5VGVtcG9yYXJ5RGlyZWN0b3J5KFN0cmluZyBuYW1lKSB7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUodXNlclRlbXBvcmFyeURpcmVjdG9yeSgpLCBuYW1lKTsKLQkJaWYgKGRpci5leGlzdHMoKSkgewotCQkJZGVsZXRlRGlyZWN0b3J5Q29udGVudHMoZGlyKTsKLQkJfSBlbHNlIHsKLQkJCW1rZGlycyhkaXIpOwotCQl9Ci0JCXJldHVybiBkaXI7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBta2RpcnMoRmlsZSBkaXIpIHsKLQkJaWYgKCAhIGRpci5ta2RpcnMoKSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm1rZGlycygpIGZhaWxlZDogIiArIGRpcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGFuIGVtcHR5IHRlbXBvcmFyeSBkaXJlY3Rvcnkgd2l0aCBhCi0JICogbmFtZSBvZiAidG1wZGlyIi4gSWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSBjbGVhcmVkIG91dC4KLQkgKiBUaGlzIGRpcmVjdG9yeSB3aWxsIGJlIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBKYXZhIHRlbXBvcmFyeSBkaXJlY3RvcnksCi0JICogYXMgaW5kaWNhdGVkIGJ5IHRoZSBTeXN0ZW0gcHJvcGVydHkgImphdmEuaW8udG1wZGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgZW1wdHlUZW1wb3JhcnlEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBlbXB0eVRlbXBvcmFyeURpcmVjdG9yeShERUZBVUxUX1RFTVBPUkFSWV9ESVJFQ1RPUllfTkFNRSk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdpdGggdGhlIHNwZWNpZmllZAotCSAqIG5hbWUuIElmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgbGVmdCB1bmNoYW5nZWQ7Ci0JICogaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLgotCSAqIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIEphdmEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwKLQkgKiBhcyBpbmRpY2F0ZWQgYnkgdGhlIFN5c3RlbSBwcm9wZXJ0eSAiamF2YS5pby50bXBkaXIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSB0ZW1wb3JhcnlEaXJlY3RvcnkoU3RyaW5nIG5hbWUpIHsKLQkJRmlsZSBkaXIgPSBuZXcgRmlsZSh1c2VyVGVtcG9yYXJ5RGlyZWN0b3J5KCksIG5hbWUpOwotCQlpZiAoICEgZGlyLmV4aXN0cygpKSB7Ci0JCQlta2RpcnMoZGlyKTsKLQkJfQotCQlyZXR1cm4gZGlyOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIGEgbmFtZSBvZgotCSAqICJ0bXBkaXIiLiBJZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIGxlZnQgdW5jaGFuZ2VkOwotCSAqIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC4KLQkgKiBUaGlzIGRpcmVjdG9yeSB3aWxsIGJlIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBKYXZhIHRlbXBvcmFyeSBkaXJlY3RvcnksCi0JICogYXMgaW5kaWNhdGVkIGJ5IHRoZSBTeXN0ZW0gcHJvcGVydHkgImphdmEuaW8udG1wZGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgdGVtcG9yYXJ5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gdGVtcG9yYXJ5RGlyZWN0b3J5KERFRkFVTFRfVEVNUE9SQVJZX0RJUkVDVE9SWV9OQU1FKTsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhICpuZXcqIHRlbXBvcmFyeSBkaXJlY3Rvcnkgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogcHJlZml4LiBUaGUgcHJlZml4IHdpbGwgYmUgYXBwZW5kZWQgd2l0aCBhIG51bWJlciB0aGF0Ci0JICogaXMgaW5jcmVtZW50ZWQsIHN0YXJ0aW5nIHdpdGggMSwgdW50aWwgYSBub24tcHJlLWV4aXN0aW5nIGRpcmVjdG9yeQotCSAqIGlzIGZvdW5kIGFuZCBzdWNjZXNzZnVsbHkgY3JlYXRlZC4gVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBhCi0JICogc3ViZGlyZWN0b3J5IG9mIHRoZSBKYXZhIHRlbXBvcmFyeSBkaXJlY3RvcnksIGFzIGluZGljYXRlZCBieQotCSAqIHRoZSBTeXN0ZW0gcHJvcGVydHkgImphdmEuaW8udG1wZGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgbmV3VGVtcG9yYXJ5RGlyZWN0b3J5KFN0cmluZyBwcmVmaXgpIHsKLQkJaWYgKCAhIHByZWZpeC5lbmRzV2l0aCgiLiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXByZWZpeCA9IHByZWZpeCArICcuJzsKLQkJfQotCQlGaWxlIGRpcjsKLQkJaW50IGkgPSAwOwotCQlkbyB7Ci0JCQlpKys7Ci0JCQlkaXIgPSBuZXcgRmlsZSh1c2VyVGVtcG9yYXJ5RGlyZWN0b3J5KCksIHByZWZpeCArIGkpOwotCQl9IHdoaWxlICggISBkaXIubWtkaXJzKCkpOwotCQlyZXR1cm4gZGlyOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgKm5ldyogdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIGEKLQkgKiBwcmVmaXggb2YgInRtcGRpciIuIFRoaXMgcHJlZml4IHdpbGwgYmUgYXBwZW5kZWQgd2l0aCBhIG51bWJlciB0aGF0Ci0JICogaXMgaW5jcmVtZW50ZWQsIHN0YXJ0aW5nIHdpdGggMSwgdW50aWwgYSBub24tcHJlLWV4aXN0aW5nIGRpcmVjdG9yeQotCSAqIGlzIGZvdW5kIGFuZCBzdWNjZXNzZnVsbHkgY3JlYXRlZC4gVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBhCi0JICogc3ViZGlyZWN0b3J5IG9mIHRoZSBKYXZhIHRlbXBvcmFyeSBkaXJlY3RvcnksIGFzIGluZGljYXRlZCBieQotCSAqIHRoZSBTeXN0ZW0gcHJvcGVydHkgImphdmEuaW8udG1wZGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgbmV3VGVtcG9yYXJ5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gbmV3VGVtcG9yYXJ5RGlyZWN0b3J5KERFRkFVTFRfVEVNUE9SQVJZX0RJUkVDVE9SWV9OQU1FKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIGZpbGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgotCSAqIFRoZSByZXNvdXJjZSBuYW1lIG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLCBpLmUuIGl0IGNhbm5vdCBiZSByZWxhdGl2ZQotCSAqIHRvIHRoZSBwYWNrYWdlIG5hbWUvZGlyZWN0b3J5LgotCSAqIE5COiBUaGVyZSBpcyBhIGJ1ZyBpbiBqZGsxLjQueCB0aGUgcHJldmVudHMgdXMgZnJvbSBnZXR0aW5nCi0JICogYSByZXNvdXJjZSB0aGF0IGhhcyBzcGFjZXMgKG9yIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycykgaW4KLQkgKiBpdHMgbmFtZS4uLi4gKHNlZSBTdW4ncyBKYXZhIGJ1ZyA0NDY2NDg1KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSByZXNvdXJjZUZpbGUoU3RyaW5nIHJlc291cmNlTmFtZSkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7Ci0JCWlmICggISByZXNvdXJjZU5hbWUuc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24ocmVzb3VyY2VOYW1lKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VGaWxlKHJlc291cmNlTmFtZSwgRmlsZVRvb2xzLmNsYXNzKTsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhIGZpbGUgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCi0JICogTkI6IFRoZXJlIGlzIGEgYnVnIGluIGpkazEuNC54IHRoZSBwcmV2ZW50cyB1cyBmcm9tIGdldHRpbmcKLQkgKiBhIHJlc291cmNlIHRoYXQgaGFzIHNwYWNlcyAob3Igb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzKSBpbgotCSAqIGl0cyBuYW1lLi4uLiAoc2VlIFN1bidzIEphdmEgYnVnIDQ0NjY0ODUpCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIHJlc291cmNlRmlsZShTdHJpbmcgcmVzb3VyY2VOYW1lLCBDbGFzczw/PiBqYXZhQ2xhc3MpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQlVUkwgdXJsID0gamF2YUNsYXNzLmdldFJlc291cmNlKHJlc291cmNlTmFtZSk7Ci0JCXJldHVybiBidWlsZEZpbGUodXJsKTsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhIGZpbGUgZm9yIHRoZSBzcGVjaWZpZWQgVVJMLgotCSAqIE5COiBUaGVyZSBpcyBhIGJ1ZyBpbiBqZGsxLjQueCB0aGUgcHJldmVudHMgdXMgZnJvbSBnZXR0aW5nCi0JICogYSByZXNvdXJjZSB0aGF0IGhhcyBzcGFjZXMgKG9yIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycykgaW4KLQkgKiBpdHMgbmFtZS4uLi4gKHNlZSBTdW4ncyBKYXZhIGJ1ZyA0NDY2NDg1KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBidWlsZEZpbGUoVVJMIHVybCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBidWlsZEZpbGUodXJsLmdldEZpbGUoKSk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZS4KLQkgKiBOQjogVGhlcmUgaXMgYSBidWcgaW4gamRrMS40LnggdGhlIHByZXZlbnRzIHVzIGZyb20gZ2V0dGluZwotCSAqIGEgcmVzb3VyY2UgdGhhdCBoYXMgc3BhY2VzIChvciBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMpIGluCi0JICogaXRzIG5hbWUuLi4uIChzZWUgU3VuJ3MgSmF2YSBidWcgNDQ2NjQ4NSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgYnVpbGRGaWxlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7Ci0JCVVSSSB1cmkgPSBuZXcgVVJJKGZpbGVOYW1lKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJpLmdldFBhdGgoKSk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogImNhbm9uaWNhbCIgZmlsZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGZpbGUgaW50byBhICJjYW5vbmljYWwiIGZpbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNhbm9uaWNhbEZpbGUoRmlsZSBmaWxlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZXhjZXB0aW9uKSB7Ci0JCQkvLyBzZXR0bGUgZm9yIHRoZSBhYnNvbHV0ZSBmaWxlCi0JCQlyZXR1cm4gZmlsZS5nZXRBYnNvbHV0ZUZpbGUoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbiBpdGVyYXRvciB0aGF0IHdpbGwgY29udmVydCB0aGUgc3BlY2lmaWVkIGZpbGVzCi0JICogaW50byAiY2Fub25pY2FsIiBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGNhbm9uaWNhbEZpbGVzKEl0ZXJhdG9yPEZpbGU+IGZpbGVzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxGaWxlLCBGaWxlPihmaWxlcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRmlsZSB0cmFuc2Zvcm0oRmlsZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIGNhbm9uaWNhbEZpbGUobmV4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuIGl0ZXJhdG9yIHRoYXQgd2lsbCBjb252ZXJ0IHRoZSBzcGVjaWZpZWQgZmlsZXMKLQkgKiBpbnRvICJjYW5vbmljYWwiIGZpbGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gY2Fub25pY2FsRmlsZXMoQ29sbGVjdGlvbjxGaWxlPiBmaWxlcykgewotCQlyZXR1cm4gY2Fub25pY2FsRmlsZXMoZmlsZXMuaXRlcmF0b3IoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgaW50byBhICJjYW5vbmljYWwiIGZpbGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5vbmljYWxGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJcmV0dXJuIGNhbm9uaWNhbEZpbGUobmV3IEZpbGUoZmlsZU5hbWUpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW4gaXRlcmF0b3IgdGhhdCB3aWxsIGNvbnZlcnQgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWVzCi0JICogaW50byAiY2Fub25pY2FsIiBmaWxlIG5hbWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8U3RyaW5nPiBjYW5vbmljYWxGaWxlTmFtZXMoSXRlcmF0b3I8U3RyaW5nPiBmaWxlTmFtZXMpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgU3RyaW5nPihmaWxlTmFtZXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQlyZXR1cm4gY2Fub25pY2FsRmlsZU5hbWUobmV4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuIGl0ZXJhdG9yIHRoYXQgd2lsbCBjb252ZXJ0IHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lcwotCSAqIGludG8gImNhbm9uaWNhbCIgZmlsZSBuYW1lcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gY2Fub25pY2FsRmlsZU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBmaWxlTmFtZXMpIHsKLQkJcmV0dXJuIGNhbm9uaWNhbEZpbGVOYW1lcyhmaWxlTmFtZXMuaXRlcmF0b3IoKSk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBmaWxlIG5hbWUgdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZSBpcyBpbnZhbGlkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmaWxlTmFtZUlzSW52YWxpZChTdHJpbmcgZmlsZW5hbWUpIHsKLQkJcmV0dXJuICEgZmlsZU5hbWVJc1ZhbGlkKGZpbGVuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZSBpcyB2YWxpZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZU5hbWVJc1ZhbGlkKFN0cmluZyBmaWxlbmFtZSkgewotCQlpbnQgbGVuID0gZmlsZW5hbWUubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgZmlsZW5hbWVDaGFyID0gZmlsZW5hbWUuY2hhckF0KGkpOwotCQkJaWYgKEFycmF5VG9vbHMuY29udGFpbnMoSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTLCBmaWxlbmFtZUNoYXIpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIGlsbGVnYWwgY2hhcmFjdGVycyBpbiB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZSB0bwotCSAqIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9WYWxpZEZpbGVOYW1lKFN0cmluZyBmaWxlbmFtZSwgY2hhciByZXBsYWNlbWVudENoYXIpIHsKLQkJaW50IGxlbiA9IGZpbGVuYW1lLmxlbmd0aCgpOwotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobGVuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBmaWxlbmFtZUNoYXIgPSBmaWxlbmFtZS5jaGFyQXQoaSk7Ci0JCQlpZiAoQXJyYXlUb29scy5jb250YWlucyhJTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMsIGZpbGVuYW1lQ2hhcikpIHsKLQkJCQlzYi5hcHBlbmQocmVwbGFjZW1lbnRDaGFyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2IuYXBwZW5kKGZpbGVuYW1lQ2hhcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgaWxsZWdhbCBjaGFyYWN0ZXJzIGluIHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lIHRvCi0JICogcGVyaW9kcyAoJy4nKSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvVmFsaWRGaWxlTmFtZShTdHJpbmcgZmlsZW5hbWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb1ZhbGlkRmlsZU5hbWUoZmlsZW5hbWUsICcuJyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgaXMgInJlc2VydmVkIgotCSAqIChpLmUuIGl0IGNhbm5vdCBiZSB1c2VkIGZvciAidXNlciIgZmlsZXMpLiBXaW5kb3dzIHJlc2VydmVzCi0JICogYSBudW1iZXIgb2YgZmlsZSBuYW1lcyAoZS5nLiBDT04sIEFVWCwgUFJOKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZU5hbWVJc1Jlc2VydmVkKFN0cmluZyBmaWxlTmFtZSkgewotCQkvLyBVbml4L0xpbnV4IGRvZXMgbm90IGhhdmUgYW55ICJyZXNlcnZlZCIgZmlsZSBuYW1lcyAoSSB0aGluay4uLikKLQkJcmV0dXJuIFRvb2xzLm9zSXNXaW5kb3dzKCkgJiYgQXJyYXlUb29scy5jb250YWlucyhXSU5ET1dTX1JFU0VSVkVEX0ZJTEVfTkFNRVMsIGZpbGVOYW1lLnRvTG93ZXJDYXNlKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmlsZSBjb250YWlucyBhbnkgInJlc2VydmVkIgotCSAqIGNvbXBvbmVudHMuCi0JICogV2luZG93cyByZXNlcnZlcyBhIG51bWJlciBvZiBmaWxlIG5hbWVzIChlLmcuIENPTiwgQVVYLCBQUk4pOwotCSAqIGFuZCB0aGVzZSBmaWxlIG5hbWVzIGNhbm5vdCBiZSB1c2VkIGZvciBlaXRoZXIgdGhlIG5hbWVzIG9mCi0JICogZmlsZXMgb3IgZGlyZWN0b3JpZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMoRmlsZSBmaWxlKSB7Ci0JCUZpbGUgdGVtcCA9IGZpbGU7Ci0JCXdoaWxlICh0ZW1wICE9IG51bGwpIHsKLQkJCWlmIChmaWxlTmFtZUlzUmVzZXJ2ZWQodGVtcC5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQl0ZW1wID0gdGVtcC5nZXRQYXJlbnRGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzaG9ydGVuZWQgZmlsZSBuYW1lcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBzaG9ydGVyIHZlcnNpb24gb2YgdGhlIGFic29sdXRlIGZpbGUgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlLgotCSAqIFRoZSBzaG9ydGVyIHZlcnNpb24gd2lsbCBub3QgYmUgbG9uZ2VyIHRoYW4gdGhlIG1heGltdW0gbGVuZ3RoLgotCSAqIFRoZSBmaXJzdCBkaXJlY3RvcnkgKHVzdWFsbHkgdGhlIGRyaXZlIGxldHRlcikgYW5kIHRoZSBmaWxlIG5hbWUgb3IgdGhlCi0JICogbGFzdCBkaXJlY3Rvcnkgd2lsbCBhbHdheXMgYmUgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZCBzdHJpbmcgcmVnYXJkbGVzcyBvZgotCSAqIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0ZW5GaWxlTmFtZShVUkwgdXJsKSB7Ci0JCXJldHVybiBzaG9ydGVuRmlsZU5hbWUodXJsLCBNQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzaG9ydGVyIHZlcnNpb24gb2YgdGhlIGFic29sdXRlIGZpbGUgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlLgotCSAqIFRoZSBzaG9ydGVyIHZlcnNpb24gd2lsbCBub3QgYmUgbG9uZ2VyIHRoYW4gdGhlIG1heGltdW0gbGVuZ3RoLgotCSAqIFRoZSBmaXJzdCBkaXJlY3RvcnkgKHVzdWFsbHkgdGhlIGRyaXZlIGxldHRlcikgYW5kIHRoZSBmaWxlIG5hbWUgb3IgdGhlCi0JICogbGFzdCBkaXJlY3Rvcnkgd2lsbCBhbHdheXMgYmUgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZCBzdHJpbmcgcmVnYXJkbGVzcyBvZgotCSAqIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0ZW5GaWxlTmFtZShVUkwgdXJsLCBpbnQgbWF4TGVuZ3RoKSB7Ci0JCUZpbGUgZmlsZTsKLQkJdHJ5IHsKLQkJCWZpbGUgPSBidWlsZEZpbGUodXJsKTsKLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCWZpbGUgPSBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKTsKLQkJfQotCQlyZXR1cm4gc2hvcnRlbkZpbGVOYW1lKGZpbGUsIG1heExlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2hvcnRlciB2ZXJzaW9uIG9mIHRoZSBhYnNvbHV0ZSBmaWxlIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZS4KLQkgKiBUaGUgc2hvcnRlciB2ZXJzaW9uIHdpbGwgbm90IGJlIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxlbmd0aC4KLQkgKiBUaGUgZmlyc3QgZGlyZWN0b3J5ICh1c3VhbGx5IHRoZSBkcml2ZSBsZXR0ZXIpIGFuZCB0aGUgZmlsZSBuYW1lIG9yIHRoZQotCSAqIGxhc3QgZGlyZWN0b3J5IHdpbGwgYWx3YXlzIGJlIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQgc3RyaW5nIHJlZ2FyZGxlc3Mgb2YKLQkgKiB0aGUgbWF4aW11bSBsZW5ndGggYWxsb3dlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydGVuRmlsZU5hbWUoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBzaG9ydGVuRmlsZU5hbWUoZmlsZSwgTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2hvcnRlciB2ZXJzaW9uIG9mIHRoZSBhYnNvbHV0ZSBmaWxlIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZS4KLQkgKiBUaGUgc2hvcnRlciB2ZXJzaW9uIHdpbGwgbm90IGJlIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxlbmd0aC4KLQkgKiBUaGUgZmlyc3QgZGlyZWN0b3J5ICh1c3VhbGx5IHRoZSBkcml2ZSBsZXR0ZXIpIGFuZCB0aGUgZmlsZSBuYW1lIG9yIHRoZQotCSAqIGxhc3QgZGlyZWN0b3J5IHdpbGwgYWx3YXlzIGJlIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQgc3RyaW5nIHJlZ2FyZGxlc3Mgb2YKLQkgKiB0aGUgbWF4aW11bSBsZW5ndGggYWxsb3dlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydGVuRmlsZU5hbWUoRmlsZSBmaWxlLCBpbnQgbWF4TGVuZ3RoKSB7Ci0JCVN0cmluZyBhYnNvbHV0ZUZpbGVOYW1lID0gY2Fub25pY2FsRmlsZShmaWxlKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJaWYgKGFic29sdXRlRmlsZU5hbWUubGVuZ3RoKCkgPD0gbWF4TGVuZ3RoKSB7Ci0JCQkvLyBubyBuZWVkIHRvIHNob3J0ZW4KLQkJCXJldHVybiBhYnNvbHV0ZUZpbGVOYW1lOwotCQl9Ci0KLQkJLy8gYnJlYWsgZG93biB0aGUgcGF0aCBpbnRvIGl0cyBjb21wb25lbnRzCi0JCVN0cmluZyBmcyA9IEZpbGUuc2VwYXJhdG9yOwotCQlTdHJpbmdbXSBwYXRocyA9IGFic29sdXRlRmlsZU5hbWUuc3BsaXQoJ1xcJyArIGZzKTsKLQotCQlpZiAocGF0aHMubGVuZ3RoIDw9IDEpIHsKLQkJCS8vIGUuZy4gIkM6XCIKLQkJCXJldHVybiBwYXRoc1swXTsKLQkJfQotCi0JCWlmIChwYXRocy5sZW5ndGggPT0gMikgewotCQkJLy8gZS5nLiAiQzpcTXlSZWFsbHlMb25nRmlsZU5hbWUuZXh0IiBvciAiQzpcTXlSZWFsbHlMb25nRGlyZWN0b3J5TmFtZSIKLQkJCS8vIHJldHVybiB0aGUgY29tcGxldGUgZmlsZSBuYW1lIHNpbmNlIHRoaXMgaXMgYSBtaW5pbXVtIHJlcXVpcmVtZW50LAotCQkJLy8gcmVnYXJkbGVzcyBvZiB0aGUgbWF4aW11bSBsZW5ndGggYWxsb3dlZAotCQkJcmV0dXJuIGFic29sdXRlRmlsZU5hbWU7Ci0JCX0KLQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJc2IuYXBwZW5kKHBhdGhzWzBdKTsJCS8vIGFsd2F5cyBhZGQgdGhlIGZpcnN0IGRpcmVjdG9yeSwgd2hpY2ggaXMgdXN1YWxseSB0aGUgZHJpdmUgbGV0dGVyCi0KLQkJLy8gS2VlcCB0aGUgaW5kZXggb2YgaW5zZXJ0aW9uIGludG8gdGhlIHN0cmluZyBidWZmZXIKLQkJaW50IGluc2VydEluZGV4ID0gc2IubGVuZ3RoKCk7Ci0KLQkJc2IuYXBwZW5kKGZzKTsKLQkJc2IuYXBwZW5kKHBhdGhzW3BhdGhzLmxlbmd0aCAtIDFdKTsJCS8vIGFwcGVuZCB0aGUgZmlsZSBuYW1lIG9yIHRoZSBsYXN0IGRpcmVjdG9yeQotCi0JCW1heExlbmd0aCAtPSA0OyAgICAgICAgICAgICAgICAgICAgICAvLyAtNCBmb3IgIi8uLi4iCi0KLQkJaW50IGN1cnJlbnRMZW5ndGggPSBzYi5sZW5ndGgoKSAtIDQ7IC8vIC00IGZvciAiLy4uLiIKLQkJaW50IGxlZnRJbmRleCA9IDE7ICAgICAgICAgICAgICAgICAgIC8vICAxIHRvIHNraXAgdGhlIHJvb3QgZGlyZWN0b3J5Ci0JCWludCByaWdodEluZGV4ID0gcGF0aHMubGVuZ3RoIC0gMjsgICAvLyAtMSBmb3IgdGhlIGZpbGUgbmFtZSBvciB0aGUgbGFzdCBkaXJlY3RvcnkKLQotCQlib29sZWFuIGNhbkFkZEZyb21MZWZ0ID0gdHJ1ZTsKLQkJYm9vbGVhbiBjYW5BZGRGcm9tUmlnaHQgPSB0cnVlOwotCi0JCS8vIEFkZCBlYWNoIGRpcmVjdG9yeSwgdGhlIGluc2VydGlvbiBpcyBnb2luZyBpbiBib3RoIGRpcmVjdGlvbjogbGVmdCBhbmQKLQkJLy8gcmlnaHQsIG9uY2UgYSBzaWRlIGNhbid0IGJlIGFkZGVkLCB0aGUgb3RoZXIgc2lkZSBpcyBzdGlsbCBjb250aW51aW5nCi0JCS8vIHVudGlsIGJvdGggY2FuJ3QgYWRkIGFueW1vcmUKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmICghY2FuQWRkRnJvbUxlZnQgJiYgIWNhbkFkZEZyb21SaWdodCkKLQkJCQlicmVhazsKLQotCQkJaWYgKGNhbkFkZEZyb21SaWdodCkgewotCQkJCVN0cmluZyByaWdodERpcmVjdG9yeSA9IHBhdGhzW3JpZ2h0SW5kZXhdOwotCQkJCWludCByaWdodExlbmd0aCA9IHJpZ2h0RGlyZWN0b3J5Lmxlbmd0aCgpOwotCi0JCQkJLy8gQWRkIHRoZSBkaXJlY3Rvcnkgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGxvb3AKLQkJCQlpZiAoY3VycmVudExlbmd0aCArIHJpZ2h0TGVuZ3RoICsgMSA8PSBtYXhMZW5ndGgpIHsKLQkJCQkJc2IuaW5zZXJ0KGluc2VydEluZGV4LCAgICAgZnMpOwotCQkJCQlzYi5pbnNlcnQoaW5zZXJ0SW5kZXggKyAxLCByaWdodERpcmVjdG9yeSk7Ci0KLQkJCQkJY3VycmVudExlbmd0aCArPSByaWdodExlbmd0aCArIDE7Ci0JCQkJCXJpZ2h0SW5kZXgtLTsKLQotCQkJCQkvLyBUaGUgcmlnaHQgc2lkZSBpcyBub3cgb3ZlcmxhcHBpbmcgdGhlIGxlZnQgc2lkZSwgdGhhdCBtZWFucwotCQkJCQkvLyB3ZSBjYW4ndCBhZGQgZnJvbSB0aGUgcmlnaHQgc2lkZSBhbnltb3JlCi0JCQkJCWlmIChsZWZ0SW5kZXggPj0gcmlnaHRJbmRleCkgewotCQkJCQkJY2FuQWRkRnJvbVJpZ2h0ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQljYW5BZGRGcm9tUmlnaHQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChjYW5BZGRGcm9tTGVmdCkgewotCQkJCVN0cmluZyBsZWZ0RGlyZWN0b3J5ID0gcGF0aHNbbGVmdEluZGV4XTsKLQkJCQlpbnQgbGVmdExlbmd0aCA9IGxlZnREaXJlY3RvcnkubGVuZ3RoKCk7Ci0KLQkJCQkvLyBBZGQgdGhlIGRpcmVjdG9yeSBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBsb29wCi0JCQkJaWYgKGN1cnJlbnRMZW5ndGggKyBsZWZ0TGVuZ3RoICsgMSA8PSBtYXhMZW5ndGgpIHsKLQkJCQkJc2IuaW5zZXJ0KGluc2VydEluZGV4LCAgICAgZnMpOwotCQkJCQlzYi5pbnNlcnQoaW5zZXJ0SW5kZXggKyAxLCBsZWZ0RGlyZWN0b3J5KTsKLQotCQkJCQlpbnNlcnRJbmRleCArPSBsZWZ0TGVuZ3RoICsgMTsKLQkJCQkJY3VycmVudExlbmd0aCArPSBsZWZ0TGVuZ3RoICsgMTsKLQkJCQkJbGVmdEluZGV4Kys7Ci0KLQkJCQkJLy8gVGhlIGxlZnQgc2lkZSBpcyBub3cgb3ZlcmxhcHBpbmcgdGhlIHJpZ2h0IHNpZGUsIHRoYXQgbWVhbnMKLQkJCQkJLy8gd2UgY2FuJ3QgYWRkIGZyb20gdGhlIGxlZnQgc2lkZSBhbnltb3JlCi0JCQkJCWlmIChsZWZ0SW5kZXggPj0gcmlnaHRJbmRleCkgewotCQkJCQkJY2FuQWRkRnJvbUxlZnQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWNhbkFkZEZyb21MZWZ0ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGxlZnRJbmRleCA8PSByaWdodEluZGV4KSB7Ci0JCQlzYi5pbnNlcnQoaW5zZXJ0SW5kZXgsIGZzKTsKLQkJCXNiLmluc2VydChpbnNlcnRJbmRleCArIDEsICIuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5c3RlbSBwcm9wZXJ0aWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGZpbGUgcmVwcmVzZW50aW5nIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIHVzZXJIb21lRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEZpbGUoVVNFUl9IT01FX0RJUkVDVE9SWV9OQU1FKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSByZXByZXNlbnRpbmcgdGhlIHVzZXIncyB0ZW1wb3JhcnkgZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSB1c2VyVGVtcG9yYXJ5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEZpbGUoVVNFUl9URU1QT1JBUllfRElSRUNUT1JZX05BTUUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY3VycmVudFdvcmtpbmdEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRmlsZShDVVJSRU5UX1dPUktJTkdfRElSRUNUT1JZX05BTUUpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogbWlzY2VsbGFuZW91cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gb25seSB0aGUgZmlsZXMgdGhhdCBmaXQgdGhlIGZpbHRlci4KLQkgKiBGaWxlI2ZpbGVzKEZpbGVGaWx0ZXIgZmlsZUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGZpbHRlcihJdGVyYXRvcjxGaWxlPiBmaWxlcywgZmluYWwgRmlsZUZpbHRlciBmaWxlRmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8RmlsZT4oZmlsZXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEZpbGUgbmV4dCkgewotCQkJCXJldHVybiBmaWxlRmlsdGVyLmFjY2VwdChuZXh0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHRoYXQgaXMgYSByZS1zcGVjaWZpY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlLCByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KLQkgKiAgICAgTGludXgvVW5peC9NYWM6Ci0JICogICAgICAgICBjb252ZXJ0VG9SZWxhdGl2ZUZpbGUoL2Zvby9iYXIvYmF6LmphdmEsIC9mb28pCi0JICogICAgICAgICAgICAgPT4gYmFyL2Jhei5qYXZhCi0JICogICAgIFdpbmRvd3M6Ci0JICogICAgICAgICBjb252ZXJ0VG9SZWxhdGl2ZUZpbGUoQzpcZm9vXGJhclxiYXouamF2YSwgQzpcZm9vKQotCSAqICAgICAgICAgICAgID0+IGJhci9iYXouamF2YQotCSAqIFRoZSBmaWxlIGNhbiBiZSBlaXRoZXIgYSBmaWxlIG9yIGEgZGlyZWN0b3J5OyB0aGUgZGlyZWN0b3J5Ci0JICogKnNob3VsZCogYmUgYSBkaXJlY3RvcnkuCi0JICogSWYgdGhlIGZpbGUgaXMgYWxyZWFkeSByZWxhdGl2ZSBvciBpdCBjYW5ub3QgYmUgbWFkZSByZWxhdGl2ZQotCSAqIHRvIHRoZSBkaXJlY3RvcnksIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIAotCSAqIE5COiBUaGlzIG1ldGhvZCBoYXMgYmVlbiB0ZXN0ZWQgb24gV2luZG93cyBhbmQgTGludXgsCi0JICogYnV0IG5vdCBNYWMgKGJ1dCB0aGUgTWFjIGlzIFVuaXgtYmFzZWQgdGhlc2UgZGF5cywgc28KLQkgKiBpdCBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtLi4uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbmFsIEZpbGUgZmlsZSwgZmluYWwgRmlsZSBkaXIpIHsKLQkJLy8gY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcyBhbHJlYWR5IHJlbGF0aXZlCi0JCWlmICggISBmaWxlLmlzQWJzb2x1dGUoKSkgewotCQkJcmV0dXJuIGZpbGU7CQkvLyByZXR1cm4gdW5jaGFuZ2VkCi0JCX0KLQotCQlGaWxlIGNGaWxlID0gY2Fub25pY2FsRmlsZShmaWxlKTsKLQkJRmlsZSBjRGlyID0gY2Fub25pY2FsRmlsZShkaXIpOwotCi0JCS8vIHRoZSB0d28gYXJlIHRoZSBzYW1lIGRpcmVjdG9yeQotCQlpZiAoY0ZpbGUuZXF1YWxzKGNEaXIpKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbGUoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJRmlsZVtdIGZpbGVQYXRoRmlsZXMgPSBwYXRoRmlsZXMoY0ZpbGUpOwotCQlGaWxlW10gZGlyUGF0aEZpbGVzID0gcGF0aEZpbGVzKGNEaXIpOwotCi0JCS8vIFdpbmRvd3Mgb25seSAoPyk6IHRoZSByb290cyBhcmUgZGlmZmVyZW50IC0gZS5nLiBEOlwgdnMuIEM6XAotCQlpZiAoICEgZGlyUGF0aEZpbGVzWzBdLmVxdWFscyhmaWxlUGF0aEZpbGVzWzBdKSkgewotCQkJcmV0dXJuIGZpbGU7CQkvLyByZXR1cm4gdW5jaGFuZ2VkCi0JCX0KLQotCQkvLyBhdCB0aGlzIHBvaW50IHdlIGtub3cgdGhlIHJvb3QgaXMgdGhlIHNhbWUsIG5vdyBmaW5kIGhvdyBtdWNoIGlzIGluIGNvbW1vbgotCQlpbnQgaSA9IDA7CQkvLyB0aGlzIHdpbGwgcG9pbnQgYXQgdGhlIGZpcnN0IG1pc2NvbXBhcmUKLQkJd2hpbGUgKChpIDwgZGlyUGF0aEZpbGVzLmxlbmd0aCkgJiYgKGkgPCBmaWxlUGF0aEZpbGVzLmxlbmd0aCkpIHsKLQkJCWlmIChkaXJQYXRoRmlsZXNbaV0uZXF1YWxzKGZpbGVQYXRoRmlsZXNbaV0pKSB7Ci0JCQkJaSsrOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkvLyBzYXZlIG91ciBjdXJyZW50IHBvc2l0aW9uCi0JCWludCBmaXJzdE1pc21hdGNoID0gaTsKLQotCQkvLyBjaGVjayB3aGV0aGVyIHRoZSBmaWxlIGlzIEFCT1ZFIHRoZSBkaXJlY3Rvcnk6IC4uLy4uCi0JCWlmIChmaXJzdE1pc21hdGNoID09IGZpbGVQYXRoRmlsZXMubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gcmVsYXRpdmVQYXJlbnRGaWxlKGRpclBhdGhGaWxlcy5sZW5ndGggLSBmaXJzdE1pc21hdGNoKTsKLQkJfQotCi0JCS8vIGJ1aWxkIGEgbmV3IGZpbGUgZnJvbSB0aGUgcGF0aCBiZXlvbmQgdGhlIG1hdGNoaW5nIHBvcnRpb25zCi0JCUZpbGUgZGlmZiA9IG5ldyBGaWxlKGZpbGVQYXRoRmlsZXNbaV0uZ2V0TmFtZSgpKTsKLQkJd2hpbGUgKCsraSA8IGZpbGVQYXRoRmlsZXMubGVuZ3RoKSB7Ci0JCQlkaWZmID0gbmV3IEZpbGUoZGlmZiwgZmlsZVBhdGhGaWxlc1tpXS5nZXROYW1lKCkpOwotCQl9Ci0KLQkJLy8gY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcyBCRUxPVyB0aGUgZGlyZWN0b3J5OiBzdWJkaXIxL3N1YmRpcjIvZmlsZS5leHQKLQkJaWYgKGZpcnN0TWlzbWF0Y2ggPT0gZGlyUGF0aEZpbGVzLmxlbmd0aCkgewotCQkJcmV0dXJuIGRpZmY7Ci0JCX0KLQotCQkvLyB0aGUgZmlsZSBtdXN0IGJlIGEgUEVFUiBvZiB0aGUgZGlyZWN0b3J5OiAuLi8uLi9zdWJkaXIxL3N1YmRpcjIvZmlsZS5leHQKLQkJcmV0dXJuIG5ldyBGaWxlKHJlbGF0aXZlUGFyZW50RmlsZShkaXJQYXRoRmlsZXMubGVuZ3RoIC0gZmlyc3RNaXNtYXRjaCksIGRpZmYuZ2V0UGF0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHRoYXQgaXMgYSByZS1zcGVjaWZpY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlLCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KLQkgKiAgICAgTGludXgvVW5peC9NYWMgKENXRCA9IC9mb28pOgotCSAqICAgICAgICAgY29udmVydFRvUmVsYXRpdmVGaWxlKC9mb28vYmFyL2Jhei5qYXZhKQotCSAqICAgICAgICAgICAgID0+IGJhci9iYXouamF2YQotCSAqICAgICBXaW5kb3dzIChDV0QgPSBDOlxmb28pOgotCSAqICAgICAgICAgY29udmVydFRvUmVsYXRpdmVGaWxlKEM6XGZvb1xiYXJcYmF6LmphdmEpCi0JICogICAgICAgICAgICAgPT4gYmFyL2Jhei5qYXZhCi0JICogVGhlIGZpbGUgY2FuIGJlIGVpdGhlciBhIGZpbGUgb3IgYSBkaXJlY3RvcnkuCi0JICogSWYgdGhlIGZpbGUgaXMgYWxyZWFkeSByZWxhdGl2ZSBvciBpdCBjYW5ub3QgYmUgbWFkZSByZWxhdGl2ZQotCSAqIHRvIHRoZSBkaXJlY3RvcnksIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIAotCSAqIE5COiBUaGlzIG1ldGhvZCBoYXMgYmVlbiB0ZXN0ZWQgb24gV2luZG93cyBhbmQgTGludXgsCi0JICogYnV0IG5vdCBNYWMgKGJ1dCB0aGUgTWFjIGlzIFVuaXgtYmFzZWQgdGhlc2UgZGF5cywgc28KLQkgKiBpdCBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtLi4uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbmFsIEZpbGUgZmlsZSkgewotCQlyZXR1cm4gY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGN1cnJlbnRXb3JraW5nRGlyZWN0b3J5KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBmaWxlcyByZXByZXNlbnRpbmcgdGhlIHBhdGggdG8gdGhlIHNwZWNpZmllZAotCSAqIGZpbGUuIEZvciBleGFtcGxlOgotCSAqICAgICBDOi9mb28vYmFyL2Jhei50eHQgPT4KLQkgKiAgICAgeyBDOi8sIEM6L2ZvbywgQzovZm9vL2JhciwgQzovZm9vL2Jhci9iYXoudHh0IH0KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBGaWxlW10gcGF0aEZpbGVzKEZpbGUgZmlsZSkgewotCQlMaXN0PEZpbGU+IHBhdGggPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0JCWZvciAoRmlsZSBmID0gZmlsZTsgZiAhPSBudWxsOyBmID0gZi5nZXRQYXJlbnRGaWxlKCkpIHsKLQkJCXBhdGguYWRkKGYpOwotCQl9Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UocGF0aCk7Ci0JCXJldHVybiBwYXRoLnRvQXJyYXkobmV3IEZpbGVbcGF0aC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCAobm9uLXplcm8pIG51bWJlciBvZiByZWxhdGl2ZQotCSAqIGZpbGUgbmFtZXMsIGUuZy4geHh4KDMpID0+IC4uLy4uLy4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSByZWxhdGl2ZVBhcmVudEZpbGUoaW50IGxlbikgewotCQlpZiAobGVuIDw9IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvOiAiICsgbGVuKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUZpbGUgcmVzdWx0ID0gbmV3IEZpbGUoIi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IGxlbiAtIDE7IGktLSA+IDA7ICkgewotCQkJcmVzdWx0ID0gbmV3IEZpbGUocmVzdWx0LCAiLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSB0aGF0IGlzIGEgcmUtc3BlY2lmaWNhdGlvbiBvZiB0aGUgc3BlY2lmaWVkCi0JICogZmlsZSwgYWJzb2x1dGUgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogICAgIExpbnV4L1VuaXgvTWFjOgotCSAqICAgICAgICAgY29udmVydFRvQWJzb2x1dGVGaWxlKGJhci9iYXouamF2YSwgL2ZvbykKLQkgKiAgICAgICAgICAgICA9PiAvZm9vL2Jhci9iYXouamF2YQotCSAqICAgICBXaW5kb3dzOgotCSAqICAgICAgICAgY29udmVydFRvQWJzb2x1dGVGaWxlKGJhci9iYXouamF2YSwgQzpcZm9vKQotCSAqICAgICAgICAgICAgID0+IEM6XGZvb1xiYXJcYmF6LmphdmEKLQkgKiBUaGUgZmlsZSBjYW4gYmUgZWl0aGVyIGEgZmlsZSBvciBhIGRpcmVjdG9yeTsgdGhlIGRpcmVjdG9yeQotCSAqICpzaG91bGQqIGJlIGEgZGlyZWN0b3J5LgotCSAqIElmIHRoZSBmaWxlIGlzIGFscmVhZHkgYWJzb2x1dGUsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIAotCSAqIE5COiBUaGlzIG1ldGhvZCBoYXMgYmVlbiB0ZXN0ZWQgb24gV2luZG93cyBhbmQgTGludXgsCi0JICogYnV0IG5vdCBNYWMgKGJ1dCB0aGUgTWFjIGlzIFVuaXgtYmFzZWQgdGhlc2UgZGF5cywgc28KLQkgKiBpdCBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtLi4uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbmFsIEZpbGUgZmlsZSwgZmluYWwgRmlsZSBkaXIpIHsKLQkJLy8gY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcyBhbHJlYWR5IGFic29sdXRlCi0JCWlmIChmaWxlLmlzQWJzb2x1dGUoKSkgewotCQkJcmV0dXJuIGZpbGU7CQkvLyByZXR1cm4gdW5jaGFuZ2VkCi0JCX0KLQkJcmV0dXJuIGNhbm9uaWNhbEZpbGUobmV3IEZpbGUoZGlyLCBmaWxlLmdldFBhdGgoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGZpbGUgdGhhdCBpcyBhIHJlLXNwZWNpZmljYXRpb24gb2YgdGhlIHNwZWNpZmllZAotCSAqIGZpbGUsIGFic29sdXRlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgotCSAqICAgICBMaW51eC9Vbml4L01hYyAoQ1dEID0gL2Zvbyk6Ci0JICogICAgICAgICBjb252ZXJ0VG9BYnNvbHV0ZUZpbGUoYmFyL2Jhei5qYXZhKQotCSAqICAgICAgICAgICAgID0+IC9mb28vYmFyL2Jhei5qYXZhCi0JICogICAgIFdpbmRvd3MgKENXRCA9IEM6XGZvbyk6Ci0JICogICAgICAgICBjb252ZXJ0VG9BYnNvbHV0ZUZpbGUoYmFyL2Jhei5qYXZhKQotCSAqICAgICAgICAgICAgID0+IEM6XGZvb1xiYXJcYmF6LmphdmEKLQkgKiBUaGUgZmlsZSBjYW4gYmUgZWl0aGVyIGEgZmlsZSBvciBhIGRpcmVjdG9yeS4KLQkgKiBJZiB0aGUgZmlsZSBpcyBhbHJlYWR5IGFic29sdXRlLCBpdCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiAKLQkgKiBOQjogVGhpcyBtZXRob2QgaGFzIGJlZW4gdGVzdGVkIG9uIFdpbmRvd3MgYW5kIExpbnV4LAotCSAqIGJ1dCBub3QgTWFjIChidXQgdGhlIE1hYyBpcyBVbml4LWJhc2VkIHRoZXNlIGRheXMsIHNvCi0JICogaXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4uLikuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb0Fic29sdXRlRmlsZShmaW5hbCBGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBjdXJyZW50V29ya2luZ0RpcmVjdG9yeSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEZpbGVUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9GaWx0ZXJBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9GaWx0ZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNDUxNWQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvRmlsdGVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotCi0vKioKLSAqIENvbnZlbmllbmNlIGZpbHRlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGFjY2VwdHMgZXZlcnl0aGluZy4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyLlRyYW5zcGFyZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJBZGFwdGVyPFQ+Ci0JaW1wbGVtZW50cyBGaWx0ZXI8VD4KLXsKLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoVCBvKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0ZsYWdnZWRPYmplY3RSZWZlcmVuY2UuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0ZsYWdnZWRPYmplY3RSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkMDZjNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9GbGFnZ2VkT2JqZWN0UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBQcm92aWRlIGEgY29udGFpbmVyIGZvciBwYXNzaW5nIGFuIG9iamVjdCB0aGF0IGNhbiBiZSBjaGFuZ2VkIGJ5IHRoZQotICogcmVjaXBpZW50LiBJZiB0aGUgdmFsdWUgaXMgc2V0IGF0IGFueSB0aW1lIGFmdGVyIGNvbnN0cnVjdGlvbiBvZiB0aGUKLSAqIHJlZmVyZW5jZSwgdGhlIHJlZmVyZW5jZSBpcyBtYXJrZWQgInNldCIuIFRoaXMgYWxsb3dzIHRoZSBjbGllbnQgdG8KLSAqIGRldGVjdCB3aGV0aGVyIHRoZSBzZXJ2ZXIvcmVjaXBpZW50IGV2ZXIgc2V0IHRoZSB2YWx1ZSwgZXZlbiBpZiBpdCByZW1haW5zCi0gKiB1bmNoYW5nZWQuIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIHRoZSB2YWx1ZSBjYW4gYmUgc2V0IHRvCi0gKiA8Y29kZT5udWxsPC9jb2RlPi4KLSAqIDxwPgotICogVGhlIHJlZmVyZW5jZSBjYW4gYmUgc2V0IG11bHRpcGxlIHRpbWVzLCBidXQgaXQgY2FuCi0gKiBuZXZlciBiZSAidW5zZXQiIG9uY2UgaXQgaXMgInNldCIuCi0gKi8KLXB1YmxpYyBjbGFzcyBGbGFnZ2VkT2JqZWN0UmVmZXJlbmNlPFY+Ci0JZXh0ZW5kcyBTaW1wbGVPYmplY3RSZWZlcmVuY2U8Vj4KLXsKLQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gc2V0ID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ3JlYXRlIGFuIG9iamVjdCByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgdmFsdWUuCi0JICovCi0JcHVibGljIEZsYWdnZWRPYmplY3RSZWZlcmVuY2UoViB2YWx1ZSkgewotCQlzdXBlcih2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIG9iamVjdCByZWZlcmVuY2Ugd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIEZsYWdnZWRPYmplY3RSZWZlcmVuY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNldCAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1NldCgpIHsKLQkJcmV0dXJuIHRoaXMuc2V0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFYgc2V0VmFsdWUoViB2YWx1ZSkgewotCQl0aGlzLnNldCA9IHRydWU7Ci0JCXJldHVybiBzdXBlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIHMgPSBzdXBlci50b1N0cmluZygpOwotCQlyZXR1cm4gKHRoaXMuc2V0KSA/ICcqJyArIHMgOiBzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0hhc2hCYWcuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0hhc2hCYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4OTJiYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9IYXNoQmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHtAbGluayBCYWd9IGludGVyZmFjZSwgYmFja2VkIGJ5IGEKLSAqIGhhc2ggdGFibGUuIEl0IG1ha2VzIG5vIGd1YXJhbnRlZXMgYXMgdG8gdGhlIGl0ZXJhdGlvbiBvcmRlciBvZgotICogdGhlIGJhZydzIGVsZW1lbnRzOyBpbiBwYXJ0aWN1bGFyLCBpdCBkb2VzIG5vdCBndWFyYW50ZWUgdGhlIG9yZGVyCi0gKiB3aWxsIHJlbWFpbiBjb25zdGFudCBvdmVyIHRpbWUuIFRoaXMgY2xhc3MgcGVybWl0cyB0aGUgPGNvZGU+bnVsbDwvY29kZT4KLSAqIGVsZW1lbnQuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgb2ZmZXJzIGNvbnN0YW50IHRpbWUgcGVyZm9ybWFuY2UgZm9yIHRoZSBiYXNpYyBvcGVyYXRpb25zCi0gKiAoPGNvZGU+YWRkPC9jb2RlPiwgPGNvZGU+cmVtb3ZlPC9jb2RlPiwgPGNvZGU+Y29udGFpbnM8L2NvZGU+IGFuZAotICogPGNvZGU+c2l6ZTwvY29kZT4pLCBhc3N1bWluZyB0aGUgaGFzaCBmdW5jdGlvbiBkaXNwZXJzZXMgdGhlIGVsZW1lbnRzCi0gKiBwcm9wZXJseSBhbW9uZyB0aGUgYnVja2V0cy4gSXRlcmF0aW5nIG92ZXIgdGhpcyBiYWcgcmVxdWlyZXMgdGltZQotICogcHJvcG9ydGlvbmFsIHRvIHRoZSBzdW0gb2YgdGhlIGJhZydzIHNpemUgKHRoZSBudW1iZXIgb2YgZWxlbWVudHMpIHBsdXMgdGhlCi0gKiAiY2FwYWNpdHkiIG9mIHRoZSBiYWNraW5nIGhhc2ggdGFibGUgKHRoZSBudW1iZXIgb2YgYnVja2V0cykuIFRodXMsIGl0IGlzCi0gKiBpbXBvcnRhbnQgbm90IHRvIHNldCB0aGUgaW5pdGlhbCBjYXBhY2l0eSB0b28gaGlnaCAob3IgdGhlIGxvYWQgZmFjdG9yIHRvbwotICogbG93KSBpZiBpdGVyYXRpb24gcGVyZm9ybWFuY2UgaXMgaW1wb3J0YW50LgotICogPHA+Ci0gKiA8c3Ryb25nPk5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCBzeW5jaHJvbml6ZWQuPC9zdHJvbmc+IElmIG11bHRpcGxlCi0gKiB0aHJlYWRzIGFjY2VzcyBhIGJhZyBjb25jdXJyZW50bHksIGFuZCBhdCBsZWFzdCBvbmUgb2YgdGhlIHRocmVhZHMgbW9kaWZpZXMKLSAqIHRoZSBiYWcsIGl0IDxlbT5tdXN0PC9lbT4gYmUgc3luY2hyb25pemVkIGV4dGVybmFsbHkuIFRoaXMgaXMgdHlwaWNhbGx5Ci0gKiBhY2NvbXBsaXNoZWQgYnkgc3luY2hyb25pemluZyBvbiBzb21lIG9iamVjdCB0aGF0IG5hdHVyYWxseSBlbmNhcHN1bGF0ZXMKLSAqIHRoZSBiYWcuIElmIG5vIHN1Y2ggb2JqZWN0IGV4aXN0cywgdGhlIGJhZyBzaG91bGQgYmUgIndyYXBwZWQiIHVzaW5nIHRoZQotICogPGNvZGU+Q29sbGVjdGlvbnMuc3luY2hyb25pemVkQ29sbGVjdGlvbjwvY29kZT4gbWV0aG9kLiBUaGlzIGlzCi0gKiBiZXN0IGRvbmUgYXQgY3JlYXRpb24gdGltZSwgdG8gcHJldmVudCBhY2NpZGVudGFsIHVuc3luY2hyb25pemVkIGFjY2VzcwotICogdG8gdGhlIGJhZzoKLSAqIDxwcmU+Ci0gKiBDb2xsZWN0aW9uIGMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRDb2xsZWN0aW9uKG5ldyBIYXNoQmFnKC4uLikpOwotICogPC9wcmU+Ci0gKiA8cD4KLSAqIFRoZSBpdGVyYXRvcnMgcmV0dXJuZWQgYnkgdGhpcyBjbGFzcydzIDxjb2RlPml0ZXJhdG9yPC9jb2RlPiBtZXRob2QgYXJlCi0gKiA8ZW0+ZmFpbC1mYXN0PC9lbT46IGlmIHRoZSBiYWcgaXMgbW9kaWZpZWQgYXQgYW55IHRpbWUgYWZ0ZXIgdGhlIGl0ZXJhdG9yIGlzCi0gKiBjcmVhdGVkLCBpbiBhbnkgd2F5IGV4Y2VwdCB0aHJvdWdoIHRoZSBpdGVyYXRvcidzIG93biA8Y29kZT5yZW1vdmU8L2NvZGU+Ci0gKiBtZXRob2QsIHRoZSBpdGVyYXRvciB0aHJvd3MgYSB7QGxpbmsgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbn0uCi0gKiBUaHVzLCBpbiB0aGUgZmFjZSBvZiBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiwgdGhlIGl0ZXJhdG9yIGZhaWxzIHF1aWNrbHkKLSAqIGFuZCBjbGVhbmx5LCByYXRoZXIgdGhhbiByaXNraW5nIGFyYml0cmFyeSwgbm9uLWRldGVybWluaXN0aWMgYmVoYXZpb3IgYXQKLSAqIGFuIHVuZGV0ZXJtaW5lZCB0aW1lIGluIHRoZSBmdXR1cmUuCi0gKiA8cD4KLSAqIE5vdGUgdGhhdCB0aGUgZmFpbC1mYXN0IGJlaGF2aW9yIG9mIGFuIGl0ZXJhdG9yIGNhbm5vdCBiZSBndWFyYW50ZWVkCi0gKiBhcyBpdCBpcywgZ2VuZXJhbGx5IHNwZWFraW5nLCBpbXBvc3NpYmxlIHRvIG1ha2UgYW55IGhhcmQgZ3VhcmFudGVlcyBpbiB0aGUKLSAqIHByZXNlbmNlIG9mIHVuc3luY2hyb25pemVkIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uLiBGYWlsLWZhc3QgaXRlcmF0b3JzCi0gKiB0aHJvdyA8Y29kZT5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uPC9jb2RlPiBvbiBhIGJlc3QtZWZmb3J0IGJhc2lzLgotICogVGhlcmVmb3JlLCBpdCB3b3VsZCBiZSB3cm9uZyB0byB3cml0ZSBhIHByb2dyYW0gdGhhdCBkZXBlbmRlZCBvbiB0aGlzCi0gKiBleGNlcHRpb24gZm9yIGl0cyBjb3JyZWN0bmVzczogPGVtPnRoZSBmYWlsLWZhc3QgYmVoYXZpb3Igb2YgaXRlcmF0b3JzCi0gKiBzaG91bGQgYmUgdXNlZCBvbmx5IHRvIGRldGVjdCBidWdzLjwvZW0+Ci0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgbWFpbnRhaW5lZCBieSB0aGUgYmFnCi0gKiAKLSAqIEBzZWUgQ29sbGVjdGlvbgotICogQHNlZSBCYWcKLSAqIEBzZWUgU3luY2hyb25pemVkQmFnCi0gKiBAc2VlCWphdmEudXRpbC5Db2xsZWN0aW9ucyNzeW5jaHJvbml6ZWRDb2xsZWN0aW9uKENvbGxlY3Rpb24pCi0gKiBAc2VlIElkZW50aXR5SGFzaEJhZwotICovCi1wdWJsaWMgY2xhc3MgSGFzaEJhZzxFPgotCWV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uPEU+Ci0JaW1wbGVtZW50cyBCYWc8RT4sIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIFRoZSBoYXNoIHRhYmxlLiBSZXNpemVkIGFzIG5lY2Vzc2FyeS4gTGVuZ3RoIE1VU1QgQWx3YXlzIGJlIGEgcG93ZXIgb2YgdHdvLiAqLwotCXRyYW5zaWVudCBFbnRyeTxFPltdIHRhYmxlOwotCi0JLyoqIFRoZSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgYmFnLiAqLwotCXRyYW5zaWVudCBpbnQgc2l6ZSA9IDA7Ci0KLQkvKiogVGhlIG51bWJlciBvZiBVTklRVUUgZW50cmllcyBpbiB0aGUgYmFnLiAqLwotCXRyYW5zaWVudCBpbnQgdW5pcXVlQ291bnQgPSAwOwotCi0JLyoqCi0JICogVGhlIGhhc2ggdGFibGUgaXMgcmVoYXNoZWQgd2hlbiBpdHMgc2l6ZSBleGNlZWRzIHRoaXMgdGhyZXNob2xkLiAoVGhlCi0JICogdmFsdWUgb2YgdGhpcyBmaWVsZCBpcyA8Y29kZT4oaW50KSAoY2FwYWNpdHkgKiBsb2FkRmFjdG9yKTwvY29kZT4uKQotCSAqCi0JICogQHNlcmlhbCBzaXplIHRocmVzaG9sZAotCSAqLwotCXByaXZhdGUgaW50IHRocmVzaG9sZDsKLQotCS8qKgotCSAqIFRoZSBsb2FkIGZhY3RvciBmb3IgdGhlIGhhc2ggdGFibGUuCi0JICoKLQkgKiBAc2VyaWFsIGxvYWQgZmFjdG9yCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBmbG9hdCBsb2FkRmFjdG9yOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGJhZyBoYXMgYmVlbiBzdHJ1Y3R1cmFsbHkgbW9kaWZpZWQuCi0JICogU3RydWN0dXJhbCBtb2RpZmljYXRpb25zIGFyZSB0aG9zZSB0aGF0IGNoYW5nZSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4KLQkgKiB0aGUgYmFnIG9yIG90aGVyd2lzZSBtb2RpZnkgaXRzIGludGVybmFsIHN0cnVjdHVyZSAoZS5nLiByZWhhc2gpLgotCSAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byBtYWtlIGl0ZXJhdG9ycyBvbiB0aGlzIGJhZyBmYWlsLWZhc3QuCi0JICoKLQkgKiBAc2VlIGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uCi0JICovCi0JdHJhbnNpZW50IGludCBtb2RDb3VudCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpbml0aWFsIGNhcGFjaXR5IC0gTVVTVCBiZSBhIHBvd2VyIG9mIHR3by4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9JTklUSUFMX0NBUEFDSVRZID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgbWF4aW11bSBjYXBhY2l0eSwgdXNlZCBpZiBhIGhpZ2hlciB2YWx1ZSBpcyBpbXBsaWNpdGx5IHNwZWNpZmllZAotCSAqIGJ5IGVpdGhlciBvZiB0aGUgY29uc3RydWN0b3JzIHdpdGggYXJndW1lbnRzLgotCSAqIE1VU1QgYmUgYSBwb3dlciBvZiB0d28gPD0gKDEgPDwgMzApLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhJTVVNX0NBUEFDSVRZID0gMSA8PCAzMDsKLQotCS8qKgotCSAqIFRoZSBsb2FkIGZhY3RvciB1c2VkIHdoZW4gbm9uZSBzcGVjaWZpZWQgaW4gY29uc3RydWN0b3IuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9MT0FEX0ZBQ1RPUiA9IDAuNzVmOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBiYWcgd2l0aCB0aGUKLQkgKiBkZWZhdWx0IGNhcGFjaXR5LCB3aGljaCBpcyAxNiwgYW5kIGxvYWQgZmFjdG9yLCB3aGljaCBpcyAwLjc1LgotCSAqLwotCXB1YmxpYyBIYXNoQmFnKCkgewotCQl0aGlzKERFRkFVTFRfSU5JVElBTF9DQVBBQ0lUWSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBiYWcgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkKLQkgKiBhbmQgdGhlIGRlZmF1bHQgbG9hZCBmYWN0b3IsIHdoaWNoIGlzIDAuNzUuCi0JICoKLQkgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IHRoZSBpbml0aWFsIGNhcGFjaXR5Ci0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMgbGVzcwotCSAqICAgICB0aGFuIHplcm8KLQkgKi8KLQlwdWJsaWMgSGFzaEJhZyhpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0JCXRoaXMoaW5pdGlhbENhcGFjaXR5LCBERUZBVUxUX0xPQURfRkFDVE9SLCBmYWxzZSk7ICAvLyBmYWxzZSA9IGRvIG5vdCB2YWxpZGF0ZSBwYXJtcwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldywgZW1wdHkgYmFnIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkgYW5kIGxvYWQgZmFjdG9yLgotCSAqCi0JICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgaW5pdGlhbCBjYXBhY2l0eQotCSAqIEBwYXJhbSBsb2FkRmFjdG9yIHRoZSBsb2FkIGZhY3RvcgotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsIGNhcGFjaXR5IGlzIGxlc3MKLQkgKiAgICAgdGhhbiB6ZXJvIG9yIGlmIHRoZSBsb2FkIGZhY3RvciBpcyBub24tcG9zaXRpdmUKLQkgKi8KLQlwdWJsaWMgSGFzaEJhZyhpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7Ci0JCXRoaXMoaW5pdGlhbENhcGFjaXR5LCBsb2FkRmFjdG9yLCB0cnVlKTsgIC8vIHRydWUgPSB2YWxpZGF0ZSBwYXJtcwotCX0KLQotCXByaXZhdGUgSGFzaEJhZyhpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yLCBib29sZWFuIHZhbGlkYXRlUGFybXMpIHsKLQkJc3VwZXIoKTsKLQkJaW50IGNhcGFjaXR5ID0gaW5pdGlhbENhcGFjaXR5OwotCQlpZiAodmFsaWRhdGVQYXJtcykgewotCQkJaWYgKGNhcGFjaXR5IDwgMCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgSW5pdGlhbCBDYXBhY2l0eTogIiArIGNhcGFjaXR5KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGNhcGFjaXR5ID4gTUFYSU1VTV9DQVBBQ0lUWSkgewotCQkJCWNhcGFjaXR5ID0gTUFYSU1VTV9DQVBBQ0lUWTsKLQkJCX0KLQkJCWlmIChsb2FkRmFjdG9yIDw9IDAgfHwgRmxvYXQuaXNOYU4obG9hZEZhY3RvcikpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIExvYWQgZmFjdG9yOiAiICsgbG9hZEZhY3Rvcik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkKLQkJCS8vIGZpbmQgYSBwb3dlciBvZiAyID49ICdpbml0aWFsQ2FwYWNpdHknCi0JCQljYXBhY2l0eSA9IDE7Ci0JCQl3aGlsZSAoY2FwYWNpdHkgPCBpbml0aWFsQ2FwYWNpdHkpIHsKLQkJCQljYXBhY2l0eSA8PD0gMTsKLQkJCX0KLQkJfQotCi0JCXRoaXMubG9hZEZhY3RvciA9IGxvYWRGYWN0b3I7Ci0JCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUoY2FwYWNpdHkpOwotCQl0aGlzLnRocmVzaG9sZCA9IChpbnQpIChjYXBhY2l0eSAqIGxvYWRGYWN0b3IpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBiYWcgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGNvbGxlY3Rpb24uIFRoZSBiYWcncyBsb2FkIGZhY3RvciB3aWxsIGJlIHRoZSBkZWZhdWx0LCB3aGljaCBpcyAwLjc1LAotCSAqIGFuZCBpdHMgaW5pdGlhbCBjYXBhY2l0eSB3aWxsIGJlIHN1ZmZpY2llbnQgdG8gaG9sZCBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjIHRoZSBjb2xsZWN0aW9uIHdob3NlIGVsZW1lbnRzIGFyZSB0byBiZSBwbGFjZWQgaW50byB0aGlzIGJhZy4KLQkgKi8KLQlwdWJsaWMgSGFzaEJhZyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXRoaXMoTWF0aC5tYXgoKGludCkgKGMuc2l6ZSgpIC8gREVGQVVMVF9MT0FEX0ZBQ1RPUikgKyAxLCBERUZBVUxUX0lOSVRJQUxfQ0FQQUNJVFkpLCBERUZBVUxUX0xPQURfRkFDVE9SKTsKLQkJdGhpcy5hZGRBbGxfKGMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGhhc2ggZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqLwotCXByaXZhdGUgaW50IGhhc2goT2JqZWN0IG8pIHsKLQkJcmV0dXJuIChvID09IG51bGwpID8gMCA6IHRoaXMudHdlYWtIYXNoKG8uaGFzaENvZGUoKSk7Ci0JfQotCi0JLyoqCi0JICogVHdlYWsgdGhlIHNwZWNpZmllZCBoYXNoLCB0byBkZWZlbmQgYWdhaW5zdCBwb29yIGltcGxlbWVudGF0aW9ucwotCSAqIG9mIHtAbGluayBPYmplY3QjaGFzaENvZGUoKX0uCi0JICovCi0JcHJpdmF0ZSBpbnQgdHdlYWtIYXNoKGludCBoKSB7Ci0JCWggXj0gKGggPj4+IDIwKSBeIChoID4+PiAxMik7Ci0JCXJldHVybiBoIF4gKGggPj4+IDcpIF4gKGggPj4+IDQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggZm9yIHRoZSBzcGVjaWZpZWQgaGFzaC4KLQkgKi8KLQlwcml2YXRlIGludCBpbmRleChpbnQgaGFzaCkgewotCQlyZXR1cm4gdGhpcy5pbmRleChoYXNoLCB0aGlzLnRhYmxlLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBmb3IgdGhlIHNwZWNpZmllZCBoYXNoCi0JICogd2l0aGluIGEgdGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlpbnQgaW5kZXgoaW50IGhhc2gsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIGhhc2ggJiAobGVuZ3RoIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwge0BsaW5rICNhZGRBbGwoQ29sbGVjdGlvbil9IGZvciBjb25zdHJ1Y3Rpb24gYW5kIGNsb25pbmcuCi0JICogKE5vIGNoZWNrIGZvciByZS1oYXNoOyBubyBjaGFuZ2UgdG8gbW9kIGNvdW50OyBubyByZXR1cm4gdmFsdWUuKQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRBbGxfKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCWZvciAoRSBlIDogYykgewotCQkJdGhpcy5hZGRfKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwge0BsaW5rICNhZGQoT2JqZWN0KX0gZm9yIGNvbnN0cnVjdGlvbiBhbmQgY2xvbmluZy4KLQkgKiAoTm8gY2hlY2sgZm9yIHJlLWhhc2g7IG5vIGNoYW5nZSB0byBtb2QgY291bnQ7IG5vIHJldHVybiB2YWx1ZS4pCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZF8oRSBvKSB7Ci0JCXRoaXMuYWRkXyhvLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCB7QGxpbmsgI2FkZChPYmplY3QsIGludCl9IGZvciBjb25zdHJ1Y3Rpb24sIGNsb25pbmcsIGFuZCBzZXJpYWxpemF0aW9uLgotCSAqIChObyBjaGVjayBmb3IgcmUtaGFzaDsgbm8gY2hhbmdlIHRvIG1vZCBjb3VudDsgbm8gcmV0dXJuIHZhbHVlLikKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkXyhFIG8sIGludCBjbnQpIHsKLQkJaW50IGhhc2ggPSB0aGlzLmhhc2gobyk7Ci0JCWludCBpbmRleCA9IHRoaXMuaW5kZXgoaGFzaCk7Ci0JCWZvciAoRW50cnk8RT4gZSA9IHRoaXMudGFibGVbaW5kZXhdOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCU9iamVjdCBlbzsKLQkJCWlmICgoZS5oYXNoID09IGhhc2gpICYmICgoKGVvID0gZS5vYmplY3QpID09IG8pIHx8ICgobyAhPSBudWxsKSAmJiBvLmVxdWFscyhlbykpKSkgewotCQkJCWUuY291bnQgKz0gY250OwotCQkJCXRoaXMuc2l6ZSArPSBjbnQ7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLy8gY3JlYXRlIHRoZSBuZXcgZW50cnkgYW5kIHB1dCBpdCBpbiB0aGUgdGFibGUKLQkJRW50cnk8RT4gZSA9IHRoaXMuYnVpbGRFbnRyeShoYXNoLCBvLCBjbnQsIHRoaXMudGFibGVbaW5kZXhdKTsKLQkJdGhpcy50YWJsZVtpbmRleF0gPSBlOwotCQl0aGlzLnNpemUgKz0gY250OwotCQl0aGlzLnVuaXF1ZUNvdW50Kys7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyB0aGUgbWFpbnRhaW5lZCBzaXplLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNpbXBseSBjb21wYXJlcyB0aGUgbWFpbnRhaW5lZCBzaXplIHRvIHplcm8uCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZSA9PSAwOwotCX0KLQotCS8qKgotCSAqIFNlYXJjaCBmb3IgdGhlIG9iamVjdCdzIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JcHJpdmF0ZSBFbnRyeTxFPiBnZXRFbnRyeShPYmplY3QgbykgewotCQlpbnQgaGFzaCA9IHRoaXMuaGFzaChvKTsKLQkJZm9yIChFbnRyeTxFPiBlID0gdGhpcy50YWJsZVt0aGlzLmluZGV4KGhhc2gpXTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQlPYmplY3QgZW87Ci0JCQlpZiAoKGUuaGFzaCA9PSBoYXNoKSAmJiAoKChlbyA9IGUub2JqZWN0KSA9PSBvKSB8fCAoKG8gIT0gbnVsbCkgJiYgby5lcXVhbHMoZW8pKSkpIHsKLQkJCQlyZXR1cm4gZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5nZXRFbnRyeShvKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgY291bnQoT2JqZWN0IG8pIHsKLQkJRW50cnk8RT4gZSA9IHRoaXMuZ2V0RW50cnkobyk7Ci0JCXJldHVybiAoZSA9PSBudWxsKSA/IDAgOiBlLmNvdW50OwotCX0KLQotCS8qKgotCSAqIFJlaGFzaCB0aGUgY29udGVudHMgb2YgdGhlIGJhZyBpbnRvIGEgbmV3IGhhc2ggdGFibGUKLQkgKiB3aXRoIGEgbGFyZ2VyIGNhcGFjaXR5LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUKLQkgKiBudW1iZXIgb2YgZGlmZmVyZW50IGVsZW1lbnRzIGluIHRoZSBiYWcgZXhjZWVkcyBpdHMKLQkgKiBjYXBhY2l0eSBhbmQgbG9hZCBmYWN0b3IuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlaGFzaCgpIHsKLQkJRW50cnk8RT5bXSBvbGRUYWJsZSA9IHRoaXMudGFibGU7Ci0JCWludCBvbGRDYXBhY2l0eSA9IG9sZFRhYmxlLmxlbmd0aDsKLQotCQlpZiAob2xkQ2FwYWNpdHkgPT0gTUFYSU1VTV9DQVBBQ0lUWSkgewotCQkJdGhpcy50aHJlc2hvbGQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBuZXdDYXBhY2l0eSA9IDIgKiBvbGRDYXBhY2l0eTsKLQkJRW50cnk8RT5bXSBuZXdUYWJsZSA9IHRoaXMuYnVpbGRUYWJsZShuZXdDYXBhY2l0eSk7Ci0KLQkJZm9yIChpbnQgaSA9IG9sZENhcGFjaXR5OyBpLS0gPiAwOyApIHsKLQkJCWZvciAoRW50cnk8RT4gb2xkID0gb2xkVGFibGVbaV07IG9sZCAhPSBudWxsOyApIHsKLQkJCQlFbnRyeTxFPiBlID0gb2xkOwotCQkJCW9sZCA9IG9sZC5uZXh0OwotCi0JCQkJaW50IGluZGV4ID0gdGhpcy5pbmRleChlLmhhc2gsIG5ld0NhcGFjaXR5KTsKLQkJCQllLm5leHQgPSBuZXdUYWJsZVtpbmRleF07Ci0JCQkJbmV3VGFibGVbaW5kZXhdID0gZTsKLQkJCX0KLQkJfQotCi0JCXRoaXMudGFibGUgPSBuZXdUYWJsZTsKLQkJdGhpcy50aHJlc2hvbGQgPSAoaW50KSAobmV3Q2FwYWNpdHkgKiB0aGlzLmxvYWRGYWN0b3IpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEVudHJ5PEU+W10gYnVpbGRUYWJsZShpbnQgY2FwYWNpdHkpIHsKLQkJcmV0dXJuIG5ldyBFbnRyeVtjYXBhY2l0eV07Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyBmb3IgdGhlIG9iamVjdCBpbiB0aGUgaGFzaCB0YWJsZSBieSBjYWxjdWxhdGluZwotCSAqIHRoZSBvYmplY3QncyBoYXNoIGNvZGUgYW5kIGV4YW1pbmluZyB0aGUgZW50cmllcyBpbiB0aGUgY29ycmVzcG9uZGluZyBoYXNoCi0JICogdGFibGUgYnVja2V0LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8pIHsKLQkJcmV0dXJuIHRoaXMuYWRkKG8sIDEpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIHRoZSBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUgYnkgY2FsY3VsYXRpbmcKLQkgKiB0aGUgb2JqZWN0J3MgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaAotCSAqIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvLCBpbnQgY250KSB7Ci0JCWlmIChjbnQgPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXRoaXMubW9kQ291bnQrKzsKLQkJaW50IGhhc2ggPSB0aGlzLmhhc2gobyk7Ci0JCWludCBpbmRleCA9IHRoaXMuaW5kZXgoaGFzaCk7Ci0KLQkJLy8gaWYgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGluIHRoZSBiYWcsIHNpbXBseSBidW1wIGl0cyBjb3VudAotCQlmb3IgKEVudHJ5PEU+IGUgPSB0aGlzLnRhYmxlW2luZGV4XTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQlPYmplY3QgZW87Ci0JCQlpZiAoKGUuaGFzaCA9PSBoYXNoKSAmJiAoKChlbyA9IGUub2JqZWN0KSA9PSBvKSB8fCAoKG8gIT0gbnVsbCkgJiYgby5lcXVhbHMoZW8pKSkpIHsKLQkJCQllLmNvdW50ICs9IGNudDsKLQkJCQl0aGlzLnNpemUgKz0gY250OwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLy8gcmVoYXNoIHRoZSB0YWJsZSBpZiB3ZSBhcmUgZ29pbmcgdG8gZXhjZWVkIHRoZSB0aHJlc2hvbGQKLQkJaWYgKHRoaXMudW5pcXVlQ291bnQgPj0gdGhpcy50aHJlc2hvbGQpIHsKLQkJCXRoaXMucmVoYXNoKCk7Ci0JCQlpbmRleCA9IHRoaXMuaW5kZXgoaGFzaCk7ICAvLyBuZWVkIHRvIHJlLWNhbGN1bGF0ZSB0aGUgaW5kZXgKLQkJfQotCi0JCS8vIGNyZWF0ZSB0aGUgbmV3IGVudHJ5IGFuZCBwdXQgaXQgaW4gdGhlIHRhYmxlCi0JCUVudHJ5PEU+IGUgPSB0aGlzLmJ1aWxkRW50cnkoaGFzaCwgbywgY250LCB0aGlzLnRhYmxlW2luZGV4XSk7Ci0JCXRoaXMudGFibGVbaW5kZXhdID0gZTsKLQkJdGhpcy5zaXplICs9IGNudDsKLQkJdGhpcy51bmlxdWVDb3VudCsrOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9ICkKLQlwcml2YXRlIEVudHJ5PEU+IGJ1aWxkRW50cnkoaW50IGhhc2gsIE9iamVjdCBvLCBpbnQgY250LCBFbnRyeSBuZXh0KSB7Ci0JCXJldHVybiBuZXcgRW50cnk8RT4oaGFzaCwgKEUpIG8sIGNudCwgKEVudHJ5PEU+KSBuZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZShvLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvLCBpbnQgY250KSB7Ci0JCWlmIChjbnQgPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBoYXNoID0gdGhpcy5oYXNoKG8pOwotCQlpbnQgaW5kZXggPSB0aGlzLmluZGV4KGhhc2gpOwotCi0JCWZvciAoRW50cnk8RT4gZSA9IHRoaXMudGFibGVbaW5kZXhdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCkgewotCQkJT2JqZWN0IGVvOwotCQkJaWYgKChlLmhhc2ggPT0gaGFzaCkgJiYgKCgoZW8gPSBlLm9iamVjdCkgPT0gbykgfHwgKChvICE9IG51bGwpICYmIG8uZXF1YWxzKGVvKSkpKSB7Ci0JCQkJdGhpcy5tb2RDb3VudCsrOwotCQkJCWNudCA9IChjbnQgPCBlLmNvdW50KSA/IGNudCA6IGUuY291bnQ7Ci0JCQkJZS5jb3VudCAtPSBjbnQ7Ci0JCQkJLy8gaWYgd2UgYXJlIHJlbW92aW5nIHRoZSBsYXN0IGVsZW1lbnQocyksIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgdGFibGUKLQkJCQlpZiAoZS5jb3VudCA9PSAwKSB7Ci0JCQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkJCXRoaXMudGFibGVbaW5kZXhdID0gZS5uZXh0OwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJldi5uZXh0ID0gZS5uZXh0OwotCQkJCQl9Ci0JCQkJCXRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQl9Ci0JCQkJdGhpcy5zaXplIC09IGNudDsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNpbXBseSBjbGVhcnMgb3V0IGFsbCBvZiB0aGUgaGFzaCB0YWJsZSBidWNrZXRzLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMudGFibGU7Ci0JCXRoaXMubW9kQ291bnQrKzsKLQkJZm9yIChpbnQgaSA9IHRhYi5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJdGFiW2ldID0gbnVsbDsKLQkJfQotCQl0aGlzLnNpemUgPSAwOwotCQl0aGlzLnVuaXF1ZUNvdW50ID0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgYmFnOiB0aGUgZWxlbWVudHMKLQkgKiB0aGVtc2VsdmVzIGFyZSBub3QgY2xvbmVkLgotCSAqCi0JICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIGJhZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSGFzaEJhZzxFPiBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJSGFzaEJhZzxFPiBjbG9uZSA9IChIYXNoQmFnPEU+KSBzdXBlci5jbG9uZSgpOwotCQkJY2xvbmUudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUodGhpcy50YWJsZS5sZW5ndGgpOwotCQkJY2xvbmUuc2l6ZSA9IDA7Ci0JCQljbG9uZS51bmlxdWVDb3VudCA9IDA7Ci0JCQljbG9uZS5tb2RDb3VudCA9IDA7Ci0JCQljbG9uZS5hZGRBbGxfKHRoaXMpOwotCQkJcmV0dXJuIGNsb25lOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBIYXNoIHRhYmxlIGNvbGxpc2lvbiBsaXN0IGVudHJ5LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIEVudHJ5PEU+Ci0JCWltcGxlbWVudHMgQmFnLkVudHJ5PEU+Ci0JewotCQlmaW5hbCBpbnQgaGFzaDsKLQkJZmluYWwgRSBvYmplY3Q7Ci0JCWludCBjb3VudDsKLQkJRW50cnk8RT4gbmV4dDsKLQotCQlFbnRyeShpbnQgaGFzaCwgRSBvYmplY3QsIGludCBjb3VudCwgRW50cnk8RT4gbmV4dCkgewotCQkJdGhpcy5oYXNoID0gaGFzaDsKLQkJCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQkJdGhpcy5jb3VudCA9IGNvdW50OwotCQkJdGhpcy5uZXh0ID0gbmV4dDsKLQkJfQotCi0JCS8vICoqKioqIEJhZy5FbnRyeSBpbXBsZW1lbnRhdGlvbgotCQlwdWJsaWMgRSBnZXRFbGVtZW50KCkgewotCQkJcmV0dXJuIHRoaXMub2JqZWN0OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb3VudCgpIHsKLQkJCXJldHVybiB0aGlzLmNvdW50OwotCQl9Ci0KLQkJcHVibGljIGludCBzZXRDb3VudChpbnQgY291bnQpIHsKLQkJCWlmIChjb3VudCA8PSAwKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY291bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybzogIiArIGNvdW50KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaW50IG9sZCA9IHRoaXMuY291bnQ7Ci0JCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JCQlyZXR1cm4gb2xkOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYgKCAhIChvIGluc3RhbmNlb2YgQmFnLkVudHJ5PD8+KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCQlCYWcuRW50cnkgZSA9IChCYWcuRW50cnkpIG87Ci0JCQlyZXR1cm4gKHRoaXMuY291bnQgPT0gZS5nZXRDb3VudCgpKSAmJgotCQkJCQlUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLm9iamVjdCwgZS5nZXRFbGVtZW50KCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlFIG8gPSB0aGlzLm9iamVjdDsKLQkJCXJldHVybiAobyA9PSBudWxsKSA/IDAgOiAodGhpcy5jb3VudCAqIG8uaGFzaENvZGUoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLm9iamVjdCArICI9PiIgKyB0aGlzLmNvdW50OyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuICh0aGlzLnNpemUgPT0gMCkgPyBFTVBUWV9JVEVSQVRPUiA6IG5ldyBIYXNoSXRlcmF0b3IoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmF0b3I8RT4gdW5pcXVlSXRlcmF0b3IoKSB7Ci0JCXJldHVybiAodGhpcy5zaXplID09IDApID8gRU1QVFlfSVRFUkFUT1IgOiBuZXcgVW5pcXVlSXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHVuaXF1ZUNvdW50KCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb3VudDsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmF0b3I8QmFnLkVudHJ5PEU+PiBlbnRyaWVzKCkgewotCQlyZXR1cm4gKHRoaXMuc2l6ZSA9PSAwKSA/IEVNUFRZX0lURVJBVE9SIDogbmV3IEVudHJ5SXRlcmF0b3IoKTsKLQl9Ci0KLQotCS8qKgotCSAqIEVtcHR5IGl0ZXJhdG9yIHRoYXQgZG9lcyBqdXN0IGFib3V0IG5vdGhpbmcuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYXRvciBFTVBUWV9JVEVSQVRPUiA9IG5ldyBFbXB0eUl0ZXJhdG9yKCk7Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEVtcHR5SXRlcmF0b3IKLQkJaW1wbGVtZW50cyBJdGVyYXRvcgotCXsKLQkJRW1wdHlJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBIYXNoSXRlcmF0b3IKLQkJaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotCXsKLQkJcHJpdmF0ZSBpbnQgaW5kZXggPSBIYXNoQmFnLnRoaXMudGFibGUubGVuZ3RoOwkvLyBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZQotCQlwcml2YXRlIEVudHJ5PEU+IG5leHRFbnRyeSA9IG51bGw7Ci0JCXByaXZhdGUgaW50IG5leHRFbnRyeUNvdW50ID0gMDsKLQkJcHJpdmF0ZSBFbnRyeTxFPiBsYXN0UmV0dXJuZWRFbnRyeSA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtb2RDb3VudCB2YWx1ZSB0aGF0IHRoZSBpdGVyYXRvciBiZWxpZXZlcyB0aGF0IHRoZSBiYWNraW5nCi0JCSAqIGJhZyBzaG91bGQgaGF2ZS4gSWYgdGhpcyBleHBlY3RhdGlvbiBpcyB2aW9sYXRlZCwgdGhlIGl0ZXJhdG9yCi0JCSAqIGhhcyBkZXRlY3RlZCBhIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uLgotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgZXhwZWN0ZWRNb2RDb3VudCA9IEhhc2hCYWcudGhpcy5tb2RDb3VudDsKLQotCQlIYXNoSXRlcmF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCUVudHJ5PEU+IGUgPSB0aGlzLm5leHRFbnRyeTsKLQkJCWludCBpID0gdGhpcy5pbmRleDsKLQkJCUVudHJ5PEU+W10gdGFiID0gSGFzaEJhZy50aGlzLnRhYmxlOwotCQkJLy8gVXNlIGxvY2FscyBmb3IgZmFzdGVyIGxvb3AgaXRlcmF0aW9uCi0JCQl3aGlsZSAoKGUgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWUgPSB0YWJbLS1pXTsJCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIHRhYmxlCi0JCQl9Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGU7Ci0JCQl0aGlzLmluZGV4ID0gaTsKLQkJCXJldHVybiBlICE9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgRSBuZXh0KCkgewotCQkJaWYgKEhhc2hCYWcudGhpcy5tb2RDb3VudCAhPSB0aGlzLmV4cGVjdGVkTW9kQ291bnQpIHsKLQkJCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT4gZXQgPSB0aGlzLm5leHRFbnRyeTsKLQkJCWludCBpID0gdGhpcy5pbmRleDsKLQkJCUVudHJ5PEU+W10gdGFiID0gSGFzaEJhZy50aGlzLnRhYmxlOwotCQkJLy8gVXNlIGxvY2FscyBmb3IgZmFzdGVyIGxvb3AgaXRlcmF0aW9uCi0JCQl3aGlsZSAoKGV0ID09IG51bGwpICYmIChpID4gMCkpIHsKLQkJCQlldCA9IHRhYlstLWldOwkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdGFibGUKLQkJCX0KLQkJCXRoaXMubmV4dEVudHJ5ID0gZXQ7Ci0JCQl0aGlzLmluZGV4ID0gaTsKLQkJCWlmIChldCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCUVudHJ5PEU+IGUgPSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID0gdGhpcy5uZXh0RW50cnk7Ci0JCQl0aGlzLm5leHRFbnRyeUNvdW50Kys7Ci0JCQlpZiAodGhpcy5uZXh0RW50cnlDb3VudCA9PSBlLmNvdW50KSB7Ci0JCQkJdGhpcy5uZXh0RW50cnkgPSBlLm5leHQ7Ci0JCQkJdGhpcy5uZXh0RW50cnlDb3VudCA9IDA7Ci0JCQl9Ci0JCQlyZXR1cm4gZS5vYmplY3Q7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQlpZiAodGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJfQotCQkJaWYgKEhhc2hCYWcudGhpcy5tb2RDb3VudCAhPSB0aGlzLmV4cGVjdGVkTW9kQ291bnQpIHsKLQkJCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJaW50IHNsb3QgPSBIYXNoQmFnLnRoaXMuaW5kZXgodGhpcy5sYXN0UmV0dXJuZWRFbnRyeS5oYXNoLCBIYXNoQmFnLnRoaXMudGFibGUubGVuZ3RoKTsKLQkJCWZvciAoRW50cnk8RT4gZSA9IEhhc2hCYWcudGhpcy50YWJsZVtzbG90XSwgcHJldiA9IG51bGw7IGUgIT0gbnVsbDsgcHJldiA9IGUsIGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoZSA9PSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5KSB7Ci0JCQkJCUhhc2hCYWcudGhpcy5tb2RDb3VudCsrOwotCQkJCQl0aGlzLmV4cGVjdGVkTW9kQ291bnQrKzsKLQkJCQkJZS5jb3VudC0tOwotCQkJCQlpZiAoZS5jb3VudCA9PSAwKSB7Ci0JCQkJCQkvLyBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhlIGxhc3Qgb25lLCByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQkJSGFzaEJhZy50aGlzLnRhYmxlW3Nsb3RdID0gZS5uZXh0OwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwcmV2Lm5leHQgPSBlLm5leHQ7Ci0JCQkJCQl9Ci0JCQkJCQlIYXNoQmFnLnRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIHNsaWRlIGJhY2sgdGhlIGNvdW50IHRvIGFjY291bnQgZm9yIHRoZSBqdXN0LXJlbW92ZWQgZWxlbWVudAotCQkJCQkJdGhpcy5uZXh0RW50cnlDb3VudC0tOwotCQkJCQl9Ci0JCQkJCUhhc2hCYWcudGhpcy5zaXplLS07Ci0JCQkJCXRoaXMubGFzdFJldHVybmVkRW50cnkgPSBudWxsOwkvLyBpdCBjYW5ub3QgYmUgcmVtb3ZlZCBhZ2FpbgotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBFbnRyeUl0ZXJhdG9yCi0JCWltcGxlbWVudHMgSXRlcmF0b3I8RW50cnk8RT4+Ci0JewotCQlwcml2YXRlIGludCBpbmRleCA9IEhhc2hCYWcudGhpcy50YWJsZS5sZW5ndGg7CS8vIHN0YXJ0IGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlCi0JCXByaXZhdGUgRW50cnk8RT4gbmV4dEVudHJ5ID0gbnVsbDsKLQkJcHJpdmF0ZSBFbnRyeTxFPiBsYXN0UmV0dXJuZWRFbnRyeSA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtb2RDb3VudCB2YWx1ZSB0aGF0IHRoZSBpdGVyYXRvciBiZWxpZXZlcyB0aGF0IHRoZSBiYWNraW5nCi0JCSAqIGJhZyBzaG91bGQgaGF2ZS4gSWYgdGhpcyBleHBlY3RhdGlvbiBpcyB2aW9sYXRlZCwgdGhlIGl0ZXJhdG9yCi0JCSAqIGhhcyBkZXRlY3RlZCBhIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uLgotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgZXhwZWN0ZWRNb2RDb3VudCA9IEhhc2hCYWcudGhpcy5tb2RDb3VudDsKLQotCQlFbnRyeUl0ZXJhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlFbnRyeTxFPiBlID0gdGhpcy5uZXh0RW50cnk7Ci0JCQlpbnQgaSA9IHRoaXMuaW5kZXg7Ci0JCQlFbnRyeTxFPltdIHRhYiA9IEhhc2hCYWcudGhpcy50YWJsZTsKLQkJCS8vIFVzZSBsb2NhbHMgZm9yIGZhc3RlciBsb29wIGl0ZXJhdGlvbgotCQkJd2hpbGUgKChlID09IG51bGwpICYmIChpID4gMCkpIHsKLQkJCQllID0gdGFiWy0taV07CQkvLyBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0YWJsZQotCQkJfQotCQkJdGhpcy5uZXh0RW50cnkgPSBlOwotCQkJdGhpcy5pbmRleCA9IGk7Ci0JCQlyZXR1cm4gZSAhPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIEVudHJ5PEU+IG5leHQoKSB7Ci0JCQlpZiAoSGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPiBldCA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSBIYXNoQmFnLnRoaXMudGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZXQgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWV0ID0gdGFiWy0taV07CQkvLyBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0YWJsZQotCQkJfQotCQkJdGhpcy5uZXh0RW50cnkgPSBldDsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJaWYgKGV0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT4gZSA9IHRoaXMubGFzdFJldHVybmVkRW50cnkgPSB0aGlzLm5leHRFbnRyeTsKLQkJCXRoaXMubmV4dEVudHJ5ID0gZS5uZXh0OwotCQkJcmV0dXJuIGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQlpZiAodGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJfQotCQkJaWYgKEhhc2hCYWcudGhpcy5tb2RDb3VudCAhPSB0aGlzLmV4cGVjdGVkTW9kQ291bnQpIHsKLQkJCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJaW50IHNsb3QgPSBIYXNoQmFnLnRoaXMuaW5kZXgodGhpcy5sYXN0UmV0dXJuZWRFbnRyeS5oYXNoLCBIYXNoQmFnLnRoaXMudGFibGUubGVuZ3RoKTsKLQkJCWZvciAoRW50cnk8RT4gZSA9IEhhc2hCYWcudGhpcy50YWJsZVtzbG90XSwgcHJldiA9IG51bGw7IGUgIT0gbnVsbDsgcHJldiA9IGUsIGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoZSA9PSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5KSB7Ci0JCQkJCUhhc2hCYWcudGhpcy5tb2RDb3VudCsrOwotCQkJCQl0aGlzLmV4cGVjdGVkTW9kQ291bnQrKzsKLQkJCQkJLy8gcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSB0YWJsZQotCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQlIYXNoQmFnLnRoaXMudGFibGVbc2xvdF0gPSBlLm5leHQ7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwcmV2Lm5leHQgPSBlLm5leHQ7Ci0JCQkJCX0KLQkJCQkJSGFzaEJhZy50aGlzLnVuaXF1ZUNvdW50LS07Ci0JCQkJCUhhc2hCYWcudGhpcy5zaXplIC09IHRoaXMubGFzdFJldHVybmVkRW50cnkuY291bnQ7Ci0JCQkJCXRoaXMubGFzdFJldHVybmVkRW50cnkgPSBudWxsOwkvLyBpdCBjYW5ub3QgYmUgcmVtb3ZlZCBhZ2FpbgotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBVbmlxdWVJdGVyYXRvcgotCQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci0JewotCQlwcml2YXRlIEVudHJ5SXRlcmF0b3IgZW50cnlJdGVyYXRvciA9IG5ldyBFbnRyeUl0ZXJhdG9yKCk7Ci0JCQotCQlVbmlxdWVJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIHRoaXMuZW50cnlJdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQotCQlwdWJsaWMgRSBuZXh0KCkgewotCQkJcmV0dXJuIHRoaXMuZW50cnlJdGVyYXRvci5uZXh0KCkub2JqZWN0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhpcy5lbnRyeUl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKCAhIChvIGluc3RhbmNlb2YgQmFnPD8+KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlCYWc8RT4gYiA9IChCYWc8RT4pIG87Ci0JCWlmIChiLnNpemUoKSAhPSB0aGlzLnNpemUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChiLnVuaXF1ZUNvdW50KCkgIT0gdGhpcy51bmlxdWVDb3VudCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjxCYWcuRW50cnk8RT4+IHN0cmVhbSA9IGIuZW50cmllcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUJhZy5FbnRyeTxFPiBlbnRyeSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAoZW50cnkuZ2V0Q291bnQoKSAhPSB0aGlzLmNvdW50KGVudHJ5LmdldEVsZW1lbnQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaW50IGggPSAwOwotCQlmb3IgKEUgbyA6IHRoaXMpIHsKLQkJCWlmIChvICE9IG51bGwpIHsKLQkJCQloICs9IG8uaGFzaENvZGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaDsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRoZSBzdGF0ZSBvZiB0aGlzIGJhZyB0byBhIHN0cmVhbSAoaS5lLiBzZXJpYWxpemUgaXQpLgotCSAqCi0JICogQHNlcmlhbERhdGEgRW1pdCB0aGUgY2FwYWNpdHkgb2YgdGhlIGJhZyAoaW50KSwKLQkgKiAgICAgZm9sbG93ZWQgYnkgdGhlIG51bWJlciBvZiB1bmlxdWUgZWxlbWVudHMgaW4gdGhlIGJhZyAoaW50KSwKLQkgKiAgICAgZm9sbG93ZWQgYnkgYWxsIG9mIHRoZSBiYWcncyBlbGVtZW50cyAoZWFjaCBhbiBPYmplY3QpIGFuZAotCSAqICAgICB0aGVpciBjb3VudHMgKGVhY2ggYW4gaW50KSwgaW4gbm8gcGFydGljdWxhciBvcmRlci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gcykKLQkJCQl0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCS8vIHdyaXRlIG91dCB0aGUgdGhyZXNob2xkLCBsb2FkIGZhY3RvciwgYW5kIGFueSBoaWRkZW4gc3R1ZmYKLQkJcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQotCQkvLyB3cml0ZSBvdXQgbnVtYmVyIG9mIGJ1Y2tldHMKLQkJcy53cml0ZUludCh0aGlzLnRhYmxlLmxlbmd0aCk7Ci0KLQkJLy8gd3JpdGUgb3V0IG51bWJlciBvZiB1bmlxdWUgZWxlbWVudHMKLQkJcy53cml0ZUludCh0aGlzLnVuaXF1ZUNvdW50KTsKLQotCQkvLyB3cml0ZSBvdXQgZWxlbWVudHMgYW5kIGNvdW50cyAoYWx0ZXJuYXRpbmcpCi0JCWlmICh0aGlzLnVuaXF1ZUNvdW50ID4gMCkgewotCQkJZm9yIChFbnRyeTxFPiBlbnRyeSA6IHRoaXMudGFibGUpIHsKLQkJCQl3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotCQkJCQlzLndyaXRlT2JqZWN0KGVudHJ5Lm9iamVjdCk7Ci0JCQkJCXMud3JpdGVJbnQoZW50cnkuY291bnQpOwotCQkJCQllbnRyeSA9IGVudHJ5Lm5leHQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBSZWNvbnN0aXR1dGUgdGhlIGJhZyBmcm9tIGEgc3RyZWFtIChpLmUuIGRlc2VyaWFsaXplIGl0KS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIHMpCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkvLyByZWFkIGluIHRoZSB0aHJlc2hvbGQsIGxvYWRmYWN0b3IsIGFuZCBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFJlYWRPYmplY3QoKTsKLQotCQkvLyByZWFkIGluIG51bWJlciBvZiBidWNrZXRzIGFuZCBhbGxvY2F0ZSB0aGUgYnVja2V0IGFycmF5Ci0JCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUocy5yZWFkSW50KCkpOwotCi0JCS8vIHJlYWQgaW4gbnVtYmVyIG9mIHVuaXF1ZSBlbGVtZW50cwotCQlpbnQgdW5pcXVlID0gcy5yZWFkSW50KCk7Ci0KLQkJLy8gcmVhZCB0aGUgZWxlbWVudHMgYW5kIGNvdW50cywgYW5kIHB1dCB0aGUgZWxlbWVudHMgaW4gdGhlIGJhZwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVuaXF1ZTsgaSsrKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUUgZWxlbWVudCA9IChFKSBzLnJlYWRPYmplY3QoKTsKLQkJCWludCBlbGVtZW50Q291bnQgPSBzLnJlYWRJbnQoKTsKLQkJCXRoaXMuYWRkXyhlbGVtZW50LCBlbGVtZW50Q291bnQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvSWRlbnRpdHlIYXNoQmFnLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9JZGVudGl0eUhhc2hCYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwYTU1Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9JZGVudGl0eUhhc2hCYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUge0BsaW5rIEJhZ30gaW50ZXJmYWNlIHdpdGggYQotICogaGFzaCB0YWJsZSwgdXNpbmcgb2JqZWN0LWlkZW50aXR5IGluIHBsYWNlIG9mIG9iamVjdC1lcXVhbGl0eSB3aGVuCi0gKiBjb21wYXJpbmcgZWxlbWVudHMuIEluIG90aGVyIHdvcmRzLCBpbiBhbiA8Y29kZT5JZGVudGl0eUhhc2hCYWc8L2NvZGU+LAotICogdHdvIG9iamVjdHMgPGNvZGU+bzE8L2NvZGU+IGFuZCA8Y29kZT5vMjwvY29kZT4gYXJlIGNvbnNpZGVyZWQKLSAqIGVxdWFsIGlmIGFuZCBvbmx5IGlmIDxjb2RlPihvMSA9PSBvMik8L2NvZGU+LiAoSW4gbm9ybWFsIHtAbGluayBCYWd9Ci0gKiBpbXBsZW1lbnRhdGlvbnMgKGxpa2Uge0BsaW5rIEhhc2hCYWd9KSB0d28gb2JqZWN0cyA8Y29kZT5vMTwvY29kZT4KLSAqIGFuZCA8Y29kZT5vMjwvY29kZT4gYXJlIGNvbnNpZGVyZWQgZXF1YWwgaWYgYW5kIG9ubHkgaWYKLSAqIDxjb2RlPihvMSA9PSBudWxsID8gbzIgPT0gbnVsbCA6IG8xLmVxdWFscyhvMikpPC9jb2RlPi4pCi0gKiA8cD4KLSAqIDxzdHJvbmc+Ci0gKiBUaGlzIGNsYXNzIGlzIDxlbT5ub3Q8L2VtPiBhIGdlbmVyYWwtcHVycG9zZSB7QGxpbmsgQmFnfQotICogaW1wbGVtZW50YXRpb24hIFdoaWxlIHRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUge0BsaW5rIEJhZ30gaW50ZXJmYWNlLCBpdAotICogaW50ZW50aW9uYWxseSB2aW9sYXRlcyB7QGxpbmsgQmFnfSdzIGdlbmVyYWwgY29udHJhY3QsIHdoaWNoIG1hbmRhdGVzIHRoZQotICogdXNlIG9mIHRoZSA8Y29kZT5lcXVhbHM8L2NvZGU+IG1ldGhvZCB3aGVuIGNvbXBhcmluZyBvYmplY3RzLiBUaGlzIGNsYXNzIGlzCi0gKiBkZXNpZ25lZCBmb3IgdXNlIG9ubHkgaW4gdGhlIHJhcmUgY2FzZXMgd2hlcmVpbiBvYmplY3QtaWRlbnRpdHkKLSAqIHNlbWFudGljcyBhcmUgcmVxdWlyZWQuCi0gKiA8L3N0cm9uZz4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYWtlcyBubyBndWFyYW50ZWVzIGFzIHRvIHRoZSBpdGVyYXRpb24gb3JkZXIgb2YKLSAqIHRoZSBiYWcncyBlbGVtZW50czsgaW4gcGFydGljdWxhciwgaXQgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgdGhlIG9yZGVyCi0gKiB3aWxsIHJlbWFpbiBjb25zdGFudCBvdmVyIHRpbWUuIFRoaXMgY2xhc3MgcGVybWl0cyB0aGUgPGNvZGU+bnVsbDwvY29kZT4KLSAqIGVsZW1lbnQuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgb2ZmZXJzIGNvbnN0YW50IHRpbWUgcGVyZm9ybWFuY2UgZm9yIHRoZSBiYXNpYyBvcGVyYXRpb25zCi0gKiAoPGNvZGU+YWRkPC9jb2RlPiwgPGNvZGU+cmVtb3ZlPC9jb2RlPiwgPGNvZGU+Y29udGFpbnM8L2NvZGU+IGFuZAotICogPGNvZGU+c2l6ZTwvY29kZT4pLCBhc3N1bWluZyB0aGUgc3lzdGVtIGlkZW50aXR5IGhhc2ggZnVuY3Rpb24KLSAqICh7QGxpbmsgU3lzdGVtI2lkZW50aXR5SGFzaENvZGUoT2JqZWN0KX0pIGRpc3BlcnNlcyBlbGVtZW50cyBwcm9wZXJseQotICogYW1vbmcgdGhlIGJ1Y2tldHMuIEl0ZXJhdGluZyBvdmVyIHRoaXMgYmFnIHJlcXVpcmVzIHRpbWUKLSAqIHByb3BvcnRpb25hbCB0byB0aGUgc3VtIG9mIHRoZSBiYWcncyBzaXplICh0aGUgbnVtYmVyIG9mIGVsZW1lbnRzKSBwbHVzIHRoZQotICogImNhcGFjaXR5IiBvZiB0aGUgYmFja2luZyBoYXNoIHRhYmxlICh0aGUgbnVtYmVyIG9mIGJ1Y2tldHMpLiBUaHVzLCBpdCBpcwotICogaW1wb3J0YW50IG5vdCB0byBzZXQgdGhlIGluaXRpYWwgY2FwYWNpdHkgdG9vIGhpZ2ggKG9yIHRoZSBsb2FkIGZhY3RvciB0b28KLSAqIGxvdykgaWYgaXRlcmF0aW9uIHBlcmZvcm1hbmNlIGlzIGltcG9ydGFudC4KLSAqIDxwPgotICogPHN0cm9uZz5Ob3RlIHRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3Qgc3luY2hyb25pemVkLjwvc3Ryb25nPiBJZiBtdWx0aXBsZQotICogdGhyZWFkcyBhY2Nlc3MgYSBiYWcgY29uY3VycmVudGx5LCBhbmQgYXQgbGVhc3Qgb25lIG9mIHRoZSB0aHJlYWRzIG1vZGlmaWVzCi0gKiB0aGUgYmFnLCBpdCA8ZW0+bXVzdDwvZW0+IGJlIHN5bmNocm9uaXplZCBleHRlcm5hbGx5LiBUaGlzIGlzIHR5cGljYWxseQotICogYWNjb21wbGlzaGVkIGJ5IHN5bmNocm9uaXppbmcgb24gc29tZSBvYmplY3QgdGhhdCBuYXR1cmFsbHkgZW5jYXBzdWxhdGVzCi0gKiB0aGUgYmFnLiBJZiBubyBzdWNoIG9iamVjdCBleGlzdHMsIHRoZSBiYWcgc2hvdWxkIGJlICJ3cmFwcGVkIiB1c2luZyB0aGUKLSAqIDxjb2RlPkNvbGxlY3Rpb25zLnN5bmNocm9uaXplZENvbGxlY3Rpb248L2NvZGU+IG1ldGhvZC4gVGhpcyBpcwotICogYmVzdCBkb25lIGF0IGNyZWF0aW9uIHRpbWUsIHRvIHByZXZlbnQgYWNjaWRlbnRhbCB1bnN5bmNocm9uaXplZCBhY2Nlc3MKLSAqIHRvIHRoZSBiYWc6Ci0gKiA8cHJlPgotICogQ29sbGVjdGlvbiBjID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkQ29sbGVjdGlvbihuZXcgSWRlbnRpdHlIYXNoQmFnKC4uLikpOwotICogPC9wcmU+Ci0gKiA8cD4KLSAqIFRoZSBpdGVyYXRvcnMgcmV0dXJuZWQgYnkgdGhpcyBjbGFzcydzIDxjb2RlPml0ZXJhdG9yPC9jb2RlPiBtZXRob2QgYXJlCi0gKiA8ZW0+ZmFpbC1mYXN0PC9lbT46IGlmIHRoZSBiYWcgaXMgbW9kaWZpZWQgYXQgYW55IHRpbWUgYWZ0ZXIgdGhlIGl0ZXJhdG9yIGlzCi0gKiBjcmVhdGVkLCBpbiBhbnkgd2F5IGV4Y2VwdCB0aHJvdWdoIHRoZSBpdGVyYXRvcidzIG93biA8Y29kZT5yZW1vdmU8L2NvZGU+Ci0gKiBtZXRob2QsIHRoZSBpdGVyYXRvciB0aHJvd3MgYSB7QGxpbmsgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbn0uCi0gKiBUaHVzLCBpbiB0aGUgZmFjZSBvZiBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiwgdGhlIGl0ZXJhdG9yIGZhaWxzIHF1aWNrbHkKLSAqIGFuZCBjbGVhbmx5LCByYXRoZXIgdGhhbiByaXNraW5nIGFyYml0cmFyeSwgbm9uLWRldGVybWluaXN0aWMgYmVoYXZpb3IgYXQKLSAqIGFuIHVuZGV0ZXJtaW5lZCB0aW1lIGluIHRoZSBmdXR1cmUuCi0gKiA8cD4KLSAqIE5vdGUgdGhhdCB0aGUgZmFpbC1mYXN0IGJlaGF2aW9yIG9mIGFuIGl0ZXJhdG9yIGNhbm5vdCBiZSBndWFyYW50ZWVkCi0gKiBhcyBpdCBpcywgZ2VuZXJhbGx5IHNwZWFraW5nLCBpbXBvc3NpYmxlIHRvIG1ha2UgYW55IGhhcmQgZ3VhcmFudGVlcyBpbiB0aGUKLSAqIHByZXNlbmNlIG9mIHVuc3luY2hyb25pemVkIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uLiBGYWlsLWZhc3QgaXRlcmF0b3JzCi0gKiB0aHJvdyA8Y29kZT5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uPC9jb2RlPiBvbiBhIGJlc3QtZWZmb3J0IGJhc2lzLgotICogVGhlcmVmb3JlLCBpdCB3b3VsZCBiZSB3cm9uZyB0byB3cml0ZSBhIHByb2dyYW0gdGhhdCBkZXBlbmRlZCBvbiB0aGlzCi0gKiBleGNlcHRpb24gZm9yIGl0cyBjb3JyZWN0bmVzczogPGVtPnRoZSBmYWlsLWZhc3QgYmVoYXZpb3Igb2YgaXRlcmF0b3JzCi0gKiBzaG91bGQgYmUgdXNlZCBvbmx5IHRvIGRldGVjdCBidWdzLjwvZW0+Ci0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgbWFpbnRhaW5lZCBieSB0aGUgYmFnCi0gKiAKLSAqIEBzZWUgQ29sbGVjdGlvbgotICogQHNlZSBCYWcKLSAqIEBzZWUgU3luY2hyb25pemVkQmFnCi0gKiBAc2VlCWphdmEudXRpbC5Db2xsZWN0aW9ucyNzeW5jaHJvbml6ZWRDb2xsZWN0aW9uKENvbGxlY3Rpb24pCi0gKiBAc2VlIEhhc2hCYWcKLSAqLwotcHVibGljIGNsYXNzIElkZW50aXR5SGFzaEJhZzxFPgotCWV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uPEU+Ci0JaW1wbGVtZW50cyBCYWc8RT4sIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIFRoZSBoYXNoIHRhYmxlLiBSZXNpemVkIGFzIG5lY2Vzc2FyeS4gTGVuZ3RoIE1VU1QgQWx3YXlzIGJlIGEgcG93ZXIgb2YgdHdvLiAqLwotCXRyYW5zaWVudCBFbnRyeTxFPltdIHRhYmxlOwotCi0JLyoqIFRoZSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgYmFnLiAqLwotCXRyYW5zaWVudCBpbnQgc2l6ZSA9IDA7Ci0KLQkvKiogVGhlIG51bWJlciBvZiBVTklRVUUgZW50cmllcyBpbiB0aGUgYmFnLiAqLwotCXRyYW5zaWVudCBpbnQgdW5pcXVlQ291bnQgPSAwOwotCi0JLyoqCi0JICogVGhlIGhhc2ggdGFibGUgaXMgcmVoYXNoZWQgd2hlbiBpdHMgc2l6ZSBleGNlZWRzIHRoaXMgdGhyZXNob2xkLiAoVGhlCi0JICogdmFsdWUgb2YgdGhpcyBmaWVsZCBpcyA8Y29kZT4oaW50KSAoY2FwYWNpdHkgKiBsb2FkRmFjdG9yKTwvY29kZT4uKQotCSAqCi0JICogQHNlcmlhbCBzaXplIHRocmVzaG9sZAotCSAqLwotCXByaXZhdGUgaW50IHRocmVzaG9sZDsKLQotCS8qKgotCSAqIFRoZSBsb2FkIGZhY3RvciBmb3IgdGhlIGhhc2ggdGFibGUuCi0JICoKLQkgKiBAc2VyaWFsIGxvYWQgZmFjdG9yCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBmbG9hdCBsb2FkRmFjdG9yOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGJhZyBoYXMgYmVlbiBzdHJ1Y3R1cmFsbHkgbW9kaWZpZWQuCi0JICogU3RydWN0dXJhbCBtb2RpZmljYXRpb25zIGFyZSB0aG9zZSB0aGF0IGNoYW5nZSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4KLQkgKiB0aGUgYmFnIG9yIG90aGVyd2lzZSBtb2RpZnkgaXRzIGludGVybmFsIHN0cnVjdHVyZSAoZS5nLiByZWhhc2gpLgotCSAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byBtYWtlIGl0ZXJhdG9ycyBvbiB0aGlzIGJhZyBmYWlsLWZhc3QuCi0JICoKLQkgKiBAc2VlIGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uCi0JICovCi0JdHJhbnNpZW50IGludCBtb2RDb3VudCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpbml0aWFsIGNhcGFjaXR5IC0gTVVTVCBiZSBhIHBvd2VyIG9mIHR3by4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9JTklUSUFMX0NBUEFDSVRZID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgbWF4aW11bSBjYXBhY2l0eSwgdXNlZCBpZiBhIGhpZ2hlciB2YWx1ZSBpcyBpbXBsaWNpdGx5IHNwZWNpZmllZAotCSAqIGJ5IGVpdGhlciBvZiB0aGUgY29uc3RydWN0b3JzIHdpdGggYXJndW1lbnRzLgotCSAqIE1VU1QgYmUgYSBwb3dlciBvZiB0d28gPD0gKDEgPDwgMzApLgotCQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYSU1VTV9DQVBBQ0lUWSA9IDEgPDwgMzA7Ci0KLQkvKioKLQkgKiBUaGUgbG9hZCBmYWN0b3IgdXNlZCB3aGVuIG5vbmUgc3BlY2lmaWVkIGluIGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IERFRkFVTFRfTE9BRF9GQUNUT1IgPSAwLjc1ZjsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldywgZW1wdHkgYmFnIHdpdGggdGhlCi0JICogZGVmYXVsdCBjYXBhY2l0eSwgd2hpY2ggaXMgMTYsIGFuZCBsb2FkIGZhY3Rvciwgd2hpY2ggaXMgMC43NS4KLQkgKi8KLQlwdWJsaWMgSWRlbnRpdHlIYXNoQmFnKCkgewotCQl0aGlzKERFRkFVTFRfSU5JVElBTF9DQVBBQ0lUWSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBiYWcgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkKLQkgKiBhbmQgdGhlIGRlZmF1bHQgbG9hZCBmYWN0b3IsIHdoaWNoIGlzIDAuNzUuCi0JICoKLQkgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IHRoZSBpbml0aWFsIGNhcGFjaXR5Ci0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMgbGVzcwotCSAqICAgICB0aGFuIHplcm8KLQkgKi8KLQlwdWJsaWMgSWRlbnRpdHlIYXNoQmFnKGludCBpbml0aWFsQ2FwYWNpdHkpIHsKLQkJdGhpcyhpbml0aWFsQ2FwYWNpdHksIERFRkFVTFRfTE9BRF9GQUNUT1IsIGZhbHNlKTsgIC8vIGZhbHNlID0gZG8gbm90IHZhbGlkYXRlIHBhcm1zCi0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBiYWcgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCBjYXBhY2l0eSBhbmQgbG9hZCBmYWN0b3IuCi0JICoKLQkgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IHRoZSBpbml0aWFsIGNhcGFjaXR5Ci0JICogQHBhcmFtIGxvYWRGYWN0b3IgdGhlIGxvYWQgZmFjdG9yCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMgbGVzcwotCSAqICAgICB0aGFuIHplcm8gb3IgaWYgdGhlIGxvYWQgZmFjdG9yIGlzIG5vbi1wb3NpdGl2ZQotCSAqLwotCXB1YmxpYyBJZGVudGl0eUhhc2hCYWcoaW50IGluaXRpYWxDYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvcikgewotCQl0aGlzKGluaXRpYWxDYXBhY2l0eSwgbG9hZEZhY3RvciwgdHJ1ZSk7ICAvLyB0cnVlID0gdmFsaWRhdGUgcGFybXMKLQl9Ci0KLQlwcml2YXRlIElkZW50aXR5SGFzaEJhZyhpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yLCBib29sZWFuIHZhbGlkYXRlUGFybXMpIHsKLQkJc3VwZXIoKTsKLQkJaW50IGNhcGFjaXR5ID0gaW5pdGlhbENhcGFjaXR5OwotCQlpZiAodmFsaWRhdGVQYXJtcykgewotCQkJaWYgKGNhcGFjaXR5IDwgMCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgSW5pdGlhbCBDYXBhY2l0eTogIiArIGNhcGFjaXR5KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGNhcGFjaXR5ID4gTUFYSU1VTV9DQVBBQ0lUWSkgewotCQkJCWNhcGFjaXR5ID0gTUFYSU1VTV9DQVBBQ0lUWTsKLQkJCX0KLQkJCWlmIChsb2FkRmFjdG9yIDw9IDAgfHwgRmxvYXQuaXNOYU4obG9hZEZhY3RvcikpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIExvYWQgZmFjdG9yOiAiICsgbG9hZEZhY3Rvcik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkKLQkJCS8vIGZpbmQgYSBwb3dlciBvZiAyID49ICdpbml0aWFsQ2FwYWNpdHknCi0JCQljYXBhY2l0eSA9IDE7Ci0JCQl3aGlsZSAoY2FwYWNpdHkgPCBpbml0aWFsQ2FwYWNpdHkpIHsKLQkJCQljYXBhY2l0eSA8PD0gMTsKLQkJCX0KLQkJfQotCi0JCXRoaXMubG9hZEZhY3RvciA9IGxvYWRGYWN0b3I7Ci0JCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUoY2FwYWNpdHkpOwotCQl0aGlzLnRocmVzaG9sZCA9IChpbnQpIChjYXBhY2l0eSAqIGxvYWRGYWN0b3IpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBiYWcgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGNvbGxlY3Rpb24uIFRoZSBiYWcncyBsb2FkIGZhY3RvciB3aWxsIGJlIHRoZSBkZWZhdWx0LCB3aGljaCBpcyAwLjc1LAotCSAqIGFuZCBpdHMgaW5pdGlhbCBjYXBhY2l0eSB3aWxsIGJlIHN1ZmZpY2llbnQgdG8gaG9sZCBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjIHRoZSBjb2xsZWN0aW9uIHdob3NlIGVsZW1lbnRzIGFyZSB0byBiZSBwbGFjZWQgaW50byB0aGlzIGJhZy4KLQkgKi8KLQlwdWJsaWMgSWRlbnRpdHlIYXNoQmFnKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJdGhpcyhNYXRoLm1heCgoaW50KSAoYy5zaXplKCkgLyBERUZBVUxUX0xPQURfRkFDVE9SKSArIDEsIERFRkFVTFRfSU5JVElBTF9DQVBBQ0lUWSksIERFRkFVTFRfTE9BRF9GQUNUT1IpOwotCQl0aGlzLmFkZEFsbF8oYyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgaW5kZXggZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqLwotCXByaXZhdGUgaW50IGluZGV4KE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmluZGV4KHRoaXMuaGFzaChvKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgaGFzaCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICovCi0JcHJpdmF0ZSBpbnQgaGFzaChPYmplY3QgbykgewotCQlyZXR1cm4gKG8gPT0gbnVsbCkgPyAwIDogdGhpcy50d2Vha0hhc2goU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobykpOwotCX0KLQotCS8qKgotCSAqIFR3ZWFrIHRoZSBzcGVjaWZpZWQgaGFzaC4KLQkgKi8KLQlwcml2YXRlIGludCB0d2Vha0hhc2goaW50IGgpIHsKLQkJcmV0dXJuIGg7Ci0vLwkJaCBePSAoaCA+Pj4gMjApIF4gKGggPj4+IDEyKTsKLS8vCQlyZXR1cm4gaCBeIChoID4+PiA3KSBeIChoID4+PiA0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGZvciB0aGUgc3BlY2lmaWVkIGhhc2guCi0JICovCi0JcHJpdmF0ZSBpbnQgaW5kZXgoaW50IGhhc2gpIHsKLQkJcmV0dXJuIHRoaXMuaW5kZXgoaGFzaCwgdGhpcy50YWJsZS5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggZm9yIHRoZSBzcGVjaWZpZWQgaGFzaAotCSAqIHdpdGhpbiBhIHRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JaW50IGluZGV4KGludCBoYXNoLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBoYXNoICYgKGxlbmd0aCAtIDEpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsIHtAbGluayAjYWRkQWxsKENvbGxlY3Rpb24pfSBmb3IgY29uc3RydWN0aW9uIGFuZCBjbG9uaW5nLgotCSAqIChObyBjaGVjayBmb3IgcmUtaGFzaDsgbm8gY2hhbmdlIHRvIG1vZCBjb3VudDsgbm8gcmV0dXJuIHZhbHVlLikKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQWxsXyhJdGVyYWJsZTw/IGV4dGVuZHMgRT4gYykgewotCQlmb3IgKEUgZSA6IGMpIHsKLQkJCXRoaXMuYWRkXyhlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEludGVybmFsIHtAbGluayAjYWRkKE9iamVjdCl9IGZvciBjb25zdHJ1Y3Rpb24gYW5kIGNsb25pbmcuCi0JICogKE5vIGNoZWNrIGZvciByZS1oYXNoOyBubyBjaGFuZ2UgdG8gbW9kIGNvdW50OyBubyByZXR1cm4gdmFsdWUuKQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRfKEUgbykgewotCQl0aGlzLmFkZF8obywgMSk7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwge0BsaW5rICNhZGQoT2JqZWN0LCBpbnQpfSBmb3IgY29uc3RydWN0aW9uLCBjbG9uaW5nLCBhbmQgc2VyaWFsaXphdGlvbi4KLQkgKiAoTm8gY2hlY2sgZm9yIHJlLWhhc2g7IG5vIGNoYW5nZSB0byBtb2QgY291bnQ7IG5vIHJldHVybiB2YWx1ZS4pCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZF8oRSBvLCBpbnQgY250KSB7Ci0JCWludCBoYXNoID0gdGhpcy5oYXNoKG8pOwotCQlpbnQgaW5kZXggPSB0aGlzLmluZGV4KGhhc2gpOwotCQlmb3IgKEVudHJ5PEU+IGUgPSB0aGlzLnRhYmxlW2luZGV4XTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQlpZiAoZS5vYmplY3QgPT0gbykgewotCQkJCWUuY291bnQgKz0gY250OwotCQkJCXRoaXMuc2l6ZSArPSBjbnQ7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLy8gY3JlYXRlIHRoZSBuZXcgZW50cnkgYW5kIHB1dCBpdCBpbiB0aGUgdGFibGUKLQkJRW50cnk8RT4gZSA9IHRoaXMuYnVpbGRFbnRyeShoYXNoLCBvLCBjbnQsIHRoaXMudGFibGVbaW5kZXhdKTsKLQkJdGhpcy50YWJsZVtpbmRleF0gPSBlOwotCQl0aGlzLnNpemUgKz0gY250OwotCQl0aGlzLnVuaXF1ZUNvdW50Kys7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyB0aGUgbWFpbnRhaW5lZCBzaXplLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNpbXBseSBjb21wYXJlcyB0aGUgbWFpbnRhaW5lZCBzaXplIHRvIHplcm8uCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZSA9PSAwOwotCX0KLQotCS8qKgotCSAqIFNlYXJjaCBmb3IgdGhlIG9iamVjdCdzIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGlkZW50aXR5IGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JcHJpdmF0ZSBFbnRyeTxFPiBnZXRFbnRyeShPYmplY3QgbykgewotCQlmb3IgKEVudHJ5PEU+IGUgPSB0aGlzLnRhYmxlW3RoaXMuaW5kZXgobyldOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCWlmIChlLm9iamVjdCA9PSBvKSB7Ci0JCQkJcmV0dXJuIGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RW50cnkobykgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvdW50KE9iamVjdCBvKSB7Ci0JCUVudHJ5PEU+IGUgPSB0aGlzLmdldEVudHJ5KG8pOwotCQlyZXR1cm4gKGUgPT0gbnVsbCkgPyAwIDogZS5jb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBSZWhhc2ggdGhlIGNvbnRlbnRzIG9mIHRoZSBiYWcgaW50byBhIG5ldyBoYXNoIHRhYmxlCi0JICogd2l0aCBhIGxhcmdlciBjYXBhY2l0eS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlCi0JICogbnVtYmVyIG9mIGRpZmZlcmVudCBlbGVtZW50cyBpbiB0aGUgYmFnIGV4Y2VlZHMgaXRzCi0JICogY2FwYWNpdHkgYW5kIGxvYWQgZmFjdG9yLgotCSAqLwotCXByaXZhdGUgdm9pZCByZWhhc2goKSB7Ci0JCUVudHJ5PEU+W10gb2xkVGFibGUgPSB0aGlzLnRhYmxlOwotCQlpbnQgb2xkQ2FwYWNpdHkgPSBvbGRUYWJsZS5sZW5ndGg7Ci0KLQkJaWYgKG9sZENhcGFjaXR5ID09IE1BWElNVU1fQ0FQQUNJVFkpIHsKLQkJCXRoaXMudGhyZXNob2xkID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgbmV3Q2FwYWNpdHkgPSAyICogb2xkQ2FwYWNpdHk7Ci0JCUVudHJ5PEU+W10gbmV3VGFibGUgPSB0aGlzLmJ1aWxkVGFibGUobmV3Q2FwYWNpdHkpOwotCi0JCWZvciAoaW50IGkgPSBvbGRDYXBhY2l0eTsgaS0tID4gMDsgKSB7Ci0JCQlmb3IgKEVudHJ5PEU+IG9sZCA9IG9sZFRhYmxlW2ldOyBvbGQgIT0gbnVsbDsgKSB7Ci0JCQkJRW50cnk8RT4gZSA9IG9sZDsKLQkJCQlvbGQgPSBvbGQubmV4dDsKLQotCQkJCWludCBpbmRleCA9IHRoaXMuaW5kZXgoZS5oYXNoLCBuZXdDYXBhY2l0eSk7Ci0JCQkJZS5uZXh0ID0gbmV3VGFibGVbaW5kZXhdOwotCQkJCW5ld1RhYmxlW2luZGV4XSA9IGU7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLnRhYmxlID0gbmV3VGFibGU7Ci0JCXRoaXMudGhyZXNob2xkID0gKGludCkgKG5ld0NhcGFjaXR5ICogdGhpcy5sb2FkRmFjdG9yKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBFbnRyeTxFPltdIGJ1aWxkVGFibGUoaW50IGNhcGFjaXR5KSB7Ci0JCXJldHVybiBuZXcgRW50cnlbY2FwYWNpdHldOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIHRoZSBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUgYnkgY2FsY3VsYXRpbmcKLQkgKiB0aGUgb2JqZWN0J3MgaWRlbnRpdHkgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaAotCSAqIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvKSB7Ci0JCXJldHVybiB0aGlzLmFkZChvLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGlkZW50aXR5IGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbywgaW50IGNudCkgewotCQlpZiAoY250IDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQl0aGlzLm1vZENvdW50Kys7Ci0JCWludCBoYXNoID0gdGhpcy5oYXNoKG8pOwotCQlpbnQgaW5kZXggPSB0aGlzLmluZGV4KGhhc2gpOwotCi0JCS8vIGlmIHRoZSBvYmplY3QgaXMgYWxyZWFkeSBpbiB0aGUgYmFnLCBzaW1wbHkgYnVtcCBpdHMgY291bnQKLQkJZm9yIChFbnRyeTxFPiBlID0gdGhpcy50YWJsZVtpbmRleF07IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgewotCQkJaWYgKGUub2JqZWN0ID09IG8pIHsKLQkJCQllLmNvdW50ICs9IGNudDsKLQkJCQl0aGlzLnNpemUgKz0gY250OwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLy8gcmVoYXNoIHRoZSB0YWJsZSBpZiB3ZSBhcmUgZ29pbmcgdG8gZXhjZWVkIHRoZSB0aHJlc2hvbGQKLQkJaWYgKHRoaXMudW5pcXVlQ291bnQgPj0gdGhpcy50aHJlc2hvbGQpIHsKLQkJCXRoaXMucmVoYXNoKCk7Ci0JCQlpbmRleCA9IHRoaXMuaW5kZXgoaGFzaCk7ICAvLyBuZWVkIHRvIHJlLWNhbGN1bGF0ZSB0aGUgaW5kZXgKLQkJfQotCi0JCS8vIGNyZWF0ZSB0aGUgbmV3IGVudHJ5IGFuZCBwdXQgaXQgaW4gdGhlIHRhYmxlCi0JCUVudHJ5PEU+IGUgPSB0aGlzLmJ1aWxkRW50cnkoaGFzaCwgbywgY250LCB0aGlzLnRhYmxlW2luZGV4XSk7Ci0JCXRoaXMudGFibGVbaW5kZXhdID0gZTsKLQkJdGhpcy5zaXplICs9IGNudDsKLQkJdGhpcy51bmlxdWVDb3VudCsrOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoeyAidW5jaGVja2VkIiwgInJhd3R5cGVzIiB9KQotCXByaXZhdGUgRW50cnk8RT4gYnVpbGRFbnRyeShpbnQgaGFzaCwgT2JqZWN0IG8sIGludCBjbnQsIEVudHJ5IG5leHQpIHsKLQkJcmV0dXJuIG5ldyBFbnRyeTxFPihoYXNoLCAoRSkgbywgY250LCAoRW50cnk8RT4pIG5leHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIHRoZSBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUgYnkgY2FsY3VsYXRpbmcKLQkgKiB0aGUgb2JqZWN0J3MgaWRlbnRpdHkgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaAotCSAqIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlKG8sIDEpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIHRoZSBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUgYnkgY2FsY3VsYXRpbmcKLQkgKiB0aGUgb2JqZWN0J3MgaWRlbnRpdHkgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaAotCSAqIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8sIGludCBjbnQpIHsKLQkJaWYgKGNudCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGluZGV4ID0gdGhpcy5pbmRleChvKTsKLQotCQlmb3IgKEVudHJ5PEU+IGUgPSB0aGlzLnRhYmxlW2luZGV4XSwgcHJldiA9IG51bGw7IGUgIT0gbnVsbDsgcHJldiA9IGUsIGUgPSBlLm5leHQpIHsKLQkJCWlmIChlLm9iamVjdCA9PSBvKSB7Ci0JCQkJdGhpcy5tb2RDb3VudCsrOwotCQkJCWNudCA9IChjbnQgPCBlLmNvdW50KSA/IGNudCA6IGUuY291bnQ7Ci0JCQkJZS5jb3VudCAtPSBjbnQ7Ci0JCQkJLy8gaWYgd2UgYXJlIHJlbW92aW5nIHRoZSBsYXN0IGVsZW1lbnQocyksIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgdGFibGUKLQkJCQlpZiAoZS5jb3VudCA9PSAwKSB7Ci0JCQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkJCXRoaXMudGFibGVbaW5kZXhdID0gZS5uZXh0OwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJldi5uZXh0ID0gZS5uZXh0OwotCQkJCQl9Ci0JCQkJCXRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQl9Ci0JCQkJdGhpcy5zaXplIC09IGNudDsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgb2JqZWN0LWlkZW50aXR5IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQotCSAqIHNwZWNpZmllZCBjb2xsZWN0aW9uIGNvbnRhaW5zIGEgcGFydGljdWxhciBlbGVtZW50LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHN1cGVyLnJlbW92ZUFsbChuZXcgSWRlbnRpdHlIYXNoQmFnPE9iamVjdD4oYykpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBvYmplY3QtaWRlbnRpdHkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlCi0JICogc3BlY2lmaWVkIGNvbGxlY3Rpb24gY29udGFpbnMgYSBwYXJ0aWN1bGFyIGVsZW1lbnQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gc3VwZXIucmV0YWluQWxsKG5ldyBJZGVudGl0eUhhc2hCYWc8T2JqZWN0PihjKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgY2xlYXJzIG91dCBhbGwgb2YgdGhlIGhhc2ggdGFibGUgYnVja2V0cy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLnRhYmxlOwotCQl0aGlzLm1vZENvdW50Kys7Ci0JCWZvciAoaW50IGkgPSB0YWIubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCXRhYltpXSA9IG51bGw7Ci0JCX0KLQkJdGhpcy5zaXplID0gMDsKLQkJdGhpcy51bmlxdWVDb3VudCA9IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHNoYWxsb3cgY29weSBvZiB0aGlzIGJhZzogdGhlIGVsZW1lbnRzCi0JICogdGhlbXNlbHZlcyBhcmUgbm90IGNsb25lZC4KLQkgKgotCSAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBiYWcuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElkZW50aXR5SGFzaEJhZzxFPiBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJSWRlbnRpdHlIYXNoQmFnPEU+IGNsb25lID0gKElkZW50aXR5SGFzaEJhZzxFPikgc3VwZXIuY2xvbmUoKTsKLQkJCWNsb25lLnRhYmxlID0gdGhpcy5idWlsZFRhYmxlKHRoaXMudGFibGUubGVuZ3RoKTsKLQkJCWNsb25lLnNpemUgPSAwOwotCQkJY2xvbmUudW5pcXVlQ291bnQgPSAwOwotCQkJY2xvbmUubW9kQ291bnQgPSAwOwotCQkJY2xvbmUuYWRkQWxsXyh0aGlzKTsKLQkJCXJldHVybiBjbG9uZTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogSGFzaCB0YWJsZSBjb2xsaXNpb24gbGlzdCBlbnRyeS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFbnRyeTxFPiBpbXBsZW1lbnRzIEJhZy5FbnRyeTxFPiB7Ci0JCWZpbmFsIGludCBoYXNoOyAgLy8gY2FjaGUgdGhlIGhhc2ggZm9yIHJlLWhhc2hlcwotCQlmaW5hbCBFIG9iamVjdDsKLQkJaW50IGNvdW50OwotCQlFbnRyeTxFPiBuZXh0OwotCi0JCUVudHJ5KGludCBoYXNoLCBFIG9iamVjdCwgaW50IGNvdW50LCBFbnRyeTxFPiBuZXh0KSB7Ci0JCQl0aGlzLmhhc2ggPSBoYXNoOwotCQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JCQl0aGlzLm5leHQgPSBuZXh0OwotCQl9Ci0KLQkJLy8gKioqKiogQmFnLkVudHJ5IGltcGxlbWVudGF0aW9uCi0JCXB1YmxpYyBFIGdldEVsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5vYmplY3Q7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvdW50KCkgewotCQkJcmV0dXJuIHRoaXMuY291bnQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IHNldENvdW50KGludCBjb3VudCkgewotCQkJaWYgKGNvdW50IDw9IDApIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvOiAiICsgY291bnQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgb2xkID0gdGhpcy5jb3VudDsKLQkJCXRoaXMuY291bnQgPSBjb3VudDsKLQkJCXJldHVybiBvbGQ7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBCYWcuRW50cnk8Pz4pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJCUJhZy5FbnRyeSBlID0gKEJhZy5FbnRyeSkgbzsKLQkJCXJldHVybiAodGhpcy5vYmplY3QgPT0gZS5nZXRFbGVtZW50KCkpCi0JCQkJCSYmICh0aGlzLmNvdW50ID09IGUuZ2V0Q291bnQoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCUUgbyA9IHRoaXMub2JqZWN0OwotCQkJcmV0dXJuIChvID09IG51bGwpID8gMCA6ICh0aGlzLmNvdW50ICogby5oYXNoQ29kZSgpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMub2JqZWN0ICsgIj0+IiArIHRoaXMuY291bnQ7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMuc2l6ZSA9PSAwKSA/IEVNUFRZX0lURVJBVE9SIDogbmV3IEhhc2hJdGVyYXRvcigpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYXRvcjxFPiB1bmlxdWVJdGVyYXRvcigpIHsKLQkJcmV0dXJuICh0aGlzLnNpemUgPT0gMCkgPyBFTVBUWV9JVEVSQVRPUiA6IG5ldyBVbmlxdWVJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBpbnQgdW5pcXVlQ291bnQoKSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUNvdW50OwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYXRvcjxCYWcuRW50cnk8RT4+IGVudHJpZXMoKSB7Ci0JCXJldHVybiAodGhpcy5zaXplID09IDApID8gRU1QVFlfSVRFUkFUT1IgOiBuZXcgRW50cnlJdGVyYXRvcigpOwotCX0KLQotCi0JLyoqCi0JICogRW1wdHkgaXRlcmF0b3IgdGhhdCBkb2VzIGp1c3QgYWJvdXQgbm90aGluZy4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhdG9yIEVNUFRZX0lURVJBVE9SID0gbmV3IEVtcHR5SXRlcmF0b3IoKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW1wdHlJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQotCQlFbXB0eUl0ZXJhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIEhhc2hJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKLQkJcHJpdmF0ZSBpbnQgaW5kZXggPSBJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZS5sZW5ndGg7CS8vIHN0YXJ0IGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlCi0JCXByaXZhdGUgRW50cnk8RT4gbmV4dEVudHJ5ID0gbnVsbDsKLQkJcHJpdmF0ZSBpbnQgbmV4dEVudHJ5Q291bnQgPSAwOwotCQlwcml2YXRlIEVudHJ5PEU+IGxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsKLQotCQkvKioKLQkJICogVGhlIG1vZENvdW50IHZhbHVlIHRoYXQgdGhlIGl0ZXJhdG9yIGJlbGlldmVzIHRoYXQgdGhlIGJhY2tpbmcKLQkJICogYmFnIHNob3VsZCBoYXZlLiBJZiB0aGlzIGV4cGVjdGF0aW9uIGlzIHZpb2xhdGVkLCB0aGUgaXRlcmF0b3IKLQkJICogaGFzIGRldGVjdGVkIGEgY29uY3VycmVudCBtb2RpZmljYXRpb24uCi0JCSAqLwotCQlwcml2YXRlIGludCBleHBlY3RlZE1vZENvdW50ID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMubW9kQ291bnQ7Ci0KLQkJSGFzaEl0ZXJhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlFbnRyeTxFPiBlID0gdGhpcy5uZXh0RW50cnk7Ci0JCQlpbnQgaSA9IHRoaXMuaW5kZXg7Ci0JCQlFbnRyeTxFPltdIHRhYiA9IElkZW50aXR5SGFzaEJhZy50aGlzLnRhYmxlOwotCQkJLy8gVXNlIGxvY2FscyBmb3IgZmFzdGVyIGxvb3AgaXRlcmF0aW9uCi0JCQl3aGlsZSAoKGUgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWUgPSB0YWJbLS1pXTsJCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIHRhYmxlCi0JCQl9Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGU7Ci0JCQl0aGlzLmluZGV4ID0gaTsKLQkJCXJldHVybiBlICE9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgRSBuZXh0KCkgewotCQkJaWYgKElkZW50aXR5SGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPiBldCA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSBJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZTsKLQkJCS8vIFVzZSBsb2NhbHMgZm9yIGZhc3RlciBsb29wIGl0ZXJhdGlvbgotCQkJd2hpbGUgKChldCA9PSBudWxsKSAmJiAoaSA+IDApKSB7Ci0JCQkJZXQgPSB0YWJbLS1pXTsJCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIHRhYmxlCi0JCQl9Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGV0OwotCQkJdGhpcy5pbmRleCA9IGk7Ci0JCQlpZiAoZXQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPiBlID0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9IHRoaXMubmV4dEVudHJ5OwotCQkJdGhpcy5uZXh0RW50cnlDb3VudCsrOwotCQkJaWYgKHRoaXMubmV4dEVudHJ5Q291bnQgPT0gZS5jb3VudCkgewotCQkJCXRoaXMubmV4dEVudHJ5ID0gZS5uZXh0OwotCQkJCXRoaXMubmV4dEVudHJ5Q291bnQgPSAwOwotCQkJfQotCQkJcmV0dXJuIGUub2JqZWN0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJaWYgKHRoaXMubGFzdFJldHVybmVkRW50cnkgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWlmIChJZGVudGl0eUhhc2hCYWcudGhpcy5tb2RDb3VudCAhPSB0aGlzLmV4cGVjdGVkTW9kQ291bnQpIHsKLQkJCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJaW50IHNsb3QgPSBJZGVudGl0eUhhc2hCYWcudGhpcy5pbmRleCh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5Lmhhc2gsIElkZW50aXR5SGFzaEJhZy50aGlzLnRhYmxlLmxlbmd0aCk7Ci0JCQlmb3IgKEVudHJ5PEU+IGUgPSBJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZVtzbG90XSwgcHJldiA9IG51bGw7IGUgIT0gbnVsbDsgcHJldiA9IGUsIGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoZSA9PSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5KSB7Ci0JCQkJCUlkZW50aXR5SGFzaEJhZy50aGlzLm1vZENvdW50Kys7Ci0JCQkJCXRoaXMuZXhwZWN0ZWRNb2RDb3VudCsrOwotCQkJCQllLmNvdW50LS07Ci0JCQkJCWlmIChlLmNvdW50ID09IDApIHsKLQkJCQkJCS8vIGlmIHdlIGFyZSByZW1vdmluZyB0aGUgbGFzdCBvbmUsIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgdGFibGUKLQkJCQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkJCQlJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZVtzbG90XSA9IGUubmV4dDsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcHJldi5uZXh0ID0gZS5uZXh0OwotCQkJCQkJfQotCQkJCQkJSWRlbnRpdHlIYXNoQmFnLnRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIHNsaWRlIGJhY2sgdGhlIGNvdW50IHRvIGFjY291bnQgZm9yIHRoZSBqdXN0LXJlbW92ZWQgZWxlbWVudAotCQkJCQkJdGhpcy5uZXh0RW50cnlDb3VudC0tOwotCQkJCQl9Ci0JCQkJCUlkZW50aXR5SGFzaEJhZy50aGlzLnNpemUtLTsKLQkJCQkJdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9IG51bGw7CS8vIGl0IGNhbm5vdCBiZSByZW1vdmVkIGFnYWluCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgRW50cnlJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPEVudHJ5PEU+PiB7Ci0JCXByaXZhdGUgaW50IGluZGV4ID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMudGFibGUubGVuZ3RoOwkvLyBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZQotCQlwcml2YXRlIEVudHJ5PEU+IG5leHRFbnRyeSA9IG51bGw7Ci0JCXByaXZhdGUgRW50cnk8RT4gbGFzdFJldHVybmVkRW50cnkgPSBudWxsOwotCi0JCS8qKgotCQkgKiBUaGUgbW9kQ291bnQgdmFsdWUgdGhhdCB0aGUgaXRlcmF0b3IgYmVsaWV2ZXMgdGhhdCB0aGUgYmFja2luZwotCQkgKiBiYWcgc2hvdWxkIGhhdmUuIElmIHRoaXMgZXhwZWN0YXRpb24gaXMgdmlvbGF0ZWQsIHRoZSBpdGVyYXRvcgotCQkgKiBoYXMgZGV0ZWN0ZWQgYSBjb25jdXJyZW50IG1vZGlmaWNhdGlvbi4KLQkJICovCi0JCXByaXZhdGUgaW50IGV4cGVjdGVkTW9kQ291bnQgPSBJZGVudGl0eUhhc2hCYWcudGhpcy5tb2RDb3VudDsKLQotCQlFbnRyeUl0ZXJhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlFbnRyeTxFPiBlID0gdGhpcy5uZXh0RW50cnk7Ci0JCQlpbnQgaSA9IHRoaXMuaW5kZXg7Ci0JCQlFbnRyeTxFPltdIHRhYiA9IElkZW50aXR5SGFzaEJhZy50aGlzLnRhYmxlOwotCQkJLy8gVXNlIGxvY2FscyBmb3IgZmFzdGVyIGxvb3AgaXRlcmF0aW9uCi0JCQl3aGlsZSAoKGUgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWUgPSB0YWJbLS1pXTsJCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIHRhYmxlCi0JCQl9Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGU7Ci0JCQl0aGlzLmluZGV4ID0gaTsKLQkJCXJldHVybiBlICE9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgRW50cnk8RT4gbmV4dCgpIHsKLQkJCWlmIChJZGVudGl0eUhhc2hCYWcudGhpcy5tb2RDb3VudCAhPSB0aGlzLmV4cGVjdGVkTW9kQ291bnQpIHsKLQkJCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT4gZXQgPSB0aGlzLm5leHRFbnRyeTsKLQkJCWludCBpID0gdGhpcy5pbmRleDsKLQkJCUVudHJ5PEU+W10gdGFiID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMudGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZXQgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWV0ID0gdGFiWy0taV07CQkvLyBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0YWJsZQotCQkJfQotCQkJdGhpcy5uZXh0RW50cnkgPSBldDsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJaWYgKGV0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT4gZSA9IHRoaXMubGFzdFJldHVybmVkRW50cnkgPSB0aGlzLm5leHRFbnRyeTsKLQkJCXRoaXMubmV4dEVudHJ5ID0gZS5uZXh0OwotCQkJcmV0dXJuIGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQlpZiAodGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJfQotCQkJaWYgKElkZW50aXR5SGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpbnQgc2xvdCA9IElkZW50aXR5SGFzaEJhZy50aGlzLmluZGV4KHRoaXMubGFzdFJldHVybmVkRW50cnkuaGFzaCwgSWRlbnRpdHlIYXNoQmFnLnRoaXMudGFibGUubGVuZ3RoKTsKLQkJCWZvciAoRW50cnk8RT4gZSA9IElkZW50aXR5SGFzaEJhZy50aGlzLnRhYmxlW3Nsb3RdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCkgewotCQkJCWlmIChlID09IHRoaXMubGFzdFJldHVybmVkRW50cnkpIHsKLQkJCQkJSWRlbnRpdHlIYXNoQmFnLnRoaXMubW9kQ291bnQrKzsKLQkJCQkJdGhpcy5leHBlY3RlZE1vZENvdW50Kys7Ci0JCQkJCS8vIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgdGFibGUKLQkJCQkJaWYgKHByZXYgPT0gbnVsbCkgewotCQkJCQkJSWRlbnRpdHlIYXNoQmFnLnRoaXMudGFibGVbc2xvdF0gPSBlLm5leHQ7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwcmV2Lm5leHQgPSBlLm5leHQ7Ci0JCQkJCX0KLQkJCQkJSWRlbnRpdHlIYXNoQmFnLnRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQkJSWRlbnRpdHlIYXNoQmFnLnRoaXMuc2l6ZSAtPSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5LmNvdW50OwotCQkJCQl0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsJLy8gaXQgY2Fubm90IGJlIHJlbW92ZWQgYWdhaW4KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBVbmlxdWVJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKLQkJcHJpdmF0ZSBFbnRyeUl0ZXJhdG9yIGVudHJ5SXRlcmF0b3IgPSBuZXcgRW50cnlJdGVyYXRvcigpOwotCQkKLQkJVW5pcXVlSXRlcmF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiB0aGlzLmVudHJ5SXRlcmF0b3IuaGFzTmV4dCgpOwotCQl9Ci0KLQkJcHVibGljIEUgbmV4dCgpIHsKLQkJCXJldHVybiB0aGlzLmVudHJ5SXRlcmF0b3IubmV4dCgpLm9iamVjdDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRoaXMuZW50cnlJdGVyYXRvci5yZW1vdmUoKTsKLQkJfQotCi0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIElkZW50aXR5SGFzaEJhZzw/PikgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlJZGVudGl0eUhhc2hCYWc8RT4gYiA9IChJZGVudGl0eUhhc2hCYWc8RT4pIG87Ci0JCQlpZiAoYi5zaXplKCkgIT0gdGhpcy5zaXplKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoYi51bmlxdWVDb3VudCgpICE9IHRoaXMudW5pcXVlQ291bnQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3I8QmFnLkVudHJ5PEU+PiBzdHJlYW0gPSBiLmVudHJpZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJQmFnLkVudHJ5PEU+IGVudHJ5ID0gc3RyZWFtLm5leHQoKTsKLQkJCQlpZiAoZW50cnkuZ2V0Q291bnQoKSAhPSB0aGlzLmNvdW50KGVudHJ5LmdldEVsZW1lbnQoKSkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHRoaXMuZXF1YWxzXyhvKTsKLQkJfQotLy8JCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEJhZzw/PikgewotLy8JCQkvLyBobW1tLi4uCi0vLwkJCXJldHVybiBuZXcgSGFzaEJhZzxPYmplY3Q+KHRoaXMpLmVxdWFscyhvKTsKLS8vCQl9IGVsc2UgewotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBlcXVhbHNfKE9iamVjdCBvKSB7Ci0JCS8vIGhtbW0uLi4KLQkJcmV0dXJuIChvIGluc3RhbmNlb2YgQmFnPD8+KSAmJiAKLQkJCQluZXcgSGFzaEJhZzxPYmplY3Q+KHRoaXMpLmVxdWFscyhvKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgaCA9IDA7Ci0JCWZvciAoRSBvIDogdGhpcykgewotCQkJaCArPSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShvKTsKLQkJfQotCQlyZXR1cm4gaDsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRoZSBzdGF0ZSBvZiB0aGlzIGJhZyB0byBhIHN0cmVhbSAoaS5lLiBzZXJpYWxpemUgaXQpLgotCSAqCi0JICogQHNlcmlhbERhdGEgRW1pdCB0aGUgY2FwYWNpdHkgb2YgdGhlIGJhZyAoaW50KSwKLQkgKiAgICAgZm9sbG93ZWQgYnkgdGhlIG51bWJlciBvZiB1bmlxdWUgZWxlbWVudHMgaW4gdGhlIGJhZyAoaW50KSwKLQkgKiAgICAgZm9sbG93ZWQgYnkgYWxsIG9mIHRoZSBiYWcncyBlbGVtZW50cyAoZWFjaCBhbiBPYmplY3QpIGFuZAotCSAqICAgICB0aGVpciBjb3VudHMgKGVhY2ggYW4gaW50KSwgaW4gbm8gcGFydGljdWxhciBvcmRlci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gcykKLQkJCQl0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCS8vIHdyaXRlIG91dCB0aGUgdGhyZXNob2xkLCBsb2FkIGZhY3RvciwgYW5kIGFueSBoaWRkZW4gc3R1ZmYKLQkJcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQotCQkvLyB3cml0ZSBvdXQgbnVtYmVyIG9mIGJ1Y2tldHMKLQkJcy53cml0ZUludCh0aGlzLnRhYmxlLmxlbmd0aCk7Ci0KLQkJLy8gd3JpdGUgb3V0IG51bWJlciBvZiB1bmlxdWUgZWxlbWVudHMKLQkJcy53cml0ZUludCh0aGlzLnVuaXF1ZUNvdW50KTsKLQotCQkvLyB3cml0ZSBvdXQgZWxlbWVudHMgYW5kIGNvdW50cyAoYWx0ZXJuYXRpbmcpCi0JCWlmICh0aGlzLnVuaXF1ZUNvdW50ID4gMCkgewotCQkJZm9yIChFbnRyeTxFPiBlbnRyeSA6IHRoaXMudGFibGUpIHsKLQkJCQl3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotCQkJCQlzLndyaXRlT2JqZWN0KGVudHJ5Lm9iamVjdCk7Ci0JCQkJCXMud3JpdGVJbnQoZW50cnkuY291bnQpOwotCQkJCQllbnRyeSA9IGVudHJ5Lm5leHQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBSZWNvbnN0aXR1dGUgdGhlIGJhZyBmcm9tIGEgc3RyZWFtIChpLmUuIGRlc2VyaWFsaXplIGl0KS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIHMpCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkvLyByZWFkIGluIHRoZSB0aHJlc2hvbGQsIGxvYWRmYWN0b3IsIGFuZCBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFJlYWRPYmplY3QoKTsKLQotCQkvLyByZWFkIGluIG51bWJlciBvZiBidWNrZXRzIGFuZCBhbGxvY2F0ZSB0aGUgYnVja2V0IGFycmF5Ci0JCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUocy5yZWFkSW50KCkpOwotCi0JCS8vIHJlYWQgaW4gbnVtYmVyIG9mIHVuaXF1ZSBlbGVtZW50cwotCQlpbnQgdW5pcXVlID0gcy5yZWFkSW50KCk7Ci0KLQkJLy8gcmVhZCB0aGUgZWxlbWVudHMgYW5kIGNvdW50cywgYW5kIHB1dCB0aGUgZWxlbWVudHMgaW4gdGhlIGJhZwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVuaXF1ZTsgaSsrKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUUgZWxlbWVudCA9IChFKSBzLnJlYWRPYmplY3QoKTsKLQkJCWludCBlbGVtZW50Q291bnQgPSBzLnJlYWRJbnQoKTsKLQkJCXRoaXMuYWRkXyhlbGVtZW50LCBlbGVtZW50Q291bnQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9JbnRSZWZlcmVuY2UuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0ludFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzkwNDU3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0ludFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgYSBjb250YWluZXIgZm9yIGhvbGRpbmcgYW4gPGNvZGU+aW50PC9jb2RlPiB0aGF0IGNhbm5vdCBiZQotICogY2hhbmdlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEludFJlZmVyZW5jZQotCWV4dGVuZHMgQ29tcGFyYWJsZTxJbnRSZWZlcmVuY2U+Ci17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUuCi0JICovCi0JaW50IGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIGlzIGVxdWFsIHRvIHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIGVxdWFscyhpbnQgdik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIGlzIG5vdCBlcXVhbCB0bwotCSAqIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JYm9vbGVhbiBub3RFcXVhbChpbnQgdik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIGlzIHplcm8uCi0JICovCi0JYm9vbGVhbiBpc1plcm8oKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUgaXMgbm90IHplcm8uCi0JICovCi0JYm9vbGVhbiBpc05vdFplcm8oKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUgaXMgZ3JlYXRlciB0aGFuCi0JICogdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIGlzR3JlYXRlclRoYW4oaW50IHYpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBpcyBncmVhdGVyIHRoYW4KLQkgKiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCWJvb2xlYW4gaXNHcmVhdGVyVGhhbk9yRXF1YWwoaW50IHYpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBpcyBsZXNzIHRoYW4KLQkgKiB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCWJvb2xlYW4gaXNMZXNzVGhhbihpbnQgdik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIGlzIGxlc3MgdGhhbgotCSAqIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JYm9vbGVhbiBpc0xlc3NUaGFuT3JFcXVhbChpbnQgdik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIGlzIHBvc2l0aXZlLgotCSAqLwotCWJvb2xlYW4gaXNQb3NpdGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBpcyBub3QgcG9zaXRpdmUKLQkgKiAoaS5lLiBuZWdhdGl2ZSBvciB6ZXJvKS4KLQkgKi8KLQlib29sZWFuIGlzTm90UG9zaXRpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUgaXMgbmVnYXRpdmUuCi0JICovCi0JYm9vbGVhbiBpc05lZ2F0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIGlzIG5vdCBuZWdhdGl2ZQotCSAqIChpLmUuIHplcm8gb3IgcG9zaXRpdmUpLgotCSAqLwotCWJvb2xlYW4gaXNOb3ROZWdhdGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlLgotCSAqLwotCWludCBhYnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmVnYXRpdmUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZS4KLQkgKi8KLQlpbnQgbmVnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBwbHVzIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JaW50IGFkZChpbnQgdik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIG1pbnVzIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JaW50IHN1YnRyYWN0KGludCB2KTsKLQotCS8qKgotCSAqIFJldHVybiBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUgbXVsdGlwbGllZCBieSB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCWludCBtdWx0aXBseShpbnQgdik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIGRpdmlkZWQgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlpbnQgZGl2aWRlKGludCB2KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVtYWluZGVyIG9mIHRoZSBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUgZGl2aWRlZCBieQotCSAqIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JaW50IHJlbWFpbmRlcihpbnQgdik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1pbmltdW0gb2YgdGhlIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBhbmQKLQkgKiB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCWludCBtaW4oaW50IHYpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXhpbXVtIG9mIHRoZSBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUgYW5kCi0JICogdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlpbnQgbWF4KGludCB2KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIHJhaXNlZCB0byB0aGUgcG93ZXIKLQkgKiBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCWRvdWJsZSBwb3coaW50IHYpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvSkRCQ1Rvb2xzLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9KREJDVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY2M2E4ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9KREJDVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuc3FsLlR5cGVzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5KYXZhVHlwZTsKLQotLyoqCi0gKiBIZWxwZXIgbWV0aG9kcyBmb3IgZGVhbGluZyB3aXRoIHRoZSBKREJDIEFQSS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEpEQkNUb29scyB7Ci0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRCQyB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBKREJDVHlwZSBqZGJjVHlwZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlKYXZhVG9KREJDVHlwZU1hcHBpbmcgbWFwcGluZyA9IGphdmFUb0pEQkNUeXBlTWFwcGluZyhjbGFzc05hbWUpOwotCQlyZXR1cm4gKG1hcHBpbmcgPT0gbnVsbCkgPyBERUZBVUxUX0pEQkNfVFlQRSA6IG1hcHBpbmcuZ2V0SkRCQ1R5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpEQkMgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSkRCQ1R5cGUgamRiY1R5cGVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBqZGJjVHlwZUZvckNsYXNzTmFtZWQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKREJDIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpEQkNUeXBlIGpkYmNUeXBlRm9yKEphdmFUeXBlIGphdmFUeXBlKSB7Ci0JCXJldHVybiBqZGJjVHlwZUZvckNsYXNzTmFtZWQoamF2YVR5cGUuZ2V0SmF2YUNsYXNzTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgSkRCQyB0eXBlLgotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlIGphdmFUeXBlRm9ySkRCQ1R5cGVOYW1lZChTdHJpbmcgamRiY1R5cGVOYW1lKSB7Ci0JCUpEQkNUb0phdmFUeXBlTWFwcGluZyBtYXBwaW5nID0gamRiY1RvSmF2YVR5cGVNYXBwaW5nKGpkYmNUeXBlTmFtZSk7Ci0JCXJldHVybiAobWFwcGluZyA9PSBudWxsKSA/IERFRkFVTFRfSkFWQV9UWVBFIDogbWFwcGluZy5nZXRKYXZhVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBKREJDIHR5cGUuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGUgamF2YVR5cGVGb3IoSkRCQ1R5cGUgamRiY1R5cGUpIHsKLQkJcmV0dXJuIGphdmFUeXBlRm9ySkRCQ1R5cGVOYW1lZChqZGJjVHlwZS5uYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBKREJDIHR5cGUuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGUgamF2YVR5cGVGb3JKREJDVHlwZUNvZGUoaW50IGpkYmNUeXBlQ29kZSkgewotCQlyZXR1cm4gamF2YVR5cGVGb3IoSkRCQ1R5cGUudHlwZShqZGJjVHlwZUNvZGUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgc3R1ZmYgKioqKioqKioqKgotCi0KLQkvLyAqKioqKioqKioqIEpEQkMgPT4gSmF2YSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBKREJDID0+IEphdmEgdHlwZSBtYXBwaW5ncywga2V5ZWQgYnkgSkRCQyB0eXBlIG5hbWUgKGUuZy4gIlZBUkNIQVIiKQotCSAqLwotCXByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IEpEQkNfVE9fSkFWQV9UWVBFX01BUFBJTkdTOyAgLy8gcHNldWRvICdmaW5hbCcgLSBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgREVGQVVMVF9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7ICAvLyBUT0RPIE9iamVjdCBpcyB0aGUgZGVmYXVsdD8KLQotCi0JcHJpdmF0ZSBzdGF0aWMgSkRCQ1RvSmF2YVR5cGVNYXBwaW5nIGpkYmNUb0phdmFUeXBlTWFwcGluZyhTdHJpbmcgamRiY1R5cGVOYW1lKSB7Ci0JCXJldHVybiBqZGJjVG9KYXZhVHlwZU1hcHBpbmdzKCkuZ2V0KGpkYmNUeXBlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IGpkYmNUb0phdmFUeXBlTWFwcGluZ3MoKSB7Ci0JCWlmIChKREJDX1RPX0pBVkFfVFlQRV9NQVBQSU5HUyA9PSBudWxsKSB7Ci0JCQlKREJDX1RPX0pBVkFfVFlQRV9NQVBQSU5HUyA9IGJ1aWxkSkRCQ1RvSmF2YVR5cGVNYXBwaW5ncygpOwotCQl9Ci0JCXJldHVybiBKREJDX1RPX0pBVkFfVFlQRV9NQVBQSU5HUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSkRCQ1RvSmF2YVR5cGVNYXBwaW5nPiBidWlsZEpEQkNUb0phdmFUeXBlTWFwcGluZ3MoKSB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IG1hcHBpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+KCk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ3NUbyhtYXBwaW5ncyk7Ci0JCXJldHVybiBtYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBoYXJkIGNvZGUgdGhlIGRlZmF1bHQgbWFwcGluZ3MgZnJvbSB0aGUgSkRCQyB0eXBlcyB0byB0aGUKLQkgKiBhcHByb3ByaWF0ZSBKYXZhIHR5cGVzCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqIHNlZSAiSkRCQyAzLjAgU3BlY2lmaWNhdGlvbiIgQXBwZW5kaXggQgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nc1RvKEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IG1hcHBpbmdzKSB7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkFSUkFZLCBqYXZhLnNxbC5BcnJheS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5CSUdJTlQsIGxvbmcuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQklOQVJZLCBieXRlW10uY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQklULCBib29sZWFuLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkJMT0IsIGphdmEuc3FsLkJsb2IuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQk9PTEVBTiwgYm9vbGVhbi5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5DSEFSLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkNMT0IsIGphdmEuc3FsLkNsb2IuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuREFUQUxJTkssIGphdmEubmV0LlVSTC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5EQVRFLCBqYXZhLnNxbC5EYXRlLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkRFQ0lNQUwsIGphdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkRJU1RJTkNULCBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBtYXBwaW5ncyk7ICAvLyA/Pz8KLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuRE9VQkxFLCBkb3VibGUuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuRkxPQVQsIGRvdWJsZS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5JTlRFR0VSLCBpbnQuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuSkFWQV9PQkpFQ1QsIGphdmEubGFuZy5PYmplY3QuY2xhc3MsIG1hcHBpbmdzKTsgIC8vID8/PwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5MT05HVkFSQklOQVJZLCBieXRlW10uY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuTE9OR1ZBUkNIQVIsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIG1hcHBpbmdzKTsKLQkJLy8gbm90IHN1cmUgd2h5IHRoaXMgaXMgZGVmaW5lZCBpbiBqYXZhLnNxbC5UeXBlcwotLy8JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLk5VTEwsIGphdmEubGFuZy5PYmplY3QuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuTlVNRVJJQywgamF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuT1RIRVIsIGphdmEubGFuZy5PYmplY3QuY2xhc3MsIG1hcHBpbmdzKTsJLy8gPz8/Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlJFQUwsIGZsb2F0LmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlJFRiwgamF2YS5zcWwuUmVmLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlNNQUxMSU5ULCBzaG9ydC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5TVFJVQ1QsIGphdmEuc3FsLlN0cnVjdC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5USU1FLCBqYXZhLnNxbC5UaW1lLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlRJTUVTVEFNUCwgamF2YS5zcWwuVGltZXN0YW1wLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlRJTllJTlQsIGJ5dGUuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuVkFSQklOQVJZLCBieXRlW10uY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuVkFSQ0hBUiwgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgbWFwcGluZ3MpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oaW50IGpkYmNUeXBlQ29kZSwgQ2xhc3M8Pz4gamF2YUNsYXNzLCBIYXNoTWFwPFN0cmluZywgSkRCQ1RvSmF2YVR5cGVNYXBwaW5nPiBtYXBwaW5ncykgewotCQkvLyBjaGVjayBmb3IgZHVwbGljYXRlcwotCQlKREJDVHlwZSBqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoamRiY1R5cGVDb2RlKTsKLQkJT2JqZWN0IHByZXYgPSBtYXBwaW5ncy5wdXQoamRiY1R5cGUubmFtZSgpLCBidWlsZEpEQkNUb0phdmFUeXBlTWFwcGluZyhqZGJjVHlwZSwgamF2YUNsYXNzKSk7Ci0JCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cGxpY2F0ZSBKREJDIHR5cGU6ICIgKyBqZGJjVHlwZS5uYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBKREJDVG9KYXZhVHlwZU1hcHBpbmcgYnVpbGRKREJDVG9KYXZhVHlwZU1hcHBpbmcoSkRCQ1R5cGUgamRiY1R5cGUsIENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gbmV3IEpEQkNUb0phdmFUeXBlTWFwcGluZyhqZGJjVHlwZSwgbmV3IFNpbXBsZUphdmFUeXBlKGphdmFDbGFzcykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhID0+IEpEQkMgKioqKioqKioqKgotCi0JLyoqCi0JICogSmF2YSA9PiBKREJDIHR5cGUgbWFwcGluZ3MsIGtleWVkIGJ5IEphdmEgY2xhc3MgbmFtZSAoZS5nLiAiamF2YS5sYW5nLk9iamVjdCIpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEphdmFUb0pEQkNUeXBlTWFwcGluZz4gSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1M7ICAvLyBwc2V1ZG8gJ2ZpbmFsJyAtIGxhenktaW5pdGlhbGl6ZWQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKREJDVHlwZSBERUZBVUxUX0pEQkNfVFlQRSA9IEpEQkNUeXBlLnR5cGUoVHlwZXMuVkFSQ0hBUik7ICAvLyBUT0RPIFZBUkNIQVIgaXMgdGhlIGRlZmF1bHQ/Ci0KLQotCXByaXZhdGUgc3RhdGljIEphdmFUb0pEQkNUeXBlTWFwcGluZyBqYXZhVG9KREJDVHlwZU1hcHBpbmcoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gamF2YVRvSkRCQ1R5cGVNYXBwaW5ncygpLmdldChjbGFzc05hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBqYXZhVG9KREJDVHlwZU1hcHBpbmdzKCkgewotCQlpZiAoSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1MgPT0gbnVsbCkgewotCQkJSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1MgPSBidWlsZEphdmFUb0pEQkNUeXBlTWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1M7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEphdmFUb0pEQkNUeXBlTWFwcGluZz4gYnVpbGRKYXZhVG9KREJDVHlwZU1hcHBpbmdzKCkgewotCQlIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBtYXBwaW5ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPigpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdzVG8obWFwcGluZ3MpOwotCQlyZXR1cm4gbWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogaGFyZCBjb2RlIHRoZSBkZWZhdWx0IG1hcHBpbmdzIGZyb20gdGhlIEphdmEgdHlwZXMgdG8gdGhlCi0JICogYXBwcm9wcmlhdGUgSkRCQyB0eXBlcwotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKiBzZWUgIkpEQkMgMy4wIFNwZWNpZmljYXRpb24iIEFwcGVuZGl4IEIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ3NUbyhIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBtYXBwaW5ncykgewotCQkvLyBwcmltaXRpdmVzCi0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGJvb2xlYW4uY2xhc3MsIFR5cGVzLkJJVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhieXRlLmNsYXNzLCBUeXBlcy5USU5ZSU5ULCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGRvdWJsZS5jbGFzcywgVHlwZXMuRE9VQkxFLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGZsb2F0LmNsYXNzLCBUeXBlcy5SRUFMLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGludC5jbGFzcywgVHlwZXMuSU5URUdFUiwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhsb25nLmNsYXNzLCBUeXBlcy5CSUdJTlQsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oc2hvcnQuY2xhc3MsIFR5cGVzLlNNQUxMSU5ULCBtYXBwaW5ncyk7Ci0KLQkJLy8gcmVmZXJlbmNlIGNsYXNzZXMKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MsIFR5cGVzLkJJVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuQnl0ZS5jbGFzcywgVHlwZXMuVElOWUlOVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuRG91YmxlLmNsYXNzLCBUeXBlcy5ET1VCTEUsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkZsb2F0LmNsYXNzLCBUeXBlcy5SRUFMLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLCBUeXBlcy5JTlRFR0VSLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubGFuZy5Mb25nLmNsYXNzLCBUeXBlcy5CSUdJTlQsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLlNob3J0LmNsYXNzLCBUeXBlcy5TTUFMTElOVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBUeXBlcy5WQVJDSEFSLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBUeXBlcy5OVU1FUklDLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubmV0LlVSTC5jbGFzcywgVHlwZXMuREFUQUxJTkssIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuQXJyYXkuY2xhc3MsIFR5cGVzLkFSUkFZLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLkJsb2IuY2xhc3MsIFR5cGVzLkJMT0IsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuQ2xvYi5jbGFzcywgVHlwZXMuQ0xPQiwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLnNxbC5EYXRlLmNsYXNzLCBUeXBlcy5EQVRFLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLlJlZi5jbGFzcywgVHlwZXMuUkVGLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLlN0cnVjdC5jbGFzcywgVHlwZXMuU1RSVUNULCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLlRpbWUuY2xhc3MsIFR5cGVzLlRJTUUsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuVGltZXN0YW1wLmNsYXNzLCBUeXBlcy5USU1FU1RBTVAsIG1hcHBpbmdzKTsKLQotCQkvLyBhcnJheXMKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oYnl0ZVtdLmNsYXNzLCBUeXBlcy5WQVJCSU5BUlksIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkJ5dGVbXS5jbGFzcywgVHlwZXMuVkFSQklOQVJZLCBtYXBwaW5ncyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhDbGFzczw/PiBqYXZhQ2xhc3MsIGludCBqZGJjVHlwZUNvZGUsIEhhc2hNYXA8U3RyaW5nLCBKYXZhVG9KREJDVHlwZU1hcHBpbmc+IG1hcHBpbmdzKSB7Ci0JCS8vIGNoZWNrIGZvciBkdXBsaWNhdGVzCi0JCU9iamVjdCBwcmV2ID0gbWFwcGluZ3MucHV0KGphdmFDbGFzcy5nZXROYW1lKCksIGJ1aWxkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nKGphdmFDbGFzcywgamRiY1R5cGVDb2RlKSk7Ci0JCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cGxpY2F0ZSBKYXZhIGNsYXNzOiAiICsgKChKYXZhVG9KREJDVHlwZU1hcHBpbmcpIHByZXYpLmdldEphdmFUeXBlKCkuZGVjbGFyYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEphdmFUb0pEQkNUeXBlTWFwcGluZyBidWlsZEphdmFUb0pEQkNUeXBlTWFwcGluZyhDbGFzczw/PiBqYXZhQ2xhc3MsIGludCBqZGJjVHlwZUNvZGUpIHsKLQkJcmV0dXJuIG5ldyBKYXZhVG9KREJDVHlwZU1hcHBpbmcobmV3IFNpbXBsZUphdmFUeXBlKGphdmFDbGFzcyksIEpEQkNUeXBlLnR5cGUoamRiY1R5cGVDb2RlKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBKREJDVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBKREJDID0+IEphdmEKLQkgKi8KLQlzdGF0aWMgY2xhc3MgSkRCQ1RvSmF2YVR5cGVNYXBwaW5nIHsKLQkJcHJpdmF0ZSBmaW5hbCBKREJDVHlwZSBqZGJjVHlwZTsKLQkJcHJpdmF0ZSBmaW5hbCBKYXZhVHlwZSBqYXZhVHlwZTsKLQotCQlKREJDVG9KYXZhVHlwZU1hcHBpbmcoSkRCQ1R5cGUgamRiY1R5cGUsIEphdmFUeXBlIGphdmFUeXBlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5qZGJjVHlwZSA9IGpkYmNUeXBlOwotCQkJdGhpcy5qYXZhVHlwZSA9IGphdmFUeXBlOwotCQl9Ci0KLQkJcHVibGljIEpEQkNUeXBlIGdldEpEQkNUeXBlKCkgewotCQkJcmV0dXJuIHRoaXMuamRiY1R5cGU7Ci0JCX0KLQotCQlwdWJsaWMgSmF2YVR5cGUgZ2V0SmF2YVR5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoaW50IGpkYmNUeXBlQ29kZSkgewotCQkJcmV0dXJuIHRoaXMuamRiY1R5cGUuY29kZSgpID09IGpkYmNUeXBlQ29kZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoU3RyaW5nIGpkYmNUeXBlTmFtZSkgewotCQkJcmV0dXJuIHRoaXMuamRiY1R5cGUubmFtZSgpLmVxdWFscyhqZGJjVHlwZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gbWFwcyhKREJDVHlwZSB0eXBlKSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGJjVHlwZSA9PSB0eXBlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCXRoaXMuYXBwZW5kVG8oc2IpOwotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhcHBlbmRUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQl0aGlzLmpkYmNUeXBlLmFwcGVuZFRvKHNiKTsKLQkJCXNiLmFwcGVuZCgiID0+ICIpOyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLmphdmFUeXBlLmFwcGVuZERlY2xhcmF0aW9uVG8oc2IpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBKYXZhID0+IEpEQkMKLQkgKi8KLQlzdGF0aWMgY2xhc3MgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nIHsKLQkJcHJpdmF0ZSBmaW5hbCBKYXZhVHlwZSBqYXZhVHlwZTsKLQkJcHJpdmF0ZSBmaW5hbCBKREJDVHlwZSBqZGJjVHlwZTsKLQotCQlKYXZhVG9KREJDVHlwZU1hcHBpbmcoSmF2YVR5cGUgamF2YVR5cGUsIEpEQkNUeXBlIGpkYmNUeXBlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5qYXZhVHlwZSA9IGphdmFUeXBlOwotCQkJdGhpcy5qZGJjVHlwZSA9IGpkYmNUeXBlOwotCQl9Ci0KLQkJcHVibGljIEphdmFUeXBlIGdldEphdmFUeXBlKCkgewotCQkJcmV0dXJuIHRoaXMuamF2YVR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgSkRCQ1R5cGUgZ2V0SkRCQ1R5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGJjVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoSmF2YVR5cGUganQpIHsKLQkJCXJldHVybiB0aGlzLmphdmFUeXBlLmVxdWFscyhqdCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBtYXBzKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhVHlwZS5lcXVhbHMoZWxlbWVudFR5cGVOYW1lLCBhcnJheURlcHRoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoU3RyaW5nIGphdmFDbGFzc05hbWUpIHsKLQkJCXJldHVybiB0aGlzLmphdmFUeXBlLmRlc2NyaWJlcyhqYXZhQ2xhc3NOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhVHlwZS5kZXNjcmliZXMoamF2YUNsYXNzKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQl0aGlzLmFwcGVuZFRvKHNiKTsKLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYXBwZW5kVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJdGhpcy5qYXZhVHlwZS5hcHBlbmREZWNsYXJhdGlvblRvKHNiKTsKLQkJCXNiLmFwcGVuZCgiID0+ICIpOyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLmpkYmNUeXBlLmFwcGVuZFRvKHNiKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9KREJDVHlwZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvSkRCQ1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmZDI4My4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9KREJDVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5zcWwuVHlwZXM7Ci0KLS8qKgotICogQXNzb2NpYXRlIHRoZSBKYXZhIGNvbnN0YW50IGFuZCB0aGUgSkRCQyB0eXBlIG5hbWUuCi0gKiBUaGVzZSBhcmUgZGVyaXZlZCBmcm9tIGphdmEuc3FsLlR5cGVzLgotICogCi0gKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKREJDVHlwZQotCWltcGxlbWVudHMgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQotCS8qKgotCSAqIHRoZSBjb25zdGFudCBuYW1lIChlLmcuIFZBUkNIQVIpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIHRoZSBKREJDIGNvZGUgdXNlZCBieSBKREJDIGRyaXZlcnMKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBjb2RlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIEpEQkMgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgdHlwZSBjb2RlLgotCSAqIFRoaXMgaXMgcHJpdmF0ZSBiZWNhdXNlIGFsbCB0aGUgcG9zc2libGUgSkRCQyB0eXBlcyBhcmUgYnVpbHQgYW5kCi0JICogc3RvcmVkIGluIHRoZSBzdGF0aWMgYXJyYXkgVFlQRVMuCi0JICogQHNlZSAjdHlwZXMoKQotCSAqLwotCXByaXZhdGUgSkRCQ1R5cGUoU3RyaW5nIG5hbWUsIGludCBjb2RlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuY29kZSA9IGNvZGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2Vzc29ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHR5cGUsIGFzIGRlZmluZWQgaW4gamF2YS5zcWwuVHlwZXMuCi0JICovCi0JcHVibGljIFN0cmluZyBuYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIGNvZGUsIGFzIGRlZmluZWQgaW4gamF2YS5zcWwuVHlwZXMuCi0JICovCi0JcHVibGljIGludCBjb2RlKCkgewotCQlyZXR1cm4gdGhpcy5jb2RlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmludGluZyBhbmQgZGlzcGxheWluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhcHBlbmRUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzYi5hcHBlbmQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQl0aGlzLmFwcGVuZFRvKHNiKTsKLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKREJDVHlwZSBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSkRCQ1R5cGUpIHN1cGVyLmNsb25lKCk7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBzdHVmZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBhbGwgdGhlIEpEQkMgdHlwZSBkZWZpbmVkIGluIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSkRCQ1R5cGVbXSBUWVBFUzsJCS8vIHBzZXVkbyAnZmluYWwnIC0gbGF6eS1pbml0aWFsaXplZAotCi0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBKREJDVHlwZVtdIHR5cGVzKCkgewotCQlpZiAoVFlQRVMgPT0gbnVsbCkgewotCQkJVFlQRVMgPSBidWlsZFR5cGVzKCk7Ci0JCX0KLQkJcmV0dXJuIFRZUEVTOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRCQyB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgY29kZSAoZS5nLiBUeXBlcy5WQVJDSEFSKS4KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBKREJDVHlwZSB0eXBlKGludCBjb2RlKSB7Ci0JCUpEQkNUeXBlW10gdHlwZXMgPSB0eXBlcygpOwotCQlmb3IgKGludCBpID0gdHlwZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICh0eXBlc1tpXS5jb2RlKCkgPT0gY29kZSkgewotCQkJCXJldHVybiB0eXBlc1tpXTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIEpEQkMgdHlwZSBjb2RlOiAiICsgY29kZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpEQkMgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCB0eXBlIG5hbWUgKGUuZy4gIlZBUkNIQVIiKS4KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBKREJDVHlwZSB0eXBlKFN0cmluZyBuYW1lKSB7Ci0JCUpEQkNUeXBlW10gdHlwZXMgPSB0eXBlcygpOwotCQlmb3IgKGludCBpID0gdHlwZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICh0eXBlc1tpXS5uYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHR5cGVzW2ldOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgSkRCQyB0eXBlIG5hbWU6ICIgKyBuYW1lKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGJ1aWxkIHVwIHRoZSBKREJDIHR5cGVzIHZpYSByZWZsZWN0aW9uCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIEpEQkNUeXBlW10gYnVpbGRUeXBlcygpIHsKLQkJRmllbGRbXSBmaWVsZHMgPSBUeXBlcy5jbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpOwotCQlpbnQgbGVuID0gZmllbGRzLmxlbmd0aDsKLQkJSkRCQ1R5cGVbXSB0eXBlcyA9IG5ldyBKREJDVHlwZVtsZW5dOwotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCVN0cmluZyBuYW1lID0gZmllbGRzW2ldLmdldE5hbWUoKTsKLQkJCWludCBjb2RlOwotCQkJdHJ5IHsKLQkJCQljb2RlID0gKChJbnRlZ2VyKSBmaWVsZHNbaV0uZ2V0KG51bGwpKS5pbnRWYWx1ZSgpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsJLy8gc2hvdWxkbid0IGhhcHBlbi4uLgotCQkJfQotCQkJdHlwZXNbaV0gPSBuZXcgSkRCQ1R5cGUobmFtZSwgY29kZSk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvS2V5ZWRTZXQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0tleWVkU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNDcxZjQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvS2V5ZWRTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYWludGFpbnMgYSB7QGxpbmsgU2V0fSBvZiBpdGVtcywgYW5kIGEge0BsaW5rIE1hcH0gb2Yga2V5cyB0byB0aG9zZSBpdGVtcy4KLSAqIEFuIGl0ZW0gbWF5IGhhdmUgbXVsdGlwbGUga2V5cywgYnV0IGFuIGl0ZW0gbWF5IGhhdmUgbm8ga2V5cyBhbmQgcmVtYWluIGluIHRoZSBzZXQuICBPbmNlIGFuIAotICogaXRlbSdzIGxhc3Qga2V5IGlzIHJlbW92ZWQsIHRoZSBpdGVtIGlzIGFsc28gcmVtb3ZlZC4KLSAqLwotcHVibGljIGNsYXNzIEtleWVkU2V0PEssIFY+IHsKLQkKLQlwcml2YXRlIGZpbmFsIFNldDxWPiBpdGVtU2V0OwotCXByaXZhdGUgZmluYWwgU2V0PFY+IHVubW9kaWZpYWJsZUl0ZW1TZXQ7Ci0JcHJpdmF0ZSBmaW5hbCBNYXA8SyxWPiBtYXA7Ci0JCi0JCi0JcHVibGljIEtleWVkU2V0KCkgewotCQl0aGlzLml0ZW1TZXQgPSBuZXcgSGFzaFNldDxWPigpOwotCQl0aGlzLnVubW9kaWZpYWJsZUl0ZW1TZXQgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQodGhpcy5pdGVtU2V0KTsKLQkJdGhpcy5tYXAgPSBuZXcgSGFzaE1hcDxLLFY+KCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiB1bm1vZGlmaWFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNldCBvZiBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgU2V0PFY+IGdldEl0ZW1TZXQoKSB7Ci0JCXJldHVybiB0aGlzLnVubW9kaWZpYWJsZUl0ZW1TZXQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlbSBzdG9yZWQgdW5kZXIgdGhlIGdpdmVuIGtleS4KLQkgKi8KLQlwdWJsaWMgViBnZXRJdGVtKEsga2V5KSB7Ci0JCXJldHVybiB0aGlzLm1hcC5nZXQoa2V5KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW4gaXRlbSBpcyBzdG9yZWQgdW5kZXIgdGhlIGdpdmVuIGtleS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShLIGtleSkgewotCQlyZXR1cm4gdGhpcy5tYXAuY29udGFpbnNLZXkoa2V5KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGl0ZW0gaXMgc3RvcmVkIHVuZGVyICphbnkqIGtleS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0l0ZW0oViBpdGVtKSB7Ci0JCXJldHVybiB0aGlzLml0ZW1TZXQuY29udGFpbnMoaXRlbSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZCBhbiBpdGVtIHRvIGJlIHN0b3JlZCB1bmRlciB0aGUgZ2l2ZW4ga2V5LiAgCi0JICogVGhlIGl0ZW0gbXVzdCBub3QgYWxyZWFkeSBiZSBzdG9yZWQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkSXRlbShLIGtleSwgViBpdGVtKSB7Ci0JCWFkZEl0ZW0oaXRlbSk7Ci0JCWFkZEtleShrZXksIGl0ZW0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkSXRlbShWIGl0ZW0pIHsKLQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuaXRlbVNldC5hZGQoaXRlbSk7Ci0JfQotCQotCS8qKiAKLQkgKiBBZGQgYW4gYWRkaXRpb25hbCBrZXkgdG8gYW4gaXRlbSBhbHJlYWR5IHN0b3JlZCB1bmRlciBhbiBhbHRlcm5hdGUga2V5LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEtleShLIGtleSwgViBpdGVtKSB7Ci0JCWlmIChrZXkgPT0gbnVsbCB8fCBpdGVtID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlpZiAoISB0aGlzLml0ZW1TZXQuY29udGFpbnMoaXRlbSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLm1hcC5wdXQoa2V5LCBpdGVtKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBnaXZlbiBpdGVtIGFuZCByZW1vdmUgYW55IGtleS10by1pdGVtIG1hcHBpbmcgaXQgbWF5IGhhdmUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSXRlbShWIGl0ZW0pIHsKLQkJaWYgKHRoaXMuaXRlbVNldC5yZW1vdmUoaXRlbSkpIHsKLQkJCWZvciAoTWFwLkVudHJ5PEssVj4gZW50cnkgOiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLm1hcC5lbnRyeVNldCgpKSkgewotCQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpID09IGl0ZW0pIHsKLQkJCQkJbWFwLnJlbW92ZShlbnRyeS5nZXRLZXkoKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIGtleS10by1pdGVtIG1hcHBpbmcgZm9yIHRoZSBnaXZlbiBrZXkuCi0JICogSWYgaXQgaXMgdGhlIGxhc3Qga2V5IHRvIHRoZSBpdGVtLCBhbHNvIHJlbW92ZSB0aGUgaXRlbS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVLZXkoSyBrZXkpIHsKLQkJZmluYWwgViBpdGVtID0gdGhpcy5tYXAuZ2V0KGtleSk7Ci0JCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCXRoaXMubWFwLnJlbW92ZShrZXkpOwotCQkJYm9vbGVhbiBvdGhlcktleSA9IGZhbHNlOwotCQkJZm9yIChNYXAuRW50cnk8SyxWPiBlbnRyeSA6IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMubWFwLmVudHJ5U2V0KCkpKSB7Ci0JCQkJaWYgKG90aGVyS2V5IHwgZW50cnkuZ2V0VmFsdWUoKSA9PSBpdGVtKSB7Ci0JCQkJCW90aGVyS2V5ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoISBvdGhlcktleSkgewotCQkJCXJlbW92ZUl0ZW0oaXRlbSk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTGF6eU9iamVjdFJlZmVyZW5jZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTGF6eU9iamVjdFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTRhNmUxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0xhenlPYmplY3RSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5PYmplY3RSZWZlcmVuY2U7Ci0KLS8qKgotICogUHJvdmlkZSBhIHRocmVhZC1zYWZlLCByZWFzb25hYmx5IHBlcmZvcm1pbmcgY29udGFpbmVyIGZvciBob2xkaW5nIGFuCi0gKiBvYmplY3QgdGhhdCB3aWxsIGJlICJsYXp5LWluaXRpYWxpemVkIiB1cG9uIGl0cyBmaXJzdCByZWZlcmVuY2UuIFRoaXMgaXMKLSAqIGFsc28gdXNlZnVsIGZvciBwcmV2ZW50aW5nIGRpcmVjdCByZWZlcmVuY2VzIChhY2NpZGVudGFsIG9yIG90aGVyd2lzZSkgdG8KLSAqIGxhenktaW5pdGlhbGl6ZWQgc3RhdGUuCi0gKiA8cD4KLSAqIFRoZXJlIGFyZSBzb21lIHBlbmFsdGllczo8dWw+Ci0gKiA8bGk+VGhlIHJlZmVyZW5jZSdzIHVzZSBvZiBnZW5lcmljcyB3aWxsIHJlcXVpcmUgY2FzdGluZyAoYW5kIHRoZSByZXF1aXNpdGUKLSAqICAgICBWTSB0ZXN0aW5nKSB3aXRoIGV2ZXJ5IGFjY2VzcwotICogPGxpPklmIHRoZSB2YWx1ZSBjYWxjdWxhdGVkIGR1cmluZyBsYXp5IGluaXRpYWxpemF0aW9uIGlzIDxjb2RlPm51bGw8L2NvZGU+LAotICogICAgIGFjY2VzcyB3aWxsIGJlIDxjb2RlPnN5bmNocm9uaXplZDwvY29kZT4gPGVtPmV2ZXJ5PC9lbT4gdGltZS4KLSAqIDwvdWw+Ci0gKiBAc2VlIFNpbXBsZU9iamVjdFJlZmVyZW5jZQotICogQHNlZSBTeW5jaHJvbml6ZWRPYmplY3QKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIExhenlPYmplY3RSZWZlcmVuY2U8Vj4KLQlpbXBsZW1lbnRzIE9iamVjdFJlZmVyZW5jZTxWPiwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQkvKiogQmFja2luZyB2YWx1ZS4gKi8KLQlwcml2YXRlIHZvbGF0aWxlIFYgdmFsdWUgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENyZWF0ZSBhIGxhenkgb2JqZWN0IHJlZmVyZW5jZS4KLQkgKi8KLQlwcm90ZWN0ZWQgTGF6eU9iamVjdFJlZmVyZW5jZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsdWUgKioqKioqKioqKgotCi0JLyoqCi0JICogSW4gSkRLIDUgYW5kIGxhdGVyLCB0aGlzICJkb3VibGUtY2hlY2tlZCBsb2NraW5nIiBpZGlvbSB3b3JrcyBhcyBsb25nCi0JICogYXMgdGhlIGluc3RhbmNlIHZhcmlhYmxlIGlzIG1hcmtlZCA8Y29kZT52b2xhdGlsZTwvY29kZT4uCi0JICovCi0JcHVibGljIFYgZ2V0VmFsdWUoKSB7Ci0JCVYgcmVzdWx0ID0gdGhpcy52YWx1ZTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlyZXN1bHQgPSB0aGlzLnZhbHVlOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQl0aGlzLnZhbHVlID0gcmVzdWx0ID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFYgYnVpbGRWYWx1ZSgpOwotCi0JcHVibGljIGJvb2xlYW4gdmFsdWVFcXVhbHMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy5nZXRWYWx1ZSgpLCBvYmplY3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbHVlTm90RXF1YWwoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuZ2V0VmFsdWUoKSwgb2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc051bGwoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbHVlKCkgPT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05vdE51bGwoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbHVlKCkgIT0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGF6eU9iamVjdFJlZmVyZW5jZTxWPiBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJTGF6eU9iamVjdFJlZmVyZW5jZTxWPiBjbG9uZSA9IChMYXp5T2JqZWN0UmVmZXJlbmNlPFY+KSBzdXBlci5jbG9uZSgpOwotCQkJcmV0dXJuIGNsb25lOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgPGVtPm5vdDwvZW0+IHRyaWdnZXIgdGhlICJsYXp5LWluaXRpYWxpemF0aW9uIi4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gJ1snICsgU3RyaW5nLnZhbHVlT2YodGhpcy52YWx1ZSkgKyAnXSc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTGlzdGVuZXJMaXN0LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9MaXN0ZW5lckxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2MWZiMC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9MaXN0ZW5lckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotCi0vKioKLSAqIE1haW50YWluIGEgdGhyZWFkLXNhZmUgbGlzdCBvZiBsaXN0ZW5lcnMgdGhhdCBkb2VzIG5vdCBhbGxvdyBhZGRpbmcKLSAqIGR1cGxpY2F0ZSBsaXN0ZW5lcnMgb3IgcmVtb3Zpbmcgbm9uLWxpc3RlbmVycy4KLSAqIAotICogQHBhcm0gPEw+IHRoZSB0eXBlIG9mIGxpc3RlbmVycyBoZWxkIGJ5IHRoZSBsaXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0ZW5lckxpc3Q8TD4KLQlpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQotewotCS8qKgotCSAqIFdlIGNhbiBtYXJrIHRoaXMgPGNvZGU+dm9sYXRpbGU8L2NvZGU+IGFuZCBub3Qgc3luY2hyb25pemUgdGhlIHJlYWQKLQkgKiBtZXRob2RzIGJlY2F1c2Ugd2UgbmV2ZXIgY2hhbmdlIHRoZSA8ZW0+Y29udGVudHM8L2VtPiBvZiB0aGUgYXJyYXkuCi0JICovCi0JcHJpdmF0ZSB0cmFuc2llbnQgdm9sYXRpbGUgTFtdIGxpc3RlbmVyczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0ZW5lciBsaXN0IGZvciBsaXN0ZW5lcnMgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqLwotCXB1YmxpYyBMaXN0ZW5lckxpc3QoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcykgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RlbmVycyA9IHRoaXMuYnVpbGRMaXN0ZW5lckFycmF5KGxpc3RlbmVyQ2xhc3MsIDApOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3RlbmVyIGxpc3QgZm9yIGxpc3RlbmVycyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgdG8gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIExpc3RlbmVyTGlzdChDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBMIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVycyA9IHRoaXMuYnVpbGRMaXN0ZW5lckFycmF5KGxpc3RlbmVyQ2xhc3MsIDEpOwotCQl0aGlzLmxpc3RlbmVyc1swXSA9IGxpc3RlbmVyOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTFtdIGJ1aWxkTGlzdGVuZXJBcnJheShDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiAoTFtdKSBBcnJheS5uZXdJbnN0YW5jZShsaXN0ZW5lckNsYXNzLCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTxMPiBnZXRMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxMPih0aGlzLmxpc3RlbmVycyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdGVuZXJzLmxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdGVuZXIgbGlzdCBoYXMgbm8gbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RlbmVycy5sZW5ndGggPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciB0byB0aGUgbGlzdGVuZXIgbGlzdC4KLQkgKiBEdXBsaWNhdGUgbGlzdGVuZXJzIGFyZSBub3QgYWxsb3dlZC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkKEwgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmIChBcnJheVRvb2xzLmNvbnRhaW5zKHRoaXMubGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cGxpY2F0ZSBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMubGlzdGVuZXJzID0gQXJyYXlUb29scy5hZGQodGhpcy5saXN0ZW5lcnMsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0ZW5lciBsaXN0LgotCSAqIFJlbW92aW5nIGEgbGlzdGVuZXIgdGhhdCBpcyBub3Qgb24gdGhlIGxpc3QgaXMgbm90IGFsbG93ZWQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZShMIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlpbnQgaW5kZXggPSBBcnJheVRvb2xzLmluZGV4T2YodGhpcy5saXN0ZW5lcnMsIGxpc3RlbmVyKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bnJlZ2lzdGVyZWQgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmxpc3RlbmVycyA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudEF0SW5kZXgodGhpcy5saXN0ZW5lcnMsIGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgbGlzdGVuZXIgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKSB7Ci0JCXRoaXMubGlzdGVuZXJzID0gQXJyYXlUb29scy5jbGVhcih0aGlzLmxpc3RlbmVycyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIG9mIGxpc3RlbmVycyBoZWxkIGJ5IHRoZSBsaXN0ZW5lciBsaXN0LgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDbGFzczxMPiBnZXRMaXN0ZW5lclR5cGUoKSB7Ci0JCXJldHVybiAoQ2xhc3M8TD4pIHRoaXMubGlzdGVuZXJzLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBBcnJheXMudG9TdHJpbmcodGhpcy5saXN0ZW5lcnMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZXJpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFNpbGVudGx5IGRyb3AgYW55IG5vbi1zZXJpYWxpemFibGUgbGlzdGVuZXJzLgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIHdyaXRlIG91dCBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUNsYXNzPEw+IGxpc3RlbmVyQ2xhc3MgPSAoQ2xhc3M8TD4pIHRoaXMubGlzdGVuZXJzLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQlzLndyaXRlT2JqZWN0KGxpc3RlbmVyQ2xhc3MpOwotCi0JCS8vIG9ubHkgd3JpdGUgb3V0IHNlcmlhbGl6YWJsZSBsaXN0ZW5lcnMKLQkJZm9yIChMIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lcnMpIHsKLQkJCWlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFNlcmlhbGl6YWJsZSkgewotCQkJCXMud3JpdGVPYmplY3QobGlzdGVuZXIpOwotCQkJfQotCQl9Ci0KLQkJcy53cml0ZU9iamVjdChudWxsKTsKLSAgICB9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBzKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkvLyByZWFkIGluIGFueSBoaWRkZW4gc3R1ZmYKLQkJcy5kZWZhdWx0UmVhZE9iamVjdCgpOwotCi0JCUNsYXNzPEw+IGxpc3RlbmVyQ2xhc3MgPSAoQ2xhc3M8TD4pIHMucmVhZE9iamVjdCgpOwotCQl0aGlzLmxpc3RlbmVycyA9IHRoaXMuYnVpbGRMaXN0ZW5lckFycmF5KGxpc3RlbmVyQ2xhc3MsIDApOwotCQlPYmplY3QgbzsKLQkJd2hpbGUgKChvID0gcy5yZWFkT2JqZWN0KCkpICE9IG51bGwpIHsKLQkJCXRoaXMubGlzdGVuZXJzID0gQXJyYXlUb29scy5hZGQodGhpcy5saXN0ZW5lcnMsIChMKSBvKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL01vZGlmaWFibGVCb29sZWFuUmVmZXJlbmNlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Nb2RpZmlhYmxlQm9vbGVhblJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjI4NDlhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL01vZGlmaWFibGVCb29sZWFuUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Cb29sZWFuUmVmZXJlbmNlOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgYSBjb250YWluZXIgZm9yIHBhc3NpbmcgYSBmbGFnIHRoYXQgY2FuIGJlIGNoYW5nZWQgYnkKLSAqIHRoZSByZWNpcGllbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kaWZpYWJsZUJvb2xlYW5SZWZlcmVuY2UKLQlleHRlbmRzIEJvb2xlYW5SZWZlcmVuY2UKLXsKLQkvKioKLQkgKiBTZXQgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JYm9vbGVhbiBzZXRWYWx1ZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFNldCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgdG8gdGhlIE5PVCBvZiBpdHMgY3VycmVudCB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIGZsaXAoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgdG8gdGhlIE5PVCBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JYm9vbGVhbiBzZXROb3QoYm9vbGVhbiB2KTsKLQotCS8qKgotCSAqIFNldCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIHNldFRydWUoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JYm9vbGVhbiBzZXRGYWxzZSgpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTW9kaWZpYWJsZUludFJlZmVyZW5jZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTW9kaWZpYWJsZUludFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzViODYwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL01vZGlmaWFibGVJbnRSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgYSBjb250YWluZXIgZm9yIHBhc3NpbmcgYW4gaW50ZWdlciB0aGF0IGNhbiBiZSBjaGFuZ2VkIGJ5Ci0gKiB0aGUgcmVjaXBpZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGlmaWFibGVJbnRSZWZlcmVuY2UKLQlleHRlbmRzIEludFJlZmVyZW5jZQotewotCS8qKgotCSAqIFNldCB0aGUgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCWludCBzZXRWYWx1ZShpbnQgdmFsdWUpOwotCi0JLyoqCi0JICogU2V0IHRoZSA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIHRvIHplcm8uCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlpbnQgc2V0WmVybygpOwotCi0JLyoqCi0JICogSW5jcmVtZW50IGFuZCByZXR1cm4gdGhlIDxjb2RlPmludDwvY29kZT4gdmFsdWUuCi0JICovCi0JaW50IGluY3JlbWVudCgpOwotCi0JLyoqCi0JICogRGVjcmVtZW50IGFuZCByZXR1cm4gdGhlIDxjb2RlPmludDwvY29kZT4gdmFsdWUuCi0JICovCi0JaW50IGRlY3JlbWVudCgpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTmFtZVRvb2xzLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9OYW1lVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFjZjFlYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9OYW1lVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLS8qKgotICogVmFyaW91cyBoZWxwZXIgbWV0aG9kcyBmb3IgZ2VuZXJhdGluZyBuYW1lcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5hbWVUb29scyB7Ci0KLQkvKioKLQkgKiBHaXZlbiBhICJyb290IiBuYW1lIGFuZCBhIHNldCBvZiBleGlzdGluZyBuYW1lcywgZ2VuZXJhdGUgYSB1bmlxdWUKLQkgKiBuYW1lIHRoYXQgaXMgZWl0aGVyIHRoZSAicm9vdCIgbmFtZSBvciBzb21lIHZhcmlhdGlvbiBvbiB0aGUgInJvb3QiCi0JICogbmFtZSAoZS5nLiAicm9vdDIiLCAicm9vdDMiLC4uLikuIFRoZSBuYW1lcyBhcmUgY2FzZS1zZW5zaXRpdmUKLQkgKiAoaS5lLiAiUm9vdCIgYW5kICJyb290IiBhcmUgYm90aCBhbGxvd2VkKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmlxdWVOYW1lRm9yKFN0cmluZyByb290TmFtZSwgSXRlcmF0b3I8U3RyaW5nPiBleGlzdGluZ05hbWVzKSB7Ci0JCXJldHVybiB1bmlxdWVOYW1lRm9yKHJvb3ROYW1lLCBDb2xsZWN0aW9uVG9vbHMuc2V0KGV4aXN0aW5nTmFtZXMpKTsKLQl9Ci0JCi0JLyoqCi0JICogR2l2ZW4gYSAicm9vdCIgbmFtZSBhbmQgYSBzZXQgb2YgZXhpc3RpbmcgbmFtZXMsIGdlbmVyYXRlIGEgdW5pcXVlCi0JICogbmFtZSB0aGF0IGlzIGVpdGhlciB0aGUgInJvb3QiIG5hbWUgb3Igc29tZSB2YXJpYXRpb24gb24gdGhlICJyb290IgotCSAqIG5hbWUgKGUuZy4gInJvb3QyIiwgInJvb3QzIiwuLi4pLiBUaGUgbmFtZXMgYXJlIGNhc2Utc2Vuc2l0aXZlCi0JICogKGkuZS4gIlJvb3QiIGFuZCAicm9vdCIgYXJlIGJvdGggYWxsb3dlZCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5pcXVlTmFtZUZvcihTdHJpbmcgcm9vdE5hbWUsIENvbGxlY3Rpb248U3RyaW5nPiBleGlzdGluZ05hbWVzKSB7Ci0JCXJldHVybiB1bmlxdWVOYW1lRm9yKHJvb3ROYW1lLCBleGlzdGluZ05hbWVzLCByb290TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSAicm9vdCIgbmFtZSBhbmQgYSBzZXQgb2YgZXhpc3RpbmcgbmFtZXMsIGdlbmVyYXRlIGEgdW5pcXVlCi0JICogbmFtZSB0aGF0IGlzIGVpdGhlciB0aGUgInJvb3QiIG5hbWUgb3Igc29tZSB2YXJpYXRpb24gb24gdGhlICJyb290IgotCSAqIG5hbWUgKGUuZy4gInJvb3QyIiwgInJvb3QzIiwuLi4pLiBUaGUgbmFtZXMgYXJlIE5PVCBjYXNlLXNlbnNpdGl2ZQotCSAqIChpLmUuICJSb290IiBhbmQgInJvb3QiIGFyZSBOT1QgYm90aCBhbGxvd2VkKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmlxdWVOYW1lRm9ySWdub3JlQ2FzZShTdHJpbmcgcm9vdE5hbWUsIEl0ZXJhdG9yPFN0cmluZz4gZXhpc3RpbmdOYW1lcykgewotCQlyZXR1cm4gdW5pcXVlTmFtZUZvcklnbm9yZUNhc2Uocm9vdE5hbWUsIENvbGxlY3Rpb25Ub29scy5zZXQoZXhpc3RpbmdOYW1lcykpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgInJvb3QiIG5hbWUgYW5kIGEgc2V0IG9mIGV4aXN0aW5nIG5hbWVzLCBnZW5lcmF0ZSBhIHVuaXF1ZQotCSAqIG5hbWUgdGhhdCBpcyBlaXRoZXIgdGhlICJyb290IiBuYW1lIG9yIHNvbWUgdmFyaWF0aW9uIG9uIHRoZSAicm9vdCIKLQkgKiBuYW1lIChlLmcuICJyb290MiIsICJyb290MyIsLi4uKS4gVGhlIG5hbWVzIGFyZSBOT1QgY2FzZS1zZW5zaXRpdmUKLQkgKiAoaS5lLiAiUm9vdCIgYW5kICJyb290IiBhcmUgTk9UIGJvdGggYWxsb3dlZCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoU3RyaW5nIHJvb3ROYW1lLCBDb2xsZWN0aW9uPFN0cmluZz4gZXhpc3RpbmdOYW1lcykgewotCQlyZXR1cm4gdW5pcXVlTmFtZUZvcihyb290TmFtZSwgY29udmVydFRvTG93ZXJDYXNlKGV4aXN0aW5nTmFtZXMpLCByb290TmFtZS50b0xvd2VyQ2FzZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiB1c2UgdGhlIHN1ZmZpeGVkICJ0ZW1wbGF0ZSIgbmFtZSB0byBwZXJmb3JtIHRoZSBjb21wYXJpc29ucywgYnV0IFJFVFVSTgotCSAqIHRoZSBzdWZmaXhlZCAicm9vdCIgbmFtZTsgdGhpcyBhbGxvd3MgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29ucwotCSAqIChpLmUuIHRoZSAidGVtcGxhdGUiIG5hbWUgaGFzIGJlZW4gbW9ycGhlZCB0byB0aGUgc2FtZSBjYXNlIGFzCi0JICogdGhlICJleGlzdGluZyIgbmFtZXMsIHdoaWxlIHRoZSAicm9vdCIgbmFtZSBoYXMgbm90LCBidXQgdGhlICJyb290IiBuYW1lCi0JICogaXMgd2hhdCB0aGUgY2xpZW50IHdhbnRzIG1vcnBoZWQgdG8gYmUgdW5pcXVlKQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyB1bmlxdWVOYW1lRm9yKFN0cmluZyByb290TmFtZSwgQ29sbGVjdGlvbjxTdHJpbmc+IGV4aXN0aW5nTmFtZXMsIFN0cmluZyB0ZW1wbGF0ZU5hbWUpIHsKLQkJaWYgKCAhIGV4aXN0aW5nTmFtZXMuY29udGFpbnModGVtcGxhdGVOYW1lKSkgewotCQkJcmV0dXJuIHJvb3ROYW1lOwotCQl9Ci0JCVN0cmluZyB1bmlxdWVOYW1lID0gdGVtcGxhdGVOYW1lOwotCQlmb3IgKGludCBzdWZmaXggPSAyOyB0cnVlOyBzdWZmaXgrKykgewotCQkJaWYgKCAhIGV4aXN0aW5nTmFtZXMuY29udGFpbnModW5pcXVlTmFtZSArIHN1ZmZpeCkpIHsKLQkJCQlyZXR1cm4gcm9vdE5hbWUuY29uY2F0KFN0cmluZy52YWx1ZU9mKHN1ZmZpeCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygc3RyaW5ncyB0byBhIGNvbGxlY3Rpb24gb2YgdGhlIHNhbWUKLQkgKiBzdHJpbmdzIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEhhc2hTZXQ8U3RyaW5nPiBjb252ZXJ0VG9Mb3dlckNhc2UoQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MpIHsKLQkJSGFzaFNldDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oc3RyaW5ncy5zaXplKCkpOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiBzdHJpbmdzKSB7Ci0JCQlyZXN1bHQuYWRkKHN0cmluZy50b0xvd2VyQ2FzZSgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgZnVsbHktcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2Ugb2JqZWN0LgotCSAqIFZhcmlhdGlvbnM6Ci0JICogICAgIGNhdGFsb2cuc2NoZW1hLm5hbWUKLQkgKiAgICAgY2F0YWxvZy4ubmFtZQotCSAqICAgICBzY2hlbWEubmFtZQotCSAqICAgICBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRRdWFsaWZpZWREYXRhYmFzZU9iamVjdE5hbWUoU3RyaW5nIGNhdGFsb2csIFN0cmluZyBzY2hlbWEsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICgoY2F0YWxvZyA9PSBudWxsKSAmJiAoc2NoZW1hID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCi0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDApOwotCQlpZiAoY2F0YWxvZyAhPSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQoY2F0YWxvZyk7Ci0JCQlzYi5hcHBlbmQoJy4nKTsKLQkJfQotCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCXNiLmFwcGVuZChzY2hlbWEpOwotCQl9Ci0JCXNiLmFwcGVuZCgnLicpOwotCQlzYi5hcHBlbmQobmFtZSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzZXQgb2YgcmVzZXJ2ZWQgd29yZHMgaW4gdGhlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCi0JICogVGhlc2Ugd29yZHMgY2Fubm90IGJlIHVzZWQgYXMgaWRlbnRpZmllcnMgKGkuZS4gbmFtZXMpLgotCSAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy90dXRvcmlhbC9qYXZhL251dHNhbmRib2x0cy9fa2V5d29yZHMuaHRtbAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSkFWQV9SRVNFUlZFRF9XT1JEUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQkJImFic3RyYWN0IiwKLQkJCQkiYXNzZXJ0IiwgIC8vIGpkayAxLjQKLQkJCQkiYm9vbGVhbiIsCi0JCQkJImJyZWFrIiwKLQkJCQkiYnl0ZSIsCi0JCQkJImNhc2UiLAotCQkJCSJjYXRjaCIsCi0JCQkJImNoYXIiLAotCQkJCSJjbGFzcyIsCi0JCQkJImNvbnN0IiwgIC8vIHVudXNlZAotCQkJCSJjb250aW51ZSIsCi0JCQkJImRlZmF1bHQiLAotCQkJCSJkbyIsCi0JCQkJImRvdWJsZSIsCi0JCQkJImVsc2UiLAotCQkJCSJlbnVtIiwgIC8vIGpkayAxLjUKLQkJCQkiZXh0ZW5kcyIsCi0JCQkJImZhbHNlIiwKLQkJCQkiZmluYWwiLAotCQkJCSJmaW5hbGx5IiwKLQkJCQkiZmxvYXQiLAotCQkJCSJmb3IiLAotCQkJCSJnb3RvIiwgIC8vIHVudXNlZAotCQkJCSJpZiIsCi0JCQkJImltcGxlbWVudHMiLAotCQkJCSJpbXBvcnQiLAotCQkJCSJpbnN0YW5jZW9mIiwKLQkJCQkiaW50IiwKLQkJCQkiaW50ZXJmYWNlIiwKLQkJCQkibG9uZyIsCi0JCQkJIm5hdGl2ZSIsCi0JCQkJIm5ldyIsCi0JCQkJIm51bGwiLAotCQkJCSJwYWNrYWdlIiwKLQkJCQkicHJpdmF0ZSIsCi0JCQkJInByb3RlY3RlZCIsCi0JCQkJInB1YmxpYyIsCi0JCQkJInJldHVybiIsCi0JCQkJInNob3J0IiwKLQkJCQkic3RhdGljIiwKLQkJCQkic3RyaWN0ZnAiLCAgLy8gamRrIDEuMgotCQkJCSJzdXBlciIsCi0JCQkJInN3aXRjaCIsCi0JCQkJInN5bmNocm9uaXplZCIsCi0JCQkJInRoaXMiLAotCQkJCSJ0aHJvdyIsCi0JCQkJInRocm93cyIsCi0JCQkJInRyYW5zaWVudCIsCi0JCQkJInRydWUiLAotCQkJCSJ0cnkiLAotCQkJCSJ2b2lkIiwKLQkJCQkidm9sYXRpbGUiLAotCQkJCSJ3aGlsZSIKLQkJCX07Ci0KLQkvKioKLQkgKiBUaGUgc2V0IG9mIHJlc2VydmVkIHdvcmRzIGluIHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlLgotCSAqIFRoZXNlIHdvcmRzIGNhbm5vdCBiZSB1c2VkIGFzIGlkZW50aWZpZXJzIChpLmUuIG5hbWVzKS4KLQkgKiBodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvdHV0b3JpYWwvamF2YS9udXRzYW5kYm9sdHMvX2tleXdvcmRzLmh0bWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNvcnRlZFNldDxTdHJpbmc+IEpBVkFfUkVTRVJWRURfV09SRFNfU0VUID0gCi0JCUNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNvcnRlZFNldChDb2xsZWN0aW9uVG9vbHMuc29ydGVkU2V0KEpBVkFfUkVTRVJWRURfV09SRFMpKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2V0IG9mIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgcmVzZXJ2ZWQgd29yZHMuCi0JICogVGhlc2Ugd29yZHMgY2Fubm90IGJlIHVzZWQgYXMgaWRlbnRpZmllcnMgKGkuZS4gbmFtZXMpLgotCSAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy90dXRvcmlhbC9qYXZhL251dHNhbmRib2x0cy9fa2V5d29yZHMuaHRtbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhUmVzZXJ2ZWRXb3JkcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFWQV9SRVNFUlZFRF9XT1JEUyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29uc2lzdHMgb2YgSmF2YSBpZGVudGlmaWVyCi0JICogY2hhcmFjdGVycyAoYnV0IG1heSBiZSBhIHJlc2VydmVkIHdvcmQpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdDb25zaXN0c09mSmF2YUlkZW50aWZpZXJDaGFyYWN0ZXJzKFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ0NvbnNpc3RzT2ZKYXZhSWRlbnRpZmllckNoYXJhY3RlcnNfKHN0cmluZy50b0NoYXJBcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb25zaXN0cyBvZiBKYXZhIGlkZW50aWZpZXIKLQkgKiBjaGFyYWN0ZXJzIChidXQgbWF5IGJlIGEgcmVzZXJ2ZWQgd29yZCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0NvbnNpc3RzT2ZKYXZhSWRlbnRpZmllckNoYXJhY3RlcnMoY2hhcltdIHN0cmluZykgewotCQlpZiAoc3RyaW5nLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ0NvbnNpc3RzT2ZKYXZhSWRlbnRpZmllckNoYXJhY3RlcnNfKHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBzdHJpbmcgbXVzdCBub3QgYmUgZW1wdHkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdDb25zaXN0c09mSmF2YUlkZW50aWZpZXJDaGFyYWN0ZXJzXyhjaGFyW10gc3RyaW5nKSB7Ci0JCWlmICggISBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KHN0cmluZ1swXSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gc3RyaW5nLmxlbmd0aDsgaS0tID4gMTsgKSB7ICAvLyBOQjogZW5kIHdpdGggMQotCQkJaWYgKCAhIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChzdHJpbmdbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0xlZ2FsSmF2YUlkZW50aWZpZXIoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nQ29uc2lzdHNPZkphdmFJZGVudGlmaWVyQ2hhcmFjdGVycyhzdHJpbmcpCi0JCQkJJiYgISBKQVZBX1JFU0VSVkVEX1dPUkRTX1NFVC5jb250YWlucyhzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0xlZ2FsSmF2YUlkZW50aWZpZXIoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nQ29uc2lzdHNPZkphdmFJZGVudGlmaWVyQ2hhcmFjdGVycyhzdHJpbmcpCi0JCQkJJiYgISBKQVZBX1JFU0VSVkVEX1dPUkRTX1NFVC5jb250YWlucyhuZXcgU3RyaW5nKHN0cmluZykpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIKLQkgKiBieSBzdWJzdGl0dXRpbmcgYW4gdW5kZXJzY29yZSAnXycgZm9yIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMKLQkgKiBpbiB0aGUgc3RyaW5nIGFuZCBhcHBlbmRpbmcgYW4gdW5kZXJzY29yZSAnXycgdG8gdGhlIHN0cmluZyBpZgotCSAqIGl0IGlzIGEgSmF2YSByZXNlcnZlZCB3b3JkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKHN0cmluZywgJ18nKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyCi0JICogYnkgc3Vic3RpdHV0aW5nIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGZvciBhbnkgaW52YWxpZCBjaGFyYWN0ZXJzCi0JICogaW4gdGhlIHN0cmluZyBhbmQsIGlmIG5lY2Vzc2FyeSwgYXBwZW5kaW5nIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogdG8gdGhlIHN0cmluZyB1bnRpbCBpdCBpcyBub3QgYSBKYXZhIHJlc2VydmVkIHdvcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSmF2YUlkZW50aWZpZXIoU3RyaW5nIHN0cmluZywgY2hhciBjKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpZiAoSkFWQV9SRVNFUlZFRF9XT1JEU19TRVQuY29udGFpbnMoc3RyaW5nKSkgewotCQkJLy8gYSByZXNlcnZlZCB3b3JkIGlzIGEgdmFsaWQgaWRlbnRpZmllciwgd2UganVzdCBuZWVkIHRvIHR3ZWFrIGl0IGEgYml0Ci0JCQljaGVja0NoYXJJc0phdmFJZGVudGlmaWVyUGFydChjKTsKLQkJCXJldHVybiBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcihzdHJpbmcgKyBjLCBjKTsKLQkJfQotCQljaGFyW10gYXJyYXkgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJcmV0dXJuIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyXyhhcnJheSwgYykgPyBuZXcgU3RyaW5nKGFycmF5KSA6IHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyCi0JICogYnkgc3Vic3RpdHV0aW5nIGFuIHVuZGVyc2NvcmUgJ18nIGZvciBhbnkgaW52YWxpZCBjaGFyYWN0ZXJzCi0JICogaW4gdGhlIHN0cmluZyBhbmQgYXBwZW5kaW5nIGFuIHVuZGVyc2NvcmUgJ18nIHRvIHRoZSBzdHJpbmcgaWYKLQkgKiBpdCBpcyBhIEphdmEgcmVzZXJ2ZWQgd29yZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcihjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcihzdHJpbmcsICdfJyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byBhIHZhbGlkIEphdmEgaWRlbnRpZmllcgotCSAqIGJ5IHN1YnN0aXR1dGluZyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBmb3IgYW55IGludmFsaWQgY2hhcmFjdGVycwotCSAqIGluIHRoZSBzdHJpbmcgYW5kLCBpZiBuZWNlc3NhcnksIGFwcGVuZGluZyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIHRvIHRoZSBzdHJpbmcgdW50aWwgaXQgaXMgbm90IGEgSmF2YSByZXNlcnZlZCB3b3JkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKGNoYXJbXSBzdHJpbmcsIGNoYXIgYykgewotCQlpZiAoc3RyaW5nLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCWlmIChKQVZBX1JFU0VSVkVEX1dPUkRTX1NFVC5jb250YWlucyhuZXcgU3RyaW5nKHN0cmluZykpKSB7Ci0JCQkvLyBhIHJlc2VydmVkIHdvcmQgaXMgYSB2YWxpZCBpZGVudGlmaWVyLCB3ZSBqdXN0IG5lZWQgdG8gdHdlYWsgaXQgYSBiaXQKLQkJCWNoZWNrQ2hhcklzSmF2YUlkZW50aWZpZXJQYXJ0KGMpOwotCQkJcmV0dXJuIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKEFycmF5VG9vbHMuYWRkKHN0cmluZywgYyksIGMpOwotCQl9Ci0JCWNvbnZlcnRUb0phdmFJZGVudGlmaWVyXyhzdHJpbmcsIGMpOwotCQlyZXR1cm4gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgc3RyaW5nIG11c3Qgbm90IGJlIGVtcHR5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzdHJpbmcgd2FzIG1vZGlmaWVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udmVydFRvSmF2YUlkZW50aWZpZXJfKGNoYXJbXSBzdHJpbmcsIGNoYXIgYykgewotCQlib29sZWFuIG1vZCA9IGZhbHNlOwotCQlpZiAoICEgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChzdHJpbmdbMF0pKSB7Ci0JCQljaGVja0NoYXJJc0phdmFJZGVudGlmaWVyU3RhcnQoYyk7Ci0JCQlzdHJpbmdbMF0gPSBjOwotCQkJbW9kID0gdHJ1ZTsKLQkJfQotCQljaGVja0NoYXJJc0phdmFJZGVudGlmaWVyUGFydChjKTsKLQkJZm9yIChpbnQgaSA9IHN0cmluZy5sZW5ndGg7IGktLSA+IDE7ICkgeyAgLy8gTkI6IGVuZCB3aXRoIDEKLQkJCWlmICggISBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoc3RyaW5nW2ldKSkgewotCQkJCXN0cmluZ1tpXSA9IGM7Ci0JCQkJbW9kID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tDaGFySXNKYXZhSWRlbnRpZmllclN0YXJ0KGNoYXIgYykgewotCQlpZiAoICEgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBKYXZhIGlkZW50aWZpZXIgc3RhcnQgY2hhcjogJyIgKyBjICsgJ1wnJyk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ2hhcklzSmF2YUlkZW50aWZpZXJQYXJ0KGNoYXIgYykgewotCQlpZiAoICEgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIEphdmEgaWRlbnRpZmllciBwYXJ0IGNoYXI6ICciICsgYyArICdcJycpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIG1ldGhvZCBuYW1lIHRvIGEgcHJvcGVydHkgbmFtZS4KLQkgKiBAc2VlIEludHJvc3BlY3RvciNkZWNhcGl0YWxpemUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRHZXR0ZXJTZXR0ZXJNZXRob2ROYW1lVG9Qcm9wZXJ0eU5hbWUoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJaW50IGJlZ2luSW5kZXggPSAwOwotCQlpZiAobWV0aG9kTmFtZS5zdGFydHNXaXRoKCJnZXQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQliZWdpbkluZGV4ID0gMzsKLQkJfSBlbHNlIGlmIChtZXRob2ROYW1lLnN0YXJ0c1dpdGgoInNldCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWJlZ2luSW5kZXggPSAzOwotCQl9IGVsc2UgaWYgKG1ldGhvZE5hbWUuc3RhcnRzV2l0aCgiaXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQliZWdpbkluZGV4ID0gMjsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBtZXRob2ROYW1lOyAgLy8gcmV0dXJuIG1ldGhvZCBuYW1lIHVuY2hhbmdlZD8KLQkJfQotCQlyZXR1cm4gSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShtZXRob2ROYW1lLnN1YnN0cmluZyhiZWdpbkluZGV4KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBOYW1lVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTm9uRW1wdHlTdHJpbmdGaWx0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL05vbkVtcHR5U3RyaW5nRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMWM0YmMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTm9uRW1wdHlTdHJpbmdGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotCi0vKioKLSAqIFRoaXMgZmlsdGVyIGFjY2VwdHMgb25seSBub24tPGNvZGU+bnVsbDwvY29kZT4sIG5vbi1lbXB0eSwKLSAqIG5vbi13aGl0ZXNwYWNlLW9ubHkgc3RyaW5ncy4KLSAqLwotcHVibGljIGNsYXNzIE5vbkVtcHR5U3RyaW5nRmlsdGVyCi0JaW1wbGVtZW50cyBGaWx0ZXI8U3RyaW5nPiwgU2VyaWFsaXphYmxlCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBGaWx0ZXI8U3RyaW5nPiBJTlNUQU5DRSA9IG5ldyBOb25FbXB0eVN0cmluZ0ZpbHRlcigpOwotCi0JcHVibGljIHN0YXRpYyBGaWx0ZXI8U3RyaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQlwcml2YXRlIE5vbkVtcHR5U3RyaW5nRmlsdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8vIGFjY2VwdCBvbmx5IG5vbi1udWxsIG9iamVjdHMKLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nSXNOb3RFbXB0eShzdHJpbmcpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTm9uTnVsbEJvb2xlYW5UcmFuc2Zvcm1lci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTm9uTnVsbEJvb2xlYW5UcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzk3NDlmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL05vbk51bGxCb29sZWFuVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIEEgPGNvZGU+Tm9uTnVsbEJvb2xlYW5UcmFuc2Zvcm1lcjwvY29kZT4gd2lsbCB0cmFuc2Zvcm0gYSBwb3NzaWJseS1udWxsCi0gKiB7QGxpbmsgQm9vbGVhbn0gdG8gYSBub24tbnVsbCB7QGxpbmsgQm9vbGVhbn06PHVsPgotICogPGxpPldoZW4gdGhlIG9yaWdpbmFsIHtAbGluayBCb29sZWFufSBpcyA8ZW0+bm90PC9lbT4gPGNvZGU+bnVsbDwvY29kZT4sCi0gKiB0aGUgdHJhbnNmb3JtZXIgd2lsbCByZXR1cm4gaXQgdW5jaGFuZ2VkLgotICogPGxpPldoZW4gdGhlIG9yaWdpbmFsIHtAbGluayBCb29sZWFufSBpcyA8Y29kZT5udWxsPC9jb2RlPiwKLSAqIHRoZSB0cmFuc2Zvcm1lciB3aWxsIHJldHVybiBpdHMgY2xpZW50LXNwZWNpZmllZCAibnVsbCB2YWx1ZSIKLSAqICh7QGxpbmsgQm9vbGVhbiNUUlVFfSBvciB7QGxpbmsgQm9vbGVhbiNGQUxTRX0pLgotICogPC91bD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5vbk51bGxCb29sZWFuVHJhbnNmb3JtZXIKLQlpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPEJvb2xlYW4sIEJvb2xlYW4+Ci17Ci0JLy8gbm90IG51bGwKLQlwcml2YXRlIGZpbmFsIEJvb2xlYW4gbnVsbFZhbHVlOwotCi0JLyoqCi0JICogQSB7QGxpbmsgVHJhbnNmb3JtZXJ9IHRoYXQgd2lsbCByZXR1cm4gdGhlIG9yaWdpbmFsIHtAbGluayBCb29sZWFufSB3aGVuCi0JICogaXQgaXMgbm9uLTxjb2RlPm51bGw8L2NvZGU+OyBvdGhlcndpc2UgdGhlIHtAbGluayBUcmFuc2Zvcm1lcn0gd2lsbCByZXR1cm4KLQkgKiB7QGxpbmsgQm9vbGVhbiNUUlVFfS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zZm9ybWVyPEJvb2xlYW4sIEJvb2xlYW4+IFRSVUUgPSBuZXcgTm9uTnVsbEJvb2xlYW5UcmFuc2Zvcm1lcihCb29sZWFuLlRSVUUpOwotCi0JLyoqCi0JICogQSB7QGxpbmsgVHJhbnNmb3JtZXJ9IHRoYXQgd2lsbCByZXR1cm4gdGhlIG9yaWdpbmFsIHtAbGluayBCb29sZWFufSB3aGVuCi0JICogaXQgaXMgbm9uLTxjb2RlPm51bGw8L2NvZGU+OyBvdGhlcndpc2UgdGhlIHtAbGluayBUcmFuc2Zvcm1lcn0gd2lsbCByZXR1cm4KLQkgKiB7QGxpbmsgQm9vbGVhbiNGQUxTRX0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lcjxCb29sZWFuLCBCb29sZWFuPiBGQUxTRSA9IG5ldyBOb25OdWxsQm9vbGVhblRyYW5zZm9ybWVyKEJvb2xlYW4uRkFMU0UpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgdHJhbnNmb3JtZXIgdGhhdCB3aWxsIHJldHVybiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlmIHRoZSBvcmlnaW5hbAotCSAqIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LiBUaHJvdyBhIHtAbGluayBOdWxsUG9pbnRlckV4Y2VwdGlvbn0gaWYgdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1lcjxCb29sZWFuLCBCb29sZWFuPiB2YWx1ZU9mKEJvb2xlYW4gYikgewotCQlyZXR1cm4gdmFsdWVPZihiLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSB0cmFuc2Zvcm1lciB0aGF0IHdpbGwgcmV0dXJuIHRoZSB7QGxpbmsgQm9vbGVhbn0gY29ycmVzcG9uZGluZwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgaWYgdGhlIG9yaWdpbmFsIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1lcjxCb29sZWFuLCBCb29sZWFuPiB2YWx1ZU9mKGJvb2xlYW4gYikgewotCQlyZXR1cm4gYiA/IFRSVUUgOiBGQUxTRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgb25seSAyIGNvbnN0YW50IHZlcnNpb25zLgotCSAqLwotCXByaXZhdGUgTm9uTnVsbEJvb2xlYW5UcmFuc2Zvcm1lcihCb29sZWFuIG51bGxWYWx1ZSkgewotCQlzdXBlcigpOwotCQlpZiAobnVsbFZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubnVsbFZhbHVlID0gbnVsbFZhbHVlOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIHRyYW5zZm9ybShCb29sZWFuIGIpIHsKLQkJcmV0dXJuIChiICE9IG51bGwpID8gYiA6IHRoaXMubnVsbFZhbHVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubnVsbFZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL05vdEJvb2xlYW5UcmFuc2Zvcm1lci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTm90Qm9vbGVhblRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZWU2YWEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTm90Qm9vbGVhblRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIEEgPGNvZGU+Tm90Qm9vbGVhblRyYW5zZm9ybWVyPC9jb2RlPiB3aWxsIHRyYW5zZm9ybSBhCi0gKiB7QGxpbmsgQm9vbGVhbn0gdG8gaXRzIE5PVCB2YWx1ZTo8dWw+Ci0gKiA8bGk+SWYgdGhlIG9yaWdpbmFsIHtAbGluayBCb29sZWFufSBpcyB7QGxpbmsgQm9vbGVhbiNUUlVFfSwKLSAqIHRoZSB0cmFuc2Zvcm1lciB3aWxsIHJldHVybiB7QGxpbmsgQm9vbGVhbiNGQUxTRX0uCi0gKiA8bGk+SWYgdGhlIG9yaWdpbmFsIHtAbGluayBCb29sZWFufSBpcyB7QGxpbmsgQm9vbGVhbiNGQUxTRX0sCi0gKiB0aGUgdHJhbnNmb3JtZXIgd2lsbCByZXR1cm4ge0BsaW5rIEJvb2xlYW4jVFJVRX0uCi0gKiA8bGk+SWYgdGhlIG9yaWdpbmFsIHtAbGluayBCb29sZWFufSBpcyA8Y29kZT5udWxsPC9jb2RlPiwKLSAqIHRoZSB0cmFuc2Zvcm1lciB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBjbGFzcyBOb3RCb29sZWFuVHJhbnNmb3JtZXIKLQlpbXBsZW1lbnRzIEJpZGlUcmFuc2Zvcm1lcjxCb29sZWFuLCBCb29sZWFuPiwgU2VyaWFsaXphYmxlCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQm9vbGVhbj4gSU5TVEFOQ0UgPSBuZXcgTm90Qm9vbGVhblRyYW5zZm9ybWVyKCk7Ci0KLQlwdWJsaWMgc3RhdGljIEJpZGlUcmFuc2Zvcm1lcjxCb29sZWFuLCBCb29sZWFuPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQlwcml2YXRlIE5vdEJvb2xlYW5UcmFuc2Zvcm1lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiB0cmFuc2Zvcm0oQm9vbGVhbiBiKSB7Ci0JCXJldHVybiAoYiA9PSBudWxsKSA/IG51bGwgOiBCb29sZWFuVG9vbHMubm90KGIpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIHJldmVyc2VUcmFuc2Zvcm0oQm9vbGVhbiBiKSB7Ci0JCXJldHVybiAoYiA9PSBudWxsKSA/IG51bGwgOiBCb29sZWFuVG9vbHMubm90KGIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTm90TnVsbEZpbHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTm90TnVsbEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWUyN2U0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL05vdE51bGxGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotCi0vKioKLSAqIFRoaXMgZmlsdGVyIGFjY2VwdHMgb25seSBub24tbnVsbCBvYmplY3RzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTm90TnVsbEZpbHRlcjxUPgotCWltcGxlbWVudHMgRmlsdGVyPFQ+LCBTZXJpYWxpemFibGUKLXsKLQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsdGVyIElOU1RBTkNFID0gbmV3IE5vdE51bGxGaWx0ZXIoKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPFI+IEZpbHRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQlwcml2YXRlIE5vdE51bGxGaWx0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLy8gYWNjZXB0IG9ubHkgbm9uLW51bGwgb2JqZWN0cwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChUIG8pIHsKLQkJcmV0dXJuIG8gIT0gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTnVsbExpc3QuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL051bGxMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNjU5M2QuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTnVsbExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgIm51bGwiIGxpc3QgaXMgYSBiaXQgZGlmZmVyZW50IGZyb20gYW4gImVtcHR5IiBsaXN0OiBpdCBhbGxvd3MgY2xpZW50cyB0bwotICogYWRkL3JlbW92ZSBlbGVtZW50cyB0by9mcm9tIGl0IGJ1dCBuZXZlciBjaGFuZ2VzLiBUaGlzIGlzIHVzZWZ1bAotICogZm9yIHBhc3NpbmcgdG8gbWV0aG9kcyB0aGF0IHJlcXVpcmUgYSAiY29sbGVjdGluZyBwYXJhbWV0ZXIiIGJ1dCB0aGUKLSAqIGNsaWVudCB3aWxsIGlnbm9yZSB0aGUgcmVzdWx0aW5nICJjb2xsZWN0aW9uIi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxMaXN0PEU+Ci0JaW1wbGVtZW50cyBMaXN0PEU+LCBTZXJpYWxpemFibGUKLXsKLQkvLyBzaW5nbGV0b24KLQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE51bGxMaXN0IElOU1RBTkNFID0gbmV3IE51bGxMaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE51bGxMaXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8pIHsKLQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlIGxpc3QgZGlkIG5vdCBjaGFuZ2UKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKLQkJLy8gaWdub3JlCi0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlIGxpc3QgZGlkIG5vdCBjaGFuZ2UKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXJldHVybiBmYWxzZTsgIC8vIHRoZSBsaXN0IGRpZCBub3QgY2hhbmdlCi0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCS8vIGlnbm9yZQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIGMuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkluZGV4OiAiICsgaW5kZXggKyAiLCBTaXplOiAwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgbykgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCXJldHVybiBmYWxzZTsgIC8vIHRoZSBsaXN0IGRpZCBub3QgY2hhbmdlCi0JfQotCi0JcHVibGljIEUgcmVtb3ZlKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArICIsIFNpemU6IDAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gZmFsc2U7ICAvLyB0aGUgbGlzdCBkaWQgbm90IGNoYW5nZQotCX0KLQotCXB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlIGxpc3QgZGlkIG5vdCBjaGFuZ2UKLQl9Ci0KLQlwdWJsaWMgRSBzZXQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKLQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkluZGV4OiAiICsgaW5kZXggKyAiLCBTaXplOiAwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIExpc3Q8RT4gc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9PQkpFQ1RfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gRU1QVFlfT0JKRUNUX0FSUkFZOwotCX0KLQotCXB1YmxpYyA8VD4gVFtdIHRvQXJyYXkoVFtdIGEpIHsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9RdWV1ZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvUXVldWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0NmJiYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9RdWV1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZGVmaW5pbmcgdGhlIGNsYXNzaWMgcXVldWUgYmVoYXZpb3IsCi0gKiB3aXRob3V0IHRoZSBiYWNrZG9vcnMgYWxsb3dlZCBieSB7QGxpbmsgamF2YS51dGlsLlF1ZXVlfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyBjb250YWluZWQgYnkgdGhlIHF1ZXVlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUXVldWU8RT4gewotCi0JLyoqCi0JICogIkVucXVldWUiIHRoZSBzcGVjaWZpZWQgaXRlbSB0byB0aGUgdGFpbCBvZiB0aGUgcXVldWUuCi0JICovCi0Jdm9pZCBlbnF1ZXVlKEUgbyk7Ci0KLQkvKioKLQkgKiAiRGVxdWV1ZSIgYW4gaXRlbSBmcm9tIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4KLQkgKi8KLQlFIGRlcXVldWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlbSBvbiB0aGUgaGVhZCBvZiB0aGUgcXVldWUKLQkgKiB3aXRob3V0IHJlbW92aW5nIGl0IGZyb20gdGhlIHF1ZXVlLgotCSAqLwotCUUgcGVlaygpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHF1ZXVlIGlzIGVtcHR5LgotCSAqLwotCWJvb2xlYW4gaXNFbXB0eSgpOwotCi0KLQlmaW5hbCBjbGFzcyBFbXB0eTxFPgotCQlpbXBsZW1lbnRzIFF1ZXVlPEU+LCBTZXJpYWxpemFibGUKLQl7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgUXVldWUgSU5TVEFOQ0UgPSBuZXcgRW1wdHkoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFQ+IFF1ZXVlPFQ+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBFbXB0eSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5xdWV1ZShFIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCXB1YmxpYyBFIGRlcXVldWUoKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXB1YmxpYyBFIHBlZWsoKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9SYW5nZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2NjA0Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9SYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBUaGlzIHNpbXBsZSBjb250YWluZXIgY2xhc3Mgc2ltcGx5IHB1dHMgYSBiaXQgb2Ygc2VtYW50aWNzCi0gKiBhcm91bmQgYSBwYWlyIG9mIG51bWJlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSYW5nZQotCWltcGxlbWVudHMgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQkvKiogVGhlIHN0YXJ0aW5nIGluZGV4IG9mIHRoZSByYW5nZS4gKi8KLQlwdWJsaWMgZmluYWwgaW50IHN0YXJ0OwotCi0JLyoqIFRoZSBlbmRpbmcgaW5kZXggb2YgdGhlIHJhbmdlLiAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZW5kOwotCi0JLyoqCi0JICogVGhlIHNpemUgY2FuIGJlIG5lZ2F0aXZlIGlmIHRoZSBlbmRpbmcgaW5kZXgKLQkgKiBpcyBsZXNzIHRoYW4gdGhlIHN0YXJ0aW5nIGluZGV4LgotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgc2l6ZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHN0YXJ0IGFuZCBlbmQsCi0JICogYm90aCBvZiB3aGljaCBhcmUgaW1tdXRhYmxlLgotCSAqLwotCXB1YmxpYyBSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zdGFydCA9IHN0YXJ0OwotCQl0aGlzLmVuZCA9IGVuZDsKLQkJdGhpcy5zaXplID0gZW5kIC0gc3RhcnQgKyAxOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSByYW5nZSBpbmNsdWRlcyB0aGUgc3BlY2lmaWVkCi0JICogaW5kZXguCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZXMoaW50IGluZGV4KSB7Ci0JCXJldHVybiAodGhpcy5zdGFydCA8PSBpbmRleCkgJiYgKGluZGV4IDw9IHRoaXMuZW5kKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKHRoaXMgPT0gbykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKCAhIChvIGluc3RhbmNlb2YgUmFuZ2UpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJUmFuZ2Ugb3RoZXJSYW5nZSA9IChSYW5nZSkgbzsKLQkJcmV0dXJuICh0aGlzLnN0YXJ0ID09IG90aGVyUmFuZ2Uuc3RhcnQpCi0JCQkmJiAodGhpcy5lbmQgPT0gb3RoZXJSYW5nZS5lbmQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0aGlzLnN0YXJ0IF4gdGhpcy5lbmQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFJhbmdlIGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChSYW5nZSkgc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gJ1snICsgdGhpcy5zdGFydCArICIsICIgKyB0aGlzLmVuZCArICddJzsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvUmVmbGVjdGlvblRvb2xzLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9SZWZsZWN0aW9uVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2MTdiOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9SZWZsZWN0aW9uVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgbWV0aG9kcyByZWxhdGVkIHRvIHRoZSA8Y29kZT5qYXZhLmxhbmcucmVmbGVjdDwvY29kZT4gcGFja2FnZS4KLSAqIFRoZXNlIG1ldGhvZHMgcHJvdmlkZSBzaG9ydGN1dHMgZm9yIG1hbmlwdWxhdGluZyBvYmplY3RzIHZpYQotICogcmVmbGVjdGlvbjsgcGFydGljdWxhcmx5IHdoZW4gZGVhbGluZyB3aXRoIGZpZWxkcyBhbmQvb3IgbWV0aG9kcyB0aGF0Ci0gKiBhcmUgbm90IHB1YmxpY2x5IGFjY2Vzc2libGUgb3IgYXJlIGluaGVyaXRlZC4KLSAqIDxwPgotICogSW4gbW9zdCBjYXNlcywgYWxsIGV4Y2VwdGlvbnMgYXJlIGhhbmRsZWQgYW5kIHdyYXBwZWQgaW4KLSAqIHtAbGluayBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbn1zOyBzbyB0aGVzZSBtZXRob2RzIHNob3VsZAotICogYmUgdXNlZCB3aGVuIHRoZXJlIHNob3VsZCBiZSBubyBwcm9ibGVtcyB1c2luZyByZWZsZWN0aW9uIChpLmUuCi0gKiB0aGUgcmVmZXJlbmNlZCBtZW1iZXJzIGFyZSBwcmVzdW1hYmx5IHByZXNlbnQgZXRjLikuCi0gKiA8cD4KLSAqIFRoZXJlIGFyZSBhbHNvIGEgbnVtYmVyIG9mIG1ldGhvZHMgd2hvc2UgbmFtZXMKLSAqIGVuZCB3aXRoIGFuIHVuZGVyc2NvcmUuIFRoZXNlIG1ldGhvZHMgZGVjbGFyZSB0aGUgZXhwZWN0ZWQgY2hlY2tlZAotICogZXhjZXB0aW9ucyAoZS5nLiB7QGxpbmsgTm9TdWNoTWV0aG9kRXhjZXB0aW9ufSwge0BsaW5rIE5vU3VjaEZpZWxkRXhjZXB0aW9ufSkuCi0gKiBUaGVzZSBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIHByb2JlCi0gKiBmb3IgbWV0aG9kcywgZmllbGRzLCBldGMuIHRoYXQgc2hvdWxkIGJlIHByZXNlbnQgYnV0IG1pZ2h0IG5vdCBiZS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJlZmxlY3Rpb25Ub29scyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPD8+W10gWkVST19QQVJBTUVURVJfVFlQRVMgPSBuZXcgQ2xhc3NbMF07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBaRVJPX0FSR1VNRU5UUyA9IG5ldyBPYmplY3RbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3RyaW5nVG9vbHMuQ1I7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPD8+IFZPSURfQ0xBU1MgPSB2b2lkLmNsYXNzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8amF2YS5sYW5nLlZvaWQ+IFZPSURfV1JBUFBFUl9DTEFTUyA9IGphdmEubGFuZy5Wb2lkLmNsYXNzOwotCi0KLQkvLyAqKioqKioqKioqIGZpZWxkcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBHZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgb2JqZWN0IGFuZCBmaWVsZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogPHA+Ci0JICogPGNvZGU+T2JqZWN0LmdldEZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RmllbGRWYWx1ZV8ob2JqZWN0LCBmaWVsZE5hbWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIGJ1aWxkRnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LCBmaWVsZE5hbWUpLCBleCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdCwgZmllbGROYW1lKSwgZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIG9iamVjdCBhbmQgZmllbGQgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIDxwPgotCSAqIDxjb2RlPk9iamVjdC5nZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEZpZWxkVmFsdWVfKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpCi0JCXRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldEZpZWxkXyhvYmplY3QsIGZpZWxkTmFtZSkuZ2V0KG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgc3RhdGljIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBjbGFzcyBhbmQgZmllbGQgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmdldFN0YXRpY0ZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0U3RhdGljRmllbGRWYWx1ZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRTdGF0aWNGaWVsZFZhbHVlXyhqYXZhQ2xhc3MsIGZpZWxkTmFtZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIGV4KTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIGJ1aWxkRnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSBzdGF0aWMgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIGNsYXNzIGFuZCBmaWVsZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0U3RhdGljRmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRTdGF0aWNGaWVsZFZhbHVlXyhDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUpCi0JCXRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldEZpZWxkXyhqYXZhQ2xhc3MsIGZpZWxkTmFtZSkuZ2V0KG51bGwpOwotCX0KLQotCS8qKgotCSAqIFNldCBhIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBvYmplY3QsIGZpZWxkIG5hbWUsIGFuZCBuZXcgdmFsdWUuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3Quc2V0RmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGaWVsZFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQl0cnkgewotCQkJc2V0RmllbGRWYWx1ZV8ob2JqZWN0LCBmaWVsZE5hbWUsIHZhbHVlKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdCwgZmllbGROYW1lKSwgZXgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCBhIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBvYmplY3QsIGZpZWxkIG5hbWUsIGFuZCBuZXcgdmFsdWUuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3Quc2V0RmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGaWVsZFZhbHVlXyhPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgdmFsdWUpCi0JCXRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotCXsKLQkJZ2V0RmllbGRfKG9iamVjdCwgZmllbGROYW1lKS5zZXQob2JqZWN0LCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGEgc3RhdGljIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBjbGFzcywgZmllbGQgbmFtZSwgYW5kIG5ldyB2YWx1ZS4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLnNldFN0YXRpY0ZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3RhdGljRmllbGRWYWx1ZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQl0cnkgewotCQkJc2V0U3RhdGljRmllbGRWYWx1ZV8oamF2YUNsYXNzLCBmaWVsZE5hbWUsIHZhbHVlKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKGphdmFDbGFzcywgZmllbGROYW1lKSwgZXgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCBhIHN0YXRpYyBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgY2xhc3MsIGZpZWxkIG5hbWUsIGFuZCBuZXcgdmFsdWUuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5zZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFN0YXRpY0ZpZWxkVmFsdWVfKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IHZhbHVlKQotCQl0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLQl7Ci0JCWdldEZpZWxkXyhqYXZhQ2xhc3MsIGZpZWxkTmFtZSkuc2V0KG51bGwsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgZmllbGQgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCBmaWVsZCBuYW1lLgotCSAqIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGRlZmluZSB0aGUgZmllbGQsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGZpZWxkIGFjY2Vzc2libGUuCi0JICogPHA+Ci0JICogPGNvZGU+T2JqZWN0LmdldEZpZWxkKFN0cmluZyBmaWVsZE5hbWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmllbGQgZ2V0RmllbGQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldEZpZWxkXyhvYmplY3QsIGZpZWxkTmFtZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBmaWVsZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIGZpZWxkIG5hbWUuCi0JICogSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogZGVmaW5lIHRoZSBmaWVsZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGQgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3QuZ2V0RmllbGQoU3RyaW5nIGZpZWxkTmFtZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZCBnZXRGaWVsZF8oT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkKLQkJdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0RmllbGRfKG9iamVjdC5nZXRDbGFzcygpLCBmaWVsZE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIGFuZCBmaWVsZCBuYW1lLgotCSAqIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGRlZmluZSB0aGUgZmllbGQsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGZpZWxkIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZCBnZXRGaWVsZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRGaWVsZF8oamF2YUNsYXNzLCBmaWVsZE5hbWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIGJ1aWxkRnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWVsZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBhbmQgZmllbGQgbmFtZS4KLQkgKiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBkZWZpbmUgdGhlIGZpZWxkLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBmaWVsZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmllbGQgZ2V0RmllbGRfKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkKLQkJdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uCi0JewotCQlGaWVsZCBmaWVsZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmaWVsZCA9IGphdmFDbGFzcy5nZXREZWNsYXJlZEZpZWxkKGZpZWxkTmFtZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7Ci0JCQlDbGFzczw/PiBzdXBlcmNsYXNzID0gamF2YUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQkJCWlmIChzdXBlcmNsYXNzID09IG51bGwpIHsKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJCXJldHVybiBnZXRGaWVsZF8oc3VwZXJjbGFzcywgZmllbGROYW1lKTsgIC8vIHJlY3Vyc2UKLQkJfQotCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQlyZXR1cm4gZmllbGQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgZmllbGRzIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgY2xhc3MsIGluY2x1ZGluZyBpbmhlcml0ZWQgZmllbGRzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGRzIGFjY2Vzc2libGUuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0QWxsRmllbGRzKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYWJsZTxGaWVsZD4gZ2V0QWxsRmllbGRzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlBcnJheUxpc3Q8RmllbGQ+IGZpZWxkcyA9IG5ldyBBcnJheUxpc3Q8RmllbGQ+KCk7Ci0JCWZvciAoQ2xhc3M8Pz4gdGVtcENsYXNzID0gamF2YUNsYXNzOyB0ZW1wQ2xhc3MgIT0gbnVsbDsgdGVtcENsYXNzID0gdGVtcENsYXNzLmdldFN1cGVyY2xhc3MoKSkgewotCQkJYWRkRGVjbGFyZWRGaWVsZHNUbyh0ZW1wQ2xhc3MsIGZpZWxkcyk7Ci0JCX0KLQkJcmV0dXJuIGZpZWxkczsKLQl9Ci0KLQkvKgotCSAqIEFkZCB0aGUgZGVjbGFyZWQgZmllbGRzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRGVjbGFyZWRGaWVsZHNUbyhDbGFzczw/PiBqYXZhQ2xhc3MsIEFycmF5TGlzdDxGaWVsZD4gZmllbGRzKSB7Ci0JCWZvciAoRmllbGQgZmllbGQgOiBnZXREZWNsYXJlZEZpZWxkcyhqYXZhQ2xhc3MpKSB7Ci0JCQlmaWVsZHMuYWRkKGZpZWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVjbGFyZWQgZmllbGRzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGRzIGFjY2Vzc2libGUuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0QWNjZXNzaWJsZURlY2xhcmVkRmllbGRzKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYWJsZTxGaWVsZD4gZ2V0RGVjbGFyZWRGaWVsZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCUZpZWxkW10gZmllbGRzID0gamF2YUNsYXNzLmdldERlY2xhcmVkRmllbGRzKCk7Ci0JCWZvciAoRmllbGQgZmllbGQgOiBmaWVsZHMpIHsKLQkJCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPEZpZWxkPihmaWVsZHMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgemVyby1hcmd1bWVudCBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3QuZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19BUkdVTUVOVFMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgb25lLWFyZ3VtZW50IG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIGFyZ3VtZW50LgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogPHA+Ci0JICogPGNvZGU+T2JqZWN0LmV4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBhcmd1bWVudCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgYXJndW1lbnQpIHsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHthcmd1bWVudH0pOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgYXJndW1lbnRzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogPHA+Ci0JICogPGNvZGU+T2JqZWN0LmV4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpIHsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2QoZ2V0TWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIHJlY2VpdmVyLCBhcmd1bWVudHMpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciBhbmQgYXJndW1lbnRzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgY2FjaGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZChNZXRob2QgbWV0aG9kLCBPYmplY3QgcmVjZWl2ZXIsIE9iamVjdFtdIGFyZ3VtZW50cykgewotCQl0cnkgewotCQkJcmV0dXJuIG1ldGhvZC5pbnZva2UocmVjZWl2ZXIsIGFyZ3VtZW50cyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBtZXRob2QsIGV4KTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWV0aG9kICsgQ1IgKyBleC5nZXRUYXJnZXRFeGNlcHRpb24oKSwgZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCwKLQkgKiBnaXZlbiB0aGUgcmVjZWl2ZXIgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogPHA+Ci0JICogPGNvZGU+T2JqZWN0LmV4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2RfKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kXyhyZWNlaXZlciwgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fQVJHVU1FTlRTKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIGFyZ3VtZW50LgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogPHA+Ci0JICogPGNvZGU+T2JqZWN0LmV4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBhcmd1bWVudCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZF8oT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZF8ocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHthcmd1bWVudH0pOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgYXJndW1lbnRzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogPHA+Ci0JICogPGNvZGU+T2JqZWN0LmV4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZF8oT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gYXJndW1lbnRzKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0TWV0aG9kXyhyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLmludm9rZShyZWNlaXZlciwgYXJndW1lbnRzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgc3RhdGljIG1ldGhvZCwKLQkgKiBnaXZlbiB0aGUgY2xhc3MgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBleGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fQVJHVU1FTlRTKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHN0YXRpYyBtZXRob2QsIGdpdmVuIHRoZSBjbGFzcywKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBhcmd1bWVudC4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmV4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBhcmd1bWVudCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgYXJndW1lbnQpIHsKLQkJcmV0dXJuIGV4ZWN1dGVTdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7YXJndW1lbnR9KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIGEgc3RhdGljIG1ldGhvZCwgZ2l2ZW4gdGhlIGNsYXNzLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBhcmd1bWVudHMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5leGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gYXJndW1lbnRzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZXhlY3V0ZVN0YXRpY01ldGhvZF8oamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgYXJndW1lbnRzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgZXgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgZXgpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihidWlsZEZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpICsgQ1IgKyBleC5nZXRUYXJnZXRFeGNlcHRpb24oKSwgZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSB6ZXJvLWFyZ3VtZW50IHN0YXRpYyBtZXRob2QsCi0JICogZ2l2ZW4gdGhlIGNsYXNzIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmV4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVTdGF0aWNNZXRob2RfKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBleGVjdXRlU3RhdGljTWV0aG9kXyhqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX0FSR1VNRU5UUyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgYXJndW1lbnQuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5leGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgYXJndW1lbnQpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVTdGF0aWNNZXRob2RfKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBhcmd1bWVudCkKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGV4ZWN1dGVTdGF0aWNNZXRob2RfKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge2FyZ3VtZW50fSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSBhIHN0YXRpYyBtZXRob2QsIGdpdmVuIHRoZSBjbGFzcywKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgYXJndW1lbnRzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gYXJndW1lbnRzKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kXyhDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRTdGF0aWNNZXRob2RfKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLmludm9rZShudWxsLCBhcmd1bWVudHMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBtZXRob2QgbmFtZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBnZXRNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHplcm8tYXJndW1lbnQgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIG1ldGhvZCBuYW1lLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kXyhDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0TWV0aG9kXyhqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUpIHsKLQkJcmV0dXJuIGdldE1ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcywgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZF8oQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSkKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldE1ldGhvZF8oamF2YUNsYXNzLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcywgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgewotCQl0cnkgewotCQkJcmV0dXJuIGdldE1ldGhvZF8oamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIGJ1aWxkRnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcywgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RfKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQl7Ci0JCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQl0cnkgewotCQkJbWV0aG9kID0gamF2YUNsYXNzLmdldERlY2xhcmVkTWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0JCQlDbGFzczw/PiBzdXBlcmNsYXNzID0gamF2YUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQkJCWlmIChzdXBlcmNsYXNzID09IG51bGwpIHsKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJCS8vIHJlY3Vyc2UKLQkJCXJldHVybiBnZXRNZXRob2RfKHN1cGVyY2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfQotCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJcmV0dXJuIG1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgemVyby1hcmd1bWVudCBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0JICogYW5kIG1ldGhvZCBuYW1lLiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBnZXRNZXRob2Qob2JqZWN0LmdldENsYXNzKCksIG1ldGhvZE5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QKLQkgKiBhbmQgbWV0aG9kIG5hbWUuIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RfKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0TWV0aG9kXyhvYmplY3QuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBnZXRNZXRob2Qob2JqZWN0LmdldENsYXNzKCksIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCwgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RfKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0TWV0aG9kXyhvYmplY3QuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKSB7Ci0JCXJldHVybiBnZXRNZXRob2Qob2JqZWN0LmdldENsYXNzKCksIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kXyhPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSkKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldE1ldGhvZF8ob2JqZWN0LmdldENsYXNzKCksIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSB6ZXJvLWFyZ3VtZW50IHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgbWV0aG9kIG5hbWUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gZ2V0U3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBzdGF0aWMgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0U3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBnZXRTdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZXN9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdGF0aWMgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldFN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0U3RhdGljTWV0aG9kXyhqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHplcm8tYXJndW1lbnQgc3RhdGljIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBtZXRob2QgbmFtZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldFN0YXRpY01ldGhvZF8oQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldFN0YXRpY01ldGhvZF8oamF2YUNsYXNzLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRTdGF0aWNNZXRob2RfKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGVzKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0U3RhdGljTWV0aG9kXyhqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlc30pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0U3RhdGljTWV0aG9kXyhDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JewotCQlNZXRob2QgbWV0aG9kID0gZ2V0TWV0aG9kXyhqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJaWYgKE1vZGlmaWVyLmlzU3RhdGljKG1ldGhvZC5nZXRNb2RpZmllcnMoKSkpIHsKLQkJCXJldHVybiBtZXRob2Q7Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbihidWlsZEZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBtZXRob2RzIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgY2xhc3MsIGluY2x1ZGluZyBpbmhlcml0ZWQgbWV0aG9kcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRBbGxNZXRob2RzKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYWJsZTxNZXRob2Q+IGdldEFsbE1ldGhvZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCUFycmF5TGlzdDxNZXRob2Q+IG1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZD4oKTsKLQkJZm9yIChDbGFzczw/PiB0ZW1wQ2xhc3MgPSBqYXZhQ2xhc3M7IHRlbXBDbGFzcyAhPSBudWxsOyB0ZW1wQ2xhc3MgPSB0ZW1wQ2xhc3MuZ2V0U3VwZXJjbGFzcygpKSB7Ci0JCQlhZGREZWNsYXJlZE1ldGhvZHNUbyh0ZW1wQ2xhc3MsIG1ldGhvZHMpOwotCQl9Ci0JCXJldHVybiBtZXRob2RzOwotCX0KLQotCS8qCi0JICogQWRkIHRoZSBkZWNsYXJlZCBtZXRob2RzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRGVjbGFyZWRNZXRob2RzVG8oQ2xhc3M8Pz4gamF2YUNsYXNzLCBBcnJheUxpc3Q8TWV0aG9kPiBtZXRob2RzKSB7Ci0JCWZvciAoTWV0aG9kIG1ldGhvZCA6IGdldERlY2xhcmVkTWV0aG9kcyhqYXZhQ2xhc3MpKSB7Ci0JCQltZXRob2RzLmFkZChtZXRob2QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWNsYXJlZCBtZXRob2RzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcyBhY2Nlc3NpYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmdldEFjY2Vzc2libGVEZWNsYXJlZE1ldGhvZHMoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPE1ldGhvZD4gZ2V0RGVjbGFyZWRNZXRob2RzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlNZXRob2RbXSBtZXRob2RzID0gamF2YUNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpOwotCQlmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7Ci0JCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJfQotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8TWV0aG9kPihtZXRob2RzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IKLQkgKiBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9yIGFjY2Vzc2libGUuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0RGVmYXVsdENvbnN0cnVjdG9yKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gZ2V0RGVmYXVsdENvbnN0cnVjdG9yKENsYXNzPFQ+IGphdmFDbGFzcykgewotCQlyZXR1cm4gZ2V0Q29uc3RydWN0b3IoamF2YUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3RvcgotCSAqIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3IgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRDb25zdHJ1Y3RvcigpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGdldENvbnN0cnVjdG9yKENsYXNzPFQ+IGphdmFDbGFzcykgewotCQlyZXR1cm4gZ2V0Q29uc3RydWN0b3IoamF2YUNsYXNzLCBaRVJPX1BBUkFNRVRFUl9UWVBFUyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3IgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRDb25zdHJ1Y3RvcihDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBnZXRDb25zdHJ1Y3RvcihDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUpIHsKLQkJcmV0dXJuIGdldENvbnN0cnVjdG9yKGphdmFDbGFzcywgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvciBhY2Nlc3NpYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmdldENvbnN0cnVjdG9yKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGdldENvbnN0cnVjdG9yKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgewotCQl0cnkgewotCQkJcmV0dXJuIGdldENvbnN0cnVjdG9yXyhqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yCi0JICogZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvciBhY2Nlc3NpYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmdldERlZmF1bHRDb25zdHJ1Y3RvcigpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGdldERlZmF1bHRDb25zdHJ1Y3Rvcl8oQ2xhc3M8VD4gamF2YUNsYXNzKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0Q29uc3RydWN0b3JfKGphdmFDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IKLQkgKiBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9yIGFjY2Vzc2libGUuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0Q29uc3RydWN0b3IoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBnZXRDb25zdHJ1Y3Rvcl8oQ2xhc3M8VD4gamF2YUNsYXNzKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0Q29uc3RydWN0b3JfKGphdmFDbGFzcywgWkVST19QQVJBTUVURVJfVFlQRVMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZS4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9yIGFjY2Vzc2libGUuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0Q29uc3RydWN0b3IoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gZ2V0Q29uc3RydWN0b3JfKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSkKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldENvbnN0cnVjdG9yXyhqYXZhQ2xhc3MsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3IgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRDb25zdHJ1Y3RvcihDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBnZXRDb25zdHJ1Y3Rvcl8oQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JewotCQlDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvciA9IGphdmFDbGFzcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKHBhcmFtZXRlclR5cGVzKTsKLQkJY29uc3RydWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVjbGFyZWQgY29uc3RydWN0b3JzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3JzIGFjY2Vzc2libGUuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0QWNjZXNzaWJsZURlY2xhcmVkQ29uc3RydWN0b3JzKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gSXRlcmFibGU8Q29uc3RydWN0b3I8VD4+IGdldERlY2xhcmVkQ29uc3RydWN0b3JzKENsYXNzPFQ+IGphdmFDbGFzcykgewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQ29uc3RydWN0b3I8VD5bXSBjb25zdHJ1Y3RvcnMgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKTsKLQkJZm9yIChDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvciA6IGNvbnN0cnVjdG9ycykgewotCQkJY29uc3RydWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJfQotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8Q29uc3RydWN0b3I8VD4+KGNvbnN0cnVjdG9ycyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNsYXNzICh3aXRob3V0IHRoZSBjaGVja2VkIGV4Y2VwdGlvbikuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0Zvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oY2xhc3NOYW1lLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgY2xhc3MgKHdpdGhvdXQgdGhlIGNoZWNrZWQgZXhjZXB0aW9uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lLCBib29sZWFuIGluaXRpYWxpemUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIGluaXRpYWxpemUsIGNsYXNzTG9hZGVyKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oY2xhc3NOYW1lLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhcnJheSBkZXB0aCIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZGVwdGggaXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGZvciBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBoYXZlIGEgZGVwdGggb2YgemVyby4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRBcnJheURlcHRoKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0QXJyYXlEZXB0aChDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJaW50IGRlcHRoID0gMDsKLQkJd2hpbGUgKGphdmFDbGFzcy5pc0FycmF5KCkpIHsKLQkJCWRlcHRoKys7Ci0JCQlqYXZhQ2xhc3MgPSBqYXZhQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBkZXB0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJlbGVtZW50IHR5cGUiIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGVsZW1lbnQgdHlwZSBpcyB0aGUgYmFzZSB0eXBlIGhlbGQgYnkgYW4gYXJyYXkgdHlwZS4KLQkgKiBBIG5vbi1hcnJheSB0eXBlIHNpbXBseSByZXR1cm5zIGl0c2VsZi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRFbGVtZW50VHlwZSgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZ2V0RWxlbWVudFR5cGUoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXdoaWxlIChqYXZhQ2xhc3MuaXNBcnJheSgpKSB7Ci0JCQlqYXZhQ2xhc3MgPSBqYXZhQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBqYXZhQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB3cmFwcGVyIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZAotCSAqIHByaW1pdGl2ZSBjbGFzcy4gUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBpcyBub3QgYSBwcmltaXRpdmUgY2xhc3MuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0V3JhcHBlckNsYXNzKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRXcmFwcGVyQ2xhc3MoQ2xhc3M8Pz4gcHJpbWl0aXZlQ2xhc3MpIHsKLQkJZm9yIChQcmltaXRpdmUgcHJpbWl0aXZlIDogUFJJTUlUSVZFUykgewotCQkJaWYgKHByaW1pdGl2ZS5qYXZhQ2xhc3MgPT0gcHJpbWl0aXZlQ2xhc3MpIHsKLQkJCQlyZXR1cm4gcHJpbWl0aXZlLndyYXBwZXJDbGFzczsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgcHJpbWl0aXZlIHdyYXBwZXIKLQkgKiBjbGFzcyAoaS5lLiA8Y29kZT5qYXZhLmxhbmcuVm9pZDwvY29kZT4gb3Igb25lIG9mIHRoZSBwcmltaXRpdmUKLQkgKiB2YXJpYWJsZSB3cmFwcGVyIGNsYXNzZXMsIDxjb2RlPmphdmEubGFuZy5Cb29sZWFuPC9jb2RlPiwKLQkgKiA8Y29kZT5qYXZhLmxhbmcuSW50ZWdlcjwvY29kZT4sIDxjb2RlPmphdmEubGFuZy5GbG9hdDwvY29kZT4sIGV0Yy4pLgotCSAqIDxwPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IDxjb2RlPnZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlPC9jb2RlPgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmlzUHJpbWl0aXZlV3JhcHBlcigpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc0lzUHJpbWl0aXZlV3JhcHBlcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJaWYgKGphdmFDbGFzcy5pc0FycmF5KCkgfHwgKGphdmFDbGFzcy5nZXROYW1lKCkubGVuZ3RoKCkgPiBNQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCWZvciAoUHJpbWl0aXZlIHByaW1pdGl2ZSA6IFBSSU1JVElWRVMpIHsKLQkJCWlmIChqYXZhQ2xhc3MgPT0gcHJpbWl0aXZlLndyYXBwZXJDbGFzcykgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInZhcmlhYmxlIiBwcmltaXRpdmUgd3JhcHBlcgotCSAqIGNsYXNzIChpLmUuIDxjb2RlPmphdmEubGFuZy5Cb29sZWFuPC9jb2RlPiwKLQkgKiA8Y29kZT5qYXZhLmxhbmcuSW50ZWdlcjwvY29kZT4sIDxjb2RlPmphdmEubGFuZy5GbG9hdDwvY29kZT4sIGV0Yy4sCi0JICogYnV0IG5vdCA8Y29kZT5qYXZhLmxhbmcuVm9pZDwvY29kZT4pLgotCSAqIDxwPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IDxjb2RlPnZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlPC9jb2RlPgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmlzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjbGFzc0lzUHJpbWl0aXZlV3JhcHBlcihqYXZhQ2xhc3MpCi0JCQkmJiAoamF2YUNsYXNzICE9IFZPSURfV1JBUFBFUl9DTEFTUyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ2YXJpYWJsZSIgcHJpbWl0aXZlCi0JICogY2xhc3MgKGkuZS4gPGNvZGU+Ym9vbGVhbjwvY29kZT4sIDxjb2RlPmludDwvY29kZT4sCi0JICogPGNvZGU+ZmxvYXQ8L2NvZGU+LCBldGMuLCBidXQgbm90IDxjb2RlPnZvaWQ8L2NvZGU+KS4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiA8Y29kZT52b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZTwvY29kZT4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5pc1ZhcmlhYmxlUHJpbWl0aXZlKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGphdmFDbGFzcy5pc1ByaW1pdGl2ZSgpICYmIChqYXZhQ2xhc3MgIT0gVk9JRF9DTEFTUyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcmltaXRpdmUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgcHJpbWl0aXZlIGNsYXNzIGNvZGUuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgY29kZQotCSAqIGlzIG5vdCBhIHByaW1pdGl2ZSBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZ2V0Q2xhc3NGb3JDb2RlKGludCBjbGFzc0NvZGUpIHsKLQkJcmV0dXJuIGdldENsYXNzRm9yQ29kZSgoY2hhcikgY2xhc3NDb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByaW1pdGl2ZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCBwcmltaXRpdmUgY2xhc3MgY29kZS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBjb2RlCi0JICogaXMgbm90IGEgcHJpbWl0aXZlIGNsYXNzIGNvZGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRDbGFzc0ZvckNvZGUoY2hhciBjbGFzc0NvZGUpIHsKLQkJZm9yIChQcmltaXRpdmUgcHJpbWl0aXZlIDogUFJJTUlUSVZFUykgewotCQkJaWYgKHByaW1pdGl2ZS5jb2RlID09IGNsYXNzQ29kZSkgewotCQkJCXJldHVybiBwcmltaXRpdmUuamF2YUNsYXNzOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgY29kZSBmb3IgdGhlIHNwZWNpZmllZCBwcmltaXRpdmUgY2xhc3MuCi0JICogUmV0dXJuIDxjb2RlPjA8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBpcyBub3QgYSBwcmltaXRpdmUgY2xhc3MuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyIGdldENvZGVGb3JDbGFzcyhDbGFzczw/PiBwcmltaXRpdmVDbGFzcykgewotCQlpZiAoKCAhIHByaW1pdGl2ZUNsYXNzLmlzQXJyYXkoKSkgJiYgKHByaW1pdGl2ZUNsYXNzLmdldE5hbWUoKS5sZW5ndGgoKSA8PSBNQVhfUFJJTUlUSVZFX0NMQVNTX05BTUVfTEVOR1RIKSkgewotCQkJZm9yIChQcmltaXRpdmUgcHJpbWl0aXZlIDogUFJJTUlUSVZFUykgewotCQkJCWlmIChwcmltaXRpdmUuamF2YUNsYXNzID09IHByaW1pdGl2ZUNsYXNzKSB7Ci0JCQkJCXJldHVybiBwcmltaXRpdmUuY29kZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluc3RhbnRpYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBjbGFzcydzIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLm5ld0luc3RhbmNlKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NOYW1lLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIGFyZ3VtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLm5ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBhcmd1bWVudCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShjbGFzc05hbWUsIHBhcmFtZXRlclR5cGUsIGFyZ3VtZW50LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzIGFuZCBhcmd1bWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MubmV3SW5zdGFuY2UoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gYXJndW1lbnRzKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGNsYXNzTmFtZSwgcGFyYW1ldGVyVHlwZXMsIGFyZ3VtZW50cywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBjbGFzcydzIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlciB0byBsb2FkIHRoZSBjbGFzcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5uZXdJbnN0YW5jZSgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShjbGFzc0Zvck5hbWUoY2xhc3NOYW1lLCBmYWxzZSwgY2xhc3NMb2FkZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIGFyZ3VtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLm5ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBhcmd1bWVudCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50LCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NGb3JOYW1lKGNsYXNzTmFtZSwgZmFsc2UsIGNsYXNzTG9hZGVyKSwgcGFyYW1ldGVyVHlwZSwgYXJndW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIGFyZ3VtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5uZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cywgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGNsYXNzRm9yTmFtZShjbGFzc05hbWUsIGZhbHNlLCBjbGFzc0xvYWRlciksIHBhcmFtZXRlclR5cGVzLCBhcmd1bWVudHMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiB1c2luZyB0aGUgY2xhc3MncyBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5uZXdJbnN0YW5jZSgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShqYXZhQ2xhc3MsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX0FSR1VNRU5UUyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZSBhbmQgYXJndW1lbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MubmV3SW5zdGFuY2UoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShqYXZhQ2xhc3MsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHthcmd1bWVudH0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIGFyZ3VtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5uZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXdJbnN0YW5jZV8oamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcywgYXJndW1lbnRzKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIGJ1aWxkRnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSwgZXgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLCBleCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGJ1aWxkRnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSArIENSICsgZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCksIGV4KTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MubmV3SW5zdGFuY2UoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlXyhDbGFzczxUPiBqYXZhQ2xhc3MpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBuZXdJbnN0YW5jZV8oamF2YUNsYXNzLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19BUkdVTUVOVFMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIGFyZ3VtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLm5ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBhcmd1bWVudCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBuZXdJbnN0YW5jZV8oQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgYXJndW1lbnQpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBuZXdJbnN0YW5jZV8oamF2YUNsYXNzLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7YXJndW1lbnR9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzIGFuZCBhcmd1bWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MubmV3SW5zdGFuY2UoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gYXJndW1lbnRzKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlXyhDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cykKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldENvbnN0cnVjdG9yXyhqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKS5uZXdJbnN0YW5jZShhcmd1bWVudHMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0eXBlIGRlY2xhcmF0aW9ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikKLQkJdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbl8odHlwZURlY2xhcmF0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIiwKLQkgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IGJ1aWxkVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7Ci0JCXJldHVybiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbih0ZC5lbGVtZW50VHlwZU5hbWUsIHRkLmFycmF5RGVwdGgsIGNsYXNzTG9hZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIiwKLQkgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uXyhTdHJpbmcgdHlwZURlY2xhcmF0aW9uLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLQkJdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLQl7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IGJ1aWxkVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7Ci0JCXJldHVybiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbl8odGQuZWxlbWVudFR5cGVOYW1lLCB0ZC5hcnJheURlcHRoLCBjbGFzc0xvYWRlcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHlwZURlY2xhcmF0aW9uIGJ1aWxkVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJdHlwZURlY2xhcmF0aW9uID0gU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZSh0eXBlRGVjbGFyYXRpb24pOwotCQlpbnQgYXJyYXlEZXB0aCA9IGdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25fKHR5cGVEZWNsYXJhdGlvbik7Ci0JCVN0cmluZyBlbGVtZW50VHlwZU5hbWUgPSBnZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb25fKHR5cGVEZWNsYXJhdGlvbiwgYXJyYXlEZXB0aCk7Ci0JCXJldHVybiBuZXcgVHlwZURlY2xhcmF0aW9uKGVsZW1lbnRUeXBlTmFtZSwgYXJyYXlEZXB0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBkZXB0aCBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiI7IGUuZy48dWw+Ci0JICogPGxpPjxjb2RlPiJpbnRbXSI8L2NvZGU+IHJldHVybnMgPGNvZGU+MTwvY29kZT4KLQkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5TdHJpbmdbXVtdW10iPC9jb2RlPiByZXR1cm5zIDxjb2RlPjM8L2NvZGU+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRBcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25fKFN0cmluZ1Rvb2xzLnJlbW92ZUFsbFdoaXRlc3BhY2UodHlwZURlY2xhcmF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogbm8gd2hpdGVzcGFjZSBpbiB0aGUgdHlwZSBkZWNsYXJhdGlvbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQlpbnQgbGFzdCA9IHR5cGVEZWNsYXJhdGlvbi5sZW5ndGgoKSAtIDE7Ci0JCWludCBkZXB0aCA9IDA7Ci0JCWludCBjbG9zZSA9IGxhc3Q7Ci0JCXdoaWxlICh0eXBlRGVjbGFyYXRpb24uY2hhckF0KGNsb3NlKSA9PSAnXScpIHsKLQkJCWlmICh0eXBlRGVjbGFyYXRpb24uY2hhckF0KGNsb3NlIC0gMSkgPT0gJ1snKSB7Ci0JCQkJZGVwdGgrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCB0eXBlIGRlY2xhcmF0aW9uOiAiICsgdHlwZURlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJY2xvc2UgPSBsYXN0IC0gKGRlcHRoICogMik7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudCB0eXBlIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iOyBlLmcuPHVsPgotCSAqIDxsaT48Y29kZT4iaW50W10iPC9jb2RlPiByZXR1cm5zIDxjb2RlPiJpbnQiPC9jb2RlPgotCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLlN0cmluZ1tdW11bXSI8L2NvZGU+IHJldHVybnMgPGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJdHlwZURlY2xhcmF0aW9uID0gU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZSh0eXBlRGVjbGFyYXRpb24pOwotCQlyZXR1cm4gZ2V0RWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uXyh0eXBlRGVjbGFyYXRpb24sIGdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25fKHR5cGVEZWNsYXJhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudCB0eXBlIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iOyBlLmcuPHVsPgotCSAqIDxsaT48Y29kZT4iaW50W10iPC9jb2RlPiByZXR1cm5zIDxjb2RlPiJpbnQiPC9jb2RlPgotCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLlN0cmluZ1tdW11bXSI8L2NvZGU+IHJldHVybnMgPGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPgotCSAqIDwvdWw+Ci0JICogVXNlZnVsIGZvciBjbGllbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IHF1ZXJpZWQgdGhlIHR5cGUgZGVjbGFyYXRpb24ncyBhcnJheSBkZXB0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbiwgaW50IGFycmF5RGVwdGgpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZSh0eXBlRGVjbGFyYXRpb24pLCBhcnJheURlcHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBubyB3aGl0ZXNwYWNlIGluIHRoZSB0eXBlIGRlY2xhcmF0aW9uLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb25fKFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIGludCBhcnJheURlcHRoKSB7Ci0JCXJldHVybiB0eXBlRGVjbGFyYXRpb24uc3Vic3RyaW5nKDAsIHR5cGVEZWNsYXJhdGlvbi5sZW5ndGgoKSAtIChhcnJheURlcHRoICogMikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHsKLQkJcmV0dXJuIGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKGVsZW1lbnRUeXBlTmFtZSwgYXJyYXlEZXB0aCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpCi0JCXRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb25fKGVsZW1lbnRUeXBlTmFtZSwgYXJyYXlEZXB0aCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIsCi0JICogdXNpbmcgdGhlIHNwZWNpZmllZCBjbGFzcyBsb2FkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbl8oZWxlbWVudFR5cGVOYW1lLCBhcnJheURlcHRoLCBjbGFzc0xvYWRlcik7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLAotCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2xhc3MgbG9hZGVyLgotCSAqLwotCS8vIHNlZSB0aGUgIkV2YWx1YXRpb24iIG9mIEpESyBidWcgNjQ0NjYyNyBmb3IgYSBkaXNjdXNzaW9uIG9mIGxvYWRpbmcgY2xhc3NlcwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb25fKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLQkJdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLQl7Ci0JCS8vIHByaW1pdGl2ZXMgY2Fubm90IGJlIGxvYWRlZCB2aWEgQ2xhc3MuZm9yTmFtZSgpLAotCQkvLyBzbyBjaGVjayBmb3IgYSBwcmltaXRpdmUgY2xhc3MgbmFtZSBmaXJzdAotCQlQcmltaXRpdmUgcGNjID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSA8PSBNQVhfUFJJTUlUSVZFX0NMQVNTX05BTUVfTEVOR1RIKSB7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQkJZm9yIChQcmltaXRpdmUgcHJpbWl0aXZlIDogUFJJTUlUSVZFUykgewotCQkJCWlmIChwcmltaXRpdmUuamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoZWxlbWVudFR5cGVOYW1lKSkgewotCQkJCQlwY2MgPSBwcmltaXRpdmU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIG5vbi1hcnJheQotCQlpZiAoYXJyYXlEZXB0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gKHBjYyA9PSBudWxsKSA/IENsYXNzLmZvck5hbWUoZWxlbWVudFR5cGVOYW1lLCBmYWxzZSwgY2xhc3NMb2FkZXIpIDogcGNjLmphdmFDbGFzczsKLQkJfQotCi0JCS8vIGFycmF5Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDApOwotCQlmb3IgKGludCBpID0gYXJyYXlEZXB0aDsgaS0tID4gMDsgKSB7Ci0JCQlzYi5hcHBlbmQoJ1snKTsKLQkJfQotCQlpZiAocGNjID09IG51bGwpIHsKLQkJCUNsYXNzTmFtZS5hcHBlbmQoZWxlbWVudFR5cGVOYW1lLCBzYik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQocGNjLmNvZGUpOwotCQl9Ci0JCXJldHVybiBDbGFzcy5mb3JOYW1lKHNiLnRvU3RyaW5nKCksIGZhbHNlLCBjbGFzc0xvYWRlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIjsgZS5nLjx1bD4KLQkgKiA8bGk+PGNvZGU+ImludCI8L2NvZGU+IHJldHVybnMgPGNvZGU+ImludCI8L2NvZGU+Ci0JICogPGxpPjxjb2RlPiJpbnRbXSI8L2NvZGU+IHJldHVybnMgPGNvZGU+IltJIjwvY29kZT4KLQkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPiByZXR1cm5zIDxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nIjwvY29kZT4KLQkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5TdHJpbmdbXVtdW10iPC9jb2RlPiByZXR1cm5zIDxjb2RlPiJbW1tMamF2YS5sYW5nLlN0cmluZzsiPC9jb2RlPgotCSAqIDwvdWw+Ci0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJVHlwZURlY2xhcmF0aW9uIHRkID0gYnVpbGRUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLQkJcmV0dXJuIGdldENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbih0ZC5lbGVtZW50VHlwZU5hbWUsIHRkLmFycmF5RGVwdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoKSB7Ci0JCS8vIG5vbi1hcnJheQotCQlpZiAoYXJyYXlEZXB0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gZWxlbWVudFR5cGVOYW1lOwotCQl9Ci0KLQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5lcXVhbHMoQ2xhc3NOYW1lLlZPSURfQ0xBU1NfTkFNRSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oJ1wnJyArIENsYXNzTmFtZS5WT0lEX0NMQVNTX05BTUUgKyAiJyBtdXN0IGhhdmUgYW4gYXJyYXkgZGVwdGggb2YgemVybzogIiArIGFycmF5RGVwdGggKyAnLicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gYXJyYXkKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMCk7Ci0JCWZvciAoaW50IGkgPSBhcnJheURlcHRoOyBpLS0gPiAwOyApIHsKLQkJCXNiLmFwcGVuZCgnWycpOwotCQl9Ci0KLQkJLy8gbG9vayBmb3IgYSBwcmltaXRpdmUgZmlyc3QKLQkJUHJpbWl0aXZlIHBjYyA9IG51bGw7Ci0JCWlmIChlbGVtZW50VHlwZU5hbWUubGVuZ3RoKCkgPD0gTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSCkgeyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJCWZvciAoUHJpbWl0aXZlIHByaW1pdGl2ZSA6IFBSSU1JVElWRVMpIHsKLQkJCQlpZiAocHJpbWl0aXZlLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnRUeXBlTmFtZSkpIHsKLQkJCQkJcGNjID0gcHJpbWl0aXZlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAocGNjID09IG51bGwpIHsKLQkJCUNsYXNzTmFtZS5hcHBlbmQoZWxlbWVudFR5cGVOYW1lLCBzYik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQocGNjLmNvZGUpOwotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4Y2VwdGlvbiBtZXNzYWdlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKENsYXNzPD8+IGphdmFDbGFzcywgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gYnVpbGRGdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG51bGwsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZEZpZWxkTmFtZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJc2IuYXBwZW5kKCcuJyk7Ci0JCXNiLmFwcGVuZChmaWVsZE5hbWUpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZEZpZWxkTmFtZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXJldHVybiBidWlsZEZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdC5nZXRDbGFzcygpLCBmaWVsZE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIG1ldGhvZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JCS8vIHRoaXMgY2hlY2sgYWxsb3dzIHVzIHRvIHVzZSB0aGlzIGNvZGUgZm9yIGNvbnN0cnVjdG9ycywgd2hlcmUgdGhlIG1ldGhvZE5hbWUgaXMgbnVsbAotCQlpZiAobWV0aG9kTmFtZSAhPSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQoJy4nKTsKLQkJCXNiLmFwcGVuZChtZXRob2ROYW1lKTsKLQkJfQotCQlzYi5hcHBlbmQoJygnKTsKLQkJaW50IG1heCA9IHBhcmFtZXRlclR5cGVzLmxlbmd0aCAtIDE7Ci0JCWlmIChtYXggIT0gLTEpIHsKLQkJCS8vIHN0b3Agb25lIHNob3J0IG9mIHRoZSBlbmQgb2YgdGhlIGFycmF5Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJc2IuYXBwZW5kKHBhcmFtZXRlclR5cGVzW2ldLmdldE5hbWUoKSk7Ci0JCQkJc2IuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzYi5hcHBlbmQocGFyYW1ldGVyVHlwZXNbbWF4XS5nZXROYW1lKCkpOwotCQl9Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJpbWl0aXZlIGNvbnN0YW50cyAqKioqKioqKioqCi0KLQlzdGF0aWMgZmluYWwgSXRlcmFibGU8UHJpbWl0aXZlPiBQUklNSVRJVkVTID0gYnVpbGRQcmltaXRpdmVzKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQllURV9DT0RFID0gJ0InOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDSEFSX0NPREUgPSAnQyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIERPVUJMRV9DT0RFID0gJ0QnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBGTE9BVF9DT0RFID0gJ0YnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBJTlRfQ09ERSA9ICdJJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgTE9OR19DT0RFID0gJ0onOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBTSE9SVF9DT0RFID0gJ1MnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBCT09MRUFOX0NPREUgPSAnWic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFZPSURfQ09ERSA9ICdWJzsKLQotCXN0YXRpYyBmaW5hbCBpbnQgTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSCA9IGNhbGN1bGF0ZU1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpOwotCXN0YXRpYyBmaW5hbCBpbnQgTUFYX1BSSU1JVElWRV9XUkFQUEVSX0NMQVNTX05BTUVfTEVOR1RIID0gY2FsY3VsYXRlTWF4UHJpbWl0aXZlV3JhcHBlckNsYXNzTmFtZUxlbmd0aCgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNhbGN1bGF0ZU1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpIHsKLQkJaW50IG1heCA9IC0xOwotCQlmb3IgKFByaW1pdGl2ZSBwcmltaXRpdmUgOiBQUklNSVRJVkVTKSB7Ci0JCQlpbnQgbGVuID0gcHJpbWl0aXZlLmphdmFDbGFzcy5nZXROYW1lKCkubGVuZ3RoKCk7Ci0JCQlpZiAobGVuID4gbWF4KSB7Ci0JCQkJbWF4ID0gbGVuOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNhbGN1bGF0ZU1heFByaW1pdGl2ZVdyYXBwZXJDbGFzc05hbWVMZW5ndGgoKSB7Ci0JCWludCBtYXggPSAtMTsKLQkJZm9yIChQcmltaXRpdmUgcHJpbWl0aXZlIDogUFJJTUlUSVZFUykgewotCQkJaW50IGxlbiA9IHByaW1pdGl2ZS53cmFwcGVyQ2xhc3MuZ2V0TmFtZSgpLmxlbmd0aCgpOwotCQkJaWYgKGxlbiA+IG1heCkgewotCQkJCW1heCA9IGxlbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwotCX0KLQotCS8qKgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IDxjb2RlPnZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIEl0ZXJhYmxlPFByaW1pdGl2ZT4gYnVpbGRQcmltaXRpdmVzKCkgewotCQlQcmltaXRpdmVbXSBhcnJheSA9IG5ldyBQcmltaXRpdmVbOV07Ci0JCWFycmF5WzBdID0gbmV3IFByaW1pdGl2ZShCWVRFX0NPREUsIGphdmEubGFuZy5CeXRlLmNsYXNzKTsKLQkJYXJyYXlbMV0gPSBuZXcgUHJpbWl0aXZlKENIQVJfQ09ERSwgamF2YS5sYW5nLkNoYXJhY3Rlci5jbGFzcyk7Ci0JCWFycmF5WzJdID0gbmV3IFByaW1pdGl2ZShET1VCTEVfQ09ERSwgamF2YS5sYW5nLkRvdWJsZS5jbGFzcyk7Ci0JCWFycmF5WzNdID0gbmV3IFByaW1pdGl2ZShGTE9BVF9DT0RFLCBqYXZhLmxhbmcuRmxvYXQuY2xhc3MpOwotCQlhcnJheVs0XSA9IG5ldyBQcmltaXRpdmUoSU5UX0NPREUsIGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzKTsKLQkJYXJyYXlbNV0gPSBuZXcgUHJpbWl0aXZlKExPTkdfQ09ERSwgamF2YS5sYW5nLkxvbmcuY2xhc3MpOwotCQlhcnJheVs2XSA9IG5ldyBQcmltaXRpdmUoU0hPUlRfQ09ERSwgamF2YS5sYW5nLlNob3J0LmNsYXNzKTsKLQkJYXJyYXlbN10gPSBuZXcgUHJpbWl0aXZlKEJPT0xFQU5fQ09ERSwgamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MpOwotCQlhcnJheVs4XSA9IG5ldyBQcmltaXRpdmUoVk9JRF9DT0RFLCBqYXZhLmxhbmcuVm9pZC5jbGFzcyk7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxQcmltaXRpdmU+KGFycmF5KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0Jc3RhdGljIGNsYXNzIFByaW1pdGl2ZSB7Ci0JCWZpbmFsIGNoYXIgY29kZTsKLQkJZmluYWwgQ2xhc3M8Pz4gamF2YUNsYXNzOwotCQlmaW5hbCBDbGFzczw/PiB3cmFwcGVyQ2xhc3M7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXUkFQUEVSX0NMQVNTX1RZUEVfRklFTERfTkFNRSA9ICJUWVBFIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBlLmcuIGphdmEubGFuZy5Cb29sZWFuLlRZUEUgPT4gYm9vbGVhbi5jbGFzcwotCQlQcmltaXRpdmUoY2hhciBjb2RlLCBDbGFzczw/PiB3cmFwcGVyQ2xhc3MpIHsKLQkJCXRoaXMuY29kZSA9IGNvZGU7Ci0JCQl0aGlzLndyYXBwZXJDbGFzcyA9IHdyYXBwZXJDbGFzczsKLQkJCXRoaXMuamF2YUNsYXNzID0gKENsYXNzPD8+KSBnZXRTdGF0aWNGaWVsZFZhbHVlKHdyYXBwZXJDbGFzcywgV1JBUFBFUl9DTEFTU19UWVBFX0ZJRUxEX05BTUUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZURlY2xhcmF0aW9uIHsKLQkJZmluYWwgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZTsKLQkJZmluYWwgaW50IGFycmF5RGVwdGg7Ci0JCVR5cGVEZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCkgewotCQkJdGhpcy5lbGVtZW50VHlwZU5hbWUgPSBlbGVtZW50VHlwZU5hbWU7Ci0JCQl0aGlzLmFycmF5RGVwdGggPSBhcnJheURlcHRoOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN1cHByZXNzZWQgY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIFJlZmxlY3Rpb25Ub29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9SZXZlcnNlQ29tcGFyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvUmV2ZXJzZUNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ4Yjg1OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9SZXZlcnNlQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNvbXBhcmF0b3Igd2lsbCByZXZlcnNlIHRoZSBvcmRlciBvZiB0aGUgc3BlY2lmaWVkIGNvbXBhcmF0b3IuCi0gKiBJZiB0aGUgY29tcGFyYXRvciBpcyBudWxsLCB0aGUgbmF0dXJhbCBvcmRlcmluZyBvZiB0aGUgb2JqZWN0cyB3aWxsIGJlIHVzZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXZlcnNlQ29tcGFyYXRvcjxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PgotCWltcGxlbWVudHMgQ29tcGFyYXRvcjxFPiwgU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBmaW5hbCBDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3I7Ci0KLQlwdWJsaWMgUmV2ZXJzZUNvbXBhcmF0b3IoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCi0JcHVibGljIFJldmVyc2VDb21wYXJhdG9yKENvbXBhcmF0b3I8RT4gY29tcGFyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbXBhcmF0b3IgPSBjb21wYXJhdG9yOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZShFIGUxLCBFIGUyKSB7Ci0JCXJldHVybiAodGhpcy5jb21wYXJhdG9yID09IG51bGwpID8KLQkJCWUyLmNvbXBhcmVUbyhlMSkKLQkJOgotCQkJdGhpcy5jb21wYXJhdG9yLmNvbXBhcmUoZTIsIGUxKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1J1bm5hYmxlQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvUnVubmFibGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNWJjYzYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvUnVubmFibGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBydW5uYWJsZSB0aGF0IGRvZXMgbm90aGluZy4KLSAqLwotcHVibGljIGNsYXNzIFJ1bm5hYmxlQWRhcHRlcgotCWltcGxlbWVudHMgUnVubmFibGUKLXsKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCS8vIE5PUAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZUFzc29jaWF0aW9uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVBc3NvY2lhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDkwYzI2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZUFzc29jaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQXNzb2NpYXRpb259LgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlQXNzb2NpYXRpb248SywgVj4KLQlleHRlbmRzIEFic3RyYWN0QXNzb2NpYXRpb248SywgVj4KLQlpbXBsZW1lbnRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBmaW5hbCBLIGtleTsKLQlwcml2YXRlIFYgdmFsdWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzc29jaWF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBrZXkKLQkgKiBhbmQgYSBudWxsIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTaW1wbGVBc3NvY2lhdGlvbihLIGtleSkgewotCQlzdXBlcigpOwotCQl0aGlzLmtleSA9IGtleTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXNzb2NpYXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBhbmQgdmFsdWUuCi0JICovCi0JcHVibGljIFNpbXBsZUFzc29jaWF0aW9uKEsga2V5LCBWIHZhbHVlKSB7Ci0JCXRoaXMoa2V5KTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCi0JcHVibGljIEsgZ2V0S2V5KCkgewotCQlyZXR1cm4gdGhpcy5rZXk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBWIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIFYgc2V0VmFsdWUoViB2YWx1ZSkgewotCQlWIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJcmV0dXJuIG9sZDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3luY2hyb25pemVkIFNpbXBsZUFzc29jaWF0aW9uPEssIFY+IGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChTaW1wbGVBc3NvY2lhdGlvbjxLLCBWPikgc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZUJvb2xlYW5SZWZlcmVuY2UuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZUJvb2xlYW5SZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUxNGI2OS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVCb29sZWFuUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBQcm92aWRlIGEgY29udGFpbmVyIGZvciBwYXNzaW5nIGEgZmxhZyB0aGF0IGNhbiBiZSBjaGFuZ2VkIGJ5IHRoZSByZWNpcGllbnQuCi0gKiAKLSAqIEBzZWUgU3luY2hyb25pemVkQm9vbGVhbgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlQm9vbGVhblJlZmVyZW5jZQotCWltcGxlbWVudHMgTW9kaWZpYWJsZUJvb2xlYW5SZWZlcmVuY2UsIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIEJhY2tpbmcgPGNvZGU+Ym9vbGVhbjwvY29kZT4uICovCi0JcHJvdGVjdGVkIHZvbGF0aWxlIGJvb2xlYW4gdmFsdWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ3JlYXRlIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gcmVmZXJlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTaW1wbGVCb29sZWFuUmVmZXJlbmNlKGJvb2xlYW4gdmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHJlZmVyZW5jZSB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICovCi0JcHVibGljIFNpbXBsZUJvb2xlYW5SZWZlcmVuY2UoKSB7Ci0JCXRoaXMoZmFsc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzKGJvb2xlYW4gdikgewotCQlyZXR1cm4gdGhpcy52YWx1ZSA9PSB2OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTm90KGJvb2xlYW4gdikgewotCQlyZXR1cm4gdGhpcy52YWx1ZSAhPSB2OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVHJ1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGYWxzZSgpIHsKLQkJcmV0dXJuICEgdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzZXRWYWx1ZShib29sZWFuIHZhbHVlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQlyZXR1cm4gb2xkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGZsaXAoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlID0gISB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNldE5vdChib29sZWFuIHYpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWUoICEgdik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2V0VHJ1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWUodHJ1ZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2V0RmFsc2UoKSB7Ci0JCXJldHVybiB0aGlzLnNldFZhbHVlKGZhbHNlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2ltcGxlQm9vbGVhblJlZmVyZW5jZSBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoU2ltcGxlQm9vbGVhblJlZmVyZW5jZSkgc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPYmplY3QgaWRlbnRpdHkgaXMgY3JpdGljYWwgdG8gYm9vbGVhbiByZWZlcmVuY2VzLgotCSAqIFRoZXJlIGlzIG5vIHJlYXNvbiBmb3IgdHdvIGRpZmZlcmVudCBib29sZWFuIHJlZmVyZW5jZXMgdG8gYmUKLQkgKiA8ZW0+ZXF1YWw8L2VtPi4KLQkgKiAKLQkgKiBAc2VlICNpcyhib29sZWFuKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBzdXBlci5lcXVhbHMob2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlICNlcXVhbHMoT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAnWycgKyBTdHJpbmcudmFsdWVPZih0aGlzLnZhbHVlKSArICddJzsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVGaWx0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDY2NDk4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLQotLyoqCi0gKiBTaW1wbGUsIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPkZpbHRlcjwvY29kZT4KLSAqIHRoYXQgaG9sZHMgb24gdG8gYSBjcml0ZXJpb24gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlCi0gKiB7QGxpbmsgI2FjY2VwdChPYmplY3QpIGFjY2VwdH0gb3Ige0BsaW5rICNyZWplY3QoT2JqZWN0KSByZWplY3R9Ci0gKiBtZXRob2RzLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBlaXRoZXIgb2YgdGhlc2UgbWV0aG9kcywKLSAqIGRlcGVuZGluZyBvbiB3aGljaCBpcyBlYXNpZXIgdG8gaW1wbGVtZW50LiBOb3RlIHRoYXQgYXQgbGVhc3QKLSAqIG9uZSBvZiB0aGVzZSBtZXRob2RzIDxlbT5tdXN0PC9lbT4gYmUgb3ZlcnJpZGRlbiBvcgotICogYW4gaW5maW5pdGUgbG9vcCB3aWxsIG9jY3VyLiBJZiBib3RoIG9mIHRoZW0gYXJlIG92ZXJyaWRkZW4sCi0gKiBvbmx5IHRoZSB7QGxpbmsgI2FjY2VwdChPYmplY3QpIGFjY2VwdH0gbWV0aG9kIHdpbGwgYmUgdXNlZC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBzaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBzdHJhaWdodGZvcndhcmQgaW5uZXIgY2xhc3Nlcy4KLSAqIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIGZpbHRlciB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlIAotICogRmlsdGVyaW5nSXRlcmFibGV9IHRvIHJldHVybiBvbmx5IHRob3NlIHN0cmluZ3MKLSAqIGluIHRoZSBuZXN0ZWQgaXRlcmFibGUgdGhhdCBzdGFydCB3aXRoIDxjb2RlPiJwcmVmaXgiPC9jb2RlPjoKLSAqIDxwcmU+Ci0gKiBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSBuZXcgU2ltcGxlRmlsdGVyPFN0cmluZywgU3RyaW5nPigicHJlZml4IikgewotICogICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChTdHJpbmcgc3RyaW5nKSB7Ci0gKiAgICAgICAgIHJldHVybiBzdHJpbmcuc3RhcnRzV2l0aChjcml0ZXJpb24pOwotICogICAgIH0KLSAqIH07Ci0gKiA8L3ByZT4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbXBsZUZpbHRlcjxULCBDPgotCWltcGxlbWVudHMgRmlsdGVyPFQ+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCXByb3RlY3RlZCBmaW5hbCBDIGNyaXRlcmlvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzaW1wbGUgZmlsdGVyIHdpdGggYSA8Y29kZT5udWxsPC9jb2RlPiBjcml0ZXJpb24KLQkgKi8KLQlwcm90ZWN0ZWQgU2ltcGxlRmlsdGVyKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQotCS8qKgotCSAqIE1vcmUgdXNlZnVsIGNvbnN0cnVjdG9yLiBUaGUgc3BlY2lmaWVkIGNyaXRlcmlvbiBjYW4KLQkgKiBiZSB1c2VkIGJ5IGEgc3ViY2xhc3MgdG8gImFjY2VwdCIgb3IgInJlamVjdCIgb2JqZWN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgU2ltcGxlRmlsdGVyKEMgY3JpdGVyaW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY3JpdGVyaW9uID0gY3JpdGVyaW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0aGUgc3BlY2lmaWVkIG9iamVjdCBzaG91bGQgYmUgInJlamVjdGVkIi4KLQkgKiBUaGUgc2VtYW50aWNzIG9mICJyZWplY3RlZCIgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY2xpZW50LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlamVjdChUIG8pIHsKLQkJcmV0dXJuICEgdGhpcy5hY2NlcHQobyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHNob3VsZCBiZSAiYWNjZXB0ZWQiLgotCSAqIFRoZSBzZW1hbnRpY3Mgb2YgImFjY2VwdGVkIiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjbGllbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KFQgbykgewotCQlyZXR1cm4gISB0aGlzLnJlamVjdChvKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpbHRlcidzIGNyaXRlcmlvbi4KLQkgKi8KLQlwdWJsaWMgQyBnZXRDcml0ZXJpb24oKSB7Ci0JCXJldHVybiB0aGlzLmNyaXRlcmlvbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2ltcGxlRmlsdGVyPFQsIEM+IGNsb25lKCkgewotCQl0cnkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlTaW1wbGVGaWx0ZXI8VCwgQz4gY2xvbmUgPSAoU2ltcGxlRmlsdGVyPFQsIEM+KSBzdXBlci5jbG9uZSgpOwotCQkJcmV0dXJuIGNsb25lOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBTaW1wbGVGaWx0ZXI8PywgPz4pKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU2ltcGxlRmlsdGVyPD8sID8+IG90aGVyID0gKFNpbXBsZUZpbHRlcjw/LCA/PikgbzsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMuY3JpdGVyaW9uLCBvdGhlci5jcml0ZXJpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiAodGhpcy5jcml0ZXJpb24gPT0gbnVsbCkgPyAwIDogdGhpcy5jcml0ZXJpb24uaGFzaENvZGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmNyaXRlcmlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlSW50UmVmZXJlbmNlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVJbnRSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM5NTBlYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVJbnRSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgd2hlcmV2ZXIgYSBtdXRhYmxlIGludGVnZXIgb2JqZWN0IGlzIG5lZWRlZC4KLSAqIEl0IGlzIGEgY3Jvc3MgYmV0d2VlbiBhbiA8Y29kZT5pbnQ8L2NvZGU+IGFuZCBhbiB7QGxpbmsgSW50ZWdlcn0uCi0gKiBJdCBjYW4gYmUgc3RvcmVkIGluIGEgc3RhbmRhcmQgY29udGFpbmVyIChlLmcuIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbn0pCi0gKiBidXQgY2FuIGJlIG1vZGlmaWVkLiBJdCBpcyBhbHNvIHVzZWZ1bCBwYXNzaW5nIGEgdmFsdWUgdGhhdCBjYW4gYmUgY2hhbmdlZAotICogYnkgdGhlIHJlY2lwaWVudC4KLSAqIAotICogQHNlZSBTeW5jaHJvbml6ZWRJbnQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNpbXBsZUludFJlZmVyZW5jZQotCWltcGxlbWVudHMgTW9kaWZpYWJsZUludFJlZmVyZW5jZSwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQkvKiogQmFja2luZyA8Y29kZT5pbnQ8L2NvZGU+LiAqLwotCXByaXZhdGUgdm9sYXRpbGUgaW50IHZhbHVlID0gMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSA8Y29kZT5pbnQ8L2NvZGU+IHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlSW50UmVmZXJlbmNlKGludCBjb3VudCkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gY291bnQ7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgPGNvZGU+aW50PC9jb2RlPiByZWZlcmVuY2Ugd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mIHplcm8uCi0JICovCi0JcHVibGljIFNpbXBsZUludFJlZmVyZW5jZSgpIHsKLQkJdGhpcygwKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgPT0gdjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBub3RFcXVhbChpbnQgdikgewotCQlyZXR1cm4gdGhpcy52YWx1ZSAhPSB2OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzWmVybygpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05vdFplcm8oKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlICE9IDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNHcmVhdGVyVGhhbihpbnQgdikgewotCQlyZXR1cm4gdGhpcy52YWx1ZSA+IHY7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNHcmVhdGVyVGhhbk9yRXF1YWwoaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgPj0gdjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xlc3NUaGFuKGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlIDwgdjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xlc3NUaGFuT3JFcXVhbChpbnQgdikgewotCQlyZXR1cm4gdGhpcy52YWx1ZSA8PSB2OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUG9zaXRpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmlzR3JlYXRlclRoYW4oMCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOb3RQb3NpdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNMZXNzVGhhbk9yRXF1YWwoMCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOZWdhdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNMZXNzVGhhbigwKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05vdE5lZ2F0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5pc0dyZWF0ZXJUaGFuT3JFcXVhbCgwKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGFicygpIHsKLQkJcmV0dXJuIE1hdGguYWJzKHRoaXMudmFsdWUpOwotCX0KLQotCXB1YmxpYyBpbnQgbmVnKCkgewotCQlyZXR1cm4gLXRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIGludCBhZGQoaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgKyB2OwotCX0KLQotCXB1YmxpYyBpbnQgc3VidHJhY3QoaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgLSB2OwotCX0KLQotCXB1YmxpYyBpbnQgbXVsdGlwbHkoaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgKiB2OwotCX0KLQotCXB1YmxpYyBpbnQgZGl2aWRlKGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlIC8gdjsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlbWFpbmRlcihpbnQgdikgewotCQlyZXR1cm4gdGhpcy52YWx1ZSAlIHY7Ci0JfQotCi0JcHVibGljIGludCBtaW4oaW50IHYpIHsKLQkJcmV0dXJuIE1hdGgubWluKHRoaXMudmFsdWUsIHYpOwotCX0KLQotCXB1YmxpYyBpbnQgbWF4KGludCB2KSB7Ci0JCXJldHVybiBNYXRoLm1heCh0aGlzLnZhbHVlLCB2KTsKLQl9Ci0KLQlwdWJsaWMgZG91YmxlIHBvdyhpbnQgdikgewotCQlyZXR1cm4gTWF0aC5wb3codGhpcy52YWx1ZSwgdik7Ci0JfQotCi0JcHVibGljIGludCBzZXRWYWx1ZShpbnQgdmFsdWUpIHsKLQkJaW50IG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJcmV0dXJuIG9sZDsKLQl9Ci0KLQlwdWJsaWMgaW50IHNldFplcm8oKSB7Ci0JCXJldHVybiB0aGlzLnNldFZhbHVlKDApOwotCX0KLQotCXB1YmxpYyBpbnQgaW5jcmVtZW50KCkgewotCQlyZXR1cm4gKyt0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyBpbnQgZGVjcmVtZW50KCkgewotCQlyZXR1cm4gLS10aGlzLnZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21wYXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKEludFJlZmVyZW5jZSByZWYpIHsKLQkJaW50IHYgPSByZWYuZ2V0VmFsdWUoKTsKLQkJcmV0dXJuICh0aGlzLnZhbHVlIDwgdikgPyAtMSA6ICgodGhpcy52YWx1ZSA9PSB2KSA/IDAgOiAxKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2ltcGxlSW50UmVmZXJlbmNlIGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChTaW1wbGVJbnRSZWZlcmVuY2UpIHN1cGVyLmNsb25lKCk7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICdbJyArIFN0cmluZy52YWx1ZU9mKHRoaXMudmFsdWUpICsgJ10nOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZUphdmFUeXBlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVKYXZhVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjk4OTBlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZUphdmFUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkphdmFUeXBlOwotCi0vKioKLSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIEphdmFUeXBlfSBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTaW1wbGVKYXZhVHlwZQotCWltcGxlbWVudHMgSmF2YVR5cGUsIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0KLQkvKioKLQkgKiBzdG9yZSB0aGUgdHlwZSBhcyBhIG5hbWUsIHNvIHdlIGNhbiByZWZlcmVuY2UgY2xhc3NlcwotCSAqIHRoYXQgYXJlIG5vdCBsb2FkZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBlbGVtZW50VHlwZU5hbWU7Ci0KLQkvKioKLQkgKiBub24tYXJyYXkgdHlwZXMgaGF2ZSBhbiBhcnJheSBkZXB0aCBvZiB6ZXJvCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgYXJyYXlEZXB0aDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCUkFDS0VUUyA9ICJbXSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIENhY2hlIHRoZSAic3RhbmRhcmQiIGphdmEgdHlwZXMgZm9yIHBlcmZvcm1hbmNlIAotCSAqIERlZmluaW5nIHRoaXMgYXMgamF2YS5sYW5nKiwgamF2YS51dGlsKiwgamF2YS5zcWwuKiBmb3IgYXJyYXkgZGltZW5zaW9uYWxpdHkgb2YgMAotCSAqIE1ha2UgdGhpcyBhIEhhc2hNYXAgZm9yIHBlcmZvcm1hbmNlLCBkdXBsaWNhdGUgY3JlYXRpb24gc2hvdWxkbid0IGJlIGFuIGlzc3VlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBKYXZhVHlwZT4gc3RhcmRhcmRKYXZhVHlwZXNDYWNoZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgSmF2YVR5cGU+KCk7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBVc2UgdGhpcyBmYWN0b3J5IG1ldGhvZCBmb3IgcGVyZm9ybWFuY2UuIFN0YW5kYXJkIGphdmEgdHlwZXMgd2lsbCBiZSBjYWNoZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZSBidWlsZFNpbXBsZUphdmFUeXBlKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoKSB7Ci0JCWlmIChhcnJheURlcHRoID09IDApIHsKLQkJCUphdmFUeXBlIGphdmFUeXBlID0gc3RhcmRhcmRKYXZhVHlwZXNDYWNoZS5nZXQoZWxlbWVudFR5cGVOYW1lKTsKLQkJCWlmIChqYXZhVHlwZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGphdmFUeXBlOwotCQkJfQotCQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5zdGFydHNXaXRoKCJqYXZhLmxhbmcuIikgfHwgLy8kTk9OLU5MUy0xJAotCQkJCQllbGVtZW50VHlwZU5hbWUuc3RhcnRzV2l0aCgiamF2YS51dGlsLiIpIHx8IC8vJE5PTi1OTFMtMSQKLQkJCQkJZWxlbWVudFR5cGVOYW1lLnN0YXJ0c1dpdGgoImphdmEuc3FsLiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShlbGVtZW50VHlwZU5hbWUsIGFycmF5RGVwdGgpOwotCQkJCXN0YXJkYXJkSmF2YVR5cGVzQ2FjaGUucHV0KGVsZW1lbnRUeXBlTmFtZSwgamF2YVR5cGUpOwotCQkJCXJldHVybiBqYXZhVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IFNpbXBsZUphdmFUeXBlKGVsZW1lbnRUeXBlTmFtZSwgYXJyYXlEZXB0aCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgSmF2YSB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IHR5cGUgYW5kIGFycmF5IGRlcHRoLgotCSAqLwotCXB1YmxpYyBTaW1wbGVKYXZhVHlwZShTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCkgewotCQlzdXBlcigpOwotCQlpZiAoKGVsZW1lbnRUeXBlTmFtZSA9PSBudWxsKSB8fCAoZWxlbWVudFR5cGVOYW1lLmxlbmd0aCgpID09IDApKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZWxlbWVudCB0eXBlIG5hbWUgaXMgcmVxdWlyZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoQ2xhc3NOYW1lLmdldEFycmF5RGVwdGgoZWxlbWVudFR5cGVOYW1lKSAhPSAwKSB7CQkvLyBlLmcuICJbTGphdmEubGFuZy5PYmplY3Q7IgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGVsZW1lbnQgdHlwZSBtdXN0IG5vdCBiZSBhbiBhcnJheTogIiArIGVsZW1lbnRUeXBlTmFtZSArICcuJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoYXJyYXlEZXB0aCA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBhcnJheSBkZXB0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvOiAiICsgYXJyYXlEZXB0aCArICcuJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZWxlbWVudFR5cGVOYW1lLmVxdWFscyh2b2lkLmNsYXNzLmdldE5hbWUoKSkgJiYgKGFycmF5RGVwdGggIT0gMCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIid2b2lkJyBtdXN0IGhhdmUgYW4gYXJyYXkgZGVwdGggb2YgemVybzogIiArIGFycmF5RGVwdGggKyAnLicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5lbGVtZW50VHlwZU5hbWUgPSBlbGVtZW50VHlwZU5hbWU7Ci0JCXRoaXMuYXJyYXlEZXB0aCA9IGFycmF5RGVwdGg7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgSmF2YSB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBjbGFzcyBuYW1lIGNhbiBiZSBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3Jtczo8dWw+PGNvZGU+Ci0JICogPGxpPmphdmEubGFuZy5PYmplY3QKLQkgKiA8bGk+aW50Ci0JICogPGxpPmphdmEudXRpbC5NYXAkRW50cnkKLQkgKiA8bGk+W0xqYXZhLmxhbmcuT2JqZWN0OwotCSAqIDxsaT5bSQotCSAqIDxsaT5bTGphdmEudXRpbC5NYXAkRW50cnk7Ci0JICogPC9jb2RlPjwvdWw+Ci0JICovCi0JcHVibGljIFNpbXBsZUphdmFUeXBlKFN0cmluZyBqYXZhQ2xhc3NOYW1lKSB7Ci0JCXRoaXMoQ2xhc3NOYW1lLmdldEVsZW1lbnRUeXBlTmFtZShqYXZhQ2xhc3NOYW1lKSwgQ2xhc3NOYW1lLmdldEFycmF5RGVwdGgoamF2YUNsYXNzTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIEphdmEgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlSmF2YVR5cGUoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXRoaXMoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2Vzc29ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFR5cGVOYW1lOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXJyYXlEZXB0aCgpIHsKLQkJcmV0dXJuIHRoaXMuYXJyYXlEZXB0aDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5hcnJheURlcHRoID4gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmFycmF5RGVwdGggPT0gMCkgJiYgQ2xhc3NOYW1lLmlzUHJpbWl0aXZlKHRoaXMuZWxlbWVudFR5cGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZVdyYXBwZXIoKSB7Ci0JCXJldHVybiAodGhpcy5hcnJheURlcHRoID09IDApICYmIENsYXNzTmFtZS5pc1ByaW1pdGl2ZVdyYXBwZXIodGhpcy5lbGVtZW50VHlwZU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFyaWFibGVQcmltaXRpdmUoKSB7Ci0JCXJldHVybiAodGhpcy5hcnJheURlcHRoID09IDApICYmIENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlKHRoaXMuZWxlbWVudFR5cGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcigpIHsKLQkJcmV0dXJuICh0aGlzLmFycmF5RGVwdGggPT0gMCkgJiYgQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKHRoaXMuZWxlbWVudFR5cGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3M8Pz4gZ2V0SmF2YUNsYXNzKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gUmVmbGVjdGlvblRvb2xzLmdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKHRoaXMuZWxlbWVudFR5cGVOYW1lLCB0aGlzLmFycmF5RGVwdGgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24odGhpcy5lbGVtZW50VHlwZU5hbWUsIHRoaXMuYXJyYXlEZXB0aCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbXBhcmlzb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKFN0cmluZyBvdGhlckVsZW1lbnRUeXBlTmFtZSwgaW50IG90aGVyQXJyYXlEZXB0aCkgewotCQlyZXR1cm4gKHRoaXMuYXJyYXlEZXB0aCA9PSBvdGhlckFycmF5RGVwdGgpCi0JCQkmJiB0aGlzLmVsZW1lbnRUeXBlTmFtZS5lcXVhbHMob3RoZXJFbGVtZW50VHlwZU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGRlc2NyaWJlcyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmVxdWFscyhDbGFzc05hbWUuZ2V0RWxlbWVudFR5cGVOYW1lKGNsYXNzTmFtZSksIENsYXNzTmFtZS5nZXRBcnJheURlcHRoKGNsYXNzTmFtZSkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGRlc2NyaWJlcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIHRoaXMuZGVzY3JpYmVzKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhKYXZhVHlwZSBvdGhlcikgewotCQlyZXR1cm4gdGhpcy5lcXVhbHMob3RoZXIuZ2V0RWxlbWVudFR5cGVOYW1lKCksIG90aGVyLmdldEFycmF5RGVwdGgoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCXJldHVybiAodGhpcyA9PSBvKSA/IHRydWUgOiAobyBpbnN0YW5jZW9mIEphdmFUeXBlKSA/IHRoaXMuZXF1YWxzKChKYXZhVHlwZSkgbykgOiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VHlwZU5hbWUuaGFzaENvZGUoKSBeIHRoaXMuYXJyYXlEZXB0aDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJpbnRpbmcgYW5kIGRpc3BsYXlpbmcgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBkZWNsYXJhdGlvbigpIHsKLQkJaWYgKHRoaXMuYXJyYXlEZXB0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VHlwZU5hbWVEZWNsYXJhdGlvbigpOwotCQl9Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcih0aGlzLmVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSArICgyICogdGhpcy5hcnJheURlcHRoKSk7Ci0JCXRoaXMuYXBwZW5kRGVjbGFyYXRpb25UbyhzYik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFwcGVuZERlY2xhcmF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5nZXRFbGVtZW50VHlwZU5hbWVEZWNsYXJhdGlvbigpKTsKLQkJZm9yIChpbnQgaSA9IHRoaXMuYXJyYXlEZXB0aDsgaS0tID4gMDsgKSB7Ci0JCQlzYi5hcHBlbmQoQlJBQ0tFVFMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbnREZWNsYXJhdGlvbk9uKFByaW50V3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50KHRoaXMuZ2V0RWxlbWVudFR5cGVOYW1lRGVjbGFyYXRpb24oKSk7Ci0JCWZvciAoaW50IGkgPSB0aGlzLmFycmF5RGVwdGg7IGktLSA+IDA7ICkgewotCQkJcHcucHJpbnQoQlJBQ0tFVFMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIDxjb2RlPickJzwvY29kZT4gdmVyc2lvbiBvZiB0aGUgbmFtZSBpcyB1c2VkIGluIHtAbGluayBDbGFzcyNmb3JOYW1lKFN0cmluZyl9LAotCSAqIGJ1dCB0aGUgPGNvZGU+Jy4nPC9jb2RlPiB2ZXJzaW9uIG9mIHRoZSBuYW1lIGlzIHVzZWQgaW4gc291cmNlIGNvZGUuCi0JICogVmVyeSBpcnJpdGF0aW5nLi4uLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEVsZW1lbnRUeXBlTmFtZURlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VHlwZU5hbWUucmVwbGFjZSgnJCcsICcuJyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJc2IuYXBwZW5kKCcoJyk7Ci0JCXRoaXMuYXBwZW5kRGVjbGFyYXRpb25UbyhzYik7Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIHN1cGVyLmNsb25lKCk7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVNZXRob2RTaWduYXR1cmUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZU1ldGhvZFNpZ25hdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTRiNTIzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZU1ldGhvZFNpZ25hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5KYXZhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuTWV0aG9kU2lnbmF0dXJlOwotCi0vKioKLSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTWV0aG9kU2lnbmF0dXJlIGludGVyZmFjZS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNpbXBsZU1ldGhvZFNpZ25hdHVyZQotCWltcGxlbWVudHMgTWV0aG9kU2lnbmF0dXJlLCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiBzdG9yZSB0aGUgcGFyYW1ldGVyIHR5cGVzIGFzIG5hbWVzLCBzbyB3ZSBjYW4gcmVmZXJlbmNlIGNsYXNzZXMKLQkgKiB0aGF0IGFyZSBub3QgbG9hZGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBKYXZhVHlwZVtdIHBhcmFtZXRlclR5cGVzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhVHlwZVtdIEVNUFRZX1BBUkFNRVRFUl9UWVBFUyA9IG5ldyBKYXZhVHlwZVswXTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfU0VQQVJBVE9SID0gIiwgIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBtZXRob2Qgc2lnbmF0dXJlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZAotCSAqIG5vIHBhcmFtZXRlciB0eXBlcy4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMobmFtZSwgRU1QVFlfUEFSQU1FVEVSX1RZUEVTKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBtZXRob2Qgc2lnbmF0dXJlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBwYXJhbWV0ZXIKLQkgKiB0eXBlcy4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKFN0cmluZyBuYW1lLCBKYXZhVHlwZS4uLiBwYXJhbWV0ZXJUeXBlcykgewotCQlzdXBlcigpOwotCQlpZiAoKG5hbWUgPT0gbnVsbCkgfHwgKG5hbWUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBuYW1lIGlzIHJlcXVpcmVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHBhcmFtZXRlclR5cGVzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBwYXJhbWV0ZXIgdHlwZXMgYXJlIHJlcXVpcmVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2hlY2tQYXJhbWV0ZXJUeXBlcyhwYXJhbWV0ZXJUeXBlcyk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMucGFyYW1ldGVyVHlwZXMgPSBwYXJhbWV0ZXJUeXBlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrUGFyYW1ldGVyVHlwZXMoSmF2YVR5cGVbXSBwYXJhbWV0ZXJUeXBlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocGFyYW1ldGVyVHlwZXNbaV0gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1pc3NpbmcgcGFyYW1ldGVyIHR5cGU6ICIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHBhcmFtZXRlclR5cGVzW2ldLmdldEVsZW1lbnRUeXBlTmFtZSgpLmVxdWFscyh2b2lkLmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIHBhcmFtZXRlciB0eXBlIG9mICd2b2lkJyBpcyBub3QgYWxsb3dlZDogIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBtZXRob2Qgc2lnbmF0dXJlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBwYXJhbWV0ZXIKLQkgKiB0eXBlcy4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKFN0cmluZyBuYW1lLCBTdHJpbmcuLi4gcGFyYW1ldGVyVHlwZU5hbWVzKSB7Ci0JCXRoaXMobmFtZSwgYnVpbGRQYXJhbWV0ZXJUeXBlcyhwYXJhbWV0ZXJUeXBlTmFtZXMpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBKYXZhVHlwZVtdIGJ1aWxkUGFyYW1ldGVyVHlwZXMoU3RyaW5nW10gcGFyYW1ldGVyVHlwZU5hbWVzKSB7Ci0JCWlmIChwYXJhbWV0ZXJUeXBlTmFtZXMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHBhcmFtZXRlciB0eXBlIG5hbWVzIGFyZSByZXF1aXJlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUphdmFUeXBlW10gcGFyYW1ldGVyVHlwZXMgPSBuZXcgSmF2YVR5cGVbcGFyYW1ldGVyVHlwZU5hbWVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocGFyYW1ldGVyVHlwZU5hbWVzW2ldID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNaXNzaW5nIHBhcmFtZXRlciB0eXBlIG5hbWU6ICIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcGFyYW1ldGVyVHlwZXNbaV0gPSBuZXcgU2ltcGxlSmF2YVR5cGUocGFyYW1ldGVyVHlwZU5hbWVzW2ldKTsKLQkJfQotCQlyZXR1cm4gcGFyYW1ldGVyVHlwZXM7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbWV0aG9kIHNpZ25hdHVyZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgcGFyYW1ldGVyCi0JICogdHlwZXMuCi0JICovCi0JcHVibGljIFNpbXBsZU1ldGhvZFNpZ25hdHVyZShTdHJpbmcgbmFtZSwgQ2xhc3M8Pz4uLi4gcGFyYW1ldGVySmF2YUNsYXNzZXMpIHsKLQkJdGhpcyhuYW1lLCBidWlsZFBhcmFtZXRlclR5cGVOYW1lcyhwYXJhbWV0ZXJKYXZhQ2xhc3NlcykpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGJ1aWxkUGFyYW1ldGVyVHlwZU5hbWVzKENsYXNzPD8+W10gcGFyYW1ldGVySmF2YUNsYXNzZXMpIHsKLQkJaWYgKHBhcmFtZXRlckphdmFDbGFzc2VzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBwYXJhbWV0ZXIgSmF2YSBjbGFzc2VzIGFyZSByZXF1aXJlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZ1tdIHBhcmFtZXRlclR5cGVOYW1lcyA9IG5ldyBTdHJpbmdbcGFyYW1ldGVySmF2YUNsYXNzZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJKYXZhQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHBhcmFtZXRlckphdmFDbGFzc2VzW2ldID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNaXNzaW5nIHBhcmFtZXRlciBKYXZhIGNsYXNzOiAiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXBhcmFtZXRlclR5cGVOYW1lc1tpXSA9IHBhcmFtZXRlckphdmFDbGFzc2VzW2ldLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gcGFyYW1ldGVyVHlwZU5hbWVzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG1ldGhvZCBzaWduYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgSmF2YSBtZXRob2QuCi0JICovCi0JcHVibGljIFNpbXBsZU1ldGhvZFNpZ25hdHVyZShNZXRob2QgbWV0aG9kKSB7Ci0JCXRoaXMobWV0aG9kLmdldE5hbWUoKSwgbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyBKYXZhVHlwZVtdIGdldFBhcmFtZXRlclR5cGVzKCkgewotCQlyZXR1cm4gdGhpcy5wYXJhbWV0ZXJUeXBlczsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29tcGFyaXNvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBkZXNjcmliZXMoTWV0aG9kIG1ldGhvZCkgewotCQlyZXR1cm4gdGhpcy5uYW1lLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKQotCQkJCSYmIHRoaXMucGFyYW1ldGVyVHlwZXNEZXNjcmliZShtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHBhcmFtZXRlclR5cGVzRGVzY3JpYmUoQ2xhc3M8Pz5bXSBvdGhlclBhcmFtZXRlclR5cGVzKSB7Ci0JCUphdmFUeXBlW10gbG9jYWxQYXJhbWV0ZXJUeXBlcyA9IHRoaXMucGFyYW1ldGVyVHlwZXM7Ci0JCWludCBsZW4gPSBsb2NhbFBhcmFtZXRlclR5cGVzLmxlbmd0aDsKLQkJaWYgKG90aGVyUGFyYW1ldGVyVHlwZXMubGVuZ3RoICE9IGxlbikgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIGxvY2FsUGFyYW1ldGVyVHlwZXNbaV0uZGVzY3JpYmVzKG90aGVyUGFyYW1ldGVyVHlwZXNbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0gICAgICAgIHJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhTdHJpbmcgb3RoZXJOYW1lLCBKYXZhVHlwZVtdIG90aGVyUGFyYW1ldGVyVHlwZXMpIHsKLQkJcmV0dXJuIHRoaXMubmFtZS5lcXVhbHMob3RoZXJOYW1lKQotCQkJCSYmIEFycmF5cy5lcXVhbHModGhpcy5wYXJhbWV0ZXJUeXBlcywgb3RoZXJQYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE1ldGhvZFNpZ25hdHVyZSBvdGhlcikgewotCQlyZXR1cm4gdGhpcy5lcXVhbHMob3RoZXIuZ2V0TmFtZSgpLCBvdGhlci5nZXRQYXJhbWV0ZXJUeXBlcygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuICh0aGlzID09IG8pID8gdHJ1ZSA6IChvIGluc3RhbmNlb2YgTWV0aG9kU2lnbmF0dXJlKSA/IHRoaXMuZXF1YWxzKChNZXRob2RTaWduYXR1cmUpIG8pIDogZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZS5oYXNoQ29kZSgpIF4gQXJyYXlzLmhhc2hDb2RlKHRoaXMucGFyYW1ldGVyVHlwZXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmludGluZyBhbmQgZGlzcGxheWluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFNpZ25hdHVyZSgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXRoaXMuYXBwZW5kU2lnbmF0dXJlVG8oc2IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhcHBlbmRTaWduYXR1cmVUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJSmF2YVR5cGVbXSBsb2NhbFBhcmFtZXRlclR5cGVzID0gdGhpcy5wYXJhbWV0ZXJUeXBlczsKLQkJaW50IGxlbiA9IGxvY2FsUGFyYW1ldGVyVHlwZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwKSB7Ci0JCQkJc2IuYXBwZW5kKFBBUkFNRVRFUl9TRVBBUkFUT1IpOwotCQkJfQotCQkJbG9jYWxQYXJhbWV0ZXJUeXBlc1tpXS5hcHBlbmREZWNsYXJhdGlvblRvKHNiKTsKLQkJfQotCQlzYi5hcHBlbmQoJyknKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludFNpZ25hdHVyZU9uKFByaW50V3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50KHRoaXMubmFtZSk7Ci0JCXB3LnByaW50KCcoJyk7Ci0JCUphdmFUeXBlW10gbG9jYWxQYXJhbWV0ZXJUeXBlcyA9IHRoaXMucGFyYW1ldGVyVHlwZXM7Ci0JCWludCBsZW4gPSBsb2NhbFBhcmFtZXRlclR5cGVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKGkgIT0gMCkgewotCQkJCXB3LnByaW50KFBBUkFNRVRFUl9TRVBBUkFUT1IpOwotCQkJfQotCQkJbG9jYWxQYXJhbWV0ZXJUeXBlc1tpXS5wcmludERlY2xhcmF0aW9uT24ocHcpOwotCQl9Ci0JCXB3LnByaW50KCcpJyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJc2IuYXBwZW5kKCcoJyk7Ci0JCXRoaXMuYXBwZW5kU2lnbmF0dXJlVG8oc2IpOwotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzdXBlci5jbG9uZSgpOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlT2JqZWN0UmVmZXJlbmNlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVPYmplY3RSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEwOGM0ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVPYmplY3RSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lk1vZGlmaWFibGVPYmplY3RSZWZlcmVuY2U7Ci0KLS8qKgotICogUHJvdmlkZSBhIGNvbnRhaW5lciBmb3IgcGFzc2luZyBhbiBvYmplY3QgdGhhdCBjYW4gYmUgY2hhbmdlZCBieSB0aGUgcmVjaXBpZW50LgotICogCi0gKiBAc2VlIFN5bmNocm9uaXplZE9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFY+Ci0JaW1wbGVtZW50cyBNb2RpZmlhYmxlT2JqZWN0UmVmZXJlbmNlPFY+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBCYWNraW5nIHZhbHVlLiAqLwotCXByaXZhdGUgdm9sYXRpbGUgViB2YWx1ZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDcmVhdGUgYW4gb2JqZWN0IHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlT2JqZWN0UmVmZXJlbmNlKFYgdmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBvYmplY3QgcmVmZXJlbmNlIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZgotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTaW1wbGVPYmplY3RSZWZlcmVuY2UoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbHVlICoqKioqKioqKioKLQotCXB1YmxpYyBWIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZUVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLnZhbHVlLCBvYmplY3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbHVlTm90RXF1YWwoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMudmFsdWUsIG9iamVjdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOdWxsKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZSA9PSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTm90TnVsbCgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgViBzZXRWYWx1ZShWIHZhbHVlKSB7Ci0JCVYgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQlyZXR1cm4gb2xkOwotCX0KLQotCXB1YmxpYyBWIHNldE51bGwoKSB7Ci0JCXJldHVybiB0aGlzLnNldFZhbHVlKG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTaW1wbGVPYmplY3RSZWZlcmVuY2U8Vj4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCVNpbXBsZU9iamVjdFJlZmVyZW5jZTxWPiBjbG9uZSA9IChTaW1wbGVPYmplY3RSZWZlcmVuY2U8Vj4pIHN1cGVyLmNsb25lKCk7Ci0JCQlyZXR1cm4gY2xvbmU7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICdbJyArIFN0cmluZy52YWx1ZU9mKHRoaXMudmFsdWUpICsgJ10nOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZVF1ZXVlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVRdWV1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmUwMjZjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZVF1ZXVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotCi0vKioKLSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFF1ZXVlfSBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVRdWV1ZTxFPgotCWltcGxlbWVudHMgUXVldWU8RT4sIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBMaW5rZWRMaXN0PEU+IGVsZW1lbnRzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBlbXB0eSBxdWV1ZS4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlUXVldWUoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBuZXcgTGlua2VkTGlzdDxFPigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHF1ZXVlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBjb2xsZWN0aW9uLiBUaGUgcXVldWUgd2lsbCBkZXF1ZXVlIGl0cyBlbGVtZW50cyBpbiB0aGUgc2FtZQotCSAqIG9yZGVyIHRoZXkgYXJlIHJldHVybmVkIGJ5IHRoZSBjb2xsZWN0aW9uJ3MgaXRlcmF0b3IgKGkuZS4gdGhlCi0JICogZmlyc3QgZWxlbWVudCByZXR1cm5lZCBieSB0aGUgY29sbGVjdGlvbidzIGl0ZXJhdG9yIHdpbGwgYmUgdGhlCi0JICogZmlyc3QgZWxlbWVudCByZXR1cm5lZCBieSB7QGxpbmsgI2RlcXVldWUoKX0pLgotCSAqLwotCXB1YmxpYyBTaW1wbGVRdWV1ZShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBuZXcgTGlua2VkTGlzdDxFPihjKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUXVldWUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgZW5xdWV1ZShFIG8pIHsKLQkJdGhpcy5lbGVtZW50cy5hZGRMYXN0KG8pOwotCX0KLQotCXB1YmxpYyBFIGRlcXVldWUoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRzLnJlbW92ZUZpcnN0KCk7Ci0JfQotCi0JcHVibGljIEUgcGVlaygpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudHMuZ2V0Rmlyc3QoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50cy5pc0VtcHR5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENsb25lYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2ltcGxlUXVldWU8RT4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCVNpbXBsZVF1ZXVlPEU+IGNsb25lID0gKFNpbXBsZVF1ZXVlPEU+KSBzdXBlci5jbG9uZSgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlMaW5rZWRMaXN0PEU+IGxsID0gKExpbmtlZExpc3Q8RT4pIHRoaXMuZWxlbWVudHMuY2xvbmUoKTsKLQkJCWNsb25lLmVsZW1lbnRzID0gbGw7Ci0JCQlyZXR1cm4gY2xvbmU7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5wZWVrKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlU3RhY2suamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZVN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MTZiNDkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlU3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFN0YWNrfSBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVTdGFjazxFPgotCWltcGxlbWVudHMgU3RhY2s8RT4sIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBMaW5rZWRMaXN0PEU+IGVsZW1lbnRzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBlbXB0eSBzdGFjay4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlU3RhY2soKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBuZXcgTGlua2VkTGlzdDxFPigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN0YWNrIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBjb2xsZWN0aW9uLiBUaGUgc3RhY2sgd2lsbCBwb3AgaXRzIGVsZW1lbnRzIGluIHJldmVyc2Ugb2YgdGhlCi0JICogb3JkZXIgdGhleSBhcmUgcmV0dXJuZWQgYnkgdGhlIGNvbGxlY3Rpb24ncyBpdGVyYXRvciAoaS5lLiB0aGUKLQkgKiBsYXN0IGVsZW1lbnQgcmV0dXJuZWQgYnkgdGhlIGNvbGxlY3Rpb24ncyBpdGVyYXRvciB3aWxsIGJlIHRoZQotCSAqIGZpcnN0IGVsZW1lbnQgcmV0dXJuZWQgYnkge0BsaW5rICNwb3AoKX0pLgotCSAqLwotCXB1YmxpYyBTaW1wbGVTdGFjayhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBuZXcgTGlua2VkTGlzdDxFPihjb2xsZWN0aW9uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3RhY2sgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgcHVzaChFIGVsZW1lbnQpIHsKLQkJdGhpcy5lbGVtZW50cy5hZGRMYXN0KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBFIHBvcCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmVsZW1lbnRzLnJlbW92ZUxhc3QoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCXB1YmxpYyBFIHBlZWsoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5lbGVtZW50cy5nZXRMYXN0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50cy5pc0VtcHR5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFNpbXBsZVN0YWNrPEU+IGNsb25lKCkgewotCQl0cnkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlTaW1wbGVTdGFjazxFPiBjbG9uZSA9IChTaW1wbGVTdGFjazxFPikgc3VwZXIuY2xvbmUoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJTGlua2VkTGlzdDxFPiBsbCA9IChMaW5rZWRMaXN0PEU+KSB0aGlzLmVsZW1lbnRzLmNsb25lKCk7Ci0JCQljbG9uZS5lbGVtZW50cyA9IGxsOwotCQkJcmV0dXJuIGNsb25lOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMucGVlaygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZVN0cmluZ01hdGNoZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZVN0cmluZ01hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4NWY3OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVTdHJpbmdNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotCi0vLyBUT0RPIHRoZSByZWdleCBjb2RlIGlzIG5vdCB2ZXJ5IGZhc3QgLSB3ZSBjb3VsZCBwcm9iYWJseSBkbyBiZXR0ZXIsCi0vLyBoYW5kLWNvZGluZyB0aGUgbWF0Y2hpbmcgYWxnb3JpdGhtIChlY2xpcHNlIFN0cmluZ01hdGNoZXI/KQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBzaW1wbGUgc3RyaW5nLW1hdGNoaW5nIGFsZ29yaXRobSB0aGF0IGlzIGEgbGl0dGxlCi0gKiBtb3JlIHVzZXItZnJpZW5kbHkgdGhhbiBzdGFuZGFyZCByZWd1bGFyIGV4cHJlc3Npb25zLiBJbnN0YW50aWF0ZSBhCi0gKiBzdHJpbmcgbWF0Y2hlciB3aXRoIGEgZmlsdGVyIHBhdHRlcm4gYW5kIHRoZW4geW91IGNhbiB1c2UgdGhlIG1hdGNoZXIKLSAqIHRvIGRldGVybWluZSB3aGV0aGVyIGFub3RoZXIgc3RyaW5nIChvciBvYmplY3QpIG1hdGNoZXMgdGhlIHBhdHRlcm4uCi0gKiBZb3UgY2FuIGFsc28gc3BlY2lmeSB3aGV0aGVyIHRoZSBtYXRjaGluZyBzaG91bGQgYmUgY2FzZS1zZW5zaXRpdmUuCi0gKiAKLSAqIFRoZSBwYXR0ZXJuIGNhbiBjb250YWluIHR3byAibWV0YS1jaGFyYWN0ZXJzIjoKLSAqIAknKicgd2lsbCBtYXRjaCBhbnkgc2V0IG9mIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzCi0gKiAJJz8nIHdpbGwgbWF0Y2ggYW55IHNpbmdsZSBjaGFyYWN0ZXIKLSAqIAotICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgI3ByZWZpeCgpIGFuZC9vciAjc3VmZml4KCkgdG8gY2hhbmdlIHdoYXQKLSAqIHN0cmluZ3MgYXJlIHByZXBlbmRlZCBvciBhcHBlbmRlZCB0byB0aGUgb3JpZ2luYWwgcGF0dGVybiBzdHJpbmcuCi0gKiBUaGlzIGNhbiBvZmZlciBhIHNsaWdodCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvdmVyIGNvbmNhdGVuYXRpbmcKLSAqIHN0cmluZ3MgYmVmb3JlIGNhbGxpbmcgI3NldFBhdHRlcm5TdHJpbmcoU3RyaW5nKS4KLSAqIEJ5IGRlZmF1bHQsIGEgJyonIGlzIGFwcGVuZGVkIHRvIGV2ZXJ5IHN0cmluZy4KLSAqIAotICogVGhpcyBjbGFzcyBhbHNvIHVzZXMgdGhlIHN0cmluZy1tYXRjaGluZyBhbGdvcml0aG0gdG8gImZpbHRlciIgb2JqZWN0cwotICogKGFuZCwgYXMgYSByZXN1bHQsIGFsc28gaW1wbGVtZW50cyB0aGUgRmlsdGVyIGludGVyZmFjZSkuCi0gKiBBIHN0cmluZyBjb252ZXJ0ZXIgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hhdCBzdHJpbmcgYXNwZWN0IG9mIHRoZQotICogb2JqZWN0IGlzIGNvbXBhcmVkIHRvIHRoZSBwYXR0ZXJuLiBCeSBkZWZhdWx0IHRoZSBzdHJpbmcgcmV0dXJuZWQKLSAqIGJ5IHRoZSBvYmplY3QncyAjdG9TdHJpbmcoKSBtZXRob2QgaXMgcGFzc2VkIHRvIHRoZSBwYXR0ZXJuIG1hdGNoZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVTdHJpbmdNYXRjaGVyPFQ+Ci0JaW1wbGVtZW50cyBTdHJpbmdNYXRjaGVyLCBGaWx0ZXI8VD4sIFNlcmlhbGl6YWJsZQotewotCi0JLyoqIEFuIGFkYXB0ZXIgdGhhdCBjb252ZXJ0cyB0aGUgb2JqZWN0cyBpbnRvIHN0cmluZ3MgdG8gYmUgbWF0Y2hlZCB3aXRoIHRoZSBwYXR0ZXJuLiAqLwotCXByaXZhdGUgU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcjsKLQotCS8qKiBUaGUgc3RyaW5nIHVzZWQgdG8gY29uc3RydWN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4gKi8KLQlwcml2YXRlIFN0cmluZyBwYXR0ZXJuU3RyaW5nOwotCi0JLyoqIFdoZXRoZXIgdGhlIG1hdGNoZXIgaWdub3JlcyBjYXNlIC0gdGhlIGRlZmF1bHQgaXMgdHJ1ZS4gKi8KLQlwcml2YXRlIGJvb2xlYW4gaWdub3Jlc0Nhc2U7Ci0KLQkvKiogVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIGJ1aWx0IGZyb20gdGhlIHBhdHRlcm4gc3RyaW5nLiAqLwotCXByaXZhdGUgUGF0dGVybiBwYXR0ZXJuOwotCi0JLyoqIEEgbGlzdCBvZiB0aGUgbWV0YS1jaGFyYWN0ZXJzIHdlIG5lZWQgdG8gZXNjYXBlIGlmIGZvdW5kIGluIHRoZSBwYXR0ZXJuIHN0cmluZy4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBSRUdfRVhfTUVUQV9DSEFSUyA9IHsgJygnLCAnWycsICd7JywgJ1xcJywgJ14nLCAnJCcsICd8JywgJyknLCAnPycsICcqJywgJysnLCAnLicgfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdHJpbmcgbWF0Y2hlciB3aXRoIGFuIHBhdHRlcm4gdGhhdCB3aWxsIG1hdGNoCi0JICogYW55IHN0cmluZyBhbmQgaWdub3JlIGNhc2UuCi0JICovCi0JcHVibGljIFNpbXBsZVN0cmluZ01hdGNoZXIoKSB7Ci0JCXRoaXMoIioiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN0cmluZyBtYXRjaGVyIHdpdGggdGhlIHNwZWNpZmllZCBwYXR0ZXJuCi0JICogdGhhdCB3aWxsIGlnbm9yZSBjYXNlLgotCSAqLwotCXB1YmxpYyBTaW1wbGVTdHJpbmdNYXRjaGVyKFN0cmluZyBwYXR0ZXJuU3RyaW5nKSB7Ci0JCXRoaXMocGF0dGVyblN0cmluZywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RyaW5nIG1hdGNoZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdHRlcm4gdGhhdCB3aWxsCi0JICogaWdub3JlIGNhc2UgYXMgc3BlY2lmaWVkLgotCSAqLwotCXB1YmxpYyBTaW1wbGVTdHJpbmdNYXRjaGVyKFN0cmluZyBwYXR0ZXJuU3RyaW5nLCBib29sZWFuIGlnbm9yZXNDYXNlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucGF0dGVyblN0cmluZyA9IHBhdHRlcm5TdHJpbmc7Ci0JCXRoaXMuaWdub3Jlc0Nhc2UgPSBpZ25vcmVzQ2FzZTsKLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuc3RyaW5nQ29udmVydGVyID0gU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuaW5zdGFuY2UoKTsKLQkJdGhpcy5yZWJ1aWxkUGF0dGVybigpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIHRoZSBjdXJyZW50IHBhdHRlcm4gc3RyaW5nIGFuZCBjYXNlLXNlbnNpdGl2aXR5IHNldHRpbmcsCi0JICogcmUtYnVpbGQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCByZWJ1aWxkUGF0dGVybigpIHsKLQkJdGhpcy5wYXR0ZXJuID0gdGhpcy5idWlsZFBhdHRlcm4oKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgY3VycmVudCBwYXR0ZXJuIHN0cmluZyBhbmQgY2FzZS1zZW5zaXRpdml0eSBzZXR0aW5nLAotCSAqIGJ1aWxkIGFuZCByZXR1cm4gYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0aGF0IGNhbiBiZSB1c2VkCi0JICogdG8gbWF0Y2ggc3RyaW5ncy4KLQkgKi8KLQlwcm90ZWN0ZWQgUGF0dGVybiBidWlsZFBhdHRlcm4oKSB7Ci0JCWludCBwYXR0ZXJuRmxhZ3MgPSAweDA7Ci0JCWlmICh0aGlzLmlnbm9yZXNDYXNlKSB7Ci0JCQlwYXR0ZXJuRmxhZ3MgPSBQYXR0ZXJuLlVOSUNPREVfQ0FTRSB8IFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRTsKLQkJfQotCQlyZXR1cm4gUGF0dGVybi5jb21waWxlKHRoaXMuY29udmVydFRvUmVnRXgodGhpcy5wYXR0ZXJuU3RyaW5nKSwgcGF0dGVybkZsYWdzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3RyaW5nTWF0Y2hlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UGF0dGVyblN0cmluZyhTdHJpbmcgcGF0dGVyblN0cmluZykgewotCQl0aGlzLnBhdHRlcm5TdHJpbmcgPSBwYXR0ZXJuU3RyaW5nOwotCQl0aGlzLnJlYnVpbGRQYXR0ZXJuKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgbWF0Y2hlcyB0aGUgcGF0dGVybi4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiB0aGlzLnBhdHRlcm4ubWF0Y2hlcihzdHJpbmcpLm1hdGNoZXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRmlsdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhY2NlcHQoVCBvKSB7Ci0JCXJldHVybiB0aGlzLm1hdGNoZXModGhpcy5zdHJpbmdDb252ZXJ0ZXIuY29udmVydFRvU3RyaW5nKG8pKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3RyaW5nIGNvbnZlcnRlciB1c2VkIHRvIGNvbnZlcnQgdGhlIG9iamVjdHMKLQkgKiBwYXNzZWQgdG8gdGhlIG1hdGNoZXIgaW50byBzdHJpbmdzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMuc3RyaW5nQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3RyaW5nIGNvbnZlcnRlciB1c2VkIHRvIGNvbnZlcnQgdGhlIG9iamVjdHMKLQkgKiBwYXNzZWQgdG8gdGhlIG1hdGNoZXIgaW50byBzdHJpbmdzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTdHJpbmdDb252ZXJ0ZXIoU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcikgewotCQl0aGlzLnN0cmluZ0NvbnZlcnRlciA9IHN0cmluZ0NvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9yaWdpbmFsIHBhdHRlcm4gc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHBhdHRlcm5TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLnBhdHRlcm5TdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1hdGNoZXIgaWdub3JlcyBjYXNlLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpZ25vcmVzQ2FzZSgpIHsKLQkJcmV0dXJuIHRoaXMuaWdub3Jlc0Nhc2U7Ci0JfQotCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgdGhlIG1hdGNoZXIgaWdub3JlcyBjYXNlLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRJZ25vcmVzQ2FzZShib29sZWFuIGlnbm9yZXNDYXNlKSB7Ci0JCXRoaXMuaWdub3Jlc0Nhc2UgPSBpZ25vcmVzQ2FzZTsKLQkJdGhpcy5yZWJ1aWxkUGF0dGVybigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBQYXR0ZXJuIHBhdHRlcm4oKSB7Ci0JCXJldHVybiB0aGlzLnBhdHRlcm47Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG90aGVyIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0bwotCSAqIHRoZSBvcmlnaW5hbCBwYXR0ZXJuIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyByZWd1bGFyRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydFRvUmVnRXgodGhpcy5wYXR0ZXJuU3RyaW5nKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgcmVndWxhciBleHByZXNzaW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvUmVnRXgoU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHN0cmluZy5sZW5ndGgoKSArIDEwKTsKLQkJdGhpcy5jb252ZXJ0VG9SZWdFeE9uKHRoaXMucHJlZml4KCksIHNiKTsKLQkJdGhpcy5jb252ZXJ0VG9SZWdFeE9uKHN0cmluZywgc2IpOwotCQl0aGlzLmNvbnZlcnRUb1JlZ0V4T24odGhpcy5zdWZmaXgoKSwgc2IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW55IHByZWZpeCB0aGF0IHNob3VsZCBiZSBwcmVwZW5kZWQgdG8gdGhlIG9yaWdpbmFsCi0JICogc3RyaW5nLiBCeSBkZWZhdWx0LCB0aGVyZSBpcyBubyBwcmVmaXguCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVmaXgoKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbnkgc3VmZml4IHRoYXQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIHRoZSBvcmlnaW5hbAotCSAqIHN0cmluZy4gU2luY2UgdGhpcyBjbGFzcyBpcyB0eXBpY2FsbHkgdXNlZCBpbiBVSSBzaXR1YXRpb24gd2hlcmUKLQkgKiB0aGUgdXNlciBpcyB0eXBpbmcgaW4gYSBwYXR0ZXJuIHVzZWQgdG8gZmlsdGVyIGEgbGlzdCwgdGhlIGRlZmF1bHQKLQkgKiBzdWZmaXggaXMgYSB3aWxkY2FyZCBjaGFyYWN0ZXIuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzdWZmaXgoKSB7Ci0JCXJldHVybiAiKiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgcmVndWxhciBleHByZXNzaW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbnZlcnRUb1JlZ0V4T24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWNoYXJbXSBjaGFyQXJyYXkgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJaW50IGxlbmd0aCA9IGNoYXJBcnJheS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgYyA9IGNoYXJBcnJheVtpXTsKLQkJCS8vIGNvbnZlcnQgdXNlci1mcmllbmRseSBtZXRhLWNoYXJzIGludG8gcmVnZXggbWV0YS1jaGFycwotCQkJaWYgKGMgPT0gJyonKSB7Ci0JCQkJc2IuYXBwZW5kKCIuKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoYyA9PSAnPycpIHsKLQkJCQlzYi5hcHBlbmQoJy4nKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8vIGVzY2FwZSByZWdleCBtZXRhLWNoYXJzCi0JCQlpZiAoQXJyYXlUb29scy5jb250YWlucyhSRUdfRVhfTUVUQV9DSEFSUywgYykpIHsKLQkJCQlzYi5hcHBlbmQoJ1xcJyk7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoYyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZVRocmVhZEZhY3RvcnkuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZVRocmVhZEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJhOGNjMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVUaHJlYWRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7Ci0KLS8qKgotICogQSA8Y29kZT5TaW1wbGVUaHJlYWRGYWN0b3J5PC9jb2RlPiBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZgotICogdGhlIEpESyB7QGxpbmsgVGhyZWFkRmFjdG9yeX0uCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVUaHJlYWRGYWN0b3J5Ci0JaW1wbGVtZW50cyBUaHJlYWRGYWN0b3J5LCBTZXJpYWxpemFibGUKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVUaHJlYWRGYWN0b3J5IElOU1RBTkNFID0gbmV3IFNpbXBsZVRocmVhZEZhY3RvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGhyZWFkRmFjdG9yeSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBTaW1wbGVUaHJlYWRGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKFJ1bm5hYmxlIHIpIHsKLQkJcmV0dXJuIG5ldyBUaHJlYWQocik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TdGFjay5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5YzM0Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZGVmaW5pbmcgdGhlIGNsYXNzaWMgc3RhY2sgYmVoYXZpb3IsCi0gKiB3aXRob3V0IHRoZSBiYWNrZG9vcnMgYWxsb3dlZCBieSB7QGxpbmsgamF2YS51dGlsLlN0YWNrfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyBjb250YWluZWQgYnkgdGhlIHN0YWNrCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RhY2s8RT4gewotCi0JLyoqCi0JICogIlB1c2giIHRoZSBzcGVjaWZpZWQgaXRlbSBvbiB0byB0aGUgdG9wIG9mIHRoZSBzdGFjay4KLQkgKi8KLQl2b2lkIHB1c2goRSBlbGVtZW50KTsKLQotCS8qKgotCSAqICJQb3AiIGFuIGl0ZW0gZnJvbSB0aGUgdG9wIG9mIHRoZSBzdGFjay4KLQkgKi8KLQlFIHBvcCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVtIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0JICogd2l0aG91dCByZW1vdmluZyBpdCBmcm9tIHRoZSBzdGFjay4KLQkgKi8KLQlFIHBlZWsoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzdGFjayBpcyBlbXB0eS4KLQkgKi8KLQlib29sZWFuIGlzRW1wdHkoKTsKLQotCi0JZmluYWwgY2xhc3MgRW1wdHk8RT4KLQkJaW1wbGVtZW50cyBTdGFjazxFPiwgU2VyaWFsaXphYmxlCi0JewotCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0YWNrIElOU1RBTkNFID0gbmV3IEVtcHR5KCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxUPiBTdGFjazxUPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRW1wdHkoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHB1c2goRSBlbGVtZW50KSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlwdWJsaWMgRSBwb3AoKSB7Ci0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQl9Ci0JCXB1YmxpYyBFIHBlZWsoKSB7Ci0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TdGFja1RyYWNlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TdGFja1RyYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNGUwNmMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3RhY2tUcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci0KLS8qKgotICogQ29udGFpbmVyIGZvciBob2xkaW5nIGFuZCBwcmludGluZyB0aGUge0BTdGFja1RyYWNlRWxlbWVudCBzdGFjayB0cmFjZQotICogZWxlbWVudHN9IHByb2R1Y2VkIGJ5IGEgdGhyZWFkIG9yIGV4Y2VwdGlvbi4KLSAqIAotICogQHNlZSBUaHJlYWQjZ2V0U3RhY2tUcmFjZSgpCi0gKiBAc2VlIFRocm93YWJsZSNnZXRTdGFja1RyYWNlKCkKLSAqLwotcHVibGljIGNsYXNzIFN0YWNrVHJhY2UKLQlpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgZmluYWwgVGhyZWFkIHRocmVhZDsKLQlwcml2YXRlIGZpbmFsIFN0YWNrVHJhY2VFbGVtZW50W10gZWxlbWVudHM7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBTdHJpbmcgc3RyaW5nOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQlwdWJsaWMgU3RhY2tUcmFjZSgpIHsKLQkJdGhpcyhUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RhY2tUcmFjZShUaHJlYWQgdGhyZWFkKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICh0aHJlYWQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy50aHJlYWQgPSB0aHJlYWQ7Ci0JCXRoaXMuZWxlbWVudHMgPSB0aGlzLmJ1aWxkRWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJpcCBvZmYgYWxsIHRoZSBlbGVtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGFzcyBhbmQge0BsaW5rIFRocmVhZH0uCi0JICovCi0JcHJpdmF0ZSBTdGFja1RyYWNlRWxlbWVudFtdIGJ1aWxkRWxlbWVudHMoKSB7Ci0JCVN0YWNrVHJhY2VFbGVtZW50W10gcmVzdWx0ID0gdGhpcy50aHJlYWQuZ2V0U3RhY2tUcmFjZSgpOwotCQlpbnQgbGVuID0gcmVzdWx0Lmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IGxlbikgewotCQkJaWYgKHJlc3VsdFtpXS5nZXRDbGFzc05hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZvdW5kKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWkrKzsKLQkJfQotCQlyZXR1cm4gZm91bmQgPyBBcnJheVRvb2xzLnN1YkFycmF5KHJlc3VsdCwgaSwgbGVuKSA6IHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgVGhyZWFkIGdldFRocmVhZCgpIHsKLQkJcmV0dXJuIHRoaXMudGhyZWFkOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdGFja1RyYWNlRWxlbWVudD4gZ2V0RWxlbWVudHMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxTdGFja1RyYWNlRWxlbWVudD4odGhpcy5lbGVtZW50cyk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzdGFjayB0cmFjZSB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBlbmRUbyhBcHBlbmRhYmxlIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5hcHBlbmRUbyhzdHJlYW0sIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3RhY2sgdHJhY2UgdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0sIHByZWZpeGluZyBlYWNoIGxpbmUKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LgotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZFRvKEFwcGVuZGFibGUgc3RyZWFtLCBTdHJpbmcgcHJlZml4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmb3IgKFN0YWNrVHJhY2VFbGVtZW50IGVsZW1lbnQgOiB0aGlzLmVsZW1lbnRzKSB7Ci0JCQlpZiAocHJlZml4ICE9IG51bGwpIHsKLQkJCQlzdHJlYW0uYXBwZW5kKHByZWZpeCk7Ci0JCQl9Ci0JCQlzdHJlYW0uYXBwZW5kKFN0cmluZy52YWx1ZU9mKGVsZW1lbnQpKS5hcHBlbmQoU3RyaW5nVG9vbHMuQ1IpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nKCkgewotCQlpZiAodGhpcy5zdHJpbmcgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKHRoaXMuc3RyaW5nID09IG51bGwpIHsKLQkJCQkJdGhpcy5zdHJpbmcgPSB0aGlzLmJ1aWxkU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzLnN0cmluZzsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFN0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigxMDAwKTsKLQkJdHJ5IHsKLQkJCXRoaXMuYXBwZW5kVG8oc2IpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOyAgLy8gc2hvdWxkIG5vdCBoYXBwZW4gd2l0aCBhIFN0cmluZ0J1ZmZlcgotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N0cmluZ0NvbGxhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdDb2xsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiMGIwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N0cmluZ0NvbGxhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi0vKioKLSAqIFRoaXMgY29sbGF0b3Igc2ltcGx5IHdyYXBzIGEgSmF2YSB0ZXh0IGNvbGxhdG9yIGFuZCBpbXBsZW1lbnRzIGEKLSAqIHtAbGluayBTdHJpbmd9IHtAbGluayBDb21wYXJhdG9yfSAoaW5zdGVhZCBvZiBhbiB7QGxpbmsgT2JqZWN0fQotICoge0BsaW5rIENvbXBhcmF0b3J9LCB3aGljaCBpcyB3aGF0IHtAbGluayBDb2xsYXRvcn0gZG9lcywgcG9zc2libHkgZm9yCi0gKiBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IHJlYXNvbnMoPykpLgotICogCi0gKiBAc2VlIENvbGxhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmdDb2xsYXRvcgotCWltcGxlbWVudHMgQ29tcGFyYXRvcjxTdHJpbmc+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBDb2xsYXRvciBjb2xsYXRvcjsKLQotCi0JLyoqCi0JICogV3JhcCB0aGUgZGVmYXVsdCBjb2xsYXRvci4KLQkgKiBAc2VlIENvbGxhdG9yI2dldEluc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQ29sbGF0b3IoKSB7Ci0JCXRoaXMoQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgY29sbGF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgbG9jYWxlLgotCSAqIEBzZWUgQ29sbGF0b3IjZ2V0SW5zdGFuY2UoTG9jYWxlKQotCSAqLwotCXB1YmxpYyBTdHJpbmdDb2xsYXRvcihMb2NhbGUgbG9jYWxlKSB7Ci0JCXRoaXMoQ29sbGF0b3IuZ2V0SW5zdGFuY2UobG9jYWxlKSk7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIGNvbGxhdG9yLgotCSAqLwotCXB1YmxpYyBTdHJpbmdDb2xsYXRvcihDb2xsYXRvciBjb2xsYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbGxhdG9yID0gY29sbGF0b3I7Ci0JfQotCi0JcHVibGljIGludCBjb21wYXJlKFN0cmluZyBzdHJpbmcxLCBTdHJpbmcgc3RyaW5nMikgewotCQlyZXR1cm4gdGhpcy5jb2xsYXRvci5jb21wYXJlKHN0cmluZzEsIHN0cmluZzIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY29sbGF0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N0cmluZ0NvbnZlcnRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzN2I0MWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFVzZWQgYnkgdmFyaW91cyAicGx1Z2dhYmxlIiBjbGFzc2VzIHRvIHRyYW5zZm9ybSBvYmplY3RzCi0gKiBpbnRvIHN0cmluZ3MuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RyaW5nQ29udmVydGVyPFQ+IHsKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBvYmplY3QgaW50byBhIHN0cmluZy4KLQkgKiBUaGUgc2VtYW50aWNzIG9mICJjb252ZXJ0IiBpcyBkZXRlcm1pbmVkIGJ5IHRoZQotCSAqIGNvbnRyYWN0IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlci4KLQkgKi8KLQlTdHJpbmcgY29udmVydFRvU3RyaW5nKFQgbyk7Ci0KLQotCWZpbmFsIGNsYXNzIERlZmF1bHQ8Uz4KLQkJaW1wbGVtZW50cyBTdHJpbmdDb252ZXJ0ZXI8Uz4sIFNlcmlhbGl6YWJsZQotCXsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdDb252ZXJ0ZXIgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gU3RyaW5nQ29udmVydGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEZWZhdWx0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBzaW1wbHkgcmV0dXJuIHRoZSBvYmplY3QncyAjdG9TdHJpbmcoKSByZXN1bHQKLQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoUyBvKSB7Ci0JCQlyZXR1cm4gKG8gPT0gbnVsbCkgPyBudWxsIDogby50b1N0cmluZygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCWZpbmFsIGNsYXNzIERpc2FibGVkPFM+Ci0JCWltcGxlbWVudHMgU3RyaW5nQ29udmVydGVyPFM+LCBTZXJpYWxpemFibGUKLQl7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nQ29udmVydGVyIElOU1RBTkNFID0gbmV3IERpc2FibGVkKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBTdHJpbmdDb252ZXJ0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIERpc2FibGVkKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoUyBvKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdNYXRjaGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYWIwNDAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgc2ltcGxlIEFQSSBmb3IgYWxsb3dpbmcgInBsdWdnYWJsZSIKLSAqIHN0cmluZyBtYXRjaGVycyB0aGF0IGNhbiBiZSBjb25maWd1cmVkIHdpdGggYSBwYXR0ZXJuIHN0cmluZwotICogdGhlbiB1c2VkIHRvIGRldGVybWluZSB3aGF0IHN0cmluZ3MgbWF0Y2ggdGhlIHBhdHRlcm4uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RyaW5nTWF0Y2hlciB7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHBhdHRlcm4gc3RyaW5nIHVzZWQgdG8gZGV0ZXJtaW5lIGZ1dHVyZQotCSAqIG1hdGNoZXMuIFRoZSBmb3JtYXQgYW5kIHNlbWFudGljcyBvZiB0aGUgcGF0dGVybgotCSAqIHN0cmluZyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgY29udHJhY3QgYmV0d2VlbiB0aGUKLQkgKiBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0Jdm9pZCBzZXRQYXR0ZXJuU3RyaW5nKFN0cmluZyBwYXR0ZXJuU3RyaW5nKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIG1hdGNoZXMgdGhlCi0JICogZXN0YWJsaXNoZWQgcGF0dGVybiBzdHJpbmcuIFRoZSBzZW1hbnRpY3Mgb2YgYSBtYXRjaAotCSAqIGlzIGRldGVybWluZWQgYnkgdGhlIGNvbnRyYWN0IGJldHdlZW4gdGhlCi0JICogY2xpZW50IGFuZCB0aGUgc2VydmVyLgotCSAqLwotCWJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgc3RyaW5nKTsKLQotCi0JZmluYWwgY2xhc3MgTnVsbAotCQlpbXBsZW1lbnRzIFN0cmluZ01hdGNoZXIsIFNlcmlhbGl6YWJsZQotCXsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdNYXRjaGVyIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJcHVibGljIHN0YXRpYyBTdHJpbmdNYXRjaGVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuU3RyaW5nKFN0cmluZyBwYXR0ZXJuU3RyaW5nKSB7Ci0JCQkvLyBpZ25vcmUgdGhlIHBhdHRlcm4gc3RyaW5nCi0JCX0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgc3RyaW5nKSB7Ci0JCQkvLyBldmVyeXRoaW5nIGlzIGEgbWF0Y2gKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N0cmluZ1Rvb2xzLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTNlNzEzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N0cmluZ1Rvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBtZXRob2RzIHJlbGF0ZWQgdG8gdGhlIGphdmEubGFuZy5TdHJpbmcgY2xhc3MuCi0gKgotICogQXMgb2YgamRrIDEuNSwgaXQncyB0ZW1wdGluZyB0byBjb252ZXJ0IGFsbCBvZiB0aGVzZSBtZXRob2RzIHRvIHVzZQotICogamF2YS5sYW5nLkFwcGVuZGFibGUgKGluc3RlYWQgb2YgU3RyaW5nQnVmZmVyLCBTdHJpbmdCdWlsZGVyLCBhbmQgV3JpdGVyKTsKLSAqIGJ1dCBhbGwgdGhlIEFwcGVuZGFibGUgbWV0aG9kcyB0aHJvdyBqYXZhLmlvLklPRXhjZXB0aW9uICh5ZWNoKSBhbmQgd2UKLSAqIFttaWdodD9dIGdldCBhIGJpdCBiZXR0ZXIgcGVyZm9ybWFuY2UgaW52b2tpbmcgbWV0aG9kcyBvbiBjbGFzc2VzIHRoYW4KLSAqIHdlIGdldCBvbiBpbnRlcmZhY2VzLiA6LSkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0cmluZ1Rvb2xzIHsKLQotCS8qKiBjYXJyaWFnZSByZXR1cm4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgIC8vJE5PTi1OTFMtMSQKLQotCS8qKiBkb3VibGUgcXVvdGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUVVPVEUgPSAnIic7Ci0JCi0JLyoqIFhNTCBkb3VibGUgcXVvdGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfUVVPVEUgPSAiJnF1b3Q7IjsKLQotCS8qKiBwYXJlbnRoZXNpcyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPUEVOX1BBUkVOVEhFU0lTID0gJygnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDTE9TRV9QQVJFTlRIRVNJUyA9ICcpJzsKLQotCS8qKiBicmFja2V0cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPUEVOX0JSQUNLRVQgPSAnWyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENMT1NFX0JSQUNLRVQgPSAnXSc7Ci0KLQkvKiogYnJhY2tldHMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgT1BFTl9CUkFDRSA9ICd7JzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0xPU0VfQlJBQ0UgPSAnfSc7Ci0KLQkvKiogYnJhY2tldHMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgT1BFTl9DSEVWUk9OID0gJzwnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDTE9TRV9DSEVWUk9OID0gJz4nOwotCi0JLyoqIGVtcHR5IHN0cmluZyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKiogZW1wdHkgY2hhciBhcnJheSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEVNUFRZX0NIQVJfQVJSQVkgPSBuZXcgY2hhclswXTsKLQotCS8qKiBlbXB0eSBzdHJpbmcgYXJyYXkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX1NUUklOR19BUlJBWSA9IG5ldyBTdHJpbmdbMF07Ci0KLQotCi0JLy8gKioqKioqKioqKiBwYWRkaW5nL3RydW5jYXRpbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZChpbnQpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZChTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBwYWQoc3RyaW5nLCBsZW5ndGgsICcgJyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZE9uKGludCwgV3JpdGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlwYWRPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5wYWRPbihpbnQsIFN0cmluZ0J1ZmZlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlwYWRPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZE9uKGludCwgU3RyaW5nQnVpbGRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJcGFkT24oc3RyaW5nLCBsZW5ndGgsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkKGludCwgY2hhcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIHBhZF8oc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkT24oaW50LCBjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZE9uKGludCwgY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkKGludCkKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcGFkKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHBhZChzdHJpbmcsIGxlbmd0aCwgJyAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkT24oaW50LCB3cml0ZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXBhZE9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZE9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXBhZE9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlwYWRPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5wYWQoaW50LCBjaGFyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBwYWQoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIHBhZF8oc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZE9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkT24oaW50LCBjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5wYWRPclRydW5jYXRlKGludCkKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkT3JUcnVuY2F0ZShTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBwYWRPclRydW5jYXRlKHN0cmluZywgbGVuZ3RoLCAnICcpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZE9yVHJ1bmNhdGVPbihpbnQsIFdyaXRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZE9yVHJ1bmNhdGVPbihpbnQsIFN0cmluZ0J1ZmZlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5wYWRPclRydW5jYXRlT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkT3JUcnVuY2F0ZShpbnQsIGNoYXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZE9yVHJ1bmNhdGUoU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDAsIGxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIHBhZF8oc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5wYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLnN1YnN0cmluZygwLCBsZW5ndGgpLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLnN1YnN0cmluZygwLCBsZW5ndGgpKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcuc3Vic3RyaW5nKDAsIGxlbmd0aCkpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5wYWRPclRydW5jYXRlKGludCkKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcGFkT3JUcnVuY2F0ZShjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBwYWRPclRydW5jYXRlKHN0cmluZywgbGVuZ3RoLCAnICcpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZE9yVHJ1bmNhdGVPbihpbnQsIFdyaXRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZE9yVHJ1bmNhdGVPbihpbnQsIFN0cmluZ0J1ZmZlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGUoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVpbGRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGUoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlwYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5wYWRPclRydW5jYXRlKGludCwgY2hhcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcGFkT3JUcnVuY2F0ZShjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIDAsIHJlc3VsdCwgMCwgbGVuZ3RoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIHBhZF8oc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5wYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMCwgbGVuZ3RoLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZywgMCwgbGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBwYWRfKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlyZXR1cm4gbmV3IFN0cmluZyhwYWRfKHN0cmluZy50b0NoYXJBcnJheSgpLCBsZW5ndGgsIGMpKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcGFkT25fKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCB3cml0ZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWZpbGxfKHN0cmluZy5sZW5ndGgoKSwgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgd3JpdGVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlmaWxsXyhzdHJpbmcubGVuZ3RoLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCB3cml0ZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oaW50IHN0cmluZ0xlbmd0aCwgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlU3RyaW5nT24oQXJyYXlUb29scy5maWxsKG5ldyBjaGFyW2xlbmd0aCAtIHN0cmluZ0xlbmd0aF0sIGMpLCB3cml0ZXIpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYWRPbl8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZpbGxfKHN0cmluZy5sZW5ndGgoKSwgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZpbGxfKHN0cmluZy5sZW5ndGgsIGxlbmd0aCwgYywgc2IpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlciB0byBjb21wZW5zYXRlIGZvcgotCSAqIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsXyhpbnQgc3RyaW5nTGVuZ3RoLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoQXJyYXlUb29scy5maWxsKG5ldyBjaGFyW2xlbmd0aCAtIHN0cmluZ0xlbmd0aF0sIGMpKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcGFkT25fKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQl9Ci0KLQkvKgotCSAqIEFkZCBlbm91Z2ggY2hhcmFjdGVycyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlmaWxsXyhzdHJpbmcubGVuZ3RoKCksIGxlbmd0aCwgYywgc2IpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWZpbGxfKHN0cmluZy5sZW5ndGgsIGxlbmd0aCwgYywgc2IpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oaW50IHN0cmluZ0xlbmd0aCwgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChBcnJheVRvb2xzLmZpbGwobmV3IGNoYXJbbGVuZ3RoIC0gc3RyaW5nTGVuZ3RoXSwgYykpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHBhZF8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGhdOwotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIDAsIHJlc3VsdCwgMCwgc3RyaW5nTGVuZ3RoKTsKLQkJQXJyYXlzLmZpbGwocmVzdWx0LCBzdHJpbmdMZW5ndGgsIGxlbmd0aCwgYyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBhZE9uXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYWRPbl8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBhZE9uXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy56ZXJvUGFkKGludCkKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgemVyb1BhZChTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBmcm9udFBhZChzdHJpbmcsIGxlbmd0aCwgJzAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnplcm9QYWRPbihpbnQsIFdyaXRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWZyb250UGFkT24oc3RyaW5nLCBsZW5ndGgsICcwJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnplcm9QYWRPbihpbnQsIFN0cmluZ0J1ZmZlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZnJvbnRQYWRPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy56ZXJvUGFkT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZnJvbnRQYWRPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLmZyb250UGFkKGludCwgY2hhcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZnJvbnRQYWQoU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlyZXR1cm4gZnJvbnRQYWRfKHN0cmluZywgbGVuZ3RoLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuZnJvbnRQYWRPbihpbnQsIGNoYXIsIFdyaXRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5mcm9udFBhZE9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5mcm9udFBhZE9uKGludCwgY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy56ZXJvUGFkKGludCkKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gemVyb1BhZChjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBmcm9udFBhZChzdHJpbmcsIGxlbmd0aCwgJzAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnplcm9QYWRPbihpbnQsIFdyaXRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWZyb250UGFkT24oc3RyaW5nLCBsZW5ndGgsICcwJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnplcm9QYWRPbihpbnQsIFN0cmluZ0J1ZmZlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZnJvbnRQYWRPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy56ZXJvUGFkT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZnJvbnRQYWRPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLmZyb250UGFkKGludCwgY2hhcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gZnJvbnRQYWQoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIGZyb250UGFkXyhzdHJpbmcsIGxlbmd0aCwgYyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLmZyb250UGFkT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLmZyb250UGFkT24oaW50LCBjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5mcm9udFBhZE9uKGludCwgY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnplcm9QYWRPclRydW5jYXRlKGludCkKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgemVyb1BhZE9yVHJ1bmNhdGUoU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gZnJvbnRQYWRPclRydW5jYXRlKHN0cmluZywgbGVuZ3RoLCAnMCcpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnplcm9QYWRPclRydW5jYXRlT24oaW50LCBXcml0ZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJZnJvbnRQYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcwJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy56ZXJvUGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZnJvbnRQYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcwJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnplcm9QYWRPclRydW5jYXRlT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWZyb250UGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLmZyb250UGFkT3JUcnVuY2F0ZShpbnQsIGNoYXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZyb250UGFkT3JUcnVuY2F0ZShTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoc3RyaW5nTGVuZ3RoIC0gbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gZnJvbnRQYWRfKHN0cmluZywgbGVuZ3RoLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLmZyb250UGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgV3JpdGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLnN1YnN0cmluZyhzdHJpbmdMZW5ndGggLSBsZW5ndGgpLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLmZyb250UGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZy5zdWJzdHJpbmcoc3RyaW5nTGVuZ3RoIC0gbGVuZ3RoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5mcm9udFBhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZy5zdWJzdHJpbmcoc3RyaW5nTGVuZ3RoIC0gbGVuZ3RoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuemVyb1BhZE9yVHJ1bmNhdGUoaW50KQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSB6ZXJvUGFkT3JUcnVuY2F0ZShjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBmcm9udFBhZE9yVHJ1bmNhdGUoc3RyaW5nLCBsZW5ndGgsICcwJyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuemVyb1BhZE9yVHJ1bmNhdGVPbihpbnQsIFdyaXRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnplcm9QYWRPclRydW5jYXRlT24oaW50LCBTdHJpbmdCdWZmZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuemVyb1BhZE9yVHJ1bmNhdGVPbihpbnQsIFN0cmluZ0J1aWxkZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZnJvbnRQYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcwJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuZnJvbnRQYWRPclRydW5jYXRlKGludCwgY2hhcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gZnJvbnRQYWRPclRydW5jYXRlKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgc3RyaW5nTGVuZ3RoIC0gbGVuZ3RoLCByZXN1bHQsIDAsIGxlbmd0aCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBmcm9udFBhZF8oc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuZnJvbnRQYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCBzdHJpbmdMZW5ndGggLSBsZW5ndGgsIGxlbmd0aCwgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5mcm9udFBhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLCBzdHJpbmdMZW5ndGggLSBsZW5ndGgsIGxlbmd0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5mcm9udFBhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcsIHN0cmluZ0xlbmd0aCAtIGxlbmd0aCwgbGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEZyb250LXBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmcm9udFBhZF8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKGZyb250UGFkXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuZ3RoLCBjKSk7Ci0JfQotCi0JLyoKLQkgKiBaZXJvLXBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBmcm9udFBhZF8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGhdOwotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaW50IHBhZExlbmd0aCA9IGxlbmd0aCAtIHN0cmluZ0xlbmd0aDsKLQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIDAsIHJlc3VsdCwgcGFkTGVuZ3RoLCBzdHJpbmdMZW5ndGgpOwotCQlBcnJheXMuZmlsbChyZXN1bHQsIDAsIHBhZExlbmd0aCwgYyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZyb250UGFkT25fKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlmaWxsXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZyb250UGFkT25fKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlmaWxsXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZyb250UGFkT25fKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCXNiLmFwcGVuZChzdHJpbmcpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmcm9udFBhZE9uXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmaWxsXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZnJvbnRQYWRPbl8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCXNiLmFwcGVuZChzdHJpbmcpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmcm9udFBhZE9uXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlcGFyYXRpbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogU2VwYXJhdGUgdGhlIHNlZ21lbnRzIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIHNlcGFyYXRvcjo8cHJlPgotCSAqICAgICBzZXBhcmF0ZSgiMDEyMzQ1IiwgJy0nLCAyKSA9PiAiMDEtMjMtNDUiCi0JICogPC9wcmU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VwYXJhdGUoU3RyaW5nIHN0cmluZywgY2hhciBzZXBhcmF0b3IsIGludCBzZWdtZW50U2l6ZSkgewotCQlpZiAoc2VnbWVudFNpemUgPD0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VnbWVudCBzaXplIG11c3QgYmUgcG9zaXRpdmU6ICIgKyBzZWdtZW50U2l6ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpOwotCQlyZXR1cm4gKGxlbiA8PSBzZWdtZW50U2l6ZSkgPyBzdHJpbmcgOiBuZXcgU3RyaW5nKHNlcGFyYXRlKHN0cmluZy50b0NoYXJBcnJheSgpLCBzZXBhcmF0b3IsIHNlZ21lbnRTaXplLCBsZW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXBhcmF0ZSB0aGUgc2VnbWVudHMgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogc2VwYXJhdG9yOjxwcmU+Ci0JICogICAgIHNlcGFyYXRlKCIwMTIzNDUiLCAnLScsIDIpID0+ICIwMS0yMy00NSIKLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VwYXJhdGVPbihTdHJpbmcgc3RyaW5nLCBjaGFyIHNlcGFyYXRvciwgaW50IHNlZ21lbnRTaXplLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChzZWdtZW50U2l6ZSA8PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWdtZW50IHNpemUgbXVzdCBiZSBwb3NpdGl2ZTogIiArIHNlZ21lbnRTaXplKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPD0gc2VnbWVudFNpemUpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJc2VwYXJhdGVPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNlcGFyYXRvciwgc2VnbWVudFNpemUsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXBhcmF0ZSB0aGUgc2VnbWVudHMgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogc2VwYXJhdG9yOjxwcmU+Ci0JICogICAgIHNlcGFyYXRlKCIwMTIzNDUiLCAnLScsIDIpID0+ICIwMS0yMy00NSIKLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VwYXJhdGVPbihTdHJpbmcgc3RyaW5nLCBjaGFyIHNlcGFyYXRvciwgaW50IHNlZ21lbnRTaXplLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaWYgKHNlZ21lbnRTaXplIDw9IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlZ21lbnQgc2l6ZSBtdXN0IGJlIHBvc2l0aXZlOiAiICsgc2VnbWVudFNpemUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA8PSBzZWdtZW50U2l6ZSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXBhcmF0ZU9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2VwYXJhdG9yLCBzZWdtZW50U2l6ZSwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VwYXJhdGUgdGhlIHNlZ21lbnRzIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIHNlcGFyYXRvcjo8cHJlPgotCSAqICAgICBzZXBhcmF0ZSgiMDEyMzQ1IiwgJy0nLCAyKSA9PiAiMDEtMjMtNDUiCi0JICogPC9wcmU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlcGFyYXRlT24oU3RyaW5nIHN0cmluZywgY2hhciBzZXBhcmF0b3IsIGludCBzZWdtZW50U2l6ZSwgU3RyaW5nQnVpbGRlciBzYikgewotCQlpZiAoc2VnbWVudFNpemUgPD0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VnbWVudCBzaXplIG11c3QgYmUgcG9zaXRpdmU6ICIgKyBzZWdtZW50U2l6ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoc3RyaW5nLmxlbmd0aCgpIDw9IHNlZ21lbnRTaXplKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXNlcGFyYXRlT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBzZXBhcmF0b3IsIHNlZ21lbnRTaXplLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXBhcmF0ZSB0aGUgc2VnbWVudHMgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogc2VwYXJhdG9yOjxwcmU+Ci0JICogICAgIHNlcGFyYXRlKCIwMTIzNDUiLCAnLScsIDIpID0+ICIwMS0yMy00NSIKLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBzZXBhcmF0ZShjaGFyW10gc3RyaW5nLCBjaGFyIHNlcGFyYXRvciwgaW50IHNlZ21lbnRTaXplKSB7Ci0JCWlmIChzZWdtZW50U2l6ZSA8PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWdtZW50IHNpemUgbXVzdCBiZSBwb3NpdGl2ZTogIiArIHNlZ21lbnRTaXplKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlyZXR1cm4gKGxlbiA8PSBzZWdtZW50U2l6ZSkgPyBzdHJpbmcgOiBzZXBhcmF0ZShzdHJpbmcsIHNlcGFyYXRvciwgc2VnbWVudFNpemUsIGxlbik7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbnM6IHN0cmluZyBpcyBsb25nZXIgdGhhbiBzZWdtZW50IHNpemU7IHNlZ21lbnQgc2l6ZSBpcyBwb3NpdGl2ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBzZXBhcmF0ZShjaGFyW10gc3RyaW5nLCBjaGFyIHNlcGFyYXRvciwgaW50IHNlZ21lbnRTaXplLCBpbnQgbGVuKSB7Ci0JCWludCByZXN1bHRMZW4gPSBsZW4gKyAobGVuIC8gc2VnbWVudFNpemUpOwotCQlpZiAoKGxlbiAlIHNlZ21lbnRTaXplKSA9PSAwKSB7Ci0JCQlyZXN1bHRMZW4tLTsgIC8vIG5vIHNlcGFyYXRvciBhZnRlciB0aGUgZmluYWwgc2VnbWVudCBpZiBub3RoaW5nIGZvbGxvd2luZyBpdAotCQl9Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltyZXN1bHRMZW5dOwotCQlpbnQgaiA9IDA7Ci0JCWludCBzZWdDb3VudCA9IDA7Ci0JCWZvciAoY2hhciBjIDogc3RyaW5nKSB7Ci0JCQlpZiAoc2VnQ291bnQgPT0gc2VnbWVudFNpemUpIHsKLQkJCQlyZXN1bHRbaisrXSA9IHNlcGFyYXRvcjsKLQkJCQlzZWdDb3VudCA9IDA7Ci0JCQl9Ci0JCQlzZWdDb3VudCsrOwotCQkJcmVzdWx0W2orK10gPSBjOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogU2VwYXJhdGUgdGhlIHNlZ21lbnRzIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIHNlcGFyYXRvcjo8cHJlPgotCSAqICAgICBzZXBhcmF0ZSgiMDEyMzQ1IiwgJy0nLCAyKSA9PiAiMDEtMjMtNDUiCi0JICogPC9wcmU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlcGFyYXRlT24oY2hhcltdIHN0cmluZywgY2hhciBzZXBhcmF0b3IsIGludCBzZWdtZW50U2l6ZSwgV3JpdGVyIHdyaXRlcikgewotCQlpZiAoc2VnbWVudFNpemUgPD0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VnbWVudCBzaXplIG11c3QgYmUgcG9zaXRpdmU6ICIgKyBzZWdtZW50U2l6ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoc3RyaW5nLmxlbmd0aCA8PSBzZWdtZW50U2l6ZSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlzZXBhcmF0ZU9uXyhzdHJpbmcsIHNlcGFyYXRvciwgc2VnbWVudFNpemUsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uczogc3RyaW5nIGlzIGxvbmdlciB0aGFuIHNlZ21lbnQgc2l6ZTsgc2VnbWVudCBzaXplIGlzIHBvc2l0aXZlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXBhcmF0ZU9uXyhjaGFyW10gc3RyaW5nLCBjaGFyIHNlcGFyYXRvciwgaW50IHNlZ21lbnRTaXplLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBzZWdDb3VudCA9IDA7Ci0JCWZvciAoY2hhciBjIDogc3RyaW5nKSB7Ci0JCQlpZiAoc2VnQ291bnQgPT0gc2VnbWVudFNpemUpIHsKLQkJCQl3cml0ZUNoYXJPbihzZXBhcmF0b3IsIHdyaXRlcik7Ci0JCQkJc2VnQ291bnQgPSAwOwotCQkJfQotCQkJc2VnQ291bnQrKzsKLQkJCXdyaXRlQ2hhck9uKGMsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXBhcmF0ZSB0aGUgc2VnbWVudHMgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogc2VwYXJhdG9yOjxwcmU+Ci0JICogICAgIHNlcGFyYXRlKCIwMTIzNDUiLCAnLScsIDIpID0+ICIwMS0yMy00NSIKLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VwYXJhdGVPbihjaGFyW10gc3RyaW5nLCBjaGFyIHNlcGFyYXRvciwgaW50IHNlZ21lbnRTaXplLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaWYgKHNlZ21lbnRTaXplIDw9IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlZ21lbnQgc2l6ZSBtdXN0IGJlIHBvc2l0aXZlOiAiICsgc2VnbWVudFNpemUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHN0cmluZy5sZW5ndGggPD0gc2VnbWVudFNpemUpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJc2VwYXJhdGVPbl8oc3RyaW5nLCBzZXBhcmF0b3IsIHNlZ21lbnRTaXplLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uczogc3RyaW5nIGlzIGxvbmdlciB0aGFuIHNlZ21lbnQgc2l6ZTsgc2VnbWVudCBzaXplIGlzIHBvc2l0aXZlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXBhcmF0ZU9uXyhjaGFyW10gc3RyaW5nLCBjaGFyIHNlcGFyYXRvciwgaW50IHNlZ21lbnRTaXplLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IHNlZ0NvdW50ID0gMDsKLQkJZm9yIChjaGFyIGMgOiBzdHJpbmcpIHsKLQkJCWlmIChzZWdDb3VudCA9PSBzZWdtZW50U2l6ZSkgewotCQkJCXNiLmFwcGVuZChzZXBhcmF0b3IpOwotCQkJCXNlZ0NvdW50ID0gMDsKLQkJCX0KLQkJCXNlZ0NvdW50Kys7Ci0JCQlzYi5hcHBlbmQoYyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXBhcmF0ZSB0aGUgc2VnbWVudHMgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogc2VwYXJhdG9yOjxwcmU+Ci0JICogICAgIHNlcGFyYXRlKCIwMTIzNDUiLCAnLScsIDIpID0+ICIwMS0yMy00NSIKLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VwYXJhdGVPbihjaGFyW10gc3RyaW5nLCBjaGFyIHNlcGFyYXRvciwgaW50IHNlZ21lbnRTaXplLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWlmIChzZWdtZW50U2l6ZSA8PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWdtZW50IHNpemUgbXVzdCBiZSBwb3NpdGl2ZTogIiArIHNlZ21lbnRTaXplKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChzdHJpbmcubGVuZ3RoIDw9IHNlZ21lbnRTaXplKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXNlcGFyYXRlT25fKHN0cmluZywgc2VwYXJhdG9yLCBzZWdtZW50U2l6ZSwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbnM6IHN0cmluZyBpcyBsb25nZXIgdGhhbiBzZWdtZW50IHNpemU7IHNlZ21lbnQgc2l6ZSBpcyBwb3NpdGl2ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgc2VwYXJhdGVPbl8oY2hhcltdIHN0cmluZywgY2hhciBzZXBhcmF0b3IsIGludCBzZWdtZW50U2l6ZSwgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgc2VnQ291bnQgPSAwOwotCQlmb3IgKGNoYXIgYyA6IHN0cmluZykgewotCQkJaWYgKHNlZ0NvdW50ID09IHNlZ21lbnRTaXplKSB7Ci0JCQkJc2IuYXBwZW5kKHNlcGFyYXRvcik7Ci0JCQkJc2VnQ291bnQgPSAwOwotCQkJfQotCQkJc2VnQ291bnQrKzsKLQkJCXNiLmFwcGVuZChjKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWxpbWl0aW5nL3F1b3RpbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIGRvdWJsZSBxdW90ZSBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlcgotCSAqIGRvdWJsZSBxdW90ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBxdW90ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBkZWxpbWl0KHN0cmluZywgUVVPVEUpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBkb3VibGUgcXVvdGUgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIKLQkgKiBkb3VibGUgcXVvdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHF1b3RlT24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlkZWxpbWl0T24oc3RyaW5nLCBRVU9URSwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgZG91YmxlIHF1b3RlIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyCi0JICogZG91YmxlIHF1b3RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBxdW90ZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlkZWxpbWl0T24oc3RyaW5nLCBRVU9URSwgc2IpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBkb3VibGUgcXVvdGUgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIKLQkgKiBkb3VibGUgcXVvdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHF1b3RlT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlkZWxpbWl0T24oc3RyaW5nLCBRVU9URSwgc2IpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3Mgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBkb3VibGUgcXVvdGUgaW4gYSBzdHJpbmcgd2l0aCBhbm90aGVyCi0JICogZG91YmxlIHF1b3RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8U3RyaW5nPiBxdW90ZShJdGVyYXRvcjxTdHJpbmc+IHN0cmluZ3MpIHsKLQkJcmV0dXJuIGRlbGltaXQoc3RyaW5ncywgUVVPVEUpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpbWl0KFN0cmluZyBzdHJpbmcsIGNoYXIgZGVsaW1pdGVyKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKGRlbGltaXQoc3RyaW5nLnRvQ2hhckFycmF5KCksIGRlbGltaXRlcikpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKFN0cmluZyBzdHJpbmcsIGNoYXIgZGVsaW1pdGVyLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWRlbGltaXRPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgZGVsaW1pdGVyLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKFN0cmluZyBzdHJpbmcsIGNoYXIgZGVsaW1pdGVyLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZGVsaW1pdE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBkZWxpbWl0ZXIsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgdGhlIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGltaXRPbihTdHJpbmcgc3RyaW5nLCBjaGFyIGRlbGltaXRlciwgU3RyaW5nQnVpbGRlciBzYikgewotCQlkZWxpbWl0T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIGRlbGltaXRlciwgc2IpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYQotCSAqIGNvcHkgb2YgdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgZGVsaW1pdGVyIGluIGEgc3RyaW5nIHdpdGggYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYWJsZTxTdHJpbmc+IGRlbGltaXQoSXRlcmFibGU8U3RyaW5nPiBzdHJpbmdzLCBjaGFyIGRlbGltaXRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8U3RyaW5nLCBTdHJpbmc+KHN0cmluZ3MsIG5ldyBDaGFyU3RyaW5nRGVsaW1pdGVyKGRlbGltaXRlcikpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYQotCSAqIGNvcHkgb2YgdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgZGVsaW1pdGVyIGluIGEgc3RyaW5nIHdpdGggYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IGRlbGltaXQoSXRlcmF0b3I8U3RyaW5nPiBzdHJpbmdzLCBjaGFyIGRlbGltaXRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHN0cmluZ3MsIG5ldyBDaGFyU3RyaW5nRGVsaW1pdGVyKGRlbGltaXRlcikpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENoYXJTdHJpbmdEZWxpbWl0ZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4gewotCQlwcml2YXRlIGNoYXIgZGVsaW1pdGVyOwotCQlDaGFyU3RyaW5nRGVsaW1pdGVyKGNoYXIgZGVsaW1pdGVyKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kZWxpbWl0ZXIgPSBkZWxpbWl0ZXI7Ci0JCX0KLQkJcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIHN0cmluZykgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmRlbGltaXQoc3RyaW5nLCB0aGlzLmRlbGltaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGgKLQkgKiBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpbWl0KFN0cmluZyBzdHJpbmcsIFN0cmluZyBkZWxpbWl0ZXIpIHsKLQkJaWYgKGRlbGltaXRlci5sZW5ndGgoKSA9PSAxKSB7Ci0JCQlyZXR1cm4gZGVsaW1pdChzdHJpbmcsIGRlbGltaXRlci5jaGFyQXQoMCkpOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKGRlbGltaXQoc3RyaW5nLnRvQ2hhckFycmF5KCksIGRlbGltaXRlci50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgc2luZ2xlLWNoYXJhY3RlciBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoCi0JICogYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGltaXRPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZGVsaW1pdGVyLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChkZWxpbWl0ZXIubGVuZ3RoKCkgPT0gMSkgewotCQkJZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyLmNoYXJBdCgwKSwgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWRlbGltaXRPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgZGVsaW1pdGVyLnRvQ2hhckFycmF5KCksIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGgKLQkgKiBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBkZWxpbWl0ZXIsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpZiAoZGVsaW1pdGVyLmxlbmd0aCgpID09IDEpIHsKLQkJCWRlbGltaXRPbihzdHJpbmcsIGRlbGltaXRlci5jaGFyQXQoMCksIHNiKTsKLQkJfSBlbHNlIHsKLQkJCWRlbGltaXRPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgZGVsaW1pdGVyLnRvQ2hhckFycmF5KCksIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIHNpbmdsZS1jaGFyYWN0ZXIgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aAotCSAqIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxpbWl0T24oU3RyaW5nIHN0cmluZywgU3RyaW5nIGRlbGltaXRlciwgU3RyaW5nQnVpbGRlciBzYikgewotCQlpZiAoZGVsaW1pdGVyLmxlbmd0aCgpID09IDEpIHsKLQkJCWRlbGltaXRPbihzdHJpbmcsIGRlbGltaXRlci5jaGFyQXQoMCksIHNiKTsKLQkJfSBlbHNlIHsKLQkJCWRlbGltaXRPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgZGVsaW1pdGVyLnRvQ2hhckFycmF5KCksIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGltaXQgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYQotCSAqIGNvcHkgb2YgdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIHNpbmdsZS1jaGFyYWN0ZXIgZGVsaW1pdGVyIGluIGEgc3RyaW5nIHdpdGgKLQkgKiBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPFN0cmluZz4gZGVsaW1pdChJdGVyYWJsZTxTdHJpbmc+IHN0cmluZ3MsIFN0cmluZyBkZWxpbWl0ZXIpIHsKLQkJcmV0dXJuIChkZWxpbWl0ZXIubGVuZ3RoKCkgPT0gMSkgPwotCQkJCWRlbGltaXQoc3RyaW5ncywgZGVsaW1pdGVyLmNoYXJBdCgwKSkgOgotCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFN0cmluZywgU3RyaW5nPihzdHJpbmdzLCBuZXcgU3RyaW5nU3RyaW5nRGVsaW1pdGVyKGRlbGltaXRlcikpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYQotCSAqIGNvcHkgb2YgdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIHNpbmdsZS1jaGFyYWN0ZXIgZGVsaW1pdGVyIGluIGEgc3RyaW5nIHdpdGgKLQkgKiBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gZGVsaW1pdChJdGVyYXRvcjxTdHJpbmc+IHN0cmluZ3MsIFN0cmluZyBkZWxpbWl0ZXIpIHsKLQkJcmV0dXJuIChkZWxpbWl0ZXIubGVuZ3RoKCkgPT0gMSkgPwotCQkJCWRlbGltaXQoc3RyaW5ncywgZGVsaW1pdGVyLmNoYXJBdCgwKSkgOgotCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgU3RyaW5nPihzdHJpbmdzLCBuZXcgU3RyaW5nU3RyaW5nRGVsaW1pdGVyKGRlbGltaXRlcikpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFN0cmluZ1N0cmluZ0RlbGltaXRlciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPFN0cmluZywgU3RyaW5nPiB7Ci0JCXByaXZhdGUgU3RyaW5nIGRlbGltaXRlcjsKLQkJU3RyaW5nU3RyaW5nRGVsaW1pdGVyKFN0cmluZyBkZWxpbWl0ZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRlbGltaXRlciA9IGRlbGltaXRlcjsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShTdHJpbmcgc3RyaW5nKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuZGVsaW1pdChzdHJpbmcsIHRoaXMuZGVsaW1pdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBkb3VibGUgcXVvdGUgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIKLQkgKiBkb3VibGUgcXVvdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcXVvdGUoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gZGVsaW1pdChzdHJpbmcsIFFVT1RFKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgZG91YmxlIHF1b3RlIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyCi0JICogZG91YmxlIHF1b3RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBxdW90ZU9uKGNoYXJbXSBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJZGVsaW1pdE9uKHN0cmluZywgUVVPVEUsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIGRvdWJsZSBxdW90ZSBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlcgotCSAqIGRvdWJsZSBxdW90ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcXVvdGVPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZGVsaW1pdE9uKHN0cmluZywgUVVPVEUsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgZG91YmxlIHF1b3RlIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyCi0JICogZG91YmxlIHF1b3RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBxdW90ZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZGVsaW1pdE9uKHN0cmluZywgUVVPVEUsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgZG91YmxlIHF1b3RlIGluIGEgc3RyaW5nIHdpdGggYW5vdGhlcgotCSAqIGRvdWJsZSBxdW90ZS4KLQkgKi8KLQkvLyBjYW5ub3QgbmFtZSBtZXRob2Qgc2ltcGx5ICdxdW90ZScgYmVjYXVzZSBvZiB0eXBlLWVyYXN1cmUuLi4KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPGNoYXJbXT4gcXVvdGVDaGFyQXJyYXlzKEl0ZXJhdG9yPGNoYXJbXT4gc3RyaW5ncykgewotCQlyZXR1cm4gZGVsaW1pdENoYXJBcnJheXMoc3RyaW5ncywgUVVPVEUpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBkZWxpbWl0KGNoYXJbXSBzdHJpbmcsIGNoYXIgZGVsaW1pdGVyKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHJpbmcubGVuZ3RoICsgMik7Ci0JCWRlbGltaXRPbihzdHJpbmcsIGRlbGltaXRlciwgc2IpOwotCQlyZXR1cm4gY29udmVydFRvQ2hhckFycmF5KHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgdGhlIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGltaXRPbihjaGFyW10gc3RyaW5nLCBjaGFyIGRlbGltaXRlciwgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZUNoYXJPbihkZWxpbWl0ZXIsIHdyaXRlcik7Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCBkZWxpbWl0ZXIsIHdyaXRlcik7Ci0JCXdyaXRlQ2hhck9uKGRlbGltaXRlciwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgdGhlIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGltaXRPbihjaGFyW10gc3RyaW5nLCBjaGFyIGRlbGltaXRlciwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZChkZWxpbWl0ZXIpOwotCQlmb3IgKGNoYXIgYyA6IHN0cmluZykgewotCQkJaWYgKGMgPT0gZGVsaW1pdGVyKSB7Ci0JCQkJc2IuYXBwZW5kKGMpOwotCQkJfQotCQkJc2IuYXBwZW5kKGMpOwotCQl9Ci0JCXNiLmFwcGVuZChkZWxpbWl0ZXIpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIGNoYXIgZGVsaW1pdGVyLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChkZWxpbWl0ZXIpOwotCQlmb3IgKGNoYXIgYyA6IHN0cmluZykgewotCQkJaWYgKGMgPT0gZGVsaW1pdGVyKSB7Ci0JCQkJc2IuYXBwZW5kKGMpOwotCQkJfQotCQkJc2IuYXBwZW5kKGMpOwotCQl9Ci0JCXNiLmFwcGVuZChkZWxpbWl0ZXIpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYQotCSAqIGNvcHkgb2YgdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgZGVsaW1pdGVyIGluIGEgc3RyaW5nIHdpdGggYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JLy8gY2Fubm90IG5hbWUgbWV0aG9kIHNpbXBseSAnZGVsaW1pdCcgYmVjYXVzZSBvZiB0eXBlLWVyYXN1cmUuLi4KLQlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPGNoYXJbXT4gZGVsaW1pdENoYXJBcnJheXMoSXRlcmFibGU8Y2hhcltdPiBzdHJpbmdzLCBjaGFyIGRlbGltaXRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8Y2hhcltdLCBjaGFyW10+KHN0cmluZ3MsIG5ldyBDaGFyQ2hhckFycmF5RGVsaW1pdGVyKGRlbGltaXRlcikpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYQotCSAqIGNvcHkgb2YgdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgZGVsaW1pdGVyIGluIGEgc3RyaW5nIHdpdGggYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JLy8gY2Fubm90IG5hbWUgbWV0aG9kIHNpbXBseSAnZGVsaW1pdCcgYmVjYXVzZSBvZiB0eXBlLWVyYXN1cmUuLi4KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPGNoYXJbXT4gZGVsaW1pdENoYXJBcnJheXMoSXRlcmF0b3I8Y2hhcltdPiBzdHJpbmdzLCBjaGFyIGRlbGltaXRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8Y2hhcltdLCBjaGFyW10+KHN0cmluZ3MsIG5ldyBDaGFyQ2hhckFycmF5RGVsaW1pdGVyKGRlbGltaXRlcikpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENoYXJDaGFyQXJyYXlEZWxpbWl0ZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxjaGFyW10sIGNoYXJbXT4gewotCQlwcml2YXRlIGNoYXIgZGVsaW1pdGVyOwotCQlDaGFyQ2hhckFycmF5RGVsaW1pdGVyKGNoYXIgZGVsaW1pdGVyKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kZWxpbWl0ZXIgPSBkZWxpbWl0ZXI7Ci0JCX0KLQkJcHVibGljIGNoYXJbXSB0cmFuc2Zvcm0oY2hhcltdIHN0cmluZykgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmRlbGltaXQoc3RyaW5nLCB0aGlzLmRlbGltaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGgKLQkgKiBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBkZWxpbWl0KGNoYXJbXSBzdHJpbmcsIGNoYXJbXSBkZWxpbWl0ZXIpIHsKLQkJaW50IGRlbGltaXRlckxlbmd0aCA9IGRlbGltaXRlci5sZW5ndGg7Ci0JCWlmIChkZWxpbWl0ZXJMZW5ndGggPT0gMSkgewotCQkJcmV0dXJuIGRlbGltaXQoc3RyaW5nLCBkZWxpbWl0ZXJbMF0pOwotCQl9Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbc3RyaW5nTGVuZ3RoKygyKmRlbGltaXRlckxlbmd0aCldOwotCQlTeXN0ZW0uYXJyYXljb3B5KGRlbGltaXRlciwgMCwgcmVzdWx0LCAwLCBkZWxpbWl0ZXJMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMCwgcmVzdWx0LCBkZWxpbWl0ZXJMZW5ndGgsIHN0cmluZ0xlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoZGVsaW1pdGVyLCAwLCByZXN1bHQsIHN0cmluZ0xlbmd0aCtkZWxpbWl0ZXJMZW5ndGgsIGRlbGltaXRlckxlbmd0aCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgc2luZ2xlLWNoYXJhY3RlciBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoCi0JICogYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGltaXRPbihjaGFyW10gc3RyaW5nLCBjaGFyW10gZGVsaW1pdGVyLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChkZWxpbWl0ZXIubGVuZ3RoID09IDEpIHsKLQkJCWRlbGltaXRPbihzdHJpbmcsIGRlbGltaXRlclswXSwgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXdyaXRlU3RyaW5nT24oZGVsaW1pdGVyLCB3cml0ZXIpOwotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCQl3cml0ZVN0cmluZ09uKGRlbGltaXRlciwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIHNpbmdsZS1jaGFyYWN0ZXIgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aAotCSAqIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxpbWl0T24oY2hhcltdIHN0cmluZywgY2hhcltdIGRlbGltaXRlciwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWlmIChkZWxpbWl0ZXIubGVuZ3RoID09IDEpIHsKLQkJCWRlbGltaXRPbihzdHJpbmcsIGRlbGltaXRlclswXSwgc2IpOwotCQl9IGVsc2UgewotCQkJc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJCXNiLmFwcGVuZChkZWxpbWl0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgc2luZ2xlLWNoYXJhY3RlciBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoCi0JICogYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGltaXRPbihjaGFyW10gc3RyaW5nLCBjaGFyW10gZGVsaW1pdGVyLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWlmIChkZWxpbWl0ZXIubGVuZ3RoID09IDEpIHsKLQkJCWRlbGltaXRPbihzdHJpbmcsIGRlbGltaXRlclswXSwgc2IpOwotCQl9IGVsc2UgewotCQkJc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJCXNiLmFwcGVuZChkZWxpbWl0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhCi0JICogY29weSBvZiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgc2luZ2xlLWNoYXJhY3RlciBkZWxpbWl0ZXIgaW4gYSBzdHJpbmcgd2l0aAotCSAqIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCS8vIGNhbm5vdCBuYW1lIG1ldGhvZCBzaW1wbHkgJ2RlbGltaXQnIGJlY2F1c2Ugb2YgdHlwZS1lcmFzdXJlLi4uCi0JcHVibGljIHN0YXRpYyBJdGVyYWJsZTxjaGFyW10+IGRlbGltaXRDaGFyQXJyYXlzKEl0ZXJhYmxlPGNoYXJbXT4gc3RyaW5ncywgY2hhcltdIGRlbGltaXRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8Y2hhcltdLCBjaGFyW10+KHN0cmluZ3MsIG5ldyBDaGFyQXJyYXlDaGFyQXJyYXlEZWxpbWl0ZXIoZGVsaW1pdGVyKSk7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhCi0JICogY29weSBvZiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgc2luZ2xlLWNoYXJhY3RlciBkZWxpbWl0ZXIgaW4gYSBzdHJpbmcgd2l0aAotCSAqIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCS8vIGNhbm5vdCBuYW1lIG1ldGhvZCBzaW1wbHkgJ2RlbGltaXQnIGJlY2F1c2Ugb2YgdHlwZS1lcmFzdXJlLi4uCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxjaGFyW10+IGRlbGltaXRDaGFyQXJyYXlzKEl0ZXJhdG9yPGNoYXJbXT4gc3RyaW5ncywgY2hhcltdIGRlbGltaXRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8Y2hhcltdLCBjaGFyW10+KHN0cmluZ3MsIG5ldyBDaGFyQXJyYXlDaGFyQXJyYXlEZWxpbWl0ZXIoZGVsaW1pdGVyKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2hhckFycmF5Q2hhckFycmF5RGVsaW1pdGVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXI8Y2hhcltdLCBjaGFyW10+IHsKLQkJcHJpdmF0ZSBjaGFyW10gZGVsaW1pdGVyOwotCQlDaGFyQXJyYXlDaGFyQXJyYXlEZWxpbWl0ZXIoY2hhcltdIGRlbGltaXRlcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZGVsaW1pdGVyID0gZGVsaW1pdGVyOwotCQl9Ci0JCXB1YmxpYyBjaGFyW10gdHJhbnNmb3JtKGNoYXJbXSBzdHJpbmcpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5kZWxpbWl0KHN0cmluZywgdGhpcy5kZWxpbWl0ZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlbGltaXRpbmcgcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBxdW90ZWQ6ICJcImZvb1wiIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNRdW90ZWQoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBRVU9URSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgcGFyZW50aGV0aWNhbDogIihmb28pIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNQYXJlbnRoZXRpY2FsKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgT1BFTl9QQVJFTlRIRVNJUywgQ0xPU0VfUEFSRU5USEVTSVMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGJyYWNrZXRlZDogIltmb29dIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNCcmFja2V0ZWQoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBPUEVOX0JSQUNLRVQsIENMT1NFX0JSQUNLRVQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGJyYWNlZDogIntmb299Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNCcmFjZWQoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBPUEVOX0JSQUNFLCBDTE9TRV9CUkFDRSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgY2hldnJvbmVkOiAiPGZvbz4iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0NoZXZyb25lZChTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIE9QRU5fQ0hFVlJPTiwgQ0xPU0VfQ0hFVlJPTik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgZGVsaW1pdGVkIGJ5IHRoZSBzcGVjaWZpZWQKLQkgKiBjaGFyYWN0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRGVsaW1pdGVkKFN0cmluZyBzdHJpbmcsIGNoYXIgYykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBjLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBkZWxpbWl0ZWQgYnkgdGhlIHNwZWNpZmllZAotCSAqIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRGVsaW1pdGVkKFN0cmluZyBzdHJpbmcsIGNoYXIgc3RhcnQsIGNoYXIgZW5kKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPCAyKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZy50b0NoYXJBcnJheSgpLCBzdGFydCwgZW5kLCBsZW4pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIHF1b3RlZDogIlwiZm9vXCIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc1F1b3RlZChjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIFFVT1RFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBwYXJlbnRoZXRpY2FsOiAiKGZvbykiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc1BhcmVudGhldGljYWwoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBPUEVOX1BBUkVOVEhFU0lTLCBDTE9TRV9QQVJFTlRIRVNJUyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgYnJhY2tldGVkOiAiW2Zvb10iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0JyYWNrZXRlZChjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIE9QRU5fQlJBQ0tFVCwgQ0xPU0VfQlJBQ0tFVCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgYnJhY2VkOiAie2Zvb30iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0JyYWNlZChjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIE9QRU5fQlJBQ0UsIENMT1NFX0JSQUNFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBjaGV2cm9uZWQ6ICI8Zm9vPiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzQ2hldnJvbmVkKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgT1BFTl9DSEVWUk9OLCBDTE9TRV9DSEVWUk9OKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBkZWxpbWl0ZWQgYnkgdGhlIHNwZWNpZmllZAotCSAqIGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNEZWxpbWl0ZWQoY2hhcltdIHN0cmluZywgY2hhciBjKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIGMsIGMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGRlbGltaXRlZCBieSB0aGUgc3BlY2lmaWVkCi0JICogY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNEZWxpbWl0ZWQoY2hhcltdIHN0cmluZywgY2hhciBzdGFydCwgY2hhciBlbmQpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gPCAyKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgc3RhcnQsIGVuZCwgbGVuKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRGVsaW1pdGVkKGNoYXJbXSBzLCBjaGFyIHN0YXJ0LCBjaGFyIGVuZCwgaW50IGxlbikgewotCQlyZXR1cm4gKHNbMF0gPT0gc3RhcnQpICYmIChzW2xlbiAtIDFdID09IGVuZCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHVuZGVsaW1pdGluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGRlbGltaXRlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgcmVtb3ZpbmcgYW55IGVzY2FwZQotCSAqIGNoYXJhY3RlcnMuIFRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydAotCSAqIHRvIHVuZGVsaW1pdCAoaS5lLiBsZW5ndGggPCAyKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmRlbGltaXQoU3RyaW5nIHN0cmluZykgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpIC0gMjsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBzdHJpbmcgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKHVuZGVsaW1pdF8oc3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbikpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3QgYW5kIGxhc3QgY291bnQgY2hhcmFjdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0IHRvIGJlIHVuZGVsaW1pdGVkLCB0aHJvdyBhbgotCSAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KLQkgKiBVc2UgdGhpcyBtZXRob2QgdG8gdW5kZWxpbWl0IHN0cmluZ3MgdGhhdCBkbyBub3QgZXNjYXBlIGVtYmVkZGVkCi0JICogZGVsaW1pdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmRlbGltaXQoU3RyaW5nIHN0cmluZywgaW50IGNvdW50KSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCkgLSAoMiAqIGNvdW50KTsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBzdHJpbmcgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKHVuZGVsaW1pdChzdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuLCBjb3VudCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZGVsaW1pdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCByZW1vdmluZyBhbnkgZXNjYXBlCi0JICogY2hhcmFjdGVycy4gVGhyb3cgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0Ci0JICogdG8gdW5kZWxpbWl0IChpLmUuIGxlbmd0aCA8IDIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHVuZGVsaW1pdChjaGFyW10gc3RyaW5nKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoIC0gMjsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBuZXcgU3RyaW5nKHN0cmluZykgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1QVFlfQ0hBUl9BUlJBWTsKLQkJfQotCQlyZXR1cm4gdW5kZWxpbWl0XyhzdHJpbmcsIGxlbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHVuZGVsaW1pdF8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobGVuZ3RoKTsKLQkJdW5kZWxpbWl0T25fKHN0cmluZywgc2IpOwotCQlyZXR1cm4gY29udmVydFRvQ2hhckFycmF5KHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IGFuZCBsYXN0IGNvdW50IGNoYXJhY3RlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydCB0byBiZSB1bmRlbGltaXRlZCwgdGhyb3cgYW4KLQkgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uCi0JICogVXNlIHRoaXMgbWV0aG9kIHRvIHVuZGVsaW1pdCBzdHJpbmdzIHRoYXQgZG8gbm90IGVzY2FwZSBlbWJlZGRlZAotCSAqIGRlbGltaXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gdW5kZWxpbWl0KGNoYXJbXSBzdHJpbmcsIGludCBjb3VudCkgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCAtICgyICogY291bnQpOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIG5ldyBTdHJpbmcoc3RyaW5nKSArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9DSEFSX0FSUkFZOwotCQl9Ci0JCXJldHVybiB1bmRlbGltaXQoc3RyaW5nLCBsZW4sIGNvdW50KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gdW5kZWxpbWl0KGNoYXJbXSBzdHJpbmcsIGludCBsZW4sIGludCBjb3VudCkgewotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuXTsKLQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIGNvdW50LCByZXN1bHQsIDAsIGxlbik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBkZWxpbWl0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcsIHJlbW92aW5nIGFueSBlc2NhcGUKLQkgKiBjaGFyYWN0ZXJzLiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQKLQkgKiB0byB1bmRlbGltaXQgKGkuZS4gbGVuZ3RoIDwgMikuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uKFN0cmluZyBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJdW5kZWxpbWl0T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBhbmQgbGFzdCBjb3VudCBjaGFyYWN0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICogSWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQgdG8gYmUgdW5kZWxpbWl0ZWQsIHRocm93IGFuCi0JICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgotCSAqIFVzZSB0aGlzIG1ldGhvZCB0byB1bmRlbGltaXQgc3RyaW5ncyB0aGF0IGRvIG5vdCBlc2NhcGUgZW1iZWRkZWQKLQkgKiBkZWxpbWl0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbihTdHJpbmcgc3RyaW5nLCBpbnQgY291bnQsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKSAtICgyICogY291bnQpOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIHN0cmluZyArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgY291bnQsIGxlbiwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGRlbGltaXRlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgcmVtb3ZpbmcgYW55IGVzY2FwZQotCSAqIGNoYXJhY3RlcnMuIFRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydAotCSAqIHRvIHVuZGVsaW1pdCAoaS5lLiBsZW5ndGggPCAyKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZWxpbWl0T24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXVuZGVsaW1pdE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBhbmQgbGFzdCBjb3VudCBjaGFyYWN0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICogSWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQgdG8gYmUgdW5kZWxpbWl0ZWQsIHRocm93IGFuCi0JICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgotCSAqIFVzZSB0aGlzIG1ldGhvZCB0byB1bmRlbGltaXQgc3RyaW5ncyB0aGF0IGRvIG5vdCBlc2NhcGUgZW1iZWRkZWQKLQkgKiBkZWxpbWl0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbihTdHJpbmcgc3RyaW5nLCBpbnQgY291bnQsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpIC0gKDIgKiBjb3VudCk7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgc3RyaW5nICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXNiLmFwcGVuZChzdHJpbmcsIGNvdW50LCBjb3VudCArIGxlbik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBkZWxpbWl0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcsIHJlbW92aW5nIGFueSBlc2NhcGUKLQkgKiBjaGFyYWN0ZXJzLiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQKLQkgKiB0byB1bmRlbGltaXQgKGkuZS4gbGVuZ3RoIDwgMikuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJdW5kZWxpbWl0T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IGFuZCBsYXN0IGNvdW50IGNoYXJhY3RlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydCB0byBiZSB1bmRlbGltaXRlZCwgdGhyb3cgYW4KLQkgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uCi0JICogVXNlIHRoaXMgbWV0aG9kIHRvIHVuZGVsaW1pdCBzdHJpbmdzIHRoYXQgZG8gbm90IGVzY2FwZSBlbWJlZGRlZAotCSAqIGRlbGltaXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uKFN0cmluZyBzdHJpbmcsIGludCBjb3VudCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpIC0gKDIgKiBjb3VudCk7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgc3RyaW5nICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXNiLmFwcGVuZChzdHJpbmcsIGNvdW50LCBjb3VudCArIGxlbik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBkZWxpbWl0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcsIHJlbW92aW5nIGFueSBlc2NhcGUKLQkgKiBjaGFyYWN0ZXJzLiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQKLQkgKiB0byB1bmRlbGltaXQgKGkuZS4gbGVuZ3RoIDwgMikuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGggLSAyOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIG5ldyBTdHJpbmcoc3RyaW5nKSArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQl1bmRlbGltaXRPbl8oc3RyaW5nLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHN0cmluZyBpcyBhdCBsZWFzdCAzIGNoYXJhY3RlcnMgbG9uZwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdW5kZWxpbWl0T25fKGNoYXJbXSBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJY2hhciBkZWxpbWl0ZXIgPSBzdHJpbmdbMF07ICAvLyB0aGUgZmlyc3QgY2hhciBpcyB0aGUgZGVsaW1pdGVyCi0JCWNoYXIgYyA9IHN0cmluZ1swXTsKLQkJY2hhciBuZXh0ID0gc3RyaW5nWzFdOwotCQlpbnQgaSA9IDE7Ci0JCWludCBsYXN0ID0gc3RyaW5nLmxlbmd0aCAtIDE7Ci0JCWRvIHsKLQkJCWMgPSBuZXh0OwotCQkJd3JpdGVDaGFyT24oYywgd3JpdGVyKTsKLQkJCWkrKzsKLQkJCW5leHQgPSBzdHJpbmdbaV07Ci0JCQlpZiAoYyA9PSBkZWxpbWl0ZXIpIHsKLQkJCQlpZiAoKG5leHQgIT0gZGVsaW1pdGVyKSB8fCAoaSA9PSBsYXN0KSkgewotCQkJCQkvLyBhbiBlbWJlZGRlZCBkZWxpbWl0ZXIgbXVzdCBiZSBmb2xsb3dlZCBieSBhbm90aGVyIGRlbGltaXRlcgotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWkrKzsKLQkJCQluZXh0ID0gc3RyaW5nW2ldOwotCQkJfQotCQl9IHdoaWxlIChpICE9IGxhc3QpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3QgYW5kIGxhc3QgY291bnQgY2hhcmFjdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0IHRvIGJlIHVuZGVsaW1pdGVkLCB0aHJvdyBhbgotCSAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KLQkgKiBVc2UgdGhpcyBtZXRob2QgdG8gdW5kZWxpbWl0IHN0cmluZ3MgdGhhdCBkbyBub3QgZXNjYXBlIGVtYmVkZGVkCi0JICogZGVsaW1pdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZWxpbWl0T24oY2hhcltdIHN0cmluZywgaW50IGNvdW50LCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoIC0gKDIgKiBjb3VudCk7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgbmV3IFN0cmluZyhzdHJpbmcpICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCBjb3VudCwgbGVuLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZGVsaW1pdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCByZW1vdmluZyBhbnkgZXNjYXBlCi0JICogY2hhcmFjdGVycy4gVGhyb3cgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0Ci0JICogdG8gdW5kZWxpbWl0IChpLmUuIGxlbmd0aCA8IDIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGggLSAyOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIG5ldyBTdHJpbmcoc3RyaW5nKSArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQl1bmRlbGltaXRPbl8oc3RyaW5nLCBzYik7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogc3RyaW5nIGlzIGF0IGxlYXN0IDMgY2hhcmFjdGVycyBsb25nCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbl8oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWNoYXIgZGVsaW1pdGVyID0gc3RyaW5nWzBdOyAgLy8gdGhlIGZpcnN0IGNoYXIgaXMgdGhlIGRlbGltaXRlcgotCQljaGFyIGMgPSBzdHJpbmdbMF07Ci0JCWNoYXIgbmV4dCA9IHN0cmluZ1sxXTsKLQkJaW50IGkgPSAxOwotCQlpbnQgbGFzdCA9IHN0cmluZy5sZW5ndGggLSAxOwotCQlkbyB7Ci0JCQljID0gbmV4dDsKLQkJCXNiLmFwcGVuZChjKTsKLQkJCWkrKzsKLQkJCW5leHQgPSBzdHJpbmdbaV07Ci0JCQlpZiAoYyA9PSBkZWxpbWl0ZXIpIHsKLQkJCQlpZiAoKG5leHQgIT0gZGVsaW1pdGVyKSB8fCAoaSA9PSBsYXN0KSkgewotCQkJCQkvLyBhbiBlbWJlZGRlZCBkZWxpbWl0ZXIgbXVzdCBiZSBmb2xsb3dlZCBieSBhbm90aGVyIGRlbGltaXRlcgotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWkrKzsKLQkJCQluZXh0ID0gc3RyaW5nW2ldOwotCQkJfQotCQl9IHdoaWxlIChpICE9IGxhc3QpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3QgYW5kIGxhc3QgY291bnQgY2hhcmFjdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0IHRvIGJlIHVuZGVsaW1pdGVkLCB0aHJvdyBhbgotCSAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KLQkgKiBVc2UgdGhpcyBtZXRob2QgdG8gdW5kZWxpbWl0IHN0cmluZ3MgdGhhdCBkbyBub3QgZXNjYXBlIGVtYmVkZGVkCi0JICogZGVsaW1pdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZWxpbWl0T24oY2hhcltdIHN0cmluZywgaW50IGNvdW50LCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGggLSAoMiAqIGNvdW50KTsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBuZXcgU3RyaW5nKHN0cmluZykgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2IuYXBwZW5kKHN0cmluZywgY291bnQsIGxlbik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBkZWxpbWl0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcsIHJlbW92aW5nIGFueSBlc2NhcGUKLQkgKiBjaGFyYWN0ZXJzLiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQKLQkgKiB0byB1bmRlbGltaXQgKGkuZS4gbGVuZ3RoIDwgMikuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGggLSAyOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIG5ldyBTdHJpbmcoc3RyaW5nKSArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQl1bmRlbGltaXRPbl8oc3RyaW5nLCBzYik7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogc3RyaW5nIGlzIGF0IGxlYXN0IDMgY2hhcmFjdGVycyBsb25nCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbl8oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQljaGFyIGRlbGltaXRlciA9IHN0cmluZ1swXTsgIC8vIHRoZSBmaXJzdCBjaGFyIGlzIHRoZSBkZWxpbWl0ZXIKLQkJY2hhciBjID0gc3RyaW5nWzBdOwotCQljaGFyIG5leHQgPSBzdHJpbmdbMV07Ci0JCWludCBpID0gMTsKLQkJaW50IGxhc3QgPSBzdHJpbmcubGVuZ3RoIC0gMTsKLQkJZG8gewotCQkJYyA9IG5leHQ7Ci0JCQlzYi5hcHBlbmQoYyk7Ci0JCQlpKys7Ci0JCQluZXh0ID0gc3RyaW5nW2ldOwotCQkJaWYgKGMgPT0gZGVsaW1pdGVyKSB7Ci0JCQkJaWYgKChuZXh0ICE9IGRlbGltaXRlcikgfHwgKGkgPT0gbGFzdCkpIHsKLQkJCQkJLy8gYW4gZW1iZWRkZWQgZGVsaW1pdGVyIG11c3QgYmUgZm9sbG93ZWQgYnkgYW5vdGhlciBkZWxpbWl0ZXIKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpKys7Ci0JCQkJbmV4dCA9IHN0cmluZ1tpXTsKLQkJCX0KLQkJfSB3aGlsZSAoaSAhPSBsYXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IGFuZCBsYXN0IGNvdW50IGNoYXJhY3RlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydCB0byBiZSB1bmRlbGltaXRlZCwgdGhyb3cgYW4KLQkgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uCi0JICogVXNlIHRoaXMgbWV0aG9kIHRvIHVuZGVsaW1pdCBzdHJpbmdzIHRoYXQgZG8gbm90IGVzY2FwZSBlbWJlZGRlZAotCSAqIGRlbGltaXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIGludCBjb3VudCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCAtICgyICogY291bnQpOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIG5ldyBTdHJpbmcoc3RyaW5nKSArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlzYi5hcHBlbmQoc3RyaW5nLCBjb3VudCwgbGVuKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZpbmcgY2hhcmFjdGVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlRmlyc3RPY2N1cnJlbmNlKGNoYXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUZpcnN0T2NjdXJyZW5jZShTdHJpbmcgc3RyaW5nLCBjaGFyIGMpIHsKLQkJaW50IGluZGV4ID0gc3RyaW5nLmluZGV4T2YoYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJLy8gY2hhcmFjdGVyIG5vdCBmb3VuZAotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBmcm9udCBvZiBzdHJpbmcKLQkJCXJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDEpOwotCQl9Ci0JCWludCBsYXN0ID0gc3RyaW5nLmxlbmd0aCgpIC0gMTsKLQkJaWYgKGluZGV4ID09IGxhc3QpIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHN0cmluZwotCQkJcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMCwgbGFzdCk7Ci0JCX0KLQkJLy8gY2hhcmFjdGVyIGZvdW5kIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzdHJpbmcKLQkJcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpLmNvbmNhdChzdHJpbmcuc3Vic3RyaW5nKGluZGV4ICsgMSkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHByaW50IHRoZSByZXN1bHQgb24gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKGNoYXIsIFdyaXRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKFN0cmluZyBzdHJpbmcsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgaW5kZXggPSBzdHJpbmcuaW5kZXhPZihjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUNoYXJBdEluZGV4T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIGluZGV4LCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcHJpbnQgdGhlIHJlc3VsdCBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oU3RyaW5nIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGluZGV4ID0gc3RyaW5nLmluZGV4T2YoYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVDaGFyQXRJbmRleE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBpbmRleCwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcHJpbnQgdGhlIHJlc3VsdCBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKFN0cmluZyBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgaW5kZXggPSBzdHJpbmcuaW5kZXhPZihjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUNoYXJBdEluZGV4T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIGluZGV4LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlRmlyc3RPY2N1cnJlbmNlKGNoYXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZUZpcnN0T2NjdXJyZW5jZShjaGFyW10gc3RyaW5nLCBjaGFyIGMpIHsKLQkJaW50IGluZGV4ID0gQXJyYXlUb29scy5pbmRleE9mKHN0cmluZywgYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJLy8gY2hhcmFjdGVyIG5vdCBmb3VuZAotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpbnQgbGFzdCA9IHN0cmluZy5sZW5ndGggLSAxOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGFzdF07Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGZyb250IG9mIHN0cmluZwotCQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIDEsIHJlc3VsdCwgMCwgbGFzdCk7Ci0JCX0gZWxzZSBpZiAoaW5kZXggPT0gbGFzdCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQgb2Ygc3RyaW5nCi0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMCwgcmVzdWx0LCAwLCBsYXN0KTsKLQkJfSBlbHNlIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc3RyaW5nCi0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgaW5kZXggKyAxLCByZXN1bHQsIGluZGV4LCBsYXN0IC0gaW5kZXgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcHJpbnQgdGhlIHJlc3VsdCBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhciwgV3JpdGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhcltdIHN0cmluZywgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBpbmRleCA9IEFycmF5VG9vbHMuaW5kZXhPZihzdHJpbmcsIGMpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQ2hhckF0SW5kZXhPbihzdHJpbmcsIGluZGV4LCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVDaGFyQXRJbmRleE9uKGNoYXJbXSBzdHJpbmcsIGludCBpbmRleCwgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGFzdCA9IHN0cmluZy5sZW5ndGggLSAxOwotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBmcm9udCBvZiBzdHJpbmcKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCAxLCBsYXN0LCB3cml0ZXIpOwotCQl9IGVsc2UgaWYgKGluZGV4ID09IGxhc3QpIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHN0cmluZwotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIDAsIGxhc3QsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgc29tZXdoZXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHN0cmluZwotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIDAsIGluZGV4LCB3cml0ZXIpOwotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIGluZGV4ICsgMSwgbGFzdCAtIGluZGV4LCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcHJpbnQgdGhlIHJlc3VsdCBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhcltdIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGluZGV4ID0gQXJyYXlUb29scy5pbmRleE9mKHN0cmluZywgYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVDaGFyQXRJbmRleE9uKHN0cmluZywgaW5kZXgsIHNiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQ2hhckF0SW5kZXhPbihjaGFyW10gc3RyaW5nLCBpbnQgaW5kZXgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGFzdCA9IHN0cmluZy5sZW5ndGggLSAxOwotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBmcm9udCBvZiBzdHJpbmcKLQkJCXNiLmFwcGVuZChzdHJpbmcsIDEsIGxhc3QpOwotCQl9IGVsc2UgaWYgKGluZGV4ID09IGxhc3QpIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHN0cmluZwotCQkJc2IuYXBwZW5kKHN0cmluZywgMCwgbGFzdCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgc29tZXdoZXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHN0cmluZwotCQkJc2IuYXBwZW5kKHN0cmluZywgMCwgaW5kZXgpOwotCQkJc2IuYXBwZW5kKHN0cmluZywgaW5kZXggKyAxLCBsYXN0IC0gaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcHJpbnQgdGhlIHJlc3VsdCBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgaW5kZXggPSBBcnJheVRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUNoYXJBdEluZGV4T24oc3RyaW5nLCBpbmRleCwgc2IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVDaGFyQXRJbmRleE9uKGNoYXJbXSBzdHJpbmcsIGludCBpbmRleCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGFzdCA9IHN0cmluZy5sZW5ndGggLSAxOwotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBmcm9udCBvZiBzdHJpbmcKLQkJCXNiLmFwcGVuZChzdHJpbmcsIDEsIGxhc3QpOwotCQl9IGVsc2UgaWYgKGluZGV4ID09IGxhc3QpIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHN0cmluZwotCQkJc2IuYXBwZW5kKHN0cmluZywgMCwgbGFzdCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgc29tZXdoZXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHN0cmluZwotCQkJc2IuYXBwZW5kKHN0cmluZywgMCwgaW5kZXgpOwotCQkJc2IuYXBwZW5kKHN0cmluZywgaW5kZXggKyAxLCBsYXN0IC0gaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhjaGFyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVBbGxPY2N1cnJlbmNlcyhTdHJpbmcgc3RyaW5nLCBjaGFyIGMpIHsKLQkJaW50IGZpcnN0ID0gc3RyaW5nLmluZGV4T2YoYyk7Ci0JCXJldHVybiAoZmlyc3QgPT0gLTEpID8gc3RyaW5nIDogbmV3IFN0cmluZyhyZW1vdmVBbGxPY2N1cnJlbmNlc18oc3RyaW5nLnRvQ2hhckFycmF5KCksIGMsIGZpcnN0KSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnJlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhciwgV3JpdGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihTdHJpbmcgc3RyaW5nLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGZpcnN0ID0gc3RyaW5nLmluZGV4T2YoYyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgYywgZmlyc3QsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uKFN0cmluZyBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBmaXJzdCA9IHN0cmluZy5pbmRleE9mKGMpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIGMsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihTdHJpbmcgc3RyaW5nLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGZpcnN0ID0gc3RyaW5nLmluZGV4T2YoYyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgYywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlQWxsT2NjdXJyZW5jZXMoY2hhcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlQWxsT2NjdXJyZW5jZXMoY2hhcltdIHN0cmluZywgY2hhciBjKSB7Ci0JCWludCBmaXJzdCA9IEFycmF5VG9vbHMuaW5kZXhPZihzdHJpbmcsIGMpOwotCQlyZXR1cm4gKGZpcnN0ID09IC0xKSA/IHN0cmluZyA6IHJlbW92ZUFsbE9jY3VycmVuY2VzXyhzdHJpbmcsIGMsIGZpcnN0KTsKLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgbWF0Y2hpbmcgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gcmVtb3ZlQWxsT2NjdXJyZW5jZXNfKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgaW50IGZpcnN0KSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHJpbmcubGVuZ3RoKTsKLQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oc3RyaW5nLCBjLCBmaXJzdCwgc2IpOwotCQlyZXR1cm4gY29udmVydFRvQ2hhckFycmF5KHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgd3JpdGVyLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXIsIFdyaXRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhcltdIHN0cmluZywgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBmaXJzdCA9IEFycmF5VG9vbHMuaW5kZXhPZihzdHJpbmcsIGMpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oc3RyaW5nLCBjLCBmaXJzdCwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBtYXRjaGluZyBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oY2hhcltdIHN0cmluZywgY2hhciBjLCBpbnQgZmlyc3QsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIDAsIGZpcnN0LCB3cml0ZXIpOwotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IGZpcnN0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgZCA9IHN0cmluZ1tpXTsKLQkJCWlmIChkICE9IGMpIHsKLQkJCQl3cml0ZUNoYXJPbihkLCB3cml0ZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhcltdIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGZpcnN0ID0gQXJyYXlUb29scy5pbmRleE9mKHN0cmluZywgYyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhzdHJpbmcsIGMsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgbWF0Y2hpbmcgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE9jY3VycmVuY2VzT25fKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgaW50IGZpcnN0LCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZywgMCwgZmlyc3QpOwotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IGZpcnN0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgZCA9IHN0cmluZ1tpXTsKLQkJCWlmIChkICE9IGMpIHsKLQkJCQlzYi5hcHBlbmQoZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgZmlyc3QgPSBBcnJheVRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbE9jY3VycmVuY2VzT25fKHN0cmluZywgYywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBtYXRjaGluZyBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oY2hhcltdIHN0cmluZywgY2hhciBjLCBpbnQgZmlyc3QsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZywgMCwgZmlyc3QpOwotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IGZpcnN0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgZCA9IHN0cmluZ1tpXTsKLQkJCWlmIChkICE9IGMpIHsKLQkJCQlzYi5hcHBlbmQoZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnJlbW92ZUFsbFNwYWNlcygpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUFsbFNwYWNlcyhTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiByZW1vdmVBbGxPY2N1cnJlbmNlcyhzdHJpbmcsICcgJyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgc3BhY2VzCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkIHdyaXRlci4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlQWxsU3BhY2VzT24oV3JpdGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsU3BhY2VzT24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uKHN0cmluZywgJyAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHNwYWNlcwotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gdGhlIHNwZWNpZmllZAotCSAqIHN0cmluZyBidWZmZXIuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnJlbW92ZUFsbFNwYWNlc09uKFN0cmluZ0J1ZmZlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFNwYWNlc09uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uKHN0cmluZywgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgc3BhY2VzCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkCi0JICogc3RyaW5nIGJ1aWxkZXIuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnJlbW92ZUFsbFNwYWNlc09uKFN0cmluZ0J1aWxkZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxTcGFjZXNPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnJlbW92ZUFsbFNwYWNlcygpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZUFsbFNwYWNlcyhjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiByZW1vdmVBbGxPY2N1cnJlbmNlcyhzdHJpbmcsICcgJyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgc3BhY2VzCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgd3JpdGVyLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVBbGxTcGFjZXNPbihXcml0ZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxTcGFjZXNPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCAnICcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgc3BhY2VzCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWZmZXIuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnJlbW92ZUFsbFNwYWNlc09uKFN0cmluZ0J1ZmZlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFNwYWNlc09uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uKHN0cmluZywgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgc3BhY2VzCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVBbGxTcGFjZXNPbihTdHJpbmdCdWlsZGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsU3BhY2VzT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uKHN0cmluZywgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgd2hpdGVzcGFjZSBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlQWxsV2hpdGVzcGFjZSgpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUFsbFdoaXRlc3BhY2UoU3RyaW5nIHN0cmluZykgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCXJldHVybiAoZmlyc3QgPT0gLTEpID8gc3RyaW5nIDogbmV3IFN0cmluZyhyZW1vdmVBbGxXaGl0ZXNwYWNlXyhzdHJpbmcyLCBmaXJzdCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgd3JpdGVyLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVBbGxXaGl0ZXNwYWNlT24oV3JpdGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsV2hpdGVzcGFjZU9uKFN0cmluZyBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJY2hhcltdIHN0cmluZzIgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZzIpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsV2hpdGVzcGFjZU9uXyhzdHJpbmcyLCBmaXJzdCwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlci4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlQWxsV2hpdGVzcGFjZU9uKFN0cmluZ0J1ZmZlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFdoaXRlc3BhY2VPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJY2hhcltdIHN0cmluZzIgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZzIpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsV2hpdGVzcGFjZU9uXyhzdHJpbmcyLCBmaXJzdCwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgd2hpdGVzcGFjZQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlci4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlQWxsV2hpdGVzcGFjZU9uKFN0cmluZ0J1aWxkZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxXaGl0ZXNwYWNlT25fKHN0cmluZzIsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVBbGxXaGl0ZXNwYWNlKCkKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlQWxsV2hpdGVzcGFjZShjaGFyW10gc3RyaW5nKSB7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcpOwotCQlyZXR1cm4gKGZpcnN0ID09IC0xKSA/IHN0cmluZyA6IHJlbW92ZUFsbFdoaXRlc3BhY2VfKHN0cmluZywgZmlyc3QpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBpbmRleE9mV2hpdGVzcGFjZV8oY2hhcltdIHN0cmluZykgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2Uoc3RyaW5nW2ldKSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gcmVtb3ZlQWxsV2hpdGVzcGFjZV8oY2hhcltdIHN0cmluZywgaW50IGZpcnN0KSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHJpbmcubGVuZ3RoKTsKLQkJcmVtb3ZlQWxsV2hpdGVzcGFjZU9uXyhzdHJpbmcsIGZpcnN0LCBzYik7Ci0JCXJldHVybiBjb252ZXJ0VG9DaGFyQXJyYXkoc2IpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgd3JpdGVyLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVBbGxXaGl0ZXNwYWNlT24oV3JpdGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsV2hpdGVzcGFjZU9uKGNoYXJbXSBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxXaGl0ZXNwYWNlT25fKHN0cmluZywgZmlyc3QsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWxsV2hpdGVzcGFjZU9uXyhjaGFyW10gc3RyaW5nLCBpbnQgZmlyc3QsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIDAsIGZpcnN0LCB3cml0ZXIpOwotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IGZpcnN0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgYyA9IHN0cmluZ1tpXTsKLQkJCWlmICggISBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKSB7Ci0JCQkJd3JpdGVDaGFyT24oYywgd3JpdGVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlci4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlQWxsV2hpdGVzcGFjZU9uKFN0cmluZ0J1ZmZlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFdoaXRlc3BhY2VPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxXaGl0ZXNwYWNlT25fKHN0cmluZywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT25fKGNoYXJbXSBzdHJpbmcsIGludCBmaXJzdCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDAsIGZpcnN0KTsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzdHJpbmdbaV07Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotCQkJCXNiLmFwcGVuZChjKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnJlbW92ZUFsbFdoaXRlc3BhY2VPbihTdHJpbmdCdWlsZGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsV2hpdGVzcGFjZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxXaGl0ZXNwYWNlT25fKHN0cmluZywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT25fKGNoYXJbXSBzdHJpbmcsIGludCBmaXJzdCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBmaXJzdCk7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gc3RyaW5nW2ldOwotCQkJaWYgKCAhIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLQkJCQlzYi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCX0KLQl9Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkvKioKLQkgKiBDb21wcmVzcyB0aGUgd2hpdGVzcGFjZSBpbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogVGhlIHdoaXRlc3BhY2UgaXMgY29tcHJlc3NlZCBieSByZXBsYWNpbmcgYW55IG9jY3VycmVuY2Ugb2Ygb25lIG9yIG1vcmUKLQkgKiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgd2l0aCBhIHNpbmdsZSBzcGFjZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuY29tcHJlc3NXaGl0ZXNwYWNlKCkKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHJlc3NXaGl0ZXNwYWNlKFN0cmluZyBzdHJpbmcpIHsKLQkJY2hhcltdIHN0cmluZzIgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZzIpOwotCQlyZXR1cm4gKGZpcnN0ID09IC0xKSA/IHN0cmluZyA6IG5ldyBTdHJpbmcoY29tcHJlc3NXaGl0ZXNwYWNlXyhzdHJpbmcyLCBmaXJzdCkpOwotCX0KLQotCS8qKgotCSAqIENvbXByZXNzIHRoZSB3aGl0ZXNwYWNlCi0JICogaW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCB3cml0ZXIuCi0JICogVGhlIHdoaXRlc3BhY2UgaXMgY29tcHJlc3NlZCBieSByZXBsYWNpbmcgYW55IG9jY3VycmVuY2Ugb2Ygb25lIG9yIG1vcmUKLQkgKiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgd2l0aCBhIHNpbmdsZSBzcGFjZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuY29tcHJlc3NXaGl0ZXNwYWNlT24oV3JpdGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29tcHJlc3NXaGl0ZXNwYWNlT24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQljb21wcmVzc1doaXRlc3BhY2VPbl8oc3RyaW5nMiwgZmlyc3QsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21wcmVzcyB0aGUgd2hpdGVzcGFjZQotCSAqIGluIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlci4KLQkgKiBUaGUgd2hpdGVzcGFjZSBpcyBjb21wcmVzc2VkIGJ5IHJlcGxhY2luZyBhbnkgb2NjdXJyZW5jZSBvZiBvbmUgb3IgbW9yZQotCSAqIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB3aXRoIGEgc2luZ2xlIHNwYWNlLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5jb21wcmVzc1doaXRlc3BhY2VPbihTdHJpbmdCdWZmZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb21wcmVzc1doaXRlc3BhY2VPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJY2hhcltdIHN0cmluZzIgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZzIpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJY29tcHJlc3NXaGl0ZXNwYWNlT25fKHN0cmluZzIsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21wcmVzcyB0aGUgd2hpdGVzcGFjZQotCSAqIGluIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIuCi0JICogVGhlIHdoaXRlc3BhY2UgaXMgY29tcHJlc3NlZCBieSByZXBsYWNpbmcgYW55IG9jY3VycmVuY2Ugb2Ygb25lIG9yIG1vcmUKLQkgKiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgd2l0aCBhIHNpbmdsZSBzcGFjZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuY29tcHJlc3NXaGl0ZXNwYWNlT24oU3RyaW5nQnVpbGRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbXByZXNzV2hpdGVzcGFjZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJY2hhcltdIHN0cmluZzIgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZzIpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJY29tcHJlc3NXaGl0ZXNwYWNlT25fKHN0cmluZzIsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21wcmVzcyB0aGUgd2hpdGVzcGFjZSBpbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogVGhlIHdoaXRlc3BhY2UgaXMgY29tcHJlc3NlZCBieSByZXBsYWNpbmcgYW55IG9jY3VycmVuY2Ugb2Ygb25lIG9yIG1vcmUKLQkgKiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgd2l0aCBhIHNpbmdsZSBzcGFjZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuY29tcHJlc3NXaGl0ZXNwYWNlKCkKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29tcHJlc3NXaGl0ZXNwYWNlKGNoYXJbXSBzdHJpbmcpIHsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZyk7Ci0JCXJldHVybiAoZmlyc3QgPT0gLTEpID8gc3RyaW5nIDogY29tcHJlc3NXaGl0ZXNwYWNlXyhzdHJpbmcsIGZpcnN0KTsKLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBjb21wcmVzc1doaXRlc3BhY2VfKGNoYXJbXSBzdHJpbmcsIGludCBmaXJzdCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoc3RyaW5nLmxlbmd0aCk7Ci0JCWNvbXByZXNzV2hpdGVzcGFjZU9uXyhzdHJpbmcsIGZpcnN0LCBzYik7Ci0JCXJldHVybiBjb252ZXJ0VG9DaGFyQXJyYXkoc2IpOwotCX0KLQotCS8qKgotCSAqIENvbXByZXNzIHRoZSB3aGl0ZXNwYWNlCi0JICogaW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCB3cml0ZXIuCi0JICogVGhlIHdoaXRlc3BhY2UgaXMgY29tcHJlc3NlZCBieSByZXBsYWNpbmcgYW55IG9jY3VycmVuY2Ugb2Ygb25lIG9yIG1vcmUKLQkgKiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgd2l0aCBhIHNpbmdsZSBzcGFjZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuY29tcHJlc3NXaGl0ZXNwYWNlT24oV3JpdGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29tcHJlc3NXaGl0ZXNwYWNlT24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWNvbXByZXNzV2hpdGVzcGFjZU9uXyhzdHJpbmcsIGZpcnN0LCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbXByZXNzV2hpdGVzcGFjZU9uXyhjaGFyW10gc3RyaW5nLCBpbnQgZmlyc3QsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIDAsIGZpcnN0LCB3cml0ZXIpOwotCQlib29sZWFuIHNwYWNlV3JpdHRlbiA9IGZhbHNlOwotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IGZpcnN0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgYyA9IHN0cmluZ1tpXTsKLQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKSB7Ci0JCQkJaWYgKHNwYWNlV3JpdHRlbikgewotCQkJCQkvLyBza2lwIHN1YnNlcXVlbnQgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzCi0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gcmVwbGFjZSBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciB3aXRoIGEgc3BhY2UKLQkJCQkJc3BhY2VXcml0dGVuID0gdHJ1ZTsKLQkJCQkJd3JpdGVDaGFyT24oJyAnLCB3cml0ZXIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc3BhY2VXcml0dGVuID0gZmFsc2U7Ci0JCQkJd3JpdGVDaGFyT24oYywgd3JpdGVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXByZXNzIHRoZSB3aGl0ZXNwYWNlCi0JICogaW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyLgotCSAqIFRoZSB3aGl0ZXNwYWNlIGlzIGNvbXByZXNzZWQgYnkgcmVwbGFjaW5nIGFueSBvY2N1cnJlbmNlIG9mIG9uZSBvciBtb3JlCi0JICogd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHdpdGggYSBzaW5nbGUgc3BhY2UuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLmNvbXByZXNzV2hpdGVzcGFjZU9uKFN0cmluZ0J1ZmZlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbXByZXNzV2hpdGVzcGFjZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWNvbXByZXNzV2hpdGVzcGFjZU9uXyhzdHJpbmcsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY29tcHJlc3NXaGl0ZXNwYWNlT25fKGNoYXJbXSBzdHJpbmcsIGludCBmaXJzdCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDAsIGZpcnN0KTsKLQkJYm9vbGVhbiBzcGFjZVdyaXR0ZW4gPSBmYWxzZTsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzdHJpbmdbaV07Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotCQkJCWlmIChzcGFjZVdyaXR0ZW4pIHsKLQkJCQkJLy8gc2tpcCBzdWJzZXF1ZW50IHdoaXRlc3BhY2UgY2hhcmFjdGVycwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHJlcGxhY2UgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgd2l0aCBhIHNwYWNlCi0JCQkJCXNwYWNlV3JpdHRlbiA9IHRydWU7Ci0JCQkJCXNiLmFwcGVuZCgnICcpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc3BhY2VXcml0dGVuID0gZmFsc2U7Ci0JCQkJc2IuYXBwZW5kKGMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tcHJlc3MgdGhlIHdoaXRlc3BhY2UKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyLgotCSAqIFRoZSB3aGl0ZXNwYWNlIGlzIGNvbXByZXNzZWQgYnkgcmVwbGFjaW5nIGFueSBvY2N1cnJlbmNlIG9mIG9uZSBvciBtb3JlCi0JICogd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHdpdGggYSBzaW5nbGUgc3BhY2UuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLmNvbXByZXNzV2hpdGVzcGFjZU9uKFN0cmluZ0J1aWxkZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb21wcmVzc1doaXRlc3BhY2VPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJY29tcHJlc3NXaGl0ZXNwYWNlT25fKHN0cmluZywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb21wcmVzc1doaXRlc3BhY2VPbl8oY2hhcltdIHN0cmluZywgaW50IGZpcnN0LCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDAsIGZpcnN0KTsKLQkJYm9vbGVhbiBzcGFjZVdyaXR0ZW4gPSBmYWxzZTsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzdHJpbmdbaV07Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotCQkJCWlmIChzcGFjZVdyaXR0ZW4pIHsKLQkJCQkJLy8gc2tpcCBzdWJzZXF1ZW50IHdoaXRlc3BhY2UgY2hhcmFjdGVycwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHJlcGxhY2UgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgd2l0aCBhIHNwYWNlCi0JCQkJCXNwYWNlV3JpdHRlbiA9IHRydWU7Ci0JCQkJCXNiLmFwcGVuZCgnICcpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc3BhY2VXcml0dGVuID0gZmFsc2U7Ci0JCQkJc2IuYXBwZW5kKGMpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbW1vbiBwcmVmaXggKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1vbiBwcmVmaXggc2hhcmVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyaW5ncy4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuY29tbW9uUHJlZml4TGVuZ3RoKFN0cmluZykKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29tbW9uUHJlZml4TGVuZ3RoKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCXJldHVybiBjb21tb25QcmVmaXhMZW5ndGgoczEudG9DaGFyQXJyYXkoKSwgczIudG9DaGFyQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1vbiBwcmVmaXggc2hhcmVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyaW5ncy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjb21tb25QcmVmaXhMZW5ndGgoY2hhcltdIHMxLCBjaGFyW10gczIpIHsKLQkJcmV0dXJuIGNvbW1vblByZWZpeExlbmd0aF8oczEsIHMyLCBNYXRoLm1pbihzMS5sZW5ndGgsIHMyLmxlbmd0aCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tb24gcHJlZml4IHNoYXJlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmluZ3M7Ci0JICogYnV0IGxpbWl0IHRoZSBsZW5ndGggdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5jb21tb25QcmVmaXhMZW5ndGgoU3RyaW5nLCBpbnQpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvbW1vblByZWZpeExlbmd0aChTdHJpbmcgczEsIFN0cmluZyBzMiwgaW50IG1heCkgewotCQlyZXR1cm4gY29tbW9uUHJlZml4TGVuZ3RoKHMxLnRvQ2hhckFycmF5KCksIHMyLnRvQ2hhckFycmF5KCksIG1heCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1vbiBwcmVmaXggc2hhcmVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyaW5nczsKLQkgKiBidXQgbGltaXQgdGhlIGxlbmd0aCB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29tbW9uUHJlZml4TGVuZ3RoKGNoYXJbXSBzMSwgY2hhcltdIHMyLCBpbnQgbWF4KSB7Ci0JCXJldHVybiBjb21tb25QcmVmaXhMZW5ndGhfKHMxLCBzMiwgTWF0aC5taW4obWF4LCBNYXRoLm1pbihzMS5sZW5ndGgsIHMyLmxlbmd0aCkpKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tb24gcHJlZml4IHNoYXJlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmluZ3M7Ci0JICogYnV0IGxpbWl0IHRoZSBsZW5ndGggdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtLiBBc3N1bWUgdGhlIHNwZWNpZmllZAotCSAqIG1heGltdW0gaXMgbGVzcyB0aGFuIHRoZSBsZW5ndGhzIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgY29tbW9uUHJlZml4TGVuZ3RoXyhjaGFyW10gczEsIGNoYXJbXSBzMiwgaW50IG1heCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlpZiAoczFbaV0gIT0gczJbaV0pIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwkvLyBhbGwgdGhlIGNoYXJhY3RlcnMgdXAgdG8gJ21heCcgYXJlIHRoZSBzYW1lCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGNhcGl0YWxpemF0aW9uICoqKioqKioqKioKLQotCS8qCi0JICogbm8gemVyby1sZW5ndGggY2hlY2sgb3IgbG93ZXIgY2FzZSBjaGVjawotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBjYXBpdGFsaXplXyhjaGFyW10gc3RyaW5nKSB7Ci0JCXN0cmluZ1swXSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShzdHJpbmdbMF0pOwotCQlyZXR1cm4gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIE1vZGlmeSBhbmQgcmV0dXJuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGgKLQkgKiBpdHMgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNhcGl0YWxpemUoY2hhcltdIHN0cmluZykgewotCQlpZiAoKHN0cmluZy5sZW5ndGggPT0gMCkgfHwgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZ1swXSkpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIGNhcGl0YWxpemVfKHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuY2FwaXRhbGl6ZSgpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhcGl0YWxpemUoU3RyaW5nIHN0cmluZykgewotCQlpZiAoKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB8fCBDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nLmNoYXJBdCgwKSkpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcoY2FwaXRhbGl6ZV8oc3RyaW5nLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnkgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MsIGNhcGl0YWxpemluZyB0aGUgZmlyc3QgbGV0dGVyIG9mCi0JICogZWFjaC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPFN0cmluZz4gY2FwaXRhbGl6ZShJdGVyYWJsZTxTdHJpbmc+IHN0cmluZ3MpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFN0cmluZywgU3RyaW5nPihzdHJpbmdzLCBTVFJJTkdfQ0FQSVRBTElaRVIpOwotCX0KLQotCS8qKgotCSAqIE1vZGlmeSBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncywgY2FwaXRhbGl6aW5nIHRoZSBmaXJzdCBsZXR0ZXIgb2YKLQkgKiBlYWNoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8U3RyaW5nPiBjYXBpdGFsaXplKEl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHN0cmluZ3MsIFNUUklOR19DQVBJVEFMSVpFUik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+IFNUUklOR19DQVBJVEFMSVpFUiA9IG5ldyBUcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4oKSB7Ci0JCXB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBzdHJpbmcpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5jYXBpdGFsaXplKHN0cmluZyk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogTW9kaWZ5IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzLCBjYXBpdGFsaXppbmcgdGhlIGZpcnN0IGxldHRlciBvZgotCSAqIGVhY2guCi0JICovCi0JLy8gY2Fubm90IG5hbWUgbWV0aG9kIHNpbXBseSAnY2FwaXRhbGl6ZScgYmVjYXVzZSBvZiB0eXBlLWVyYXN1cmUuLi4KLQlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPGNoYXJbXT4gY2FwaXRhbGl6ZUNoYXJBcnJheXMoSXRlcmFibGU8Y2hhcltdPiBzdHJpbmdzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxjaGFyW10sIGNoYXJbXT4oc3RyaW5ncywgQ0hBUl9BUlJBWV9DQVBJVEFMSVpFUik7Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzLCBjYXBpdGFsaXppbmcgdGhlIGZpcnN0IGxldHRlciBvZgotCSAqIGVhY2guCi0JICovCi0JLy8gY2Fubm90IG5hbWUgbWV0aG9kIHNpbXBseSAnY2FwaXRhbGl6ZScgYmVjYXVzZSBvZiB0eXBlLWVyYXN1cmUuLi4KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPGNoYXJbXT4gY2FwaXRhbGl6ZUNoYXJBcnJheXMoSXRlcmF0b3I8Y2hhcltdPiBzdHJpbmdzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxjaGFyW10sIGNoYXJbXT4oc3RyaW5ncywgQ0hBUl9BUlJBWV9DQVBJVEFMSVpFUik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXI8Y2hhcltdLCBjaGFyW10+IENIQVJfQVJSQVlfQ0FQSVRBTElaRVIgPSBuZXcgVHJhbnNmb3JtZXI8Y2hhcltdLCBjaGFyW10+KCkgewotCQlwdWJsaWMgY2hhcltdIHRyYW5zZm9ybShjaGFyW10gc3RyaW5nKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZShzdHJpbmcpOwotCQl9Ci0JfTsKLQotCS8qCi0JICogbm8gemVyby1sZW5ndGggY2hlY2sgb3IgdXBwZXIgY2FzZSBjaGVjawotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uXyhjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShzdHJpbmdbMF0pKTsKLQkJc2IuYXBwZW5kKHN0cmluZywgMSwgc3RyaW5nLmxlbmd0aCAtIDEpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNhcGl0YWxpemVPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nWzBdKSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQljYXBpdGFsaXplT25fKHN0cmluZywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuY2FwaXRhbGl6ZU9uKFN0cmluZ0J1ZmZlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNhcGl0YWxpemVPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmcuY2hhckF0KDApKSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQljYXBpdGFsaXplT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIG5vIHplcm8tbGVuZ3RoIGNoZWNrIG9yIHVwcGVyIGNhc2UgY2hlY2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNhcGl0YWxpemVPbl8oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHN0cmluZ1swXSkpOwotCQlzYi5hcHBlbmQoc3RyaW5nLCAxLCBzdHJpbmcubGVuZ3RoIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNhcGl0YWxpemVPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZ1swXSkpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJY2FwaXRhbGl6ZU9uXyhzdHJpbmcsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5jYXBpdGFsaXplT24oU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmcuY2hhckF0KDApKSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQljYXBpdGFsaXplT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIG5vIHplcm8tbGVuZ3RoIGNoZWNrIG9yIHVwcGVyIGNhc2UgY2hlY2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNhcGl0YWxpemVPbl8oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZUNoYXJPbihDaGFyYWN0ZXIudG9VcHBlckNhc2Uoc3RyaW5nWzBdKSwgd3JpdGVyKTsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIDEsIHN0cmluZy5sZW5ndGggLSAxLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNhcGl0YWxpemVPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZ1swXSkpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJY2FwaXRhbGl6ZU9uXyhzdHJpbmcsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5jYXBpdGFsaXplT24oV3JpdGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uKFN0cmluZyBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmcuY2hhckF0KDApKSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQljYXBpdGFsaXplT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBubyB6ZXJvLWxlbmd0aCBjaGVjayBvciBsb3dlciBjYXNlIGNoZWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHVuY2FwaXRhbGl6ZV8oY2hhcltdIHN0cmluZykgewotCQlzdHJpbmdbMF0gPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc3RyaW5nWzBdKTsKLQkJcmV0dXJuIHN0cmluZzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWRfKGNoYXJbXSBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShzdHJpbmdbMF0pKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBpZiBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGNoYXJhY3RlcnMgYXJlIGNhcGl0YWxpemVkLAotCQkvLyByZXR1cm4gdGhlIHN0cmluZyB1bmNoYW5nZWQKLQkJaWYgKChzdHJpbmcubGVuZ3RoID4gMSkKLQkJCQkmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nWzFdKQotCQkJCSYmIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmdbMF0pKXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnkgYW5kIHJldHVybiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGl0cwotCSAqIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKiAoVW5sZXNzIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSwKLQkgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSB1bmNhcGl0YWxpemUoY2hhcltdIHN0cmluZykgewotCQlpZiAoc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oc3RyaW5nKSkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlyZXR1cm4gdW5jYXBpdGFsaXplXyhzdHJpbmcpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oU3RyaW5nIHN0cmluZykgewotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2Uoc3RyaW5nLmNoYXJBdCgwKSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIGlmIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2hhcmFjdGVycyBhcmUgY2FwaXRhbGl6ZWQsCi0JCS8vIHJldHVybiB0aGUgc3RyaW5nIHVuY2hhbmdlZAotCQlpZiAoKHN0cmluZy5sZW5ndGgoKSA+IDEpCi0JCQkJJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZy5jaGFyQXQoMSkpCi0JCQkJJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZy5jaGFyQXQoMCkpKXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy51bmNhcGl0YWxpemUoKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmNhcGl0YWxpemUoU3RyaW5nIHN0cmluZykgewotCQlpZiAoc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oc3RyaW5nKSkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyh1bmNhcGl0YWxpemVfKHN0cmluZy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JLyoKLQkgKiBubyB6ZXJvLWxlbmd0aCBjaGVjayBvciBsb3dlciBjYXNlIGNoZWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1bmNhcGl0YWxpemVPbl8oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc3RyaW5nWzBdKSk7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDEsIHN0cmluZy5sZW5ndGggLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmNhcGl0YWxpemVPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaWYgKHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWRfKHN0cmluZykpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJdW5jYXBpdGFsaXplT25fKHN0cmluZywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKiAoVW5sZXNzIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSwKLQkgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLikKLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcudW5jYXBpdGFsaXplT24oU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhzdHJpbmcpKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXVuY2FwaXRhbGl6ZU9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBubyB6ZXJvLWxlbmd0aCBjaGVjayBvciBsb3dlciBjYXNlIGNoZWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1bmNhcGl0YWxpemVPbl8oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHN0cmluZ1swXSkpOwotCQlzYi5hcHBlbmQoc3RyaW5nLCAxLCBzdHJpbmcubGVuZ3RoIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi0JICogKFVubGVzcyBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGxldHRlcnMgYXJlIHVwcGVyIGNhc2UsCi0JICogaW4gd2hpY2ggY2FzZSB0aGUgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC4pCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWRfKHN0cmluZykpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJdW5jYXBpdGFsaXplT25fKHN0cmluZywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi0JICogKFVubGVzcyBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGxldHRlcnMgYXJlIHVwcGVyIGNhc2UsCi0JICogaW4gd2hpY2ggY2FzZSB0aGUgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC4pCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnVuY2FwaXRhbGl6ZU9uKFN0cmluZ0J1ZmZlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWRfKHN0cmluZykpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJdW5jYXBpdGFsaXplT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIG5vIHplcm8tbGVuZ3RoIGNoZWNrIG9yIHVwcGVyIGNhc2UgY2hlY2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uXyhjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlQ2hhck9uKENoYXJhY3Rlci50b0xvd2VyQ2FzZShzdHJpbmdbMF0pLCB3cml0ZXIpOwotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMSwgc3RyaW5nLmxlbmd0aCAtIDEsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKiAoVW5sZXNzIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSwKLQkgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpZiAoc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oc3RyaW5nKSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQl1bmNhcGl0YWxpemVPbl8oc3RyaW5nLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKiAoVW5sZXNzIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSwKLQkgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLikKLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcudW5jYXBpdGFsaXplT24oV3JpdGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpZiAoc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oc3RyaW5nKSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQl1bmNhcGl0YWxpemVPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogdG9TdHJpbmcoKSBoZWxwZXIgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCdWlsZCBhICJEYWxpIHN0YW5kYXJkIiB7QGxpbmsgT2JqZWN0I3RvU3RyaW5nKCkgdG9TdHJpbmcoKX0gcmVzdWx0IGZvcgotCSAqIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uOjxwcmU+Ci0JICogICAgIENsYXNzTmFtZVswMC1GMy1FRS00Ml0oYWRkJ2wgaW5mbykKLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFRvU3RyaW5nRm9yKE9iamVjdCBvLCBPYmplY3QgYWRkaXRpb25hbEluZm8pIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWFwcGVuZFNpbXBsZVRvU3RyaW5nKHNiLCBvKTsKLQkJc2IuYXBwZW5kKCcoJyk7Ci0JCXNiLmFwcGVuZChhZGRpdGlvbmFsSW5mbyk7Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhICJEYWxpIHN0YW5kYXJkIiB7QGxpbmsgT2JqZWN0I3RvU3RyaW5nKCkgdG9TdHJpbmcoKX0gcmVzdWx0IGZvcgotCSAqIHRoZSBzcGVjaWZpZWQgb2JqZWN0OjxwcmU+Ci0JICogICAgIENsYXNzTmFtZVswMC1GMy1FRS00Ml0KLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFRvU3RyaW5nRm9yKE9iamVjdCBvKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlhcHBlbmRTaW1wbGVUb1N0cmluZyhzYiwgbyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCBhICJEYWxpIHN0YW5kYXJkIiB7QGxpbmsgT2JqZWN0I3RvU3RyaW5nKCkgdG9TdHJpbmcoKX0gcmVzdWx0IGZvcgotCSAqIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXI6PHByZT4KLQkgKiAgICAgQ2xhc3NOYW1lWzAwLUYzLUVFLTQyXQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhcHBlbmRTaW1wbGVUb1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiLCBPYmplY3QgbykgewotCQlhcHBlbmRUb1N0cmluZ0NsYXNzTmFtZShzYiwgby5nZXRDbGFzcygpKTsKLQkJc2IuYXBwZW5kKCdbJyk7Ci0JCXNlcGFyYXRlT24oYnVpbGRIYXNoQ29kZShvKSwgJy0nLCAyLCBzYik7Ci0JCXNiLmFwcGVuZCgnXScpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBidWlsZEhhc2hDb2RlKE9iamVjdCBvKSB7Ci0JCS8vIHVzZSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShPYmplY3QpLCBzaW5jZSBPYmplY3QuaGFzaENvZGUoKSBtYXkgYmUgb3ZlcnJpZGRlbgotCQlyZXR1cm4gemVyb1BhZChJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG8pKS50b1VwcGVyQ2FzZSgpLCA4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuYW1lIHN1aXRhYmxlIGZvciBhICJEYWxpIHN0YW5kYXJkIgotCSAqIHtAbGluayBPYmplY3QjdG9TdHJpbmcoKSB0b1N0cmluZygpfSBpbXBsZW1lbnRhdGlvbi4KLQkgKiB7QGxpbmsgQ2xhc3MjZ2V0U2ltcGxlTmFtZSgpfSBpc24ndCBxdWl0ZSB1c2VmdWwgZW5vdWdoOjx1bD4KLQkgKiA8bGk+QW4gPGVtPmFub255bW91czwvZW0+IGNsYXNzJ3Mgc2ltcGxlIG5hbWUgaXMgYW4gZW1wdHkgc3RyaW5nLgotCSAqICAgICBSZXR1cm4gdGhlICJEYWxpIHN0YW5kYXJkIiBuYW1lIG9mIHRoZSBhbm9ueW1vdXMgY2xhc3MncyBzdXBlciBjbGFzcwotCSAqICAgICBpbnN0ZWFkLCB3aGljaCBpcyBhIGJpdCBtb3JlIGhlbHBmdWwuCi0JICogPGxpPkEgPGVtPm1lbWJlcjwvZW0+IG9yIDxlbT5sb2NhbDwvZW0+IGNsYXNzJ3Mgc2ltcGxlIG5hbWUgZG9lcyBub3QKLQkgKiAgICAgaW5jbHVkZSBpdHMgY29udGV4dC4gUHJlZml4IHRoZSBjbGFzcydzIHNpbXBsZSBuYW1lIHdpdGggaXRzCi0JICogICAgIGVuY2xvc2luZyBjbGFzcydzICJEYWxpIHN0YW5kYXJkIiBuYW1lLgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRUb1N0cmluZ0NsYXNzTmFtZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWFwcGVuZFRvU3RyaW5nQ2xhc3NOYW1lKHNiLCBqYXZhQ2xhc3MpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgc3VpdGFibGUgZm9yIGEgPGVtPnNpbmdsZXRvbjwvZW0+OyB3aGljaCBpcyB0aGUgc2ltcGxlCi0JICogbmFtZSBvZiB0aGUgb2JqZWN0J3MgY2xhc3MsIHNpbmNlIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFNpbmdsZXRvblRvU3RyaW5nKE9iamVjdCBvKSB7Ci0JCXJldHVybiBidWlsZFRvU3RyaW5nQ2xhc3NOYW1lKG8uZ2V0Q2xhc3MoKSk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIGEgbmFtZSBzdWl0YWJsZSBmb3IgYSAiRGFsaSBzdGFuZGFyZCIKLQkgKiB7QGxpbmsgT2JqZWN0I3RvU3RyaW5nKCkgdG9TdHJpbmcoKX0gaW1wbGVtZW50YXRpb24gdG8gdGhlIHNwZWNpZmllZAotCSAqIHN0cmluZyBidWlsZGVyLgotCSAqIEBzZWUgI2J1aWxkVG9TdHJpbmdDbGFzc05hbWUoQ2xhc3MpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFwcGVuZFRvU3RyaW5nQ2xhc3NOYW1lKFN0cmluZ0J1aWxkZXIgc2IsIENsYXNzPD8+IGphdmFDbGFzcykgewotCQlpZiAoamF2YUNsYXNzLmlzQW5vbnltb3VzQ2xhc3MoKSkgewotCQkJYXBwZW5kVG9TdHJpbmdDbGFzc05hbWUoc2IsIGphdmFDbGFzcy5nZXRTdXBlcmNsYXNzKCkpOyAgLy8gcmVjdXJzZQotCQl9IGVsc2UgewotCQkJQ2xhc3M8Pz4gZW5jbG9zaW5nQ2xhc3MgPSBqYXZhQ2xhc3MuZ2V0RW5jbG9zaW5nQ2xhc3MoKTsKLQkJCWlmIChlbmNsb3NpbmdDbGFzcyA9PSBudWxsKSB7Ci0JCQkJYXBwZW5kVG9TdHJpbmdDbGFzc05hbWVfKHNiLCBqYXZhQ2xhc3MpOyAgLy8gdG9wLWxldmVsIGNsYXNzCi0JCQl9IGVsc2UgewotCQkJCWFwcGVuZFRvU3RyaW5nQ2xhc3NOYW1lKHNiLCBlbmNsb3NpbmdDbGFzcyk7ICAvLyByZWN1cnNlCi0JCQkJc2IuYXBwZW5kKCcuJyk7Ci0JCQkJc2IuYXBwZW5kKGphdmFDbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhIHRvcC1sZXZlbCBjbGFzcwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kVG9TdHJpbmdDbGFzc05hbWVfKFN0cmluZ0J1aWxkZXIgc2IsIENsYXNzPD8+IGphdmFDbGFzcykgewotCQlTdHJpbmcgZnVsbE5hbWUgPSBqYXZhQ2xhc3MuZ2V0TmFtZSgpOwotCQlpbnQgZG90ID0gZnVsbE5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGRvdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKGZ1bGxOYW1lKTsgIC8vICJkZWZhdWx0IiBwYWNrYWdlCi0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQoZnVsbE5hbWUsIGRvdCArIDEsIGZ1bGxOYW1lLmxlbmd0aCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgb2JqZWN0cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5Ci0JICogdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlcjo8cHJlPgotCSAqICAgICBbImZvbyIsICJiYXIiLCAiYmF6Il0KLQkgKiA8L3ByZT4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmdCdWlsZGVyLmFwcGVuZChPYmplY3RbXSkKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gU3RyaW5nIGFwcGVuZChTdHJpbmdCdWlsZGVyIHNiLCBUW10gYXJyYXkpIHsKLQkJcmV0dXJuIGFwcGVuZChzYiwgbmV3IEFycmF5TGlzdEl0ZXJhdG9yPFQ+KGFycmF5KSk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyOjxwcmU+Ci0JICogICAgIFsiZm9vIiwgImJhciIsICJiYXoiXQotCSAqIDwvcHJlPgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZ0J1aWxkZXIuYXBwZW5kKEl0ZXJhYmxlKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBTdHJpbmcgYXBwZW5kKFN0cmluZ0J1aWxkZXIgc2IsIEl0ZXJhYmxlPFQ+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBhcHBlbmQoc2IsIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgb2JqZWN0cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlcjo8cHJlPgotCSAqICAgICBbImZvbyIsICJiYXIiLCAiYmF6Il0KLQkgKiA8L3ByZT4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmdCdWlsZGVyLmFwcGVuZChJdGVyYXRvcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gU3RyaW5nIGFwcGVuZChTdHJpbmdCdWlsZGVyIHNiLCBJdGVyYXRvcjxUPiBpdGVyYXRvcikgewotCQlzYi5hcHBlbmQoJ1snKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJc2IuYXBwZW5kKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJc2IuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJc2IuYXBwZW5kKCddJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBjb25jYXRlbmF0aW9uIG9mIHRoZSBnaXZlbiBzdHJpbmdzCi0JICogCi0JICogQHBhcmFtIHN0cmluZ3MgLSB0aGUgc3RyaW5ncyB0byBjb25jYXRlbmF0ZQotCSAqIEByZXR1cm4gdGhlIHJlc3VsdGFudCBjb25jYXRlbmF0ZWQgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uY2F0ZW5hdGUoU3RyaW5nIC4uLiBzdHJpbmdzKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiBzdHJpbmdzKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyA8Y29kZT5udWxsPC9jb2RlPiwgZW1wdHksIG9yCi0JICogY29udGFpbnMgb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRW1wdHkoU3RyaW5nIHN0cmluZykgewotCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ0lzRW1wdHlfKHN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIDxjb2RlPm51bGw8L2NvZGU+LCBlbXB0eSwgb3IKLQkgKiBjb250YWlucyBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNFbXB0eShjaGFyW10gc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ0lzRW1wdHlfKHN0cmluZywgbGVuKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRW1wdHlfKGNoYXJbXSBzLCBpbnQgbGVuKSB7Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIENoYXJhY3Rlci5pc1doaXRlc3BhY2Uoc1tpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgbm9uLTxjb2RlPm51bGw8L2NvZGU+LCBub24tZW1wdHksCi0JICogYW5kIGRvZXMgbm90IGNvbnRhaW4gb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzTm90RW1wdHkoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gISBzdHJpbmdJc0VtcHR5KHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgbm9uLTxjb2RlPm51bGw8L2NvZGU+LCBub24tZW1wdHksCi0JICogYW5kIGRvZXMgbm90IGNvbnRhaW4gb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzTm90RW1wdHkoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gISBzdHJpbmdJc0VtcHR5KHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmdzIGFyZSBlcXVhbC4KLQkgKiBDaGVjayBmb3IgPGNvZGU+bnVsbDwvY29kZT5zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdzQXJlRXF1YWwoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHMxLCBzMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmdzIGFyZSBlcXVhbC4KLQkgKiBDaGVjayBmb3IgPGNvZGU+bnVsbDwvY29kZT5zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdzQXJlRXF1YWwoY2hhcltdIHMxLCBjaGFyW10gczIpIHsKLQkJcmV0dXJuIChzMSA9PSBudWxsKSA/Ci0JCQkJKHMyID09IG51bGwpIDoKLQkJCQkoKHMyICE9IG51bGwpICYmIHN0cmluZ3NBcmVFcXVhbF8oczEsIHMyKSk7Ci0JfQotCi0JLyoqCi0JICogbm8gPGNvZGU+bnVsbDwvY29kZT4gY2hlY2tzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdzQXJlRXF1YWxfKGNoYXJbXSBzMSwgY2hhcltdIHMyKSB7Ci0JCWludCBsZW4gPSBzMS5sZW5ndGg7Ci0JCWlmIChsZW4gIT0gczIubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoczFbaV0gIT0gczJbaV0pIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmdzIGFyZSBlcXVhbCwgaWdub3JpbmcgY2FzZS4KLQkgKiBDaGVjayBmb3IgPGNvZGU+bnVsbDwvY29kZT5zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCXJldHVybiAoczEgPT0gbnVsbCkgPwotCQkJCShzMiA9PSBudWxsKSA6Ci0JCQkJKChzMiAhPSBudWxsKSAmJiBzMS5lcXVhbHNJZ25vcmVDYXNlKHMyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmdzIGFyZSBlcXVhbCwgaWdub3JpbmcgY2FzZS4KLQkgKiBDaGVjayBmb3IgPGNvZGU+bnVsbDwvY29kZT5zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKGNoYXJbXSBzMSwgY2hhcltdIHMyKSB7Ci0JCXJldHVybiAoczEgPT0gbnVsbCkgPwotCQkJCShzMiA9PSBudWxsKSA6Ci0JCQkJKChzMiAhPSBudWxsKSAmJiBzdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlXyhzMSwgczIpKTsKLQl9Ci0KLQkvKioKLQkgKiBubyA8Y29kZT5udWxsPC9jb2RlPiBjaGVja3MKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2VfKGNoYXJbXSBzMSwgY2hhcltdIHMyKSB7Ci0JCWludCBsZW4gPSBzMS5sZW5ndGg7Ci0JCWlmIChsZW4gIT0gczIubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgY2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZShzMVtpXSwgczJbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LAotCSAqIGlnbm9yaW5nIGNhc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKGNoYXJbXSBzdHJpbmcsIGNoYXJbXSBwcmVmaXgpIHsKLQkJaW50IHByZWZpeExlbmd0aCA9IHByZWZpeC5sZW5ndGg7Ci0JCWlmIChzdHJpbmcubGVuZ3RoIDwgcHJlZml4TGVuZ3RoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IHByZWZpeExlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgY2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZShzdHJpbmdbaV0sIHByZWZpeFtpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsCi0JICogaWdub3JpbmcgY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoU3RyaW5nIHN0cmluZywgU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gc3RyaW5nLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgcHJlZml4LCAwLCBwcmVmaXgubGVuZ3RoKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVycyBhcmUgYXJlIGVxdWFsLCBpZ25vcmluZyBjYXNlLgotCSAqIEBzZWUgU3RyaW5nI3JlZ2lvbk1hdGNoZXMoYm9vbGVhbiwgaW50LCBTdHJpbmcsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKGNoYXIgYzEsIGNoYXIgYzIpIHsKLQkJLy8gIHNvbWV0aGluZyBhYm91dCB0aGUgR2VvcmdpYW4gYWxwaGFiZXQgcmVxdWlyZXMgdXMgdG8gY2hlY2sgbG93ZXIgY2FzZSBhbHNvCi0JCXJldHVybiAoYzEgPT0gYzIpCi0JCQkJfHwgKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjMSkgPT0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMyKSkKLQkJCQl8fCAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMxKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYzIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyB1cHBlcmNhc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzVXBwZXJjYXNlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgPyBmYWxzZSA6IHN0cmluZ0lzVXBwZXJjYXNlXyhzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIHVwcGVyY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNVcHBlcmNhc2UoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gKHN0cmluZy5sZW5ndGggPT0gMCkgPyBmYWxzZSA6IHN0cmluZ0lzVXBwZXJjYXNlXyhuZXcgU3RyaW5nKHN0cmluZykpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNVcHBlcmNhc2VfKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZy5lcXVhbHMoc3RyaW5nLnRvVXBwZXJDYXNlKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGxvd2VyY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNMb3dlcmNhc2UoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gKHN0cmluZy5sZW5ndGgoKSA9PSAwKSA/IGZhbHNlIDogc3RyaW5nSXNMb3dlcmNhc2VfKHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgbG93ZXJjYXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0xvd2VyY2FzZShjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiAoc3RyaW5nLmxlbmd0aCA9PSAwKSA/IGZhbHNlIDogc3RyaW5nSXNMb3dlcmNhc2VfKG5ldyBTdHJpbmcoc3RyaW5nKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0xvd2VyY2FzZV8oU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nLmVxdWFscyhzdHJpbmcudG9Mb3dlckNhc2UoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnQgY2FtZWwgY2FzZSB0byBhbGwgY2FwcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKFN0cmluZyBjYW1lbENhc2VTdHJpbmcpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gY2FtZWxDYXNlU3RyaW5nOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNfKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIGNhbWVsQ2FzZVN0cmluZzsKLQkJfQotCQlyZXR1cm4gY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc18oY2FtZWxDYXNlU3RyaW5nLCBsZW4pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzXyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbGVuKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW4gKiAyKTsKLQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcsIGxlbiwgc2IpOwotCQlyZXR1cm4gY29udmVydFRvQ2hhckFycmF5KHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBsZW4sIFN0cmluZ0J1ZmZlciBzYikgewotCQljaGFyIHByZXYgPSAwOwkvLyBhc3N1bWUgMCBpcyBub3QgYSB2YWxpZCBjaGFyCi0JCWNoYXIgYyA9IDA7Ci0JCWNoYXIgbmV4dCA9IGNhbWVsQ2FzZVN0cmluZ1swXTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbGVuOyBpKyspIHsJLy8gTkI6IHN0YXJ0IGF0IDEgYW5kIGVuZCBhdCBsZW4hCi0JCQljID0gbmV4dDsKLQkJCW5leHQgPSAoKGkgPT0gbGVuKSA/IDAgOiBjYW1lbENhc2VTdHJpbmdbaV0pOwotCQkJaWYgKGNhbWVsQ2FzZVdvcmRCcmVha18ocHJldiwgYywgbmV4dCkpIHsKLQkJCQlzYi5hcHBlbmQoJ18nKTsKLQkJCX0KLQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotCQkJcHJldiA9IGM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZywgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IGxlbiwgU3RyaW5nQnVpbGRlciBzYikgewotCQljaGFyIHByZXYgPSAwOwkvLyBhc3N1bWUgMCBpcyBub3QgYSB2YWxpZCBjaGFyCi0JCWNoYXIgYyA9IDA7Ci0JCWNoYXIgbmV4dCA9IGNhbWVsQ2FzZVN0cmluZ1swXTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbGVuOyBpKyspIHsJLy8gTkI6IHN0YXJ0IGF0IDEgYW5kIGVuZCBhdCBsZW4hCi0JCQljID0gbmV4dDsKLQkJCW5leHQgPSAoKGkgPT0gbGVuKSA/IDAgOiBjYW1lbENhc2VTdHJpbmdbaV0pOwotCQkJaWYgKGNhbWVsQ2FzZVdvcmRCcmVha18ocHJldiwgYywgbmV4dCkpIHsKLQkJCQlzYi5hcHBlbmQoJ18nKTsKLQkJCX0KLQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotCQkJcHJldiA9IGM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4sIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcsIGxlbiwgd3JpdGVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbGVuLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWNoYXIgcHJldiA9IDA7CS8vIGFzc3VtZSAwIGlzIG5vdCBhIHZhbGlkIGNoYXIKLQkJY2hhciBjID0gMDsKLQkJY2hhciBuZXh0ID0gY2FtZWxDYXNlU3RyaW5nWzBdOwotCQlmb3IgKGludCBpID0gMTsgaSA8PSBsZW47IGkrKykgewkvLyBOQjogc3RhcnQgYXQgMSBhbmQgZW5kIGF0IGxlbiEKLQkJCWMgPSBuZXh0OwotCQkJbmV4dCA9ICgoaSA9PSBsZW4pID8gMCA6IGNhbWVsQ2FzZVN0cmluZ1tpXSk7Ci0JCQlpZiAoY2FtZWxDYXNlV29yZEJyZWFrXyhwcmV2LCBjLCBuZXh0KSkgewotCQkJCXdyaXRlQ2hhck9uKCdfJywgd3JpdGVyKTsKLQkJCX0KLQkJCXdyaXRlQ2hhck9uKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSwgd3JpdGVyKTsKLQkJCXByZXYgPSBjOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKG1heExlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGNhbWVsQ2FzZVN0cmluZzsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyhjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzXyhjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgbWF4TGVuZ3RoLCBsZW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCkgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKG1heExlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGNhbWVsQ2FzZVN0cmluZzsKLQkJfQotCQlyZXR1cm4gY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc18oY2FtZWxDYXNlU3RyaW5nLCBtYXhMZW5ndGgsIGxlbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNfKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIGludCBsZW4pIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKG1heExlbmd0aCk7Ci0JCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLCBtYXhMZW5ndGgsIGxlbiwgc2IpOwotCQlyZXR1cm4gY29udmVydFRvQ2hhckFycmF5KHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oU3RyaW5nIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmICgobGVuICE9IDApICYmIChtYXhMZW5ndGggIT0gMCkpIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLnRvQ2hhckFycmF5KCksIG1heExlbmd0aCwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAoKGxlbiAhPSAwKSAmJiAobWF4TGVuZ3RoICE9IDApKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZywgbWF4TGVuZ3RoLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoLCBpbnQgbGVuLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJY2hhciBwcmV2ID0gMDsJLy8gYXNzdW1lIDAgaXMgbm90IGEgdmFsaWQgY2hhcgotCQljaGFyIGMgPSAwOwotCQljaGFyIG5leHQgPSBjYW1lbENhc2VTdHJpbmdbMF07Ci0JCWZvciAoaW50IGkgPSAxOyBpIDw9IGxlbjsgaSsrKSB7CS8vIE5COiBzdGFydCBhdCAxIGFuZCBlbmQgYXQgbGVuIQotCQkJYyA9IG5leHQ7Ci0JCQluZXh0ID0gKChpID09IGxlbikgPyAwIDogY2FtZWxDYXNlU3RyaW5nW2ldKTsKLQkJCWlmIChjYW1lbENhc2VXb3JkQnJlYWtfKHByZXYsIGMsIG5leHQpKSB7Ci0JCQkJc2IuYXBwZW5kKCdfJyk7Ci0JCQkJaWYgKHNiLmxlbmd0aCgpID09IG1heExlbmd0aCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJc2IuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSk7Ci0JCQlpZiAoc2IubGVuZ3RoKCkgPT0gbWF4TGVuZ3RoKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJcHJldiA9IGM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oU3RyaW5nIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoKGxlbiAhPSAwKSAmJiAobWF4TGVuZ3RoICE9IDApKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBtYXhMZW5ndGgsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGg7Ci0JCWlmICgobGVuICE9IDApICYmIChtYXhMZW5ndGggIT0gMCkpIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLCBtYXhMZW5ndGgsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIGludCBsZW4sIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJY2hhciBwcmV2ID0gMDsJLy8gYXNzdW1lIDAgaXMgbm90IGEgdmFsaWQgY2hhcgotCQljaGFyIGMgPSAwOwotCQljaGFyIG5leHQgPSBjYW1lbENhc2VTdHJpbmdbMF07Ci0JCWZvciAoaW50IGkgPSAxOyBpIDw9IGxlbjsgaSsrKSB7CS8vIE5COiBzdGFydCBhdCAxIGFuZCBlbmQgYXQgbGVuIQotCQkJYyA9IG5leHQ7Ci0JCQluZXh0ID0gKChpID09IGxlbikgPyAwIDogY2FtZWxDYXNlU3RyaW5nW2ldKTsKLQkJCWlmIChjYW1lbENhc2VXb3JkQnJlYWtfKHByZXYsIGMsIG5leHQpKSB7Ci0JCQkJc2IuYXBwZW5kKCdfJyk7Ci0JCQkJaWYgKHNiLmxlbmd0aCgpID09IG1heExlbmd0aCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJc2IuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSk7Ci0JCQlpZiAoc2IubGVuZ3RoKCkgPT0gbWF4TGVuZ3RoKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJcHJldiA9IGM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oU3RyaW5nIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoKGxlbiAhPSAwKSAmJiAobWF4TGVuZ3RoICE9IDApKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBtYXhMZW5ndGgsIGxlbiwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqIExpbWl0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBsZW5ndGguCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAoKGxlbiAhPSAwKSAmJiAobWF4TGVuZ3RoICE9IDApKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZywgbWF4TGVuZ3RoLCBsZW4sIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgaW50IGxlbiwgV3JpdGVyIHdyaXRlcikgewotCQljaGFyIHByZXYgPSAwOwkvLyBhc3N1bWUgMCBpcyBub3QgYSB2YWxpZCBjaGFyCi0JCWNoYXIgYyA9IDA7Ci0JCWNoYXIgbmV4dCA9IGNhbWVsQ2FzZVN0cmluZ1swXTsKLQkJaW50IHdyaXRlckxlbmd0aCA9IDA7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDw9IGxlbjsgaSsrKSB7CS8vIE5COiBzdGFydCBhdCAxIGFuZCBlbmQgYXQgbGVuIQotCQkJYyA9IG5leHQ7Ci0JCQluZXh0ID0gKChpID09IGxlbikgPyAwIDogY2FtZWxDYXNlU3RyaW5nW2ldKTsKLQkJCWlmIChjYW1lbENhc2VXb3JkQnJlYWtfKHByZXYsIGMsIG5leHQpKSB7Ci0JCQkJd3JpdGVDaGFyT24oJ18nLCB3cml0ZXIpOwotCQkJCWlmICgrK3dyaXRlckxlbmd0aCA9PSBtYXhMZW5ndGgpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXdyaXRlQ2hhck9uKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSwgd3JpdGVyKTsKLQkJCWlmICgrK3dyaXRlckxlbmd0aCA9PSBtYXhMZW5ndGgpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlwcmV2ID0gYzsKLQkJfQotCX0KLQotCS8qCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzZXJpZXMgb2YgY2hhcmFjdGVycyBvY2N1ciBhdAotCSAqIGEgImNhbWVsIGNhc2UiIHdvcmsgYnJlYWs6Ci0JICogICAgICIqYWEiIC0+IGZhbHNlCi0JICogICAgICIqQUEiIC0+IGZhbHNlCi0JICogICAgICIqQWEiIC0+IGZhbHNlCi0JICogICAgICJBYUEiIC0+IGZhbHNlCi0JICogICAgICJBQUEiIC0+IGZhbHNlCi0JICogICAgICJhYSoiIC0+IGZhbHNlCi0JICogICAgICJBYUEiIC0+IGZhbHNlCi0JICogICAgICJhQWEiIC0+IHRydWUKLQkgKiAgICAgIkFBKiIgLT4gZmFsc2UKLQkgKiAgICAgIkFBYSIgLT4gdHJ1ZQotCSAqIHdoZXJlICcqJyA9PSBhbnkgY2hhcgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2FtZWxDYXNlV29yZEJyZWFrXyhjaGFyIHByZXYsIGNoYXIgYywgY2hhciBuZXh0KSB7Ci0JCWlmIChwcmV2ID09IDApIHsJLy8gc3RhcnQgb2Ygc3RyaW5nCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UocHJldikpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChuZXh0ID09IDApIHsJLy8gZW5kIG9mIHN0cmluZwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNMb3dlckNhc2UobmV4dCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnQgdW5kZXJzY29yZXMgdG8gY2FtZWwgY2FzZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJMYXJnZVByb2plY3QiCi0JICogQ2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKFN0cmluZyB1bmRlcnNjb3JlU3RyaW5nKSB7Ci0JCXJldHVybiBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSh1bmRlcnNjb3JlU3RyaW5nLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJMYXJnZVByb2plY3QiCi0JICogQ2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nKSB7Ci0JCXJldHVybiBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSh1bmRlcnNjb3JlU3RyaW5nLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJsYXJnZVByb2plY3QiCi0JICogT3B0aW9uYWxseSBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoU3RyaW5nIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKSB7Ci0JCWludCBsZW4gPSB1bmRlcnNjb3JlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiB1bmRlcnNjb3JlU3RyaW5nOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlXyh1bmRlcnNjb3JlU3RyaW5nLnRvQ2hhckFycmF5KCksIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJ1bmRlcnNjb3JlIiBzdHJpbmcgdG8gYSAiY2FtZWwgY2FzZSIgc3RyaW5nOgotCSAqICJMQVJHRV9QUk9KRUNUIiAtPiAibGFyZ2VQcm9qZWN0IgotCSAqIE9wdGlvbmFsbHkgY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlcikgewotCQlpbnQgbGVuID0gdW5kZXJzY29yZVN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIHVuZGVyc2NvcmVTdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlXyh1bmRlcnNjb3JlU3RyaW5nLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGxlbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlXyhjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGludCBsZW4pIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbik7Ci0JCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCBzYik7Ci0JCXJldHVybiBjb252ZXJ0VG9DaGFyQXJyYXkoc2IpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihTdHJpbmcgdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gdW5kZXJzY29yZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyh1bmRlcnNjb3JlU3RyaW5nLnRvQ2hhckFycmF5KCksIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJsYXJnZVByb2plY3QiCi0JICogT3B0aW9uYWxseSBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT24oY2hhcltdIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgaW50IGxlbiwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWNoYXIgcHJldiA9IDA7Ci0JCWNoYXIgYyA9IDA7Ci0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlwcmV2ID0gYzsKLQkJCWMgPSB1bmRlcnNjb3JlU3RyaW5nW2ldOwotCQkJaWYgKGMgPT0gJ18nKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoZmlyc3QpIHsKLQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCXNiLmFwcGVuZChjYXBpdGFsaXplRmlyc3RMZXR0ZXIgPyBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykgOiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYykpOwotCQkJfSBlbHNlIHsKLQkJCQlzYi5hcHBlbmQoKHByZXYgPT0gJ18nKSA/IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSA6IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJsYXJnZVByb2plY3QiCi0JICogT3B0aW9uYWxseSBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT24oU3RyaW5nIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSB1bmRlcnNjb3JlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcudG9DaGFyQXJyYXkoKSwgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgaW50IGxlbiwgU3RyaW5nQnVpbGRlciBzYikgewotCQljaGFyIHByZXYgPSAwOwotCQljaGFyIGMgPSAwOwotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJcHJldiA9IGM7Ci0JCQljID0gdW5kZXJzY29yZVN0cmluZ1tpXTsKLQkJCWlmIChjID09ICdfJykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGZpcnN0KSB7Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQlzYi5hcHBlbmQoY2FwaXRhbGl6ZUZpcnN0TGV0dGVyID8gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpIDogQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2IuYXBwZW5kKChwcmV2ID09ICdfJykgPyBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykgOiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYykpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJ1bmRlcnNjb3JlIiBzdHJpbmcgdG8gYSAiY2FtZWwgY2FzZSIgc3RyaW5nOgotCSAqICJMQVJHRV9QUk9KRUNUIiAtPiAibGFyZ2VQcm9qZWN0IgotCSAqIE9wdGlvbmFsbHkgY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uKFN0cmluZyB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGVuID0gdW5kZXJzY29yZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyh1bmRlcnNjb3JlU3RyaW5nLnRvQ2hhckFycmF5KCksIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJ1bmRlcnNjb3JlIiBzdHJpbmcgdG8gYSAiY2FtZWwgY2FzZSIgc3RyaW5nOgotCSAqICJMQVJHRV9QUk9KRUNUIiAtPiAibGFyZ2VQcm9qZWN0IgotCSAqIE9wdGlvbmFsbHkgY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGVuID0gdW5kZXJzY29yZVN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbl8odW5kZXJzY29yZVN0cmluZywgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBsZW4sIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgaW50IGxlbiwgV3JpdGVyIHdyaXRlcikgewotCQljaGFyIHByZXYgPSAwOwotCQljaGFyIGMgPSAwOwotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJcHJldiA9IGM7Ci0JCQljID0gdW5kZXJzY29yZVN0cmluZ1tpXTsKLQkJCWlmIChjID09ICdfJykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGZpcnN0KSB7Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQl3cml0ZUNoYXJPbihjYXBpdGFsaXplRmlyc3RMZXR0ZXIgPyBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykgOiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYyksIHdyaXRlcik7Ci0JCQl9IGVsc2UgewotCQkJCXdyaXRlQ2hhck9uKChwcmV2ID09ICdfJykgPyBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykgOiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYyksIHdyaXRlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydCB0byBKYXZhIHN0cmluZyBsaXRlcmFsICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX0pBVkFfU1RSSU5HX0xJVEVSQUwgPSAiXCJcIiI7ICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTF9DSEFSX0FSUkFZID0gRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTC50b0NoYXJBcnJheSgpOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoU3RyaW5nIHN0cmluZykgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMOwotCQl9Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW4gKyA1KTsKLQkJY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNiLCBsZW4pOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbChjaGFyW10gc3RyaW5nKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMX0NIQVJfQVJSQVk7Ci0JCX0KLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbiArIDUpOwotCQljb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhzdHJpbmcsIHNiLCBsZW4pOwotCQlsZW4gPSBzYi5sZW5ndGgoKTsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbl07Ci0JCXNiLmdldENoYXJzKDAsIGxlbiwgcmVzdWx0LCAwKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPFN0cmluZz4gY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxzKEl0ZXJhYmxlPFN0cmluZz4gc3RyaW5ncykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8U3RyaW5nLCBTdHJpbmc+KHN0cmluZ3MsIFNUUklOR19UT19KQVZBX1NUUklOR19MSVRFUkFMX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxzKEl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHN0cmluZ3MsIFNUUklOR19UT19KQVZBX1NUUklOR19MSVRFUkFMX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4gU1RSSU5HX1RPX0pBVkFfU1RSSU5HX0xJVEVSQUxfVFJBTlNGT1JNRVIgPSBuZXcgVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+KCkgewotCQlwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShTdHJpbmcgc3RyaW5nKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoc3RyaW5nKTsKLQkJfQotCX07Ci0KLQkvLyBjYW5ub3QgbmFtZSBtZXRob2Qgc2ltcGx5ICdjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHMnIGJlY2F1c2Ugb2YgdHlwZS1lcmFzdXJlLi4uCi0JcHVibGljIHN0YXRpYyBJdGVyYWJsZTxjaGFyW10+IGNvbnZlcnRUb0phdmFDaGFyQXJyYXlMaXRlcmFscyhJdGVyYWJsZTxjaGFyW10+IHN0cmluZ3MpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPGNoYXJbXSwgY2hhcltdPihzdHJpbmdzLCBDSEFSX0FSUkFZX1RPX0pBVkFfU1RSSU5HX0xJVEVSQUxfVFJBTlNGT1JNRVIpOwotCX0KLQotCS8vIGNhbm5vdCBuYW1lIG1ldGhvZCBzaW1wbHkgJ2NvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscycgYmVjYXVzZSBvZiB0eXBlLWVyYXN1cmUuLi4KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPGNoYXJbXT4gY29udmVydFRvSmF2YUNoYXJBcnJheUxpdGVyYWxzKEl0ZXJhdG9yPGNoYXJbXT4gc3RyaW5ncykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8Y2hhcltdLCBjaGFyW10+KHN0cmluZ3MsIENIQVJfQVJSQVlfVE9fSkFWQV9TVFJJTkdfTElURVJBTF9UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXI8Y2hhcltdLCBjaGFyW10+IENIQVJfQVJSQVlfVE9fSkFWQV9TVFJJTkdfTElURVJBTF9UUkFOU0ZPUk1FUiA9IG5ldyBUcmFuc2Zvcm1lcjxjaGFyW10sIGNoYXJbXT4oKSB7Ci0JCXB1YmxpYyBjaGFyW10gdHJhbnNmb3JtKGNoYXJbXSBzdHJpbmcpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbChzdHJpbmcpOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuID09IDApIHsKLQkJCXNiLmFwcGVuZChFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMKTsKLQkJfSBlbHNlIHsKLQkJCWNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBzYiwgbGVuKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlzYi5hcHBlbmQoRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTCk7Ci0JCX0gZWxzZSB7Ci0JCQljb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhzdHJpbmcsIHNiLCBsZW4pOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBubyBsZW5ndGggY2hlY2tzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IsIGludCBsZW4pIHsKLQkJc2IuZW5zdXJlQ2FwYWNpdHkoc2IubGVuZ3RoKCkgKyBsZW4gKyA1KTsKLQkJc2IuYXBwZW5kKFFVT1RFKTsKLQkJZm9yIChjaGFyIGMgOiBzdHJpbmcpIHsKLQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJ1xiJzogIC8vIGJhY2tzcGFjZQotCQkJCQlzYi5hcHBlbmQoIlxcYiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcdCc6ICAvLyBob3Jpem9udGFsIHRhYgotCQkJCQlzYi5hcHBlbmQoIlxcdCIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcbic6ICAvLyBsaW5lLWZlZWQgTEYKLQkJCQkJc2IuYXBwZW5kKCJcXG4iKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXGYnOiAgLy8gZm9ybS1mZWVkIEZGCi0JCQkJCXNiLmFwcGVuZCgiXFxmIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xyJzogIC8vIGNhcnJpYWdlLXJldHVybiBDUgotCQkJCQlzYi5hcHBlbmQoIlxcciIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICciJzogIC8vIGRvdWJsZS1xdW90ZQotCQkJCQlzYi5hcHBlbmQoIlxcXCIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0vLwkJCQljYXNlICdcJyc6ICAvLyBzaW5nbGUtcXVvdGUKLS8vCQkJCQlzYi5hcHBlbmQoIlxcJyIpOyAgLy8kTk9OLU5MUy0xJAotLy8JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xcJzogIC8vIGJhY2tzbGFzaAotCQkJCQlzYi5hcHBlbmQoIlxcXFwiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJc2IuYXBwZW5kKGMpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlzYi5hcHBlbmQoUVVPVEUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlzYi5hcHBlbmQoRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTCk7Ci0JCX0gZWxzZSB7Ci0JCQljb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2IsIGxlbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXNiLmFwcGVuZChFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMKTsKLQkJfSBlbHNlIHsKLQkJCWNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25fKHN0cmluZywgc2IsIGxlbik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIG5vIGxlbmd0aCBjaGVja3MKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25fKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IsIGludCBsZW4pIHsKLQkJc2IuZW5zdXJlQ2FwYWNpdHkoc2IubGVuZ3RoKCkgKyBsZW4gKyA1KTsKLQkJc2IuYXBwZW5kKFFVT1RFKTsKLQkJZm9yIChjaGFyIGMgOiBzdHJpbmcpIHsKLQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJ1xiJzogIC8vIGJhY2tzcGFjZQotCQkJCQlzYi5hcHBlbmQoIlxcYiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcdCc6ICAvLyBob3Jpem9udGFsIHRhYgotCQkJCQlzYi5hcHBlbmQoIlxcdCIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcbic6ICAvLyBsaW5lLWZlZWQgTEYKLQkJCQkJc2IuYXBwZW5kKCJcXG4iKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXGYnOiAgLy8gZm9ybS1mZWVkIEZGCi0JCQkJCXNiLmFwcGVuZCgiXFxmIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xyJzogIC8vIGNhcnJpYWdlLXJldHVybiBDUgotCQkJCQlzYi5hcHBlbmQoIlxcciIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICciJzogIC8vIGRvdWJsZS1xdW90ZQotCQkJCQlzYi5hcHBlbmQoIlxcXCIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0vLwkJCQljYXNlICdcJyc6ICAvLyBzaW5nbGUtcXVvdGUKLS8vCQkJCQlzYi5hcHBlbmQoIlxcJyIpOyAgLy8kTk9OLU5MUy0xJAotLy8JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xcJzogIC8vIGJhY2tzbGFzaAotCQkJCQlzYi5hcHBlbmQoIlxcXFwiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJc2IuYXBwZW5kKGMpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlzYi5hcHBlbmQoUVVPVEUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKFN0cmluZyBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl3cml0ZVN0cmluZ09uKEVNUFRZX0pBVkFfU1RSSU5HX0xJVEVSQUwsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQljb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgd3JpdGVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKGNoYXJbXSBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGggPT0gMCkgewotCQkJd3JpdGVTdHJpbmdPbihFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oc3RyaW5nLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBubyBsZW5ndGggY2hlY2tzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlQ2hhck9uKFFVT1RFLCB3cml0ZXIpOwotCQlmb3IgKGNoYXIgYyA6IHN0cmluZykgewotCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSAnXGInOiAgLy8gYmFja3NwYWNlCi0JCQkJCXdyaXRlU3RyaW5nT24oIlxcYiIsIHdyaXRlcik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1x0JzogIC8vIGhvcml6b250YWwgdGFiCi0JCQkJCXdyaXRlU3RyaW5nT24oIlxcdCIsIHdyaXRlcik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xuJzogIC8vIGxpbmUtZmVlZCBMRgotCQkJCQl3cml0ZVN0cmluZ09uKCJcXG4iLCB3cml0ZXIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcZic6ICAvLyBmb3JtLWZlZWQgRkYKLQkJCQkJd3JpdGVTdHJpbmdPbigiXFxmIiwgd3JpdGVyKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXHInOiAgLy8gY2FycmlhZ2UtcmV0dXJuIENSCi0JCQkJCXdyaXRlU3RyaW5nT24oIlxcciIsIHdyaXRlcik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyInOiAgLy8gZG91YmxlLXF1b3RlCi0JCQkJCXdyaXRlU3RyaW5nT24oIlxcXCIiLCB3cml0ZXIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLS8vCQkJCWNhc2UgJ1wnJzogIC8vIHNpbmdsZS1xdW90ZQotLy8JCQkJCXdyaXRlU3RyaW5nT24oIlxcJyIsIHdyaXRlcik7ICAvLyROT04tTkxTLTEkCi0vLwkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXFwnOiAgLy8gYmFja3NsYXNoCi0JCQkJCXdyaXRlU3RyaW5nT24oIlxcXFwiLCB3cml0ZXIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQl3cml0ZUNoYXJPbihjLCB3cml0ZXIpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQl3cml0ZUNoYXJPbihRVU9URSwgd3JpdGVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnZlcnQgdG8gWE1MIHN0cmluZyBsaXRlcmFsICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1htbFN0cmluZ0xpdGVyYWwoU3RyaW5nIHN0cmluZykgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMOwotCQl9Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW4gKyA1KTsKLQkJY29udmVydFRvWG1sU3RyaW5nTGl0ZXJhbE9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2IsIGxlbik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8vVE9ETyBuZWVkIHRvIGFkZCB0aGUgcmVzdCBvZiB0aGUgcHJlZGlmZW5kZSBlbnRpdGllcyB0byB0aGlzIHN3aXRjaCAoYW1wLCBhcG9zLCBsdCwgYW5kIGd0KQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydFRvWG1sU3RyaW5nTGl0ZXJhbE9uXyhjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiLCBpbnQgbGVuKSB7Ci0JCXNiLmVuc3VyZUNhcGFjaXR5KHNiLmxlbmd0aCgpICsgbGVuICsgNSk7Ci0JCXNiLmFwcGVuZChRVU9URSk7Ci0JCWZvciAoY2hhciBjIDogc3RyaW5nKSB7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCQljYXNlICciJzogIC8vIGRvdWJsZS1xdW90ZQotCQkJCQlzYi5hcHBlbmQoWE1MX1FVT1RFKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7CQkJCQkKLQkJCQlkZWZhdWx0OgotCQkJCQlzYi5hcHBlbmQoYyk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXNiLmFwcGVuZChRVU9URSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydFRvQ2hhckFycmF5KFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gc2IubGVuZ3RoKCk7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5dOwotCQlzYi5nZXRDaGFycygwLCBsZW4sIHJlc3VsdCwgMCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydFRvQ2hhckFycmF5KFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IHNiLmxlbmd0aCgpOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuXTsKLQkJc2IuZ2V0Q2hhcnMoMCwgbGVuLCByZXN1bHQsIDApOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTdHJpbmdPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIud3JpdGUoc3RyaW5nKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTdHJpbmdPbihjaGFyW10gc3RyaW5nLCBjaGFyIGVzY2FwZSwgV3JpdGVyIHdyaXRlcikgewotCQl0cnkgewotCQkJZm9yIChjaGFyIGMgOiBzdHJpbmcpIHsKLQkJCQlpZiAoYyA9PSBlc2NhcGUpIHsKLQkJCQkJd3JpdGVyLndyaXRlKGMpOwotCQkJCX0KLQkJCQl3cml0ZXIud3JpdGUoYyk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlU3RyaW5nT24oY2hhcltdIHN0cmluZywgaW50IG9mZiwgaW50IGxlbiwgV3JpdGVyIHdyaXRlcikgewotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKHN0cmluZywgb2ZmLCBsZW4pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVN0cmluZ09uKFN0cmluZyBzdHJpbmcsIGludCBvZmYsIGludCBsZW4sIFdyaXRlciB3cml0ZXIpIHsKLQkJdHJ5IHsKLQkJCXdyaXRlci53cml0ZShzdHJpbmcsIG9mZiwgbGVuKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTdHJpbmdPbihTdHJpbmcgc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIud3JpdGUoc3RyaW5nKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVDaGFyT24oY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIud3JpdGUoYyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgU3RyaW5nVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZEJhZy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkQmFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViY2NlMzguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkQmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogVGhyZWFkLXNhZmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBCYWd9IGludGVyZmFjZS4KLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZEJhZzxFPgotCWltcGxlbWVudHMgQmFnPEU+LCBTZXJpYWxpemFibGUKLXsKLQkvKiogQmFja2luZyBiYWcuICovCi0JcHJpdmF0ZSBmaW5hbCBCYWc8RT4gYmFnOwotCi0JLyoqIE9iamVjdCB0byBzeW5jaHJvbml6ZSBvbi4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBtdXRleDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzeW5jaHJvbml6ZWQgYmFnIHRoYXQgd3JhcHMgdGhlCi0JICogc3BlY2lmaWVkIGJhZyBhbmQgbG9ja3Mgb24gdGhlIHNwZWNpZmllZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkQmFnKEJhZzxFPiBiYWcsIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQlpZiAoYmFnID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuYmFnID0gYmFnOwotCQl0aGlzLm11dGV4ID0gbXV0ZXg7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3luY2hyb25pemVkIGJhZyB0aGF0IHdyYXBzIHRoZQotCSAqIHNwZWNpZmllZCBiYWcgYW5kIGxvY2tzIG9uIGl0c2VsZi4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkQmFnKEJhZzxFPiBiYWcpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGJhZyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmJhZyA9IGJhZzsKLQkJdGhpcy5tdXRleCA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3luY2hyb25pemVkIGJhZyB0aGF0IGxvY2tzIG9uIHRoZSBzcGVjaWZpZWQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEJhZyhPYmplY3QgbXV0ZXgpIHsKLQkJdGhpcyhuZXcgSGFzaEJhZzxFPigpLCBtdXRleCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3luY2hyb25pemVkIGJhZyB0aGF0IGxvY2tzIG9uIGl0c2VsZi4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkQmFnKCkgewotCQl0aGlzKG5ldyBIYXNoQmFnPEU+KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCYWcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbywgaW50IGNvdW50KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLmFkZChvLCBjb3VudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGNvdW50KE9iamVjdCBvKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLmNvdW50KG8pOwotCQl9Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEJhZy5FbnRyeTxFPj4gZW50cmllcygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcuZW50cmllcygpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvLCBpbnQgY291bnQpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcucmVtb3ZlKG8sIGNvdW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgdW5pcXVlQ291bnQoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLnVuaXF1ZUNvdW50KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gdW5pcXVlSXRlcmF0b3IoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBlKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLmFkZChlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLmFkZEFsbChjKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMuYmFnLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5jb250YWlucyhvKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5jb250YWluc0FsbChjKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLmlzRW1wdHkoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5yZW1vdmUobyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLnJlbW92ZUFsbChjKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcucmV0YWluQWxsKGMpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5zaXplKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcudG9BcnJheSgpOwotCQl9Ci0JfQotCi0JcHVibGljIDxUPiBUW10gdG9BcnJheShUW10gYSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy50b0FycmF5KGEpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkZGl0aW9uYWwgcHVibGljIHByb3RvY29sICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgb2JqZWN0IHRoZSBzdGFjayBsb2NrcyBvbiB3aGlsZSBwZXJmb3JtaW5nCi0JICogaXRzIG9wZXJhdGlvbnMuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNdXRleCgpIHsKLQkJcmV0dXJuIHRoaXMubXV0ZXg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkQm9vbGVhbi5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkQm9vbGVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGJjMjhkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZEJvb2xlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkludGVycnVwdGlibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkludGVycnVwdGlibGVDb21tYW5kRXhlY3V0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzeW5jaHJvbml6ZWQgYWNjZXNzIHRvIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCi0gKiBJdCBhbHNvIHByb3ZpZGVzIHByb3RvY29sIGZvciBzdXNwZW5kaW5nIGEgdGhyZWFkIHVudGlsIHRoZQotICogPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IG9yIDxjb2RlPmZhbHNlPC9jb2RlPiwKLSAqIHdpdGggb3B0aW9uYWwgdGltZS1vdXRzLgotICogCi0gKiBAc2VlIFNpbXBsZUJvb2xlYW5SZWZlcmVuY2UKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZEJvb2xlYW4KLQlpbXBsZW1lbnRzIEludGVycnVwdGlibGVDb21tYW5kRXhlY3V0b3IsIE1vZGlmaWFibGVCb29sZWFuUmVmZXJlbmNlLCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBCYWNraW5nIDxjb2RlPmJvb2xlYW48L2NvZGU+LiAqLwotCXByaXZhdGUgYm9vbGVhbiB2YWx1ZTsKLQotCS8qKiBPYmplY3QgdG8gc3luY2hyb25pemUgb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbXV0ZXg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3luY2hyb25pemVkIDxjb2RlPmJvb2xlYW48L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZAotCSAqIGluaXRpYWwgdmFsdWUgYW5kIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRCb29sZWFuKGJvb2xlYW4gdmFsdWUsIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubXV0ZXggPSBtdXRleDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgPGNvZGU+Ym9vbGVhbjwvY29kZT4gd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZS4KLQkgKiBUaGUgc3luY2hyb25pemVkIDxjb2RlPmJvb2xlYW48L2NvZGU+IGl0c2VsZiB3aWxsIGJlIHRoZSBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkQm9vbGVhbihib29sZWFuIHZhbHVlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5tdXRleCA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3luY2hyb25pemVkIDxjb2RlPmJvb2xlYW48L2NvZGU+Ci0JICogd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGFuZCBzcGVjaWZpZWQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEJvb2xlYW4oT2JqZWN0IG11dGV4KSB7Ci0JCXRoaXMoZmFsc2UsIG11dGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgPGNvZGU+Ym9vbGVhbjwvY29kZT4KLQkgKiB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIFRoZSBzeW5jaHJvbml6ZWQgPGNvZGU+Ym9vbGVhbjwvY29kZT4gaXRzZWxmIHdpbGwgYmUgdGhlIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRCb29sZWFuKCkgewotCQl0aGlzKGZhbHNlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGdldFZhbHVlKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXMoYm9vbGVhbiBiKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgPT0gYjsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTm90KGJvb2xlYW4gYikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlICE9IGI7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1RydWUoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhbHNlKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiAhIHRoaXMudmFsdWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcgdGhyZWFkcyBhcmUgbm90aWZpZWQuCi0JICogUmV0dXJuIHRoZSA8ZW0+b2xkPC9lbT4gdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2V0VmFsdWUoYm9vbGVhbiB2YWx1ZSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiAodmFsdWUgPT0gdGhpcy52YWx1ZSkgPyB2YWx1ZSA6ICEgdGhpcy5zZXRDaGFuZ2VkVmFsdWVfKHZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZDsgbmV3IHZhbHVlIGlzIGRpZmZlcmVudAotCSAqIDxicj4KLQkgKiBSZXR1cm4gdGhlIDxlbT5uZXc8L2VtPiB2YWx1ZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2V0Q2hhbmdlZFZhbHVlXyhib29sZWFuIHYpIHsKLQkJdGhpcy52YWx1ZSA9IHY7Ci0JCXRoaXMubXV0ZXgubm90aWZ5QWxsKCk7Ci0JCXJldHVybiB2OwotCX0KLQotCS8qKgotCSAqIElmIHRoZSB2YWx1ZSBjaGFuZ2VzLCBhbGwgd2FpdGluZyB0aHJlYWRzIGFyZSBub3RpZmllZC4KLQkgKiBSZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmbGlwKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnNldENoYW5nZWRWYWx1ZV8oICEgdGhpcy52YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIHRvIDxjb2RlPnZhbHVlICYgYjwvY29kZT4gYW5kIHJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqIElmIHRoZSB2YWx1ZSBjaGFuZ2VzLCBhbGwgd2FpdGluZyB0aHJlYWRzIGFyZSBub3RpZmllZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhbmQoYm9vbGVhbiBiKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuc2V0VmFsdWVfKHRoaXMudmFsdWUgJiBiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gPGNvZGU+dmFsdWUgfCBiPC9jb2RlPiBhbmQgcmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICogSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nIHRocmVhZHMgYXJlIG5vdGlmaWVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIG9yKGJvb2xlYW4gYikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnNldFZhbHVlXyh0aGlzLnZhbHVlIHwgYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIHRvIDxjb2RlPnZhbHVlIF4gYjwvY29kZT4gYW5kIHJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqIElmIHRoZSB2YWx1ZSBjaGFuZ2VzLCBhbGwgd2FpdGluZyB0aHJlYWRzIGFyZSBub3RpZmllZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB4b3IoYm9vbGVhbiBiKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuc2V0VmFsdWVfKHRoaXMudmFsdWUgXiBiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqIDxicj4KLQkgKiBSZXR1cm4gdGhlIDxlbT5uZXc8L2VtPiB2YWx1ZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2V0VmFsdWVfKGJvb2xlYW4gdikgewotCQlyZXR1cm4gKHYgPT0gdGhpcy52YWx1ZSkgPyB2IDogdGhpcy5zZXRDaGFuZ2VkVmFsdWVfKHYpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSB2YWx1ZSBjaGFuZ2VzLCBhbGwgd2FpdGluZyB0aHJlYWRzIGFyZSBub3RpZmllZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZXROb3QoYm9vbGVhbiBiKSB7Ci0JCXJldHVybiB0aGlzLnNldFZhbHVlKCAhIGIpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSB2YWx1ZSBjaGFuZ2VzLCBhbGwgd2FpdGluZyB0aHJlYWRzIGFyZSBub3RpZmllZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZXRUcnVlKCkgewotCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcgdGhyZWFkcyBhcmUgbm90aWZpZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2V0RmFsc2UoKSB7Ci0JCXJldHVybiB0aGlzLnNldFZhbHVlKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlIGlmIGl0IGlzIGN1cnJlbnRseSB0aGUgc3BlY2lmaWVkCi0JICogZXhwZWN0ZWQgdmFsdWUuIElmIHRoZSB2YWx1ZSBjaGFuZ2VzLCBhbGwgd2FpdGluZyB0aHJlYWRzIGFyZSBub3RpZmllZC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29tbWl0IHdhcyBzdWNjZXNzZnVsLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbW1pdChib29sZWFuIGV4cGVjdGVkVmFsdWUsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSAodGhpcy52YWx1ZSA9PSBleHBlY3RlZFZhbHVlKTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJdGhpcy5zZXRWYWx1ZV8obmV3VmFsdWUpOwotCQkJfQotCQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBdG9taWNhbGx5IHN3YXAgdGhlIHZhbHVlIG9mIHRoaXMgc3luY2hyb25pemVkIGJvb2xlYW4gd2l0aCB0aGUgdmFsdWUgb2YKLQkgKiB0aGUgc3BlY2lmaWVkIHN5bmNocm9uaXplZCBib29sZWFuLiBNYWtlIGFzc3VtcHRpb25zIGFib3V0IHRoZSB2YWx1ZSBvZgotCSAqIDxlbT5pZGVudGl0eSBoYXNoIGNvZGU8L2VtPiB0byBhdm9pZCBkZWFkbG9jayB3aGVuIHR3byBzeW5jaHJvbml6ZWQKLQkgKiBib29sZWFucyBzd2FwIHZhbHVlcyB3aXRoIGVhY2ggb3RoZXIgc2ltdWx0YW5lb3VzbHkuCi0JICogSWYgZWl0aGVyIHZhbHVlIGNoYW5nZXMsIHRoZSBjb3JyZXNwb25kaW5nIHdhaXRpbmcgdGhyZWFkcyBhcmUgbm90aWZpZWQuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3dhcChTeW5jaHJvbml6ZWRCb29sZWFuIG90aGVyKSB7Ci0JCWlmIChvdGhlciA9PSB0aGlzKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRWYWx1ZSgpOwotCQl9Ci0JCWJvb2xlYW4gdGhpc0ZpcnN0ID0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcykgPCBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShvdGhlcik7Ci0JCVN5bmNocm9uaXplZEJvb2xlYW4gZmlyc3QgPSB0aGlzRmlyc3QgPyB0aGlzIDogb3RoZXI7Ci0JCVN5bmNocm9uaXplZEJvb2xlYW4gc2Vjb25kID0gdGhpc0ZpcnN0ID8gb3RoZXIgOiB0aGlzOwotCQlzeW5jaHJvbml6ZWQgKGZpcnN0Lm11dGV4KSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHNlY29uZC5tdXRleCkgewotCQkJCWJvb2xlYW4gdGhpc1ZhbHVlID0gdGhpcy52YWx1ZTsKLQkJCQlib29sZWFuIG90aGVyVmFsdWUgPSBvdGhlci52YWx1ZTsKLQkJCQlpZiAodGhpc1ZhbHVlID09IG90aGVyVmFsdWUpIHsKLQkJCQkJcmV0dXJuIHRoaXNWYWx1ZTsgIC8vIG5vdGhpbmcgY2hhbmdlcwotCQkJCX0KLQkJCQlvdGhlci5zZXRDaGFuZ2VkVmFsdWVfKHRoaXNWYWx1ZSk7Ci0JCQkJcmV0dXJuIHRoaXMuc2V0Q2hhbmdlZFZhbHVlXyhvdGhlclZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb2JqZWN0IHRoaXMgb2JqZWN0IGxvY2tzIG9uIHdoaWxlIHBlcmZvcm1pbmcKLQkgKiBpdHMgb3BlcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE11dGV4KCkgewotCQlyZXR1cm4gdGhpcy5tdXRleDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5kZWZpbml0ZSB3YWl0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgY2hhbmdlcwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5IHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbFZhbHVlSXMoYm9vbGVhbiBiKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsVmFsdWVJc18oYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgd2FpdFVudGlsVmFsdWVJc18oYm9vbGVhbiBiKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl3aGlsZSAodGhpcy52YWx1ZSAhPSBiKSB7Ci0JCQl0aGlzLm11dGV4LndhaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQotCSAqIGNoYW5nZXMgdG8gdGhlIE5PVCBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5IHRoZSBOT1Qgb2YgdGhlIHNwZWNpZmllZAotCSAqIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsVmFsdWVJc05vdChib29sZWFuIGIpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsVmFsdWVJcyggISBiKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKLQkgKiBjaGFuZ2VzIHRvIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5IDxjb2RlPnRydWU8L2NvZGU+LAotCSAqIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxUcnVlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzKHRydWUpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQotCSAqIGNoYW5nZXMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5IDxjb2RlPmZhbHNlPC9jb2RlPiwKLQkgKiByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsRmFsc2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbFZhbHVlSXMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBjaGFuZ2VzIHRvCi0JICogdGhlIE5PVCBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLCB0aGVuIGNoYW5nZSBpdCBiYWNrIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiB2YWx1ZSBhbmQgY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeQotCSAqIHRoZSBOT1Qgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwgc2V0IHRoZSB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlCi0JICogaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFRvU2V0VmFsdWUoYm9vbGVhbiBiKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsVmFsdWVJc18oICEgYik7Ci0JCQl0aGlzLnNldENoYW5nZWRWYWx1ZV8oYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKLQkgKiBjaGFuZ2VzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwKLQkgKiB0aGVuIGNoYW5nZSBpdCBiYWNrIHRvIDxjb2RlPnRydWU8L2NvZGU+IGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+ZmFsc2U8L2NvZGU+LAotCSAqIHNldCB0aGUgdmFsdWUgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFRvU2V0VHJ1ZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFRvU2V0VmFsdWUodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0JICogY2hhbmdlcyB0byA8Y29kZT50cnVlPC9jb2RlPiwKLQkgKiB0aGVuIGNoYW5nZSBpdCBiYWNrIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5IDxjb2RlPnRydWU8L2NvZGU+LAotCSAqIHNldCB0aGUgdmFsdWUgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRUb1NldEZhbHNlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VG9TZXRWYWx1ZShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0JICogY2hhbmdlcyB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLAotCSAqIHRoZW4gZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQuCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgZXF1YWwgdG8gdGhlIHNwZWNpZmllZAotCSAqIHZhbHVlLCBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3aGVuRXF1YWwoYm9vbGVhbiBiLCBJbnRlcnJ1cHRpYmxlQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsVmFsdWVJc18oYik7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQotCSAqIGNoYW5nZXMgdG8gdGhlIE5PVCBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLAotCSAqIHRoZW4gZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQuCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgdGhlIE5PVCBvZiB0aGUgc3BlY2lmaWVkCi0JICogdmFsdWUsIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdoZW5Ob3RFcXVhbChib29sZWFuIGIsIEludGVycnVwdGlibGVDb21tYW5kIGNvbW1hbmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2hlbkVxdWFsKCAhIGIsIGNvbW1hbmQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQotCSAqIGNoYW5nZXMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sCi0JICogdGhlbiBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZC4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSA8Y29kZT50cnVlPC9jb2RlPiwKLQkgKiBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3aGVuVHJ1ZShJbnRlcnJ1cHRpYmxlQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndoZW5FcXVhbCh0cnVlLCBjb21tYW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKLQkgKiBjaGFuZ2VzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwKLQkgKiB0aGVuIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kLgotCSAqIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5IDxjb2RlPmZhbHNlPC9jb2RlPiwKLQkgKiBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3aGVuRmFsc2UoSW50ZXJydXB0aWJsZUNvbW1hbmQgY29tbWFuZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53aGVuRXF1YWwoZmFsc2UsIGNvbW1hbmQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0aW1lZCB3YWl0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgY2hhbmdlcwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZgotCSAqIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIGFjaGlldmVkOwotCSAqIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIHZhbHVlLAotCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsVmFsdWVJcyhib29sZWFuIGIsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy53YWl0VW50aWxWYWx1ZUlzXyhiLCB0aW1lb3V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB3YWl0VW50aWxWYWx1ZUlzXyhib29sZWFuIGIsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRpbWVvdXQgPT0gMEwpIHsKLQkJCXRoaXMud2FpdFVudGlsVmFsdWVJc18oYik7CS8vIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIG5vdGlmaWVkCi0JCQlyZXR1cm4gdHJ1ZTsJLy8gaWYgaXQgZXZlciBjb21lcyBiYWNrLCB0aGUgY29uZGl0aW9uIHdhcyBtZXQKLQkJfQotCi0JCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJbG9uZyByZW1haW5pbmcgPSB0aW1lb3V0OwotCQl3aGlsZSAoKHRoaXMudmFsdWUgIT0gYikgJiYgKHJlbWFpbmluZyA+IDBMKSkgewotCQkJdGhpcy5tdXRleC53YWl0KHJlbWFpbmluZyk7Ci0JCQlyZW1haW5pbmcgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IGIpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQotCSAqIGNoYW5nZXMgdG8gdGhlIE5PVCBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYKLQkgKiB0aGUgTk9UIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIGFjaGlldmVkOwotCSAqIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSB0aGUgTk9UIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiB2YWx1ZSwgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxWYWx1ZUlzTm90KGJvb2xlYW4gYiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxWYWx1ZUlzKCAhIGIsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gPGNvZGU+dHJ1ZTwvY29kZT4gb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZgotCSAqIDxjb2RlPnRydWU8L2NvZGU+IHdhcyBhY2hpZXZlZDsKLQkgKiByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+dHJ1ZTwvY29kZT4sCi0JICogcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxUcnVlKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsVmFsdWVJcyh0cnVlLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgY2hhbmdlcwotCSAqIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IHdhcyBhY2hpZXZlZDsKLQkgKiByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+ZmFsc2U8L2NvZGU+LAotCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsRmFsc2UobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxWYWx1ZUlzKGZhbHNlLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgY2hhbmdlcwotCSAqIHRvIHRoZSBOT1Qgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwgdGhlbiBjaGFuZ2UgaXQgYmFjayB0byB0aGUgc3BlY2lmaWVkCi0JICogdmFsdWUgYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4gSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGRvZXMgbm90Ci0JICogY2hhbmdlIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUKLQkgKiBleGVjdXRpbmcgd2l0aG91dCBjaGFuZ2luZyB0aGUgdmFsdWUuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSB3YXMgc2V0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWU7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5Ci0JICogdGhlIE5PVCBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLCBzZXQgdGhlIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUKLQkgKiBpbW1lZGlhdGVseSBhbmQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9TZXRWYWx1ZShib29sZWFuIGIsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbFZhbHVlSXNfKCAhIGIsIHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQl0aGlzLnNldENoYW5nZWRWYWx1ZV8oYik7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VjY2VzczsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGVuIGNoYW5nZSBpdCBiYWNrIHRvIDxjb2RlPnRydWU8L2NvZGU+IGFuZAotCSAqIGNvbnRpbnVlIGV4ZWN1dGluZy4gSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGRvZXMgbm90IGNoYW5nZSB0bwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUgZXhlY3V0aW5nIHdpdGhvdXQKLQkgKiBjaGFuZ2luZyB0aGUgdmFsdWUuIAotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4KLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmFsdWUgd2FzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPjsKLQkgKiByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+ZmFsc2U8L2NvZGU+LCBzZXQgdGhlCi0JICogdmFsdWUgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkgYW5kIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvU2V0VHJ1ZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRUb1NldFZhbHVlKHRydWUsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IGFuZAotCSAqIGNvbnRpbnVlIGV4ZWN1dGluZy4gSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGRvZXMgbm90IGNoYW5nZSB0bwotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGJlZm9yZSB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZSBleGVjdXRpbmcgd2l0aG91dAotCSAqIGNoYW5naW5nIHRoZSB2YWx1ZS4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHZhbHVlIHdhcyBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+OwotCSAqIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSA8Y29kZT50cnVlPC9jb2RlPiwgc2V0IHRoZQotCSAqIHZhbHVlIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBpbW1lZGlhdGVseSBhbmQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9TZXRGYWxzZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRUb1NldFZhbHVlKGZhbHNlLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgY2hhbmdlcwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnM7Ci0JICogdGhlbiwgaWYgYSB0aW1lLW91dCBkaWQgbm90IG9jY3VyLCBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZC4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmCi0JICogdGhlIGNvbW1hbmQgd2FzIGV4ZWN1dGVkOwotCSAqIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIHZhbHVlLAotCSAqIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIGltbWVkaWF0ZWx5IGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdoZW5FcXVhbChib29sZWFuIGIsIEludGVycnVwdGlibGVDb21tYW5kIGNvbW1hbmQsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbFZhbHVlSXNfKGIsIHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGNoYW5nZXMKLQkgKiB0byB0aGUgTk9UIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnM7Ci0JICogdGhlbiwgaWYgYSB0aW1lLW91dCBkaWQgbm90IG9jY3VyLCBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZC4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmCi0JICogdGhlIGNvbW1hbmQgd2FzIGV4ZWN1dGVkOwotCSAqIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSB0aGUgTk9UIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUsCi0JICogZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgaW1tZWRpYXRlbHkgYW5kIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2hlbk5vdEVxdWFsKGJvb2xlYW4gYiwgSW50ZXJydXB0aWJsZUNvbW1hbmQgY29tbWFuZCwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53aGVuRXF1YWwoICEgYiwgY29tbWFuZCwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGNoYW5nZXMKLQkgKiB0byA8Y29kZT50cnVlPC9jb2RlPiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3VyczsKLQkgKiB0aGVuLCBpZiBhIHRpbWUtb3V0IGRpZCBub3Qgb2NjdXIsIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYKLQkgKiB0aGUgY29tbWFuZCB3YXMgZXhlY3V0ZWQ7Ci0JICogcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5IDxjb2RlPnRydWU8L2NvZGU+LAotCSAqIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIGltbWVkaWF0ZWx5IGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdoZW5UcnVlKEludGVycnVwdGlibGVDb21tYW5kIGNvbW1hbmQsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2hlbkVxdWFsKHRydWUsIGNvbW1hbmQsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzOwotCSAqIHRoZW4sIGlmIGEgdGltZS1vdXQgZGlkIG5vdCBvY2N1ciwgZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZgotCSAqIHRoZSBjb21tYW5kIHdhcyBleGVjdXRlZDsKLQkgKiByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+ZmFsc2U8L2NvZGU+LAotCSAqIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIGltbWVkaWF0ZWx5IGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdoZW5GYWxzZShJbnRlcnJ1cHRpYmxlQ29tbWFuZCBjb21tYW5kLCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndoZW5FcXVhbChmYWxzZSwgY29tbWFuZCwgdGltZW91dCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplZCBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgbm90IGludGVycnVwdGVkLCBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCAKLQkgKiB3aXRoIHRoZSBtdXRleCBsb2NrZWQuIFRoaXMgaXMgdXNlZnVsIGZvciBpbml0aWFsaXppbmcgdGhlIHZhbHVlIGZyb20gYW5vdGhlcgotCSAqIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKEludGVycnVwdGlibGVDb21tYW5kIGNvbW1hbmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpLmlzSW50ZXJydXB0ZWQoKSkgewotCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTeW5jaHJvbml6ZWRCb29sZWFuIGNsb25lKCkgewotCQl0cnkgewotCQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQkJcmV0dXJuIChTeW5jaHJvbml6ZWRCb29sZWFuKSBzdXBlci5jbG9uZSgpOwotCQkJfQotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE9iamVjdCBpZGVudGl0eSBpcyBjcml0aWNhbCB0byBzeW5jaHJvbml6ZWQgYm9vbGVhbnMuCi0JICogVGhlcmUgaXMgbm8gcmVhc29uIGZvciB0d28gZGlmZmVyZW50IHN5bmNocm9uaXplZCBib29sZWFucyB0byBiZQotCSAqIDxlbT5lcXVhbDwvZW0+LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBzdXBlci5lcXVhbHMob2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlICNlcXVhbHMoT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAnWycgKyBTdHJpbmcudmFsdWVPZih0aGlzLmdldFZhbHVlKCkpICsgJ10nOwotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZEludC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkSW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMGExMmUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkSW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzeW5jaHJvbml6ZWQgYWNjZXNzIHRvIGFuIDxjb2RlPmludDwvY29kZT4uCi0gKiBJdCBhbHNvIHByb3ZpZGVzIHByb3RvY29sIGZvciBzdXNwZW5kaW5nIGEgdGhyZWFkIHVudGlsIHRoZQotICogdmFsdWUgaXMgc2V0IHRvIGEgc3BlY2lmaWVkIHZhbHVlLCB3aXRoIG9wdGlvbmFsIHRpbWUtb3V0cy4KLSAqIAotICogQHNlZSBTaW1wbGVJbnRSZWZlcmVuY2UKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZEludAotCWltcGxlbWVudHMgTW9kaWZpYWJsZUludFJlZmVyZW5jZSwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQkvKiogQmFja2luZyA8Y29kZT5pbnQ8L2NvZGU+LiAqLwotCXByaXZhdGUgaW50IHZhbHVlOwotCi0JLyoqIE9iamVjdCB0byBzeW5jaHJvbml6ZSBvbi4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBtdXRleDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgaW50ZWdlciB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZQotCSAqIGFuZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkSW50KGludCB2YWx1ZSwgT2JqZWN0IG11dGV4KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5tdXRleCA9IG11dGV4OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHN5bmNocm9uaXplZCBpbnRlZ2VyIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIHZhbHVlLgotCSAqIFRoZSBzeW5jaHJvbml6ZWQgaW50ZWdlciBpdHNlbGYgd2lsbCBiZSB0aGUgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEludChpbnQgdmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm11dGV4ID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgaW50ZWdlciB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YgemVybwotCSAqIGFuZCB0aGUgc3BlY2lmaWVkIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRJbnQoT2JqZWN0IG11dGV4KSB7Ci0JCXRoaXMoMCwgbXV0ZXgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHN5bmNocm9uaXplZCBvYmplY3Qgd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mIHplcm8uCi0JICogVGhlIHN5bmNocm9uaXplZCBpbnRlZ2VyIGl0c2VsZiB3aWxsIGJlIHRoZSBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkSW50KCkgewotCQl0aGlzKDApOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSA9PSB2OwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbm90RXF1YWwoaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSAhPSB2OwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNaZXJvKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlID09IDA7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05vdFplcm8oKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgIT0gMDsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzR3JlYXRlclRoYW4oaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSA+IHY7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0dyZWF0ZXJUaGFuT3JFcXVhbChpbnQgdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlID49IHY7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xlc3NUaGFuKGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgPCB2OwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMZXNzVGhhbk9yRXF1YWwoaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSA8PSB2OwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQb3NpdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNHcmVhdGVyVGhhbigwKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05vdFBvc2l0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5pc0xlc3NUaGFuT3JFcXVhbCgwKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05lZ2F0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5pc0xlc3NUaGFuKDApOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTm90TmVnYXRpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmlzR3JlYXRlclRoYW5PckVxdWFsKDApOwotCX0KLQotCXB1YmxpYyBpbnQgYWJzKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiBNYXRoLmFicyh0aGlzLnZhbHVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgbmVnKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiAtdGhpcy52YWx1ZTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgYWRkKGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgKyB2OwotCQl9Ci0JfQotCi0JcHVibGljIGludCBzdWJ0cmFjdChpbnQgdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlIC0gdjsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgbXVsdGlwbHkoaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSAqIHY7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGRpdmlkZShpbnQgdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlIC8gdjsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgcmVtYWluZGVyKGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgJSB2OwotCQl9Ci0JfQotCi0JcHVibGljIGludCBtaW4oaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gTWF0aC5taW4odGhpcy52YWx1ZSwgdik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IG1heChpbnQgdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiBNYXRoLm1heCh0aGlzLnZhbHVlLCB2KTsKLQkJfQotCX0KLQotCXB1YmxpYyBkb3VibGUgcG93KGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIE1hdGgucG93KHRoaXMudmFsdWUsIHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nIHRocmVhZHMgYXJlIG5vdGlmaWVkLgotCSAqLwotCXB1YmxpYyBpbnQgc2V0VmFsdWUoaW50IHZhbHVlKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuc2V0VmFsdWVfKHZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgaW50IHNldFZhbHVlXyhpbnQgdikgewotCQlpbnQgb2xkID0gdGhpcy52YWx1ZTsKLQkJcmV0dXJuIChvbGQgPT0gdikgPyBvbGQgOiB0aGlzLnNldFZhbHVlXyh2LCBvbGQpOwotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZCBhbmQgbmV3IHZhbHVlIGlzIGRpZmZlcmVudAotCSAqLwotCXByaXZhdGUgaW50IHNldENoYW5nZWRWYWx1ZV8oaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWVfKHYsIHRoaXMudmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZCBhbmQgbmV3IHZhbHVlIGlzIGRpZmZlcmVudAotCSAqLwotCXByaXZhdGUgaW50IHNldFZhbHVlXyhpbnQgdiwgaW50IG9sZCkgewotCQl0aGlzLnZhbHVlID0gdjsKLQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJcmV0dXJuIG9sZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIHRvIHplcm8uIElmIHRoZSB2YWx1ZSBjaGFuZ2VzLCBhbGwgd2FpdGluZwotCSAqIHRocmVhZHMgYXJlIG5vdGlmaWVkLiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgc2V0WmVybygpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWUoMCk7Ci0JfQotCi0JLyoqCi0JICogSW5jcmVtZW50IHRoZSB2YWx1ZSBieSBvbmUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBpbmNyZW1lbnQoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy52YWx1ZSsrOwotCQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJCXJldHVybiB0aGlzLnZhbHVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVjcmVtZW50IHRoZSB2YWx1ZSBieSBvbmUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBkZWNyZW1lbnQoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy52YWx1ZS0tOwotCQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJCXJldHVybiB0aGlzLnZhbHVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGN1cnJlbnQgdmFsdWUgaXMgdGhlIHNwZWNpZmllZCBleHBlY3RlZCB2YWx1ZSwgc2V0IGl0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBuZXcgdmFsdWUuIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBjb21wYXJlQW5kU3dhcChpbnQgZXhwZWN0ZWRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuY29tcGFyZUFuZFN3YXBfKGV4cGVjdGVkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgaW50IGNvbXBhcmVBbmRTd2FwXyhpbnQgZXhwZWN0ZWRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSBleHBlY3RlZFZhbHVlKSA/IHRoaXMuc2V0VmFsdWVfKG5ld1ZhbHVlKSA6IHRoaXMudmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYmplY3QgdGhlIHN5bmNocm9uaXplZCBpbnRlZ2VyIGxvY2tzIG9uIHdoaWxlIHBlcmZvcm1pbmcKLQkgKiBpdHMgb3BlcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE11dGV4KCkgewotCQlyZXR1cm4gdGhpcy5tdXRleDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5kZWZpbml0ZSB3YWl0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEVxdWFsKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsRXF1YWxfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbEVxdWFsXyhpbnQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHRoaXMudmFsdWUgIT0gdikgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHRoZQotCSAqIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IHRoZSBzcGVjaWZpZWQgdmFsdWUsCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdEVxdWFsKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsTm90RXF1YWxfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbE5vdEVxdWFsXyhpbnQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHRoaXMudmFsdWUgPT0gdikgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byB6ZXJvLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHplcm8sIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxaZXJvKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxFcXVhbCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHplcm8uCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IHplcm8sCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdFplcm8oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbE5vdEVxdWFsKDApOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gYSB2YWx1ZSBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkKLQkgKiBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEdyZWF0ZXJUaGFuKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsR3JlYXRlclRoYW5fKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbEdyZWF0ZXJUaGFuXyhpbnQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHRoaXMudmFsdWUgPD0gdikgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIGEgdmFsdWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5Ci0JICogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxHcmVhdGVyVGhhbk9yRXF1YWwoaW50IHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxHcmVhdGVyVGhhbk9yRXF1YWxfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbEdyZWF0ZXJUaGFuT3JFcXVhbF8oaW50IHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXdoaWxlICh0aGlzLnZhbHVlIDwgdikgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIGEgdmFsdWUgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5Ci0JICogbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxMZXNzVGhhbihpbnQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbExlc3NUaGFuXyh2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCB3YWl0VW50aWxMZXNzVGhhbl8oaW50IHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXdoaWxlICh0aGlzLnZhbHVlID49IHYpIHsKLQkJCXRoaXMubXV0ZXgud2FpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byBhIHZhbHVlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeQotCSAqIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsTGVzc1RoYW5PckVxdWFsKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsTGVzc1RoYW5PckVxdWFsXyh2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCB3YWl0VW50aWxMZXNzVGhhbk9yRXF1YWxfKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl3aGlsZSAodGhpcy52YWx1ZSA+IHYpIHsKLQkJCXRoaXMubXV0ZXgud2FpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGlzIHBvc2l0aXZlLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHBvc2l0aXZlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsUG9zaXRpdmUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbEdyZWF0ZXJUaGFuKDApOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBpcyBub3QgcG9zaXRpdmUKLQkgKiAoaS5lLiBuZWdhdGl2ZSBvciB6ZXJvKS4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4gcG9zaXRpdmUsCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdFBvc2l0aXZlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxMZXNzVGhhbk9yRXF1YWwoMCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IG5lZ2F0aXZlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsTmVnYXRpdmUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbExlc3NUaGFuKDApOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBpcyBub3QgbmVnYXRpdmUKLQkgKiAoaS5lLiB6ZXJvIG9yIHBvc2l0aXZlKS4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4gbmVnYXRpdmUsCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdE5lZ2F0aXZlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxHcmVhdGVyVGhhbk9yRXF1YWwoMCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8KLQkgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLCB0aGVuIGNoYW5nZQotCSAqIGl0IGJhY2sgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IDxlbT5ub3Q8L2VtPiB0aGUgc3BlY2lmaWVkIHZhbHVlLCBzZXQKLQkgKiB0aGUgdmFsdWUgaW1tZWRpYXRlbHkuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IHdhaXRUb1NldFZhbHVlKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsTm90RXF1YWxfKHYpOwotCQkJcmV0dXJuIHRoaXMuc2V0Q2hhbmdlZFZhbHVlXyh2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvCi0JICogc29tZXRoaW5nIG90aGVyIHRoYW4gemVybywgdGhlbiBjaGFuZ2UgaXQKLQkgKiBiYWNrIHRvIHplcm8gYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4gemVybywKLQkgKiBzZXQgdGhlIHZhbHVlIHRvIHplcm8gaW1tZWRpYXRlbHkuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IHdhaXRUb1NldFplcm8oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VG9TZXRWYWx1ZSgwKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0bwotCSAqIHRoZSBzcGVjaWZpZWQgZXhwZWN0ZWQgdmFsdWUsIHRoZW4gY2hhbmdlIGl0Ci0JICogdG8gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUgYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGV4cGVjdGVkIHZhbHVlLAotCSAqIHNldCB0aGUgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUgaW1tZWRpYXRlbHkuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IHdhaXRUb1N3YXAoaW50IGV4cGVjdGVkVmFsdWUsIGludCBuZXdWYWx1ZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbEVxdWFsXyhleHBlY3RlZFZhbHVlKTsKLQkJCXJldHVybiB0aGlzLnNldFZhbHVlXyhuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGltZWQgd2FpdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHdhcyBhY2hpZXZlZDsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuIHRydWUgaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbEVxdWFsKGludCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsRXF1YWxfKHYsIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbEVxdWFsXyhpbnQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJdGhpcy53YWl0VW50aWxFcXVhbF8odik7ICAvLyB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCBub3RpZmllZAotCQkJcmV0dXJuIHRydWU7ICAvLyBpZiBpdCBldmVyIGNvbWVzIGJhY2ssIHRoZSBjb25kaXRpb24gd2FzIG1ldAotCQl9Ci0KLQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotCQlsb25nIHJlbWFpbmluZyA9IHRpbWVvdXQ7Ci0JCXdoaWxlICgodGhpcy52YWx1ZSAhPSB2KSAmJiAocmVtYWluaW5nID4gMEwpKSB7Ci0JCQl0aGlzLm11dGV4LndhaXQocmVtYWluaW5nKTsKLQkJCXJlbWFpbmluZyA9IHN0b3AgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gdik7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8gc29tZXRoaW5nCi0JICogb3RoZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHdhcyByZW1vdmVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEKLQkgKiB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IHRoZSBzcGVjaWZpZWQKLQkgKiB2YWx1ZSwgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxOb3RFcXVhbChpbnQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbE5vdEVxdWFsXyh2LCB0aW1lb3V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB3YWl0VW50aWxOb3RFcXVhbF8oaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRpbWVvdXQgPT0gMEwpIHsKLQkJCXRoaXMud2FpdFVudGlsTm90RXF1YWxfKHYpOwkvLyB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCBub3RpZmllZAotCQkJcmV0dXJuIHRydWU7CS8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJd2hpbGUgKCh0aGlzLnZhbHVlID09IHYpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXJldHVybiAodGhpcy52YWx1ZSAhPSB2KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHplcm8gb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSBpcyBub3cgemVybzsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHplcm8sCi0JICogcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxaZXJvKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsRXF1YWwoMCwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiB6ZXJvIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgdmFsdWUgaXMgbm93IG5vdCB6ZXJvOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+Ci0JICogemVybywgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxOb3RaZXJvKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsTm90RXF1YWwoMCwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8gYSB2YWx1ZSBncmVhdGVyCi0JICogdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHdhcyBhY2hpZXZlZDsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsR3JlYXRlclRoYW4oaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy53YWl0VW50aWxHcmVhdGVyVGhhbl8odiwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gd2FpdFVudGlsR3JlYXRlclRoYW5fKGludCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQl0aGlzLndhaXRVbnRpbEdyZWF0ZXJUaGFuXyh2KTsgIC8vIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIG5vdGlmaWVkCi0JCQlyZXR1cm4gdHJ1ZTsgIC8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJd2hpbGUgKCh0aGlzLnZhbHVlIDw9IHYpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXJldHVybiAodGhpcy52YWx1ZSA+IHYpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvIGEgdmFsdWUgZ3JlYXRlcgotCSAqIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSB3YXMgYWNoaWV2ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLAotCSAqIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsR3JlYXRlclRoYW5PckVxdWFsKGludCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsR3JlYXRlclRoYW5PckVxdWFsXyh2LCB0aW1lb3V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB3YWl0VW50aWxHcmVhdGVyVGhhbk9yRXF1YWxfKGludCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQl0aGlzLndhaXRVbnRpbEdyZWF0ZXJUaGFuT3JFcXVhbF8odik7ICAvLyB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCBub3RpZmllZAotCQkJcmV0dXJuIHRydWU7ICAvLyBpZiBpdCBldmVyIGNvbWVzIGJhY2ssIHRoZSBjb25kaXRpb24gd2FzIG1ldAotCQl9Ci0KLQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotCQlsb25nIHJlbWFpbmluZyA9IHRpbWVvdXQ7Ci0JCXdoaWxlICgodGhpcy52YWx1ZSA8IHYpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXJldHVybiAodGhpcy52YWx1ZSA+PSB2KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byBhIHZhbHVlIGxlc3MKLQkgKiB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIGFjaGlldmVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxMZXNzVGhhbihpbnQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbExlc3NUaGFuXyh2LCB0aW1lb3V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB3YWl0VW50aWxMZXNzVGhhbl8oaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRpbWVvdXQgPT0gMEwpIHsKLQkJCXRoaXMud2FpdFVudGlsTGVzc1RoYW5fKHYpOyAgLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCXJldHVybiB0cnVlOyAgLy8gaWYgaXQgZXZlciBjb21lcyBiYWNrLCB0aGUgY29uZGl0aW9uIHdhcyBtZXQKLQkJfQotCi0JCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJbG9uZyByZW1haW5pbmcgPSB0aW1lb3V0OwotCQl3aGlsZSAoKHRoaXMudmFsdWUgPj0gdikgJiYgKHJlbWFpbmluZyA+IDBMKSkgewotCQkJdGhpcy5tdXRleC53YWl0KHJlbWFpbmluZyk7Ci0JCQlyZW1haW5pbmcgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJcmV0dXJuICh0aGlzLnZhbHVlIDwgdik7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8gYSB2YWx1ZSBsZXNzCi0JICogdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHdhcyBhY2hpZXZlZDsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUsCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxMZXNzVGhhbk9yRXF1YWwoaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy53YWl0VW50aWxMZXNzVGhhbk9yRXF1YWxfKHYsIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbExlc3NUaGFuT3JFcXVhbF8oaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRpbWVvdXQgPT0gMEwpIHsKLQkJCXRoaXMud2FpdFVudGlsTGVzc1RoYW5PckVxdWFsXyh2KTsgIC8vIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIG5vdGlmaWVkCi0JCQlyZXR1cm4gdHJ1ZTsgIC8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJd2hpbGUgKCh0aGlzLnZhbHVlID4gdikgJiYgKHJlbWFpbmluZyA+IDBMKSkgewotCQkJdGhpcy5tdXRleC53YWl0KHJlbWFpbmluZyk7Ci0JCQlyZW1haW5pbmcgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJcmV0dXJuICh0aGlzLnZhbHVlIDw9IHYpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBpcyBwb3NpdGl2ZQotCSAqIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgdmFsdWUgaXMgbm93IHBvc2l0aXZlOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgcG9zaXRpdmUsCi0JICogcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxQb3NpdGl2ZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbEdyZWF0ZXJUaGFuKDAsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBpcyBub3QgcG9zaXRpdmUKLQkgKiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHZhbHVlIGlzIG5vdyBub3QgcG9zaXRpdmU7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBub3QgcG9zaXRpdmUsCi0JICogcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxOb3RQb3NpdGl2ZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbExlc3NUaGFuT3JFcXVhbCgwLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgaXMgbmVnYXRpdmUKLQkgKiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHZhbHVlIGlzIG5vdyBuZWdhdGl2ZTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IG5lZ2F0aXZlLAotCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsTmVnYXRpdmUobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxMZXNzVGhhbigwLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgaXMgbm90IG5lZ2F0aXZlCi0JICogb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSBpcyBub3cgbm90IG5lZ2F0aXZlOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgbm90IG5lZ2F0aXZlLAotCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsTm90TmVnYXRpdmUobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxHcmVhdGVyVGhhbk9yRXF1YWwoMCwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8KLQkgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLCB0aGVuIGNoYW5nZQotCSAqIGl0IGJhY2sgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlIGJlZm9yZSB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZSBleGVjdXRpbmcKLQkgKiB3aXRob3V0IGNoYW5naW5nIHRoZSB2YWx1ZS4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHZhbHVlIHdhcyBzZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgc2V0Ci0JICogdGhlIHZhbHVlIGltbWVkaWF0ZWx5IGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb1NldFZhbHVlKGludCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gdGhpcy53YWl0VW50aWxOb3RFcXVhbF8odiwgdGltZW91dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCXRoaXMuc2V0Q2hhbmdlZFZhbHVlXyh2KTsKLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8gc29tZXRoaW5nCi0JICogb3RoZXIgdGhhbiB6ZXJvLCB0aGVuIGNoYW5nZSBpdCBiYWNrIHRvIHplcm8KLQkgKiBhbmQgY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgdmFsdWUgZG9lcyBub3QgY2hhbmdlIHRvIHNvbWV0aGluZwotCSAqIG90aGVyIHRoYW4gemVybyBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUKLQkgKiBleGVjdXRpbmcgd2l0aG91dCBjaGFuZ2luZyB0aGUgdmFsdWUuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSB3YXMgc2V0IHRvIHplcm87IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHNvbWV0aGluZyBvdGhlciB0aGFuIHplcm8sIHNldAotCSAqIHRoZSB2YWx1ZSB0byB6ZXJvIGltbWVkaWF0ZWx5IGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb1NldFplcm8obG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VG9TZXRWYWx1ZSgwLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0bwotCSAqIHRoZSBzcGVjaWZpZWQgZXhwZWN0ZWQgdmFsdWUsIHRoZW4gY2hhbmdlIGl0Ci0JICogdG8gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUgYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4KLQkgKiBJZiB0aGUgdmFsdWUgZG9lcyBub3QgY2hhbmdlIHRvIHRoZSBzcGVjaWZpZWQgZXhwZWN0ZWQgdmFsdWUKLQkgKiBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUgZXhlY3V0aW5nIHdpdGhvdXQgY2hhbmdpbmcKLQkgKiB0aGUgdmFsdWUuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSB3YXMgc2V0IHRvIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlOyByZXR1cm4KLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGV4cGVjdGVkIHZhbHVlLAotCSAqIHNldCB0aGUgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUgaW1tZWRpYXRlbHkuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvU3dhcChpbnQgZXhwZWN0ZWRWYWx1ZSwgaW50IG5ld1ZhbHVlLCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gdGhpcy53YWl0VW50aWxFcXVhbF8oZXhwZWN0ZWRWYWx1ZSwgdGltZW91dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCXRoaXMuc2V0VmFsdWVfKG5ld1ZhbHVlKTsKLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplZCBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiBjdXJyZW50IHRocmVhZCBpcyBub3QgaW50ZXJydXB0ZWQsIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIAotCSAqIHdpdGggdGhlIG11dGV4IGxvY2tlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIGluaXRpYWxpemluZyB0aGUgdmFsdWUgZnJvbSBhbm90aGVyCi0JICogdGhyZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pc0ludGVycnVwdGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29tcGFyYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhJbnRSZWZlcmVuY2UgcmVmKSB7Ci0JCWludCB0aGlzVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCWludCBvdGhlclZhbHVlID0gcmVmLmdldFZhbHVlKCk7Ci0JCXJldHVybiAodGhpc1ZhbHVlIDwgb3RoZXJWYWx1ZSkgPyAtMSA6ICgodGhpc1ZhbHVlID09IG90aGVyVmFsdWUpID8gMCA6IDEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTeW5jaHJvbml6ZWRJbnQgY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCQlyZXR1cm4gKFN5bmNocm9uaXplZEludCkgc3VwZXIuY2xvbmUoKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gJ1snICsgU3RyaW5nLnZhbHVlT2YodGhpcy5nZXRWYWx1ZSgpKSArICddJzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gcykgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZE9iamVjdC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZjI4MjkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuTW9kaWZpYWJsZU9iamVjdFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3luY2hyb25pemVkIGFjY2VzcyB0byBhbiBvYmplY3Qgb2YgdHlwZSA8Y29kZT5WPC9jb2RlPi4KLSAqIEl0IGFsc28gcHJvdmlkZXMgcHJvdG9jb2wgZm9yIHN1c3BlbmRpbmcgYSB0aHJlYWQgdW50aWwgdGhlCi0gKiB2YWx1ZSBpcyBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4gb3IgYSBub24tPGNvZGU+bnVsbDwvY29kZT4gdmFsdWUsCi0gKiB3aXRoIG9wdGlvbmFsIHRpbWUtb3V0cy4KLSAqIAotICogQHBhcm0gViB0aGUgdHlwZSBvZiB0aGUgc3luY2hyb25pemVkIG9iamVjdCdzIHZhbHVlCi0gKiBAc2VlIFNpbXBsZU9iamVjdFJlZmVyZW5jZQotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkT2JqZWN0PFY+Ci0JaW1wbGVtZW50cyBNb2RpZmlhYmxlT2JqZWN0UmVmZXJlbmNlPFY+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBCYWNraW5nIHZhbHVlLiAqLwotCXByaXZhdGUgViB2YWx1ZTsKLQotCS8qKiBPYmplY3QgdG8gc3luY2hyb25pemUgb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbXV0ZXg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3luY2hyb25pemVkIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZQotCSAqIGFuZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkT2JqZWN0KFYgdmFsdWUsIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubXV0ZXggPSBtdXRleDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIHZhbHVlLgotCSAqIFRoZSBzeW5jaHJvbml6ZWQgb2JqZWN0IGl0c2VsZiB3aWxsIGJlIHRoZSBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkT2JqZWN0KFYgdmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm11dGV4ID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgb2JqZWN0IHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBUaGUgc3luY2hyb25pemVkIG9iamVjdCBpdHNlbGYgd2lsbCBiZSB0aGUgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZE9iamVjdCgpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCXB1YmxpYyBWIGdldFZhbHVlKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsdWVFcXVhbHMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy5nZXRWYWx1ZSgpLCBvYmplY3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbHVlTm90RXF1YWwoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuZ2V0VmFsdWUoKSwgb2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc051bGwoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgPT0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTm90TnVsbCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSAhPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZS4gSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nCi0JICogdGhyZWFkcyBhcmUgbm90aWZpZWQuIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIFYgc2V0VmFsdWUoViB2YWx1ZSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnNldFZhbHVlXyh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIFYgc2V0VmFsdWVfKFYgdikgewotCQlWIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbChvbGQsIHYpID8gb2xkIDogdGhpcy5zZXRWYWx1ZV8odiwgb2xkKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQgYW5kIG5ldyB2YWx1ZSBpcyBkaWZmZXJlbnQKLQkgKi8KLQlwcml2YXRlIFYgc2V0Q2hhbmdlZFZhbHVlXyhWIHYpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWVfKHYsIHRoaXMudmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZCBhbmQgbmV3IHZhbHVlIGlzIGRpZmZlcmVudAotCSAqLwotCXByaXZhdGUgViBzZXRWYWx1ZV8oViB2LCBWIG9sZCkgewotCQl0aGlzLnZhbHVlID0gdjsKLQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJcmV0dXJuIG9sZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIHRvIDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcKLQkgKiB0aHJlYWRzIGFyZSBub3RpZmllZC4gUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgViBzZXROdWxsKCkgewotCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgY3VycmVudCB2YWx1ZSBpcyB0aGUgc3BlY2lmaWVkIGV4cGVjdGVkIHZhbHVlLCBzZXQgaXQgdG8gdGhlCi0JICogc3BlY2lmaWVkIG5ldyB2YWx1ZS4gUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgViBjb21wYXJlQW5kU3dhcChWIGV4cGVjdGVkVmFsdWUsIFYgbmV3VmFsdWUpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21wYXJlQW5kU3dhcF8oZXhwZWN0ZWRWYWx1ZSwgbmV3VmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBWIGNvbXBhcmVBbmRTd2FwXyhWIGV4cGVjdGVkVmFsdWUsIFYgbmV3VmFsdWUpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMudmFsdWUsIGV4cGVjdGVkVmFsdWUpID8gdGhpcy5zZXRWYWx1ZV8obmV3VmFsdWUpIDogdGhpcy52YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB0aGUgc3luY2hyb25pemVkIG9iamVjdCBsb2NrcyBvbiB3aGlsZSBwZXJmb3JtaW5nCi0JICogaXRzIG9wZXJhdGlvbnMuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNdXRleCgpIHsKLQkJcmV0dXJuIHRoaXMubXV0ZXg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluZGVmaW5pdGUgd2FpdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxWYWx1ZUlzKFYgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbFZhbHVlSXNfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbFZhbHVlSXNfKFYgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJd2hpbGUgKFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnZhbHVlLCB2KSkgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHRoZQotCSAqIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IHRoZSBzcGVjaWZpZWQgdmFsdWUsCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbFZhbHVlSXNOb3QoViB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsVmFsdWVJc05vdF8odik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgd2FpdFVudGlsVmFsdWVJc05vdF8oViB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl3aGlsZSAoVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy52YWx1ZSwgdikpIHsKLQkJCXRoaXMubXV0ZXgud2FpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+bnVsbDwvY29kZT4sIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxOdWxsKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzKG51bGwpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IDxjb2RlPm51bGw8L2NvZGU+LAotCSAqIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxOb3ROdWxsKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzTm90KG51bGwpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvCi0JICogc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgdGhlbiBjaGFuZ2UKLQkgKiBpdCBiYWNrIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgc2V0Ci0JICogdGhlIHZhbHVlIGltbWVkaWF0ZWx5LgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIFYgd2FpdFRvU2V0VmFsdWUoViB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsVmFsdWVJc05vdF8odik7Ci0JCQlyZXR1cm4gdGhpcy5zZXRDaGFuZ2VkVmFsdWVfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8KLQkgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBjaGFuZ2UgaXQKLQkgKiBiYWNrIHRvIDxjb2RlPm51bGw8L2NvZGU+IGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IDxjb2RlPm51bGw8L2NvZGU+LAotCSAqIHNldCB0aGUgdmFsdWUgdG8gPGNvZGU+bnVsbDwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgViB3YWl0VG9TZXROdWxsKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFRvU2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8KLQkgKiB0aGUgc3BlY2lmaWVkIGV4cGVjdGVkIHZhbHVlLCB0aGVuIGNoYW5nZSBpdAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBleHBlY3RlZCB2YWx1ZSwKLQkgKiBzZXQgdGhlIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlIGltbWVkaWF0ZWx5LgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIFYgd2FpdFRvU3dhcChWIGV4cGVjdGVkVmFsdWUsIFYgbmV3VmFsdWUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzXyhleHBlY3RlZFZhbHVlKTsKLQkJCXJldHVybiB0aGlzLnNldFZhbHVlXyhuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGltZWQgd2FpdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHdhcyBhY2hpZXZlZDsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuIHRydWUgaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbFZhbHVlSXMoViB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsVmFsdWVJc18odiwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gd2FpdFVudGlsVmFsdWVJc18oViB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQl0aGlzLndhaXRVbnRpbFZhbHVlSXNfKHYpOyAgLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCXJldHVybiB0cnVlOyAgLy8gaWYgaXQgZXZlciBjb21lcyBiYWNrLCB0aGUgY29uZGl0aW9uIHdhcyBtZXQKLQkJfQotCi0JCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJbG9uZyByZW1haW5pbmcgPSB0aW1lb3V0OwotCQl3aGlsZSAoVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMudmFsdWUsIHYpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLnZhbHVlLCB2KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byBzb21ldGhpbmcKLQkgKiBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIHJlbW92ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYQotCSAqIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4gdGhlIHNwZWNpZmllZAotCSAqIHZhbHVlLCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbFZhbHVlSXNOb3QoViB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsVmFsdWVJc05vdF8odiwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gd2FpdFVudGlsVmFsdWVJc05vdF8oViB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQl0aGlzLndhaXRVbnRpbFZhbHVlSXNOb3RfKHYpOwkvLyB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCBub3RpZmllZAotCQkJcmV0dXJuIHRydWU7CS8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJd2hpbGUgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMudmFsdWUsIHYpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy52YWx1ZSwgdik7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byA8Y29kZT5udWxsPC9jb2RlPiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSB3YXMgYWNoaWV2ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8Y29kZT5udWxsPC9jb2RlPiwKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbE51bGwobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxWYWx1ZUlzKG51bGwsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gPGNvZGU+bnVsbDwvY29kZT4gb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIGFjaGlldmVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+Ci0JICogPGNvZGU+bnVsbDwvY29kZT4sIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsTm90TnVsbChsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbFZhbHVlSXNOb3QobnVsbCwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8KLQkgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLCB0aGVuIGNoYW5nZQotCSAqIGl0IGJhY2sgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlIGJlZm9yZSB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZSBleGVjdXRpbmcKLQkgKiB3aXRob3V0IGNoYW5naW5nIHRoZSB2YWx1ZS4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHZhbHVlIHdhcyBzZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgc2V0Ci0JICogdGhlIHZhbHVlIGltbWVkaWF0ZWx5IGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb1NldFZhbHVlKFYgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHRoaXMud2FpdFVudGlsVmFsdWVJc05vdF8odiwgdGltZW91dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCXRoaXMuc2V0Q2hhbmdlZFZhbHVlXyh2KTsKLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8gc29tZXRoaW5nCi0JICogb3RoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBjaGFuZ2UgaXQgYmFjayB0byA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGFuZCBjb250aW51ZSBleGVjdXRpbmcuIElmIHRoZSB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UgdG8gc29tZXRoaW5nCi0JICogb3RoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPiBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUKLQkgKiBleGVjdXRpbmcgd2l0aG91dCBjaGFuZ2luZyB0aGUgdmFsdWUuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSB3YXMgc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+OyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBzb21ldGhpbmcgb3RoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPiwgc2V0Ci0JICogdGhlIHZhbHVlIHRvIDxjb2RlPm51bGw8L2NvZGU+IGltbWVkaWF0ZWx5IGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb1NldE51bGwobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VG9TZXRWYWx1ZShudWxsLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0bwotCSAqIHRoZSBzcGVjaWZpZWQgZXhwZWN0ZWQgdmFsdWUsIHRoZW4gY2hhbmdlIGl0Ci0JICogdG8gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUgYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4KLQkgKiBJZiB0aGUgdmFsdWUgZG9lcyBub3QgY2hhbmdlIHRvIHRoZSBzcGVjaWZpZWQgZXhwZWN0ZWQgdmFsdWUKLQkgKiBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUgZXhlY3V0aW5nIHdpdGhvdXQgY2hhbmdpbmcKLQkgKiB0aGUgdmFsdWUuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSB3YXMgc2V0IHRvIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlOyByZXR1cm4KLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGV4cGVjdGVkIHZhbHVlLAotCSAqIHNldCB0aGUgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUgaW1tZWRpYXRlbHkuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvU3dhcChWIGV4cGVjdGVkVmFsdWUsIFYgbmV3VmFsdWUsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbFZhbHVlSXNfKGV4cGVjdGVkVmFsdWUsIHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQl0aGlzLnNldFZhbHVlXyhuZXdWYWx1ZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VjY2VzczsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZWQgYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgY3VycmVudCB0aHJlYWQgaXMgbm90IGludGVycnVwdGVkLCBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCAKLQkgKiB3aXRoIHRoZSBtdXRleCBsb2NrZWQuIFRoaXMgaXMgdXNlZnVsIGZvciBpbml0aWFsaXppbmcgdGhlIHZhbHVlIGZyb20gYW5vdGhlcgotCSAqIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaXNJbnRlcnJ1cHRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJfQotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN5bmNocm9uaXplZE9iamVjdDxWPiBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJCVN5bmNocm9uaXplZE9iamVjdDxWPiBjbG9uZSA9IChTeW5jaHJvbml6ZWRPYmplY3Q8Vj4pIHN1cGVyLmNsb25lKCk7Ci0JCQkJcmV0dXJuIGNsb25lOwotCQkJfQotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAnWycgKyBTdHJpbmcudmFsdWVPZih0aGlzLmdldFZhbHVlKCkpICsgJ10nOwotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkUXVldWUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZFF1ZXVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYWEzZjkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkUXVldWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZDsKLQotLyoqCi0gKiBUaHJlYWQtc2FmZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFF1ZXVlfSBpbnRlcmZhY2UuCi0gKiBUaGlzIGFsc28gcHJvdmlkZXMgcHJvdG9jb2wgZm9yIHN1c3BlbmRpbmcgYSB0aHJlYWQgdW50aWwgdGhlCi0gKiBxdWV1ZSBpcyBlbXB0eSBvciBub3QgZW1wdHksIHdpdGggb3B0aW9uYWwgdGltZS1vdXRzLgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkUXVldWU8RT4KLQlpbXBsZW1lbnRzIFF1ZXVlPEU+LCBTZXJpYWxpemFibGUKLXsKLQkvKiogQmFja2luZyBxdWV1ZS4gKi8KLQlwcml2YXRlIGZpbmFsIFF1ZXVlPEU+IHF1ZXVlOwotCi0JLyoqIE9iamVjdCB0byBzeW5jaHJvbml6ZSBvbi4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBtdXRleDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzeW5jaHJvbml6ZWQgcXVldWUgdGhhdCB3cmFwcyB0aGUKLQkgKiBzcGVjaWZpZWQgcXVldWUgYW5kIGxvY2tzIG9uIHRoZSBzcGVjaWZpZWQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZFF1ZXVlKFF1ZXVlPEU+IHF1ZXVlLCBPYmplY3QgbXV0ZXgpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChxdWV1ZSA9PSBudWxsKSB8fCAobXV0ZXggPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucXVldWUgPSBxdWV1ZTsKLQkJdGhpcy5tdXRleCA9IG11dGV4OwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN5bmNocm9uaXplZCBxdWV1ZSB0aGF0IHdyYXBzIHRoZQotCSAqIHNwZWNpZmllZCBxdWV1ZSBhbmQgbG9ja3Mgb24gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRRdWV1ZShRdWV1ZTxFPiBxdWV1ZSkgewotCQlzdXBlcigpOwotCQlpZiAocXVldWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5xdWV1ZSA9IHF1ZXVlOwotCQl0aGlzLm11dGV4ID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gZW1wdHkgc3luY2hyb25pemVkIHF1ZXVlIHRoYXQgbG9ja3Mgb24gdGhlIHNwZWNpZmllZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkUXVldWUoT2JqZWN0IG11dGV4KSB7Ci0JCXRoaXMobmV3IFNpbXBsZVF1ZXVlPEU+KCksIG11dGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gZW1wdHkgc3luY2hyb25pemVkIHF1ZXVlIHRoYXQgbG9ja3Mgb24gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRRdWV1ZSgpIHsKLQkJdGhpcyhuZXcgU2ltcGxlUXVldWU8RT4oKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFF1ZXVlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGVucXVldWUoRSBlbGVtZW50KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy5lbnF1ZXVlXyhlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCBlbnF1ZXVlXyhFIGVsZW1lbnQpIHsKLQkJdGhpcy5xdWV1ZS5lbnF1ZXVlKGVsZW1lbnQpOwotCQl0aGlzLm11dGV4Lm5vdGlmeUFsbCgpOwotCX0KLQotCXB1YmxpYyBFIGRlcXVldWUoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuZGVxdWV1ZV8oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgRSBkZXF1ZXVlXygpIHsKLQkJRSBlbGVtZW50ID0gdGhpcy5xdWV1ZS5kZXF1ZXVlKCk7Ci0JCXRoaXMubXV0ZXgubm90aWZ5QWxsKCk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBFIHBlZWsoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMucXVldWUucGVlaygpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5xdWV1ZS5pc0VtcHR5KCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5kZWZpbml0ZSB3YWl0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgcXVldWUncyBlbXB0eSBzdGF0dXMgY2hhbmdlcwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsRW1wdHlJcyhib29sZWFuIGVtcHR5KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsRW1wdHlJc18oZW1wdHkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbEVtcHR5SXNfKGJvb2xlYW4gZW1wdHkpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXdoaWxlICh0aGlzLnF1ZXVlLmlzRW1wdHkoKSAhPSBlbXB0eSkgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgcXVldWUgaXMgZW1wdHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsRW1wdHkoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbEVtcHR5SXModHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHF1ZXVlIGhhcyBzb21ldGhpbmcgb24gaXQuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsTm90RW1wdHkoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbEVtcHR5SXMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBxdWV1ZSBpcyBlbXB0eSwKLQkgKiB0aGVuICJlbnF1ZXVlIiB0aGUgc3BlY2lmaWVkIGl0ZW0gdG8gdGhlIHRhaWwgb2YgdGhlIHF1ZXVlCi0JICogYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VG9FbnF1ZXVlKEUgZWxlbWVudCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbEVtcHR5SXNfKHRydWUpOwotCQkJdGhpcy5lbnF1ZXVlXyhlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBxdWV1ZSBoYXMgc29tZXRoaW5nIG9uIGl0LAotCSAqIHRoZW4gImRlcXVldWUiIGFuIGl0ZW0gZnJvbSB0aGUgaGVhZCBvZiB0aGUgcXVldWUgYW5kIHJldHVybiBpdC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHdhaXRUb0RlcXVldWUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsRW1wdHlJc18oZmFsc2UpOwotCQkJcmV0dXJuIHRoaXMuZGVxdWV1ZV8oKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB0aW1lZCB3YWl0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgcXVldWUncyBlbXB0eSBzdGF0dXMgY2hhbmdlcwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkCi0JICogZW1wdHkgc3RhdHVzIHdhcyBhY2hpZXZlZDsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSBxdWV1ZSdzIGVtcHR5IHN0YXR1cyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgdmFsdWUsCi0JICogcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxFbXB0eUlzKGJvb2xlYW4gZW1wdHksIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy53YWl0VW50aWxFbXB0eUlzXyhlbXB0eSwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gd2FpdFVudGlsRW1wdHlJc18oYm9vbGVhbiBlbXB0eSwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJdGhpcy53YWl0VW50aWxFbXB0eUlzXyhlbXB0eSk7CS8vIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIG5vdGlmaWVkCi0JCQlyZXR1cm4gdHJ1ZTsJLy8gaWYgaXQgZXZlciBjb21lcyBiYWNrLCB0aGUgY29uZGl0aW9uIHdhcyBtZXQKLQkJfQotCi0JCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJbG9uZyByZW1haW5pbmcgPSB0aW1lb3V0OwotCQl3aGlsZSAoKHRoaXMucXVldWUuaXNFbXB0eSgpICE9IGVtcHR5KSAmJiAocmVtYWluaW5nID4gMEwpKSB7Ci0JCQl0aGlzLm11dGV4LndhaXQocmVtYWluaW5nKTsKLQkJCXJlbWFpbmluZyA9IHN0b3AgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlyZXR1cm4gKHRoaXMucXVldWUuaXNFbXB0eSgpID09IGVtcHR5KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgcXVldWUgaXMgZW1wdHkKLQkgKiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmCi0JICogdGhlIHF1ZXVlIGlzIGVtcHR5OyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHF1ZXVlIGlzIGFscmVhZHkgZW1wdHksIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsRW1wdHkobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxFbXB0eUlzKHRydWUsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBxdWV1ZSBoYXMgc29tZXRoaW5nIG9uIGl0LgotCSAqIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYKLQkgKiB0aGUgcXVldWUgaXMgbm90IGVtcHR5OyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHF1ZXVlIGFscmVhZHkgaGFzIHNvbWV0aGluZyBvbiBpdCwgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxOb3RFbXB0eShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbEVtcHR5SXMoZmFsc2UsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBxdWV1ZSBpcyBlbXB0eSwKLQkgKiB0aGVuICJlbnF1ZXVlIiB0aGUgc3BlY2lmaWVkIGl0ZW0gdG8gdGhlIHRhaWwgb2YgdGhlIHF1ZXVlCi0JICogYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4gSWYgdGhlIHF1ZXVlIGlzIG5vdCBlbXB0aWVkIG91dAotCSAqIGJlZm9yZSB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZSBleGVjdXRpbmcgd2l0aG91dAotCSAqICJlbnF1ZXVlaW5nIiB0aGUgaXRlbS4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZQotCSAqIGl0ZW0gd2FzIGVucXVldWVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHF1ZXVlIGlzIGFscmVhZHkgZW1wdHksICJlbnF1ZXVlIiB0aGUgc3BlY2lmaWVkIGl0ZW0gYW5kCi0JICogcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9FbnF1ZXVlKEUgZWxlbWVudCwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHRoaXMud2FpdFVudGlsRW1wdHlJc18odHJ1ZSwgdGltZW91dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCXRoaXMuZW5xdWV1ZV8oZWxlbWVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VjY2VzczsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBxdWV1ZSBoYXMgc29tZXRoaW5nIG9uIGl0LAotCSAqIHRoZW4gImRlcXVldWUiIGFuIGl0ZW0gZnJvbSB0aGUgaGVhZCBvZiB0aGUgcXVldWUgYW5kIHJldHVybiBpdC4KLQkgKiBJZiB0aGUgcXVldWUgaXMgZW1wdHkgYW5kIG5vdGhpbmcgaXMgImVucXVldWVkIiBvbiB0byBpdCBiZWZvcmUgdGhlCi0JICogdGltZS1vdXQsIHRocm93IGEgbm8gc3VjaCBlbGVtZW50IGV4Y2VwdGlvbi4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4KLQkgKiBJZiB0aGUgcXVldWUgaXMgbm90IGVtcHR5LCAiZGVxdWV1ZSIgYW4gaXRlbSBhbmQKLQkgKiByZXR1cm4gaXQgaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBPYmplY3Qgd2FpdFRvRGVxdWV1ZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gdGhpcy53YWl0VW50aWxFbXB0eUlzXyhmYWxzZSwgdGltZW91dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCXJldHVybiB0aGlzLmRlcXVldWVfKCk7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplZCBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgbm90IGludGVycnVwdGVkLCBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCAKLQkgKiB3aXRoIHRoZSBtdXRleCBsb2NrZWQuIFRoaXMgaXMgdXNlZnVsIGZvciBpbml0aWFsaXppbmcgdGhlIHF1ZXVlIGluIGFub3RoZXIKLQkgKiB0aHJlYWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpLmlzSW50ZXJydXB0ZWQoKSkgewotCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGRpdGlvbmFsIHB1YmxpYyBwcm90b2NvbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiAiRHJhaW4iIGFsbCB0aGUgY3VycmVudCBpdGVtcyBmcm9tIHRoZSBxdWV1ZSBpbnRvIHNwZWNpZmllZCBxdWV1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkcmFpblRvKFF1ZXVlPEU+IHEpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLmRyYWluVG9fKHEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRyYWluVG9fKFF1ZXVlPEU+IHEpIHsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCXdoaWxlICggISB0aGlzLnF1ZXVlLmlzRW1wdHkoKSkgewotCQkJcS5lbnF1ZXVlKHRoaXMucXVldWUuZGVxdWV1ZSgpKTsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCWlmIChjaGFuZ2VkKSB7Ci0JCQl0aGlzLm11dGV4Lm5vdGlmeUFsbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYmplY3QgdGhlIHF1ZXVlIGxvY2tzIG9uIHdoaWxlIHBlcmZvcm1pbmcKLQkgKiBpdHMgb3BlcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE11dGV4KCkgewotCQlyZXR1cm4gdGhpcy5tdXRleDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiAnWycgKyB0aGlzLnF1ZXVlLnRvU3RyaW5nKCkgKyAnXSc7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gcykgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRTdGFjay5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkU3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiYjRjZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kOwotCi0vKioKLSAqIFRocmVhZC1zYWZlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgU3RhY2t9IGludGVyZmFjZS4KLSAqIFRoaXMgYWxzbyBwcm92aWRlcyBwcm90b2NvbCBmb3Igc3VzcGVuZGluZyBhIHRocmVhZCB1bnRpbCB0aGUKLSAqIHN0YWNrIGlzIGVtcHR5IG9yIG5vdCBlbXB0eSwgd2l0aCBvcHRpb25hbCB0aW1lLW91dHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRTdGFjazxFPgotCWltcGxlbWVudHMgU3RhY2s8RT4sIFNlcmlhbGl6YWJsZQotewotCS8qKiBCYWNraW5nIHN0YWNrLiAqLwotCXByaXZhdGUgZmluYWwgU3RhY2s8RT4gc3RhY2s7Ci0KLQkvKiogT2JqZWN0IHRvIHN5bmNocm9uaXplIG9uLiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0IG11dGV4OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN5bmNocm9uaXplZCBzdGFjayB0aGF0IHdyYXBzIHRoZQotCSAqIHNwZWNpZmllZCBzdGFjayBhbmQgbG9ja3Mgb24gdGhlIHNwZWNpZmllZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkU3RhY2soU3RhY2s8RT4gc3RhY2ssIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQlpZiAoc3RhY2sgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5zdGFjayA9IHN0YWNrOwotCQl0aGlzLm11dGV4ID0gbXV0ZXg7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3luY2hyb25pemVkIHN0YWNrIHRoYXQgd3JhcHMgdGhlCi0JICogc3BlY2lmaWVkIHN0YWNrIGFuZCBsb2NrcyBvbiBpdHNlbGYuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZFN0YWNrKFN0YWNrPEU+IHN0YWNrKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChzdGFjayA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnN0YWNrID0gc3RhY2s7Ci0JCXRoaXMubXV0ZXggPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBlbXB0eSBzeW5jaHJvbml6ZWQgc3RhY2sgdGhhdCBsb2NrcyBvbiB0aGUgc3BlY2lmaWVkIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRTdGFjayhPYmplY3QgbXV0ZXgpIHsKLQkJdGhpcyhuZXcgU2ltcGxlU3RhY2s8RT4oKSwgbXV0ZXgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBlbXB0eSBzeW5jaHJvbml6ZWQgc3RhY2sgdGhhdCBsb2NrcyBvbiBpdHNlbGYuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZFN0YWNrKCkgewotCQl0aGlzKG5ldyBTaW1wbGVTdGFjazxFPigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3RhY2sgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgcHVzaChFIGVsZW1lbnQpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLnB1c2hfKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHB1c2hfKEUgZWxlbWVudCkgewotCQl0aGlzLnN0YWNrLnB1c2goZWxlbWVudCk7Ci0JCXRoaXMubXV0ZXgubm90aWZ5QWxsKCk7Ci0JfQotCi0JcHVibGljIEUgcG9wKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnBvcF8oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgRSBwb3BfKCkgewotCQlFIG8gPSB0aGlzLnN0YWNrLnBvcCgpOwotCQl0aGlzLm11dGV4Lm5vdGlmeUFsbCgpOwotCQlyZXR1cm4gbzsKLQl9Ci0KLQlwdWJsaWMgRSBwZWVrKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnN0YWNrLnBlZWsoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuc3RhY2suaXNFbXB0eSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluZGVmaW5pdGUgd2FpdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrJ3MgZW1wdHkgc3RhdHVzIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEVtcHR5SXMoYm9vbGVhbiBlbXB0eSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbEVtcHR5SXNfKGVtcHR5KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCB3YWl0VW50aWxFbXB0eUlzXyhib29sZWFuIGVtcHR5KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl3aGlsZSAodGhpcy5zdGFjay5pc0VtcHR5KCkgIT0gZW1wdHkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrIGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEVtcHR5KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxFbXB0eUlzKHRydWUpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjayBoYXMgc29tZXRoaW5nIG9uIGl0LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdEVtcHR5KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxFbXB0eUlzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3RhY2sgaXMgZW1wdHksCi0JICogdGhlbiAicHVzaCIgdGhlIHNwZWNpZmllZCBpdGVtIG9uIHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0JICogYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VG9QdXNoKEUgZWxlbWVudCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbEVtcHR5SXNfKHRydWUpOwotCQkJdGhpcy5wdXNoXyhlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjayBoYXMgc29tZXRoaW5nIG9uIGl0LAotCSAqIHRoZW4gInBvcCIgYW4gaXRlbSBmcm9tIHRoZSB0b3Agb2YgdGhlIHN0YWNrIGFuZCByZXR1cm4gaXQuCi0JICovCi0JcHVibGljIE9iamVjdCB3YWl0VG9Qb3AoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsRW1wdHlJc18oZmFsc2UpOwotCQkJcmV0dXJuIHRoaXMucG9wXygpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRpbWVkIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjaydzIGVtcHR5IHN0YXR1cyBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQKLQkgKiBlbXB0eSBzdGF0dXMgd2FzIGFjaGlldmVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHN0YWNrJ3MgZW1wdHkgc3RhdHVzIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCB2YWx1ZSwKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbEVtcHR5SXMoYm9vbGVhbiBlbXB0eSwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbEVtcHR5SXNfKGVtcHR5LCB0aW1lb3V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB3YWl0VW50aWxFbXB0eUlzXyhib29sZWFuIGVtcHR5LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQl0aGlzLndhaXRVbnRpbEVtcHR5SXNfKGVtcHR5KTsJLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCXJldHVybiB0cnVlOwkvLyBpZiBpdCBldmVyIGNvbWVzIGJhY2ssIHRoZSBjb25kaXRpb24gd2FzIG1ldAotCQl9Ci0KLQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotCQlsb25nIHJlbWFpbmluZyA9IHRpbWVvdXQ7Ci0JCXdoaWxlICgodGhpcy5zdGFjay5pc0VtcHR5KCkgIT0gZW1wdHkpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXJldHVybiAodGhpcy5zdGFjay5pc0VtcHR5KCkgPT0gZW1wdHkpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjayBpcyBlbXB0eQotCSAqIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYKLQkgKiB0aGUgc3RhY2sgaXMgZW1wdHk7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgc3RhY2sgaXMgYWxyZWFkeSBlbXB0eSwgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxFbXB0eShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbEVtcHR5SXModHJ1ZSwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrIGhhcyBzb21ldGhpbmcgb24gaXQuCi0JICogb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZgotCSAqIHRoZSBzdGFjayBpcyBub3QgZW1wdHk7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgc3RhY2sgYWxyZWFkeSBoYXMgc29tZXRoaW5nIG9uIGl0LCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbE5vdEVtcHR5KGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsRW1wdHlJcyhmYWxzZSwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrIGlzIGVtcHR5LAotCSAqIHRoZW4gInB1c2giIHRoZSBzcGVjaWZpZWQgaXRlbSBvbiB0byB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqIGFuZCBjb250aW51ZSBleGVjdXRpbmcuIElmIHRoZSBzdGFjayBpcyBub3QgZW1wdGllZCBvdXQKLQkgKiBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUgZXhlY3V0aW5nIHdpdGhvdXQKLQkgKiAicHVzaGluZyIgdGhlIGl0ZW0uCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUKLQkgKiBpdGVtIHdhcyBwdXNoZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgc3RhY2sgaXMgYWxyZWFkeSBlbXB0eSwgInB1c2giIHRoZSBzcGVjaWZpZWQgaXRlbSBhbmQKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb1B1c2goRSBlbGVtZW50LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gdGhpcy53YWl0VW50aWxFbXB0eUlzXyh0cnVlLCB0aW1lb3V0KTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJdGhpcy5wdXNoXyhlbGVtZW50KTsKLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrIGhhcyBzb21ldGhpbmcgb24gaXQsCi0JICogdGhlbiAicG9wIiBhbiBpdGVtIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2sgYW5kIHJldHVybiBpdC4KLQkgKiBJZiB0aGUgc3RhY2sgaXMgZW1wdHkgYW5kIG5vdGhpbmcgaXMgInB1c2hlZCIgb24gdG8gaXQgYmVmb3JlIHRoZQotCSAqIHRpbWUtb3V0LCB0aHJvdyBhbiBlbXB0eSBzdGFjayBleGNlcHRpb24uCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuCi0JICogSWYgdGhlIHN0YWNrIGlzIG5vdCBlbXB0eSwgInBvcCIgYW4gaXRlbSBhbmQKLQkgKiByZXR1cm4gaXQgaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBPYmplY3Qgd2FpdFRvUG9wKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbEVtcHR5SXNfKGZhbHNlLCB0aW1lb3V0KTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJcmV0dXJuIHRoaXMucG9wXygpOwotCQkJfQotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZWQgYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBpbnRlcnJ1cHRlZCwgZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgCi0JICogd2l0aCB0aGUgbXV0ZXggbG9ja2VkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgaW5pdGlhbGl6aW5nIHRoZSBzdGFjayBpbiBhbm90aGVyCi0JICogdGhyZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pc0ludGVycnVwdGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkaXRpb25hbCBwdWJsaWMgcHJvdG9jb2wgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYmplY3QgdGhlIHN0YWNrIGxvY2tzIG9uIHdoaWxlIHBlcmZvcm1pbmcKLQkgKiBpdHMgb3BlcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE11dGV4KCkgewotCQlyZXR1cm4gdGhpcy5tdXRleDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiAnWycgKyB0aGlzLnN0YWNrLnRvU3RyaW5nKCkgKyAnXSc7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gcykgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1Rvb2xzLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Ub29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGUzNmU3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1Rvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBWYXJpb3VzIHV0aWxpdHkgbWV0aG9kcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgVG9vbHMgewotCi0JLy8gKioqKioqKioqKiBvYmplY3QgY29tcGFyaXNvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHZhbHVlcyBhcmUgZXF1YWwsIHdpdGggdGhlIGFwcHJvcHJpYXRlCi0JICogPGNvZGU+bnVsbDwvY29kZT4gY2hlY2tzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWx1ZXNBcmVFcXVhbChPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0JCXJldHVybiAodmFsdWUxID09IG51bGwpID8KLQkJCQkodmFsdWUyID09IG51bGwpIDoKLQkJCQkoKHZhbHVlMiAhPSBudWxsKSAmJiB2YWx1ZTEuZXF1YWxzKHZhbHVlMikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdmFsdWVzIGFyZSBkaWZmZXJlbnQsIHdpdGggdGhlIGFwcHJvcHJpYXRlCi0JICogPGNvZGU+bnVsbDwvY29kZT4gY2hlY2tzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWx1ZXNBcmVEaWZmZXJlbnQoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQlyZXR1cm4gKHZhbHVlMSA9PSBudWxsKSA/Ci0JCQkJKHZhbHVlMiAhPSBudWxsKSA6Ci0JCQkJKCh2YWx1ZTIgPT0gbnVsbCkgfHwgISB2YWx1ZTEuZXF1YWxzKHZhbHVlMikpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogU3lzdGVtIHByb3BlcnRpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgSlZNIGlzIFN1bidzIChvciBPcmFjbGUncykuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGp2bUlzU3VuKCkgewotCQlyZXR1cm4ganZtSXMoIlN1biIpIHx8IGp2bUlzKCJPcmFjbGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCBKVk0gaXMgSUJNJ3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGp2bUlzSUJNKCkgewotCQlyZXR1cm4ganZtSXMoIklCTSIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4ganZtSXMoU3RyaW5nIGp2bVZlbmRvck5hbWUpIHsKLQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZW5kb3IiKS5zdGFydHNXaXRoKGp2bVZlbmRvck5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gaXMgTWljcm9zb2Z0IFdpbmRvd3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9zSXNXaW5kb3dzKCkgewotCQlyZXR1cm4gb3NJcygiV2luZG93cyIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gaXMgTGludXguCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9zSXNMaW51eCgpIHsKLQkJcmV0dXJuIG9zSXMoIkxpbnV4Iik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpcyBNYWMgT1MgWC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3NJc01hYygpIHsKLQkJcmV0dXJuIG9zSXMoIk1hYyIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gb3NJcyhTdHJpbmcgb3NOYW1lKSB7Ci0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5pbmRleE9mKG9zTmFtZSkgIT0gLTE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvVHJhbnNmb3JtZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1RyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYTk4MmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogVXNlZCBieSB2YXJpb3VzICJwbHVnZ2FibGUiIGNsYXNzZXMgdG8gdHJhbnNmb3JtIG9iamVjdHMuCi0gKiBUcmFuc2Zvcm0gYW4gb2JqZWN0IG9mIHR5cGUgPGNvZGU+VDE8L2NvZGU+IHRvIGFuIG9iamVjdCBvZiB0eXBlCi0gKiA8Y29kZT5UMjwvY29kZT4uCi0gKiAKLSAqIEBwYXJhbSA8VDE+IHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgcGFzc2VkIHRvIHRoZSB0cmFuc2Zvcm1lcgotICogQHBhcmFtIDxUMj4gdGhlIHR5cGUgb2YgdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgdHJhbnNmb3JtZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBUcmFuc2Zvcm1lcjxUMSwgVDI+IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdHJhbnNmb3JtZWQgb2JqZWN0LgotCSAqIFRoZSBzZW1hbnRpY3Mgb2YgInRyYW5zZm9ybSIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0JVDIgdHJhbnNmb3JtKFQxIG8pOwotCi0KLQkvKioKLQkgKiBBICJudWxsIiB0cmFuc2Zvcm1lciB3aWxsIHBlcmZvcm0gbm8gdHJhbnNmb3JtYXRpb24gYXQgYWxsOwotCSAqIGl0IHdpbGwgc2ltcGx5IHJldHVybiB0aGUgb2JqZWN0ICJ1bnRyYW5zZm9ybWVkIi4KLQkgKi8KLQlmaW5hbCBjbGFzcyBOdWxsPFMxLCBTMj4KLQkJaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxTMSwgUzI+LCBTZXJpYWxpemFibGUKLQl7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8UjEsIFIyPiBUcmFuc2Zvcm1lcjxSMSwgUjI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBzaW1wbHkgcmV0dXJuIHRoZSBvYmplY3QsIHVuY2hhbmdlZAotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIFMyIHRyYW5zZm9ybShTMSBvKSB7Ci0JCQlyZXR1cm4gKFMyKSBvOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEEgImRpc2FibGVkIiB0cmFuc2Zvcm1lciB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZgotCSAqIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IGlzIGNhbGxlZC4gVGhpcyBpcyB1c2VmdWwgaW4gc2l0dWF0aW9ucwotCSAqIHdoZXJlIGEgdHJhbnNmb3JtZXIgaXMgb3B0aW9uYWwgYW5kIHRoZSBkZWZhdWx0IHRyYW5zZm9ybWVyIHNob3VsZAotCSAqIG5vdCBiZSB1c2VkLgotCSAqLwotCWZpbmFsIGNsYXNzIERpc2FibGVkPFMxLCBTMj4KLQkJaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxTMSwgUzI+LCBTZXJpYWxpemFibGUKLQl7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXIgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFIxLCBSMj4gVHJhbnNmb3JtZXI8UjEsIFIyPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgUzIgdHJhbnNmb3JtKFMxIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1RyYW5zZm9ybWVyQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvVHJhbnNmb3JtZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NDI3YTIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvVHJhbnNmb3JtZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSB0cmFuc2Zvcm1lciB0aGF0IHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gZm9yIGV2ZXJ5Ci0gKiB0cmFuc2Zvcm1hdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWVyQWRhcHRlcjxUMSwgVDI+Ci0JaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxUMSwgVDI+Ci17Ci0JcHVibGljIFQyIHRyYW5zZm9ybShUMSBvKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1ZlcnNpb25Db21wYXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9WZXJzaW9uQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWE5NjAzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1ZlcnNpb25Db21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBUaGlzIGNvbXBhcmF0b3IgY2FuIGJlIHVzZWQgdG8gY29tcGFyZSB2ZXJzaW9uIHN0cmluZ3MgKGUuZy4gIjIuMi4yIiB2cy4KLSAqICIyLjE0LjMiKS4gQ2xpZW50cyBjYW4gc3BlY2lmeSB0aGUgZGVsaW1pdGVyKHMpIHRoYXQgc2VwYXJhdGVzIGEgdmVyc2lvbidzCi0gKiA8ZW0+c2VnbWVudHM8L2VtPiBhcyB3ZWxsIGFzIGEgcGFyc2VyIHRvIGJlIHVzZWQgZm9yIHBhcnNpbmcgZWFjaAotICogPGVtPnNlZ21lbnQ8L2VtPi4KLSAqIAotICogQHNlZSAjSU5URUdFUl9WRVJTSU9OX0NPTVBBUkFUT1IKLSAqLwotcHVibGljIGNsYXNzIFZlcnNpb25Db21wYXJhdG9yPFQgZXh0ZW5kcyBDb21wYXJhYmxlPFQ+PgotCWltcGxlbWVudHMgQ29tcGFyYXRvcjxTdHJpbmc+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVsaW1pdGVyczsKLQlwcml2YXRlIGZpbmFsIFNlZ21lbnRQYXJzZXI8VD4gc2VnbWVudFBhcnNlcjsKLQotCi0JLyoqCi0JICogU3RhdGljIGltcGxlbWVudGF0aW9uIG9mIHRoZSB2ZXJzaW9uIGNvbXBhcmF0b3IgaW50ZXJmYWNlIHRoYXQgY29udmVydHMKLQkgKiBlYWNoIHZlcnNpb24gaW50byBhIHNlcmllcyBvZiBpbnRlZ2VycyBhbmQgY29tcGFyZXMgdGhlbS4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBXaXRoIHRoaXMgY29tcGFyYXRvciA8Y29kZT4iMi4xNCIgPiAiMi4yIjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8U3RyaW5nPiBJTlRFR0VSX1ZFUlNJT05fQ09NUEFSQVRPUiA9IG5ldyBWZXJzaW9uQ29tcGFyYXRvcjxJbnRlZ2VyPihTZWdtZW50UGFyc2VyLkludGVnZXJTZWdtZW50UGFyc2VyLmluc3RhbmNlKCkpOwotCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBkZWxpbWl0ZXIgaXMgPGNvZGU+Jy4nPC9jb2RlPi4KLQkgKiBUaGUgZGVmYXVsdCBzZWdtZW50IHBhcnNlciBpcyBkaXNhYmxlZC4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBTdWJjbGFzcyBtdXN0IG92ZXJyaWRlOjx1bD4KLQkgKiAgICAgPGxpPntAbGluayAjcGFyc2VTZWdtZW50KGludCwgU3RyaW5nKX0KLQkgKiAgICAgPGxpPntAbGluayAjZ2V0WmVybygpfQotCSAqIDwvdWw+Ci0JICovCi0JcHJvdGVjdGVkIFZlcnNpb25Db21wYXJhdG9yKCkgewotCQl0aGlzKCIuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzZWdtZW50IHBhcnNlciBpcyBkaXNhYmxlZC4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBTdWJjbGFzcyBtdXN0IG92ZXJyaWRlOjx1bD4KLQkgKiAgICAgPGxpPntAbGluayAjcGFyc2VTZWdtZW50KGludCwgU3RyaW5nKX0KLQkgKiAgICAgPGxpPntAbGluayAjZ2V0WmVybygpfQotCSAqIDwvdWw+Ci0JICovCi0JcHJvdGVjdGVkIFZlcnNpb25Db21wYXJhdG9yKFN0cmluZyBkZWxpbWl0ZXJzKSB7Ci0JCXRoaXMoZGVsaW1pdGVycywgU2VnbWVudFBhcnNlci5EaXNhYmxlZC48VD5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBzZWdtZW50IHBhcnNlci4KLQkgKiBUaGUgZGVmYXVsdCBkZWxpbWl0ZXIgaXMgPGNvZGU+Jy4nPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgVmVyc2lvbkNvbXBhcmF0b3IoU2VnbWVudFBhcnNlcjxUPiBzZWdtZW50UGFyc2VyKSB7Ci0JCXRoaXMoIi4iLCBzZWdtZW50UGFyc2VyKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcnMgYW5kIHNlZ21lbnQgcGFyc2VyLgotCSAqLwotCXB1YmxpYyBWZXJzaW9uQ29tcGFyYXRvcihTdHJpbmcgZGVsaW1pdGVycywgU2VnbWVudFBhcnNlcjxUPiBzZWdtZW50UGFyc2VyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGVsaW1pdGVycyA9IGRlbGltaXRlcnM7Ci0JCXRoaXMuc2VnbWVudFBhcnNlciA9IHNlZ21lbnRQYXJzZXI7Ci0JfQotCi0KLQkvKioKLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBDYWxsZXJzIG11c3QgaGFuZGxlIGFueSBleGNlcHRpb25zIHRocm93biBieSB0aGUKLQkgKiBzZWdtZW50IHBhcnNlciBzdXBwbGllZCB0byB0aGUgY29tcGFyYXRvci4gSW4gcGFydGljdWxhciwgdGhlIHByZS1idWlsdAotCSAqIGludGVnZXIgc2VnbWVudCBwYXJzZXIge0BsaW5rICNJTlRFR0VSX1ZFUlNJT05fQ09NUEFSQVRPUn0gY2FuIHRocm93IGEKLQkgKiB7QGxpbmsgTnVtYmVyRm9ybWF0RXhjZXB0aW9ufSBpZiBhbnkgc2VnZW1lbnQgc3RyaW5nIGNvbnRhaW5zIG5vbi1udW1lcmljCi0JICogY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHZlcnNpb24xLCBTdHJpbmcgdmVyc2lvbjIpIHsKLQkJQXJyYXlMaXN0PFQ+IHNlZ21lbnRzMSA9IHRoaXMucGFyc2VWZXJzaW9uKHZlcnNpb24xKTsKLQkJQXJyYXlMaXN0PFQ+IHNlZ21lbnRzMiA9IHRoaXMucGFyc2VWZXJzaW9uKHZlcnNpb24yKTsKLQkJaW50IHNpemUxID0gc2VnbWVudHMxLnNpemUoKTsKLQkJaW50IHNpemUyID0gc2VnbWVudHMyLnNpemUoKTsKLQkJaW50IG1pbiA9IE1hdGgubWluKHNpemUxLCBzaXplMik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWluOyBpKyspIHsKLQkJCWludCBzZWdtZW50Q29tcGFyZSA9IHNlZ21lbnRzMS5nZXQoaSkuY29tcGFyZVRvKHNlZ21lbnRzMi5nZXQoaSkpOwotCQkJaWYgKHNlZ21lbnRDb21wYXJlICE9IDApIHsKLQkJCQlyZXR1cm4gc2VnbWVudENvbXBhcmU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc2l6ZTEgPT0gc2l6ZTIpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJaW50IG1heCA9IE1hdGgubWF4KHNpemUxLCBzaXplMik7Ci0JCVQgemVybyA9IHRoaXMuZ2V0WmVybygpOwotCQlpZiAoc2l6ZTEgPCBzaXplMikgewotCQkJZm9yIChpbnQgaSA9IG1pbjsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJaW50IHNlZ21lbnRDb21wYXJlID0gemVyby5jb21wYXJlVG8oc2VnbWVudHMyLmdldChpKSk7Ci0JCQkJaWYgKHNlZ21lbnRDb21wYXJlICE9IDApIHsKLQkJCQkJcmV0dXJuIHNlZ21lbnRDb21wYXJlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGkgPSBtaW47IGkgPCBtYXg7IGkrKykgewotCQkJCWludCBzZWdtZW50Q29tcGFyZSA9IHNlZ21lbnRzMS5nZXQoaSkuY29tcGFyZVRvKHplcm8pOwotCQkJCWlmIChzZWdtZW50Q29tcGFyZSAhPSAwKSB7Ci0JCQkJCXJldHVybiBzZWdtZW50Q29tcGFyZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogUGFyc2UgdGhlIHNwZWNpZmllZCB2ZXJzaW9uIGludG8gYSBsaXN0IG9mIHNlZ21lbnRzIHRoYXQgY2FuIGJlCi0JICogY29tcGFyZWQgaW5kaXZpZHVhbGx5LgotCSAqLwotCXByb3RlY3RlZCBBcnJheUxpc3Q8VD4gcGFyc2VWZXJzaW9uKFN0cmluZyBzKSB7Ci0JCUFycmF5TGlzdDxUPiBzZWdtZW50cyA9IG5ldyBBcnJheUxpc3Q8VD4oKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZ1Rva2VuaXplciBzdHJlYW0gPSBuZXcgU3RyaW5nVG9rZW5pemVyKHMsIHRoaXMuZGVsaW1pdGVycyk7IHN0cmVhbS5oYXNNb3JlVG9rZW5zKCk7ICkgewotCQkJc2VnbWVudHMuYWRkKHRoaXMucGFyc2VTZWdtZW50KGkrKywgc3RyZWFtLm5leHRUb2tlbigpKSk7Ci0JCX0KLQkJcmV0dXJuIHNlZ21lbnRzOwotCX0KLQotCS8qKgotCSAqIFBhcnNlIHRoZSBzcGVjaWZpZWQgc2VnbWVudCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBjb21wYXJhYmxlLgotCSAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiBhIHNlZ21lbnQgcGFyc2VyIGlzIG5vdCBwYXNzZWQKLQkgKiB0byB0aGUgdmVyc2lvbiBjb21wYXJhdG9yJ3MgY29uc3RydWN0b3IuCi0JICovCi0JcHJvdGVjdGVkIFQgcGFyc2VTZWdtZW50KGludCBpbmRleCwgU3RyaW5nIHMpIHsKLQkJcmV0dXJuIHRoaXMuc2VnbWVudFBhcnNlci5wYXJzZShpbmRleCwgcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFQgZ2V0WmVybygpIHsKLQkJcmV0dXJuIHRoaXMuc2VnbWVudFBhcnNlci5nZXRaZXJvKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBBIHNlZ21lbnQgcGFyc2VyIGlzIHVzZWQgYnkgYSB2ZXJzaW9uIGNvbXBhcmF0b3IgdG8gY29udmVydCBlYWNoCi0JICogPGVtPnNlZ21lbnQ8L2VtPiBvZiBhIHZlcnNpb24gaW50byBzb21ldGhpbmcgdGhhdCBjYW4gYmUgY29tcGFyZWQgdG8gdGhlCi0JICogY29ycmVzcG9uZGluZyA8ZW0+c2VnbWVudDwvZW0+IGluIGFub3RoZXIgdmVyc2lvbi4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIFNlZ21lbnRQYXJzZXI8VCBleHRlbmRzIENvbXBhcmFibGU8VD4+IHsKLQkJLyoqCi0JCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCB2ZXJzaW9uIDxlbT5zZWdtZW50PC9lbT4gaW50byBzb21ldGhpbmcgdGhhdAotCQkgKiBjYW4gYmUgY29tcGFyZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgPGVtPnNlZ21lbnQ8L2VtPiBpbiBhbm90aGVyCi0JCSAqIHZlcnNpb24uCi0JCSAqLwotCQlUIHBhcnNlKGludCBzZWdtZW50SW5kZXgsIFN0cmluZyBzZWdtZW50KTsKLQotCQkvKioKLQkJICogUmV0dXJuIGEgInplcm8iIDxlbT5zZWdtZW50PC9lbT4gdmFsdWUgdGhhdCBjYW4gYmUgY29tcGFyZWQgdG8KLQkJICogdHJhaWxpbmcgc2VnbWVudHMgd2hlbiB0d28gdmVyc2lvbiBoYXZlIGRpZmZlcmluZyBudW1iZXJzIG9mCi0JCSAqIDxlbT5zZWdtZW50czwvZW0+LgotCQkgKi8KLQkJVCBnZXRaZXJvKCk7Ci0KLQkJLyoqCi0JCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VnbWVudCBwYXJzZXIgaW50ZXJmYWNlIHRoYXQgY29udmVydHMKLQkJICogZWFjaCBzZWdtZW50IGludG8gYW4gaW50ZWdlciwgaXJyZXNwZWN0aXZlIG9mIHBvc2l0aW9uLgotCQkgKiA8cD4KLQkJICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gV2l0aCB0aGlzIHBhcnNlciA8Y29kZT4iMi4xNCIgPiAiMi4yIjwvY29kZT4KLQkJICovCi0JCWZpbmFsIGNsYXNzIEludGVnZXJTZWdtZW50UGFyc2VyCi0JCQlpbXBsZW1lbnRzIFNlZ21lbnRQYXJzZXI8SW50ZWdlcj4sIFNlcmlhbGl6YWJsZQotCQl7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFNlZ21lbnRQYXJzZXI8SW50ZWdlcj4gSU5TVEFOQ0UgPSBuZXcgSW50ZWdlclNlZ21lbnRQYXJzZXIoKTsKLQkJCXB1YmxpYyBzdGF0aWMgU2VnbWVudFBhcnNlcjxJbnRlZ2VyPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIEludGVnZXJTZWdtZW50UGFyc2VyKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyBzaW1wbHkgcGFyc2UgdGhlIHNlZ21lbnQgYXMgYW4gaW50ZWdlcgotCQkJcHVibGljIEludGVnZXIgcGFyc2UoaW50IHNlZ21lbnRJbmRleCwgU3RyaW5nIHNlZ21lbnQpIHsKLQkJCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKHNlZ21lbnQpOwotCQkJfQotCQkJcHVibGljIEludGVnZXIgZ2V0WmVybygpIHsKLQkJCQlyZXR1cm4gWkVSTzsKLQkJCX0KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgWkVSTyA9IEludGVnZXIudmFsdWVPZigwKTsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJCX0KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZWdtZW50IHBhcnNlciBpbnRlcmZhY2UgdGhhdCB0aHJvd3MKLQkJICogYW4gZXhjZXB0aW9uIGlmIGNhbGxlZC4KLQkJICovCi0JCWZpbmFsIGNsYXNzIERpc2FibGVkPFMgZXh0ZW5kcyBDb21wYXJhYmxlPFM+PgotCQkJaW1wbGVtZW50cyBTZWdtZW50UGFyc2VyPFM+LCBTZXJpYWxpemFibGUKLQkJewotCQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU2VnbWVudFBhcnNlciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSIGV4dGVuZHMgQ29tcGFyYWJsZTxSPj4gU2VnbWVudFBhcnNlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIERpc2FibGVkKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJCXB1YmxpYyBTIHBhcnNlKGludCBzZWdtZW50SW5kZXgsIFN0cmluZyBzZWdtZW50KSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgUyBnZXRaZXJvKCkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQkJfQotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1hNTFN0cmluZ0VuY29kZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1hNTFN0cmluZ0VuY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFmN2QzMC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9YTUxTdHJpbmdFbmNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotCi0vKioKLSAqIFRoaXMgZW5jb2RlciB3aWxsIHJlcGxhY2UgYW55IG9mIGEgc3BlY2lmaWVkIHNldCBvZiBjaGFyYWN0ZXJzIHdpdGggYW4gWE1MCi0gKiAiY2hhcmFjdGVyIHJlZmVyZW5jZSI6ICcvJyA9PiAiJiN4MmY7IgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MU3RyaW5nRW5jb2RlciB7Ci0KLQkvKiogVGhlIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlIGNvbnZlcnRlZCBpbnRvIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4gKi8KLQlwcml2YXRlIGZpbmFsIGNoYXJbXSBjaGFyczsKLQotCS8qKiBDYWNoZSB0aGUgdmFsdWUgb2YgdGhlIGhpZ2hlc3QgY2hhcmFjdGVyIGluIHRoZSBzZXQgYWJvdmUuICovCi0JcHJpdmF0ZSBmaW5hbCBjaGFyIG1heENoYXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBlbmNvZGVyIHRoYXQgY29udmVydHMgdGhlIHNwZWNpZmllZCBzZXQgb2YgY2hhcmFjdGVycwotCSAqIGludG8gWE1MIGNoYXJhY3RlciByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyBYTUxTdHJpbmdFbmNvZGVyKGNoYXJbXSBjaGFycykgewotCQlzdXBlcigpOwotCQlpZiAoY2hhcnMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gdGhlIGFtcGVyc2FuZCBtdXN0IGJlIGluY2x1ZGVkIHNpbmNlIGl0IGlzIHRoZSBlc2NhcGUgY2hhcmFjdGVyCi0JCWlmIChBcnJheVRvb2xzLmNvbnRhaW5zKGNoYXJzLCAnJicpKSB7Ci0JCQl0aGlzLmNoYXJzID0gY2hhcnM7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmNoYXJzID0gQXJyYXlUb29scy5hZGQoY2hhcnMsICcmJyk7Ci0JCX0KLQkJdGhpcy5tYXhDaGFyID0gdGhpcy5jYWxjdWxhdGVNYXhJbnZhbGlkRmlsZU5hbWVDaGFyKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBzZXQgb2YgY2hhcmFjdGVycyB0byBiZSBjb252ZXJ0ZWQKLQkgKiBpbnRvIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gc2hvcnQtY2lyY3VpdCB0aGUKLQkgKiBzZWFyY2ggZm9yIGEgY2hhcmFjdGVyIGluIHRoZSBzZXQuCi0JICogQHNlZSAjY2hhcklzVG9CZUVuY29kZWQoY2hhcikKLQkgKi8KLQlwcml2YXRlIGNoYXIgY2FsY3VsYXRlTWF4SW52YWxpZEZpbGVOYW1lQ2hhcigpIHsKLQkJY2hhcltdIGxvY2FsQ2hhcnMgPSB0aGlzLmNoYXJzOwotCQljaGFyIG1heCA9IDA7Ci0JCWZvciAoaW50IGkgPSBsb2NhbENoYXJzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQljaGFyIGMgPSBsb2NhbENoYXJzW2ldOwotCQkJaWYgKG1heCA8IGMpIHsKLQkJCQltYXggPSBjOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBhbnkgY2hhcmFjdGVycyBpbiB0aGUgc2V0Ci0JICogcmVwbGFjZWQgd2l0aCBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHMpIHsKLQkJaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0JCS8vIGFsbG93IGZvciBhIGZldyBlbmNvZGVkIGNoYXJhY3RlcnMKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbiArIDIwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdGhpcy5hcHBlbmRDaGFyYWN0ZXJUbyhzLmNoYXJBdChpKSwgc2IpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGFueSBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZXMKLQkgKiByZXBsYWNlZCBieSB0aGUgY2hhcmFjdGVycyB0aGVtc2VsdmVzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyBzKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihzLmxlbmd0aCgpKTsKLQkJU3RyaW5nQnVpbGRlciB0ZW1wID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsJLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJdGhpcy5kZWNvZGVUbyhuZXcgU3RyaW5nUmVhZGVyKHMpLCBzYiwgdGVtcCk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciB0byB0aGUgc3RyaW5nIGJ1ZmZlciwKLQkgKiBjb252ZXJ0aW5nIGl0IHRvIGFuIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kQ2hhcmFjdGVyVG8oY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWlmICh0aGlzLmNoYXJJc1RvQmVFbmNvZGVkKGMpKSB7Ci0JCQl0aGlzLmFwcGVuZENoYXJhY3RlclJlZmVyZW5jZVRvKGMsIHNiKTsKLQkJfSBlbHNlIHsKLQkJCXNiLmFwcGVuZChjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIG9uZSBvZiB0aGUgY2hhcmFjdGVycwotCSAqIHRvIGJlIGNvbnZlcnRlZCB0byBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZXMuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoYXJJc1RvQmVFbmNvZGVkKGNoYXIgYykgewotCQlyZXR1cm4gKGMgPD0gdGhpcy5tYXhDaGFyKSAmJiBBcnJheVRvb2xzLmNvbnRhaW5zKHRoaXMuY2hhcnMsIGMpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcidzIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlIHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyIChlLmcuICcvJyA9PiAiJiN4MmY7IikuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZENoYXJhY3RlclJlZmVyZW5jZVRvKGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoIiYjeCIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGMsIDE2KSk7Ci0JCXNiLmFwcGVuZCgnOycpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWNvZGVUbyhSZWFkZXIgcmVhZGVyLCBTdHJpbmdCdWlsZGVyIHNiLCBTdHJpbmdCdWlsZGVyIHRlbXApIHsKLQkJdHJ5IHsKLQkJCXRoaXMuZGVjb2RlVG9fKHJlYWRlciwgc2IsIHRlbXApOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlY29kZVRvXyhSZWFkZXIgcmVhZGVyLCBTdHJpbmdCdWlsZGVyIHNiLCBTdHJpbmdCdWlsZGVyIHRlbXApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBjID0gcmVhZGVyLnJlYWQoKTsKLQkJd2hpbGUgKGMgIT0gLTEpIHsKLQkJCWlmIChjID09ICcmJykgewotCQkJCXRoaXMuZGVjb2RlQ2hhcmFjdGVyUmVmZXJlbmNlVG8ocmVhZGVyLCBzYiwgdGVtcCk7Ci0JCQl9IGVsc2UgewotCQkJCXNiLmFwcGVuZCgoY2hhcikgYyk7Ci0JCQl9Ci0JCQljID0gcmVhZGVyLnJlYWQoKTsKLQkJfQotCQlyZWFkZXIuY2xvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVjb2RlQ2hhcmFjdGVyUmVmZXJlbmNlVG8oUmVhZGVyIHJlYWRlciwgU3RyaW5nQnVpbGRlciBzYiwgU3RyaW5nQnVpbGRlciB0ZW1wKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgYyA9IHJlYWRlci5yZWFkKCk7Ci0JCXRoaXMuY2hlY2tDaGFyKGMsICcjJyk7Ci0JCWMgPSByZWFkZXIucmVhZCgpOwotCQl0aGlzLmNoZWNrQ2hhcihjLCAneCcpOwotCi0JCXRlbXAuc2V0TGVuZ3RoKDApOyAgLy8gcmUtdXNlIHRlbXAKLQkJYyA9IHJlYWRlci5yZWFkKCk7Ci0JCXdoaWxlIChjICE9ICc7JykgewotCQkJdGhpcy5jaGVja0VuZE9mU3RyZWFtKGMpOwotCQkJdGVtcC5hcHBlbmQoKGNoYXIpIGMpOwotCQkJYyA9IHJlYWRlci5yZWFkKCk7Ci0JCX0KLQkJU3RyaW5nIGNoYXJWYWx1ZSA9IHRlbXAudG9TdHJpbmcoKTsKLQkJaWYgKGNoYXJWYWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtaXNzaW5nIG51bWVyaWMgc3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlzYi5hcHBlbmQoKGNoYXIpIEludGVnZXIucGFyc2VJbnQoY2hhclZhbHVlLCAxNikpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0NoYXIoaW50IGMsIGludCBleHBlY3RlZCkgewotCQl0aGlzLmNoZWNrRW5kT2ZTdHJlYW0oYyk7Ci0JCWlmIChjICE9IGV4cGVjdGVkKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJleHBlY3RlZCAnIiArIChjaGFyKSBleHBlY3RlZCArICInLCBidXQgZW5jb3VudGVyZWQgJyIgKyAoY2hhcikgYyArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tFbmRPZlN0cmVhbShpbnQgYykgewotCQlpZiAoYyA9PSAtMSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCBlbmQgb2Ygc3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9BYnN0cmFjdEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9BYnN0cmFjdEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTA1OWUxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvQWJzdHJhY3RBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRXhjZXB0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLlN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db25zdW1lclRocmVhZENvb3JkaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVUaHJlYWRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkUXVldWU7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGV4ZWN1dG9yIHdpbGwgZGlzcGF0Y2ggY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQgaW4gYSBzZXBhcmF0ZQotICogdGhyZWFkLCBhbGxvd2luZyBjYWxscyB0bwotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmRFeGVjdXRvciNleGVjdXRlKENvbW1hbmQpfQotICogdG8gcmV0dXJuIGltbWVkaWF0ZWx5LgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBJZiBhIGNsaWVudC1zdXBwbGllZCBjb21tYW5kIHRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uCi0gKiB3aGlsZSBpdCBpcyBleGVjdXRpbmcsIHRoZSBjb21tYW5kIGV4ZWN1dG9yIHdpbGwgdXNlIGl0cwotICoge0BsaW5rIEV4Y2VwdGlvbkhhbmRsZXIgZXhjZXB0aW9uIGhhbmRsZXJ9IHRvIGhhbmRsZSB0aGUgZXhjZXB0aW9uLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3I8RSBleHRlbmRzIFN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yPgotCWltcGxlbWVudHMgU3RhdGVmdWxDb21tYW5kRXhlY3V0b3IKLXsKLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBjb21tYW5kIGV4ZWN1dG9yLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBFIGNvbW1hbmRFeGVjdXRvcjsKLQotCS8qKgotCSAqIFRoaXMgY29tbWFuZCBxdWV1ZSBpcyBzaGFyZWQgd2l0aCB0aGUgY29tbWFuZCBleGVjdXRpb24vY29uc3VtZXIgdGhyZWFkLgotCSAqIEFkZGluZyBhIGNvbW1hbmQgdG8gaXQgd2lsbCB0cmlnZ2VyIHRoZSBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkIGJ5IHRoZQotCSAqIGNvbW1hbmQgZXhlY3V0aW9uIHRocmVhZCBvciwgaWYgYW5vdGhlciBjb21tYW5kIGlzIGN1cnJlbnRseSBleGVjdXRpbmcsCi0JICogdG8gZXhlY3V0ZSB0aGUgbmV3IGNvbW1hbmQgb25jZSB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBjb21tYW5kIGhhcwotCSAqIGZpbmlzaGVkIGV4ZWN1dGluZy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN5bmNocm9uaXplZFF1ZXVlPENvbW1hbmQ+IGNvbW1hbmRzID0gbmV3IFN5bmNocm9uaXplZFF1ZXVlPENvbW1hbmQ+KCk7Ci0KLQkvKioKLQkgKiBNb3N0IG9mIHRoZSB0aHJlYWQtcmVsYXRlZCBiZWhhdmlvciBpcyBkZWxlZ2F0ZWQgdG8gdGhpcyBjb29yZGluYXRvci4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IgY29uc3VtZXJUaHJlYWRDb29yZGluYXRvcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzeW5jaHJvbm91cyBjb21tYW5kIGV4ZWN1dG9yLgotCSAqIERlbGVnYXRlIGNvbW1hbmQgZXhlY3V0aW9uIHRvIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBleGVjdXRvci4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCB0aHJlYWQgZmFjdG9yeSB0byBjb25zdHJ1Y3QgdGhlIGNvbW1hbmQgZXhlY3V0aW9uCi0JICogdGhyZWFkKHMpIGFuZCBhc3NpZ24gdGhlbSB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogQW55IGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSBjb25zdW1lciB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlCi0JICogc3BlY2lmaWVkIGV4Y2VwdGlvbiBoYW5kbGVyLgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvcihDb25maWc8RT4gY29uZmlnKSB7Ci0JCXRoaXMoY29uZmlnLmdldENvbW1hbmRFeGVjdXRvcigpLCBjb25maWcuZ2V0VGhyZWFkRmFjdG9yeSgpLCBjb25maWcuZ2V0VGhyZWFkTmFtZSgpLCBjb25maWcuZ2V0RXhjZXB0aW9uSGFuZGxlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIGNvbW1hbmQgZXhlY3V0b3IuCi0JICogRGVsZWdhdGUgY29tbWFuZCBleGVjdXRpb24gdG8gdGhlIHNwZWNpZmllZCBjb21tYW5kIGV4ZWN1dG9yLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHRocmVhZCBmYWN0b3J5IHRvIGNvbnN0cnVjdCB0aGUgY29tbWFuZCBleGVjdXRpb24KLQkgKiB0aHJlYWQocykgYW5kIGFzc2lnbiB0aGVtIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBBbnkgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNvbnN1bWVyIHdpbGwgYmUgaGFuZGxlZCBieSB0aGUKLQkgKiBzcGVjaWZpZWQgZXhjZXB0aW9uIGhhbmRsZXIuCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0QXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yKAotCQkJRSBjb21tYW5kRXhlY3V0b3IsCi0JCQlUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnksCi0JCQlTdHJpbmcgdGhyZWFkTmFtZSwKLQkJCUV4Y2VwdGlvbkhhbmRsZXIgZXhjZXB0aW9uSGFuZGxlcgotCSkgewotCQlzdXBlcigpOwotCQlpZiAoY29tbWFuZEV4ZWN1dG9yID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29tbWFuZEV4ZWN1dG9yID0gY29tbWFuZEV4ZWN1dG9yOwotCQl0aGlzLmNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IgPSB0aGlzLmJ1aWxkQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvcih0aHJlYWRGYWN0b3J5LCB0aHJlYWROYW1lLCBleGNlcHRpb25IYW5kbGVyKTsKLQl9Ci0KLQlwcml2YXRlIENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IgYnVpbGRDb25zdW1lclRocmVhZENvb3JkaW5hdG9yKFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSwgU3RyaW5nIHRocmVhZE5hbWUsIEV4Y2VwdGlvbkhhbmRsZXIgZXhjZXB0aW9uSGFuZGxlcikgewotCQlyZXR1cm4gbmV3IENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IodGhpcy5idWlsZENvbnN1bWVyKCksIHRocmVhZEZhY3RvcnksIHRocmVhZE5hbWUsIGV4Y2VwdGlvbkhhbmRsZXIpOwotCX0KLQotCXByaXZhdGUgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5Db25zdW1lciBidWlsZENvbnN1bWVyKCkgewotCQlyZXR1cm4gbmV3IENvbnN1bWVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCBzdGFydCB0aGUgY29tbWFuZCBleGVjdXRpb24vY29uc3VtZXIgdGhyZWFkLgotCSAqIDxwPgotCSAqIE5vdGU6IFdlIGRvbid0IGNsZWFyIHRoZSBjb21tYW5kIHF1ZXVlIGhlcmU7IHNvIGlmIGEgY29tbWFuZCBoYXMgYmVlbgotCSAqIGFkZGVkIHRvIHRoZSBxdWV1ZSA8ZW0+YmVmb3JlPC9lbT4gZ2V0dGluZyBoZXJlLCB0aGUgZmlyc3QgY29tbWFuZCB3aWxsCi0JICogYmUgZXhlY3V0ZWQgcHJvbXB0bHkgKGFsYmVpdCwgYXN5bmNocm9ub3VzbHkpLgotCSAqIFRoZSBjb21tYW5kIHF1ZXVlIHdpbGwgYmUgbm9uLWVtcHR5IGlmOjx1bD4KLQkgKiA8bGk+e0BsaW5rICNleGVjdXRlKENvbW1hbmQpfSB3YXMgY2FsbGVkIGFmdGVyIHRoZSBjb21tYW5kIGV4ZWN1dG9yIHdhcwotCSAqICAgICBjb25zdHJ1Y3RlZCBidXQgYmVmb3JlIHtAbGluayAjc3RhcnQoKX0gd2FzIGNhbGxlZDsgb3IKLQkgKiA8bGk+e0BsaW5rICNleGVjdXRlKENvbW1hbmQpfSB3YXMgY2FsbGVkIGFmdGVyIHtAbGluayAjc3RvcCgpfSB3YXMgY2FsbGVkCi0JICogICAgIGJ1dCBiZWZvcmUge0BsaW5rICNzdGFydCgpfSB3YXMgY2FsbGVkICh0byByZXN0YXJ0IHRoZSBjb21tYW5kIGV4ZWN1dG9yKTsgb3IKLQkgKiA8bGk+e0BsaW5rICNzdG9wKCl9IHdhcyBjYWxsZWQgd2hlbiB0aGVyZSB3ZXJlIHN0aWxsIG91dHN0YW5kaW5nIGNvbW1hbmRzCi0JICogICAgIHJlbWFpbmluZyBpbiB0aGUgY29tbWFuZCBxdWV1ZQotCSAqIDwvdWw+Ci0JICogCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGV4ZWN1dG9yIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKLQkJdGhpcy5jb21tYW5kRXhlY3V0b3Iuc3RhcnQoKTsKLQkJdGhpcy5jb25zdW1lclRocmVhZENvb3JkaW5hdG9yLnN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogUHV0IHRoZSBzcGVjaWZpZWQgY29tbWFuZCBvbiB0aGUgY29tbWFuZCBxdWV1ZSwgdG8gYmUgY29uc3VtZWQgYnkgdGhlCi0JICogY29tbWFuZCBleGVjdXRpb24gdGhyZWFkLiBJZiB0aGUgZXhlY3V0b3IgaXMgc3RvcHBlZCwgdGhlIGNvbW1hbmQgd2lsbAotCSAqIGJlIHF1ZXVlZCBhbmQgZXhlY3V0ZWQgb25jZSB0aGUgZXhlY3V0b3IgaXMsIGlmIGV2ZXIsIHN0YXJ0ZWQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXRoaXMuY29tbWFuZHMuZW5xdWV1ZShjb21tYW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcnJ1cHQgdGhlIGNvbW1hbmQgZXhlY3V0aW9uIHRocmVhZCBzbyB0aGF0IGl0IHN0b3BzIGV4ZWN1dGluZyBhdCB0aGUKLQkgKiBlbmQgb2YgdGhlIGN1cnJlbnQgY29tbWFuZC4gU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwKLQkgKiB0aGUgY29tbWFuZCBleGVjdXRpb24gdGhyZWFkIGlzIGZpbmlzaGVkIGV4ZWN1dGluZy4gSWYgYW55IHVuY2F1Z2h0Ci0JICogZXhjZXB0aW9ucyB3ZXJlIHRocm93biB3aGlsZSB0aGUgZXhlY3V0aW9uIHRocmVhZCB3YXMgZXhlY3V0aW5nLAotCSAqIHdyYXAgdGhlbSBpbiBhIGNvbXBvc2l0ZSBleGNlcHRpb24gYW5kIHRocm93IHRoZSBjb21wb3NpdGUgZXhjZXB0aW9uLgotCSAqIEFueSByZW1haW5pbmcgY29tbWFuZHMgd2lsbCBiZSBleGVjdXRlZCBvbmNlIHRoZSBleGVjdG9yIGlzLCBpZiBldmVyLAotCSAqIHJlc3RhcnRlZC4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgZXhlY3V0b3IgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5zdG9wKCk7Ci0JCXRoaXMuY29tbWFuZEV4ZWN1dG9yLnN0b3AoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQkvKiBDVSBwcml2YXRlICovIHZvaWQgd2FpdEZvckNvbW1hbmQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLmNvbW1hbmRzLndhaXRVbnRpbE5vdEVtcHR5KCk7Ci0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyB2b2lkIGV4ZWN1dGVOZXh0Q29tbWFuZCgpIHsKLQkJdGhpcy5jb21tYW5kRXhlY3V0b3IuZXhlY3V0ZSh0aGlzLmNvbW1hbmRzLmRlcXVldWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5jb25zdW1lclRocmVhZENvb3JkaW5hdG9yKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3VtZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5Db25zdW1lcn0KLQkgKiB3aWxsIGV4ZWN1dGUgdGhlIGNvbW1hbmRzIGVucXVldWVkIGJ5IHRoZSBhc3luY2hyb25vdXMgY29tbWFuZCBleGVjdXRvci4KLQkgKiBJdCB3aWxsIHdhaXQgdW50aWwgdGhlIHNoYXJlZCBjb21tYW5kIHF1ZXVlIGlzIG5vbi1lbXB0eSB0byBiZWdpbiBleGVjdXRpbmcgdGhlCi0JICogY29tbWFuZHMgaW4gdGhlIHF1ZXVlLiBPbmNlIGEgY29tYW5kIGlzIGV4ZWN1dGVkLCB0aGUgdGhyZWFkIHdpbGwgcXVpZXNjZSB1bnRpbAotCSAqIGFub3RoZXIgY29tbWFuZCBpcyBwbGFjZWQgaW4gdGhlIGNvbW1hbmQgcXVldWUuIElmIGEgbmV3IGNvbW1hbmQgaXMKLQkgKiBlbnF1ZXVlZCBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiBhbm90aGVyIGNvbW1hbmQgKGVpdGhlciByZWN1cnNpdmVseSBieQotCSAqIHRoZSBjb21tYW5kIGl0c2VsZiBvciBieSBhbm90aGVyIHRocmVhZCksCi0JICogdGhlIG5ldyBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGN1cnJlbnRseQotCSAqIGV4ZWN1dGluZyBjb21tYW5kIGlzIGZpbmlzaGVkLgotCSAqIFN0b3AgdGhlIHRocmVhZCBieSBjYWxsaW5nIHtAbGluayBUaHJlYWQjaW50ZXJydXB0KCl9LgotCSAqLwotCWNsYXNzIENvbnN1bWVyCi0JCWltcGxlbWVudHMgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5Db25zdW1lcgotCXsKLQkJLyoqCi0JCSAqIFdhaXQgdW50aWwgYSBjb21tYW5kIGhhcyBiZWVuIHBsYWNlZCBpbiB0aGUgcXVldWUuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3YWl0Rm9yUHJvZHVjZXIoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJQWJzdHJhY3RBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IudGhpcy53YWl0Rm9yQ29tbWFuZCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEV4ZWN1dGUgdGhlIGZpcnN0IGNvbW1hbmQgaW4gdGhlIHF1ZXVlLgotCQkgKi8KLQkJcHVibGljIHZvaWQgY29uc3VtZSgpIHsKLQkJCUFic3RyYWN0QXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yLnRoaXMuZXhlY3V0ZU5leHRDb21tYW5kKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uZmlnICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbmZpZyB1c2VmdWwgZm9yIGluc3RhbnRpYXRpbmcgYW4ge0BsaW5rIEFic3RyYWN0QXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yfS4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIENvbmZpZzxFIGV4dGVuZHMgU3RhdGVmdWxDb21tYW5kRXhlY3V0b3I+IHsKLQkJRSBnZXRDb21tYW5kRXhlY3V0b3IoKTsKLQkJVGhyZWFkRmFjdG9yeSBnZXRUaHJlYWRGYWN0b3J5KCk7Ci0JCVN0cmluZyBnZXRUaHJlYWROYW1lKCk7Ci0JCUV4Y2VwdGlvbkhhbmRsZXIgZ2V0RXhjZXB0aW9uSGFuZGxlcigpOwotCX0KLQotCS8qKgotCSAqIENvbmZpZyB1c2VmdWwgZm9yIGluc3RhbnRpYXRpbmcgYW4ge0BsaW5rIEFic3RyYWN0QXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yfS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFNpbXBsZUNvbmZpZzxFIGV4dGVuZHMgU3RhdGVmdWxDb21tYW5kRXhlY3V0b3I+Ci0JCWltcGxlbWVudHMgQ29uZmlnPEU+Ci0JewotCQlwcml2YXRlIHZvbGF0aWxlIEUgY29tbWFuZEV4ZWN1dG9yOwotCQlwcml2YXRlIHZvbGF0aWxlIFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeTsKLQkJcHJpdmF0ZSB2b2xhdGlsZSBTdHJpbmcgdGhyZWFkTmFtZTsKLQkJcHJpdmF0ZSB2b2xhdGlsZSBFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXI7Ci0KLQkJcHJvdGVjdGVkIFNpbXBsZUNvbmZpZygpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvbW1hbmRFeGVjdXRvciA9IHRoaXMuYnVpbGREZWZhdWx0Q29tbWFuZEV4ZWN1dG9yKCk7Ci0JCQl0aGlzLnRocmVhZEZhY3RvcnkgPSB0aGlzLmJ1aWxkRGVmYXVsdFRocmVhZEZhY3RvcnkoKTsKLQkJCXRoaXMudGhyZWFkTmFtZSA9IHRoaXMuYnVpbGREZWZhdWx0VGhyZWFkTmFtZSgpOwotCQkJdGhpcy5leGNlcHRpb25IYW5kbGVyID0gdGhpcy5idWlsZERlZmF1bHRFeGNlcHRpb25IYW5kbGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU2ltcGxlQ29uZmlnKEUgY29tbWFuZEV4ZWN1dG9yLCBUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnksIFN0cmluZyB0aHJlYWROYW1lLCBFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvbW1hbmRFeGVjdXRvciA9IGNvbW1hbmRFeGVjdXRvcjsKLQkJCXRoaXMudGhyZWFkRmFjdG9yeSA9IHRocmVhZEZhY3Rvcnk7Ci0JCQl0aGlzLnRocmVhZE5hbWUgPSB0aHJlYWROYW1lOwotCQkJdGhpcy5leGNlcHRpb25IYW5kbGVyID0gZXhjZXB0aW9uSGFuZGxlcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldENvbW1hbmRFeGVjdXRvcihFIGNvbW1hbmRFeGVjdXRvcikgewotCQkJdGhpcy5jb21tYW5kRXhlY3V0b3IgPSBjb21tYW5kRXhlY3V0b3I7Ci0JCX0KLQkJcHVibGljIEUgZ2V0Q29tbWFuZEV4ZWN1dG9yKCkgewotCQkJcmV0dXJuIHRoaXMuY29tbWFuZEV4ZWN1dG9yOwotCQl9Ci0JCXByb3RlY3RlZCBhYnN0cmFjdCBFIGJ1aWxkRGVmYXVsdENvbW1hbmRFeGVjdXRvcigpOwotCi0JCXB1YmxpYyB2b2lkIHNldFRocmVhZEZhY3RvcnkoVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5KSB7Ci0JCQl0aGlzLnRocmVhZEZhY3RvcnkgPSB0aHJlYWRGYWN0b3J5OwotCQl9Ci0JCXB1YmxpYyBUaHJlYWRGYWN0b3J5IGdldFRocmVhZEZhY3RvcnkoKSB7Ci0JCQlyZXR1cm4gdGhpcy50aHJlYWRGYWN0b3J5OwotCQl9Ci0JCXByb3RlY3RlZCBUaHJlYWRGYWN0b3J5IGJ1aWxkRGVmYXVsdFRocmVhZEZhY3RvcnkoKSB7Ci0JCQlyZXR1cm4gU2ltcGxlVGhyZWFkRmFjdG9yeS5pbnN0YW5jZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VGhyZWFkTmFtZShTdHJpbmcgdGhyZWFkTmFtZSkgewotCQkJdGhpcy50aHJlYWROYW1lID0gdGhyZWFkTmFtZTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldFRocmVhZE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy50aHJlYWROYW1lOwotCQl9Ci0JCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0VGhyZWFkTmFtZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0RXhjZXB0aW9uSGFuZGxlcihFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIpIHsKLQkJCXRoaXMuZXhjZXB0aW9uSGFuZGxlciA9IGV4Y2VwdGlvbkhhbmRsZXI7Ci0JCX0KLQkJcHVibGljIEV4Y2VwdGlvbkhhbmRsZXIgZ2V0RXhjZXB0aW9uSGFuZGxlcigpIHsKLQkJCXJldHVybiB0aGlzLmV4Y2VwdGlvbkhhbmRsZXI7Ci0JCX0KLQkJcHJvdGVjdGVkIEV4Y2VwdGlvbkhhbmRsZXIgYnVpbGREZWZhdWx0RXhjZXB0aW9uSGFuZGxlcigpIHsKLQkJCXJldHVybiBFeGNlcHRpb25IYW5kbGVyLlJ1bnRpbWUuaW5zdGFuY2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvQWJzdHJhY3RRdWV1ZWluZ0NvbW1hbmRFeGVjdXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9BYnN0cmFjdFF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZGQ0M2UuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9BYnN0cmFjdFF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5TdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRCb29sZWFuOwotCi0vKioKLSAqIFRoaXMgaXMgYSBjb21tYW5kIGV4ZWN1dG9yIHRoYXQgcXVldWVzIHVwIGFueSBjb21tYW5kcwotICogdGhhdCBhcmUge0BsaW5rICNleGVjdXRlKENvbW1hbmQpIGV4ZWN1dGVkfSB3aGlsZSB0aGUgZXhlY3V0b3IgaXMKLSAqIHtAbGluayAjc3RvcCgpIHN0b3BwZWR9LiBUaGVzZSBjb21tYW5kcyB3aWxsIGJlCi0gKiBleGVjdXRlZCB3aGVuIHRoZSBleGVjdXRvciBpcyB7QGxpbmsgI3N0YXJ0KCkgc3RhcnRlZH0uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yPEUgZXh0ZW5kcyBTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcj4KLQlpbXBsZW1lbnRzIFN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEUgY29tbWFuZEV4ZWN1dG9yOwotCXByb3RlY3RlZCBmaW5hbCBTeW5jaHJvbml6ZWRCb29sZWFuIGFjdGl2ZSA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKGZhbHNlKTsKLQlwcml2YXRlIFNpbXBsZVF1ZXVlPENvbW1hbmQ+IHF1ZXVlID0gbmV3IFNpbXBsZVF1ZXVlPENvbW1hbmQ+KCk7Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdFF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yKEUgY29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChjb21tYW5kRXhlY3V0b3IgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb21tYW5kRXhlY3V0b3IgPSBjb21tYW5kRXhlY3V0b3I7Ci0JfQotCi0JLyoqCi0JICogU3RhcnQgdGhlIGNvbW1hbmQgZXhlY3V0b3IsIGV4ZWN1dGluZyBhbGwgdGhlIGNvbW1hbmRzIHRoYXQgd2VyZQotCSAqIHF1ZXVlZCB1cCB3aGlsZSB0aGUgZXhlY3V0b3Igd2FzIHtAbGluayAjc3RvcCgpIHN0b3BwZWR9LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKLQkJaWYgKHRoaXMuYWN0aXZlLmlzVHJ1ZSgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3Qgc3RvcHBlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuY29tbWFuZEV4ZWN1dG9yLnN0YXJ0KCk7Ci0JCXdoaWxlICggISB0aGlzLnF1ZXVlLmlzRW1wdHkoKSkgewotCQkJdGhpcy5jb21tYW5kRXhlY3V0b3IuZXhlY3V0ZSh0aGlzLnF1ZXVlLmRlcXVldWUoKSk7Ci0JCX0KLQkJdGhpcy5hY3RpdmUuc2V0VHJ1ZSgpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBjb21tYW5kIGV4ZWN1dG9yIGlzIGFjdGl2ZSwgZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQ7Ci0JICogb3RoZXJ3aXNlLCBxdWV1ZSB0aGUgY29tbWFuZCB0byBiZSBleGVjdXRlZCBvbmNlIHRoZSBleGVjdXRvciBpcwotCSAqIHtAbGluayAjc3RhcnQoKSBzdGFydGVkfS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQlpZiAodGhpcy5jb21tYW5kSXNUb0JlRXhlY3V0ZWQoY29tbWFuZCkpIHsKLQkJCXRoaXMuY29tbWFuZEV4ZWN1dG9yLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBleGVjdXRvciBpcyBhY3RpdmUgYW5kLCBpZiBpdCBpcyA8ZW0+aW48L2VtPmFjdGl2ZSwKLQkgKiBwbGFjZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgaW4gdGhlIHF1ZXVlIGZvciBsYXRlciBleGVjdXRpb24uCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb21tYW5kSXNUb0JlRXhlY3V0ZWQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWlmICh0aGlzLmFjdGl2ZS5pc0ZhbHNlKCkpIHsKLQkJCXRoaXMucXVldWUuZW5xdWV1ZShjb21tYW5kKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIHRoZSBjb21tYW5kIGV4ZWN1dG9yLiBBbnkgZnVydGhlciByZXF1ZXN0cyB0bwotCSAqIHtAbGluayAjZXhlY3V0ZShDb21tYW5kKSBleGVjdXRlfSBhIGNvbW1hbmQgd2lsbCByZXN1bHQgaW4gdGhlIGNvbW1hbmQKLQkgKiBiZWluZyBxdWV1ZWQgdXAgdG8gYmUgZXhlY3V0ZWQgb25jZSB0aGUgY29tbWFuZCBleGVjdXRvciBpcwotCSAqIHtAbGluayAjc3RhcnQoKSByZXN0YXJ0ZWR9LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuYWN0aXZlLmlzRmFsc2UoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm90IHN0YXJ0ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmFjdGl2ZS5zZXRGYWxzZSgpOwotCQl0aGlzLmNvbW1hbmRFeGVjdXRvci5zdG9wKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5xdWV1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9BYnN0cmFjdFNhZmVDb21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvQWJzdHJhY3RTYWZlQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYzJhYmYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9BYnN0cmFjdFNhZmVDb21tYW5kRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRXhjZXB0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGV4ZWN1dG9yIHdyYXBzIGFub3RoZXIgY29tbWFuZCBleGVjdXRvciBhbmQgdXNlcyBhbiBleGNlcHRpb24KLSAqIGhhbmRsZXIgdG8gaGFuZGxlIGFueSBleGNlcHRpb25zIHRocm93biBieSBhbiBleGVjdXRpbmcgY29tbWFuZC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2FmZUNvbW1hbmRFeGVjdXRvcjxFIGV4dGVuZHMgQ29tbWFuZEV4ZWN1dG9yPgotCWltcGxlbWVudHMgQ29tbWFuZEV4ZWN1dG9yCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEUgY29tbWFuZEV4ZWN1dG9yOwotCXByb3RlY3RlZCBmaW5hbCBFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXI7Ci0KLQotCS8qKgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFRoZSBkZWZhdWx0IGV4Y2VwdGlvbiBoYW5kbGVyIHNpbXBseQotCSAqIDxlbT5pZ25vcmVzPC9lbT4gYW55IGFuZCBhbGwgZXhjZXB0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RTYWZlQ29tbWFuZEV4ZWN1dG9yKEUgY29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXRoaXMoY29tbWFuZEV4ZWN1dG9yLCBFeGNlcHRpb25IYW5kbGVyLk51bGwuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFic3RyYWN0U2FmZUNvbW1hbmRFeGVjdXRvcihFIGNvbW1hbmRFeGVjdXRvciwgRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgoY29tbWFuZEV4ZWN1dG9yID09IG51bGwpIHx8IChleGNlcHRpb25IYW5kbGVyID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmNvbW1hbmRFeGVjdXRvciA9IGNvbW1hbmRFeGVjdXRvcjsKLQkJdGhpcy5leGNlcHRpb25IYW5kbGVyID0gZXhjZXB0aW9uSGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQl0cnkgewotCQkJdGhpcy5jb21tYW5kRXhlY3V0b3IuZXhlY3V0ZShjb21tYW5kKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJdGhpcy5leGNlcHRpb25IYW5kbGVyLmhhbmRsZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmNvbW1hbmRFeGVjdXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9BYnN0cmFjdFNpbmdsZVVzZVF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL0Fic3RyYWN0U2luZ2xlVXNlUXVldWVpbmdDb21tYW5kRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlkY2ExOC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL0Fic3RyYWN0U2luZ2xlVXNlUXVldWVpbmdDb21tYW5kRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5TdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFRoaXMgaXMgYSBjb21tYW5kIGV4ZWN1dG9yIHRoYXQgcXVldWVzIHVwIGFueSBjb21tYW5kcyB0aGF0IGFyZQotICoge0BsaW5rICNleGVjdXRlKENvbW1hbmQpIGV4ZWN1dGVkfSBiZWZvcmUgdGhlIGV4ZWN1dG9yIGhhcyBiZWVuCi0gKiB7QGxpbmsgI3N0YXJ0KCkgc3RhcnRlZH0gb3Igd2hpbGUgdGhlIGV4ZWN1dG9yIGlzCi0gKiB7QGxpbmsgI3N1c3BlbmQoKSBzdXNwZW5kZWR9LiBUaGVzZSBjb21tYW5kcyB3aWxsIGJlCi0gKiBleGVjdXRlZCBvbmNlIHRoZSBleGVjdXRvciBpcyB7QGxpbmsgI3N0YXJ0KCkgc3RhcnRlZH0gb3IKLSAqIHtAbGluayAjcmVzdW1lKCkgcmVzdW1lZH0uIE9uY2UgdGhlIGV4ZWN1dG9yIGlzIHtAbGluayAjc3RhcnQoKSBzdGFydGVkfSwKLSAqIGFsbCBjb21tYW5kcyBhcmUgZXhlY3V0ZWQgPGVtPnN5bmNocm9ub3VzbHk8L2VtPi4KLSAqIE9uY2UgdGhlIGV4ZWN1dG9yIGlzIHtAbGluayAjc3RvcCgpIHN0b3BwZWR9LCBubyBmdXJ0aGVyIGNvbW1hbmRzIHdpbGwgYmUKLSAqIGV4ZWN1dGVkOyBhbmQgdGhlIGV4ZWN1dG9yIGNhbjxlbT5ub3Q8L2VtPiBiZSB7QGxpbmsgI3N0YXJ0KCkgcmVzdGFydGVkfS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2luZ2xlVXNlUXVldWVpbmdDb21tYW5kRXhlY3V0b3I8RSBleHRlbmRzIFN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yPgotCWltcGxlbWVudHMgU3RhdGVmdWxDb21tYW5kRXhlY3V0b3IKLXsKLQlwcm90ZWN0ZWQgZmluYWwgRSBjb21tYW5kRXhlY3V0b3I7Ci0JcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsKLQlwcml2YXRlIFNpbXBsZVF1ZXVlPENvbW1hbmQ+IHF1ZXVlID0gbmV3IFNpbXBsZVF1ZXVlPENvbW1hbmQ+KCk7Ci0KLQlwcml2YXRlIGVudW0gU3RhdGUgewotCQlQUkVfU1RBUlQsCi0JCUFDVElWRSwKLQkJU1VTUEVOREVELAotCQlERUFECi0JfQotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RTaW5nbGVVc2VRdWV1ZWluZ0NvbW1hbmRFeGVjdXRvcihFIGNvbW1hbmRFeGVjdXRvcikgewotCQlzdXBlcigpOwotCQlpZiAoY29tbWFuZEV4ZWN1dG9yID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29tbWFuZEV4ZWN1dG9yID0gY29tbWFuZEV4ZWN1dG9yOwotCQl0aGlzLnN0YXRlID0gU3RhdGUuUFJFX1NUQVJUOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0IHRoZSBjb21tYW5kIGV4ZWN1dG9yLCBleGVjdXRpbmcgYWxsIHRoZSBjb21tYW5kcyB0aGF0IHdlcmUKLQkgKiBxdWV1ZWQgdXAgc2luY2UgdGhlIGV4ZWN1dG9yIHdhcyBmaXJzdCBjb25zdHJ1Y3RlZC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoKSB7Ci0JCWlmICh0aGlzLnN0YXRlICE9IFN0YXRlLlBSRV9TVEFSVCkgewotCQkJdGhyb3cgdGhpcy5idWlsZElTRSgpOwotCQl9Ci0JCXRoaXMuY29tbWFuZEV4ZWN1dG9yLnN0YXJ0KCk7Ci0JCXdoaWxlICggISB0aGlzLnF1ZXVlLmlzRW1wdHkoKSkgewotCQkJdGhpcy5jb21tYW5kRXhlY3V0b3IuZXhlY3V0ZSh0aGlzLnF1ZXVlLmRlcXVldWUoKSk7Ci0JCX0KLQkJdGhpcy5zdGF0ZSA9IFN0YXRlLkFDVElWRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQlpZiAodGhpcy5jb21tYW5kSXNUb0JlRXhlY3V0ZWQoY29tbWFuZCkpIHsKLQkJCXRoaXMuY29tbWFuZEV4ZWN1dG9yLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgY29tbWFuZCBleGVjdXRvciBpcyBhY3RpdmUgKGkuZS4gaXQgaGFzIGJlZW4KLQkgKiB7QGxpbmsgI3N0YXJ0KCkgc3RhcnRlZH0pLCBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZC4KLQkgKiBJZiB0aGUgY29tbWFuZCBleGVjdXRvciBoYXMgbm90IGJlZW4ge0BsaW5rICNzdGFydCgpIHN0YXJ0ZWR9IG9yIGl0IGlzCi0JICoge0BsaW5rICNzdXNwZW5kKCkgc3VzcGVuZGVkfSwgcXVldWUgdGhlCi0JICogY29tbWFuZCB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSBleGVjdXRvciBpcyB7QGxpbmsgI3N0YXJ0KCkgc3RhcnRlZH0gb3IKLQkgKiB7QGxpbmsgI3Jlc3VtZSgpIHJlc3VtZWR9LgotCSAqIElmIHRoZSBjb21tYW5kIGV4ZWN1dG9yIGlzIGRlYWQgKGkuZS4gaXQgaGFzIGJlZW4KLQkgKiB7QGxpbmsgI3N0b3AoKSBzdG9wcGVkfSksIGlnbm9yZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGNvbW1hbmRJc1RvQmVFeGVjdXRlZChDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3dpdGNoICh0aGlzLnN0YXRlKSB7Ci0JCQljYXNlIEFDVElWRToKLQkJCQkvLyBleGVjdXRlIHRoZSBjb21tYW5kIG91dHNpZGUgdGhlIGxvY2sKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWNhc2UgUFJFX1NUQVJUOgotCQkJY2FzZSBTVVNQRU5ERUQ6Ci0JCQkJdGhpcy5xdWV1ZS5lbnF1ZXVlKGNvbW1hbmQpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCWNhc2UgREVBRDoKLQkJCQkvLyBpZ25vcmUKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdGhyb3cgdGhpcy5idWlsZElTRSgpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGNvbW1hbmQgZXhlY3V0b3IuIEFueSBmdXJ0aGVyIHJlcXVlc3RzIHRvCi0JICoge0BsaW5rICNleGVjdXRlKENvbW1hbmQpIGV4ZWN1dGV9IGEgY29tbWFuZCB3aWxsIHJlc3VsdCBpbiB0aGUgY29tbWFuZAotCSAqIGJlaW5nIHF1ZXVlZCB1cCB0byBiZSBleGVjdXRlZCBvbmNlIHRoZSBjb21tYW5kIGV4ZWN1dG9yIGlzCi0JICoge0BsaW5rICNyZXN1bWUoKSByZXN1bWVkfS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3VzcGVuZCgpIHsKLQkJaWYgKHRoaXMuc3RhdGUgIT0gU3RhdGUuQUNUSVZFKSB7Ci0JCQl0aHJvdyB0aGlzLmJ1aWxkSVNFKCk7Ci0JCX0KLQkJdGhpcy5zdGF0ZSA9IFN0YXRlLlNVU1BFTkRFRDsKLQl9Ci0KLQkvKioKLQkgKiBSZXN1bWUgdGhlIGNvbW1hbmQgZXhlY3V0b3IsIGV4ZWN1dGluZyBhbGwgdGhlIGNvbW1hbmRzIHRoYXQgd2VyZQotCSAqIHF1ZXVlZCB1cCBzaW5jZSB0aGUgZXhlY3V0b3Igd2FzIHtAbGluayAjc3VzcGVuZCgpIHN1c3BlbmRlZH0uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc3VtZSgpIHsKLQkJaWYgKHRoaXMuc3RhdGUgIT0gU3RhdGUuU1VTUEVOREVEKSB7Ci0JCQl0aHJvdyB0aGlzLmJ1aWxkSVNFKCk7Ci0JCX0KLQkJd2hpbGUgKCAhIHRoaXMucXVldWUuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmNvbW1hbmRFeGVjdXRvci5leGVjdXRlKHRoaXMucXVldWUuZGVxdWV1ZSgpKTsKLQkJfQotCQl0aGlzLnN0YXRlID0gU3RhdGUuQUNUSVZFOwotCX0KLQotCS8qKgotCSAqIFN0b3AgdGhlIGNvbW1hbmQgZXhlY3V0b3IuIEFueSBxdWV1ZWQgY29tbWFuZHMgKGkuZS4gdGhlIGNvbW1hbmRzCi0JICoge0BsaW5rICNleGVjdXRlKENvbW1hbmQpIGV4ZWN1dGVkfSB3aGlsZSB0aGUgY29tbWFuZCBleGVjdXRvciBoYWQgbm90Ci0JICogYmVlbiB7QGxpbmsgI3N0YXJ0KCkgc3RhcnRlZH0gb3Igd2FzCi0JICoge0BsaW5rICNzdXNwZW5kKCkgc3VzcGVuZGVkfSkgd2lsbCBiZSBpZ25vcmVkLgotCSAqIEFueSBmdXJ0aGVyIHJlcXVlc3RzIHRvCi0JICoge0BsaW5rICNleGVjdXRlKENvbW1hbmQpIGV4ZWN1dGV9IGEgY29tbWFuZCB3aWxsIGJlIGlnbm9yZWQuCi0JICogVGhlIGNvbW1hbmQgZXhlY3V0b3IgPGVtPmNhbm5vdDwvZW0+IGJlIHtAbGluayAjc3RhcnQoKSByZXN0YXJ0ZWR9LAotCSAqIHtAbGluayAjc3VzcGVuZCgpIHN1c3BlbmRlZH0gb3Ige0BsaW5rICNyZXN1bWUoKSByZXN1bWVkfSBvbmNlIGl0IGhhcwotCSAqIGJlZW4gc3RvcHBlZC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN3aXRjaCAodGhpcy5zdGF0ZSkgewotCQkJY2FzZSBBQ1RJVkU6Ci0JCQkJLy8gbm90aGluZyB0byBkbwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVVNQRU5ERUQ6Ci0JCQkJLy8gZHJhaW4gdGhlIHF1ZXVlCi0JCQkJd2hpbGUgKCAhIHRoaXMucXVldWUuaXNFbXB0eSgpKSB7Ci0JCQkJCXRoaXMucXVldWUuZGVxdWV1ZSgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgUFJFX1NUQVJUOgotCQkJY2FzZSBERUFEOgotCQkJCXRocm93IHRoaXMuYnVpbGRJU0UoKTsKLQkJfQotCi0JCXRoaXMuY29tbWFuZEV4ZWN1dG9yLnN0b3AoKTsKLQkJdGhpcy5zdGF0ZSA9IFN0YXRlLkRFQUQ7Ci0JfQotCi0JcHJpdmF0ZSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gYnVpbGRJU0UoKSB7Ci0JCXJldHVybiBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy52YWx1ZU9mKHRoaXMuc3RhdGUpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnN0YXRlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL0Fic3RyYWN0U3RhdGVmdWxDb21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvQWJzdHJhY3RTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjQ1NjVhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvQWJzdHJhY3RTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLlN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkQm9vbGVhbjsKLQotLyoqCi0gKiBTdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yfQotICogdGhhdCBleGVjdXRlcyBjb21tYW5kcyBpbW1lZGlhdGVseSBieSBkZWZhdWx0LiBUaGlzIGV4ZWN1dG9yIGNhbgotICogYWxzbyBiZSB1c2VkIHRvIGFkYXB0IHNpbXBsZSB7QGxpbmsgQ29tbWFuZEV4ZWN1dG9yfXMgdG8gdGhlCi0gKiB7QGxpbmsgU3RhdGVmdWxDb21tYW5kRXhlY3V0b3J9IGludGVyZmFjZSwgcHJvdmlkaW5nIHN1cHBvcnQgZm9yCi0gKiBsaWZlY3ljbGUgc3RhdGUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yPEUgZXh0ZW5kcyBDb21tYW5kRXhlY3V0b3I+Ci0JaW1wbGVtZW50cyBTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcgotewotCXByb3RlY3RlZCBmaW5hbCBTeW5jaHJvbml6ZWRCb29sZWFuIGFjdGl2ZSA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKGZhbHNlKTsKLQlwcm90ZWN0ZWQgZmluYWwgRSBjb21tYW5kRXhlY3V0b3I7Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdFN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yKEUgY29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChjb21tYW5kRXhlY3V0b3IgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb21tYW5kRXhlY3V0b3IgPSBjb21tYW5kRXhlY3V0b3I7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgewotCQlpZiAodGhpcy5hY3RpdmUuaXNUcnVlKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vdCBzdG9wcGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5hY3RpdmUuc2V0VHJ1ZSgpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBjb21tYW5kIGV4ZWN1dG9yIGlzIGluYWN0aXZlIHRoZSBjb21tYW5kIGlzIHNpbXBseSBpZ25vcmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWlmICh0aGlzLmFjdGl2ZS5pc1RydWUoKSkgewotCQkJdGhpcy5jb21tYW5kRXhlY3V0b3IuZXhlY3V0ZShjb21tYW5kKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgewotCQlpZiAodGhpcy5hY3RpdmUuaXNGYWxzZSgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3Qgc3RhcnRlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuYWN0aXZlLnNldEZhbHNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5jb21tYW5kRXhlY3V0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvQWJzdHJhY3RUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9BYnN0cmFjdFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNDc3OWQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9BYnN0cmFjdFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kRXhlY3V0b3I7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGV4ZWN1dG9yIGFsbG93cyB0aGUgY2xpZW50IHRvCi0gKiBzcGVjaWZ5IGEgZGlmZmVyZW50IGNvbW1hbmQgZXhlY3V0b3IgZm9yIGVhY2ggdGhyZWFkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcjxFIGV4dGVuZHMgQ29tbWFuZEV4ZWN1dG9yPgotCWltcGxlbWVudHMgQ29tbWFuZEV4ZWN1dG9yCi17Ci0JcHJvdGVjdGVkIGZpbmFsIFRocmVhZExvY2FsPEU+IHRocmVhZExvY2FsOwotCXByb3RlY3RlZCBmaW5hbCBFIGRlZmF1bHRDb21tYW5kRXhlY3V0b3I7Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yKEUgZGVmYXVsdENvbW1hbmRFeGVjdXRvcikgewotCQlzdXBlcigpOwotCQlpZiAoZGVmYXVsdENvbW1hbmRFeGVjdXRvciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmRlZmF1bHRDb21tYW5kRXhlY3V0b3IgPSBkZWZhdWx0Q29tbWFuZEV4ZWN1dG9yOwotCQl0aGlzLnRocmVhZExvY2FsID0gdGhpcy5idWlsZFRocmVhZExvY2FsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRocmVhZExvY2FsPEU+IGJ1aWxkVGhyZWFkTG9jYWwoKSB7Ci0JCXJldHVybiBuZXcgVGhyZWFkTG9jYWw8RT4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQl0aGlzLmdldFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yKCkuZXhlY3V0ZShjb21tYW5kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRSBnZXRUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcigpIHsKLQkJRSBjZSA9IHRoaXMudGhyZWFkTG9jYWwuZ2V0KCk7Ci0JCXJldHVybiAoY2UgIT0gbnVsbCkgPyBjZSA6IHRoaXMuZGVmYXVsdENvbW1hbmRFeGVjdXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGN1cnJlbnQgdGhyZWFkJ3MgY29tbWFuZCBleGVjdXRvciB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldChFIGNvbW1hbmRFeGVjdXRvcikgewotCQl0aGlzLnRocmVhZExvY2FsLnNldChjb21tYW5kRXhlY3V0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHRocmVhZCdzIGNvbW1hbmQKLQkgKiBleGVjdXRvci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gJ1snICsgdGhpcy5nZXRUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcigpLnRvU3RyaW5nKCkgKyAnXSc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9Bc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwN2VkMzguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9Bc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRXhjZXB0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuU3RhdGVmdWxDb21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZVRocmVhZEZhY3Rvcnk7Ci0KLS8qKgotICogQHNlZSBBYnN0cmFjdEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvcgotICovCi1wdWJsaWMgY2xhc3MgQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yCi0JZXh0ZW5kcyBBYnN0cmFjdEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvcjxTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcj4KLXsKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIGNvbW1hbmQgZXhlY3V0b3IuCi0JICogVXNlIHNpbXBsZSBKREsgdGhyZWFkKHMpIGZvciB0aGUgY29tbWFuZCBleGVjdXRpb24gdGhyZWFkKHMpLgotCSAqIEFsbG93IHRoZSBjb21tYW5kIGV4ZWN1dGlvbiB0aHJlYWQocykgdG8gYmUgYXNzaWduZWQgSkRLLWdlbmVyYXRlZCBuYW1lcy4KLQkgKiBBbnkgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNvbnN1bWVyIHdpbGwgYmUgaGFuZGxlZCBieSB0aGUKLQkgKiBzcGVjaWZpZWQgZXhjZXB0aW9uIGhhbmRsZXIuCi0JICovCi0JcHVibGljIEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvcihFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIpIHsKLQkJdGhpcyhudWxsLCBleGNlcHRpb25IYW5kbGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIGNvbW1hbmQgZXhlY3V0b3IuCi0JICogVXNlIHNpbXBsZSBKREsgdGhyZWFkKHMpIGZvciB0aGUgY29tbWFuZCBleGVjdXRpb24gdGhyZWFkKHMpLgotCSAqIEFzc2lnbiB0aGUgY29tbWFuZCBleGVjdXRpb24gdGhyZWFkKHMpIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBBbnkgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNvbnN1bWVyIHdpbGwgYmUgaGFuZGxlZCBieSB0aGUKLQkgKiBzcGVjaWZpZWQgZXhjZXB0aW9uIGhhbmRsZXIuCi0JICovCi0JcHVibGljIEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvcihTdHJpbmcgdGhyZWFkTmFtZSwgRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyKSB7Ci0JCXRoaXMobmV3IFNpbXBsZVN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yKENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCkpLCBTaW1wbGVUaHJlYWRGYWN0b3J5Lmluc3RhbmNlKCksIHRocmVhZE5hbWUsIGV4Y2VwdGlvbkhhbmRsZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhc3luY2hyb25vdXMgY29tbWFuZCBleGVjdXRvci4KLQkgKiBEZWxlZ2F0ZSBjb21tYW5kIGV4ZWN1dGlvbiB0byB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgZXhlY3V0b3IuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgdGhyZWFkIGZhY3RvcnkgdG8gY29uc3RydWN0IHRoZSBjb21tYW5kIGV4ZWN1dGlvbgotCSAqIHRocmVhZChzKSBhbmQgYXNzaWduIHRoZW0gdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIEFueSBleGNlcHRpb25zIHRocm93biBieSBhIGNvbW1hbmQgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZQotCSAqIHNwZWNpZmllZCBleGNlcHRpb24gaGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yKFN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvciwgVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5LCBTdHJpbmcgdGhyZWFkTmFtZSwgRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyKSB7Ci0JCXN1cGVyKGNvbW1hbmRFeGVjdXRvciwgdGhyZWFkRmFjdG9yeSwgdGhyZWFkTmFtZSwgZXhjZXB0aW9uSGFuZGxlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzeW5jaHJvbm91cyBjb21tYW5kIGV4ZWN1dG9yLgotCSAqIERlbGVnYXRlIGNvbW1hbmQgZXhlY3V0aW9uIHRvIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBleGVjdXRvci4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCB0aHJlYWQgZmFjdG9yeSB0byBjb25zdHJ1Y3QgdGhlIGNvbW1hbmQgZXhlY3V0aW9uCi0JICogdGhyZWFkKHMpIGFuZCBhc3NpZ24gdGhlbSB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogQW55IGV4Y2VwdGlvbnMgdGhyb3duIGJ5IGEgY29tbWFuZCB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlCi0JICogc3BlY2lmaWVkIGV4Y2VwdGlvbiBoYW5kbGVyLgotCSAqLwotCXB1YmxpYyBBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IoQ29uZmlnIGNvbmZpZykgewotCQlzdXBlcihjb25maWcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25maWcgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uZmlnIHVzZWZ1bCBmb3IgaW5zdGFudGlhdGluZyBhbiB7QGxpbmsgQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yfS4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIENvbmZpZwotCQlleHRlbmRzIEFic3RyYWN0QXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yLkNvbmZpZzxTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcj4KLQl7Ci0JCS8vIGdlbmVyaWMKLQl9Ci0KLQkvKioKLQkgKiBDb25maWcgdXNlZnVsIGZvciBpbnN0YW50aWF0aW5nIGFuIHtAbGluayBBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3J9LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlQ29uZmlnCi0JCWV4dGVuZHMgQWJzdHJhY3RBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IuU2ltcGxlQ29uZmlnPFN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yPgotCQlpbXBsZW1lbnRzIENvbmZpZwotCXsKLQkJcHVibGljIFNpbXBsZUNvbmZpZygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIFNpbXBsZUNvbmZpZyhTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IsIFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSwgU3RyaW5nIHRocmVhZE5hbWUsIEV4Y2VwdGlvbkhhbmRsZXIgZXhjZXB0aW9uSGFuZGxlcikgewotCQkJc3VwZXIoY29tbWFuZEV4ZWN1dG9yLCB0aHJlYWRGYWN0b3J5LCB0aHJlYWROYW1lLCBleGNlcHRpb25IYW5kbGVyKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yIGJ1aWxkRGVmYXVsdENvbW1hbmRFeGVjdXRvcigpIHsKLQkJCXJldHVybiBuZXcgU2ltcGxlU3RhdGVmdWxDb21tYW5kRXhlY3V0b3IoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvQXN5bmNocm9ub3VzRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvQXN5bmNocm9ub3VzRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAwYWM2NS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL0FzeW5jaHJvbm91c0V4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkV4Y2VwdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5FeHRlbmRlZENvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5TdGF0ZWZ1bEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVUaHJlYWRGYWN0b3J5OwotCi0vKioKLSAqIHtAbGluayBDb21tYW5kfXMgZXhlY3V0ZWQgdmlhIGNhbGxzIHRvIHtAbGluayAjd2FpdFRvRXhlY3V0ZShDb21tYW5kKX0gd2lsbAotICogZXhlY3V0ZSBvbiB0aGUgPGVtPmN1cnJlbnQ8L2VtPiB0aHJlYWQgPGVtPmFmdGVyPC9lbT4gYWxsIHRoZSBjb21tYW5kcwotICogYWxyZWFkeSBkaXNwYXRjaGVkIHRvIHRoZSBvdGhlciB0aHJlYWQgaGF2ZSBleGVjdXRlZC4KLSAqIAotICogQHNlZSBBYnN0cmFjdEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvcgotICovCi1wdWJsaWMgY2xhc3MgQXN5bmNocm9ub3VzRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IKLQlleHRlbmRzIEFic3RyYWN0QXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yPFN0YXRlZnVsRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3I+Ci0JaW1wbGVtZW50cyBTdGF0ZWZ1bEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yCi17Ci0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzeW5jaHJvbm91cyBjb21tYW5kIGV4ZWN1dG9yLgotCSAqIFVzZSBzaW1wbGUgSkRLIHRocmVhZChzKSBmb3IgdGhlIGNvbW1hbmQgZXhlY3V0aW9uIHRocmVhZChzKS4KLQkgKiBBbGxvdyB0aGUgY29tbWFuZCBleGVjdXRpb24gdGhyZWFkKHMpIHRvIGJlIGFzc2lnbmVkIEpESy1nZW5lcmF0ZWQgbmFtZXMuCi0JICogQW55IGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSBjb25zdW1lciB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlCi0JICogc3BlY2lmaWVkIGV4Y2VwdGlvbiBoYW5kbGVyLgotCSAqLwotCXB1YmxpYyBBc3luY2hyb25vdXNFeHRlbmRlZENvbW1hbmRFeGVjdXRvcihFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIpIHsKLQkJdGhpcyhudWxsLCBleGNlcHRpb25IYW5kbGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIGNvbW1hbmQgZXhlY3V0b3IuCi0JICogVXNlIHNpbXBsZSBKREsgdGhyZWFkKHMpIGZvciB0aGUgY29tbWFuZCBleGVjdXRpb24gdGhyZWFkKHMpLgotCSAqIEFzc2lnbiB0aGUgY29tbWFuZCBleGVjdXRpb24gdGhyZWFkKHMpIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBBbnkgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNvbnN1bWVyIHdpbGwgYmUgaGFuZGxlZCBieSB0aGUKLQkgKiBzcGVjaWZpZWQgZXhjZXB0aW9uIGhhbmRsZXIuCi0JICovCi0JcHVibGljIEFzeW5jaHJvbm91c0V4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yKFN0cmluZyB0aHJlYWROYW1lLCBFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIpIHsKLQkJdGhpcyhuZXcgU2ltcGxlU3RhdGVmdWxFeHRlbmRlZENvbW1hbmRFeGVjdXRvcihFeHRlbmRlZENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCkpLCBTaW1wbGVUaHJlYWRGYWN0b3J5Lmluc3RhbmNlKCksIHRocmVhZE5hbWUsIGV4Y2VwdGlvbkhhbmRsZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhc3luY2hyb25vdXMgY29tbWFuZCBleGVjdXRvci4KLQkgKiBEZWxlZ2F0ZSBjb21tYW5kIGV4ZWN1dGlvbiB0byB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgZXhlY3V0b3IuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgdGhyZWFkIGZhY3RvcnkgdG8gY29uc3RydWN0IHRoZSBjb21tYW5kIGV4ZWN1dGlvbgotCSAqIHRocmVhZChzKSBhbmQgYXNzaWduIHRoZW0gdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIEFueSBleGNlcHRpb25zIHRocm93biBieSB0aGUgY29uc3VtZXIgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZQotCSAqIHNwZWNpZmllZCBleGNlcHRpb24gaGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgQXN5bmNocm9ub3VzRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IoU3RhdGVmdWxFeHRlbmRlZENvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IsIFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSwgU3RyaW5nIHRocmVhZE5hbWUsIEV4Y2VwdGlvbkhhbmRsZXIgZXhjZXB0aW9uSGFuZGxlcikgewotCQlzdXBlcihjb21tYW5kRXhlY3V0b3IsIHRocmVhZEZhY3RvcnksIHRocmVhZE5hbWUsIGV4Y2VwdGlvbkhhbmRsZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhc3luY2hyb25vdXMgY29tbWFuZCBleGVjdXRvci4KLQkgKiBEZWxlZ2F0ZSBjb21tYW5kIGV4ZWN1dGlvbiB0byB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgZXhlY3V0b3IuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgdGhyZWFkIGZhY3RvcnkgdG8gY29uc3RydWN0IHRoZSBjb21tYW5kIGV4ZWN1dGlvbgotCSAqIHRocmVhZChzKSBhbmQgYXNzaWduIHRoZW0gdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIEFueSBleGNlcHRpb25zIHRocm93biBieSB0aGUgY29uc3VtZXIgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZQotCSAqIHNwZWNpZmllZCBleGNlcHRpb24gaGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgQXN5bmNocm9ub3VzRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IoQ29uZmlnIGNvbmZpZykgewotCQlzdXBlcihjb25maWcpOwotCX0KLQotCi0JLyoqCi0JICogV2FpdCB1bnRpbCBhbGwgdGhlIGNvbW1hbmRzIGN1cnJlbnRseSBvbiB0aGUgcXVldWUgaGF2ZSBiZWVuIGV4ZWN1dGVkLAotCSAqIHRoZW4gZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQuIFN1c3BlbmQgdGhlIGNvbW1hbmQtZXhlY3V0aW5nIHRocmVhZAotCSAqIHdoaWxlIHdlIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRUb0V4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlTeW5jaHJvbml6aW5nQ29tbWFuZCBzeW5jQ29tbWFuZCA9IG5ldyBTeW5jaHJvbml6aW5nQ29tbWFuZCgpOwotCi0JCXRoaXMuZXhlY3V0ZShzeW5jQ29tbWFuZCk7ICAvLyBkaXNwYXRjaCB0aGUgc3luYyBjb21tYW5kIHRvIHRoZSBvdGhlciB0aHJlYWQKLQotCQl0cnkgewotCQkJc3luY0NvbW1hbmQud2FpdEZvckV4ZWN1dGlvbigpOwotCQkJdGhpcy5jb21tYW5kRXhlY3V0b3Iud2FpdFRvRXhlY3V0ZShjb21tYW5kKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXN5bmNDb21tYW5kLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFdhaXQgdW50aWwgYWxsIHRoZSBjb21tYW5kcyBjdXJyZW50bHkgb24gdGhlIHF1ZXVlIGhhdmUgYmVlbiBleGVjdXRlZCwKLQkgKiB0aGVuIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kLiBTdXNwZW5kIHRoZSBjb21tYW5kLWV4ZWN1dGluZyB0aHJlYWQKLQkgKiB3aGlsZSB3ZSBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9FeGVjdXRlKENvbW1hbmQgY29tbWFuZCwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJdGhpcy53YWl0VG9FeGVjdXRlKGNvbW1hbmQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCVN5bmNocm9uaXppbmdDb21tYW5kIHN5bmNDb21tYW5kID0gbmV3IFN5bmNocm9uaXppbmdDb21tYW5kKCk7Ci0KLQkJdGhpcy5leGVjdXRlKHN5bmNDb21tYW5kKTsgIC8vIGRpc3BhdGNoIHRoZSBzeW5jIGNvbW1hbmQgdG8gdGhlIG90aGVyIHRocmVhZAotCi0JCXRyeSB7Ci0JCQlpZiAoc3luY0NvbW1hbmQud2FpdEZvckV4ZWN1dGlvbih0aW1lb3V0KSkgewotCQkJCS8vIGFkanVzdCB0aGUgdGltZQotCQkJCXRpbWVvdXQgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJcmV0dXJuICh0aW1lb3V0ID4gMCkgJiYgdGhpcy5jb21tYW5kRXhlY3V0b3Iud2FpdFRvRXhlY3V0ZShjb21tYW5kLCB0aW1lb3V0KTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSBmaW5hbGx5IHsKLQkJCXN5bmNDb21tYW5kLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25maWcgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uZmlnIHVzZWZ1bCBmb3IgaW5zdGFudGlhdGluZyBhbiB7QGxpbmsgQXN5bmNocm9ub3VzRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3J9LgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgQ29uZmlnCi0JCWV4dGVuZHMgQWJzdHJhY3RBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IuQ29uZmlnPFN0YXRlZnVsRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3I+Ci0JewotCQkvLyBnZW5lcmljCi0JfQotCi0JLyoqCi0JICogQ29uZmlnIHVzZWZ1bCBmb3IgaW5zdGFudGlhdGluZyBhbiB7QGxpbmsgQXN5bmNocm9ub3VzRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3J9LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlQ29uZmlnCi0JCWV4dGVuZHMgQWJzdHJhY3RBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IuU2ltcGxlQ29uZmlnPFN0YXRlZnVsRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3I+Ci0JCWltcGxlbWVudHMgQ29uZmlnCi0JewotCQlwdWJsaWMgU2ltcGxlQ29uZmlnKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgU2ltcGxlQ29uZmlnKFN0YXRlZnVsRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yLCBUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnksIFN0cmluZyB0aHJlYWROYW1lLCBFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIpIHsKLQkJCXN1cGVyKGNvbW1hbmRFeGVjdXRvciwgdGhyZWFkRmFjdG9yeSwgdGhyZWFkTmFtZSwgZXhjZXB0aW9uSGFuZGxlcik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdGF0ZWZ1bEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yIGJ1aWxkRGVmYXVsdENvbW1hbmRFeGVjdXRvcigpIHsKLQkJCXJldHVybiBuZXcgU2ltcGxlU3RhdGVmdWxFeHRlbmRlZENvbW1hbmRFeGVjdXRvcigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9Bc3luY2hyb25vdXNOb3RpZnlpbmdSZXBlYXRpbmdDb21tYW5kV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9Bc3luY2hyb25vdXNOb3RpZnlpbmdSZXBlYXRpbmdDb21tYW5kV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGU5NzNiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvQXN5bmNocm9ub3VzTm90aWZ5aW5nUmVwZWF0aW5nQ29tbWFuZFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRXhjZXB0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLk5vdGlmeWluZ1JlcGVhdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLQotLyoqCi0gKiBFeHRlbmQgdGhlIGFzeW5jaHJvbm91cyByZXBlYXRpbmcgY29tbWFuZCB0byBub3RpZnkgbGlzdGVuZXJzCi0gKiB3aGVuIGFuIGV4ZWN1dGlvbiAiY3ljbGUiIGlzIGNvbXBsZXRlOyBpLmUuIHRoZSBjb21tYW5kIGhhcywKLSAqIGZvciB0aGUgbW9tZW50LCBoYW5kbGVkIGV2ZXJ5IG91dHN0YW5kaW5nICJleGVjdXRlIiByZXF1ZXN0IGFuZCBxdWllc2NlZC4KLSAqIFRoaXMgbm90aWZpY2F0aW9uIGlzIDxlbT5ub3Q8L2VtPiBndWFyYW50ZWVkIHRvIG9jY3VyIHdpdGggPGVtPmV2ZXJ5PC9lbT4KLSAqIGV4ZWN1dGlvbiAiY3ljbGUiOyBzaW5jZSBvdGhlciwgdW5yZWxhdGVkLCBleGVjdXRpb25zIGNhbiBiZQotICogdHJpZ2dlcmVkIGNvbmN1cnJlbnRseS4KLSAqLwotcHVibGljIGNsYXNzIEFzeW5jaHJvbm91c05vdGlmeWluZ1JlcGVhdGluZ0NvbW1hbmRXcmFwcGVyCi0JZXh0ZW5kcyBBc3luY2hyb25vdXNSZXBlYXRpbmdDb21tYW5kV3JhcHBlcgotCWltcGxlbWVudHMgTm90aWZ5aW5nUmVwZWF0aW5nQ29tbWFuZAotewotCXByaXZhdGUgZmluYWwgTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgYW55IGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhc3luY2hyb25vdXMgbm90aWZ5aW5nIHJlcGVhdGluZyBjb21tYW5kIHRoYXQgZXhlY3V0ZXMgdGhlCi0JICogc3BlY2lmaWVkIGNvbW1hbmQuCi0JICogQWxsb3cgdGhlIGV4ZWN1dGlvbiB0aHJlYWQocykgdG8gYmUgYXNzaWduZWQgSkRLLWdlbmVyYXRlZCBuYW1lcy4KLQkgKi8KLQlwdWJsaWMgQXN5bmNocm9ub3VzTm90aWZ5aW5nUmVwZWF0aW5nQ29tbWFuZFdyYXBwZXIoQ29tbWFuZCBjb21tYW5kLCBFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIpIHsKLQkJc3VwZXIoY29tbWFuZCwgZXhjZXB0aW9uSGFuZGxlcik7Ci0JCXRoaXMuZXhjZXB0aW9uSGFuZGxlciA9IGV4Y2VwdGlvbkhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzeW5jaHJvbm91cyBub3RpZnlpbmcgcmVwZWF0aW5nIGNvbW1hbmQgdGhhdCBleGVjdXRlcyB0aGUKLQkgKiBzcGVjaWZpZWQgY29tbWFuZC4KLQkgKiBBc3NpZ24gdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykgdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqLwotCXB1YmxpYyBBc3luY2hyb25vdXNOb3RpZnlpbmdSZXBlYXRpbmdDb21tYW5kV3JhcHBlcihDb21tYW5kIGNvbW1hbmQsIFN0cmluZyB0aHJlYWROYW1lLCBFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIpIHsKLQkJc3VwZXIoY29tbWFuZCwgdGhyZWFkTmFtZSwgZXhjZXB0aW9uSGFuZGxlcik7Ci0JCXRoaXMuZXhjZXB0aW9uSGFuZGxlciA9IGV4Y2VwdGlvbkhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzeW5jaHJvbm91cyAgcmVwZWF0aW5nIGNvbW1hbmQgdGhhdCBleGVjdXRlcyB0aGUKLQkgKiBzcGVjaWZpZWQgY29tbWFuZC4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCB0aHJlYWQgZmFjdG9yeSB0byBjb25zdHJ1Y3QgdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykuCi0JICogQXNzaWduIHRoZSBzeW5jaHJvbml6YXRpb24gdGhyZWFkKHMpIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBBbnkgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNvbnN1bWVyIHdpbGwgYmUgaGFuZGxlZCBieSB0aGUKLQkgKiBzcGVjaWZpZWQgZXhjZXB0aW9uIGhhbmRsZXIuCi0JICovCi0JcHVibGljIEFzeW5jaHJvbm91c05vdGlmeWluZ1JlcGVhdGluZ0NvbW1hbmRXcmFwcGVyKENvbmZpZyBjb25maWcpIHsKLQkJc3VwZXIoY29uZmlnKTsKLQkJdGhpcy5leGNlcHRpb25IYW5kbGVyID0gY29uZmlnLmdldEV4Y2VwdGlvbkhhbmRsZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIG5vdGlmeWluZyByZXBlYXRpbmcgY29tbWFuZCB0aGF0IGV4ZWN1dGVzIHRoZQotCSAqIHNwZWNpZmllZCBjb21tYW5kLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHRocmVhZCBmYWN0b3J5IHRvIGNvbnN0cnVjdCB0aGUgc3luY2hyb25pemF0aW9uIHRocmVhZChzKS4KLQkgKiBBc3NpZ24gdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykgdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIEFueSBleGNlcHRpb25zIHRocm93biBieSB0aGUgY29uc3VtZXIgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZQotCSAqIHNwZWNpZmllZCBleGNlcHRpb24gaGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgQXN5bmNocm9ub3VzTm90aWZ5aW5nUmVwZWF0aW5nQ29tbWFuZFdyYXBwZXIoQ29tbWFuZCBjb21tYW5kLCBUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnksIFN0cmluZyB0aHJlYWROYW1lLCBFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIpIHsKLQkJc3VwZXIoY29tbWFuZCwgdGhyZWFkRmFjdG9yeSwgdGhyZWFkTmFtZSwgZXhjZXB0aW9uSGFuZGxlcik7Ci0JCXRoaXMuZXhjZXB0aW9uSGFuZGxlciA9IGV4Y2VwdGlvbkhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBjb25zdW1lciB0aGF0IHdpbGwgbGV0IHVzIGtub3cgd2hlbiB0aGUgZXhlY3V0aW9uIHRocmVhZCBoYXMKLQkgKiBxdWllc2NlZC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlDb25zdW1lclRocmVhZENvb3JkaW5hdG9yLkNvbnN1bWVyIGJ1aWxkQ29uc3VtZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBuZXcgTm90aWZ5aW5nQ29uc3VtZXIoY29tbWFuZCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE5vdGlmeWluZ1JlcGVhdGluZ0NvbW1hbmQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5saXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBvdXIgbGlzdGVuZXJzLgotCSAqLwotCS8qIENVIHByaXZhdGUgKi8gdm9pZCBleGVjdXRpb25RdWllc2NlZCgpIHsKLQkJZm9yIChMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQl0cnkgewotCQkJCWxpc3RlbmVyLmV4ZWN1dGlvblF1aWVzY2VkKHRoaXMpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJCS8vIHdlIGNvdWxkIGxldCB0aGUgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvciBoYW5kbGUgdGhlc2U7Ci0JCQkJLy8gYnV0IHRoZW4gdGhlIGxvb3Agd291bGQgYmUgc3RvcHBlZCB3aXRoIHRoZSBmaXJzdCBleGNlcHRpb24uLi4KLQkJCQl0aGlzLmV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdW1lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQge0BsaW5rIEFzeW5jaHJvbm91c1JlcGVhdGluZ0NvbW1hbmRXcmFwcGVyLkNvbnN1bWVyfQotCSAqIHRvIG5vdGlmeSB0aGUgcmVwZWF0aW5nIGNvbW1hbmQgd2hlbiBleGVjdXRpb24gaGFzIHF1aWVzY2VkCi0JICogKGkuZS4gdGhlIGNvbW1hbmQgaGFzIGZpbmlzaGVkIGV4ZWN1dGluZyBhbmQgdGhlcmUgYXJlIG5vIGZ1cnRoZXIKLQkgKiByZXF1ZXN0cyBmb3IgZXhlY3V0aW9uKS4KLQkgKiBCZWNhdXNlIGV4ZWN1dGlvbiBpcyBhc3luY2hyb25vdXMsIG5vIG90aGVyIHRocmVhZCB3aWxsIGJlIGFibGUgdG8KLQkgKiBpbml0aWF0ZSBhbm90aGVyIGV4ZWN1dGlvbiB1bnRpbCB0aGUgY29tbWFuZCdzIGxpc3RlbmVycyBoYXZlIGJlZW4KLQkgKiBub3RpZmllZC4gTm90ZSBhbHNvLCB0aGUgY29tbWFuZCdzIGxpc3RlbmVycyBjYW4sIHRoZW1zZWx2ZXMsCi0JICogdHJpZ2dlciBhbm90aGVyIGV4ZWN1dGlvbiAoYnkgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBjYWxsaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpfSk7Ci0JICogYnV0IHRoaXMgZXhlY3V0aW9uIHdpbGwgbm90IG9jY3VyIHVudGlsIDxlbT5hZnRlcjwvZW0+IGFsbCB0aGUKLQkgKiBsaXN0ZW5lcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLgotCSAqLwotCS8qIENVIHByaXZhdGUgKi8gY2xhc3MgTm90aWZ5aW5nQ29uc3VtZXIKLQkJZXh0ZW5kcyBDb25zdW1lcgotCXsKLQkJTm90aWZ5aW5nQ29uc3VtZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQlzdXBlcihjb21tYW5kKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBjb25zdW1lKCkgewotCQkJc3VwZXIuY29uc3VtZSgpOwotCQkJLy8gaG1tbSAtIHdlIHdpbGwgbm90aWZ5IGxpc3RlbmVycyBldmVuIHdoZW4gd2Ugb3VyIHRocmVhZCBpcyAiaW50ZXJydXB0ZWQiOwotCQkJLy8gdGhhdCBzZWVtcyBvay4uLiAgfmJqdgotCQkJaWYgKEFzeW5jaHJvbm91c05vdGlmeWluZ1JlcGVhdGluZ0NvbW1hbmRXcmFwcGVyLnRoaXMuZXhlY3V0ZUZsYWcuaXNGYWxzZSgpKSB7Ci0JCQkJQXN5bmNocm9ub3VzTm90aWZ5aW5nUmVwZWF0aW5nQ29tbWFuZFdyYXBwZXIudGhpcy5leGVjdXRpb25RdWllc2NlZCgpOwotCQkJfQotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL0FzeW5jaHJvbm91c1JlcGVhdGluZ0NvbW1hbmRXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL0FzeW5jaHJvbm91c1JlcGVhdGluZ0NvbW1hbmRXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYWE0MjMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9Bc3luY2hyb25vdXNSZXBlYXRpbmdDb21tYW5kV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkV4Y2VwdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5SZXBlYXRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db25zdW1lclRocmVhZENvb3JkaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVUaHJlYWRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdGFja1RyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkQm9vbGVhbjsKLQotLyoqCi0gKiBUaGlzIHJlcGVhdGluZyBjb21tYW5kIHdpbGwgcGVyZm9ybSBhIGNsaWVudC1zdXBwbGllZCBjb21tYW5kIGluIGEgc2VwYXJhdGUKLSAqIHRocmVhZCwgYWxsb3dpbmcgY2FsbHMgdG8ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpfQotICogdG8gcmV0dXJuIGltbWVkaWF0ZWx5LgotICovCi1wdWJsaWMgY2xhc3MgQXN5bmNocm9ub3VzUmVwZWF0aW5nQ29tbWFuZFdyYXBwZXIKLQlpbXBsZW1lbnRzIFJlcGVhdGluZ0NvbW1hbmQKLXsKLQkvKioKLQkgKiBUaGlzIGZsYWcgaXMgc2hhcmVkIHdpdGggdGhlIGV4ZWN1dGlvbi9jb25zdW1lciB0aHJlYWQuIFNldHRpbmcgaXQgdG8KLQkgKiA8Y29kZT50cnVlPC9jb2RlPiB3aWxsIHRyaWdnZXIgdGhlIGV4ZWN1dGlvbiB0byBiZWdpbiBvciwgaWYgdGhlCi0JICogZXhlY3V0aW9uIGlzIGN1cnJlbnRseSB1bmRlciB3YXksIHRvIGV4ZWN1dGUgYWdhaW4sIG9uY2UgdGhlIGN1cnJlbnQKLQkgKiBleGVjdXRpb24gaXMgY29tcGxldGUuCi0JICovCi0JZmluYWwgU3luY2hyb25pemVkQm9vbGVhbiBleGVjdXRlRmxhZyA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKGZhbHNlKTsKLQotCS8qKgotCSAqIE1vc3Qgb2YgdGhlIHRocmVhZC1yZWxhdGVkIGJlaGF2aW9yIGlzIGRlbGVnYXRlZCB0byB0aGlzIGNvb3JkaW5hdG9yLgotCSAqLwotCXByaXZhdGUgZmluYWwgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvciBjb25zdW1lclRocmVhZENvb3JkaW5hdG9yOwotCi0JLyoqCi0JICogTGlzdCBvZiBzdGFjayB0cmFjZXMgZm9yIGVhY2ggKHJlcGVhdGluZykgaW52b2NhdGlvbiBvZiB0aGUgY29tbWFuZCwKLQkgKiBzdGFydGluZyB3aXRoIHRoZSBpbml0aWFsIGludm9jYXRpb24uIFRoZSBsaXN0IGlzIGNsZWFyZWQgd2l0aCBlYWNoCi0JICogaW5pdGlhbCBpbnZvY2F0aW9uIG9mIHRoZSBjb21tYW5kLgotCSAqLwotCXByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFN0YWNrVHJhY2U+IHN0YWNrVHJhY2VzID0gREVCVUcgPyBuZXcgQXJyYXlMaXN0PFN0YWNrVHJhY2U+KCkgOiBudWxsOwotCS8vIHNlZSBBc3luY2hyb25vdXNSZXBlYXRpbmdDb21tYW5kV3JhcHBlclRlc3RzLnRlc3RERUJVRygpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIHJlcGVhdGluZyBjb21tYW5kIHRoYXQgZXhlY3V0ZXMgdGhlIHNwZWNpZmllZAotCSAqIGNvbW1hbmQuCi0JICogVXNlIHNpbXBsZSBKREsgdGhyZWFkKHMpIGZvciB0aGUgZXhlY3V0aW9uIHRocmVhZChzKS4KLQkgKiBBbGxvdyB0aGUgZXhlY3V0aW9uIHRocmVhZChzKSB0byBiZSBhc3NpZ25lZCBKREstZ2VuZXJhdGVkIG5hbWVzLgotCSAqIEFueSBleGNlcHRpb25zIHRocm93biBieSB0aGUgY29uc3VtZXIgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZQotCSAqIHNwZWNpZmllZCBleGNlcHRpb24gaGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgQXN5bmNocm9ub3VzUmVwZWF0aW5nQ29tbWFuZFdyYXBwZXIoQ29tbWFuZCBjb21tYW5kLCBFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIpIHsKLQkJdGhpcyhjb21tYW5kLCBudWxsLCBudWxsLCBleGNlcHRpb25IYW5kbGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIHJlcGVhdGluZyBjb21tYW5kIHRoYXQgZXhlY3V0ZXMgdGhlIHNwZWNpZmllZAotCSAqIGNvbW1hbmQuIEFzc2lnbiB0aGUgZXhlY3V0aW9uIHRocmVhZChzKSB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogVXNlIHNpbXBsZSBKREsgdGhyZWFkKHMpIGZvciB0aGUgZXhlY3V0aW9uIHRocmVhZChzKS4KLQkgKiBBbnkgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNvbnN1bWVyIHdpbGwgYmUgaGFuZGxlZCBieSB0aGUKLQkgKiBzcGVjaWZpZWQgZXhjZXB0aW9uIGhhbmRsZXIuCi0JICovCi0JcHVibGljIEFzeW5jaHJvbm91c1JlcGVhdGluZ0NvbW1hbmRXcmFwcGVyKENvbW1hbmQgY29tbWFuZCwgU3RyaW5nIHRocmVhZE5hbWUsIEV4Y2VwdGlvbkhhbmRsZXIgZXhjZXB0aW9uSGFuZGxlcikgewotCQl0aGlzKGNvbW1hbmQsIG51bGwsIHRocmVhZE5hbWUsIGV4Y2VwdGlvbkhhbmRsZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhc3luY2hyb25vdXMgcmVwZWF0aW5nIGNvbW1hbmQgdGhhdCBleGVjdXRlcyB0aGUgc3BlY2lmaWVkCi0JICogY29tbWFuZC4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCB0aHJlYWQgZmFjdG9yeSB0byBjb25zdHJ1Y3QgdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykuCi0JICogQXNzaWduIHRoZSBzeW5jaHJvbml6YXRpb24gdGhyZWFkKHMpIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBBbnkgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNvbnN1bWVyIHdpbGwgYmUgaGFuZGxlZCBieSB0aGUKLQkgKiBzcGVjaWZpZWQgZXhjZXB0aW9uIGhhbmRsZXIuCi0JICovCi0JcHVibGljIEFzeW5jaHJvbm91c1JlcGVhdGluZ0NvbW1hbmRXcmFwcGVyKENvbmZpZyBjb25maWcpIHsKLQkJdGhpcyhjb25maWcuZ2V0Q29tbWFuZCgpLCBjb25maWcuZ2V0VGhyZWFkRmFjdG9yeSgpLCBjb25maWcuZ2V0VGhyZWFkTmFtZSgpLCBjb25maWcuZ2V0RXhjZXB0aW9uSGFuZGxlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIHJlcGVhdGluZyBjb21tYW5kIHRoYXQgZXhlY3V0ZXMgdGhlIHNwZWNpZmllZAotCSAqIGNvbW1hbmQuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgdGhyZWFkIGZhY3RvcnkgdG8gY29uc3RydWN0IHRoZSBzeW5jaHJvbml6YXRpb24gdGhyZWFkKHMpLgotCSAqIEFzc2lnbiB0aGUgc3luY2hyb25pemF0aW9uIHRocmVhZChzKSB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogQW55IGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSBjb25zdW1lciB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlCi0JICogc3BlY2lmaWVkIGV4Y2VwdGlvbiBoYW5kbGVyLgotCSAqLwotCXB1YmxpYyBBc3luY2hyb25vdXNSZXBlYXRpbmdDb21tYW5kV3JhcHBlcihDb21tYW5kIGNvbW1hbmQsIFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSwgU3RyaW5nIHRocmVhZE5hbWUsIEV4Y2VwdGlvbkhhbmRsZXIgZXhjZXB0aW9uSGFuZGxlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IgPSBuZXcgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvcih0aGlzLmJ1aWxkQ29uc3VtZXIoY29tbWFuZCksIHRocmVhZEZhY3RvcnksIHRocmVhZE5hbWUsIGV4Y2VwdGlvbkhhbmRsZXIpOwotCX0KLQotCUNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IuQ29uc3VtZXIgYnVpbGRDb25zdW1lcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIG5ldyBDb25zdW1lcihjb21tYW5kKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUmVwZWF0aW5nQ29tbWFuZCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCdWlsZCBhbmQgc3RhcnQgdGhlIGV4ZWN1dGlvbiB0aHJlYWQsIGJ1dCBwb3N0cG9uZSB0aGUgZmlyc3QKLQkgKiBleGVjdXRpb24gdW50aWwgcmVxdWVzdGVkLCBpLmUuIHZpYSBhIGNhbGwgdG8ge0BsaW5rICNleGVjdXRlKCl9LgotCSAqIDxwPgotCSAqIE5vdGU6IFdlIGRvbid0IGNsZWFyIHRoZSAiZXhlY3V0ZSIgZmxhZyBoZXJlOyBzbyBpZiB0aGUgZmxhZyBoYXMKLQkgKiBiZWVuIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiA8ZW0+YmVmb3JlPC9lbT4gZ2V0dGluZyBoZXJlLCB0aGUgZmlyc3QKLQkgKiBleGVjdXRpb24gd2lsbCBzdGFydCBwcm9tcHRseSAoYWxiZWl0LCBhc3luY2hyb25vdXNseSkuCi0JICogVGhlICJleGVjdXRlIiBmbGFnIHdpbGwgYmUgc2V0IGlmOjx1bD4KLQkgKiA8bGk+e0BsaW5rICNleGVjdXRlKCl9IHdhcyBjYWxsZWQgYWZ0ZXIgdGhlIHJlcGVhdGluZyBjb21tYW5kIHdhcwotCSAqICAgICBjb25zdHJ1Y3RlZCBidXQgYmVmb3JlIHtAbGluayAjc3RhcnQoKX0gd2FzIGNhbGxlZDsgb3IKLQkgKiA8bGk+e0BsaW5rICNleGVjdXRlKCl9IHdhcyBjYWxsZWQgYWZ0ZXIge0BsaW5rICNzdG9wKCl9IHdhcyBjYWxsZWQKLQkgKiAgICAgYnV0IGJlZm9yZSB7QGxpbmsgI3N0YXJ0KCl9IHdhcyBjYWxsZWQgKHRvIHJlc3RhcnQgdGhlIHJlcGVhdGluZwotCSAqICAgICBjb21tYW5kKTsgb3IKLQkgKiA8bGk+e0BsaW5rICNzdG9wKCl9IHdhcyBjYWxsZWQgd2hlbiB0aGVyZSB3YXMgYW4gb3V0c3RhbmRpbmcgcmVxdWVzdAotCSAqICAgICBmb3IgYW4gZXhlY3V0aW9uIChpLmUuIHRoZSAiZXhlY3V0ZSIgZmxhZyB3YXMgPGNvZGU+dHJ1ZTwvY29kZT4gYXQKLQkgKiAgICAgdGhlIHRpbWUge0BsaW5rICNzdG9wKCl9IHdhcyBjYWxsZWQpCi0JICogPC91bD4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJdGhpcy5jb25zdW1lclRocmVhZENvb3JkaW5hdG9yLnN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSAiZXhlY3V0ZSIgZmxhZyBzbyB0aGUgZXhlY3V0aW9uIHRocmVhZCB3aWxsIGVpdGhlcjx1bD4KLQkgKiA8bGk+aWYgdGhlIHRocmVhZCBpcyBxdWllc2NlZCwgc3RhcnQgYW4gZXhlY3V0aW9uIGltbWVkaWF0ZWx5LCBvcgotCSAqIDxsaT5pZiB0aGUgdGhyZWFkIGlzIGN1cnJlbnRseSBleGVjdXRpbmcsIGV4ZWN1dGUgYWdhaW4sCi0JICogICAgIG9uY2UgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGlzIGNvbXBsZXRlCi0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMuZXhlY3V0ZUZsYWcpIHsKLQkJCWlmIChERUJVRykgewotCQkJCWlmICh0aGlzLmV4ZWN1dGVGbGFnLmlzRmFsc2UoKSkgewotCQkJCQl0aGlzLnN0YWNrVHJhY2VzLmNsZWFyKCk7Ci0JCQkJfQotCQkJCXRoaXMuc3RhY2tUcmFjZXMuYWRkKG5ldyBTdGFja1RyYWNlKCkpOwotCQkJfQotCQkJdGhpcy5leGVjdXRlRmxhZy5zZXRUcnVlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnRlcnJ1cHQgdGhlIGV4ZWN1dGlvbiB0aHJlYWQgc28gdGhhdCBpdCBzdG9wcyBleGVjdXRpbmcgYXQgdGhlCi0JICogZW5kIG9mIHRoZSBjdXJyZW50IGV4ZWN1dGlvbi4gU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwKLQkgKiB0aGUgZXhlY3V0aW9uIHRocmVhZCBpcyBmaW5pc2hlZCBleGVjdXRpbmcuIElmIGFueSB1bmNhdWdodAotCSAqIGV4Y2VwdGlvbnMgd2VyZSB0aHJvd24gd2hpbGUgdGhlIGV4ZWN1dGlvbiB0aHJlYWQgd2FzIGV4ZWN1dGluZywKLQkgKiB3cmFwIHRoZW0gaW4gYSBjb21wb3NpdGUgZXhjZXB0aW9uIGFuZCB0aHJvdyB0aGUgY29tcG9zaXRlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgY29vcmRpbmF0b3IgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25zdW1lclRocmVhZENvb3JkaW5hdG9yLnN0b3AoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdW1lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db25zdW1lclRocmVhZENvb3JkaW5hdG9yLkNvbnN1bWVyfQotCSAqIHdpbGwgZXhlY3V0ZSB0aGUgY2xpZW50LXN1cHBsaWVkIGNvbW1hbmQuCi0JICogSXQgd2lsbCB3YWl0IHVudGlsIHRoZSBzaGFyZWQgImV4ZWN1dGUiIGZsYWcgaXMgc2V0IHRvIGV4ZWN1dGUgdGhlCi0JICogY29tbWFuZC4gT25jZSB0aGUgY29tYW5kIGlzIGV4ZWN1dGVkLCB0aGUgdGhyZWFkIHdpbGwgcXVpZXNjZSB1bnRpbAotCSAqIHRoZSBmbGFnIGlzIHNldCBhZ2Fpbi4gSWYgdGhlIGZsYWcgd2FzIHNldCBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKLQkgKiBjb21tYW5kIChlaXRoZXIgcmVjdXJzaXZlbHkgYnkgdGhlIGNvbW1hbmQgaXRzZWxmIG9yIGJ5IGFub3RoZXIgdGhyZWFkKSwKLQkgKiB0aGUgY29tbWFuZCB3aWxsIGJlIHJlLWV4ZWN1dGVkIGltbWVkaWF0ZWx5LiBTdG9wIHRoZSB0aHJlYWQgYnkgY2FsbGluZwotCSAqIHtAbGluayBUaHJlYWQjaW50ZXJydXB0KCl9LgotCSAqLwotCWNsYXNzIENvbnN1bWVyCi0JCWltcGxlbWVudHMgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5Db25zdW1lcgotCXsKLQkJLyoqCi0JCSAqIFRoZSBjbGllbnQtc3VwcGxpZWQgY29tbWFuZCB0aGF0IGV4ZWN1dGVzIG9uIHRoZQotCQkgKiBleGVjdXRpb24vY29uc3VtZXIgdGhyZWFkLgotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBDb21tYW5kIGNvbW1hbmQ7Ci0KLQkJQ29uc3VtZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQlzdXBlcigpOwotCQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQkJfQotCi0JCS8qKgotCQkgKiBXYWl0IHVudGlsIHRoZSAiZXhlY3V0ZSIgZmxhZyBpcyBzZXQsCi0JCSAqIHRoZW4gY2xlYXIgaXQgYW5kIGFsbG93IHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3YWl0Rm9yUHJvZHVjZXIoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJQXN5bmNocm9ub3VzUmVwZWF0aW5nQ29tbWFuZFdyYXBwZXIudGhpcy5leGVjdXRlRmxhZy53YWl0VG9TZXRGYWxzZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEV4ZWN1dGUgdGhlIGNsaWVudC1zdXBwbGllZCBjb21tYW5kLgotCQkgKi8KLQkJcHVibGljIHZvaWQgY29uc3VtZSgpIHsKLQkJCXRoaXMuY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY29tbWFuZCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uZmlnICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbmZpZyB1c2VmdWwgZm9yIGluc3RhbnRpYXRpbmcgYW4ge0BsaW5rIEFic3RyYWN0QXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yfS4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIENvbmZpZyB7Ci0JCUNvbW1hbmQgZ2V0Q29tbWFuZCgpOwotCQlUaHJlYWRGYWN0b3J5IGdldFRocmVhZEZhY3RvcnkoKTsKLQkJU3RyaW5nIGdldFRocmVhZE5hbWUoKTsKLQkJRXhjZXB0aW9uSGFuZGxlciBnZXRFeGNlcHRpb25IYW5kbGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uZmlnIHVzZWZ1bCBmb3IgaW5zdGFudGlhdGluZyBhbiB7QGxpbmsgQWJzdHJhY3RBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3J9LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgU2ltcGxlQ29uZmlnCi0JCWltcGxlbWVudHMgQ29uZmlnCi0JewotCQlwcml2YXRlIHZvbGF0aWxlIENvbW1hbmQgY29tbWFuZDsKLQkJcHJpdmF0ZSB2b2xhdGlsZSBUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3Rvcnk7Ci0JCXByaXZhdGUgdm9sYXRpbGUgU3RyaW5nIHRocmVhZE5hbWU7Ci0JCXByaXZhdGUgdm9sYXRpbGUgRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyOwotCi0JCXByb3RlY3RlZCBTaW1wbGVDb25maWcoKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb21tYW5kID0gdGhpcy5idWlsZERlZmF1bHRDb21tYW5kKCk7Ci0JCQl0aGlzLnRocmVhZEZhY3RvcnkgPSB0aGlzLmJ1aWxkRGVmYXVsdFRocmVhZEZhY3RvcnkoKTsKLQkJCXRoaXMudGhyZWFkTmFtZSA9IHRoaXMuYnVpbGREZWZhdWx0VGhyZWFkTmFtZSgpOwotCQkJdGhpcy5leGNlcHRpb25IYW5kbGVyID0gdGhpcy5idWlsZERlZmF1bHRFeGNlcHRpb25IYW5kbGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU2ltcGxlQ29uZmlnKENvbW1hbmQgY29tbWFuZCwgVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5LCBTdHJpbmcgdGhyZWFkTmFtZSwgRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQkJCXRoaXMudGhyZWFkRmFjdG9yeSA9IHRocmVhZEZhY3Rvcnk7Ci0JCQl0aGlzLnRocmVhZE5hbWUgPSB0aHJlYWROYW1lOwotCQkJdGhpcy5leGNlcHRpb25IYW5kbGVyID0gZXhjZXB0aW9uSGFuZGxlcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldENvbW1hbmQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQl0aGlzLmNvbW1hbmQgPSBjb21tYW5kOwotCQl9Ci0JCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21tYW5kOwotCQl9Ci0JCXByb3RlY3RlZCBhYnN0cmFjdCBDb21tYW5kIGJ1aWxkRGVmYXVsdENvbW1hbmQoKTsKLQotCQlwdWJsaWMgdm9pZCBzZXRUaHJlYWRGYWN0b3J5KFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSkgewotCQkJdGhpcy50aHJlYWRGYWN0b3J5ID0gdGhyZWFkRmFjdG9yeTsKLQkJfQotCQlwdWJsaWMgVGhyZWFkRmFjdG9yeSBnZXRUaHJlYWRGYWN0b3J5KCkgewotCQkJcmV0dXJuIHRoaXMudGhyZWFkRmFjdG9yeTsKLQkJfQotCQlwcm90ZWN0ZWQgVGhyZWFkRmFjdG9yeSBidWlsZERlZmF1bHRUaHJlYWRGYWN0b3J5KCkgewotCQkJcmV0dXJuIFNpbXBsZVRocmVhZEZhY3RvcnkuaW5zdGFuY2UoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFRocmVhZE5hbWUoU3RyaW5nIHRocmVhZE5hbWUpIHsKLQkJCXRoaXMudGhyZWFkTmFtZSA9IHRocmVhZE5hbWU7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRUaHJlYWROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMudGhyZWFkTmFtZTsKLQkJfQotCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFRocmVhZE5hbWUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvbkhhbmRsZXIoRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyKSB7Ci0JCQl0aGlzLmV4Y2VwdGlvbkhhbmRsZXIgPSBleGNlcHRpb25IYW5kbGVyOwotCQl9Ci0JCXB1YmxpYyBFeGNlcHRpb25IYW5kbGVyIGdldEV4Y2VwdGlvbkhhbmRsZXIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5leGNlcHRpb25IYW5kbGVyOwotCQl9Ci0JCXByb3RlY3RlZCBFeGNlcHRpb25IYW5kbGVyIGJ1aWxkRGVmYXVsdEV4Y2VwdGlvbkhhbmRsZXIoKSB7Ci0JCQlyZXR1cm4gRXhjZXB0aW9uSGFuZGxlci5SdW50aW1lLmluc3RhbmNlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL0NvbW1hbmRSdW5uYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9Db21tYW5kUnVubmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVhYmNhYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL0NvbW1hbmRSdW5uYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmQ7Ci0KLS8qKgotICogV3JhcCBhIHtAbGluayBDb21tYW5kfSBzbyBpdCBjYW4gYmUgdXNlZCBhcyBhIHtAbGluayBSdW5uYWJsZX0uCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kUnVubmFibGUKLQlpbXBsZW1lbnRzIFJ1bm5hYmxlCi17Ci0JcHJvdGVjdGVkIGZpbmFsIENvbW1hbmQgY29tbWFuZDsKLQotCXB1YmxpYyBDb21tYW5kUnVubmFibGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChjb21tYW5kID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0aGlzLmNvbW1hbmQuZXhlY3V0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiUnVubmFibGVbIiArIHRoaXMuY29tbWFuZCArJ10nOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9Db21wb3NpdGVDb21tYW5kLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL0NvbXBvc2l0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFmYTEyNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL0NvbXBvc2l0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci0KLS8qKgotICogPGNvZGU+Q29tcG9zaXRlQ29tbWFuZDwvY29kZT4gcHJvdmlkZXMgc3VwcG9ydCBmb3IgdHJlYXRpbmcgYSBjb2xsZWN0aW9uIG9mCi0gKiB7QGxpbmsgQ29tbWFuZH1zIGFzIGEgc2luZ2xlIGNvbW1hbmQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVDb21tYW5kCi0JaW1wbGVtZW50cyBDb21tYW5kCi17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTxDb21tYW5kPiBjb21tYW5kczsKLQotCXB1YmxpYyBDb21wb3NpdGVDb21tYW5kKENvbW1hbmQuLi4gY29tbWFuZHMpIHsKLQkJdGhpcyhuZXcgQXJyYXlJdGVyYWJsZTxDb21tYW5kPihjb21tYW5kcykpOwotCX0KLQotCXB1YmxpYyBDb21wb3NpdGVDb21tYW5kKEl0ZXJhYmxlPENvbW1hbmQ+IGNvbW1hbmRzKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChjb21tYW5kcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmNvbW1hbmRzID0gY29tbWFuZHM7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJZm9yIChDb21tYW5kIGNvbW1hbmQgOiB0aGlzLmNvbW1hbmRzKSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY29tbWFuZHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvTm90aWZ5aW5nUmVwZWF0aW5nQ29tbWFuZFdyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvTm90aWZ5aW5nUmVwZWF0aW5nQ29tbWFuZFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNiYjZlYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL05vdGlmeWluZ1JlcGVhdGluZ0NvbW1hbmRXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkV4Y2VwdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuTm90aWZ5aW5nUmVwZWF0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotCi0vKioKLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IElmIGFub3RoZXIgZXhlY3V0aW9uIGN5Y2xlIGlzIGluaXRpYXRlZCB3aGlsZSB3ZSBhcmUKLSAqIG5vdGlmeWluZyB0aGUgY29tbWFuZCdzIGxpc3RlbmVycyAoaS5lLiB0aGUge0BsaW5rICNzdGF0ZX0gaXMgc2V0Ci0gKiB0byAicmVwZWF0IiksIHRoZSBuZXcKLSAqIGV4ZWN1dGlvbiB3aWxsIG5vdCBzdGFydCB1bnRpbCBhbGwgdGhlIGxpc3RlbmVycyBhcmUgbm90aWZpZWQuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkIyOjwvc3Ryb25nPiBUaGUgY29tbWFuZCdzIGxpc3RlbmVycyBjYW4sIHRoZW1zZWx2ZXMsCi0gKiB0cmlnZ2VyIGFub3RoZXIgZXhlY3V0aW9uIChieSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGNhbGxpbmcKLSAqIHtAbGluayAjZXhlY3V0ZSgpfSk7Ci0gKiBidXQsIGFnYWluLCB0aGlzIGV4ZWN1dGlvbiB3aWxsIG5vdCBvY2N1ciB1bnRpbCA8ZW0+YWZ0ZXI8L2VtPiBhbGwgdGhlCi0gKiBsaXN0ZW5lcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLgotICogPHA+Ci0gKiA8c3Ryb25nPk5CMzo8L3N0cm9uZz4gQWxvbmcgd2l0aCBhbnkgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIHdyYXBwZWQKLSAqIGNvbW1hbmQsIGFueSBleGNlcHRpb25zIHRocm93biBieSB0aGUgY29tbWFuZCdzIGxpc3RlbmVycyB3aWxsCi0gKiBiZSBwYXNzZWQgdG8gdGhlIHtAbGluayAjZXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb24gaGFuZGxlcn0uCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3RpZnlpbmdSZXBlYXRpbmdDb21tYW5kV3JhcHBlcgotCWV4dGVuZHMgUmVwZWF0aW5nQ29tbWFuZFdyYXBwZXIKLQlpbXBsZW1lbnRzIE5vdGlmeWluZ1JlcGVhdGluZ0NvbW1hbmQKLXsKLQlwcml2YXRlIGZpbmFsIExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4oTGlzdGVuZXIuY2xhc3MpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBub3RpZnlpbmcgcmVwZWF0aW5nIGNvbW1hbmQgd3JhcHBlciB0aGF0IGV4ZWN1dGVzIHRoZQotCSAqIHNwZWNpZmllZCBjb21tYW5kLiBBbnkgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNvbW1hbmQgb3IgbGlzdGVuZXIKLQkgKiB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIHNwZWNpZmllZCBleGNlcHRpb24gaGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgTm90aWZ5aW5nUmVwZWF0aW5nQ29tbWFuZFdyYXBwZXIoQ29tbWFuZCBjb21tYW5kLCBFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIpIHsKLQkJc3VwZXIoY29tbWFuZCwgZXhjZXB0aW9uSGFuZGxlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbm90aWZ5aW5nIHJlcGVhdGluZyBjb21tYW5kIHdyYXBwZXIgdGhhdCBleGVjdXRlcyB0aGUgc3BlY2lmaWVkCi0JICogY29tbWFuZCBhbmQgdXNlcyB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgZXhlY3V0b3IgdG8gZXhlY3V0ZSB0aGUgd3JhcHBlZAotCSAqIGNvbW1hbmQgd2hlbmV2ZXIgaXQgaXMgbm90IGFscmVhZHkgZXhlY3V0aW5nLgotCSAqIEFueSBleGNlcHRpb25zIHRocm93biBieSB0aGUgY29tbWFuZCBvciBsaXN0ZW5lciB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlCi0JICogc3BlY2lmaWVkIGV4Y2VwdGlvbiBoYW5kbGVyLgotCSAqLwotCXB1YmxpYyBOb3RpZnlpbmdSZXBlYXRpbmdDb21tYW5kV3JhcHBlcihDb21tYW5kIGNvbW1hbmQsIENvbW1hbmRFeGVjdXRvciBzdGFydENvbW1hbmRFeGVjdXRvciwgRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyKSB7Ci0JCXN1cGVyKGNvbW1hbmQsIHN0YXJ0Q29tbWFuZEV4ZWN1dG9yLCBleGNlcHRpb25IYW5kbGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXJzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5saXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JLyogcHJpdmF0ZSBwcm90ZWN0ZWQgKi8gdm9pZCBleGVjdXRlQ29tbWFuZCgpIHsKLQkJc3VwZXIuZXhlY3V0ZUNvbW1hbmQoKTsKLQkJaWYgKHRoaXMuc3RhdGUuaXNRdWllc2NlZCgpKSB7Ci0JCQkvLyBobW1tIC0gd2Ugd2lsbCBub3RpZnkgbGlzdGVuZXJzIGV2ZW4gd2hlbiB3ZSBhcmUgInN0b3BwZWQiOyB0aGF0IHNlZW1zIE9LLi4uCi0JCQl0aGlzLmV4ZWN1dGlvblF1aWVzY2VkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0aW9uUXVpZXNjZWQoKSB7Ci0JCWZvciAoTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJdHJ5IHsKLQkJCQlsaXN0ZW5lci5leGVjdXRpb25RdWllc2NlZCh0aGlzKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBleCkgewotCQkJCXRoaXMuZXhjZXB0aW9uSGFuZGxlci5oYW5kbGVFeGNlcHRpb24oZXgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9RdWV1ZWluZ0NvbW1hbmRFeGVjdXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9RdWV1ZWluZ0NvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODk4Y2JkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvUXVldWVpbmdDb21tYW5kRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuU3RhdGVmdWxDb21tYW5kRXhlY3V0b3I7Ci0KLS8qKgotICogQHNlZSBBYnN0cmFjdFF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBRdWV1ZWluZ0NvbW1hbmRFeGVjdXRvcgotCWV4dGVuZHMgQWJzdHJhY3RRdWV1ZWluZ0NvbW1hbmRFeGVjdXRvcjxTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcj4KLXsKLQlwdWJsaWMgUXVldWVpbmdDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCXRoaXMoQ29tbWFuZEV4ZWN1dG9yLkRlZmF1bHQuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHVibGljIFF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yKENvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IpIHsKLQkJdGhpcyhuZXcgU2ltcGxlU3RhdGVmdWxDb21tYW5kRXhlY3V0b3IoY29tbWFuZEV4ZWN1dG9yKSk7Ci0JfQotCi0JcHVibGljIFF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yKFN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvcikgewotCQlzdXBlcihjb21tYW5kRXhlY3V0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvUXVldWVpbmdFeHRlbmRlZENvbW1hbmRFeGVjdXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9RdWV1ZWluZ0V4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMzBlZDQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9RdWV1ZWluZ0V4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5FeHRlbmRlZENvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5TdGF0ZWZ1bEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yOwotCi0vKioKLSAqIENhbGxzIHRvIHtAbGluayAjd2FpdFRvRXhlY3V0ZShDb21tYW5kKX0gd2lsbCBzdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZAotICogdW50aWwgdGhlIGNvbW1hbmQgZXhlY3V0b3IgaXMge0BsaW5rICNzdGFydCgpIHN0YXJ0ZWR9IGFuZCBhbnkgcHJldmlvdXNseS0KLSAqIGRpc3BhdGNoZWQgY29tbWFuZHMgaGF2ZSBleGVjdXRlZC4KLSAqIAotICogQHNlZSBBYnN0cmFjdFF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBRdWV1ZWluZ0V4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yCi0JZXh0ZW5kcyBBYnN0cmFjdFF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yPFN0YXRlZnVsRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3I+Ci0JaW1wbGVtZW50cyBTdGF0ZWZ1bEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yCi17Ci0JcHVibGljIFF1ZXVlaW5nRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCXRoaXMoRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IuRGVmYXVsdC5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwdWJsaWMgUXVldWVpbmdFeHRlbmRlZENvbW1hbmRFeGVjdXRvcihFeHRlbmRlZENvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IpIHsKLQkJdGhpcyhuZXcgU2ltcGxlU3RhdGVmdWxFeHRlbmRlZENvbW1hbmRFeGVjdXRvcihjb21tYW5kRXhlY3V0b3IpKTsKLQl9Ci0KLQlwdWJsaWMgUXVldWVpbmdFeHRlbmRlZENvbW1hbmRFeGVjdXRvcihTdGF0ZWZ1bEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvcikgewotCQlzdXBlcihjb21tYW5kRXhlY3V0b3IpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBjb21tYW5kIGV4ZWN1dG9yIGlzCi0JICoge0BsaW5rICNzdGFydCgpIHN0YXJ0ZWR9LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRUb0V4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlTeW5jaHJvbml6aW5nQ29tbWFuZCBzeW5jQ29tbWFuZCA9IG5ldyBTeW5jaHJvbml6aW5nQ29tbWFuZCgpOwotCi0JCXRoaXMuZXhlY3V0ZShzeW5jQ29tbWFuZCk7ICAvLyBwdXQgdGhlIHN5bmMgY29tbWFuZCBvbiB0aGUgcXVldWUgYW5kIHdhaXQgdW50aWwgaXQgaGFzIGV4ZWN1dGVkCi0KLQkJdHJ5IHsKLQkJCXN5bmNDb21tYW5kLndhaXRGb3JFeGVjdXRpb24oKTsKLQkJCXRoaXMuY29tbWFuZEV4ZWN1dG9yLndhaXRUb0V4ZWN1dGUoY29tbWFuZCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzeW5jQ29tbWFuZC5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXYWl0IHVudGlsIGFsbCB0aGUgY29tbWFuZHMgY3VycmVudGx5IG9uIHRoZSBxdWV1ZSBoYXZlIGJlZW4gZXhlY3V0ZWQsCi0JICogdGhlbiBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZC4gU3VzcGVuZCB0aGUgY29tbWFuZC1leGVjdXRpbmcgdGhyZWFkCi0JICogd2hpbGUgd2UgZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvRXhlY3V0ZShDb21tYW5kIGNvbW1hbmQsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRpbWVvdXQgPT0gMEwpIHsKLQkJCXRoaXMud2FpdFRvRXhlY3V0ZShjb21tYW5kKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotCQlTeW5jaHJvbml6aW5nQ29tbWFuZCBzeW5jQ29tbWFuZCA9IG5ldyBTeW5jaHJvbml6aW5nQ29tbWFuZCgpOwotCi0JCXRoaXMuZXhlY3V0ZShzeW5jQ29tbWFuZCk7ICAvLyBkaXNwYXRjaCB0aGUgc3luYyBjb21tYW5kIHRvIHRoZSBvdGhlciB0aHJlYWQKLQotCQl0cnkgewotCQkJaWYgKHN5bmNDb21tYW5kLndhaXRGb3JFeGVjdXRpb24odGltZW91dCkpIHsKLQkJCQkvLyBhZGp1c3QgdGhlIHRpbWUKLQkJCQl0aW1lb3V0ID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCXJldHVybiAodGltZW91dCA+IDApICYmIHRoaXMuY29tbWFuZEV4ZWN1dG9yLndhaXRUb0V4ZWN1dGUoY29tbWFuZCwgdGltZW91dCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZmluYWxseSB7Ci0JCQlzeW5jQ29tbWFuZC5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL1JlcGVhdGluZ0NvbW1hbmRTdGF0ZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9SZXBlYXRpbmdDb21tYW5kU3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBhNzQ2My4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL1JlcGVhdGluZ0NvbW1hbmRTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZE9iamVjdDsKLQotLyoqCi0gKiBQcm92aWRlIHRoZSBzdGF0ZSBtYWNoaW5lIHRvIHN1cHBvcnQgbWluaW1hbCByZXBlYXQgY29tbWFuZCBleGVjdXRpb25zLgotICovCi1wdWJsaWMgY2xhc3MgUmVwZWF0aW5nQ29tbWFuZFN0YXRlIHsKLQkvKioKLQkgKiBUaGUgY3VycmVudCBzdGF0ZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN5bmNocm9uaXplZE9iamVjdDxTdGF0ZT4gc3RhdGU7Ci0KLQkvKioKLQkgKiBUaGUgaW5pdGlhbCB7QGxpbmsgI3N0YXRlfSBpcyB7QGxpbmsgI1NUT1BQRUR9LgotCSAqIENsaWVudHMgbXVzdCBjYWxsIHtAbGluayAjc3RhcnQoKX0gYmVmb3JlIHRoZSBjb21tYW5kIGNhbiBiZQotCSAqIGV4ZWN1dGVkLgotCSAqLwotCXByaXZhdGUgZW51bSBTdGF0ZSB7Ci0JCVNUT1BQRUQsCi0JCVJFQURZLAotCQlQUkVfRVhFQ1VUSU9OLAotCQlFWEVDVVRJTkcsCi0JCVJFUEVBVCwKLQkJU1RPUFBJTkcKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlcGVhdGluZyBjb21tYW5kIHN0YXRlLgotCSAqLwotCXB1YmxpYyBSZXBlYXRpbmdDb21tYW5kU3RhdGUoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIHVzZSB0aGUgY29tbWFuZCB3cmFwcGVyIGFzIHRoZSBtdXRleCBzbyBpdCBpcyBmcmVlZCB1cCBieSB0aGUgd2FpdCBpbiAjc3RvcCgpCi0JCXRoaXMuc3RhdGUgPSBuZXcgU3luY2hyb25pemVkT2JqZWN0PFN0YXRlPihTdGF0ZS5TVE9QUEVELCB0aGlzKTsKLQl9Ci0KLQotCS8qKgotCSAqIFNldCB0aGUge0BsaW5rICNzdGF0ZX0gdG8ge0BsaW5rIFN0YXRlI1JFQURZIFJFQURZfS4KLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCB3cmFwcGVyIGlzIG5vdAotCSAqIHtAbGluayBTdGF0ZSNTVE9QUEVEIFNUT1BQRUR9LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKLQkJc3dpdGNoICh0aGlzLnN0YXRlLmdldFZhbHVlKCkpIHsKLQkJCWNhc2UgU1RPUFBFRDoKLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLlJFQURZKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVBRFk6Ci0JCQljYXNlIFBSRV9FWEVDVVRJT046Ci0JCQljYXNlIEVYRUNVVElORzoKLQkJCWNhc2UgUkVQRUFUOgotCQkJY2FzZSBTVE9QUElORzoKLQkJCQl0aHJvdyB0aGlzLmJ1aWxkSVNFKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIGNsaWVudCBoYXMgcmVxdWVzdGVkIGFuIGV4ZWN1dGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB3ZSBhcmUgcmVhZHkgdG8gYmVnaW4gYSBuZXcgZXhlY3V0aW9uICJjeWNsZSIuCi0JICogSWYgYW4gZXhlY3V0aW9uIGlzIGFscmVhZHkgdW5kZXIgd2F5LCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+OwotCSAqIGJ1dCBzZXQgdGhlIHtAbGluayAjc3RhdGV9IHRvIHtAbGluayBTdGF0ZSNSRVBFQVQgUkVQRUFUfQotCSAqIHNvIGFub3RoZXIgZXhlY3V0aW9uIHdpbGwgb2NjdXIgb25jZSB0aGUgY3VycmVudAotCSAqIGV4ZWN1dGlvbiBpcyBjb21wbGV0ZS4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBUaGlzIG1ldGhvZCBoYXMgcG9zc2libGUgc2lkZS1lZmZlY3RzOgotCSAqIFRoZSB2YWx1ZSBvZiB7QGxpbmsgI3N0YXRlfSBtYXkgYmUgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNSZWFkeVRvU3RhcnRFeGVjdXRpb25DeWNsZSgpIHsKLQkJc3dpdGNoICh0aGlzLnN0YXRlLmdldFZhbHVlKCkpIHsKLQkJCWNhc2UgU1RPUFBFRDoKLQkJCQkvLyBleGVjdXRpb24gaXMgbm90IGFsbG93ZWQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQljYXNlIFJFQURZOgotCQkJCS8vIHN0YXJ0IGEgbmV3IGV4ZWN1dGlvbiwgcG9zc2libHkgYXN5bmNocm9ub3VzbHkKLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLlBSRV9FWEVDVVRJT04pOwotCQkJCXJldHVybiB0cnVlOwotCQkJY2FzZSBQUkVfRVhFQ1VUSU9OOgotCQkJCS8vIG5vIG5lZWQgdG8gc2V0ICdzdGF0ZScgdG8gUFJFX0VYRUNVVElPTiBhZ2FpbiwKLQkJCQkvLyB0aGUgY29tbWFuZCBoYXMgbm90IHlldCBiZWd1biBleGVjdXRpbmcKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQljYXNlIEVYRUNVVElORzoKLQkJCQkvLyBzZXQgJ3N0YXRlJyB0byBSRVBFQVQgc28gYSBuZXcgZXhlY3V0aW9uIHdpbGwgb2NjdXIgb25jZSB0aGUgY3VycmVudCBvbmUgaXMgZmluaXNoZWQKLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLlJFUEVBVCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJY2FzZSBSRVBFQVQ6Ci0JCQkJLy8gbm8gbmVlZCB0byBzZXQgJ3N0YXRlJyB0byBSRVBFQVQgYWdhaW4KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQljYXNlIFNUT1BQSU5HOgotCQkJCS8vIG5vIGZ1cnRoZXIgZXhlY3V0aW9ucyBhcmUgYWxsb3dlZAotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQl0aHJvdyB0aGlzLmJ1aWxkSVNFKCk7Ci0JfQotCi0JLyoqCi0JICogQW4gZXhlY3V0aW9uICJjeWNsZSIgaXMgcmVhZHkgdG8gYmVnaW4uCi0JICogTWFrZSBzdXJlIGEgY2FsbCB0byB7QGxpbmsgI3N0b3AoKX0gZGlkIG5vdCBzbGlwIGluIGJldHdlZW4gdGhlCi0JICogZGlzcGF0Y2hpbmcgb2YgdGhlIGluaXRpYWwgd3JhcHBlZCBjb21tYW5kIGV4ZWN1dGlvbiAod2hlbgotCSAqIHtAbGluayAjaXNSZWFkeVRvU3RhcnRFeGVjdXRpb25DeWNsZSgpfSByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+KSBhbmQgdGhlCi0JICogYWN0dWFsIGV4ZWN1dGlvbiBvZiB0aGUgd3JhcHBlZCBjb21tYW5kLgotCSAqIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgd3JhcHBlZCBjb21tYW5kIHdhcyBkaXNwYXRjaGVkIGFzeW5jaHJvbm91c2x5LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgYWN0dWFsIGV4ZWN1dGlvbiBtZXRob2QsIGJlZm9yZSBpdAotCSAqIHN0YXJ0cyBsb29waW5nLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiB3YXNTdG9wcGVkQmVmb3JlRmlyc3RFeGVjdXRpb25Db3VsZFN0YXJ0KCkgewotCQlzd2l0Y2ggKHRoaXMuc3RhdGUuZ2V0VmFsdWUoKSkgewotCQkJY2FzZSBTVE9QUEVEOgotCQkJCS8vIGEgY2FsbCB0byBzdG9wKCkgc2xpcHBlZCBpbiBiZWZvcmUgdGhlIGNvbW1hbmQgY291bGQgc3RhcnQKLQkJCQkvLyBleGVjdXRpbmcsIHByb2JhYmx5IGJlY2F1c2UgaXQgd2FzIGRpc3BhdGNoZWQgYXN5bmNocm9ub3VzbHkKLQkJCQkvLyBieSAnc3RhcnRDb21tYW5kRXhlY3V0b3InIChlLmcuIGluIGEgam9iKQotCQkJCXJldHVybiB0cnVlOwotCQkJY2FzZSBQUkVfRVhFQ1VUSU9OOgotCQkJCXRoaXMuc3RhdGUuc2V0VmFsdWUoU3RhdGUuRVhFQ1VUSU5HKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQljYXNlIFJFQURZOgotCQkJY2FzZSBFWEVDVVRJTkc6Ci0JCQljYXNlIFJFUEVBVDoKLQkJCWNhc2UgU1RPUFBJTkc6Ci0JCQkJdGhyb3cgdGhpcy5idWlsZElTRSgpOwotCQl9Ci0JCXRocm93IHRoaXMuYnVpbGRJU0UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY3VycmVudCBleGVjdXRpb24gaGFzIGZpbmlzaGVkLgotCSAqIFJldHVybiB3aGV0aGVyIHdlIHNob3VsZCBiZWdpbiBhbm90aGVyIGV4ZWN1dGlvbiBiZWNhdXNlIGEgY2FsbCB0bwotCSAqIGV4ZWN1dGUgb2NjdXJyZWQgPGVtPmR1cmluZzwvZW0+IHRoZSBqdXN0LWNvbXBsZXRlZCBleGVjdXRpb24uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzUmVwZWF0KCkgewotCQlzd2l0Y2ggKHRoaXMuc3RhdGUuZ2V0VmFsdWUoKSkgewotCQkJY2FzZSBTVE9QUEVEOgotCQkJY2FzZSBSRUFEWToKLQkJCWNhc2UgUFJFX0VYRUNVVElPTjoKLQkJCQl0aHJvdyB0aGlzLmJ1aWxkSVNFKCk7Ci0JCQljYXNlIEVYRUNVVElORzoKLQkJCQkvLyBleGVjdXRpb24gaGFzIGZpbmlzaGVkIGFuZCB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgcmVxdWVzdHMgZm9yIGFub3RoZXI7IHJldHVybiB0byBSRUFEWQotCQkJCXRoaXMuc3RhdGUuc2V0VmFsdWUoU3RhdGUuUkVBRFkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCWNhc2UgUkVQRUFUOgotCQkJCS8vIHNldCAnc3RhdGUnIGJhY2sgdG8gRVhFQ1VUSU5HIGFuZCBiZWdpbiBhbm90aGVyIGV4ZWN1dGlvbgotCQkJCXRoaXMuc3RhdGUuc2V0VmFsdWUoU3RhdGUuRVhFQ1VUSU5HKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWNhc2UgU1RPUFBJTkc6Ci0JCQkJLy8gYSBjbGllbnQgaW5pdGlhdGVkIGEgInN0b3AiIGR1cmluZyB0aGUgcHJldmlvdXMgZXhlY3V0aW9uOwotCQkJCS8vIG1hcmsgdGhlICJzdG9wIiBjb21wbGV0ZSBhbmQgcGVyZm9ybSBubyBtb3JlIGV4ZWN1dGlvbnMKLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLlNUT1BQRUQpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQl0aHJvdyB0aGlzLmJ1aWxkSVNFKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGV4ZWN1dGlvbiAiY3ljbGUiIGlzICJxdWllc2NlZCIgKGkuZS4gdGhlcmUgYXJlIG5vCi0JICogb3V0c3RhbmRpbmcgZXhlY3V0aW9uIHJlcXVlc3RzKS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1F1aWVzY2VkKCkgewotCQlyZXR1cm4gdGhpcy5zdGF0ZS5nZXRWYWx1ZSgpICE9IFN0YXRlLlJFUEVBVDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQge0BsaW5rICNzdGF0ZX0gc28gbm8gZnVydGhlciBleGVjdXRpb25zIG9jY3VyLgotCSAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIHdyYXBwZXIgaXMgYWxyZWFkeQotCSAqIHtAbGluayBTdGF0ZSNTVE9QUEVEIFNUT1BQRUR9IG9yIHtAbGluayBTdGF0ZSNTVE9QUElORyBTVE9QUElOR30uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzd2l0Y2ggKHRoaXMuc3RhdGUuZ2V0VmFsdWUoKSkgewotCQkJY2FzZSBSRUFEWToKLQkJCWNhc2UgUFJFX0VYRUNVVElPTjoKLQkJCQkvLyBzaW1wbHkgc2V0ICdzdGF0ZScgdG8gU1RPUFBFRCBhbmQgcmV0dXJuCi0JCQkJdGhpcy5zdGF0ZS5zZXRWYWx1ZShTdGF0ZS5TVE9QUEVEKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVhFQ1VUSU5HOgotCQkJY2FzZSBSRVBFQVQ6Ci0JCQkJLy8gc2V0ICdzdGF0ZScgdG8gU1RPUFBJTkcgYW5kIHdhaXQgdW50aWwgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGhhcyBmaW5pc2hlZAotCQkJCXRoaXMuc3RhdGUuc2V0VmFsdWUoU3RhdGUuU1RPUFBJTkcpOwotCQkJCXRoaXMud2FpdFVudGlsU3RvcHBlZCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVE9QUEVEOgotCQkJY2FzZSBTVE9QUElORzoKLQkJCQl0aHJvdyB0aGlzLmJ1aWxkSVNFKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdhaXQgd2lsbCBmcmVlIHVwIHRoZSBjb21tYW5kIHdyYXBwZXIncyBzeW5jaHJvbml6ZWQgbWV0aG9kcwotCSAqIChzaW5jZSB0aGUgY29tbWFuZCB3cmFwcGVyIGlzIHRoZSBtdXRleCBmb3Ige0BsaW5rICNzdGF0ZX0pLgotCSAqIDxwPgotCSAqIElmIHRoZSB0aHJlYWQgdGhhdCBjYWxsZWQge0BsaW5rICNzdG9wKCl9IGlzIGludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcKLQkgKiBmb3IgdGhlIGN1cnJlbnQgY29tbWFuZCB0byBmaW5pc2ggZXhlY3V0aW5nIG9uIGFub3RoZXIgdGhyZWFkLAotCSAqIHtAbGluayAjc3RhdGV9IHdpbGwgc3RpbGwgYmUge0BsaW5rIFN0YXRlI1NUT1BQSU5HIFNUT1BQSU5HfSwgc28gdGhlIGxvb3AKLQkgKiBiZWd1biBieSB0aGUgY29tbWFuZCB3cmFwcGVyIHdpbGwgc3RpbGwgc3RvcCBhbmQgc2V0IHtAbGluayAjc3RhdGV9IHRvCi0JICoge0BsaW5rIFN0YXRlI1NUT1BQRUQgU1RPUFBFRH0sIHdlIGp1c3Qgd29uJ3Qgd2FpdCBhcm91bmQgZm9yIGl0Li4uLgotCSAqLwotCXByaXZhdGUgdm9pZCB3YWl0VW50aWxTdG9wcGVkKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy5zdGF0ZS53YWl0VW50aWxWYWx1ZUlzKFN0YXRlLlNUT1BQRUQpOwotCX0KLQotCXByaXZhdGUgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGJ1aWxkSVNFKCkgewotCQlyZXR1cm4gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic3RhdGU6ICIgKyB0aGlzLnN0YXRlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuc3RhdGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvUmVwZWF0aW5nQ29tbWFuZFdyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvUmVwZWF0aW5nQ29tbWFuZFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNkYjI2Yi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL1JlcGVhdGluZ0NvbW1hbmRXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkV4Y2VwdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuUmVwZWF0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RhY2tUcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogV3JhcCBhIHJlcGVhdGluZyB7QGxpbmsgQ29tbWFuZH0uCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBlYXRpbmdDb21tYW5kV3JhcHBlcgotCWltcGxlbWVudHMgUmVwZWF0aW5nQ29tbWFuZAotewotCS8qKgotCSAqIFRoZSBjbGllbnQtc3VwcGxpZWQgY29tbWFuZCB0aGF0IHBlcmZvcm1zIHRoZSBleGVjdXRpb24uIEl0IG1heQotCSAqIHRyaWdnZXIgZnVydGhlciBjYWxscyB0byB7QGxpbmsgI2V4ZWN1dGUoKX0gKGkuZS4gdGhlIDxlbT53cmFwcGVkPC9lbT4KLQkgKiBjb21tYW5kJ3MgZXhlY3V0aW9uIG1heSByZWN1cnNlIGJhY2sgdG8gdGhlIGNsaWVudCBjb2RlIHRoYXQgZXhlY3V0ZXMgdGhlCi0JICogPGVtPndyYXBwZXI8L2VtPiBjb21tYW5kKS4KLQkgKi8KLQkvKiBDVSBwcml2YXRlICovIGZpbmFsIENvbW1hbmQgY29tbWFuZDsKLQotCS8qKgotCSAqIFRoZSBjb21tYW5kIGV4ZWN1dGVkIHdoZW5ldmVyIHRoZSB3cmFwcGVkIHtAbGluayAjY29tbWFuZH0gbXVzdCBiZQotCSAqIGV4ZWN1dGVkIGFuZCBpdCBpcyBub3QgYWxyZWFkeSBleGVjdXRpbmcuIElmIHRoZSB3cmFwcGVkIHtAbGluayAjY29tbWFuZH0KLQkgKiBpcyBhbHJlYWR5IGV4ZWN1dGluZywgaXQgd2lsbCBzaW1wbHkgYmUgcmUtZXhlY3V0ZWQgZGlyZWN0bHkgKG9uY2UgaXQgaGFzCi0JICogY29tcGxldGVkIGl0cyBjdXJyZW50IGV4ZWN1dGlvbiksIGFzIG9wcG9zZWQgdG8gY2FsbGluZyB0aGUgc3RhcnQKLQkgKiBjb21tYW5kLgotCSAqLwotCXByaXZhdGUgZmluYWwgQ29tbWFuZCBzdGFydENvbW1hbmQ7Ci0KLQkvKioKLQkgKiBUaGUgY2xpZW50LXN1cHBsaWVkIGNvbW1hbmQgZXhlY3V0b3IgdGhhdCBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdGhlCi0JICoge0BsaW5rICNzdGFydENvbW1hbmQgc3RhcnQgY29tbWFuZH0uIEJ5IGRlZmF1bHQsIHRoZSBzdGFydCBjb21tYW5kIGlzCi0JICogZXhlY3V0ZWQgZGlyZWN0bHk7IGJ1dCB0aGlzIGV4ZWN1dG9yIHByb3ZpZGVzIGEgaG9vayBmb3IgZXhlY3V0aW5nIHRoZQotCSAqIHtAbGluayAjc3RhcnRDb21tYW5kIHN0YXJ0IGNvbW1hbmR9IGFzeW5jaHJvbm91c2x5OyBhZnRlciB3aGljaCwKLQkgKiBzdWJzZXF1ZW50IG92ZXJsYXBwaW5nIGV4ZWN1dGlvbnMgYXJlIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHkuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb21tYW5kRXhlY3V0b3Igc3RhcnRDb21tYW5kRXhlY3V0b3I7Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgdGhlIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSA8ZW0+d3JhcHBlZDwvZW0+IGNvbW1hbmQuCi0JICovCi0JZmluYWwgRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyOwotCi0JLyoqCi0JICogVGhlIGNvbW1hbmQgd3JhcHBlcidzIHN0YXRlLgotCSAqLwotCWZpbmFsIFJlcGVhdGluZ0NvbW1hbmRTdGF0ZSBzdGF0ZTsKLQotCS8qKgotCSAqIExpc3Qgb2Ygc3RhY2sgdHJhY2VzIGZvciBlYWNoIChyZXBlYXRpbmcpIGludm9jYXRpb24gb2YgdGhlIGNvbW1hbmQsCi0JICogc3RhcnRpbmcgd2l0aCB0aGUgaW5pdGlhbCBpbnZvY2F0aW9uLiBUaGUgbGlzdCBpcyBjbGVhcmVkIHdpdGggZWFjaAotCSAqIGluaXRpYWwgaW52b2NhdGlvbiBvZiB0aGUgY29tbWFuZC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxTdGFja1RyYWNlPiBzdGFja1RyYWNlcyA9IERFQlVHID8gbmV3IEFycmF5TGlzdDxTdGFja1RyYWNlPigpIDogbnVsbDsKLQkvLyBzZWUgUmVwZWF0aW5nQ29tbWFuZFdyYXBwZXJUZXN0cy50ZXN0REVCVUcoKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVwZWF0aW5nIGNvbW1hbmQgd3JhcHBlciB0aGF0IGV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQKLQkgKiBjb21tYW5kLiBBbnkgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNvbW1hbmQgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZQotCSAqIHNwZWNpZmllZCBleGNlcHRpb24gaGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgUmVwZWF0aW5nQ29tbWFuZFdyYXBwZXIoQ29tbWFuZCBjb21tYW5kLCBFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIpIHsKLQkJdGhpcyhjb21tYW5kLCBDb21tYW5kRXhlY3V0b3IuRGVmYXVsdC5pbnN0YW5jZSgpLCBleGNlcHRpb25IYW5kbGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZXBlYXRpbmcgY29tbWFuZCB3cmFwcGVyIHRoYXQgZXhlY3V0ZXMgdGhlIHNwZWNpZmllZAotCSAqIGNvbW1hbmQgYW5kIHVzZXMgdGhlIHNwZWNpZmllZCBjb21tYW5kIGV4ZWN1dG9yIHRvIGV4ZWN1dGUgdGhlIHdyYXBwZWQKLQkgKiBjb21tYW5kIHdoZW5ldmVyIGl0IGlzIG5vdCBhbHJlYWR5IGV4ZWN1dGluZy4KLQkgKiBBbnkgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNvbW1hbmQgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZQotCSAqIHNwZWNpZmllZCBleGNlcHRpb24gaGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgUmVwZWF0aW5nQ29tbWFuZFdyYXBwZXIoQ29tbWFuZCBjb21tYW5kLCBDb21tYW5kRXhlY3V0b3Igc3RhcnRDb21tYW5kRXhlY3V0b3IsIEV4Y2VwdGlvbkhhbmRsZXIgZXhjZXB0aW9uSGFuZGxlcikgewotCQlzdXBlcigpOwotCQlpZiAoKGNvbW1hbmQgPT0gbnVsbCkgfHwgKHN0YXJ0Q29tbWFuZEV4ZWN1dG9yID09IG51bGwpIHx8IChleGNlcHRpb25IYW5kbGVyID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmNvbW1hbmQgPSBjb21tYW5kOwotCQl0aGlzLnN0YXJ0Q29tbWFuZEV4ZWN1dG9yID0gc3RhcnRDb21tYW5kRXhlY3V0b3I7Ci0JCXRoaXMuc3RhcnRDb21tYW5kID0gdGhpcy5idWlsZFN0YXJ0Q29tbWFuZCgpOwotCQl0aGlzLmV4Y2VwdGlvbkhhbmRsZXIgPSBleGNlcHRpb25IYW5kbGVyOwotCQl0aGlzLnN0YXRlID0gdGhpcy5idWlsZFN0YXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkU3RhcnRDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IFN0YXJ0Q29tbWFuZCgpOwotCX0KLQotCXByaXZhdGUgUmVwZWF0aW5nQ29tbWFuZFN0YXRlIGJ1aWxkU3RhdGUoKSB7Ci0JCXJldHVybiBuZXcgUmVwZWF0aW5nQ29tbWFuZFN0YXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFJlcGVhdGluZ0NvbW1hbmQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCXRoaXMuc3RhdGUuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdCBpcyBwb3NzaWJsZSB0byBjb21lIGJhY2sgaGVyZSBpZiB0aGUgd3JhcHBlZCBjb21tYW5kIHJlY3Vyc2VzCi0JICogdG8gdGhlIGNsaWVudCBhbmQgdHJpZ2dlcnMgYW5vdGhlciBleGVjdXRpb24uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmICh0aGlzLnN0YXRlLmlzUmVhZHlUb1N0YXJ0RXhlY3V0aW9uQ3ljbGUoKSkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJdGhpcy5zdGFja1RyYWNlcy5jbGVhcigpOwotCQkJCXRoaXMuc3RhY2tUcmFjZXMuYWRkKG5ldyBTdGFja1RyYWNlKCkpOwotCQkJfQotCQkJdGhpcy5leGVjdXRlU3RhcnRDb21tYW5kKCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQl0aGlzLnN0YWNrVHJhY2VzLmFkZChuZXcgU3RhY2tUcmFjZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIHByaXZhdGUgcHJvdGVjdGVkICovIHZvaWQgZXhlY3V0ZVN0YXJ0Q29tbWFuZCgpIHsKLQkJdGhpcy5zdGFydENvbW1hbmRFeGVjdXRvci5leGVjdXRlKHRoaXMuc3RhcnRDb21tYW5kKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy5zdGF0ZS5zdG9wKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN0YXJ0IGNvbW1hbmQuCi0JICogQHNlZSAjc3RhcnRDb21tYW5kRXhlY3V0b3IKLQkgKi8KLQkvKiBDVSBwcml2YXRlICovIGNsYXNzIFN0YXJ0Q29tbWFuZAotCQlpbXBsZW1lbnRzIENvbW1hbmQKLQl7Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlSZXBlYXRpbmdDb21tYW5kV3JhcHBlci50aGlzLmV4ZWN1dGVfKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBSZXBlYXRpbmdDb21tYW5kV3JhcHBlci50aGlzLmNvbW1hbmQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBleGVjdXRpb24gY3ljbGUuCi0JICogQW55IGZ1cnRoZXIgY2FsbHMgdG8ge0BsaW5rICNleGVjdXRlKCl9IHdpbGwKLQkgKiBzaW1wbHkgc2V0IHRoZSB7QGxpbmsgI3N0YXRlfSB0byAicmVwZWF0IiwKLQkgKiBjYXVzaW5nIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgYWdhaW4uCi0JICovCi0JLyogQ1UgcHJpdmF0ZSAqLyB2b2lkIGV4ZWN1dGVfKCkgewotCQlpZiAodGhpcy5zdGF0ZS53YXNTdG9wcGVkQmVmb3JlRmlyc3RFeGVjdXRpb25Db3VsZFN0YXJ0KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWRvIHsKLQkJCXRoaXMuZXhlY3V0ZUNvbW1hbmQoKTsKLQkJfSB3aGlsZSAodGhpcy5zdGF0ZS5pc1JlcGVhdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjbGllbnQtc3VwcGxpZWQgY29tbWFuZC4gRG8gbm90IGFsbG93IGFueSB1bmhhbmRsZWQKLQkgKiBleGNlcHRpb25zIHRvIGtpbGwgdGhlIHdyYXBwZXIuIFBhc3MgdG8gdGhlIGV4Y2VwdGlvbiBoYW5kbGVyLgotCSAqIEBzZWUgTm90aWZ5aW5nUmVwZWF0aW5nQ29tbWFuZFdyYXBwZXIKLQkgKi8KLQkvKiBwcml2YXRlIHByb3RlY3RlZCAqLyB2b2lkIGV4ZWN1dGVDb21tYW5kKCkgewotCQl0cnkgewotCQkJdGhpcy5jb21tYW5kLmV4ZWN1dGUoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQl0aGlzLmV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY29tbWFuZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9SdW5uYWJsZUNvbW1hbmQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvUnVubmFibGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZTBjMWMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9SdW5uYWJsZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kOwotCi0vKioKLSAqIFdyYXAgYSB7QGxpbmsgUnVubmFibGV9IHNvIGl0IGNhbiBiZSB1c2VkIGFzIGEge0BsaW5rIENvbW1hbmR9LgotICovCi1wdWJsaWMgY2xhc3MgUnVubmFibGVDb21tYW5kCi0JaW1wbGVtZW50cyBDb21tYW5kCi17Ci0JcHJvdGVjdGVkIGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlOwotCi0JcHVibGljIFJ1bm5hYmxlQ29tbWFuZChSdW5uYWJsZSBydW5uYWJsZSkgewotCQlzdXBlcigpOwotCQlpZiAocnVubmFibGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5ydW5uYWJsZSA9IHJ1bm5hYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXRoaXMucnVubmFibGUucnVuKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJDb21tYW5kWyIgKyB0aGlzLnJ1bm5hYmxlICsnXSc7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL1NhZmVDb21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvU2FmZUNvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDIzM2JjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvU2FmZUNvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5FeGNlcHRpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmRFeGVjdXRvcjsKLQotLyoqCi0gKiBAc2VlIEFic3RyYWN0U2FmZUNvbW1hbmRFeGVjdXRvcgotICovCi1wdWJsaWMgY2xhc3MgU2FmZUNvbW1hbmRFeGVjdXRvcgotCWV4dGVuZHMgQWJzdHJhY3RTYWZlQ29tbWFuZEV4ZWN1dG9yPENvbW1hbmRFeGVjdXRvcj4KLXsKLQkvKioKLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBUaGUgZGVmYXVsdCBleGNlcHRpb24gaGFuZGxlciBzaW1wbHkKLQkgKiA8ZW0+aWdub3JlczwvZW0+IGFueSBhbmQgYWxsIGV4Y2VwdGlvbnMuCi0JICovCi0JcHVibGljIFNhZmVDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCXRoaXMoQ29tbWFuZEV4ZWN1dG9yLkRlZmF1bHQuaW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gVGhlIGRlZmF1bHQgZXhjZXB0aW9uIGhhbmRsZXIgc2ltcGx5Ci0JICogPGVtPmlnbm9yZXM8L2VtPiBhbnkgYW5kIGFsbCBleGNlcHRpb25zLgotCSAqLwotCXB1YmxpYyBTYWZlQ29tbWFuZEV4ZWN1dG9yKENvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IpIHsKLQkJc3VwZXIoY29tbWFuZEV4ZWN1dG9yKTsKLQl9Ci0KLQlwdWJsaWMgU2FmZUNvbW1hbmRFeGVjdXRvcihFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIpIHsKLQkJdGhpcyhDb21tYW5kRXhlY3V0b3IuRGVmYXVsdC5pbnN0YW5jZSgpLCBleGNlcHRpb25IYW5kbGVyKTsKLQl9Ci0KLQlwdWJsaWMgU2FmZUNvbW1hbmRFeGVjdXRvcihDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yLCBFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIpIHsKLQkJc3VwZXIoY29tbWFuZEV4ZWN1dG9yLCBleGNlcHRpb25IYW5kbGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL1NhZmVFeHRlbmRlZENvbW1hbmRFeGVjdXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9TYWZlRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmZGNlNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL1NhZmVFeHRlbmRlZENvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5FeGNlcHRpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3I7Ci0KLS8qKgotICogQHNlZSBBYnN0cmFjdFNhZmVDb21tYW5kRXhlY3V0b3IKLSAqLwotcHVibGljIGNsYXNzIFNhZmVFeHRlbmRlZENvbW1hbmRFeGVjdXRvcgotCWV4dGVuZHMgQWJzdHJhY3RTYWZlQ29tbWFuZEV4ZWN1dG9yPEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yPgotCWltcGxlbWVudHMgRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IKLXsKLQkvKioKLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBUaGUgZGVmYXVsdCBleGNlcHRpb24gaGFuZGxlciBzaW1wbHkKLQkgKiA8ZW0+aWdub3JlczwvZW0+IGFueSBhbmQgYWxsIGV4Y2VwdGlvbnMuCi0JICovCi0JcHVibGljIFNhZmVFeHRlbmRlZENvbW1hbmRFeGVjdXRvcigpIHsKLQkJdGhpcyhFeHRlbmRlZENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFRoZSBkZWZhdWx0IGV4Y2VwdGlvbiBoYW5kbGVyIHNpbXBseQotCSAqIDxlbT5pZ25vcmVzPC9lbT4gYW55IGFuZCBhbGwgZXhjZXB0aW9ucy4KLQkgKi8KLQlwdWJsaWMgU2FmZUV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yKEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvcikgewotCQlzdXBlcihjb21tYW5kRXhlY3V0b3IpOwotCX0KLQotCXB1YmxpYyBTYWZlRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IoRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyKSB7Ci0JCXRoaXMoRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IuRGVmYXVsdC5pbnN0YW5jZSgpLCBleGNlcHRpb25IYW5kbGVyKTsKLQl9Ci0KLQlwdWJsaWMgU2FmZUV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yKEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvciwgRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyKSB7Ci0JCXN1cGVyKGNvbW1hbmRFeGVjdXRvciwgZXhjZXB0aW9uSGFuZGxlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgd2FpdFRvRXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmNvbW1hbmRFeGVjdXRvci53YWl0VG9FeGVjdXRlKGNvbW1hbmQpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aGlzLmV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHdhaXRUb0V4ZWN1dGUoQ29tbWFuZCBjb21tYW5kLCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21tYW5kRXhlY3V0b3Iud2FpdFRvRXhlY3V0ZShjb21tYW5kLCB0aW1lb3V0KTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJdGhpcy5leGNlcHRpb25IYW5kbGVyLmhhbmRsZUV4Y2VwdGlvbihleCk7Ci0JCQlyZXR1cm4gdHJ1ZTsgIC8vIGhtbW0uLi4gc2VlbXMgbGlrZSB3ZSBnZXQgaGVyZSBvbmx5IGlmIHRoZSBjb21tYW5kIGV4ZWN1dGVkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL1NpbXBsZVN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL1NpbXBsZVN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOTViZDEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9TaW1wbGVTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5TdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcjsKLQotLyoqCi0gKiBTdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yfQotICogdGhhdCBleGVjdXRlcyBjb21tYW5kcyBpbW1lZGlhdGVseSBieSBkZWZhdWx0LiBUaGlzIGV4ZWN1dG9yIGNhbgotICogYWxzbyBiZSB1c2VkIHRvIGFkYXB0IHNpbXBsZSB7QGxpbmsgQ29tbWFuZEV4ZWN1dG9yfXMgdG8gdGhlCi0gKiB7QGxpbmsgU3RhdGVmdWxDb21tYW5kRXhlY3V0b3J9IGludGVyZmFjZSwgcHJvdmlkaW5nIHN1cHBvcnQgZm9yCi0gKiBsaWZlY3ljbGUgc3RhdGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcgotCWV4dGVuZHMgQWJzdHJhY3RTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcjxDb21tYW5kRXhlY3V0b3I+Ci17Ci0JcHVibGljIFNpbXBsZVN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yKCkgewotCQl0aGlzKENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCkpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcihDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXN1cGVyKGNvbW1hbmRFeGVjdXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9TaW1wbGVTdGF0ZWZ1bEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL1NpbXBsZVN0YXRlZnVsRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhiMjBiZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL1NpbXBsZVN0YXRlZnVsRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5FeHRlbmRlZENvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5TdGF0ZWZ1bEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yOwotCi0vKioKLSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgU3RhdGVmdWxFeHRlbmRlZENvbW1hbmRFeGVjdXRvcn0KLSAqIHRoYXQgZXhlY3V0ZXMgY29tbWFuZHMgaW1tZWRpYXRlbHkgYnkgZGVmYXVsdC4gVGhpcyBleGVjdXRvciBjYW4KLSAqIGFsc28gYmUgdXNlZCB0byBhZGFwdCBzaW1wbGUge0BsaW5rIENvbW1hbmRFeGVjdXRvcn1zIHRvIHRoZQotICoge0BsaW5rIFN0YXRlZnVsRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3J9IGludGVyZmFjZSwgcHJvdmlkaW5nIHN1cHBvcnQgZm9yCi0gKiBsaWZlY3ljbGUgc3RhdGUuIEFueSBjYWxscyB0byB7QGxpbmsgI3dhaXRUb0V4ZWN1dGUoQ29tbWFuZCl9IHN1c3BlbmQgdGhlCi0gKiBjYWxsaW5nIHRocmVhZCB1bnRpbCB0aGUgY29tbWFuZCBleGVjdXRvciBpcyB7QGxpbmsgI3N0YXJ0KCkgc3RhcnRlZH0uCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVTdGF0ZWZ1bEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yCi0JZXh0ZW5kcyBBYnN0cmFjdFN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yPEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yPgotCWltcGxlbWVudHMgU3RhdGVmdWxFeHRlbmRlZENvbW1hbmRFeGVjdXRvcgotewotCXB1YmxpYyBTaW1wbGVTdGF0ZWZ1bEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yKCkgewotCQl0aGlzKEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yLkRlZmF1bHQuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHVibGljIFNpbXBsZVN0YXRlZnVsRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IoRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXN1cGVyKGNvbW1hbmRFeGVjdXRvcik7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIGNvbW1hbmQgZXhlY3V0b3IgaXMKLQkgKiB7QGxpbmsgI3N0YXJ0KCkgc3RhcnRlZH0uCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFRvRXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMuYWN0aXZlLndhaXRVbnRpbFRydWUoKTsKLQkJdGhpcy5jb21tYW5kRXhlY3V0b3Iud2FpdFRvRXhlY3V0ZShjb21tYW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgY29tbWFuZCBleGVjdXRvciBpcwotCSAqIHtAbGluayAjc3RhcnQoKSBzdGFydGVkfS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9FeGVjdXRlKENvbW1hbmQgY29tbWFuZCwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJdGhpcy53YWl0VG9FeGVjdXRlKGNvbW1hbmQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWlmICh0aGlzLmFjdGl2ZS53YWl0VW50aWxUcnVlKHRpbWVvdXQpKSB7Ci0JCQkvLyBhZGp1c3QgdGhlIHRpbWUKLQkJCXRpbWVvdXQgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlyZXR1cm4gKHRpbWVvdXQgPiAwKSAmJiB0aGlzLmNvbW1hbmRFeGVjdXRvci53YWl0VG9FeGVjdXRlKGNvbW1hbmQsIHRpbWVvdXQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL1NpbmdsZVVzZVF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL1NpbmdsZVVzZVF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZDA3ZTEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9TaW5nbGVVc2VRdWV1ZWluZ0NvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5FeHRlbmRlZENvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5TdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcjsKLQotLyoqCi0gKiBAc2VlIEFic3RyYWN0U2luZ2xlVXNlUXVldWVpbmdDb21tYW5kRXhlY3V0b3IKLSAqLwotcHVibGljIGNsYXNzIFNpbmdsZVVzZVF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yCi0JZXh0ZW5kcyBBYnN0cmFjdFNpbmdsZVVzZVF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yPFN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yPgotewotCXB1YmxpYyBTaW5nbGVVc2VRdWV1ZWluZ0NvbW1hbmRFeGVjdXRvcigpIHsKLQkJdGhpcyhFeHRlbmRlZENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCkpOwotCX0KLQotCXB1YmxpYyBTaW5nbGVVc2VRdWV1ZWluZ0NvbW1hbmRFeGVjdXRvcihDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXRoaXMobmV3IFNpbXBsZVN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yKGNvbW1hbmRFeGVjdXRvcikpOwotCX0KLQotCXB1YmxpYyBTaW5nbGVVc2VRdWV1ZWluZ0NvbW1hbmRFeGVjdXRvcihTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IpIHsKLQkJc3VwZXIoY29tbWFuZEV4ZWN1dG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL1NpbmdsZVVzZVF1ZXVlaW5nRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvU2luZ2xlVXNlUXVldWVpbmdFeHRlbmRlZENvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjdiMTMwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvU2luZ2xlVXNlUXVldWVpbmdFeHRlbmRlZENvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuU3RhdGVmdWxFeHRlbmRlZENvbW1hbmRFeGVjdXRvcjsKLQotLyoqCi0gKiBDYWxscyB0byB7QGxpbmsgI3dhaXRUb0V4ZWN1dGUoQ29tbWFuZCl9IHdpbGwgc3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQKLSAqIHVudGlsIHRoZSBjb21tYW5kIGV4ZWN1dG9yIGlzIHtAbGluayAjc3RhcnQoKSBzdGFydGVkfSBhbmQgYW55IHByZXZpb3VzbHktCi0gKiBkaXNwYXRjaGVkIGNvbW1hbmRzIGhhdmUgZXhlY3V0ZWQuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IENhbGxzIHRvIHtAbGluayAjd2FpdFRvRXhlY3V0ZShDb21tYW5kKX0gd2lsbCBzdXNwZW5kCi0gKiB0aGUgY3VycmVudCB0aHJlYWQgPGVtPmluZGVmaW5pdGVseTwvZW0+IGlmIHRoZSBjb21tYW5kIGV4ZWN1dG9yIGlzCi0gKiB7QGxpbmsgI3N0b3AoKSBzdG9wcGVkfS4KLSAqIAotICogQHNlZSBBYnN0cmFjdFNpbmdsZVVzZVF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGVVc2VRdWV1ZWluZ0V4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yCi0JZXh0ZW5kcyBBYnN0cmFjdFNpbmdsZVVzZVF1ZXVlaW5nQ29tbWFuZEV4ZWN1dG9yPFN0YXRlZnVsRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3I+Ci0JaW1wbGVtZW50cyBTdGF0ZWZ1bEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yCi17Ci0JcHVibGljIFNpbmdsZVVzZVF1ZXVlaW5nRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCXRoaXMoRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IuRGVmYXVsdC5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwdWJsaWMgU2luZ2xlVXNlUXVldWVpbmdFeHRlbmRlZENvbW1hbmRFeGVjdXRvcihFeHRlbmRlZENvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IpIHsKLQkJdGhpcyhuZXcgU2ltcGxlU3RhdGVmdWxFeHRlbmRlZENvbW1hbmRFeGVjdXRvcihjb21tYW5kRXhlY3V0b3IpKTsKLQl9Ci0KLQlwdWJsaWMgU2luZ2xlVXNlUXVldWVpbmdFeHRlbmRlZENvbW1hbmRFeGVjdXRvcihTdGF0ZWZ1bEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvcikgewotCQlzdXBlcihjb21tYW5kRXhlY3V0b3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdhaXRUb0V4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlTeW5jaHJvbml6aW5nQ29tbWFuZCBzeW5jQ29tbWFuZCA9IG5ldyBTeW5jaHJvbml6aW5nQ29tbWFuZCgpOwotCi0JCXRoaXMuZXhlY3V0ZShzeW5jQ29tbWFuZCk7ICAvLyBwdXQgdGhlIHN5bmMgY29tbWFuZCBvbiB0aGUgcXVldWUgYW5kIHdhaXQgdW50aWwgaXQgaGFzIGV4ZWN1dGVkCi0KLQkJdHJ5IHsKLQkJCXN5bmNDb21tYW5kLndhaXRGb3JFeGVjdXRpb24oKTsKLQkJCXRoaXMuY29tbWFuZEV4ZWN1dG9yLndhaXRUb0V4ZWN1dGUoY29tbWFuZCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzeW5jQ29tbWFuZC5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9FeGVjdXRlKENvbW1hbmQgY29tbWFuZCwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJdGhpcy53YWl0VG9FeGVjdXRlKGNvbW1hbmQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCVN5bmNocm9uaXppbmdDb21tYW5kIHN5bmNDb21tYW5kID0gbmV3IFN5bmNocm9uaXppbmdDb21tYW5kKCk7Ci0KLQkJdGhpcy5leGVjdXRlKHN5bmNDb21tYW5kKTsgIC8vIGRpc3BhdGNoIHRoZSBzeW5jIGNvbW1hbmQgdG8gdGhlIG90aGVyIHRocmVhZAotCi0JCXRyeSB7Ci0JCQlpZiAoc3luY0NvbW1hbmQud2FpdEZvckV4ZWN1dGlvbih0aW1lb3V0KSkgewotCQkJCS8vIGFkanVzdCB0aGUgdGltZQotCQkJCXRpbWVvdXQgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJcmV0dXJuICh0aW1lb3V0ID4gMCkgJiYgdGhpcy5jb21tYW5kRXhlY3V0b3Iud2FpdFRvRXhlY3V0ZShjb21tYW5kLCB0aW1lb3V0KTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSBmaW5hbGx5IHsKLQkJCXN5bmNDb21tYW5kLnJlbGVhc2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvU3luY2hyb25pemluZ0NvbW1hbmQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvU3luY2hyb25pemluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYzMDBkOC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL1N5bmNocm9uaXppbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRCb29sZWFuOwotCi0vKioKLSAqIEEgPGVtPnN5bmNocm9uaXppbmc8L2VtPiBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIGNvb3JkaW5hdGUgdGhlIGV4ZWN1dGlvbiBvZgotICogdGhlIHtAbGluayBUaHJlYWQgdGhyZWFkfSB0aGF0IDxlbT5jcmVhdGVzPC9lbT4gdGhlIDxlbT5zeW5jaHJvbml6aW5nPC9lbT4KLSAqIGNvbW1hbmQgKFRocmVhZCBBLCB0aGUgInByaW1hcnkiIHRocmVhZCkgd2l0aCBhbm90aGVyIHtAbGluayBUaHJlYWQgdGhyZWFkfQotICogdGhhdCA8ZW0+ZXhlY3V0ZXM8L2VtPiB0aGUgPGVtPnN5bmNocm9uaXppbmc8L2VtPiBjb21tYW5kIChUaHJlYWQgQiwgdGhlCi0gKiAic2Vjb25kYXJ5IiB0aHJlYWQpLgotICogPHA+Ci0gKiBUeXBpY2FsbHksIFRocmVhZCBBIGRpc3BhdGNoZXMge0BDb21tYW5kIGNvbW1hbmRzfSB0byBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmQKLSAqIGV4ZWN1dG9yfSkgdGhhdCBleGVjdXRlcyB0aGUge0BDb21tYW5kIGNvbW1hbmRzfSBhc3luY2hyb25vdXNseSBvbiBUaHJlYWQgQi4KLSAqIEEgPGVtPnN5bmNocm9uaXppbmc8L2VtPiBjb21tYW5kIGFsbG93cyBUaHJlYWQgQSB0bwotICogZGlzcGF0Y2ggYSA8ZW0+c3luY2hyb25pemluZzwvZW0+IGNvbW1hbmQgdG8gVGhyZWFkIEIgYW5kIHN1c3BlbmQgdW50aWwKLSAqIHRoZSB7QGxpbmsgI2NvbW1hbmR9IGhlbGQgYnkgdGhlIDxlbT5zeW5jaHJvbml6aW5nPC9lbT4gY29tbWFuZAotICogaGFzIGV4ZWN1dGVkIChvbiA8ZW0+VGhyZWFkIEI8L2VtPikuIChUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBUaHJlYWQgQiBpcyB0aGUKLSAqIFVJIHtAbGluayBUaHJlYWQgdGhyZWFkfSBhbmQgdGhlIHtAbGluayAjY29tbWFuZH0gbXVzdCBtb2RpZnkgYSBVSSB3aWRnZXQuKQotICogT25jZSB0aGUge0BsaW5rICNjb21tYW5kfSBoZWxkIGJ5IHRoZSA8ZW0+c3luY2hyb25pemluZzwvZW0+IGNvbW1hbmQgaGFzCi0gKiBleGVjdXRlZCwgVGhyZWFkIEIgc3VzcGVuZHMgYW5kIG5vdGlmaWVzIFRocmVhZCBBIHRvIHByb2NlZWQuIFRocmVhZCBBIGNhbgotICogb3B0aW9uYWxseSBleGVjdXRlIHlldCBhbm90aGVyIHtAQ29tbWFuZCBjb21tYW5kfSAob24gPGVtPlRocmVhZCBBPC9lbT4pLgotICogT25jZSBUaHJlYWQgQSBoYXMgZXhlY3V0ZWQgaXRzIGNvbW1hbmQsIGl0IG11c3Qgbm90aWZ5IFRocmVhZCBCIHRoYXQgaXQgbWF5Ci0gKiBwcm9jZWVkIChub3cgaW5kZXBlbmRlbnRseSBvZiBUaHJlYWQgQSkuCi0gKiA8cD4KLSAqIDxzdHJvbmc+VGltZW91dHM6PC9zdHJvbmc+IElmIFRocmVhZCBBIHNwZWNpZmllcyBhIHRpbWUtbGltaXQKLSAqICh7QGxpbmsgI3dhaXRGb3JFeGVjdXRpb24obG9uZyl9KSBmb3IgaXRzIHN1c3BlbnNpb24sIGFuZCBhIHRpbWVvdXQgb2NjdXJzCi0gKiAoaS5lLiBpdCB0YWtlcyB0b28gbG9uZyBmb3IgdGhlIDxlbT5zeW5jaHJvbml6aW5nPC9lbT4gY29tbWFuZCB0byBiZWdpbgotICogZXhlY3V0aW5nIG9yIGl0cyB7QGxpbmsgI2NvbW1hbmR9IHRha2VzIHRvbyBsb25nIHRvIGV4ZWN1dGUpLAotICogdGhlIHtAbGluayAjY29tbWFuZH0gaGVsZCBieSB0aGUgPGVtPnN5bmNocm9uaXppbmc8L2VtPiBjb21tYW5kIHdpbGwKLSAqIDxlbT5zdGlsbCBiZSBleGVjdXRlZDwvZW0+OyBidXQgVGhyZWFkIEEgd2lsbCBub3QgYmUgbm90aWZpZWQgd2hlbiB0aGUKLSAqIGV4ZWN1dGlvbiBpcyBjb21wbGV0ZS4gW0l0IHNlZW1zIHJlYXNvbmFibGUgdGhhdCB0aGUge0BsaW5rICNjb21tYW5kfSBhbHdheXMKLSAqIGV4ZWN1dGUsIHNpbmNlLCBpZiBpdCBpcyB0b28gbG9uZy1ydW5uaW5nLCBpdCB3aWxsIGV4ZWN1dGUgYW55d2F5Li4uLl0KLSAqIDxwPgotICogPHN0cm9uZz5TeW5jaHJvbm91cyBFeGVjdXRpb246PC9zdHJvbmc+IElmIHRoZSA8ZW0+c3luY2hyb25pemluZzwvZW0+IGNvbW1hbmQKLSAqIGlzIDxlbT5jcmVhdGVkPC9lbT4gYW5kIDxlbT5leGVjdXRlZDwvZW0+IG9uIHRoZSBzYW1lIHtAbGluayBUaHJlYWQgdGhyZWFkfSwKLSAqIHRoZSBhc3N1bXB0aW9uIGlzIFRocmVhZCBBIGFuZCBUaHJlYWQgQiBhcmUgdGhlIHNhbWUge0BsaW5rIFRocmVhZCB0aHJlYWR9Ci0gKiBhbmQgYWxsIHtAQ29tbWFuZCBjb21tYW5kc30gYXJlIGV4ZWN1dGluZyBzeW5jaHJvbm91c2x5IChlLmcuIGR1cmluZyB0ZXN0aW5nCi0gKiBvciAiYmF0Y2giIGV4ZWN1dGluZykuCi0gKiBJbiB0aGF0IHNpdHVhdGlvbiwgdGhlIDxlbT5zeW5jaHJvbml6aW5nPC9lbT4gY29tbWFuZCB3aWxsIDxlbT5ub3Q8L2VtPgotICogc3VzcGVuZCBpdHMge0BsaW5rIFRocmVhZCB0aHJlYWR9LgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemluZ0NvbW1hbmQKLQlpbXBsZW1lbnRzIENvbW1hbmQKLXsKLQlwcml2YXRlIGZpbmFsIFRocmVhZCB0aHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOyAgLy8gVGhyZWFkIEEKLQlwcml2YXRlIGZpbmFsIFN5bmNocm9uaXplZEJvb2xlYW4gZmxhZyA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKGZhbHNlKTsKLQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gZXhwaXJlZCA9IGZhbHNlOyAgLy8gZ3VhcmRlZCBieSAjZmxhZwotCXByaXZhdGUgZmluYWwgQ29tbWFuZCBjb21tYW5kOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSA8ZW0+c3luY2hyb25pemluZzwvZW0+IGNvbW1hbmQgdGhhdCBkb2VzIDxlbT5ub3Q8L2VtPiBleGVjdXRlCi0JICogYSB7QGxpbmsgI2NvbW1hbmR9IG9uIHRoZSAic2Vjb25kYXJ5IiB7QGxpbmsgVGhyZWFkIHRocmVhZH0gKFRocmVhZCBCKSwKLQkgKiBidXQgc2ltcGx5IHN1c3BlbmRzIHRoYXQgdGhyZWFkIHVudGlsIHRoZSA8ZW0+c3luY2hyb25pemluZzwvZW0+IGNvbW1hbmQKLQkgKiBpcyB7QGxpbmsgI3JlbGVhc2UoKSByZWxlYXNlZH0gYnkgdGhlICJwcmltYXJ5IiB0aHJlYWQgKFRocmVhZCBBKS4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemluZ0NvbW1hbmQoKSB7Ci0JCXRoaXMoQ29tbWFuZC5OdWxsLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIDxlbT5zeW5jaHJvbml6aW5nPC9lbT4gY29tbWFuZCB0aGF0IGV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQKLQkgKiBhIGNvbW1hbmQgb24gdGhlICJzZWNvbmRhcnkiIHtAbGluayBUaHJlYWQgdGhyZWFkfSAoVGhyZWFkIEIpLAotCSAqIGFuZCB0aGVuIHN1c3BlbmRzIHRoYXQgdGhyZWFkIHVudGlsIHRoZSA8ZW0+c3luY2hyb25pemluZzwvZW0+IGNvbW1hbmQKLQkgKiBpcyB7QGxpbmsgI3JlbGVhc2UoKSByZWxlYXNlZH0gYnkgdGhlICJwcmltYXJ5IiB0aHJlYWQgKFRocmVhZCBBKS4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemluZ0NvbW1hbmQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChjb21tYW5kID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogVHlwaWNhbGx5IGNhbGxlZCBieSBhCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmRFeGVjdXRvciBjb21tYW5kCi0JICogZXhlY3V0b3J9IGV4ZWN1dGluZyBUaHJlYWQgQi4KLQkgKiA8cD4KLQkgKiBUaGUgInN5bmNocm9uaXppbmciIGNvbW1hbmQgaGFzIHJlYWNoZWQgdGhlIGZyb250IG9mIHRoZSBjb21tYW5kIHF1ZXVlCi0JICogYW5kIGlzIGV4ZWN1dGluZyBvbiBUaHJlYWQgQi4KLQkgKiBFeGVjdXRlIHRoZSB3cmFwcGVkIGNvbW1hbmQgYW5kIHJldHVybiBjb250cm9sIHRvIHRoZSBUaHJlYWQgQS4KLQkgKiBTdXNwZW5kIFRocmVhZCBCIHVudGlsIFRocmVhZCBBIHJlc2V0cyB0aGUgZmxhZy4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgInN5bmNocm9uaXppbmciIGNvbW1hbmQgaXMgZXhlY3V0ZWQgKHN5bmNocm9ub3VzbHkpIG9uIHRoZSBzYW1lCi0JICogdGhyZWFkIHdoZXJlIHRoZSBjb21tYW5kIHdhcyBjcmVhdGVkIChpLmUuIFRocmVhZCBBKSwKLQkgKiBpdCB3aWxsIHNpbXBseSBzZXQgdGhlIGZsYWcgYXBwcm9wcmlhdGVseSBhbmQgcmV0dXJuLgotCSAqIE90aGVyd2lzZSwgdGhlIGN1cnJlbnQgdGhyZWFkIHdvdWxkIHN0YWxsIGluZGVmaW5pdGVseS4KLQkgKiA8cD4KLQkgKiBJZiBUaHJlYWQgQSBoYXMgdGltZWQgb3V0LCBza2lwIGFueSBmdXJ0aGVyIHN5bmNocm9uaXphdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQl0aGlzLmNvbW1hbmQuZXhlY3V0ZSgpOwotCi0JCXN5bmNocm9uaXplZCAodGhpcy5mbGFnKSB7Ci0JCQlpZiAodGhpcy5leHBpcmVkKSB7Ci0JCQkJLy8gcmVzZXQgdGhlICdleHBpcmVkJyBmbGFnIGFuZCBleGl0IChkb24ndCB3YWl0IGZvciBUaHJlYWQgQSkKLQkJCQl0aGlzLmV4cGlyZWQgPSBmYWxzZTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvLyBUaHJlYWQgQSBpcyBzdGlsbCB3YWl0aW5nIC0gbm90aWZ5IGl0Ci0JCQl0aGlzLmZsYWcuc2V0VHJ1ZSgpOwotCQl9Ci0KLQkJaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgIT0gdGhpcy50aHJlYWQpIHsKLQkJCXRyeSB7Ci0JCQkJdGhpcy5mbGFnLndhaXRVbnRpbEZhbHNlKCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIHNvbWV0aGluZyBoYXMgaW50ZXJydXB0ZWQgVGhyZWFkIEIgKHRoZSAic2Vjb25kYXJ5IiB0aHJlYWQpOwotCQkJCS8vIGl0IG11c3Qgbm90IHdhbnQgdXMgdG8gd2FpdCBmb3IgVGhyZWFkIEEgdG8gZmluaXNoIGV4ZWN1dGluZy4uLgotCQkJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7ICAvLyBzZXQgdGhlIFRocmVhZCdzIGludGVycnVwdCBzdGF0dXMKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSBUaHJlYWQgQSB0byB3YWl0IG9uIFRocmVhZCBCIHRvIGV4ZWN1dGUgaXRzIGNvbW1hbmQuCi0JICogQHNlZSAjd2FpdEZvckV4ZWN1dGlvbihsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRGb3JFeGVjdXRpb24oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLmZsYWcud2FpdFVudGlsVHJ1ZSgpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSBUaHJlYWQgQSB0byB3YWl0IG9uIFRocmVhZCBCIHRvIGV4ZWN1dGUgaXRzIGNvbW1hbmQuCi0JICogQHNlZSAjd2FpdEZvckV4ZWN1dGlvbigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdEZvckV4ZWN1dGlvbihsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5mbGFnKSB7Ci0JCQlpZiAodGhpcy5mbGFnLndhaXRVbnRpbFRydWUodGltZW91dCkgKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQl0aGlzLmV4cGlyZWQgPSB0cnVlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IFRocmVhZCBBIHRvIGluZGljYXRlIGl0IGhhcyBleGVjdXRlZCBpdHMgY29tbWFuZC4KLQkgKiBBdCB0aGlzIHBvaW50IHRoZSB0aHJlYWRzIGFyZSBpbmRlcGVuZGVudCBhbmQgbm8gbG9uZ2VyIHN5bmNocm9uaXplZAotCSAqIHdpdGggZWFjaCBvdGhlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQl0aGlzLmZsYWcuc2V0RmFsc2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmZsYWcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvVGhyZWFkTG9jYWxDb21tYW5kLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL1RocmVhZExvY2FsQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjJiNjE5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvVGhyZWFkTG9jYWxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZDsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb21tYW5kIGludGVyZmFjZSBhbGxvd3MgdGhlIGNsaWVudCB0bwotICogc3BlY2lmeSBhIGRpZmZlcmVudCBDb21tYW5kIGZvciBlYWNoIHRocmVhZC4KLSAqLwotcHVibGljIGNsYXNzIFRocmVhZExvY2FsQ29tbWFuZAotCWltcGxlbWVudHMgQ29tbWFuZAotewotCXByb3RlY3RlZCBmaW5hbCBUaHJlYWRMb2NhbDxDb21tYW5kPiB0aHJlYWRMb2NhbDsKLQlwcm90ZWN0ZWQgZmluYWwgQ29tbWFuZCBkZWZhdWx0Q29tbWFuZDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGNvbW1hbmQgZG9lcyBub3RoaW5nLgotCSAqLwotCXB1YmxpYyBUaHJlYWRMb2NhbENvbW1hbmQoKSB7Ci0JCXRoaXMoQ29tbWFuZC5OdWxsLmluc3RhbmNlKCkpOwotCX0KLQotCXB1YmxpYyBUaHJlYWRMb2NhbENvbW1hbmQoQ29tbWFuZCBkZWZhdWx0Q29tbWFuZCkgewotCQlzdXBlcigpOwotCQlpZiAoZGVmYXVsdENvbW1hbmQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5kZWZhdWx0Q29tbWFuZCA9IGRlZmF1bHRDb21tYW5kOwotCQl0aGlzLnRocmVhZExvY2FsID0gdGhpcy5idWlsZFRocmVhZExvY2FsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRocmVhZExvY2FsPENvbW1hbmQ+IGJ1aWxkVGhyZWFkTG9jYWwoKSB7Ci0JCXJldHVybiBuZXcgVGhyZWFkTG9jYWw8Q29tbWFuZD4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQl0aGlzLmdldCgpLmV4ZWN1dGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXQoKSB7Ci0JCUNvbW1hbmQgY29tbWFuZCA9IHRoaXMudGhyZWFkTG9jYWwuZ2V0KCk7Ci0JCXJldHVybiAoY29tbWFuZCAhPSBudWxsKSA/IGNvbW1hbmQgOiB0aGlzLmRlZmF1bHRDb21tYW5kOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY3VycmVudCB0aHJlYWQncyBjb21tYW5kIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0KENvbW1hbmQgY29tbWFuZCkgewotCQl0aGlzLnRocmVhZExvY2FsLnNldChjb21tYW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCB0aHJlYWQncyBjb21tYW5kLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldCgpLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9UaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvY29tbWFuZC9UaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDczMjllLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvVGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kRXhlY3V0b3I7Ci0KLS8qKgotICogQHNlZSBBYnN0cmFjdFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcgotCWV4dGVuZHMgQWJzdHJhY3RUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcjxDb21tYW5kRXhlY3V0b3I+Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgY29tbWFuZCBleGVjdXRvciBzaW1wbHkgZXhlY3V0ZXMgY29tbWFuZHMgZGlyZWN0bHkuCi0JICovCi0JcHVibGljIFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yKCkgewotCQl0aGlzKENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCkpOwotCX0KLQotCXB1YmxpYyBUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcihDb21tYW5kRXhlY3V0b3IgZGVmYXVsdENvbW1hbmRFeGVjdXRvcikgewotCQlzdXBlcihkZWZhdWx0Q29tbWFuZEV4ZWN1dG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9jb21tYW5kL1RocmVhZExvY2FsRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvVGhyZWFkTG9jYWxFeHRlbmRlZENvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODRlZjQyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2NvbW1hbmQvVGhyZWFkTG9jYWxFeHRlbmRlZENvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3I7Ci0KLS8qKgotICogQHNlZSBBYnN0cmFjdFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUaHJlYWRMb2NhbEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yCi0JZXh0ZW5kcyBBYnN0cmFjdFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yPEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yPgotCWltcGxlbWVudHMgRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBjb21tYW5kIGV4ZWN1dG9yIHNpbXBseSBleGVjdXRlcyBjb21tYW5kcyBkaXJlY3RseS4KLQkgKi8KLQlwdWJsaWMgVGhyZWFkTG9jYWxFeHRlbmRlZENvbW1hbmRFeGVjdXRvcigpIHsKLQkJdGhpcyhFeHRlbmRlZENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCkpOwotCX0KLQotCXB1YmxpYyBUaHJlYWRMb2NhbEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yKEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yIGRlZmF1bHRDb21tYW5kRXhlY3V0b3IpIHsKLQkJc3VwZXIoZGVmYXVsdENvbW1hbmRFeGVjdXRvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgd2FpdFRvRXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZ2V0VGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IoKS53YWl0VG9FeGVjdXRlKGNvbW1hbmQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHdhaXRUb0V4ZWN1dGUoQ29tbWFuZCBjb21tYW5kLCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmdldFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yKCkud2FpdFRvRXhlY3V0ZShjb21tYW5kLCB0aW1lb3V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9lbnVtZXJhdGlvbnMvRW1wdHlFbnVtZXJhdGlvbi5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvZW51bWVyYXRpb25zL0VtcHR5RW51bWVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUwZWE5Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9lbnVtZXJhdGlvbnMvRW1wdHlFbnVtZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuZW51bWVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIEFuIDxjb2RlPkVtcHR5RW51bWVyYXRpb248L2NvZGU+IGlzIGp1c3QgdGhhdC4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgZW51bWVyYXRpb24KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVtcHR5RW51bWVyYXRpb248RT4KLQlpbXBsZW1lbnRzIEVudW1lcmF0aW9uPEU+LCBTZXJpYWxpemFibGUKLXsKLQotCS8vIHNpbmdsZXRvbgotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW1wdHlFbnVtZXJhdGlvbiBJTlNUQU5DRSA9IG5ldyBFbXB0eUVudW1lcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIDxUPiBFbnVtZXJhdGlvbjxUPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFbXB0eUVudW1lcmF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBFIG5leHRFbGVtZW50KCkgewotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvZW51bWVyYXRpb25zL0l0ZXJhdG9yRW51bWVyYXRpb24uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2VudW1lcmF0aW9ucy9JdGVyYXRvckVudW1lcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNjAwMGMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvZW51bWVyYXRpb25zL0l0ZXJhdG9yRW51bWVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLmVudW1lcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEFuIDxjb2RlPkl0ZXJhdG9yRW51bWVyYXRpb248L2NvZGU+IHdyYXBzIGFuCi0gKiB7QGxpbmsgSXRlcmF0b3J9IHNvIHRoYXQgaXQgY2FuIGJlIHRyZWF0ZWQgbGlrZSBhbgotICoge0BsaW5rIEVudW1lcmF0aW9ufS4KLSAqIEhvcGVmdWxseSB3ZSBkb24ndCBoYXZlIG11Y2ggbmVlZCBmb3IgdGhpcy4uLi4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgZW51bWVyYXRpb24KLSAqLwotcHVibGljIGNsYXNzIEl0ZXJhdG9yRW51bWVyYXRpb248RT4KLQlpbXBsZW1lbnRzIEVudW1lcmF0aW9uPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3I7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gZW51bWVyYXRpb24gdGhhdCB3cmFwcyB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvckVudW1lcmF0aW9uKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQl0aGlzKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBlbnVtZXJhdGlvbiB0aGF0IHdyYXBzIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yRW51bWVyYXRpb24oSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3IpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9BcnJheUl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQXJyYXlJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjY3ZTcyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9BcnJheUl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLS8qKgotICogQW4gPGNvZGU+QXJyYXlJdGVyYWJsZTwvY29kZT4gcHJvdmlkZXMgYW4ge0BsaW5rIEl0ZXJhYmxlfQotICogZm9yIGFuIGFycmF5IG9mIG9iamVjdHMgb2YgdHlwZSA8Y29kZT5FPC9jb2RlPi4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIEFycmF5SXRlcmF0b3IKLSAqIEBzZWUgQXJyYXlMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIEFycmF5SXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JZmluYWwgRVtdIGFycmF5OwotCWZpbmFsIGludCBzdGFydDsKLQlmaW5hbCBpbnQgbGVuZ3RoOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqLwotCXB1YmxpYyBBcnJheUl0ZXJhYmxlKEUuLi4gYXJyYXkpIHsKLQkJdGhpcyhhcnJheSwgMCwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBzdGFydCBpbmRleCBhbmQgY29udGludWluZyBmb3IKLQkgKiB0aGUgcmVzdCBvZiB0aGUgYXJyYXkuCi0JICovCi0JcHVibGljIEFycmF5SXRlcmFibGUoRVtdIGFycmF5LCBpbnQgc3RhcnQpIHsKLQkJdGhpcyhhcnJheSwgc3RhcnQsIGFycmF5Lmxlbmd0aCAtIHN0YXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBzdGFydCBpbmRleCBhbmQgY29udGludWluZyBmb3IKLQkgKiB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgQXJyYXlJdGVyYWJsZShFW10gYXJyYXksIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlzdXBlcigpOwotCQlpZiAoKHN0YXJ0IDwgMCkgfHwgKHN0YXJ0ID4gYXJyYXkubGVuZ3RoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic3RhcnQ6ICIgKyBzdGFydCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoKGxlbmd0aCA8IDApIHx8IChsZW5ndGggPiBhcnJheS5sZW5ndGggLSBzdGFydCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxlbmd0aDogIiArIGxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmFycmF5ID0gYXJyYXk7Ci0JCXRoaXMuc3RhcnQgPSBzdGFydDsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8RT4odGhpcy5hcnJheSwgdGhpcy5zdGFydCwgdGhpcy5sZW5ndGgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIEFycmF5cy50b1N0cmluZyh0aGlzLmFycmF5KSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQXJyYXlMaXN0SXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9BcnJheUxpc3RJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGNlYjBlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9BcnJheUxpc3RJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlMaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogQW4gPGNvZGU+QXJyYXlMaXN0SXRlcmFibGU8L2NvZGU+IHByb3ZpZGVzIGEge0BsaW5rIExpc3RJdGVyYWJsZX0KLSAqIGZvciBhbiBhcnJheSBvZiBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGxpc3QgaXRlcmFibGUncyBsaXN0IGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgQXJyYXlJdGVyYWJsZQotICogQHNlZSBBcnJheUxpc3RJdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQXJyYXlMaXN0SXRlcmFibGU8RT4KLQlleHRlbmRzIEFycmF5SXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYWJsZTxFPgotewotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICovCi0JcHVibGljIEFycmF5TGlzdEl0ZXJhYmxlKEUuLi4gYXJyYXkpIHsKLQkJdGhpcyhhcnJheSwgMCwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgc3RhcnQgaW5kZXggYW5kIGNvbnRpbnVpbmcgZm9yCi0JICogdGhlIHJlc3Qgb2YgdGhlIGFycmF5LgotCSAqLwotCXB1YmxpYyBBcnJheUxpc3RJdGVyYWJsZShFW10gYXJyYXksIGludCBzdGFydCkgewotCQl0aGlzKGFycmF5LCBzdGFydCwgYXJyYXkubGVuZ3RoIC0gc3RhcnQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBzdGFydCBpbmRleCBhbmQgY29udGludWluZyBmb3IKLQkgKiB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgQXJyYXlMaXN0SXRlcmFibGUoRVtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJc3VwZXIoYXJyYXksIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8RT4odGhpcy5hcnJheSwgdGhpcy5zdGFydCwgdGhpcy5sZW5ndGgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0NoYWluSXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9DaGFpbkl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZGNjNzYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0NoYWluSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNoYWluSXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5DaGFpbkl0ZXJhYmxlPC9jb2RlPiBwcm92aWRlcyBhIHBsdWdnYWJsZSB7QGxpbmsgSXRlcmFibGV9Ci0gKiB0aGF0IGxvb3BzIG92ZXIgYSBjaGFpbiBvZiBhcmJpdHJhcmlseSBsaW5rZWQgb2JqZWN0cy4gVGhlIGNoYWluCi0gKiBzaG91bGQgYmUgbnVsbC10ZXJtaW5hdGVkIChpLmUuIGEgY2FsbCB0byB0aGUge0BsaW5rICNuZXh0TGluayhPYmplY3QpfQotICogbWV0aG9kIHNob3VsZCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gd2hlbiBpdCBpcyBwYXNzZWQgdGhlIGxhc3QKLSAqIGxpbmsgb2YgdGhlIGNoYWluKS4KLSAqIFRvIHVzZSwgc3VwcGx5IGEgc3RhcnRpbmcgbGluayBhbmQgc3VwcGx5IGEge0BsaW5rIENoYWluSXRlcmF0b3IuTGlua2VyfSBvcgotICogc3ViY2xhc3MgPGNvZGU+Q2hhaW5JdGVyYWJsZTwvY29kZT4gYW5kIG92ZXJyaWRlIHRoZQotICoge0BsaW5rICNuZXh0TGluayhPYmplY3QpfSBtZXRob2QuCi0gKiBUaGUgc3RhcnRpbmcgbGluayB3aWxsIGJlIHRoZSBmaXJzdCBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IuCi0gKiBJZiB0aGUgc3RhcnRpbmcgbGluayBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlIGl0ZXJhYmxlIHdpbGwgYmUgZW1wdHkuCi0gKiBOb3RlIHRoaXMgaXRlcmFibGUgZG9lcyBub3Qgc3VwcG9ydCA8Y29kZT5udWxsPC9jb2RlPiBlbGVtZW50cy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIENoYWluSXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIENoYWluSXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBFIHN0YXJ0TGluazsKLQlwcml2YXRlIGZpbmFsIENoYWluSXRlcmF0b3IuTGlua2VyPEU+IGxpbmtlcjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBzdGFydGluZyBsaW5rCi0JICogYW5kIGEgZGVmYXVsdCBsaW5rZXIgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBpdGVyYWJsZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI25leHRMaW5rKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgQ2hhaW5JdGVyYXRvci5MaW5rZXJ9LgotCSAqLwotCXB1YmxpYyBDaGFpbkl0ZXJhYmxlKEUgc3RhcnRMaW5rKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3RhcnRMaW5rID0gc3RhcnRMaW5rOwotCQl0aGlzLmxpbmtlciA9IHRoaXMuYnVpbGREZWZhdWx0TGlua2VyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBzdGFydGluZyBsaW5rCi0JICogYW5kIGxpbmtlci4KLQkgKi8KLQlwdWJsaWMgQ2hhaW5JdGVyYWJsZShFIHN0YXJ0TGluaywgQ2hhaW5JdGVyYXRvci5MaW5rZXI8RT4gbGlua2VyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3RhcnRMaW5rID0gc3RhcnRMaW5rOwotCQl0aGlzLmxpbmtlciA9IGxpbmtlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2hhaW5JdGVyYXRvci5MaW5rZXI8RT4gYnVpbGREZWZhdWx0TGlua2VyKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRMaW5rZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ2hhaW5JdGVyYXRvcjxFPih0aGlzLnN0YXJ0TGluaywgdGhpcy5saW5rZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmV4dCBsaW5rIGluIHRoZSBjaGFpbjsgbnVsbCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBsaW5rcy4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuIGFsdGVybmF0aXZlIHRvCi0JICogYnVpbGRpbmcgYSB7QGxpbmsgQ2hhaW5JdGVyYXRvci5MaW5rZXJ9LgotCSAqLwotCXByb3RlY3RlZCBFIG5leHRMaW5rKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBFIGN1cnJlbnRMaW5rKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnN0YXJ0TGluayk7Ci0JfQotCi0KLQkvLyoqKioqKioqKiogZGVmYXVsdCBsaW5rZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIERlZmF1bHRMaW5rZXIgaW1wbGVtZW50cyBDaGFpbkl0ZXJhdG9yLkxpbmtlcjxFPiB7Ci0JCXB1YmxpYyBFIG5leHRMaW5rKEUgY3VycmVudExpbmspIHsKLQkJCXJldHVybiBDaGFpbkl0ZXJhYmxlLnRoaXMubmV4dExpbmsoY3VycmVudExpbmspOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ2xvbmVJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0Nsb25lSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJhMjFhNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ2xvbmVJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotCi0vKioKLSAqIFB1bGwgdG9nZXRoZXIgcmVtb3ZlciBzdGF0ZSBhbmQgYmVoYXZpb3IgZm9yIHN1YmNsYXNzZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBTbmFwc2hvdENsb25lSXRlcmFibGUKLSAqIEBzZWUgTGl2ZUNsb25lSXRlcmFibGUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENsb25lSXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JZmluYWwgQ2xvbmVJdGVyYXRvci5SZW1vdmVyPEU+IHJlbW92ZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBDbG9uZUl0ZXJhYmxlKCkgewotCQlzdXBlcigpOwotCQl0aGlzLnJlbW92ZXIgPSB0aGlzLmJ1aWxkRGVmYXVsdFJlbW92ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xvbmVJdGVyYWJsZShDbG9uZUl0ZXJhdG9yLlJlbW92ZXI8RT4gcmVtb3ZlcikgewotCQlzdXBlcigpOwotCQl0aGlzLnJlbW92ZXIgPSByZW1vdmVyOwotCX0KLQotCXByb3RlY3RlZCBDbG9uZUl0ZXJhdG9yLlJlbW92ZXI8RT4gYnVpbGREZWZhdWx0UmVtb3ZlcigpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0UmVtb3ZlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0IHJlbW92YWwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBmcm9tIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBDbG9uZUl0ZXJhdG9yLlJlbW92ZXJ9LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRSBlbGVtZW50KSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vKioqKioqKioqKiBkZWZhdWx0IG11dGF0b3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIERlZmF1bHRSZW1vdmVyIGltcGxlbWVudHMgQ2xvbmVJdGVyYXRvci5SZW1vdmVyPEU+IHsKLQkJcHVibGljIHZvaWQgcmVtb3ZlKEUgZWxlbWVudCkgewotCQkJQ2xvbmVJdGVyYWJsZS50aGlzLnJlbW92ZShlbGVtZW50KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0Nsb25lTGlzdEl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ2xvbmVMaXN0SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk4YzQyMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ2xvbmVMaXN0SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogUHVsbCB0b2dldGhlciBtdXRhdG9yIHN0YXRlIGFuZCBiZWhhdmlvciBmb3Igc3ViY2xhc3Nlcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgbGlzdCBpdGVyYWJsZSdzIGxpc3QgaXRlcmF0b3IKLSAqIAotICogQHNlZSBTbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlCi0gKiBAc2VlIExpdmVDbG9uZUxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xvbmVMaXN0SXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYWJsZTxFPgotewotCWZpbmFsIENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3I8RT4gbXV0YXRvcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENsb25lTGlzdEl0ZXJhYmxlKCkgewotCQlzdXBlcigpOwotCQl0aGlzLm11dGF0b3IgPSB0aGlzLmJ1aWxkRGVmYXVsdE11dGF0b3IoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xvbmVMaXN0SXRlcmFibGUoQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcjxFPiBtdXRhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubXV0YXRvciA9IG11dGF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3I8RT4gYnVpbGREZWZhdWx0TXV0YXRvcigpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0TXV0YXRvcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0IG11dGF0aW9ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBdCB0aGUgc3BlY2lmaWVkIGluZGV4LCBhZGQgdGhlIHNwZWNpZmllZCBlbGVtZW50IHRvIHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yfS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCBpbmRleCwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEUgZWxlbWVudCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZnJvbSB0aGUgb3JpZ2luYWwgbGlzdC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcn0uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIHNldCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsIGxpc3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3J9LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IGluZGV4LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRSBlbGVtZW50KSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vKioqKioqKioqKiBkZWZhdWx0IG11dGF0b3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIERlZmF1bHRNdXRhdG9yIGltcGxlbWVudHMgQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcjxFPiB7Ci0JCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQkJQ2xvbmVMaXN0SXRlcmFibGUudGhpcy5hZGQoaW5kZXgsIGVsZW1lbnQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCUNsb25lTGlzdEl0ZXJhYmxlLnRoaXMucmVtb3ZlKGluZGV4KTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKLQkJCUNsb25lTGlzdEl0ZXJhYmxlLnRoaXMuc2V0KGluZGV4LCBlbGVtZW50KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0NvbXBvc2l0ZUl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyNzM3ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBvc2l0ZUl0ZXJhYmxlPC9jb2RlPiB3cmFwcyBhbiB7QGxpbmsgSXRlcmFibGV9Ci0gKiBvZiB7QGxpbmsgSXRlcmFibGV9cyBhbmQgbWFrZXMgdGhlbSBhcHBlYXIgdG8gYmUgYSBzaW5nbGUKLSAqIHtAbGluayBJdGVyYWJsZX0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBDb21wb3NpdGVJdGVyYXRvcgotICogQHNlZSBDb21wb3NpdGVMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZUl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPj4gaXRlcmFibGVzOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2YgaXRlcmFibGVzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVJdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgSXRlcmFibGU8PyBleHRlbmRzIEU+PiBpdGVyYWJsZXMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYWJsZXMgPSBpdGVyYWJsZXM7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmFibGUoRSBvYmplY3QsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQl0aGlzKG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8RT4ob2JqZWN0KSwgaXRlcmFibGUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmFibGUoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBFIG9iamVjdCkgewotCQl0aGlzKGl0ZXJhYmxlLCBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPEU+KG9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgaXRlcmFibGVzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVJdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRT4uLi4gaXRlcmFibGVzKSB7Ci0JCXRoaXMobmV3IEFycmF5SXRlcmFibGU8SXRlcmFibGU8PyBleHRlbmRzIEU+PihpdGVyYWJsZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb21iaW5lZCBpdGVyYXRvcnMKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8RT4odGhpcy5pdGVyYXRvcnMoKSk7Ci0JfQotCi0JLyoqCi0JICogaXRlcmF0b3Igb2YgaXRlcmF0b3JzCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBJdGVyYXRvcjw/IGV4dGVuZHMgRT4+IGl0ZXJhdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiwgSXRlcmF0b3I8PyBleHRlbmRzIEU+Pih0aGlzLml0ZXJhYmxlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gdHJhbnNmb3JtKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuaXRlcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBpdGVyYXRvciBvZiBpdGVyYWJsZXMKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPj4gaXRlcmFibGVzKCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYWJsZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhYmxlcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlTGlzdEl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlTGlzdEl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2Zjc1NjIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0NvbXBvc2l0ZUxpc3RJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBvc2l0ZUxpc3RJdGVyYWJsZTwvY29kZT4gd3JhcHMgYSB7QGxpbmsgTGlzdEl0ZXJhYmxlfQotICogb2Yge0BsaW5rIExpc3RJdGVyYWJsZX1zIGFuZCBtYWtlcyB0aGVtIGFwcGVhciB0byBiZSBhIHNpbmdsZQotICoge0BsaW5rIExpc3RJdGVyYWJsZX0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGxpc3QgaXRlcmFibGUncyBsaXN0IGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yCi0gKiBAc2VlIENvbXBvc2l0ZUl0ZXJhYmxlCi0gKiBAc2VlIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVMaXN0SXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBMaXN0SXRlcmFibGU8RT4+IGl0ZXJhYmxlczsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBsaXN0IGl0ZXJhYmxlcy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlKExpc3Q8TGlzdEl0ZXJhYmxlPEU+PiBpdGVyYWJsZXMpIHsKLQkJdGhpcyhuZXcgTGlzdExpc3RJdGVyYWJsZTxMaXN0SXRlcmFibGU8RT4+KGl0ZXJhYmxlcykpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgbGlzdCBpdGVyYWJsZXMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYWJsZShMaXN0SXRlcmFibGU8PyBleHRlbmRzIExpc3RJdGVyYWJsZTxFPj4gaXRlcmFibGVzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmFibGVzID0gaXRlcmFibGVzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcmVwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYWJsZShFIG9iamVjdCwgTGlzdDxFPiBsaXN0KSB7Ci0JCXRoaXMob2JqZWN0LCBuZXcgTGlzdExpc3RJdGVyYWJsZTxFPihsaXN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBpdGVyYWJsZS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlKEUgb2JqZWN0LCBMaXN0SXRlcmFibGU8RT4gaXRlcmFibGUpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTxFPihvYmplY3QpLCBpdGVyYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmFibGUoTGlzdDxFPiBsaXN0LCBFIG9iamVjdCkgewotCQl0aGlzKG5ldyBMaXN0TGlzdEl0ZXJhYmxlPEU+KGxpc3QpLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcHBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBpdGVyYWJsZS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlKExpc3RJdGVyYWJsZTxFPiBpdGVyYWJsZSwgRSBvYmplY3QpIHsKLQkJdGhpcyhpdGVyYWJsZSwgbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU8RT4ob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBpdGVyYWJsZXMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYWJsZShMaXN0SXRlcmFibGU8RT4uLi4gaXRlcmFibGVzKSB7Ci0JCXRoaXMobmV3IEFycmF5TGlzdEl0ZXJhYmxlPExpc3RJdGVyYWJsZTxFPj4oaXRlcmFibGVzKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdHMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYWJsZShMaXN0PEU+Li4uIGxpc3RzKSB7Ci0JCXRoaXMobmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlPExpc3Q8RT4sIExpc3RJdGVyYWJsZTxFPj4obmV3IEFycmF5TGlzdEl0ZXJhYmxlPExpc3Q8RT4+KGxpc3RzKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEU+IHRyYW5zZm9ybShMaXN0PEU+IGxpc3QpIHsKLQkJCQlyZXR1cm4gbmV3IExpc3RMaXN0SXRlcmFibGU8RT4obGlzdCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIGNvbWJpbmVkIGxpc3QgaXRlcmF0b3JzCi0JICovCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0SXRlcmF0b3I8RT4odGhpcy5pdGVyYXRvcnMoKSk7Ci0JfQotCi0JLyoqCi0JICogbGlzdCBpdGVyYXRvciBvZiBsaXN0IGl0ZXJhdG9ycwotCSAqLwotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIExpc3RJdGVyYXRvcjxFPj4gaXRlcmF0b3JzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPExpc3RJdGVyYWJsZTxFPiwgTGlzdEl0ZXJhdG9yPEU+Pih0aGlzLml0ZXJhYmxlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RT4gdHJhbnNmb3JtKExpc3RJdGVyYWJsZTxFPiBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuaXRlcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBsaXN0IGl0ZXJhdG9yIG9mIGxpc3QgaXRlcmFibGVzCi0JICovCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTGlzdEl0ZXJhYmxlPEU+PiBpdGVyYWJsZXMoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhYmxlcy5pdGVyYXRvcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmFibGVzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9FbXB0eUl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2VkMWM0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9FbXB0eUl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci0KLS8qKgotICogQW4gPGNvZGU+RW1wdHlJdGVyYWJsZTwvY29kZT4gaXMganVzdCB0aGF0LgotICogTWF5YmUganVzdCBhIHRvdWNoIGJldHRlci1wZXJmb3JtaW5nIHRoYW4ge0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ucyNFTVBUWV9TRVR9Ci0gKiBzaW5jZSB3ZSBkb24ndCBjcmVhdGUgYSBuZXcge0BsaW5rIEl0ZXJhdG9yfSBldmVyeSB0aW1lIHtAbGluayAjaXRlcmF0b3IoKX0gaXMgY2FsbGVkLgotICogKE5vdCBzdXJlIHdoeSB0aGV5IGRvIHRoYXQuLi4uKQotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgRW1wdHlJdGVyYXRvcgotICogQHNlZSBFbXB0eUxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgSXRlcmFibGU8RT4sIFNlcmlhbGl6YWJsZQotewotCS8vIHNpbmdsZXRvbgotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGUgSU5TVEFOQ0UgPSBuZXcgRW1wdHlJdGVyYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyA8VD4gSXRlcmFibGU8VD4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRW1wdHlJdGVyYWJsZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9FbXB0eUxpc3RJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0VtcHR5TGlzdEl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyOGYzNGYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0VtcHR5TGlzdEl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBBbiA8Y29kZT5FbXB0eUxpc3RJdGVyYWJsZTwvY29kZT4gaXMganVzdCB0aGF0LgotICogTWF5YmUganVzdCBhIHRvdWNoIGJldHRlci1wZXJmb3JtaW5nIHRoYW4ge0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ucyNFTVBUWV9MSVNUfQotICogc2luY2Ugd2UgZG9uJ3QgY3JlYXRlIGEgbmV3IHtAbGluayBqYXZhLnV0aWwuSXRlcmF0b3J9IGV2ZXJ5IHRpbWUKLSAqIHtAbGluayAjaXRlcmF0b3IoKX0gaXMgY2FsbGVkLiAoTm90IHN1cmUgd2h5IHRoZXkgZG8gdGhhdC4uLi4pCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGxpc3QgaXRlcmFibGUncyBsaXN0IGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgRW1wdHlMaXN0SXRlcmF0b3IKLSAqIEBzZWUgRW1wdHlJdGVyYWJsZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlMaXN0SXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYWJsZTxFPiwgU2VyaWFsaXphYmxlCi17Ci0JLy8gc2luZ2xldG9uCi0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0SXRlcmFibGUgSU5TVEFOQ0UgPSBuZXcgRW1wdHlMaXN0SXRlcmFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPFQ+IExpc3RJdGVyYWJsZTxUPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFbXB0eUxpc3RJdGVyYWJsZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0ZpbHRlcmluZ0l0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvRmlsdGVyaW5nSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3ZjBkOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvRmlsdGVyaW5nSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5GaWx0ZXJpbmdJdGVyYWJsZTwvY29kZT4gd3JhcHMgYW5vdGhlciB7QGxpbmsgSXRlcmFibGV9Ci0gKiBhbmQgdXNlcyBhIHtAbGluayBGaWx0ZXJ9IHRvIGRldGVybWluZSB3aGljaCBlbGVtZW50cyBpbiB0aGUKLSAqIG5lc3RlZCBpdGVyYWJsZSBhcmUgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IuCi0gKiA8cD4KLSAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIEZpbHRlcn0sIGEgc3ViY2xhc3MKLSAqIG9mIDxjb2RlPkZpbHRlcmluZ0l0ZXJhYmxlPC9jb2RlPiBjYW4gb3ZlcnJpZGUgdGhlCi0gKiB7QGxpbmsgI2FjY2VwdChPYmplY3QpfSBtZXRob2QuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgdG8gYmUgZmlsdGVyZWQKLSAqIAotICogQHNlZSBGaWx0ZXJpbmdJdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nSXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGU7Ci0JcHJpdmF0ZSBmaW5hbCBGaWx0ZXI8RT4gZmlsdGVyOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIGl0ZXJhYmxlIGFuZCBhIGRlZmF1bHQgZmlsdGVyIHRoYXQgY2FsbHMgYmFjayB0byB0aGUgaXRlcmFibGUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNhY2NlcHQoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBGaWx0ZXJ9LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdJdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlOwotCQl0aGlzLmZpbHRlciA9IHRoaXMuYnVpbGREZWZhdWx0RmlsdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBpdGVyYWJsZSBhbmQgZmlsdGVyLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdJdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIEZpbHRlcjxFPiBmaWx0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsdGVyPEU+IGJ1aWxkRGVmYXVsdEZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0RmlsdGVyKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEU+KHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKSwgdGhpcy5maWx0ZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0JICogc2hvdWxkIHJldHVybiB0aGUgc3BlY2lmaWVkIG5leHQgZWxlbWVudCBmcm9tIGEgY2FsbCB0byB0aGUKLQkgKiB7QGxpbmsgSXRlcmF0b3IjbmV4dCgpfSBtZXRob2QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIEZpbHRlcn0uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBFIG8pIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmFibGUpOwotCX0KLQotCi0JLy8qKioqKioqKioqIGRlZmF1bHQgZmlsdGVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0RmlsdGVyIGltcGxlbWVudHMgRmlsdGVyPEU+IHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEUgbykgewotCQkJcmV0dXJuIEZpbHRlcmluZ0l0ZXJhYmxlLnRoaXMuYWNjZXB0KG8pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvR3JhcGhJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0dyYXBoSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE5MTJhNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvR3JhcGhJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuR3JhcGhJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPkdyYXBoSXRlcmFibGU8L2NvZGU+IGlzIHNpbWlsYXIgdG8gYSB7QGxpbmsgVHJlZUl0ZXJhYmxlfQotICogZXhjZXB0IHRoYXQgaXQgY2Fubm90IGJlIGFzc3VtZWQgdGhhdCBhbGwgbm9kZXMgYXNzdW1lIGEgc3RyaWN0IHRyZWUKLSAqIHN0cnVjdHVyZS4gRm9yIGluc3RhbmNlLCBpbiBhIHRyZWUsIGEgbm9kZSBjYW5ub3QgYmUgYSBkZXNjZW5kZW50IG9mCi0gKiBpdHNlbGYsIGJ1dCBhIGdyYXBoIG1heSBoYXZlIGEgY3ljbGljYWwgc3RydWN0dXJlLgotICogCi0gKiBBIDxjb2RlPkdyYXBoSXRlcmFibGU8L2NvZGU+IHNpbXBsaWZpZXMgdGhlIHRyYXZlcnNhbCBvZiBhCi0gKiBncmFwaCBvZiBvYmplY3RzLCB3aGVyZSB0aGUgb2JqZWN0cycgcHJvdG9jb2wocykgcHJvdmlkZXMKLSAqIGEgbWV0aG9kIGZvciBnZXR0aW5nIHRoZSBuZXh0IGNvbGxlY3Rpb24gb2Ygbm9kZXMgaW4gdGhlIGdyYXBoLAotICogKG9yIDxlbT5uZWlnaGJvcnM8L2VtPiksIGJ1dCBkb2VzIG5vdCBwcm92aWRlIGEgbWV0aG9kIGZvcgotICogZ2V0dGluZyA8ZW0+YWxsPC9lbT4gb2YgdGhlIG5vZGVzIGluIHRoZSBncmFwaC4KLSAqIChlLmcuIGEgbmVpZ2hib3IgY2FuIHJldHVybiBoaXMgbmVpZ2hib3JzLCBhbmQgdGhvc2UgbmVpZ2hib3JzCi0gKiBjYW4gcmV0dXJuIHRoZWlyIG5laWdoYm9ycywgd2hpY2ggbWlnaHQgYWxzbyBpbmNsdWRlIHRoZSBvcmlnaW5hbAotICogbmVpZ2hib3IsIGJ1dCB5b3Ugb25seSB3YW50IHRvIHZpc2l0IHRoZSBvcmlnaW5hbCBuZWlnaGJvciBvbmNlLikKLSAqIDxwPgotICogSWYgYSBuZWlnaGJvciBoYXMgYWxyZWFkeSBiZWVuIHZpc2l0ZWQgKGRldGVybWluZWQgYnkgdXNpbmcgCi0gKiB7QGxpbmsgI2VxdWFscyhPYmplY3QpfSksIHRoYXQgbmVpZ2hib3IgaXMgbm90IHZpc2l0ZWQgYWdhaW4sCi0gKiBub3IgYXJlIHRoZSBuZWlnaGJvcnMgb2YgdGhhdCBvYmplY3QuCi0gKiA8cD4KLSAqIEl0IGlzIHVwIHRvIHRoZSB1c2VyIG9mIHRoaXMgY2xhc3MgdG8gZW5zdXJlIGEgPGVtPmNvbXBsZXRlPC9lbT4gZ3JhcGguCi0gKiA8cD4KLSAqIFRvIHVzZSwgc3VwcGx5Ojx1bD4KLSAqIDxsaT4gZWl0aGVyIHRoZSBpbml0aWFsIG5vZGUgb2YgdGhlIGdyYXBoIG9yIGFuIHtAbGluayBJdGVyYWJsZX0KLSAqIG9mIHRoZSBpbml0aWFsIGNvbGxlY3Rpb24gb2YgZ3JhcGggbm9kZXMKLSAqIDxsaT4gYSB7QGxpbmsgR3JhcGhJdGVyYXRvci5NaXN0ZXJSb2dlcnN9IHRoYXQgdGVsbHMgd2hvIHRoZSBuZWlnaGJvcnMgYXJlCi0gKiBvZiBlYWNoIG5vZGUKLSAqIChhbHRlcm5hdGl2ZWx5LCBzdWJjbGFzcyA8Y29kZT5HcmFwaEl0ZXJhYmxlPC9jb2RlPgotICogYW5kIG92ZXJyaWRlIHRoZSB7QGxpbmsgI25laWdoYm9ycyhPYmplY3QpfSBtZXRob2QpCi0gKiA8L3VsPgotICogVGhlIHtAbGluayBJdGVyYXRvciNyZW1vdmUoKX0gb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuIFRoaXMgYmVoYXZpb3IsIGlmIAotICogZGVzaXJlZCwgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgdXNlciBvZiB0aGlzIGNsYXNzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgR3JhcGhJdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgSXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiByb290czsKLQlwcml2YXRlIGZpbmFsIEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzPEU+IG1pc3RlclJvZ2VyczsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIG5vZGVzIG9mIGEgZ3JhcGggd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3QKLQkgKiBhbmQgYSBkZWZhdWx0IE1yLiBSb2dlcnMgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBpdGVyYWJsZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI25laWdoYm9ycyhPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzfS4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYWJsZShFIHJvb3QpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPEU+KHJvb3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSBncmFwaCAKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdCBhbmQgTXIuIFJvZ2Vycy4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYWJsZShFIHJvb3QsIEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzPEU+IG1pc3RlclJvZ2VycykgewotCQl0aGlzKG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8RT4ocm9vdCksIG1pc3RlclJvZ2Vycyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIG5vZGVzIG9mIGEgZ3JhcGggCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygcm9vdHMKLQkgKiBhbmQgYSBkZWZhdWx0IE1yLiBSb2dlcnMgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBpdGVyYWJsZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI25laWdoYm9ycyhPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzfS4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYWJsZShFLi4uIHJvb3RzKSB7Ci0JCXRoaXMoQXJyYXlzLmFzTGlzdChyb290cykpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBub2RlcyBvZiBhIGdyYXBoIAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCByb290cyBhbmQgTXIuIFJvZ2Vycy4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYWJsZShFW10gcm9vdHMsIEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzPEU+IG1pc3RlclJvZ2VycykgewotCQl0aGlzKEFycmF5cy5hc0xpc3Qocm9vdHMpLCBtaXN0ZXJSb2dlcnMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBub2RlcyBvZiBhIGdyYXBoIAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHJvb3RzCi0JICogYW5kIGEgZGVmYXVsdCBNci4gUm9nZXJzIHRoYXQgY2FsbHMgYmFjayB0byB0aGUgaXRlcmFibGUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNuZWlnaGJvcnMoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2Vyc30uCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmFibGUoSXRlcmFibGU8PyBleHRlbmRzIEU+IHJvb3RzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucm9vdHMgPSByb290czsKLQkJdGhpcy5taXN0ZXJSb2dlcnMgPSB0aGlzLmJ1aWxkRGVmYXVsdE1pc3RlclJvZ2VycygpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBub2RlcyBvZiBhIGdyYXBoIAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCByb290cyBhbmQgTXIuIFJvZ2Vycy4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRT4gcm9vdHMsIEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzPEU+IG1pc3RlclJvZ2VycykgewotCQlzdXBlcigpOwotCQl0aGlzLnJvb3RzID0gcm9vdHM7Ci0JCXRoaXMubWlzdGVyUm9nZXJzID0gbWlzdGVyUm9nZXJzOwotCX0KLQotCXByb3RlY3RlZCBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxFPiBidWlsZERlZmF1bHRNaXN0ZXJSb2dlcnMoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdE1pc3RlclJvZ2VycygpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBHcmFwaEl0ZXJhdG9yPEU+KHRoaXMucm9vdHMsIHRoaXMubWlzdGVyUm9nZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltbWVkaWF0ZSBuZWlnaGJvcnMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzfS4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIEU+IG5laWdoYm9ycyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRSBuZXh0KSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnJvb3RzKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKiBkZWZhdWx0IE1yLiBSb2dlcnMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIERlZmF1bHRNaXN0ZXJSb2dlcnMgaW1wbGVtZW50cyBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxFPiB7Ci0JCXB1YmxpYyBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gbmVpZ2hib3JzKEUgbm9kZSkgewotCQkJcmV0dXJuIEdyYXBoSXRlcmFibGUudGhpcy5uZWlnaGJvcnMobm9kZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9MYXRlcmFsSXRlcmFibGVXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGF0ZXJhbEl0ZXJhYmxlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2I2NTZkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9MYXRlcmFsSXRlcmFibGVXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuTGF0ZXJhbEl0ZXJhdG9yV3JhcHBlcjsKLQotLyoqCi0gKiBXcmFwIGFuIGl0ZXJhYmxlIG9mIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTE8L2NvZGU+LCBjb252ZXJ0aW5nIGl0IGludG8gYW4KLSAqIGl0ZXJhYmxlIG9mIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LiA8ZW0+QXNzdW1lPC9lbT4gdGhlIHdyYXBwZWQKLSAqIGl0ZXJhYmxlIGNvbnRhaW5zIG9ubHkgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT4uIFRoZSByZXN1bHQgaXMgYQotICoge0BsaW5rIENsYXNzQ2FzdEV4Y2VwdGlvbn0gaWYgdGhpcyBhc3N1bXB0aW9uIGlzIGZhbHNlLgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgY29udGFpbmVkIGJ5IHRoZSB3cmFwcGVkIGl0ZXJhYmxlCi0gKiBAcGFyYW0gPEUyPiBvdXRwdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9ycwotICogCi0gKiBAc2VlIExhdGVyYWxJdGVyYXRvcldyYXBwZXIKLSAqIEBzZWUgU3ViSXRlcmFibGVXcmFwcGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXRlcmFsSXRlcmFibGVXcmFwcGVyPEUxLCBFMj4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEUyPgotewotCXByaXZhdGUgZmluYWwgSXRlcmFibGU8RTE+IGl0ZXJhYmxlOwotCi0KLQlwdWJsaWMgTGF0ZXJhbEl0ZXJhYmxlV3JhcHBlcihJdGVyYWJsZTxFMT4gaXRlcmFibGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFMj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgTGF0ZXJhbEl0ZXJhdG9yV3JhcHBlcjxFMSwgRTI+KHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYWJsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0xhdGVyYWxMaXN0SXRlcmFibGVXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGF0ZXJhbExpc3RJdGVyYWJsZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg0NzcyMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGF0ZXJhbExpc3RJdGVyYWJsZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5MYXRlcmFsTGlzdEl0ZXJhdG9yV3JhcHBlcjsKLQotLyoqCi0gKiBXcmFwIGEgbGlzdCBpdGVyYWJsZSBvZiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUxPC9jb2RlPiwgY29udmVydGluZyBpdCBpbnRvCi0gKiBhIGxpc3QgaXRlcmFibGUgb2YgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT4uIDxlbT5Bc3N1bWU8L2VtPiB0aGUKLSAqIHdyYXBwZWQgaXRlcmFibGUgY29udGFpbnMgb25seSBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPi4KLSAqIFRoZSByZXN1bHQgaXMgYSB7QGxpbmsgQ2xhc3NDYXN0RXhjZXB0aW9ufSBpZiB0aGlzIGFzc3VtcHRpb24gaXMgZmFsc2UuCi0gKiAKLSAqIEBwYXJhbSA8RTE+IGlucHV0OiB0aGUgdHlwZSBvZiBlbGVtZW50cyBjb250YWluZWQgYnkgdGhlIHdyYXBwZWQgbGlzdCBpdGVyYWJsZQotICogQHBhcmFtIDxFMj4gb3V0cHV0OiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBsaXN0IGl0ZXJhdG9ycwotICogCi0gKiBAc2VlIExhdGVyYWxMaXN0SXRlcmF0b3JXcmFwcGVyCi0gKiBAc2VlIFN1Ykxpc3RJdGVyYWJsZVdyYXBwZXIKLSAqLwotcHVibGljIGNsYXNzIExhdGVyYWxMaXN0SXRlcmFibGVXcmFwcGVyPEUxLCBFMj4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYWJsZTxFMj4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYWJsZTxFMT4gaXRlcmFibGU7Ci0KLQotCXB1YmxpYyBMYXRlcmFsTGlzdEl0ZXJhYmxlV3JhcHBlcihMaXN0PEUxPiBsaXN0KSB7Ci0JCXRoaXMobmV3IExpc3RMaXN0SXRlcmFibGU8RTE+KGxpc3QpKTsKLQl9Ci0KLQlwdWJsaWMgTGF0ZXJhbExpc3RJdGVyYWJsZVdyYXBwZXIoTGlzdEl0ZXJhYmxlPEUxPiBpdGVyYWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFMj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgTGF0ZXJhbExpc3RJdGVyYXRvcldyYXBwZXI8RTEsIEUyPih0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmFibGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9MaXN0SXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9MaXN0SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFiYWI4Mi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGlzdEl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+TGlzdEl0ZXJhYmxlPC9jb2RlPiBzaW1wbHkgZXh0ZW5kcyB7QGxpbmsgSXRlcmFibGV9Ci0gKiB0byByZXR1cm4gYSB7QGxpbmsgTGlzdEl0ZXJhdG9yfSBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9ycwotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpc3RJdGVyYWJsZTxFPgotCWV4dGVuZHMgSXRlcmFibGU8RT4KLXsKLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG92ZXIgYSBzZXQgb2YgZWxlbWVudHMgb2YgdHlwZSBFLgotCSAqLwotCUxpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0xpc3RMaXN0SXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9MaXN0TGlzdEl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNWE1ZDcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0xpc3RMaXN0SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5MaXN0TGlzdEl0ZXJhYmxlPC9jb2RlPiBhZGFwdHMgYSB7QGxpbmsgTGlzdH0KLSAqIHRvIHRoZSB7QGxpbmsgTGlzdEl0ZXJhYmxlfSBpbnRlcmZhY2UuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3JzCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0TGlzdEl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3Q8RT4gbGlzdDsKLQotCXB1YmxpYyBMaXN0TGlzdEl0ZXJhYmxlKExpc3Q8RT4gbGlzdCkgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3QgPSBsaXN0OwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lSXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9MaXZlQ2xvbmVJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGFhY2NmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9MaXZlQ2xvbmVJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPkxpdmVDbG9uZUl0ZXJhYmxlPC9jb2RlPiByZXR1cm5zIGFuIGl0ZXJhdG9yIG9uIGEgY3VycmVudCBjb3B5IG9mIGEKLSAqIGNvbGxlY3Rpb24sIGFsbG93aW5nIGZvciBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4gQQotICogY29weSBvZiB0aGUgY29sbGVjdGlvbiBpcyBjcmVhdGVkIGV2ZXJ5IHRpbWUge0BsaW5rICNpdGVyYXRvcigpfSBpcwotICogY2FsbGVkLiBBcyBhIHJlc3VsdCwgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb2xsZWN0aW9uIGNhbiBiZSBkaWZmZXJlbnQgd2l0aAotICogZWFjaCBjYWxsIHRvIHtAbGluayAjaXRlcmF0b3IoKX0gKGkuZS4gaXQgaXMgImxpdmUiKS4KLSAqIDxwPgotICogVGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gcGFzc2VkIHRvIHRoZSA8Y29kZT5MaXZlQ2xvbmVJdGVyYWJsZTwvY29kZT4ncwotICogY29uc3RydWN0b3Igc2hvdWxkIGJlIHRocmVhZC1zYWZlIChlLmcuIHtAbGluayBqYXZhLnV0aWwuVmVjdG9yfSk7Ci0gKiBvdGhlcndpc2UgeW91IHJ1biB0aGUgcmlzayBvZiBhIGNvcnJ1cHRlZCBjb2xsZWN0aW9uLgotICogPHA+Ci0gKiBCeSBkZWZhdWx0LCB0aGUgaXRlcmF0b3IgcmV0dXJuZWQgYnkgYSA8Y29kZT5MaXZlQ2xvbmVJdGVyYWJsZTwvY29kZT4gZG9lcyBub3QKLSAqIHN1cHBvcnQgdGhlIHtAbGluayBJdGVyYXRvciNyZW1vdmUoKX0gb3BlcmF0aW9uOyB0aGlzIGlzIGJlY2F1c2UgaXQgZG9lcyBub3QKLSAqIGhhdmUgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLiBCdXQgaWYgdGhlIDxjb2RlPkxpdmVDbG9uZUl0ZXJhYmxlPC9jb2RlPgotICogaXMgc3VwcGxpZWQgd2l0aCBhbiB7QGxpbmsgQ2xvbmVJdGVyYXRvci5SZW1vdmVyfSBpdCB3aWxsIGRlbGVnYXRlIHRoZQotICoge0BsaW5rIEl0ZXJhdG9yI3JlbW92ZSgpfSBvcGVyYXRpb24gdG8gdGhlIDxjb2RlPlJlbW92ZXI8L2NvZGU+LgotICogQWx0ZXJuYXRpdmVseSwgYSBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUgdGhlIGl0ZXJhYmxlJ3Mge0BsaW5rICNyZW1vdmUoT2JqZWN0KX0KLSAqIG1ldGhvZC4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIENsb25lSXRlcmF0b3IKLSAqIEBzZWUgU25hcHNob3RDbG9uZUl0ZXJhYmxlCi0gKiBAc2VlIExpdmVDbG9uZUxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgTGl2ZUNsb25lSXRlcmFibGU8RT4KLQlleHRlbmRzIENsb25lSXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb247Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhICJsaXZlIiBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFRoZSB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlKCl9IG9wZXJhdGlvbiB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQKLQkgKiBieSB0aGUgaXRlcmF0b3IgcmV0dXJuZWQgYnkge0BsaW5rICNpdGVyYXRvcigpfQotCSAqIHVubGVzcyBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGUgaXRlcmFibGUncyB7QGxpbmsgI3JlbW92ZShPYmplY3QpfQotCSAqIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgTGl2ZUNsb25lSXRlcmFibGUoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbikgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhICJsaXZlIiBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFRoZSBzcGVjaWZpZWQgcmVtb3ZlciB3aWxsIGJlIHVzZWQgYnkgYW55IGdlbmVyYXRlZCBpdGVyYXRvcnMgdG8KLQkgKiByZW1vdmUgb2JqZWN0cyBmcm9tIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBMaXZlQ2xvbmVJdGVyYWJsZShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uLCBDbG9uZUl0ZXJhdG9yLlJlbW92ZXI8RT4gcmVtb3ZlcikgewotCQlzdXBlcihyZW1vdmVyKTsKLQkJdGhpcy5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSXRlcmFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8RT4odGhpcy5jb2xsZWN0aW9uLCB0aGlzLnJlbW92ZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY29sbGVjdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lTGlzdEl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lTGlzdEl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMjY1NTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0xpdmVDbG9uZUxpc3RJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+TGl2ZUNsb25lTGlzdEl0ZXJhYmxlPC9jb2RlPiByZXR1cm5zIGEgbGlzdCBpdGVyYXRvciBvbiBhIGN1cnJlbnQKLSAqIGNvcHkgb2YgYSBsaXN0LCBhbGxvd2luZyBmb3IgY29uY3VycmVudCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGxpc3QuIEEKLSAqIGNvcHkgb2YgdGhlIGxpc3QgaXMgY3JlYXRlZCBldmVyeSB0aW1lIHtAbGluayAjaXRlcmF0b3IoKX0gaXMKLSAqIGNhbGxlZC4gQXMgYSByZXN1bHQsIHRoZSBjb250ZW50cyBvZiB0aGUgbGlzdCBjYW4gYmUgZGlmZmVyZW50IHdpdGgKLSAqIGVhY2ggY2FsbCB0byB7QGxpbmsgI2l0ZXJhdG9yKCl9IChpLmUuIGl0IGlzICJsaXZlIikuCi0gKiA8cD4KLSAqIFRoZSBvcmlnaW5hbCBsaXN0IHBhc3NlZCB0byB0aGUgPGNvZGU+TGl2ZUNsb25lTGlzdEl0ZXJhYmxlPC9jb2RlPidzCi0gKiBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdGhyZWFkLXNhZmUgKGUuZy4ge0BsaW5rIGphdmEudXRpbC5WZWN0b3J9KTsKLSAqIG90aGVyd2lzZSB5b3UgcnVuIHRoZSByaXNrIG9mIGEgY29ycnVwdGVkIGxpc3QuCi0gKiA8cD4KLSAqIEJ5IGRlZmF1bHQsIHRoZSBsaXN0IGl0ZXJhdG9yIHJldHVybmVkIGJ5IGEgPGNvZGU+TGl2ZUNsb25lTGlzdEl0ZXJhYmxlPC9jb2RlPgotICogZG9lcyBub3Qgc3VwcG9ydCB0aGUgbW9kaWZ5IG9wZXJhdGlvbnM7IHRoaXMgaXMgYmVjYXVzZSBpdCBkb2VzIG5vdAotICogaGF2ZSBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGxpc3QuIEJ1dCBpZiB0aGUgPGNvZGU+TGl2ZUNsb25lTGlzdEl0ZXJhYmxlPC9jb2RlPgotICogaXMgc3VwcGxpZWQgd2l0aCBhbiB7QGxpbmsgQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcn0gaXQgd2lsbCBkZWxlZ2F0ZSB0aGUKLSAqIG1vZGlmeSBvcGVyYXRpb25zIHRvIHRoZSA8Y29kZT5NdXRhdG9yPC9jb2RlPi4KLSAqIEFsdGVybmF0aXZlbHksIGEgc3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoZSBsaXN0IGl0ZXJhYmxlJ3MgbXV0YXRpb24KLSAqIG1ldGhvZHMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGxpc3QgaXRlcmFibGUncyBsaXN0IGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgQ2xvbmVMaXN0SXRlcmF0b3IKLSAqIEBzZWUgU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZQotICogQHNlZSBMaXZlQ2xvbmVJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPEU+Ci0JZXh0ZW5kcyBDbG9uZUxpc3RJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgTGlzdDw/IGV4dGVuZHMgRT4gbGlzdDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgImxpdmUiIGxpc3QgaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKiBUaGUge0BsaW5rIExpc3RJdGVyYXRvcn0gbXV0YXRpb24gb3BlcmF0aW9ucyB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQKLQkgKiBieSB0aGUgbGlzdCBpdGVyYXRvciByZXR1cm5lZCBieSB7QGxpbmsgI2l0ZXJhdG9yKCl9Ci0JICogdW5sZXNzIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoZSBpdGVyYWJsZSdzIG11dGF0aW9uCi0JICogbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlKExpc3Q8PyBleHRlbmRzIEU+IGxpc3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0ID0gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSAibGl2ZSIgbGlzdCBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqIFRoZSBzcGVjaWZpZWQgbXV0YXRvciB3aWxsIGJlIHVzZWQgYnkgYW55IGdlbmVyYXRlZCBsaXN0IGl0ZXJhdG9ycyB0bwotCSAqIG1vZGlmeSB0aGUgb3JpZ2luYWwgbGlzdC4KLQkgKi8KLQlwdWJsaWMgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlKExpc3Q8PyBleHRlbmRzIEU+IGxpc3QsIENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3I8RT4gbXV0YXRvcikgewotCQlzdXBlcihtdXRhdG9yKTsKLQkJdGhpcy5saXN0ID0gbGlzdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdEl0ZXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8RT4odGhpcy5saXN0LCB0aGlzLm11dGF0b3IpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubGlzdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUGVla2FibGVJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1BlZWthYmxlSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzODFlZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUGVla2FibGVJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUGVla2FibGVJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlBlZWthYmxlSXRlcmFibGU8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIEl0ZXJhYmxlfQotICogYW5kIHJldHVybnMgYW4ge0BsaW5rIFBlZWthYmxlSXRlcmF0b3J9IHRoYXQgYWxsb3dzIGEKLSAqIHtAbGluayBQZWVrYWJsZUl0ZXJhdG9yI3BlZWsoKSBwZWVrfSBhdCB0aGUgbmV4dCBlbGVtZW50IHRvIGJlIAotICogcmV0dXJuZWQgYnkge0BsaW5rIEl0ZXJhdG9yI25leHQoKX0uCi0gKiA8cD4KLSAqIE9uZSwgcG9zc2libHkgdW5kZXNpcmFibGUsIHNpZGUtZWZmZWN0IG9mIHVzaW5nIHRoaXMgaXRlcmF0b3IgaXMgdGhhdAotICogdGhlIG5lc3RlZCBpdGVyYXRvcidzIDxjb2RlPm5leHQoKTwvY29kZT4gbWV0aG9kIHdpbGwgYmUgaW52b2tlZAotICogPGVtPmJlZm9yZTwvZW0+IHRoZSBwZWVrYWJsZSBpdGVyYXRvcidzIHtAbGluayBJdGVyYXRvciNuZXh0KCl9Ci0gKiBtZXRob2QgaXMgaW52b2tlZC4gVGhpcyBpcyBiZWNhdXNlIHRoZSAibmV4dCIgZWxlbWVudCBtdXN0IGJlCi0gKiBwcmUtbG9hZGVkIGZvciB0aGUge0BsaW5rIFBlZWthYmxlSXRlcmF0b3IjcGVlaygpfSBtZXRob2QuCi0gKiBUaGlzIGFsc28gcHJldmVudHMgYSBwZWVrYWJsZSBpdGVyYXRvciBmcm9tIHN1cHBvcnRpbmcgdGhlIG9wdGlvbmFsCi0gKiB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlKCl9IG1ldGhvZC4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIFBlZWthYmxlSXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFBlZWthYmxlSXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGU7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwZWVrYWJsZSBpdGVyYWJsZSB0aGF0IHdyYXBzIHRoZSBzcGVjaWZpZWQKLQkgKiBpdGVyYWJsZS4KLQkgKi8KLQlwdWJsaWMgUGVla2FibGVJdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlOwotCX0KLQotCXB1YmxpYyBQZWVrYWJsZUl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFBlZWthYmxlSXRlcmF0b3I8RT4odGhpcy5pdGVyYWJsZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYWJsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUXVldWVJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1F1ZXVlSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyYWE2ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUXVldWVJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlF1ZXVlSXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5RdWV1ZUl0ZXJhYmxlPC9jb2RlPiBwcm92aWRlcyBhbiB7QGxpbmsgSXRlcmFibGV9Ci0gKiBmb3IgYSB7QGxpbmsgUXVldWV9IG9mIG9iamVjdHMgb2YgdHlwZSA8Y29kZT5FPC9jb2RlPi4gVGhlIHF1ZXVlJ3MgZWxlbWVudHMKLSAqIGFyZSB7QGxpbmsgUXVldWUjZGVxdWV1ZSgpIGRlcXVldWV9ZCIgYXMgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IgcmV0dXJucwotICogdGhlbSB3aXRoIGNhbGxzIHRvIHtAbGluayBJdGVyYXRvciNuZXh0KCl9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgUXVldWUKLSAqIEBzZWUgUXVldWVJdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgUXVldWVJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgSXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIFF1ZXVlPEU+IHF1ZXVlOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHF1ZXVlLgotCSAqLwotCXB1YmxpYyBRdWV1ZUl0ZXJhYmxlKFF1ZXVlPEU+IHF1ZXVlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucXVldWUgPSBxdWV1ZTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUXVldWVJdGVyYXRvcjxFPih0aGlzLnF1ZXVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnF1ZXVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMjgxMGYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZTwvY29kZT4gd3JhcHMgYSB7QGxpbmsgTGlzdEl0ZXJhYmxlfQotICogb2Yge0BsaW5rIExpc3RJdGVyYWJsZX1zIGFuZCBtYWtlcyB0aGVtIGFwcGVhciB0byBiZSBhIHNpbmdsZQotICogcmVhZC1vbmx5IHtAbGluayBMaXN0SXRlcmFibGV9LiBBIHJlYWQtb25seSBjb21wb3NpdGUgbGlzdAotICogaXRlcmFibGUgaXMgbW9yZSBmbGV4aWJsZSB0aGFuIGEgbm9ybWFsIGNvbXBvc2l0ZSBsaXN0IGl0ZXJhYmxlIHdoZW4gaXQKLSAqIGNvbWVzIHRvIHRoZSBlbGVtZW50IHR5cGVzIG9mIHRoZSBuZXN0ZWQgbGlzdCBpdGVyYWJsZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGxpc3QgaXRlcmFibGUncyBsaXN0IGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IKLSAqIEBzZWUgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmFibGU8PyBleHRlbmRzIExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4+IGl0ZXJhYmxlczsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBsaXN0IGl0ZXJhYmxlcy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGUoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+PiBpdGVyYWJsZXMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYWJsZXMgPSBpdGVyYWJsZXM7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBpdGVyYWJsZS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGUoRSBvYmplY3QsIExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTxFPihvYmplY3QpLCBpdGVyYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0IGl0ZXJhYmxlLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZShMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBFIG9iamVjdCkgewotCQl0aGlzKGl0ZXJhYmxlLCBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTxFPihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IGl0ZXJhYmxlcy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGUoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPi4uLiBpdGVyYWJsZXMpIHsKLQkJdGhpcyhuZXcgQXJyYXlMaXN0SXRlcmFibGU8TGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPj4oaXRlcmFibGVzKSk7Ci0JfQotCi0JLyoqCi0JICogY29tYmluZWQgbGlzdCBpdGVyYXRvcnMKLQkgKi8KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPEU+KHRoaXMuaXRlcmF0b3JzKCkpOwotCX0KLQotCS8qKgotCSAqIGxpc3QgaXRlcmF0b3Igb2YgbGlzdCBpdGVyYXRvcnMKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8TGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4odGhpcy5pdGVyYWJsZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiB0cmFuc2Zvcm0oTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuaXRlcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBsaXN0IGl0ZXJhdG9yIG9mIGxpc3QgaXRlcmFibGVzCi0JICovCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPj4gaXRlcmFibGVzKCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYWJsZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhYmxlcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUmVhZE9ubHlJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ4MzkyOC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUmVhZE9ubHlJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlJlYWRPbmx5SXRlcmFibGU8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIEl0ZXJhYmxlfQotICogYW5kIHJldHVybnMgYSByZWFkLW9ubHkge0BsaW5rIEl0ZXJhdG9yfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIFJlYWRPbmx5SXRlcmF0b3IKLSAqIEBzZWUgUmVhZE9ubHlMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5SXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSB0aGUgcmV0dXJucyBhIHJlYWQtb25seSBpdGVyYXRvciBvbiB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUl0ZXJhYmxlKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8RT4odGhpcy5pdGVyYWJsZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYWJsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUmVhZE9ubHlMaXN0SXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUxpc3RJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWZkZTQxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUxpc3RJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+UmVhZE9ubHlMaXN0SXRlcmFibGU8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIExpc3RJdGVyYWJsZX0KLSAqIGFuZCByZXR1cm5zIGEgcmVhZC1vbmx5IHtAbGluayBMaXN0SXRlcmF0b3J9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBsaXN0IGl0ZXJhYmxlJ3MgbGlzdCBpdGVyYXRvcgotICogCi0gKiBAc2VlIFJlYWRPbmx5TGlzdEl0ZXJhdG9yCi0gKiBAc2VlIFJlYWRPbmx5SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5TGlzdEl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4gbGlzdEl0ZXJhYmxlOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHRoZSByZXR1cm5zIGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBsaXN0IGl0ZXJhYmxlLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUxpc3RJdGVyYWJsZShMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdEl0ZXJhYmxlID0gaXRlcmFibGU7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPih0aGlzLmxpc3RJdGVyYWJsZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SXRlcmFibGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1NpbmdsZUVsZW1lbnRJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1NpbmdsZUVsZW1lbnRJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGVhM2E3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TaW5nbGVFbGVtZW50SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlNpbmdsZUVsZW1lbnRJdGVyYWJsZTwvY29kZT4gcmV0dXJucyBhbiB7QGxpbmsgSXRlcmF0b3J9Ci0gKiB0aGF0IGhvbGRzIGEgc2luZ2xlIGVsZW1lbnQKLSAqIGFuZCByZXR1cm5zIGl0IHdpdGggdGhlIGZpcnN0IGNhbGwgdG8ge0BsaW5rIEl0ZXJhdG9yI25leHQoKX0sIGF0Ci0gKiB3aGljaCBwb2ludCBpdCB3aWxsIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gYW55IHN1YnNlcXVlbnQKLSAqIGNhbGwgdG8ge0BsaW5rIEl0ZXJhdG9yI2hhc05leHQoKX0uCi0gKiA8cD4KLSAqIEEgPGNvZGU+U2luZ2xlRWxlbWVudEl0ZXJhYmxlPC9jb2RlPiBpcyBlcXVpdmFsZW50IHRvIHRoZQotICoge0BsaW5rIEl0ZXJhYmxlfSByZXR1cm5lZCBieToKLSAqIAl7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI3NpbmdsZXRvbihPYmplY3QpfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIFNpbmdsZUVsZW1lbnRJdGVyYXRvcgotICogQHNlZSBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGVFbGVtZW50SXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBFIGVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgdGhhdCBjb250YWlucyBvbmx5IHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU2luZ2xlRWxlbWVudEl0ZXJhYmxlKEUgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4odGhpcy5lbGVtZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZTIxMDAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+U2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTwvY29kZT4gcmV0dXJucyBhIHtAbGluayBMaXN0SXRlcmF0b3J9Ci0gKiB0aGF0IGhvbGRzIGEgc2luZ2xlIGVsZW1lbnQKLSAqIGFuZCByZXR1cm5zIGl0IHdpdGggdGhlIGZpcnN0IGNhbGwgdG8ge0BsaW5rIExpc3RJdGVyYXRvciNuZXh0KCl9LCBhdAotICogd2hpY2ggcG9pbnQgaXQgd2lsbCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGFueSBzdWJzZXF1ZW50Ci0gKiBjYWxsIHRvIHtAbGluayBMaXN0SXRlcmF0b3IjaGFzTmV4dCgpfS4gTGlrZXdpc2UsIGl0IHdpbGwgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotICogdG8gYSBjYWxsIHRvIHtAbGluayBMaXN0SXRlcmF0b3IjaGFzUHJldmlvdXMoKX0gdW50aWwgYSBjYWxsIHRvIHtAbGluayBMaXN0SXRlcmF0b3IjbmV4dCgpfSwKLSAqIGF0IHdoaWNoIHBvaW50IGEgY2FsbCB0byB7QGxpbmsgTGlzdEl0ZXJhdG9yI3ByZXZpb3VzKCl9IHdpbGwgcmV0dXJuIHRoZQotICogc2luZ2xlIGVsZW1lbnQuCi0gKiA8cD4KLSAqIEEgPGNvZGU+U2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTwvY29kZT4gaXMgZXF1aXZhbGVudCB0byB0aGUKLSAqIHtAbGluayBJdGVyYWJsZX0gcmV0dXJuZWQgYnk6Ci0gKiAJe0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzaW5nbGV0b25MaXN0KE9iamVjdCl9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBsaXN0IGl0ZXJhYmxlJ3MgbGlzdCBpdGVyYXRvcgotICogCi0gKiBAc2VlIFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IKLSAqIEBzZWUgU2luZ2xlRWxlbWVudEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEUgZWxlbWVudDsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgdGhhdCBjb250YWlucyBvbmx5IHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZShFIGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4odGhpcy5lbGVtZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmJlZWJlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TbmFwc2hvdENsb25lSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5TbmFwc2hvdENsb25lSXRlcmFibGU8L2NvZGU+IHJldHVybnMgYW4gaXRlcmF0b3Igb24gYSAic25hcHNob3QiIG9mIGEKLSAqIGNvbGxlY3Rpb24sIGFsbG93aW5nIGZvciBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4gQQotICogY29weSBvZiB0aGUgY29sbGVjdGlvbiBpcyBjcmVhdGVkIHdoZW4gdGhlIGl0ZXJhYmxlIGlzIGNvbnN0cnVjdGVkLgotICogQXMgYSByZXN1bHQsIHRoZSBjb250ZW50cyBvZiB0aGUgY29sbGVjdGlvbiB3aWxsIGJlIHRoZSBzYW1lIHdpdGgKLSAqIGV2ZXJ5IGNhbGwgdG8ge0BsaW5rICNpdGVyYXRvcigpfS4KLSAqIDxwPgotICogVGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gcGFzc2VkIHRvIHRoZSA8Y29kZT5TbmFwc2hvdENsb25lSXRlcmFibGU8L2NvZGU+J3MKLSAqIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB0aHJlYWQtc2FmZSAoZS5nLiB7QGxpbmsgamF2YS51dGlsLlZlY3Rvcn0pOwotICogb3RoZXJ3aXNlIHlvdSBydW4gdGhlIHJpc2sgb2YgYSBjb3JydXB0ZWQgY29sbGVjdGlvbi4KLSAqIDxwPgotICogQnkgZGVmYXVsdCwgdGhlIGl0ZXJhdG9yIHJldHVybmVkIGJ5IGEgPGNvZGU+U25hcHNob3RDbG9uZUl0ZXJhYmxlPC9jb2RlPiBkb2VzIG5vdAotICogc3VwcG9ydCB0aGUge0BsaW5rIEl0ZXJhdG9yI3JlbW92ZSgpfSBvcGVyYXRpb247IHRoaXMgaXMgYmVjYXVzZSBpdCBkb2VzIG5vdAotICogaGF2ZSBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uIEJ1dCBpZiB0aGUgPGNvZGU+U25hcHNob3RDbG9uZUl0ZXJhYmxlPC9jb2RlPgotICogaXMgc3VwcGxpZWQgd2l0aCBhIHtAbGluayBDbG9uZUl0ZXJhdG9yLlJlbW92ZXJ9IGl0IHdpbGwgZGVsZWdhdGUgdGhlCi0gKiB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlKCl9IG9wZXJhdGlvbiB0byB0aGUgPGNvZGU+UmVtb3ZlcjwvY29kZT4uCi0gKiBBbHRlcm5hdGl2ZWx5LCBhIHN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGUgaXRlcmFibGUncyB7QGxpbmsgI3JlbW92ZShPYmplY3QpfQotICogbWV0aG9kLgotICogPHA+Ci0gKiBUaGlzIGl0ZXJhYmxlIGlzIHVzZWZ1bCBmb3IgbXVsdGlwbGUgcGFzc2VzIG92ZXIgYSBjb2xsZWN0aW9uIHRoYXQgc2hvdWxkIG5vdAotICogYmUgY2hhbmdlZCAoZS5nLiBieSBhbm90aGVyIHRocmVhZCkgYmV0d2VlbiBwYXNzZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBDbG9uZUl0ZXJhdG9yCi0gKiBAc2VlIExpdmVDbG9uZUl0ZXJhYmxlCi0gKiBAc2VlIFNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFNuYXBzaG90Q2xvbmVJdGVyYWJsZTxFPgotCWV4dGVuZHMgQ2xvbmVJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gYXJyYXk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhICJzbmFwc2hvdCIgaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhlIHtAbGluayBJdGVyYXRvciNyZW1vdmUoKX0gb3BlcmF0aW9uIHdpbGwgbm90IGJlIHN1cHBvcnRlZAotCSAqIGJ5IHRoZSBpdGVyYXRvciByZXR1cm5lZCBieSB7QGxpbmsgI2l0ZXJhdG9yKCl9Ci0JICogdW5sZXNzIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoZSBpdGVyYWJsZSdzIHtAbGluayAjcmVtb3ZlKE9iamVjdCl9Ci0JICogbWV0aG9kLgotCSAqLwotCXB1YmxpYyBTbmFwc2hvdENsb25lSXRlcmFibGUoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYXJyYXkgPSBBcnJheVRvb2xzLmFycmF5KGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSAic25hcHNob3QiIGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgcmVtb3ZlciB3aWxsIGJlIHVzZWQgYnkgYW55IGdlbmVyYXRlZCBpdGVyYXRvcnMgdG8KLQkgKiByZW1vdmUgb2JqZWN0cyBmcm9tIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBTbmFwc2hvdENsb25lSXRlcmFibGUoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBDbG9uZUl0ZXJhdG9yLlJlbW92ZXI8RT4gcmVtb3ZlcikgewotCQlzdXBlcihyZW1vdmVyKTsKLQkJdGhpcy5hcnJheSA9IEFycmF5VG9vbHMuYXJyYXkoaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhICJzbmFwc2hvdCIgaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBUaGUge0BsaW5rIEl0ZXJhdG9yI3JlbW92ZSgpfSBvcGVyYXRpb24gd2lsbCBub3QgYmUgc3VwcG9ydGVkCi0JICogYnkgdGhlIGl0ZXJhdG9yIHJldHVybmVkIGJ5IHtAbGluayAjaXRlcmF0b3IoKX0KLQkgKiB1bmxlc3MgYSBzdWJjbGFzcyBvdmVycmlkZXMgdGhlIGl0ZXJhYmxlJ3Mge0BsaW5rICNyZW1vdmUoT2JqZWN0KX0KLQkgKiBtZXRob2QuCi0JICovCi0JcHVibGljIFNuYXBzaG90Q2xvbmVJdGVyYWJsZShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYXJyYXkgPSBjb2xsZWN0aW9uLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSAic25hcHNob3QiIGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogVGhlIHNwZWNpZmllZCByZW1vdmVyIHdpbGwgYmUgdXNlZCBieSBhbnkgZ2VuZXJhdGVkIGl0ZXJhdG9ycyB0bwotCSAqIHJlbW92ZSBvYmplY3RzIGZyb20gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIFNuYXBzaG90Q2xvbmVJdGVyYWJsZShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uLCBDbG9uZUl0ZXJhdG9yLlJlbW92ZXI8RT4gcmVtb3ZlcikgewotCQlzdXBlcihyZW1vdmVyKTsKLQkJdGhpcy5hcnJheSA9IGNvbGxlY3Rpb24udG9BcnJheSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJdGVyYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxDbG9uZUl0ZXJhdG9yPEU+KHRoaXMucmVtb3ZlciwgdGhpcy5hcnJheSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgQXJyYXlzLnRvU3RyaW5nKHRoaXMuYXJyYXkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmUgaXRlcmF0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogcHJvdmlkZSBhY2Nlc3MgdG8gImludGVybmFsIiBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTG9jYWxDbG9uZUl0ZXJhdG9yPEU+IGV4dGVuZHMgQ2xvbmVJdGVyYXRvcjxFPiB7Ci0JCXByb3RlY3RlZCBMb2NhbENsb25lSXRlcmF0b3IoUmVtb3ZlcjxFPiByZW1vdmVyLCBPYmplY3RbXSBhcnJheSkgewotCQkJc3VwZXIocmVtb3ZlciwgYXJyYXkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI0MmFiNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+U25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZTwvY29kZT4gcmV0dXJucyBhIGxpc3QgaXRlcmF0b3Igb24gYQotICogInNuYXBzaG90IiBvZiBhIGxpc3QsIGFsbG93aW5nIGZvciBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgbGlzdC4KLSAqIEEgY29weSBvZiB0aGUgbGlzdCBpcyBjcmVhdGVkIHdoZW4gdGhlIGxpc3QgaXRlcmFibGUgaXMgY29uc3RydWN0ZWQuCi0gKiBBcyBhIHJlc3VsdCwgdGhlIGNvbnRlbnRzIG9mIHRoZSBsaXN0IHdpbGwgYmUgdGhlIHNhbWUgd2l0aAotICogZXZlcnkgY2FsbCB0byB7QGxpbmsgI2l0ZXJhdG9yKCl9LCBldmVuIGlmIHRoZSBvcmlnaW5hbCBsaXN0IGlzIG1vZGlmaWVkIHZpYQotICogdGhlIGxpc3QgaXRlcmF0b3IncyBtdXRhdGlvbiBtZXRob2RzLgotICogPHA+Ci0gKiBUaGUgb3JpZ2luYWwgbGlzdCBwYXNzZWQgdG8gdGhlIDxjb2RlPlNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGU8L2NvZGU+J3MKLSAqIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB0aHJlYWQtc2FmZSAoZS5nLiB7QGxpbmsgamF2YS51dGlsLlZlY3Rvcn0pOwotICogb3RoZXJ3aXNlIHlvdSBydW4gdGhlIHJpc2sgb2YgYSBjb3JydXB0ZWQgbGlzdC4KLSAqIDxwPgotICogQnkgZGVmYXVsdCwgdGhlIGxpc3QgaXRlcmF0b3IgcmV0dXJuZWQgYnkgYSA8Y29kZT5TbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlPC9jb2RlPiBkb2VzIG5vdAotICogc3VwcG9ydCB0aGUge0BsaW5rIExpc3RJdGVyYXRvcn0gbXV0YXRpb24gb3BlcmF0aW9uczsgdGhpcyBpcyBiZWNhdXNlIGl0IGRvZXMgbm90Ci0gKiBoYXZlIGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgbGlzdC4gQnV0IGlmIHRoZSA8Y29kZT5TbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlPC9jb2RlPgotICogaXMgc3VwcGxpZWQgd2l0aCBhIHtAbGluayBDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yfSBpdCB3aWxsIGRlbGVnYXRlIHRoZQotICoge0BsaW5rIExpc3RJdGVyYXRvcn0gbXV0YXRpb24gb3BlcmF0aW9ucyB0byB0aGUgPGNvZGU+TXV0YXRvcjwvY29kZT4uCi0gKiBBbHRlcm5hdGl2ZWx5LCBhIHN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGUgbGlzdCBpdGVyYWJsZSdzIG11dGF0aW9uCi0gKiBtZXRob2RzLgotICogPHA+Ci0gKiBUaGlzIGxpc3QgaXRlcmFibGUgaXMgdXNlZnVsIGZvciBtdWx0aXBsZSBwYXNzZXMgb3ZlciBhIGxpc3QgdGhhdCBzaG91bGQgbm90Ci0gKiBiZSBjaGFuZ2VkIChlLmcuIGJ5IGFub3RoZXIgdGhyZWFkKSBiZXR3ZWVuIHBhc3Nlcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgbGlzdCBpdGVyYWJsZSdzIGxpc3QgaXRlcmF0b3IKLSAqIAotICogQHNlZSBDbG9uZUxpc3RJdGVyYXRvcgotICogQHNlZSBMaXZlQ2xvbmVMaXN0SXRlcmFibGUKLSAqIEBzZWUgU25hcHNob3RDbG9uZUl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBTbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlPEU+Ci0JZXh0ZW5kcyBDbG9uZUxpc3RJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gYXJyYXk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhICJzbmFwc2hvdCIgbGlzdCBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqIFRoZSB7QGxpbmsgTGlzdEl0ZXJhdG9yfSBtb2RpZnkgb3BlcmF0aW9ucyB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQKLQkgKiBieSB0aGUgbGlzdCBpdGVyYXRvciByZXR1cm5lZCBieSB7QGxpbmsgI2l0ZXJhdG9yKCl9Ci0JICogdW5sZXNzIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoZSBsaXN0IGl0ZXJhYmxlJ3MgbW9kaWZ5Ci0JICogbWV0aG9kLgotCSAqLwotCXB1YmxpYyBTbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlKExpc3Q8PyBleHRlbmRzIEU+IGxpc3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hcnJheSA9IGxpc3QudG9BcnJheSgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhICJzbmFwc2hvdCIgbGlzdCBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqIFRoZSBzcGVjaWZpZWQgbXV0YXRvciB3aWxsIGJlIHVzZWQgYnkgYW55IGdlbmVyYXRlZCBsaXN0IGl0ZXJhdG9ycyB0bwotCSAqIG1vZGlmeSB0aGUgb3JpZ2luYWwgbGlzdC4KLQkgKi8KLQlwdWJsaWMgU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZShMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0LCBDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yPEU+IG11dGF0b3IpIHsKLQkJc3VwZXIobXV0YXRvcik7Ci0JCXRoaXMuYXJyYXkgPSBsaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdEl0ZXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxDbG9uZUxpc3RJdGVyYXRvcjxFPih0aGlzLm11dGF0b3IsIHRoaXMuYXJyYXkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIEFycmF5cy50b1N0cmluZyh0aGlzLmFycmF5KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25lIGl0ZXJhdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIHByb3ZpZGUgYWNjZXNzIHRvICJpbnRlcm5hbCIgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIExvY2FsQ2xvbmVMaXN0SXRlcmF0b3I8RT4gZXh0ZW5kcyBDbG9uZUxpc3RJdGVyYXRvcjxFPiB7Ci0JCXByb3RlY3RlZCBMb2NhbENsb25lTGlzdEl0ZXJhdG9yKE11dGF0b3I8RT4gbXV0YXRvciwgT2JqZWN0W10gYXJyYXkpIHsKLQkJCXN1cGVyKG11dGF0b3IsIGFycmF5KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1N0YWNrSXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdGFja0l0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMWZlM2YuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1N0YWNrSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TdGFja0l0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+U3RhY2tJdGVyYWJsZTwvY29kZT4gcHJvdmlkZXMgYW4ge0BsaW5rIEl0ZXJhYmxlfQotICogZm9yIGEge0BsaW5rIFN0YWNrfSBvZiBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4uIFRoZSBzdGFjaydzIGVsZW1lbnRzCi0gKiBhcmUge0BsaW5rIFN0YWNrI3BvcCgpICJwb3BwZWQifSBhcyB0aGUgaXRlcmFibGUncyBpdGVyYXRvciByZXR1cm5zCi0gKiB0aGVtIHdpdGggY2FsbHMgdG8ge0BsaW5rIEl0ZXJhdG9yI25leHQoKX0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBTdGFjawotICogQHNlZSBTdGFja0l0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGFja0l0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgU3RhY2s8RT4gc3RhY2s7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgc3RhY2suCi0JICovCi0JcHVibGljIFN0YWNrSXRlcmFibGUoU3RhY2s8RT4gc3RhY2spIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zdGFjayA9IHN0YWNrOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTdGFja0l0ZXJhdG9yPEU+KHRoaXMuc3RhY2spOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuc3RhY2spOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1N1Ykl0ZXJhYmxlV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1N1Ykl0ZXJhYmxlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2Y1Y2IwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdWJJdGVyYWJsZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlN1Ykl0ZXJhdG9yV3JhcHBlcjsKLQotLyoqCi0gKiBXcmFwIGFuIGl0ZXJhYmxlIG9mIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTE8L2NvZGU+LCBjb252ZXJ0aW5nIGl0IGludG8gYW4KLSAqIGl0ZXJhYmxlIG9mIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LiA8ZW0+QXNzdW1lPC9lbT4gdGhlIHdyYXBwZWQKLSAqIGl0ZXJhYmxlIGNvbnRhaW5zIG9ubHkgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT4uIFRoZSByZXN1bHQgaXMgYQotICoge0BsaW5rIENsYXNzQ2FzdEV4Y2VwdGlvbn0gaWYgdGhpcyBhc3N1bXB0aW9uIGlzIGZhbHNlLgotICogPHA+Ci0gKiBUaGlzIGlzIGxpa2UgYSB7QGxpbmsgTGF0ZXJhbEl0ZXJhYmxlV3JhcHBlcn0gYnV0IHdpdGggbW9yZSByZXN0cmljdGl2ZSB0eXBlCi0gKiBwYXJhbWV0ZXJzLgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgY29udGFpbmVkIGJ5IHRoZSB3cmFwcGVkIGl0ZXJhYmxlCi0gKiBAcGFyYW0gPEUyPiBvdXRwdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9ycwotICogCi0gKiBAc2VlIFN1Ykl0ZXJhdG9yV3JhcHBlcgotICovCi1wdWJsaWMgY2xhc3MgU3ViSXRlcmFibGVXcmFwcGVyPEUxLCBFMiBleHRlbmRzIEUxPgotCWltcGxlbWVudHMgSXRlcmFibGU8RTI+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTxFMT4gaXRlcmFibGU7Ci0KLQotCXB1YmxpYyBTdWJJdGVyYWJsZVdyYXBwZXIoSXRlcmFibGU8RTE+IGl0ZXJhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSBpdGVyYWJsZTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RTI+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFN1Ykl0ZXJhdG9yV3JhcHBlcjxFMSwgRTI+KHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYWJsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1N1Ykxpc3RJdGVyYWJsZVdyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdWJMaXN0SXRlcmFibGVXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NjVkMWIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1N1Ykxpc3RJdGVyYWJsZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU3ViTGlzdEl0ZXJhdG9yV3JhcHBlcjsKLQotLyoqCi0gKiBXcmFwIGEgbGlzdCBpdGVyYWJsZSBvZiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUxPC9jb2RlPiwgY29udmVydGluZyBpdCBpbnRvCi0gKiBhIGxpc3QgaXRlcmFibGUgb2YgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT4uIDxlbT5Bc3N1bWU8L2VtPiB0aGUKLSAqIHdyYXBwZWQgaXRlcmFibGUgY29udGFpbnMgb25seSBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPi4KLSAqIFRoZSByZXN1bHQgaXMgYSB7QGxpbmsgQ2xhc3NDYXN0RXhjZXB0aW9ufSBpZiB0aGlzIGFzc3VtcHRpb24gaXMgZmFsc2UuCi0gKiA8cD4KLSAqIFRoaXMgaXMgbGlrZSBhIHtAbGluayBMYXRlcmFsTGlzdEl0ZXJhYmxlV3JhcHBlcn0gYnV0IHdpdGggbW9yZSByZXN0cmljdGl2ZSB0eXBlCi0gKiBwYXJhbWV0ZXJzLgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgY29udGFpbmVkIGJ5IHRoZSB3cmFwcGVkIGxpc3QgaXRlcmFibGUKLSAqIEBwYXJhbSA8RTI+IG91dHB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgbGlzdCBpdGVyYXRvcnMKLSAqIAotICogQHNlZSBTdWJMaXN0SXRlcmF0b3JXcmFwcGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJMaXN0SXRlcmFibGVXcmFwcGVyPEUxLCBFMiBleHRlbmRzIEUxPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhYmxlPEUyPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhYmxlPEUxPiBpdGVyYWJsZTsKLQotCi0JcHVibGljIFN1Ykxpc3RJdGVyYWJsZVdyYXBwZXIoTGlzdDxFMT4gbGlzdCkgewotCQl0aGlzKG5ldyBMaXN0TGlzdEl0ZXJhYmxlPEUxPihsaXN0KSk7Ci0JfQotCi0JcHVibGljIFN1Ykxpc3RJdGVyYWJsZVdyYXBwZXIoTGlzdEl0ZXJhYmxlPEUxPiBpdGVyYWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFMj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgU3ViTGlzdEl0ZXJhdG9yV3JhcHBlcjxFMSwgRTI+KHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYWJsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1N1cGVySXRlcmFibGVXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU3VwZXJJdGVyYWJsZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIzZTgzZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU3VwZXJJdGVyYWJsZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBXcmFwIGFuIGl0ZXJhYmxlIG9mIGVsZW1lbnRzIG9mIGFueSBzdWItdHlwZSBvZiA8Y29kZT5FPC9jb2RlPiwgY29udmVydGluZyBpdCBpbnRvIGFuCi0gKiBpdGVyYWJsZSBvZiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LiBUaGlzIHNob3VsZG4ndCBiZSBhIHByb2JsZW0gc2luY2UgdGhlcmUKLSAqIGlzIG5vIHdheSB0byBhZGQgaW52YWxpZCBlbGVtZW50cyB0byB0aGUgaXRlcmFibGUuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3JzCi0gKi8KLXB1YmxpYyBjbGFzcyBTdXBlckl0ZXJhYmxlV3JhcHBlcjxFPgotCWltcGxlbWVudHMgSXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlOwotCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgU3VwZXJJdGVyYWJsZVdyYXBwZXIoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIHRoaXMgc2hvdWxkIGJlIGEgc2FmZSBjYXN0IC0gdGhlIGl0ZXJhdG9yIHdpbGwgb25seSBldmVyCi0JCS8vIHJldHVybiBFIChvciBhIHN1Yi10eXBlKSBmcm9tICNuZXh0KCkKLQkJdGhpcy5pdGVyYWJsZSA9IChJdGVyYWJsZTxFPikgaXRlcmFibGU7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmFibGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdXBlckxpc3RJdGVyYWJsZVdyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdXBlckxpc3RJdGVyYWJsZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FiZTQzMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU3VwZXJMaXN0SXRlcmF0b3JXcmFwcGVyOwotCi0vKioKLSAqIFdyYXAgYSBsaXN0IGl0ZXJhYmxlIG9mIGVsZW1lbnRzIG9mIGFueSBzdWItdHlwZSBvZiA8Y29kZT5FPC9jb2RlPiwKLSAqIGNvbnZlcnRpbmcgaXQgaW50byBhIDxlbT5ub24td3JpdGFibGU8L2VtPiBsaXN0IGl0ZXJhYmxlIG9mIGVsZW1lbnRzCi0gKiBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LgotICogVGhpcyBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtIHNpbmNlIHRoZSByZXN1bHRpbmcgbGlzdCBpdGVyYWJsZSdzIGxpc3QKLSAqIGl0ZXJhdG9yIGRpc2FibGVzIHRoZSBtZXRob2RzIHRoYXQgd291bGQgcHV0IGludmFsaWQgZWxlbWVudHMgaW4gdGhlIGxpc3QKLSAqIGl0ZXJhdG9yJ3MgYmFja2luZyBsaXN0IChpLmUuIHtAbGluayBTdXBlckxpc3RJdGVyYXRvcldyYXBwZXIjc2V0KE9iamVjdCl9Ci0gKiBhbmQge0BsaW5rIFN1cGVyTGlzdEl0ZXJhdG9yV3JhcHBlciNhZGQoT2JqZWN0KX0pLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9ycwotICogCi0gKiBAc2VlIFN1cGVyTGlzdEl0ZXJhdG9yV3JhcHBlcgotICovCi1wdWJsaWMgY2xhc3MgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGU7Ci0KLQotCXB1YmxpYyA8VCBleHRlbmRzIEU+IFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcihMaXN0PFQ+IGxpc3QpIHsKLQkJdGhpcyhuZXcgTGlzdExpc3RJdGVyYWJsZTxUPihsaXN0KSk7Ci0JfQotCi0JcHVibGljIFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcihMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSBpdGVyYWJsZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFN1cGVyTGlzdEl0ZXJhdG9yV3JhcHBlcjxFPih0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmFibGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25JdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjRjMTVkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmFibGU8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIEl0ZXJhYmxlfQotICogYW5kIHRyYW5zZm9ybXMgaXRzIGVsZW1lbnRzIGZvciBjbGllbnQgY29uc3VtcHRpb24uIFRvIHVzZSwgc3VwcGx5IGEgCi0gKiB7QGxpbmsgVHJhbnNmb3JtZXJ9IG9yIHN1YmNsYXNzIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmFibGU8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZC4KLSAqIE9iamVjdHMgb2YgdHlwZSA8Y29kZT5FMTwvY29kZT4gYXJlIHRyYW5zZm9ybWVkIGludG8gb2JqZWN0cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPjsKLSAqIGkuZS4gdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IgcmV0dXJucyBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgdG8gYmUgdHJhbnNmb3JtZWQKLSAqIEBwYXJhbSA8RTI+IG91dHB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yCi0gKiBAc2VlIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEUxLCBFMj4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEUyPgotewotCXByaXZhdGUgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIEUxPiBpdGVyYWJsZTsKLQlwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYWJsZQotCSAqIGFuZCBhIGRlZmF1bHQgdHJhbnNmb3JtZXIgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBpdGVyYWJsZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIFRyYW5zZm9ybWVyfS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGl0ZXJhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSBpdGVyYWJsZTsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRoaXMuYnVpbGREZWZhdWx0VHJhbnNmb3JtZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYWJsZQotCSAqIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGl0ZXJhYmxlLCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gYnVpbGREZWZhdWx0VHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFRyYW5zZm9ybWVyKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEUyPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEUxLCBFMj4odGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpLCB0aGlzLnRyYW5zZm9ybWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXByb3RlY3RlZCBFMiB0cmFuc2Zvcm0oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEUxIG8pIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmFibGUpOwotCX0KLQotCi0JLy8qKioqKioqKioqIGRlZmF1bHQgbGlua2VyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0VHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxFMSwgRTI+IHsKLQkJcHVibGljIEUyIHRyYW5zZm9ybShFMSBvKSB7Ci0JCQlyZXR1cm4gVHJhbnNmb3JtYXRpb25JdGVyYWJsZS50aGlzLnRyYW5zZm9ybShvKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1RyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYyZDA1OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+VHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGU8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIExpc3RJdGVyYWJsZX0KLSAqIGFuZCB0cmFuc2Zvcm1zIGl0cyBlbGVtZW50cyBmb3IgY2xpZW50IGNvbnN1bXB0aW9uLiBUbyB1c2UsIHN1cHBseSBhIAotICoge0BsaW5rIFRyYW5zZm9ybWVyfSBvciBzdWJjbGFzcyA8Y29kZT5UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZTwvY29kZT4KLSAqIGFuZCBvdmVycmlkZSB0aGUge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0gbWV0aG9kLgotICogT2JqZWN0cyBvZiB0eXBlIDxjb2RlPkUxPC9jb2RlPiBhcmUgdHJhbnNmb3JtZWQgaW50byBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+OwotICogaS5lLiB0aGUgbGlzdCBpdGVyYWJsZSdzIGxpc3QgaXRlcmF0b3IgcmV0dXJucyBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgdG8gYmUgdHJhbnNmb3JtZWQKLSAqIEBwYXJhbSA8RTI+IG91dHB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcgotICogQHNlZSBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZTxFMSwgRTI+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmFibGU8RTI+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmFibGU8PyBleHRlbmRzIEUxPiBpdGVyYWJsZTsKLQlwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQgbGlzdAotCSAqIGFuZCBhIGRlZmF1bHQgdHJhbnNmb3JtZXIgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBsaXN0IGl0ZXJhYmxlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZShMaXN0PEUxPiBsaXN0KSB7Ci0JCXRoaXMobmV3IExpc3RMaXN0SXRlcmFibGU8RTE+KGxpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQgbGlzdCBpdGVyYWJsZQotCSAqIGFuZCBhIGRlZmF1bHQgdHJhbnNmb3JtZXIgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBsaXN0IGl0ZXJhYmxlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZShMaXN0SXRlcmFibGU8PyBleHRlbmRzIEUxPiBpdGVyYWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0aGlzLmJ1aWxkRGVmYXVsdFRyYW5zZm9ybWVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkIGxpc3QKLQkgKiBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlKExpc3Q8RTE+IGxpc3QsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXRoaXMobmV3IExpc3RMaXN0SXRlcmFibGU8RTE+KGxpc3QpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkIGxpc3QgaXRlcmFibGUKLQkgKiBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlKExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGl0ZXJhYmxlLCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gYnVpbGREZWZhdWx0VHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFRyYW5zZm9ybWVyKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFMj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8RTEsIEUyPih0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCksIHRoaXMudHJhbnNmb3JtZXIpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHJvdGVjdGVkIEUyIHRyYW5zZm9ybShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRTEgbykgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYWJsZSk7Ci0JfQotCi0KLQkvLyoqKioqKioqKiogZGVmYXVsdCBsaW5rZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIERlZmF1bHRUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPEUxLCBFMj4gewotCQlwdWJsaWMgRTIgdHJhbnNmb3JtKEUxIG8pIHsKLQkJCXJldHVybiBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZS50aGlzLnRyYW5zZm9ybShvKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1RyZWVJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1RyZWVJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTNlMWZmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9UcmVlSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyZWVJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlRyZWVJdGVyYWJsZTwvY29kZT4gc2ltcGxpZmllcyB0aGUgdHJhdmVyc2FsIG9mIGEKLSAqIHRyZWUgb2Ygb2JqZWN0cywgd2hlcmUgdGhlIG9iamVjdHMnIHByb3RvY29sKHMpIHByb3ZpZGVzCi0gKiBhIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbgotICogbm9kZSBidXQgZG9lcyBub3QgcHJvdmlkZSBhIG1ldGhvZCBmb3IgZ2V0dGluZyBhbGwgdGhlCi0gKiBkZXNjZW5kYW50cyAoY2hpbGRyZW4sIGdyYW5kY2hpbGRyZW4sIGV0Yy4pIG9mIHRoZSBnaXZlbiBub2RlLgotICogPHA+Ci0gKiBUbyB1c2UsIHN1cHBseTo8dWw+Ci0gKiA8bGk+IGVpdGhlciB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSB0cmVlIG9yLCBpZiB0aGUgdHJlZSBoYXMKLSAqIG11bHRpcGxlIHJvb3RzLCBhbiB7QGxpbmsgSXRlcmFibGV9IG9mIHRoZSBzZXQgb2Ygcm9vdHMKLSAqIDxsaT4gYSB7QGxpbmsgVHJlZUl0ZXJhdG9yLk1pZHdpZmV9IHRoYXQgZGVsaXZlcnMgdGhlIGNoaWxkcmVuIG9mIGVhY2ggY2hpbGQKLSAqIChhbHRlcm5hdGl2ZWx5LCBzdWJjbGFzcyA8Y29kZT5UcmVlSXRlcmFibGU8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIHtAbGluayAjY2hpbGRyZW4oT2JqZWN0KX0gbWV0aG9kKQotICogPC91bD4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIFRyZWVJdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgVHJlZUl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIEU+IHJvb3RzOwotCXByaXZhdGUgZmluYWwgVHJlZUl0ZXJhdG9yLk1pZHdpZmU8RT4gbWlkd2lmZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIG5vZGVzIG9mIGEgdHJlZSB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdAotCSAqIGFuZCBhIGRlZmF1bHQgbWlkd2lmZSB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIGl0ZXJhYmxlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjY2hpbGRyZW4oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBUcmVlSXRlcmF0b3IuTWlkd2lmZX0uCi0JICovCi0JcHVibGljIFRyZWVJdGVyYWJsZShFIHJvb3QpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPEU+KHJvb3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSB0cmVlIHdpdGggdGhlIHNwZWNpZmllZCByb290Ci0JICogYW5kIG1pZHdpZmUuCi0JICovCi0JcHVibGljIFRyZWVJdGVyYWJsZShFIHJvb3QsIFRyZWVJdGVyYXRvci5NaWR3aWZlPEU+IG1pZHdpZmUpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPEU+KHJvb3QpLCBtaWR3aWZlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSB0cmVlIHdpdGggdGhlIHNwZWNpZmllZCByb290cwotCSAqIGFuZCBhIGRlZmF1bHQgbWlkd2lmZSB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIGl0ZXJhYmxlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjY2hpbGRyZW4oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBUcmVlSXRlcmF0b3IuTWlkd2lmZX0uCi0JICovCi0JcHVibGljIFRyZWVJdGVyYWJsZShFLi4uIHJvb3RzKSB7Ci0JCXRoaXMoQXJyYXlzLmFzTGlzdChyb290cykpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBub2RlcyBvZiBhIHRyZWUgd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3RzCi0JICogYW5kIG1pZHdpZmUuCi0JICovCi0JcHVibGljIFRyZWVJdGVyYWJsZShFW10gcm9vdHMsIFRyZWVJdGVyYXRvci5NaWR3aWZlPEU+IG1pZHdpZmUpIHsKLQkJdGhpcyhBcnJheXMuYXNMaXN0KHJvb3RzKSwgbWlkd2lmZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIG5vZGVzIG9mIGEgdHJlZSB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMKLQkgKiBhbmQgYSBkZWZhdWx0IG1pZHdpZmUgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBpdGVyYWJsZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI2NoaWxkcmVuKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgVHJlZUl0ZXJhdG9yLk1pZHdpZmV9LgotCSAqLwotCXB1YmxpYyBUcmVlSXRlcmFibGUoSXRlcmFibGU8PyBleHRlbmRzIEU+IHJvb3RzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucm9vdHMgPSByb290czsKLQkJdGhpcy5taWR3aWZlID0gdGhpcy5idWlsZERlZmF1bHRNaWR3aWZlKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIG5vZGVzIG9mIGEgdHJlZSB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMKLQkgKiBhbmQgbWlkd2lmZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhYmxlKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiByb290cywgVHJlZUl0ZXJhdG9yLk1pZHdpZmU8RT4gbWlkd2lmZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnJvb3RzID0gcm9vdHM7Ci0JCXRoaXMubWlkd2lmZSA9IG1pZHdpZmU7Ci0JfQotCi0JcHJvdGVjdGVkIFRyZWVJdGVyYXRvci5NaWR3aWZlPEU+IGJ1aWxkRGVmYXVsdE1pZHdpZmUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdE1pZHdpZmUoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUl0ZXJhdG9yPEU+KHRoaXMucm9vdHMsIHRoaXMubWlkd2lmZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIFRyZWVJdGVyYXRvci5NaWR3aWZlfS4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGNoaWxkcmVuKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBFIG5leHQpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMucm9vdHMpOwotCX0KLQotCi0JLy8qKioqKioqKioqIGRlZmF1bHQgbWlkd2lmZSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmYXVsdE1pZHdpZmUgaW1wbGVtZW50cyBUcmVlSXRlcmF0b3IuTWlkd2lmZTxFPiB7Ci0JCXB1YmxpYyBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gY2hpbGRyZW4oRSBub2RlKSB7Ci0JCQlyZXR1cm4gVHJlZUl0ZXJhYmxlLnRoaXMuY2hpbGRyZW4obm9kZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjBlMjc3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBbiA8Y29kZT5BcnJheUl0ZXJhdG9yPC9jb2RlPiBwcm92aWRlcyBhbiB7QGxpbmsgSXRlcmF0b3J9Ci0gKiBmb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cyBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgQXJyYXlJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlmaW5hbCBFW10gYXJyYXk7CS8vIHByaXZhdGUtcHJvdGVjdGVkCi0JaW50IGN1cnNvcjsJCS8vIHByaXZhdGUtcHJvdGVjdGVkCi0JcHJpdmF0ZSBmaW5hbCBpbnQgbWF4OwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICovCi0JcHVibGljIEFycmF5SXRlcmF0b3IoRS4uLiBhcnJheSkgewotCQl0aGlzKGFycmF5LCAwLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHN0YXJ0IGluZGV4IGFuZCBjb250aW51aW5nIGZvcgotCSAqIHRoZSByZXN0IG9mIHRoZSBhcnJheS4KLQkgKi8KLQlwdWJsaWMgQXJyYXlJdGVyYXRvcihFW10gYXJyYXksIGludCBzdGFydCkgewotCQl0aGlzKGFycmF5LCBzdGFydCwgYXJyYXkubGVuZ3RoIC0gc3RhcnQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHN0YXJ0IGluZGV4IGFuZCBjb250aW51aW5nIGZvcgotCSAqIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBBcnJheUl0ZXJhdG9yKEVbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgoc3RhcnQgPCAwKSB8fCAoc3RhcnQgPiBhcnJheS5sZW5ndGgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGFydDogIiArIHN0YXJ0KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICgobGVuZ3RoIDwgMCkgfHwgKGxlbmd0aCA+IGFycmF5Lmxlbmd0aCAtIHN0YXJ0KSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGVuZ3RoOiAiICsgbGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuYXJyYXkgPSBhcnJheTsKLQkJdGhpcy5jdXJzb3IgPSBzdGFydDsKLQkJdGhpcy5tYXggPSBzdGFydCArIGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5jdXJzb3IgIT0gdGhpcy5tYXg7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJaWYgKHRoaXMuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5hcnJheVt0aGlzLmN1cnNvcisrXTsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgQXJyYXlzLnRvU3RyaW5nKHRoaXMuYXJyYXkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUxpc3RJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOGNmZTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIEFuIDxjb2RlPkFycmF5TGlzdEl0ZXJhdG9yPC9jb2RlPiBwcm92aWRlcyBhIHtAbGluayBMaXN0SXRlcmF0b3J9Ci0gKiBmb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cy4KLSAqIDxwPgotICogVGhlIG5hbWUgbWlnaHQgYmUgYSBiaXQgY29uZnVzaW5nOgotICogVGhpcyBpcyBhIHtAbGluayBMaXN0SXRlcmF0b3J9IGZvciBhbiA8Y29kZT5BcnJheTwvY29kZT47Ci0gKiA8ZW0+bm90PC9lbT4gYW4ge0BsaW5rIGphdmEudXRpbC5JdGVyYXRvciBJdGVyYXRvcn0gZm9yIGFuCi0gKiB7QGxpbmsgamF2YS51dGlsLkFycmF5TGlzdCBBcnJheUxpc3R9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIEFycmF5TGlzdEl0ZXJhdG9yPEU+Ci0JZXh0ZW5kcyBBcnJheUl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIGludCBtaW47Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICovCi0JcHVibGljIEFycmF5TGlzdEl0ZXJhdG9yKEUuLi4gYXJyYXkpIHsKLQkJdGhpcyhhcnJheSwgMCwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHN0YXJ0IGluZGV4IGFuZCBjb250aW51aW5nIGZvcgotCSAqIHRoZSByZXN0IG9mIHRoZSBhcnJheS4KLQkgKi8KLQlwdWJsaWMgQXJyYXlMaXN0SXRlcmF0b3IoRVtdIGFycmF5LCBpbnQgc3RhcnQpIHsKLQkJdGhpcyhhcnJheSwgc3RhcnQsIGFycmF5Lmxlbmd0aCAtIHN0YXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgc3RhcnQgaW5kZXggYW5kIGNvbnRpbnVpbmcgZm9yCi0JICogdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHVibGljIEFycmF5TGlzdEl0ZXJhdG9yKEVbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKGFycmF5LCBzdGFydCwgbGVuZ3RoKTsKLQkJdGhpcy5taW4gPSBzdGFydDsKLQl9Ci0JCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLmN1cnNvcjsKLQl9Ci0JCi0JcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQlyZXR1cm4gdGhpcy5jdXJzb3IgLSAxOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJcmV0dXJuIHRoaXMuY3Vyc29yICE9IHRoaXMubWluOwotCX0KLQkKLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJaWYgKHRoaXMuaGFzUHJldmlvdXMoKSkgewotCQkJcmV0dXJuIHRoaXMuYXJyYXlbLS10aGlzLmN1cnNvcl07Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkKEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0KEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NoYWluSXRlcmF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DaGFpbkl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZWI2OTYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NoYWluSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+Q2hhaW5JdGVyYXRvcjwvY29kZT4gcHJvdmlkZXMgYSBwbHVnZ2FibGUge0BsaW5rIEl0ZXJhdG9yfQotICogdGhhdCBsb29wcyBvdmVyIGEgY2hhaW4gb2YgYXJiaXRyYXJpbHkgbGlua2VkIG9iamVjdHMuIFRoZSBjaGFpbgotICogc2hvdWxkIGJlIG51bGwtdGVybWluYXRlZCAoaS5lLiBhIGNhbGwgdG8gdGhlIHtAbGluayAjbmV4dExpbmsoT2JqZWN0KX0KLSAqIG1ldGhvZCBzaG91bGQgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gaXQgaXMgcGFzc2VkIHRoZSBsYXN0Ci0gKiBsaW5rIG9mIHRoZSBjaGFpbikuCi0gKiBUbyB1c2UsIHN1cHBseSBhIHN0YXJ0aW5nIGxpbmsgYW5kIHN1cHBseSBhIHtAbGluayBMaW5rZXJ9IG9yIAotICogc3ViY2xhc3MgPGNvZGU+Q2hhaW5JdGVyYXRvcjwvY29kZT4gYW5kIG92ZXJyaWRlIHRoZQotICoge0BsaW5rICNuZXh0TGluayhPYmplY3QpfSBtZXRob2QuCi0gKiBUaGUgc3RhcnRpbmcgbGluayB3aWxsIGJlIHRoZSBmaXJzdCBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yLgotICogSWYgdGhlIHN0YXJ0aW5nIGxpbmsgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZSBpdGVyYXRvciB3aWxsIGJlIGVtcHR5LgotICogTm90ZSB0aGlzIGl0ZXJhdG9yIGRvZXMgbm90IHN1cHBvcnQgPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudHMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5DaGFpbkl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFpbkl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgRSBuZXh0TGluazsKLQlwcml2YXRlIGZpbmFsIExpbmtlcjxFPiBsaW5rZXI7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgc3RhcnRpbmcgbGluawotCSAqIGFuZCBhIGRpc2FibGVkIGxpbmtlci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI25leHRMaW5rKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgTGlua2VyfS4KLQkgKi8KLQlwdWJsaWMgQ2hhaW5JdGVyYXRvcihFIHN0YXJ0TGluaykgewotCQl0aGlzKHN0YXJ0TGluaywgTGlua2VyLkRpc2FibGVkLjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgc3RhcnRpbmcgbGluawotCSAqIGFuZCBsaW5rZXIuCi0JICovCi0JcHVibGljIENoYWluSXRlcmF0b3IoRSBzdGFydExpbmssIExpbmtlcjxFPiBsaW5rZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5uZXh0TGluayA9IHN0YXJ0TGluazsKLQkJdGhpcy5saW5rZXIgPSBsaW5rZXI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dExpbmsgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5uZXh0TGluayA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUUgcmVzdWx0ID0gdGhpcy5uZXh0TGluazsKLQkJdGhpcy5uZXh0TGluayA9IHRoaXMubmV4dExpbmsodGhpcy5uZXh0TGluayk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5leHQgbGluayBpbiB0aGUgY2hhaW47IG51bGwgaWYgdGhlcmUgYXJlIG5vIG1vcmUgbGlua3MuCi0JICovCi0JcHJvdGVjdGVkIEUgbmV4dExpbmsoRSBjdXJyZW50TGluaykgewotCQlyZXR1cm4gdGhpcy5saW5rZXIubmV4dExpbmsoY3VycmVudExpbmspOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubmV4dExpbmspOwotCX0KLQotCi0JLy8qKioqKioqKioqIG1lbWJlciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlZCBieSB7QGxpbmsgQ2hhaW5JdGVyYXRvcn0gdG8gbGluawotCSAqIHRoZSBlbGVtZW50cyBpbiB0aGUgY2hhaW4uCi0JICovCi0JcHVibGljIGludGVyZmFjZSBMaW5rZXI8VD4gewotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5leHQgbGluayBpbiB0aGUgY2hhaW47IG51bGwgaWYgdGhlcmUgYXJlIG5vIG1vcmUgbGlua3MuCi0JCSAqLwotCQlUIG5leHRMaW5rKFQgY3VycmVudExpbmspOwotCi0KLQkJZmluYWwgY2xhc3MgTnVsbDxTPgotCQkJaW1wbGVtZW50cyBMaW5rZXI8Uz4sIFNlcmlhbGl6YWJsZQotCQl7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBMaW5rZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBMaW5rZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyBzaW1wbHkgcmV0dXJuIG51bGwsIGluZGljYXRpbmcgdGhlIGNoYWluIGlzIGVuZGVkCi0JCQlwdWJsaWMgUyBuZXh0TGluayhTIGN1cnJlbnRMaW5rKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCQl9Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQl9Ci0KLQotCQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPgotCQkJaW1wbGVtZW50cyBMaW5rZXI8Uz4sIFNlcmlhbGl6YWJsZQotCQl7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBMaW5rZXIgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyA8Uj4gTGlua2VyPFI+IGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQkJcHVibGljIFMgbmV4dExpbmsoUyBjdXJyZW50TGluaykgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyAgLy8gQ2hhaW5JdGVyYXRvci5uZXh0TGluayhPYmplY3QpIHdhcyBub3QgaW1wbGVtZW50ZWQKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJCX0KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI3MGZlYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5DbG9uZUl0ZXJhdG9yPC9jb2RlPiBpdGVyYXRlcyBvdmVyIGEgY29weSBvZiBhIGNvbGxlY3Rpb24sCi0gKiBhbGxvd2luZyBmb3IgY29uY3VycmVudCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0gKiA8cD4KLSAqIFRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uIHBhc3NlZCB0byB0aGUgPGNvZGU+Q2xvbmVJdGVyYXRvcjwvY29kZT4ncwotICogY29uc3RydWN0b3Igc2hvdWxkIGJlIHN5bmNocm9uaXplZCAoZS5nLiB7QGxpbmsgamF2YS51dGlsLlZlY3Rvcn0pOwotICogb3RoZXJ3aXNlIHlvdSBydW4gdGhlIHJpc2sgb2YgYSBjb3JydXB0ZWQgY29sbGVjdGlvbi4KLSAqIDxwPgotICogQnkgZGVmYXVsdCwgYSA8Y29kZT5DbG9uZUl0ZXJhdG9yPC9jb2RlPiBkb2VzIG5vdCBzdXBwb3J0IHRoZQotICoge0BsaW5rICNyZW1vdmUoKX0gb3BlcmF0aW9uOyB0aGlzIGlzIGJlY2F1c2UgaXQgZG9lcyBub3QgaGF2ZQotICogYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLiBCdXQgaWYgdGhlIDxjb2RlPkNsb25lSXRlcmF0b3I8L2NvZGU+Ci0gKiBpcyBzdXBwbGllZCB3aXRoIGFuIHtAbGluayBSZW1vdmVyfSBpdCB3aWxsIGRlbGVnYXRlIHRoZQotICoge0BsaW5rICNyZW1vdmUoKX0gb3BlcmF0aW9uIHRvIHRoZSB7QGxpbmsgUmVtb3Zlcn0uCi0gKiBBbHRlcm5hdGl2ZWx5LCBhIHN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGUge0BsaW5rICNyZW1vdmUoT2JqZWN0KX0KLSAqIG1ldGhvZC4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU25hcHNob3RDbG9uZUl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBDbG9uZUl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8T2JqZWN0PiBpdGVyYXRvcjsKLQlwcml2YXRlIEUgY3VycmVudDsKLQlwcml2YXRlIGZpbmFsIFJlbW92ZXI8RT4gcmVtb3ZlcjsKLQlwcml2YXRlIGJvb2xlYW4gcmVtb3ZlQWxsb3dlZDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIG9uIGEgY29weSBvZiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogVGhlIHtAbGluayAjcmVtb3ZlKCl9IG1ldGhvZCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQsCi0JICogdW5sZXNzIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoZSB7QGxpbmsgI3JlbW92ZShPYmplY3QpfS4KLQkgKi8KLQlwdWJsaWMgQ2xvbmVJdGVyYXRvcihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7Ci0JCXRoaXMoY29sbGVjdGlvbiwgUmVtb3Zlci5SZWFkT25seS48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogVGhlIHtAbGluayAjcmVtb3ZlKCl9IG1ldGhvZCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQsCi0JICogdW5sZXNzIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoZSB7QGxpbmsgI3JlbW92ZShPYmplY3QpfS4KLQkgKi8KLQlwdWJsaWMgQ2xvbmVJdGVyYXRvcihFW10gYXJyYXkpIHsKLQkJdGhpcyhhcnJheSwgUmVtb3Zlci5SZWFkT25seS48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCByZW1vdmVyIHRvIHJlbW92ZSBvYmplY3RzIGZyb20gdGhlCi0JICogb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ2xvbmVJdGVyYXRvcihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uLCBSZW1vdmVyPEU+IHJlbW92ZXIpIHsKLQkJdGhpcyhyZW1vdmVyLCBjb2xsZWN0aW9uLnRvQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIG9uIGEgY29weSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHJlbW92ZXIgdG8gcmVtb3ZlIG9iamVjdHMgZnJvbSB0aGUKLQkgKiBvcmlnaW5hbCBhcnJheS4KLQkgKi8KLQlwdWJsaWMgQ2xvbmVJdGVyYXRvcihFW10gYXJyYXksIFJlbW92ZXI8RT4gcmVtb3ZlcikgewotCQl0aGlzKHJlbW92ZXIsIGFycmF5LmNsb25lKCkpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsIGNvbnN0cnVjdG9yIHVzZWQgYnkgc3ViY2xhc3Nlcy4KLQkgKiBTd2FwIG9yZGVyIG9mIGFyZ3VtZW50cyB0byBwcmV2ZW50IGNvbGxpc2lvbiB3aXRoIG90aGVyIGNvbnN0cnVjdG9yLgotCSAqIFRoZSBwYXNzZWQgaW4gYXJyYXkgd2lsbCAqbm90KiBiZSBjbG9uZWQuCi0JICovCi0JcHJvdGVjdGVkIENsb25lSXRlcmF0b3IoUmVtb3ZlcjxFPiByZW1vdmVyLCBPYmplY3QuLi4gYXJyYXkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvciA9IG5ldyBBcnJheUl0ZXJhdG9yPE9iamVjdD4oYXJyYXkpOwotCQl0aGlzLmN1cnJlbnQgPSBudWxsOwotCQl0aGlzLnJlbW92ZXIgPSByZW1vdmVyOwotCQl0aGlzLnJlbW92ZUFsbG93ZWQgPSBmYWxzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSXRlcmF0b3IgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXRoaXMuY3VycmVudCA9IHRoaXMubmVzdGVkTmV4dCgpOwotCQl0aGlzLnJlbW92ZUFsbG93ZWQgPSB0cnVlOwotCQlyZXR1cm4gdGhpcy5jdXJyZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJaWYgKCAhIHRoaXMucmVtb3ZlQWxsb3dlZCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucmVtb3ZlKHRoaXMuY3VycmVudCk7Ci0JCXRoaXMucmVtb3ZlQWxsb3dlZCA9IGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBjb2xsZWN0aW9uIHBhc3NlZCBpbiBkdXJpbmcgY29uc3RydWN0aW9uIGhlbGQgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FPC9jb2RlPiwKLQkgKiBzbyB0aGlzIGNhc3QgaXMgbm90IGEgcHJvYmxlbS4gV2UgbmVlZCB0aGlzIGNhc3QgYmVjYXVzZQotCSAqIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gd2VyZSBjb3BpZWQgaW50bwotCSAqIGFuIG9iamVjdCBhcnJheSAoPGNvZGU+T2JqZWN0W108L2NvZGU+KS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgRSBuZXN0ZWROZXh0KCkgewotCQlyZXR1cm4gKEUpIHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgZnJvbSB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgUmVtb3Zlcn0uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKEUgZSkgewotCQl0aGlzLnJlbW92ZXIucmVtb3ZlKGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLQotCi0JLy8qKioqKioqKioqIG1lbWJlciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlZCBieSB7QGxpbmsgQ2xvbmVJdGVyYXRvcn0gdG8gcmVtb3ZlCi0JICogZWxlbWVudHMgZnJvbSB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbjsgc2luY2UgdGhlIGl0ZXJhdG9yCi0JICogZG9lcyBub3QgaGF2ZSBkaXJlY3QgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgUmVtb3ZlcjxUPiB7Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG9iamVjdCBmcm9tIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLgotCQkgKi8KLQkJdm9pZCByZW1vdmUoVCBlbGVtZW50KTsKLQotCi0JCWZpbmFsIGNsYXNzIFJlYWRPbmx5PFM+Ci0JCQlpbXBsZW1lbnRzIFJlbW92ZXI8Uz4sIFNlcmlhbGl6YWJsZQotCQl7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBSZW1vdmVyIElOU1RBTkNFID0gbmV3IFJlYWRPbmx5KCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IFJlbW92ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBSZWFkT25seSgpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCQkJLy8gcmVtb3ZlIGlzIG5vdCBzdXBwb3J0ZWQKLQkJCXB1YmxpYyB2b2lkIHJlbW92ZShPYmplY3QgZWxlbWVudCkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQkJfQotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lTGlzdEl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVMaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZiYzBjYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+Q2xvbmVMaXN0SXRlcmF0b3I8L2NvZGU+IGl0ZXJhdGVzIG92ZXIgYSBjb3B5IG9mIGEgbGlzdCwKLSAqIGFsbG93aW5nIGZvciBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgbGlzdC4KLSAqIDxwPgotICogVGhlIG9yaWdpbmFsIGxpc3QgcGFzc2VkIHRvIHRoZSA8Y29kZT5DbG9uZUxpc3RJdGVyYXRvcjwvY29kZT4ncwotICogY29uc3RydWN0b3Igc2hvdWxkIGJlIHN5bmNocm9uaXplZDsgb3RoZXJ3aXNlIHlvdSBydW4gdGhlIHJpc2sgb2YKLSAqIGEgY29ycnVwdGVkIGxpc3QgKGUuZy4ge0BsaW5rIGphdmEudXRpbC5WZWN0b3J9LgotICogPHA+Ci0gKiBCeSBkZWZhdWx0LCBhIDxjb2RlPkNsb25lTGlzdEl0ZXJhdG9yPC9jb2RlPiBkb2VzIG5vdCBzdXBwb3J0IHRoZQotICogbW9kaWZpY2F0aW9uIG9wZXJhdGlvbnM7IHRoaXMgaXMgYmVjYXVzZSBpdCBkb2VzIG5vdCBoYXZlCi0gKiBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGxpc3QuIEJ1dCBpZiB0aGUgPGNvZGU+Q2xvbmVMaXN0SXRlcmF0b3I8L2NvZGU+Ci0gKiBpcyBzdXBwbGllZCB3aXRoIGEge0BsaW5rIE11dGF0b3J9IGl0IHdpbGwgZGVsZWdhdGUgdGhlCi0gKiBtb2RpZmljYXRpb24gb3BlcmF0aW9ucyB0byB0aGUge0BsaW5rIE11dGF0b3J9LgotICogQWx0ZXJuYXRpdmVseSwgYSBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUgdGhlIG1vZGlmaWNhdGlvbiBtZXRob2RzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgQ2xvbmVMaXN0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhdG9yPE9iamVjdD4gbGlzdEl0ZXJhdG9yOwotCXByaXZhdGUgaW50IGN1cnNvcjsKLQlwcml2YXRlIFN0YXRlIHN0YXRlOwotCXByaXZhdGUgZmluYWwgTXV0YXRvcjxFPiBtdXRhdG9yOwotCi0JcHJpdmF0ZSBlbnVtIFN0YXRlIHsKLQkJVU5LTk9XTiwKLQkJUFJFVklPVVMsCi0JCU5FWFQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igb24gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKiBUaGUgbW9kaWZpY2F0aW9uIG1ldGhvZHMgd2lsbCBub3QgYmUgc3VwcG9ydGVkLAotCSAqIHVubGVzcyBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGVtLgotCSAqLwotCXB1YmxpYyBDbG9uZUxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0KSB7Ci0JCXRoaXMobGlzdCwgTXV0YXRvci5SZWFkT25seS48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIG9uIGEgY29weSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIFRoZSBtb2RpZmljYXRpb24gbWV0aG9kcyB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQsCi0JICogdW5sZXNzIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoZW0uCi0JICovCi0JcHVibGljIENsb25lTGlzdEl0ZXJhdG9yKEVbXSBhcnJheSkgewotCQl0aGlzKGFycmF5LCBNdXRhdG9yLlJlYWRPbmx5LjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igb24gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBsaXN0IG11dGF0b3IgdG8gbW9kaWZ5IHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqLwotCXB1YmxpYyBDbG9uZUxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0LCBNdXRhdG9yPEU+IG11dGF0b3IpIHsKLQkJdGhpcyhtdXRhdG9yLCBsaXN0LnRvQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBvbiBhIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBsaXN0IG11dGF0b3IgdG8gbW9kaWZ5IHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqLwotCXB1YmxpYyBDbG9uZUxpc3RJdGVyYXRvcihFW10gYXJyYXksIE11dGF0b3I8RT4gbXV0YXRvcikgewotCQl0aGlzKG11dGF0b3IsIGFycmF5LmNsb25lKCkpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsIGNvbnN0cnVjdG9yIHVzZWQgYnkgc3ViY2xhc3Nlcy4KLQkgKiBTd2FwIG9yZGVyIG9mIGFyZ3VtZW50cyB0byBwcmV2ZW50IGNvbGxpc2lvbiB3aXRoIG90aGVyIGNvbnN0cnVjdG9yLgotCSAqIFRoZSBwYXNzZWQgaW4gYXJyYXkgd2lsbCAqbm90KiBiZSBjbG9uZWQuCi0JICovCi0JcHJvdGVjdGVkIENsb25lTGlzdEl0ZXJhdG9yKE11dGF0b3I8RT4gbXV0YXRvciwgT2JqZWN0Li4uIGFycmF5KSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIGJ1aWxkIGEgY29weSBvZiB0aGUgbGlzdCBhbmQga2VlcCBpdCBpbiBzeW5jIHdpdGggb3JpZ2luYWwgKGlmIHRoZSBtdXRhdG9yIGFsbG93cyBjaGFuZ2VzKQotCQkvLyB0aGF0IHdheSB0aGUgbmVzdGVkIGxpc3QgaXRlcmF0b3Igd2lsbCBtYWludGFpbiBzb21lIG9mIG91ciBzdGF0ZQotCQl0aGlzLmxpc3RJdGVyYXRvciA9IENvbGxlY3Rpb25Ub29scy5saXN0KGFycmF5KS5saXN0SXRlcmF0b3IoKTsKLQkJdGhpcy5tdXRhdG9yID0gbXV0YXRvcjsKLQkJdGhpcy5jdXJzb3IgPSAwOwotCQl0aGlzLnN0YXRlID0gU3RhdGUuVU5LTk9XTjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdEl0ZXJhdG9yIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJLy8gYWxsb3cgdGhlIG5lc3RlZCBpdGVyYXRvciB0byB0aHJvdyBhbiBleGNlcHRpb24gYmVmb3JlIHdlIG1vZGlmeSB0aGUgaW5kZXgKLQkJRSBuZXh0ID0gdGhpcy5uZXN0ZWROZXh0KCk7Ci0JCXRoaXMuY3Vyc29yKys7Ci0JCXRoaXMuc3RhdGUgPSBTdGF0ZS5ORVhUOwotCQlyZXR1cm4gbmV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCS8vIGFsbG93IHRoZSBuZXN0ZWQgaXRlcmF0b3IgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGJlZm9yZSB3ZSBtb2RpZnkgdGhlIG9yaWdpbmFsIGxpc3QKLQkJdGhpcy5saXN0SXRlcmF0b3IucmVtb3ZlKCk7Ci0JCWlmICh0aGlzLnN0YXRlID09IFN0YXRlLlBSRVZJT1VTKSB7Ci0JCQl0aGlzLnJlbW92ZSh0aGlzLmN1cnNvcik7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmN1cnNvci0tOwotCQkJdGhpcy5yZW1vdmUodGhpcy5jdXJzb3IpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5uZXh0SW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5oYXNQcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBFIHByZXZpb3VzKCkgewotCQkvLyBhbGxvdyB0aGUgbmVzdGVkIGl0ZXJhdG9yIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBiZWZvcmUgd2UgbW9kaWZ5IHRoZSBpbmRleAotCQlFIHByZXZpb3VzID0gdGhpcy5uZXN0ZWRQcmV2aW91cygpOwotCQl0aGlzLmN1cnNvci0tOwotCQl0aGlzLnN0YXRlID0gU3RhdGUuUFJFVklPVVM7Ci0JCXJldHVybiBwcmV2aW91czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoRSBvKSB7Ci0JCS8vIGFsbG93IHRoZSBuZXN0ZWQgaXRlcmF0b3IgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGJlZm9yZSB3ZSBtb2RpZnkgdGhlIG9yaWdpbmFsIGxpc3QKLQkJdGhpcy5saXN0SXRlcmF0b3IuYWRkKG8pOwotCQl0aGlzLmFkZCh0aGlzLmN1cnNvciwgbyk7Ci0JCXRoaXMuY3Vyc29yKys7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KEUgbykgewotCQkvLyBhbGxvdyB0aGUgbmVzdGVkIGl0ZXJhdG9yIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBiZWZvcmUgd2UgbW9kaWZ5IHRoZSBvcmlnaW5hbCBsaXN0Ci0JCXRoaXMubGlzdEl0ZXJhdG9yLnNldChvKTsKLQkJaWYgKHRoaXMuc3RhdGUgPT0gU3RhdGUuUFJFVklPVVMpIHsKLQkJCXRoaXMuc2V0KHRoaXMuY3Vyc29yLCBvKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0KHRoaXMuY3Vyc29yIC0gMSwgbyk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgbGlzdCBwYXNzZWQgaW4gZHVyaW5nIGNvbnN0cnVjdGlvbiBoZWxkIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4sCi0JICogc28gdGhpcyBjYXN0IGlzIG5vdCBhIHByb2JsZW0uIFdlIG5lZWQgdGhpcyBjYXN0IGJlY2F1c2UKLQkgKiBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uIHdlcmUgY29waWVkIGludG8KLQkgKiBhbiBvYmplY3QgYXJyYXkgKDxjb2RlPk9iamVjdFtdPC9jb2RlPikuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEUgbmVzdGVkTmV4dCgpIHsKLQkJcmV0dXJuIChFKSB0aGlzLmxpc3RJdGVyYXRvci5uZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGxpc3QgcGFzc2VkIGluIGR1cmluZyBjb25zdHJ1Y3Rpb24gaGVsZCBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LAotCSAqIHNvIHRoaXMgY2FzdCBpcyBub3QgYSBwcm9ibGVtLiBXZSBuZWVkIHRoaXMgY2FzdCBiZWNhdXNlCi0JICogYWxsIHRoZSBlbGVtZW50cyBvZiB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbiB3ZXJlIGNvcGllZCBpbnRvCi0JICogYW4gb2JqZWN0IGFycmF5ICg8Y29kZT5PYmplY3RbXTwvY29kZT4pLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBFIG5lc3RlZFByZXZpb3VzKCkgewotCQlyZXR1cm4gKEUpIHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0byB0aGUgb3JpZ2luYWwgbGlzdC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgTXV0YXRvcn0uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkKGludCBpbmRleCwgRSBvKSB7Ci0JCXRoaXMubXV0YXRvci5hZGQoaW5kZXgsIG8pOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgZnJvbSB0aGUgb3JpZ2luYWwgbGlzdC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgTXV0YXRvcn0uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKGludCBpbmRleCkgewotCQl0aGlzLm11dGF0b3IucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBNdXRhdG9yfS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXQoaW50IGluZGV4LCBFIG8pIHsKLQkJdGhpcy5tdXRhdG9yLnNldChpbmRleCwgbyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKiBtZW1iZXIgaW50ZXJmYWNlICoqKioqKioqKioKLQotCS8qKgotCSAqIFVzZWQgYnkge0BsaW5rIENsb25lTGlzdEl0ZXJhdG9yfSB0byByZW1vdmUKLQkgKiBlbGVtZW50cyBmcm9tIHRoZSBvcmlnaW5hbCBsaXN0OyBzaW5jZSB0aGUgbGlzdCBpdGVyYXRvcgotCSAqIGRvZXMgbm90IGhhdmUgZGlyZWN0IGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgbGlzdC4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIE11dGF0b3I8VD4gewotCi0JCS8qKgotCQkgKiBBZGQgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhlIG9yaWdpbmFsIGxpc3QuCi0JCSAqLwotCQl2b2lkIGFkZChpbnQgaW5kZXgsIFQgbyk7Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG9iamVjdCBmcm9tIHRoZSBvcmlnaW5hbCBsaXN0LgotCQkgKi8KLQkJdm9pZCByZW1vdmUoaW50IGluZGV4KTsKLQotCQkvKioKLQkJICogU2V0IHRoZSBzcGVjaWZpZWQgb2JqZWN0IGluIHRoZSBvcmlnaW5hbCBsaXN0LgotCQkgKi8KLQkJdm9pZCBzZXQoaW50IGluZGV4LCBUIG8pOwotCi0KLQkJZmluYWwgY2xhc3MgUmVhZE9ubHk8Uz4KLQkJCWltcGxlbWVudHMgTXV0YXRvcjxTPiwgU2VyaWFsaXphYmxlCi0JCXsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIE11dGF0b3IgSU5TVEFOQ0UgPSBuZXcgUmVhZE9ubHkoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyA8Uj4gTXV0YXRvcjxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIFJlYWRPbmx5KCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyBhZGQgaXMgbm90IHN1cHBvcnRlZAotCQkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IG8pIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCS8vIHJlbW92ZSBpcyBub3Qgc3VwcG9ydGVkCi0JCQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQkvLyBzZXQgaXMgbm90IHN1cHBvcnRlZAotCQkJcHVibGljIHZvaWQgc2V0KGludCBpbmRleCwgT2JqZWN0IG8pIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJCX0KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlSXRlcmF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmFkNzZkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci0KLS8qKgotICogQSA8Y29kZT5Db21wb3NpdGVJdGVyYXRvcjwvY29kZT4gd3JhcHMgYSBjb2xsZWN0aW9uCi0gKiBvZiB7QGxpbmsgSXRlcmF0b3J9cyBhbmQgbWFrZXMgdGhlbSBhcHBlYXIgdG8gYmUgYSBzaW5nbGUKLSAqIHtAbGluayBJdGVyYXRvcn0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjw/IGV4dGVuZHMgSXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnM7Ci0JcHJpdmF0ZSBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gY3VycmVudEl0ZXJhdG9yOwotCXByaXZhdGUgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGxhc3RJdGVyYXRvclRvUmV0dXJuTmV4dDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBhbGwgdGhlIGVsZW1lbnRzIGhlbGQgYnkgdGhlCi0JICogc3BlY2lmaWVkIGl0ZXJhYmxlcy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPj4gaXRlcmFibGVzKSB7Ci0JCXRoaXMoCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxJdGVyYWJsZTw/IGV4dGVuZHMgRT4sIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4oaXRlcmFibGVzLml0ZXJhdG9yKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIEU+IHRyYW5zZm9ybShJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJCQkJcmV0dXJuIGl0ZXJhYmxlLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiBpdGVyYXRvcnMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBJdGVyYXRvcjw/IGV4dGVuZHMgRT4+IGl0ZXJhdG9ycykgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9ycyA9IGl0ZXJhdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcmVwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvcihFIG9iamVjdCwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXRoaXMob2JqZWN0LCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcmVwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvcihFIG9iamVjdCwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXRoaXMobmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxFPihvYmplY3QpLCBpdGVyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYXBwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIEUgb2JqZWN0KSB7Ci0JCXRoaXMoaXRlcmFibGUuaXRlcmF0b3IoKSwgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcHBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgRSBvYmplY3QpIHsKLQkJdGhpcyhpdGVyYXRvciwgbmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxFPihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlcy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+Li4uIGl0ZXJhYmxlcykgewotCQl0aGlzKG5ldyBBcnJheUl0ZXJhYmxlPEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPj4oaXRlcmFibGVzKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBpdGVyYXRvcnMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPi4uLiBpdGVyYXRvcnMpIHsKLQkJdGhpcyhuZXcgQXJyYXlJdGVyYXRvcjxJdGVyYXRvcjw/IGV4dGVuZHMgRT4+KGl0ZXJhdG9ycykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJdGVyYXRvciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQl0cnkgewotCQkJdGhpcy5sb2FkQ3VycmVudEl0ZXJhdG9yKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIHRoaXMgb2NjdXJzIGlmIHRoZXJlIGFyZSBubyBpdGVyYXRvcnMgYXQgYWxsCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQl0aGlzLmxvYWRDdXJyZW50SXRlcmF0b3IoKTsKLQkJRSByZXN1bHQgPSB0aGlzLmN1cnJlbnRJdGVyYXRvci5uZXh0KCk7Ci0KLQkJLy8gdGhlIHN0YXRlbWVudCBhYm92ZSB3aWxsIHRocm93IGEgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotCQkvLyBpZiB0aGUgY3VycmVudCBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lOwotCQkvLyBzbyBpZiB3ZSBnZXQgaGVyZSwgd2UgY2FuIHNldCAnbGFzdEl0ZXJhdG9yVG9SZXR1cm5OZXh0JwotCQl0aGlzLmxhc3RJdGVyYXRvclRvUmV0dXJuTmV4dCA9IHRoaXMuY3VycmVudEl0ZXJhdG9yOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQlpZiAodGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybk5leHQgPT0gbnVsbCkgewotCQkJLy8gQ29tcG9zaXRlSXRlcmF0b3IjbmV4dCgpIGhhcyBuZXZlciBiZWVuIGNhbGxlZAotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGFzdEl0ZXJhdG9yVG9SZXR1cm5OZXh0LnJlbW92ZSgpOwotCX0KLQotCS8qKgotCSAqIExvYWQge0BsaW5rICNjdXJyZW50SXRlcmF0b3J9IHdpdGggdGhlIGZpcnN0IGl0ZXJhdG9yIHRoYXQge0BsaW5rIEl0ZXJhdG9yI2hhc05leHQoKX0KLQkgKiBvciB0aGUgZmluYWwgaXRlcmF0b3IgaWYgYWxsIHRoZSBlbGVtZW50cyBoYXZlIGFscmVhZHkgYmVlbiByZXRyaWV2ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRDdXJyZW50SXRlcmF0b3IoKSB7Ci0JCWlmICh0aGlzLmN1cnJlbnRJdGVyYXRvciA9PSBudWxsKSB7Ci0JCQl0aGlzLmN1cnJlbnRJdGVyYXRvciA9IHRoaXMuaXRlcmF0b3JzLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoKCAhIHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSkgJiYgdGhpcy5pdGVyYXRvcnMuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLmN1cnJlbnRJdGVyYXRvciA9IHRoaXMuaXRlcmF0b3JzLm5leHQoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUxpc3RJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTExNDUxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBvc2l0ZUxpc3RJdGVyYXRvcjwvY29kZT4gd3JhcHMgYSBsaXN0Ci0gKiBvZiB7QGxpbmsgTGlzdEl0ZXJhdG9yfXMgYW5kIG1ha2VzIHRoZW0gYXBwZWFyIHRvIGJlIGEgc2luZ2xlCi0gKiB7QGxpbmsgTGlzdEl0ZXJhdG9yfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTGlzdEl0ZXJhdG9yPEU+PiBpdGVyYXRvcnM7Ci0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8RT4gbmV4dEl0ZXJhdG9yOwotCXByaXZhdGUgaW50IG5leHRJbmRleDsKLSAJLyoqCi0gCSAqIDxjb2RlPnRydWU8L2NvZGU+IGlmICJuZXh0IiB3YXMgbGFzdCByZXR1cm5lZDsKLSAJICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmICJwcmV2aW91cyIgd2FzIGxhc3QgcmV0dXJuZWQ7Ci0gCSAqIHRoaXMgZGV0ZXJtaW5lcyB0aGUgZWZmZWN0IG9mIHtAbGluayAjcmVtb3ZlKCl9IG9uIHtAbGluayAjbmV4dEluZGV4fQotIAkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbmV4dFJldHVybmVkOwotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEU+IGxhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBvbiB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBsaXN0IG9mIGxpc3RzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdDw/IGV4dGVuZHMgTGlzdDxFPj4gbGlzdHMpIHsKLQkJdGhpcygKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjxMaXN0PEU+LCBMaXN0SXRlcmF0b3I8RT4+KGxpc3RzLmxpc3RJdGVyYXRvcigpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFPiB0cmFuc2Zvcm0oTGlzdDxFPiBsaXN0KSB7Ci0JCQkJCXJldHVybiBsaXN0Lmxpc3RJdGVyYXRvcigpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgbGlzdHMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmFibGU8PyBleHRlbmRzIExpc3RJdGVyYWJsZTxFPj4gbGlzdEl0ZXJhYmxlcykgewotCQl0aGlzKAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPExpc3RJdGVyYWJsZTxFPiwgTGlzdEl0ZXJhdG9yPEU+PihsaXN0SXRlcmFibGVzLml0ZXJhdG9yKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEU+IHRyYW5zZm9ybShMaXN0SXRlcmFibGU8RT4gbGlzdCkgewotCQkJCQlyZXR1cm4gbGlzdC5pdGVyYXRvcigpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG9mIGxpc3QgaXRlcmF0b3JzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBMaXN0SXRlcmF0b3I8RT4+IGl0ZXJhdG9ycykgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9ycyA9IGl0ZXJhdG9yczsKLQkJdGhpcy5uZXh0SW5kZXggPSAwOwotCQl0aGlzLm5leHRSZXR1cm5lZCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcmVwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvcihFIG9iamVjdCwgTGlzdDxFPiBsaXN0KSB7Ci0JCXRoaXMob2JqZWN0LCBsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoRSBvYmplY3QsIExpc3RJdGVyYWJsZTxFPiBsaXN0SXRlcmFibGUpIHsKLQkJdGhpcyhvYmplY3QsIGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKEUgb2JqZWN0LCBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxFPihvYmplY3QpLCBpdGVyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdDxFPiBsaXN0LCBFIG9iamVjdCkgewotCQl0aGlzKGxpc3QubGlzdEl0ZXJhdG9yKCksIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhYmxlPEU+IGxpc3RJdGVyYWJsZSwgRSBvYmplY3QpIHsKLQkJdGhpcyhsaXN0SXRlcmFibGUuaXRlcmF0b3IoKSwgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYXBwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yLCBFIG9iamVjdCkgewotCQl0aGlzKGl0ZXJhdG9yLCBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxFPihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0cy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3Q8RT4uLi4gbGlzdHMpIHsKLQkJdGhpcyhBcnJheXMuYXNMaXN0KGxpc3RzKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdHMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmFibGU8RT4uLi4gbGlzdEl0ZXJhYmxlcykgewotCQl0aGlzKG5ldyBBcnJheUxpc3RJdGVyYWJsZTxMaXN0SXRlcmFibGU8RT4+KGxpc3RJdGVyYWJsZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IGl0ZXJhdG9ycy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjxFPi4uLiBpdGVyYXRvcnMpIHsKLQkJdGhpcyhuZXcgQXJyYXlMaXN0SXRlcmF0b3I8TGlzdEl0ZXJhdG9yPEU+PihpdGVyYXRvcnMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoRSBvKSB7Ci0JCXRoaXMuY2hlY2tOZXh0SXRlcmF0b3IoKTsKLQkJdGhpcy5uZXh0SXRlcmF0b3IuYWRkKG8pOwotCQl0aGlzLm5leHRJbmRleCsrOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmxvYWROZXh0SXRlcmF0b3IoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gdGhpcyBvY2N1cnMgaWYgdGhlcmUgYXJlIG5vIGl0ZXJhdG9ycyBhdCBhbGwKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5uZXh0SXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQl0cnkgewotCQkJdGhpcy5sb2FkUHJldmlvdXNJdGVyYXRvcigpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyB0aGlzIG9jY3VycyBpZiB0aGVyZSBhcmUgbm8gaXRlcmF0b3JzIGF0IGFsbAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLm5leHRJdGVyYXRvci5oYXNQcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXRoaXMubG9hZE5leHRJdGVyYXRvcigpOwotCQlFIHJlc3VsdCA9IHRoaXMubmV4dEl0ZXJhdG9yLm5leHQoKTsKLQotCQkvLyB0aGUgc3RhdGVtZW50IGFib3ZlIHdpbGwgdGhyb3cgYSBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0JCS8vIGlmIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmU7Ci0JCS8vIHNvIGlmIHdlIGdldCBoZXJlLCB3ZSBjYW4gc2V0IHRoZSAnbGFzdEl0ZXJhdG9yVG9SZXR1cm5FbGVtZW50JwotCQl0aGlzLmxhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudCA9IHRoaXMubmV4dEl0ZXJhdG9yOwotCQl0aGlzLm5leHRJbmRleCsrOwotCQl0aGlzLm5leHRSZXR1cm5lZCA9IHRydWU7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dEluZGV4OwotCX0KLQotCXB1YmxpYyBFIHByZXZpb3VzKCkgewotCQl0aGlzLmxvYWRQcmV2aW91c0l0ZXJhdG9yKCk7Ci0JCUUgcmVzdWx0ID0gdGhpcy5uZXh0SXRlcmF0b3IucHJldmlvdXMoKTsKLQotCQkvLyB0aGUgc3RhdGVtZW50IGFib3ZlIHdpbGwgdGhyb3cgYSBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0JCS8vIGlmIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmU7Ci0JCS8vIHNvIGlmIHdlIGdldCBoZXJlLCB3ZSBjYW4gc2V0IHRoZSAnbGFzdEl0ZXJhdG9yVG9SZXR1cm5FbGVtZW50JwotCQl0aGlzLmxhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudCA9IHRoaXMubmV4dEl0ZXJhdG9yOwotCQl0aGlzLm5leHRJbmRleC0tOwotCQl0aGlzLm5leHRSZXR1cm5lZCA9IGZhbHNlOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQlyZXR1cm4gdGhpcy5uZXh0SW5kZXggIC0gMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCWlmICh0aGlzLmxhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQucmVtb3ZlKCk7Ci0JCWlmICh0aGlzLm5leHRSZXR1cm5lZCkgewotCQkJLy8gZGVjcmVtZW50IHRoZSBpbmRleCBiZWNhdXNlIHRoZSAibmV4dCIgZWxlbWVudCBoYXMgbW92ZWQgZm9yd2FyZCBpbiB0aGUgbGlzdAotCQkJdGhpcy5uZXh0SW5kZXgtLTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFIGUpIHsKLQkJaWYgKHRoaXMubGFzdEl0ZXJhdG9yVG9SZXR1cm5FbGVtZW50ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudC5zZXQoZSk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCAnbmV4dEl0ZXJhdG9yJyB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvciB0aGF0IDxjb2RlPmhhc05leHQoKTwvY29kZT4KLQkgKiBvciB0aGUgZmluYWwgaXRlcmF0b3IgaWYgYWxsIHRoZSBlbGVtZW50cyBoYXZlIGFscmVhZHkgYmVlbiByZXRyaWV2ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWROZXh0SXRlcmF0b3IoKSB7Ci0JCXRoaXMuY2hlY2tOZXh0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKCggISB0aGlzLm5leHRJdGVyYXRvci5oYXNOZXh0KCkpICYmIHRoaXMuaXRlcmF0b3JzLmhhc05leHQoKSkgewotCQkJdGhpcy5uZXh0SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5uZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkICduZXh0SXRlcmF0b3InIHdpdGggdGhlIGZpcnN0IGl0ZXJhdG9yIHRoYXQgPGNvZGU+aGFzUHJldmlvdXMoKTwvY29kZT4KLQkgKiBvciB0aGUgZmlyc3QgaXRlcmF0b3IgaWYgYWxsIHRoZSBlbGVtZW50cyBoYXZlIGFscmVhZHkgYmVlbiByZXRyaWV2ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRQcmV2aW91c0l0ZXJhdG9yKCkgewotCQl0aGlzLmNoZWNrTmV4dEl0ZXJhdG9yKCk7Ci0JCXdoaWxlICgoICEgdGhpcy5uZXh0SXRlcmF0b3IuaGFzUHJldmlvdXMoKSkgJiYgdGhpcy5pdGVyYXRvcnMuaGFzUHJldmlvdXMoKSkgewotCQkJdGhpcy5uZXh0SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5wcmV2aW91cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgJ25leHRJdGVyYXRvcicgaXMgbnVsbCwgbG9hZCBpdCB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tOZXh0SXRlcmF0b3IoKSB7Ci0JCWlmICh0aGlzLm5leHRJdGVyYXRvciA9PSBudWxsKSB7Ci0JCQl0aGlzLm5leHRJdGVyYXRvciA9IHRoaXMuaXRlcmF0b3JzLm5leHQoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3JzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWQzOGYwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLS8qKgotICogQW4gPGNvZGU+RW1wdHlJdGVyYXRvcjwvY29kZT4gaXMganVzdCB0aGF0LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIChub3QpIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4sIFNlcmlhbGl6YWJsZQotewotCS8vIHNpbmdsZXRvbgotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW1wdHlJdGVyYXRvciBJTlNUQU5DRSA9IG5ldyBFbXB0eUl0ZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIDxUPiBJdGVyYXRvcjxUPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVtcHR5SXRlcmF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUxpc3RJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5TGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOGY3ZWQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5TGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIEFuIDxjb2RlPkVtcHR5TGlzdEl0ZXJhdG9yPC9jb2RlPiBpcyBqdXN0IHRoYXQuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgKG5vdCkgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlMaXN0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPiwgU2VyaWFsaXphYmxlCi17Ci0JLy8gc2luZ2xldG9uCi0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbXB0eUxpc3RJdGVyYXRvciBJTlNUQU5DRSA9IG5ldyBFbXB0eUxpc3RJdGVyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyA8VD4gTGlzdEl0ZXJhdG9yPFQ+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRW1wdHlMaXN0SXRlcmF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZChFIGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIEUgcHJldmlvdXMoKSB7Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoRSBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbnVtZXJhdGlvbkl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW51bWVyYXRpb25JdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGU5ZDM4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbnVtZXJhdGlvbkl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBbiA8Y29kZT5FbnVtZXJhdGlvbkl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhbgotICoge0BsaW5rIEVudW1lcmF0aW9ufSBzbyB0aGF0IGl0IGNhbiBiZSB0cmVhdGVkIGxpa2UgYW4KLSAqIHtAbGluayBJdGVyYXRvcn0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnVtZXJhdGlvbkl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgRW51bWVyYXRpb248PyBleHRlbmRzIEU+IGVudW1lcmF0aW9uOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgd3JhcHMgdGhlIHNwZWNpZmllZCBlbnVtZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb25JdGVyYXRvcihFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb24pIHsKLQkJdGhpcy5lbnVtZXJhdGlvbiA9IGVudW1lcmF0aW9uOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5lbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKTsKLQl9Ci0JCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5lbnVtZXJhdGlvbik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0ZpbHRlcmluZ0l0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzMTc2Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5GaWx0ZXJpbmdJdGVyYXRvcjwvY29kZT4gd3JhcHMgYW5vdGhlciB7QGxpbmsgSXRlcmF0b3J9Ci0gKiBhbmQgdXNlcyBhIHtAbGluayBGaWx0ZXJ9IHRvIGRldGVybWluZSB3aGljaCBlbGVtZW50cyBpbiB0aGUKLSAqIG5lc3RlZCBpdGVyYXRvciBhcmUgdG8gYmUgcmV0dXJuZWQgYnkgY2FsbHMgdG8ge0BsaW5rICNuZXh0KCl9LgotICogPHA+Ci0gKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBGaWx0ZXJ9LCBhIHN1YmNsYXNzCi0gKiBvZiA8Y29kZT5GaWx0ZXJpbmdJdGVyYXRvcjwvY29kZT4gY2FuIG92ZXJyaWRlIHRoZQotICoge0BsaW5rICNhY2NlcHQoT2JqZWN0KX0gbWV0aG9kLgotICogPHA+Ci0gKiBPbmUsIHBvc3NpYmx5IHVuZGVzaXJhYmxlLCBzaWRlLWVmZmVjdCBvZiB1c2luZyB0aGlzIGl0ZXJhdG9yIGlzIHRoYXQKLSAqIHRoZSBuZXN0ZWQgaXRlcmF0b3IncyA8Y29kZT5uZXh0KCk8L2NvZGU+IG1ldGhvZCB3aWxsIGJlIGludm9rZWQKLSAqIDxlbT5iZWZvcmU8L2VtPiB0aGUgZmlsdGVyZWQgaXRlcmF0b3IncyB7QGxpbmsgI25leHQoKX0KLSAqIG1ldGhvZCBpcyBpbnZva2VkLiBUaGlzIGlzIGJlY2F1c2UgdGhlICJuZXh0IiBlbGVtZW50IG11c3QgYmUKLSAqIGNoZWNrZWQgZm9yIHdoZXRoZXIgaXQgaXMgdG8gYmUgYWNjZXB0ZWQgYmVmb3JlIHRoZSBmaWx0ZXJlZCBpdGVyYXRvcgotICogY2FuIGRldGVybWluZSB3aGV0aGVyIGl0IGhhcyBhICJuZXh0IiBlbGVtZW50IChpLmUuIHRoYXQgdGhlCi0gKiB7QGxpbmsgI2hhc05leHQoKX0gbWV0aG9kIHNob3VsZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4pLgotICogVGhpcyBhbHNvIHByZXZlbnRzIGEgZmlsdGVyZWQgaXRlcmF0b3IgZnJvbSBzdXBwb3J0aW5nIHRoZSBvcHRpb25hbAotICogPGNvZGU+cmVtb3ZlKCk8L2NvZGU+IG1ldGhvZC4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyB0byBiZSBmaWx0ZXJlZAotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIEZpbHRlcmluZ0l0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yOwotCXByaXZhdGUgZmluYWwgRmlsdGVyPEU+IGZpbHRlcjsKLQlwcml2YXRlIEUgbmV4dDsKLQlwcml2YXRlIGJvb2xlYW4gZG9uZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIGl0ZXJhYmxlIGFuZCBhIGRpc2FibGVkIGZpbHRlci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI2FjY2VwdChPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIEZpbHRlcn0uCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0l0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQl0aGlzKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogaXRlcmF0b3IgYW5kIGEgZGlzYWJsZWQgZmlsdGVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjYWNjZXB0KE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgRmlsdGVyfS4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXRoaXMoaXRlcmF0b3IsIEZpbHRlci5EaXNhYmxlZC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogaXRlcmFibGUgYW5kIGZpbHRlci4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBGaWx0ZXI8RT4gZmlsdGVyKSB7Ci0JCXRoaXMoaXRlcmFibGUuaXRlcmF0b3IoKSwgZmlsdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIGl0ZXJhdG9yIGFuZCBmaWx0ZXIuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0l0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgRmlsdGVyPEU+IGZpbHRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLmxvYWROZXh0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuICEgdGhpcy5kb25lOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLmRvbmUpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJRSByZXN1bHQgPSB0aGlzLm5leHQ7Ci0JCXRoaXMubG9hZE5leHQoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBCZWNhdXNlIHdlIG5lZWQgdG8gcHJlLWxvYWQgdGhlIG5leHQgZWxlbWVudAotCSAqIHRvIGJlIHJldHVybmVkLCB3ZSBjYW5ub3Qgc3VwcG9ydCB0aGUgPGNvZGU+cmVtb3ZlKCk8L2NvZGU+Ci0JICogbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCBuZXh0IHdpdGggdGhlIG5leHQgdmFsaWQgZW50cnkgZnJvbSB0aGUgbmVzdGVkCi0JICogaXRlcmF0b3IuIElmIHRoZXJlIGFyZSBub25lLCBuZXh0IGlzIHNldCB0byA8Y29kZT5FTkQ8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTmV4dCgpIHsKLQkJdGhpcy5kb25lID0gdHJ1ZTsKLQkJd2hpbGUgKHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpICYmICh0aGlzLmRvbmUpKSB7Ci0JCQlFIHRlbXAgPSB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICh0aGlzLmFjY2VwdCh0ZW1wKSkgewotCQkJCS8vIGFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3Qgd2FzIGFjY2VwdGVkIGl0IGlzIG9mIHR5cGUgRQotCQkJCXRoaXMubmV4dCA9IHRlbXA7Ci0JCQkJdGhpcy5kb25lID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMubmV4dCA9IG51bGw7Ci0JCQkJdGhpcy5kb25lID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB7QGxpbmsgRmlsdGVyaW5nSXRlcmF0b3J9Ci0JICogc2hvdWxkIHJldHVybiB0aGUgc3BlY2lmaWVkIG5leHQgZWxlbWVudCBmcm9tIGEgY2FsbCB0byB0aGUKLQkgKiB7QGxpbmsgI25leHQoKX0gbWV0aG9kLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBGaWx0ZXJ9LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChFIG8pIHsKLQkJcmV0dXJuIHRoaXMuZmlsdGVyLmFjY2VwdChvKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvR3JhcGhJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWRkNmNiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+R3JhcGhJdGVyYXRvcjwvY29kZT4gaXMgc2ltaWxhciB0byBhIHtAbGluayBUcmVlSXRlcmF0b3J9Ci0gKiBleGNlcHQgdGhhdCBpdCBjYW5ub3QgYmUgYXNzdW1lZCB0aGF0IGFsbCBub2RlcyBhc3N1bWUgYSBzdHJpY3QgdHJlZQotICogc3RydWN0dXJlLiBGb3IgaW5zdGFuY2UsIGluIGEgdHJlZSwgYSBub2RlIGNhbm5vdCBiZSBhIGRlc2NlbmRlbnQgb2YKLSAqIGl0c2VsZiwgYnV0IGEgZ3JhcGggbWF5IGhhdmUgYSBjeWNsaWNhbCBzdHJ1Y3R1cmUuCi0gKgotICogQSA8Y29kZT5HcmFwaEl0ZXJhdG9yPC9jb2RlPiBzaW1wbGlmaWVzIHRoZSB0cmF2ZXJzYWwgb2YgYQotICogZ3JhcGggb2Ygb2JqZWN0cywgd2hlcmUgdGhlIG9iamVjdHMnIHByb3RvY29sKHMpIHByb3ZpZGVzCi0gKiBhIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgbmV4dCBjb2xsZWN0aW9uIG9mIG5vZGVzIGluIHRoZSBncmFwaCwKLSAqIChvciA8ZW0+bmVpZ2hib3JzPC9lbT4pLCBidXQgZG9lcyBub3QgcHJvdmlkZSBhIG1ldGhvZCBmb3IKLSAqIGdldHRpbmcgPGVtPmFsbDwvZW0+IG9mIHRoZSBub2RlcyBpbiB0aGUgZ3JhcGguCi0gKiAoZS5nLiBhIG5laWdoYm9yIGNhbiByZXR1cm4gaGlzIG5laWdoYm9ycywgYW5kIHRob3NlIG5laWdoYm9ycwotICogY2FuIHJldHVybiB0aGVpciBuZWlnaGJvcnMsIHdoaWNoIG1pZ2h0IGFsc28gaW5jbHVkZSB0aGUgb3JpZ2luYWwKLSAqIG5laWdoYm9yLCBidXQgeW91IG9ubHkgd2FudCB0byB2aXNpdCB0aGUgb3JpZ2luYWwgbmVpZ2hib3Igb25jZS4pCi0gKiA8cD4KLSAqIElmIGEgbmVpZ2hib3IgaGFzIGFscmVhZHkgYmVlbiB2aXNpdGVkIChkZXRlcm1pbmVkIGJ5IHVzaW5nCi0gKiB7QGxpbmsgI2VxdWFscyhPYmplY3QpfSksIHRoYXQgbmVpZ2hib3IgaXMgbm90IHZpc2l0ZWQgYWdhaW4sCi0gKiBub3IgYXJlIHRoZSBuZWlnaGJvcnMgb2YgdGhhdCBvYmplY3QuCi0gKiA8cD4KLSAqIEl0IGlzIHVwIHRvIHRoZSB1c2VyIG9mIHRoaXMgY2xhc3MgdG8gZW5zdXJlIGEgPGVtPmNvbXBsZXRlPC9lbT4gZ3JhcGguCi0gKiA8cD4KLSAqIFRvIHVzZSwgc3VwcGx5Ojx1bD4KLSAqIDxsaT4gZWl0aGVyIHRoZSBpbml0aWFsIG5vZGUgb2YgdGhlIGdyYXBoIG9yIGFuIHtAbGluayBJdGVyYXRvcn0KLSAqIG92ZXIgYW4gaW5pdGlhbCBjb2xsZWN0aW9uIG9mIGdyYXBoIG5vZGVzCi0gKiA8bGk+IGEge0BsaW5rIE1pc3RlclJvZ2Vyc30gdGhhdCB0ZWxscyB3aG8gdGhlIG5laWdoYm9ycyBhcmUKLSAqIG9mIGVhY2ggbm9kZQotICogKGFsdGVybmF0aXZlbHksIHN1YmNsYXNzIDxjb2RlPkdyYXBoSXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIHtAbGluayAjbmVpZ2hib3JzKE9iamVjdCl9IG1ldGhvZCkKLSAqIDwvdWw+Ci0gKiB7QGxpbmsgI3JlbW92ZSgpfSBpcyBub3Qgc3VwcG9ydGVkLiBUaGlzIGJlaGF2aW9yLCBpZgotICogZGVzaXJlZCwgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgdXNlciBvZiB0aGlzIGNsYXNzLgotICoKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkdyYXBoSXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JLy8gdXNlIGEgTGlua2VkTGlzdCBzaW5jZSB3ZSB3aWxsIGJlIHB1bGxpbmcgb2ZmIHRoZSBmcm9udCBhbmQgYWRkaW5nIHRvIHRoZSBlbmQKLQlwcml2YXRlIGZpbmFsIExpbmtlZExpc3Q8SXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnMgPSBuZXcgTGlua2VkTGlzdDxJdGVyYXRvcjw/IGV4dGVuZHMgRT4+KCk7Ci0JcHJpdmF0ZSBmaW5hbCBIYXNoU2V0PEU+IHZpc2l0ZWROZWlnaGJvcnMgPSBuZXcgSGFzaFNldDxFPigpOwotCXByaXZhdGUgZmluYWwgTWlzdGVyUm9nZXJzPEU+IG1pc3RlclJvZ2VyczsKLQotCXByaXZhdGUgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGN1cnJlbnRJdGVyYXRvcjsKLQotCXByaXZhdGUgRSBuZXh0TmVpZ2hib3I7Ci0JcHJpdmF0ZSBib29sZWFuIGRvbmU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgZ3JhcGgKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiByb290cwotCSAqIGFuZCBhIGRpc2FibGVkIE1yLiBSb2dlcnMuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNuZWlnaGJvcnMoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBNaXN0ZXJSb2dlcnN9LgotCSAqLwotCXB1YmxpYyBHcmFwaEl0ZXJhdG9yKEUuLi4gcm9vdHMpIHsKLQkJdGhpcyhuZXcgQXJyYXlJdGVyYXRvcjxFPihyb290cykpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgZ3JhcGgKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiByb290cwotCSAqIGFuZCBhIGRpc2FibGVkIE1yLiBSb2dlcnMuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNuZWlnaGJvcnMoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBNaXN0ZXJSb2dlcnN9LgotCSAqLwotCXB1YmxpYyBHcmFwaEl0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiByb290cykgewotCQl0aGlzKHJvb3RzLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgZ3JhcGgKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiByb290cwotCSAqIGFuZCBhIGRpc2FibGVkIE1yLiBSb2dlcnMuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNuZWlnaGJvcnMoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBNaXN0ZXJSb2dlcnN9LgotCSAqLwotCXB1YmxpYyBHcmFwaEl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiByb290cykgewotCQl0aGlzKHJvb3RzLCBNaXN0ZXJSb2dlcnMuRGlzYWJsZWQuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSBncmFwaAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCByb290Ci0JICogYW5kIGEgZGlzYWJsZWQgTXIuIFJvZ2Vycy4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiA8Y29kZT5uZWlnaGJvcnMoT2JqZWN0KTwvY29kZT4gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIDxjb2RlPk1pc3RlclJvZ2VyczwvY29kZT4uCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmF0b3IoRSByb290KSB7Ci0JCXRoaXMocm9vdCwgTWlzdGVyUm9nZXJzLkRpc2FibGVkLjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgZ3JhcGgKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdCBhbmQgTXIuIFJvZ2Vycy4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYXRvcihFIHJvb3QsIE1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnMpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+KHJvb3QpLCBtaXN0ZXJSb2dlcnMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgZ3JhcGgKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiByb290cyBhbmQgTXIuIFJvZ2Vycy4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYXRvcihFW10gcm9vdHMsIE1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnMpIHsKLQkJdGhpcyhuZXcgQXJyYXlJdGVyYXRvcjxFPihyb290cyksIG1pc3RlclJvZ2Vycyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSBncmFwaAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCByb290cyBhbmQgTXIuIFJvZ2Vycy4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gcm9vdHMsIE1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnMpIHsKLQkJdGhpcyhyb290cy5pdGVyYXRvcigpLCBtaXN0ZXJSb2dlcnMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgZ3JhcGgKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMgYW5kIE1yLiBSb2dlcnMuCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IHJvb3RzLCBNaXN0ZXJSb2dlcnM8RT4gbWlzdGVyUm9nZXJzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY3VycmVudEl0ZXJhdG9yID0gcm9vdHM7Ci0JCXRoaXMubWlzdGVyUm9nZXJzID0gbWlzdGVyUm9nZXJzOwotCQl0aGlzLmxvYWROZXh0TmVpZ2hib3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIG5leHQgbmVpZ2hib3Igd2l0aCB0aGUgbmV4dCBlbnRyeSBmcm9tIHRoZSBjdXJyZW50IGl0ZXJhdG9yLgotCSAqIElmIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGhhcyBub25lLCBsb2FkIHRoZSBuZXh0IGl0ZXJhdG9yLgotCSAqIElmIHRoZXJlIGFyZSBubyBtb3JlLCB0aGUge0BsaW5rICNkb25lfSBmbGFnIGlzIHNldC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZE5leHROZWlnaGJvcigpIHsKLQkJaWYgKHRoaXMuY3VycmVudEl0ZXJhdG9yID09IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSkgewotCQkJdGhpcy5kb25lID0gdHJ1ZTsKLQkJfQotCQllbHNlIGlmICh0aGlzLmN1cnJlbnRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUUgbmV4dFBvc3NpYmxlTmVpZ2hib3IgPSB0aGlzLmN1cnJlbnRJdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAodGhpcy52aXNpdGVkTmVpZ2hib3JzLmNvbnRhaW5zKG5leHRQb3NzaWJsZU5laWdoYm9yKSkgewotCQkJCXRoaXMubG9hZE5leHROZWlnaGJvcigpOyAgLy8gcmVjdXJzZQotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLm5leHROZWlnaGJvciA9IG5leHRQb3NzaWJsZU5laWdoYm9yOwotCQkJCXRoaXMudmlzaXRlZE5laWdoYm9ycy5hZGQobmV4dFBvc3NpYmxlTmVpZ2hib3IpOwotCQkJCXRoaXMuaXRlcmF0b3JzLmFkZCh0aGlzLm5laWdoYm9ycyhuZXh0UG9zc2libGVOZWlnaGJvcikpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJZm9yIChJdGVyYXRvcjw/IGV4dGVuZHMgSXRlcmF0b3I8PyBleHRlbmRzIEU+PiBzdHJlYW0gPSB0aGlzLml0ZXJhdG9ycy5pdGVyYXRvcigpOyAhIHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSAmJiBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLmN1cnJlbnRJdGVyYXRvciA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQkJaWYgKCAhIHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCXRoaXMuY3VycmVudEl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQkJfQotCQkJdGhpcy5sb2FkTmV4dE5laWdoYm9yKCk7ICAvLyByZWN1cnNlCi0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gISB0aGlzLmRvbmU7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJaWYgKHRoaXMuZG9uZSkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlFIG5leHQgPSB0aGlzLm5leHROZWlnaGJvcjsKLQkJdGhpcy5sb2FkTmV4dE5laWdoYm9yKCk7Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbW1lZGlhdGUgbmVpZ2hib3JzIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gbmVpZ2hib3JzKEUgbmV4dCkgewotCQlyZXR1cm4gdGhpcy5taXN0ZXJSb2dlcnMubmVpZ2hib3JzKG5leHQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY3VycmVudEl0ZXJhdG9yKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKiBpbm5lciBjbGFzc2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIFVzZWQgYnkge0BsaW5rIEdyYXBoSXRlcmF0b3J9IHRvIHJldHJpZXZlCi0JICogdGhlIGltbWVkaWF0ZSBuZWlnaGJvcnMgb2YgYSBub2RlIGluIHRoZSBncmFwaC4KLQkgKiAiVGhlc2UgYXJlIHRoZSBwZW9wbGUgaW4geW91ciBuZWlnaGJvcmhvb2QuLi4iCi0JICovCi0JcHVibGljIGludGVyZmFjZSBNaXN0ZXJSb2dlcnM8VD4gewotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGltbWVkaWF0ZSBuZWlnaGJvcnMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JCSAqLwotCQlJdGVyYXRvcjw/IGV4dGVuZHMgVD4gbmVpZ2hib3JzKFQgbmV4dCk7Ci0KLQotCQlmaW5hbCBjbGFzcyBOdWxsPFM+Ci0JCQlpbXBsZW1lbnRzIE1pc3RlclJvZ2VyczxTPiwgU2VyaWFsaXphYmxlCi0JCXsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIE1pc3RlclJvZ2VycyBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IE1pc3RlclJvZ2VyczxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIE51bGwoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIHJldHVybiBubyBuZWlnaGJvcnMKLQkJCXB1YmxpYyBJdGVyYXRvcjxTPiBuZWlnaGJvcnMoUyBuZXh0KSB7Ci0JCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJCX0KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0KLQotCQkvKiogVGhlIE1yLiBSb2dlcnMgdXNlZCB3aGVuIHRoZSB7QGxpbmsgR3JhcGhJdGVyYXRvciNuZWlnaGJvcnMoT2JqZWN0KX0gbWV0aG9kIGlzIG92ZXJyaWRkZW4uICovCi0JCWZpbmFsIGNsYXNzIERpc2FibGVkPFM+Ci0JCQlpbXBsZW1lbnRzIE1pc3RlclJvZ2VyczxTPiwgU2VyaWFsaXphYmxlCi0JCXsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIE1pc3RlclJvZ2VycyBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBNaXN0ZXJSb2dlcnM8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCQlwdWJsaWMgSXRlcmF0b3I8Uz4gbmVpZ2hib3JzKFMgbmV4dCkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyAgLy8gR3JhcGhJdGVyYXRvci5uZWlnaGJvcnMoT2JqZWN0KSB3YXMgbm90IGltcGxlbWVudGVkCi0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCQl9Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0xhdGVyYWxJdGVyYXRvcldyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9MYXRlcmFsSXRlcmF0b3JXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YzY3Y2UuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0xhdGVyYWxJdGVyYXRvcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBXcmFwIGFuIGl0ZXJhdG9yIG9uIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTE8L2NvZGU+LCBjb252ZXJ0aW5nIGl0IGludG8gYW4KLSAqIGl0ZXJhdG9yIG9uIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LiA8ZW0+QXNzdW1lPC9lbT4gdGhlIHdyYXBwZWQKLSAqIGl0ZXJhdG9yIHJldHVybnMgb25seSBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPi4gVGhlIHJlc3VsdCBpcyBhCi0gKiB7QGxpbmsgQ2xhc3NDYXN0RXhjZXB0aW9ufSBpZiB0aGlzIGFzc3VtcHRpb24gaXMgZmFsc2UuCi0gKiAKLSAqIEBwYXJhbSA8RTE+IGlucHV0OiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgd3JhcHBlZCBpdGVyYXRvcgotICogQHBhcmFtIDxFMj4gb3V0cHV0OiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxhdGVyYWxJdGVyYWJsZVdyYXBwZXIKLSAqIEBzZWUgU3ViSXRlcmF0b3JXcmFwcGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXRlcmFsSXRlcmF0b3JXcmFwcGVyPEUxLCBFMj4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEUyPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8RTE+IGl0ZXJhdG9yOwotCi0KLQlwdWJsaWMgTGF0ZXJhbEl0ZXJhdG9yV3JhcHBlcihJdGVyYWJsZTxFMT4gaXRlcmFibGUpIHsKLQkJdGhpcyhpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgTGF0ZXJhbEl0ZXJhdG9yV3JhcHBlcihJdGVyYXRvcjxFMT4gaXRlcmF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgRTIgbmV4dCgpIHsKLQkJcmV0dXJuIChFMikgdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aGlzLml0ZXJhdG9yLnJlbW92ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9MYXRlcmFsTGlzdEl0ZXJhdG9yV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0xhdGVyYWxMaXN0SXRlcmF0b3JXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNGI4ZWYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0xhdGVyYWxMaXN0SXRlcmF0b3JXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIFdyYXAgYSBsaXN0IGl0ZXJhdG9yIG9uIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTE8L2NvZGU+LCBjb252ZXJ0aW5nIGl0IGludG8KLSAqIGEgbGlzdCBpdGVyYXRvciBvbiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPi4gPGVtPkFzc3VtZTwvZW0+IHRoZQotICogd3JhcHBlZCBsaXN0IGl0ZXJhdG9yIHJldHVybnMgb25seSBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPi4KLSAqIFRoZSByZXN1bHQgaXMgYSB7QGxpbmsgQ2xhc3NDYXN0RXhjZXB0aW9ufSBpZiB0aGlzIGFzc3VtcHRpb24gaXMgZmFsc2UuCi0gKiAKLSAqIEBwYXJhbSA8RTE+IGlucHV0OiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgd3JhcHBlZCBsaXN0IGl0ZXJhdG9yCi0gKiBAcGFyYW0gPEUyPiBvdXRwdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBsaXN0IGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MYXRlcmFsSXRlcmFibGVXcmFwcGVyCi0gKiBAc2VlIFN1Ykxpc3RJdGVyYXRvcldyYXBwZXIKLSAqLwotcHVibGljIGNsYXNzIExhdGVyYWxMaXN0SXRlcmF0b3JXcmFwcGVyPEUxLCBFMj4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFMj4KLXsKLQlmaW5hbCBMaXN0SXRlcmF0b3I8RTE+IGxpc3RJdGVyYXRvcjsKLQotCi0JcHVibGljIExhdGVyYWxMaXN0SXRlcmF0b3JXcmFwcGVyKExpc3Q8RTE+IGxpc3QpIHsKLQkJdGhpcyhsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgTGF0ZXJhbExpc3RJdGVyYXRvcldyYXBwZXIoTGlzdEl0ZXJhYmxlPEUxPiBsaXN0SXRlcmFibGUpIHsKLQkJdGhpcyhsaXN0SXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIExhdGVyYWxMaXN0SXRlcmF0b3JXcmFwcGVyKExpc3RJdGVyYXRvcjxFMT4gaXRlcmF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0SXRlcmF0b3IgPSBpdGVyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBFMiBuZXh0KCkgewotCQlyZXR1cm4gKEUyKSB0aGlzLmxpc3RJdGVyYXRvci5uZXh0KCk7Ci0JfQotCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5uZXh0SW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEUyIHByZXZpb3VzKCkgewotCQlyZXR1cm4gKEUyKSB0aGlzLmxpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRoaXMubGlzdEl0ZXJhdG9yLnJlbW92ZSgpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyB2b2lkIHNldChFMiBlKSB7Ci0JCXRoaXMubGlzdEl0ZXJhdG9yLnNldCgoRTEpIGUpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyB2b2lkIGFkZChFMiBlKSB7Ci0JCXRoaXMubGlzdEl0ZXJhdG9yLmFkZCgoRTEpIGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubGlzdEl0ZXJhdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUGVla2FibGVJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1BlZWthYmxlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExZjYyOC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUGVla2FibGVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5QZWVrYWJsZUl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhbm90aGVyIHtAbGluayBJdGVyYXRvcn0KLSAqIGFuZCBhbGxvd3MgYSB7QGxpbmsgI3BlZWsoKX0gYXQgdGhlIG5leHQgZWxlbWVudCB0byBiZSAKLSAqIHJldHVybmVkIGJ5IHtAbGluayAjbmV4dCgpfS4KLSAqIDxwPgotICogT25lLCBwb3NzaWJseSB1bmRlc2lyYWJsZSwgc2lkZS1lZmZlY3Qgb2YgdXNpbmcgdGhpcyBpdGVyYXRvciBpcyB0aGF0Ci0gKiB0aGUgbmVzdGVkIGl0ZXJhdG9yJ3MgPGNvZGU+bmV4dCgpPC9jb2RlPiBtZXRob2Qgd2lsbCBiZSBpbnZva2VkCi0gKiA8ZW0+YmVmb3JlPC9lbT4gdGhlIHBlZWthYmxlIGl0ZXJhdG9yJ3Mge0BsaW5rICNuZXh0KCl9Ci0gKiBtZXRob2QgaXMgaW52b2tlZC4gVGhpcyBpcyBiZWNhdXNlIHRoZSAibmV4dCIgZWxlbWVudCBtdXN0IGJlCi0gKiBwcmUtbG9hZGVkIGZvciB0aGUge0BsaW5rICNwZWVrKCl9IG1ldGhvZC4KLSAqIFRoaXMgYWxzbyBwcmV2ZW50cyBhIHBlZWthYmxlIGl0ZXJhdG9yIGZyb20gc3VwcG9ydGluZyB0aGUgb3B0aW9uYWwKLSAqIHtAbGluayAjcmVtb3ZlKCl9IG1ldGhvZC4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlBlZWthYmxlSXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFBlZWthYmxlSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3I7Ci0JcHJpdmF0ZSBFIG5leHQ7Ci0JcHJpdmF0ZSBib29sZWFuIGRvbmU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHBlZWthYmxlIGl0ZXJhdG9yIHRoYXQgd3JhcHMgdGhlIHNwZWNpZmllZAotCSAqIGl0ZXJhYmxlLgotCSAqLwotCXB1YmxpYyBQZWVrYWJsZUl0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQl0aGlzKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHBlZWthYmxlIGl0ZXJhdG9yIHRoYXQgd3JhcHMgdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBpdGVyYXRvci4KLQkgKi8KLQlwdWJsaWMgUGVla2FibGVJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl0aGlzLmRvbmUgPSBmYWxzZTsKLQkJdGhpcy5sb2FkTmV4dCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiAhIHRoaXMuZG9uZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5kb25lKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUUgcmVzdWx0ID0gdGhpcy5uZXh0OwotCQl0aGlzLmxvYWROZXh0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSB0aGUgbmV4dCBjYWxsIHRvIHRoZQotCSAqIHtAbGluayAjbmV4dCgpfSBtZXRob2QsIHdpdGhvdXQgYWR2YW5jaW5nIHBhc3QgaXQuCi0JICovCi0JcHVibGljIEUgcGVlaygpIHsKLQkJaWYgKHRoaXMuZG9uZSkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5uZXh0OwotCX0KLQotCS8qKgotCSAqIEJlY2F1c2Ugd2UgbmVlZCB0byBwcmUtbG9hZCB0aGUgbmV4dCBlbGVtZW50Ci0JICogdG8gYmUgcmV0dXJuZWQsIHdlIGNhbm5vdCBzdXBwb3J0IHRoZSB7QGxpbmsgI3JlbW92ZSgpfQotCSAqIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIExvYWQgbmV4dCB3aXRoIHRoZSBuZXh0IGVudHJ5IGZyb20gdGhlIG5lc3RlZAotCSAqIGl0ZXJhdG9yLiBJZiB0aGVyZSBhcmUgbm9uZSwge0BsaW5rICNuZXh0fSBpcyBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBhbmQge0BsaW5rICNkb25lfSBpcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWROZXh0KCkgewotCQlpZiAodGhpcy5pdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXRoaXMubmV4dCA9IHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCQl9IGVsc2UgewotCQkJdGhpcy5uZXh0ID0gbnVsbDsKLQkJCXRoaXMuZG9uZSA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9RdWV1ZUl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUXVldWVJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjk0NjIzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9RdWV1ZUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+UXVldWVJdGVyYXRvcjwvY29kZT4gcHJvdmlkZXMgYW4ge0BsaW5rIEl0ZXJhdG9yfQotICogZm9yIGEge0BsaW5rIFF1ZXVlfSBvZiBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4uIFRoZSBxdWV1ZSdzIGVsZW1lbnRzCi0gKiBhcmUge0BsaW5rIFF1ZXVlI2RlcXVldWUoKSBkZXF1ZXVlfWQiIGFzIHRoZSBpdGVyYXRvciByZXR1cm5zIHRoZW0gd2l0aAotICogY2FsbHMgdG8ge0BsaW5rICNuZXh0KCl9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIFF1ZXVlCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuUXVldWVJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgUXVldWVJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIFF1ZXVlPEU+IHF1ZXVlOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgcXVldWUuCi0JICovCi0JcHVibGljIFF1ZXVlSXRlcmF0b3IoUXVldWU8RT4gcXVldWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5xdWV1ZSA9IHF1ZXVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiAhIHRoaXMucXVldWUuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXJldHVybiB0aGlzLnF1ZXVlLmRlcXVldWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMucXVldWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI1Nzg4NS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBBIDxjb2RlPlJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhIGxpc3QKLSAqIG9mIHtAbGluayBMaXN0SXRlcmF0b3J9cyBhbmQgbWFrZXMgdGhlbSBhcHBlYXIgdG8gYmUgYSBzaW5nbGUKLSAqIHJlYWQtb25seSB7QGxpbmsgTGlzdEl0ZXJhdG9yfS4gQSByZWFkLW9ubHkgY29tcG9zaXRlIGxpc3QKLSAqIGl0ZXJhdG9yIGlzIG1vcmUgZmxleGlibGUgdGhhbiBhIG5vcm1hbCBjb21wb3NpdGUgbGlzdCBpdGVyYXRvciB3aGVuIGl0Ci0gKiBjb21lcyB0byB0aGUgZWxlbWVudCB0eXBlcyBvZiB0aGUgbmVzdGVkIGl0ZXJhdG9ycy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4+IGl0ZXJhdG9yczsKLQlwcml2YXRlIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4gbmV4dEl0ZXJhdG9yOwotCXByaXZhdGUgaW50IG5leHRJbmRleDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgbGlzdHMuCi0JICovCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3Q8PyBleHRlbmRzIExpc3Q8PyBleHRlbmRzIEU+PiBsaXN0cykgewotCQl0aGlzKAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPExpc3Q8PyBleHRlbmRzIEU+LCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+PihsaXN0cy5saXN0SXRlcmF0b3IoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IHRyYW5zZm9ybShMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0KSB7Ci0JCQkJCXJldHVybiBsaXN0Lmxpc3RJdGVyYXRvcigpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBsaXN0cy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+PiBsaXN0SXRlcmFibGVzKSB7Ci0JCXRoaXMoCi0JCQluZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8TGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4obGlzdEl0ZXJhYmxlcy5pdGVyYXRvcigpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4gdHJhbnNmb3JtKExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4gbGlzdEl0ZXJhYmxlKSB7Ci0JCQkJCXJldHVybiBsaXN0SXRlcmFibGUuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YKLQkgKiBsaXN0IGl0ZXJhdG9ycy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvcnMgPSBpdGVyYXRvcnM7Ci0JCXRoaXMubmV4dEluZGV4ID0gMDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IoRSBvYmplY3QsIExpc3Q8PyBleHRlbmRzIEU+IGxpc3QpIHsKLQkJdGhpcyhvYmplY3QsIGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihFIG9iamVjdCwgTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBsaXN0SXRlcmFibGUpIHsKLQkJdGhpcyhvYmplY3QsIGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKEUgb2JqZWN0LCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXRoaXMobmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4ob2JqZWN0KSwgaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYXBwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3Q8PyBleHRlbmRzIEU+IGxpc3QsIEUgb2JqZWN0KSB7Ci0JCXRoaXMobGlzdC5saXN0SXRlcmF0b3IoKSwgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+IGxpc3RJdGVyYWJsZSwgRSBvYmplY3QpIHsKLQkJdGhpcyhsaXN0SXRlcmFibGUuaXRlcmF0b3IoKSwgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgRSBvYmplY3QpIHsKLQkJdGhpcyhpdGVyYXRvciwgbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4ob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3RzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBFPi4uLiBsaXN0cykgewotCQl0aGlzKEFycmF5cy5hc0xpc3QobGlzdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdHMuCi0JICovCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4uLi4gbGlzdEl0ZXJhYmxlcykgewotCQl0aGlzKG5ldyBBcnJheUxpc3RJdGVyYWJsZTxMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+PihsaXN0SXRlcmFibGVzKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3QgaXRlcmF0b3JzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+Li4uIGl0ZXJhdG9ycykgewotCQl0aGlzKG5ldyBBcnJheUxpc3RJdGVyYXRvcjxMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+PihpdGVyYXRvcnMpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQl0cnkgewotCQkJdGhpcy5sb2FkTmV4dEl0ZXJhdG9yKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIHRoaXMgb2NjdXJzIGlmIHRoZXJlIGFyZSBubyBpdGVyYXRvcnMgYXQgYWxsCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubmV4dEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJdHJ5IHsKLQkJCXRoaXMubG9hZFByZXZpb3VzSXRlcmF0b3IoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gdGhpcyBvY2N1cnMgaWYgdGhlcmUgYXJlIG5vIGl0ZXJhdG9ycyBhdCBhbGwKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5uZXh0SXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQl0aGlzLmxvYWROZXh0SXRlcmF0b3IoKTsKLQkJRSByZXN1bHQgPSB0aGlzLm5leHRJdGVyYXRvci5uZXh0KCk7Ci0JCi0JCS8vIHRoZSBzdGF0ZW1lbnQgYWJvdmUgd2lsbCB0aHJvdyBhIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLQkJLy8gaWYgdGhlIGN1cnJlbnQgaXRlcmF0b3IgaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZTsKLQkJLy8gc28gaWYgd2UgZ2V0IGhlcmUsIHdlIGNhbiBpbmNyZW1lbnQgJ25leHRJbmRleCcKLQkJdGhpcy5uZXh0SW5kZXgrKzsKLQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dEluZGV4OwotCX0KLQotCXB1YmxpYyBFIHByZXZpb3VzKCkgewotCQl0aGlzLmxvYWRQcmV2aW91c0l0ZXJhdG9yKCk7Ci0JCUUgcmVzdWx0ID0gdGhpcy5uZXh0SXRlcmF0b3IucHJldmlvdXMoKTsKLQkKLQkJLy8gdGhlIHN0YXRlbWVudCBhYm92ZSB3aWxsIHRocm93IGEgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotCQkvLyBpZiB0aGUgY3VycmVudCBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lOwotCQkvLyBzbyBpZiB3ZSBnZXQgaGVyZSwgd2UgY2FuIGRlY3JlbWVudCAnbmV4dEluZGV4JwotCQl0aGlzLm5leHRJbmRleC0tOwotCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dEluZGV4ICAtIDE7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUgbykgewotCQkvLyB0aGUgbGlzdCBpdGVyYXRvciBpcyByZWFkLW9ubHkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyB0aGUgbGlzdCBpdGVyYXRvciBpcyByZWFkLW9ubHkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KEUgZSkgewotCQkvLyB0aGUgbGlzdCBpdGVyYXRvciBpcyByZWFkLW9ubHkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB7QGxpbmsgI25leHRJdGVyYXRvcn0gd2l0aCB0aGUgZmlyc3QgaXRlcmF0b3IgdGhhdCB7QGxpbmsgI2hhc05leHQoKX0KLQkgKiBvciB0aGUgZmluYWwgaXRlcmF0b3IgaWYgYWxsIHRoZSBlbGVtZW50cyBoYXZlIGFscmVhZHkgYmVlbiByZXRyaWV2ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWROZXh0SXRlcmF0b3IoKSB7Ci0JCXRoaXMuY2hlY2tOZXh0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKCggISB0aGlzLm5leHRJdGVyYXRvci5oYXNOZXh0KCkpICYmIHRoaXMuaXRlcmF0b3JzLmhhc05leHQoKSkgewotCQkJdGhpcy5uZXh0SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5uZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHtAbGluayAjbmV4dEl0ZXJhdG9yfSB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvciB0aGF0IHtAbGluayAjaGFzUHJldmlvdXMoKX0KLQkgKiBvciB0aGUgZmlyc3QgaXRlcmF0b3IgaWYgYWxsIHRoZSBlbGVtZW50cyBoYXZlIGFscmVhZHkgYmVlbiByZXRyaWV2ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRQcmV2aW91c0l0ZXJhdG9yKCkgewotCQl0aGlzLmNoZWNrTmV4dEl0ZXJhdG9yKCk7Ci0JCXdoaWxlICgoICEgdGhpcy5uZXh0SXRlcmF0b3IuaGFzUHJldmlvdXMoKSkgJiYgdGhpcy5pdGVyYXRvcnMuaGFzUHJldmlvdXMoKSkgewotCQkJdGhpcy5uZXh0SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5wcmV2aW91cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYge0BsaW5rICNuZXh0SXRlcmF0b3J9IGlzIG51bGwsIGxvYWQgaXQgd2l0aCB0aGUgZmlyc3QgaXRlcmF0b3IuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTmV4dEl0ZXJhdG9yKCkgewotCQlpZiAodGhpcy5uZXh0SXRlcmF0b3IgPT0gbnVsbCkgewotCQkJdGhpcy5uZXh0SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5uZXh0KCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9ycyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3M2QzZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+UmVhZE9ubHlJdGVyYXRvcjwvY29kZT4gd3JhcHMgYW5vdGhlciB7QGxpbmsgSXRlcmF0b3J9Ci0gKiBhbmQgcmVtb3ZlcyBzdXBwb3J0IGZvciB7QGxpbmsgI3JlbW92ZSgpfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlJlYWRPbmx5SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3I7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHRoYXQKLQkgKiBkaXNhbGxvd3MgcmVtb3Zlcy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gYykgewotCQl0aGlzKGMuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQgaXRlcmF0b3IKLQkgKiBhbmQgZGlzYWxsb3cgcmVtb3Zlcy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5TGlzdEl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlMaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMwOTEzMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIEEgPGNvZGU+UmVhZE9ubHlMaXN0SXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIHtAbGluayBMaXN0SXRlcmF0b3J9IGFuZCByZW1vdmVzIHN1cHBvcnQgZm9yOjx1bD4KLSAqIDxsaT57QGxpbmsgI3JlbW92ZSgpfQotICogCTxsaT57QGxpbmsgI3NldChPYmplY3QpfQotICogCTxsaT57QGxpbmsgI2FkZChPYmplY3QpfQotICogPC91bD4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgbGlzdCBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuUmVhZE9ubHlMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5TGlzdEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4gbGlzdEl0ZXJhdG9yOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIG9uIHRoZSBzcGVjaWZpZWQgbGlzdCB0aGF0Ci0JICogZGlzYWxsb3dzIHJlbW92ZXMsIHNldHMsIGFuZCBhZGRzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0KSB7Ci0JCXRoaXMobGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBvbiB0aGUgc3BlY2lmaWVkIGxpc3QgdGhhdAotCSAqIGRpc2FsbG93cyByZW1vdmVzLCBzZXRzLCBhbmQgYWRkcy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBsaXN0SXRlcmFibGUpIHsKLQkJdGhpcyhsaXN0SXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBvbiB0aGUgc3BlY2lmaWVkIGxpc3QgaXRlcmF0b3IgdGhhdAotCSAqIGRpc2FsbG93cyByZW1vdmVzLCBzZXRzLCBhbmQgYWRkcy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBsaXN0SXRlcmF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0SXRlcmF0b3IgPSBsaXN0SXRlcmF0b3I7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLm5leHQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IucHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IubmV4dEluZGV4KCk7Ci0JfQotCi0JcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoRSBvKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChFIG8pIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SXRlcmF0b3IpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZXN1bHRTZXRJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1Jlc3VsdFNldEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NTA4OWEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1Jlc3VsdFNldEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OwotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+UmVzdWx0U2V0SXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFuIFNRTCB7QGxpbmsgUmVzdWx0U2V0fQotICogYW5kIHRyYW5zZm9ybXMgaXRzIHJvd3MgZm9yIGNsaWVudCBjb25zdW1wdGlvbi4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKLSAqIHtAbGluayAjYnVpbGROZXh0KFJlc3VsdFNldCl9IHRvIGJ1aWxkIHRoZSBleHBlY3RlZCBvYmplY3QgZnJvbQotICogdGhlIGN1cnJlbnQgcm93IG9mIHRoZSByZXN1bHQgc2V0LgotICogPHA+Ci0gKiBUbyB1c2UsIHN1cHBseTo8dWw+Ci0gKiA8bGk+IGEge0BsaW5rIFJlc3VsdFNldH0KLSAqIDxsaT4gYW4ge0BsaW5rIEFkYXB0ZXJ9IHRoYXQgY29udmVydHMgYSByb3cgaW4gdGhlIHtAbGluayBSZXN1bHRTZXR9Ci0gKiBpbnRvIHRoZSBkZXNpcmVkIG9iamVjdAotICogKGFsdGVybmF0aXZlbHksIHN1YmNsYXNzIDxjb2RlPlJlc3VsdFNldEl0ZXJhdG9yPC9jb2RlPgotICogYW5kIG92ZXJyaWRlIHRoZSB7QGxpbmsgI2J1aWxkTmV4dChSZXN1bHRTZXQpfSBtZXRob2QpCi0gKiA8L3VsPgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIGphdmEuc3FsLlJlc3VsdFNldAotICovCi1wdWJsaWMgY2xhc3MgUmVzdWx0U2V0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBSZXN1bHRTZXQgcmVzdWx0U2V0OwotCXByaXZhdGUgZmluYWwgQWRhcHRlcjxFPiBhZGFwdGVyOwotCXByaXZhdGUgRSBuZXh0OwotCXByaXZhdGUgYm9vbGVhbiBkb25lOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gdGhlIHNwZWNpZmllZCByZXN1bHQgc2V0IHRoYXQgcmV0dXJucwotCSAqIHRoZSBvYmplY3RzIHByb2R1Y2VkIGJ5IHRoZSBzcGVjaWZpZWQgYWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgUmVzdWx0U2V0SXRlcmF0b3IoUmVzdWx0U2V0IHJlc3VsdFNldCwgQWRhcHRlcjxFPiBhZGFwdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucmVzdWx0U2V0ID0gcmVzdWx0U2V0OwotCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCQl0aGlzLmRvbmUgPSBmYWxzZTsKLQkJdGhpcy5uZXh0ID0gdGhpcy5idWlsZE5leHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gdGhlIHNwZWNpZmllZCByZXN1bHQgc2V0IHRoYXQgcmV0dXJucwotCSAqIHRoZSBmaXJzdCBvYmplY3QgaW4gZWFjaCByb3cgb2YgdGhlIHJlc3VsdCBzZXQuCi0JICovCi0JcHVibGljIFJlc3VsdFNldEl0ZXJhdG9yKFJlc3VsdFNldCByZXN1bHRTZXQpIHsKLQkJdGhpcyhyZXN1bHRTZXQsIEFkYXB0ZXIuRGVmYXVsdC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCB0aGUgbmV4dCBvYmplY3QgZm9yIHRoZSBpdGVyYXRvciB0byByZXR1cm4uCi0JICogQ2xvc2UgdGhlIHJlc3VsdCBzZXQgd2hlbiB3ZSByZWFjaCB0aGUgZW5kLgotCSAqLwotCXByaXZhdGUgRSBidWlsZE5leHQoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAodGhpcy5yZXN1bHRTZXQubmV4dCgpKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGROZXh0KHRoaXMucmVzdWx0U2V0KTsKLQkJCX0KLQkJCXRoaXMucmVzdWx0U2V0LmNsb3NlKCk7Ci0JCQl0aGlzLmRvbmUgPSB0cnVlOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgcmV0dXJuIHRoZSBmaXJzdCBvYmplY3QgaW4gdGhlIGN1cnJlbnQgcm93Ci0JICogb2YgdGhlIHJlc3VsdCBzZXQuIEFueSB7QGxpbmsgU1FMRXhjZXB0aW9ufXMgd2lsbAotCSAqIGJlIGNhdWdodCBhbmQgd3JhcHBlZCBpbiBhIHtAbGluayBSdW50aW1lRXhjZXB0aW9ufS4KLQkgKi8KLQlwcm90ZWN0ZWQgRSBidWlsZE5leHQoUmVzdWx0U2V0IHJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5idWlsZE5leHQocnMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiAhIHRoaXMuZG9uZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5kb25lKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUUgdGVtcCA9IHRoaXMubmV4dDsKLQkJdGhpcy5uZXh0ID0gdGhpcy5idWlsZE5leHQoKTsKLQkJcmV0dXJuIHRlbXA7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnJlc3VsdFNldCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBVc2VkIGJ5IHtAbGluayBSZXN1bHRTZXRJdGVyYXRvcn0gdG8gY29udmVydCBhCi0JICoge0BsaW5rIFJlc3VsdFNldH0ncyBjdXJyZW50IHJvdyBpbnRvIHRoZSBuZXh0IG9iamVjdAotCSAqIHRvIGJlIHJldHVybmVkIGJ5IHRoZSB7QGxpbmsgSXRlcmF0b3J9LgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgQWRhcHRlcjxUPiB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBhbiBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgcmVzdWx0IHNldCdzCi0JCSAqICJjdXJyZW50IiByb3cuIEFueSB7QGxpbmsgU1FMRXhjZXB0aW9ufXMgd2lsbAotCQkgKiBiZSBjYXVnaHQgYW5kIHdyYXBwZWQgaW4gYSB7QGxpbmsgUnVudGltZUV4Y2VwdGlvbn0uCi0JCSAqIEBzZWUgamF2YS5zcWwuUmVzdWx0U2V0Ci0JCSAqLwotCQlUIGJ1aWxkTmV4dChSZXN1bHRTZXQgcnMpIHRocm93cyBTUUxFeGNlcHRpb247Ci0KLQotCQlmaW5hbCBjbGFzcyBEZWZhdWx0PFM+Ci0JCQlpbXBsZW1lbnRzIEFkYXB0ZXI8Uz4sIFNlcmlhbGl6YWJsZQotCQl7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBBZGFwdGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyA8Uj4gQWRhcHRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIERlZmF1bHQoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIHJldHVybiB0aGUgZmlyc3Qgb2JqZWN0IGluIHRoZSBjdXJyZW50IHJvdyBvZiB0aGUgcmVzdWx0IHNldAotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgUyBidWlsZE5leHQoUmVzdWx0U2V0IHJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJCQkvLyByZXN1bHQgc2V0IGNvbHVtbnMgYXJlIGluZGV4ZWQgc3RhcnRpbmcgd2l0aCAxCi0JCQkJcmV0dXJuIChTKSBycy5nZXRPYmplY3QoMSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCQl9Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JldmVyc2VJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JldmVyc2VJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjhiZmI0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZXZlcnNlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+UmV2ZXJzZUl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhbm90aGVyIHtAbGluayBJdGVyYXRvcn0gYW5kIHJldHVybnMKLSAqIGl0cyBlbGVtZW50cyBpbiB0aGUgcmV2ZXJzZSBvcmRlciBpbiB3aGljaCB0aGUgd3JhcHBlZCB7QGxpbmsgSXRlcmF0b3J9Ci0gKiByZXR1cm5zIHRoZSBlbGVtZW50cy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFJldmVyc2VJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQkvKioKLQkgKiBUaGUgZWxlbWVudHMgaW4gdGhpcyBpdGVyYXRvciBhcmUgYWxyZWFkeSByZXZlcnNlZC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZXZlcnNlIGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCXB1YmxpYyBSZXZlcnNlSXRlcmF0b3IoSXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKLQkJdGhpcyhDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QoaXRlcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZXZlcnNlIGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCXB1YmxpYyBSZXZlcnNlSXRlcmF0b3IoSXRlcmF0b3I8RT4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCXRoaXMoQ29sbGVjdGlvblRvb2xzLnJldmVyc2VMaXN0KGl0ZXJhdG9yLCBzaXplKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmV2ZXJzZSBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKi8KLQlwdWJsaWMgUmV2ZXJzZUl0ZXJhdG9yKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7Ci0JCXRoaXMoQ29sbGVjdGlvblRvb2xzLnJldmVyc2VMaXN0KGl0ZXJhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmV2ZXJzZSBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKi8KLQlwdWJsaWMgUmV2ZXJzZUl0ZXJhdG9yKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBpbnQgc2l6ZSkgewotCQl0aGlzKENvbGxlY3Rpb25Ub29scy5yZXZlcnNlTGlzdChpdGVyYWJsZSwgc2l6ZSkpOwotCX0KLQotCXByaXZhdGUgUmV2ZXJzZUl0ZXJhdG9yKEFycmF5TGlzdDxFPiByZXZlcnNlTGlzdCkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gcmV2ZXJzZUxpc3QuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmE3NDNkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5TaW5nbGVFbGVtZW50SXRlcmF0b3I8L2NvZGU+IGhvbGRzIGEgc2luZ2xlIGVsZW1lbnQKLSAqIGFuZCByZXR1cm5zIGl0IHdpdGggdGhlIGZpcnN0IGNhbGwgdG8ge0BsaW5rICNuZXh0KCl9LCBhdAotICogd2hpY2ggcG9pbnQgaXQgd2lsbCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGFueSBzdWJzZXF1ZW50Ci0gKiBjYWxsIHRvIHtAbGluayAjaGFzTmV4dCgpfS4KLSAqIDxwPgotICogQSA8Y29kZT5TaW5nbGVFbGVtZW50SXRlcmF0b3I8L2NvZGU+IGlzIGVxdWl2YWxlbnQgdG8gdGhlCi0gKiB7QGxpbmsgSXRlcmF0b3J9IHJldHVybmVkIGJ5OgotICogCXtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc2luZ2xldG9uKE9iamVjdCBlbGVtZW50KX08Y29kZT4uaXRlcmF0b3IoKTwvY29kZT4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgRSBlbGVtZW50OwotCXByaXZhdGUgYm9vbGVhbiBkb25lOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIG9ubHkgdGhlIHNwZWNpZmllZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBTaW5nbGVFbGVtZW50SXRlcmF0b3IoRSBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMuZG9uZSA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiAhIHRoaXMuZG9uZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5kb25lKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuZG9uZSA9IHRydWU7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNjNjZDAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+U2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjwvY29kZT4gaG9sZHMgYSBzaW5nbGUgZWxlbWVudAotICogYW5kIHJldHVybnMgaXQgd2l0aCB0aGUgZmlyc3QgY2FsbCB0byB7QGxpbmsgI25leHQoKX0sIGF0Ci0gKiB3aGljaCBwb2ludCBpdCB3aWxsIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gYW55IHN1YnNlcXVlbnQKLSAqIGNhbGwgdG8ge0BsaW5rICNoYXNOZXh0KCl9LiBMaWtld2lzZSwgaXQgd2lsbCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gKiB0byBhIGNhbGwgdG8ge0BsaW5rICNoYXNQcmV2aW91cygpfSB1bnRpbCBhIGNhbGwgdG8ge0BsaW5rICNuZXh0KCl9LAotICogYXQgd2hpY2ggcG9pbnQgYSBjYWxsIHRvIHtAbGluayAjcHJldmlvdXMoKX0gd2lsbCByZXR1cm4gdGhlCi0gKiBzaW5nbGUgZWxlbWVudC4KLSAqIDxwPgotICogQSA8Y29kZT5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPC9jb2RlPiBpcyBlcXVpdmFsZW50IHRvIHRoZQotICoge0BsaW5rIExpc3RJdGVyYXRvcn0gcmV0dXJuZWQgYnk6Ci0gKiAJe0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzaW5nbGV0b25MaXN0KE9iamVjdCBlbGVtZW50KX08Y29kZT4ubGlzdEl0ZXJhdG9yKCk8L2NvZGU+Ci0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEUgZWxlbWVudDsKLQlwcml2YXRlIGJvb2xlYW4gaGFzTmV4dDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB0aGF0IHJldHVybnMgb25seSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCi0JICovCi0JcHVibGljIFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoRSBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMuaGFzTmV4dCA9IHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuaGFzTmV4dDsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5oYXNOZXh0KSB7Ci0JCQl0aGlzLmhhc05leHQgPSBmYWxzZTsKLQkJCXJldHVybiB0aGlzLmVsZW1lbnQ7Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMuaGFzTmV4dCA/IDAgOiAxOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc05leHQ7Ci0JfQotCi0JcHVibGljIEUgcHJldmlvdXMoKSB7Ci0JCWlmICh0aGlzLmhhc05leHQpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5oYXNOZXh0ID0gdHJ1ZTsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLmhhc05leHQgPyAtMSA6IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoRSBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5lbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdGFja0l0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3RhY2tJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODEwNmQwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdGFja0l0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+U3RhY2tJdGVyYXRvcjwvY29kZT4gcHJvdmlkZXMgYW4ge0BsaW5rIEl0ZXJhdG9yfQotICogZm9yIGEge0BsaW5rIFN0YWNrfSBvZiBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4uIFRoZSBzdGFjaydzIGVsZW1lbnRzCi0gKiBhcmUge0BsaW5rIFN0YWNrI3BvcCgpIHBvcH1wZWQiIGFzIHRoZSBpdGVyYXRvciByZXR1cm5zIHRoZW0gd2l0aAotICogY2FsbHMgdG8ge0BsaW5rICNuZXh0KCl9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIFN0YWNrCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3RhY2tJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgU3RhY2tJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIFN0YWNrPEU+IHN0YWNrOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgc3RhY2suCi0JICovCi0JcHVibGljIFN0YWNrSXRlcmF0b3IoU3RhY2s8RT4gc3RhY2spIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zdGFjayA9IHN0YWNrOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiAhIHRoaXMuc3RhY2suaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXJldHVybiB0aGlzLnN0YWNrLnBvcCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5zdGFjayk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3ViSXRlcmF0b3JXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3ViSXRlcmF0b3JXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYWY3ODguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N1Ykl0ZXJhdG9yV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIFdyYXAgYW4gaXRlcmF0b3Igb24gZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMTwvY29kZT4sIGNvbnZlcnRpbmcgaXQgaW50byBhbgotICogaXRlcmF0b3Igb24gZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT4uIDxlbT5Bc3N1bWU8L2VtPiB0aGUgd3JhcHBlZAotICogaXRlcmF0b3IgcmV0dXJucyBvbmx5IGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LiBUaGUgcmVzdWx0IGlzIGEKLSAqIHtAbGluayBDbGFzc0Nhc3RFeGNlcHRpb259IGlmIHRoaXMgYXNzdW1wdGlvbiBpcyBmYWxzZS4KLSAqIDxwPgotICogVGhpcyBpcyBhIHtAbGluayBMYXRlcmFsSXRlcmF0b3JXcmFwcGVyfSB3aXRoIG1vcmUgcmVzdHJpY3RpdmUgdHlwZQotICogcGFyYW1ldGVycy4KLSAqIAotICogQHBhcmFtIDxFMT4gaW5wdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSB3cmFwcGVkIGl0ZXJhdG9yCi0gKiBAcGFyYW0gPEUyPiBvdXRwdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3ViSXRlcmFibGVXcmFwcGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJJdGVyYXRvcldyYXBwZXI8RTEsIEUyIGV4dGVuZHMgRTE+Ci0JZXh0ZW5kcyBMYXRlcmFsSXRlcmF0b3JXcmFwcGVyPEUxLCBFMj4KLXsKLQlwdWJsaWMgU3ViSXRlcmF0b3JXcmFwcGVyKEl0ZXJhYmxlPEUxPiBpdGVyYWJsZSkgewotCQlzdXBlcihpdGVyYWJsZSk7Ci0JfQotCi0JcHVibGljIFN1Ykl0ZXJhdG9yV3JhcHBlcihJdGVyYXRvcjxFMT4gaXRlcmF0b3IpIHsKLQkJc3VwZXIoaXRlcmF0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdWJMaXN0SXRlcmF0b3JXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3ViTGlzdEl0ZXJhdG9yV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjI1ZDg1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdWJMaXN0SXRlcmF0b3JXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIFdyYXAgYSBsaXN0IGl0ZXJhdG9yIG9uIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTE8L2NvZGU+LCBjb252ZXJ0aW5nIGl0IGludG8KLSAqIGEgbGlzdCBpdGVyYXRvciBvbiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPi4gPGVtPkFzc3VtZTwvZW0+IHRoZQotICogd3JhcHBlZCBsaXN0IGl0ZXJhdG9yIHJldHVybnMgb25seSBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPi4KLSAqIFRoZSByZXN1bHQgaXMgYSB7QGxpbmsgQ2xhc3NDYXN0RXhjZXB0aW9ufSBpZiB0aGlzIGFzc3VtcHRpb24gaXMgZmFsc2UuCi0gKiA8cD4KLSAqIFRoaXMgaXMgYSB7QGxpbmsgTGF0ZXJhbExpc3RJdGVyYXRvcldyYXBwZXJ9IHdpdGggbW9yZSByZXN0cmljdGl2ZSB0eXBlCi0gKiBwYXJhbWV0ZXJzLgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHdyYXBwZWQgbGlzdCBpdGVyYXRvcgotICogQHBhcmFtIDxFMj4gb3V0cHV0OiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgbGlzdCBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3ViTGlzdEl0ZXJhYmxlV3JhcHBlcgotICovCi1wdWJsaWMgY2xhc3MgU3ViTGlzdEl0ZXJhdG9yV3JhcHBlcjxFMSwgRTIgZXh0ZW5kcyBFMT4KLQlleHRlbmRzIExhdGVyYWxMaXN0SXRlcmF0b3JXcmFwcGVyPEUxLCBFMj4KLXsKLQlwdWJsaWMgU3ViTGlzdEl0ZXJhdG9yV3JhcHBlcihMaXN0PEUxPiBsaXN0KSB7Ci0JCXN1cGVyKGxpc3QpOwotCX0KLQotCXB1YmxpYyBTdWJMaXN0SXRlcmF0b3JXcmFwcGVyKExpc3RJdGVyYWJsZTxFMT4gbGlzdEl0ZXJhYmxlKSB7Ci0JCXN1cGVyKGxpc3RJdGVyYWJsZSk7Ci0JfQotCi0JcHVibGljIFN1Ykxpc3RJdGVyYXRvcldyYXBwZXIoTGlzdEl0ZXJhdG9yPEUxPiBpdGVyYXRvcikgewotCQlzdXBlcihpdGVyYXRvcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0KEUyIGUpIHsKLQkJLy8gbm8gZXhwbGljaXQgY2FzdCBuZWNlc3NhcnkKLQkJdGhpcy5saXN0SXRlcmF0b3Iuc2V0KGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZChFMiBlKSB7Ci0JCS8vIG5vIGV4cGxpY2l0IGNhc3QgbmVjZXNzYXJ5Ci0JCXRoaXMubGlzdEl0ZXJhdG9yLmFkZChlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3VwZXJJdGVyYXRvcldyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdXBlckl0ZXJhdG9yV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTQyMGZjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdXBlckl0ZXJhdG9yV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBXcmFwIGFuIGl0ZXJhdG9yIG9uIGVsZW1lbnRzIG9mIGFueSBzdWItdHlwZSBvZiA8Y29kZT5FPC9jb2RlPiwgY29udmVydGluZwotICogaXQgaW50byBhIGl0ZXJhdG9yIG9uIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4uIFRoaXMgc2hvdWxkbid0IGJlIGEKLSAqIHByb2JsZW0gc2luY2UgdGhlcmUgaXMgbm8gd2F5IHRvIGFkZCBpbnZhbGlkIGVsZW1lbnRzIHRvIHRoZSBpdGVyYXRvcidzCi0gKiBiYWNraW5nIGNvbGxlY3Rpb24uIChOb3RlIHRoZSBsYWNrIG9mIGNvbXBpbGVyIHdhcm5pbmdzLCBzdXBwcmVzc2VkIG9yCi0gKiBvdGhlcndpc2UuKQotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJJdGVyYWJsZVdyYXBwZXIKLSAqLwotcHVibGljIGNsYXNzIFN1cGVySXRlcmF0b3JXcmFwcGVyPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yOwotCi0KLQlwdWJsaWMgU3VwZXJJdGVyYXRvcldyYXBwZXIoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXRoaXMoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIFN1cGVySXRlcmF0b3JXcmFwcGVyKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRoaXMuaXRlcmF0b3IucmVtb3ZlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N1cGVyTGlzdEl0ZXJhdG9yV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N1cGVyTGlzdEl0ZXJhdG9yV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWJjOGU1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdXBlckxpc3RJdGVyYXRvcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogV3JhcCBhIGxpc3QgaXRlcmF0b3Igb24gZWxlbWVudHMgb2YgYW55IHN1Yi10eXBlIG9mIDxjb2RlPkU8L2NvZGU+LAotICogY29udmVydGluZyBpdCBpbnRvIGEgPGVtPm5vbi13cml0YWJsZTwvZW0+IGxpc3QgaXRlcmF0b3Igb24gZWxlbWVudHMgb2YgdHlwZQotICogPGNvZGU+RTwvY29kZT4uIFRoaXMgc2hvdWxkbid0IGJlIGEgcHJvYmxlbSBzaW5jZSB0aGUKLSAqIHJlc3VsdGluZyBsaXN0IGl0ZXJhdG9yIGRpc2FibGVzIHRoZSBtZXRob2RzIHRoYXQgd291bGQgcHV0IGludmFsaWQgZWxlbWVudHMKLSAqIGluIHRoZSBpdGVyYXRvcidzIGJhY2tpbmcgbGlzdCAoaS5lLiB7QGxpbmsgI3NldChPYmplY3QpfSBhbmQge0BsaW5rICNhZGQoT2JqZWN0KX0pLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTdXBlckxpc3RJdGVyYXRvcldyYXBwZXI8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBsaXN0SXRlcmF0b3I7Ci0KLQotCXB1YmxpYyBTdXBlckxpc3RJdGVyYXRvcldyYXBwZXIoTGlzdDw/IGV4dGVuZHMgRT4gbGlzdCkgewotCQl0aGlzKGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBTdXBlckxpc3RJdGVyYXRvcldyYXBwZXIoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBsaXN0SXRlcmFibGUpIHsKLQkJdGhpcyhsaXN0SXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIFN1cGVyTGlzdEl0ZXJhdG9yV3JhcHBlcihMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IGxpc3RJdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RJdGVyYXRvciA9IGxpc3RJdGVyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5uZXh0KCk7Ci0JfQotCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5uZXh0SW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0JfQotCi0JcHVibGljIEUgcHJldmlvdXMoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRoaXMubGlzdEl0ZXJhdG9yLnJlbW92ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFIGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZChFIGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SXRlcmF0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TeW5jaHJvbml6ZWRJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZmVmN2UuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogV3JhcCBhbiBpdGVyYXRvciBhbmQgc3luY2hyb25pemUgYWxsIGl0cyBtZXRob2RzIHNvIGl0IGNhbiBiZSBzYWZlbHkgc2hhcmVkCi0gKiBhbW9uZyBtdWx0aXBsZSB0aHJlYWRzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3I7Ci0KLQkvKiogT2JqZWN0IHRvIHN5bmNocm9uaXplIG9uLiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0IG11dGV4OwotCi0KLQlwdWJsaWMgU3luY2hyb25pemVkSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXRoaXMoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIFN5bmNocm9uaXplZEl0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgT2JqZWN0IG11dGV4KSB7Ci0JCXRoaXMoaXRlcmFibGUuaXRlcmF0b3IoKSwgbXV0ZXgpOwotCX0KLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl0aGlzLm11dGV4ID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgU3luY2hyb25pemVkSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBPYmplY3QgbXV0ZXgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl0aGlzLm11dGV4ID0gbXV0ZXg7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGhhc05leHQoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBFIG5leHQoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLml0ZXJhdG9yLnJlbW92ZSgpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9yKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZExpc3RJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZExpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2U2Mzg0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIFdyYXAgYSBsaXN0IGl0ZXJhdG9yIGFuZCBzeW5jaHJvbml6ZSBhbGwgaXRzIG1ldGhvZHMgc28gaXQgY2FuIGJlIHNhZmVseSBzaGFyZWQKLSAqIGFtb25nIG11bHRpcGxlIHRocmVhZHMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcjsKLQotCS8qKiBPYmplY3QgdG8gc3luY2hyb25pemUgb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbXV0ZXg7Ci0KLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3IoTGlzdDxFPiBsaXN0KSB7Ci0JCXRoaXMobGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIFN5bmNocm9uaXplZExpc3RJdGVyYXRvcihMaXN0PEU+IGxpc3QsIE9iamVjdCBtdXRleCkgewotCQl0aGlzKGxpc3QubGlzdEl0ZXJhdG9yKCksIG11dGV4KTsKLQl9Ci0KLQlwdWJsaWMgU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yKExpc3RJdGVyYWJsZTxFPiBsaXN0SXRlcmFibGUpIHsKLQkJdGhpcyhsaXN0SXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIFN5bmNocm9uaXplZExpc3RJdGVyYXRvcihMaXN0SXRlcmFibGU8RT4gbGlzdEl0ZXJhYmxlLCBPYmplY3QgbXV0ZXgpIHsKLQkJdGhpcyhsaXN0SXRlcmFibGUuaXRlcmF0b3IoKSwgbXV0ZXgpOwotCX0KLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RJdGVyYXRvciA9IGxpc3RJdGVyYXRvcjsKLQkJdGhpcy5tdXRleCA9IHRoaXM7Ci0JfQotCi0JcHVibGljIFN5bmNocm9uaXplZExpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yLCBPYmplY3QgbXV0ZXgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0SXRlcmF0b3IgPSBsaXN0SXRlcmF0b3I7Ci0JCXRoaXMubXV0ZXggPSBtdXRleDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IuaGFzTmV4dCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBFIG5leHQoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IG5leHRJbmRleCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IubmV4dEluZGV4KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIEUgcHJldmlvdXMoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBwcmV2aW91c0luZGV4KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMubGlzdEl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZChFIGUpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLmxpc3RJdGVyYXRvci5hZGQoZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0KEUgZSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMubGlzdEl0ZXJhdG9yLnNldChlKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SXRlcmF0b3IpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25JdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I2YWE0MS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25JdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotCi0KLS8qKgotICogQSA8Y29kZT5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhbm90aGVyIHtAbGluayBJdGVyYXRvcn0KLSAqIGFuZCB0cmFuc2Zvcm1zIGl0cyByZXN1bHRzIGZvciBjbGllbnQgY29uc3VtcHRpb24uIFRvIHVzZSwgc3VwcGx5IGEgCi0gKiB7QGxpbmsgVHJhbnNmb3JtZXJ9IG9yIHN1YmNsYXNzIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZC4KLSAqIE9iamVjdHMgb2YgdHlwZSA8Y29kZT5FMTwvY29kZT4gYXJlIHRyYW5zZm9ybWVkIGludG8gb2JqZWN0cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPjsKLSAqIGkuZS4gdGhlIGl0ZXJhdG9yIHJldHVybnMgb2JqZWN0cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPi4KLSAqIAotICogQHBhcmFtIDxFMT4gaW5wdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHRvIGJlIHRyYW5zZm9ybWVkCi0gKiBAcGFyYW0gPEUyPiBvdXRwdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxFMSwgRTI+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFMj4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gaXRlcmF0b3I7Ci0JcHJpdmF0ZSBmaW5hbCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBpdGVyYWJsZQotCSAqIGFuZCBhIGRpc2FibGVkIHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gaXRlcmFibGUpIHsKLQkJdGhpcyhpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYXRvcgotCSAqIGFuZCBhIGRpc2FibGVkIHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gaXRlcmF0b3IpIHsKLQkJdGhpcyhpdGVyYXRvciwgVHJhbnNmb3JtZXIuRGlzYWJsZWQuPEUxLCBFMj5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGl0ZXJhYmxlLCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcikgewotCQl0aGlzKGl0ZXJhYmxlLml0ZXJhdG9yKCksIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYXRvcgotCSAqIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRTE+IGl0ZXJhdG9yLCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLml0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgRTIgbmV4dCgpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIG5lc3RlZCBpdGVyYXRvciBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybSh0aGlzLml0ZXJhdG9yLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXRoaXMuaXRlcmF0b3IucmVtb3ZlKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgRTIgdHJhbnNmb3JtKEUxIG5leHQpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXIudHJhbnNmb3JtKG5leHQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE0NTVjZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBBIDxjb2RlPlRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhbm90aGVyIHtAbGluayBMaXN0SXRlcmF0b3J9Ci0gKiBhbmQgdHJhbnNmb3JtcyBpdHMgcmVzdWx0cyBmb3IgY2xpZW50IGNvbnN1bXB0aW9uLiBUbyB1c2UsIHN1cHBseSBhIAotICoge0BsaW5rIFRyYW5zZm9ybWVyfSBvciBzdWJjbGFzcyA8Y29kZT5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPC9jb2RlPgotICogYW5kIG92ZXJyaWRlIHRoZSB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfSBtZXRob2QuCi0gKiA8cD4KLSAqIFRoZSBtZXRob2RzIHtAbGluayAjc2V0KE9iamVjdCl9IGFuZCB7QGxpbmsgI2FkZChPYmplY3QpfQotICogYXJlIGxlZnQgdW5zdXBwb3J0ZWQgaW4gdGhpcyBjbGFzcy4KLSAqIAotICogQHBhcmFtIDxFMT4gaW5wdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHRvIGJlIHRyYW5zZm9ybWVkCi0gKiBAcGFyYW0gPEUyPiBvdXRwdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPEUxLCBFMj4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFMj4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRTE+IGxpc3RJdGVyYXRvcjsKLQlwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3QKLQkgKiBhbmQgYSBkaXNhYmxlZCB0cmFuc2Zvcm1lci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIFRyYW5zZm9ybWVyfS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IoTGlzdDw/IGV4dGVuZHMgRTE+IGxpc3QpIHsKLQkJdGhpcyhsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBsaXN0ZWQgaXRlcmF0b3IKLQkgKiBhbmQgYSBkaXNhYmxlZCB0cmFuc2Zvcm1lci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIFRyYW5zZm9ybWVyfS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gbGlzdEl0ZXJhdG9yKSB7Ci0JCXRoaXMobGlzdEl0ZXJhdG9yLCBUcmFuc2Zvcm1lci5EaXNhYmxlZC48RTEsIEUyPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdAotCSAqIGFuZCBhIGRpc2FibGVkIHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcihMaXN0SXRlcmFibGU8PyBleHRlbmRzIEUxPiBsaXN0SXRlcmFibGUpIHsKLQkJdGhpcyhsaXN0SXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IoTGlzdDw/IGV4dGVuZHMgRTE+IGxpc3QsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXRoaXMobGlzdC5saXN0SXRlcmF0b3IoKSwgdHJhbnNmb3JtZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGxpc3RJdGVyYWJsZSwgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcyhsaXN0SXRlcmFibGUuaXRlcmF0b3IoKSwgdHJhbnNmb3JtZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkIGl0ZXJhdG9yCi0JICogYW5kIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEUxPiBsaXN0SXRlcmF0b3IsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdEl0ZXJhdG9yID0gbGlzdEl0ZXJhdG9yOwotCQl0aGlzLnRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFMiBuZXh0KCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgbmVzdGVkIGl0ZXJhdG9yIGJlZm9yZSByZXR1cm5pbmcgaXQKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtKHRoaXMubGlzdEl0ZXJhdG9yLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5oYXNQcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBFMiBwcmV2aW91cygpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIG5lc3RlZCBpdGVyYXRvciBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybSh0aGlzLmxpc3RJdGVyYXRvci5wcmV2aW91cygpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoRTIgbykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoRTIgbykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJdGhpcy5saXN0SXRlcmF0b3IucmVtb3ZlKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgRTIgdHJhbnNmb3JtKEUxIG5leHQpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXIudHJhbnNmb3JtKG5leHQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubGlzdEl0ZXJhdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmVlSXRlcmF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmVlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJlNzZhYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJlZUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlRyZWVJdGVyYXRvcjwvY29kZT4gc2ltcGxpZmllcyB0aGUgdHJhdmVyc2FsIG9mIGEKLSAqIHRyZWUgb2Ygb2JqZWN0cywgd2hlcmUgdGhlIG9iamVjdHMnIHByb3RvY29sKHMpIHByb3ZpZGVzCi0gKiBhIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbgotICogbm9kZSBidXQgZG9lcyBub3QgcHJvdmlkZSBhIG1ldGhvZCBmb3IgZ2V0dGluZyBhbGwgdGhlCi0gKiBkZXNjZW5kYW50cyAoY2hpbGRyZW4sIGdyYW5kY2hpbGRyZW4sIGV0Yy4pIG9mIHRoZSBnaXZlbiBub2RlLgotICogPHA+Ci0gKiBUbyB1c2UsIHN1cHBseTo8dWw+Ci0gKiA8bGk+IGVpdGhlciB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSB0cmVlIG9yLCBpZiB0aGUgdHJlZSBoYXMKLSAqIG11bHRpcGxlIHJvb3RzLCBhbiB7QGxpbmsgSXRlcmF0b3J9IG92ZXIgdGhlIHNldCBvZiByb290cwotICogPGxpPiBhIHtAbGluayBNaWR3aWZlfSB0aGF0IGRlbGl2ZXJzIHRoZSBjaGlsZHJlbgotICogb2YgZWFjaCBjaGlsZAotICogKGFsdGVybmF0aXZlbHksIHN1YmNsYXNzIDxjb2RlPlRyZWVJdGVyYXRvcjwvY29kZT4KLSAqIGFuZCBvdmVycmlkZSB0aGUge0BsaW5rICNjaGlsZHJlbihPYmplY3QpfSBtZXRob2QpCi0gKiA8L3VsPgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJlZUl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0PEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gaXRlcmF0b3JzOwotCXByaXZhdGUgZmluYWwgTWlkd2lmZTxFPiBtaWR3aWZlOwotCXByaXZhdGUgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGN1cnJlbnRJdGVyYXRvcjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSB0cmVlCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygcm9vdHMKLQkgKiBhbmQgYSBkaXNhYmxlZCBtaWR3aWZlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjY2hpbGRyZW4oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBNaWR3aWZlfS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yKEUuLi4gcm9vdHMpIHsKLQkJdGhpcyhuZXcgQXJyYXlJdGVyYXRvcjxFPihyb290cykpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgdHJlZQotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHJvb3RzCi0JICogYW5kIGEgZGlzYWJsZWQgbWlkd2lmZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI2NoaWxkcmVuKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgTWlkd2lmZX0uCi0JICovCi0JcHVibGljIFRyZWVJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gcm9vdHMpIHsKLQkJdGhpcyhyb290cy5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIHRyZWUKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiByb290cwotCSAqIGFuZCBhIGRpc2FibGVkIG1pZHdpZmUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNjaGlsZHJlbihPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIE1pZHdpZmV9LgotCSAqLwotCXB1YmxpYyBUcmVlSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IHJvb3RzKSB7Ci0JCXRoaXMocm9vdHMsIE1pZHdpZmUuRGlzYWJsZWQuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSB0cmVlCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3QgYW5kIGEgZGlzYWJsZWQgbWlkd2lmZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI2NoaWxkcmVuKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgTWlkd2lmZX0uCi0JICovCi0JcHVibGljIFRyZWVJdGVyYXRvcihFIHJvb3QpIHsKLQkJdGhpcyhyb290LCBNaWR3aWZlLkRpc2FibGVkLjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgdHJlZQotCSAqIHdpdGggdGhlIHNwZWNpZmllZCByb290IGFuZCBtaWR3aWZlLgotCSAqLwotCXB1YmxpYyBUcmVlSXRlcmF0b3IoRSByb290LCBNaWR3aWZlPEU+IG1pZHdpZmUpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+KHJvb3QpLCBtaWR3aWZlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIHRyZWUKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMgYW5kIG1pZHdpZmUuCi0JICovCi0JcHVibGljIFRyZWVJdGVyYXRvcihFW10gcm9vdHMsIE1pZHdpZmU8RT4gbWlkd2lmZSkgewotCQl0aGlzKG5ldyBBcnJheUl0ZXJhdG9yPEU+KHJvb3RzKSwgbWlkd2lmZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSB0cmVlCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3RzIGFuZCBtaWR3aWZlLgotCSAqLwotCXB1YmxpYyBUcmVlSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+IHJvb3RzLCBNaWR3aWZlPEU+IG1pZHdpZmUpIHsKLQkJdGhpcyhyb290cy5pdGVyYXRvcigpLCBtaWR3aWZlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIHRyZWUKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMgYW5kIG1pZHdpZmUuCi0JICovCi0JcHVibGljIFRyZWVJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gcm9vdHMsIE1pZHdpZmU8RT4gbWlkd2lmZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmN1cnJlbnRJdGVyYXRvciA9IHJvb3RzOwotCQkvLyB1c2UgYSBMaW5rZWRMaXN0IHNpbmNlIHdlIHdpbGwgYmUgcHVsbGluZyBvZmYgdGhlIGZyb250IGFuZCBhZGRpbmcgdG8gdGhlIGVuZAotCQl0aGlzLml0ZXJhdG9ycyA9IG5ldyBMaW5rZWRMaXN0PEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4oKTsKLQkJdGhpcy5taWR3aWZlID0gbWlkd2lmZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlpZiAodGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciA6IHRoaXMuaXRlcmF0b3JzKSB7Ci0JCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLmN1cnJlbnRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiB0aGlzLm5leHRJbnRlcm5hbCgpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8SXRlcmF0b3I8PyBleHRlbmRzIEU+PiBzdHJlYW0gPSB0aGlzLml0ZXJhdG9ycy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMuY3VycmVudEl0ZXJhdG9yID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmICh0aGlzLmN1cnJlbnRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5uZXh0SW50ZXJuYWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBGZXRjaCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5leHQgbm9kZSBiZWZvcmUgcmV0dXJuaW5nIGl0LgotCSAqLwotCXByaXZhdGUgRSBuZXh0SW50ZXJuYWwoKSB7Ci0JCUUgbmV4dCA9IHRoaXMuY3VycmVudEl0ZXJhdG9yLm5leHQoKTsKLQkJdGhpcy5pdGVyYXRvcnMuYWRkKHRoaXMuY2hpbGRyZW4obmV4dCkpOwotCQlyZXR1cm4gbmV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRoaXMuY3VycmVudEl0ZXJhdG9yLnJlbW92ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBNaWR3aWZlfS4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGNoaWxkcmVuKEUgbmV4dCkgewotCQlyZXR1cm4gdGhpcy5taWR3aWZlLmNoaWxkcmVuKG5leHQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY3VycmVudEl0ZXJhdG9yKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKiBpbm5lciBjbGFzc2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIFVzZWQgYnkge0BsaW5rIFRyZWVJdGVyYXRvcn0gdG8gcmV0cmlldmUKLQkgKiB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIGEgbm9kZSBpbiB0aGUgdHJlZS4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIE1pZHdpZmU8VD4gewotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkJICovCi0JCUl0ZXJhdG9yPD8gZXh0ZW5kcyBUPiBjaGlsZHJlbihUIG8pOwotCi0KLQkJZmluYWwgY2xhc3MgTnVsbDxTPiBpbXBsZW1lbnRzCi0JCQlNaWR3aWZlPFM+LCBTZXJpYWxpemFibGUKLQkJewotCQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgTWlkd2lmZSBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IE1pZHdpZmU8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyByZXR1cm4gbm8gbmVpZ2hib3JzCi0JCQlwdWJsaWMgSXRlcmF0b3I8Uz4gY2hpbGRyZW4oUyBuZXh0KSB7Ci0JCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJCX0KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIG1pZHdpZmUgdXNlZCB3aGVuIHRoZSB7QGxpbmsgVHJlZUl0ZXJhdG9yI2NoaWxkcmVuKE9iamVjdCl9Ci0JCSAqIG1ldGhvZCBpcyBvdmVycmlkZGVuLgotCQkgKi8KLQkJZmluYWwgY2xhc3MgRGlzYWJsZWQ8Uz4KLQkJCWltcGxlbWVudHMgTWlkd2lmZTxTPiwgU2VyaWFsaXphYmxlCi0JCXsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIE1pZHdpZmUgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyA8Uj4gTWlkd2lmZTxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIERpc2FibGVkKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJCXB1YmxpYyBJdGVyYXRvcjxTPiBjaGlsZHJlbihTIG5leHQpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgIC8vIFRyZWVJdGVyYXRvci5jaGlsZHJlbihPYmplY3QpIHdhcyBub3QgaW1wbGVtZW50ZWQKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJCX0KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdE1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZDFkYzYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvQWJzdHJhY3RNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFJlYXNvbmFibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBNb2RlbH0gcHJvdG9jb2wKLSAqIHdpdGggbnVtZXJvdXMgY29udmVuaWVuY2UgbWV0aG9kcy4KLSAqIAotICogQHNlZSBDaGFuZ2VTdXBwb3J0Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBNb2RlbAotewotCS8qKgotCSAqIERlbGVnYXRlIHN0YXRlL3Byb3BlcnR5L2NvbGxlY3Rpb24vbGlzdC90cmVlIGNoYW5nZSBzdXBwb3J0IHRvIHRoaXMKLQkgKiBoZWxwZXIgb2JqZWN0LiBUaGUgY2hhbmdlIHN1cHBvcnQgb2JqZWN0IGlzIDxlbT5sYXppbHktaW5pdGlhbGl6ZWQ8L2VtPjsKLQkgKiBzbyBpdCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uIFRoZSBtZXRob2Qge0BsaW5rICNnZXRDaGFuZ2VTdXBwb3J0KCl9Ci0JICogd2lsbCBpbml0aWFsaXplIHRoaXMgZmllbGQgaWYgaXQgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gV2UgaW5zdGFudGlhdGUgdGhpcyB3aGVuIHdlIGZpcmUgZXZlbnRzLCBldmVuIHdoZW4KLQkgKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzICh3aGljaCBpcyBiZSBpbXBsaWVkIGlmIHRoaXMgaXMgPGNvZGU+bnVsbDwvY29kZT4pLgotCSAqIFRoaXMgYWxsb3dzIHRoZSBjaGFuZ2Ugc3VwcG9ydCB0byBoYXZlIGJlaGF2aW9yIHRpZWQgdG8gZXZlbnRzIGV2ZW4gd2hlbgotCSAqIHdlIGhhdmUgbm8gbGlzdGVuZXJzLgotCSAqIAotCSAqIEBzZWUgQXNwZWN0Q2hhbmdlU3VwcG9ydCNhc3BlY3RDaGFuZ2VkKFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBjaGFuZ2VTdXBwb3J0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdE1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWNjZXNzb3Igd2lsbCBidWlsZCB0aGUgY2hhbmdlIHN1cHBvcnQgd2hlbiByZXF1aXJlZC4KLQkgKiBUaGlzIG9ubHkgaGVscHMgcmVkdWNlIHRoZSBmb290cHJpbnQgb2YgYSBtb2RlbCB0aGF0IG5laXRoZXIgaGFzIGFueQotCSAqIGxpc3RlbmVycyBhZGRlZCB0byBpdCBub3IgZXZlciBjaGFuZ2VzIChmaXJlcyBhbnkgZXZlbnRzKS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIENoYW5nZVN1cHBvcnQgZ2V0Q2hhbmdlU3VwcG9ydCgpIHsKLQkJaWYgKHRoaXMuY2hhbmdlU3VwcG9ydCA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoYW5nZVN1cHBvcnQgPSB0aGlzLmJ1aWxkQ2hhbmdlU3VwcG9ydCgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoYW5nZVN1cHBvcnQ7Ci0JfQotCi0JLyoqCi0JICogQWxsb3cgc3ViY2xhc3NlcyB0byB0d2VhayB0aGUgY2hhbmdlIHN1cHBvcnQgdXNlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlU3VwcG9ydCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2FkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNoYXNBbnlDaGFuZ2VMaXN0ZW5lcnMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueUNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuICh0aGlzLmNoYW5nZVN1cHBvcnQgIT0gbnVsbCkgJiYgdGhpcy5jaGFuZ2VTdXBwb3J0Lmhhc0FueUNoYW5nZUxpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtb2RlbCBoYXMgbm8gY2hhbmdlIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOb0NoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNBbnlDaGFuZ2VMaXN0ZW5lcnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGUgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2FkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2hhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuICh0aGlzLmNoYW5nZVN1cHBvcnQgIT0gbnVsbCkgJiYgdGhpcy5jaGFuZ2VTdXBwb3J0Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBubyBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZVN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlU3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZVN0YXRlQ2hhbmdlZCgpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVN0YXRlQ2hhbmdlZCgpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0eSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNoYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gKHRoaXMuY2hhbmdlU3VwcG9ydCAhPSBudWxsKSAmJiB0aGlzLmNoYW5nZVN1cHBvcnQuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIG5vIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVQcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBmaXJlUHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZywgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nLCBpbnQsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcsIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsaWVkIDxjb2RlPm51bGw8L2NvZGU+ICJvbGQiIHZhbHVlLgotCSAqIEBzZWUgI2ZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nLCBPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlyZXR1cm4gdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbnVsbCwgbmV3VmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNhZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNoYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gKHRoaXMuY2hhbmdlU3VwcG9ydCAhPSBudWxsKSAmJiB0aGlzLmNoYW5nZVN1cHBvcnQuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBubyBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZUl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtc0FkZGVkKFN0cmluZywgQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBmaXJlSXRlbXNBZGRlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gYWRkZWRJdGVtcykgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zQWRkZWQoY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbUFkZGVkKFN0cmluZywgT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtQWRkZWQoY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGZpcmVJdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZUl0ZW1zUmVtb3ZlZChTdHJpbmcsIENvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZUl0ZW1zUmVtb3ZlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gcmVtb3ZlZEl0ZW1zKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNSZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbVJlbW92ZWQoU3RyaW5nLCBPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUl0ZW1SZW1vdmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IHJlbW92ZWRJdGVtKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlQ29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVDb2xsZWN0aW9uQ2xlYXJlZChTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUNvbGxlY3Rpb25DbGVhcmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlQ29sbGVjdGlvbkNsZWFyZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVDb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlQ29sbGVjdGlvbkNoYW5nZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKGNvbGxlY3Rpb25OYW1lLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkSXRlbVRvQ29sbGVjdGlvbihPYmplY3QsIENvbGxlY3Rpb24sIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbVRvQ29sbGVjdGlvbihFIGl0ZW0sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRJdGVtVG9Db2xsZWN0aW9uKGl0ZW0sIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkSXRlbXNUb0NvbGxlY3Rpb24oT2JqZWN0W10sIENvbGxlY3Rpb24sIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0NvbGxlY3Rpb24oRVtdIGl0ZW1zLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkSXRlbXNUb0NvbGxlY3Rpb24oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkSXRlbXNUb0NvbGxlY3Rpb24oQ29sbGVjdGlvbiwgQ29sbGVjdGlvbiwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvQ29sbGVjdGlvbihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBpdGVtcywgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2FkZEl0ZW1zVG9Db2xsZWN0aW9uKEl0ZXJhYmxlLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9Db2xsZWN0aW9uKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcywgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2FkZEl0ZW1zVG9Db2xsZWN0aW9uKEl0ZXJhdG9yLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9Db2xsZWN0aW9uKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVtcywgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihPYmplY3QsIENvbGxlY3Rpb24sIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oT2JqZWN0IGl0ZW0sIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oaXRlbSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKE9iamVjdFtdLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihPYmplY3RbXSBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihDb2xsZWN0aW9uLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihDb2xsZWN0aW9uPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKEl0ZXJhYmxlLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihJdGVyYWJsZTw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihJdGVyYXRvciwgQ29sbGVjdGlvbiwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oSXRlcmF0b3I8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKE9iamVjdFtdLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oT2JqZWN0W10gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZXRhaW5JdGVtc0luQ29sbGVjdGlvbihDb2xsZWN0aW9uLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oQ29sbGVjdGlvbjw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKEl0ZXJhYmxlLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oSXRlcmFibGU8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZXRhaW5JdGVtc0luQ29sbGVjdGlvbihJdGVyYXRvciwgQ29sbGVjdGlvbiwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKEl0ZXJhdG9yPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjY2xlYXJDb2xsZWN0aW9uKENvbGxlY3Rpb24sIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbGVhckNvbGxlY3Rpb24oQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmNsZWFyQ29sbGVjdGlvbihjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3N5bmNocm9uaXplQ29sbGVjdGlvbihDb2xsZWN0aW9uLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIHN5bmNocm9uaXplQ29sbGVjdGlvbihDb2xsZWN0aW9uPEU+IG5ld0NvbGxlY3Rpb24sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zeW5jaHJvbml6ZUNvbGxlY3Rpb24obmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNzeW5jaHJvbml6ZUNvbGxlY3Rpb24oSXRlcmFibGUsIENvbGxlY3Rpb24sIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gc3luY2hyb25pemVDb2xsZWN0aW9uKEl0ZXJhYmxlPEU+IG5ld0NvbGxlY3Rpb24sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zeW5jaHJvbml6ZUNvbGxlY3Rpb24obmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNzeW5jaHJvbml6ZUNvbGxlY3Rpb24oSXRlcmF0b3IsIENvbGxlY3Rpb24sIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gc3luY2hyb25pemVDb2xsZWN0aW9uKEl0ZXJhdG9yPEU+IG5ld0NvbGxlY3Rpb24sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zeW5jaHJvbml6ZUNvbGxlY3Rpb24obmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBMaXN0Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBMaXN0Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNoYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gKHRoaXMuY2hhbmdlU3VwcG9ydCAhPSBudWxsKSAmJiB0aGlzLmNoYW5nZVN1cHBvcnQuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBubyBsaXN0IGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIGxpc3QgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbXNBZGRlZChMaXN0QWRkRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZUl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtc0FkZGVkKFN0cmluZywgaW50LCBMaXN0KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGZpcmVJdGVtc0FkZGVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IGFkZGVkSXRlbXMpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc0FkZGVkKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtQWRkZWQoU3RyaW5nLCBpbnQsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbUFkZGVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtQWRkZWQobGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBmaXJlSXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtc1JlbW92ZWQoU3RyaW5nLCBpbnQsIExpc3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZUl0ZW1zUmVtb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiByZW1vdmVkSXRlbXMpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc1JlbW92ZWQobGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbVJlbW92ZWQoU3RyaW5nLCBpbnQsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbVJlbW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCByZW1vdmVkSXRlbSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbVJlbW92ZWQobGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZUl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbXNSZXBsYWNlZChTdHJpbmcsIGludCwgTGlzdCwgTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPEU+IGJvb2xlYW4gZmlyZUl0ZW1zUmVwbGFjZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8PyBleHRlbmRzIEU+IG5ld0l0ZW1zLCBMaXN0PEU+IHJlcGxhY2VkSXRlbXMpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc1JlcGxhY2VkKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbXMsIHJlcGxhY2VkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbVJlcGxhY2VkKFN0cmluZywgaW50LCBPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBmaXJlSXRlbVJlcGxhY2VkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgbmV3SXRlbSwgT2JqZWN0IHJlcGxhY2VkSXRlbSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1SZXBsYWNlZChsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW0sIHJlcGxhY2VkSXRlbSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZUl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zTW92ZWQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbXNNb3ZlZChTdHJpbmcsIGludCwgaW50LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxFPiBib29sZWFuIGZpcmVJdGVtc01vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc01vdmVkKGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtTW92ZWQoU3RyaW5nLCBpbnQsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBmaXJlSXRlbU1vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtTW92ZWQobGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVMaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlTGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUxpc3RDbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZUxpc3RDbGVhcmVkKFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlTGlzdENsZWFyZWQoU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVMaXN0Q2xlYXJlZChsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlTGlzdENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVMaXN0Q2hhbmdlZChTdHJpbmcgbGlzdE5hbWUsIExpc3Q8Pz4gbGlzdCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlTGlzdENoYW5nZWQobGlzdE5hbWUsIGxpc3QpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNhZGRJdGVtVG9MaXN0KGludCwgT2JqZWN0LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiB2b2lkIGFkZEl0ZW1Ub0xpc3QoaW50IGluZGV4LCBFIGl0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGl0ZW0sIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkSXRlbVRvTGlzdChPYmplY3QsIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbVRvTGlzdChFIGl0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRJdGVtVG9MaXN0KGl0ZW0sIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkSXRlbXNUb0xpc3QoaW50LCBPYmplY3RbXSwgTGlzdCwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChpbnQgaW5kZXgsIEVbXSBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGluZGV4LCBpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNhZGRJdGVtc1RvTGlzdChpbnQsIENvbGxlY3Rpb24sIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGluZGV4LCBpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNhZGRJdGVtc1RvTGlzdChpbnQsIEl0ZXJhYmxlLCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KGludCBpbmRleCwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkSXRlbXNUb0xpc3QoaW5kZXgsIGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2FkZEl0ZW1zVG9MaXN0KGludCwgSXRlcmF0b3IsIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoaW50IGluZGV4LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRJdGVtc1RvTGlzdChpbmRleCwgaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkSXRlbXNUb0xpc3QoT2JqZWN0W10sIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoRVtdIGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkSXRlbXNUb0xpc3QoaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkSXRlbXNUb0xpc3QoQ29sbGVjdGlvbiwgTGlzdCwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2FkZEl0ZW1zVG9MaXN0KEl0ZXJhYmxlLCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2FkZEl0ZW1zVG9MaXN0KEl0ZXJhdG9yLCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlbW92ZUl0ZW1Gcm9tTGlzdChpbnQsIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IEUgcmVtb3ZlSXRlbUZyb21MaXN0KGludCBpbmRleCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVJdGVtRnJvbUxpc3QoT2JqZWN0LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbUZyb21MaXN0KE9iamVjdCBpdGVtLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbUZyb21MaXN0KGl0ZW0sIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjcmVtb3ZlUmFuZ2VGcm9tTGlzdChpbnQsIGludCwgTGlzdCwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCA8RT4gTGlzdDxFPiByZW1vdmVSYW5nZUZyb21MaXN0KGludCBiZWdpbkluZGV4LCBpbnQgZW5kSW5kZXgsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVSYW5nZUZyb21MaXN0KGJlZ2luSW5kZXgsIGVuZEluZGV4LCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlbW92ZUl0ZW1zRnJvbUxpc3QoaW50LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBMaXN0PEU+IHJlbW92ZUl0ZW1zRnJvbUxpc3QoaW50IGluZGV4LCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbXNGcm9tTGlzdChpbmRleCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVJdGVtc0Zyb21MaXN0KGludCwgaW50LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBMaXN0PEU+IHJlbW92ZUl0ZW1zRnJvbUxpc3QoaW50IGluZGV4LCBpbnQgbGVuZ3RoLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbXNGcm9tTGlzdChpbmRleCwgbGVuZ3RoLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlbW92ZUl0ZW1zRnJvbUxpc3QoT2JqZWN0W10sIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21MaXN0KE9iamVjdFtdIGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbXNGcm9tTGlzdChpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVJdGVtc0Zyb21MaXN0KENvbGxlY3Rpb24sIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21MaXN0KENvbGxlY3Rpb248Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVJdGVtc0Zyb21MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlbW92ZUl0ZW1zRnJvbUxpc3QoSXRlcmFibGUsIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21MaXN0KEl0ZXJhYmxlPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbXNGcm9tTGlzdChpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVJdGVtc0Zyb21MaXN0KEl0ZXJhdG9yLCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tTGlzdChJdGVyYXRvcjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1zRnJvbUxpc3QoaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjcmV0YWluSXRlbXNJbkxpc3QoT2JqZWN0W10sIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChPYmplY3RbXSBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJldGFpbkl0ZW1zSW5MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JldGFpbkl0ZW1zSW5MaXN0KENvbGxlY3Rpb24sIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChDb2xsZWN0aW9uPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmV0YWluSXRlbXNJbkxpc3QoaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjcmV0YWluSXRlbXNJbkxpc3QoSXRlcmFibGUsIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChJdGVyYWJsZTw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJldGFpbkl0ZW1zSW5MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JldGFpbkl0ZW1zSW5MaXN0KEl0ZXJhdG9yLCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkxpc3QoSXRlcmF0b3I8Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZXRhaW5JdGVtc0luTGlzdChpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNzZXRJdGVtSW5MaXN0KGludCwgT2JqZWN0LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBFIHNldEl0ZW1Jbkxpc3QoaW50IGluZGV4LCBFIGl0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zZXRJdGVtSW5MaXN0KGluZGV4LCBpdGVtLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlcGxhY2VJdGVtSW5MaXN0KE9iamVjdCwgT2JqZWN0LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBpbnQgcmVwbGFjZUl0ZW1Jbkxpc3QoRSBvbGRJdGVtLCBFIG5ld0l0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZXBsYWNlSXRlbUluTGlzdChvbGRJdGVtLCBuZXdJdGVtLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3NldEl0ZW1zSW5MaXN0KGludCwgT2JqZWN0W10sIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IExpc3Q8RT4gc2V0SXRlbXNJbkxpc3QoaW50IGluZGV4LCBFW10gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zZXRJdGVtc0luTGlzdChpbmRleCwgaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjc2V0SXRlbXNJbkxpc3QoaW50LCBMaXN0LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBMaXN0PEU+IHNldEl0ZW1zSW5MaXN0KGludCBpbmRleCwgTGlzdDw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zZXRJdGVtc0luTGlzdChpbmRleCwgaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjbW92ZUl0ZW1zSW5MaXN0KGludCwgaW50LCBpbnQsIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IHZvaWQgbW92ZUl0ZW1zSW5MaXN0KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5tb3ZlSXRlbXNJbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjbW92ZUl0ZW1Jbkxpc3QoaW50LCBpbnQsIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IHZvaWQgbW92ZUl0ZW1Jbkxpc3QoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLm1vdmVJdGVtSW5MaXN0KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNtb3ZlSXRlbUluTGlzdChpbnQsIE9iamVjdCwgTGlzdCwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCA8RT4gdm9pZCBtb3ZlSXRlbUluTGlzdChpbnQgdGFyZ2V0SW5kZXgsIEUgaXRlbSwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkubW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIGl0ZW0sIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjY2xlYXJMaXN0KExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbGVhckxpc3QoTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmNsZWFyTGlzdChsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3N5bmNocm9uaXplTGlzdChMaXN0LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIHN5bmNocm9uaXplTGlzdChMaXN0PD8gZXh0ZW5kcyBFPiBuZXdMaXN0LCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuc3luY2hyb25pemVMaXN0KG5ld0xpc3QsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjc3luY2hyb25pemVMaXN0KEl0ZXJhYmxlLCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIHN5bmNocm9uaXplTGlzdChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gbmV3TGlzdCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnN5bmNocm9uaXplTGlzdChuZXdMaXN0LCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3N5bmNocm9uaXplTGlzdChJdGVyYXRvciwgTGlzdCwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBzeW5jaHJvbml6ZUxpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IG5ld0xpc3QsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zeW5jaHJvbml6ZUxpc3QobmV3TGlzdCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmVlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNhZGRUcmVlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBUcmVlQ2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFN0cmluZyB0cmVlTmFtZSwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBUcmVlQ2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFN0cmluZyB0cmVlTmFtZSwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNoYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFN0cmluZyB0cmVlTmFtZSkgewotCQlyZXR1cm4gKHRoaXMuY2hhbmdlU3VwcG9ydCAhPSBudWxsKSAmJiB0aGlzLmNoYW5nZVN1cHBvcnQuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyh0cmVlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBubyB0cmVlIGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIHRyZWUgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTm9UcmVlQ2hhbmdlTGlzdGVuZXJzKFN0cmluZyB0cmVlTmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnModHJlZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlTm9kZUFkZGVkKFRyZWVBZGRFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlTm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlTm9kZUFkZGVkKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZU5vZGVBZGRlZChTdHJpbmcsIExpc3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZU5vZGVBZGRlZChTdHJpbmcgdHJlZU5hbWUsIExpc3Q8Pz4gcGF0aCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlTm9kZUFkZGVkKHRyZWVOYW1lLCBwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZU5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlTm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVOb2RlUmVtb3ZlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVOb2RlUmVtb3ZlZChTdHJpbmcsIExpc3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZU5vZGVSZW1vdmVkKFN0cmluZyB0cmVlTmFtZSwgTGlzdDw/PiBwYXRoKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVOb2RlUmVtb3ZlZCh0cmVlTmFtZSwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVUcmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlVHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVRyZWVDbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZVRyZWVDbGVhcmVkKFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlVHJlZUNsZWFyZWQoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVUcmVlQ2xlYXJlZCh0cmVlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVUcmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlVHJlZUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlVHJlZUNoYW5nZWQoU3RyaW5nLCBDb2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVUcmVlQ2hhbmdlZChTdHJpbmcgdHJlZU5hbWUsIENvbGxlY3Rpb248Pz4gbm9kZXMpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVRyZWVDaGFuZ2VkKHRyZWVOYW1lLCBub2Rlcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB2YWx1ZXMgYXJlIGVxdWFsLCB3aXRoIHRoZSBhcHByb3ByaWF0ZSA8Y29kZT5udWxsPC9jb2RlPiBjaGVja3MuCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGF0dHJpYnV0ZSB2YWx1ZSBoYXMgY2hhbmdlZC4KLQkgKiA8cD4KLQkgKiA8ZW0+RG8gbm90PC9lbT4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gZmlyZSBhIGNoYW5nZSBub3RpZmljYXRpb24sCi0JICoge0BsaW5rIENoYW5nZVN1cHBvcnR9IGFscmVhZHkgZG9lcyB0aGF0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHZhbHVlc0FyZUVxdWFsKE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnZhbHVlc0FyZUVxdWFsKHZhbHVlMSwgdmFsdWUyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlICN2YWx1ZXNBcmVFcXVhbChPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVzQXJlRXF1YWwob2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQotCS8qKgotCSAqIDxlbT5EbyBub3Q8L2VtPiB1c2UgdGhpcyB0byBkZXRlcm1pbmUgd2hldGhlciB0byBmaXJlIGEgY2hhbmdlIG5vdGlmaWNhdGlvbiwKLQkgKiB7QGxpbmsgQ2hhbmdlU3VwcG9ydH0gYWxyZWFkeSBkb2VzIHRoYXQuCi0JICogPHA+Ci0JICogRm9yIGV4YW1wbGUsIGFmdGVyIGZpcmluZyB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiwgeW91IGNhbiB1c2UgdGhpcyBtZXRob2QKLQkgKiB0byBkZWNpZGUgaWYgc29tZSBvdGhlciwgcmVsYXRlZCwgcGllY2Ugb2Ygc3RhdGUgbmVlZHMgdG8gYmUgc3luY2hyb25pemVkCi0JICogd2l0aCB0aGUgc3RhdGUgdGhhdCBqdXN0IGNoYW5nZWQuCi0JICogCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3ZhbHVlc0FyZURpZmZlcmVudChPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiB2YWx1ZXNBcmVEaWZmZXJlbnQoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkudmFsdWVzQXJlRGlmZmVyZW50KHZhbHVlMSwgdmFsdWUyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlICN2YWx1ZXNBcmVEaWZmZXJlbnQoT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlc0FyZURpZmZlcmVudChvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsdGhvdWdoIGNsb25pbmcgbW9kZWxzIGlzIHVzdWFsbHkgbm90IGEgR29vZCBJZGVhLAotCSAqIHdlIHNob3VsZCBhdCBsZWFzdCBzdXBwb3J0IGl0IHByb3Blcmx5LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdE1vZGVsIGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RNb2RlbCBjbG9uZSA9IChBYnN0cmFjdE1vZGVsKSBzdXBlci5jbG9uZSgpOwotCQkvLyBjbGVhciBvdXQgY2hhbmdlIHN1cHBvcnQgLSBtb2RlbHMgZG8gbm90IHNoYXJlIGxpc3RlbmVycwotCQljbG9uZS5jaGFuZ2VTdXBwb3J0ID0gbnVsbDsKLQkJcmV0dXJuIGNsb25lOwotCX0KLQotCS8qKgotCSAqIGUuZy4gPGNvZGU+IkNsYXNzTmFtZVswMC1GMy1FRS00Ml0oYWRkJ2wgaW5mbykiPC9jb2RlPgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5hcHBlbmRTaW1wbGVUb1N0cmluZyhzYiwgdGhpcyk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlpbnQgbGVuID0gc2IubGVuZ3RoKCk7Ci0JCXRoaXMudG9TdHJpbmcoc2IpOwotCQlpZiAoc2IubGVuZ3RoKCkgPT0gbGVuKSB7Ci0JCQlzYi5kZWxldGVDaGFyQXQobGVuIC0gMSk7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQoJyknKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBwdWJsaWMgc28gb25lIG1vZGVsIGNhbiBjYWxsIGEgbmVzdGVkIGFic3RyYWN0IG1vZGVsJ3MKLQkgKiA8Y29kZT4jdG9TdHJpbmcoU3RyaW5nQnVpbGRlcik8L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCS8vIHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgdG8gZG8gc29tZXRoaW5nIGEgYml0IG1vcmUgaGVscGZ1bAotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL0FzcGVjdENoYW5nZVN1cHBvcnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL0FzcGVjdENoYW5nZVN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk4ZjQ0My4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9Bc3BlY3RDaGFuZ2VTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLQotLyoqCi0gKiBUaGlzIGNoYW5nZSBzdXBwb3J0IGNsYXNzIHdpbGwgbm90aWZ5IGxpc3RlbmVycyB3aGVuZXZlciBvbmUgb2YgdGhlIHNvdXJjZSdzCi0gKiBhc3BlY3RzIGhhcyBjaGFuZ2VkLiBPbmx5IHRoZSBhc3BlY3QgbmFtZSBpcyBwYXNzZWQgdG8gdGhlIGxpc3RlbmVyOyBubwotICogZXZlbnQgaXMgZ2VuZXJhdGVkLiBUaGlzIGFsbG93cyB0aGUgbGlzdGVuZXJzIHRvIGRlbGVnYXRlIHRvIHRoZSBjaGFuZ2UKLSAqIHN1cHBvcnQgb2JqZWN0IHZlcmlmaWNhdGlvbiB0aGF0IGFuIGFzcGVjdCBhcyBhY3R1YWxseSBjaGFuZ2VkLiBUaGlzIGlzCi0gKiB1c2VmdWwgZm9yIHNpbXBsZSB0aGluZ3MgbGlrZSBzZXR0aW5nIGRpcnR5IGZsYWdzLCBibGFua2V0IHZhbGlkYXRpb24sIGFuZAotICogYmxhbmtldCBzeWNocm9uaXphdGlvbjsgaS5lLiB0aGluZ3MgdGhhdCBtaWdodCBiZSBpbnRlcmVzdGVkIGluIHRoZSA8ZW0+bmFtZTwvZW0+Ci0gKiBvZiB0aGUgYXNwZWN0IHRoYXQgY2hhbmdlZCBidXQgbm90IHNvIG11Y2ggPGVtPmhvdzwvZW0+IHRoZSBhc3BlY3QgY2hhbmdlZC4KLSAqLwotcHVibGljIGNsYXNzIEFzcGVjdENoYW5nZVN1cHBvcnQKLQlleHRlbmRzIENoYW5nZVN1cHBvcnQKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RlbmVyPiBMSVNURU5FUl9DTEFTUyA9IExpc3RlbmVyLmNsYXNzOwotCi0KLQlwdWJsaWMgQXNwZWN0Q2hhbmdlU3VwcG9ydChNb2RlbCBzb3VyY2UsIExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMoc291cmNlKTsKLQkJdGhpcy5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIEFzcGVjdENoYW5nZVN1cHBvcnQoTW9kZWwgc291cmNlKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYXNwZWN0Q2hhbmdlZChTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlJdGVyYWJsZTxMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0ZW5lcnMoKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJbGlzdGVuZXIuYXNwZWN0Q2hhbmdlZChhc3BlY3ROYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuYWRkTGlzdGVuZXIoTElTVEVORVJfQ0xBU1MsIGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKExJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJzKCkgewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0TGlzdGVuZXJMaXN0KCk7Ci0JCXJldHVybiAobGlzdGVuZXJMaXN0ID09IG51bGwpID8gbnVsbCA6IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJMaXN0KCkgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0ZW5lckxpc3QoTElTVEVORVJfQ0xBU1MpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogTGlzdGVuZXIgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIG9mIGFueSBhc3BlY3QgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0KLQkJLyoqCi0JCSAqIFRoZSBzcGVjaWZpZWQgYXNwZWN0IGNoYW5nZWQuCi0JCSAqLwotCQl2b2lkIGFzcGVjdENoYW5nZWQoU3RyaW5nIGFzcGVjdE5hbWUpOwotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlU3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoKSB7Ci0JCXN1cGVyLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0eSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkXyhQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZWRfKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkXyhTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2VkXyhwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWRfKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZWRfKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZF8oU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBvbGRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2VkXyhwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc0FkZGVkXyhDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZUl0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc0FkZGVkXyhTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gYWRkZWRJdGVtcykgewotCQlzdXBlci5maXJlSXRlbXNBZGRlZF8oY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbXMpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0JCXN1cGVyLmZpcmVJdGVtQWRkZWQoY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbSk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZF8oQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVJdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc1JlbW92ZWRfKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiByZW1vdmVkSXRlbXMpIHsKLQkJc3VwZXIuZmlyZUl0ZW1zUmVtb3ZlZF8oY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtcyk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1SZW1vdmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IHJlbW92ZWRJdGVtKSB7Ci0JCXN1cGVyLmZpcmVJdGVtUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW0pOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlQ29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DbGVhcmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlzdXBlci5maXJlQ29sbGVjdGlvbkNsZWFyZWQoY29sbGVjdGlvbk5hbWUpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2hhbmdlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlzdXBlci5maXJlQ29sbGVjdGlvbkNoYW5nZWQoY29sbGVjdGlvbk5hbWUsIGNvbGxlY3Rpb24pOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc0FkZGVkXyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZUl0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldExpc3ROYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc0FkZGVkXyhTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiBhZGRlZEl0ZW1zKSB7Ci0JCXN1cGVyLmZpcmVJdGVtc0FkZGVkXyhsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbXMpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQobGlzdE5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBhZGRlZEl0ZW0pIHsKLQkJc3VwZXIuZmlyZUl0ZW1BZGRlZChsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbSk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZF8oTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVJdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldExpc3ROYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc1JlbW92ZWRfKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IHJlbW92ZWRJdGVtcykgewotCQlzdXBlci5maXJlSXRlbXNSZW1vdmVkXyhsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtcyk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1SZW1vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgcmVtb3ZlZEl0ZW0pIHsKLQkJc3VwZXIuZmlyZUl0ZW1SZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW0pOwotCQl0aGlzLmFzcGVjdENoYW5nZWQobGlzdE5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc1JlcGxhY2VkXyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVJdGVtc1JlcGxhY2VkXyhldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRMaXN0TmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNSZXBsYWNlZF8oU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gbmV3SXRlbXMsIExpc3Q8Pz4gcmVwbGFjZWRJdGVtcykgewotCQlzdXBlci5maXJlSXRlbXNSZXBsYWNlZF8obGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtcywgcmVwbGFjZWRJdGVtcyk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1SZXBsYWNlZF8oU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBuZXdJdGVtLCBPYmplY3QgcmVwbGFjZWRJdGVtKSB7Ci0JCXN1cGVyLmZpcmVJdGVtUmVwbGFjZWRfKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbSwgcmVwbGFjZWRJdGVtKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNNb3ZlZF8oTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlSXRlbXNNb3ZlZF8oZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zTW92ZWRfKFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJc3VwZXIuZmlyZUl0ZW1zTW92ZWRfKGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVMaXN0Q2xlYXJlZChldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRMaXN0TmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENsZWFyZWQoU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXN1cGVyLmZpcmVMaXN0Q2xlYXJlZChsaXN0TmFtZSk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlTGlzdENoYW5nZWQoZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKFN0cmluZyBsaXN0TmFtZSwgTGlzdDw/PiBsaXN0KSB7Ci0JCXN1cGVyLmZpcmVMaXN0Q2hhbmdlZChsaXN0TmFtZSwgbGlzdCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRyZWUgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZU5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZU5vZGVBZGRlZChldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRUcmVlTmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTm9kZUFkZGVkKFN0cmluZyB0cmVlTmFtZSwgTGlzdDw/PiBwYXRoKSB7Ci0JCXN1cGVyLmZpcmVOb2RlQWRkZWQodHJlZU5hbWUsIHBhdGgpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQodHJlZU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVOb2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZU5vZGVSZW1vdmVkKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldFRyZWVOYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVOb2RlUmVtb3ZlZChTdHJpbmcgdHJlZU5hbWUsIExpc3Q8Pz4gcGF0aCkgewotCQlzdXBlci5maXJlTm9kZVJlbW92ZWQodHJlZU5hbWUsIHBhdGgpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQodHJlZU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlVHJlZUNsZWFyZWQoZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0VHJlZU5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVRyZWVDbGVhcmVkKFN0cmluZyB0cmVlTmFtZSkgewotCQlzdXBlci5maXJlVHJlZUNsZWFyZWQodHJlZU5hbWUpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQodHJlZU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZVRyZWVDaGFuZ2VkKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldFRyZWVOYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2hhbmdlZChTdHJpbmcgdHJlZU5hbWUsIENvbGxlY3Rpb248Pz4gbm9kZXMpIHsKLQkJc3VwZXIuZmlyZVRyZWVDaGFuZ2VkKHRyZWVOYW1lLCBub2Rlcyk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZCh0cmVlTmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9DaGFuZ2VTdXBwb3J0LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9DaGFuZ2VTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NzRhYzQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvQ2hhbmdlU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogU3VwcG9ydCBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBieSBpbXBsZW1lbnRvcnMgb2YgdGhlIHtAbGluayBNb2RlbH0gaW50ZXJmYWNlLgotICogSXQgcHJvdmlkZXMgZm9yIHN0YXRlLCBwcm9wZXJ0eSwgY29sbGVjdGlvbiwgbGlzdCwgYW5kIHRyZWUgY2hhbmdlIG5vdGlmaWNhdGlvbnMgdG8KLSAqIGxpc3RlbmVycy4KLSAqIDxwPgotICogPHN0cm9uZz5OQjE6PC9zdHJvbmc+IFRoZXJlIGlzIGxvdHMgb2YgY29weS1uLXBhc3RlIGNvZGUgaW4gdGhpcyBjbGFzcy4gTmVhcmx5IGFsbCBvZiB0aGlzIGR1cGxpY2F0aW9uCi0gKiBpcyBhbiBlZmZvcnQgdG8gcHJldmVudCB0aGUgdW5uZWNlc3NhcnkgY3JlYXRpb24gb2YgbmV3IG9iamVjdHMgKHR5cGljYWxseSBldmVudAotICogb2JqZWN0cykuIFNpbmNlIG1hbnkgZXZlbnRzIGFyZSBmaXJlZCB3aGVuIHRoZXJlIGFyZSBubyBsaXN0ZW5lcnMsIHdlIHBvc3Rwb25lCi0gKiB0aGUgY3JlYXRpb24gb2YgZXZlbnQgb2JqZWN0cyB1bnRpbCB3ZSBrbm93IHdlIGhhdmUgaW50ZXJlc3RlZCBsaXN0ZW5lcnMuCi0gKiBNb3N0IG1ldGhvZHMgaGF2ZSB0aGUgIm5vbi1kdXBsaWNhdGVkIiB2ZXJzaW9uIG9mIHRoZSBtZXRob2QgYm9keSBjb21tZW50ZWQKLSAqIG91dCBhdCB0aGUgdG9wIG9mIHRoZSBjdXJyZW50IG1ldGhvZCBib2R5LgotICogVGhlIGhvcGUgd2FzIHRoYXQgdGhpcyBjbGFzcyB3b3VsZCBwcm92ZSB0byBiZSBmYWlybHkgc3RhdGljIGFuZCB0aGUgZHVwbGljYXRlZAotICogY29kZSB3b3VsZCBub3QgcHJvdmUgb25lcm91czsgYnV0IHRoYXQgaGFzIG5vdCBwcm92ZW4gdG8gYmUKLSAqIHRoZSBjYXNlLCBhcyB3ZSBoYXZlIGFkZGVkIHN1cHBvcnQgZm9yICJzdGF0ZSIgY2hhbmdlcywgImRpcnR5IiBub3RpZmljYXRpb24sCi0gKiBhbmQgY3VzdG9tICJub3RpZmllcnMiLCB3aXRoIG1vcmUgdG8gY29tZSwgSSdtIHN1cmUuLi4uICB+Ymp2Ci0gKiA8cD4KLSAqIDxzdHJvbmc+TkIyOjwvc3Ryb25nPiBUaGlzIGNsYXNzIHdpbGwgY2hlY2sgdG8gc2VlIGlmLCBkdXJpbmcgdGhlIGZpcmluZyBvZiBldmVudHMsIGEgbGlzdGVuZXIKLSAqIG9uIHRoZSBvcmlnaW5hbCwgY2xvbmVkLCBsaXN0IG9mIGxpc3RlbmVycyBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIG1hc3RlcgotICogbGlzdCBvZiBsaXN0ZW5lcnMgPGVtPmJlZm9yZTwvZW0+IGl0IGlzIG5vdGlmaWVkLiBJZiB0aGUgbGlzdGVuZXIgaGFzIGJlZW4gcmVtb3ZlZAotICogImNvbmN1cnJlbnRseSIgaXQgd2lsbCA8ZW0+bm90PC9lbT4gYmUgbm90aWZpZWQuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkIzOjwvc3Ryb25nPiBBbnkgbGlzdGVuZXIgdGhhdCBpcyBhZGRlZCBkdXJpbmcgdGhlIGZpcmluZyBvZiBldmVudHMgd2lsbCA8ZW0+bm90PC9lbT4gYmUKLSAqIGFsc28gbm90aWZpZWQuIFRoaXMgaXMgYSBiaXQgaW5jb25zaXN0ZW50IHdpdGggTkIyLCBidXQgc2VlbXMgcmVhc29uYWJsZQotICogc2luY2UgYW55IGFkZGVkIGxpc3RlbmVyIHNob3VsZCBhbHJlYWR5IGJlIGluIHN5bmMgd2l0aCB0aGUgbW9kZWwuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI0Ojwvc3Ryb25nPiBUaGlzIGNsYXNzIGlzIHNlcmlhbGl6YWJsZSwgYnV0IGl0IHdpbGwgb25seSB3cml0ZSBvdXQgbGlzdGVuZXJzIHRoYXQKLSAqIGFyZSBhbHNvIHNlcmlhbGl6YWJsZSB3aGlsZSBzaWxlbnRseSBsZWF2aW5nIGJlaGluZCBsaXN0ZW5lcnMgdGhhdCBhcmUgbm90LgotICogCi0gKiBAc2VlIE1vZGVsCi0gKiBAc2VlIEFic3RyYWN0TW9kZWwKLSAqLwotcHVibGljIGNsYXNzIENoYW5nZVN1cHBvcnQKLQlpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQotewotCS8qKiBUaGUgb2JqZWN0IHRvIGJlIHByb3ZpZGVkIGFzIHRoZSAic291cmNlIiBmb3IgYW55IGdlbmVyYXRlZCBldmVudHMuICovCi0JcHJvdGVjdGVkIGZpbmFsIE1vZGVsIHNvdXJjZTsKLQotCS8qKiBBc3NvY2lhdGUgYXNwZWN0IG5hbWVzIHRvIGNsYXNzLXNwZWNpZmljIGxpc3RlbmVyIGxpc3RzLiAqLwotCXByaXZhdGUgQXNwZWN0TGlzdGVuZXJMaXN0UGFpcjw/PltdIGFzcGVjdExpc3RlbmVyTGlzdFBhaXJzID0gRU1QVFlfQVNQRUNUX0xJU1RFTkVSX0xJU1RfUEFJUl9BUlJBWTsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXNwZWN0TGlzdGVuZXJMaXN0UGFpcjw/PltdIEVNUFRZX0FTUEVDVF9MSVNURU5FUl9MSVNUX1BBSVJfQVJSQVkgPSBuZXcgQXNwZWN0TGlzdGVuZXJMaXN0UGFpclswXTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBzdXBwb3J0IGZvciB0aGUgc3BlY2lmaWVkIHNvdXJjZSBvZiBjaGFuZ2UgZXZlbnRzLgotCSAqIFRoZSBzb3VyY2UgY2Fubm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBDaGFuZ2VTdXBwb3J0KE1vZGVsIHNvdXJjZSkgewotCQlzdXBlcigpOwotCQlpZiAoc291cmNlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuc291cmNlID0gc291cmNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBldmVudHMgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGFuZAotCSAqIGNhcnJ5aW5nIHRoZSBzcGVjaWZpZWQgYXNwZWN0IG5hbWUuCi0JICogTmVpdGhlciB0aGUgYXNwZWN0IG5hbWUgbm9yIHRoZSBsaXN0ZW5lciBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgYWRkTGlzdGVuZXIoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUsIEwgbGlzdGVuZXIpIHsKLQkJTGlzdGVuZXJMaXN0PEw+IGFzcGVjdExpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0TGlzdGVuZXJMaXN0KGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpOwotCQlpZiAoYXNwZWN0TGlzdGVuZXJMaXN0ID09IG51bGwpIHsKLQkJCXRoaXMuYXNwZWN0TGlzdGVuZXJMaXN0UGFpcnMgPSBBcnJheVRvb2xzLmFkZCh0aGlzLmFzcGVjdExpc3RlbmVyTGlzdFBhaXJzLCBuZXcgU2ltcGxlQXNwZWN0TGlzdGVuZXJMaXN0UGFpcjxMPihsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lLCBsaXN0ZW5lcikpOwotCQl9IGVsc2UgewotCQkJYXNwZWN0TGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBldmVudHMgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgYWRkTGlzdGVuZXIoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgTCBsaXN0ZW5lcikgewotCQlMaXN0ZW5lckxpc3Q8TD4gbGlzdGVuZXJMaXN0ID0gdGhpcy5nZXRMaXN0ZW5lckxpc3QobGlzdGVuZXJDbGFzcyk7Ci0JCWlmIChsaXN0ZW5lckxpc3QgPT0gbnVsbCkgewotCQkJdGhpcy5hc3BlY3RMaXN0ZW5lckxpc3RQYWlycyA9IEFycmF5VG9vbHMuYWRkKHRoaXMuYXNwZWN0TGlzdGVuZXJMaXN0UGFpcnMsIG5ldyBOdWxsQXNwZWN0TGlzdGVuZXJMaXN0UGFpcjxMPihsaXN0ZW5lckNsYXNzLCBsaXN0ZW5lcikpOwotCQl9IGVsc2UgewotCQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0ZW5lciB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgZm9yIGFsbCB0aGUKLQkgKiBldmVudHMgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGFuZCBjYXJyeWluZyB0aGUgc3BlY2lmaWVkIGFzcGVjdCBuYW1lLgotCSAqIE5laXRoZXIgdGhlIGFzcGVjdCBuYW1lIG5vciB0aGUgbGlzdGVuZXIgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2b2lkIHJlbW92ZUxpc3RlbmVyKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lLCBMIGxpc3RlbmVyKSB7Ci0JCUxpc3RlbmVyTGlzdDxMPiBhc3BlY3RMaXN0ZW5lckxpc3QgPSB0aGlzLmdldExpc3RlbmVyTGlzdChsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lKTsKLQkJaWYgKGFzcGVjdExpc3RlbmVyTGlzdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bnJlZ2lzdGVyZWQgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlhc3BlY3RMaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsgIC8vIGxlYXZlIHRoZSBwYWlyLCBldmVuIGlmIHRoZSBsaXN0ZW5lciBsaXN0IGlzIGVtcHR5PwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIHRoYXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCBmb3IgYWxsIHRoZSBldmVudHMgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgTCBsaXN0ZW5lcikgewotCQlMaXN0ZW5lckxpc3Q8TD4gbGlzdGVuZXJMaXN0ID0gdGhpcy5nZXRMaXN0ZW5lckxpc3QobGlzdGVuZXJDbGFzcyk7Ci0JCWlmIChsaXN0ZW5lckxpc3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5yZWdpc3RlcmVkIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7ICAvLyBsZWF2ZSB0aGUgcGFpciwgZXZlbiBpZiB0aGUgbGlzdGVuZXIgbGlzdCBpcyBlbXB0eT8KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3RlbmVyIGxpc3QgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgY2xhc3MgYW5kIGFzcGVjdCBuYW1lLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbGlzdGVuZXIgbGlzdCBpcyBub3QgcHJlc2VudC4KLQkgKiBUaGUgYXNwZWN0IG5hbWUgY2Fubm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IExpc3RlbmVyTGlzdDxMPiBnZXRMaXN0ZW5lckxpc3QoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJLy8gcHV0IGluIGEgbnVsbCBjaGVjayB0byBzaW1wbGlmeSBjYWxsaW5nIGNvZGUKLQkJaWYgKGFzcGVjdE5hbWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdGVuZXJMaXN0XyhsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3RlbmVyIGxpc3QgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgY2xhc3MuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBsaXN0ZW5lciBsaXN0IGlzIG5vdCBwcmVzZW50LgotCSAqLwotCXByb3RlY3RlZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IExpc3RlbmVyTGlzdDxMPiBnZXRMaXN0ZW5lckxpc3QoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcykgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0ZW5lckxpc3RfKGxpc3RlbmVyQ2xhc3MsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdGVuZXIgbGlzdCBmb3IgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBjbGFzcyBhbmQgYXNwZWN0IG5hbWUuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBsaXN0ZW5lciBsaXN0IGlzIG5vdCBwcmVzZW50LgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBMaXN0ZW5lckxpc3Q8TD4gZ2V0TGlzdGVuZXJMaXN0XyhDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlmb3IgKEFzcGVjdExpc3RlbmVyTGlzdFBhaXI8Pz4gcGFpciA6IHRoaXMuYXNwZWN0TGlzdGVuZXJMaXN0UGFpcnMpIHsKLQkJCWlmIChwYWlyLm1hdGNoZXMobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSkpIHsKLQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgTGlzdGVuZXJMaXN0PEw+IGFzcGVjdExpc3RlbmVyTGlzdCA9IChMaXN0ZW5lckxpc3Q8TD4pIHBhaXIubGlzdGVuZXJMaXN0OwotCQkJCXJldHVybiBhc3BlY3RMaXN0ZW5lckxpc3Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBsaXN0ZW5lcnMgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgY2xhc3MKLQkgKiBhbmQgYXNwZWN0IG5hbWUuCi0JICovCi0JcHJvdGVjdGVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gYm9vbGVhbiBoYXNBbnlMaXN0ZW5lcnMoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJTGlzdGVuZXJMaXN0PEw+IGFzcGVjdExpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0TGlzdGVuZXJMaXN0KGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpOwotCQlpZiAoKGFzcGVjdExpc3RlbmVyTGlzdCAhPSBudWxsKSAmJiAhIGFzcGVjdExpc3RlbmVyTGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiB0aGlzLmhhc0FueUNoYW5nZUxpc3RlbmVycygpOyAgLy8gY2hlY2sgZm9yIGFueSBnZW5lcmFsIHB1cnBvc2UgbGlzdGVuZXJzCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIG5vIGxpc3RlbmVycyBmb3IgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBjbGFzcwotCSAqIGFuZCBhc3BlY3QgbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBib29sZWFuIGhhc05vTGlzdGVuZXJzKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzQW55TGlzdGVuZXJzKGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgbGlzdGVuZXJzIGZvciB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIGNsYXNzLgotCSAqLwotCXByb3RlY3RlZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGJvb2xlYW4gaGFzQW55TGlzdGVuZXJzKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MpIHsKLQkJTGlzdGVuZXJMaXN0PEw+IGFzcGVjdExpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0TGlzdGVuZXJMaXN0KGxpc3RlbmVyQ2xhc3MpOwotCQlpZiAoKGFzcGVjdExpc3RlbmVyTGlzdCAhPSBudWxsKSAmJiAhIGFzcGVjdExpc3RlbmVyTGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIGNoZWNrIGZvciBhbnkgZ2VuZXJhbCBwdXJwb3NlIGxpc3RlbmVycyAodW5sZXNzIHRoYXQncyB3aGF0IHdlJ3JlIGFscmVhZHkgZG9pbmcpCi0JCXJldHVybiAobGlzdGVuZXJDbGFzcyA9PSB0aGlzLmdldENoYW5nZUxpc3RlbmVyQ2xhc3MoKSkgPyBmYWxzZSA6IHRoaXMuaGFzQW55Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIG5vIGxpc3RlbmVycyBmb3IgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBjbGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBib29sZWFuIGhhc05vTGlzdGVuZXJzKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNBbnlMaXN0ZW5lcnMobGlzdGVuZXJDbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGdlbmVyYWwgcHVycG9zZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHRoYXQgYWRkIG90aGVyIHR5cGVzIG9mIGxpc3RlbmVycyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QKLQkgKiB0byByZXR1cm4gdGhlIGV4dGVuc2lvbiB0byBDaGFuZ2VMaXN0ZW5lciB0aGF0IGFsc28gZXh0ZW5kcyB3aGF0ZXZlciBuZXcKLQkgKiBsaXN0ZW5lciB0eXBlcyBhcmUgc3VwcG9ydGVkLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCA8TCBleHRlbmRzIENoYW5nZUxpc3RlbmVyPiBDbGFzczxMPiBnZXRDaGFuZ2VMaXN0ZW5lckNsYXNzKCkgewotCQkvLyBub3Qgc3VyZSB3aHkgSSBuZWVkIHRvIGNhc3QgaGVyZS4uLgotCQlyZXR1cm4gKENsYXNzPEw+KSBDSEFOR0VfTElTVEVORVJfQ0xBU1M7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDaGFuZ2VMaXN0ZW5lcj4gQ0hBTkdFX0xJU1RFTkVSX0NMQVNTID0gQ2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0KLQkvKioKLQkgKiBBZGQgYSBnZW5lcmFsIHB1cnBvc2UgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBldmVudHMsCi0JICogcmVnYXJkbGVzcyBvZiB0aGUgYXNwZWN0IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZXZlbnQuCi0JICogVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuYWRkTGlzdGVuZXIodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lckNsYXNzKCksIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBnZW5lcmFsIHB1cnBvc2UgbGlzdGVuZXIuCi0JICogVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVtb3ZlTGlzdGVuZXIodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lckNsYXNzKCksIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGdlbmVyYWwgcHVycG9zZSBsaXN0ZW5lcnMgdGhhdCB3aWxsIGJlCi0JICogbm90aWZpZWQgb2YgYW55IGNoYW5nZXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55Q2hhbmdlTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0ZW5lcnModGhpcy5nZXRDaGFuZ2VMaXN0ZW5lckNsYXNzKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdGVuZXJMaXN0PENoYW5nZUxpc3RlbmVyPiBnZXRDaGFuZ2VMaXN0ZW5lckxpc3QoKSB7Ci0JCXJldHVybiB0aGlzLmdldExpc3RlbmVyTGlzdChDSEFOR0VfTElTVEVORVJfQ0xBU1MpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGdldENoYW5nZUxpc3RlbmVycygpIHsKLQkJTGlzdGVuZXJMaXN0PENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVyTGlzdCgpOwotCQlyZXR1cm4gKGxpc3RlbmVyTGlzdCA9PSBudWxsKSA/IG51bGwgOiBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0NoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKSwgbGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0ZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFN0YXRlQ2hhbmdlTGlzdGVuZXI+IFNUQVRFX0NIQU5HRV9MSVNURU5FUl9DTEFTUyA9IFN0YXRlQ2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0KLQkvKioKLQkgKiBBZGQgYSBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXIuCi0JICovCi0JcHVibGljIHZvaWQgYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuYWRkTGlzdGVuZXIoU1RBVEVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgc3RhdGUgY2hhbmdlIGxpc3RlbmVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKFNUQVRFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgc3RhdGUgY2hhbmdlIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdGVuZXJzKFNUQVRFX0NIQU5HRV9MSVNURU5FUl9DTEFTUyk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3Q8U3RhdGVDaGFuZ2VMaXN0ZW5lcj4gZ2V0U3RhdGVDaGFuZ2VMaXN0ZW5lckxpc3QoKSB7Ci0JCXJldHVybiB0aGlzLmdldExpc3RlbmVyTGlzdChTVEFURV9DSEFOR0VfTElTVEVORVJfQ0xBU1MpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RhdGVDaGFuZ2VMaXN0ZW5lcj4gZ2V0U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCUxpc3RlbmVyTGlzdDxTdGF0ZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSB0aGlzLmdldFN0YXRlQ2hhbmdlTGlzdGVuZXJMaXN0KCk7Ci0JCXJldHVybiAobGlzdGVuZXJMaXN0ID09IG51bGwpID8gbnVsbCA6IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRTdGF0ZUNoYW5nZUxpc3RlbmVycygpLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRmlyZSB0aGUgc3BlY2lmaWVkIHN0YXRlIGNoYW5nZSBldmVudCB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCUl0ZXJhYmxlPFN0YXRlQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNTdGF0ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5zdGF0ZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIuc3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBnZW5lcmljIHN0YXRlIGNoYW5nZSBldmVudCB0byBhbnkgcmVnaXN0ZXJlZCBzdGF0ZSBjaGFuZ2UKLQkgKiBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVN0YXRlQ2hhbmdlZCgpIHsKLS8vCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQobmV3IFN0YXRlQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UpKTsKLQkJU3RhdGVDaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPFN0YXRlQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNTdGF0ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgU3RhdGVDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIuc3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBTdGF0ZUNoYW5nZUV2ZW50KHRoaXMuc291cmNlKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5zdGF0ZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0eSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUyA9IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0KLQkvKioKLQkgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuIFRoZSBsaXN0ZW5lcgotCSAqIHdpbGwgYmUgbm90aWZpZWQgb25seSBmb3IgY2hhbmdlcyB0byB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmFkZExpc3RlbmVyKFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgcHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2FzIHJlZ2lzdGVyZWQgZm9yIGEgc3BlY2lmaWMgcHJvcGVydHkuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVtb3ZlTGlzdGVuZXIoUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdGVuZXJzKFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RlbmVyTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBnZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyTGlzdChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldExpc3RlbmVyTGlzdChQUk9QRVJUWV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBnZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUxpc3RlbmVyTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSB0aGlzLmdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJMaXN0KHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiAobGlzdGVuZXJMaXN0ID09IG51bGwpID8gbnVsbCA6IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhwcm9wZXJ0eU5hbWUpLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRmlyZSB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGNoYW5nZSBldmVudCB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICogTm8gZXZlbnQgaXMgZmlyZWQgaWYgdGhlIHNwZWNpZmllZCBldmVudCdzIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgdGhlIHNhbWU7Ci0JICogdGhpcyBpbmNsdWRlcyB3aGVuIGJvdGggdmFsdWVzIGFyZSBudWxsLiBVc2UgYSBzdGF0ZSBjaGFuZ2UgZXZlbnQKLQkgKiBmb3IgZ2VuZXJhbCBwdXJwb3NlIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2VzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIGRpZmZlcmVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmaXJlUHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KGV2ZW50LmdldE9sZFZhbHVlKCksIGV2ZW50LmdldE5ld1ZhbHVlKCkpKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWRfKGV2ZW50KTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiB0aGUgc3BlY2lmaWVkIGV2ZW50J3Mgb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSBkaWZmZXJlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkXyhQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKTsKLQkJSXRlcmFibGU8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhwcm9wZXJ0eU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgcHJvcGVydHkgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcnMuCi0JICogTm8gZXZlbnQgaXMgZmlyZWQgaWYgdGhlIHNwZWNpZmllZCBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHRoZSBzYW1lOwotCSAqIHRoaXMgaW5jbHVkZXMgd2hlbiBib3RoIHZhbHVlcyBhcmUgbnVsbC4gVXNlIGEgc3RhdGUgY2hhbmdlIGV2ZW50Ci0JICogZm9yIGdlbmVyYWwgcHVycG9zZSBub3RpZmljYXRpb24gb2YgY2hhbmdlcy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSBkaWZmZXJlbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotLy8JCXJldHVybiB0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQobmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKSk7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudChvbGRWYWx1ZSwgbmV3VmFsdWUpKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWRfKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiB0aGUgc3BlY2lmaWVkIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgZGlmZmVyZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZF8oU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMocHJvcGVydHlOYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYW4gPGNvZGU+aW50PC9jb2RlPiBib3VuZCBwcm9wZXJ0eSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIE5vIGV2ZW50IGlzIGZpcmVkIGlmIHRoZSBzcGVjaWZpZWQgb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSBlcXVhbC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSBkaWZmZXJlbnQuCi0JICogPHA+Ci0JICogVGhpcyBpcyBtZXJlbHkgYSBjb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgbW9yZSBnZW5lcmFsIG1ldGhvZAotCSAqIHtAbGluayAjZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcsIE9iamVjdCwgT2JqZWN0KX0uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotLy8JCXJldHVybiB0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lLCBJbnRlZ2VyLnZhbHVlT2Yob2xkVmFsdWUpLCBJbnRlZ2VyLnZhbHVlT2YobmV3VmFsdWUpKTsKLQkJaWYgKG9sZFZhbHVlICE9IG5ld1ZhbHVlKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWRfKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiB0aGUgc3BlY2lmaWVkIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgZGlmZmVyZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZF8oU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IG9sZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHsKLQkJUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMocHJvcGVydHlOYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBwcm9wZXJ0eU5hbWUsIEludGVnZXIudmFsdWVPZihvbGRWYWx1ZSksIEludGVnZXIudmFsdWVPZihuZXdWYWx1ZSkpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgcHJvcGVydHlOYW1lLCBJbnRlZ2VyLnZhbHVlT2Yob2xkVmFsdWUpLCBJbnRlZ2VyLnZhbHVlT2YobmV3VmFsdWUpKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IGJvdW5kIHByb3BlcnR5IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICogTm8gZXZlbnQgaXMgZmlyZWQgaWYgdGhlIHNwZWNpZmllZCBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIGVxdWFsLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIGRpZmZlcmVudC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIG1lcmVseSBhIGNvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBtb3JlIGdlbmVyYWwgbWV0aG9kCi0JICoge0BsaW5rICNmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZywgT2JqZWN0LCBPYmplY3QpfS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gb2xkVmFsdWUsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLS8vCQlyZXR1cm4gdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgQm9vbGVhbi52YWx1ZU9mKG9sZFZhbHVlKSwgQm9vbGVhbi52YWx1ZU9mKG5ld1ZhbHVlKSk7Ci0JCWlmIChvbGRWYWx1ZSAhPSBuZXdWYWx1ZSkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkXyhwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogdGhlIHNwZWNpZmllZCBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIGRpZmZlcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWRfKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gb2xkVmFsdWUsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMocHJvcGVydHlOYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBwcm9wZXJ0eU5hbWUsIEJvb2xlYW4udmFsdWVPZihvbGRWYWx1ZSksIEJvb2xlYW4udmFsdWVPZihuZXdWYWx1ZSkpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgcHJvcGVydHlOYW1lLCBCb29sZWFuLnZhbHVlT2Yob2xkVmFsdWUpLCBCb29sZWFuLnZhbHVlT2YobmV3VmFsdWUpKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUyA9IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQotCS8qKgotCSAqIEFkZCBhIGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIGZvciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uIFRoZSBsaXN0ZW5lcgotCSAqIHdpbGwgYmUgbm90aWZpZWQgb25seSBmb3IgY2hhbmdlcyB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuYWRkTGlzdGVuZXIoQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3YXMgcmVnaXN0ZXJlZCBmb3IgYSBzcGVjaWZpYyBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUxpc3RlbmVycyhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCXByaXZhdGUgTGlzdGVuZXJMaXN0PENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdChTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdGVuZXJMaXN0KENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGdldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCUxpc3RlbmVyTGlzdDxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdChjb2xsZWN0aW9uTmFtZSk7Ci0JCXJldHVybiAobGlzdGVuZXJMaXN0ID09IG51bGwpID8gbnVsbCA6IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZXZlbnQgaGFzIGFueSBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldEl0ZW1zU2l6ZSgpICE9IDApIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiB0aGUgc3BlY2lmaWVkIGV2ZW50IGNvbnRhaW5zIGl0ZW1zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zQWRkZWRfKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlTdHJpbmcgY29sbGVjdGlvbk5hbWUgPSBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpOwotCQlJdGVyYWJsZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGFkZGVkIGl0ZW1zLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc0FkZGVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiBhZGRlZEl0ZW1zKSB7Ci0vLwkJcmV0dXJuIHRoaXMuZmlyZUl0ZW1zQWRkZWQobmV3IENvbGxlY3Rpb25BZGRFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbXMpKTsKLQkJaWYgKCAhIGFkZGVkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkXyhjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtcyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogJ2FkZGVkSXRlbXMnIGlzIG5vdCBlbXB0eQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc0FkZGVkXyhTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gYWRkZWRJdGVtcykgewotCQlDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvbkFkZEV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtcyk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvbkFkZEV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtcyk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNBZGRlZChjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKGFkZGVkSXRlbSkpOwotCi0JCUNvbGxlY3Rpb25BZGRFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uQWRkRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCBhZGRlZEl0ZW0pOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IENvbGxlY3Rpb25BZGRFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbSk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBldmVudCBoYXMgYW55IGl0ZW1zLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRJdGVtc1NpemUoKSAhPSAwKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiB0aGUgc3BlY2lmaWVkIGV2ZW50IGNvbnRhaW5zIGl0ZW1zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZF8oQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBjb2xsZWN0aW9uTmFtZSA9IGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCk7Ci0JCUl0ZXJhYmxlPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHJlbW92ZWQgaXRlbXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zUmVtb3ZlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gcmVtb3ZlZEl0ZW1zKSB7Ci0vLwkJcmV0dXJuIHRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChuZXcgQ29sbGVjdGlvblJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW1zKSk7Ci0JCWlmICggISByZW1vdmVkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWRfKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246ICdyZW1vdmVkSXRlbXMnIGlzIG5vdCBlbXB0eQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc1JlbW92ZWRfKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiByZW1vdmVkSXRlbXMpIHsKLQkJQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoY29sbGVjdGlvbk5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IENvbGxlY3Rpb25SZW1vdmVFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtcyk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtUmVtb3ZlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdCByZW1vdmVkSXRlbSkgewotLy8JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKHJlbW92ZWRJdGVtKSk7Ci0KLQkJQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoY29sbGVjdGlvbk5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IENvbGxlY3Rpb25SZW1vdmVFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IENvbGxlY3Rpb25SZW1vdmVFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGNvbGxlY3Rpb25OYW1lID0gZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKTsKLQkJSXRlcmFibGU8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoY29sbGVjdGlvbk5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNsZWFyZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0vLwkJdGhpcy5maXJlQ29sbGVjdGlvbkNsZWFyZWQobmV3IENvbGxlY3Rpb25DbGVhckV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSkpOwotCi0JCUNvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoY29sbGVjdGlvbk5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IENvbGxlY3Rpb25DbGVhckV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IENvbGxlY3Rpb25DbGVhckV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBjb2xsZWN0aW9uTmFtZSA9IGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCk7Ci0JCUl0ZXJhYmxlPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBjb2xsZWN0aW9uIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0vLwkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQobmV3IENvbGxlY3Rpb25DaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIGNvbGxlY3Rpb24pKTsKLQotCQlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgY29sbGVjdGlvbik7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IENvbGxlY3Rpb25DaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIGNvbGxlY3Rpb24pOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIENvbGxlY3Rpb24jYWRkKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbVRvQ29sbGVjdGlvbihFIGl0ZW0sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCWlmIChjb2xsZWN0aW9uLmFkZChpdGVtKSkgewotCQkJdGhpcy5maXJlSXRlbUFkZGVkKGNvbGxlY3Rpb25OYW1lLCBpdGVtKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIENvbGxlY3Rpb24jYWRkQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9Db2xsZWN0aW9uKEVbXSBpdGVtcywgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIChpdGVtcy5sZW5ndGggIT0gMCkKLQkJCQkmJiB0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uXyhuZXcgQXJyYXlJdGVyYXRvcjxFPihpdGVtcyksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIENvbGxlY3Rpb24jYWRkQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9Db2xsZWN0aW9uKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGl0ZW1zLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gKCAhIGl0ZW1zLmlzRW1wdHkoKSkKLQkJCQkmJiB0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uXyhpdGVtcy5pdGVyYXRvcigpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBDb2xsZWN0aW9uI2FkZEFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvQ29sbGVjdGlvbihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlbXMsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKGl0ZW1zLml0ZXJhdG9yKCksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIENvbGxlY3Rpb24jYWRkQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9Db2xsZWN0aW9uKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVtcywgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIGl0ZW1zLmhhc05leHQoKQotCQkJCSYmIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb25fKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2sKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0NvbGxlY3Rpb25fKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVtcywgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJQ29sbGVjdGlvbjxFPiBhZGRlZEl0ZW1zID0gbnVsbDsKLQkJd2hpbGUgKGl0ZW1zLmhhc05leHQoKSkgewotCQkJRSBpdGVtID0gaXRlbXMubmV4dCgpOwotCQkJaWYgKGNvbGxlY3Rpb24uYWRkKGl0ZW0pKSB7Ci0JCQkJaWYgKGFkZGVkSXRlbXMgPT0gbnVsbCkgewotCQkJCQlhZGRlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFPigpOwotCQkJCX0KLQkJCQlhZGRlZEl0ZW1zLmFkZChpdGVtKTsKLQkJCX0KLQkJfQotCQlpZiAoYWRkZWRJdGVtcyAhPSBudWxsKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkXyhjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtcyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbSBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIENvbGxlY3Rpb24jcmVtb3ZlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oT2JqZWN0IGl0ZW0sIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCWlmIChjb2xsZWN0aW9uLnJlbW92ZShpdGVtKSkgewotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoY29sbGVjdGlvbk5hbWUsIGl0ZW0pOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgQ29sbGVjdGlvbiNyZW1vdmVBbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKE9iamVjdFtdIGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gKGl0ZW1zLmxlbmd0aCAhPSAwKQotCQkJCSYmICggISBjb2xsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCQkmJiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25fKG5ldyBBcnJheUl0ZXJhdG9yPE9iamVjdD4oaXRlbXMpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBDb2xsZWN0aW9uI3JlbW92ZUFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oQ29sbGVjdGlvbjw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuICggISBpdGVtcy5pc0VtcHR5KCkpCi0JCQkJJiYgKCAhIGNvbGxlY3Rpb24uaXNFbXB0eSgpKQotCQkJCSYmIHRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbl8oaXRlbXMuaXRlcmF0b3IoKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgQ29sbGVjdGlvbiNyZW1vdmVBbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKEl0ZXJhYmxlPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKGl0ZW1zLml0ZXJhdG9yKCksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIENvbGxlY3Rpb24jcmVtb3ZlQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihJdGVyYXRvcjw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIGl0ZW1zLmhhc05leHQoKQotCQkJCSYmICggISBjb2xsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCQkmJiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25fKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2tzCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbl8oSXRlcmF0b3I8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCUhhc2hCYWc8Pz4gcmVtb3ZlZEl0ZW1zID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oaXRlbXMpOwotCQlyZW1vdmVkSXRlbXMucmV0YWluQWxsKGNvbGxlY3Rpb24pOwotCQlib29sZWFuIGNoYW5nZWQgPSBjb2xsZWN0aW9uLnJlbW92ZUFsbChyZW1vdmVkSXRlbXMpOwotCi0JCWlmICggISByZW1vdmVkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWRfKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCQl9Ci0JCXJldHVybiBjaGFuZ2VkOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIENvbGxlY3Rpb24jcmV0YWluQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oT2JqZWN0W10gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCWlmIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChpdGVtcy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIHRoaXMuY2xlYXJDb2xsZWN0aW9uXyhjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkNvbGxlY3Rpb25fKG5ldyBBcnJheUl0ZXJhdG9yPE9iamVjdD4oaXRlbXMpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIHRoZSBzcGVjaWZpZWQgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgQ29sbGVjdGlvbiNyZXRhaW5BbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5JdGVtc0luQ29sbGVjdGlvbihDb2xsZWN0aW9uPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5jbGVhckNvbGxlY3Rpb25fKGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbl8oaXRlbXMuaXRlcmF0b3IoKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIENvbGxlY3Rpb24jcmV0YWluQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oSXRlcmFibGU8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKGl0ZW1zLml0ZXJhdG9yKCksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBDb2xsZWN0aW9uI3JldGFpbkFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKEl0ZXJhdG9yPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoICEgaXRlbXMuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5jbGVhckNvbGxlY3Rpb25fKGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbl8oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVja3MKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luQ29sbGVjdGlvbl8oSXRlcmF0b3I8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCUhhc2hCYWc8Pz4gcmV0YWluZWRJdGVtcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGl0ZW1zKTsKLQkJSGFzaEJhZzw/PiByZW1vdmVkSXRlbXMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihjb2xsZWN0aW9uKTsKLQkJcmVtb3ZlZEl0ZW1zLnJlbW92ZUFsbChyZXRhaW5lZEl0ZW1zKTsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gY29sbGVjdGlvbi5yZXRhaW5BbGwocmV0YWluZWRJdGVtcyk7Ci0KLQkJaWYgKCAhIHJlbW92ZWRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZF8oY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtcyk7Ci0JCX0KLQkJcmV0dXJuIGNoYW5nZWQ7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIGVudGlyZSBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgQ29sbGVjdGlvbiNjbGVhcigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2xlYXJDb2xsZWN0aW9uKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCWlmIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLmNsZWFyQ29sbGVjdGlvbl8oY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vIGVtcHR5IGNoZWNrCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2xlYXJDb2xsZWN0aW9uXyhDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQljb2xsZWN0aW9uLmNsZWFyKCk7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKGNvbGxlY3Rpb25OYW1lKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU3luY2hyb25pemUgdGhlIGNvbGxlY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5ldyBjb2xsZWN0aW9uLAotCSAqIG1ha2luZyBhIG1pbmltdW0gbnVtYmVyIG9mIHJlbW92ZXMgYW5kIGFkZHMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gc3luY2hyb25pemVDb2xsZWN0aW9uKENvbGxlY3Rpb248RT4gbmV3Q29sbGVjdGlvbiwgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJaWYgKG5ld0NvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5jbGVhckNvbGxlY3Rpb24oY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCQl9Ci0KLQkJaWYgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbl8obmV3Q29sbGVjdGlvbi5pdGVyYXRvcigpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5zeW5jaHJvbml6ZUNvbGxlY3Rpb25fKG5ld0NvbGxlY3Rpb24sIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSB0aGUgY29sbGVjdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmV3IGNvbGxlY3Rpb24sCi0JICogbWFraW5nIGEgbWluaW11bSBudW1iZXIgb2YgcmVtb3ZlcyBhbmQgYWRkcy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBzeW5jaHJvbml6ZUNvbGxlY3Rpb24oSXRlcmFibGU8RT4gbmV3Q29sbGVjdGlvbiwgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuc3luY2hyb25pemVDb2xsZWN0aW9uKG5ld0NvbGxlY3Rpb24uaXRlcmF0b3IoKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFN5bmNocm9uaXplIHRoZSBjb2xsZWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuZXcgY29sbGVjdGlvbiwKLQkgKiBtYWtpbmcgYSBtaW5pbXVtIG51bWJlciBvZiByZW1vdmVzIGFuZCBhZGRzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIHN5bmNocm9uaXplQ29sbGVjdGlvbihJdGVyYXRvcjxFPiBuZXdDb2xsZWN0aW9uLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlpZiAoICEgbmV3Q29sbGVjdGlvbi5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiB0aGlzLmNsZWFyQ29sbGVjdGlvbihjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCX0KLQotCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uXyhuZXdDb2xsZWN0aW9uLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5zeW5jaHJvbml6ZUNvbGxlY3Rpb25fKENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKG5ld0NvbGxlY3Rpb24pLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2tzCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIHN5bmNocm9uaXplQ29sbGVjdGlvbl8oQ29sbGVjdGlvbjxFPiBuZXdDb2xsZWN0aW9uLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJQ29sbGVjdGlvbjxFPiByZW1vdmVJdGVtcyA9IG5ldyBIYXNoQmFnPEU+KGNvbGxlY3Rpb24pOwotCQlyZW1vdmVJdGVtcy5yZW1vdmVBbGwobmV3Q29sbGVjdGlvbik7Ci0JCWNoYW5nZWQgfD0gdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKHJlbW92ZUl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0KLQkJQ29sbGVjdGlvbjxFPiBhZGRJdGVtcyA9IG5ldyBIYXNoQmFnPEU+KG5ld0NvbGxlY3Rpb24pOwotCQlhZGRJdGVtcy5yZW1vdmVBbGwoY29sbGVjdGlvbik7Ci0JCWNoYW5nZWQgfD0gdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbihhZGRJdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCi0JCXJldHVybiBjaGFuZ2VkOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdENoYW5nZUxpc3RlbmVyPiBMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUyA9IExpc3RDaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQotCS8qKgotCSAqIEFkZCBhIGxpc3QgY2hhbmdlIGxpc3RlbmVyIGZvciB0aGUgc3BlY2lmaWVkIGxpc3QuIFRoZSBsaXN0ZW5lcgotCSAqIHdpbGwgYmUgbm90aWZpZWQgb25seSBmb3IgY2hhbmdlcyB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuYWRkTGlzdGVuZXIoTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgbGlzdCBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3YXMgcmVnaXN0ZXJlZCBmb3IgYSBzcGVjaWZpYyBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgbGlzdCBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNwZWNpZmllZCBsaXN0IGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUxpc3RlbmVycyhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCX0KLQotCXByaXZhdGUgTGlzdGVuZXJMaXN0PExpc3RDaGFuZ2VMaXN0ZW5lcj4gZ2V0TGlzdENoYW5nZUxpc3RlbmVyTGlzdChTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdGVuZXJMaXN0KExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGdldExpc3RDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCUxpc3RlbmVyTGlzdDxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVyTGlzdChsaXN0TmFtZSk7Ci0JCXJldHVybiAobGlzdGVuZXJMaXN0ID09IG51bGwpID8gbnVsbCA6IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGFkZGVkIGl0ZW1zLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0SXRlbXNTaXplKCkgIT0gMCkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZF8oZXZlbnQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHRoZSBzcGVjaWZpZWQgZXZlbnQgY29udGFpbnMgaXRlbXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNBZGRlZF8oTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBsaXN0TmFtZSA9IGV2ZW50LmdldExpc3ROYW1lKCk7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgYWRkZWQgaXRlbXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zQWRkZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gYWRkZWRJdGVtcykgewotLy8JCXJldHVybiB0aGlzLmZpcmVJdGVtc0FkZGVkKG5ldyBMaXN0QWRkRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtcykpOwotCQlpZiAoICEgYWRkZWRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWRfKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtcyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogJ2FkZGVkSXRlbXMnIGlzIG5vdCBlbXB0eQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc0FkZGVkXyhTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiBhZGRlZEl0ZW1zKSB7Ci0JCUxpc3RBZGRFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0QWRkRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtcyk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdEFkZEV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbUFkZGVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNBZGRlZChsaXN0TmFtZSwgaW5kZXgsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYWRkZWRJdGVtKSk7Ci0KLQkJTGlzdEFkZEV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RBZGRFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW0pOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RBZGRFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW0pOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHJlbW92ZWQgaXRlbXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldEl0ZW1zU2l6ZSgpICE9IDApIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHRoZSBzcGVjaWZpZWQgZXZlbnQgY29udGFpbnMgaXRlbXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNSZW1vdmVkXyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGxpc3ROYW1lID0gZXZlbnQuZ2V0TGlzdE5hbWUoKTsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVtb3ZlZCBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNSZW1vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IHJlbW92ZWRJdGVtcykgewotLy8JCXJldHVybiB0aGlzLmZpcmVJdGVtc1JlbW92ZWQobmV3IExpc3RSZW1vdmVFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbXMpKTsKLQkJaWYgKCAhIHJlbW92ZWRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZF8obGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246ICdyZW1vdmVkSXRlbXMnIGlzIG5vdCBlbXB0eQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc1JlbW92ZWRfKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IHJlbW92ZWRJdGVtcykgewotCQlMaXN0UmVtb3ZlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdFJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtcyk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0UmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW1zKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbVJlbW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCByZW1vdmVkSXRlbSkgewotLy8JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChsaXN0TmFtZSwgaW5kZXgsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmVtb3ZlZEl0ZW0pKTsKLQotCQlMaXN0UmVtb3ZlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdFJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RSZW1vdmVFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbSk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByZXBsYWNlZCBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICgoZXZlbnQuZ2V0SXRlbXNTaXplKCkgIT0gMCkgJiYgdGhpcy5lbGVtZW50c0FyZURpZmZlcmVudChldmVudC5nZXROZXdJdGVtcygpLCBldmVudC5nZXRPbGRJdGVtcygpKSkgewotCQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZF8oZXZlbnQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHRoZSBzcGVjaWZpZWQgZXZlbnQgY29udGFpbnMgbmV3IGl0ZW1zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zUmVwbGFjZWRfKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGxpc3ROYW1lID0gZXZlbnQuZ2V0TGlzdE5hbWUoKTsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByZXBsYWNlZCBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNSZXBsYWNlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiBuZXdJdGVtcywgTGlzdDw/PiBvbGRJdGVtcykgewotLy8JCXJldHVybiB0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKG5ldyBMaXN0UmVwbGFjZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW1zLCBvbGRJdGVtcykpOwotCQlpZiAoKCAhIG5ld0l0ZW1zLmlzRW1wdHkoKSkgJiYgdGhpcy5lbGVtZW50c0FyZURpZmZlcmVudChuZXdJdGVtcywgb2xkSXRlbXMpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkXyhsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW1zLCBvbGRJdGVtcyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogJ25ld0l0ZW1zJyBpcyBub3QgZW1wdHkgYW5kIHVuZXF1YWwgdG8gJ29sZEl0ZW1zJwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc1JlcGxhY2VkXyhTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiBuZXdJdGVtcywgTGlzdDw/PiBvbGRJdGVtcykgewotCQlMaXN0UmVwbGFjZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RSZXBsYWNlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbXMsIG9sZEl0ZW1zKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0UmVwbGFjZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW1zLCBvbGRJdGVtcyk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBpdGVtIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1SZXBsYWNlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IG5ld0l0ZW0sIE9iamVjdCBvbGRJdGVtKSB7Ci0vLwkJcmV0dXJuIHRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQobGlzdE5hbWUsIGluZGV4LCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ld0l0ZW0pLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG9sZEl0ZW0pKTsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KG5ld0l0ZW0sIG9sZEl0ZW0pKSB7Ci0JCQl0aGlzLmZpcmVJdGVtUmVwbGFjZWRfKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbSwgb2xkSXRlbSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogdGhlIHNwZWNpZmllZCBvbGQgYW5kIG5ldyBpdGVtcyBhcmUgZGlmZmVyZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1SZXBsYWNlZF8oU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBuZXdJdGVtLCBPYmplY3Qgb2xkSXRlbSkgewotCQlMaXN0UmVwbGFjZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RSZXBsYWNlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbSwgb2xkSXRlbSk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdFJlcGxhY2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtLCBvbGRJdGVtKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBtb3ZlZCBpdGVtcy4KLQkgKi8KLQkvLyBpdCdzIHVubGlrZWx5IGJ1dCBwb3NzaWJsZSB0aGUgbGlzdCBpcyB1bmNoYW5nZWQgYnkgdGhlIG1vdmUuLi4KLQkvLyBlLmcuIGFueSBtb3ZlcyB3aXRoaW4gWyJmb28iLCAiZm9vIiwgImZvbyJdCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKSAhPSBldmVudC5nZXRTb3VyY2VJbmRleCgpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc01vdmVkXyhldmVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogdGhlIHNwZWNpZmllZCBldmVudCBpbmRpY2F0ZXMgYSBtb3ZlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zTW92ZWRfKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGxpc3ROYW1lID0gZXZlbnQuZ2V0TGlzdE5hbWUoKTsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIuaXRlbXNNb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc01vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBtb3ZlZCBpdGVtcy4KLQkgKi8KLQkvLyBpdCdzIHVubGlrZWx5IGJ1dCBwb3NzaWJsZSB0aGUgbGlzdCBpcyB1bmNoYW5nZWQgYnkgdGhlIG1vdmUuLi4KLQkvLyBlLmcuIGFueSBtb3ZlcyB3aXRoaW4gWyJmb28iLCAiZm9vIiwgImZvbyJdCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zTW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotLy8JCXJldHVybiB0aGlzLmZpcmVJdGVtc01vdmVkKG5ldyBMaXN0TW92ZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgpKTsKLQkJaWYgKHRhcmdldEluZGV4ICE9IHNvdXJjZUluZGV4KSB7Ci0JCQl0aGlzLmZpcmVJdGVtc01vdmVkXyhsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHRoZSBzcGVjaWZpZWQgaW5kaWNlcyBpbmRpY2F0ZSBhIG1vdmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNNb3ZlZF8oU3RyaW5nIGxpc3ROYW1lLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQlMaXN0TW92ZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RNb3ZlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIuaXRlbXNNb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdE1vdmVFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc01vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBtb3ZlZCBpdGVtcy4KLQkgKi8KLQkvLyBpdCdzIHVubGlrZWx5IGJ1dCBwb3NzaWJsZSB0aGUgbGlzdCBpcyB1bmNoYW5nZWQgYnkgdGhlIG1vdmUuLi4KLQkvLyBlLmcuIGFueSBtb3ZlcyB3aXRoaW4gWyJmb28iLCAiZm9vIiwgImZvbyJdCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1Nb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCWlmICh0YXJnZXRJbmRleCAhPSBzb3VyY2VJbmRleCkgewotCQkJdGhpcy5maXJlSXRlbU1vdmVkXyhsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiB0aGUgc3BlY2lmaWVkIGluZGljZXMgaW5kaWNhdGUgYSBtb3ZlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1Nb3ZlZF8oU3RyaW5nIGxpc3ROYW1lLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLmZpcmVJdGVtc01vdmVkXyhsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBsaXN0TmFtZSA9IGV2ZW50LmdldExpc3ROYW1lKCk7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDbGVhcmVkKFN0cmluZyBsaXN0TmFtZSkgewotLy8JCXRoaXMuZmlyZUxpc3RDbGVhcmVkKG5ldyBMaXN0Q2xlYXJFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUpKTsKLQotCQlMaXN0Q2xlYXJFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0Q2xlYXJFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0Q2xlYXJFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgbGlzdE5hbWUgPSBldmVudC5nZXRMaXN0TmFtZSgpOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2hhbmdlZChTdHJpbmcgbGlzdE5hbWUsIExpc3Q8Pz4gbGlzdCkgewotLy8JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKG5ldyBMaXN0Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lKSk7Ci0KLQkJTGlzdENoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGxpc3QpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBsaXN0KTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbSB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudC4KLQkgKiBAc2VlIExpc3QjYWRkKGludCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyA8RT4gdm9pZCBhZGRJdGVtVG9MaXN0KGludCBpbmRleCwgRSBpdGVtLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlsaXN0LmFkZChpbmRleCwgaXRlbSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChsaXN0TmFtZSwgaW5kZXgsIGl0ZW0pOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW0gdG8gdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZCAoaS5lLiAndHJ1ZScpLgotCSAqIEBzZWUgTGlzdCNhZGQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtVG9MaXN0KEUgaXRlbSwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKGxpc3QuYWRkKGl0ZW0pKSB7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQobGlzdE5hbWUsIGxpc3Quc2l6ZSgpIC0gMSwgaXRlbSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7ICAvLyBMaXN0I2FkZChPYmplY3QpIHNob3VsZCBhbHdheXMgcmV0dXJuICd0cnVlJywgc28gd2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLi4uCi0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBMaXN0I2FkZEFsbChpbnQsIENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KGludCBpbmRleCwgRVtdIGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gKGl0ZW1zLmxlbmd0aCAhPSAwKQotCQkJCSYmIHRoaXMuYWRkSXRlbXNUb0xpc3RfKGluZGV4LCBBcnJheXMuYXNMaXN0KGl0ZW1zKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgTGlzdCNhZGRBbGwoaW50LCBDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gKCAhIGl0ZW1zLmlzRW1wdHkoKSkKLQkJCQkmJiB0aGlzLmFkZEl0ZW1zVG9MaXN0XyhpbmRleCwgdGhpcy5jb252ZXJ0VG9MaXN0KGl0ZW1zKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vIGVtcHR5IGNoZWNrCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0XyhpbnQgaW5kZXgsIExpc3Q8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAobGlzdC5hZGRBbGwoaW5kZXgsIGl0ZW1zKSkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChsaXN0TmFtZSwgaW5kZXgsIGl0ZW1zKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsgIC8vICAnaXRlbXMnIHNob3VsZCBub3QgYmUgZW1wdHksIHNvIHdlIHNob3VsZCBuZXZlciBnZXQgaGVyZS4uLgotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIExpc3QjYWRkQWxsKGludCwgQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoaW50IGluZGV4LCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9MaXN0KGluZGV4LCBpdGVtcy5pdGVyYXRvcigpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgTGlzdCNhZGRBbGwoaW50LCBDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChpbnQgaW5kZXgsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKCAhIGl0ZW1zLmhhc05leHQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJQXJyYXlMaXN0PEU+IGFkZGVkSXRlbXMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChpdGVtcyk7Ci0JCWlmIChsaXN0LmFkZEFsbChpbmRleCwgYWRkZWRJdGVtcykpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQobGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW1zKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsgIC8vICAnaXRlbXMnIHNob3VsZCBub3QgYmUgZW1wdHksIHNvIHdlIHNob3VsZCBuZXZlciBnZXQgaGVyZS4uLgotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBlbmQgb2YgdG8gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgTGlzdCNhZGRBbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoRVtdIGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gKGl0ZW1zLmxlbmd0aCAhPSAwKQotCQkJCSYmIHRoaXMuYWRkSXRlbXNUb0xpc3RfKEFycmF5cy5hc0xpc3QoaXRlbXMpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBMaXN0I2FkZEFsbChpbnQsIENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gKCAhIGl0ZW1zLmlzRW1wdHkoKSkKLQkJCQkmJiB0aGlzLmFkZEl0ZW1zVG9MaXN0Xyh0aGlzLmNvbnZlcnRUb0xpc3QoaXRlbXMpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIDxFPiBMaXN0PD8gZXh0ZW5kcyBFPiBjb252ZXJ0VG9MaXN0KENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIChjb2xsZWN0aW9uIGluc3RhbmNlb2YgTGlzdDw/PikgPyAoTGlzdDw/IGV4dGVuZHMgRT4pIGNvbGxlY3Rpb24gOiBuZXcgQXJyYXlMaXN0PEU+KGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIG5vIGVtcHR5IGNoZWNrCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0XyhMaXN0PD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaW50IGluZGV4ID0gbGlzdC5zaXplKCk7Ci0JCWlmIChsaXN0LmFkZEFsbChpdGVtcykpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQobGlzdE5hbWUsIGluZGV4LCBpdGVtcyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7ICAvLyAgJ2l0ZW1zJyBzaG91bGQgbm90IGJlIGVtcHR5LCBzbyB3ZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUuLi4KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgZW5kIG9mIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIExpc3QjYWRkQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0xpc3QoaXRlbXMuaXRlcmF0b3IoKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBlbmQgb2YgdG8gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgTGlzdCNhZGRBbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAoICEgaXRlbXMuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0xpc3RfKGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2sKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3RfKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJQXJyYXlMaXN0PEU+IGFkZGVkSXRlbXMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChpdGVtcyk7Ci0JCWludCBpbmRleCA9IGxpc3Quc2l6ZSgpOwotCQlpZiAobGlzdC5hZGRBbGwoYWRkZWRJdGVtcykpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQobGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW1zKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsgIC8vICAnaXRlbXMnIHNob3VsZCBub3QgYmUgZW1wdHksIHNvIHdlIHNob3VsZCBuZXZlciBnZXQgaGVyZS4uLgotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW0gZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB0aGUgcmVtb3ZlZCBpdGVtLgotCSAqIEBzZWUgTGlzdCNyZW1vdmUoaW50KQotCSAqLwotCXB1YmxpYyA8RT4gRSByZW1vdmVJdGVtRnJvbUxpc3QoaW50IGluZGV4LCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlFIGl0ZW0gPSBsaXN0LnJlbW92ZShpbmRleCk7Ci0JCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgaXRlbSk7Ci0JCXJldHVybiBpdGVtOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW0gZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBMaXN0I3JlbW92ZShPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSXRlbUZyb21MaXN0KE9iamVjdCBpdGVtLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpbnQgaW5kZXggPSBsaXN0LmluZGV4T2YoaXRlbSk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWxpc3QucmVtb3ZlKGluZGV4KTsKLQkJdGhpcy5maXJlSXRlbVJlbW92ZWQobGlzdE5hbWUsIGluZGV4LCBpdGVtKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgaW5kZXggdG8gdGhlIGVuZCBvZiB0aGUgbGlzdAotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gdGhlIHJlbW92ZWQgaXRlbXMuCi0JICogQHNlZSBMaXN0I3JlbW92ZShpbnQpCi0JICovCi0JcHVibGljIDxFPiBMaXN0PEU+IHJlbW92ZUl0ZW1zRnJvbUxpc3QoaW50IGluZGV4LCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVSYW5nZUZyb21MaXN0KGluZGV4LCBsaXN0LnNpemUoKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gdGhlIHJlbW92ZWQgaXRlbXMuCi0JICogQHNlZSBMaXN0I3JlbW92ZShpbnQpCi0JICovCi0JcHVibGljIDxFPiBMaXN0PEU+IHJlbW92ZUl0ZW1zRnJvbUxpc3QoaW50IGluZGV4LCBpbnQgbGVuZ3RoLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVSYW5nZUZyb21MaXN0KGluZGV4LCBpbmRleCArIGxlbmd0aCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4gVGhlIGJlZ2luIGluZGV4Ci0JICogaXMgaW5jbHVzaXZlLCB3aGlsZSB0aGUgZW5kIGluZGV4IGlzIGV4Y2x1c2l2ZS4KLQkgKiBSZXR1cm4gdGhlIHJlbW92ZWQgaXRlbXMuCi0JICogQHNlZSBMaXN0I3JlbW92ZShpbnQpCi0JICogQHNlZSBMaXN0I3N1Ykxpc3QoaW50LCBpbnQpCi0JICovCi0JcHVibGljIDxFPiBMaXN0PEU+IHJlbW92ZVJhbmdlRnJvbUxpc3QoaW50IGJlZ2luSW5kZXgsIGludCBlbmRJbmRleCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKGJlZ2luSW5kZXggPT0gZW5kSW5kZXgpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5yZW1vdmVSYW5nZUZyb21MaXN0XyhiZWdpbkluZGV4LCBlbmRJbmRleCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vIGVtcHR5IGNoZWNrCi0JICovCi0JcHJvdGVjdGVkIDxFPiBMaXN0PEU+IHJlbW92ZVJhbmdlRnJvbUxpc3RfKGludCBiZWdpbkluZGV4LCBpbnQgZW5kSW5kZXgsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCUxpc3Q8RT4gc3ViTGlzdCA9IGxpc3Quc3ViTGlzdChiZWdpbkluZGV4LCBlbmRJbmRleCk7Ci0JCUxpc3Q8RT4gcmVtb3ZlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFPihzdWJMaXN0KTsKLQkJc3ViTGlzdC5jbGVhcigpOwotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQobGlzdE5hbWUsIGJlZ2luSW5kZXgsIHJlbW92ZWRJdGVtcyk7Ci0JCXJldHVybiByZW1vdmVkSXRlbXM7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQocykgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBMaXN0I3JlbW92ZUFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUxpc3QoT2JqZWN0W10gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiAoaXRlbXMubGVuZ3RoICE9IDApCi0JCQkJJiYgKCAhIGxpc3QuaXNFbXB0eSgpKQotCQkJCSYmIHRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdF8obmV3IEFycmF5SXRlcmF0b3I8T2JqZWN0PihpdGVtcyksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudChzKSBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIExpc3QjcmVtb3ZlQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tTGlzdChDb2xsZWN0aW9uPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gKCAhIGl0ZW1zLmlzRW1wdHkoKSkKLQkJCQkmJiAoICEgbGlzdC5pc0VtcHR5KCkpCi0JCQkJJiYgdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0XyhpdGVtcy5pdGVyYXRvcigpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQocykgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBMaXN0I3JlbW92ZUFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUxpc3QoSXRlcmFibGU8Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3QoaXRlbXMuaXRlcmF0b3IoKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50KHMpIGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgTGlzdCNyZW1vdmVBbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21MaXN0KEl0ZXJhdG9yPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gKGl0ZW1zLmhhc05leHQoKSkKLQkJCQkmJiAoICEgbGlzdC5pc0VtcHR5KCkpCi0JCQkJJiYgdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0XyhpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vIGVtcHR5IGNoZWNrcwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUxpc3RfKEl0ZXJhdG9yPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ZW1zLmhhc05leHQoKSkgewotCQkJY2hhbmdlZCB8PSB0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpdGVtcy5uZXh0KCksIGxpc3QsIGxpc3ROYW1lKTsKLQkJfQotCQlyZXR1cm4gY2hhbmdlZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQocykgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBMaXN0I3JldGFpbkFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJldGFpbkl0ZW1zSW5MaXN0KE9iamVjdFtdIGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAobGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiB0aGlzLmNsZWFyTGlzdF8obGlzdCwgbGlzdE5hbWUpOwotCQl9Ci0JCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5MaXN0XyhuZXcgQXJyYXlJdGVyYXRvcjxPYmplY3Q+KGl0ZW1zKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudChzKSBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIExpc3QjcmV0YWluQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmV0YWluSXRlbXNJbkxpc3QoQ29sbGVjdGlvbjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKGxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGl0ZW1zLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuY2xlYXJMaXN0XyhsaXN0LCBsaXN0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkxpc3RfKGl0ZW1zLml0ZXJhdG9yKCksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQocykgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBMaXN0I3JldGFpbkFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJldGFpbkl0ZW1zSW5MaXN0KEl0ZXJhYmxlPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luTGlzdChpdGVtcy5pdGVyYXRvcigpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIHRoZSBzcGVjaWZpZWQgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50KHMpIGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgTGlzdCNyZXRhaW5BbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChJdGVyYXRvcjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKGxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCAhIGl0ZW1zLmhhc05leHQoKSkgewotCQkJcmV0dXJuIHRoaXMuY2xlYXJMaXN0XyhsaXN0LCBsaXN0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkxpc3RfKGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2tzCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkxpc3RfKEl0ZXJhdG9yPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlIYXNoQmFnPD8+IHJldGFpbmVkSXRlbXMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihpdGVtcyk7Ci0JCUhhc2hCYWc8Pz4gcmVtb3ZlZEl0ZW1zID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24obGlzdCk7Ci0JCXJlbW92ZWRJdGVtcy5yZW1vdmVBbGwocmV0YWluZWRJdGVtcyk7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3QocmVtb3ZlZEl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzcGVjaWZpZWQgaXRlbSBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB0aGUgcmVwbGFjZWQgaXRlbS4KLQkgKiBAc2VlIExpc3Qjc2V0KGludCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyA8RT4gRSBzZXRJdGVtSW5MaXN0KGludCBpbmRleCwgRSBpdGVtLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlFIG9sZEl0ZW0gPSBsaXN0LnNldChpbmRleCwgaXRlbSk7Ci0JCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZChsaXN0TmFtZSwgaW5kZXgsIGl0ZW0sIG9sZEl0ZW0pOwotCQlyZXR1cm4gb2xkSXRlbTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgaXRlbQotCSAqIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgcmVwbGFjZWQgaXRlbS4KLQkgKiBSZXR1cm4gLTEgaWYgdGhlIGl0ZW0gd2FzIG5vdCBmb3VuZCBpbiB0aGUgbGlzdC4KLQkgKiBAc2VlIExpc3Qjc2V0KGludCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyA8RT4gaW50IHJlcGxhY2VJdGVtSW5MaXN0KEUgb2xkSXRlbSwgRSBuZXdJdGVtLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAobGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZihvbGRJdGVtKTsKLQkJaWYgKChpbmRleCAhPSAtMSkgJiYgdGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQob2xkSXRlbSwgbmV3SXRlbSkpIHsKLQkJCWxpc3Quc2V0KGluZGV4LCBuZXdJdGVtKTsKLQkJCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZF8obGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtLCBvbGRJdGVtKTsKLQkJfQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzcGVjaWZpZWQgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gdGhlIHJlcGxhY2VkIGl0ZW1zLgotCSAqIEBzZWUgTGlzdCNzZXQoaW50LCBPYmplY3QpCi0JICovCi0JcHVibGljIDxFPiBMaXN0PEU+IHNldEl0ZW1zSW5MaXN0KGludCBpbmRleCwgRVtdIGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zZXRJdGVtc0luTGlzdF8oaW5kZXgsIEFycmF5cy5hc0xpc3QoaXRlbXMpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzcGVjaWZpZWQgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gdGhlIHJlcGxhY2VkIGl0ZW1zLgotCSAqIEBzZWUgTGlzdCNzZXQoaW50LCBPYmplY3QpCi0JICovCi0JcHVibGljIDxFPiBMaXN0PEU+IHNldEl0ZW1zSW5MaXN0KGludCBpbmRleCwgTGlzdDw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmIChpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zZXRJdGVtc0luTGlzdF8oaW5kZXgsIGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2sKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IExpc3Q8RT4gc2V0SXRlbXNJbkxpc3RfKGludCBpbmRleCwgTGlzdDw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCUxpc3Q8RT4gc3ViTGlzdCA9IGxpc3Quc3ViTGlzdChpbmRleCwgaW5kZXggKyBpdGVtcy5zaXplKCkpOwotCQlMaXN0PEU+IG9sZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFPihzdWJMaXN0KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJRSBuZXdJdGVtID0gaXRlbXMuZ2V0KGkpOwotCQkJRSBvbGRJdGVtID0gc3ViTGlzdC5zZXQoaSwgbmV3SXRlbSk7Ci0JCQl0aGlzLmZpcmVJdGVtUmVwbGFjZWQobGlzdE5hbWUsIGluZGV4ICsgaSwgbmV3SXRlbSwgb2xkSXRlbSk7Ci0JCX0KLQkJcmV0dXJuIG9sZEl0ZW1zOwotCX0KLQotCS8qKgotCSAqIE1vdmUgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBsaXN0IGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlCi0JICogc3BlY2lmaWVkIHRhcmdldCBpbmRleCBmb3IgdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gbW92ZUl0ZW1zSW5MaXN0KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAoKHRhcmdldEluZGV4ID09IHNvdXJjZUluZGV4KSB8fCAobGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gaXQncyB1bmxpa2VseSBidXQgcG9zc2libGUgdGhlIGxpc3QgaXMgdW5jaGFuZ2VkIGJ5IHRoZSBtb3ZlLi4uIChlLmcuIGFueSBtb3ZlcyB3aXRoaW4gWyJmb28iLCAiZm9vIiwgImZvbyJdLi4uKQotCQlDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCk7Ci0JCXRoaXMuZmlyZUl0ZW1zTW92ZWQobGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogTW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW0gaW4gdGhlIHNwZWNpZmllZCBsaXN0IHRvIHRoZQotCSAqIHNwZWNpZmllZCB0YXJnZXQgaW5kZXguCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gbW92ZUl0ZW1Jbkxpc3QoaW50IHRhcmdldEluZGV4LCBFIGl0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLm1vdmVJdGVtSW5MaXN0KHRhcmdldEluZGV4LCBsaXN0LmluZGV4T2YoaXRlbSksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGFuIGl0ZW0gaW4gdGhlIHNwZWNpZmllZCBsaXN0IGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlCi0JICogc3BlY2lmaWVkIHRhcmdldCBpbmRleC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBtb3ZlSXRlbUluTGlzdChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKHRhcmdldEluZGV4ID09IHNvdXJjZUluZGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwobGlzdC5nZXQodGFyZ2V0SW5kZXgpLCBsaXN0LmdldChzb3VyY2VJbmRleCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5maXJlSXRlbU1vdmVkXyhsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIGVudGlyZSBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgTGlzdCNjbGVhcigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2xlYXJMaXN0KExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiAoICEgbGlzdC5pc0VtcHR5KCkpICYmIHRoaXMuY2xlYXJMaXN0XyhsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2sKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbGVhckxpc3RfKExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWxpc3QuY2xlYXIoKTsKLQkJdGhpcy5maXJlTGlzdENsZWFyZWQobGlzdE5hbWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSB0aGUgbGlzdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmV3IGxpc3QsCi0JICogbWFraW5nIGEgbWluaW11bSBudW1iZXIgb2Ygc2V0cywgcmVtb3ZlcywgYW5kL29yIGFkZHMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gc3luY2hyb25pemVMaXN0KExpc3Q8RT4gbmV3TGlzdCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKG5ld0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5jbGVhckxpc3QobGlzdCwgbGlzdE5hbWUpOwotCQl9Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0xpc3RfKG5ld0xpc3QsIGxpc3QsIGxpc3ROYW1lKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zeW5jaHJvbml6ZUxpc3RfKG5ld0xpc3QsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSB0aGUgbGlzdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmV3IGxpc3QsCi0JICogbWFraW5nIGEgbWluaW11bSBudW1iZXIgb2Ygc2V0cywgcmVtb3ZlcywgYW5kL29yIGFkZHMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gc3luY2hyb25pemVMaXN0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBuZXdMaXN0LCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5zeW5jaHJvbml6ZUxpc3QobmV3TGlzdC5pdGVyYXRvcigpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU3luY2hyb25pemUgdGhlIGxpc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5ldyBsaXN0LAotCSAqIG1ha2luZyBhIG1pbmltdW0gbnVtYmVyIG9mIHNldHMsIHJlbW92ZXMsIGFuZC9vciBhZGRzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIHN5bmNocm9uaXplTGlzdChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gbmV3TGlzdCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKCAhIG5ld0xpc3QuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5jbGVhckxpc3QobGlzdCwgbGlzdE5hbWUpOwotCQl9Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0xpc3RfKG5ld0xpc3QsIGxpc3QsIGxpc3ROYW1lKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zeW5jaHJvbml6ZUxpc3RfKENvbGxlY3Rpb25Ub29scy5saXN0KG5ld0xpc3QpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2tzCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIHN5bmNocm9uaXplTGlzdF8oTGlzdDw/IGV4dGVuZHMgRT4gbmV3TGlzdCwgTGlzdDxFPiBvbGRMaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaW50IG5ld1NpemUgPSBuZXdMaXN0LnNpemUoKTsKLQkJaW50IG9sZFNpemUgPSBvbGRMaXN0LnNpemUoKTsKLQotCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJLy8gVE9ETyBjaGVjayBmb3IgUmFuZG9tQWNjZXNzCi0JCWludCBtaW4gPSBNYXRoLm1pbihuZXdTaXplLCBvbGRTaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaW47IGkrKykgewotCQkJRSBuZXdJdGVtID0gbmV3TGlzdC5nZXQoaSk7Ci0JCQlFIG9sZEl0ZW0gPSBvbGRMaXN0LnNldChpLCBuZXdJdGVtKTsKLQkJCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudChuZXdJdGVtLCBvbGRJdGVtKSkgewotCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZF8obGlzdE5hbWUsIGksIG5ld0l0ZW0sIG9sZEl0ZW0pOwotCQkJfQotCQl9Ci0KLQkJaWYgKG5ld1NpemUgPT0gb2xkU2l6ZSkgewotCQkJcmV0dXJuIGNoYW5nZWQ7Ci0JCX0KLQotCQlpZiAobmV3U2l6ZSA8IG9sZFNpemUpIHsKLQkJCXRoaXMucmVtb3ZlUmFuZ2VGcm9tTGlzdF8obmV3U2l6ZSwgb2xkU2l6ZSwgb2xkTGlzdCwgbGlzdE5hbWUpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvLyBuZXdTaXplID4gb2xkU2l6ZQotCQl0aGlzLmFkZEl0ZW1zVG9MaXN0XyhuZXdMaXN0LnN1Ykxpc3Qob2xkU2l6ZSwgbmV3U2l6ZSksIG9sZExpc3QsIGxpc3ROYW1lKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRyZWUgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxUcmVlQ2hhbmdlTGlzdGVuZXI+IFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTID0gVHJlZUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCi0JLyoqCi0JICogQWRkIGEgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgZm9yIHRoZSBzcGVjaWZpZWQgdHJlZS4gVGhlIGxpc3RlbmVyCi0JICogd2lsbCBiZSBub3RpZmllZCBvbmx5IGZvciBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpZWQgdHJlZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUcmVlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIHRyZWVOYW1lLCBUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5hZGRMaXN0ZW5lcihUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgdHJlZU5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSB0cmVlIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdhcyByZWdpc3RlcmVkIGZvciBhIHNwZWNpZmljIHRyZWUuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFN0cmluZyB0cmVlTmFtZSwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVtb3ZlTGlzdGVuZXIoVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHRyZWVOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSB0cmVlIGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIHRyZWUgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhTdHJpbmcgdHJlZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdGVuZXJzKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCB0cmVlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3Q8VHJlZUNoYW5nZUxpc3RlbmVyPiBnZXRUcmVlQ2hhbmdlTGlzdGVuZXJMaXN0KFN0cmluZyB0cmVlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0ZW5lckxpc3QoVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHRyZWVOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFRyZWVDaGFuZ2VMaXN0ZW5lcj4gZ2V0VHJlZUNoYW5nZUxpc3RlbmVycyhTdHJpbmcgdHJlZU5hbWUpIHsKLQkJTGlzdGVuZXJMaXN0PFRyZWVDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gdGhpcy5nZXRUcmVlQ2hhbmdlTGlzdGVuZXJMaXN0KHRyZWVOYW1lKTsKLQkJcmV0dXJuIChsaXN0ZW5lckxpc3QgPT0gbnVsbCkgPyBudWxsIDogbGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNUcmVlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIHRyZWVOYW1lLCBUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldFRyZWVDaGFuZ2VMaXN0ZW5lcnModHJlZU5hbWUpLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgdHJlZSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyB0cmVlTmFtZSA9IGV2ZW50LmdldFRyZWVOYW1lKCk7Ci0JCUl0ZXJhYmxlPFRyZWVDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRUcmVlQ2hhbmdlTGlzdGVuZXJzKHRyZWVOYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1RyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLm5vZGVBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5ub2RlQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIHRyZWUgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm9kZUFkZGVkKFN0cmluZyB0cmVlTmFtZSwgTGlzdDw/PiBwYXRoKSB7Ci0vLwkJdGhpcy5maXJlTm9kZUFkZGVkKG5ldyBUcmVlQWRkRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBwYXRoKSk7Ci0JCVRyZWVBZGRFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPFRyZWVDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRUcmVlQ2hhbmdlTGlzdGVuZXJzKHRyZWVOYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1RyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBUcmVlQWRkRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBwYXRoKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5ub2RlQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFRyZWVBZGRFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIHBhdGgpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLm5vZGVBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgdHJlZSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHRyZWVOYW1lID0gZXZlbnQuZ2V0VHJlZU5hbWUoKTsKLQkJSXRlcmFibGU8VHJlZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFRyZWVDaGFuZ2VMaXN0ZW5lcnModHJlZU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIubm9kZVJlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIubm9kZVJlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIHRyZWUgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm9kZVJlbW92ZWQoU3RyaW5nIHRyZWVOYW1lLCBMaXN0PD8+IHBhdGgpIHsKLS8vCQl0aGlzLmZpcmVOb2RlUmVtb3ZlZChuZXcgVHJlZVJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSwgcGF0aCkpOwotCi0JCVRyZWVSZW1vdmVFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPFRyZWVDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRUcmVlQ2hhbmdlTGlzdGVuZXJzKHRyZWVOYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1RyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBUcmVlUmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBwYXRoKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5ub2RlUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgVHJlZVJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSwgcGF0aCk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIubm9kZVJlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIHRyZWUgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHRyZWVOYW1lID0gZXZlbnQuZ2V0VHJlZU5hbWUoKTsKLQkJSXRlcmFibGU8VHJlZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFRyZWVDaGFuZ2VMaXN0ZW5lcnModHJlZU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIudHJlZUNsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIudHJlZUNsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIHRyZWUgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNsZWFyZWQoU3RyaW5nIHRyZWVOYW1lKSB7Ci0vLwkJdGhpcy5maXJlVHJlZUNsZWFyZWQobmV3IFRyZWVDbGVhckV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSkpOwotCi0JCVRyZWVDbGVhckV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8VHJlZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFRyZWVDaGFuZ2VMaXN0ZW5lcnModHJlZU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFRyZWVDbGVhckV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIudHJlZUNsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFRyZWVDbGVhckV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIudHJlZUNsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIHRyZWUgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyB0cmVlTmFtZSA9IGV2ZW50LmdldFRyZWVOYW1lKCk7Ci0JCUl0ZXJhYmxlPFRyZWVDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRUcmVlQ2hhbmdlTGlzdGVuZXJzKHRyZWVOYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1RyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLnRyZWVDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLnRyZWVDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCB0cmVlIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVRyZWVDaGFuZ2VkKFN0cmluZyB0cmVlTmFtZSwgQ29sbGVjdGlvbjw/PiBub2RlcykgewotLy8JCXRoaXMuZmlyZVRyZWVDaGFuZ2VkKG5ldyBUcmVlQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBub2RlcykpOwotCi0JCVRyZWVDaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPFRyZWVDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRUcmVlQ2hhbmdlTGlzdGVuZXJzKHRyZWVOYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1RyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBUcmVlQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBub2Rlcyk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIudHJlZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFRyZWVDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIG5vZGVzKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci50cmVlQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGF0dHJpYnV0ZSB2YWx1ZSBoYXMgY2hhbmdlZC4KLQkgKiBAc2VlIFRvb2xzI3ZhbHVlc0FyZUVxdWFsKE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbHVlc0FyZUVxdWFsKE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHZhbHVlMSwgdmFsdWUyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gYXR0cmlidXRlIHZhbHVlIGhhcyBjaGFuZ2VkLgotCSAqIEBzZWUgVG9vbHMjdmFsdWVzQXJlRGlmZmVyZW50KE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbHVlc0FyZURpZmZlcmVudChPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQodmFsdWUxLCB2YWx1ZTIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ29sbGVjdGlvblRvb2xzI2VsZW1lbnRzQXJlRXF1YWwoSXRlcmFibGUsIEl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVsZW1lbnRzQXJlRXF1YWwoSXRlcmFibGU8Pz4gaXRlcmFibGUxLCBJdGVyYWJsZTw/PiBpdGVyYWJsZTIpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGl0ZXJhYmxlMSwgaXRlcmFibGUyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbGxlY3Rpb25Ub29scyNlbGVtZW50c0FyZURpZmZlcmVudChJdGVyYWJsZSwgSXRlcmFibGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZWxlbWVudHNBcmVEaWZmZXJlbnQoSXRlcmFibGU8Pz4gaXRlcmFibGUxLCBJdGVyYWJsZTw/PiBpdGVyYWJsZTIpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZURpZmZlcmVudChpdGVyYWJsZTEsIGl0ZXJhYmxlMik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5zb3VyY2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBQYWlyIGEgcG9zc2libHkgPGNvZGU+bnVsbDwvY29kZT4gYXNwZWN0IG5hbWUgd2l0aCBpdHMgYXNzb2NpYXRlZAotCSAqIGxpc3RlbmVycy4KLQkgKi8KLQlzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQXNwZWN0TGlzdGVuZXJMaXN0UGFpcjxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4KLQkJaW1wbGVtZW50cyBTZXJpYWxpemFibGUKLQl7Ci0JCWZpbmFsIExpc3RlbmVyTGlzdDxMPiBsaXN0ZW5lckxpc3Q7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJQXNwZWN0TGlzdGVuZXJMaXN0UGFpcihDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBMIGxpc3RlbmVyKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5saXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PEw+KGxpc3RlbmVyQ2xhc3MsIGxpc3RlbmVyKTsKLQkJfQotCi0JCWJvb2xlYW4gbWF0Y2hlcyhDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzcywgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJUeXBlKCkgPT0gbGlzdGVuZXJDbGFzczsKLQkJfQotCi0JCWJvb2xlYW4gbWF0Y2hlcyhDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzcykgewotCQkJcmV0dXJuIHRoaXMubWF0Y2hlcyhsaXN0ZW5lckNsYXNzLCBudWxsKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5nZXRBc3BlY3ROYW1lKCkpOwotCQl9Ci0KLQkJYWJzdHJhY3QgU3RyaW5nIGdldEFzcGVjdE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWlyIGEgbm9uLTxjb2RlPm51bGw8L2NvZGU+IGFzcGVjdCBuYW1lIHdpdGggaXRzIGFzc29jaWF0ZWQgbGlzdGVuZXJzLgotCSAqLwotCXN0YXRpYyBjbGFzcyBTaW1wbGVBc3BlY3RMaXN0ZW5lckxpc3RQYWlyPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPgotCQlleHRlbmRzIEFzcGVjdExpc3RlbmVyTGlzdFBhaXI8TD4KLQl7Ci0JCWZpbmFsIFN0cmluZyBhc3BlY3ROYW1lOwotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCVNpbXBsZUFzcGVjdExpc3RlbmVyTGlzdFBhaXIoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUsIEwgbGlzdGVuZXIpIHsKLQkJCXN1cGVyKGxpc3RlbmVyQ2xhc3MsIGxpc3RlbmVyKTsKLQkJCWlmIChhc3BlY3ROYW1lID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuYXNwZWN0TmFtZSA9IGFzcGVjdE5hbWU7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJYm9vbGVhbiBtYXRjaGVzKENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBsaXN0ZW5lckNsYXNzLCBAU3VwcHJlc3NXYXJuaW5ncygiaGlkaW5nIikgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJCXJldHVybiB0aGlzLmFzcGVjdE5hbWUuZXF1YWxzKGFzcGVjdE5hbWUpCi0JCQkJCSYmIHN1cGVyLm1hdGNoZXMobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJU3RyaW5nIGdldEFzcGVjdE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5hc3BlY3ROYW1lOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFpciBhIDxjb2RlPm51bGw8L2NvZGU+IGFzcGVjdCBuYW1lIHdpdGggaXRzIGFzc29jaWF0ZWQgbGlzdGVuZXJzLgotCSAqLwotCXN0YXRpYyBjbGFzcyBOdWxsQXNwZWN0TGlzdGVuZXJMaXN0UGFpcjxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4KLQkJZXh0ZW5kcyBBc3BlY3RMaXN0ZW5lckxpc3RQYWlyPEw+Ci0JewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlOdWxsQXNwZWN0TGlzdGVuZXJMaXN0UGFpcihDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBMIGxpc3RlbmVyKSB7Ci0JCQlzdXBlcihsaXN0ZW5lckNsYXNzLCBsaXN0ZW5lcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJYm9vbGVhbiBtYXRjaGVzKENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSkgewotCQkJcmV0dXJuIChhc3BlY3ROYW1lID09IG51bGwpCi0JCQkJCSYmIHN1cGVyLm1hdGNoZXMobGlzdGVuZXJDbGFzcywgbnVsbCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJU3RyaW5nIGdldEFzcGVjdE5hbWUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL1NpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL1NpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2NDFkMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLQotLyoqCi0gKiBUaGlzIGNoYW5nZSBzdXBwb3J0IGNsYXNzIGNoYW5nZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSBzdGFuZGFyZAotICogY2hhbmdlIHN1cHBvcnQgaW4gc2V2ZXJhbCB3YXlzOjx1bD4KLSAqIDxsaT5BbGwgZXZlbnRzIGZpcmVkIGJ5IHRoZSBzb3VyY2UgbXVzdCBzcGVjaWZ5IHRoZSBzaW5nbGUgYXNwZWN0LgotICogPGxpPkxpc3RlbmVycyBhcmUgcmVxdWlyZWQgdG8gYmUgZWl0aGVyICJnZW5lcmFsIHB1cnBvc2UiIGxpc3RlbmVycyBvcgotICogCSAgICBsaXN0ZW5lcnMgb2YgdGhlIHNpbmdsZSBhc3BlY3QuCi0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydAotCWV4dGVuZHMgQ2hhbmdlU3VwcG9ydAotewotCXByb3RlY3RlZCBmaW5hbCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdmFsaWRMaXN0ZW5lckNsYXNzOwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgdmFsaWRBc3BlY3ROYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHVibGljIFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQoTW9kZWwgc291cmNlLCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdmFsaWRMaXN0ZW5lckNsYXNzLCBTdHJpbmcgdmFsaWRBc3BlY3ROYW1lKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JCWlmICggISB2YWxpZExpc3RlbmVyQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0aGlzLmdldENoYW5nZUxpc3RlbmVyQ2xhc3MoKSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjaGFuZ2Ugc3VwcG9ydCdzIGNoYW5nZSBsaXN0ZW5lciBjbGFzcyAoIiArIHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJDbGFzcygpLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQKLQkJCQkJIikgZG9lcyBub3QgZXh0ZW5kIHRoZSB2YWxpZCBsaXN0ZW5lciBjbGFzczogIiArIHZhbGlkTGlzdGVuZXJDbGFzcy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy52YWxpZExpc3RlbmVyQ2xhc3MgPSB2YWxpZExpc3RlbmVyQ2xhc3M7Ci0JCXRoaXMudmFsaWRBc3BlY3ROYW1lID0gdmFsaWRBc3BlY3ROYW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGJ1aWxkVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCXJldHVybiBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0JCQkJIlRoaXMgTW9kZWwgc3VwcG9ydHMgb25seSBjaGFuZ2VzIGZvciB0aGUgbGlzdGVuZXIgdHlwZSBcIiIgKyB0aGlzLnZhbGlkTGlzdGVuZXJDbGFzcy5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCSsgIlwiIGFuZCB0aGUgYXNwZWN0IFwiIiArIHRoaXMudmFsaWRBc3BlY3ROYW1lICsgJyInIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGxpc3RlbmVyIGNhbiBiZSBlaXRoZXIgYW4gaW5zdGFuY2Ugb2YgdGhlIHZhbGlkIGxpc3RlbmVyIGNsYXNzIG9yCi0JICogdGhlICJnZW5lcmFsLXB1cnBvc2UiIGNoYW5nZSBsaXN0ZW5lciBjbGFzcyAod2hpY2ggc2hvdWxkIGV4dGVuZCB0aGUKLQkgKiB0aGUgdmFsaWQgbGlzdGVuZXIgY2xhc3MpLgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVjayhDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzcykgewotCQlpZiAoKGxpc3RlbmVyQ2xhc3MgIT0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lckNsYXNzKCkpICYmIChsaXN0ZW5lckNsYXNzICE9IHRoaXMudmFsaWRMaXN0ZW5lckNsYXNzKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlRoaXMgTW9kZWwgc3VwcG9ydHMgb25seSBjaGFuZ2VzIGZvciB0aGUgbGlzdGVuZXIgdHlwZSBcIiIgKyB0aGlzLnZhbGlkTGlzdGVuZXJDbGFzcy5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkrICJcIiA6IFwiIiArIGxpc3RlbmVyQ2xhc3MuZ2V0TmFtZSgpICsgJyInIC8vJE5PTi1OTFMtMSQKLQkJCQkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2soQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXRoaXMuY2hlY2sobGlzdGVuZXJDbGFzcyk7Ci0JCWlmICggISBhc3BlY3ROYW1lLmVxdWFscyh0aGlzLnZhbGlkQXNwZWN0TmFtZSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJUaGlzIE1vZGVsIHN1cHBvcnRzIG9ubHkgY2hhbmdlcyBmb3IgdGhlIGFzcGVjdCBcIiIgKyB0aGlzLnZhbGlkQXNwZWN0TmFtZSAvLyROT04tTkxTLTEkCi0JCQkJCSsgIlwiIDogXCIiICsgYXNwZWN0TmFtZSArICciJyAvLyROT04tTkxTLTEkCi0JCQkJKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2b2lkIGFkZExpc3RlbmVyKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lLCBMIGxpc3RlbmVyKSB7Ci0JCXRoaXMuY2hlY2sobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSk7Ci0JCXN1cGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdm9pZCBhZGRMaXN0ZW5lcihDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBMIGxpc3RlbmVyKSB7Ci0JCXRoaXMuY2hlY2sobGlzdGVuZXJDbGFzcyk7Ci0JCXN1cGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyQ2xhc3MsIGxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdm9pZCByZW1vdmVMaXN0ZW5lcihDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSwgTCBsaXN0ZW5lcikgewotCQl0aGlzLmNoZWNrKGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpOwotCQlzdXBlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgTCBsaXN0ZW5lcikgewotCQl0aGlzLmNoZWNrKGxpc3RlbmVyQ2xhc3MpOwotCQlzdXBlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lckNsYXNzLCBsaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gYm9vbGVhbiBoYXNBbnlMaXN0ZW5lcnMoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJdGhpcy5jaGVjayhsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lKTsKLQkJcmV0dXJuIHN1cGVyLmhhc0FueUxpc3RlbmVycyhsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBib29sZWFuIGhhc0FueUxpc3RlbmVycyhDbGFzczxMPiBsaXN0ZW5lckNsYXNzKSB7Ci0JCXRoaXMuY2hlY2sobGlzdGVuZXJDbGFzcyk7Ci0JCXJldHVybiBzdXBlci5oYXNBbnlMaXN0ZW5lcnMobGlzdGVuZXJDbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aHJvdyB0aGlzLmJ1aWxkVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlU3RhdGVDaGFuZ2VkKCkgewotCQl0aHJvdyB0aGlzLmJ1aWxkVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZmlyZVByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCXJldHVybiBzdXBlci5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMuY2hlY2soUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotCQl0aGlzLmNoZWNrKFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIHN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBvbGRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotCQl0aGlzLmNoZWNrKFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIHN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJcmV0dXJuIHN1cGVyLmZpcmVJdGVtc0FkZGVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNBZGRlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gYWRkZWRJdGVtcykgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCXJldHVybiBzdXBlci5maXJlSXRlbXNBZGRlZChjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1BZGRlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdCBhZGRlZEl0ZW0pIHsKLQkJdGhpcy5jaGVjayhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgY29sbGVjdGlvbk5hbWUpOwotCQlzdXBlci5maXJlSXRlbUFkZGVkKGNvbGxlY3Rpb25OYW1lLCBhZGRlZEl0ZW0pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlyZXR1cm4gc3VwZXIuZmlyZUl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zUmVtb3ZlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gcmVtb3ZlZEl0ZW1zKSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lKTsKLQkJcmV0dXJuIHN1cGVyLmZpcmVJdGVtc1JlbW92ZWQoY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1SZW1vdmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IHJlbW92ZWRJdGVtKSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lKTsKLQkJc3VwZXIuZmlyZUl0ZW1SZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlzdXBlci5maXJlQ29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2xlYXJlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJdGhpcy5jaGVjayhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgY29sbGVjdGlvbk5hbWUpOwotCQlzdXBlci5maXJlQ29sbGVjdGlvbkNsZWFyZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lKTsKLQkJc3VwZXIuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKGNvbGxlY3Rpb25OYW1lLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCXJldHVybiBzdXBlci5maXJlSXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zQWRkZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gYWRkZWRJdGVtcykgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JCXJldHVybiBzdXBlci5maXJlSXRlbXNBZGRlZChsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBhZGRlZEl0ZW0pIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlzdXBlci5maXJlSXRlbUFkZGVkKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJcmV0dXJuIHN1cGVyLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc1JlbW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gcmVtb3ZlZEl0ZW1zKSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lKTsKLQkJcmV0dXJuIHN1cGVyLmZpcmVJdGVtc1JlbW92ZWQobGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtUmVtb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IHJlbW92ZWRJdGVtKSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lKTsKLQkJc3VwZXIuZmlyZUl0ZW1SZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW0pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCXJldHVybiBzdXBlci5maXJlSXRlbXNSZXBsYWNlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zUmVwbGFjZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gbmV3SXRlbXMsIExpc3Q8Pz4gcmVwbGFjZWRJdGVtcykgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JCXJldHVybiBzdXBlci5maXJlSXRlbXNSZXBsYWNlZChsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW1zLCByZXBsYWNlZEl0ZW1zKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbVJlcGxhY2VkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgbmV3SXRlbSwgT2JqZWN0IHJlcGxhY2VkSXRlbSkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JCXJldHVybiBzdXBlci5maXJlSXRlbVJlcGxhY2VkKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbSwgcmVwbGFjZWRJdGVtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlyZXR1cm4gc3VwZXIuZmlyZUl0ZW1zTW92ZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc01vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlyZXR1cm4gc3VwZXIuZmlyZUl0ZW1zTW92ZWQobGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVMaXN0Q2xlYXJlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDbGVhcmVkKFN0cmluZyBsaXN0TmFtZSkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JCXN1cGVyLmZpcmVMaXN0Q2xlYXJlZChsaXN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJc3VwZXIuZmlyZUxpc3RDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENoYW5nZWQoU3RyaW5nIGxpc3ROYW1lLCBMaXN0PD8+IGxpc3QpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlzdXBlci5maXJlTGlzdENoYW5nZWQobGlzdE5hbWUsIGxpc3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmVlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVOb2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldFRyZWVOYW1lKCkpOwotCQlzdXBlci5maXJlTm9kZUFkZGVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTm9kZUFkZGVkKFN0cmluZyB0cmVlTmFtZSwgTGlzdDw/PiBwYXRoKSB7Ci0JCXRoaXMuY2hlY2soVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHRyZWVOYW1lKTsKLQkJc3VwZXIuZmlyZU5vZGVBZGRlZCh0cmVlTmFtZSwgcGF0aCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZU5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRUcmVlTmFtZSgpKTsKLQkJc3VwZXIuZmlyZU5vZGVSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTm9kZVJlbW92ZWQoU3RyaW5nIHRyZWVOYW1lLCBMaXN0PD8+IHBhdGgpIHsKLQkJdGhpcy5jaGVjayhUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgdHJlZU5hbWUpOwotCQlzdXBlci5maXJlTm9kZVJlbW92ZWQodHJlZU5hbWUsIHBhdGgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRUcmVlTmFtZSgpKTsKLQkJc3VwZXIuZmlyZVRyZWVDbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNsZWFyZWQoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXRoaXMuY2hlY2soVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHRyZWVOYW1lKTsKLQkJc3VwZXIuZmlyZVRyZWVDbGVhcmVkKHRyZWVOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldFRyZWVOYW1lKCkpOwotCQlzdXBlci5maXJlVHJlZUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2hhbmdlZChTdHJpbmcgdHJlZU5hbWUsIENvbGxlY3Rpb248Pz4gbm9kZXMpIHsKLQkJdGhpcy5jaGVjayhUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgdHJlZU5hbWUpOwotCQlzdXBlci5maXJlVHJlZUNoYW5nZWQodHJlZU5hbWUsIG5vZGVzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYxNmVhNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgY2hhbmdlIGxpc3RlbmVyIGFuZCBmb3J3YXJkIGV2ZW50cyB0byBpdCBvbiB0aGUgQVdUCi0gKiBldmVudCBxdWV1ZSwgYXN5bmNocm9ub3VzbHkgaWYgbmVjZXNzYXJ5LiBJZiB0aGUgZXZlbnQgYXJyaXZlZCBvbiB0aGUgVUkKLSAqIHRocmVhZCB0aGF0IGlzIHByb2JhYmx5IGJlY2F1c2UgaXQgd2FzIGluaXRpYXRlZCBieSBhIFVJIHdpZGdldDsgYXMgYQotICogcmVzdWx0LCB3ZSB3YW50IHRvIGxvb3AgYmFjayBzeW5jaHJvbm91c2x5IHNvIHRoZSBldmVudHMgY2FuIGJlCi0gKiBzaG9ydC1jaXJjdWl0ZWQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCi0JcHVibGljIEFXVENoYW5nZUxpc3RlbmVyV3JhcHBlcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLnN0YXRlQ2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRTdGF0ZUNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMucHJvcGVydHlDaGFuZ2VkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc01vdmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zUmVwbGFjZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNSZXBsYWNlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5saXN0Q2xlYXJlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRMaXN0Q2xlYXJlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMubGlzdENoYW5nZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkTGlzdENoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5ub2RlQWRkZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkTm9kZUFkZGVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5ub2RlUmVtb3ZlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGROb2RlUmVtb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy50cmVlQ2xlYXJlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRUcmVlQ2xlYXJlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMudHJlZUNoYW5nZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkVHJlZUNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFN0YXRlQ2hhbmdlZFJ1bm5hYmxlKGZpbmFsIFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5zdGF0ZUNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUHJvcGVydHlDaGFuZ2VkUnVubmFibGUoZmluYWwgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLnByb3BlcnR5Q2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNBZGRlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgYWRkZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgcmVtb3ZlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkQ29sbGVjdGlvbkNsZWFyZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLmNvbGxlY3Rpb25DbGVhcmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb2xsZWN0aW9uIGNsZWFyZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZENvbGxlY3Rpb25DaGFuZ2VkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuY29sbGVjdGlvbkNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2hhbmdlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNBZGRlZFJ1bm5hYmxlKGZpbmFsIExpc3RBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIGFkZGVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShmaW5hbCBMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlbW92ZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShmaW5hbCBMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNNb3ZlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgbW92ZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zUmVwbGFjZWRSdW5uYWJsZShmaW5hbCBMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNSZXBsYWNlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgcmVwbGFjZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZExpc3RDbGVhcmVkUnVubmFibGUoZmluYWwgTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5saXN0Q2xlYXJlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjbGVhcmVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRMaXN0Q2hhbmdlZFJ1bm5hYmxlKGZpbmFsIExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLmxpc3RDaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGNoYW5nZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE5vZGVBZGRlZFJ1bm5hYmxlKGZpbmFsIFRyZWVBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLm5vZGVBZGRlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibm9kZSBhZGRlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkTm9kZVJlbW92ZWRSdW5uYWJsZShmaW5hbCBUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5ub2RlUmVtb3ZlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibm9kZSByZW1vdmVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRUcmVlQ2xlYXJlZFJ1bm5hYmxlKGZpbmFsIFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMudHJlZUNsZWFyZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyZWUgY2xlYXJlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkVHJlZUNoYW5nZWRSdW5uYWJsZShmaW5hbCBUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy50cmVlQ2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidHJlZSBjaGFuZ2VkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSB7Ci0JCXJldHVybiBFdmVudFF1ZXVlLmlzRGlzcGF0Y2hUaHJlYWQoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGxpbmsgRXZlbnRRdWV1ZSNpbnZva2VMYXRlcihSdW5uYWJsZSl9IHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nIHtAbGluayBFdmVudFF1ZXVlI2ludm9rZUFuZFdhaXQoUnVubmFibGUpfSBjYW4gc29tZXRpbWVzIG1ha2UKLQkgKiB0aGluZ3MgbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25FdmVudFF1ZXVlKFJ1bm5hYmxlIHIpIHsKLQkJRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihyKTsKLS8vCQl0cnkgewotLy8JCQlFdmVudFF1ZXVlLmludm9rZUFuZFdhaXQocik7Ci0vLwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0KLQl9Ci0KLQl2b2lkIHN0YXRlQ2hhbmdlZF8oU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnN0YXRlQ2hhbmdlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBwcm9wZXJ0eUNoYW5nZWRfKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNBZGRlZF8oQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBpdGVtc1JlbW92ZWRfKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZF8oQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZF8oQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNBZGRlZF8oTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBpdGVtc1JlbW92ZWRfKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBpdGVtc01vdmVkXyhMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNNb3ZlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBpdGVtc1JlcGxhY2VkXyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBsaXN0Q2xlYXJlZF8oTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5saXN0Q2xlYXJlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBsaXN0Q2hhbmdlZF8oTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubGlzdENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbm9kZUFkZGVkXyhUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5ub2RlQWRkZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbm9kZVJlbW92ZWRfKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLm5vZGVSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIHRyZWVDbGVhcmVkXyhUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnRyZWVDbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIHRyZWVDaGFuZ2VkXyhUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci50cmVlQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJBV1QoIiArIHRoaXMubGlzdGVuZXIudG9TdHJpbmcoKSArICcpJzsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YWY1MmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3Q7Ci0KLWltcG9ydCBqYXZhLmF3dC5FdmVudFF1ZXVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIGFuZCBmb3J3YXJkIGV2ZW50cyB0byBpdCBvbiB0aGUgQVdUCi0gKiBldmVudCBxdWV1ZSwgYXN5bmNocm9ub3VzbHkgaWYgbmVjZXNzYXJ5LiBJZiB0aGUgZXZlbnQgYXJyaXZlZCBvbiB0aGUgVUkKLSAqIHRocmVhZCB0aGF0IGlzIHByb2JhYmx5IGJlY2F1c2UgaXQgd2FzIGluaXRpYXRlZCBieSBhIFVJIHdpZGdldDsgYXMgYQotICogcmVzdWx0LCB3ZSB3YW50IHRvIGxvb3AgYmFjayBzeW5jaHJvbm91c2x5IHNvIHRoZSBldmVudHMgY2FuIGJlCi0gKiBzaG9ydC1jaXJjdWl0ZWQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIKLXsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXB1YmxpYyBBV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNBZGRlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkQ29sbGVjdGlvbkNsZWFyZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZENvbGxlY3Rpb25DaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIGFkZGVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyByZW1vdmVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRDb2xsZWN0aW9uQ2xlYXJlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLmNvbGxlY3Rpb25DbGVhcmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb2xsZWN0aW9uIGNsZWFyZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZENvbGxlY3Rpb25DaGFuZ2VkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb2xsZWN0aW9uIGNoYW5nZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRXhlY3V0aW5nT25VSVRocmVhZCgpIHsKLQkJcmV0dXJuIEV2ZW50UXVldWUuaXNEaXNwYXRjaFRocmVhZCgpOwotCX0KLQotCS8qKgotCSAqIHtAbGluayBFdmVudFF1ZXVlI2ludm9rZUxhdGVyKFJ1bm5hYmxlKX0gc2VlbXMgdG8gd29yayBPSzsKLQkgKiBidXQgdXNpbmcge0BsaW5rIEV2ZW50UXVldWUjaW52b2tlQW5kV2FpdChSdW5uYWJsZSl9IGNhbiBzb21ldGltZXMgbWFrZQotCSAqIHRoaW5ncyBtb3JlIHByZWRpY3RhYmxlIHdoZW4gZGVidWdnaW5nLCBhdCB0aGUgcmlzayBvZiBkZWFkbG9ja3MuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPbkV2ZW50UXVldWUoUnVubmFibGUgcikgewotCQlFdmVudFF1ZXVlLmludm9rZUxhdGVyKHIpOwotLy8JCXRyeSB7Ci0vLwkJCUV2ZW50UXVldWUuaW52b2tlQW5kV2FpdChyKTsKLS8vCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfQotCX0KLQotCXZvaWQgaXRlbXNBZGRlZF8oQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBpdGVtc1JlbW92ZWRfKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZF8oQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZF8oQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiQVdUKCIgKyB0aGlzLmxpc3RlbmVyLnRvU3RyaW5nKCkgKyAnKSc7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzQ3N2Y0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBsaXN0IGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIEFXVAotICogZXZlbnQgcXVldWUsIGFzeW5jaHJvbm91c2x5IGlmIG5lY2Vzc2FyeS4gSWYgdGhlIGV2ZW50IGFycml2ZWQgb24gdGhlIFVJCi0gKiB0aHJlYWQgdGhhdCBpcyBwcm9iYWJseSBiZWNhdXNlIGl0IHdhcyBpbml0aWF0ZWQgYnkgYSBVSSB3aWRnZXQ7IGFzIGEKLSAqIHJlc3VsdCwgd2Ugd2FudCB0byBsb29wIGJhY2sgc3luY2hyb25vdXNseSBzbyB0aGUgZXZlbnRzIGNhbiBiZQotICogc2hvcnQtY2lyY3VpdGVkLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgTGlzdENoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcihMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc01vdmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zUmVwbGFjZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNSZXBsYWNlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5saXN0Q2xlYXJlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRMaXN0Q2xlYXJlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMubGlzdENoYW5nZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkTGlzdENoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShmaW5hbCBMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNBZGRlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgYWRkZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlbW92ZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShmaW5hbCBMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zTW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIG1vdmVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc1JlcGxhY2VkUnVubmFibGUoZmluYWwgTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlcGxhY2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyByZXBsYWNlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkTGlzdENsZWFyZWRSdW5uYWJsZShmaW5hbCBMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5saXN0Q2xlYXJlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjbGVhcmVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRMaXN0Q2hhbmdlZFJ1bm5hYmxlKGZpbmFsIExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5saXN0Q2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2VkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSB7Ci0JCXJldHVybiBFdmVudFF1ZXVlLmlzRGlzcGF0Y2hUaHJlYWQoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGxpbmsgRXZlbnRRdWV1ZSNpbnZva2VMYXRlcihSdW5uYWJsZSl9IHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nIHtAbGluayBFdmVudFF1ZXVlI2ludm9rZUFuZFdhaXQoUnVubmFibGUpfSBjYW4gc29tZXRpbWVzIG1ha2UKLQkgKiB0aGluZ3MgbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25FdmVudFF1ZXVlKFJ1bm5hYmxlIHIpIHsKLQkJRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihyKTsKLS8vCQl0cnkgewotLy8JCQlFdmVudFF1ZXVlLmludm9rZUFuZFdhaXQocik7Ci0vLwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0KLQl9Ci0KLQl2b2lkIGl0ZW1zQWRkZWRfKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZW1vdmVkXyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNNb3ZlZF8oTGlzdE1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zTW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZXBsYWNlZF8oTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbGlzdENsZWFyZWRfKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubGlzdENsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbGlzdENoYW5nZWRfKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkFXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDZiZDhiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBBV1QKLSAqIGV2ZW50IHF1ZXVlLCBhc3luY2hyb25vdXNseSBpZiBuZWNlc3NhcnkuIElmIHRoZSBldmVudCBhcnJpdmVkIG9uIHRoZSBVSQotICogdGhyZWFkIHRoYXQgaXMgcHJvYmFibHkgYmVjYXVzZSBpdCB3YXMgaW5pdGlhdGVkIGJ5IGEgVUkgd2lkZ2V0OyBhcyBhCi0gKiByZXN1bHQsIHdlIHdhbnQgdG8gbG9vcCBiYWNrIHN5bmNocm9ub3VzbHkgc28gdGhlIGV2ZW50cyBjYW4gYmUKLSAqIHNob3J0LWNpcmN1aXRlZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0KLQlwdWJsaWMgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLnByb3BlcnR5Q2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFByb3BlcnR5Q2hhbmdlZFJ1bm5hYmxlKGZpbmFsIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLnByb3BlcnR5Q2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicHJvcGVydHkgY2hhbmdlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkgewotCQlyZXR1cm4gRXZlbnRRdWV1ZS5pc0Rpc3BhdGNoVGhyZWFkKCk7Ci0JfQotCi0JLyoqCi0JICoge0BsaW5rIEV2ZW50UXVldWUjaW52b2tlTGF0ZXIoUnVubmFibGUpfSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyB7QGxpbmsgRXZlbnRRdWV1ZSNpbnZva2VBbmRXYWl0KFJ1bm5hYmxlKX0gY2FuIHNvbWV0aW1lcyBtYWtlCi0JICogdGhpbmdzIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uRXZlbnRRdWV1ZShSdW5uYWJsZSByKSB7Ci0JCUV2ZW50UXVldWUuaW52b2tlTGF0ZXIocik7Ci0vLwkJdHJ5IHsKLS8vCQkJRXZlbnRRdWV1ZS5pbnZva2VBbmRXYWl0KHIpOwotLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9Ci0JfQotCi0Jdm9pZCBwcm9wZXJ0eUNoYW5nZWRfKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiQVdUKCIgKyB0aGlzLmxpc3RlbmVyLnRvU3RyaW5nKCkgKyAnKSc7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZWNmMmIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3Q7Ci0KLWltcG9ydCBqYXZhLmF3dC5FdmVudFF1ZXVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIHN0YXRlIGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIEFXVAotICogZXZlbnQgcXVldWUsIGFzeW5jaHJvbm91c2x5IGlmIG5lY2Vzc2FyeS4gSWYgdGhlIGV2ZW50IGFycml2ZWQgb24gdGhlIFVJCi0gKiB0aHJlYWQgdGhhdCBpcyBwcm9iYWJseSBiZWNhdXNlIGl0IHdhcyBpbml0aWF0ZWQgYnkgYSBVSSB3aWRnZXQ7IGFzIGEKLSAqIHJlc3VsdCwgd2Ugd2FudCB0byBsb29wIGJhY2sgc3luY2hyb25vdXNseSBzbyB0aGUgZXZlbnRzIGNhbiBiZQotICogc2hvcnQtY2lyY3VpdGVkLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIFN0YXRlQ2hhbmdlTGlzdGVuZXIKLXsKLQlwcml2YXRlIGZpbmFsIFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLnN0YXRlQ2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRTdGF0ZUNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFN0YXRlQ2hhbmdlZFJ1bm5hYmxlKGZpbmFsIFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLnN0YXRlQ2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic3RhdGUgY2hhbmdlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkgewotCQlyZXR1cm4gRXZlbnRRdWV1ZS5pc0Rpc3BhdGNoVGhyZWFkKCk7Ci0JfQotCi0JLyoqCi0JICoge0BsaW5rIEV2ZW50UXVldWUjaW52b2tlTGF0ZXIoUnVubmFibGUpfSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyB7QGxpbmsgRXZlbnRRdWV1ZSNpbnZva2VBbmRXYWl0KFJ1bm5hYmxlKX0gY2FuIHNvbWV0aW1lcyBtYWtlCi0JICogdGhpbmdzIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uRXZlbnRRdWV1ZShSdW5uYWJsZSByKSB7Ci0JCUV2ZW50UXVldWUuaW52b2tlTGF0ZXIocik7Ci0vLwkJdHJ5IHsKLS8vCQkJRXZlbnRRdWV1ZS5pbnZva2VBbmRXYWl0KHIpOwotLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9Ci0JfQotCi0Jdm9pZCBzdGF0ZUNoYW5nZWRfKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5zdGF0ZUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiQVdUKCIgKyB0aGlzLmxpc3RlbmVyLnRvU3RyaW5nKCkgKyAnKSc7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTYwNDY5ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dDsKLQotaW1wb3J0IGphdmEuYXd0LkV2ZW50UXVldWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBBV1QKLSAqIGV2ZW50IHF1ZXVlLCBhc3luY2hyb25vdXNseSBpZiBuZWNlc3NhcnkuIElmIHRoZSBldmVudCBhcnJpdmVkIG9uIHRoZSBVSQotICogdGhyZWFkIHRoYXQgaXMgcHJvYmFibHkgYmVjYXVzZSBpdCB3YXMgaW5pdGlhdGVkIGJ5IGEgVUkgd2lkZ2V0OyBhcyBhCi0gKiByZXN1bHQsIHdlIHdhbnQgdG8gbG9vcCBiYWNrIHN5bmNocm9ub3VzbHkgc28gdGhlIGV2ZW50cyBjYW4gYmUKLSAqIHNob3J0LWNpcmN1aXRlZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIFRyZWVDaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgZmluYWwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHVibGljIEFXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5ub2RlQWRkZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkTm9kZUFkZGVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5ub2RlUmVtb3ZlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGROb2RlUmVtb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy50cmVlQ2xlYXJlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRUcmVlQ2xlYXJlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMudHJlZUNoYW5nZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkVHJlZUNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE5vZGVBZGRlZFJ1bm5hYmxlKGZpbmFsIFRyZWVBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5ub2RlQWRkZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIm5vZGUgYWRkZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE5vZGVSZW1vdmVkUnVubmFibGUoZmluYWwgVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLm5vZGVSZW1vdmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJub2RlIHJlbW92ZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFRyZWVDbGVhcmVkUnVubmFibGUoZmluYWwgVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMudHJlZUNsZWFyZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyZWUgY2xlYXJlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkVHJlZUNoYW5nZWRSdW5uYWJsZShmaW5hbCBUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMudHJlZUNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyZWUgY2hhbmdlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkgewotCQlyZXR1cm4gRXZlbnRRdWV1ZS5pc0Rpc3BhdGNoVGhyZWFkKCk7Ci0JfQotCi0JLyoqCi0JICoge0BsaW5rIEV2ZW50UXVldWUjaW52b2tlTGF0ZXIoUnVubmFibGUpfSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyB7QGxpbmsgRXZlbnRRdWV1ZSNpbnZva2VBbmRXYWl0KFJ1bm5hYmxlKX0gY2FuIHNvbWV0aW1lcyBtYWtlCi0JICogdGhpbmdzIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uRXZlbnRRdWV1ZShSdW5uYWJsZSByKSB7Ci0JCUV2ZW50UXVldWUuaW52b2tlTGF0ZXIocik7Ci0vLwkJdHJ5IHsKLS8vCQkJRXZlbnRRdWV1ZS5pbnZva2VBbmRXYWl0KHIpOwotLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9Ci0JfQotCi0Jdm9pZCBub2RlQWRkZWRfKFRyZWVBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLm5vZGVBZGRlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBub2RlUmVtb3ZlZF8oVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubm9kZVJlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgdHJlZUNsZWFyZWRfKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIudHJlZUNsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgdHJlZUNoYW5nZWRfKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnRyZWVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkFXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdENvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdENvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYWFkODUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLlNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIGZvciAibGF6aWx5IiBhZGRpbmcgbGlzdGVuZXJzCi0gKiB0byBhbiB1bmRlcmx5aW5nIG1vZGVsIGFzIG5lY2Vzc2FyeS4gU3ViY2xhc3NlcyB3aWxsIG5lZWQgdG8gZW5nYWdlIGFuZAotICogZGlzZWdhZ2UgdGhlIHVuZGVybHlpbmcgbW9kZWwgYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGNvbGxlY3Rpb24gY2hhbmdlCi0gKiBldmVudHMuIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGFwcHJvcHJpYXRlIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0uCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBtZXRob2RzOjx1bD4KLSAqIDxsaT57QGxpbmsgI2VuZ2FnZU1vZGVsKCl9PHA+Ci0gKiAgICAgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGFkZCB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXIgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwKLSAqIDxsaT57QGxpbmsgI2Rpc2VuZ2FnZU1vZGVsKCl9PHA+Ci0gKiAgICAgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJlbW92ZSB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXIgZnJvbSB0aGUgdW5kZXJseWluZyBtb2RlbAotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29sbGVjdGlvblZhbHVlTW9kZWwKLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLXsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFic3RyYWN0Q29sbGVjdGlvblZhbHVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzLCBDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHRlbmQgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGNvbGxlY3Rpb25OYW1lLmVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcik7Ci0JCWlmIChjb2xsZWN0aW9uTmFtZS5lcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSAmJiB0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtb2RlbCBoYXMgbm8gY29sbGVjdGlvbiB2YWx1ZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBhbnkgY29sbGVjdGlvbiB2YWx1ZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIEVuZ2FnZSB0aGUgdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdhZ2VNb2RlbCgpOwotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGlzZW5nYWdlTW9kZWwoKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RMaXN0VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RMaXN0VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTgyYTUyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0TGlzdFZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBpbmZyYXN0cnVjdHVyZSBmb3IgImxhemlseSIgYWRkaW5nIGxpc3RlbmVycwotICogdG8gYW4gdW5kZXJseWluZyBtb2RlbCBhcyBuZWNlc3NhcnkuIFN1YmNsYXNzZXMgd2lsbCBuZWVkIHRvIGVuZ2FnZSBhbmQKLSAqIGRpc2VnYWdlIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBsaXN0IGNoYW5nZQotICogZXZlbnRzLiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBhcHByb3ByaWF0ZSB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9LgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgbWV0aG9kczo8dWw+Ci0gKiA8bGk+e0BsaW5rICNlbmdhZ2VNb2RlbCgpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsCi0gKiA8bGk+e0BsaW5rICNkaXNlbmdhZ2VNb2RlbCgpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZW1vdmUgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIGZyb20gdGhlIHVuZGVybHlpbmcgbW9kZWwKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExpc3RWYWx1ZU1vZGVsCi0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBYnN0cmFjdExpc3RWYWx1ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIExpc3RDaGFuZ2VMaXN0ZW5lci5jbGFzcywgTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHRlbmQgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIGxpc3ROYW1lLCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3ROYW1lLmVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykgJiYgdGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpOwotCQlpZiAobGlzdE5hbWUuZXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSAmJiB0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtb2RlbCBoYXMgbm8gY29sbGVjdGlvbiB2YWx1ZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBhbnkgY29sbGVjdGlvbiB2YWx1ZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogRW5nYWdlIHRoZSB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2FnZU1vZGVsKCk7Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdlMzFjMi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLlNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgZm9yICJsYXppbHkiIGFkZGluZy9yZW1vdmluZwotICogbGlzdGVuZXJzIHRvL2Zyb20gYW4gdW5kZXJseWluZyBtb2RlbCBhcyA8ZW0+cHJvcGVydHk8L2VtPiBjaGFuZ2UKLSAqIGxpc3RlbmVycyBhcmUgYWRkZWQgdG8vcmVtb3ZlZCBmcm9tIGl0c2VsZi4KLSAqIFN1YmNsYXNzZXMgd2lsbCBuZWVkIHRvIGVuZ2FnZSBhbmQgZGlzZW5nYWdlIHRoZSB1bmRlcmx5aW5nIG1vZGVsCi0gKiBhcHByb3ByaWF0ZWx5IGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSA8ZW0+cHJvcGVydHk8L2VtPgotICogY2hhbmdlIGV2ZW50cy4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgYXBwcm9wcmlhdGUge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH0uCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBtZXRob2RzOjx1bD4KLSAqIDxsaT57QGxpbmsgI2VuZ2FnZU1vZGVsKCl9PHA+Ci0gKiAgICAgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGFkZCB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXIocykgdG8gdGhlCi0gKiAgICAgdW5kZXJseWluZyBtb2RlbAotICogPGxpPntAbGluayAjZGlzZW5nYWdlTW9kZWwoKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVtb3ZlIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lcihzKSBmcm9tIHRoZQotICogICAgIHVuZGVybHlpbmcgbW9kZWwKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbAotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotewotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3MsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSAmJiB0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBubyBwcm9wZXJ0eSB2YWx1ZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBhbnkgcHJvcGVydHkgdmFsdWUgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3ViY2xhc3MgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogRW5nYWdlIHRoZSB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2FnZU1vZGVsKCk7Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc3YjExYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgbmVlZGVkIHRvIHdyYXAKLSAqIGEgbW9kZWwsICJsYXppbHkiIGxpc3RlbiB0byBpdCwgYW5kIGNvbnZlcnQKLSAqIGl0cyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBpbnRvIDxlbT5wcm9wZXJ0eTwvZW0+IHZhbHVlIG1vZGVsIGNoYW5nZQotICogbm90aWZpY2F0aW9ucy4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudDo8dWw+Ci0gKiA8bGk+e0BsaW5rICNidWlsZFZhbHVlKCl9PHA+Ci0gKiAgICAgdG8gcmV0dXJuIHRoZSBjdXJyZW50IHByb3BlcnR5IHZhbHVlLCBhcyBkZXJpdmVkIGZyb20gdGhlCi0gKiAgICAgY3VycmVudCBzdGF0ZSBvZiB0aGUgdW5kZXJseWluZyBtb2RlbAotICogPGxpPntAbGluayAjZW5nYWdlTW9kZWxfKCl9PHA+Ci0gKiAgICAgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIChhZGFwdGVkKSBtb2RlbAotICogPGxpPntAbGluayAjZGlzZW5nYWdlTW9kZWxfKCl9PHA+Ci0gKiAgICAgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgKGFkYXB0ZWQpIG1vZGVsCi0gKiA8L3VsPgotICogU3ViY2xhc3NlcyBjYW4gY2FsbCB7QGxpbmsgI3Byb3BlcnR5Q2hhbmdlZCgpfSB3aGVuZXZlciB0aGUgY2FsY3VsYXRlZAotICogdmFsdWUgb2YgdGhlIHByb3BlcnR5IGNoYW5nZXMgKGFzIGRldGVybWluZWQgYnkgdGhlIHN1YmNsYXNzKS4KLSAqIAotICogQHBhcmFtIDxWPiB0aGUgdHlwZSBvZiB0aGUgbW9kZWwncyB2YWx1ZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFY+Ci0JZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbAotCWltcGxlbWVudHMgUHJvcGVydHlWYWx1ZU1vZGVsPFY+Ci17Ci0JLyoqCi0JICogQ2FjaGUgdGhlIGN1cnJlbnQgdmFsdWUgc28gd2UgY2FuIHBhc3MgYW4gIm9sZCB2YWx1ZSIgd2hlbgotCSAqIHdlIGZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICogV2UgbmVlZCB0aGlzIGJlY2F1c2UgdGhlIHZhbHVlIG1heSBiZSBjYWxjdWxhdGVkIGFuZCB3ZSBtYXkKLQkgKiBub3QgYWJsZSB0byBkZXJpdmUgdGhlICJvbGQgdmFsdWUiIGZyb20gYW55IGZpcmVkIGV2ZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9sYXRpbGUgViB2YWx1ZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCQkvLyBvdXIgdmFsdWUgaXMgbnVsbCB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBtb2RlbAotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2FjaGVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBWIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGFuZCBidWlsZCB0aGUgdmFsdWUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuZW5nYWdlTW9kZWxfKCk7Ci0JCS8vIHN5bmMgb3VyIHZhbHVlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBtb2RlbCwKLQkJLy8gc2luY2UgdGhlIG1vZGVsJ3MgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2FnZU1vZGVsXygpOwotCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSwgYXMgZGVyaXZlZCBmcm9tIHRoZQotCSAqIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFYgYnVpbGRWYWx1ZSgpOwotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgYW5kIGNsZWFyIHRoZSB2YWx1ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5kaXNlbmdhZ2VNb2RlbF8oKTsKLQkJLy8gY2xlYXIgb3V0IG91ciB2YWx1ZSB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBtb2RlbAotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkaXNlbmdhZ2VNb2RlbF8oKTsKLQotCS8qKgotCSAqIFRoZSB1bmRlcmx5aW5nIG1vZGVsIGNoYW5nZWQgaW4gc29tZSBmYXNoaW9uLgotCSAqIFJlY2FsY3VsYXRlIHRoZSBtb2RlbCdzIHZhbHVlIGFuZCBub3RpZnkgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZCgpIHsKLQkJT2JqZWN0IG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkLCB0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTc2NzZlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNoYWluSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlTm9kZVZhbHVlTW9kZWw7Ci0KLS8qKgotICogU3ViY2xhc3NlcyBuZWVkIG9ubHkgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLSAqIAotICogI3ZhbHVlKCkKLSAqCSAgICByZXR1cm4gdGhlIHVzZXItZGV0ZXJtaW5lZCAidmFsdWUiIG9mIHRoZSBub2RlLAotICogICAgIGkuZS4gdGhlIG9iamVjdCAid3JhcHBlZCIgYnkgdGhlIG5vZGUKLSAqIAotICogI3NldFZhbHVlKE9iamVjdCkKLSAqICAgICBzZXQgdGhlIHVzZXItZGV0ZXJtaW5lZCAidmFsdWUiIG9mIHRoZSBub2RlLAotICogICAgIGkuZS4gdGhlIG9iamVjdCAid3JhcHBlZCIgYnkgdGhlIG5vZGU7Ci0gKiAgICAgdHlwaWNhbGx5IG9ubHkgb3ZlcnJpZGRlbiBmb3Igbm9kZXMgd2l0aCAicHJpbWl0aXZlIiB2YWx1ZXMKLSAqIAotICogI3BhcmVudCgpCi0gKiAgICAgcmV0dXJuIHRoZSBwYXJlbnQgb2YgdGhlIG5vZGUsIHdoaWNoIHNob3VsZCBiZSBhbm90aGVyCi0gKiAgICAgVHJlZU5vZGVWYWx1ZU1vZGVsCi0gKiAKLSAqICNjaGlsZHJlbk1vZGVsKCkKLSAqICAgICByZXR1cm4gYSBMaXN0VmFsdWVNb2RlbCBmb3IgdGhlIG5vZGUncyBjaGlsZHJlbgotICogCi0gKiAjZW5nYWdlVmFsdWUoKSBhbmQgI2Rpc2VuZ2FnZVZhbHVlKCkKLSAqICAgICBvdmVycmlkZSB0aGVzZSBtZXRob2RzIHRvIGxpc3RlbiB0byB0aGUgbm9kZSdzIHZhbHVlIGlmCi0gKiAgICAgaXQgY2FuIGNoYW5nZSBpbiBhIHdheSB0aGF0IHNob3VsZCBiZSByZWZsZWN0ZWQgaW4gdGhlIHRyZWUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBUcmVlTm9kZVZhbHVlTW9kZWw8VD4KLXsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCS8vIHRoaXMgbW9kZWwgZmlyZXMgKmJvdGgqICJ2YWx1ZSBwcm9wZXJ0eSBjaGFuZ2UiIGFuZCAic3RhdGUgY2hhbmdlIiBldmVudHMuLi4KLS8vCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5jbGFzcywgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJcmV0dXJuIHN1cGVyLmJ1aWxkQ2hhbmdlU3VwcG9ydCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHRlbmQgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDbGllbnRzIHNob3VsZCBiZSBhZGRpbmcgYm90aCAic3RhdGUgY2hhbmdlIiBhbmQgInZhbHVlIHByb3BlcnR5IGNoYW5nZSIKLQkgKiBsaXN0ZW5lcnMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VWYWx1ZSgpOwotCQl9Ci0JCXN1cGVyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEJlZ2luIGxpc3RlbmluZyB0byB0aGUgbm9kZSdzIHZhbHVlJ3Mgc3RhdGUuIElmIHRoZSBzdGF0ZSBvZiB0aGUgbm9kZSBjaGFuZ2VzCi0JICogaW4gYSB3YXkgdGhhdCBzaG91bGQgYmUgcmVmbGVjdGVkIGluIHRoZSB0cmVlLCBmaXJlIGEgInN0YXRlIGNoYW5nZSIgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5nYWdlVmFsdWUoKTsKLQotCS8qKgotCSAqIEBzZWUgI2FkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VWYWx1ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG5vZGUncyB2YWx1ZS4KLQkgKiBAc2VlICNlbmdhZ2VWYWx1ZSgpCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGlzZW5nYWdlVmFsdWUoKTsKLQotCi0JLy8gKioqKioqKioqKiBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVHJlZU5vZGVWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcGF0aCgpIHsKLQkJTGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IHBhdGggPSBDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QodGhpcy5iYWNrUGF0aCgpKTsKLQkJcmV0dXJuIHBhdGgudG9BcnJheShuZXcgVHJlZU5vZGVWYWx1ZU1vZGVsW3BhdGguc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgY2xpbWJzIHVwIHRoZSBub2RlJ3MgcGF0aCwKLQkgKiBzdGFydGluZyB3aXRoLCBhbmQgaW5jbHVkaW5nLCB0aGUgbm9kZQotCSAqIGFuZCB1cCB0bywgYW5kIGluY2x1ZGluZywgdGhlIHJvb3Qgbm9kZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBiYWNrUGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhdG9yPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4odGhpcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5leHRMaW5rKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBjdXJyZW50TGluaykgewotCQkJCXJldHVybiBjdXJyZW50TGluay5wYXJlbnQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IGNoaWxkKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbk1vZGVsKCkuZ2V0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW5Nb2RlbCgpLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGluZGV4T2ZDaGlsZChUcmVlTm9kZVZhbHVlTW9kZWw8VD4gY2hpbGQpIHsKLQkJTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW5Nb2RlbCgpOwotCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChjaGlsZHJlbi5nZXQoaSkgPT0gY2hpbGQpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMZWFmKCkgewotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbk1vZGVsKCkuc2l6ZSgpID09IDA7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogV2UgaW1wbGVtZW50ICNlcXVhbHMoT2JqZWN0KSBzbyB0aGF0IFRyZWVQYXRocyBjb250YWluaW5nIHRoZXNlIG5vZGVzCi0JICogd2lsbCByZXNvbHZlIHByb3Blcmx5IHdoZW4gdGhlIG5vZGVzIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWVzLiBUaGlzIGlzCi0JICogbmVjZXNzYXJ5IGJlY2F1c2Ugbm9kZXMgYXJlIGRyb3BwZWQgYW5kIHJlYnVpbHQgd2lsbHktbmlsbHkgd2hlbiBkZWFsaW5nCi0JICogd2l0aCBhIHNvcnRlZCBsaXN0IG9mIGNoaWxkcmVuOyBhbmQgdGhpcyBhbGxvd3MgdXMgdG8gc2F2ZSBhbmQgcmVzdG9yZQotCSAqIGEgdHJlZSdzIGV4cGFuZGVkIHBhdGhzLiBUaGUgbm9kZXMgaW4gdGhlIGV4cGFuZGVkIHBhdGhzIHRoYXQgYXJlCi0JICogc2F2ZWQgYmVmb3JlIGFueSBtb2RpZmljYXRpb24gKGUuZy4gcmVuYW1pbmcgYSBub2RlKSB3aWxsIGJlIGRpZmZlcmVudAotCSAqIGZyb20gdGhlIG5vZGVzIGluIHRoZSB0cmVlJ3MgcGF0aHMgYWZ0ZXIgdGhlIG1vZGlmaWNhdGlvbiwgaWYgdGhlIG1vZGlmaWNhdGlvbgotCSAqIHJlc3VsdHMgaW4gYSBwb3NzaWJsZSBjaGFuZ2UgaW4gdGhlIG5vZGUgc29ydCBvcmRlci4gIH5ianYKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChvLmdldENsYXNzKCkgIT0gdGhpcy5nZXRDbGFzcygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG90aGVyID0gKEFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBvOwotCQlyZXR1cm4gdGhpcy5nZXRWYWx1ZSgpLmVxdWFscyhvdGhlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWx1ZSgpLmhhc2hDb2RlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRkOGQ0Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGV4dGVuc2lvbiBvZiB7QGxpbmsgQWJzdHJhY3RNb2RlbH0gcHJvdmlkZXMgYSBiYXNlIGZvciBhZGRpbmcgCi0gKiBjaGFuZ2UgbGlzdGVuZXJzIChwcm9wZXJ0eSBjaGFuZ2UsIGNvbGxlY3Rpb24gY2hhbmdlLCBsaXN0IGNoYW5nZSwgdHJlZSBjaGFuZ2UpCi0gKiB0byBhIHN1YmplY3QgYW5kIGNvbnZlcnRpbmcgdGhlIHN1YmplY3QncyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBpbnRvIGEgc2luZ2xlCi0gKiBzZXQgb2YgY2hhbmdlIG5vdGlmaWNhdGlvbnMgZm9yIGEgY29tbW9uIGFzcGVjdAotICogKGUuZy4ge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbCNWQUxVRX0pLgotICogPHA+Ci0gKiBUaGUgYWRhcHRlciB3aWxsIG9ubHkgbGlzdGVuIHRvIHRoZSBzdWJqZWN0IChhbmQgc3ViamVjdCBtb2RlbCkgd2hlbiB0aGUKLSAqIGFkYXB0ZXIgaXRzZWxmIGFjdHVhbGx5IGhhcyBsaXN0ZW5lcnMuIFRoaXMgd2lsbCBhbGxvdyB0aGUgYWRhcHRlciB0byBiZQotICogZ2FyYmFnZSBjb2xsZWN0ZWQgd2hlbiBhcHByb3ByaWF0ZS4KLSAqIAotICogQHBhcmFtIDxTPiB0aGUgdHlwZSBvZiB0aGUgbW9kZWwncyBzdWJqZWN0Ci0gKiBAcGFyYW0gPEE+IHRoZSB0eXBlIG9mIHRoZSBzdWJqZWN0J3MgYXNwZWN0Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBc3BlY3RBZGFwdGVyPFMsIEE+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi17Ci0JLyoqCi0JICogVGhlIHN1YmplY3QgdGhhdCBob2xkcyB0aGUgYXNwZWN0IGFuZCBmaXJlcwotCSAqIGNoYW5nZSBub3RpZmljYXRpb24gd2hlbiB0aGUgYXNwZWN0IGNoYW5nZXMuCi0JICogV2UgbmVlZCB0byBob2xkIG9uIHRvIHRoaXMgZGlyZWN0bHkgc28gd2UgY2FuCi0JICogZGlzZW5nYWdlIGl0IHdoZW4gaXQgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9sYXRpbGUgUyBzdWJqZWN0OwotCi0JLyoqCi0JICogQSB2YWx1ZSBtb2RlbCB0aGF0IGhvbGRzIHRoZSB7QGxpbmsgI3N1YmplY3R9Ci0JICogdGhhdCBob2xkcyB0aGUgYXNwZWN0IGFuZCBwcm92aWRlcyBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCSAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGFzcGVjdCBhZGFwdGVycwotCSAqIHRoYXQgaGF2ZSB0aGUgc2FtZSBzdWJqZWN0IGFuZCB0aGF0IHN1YmplY3QgY2FuIGNoYW5nZS4KLQkgKiBBbGwgdGhlIGFzcGVjdCBhZGFwdGVycyBjYW4gc2hhcmUgdGhlIHNhbWUgc3ViamVjdCBtb2RlbC4KLQkgKiBGb3Igbm93LCB0aGlzIGlzIGNhbiBvbmx5IGJlIHNldCB1cG9uIGNvbnN0cnVjdGlvbiBhbmQgaXMKLQkgKiBpbW11dGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdEhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQga2VlcHMgdXMgaW4gc3luYyB3aXRoIHRoZSBzdWJqZWN0IG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHN1YmplY3RMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QuCi0JICovCi0JcHJvdGVjdGVkIEFzcGVjdEFkYXB0ZXIoUyBzdWJqZWN0KSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTPihzdWJqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgbW9kZWwuCi0JICogVGhlIHN1YmplY3QgbW9kZWwgY2Fubm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdE1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChzdWJqZWN0TW9kZWwgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5zdWJqZWN0SG9sZGVyID0gc3ViamVjdE1vZGVsOwotCQl0aGlzLnN1YmplY3RMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdWJqZWN0TGlzdGVuZXIoKTsKLQkJLy8gdGhlIHN1YmplY3QgaXMgbnVsbCB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIGl0Ci0JCS8vIHRoaXMgd2lsbCB0eXBpY2FsbHkgcmVzdWx0IGluIG91ciB2YWx1ZSBiZWluZyBudWxsCi0JCXRoaXMuc3ViamVjdCA9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbENoYW5nZVN1cHBvcnQodGhpcywgdGhpcy5nZXRMaXN0ZW5lckNsYXNzKCksIHRoaXMuZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3ViamVjdExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFN1YmplY3RMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBTdWJqZWN0TGlzdGVuZXIKLQkJZXh0ZW5kcyBQcm9wZXJ0eUNoYW5nZUFkYXB0ZXIKLQl7Ci0JCS8qKgotCQkgKiBUaGUgc3ViamVjdCBtb2RlbCdzIHZhbHVlIGhhcyBjaGFuZ2VkLCBrZWVwIG91ciBzdWJqZWN0IGluIHN5bmMuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCUFzcGVjdEFkYXB0ZXIudGhpcy5zdWJqZWN0Q2hhbmdlZCgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0IGhhcyBjaGFuZ2VkLgotCSAqIE1vdmUgb3VyIHN1YmplY3QgbGlzdGVuZXIgYW5kCi0JICogbm90aWZ5IGxpc3RlbmVycyB0aGF0IHRoZSB2YWx1ZSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCUEgb2xkID0gdGhpcy5nZXRBc3BlY3RWYWx1ZSgpOwotCQlib29sZWFuIGhhc0xpc3RlbmVycyA9IHRoaXMuaGFzTGlzdGVuZXJzKCk7Ci0JCWlmIChoYXNMaXN0ZW5lcnMpIHsKLQkJCXRoaXMuZGlzZW5nYWdlU3ViamVjdCgpOwotCQl9Ci0JCXRoaXMuc3ViamVjdCA9IHRoaXMuc3ViamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlpZiAoaGFzTGlzdGVuZXJzKSB7Ci0JCQl0aGlzLmVuZ2FnZVN1YmplY3QoKTsKLQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZWQob2xkLCB0aGlzLmdldEFzcGVjdFZhbHVlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhc3BlY3QncyBjdXJyZW50IHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBBIGdldEFzcGVjdFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG9mIGxpc3RlbmVyIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiB0aGUgYXNwZWN0IGFkYXB0ZXIncwotCSAqIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGFzcGVjdCBhZGFwdGVyJ3MgYXNwZWN0Ci0JICogKGUuZy4ge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbCNWQUxVRX0pLgotCSAqIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFzcGVjdCBhZGFwdGVyJ3Mgc2luZ2xlIGFzcGVjdCwgbm90IHRoZQotCSAqIG5hbWUgb2YgdGhlIHN1YmplY3QncyBhc3BlY3QocykgdGhlIGFzcGVjdCBhZGFwdGVyIGlzIGFkYXB0aW5nLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGxpc3RlbmVycyBmb3IgdGhlIGFzcGVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBubyBsaXN0ZW5lcnMgZm9yIHRoZSBhc3BlY3QuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGFzcGVjdCBoYXMgY2hhbmdlZCwgbm90aWZ5IGxpc3RlbmVycyBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZpcmVBc3BlY3RDaGFuZ2VkKEEgb2xkVmFsdWUsIEEgbmV3VmFsdWUpOwotCi0KLQkvLyAqKioqKioqKioqIGVuZ2FnZS9kaXNlbmdhZ2UgbW9kZWxzICoqKioqKioqKioKLQotCS8qKgotCSAqIENhbGxlZCBieSB7QGxpbmsgTG9jYWxDaGFuZ2VTdXBwb3J0fQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVscygpIHsKLQkJdGhpcy5lbmdhZ2VTdWJqZWN0SG9sZGVyKCk7Ci0JCXRoaXMuZW5nYWdlU3ViamVjdCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RIb2xkZXIoKSB7Ci0JCXRoaXMuc3ViamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zdWJqZWN0TGlzdGVuZXIpOwotCQkvLyBzeW5jIG91ciBzdWJqZWN0ICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBzdWJqZWN0IGhvbGRlciwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy5zdWJqZWN0ID0gdGhpcy5zdWJqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdCgpIHsKLQkJLy8gY2hlY2sgZm9yIG5vdGhpbmcgdG8gbGlzdGVuIHRvCi0JCWlmICh0aGlzLnN1YmplY3QgIT0gbnVsbCkgewotCQkJdGhpcy5lbmdhZ2VTdWJqZWN0XygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIHtAbGluayAjc3ViamVjdH0gaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IC0gYWRkIG91ciBsaXN0ZW5lci4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdhZ2VTdWJqZWN0XygpOwotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IHtAbGluayBMb2NhbENoYW5nZVN1cHBvcnR9Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWxzKCkgewotCQl0aGlzLmRpc2VuZ2FnZVN1YmplY3QoKTsKLQkJdGhpcy5kaXNlbmdhZ2VTdWJqZWN0SG9sZGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdCgpIHsKLQkJLy8gY2hlY2sgZm9yIG5vdGhpbmcgdG8gbGlzdGVuIHRvCi0JCWlmICh0aGlzLnN1YmplY3QgIT0gbnVsbCkgewotCQkJdGhpcy5kaXNlbmdhZ2VTdWJqZWN0XygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIHtAbGluayAjc3ViamVjdH0gaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IC0gcmVtb3ZlIG91ciBsaXN0ZW5lci4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpOwotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdEhvbGRlcigpIHsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN1YmplY3RMaXN0ZW5lcik7Ci0JCS8vIGNsZWFyIG91dCB0aGUgc3ViamVjdCB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIGl0cyBob2xkZXIKLQkJdGhpcy5zdWJqZWN0ID0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbG9jYWwgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIGNoYW5nZSBzdXBwb3J0IHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgYXNwZWN0IGFkYXB0ZXIncwotCSAqIG1vZGVscyAodGhlIHN1YmplY3QgaG9sZGVyIGFuZCB0aGUgc3ViamVjdCBpdHNlbGYpIHdoZW4gdGhlIGZpcnN0Ci0JICogcmVsZXZhbnQgbGlzdGVuZXIgaXMgYWRkZWQuCi0JICogQ29udmVyc2VseSwgc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGFzcGVjdCBhZGFwdGVyJ3MgbW9kZWxzIHdoZW4gdGhlCi0JICogbGFzdCByZWxldmFudCBsaXN0ZW5lciBpcyByZW1vdmVkLgotCSAqIEEgcmVsZXZhbnQgbGlzdGVuZXIgaXMgYSBsaXN0ZW5lciBvZiB0aGUgcmVsZXZhbnQgdHlwZSBhbmQgYXNwZWN0IG9yIGEKLQkgKiBnZW5lcmFsLXB1cnBvc2UgbGlzdGVuZXIuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIExvY2FsQ2hhbmdlU3VwcG9ydAotCQlleHRlbmRzIFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQKLQl7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXB1YmxpYyBMb2NhbENoYW5nZVN1cHBvcnQoQXNwZWN0QWRhcHRlcjxTLCBBPiBzb3VyY2UsIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2YWxpZExpc3RlbmVyQ2xhc3MsIFN0cmluZyB2YWxpZEFzcGVjdE5hbWUpIHsKLQkJCXN1cGVyKHNvdXJjZSwgdmFsaWRMaXN0ZW5lckNsYXNzLCB2YWxpZEFzcGVjdE5hbWUpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5oYXNOb0xpc3RlbmVycyh0aGlzLnZhbGlkTGlzdGVuZXJDbGFzcywgdGhpcy52YWxpZEFzcGVjdE5hbWUpOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPFQgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2b2lkIGFkZExpc3RlbmVyKENsYXNzPFQ+IGxpc3RlbmVyQ2xhc3MsIFQgbGlzdGVuZXIpIHsKLQkJCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCQlBc3BlY3RBZGFwdGVyLnRoaXMuZW5nYWdlTW9kZWxzKCk7Ci0JCQl9Ci0JCQlzdXBlci5hZGRMaXN0ZW5lcihsaXN0ZW5lckNsYXNzLCBsaXN0ZW5lcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8VCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgYWRkTGlzdGVuZXIoQ2xhc3M8VD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUsIFQgbGlzdGVuZXIpIHsKLQkJCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCQlBc3BlY3RBZGFwdGVyLnRoaXMuZW5nYWdlTW9kZWxzKCk7Ci0JCQl9Ci0JCQlzdXBlci5hZGRMaXN0ZW5lcihsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lLCBsaXN0ZW5lcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8VCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ2xhc3M8VD4gbGlzdGVuZXJDbGFzcywgVCBsaXN0ZW5lcikgewotCQkJc3VwZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXJDbGFzcywgbGlzdGVuZXIpOwotCQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJCUFzcGVjdEFkYXB0ZXIudGhpcy5kaXNlbmdhZ2VNb2RlbHMoKTsKLQkJCX0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIDxUIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdm9pZCByZW1vdmVMaXN0ZW5lcihDbGFzczxUPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSwgVCBsaXN0ZW5lcikgewotCQkJc3VwZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSwgbGlzdGVuZXIpOwotCQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJCUFzcGVjdEFkYXB0ZXIudGhpcy5kaXNlbmdhZ2VNb2RlbHMoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNDY3NzMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMge0BsaW5rIEFzcGVjdEFkYXB0ZXJ9IHByb3ZpZGVzIGJhc2ljIGNvbGxlY3Rpb24gY2hhbmdlIHN1cHBvcnQuCi0gKiBUaGlzIGNvbnZlcnRzIGFuICJhc3BlY3QiIChhcyBkZWZpbmVkIGJ5IHN1YmNsYXNzZXMpIGludG8KLSAqIGEgc2luZ2xlIHtAbGluayAjVkFMVUVTfSBjb2xsZWN0aW9uLgotICogPHA+Ci0gKiBUaGUgdHlwaWNhbCBzdWJjbGFzcyB3aWxsIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczo8dWw+Ci0gKiA8bGk+e0BsaW5rICNlbmdhZ2VTdWJqZWN0XygpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIHRvIHRoZSBzdWJqZWN0Ci0gKiA8bGk+e0BsaW5rICNkaXNlbmdhZ2VTdWJqZWN0XygpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZW1vdmUgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIGZyb20gdGhlIHN1YmplY3QKLSAqIDxsaT57QGxpbmsgI2dldEl0ZXJhYmxlKCl9PHA+Ci0gKiAgICAgYXQgdGhlIHZlcnkgbWluaW11bSwgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJuIGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlCi0gKiAgICAgc3ViamVjdCdzIGNvbGxlY3Rpb24gYXNwZWN0OyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gaWYgZWl0aGVyCi0gKiAgICAge0BsaW5rICNpdGVyYXRvcl8oKX0gb3Ige0BsaW5rICNpdGVyYXRvcigpfSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogPGxpPntAbGluayAjc2l6ZV8oKX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlOyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gaWYKLSAqICAgICB7QGxpbmsgI3NpemUoKX0gaXMgb3ZlcnJpZGRlbiBhbmQgaXRzIGJlaGF2aW9yIGNoYW5nZWQKLSAqIDxsaT57QGxpbmsgI2l0ZXJhdG9yXygpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiBhbiBpdGVyYXRvciBvbiB0aGUKLSAqICAgICBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3QgaWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGltcGxlbWVudCB7QGxpbmsgI2dldEl0ZXJhYmxlKCl9OwotICogICAgIGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbiBpZgotICogICAgIHtAbGluayAjaXRlcmF0b3IoKX0gaXMgb3ZlcnJpZGRlbiBhbmQgaXRzIGJlaGF2aW9yIGNoYW5nZWQKLSAqIDxsaT57QGxpbmsgI2l0ZXJhdG9yKCl9PHA+Ci0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgb25seSBpZiByZXR1cm5pbmcgYW4gZW1wdHkgaXRlcmF0b3Igd2hlbiB0aGUKLSAqICAgICBzdWJqZWN0IGlzIG51bGwgaXMgdW5hY2NlcHRhYmxlCi0gKiA8bGk+e0BsaW5rICNzaXplKCl9PHA+Ci0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgb25seSBpZiByZXR1cm5pbmcgYSB6ZXJvIHdoZW4gdGhlCi0gKiAgICAgc3ViamVjdCBpcyBudWxsIGlzIHVuYWNjZXB0YWJsZQotICogPC91bD4KLSAqIFRvIG5vdGlmeSBsaXN0ZW5lcnMsIHN1YmNsYXNzZXMgY2FuIGNhbGwge0BsaW5rICNhc3BlY3RDaGFuZ2VkKCl9Ci0gKiB3aGVuZXZlciB0aGUgYXNwZWN0IGhhcyBjaGFuZ2VkLgotICogCi0gKiBAcGFyYW0gPFM+IHRoZSB0eXBlIG9mIHRoZSBtb2RlbCdzIHN1YmplY3QKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgdGhlIHN1YmplY3QncyBjb2xsZWN0aW9uIGFzcGVjdCdzIGVsZW1lbnRzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBc3BlY3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8UywgRT4KLQlleHRlbmRzIEFzcGVjdEFkYXB0ZXI8UywgQ29sbGVjdGlvbjxFPj4KLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhZGFwdGVyIGZvciBhbiBhc3BlY3Qgb2YgdGhlCi0JICogc3BlY2lmaWVkIHN1YmplY3QuCi0JICovCi0JcHJvdGVjdGVkIEFzcGVjdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RNb2RlbCkgewotCQlzdXBlcihzdWJqZWN0TW9kZWwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnRzIG9mIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3QuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuPEU+aW5zdGFuY2UoKSA6IHRoaXMuaXRlcmF0b3JfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50cyBvZiB0aGUgc3ViamVjdCdzIGNvbGxlY3Rpb24gYXNwZWN0LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhlIHtAbGluayAjc3ViamVjdH0gaXMKLQkgKiA8ZW0+bm90PC9lbT4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNlZSAjaXRlcmF0b3IoKQotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjxFPiBpdGVyYXRvcl8oKSB7Ci0JCXJldHVybiB0aGlzLmdldEl0ZXJhYmxlKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnRzIG9mIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUge0BsaW5rICNzdWJqZWN0fSBpcwotCSAqIDxlbT5ub3Q8L2VtPiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2VlICNpdGVyYXRvcl8oKQotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXRJdGVyYWJsZSgpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3ViamVjdCdzIGNvbGxlY3Rpb24gYXNwZWN0LgotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnN1YmplY3QgPT0gbnVsbCkgPyAwIDogdGhpcy5zaXplXygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3ViamVjdCdzIGNvbGxlY3Rpb24gYXNwZWN0LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhlIHtAbGluayAjc3ViamVjdH0gaXMKLQkgKiA8ZW0+bm90PC9lbT4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNlZSAjc2l6ZSgpCi0JICovCi0JcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuaXRlcmF0b3IoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248RT4gZ2V0QXNwZWN0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVmFsdWVDb2xsZWN0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkgewotCQlyZXR1cm4gVkFMVUVTOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhWQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVBc3BlY3RDaGFuZ2VkKENvbGxlY3Rpb248RT4gb2xkVmFsdWUsIENvbGxlY3Rpb248RT4gbmV3VmFsdWUpIHsKLQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoVkFMVUVTLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYXNwZWN0Q2hhbmdlZCgpIHsKLQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoVkFMVUVTLCB0aGlzLmJ1aWxkVmFsdWVDb2xsZWN0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPEU+IGJ1aWxkVmFsdWVDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5pdGVyYXRvcigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmJ1aWxkVmFsdWVDb2xsZWN0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhN2RiNWMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyB7QGxpbmsgQXNwZWN0QWRhcHRlcn0gcHJvdmlkZXMgYmFzaWMgbGlzdCBjaGFuZ2Ugc3VwcG9ydC4KLSAqIFRoaXMgY29udmVydHMgYW4gImFzcGVjdCIgKGFzIGRlZmluZWQgYnkgc3ViY2xhc3NlcykgaW50bwotICogYSBzaW5nbGUge0BsaW5rICNMSVNUX1ZBTFVFU30gbGlzdC4KLSAqIDxwPgotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciB0byB0aGUgc3ViamVjdAotICogPGxpPntAbGluayAjZGlzZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVtb3ZlIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciBmcm9tIHRoZSBzdWJqZWN0Ci0gKiA8bGk+e0BsaW5rICNnZXRMaXN0SXRlcmFibGUoKX08cD4KLSAqICAgICBhdCB0aGUgdmVyeSBtaW5pbXVtLCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4gYSBsaXN0IGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlCi0gKiAgICAgc3ViamVjdCdzIGxpc3QgYXNwZWN0OyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gaWYgZWl0aGVyCi0gKiAgICAge0BsaW5rICNsaXN0SXRlcmF0b3JfKCl9IG9yIHtAbGluayAjbGlzdEl0ZXJhdG9yKCl9IGlzIG92ZXJyaWRkZW4gYW5kIGl0cyBiZWhhdmlvciBjaGFuZ2VkCi0gKiA8bGk+e0BsaW5rICNnZXQoaW50KX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlCi0gKiA8bGk+e0BsaW5rICNzaXplXygpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcHJvdmUgcGVyZm9ybWFuY2U7IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbiBpZgotICogICAgIHtAbGluayAjc2l6ZSgpfSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogPGxpPntAbGluayAjdG9BcnJheV8oKX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlOyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gaWYKLSAqICAgICB7QGxpbmsgI3RvQXJyYXkoKX0gaXMgb3ZlcnJpZGRlbiBhbmQgaXRzIGJlaGF2aW9yIGNoYW5nZWQKLSAqIDxsaT57QGxpbmsgI2xpc3RJdGVyYXRvcl8oKX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9uIHRoZSBzdWJqZWN0J3MgbGlzdAotICogICAgIGFzcGVjdCBpZiBpdCBpcyBub3QgcG9zc2libGUgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0TGlzdEl0ZXJhYmxlKCl9OwotICogICAgIGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbiBpZgotICogICAgIHtAbGluayAjbGlzdEl0ZXJhdG9yKCl9IGlzIG92ZXJyaWRkZW4gYW5kIGl0cyBiZWhhdmlvciBjaGFuZ2VkCi0gKiA8bGk+e0BsaW5rICNsaXN0SXRlcmF0b3IoKX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCBvbmx5IGlmIHJldHVybmluZyBhbiBlbXB0eSBsaXN0IGl0ZXJhdG9yIHdoZW4gdGhlCi0gKiAgICAgc3ViamVjdCBpcyBudWxsIGlzIHVuYWNjZXB0YWJsZQotICogPGxpPntAbGluayAjc2l6ZSgpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgcmV0dXJuaW5nIGEgemVybyB3aGVuIHRoZQotICogICAgIHN1YmplY3QgaXMgbnVsbCBpcyB1bmFjY2VwdGFibGUKLSAqIDxsaT57QGxpbmsgI3RvQXJyYXkoKX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCBvbmx5IGlmIHJldHVybmluZyBhbiBlbXB0eSBhcnJheSB3aGVuIHRoZQotICogICAgIHN1YmplY3QgaXMgbnVsbCBpcyB1bmFjY2VwdGFibGUKLSAqIDwvdWw+Ci0gKiBUbyBub3RpZnkgbGlzdGVuZXJzLCBzdWJjbGFzc2VzIGNhbiBjYWxsIHtAbGluayAjYXNwZWN0Q2hhbmdlZCgpfQotICogd2hlbmV2ZXIgdGhlIGFzcGVjdCBoYXMgY2hhbmdlZC4KLSAqIAotICogQHBhcmFtIDxTPiB0aGUgdHlwZSBvZiB0aGUgbW9kZWwncyBzdWJqZWN0Ci0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QncyBlbGVtZW50cwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFMsIEU+Ci0JZXh0ZW5kcyBBc3BlY3RBZGFwdGVyPFMsIExpc3Q8RT4+Ci0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFPgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX0FSUkFZID0gbmV3IE9iamVjdFswXTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCBhZGFwdGVyIGZvciBhbiBhc3BlY3Qgb2YgdGhlCi0JICogc3BlY2lmaWVkIHN1YmplY3QuCi0JICovCi0JcHJvdGVjdGVkIEFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RNb2RlbCkgewotCQlzdXBlcihzdWJqZWN0TW9kZWwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnRzIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICovCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50cyBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IEVtcHR5TGlzdEl0ZXJhdG9yLjxFPmluc3RhbmNlKCkgOiB0aGlzLmxpc3RJdGVyYXRvcl8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnRzIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUge0BsaW5rICNzdWJqZWN0fSBpcwotCSAqIDxlbT5ub3Q8L2VtPiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2VlICNsaXN0SXRlcmF0b3IoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdEl0ZXJhYmxlKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnRzIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUge0BsaW5rICNzdWJqZWN0fSBpcwotCSAqIDxlbT5ub3Q8L2VtPiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2VlICNsaXN0SXRlcmF0b3JfKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEU+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICovCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmdldCh0aGlzLmxpc3RJdGVyYXRvcigpLCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICovCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5zdWJqZWN0ID09IG51bGwgPyAwIDogdGhpcy5zaXplXygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhlIHtAbGluayAjc3ViamVjdH0gaXMKLQkgKiA8ZW0+bm90PC9lbT4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNlZSAjc2l6ZSgpCi0JICovCi0JcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBtYW5pZmVzdGF0aW9uIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICovCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLnN1YmplY3QgPT0gbnVsbCA/IEVNUFRZX0FSUkFZIDogdGhpcy50b0FycmF5XygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBtYW5pZmVzdGF0aW9uIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICN0b0FycmF5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gdG9BcnJheV8oKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmFycmF5KHRoaXMubGlzdEl0ZXJhdG9yKCksIHRoaXMuc2l6ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdDxFPiBnZXRBc3BlY3RWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRWYWx1ZUxpc3QoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGdldExpc3RlbmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBMaXN0Q2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMaXN0ZW5lckFzcGVjdE5hbWUoKSB7Ci0JCXJldHVybiBMSVNUX1ZBTFVFUzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTElTVF9WQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVBc3BlY3RDaGFuZ2VkKExpc3Q8RT4gb2xkVmFsdWUsIExpc3Q8RT4gbmV3VmFsdWUpIHsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhc3BlY3RDaGFuZ2VkKCkgewotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUywgdGhpcy5idWlsZFZhbHVlTGlzdCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdDxFPiBidWlsZFZhbHVlTGlzdCgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuaXRlcmF0b3IoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5idWlsZFZhbHVlTGlzdCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NjI5ZTIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMge0BsaW5rIEFzcGVjdEFkYXB0ZXJ9IHByb3ZpZGVzIGJhc2ljIHByb3BlcnR5IGNoYW5nZSBzdXBwb3J0LgotICogVGhpcyBjb252ZXJ0cyBhbiAiYXNwZWN0IiAoYXMgZGVmaW5lZCBieSBzdWJjbGFzc2VzKSBpbnRvCi0gKiBhIHNpbmdsZSB7QGxpbmsgI1ZBTFVFfSBwcm9wZXJ0eS4KLSAqIDxwPgotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciB0byB0aGUgc3ViamVjdAotICogPGxpPntAbGluayAjZGlzZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVtb3ZlIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciBmcm9tIHRoZSBzdWJqZWN0Ci0gKiA8bGk+e0BsaW5rICNidWlsZFZhbHVlXygpfTxwPgotICogICAgIGF0IHRoZSB2ZXJ5IG1pbmltdW0sIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlCi0gKiAgICAgc3ViamVjdCdzIGFzcGVjdCAob3IgInZpcnR1YWwiIGFzcGVjdCk7IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUKLSAqICAgICBvdmVycmlkZGVuIGlmIHtAbGluayAjYnVpbGRWYWx1ZSgpfSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogPGxpPntAbGluayAjc2V0VmFsdWVfKE9iamVjdCl9PHA+Ci0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhlIGNsaWVudCBjb2RlIG5lZWRzIHRvIDxlbT5zZXQ8L2VtPiB0aGUgdmFsdWUgb2YKLSAqICAgICB0aGUgc3ViamVjdCdzIGFzcGVjdDsgb2Z0ZW50aW1lcywgdGhvdWdoLCB0aGUgY2xpZW50IGNvZGUgKGUuZy4gVUkpCi0gKiAgICAgd2lsbCBuZWVkIG9ubHkgdG8gPGVtPmdldDwvZW0+IHRoZSB2YWx1ZTsgaXQgZG9lcyBub3QgbmVlZCB0byBiZQotICogICAgIG92ZXJyaWRkZW4gaWYge0BsaW5rICNzZXRWYWx1ZShPYmplY3QpfSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogPGxpPntAbGluayAjYnVpbGRWYWx1ZSgpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgcmV0dXJuaW5nIGEgPGNvZGU+bnVsbDwvY29kZT4gdmFsdWUgd2hlbgotICogICAgIHRoZSBzdWJqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+IGlzIHVuYWNjZXB0YWJsZQotICogPGxpPntAbGluayAjc2V0VmFsdWUoT2JqZWN0KX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCBvbmx5IGlmIHNvbWV0aGluZyBtdXN0IGJlIGRvbmUgd2hlbiB0aGUgc3ViamVjdAotICogICAgIGlzIDxjb2RlPm51bGw8L2NvZGU+IChlLmcuIHRocm93IGFuIGV4Y2VwdGlvbikKLSAqIDwvdWw+Ci0gKiBUbyBub3RpZnkgbGlzdGVuZXJzLCBzdWJjbGFzc2VzIGNhbiBjYWxsIHtAbGluayAjYXNwZWN0Q2hhbmdlZCgpfQotICogd2hlbmV2ZXIgdGhlIGFzcGVjdCBoYXMgY2hhbmdlZC4KLSAqIAotICogQHBhcmFtIDxTPiB0aGUgdHlwZSBvZiB0aGUgbW9kZWwncyBzdWJqZWN0Ci0gKiBAcGFyYW0gPFY+IHRoZSB0eXBlIG9mIHRoZSBzdWJqZWN0J3MgcHJvcGVydHkgYXNwZWN0Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBc3BlY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFMsIFY+Ci0JZXh0ZW5kcyBBc3BlY3RBZGFwdGVyPFMsIFY+Ci0JaW1wbGVtZW50cyBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+Ci17Ci0JLyoqCi0JICogQ2FjaGUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGFzcGVjdCBzbyB3ZQotCSAqIGNhbiBwYXNzIGFuICJvbGQgdmFsdWUiIHdoZW4gd2UgZmlyZSBhIHByb3BlcnR5IGNoYW5nZSBldmVudC4KLQkgKiBXZSBuZWVkIHRoaXMgYmVjYXVzZSB0aGUgdmFsdWUgbWF5IGJlIGNhbGN1bGF0ZWQgYW5kIG1heQotCSAqIG5vdCBiZSBpbiB0aGUgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGZpcmVkIGJ5IHRoZSBzdWJqZWN0LAotCSAqIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggbXVsdGlwbGUgYXNwZWN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9sYXRpbGUgViB2YWx1ZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhZGFwdGVyIGZvciBhbiBhc3BlY3Qgb2YgdGhlCi0JICogc3BlY2lmaWVkIHN1YmplY3QuCi0JICogVGhlIHN1YmplY3QgbW9kZWwgY2Fubm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBBc3BlY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdE1vZGVsKSB7Ci0JCXN1cGVyKHN1YmplY3RNb2RlbCk7Ci0JCS8vIG91ciB2YWx1ZSBpcyBudWxsIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIHN1YmplY3QKLQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzdWJqZWN0J3MgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBmaW5hbCBWIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ViamVjdCdzIGFzcGVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShWIHZhbHVlKSB7Ci0JCWlmICh0aGlzLnN1YmplY3QgIT0gbnVsbCkgewotCQkJdGhpcy5zZXRWYWx1ZV8odmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ViamVjdCdzIGFzcGVjdC4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoZSB7QGxpbmsgI3N1YmplY3R9IGlzCi0JICogPGVtPm5vdDwvZW0+IDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzZWUgI3NldFZhbHVlKE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFYgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBWIGdldEFzcGVjdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGdldExpc3RlbmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkgewotCQlyZXR1cm4gVkFMVUU7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhWQUxVRSk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUFzcGVjdENoYW5nZWQoViBvbGRWYWx1ZSwgViBuZXdWYWx1ZSkgewotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdCgpIHsKLQkJc3VwZXIuZW5nYWdlU3ViamVjdCgpOwotCQkvLyBzeW5jIG91ciB2YWx1ZSAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgc3ViamVjdCwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3QoKSB7Ci0JCXN1cGVyLmRpc2VuZ2FnZVN1YmplY3QoKTsKLQkJLy8gY2xlYXIgb3V0IG91ciB2YWx1ZSB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBzdWJqZWN0Ci0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFzcGVjdCdzIHZhbHVlLgotCSAqIEF0IHRoaXMgcG9pbnQgdGhlIHN1YmplY3QgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBWIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiAodGhpcy5zdWJqZWN0ID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRWYWx1ZV8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzdWJqZWN0J3MgYXNwZWN0LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhlIHtAbGluayAjc3ViamVjdH0gaXMKLQkgKiA8ZW0+bm90PC9lbT4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNlZSAjYnVpbGRWYWx1ZSgpCi0JICovCi0JcHJvdGVjdGVkIFYgYnVpbGRWYWx1ZV8oKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGJ5IHN1YmNsYXNzZXMgd2hlbmV2ZXIgdGhlIHN1YmplY3QncyBhc3BlY3QKLQkgKiBoYXMgY2hhbmdlZDsgbGlzdGVuZXJzIHdpbGwgYmUgbm90aWZpZWQgYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhc3BlY3RDaGFuZ2VkKCkgewotCQlWIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMuZmlyZUFzcGVjdENoYW5nZWQob2xkLCB0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0J1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0J1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYyOTJiOC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiBpcyB1c2VkIHRvIGhvbGQgYSB0ZW1wb3JhcnkKLSAqIGNvcHkgb2YgdGhlIHZhbHVlCi0gKiBpbiBhbm90aGVyIHByb3BlcnR5IHZhbHVlIG1vZGVsICh0aGUgIndyYXBwZWQiIHZhbHVlIG1vZGVsKS4gVGhlIGFwcGxpY2F0aW9uCi0gKiBjYW4gbW9kaWZ5IHRoaXMgdGVtcG9yYXJ5IGNvcHksIGFkIG5hdXNlYW07IGJ1dCB0aGUgdGVtcG9yYXJ5IGNvcHkgaXMgb25seQotICogcGFzc2VkIHRocm91Z2ggdG8gdGhlICJ3cmFwcGVkIiB2YWx1ZSBtb2RlbCB3aGVuIHRoZSB0cmlnZ2VyICJhY2NlcHRzIiB0aGUKLSAqIGJ1ZmZlcmVkIHZhbHVlLiBBbHRlcm5hdGl2ZWx5LCB0aGUgYXBwbGljYXRpb24gY2FuICJyZXNldCIgdGhlIGJ1ZmZlcmVkIHZhbHVlCi0gKiB0byB0aGUgb3JpZ2luYWwsICJ3cmFwcGVkIiB2YWx1ZS4KLSAqIDxwPgotICogVGhlIHRyaWdnZXIgaXMgYW5vdGhlciB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfSB0aGF0IGhvbGRzIGEKLSAqIHtAbGluayBCb29sZWFufSBhbmQgdGhlIGFwcGxpY2F0aW9uIGNoYW5nZXMgdGhlIHRyaWdnZXIncyB2YWx1ZSB0bwotICogPGNvZGU+dHJ1ZTwvY29kZT4gb24gImFjY2VwdCIsIDxjb2RlPmZhbHNlPC9jb2RlPiBvbiAicmVzZXQiLgotICogPHA+Ci0gKiBUeXBpY2FsbHksIGluIGEgZGlhbG9nOjx1bD4KLSAqIDxsaT5wcmVzc2luZyB0aGUgIk9LIiBidXR0b24gd2lsbCB0cmlnZ2VyIGFuICJhY2NlcHQiIGFuZCBjbG9zZSB0aGUgZGlhbG9nCi0gKiA8bGk+cHJlc3NpbmcgdGhlICJDYW5jZWwiIGJ1dHRvbiB3aWxsIHNpbXBseSBjbG9zZSB0aGUgZGlhbG9nLAotICogICAgIGRyb3BwaW5nIHRoZSAiYnVmZmVyZWQiIHZhbHVlcyBpbnRvIHRoZSBiaXQgYnVja2V0Ci0gKiA8bGk+cHJlc3NpbmcgdGhlICJBcHBseSIgYnV0dG9uIHdpbGwgdHJpZ2dlciBhbiAiYWNjZXB0IiBhbmQgbGVhdmUgdGhlCi0gKiAgICAgZGlhbG9nIG9wZW4KLSAqIDxsaT5wcmVzc2luZyB0aGUgIlJlc3RvcmUiIGJ1dHRvbiB3aWxsIHRyaWdnZXIgYSAicmVzZXQiIGFuZCBsZWF2ZSB0aGUKLSAqICAgICBkaWFsb2cgb3BlbgotICogPC91bD4KLSAqIEEgbnVtYmVyIG9mIGJ1ZmZlcmVkIHByb3BlcnR5IHZhbHVlIG1vZGVscyBjYW4gd3JhcCBhbm90aGVyIHNldCBvZgotICogcHJvcGVydHkgYXNwZWN0IGFkYXB0ZXJzIHRoYXQgYWRhcHQgdGhlIHZhcmlvdXMgYXNwZWN0cyBvZiBhIHNpbmdsZQotICogZG9tYWluIG1vZGVsLiBBbGwgdGhlIGJ1ZmZlcmVkIHByb3BlcnR5IHZhbHVlIG1vZGVscyBjYW4gYmUgaG9va2VkIHRvIHRoZQotICogc2FtZSB0cmlnZ2VyLCBhbmQgdGhhdCB0cmlnZ2VyIGlzIGNvbnRyb2xsZWQgYnkgdGhlIGFwcGxpY2F0aW9uLCB0eXBpY2FsbHkKLSAqIHZpYSB0aGUgIk9LIiBidXR0b24gaW4gYSBkaWFsb2cuCi0gKiAKLSAqIEBwYXJhbSA8Vj4gdGhlIHR5cGUgb2YgdGhlIG1vZGVsJ3MgdmFsdWUKLSAqIEBzZWUgUHJvcGVydHlBc3BlY3RBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+Ci0JZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFY+Ci0JaW1wbGVtZW50cyBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+Ci17Ci0JLyoqCi0JICogV2UgY2FjaGUgdGhlIHZhbHVlIGhlcmUgdW50aWwgaXQgaXMgYWNjZXB0ZWQgYW5kIHBhc3NlZAotCSAqIHRocm91Z2ggdG8gdGhlIHdyYXBwZWQgdmFsdWUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIHZvbGF0aWxlIFYgYnVmZmVyZWRWYWx1ZTsKLQotCS8qKgotCSAqIFRoaXMgaXMgc2V0IHRvIHRydWUgd2hlbiB3ZSBhcmUgImFjY2VwdGluZyIgdGhlIGJ1ZmZlcmVkIHZhbHVlCi0JICogYW5kIHBhc3NpbmcgaXQgdGhyb3VnaCB0byB0aGUgd3JhcHBlZCB2YWx1ZSBtb2RlbC4gVGhpcyBhbGxvd3MKLQkgKiB1cyB0byBpZ25vcmUgdGhlIHByb3BlcnR5IGNoYW5nZSBldmVudCBmaXJlZCBieSB0aGUgd3JhcHBlZAotCSAqIHZhbHVlIG1vZGVsLgotCSAqIChXZSBjYW4ndCBzdG9wIGxpc3RlbmluZyB0byB0aGUgd3JhcHBlZCB2YWx1ZSBtb2RlbCwgYmVjYXVzZQotCSAqIGlmIHdlIGFyZSB0aGUgb25seSBsaXN0ZW5lciB0aGF0IGNvdWxkICJkZWFjdGl2YXRlIiB0aGUgd3JhcHBlZAotCSAqIHZhbHVlIG1vZGVsLikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9sYXRpbGUgYm9vbGVhbiBhY2NlcHRpbmc7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSB0cmlnZ2VyIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJ1ZmZlcmVkIHZhbHVlCi0JICogc2hvdWxkIGJlIGFjY2VwdGVkIG9yIHJlc2V0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdHJpZ2dlck1vZGVsOwotCi0JLyoqIFRoaXMgbGlzdGVucyB0byB0aGUgdHJpZ2dlciBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB0cmlnZ2VyTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgb3VyIGJ1ZmZlcmVkIHZhbHVlIGhhcyBiZWVuIGFzc2lnbmVkCi0JICogYSB2YWx1ZSBhbmQgaXMgcG9zc2libHkgb3V0IG9mIHN5bmMgd2l0aCB0aGUgd3JhcHBlZCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9sYXRpbGUgYm9vbGVhbiBidWZmZXJpbmc7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYnVmZmVyZWQgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgdHJpZ2dlciBtb2RlbC4KLQkgKi8KLQkvLyBUT0RPIHdyYXAgdGhlIHZhbHVlIG1vZGVsIGluIGEgQ2FjaGluZ1BWTVdyYXBwZXIgYW5kIGdldCByaWQgb2YgYWNjZXB0aW5nIGZsYWcKLQlwdWJsaWMgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbChNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHZhbHVlTW9kZWwsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB0cmlnZ2VyTW9kZWwpIHsKLQkJc3VwZXIodmFsdWVNb2RlbCk7Ci0JCWlmICh0cmlnZ2VyTW9kZWwgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy50cmlnZ2VyTW9kZWwgPSB0cmlnZ2VyTW9kZWw7Ci0JCXRoaXMuYnVmZmVyZWRWYWx1ZSA9IG51bGw7Ci0JCXRoaXMuYnVmZmVyaW5nID0gZmFsc2U7Ci0JCXRoaXMuYWNjZXB0aW5nID0gZmFsc2U7Ci0JCXRoaXMudHJpZ2dlckxpc3RlbmVyID0gdGhpcy5idWlsZFRyaWdnZXJMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVHJpZ2dlckxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRyaWdnZXJMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBUcmlnZ2VyTGlzdGVuZXIKLQkJZXh0ZW5kcyBQcm9wZXJ0eUNoYW5nZUFkYXB0ZXIKLQl7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC50aGlzLnRyaWdnZXJDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWx1ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiB3ZSBhcmUgY3VycmVudGx5ICJidWZmZXJpbmciIGEgdmFsdWUsIHJldHVybiB0aGF0OwotCSAqIG90aGVyd2lzZSwgcmV0dXJuIHRoZSB3cmFwcGVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBWIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5idWZmZXJpbmcgPyB0aGlzLmJ1ZmZlcmVkVmFsdWUgOiB0aGlzLnZhbHVlTW9kZWwuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBBc3NpZ24gdGhlIG5ldyB2YWx1ZSB0byBvdXIgImJ1ZmZlcmVkIiB2YWx1ZS4KLQkgKiBJdCB3aWxsIGJlIHB1c2hlZCB0byB0aGUgd3JhcHBlZCB2YWx1ZSBtb2RlbAotCSAqIHdoZW4gdGhlIHRyaWdnZXIgaXMgImFjY2VwdGVkIi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShWIHZhbHVlKSB7Ci0JCWlmICh0aGlzLmJ1ZmZlcmluZykgewotCQkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwodmFsdWUsIHRoaXMudmFsdWVNb2RlbC5nZXRWYWx1ZSgpKSkgewotCQkJCS8vIHRoZSBidWZmZXJlZCB2YWx1ZSBpcyBiZWluZyBzZXQgYmFjayB0byB0aGUgb3JpZ2luYWwgdmFsdWUKLQkJCQl0aGlzLnJlc2V0KCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHRoZSBidWZmZXJlZCB2YWx1ZSBpcyBiZWluZyBjaGFuZ2VkCi0JCQkJT2JqZWN0IG9sZCA9IHRoaXMuYnVmZmVyZWRWYWx1ZTsKLQkJCQl0aGlzLmJ1ZmZlcmVkVmFsdWUgPSB2YWx1ZTsKLQkJCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZCwgdmFsdWUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwodmFsdWUsIHRoaXMudmFsdWVNb2RlbC5nZXRWYWx1ZSgpKSkgewotCQkJCS8vIHRoZSBidWZmZXJlZCB2YWx1ZSBpcyBiZWluZyBzZXQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIG9yaWdpbmFsIHZhbHVlIC0gaWdub3JlCi0JCQl9IGVsc2UgewotCQkJCS8vIHRoZSBidWZmZXJlZCB2YWx1ZSBpcyBiZWluZyBzZXQgZm9yIHRoZSBmaXJzdCB0aW1lCi0JCQkJT2JqZWN0IG9sZCA9IHRoaXMudmFsdWVNb2RlbC5nZXRWYWx1ZSgpOwotCQkJCXRoaXMuYnVmZmVyZWRWYWx1ZSA9IHZhbHVlOwotCQkJCXRoaXMuYnVmZmVyaW5nID0gdHJ1ZTsKLQkJCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZCwgdmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIgZXh0ZW5zaW9ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdG8gZW5nYWdlIHRoZSB0cmlnZ2VyIG1vZGVsIGFsc28uCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCXRoaXMudHJpZ2dlck1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVkFMVUUsIHRoaXMudHJpZ2dlckxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gZGlzZW5nYWdlIHRoZSB0cmlnZ2VyIG1vZGVsIGFsc28uCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMudHJpZ2dlck1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVkFMVUUsIHRoaXMudHJpZ2dlckxpc3RlbmVyKTsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgd2UgYXJlIGN1cnJlbnRseSAiYWNjZXB0aW5nIiB0aGUgdmFsdWUgKGkuZSBwYXNzaW5nIGl0IG9uIHRvIHRoZQotCSAqICJ3cmFwcGVkIiBtb2RlbCksIGlnbm9yZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucywgc2luY2Ugd2UgY2F1c2VkCi0JICogdGhlbSBhbmQgb3VyIG93biBsaXN0ZW5lcnMgYXJlIGFscmVhZHkgYXdhcmUgb2YgdGhlIGNoYW5nZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB3cmFwcGVkVmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMuYWNjZXB0aW5nKSB7Ci0JCQl0aGlzLndyYXBwZWRWYWx1ZUNoYW5nZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIElmIHdlIGhhdmUgYSAiYnVmZmVyZWQiIHZhbHVlLCBjaGVjayB3aGV0aGVyIHRoZSAid3JhcHBlZCIgdmFsdWUgaGFzCi0JICogY2hhbmdlZCB0byBiZSB0aGUgc2FtZSBhcyB0aGUgImJ1ZmZlcmVkIiB2YWx1ZS4gSWYgaXQgaGFzLCBzdG9wICJidWZmZXJpbmciOwotCSAqIGlmIG5vdCwgZG8gbm90aGluZy4KLQkgKiBJZiB3ZSBkbyBub3QgeWV0IGhhdmUgYSAiYnVmZmVyZWQiIHZhbHVlLCBzaW1wbHkgcHJvcGFnYXRlIHRoZQotCSAqIGNoYW5nZSBub3RpZmljYXRpb24gd2l0aCB0aGUgYnVmZmVyZWQgbW9kZWwgYXMgdGhlIHNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cmFwcGVkVmFsdWVDaGFuZ2VkXyhQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmJ1ZmZlcmluZykgewotCQkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwoZXZlbnQuZ2V0TmV3VmFsdWUoKSwgdGhpcy5idWZmZXJlZFZhbHVlKSkgewotCQkJCS8vIHRoZSBidWZmZXJlZCB2YWx1ZSBpcyBiZWluZyBzZXQgYmFjayB0byB0aGUgb3JpZ2luYWwgdmFsdWUKLQkJCQl0aGlzLnJlc2V0KCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuaGFuZGxlQ2hhbmdlQ29uZmxpY3QoZXZlbnQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmNsb25lKHRoaXMpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIGlmIHdlIGhhdmUgYSAiYnVmZmVyZWQiIHZhbHVlIGFuZCB0aGUgIndyYXBwZWQiIHZhbHVlIGNoYW5nZXMsCi0JICogd2Ugc2ltcGx5IGlnbm9yZSB0aGUgbmV3ICJ3cmFwcGVkIiB2YWx1ZSBhbmQgc2ltcGx5IG92ZXJsYXkgaXQgd2l0aCB0aGUKLQkgKiAiYnVmZmVyZWQiIHZhbHVlIGlmIGl0IGlzICJhY2NlcHRlZCIuICgiTGFzdCBPbmUgSW4gV2lucyIgY29uY3VycmVuY3kgbW9kZWwpCi0JICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY2hhbmdlIHRoYXQgYmVoYXZpb3Igd2l0aCBhCi0JICogZGlmZmVyZW50IGNvbmN1cnJlbmN5IG1vZGVsLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIGRyb3AgdGhlICJidWZmZXJlZCIgdmFsdWUKLQkgKiBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBuZXcgIndyYXBwZWQiIHZhbHVlLCBvciB5b3UgY291bGQgdGhyb3cgYW4KLQkgKiBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlQ29uZmxpY3QoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdGhlIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRyaWdnZXJDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy50cmlnZ2VyQ2hhbmdlZCgoKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHJpZ2dlciBjaGFuZ2VkOjx1bD4KLQkgKiA8bGk+SWYgaXQgaXMgbm93IDxjb2RlPnRydWU8L2NvZGU+LCAiYWNjZXB0IiB0aGUgYnVmZmVyZWQgdmFsdWUgYW5kIHB1c2gKLQkgKiAgICAgaXQgdG8gdGhlIHdyYXBwZWQgdmFsdWUgbW9kZWwuCi0JICogPGxpPklmIGl0IGlzIG5vdyA8Y29kZT5mYWxzZTwvY29kZT4sICJyZXNldCIgdGhlIGJ1ZmZlcmVkIHZhbHVlIHRvIGl0cwotCSAqICAgICBvcmlnaW5hbCB2YWx1ZS4KLQkgKiA8L3VsPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyaWdnZXJDaGFuZ2VkKGJvb2xlYW4gdHJpZ2dlclZhbHVlKSB7Ci0JCS8vIGlmIG5vdGhpbmcgaGFzIGJlZW4gImJ1ZmZlcmVkIiwgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZzoKLQkJLy8gbm90aGluZyBuZWVkcyB0byBiZSBwYXNzZWQgdGhyb3VnaDsgbm90aGluZyBuZWVkcyB0byBiZSByZXNldDsKLQkJaWYgKHRoaXMuYnVmZmVyaW5nKSB7Ci0JCQlpZiAodHJpZ2dlclZhbHVlKSB7Ci0JCQkJdGhpcy5hY2NlcHQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5yZXNldCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0KCkgewotCQkvLyBzZXQgdGhlIGFjY2VwdGluZyBmbGFnIHNvIHdlIGlnbm9yZSBhbnkgZXZlbnRzCi0JCS8vIGZpcmVkIGJ5IHRoZSB3cmFwcGVkIHZhbHVlIG1vZGVsCi0JCXRoaXMuYWNjZXB0aW5nID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCXRoaXMuZ2V0VmFsdWVNb2RlbCgpLnNldFZhbHVlKHRoaXMuYnVmZmVyZWRWYWx1ZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0aGlzLmJ1ZmZlcmVkVmFsdWUgPSBudWxsOwotCQkJdGhpcy5idWZmZXJpbmcgPSBmYWxzZTsKLQkJCS8vIGNsZWFyIHRoZSBmbGFnIG9uY2UgdGhlICJhY2NlcHQiIGlzIGNvbXBsZXRlCi0JCQl0aGlzLmFjY2VwdGluZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7Ci0JCS8vIG5vdGlmeSBvdXIgbGlzdGVuZXJzIHRoYXQgb3VyIHZhbHVlIGhhcyBiZWVuIHJlc2V0Ci0JCU9iamVjdCBvbGQgPSB0aGlzLmJ1ZmZlcmVkVmFsdWU7Ci0JCXRoaXMuYnVmZmVyZWRWYWx1ZSA9IG51bGw7Ci0JCXRoaXMuYnVmZmVyaW5nID0gZmFsc2U7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkLCB0aGlzLnZhbHVlTW9kZWwuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYnVmZmVyZWQgbW9kZWwgaXMgY3VycmVudGx5ICJidWZmZXJpbmciCi0JICogYSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0J1ZmZlcmluZygpIHsKLQkJcmV0dXJuIHRoaXMuYnVmZmVyaW5nOwotCX0KLQotCS8qKgotCSAqIE91ciBjb25zdHJ1Y3RvciBhY2NlcHRzIG9ubHkgYSB7QGxpbmsgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbH17QGNvZGU8VD59LgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IGdldFZhbHVlTW9kZWwoKSB7Ci0JCXJldHVybiAoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPikgdGhpcy52YWx1ZU1vZGVsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmlnZ2VyICoqKioqKioqKioKLQotCS8qKgotCSAqIDxjb2RlPlRyaWdnZXI8L2NvZGU+IGlzIGEgc3BlY2lhbCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IG9ubHkgbWFpbnRhaW5zIGl0cwotCSAqIHZhbHVlIChvZiA8Y29kZT50cnVlPC9jb2RlPiBvciA8Y29kZT5mYWxzZTwvY29kZT4pIGR1cmluZyB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBjYXVzZWQgYnkKLQkgKiB7QGxpbmsgI3NldFZhbHVlKE9iamVjdCl9LiBJbiBvdGhlciB3b3JkcywgYSA8Y29kZT5UcmlnZ2VyPC9jb2RlPgotCSAqIG9ubHkgaGFzIGEgdmFsaWQgdmFsdWUgd2hlbiBpdCBpcyBiZWluZyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUcmlnZ2VyCi0JCWV4dGVuZHMgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+Ci0JewotCQkvKioKLQkJICogQ29uc3RydWN0IGEgdHJpZ2dlciB3aXRoIGEgbnVsbCB2YWx1ZS4KLQkJICovCi0JCXB1YmxpYyBUcmlnZ2VyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCQkvKioKLQkJICogRXh0ZW5kIHNvIHRoYXQgdGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgaW52b2tlZCBkdXJpbmcKLQkJICogY2hhbmdlIG5vdGlmaWNhdGlvbiB0cmlnZ2VyZWQgYnkge0BsaW5rICNzZXRWYWx1ZShPYmplY3QpfS4KLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQm9vbGVhbiBnZXRWYWx1ZSgpIHsKLQkJCWlmICh0aGlzLnZhbHVlID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgbWV0aG9kIFRyaWdnZXIuZ2V0VmFsdWUoKSBtYXkgb25seSBiZSBjYWxsZWQgZHVyaW5nIGNoYW5nZSBub3RpZmljYXRpb24uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiB0aGlzLnZhbHVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEV4dGVuZCB0byByZXNldCB0aGUgdmFsdWUgdG8gPGNvZGU+bnVsbDwvY29kZT4gb25jZSBhbGwgdGhlCi0JCSAqIGxpc3RlbmVycyBoYXZlIGJlZW4gbm90aWZpZWQuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSkgewotCQkJc3VwZXIuc2V0VmFsdWUodmFsdWUpOwotCQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKioqCi0KLQkJLyoqCi0JCSAqIFNldCB0aGUgdHJpZ2dlcidzIHZhbHVlOjx1bD4KLQkJICogCTxsaT48Y29kZT50cnVlPC9jb2RlPiBpbmRpY2F0ZXMgImFjY2VwdCIKLQkJICogCTxsaT48Y29kZT5mYWxzZTwvY29kZT4gaW5kaWNhdGVzICJyZXNldCIKLQkJICogPC91bD4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFZhbHVlKGJvb2xlYW4gdmFsdWUpIHsKLQkJCXRoaXMuc2V0VmFsdWUoQm9vbGVhbi52YWx1ZU9mKHZhbHVlKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSB0cmlnZ2VyJ3MgdmFsdWU6PHVsPgotCQkgKiAJPGxpPjxjb2RlPnRydWU8L2NvZGU+IGluZGljYXRlcyAiYWNjZXB0IgotCQkgKiAJPGxpPjxjb2RlPmZhbHNlPC9jb2RlPiBpbmRpY2F0ZXMgInJlc2V0IgotCQkgKiA8L3VsPgotCQkgKiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBpbnZva2VkIGR1cmluZyBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gYm9vbGVhblZhbHVlKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VmFsdWUoKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBBY2NlcHQgdGhlIHRyaWdnZXIgKGkuZS4gc2V0IGl0cyB2YWx1ZSB0byA8Y29kZT50cnVlPC9jb2RlPikuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhY2NlcHQoKSB7Ci0JCQl0aGlzLnNldFZhbHVlKHRydWUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0cmlnZ2VyIGhhcyBiZWVuIGFjY2VwdGVkCi0JCSAqIChpLmUuIGl0cyB2YWx1ZSB3YXMgY2hhbmdlZCB0byA8Y29kZT50cnVlPC9jb2RlPikuCi0JCSAqIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGludm9rZWQgZHVyaW5nIGNoYW5nZSBub3RpZmljYXRpb24uCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0FjY2VwdGVkKCkgewotCQkJcmV0dXJuIHRoaXMuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmVzZXQgdGhlIHRyaWdnZXIgKGkuZS4gc2V0IGl0cyB2YWx1ZSB0byA8Y29kZT5mYWxzZTwvY29kZT4pLgotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCQl0aGlzLnNldFZhbHVlKGZhbHNlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHJpZ2dlciBoYXMgYmVlbiByZXNldAotCQkgKiAoaS5lLiBpdHMgdmFsdWUgd2FzIGNoYW5nZWQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+KS4KLQkJICogVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgaW52b2tlZCBkdXJpbmcgY2hhbmdlIG5vdGlmaWNhdGlvbi4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzUmVzZXQoKSB7Ci0JCQlyZXR1cm4gISB0aGlzLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2FjaGluZ1Byb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NhY2hpbmdQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMjMwMjIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2FjaGluZ1Byb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFdyYXAgYSB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgY2FjaGUgaXRzIHZhbHVlIHNvIGFueSBjaGFuZ2VzCi0gKiBtYWRlIHZpYSB0aGUgd3JhcHBlciBtb2RlbCB3aWxsIG5vdCBmaXJlIGFueSBldmVudHMgdG8gaXRzIGxpc3RlbmVycy4KLSAqIFRodXMsIGEgY2xpZW50IGNhbiBtb2RpZnkgYW5kIGxpc3RlbiB0byB0aGUgd3JhcHBlciBtb2RlbCBhbmQgbm90IHJlY2VpdmUKLSAqIGEgY2hhbmdlIGV2ZW50IHdoZW4gdGhlIGNsaWVudCBtb2RpZmllcyB0aGUgd3JhcHBlciBtb2RlbDsgYnV0IGFueSBjaGFuZ2VzCi0gKiBtYWRlIGJ5IG90aGVyIGNsaWVudHMgKGRpcmVjdGx5IHRvIHRoZSBvcmlnaW5hbCBtb2RlbCkgd2lsbCBmaXJlIGV2ZW50cwotICogdG8gdGhlIGNsaWVudC4KLSAqIAotICogQHBhcmFtIDxWPiB0aGUgdHlwZSBvZiB0aGUgbW9kZWwncyB2YWx1ZQotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGluZ1Byb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8Vj4KLQlleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8Vj4KLQlpbXBsZW1lbnRzIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4KLXsKLQkvKioKLQkgKiBDYWNoZSB0aGUgdmFsdWUgc28gd2UgaWdub3JlIGFueSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzCi0JICogd2Ugb3Vyc2VsdmVzIHRyaWdnZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvbGF0aWxlIFYgdmFsdWU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNhY2hpbmcgd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogbmVzdGVkIHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVsLgotCSAqLwotCXB1YmxpYyBDYWNoaW5nUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlcihNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHZhbHVlTW9kZWwpIHsKLQkJc3VwZXIodmFsdWVNb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjYWNoZWQgdmFsdWUsIHNpbmNlIGl0IGlzIHVwLXRvLWRhdGUuCi0JICovCi0JcHVibGljIFYgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCS8qKgotCSAqIENhY2hlIHRoZSBuZXcgdmFsdWUgc28gd2UgaWdub3JlIHRoZSByZXN1bHRpbmcgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFYgdmFsdWUpIHsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmdldFZhbHVlTW9kZWwoKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgd3JhcHBlZFZhbHVlQ2hhbmdlZChWIG9sZFZhbHVlLCBWIG5ld1ZhbHVlKSB7Ci0JCVYgb2xkID0gdGhpcy52YWx1ZTsKLQkJLy8gdGhlIG5ldyBldmVudCB3aWxsIGJlIHN1cHByZXNzZWQgaWYgaXQgaXMgdGhlIHJlc3VsdCBvZiBhIG5ldyB2YWx1ZQotCQkvLyBmb3J3YXJkZWQgZnJvbSB0aGlzIHdyYXBwZXIgKGkuZS4gJ29sZCcgYW5kICduZXdWYWx1ZScgYXJlIGVxdWFsKQotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZCwgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBPdXIgY29uc3RydWN0b3JzIGFjY2VwdCBvbmx5IGEKLQkgKiB7QGxpbmsgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbH17QGNvZGU8Vj59LAotCSAqIHNvIHRoaXMgY2FzdCBzaG91bGQgYmUgc2FmZS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBnZXRWYWx1ZU1vZGVsKCkgewotCQlyZXR1cm4gKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4pIHRoaXMudmFsdWVNb2RlbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIFdlIGhhdmUgbGlzdGVuZXJzLCBjYWNoZSB0aGUgbmVzdGVkIHZhbHVlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQl0aGlzLnZhbHVlID0gdGhpcy52YWx1ZU1vZGVsLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogV2UgaGF2ZSBubyBtb3JlIGxpc3RlbmVycywgY2xlYXIgdGhlIGNhY2hlZCB2YWx1ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2hhbmdlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2hhbmdlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGNmMTRhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NoYW5nZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5BYnN0cmFjdENoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhIG1vZGVsLCAibGF6aWx5IiBsaXN0ZW4gdG8gaXQsIGFuZCBjb252ZXJ0Ci0gKiBpdHMgY2hhbmdlIG5vdGlmaWNhdGlvbnMgaW50byBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBjaGFuZ2UKLSAqIG5vdGlmaWNhdGlvbnMuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQ6PHVsPgotICogPGxpPntAbGluayAjYnVpbGRWYWx1ZSgpfTxwPgotICogICAgIHRvIHJldHVybiB0aGUgY3VycmVudCBwcm9wZXJ0eSB2YWx1ZSwgYXMgZGVyaXZlZCBmcm9tIHRoZQotICogICAgIGN1cnJlbnQgbW9kZWwKLSAqIDwvdWw+Ci0gKiBTdWJjbGFzc2VzIG1pZ2h0IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzCi0gKiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIChieSBub3QgcmVjYWxjdWxhdGluZyB0aGUgdmFsdWUsIGlmIHBvc3NpYmxlKTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNtb2RlbENoYW5nZWQoQ2hhbmdlRXZlbnQgZXZlbnQpfQotICogPGxpPntAbGluayAjYnVpbGRDaGFuZ2VMaXN0ZW5lcigpfQotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENoYW5nZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLQlleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxUPgotewotCS8qKiBUaGUgd3JhcHBlZCBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTW9kZWwgbW9kZWw7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jIHdpdGggY2hhbmdlcyB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDaGFuZ2VMaXN0ZW5lciBtb2RlbExpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBDaGFuZ2VQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyKE1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCXRoaXMubW9kZWxMaXN0ZW5lciA9IHRoaXMuYnVpbGRDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBDaGFuZ2VMaXN0ZW5lciBidWlsZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vZGVsTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgTW9kZWxMaXN0ZW5lcgotCQlleHRlbmRzIEFic3RyYWN0Q2hhbmdlTGlzdGVuZXIKLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBtb2RlbENoYW5nZWQoQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCUNoYW5nZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbW9kZWwuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLm1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMubW9kZWxMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy5tb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLm1vZGVsTGlzdGVuZXIpOwotCX0KLQotCQotCS8vICoqKioqKioqKiogY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgbW9kZWwgaGFzIGNoYW5nZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbW9kZWxDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NGMzM2UuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGV4dGVuc2lvbiBvZiB7QGxpbmsgQXNwZWN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyfSBwcm92aWRlcwotICogYmFzaWMgY29sbGVjdGlvbiBjaGFuZ2Ugc3VwcG9ydC4KLSAqIFRoaXMgY29udmVydHMgYSBzZXQgb2Ygb25lIG9yIG1vcmUgY29sbGVjdGlvbnMgaW50bwotICogYSBzaW5nbGUge0BsaW5rICNWQUxVRVN9IGNvbGxlY3Rpb24uCi0gKiA8cD4KLSAqIFRoZSB0eXBpY2FsIHN1YmNsYXNzIHdpbGwgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzIChzZWUgdGhlIGRlc2NyaXB0aW9ucwotICogaW4ge0BsaW5rIEFzcGVjdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcn0pOjx1bD4KLSAqIDxsaT57QGxpbmsgI2dldEl0ZXJhYmxlKCl9IC0gcHJlZmVycmVkCi0gKiA8bGk+e0BsaW5rICNzaXplXygpfSAtIHNlbWktcHJlZmVycmVkCi0gKiA8bGk+e0BsaW5rICNpdGVyYXRvcl8oKX0KLSAqIDxsaT57QGxpbmsgI2l0ZXJhdG9yKCl9Ci0gKiA8bGk+e0BsaW5rICNzaXplKCl9Ci0gKiA8L3VsPgotICogCi0gKiBAcGFyYW0gPFM+IHRoZSB0eXBlIG9mIHRoZSBhZGFwdGVyJ3Mgc3ViamVjdAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiB0aGUgYWRhcHRlcidzIGNvbGxlY3Rpb24ncyBlbGVtZW50cwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8UyBleHRlbmRzIE1vZGVsLCBFPgotCWV4dGVuZHMgQXNwZWN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFMsIEU+Ci17Ci0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIHN1YmplY3QncyBjb2xsZWN0aW9ucyB0aGF0IHdlIHVzZSBmb3IgdGhlIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBhc3BlY3ROYW1lczsKLQkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9BU1BFQ1RfTkFNRVMgPSBuZXcgU3RyaW5nWzBdOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3RzLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYXNwZWN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCBjb2xsZWN0aW9uIGFzcGVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIoU3RyaW5nIGFzcGVjdE5hbWUsIFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdHJpbmdbXSB7YXNwZWN0TmFtZX0sIHN1YmplY3QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCBjb2xsZWN0aW9uIGFzcGVjdHMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyKFN0cmluZ1tdIGFzcGVjdE5hbWVzLCBTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFM+KHN1YmplY3QpLCBhc3BlY3ROYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IG1vZGVsCi0JICogYW5kIGNvbGxlY3Rpb24gYXBlY3RzLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RNb2RlbCwgU3RyaW5nLi4uIGFzcGVjdE5hbWVzKSB7Ci0JCXN1cGVyKHN1YmplY3RNb2RlbCk7Ci0JCXRoaXMuYXNwZWN0TmFtZXMgPSBhc3BlY3ROYW1lczsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRBc3BlY3RDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdCBob2xkZXIKLQkgKiBhbmQgY29sbGVjdGlvbiBhc3BlY3RzLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RNb2RlbCwgQ29sbGVjdGlvbjxTdHJpbmc+IGFzcGVjdE5hbWVzKSB7Ci0JCXRoaXMoc3ViamVjdE1vZGVsLCBhc3BlY3ROYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbYXNwZWN0TmFtZXMuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gYXNwZWN0IGFkYXB0ZXIgZm9yIGFuICJ1bmNoYW5naW5nIiBjb2xsZWN0aW9uIGluCi0JICogdGhlIHNwZWNpZmllZCBzdWJqZWN0LiBUaGlzIGlzIHVzZWZ1bCBmb3IgYSBjb2xsZWN0aW9uIGFzcGVjdCB0aGF0IGRvZXMgbm90Ci0JICogY2hhbmdlIGZvciBhIHBhcnRpY3VsYXIgc3ViamVjdDsgYnV0IHRoZSBzdWJqZWN0IHdpbGwgY2hhbmdlLCByZXN1bHRpbmcgaW4KLQkgKiBhIG5ldyBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RNb2RlbCkgewotCQl0aGlzKHN1YmplY3RNb2RlbCwgRU1QVFlfQVNQRUNUX05BTUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZEFzcGVjdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFzcGVjdENoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzIGludG8ge0BsaW5rICNWQUxVRVN9Ci0JICogY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEFzcGVjdENoYW5nZUxpc3RlbmVyCi0JCWV4dGVuZHMgQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIKLQl7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIudGhpcy5hc3BlY3RJdGVtc0FkZGVkKGV2ZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIudGhpcy5hc3BlY3RJdGVtc1JlbW92ZWQoZXZlbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIudGhpcy5hc3BlY3RDb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIudGhpcy5hc3BlY3RDb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgY29sbGVjdGlvbk5hbWUgOiB0aGlzLmFzcGVjdE5hbWVzKSB7Ci0JCQl0aGlzLnN1YmplY3QuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCB0aGlzLmFzcGVjdENoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotICAgIAlmb3IgKFN0cmluZyBjb2xsZWN0aW9uTmFtZSA6IHRoaXMuYXNwZWN0TmFtZXMpIHsKLQkJCXRoaXMuc3ViamVjdC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIHRoaXMuYXNwZWN0Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBhc3BlY3RJdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGV2ZW50LmNsb25lKHRoaXMsIFZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFzcGVjdEl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGV2ZW50LmNsb25lKHRoaXMsIFZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFzcGVjdENvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50LmNsb25lKHRoaXMsIFZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFzcGVjdENvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChldmVudC5jbG9uZSh0aGlzLCBWQUxVRVMpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZTMzZDUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIHVzIHRvIG1ha2UgYSB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9IGJlaGF2ZSBsaWtlCi0gKiBhIHJlYWQtb25seSB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9LCBzb3J0YS4KLSAqIDxwPgotICogVG8gbWFpbnRhaW4gYSByZWFzb25hYmx5IGNvbnNpc3RlbnQgYXBwZWFyYW5jZSB0byBjbGllbnQgY29kZSwgd2UKLSAqIGtlZXAgYW4gaW50ZXJuYWwgbGlzdCBzb21ld2hhdCBpbiBzeW5jIHdpdGggdGhlIHdyYXBwZWQgY29sbGVjdGlvbi4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gU2luY2Ugd2Ugb25seSBsaXN0ZW4gdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB3aGVuIHdlIGhhdmUKLSAqIGxpc3RlbmVycyBvdXJzZWx2ZXMgYW5kIHdlIGNhbiBvbmx5IHN0YXkgaW4gc3luYyB3aXRoIHRoZSB3cmFwcGVkCi0gKiBjb2xsZWN0aW9uIHdoaWxlIHdlIGFyZSBsaXN0ZW5pbmcgdG8gaXQsIHJlc3VsdHMgdG8gdmFyaW91cyBtZXRob2RzCi0gKiAoZS5nLiB7QGxpbmsgI3NpemUoKX0sIHtAbGluayAjZ2V0KGludCl9KSB3aWxsIGJlIHVucHJlZGljdGFibGUgd2hlbmV2ZXIKLSAqIHdlIGRvIG5vdCBoYXZlIGFueSBsaXN0ZW5lcnMuIFRoaXMgc2hvdWxkIG5vdCBiZSB0b28gcGFpbmZ1bCBzaW5jZSwKLSAqIG1vc3QgbGlrZWx5LCBjbGllbnRzIHdpbGwgYWxzbyBiZSBsaXN0ZW5lcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdExpc3RWYWx1ZU1vZGVsCi0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFPgotewotCS8qKiBUaGUgd3JhcHBlZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgZm9yd2FyZHMgYW55IGV2ZW50cyBmaXJlZCBieSB0aGUgY29sbGVjdGlvbiBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBPdXIgaW50ZXJuYWwgbGlzdCwgd2hpY2ggaG9sZHMgdGhlIHNhbWUgZWxlbWVudHMgYXMKLQkgKiB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uLCBidXQga2VlcHMgdGhlbSBpbiBvcmRlci4KLQkgKi8KLQkvLyB3ZSBkZWNsYXJlIHRoaXMgYW4gQXJyYXlMaXN0IHNvIHdlIGNhbiB1c2UgI2Nsb25lKCkgYW5kICNlbnN1cmVDYXBhY2l0eShpbnQpCi0JcHJvdGVjdGVkIGZpbmFsIEFycmF5TGlzdDxFPiBsaXN0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQlzdXBlcigpOwotCQlpZiAoY29sbGVjdGlvbkhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIgPSBjb2xsZWN0aW9uSG9sZGVyOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5saXN0ID0gbmV3IEFycmF5TGlzdDxFPihjb2xsZWN0aW9uSG9sZGVyLnNpemUoKSk7Ci0JCS8vIHBvc3Rwb25lIGJ1aWxkaW5nIHRoZSBsaXN0IGFuZCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgY29sbGVjdGlvbgotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgY29sbGVjdGlvbiBoYXMgY2hhbmdlZCwgZm9yd2FyZCBhbiBlcXVpdmFsZW50Ci0JICogbGlzdCBjaGFuZ2UgZXZlbnQgdG8gb3VyIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPEU+KHRoaXMubGlzdCk7Ci0JfQotCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0LmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC50b0FycmF5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCQkvLyBzeW5jIG91ciBsaXN0ICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBjb2xsZWN0aW9uIG1vZGVsLAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLmJ1aWxkTGlzdCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCQkvLyBjbGVhciBvdXQgdGhlIGxpc3Qgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIKLQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRMaXN0KCkgewotCQkvLyBpZiB0aGUgbmV3IGNvbGxlY3Rpb24gaXMgZW1wdHksIGRvIG5vdGhpbmcKLQkJaW50IHNpemUgPSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpOwotCQlpZiAoc2l6ZSAhPSAwKSB7Ci0JCQl0aGlzLmJ1aWxkTGlzdChzaXplKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkTGlzdChpbnQgc2l6ZSkgewotCQl0aGlzLmxpc3QuZW5zdXJlQ2FwYWNpdHkoc2l6ZSk7Ci0JCWZvciAoRSBlYWNoIDogdGhpcy5jb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCQl0aGlzLmxpc3QuYWRkKGVhY2gpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5hZGRJdGVtc1RvTGlzdCh0aGlzLmluZGV4VG9BZGRJdGVtcygpLCB0aGlzLmdldEl0ZW1zKGV2ZW50KSwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgaW5kZXhUb0FkZEl0ZW1zKCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnNpemUoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KHRoaXMuZ2V0SXRlbXMoZXZlbnQpLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmNsZWFyTGlzdCh0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0JCi0JLyoqCi0JICogc3luY2hyb25pemUgb3VyIGludGVybmFsIGxpc3Qgd2l0aCB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaW50IHNpemUgPSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpOwotCQlpZiAoc2l6ZSA9PSAwKSB7Ci0JCQlpZiAodGhpcy5saXN0LmlzRW1wdHkoKSkgewotCQkJCS8vIG5vIGNoYW5nZQotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmNsZWFyTGlzdCh0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLmxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJdGhpcy5idWlsZExpc3Qoc2l6ZSk7Ci0JCQkJdGhpcy5maXJlSXRlbXNBZGRlZChMSVNUX1ZBTFVFUywgMCwgdGhpcy5saXN0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zeW5jaHJvbml6ZUxpc3QodGhpcy5idWlsZFN5bmNMaXN0KCksIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBidWlsZFN5bmNMaXN0KCkgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uSG9sZGVyOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubGlzdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNjM2ZTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgbmVlZGVkIHRvIHdyYXAKLSAqIGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgY29udmVydAotICogaXRzIGNoYW5nZSBub3RpZmljYXRpb25zIGludG8gcHJvcGVydHkgdmFsdWUgbW9kZWwgY2hhbmdlCi0gKiBub3RpZmljYXRpb25zLgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGU6PHVsPgotICogPGxpPntAbGluayAjYnVpbGRWYWx1ZSgpfTxwPgotICogICAgIHRvIHJldHVybiB0aGUgY3VycmVudCBwcm9wZXJ0eSB2YWx1ZSwgYXMgZGVyaXZlZCBmcm9tIHRoZQotICogICAgIGN1cnJlbnQgY29sbGVjdGlvbiB2YWx1ZQotICogPC91bD4KLSAqIFN1YmNsYXNzZXMgbWlnaHQgd2FudCB0byBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMKLSAqIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgKGJ5IG5vdCByZWNhbGN1bGF0aW5nIHRoZSB2YWx1ZSwgaWYgcG9zc2libGUpOjx1bD4KLSAqIDxsaT57QGxpbmsgI2l0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KX0KLSAqIDxsaT57QGxpbmsgI2l0ZW1zQWRkZWQoSXRlcmFibGUpfQotICogPGxpPntAbGluayAjaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCl9Ci0gKiA8bGk+e0BsaW5rICNpdGVtc1JlbW92ZWQoSXRlcmFibGUpfQotICogPGxpPntAbGluayAjY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpfQotICogPGxpPntAbGluayAjY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KX0KLSAqIDwvdWw+Ci0gKiAKLSAqIEBwYXJhbSA8Vj4gdGhlIHR5cGUgb2YgdGhlIG1vZGVsJ3MgdmFsdWUKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCdzIGVsZW1lbnRzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxWLCBFPgotCWV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFY+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uTW9kZWw7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jIHdpdGggY2hhbmdlcyB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgY29sbGVjdGlvbkxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGNvbGxlY3Rpb25Nb2RlbCkgewotCQlzdXBlcigpOwotCQlpZiAoY29sbGVjdGlvbk1vZGVsID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29sbGVjdGlvbk1vZGVsID0gY29sbGVjdGlvbk1vZGVsOwotCQl0aGlzLmNvbGxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29sbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25MaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIFN0cmFpZ2h0Zm9yd2FyZCBjYWxsYmFja3MgdG8gdGhlIGFkYXB0ZXIuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIENvbGxlY3Rpb25MaXN0ZW5lcgotCQlleHRlbmRzIENvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyCi0JewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJCUNvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNBZGRlZChldmVudCk7Ci0JCX0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBjb2xsZWN0aW9uIGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbF8oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbk1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuY29sbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Nb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmNvbGxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUl0ZXJhYmxlPEU+IGl0ZW1zID0gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCQl0aGlzLml0ZW1zQWRkZWQoaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlbXMgd2VyZSBhZGRlZCB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBJdGVyYWJsZTxFPiBpdGVtcykgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmFibGU8RT4gaXRlbXMgPSAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkKGl0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSXRlcmFibGU8RT4gaXRlbXMpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudCBpZiBuZWNlc3NhcnkKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlciB3YXMgY2xlYXJlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudCBpZiBuZWNlc3NhcnkKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBob2xkZXIgaGFzIGNoYW5nZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50IGlmIG5lY2Vzc2FyeQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNDE3YTEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgbmVlZGVkIHRvIHdyYXAKLSAqIGFub3RoZXIgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgcHJvcGFnYXRlCi0gKiBpdHMgY2hhbmdlIG5vdGlmaWNhdGlvbnMuIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGFwcHJvcHJpYXRlCi0gKiB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb25WYWx1ZU1vZGVsCi17Ci0JLyoqIFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luYyB3aXRoIGNoYW5nZXMgdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIgPSBjb2xsZWN0aW9uSG9sZGVyOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBYnN0cmFjdENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBoZWxwZXIgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0SXRlbXMoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBhZGRlZCB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyIHdhcyBjbGVhcmVkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlciBoYXMgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOGVmNDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5Db21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiBhZGFwdHMgYQotICoge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfSBob2xkaW5nIGJvb2xlYW4ge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH1zCi0gKiB0byBhIHNpbmdsZSBib29sZWFuIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9LiBUaGUgY29tcG9zaXRlIHZhbHVlIGlzCi0gKiBkZXRlcm1pbmVkIGJ5IHRoZSB7QGxpbmsgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbC5BZGFwdGVyfSBwcm92aWRlZAotICogYXQgY29uc3RydWN0aW9uLiBUeXBpY2FsbHkgdGhlIGNvbXBvc2l0ZSB3aWxsIGJlIGVpdGhlciBhbiBBTkQgb3IgYW4gT1Igb2YKLSAqIGFsbCB0aGUgYm9vbGVhbiB2YWx1ZXMuCi0gKiA8cD4KLSAqIElmIHRoZXJlIGFyZSA8ZW0+bm88L2VtPiBib29sZWFuIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9cywgdGhlIGNvbXBvc2l0ZQotICogd2lsbCByZXR1cm4gaXRzIGRlZmF1bHQgdmFsdWU7IHdoaWNoLCBieSBkZWZhdWx0LCBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gTm9uZSBvZiB0aGUgd3JhcHBlZCBib29sZWFuIG1vZGVscyBjYW4gcmV0dXJuIGEKLSAqIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlIG9yIHRoaXMgY2xhc3Mgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uIFRoZSBhc3N1bXB0aW9uCi0gKiBpcyB0aGF0IGFsbCB0aGUgd3JhcHBlZCBib29sZWFuIG1vZGVscyBhcmUgY29uZmlndXJlZCB3aXRoICJkZWZhdWx0IiB2YWx1ZXMKLSAqIHRoYXQgZGV0ZXJtaW5lIHRoZSBtb2RlbCdzIHZhbHVlIChUUlVFIG9yIEZBTFNFKSB3aGVuIDxjb2RlPm51bGw8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbAotCWV4dGVuZHMgQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIEJvb2xlYW4+Ci17Ci0JLyoqCi0JICogQ2FsY3VsYXRpb24gb2YgdGhlIG1vZGVsJ3MgdmFsdWUgaXMgZGVsZWdhdGVkIHRvIHRoaXMgYWRhcHRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQWRhcHRlciBhZGFwdGVyOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgdGhlIGNvbXBvc2l0ZSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsOwotCSAqIGZvciB3aGVuIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24gbW9kZWwgaXMgZW1wdHkuCi0JICogVGhlIGRlZmF1bHQgW2RlZmF1bHQgdmFsdWVdIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgZmluYWwgQm9vbGVhbiBkZWZhdWx0VmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogQU5EIGZhY3RvcnkgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgQU5EIG9mIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsczsgaS5lLiB0aGUgbW9kZWwncyB2YWx1ZSBpcyB0cnVlCi0JICogaWYgYWxsIHRoZSBjb250YWluZWQgbW9kZWxzIGFyZSB0cnVlLCBvdGhlcndpc2UgaXRzIHZhbHVlIGlzIGZhbHNlLgotCSAqIFRoZSBtb2RlbCdzIGRlZmF1bHQgdmFsdWUsIHdoZW4gaXQgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwgYW5kKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPi4uLiBhcnJheSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoQU5EX0FEQVBURVIsIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgQU5EIG9mIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsczsgaS5lLiB0aGUgbW9kZWwncyB2YWx1ZSBpcyB0cnVlCi0JICogaWYgYWxsIHRoZSBjb250YWluZWQgbW9kZWxzIGFyZSB0cnVlLCBvdGhlcndpc2UgaXRzIHZhbHVlIGlzIGZhbHNlLgotCSAqIFdoZW4gdGhlIG1vZGVsIGNvbnRhaW5zIG5vIG5lc3RlZCBtb2RlbHMsIGl0cyB2YWx1ZSB3aWxsIGJlIHRoZQotCSAqIHNwZWNpZmllZCBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbCBhbmQoQm9vbGVhbiBkZWZhdWx0VmFsdWUsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPi4uLiBhcnJheSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoQU5EX0FEQVBURVIsIGRlZmF1bHRWYWx1ZSwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBBTkQgb2YgdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzOyBpLmUuIHRoZSBtb2RlbCdzIHZhbHVlIGlzIHRydWUKLQkgKiBpZiBhbGwgdGhlIGNvbnRhaW5lZCBtb2RlbHMgYXJlIHRydWUsIG90aGVyd2lzZSBpdHMgdmFsdWUgaXMgZmFsc2UuCi0JICogVGhlIG1vZGVsJ3MgZGVmYXVsdCB2YWx1ZSwgd2hlbiBpdCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwgYW5kKENvbGxlY3Rpb248RT4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoQU5EX0FEQVBURVIsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBBTkQgb2YgdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzOyBpLmUuIHRoZSBtb2RlbCdzIHZhbHVlIGlzIHRydWUKLQkgKiBpZiBhbGwgdGhlIGNvbnRhaW5lZCBtb2RlbHMgYXJlIHRydWUsIG90aGVyd2lzZSBpdHMgdmFsdWUgaXMgZmFsc2UuCi0JICogV2hlbiB0aGUgbW9kZWwgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXRzIHZhbHVlIHdpbGwgYmUgdGhlCi0JICogc3BlY2lmaWVkIGRlZmF1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4gQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbCBhbmQoQm9vbGVhbiBkZWZhdWx0VmFsdWUsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoQU5EX0FEQVBURVIsIGRlZmF1bHRWYWx1ZSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIEFORCBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHM7IGkuZS4gdGhlIG1vZGVsJ3MgdmFsdWUgaXMgdHJ1ZQotCSAqIGlmIGFsbCB0aGUgY29udGFpbmVkIG1vZGVscyBhcmUgdHJ1ZSwgb3RoZXJ3aXNlIGl0cyB2YWx1ZSBpcyBmYWxzZS4KLQkgKiBUaGUgbW9kZWwncyBkZWZhdWx0IHZhbHVlLCB3aGVuIGl0IGNvbnRhaW5zIG5vIG5lc3RlZCBtb2RlbHMsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsIGFuZChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBjb2xsZWN0aW9uTW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKEFORF9BREFQVEVSLCBjb2xsZWN0aW9uTW9kZWwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBBTkQgb2YgdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzOyBpLmUuIHRoZSBtb2RlbCdzIHZhbHVlIGlzIHRydWUKLQkgKiBpZiBhbGwgdGhlIGNvbnRhaW5lZCBtb2RlbHMgYXJlIHRydWUsIG90aGVyd2lzZSBpdHMgdmFsdWUgaXMgZmFsc2UuCi0JICogV2hlbiB0aGUgbW9kZWwgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXRzIHZhbHVlIHdpbGwgYmUgdGhlCi0JICogc3BlY2lmaWVkIGRlZmF1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsIGFuZChCb29sZWFuIGRlZmF1bHRWYWx1ZSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4gY29sbGVjdGlvbk1vZGVsKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChBTkRfQURBUFRFUiwgZGVmYXVsdFZhbHVlLCBjb2xsZWN0aW9uTW9kZWwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPUiBmYWN0b3J5IG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIE9SIG9mIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsczsgaS5lLiB0aGUgbW9kZWwncyB2YWx1ZSBpcyBmYWxzZQotCSAqIGlmIGFsbCB0aGUgY29udGFpbmVkIG1vZGVscyBhcmUgZmFsc2UsIG90aGVyd2lzZSBpdHMgdmFsdWUgaXMgdHJ1ZS4KLQkgKiBUaGUgbW9kZWwncyBkZWZhdWx0IHZhbHVlLCB3aGVuIGl0IGNvbnRhaW5zIG5vIG5lc3RlZCBtb2RlbHMsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsIG9yKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPi4uLiBhcnJheSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoT1JfQURBUFRFUiwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBPUiBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHM7IGkuZS4gdGhlIG1vZGVsJ3MgdmFsdWUgaXMgZmFsc2UKLQkgKiBpZiBhbGwgdGhlIGNvbnRhaW5lZCBtb2RlbHMgYXJlIGZhbHNlLCBvdGhlcndpc2UgaXRzIHZhbHVlIGlzIHRydWUuCi0JICogV2hlbiB0aGUgbW9kZWwgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXRzIHZhbHVlIHdpbGwgYmUgdGhlCi0JICogc3BlY2lmaWVkIGRlZmF1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsIG9yKEJvb2xlYW4gZGVmYXVsdFZhbHVlLCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4uLi4gYXJyYXkpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKE9SX0FEQVBURVIsIGRlZmF1bHRWYWx1ZSwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBPUiBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHM7IGkuZS4gdGhlIG1vZGVsJ3MgdmFsdWUgaXMgZmFsc2UKLQkgKiBpZiBhbGwgdGhlIGNvbnRhaW5lZCBtb2RlbHMgYXJlIGZhbHNlLCBvdGhlcndpc2UgaXRzIHZhbHVlIGlzIHRydWUuCi0JICogVGhlIG1vZGVsJ3MgZGVmYXVsdCB2YWx1ZSwgd2hlbiBpdCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwgb3IoQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChPUl9BREFQVEVSLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgT1Igb2YgdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzOyBpLmUuIHRoZSBtb2RlbCdzIHZhbHVlIGlzIGZhbHNlCi0JICogaWYgYWxsIHRoZSBjb250YWluZWQgbW9kZWxzIGFyZSBmYWxzZSwgb3RoZXJ3aXNlIGl0cyB2YWx1ZSBpcyB0cnVlLgotCSAqIFdoZW4gdGhlIG1vZGVsIGNvbnRhaW5zIG5vIG5lc3RlZCBtb2RlbHMsIGl0cyB2YWx1ZSB3aWxsIGJlIHRoZQotCSAqIHNwZWNpZmllZCBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwgb3IoQm9vbGVhbiBkZWZhdWx0VmFsdWUsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoT1JfQURBUFRFUiwgZGVmYXVsdFZhbHVlLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgT1Igb2YgdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzOyBpLmUuIHRoZSBtb2RlbCdzIHZhbHVlIGlzIGZhbHNlCi0JICogaWYgYWxsIHRoZSBjb250YWluZWQgbW9kZWxzIGFyZSBmYWxzZSwgb3RoZXJ3aXNlIGl0cyB2YWx1ZSBpcyB0cnVlLgotCSAqIFRoZSBtb2RlbCdzIGRlZmF1bHQgdmFsdWUsIHdoZW4gaXQgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwgb3IoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4gY29sbGVjdGlvbk1vZGVsKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChPUl9BREFQVEVSLCBjb2xsZWN0aW9uTW9kZWwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBPUiBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHM7IGkuZS4gdGhlIG1vZGVsJ3MgdmFsdWUgaXMgZmFsc2UKLQkgKiBpZiBhbGwgdGhlIGNvbnRhaW5lZCBtb2RlbHMgYXJlIGZhbHNlLCBvdGhlcndpc2UgaXRzIHZhbHVlIGlzIHRydWUuCi0JICogV2hlbiB0aGUgbW9kZWwgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXRzIHZhbHVlIHdpbGwgYmUgdGhlCi0JICogc3BlY2lmaWVkIGRlZmF1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsIG9yKEJvb2xlYW4gZGVmYXVsdFZhbHVlLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBjb2xsZWN0aW9uTW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKE9SX0FEQVBURVIsIGRlZmF1bHRWYWx1ZSwgY29sbGVjdGlvbk1vZGVsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHMsIGFzIGRlZmluZWQgYnkgdGhlIHNwZWNpZmllZCBhZGFwdGVyLgotCSAqIFRoZSBtb2RlbCdzIGRlZmF1bHQgdmFsdWUsIHdoZW4gaXQgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChBZGFwdGVyIGFkYXB0ZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPi4uLiBhcnJheSkgewotCQl0aGlzKGFkYXB0ZXIsIG51bGwsIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgb2YgdGhlIHNwZWNpZmllZAotCSAqIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzLCBhcyBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpZWQgYWRhcHRlci4KLQkgKiBXaGVuIHRoZSBtb2RlbCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpdHMgdmFsdWUgd2lsbCBiZSB0aGUKLQkgKiBzcGVjaWZpZWQgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChBZGFwdGVyIGFkYXB0ZXIsIEJvb2xlYW4gZGVmYXVsdFZhbHVlLCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4uLi4gYXJyYXkpIHsKLQkJc3VwZXIoYXJyYXkpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgb2YgdGhlIHNwZWNpZmllZAotCSAqIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzLCBhcyBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpZWQgYWRhcHRlci4KLQkgKiBUaGUgbW9kZWwncyBkZWZhdWx0IHZhbHVlLCB3aGVuIGl0IGNvbnRhaW5zIG5vIG5lc3RlZCBtb2RlbHMsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIDxFIGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKEFkYXB0ZXIgYWRhcHRlciwgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKSB7Ci0JCXRoaXMoYWRhcHRlciwgbnVsbCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVscywgYXMgZGVmaW5lZCBieSB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIuCi0JICogV2hlbiB0aGUgbW9kZWwgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXRzIHZhbHVlIHdpbGwgYmUgdGhlCi0JICogc3BlY2lmaWVkIGRlZmF1bHQuCi0JICovCi0JcHVibGljIDxFIGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKEFkYXB0ZXIgYWRhcHRlciwgQm9vbGVhbiBkZWZhdWx0VmFsdWUsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbikgewotCQlzdXBlcihjb2xsZWN0aW9uKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVscywgYXMgZGVmaW5lZCBieSB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIuCi0JICogVGhlIG1vZGVsJ3MgZGVmYXVsdCB2YWx1ZSwgd2hlbiBpdCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKEFkYXB0ZXIgYWRhcHRlciwgQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4gY29sbGVjdGlvbk1vZGVsKSB7Ci0JCXRoaXMoYWRhcHRlciwgbnVsbCwgY29sbGVjdGlvbk1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgb2YgdGhlIHNwZWNpZmllZAotCSAqIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzLCBhcyBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpZWQgYWRhcHRlci4KLQkgKiBXaGVuIHRoZSBtb2RlbCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpdHMgdmFsdWUgd2lsbCBiZSB0aGUKLQkgKiBzcGVjaWZpZWQgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChBZGFwdGVyIGFkYXB0ZXIsIEJvb2xlYW4gZGVmYXVsdFZhbHVlLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBjb2xsZWN0aW9uTW9kZWwpIHsKLQkJc3VwZXIoY29sbGVjdGlvbk1vZGVsKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rICNkZWZhdWx0VmFsdWV9IGlmIHRoZSBjb2xsZWN0aW9uIGlzIGVtcHR5OwotCSAqIG90aGVyd2lzZSBkZWxlZ2F0ZSB0byB0aGUge0BsaW5rICNhZGFwdGVyfS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gKHRoaXMuY29sbGVjdGlvbk1vZGVsLnNpemUoKSA9PSAwKSA/IHRoaXMuZGVmYXVsdFZhbHVlIDogdGhpcy5idWlsZFZhbHVlXygpOwotCX0KLQotCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmJ1aWxkVmFsdWUodGhpcy5nZXRCb29sZWFucygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8Qm9vbGVhbj4gZ2V0Qm9vbGVhbnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEJvb2xlYW4+LCBCb29sZWFuPih0aGlzLmNvbGxlY3Rpb25Nb2RlbCwgQk9PTEVBTl9UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lcjxQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEJvb2xlYW4+LCBCb29sZWFuPiBCT09MRUFOX1RSQU5TRk9STUVSID0gbmV3IEJvb2xlYW5UcmFuc2Zvcm1lcigpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBCb29sZWFuVHJhbnNmb3JtZXIKLQkJaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEJvb2xlYW4+LCBCb29sZWFuPgotCXsKLQkJcHVibGljIEJvb2xlYW4gdHJhbnNmb3JtKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQm9vbGVhbj4gYm9vbGVhbk1vZGVsKSB7Ci0JCQlyZXR1cm4gYm9vbGVhbk1vZGVsLmdldFZhbHVlKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGFwdGVyICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgYWRhcHRlciBhbGxvd3MgdGhlIHtAbGluayBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsfSB0byBiZQotCSAqIHBsdWdnYWJsZS4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIEFkYXB0ZXIgewotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjb21wb3NpdGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24KLQkJICogb2YgYm9vbGVhbnMuCi0JCSAqLwotCQlCb29sZWFuIGJ1aWxkVmFsdWUoSXRlcmFibGU8Qm9vbGVhbj4gYm9vbGVhbnMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGwgdGhlIGJvb2xlYW5zIGFyZSA8Y29kZT50cnVlPC9jb2RlPjsKLQkgKiBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFkYXB0ZXIgQU5EX0FEQVBURVIgPSBuZXcgQWRhcHRlcigpIHsKLQkJcHVibGljIEJvb2xlYW4gYnVpbGRWYWx1ZShJdGVyYWJsZTxCb29sZWFuPiBib29sZWFucykgewotCQkJZm9yIChCb29sZWFuIGIgOiBib29sZWFucykgewotCQkJCWlmICggISBiLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkFORF9BREFQVEVSIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfTsKLQotCS8qKgotCSAqIFJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYWxsIHRoZSBib29sZWFucyBhcmUgPGNvZGU+ZmFsc2U8L2NvZGU+OwotCSAqIG90aGVyd2lzZSByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBZGFwdGVyIE9SX0FEQVBURVIgPSBuZXcgQWRhcHRlcigpIHsKLQkJcHVibGljIEJvb2xlYW4gYnVpbGRWYWx1ZShJdGVyYWJsZTxCb29sZWFuPiBib29sZWFucykgewotCQkJZm9yIChCb29sZWFuIGIgOiBib29sZWFucykgewotCQkJCWlmIChiLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIk9SX0FEQVBURVIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9OwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlOTc5NjIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5OdWxsTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9IGFuZCB1c2VzIGEge0BsaW5rIFRyYW5zZm9ybWVyfQotICogdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB0byB5ZXQgYW5vdGhlcgotICoge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfS4gVGhpcyBjb21wb3NpdGUgY29sbGVjdGlvbiBjb250YWlucwotICogdGhlIGNvbWJpbmVkIGl0ZW1zIGZyb20gYWxsIHRoZXNlIGNvbXBvbmVudCBjb2xsZWN0aW9ucy4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gVGhlIHdyYXBwZWQgY29sbGVjdGlvbiBtdXN0IGJlIGFuICJpZGVudGl0eSBzZXQiIHRoYXQgZG9lcyBub3QKLSAqIGNvbnRhaW4gdGhlIHNhbWUgaXRlbSB0d2ljZSBvciB0aGlzIGNsYXNzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgotICogPHA+Ci0gKiBUZXJtaW5vbG9neTo8dWw+Ci0gKiA8bGk+PGVtPnNvdXJjZXM8L2VtPiAtIHRoZSBpdGVtcyBpbiB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsOyB0aGVzZQotICogICAgYXJlIGNvbnZlcnRlZCBpbnRvIGNvbXBvbmVudCBDVk1zIGJ5IHRoZSB0cmFuc2Zvcm1lcgotICogPGxpPjxlbT5jb21wb25lbnQgQ1ZNczwvZW0+IC0gdGhlIGNvbXBvbmVudCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscyB0aGF0IGFyZSBjb21iaW5lZAotICogICAgYnkgdGhpcyBjb21wb3NpdGUgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbAotICogPGxpPjxlbT5pdGVtczwvZW0+IC0gdGhlIGl0ZW1zIGhlbGQgYnkgdGhlIGNvbXBvbmVudCBDVk1zCi0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8RTEsIEUyPgotCWV4dGVuZHMgQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyPEUxPgotCWltcGxlbWVudHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+Ci17Ci0JLyoqCi0JICogVGhpcyBpcyB0aGUgKG9wdGlvbmFsKSB1c2VyLXN1cHBsaWVkIG9iamVjdCB0aGF0IHRyYW5zZm9ybXMKLQkgKiB0aGUgaXRlbXMgaW4gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB0byBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWVyPEUxLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4+IHRyYW5zZm9ybWVyOwotCi0JLyoqCi0JICogQ2FjaGUgb2YgdGhlIGNvbXBvbmVudCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscyB0aGF0Ci0JICogd2VyZSBnZW5lcmF0ZWQgYnkgdGhlIHRyYW5zZm9ybWVyOyBrZXllZCBieSB0aGUgaXRlbQotCSAqIGluIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdGhhdCB3YXMgcGFzc2VkIHRvIHRoZSB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIElkZW50aXR5SGFzaE1hcDxFMSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+PiBjb21wb25lbnRDVk1zID0KLQkJCW5ldyBJZGVudGl0eUhhc2hNYXA8RTEsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPj4oKTsKLQotCS8qKgotCSAqIENhY2hlIG9mIHRoZSBjb2xsZWN0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb21wb25lbnQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscyBhYm92ZTsga2V5ZWQgYnkgdGhlIGNvbXBvbmVudAotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzLgotCSAqIFVzZSB7QGxpbmsgQXJyYXlMaXN0fXMgc28gd2UgY2FuIHVzZSB7QGxpbmsgQXJyYXlMaXN0fS1zcGVjaWZpYyBtZXRob2RzCi0JICogKGUuZy4ge0BsaW5rIEFycmF5TGlzdCNjbG9uZSgpfSBhbmQge0BsaW5rIEFycmF5TGlzdCNlbnN1cmVDYXBhY2l0eShpbnQpfSkuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBJZGVudGl0eUhhc2hNYXA8Q29sbGVjdGlvblZhbHVlTW9kZWw8RTI+LCBBcnJheUxpc3Q8RTI+PiBjb2xsZWN0aW9ucyA9Ci0JCQluZXcgSWRlbnRpdHlIYXNoTWFwPENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPiwgQXJyYXlMaXN0PEUyPj4oKTsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBjb21wb25lbnQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMuICovCi0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgY29tcG9uZW50Q1ZNTGlzdGVuZXI7Ci0KLQkvKiogQ2FjaGUgdGhlIHNpemUgb2YgdGhlIGNvbXBvc2l0ZSBjb2xsZWN0aW9uLiAqLwotCXByaXZhdGUgaW50IHNpemU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZjx1bD4KLQkgKiA8bGk+IHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgYWxyZWFkeSBjb250YWlucyBvdGhlcgotCSAqICAgICAgIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzLCBvcgotCSAqIDxsaT4geW91IHdhbnQgdG8gb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KSB0cmFuc2Zvcm0oRTEpfQotCSAqICAgICAgIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXRoaXMoY29sbGVjdGlvbkhvbGRlciwgVHJhbnNmb3JtZXIuTnVsbC48RTEsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPj5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gY29sbGVjdGlvbkhvbGRlciwgVHJhbnNmb3JtZXI8RTEsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXIpIHsKLQkJc3VwZXIoY29sbGVjdGlvbkhvbGRlcik7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQkJdGhpcy5jb21wb25lbnRDVk1MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb21wb25lbnRMaXN0ZW5lcigpOwotCQl0aGlzLnNpemUgPSAwOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsLiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZjx1bD4KLQkgKiA8bGk+IHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgYWxyZWFkeSBjb250YWlucyBvdGhlcgotCSAqICAgICAgIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzLCBvcgotCSAqIDxsaT4geW91IHdhbnQgdG8gb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KSB0cmFuc2Zvcm0oRTEpfQotCSAqICAgICAgIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsaXN0SG9sZGVyKSB7Ci0JCXRoaXMobmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RTE+KGxpc3RIb2xkZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogbGlzdCB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gbGlzdEhvbGRlciwgVHJhbnNmb3JtZXI8RTEsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcyhuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFMT4obGlzdEhvbGRlciksIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCwgdW5jaGFuZ2luZywgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24uIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmPHVsPgotCSAqIDxsaT4gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbHJlYWR5IGNvbnRhaW5zIG90aGVyCi0JICogICAgICAgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMsIG9yCi0JICogPGxpPiB5b3Ugd2FudCB0byBvdmVycmlkZSB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpIHRyYW5zZm9ybShFMSl9Ci0JICogICAgICAgaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFMT4gY29sbGVjdGlvbikgewotCQl0aGlzKG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMT4oY29sbGVjdGlvbikpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkLCB1bmNoYW5naW5nLCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsKENvbGxlY3Rpb248PyBleHRlbmRzIEUxPiBjb2xsZWN0aW9uLCBUcmFuc2Zvcm1lcjxFMSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+PiB0cmFuc2Zvcm1lcikgewotCQl0aGlzKG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMT4oY29sbGVjdGlvbiksIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCwgdW5jaGFuZ2luZywgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24uIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmPHVsPgotCSAqIDxsaT4gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbHJlYWR5IGNvbnRhaW5zIG90aGVyCi0JICogICAgICAgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMsIG9yCi0JICogPGxpPiB5b3Ugd2FudCB0byBvdmVycmlkZSB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpIHRyYW5zZm9ybShFMSl9Ci0JICogICAgICAgaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbChFMS4uLiBjb2xsZWN0aW9uKSB7Ci0JCXRoaXMobmV3IFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsPEUxPihjb2xsZWN0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQsIHVuY2hhbmdpbmcsIHdyYXBwZWQKLQkgKiBjb2xsZWN0aW9uIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwoRTFbXSBjb2xsZWN0aW9uLCBUcmFuc2Zvcm1lcjxFMSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+PiB0cmFuc2Zvcm1lcikgewotCQl0aGlzKG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMT4oY29sbGVjdGlvbiksIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbXBvbmVudExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRJdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0JCQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLnRoaXMuY29tcG9uZW50SXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRDb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbC50aGlzLmNvbXBvbmVudENvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbXBvbmVudCBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEUyPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxFMj4odGhpcy5idWlsZENvbGxlY3Rpb25zSXRlcmF0b3JzKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxJdGVyYXRvcjxFMj4+IGJ1aWxkQ29sbGVjdGlvbnNJdGVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxBcnJheUxpc3Q8RTI+LCBJdGVyYXRvcjxFMj4+KHRoaXMuY29sbGVjdGlvbnMudmFsdWVzKCkuaXRlcmF0b3IoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8RTI+IHRyYW5zZm9ybShBcnJheUxpc3Q8RTI+IG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5pdGVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyIG92ZXJyaWRlcy9pbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJLy8gc3luYyBvdXIgY2FjaGUgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy5hZGRBbGxDb21wb25lbnRTb3VyY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIGFsbCB0aGUgc291cmNlcyB0byBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscwotCSAqIGFuZCBhZGQgdGhlaXIgaXRlbXMgdG8gb3VyIGNhY2hlLCB3aXRoIG5vIGV2ZW50IG5vdGlmaWNhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbGxDb21wb25lbnRTb3VyY2VzKCkgewotCQlmb3IgKEUxIHNvdXJjZSA6IHRoaXMuY29sbGVjdGlvbkhvbGRlcikgewotCQkJdGhpcy5hZGRDb21wb25lbnRTb3VyY2Uoc291cmNlLCBOdWxsTGlzdC48RTI+aW5zdGFuY2UoKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQkJLy8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGNvbXBvbmVudHMuLi4KLQkJZm9yIChDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4gY29tcG9uZW50Q1ZNIDogdGhpcy5jb21wb25lbnRDVk1zLnZhbHVlcygpKSB7Ci0JCQljb21wb25lbnRDVk0ucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFZBTFVFUywgdGhpcy5jb21wb25lbnRDVk1MaXN0ZW5lcik7Ci0JCX0KLQkJLy8gLi4uYW5kIGNsZWFyIHRoZSBjYWNoZQotCQl0aGlzLmNvbXBvbmVudENWTXMuY2xlYXIoKTsKLQkJdGhpcy5jb2xsZWN0aW9ucy5jbGVhcigpOwotCQl0aGlzLnNpemUgPSAwOwotCX0KLQotCS8qKgotCSAqIFNvbWUgY29tcG9uZW50IHNvdXJjZXMgd2VyZSBhZGRlZDsKLQkgKiBhZGQgdGhlaXIgY29ycmVzcG9uZGluZyBpdGVtcyB0byBvdXIgY2FjaGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJQXJyYXlMaXN0PEUyPiBhZGRlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFMj4oKTsKLQkJZm9yIChFMSBpdGVtIDogdGhpcy5nZXRJdGVtcyhldmVudCkpIHsKLQkJCXRoaXMuYWRkQ29tcG9uZW50U291cmNlKGl0ZW0sIGFkZGVkSXRlbXMpOwotCQl9Ci0JCXRoaXMuZmlyZUl0ZW1zQWRkZWQoVkFMVUVTLCBhZGRlZEl0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBzb3VyY2UgdG8gYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsCi0JICogYW5kIGFkZCBpdHMgaXRlbXMgdG8gb3VyIGNhY2hlIGFuZCB0aGUgImNvbGxlY3RpbmcgcGFyYW1ldGVyIi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb21wb25lbnRTb3VyY2UoRTEgc291cmNlLCBMaXN0PEUyPiBhZGRlZEl0ZW1zKSB7Ci0JCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPiBjb21wb25lbnRDVk0gPSB0aGlzLnRyYW5zZm9ybShzb3VyY2UpOwotCQlpZiAodGhpcy5jb21wb25lbnRDVk1zLnB1dChzb3VyY2UsIGNvbXBvbmVudENWTSkgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZHVwbGljYXRlIGNvbXBvbmVudDogIiArIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljb21wb25lbnRDVk0uYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFZBTFVFUywgdGhpcy5jb21wb25lbnRDVk1MaXN0ZW5lcik7Ci0JCUFycmF5TGlzdDxFMj4gY29tcG9uZW50Q29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8RTI+KGNvbXBvbmVudENWTS5zaXplKCkpOwotCQlpZiAodGhpcy5jb2xsZWN0aW9ucy5wdXQoY29tcG9uZW50Q1ZNLCBjb21wb25lbnRDb2xsZWN0aW9uKSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkdXBsaWNhdGUgY29sbGVjdGlvbjogIiArIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmFkZENvbXBvbmVudEl0ZW1zKGNvbXBvbmVudENWTSwgY29tcG9uZW50Q29sbGVjdGlvbik7Ci0JCWFkZGVkSXRlbXMuYWRkQWxsKGNvbXBvbmVudENvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBjb21wb25lbnQgQ1ZNIHRvIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50Ci0JICogY29sbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb21wb25lbnRJdGVtcyhDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4gY29tcG9uZW50Q1ZNLCBBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24pIHsKLQkJaW50IGl0ZW1zU2l6ZSA9IGNvbXBvbmVudENWTS5zaXplKCk7Ci0JCXRoaXMuc2l6ZSArPSBpdGVtc1NpemU7Ci0JCWNvbXBvbmVudENvbGxlY3Rpb24uZW5zdXJlQ2FwYWNpdHkoY29tcG9uZW50Q29sbGVjdGlvbi5zaXplKCkgKyBpdGVtc1NpemUpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGNvbXBvbmVudENvbGxlY3Rpb24sIGNvbXBvbmVudENWTSk7Ci0JfQotCi0JLyoqCi0JICogU29tZSBjb21wb25lbnQgc291cmNlcyB3ZXJlIHJlbW92ZWQ7Ci0JICogcmVtb3ZlIHRoZWlyIGNvcnJlc3BvbmRpbmcgaXRlbXMgZnJvbSBvdXIgY2FjaGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlBcnJheUxpc3Q8RTI+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KCk7Ci0JCWZvciAoRTEgaXRlbSA6IHRoaXMuZ2V0SXRlbXMoZXZlbnQpKSB7Ci0JCQl0aGlzLnJlbW92ZUNvbXBvbmVudFNvdXJjZShpdGVtLCByZW1vdmVkSXRlbXMpOwotCQl9Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChWQUxVRVMsIHJlbW92ZWRJdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBpdGVtcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogZnJvbSBvdXIgY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ29tcG9uZW50U291cmNlKEUxIHNvdXJjZSwgTGlzdDxFMj4gcmVtb3ZlZEl0ZW1zKSB7Ci0JCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPiBjb21wb25lbnRDVk0gPSB0aGlzLmNvbXBvbmVudENWTXMucmVtb3ZlKHNvdXJjZSk7Ci0JCWlmIChjb21wb25lbnRDVk0gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibWlzc2luZyBjb21wb25lbnQ6ICIgKyBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY29tcG9uZW50Q1ZNLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihWQUxVRVMsIHRoaXMuY29tcG9uZW50Q1ZNTGlzdGVuZXIpOwotCQlBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb25zLnJlbW92ZShjb21wb25lbnRDVk0pOwotCQlpZiAoY29tcG9uZW50Q29sbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtaXNzaW5nIGNvbGxlY3Rpb246ICIgKyBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmVtb3ZlZEl0ZW1zLmFkZEFsbChjb21wb25lbnRDb2xsZWN0aW9uKTsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRJdGVtcyhjb21wb25lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgb3VyIHNpemUgYW5kIGNvbGxlY3Rpb24gY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ29tcG9uZW50SXRlbXMoQXJyYXlMaXN0PEUyPiBjb21wb25lbnRDb2xsZWN0aW9uKSB7Ci0JCXRoaXMuc2l6ZSAtPSBjb21wb25lbnRDb2xsZWN0aW9uLnNpemUoKTsKLQkJY29tcG9uZW50Q29sbGVjdGlvbi5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb21wb25lbnQgc291cmNlcyBjbGVhcmVkOwotCSAqIGNsZWFyIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUFsbENvbXBvbmVudFNvdXJjZXMoKTsKLQkJdGhpcy5maXJlQ29sbGVjdGlvbkNsZWFyZWQoVkFMVUVTKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbGxDb21wb25lbnRTb3VyY2VzKCkgewotCQkvLyBjb3B5IHRoZSBrZXlzIHNvIHdlIGRvbid0IGVhdCBvdXIgb3duIHRhaWwKLQkJQXJyYXlMaXN0PEUxPiBjb3B5ID0gbmV3IEFycmF5TGlzdDxFMT4odGhpcy5jb21wb25lbnRDVk1zLmtleVNldCgpKTsKLQkJZm9yIChFMSBzb3VyY2UgOiBjb3B5KSB7Ci0JCQl0aGlzLnJlbW92ZUNvbXBvbmVudFNvdXJjZShzb3VyY2UsIE51bGxMaXN0LjxFMj5pbnN0YW5jZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBjb21wb25lbnQgc291cmNlcyBjaGFuZ2VkOwotCSAqIHJlYnVpbGQgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUFsbENvbXBvbmVudFNvdXJjZXMoKTsKLQkJdGhpcy5hZGRBbGxDb21wb25lbnRTb3VyY2VzKCk7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5pdGVyYXRvcigpKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGludG8gYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPiB0cmFuc2Zvcm0oRTEgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXIudHJhbnNmb3JtKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIGNvbXBvbmVudCBjb2xsZWN0aW9ucyBoYWQgaXRlbXMgYWRkZWQ7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wb25lbnRJdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlpbnQgaXRlbXNTaXplID0gZXZlbnQuZ2V0SXRlbXNTaXplKCk7Ci0JCXRoaXMuc2l6ZSArPSBpdGVtc1NpemU7Ci0KLQkJQXJyYXlMaXN0PEUyPiBjb21wb25lbnRDb2xsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9ucy5nZXQodGhpcy5jb21wb25lbnRDVk0oZXZlbnQpKTsKLQkJY29tcG9uZW50Q29sbGVjdGlvbi5lbnN1cmVDYXBhY2l0eShjb21wb25lbnRDb2xsZWN0aW9uLnNpemUoKSArIGl0ZW1zU2l6ZSk7Ci0KLQkJdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbih0aGlzLmdldENvbXBvbmVudEl0ZW1zKGV2ZW50KSwgY29tcG9uZW50Q29sbGVjdGlvbiwgVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIGNvbXBvbmVudCBjb2xsZWN0aW9ucyBoYWQgaXRlbXMgcmVtb3ZlZDsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudEl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zaXplIC09IGV2ZW50LmdldEl0ZW1zU2l6ZSgpOwotCQlBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb25zLmdldCh0aGlzLmNvbXBvbmVudENWTShldmVudCkpOwotCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24odGhpcy5nZXRDb21wb25lbnRJdGVtcyhldmVudCksIGNvbXBvbmVudENvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogT25lIG9mIHRoZSBjb21wb25lbnQgY29sbGVjdGlvbnMgd2FzIGNsZWFyZWQ7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlcyBieSBjbGVhcmluZyBvdXQgdGhlIGFwcHJvcHJpYXRlCi0JICogY29sbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wb25lbnRDb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQlBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb25zLmdldCh0aGlzLmNvbXBvbmVudENWTShldmVudCkpOwotCQlBcnJheUxpc3Q8RTI+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KGNvbXBvbmVudENvbGxlY3Rpb24pOwotCQl0aGlzLnJlbW92ZUNvbXBvbmVudEl0ZW1zKGNvbXBvbmVudENvbGxlY3Rpb24pOwotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoVkFMVUVTLCByZW1vdmVkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgY29tcG9uZW50IGNvbGxlY3Rpb25zIGNoYW5nZWQ7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlcyBieSBjbGVhcmluZyBvdXQgdGhlIGFwcHJvcHJpYXRlCi0JICogY29sbGVjdGlvbiBhbmQgdGhlbiByZWJ1aWxkaW5nIGl0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudENvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4gY29tcG9uZW50Q1ZNID0gdGhpcy5jb21wb25lbnRDVk0oZXZlbnQpOwotCQlBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb25zLmdldChjb21wb25lbnRDVk0pOwotCQl0aGlzLnJlbW92ZUNvbXBvbmVudEl0ZW1zKGNvbXBvbmVudENvbGxlY3Rpb24pOwotCQl0aGlzLmFkZENvbXBvbmVudEl0ZW1zKGNvbXBvbmVudENWTSwgY29tcG9uZW50Q29sbGVjdGlvbik7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5pdGVyYXRvcigpKSk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFMj4gZ2V0Q29tcG9uZW50SXRlbXMoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RTI+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RTI+IGdldENvbXBvbmVudEl0ZW1zKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEUyPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPiBjb21wb25lbnRDVk0oQ29sbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+KSBldmVudC5nZXRTb3VyY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVMaXN0VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZlMDRjNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVMaXN0VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTI0IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgPGNvZGU+Q29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIHtAbGluayBMaXN0VmFsdWVNb2RlbH0gYW5kIHVzZXMgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0gKiB0byBjb252ZXJ0IGVhY2ggaXRlbSBpbiB0aGUgd3JhcHBlZCBsaXN0IHRvIHlldCBhbm90aGVyCi0gKiB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9LiBUaGlzIGNvbXBvc2l0ZSBsaXN0IGNvbnRhaW5zCi0gKiB0aGUgY29tYmluZWQgaXRlbXMgZnJvbSBhbGwgdGhlc2UgY29tcG9uZW50IGxpc3RzLgotICogPHA+Ci0gKiBUZXJtaW5vbG9neTo8dWw+Ci0gKiA8bGk+PGVtPnNvdXJjZXM8L2VtPiAtIHRoZSBpdGVtcyBpbiB0aGUgd3JhcHBlZCBsaXN0IHZhbHVlIG1vZGVsOyB0aGVzZQotICogICAgYXJlIGNvbnZlcnRlZCBpbnRvIGNvbXBvbmVudCBMVk1zIGJ5IHRoZSB0cmFuc2Zvcm1lcgotICogPGxpPjxlbT5jb21wb25lbnQgTFZNczwvZW0+IC0gdGhlIGNvbXBvbmVudCBsaXN0IHZhbHVlIG1vZGVscyB0aGF0IGFyZSBjb21iaW5lZAotICogICAgYnkgdGhpcyBjb21wb3NpdGUgbGlzdCB2YWx1ZSBtb2RlbAotICogPGxpPjxlbT5pdGVtczwvZW0+IC0gdGhlIGl0ZW1zIGhlbGQgYnkgdGhlIGNvbXBvbmVudCBMVk1zCi0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8RTEsIEUyPgotCWV4dGVuZHMgTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEUxPgotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RTI+Ci17Ci0JLyoqCi0JICogVGhpcyBpcyB0aGUgKG9wdGlvbmFsKSB1c2VyLXN1cHBsaWVkIG9iamVjdCB0aGF0IHRyYW5zZm9ybXMKLQkgKiB0aGUgaXRlbXMgaW4gdGhlIHdyYXBwZWQgbGlzdCB0byBsaXN0IHZhbHVlIG1vZGVscy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWVyPEUxLCBMaXN0VmFsdWVNb2RlbDxFMj4+IHRyYW5zZm9ybWVyOwotCi0JLyoqCi0JICogQ2FjaGUgb2YgdGhlIHNvdXJjZXMsIGNvbXBvbmVudCBMVk1zLCBsaXN0cy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJbmZvPiBpbmZvTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW5mbz4oKTsKLQlwcm90ZWN0ZWQgY2xhc3MgSW5mbyB7Ci0JCS8vIHRoZSBvYmplY3QgcGFzc2VkIHRvIHRoZSB0cmFuc2Zvcm1lcgotCQlmaW5hbCBFMSBzb3VyY2U7Ci0JCS8vIHRoZSBsaXN0IHZhbHVlIG1vZGVsIGdlbmVyYXRlZCBieSB0aGUgdHJhbnNmb3JtZXIKLQkJZmluYWwgTGlzdFZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudExWTTsKLQkJLy8gY2FjaGUgb2YgdGhlIGl0ZW1zIGhlbGQgYnkgdGhlIGNvbXBvbmVudCBMVk0KLQkJZmluYWwgQXJyYXlMaXN0PEUyPiBpdGVtczsKLQkJLy8gdGhlIGNvbXBvbmVudCBMVk0ncyBiZWdpbm5pbmcgaW5kZXggd2l0aGluIHRoZSBjb21wb3NpdGUgTFZNCi0JCWludCBiZWdpbjsKLQkJcHJvdGVjdGVkIEluZm8oRTEgc291cmNlLCBMaXN0VmFsdWVNb2RlbDxFMj4gY29tcG9uZW50TFZNLCBBcnJheUxpc3Q8RTI+IGl0ZW1zLCBpbnQgYmVnaW4pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQkJCXRoaXMuY29tcG9uZW50TFZNID0gY29tcG9uZW50TFZNOwotCQkJdGhpcy5pdGVtcyA9IGl0ZW1zOwotCQkJdGhpcy5iZWdpbiA9IGJlZ2luOwotCQl9Ci0JfQotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdGhlIGNvbXBvbmVudCBsaXN0IHZhbHVlIG1vZGVscy4gKi8KLQlwcml2YXRlIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBjb21wb25lbnRMVk1MaXN0ZW5lcjsKLQotCS8qKiBDYWNoZSB0aGUgc2l6ZSBvZiB0aGUgY29tcG9zaXRlIGxpc3QuICovCi0JcHJpdmF0ZSBpbnQgc2l6ZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGxpc3QgdmFsdWUgbW9kZWwuIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmPHVsPgotCSAqIDxsaT4gdGhlIHdyYXBwZWQgbGlzdCB2YWx1ZSBtb2RlbCBhbHJlYWR5IGNvbnRhaW5zIG90aGVyCi0JICogICAgICAgbGlzdCB2YWx1ZSBtb2RlbHMsIG9yCi0JICogPGxpPiB5b3Ugd2FudCB0byBvdmVycmlkZSB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpIHRyYW5zZm9ybShFMSl9Ci0JICogICAgICAgaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbChMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRTE+IGxpc3RIb2xkZXIpIHsKLQkJdGhpcyhsaXN0SG9sZGVyLCBUcmFuc2Zvcm1lci5OdWxsLjxFMSwgTGlzdFZhbHVlTW9kZWw8RTI+Pmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsaXN0SG9sZGVyLCBUcmFuc2Zvcm1lcjxFMSwgTGlzdFZhbHVlTW9kZWw8RTI+PiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotCQl0aGlzLmNvbXBvbmVudExWTUxpc3RlbmVyID0gdGhpcy5idWlsZENvbXBvbmVudExWTUxpc3RlbmVyKCk7Ci0JCXRoaXMuc2l6ZSA9IDA7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQsIHVuY2hhbmdpbmcsIHdyYXBwZWQKLQkgKiBsaXN0LiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZjx1bD4KLQkgKiA8bGk+IHRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWwgYWxyZWFkeSBjb250YWlucyBvdGhlcgotCSAqICAgICAgIGxpc3QgdmFsdWUgbW9kZWxzLCBvcgotCSAqIDxsaT4geW91IHdhbnQgdG8gb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KSB0cmFuc2Zvcm0oRTEpfQotCSAqICAgICAgIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwoTGlzdDw/IGV4dGVuZHMgRTE+IGxpc3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8RTE+KGxpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCwgdW5jaGFuZ2luZywgd3JhcHBlZAotCSAqIGxpc3QgYW5kIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbChMaXN0PD8gZXh0ZW5kcyBFMT4gbGlzdCwgVHJhbnNmb3JtZXI8RTEsIExpc3RWYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcyhuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8RTE+KGxpc3QpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQsIHVuY2hhbmdpbmcsIHdyYXBwZWQKLQkgKiBsaXN0LiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZjx1bD4KLQkgKiA8bGk+IHRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWwgYWxyZWFkeSBjb250YWlucyBvdGhlcgotCSAqICAgICAgIGxpc3QgdmFsdWUgbW9kZWxzLCBvcgotCSAqIDxsaT4geW91IHdhbnQgdG8gb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KSB0cmFuc2Zvcm0oRTEpfQotCSAqICAgICAgIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwoRTEuLi4gbGlzdCkgewotCQl0aGlzKG5ldyBTdGF0aWNMaXN0VmFsdWVNb2RlbDxFMT4obGlzdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkLCB1bmNoYW5naW5nLCB3cmFwcGVkCi0JICogbGlzdCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsKEUxW10gbGlzdCwgVHJhbnNmb3JtZXI8RTEsIExpc3RWYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcyhuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8RTE+KGxpc3QpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRDb21wb25lbnRMVk1MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsLnRoaXMuY29tcG9uZW50SXRlbXNBZGRlZChldmVudCk7Ci0JCQl9CQkKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21wb3NpdGVMaXN0VmFsdWVNb2RlbC50aGlzLmNvbXBvbmVudEl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21wb3NpdGVMaXN0VmFsdWVNb2RlbC50aGlzLmNvbXBvbmVudEl0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRJdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRMaXN0Q2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21wb3NpdGVMaXN0VmFsdWVNb2RlbC50aGlzLmNvbXBvbmVudExpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbXBvbmVudCBMVk0gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBFMiBnZXQoaW50IGluZGV4KSB7Ci0JCWlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gdGhpcy5zaXplKSkgewotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkluZGV4OiAiICsgaW5kZXggKyAiLCBTaXplOiAiICsgdGhpcy5zaXplKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgaW5mbyBsaXN0Ci0JCWZvciAoaW50IGkgPSB0aGlzLmluZm9MaXN0LnNpemUoKTsgaS0tID4gMDsgKSB7Ci0JCQlJbmZvIGluZm8gPSB0aGlzLmluZm9MaXN0LmdldChpKTsKLQkJCWlmIChpbmRleCA+PSBpbmZvLmJlZ2luKSB7Ci0JCQkJcmV0dXJuIGluZm8uaXRlbXMuZ2V0KGluZGV4IC0gaW5mby5iZWdpbik7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOyAgLy8gc29tZXRoaW5nIGlzIHdhY2sKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RTI+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEUyPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I8RTI+KHRoaXMuYnVpbGRMaXN0c0l0ZXJhdG9ycygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPExpc3RJdGVyYXRvcjxFMj4+IGJ1aWxkTGlzdHNJdGVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8SW5mbywgTGlzdEl0ZXJhdG9yPEUyPj4odGhpcy5pbmZvTGlzdC5saXN0SXRlcmF0b3IoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEUyPiB0cmFuc2Zvcm0oSW5mbyBpbmZvKSB7Ci0JCQkJcmV0dXJuIGluZm8uaXRlbXMubGlzdEl0ZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5zaXplOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gQXJyYXlUb29scy5hcnJheSh0aGlzLmxpc3RJdGVyYXRvcigpLCB0aGlzLnNpemUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbFdyYXBwZXIgb3ZlcnJpZGVzL2ltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQkvLyBzeW5jIG91ciBjYWNoZSAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgd3JhcHBlZCBsaXN0LAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLmFkZENvbXBvbmVudFNvdXJjZXMoMCwgdGhpcy5saXN0SG9sZGVyLCB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpLCBmYWxzZSk7ICAvLyBmYWxzZSA9IGRvIG5vdCBmaXJlIGV2ZW50Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCS8vIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBjb21wb25lbnQgTFZNcy4uLgotCQlmb3IgKEluZm8gaW5mbyA6IHRoaXMuaW5mb0xpc3QpIHsKLQkJCWluZm8uY29tcG9uZW50TFZNLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX1ZBTFVFUywgdGhpcy5jb21wb25lbnRMVk1MaXN0ZW5lcik7Ci0JCX0KLQkJLy8gLi4uYW5kIGNsZWFyIHRoZSBjYWNoZQotCQl0aGlzLmluZm9MaXN0LmNsZWFyKCk7Ci0JCXRoaXMuc2l6ZSA9IDA7Ci0JfQotCi0JLyoqCi0JICogU29tZSBjb21wb25lbnQgc291cmNlcyB3ZXJlIGFkZGVkOyB1cGRhdGUgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuYWRkQ29tcG9uZW50U291cmNlcyhldmVudC5nZXRJbmRleCgpLCB0aGlzLmdldEl0ZW1zKGV2ZW50KSwgZXZlbnQuZ2V0SXRlbXNTaXplKCksIHRydWUpOyAgLy8gdHJ1ZSA9IGZpcmUgZXZlbnQKLQl9Ci0KLQkvKioKLQkgKiBBZGQgaW5mb3MgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIHNvdXJjZXMgdG8gb3VyIGNhY2hlLgotCSAqIEZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIHJlcXVlc3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb21wb25lbnRTb3VyY2VzKGludCBhZGRlZFNvdXJjZXNJbmRleCwgSXRlcmFibGU8PyBleHRlbmRzIEUxPiBhZGRlZFNvdXJjZXMsIGludCBhZGRlZFNvdXJjZXNTaXplLCBib29sZWFuIGZpcmVFdmVudCkgewotCQlBcnJheUxpc3Q8SW5mbz4gbmV3SW5mb0xpc3QgPSBuZXcgQXJyYXlMaXN0PEluZm8+KGFkZGVkU291cmNlc1NpemUpOwotCQkvLyB0aGUgJ2l0ZW1zJyBhcmUgZWl0aGVyIHRhY2tlZCBvbiB0byB0aGUgZW5kIG9yCi0JCS8vIGF0IHRoZSAnYmVnaW4nIGluZGV4IG9mIHRoZSBmaXJzdCAnaW5mbycgdGhhdCBpcyBiZWluZyBwdXNoZWQgYmFjawotCQlpbnQgbmV3SXRlbXNJbmRleCA9IChhZGRlZFNvdXJjZXNJbmRleCA9PSB0aGlzLmluZm9MaXN0LnNpemUoKSkgPyB0aGlzLnNpemUgOiB0aGlzLmluZm9MaXN0LmdldChhZGRlZFNvdXJjZXNJbmRleCkuYmVnaW47Ci0KLQkJaW50IGJlZ2luID0gbmV3SXRlbXNJbmRleDsKLQkJZm9yIChFMSBzb3VyY2UgOiBhZGRlZFNvdXJjZXMpIHsKLQkJCUxpc3RWYWx1ZU1vZGVsPEUyPiBjb21wb25lbnRMVk0gPSB0aGlzLnRyYW5zZm9ybShzb3VyY2UpOwotCQkJY29tcG9uZW50TFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX1ZBTFVFUywgdGhpcy5jb21wb25lbnRMVk1MaXN0ZW5lcik7Ci0JCQlBcnJheUxpc3Q8RTI+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDxFMj4oY29tcG9uZW50TFZNLnNpemUoKSk7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGl0ZW1zLCBjb21wb25lbnRMVk0ubGlzdEl0ZXJhdG9yKCkpOwotCQkJbmV3SW5mb0xpc3QuYWRkKG5ldyBJbmZvKHNvdXJjZSwgY29tcG9uZW50TFZNLCBpdGVtcywgYmVnaW4pKTsKLQkJCWJlZ2luICs9IGl0ZW1zLnNpemUoKTsKLQkJfQotCQl0aGlzLmluZm9MaXN0LmFkZEFsbChhZGRlZFNvdXJjZXNJbmRleCwgbmV3SW5mb0xpc3QpOwotCQlpbnQgbmV3SXRlbXNTaXplID0gYmVnaW4gLSBuZXdJdGVtc0luZGV4OwotCQl0aGlzLnNpemUgKz0gbmV3SXRlbXNTaXplOwotCi0JCS8vIGJ1bXAgdGhlICdiZWdpbicgaW5kZXggZm9yIGFsbCB0aGUgaW5mb3MgdGhhdCB3ZXJlIHB1c2hlZCBiYWNrIGJ5IHRoZSBpbnNlcnQKLQkJaW50IG1vdmVkSW5mb3NJbmRleCA9IGFkZGVkU291cmNlc0luZGV4ICsgYWRkZWRTb3VyY2VzU2l6ZTsKLQkJZm9yIChpbnQgaSA9IG1vdmVkSW5mb3NJbmRleDsgaSA8IHRoaXMuaW5mb0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCXRoaXMuaW5mb0xpc3QuZ2V0KGkpLmJlZ2luICs9IG5ld0l0ZW1zU2l6ZTsKLQkJfQotCi0JCWlmIChmaXJlRXZlbnQpIHsKLQkJCUFycmF5TGlzdDxFMj4gbmV3SXRlbXMgPSBuZXcgQXJyYXlMaXN0PEUyPihuZXdJdGVtc1NpemUpOwotCQkJZm9yIChpbnQgaSA9IGFkZGVkU291cmNlc0luZGV4OyBpIDwgbW92ZWRJbmZvc0luZGV4OyBpKyspIHsKLQkJCQluZXdJdGVtcy5hZGRBbGwodGhpcy5pbmZvTGlzdC5nZXQoaSkuaXRlbXMpOwotCQkJfQotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChMSVNUX1ZBTFVFUywgbmV3SXRlbXNJbmRleCwgbmV3SXRlbXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU29tZSBjb21wb25lbnQgc291cmNlcyB3ZXJlIHJlbW92ZWQ7IHVwZGF0ZSBvdXIgY2FjaGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUNvbXBvbmVudFNvdXJjZXMoZXZlbnQuZ2V0SW5kZXgoKSwgZXZlbnQuZ2V0SXRlbXNTaXplKCksIHRydWUpOyAgLy8gdHJ1ZSA9IGZpcmUgZXZlbnQKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGluZm9zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBzb3VyY2VzIGZyb20gb3VyIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbXBvbmVudFNvdXJjZXMoaW50IHJlbW92ZWRTb3VyY2VzSW5kZXgsIGludCByZW1vdmVkU291cmNlc1NpemUsIGJvb2xlYW4gZmlyZUV2ZW50KSB7Ci0JCWludCByZW1vdmVkSXRlbXNJbmRleCA9IHRoaXMuaW5mb0xpc3QuZ2V0KHJlbW92ZWRTb3VyY2VzSW5kZXgpLmJlZ2luOwotCQlpbnQgbW92ZWRTb3VyY2VzSW5kZXggPSByZW1vdmVkU291cmNlc0luZGV4ICsgcmVtb3ZlZFNvdXJjZXNTaXplOwotCQlpbnQgbW92ZWRJdGVtc0luZGV4ID0gKG1vdmVkU291cmNlc0luZGV4ID09IHRoaXMuaW5mb0xpc3Quc2l6ZSgpKSA/IHRoaXMuc2l6ZSA6IHRoaXMuaW5mb0xpc3QuZ2V0KG1vdmVkU291cmNlc0luZGV4KS5iZWdpbjsKLQkJaW50IHJlbW92ZWRJdGVtc1NpemUgPSBtb3ZlZEl0ZW1zSW5kZXggLSByZW1vdmVkSXRlbXNJbmRleDsKLQkJdGhpcy5zaXplIC09IHJlbW92ZWRJdGVtc1NpemU7Ci0KLQkJTGlzdDxJbmZvPiBzdWJMaXN0ID0gdGhpcy5pbmZvTGlzdC5zdWJMaXN0KHJlbW92ZWRTb3VyY2VzSW5kZXgsIHJlbW92ZWRTb3VyY2VzSW5kZXggKyByZW1vdmVkU291cmNlc1NpemUpOwotCQlBcnJheUxpc3Q8SW5mbz4gcmVtb3ZlZEluZm9MaXN0ID0gbmV3IEFycmF5TGlzdDxJbmZvPihzdWJMaXN0KTsgIC8vIG1ha2UgYSBjb3B5Ci0JCXN1Ykxpc3QuY2xlYXIoKTsKLQotCQkvLyBkZWNyZW1lbnQgdGhlICdiZWdpbicgaW5kZXggZm9yIGFsbCB0aGUgaW5mb3MgdGhhdCB3ZXJlIG1vdmVkIGZvcndhcmQgYnkgdGhlIGRlbGV0ZXMKLQkJZm9yIChpbnQgaSA9IHJlbW92ZWRTb3VyY2VzSW5kZXg7IGkgPCB0aGlzLmluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQl0aGlzLmluZm9MaXN0LmdldChpKS5iZWdpbiAtPSByZW1vdmVkSXRlbXNTaXplOwotCQl9Ci0KLQkJZm9yIChJbmZvIHJlbW92ZWRJbmZvIDogcmVtb3ZlZEluZm9MaXN0KSB7Ci0JCQlyZW1vdmVkSW5mby5jb21wb25lbnRMVk0ucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfVkFMVUVTLCB0aGlzLmNvbXBvbmVudExWTUxpc3RlbmVyKTsKLQkJfQotCi0JCWlmIChmaXJlRXZlbnQpIHsKLQkJCUFycmF5TGlzdDxFMj4gcmVtb3ZlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFMj4ocmVtb3ZlZEl0ZW1zU2l6ZSk7Ci0JCQlmb3IgKEluZm8gcmVtb3ZlZEluZm8gOiByZW1vdmVkSW5mb0xpc3QpIHsKLQkJCQlyZW1vdmVkSXRlbXMuYWRkQWxsKHJlbW92ZWRJbmZvLml0ZW1zKTsKLQkJCX0KLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChMSVNUX1ZBTFVFUywgcmVtb3ZlZEl0ZW1zSW5kZXgsIHJlbW92ZWRJdGVtcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTb21lIGNvbXBvbmVudCBzb3VyY2VzIHdlcmUgcmVwbGFjZWQ7IHVwZGF0ZSBvdXIgY2FjaGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVwbGFjZUNvbXBvbmVudFNvdXJjZXMoZXZlbnQuZ2V0SW5kZXgoKSwgdGhpcy5nZXROZXdJdGVtcyhldmVudCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpLCB0cnVlKTsgIC8vIHRydWUgPSBmaXJlIGV2ZW50Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZWQgY29tcG9uZW50IHNvdXJjZXMgd2lsbCBub3QgKHR5cGljYWxseSkgbWFwIHRvIGEgc2V0IG9mIHJlcGxhY2VkCi0JICogaXRlbXMsIHNvIHdlIHJlbW92ZSBhbmQgYWRkIHRoZSBjb3JyZXNwb25kaW5nIGxpc3RzIG9mIGl0ZW1zLCByZXN1bHRpbmcgaW4KLQkgKiB0d28gZXZlbnRzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2VDb21wb25lbnRTb3VyY2VzKGludCByZXBsYWNlZFNvdXJjZXNJbmRleCwgSXRlcmFibGU8PyBleHRlbmRzIEUxPiBuZXdTb3VyY2VzLCBpbnQgcmVwbGFjZWRTb3VyY2VzU2l6ZSwgYm9vbGVhbiBmaXJlRXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRTb3VyY2VzKHJlcGxhY2VkU291cmNlc0luZGV4LCByZXBsYWNlZFNvdXJjZXNTaXplLCBmaXJlRXZlbnQpOwotCQl0aGlzLmFkZENvbXBvbmVudFNvdXJjZXMocmVwbGFjZWRTb3VyY2VzSW5kZXgsIG5ld1NvdXJjZXMsIHJlcGxhY2VkU291cmNlc1NpemUsIGZpcmVFdmVudCk7Ci0JfQotCi0JLyoqCi0JICogU29tZSBjb21wb25lbnQgc291cmNlcyB3ZXJlIG1vdmVkOyB1cGRhdGUgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLm1vdmVDb21wb25lbnRTb3VyY2VzKGV2ZW50LmdldFRhcmdldEluZGV4KCksIGV2ZW50LmdldFNvdXJjZUluZGV4KCksIGV2ZW50LmdldExlbmd0aCgpLCB0cnVlKTsgIC8vIHRydWUgPSBmaXJlIGV2ZW50Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbW92ZUNvbXBvbmVudFNvdXJjZXMoaW50IHRhcmdldFNvdXJjZXNJbmRleCwgaW50IHNvdXJjZVNvdXJjZXNJbmRleCwgaW50IG1vdmVkU291cmNlc0xlbmd0aCwgYm9vbGVhbiBmaXJlRXZlbnQpIHsKLQkJaW50IHNvdXJjZUl0ZW1zSW5kZXggPSB0aGlzLmluZm9MaXN0LmdldChzb3VyY2VTb3VyY2VzSW5kZXgpLmJlZ2luOwotCi0JCWludCBuZXh0U291cmNlU291cmNlSW5kZXggPSBzb3VyY2VTb3VyY2VzSW5kZXggKyBtb3ZlZFNvdXJjZXNMZW5ndGg7Ci0JCWludCBuZXh0U291cmNlSXRlbUluZGV4ID0gKG5leHRTb3VyY2VTb3VyY2VJbmRleCA9PSB0aGlzLmluZm9MaXN0LnNpemUoKSkgPyB0aGlzLnNpemUgOiB0aGlzLmluZm9MaXN0LmdldChuZXh0U291cmNlU291cmNlSW5kZXgpLmJlZ2luOwotCQlpbnQgbW92ZUl0ZW1zTGVuZ3RoID0gbmV4dFNvdXJjZUl0ZW1JbmRleCAtIHNvdXJjZUl0ZW1zSW5kZXg7Ci0KLQkJaW50IHRhcmdldEl0ZW1zSW5kZXggPSAtMTsKLQkJaWYgKHNvdXJjZVNvdXJjZXNJbmRleCA+IHRhcmdldFNvdXJjZXNJbmRleCkgewotCQkJLy8gbW92ZSBmcm9tIGhpZ2ggdG8gbG93IGluZGV4Ci0JCQl0YXJnZXRJdGVtc0luZGV4ID0gdGhpcy5pbmZvTGlzdC5nZXQodGFyZ2V0U291cmNlc0luZGV4KS5iZWdpbjsKLQkJfSBlbHNlIHsKLQkJCS8vIG1vdmUgZnJvbSBsb3cgdG8gaGlnaCBpbmRleCAoaGlnaGVyIGl0ZW1zIG1vdmUgZG93biBkdXJpbmcgbW92ZSkKLQkJCWludCBuZXh0VGFyZ2V0U291cmNlSW5kZXggPSB0YXJnZXRTb3VyY2VzSW5kZXggKyBtb3ZlZFNvdXJjZXNMZW5ndGg7Ci0JCQl0YXJnZXRJdGVtc0luZGV4ID0gKG5leHRUYXJnZXRTb3VyY2VJbmRleCA9PSB0aGlzLmluZm9MaXN0LnNpemUoKSkgPyB0aGlzLnNpemUgOiB0aGlzLmluZm9MaXN0LmdldChuZXh0VGFyZ2V0U291cmNlSW5kZXgpLmJlZ2luOwotCQkJdGFyZ2V0SXRlbXNJbmRleCA9IHRhcmdldEl0ZW1zSW5kZXggLSBtb3ZlSXRlbXNMZW5ndGg7Ci0JCX0KLQotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLmluZm9MaXN0LCB0YXJnZXRTb3VyY2VzSW5kZXgsIHNvdXJjZVNvdXJjZXNJbmRleCwgbW92ZWRTb3VyY2VzTGVuZ3RoKTsKLQotCQkvLyB1cGRhdGUgdGhlICdiZWdpbicgaW5kZXhlcyBvZiBhbGwgdGhlIGFmZmVjdGVkICdpbmZvcycKLQkJaW50IG1pbiA9IE1hdGgubWluKHRhcmdldFNvdXJjZXNJbmRleCwgc291cmNlU291cmNlc0luZGV4KTsKLQkJaW50IG1heCA9IE1hdGgubWF4KHRhcmdldFNvdXJjZXNJbmRleCwgc291cmNlU291cmNlc0luZGV4KSArIG1vdmVkU291cmNlc0xlbmd0aDsKLQkJaW50IGJlZ2luID0gTWF0aC5taW4odGFyZ2V0SXRlbXNJbmRleCwgc291cmNlSXRlbXNJbmRleCk7Ci0JCWZvciAoaW50IGkgPSBtaW47IGkgPCBtYXg7IGkrKykgewotCQkJSW5mbyBpbmZvID0gdGhpcy5pbmZvTGlzdC5nZXQoaSk7Ci0JCQlpbmZvLmJlZ2luID0gYmVnaW47Ci0JCQliZWdpbiArPSBpbmZvLmNvbXBvbmVudExWTS5zaXplKCk7Ci0JCX0KLQotCQlpZiAoZmlyZUV2ZW50KSB7Ci0JCQl0aGlzLmZpcmVJdGVtc01vdmVkKExJU1RfVkFMVUVTLCB0YXJnZXRJdGVtc0luZGV4LCBzb3VyY2VJdGVtc0luZGV4LCBtb3ZlSXRlbXNMZW5ndGgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbXBvbmVudCBzb3VyY2VzIHdlcmUgY2xlYXJlZDsgY2xlYXIgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2xlYXJDb21wb25lbnRTb3VyY2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJDb21wb25lbnRTb3VyY2VzKCkgewotCQl0aGlzLnJlbW92ZUNvbXBvbmVudFNvdXJjZXMoMCwgdGhpcy5pbmZvTGlzdC5zaXplKCksIGZhbHNlKTsgIC8vIGZhbHNlID0gZG8gbm90IGZpcmUgZXZlbnQKLQkJdGhpcy5maXJlTGlzdENsZWFyZWQoTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb21wb25lbnQgc291cmNlcyBjaGFuZ2VkOyByZWJ1aWxkIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaW50IG5ld1NpemUgPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCQlpZiAobmV3U2l6ZSA9PSAwKSB7Ci0JCQl0aGlzLmNsZWFyQ29tcG9uZW50U291cmNlcygpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IG9sZFNpemUgPSB0aGlzLmluZm9MaXN0LnNpemUoKTsKLQkJaWYgKG9sZFNpemUgPT0gMCkgewotCQkJdGhpcy5hZGRDb21wb25lbnRTb3VyY2VzKDAsIHRoaXMubGlzdEhvbGRlciwgbmV3U2l6ZSwgdHJ1ZSk7ICAvLyB0cnVlID0gZmlyZSBldmVudAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IG1pbiA9IE1hdGgubWluKG5ld1NpemUsIG9sZFNpemUpOwotCQkvLyBoYW5kbGUgcmVwbGFjZWQgc291cmNlcyBpbmRpdmlkdWFsbHkgc28gd2UgZG9uJ3QgZmlyZSBldmVudHMgZm9yIHVuY2hhbmdlZCBzb3VyY2VzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWluOyBpKyspIHsKLQkJCUUxIG5ld1NvdXJjZSA9IHRoaXMubGlzdEhvbGRlci5nZXQoaSk7Ci0JCQlFMSBvbGRTb3VyY2UgPSB0aGlzLmluZm9MaXN0LmdldChpKS5zb3VyY2U7Ci0JCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQobmV3U291cmNlLCBvbGRTb3VyY2UpKSB7Ci0JCQkJdGhpcy5yZXBsYWNlQ29tcG9uZW50U291cmNlcyhpLCBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPEUxPihuZXdTb3VyY2UpLCAxLCB0cnVlKTsgIC8vIHRydWUgPSBmaXJlIGV2ZW50Ci0JCQl9Ci0JCX0KLQotCQlpZiAobmV3U2l6ZSA9PSBvbGRTaXplKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAobmV3U2l6ZSA8IG9sZFNpemUpIHsKLQkJCXRoaXMucmVtb3ZlQ29tcG9uZW50U291cmNlcyhtaW4sIG9sZFNpemUgLSBuZXdTaXplLCB0cnVlKTsgIC8vIHRydWUgPSBmaXJlIGV2ZW50Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBuZXdTaXplID4gb2xkU2l6ZQotCQl0aGlzLmFkZENvbXBvbmVudFNvdXJjZXMobWluLCB0aGlzLmJ1aWxkU3ViTGlzdEhvbGRlcihtaW4pLCBuZXdTaXplIC0gb2xkU2l6ZSwgdHJ1ZSk7ICAvLyB0cnVlID0gZmlyZSBldmVudAotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGJ1aWxkU3ViTGlzdEhvbGRlcihpbnQgZnJvbUluZGV4KSB7Ci0JCWludCBsaXN0SG9sZGVyU2l6ZSA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RIb2xkZXIsIGxpc3RIb2xkZXJTaXplKS5zdWJMaXN0KGZyb21JbmRleCwgbGlzdEhvbGRlclNpemUpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGJ1aWxkU3ViTGlzdEhvbGRlcihpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlpbnQgbGlzdEhvbGRlclNpemUgPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCQlyZXR1cm4gKChmcm9tSW5kZXggPT0gMCkgJiYgKHRvSW5kZXggPT0gbGlzdEhvbGRlclNpemUpKSA/Ci0JCQkJdGhpcy5saXN0SG9sZGVyIDoKLQkJCQlDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RIb2xkZXIsIGxpc3RIb2xkZXJTaXplKS5zdWJMaXN0KGZyb21JbmRleCwgdG9JbmRleCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgc3BlY2lmaWVkIG9iamVjdCBpbnRvIGEgbGlzdCB2YWx1ZSBtb2RlbC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxFMj4gdHJhbnNmb3JtKEUxIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybWVyLnRyYW5zZm9ybSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBMVk0uCi0JICovCi0JcHJvdGVjdGVkIGludCBpbmRleE9mKExpc3RWYWx1ZU1vZGVsPEUyPiBjb21wb25lbnRMVk0pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAodGhpcy5pbmZvTGlzdC5nZXQoaSkuY29tcG9uZW50TFZNID09IGNvbXBvbmVudExWTSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgY29tcG9uZW50IExWTTogIiArIGNvbXBvbmVudExWTSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQncyBjb21wb25lbnQgTFZNLgotCSAqLwotCXByb3RlY3RlZCBpbnQgaW5kZXhGb3IoTGlzdEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiB0aGlzLmluZGV4T2YodGhpcy5nZXRDb21wb25lbnRMVk0oZXZlbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIG9uZSBvZiB0aGUgY29tcG9uZW50IGxpc3RzOwotCSAqIHN5bmNocm9uaXplIG91ciBjYWNoZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wb25lbnRJdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQlpbnQgY29tcG9uZW50TFZNSW5kZXggPSB0aGlzLmluZGV4Rm9yKGV2ZW50KTsKLQkJdGhpcy5hZGRDb21wb25lbnRJdGVtcyhjb21wb25lbnRMVk1JbmRleCwgdGhpcy5pbmZvTGlzdC5nZXQoY29tcG9uZW50TFZNSW5kZXgpLCBldmVudC5nZXRJbmRleCgpLCB0aGlzLmdldENvbXBvbmVudEl0ZW1zKGV2ZW50KSwgZXZlbnQuZ2V0SXRlbXNTaXplKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbXBvbmVudEl0ZW1zKGludCBjb21wb25lbnRMVk1JbmRleCwgSW5mbyBpbmZvLCBpbnQgYWRkZWRJdGVtc0luZGV4LCBJdGVyYWJsZTxFMj4gYWRkZWRJdGVtcywgaW50IGFkZGVkSXRlbXNTaXplKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgYWZmZWN0ZWQgJ2JlZ2luJyBpbmRpY2VzCi0JCWZvciAoaW50IGkgPSBjb21wb25lbnRMVk1JbmRleCArIDE7IGkgPCB0aGlzLmluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQl0aGlzLmluZm9MaXN0LmdldChpKS5iZWdpbiArPSBhZGRlZEl0ZW1zU2l6ZTsKLQkJfQotCQl0aGlzLnNpemUgKz0gYWRkZWRJdGVtc1NpemU7Ci0KLQkJLy8gc3luY2hyb25pemUgdGhlIGNhY2hlZCBsaXN0Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoaW5mby5pdGVtcywgYWRkZWRJdGVtc0luZGV4LCBhZGRlZEl0ZW1zLCBhZGRlZEl0ZW1zU2l6ZSk7Ci0KLQkJLy8gdHJhbnNsYXRlIHRoZSBldmVudAotCQl0aGlzLmZpcmVJdGVtc0FkZGVkKExJU1RfVkFMVUVTLCBpbmZvLmJlZ2luICsgYWRkZWRJdGVtc0luZGV4LCBpbmZvLml0ZW1zLnN1Ykxpc3QoYWRkZWRJdGVtc0luZGV4LCBhZGRlZEl0ZW1zSW5kZXggKyBhZGRlZEl0ZW1zU2l6ZSkpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIG9uZSBvZiB0aGUgY29tcG9uZW50IGxpc3RzOwotCSAqIHN5bmNocm9uaXplIG91ciBjYWNoZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wb25lbnRJdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHVwZGF0ZSB0aGUgYWZmZWN0ZWQgJ2JlZ2luJyBpbmRpY2VzCi0JCWludCBjb21wb25lbnRMVk1JbmRleCA9IHRoaXMuaW5kZXhGb3IoZXZlbnQpOwotCQlpbnQgcmVtb3ZlZEl0ZW1zU2l6ZSA9IGV2ZW50LmdldEl0ZW1zU2l6ZSgpOwotCQlmb3IgKGludCBpID0gY29tcG9uZW50TFZNSW5kZXggKyAxOyBpIDwgdGhpcy5pbmZvTGlzdC5zaXplKCk7IGkrKykgewotCQkJdGhpcy5pbmZvTGlzdC5nZXQoaSkuYmVnaW4gLT0gcmVtb3ZlZEl0ZW1zU2l6ZTsKLQkJfQotCQl0aGlzLnNpemUgLT0gcmVtb3ZlZEl0ZW1zU2l6ZTsKLQotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY2FjaGVkIGxpc3QKLQkJSW5mbyBpbmZvID0gdGhpcy5pbmZvTGlzdC5nZXQoY29tcG9uZW50TFZNSW5kZXgpOwotCQlpbnQgaXRlbUluZGV4ID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJaW5mby5pdGVtcy5zdWJMaXN0KGl0ZW1JbmRleCwgaXRlbUluZGV4ICsgZXZlbnQuZ2V0SXRlbXNTaXplKCkpLmNsZWFyKCk7Ci0KLQkJLy8gdHJhbnNsYXRlIHRoZSBldmVudAotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMsIGluZm8uYmVnaW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlcGxhY2VkIGluIG9uZSBvZiB0aGUgY29tcG9uZW50IGxpc3RzOwotCSAqIHN5bmNocm9uaXplIG91ciBjYWNoZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wb25lbnRJdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJLy8gbm8gY2hhbmdlcyB0byB0aGUgJ2JlZ2luJyBpbmRpY2VzIG9yIHNpemUKLQotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY2FjaGVkIGxpc3QKLQkJaW50IGNvbXBvbmVudExWTUluZGV4ID0gdGhpcy5pbmRleEZvcihldmVudCk7Ci0JCUluZm8gaW5mbyA9IHRoaXMuaW5mb0xpc3QuZ2V0KGNvbXBvbmVudExWTUluZGV4KTsKLQkJaW50IGkgPSBldmVudC5nZXRJbmRleCgpOwotCQlmb3IgKEUyIGl0ZW0gOiB0aGlzLmdldENvbXBvbmVudEl0ZW1zKGV2ZW50KSkgewotCQkJaW5mby5pdGVtcy5zZXQoaSsrLCBpdGVtKTsKLQkJfQotCi0JCS8vIHRyYW5zbGF0ZSB0aGUgZXZlbnQKLQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUywgaW5mby5iZWdpbikpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgbW92ZWQgaW4gb25lIG9mIHRoZSBjb21wb25lbnQgbGlzdHM7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudEl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkvLyBubyBjaGFuZ2VzIHRvIHRoZSAnYmVnaW4nIGluZGljZXMgb3Igc2l6ZQotCi0JCS8vIHN5bmNocm9uaXplIHRoZSBjYWNoZWQgbGlzdAotCQlpbnQgY29tcG9uZW50TFZNSW5kZXggPSB0aGlzLmluZGV4Rm9yKGV2ZW50KTsKLQkJSW5mbyBpbmZvID0gdGhpcy5pbmZvTGlzdC5nZXQoY29tcG9uZW50TFZNSW5kZXgpOwotCQlDb2xsZWN0aW9uVG9vbHMubW92ZShpbmZvLml0ZW1zLCBldmVudC5nZXRUYXJnZXRJbmRleCgpLCBldmVudC5nZXRTb3VyY2VJbmRleCgpLCBldmVudC5nZXRMZW5ndGgoKSk7Ci0KLQkJLy8gdHJhbnNsYXRlIHRoZSBldmVudAotCQl0aGlzLmZpcmVJdGVtc01vdmVkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTLCBpbmZvLmJlZ2luKSk7Ci0JfQotCi0JLyoqCi0JICogT25lIG9mIHRoZSBjb21wb25lbnQgbGlzdHMgd2FzIGNsZWFyZWQ7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudExpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCWludCBjb21wb25lbnRMVk1JbmRleCA9IHRoaXMuaW5kZXhGb3IoZXZlbnQpOwotCQl0aGlzLmNsZWFyQ29tcG9uZW50TGlzdChjb21wb25lbnRMVk1JbmRleCwgdGhpcy5pbmZvTGlzdC5nZXQoY29tcG9uZW50TFZNSW5kZXgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhckNvbXBvbmVudExpc3QoaW50IGNvbXBvbmVudExWTUluZGV4LCBJbmZvIGluZm8pIHsKLQkJLy8gdXBkYXRlIHRoZSBhZmZlY3RlZCAnYmVnaW4nIGluZGljZXMKLQkJaW50IHJlbW92ZWRJdGVtc1NpemUgPSBpbmZvLml0ZW1zLnNpemUoKTsKLQkJaWYgKHJlbW92ZWRJdGVtc1NpemUgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IGNvbXBvbmVudExWTUluZGV4ICsgMTsgaSA8IHRoaXMuaW5mb0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCXRoaXMuaW5mb0xpc3QuZ2V0KGkpLmJlZ2luIC09IHJlbW92ZWRJdGVtc1NpemU7Ci0JCX0KLQkJdGhpcy5zaXplIC09IHJlbW92ZWRJdGVtc1NpemU7Ci0KLQkJLy8gc3luY2hyb25pemUgdGhlIGNhY2hlZCBsaXN0Ci0JCUFycmF5TGlzdDxFMj4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PEUyPihpbmZvLml0ZW1zKTsgIC8vIG1ha2UgYSBjb3B5Ci0JCWluZm8uaXRlbXMuY2xlYXIoKTsKLQotCQkvLyB0cmFuc2xhdGUgdGhlIGV2ZW50Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChMSVNUX1ZBTFVFUywgaW5mby5iZWdpbiwgaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgY29tcG9uZW50IGxpc3RzIGNoYW5nZWQ7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlIGJ5IHN5bmNocm9uaXppbmcgdGhlIGFwcHJvcHJpYXRlCi0JICogbGlzdCBhbmQgZmlyaW5nIHRoZSBhcHByb3ByaWF0ZSBldmVudHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50TGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWludCBjb21wb25lbnRMVk1JbmRleCA9IHRoaXMuaW5kZXhGb3IoZXZlbnQpOwotCQlJbmZvIGluZm8gPSB0aGlzLmluZm9MaXN0LmdldChjb21wb25lbnRMVk1JbmRleCk7Ci0KLQkJaW50IG5ld0l0ZW1zU2l6ZSA9IGluZm8uY29tcG9uZW50TFZNLnNpemUoKTsKLQkJaWYgKG5ld0l0ZW1zU2l6ZSA9PSAwKSB7Ci0JCQl0aGlzLmNsZWFyQ29tcG9uZW50TGlzdChjb21wb25lbnRMVk1JbmRleCwgaW5mbyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgb2xkSXRlbXNTaXplID0gaW5mby5pdGVtcy5zaXplKCk7Ci0JCWlmIChvbGRJdGVtc1NpemUgPT0gMCkgewotCQkJdGhpcy5hZGRDb21wb25lbnRJdGVtcyhjb21wb25lbnRMVk1JbmRleCwgaW5mbywgMCwgaW5mby5jb21wb25lbnRMVk0sIG5ld0l0ZW1zU2l6ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgbWluID0gTWF0aC5taW4obmV3SXRlbXNTaXplLCBvbGRJdGVtc1NpemUpOwotCQkvLyBoYW5kbGUgcmVwbGFjZWQgaXRlbXMgaW5kaXZpZHVhbGx5IHNvIHdlIGRvbid0IGZpcmUgZXZlbnRzIGZvciB1bmNoYW5nZWQgaXRlbXMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaW47IGkrKykgewotCQkJRTIgbmV3SXRlbSA9IGluZm8uY29tcG9uZW50TFZNLmdldChpKTsKLQkJCUUyIG9sZEl0ZW0gPSBpbmZvLml0ZW1zLnNldChpLCBuZXdJdGVtKTsKLQkJCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZChMSVNUX1ZBTFVFUywgaW5mby5iZWdpbiArIGksIG5ld0l0ZW0sIG9sZEl0ZW0pOwotCQl9Ci0KLQkJaW50IGRlbHRhID0gbmV3SXRlbXNTaXplIC0gb2xkSXRlbXNTaXplOwotCQlpZiAoZGVsdGEgPT0gMCkgeyAgLy8gbmV3SXRlbXNTaXplID09IG9sZEl0ZW1zU2l6ZQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IGNvbXBvbmVudExWTUluZGV4ICsgMTsgaSA8IHRoaXMuaW5mb0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCXRoaXMuaW5mb0xpc3QuZ2V0KGkpLmJlZ2luICs9IGRlbHRhOwotCQl9Ci0JCXRoaXMuc2l6ZSArPSBkZWx0YTsKLQotCQlpZiAoZGVsdGEgPCAwKSB7ICAvLyBuZXdJdGVtc1NpemUgPCBvbGRJdGVtc1NpemUKLQkJCUxpc3Q8RTI+IHN1Ykxpc3QgPSBpbmZvLml0ZW1zLnN1Ykxpc3QobmV3SXRlbXNTaXplLCBvbGRJdGVtc1NpemUpOwotCQkJQXJyYXlMaXN0PEUyPiByZW1vdmVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEUyPihzdWJMaXN0KTsgIC8vIG1ha2UgYSBjb3B5Ci0JCQlzdWJMaXN0LmNsZWFyKCk7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoTElTVF9WQUxVRVMsIGluZm8uYmVnaW4gKyBuZXdJdGVtc1NpemUsIHJlbW92ZWRJdGVtcyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBuZXdJdGVtc1NpemUgPiBvbGRJdGVtc1NpemUKLQkJQXJyYXlMaXN0PEUyPiBhZGRlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFMj4oZGVsdGEpOwotCQlmb3IgKGludCBpID0gb2xkSXRlbXNTaXplOyBpIDwgbmV3SXRlbXNTaXplOyBpKyspIHsKLQkJCWFkZGVkSXRlbXMuYWRkKGluZm8uY29tcG9uZW50TFZNLmdldChpKSk7Ci0JCX0KLQkJaW5mby5pdGVtcy5hZGRBbGwoYWRkZWRJdGVtcyk7Ci0JCXRoaXMuZmlyZUl0ZW1zQWRkZWQoTElTVF9WQUxVRVMsIGluZm8uYmVnaW4gKyBvbGRJdGVtc1NpemUsIGFkZGVkSXRlbXMpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RTI+IGdldENvbXBvbmVudEl0ZW1zKExpc3RBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEUyPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEUyPiBnZXRDb21wb25lbnRJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RTI+KSBldmVudC5nZXROZXdJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8RTI+IGdldENvbXBvbmVudExWTShMaXN0RXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChMaXN0VmFsdWVNb2RlbDxFMj4pIGV2ZW50LmdldFNvdXJjZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzFmYWIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLklkZW50aXR5SGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gYWRhcHRzIGEKLSAqIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0gaG9sZGluZyBvdGhlciB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfXMKLSAqIHRvIGEgc2luZ2xlIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9LgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Ojx1bD4KLSAqIDxsaT57QGxpbmsgI2J1aWxkVmFsdWUoKX08cD4KLSAqICAgICB0byByZXR1cm4gdGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWUsIGFzIGRlcml2ZWQgZnJvbSB0aGUKLSAqICAgICBjb21wb25lbnQgdmFsdWVzCi0gKiA8L3VsPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gVGhlIHdyYXBwZWQgY29sbGVjdGlvbiBtdXN0IG5vdCBjb250YWluIGFueSBkdXBsaWNhdGVzCi0gKiBvciB0aGlzIGNsYXNzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgotICogCi0gKiBAcGFyYW0gPFY+IHRoZSB0eXBlIG9mIHRoZSBtb2RlbCdzIHZhbHVlCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwncwotICogcHJvcGVydHkgdmFsdWUgbW9kZWwncyB2YWx1ZXMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbDxWLCBFPgotCWV4dGVuZHMgQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8ViwgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPj4KLXsKLQkvKioKLQkgKiBDYWNoZSB0aGUgY29tcG9uZW50IHByb3BlcnR5IHZhbHVlIG1vZGVscyBzbyB3ZSBjYW4gc3RvcCBsaXN0ZW5pbmcgdG8KLQkgKiB0aGVtIHdoZW4gdGhleSBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJZGVudGl0eUhhc2hCYWc8UHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPj4gY29tcG9uZW50UFZNcyA9IAotCQkJbmV3IElkZW50aXR5SGFzaEJhZzxQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEU+PigpOwotCi0JLyoqCi0JICogTGlzdGVuIHRvIGV2ZXJ5IHByb3BlcnR5IHZhbHVlIG1vZGVsIGluIHRoZSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLgotCSAqIElmIG9uZSBjaGFuZ2VzLCB3ZSBuZWVkIHRvIHJlLWNhbGN1bGF0ZSBvdXIgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgY29tcG9uZW50TGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgb2YgdGhlIHNwZWNpZmllZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVscy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4uLi4gY29sbGVjdGlvbikgewotCQl0aGlzKEFycmF5cy5hc0xpc3QoY29sbGVjdGlvbikpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgb2YgdGhlIHNwZWNpZmllZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVscy4KLQkgKi8KLQlwdWJsaWMgPFAgZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEU+PiBDb21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUD4gY29sbGVjdGlvbikgewotCQl0aGlzKG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxQPihjb2xsZWN0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWxzLgotCSAqLwotCXB1YmxpYyA8UCBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4+IENvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDxQPiBjb2xsZWN0aW9uTW9kZWwpIHsKLQkJc3VwZXIoY29sbGVjdGlvbk1vZGVsKTsKLQkJdGhpcy5jb21wb25lbnRMaXN0ZW5lciA9IHRoaXMuYnVpbGRDb21wb25lbnRMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZENvbXBvbmVudExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbXBvbmVudExpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIENvbXBvbmVudExpc3RlbmVyCi0JCWV4dGVuZHMgUHJvcGVydHlDaGFuZ2VBZGFwdGVyCi0JewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCUNvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbC50aGlzLmNvbXBvbmVudENoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZSBldmVudCBjYW4gYmUgdXNlZCB0byBpbXByb3ZlCi0JICogdGhlIHBlcmZvcm1hbmNlIG9mIGJ1aWxkaW5nIGEgbmV3IHZhbHVlIChlLmcuIHNvbWUgcHJvcGVydHkgY2hhbmdlcyBtYXkKLQkgKiBub3QgbmVjZXNzaXRhdGUgdGhlIHJlLWNhbGN1bGF0aW9uIG9mIHRoZSB2YWx1ZSkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50Q2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlciBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWxfKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbF8oKTsKLQkJdGhpcy5hZGRDb21wb25lbnRQVk1zKHRoaXMuY29sbGVjdGlvbk1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPFAgZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEU+PiB2b2lkIGFkZENvbXBvbmVudFBWTXMoSXRlcmFibGU8UD4gcHZtcykgewotCQlmb3IgKFAgZWFjaCA6IHB2bXMpIHsKLQkJCXRoaXMuY29tcG9uZW50UFZNcy5hZGQoZWFjaCk7Ci0JCQllYWNoLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVkFMVUUsIHRoaXMuY29tcG9uZW50TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLnJlbW92ZUNvbXBvbmVudFBWTXModGhpcy5jb2xsZWN0aW9uTW9kZWwpOwotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbF8oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPFAgZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEU+PiB2b2lkIHJlbW92ZUNvbXBvbmVudFBWTXMoSXRlcmFibGU8UD4gcHZtcykgewotCQlmb3IgKFAgZWFjaCA6IHB2bXMpIHsKLQkJCWVhY2gucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihWQUxVRSwgdGhpcy5jb21wb25lbnRMaXN0ZW5lcik7Ci0JCQl0aGlzLmNvbXBvbmVudFBWTXMucmVtb3ZlKGVhY2gpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5hZGRDb21wb25lbnRQVk1zKHRoaXMuZ2V0SXRlbXMoZXZlbnQpKTsKLQkJc3VwZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUNvbXBvbmVudFBWTXModGhpcy5nZXRJdGVtcyhldmVudCkpOwotCQlzdXBlci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlQWxsQ29tcG9uZW50UFZNcygpOwotCQlzdXBlci5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWxsQ29tcG9uZW50UFZNcygpIHsKLQkJLy8gY29weSB0aGUgbGlzdCBzbyB3ZSBkb24ndCBlYXQgb3VyIG93biB0YWlsCi0JCUFycmF5TGlzdDxQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEU+PiBjb3B5ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEU+Pih0aGlzLmNvbXBvbmVudFBWTXMpOwotCQl0aGlzLnJlbW92ZUNvbXBvbmVudFBWTXMoY29weSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlQWxsQ29tcG9uZW50UFZNcygpOwotCQl0aGlzLmFkZENvbXBvbmVudFBWTXModGhpcy5jb2xsZWN0aW9uTW9kZWwpOwotCQlzdXBlci5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogT3VyIGNvbnN0cnVjdG9yIGFjY2VwdHMgb25seSBhCi0JICoge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfXtAY29kZTw/IGV4dGVuZHMgfXtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9e0Bjb2RlPD8gZXh0ZW5kcyBFPj59LgotCSAqLwotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8PyBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4+IGdldEl0ZW1zKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPD8gZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEU+PikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBPdXIgY29uc3RydWN0b3IgYWNjZXB0cyBvbmx5IGEKLQkgKiB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9e0Bjb2RlPD8gZXh0ZW5kcyB9e0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH17QGNvZGU8PyBleHRlbmRzIEU+Pn0uCi0JICovCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPj4gZ2V0SXRlbXMoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8PyBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0RvdWJsZU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0RvdWJsZU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0ZTFkNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Eb3VibGVNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQWRkIHN1cHBvcnQgZm9yIGNoYW5naW5nIHRoZSBkb3VibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwuCi0gKiAKLSAqIEBwYXJhbSA8Vj4gdGhlIHR5cGUgb2YgdGhlIGJvdGggdGhlIDxlbT53cmFwcGVkPC9lbT4gYW5kIDxlbT53cmFwcGVyPC9lbT4KLSAqIG1vZGVscycgdmFsdWVzCi0gKi8KLXB1YmxpYyBjbGFzcyBEb3VibGVNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+Ci0JZXh0ZW5kcyBEb3VibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4KLQlpbXBsZW1lbnRzIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4KLXsKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBkb3VibGUgbW9kaWZpYWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZAotCSAqIHdyYXBwZWQgcHJvcGVydHkgdmFsdWUgbW9kZWwgbW9kZWwuCi0JICovCi0JcHVibGljIERvdWJsZU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+PiB2YWx1ZU1vZGVsKSB7Ci0JCXN1cGVyKHZhbHVlTW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFYgdmFsdWUpIHsKLQkJTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiB2bXYgPSB0aGlzLmdldFZhbHVlTW9kZWxWYWx1ZU1vZGVsKCk7Ci0JCWlmICh2bXYgPT0gbnVsbCkgewotCQkJdGhpcy5zZXRWYWx1ZV8odmFsdWUpOwotCQl9IGVsc2UgewotCQkJdm12LnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IGdldFZhbHVlTW9kZWxWYWx1ZU1vZGVsKCkgewotCQlyZXR1cm4gKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4pIHRoaXMudmFsdWVNb2RlbFZhbHVlTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgdmFsdWUgbW9kZWwgbW9kZWwgaXMgbWlzc2luZy4gSGFuZGxlIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgViB2YWx1ZSkgewotCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Eb3VibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0RvdWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODQ1MmNiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0RvdWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgcHJvcGVydHkgdmFsdWUgbW9kZWwgPGVtPndyYXBwZXI8L2VtPiB3cmFwcyBhbm90aGVyIHByb3BlcnR5IHZhbHVlIG1vZGVsCi0gKiBhbmQgdHJlYXRzIHRoZSA8ZW0+d3JhcHBlZDwvZW0+IG1vZGVsJ3MgdmFsdWUgYXMgdGhlIDxlbT53cmFwcGVyPC9lbT4ncyB2YWx1ZS4KLSAqIEFueSBjaGFuZ2UgZXZlbnRzIGZpcmVkIGJ5IHRoZSA8ZW0+d3JhcHBlZDwvZW0+IG1vZGVsIGFyZSBzaW1wbHkgZm9yd2FyZGVkIGJ5Ci0gKiB0aGUgPGVtPndyYXBwZXI8L2VtPiBhcyBpdHMgb3duLgotICogU2ltaWxhcmx5LCBjaGFuZ2luZyB0aGUgPGVtPndyYXBwZXI8L2VtPidzIDxlbT53cmFwcGVkPC9lbT4gbW9kZWwgY2FuIGFsc28KLSAqIHRyaWdnZXIgYSBjaGFuZ2UgZXZlbnQKLSAqIChzZWUge0BsaW5rICN3cmFwcGVkVmFsdWVDaGFuZ2VkKFByb3BlcnR5VmFsdWVNb2RlbCwgUHJvcGVydHlWYWx1ZU1vZGVsKX0pLgotICogVGhhdCBpcywgdGhlIDxlbT53cmFwcGVkPC9lbT4gbW9kZWwgaXMgaGVsZCBieSB5ZXQgYW5vdGhlciBwcm9wZXJ0eSB2YWx1ZQotICogbW9kZWwhCi0gKiA8cD4KLSAqIDx1bD4KLSAqIDxsaT5Eb3VibGUgKDxlbT53cmFwcGVyPC9lbT4pIHByb3BlcnR5IHZhbHVlIG1vZGVsIC0gYSBjbGllbnQgY2FuIGxpc3RlbiB0bwotICogICAgIHRoaXMgbW9kZWwgYW5kIHJlY2VpdmUgdGhlIHNhbWUgY2hhbmdlIG5vdGlmaWNhdGlvbiB3aGV0aGVyIHRoZQotICogICAgIDxlbT53cmFwcGVkPC9lbT4gbW9kZWwgb3IgdGhlIDxlbT53cmFwcGVkPC9lbT4gbW9kZWwncyB2YWx1ZSBjaGFuZ2VzOwotICogICAgIG11Y2ggbGlrZSBhbiB7QGxpbmsgUHJvcGVydHlBc3BlY3RBZGFwdGVyIGFzcGVjdCBhZGFwdGVyfSB3aG9zZSBzdWJqZWN0Ci0gKiAgICAgbW9kZWwgaXMgPGVtPm5vdDwvZW0+IGFub3RoZXIgcHJvcGVydHkgdmFsdWUgbW9kZWwKLSAqICAgICA8dWw+Ci0gKiAgICAgPGxpPjxlbT5XcmFwcGVkPC9lbT4gcHJvcGVydHkgdmFsdWUgbW9kZWwgLSB0aGlzIG1vZGVsIGlzIGJ1aWx0IGFuZAotICogICAgICAgICBtYWludGFpbmVkIGJ5IHRoZSBzZXJ2ZXIgdGhhdCBhbHNvIGJ1aWxkcyB0aGUgPGVtPndyYXBwZXI8L2VtPiBtb2RlbAotICogICAgICAgICAoaS5lLiB0aGUgc2VydmVyIHdpbGwgbW9uaXRvciBzb21lIG90aGVyIG1vZGVsIHRoYXQgZGV0ZXJtaW5lcyB3aGVuCi0gKiAgICAgICAgIHRoZSA8ZW0+d3JhcHBlZDwvZW0+IG1vZGVsIGlzIGNoYW5nZWQpCi0gKiAgICAgICAgIDx1bD4KLSAqICAgICAgICAgPGxpPk9yaWdpbmFsIHByb3BlcnR5IHZhbHVlIG1vZGVsIC0gdGhpcyBtb2RlbCBpcyB0aGUgIm9yaWdpbmFsIgotICogICAgICAgICAgICAgbW9kZWwgdGhhdCBjb250YWlucyB0aGUgdmFsdWUgb2YgaW50ZXJlc3QKLSAqICAgICAgICAgPC91bD4KLSAqICAgICA8L3VsPgotICogPC91bD4KLSAqIDxwPgotICogVGhpcyB3cmFwcGVyIGlzIHVzZWZ1bCB3aGVuIGEgY2hhbmdlIGluIHRoZSA8ZW0+d3JhcHBlZDwvZW0+IG1vZGVsIGlzCi0gKiBzaWduYWxlZCBieSBhIG5vbi12YWx1ZSBldmVudCBhbmQgYSB0aGlyZC1wYXJ0eSB3b3VsZCBsaWtlIHRvIGNoYW5nZSBpdC4KLSAqIAotICogQHBhcmFtIDxWPiB0aGUgdHlwZSBvZiB0aGUgYm90aCB0aGUgPGVtPndyYXBwZWQ8L2VtPiBhbmQgPGVtPndyYXBwZXI8L2VtPgotICogbW9kZWxzJyB2YWx1ZXMKLSAqLwotcHVibGljIGNsYXNzIERvdWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPgotCWV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlcjxQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFY+PgotCWltcGxlbWVudHMgUHJvcGVydHlWYWx1ZU1vZGVsPFY+Ci17Ci0JLyoqCi0JICogVGhlIG9wdGlvbmFsbHkgcHJlc2VudCB3cmFwcGVkIHZhbHVlIG1vZGVsIHZhbHVlOyBoZWxkIGJ5Ci0JICoge0BsaW5rICN2YWx1ZU1vZGVsfS4gVGhpcyBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHZvbGF0aWxlIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVj4gdmFsdWVNb2RlbFZhbHVlTW9kZWw7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmMgd2l0aCBjaGFuZ2VzIHRvIHRoZSB3cmFwcGVkIHZhbHVlCi0JICogbW9kZWwgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdmFsdWVNb2RlbFZhbHVlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGRvdWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZAotCSAqIHdyYXBwZWQgcHJvcGVydHkgdmFsdWUgbW9kZWwgbW9kZWwuCi0JICovCi0JcHVibGljIERvdWJsZVByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVj4+IHZhbHVlTW9kZWwpIHsKLQkJc3VwZXIodmFsdWVNb2RlbCk7Ci0JCXRoaXMudmFsdWVNb2RlbFZhbHVlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVNb2RlbFZhbHVlTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlTW9kZWxWYWx1ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFZhbHVlTW9kZWxMaXN0ZW5lcigpOwotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gY2xhc3MgVmFsdWVNb2RlbExpc3RlbmVyCi0JCWV4dGVuZHMgUHJvcGVydHlDaGFuZ2VBZGFwdGVyCi0JewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCURvdWJsZVByb3BlcnR5VmFsdWVNb2RlbC50aGlzLndyYXBwZWRWYWx1ZU1vZGVsVmFsdWVDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFYgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiAodGhpcy52YWx1ZU1vZGVsVmFsdWVNb2RlbCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLnZhbHVlTW9kZWxWYWx1ZU1vZGVsLmdldFZhbHVlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogd3JhcHBlZCB2YWx1ZSBtb2RlbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgdmFsdWUgbW9kZWwgaGFzIGNoYW5nZWQuCi0JICogTW92ZSBvdXIgdmFsdWUgbW9kZWwgbGlzdGVuZXIgYW5kCi0JICogbm90aWZ5IGxpc3RlbmVycyB0aGF0IHRoZSB2YWx1ZSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB3cmFwcGVkVmFsdWVDaGFuZ2VkKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVj4gb2xkVmFsdWUsIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVj4gbmV3VmFsdWUpIHsKLQkJaWYgKHRoaXMuaGFzTGlzdGVuZXJzKCkpIHsKLQkJCVYgb2xkID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJdGhpcy5kaXNlbmdhZ2VWYWx1ZU1vZGVsKCk7Ci0JCQl0aGlzLmVuZ2FnZVZhbHVlTW9kZWwoKTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkLCB0aGlzLmdldFZhbHVlKCkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHdyYXBwZWQgdmFsdWUgbW9kZWwgdmFsdWUgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSB3cmFwcGVkIHZhbHVlIG1vZGVsJ3MgdmFsdWUgbW9kZWwgaGFzIGNoYW5nZWQuCi0JICogRm9yd2FyZCB0aGUgZXZlbnQgYXMgb3VyIG93bi4KLQkgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cmFwcGVkVmFsdWVNb2RlbFZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5jbG9uZSh0aGlzKSk7Ci0JfQotCi0JLyoqCi0JICogQmVnaW4gbGlzdGVuaW5nIHRvIHRoZSB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJdGhpcy5lbmdhZ2VWYWx1ZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWVNb2RlbCgpIHsKLQkJdGhpcy52YWx1ZU1vZGVsVmFsdWVNb2RlbCA9IHRoaXMudmFsdWVNb2RlbC5nZXRWYWx1ZSgpOwotCQlpZiAodGhpcy52YWx1ZU1vZGVsVmFsdWVNb2RlbCAhPSBudWxsKSB7Ci0JCQl0aGlzLnZhbHVlTW9kZWxWYWx1ZU1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVkFMVUUsIHRoaXMudmFsdWVNb2RlbFZhbHVlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHZhbHVlIG1vZGVsLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmRpc2VuZ2FnZVZhbHVlTW9kZWwoKTsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VWYWx1ZU1vZGVsKCkgewotCQlpZiAodGhpcy52YWx1ZU1vZGVsVmFsdWVNb2RlbCAhPSBudWxsKSB7Ci0JCQl0aGlzLnZhbHVlTW9kZWxWYWx1ZU1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVkFMVUUsIHRoaXMudmFsdWVNb2RlbFZhbHVlTGlzdGVuZXIpOwotCQl9Ci0JCXRoaXMudmFsdWVNb2RlbFZhbHVlTW9kZWwgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0VsZW1lbnRQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9FbGVtZW50UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjg4YTU2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0VsZW1lbnRQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBZGFwdCBhbiBlbGVtZW50IGluIGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB0byBhIHByb3BlcnR5IHZhbHVlIG1vZGVsLgotICogVGhlIHByb3BlcnR5IG1vZGVsJ3MgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIG1vZGVsCi0gKiBjb250YWlucyB0aGUgdmFsdWU6IElmIHRoZSBjb2xsZWN0aW9uIG1vZGVsIGNvbnRhaW5zIHRoZSB2YWx1ZSwKLSAqIHRoZSBwcm9wZXJ0eSBtb2RlbCdzIHZhbHVlIGlzIDxlbT50aGF0PC9lbT4gZWxlbWVudDsgb3RoZXJ3aXNlLCB0aGUgcHJvcGVydHkKLSAqIG1vZGVsJ3MgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4uIEEge0BsaW5rICNwcmVkaWNhdGV9IGlzIHVzZWQgdG8gZGV0ZXJtaW5lCi0gKiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIG1vZGVsIGNvbnRhaW5zIHRoZSByZWxldmFudCB2YWx1ZS4KLSAqIDxwPgotICogVGhpcyBpcyB1c2VmdWwgZm9yIGEgY2xpZW50IChlLmcuIGEgVUkgd2lkZ2V0KSB0aGF0IGlzIGxvbmdlci1saXZpbmcgdGhhbiBpdHMKLSAqIHVuZGVybHlpbmcgbW9kZWwuIE9idmlvdXNseSwgdGhlIGNsaWVudCBtdXN0IGJlIHByZXBhcmVkIHRvIGhhbmRsZSBhIHZhbHVlIG9mCi0gKiA8Y29kZT5udWxsPC9jb2RlPi4KLSAqIAotICogQHBhcmFtIDxWPiB0aGUgdHlwZSBvZiB0aGUgYm90aCB0aGUgbW9kZWwncyB2YWx1ZSBhbmQKLSAqIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwncyBlbGVtZW50cwotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8Vj4KLQlleHRlbmRzIENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFYsIFY+Ci17Ci0JLyoqCi0JICogQSBwcmVkaWNhdGUgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhbiBlbGVtZW50IGluIHRoZSB3cmFwcGVkCi0JICogY29sbGVjdGlvbiBtb2RlbCBpcyB0aGUgbW9kZWwncyB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRmlsdGVyPFY+IHByZWRpY2F0ZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2hvc2UgdmFsdWUgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZQotCSAqIHNwZWNpZmllZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGNvbnRhaW5zIHRoZSB2YWx1ZS4gVGhlIHNwZWNpZmllZAotCSAqIGZpbHRlciBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZAotCSAqIGNvbGxlY3Rpb24gbW9kZWwgaXMgdGhlIHByb3BlcnR5IHZhbHVlLgotCSAqLwotCXB1YmxpYyBFbGVtZW50UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgVj4gY29sbGVjdGlvbk1vZGVsLCBGaWx0ZXI8Vj4gcHJlZGljYXRlKSB7Ci0JCXN1cGVyKGNvbGxlY3Rpb25Nb2RlbCk7Ci0JCWlmIChwcmVkaWNhdGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGNvbGxlY3Rpb24gbW9kZWwgY29udGFpbnMgdGhlIHByb3BlcnR5IG1vZGVsJ3Mge0BsaW5rICN2YWx1ZX0sCi0JICogcmV0dXJuIHRoYXQgZWxlbWVudDsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgViBidWlsZFZhbHVlKCkgewotCQlmb3IgKFYgZWFjaCA6IHRoaXMuY29sbGVjdGlvbk1vZGVsKSB7Ci0JCQlpZiAodGhpcy5wcmVkaWNhdGUuYWNjZXB0KGVhY2gpKSB7Ci0JCQkJcmV0dXJuIGVhY2g7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIG1vZGVsIG5vdyBjb250YWlucyB0aGUKLQkgKiB7QGxpbmsgI3ZhbHVlfS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKEl0ZXJhYmxlPFY+IGl0ZW1zKSB7Ci0JCWlmICh0aGlzLnZhbHVlID09IG51bGwpIHsKLQkJCXRoaXMuaXRlbXNBZGRlZF8oaXRlbXMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZF8oSXRlcmFibGU8Vj4gaXRlbXMpIHsKLQkJZm9yIChWIGVhY2ggOiBpdGVtcykgewotCQkJaWYgKHRoaXMucHJlZGljYXRlLmFjY2VwdChlYWNoKSkgewotCQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgbnVsbCwgdGhpcy52YWx1ZSA9IGVhY2gpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBtb2RlbCBubyBsb25nZXIgY29udGFpbnMgdGhlCi0JICoge0BsaW5rICN2YWx1ZX0uCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKEl0ZXJhYmxlPFY+IGl0ZW1zKSB7Ci0JCWlmICh0aGlzLnZhbHVlICE9IG51bGwpIHsKLQkJCXRoaXMuaXRlbXNSZW1vdmVkXyhpdGVtcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWRfKEl0ZXJhYmxlPFY+IGl0ZW1zKSB7Ci0JCWZvciAoViBlYWNoIDogaXRlbXMpIHsKLQkJCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKGVhY2gsIHRoaXMudmFsdWUpKSB7Ci0JCQkJViBvbGQgPSB0aGlzLnZhbHVlOwotCQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkLCB0aGlzLnZhbHVlID0gbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIHtAbGluayAjdmFsdWV9IG11c3Qgbm93IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLnZhbHVlICE9IG51bGwpIHsKLQkJCVYgb2xkID0gdGhpcy52YWx1ZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkLCB0aGlzLnZhbHVlID0gbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZS1jYWxjdWxhdGUgdGhlIHtAbGluayAjdmFsdWV9LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlWIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkLCB0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0V4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9FeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjAxNjE1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0V4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgd3JhcHBlciBleHRlbmRzIGEge0BsaW5rIExpc3RWYWx1ZU1vZGVsfSAob3Ige0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfSkKLSAqIHdpdGggZml4ZWQgY29sbGVjdGlvbnMgb2YgaXRlbXMgb24gZWl0aGVyIGVuZC4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gQmUgY2FyZWZ1bCB1c2luZyBvciB3cmFwcGluZyB0aGlzIGxpc3QgdmFsdWUgbW9kZWwsIHNpbmNlIHRoZQotICogImV4dGVuZGVkIiBpdGVtcyBtYXkgYmUgdW5leHBlY3RlZCBieSB0aGUgY2xpZW50IGNvZGUgb3Igd3JhcHBlci4KLSAqLwotcHVibGljIGNsYXNzIEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEU+Ci0JZXh0ZW5kcyBMaXN0VmFsdWVNb2RlbFdyYXBwZXI8RT4KLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIHRoZSBpdGVtcyAicHJlcGVuZGVkIiB0byB0aGUgd3JhcHBlZCBsaXN0ICovCi0JcHJvdGVjdGVkIExpc3Q8RT4gcHJlZml4OwotCi0JLyoqIHRoZSBpdGVtcyAiYXBwZW5kZWQiIHRvIHRoZSB3cmFwcGVkIGxpc3QgKi8KLQlwcm90ZWN0ZWQgTGlzdDxFPiBzdWZmaXg7Ci0KLQotCS8vICoqKioqKioqKiogbG90cyBvJyBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRoZSBzcGVjaWZpZWQgbGlzdCB3aXRoIGEgcHJlZml4IGFuZCBzdWZmaXguCi0JICovCi0JcHVibGljIEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyKExpc3Q8PyBleHRlbmRzIEU+IHByZWZpeCwgTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIsIExpc3Q8PyBleHRlbmRzIEU+IHN1ZmZpeCkgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5wcmVmaXggPSBuZXcgQXJyYXlMaXN0PEU+KHByZWZpeCk7Ci0JCXRoaXMuc3VmZml4ID0gbmV3IEFycmF5TGlzdDxFPihzdWZmaXgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2l0aCBhIHByZWZpeCBhbmQgc3VmZml4LgotCSAqLwotCXB1YmxpYyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcihFIHByZWZpeCwgTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIsIEUgc3VmZml4KSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLnByZWZpeCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocHJlZml4KTsKLQkJdGhpcy5zdWZmaXggPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHN1ZmZpeCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRoZSBzcGVjaWZpZWQgbGlzdCB3aXRoIGEgcHJlZml4LgotCSAqLwotCXB1YmxpYyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcihMaXN0PD8gZXh0ZW5kcyBFPiBwcmVmaXgsIExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLnByZWZpeCA9IG5ldyBBcnJheUxpc3Q8RT4ocHJlZml4KTsKLQkJdGhpcy5zdWZmaXggPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdGhlIHNwZWNpZmllZCBsaXN0IHdpdGggYSBwcmVmaXguCi0JICovCi0JcHVibGljIEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyKEUgcHJlZml4LCBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5wcmVmaXggPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHByZWZpeCk7Ci0JCXRoaXMuc3VmZml4ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRoZSBzcGVjaWZpZWQgbGlzdCB3aXRoIGEgc3VmZml4LgotCSAqLwotCXB1YmxpYyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcihMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlciwgTGlzdDw/IGV4dGVuZHMgRT4gc3VmZml4KSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLnByZWZpeCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl0aGlzLnN1ZmZpeCA9IG5ldyBBcnJheUxpc3Q8RT4oc3VmZml4KTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdGhlIHNwZWNpZmllZCBsaXN0IHdpdGggYSBzdWZmaXguCi0JICovCi0JcHVibGljIEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyLCBFIHN1ZmZpeCkgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5wcmVmaXggPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJdGhpcy5zdWZmaXggPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHN1ZmZpeCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRoZSBzcGVjaWZpZWQgbGlzdCB3aXRoIGEgcHJlZml4IGNvbnRhaW5pbmcgYSBzaW5nbGUgbnVsbCBpdGVtLgotCSAqLwotCXB1YmxpYyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcihMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5wcmVmaXggPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG51bGwpOwotCQl0aGlzLnN1ZmZpeCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPEU+KHRoaXMubGlzdEl0ZXJhdG9yXygpKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I8RT4oCi0JCQl0aGlzLnByZWZpeC5saXN0SXRlcmF0b3IoKSwKLQkJCXRoaXMubGlzdEhvbGRlci5saXN0SXRlcmF0b3IoKSwKLQkJCXRoaXMuc3VmZml4Lmxpc3RJdGVyYXRvcigpCi0JCSk7Ci0JfQotCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQlpbnQgcHJlZml4U2l6ZSA9IHRoaXMucHJlZml4LnNpemUoKTsKLQkJaWYgKGluZGV4IDwgcHJlZml4U2l6ZSkgewotCQkJcmV0dXJuIHRoaXMucHJlZml4LmdldChpbmRleCk7Ci0JCX0gZWxzZSBpZiAoaW5kZXggPj0gcHJlZml4U2l6ZSArIHRoaXMubGlzdEhvbGRlci5zaXplKCkpIHsKLQkJCXJldHVybiB0aGlzLnN1ZmZpeC5nZXQoaW5kZXggLSAocHJlZml4U2l6ZSArIHRoaXMubGlzdEhvbGRlci5zaXplKCkpKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB0aGlzLmxpc3RIb2xkZXIuZ2V0KGluZGV4IC0gcHJlZml4U2l6ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLnByZWZpeC5zaXplKCkgKyB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpICsgdGhpcy5zdWZmaXguc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlBcnJheUxpc3Q8RT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RT4odGhpcy5zaXplKCkpOwotCQlsaXN0LmFkZEFsbCh0aGlzLnByZWZpeCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgdGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZEFsbCh0aGlzLnN1ZmZpeCk7Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWxXcmFwcGVyIGltcGxlbWVudGF0aW9uL292ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTLCB0aGlzLnByZWZpeC5zaXplKCkpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUywgdGhpcy5wcmVmaXguc2l6ZSgpKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMsIHRoaXMucHJlZml4LnNpemUoKSkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVJdGVtc01vdmVkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTLCB0aGlzLnByZWZpeC5zaXplKCkpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3QoKSk7ICAvLyBub3QgImNsZWFyZWQiCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2NlbGxhbmVvdXMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KExpc3Q8RT4gcHJlZml4KSB7Ci0JCXRoaXMucHJlZml4ID0gcHJlZml4OwotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3VmZml4KExpc3Q8RT4gc3VmZml4KSB7Ci0JCXRoaXMuc3VmZml4ID0gc3VmZml4OwotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PEU+IGJ1aWxkTGlzdCgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubGlzdEl0ZXJhdG9yXygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTkyYjQ4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5GaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbDwvY29kZT4gd3JhcHMgYW5vdGhlcgotICoge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfSBhbmQgdXNlcyBhIHtAbGluayBGaWx0ZXJ9Ci0gKiB0byBkZXRlcm1pbmUgd2hpY2ggaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb24gYXJlIHJldHVybmVkIGJ5IGNhbGxzCi0gKiB0byB7QGxpbmsgI2l0ZXJhdG9yKCl9LgotICogPHA+Ci0gKiBUaGUgZmlsdGVyIGNhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lOyBhbGxvd2luZyB0aGUgc2FtZQotICogYWRhcHRlciB0byBiZSB1c2VkIHdpdGggZGlmZmVyZW50IGZpbHRlciBjcml0ZXJpYSAoZS5nLiB3aGVuIHRoZSB1c2VyCi0gKiB3YW50cyB0byB2aWV3IGEgbGlzdCBvZiA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMpLgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBJZiB0aGUgb2JqZWN0cyBpbiB0aGUgImZpbHRlcmVkIiBjb2xsZWN0aW9uIGNhbiBjaGFuZ2UgaW4gc3VjaCBhIHdheQotICogdGhhdCB0aGV5IHNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlICJmaWx0ZXJlZCIgY29sbGVjdGlvbiwgeW91IHdpbGwKLSAqIG5lZWQgdG8gd3JhcCB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbiBpbiBhbiB7QGxpbmsgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcn0uCi0gKiBGb3IgZXhhbXBsZSwgaWYgdGhlIGZpbHRlciBvbmx5ICJhY2NlcHRzIiBpdGVtcyB3aG9zZSBuYW1lcyBiZWdpbgotICogd2l0aCAiWCIgYW5kIHRoZSBuYW1lcyBvZiB0aGUgaXRlbXMgY2FuIGNoYW5nZSwgeW91IHdpbGwgbmVlZCB0bwotICogd3JhcCB0aGUgb3JpZ2luYWwgbGlzdCBvZiB1bmZpbHRlcmVkIGl0ZW1zIHdpdGggYW4KLSAqIHtAbGluayBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJ9IHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyB0byBlYWNoCi0gKiBpdGVtJ3MgbmFtZSBhbmQgZmlyZXMgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IHdoZW5ldmVyIGFuIGl0ZW0ncyBuYW1lCi0gKiBjaGFuZ2VzLiBUaGUgZXZlbnQgd2lsbCBjYXVzZSB0aGlzIHdyYXBwZXIgdG8gcmUtZmlsdGVyIHRoZSBjaGFuZ2VkCi0gKiBpdGVtIGFuZCBhZGQgb3IgcmVtb3ZlIGl0IGZyb20gdGhlICJmaWx0ZXJlZCIgY29sbGVjdGlvbiBhcyBhcHByb3ByaWF0ZS4KLSAqLwotcHVibGljIGNsYXNzIEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBDb2xsZWN0aW9uVmFsdWVNb2RlbFdyYXBwZXI8RT4KLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoaXMgZmlsdGVycyB0aGUgaXRlbXMgaW4gdGhlIG5lc3RlZCBjb2xsZWN0aW9uLiAqLwotCXByaXZhdGUgRmlsdGVyPEU+IGZpbHRlcjsKLQotCS8qKiBDYWNoZSB0aGUgaXRlbXMgdGhhdCB3ZXJlIGFjY2VwdGVkIGJ5IHRoZSBmaWx0ZXIgKi8KLQlwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxFPiBmaWx0ZXJlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFPigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbmQgYSBmaWx0ZXIgdGhhdCBzaW1wbHkgYWNjZXB0cyBldmVyeSBvYmplY3QuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uTW9kZWwpIHsKLQkJdGhpcyhjb2xsZWN0aW9uTW9kZWwsIEZpbHRlci5UcmFuc3BhcmVudC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbmQgZmlsdGVyLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbk1vZGVsLCBGaWx0ZXI8RT4gZmlsdGVyKSB7Ci0JCXN1cGVyKGNvbGxlY3Rpb25Nb2RlbCk7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsIGFuZCBhIGZpbHRlciB0aGF0IHNpbXBseSBhY2NlcHRzIGV2ZXJ5IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RNb2RlbCkgewotCQl0aGlzKG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEU+KGxpc3RNb2RlbCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsIGFuZCBmaWx0ZXIuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0TW9kZWwsIEZpbHRlcjxFPiBmaWx0ZXIpIHsKLQkJdGhpcyhuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFPihsaXN0TW9kZWwpLCBmaWx0ZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxFPih0aGlzLmZpbHRlcmVkSXRlbXMpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZmlsdGVyZWRJdGVtcy5zaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlciBvdmVycmlkZXMvaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCS8vIHN5bmMgb3VyIGNhY2hlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgY29sbGVjdGlvbiwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmZpbHRlcmVkSXRlbXMsIHRoaXMuZmlsdGVyKHRoaXMuY29sbGVjdGlvbkhvbGRlcikpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCQkvLyBjbGVhciBvdXQgdGhlIGNhY2hlIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIG5lc3RlZCBjb2xsZWN0aW9uCi0JCXRoaXMuZmlsdGVyZWRJdGVtcy5jbGVhcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGZpbHRlciB0aGUgdmFsdWVzIGJlZm9yZSBwcm9wYWdhdGluZyB0aGUgY2hhbmdlIGV2ZW50Ci0JCXRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24odGhpcy5maWx0ZXIodGhpcy5nZXRJdGVtcyhldmVudCkpLCB0aGlzLmZpbHRlcmVkSXRlbXMsIFZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkvLyBkbyAqbm90KiBmaWx0ZXIgdGhlIHZhbHVlcywgYmVjYXVzZSB0aGV5IG1heSBubyBsb25nZXIgYmUKLQkJLy8gImFjY2VwdGVkIiBhbmQgdGhhdCBtaWdodCBiZSB3aHkgdGhleSB3ZXJlIHJlbW92ZWQgaW4gdGhlIGZpcnN0IHBsYWNlOwotCQkvLyBhbnl3YXksIGFueSBleHRyYW5lb3VzIGl0ZW1zIGFyZSBoYXJtbGVzcwotCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oZXZlbnQuZ2V0SXRlbXMoKSwgdGhpcy5maWx0ZXJlZEl0ZW1zLCBWQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2xlYXJDb2xsZWN0aW9uKHRoaXMuZmlsdGVyZWRJdGVtcywgVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZWJ1aWxkRmlsdGVyZWRJdGVtcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjZWxsYW5lb3VzICoqKioqKioqKioKLQotCS8qKgotCSAqIENoYW5nZSB0aGUgZmlsdGVyIGFuZCByZWJ1aWxkIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihGaWx0ZXI8RT4gZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLnJlYnVpbGRGaWx0ZXJlZEl0ZW1zKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhYmxlIHRoYXQgZmlsdGVycyB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBmaWx0ZXIoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZW1zKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8RT4oaXRlbXMsIHRoaXMuZmlsdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSBvdXIgY2FjaGUgd2l0aCB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYnVpbGRGaWx0ZXJlZEl0ZW1zKCkgewotCQl0aGlzLmZpbHRlcmVkSXRlbXMuY2xlYXIoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmZpbHRlcmVkSXRlbXMsIHRoaXMuZmlsdGVyKHRoaXMuY29sbGVjdGlvbkhvbGRlcikpOwotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChWQUxVRVMsIHRoaXMuZmlsdGVyZWRJdGVtcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5maWx0ZXJlZEl0ZW1zKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmI1NDk0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgPGNvZGU+RmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfSBhbmQgdXNlcyBhIHtAbGluayBGaWx0ZXJ9Ci0gKiB0byBkZXRlcm1pbmUgd2hlbiB0aGUgd3JhcHBlZCB2YWx1ZSBpcyB0byBiZSByZXR1cm5lZCBieSBjYWxscwotICogdG8ge0BsaW5rICNnZXRWYWx1ZSgpfS4KLSAqIDxwPgotICogT25lLCBwb3NzaWJseSB1bmRlc2lyYWJsZSwgc2lkZS1lZmZlY3Qgb2YgdXNpbmcgdGhpcyB2YWx1ZSBtb2RlbCBpcyB0aGF0Ci0gKiBpdCBtdXN0IHJldHVybiA8ZW0+c29tZXRoaW5nPC9lbT4gYXMgdGhlIHZhbHVlLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcwotICogdG8gcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IHdoZW5ldmVyIHRoZSB3cmFwcGVkIHZhbHVlIGlzIG5vdCAiYWNjZXB0ZWQiLAotICogd2hpY2ggY2FuIGJlIGNvbmZpZ3VyZWQgYW5kL29yIG92ZXJyaWRkZW4gKHtAbGluayAjZ2V0RGVmYXVsdFZhbHVlKCl9KS4KLSAqIAotICogQHBhcmFtIDxWPiB0aGUgdHlwZSBvZiB0aGUgbW9kZWwncyA8ZW0+ZmlsdGVyZWQ8L2VtPiB2YWx1ZQotICogQHNlZSBGaWx0ZXIKLSAqLwotcHVibGljIGNsYXNzIEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbDxWPgotCWV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlcjxWPgotCWltcGxlbWVudHMgUHJvcGVydHlWYWx1ZU1vZGVsPFY+Ci17Ci0JLyoqCi0JICogVGhlIG1vZGVsIHJldHVybnMgYW55IHdyYXBwZWQgdmFsdWUgYWNjZXB0ZWQgYnkgdGhpcyBmaWx0ZXIgYW5kIHJldHVybnMKLQkgKiB0aGUge0BsaW5rICNkZWZhdWx0VmFsdWV9IGluIHBsYWNlIG9mIGFueSB3cmFwcGVkIHZhbHVlIHJlamVjdGVkIGJ5IHRoaXMKLQkgKiBmaWx0ZXIuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEZpbHRlcjxWPiBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIG1vZGVsIGlmIHRoZSB3cmFwcGVkIHZhbHVlIGlzIHJlamVjdCBieSB0aGUKLQkgKiB7QGxpbmsgI2ZpbHRlcn0uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFYgZGVmYXVsdFZhbHVlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBmaWx0ZXJpbmcgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsIGFuZCBmaWx0ZXIuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVj4gdmFsdWVNb2RlbCwgRmlsdGVyPFY+IGZpbHRlcikgewotCQl0aGlzKHZhbHVlTW9kZWwsIGZpbHRlciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgZmlsdGVyaW5nIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCwgZmlsdGVyLCBhbmQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVj4gdmFsdWVNb2RlbCwgRmlsdGVyPFY+IGZpbHRlciwgViBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIodmFsdWVNb2RlbCk7Ci0JCWlmIChmaWx0ZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFYgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmZpbHRlclZhbHVlKHRoaXMudmFsdWVNb2RlbC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB3cmFwcGVkVmFsdWVDaGFuZ2VkKFYgb2xkVmFsdWUsIFYgbmV3VmFsdWUpIHsKLQkJLy8gZmlsdGVyIHRoZSB2YWx1ZXMgYmVmb3JlIHByb3BhZ2F0aW5nIHRoZSBjaGFuZ2UgZXZlbnQKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCB0aGlzLmZpbHRlclZhbHVlKG9sZFZhbHVlKSwgdGhpcy5maWx0ZXJWYWx1ZShuZXdWYWx1ZSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgImFjY2VwdGVkIiBzaW1wbHkgcmV0dXJuIGl0LAotCSAqIG90aGVyd2lzZSByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIFYgZmlsdGVyVmFsdWUoViB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5maWx0ZXIuYWNjZXB0KHZhbHVlKSA/IHZhbHVlIDogdGhpcy5nZXREZWZhdWx0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCBpZgotCSAqIHRoZSBuZXN0ZWQgdmFsdWUgd2FzIHJlamVjdGVkIGJ5IHRoZSBmaWx0ZXIuCi0JICogVGhlIGRlZmF1bHQgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIFYgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUHJpbnQgdGhlIGZpbHRlcmVkIHZhbHVlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0VmFsdWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhM2MwNDAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiB7QGxpbmsgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbH0gYW5kIHVzZXMgYSBwYWlyIG9mIHtAbGluayBGaWx0ZXJ9cwotICogdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIHdyYXBwZWQgdmFsdWUgaXMgdG8gYmUgcmV0dXJuZWQgYnkgY2FsbHMKLSAqIHRvIHtAbGluayAjZ2V0VmFsdWUoKX0gYW5kIG1vZGlmaWVkIGJ5IGNhbGxzIHRvCi0gKiB7QGxpbmsgI3NldFZhbHVlKE9iamVjdCkgc2V0VmFsdWUoVil9LgotICogPHA+Ci0gKiBPbmUsIHBvc3NpYmx5IHVuZGVzaXJhYmxlLCBzaWRlLWVmZmVjdCBvZiB1c2luZyB0aGlzIHZhbHVlIG1vZGVsIGlzIHRoYXQKLSAqIGl0IG11c3QgcmV0dXJuIDxlbT5zb21ldGhpbmc8L2VtPiBhcyB0aGUgdmFsdWUuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzCi0gKiB0byByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gd2hlbmV2ZXIgdGhlIHdyYXBwZWQgdmFsdWUgaXMgbm90ICJhY2NlcHRlZCIsCi0gKiB3aGljaCBjYW4gYmUgY29uZmlndXJlZCBhbmQvb3Igb3ZlcnJpZGRlbgotICogKHtAbGluayBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwjZ2V0RGVmYXVsdFZhbHVlKCkgZ2V0RGVmYXVsdFZhbHVlKCl9KS4KLSAqIDxwPgotICogQW5vdGhlciwgcG9zc2libHkgdW5kZXNpcmFibGUsIHNpZGUtZWZmZWN0IG9mIHVzaW5nIHRoaXMgdmFsdWUgbW9kZWwgaXMgdGhhdAotICogaXQgd2lsbCBub3QgZmlyZSBhbiBldmVudCBpZiBhIG5ldyB2YWx1ZSBpcyBub3QgImFjY2VwdGVkIiwgZXZlbiBpZiBpdCBpcwotICogZGlmZmVyZW50IHRoYW4gdGhlIGN1cnJlbnQgdmFsdWUuCi0gKiA8cD4KLSAqIFNpbWlsYXJseSwgaWYgYW4gaW5jb21pbmcgdmFsdWUgaXMgbm90ICJyZXZlcnNlIGFjY2VwdGVkIiwgPGVtPm5vdGhpbmc8L2VtPgotICogd2lsbCBwYXNzZWQgdGhyb3VnaCB0byB0aGUgd3JhcHBlZCB2YWx1ZSBtb2RlbCwgbm90IGV2ZW4gPGNvZGU+bnVsbDwvY29kZT4uCi0gKiAKLSAqIEBwYXJhbSA8Vj4gdGhlIHR5cGUgb2YgdGhlIG1vZGVsJ3MgPGVtPmZpbHRlcmVkPC9lbT4gdmFsdWUKLSAqIEBzZWUgRmlsdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPgotCWV4dGVuZHMgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsPFY+Ci0JaW1wbGVtZW50cyBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+Ci17Ci0JLyoqCi0JICogVGhlIG1vZGVsIHNldHMgdGhlIHdyYXBwZWQgdmFsdWUgdG8gYW55IHZhbHVlIGFjY2VwdGVkIGJ5IHRoaXMgZmlsdGVyCi0JICogYW5kIGRvZXMgbm90aGluZyB3aXRoIGFueSB2YWx1ZSByZWplY3RlZCBieSB0aGlzIGZpbHRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRmlsdGVyPFY+IHNldEZpbHRlcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgZmlsdGVyaW5nIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCwgPGVtPmdldDwvZW0+IGZpbHRlciwgYW5kIDxlbT5zZXQ8L2VtPiBmaWx0ZXIuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiB2YWx1ZU1vZGVsLCBGaWx0ZXI8Vj4gZ2V0RmlsdGVyLCBGaWx0ZXI8Vj4gc2V0RmlsdGVyKSB7Ci0JCXRoaXModmFsdWVNb2RlbCwgZ2V0RmlsdGVyLCBzZXRGaWx0ZXIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGZpbHRlcmluZyBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwsIDxlbT5nZXQ8L2VtPiBmaWx0ZXIsIDxlbT5zZXQ8L2VtPiBmaWx0ZXIsCi0JICogYW5kIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gdmFsdWVNb2RlbCwgRmlsdGVyPFY+IGdldEZpbHRlciwgRmlsdGVyPFY+IHNldEZpbHRlciwgViBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIodmFsdWVNb2RlbCwgZ2V0RmlsdGVyLCBkZWZhdWx0VmFsdWUpOwotCQlpZiAoc2V0RmlsdGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuc2V0RmlsdGVyID0gc2V0RmlsdGVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShWIHZhbHVlKSB7Ci0JCWlmICh0aGlzLnNldEZpbHRlci5hY2NlcHQodmFsdWUpKSB7Ci0JCQl0aGlzLmdldFZhbHVlTW9kZWwoKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPdXIgY29uc3RydWN0b3IgYWNjZXB0cyBvbmx5IGEge0BsaW5rIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9e0Bjb2RlPFQ+fS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBnZXRWYWx1ZU1vZGVsKCkgewotCQlyZXR1cm4gKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4pIHRoaXMudmFsdWVNb2RlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZjgxODMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZUludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogQWJzdHJhY3QgbGlzdCB2YWx1ZSBtb2RlbCB0aGF0IHByb3ZpZGVzIGJlaGF2aW9yIGZvciB3cmFwcGluZyBhIHtAbGluayBMaXN0VmFsdWVNb2RlbH0KLSAqIChvciB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9KSBhbmQgbGlzdGVuaW5nIGZvciBjaGFuZ2VzIHRvIGFzcGVjdHMgb2YgdGhlCi0gKiA8ZW0+aXRlbXM8L2VtPiBoZWxkIGJ5IHRoZSBsaXN0IChvciBjb2xsZWN0aW9uKS4gQ2hhbmdlcyB0byB0aGUgYWN0dWFsIGxpc3QKLSAqIChvciBjb2xsZWN0aW9uKSBhcmUgYWxzbyBtb25pdG9yZWQuCi0gKiAKLSAqIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGEgY29sbGVjdGlvbiBvZiBpdGVtcyB0aGF0IGNhbiBiZSBtb2RpZmllZCBieSBhZGRpbmcKLSAqIG9yIHJlbW92aW5nIGl0ZW1zIG9yIHRoZSBpdGVtcyB0aGVtc2VsdmVzIG1pZ2h0IGNoYW5nZSBpbiBhIGZhc2hpb24gdGhhdAotICogbWlnaHQgY2hhbmdlIHRoZSBsaXN0IG9yIGNvbGxlY3Rpb24ncyBleHRlcm5hbCBhcHBlYXJhbmNlLgotICogCi0gKiBTdWJjbGFzc2VzIG5lZWQgdG8gb3ZlcnJpZGUgdHdvIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlSXRlbV8oTW9kZWwpfTxwPgotICogICAgIGJlZ2luIGxpc3RlbmluZyB0byB0aGUgYXBwcm9wcmlhdGUgYXNwZWN0IG9mIHRoZSBzcGVjaWZpZWQgaXRlbSBhbmQgY2FsbAotICogICAgIHtAbGluayAjaXRlbUFzcGVjdENoYW5nZWQoRXZlbnRPYmplY3QpfSB3aGVuZXZlciB0aGUgYXNwZWN0IGNoYW5nZXMKLSAqIDxsaT57QGxpbmsgI2Rpc2VuZ2FnZUl0ZW1fKE1vZGVsKX08cD4KLSAqICAgICBzdG9wIGxpc3RlbmluZyB0byB0aGUgYXBwcm9wcmlhdGUgYXNwZWN0IG9mIHRoZSBzcGVjaWZpZWQgaXRlbQotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxFPgotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQotCS8qKgotCSAqIE1haW50YWluIGEgY291bnRlciBmb3IgZWFjaCBvZiB0aGUgaXRlbXMgaW4gdGhlCi0JICogd3JhcHBlZCBsaXN0IGhvbGRlciB3ZSBhcmUgbGlzdGVuaW5nIHRvLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJZGVudGl0eUhhc2hNYXA8RSwgU2ltcGxlSW50UmVmZXJlbmNlPiBjb3VudGVyczsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbGlzdCBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHJvdGVjdGVkIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMuY291bnRlcnMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPEUsIFNpbXBsZUludFJlZmVyZW5jZT4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBjb2xsZWN0aW9uIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPih0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlci5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXIudG9BcnJheSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgaG9sZGVyIGFuZCB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCXRoaXMuZW5nYWdlQWxsSXRlbXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VBbGxJdGVtcygpIHsKLQkJdGhpcy5lbmdhZ2VJdGVtcyh0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUl0ZW1zKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcykgewotCQlmb3IgKEUgaXRlbSA6IGl0ZW1zKSB7Ci0JCQl0aGlzLmVuZ2FnZUl0ZW0oaXRlbSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VJdGVtKEUgaXRlbSkgewotCQkvLyBsaXN0ZW4gdG8gZWFjaCBpdGVtIG9ubHkgb25jZQotCQlTaW1wbGVJbnRSZWZlcmVuY2UgY291bnRlciA9IHRoaXMuY291bnRlcnMuZ2V0KGl0ZW0pOwotCQlpZiAoY291bnRlciA9PSBudWxsKSB7Ci0JCQljb3VudGVyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQkJdGhpcy5jb3VudGVycy5wdXQoaXRlbSwgY291bnRlcik7Ci0JCQl0aGlzLmVuZ2FnZUl0ZW1fKChNb2RlbCkgaXRlbSk7Ci0JCX0KLQkJY291bnRlci5pbmNyZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVtLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pOwotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgaG9sZGVyIGFuZCB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlQWxsSXRlbXMoKTsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VBbGxJdGVtcygpIHsKLQkJdGhpcy5kaXNlbmdhZ2VJdGVtcyh0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUl0ZW1zKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcykgewotCQlmb3IgKEUgaXRlbSA6IGl0ZW1zKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZUl0ZW0oaXRlbSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VJdGVtKEUgaXRlbSkgewotCQkvLyBzdG9wIGxpc3RlbmluZyB0byBlYWNoIGl0ZW0gb25seSBvbmNlCi0JCVNpbXBsZUludFJlZmVyZW5jZSBjb3VudGVyID0gdGhpcy5jb3VudGVycy5nZXQoaXRlbSk7Ci0JCWlmIChjb3VudGVyID09IG51bGwpIHsKLQkJCS8vIHNvbWV0aGluZyBpcyB3cm9uZyBpZiB0aGlzIGhhcHBlbnMuLi4gIH5ianYKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm1pc3NpbmcgY291bnRlcjogIiArIGl0ZW0pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGNvdW50ZXIuZGVjcmVtZW50KCkgPT0gMCkgewotCQkJdGhpcy5jb3VudGVycy5yZW1vdmUoaXRlbSk7Ci0JCQl0aGlzLmRpc2VuZ2FnZUl0ZW1fKChNb2RlbCkgaXRlbSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZW0uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGlzZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSk7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBhZGRlZCB0byB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4KLQkgKiBGb3J3YXJkIHRoZSBldmVudCBhbmQgYmVnaW4gbGlzdGVuaW5nIHRvIHRoZSBhZGRlZCBpdGVtcy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkvLyByZS1maXJlIGV2ZW50IHdpdGggdGhlIHdyYXBwZXIgYXMgdGhlIHNvdXJjZQotCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuZW5nYWdlSXRlbXModGhpcy5nZXRJdGVtcyhldmVudCkpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSByZW1vdmVkIGl0ZW1zIGFuZCBmb3J3YXJkIHRoZSBldmVudC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZGlzZW5nYWdlSXRlbXModGhpcy5nZXRJdGVtcyhldmVudCkpOwotCQkvLyByZS1maXJlIGV2ZW50IHdpdGggdGhlIHdyYXBwZXIgYXMgdGhlIHNvdXJjZQotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlcGxhY2VkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSByZW1vdmVkIGl0ZW1zLCBmb3J3YXJkIHRoZSBldmVudCwKLQkgKiBhbmQgYmVnaW4gbGlzdGVuaW5nIHRvIHRoZSBhZGRlZCBpdGVtcy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5kaXNlbmdhZ2VJdGVtcyh0aGlzLmdldE9sZEl0ZW1zKGV2ZW50KSk7Ci0JCS8vIHJlLWZpcmUgZXZlbnQgd2l0aCB0aGUgd3JhcHBlciBhcyB0aGUgc291cmNlCi0JCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5lbmdhZ2VJdGVtcyh0aGlzLmdldE5ld0l0ZW1zKGV2ZW50KSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBtb3ZlZCBpbiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4KLQkgKiBObyBuZWVkIHRvIGNoYW5nZSBhbnkgbGlzdGVuZXJzOyBqdXN0IGZvcndhcmQgdGhlIGV2ZW50LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkvLyByZS1maXJlIGV2ZW50IHdpdGggdGhlIHdyYXBwZXIgYXMgdGhlIHNvdXJjZQotCQl0aGlzLmZpcmVJdGVtc01vdmVkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgbGlzdCBob2xkZXIgd2FzIGNsZWFyZWQuCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHJlbW92ZWQgaXRlbXMgYW5kIGZvcndhcmQgdGhlIGV2ZW50LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIHdlIHNob3VsZCBvbmx5IG5lZWQgdG8gZGlzZW5nYWdlIGVhY2ggaXRlbSBvbmNlLi4uCi0JCS8vIG1ha2UgYSBjb3B5IHRvIHByZXZlbnQgYSBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uCi0JCUNvbGxlY3Rpb248RT4ga2V5cyA9IG5ldyBBcnJheUxpc3Q8RT4odGhpcy5jb3VudGVycy5rZXlTZXQoKSk7Ci0JCXRoaXMuZGlzZW5nYWdlSXRlbXMoa2V5cyk7Ci0JCXRoaXMuY291bnRlcnMuY2xlYXIoKTsKLQkJLy8gcmUtZmlyZSBldmVudCB3aXRoIHRoZSB3cmFwcGVyIGFzIHRoZSBzb3VyY2UKLQkJdGhpcy5maXJlTGlzdENsZWFyZWQoTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIGhhcyBjaGFuZ2VkIGluIHNvbWUgZHJhbWF0aWMgZmFzaGlvbi4KLQkgKiBSZWNvbmZpZ3VyZSBvdXIgbGlzdGVuZXJzIGFuZCBmb3J3YXJkIHRoZSBldmVudC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gd2Ugc2hvdWxkIG9ubHkgbmVlZCB0byBkaXNlbmdhZ2UgZWFjaCBpdGVtIG9uY2UuLi4KLQkJLy8gbWFrZSBhIGNvcHkgdG8gcHJldmVudCBhIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KLQkJQ29sbGVjdGlvbjxFPiBrZXlzID0gbmV3IEFycmF5TGlzdDxFPih0aGlzLmNvdW50ZXJzLmtleVNldCgpKTsKLQkJdGhpcy5kaXNlbmdhZ2VJdGVtcyhrZXlzKTsKLQkJdGhpcy5jb3VudGVycy5jbGVhcigpOwotCQkvLyByZS1maXJlIGV2ZW50IHdpdGggdGhlIHdyYXBwZXIgYXMgdGhlIHNvdXJjZQotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChldmVudC5jbG9uZSh0aGlzKSk7Ci0JCXRoaXMuZW5nYWdlQWxsSXRlbXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaXRlbSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZW0gaGFzIGEgYm91bmQgcHJvcGVydHkgdGhhdCBoYXMgY2hhbmdlZC4KLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2UuIFRoZSBsaXN0ZW5lcnMgd2lsbCBoYXZlIHRvIGRldGVybWluZQotCSAqIHdoZXRoZXIgdGhlIGl0ZW0gYXNwZWN0IGNoYW5nZSBpcyBzaWduaWZpY2FudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtQXNwZWN0Q2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRXZlbnRPYmplY3QgZXZlbnQpIHsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubGlzdEhvbGRlciwgdGhpcy5saXN0SG9sZGVyLnNpemUoKSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUNoYW5nZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUNoYW5nZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDU0ZTYwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1DaGFuZ2VMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkFic3RyYWN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcn0gdG8gbGlzdGVuIHRvIGFsbCBvZiB0aGUgY2hhbmdlcwotICogb2YgZWFjaCBpdGVtIGluIHRoZSB3cmFwcGVkIGxpc3QgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtQ2hhbmdlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci17Ci0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdGhlIGl0ZW1zIGluIHRoZSBsaXN0LiAqLwotCXByb3RlY3RlZCBmaW5hbCBDaGFuZ2VMaXN0ZW5lciBpdGVtQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW1zLgotCSAqLwotCXB1YmxpYyBJdGVtQ2hhbmdlTGlzdFZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMuaXRlbUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZEl0ZW1DaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQ2hhbmdlTGlzdGVuZXIgYnVpbGRJdGVtQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSXRlbUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEl0ZW1DaGFuZ2VMaXN0ZW5lcgotCQlleHRlbmRzIEFic3RyYWN0Q2hhbmdlTGlzdGVuZXIKLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBtb2RlbENoYW5nZWQoQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCUl0ZW1DaGFuZ2VMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSkgewotCQlpdGVtLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuaXRlbUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWl0ZW0ucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5pdGVtQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNzk3MzkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJ9IHRvIGxpc3RlbiB0byBvbmUgb3IgbW9yZSBjb2xsZWN0aW9uCi0gKiBhc3BlY3RzIG9mIGVhY2ggaXRlbSBpbiB0aGUgd3JhcHBlZCBsaXN0IG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLXsKLQotCS8qKiBUaGUgbmFtZXMgb2YgdGhlIGl0ZW1zJyBjb2xsZWN0aW9ucyB0aGF0IHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gY29sbGVjdGlvbk5hbWVzOwotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdGhlIGl0ZW1zIGluIHRoZSBsaXN0LiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaXRlbUNvbGxlY3Rpb25MaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSBDb2xsZWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwgU3RyaW5nLi4uIGNvbGxlY3Rpb25OYW1lcykgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5jb2xsZWN0aW9uTmFtZXMgPSBjb2xsZWN0aW9uTmFtZXM7Ci0JCXRoaXMuaXRlbUNvbGxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRJdGVtQ29sbGVjdGlvbkxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSBDb2xsZWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gY29sbGVjdGlvbkhvbGRlciwgU3RyaW5nLi4uIGNvbGxlY3Rpb25OYW1lcykgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpLCBjb2xsZWN0aW9uTmFtZXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGwgd2UgcmVhbGx5IGNhcmUgYWJvdXQgaXMgdGhlIGZhY3QgdGhhdCBhIENvbGxlY3Rpb24gYXNwZWN0IGhhcyAKLQkgKiBjaGFuZ2VkLiAgRG8gdGhlIHNhbWUgdGhpbmcgbm8gbWF0dGVyIHdoaWNoIGV2ZW50IG9jY3Vycy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkSXRlbUNvbGxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCUl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCUl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbSBjb2xsZWN0aW9uIGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLmNvbGxlY3Rpb25OYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSkgewotCQlmb3IgKFN0cmluZyBjb2xsZWN0aW9uTmFtZSA6IHRoaXMuY29sbGVjdGlvbk5hbWVzKSB7Ci0JCQlpdGVtLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgdGhpcy5pdGVtQ29sbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pIHsKLQkJZm9yIChTdHJpbmcgY29sbGVjdGlvbk5hbWUgOiB0aGlzLmNvbGxlY3Rpb25OYW1lcykgewotCQkJaXRlbS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIHRoaXMuaXRlbUNvbGxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWNhYzJjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyfSB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUgbGlzdAotICogYXNwZWN0cyBvZiBlYWNoIGl0ZW0gaW4gdGhlIHdyYXBwZWQgbGlzdCBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci17Ci0KLQkvKiogVGhlIG5hbWVzIG9mIHRoZSBzdWJqZWN0J3MgbGlzdHMgdGhhdCB3ZSBsaXN0ZW4gdG8uICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIGxpc3ROYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGl0ZW1MaXN0TGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gTGlzdCBhc3BlY3RzLgotCSAqLwotCXB1YmxpYyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLCBTdHJpbmcuLi4gbGlzdE5hbWVzKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLmxpc3ROYW1lcyA9IGxpc3ROYW1lczsKLQkJdGhpcy5pdGVtTGlzdExpc3RlbmVyID0gdGhpcy5idWlsZEl0ZW1MaXN0TGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIExpc3QgYXNwZWN0cy4KLQkgKi8KLQlwdWJsaWMgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gY29sbGVjdGlvbkhvbGRlciwgU3RyaW5nLi4uIGxpc3ROYW1lcykgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpLCBsaXN0TmFtZXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGwgd2UgcmVhbGx5IGNhcmUgYWJvdXQgaXMgdGhlIGZhY3QgdGhhdCB0aGUgTGlzdCBhc3BlY3QgaGFzIAotCSAqIGNoYW5nZWQuICBEbyB0aGUgc2FtZSB0aGluZyBubyBtYXR0ZXIgd2hpY2ggZXZlbnQgb2NjdXJzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRJdGVtTGlzdExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCUl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbSBsaXN0IGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLmxpc3ROYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pIHsKLQkJZm9yIChTdHJpbmcgbGlzdE5hbWUgOiB0aGlzLmxpc3ROYW1lcykgewotCQkJaXRlbS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIHRoaXMuaXRlbUxpc3RMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWZvciAoU3RyaW5nIGxpc3ROYW1lIDogdGhpcy5saXN0TmFtZXMpIHsKLQkJCWl0ZW0ucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCB0aGlzLml0ZW1MaXN0TGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzBhMzY1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcn0gdG8gbGlzdGVuIHRvIG9uZSBvciBtb3JlCi0gKiBwcm9wZXJ0aWVzIG9mIGVhY2ggaXRlbSBpbiB0aGUgd3JhcHBlZCBsaXN0IG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci17Ci0KLQkvKiogVGhlIG5hbWVzIG9mIHRoZSBpdGVtcycgcHJvcGVydGllcyB0aGF0IHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gcHJvcGVydHlOYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpdGVtUHJvcGVydHlMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSBwcm9wZXJ0aWVzLgotCSAqLwotCXB1YmxpYyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwgU3RyaW5nLi4uIHByb3BlcnR5TmFtZXMpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJvcGVydHlOYW1lcyA9IHByb3BlcnR5TmFtZXM7Ci0JCXRoaXMuaXRlbVByb3BlcnR5TGlzdGVuZXIgPSB0aGlzLmJ1aWxkSXRlbVByb3BlcnR5TGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIHByb3BlcnRpZXMuCi0JICovCi0JcHVibGljIEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBjb2xsZWN0aW9uSG9sZGVyLCBTdHJpbmcuLi4gcHJvcGVydHlOYW1lcykgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpLCBwcm9wZXJ0eU5hbWVzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRJdGVtUHJvcGVydHlMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtIHByb3BlcnR5IGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5wcm9wZXJ0eU5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQkKLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSkgewotCQlmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiB0aGlzLnByb3BlcnR5TmFtZXMpIHsKLQkJCWl0ZW0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMuaXRlbVByb3BlcnR5TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSkgewotCQlmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiB0aGlzLnByb3BlcnR5TmFtZXMpIHsKLQkJCWl0ZW0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMuaXRlbVByb3BlcnR5TGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGRjNWVlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJ9IHRvIGxpc3RlbiB0byB0aGUKLSAqICJzdGF0ZSIgb2YgZWFjaCBpdGVtIGluIHRoZSB3cmFwcGVkIGxpc3QgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLXsKLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0YXRlQ2hhbmdlTGlzdGVuZXIgaXRlbVN0YXRlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgaXRlbSBzdGF0ZS4KLQkgKi8KLQlwdWJsaWMgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMuaXRlbVN0YXRlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkSXRlbVN0YXRlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIGl0ZW0gc3RhdGUuCi0JICovCi0JcHVibGljIEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXRoaXMobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4oY29sbGVjdGlvbkhvbGRlcikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZEl0ZW1TdGF0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW0gc3RhdGUgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWl0ZW0uYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLml0ZW1TdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWl0ZW0ucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLml0ZW1TdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1UcmVlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWU1YTk2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1UcmVlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyfSB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUgdHJlZQotICogYXNwZWN0cyBvZiBlYWNoIGl0ZW0gaW4gdGhlIHdyYXBwZWQgbGlzdCBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIEl0ZW1UcmVlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci17Ci0KLQkvKiogVGhlIG5hbWVzIG9mIHRoZSBpdGVtcycgdHJlZSB0aGF0IHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gdHJlZU5hbWVzOwotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdGhlIGl0ZW1zIGluIHRoZSBsaXN0LiAqLwotCXByb3RlY3RlZCBmaW5hbCBUcmVlQ2hhbmdlTGlzdGVuZXIgaXRlbVRyZWVMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSB0cmVlcy4KLQkgKi8KLQlwdWJsaWMgSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwgU3RyaW5nLi4uIHRyZWVOYW1lcykgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy50cmVlTmFtZXMgPSB0cmVlTmFtZXM7Ci0JCXRoaXMuaXRlbVRyZWVMaXN0ZW5lciA9IHRoaXMuYnVpbGRJdGVtVHJlZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSB0cmVlcy4KLQkgKi8KLQlwdWJsaWMgSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gY29sbGVjdGlvbkhvbGRlciwgU3RyaW5nLi4uIHRyZWVOYW1lcykgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpLCB0cmVlTmFtZXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGwgd2UgcmVhbGx5IGNhcmUgYWJvdXQgaXMgdGhlIGZhY3QgdGhhdCBhIHRyZWUgYXNwZWN0IGhhcyAKLQkgKiBjaGFuZ2VkLiAgRG8gdGhlIHNhbWUgdGhpbmcgbm8gbWF0dGVyIHdoaWNoIGV2ZW50IG9jY3Vycy4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZUNoYW5nZUxpc3RlbmVyIGJ1aWxkSXRlbVRyZWVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW0gdHJlZSBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy50cmVlTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pIHsKLQkJZm9yIChTdHJpbmcgdHJlZU5hbWUgOiB0aGlzLnRyZWVOYW1lcykgewotCQkJaXRlbS5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIHRoaXMuaXRlbVRyZWVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWZvciAoU3RyaW5nIHRyZWVOYW1lIDogdGhpcy50cmVlTmFtZXMpIHsKLQkJCWl0ZW0ucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCB0aGlzLml0ZW1UcmVlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0QXNwZWN0QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEFzcGVjdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1ZTk0MC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0QXNwZWN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgZXh0ZW5zaW9uIG9mIHtAbGluayBBc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJ9IHByb3ZpZGVzCi0gKiBiYXNpYyBsaXN0IGNoYW5nZSBzdXBwb3J0LgotICogVGhpcyBjb252ZXJ0cyBhIHNldCBvZiBvbmUgb3IgbW9yZSBsaXN0cyBpbnRvCi0gKiBhIHNpbmdsZSB7QGxpbmsgI0xJU1RfVkFMVUVTfSBsaXN0LgotICogPHA+Ci0gKiBUaGUgdHlwaWNhbCBzdWJjbGFzcyB3aWxsIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyAoc2VlIHRoZSBkZXNjcmlwdGlvbnMKLSAqIGluIHtAbGluayBBc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJ9KTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNsaXN0SXRlcmF0b3JfKCl9Ci0gKiA8bGk+e0BsaW5rICNnZXQoaW50KX0KLSAqIDxsaT57QGxpbmsgI3NpemVfKCl9Ci0gKiA8bGk+e0BsaW5rICN0b0FycmF5XygpfQotICogPGxpPntAbGluayAjbGlzdEl0ZXJhdG9yKCl9Ci0gKiA8bGk+e0BsaW5rICNzaXplKCl9Ci0gKiA8bGk+e0BsaW5rICN0b0FycmF5KCl9Ci0gKiA8L3VsPgotICogCi0gKiBAcGFyYW0gPFM+IHRoZSB0eXBlIG9mIHRoZSBhZGFwdGVyJ3Mgc3ViamVjdAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiB0aGUgYWRhcHRlcidzIGxpc3QncyBlbGVtZW50cwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGlzdEFzcGVjdEFkYXB0ZXI8UyBleHRlbmRzIE1vZGVsLCBFPgotCWV4dGVuZHMgQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFMsIEU+Ci17Ci0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIHN1YmplY3QncyBsaXN0cyB0aGF0IHdlIHVzZSBmb3IgdGhlIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBhc3BlY3ROYW1lczsKLQkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9BU1BFQ1RfTkFNRVMgPSBuZXcgU3RyaW5nWzBdOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3RzLiAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgYXNwZWN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCBsaXN0IGFzcGVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEFzcGVjdEFkYXB0ZXIoU3RyaW5nIGFzcGVjdE5hbWUsIFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdHJpbmdbXSB7YXNwZWN0TmFtZX0sIHN1YmplY3QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCBsaXN0IGFzcGVjdHMuCi0JICovCi0JcHJvdGVjdGVkIExpc3RBc3BlY3RBZGFwdGVyKFN0cmluZ1tdIGFzcGVjdE5hbWVzLCBTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFM+KHN1YmplY3QpLCBhc3BlY3ROYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlcgotCSAqIGFuZCBsaXN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0TW9kZWwsIFN0cmluZy4uLiBhc3BlY3ROYW1lcykgewotCQlzdXBlcihzdWJqZWN0TW9kZWwpOwotCQl0aGlzLmFzcGVjdE5hbWVzID0gYXNwZWN0TmFtZXM7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQXNwZWN0Q2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyCi0JICogYW5kIGxpc3RzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0QXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RNb2RlbCwgQ29sbGVjdGlvbjxTdHJpbmc+IGFzcGVjdE5hbWVzKSB7Ci0JCXRoaXMoc3ViamVjdE1vZGVsLCBhc3BlY3ROYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbYXNwZWN0TmFtZXMuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgYXNwZWN0IGFkYXB0ZXIgZm9yIGFuICJ1bmNoYW5naW5nIiBsaXN0IGluCi0JICogdGhlIHNwZWNpZmllZCBzdWJqZWN0LiBUaGlzIGlzIHVzZWZ1bCBmb3IgYSBsaXN0IGFzcGVjdCB0aGF0IGRvZXMgbm90Ci0JICogY2hhbmdlIGZvciBhIHBhcnRpY3VsYXIgc3ViamVjdDsgYnV0IHRoZSBzdWJqZWN0IHdpbGwgY2hhbmdlLCByZXN1bHRpbmcgaW4KLQkgKiBhIG5ldyBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBMaXN0QXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RNb2RlbCkgewotCQl0aGlzKHN1YmplY3RNb2RlbCwgRU1QVFlfQVNQRUNUX05BTUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZEFzcGVjdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFzcGVjdENoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzdWJqZWN0J3MgbGlzdCBjaGFuZ2UgZXZlbnRzIGludG8ge0BsaW5rICNMSVNUX1ZBTFVFU30KLQkgKiBsaXN0IGNoYW5nZSBldmVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgQXNwZWN0Q2hhbmdlTGlzdGVuZXIKLQkJZXh0ZW5kcyBMaXN0Q2hhbmdlQWRhcHRlcgotCXsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQlMaXN0QXNwZWN0QWRhcHRlci50aGlzLmFzcGVjdEl0ZW1zQWRkZWQoZXZlbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQlMaXN0QXNwZWN0QWRhcHRlci50aGlzLmFzcGVjdEl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJTGlzdEFzcGVjdEFkYXB0ZXIudGhpcy5hc3BlY3RJdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQlMaXN0QXNwZWN0QWRhcHRlci50aGlzLmFzcGVjdEl0ZW1zTW92ZWQoZXZlbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJTGlzdEFzcGVjdEFkYXB0ZXIudGhpcy5hc3BlY3RMaXN0Q2xlYXJlZChldmVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJTGlzdEFzcGVjdEFkYXB0ZXIudGhpcy5hc3BlY3RMaXN0Q2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgbGlzdE5hbWUgOiB0aGlzLmFzcGVjdE5hbWVzKSB7Ci0JCQl0aGlzLnN1YmplY3QuYWRkTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCB0aGlzLmFzcGVjdENoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotICAgIAlmb3IgKFN0cmluZyBsaXN0TmFtZSA6IHRoaXMuYXNwZWN0TmFtZXMpIHsKLQkJCXRoaXMuc3ViamVjdC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIHRoaXMuYXNwZWN0Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGFzcGVjdEl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zQWRkZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhc3BlY3RJdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFzcGVjdEl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYXNwZWN0SXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zTW92ZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhc3BlY3RMaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVMaXN0Q2xlYXJlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFzcGVjdExpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUykpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk5ZWNmOC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBhIHtAbGluayBMaXN0VmFsdWVNb2RlbH0gYmVoYXZlIGxpa2UKLSAqIGEgcmVhZC1vbmx5IHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0sIHNvcnRhLgotICogPHA+Ci0gKiBXZSBrZWVwIGFuIGludGVybmFsIGNvbGxlY3Rpb24gc29tZXdoYXQgaW4gc3luYyB3aXRoIHRoZSB3cmFwcGVkIGxpc3QuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFNpbmNlIHdlIG9ubHkgbGlzdGVuIHRvIHRoZSB3cmFwcGVkIGxpc3Qgd2hlbiB3ZSBoYXZlCi0gKiBsaXN0ZW5lcnMgb3Vyc2VsdmVzIGFuZCB3ZSBjYW4gb25seSBzdGF5IGluIHN5bmMgd2l0aCB0aGUgd3JhcHBlZAotICogbGlzdCB3aGlsZSB3ZSBhcmUgbGlzdGVuaW5nIHRvIGl0LCByZXN1bHRzIHRvIHZhcmlvdXMgbWV0aG9kcwotICogKGUuZy4ge0BsaW5rICNzaXplKCl9LCB7QGxpbmsgI2l0ZXJhdG9yKCl9KSB3aWxsIGJlIHVucHJlZGljdGFibGUgd2hlbmV2ZXIKLSAqIHdlIGRvIG5vdCBoYXZlIGFueSBsaXN0ZW5lcnMuIFRoaXMgc2hvdWxkIG5vdCBiZSB0b28gcGFpbmZ1bCBzaW5jZSwKLSAqIG1vc3QgbGlrZWx5LCBjbGllbnQgb2JqZWN0cyB3aWxsIGFsc28gYmUgbGlzdGVuZXJzLgotICovCi1wdWJsaWMgY2xhc3MgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbAotCWltcGxlbWVudHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLXsKLQkvKiogVGhlIHdyYXBwZWQgbGlzdCB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGZvcndhcmRzIGFueSBldmVudHMgZmlyZWQgYnkgdGhlIGxpc3QgaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogT3VyIGludGVybmFsIGNvbGxlY3Rpb24sIHdoaWNoIGhvbGRzIHRoZSBzYW1lIGVsZW1lbnRzIGFzCi0JICogdGhlIHdyYXBwZWQgbGlzdC4KLQkgKi8KLQkvLyB3ZSBkZWNsYXJlIHRoaXMgYW4gQXJyYXlMaXN0IHNvIHdlIGNhbiB1c2UgI2Nsb25lKCkgYW5kICNlbnN1cmVDYXBhY2l0eShpbnQpCi0JcHJvdGVjdGVkIGZpbmFsIEFycmF5TGlzdDxFPiBjb2xsZWN0aW9uOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgbGlzdCB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdEhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RIb2xkZXIgPSBsaXN0SG9sZGVyOwotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5jb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxFPigpOwotCQkvLyBwb3N0cG9uZSBidWlsZGluZyB0aGUgY29sbGVjdGlvbiBhbmQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGxpc3QKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaGFzIGNoYW5nZWQsIGZvcndhcmQgYW4gZXF1aXZhbGVudAotCSAqIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50IHRvIG91ciBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCUxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJCUxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCUxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQkvLyB0cnkgdG8gcHJldmVudCBiYWNrZG9vciBtb2RpZmljYXRpb24gb2YgdGhlIGxpc3QKLQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPEU+KHRoaXMuY29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uLnNpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCQkvLyBzeW5jIG91ciBjb2xsZWN0aW9uICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IG1vZGVsLAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIGNsZWFyIG91dCB0aGUgY29sbGVjdGlvbiB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlcgotCQl0aGlzLmNvbGxlY3Rpb24uY2xlYXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbih0aGlzLmdldEl0ZW1zKGV2ZW50KSwgdGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKExpc3RBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKHRoaXMuZ2V0SXRlbXMoZXZlbnQpLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0SXRlbXMoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbih0aGlzLmdldE9sZEl0ZW1zKGV2ZW50KSwgdGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCQl0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKHRoaXMuZ2V0TmV3SXRlbXMoZXZlbnQpLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0T2xkSXRlbXMoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRPbGRJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldE5ld0l0ZW1zKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0TmV3SXRlbXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmc/IG1vdmluZyBpdGVtcyBpbiBhIGxpc3QgaGFzIG5vIG5ldCBlZmZlY3Qgb24gYSBjb2xsZWN0aW9uLi4uCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIHB1dCBpbiBlbXB0eSBjaGVjayBzbyB3ZSBkb24ndCBmaXJlIGV2ZW50cyB1bm5lY2Vzc2FyaWx5Ci0JCWlmICggISB0aGlzLmNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb24uY2xlYXIoKTsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKFZBTFVFUyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzeW5jaHJvbml6ZSBvdXIgaW50ZXJuYWwgY29sbGVjdGlvbiB3aXRoIHRoZSB3cmFwcGVkIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5saXN0SG9sZGVyLnNpemUoKSA9PSAwKSB7Ci0JCQlpZiAodGhpcy5jb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCS8vIG5vIGNoYW5nZQotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmNsZWFyQ29sbGVjdGlvbih0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5jb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCXRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCQkJdGhpcy5maXJlSXRlbXNBZGRlZChWQUxVRVMsIHRoaXMuY29sbGVjdGlvbik7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuY29sbGVjdGlvbi5jbGVhcigpOwotCQkJCXRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoVkFMVUVTLCB0aGlzLmNvbGxlY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRDb2xsZWN0aW9uKCkgewotCQkvLyBpZiB0aGUgbmV3IGxpc3QgaXMgZW1wdHksIGRvIG5vdGhpbmcKLQkJaW50IHNpemUgPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCQlpZiAoc2l6ZSAhPSAwKSB7Ci0JCQl0aGlzLmJ1aWxkQ29sbGVjdGlvbihzaXplKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkQ29sbGVjdGlvbihpbnQgc2l6ZSkgewotCQl0aGlzLmNvbGxlY3Rpb24uZW5zdXJlQ2FwYWNpdHkoc2l6ZSk7Ci0JCWZvciAoRSBlYWNoIDogdGhpcy5saXN0SG9sZGVyKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb24uYWRkKGVhY2gpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5jb2xsZWN0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q3VyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEN1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBjZjNlMi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGV4dGVuc2lvbiBvZiB7QGxpbmsgQXNwZWN0QWRhcHRlcn0gcHJvdmlkZXMgbGlzdCBjaGFuZ2Ugc3VwcG9ydAotICogYnkgYWRhcHRpbmcgYSBzdWJqZWN0J3Mgc3RhdGUgY2hhbmdlIGV2ZW50cyB0byBhIG1pbmltdW0gc2V0Ci0gKiBvZiBsaXN0IGNoYW5nZSBldmVudHMuCi0gKiAKLSAqIEBwYXJhbSA8Uz4gdGhlIHR5cGUgb2YgdGhlIGFkYXB0ZXIncyBzdWJqZWN0Ci0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIHRoZSBhZGFwdGVyJ3MgbGlzdCdzIGVsZW1lbnRzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaXN0Q3VyYXRvcjxTIGV4dGVuZHMgTW9kZWwsIEU+Ci0JZXh0ZW5kcyBBc3BlY3RBZGFwdGVyPFMsIExpc3Q8RT4+Ci0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFPgotewotCS8qKiBIb3cgdGhlIGxpc3QgbG9va2VkIGJlZm9yZSB0aGUgbGFzdCBzdGF0ZSBjaGFuZ2UgKi8KLQlwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxFPiByZWNvcmQ7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgZm9yIHRoZSBzdWJqZWN0J3Mgc3RhdGUgdG8gY2hhbmdlICovCi0JcHJpdmF0ZSBmaW5hbCBTdGF0ZUNoYW5nZUxpc3RlbmVyIHN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGN1cmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEN1cmF0b3IoUyBzdWJqZWN0KSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTPihzdWJqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY3VyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IG1vZGVsLgotCSAqIFRoZSBzdWJqZWN0IG1vZGVsIGNhbm5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEN1cmF0b3IoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0TW9kZWwpIHsKLQkJc3VwZXIoc3ViamVjdE1vZGVsKTsKLQkJdGhpcy5yZWNvcmQgPSBuZXcgQXJyYXlMaXN0PEU+KCk7Ci0JCXRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0J3Mgc3RhdGUgaGFzIGNoYW5nZWQsIGRvIGludmVudG9yeSBhbmQgcmVwb3J0IHRvIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU3ViamVjdFN0YXRlQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgU3ViamVjdFN0YXRlQ2hhbmdlTGlzdGVuZXIKLQkJZXh0ZW5kcyBTdGF0ZUNoYW5nZUFkYXB0ZXIKLQl7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJTGlzdEN1cmF0b3IudGhpcy5zdWJtaXRJbnZlbnRvcnlSZXBvcnQoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPih0aGlzLnJlY29yZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhlIHN1YmplY3QncyBsaXN0IGFzcGVjdC4KLQkgKi8KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnJlY29yZC5nZXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVjb3JkLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgbWFuaWZlc3RhdGlvbiBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5yZWNvcmQudG9BcnJheSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0PEU+IGdldEFzcGVjdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5yZWNvcmQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCkgewotCQlyZXR1cm4gTGlzdENoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkgewotCQlyZXR1cm4gTElTVF9WQUxVRVM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYXNwZWN0IGhhcyBjaGFuZ2VkLCBub3RpZnkgbGlzdGVuZXJzIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUFzcGVjdENoYW5nZWQoTGlzdDxFPiBvbGRWYWx1ZSwgTGlzdDxFPiBuZXdWYWx1ZSkgewotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUywgdGhpcy5yZWNvcmQpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0IGlzIG5vdCBudWxsIC0gYWRkIG91ciBsaXN0ZW5lci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIHN5bmMgb3VyIGxpc3QgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHN1YmplY3QsCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5yZWNvcmQsIHRoaXMuaXRlcmF0b3JGb3JSZWNvcmQoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN1YmplY3QgaXMgbm90IG51bGwgLSByZW1vdmUgb3VyIGxpc3RlbmVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotCQkoKE1vZGVsKSB0aGlzLnN1YmplY3QpLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyKTsKLQkJLy8gY2xlYXIgb3V0IHRoZSBsaXN0IHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIHN1YmplY3QKLQkJdGhpcy5yZWNvcmQuY2xlYXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdEN1cmF0b3IgcHJvdG9jb2wgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBkaWZmZXJlbnQgZnJvbSB7QGxpbmsgTGlzdFZhbHVlTW9kZWwjaXRlcmF0b3IoKX0uCi0JICogSXQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbmx5IHdoZW4gdGhlIHN1YmplY3QgY2hhbmdlcyBvciB0aGUKLQkgKiBzdWJqZWN0J3MgInN0YXRlIiBjaGFuZ2VzIChhcyBzaWduaWZpZWQgYnkgYSBzdGF0ZSBjaGFuZ2UgZXZlbnQpLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYXRvcjxFPiBpdGVyYXRvckZvclJlY29yZCgpOwotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXZvaWQgc3VibWl0SW52ZW50b3J5UmVwb3J0KCkgewotCQlMaXN0PEU+IG5ld1JlY29yZCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuaXRlcmF0b3JGb3JSZWNvcmQoKSk7Ci0JCWludCByZWNvcmRJbmRleCA9IDA7Ci0KLQkJLy8gYWRkIGl0ZW1zIGZyb20gdGhlIG5ldyByZWNvcmQKLQkJZm9yIChFIG5ld0l0ZW0gOiBuZXdSZWNvcmQpIHsKLQkJCXRoaXMuaW52ZW50b3J5TmV3SXRlbShyZWNvcmRJbmRleCwgbmV3SXRlbSk7Ci0JCQlyZWNvcmRJbmRleCsrOwotCQl9Ci0KLQkJLy8gY2xlYW4gb3V0IGl0ZW1zIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgbmV3IHJlY29yZAotCQlmb3IgKHJlY29yZEluZGV4ID0gMDsgcmVjb3JkSW5kZXggPCB0aGlzLnJlY29yZC5zaXplKCk7ICkgewotCQkJRSBpdGVtID0gdGhpcy5yZWNvcmQuZ2V0KHJlY29yZEluZGV4KTsKLQotCQkJaWYgKG5ld1JlY29yZC5jb250YWlucyhpdGVtKSkgewotCQkJCXJlY29yZEluZGV4Kys7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMucmVtb3ZlSXRlbUZyb21JbnZlbnRvcnkocmVjb3JkSW5kZXgsIGl0ZW0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludmVudG9yeU5ld0l0ZW0oaW50IHJlY29yZEluZGV4LCBFIG5ld0l0ZW0pIHsKLQkJTGlzdDxFPiByZWMgPSBuZXcgQXJyYXlMaXN0PEU+KHRoaXMucmVjb3JkKTsKLQotCQlpZiAoKHJlY29yZEluZGV4IDwgcmVjLnNpemUoKSkgJiYgcmVjLmdldChyZWNvcmRJbmRleCkuZXF1YWxzKG5ld0l0ZW0pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHJlYy5jb250YWlucyhuZXdJdGVtKSkgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUludmVudG9yeShyZWNvcmRJbmRleCwgcmVjLmdldChyZWNvcmRJbmRleCkpOwotCQkJdGhpcy5pbnZlbnRvcnlOZXdJdGVtKHJlY29yZEluZGV4LCBuZXdJdGVtKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuYWRkSXRlbVRvSW52ZW50b3J5KHJlY29yZEluZGV4LCBuZXdJdGVtKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRJdGVtVG9JbnZlbnRvcnkoaW50IGluZGV4LCBFIGl0ZW0pIHsKLQkJdGhpcy5hZGRJdGVtVG9MaXN0KGluZGV4LCBpdGVtLCB0aGlzLnJlY29yZCwgTElTVF9WQUxVRVMpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVJdGVtRnJvbUludmVudG9yeShpbnQgaW5kZXgsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBFIGl0ZW0pIHsKLQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMucmVjb3JkLCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5yZWNvcmQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTIzODE2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhIGxpc3QgdmFsdWUgbW9kZWwsICJsYXppbHkiIGxpc3RlbiB0byBpdCwgYW5kIGNvbnZlcnQKLSAqIGl0cyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBpbnRvIHByb3BlcnR5IHZhbHVlIG1vZGVsIGNoYW5nZQotICogbm90aWZpY2F0aW9ucy4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlOjx1bD4KLSAqIDxsaT57QGxpbmsgI2J1aWxkVmFsdWUoKX08cD4KLSAqICAgICB0byByZXR1cm4gdGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWUsIGFzIGRlcml2ZWQgZnJvbSB0aGUKLSAqICAgICBjdXJyZW50IGxpc3QgdmFsdWUKLSAqIDwvdWw+Ci0gKiBTdWJjbGFzc2VzIG1pZ2h0IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzCi0gKiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIChieSBub3QgcmVjYWxjdWxhdGluZyB0aGUgdmFsdWUsIGlmIHBvc3NpYmxlKTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCl9Ci0gKiA8bGk+e0BsaW5rICNpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KX0KLSAqIDxsaT57QGxpbmsgI2l0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCl9Ci0gKiA8bGk+e0BsaW5rICNpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpfQotICogPGxpPntAbGluayAjbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpfQotICogPGxpPntAbGluayAjbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KX0KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxUPgotCWV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFQ+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RNb2RlbDsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmMgd2l0aCBjaGFuZ2VzIHRvIHRoZSB3cmFwcGVkIGxpc3QgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0TGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDw/PiBsaXN0TW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RNb2RlbCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RNb2RlbCA9IGxpc3RNb2RlbDsKLQkJdGhpcy5saXN0TGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdExpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgTGlzdExpc3RlbmVyCi0JCWV4dGVuZHMgTGlzdENoYW5nZUFkYXB0ZXIKLQl7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJfQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQlMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQlMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zTW92ZWQoZXZlbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2xlYXJlZChldmVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbF8oKSB7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0TGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbF8oKSB7Ci0JCXRoaXMubGlzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0TGlzdGVuZXIpOwotCX0KLQotCQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RBZGRFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVwbGFjZWQgaW4gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBtb3ZlZCBpbiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBsaXN0IGhvbGRlciB3YXMgY2xlYXJlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlciBoYXMgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0VmFsdWVNb2RlbFdyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTVlZjg4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhbm90aGVyIGxpc3QgdmFsdWUgbW9kZWwsICJsYXppbHkiIGxpc3RlbiB0byBpdCwgYW5kIHByb3BhZ2F0ZQotICogaXRzIGNoYW5nZSBub3RpZmljYXRpb25zLiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBhcHByb3ByaWF0ZQotICoge0BsaW5rIExpc3RWYWx1ZU1vZGVsfS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxFPgotCWV4dGVuZHMgQWJzdHJhY3RMaXN0VmFsdWVNb2RlbAotewotCS8qKiBUaGUgd3JhcHBlZCBsaXN0IHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmMgd2l0aCBjaGFuZ2VzIHRvIHRoZSB3cmFwcGVkIGxpc3QgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbFdyYXBwZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFZhbHVlTW9kZWxXcmFwcGVyLnRoaXMuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5pdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFZhbHVlTW9kZWxXcmFwcGVyLnRoaXMubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFZhbHVlTW9kZWxXcmFwcGVyLnRoaXMubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXRJdGVtcyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXRJdGVtcyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXROZXdJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldE5ld0l0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0T2xkSXRlbXMoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRPbGRJdGVtcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlcGxhY2VkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIG1vdmVkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBsaXN0IGhvbGRlciB3YXMgY2xlYXJlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIgaGFzIGNoYW5nZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL01vZGlmaWFibGVQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTW9kaWZpYWJsZVByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NGE2ODEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTW9kaWZpYWJsZVByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQW4gYWRhcHRlciB0aGF0IGFsbG93cyB1cyB0byBtYWtlIGEge0BsaW5rIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9IGJlaGF2ZSBsaWtlCi0gKiBhIHNpbmdsZS1lbGVtZW50IHtAbGluayBNb2RpZmlhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWx9LCBzb3J0YS4KLSAqIDxwPgotICogSWYgdGhlIHByb3BlcnR5J3MgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4sIGFuIGVtcHR5IGl0ZXJhdG9yIGlzIHJldHVybmVkCi0gKiAoaS5lLiB5b3UgY2FuJ3QgaGF2ZSBhIGNvbGxlY3Rpb24gd2l0aCBhIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnQpLgotICogQWxzbywgb25seSBhIHNpbmdsZS1lbGVtZW50IGNvbGxlY3Rpb24gY2FuIGJlIHdyaXR0ZW4gdG8gdGhlIGFkYXB0ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RpZmlhYmxlUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JaW1wbGVtZW50cyBNb2RpZmlhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLXsKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0byBhIHdyaXRhYmxlCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgTW9kaWZpYWJsZVByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gdmFsdWVIb2xkZXIpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlcyhJdGVyYWJsZTxFPiB2YWx1ZXMpIHsKLQkJSXRlcmF0b3I8RT4gc3RyZWFtID0gdmFsdWVzLml0ZXJhdG9yKCk7Ci0JCWlmIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlFIG5ld1ZhbHVlID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm9uLXNpbmdsZXRvbiBjb2xsZWN0aW9uOiAiICsgdmFsdWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdGhpcy5nZXRWYWx1ZUhvbGRlcigpLnNldFZhbHVlKG5ld1ZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZ2V0VmFsdWVIb2xkZXIoKS5zZXRWYWx1ZShudWxsKTsKLQkJfQotCX0KLQotCS8vIG91ciBjb25zdHJ1Y3RvciB0YWtlcyBvbmx5IHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVscwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+IGdldFZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTW9kaWZpYWJsZVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Nb2RpZmlhYmxlUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY5MDIwNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Nb2RpZmlhYmxlUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIHVzIHRvIG1ha2UgYSB7QGxpbmsgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbH0gYmVoYXZlIGxpa2UKLSAqIGEgc2luZ2xlLWVsZW1lbnQge0BsaW5rIE1vZGlmaWFibGVMaXN0VmFsdWVNb2RlbH0sIHNvcnRhLgotICogPHA+Ci0gKiBJZiB0aGUgcHJvcGVydHkncyB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiwgYW4gZW1wdHkgaXRlcmF0b3IgaXMgcmV0dXJuZWQKLSAqIChpLmUuIHlvdSBjYW4ndCBoYXZlIGEgbGlzdCB3aXRoIGEgPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudCkuCi0gKiBBbHNvLCBvbmx5IGEgc2luZ2xlLWVsZW1lbnQgbGlzdCBjYW4gYmUgd3JpdHRlbiB0byB0aGUgYWRhcHRlci4KLSAqLwotcHVibGljIGNsYXNzIE1vZGlmaWFibGVQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlpbXBsZW1lbnRzIE1vZGlmaWFibGVMaXN0VmFsdWVNb2RlbDxFPgotewotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRvIGEgd3JpdGFibGUKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLgotCSAqLwotCXB1YmxpYyBNb2RpZmlhYmxlUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFdyaXRhYmxlTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0TGlzdFZhbHVlcyhJdGVyYWJsZTxFPiBsaXN0VmFsdWVzKSB7Ci0JCUl0ZXJhdG9yPEU+IHN0cmVhbSA9IGxpc3RWYWx1ZXMuaXRlcmF0b3IoKTsKLQkJaWYgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCUUgbmV3VmFsdWUgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJub24tc2luZ2xldG9uIGxpc3Q6ICIgKyBsaXN0VmFsdWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdGhpcy5nZXRWYWx1ZUhvbGRlcigpLnNldFZhbHVlKG5ld1ZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZ2V0VmFsdWVIb2xkZXIoKS5zZXRWYWx1ZShudWxsKTsKLQkJfQotCX0KLQotCS8vIG91ciBjb25zdHJ1Y3RvciB0YWtlcyBvbmx5IHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVscwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+IGdldFZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExMDYxYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIHJlYWQtb25seSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGZvciB3aGVuIHlvdQotICogZG9uJ3QgbmVlZCB0byBzdXBwb3J0IGEgY29sbGVjdGlvbi4gSW4gcGFydGljdWxhciwgdGhpcwotICogaXMgdXNlZnVsIGZvciB0aGUgbGVhZiBub2RlcyBvZiBhIHRyZWUgdGhhdCBuZXZlciBoYXZlCi0gKiBjaGlsZHJlbi4KLSAqIDxwPgotICogV2UgZG9uJ3QgdXNlIGEgc2luZ2xldG9uIGJlY2F1c2Ugd2UgaG9sZCBvbiB0byBsaXN0ZW5lcnMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBOdWxsQ29sbGVjdGlvblZhbHVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIAlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxMaXN0VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbExpc3RWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ODAxY2MuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbExpc3RWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGVtcHR5IGxpc3QgdmFsdWUgbW9kZWwgZm9yIHdoZW4geW91IGRvbid0Ci0gKiBuZWVkIHRvIHN1cHBvcnQgYSBsaXN0LgotICogPHA+Ci0gKiBXZSBkb24ndCB1c2UgYSBzaW5nbGV0b24gYmVjYXVzZSB3ZSBob2xkIG9uIHRvIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxMaXN0VmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBOdWxsTGlzdFZhbHVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsgIiwgU2l6ZTogMCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIEVNUFRZX0FSUkFZOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTgzMzI1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIHByb3BlcnR5IHZhbHVlIG1vZGVsIGZvciB3aGVuIHlvdQotICogZG9uJ3QgbmVlZCB0byBzdXBwb3J0IGEgdmFsdWUuCi0gKiA8cD4KLSAqIFdlIGRvbid0IHVzZSBhIHNpbmdsZXRvbiBiZWNhdXNlIHdlIGhvbGQgb24gdG8gbGlzdGVuZXJzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbFByb3BlcnR5VmFsdWVNb2RlbDxUPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+LCBTZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIE51bGxQcm9wZXJ0eVZhbHVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBUIGdldFZhbHVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsVHJlZVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxUcmVlVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDRiOTYwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxUcmVlVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlRyZWVWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgdHJlZSB2YWx1ZSBtb2RlbCBmb3Igd2hlbiB5b3UKLSAqIGRvbid0IG5lZWQgdG8gc3VwcG9ydCBhbnkgbm9kZXMuCi0gKiA8cD4KLSAqIFdlIGRvbid0IHVzZSBhIHNpbmdsZXRvbiBiZWNhdXNlIHdlIGhvbGQgb24gdG8gbGlzdGVuZXJzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbFRyZWVWYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBUcmVlVmFsdWVNb2RlbDxFPgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTnVsbFRyZWVWYWx1ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogVHJlZVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IG5vZGVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlBc3BlY3RBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU5NjkwNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyB7QGxpbmsgQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcn0gcHJvdmlkZXMgYmFzaWMgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQuCi0gKiBUaGlzIGNvbnZlcnRzIGEgc2V0IG9mIG9uZSBvciBtb3JlIHN0YW5kYXJkIHByb3BlcnRpZXMgaW50bwotICogYSBzaW5nbGUge0BsaW5rICNWQUxVRX0gcHJvcGVydHkuCi0gKiA8cD4KLSAqIFRoZSB0eXBpY2FsIHN1YmNsYXNzIHdpbGwgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzIChzZWUgdGhlIGRlc2NyaXB0aW9ucwotICogaW4ge0BsaW5rIEFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXJ9KTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNidWlsZFZhbHVlXygpfQotICogPGxpPntAbGluayAjc2V0VmFsdWVfKE9iamVjdCl9Ci0gKiA8bGk+e0BsaW5rICNidWlsZFZhbHVlKCl9Ci0gKiA8bGk+e0BsaW5rICNzZXRWYWx1ZShPYmplY3QpfQotICogPC91bD4KLSAqIAotICogQHBhcmFtIDxTPiB0aGUgdHlwZSBvZiB0aGUgbW9kZWwncyBzdWJqZWN0Ci0gKiBAcGFyYW0gPFY+IHRoZSB0eXBlIG9mIHRoZSBzdWJqZWN0J3MgcHJvcGVydHkgYXNwZWN0Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UyBleHRlbmRzIE1vZGVsLCBWPgotCWV4dGVuZHMgQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxTLCBWPgotewotCS8qKiBUaGUgbmFtZSBvZiB0aGUgc3ViamVjdCdzIHByb3BlcnRpZXMgdGhhdCB3ZSB1c2UgZm9yIHRoZSB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gYXNwZWN0TmFtZXM7Ci0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfQVNQRUNUX05BTUVTID0gbmV3IFN0cmluZ1swXTsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB0aGUgYXBwcm9wcmlhdGUgcHJvcGVydGllcyBvZiB0aGUgc3ViamVjdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBhc3BlY3RDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCBwcm9wZXJ0eSBhc3BlY3QuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5QXNwZWN0QWRhcHRlcihTdHJpbmcgYXNwZWN0TmFtZSwgUyBzdWJqZWN0KSB7Ci0JCXRoaXMobmV3IFN0cmluZ1tdIHthc3BlY3ROYW1lfSwgc3ViamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCBwcm9wZXJ0eSBhc3BlY3RzLgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIoU3RyaW5nW10gYXNwZWN0TmFtZXMsIFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8Uz4oc3ViamVjdCksIGFzcGVjdE5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IG1vZGVsCi0JICogYW5kIHByb3BlcnR5IGFzcGVjdHMuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5QXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RNb2RlbCwgU3RyaW5nLi4uIGFzcGVjdE5hbWVzKSB7Ci0JCXN1cGVyKHN1YmplY3RNb2RlbCk7Ci0JCXRoaXMuYXNwZWN0TmFtZXMgPSBhc3BlY3ROYW1lczsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRBc3BlY3RDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgbW9kZWwKLQkgKiBhbmQgcHJvcGVydHkgYXNwZWN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdE1vZGVsLCBDb2xsZWN0aW9uPFN0cmluZz4gYXNwZWN0TmFtZXMpIHsKLQkJdGhpcyhzdWJqZWN0TW9kZWwsIGFzcGVjdE5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1thc3BlY3ROYW1lcy5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgYXNwZWN0IGFkYXB0ZXIgZm9yIGFuICJ1bmNoYW5naW5nIiBwcm9wZXJ0eSBhc3BlY3QgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIHN1YmplY3QuIFRoaXMgaXMgdXNlZnVsIGZvciBhIHByb3BlcnR5IGFzcGVjdCB0aGF0IGRvZXMgbm90Ci0JICogY2hhbmdlIGZvciBhIHBhcnRpY3VsYXIgc3ViamVjdDsgYnV0IHRoZSBzdWJqZWN0IHdpbGwgY2hhbmdlLCByZXN1bHRpbmcgaW4KLQkgKiBhIG5ldyBwcm9wZXJ0eS4gKEEge0BsaW5rIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsfSBjb3VsZCBhbHNvIGJlCi0JICogdXNlZCBpbiB0aGlzIHNpdHVhdGlvbi4pCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5QXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RNb2RlbCkgewotCQl0aGlzKHN1YmplY3RNb2RlbCwgRU1QVFlfQVNQRUNUX05BTUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRBc3BlY3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBc3BlY3RDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgc3ViamVjdCdzIHByb3BlcnR5IGNoYW5nZSBldmVudHMgaW50bwotCSAqIHtAbGluayAjVkFMVUV9IHByb3BlcnR5IGNoYW5nZSBldmVudHMuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEFzcGVjdENoYW5nZUxpc3RlbmVyCi0JCWV4dGVuZHMgUHJvcGVydHlDaGFuZ2VBZGFwdGVyCi0JewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCVByb3BlcnR5QXNwZWN0QWRhcHRlci50aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdF8oKSB7Ci0gICAgCWZvciAoU3RyaW5nIHByb3BlcnR5TmFtZSA6IHRoaXMuYXNwZWN0TmFtZXMpIHsKLQkJCXRoaXMuc3ViamVjdC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgdGhpcy5hc3BlY3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5hc3BlY3ROYW1lcykgewotCQkJdGhpcy5zdWJqZWN0LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCB0aGlzLmFzcGVjdENoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzcGVjdENoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YWYzMDcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBhIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9IGJlaGF2ZSBsaWtlCi0gKiBhIHJlYWQtb25seSwgc2luZ2xlLWVsZW1lbnQge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfSwgc29ydGEuCi0gKiA8cD4KLSAqIElmIHRoZSBwcm9wZXJ0eSdzIHZhbHVlIGlzIG51bGwsIGFuIGVtcHR5IGl0ZXJhdG9yIGlzIHJldHVybmVkCi0gKiAoaS5lLiB5b3UgY2FuJ3QgaGF2ZSBhIGNvbGxlY3Rpb24gd2l0aCBhIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnQpLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvblZhbHVlTW9kZWwKLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIHByb3BlcnR5IHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IHZhbHVlSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBmb3J3YXJkcyBhbnkgZXZlbnRzIGZpcmVkIGJ5IHRoZSB2YWx1ZSBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKiBDYWNoZSB0aGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIEUgdmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0byBhIGNvbGxlY3Rpb24KLQkgKiB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcigpOwotCQlpZiAodmFsdWVIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy52YWx1ZUhvbGRlciA9IHZhbHVlSG9sZGVyOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQkJLy8gcG9zdHBvbmUgYnVpbGRpbmcgdGhlIHZhbHVlIGFuZCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgdmFsdWUgaGFzIGNoYW5nZWQsIGZvcndhcmQgYW4gZXF1aXZhbGVudAotCSAqIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50IHRvIG91ciBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJCUUgZXZlbnROZXdWYWx1ZSA9IChFKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCVByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLnRoaXMudmFsdWVDaGFuZ2VkKGV2ZW50TmV3VmFsdWUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuPEU+aW5zdGFuY2UoKSA6IHRoaXMuaXRlcmF0b3JfKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yXygpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4odGhpcy52YWx1ZSk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gbnVsbCkgPyAwIDogMTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy52YWx1ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJLy8gc3luYyBvdXIgdmFsdWUgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHZhbHVlIG1vZGVsLAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLnZhbHVlID0gdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkvLyBjbGVhciBvdXQgdGhlIHZhbHVlIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIHZhbHVlIGhvbGRlcgotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogc3luY2hyb25pemUgb3VyIGludGVybmFsIHZhbHVlIHdpdGggdGhlIHdyYXBwZWQgdmFsdWUKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKEUgbmV3VmFsdWUpIHsKLQkJRSBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKG9sZFZhbHVlID09IG51bGwpIHsKLQkJCS8vIHdlIHdvdWxkbid0IGdldCB0aGUgZXZlbnQgaWYgdGhlIG5ldyB2YWx1ZSB3ZXJlIG51bGwgdG9vCi0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoVkFMVUVTLCBuZXdWYWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKFZBTFVFUywgb2xkVmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyB3ZSB3b3VsZG4ndCBnZXQgdGhlIGV2ZW50IGlmIHRoZSBuZXcgdmFsdWUgd2FzIHRoZSBzYW1lIGFzIHRoZSBvbGQKLQkJCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChWQUxVRVMsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihuZXdWYWx1ZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODQ1ZDRmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIHVzIHRvIG1ha2UgYSB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfSBiZWhhdmUgbGlrZQotICogYSByZWFkLW9ubHksIHNpbmdsZS1lbGVtZW50IHtAbGluayBMaXN0VmFsdWVNb2RlbH0sIHNvcnRhLgotICogPHA+Ci0gKiBJZiB0aGUgcHJvcGVydHkncyB2YWx1ZSBpcyBudWxsLCBhbiBlbXB0eSBpdGVyYXRvciBpcyByZXR1cm5lZAotICogKGkuZS4geW91IGNhbid0IGhhdmUgYSBjb2xsZWN0aW9uIHdpdGggYSA8Y29kZT5udWxsPC9jb2RlPiBlbGVtZW50KS4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdExpc3RWYWx1ZU1vZGVsCi0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFPgotewotCS8qKiBUaGUgd3JhcHBlZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiB2YWx1ZUhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgZm9yd2FyZHMgYW55IGV2ZW50cyBmaXJlZCBieSB0aGUgdmFsdWUgaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKiogQ2FjaGUgdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBFIHZhbHVlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgdmFsdWUgbW9kZWwgdG8gYSBsaXN0Ci0JICogdmFsdWUgbW9kZWwuCi0JICovCi0JcHVibGljIFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gdmFsdWVIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHZhbHVlSG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSB2YWx1ZUhvbGRlcjsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJLy8gcG9zdHBvbmUgYnVpbGRpbmcgdGhlIHZhbHVlIGFuZCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgdmFsdWUgaGFzIGNoYW5nZWQsIGZvcndhcmQgYW4gZXF1aXZhbGVudAotCSAqIGxpc3QgY2hhbmdlIGV2ZW50IHRvIG91ciBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJCUUgZXZlbnROZXdWYWx1ZSA9IChFKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMudmFsdWVDaGFuZ2VkKGV2ZW50TmV3VmFsdWUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gbnVsbCkgPwotCQkJCQlFbXB0eUxpc3RJdGVyYXRvci48RT5pbnN0YW5jZSgpCi0JCQkJOgotCQkJCQluZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxFPih0aGlzLnZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSBudWxsKSA/IDAgOiAxOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJaWYgKHRoaXMudmFsdWUgPT0gbnVsbCkgewotCQkJdGhyb3cgdGhpcy5idWlsZElPT0JFKGluZGV4LCAwKTsKLQkJfQotCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQl0aHJvdyB0aGlzLmJ1aWxkSU9PQkUoaW5kZXgsIDEpOwotCQl9Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfT0JKRUNUX0FSUkFZID0gbmV3IE9iamVjdFswXTsKLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IG51bGwpID8gRU1QVFlfT0JKRUNUX0FSUkFZIDogbmV3IE9iamVjdFtdIHt0aGlzLnZhbHVlfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gYnVpbGRJT09CRShpbnQgaW5kZXgsIGludCBzaXplKSB7Ci0JCXJldHVybiBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArICIsIFNpemU6ICIgKyBzaXplKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMudmFsdWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIHN5bmMgb3VyIHZhbHVlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB2YWx1ZSBtb2RlbCwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy52YWx1ZSA9IHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy52YWx1ZUhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJLy8gY2xlYXIgb3V0IHRoZSB2YWx1ZSB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSB2YWx1ZSBob2xkZXIKLQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogc3luY2hyb25pemUgb3VyIGludGVybmFsIHZhbHVlIHdpdGggdGhlIHdyYXBwZWQgdmFsdWUKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKEUgbmV3VmFsdWUpIHsKLQkJRSBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKG9sZFZhbHVlID09IG51bGwpIHsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChMSVNUX1ZBTFVFUywgMCwgbmV3VmFsdWUpOwotCQl9IGVsc2UgewotCQkJaWYgKG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChMSVNUX1ZBTFVFUywgMCwgb2xkVmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmZpcmVJdGVtUmVwbGFjZWQoTElTVF9WQUxVRVMsIDAsIG5ld1ZhbHVlLCBvbGRWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWJjNTY5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBpbmZyYXN0cnVjdHVyZSBuZWVkZWQgdG8gd3JhcAotICogYW5vdGhlciBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgcHJvcGFnYXRlCi0gKiBpdHMgY2hhbmdlIG5vdGlmaWNhdGlvbnMuIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGFwcHJvcHJpYXRlCi0gKiB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfS4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBvbmUgb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzOjx1bD4KLSAqIDxsaT57QGxpbmsgI3dyYXBwZWRWYWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCl9PHA+Ci0gKiAgICAgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHByb3BhZ2F0ZSB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbgotICogPGxpPntAbGluayAjd3JhcHBlZFZhbHVlQ2hhbmdlZChPYmplY3QsIE9iamVjdCkgdmFsdWVDaGFuZ2VkKFYsIFYpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBwcm9wYWdhdGUgdGhlIGFwcHJvcHJpYXRlIGNoYW5nZSBub3RpZmljYXRpb24KLSAqIDwvdWw+Ci0gKiAKLSAqIEBwYXJhbSA8Vj4gdGhlIHR5cGUgb2YgdGhlIDxlbT53cmFwcGVkPC9lbT4gbW9kZWwncyB2YWx1ZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlcjxWPgotCWV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWwKLXsKLQkvKiogVGhlIHdyYXBwZWQgcHJvcGVydHkgdmFsdWUgbW9kZWwuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFY+IHZhbHVlTW9kZWw7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jIHdpdGggY2hhbmdlcyB0byB0aGUgd3JhcHBlZCB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB2YWx1ZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVj4gdmFsdWVNb2RlbCkgewotCQlzdXBlcigpOwotCQlpZiAodmFsdWVNb2RlbCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnZhbHVlTW9kZWwgPSB2YWx1ZU1vZGVsOwotCQl0aGlzLnZhbHVlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBWYWx1ZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyBjbGFzcyBWYWx1ZUxpc3RlbmVyCi0JCWV4dGVuZHMgUHJvcGVydHlDaGFuZ2VBZGFwdGVyCi0JewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIudGhpcy53cmFwcGVkVmFsdWVDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW4gdG8gd3JhcHBlZCB2YWx1ZSBtb2RlbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCZWdpbiBsaXN0ZW5pbmcgdG8gdGhlIHZhbHVlIGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy52YWx1ZU1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnZhbHVlTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSB2YWx1ZSBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMudmFsdWVNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy52YWx1ZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSB3cmFwcGVkIHZhbHVlIG1vZGVsIGhhcyBjaGFuZ2VkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqIEBzZWUgI3dyYXBwZWRWYWx1ZUNoYW5nZWQoT2JqZWN0LCBPYmplY3QpCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHZvaWQgd3JhcHBlZFZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMud3JhcHBlZFZhbHVlQ2hhbmdlZCgoVikgZXZlbnQuZ2V0T2xkVmFsdWUoKSwgKFYpIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgd3JhcHBlZCB2YWx1ZSBtb2RlbCBoYXMgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKiBAc2VlICN3cmFwcGVkVmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgd3JhcHBlZFZhbHVlQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgViBvbGRWYWx1ZSwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFYgbmV3VmFsdWUpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1JlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9SZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzdmYmM3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1JlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9IHRoYXQgYWN0dWFsbHkKLSAqIC4uLiA8ZW0+aXNuJ3Q8L2VtPiAuLi4gd3JpdGFibGUuICBJdCBjYW4gaG93ZXZlciBiZSB1c2VkIGluIHBsYWNlcyB0aGF0IHJlcXVpcmUgYSAKLSAqIHtAbGluayBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfSBhbmQgd2hlcmUgdGhlIGRldmVsb3BlciBpcyBzdXJlIHRoYXQgbm8gCi0gKiBhdHRlbXB0IHdpbGwgYmUgbWFkZSB0byB3cml0ZSB0byBpdC4KLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFQ+Ci0JZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFQ+Ci0JaW1wbGVtZW50cyBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0JcHVibGljIFJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gdmFsdWVNb2RlbCkgewotCQlzdXBlcih2YWx1ZU1vZGVsKTsKLQl9Ci0KLQotCXB1YmxpYyBUIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZU1vZGVsLmdldFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB3cmFwcGVkVmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmNsb25lKHRoaXMpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldFZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NldENvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TZXRDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmFjMmMxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NldENvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPlNldENvbGxlY3Rpb25WYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9IGFuZCByZXR1cm5zIHRoZSBpdGVtcyBpbiB0aGUgY29sbGVjdGlvbgotICogb25seSBvbmNlLgotICovCi1wdWJsaWMgY2xhc3MgU2V0Q29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlcjxFPgotCWltcGxlbWVudHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEhhc2hCYWc8RT4gYmFnID0gbmV3IEhhc2hCYWc8RT4oKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgYW5kIGEgZmlsdGVyIHRoYXQgc2ltcGx5IGFjY2VwdHMgZXZlcnkgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQlzdXBlcihjb2xsZWN0aW9uSG9sZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogbGlzdCB2YWx1ZSBtb2RlbCBhbmQgYSBmaWx0ZXIgdGhhdCBzaW1wbHkgYWNjZXB0cyBldmVyeSBvYmplY3QuCi0JICovCi0JcHVibGljIFNldENvbGxlY3Rpb25WYWx1ZU1vZGVsKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIpIHsKLQkJdGhpcyhuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFPihsaXN0SG9sZGVyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPEU+KHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnVuaXF1ZUNvdW50KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlciBvdmVycmlkZXMvaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCS8vIHN5bmMgb3VyIGNhY2hlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgY29sbGVjdGlvbiwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmJhZywgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQkJLy8gY2xlYXIgb3V0IHRoZSBjYWNoZSB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgY29sbGVjdGlvbgotCQl0aGlzLmJhZy5jbGVhcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCUFycmF5TGlzdDxFPiBhZGRlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFPihldmVudC5nZXRJdGVtc1NpemUoKSk7Ci0JCWludCB1bmlxdWVDb3VudCA9IHRoaXMuYmFnLnVuaXF1ZUNvdW50KCk7Ci0JCWZvciAoRSBpdGVtIDogdGhpcy5nZXRJdGVtcyhldmVudCkpIHsKLQkJCXRoaXMuYmFnLmFkZChpdGVtKTsKLQkJCWlmICh0aGlzLmJhZy51bmlxdWVDb3VudCgpID4gdW5pcXVlQ291bnQpIHsKLQkJCQl1bmlxdWVDb3VudCA9IHRoaXMuYmFnLnVuaXF1ZUNvdW50KCk7Ci0JCQkJYWRkZWRJdGVtcy5hZGQoaXRlbSk7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5maXJlSXRlbXNBZGRlZChWQUxVRVMsIGFkZGVkSXRlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJQXJyYXlMaXN0PEU+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RT4oZXZlbnQuZ2V0SXRlbXNTaXplKCkpOwotCQlpbnQgdW5pcXVlQ291bnQgPSB0aGlzLmJhZy51bmlxdWVDb3VudCgpOwotCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0SXRlbXMoZXZlbnQpKSB7Ci0JCQlpZiAodGhpcy5iYWcucmVtb3ZlKGl0ZW0pKSB7Ci0JCQkJaWYgKHRoaXMuYmFnLnVuaXF1ZUNvdW50KCkgPCB1bmlxdWVDb3VudCkgewotCQkJCQl1bmlxdWVDb3VudCA9IHRoaXMuYmFnLnVuaXF1ZUNvdW50KCk7Ci0JCQkJCXJlbW92ZWRJdGVtcy5hZGQoaXRlbSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtaXNzaW5nIGl0ZW06ICIgKyBpdGVtKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChWQUxVRVMsIHJlbW92ZWRJdGVtcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jbGVhckNvbGxlY3Rpb24odGhpcy5iYWcsIFZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5iYWcsIHRoaXMuY29sbGVjdGlvbkhvbGRlcik7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgbmV3IEhhc2hTZXQ8RT4odGhpcy5iYWcpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NGUwMmQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIE1vZGlmaWFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbH0gYW5kIHtAbGluayBDb2xsZWN0aW9ufQotICogdGhhdCBzaW1wbHkgaG9sZHMgYSBjb2xsZWN0aW9uIGFuZCBub3RpZmllcyBsaXN0ZW5lcnMgb2YgYW55IGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgTW9kaWZpYWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+LCBDb2xsZWN0aW9uPEU+Ci17Ci0JLyoqIFRoZSBjb2xsZWN0aW9uLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb247Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWwoQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIGFuIGVtcHR5IGluaXRpYWwgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWwoKSB7Ci0JCXRoaXMobmV3IEhhc2hCYWc8RT4oKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzLCBWQUxVRVMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxJdGVyYXRvcjxFPih0aGlzLmNvbGxlY3Rpb24uaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uLnNpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGxvdyB0aGUgY29sbGVjdGlvbidzIGVsZW1lbnRzIHRvIGJlIHJlcGxhY2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlcyhJdGVyYWJsZTxFPiB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmNvbGxlY3Rpb24uY2xlYXIoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmNvbGxlY3Rpb24sIHZhbHVlcyk7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgdGhpcy5jb2xsZWN0aW9uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uLmNvbnRhaW5zKG8pOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uLnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgPFQgZXh0ZW5kcyBPYmplY3Q+IFRbXSB0b0FycmF5KFRbXSBhKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb24udG9BcnJheShhKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvKSB7Ci0JCXJldHVybiB0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24obywgdGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24obywgdGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uLmNvbnRhaW5zQWxsKGMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKGMsIHRoaXMuY29sbGVjdGlvbiwgVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oYywgdGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oYywgdGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQl0aGlzLmNsZWFyQ29sbGVjdGlvbih0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvID09IHRoaXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICgobyBpbnN0YW5jZW9mIENvbGxlY3Rpb248Pz4pICYmIChvIGluc3RhbmNlb2YgQ29sbGVjdGlvblZhbHVlTW9kZWw8Pz4pKSB7Ci0JCQlDb2xsZWN0aW9uPEU+IGMxID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5jb2xsZWN0aW9uKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJQ29sbGVjdGlvbjxFPiBjMiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKCgoQ29sbGVjdGlvbjxFPikgbykuaXRlcmF0b3IoKSk7Ci0JCQlyZXR1cm4gYzEuZXF1YWxzKGMyKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuY29sbGVjdGlvbikuaGFzaENvZGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzY2VsbGFuZW91cyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmNvbGxlY3Rpb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpdGVyYXRvciAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIExvY2FsSXRlcmF0b3I8VD4gaW1wbGVtZW50cyBJdGVyYXRvcjxUPiB7Ci0JCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8VD4gaXRlcmF0b3I7Ci0JCXByaXZhdGUgVCBuZXh0OwotCi0JCUxvY2FsSXRlcmF0b3IoSXRlcmF0b3I8VD4gaXRlcmF0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCQl9Ci0KLQkJcHVibGljIFQgbmV4dCgpIHsKLQkJCXJldHVybiB0aGlzLm5leHQgPSB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJzeW50aGV0aWMtYWNjZXNzIikKLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhpcy5pdGVyYXRvci5yZW1vdmUoKTsKLQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLnRoaXMuZmlyZUl0ZW1SZW1vdmVkKFZBTFVFUywgdGhpcy5uZXh0KTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVMaXN0VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlTGlzdFZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE2MGMyNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVMaXN0VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLlNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVMaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9IGFuZCB7QGxpbmsgTGlzdH0gdGhhdCBzaW1wbHkgaG9sZHMgYQotICogbGlzdCBhbmQgbm90aWZpZXMgbGlzdGVuZXJzIG9mIGFueSBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlTGlzdFZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIE1vZGlmaWFibGVMaXN0VmFsdWVNb2RlbDxFPiwgTGlzdDxFPgotewotCS8qKiBUaGUgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgTGlzdDxFPiBsaXN0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IHZhbHVlIG1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHVibGljIFNpbXBsZUxpc3RWYWx1ZU1vZGVsKExpc3Q8RT4gbGlzdCkgewotCQlzdXBlcigpOwotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3QgPSBsaXN0OwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCBhbiBlbXB0eSBpbml0aWFsIGxpc3QuCi0JICovCi0JcHVibGljIFNpbXBsZUxpc3RWYWx1ZU1vZGVsKCkgewotCQl0aGlzKG5ldyBBcnJheUxpc3Q8RT4oKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgTGlzdENoYW5nZUxpc3RlbmVyLmNsYXNzLCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbEl0ZXJhdG9yPEU+KHRoaXMubGlzdC5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbExpc3RJdGVyYXRvcjxFPih0aGlzLmxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5zaXplKCk7Ci0JfQotCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0LmdldChpbmRleCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFdyaXRhYmxlTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQWxsb3cgdGhlIGxpc3QncyBlbGVtZW50cyB0byBiZSByZXBsYWNlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0VmFsdWVzKEl0ZXJhYmxlPEU+IGxpc3QpIHsKLQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5saXN0LCBsaXN0KTsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIHRoaXMubGlzdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5jb250YWlucyhvKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIDxUIGV4dGVuZHMgT2JqZWN0PiBUW10gdG9BcnJheShUW10gYSkgewotCQlyZXR1cm4gdGhpcy5saXN0LnRvQXJyYXkoYSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbykgewotCQlyZXR1cm4gdGhpcy5hZGRJdGVtVG9MaXN0KG8sIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QobywgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuY29udGFpbnNBbGwoYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0xpc3QoYywgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvTGlzdChpbmRleCwgYywgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KGMsIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkxpc3QoYywgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRoaXMuY2xlYXJMaXN0KHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyA9PSB0aGlzKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoKG8gaW5zdGFuY2VvZiBMaXN0PD8+KSAmJiAobyBpbnN0YW5jZW9mIExpc3RWYWx1ZU1vZGVsPD8+KSkgewotCQkJTGlzdDxFPiBsMSA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubGlzdCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUxpc3Q8RT4gbDIgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCgoKExpc3Q8RT4pIG8pLml0ZXJhdG9yKCkpOwotCQkJcmV0dXJuIGwxLmVxdWFscyhsMik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuaGFzaENvZGUoKTsKLQl9Ci0KLQlwdWJsaWMgRSBzZXQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRoaXMuc2V0SXRlbUluTGlzdChpbmRleCwgZWxlbWVudCwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgRSBlbGVtZW50KSB7Ci0JCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgZWxlbWVudCwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIEUgcmVtb3ZlKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCXB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0LmluZGV4T2Yobyk7Ci0JfQotCi0JcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0Lmxhc3RJbmRleE9mKG8pOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IExvY2FsTGlzdEl0ZXJhdG9yPEU+KHRoaXMubGlzdC5saXN0SXRlcmF0b3IoaW5kZXgpKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxFPiBzdWJMaXN0KGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCS8vIFRPRE8gaG1tbSAgfmJqdgotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkaXRpb25hbCBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBNb3ZlIGEgc2luZ2xlIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgbW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLm1vdmVJdGVtSW5MaXN0KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBhIHN1Yi1saXN0IG9mIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJdGhpcy5tb3ZlSXRlbXNJbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgsIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIHJhbmdlIG9mIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KGluZGV4LCBsZW5ndGgsIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFNldCBhIHJhbmdlIG9mIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldChpbnQgaW5kZXgsIExpc3Q8RT4gZWxlbWVudHMpIHsKLQkJdGhpcy5zZXRJdGVtc0luTGlzdChpbmRleCwgZWxlbWVudHMsIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubGlzdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGl0ZXJhdG9ycyAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIExvY2FsSXRlcmF0b3I8VD4gaW1wbGVtZW50cyBJdGVyYXRvcjxUPiB7Ci0JCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8VD4gaXRlcmF0b3I7Ci0JCXByaXZhdGUgaW50IGluZGV4ID0gLTE7Ci0JCXByaXZhdGUgVCBuZXh0OwotCi0JCUxvY2FsSXRlcmF0b3IoSXRlcmF0b3I8VD4gaXRlcmF0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCQl9Ci0KLQkJcHVibGljIFQgbmV4dCgpIHsKLQkJCXRoaXMubmV4dCA9IHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCQkJdGhpcy5pbmRleCsrOwotCQkJcmV0dXJuIHRoaXMubmV4dDsKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJzeW50aGV0aWMtYWNjZXNzIikKLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhpcy5pdGVyYXRvci5yZW1vdmUoKTsKLQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsLnRoaXMuZmlyZUl0ZW1SZW1vdmVkKExJU1RfVkFMVUVTLCB0aGlzLmluZGV4LCB0aGlzLm5leHQpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIExvY2FsTGlzdEl0ZXJhdG9yPFQ+IGltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPFQ+IHsKLQkJcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmF0b3I8VD4gaXRlcmF0b3I7Ci0JCXByaXZhdGUgaW50IGxhc3QgPSAtMTsKLQkJcHJpdmF0ZSBpbnQgbmV4dCA9IDA7Ci0JCXByaXZhdGUgVCBjdXJyZW50OwotCi0JCUxvY2FsTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjxUPiBpdGVyYXRvcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQotCQlwdWJsaWMgVCBuZXh0KCkgewotCQkJdGhpcy5jdXJyZW50ID0gdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JCQl0aGlzLmxhc3QgPSB0aGlzLm5leHQrKzsKLQkJCXJldHVybiB0aGlzLmN1cnJlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJCXJldHVybiB0aGlzLml0ZXJhdG9yLm5leHRJbmRleCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNQcmV2aW91cygpOwotCQl9Ci0KLQkJcHVibGljIFQgcHJldmlvdXMoKSB7Ci0JCQl0aGlzLmN1cnJlbnQgPSB0aGlzLml0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JCQl0aGlzLmxhc3QgPSAtLXRoaXMubmV4dDsKLQkJCXJldHVybiB0aGlzLmN1cnJlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5wcmV2aW91c0luZGV4KCk7Ci0JCX0KLQotCQlAU3VwcHJlc3NXYXJuaW5ncygic3ludGhldGljLWFjY2VzcyIpCi0JCXB1YmxpYyB2b2lkIHNldChUIG8pIHsKLQkJCXRoaXMuaXRlcmF0b3Iuc2V0KG8pOwotCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWwudGhpcy5maXJlSXRlbVJlcGxhY2VkKExJU1RfVkFMVUVTLCB0aGlzLmxhc3QsIG8sIHRoaXMuY3VycmVudCk7Ci0JCX0KLQotCQlAU3VwcHJlc3NXYXJuaW5ncygic3ludGhldGljLWFjY2VzcyIpCi0JCXB1YmxpYyB2b2lkIGFkZChUIG8pIHsKLQkJCXRoaXMuaXRlcmF0b3IuYWRkKG8pOwotCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWwudGhpcy5maXJlSXRlbUFkZGVkKExJU1RfVkFMVUVTLCB0aGlzLm5leHQsIG8pOwotCQl9Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLnJlbW92ZSgpOwotCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWwudGhpcy5maXJlSXRlbVJlbW92ZWQoTElTVF9WQUxVRVMsIHRoaXMubGFzdCwgdGhpcy5jdXJyZW50KTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDU4OThjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbH0gdGhhdCBzaW1wbHkgaG9sZHMgb24gdG8KLSAqIGFuIG9iamVjdCwgdXNlcyBpdCBhcyB0aGUgdmFsdWUsIGFuZCBmaXJlcyB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgd2hlbiB0aGUKLSAqIHZhbHVlIGNoYW5nZXMuCi0gKiAKLSAqIEBwYXJhbSA8Vj4gdGhlIHR5cGUgb2YgdGhlIG1vZGVsJ3MgdmFsdWUKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxWPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPgotewotCS8qKiBUaGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIFYgdmFsdWU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWwoViB2YWx1ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCBhIHZhbHVlIG9mIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWwoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5jbGFzcywgVkFMVUUpOwotCX0KLQotCi0JcHVibGljIFYgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFYgdmFsdWUpIHsKLQkJViBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkLCB2YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmOWQyNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLS8qKgotICogQW4gYWRhcHRlciB0aGF0IGFsbG93cyB1cyB0byBtYWtlIGEge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfQotICogKG9yIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWwgTGlzdFZhbHVlTW9kZWx9KQotICogYmVoYXZlIGxpa2UgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsIExpc3RWYWx1ZU1vZGVsfQotICogdGhhdCBrZWVwcyBpdHMgY29udGVudHMgc29ydGVkIGFuZCBub3RpZmllcyBsaXN0ZW5lcnMgYXBwcm9wcmlhdGVseS4KLSAqIDxwPgotICogVGhlIHtAbGluayBDb21wYXJhdG9yfSBjYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZTsgYWxsb3dpbmcgdGhlIHNhbWUKLSAqIGFkYXB0ZXIgdG8gYmUgdXNlZCB3aXRoIGRpZmZlcmVudCBzb3J0IGNyaXRlcmlhIChlLmcuIHdoZW4gdGhlIHVzZXIKLSAqIHdhbnRzIHRvIHNvcnQgYSBsaXN0IG9mIGZpbGVzIGZpcnN0IGJ5IG5hbWUsIHRoZW4gYnkgZGF0ZSwgdGhlbiBieSBzaXplKS4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gU2luY2Ugd2Ugb25seSBsaXN0ZW4gdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB3aGVuIHdlIGhhdmUKLSAqIGxpc3RlbmVycyBvdXJzZWx2ZXMgYW5kIHdlIGNhbiBvbmx5IHN0YXkgaW4gc3luYyB3aXRoIHRoZSB3cmFwcGVkCi0gKiBjb2xsZWN0aW9uIHdoaWxlIHdlIGFyZSBsaXN0ZW5pbmcgdG8gaXQsIHJlc3VsdHMgdG8gdmFyaW91cyBtZXRob2RzCi0gKiAoZS5nLiB7QGxpbmsgI3NpemUoKX0sIHtAbGluayAjZ2V0KGludCl9KSB3aWxsIGJlCi0gKiB1bnByZWRpY3RhYmxlIHdoZW5ldmVyCi0gKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzLiBUaGlzIHNob3VsZCBub3QgYmUgdG9vIHBhaW5mdWwgc2luY2UsCi0gKiBtb3N0IGxpa2VseSwgY2xpZW50IG9iamVjdHMgd2lsbCBhbHNvIGJlIGxpc3RlbmVycy4KLSAqIAotICogQHNlZSBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIKLSAqLwotcHVibGljIGNsYXNzIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotewotCS8qKgotCSAqIEEgY29tcGFyYXRvciB1c2VkIGZvciBzb3J0aW5nIHRoZSBlbGVtZW50czsKLQkgKiBpZiBpdCBpcyBudWxsLCB3ZSB1c2UgIm5hdHVyYWwgb3JkZXJpbmciLgotCSAqLwotCXByb3RlY3RlZCBDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3I7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGFuZCBzb3J0IGl0cyBjb250ZW50cwotCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvci4KLQkgKi8KLQlwdWJsaWMgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyLCBDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3IpIHsKLQkJc3VwZXIoY29sbGVjdGlvbkhvbGRlcik7Ci0JCXRoaXMuY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgYW5kIHNvcnQgaXRzIGNvbnRlbnRzCi0JICogYmFzZWQgb24gdGhlIGVsZW1lbnRzJyAibmF0dXJhbCBvcmRlcmluZyIuCi0JICovCi0JcHVibGljIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKGNvbGxlY3Rpb25Ib2xkZXIsIG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0Q29tcGFyYXRvcihDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3IpIHsKLQkJdGhpcy5jb21wYXJhdG9yID0gY29tcGFyYXRvcjsKLQkJdGhpcy5zb3J0TGlzdCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTb3J0IHRoZSBpbnRlcm5hbCBsaXN0IGJlZm9yZSB0aGUgc3VwZXJjbGFzcwotCSAqIHNlbmRzIG91dCBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkTGlzdChpbnQgc2l6ZSkgewotCQlzdXBlci5idWlsZExpc3Qoc2l6ZSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQodGhpcy5saXN0LCB0aGlzLmNvbXBhcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFNvcnQgdGhlIGxpc3QgYWZ0ZXIgYWRkaW5nIHRoZSBpdGVtcy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQXJyYXlMaXN0PEU+IG5ld0xpc3QgPSAoQXJyYXlMaXN0PEU+KSB0aGlzLmxpc3QuY2xvbmUoKTsKLQkJbmV3TGlzdC5lbnN1cmVDYXBhY2l0eShuZXdMaXN0LnNpemUoKSArIGV2ZW50LmdldEl0ZW1zU2l6ZSgpKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChuZXdMaXN0LCB0aGlzLmdldEl0ZW1zKGV2ZW50KSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobmV3TGlzdCwgdGhpcy5jb21wYXJhdG9yKTsKLQkJdGhpcy5zeW5jaHJvbml6ZUxpc3QobmV3TGlzdCwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBidWlsZFN5bmNMaXN0KCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldCh0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsIHRoaXMuY29tcGFyYXRvciwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNpemUoKSk7Ci0JfQotCi0JLyoqCi0JICogc29ydCB0aGUgbGlzdCBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMsIGlmIG5lY2Vzc2FyeTsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzb3J0TGlzdCgpIHsKLQkJLy8gc2F2ZSB0aGUgdW5zb3J0ZWQgc3RhdGUgb2YgdGhlIHNvcnRlZCBsaXN0IHNvIHdlIGNhbiBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mICJyZXBsYWNlZCIgaXRlbXMKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUFycmF5TGlzdDxFPiB1bnNvcnRlZExpc3QgPSAoQXJyYXlMaXN0PEU+KSB0aGlzLmxpc3QuY2xvbmUoKTsKLQkJQ29sbGVjdGlvbnMuc29ydCh0aGlzLmxpc3QsIHRoaXMuY29tcGFyYXRvcik7Ci0JCVJhbmdlIGRpZmZSYW5nZSA9IENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZSYW5nZSh1bnNvcnRlZExpc3QsIHRoaXMubGlzdCk7Ci0JCWlmIChkaWZmUmFuZ2Uuc2l6ZSA+IDApIHsKLQkJCUxpc3Q8RT4gdW5zb3J0ZWRJdGVtcyA9IHVuc29ydGVkTGlzdC5zdWJMaXN0KGRpZmZSYW5nZS5zdGFydCwgZGlmZlJhbmdlLmVuZCArIDEpOwotCQkJTGlzdDxFPiBzb3J0ZWRJdGVtcyA9IHRoaXMubGlzdC5zdWJMaXN0KGRpZmZSYW5nZS5zdGFydCwgZGlmZlJhbmdlLmVuZCArIDEpOwotCQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChMSVNUX1ZBTFVFUywgZGlmZlJhbmdlLnN0YXJ0LCBzb3J0ZWRJdGVtcywgdW5zb3J0ZWRJdGVtcyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTk1ZjUyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSB3cmFwcGVyIHRoYXQga2VlcHMgdGhlIGNvbnRlbnRzIG9mIGEge0BsaW5rIExpc3RWYWx1ZU1vZGVsfSBzb3J0ZWQKLSAqIGFuZCBub3RpZmllcyBsaXN0ZW5lcnMgYXBwcm9wcmlhdGVseS4KLSAqIDxwPgotICogVGhlIHtAbGluayBDb21wYXJhdG9yfSBjYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZTsgYWxsb3dpbmcgdGhlIHNhbWUKLSAqIGFkYXB0ZXIgdG8gYmUgdXNlZCB3aXRoIGRpZmZlcmVudCBzb3J0IGNyaXRlcmlhIChlLmcuIHdoZW4gdGhlIHVzZXIKLSAqIHdhbnRzIHRvIHNvcnQgYSBsaXN0IG9mIGZpbGVzIGZpcnN0IGJ5IG5hbWUsIHRoZW4gYnkgZGF0ZSwgdGhlbiBieSBzaXplKS4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gU2luY2Ugd2Ugb25seSBsaXN0ZW4gdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB3aGVuIHdlIGhhdmUKLSAqIGxpc3RlbmVycyBvdXJzZWx2ZXMgYW5kIHdlIGNhbiBvbmx5IHN0YXkgaW4gc3luYyB3aXRoIHRoZSB3cmFwcGVkCi0gKiBjb2xsZWN0aW9uIHdoaWxlIHdlIGFyZSBsaXN0ZW5pbmcgdG8gaXQsIHJlc3VsdHMgdG8gdmFyaW91cyBtZXRob2RzCi0gKiAoZS5nLiB7QGxpbmsgI3NpemUoKX0sIHtAbGluayAjZ2V0KGludCl9KSB3aWxsIGJlIHVucHJlZGljdGFibGUgd2hlbmV2ZXIKLSAqIHdlIGRvIG5vdCBoYXZlIGFueSBsaXN0ZW5lcnMuIFRoaXMgc2hvdWxkIG5vdCBiZSB0b28gcGFpbmZ1bCBzaW5jZSwKLSAqIG1vc3QgbGlrZWx5LCBjbGllbnQgb2JqZWN0cyB3aWxsIGFsc28gYmUgbGlzdGVuZXJzLgotICogCi0gKiBAc2VlIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEU+Ci0JZXh0ZW5kcyBMaXN0VmFsdWVNb2RlbFdyYXBwZXI8RT4KLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqCi0JICogQSBjb21wYXJhdG9yIHVzZWQgZm9yIHNvcnRpbmcgdGhlIGVsZW1lbnRzOwotCSAqIGlmIGl0IGlzIG51bGwsIHdlIHVzZSAibmF0dXJhbCBvcmRlcmluZyIuCi0JICovCi0JcHJvdGVjdGVkIENvbXBhcmF0b3I8RT4gY29tcGFyYXRvcjsKLQotCS8qKgotCSAqIE91ciBpbnRlcm5hbCBsaXN0LCB3aGljaCBob2xkcyB0aGUgc2FtZSBlbGVtZW50cyBhcwotCSAqIHRoZSB3cmFwcGVkIGxpc3QsIGJ1dCBrZWVwcyB0aGVtIHNvcnRlZC4KLQkgKi8KLQkvLyB3ZSBkZWNsYXJlIHRoaXMgYW4gQXJyYXlMaXN0IHNvIHdlIGNhbiB1c2UgI2Nsb25lKCkgYW5kICNlbnN1cmVDYXBhY2l0eShpbnQpCi0JcHJvdGVjdGVkIGZpbmFsIEFycmF5TGlzdDxFPiBzb3J0ZWRMaXN0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgbGlzdCB2YWx1ZSBtb2RlbCBhbmQgc29ydCBpdHMgY29udGVudHMKLQkgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGNvbXBhcmF0b3IuCi0JICovCi0JcHVibGljIFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcihMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlciwgQ29tcGFyYXRvcjxFPiBjb21wYXJhdG9yKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLmNvbXBhcmF0b3IgPSBjb21wYXJhdG9yOwotCQl0aGlzLnNvcnRlZExpc3QgPSBuZXcgQXJyYXlMaXN0PEU+KGxpc3RIb2xkZXIuc2l6ZSgpKTsKLQkJLy8gcG9zdHBvbmUgYnVpbGRpbmcgdGhlIHNvcnRlZCBsaXN0IGFuZCBsaXN0ZW5pbmcgdG8gdGhlIHdyYXBwZWQgbGlzdAotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgbGlzdCB2YWx1ZSBtb2RlbCBhbmQgc29ydCBpdHMgY29udGVudHMKLQkgKiBiYXNlZCBvbiB0aGUgZWxlbWVudHMnICJuYXR1cmFsIG9yZGVyaW5nIi4KLQkgKi8KLQlwdWJsaWMgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyKSB7Ci0JCXRoaXMobGlzdEhvbGRlciwgbnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8RT4odGhpcy5zb3J0ZWRMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnNvcnRlZExpc3QuZ2V0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNvcnRlZExpc3Quc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5zb3J0ZWRMaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHNldENvbXBhcmF0b3IoQ29tcGFyYXRvcjxFPiBjb21wYXJhdG9yKSB7Ci0JCXRoaXMuY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0JCXRoaXMuc29ydExpc3QoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCS8vIHN5bmMgdGhlIHNvcnRlZCBsaXN0ICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB3cmFwcGVkIGxpc3QgbW9kZWwsCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMuYnVpbGRTb3J0ZWRMaXN0KCk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCS8vIGNsZWFyIG91dCB0aGUgc29ydGVkIGxpc3Qgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlcgotCQl0aGlzLnNvcnRlZExpc3QuY2xlYXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZFNvcnRlZExpc3QoKSB7Ci0JCS8vIGlmIHRoZSBuZXcgbGlzdCBpcyBlbXB0eSwgZG8gbm90aGluZwotCQlpbnQgc2l6ZSA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JCWlmIChzaXplICE9IDApIHsKLQkJCXRoaXMuYnVpbGRTb3J0ZWRMaXN0KHNpemUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRTb3J0ZWRMaXN0KGludCBzaXplKSB7Ci0JCXRoaXMuc29ydGVkTGlzdC5lbnN1cmVDYXBhY2l0eShzaXplKTsKLQkJZm9yIChFIGVhY2ggOiB0aGlzLmxpc3RIb2xkZXIpIHsKLQkJCXRoaXMuc29ydGVkTGlzdC5hZGQoZWFjaCk7Ci0JCX0KLQkJQ29sbGVjdGlvbnMuc29ydCh0aGlzLnNvcnRlZExpc3QsIHRoaXMuY29tcGFyYXRvcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBhZGRlZCB0byB0aGUgd3JhcHBlZCBsaXN0LgotCSAqLwotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGZpcnN0IGFkZCB0aGUgaXRlbXMgYW5kIG5vdGlmeSBvdXIgbGlzdGVuZXJzLi4uCi0JCXRoaXMuYWRkSXRlbXNUb0xpc3QodGhpcy5nZXRJdGVtcyhldmVudCksIHRoaXMuc29ydGVkTGlzdCwgTElTVF9WQUxVRVMpOwotCQkvLyAuLi50aGVuIHNvcnQgdGhlIGxpc3QgYW5kIG5vdGlmeSBvdXIgbGlzdGVuZXJzCi0JCXRoaXMuc29ydExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBsaXN0LgotCSAqLwotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KHRoaXMuZ2V0SXRlbXMoZXZlbnQpLCB0aGlzLnNvcnRlZExpc3QsIExJU1RfVkFMVUVTKTsKLQkJLy8gbm8gc29ydGluZyBuZWVkZWQKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlcGxhY2VkIGluIHRoZSB3cmFwcGVkIGxpc3QuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGZpcnN0IHJlbW92ZSB0aGUgb2xkIGl0ZW1zIGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4uLgotCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3QodGhpcy5nZXRPbGRJdGVtcyhldmVudCksIHRoaXMuc29ydGVkTGlzdCwgTElTVF9WQUxVRVMpOwotCQkvLyB0aGVuIGFkZCB0aGUgbmV3IGl0ZW1zIGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4uLgotCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KHRoaXMuZ2V0TmV3SXRlbXMoZXZlbnQpLCB0aGlzLnNvcnRlZExpc3QsIExJU1RfVkFMVUVTKTsKLQkJLy8gLi4udGhlbiBzb3J0IHRoZSBsaXN0IGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycwotCQl0aGlzLnNvcnRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBtb3ZlZCBpbiB0aGUgd3JhcHBlZCBsaXN0LgotCSAqLwotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotICAgIAkvLyBkbyBub3RoaW5nIC0gc29ydCBvcmRlciBzaG91bGQgcmVtYWluIHVuY2hhbmdlZAotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3Qgd2FzIGNsZWFyZWQuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLSAgICAJdGhpcy5jbGVhckxpc3QodGhpcy5zb3J0ZWRMaXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgbGlzdCBoYXMgY2hhbmdlZCBpbiBzb21lIGRyYW1hdGljIGZhc2hpb24uCi0JICogUmVidWlsZCBvdXIgc29ydGVkIGxpc3QgYW5kIG5vdGlmeSBvdXIgbGlzdGVuZXJzLgotCSAqLwotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpbnQgc2l6ZSA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JCWlmIChzaXplID09IDApIHsKLQkJCWlmICh0aGlzLnNvcnRlZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJLy8gbm8gY2hhbmdlCi0JCQl9IGVsc2UgewotCQkJCXRoaXMuY2xlYXJMaXN0KHRoaXMuc29ydGVkTGlzdCwgTElTVF9WQUxVRVMpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMuc29ydGVkTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQl0aGlzLmJ1aWxkU29ydGVkTGlzdChzaXplKTsKLQkJCQl0aGlzLmZpcmVJdGVtc0FkZGVkKExJU1RfVkFMVUVTLCAwLCB0aGlzLnNvcnRlZExpc3QpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNvcnRlZExpc3QuY2xlYXIoKTsKLQkJCQl0aGlzLmJ1aWxkU29ydGVkTGlzdChzaXplKTsKLQkJCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUywgdGhpcy5zb3J0ZWRMaXN0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHNvcnQgdGhlIHNvcnRlZCBsaXN0IGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycywgaWYgbmVjZXNzYXJ5OwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNvcnRMaXN0KCkgewotCQkvLyBzYXZlIHRoZSB1bnNvcnRlZCBzdGF0ZSBvZiB0aGUgc29ydGVkIGxpc3Qgc28gd2UgY2FuIG1pbmltaXplIHRoZSBudW1iZXIgb2YgInJlcGxhY2VkIiBpdGVtcwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQXJyYXlMaXN0PEU+IHVuc29ydGVkTGlzdCA9IChBcnJheUxpc3Q8RT4pIHRoaXMuc29ydGVkTGlzdC5jbG9uZSgpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHRoaXMuc29ydGVkTGlzdCwgdGhpcy5jb21wYXJhdG9yKTsKLQkJUmFuZ2UgZGlmZlJhbmdlID0gQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKHVuc29ydGVkTGlzdCwgdGhpcy5zb3J0ZWRMaXN0KTsKLQkJaWYgKGRpZmZSYW5nZS5zaXplID4gMCkgewotCQkJTGlzdDxFPiB1bnNvcnRlZEl0ZW1zID0gdW5zb3J0ZWRMaXN0LnN1Ykxpc3QoZGlmZlJhbmdlLnN0YXJ0LCBkaWZmUmFuZ2UuZW5kICsgMSk7Ci0JCQlMaXN0PEU+IHNvcnRlZEl0ZW1zID0gdGhpcy5zb3J0ZWRMaXN0LnN1Ykxpc3QoZGlmZlJhbmdlLnN0YXJ0LCBkaWZmUmFuZ2UuZW5kICsgMSk7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKExJU1RfVkFMVUVTLCBkaWZmUmFuZ2Uuc3RhcnQsIHNvcnRlZEl0ZW1zLCB1bnNvcnRlZEl0ZW1zKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuc29ydGVkTGlzdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0ZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDExMTk1Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0ZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhIG1vZGVsLCAibGF6aWx5IiBsaXN0ZW4gdG8gaXQsIGFuZCBjb252ZXJ0Ci0gKiBpdHMgc3RhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbnMgaW50byBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBjaGFuZ2UKLSAqIG5vdGlmaWNhdGlvbnMuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQ6PHVsPgotICogPGxpPntAbGluayAjYnVpbGRWYWx1ZSgpfTxwPgotICogICAgIHRvIHJldHVybiB0aGUgY3VycmVudCBwcm9wZXJ0eSB2YWx1ZSwgYXMgZGVyaXZlZCBmcm9tIHRoZQotICogICAgIGN1cnJlbnQgbW9kZWwKLSAqIDwvdWw+Ci0gKiBTdWJjbGFzc2VzIG1pZ2h0IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzCi0gKiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIChieSBub3QgcmVjYWxjdWxhdGluZyB0aGUgdmFsdWUsIGlmIHBvc3NpYmxlKTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCl9Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RhdGVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFQ+Ci0JZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLXsKLQkvKiogVGhlIHdyYXBwZWQgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIE1vZGVsIG1vZGVsOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luYyB3aXRoIGNoYW5nZXMgdG8gdGhlIHdyYXBwZWQgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0YXRlQ2hhbmdlTGlzdGVuZXIgc3RhdGVMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZCBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RhdGVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyKE1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCXRoaXMuc3RhdGVMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdGF0ZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGRTdGF0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0YXRlTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgU3RhdGVMaXN0ZW5lcgotCQlleHRlbmRzIFN0YXRlQ2hhbmdlQWRhcHRlcgotCXsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlTdGF0ZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5zdGF0ZUNoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbW9kZWwuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLm1vZGVsLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5zdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbW9kZWwuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLm1vZGVsLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5zdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIHN0YXRlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBtb2RlbCdzIHN0YXRlIGNoYW5nZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RhdGVDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU0NTI4Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfSB0aGF0IGNhbiBiZSB1c2VkIGZvcgotICogcmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG9uIGEgc3RhdGljIGNvbGxlY3Rpb24sIGJ1dCBzdGlsbCBhbGxvd3MgbGlzdGVuZXJzIHRvIGJlIGFkZGVkLgotICogTGlzdGVuZXJzIHdpbGwgPGVtPm5ldmVyPC9lbT4gYmUgbm90aWZpZWQgb2YgYW55IGNoYW5nZXMsIGJlY2F1c2UgdGhlcmUgc2hvdWxkIGJlIG5vbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLXsKLQkvKiogVGhlIGVsZW1lbnRzLiAqLwotCXByb3RlY3RlZCBmaW5hbCBPYmplY3RbXSBlbGVtZW50czsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdGF0aWMgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKi8KLQlwdWJsaWMgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWwoRS4uLiBlbGVtZW50cykgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHMuY2xvbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdGF0aWMgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWwoSXRlcmFibGU8PyBleHRlbmRzIEU+IGVsZW1lbnRzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBBcnJheVRvb2xzLmFycmF5KGVsZW1lbnRzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50cy5sZW5ndGg7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQkvLyB3ZSBjYW4gY2FzdCBoZXJlIHNpbmNlIG91ciBjb25zdHJ1Y3RvcnMgcmVxdWlyZSB0aGUgZWxlbWVudHMgdG8gYmUKLQkJLy8gb2YgdHlwZSBFIGFuZCBBcnJheUl0ZXJhdG9yIGlzIHJlYWQtb25seQotCQlyZXR1cm4gKEl0ZXJhdG9yPEU+KSBuZXcgQXJyYXlJdGVyYXRvcjxPYmplY3Q+KHRoaXMuZWxlbWVudHMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKEFycmF5cy50b1N0cmluZyh0aGlzLmVsZW1lbnRzKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNMaXN0VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljTGlzdFZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4YjZmNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNMaXN0VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBMaXN0VmFsdWVNb2RlbH0gdGhhdCBjYW4gYmUgdXNlZCBmb3IKLSAqIHJldHVybmluZyBhIGxpc3QgaXRlcmF0b3Igb24gYSBzdGF0aWMgbGlzdCwgYnV0IHN0aWxsIGFsbG93cyBsaXN0ZW5lcnMgdG8gYmUgYWRkZWQuCi0gKiBMaXN0ZW5lcnMgd2lsbCA8ZW0+bmV2ZXI8L2VtPiBiZSBub3RpZmllZCBvZiBhbnkgY2hhbmdlcywgYmVjYXVzZSB0aGVyZSBzaG91bGQgYmUgbm9uZS4KLSAqLwotcHVibGljIGNsYXNzIFN0YXRpY0xpc3RWYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFPgotewotCS8qKiBUaGUgZWxlbWVudHMuICovCi0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdFtdIGVsZW1lbnRzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN0YXRpYyBsaXN0IHZhbHVlIG1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBTdGF0aWNMaXN0VmFsdWVNb2RlbChFLi4uIGVsZW1lbnRzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50cy5jbG9uZSgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN0YXRpYyBsaXN0IHZhbHVlIG1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBTdGF0aWNMaXN0VmFsdWVNb2RlbChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gZWxlbWVudHMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50cyA9IEFycmF5VG9vbHMuYXJyYXkoZWxlbWVudHMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCS8vIHdlIGNhbiBjYXN0IGhlcmUgc2luY2Ugb3VyIGNvbnN0cnVjdG9ycyByZXF1aXJlIHRoZSBlbGVtZW50cyB0byBiZQotCQkvLyBvZiB0eXBlIEUgYW5kIEFycmF5SXRlcmF0b3IgaXMgcmVhZC1vbmx5Ci0JCXJldHVybiAoSXRlcmF0b3I8RT4pIG5ldyBBcnJheUl0ZXJhdG9yPE9iamVjdD4odGhpcy5lbGVtZW50cyk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCS8vIHdlIGNhbiBjYXN0IGhlcmUgc2luY2Ugb3VyIGNvbnN0cnVjdG9ycyByZXF1aXJlIHRoZSBlbGVtZW50cyB0byBiZQotCQkvLyBvZiB0eXBlIEUgYW5kIEFycmF5TGlzdEl0ZXJhdG9yIGlzIHJlYWQtb25seQotCQlyZXR1cm4gKExpc3RJdGVyYXRvcjxFPikgbmV3IEFycmF5TGlzdEl0ZXJhdG9yPE9iamVjdD4odGhpcy5lbGVtZW50cyk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50cy5sZW5ndGg7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQkvLyB3ZSBjYW4gY2FzdCBoZXJlIHNpbmNlIG91ciBjb25zdHJ1Y3RvcnMgcmVxdWlyZSB0aGUgZWxlbWVudHMgdG8gYmUKLQkJLy8gb2YgdHlwZSBFCi0JCXJldHVybiAoRSkgdGhpcy5lbGVtZW50c1tpbmRleF07Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRzLmNsb25lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoQXJyYXlzLnRvU3RyaW5nKHRoaXMuZWxlbWVudHMpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OGY1YWEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH0gdGhhdCBjYW4gYmUgdXNlZCBmb3IKLSAqIHJldHVybmluZyBhIHN0YXRpYyB2YWx1ZSwgYnV0IHN0aWxsIGFsbG93cyBsaXN0ZW5lcnMgdG8gYmUgYWRkZWQuCi0gKiBMaXN0ZW5lcnMgd2lsbCA8ZW0+bmV2ZXI8L2VtPiBiZSBub3RpZmllZCBvZiBhbnkgY2hhbmdlcywgYmVjYXVzZSB0aGVyZSBzaG91bGQgYmUgbm9uZS4KLSAqLwotcHVibGljIGNsYXNzIFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxUPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0JLyoqIFRoZSB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgVCB2YWx1ZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdGF0aWMgcHJvcGVydHkgdmFsdWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbChUIHZhbHVlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY1RyZWVWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNUcmVlVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzZlNjA4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY1RyZWVWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlRyZWVWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBUcmVlVmFsdWVNb2RlbH0gdGhhdCBjYW4gYmUgdXNlZCBmb3IKLSAqIHJldHVybmluZyBhbiBpdGVyYXRvciBvbiBhIHN0YXRpYyB0cmVlLCBidXQgc3RpbGwgYWxsb3dzIGxpc3RlbmVycyB0byBiZSBhZGRlZC4KLSAqIExpc3RlbmVycyB3aWxsIDxlbT5uZXZlcjwvZW0+IGJlIG5vdGlmaWVkIG9mIGFueSBjaGFuZ2VzLCBiZWNhdXNlIHRoZXJlIHNob3VsZCBiZSBub25lLgotICovCi1wdWJsaWMgY2xhc3MgU3RhdGljVHJlZVZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIFRyZWVWYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoZSB0cmVlJ3Mgbm9kZXMuICovCi0JcHJvdGVjdGVkIGZpbmFsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBub2RlczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgdHJlZSB2YWx1ZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBub2Rlcy4KLQkgKi8KLQlwdWJsaWMgU3RhdGljVHJlZVZhbHVlTW9kZWwoSXRlcmFibGU8PyBleHRlbmRzIEU+IG5vZGVzKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChub2RlcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLm5vZGVzID0gbm9kZXM7Ci0JfQotCi0JLy8gKioqKioqKioqKiBUcmVlVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gbm9kZXMoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxFPih0aGlzLm5vZGVzLml0ZXJhdG9yKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubm9kZXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjlkMGJiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIHVzIHRvIHRyYW5zZm9ybSBhIHtAbGluayBMaXN0VmFsdWVNb2RlbH0KLSAqIChvciBhZGFwdGVkIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0pIGludG8gYSByZWFkLW9ubHkge0BsaW5rIExpc3RWYWx1ZU1vZGVsfQotICogd2hvc2UgaXRlbXMgYXJlIHRyYW5mb3JtYXRpb25zIG9mIHRoZSBpdGVtcyBpbiB0aGUgd3JhcHBlZAotICoge0BsaW5rIExpc3RWYWx1ZU1vZGVsfS4gSXQgd2lsbCBrZWVwIGl0cyBjb250ZW50cyBpbiBzeW5jIHdpdGgKLSAqIHRoZSBjb250ZW50cyBvZiB0aGUgd3JhcHBlZCB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9IGFuZCBub3RpZmllcyBpdHMKLSAqIGxpc3RlbmVycyBvZiBhbnkgY2hhbmdlcy4KLSAqIDxwPgotICogVGhlIHtAbGluayBUcmFuc2Zvcm1lcn0gY2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWU7IGFsbG93aW5nIHRoZSBzYW1lCi0gKiBhZGFwdGVyIHRvIGJlIHVzZWQgd2l0aCBkaWZmZXJlbnQgdHJhbnNmb3JtYXRpb25zLgotICogPHA+Ci0gKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0sCi0gKiBhIHN1YmNsYXNzIG9mIDxjb2RlPlRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPC9jb2RlPiBjYW4KLSAqIGVpdGhlciBvdmVycmlkZSB7QGxpbmsgI3RyYW5zZm9ybUl0ZW1fKE9iamVjdCl9IG9yLAotICogaWYgc29tZXRoaW5nIG90aGVyIHRoYW4gPGNvZGU+bnVsbDwvY29kZT4gc2hvdWxkIGJlIHJldHVybmVkIHdoZW4gdGhlCi0gKiB3cmFwcGVkIGl0ZW0gaXMgPGNvZGU+bnVsbDwvY29kZT4sIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtSXRlbShPYmplY3QpfS4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gU2luY2Ugd2Ugb25seSBsaXN0ZW4gdG8gdGhlIHdyYXBwZWQgbGlzdCB3aGVuIHdlIGhhdmUKLSAqIGxpc3RlbmVycyBvdXJzZWx2ZXMgYW5kIHdlIGNhbiBvbmx5IHN0YXkgaW4gc3luYyB3aXRoIHRoZSB3cmFwcGVkCi0gKiBsaXN0IHdoaWxlIHdlIGFyZSBsaXN0ZW5pbmcgdG8gaXQsIHJlc3VsdHMgdG8gdmFyaW91cyBtZXRob2RzCi0gKiAoZS5nLiB7QGxpbmsgI3NpemUoKX0sIHtAbGluayAjZ2V0KGludCl9KSB3aWxsIGJlIHVucHJlZGljdGFibGUgd2hlbmV2ZXIKLSAqIHdlIGRvIG5vdCBoYXZlIGFueSBsaXN0ZW5lcnMuIFRoaXMgc2hvdWxkIG5vdCBiZSB0b28gcGFpbmZ1bCBzaW5jZSwKLSAqIG1vc3QgbGlrZWx5LCBjbGllbnRzIHdpbGwgYWxzbyBiZSBsaXN0ZW5lcnMuCi0gKiAKLSAqIEBzZWUgVHJhbnNmb3JtZXIKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWw8RTEsIEUyPgotCWV4dGVuZHMgTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEUxPgotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RTI+Ci17Ci0KLQkvKiogVGhpcyB0cmFuc2Zvcm1zIHRoZSBpdGVtcywgdW5sZXNzIHRoZSBzdWJjbGFzcyBvdmVycmlkZXMge0BsaW5rICN0cmFuc2Zvcm1JdGVtKE9iamVjdCl9KS4gKi8KLQlwcm90ZWN0ZWQgVHJhbnNmb3JtZXI8RTEsIEUyPiB0cmFuc2Zvcm1lcjsKLQotCS8qKiBUaGUgbGlzdCBvZiB0cmFuc2Zvcm1lZCBpdGVtcy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxFMj4gdHJhbnNmb3JtZWRMaXN0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbChMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRTE+IGxpc3RIb2xkZXIsIFRyYW5zZm9ybWVyPEUxLCBFMj4gdHJhbnNmb3JtZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3QgPSBuZXcgQXJyYXlMaXN0PEUyPigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIGxpc3QgdmFsdWUgbW9kZWwgYW5kIHRoZSBkZWZhdWx0IHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlCi0JICoge0BsaW5rICN0cmFuc2Zvcm1JdGVtXyhPYmplY3QpfSBvciB7QGxpbmsgI3RyYW5zZm9ybUl0ZW0oT2JqZWN0KX0KLQkgKiBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsaXN0SG9sZGVyKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLnRyYW5zZm9ybWVyID0gdGhpcy5idWlsZFRyYW5zZm9ybWVyKCk7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxFMj4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRTE+IGNvbGxlY3Rpb25Ib2xkZXIsIFRyYW5zZm9ybWVyPEUxLCBFMj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcyhuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFMT4oY29sbGVjdGlvbkhvbGRlciksIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGFuZCB0aGUgZGVmYXVsdCB0cmFuc2Zvcm1lci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZQotCSAqIHtAbGluayAjdHJhbnNmb3JtSXRlbV8oT2JqZWN0KX0gb3Ige0BsaW5rICN0cmFuc2Zvcm1JdGVtKE9iamVjdCl9Ci0JICogbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEUxPihjb2xsZWN0aW9uSG9sZGVyKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zZm9ybWVyPEUxLCBFMj4gYnVpbGRUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0VHJhbnNmb3JtZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEUyPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFMj4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPEUyPih0aGlzLnRyYW5zZm9ybWVkTGlzdCk7Ci0JfQotCi0JcHVibGljIEUyIGdldChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZWRMaXN0LmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lZExpc3Quc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lZExpc3QudG9BcnJheSgpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCS8vIHN5bmMgdGhlIHRyYW5zZm9ybWVkIGxpc3QgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgbW9kZWwsCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMudHJhbnNmb3JtZWRMaXN0LmFkZEFsbCh0aGlzLnRyYW5zZm9ybUl0ZW1zKHRoaXMubGlzdEhvbGRlcikpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCQkvLyBjbGVhciBvdXQgdGhlIGxpc3Qgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3QuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgbGlzdCB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxFMj4gdHJhbnNmb3JtSXRlbXMoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsdm0pIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtSXRlbXMobHZtLCBsdm0uc2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBMaXN0PEUyPiB0cmFuc2Zvcm1JdGVtcyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtSXRlbXModGhpcy5nZXRJdGVtcyhldmVudCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBMaXN0PEUyPiB0cmFuc2Zvcm1JdGVtcyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtSXRlbXModGhpcy5nZXRJdGVtcyhldmVudCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIG5ldyBpdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBldmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxFMj4gdHJhbnNmb3JtTmV3SXRlbXMoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1JdGVtcyh0aGlzLmdldE5ld0l0ZW1zKGV2ZW50KSwgZXZlbnQuZ2V0SXRlbXNTaXplKCkpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgb2xkIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBMaXN0PEUyPiB0cmFuc2Zvcm1PbGRJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybUl0ZW1zKHRoaXMuZ2V0T2xkSXRlbXMoZXZlbnQpLCBldmVudC5nZXRJdGVtc1NpemUoKSk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgaXRlbXMuCi0JICovCi0JcHJvdGVjdGVkIExpc3Q8RTI+IHRyYW5zZm9ybUl0ZW1zKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gaXRlbXMsIGludCBzaXplKSB7Ci0JCUxpc3Q8RTI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RTI+KHNpemUpOwotCQlmb3IgKEUxIGl0ZW0gOiBpdGVtcykgewotCQkJcmVzdWx0LmFkZCh0aGlzLnRyYW5zZm9ybUl0ZW0oaXRlbSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgaXRlbS4KLQkgKi8KLQlwcm90ZWN0ZWQgRTIgdHJhbnNmb3JtSXRlbShFMSBpdGVtKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybWVyLnRyYW5zZm9ybShpdGVtKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCwgbm9uLW51bGwsIGl0ZW0gYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXByb3RlY3RlZCBFMiB0cmFuc2Zvcm1JdGVtXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRTEgaXRlbSkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2hhbmdlIHRoZSB0cmFuc2Zvcm1lciBhbmQgcmVidWlsZCB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc2Zvcm1lcihUcmFuc2Zvcm1lcjxFMSwgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQkJdGhpcy5yZWJ1aWxkVHJhbnNmb3JtZWRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogU3luY2hyb25pemUgb3VyIGNhY2hlIHdpdGggdGhlIHdyYXBwZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWJ1aWxkVHJhbnNmb3JtZWRMaXN0KCkgewotCQl0aGlzLnN5bmNocm9uaXplTGlzdCh0aGlzLnRyYW5zZm9ybUl0ZW1zKHRoaXMubGlzdEhvbGRlciksIHRoaXMudHJhbnNmb3JtZWRMaXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy50cmFuc2Zvcm1lZExpc3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIuCi0JICogVHJhbnNmb3JtIHRoZW0sIGFkZCB0aGVtIHRvIG91ciB0cmFuc2Zvcm1hdGlvbiBsaXN0LAotCSAqIGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KGV2ZW50LmdldEluZGV4KCksIHRoaXMudHJhbnNmb3JtSXRlbXMoZXZlbnQpLCB0aGlzLnRyYW5zZm9ybWVkTGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIFJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyBpdGVtcyBmcm9tIG91ciB0cmFuc2Zvcm1hdGlvbiBsaXN0Ci0JICogYW5kIG5vdGlmeSBvdXIgbGlzdGVuZXJzLgotCSAqLwotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KGV2ZW50LmdldEluZGV4KCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpLCB0aGlzLnRyYW5zZm9ybWVkTGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVwbGFjZWQgaW4gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIuCi0JICogUmVwbGFjZSB0aGUgY29ycmVzcG9uZGluZyBpdGVtcyBpbiBvdXIgdHJhbnNmb3JtYXRpb24gbGlzdAotCSAqIGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZXRJdGVtc0luTGlzdChldmVudC5nZXRJbmRleCgpLCB0aGlzLnRyYW5zZm9ybU5ld0l0ZW1zKGV2ZW50KSwgdGhpcy50cmFuc2Zvcm1lZExpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIG1vdmVkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIE1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgaXRlbXMgaW4gb3VyIHRyYW5zZm9ybWF0aW9uIGxpc3QKLQkgKiBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0gICAgCXRoaXMubW92ZUl0ZW1zSW5MaXN0KGV2ZW50LmdldFRhcmdldEluZGV4KCksIGV2ZW50LmdldFNvdXJjZUluZGV4KCksIGV2ZW50LmdldExlbmd0aCgpLCB0aGlzLnRyYW5zZm9ybWVkTGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIHdhcyBjbGVhcmVkLgotCSAqIENsZWFyIG91ciB0cmFuc2Zvcm1hdGlvbiBsaXN0IGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotICAgIAl0aGlzLmNsZWFyTGlzdCh0aGlzLnRyYW5zZm9ybWVkTGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIGhhcyBjaGFuZ2VkIGluIHNvbWUgZHJhbWF0aWMgZmFzaGlvbi4KLQkgKiBSZWJ1aWxkIG91ciB0cmFuc2Zvcm1hdGlvbiBsaXN0IGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZWJ1aWxkVHJhbnNmb3JtZWRMaXN0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgdHJhbnNmb3JtZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdHJhbnNmb3JtZXIgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgd3JhcHBlZCBpdGVtIGlzIG51bGwuCi0JICogSWYgdGhlIHdyYXBwZWQgaXRlbSBpcyBub3QgbnVsbCwgaXQgaXMgdHJhbnNmb3JtZWQgYnkgYSBzdWJjbGFzcwotCSAqIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsI3RyYW5zZm9ybUl0ZW1fKE9iamVjdCl9LgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0VHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxFMSwgRTI+IHsKLQkJcHVibGljIEUyIHRyYW5zZm9ybShFMSBpdGVtKSB7Ci0JCQlyZXR1cm4gKGl0ZW0gPT0gbnVsbCkgPyBudWxsIDogVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbC50aGlzLnRyYW5zZm9ybUl0ZW1fKGl0ZW0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OThlYzcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgPGNvZGU+VHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9IGFuZCB1c2VzIGEge0BsaW5rIFRyYW5zZm9ybWVyfQotICogdG8gdHJhbnNmb3JtIHRoZSB3cmFwcGVkIHZhbHVlIGJlZm9yZSBpdCBpcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFZhbHVlKCl9LgotICogPHA+Ci0gKiBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgaXMgY2FsY3VsYXRlZCBhbmQgY2FjaGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiBhbmQgZXZlcnkKLSAqIHRpbWUgdGhlIHdyYXBwZWQgdmFsdWUgY2hhbmdlcy4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gdGhlIG9sZCB2YWx1ZQotICogcGFzc2VkIGluIHRvIHtAbGluayAjd3JhcHBlZFZhbHVlQ2hhbmdlZChvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudCl9Ci0gKiBjYW4gbm8gbG9uZ2VyIGJlICJ0cmFuc2Zvcm1lZCIgYmVjYXVzZSBpdHMgc3RhdGUgaXMgbm8gbG9uZ2VyIHZhbGlkLgotICogVGhpcyBjYWNoaW5nIGNhbiBhbHNvIGltcHJvdmUgdGltZSBwZXJmb3JtYW5jZSBpbiBzb21lIHNpdHVhdGlvbnMuCi0gKiA8cD4KLSAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIFRyYW5zZm9ybWVyfSwKLSAqIGEgc3ViY2xhc3Mgb2YgPGNvZGU+VHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IGNhbgotICogZWl0aGVyIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtXyhPYmplY3QpfSBvciwKLSAqIGlmIHNvbWV0aGluZyBvdGhlciB0aGFuIDxjb2RlPm51bGw8L2NvZGU+IHNob3VsZCBiZSByZXR1cm5lZCB3aGVuIHRoZQotICogd3JhcHBlZCB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiwgb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0uCi0gKiAKLSAqIEBwYXJhbSA8VjE+IHRoZSB0eXBlIG9mIHRoZSA8ZW0+d3JhcHBlZDwvZW0+IG1vZGVsJ3MgdmFsdWUKLSAqIEBwYXJhbSA8VjI+IHRoZSB0eXBlIG9mIHRoZSBtb2RlbCdzIDxlbT50cmFuc2Zvcm1lZDwvZW0+IHZhbHVlCi0gKiBAc2VlIFRyYW5zZm9ybWVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxWMSwgVjI+Ci0JZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFYxPgotCWltcGxlbWVudHMgUHJvcGVydHlWYWx1ZU1vZGVsPFYyPgotewotCS8qKgotCSAqIENhY2hlIHRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSBzbyB0aGF0IGR1cmluZyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQKLQkgKiBub3RpZmljYXRpb24gd2UgZG8gbm90IGhhdmUgdG8gdHJhbnNmb3JtIHRoZSBvbGQgdmFsdWUuIEl0IGlzIHBvc3NpYmxlCi0JICogdGhlIG9sZCB2YWx1ZSBpcyBubyBsb25nZXIgYmUgdmFsaWQgaW4gdGhlIG1vZGVsOyBhcyBhIHJlc3VsdCwKLQkgKiB0cmFuc2Zvcm1pbmcgaXQgd291bGQgbm90IGJlIHZhbGlkLgotCSAqLwotCXByb3RlY3RlZCB2b2xhdGlsZSBWMiB2YWx1ZTsKLQotCXByb3RlY3RlZCBmaW5hbCBUcmFuc2Zvcm1lcjxWMSwgVjI+IHRyYW5zZm9ybWVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIHRoZSBkZWZhdWx0IHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlCi0JICoge0BsaW5rICN0cmFuc2Zvcm1fKE9iamVjdCl9IG9yIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9Ci0JICogbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFYxPiB2YWx1ZU1vZGVsKSB7Ci0JCXN1cGVyKHZhbHVlTW9kZWwpOwotCQl0aGlzLnRyYW5zZm9ybWVyID0gdGhpcy5idWlsZFRyYW5zZm9ybWVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsIGFuZCB0cmFuc2Zvcm1lci4gRGVwZW5kaW5nIG9uIHRoZSBuZXN0ZWQgbW9kZWwsCi0JICogdGhlIHRyYW5zZm9ybWVyIG1heSBiZSByZXF1aXJlZCB0byBoYW5kbGUgYSA8Y29kZT5udWxsPC9jb2RlPiB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBWMT4gdmFsdWVNb2RlbCwgVHJhbnNmb3JtZXI8VjEsIFYyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcih2YWx1ZU1vZGVsKTsKLQkJaWYgKHRyYW5zZm9ybWVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNmb3JtZXI8VjEsIFYyPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRUcmFuc2Zvcm1lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogTm8gbmVlZCB0byB0cmFuc2Zvcm0gdGhlIG5lc3RlZCB2YWx1ZSwgc2ltcGx5IHJldHVybiB0aGUgY2FjaGVkIHZhbHVlLAotCSAqIHdoaWNoIGlzIGFscmVhZHkgdHJhbnNmb3JtZWQuCi0JICovCi0JcHVibGljIFYyIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBQcm9wYWdhdGUgdGhlIGV2ZW50IHdpdGggdHJhbnNmb3JtZWQgdmFsdWVzLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHdyYXBwZWRWYWx1ZUNoYW5nZWQoVjEgb2xkVmFsdWUsIFYxIG5ld1ZhbHVlKSB7Ci0JCVYyIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkLCB0aGlzLnZhbHVlID0gdGhpcy50cmFuc2Zvcm0obmV3VmFsdWUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJhbnNmb3JtYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgdmFsdWUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXByb3RlY3RlZCBWMiB0cmFuc2Zvcm0oVjEgdikgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lci50cmFuc2Zvcm0odik7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQsIG5vbi08Y29kZT5udWxsPC9jb2RlPiwgdmFsdWUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXByb3RlY3RlZCBWMiB0cmFuc2Zvcm1fKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBWMSB2KSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIFdlIGhhdmUgbGlzdGVuZXJzLCB0cmFuc2Zvcm0gdGhlIG5lc3RlZCB2YWx1ZSBhbmQgY2FjaGUgdGhlIHJlc3VsdC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMudHJhbnNmb3JtKHRoaXMudmFsdWVNb2RlbC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBXZSBoYXZlIG5vIG1vcmUgbGlzdGVuZXJzLCBjbGVhciB0aGUgY2FjaGVkIHZhbHVlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCB0cmFuc2Zvcm1lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB0cmFuc2Zvcm1lciB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgd3JhcHBlZAotCSAqIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGUgd3JhcHBlZCB2YWx1ZSBpcyBub3QKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiwgaXQgaXMgdHJhbnNmb3JtZWQgYnkgYSBzdWJjbGFzcwotCSAqIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbCN0cmFuc2Zvcm1fKE9iamVjdCl9LgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0VHJhbnNmb3JtZXIKLQkJaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxWMSwgVjI+Ci0JewotCQlwdWJsaWMgVjIgdHJhbnNmb3JtKFYxIHYpIHsKLQkJCXJldHVybiAodiA9PSBudWxsKSA/IG51bGwgOiBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbC50aGlzLnRyYW5zZm9ybV8odik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMjEzYWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgPGNvZGU+VHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gd3JhcHMgYW5vdGhlcgotICoge0BsaW5rIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9IGFuZCB1c2VzIHR3byB7QGxpbmsgVHJhbnNmb3JtZXJ9cwotICogdG86PHVsPgotICogPGxpPnRyYW5zZm9ybSB0aGUgd3JhcHBlZCB2YWx1ZSBiZWZvcmUgaXQgaXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRWYWx1ZSgpfQotICogPGxpPiJyZXZlcnNlLXRyYW5zZm9ybSIgdGhlIG5ldyB2YWx1ZSB0aGF0IGNvbWVzIGluIHZpYQotICoge0BsaW5rICNzZXRWYWx1ZShPYmplY3QpfQotICogPC91bD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IElmIHRoZSBtYXBwaW5nIGJldHdlZW4gdGhlIHdyYXBwZWQgdmFsdWVzIGFuZCB0aGUKLSAqIHRyYW5zZm9ybWVkIHZhbHVlcyBpcyBub3Qgc3RyaWN0bHkgb25lLXRvLW9uZSwgdGhlIGJlaGF2aW9yIG9mIHRoZQotICogdHJhbnNmb3JtYXRpb24gbW9kZWwgbWF5IHNlZW0gdW5wcmVkaWN0YWJsZTsgc2luY2UgdGhlIHdyYXBwZWQgbW9kZWwncwotICogY2hhbmdlIGV2ZW50cyBjYW4gY2F1c2UgdGhlIHRyYW5zZm9ybWF0aW9uIG1vZGVsJ3MgdmFsdWUgdG8gY2hhbmdlLgotICogRm9yIGV4YW1wbGU6IElmIHRoZSB2YWx1ZSBpcyBhIHN0cmluZyB0byBiZSA8ZW0+dHJhbnNmb3JtZWQ8L2VtPiB0byB1cHBlcmNhc2UKLSAqIGFuZCA8ZW0+cmV2ZXJzZS10cmFuc2Zvcm1lZDwvZW0+IHRvIGxvd2VyY2FzZTsgdGhlbiBtaXhlZCBjYXNlIHZhbHVlcyBwYXNzZWQgdG8KLSAqIHRoZSB0cmFuc2Zvcm1hdGlvbiBtb2RlbCB3aWxsIGJlPHVsPgotICogPGxpPnVuY2hhbmdlZCBpZiB0aGUgdHJhbnNmb3JtYXRpb24gbW9kZWwgaGFzIDxlbT5ubzwvZW0+IGxpc3RlbmVycwotICogPGxpPmNoYW5nZWQgdG8gdXBwZXJjYXNlIGlmIHRoZSB0cmFuc2Zvcm1hdGlvbiBtb2RlbCBoYXMgYW55IGxpc3RlbmVycwotICogKHtAbGluayAjd3JhcHBlZFZhbHVlQ2hhbmdlZChvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudCl9KQotICogPC91bD4KLSAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIHR3byB7QGxpbmsgVHJhbnNmb3JtZXJ9cywKLSAqIGEgc3ViY2xhc3Mgb2YgPGNvZGU+VHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gY2FuCi0gKiBvdmVycmlkZSB7QGxpbmsgI3RyYW5zZm9ybV8oT2JqZWN0KX0gYW5kIHtAbGluayAjcmV2ZXJzZVRyYW5zZm9ybV8oT2JqZWN0KX07Ci0gKiBvciwgaWYgc29tZXRoaW5nIG90aGVyIHRoYW4gPGNvZGU+bnVsbDwvY29kZT4gc2hvdWxkIGJlIHJldHVybmVkIHdoZW4gdGhlCi0gKiB3cmFwcGVkIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIHRoZSBuZXcgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4sCi0gKiBvdmVycmlkZSB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfSBhbmQge0BsaW5rICNyZXZlcnNlVHJhbnNmb3JtKE9iamVjdCl9LgotICogCi0gKiBAcGFyYW0gPFYxPiB0aGUgdHlwZSBvZiB0aGUgPGVtPndyYXBwZWQ8L2VtPiBtb2RlbCdzIHZhbHVlCi0gKiBAcGFyYW0gPFYyPiB0aGUgdHlwZSBvZiB0aGUgbW9kZWwncyA8ZW0+dHJhbnNmb3JtZWQ8L2VtPiB2YWx1ZQotICogQHNlZSBUcmFuc2Zvcm1lcgotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWMSwgVjI+Ci0JZXh0ZW5kcyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxWMSwgVjI+Ci0JaW1wbGVtZW50cyBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFYyPgotewotCXByb3RlY3RlZCBmaW5hbCBUcmFuc2Zvcm1lcjxWMiwgVjE+IHJldmVyc2VUcmFuc2Zvcm1lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVsIGFuZCB0aGUgZGVmYXVsdCB0cmFuc2Zvcm1lcnMuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICN0cmFuc2Zvcm1fKE9iamVjdCl9IGFuZCB7QGxpbmsgI3JldmVyc2VUcmFuc2Zvcm1fKE9iamVjdCl9Ci0JICogKG9yIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IGFuZCB7QGxpbmsgI3JldmVyc2VUcmFuc2Zvcm0oT2JqZWN0KX0pCi0JICogbWV0aG9kcyBpbnN0ZWFkIG9mIGJ1aWxkaW5nIHtAbGluayBUcmFuc2Zvcm1lcn1zLgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VjE+IHZhbHVlTW9kZWwpIHsKLQkJc3VwZXIodmFsdWVNb2RlbCk7Ci0JCXRoaXMucmV2ZXJzZVRyYW5zZm9ybWVyID0gdGhpcy5idWlsZFJldmVyc2VUcmFuc2Zvcm1lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXJzLgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VjE+IHZhbHVlTW9kZWwsIFRyYW5zZm9ybWVyPFYxLCBWMj4gdHJhbnNmb3JtZXIsIFRyYW5zZm9ybWVyPFYyLCBWMT4gcmV2ZXJzZVRyYW5zZm9ybWVyKSB7Ci0JCXN1cGVyKHZhbHVlTW9kZWwsIHRyYW5zZm9ybWVyKTsKLQkJaWYgKHJldmVyc2VUcmFuc2Zvcm1lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnJldmVyc2VUcmFuc2Zvcm1lciA9IHJldmVyc2VUcmFuc2Zvcm1lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNmb3JtZXI8VjIsIFYxPiBidWlsZFJldmVyc2VUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0UmV2ZXJzZVRyYW5zZm9ybWVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENhY2hlIGFuZCAicmV2ZXJzZS10cmFuc2Zvcm0iIHRoZSBuZXcgdmFsdWUgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIHRoZQotCSAqIG5lc3RlZCB2YWx1ZSBtb2RlbC4KLQkgKiBBIHNpZGUtZWZmZWN0IG9mIGNhY2hpbmcgdGhlIG5ldyB2YWx1ZSBpcyB0aGF0IHRoZSB3cmFwcGVyIHdpbGwKLQkgKiA8ZW0+bm90PC9lbT4gZmlyZSBhbiBldmVudCB3aGVuIHRoZSB3cmFwcGVkIG1vZGVsIGZpcmVzIGFuIGV2ZW50IHdoZW4KLQkgKiBjYWxsZWQgZnJvbSBoZXJlLgotCSAqIEBzZWUgI3dyYXBwZWRWYWx1ZUNoYW5nZWQob3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVjIgdmFsdWUpIHsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmdldFZhbHVlTW9kZWwoKS5zZXRWYWx1ZSh0aGlzLnJldmVyc2VUcmFuc2Zvcm0odmFsdWUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJhbnNmb3JtYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogIlJldmVyc2UtdHJhbnNmb3JtIiB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBUaGlzIGlzIGNhbGxlZCBieSB7QGxpbmsgI3NldFZhbHVlKE9iamVjdCl9LgotCSAqLwotCXByb3RlY3RlZCBWMSByZXZlcnNlVHJhbnNmb3JtKFYyIHYpIHsKLQkJcmV0dXJuIHRoaXMucmV2ZXJzZVRyYW5zZm9ybWVyLnRyYW5zZm9ybSh2KTsKLQl9Ci0KLQkvKioKLQkgKiAiUmV2ZXJzZS10cmFuc2Zvcm0iIHRoZSBzcGVjaWZpZWQsIG5vbi08Y29kZT5udWxsPC9jb2RlPiwKLQkgKiB2YWx1ZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHJvdGVjdGVkIFYxIHJldmVyc2VUcmFuc2Zvcm1fKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBWMiB2KSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBPdXIgY29uc3RydWN0b3JzIGFjY2VwdCBvbmx5IGEge0BsaW5rIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9e0Bjb2RlPFY+fSwKLQkgKiBzbyB0aGlzIGNhc3Qgc2hvdWxkIGJlIHNhZmUuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VjE+IGdldFZhbHVlTW9kZWwoKSB7Ci0JCXJldHVybiAoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWMT4pIHRoaXMudmFsdWVNb2RlbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCByZXZlcnNlIHRyYW5zZm9ybWVyICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHJldmVyc2UgdHJhbnNmb3JtZXIgd2lsbCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiB0aGUgbmV3IHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIElmIHRoZSBuZXcgdmFsdWUgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LCBpdCBpcyByZXZlcnNlLXRyYW5zZm9ybWVkCi0JICogYnkgYSBzdWJjbGFzcyBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgI3JldmVyc2VUcmFuc2Zvcm1fKE9iamVjdCl9LgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0UmV2ZXJzZVRyYW5zZm9ybWVyCi0JCWltcGxlbWVudHMgVHJhbnNmb3JtZXI8VjIsIFYxPgotCXsKLQkJcHVibGljIFYxIHRyYW5zZm9ybShWMiB2KSB7Ci0JCQlyZXR1cm4gKHYgPT0gbnVsbCkgPyBudWxsIDogVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC50aGlzLnJldmVyc2VUcmFuc2Zvcm1fKHYpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVBc3BlY3RBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUFzcGVjdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcxZTEyZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUFzcGVjdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFic3RyYWN0IGNsYXNzIHRoYXQgcHJvdmlkZXMgc3VwcG9ydCBmb3Igd3JhcHBpbmcgYSB7QGxpbmsgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbH0KLSAqIGFuZCBsaXN0ZW5pbmcgZm9yIGNoYW5nZXMgdG8gPGVtPmFzcGVjdHM8L2VtPiBvZiB0aGUgPGVtPnZhbHVlPC9lbT4gaGVsZAotICogYnkgdGhlIHtAbGluayBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfS4gQ2hhbmdlcyB0byB0aGUKLSAqIHtAbGluayBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfSdzIHZhbHVlIGFyZSBhbHNvIG1vbml0b3JlZC4KLSAqIDxwPgotICogVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSB2YWx1ZSB0aGF0IG1heSBjaGFuZ2UsIGJ1dCB3aG9zZSBhc3BlY3RzIGNhbiBhbHNvCi0gKiBjaGFuZ2UgaW4gYSBmYXNoaW9uIHRoYXQgbWlnaHQgYmUgb2YgaW50ZXJlc3QgdG8gdGhlIGNsaWVudC4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gQ2xpZW50cyB3aWxsIG5lZWQgdG8gbGlzdGVuIGZvciB0d28gZGlmZmVyZW50IGNoYW5nZQotICogbm90aWZpY2F0aW9uczo8dWw+Ci0gKiA8bGk+YSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgd2lsbCBiZSBiZSBmaXJlZCB3aGVuIHRoZSA8ZW0+dmFsdWU8L2VtPiBjaGFuZ2VzOwotICogPGxpPmEgc3RhdGUgY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgd2hlbiBhbiA8ZW0+YXNwZWN0PC9lbT4gb2YgdGhlIHZhbHVlIGNoYW5nZXMuCi0gKiA8L3VsPgotICogU3ViY2xhc3NlcyBuZWVkIHRvIG92ZXJyaWRlIHR3byBtZXRob2RzOjx1bD4KLSAqIDxsaT57QGxpbmsgI2VuZ2FnZVZhbHVlXygpfTxwPgotICogICAgIGJlZ2luIGxpc3RlbmluZyB0byB0aGUgYXBwcm9wcmlhdGUgYXNwZWN0IG9mIHRoZSB2YWx1ZSBhbmQgY2FsbAotICogICAgIHtAbGluayAjdmFsdWVBc3BlY3RDaGFuZ2VkKCl9IHdoZW5ldmVyIHRoZSBhc3BlY3QgY2hhbmdlcwotICogICAgICh0aGlzIHdpbGwgZmlyZSBhIHN0YXRlIGNoYW5nZSBldmVudCkKLSAqIDxsaT57QGxpbmsgI2Rpc2VuZ2FnZVZhbHVlXygpfTxwPgotICogICAgIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBhcHByb3ByaWF0ZSBhc3BlY3Qgb2YgdGhlIHZhbHVlCi0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFsdWVBc3BlY3RBZGFwdGVyPFY+Ci0JZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFY+Ci0JaW1wbGVtZW50cyBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+Ci17Ci0JLyoqIENhY2hlIHRoZSB2YWx1ZSBzbyB3ZSBjYW4gZGlzZW5nYWdlLiAqLwotCXByb3RlY3RlZCB2b2xhdGlsZSBWIHZhbHVlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBtb2RlbCBpcyByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgVmFsdWVBc3BlY3RBZGFwdGVyKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gdmFsdWVNb2RlbCkgewotCQlzdXBlcih2YWx1ZU1vZGVsKTsKLQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gYWxsb3cgYm90aCBwcm9wZXJ0eSBhbmQgc3RhdGUgY2hhbmdlIGxpc3RlbmVycy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlU3VwcG9ydCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBWIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoViB2YWx1ZSkgewotCQl0aGlzLmdldFZhbHVlTW9kZWwoKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgd3JhcHBlZFZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZGlzZW5nYWdlVmFsdWUoKTsKLQkJdGhpcy5lbmdhZ2VWYWx1ZSgpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuY2xvbmUodGhpcykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gY2hlY2sgZm9yIHN0YXRlIGNoYW5nZSBsaXN0ZW5lcnMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHx8IHN1cGVyLmhhc0xpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBlbmdhZ2UgYW4gYXNwZWN0IG9mIHRoZSB2YWx1ZSBtb2RlbCdzIHZhbHVlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQl0aGlzLmVuZ2FnZVZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIGRpc2VuZ2FnZSBhbiBhc3BlY3Qgb2YgdGhlIHZhbHVlIG1vZGVsJ3MgdmFsdWUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlVmFsdWUoKTsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIGFuIGFzcGVjdCBvZiB0aGUgY3VycmVudCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZSgpIHsKLQkJdGhpcy52YWx1ZSA9IHRoaXMudmFsdWVNb2RlbC5nZXRWYWx1ZSgpOwotCQlpZiAodGhpcy52YWx1ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmVuZ2FnZVZhbHVlXygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIHNvbWUgYXNwZWN0IG9mIHRoZSBjdXJyZW50IHZhbHVlLgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhlIHZhbHVlIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdhZ2VWYWx1ZV8oKTsKLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIGFuIGFzcGVjdCBvZiB0aGUgY3VycmVudCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VWYWx1ZSgpIHsKLQkJaWYgKHRoaXMudmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy5kaXNlbmdhZ2VWYWx1ZV8oKTsKLQkJCXRoaXMudmFsdWUgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gYW4gYXNwZWN0IG9mIHRoZSBjdXJyZW50IHZhbHVlLgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhlIHZhbHVlIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkaXNlbmdhZ2VWYWx1ZV8oKTsKLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2Qgd2hlbmV2ZXIgdGhlIHZhbHVlJ3MgYXNwZWN0IGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVBc3BlY3RDaGFuZ2VkKCkgewotCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBPdXIgY29uc3RydWN0b3IgYWNjZXB0cyBvbmx5IGEge0BsaW5rIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9e0Bjb2RlPFY+fS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBnZXRWYWx1ZU1vZGVsKCkgewotCQlyZXR1cm4gKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4pIHRoaXMudmFsdWVNb2RlbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldFZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQ2hhbmdlQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDaGFuZ2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNDc3YTcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDaGFuZ2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5BYnN0cmFjdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgVmFsdWVBc3BlY3RBZGFwdGVyfSB0byBsaXN0ZW4gdG8gYWxsIHRoZSBhc3BlY3RzCi0gKiBvZiB0aGUgdmFsdWUgaW4gdGhlIHdyYXBwZWQgdmFsdWUgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWx1ZUNoYW5nZUFkYXB0ZXI8ViBleHRlbmRzIE1vZGVsPgotCWV4dGVuZHMgVmFsdWVBc3BlY3RBZGFwdGVyPFY+Ci17Ci0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB0aGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIENoYW5nZUxpc3RlbmVyIHZhbHVlQXNwZWN0TGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNoYW5nZSBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBWYWx1ZUNoYW5nZUFkYXB0ZXIoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JCXRoaXMudmFsdWVBc3BlY3RMaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZUFzcGVjdExpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQXNwZWN0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVmFsdWVBc3BlY3RMaXN0ZW5lcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgY2xhc3MgVmFsdWVBc3BlY3RMaXN0ZW5lcgotCQlleHRlbmRzIEFic3RyYWN0Q2hhbmdlTGlzdGVuZXIKLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBtb2RlbENoYW5nZWQoQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCVZhbHVlQ2hhbmdlQWRhcHRlci50aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIFZhbHVlQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZV8oKSB7Ci0JCXRoaXMudmFsdWUuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy52YWx1ZUFzcGVjdExpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VWYWx1ZV8oKSB7Ci0JCXRoaXMudmFsdWUucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy52YWx1ZUFzcGVjdExpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUFzcGVjdENoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUNvbGxlY3Rpb25BZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUNvbGxlY3Rpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNjYxZWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDb2xsZWN0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIFZhbHVlQXNwZWN0QWRhcHRlcn0gdG8gbGlzdGVuIHRvIG9uZSBvciBtb3JlIGNvbGxlY3Rpb24KLSAqIGFzcGVjdHMgb2YgdGhlIHZhbHVlIGluIHRoZSB3cmFwcGVkIHZhbHVlIG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVDb2xsZWN0aW9uQWRhcHRlcjxWIGV4dGVuZHMgTW9kZWw+Ci0JZXh0ZW5kcyBWYWx1ZUFzcGVjdEFkYXB0ZXI8Vj4KLXsKLQkvKiogVGhlIG5hbWVzIG9mIHRoZSB2YWx1ZSdzIGNvbGxlY3Rpb25zIHRoYXQgd2UgbGlzdGVuIHRvLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBjb2xsZWN0aW9uTmFtZXM7Ci0KLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHZhbHVlQ29sbGVjdGlvbkxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZSBjb2xsZWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgVmFsdWVDb2xsZWN0aW9uQWRhcHRlcihNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHZhbHVlSG9sZGVyLCBTdHJpbmcuLi4gY29sbGVjdGlvbk5hbWVzKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy5jb2xsZWN0aW9uTmFtZXMgPSBjb2xsZWN0aW9uTmFtZXM7Ci0JCXRoaXMudmFsdWVDb2xsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVDb2xsZWN0aW9uTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ29sbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVDb2xsZWN0aW9uQWRhcHRlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCVZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyLnRoaXMuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVDb2xsZWN0aW9uQWRhcHRlci50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIGNvbGxlY3Rpb24gbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFZhbHVlQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZV8oKSB7Ci0JCWZvciAoU3RyaW5nIGNvbGxlY3Rpb25OYW1lIDogdGhpcy5jb2xsZWN0aW9uTmFtZXMpIHsKLQkJCXRoaXMudmFsdWUuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCB0aGlzLnZhbHVlQ29sbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpIHsKLQkJZm9yIChTdHJpbmcgY29sbGVjdGlvbk5hbWUgOiB0aGlzLmNvbGxlY3Rpb25OYW1lcykgewotCQkJdGhpcy52YWx1ZS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIHRoaXMudmFsdWVDb2xsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNoYW5nZSBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUxpc3RBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUxpc3RBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMDk3OGMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVMaXN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIFZhbHVlQXNwZWN0QWRhcHRlcn0gdG8gbGlzdGVuIHRvIG9uZSBvciBtb3JlIGxpc3QKLSAqIGFzcGVjdHMgb2YgdGhlIHZhbHVlIGluIHRoZSB3cmFwcGVkIHZhbHVlIG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVMaXN0QWRhcHRlcjxWIGV4dGVuZHMgTW9kZWw+Ci0JZXh0ZW5kcyBWYWx1ZUFzcGVjdEFkYXB0ZXI8Vj4KLXsKLQkvKiogVGhlIG5hbWVzIG9mIHRoZSB2YWx1ZSdzIGxpc3RzIHRoYXQgd2UgbGlzdGVuIHRvLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBsaXN0TmFtZXM7Ci0KLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIHZhbHVlTGlzdExpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZSBsaXN0cy4KLQkgKi8KLQlwdWJsaWMgVmFsdWVMaXN0QWRhcHRlcihNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHZhbHVlSG9sZGVyLCBTdHJpbmcuLi4gbGlzdE5hbWVzKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy5saXN0TmFtZXMgPSBsaXN0TmFtZXM7Ci0JCXRoaXMudmFsdWVMaXN0TGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVMaXN0TGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlTGlzdExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVMaXN0QWRhcHRlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJCVZhbHVlTGlzdEFkYXB0ZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVMaXN0QWRhcHRlci50aGlzLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVMaXN0QWRhcHRlci50aGlzLml0ZW1zTW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZUxpc3RBZGFwdGVyLnRoaXMubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVMaXN0QWRhcHRlci50aGlzLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIGxpc3QgbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KFZhbHVlTGlzdEFkYXB0ZXIudGhpcy5saXN0TmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFZhbHVlQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZV8oKSB7Ci0JCWZvciAoU3RyaW5nIGxpc3ROYW1lIDogdGhpcy5saXN0TmFtZXMpIHsKLQkJCXRoaXMudmFsdWUuYWRkTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCB0aGlzLnZhbHVlTGlzdExpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpIHsKLQkJZm9yIChTdHJpbmcgbGlzdE5hbWUgOiB0aGlzLmxpc3ROYW1lcykgewotCQkJdGhpcy52YWx1ZS5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIHRoaXMudmFsdWVMaXN0TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNoYW5nZSBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdE1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlUHJvcGVydHlBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVByb3BlcnR5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTZlNTA5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlUHJvcGVydHlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgVmFsdWVBc3BlY3RBZGFwdGVyfSB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUKLSAqIHByb3BlcnRpZXMgb2YgdGhlIHZhbHVlIGluIHRoZSB3cmFwcGVkIHZhbHVlIG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVQcm9wZXJ0eUFkYXB0ZXI8ViBleHRlbmRzIE1vZGVsPgotCWV4dGVuZHMgVmFsdWVBc3BlY3RBZGFwdGVyPFY+Ci17Ci0JLyoqIFRoZSBuYW1lcyBvZiB0aGUgdmFsdWUncyBwcm9wZXJ0aWVzIHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gcHJvcGVydHlOYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHZhbHVlUHJvcGVydHlMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgcHJvcGVydGllcy4KLQkgKi8KLQlwdWJsaWMgVmFsdWVQcm9wZXJ0eUFkYXB0ZXIoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiB2YWx1ZUhvbGRlciwgU3RyaW5nLi4uIHByb3BlcnR5TmFtZXMpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCQl0aGlzLnByb3BlcnR5TmFtZXMgPSBwcm9wZXJ0eU5hbWVzOwotCQl0aGlzLnZhbHVlUHJvcGVydHlMaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZVByb3BlcnR5TGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZVByb3BlcnR5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVQcm9wZXJ0eUFkYXB0ZXIudGhpcy5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidmFsdWUgcHJvcGVydHkgbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KFZhbHVlUHJvcGVydHlBZGFwdGVyLnRoaXMucHJvcGVydHlOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIFZhbHVlQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZV8oKSB7Ci0JCWZvciAoU3RyaW5nIHByb3BlcnR5TmFtZSA6IHRoaXMucHJvcGVydHlOYW1lcykgewotCQkJdGhpcy52YWx1ZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgdGhpcy52YWx1ZVByb3BlcnR5TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWVfKCkgewotCQlmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiB0aGlzLnByb3BlcnR5TmFtZXMpIHsKLQkJCXRoaXMudmFsdWUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMudmFsdWVQcm9wZXJ0eUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjaGFuZ2UgZXZlbnRzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVTdGF0ZUFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlU3RhdGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YTk2MzkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVTdGF0ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgVmFsdWVBc3BlY3RBZGFwdGVyfSB0byBsaXN0ZW4gdG8gdGhlCi0gKiAic3RhdGUiIG9mIHRoZSB2YWx1ZSBpbiB0aGUgd3JhcHBlZCB2YWx1ZSBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFZhbHVlU3RhdGVBZGFwdGVyPFYgZXh0ZW5kcyBNb2RlbD4KLQlleHRlbmRzIFZhbHVlQXNwZWN0QWRhcHRlcjxWPgotewotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0YXRlQ2hhbmdlTGlzdGVuZXIgdmFsdWVTdGF0ZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHZhbHVlIHN0YXRlLgotCSAqLwotCXB1YmxpYyBWYWx1ZVN0YXRlQWRhcHRlcihNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHZhbHVlSG9sZGVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy52YWx1ZVN0YXRlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVTdGF0ZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVTdGF0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlU3RhdGVBZGFwdGVyLnRoaXMuc3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIHN0YXRlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBWYWx1ZUFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWVfKCkgewotCQl0aGlzLnZhbHVlLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy52YWx1ZVN0YXRlTGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpIHsKLQkJdGhpcy52YWx1ZS5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMudmFsdWVTdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBzdGF0ZUNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlVHJlZUFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlVHJlZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3ZTY2OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVRyZWVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgVmFsdWVBc3BlY3RBZGFwdGVyfSB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUKLSAqIHRyZWUgYXNwZWN0cyBvZiB0aGUgdmFsdWUgaW4gdGhlIHdyYXBwZWQgdmFsdWUgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWx1ZVRyZWVBZGFwdGVyPFYgZXh0ZW5kcyBNb2RlbD4KLQlleHRlbmRzIFZhbHVlQXNwZWN0QWRhcHRlcjxWPgotewotCS8qKiBUaGUgbmFtZXMgb2YgdGhlIHZhbHVlJ3MgdHJlZXMgdGhhdCB3ZSBsaXN0ZW4gdG8uICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIHRyZWVOYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBUcmVlQ2hhbmdlTGlzdGVuZXIgdmFsdWVUcmVlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlIHRyZWVzLgotCSAqLwotCXB1YmxpYyBWYWx1ZVRyZWVBZGFwdGVyKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gdmFsdWVIb2xkZXIsIFN0cmluZy4uLiB0cmVlTmFtZXMpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCQl0aGlzLnRyZWVOYW1lcyA9IHRyZWVOYW1lczsKLQkJdGhpcy52YWx1ZVRyZWVMaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZVRyZWVMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgVHJlZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVUcmVlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQkJCVZhbHVlVHJlZUFkYXB0ZXIudGhpcy5ub2RlQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVUcmVlQWRhcHRlci50aGlzLm5vZGVSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVUcmVlQWRhcHRlci50aGlzLnRyZWVDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlVHJlZUFkYXB0ZXIudGhpcy50cmVlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ2YWx1ZSB0cmVlIGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChWYWx1ZVRyZWVBZGFwdGVyLnRoaXMudHJlZU5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBWYWx1ZUFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWVfKCkgewotCQlmb3IgKFN0cmluZyB0cmVlTmFtZSA6IHRoaXMudHJlZU5hbWVzKSB7Ci0JCQl0aGlzLnZhbHVlLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgdGhpcy52YWx1ZVRyZWVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VWYWx1ZV8oKSB7Ci0JCWZvciAoU3RyaW5nIHRyZWVOYW1lIDogdGhpcy50cmVlTmFtZXMpIHsKLQkJCXRoaXMudmFsdWUucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCB0aGlzLnZhbHVlVHJlZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjaGFuZ2UgZXZlbnRzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIG5vZGVBZGRlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm9kZVJlbW92ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRyZWVDbGVhcmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRyZWVDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2M2E5Zi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJpZGlTdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWRhcHRlciB3cmFwcyBhIFByZWZlcmVuY2UgYW5kIGNvbnZlcnRzIGl0IGludG8gYSBQcm9wZXJ0eVZhbHVlTW9kZWwuCi0gKiBJdCBsaXN0ZW5zIGZvciB0aGUgYXBwcm9wcmlhdGUgInByZWZlcmVuY2UiIGNoYW5nZXMgYW5kIGNvbnZlcnRzIHRoZW0gaW50bwotICogVkFMVUUgcHJvcGVydHkgY2hhbmdlcy4gSXQgYWxzbyBhbGxvd3MgdGhlIHNwZWNpZmljYXRpb24gb2YgYSBkZWZhdWx0IHZhbHVlCi0gKiBmb3IgdGhlIFByZWZlcmVuY2UsIHdoaWNoLCBieSBkZWZhdWx0LCBpcyBudWxsIChhbmQgaXMgcHJvYmFibHkgKm5vdCogYSB2ZXJ5Ci0gKiBnb29kIGRlZmF1bHQpLgotICogCi0gKiBZb3UgY2FuIGNvbmZpZ3VyZSB3aGV0aGVyIHRoZSBwcmVmZXJlbmNlJ3MgdmFsdWUgaXMgcmV0dXJuZWQsCi0gKiB1bmNoYW5nZWQsIGFzIGEgc3RyaW5nIG9yIGFzIHNvbWUgb3RoZXIgb2JqZWN0IChlLmcuIGFuIEludGVnZXIpIGJ5Ci0gKiBzZXR0aW5nIHRoZSBhZGFwdGVyJ3MgY29udmVydGVyLiBJbnRlcm5hbGx5LCB0aGUgcHJlZmVyZW5jZSdzIHZhbHVlCi0gKiBpcyBzdG9yZWQgYXMgdGhlIGNvbnZlcnRlZCBvYmplY3Q7IGFuZCB0aGUgY29udmVyc2lvbnMgdGFrZSBwbGFjZQotICogd2hlbiByZWFkaW5nIG9yIHdyaXRpbmcgZnJvbSB0aGUgcHJlZmVyZW5jZXMgbm9kZSBvciByZXRyaWV2aW5nIHRoZQotICogdmFsdWUgZnJvbSBhbiBldmVudCBmaXJlZCBieSB0aGUgcHJlZmVyZW5jZXMgbm9kZS4KLSAqIAotICogVGhpcyBhZGFwdGVyIGlzIGEgYml0IGRpZmZlcmVudCBmcm9tIG1vc3Qgb3RoZXIgYWRhcHRlcnMgYmVjYXVzZSB0aGUKLSAqIGNoYW5nZSBldmVudHMgZmlyZWQgb2ZmIGJ5IGEgUHJlZmVyZW5jZXMgbm9kZSBhcmUgYXN5bmNocm9ub3VzIGZyb20KLSAqIHRoZSBjaGFuZ2UgaXRzZWxmLiAoQWJzdHJhY3RQcmVmZXJlbmNlcyB1c2VzIGFuIGV2ZW50IGRpc3BhdGNoIGRhZW1vbi4pCi0gKiBBcyBhIHJlc3VsdCwgYSBjbGllbnQgY2FuIHNldCBvdXIgdmFsdWUgd2l0aCAjc2V0VmFsdWUoT2JqZWN0KSBhbmQgd2UKLSAqIHdpbGwgcmV0dXJuIGZyb20gdGhhdCBtZXRob2QgYmVmb3JlIHdlIGV2ZXIgcmVjZWl2ZSBub3RpZmljYXRpb24gZnJvbQotICogdGhlIFByZWZlcmVuY2VzIG5vZGUgdGhhdCAqaXQqIGhhcyBjaGFuZ2VkLiBUaGlzIG1lYW5zIHdlIGNhbm5vdAotICogcmVseSBvbiB0aGF0IGV2ZW50IHRvIGtlZXAgb3VyIGludGVybmFsbHkgY2FjaGVkIHZhbHVlIGluIHN5bmNoLgotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPgotCWV4dGVuZHMgQXNwZWN0QWRhcHRlcjxQcmVmZXJlbmNlcywgUD4KLQlpbXBsZW1lbnRzIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UD4KLXsKLQkvKiogVGhlIGtleSB0byB0aGUgcHJlZmVyZW5jZSB3ZSB1c2UgZm9yIHRoZSB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGtleTsKLQotCS8qKgotCSAqIENhY2hlIHRoZSBjdXJyZW50IChvYmplY3QpIHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHNvIHdlCi0JICogY2FuIHBhc3MgYW4gIm9sZCB2YWx1ZSIgd2hlbiB3ZSBmaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBQIHZhbHVlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgKG9iamVjdCkgdmFsdWUgcmV0dXJuZWQgaWYgdGhlcmUgaXMgbm8gdmFsdWUKLQkgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWZlcmVuY2UuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFAgZGVmYXVsdFZhbHVlOwotCi0JLyoqCi0JICogVGhpcyBjb252ZXJ0ZXIgaXMgdXNlZCB0byBjb252ZXJ0IHRoZSBwcmVmZXJlbmNlJ3MKLQkgKiBzdHJpbmcgdmFsdWUgdG8gYW5kIGZyb20gYW4gb2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBCaWRpU3RyaW5nQ29udmVydGVyPFA+IGNvbnZlcnRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB0aGUgYXBwcm9wcmlhdGUgcHJlZmVyZW5jZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIHByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSB3aWxsIGJlIG51bGwuCi0JICovCi0JcHVibGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwoUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMsIFN0cmluZyBrZXkpIHsKLQkJdGhpcyhwcmVmZXJlbmNlcywga2V5LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsKFByZWZlcmVuY2VzIHByZWZlcmVuY2VzLCBTdHJpbmcga2V5LCBQIGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzKHByZWZlcmVuY2VzLCBrZXksIGRlZmF1bHRWYWx1ZSwgQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxQPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2Ugd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwoUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMsIFN0cmluZyBrZXksIFAgZGVmYXVsdFZhbHVlLCBCaWRpU3RyaW5nQ29udmVydGVyPFA+IGNvbnZlcnRlcikgewotCQl0aGlzKG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8UHJlZmVyZW5jZXM+KHByZWZlcmVuY2VzKSwga2V5LCBkZWZhdWx0VmFsdWUsIGNvbnZlcnRlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZm9yQm9vbGVhbihQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcywgU3RyaW5nIGtleSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KAotCQkJCXByZWZlcmVuY2VzLAotCQkJCWtleSwKLQkJCQlkZWZhdWx0VmFsdWUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFLAotCQkJCUJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpCi0JCQkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2Ugd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGZvckludGVnZXIoUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMsIFN0cmluZyBrZXksIGludCBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+KAotCQkJCXByZWZlcmVuY2VzLAotCQkJCWtleSwKLQkJCQlJbnRlZ2VyLnZhbHVlT2YoZGVmYXVsdFZhbHVlKSwKLQkJCQlCaWRpU3RyaW5nQ29udmVydGVyLkludGVnZXJDb252ZXJ0ZXIuaW5zdGFuY2UoKQotCQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdpbGwgYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFByZWZlcmVuY2VzPiBwcmVmZXJlbmNlc0hvbGRlciwgU3RyaW5nIGtleSkgewotCQl0aGlzKHByZWZlcmVuY2VzSG9sZGVyLCBrZXksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2Ugd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcmVmZXJlbmNlcz4gcHJlZmVyZW5jZXNIb2xkZXIsIFN0cmluZyBrZXksIFAgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXMocHJlZmVyZW5jZXNIb2xkZXIsIGtleSwgZGVmYXVsdFZhbHVlLCBCaWRpU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFA+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFByZWZlcmVuY2VzPiBwcmVmZXJlbmNlc0hvbGRlciwgU3RyaW5nIGtleSwgUCBkZWZhdWx0VmFsdWUsIEJpZGlTdHJpbmdDb252ZXJ0ZXI8UD4gY29udmVydGVyKSB7Ci0JCXN1cGVyKHByZWZlcmVuY2VzSG9sZGVyKTsKLQkJdGhpcy5rZXkgPSBrZXk7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCQl0aGlzLmNvbnZlcnRlciA9IGNvbnZlcnRlcjsKLQkJdGhpcy5wcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCS8vIG91ciB2YWx1ZSBpcyBudWxsIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIHByZWZlcmVuY2UKLQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEEgcHJlZmVyZW5jZSBoYXMgY2hhbmdlZCwgbm90aWZ5IHRoZSBsaXN0ZW5lcnMgaWYgbmVjZXNzYXJ5LgotCSAqLwotCXByb3RlY3RlZCBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgYnVpbGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSB0aGUgcHJlZmVyZW5jZSBjaGFuZ2UgZXZlbnRzIGludG8gVkFMVUUgcHJvcGVydHkgY2hhbmdlIGV2ZW50cwotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByZWZlcmVuY2VDaGFuZ2UoUHJlZmVyZW5jZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbC50aGlzLnByZWZlcmVuY2VDaGFuZ2VkKGV2ZW50LmdldEtleSgpLCBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInByZWZlcmVuY2UgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2FjaGVkIChjb252ZXJ0ZWQpIHZhbHVlLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgUCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXQgdGhlIGNhY2hlZCB2YWx1ZSwgdGhlbiBzZXQgdGhlIGFwcHJvcHJpYXRlIHByZWZlcmVuY2UgdmFsdWUuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFZhbHVlKFAgdmFsdWUpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJcmV0dXJuOwkJLy8gbm8gY2hhbmdlcyBhbGxvd2VkIHdoZW4gd2UgaGF2ZSBubyBsaXN0ZW5lcnMKLQkJfQotCi0JCU9iamVjdCBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZUFzcGVjdENoYW5nZWQob2xkLCB2YWx1ZSk7Ci0KLQkJaWYgKCh0aGlzLnN1YmplY3QgIT0gbnVsbCkgJiYgdGhpcy5wcmVmZXJlbmNlSXNUb0JlU2V0KG9sZCwgdmFsdWUpKSB7Ci0JCQl0aGlzLnNldFZhbHVlXyh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIFAgZ2V0QXNwZWN0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMaXN0ZW5lckFzcGVjdE5hbWUoKSB7Ci0JCXJldHVybiBWQUxVRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFZBTFVFKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlZChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotCQl0aGlzLnN1YmplY3QuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMucHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLQkJdHJ5IHsKLQkJCXRoaXMuc3ViamVjdC5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcy5wcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGZvciBzb21lIG9kZCByZWFzb24sIHdlIGFyZSBub3QgYWxsb3dlZCB0byByZW1vdmUgYSBsaXN0ZW5lciBmcm9tIGEgImRlYWQiCi0JCQkvLyBwcmVmZXJlbmNlcyBub2RlOyBzbyBoYW5kbGUgdGhlIGV4Y2VwdGlvbiB0aGF0IGdldHMgdGhyb3duIGhlcmUKLQkJCWlmICggISBleC5nZXRNZXNzYWdlKCkuZXF1YWxzKCJOb2RlIGhhcyBiZWVuIHJlbW92ZWQuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIGlmIGl0IGlzIG5vdCB0aGUgZXhwZWN0ZWQgZXhjZXB0aW9uLCByZS10aHJvdyBpdAotCQkJCXRocm93IGV4OwotCQkJfQotCQl9Ci0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBYnN0cmFjdE1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMua2V5KTsKLQkJc2IuYXBwZW5kKCIgPT4gIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJlZmVyZW5jZSdzIGtleS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIHRoaXMua2V5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJlZmVyZW5jZSdzIHZhbHVlLgotCSAqIEF0IHRoaXMgcG9pbnQgdGhlIHN1YmplY3QgbWF5IGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIFAgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnN1YmplY3QgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZFZhbHVlXygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgcHJlZmVyZW5jZSwgY29udmVydGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBvYmplY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGF0IHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqLwotCXByb3RlY3RlZCBQIGJ1aWxkVmFsdWVfKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0VG9PYmplY3QodGhpcy5zdWJqZWN0LmdldCh0aGlzLmtleSwgdGhpcy5jb252ZXJ0VG9TdHJpbmcodGhpcy5kZWZhdWx0VmFsdWUpKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBhcHByb3ByaWF0ZSBwcmVmZXJlbmNlIGFmdGVyIGNvbnZlcnRpbmcgdGhlIHZhbHVlIHRvIGEgc3RyaW5nLgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oUCB2YWx1ZSkgewotCQl0aGlzLnN1YmplY3QucHV0KHRoaXMua2V5LCB0aGlzLmNvbnZlcnRUb1N0cmluZyh2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlIHNob3VsZCBiZSBwYXNzZWQKLQkgKiB0aHJvdWdoIHRvIHRoZSBwcmVmZXJlbmNlLiBCeSBkZWZhdWx0LCBvbmx5IGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCwKLQkgKiB3aWxsIGl0IGJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBwcmVmZXJlbmNlLiBUaGlzIGFsc28gaGFzIHRoZQotCSAqIGVmZmVjdCBvZiBub3QgY3JlYXRpbmcgbmV3IHByZWZlcmVuY2VzIGluIHRoZSAiYmFja2luZyBzdG9yZSIKLQkgKiBpZiB0aGUgbmV3IHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiB0cnVlIGlmIHRoZXkKLQkgKiB3b3VsZCBsaWtlIHRvIEFMV0FZUyBwYXNzIHRocm91Z2ggdGhlIG5ldyB2YWx1ZSB0byB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVmZXJlbmNlSXNUb0JlU2V0KE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZChvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gYSBzdHJpbmcgdGhhdCBjYW4gYmUgc3RvcmVkIGFzCi0JICogdGhlIHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU3RyaW5nKFAgbykgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXIuY29udmVydFRvU3RyaW5nKG8pOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlIHZhbHVlIHN0cmluZyB0byBhbgotCSAqIGFwcHJvcHJpYXRlbHktdHlwZWQgb2JqZWN0IHRvIGJlIHJldHVybmVkIHRvIHRoZSBjbGllbnQuCi0JICovCi0JcHJvdGVjdGVkIFAgY29udmVydFRvT2JqZWN0KFN0cmluZyBzKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlci5jb252ZXJ0VG9PYmplY3Qocyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlZmVyZW5jZUNoYW5nZWQoU3RyaW5nIHByZWZLZXksIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJaWYgKHByZWZLZXkuZXF1YWxzKHRoaXMua2V5KSkgewotCQkJdGhpcy5wcmVmZXJlbmNlQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgcHJlZmVyZW5jZSBjaGFuZ2VkOyBlaXRoZXIgYmVjYXVzZSB3ZSBjaGFuZ2VkIGl0Ci0JICogaW4gI3NldFZhbHVlXyhPYmplY3QpIG9yIGEgdGhpcmQtcGFydHkgY2hhbmdlZCBpdC4KLQkgKiBJZiB0aGlzIGlzIGNhbGxlZCBiZWNhdXNlIG9mIG91ciBvd24gY2hhbmdlLCB0aGUgZXZlbnQgd2lsbCBiZQotCSAqIHN3YWxsb3dlZCBiZWNhdXNlIHRoZSBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHRoZSBzYW1lLgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlZCgpIHsKLQkJT2JqZWN0IG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlZChvbGQsIHRoaXMudmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3YjI2Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgd3JhcHMgYSBQcmVmZXJlbmNlcyBub2RlIGFuZCBjb252ZXJ0cyBpdHMgcHJlZmVyZW5jZXMgaW50byBhCi0gKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBvZiBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVscy4gSXQgbGlzdGVucyBmb3IKLSAqICJwcmVmZXJlbmNlIiBjaGFuZ2VzIGFuZCBjb252ZXJ0cyB0aGVtIGludG8gVkFMVUUgY29sbGVjdGlvbiBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbDxQPgotCWV4dGVuZHMgQXNwZWN0QWRhcHRlcjxQcmVmZXJlbmNlcywgT2JqZWN0PgotCWltcGxlbWVudHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4KLXsKLQotCS8qKiBDYWNoZSB0aGUgY3VycmVudCBwcmVmZXJlbmNlcywgc3RvcmVkIGluIG1vZGVscyBhbmQga2V5ZWQgYnkgbmFtZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4+IHByZWZlcmVuY2VzOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBwcmVmZXJlbmNlcyBub2RlIGZvciBhZGRlZCBvciByZW1vdmVkIHByZWZlcmVuY2VzLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgcHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlcyBub2RlLgotCSAqLwotCXB1YmxpYyBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsKFByZWZlcmVuY2VzIHByZWZlcmVuY2VzKSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4ocHJlZmVyZW5jZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlcyBub2RlLgotCSAqLwotCXB1YmxpYyBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJlZmVyZW5jZXM+IHByZWZlcmVuY2VzSG9sZGVyKSB7Ci0JCXN1cGVyKHByZWZlcmVuY2VzSG9sZGVyKTsKLQkJdGhpcy5wcmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4oKTsKLQkJdGhpcy5wcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEEgcHJlZmVyZW5jZXMgaGF2ZSBjaGFuZ2VkLCBub3RpZnkgdGhlIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIHByZWZlcmVuY2UgY2hhbmdlIGV2ZW50cyBpbnRvIFZBTFVFIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50cwotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByZWZlcmVuY2VDaGFuZ2UoUHJlZmVyZW5jZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbC50aGlzLnByZWZlcmVuY2VDaGFuZ2VkKGV2ZW50LmdldEtleSgpLCBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInByZWZlcmVuY2UgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIHByZWZlcmVuY2UgbW9kZWxzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSXRlcmF0b3I8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnByZWZlcmVuY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJlZmVyZW5jZXMuc2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0QXNwZWN0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkgewotCQlyZXR1cm4gVkFMVUVTOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhWQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVBc3BlY3RDaGFuZ2VkKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBJdGVyYXRvcjxQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+PiBpdGVyYXRvciA9IChJdGVyYXRvcjxQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+PikgbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oaXRlcmF0b3IpKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLQkJdGhpcy5zdWJqZWN0LmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCWZvciAoSXRlcmF0b3I8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4gc3RyZWFtID0gdGhpcy5wcmVmZXJlbmNlTW9kZWxzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPiBwcmVmZXJlbmNlTW9kZWwgPSBzdHJlYW0ubmV4dCgpOwotCQkJdGhpcy5wcmVmZXJlbmNlcy5wdXQocHJlZmVyZW5jZU1vZGVsLmdldEtleSgpLCBwcmVmZXJlbmNlTW9kZWwpOwotCQl9Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLnN1YmplY3QucmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMucHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBmb3Igc29tZSBvZGQgcmVhc29uLCB3ZSBhcmUgbm90IGFsbG93ZWQgdG8gcmVtb3ZlIGEgbGlzdGVuZXIgZnJvbSBhICJkZWFkIgotCQkJLy8gcHJlZmVyZW5jZXMgbm9kZTsgc28gaGFuZGxlIHRoZSBleGNlcHRpb24gdGhhdCBnZXRzIHRocm93biBoZXJlCi0JCQlpZiAoICEgZXguZ2V0TWVzc2FnZSgpLmVxdWFscygiTm9kZSBoYXMgYmVlbiByZW1vdmVkLiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBpZiBpdCBpcyBub3QgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbiwgcmUtdGhyb3cgaXQKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJfQotCQl0aGlzLnByZWZlcmVuY2VzLmNsZWFyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5zdWJqZWN0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIHByZWZlcmVuY2UgbW9kZWxzLgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4gcHJlZmVyZW5jZU1vZGVscygpIHsKLQkJU3RyaW5nW10ga2V5czsKLQkJdHJ5IHsKLQkJCWtleXMgPSB0aGlzLnN1YmplY3Qua2V5cygpOwotCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+PihuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGtleXMpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+IHRyYW5zZm9ybShTdHJpbmcga2V5KSB7Ci0JCQkJcmV0dXJuIFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWwudGhpcy5idWlsZFByZWZlcmVuY2VNb2RlbChrZXkpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHR3ZWFrIHRoZSBtb2RlbCB1c2VkIHRvIHdyYXAgdGhlCi0JICogc3BlY2lmaWVkIHByZWZlcmVuY2UgKGUuZy4gdG8gY3VzdG9taXplIHRoZSBtb2RlbCdzIGNvbnZlcnRlcikuCi0JICovCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4gYnVpbGRQcmVmZXJlbmNlTW9kZWwoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4odGhpcy5zdWJqZWN0SG9sZGVyLCBrZXkpOwotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlZChTdHJpbmcga2V5LCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJaWYgKG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCS8vIGEgcHJlZmVyZW5jZSB3YXMgcmVtb3ZlZAotCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPiBwcmVmZXJlbmNlTW9kZWwgPSB0aGlzLnByZWZlcmVuY2VzLnJlbW92ZShrZXkpOwotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoVkFMVUVTLCBwcmVmZXJlbmNlTW9kZWwpOwotCQl9IGVsc2UgaWYgKCAhIHRoaXMucHJlZmVyZW5jZXMuY29udGFpbnNLZXkoa2V5KSkgewotCQkJLy8gYSBwcmVmZXJlbmNlIHdhcyBhZGRlZAotCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPiBwcmVmZXJlbmNlTW9kZWwgPSB0aGlzLmJ1aWxkUHJlZmVyZW5jZU1vZGVsKGtleSk7Ci0JCQl0aGlzLnByZWZlcmVuY2VzLnB1dChrZXksIHByZWZlcmVuY2VNb2RlbCk7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoVkFMVUVTLCBwcmVmZXJlbmNlTW9kZWwpOwotCQl9IGVsc2UgewotCQkJLy8gYSBwcmVmZXJlbmNlJ3MgdmFsdWUgY2hhbmdlZCAtIGRvIG5vdGhpbmcKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0Fic3RyYWN0VHJlZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9BYnN0cmFjdFRyZWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTNhYjQyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0Fic3RyYWN0VHJlZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5FdmVudExpc3RlbmVyTGlzdDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVNb2RlbDsKLQotLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gcHJvdmlkZWQgYnkgdGhlIEpESwotICogKOAgbGEgamF2YXguc3dpbmcuQWJzdHJhY3RMaXN0TW9kZWwpLiBUaGlzIGNsYXNzIHByb3ZpZGVzOgotICogLSBzdXBwb3J0IGZvciBhIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzCi0gKiAtIGEgbnVtYmVyIG9mIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGZpcmluZyBldmVudHMgZm9yIHRob3NlIGxpc3RlbmVycwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUcmVlTW9kZWwKLQlpbXBsZW1lbnRzIFRyZWVNb2RlbCwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIE91ciBsaXN0ZW5lcnMuICovCi0JcHJvdGVjdGVkIGZpbmFsIEV2ZW50TGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFic3RyYWN0VHJlZU1vZGVsKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RlbmVyTGlzdCA9IG5ldyBFdmVudExpc3RlbmVyTGlzdCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwYXJ0aWFsIFRyZWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGRUcmVlTW9kZWxMaXN0ZW5lcihUcmVlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LmFkZChUcmVlTW9kZWxMaXN0ZW5lci5jbGFzcywgbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlVHJlZU1vZGVsTGlzdGVuZXIoVHJlZU1vZGVsTGlzdGVuZXIgbCkgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5yZW1vdmUoVHJlZU1vZGVsTGlzdGVuZXIuY2xhc3MsIGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbW9kZWwncyBjdXJyZW50IGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzLgotCSAqIChUaGVyZSBzZWVtcyB0byBiZSBhIHBhdHRlcm4gb2YgbWFraW5nIHRoaXMgdHlwZSBvZiBtZXRob2QgcHVibGljOwotCSAqIGFsdGhvdWdoIGl0IHNob3VsZCBwcm9iYWJseSBiZSBwcm90ZWN0ZWQuLi4uKQotCSAqLwotCXB1YmxpYyBUcmVlTW9kZWxMaXN0ZW5lcltdIHRyZWVNb2RlbExpc3RlbmVycygpIHsKLSAJCXJldHVybiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoVHJlZU1vZGVsTGlzdGVuZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbW9kZWwgaGFzIG5vIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb1RyZWVNb2RlbExpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyQ291bnQoVHJlZU1vZGVsTGlzdGVuZXIuY2xhc3MpID09IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtb2RlbCBoYXMgYW55IGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNUcmVlTW9kZWxMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTm9UcmVlTW9kZWxMaXN0ZW5lcnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiBhIG1vZGVsIGNoYW5nZS4KLQkgKiBBIHNpZ25pZmljYW50IHByb3BlcnR5IG9mIHRoZSBub2RlcyBjaGFuZ2VkLCBidXQgdGhlIG5vZGVzIHRoZW1zZWx2ZXMKLQkgKiBhcmUgc3RpbGwgdGhlIHNhbWUgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50Ci0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVUcmVlTm9kZXNDaGFuZ2VkKE9iamVjdFtdIHBhdGgsIGludFtdIGNoaWxkSW5kaWNlcywgT2JqZWN0W10gY2hpbGRyZW4pIHsKLQkJLy8gZ3VhcmFudGVlZCB0byByZXR1cm4gYSBub24tbnVsbCBhcnJheQotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckxpc3QoKTsKLQkJVHJlZU1vZGVsRXZlbnQgZXZlbnQgPSBudWxsOwotCQkvLyBwcm9jZXNzIHRoZSBsaXN0ZW5lcnMgbGFzdCB0byBmaXJzdCwgbm90aWZ5aW5nCi0JCS8vIHRob3NlIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gdGhpcyBldmVudAotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aC0yOyBpPj0wOyBpLT0yKSB7Ci0JCQlpZiAobGlzdGVuZXJzW2ldPT1UcmVlTW9kZWxMaXN0ZW5lci5jbGFzcykgewotCQkJCS8vIGxhemlseSBjcmVhdGUgdGhlIGV2ZW50Ci0JCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJZXZlbnQgPSBuZXcgVHJlZU1vZGVsRXZlbnQodGhpcywgcGF0aCwgY2hpbGRJbmRpY2VzLCBjaGlsZHJlbik7Ci0JCQkJfQotCQkJCSgoVHJlZU1vZGVsTGlzdGVuZXIpIGxpc3RlbmVyc1tpKzFdKS50cmVlTm9kZXNDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiBhIG1vZGVsIGNoYW5nZS4KLQkgKiBBIHNpZ25pZmljYW50IHByb3BlcnR5IG9mIHRoZSBub2RlIGNoYW5nZWQsIGJ1dCB0aGUgbm9kZSBpdHNlbGYgaXMgdGhlIHNhbWUgb2JqZWN0LgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVOb2RlQ2hhbmdlZChPYmplY3RbXSBwYXRoLCBpbnQgY2hpbGRJbmRleCwgT2JqZWN0IGNoaWxkKSB7Ci0JCXRoaXMuZmlyZVRyZWVOb2Rlc0NoYW5nZWQocGF0aCwgbmV3IGludFtdIHtjaGlsZEluZGV4fSwgbmV3IE9iamVjdFtdIHtjaGlsZH0pOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgYSBtb2RlbCBjaGFuZ2UuCi0JICogQSBzaWduaWZpY2FudCBwcm9wZXJ0eSBvZiB0aGUgcm9vdCBjaGFuZ2VkLCBidXQgdGhlIHJvb3QgaXRzZWxmIGlzIHRoZSBzYW1lIG9iamVjdC4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50Ci0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVUcmVlUm9vdENoYW5nZWQoT2JqZWN0IHJvb3QpIHsKLQkJdGhpcy5maXJlVHJlZU5vZGVzQ2hhbmdlZChuZXcgT2JqZWN0W10ge3Jvb3R9LCBudWxsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVOb2Rlc0luc2VydGVkKE9iamVjdFtdIHBhdGgsIGludFtdIGNoaWxkSW5kaWNlcywgT2JqZWN0W10gY2hpbGRyZW4pIHsKLQkJLy8gZ3VhcmFudGVlZCB0byByZXR1cm4gYSBub24tbnVsbCBhcnJheQotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckxpc3QoKTsKLQkJVHJlZU1vZGVsRXZlbnQgZXZlbnQgPSBudWxsOwotCQkvLyBwcm9jZXNzIHRoZSBsaXN0ZW5lcnMgbGFzdCB0byBmaXJzdCwgbm90aWZ5aW5nCi0JCS8vIHRob3NlIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gdGhpcyBldmVudAotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aC0yOyBpPj0wOyBpLT0yKSB7Ci0JCQlpZiAobGlzdGVuZXJzW2ldPT1UcmVlTW9kZWxMaXN0ZW5lci5jbGFzcykgewotCQkJCS8vIGxhemlseSBjcmVhdGUgdGhlIGV2ZW50Ci0JCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJZXZlbnQgPSBuZXcgVHJlZU1vZGVsRXZlbnQodGhpcywgcGF0aCwgY2hpbGRJbmRpY2VzLCBjaGlsZHJlbik7Ci0JCQkJfQotCQkJCSgoVHJlZU1vZGVsTGlzdGVuZXIpIGxpc3RlbmVyc1tpKzFdKS50cmVlTm9kZXNJbnNlcnRlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVOb2RlSW5zZXJ0ZWQoT2JqZWN0W10gcGF0aCwgaW50IGNoaWxkSW5kZXgsIE9iamVjdCBjaGlsZCkgewotCQl0aGlzLmZpcmVUcmVlTm9kZXNJbnNlcnRlZChwYXRoLCBuZXcgaW50W10ge2NoaWxkSW5kZXh9LCBuZXcgT2JqZWN0W10ge2NoaWxkfSk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiBhIG1vZGVsIGNoYW5nZS4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50Ci0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVUcmVlTm9kZXNSZW1vdmVkKE9iamVjdFtdIHBhdGgsIGludFtdIGNoaWxkSW5kaWNlcywgT2JqZWN0W10gY2hpbGRyZW4pIHsKLQkJLy8gZ3VhcmFudGVlZCB0byByZXR1cm4gYSBub24tbnVsbCBhcnJheQotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckxpc3QoKTsKLQkJVHJlZU1vZGVsRXZlbnQgZXZlbnQgPSBudWxsOwotCQkvLyBwcm9jZXNzIHRoZSBsaXN0ZW5lcnMgbGFzdCB0byBmaXJzdCwgbm90aWZ5aW5nCi0JCS8vIHRob3NlIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gdGhpcyBldmVudAotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aC0yOyBpPj0wOyBpLT0yKSB7Ci0JCQlpZiAobGlzdGVuZXJzW2ldPT1UcmVlTW9kZWxMaXN0ZW5lci5jbGFzcykgewotCQkJCS8vIGxhemlseSBjcmVhdGUgdGhlIGV2ZW50Ci0JCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJZXZlbnQgPSBuZXcgVHJlZU1vZGVsRXZlbnQodGhpcywgcGF0aCwgY2hpbGRJbmRpY2VzLCBjaGlsZHJlbik7Ci0JCQkJfQotCQkJCSgoVHJlZU1vZGVsTGlzdGVuZXIpIGxpc3RlbmVyc1tpKzFdKS50cmVlTm9kZXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgYSBtb2RlbCBjaGFuZ2UuCi0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudAotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVHJlZU5vZGVSZW1vdmVkKE9iamVjdFtdIHBhdGgsIGludCBjaGlsZEluZGV4LCBPYmplY3QgY2hpbGQpIHsKLQkJdGhpcy5maXJlVHJlZU5vZGVzUmVtb3ZlZChwYXRoLCBuZXcgaW50W10ge2NoaWxkSW5kZXh9LCBuZXcgT2JqZWN0W10ge2NoaWxkfSk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiBhIG1vZGVsIGNoYW5nZS4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50Ci0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVUcmVlU3RydWN0dXJlQ2hhbmdlZChPYmplY3RbXSBwYXRoKSB7Ci0JCS8vIGd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgbm9uLW51bGwgYXJyYXkKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJMaXN0KCk7Ci0JCVRyZWVNb2RlbEV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJLy8gcHJvY2VzcyB0aGUgbGlzdGVuZXJzIGxhc3QgdG8gZmlyc3QsIG5vdGlmeWluZwotCQkvLyB0aG9zZSB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIHRoaXMgZXZlbnQKLQkJZm9yIChpbnQgaSA9IGxpc3RlbmVycy5sZW5ndGgtMjsgaT49MDsgaS09MikgewotCQkJaWYgKGxpc3RlbmVyc1tpXT09VHJlZU1vZGVsTGlzdGVuZXIuY2xhc3MpIHsKLQkJCQkvLyBsYXppbHkgY3JlYXRlIHRoZSBldmVudAotCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCWV2ZW50ID0gbmV3IFRyZWVNb2RlbEV2ZW50KHRoaXMsIHBhdGgpOwotCQkJCX0KLQkJCQkoKFRyZWVNb2RlbExpc3RlbmVyKSBsaXN0ZW5lcnNbaSsxXSkudHJlZVN0cnVjdHVyZUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiBhIG1vZGVsIGNoYW5nZS4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50Ci0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVUcmVlUm9vdFJlcGxhY2VkKE9iamVjdCBuZXdSb290KSB7Ci0JCXRoaXMuZmlyZVRyZWVTdHJ1Y3R1cmVDaGFuZ2VkKG5ldyBPYmplY3RbXSB7bmV3Um9vdH0pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ2hlY2tCb3hNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NoZWNrQm94TW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNzA5MDEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ2hlY2tCb3hNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5CdXR0b25Nb2RlbCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgbGlzdGVuZXIKLSAqIChlLmcuIGEgSkNoZWNrQm94KSBpbiBzeW5jaCB3aXRoIGEgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQKLSAqIGhvbGRzIGEgYm9vbGVhbi4KLSAqIAotICogTWF5YmUgbm90IHRoZSByaWNoZXN0IGNsYXNzIGluIG91ciB0b29sYm94LCBidXQgaXQgd2FzIHRoZQotICogdmljdGltIG9mIHJlZmFjdG9yaW5nLi4uLiAgfmJqdgotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tCb3hNb2RlbEFkYXB0ZXIKLQlleHRlbmRzIFRvZ2dsZUJ1dHRvbk1vZGVsQWRhcHRlcgotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgYm9vbGVhbiBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIENoZWNrQm94TW9kZWxBZGFwdGVyKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIoYm9vbGVhbkhvbGRlciwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBib29sZWFuIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIGZhbHNlLgotCSAqLwotCXB1YmxpYyBDaGVja0JveE1vZGVsQWRhcHRlcihNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIpIHsKLQkJc3VwZXIoYm9vbGVhbkhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db2x1bW5BZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db2x1bW5BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OGU0NGQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29sdW1uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotCi0vKioKLSAqIFRoaXMgYWRhcHRlciBpcyB1c2VkIGJ5IHRoZSB0YWJsZSBtb2RlbCBhZGFwdGVyIHRvCi0gKiBjb252ZXJ0IGEgbW9kZWwgb2JqZWN0IGludG8gdGhlIG1vZGVscyB1c2VkIGZvciBlYWNoIG9mCi0gKiB0aGUgY2VsbHMgZm9yIHRoZSBvYmplY3QncyBjb3JyZXNwb25kaW5nIHJvdyBpbiB0aGUgdGFibGUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29sdW1uQWRhcHRlciB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgdGFibGUuCi0JICogVHlwaWNhbGx5IHRoaXMgaXMgc3RhdGljLgotCSAqLwotCWludCBjb2x1bW5Db3VudCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgY29sdW1uLgotCSAqLwotCVN0cmluZyBjb2x1bW5OYW1lKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG9mIHRoZSBzcGVjaWZpZWQgY29sdW1uLgotCSAqLwotCUNsYXNzPD8+IGNvbHVtbkNsYXNzKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbHVtbiBpcyBlZGl0YWJsZS4KLQkgKiBUeXBpY2FsbHkgdGhpcyBpcyB0aGUgc2FtZSBmb3IgZXZlcnkgcm93LgotCSAqLwotCWJvb2xlYW4gY29sdW1uSXNFZGl0YWJsZShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsIG1vZGVscyBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogdGhhdCBjb3JyZXNwb25kcyB0byBhIHNpbmdsZSByb3cgaW4gdGhlIHRhYmxlLgotCSAqLwotCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIGNlbGxNb2RlbHMoT2JqZWN0IHN1YmplY3QpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYjBkMDIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkNvbWJvQm94TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgTGlzdERhdGFMaXN0ZW5lcgotICogKGUuZy4gYSBKQ29tYm9Cb3gpIGluIHN5bmNoIHdpdGggYSBMaXN0VmFsdWVNb2RlbCAob3IgYSBDb2xsZWN0aW9uVmFsdWVNb2RlbCkuCi0gKiBGb3IgY29tYm8gYm94ZXMsIHRoZSBtb2RlbCBvYmplY3QgdGhhdCBob2xkcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gaXMKLSAqIHR5cGljYWxseSBhIGRpZmZlcmVudCBtb2RlbCBvYmplY3QgdGhhbiB0aGUgb25lIHRoYXQgaG9sZHMgdGhlIGNvbGxlY3Rpb24KLSAqIG9mIGNob2ljZXMuCi0gKiAKLSAqIEZvciBleGFtcGxlLCBhIE1XUmVmZXJlbmNlICh0aGUgc2VsZWN0aW9uT3duZXIpIGhhcyBhbiBhdHRyaWJ1dGUKLSAqICJzb3VyY2VUYWJsZSIgKHRoZSBjb2xsZWN0aW9uT3duZXIpCi0gKiB3aGljaCBob2xkcyBvbiB0byBhIGNvbGxlY3Rpb24gb2YgTVdEYXRhYmFzZUZpZWxkcy4gV2hlbiB0aGUgc2VsZWN0aW9uCi0gKiBpcyBjaGFuZ2VkIHRoaXMgbW9kZWwgd2lsbCBrZWVwIHRoZSBsaXN0ZW5lcnMgYXdhcmUgb2YgdGhlIGNoYW5nZXMuCi0gKiBUaGUgaW5oZXJpdGVkIGxpc3QgbW9kZWwgd2lsbCBrZWVwIGl0cyBsaXN0ZW5lcnMgYXdhcmUgb2YgY2hhbmdlcyB0byB0aGUKLSAqIGNvbGxlY3Rpb24gbW9kZWwKLSAqIAotICogSW4gYWRkaXRpb24gdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyIHJlcXVpcmVkIGJ5IHRoZSBzdXBlcmNsYXNzLAotICogYW4gaW5zdGFuY2Ugb2YgdGhpcyBDb21ib0JveE1vZGVsIG11c3QgYmUgc3VwcGxpZWQgd2l0aCBhCi0gKiBzZWxlY3Rpb24gaG9sZGVyLCB3aGljaCBpcyBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0IHByb3ZpZGVzIGFjY2VzcwotICogdG8gdGhlIHNlbGVjdGlvbiAodHlwaWNhbGx5IGEgUHJvcGVydHlBc3BlY3RBZGFwdGVyKS4KLSAqLwotcHVibGljIGNsYXNzIENvbWJvQm94TW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBMaXN0TW9kZWxBZGFwdGVyCi0JaW1wbGVtZW50cyBDb21ib0JveE1vZGVsCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBzZWxlY3Rpb25Ib2xkZXI7Ci0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGxpc3QgaG9sZGVyIGFuZCBzZWxlY3Rpb24gaG9sZGVyIGFyZSByZXF1aXJlZDsKLQkgKi8KLQlwdWJsaWMgQ29tYm9Cb3hNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHNlbGVjdGlvbkhvbGRlcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJaWYgKHNlbGVjdGlvbkhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnNlbGVjdGlvbkhvbGRlciA9IHNlbGVjdGlvbkhvbGRlcjsKLQkJdGhpcy5zZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGNvbGxlY3Rpb24gaG9sZGVyIGFuZCBzZWxlY3Rpb24gaG9sZGVyIGFyZSByZXF1aXJlZDsKLQkgKi8KLQlwdWJsaWMgQ29tYm9Cb3hNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8Pz4gY29sbGVjdGlvbkhvbGRlciwgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHNlbGVjdGlvbkhvbGRlcikgewotCQlzdXBlcihjb2xsZWN0aW9uSG9sZGVyKTsKLQkJaWYgKHNlbGVjdGlvbkhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnNlbGVjdGlvbkhvbGRlciA9IHNlbGVjdGlvbkhvbGRlcjsKLQkJdGhpcy5zZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gbm90aWZ5IGxpc3RlbmVycyB0aGF0IHRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQKLQkJCQlDb21ib0JveE1vZGVsQWRhcHRlci50aGlzLmZpcmVTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzZWxlY3Rpb24gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbWJvQm94TW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIE9iamVjdCBnZXRTZWxlY3RlZEl0ZW0oKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdGlvbkhvbGRlci5nZXRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkSXRlbShPYmplY3Qgc2VsZWN0ZWRJdGVtKSB7Ci0JCXRoaXMuc2VsZWN0aW9uSG9sZGVyLnNldFZhbHVlKHNlbGVjdGVkSXRlbSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBlbmdhZ2UgdGhlIHNlbGVjdGlvbiBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCXRoaXMuc2VsZWN0aW9uSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gZGlzZW5nYWdlIHRoZSBzZWxlY3Rpb24gaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLnNlbGVjdGlvbkhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IHRoZSBsaXN0ZW5lcnMgdGhhdCB0aGUgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVTZWxlY3Rpb25DaGFuZ2VkKCkgewotCQkvLyBJIGd1ZXNzIHRoaXMgd2lsbCB3b3JrLi4uCi0JCXRoaXMuZmlyZUNvbnRlbnRzQ2hhbmdlZCh0aGlzLCAtMSwgLTEpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuc2VsZWN0aW9uSG9sZGVyICsgIjoiICsgdGhpcy5saXN0SG9sZGVyKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RhdGVTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NzYxNjIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyRGF0ZU1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5TcGlubmVyRGF0ZU1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBDaGFuZ2VMaXN0ZW5lcgotICogKGUuZy4gYSBKU3Bpbm5lcikgaW4gc3luY2ggd2l0aCBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgZGF0ZS4KLSAqIAotICogVGhpcyBjbGFzcyBtdXN0IGJlIGEgc3ViLWNsYXNzIG9mIFNwaW5uZXJEYXRlTW9kZWwgYmVjYXVzZSBvZiBzb21lCi0gKiBjcmFwcHkgamRrIGNvZGUuLi4uICB+Ymp2Ci0gKiBAc2VlIGphdmF4LnN3aW5nLkpTcGlubmVyI2NyZWF0ZUVkaXRvcihqYXZheC5zd2luZy5TcGlubmVyTW9kZWwpCi0gKiAKLSAqIElmIHRoaXMgY2xhc3MgbmVlZHMgdG8gYmUgbW9kaWZpZWQsIGl0IHdvdWxkIGJlaG9vdmUgdXMgdG8gcmV2aWV3IHRoZQotICogb3RoZXIsIHNpbWlsYXIgY2xhc3NlczoKLSAqIEBzZWUgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqIEBzZWUgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIKLQlleHRlbmRzIFNwaW5uZXJEYXRlTW9kZWwKLXsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWU7IHVzZWQgd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBkYXRlIHZhbHVlIGlzIG51bGwuCi0JICogVGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgZGF0ZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIERhdGUgZGVmYXVsdFZhbHVlOwotCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgZGF0ZS4gKi8KLQlwcml2YXRlIGZpbmFsIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBkYXRlSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gdGhlIHVuZGVybHlpbmcgZGF0ZS4gKi8KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZGF0ZUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBkYXRlIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBUaGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlIGlzIHRoZSBjdXJyZW50IGRhdGUuCi0JICovCi0JcHVibGljIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBkYXRlSG9sZGVyKSB7Ci0JCXRoaXMoZGF0ZUhvbGRlciwgbmV3IERhdGUoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgZGF0ZSBob2xkZXIgYW5kIGRlZmF1bHQgdmFsdWUgYXJlIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcihNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gZGF0ZUhvbGRlciwgRGF0ZSBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyhkYXRlSG9sZGVyLCBudWxsLCBudWxsLCBDYWxlbmRhci5EQVlfT0ZfTU9OVEgsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgZGF0ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZSBpcyB0aGUgY3VycmVudCBkYXRlLgotCSAqLwotCXB1YmxpYyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcihNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gZGF0ZUhvbGRlciwgQ29tcGFyYWJsZTw/PiBzdGFydCwgQ29tcGFyYWJsZTw/PiBlbmQsIGludCBjYWxlbmRhckZpZWxkKSB7Ci0JCXRoaXMoZGF0ZUhvbGRlciwgc3RhcnQsIGVuZCwgY2FsZW5kYXJGaWVsZCwgbmV3IERhdGUoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgZGF0ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBkYXRlSG9sZGVyLCBDb21wYXJhYmxlPD8+IHN0YXJ0LCBDb21wYXJhYmxlPD8+IGVuZCwgaW50IGNhbGVuZGFyRmllbGQsIERhdGUgZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKGRhdGVIb2xkZXIuZ2V0VmFsdWUoKSA9PSBudWxsID8gZGVmYXVsdFZhbHVlIDogKERhdGUpIGRhdGVIb2xkZXIuZ2V0VmFsdWUoKSwgc3RhcnQsIGVuZCwgY2FsZW5kYXJGaWVsZCk7Ci0JCXRoaXMuZGF0ZUhvbGRlciA9IGRhdGVIb2xkZXI7Ci0JCXRoaXMuZGF0ZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZERhdGVDaGFuZ2VMaXN0ZW5lcigpOwotCQkvLyBwb3N0cG9uZSBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgZGF0ZQotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGREYXRlQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRGF0ZUNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlEYXRlU3Bpbm5lck1vZGVsQWRhcHRlci50aGlzLnN5bmNocm9uaXplKGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiZGF0ZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3Bpbm5lck1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBjaGVjayB3aGV0aGVyIHRoaXMgbWV0aG9kIGlzIGJlaW5nIGNhbGxlZCBiZWZvcmUgd2UgCi0JICogaGF2ZSBhbnkgbGlzdGVuZXJzLgotCSAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc29tZSBjcmFwcHkgamRrIGNvZGUgZ2V0cyB0aGUgdmFsdWUKLQkgKiBmcm9tIHRoZSBtb2RlbCAqYmVmb3JlKiBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsLiAgfmJqdgotCSAqIEBzZWUgamF2YXguc3dpbmcuSlNwaW5uZXIuRGVmYXVsdEVkaXRvcihqYXZheC5zd2luZy5KU3Bpbm5lcikKLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJLy8gc29ycnkgYWJvdXQgdGhpcyAibGF0ZXJhbCIgY2FsbCB0byBzdXBlciAgfmJqdgotCQkJc3VwZXIuc2V0VmFsdWUodGhpcy5zcGlubmVyVmFsdWVPZih0aGlzLmRhdGVIb2xkZXIuZ2V0VmFsdWUoKSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byB1cGRhdGUgdGhlIHVuZGVybHlpbmcgZGF0ZSBkaXJlY3RseS4KLQkgKiBUaGUgcmVzdWx0aW5nIGV2ZW50IHdpbGwgYmUgaWdub3JlZDogQHNlZSAjc3luY2hyb25pemUoT2JqZWN0KS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJc3VwZXIuc2V0VmFsdWUodmFsdWUpOwotCQl0aGlzLmRhdGVIb2xkZXIuc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgZGF0ZSBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMuZGF0ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5kYXRlQ2hhbmdlTGlzdGVuZXIpOwotCQkJdGhpcy5zeW5jaHJvbml6ZSh0aGlzLmRhdGVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJc3VwZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBkYXRlIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMuZGF0ZUhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5kYXRlQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIERhdGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0byBhIG5vbi1udWxsIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgc3Bpbm5lclZhbHVlT2YoT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiAodmFsdWUgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRWYWx1ZSgpIDogdmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgc3Bpbm5lciB2YWx1ZSBpZiBpdCBoYXMgY2hhbmdlZC4KLQkgKi8KLQl2b2lkIHN5bmNocm9uaXplKE9iamVjdCB2YWx1ZSkgewotCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLnNwaW5uZXJWYWx1ZU9mKHZhbHVlKTsKLQkJLy8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIHNwaW5uZXIgZGF0ZSBoYXMgYWxyZWFkeSBiZWVuIHN5bmNocm9uaXplZAotCQkvLyAodmlhICNzZXRWYWx1ZSgpKQotCQlpZiAoICEgdGhpcy5nZXRWYWx1ZSgpLmVxdWFscyhuZXdWYWx1ZSkpIHsKLQkJCXRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kYXRlSG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RvY3VtZW50QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MzAxNzMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Eb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkV2ZW50TGlzdGVuZXJMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlVuZG9hYmxlRWRpdEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlVuZG9hYmxlRWRpdExpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuQXR0cmlidXRlU2V0OwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkVsZW1lbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5QbGFpbkRvY3VtZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5TZWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGphdmF4LnN3aW5nLnRleHQuRG9jdW1lbnQgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIERvY3VtZW50TGlzdGVuZXIKLSAqIChlLmcuIGEgSlRleHRGaWVsZCkgaW4gc3luY2ggd2l0aCBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgc3RyaW5nLgotICogCi0gKiBOQjogVGhpcyBtb2RlbCBzaG91bGQgb25seSBiZSB1c2VkIGZvciAic21hbGwiIGRvY3VtZW50czsKLSAqIGkuZS4gZG9jdW1lbnRzIHVzZWQgYnkgdGV4dCBmaWVsZHMsIG5vdCB0ZXh0IHBhbmVzLgotICogQHNlZSAjc3luY2hyb25pemVEZWxlZ2F0ZShTdHJpbmcpCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudEFkYXB0ZXIKLQlpbXBsZW1lbnRzIERvY3VtZW50LCBTZXJpYWxpemFibGUKLXsKLQotCS8qKiBUaGUgZGVsZWdhdGUgZG9jdW1lbnQgd2hvc2UgYmVoYXZpb3Igd2UgImVuaGFuY2UiLiAqLwotCXByb3RlY3RlZCBmaW5hbCBEb2N1bWVudCBkZWxlZ2F0ZTsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIGZvcndhcmQgYW55IGNoYW5nZXMgbWFkZSB0byB0aGUgZGVsZWdhdGUgZG9jdW1lbnQuICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJpbmVkTGlzdGVuZXIgZGVsZWdhdGVMaXN0ZW5lcjsKLQotCS8qKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHN0cmluZy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHdpdGggY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHN0cmluZy4gKi8KLQlwcm90ZWN0ZWQgdHJhbnNpZW50IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc3RyaW5nTGlzdGVuZXI7Ci0KLSAgICAvKiogVGhlIGV2ZW50IGxpc3RlbmVyIGxpc3QgZm9yIHRoZSBkb2N1bWVudC4gKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgRXZlbnRMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEV2ZW50TGlzdGVuZXJMaXN0KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgc3RyaW5nIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIERvY3VtZW50QWRhcHRlcihNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc3RyaW5nSG9sZGVyLCBEb2N1bWVudCBkZWxlZ2F0ZSkgewotCQlzdXBlcigpOwotCQlpZiAoc3RyaW5nSG9sZGVyID09IG51bGwgfHwgZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5zdHJpbmdIb2xkZXIgPSBzdHJpbmdIb2xkZXI7Ci0JCS8vIHBvc3Rwb25lIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBzdHJpbmcKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JCXRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLQkJdGhpcy5zdHJpbmdMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0ZW5lcigpOwotCQl0aGlzLmRlbGVnYXRlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRGVsZWdhdGVMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHN0cmluZyBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogV3JhcCBhIHBsYWluIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBEb2N1bWVudEFkYXB0ZXIoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlcikgewotCQl0aGlzKHN0cmluZ0hvbGRlciwgbmV3IFBsYWluRG9jdW1lbnQoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3RyaW5nTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFN0cmluZ0xpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN0cmluZ0xpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXIudGhpcy5zdHJpbmdDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInN0cmluZyBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tYmluZWRMaXN0ZW5lciBidWlsZERlbGVnYXRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSW50ZXJuYWxMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEb2N1bWVudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbHMgaWYgbmVjZXNzYXJ5LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50TGlzdGVuZXIoRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChEb2N1bWVudExpc3RlbmVyLmNsYXNzKSA9PSAwKSB7Ci0JCQl0aGlzLmRlbGVnYXRlLmFkZERvY3VtZW50TGlzdGVuZXIodGhpcy5kZWxlZ2F0ZUxpc3RlbmVyKTsKLQkJCXRoaXMuZW5nYWdlU3RyaW5nSG9sZGVyKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lckxpc3QuYWRkKERvY3VtZW50TGlzdGVuZXIuY2xhc3MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWxzIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50TGlzdGVuZXIoRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5yZW1vdmUoRG9jdW1lbnRMaXN0ZW5lci5jbGFzcywgbGlzdGVuZXIpOwotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChEb2N1bWVudExpc3RlbmVyLmNsYXNzKSA9PSAwKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVN0cmluZ0hvbGRlcigpOwotCQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHRoaXMuZGVsZWdhdGVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBkZWxlZ2F0ZSBkb2N1bWVudCBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHVibGljIHZvaWQgYWRkVW5kb2FibGVFZGl0TGlzdGVuZXIoVW5kb2FibGVFZGl0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyQ291bnQoVW5kb2FibGVFZGl0TGlzdGVuZXIuY2xhc3MpID09IDApIHsKLQkJCXRoaXMuZGVsZWdhdGUuYWRkVW5kb2FibGVFZGl0TGlzdGVuZXIodGhpcy5kZWxlZ2F0ZUxpc3RlbmVyKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQoVW5kb2FibGVFZGl0TGlzdGVuZXIuY2xhc3MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGRlbGVnYXRlIGRvY3VtZW50IGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVVuZG9hYmxlRWRpdExpc3RlbmVyKFVuZG9hYmxlRWRpdExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShVbmRvYWJsZUVkaXRMaXN0ZW5lci5jbGFzcywgbGlzdGVuZXIpOwotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChVbmRvYWJsZUVkaXRMaXN0ZW5lci5jbGFzcykgPT0gMCkgewotCQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmVVbmRvYWJsZUVkaXRMaXN0ZW5lcih0aGlzLmRlbGVnYXRlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3Qga2V5KSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFByb3BlcnR5KGtleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHV0UHJvcGVydHkoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXRoaXMuZGVsZWdhdGUucHV0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBtb2RlbCBzdHJpbmcgZGlyZWN0bHkuCi0JICogVGhlIHJlc3VsdGluZyBldmVudCB3aWxsIGJlIGlnbm9yZWQ6IEBzZWUgI3N5bmNocm9uaXplRGVsZWdhdGUoU3RyaW5nKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IG9mZnNldCwgaW50IGxlbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmUob2Zmc2V0LCBsZW4pOwotCQl0aGlzLnN0cmluZ0hvbGRlci5zZXRWYWx1ZSh0aGlzLmRlbGVnYXRlLmdldFRleHQoMCwgdGhpcy5kZWxlZ2F0ZS5nZXRMZW5ndGgoKSkpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byB1cGRhdGUgdGhlIHVuZGVybHlpbmcgbW9kZWwgc3RyaW5nIGRpcmVjdGx5LgotCSAqIFRoZSByZXN1bHRpbmcgZXZlbnQgd2lsbCBiZSBpZ25vcmVkOiBAc2VlICNzeW5jaHJvbml6ZURlbGVnYXRlKFN0cmluZykuCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0U3RyaW5nKGludCBvZmZzZXQsIFN0cmluZyBpbnNlcnRlZFN0cmluZywgQXR0cmlidXRlU2V0IGEpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRoaXMuZGVsZWdhdGUuaW5zZXJ0U3RyaW5nKG9mZnNldCwgaW5zZXJ0ZWRTdHJpbmcsIGEpOwotCQl0aGlzLnN0cmluZ0hvbGRlci5zZXRWYWx1ZSh0aGlzLmRlbGVnYXRlLmdldFRleHQoMCwgdGhpcy5kZWxlZ2F0ZS5nZXRMZW5ndGgoKSkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRUZXh0KG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnZXRUZXh0KGludCBvZmZzZXQsIGludCBsZW5ndGgsIFNlZ21lbnQgdHh0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aGlzLmRlbGVnYXRlLmdldFRleHQob2Zmc2V0LCBsZW5ndGgsIHR4dCk7Ci0JfQotCi0JcHVibGljIFBvc2l0aW9uIGdldFN0YXJ0UG9zaXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFN0YXJ0UG9zaXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgUG9zaXRpb24gZ2V0RW5kUG9zaXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldEVuZFBvc2l0aW9uKCk7Ci0JfQotCi0JcHVibGljIFBvc2l0aW9uIGNyZWF0ZVBvc2l0aW9uKGludCBvZmZzKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5jcmVhdGVQb3NpdGlvbihvZmZzKTsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudFtdIGdldFJvb3RFbGVtZW50cygpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0Um9vdEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgZ2V0RGVmYXVsdFJvb3RFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXREZWZhdWx0Um9vdEVsZW1lbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW5kZXIoUnVubmFibGUgcikgewotCQl0aGlzLmRlbGVnYXRlLnJlbmRlcihyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwdWJsaWMgRG9jdW1lbnRMaXN0ZW5lcltdIGRvY3VtZW50TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKERvY3VtZW50TGlzdGVuZXIuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBVbmRvYWJsZUVkaXRMaXN0ZW5lcltdIHVuZG9hYmxlRWRpdExpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycyhVbmRvYWJsZUVkaXRMaXN0ZW5lci5jbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIEEgdGhpcmQgcGFydHkgaGFzIG1vZGlmaWVkIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHN0cmluZy4KLQkgKiBTeW5jaHJvbml6ZSB0aGUgZGVsZWdhdGUgZG9jdW1lbnQgYWNjb3JkaW5nbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RyaW5nQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc3luY2hyb25pemVEZWxlZ2F0ZSgoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIHRoZSBkb2N1bWVudCdzIGVudGlyZSB0ZXh0IHN0cmluZyB3aXRoIHRoZSBuZXcgc3RyaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplRGVsZWdhdGUoU3RyaW5nIHMpIHsKLQkJdHJ5IHsKLQkJCWludCBsZW4gPSB0aGlzLmRlbGVnYXRlLmdldExlbmd0aCgpOwotCQkJLy8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIGRlbGVnYXRlIGhhcyBhbHJlYWR5IGJlZW4gc3luY2hyb25pemVkCi0JCQkvLyAodmlhICNpbnNlcnRTdHJpbmcoKSBvciAjcmVtb3ZlKCkpCi0JCQlpZiAoICEgdGhpcy5kZWxlZ2F0ZS5nZXRUZXh0KDAsIGxlbikuZXF1YWxzKHMpKSB7Ci0JCQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmUoMCwgbGVuKTsKLQkJCQl0aGlzLmRlbGVnYXRlLmluc2VydFN0cmluZygwLCBzLCBudWxsKTsKLQkJCX0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpKTsJLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4uLgotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3RyaW5nSG9sZGVyKCkgewotCQl0aGlzLnN0cmluZ0hvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zdHJpbmdMaXN0ZW5lcik7Ci0JCXRoaXMuc3luY2hyb25pemVEZWxlZ2F0ZSh0aGlzLnN0cmluZ0hvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdHJpbmdIb2xkZXIoKSB7Ci0JCXRoaXMuc3RyaW5nSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN0cmluZ0xpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxlZ2F0ZUNoYW5nZWRVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkvLyBubyBuZWVkIHRvIGxhenktaW5pdGlhbGl6ZSB0aGUgZXZlbnQ7Ci0JCS8vIHdlIHdvdWxkbid0IGdldCBoZXJlIGlmIHdlIGRpZCBub3QgaGF2ZSBsaXN0ZW5lcnMuLi4KLQkJRG9jdW1lbnRFdmVudCBlZSA9IG5ldyBJbnRlcm5hbERvY3VtZW50RXZlbnQodGhpcywgZXZlbnQpOwotCQlEb2N1bWVudExpc3RlbmVyW10gbGlzdGVuZXJzID0gdGhpcy5kb2N1bWVudExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlsaXN0ZW5lcnNbaV0uY2hhbmdlZFVwZGF0ZShlZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxlZ2F0ZUluc2VydFVwZGF0ZShEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCS8vIG5vIG5lZWQgdG8gbGF6eS1pbml0aWFsaXplIHRoZSBldmVudDsKLQkJLy8gd2Ugd291bGRuJ3QgZ2V0IGhlcmUgaWYgd2UgZGlkIG5vdCBoYXZlIGxpc3RlbmVycy4uLgotCQlEb2N1bWVudEV2ZW50IGVlID0gbmV3IEludGVybmFsRG9jdW1lbnRFdmVudCh0aGlzLCBldmVudCk7Ci0JCURvY3VtZW50TGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSB0aGlzLmRvY3VtZW50TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWxpc3RlbmVyc1tpXS5pbnNlcnRVcGRhdGUoZWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZWdhdGVSZW1vdmVVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkvLyBubyBuZWVkIHRvIGxhenktaW5pdGlhbGl6ZSB0aGUgZXZlbnQ7Ci0JCS8vIHdlIHdvdWxkbid0IGdldCBoZXJlIGlmIHdlIGRpZCBub3QgaGF2ZSBsaXN0ZW5lcnMuLi4KLQkJRG9jdW1lbnRFdmVudCBlZSA9IG5ldyBJbnRlcm5hbERvY3VtZW50RXZlbnQodGhpcywgZXZlbnQpOwotCQlEb2N1bWVudExpc3RlbmVyW10gbGlzdGVuZXJzID0gdGhpcy5kb2N1bWVudExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlsaXN0ZW5lcnNbaV0ucmVtb3ZlVXBkYXRlKGVlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGVnYXRlVW5kb2FibGVFZGl0SGFwcGVuZWQoVW5kb2FibGVFZGl0RXZlbnQgZXZlbnQpIHsKLQkJLy8gbm8gbmVlZCB0byBsYXp5LWluaXRpYWxpemUgdGhlIGV2ZW50OwotCQkvLyB3ZSB3b3VsZG4ndCBnZXQgaGVyZSBpZiB3ZSBkaWQgbm90IGhhdmUgbGlzdGVuZXJzLi4uCi0JCVVuZG9hYmxlRWRpdEV2ZW50IGVlID0gbmV3IFVuZG9hYmxlRWRpdEV2ZW50KHRoaXMsIGV2ZW50LmdldEVkaXQoKSk7Ci0JCVVuZG9hYmxlRWRpdExpc3RlbmVyW10gbGlzdGVuZXJzID0gdGhpcy51bmRvYWJsZUVkaXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChpbnQgaSA9IGxpc3RlbmVycy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJbGlzdGVuZXJzW2ldLnVuZG9hYmxlRWRpdEhhcHBlbmVkKGVlKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnN0cmluZ0hvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gcykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gcmVhZCBpbiBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFJlYWRPYmplY3QoKTsKLQkJdGhpcy5zdHJpbmdMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0ZW5lcigpOwotCX0KLQotCi0vLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBpbnRlcmZhY2UgQ29tYmluZWRMaXN0ZW5lciBleHRlbmRzIERvY3VtZW50TGlzdGVuZXIsIFVuZG9hYmxlRWRpdExpc3RlbmVyLCBTZXJpYWxpemFibGUgewotCQkvLyBqdXN0IGNvbnNvbGlkYXRlIHRoZSB0d28gaW50ZXJmYWNlcwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBJbnRlcm5hbExpc3RlbmVyIGltcGxlbWVudHMgQ29tYmluZWRMaXN0ZW5lciB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwdWJsaWMgdm9pZCBjaGFuZ2VkVXBkYXRlKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCURvY3VtZW50QWRhcHRlci50aGlzLmRlbGVnYXRlQ2hhbmdlZFVwZGF0ZShldmVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgaW5zZXJ0VXBkYXRlKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCURvY3VtZW50QWRhcHRlci50aGlzLmRlbGVnYXRlSW5zZXJ0VXBkYXRlKGV2ZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJRG9jdW1lbnRBZGFwdGVyLnRoaXMuZGVsZWdhdGVSZW1vdmVVcGRhdGUoZXZlbnQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHVuZG9hYmxlRWRpdEhhcHBlbmVkKFVuZG9hYmxlRWRpdEV2ZW50IGV2ZW50KSB7Ci0JCQlEb2N1bWVudEFkYXB0ZXIudGhpcy5kZWxlZ2F0ZVVuZG9hYmxlRWRpdEhhcHBlbmVkKGV2ZW50KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEludGVybmFsRG9jdW1lbnRFdmVudAotCQlleHRlbmRzIEV2ZW50T2JqZWN0Ci0JCWltcGxlbWVudHMgRG9jdW1lbnRFdmVudAotCXsKLQkJcHJvdGVjdGVkIERvY3VtZW50RXZlbnQgZGVsZWdhdGU7Ci0JCi0JCXByb3RlY3RlZCBJbnRlcm5hbERvY3VtZW50RXZlbnQoRG9jdW1lbnQgZG9jdW1lbnQsIERvY3VtZW50RXZlbnQgZGVsZWdhdGUpIHsKLQkJCXN1cGVyKGRvY3VtZW50KTsKLQkJCXRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLQkJfQotCQlwdWJsaWMgRWxlbWVudENoYW5nZSBnZXRDaGFuZ2UoRWxlbWVudCBlbGVtKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRDaGFuZ2UoZWxlbSk7Ci0JCX0KLQkJcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KCkgewotCQkJcmV0dXJuIChEb2N1bWVudCkgdGhpcy5zb3VyY2U7Ci0JCX0KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRMZW5ndGgoKTsKLQkJfQotCQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldE9mZnNldCgpOwotCQl9Ci0JCXB1YmxpYyBFdmVudFR5cGUgZ2V0VHlwZSgpIHsKLQkJCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFR5cGUoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDFjMWU0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0TGlzdE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3REYXRhTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5MaXN0TW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIExpc3REYXRhTGlzdGVuZXIKLSAqIChlLmcuIGEgSkxpc3QpIGluIHN5bmNoIHdpdGggYSBMaXN0VmFsdWVNb2RlbCAob3IgYSBDb2xsZWN0aW9uVmFsdWVNb2RlbCkuCi0gKiAKLSAqIEFuIGluc3RhbmNlIG9mIHRoaXMgTGlzdE1vZGVsICptdXN0KiBiZSBzdXBwbGllZCB3aXRoIGEgdmFsdWUgbW9kZWwsCi0gKiB3aGljaCBpcyBhIExpc3RWYWx1ZU1vZGVsIG9uIHRoZSBib3VuZCBsaXN0IG9yIGEgQ29sbGVjdGlvblZhbHVlTW9kZWwKLSAqIG9uIHRoZSBib3VuZCBjb2xsZWN0aW9uLiBUaGlzIGlzIHJlcXVpcmVkIC0gdGhlIGxpc3QgKG9yIGNvbGxlY3Rpb24pCi0gKiBpdHNlbGYgY2FuIGJlIG51bGwsIGJ1dCB0aGUgdmFsdWUgbW9kZWwgdGhhdCBob2xkcyBpdCBjYW5ub3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0TW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBBYnN0cmFjdExpc3RNb2RlbAotewotCS8qKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuICovCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXI7Ci0KLQkvKioKLQkgKiBDYWNoZSB0aGUgc2l6ZSBvZiB0aGUgbGlzdCBmb3IgImRyYW1hdGljIiBjaGFuZ2VzLgotCSAqIEBzZWUgI2xpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGxpc3RTaXplOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gZm9yd2FyZCBjaGFuZ2VzIG1hZGUgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvciAtIGluaXRpYWxpemUgc3R1ZmYuCi0JICovCi0JcHJpdmF0ZSBMaXN0TW9kZWxBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RTaXplID0gMDsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbGlzdCBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIExpc3RNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlcikgewotCQl0aGlzKCk7Ci0JCXRoaXMuc2V0TW9kZWwobGlzdEhvbGRlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgY29sbGVjdGlvbiBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIExpc3RNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8Pz4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKCk7Ci0JCXRoaXMuc2V0TW9kZWwoY29sbGVjdGlvbkhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0TW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdE1vZGVsQWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0TW9kZWxBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudEF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLmdldChpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0IGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRMaXN0RGF0YUxpc3RlbmVyKExpc3REYXRhTGlzdGVuZXIgbCkgewotCQlpZiAodGhpcy5oYXNOb0xpc3REYXRhTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJCXRoaXMubGlzdFNpemUgPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCQl9Ci0JCXN1cGVyLmFkZExpc3REYXRhTGlzdGVuZXIobCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdERhdGFMaXN0ZW5lcihMaXN0RGF0YUxpc3RlbmVyIGwpIHsKLQkJc3VwZXIucmVtb3ZlTGlzdERhdGFMaXN0ZW5lcihsKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0RGF0YUxpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCQl0aGlzLmxpc3RTaXplID0gMDsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdW5kZXJseWluZyBsaXN0IG1vZGVsLgotCSAqLwotCXB1YmxpYyBMaXN0VmFsdWVNb2RlbDw/PiBtb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlcjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSB1bmRlcmx5aW5nIGxpc3QgbW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlcikgewotCQlpZiAobGlzdEhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlib29sZWFuIGhhc0xpc3RlbmVycyA9IHRoaXMuaGFzTGlzdERhdGFMaXN0ZW5lcnMoKTsKLQkJaWYgKGhhc0xpc3RlbmVycykgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXRoaXMubGlzdEhvbGRlciA9IGxpc3RIb2xkZXI7Ci0JCWlmIChoYXNMaXN0ZW5lcnMpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJCXRoaXMubGlzdENoYW5nZWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdW5kZXJseWluZyBjb2xsZWN0aW9uIG1vZGVsLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJyYXd0eXBlcyIgfSkKLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/PiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXRoaXMuc2V0TW9kZWwobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIoY29sbGVjdGlvbkhvbGRlcikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbW9kZWwgaGFzIG5vIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0xpc3REYXRhTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0RGF0YUxpc3RlbmVycygpLmxlbmd0aCA9PSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbW9kZWwgaGFzIGFueSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdERhdGFMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTm9MaXN0RGF0YUxpc3RlbmVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiB0aGUgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQlpbnQgc3RhcnQgPSBldmVudC5nZXRJbmRleCgpOwotCQlpbnQgZW5kID0gc3RhcnQgKyBldmVudC5nZXRJdGVtc1NpemUoKSAtIDE7Ci0JCXRoaXMuZmlyZUludGVydmFsQWRkZWQodGhpcywgc3RhcnQsIGVuZCk7Ci0JCXRoaXMubGlzdFNpemUgKz0gZXZlbnQuZ2V0SXRlbXNTaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4KLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaW50IHN0YXJ0ID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJaW50IGVuZCA9IHN0YXJ0ICsgZXZlbnQuZ2V0SXRlbXNTaXplKCkgLSAxOwotCQl0aGlzLmZpcmVJbnRlcnZhbFJlbW92ZWQodGhpcywgc3RhcnQsIGVuZCk7Ci0JCXRoaXMubGlzdFNpemUgLT0gZXZlbnQuZ2V0SXRlbXNTaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZXBsYWNlZCBpbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCWludCBzdGFydCA9IGV2ZW50LmdldEluZGV4KCk7Ci0JCWludCBlbmQgPSBzdGFydCArIGV2ZW50LmdldEl0ZW1zU2l6ZSgpIC0gMTsKLQkJdGhpcy5maXJlQ29udGVudHNDaGFuZ2VkKHRoaXMsIHN0YXJ0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgbW92ZWQgaW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4KLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlpbnQgc3RhcnQgPSBNYXRoLm1pbihldmVudC5nZXRTb3VyY2VJbmRleCgpLCBldmVudC5nZXRUYXJnZXRJbmRleCgpKTsKLQkJaW50IGVuZCA9IE1hdGgubWF4KGV2ZW50LmdldFNvdXJjZUluZGV4KCksIGV2ZW50LmdldFRhcmdldEluZGV4KCkpICsgZXZlbnQuZ2V0TGVuZ3RoKCkgLSAxOwotCQl0aGlzLmZpcmVDb250ZW50c0NoYW5nZWQodGhpcywgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdCB3YXMgY2xlYXJlZC4KLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKCkgewotCQlpZiAodGhpcy5saXN0U2l6ZSAhPSAwKSB7Ci0JCQl0aGlzLmZpcmVJbnRlcnZhbFJlbW92ZWQodGhpcywgMCwgdGhpcy5saXN0U2l6ZSAtIDEpOwotCQkJdGhpcy5saXN0U2l6ZSA9IDA7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgdW5kZXJseWluZyBtb2RlbCBsaXN0IGhhcyBjaGFuZ2VkICJkcmFtYXRpY2FsbHkiLgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoKSB7Ci0JCWlmICh0aGlzLmxpc3RTaXplICE9IDApIHsKLQkJCXRoaXMuZmlyZUludGVydmFsUmVtb3ZlZCh0aGlzLCAwLCB0aGlzLmxpc3RTaXplIC0gMSk7Ci0JCX0KLQkJdGhpcy5saXN0U2l6ZSA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JCWlmICh0aGlzLmxpc3RTaXplICE9IDApIHsKLQkJCXRoaXMuZmlyZUludGVydmFsQWRkZWQodGhpcywgMCwgdGhpcy5saXN0U2l6ZSAtIDEpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0U3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjQzMGMzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJMaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGphdmF4LnN3aW5nLlNwaW5uZXJMaXN0TW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIENoYW5nZUxpc3RlbmVyCi0gKiAoZS5nLiBhIEpTcGlubmVyKSBpbiBzeW5jaCB3aXRoIGEgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgYSB2YWx1ZQotICogaW4gdGhlIGxpc3QuCi0gKiAKLSAqIFRoaXMgY2xhc3MgbXVzdCBiZSBhIHN1Yi1jbGFzcyBvZiBTcGlubmVyTGlzdE1vZGVsIGJlY2F1c2Ugb2Ygc29tZQotICogY3JhcHB5IGpkayBjb2RlLi4uLiAgfmJqdgotICogQHNlZSBqYXZheC5zd2luZy5KU3Bpbm5lciNjcmVhdGVFZGl0b3IoamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsKQotICogCi0gKiBOQjogVGhpcyBtb2RlbCBzaG91bGQgb25seSBiZSB1c2VkIGZvciB2YWx1ZXMgdGhhdCBoYXZlIGEgcmVhc29uYWJseQotICogaW5leHBlbnNpdmUgI2VxdWFscygpIGltcGxlbWVudGF0aW9uLgotICogQHNlZSAjc3luY2hyb25pemUoT2JqZWN0KQotICogCi0gKiBJZiB0aGlzIGNsYXNzIG5lZWRzIHRvIGJlIG1vZGlmaWVkLCBpdCB3b3VsZCBiZWhvb3ZlIHVzIHRvIHJldmlldyB0aGUKLSAqIG90aGVyLCBzaW1pbGFyIGNsYXNzZXM6Ci0gKiBAc2VlIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyCi0gKiBAc2VlIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIExpc3RTcGlubmVyTW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBTcGlubmVyTGlzdE1vZGVsCi17Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlOyB1c2VkIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgdmFsdWUgaXMgbnVsbC4KLQkgKiBUaGUgZGVmYXVsdCBpcyB0aGUgZmlyc3QgaXRlbSBvbiB0aGUgbGlzdC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBkZWZhdWx0VmFsdWU7Ci0KLQkvKiogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyB2YWx1ZS4gKi8KLQlwcml2YXRlIGZpbmFsIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHdpdGggY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlLiAqLwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB2YWx1ZUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVXNlIHRoZSBtb2RlbCB2YWx1ZSBpdHNlbGYgYXMgdGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIHZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHZhbHVlIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIG5ldyBPYmplY3RbXSB7ZGVmYXVsdFZhbHVlfSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVXNlIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IG9mIHZhbHVlcyBhcyB0aGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlLgotCSAqLwotCXB1YmxpYyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcihNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIE9iamVjdFtdIHZhbHVlcykgewotCQl0aGlzKHZhbHVlSG9sZGVyLCB2YWx1ZXMsIHZhbHVlc1swXSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcihNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIE9iamVjdFtdIHZhbHVlcywgT2JqZWN0IGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzKHZhbHVlSG9sZGVyLCBBcnJheXMuYXNMaXN0KHZhbHVlcyksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFVzZSB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCBvZiB2YWx1ZXMgYXMgdGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBMaXN0PE9iamVjdD4gdmFsdWVzKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIHZhbHVlcywgdmFsdWVzLmdldCgwKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcihNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIExpc3Q8T2JqZWN0PiB2YWx1ZXMsIE9iamVjdCBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIodmFsdWVzKTsKLQkJdGhpcy52YWx1ZUhvbGRlciA9IHZhbHVlSG9sZGVyOwotCQl0aGlzLnZhbHVlQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcigpOwotCQkvLyBwb3N0cG9uZSBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIudGhpcy5zeW5jaHJvbml6ZShldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTcGlubmVyTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBtZXRob2QgaXMgYmVpbmcgY2FsbGVkIGJlZm9yZSB3ZSAKLQkgKiBoYXZlIGFueSBsaXN0ZW5lcnMuCi0JICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzb21lIGNyYXBweSBqZGsgY29kZSBnZXRzIHRoZSB2YWx1ZQotCSAqIGZyb20gdGhlIG1vZGVsICpiZWZvcmUqIGxpc3RlbmluZyB0byB0aGUgbW9kZWwuICB+Ymp2Ci0JICogQHNlZSBqYXZheC5zd2luZy5KU3Bpbm5lci5EZWZhdWx0RWRpdG9yKGphdmF4LnN3aW5nLkpTcGlubmVyKQotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCWlmICh0aGlzLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQkvLyBzb3JyeSBhYm91dCB0aGlzICJsYXRlcmFsIiBjYWxsIHRvIHN1cGVyICB+Ymp2Ci0JCQlzdXBlci5zZXRWYWx1ZSh0aGlzLnNwaW5uZXJWYWx1ZU9mKHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byB1cGRhdGUgdGhlIHVuZGVybHlpbmcgdmFsdWUgZGlyZWN0bHkuCi0JICogVGhlIHJlc3VsdGluZyBldmVudCB3aWxsIGJlIGlnbm9yZWQ6IEBzZWUgI3N5bmNocm9uaXplKE9iamVjdCkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCXN1cGVyLnNldFZhbHVlKHZhbHVlKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyB2YWx1ZSBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMudmFsdWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudmFsdWVDaGFuZ2VMaXN0ZW5lcik7Ci0JCQl0aGlzLnN5bmNocm9uaXplKHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJc3VwZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyB2YWx1ZSBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQl0aGlzLnZhbHVlSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnZhbHVlQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRvIGEgbm9uLW51bGwgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBzcGlubmVyVmFsdWVPZihPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCkgOiB2YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0IHRoZSBzcGlubmVyIHZhbHVlIGlmIGl0IGhhcyBjaGFuZ2VkLgotCSAqLwotCXZvaWQgc3luY2hyb25pemUoT2JqZWN0IHZhbHVlKSB7Ci0JCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuc3Bpbm5lclZhbHVlT2YodmFsdWUpOwotCQkvLyBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgc3Bpbm5lciB2YWx1ZSBoYXMgYWxyZWFkeSBiZWVuIHN5bmNocm9uaXplZAotCQkvLyAodmlhICNzZXRWYWx1ZSgpKQotCQlpZiAoICEgdGhpcy5nZXRWYWx1ZSgpLmVxdWFscyhuZXdWYWx1ZSkpIHsKLQkJCXRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy52YWx1ZUhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MWE4OTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck51bWJlck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5TcGlubmVyTnVtYmVyTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIENoYW5nZUxpc3RlbmVyCi0gKiAoZS5nLiBhIEpTcGlubmVyKSBpbiBzeW5jaCB3aXRoIGEgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgYSBudW1iZXIuCi0gKiAKLSAqIFRoaXMgY2xhc3MgbXVzdCBiZSBhIHN1Yi1jbGFzcyBvZiBTcGlubmVyTnVtYmVyTW9kZWwgYmVjYXVzZSBvZiBzb21lCi0gKiBjcmFwcHkgamRrIGNvZGUuLi4uICB+Ymp2Ci0gKiBAc2VlIGphdmF4LnN3aW5nLkpTcGlubmVyI2NyZWF0ZUVkaXRvcihqYXZheC5zd2luZy5TcGlubmVyTW9kZWwpCi0gKiAKLSAqIElmIHRoaXMgY2xhc3MgbmVlZHMgdG8gYmUgbW9kaWZpZWQsIGl0IHdvdWxkIGJlaG9vdmUgdXMgdG8gcmV2aWV3IHRoZQotICogb3RoZXIsIHNpbWlsYXIgY2xhc3NlczoKLSAqIEBzZWUgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqIEBzZWUgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIKLQlleHRlbmRzIFNwaW5uZXJOdW1iZXJNb2RlbAotewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZTsgdXNlZCB3aGVuIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwgbnVtYmVyIHZhbHVlIGlzIG51bGwuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBOdW1iZXIgZGVmYXVsdFZhbHVlOwotCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbnVtYmVyLiAqLwotCXByaXZhdGUgZmluYWwgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IG51bWJlckhvbGRlcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgd2l0aAotCSAqIGNoYW5nZXMgbWFkZSB0byB0aGUgdW5kZXJseWluZyBudW1iZXIuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIG51bWJlckNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBudW1iZXIgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWUgaXMgemVyby4KLQkgKiBUaGUgc3RlcCBzaXplIGlzIG9uZS4KLQkgKi8KLQlwdWJsaWMgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcihNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gbnVtYmVySG9sZGVyKSB7Ci0JCXRoaXMobnVtYmVySG9sZGVyLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBudW1iZXIgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoZSBzdGVwIHNpemUgaXMgb25lLgotCSAqLwotCXB1YmxpYyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBudW1iZXJIb2xkZXIsIGludCBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyhudW1iZXJIb2xkZXIsIG51bGwsIG51bGwsIEludGVnZXIudmFsdWVPZigxKSwgSW50ZWdlci52YWx1ZU9mKGRlZmF1bHRWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIG51bWJlciBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVXNlIHRoZSBtaW5pbXVtIHZhbHVlIGFzIHRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWUuCi0JICovCi0JcHVibGljIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IG51bWJlckhvbGRlciwgaW50IG1pbmltdW0sIGludCBtYXhpbXVtLCBpbnQgc3RlcFNpemUpIHsKLQkJdGhpcyhudW1iZXJIb2xkZXIsIG1pbmltdW0sIG1heGltdW0sIHN0ZXBTaXplLCBtaW5pbXVtKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBudW1iZXIgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBudW1iZXJIb2xkZXIsIGludCBtaW5pbXVtLCBpbnQgbWF4aW11bSwgaW50IHN0ZXBTaXplLCBpbnQgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXMobnVtYmVySG9sZGVyLCBJbnRlZ2VyLnZhbHVlT2YobWluaW11bSksIEludGVnZXIudmFsdWVPZihtYXhpbXVtKSwgSW50ZWdlci52YWx1ZU9mKHN0ZXBTaXplKSwgSW50ZWdlci52YWx1ZU9mKGRlZmF1bHRWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIG51bWJlciBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVXNlIHRoZSBtaW5pbXVtIHZhbHVlIGFzIHRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWUuCi0JICovCi0JcHVibGljIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IG51bWJlckhvbGRlciwgZG91YmxlIG1pbmltdW0sIGRvdWJsZSBtYXhpbXVtLCBkb3VibGUgc3RlcFNpemUpIHsKLQkJdGhpcyhudW1iZXJIb2xkZXIsIG1pbmltdW0sIG1heGltdW0sIHN0ZXBTaXplLCBtaW5pbXVtKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBudW1iZXIgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBudW1iZXJIb2xkZXIsIGRvdWJsZSBtaW5pbXVtLCBkb3VibGUgbWF4aW11bSwgZG91YmxlIHN0ZXBTaXplLCBkb3VibGUgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXMobnVtYmVySG9sZGVyLCBEb3VibGUudmFsdWVPZihtaW5pbXVtKSwgRG91YmxlLnZhbHVlT2YobWF4aW11bSksIERvdWJsZS52YWx1ZU9mKHN0ZXBTaXplKSwgRG91YmxlLnZhbHVlT2YoZGVmYXVsdFZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbnVtYmVyIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcihNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gbnVtYmVySG9sZGVyLCBDb21wYXJhYmxlPD8+IG1pbmltdW0sIENvbXBhcmFibGU8Pz4gbWF4aW11bSwgTnVtYmVyIHN0ZXBTaXplLCBOdW1iZXIgZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKG51bWJlckhvbGRlci5nZXRWYWx1ZSgpID09IG51bGwgPyBkZWZhdWx0VmFsdWUgOiAoTnVtYmVyKSBudW1iZXJIb2xkZXIuZ2V0VmFsdWUoKSwgbWluaW11bSwgbWF4aW11bSwgc3RlcFNpemUpOwotCQl0aGlzLm51bWJlckhvbGRlciA9IG51bWJlckhvbGRlcjsKLQkJdGhpcy5udW1iZXJDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGROdW1iZXJDaGFuZ2VMaXN0ZW5lcigpOwotCQkvLyBwb3N0cG9uZSBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbnVtYmVyCi0JCS8vIHVudGlsIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcy4uLgotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGROdW1iZXJDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTnVtYmVyQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTnVtYmVyQ2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCU51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIudGhpcy5zeW5jaHJvbml6ZShldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIm51bWJlciBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3Bpbm5lck1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBjaGVjayB3aGV0aGVyIHRoaXMgbWV0aG9kIGlzIGJlaW5nIGNhbGxlZCBiZWZvcmUgd2UgCi0JICogaGF2ZSBhbnkgbGlzdGVuZXJzLgotCSAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc29tZSBjcmFwcHkgamRrIGNvZGUgZ2V0cyB0aGUgdmFsdWUKLQkgKiBmcm9tIHRoZSBtb2RlbCAqYmVmb3JlKiBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsLiAgfmJqdgotCSAqIEBzZWUgamF2YXguc3dpbmcuSlNwaW5uZXIuRGVmYXVsdEVkaXRvcihqYXZheC5zd2luZy5KU3Bpbm5lcikKLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJLy8gc29ycnkgYWJvdXQgdGhpcyAibGF0ZXJhbCIgY2FsbCB0byBzdXBlciAgfmJqdgotCQkJc3VwZXIuc2V0VmFsdWUodGhpcy5zcGlubmVyVmFsdWVPZih0aGlzLm51bWJlckhvbGRlci5nZXRWYWx1ZSgpKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBudW1iZXIgZGlyZWN0bHkuCi0JICogVGhlIHJlc3VsdGluZyBldmVudCB3aWxsIGJlIGlnbm9yZWQ6IEBzZWUgI3N5bmNocm9uaXplRGVsZWdhdGUoT2JqZWN0KS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJc3VwZXIuc2V0VmFsdWUodmFsdWUpOwotCQl0aGlzLm51bWJlckhvbGRlci5zZXRWYWx1ZSgoTnVtYmVyKSB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBudW1iZXIgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQl0aGlzLm51bWJlckhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5udW1iZXJDaGFuZ2VMaXN0ZW5lcik7Ci0JCQl0aGlzLnN5bmNocm9uaXplKHRoaXMubnVtYmVySG9sZGVyLmdldFZhbHVlKCkpOwotCQl9Ci0JCXN1cGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbnVtYmVyIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMubnVtYmVySG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLm51bWJlckNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBOdW1iZXIgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0byBhIG5vbi1udWxsIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgc3Bpbm5lclZhbHVlT2YoT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiAodmFsdWUgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRWYWx1ZSgpIDogdmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgc3Bpbm5lciB2YWx1ZSBpZiBpdCBoYXMgY2hhbmdlZC4KLQkgKi8KLQl2b2lkIHN5bmNocm9uaXplKE9iamVjdCB2YWx1ZSkgewotCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLnNwaW5uZXJWYWx1ZU9mKHZhbHVlKTsKLQkJLy8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIGRhdGUgaGFzIGFscmVhZHkgYmVlbiBzeW5jaHJvbml6ZWQKLQkJLy8gKHZpYSAjc2V0VmFsdWUoKSkKLQkJaWYgKCAhIHRoaXMuZ2V0VmFsdWUoKS5lcXVhbHMobmV3VmFsdWUpKSB7Ci0JCQl0aGlzLnNldFZhbHVlKG5ld1ZhbHVlKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubnVtYmVySG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL09iamVjdExpc3RTZWxlY3Rpb25Nb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NTM4ZTcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmF4LnN3aW5nLkRlZmF1bHRMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3REYXRhRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdERhdGFMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0U2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLQotLyoqCi0gKiBUaGlzIExpc3RTZWxlY3Rpb25Nb2RlbCBpcyBhd2FyZSBvZiB0aGUgTGlzdE1vZGVsIGFuZAotICogcHJvdmlkZXMgY29udmVuaWVuY2UgbWV0aG9kcyB0byBhY2Nlc3MgYW5kIHNldCB0aGUKLSAqIHNlbGVjdGVkICpvYmplY3RzKiwgYXMgb3Bwb3NlZCB0byB0aGUgc2VsZWN0ZWQgKmluZGV4ZXMqLgotICovCi1wdWJsaWMgY2xhc3MgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsCi0JZXh0ZW5kcyBEZWZhdWx0TGlzdFNlbGVjdGlvbk1vZGVsCi17Ci0JLyoqIFRoZSBsaXN0IG1vZGVsIHJlZmVyZW5jZWQgYnkgdGhlIGxpc3Qgc2VsZWN0aW9uIG1vZGVsLiAqLwotCXByaXZhdGUgZmluYWwgTGlzdE1vZGVsIGxpc3RNb2RlbDsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIGNsZWFyIHRoZSBzZWxlY3Rpb24gd2hlbiB0aGUgbGlzdCBtb2RlbCBoYXMgY2hhbmdlZC4gKi8KLQlwcml2YXRlIGZpbmFsIExpc3REYXRhTGlzdGVuZXIgbGlzdERhdGFMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBzZWxlY3Rpb24gbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdCBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsKExpc3RNb2RlbCBsaXN0TW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0TW9kZWwgPSBsaXN0TW9kZWw7Ci0JCXRoaXMubGlzdERhdGFMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0RGF0YUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgTGlzdERhdGFMaXN0ZW5lciBidWlsZExpc3REYXRhTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdERhdGFMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGludGVydmFsQWRkZWQoTGlzdERhdGFFdmVudCBldmVudCkgewotCQkJCS8vIHRoaXMgZG9lcyBub3QgYWZmZWN0IHRoZSBzZWxlY3Rpb24KLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGludGVydmFsUmVtb3ZlZChMaXN0RGF0YUV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gdGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIHNlbGVjdGlvbgotCQkJfQotCQkJcHVibGljIHZvaWQgY29udGVudHNDaGFuZ2VkKExpc3REYXRhRXZlbnQgZXZlbnQpIHsKLQkJCQlPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwudGhpcy5saXN0TW9kZWxDb250ZW50c0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBkYXRhIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFR5cGljYWxseSwgdGhlIHNlbGVjdGlvbiBkb2VzIG5vdCBuZWVkIHRvIGJlIGNsZWFyZWQgd2hlbiB0aGUKLQkgKiBjb250ZW50cyBvZiB0aGUgbGlzdCBoYXZlIGNoYW5nZWQuIE1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBqdXN0Ci0JICogbWVhbnMgYW4gaXRlbSBoYXMgY2hhbmdlZCBpbiBhIHdheSB0aGF0IGFmZmVjdHMgaXRzIGRpc3BsYXkgc3RyaW5nCi0JICogb3IgaWNvbi4gV2UgdHlwaWNhbGx5IG9ubHkgdXNlIHRoZSBjbGFzcyBmb3IgZWRpdHMgaW52b2x2aW5nCi0JICogc2luZ2xlIHNlbGVjdGlvbi4KLQkgKiBBIHN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGUgc2VsZWN0aW9uCi0JICogc2hvdWxkIGJlIGNsZWFyZWQgYmVjYXVzZSBhIGNoYW5nZSBjb3VsZCBtZWFuIHRoZSBzZWxlY3Rpb24gaXMgaW52YWxpZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0TW9kZWxDb250ZW50c0NoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3REYXRhRXZlbnQgZXZlbnQpIHsKLQkJLyoqdGhpcy5jbGVhclNlbGVjdGlvbigpOyovCi0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RTZWxlY3Rpb25Nb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIoTGlzdFNlbGVjdGlvbkxpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0U2VsZWN0aW9uTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMubGlzdE1vZGVsLmFkZExpc3REYXRhTGlzdGVuZXIodGhpcy5saXN0RGF0YUxpc3RlbmVyKTsKLQkJfQotCQlzdXBlci5hZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIobCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdFNlbGVjdGlvbkxpc3RlbmVyKExpc3RTZWxlY3Rpb25MaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZUxpc3RTZWxlY3Rpb25MaXN0ZW5lcihsKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0U2VsZWN0aW9uTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMubGlzdE1vZGVsLnJlbW92ZUxpc3REYXRhTGlzdGVuZXIodGhpcy5saXN0RGF0YUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbW9kZWwgaGFzIG5vIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0xpc3RTZWxlY3Rpb25MaXN0ZW5lcnMoKSB7CS8vIHByaXZhdGUtcHJvdGVjdGVkCi0JCXJldHVybiB0aGlzLmdldExpc3RTZWxlY3Rpb25MaXN0ZW5lcnMoKS5sZW5ndGggPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgbW9kZWwgcmVmZXJlbmNlZCBieSB0aGUgbGlzdCBzZWxlY3Rpb24gbW9kZWwuCi0JICovCi0JcHVibGljIExpc3RNb2RlbCBnZXRMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgaW50IHNlbGVjdGVkVmFsdWVzU2l6ZSgpIHsKLQkJaW50IG1pbiA9IHRoaXMuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKTsKLQkJaW50IG1heCA9IHRoaXMuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKTsKLQotCQlpZiAoKG1pbiA8IDApIHx8IChtYXggPCAwKSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlpbnQgbiA9IDA7Ci0JCWludCBjb3VudCA9IHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0U2l6ZSgpOwotCQlmb3IgKGludCBpID0gbWluOyBpIDw9IG1heDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5pc1NlbGVjdGVkSW5kZXgoaSkgJiYgKGkgPCBjb3VudCkpIHsKLQkJCQluKys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBzZWxlY3RlZCB2YWx1ZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyBPYmplY3Qgc2VsZWN0ZWRWYWx1ZSgpIHsKLQkJaW50IGluZGV4ID0gdGhpcy5nZXRNaW5TZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICh0aGlzLmdldExpc3RNb2RlbCgpLmdldFNpemUoKSA8PSBpbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHNlbGVjdGVkIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gc2VsZWN0ZWRWYWx1ZXMoKSB7Ci0JCWludCBtaW4gPSB0aGlzLmdldE1pblNlbGVjdGlvbkluZGV4KCk7Ci0JCWludCBtYXggPSB0aGlzLmdldE1heFNlbGVjdGlvbkluZGV4KCk7Ci0KLQkJaWYgKChtaW4gPCAwKSB8fCAobWF4IDwgMCkpIHsKLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0KLQkJaW50IG1heFNpemUgPSAobWF4IC0gbWluKSArIDE7Ci0JCU9iamVjdFtdIHRlbXAgPSBuZXcgT2JqZWN0W21heFNpemVdOwotCQlpbnQgbiA9IDA7Ci0JCWludCBjb3VudCA9IHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0U2l6ZSgpOwotCQlmb3IgKGludCBpID0gbWluOyBpIDw9IG1heDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5pc1NlbGVjdGVkSW5kZXgoaSkgJiYgKGkgPCBjb3VudCkpIHsKLQkJCQl0ZW1wW24rK10gPSB0aGlzLmdldExpc3RNb2RlbCgpLmdldEVsZW1lbnRBdChpKTsKLQkJCX0KLQkJfQotCQlpZiAobiA9PSBtYXhTaXplKSB7Ci0JCQkvLyBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSB3ZXJlIHNlbGVjdGVkCi0JCQlyZXR1cm4gdGVtcDsKLQkJfQotCQkvLyBvbmx5IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSB3ZXJlIHNlbGVjdGVkCi0JCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3Rbbl07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgcmVzdWx0LCAwLCBuKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHNlbGVjdGVkIGluZGljZXMgaW4gb3JkZXIuCi0JICovCi0JcHVibGljIGludFtdIHNlbGVjdGVkSW5kaWNlcygpIHsKLQkJaW50IG1pbiA9IHRoaXMuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKTsKLQkJaW50IG1heCA9IHRoaXMuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKTsKLQotCQlpZiAoKG1pbiA8IDApIHx8IChtYXggPCAwKSkgewotCQkJcmV0dXJuIG5ldyBpbnRbMF07Ci0JCX0KLQotCQlpbnQgbWF4U2l6ZSA9IChtYXggLSBtaW4pICsgMTsKLQkJaW50W10gdGVtcCA9IG5ldyBpbnRbbWF4U2l6ZV07Ci0JCWludCBuID0gMDsKLQkJaW50IGNvdW50ID0gdGhpcy5nZXRMaXN0TW9kZWwoKS5nZXRTaXplKCk7Ci0JCWZvciAoaW50IGkgPSBtaW47IGkgPD0gbWF4OyBpKyspIHsKLQkJCWlmICh0aGlzLmlzU2VsZWN0ZWRJbmRleChpKSAmJiAoaSA8IGNvdW50KSkgewotCQkJCXRlbXBbbisrXSA9IGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG4gPT0gbWF4U2l6ZSkgewotCQkJLy8gYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2Ugd2VyZSBzZWxlY3RlZAotCQkJQXJyYXlzLnNvcnQodGVtcCk7Ci0JCQlyZXR1cm4gdGVtcDsKLQkJfQotCQkvLyBvbmx5IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSB3ZXJlIHNlbGVjdGVkCi0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbbl07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgcmVzdWx0LCAwLCBuKTsKLQkJQXJyYXlzLnNvcnQocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNlbGVjdGVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkVmFsdWUoT2JqZWN0IG9iamVjdCkgewotCQl0aGlzLnNldFNlbGVjdGVkVmFsdWVzKENvbGxlY3Rpb25Ub29scy5zaW5nbGV0b25JdGVyYXRvcihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMgdG8gdGhlIHNwZWNpZmllZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI3NldFNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkVmFsdWVzKEl0ZXJhdG9yPD8+IG9iamVjdHMpIHsKLQkJdGhpcy5zZXRWYWx1ZUlzQWRqdXN0aW5nKHRydWUpOwotCQl0aGlzLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCXRoaXMuYWRkU2VsZWN0ZWRWYWx1ZXNJbnRlcm5hbChvYmplY3RzKTsKLQkJdGhpcy5zZXRWYWx1ZUlzQWRqdXN0aW5nKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMgdG8gdGhlIHNwZWNpZmllZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI3NldFNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkVmFsdWVzKENvbGxlY3Rpb248Pz4gb2JqZWN0cykgewotCQl0aGlzLnNldFNlbGVjdGVkVmFsdWVzKG9iamVjdHMuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBjdXJyZW50IHNldCBvZiBzZWxlY3RlZCBvYmplY3RzIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNzZXRTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZFZhbHVlcyhPYmplY3RbXSBvYmplY3RzKSB7Ci0JCXRoaXMuc2V0U2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKG9iamVjdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjYWRkU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0ZWRWYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXRoaXMuYWRkU2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKG9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG9iamVjdHMgdG8gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjYWRkU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0ZWRWYWx1ZXMoSXRlcmF0b3I8Pz4gb2JqZWN0cykgewotCQl0aGlzLnNldFZhbHVlSXNBZGp1c3RpbmcodHJ1ZSk7Ci0JCXRoaXMuYWRkU2VsZWN0ZWRWYWx1ZXNJbnRlcm5hbChvYmplY3RzKTsKLQkJdGhpcy5zZXRWYWx1ZUlzQWRqdXN0aW5nKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBvYmplY3RzIHRvIHRoZSBjdXJyZW50IHNldCBvZiBzZWxlY3RlZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI2FkZFNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGVkVmFsdWVzKENvbGxlY3Rpb248Pz4gb2JqZWN0cykgewotCQl0aGlzLmFkZFNlbGVjdGVkVmFsdWVzKG9iamVjdHMuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyB0byB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNhZGRTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3RlZFZhbHVlcyhPYmplY3RbXSBvYmplY3RzKSB7Ci0JCXRoaXMuYWRkU2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKG9iamVjdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvYmplY3QgZnJvbSB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNyZW1vdmVTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZFZhbHVlKE9iamVjdCBvYmplY3QpIHsKLQkJdGhpcy5yZW1vdmVTZWxlY3RlZFZhbHVlcyhDb2xsZWN0aW9uVG9vbHMuc2luZ2xldG9uSXRlcmF0b3Iob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyBmcm9tIHRoZSBjdXJyZW50IHNldCBvZiBzZWxlY3RlZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI3JlbW92ZVNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkVmFsdWVzKEl0ZXJhdG9yPD8+IG9iamVjdHMpIHsKLQkJdGhpcy5zZXRWYWx1ZUlzQWRqdXN0aW5nKHRydWUpOwotCQlMaXN0TW9kZWwgbG0gPSB0aGlzLmdldExpc3RNb2RlbCgpOwotCQlpbnQgbG1TaXplID0gbG0uZ2V0U2l6ZSgpOwotCQl3aGlsZSAob2JqZWN0cy5oYXNOZXh0KCkpIHsKLQkJCWludCBpbmRleCA9IHRoaXMuaW5kZXhPZihvYmplY3RzLm5leHQoKSwgbG0sIGxtU2l6ZSk7Ci0JCQl0aGlzLnJlbW92ZVNlbGVjdGlvbkludGVydmFsKGluZGV4LCBpbmRleCk7Ci0JCX0KLQkJdGhpcy5zZXRWYWx1ZUlzQWRqdXN0aW5nKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvYmplY3RzIGZyb20gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjcmVtb3ZlU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvbjw/PiBvYmplY3RzKSB7Ci0JCXRoaXMucmVtb3ZlU2VsZWN0ZWRWYWx1ZXMob2JqZWN0cy5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvYmplY3RzIGZyb20gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjcmVtb3ZlU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRWYWx1ZXMoT2JqZWN0W10gb2JqZWN0cykgewotCQl0aGlzLnJlbW92ZVNlbGVjdGVkVmFsdWVzKENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihvYmplY3RzKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjZ2V0QW5jaG9yU2VsZWN0aW9uSW5kZXgoKQotCSAqIFJldHVybiBudWxsIGlmIHRoZSBhbmNob3Igc2VsZWN0aW9uIGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QW5jaG9yU2VsZWN0ZWRWYWx1ZSgpIHsKLQkJaW50IGluZGV4ID0gdGhpcy5nZXRBbmNob3JTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmdldExpc3RNb2RlbCgpLmdldEVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjc2V0QW5jaG9yU2VsZWN0aW9uSW5kZXgoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFuY2hvclNlbGVjdGVkVmFsdWUoT2JqZWN0IG9iamVjdCkgewotCQl0aGlzLnNldEFuY2hvclNlbGVjdGlvbkluZGV4KHRoaXMuaW5kZXhPZihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNnZXRMZWFkU2VsZWN0aW9uSW5kZXgoKQotCSAqIFJldHVybiBudWxsIGlmIHRoZSBsZWFkIHNlbGVjdGlvbiBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExlYWRTZWxlY3RlZFZhbHVlKCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldExlYWRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmdldExpc3RNb2RlbCgpLmdldEVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjc2V0TGVhZFNlbGVjdGlvbkluZGV4KGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZWFkU2VsZWN0ZWRWYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXRoaXMuc2V0TGVhZFNlbGVjdGlvbkluZGV4KHRoaXMuaW5kZXhPZihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNnZXRNYXhTZWxlY3Rpb25JbmRleCgpCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIG1heCBzZWxlY3Rpb24gaXMgZW1wdHkuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNYXhTZWxlY3RlZFZhbHVlKCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldE1heFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNnZXRNaW5TZWxlY3Rpb25JbmRleCgpCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIG1pbiBzZWxlY3Rpb24gaXMgZW1wdHkuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNaW5TZWxlY3RlZFZhbHVlKCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldE1pblNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNpc1NlbGVjdGVkSW5kZXgoaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbHVlSXNTZWxlY3RlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0aGlzLmlzU2VsZWN0ZWRJbmRleCh0aGlzLmluZGV4T2Yob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyB0byB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cywKLQkgKiB3aXRob3V0IHdyYXBwaW5nIHRoZSBhY3Rpb25zIGluICJhZGp1c3RpbmciIGV2ZW50cy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkU2VsZWN0ZWRWYWx1ZXNJbnRlcm5hbChJdGVyYXRvcjw/PiBvYmplY3RzKSB7Ci0JCUxpc3RNb2RlbCBsbSA9IHRoaXMuZ2V0TGlzdE1vZGVsKCk7Ci0JCWludCBsaXN0TW9kZWxTaXplID0gbG0uZ2V0U2l6ZSgpOwotCQl3aGlsZSAob2JqZWN0cy5oYXNOZXh0KCkpIHsKLQkJCWludCBpbmRleCA9IHRoaXMuaW5kZXhPZihvYmplY3RzLm5leHQoKSwgbG0sIGxpc3RNb2RlbFNpemUpOwotCQkJdGhpcy5hZGRTZWxlY3Rpb25JbnRlcnZhbChpbmRleCwgaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBpbiB0aGUgbGlzdCBtb2RlbCBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiBSZXR1cm4gLTEgaWYgdGhlIG9iamVjdCBpcyBub3QgaW4gdGhlIGxpc3QgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBpbnQgaW5kZXhPZihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3RNb2RlbCBsbSA9IHRoaXMuZ2V0TGlzdE1vZGVsKCk7Ci0JCXJldHVybiB0aGlzLmluZGV4T2Yob2JqZWN0LCBsbSwgbG0uZ2V0U2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGluIHRoZSBsaXN0IG1vZGVsIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIFJldHVybiAtMSBpZiB0aGUgb2JqZWN0IGlzIG5vdCBpbiB0aGUgbGlzdCBtb2RlbC4KLQkgKi8KLQkvLyB3ZSdyZSBqdXN0IGplcmtpbmcgYXJvdW5kIHdpdGggcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyBoZXJlCi0JLy8gKGluIG1lbW9yeSBvZiBQaGlsLi4uKTsKLQkvLyBjYWxsIHRoaXMgbWV0aG9kIGluc2lkZSBsb29wcyB0aGF0IGRvIG5vdCBtb2RpZnkgdGhlIGxpc3RNb2RlbAotCXByaXZhdGUgaW50IGluZGV4T2YoT2JqZWN0IG9iamVjdCwgTGlzdE1vZGVsIGxtLCBpbnQgbGlzdE1vZGVsU2l6ZSkgewotCQlmb3IgKGludCBpID0gbGlzdE1vZGVsU2l6ZTsgaS0tID4gMDsgKSB7Ci0JCQlpZiAobG0uZ2V0RWxlbWVudEF0KGkpLmVxdWFscyhvYmplY3QpKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmU5ZmNhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1ByaW1pdGl2ZUxpc3RUcmVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0TXV0YWJsZVRyZWVOb2RlOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuRGVmYXVsdFRyZWVNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLk11dGFibGVUcmVlTm9kZTsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVOb2RlOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZVBhdGg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgVHJlZU1vZGVsIGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGEgdHJlZSB3aXRoIGEgIm51bGwiIHJvb3QgdGhhdAotICogaGFzIGEgc2V0IG9mICJwcmltaXRpdmUiIGNoaWxkcmVuLiBUaGVzZSAicHJpbWl0aXZlIiBjaGlsZHJlbiBkbyBub3QgaGF2ZQotICogY2hpbGRyZW4gdGhlbXNlbHZlcywgbWFraW5nIHRoZSB0cmVlIGEgbWF4aW11bSBvZiAyIGxldmVscyBkZWVwLgotICogVGhpcyBtb2RlbCBhdXRvbWF0aWNhbGx5IHN5bmNocm9uaXplcyB0aGUgcm9vdCdzIGNoaWxkcmVuIHdpdGggYQotICogTGlzdFZhbHVlTW9kZWwgdGhhdCBob2xkcyBhIGNvbGxlY3Rpb24gb2YgcHJpbWl0aXZlIChub24tbW9kZWwpIG9iamVjdHMKLSAqIChlLmcuIFN0cmluZ3MpLgotICogCi0gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgcHJvdmlkaW5nIGFuICJlZGl0YWJsZSIgbGlzdCBvZiBwcmltaXRpdmVzLiBTaW5jZSB0aGUgSkRLCi0gKiBkb2VzIG5vdCBwcm92aWRlIHVzIHdpdGggYW4gZWRpdGFibGUgbGlzdGJveCwgd2UgbXVzdCB1c2UgYW4gZWRpdGFibGUgdHJlZS4KLSAqIFdlIHdyYXAgZXZlcnl0aGluZyBpbiBEZWZhdWx0TXV0YWJsZVRyZWVOb2Rlcy4KLSAqIAotICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCAjcHJpbWl0aXZlQ2hhbmdlZChpbnQsIE9iamVjdCkgYW5kIHVwZGF0ZQotICogdGhlIG1vZGVsIGFwcHJvcHJpYXRlbHkuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGVkaXRzIHRoZQotICogbGlzdCBkaXJlY3RseSBhbmQgcHJlc3NlcyA8RW50ZXI+LgotICogCi0gKiBUaGUgSlRyZWUgdXNpbmcgdGhpcyBtb2RlbCBtdXN0IGJlIGNvbmZpZ3VyZWQgYXMgImVkaXRhYmxlIjoKLSAqIAl0cmVlLnNldEVkaXRhYmxlKHRydWUpOwotICovCi0vLyBUT0RPIGNvbnZlcnQgdG8gdXNlIGFuIGFkYXB0ZXIgaW5zdGVhZCBvZiByZXF1aXJpbmcgc3ViY2xhc3MKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcmltaXRpdmVMaXN0VHJlZU1vZGVsCi0JZXh0ZW5kcyBEZWZhdWx0VHJlZU1vZGVsCi17Ci0JLyoqIGEgbW9kZWwgb24gdGhlIGxpc3Qgb2YgcHJpbWl0aXZlcyAqLwotCXByaXZhdGUgZmluYWwgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlcjsKLQotCS8qKiBhIGxpc3RlbmVyIHRoYXQgaGFuZGxlcyB0aGUgYWRkaW5nLCByZW1vdmluZywgYW5kIHJlcGxhY2luZyBvZiB0aGUgcHJpbWl0aXZlcyAqLwotCXByaXZhdGUgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQotCS8qKgotCSAqIFB1YmxpYyBjb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciBpcyByZXF1aXJlZAotCSAqLwotCXB1YmxpYyBQcmltaXRpdmVMaXN0VHJlZU1vZGVsKExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIobmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUobnVsbCwgdHJ1ZSkpOyAgLy8gdHJ1ZSA9IHRoZSByb290IGNhbiBoYXZlIGNoaWxkcmVuCi0JCWlmIChsaXN0SG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdEhvbGRlciA9IGxpc3RIb2xkZXI7Ci0JCXRoaXMubGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQkvLyBwb3N0cG9uZSBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsIHVudGlsIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcmltaXRpdmVMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gdXBkYXRlIHRoZSAKLQkgKiBtb2RlbCBhcHByb3ByaWF0ZWx5LiBUaGUgcHJpbWl0aXZlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggd2FzCi0JICogZWRpdGVkIGRpcmVjdGx5IGJ5IHRoZSB1c2VyIGFuZCB0aGUgbmV3IHZhbHVlIGlzIGFzIHNwZWNpZmllZC4KLQkgKiBDb252ZXJ0IHRoZSB2YWx1ZSBhcHByb3ByaWF0ZWx5IGFuZCBwbGFjZSBpdCBpbiB0aGUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJpbWl0aXZlQ2hhbmdlZChpbnQgaW5kZXgsIE9iamVjdCBuZXdWYWx1ZSk7Ci0KLQotCS8vICoqKioqKioqKiogVHJlZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIGNoYW5nZSB0aGUgdW5kZXJseWluZyBtb2RlbCBpbnN0ZWFkIG9mIGNoYW5naW5nIHRoZSBub2RlIGRpcmVjdGx5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbHVlRm9yUGF0aENoYW5nZWQoVHJlZVBhdGggcGF0aCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCVRyZWVOb2RlIG5vZGUgPSAoVHJlZU5vZGUpIHBhdGguZ2V0TGFzdFBhdGhDb21wb25lbnQoKTsKLQkJaW50IGluZGV4ID0gKChUcmVlTm9kZSkgdGhpcy5nZXRSb290KCkpLmdldEluZGV4KG5vZGUpOwotCQl0aGlzLnByaW1pdGl2ZUNoYW5nZWQoaW5kZXgsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUcmVlTW9kZWxMaXN0ZW5lcihUcmVlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCWlmICh0aGlzLmdldFRyZWVNb2RlbExpc3RlbmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQl0aGlzLmxpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCQl0aGlzLnN5bmNocm9uaXplTGlzdCgpOwotCQl9Ci0JCXN1cGVyLmFkZFRyZWVNb2RlbExpc3RlbmVyKGwpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVUcmVlTW9kZWxMaXN0ZW5lcihUcmVlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZVRyZWVNb2RlbExpc3RlbmVyKGwpOwotCQlpZiAodGhpcy5nZXRUcmVlTW9kZWxMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN5bmNocm9uaXplIG91ciBsaXN0IG9mIG5vZGVzIHdpdGggdGhlIGxpc3Qgb2YgcHJpbWl0aXZlcwotCSAqLwotCXZvaWQgc3luY2hyb25pemVMaXN0KCkgewotCQl0aGlzLmNsZWFyTGlzdCgpOwotCQl0aGlzLmJ1aWxkTGlzdCgpOwotCX0KLQotCXZvaWQgY2xlYXJMaXN0KCkgewotCQlpbnQgY2hpbGRjb3VudCA9IHRoaXMucm9vdC5nZXRDaGlsZENvdW50KCk7Ci0JCWZvciAoaW50IGkgPSBjaGlsZGNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCXRoaXMucmVtb3ZlTm9kZUZyb21QYXJlbnQoKE11dGFibGVUcmVlTm9kZSl0aGlzLnJvb3QuZ2V0Q2hpbGRBdChpKSk7Ci0JCX0KLQl9Ci0JCQotCXByaXZhdGUgdm9pZCBidWlsZExpc3QoKSB7Ci0JCWZvciAoSXRlcmF0b3I8Pz4gc3RyZWFtID0gdGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5hZGRQcmltaXRpdmUoc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBwcmltaXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkUHJpbWl0aXZlKE9iamVjdCBwcmltaXRpdmUpIHsKLQkJdGhpcy5pbnNlcnRQcmltaXRpdmUodGhpcy5yb290LmdldENoaWxkQ291bnQoKSwgcHJpbWl0aXZlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBub2RlIGZvciB0aGUgc3BlY2lmaWVkIHByaW1pdGl2ZQotCSAqIGFuZCBpbnNlcnQgaXQgYXMgYSBjaGlsZCBvZiB0aGUgcm9vdC4KLQkgKi8KLQl2b2lkIGluc2VydFByaW1pdGl2ZShpbnQgaW5kZXgsIE9iamVjdCBwcmltaXRpdmUpIHsKLQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBub2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUocHJpbWl0aXZlLCBmYWxzZSk7IC8vIGRvbid0IGFsbG93IGNoaWxkcmVuIG9uIHRoZSBjaGlsZCBub2RlCi0JCXRoaXMuaW5zZXJ0Tm9kZUludG8obm9kZSwgKE11dGFibGVUcmVlTm9kZSkgdGhpcy5yb290LCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIG5vZGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKi8KLQlNdXRhYmxlVHJlZU5vZGUgcmVtb3ZlTm9kZShpbnQgaW5kZXgpIHsKLQkJTXV0YWJsZVRyZWVOb2RlIG5vZGUgPSAoTXV0YWJsZVRyZWVOb2RlKSB0aGlzLnJvb3QuZ2V0Q2hpbGRBdChpbmRleCk7Ci0JCXRoaXMucmVtb3ZlTm9kZUZyb21QYXJlbnQobm9kZSk7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgdGhlIHVzZXIgb2JqZWN0IG9mIHRoZSBub2RlIGF0IGNoaWxkSW5kZXguCi0JICovCi0Jdm9pZCByZXBsYWNlUHJpbWl0aXZlKGludCBpbmRleCwgT2JqZWN0IHByaW1pdGl2ZSkgewotCQlNdXRhYmxlVHJlZU5vZGUgbm9kZSA9IChNdXRhYmxlVHJlZU5vZGUpIHRoaXMucm9vdC5nZXRDaGlsZEF0KGluZGV4KTsKLQkJbm9kZS5zZXRVc2VyT2JqZWN0KHByaW1pdGl2ZSk7Ci0JCXRoaXMubm9kZUNoYW5nZWQobm9kZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgUHJpbWl0aXZlTGlzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgTGlzdENoYW5nZUxpc3RlbmVyIHsKLQkJUHJpbWl0aXZlTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQlpbnQgaSA9IGV2ZW50LmdldEluZGV4KCk7Ci0JCQlmb3IgKE9iamVjdCBpdGVtIDogZXZlbnQuZ2V0SXRlbXMoKSkgewotCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWwudGhpcy5pbnNlcnRQcmltaXRpdmUoaSsrLCBpdGVtKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnQuZ2V0SXRlbXNTaXplKCk7IGkrKykgewotCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWwudGhpcy5yZW1vdmVOb2RlKGV2ZW50LmdldEluZGV4KCkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQlpbnQgaSA9IGV2ZW50LmdldEluZGV4KCk7Ci0JCQlmb3IgKE9iamVjdCBpdGVtIDogZXZlbnQuZ2V0TmV3SXRlbXMoKSkgewotCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWwudGhpcy5yZXBsYWNlUHJpbWl0aXZlKGkrKywgaXRlbSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCUFycmF5TGlzdDxNdXRhYmxlVHJlZU5vZGU+IHRlbXAgPSBuZXcgQXJyYXlMaXN0PE11dGFibGVUcmVlTm9kZT4oZXZlbnQuZ2V0TGVuZ3RoKCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJdGVtcC5hZGQoUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC50aGlzLnJlbW92ZU5vZGUoZXZlbnQuZ2V0U291cmNlSW5kZXgoKSkpOwotCQkJfQotCQkJaW50IGkgPSBldmVudC5nZXRUYXJnZXRJbmRleCgpOwotCQkJZm9yIChNdXRhYmxlVHJlZU5vZGUgbm9kZSA6IHRlbXApIHsKLQkJCQlQcmltaXRpdmVMaXN0VHJlZU1vZGVsLnRoaXMuaW5zZXJ0UHJpbWl0aXZlKGkrKywgbm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC50aGlzLmNsZWFyTGlzdCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlQcmltaXRpdmVMaXN0VHJlZU1vZGVsLnRoaXMuc3luY2hyb25pemVMaXN0KCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JhZGlvQnV0dG9uTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNzI1MWMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5GaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIHtAbGluayBqYXZheC5zd2luZy5CdXR0b25Nb2RlbH0gY2FuIGJlIHVzZWQgdG8ga2VlcCBhIGxpc3RlbmVyCi0gKiAoZS5nLiBhIHtAbGluayBqYXZheC5zd2luZy5KUmFkaW9CdXR0b259KSBpbiBzeW5jaCB3aXRoIGEgKHR5cGljYWxseSBzaGFyZWQpCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbH0KLSAqIHRoYXQgaG9sZHMgb25lIHZhbHVlIG91dCBvZiBhIHNldCBvZiB2YWx1ZXMuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IERvIDxlbT5ub3Q8L2VtPiB1c2UgdGhpcyBtb2RlbCB3aXRoIGEKLSAqIHtAbGluayBqYXZheC5zd2luZy5CdXR0b25Hcm91cH0sIHNpbmNlIHRoZQotICogc2hhcmVkIHZhbHVlIGhvbGRlciBhbmQgdGhlIHdyYXBwZXJzIGJ1aWx0IGJ5IHRoaXMgYWRhcHRlciB3aWxsCi0gKiBrZWVwIHRoZSBhcHByb3ByaWF0ZSByYWRpbyBidXR0b24gY2hlY2tlZC4gQWxzbywgdGhpcyBhbGxvd3MKLSAqIHVzIHRvIHVuY2hlY2sgYWxsIHRoZSByYWRpbyBidXR0b25zIGluIGEgZ3JvdXAgd2hlbiB0aGUgc2hhcmVkCi0gKiB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLSAqLwotcHVibGljIGNsYXNzIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBUb2dnbGVCdXR0b25Nb2RlbEFkYXB0ZXIKLXsKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlciwgT2JqZWN0IGJ1dHRvblZhbHVlLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcihidWlsZEJvb2xlYW5Ib2xkZXIodmFsdWVIb2xkZXIsIGJ1dHRvblZhbHVlKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBPYmplY3QgYnV0dG9uVmFsdWUpIHsKLQkJc3VwZXIoYnVpbGRCb29sZWFuSG9sZGVyKHZhbHVlSG9sZGVyLCBidXR0b25WYWx1ZSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCdWlsZCB1cCBhIHNldCBvZiB3cmFwcGVycyB0aGF0IHdpbGwgY29udmVydCB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUgaG9sZGVyIGFuZCBidXR0b24gdmFsdWUgdG8vZnJvbSBhIGJvb2xlYW4uCi0JICogCi0JICogSWYgdGhlIHZhbHVlIGhvbGRlcidzIHZhbHVlIG1hdGNoZXMgdGhlIGJ1dHRvbiB2YWx1ZSwKLQkgKiB0aGUgd3JhcHBlciB3aWxsIHJldHVybiB0cnVlLiBMaWtld2lzZSwgaWYgdGhlIHZhbHVlIGhvbGRlcidzCi0JICogdmFsdWUgaXMgc2V0IHRvIHRydWUsIHRoZSB3cmFwcGVyIHdpbGwgc2V0IHRoZSB2YWx1ZSBob2xkZXIncwotCSAqIHZhbHVlIHRvIHRoZSBidXR0b24gdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQm9vbGVhbkhvbGRlcihNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIE9iamVjdCBidXR0b25WYWx1ZSkgewotCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gZmlsdGVyaW5nUFZNID0gbmV3IEZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4odmFsdWVIb2xkZXIsIEZpbHRlci5UcmFuc3BhcmVudC5pbnN0YW5jZSgpLCBuZXcgU2V0UmFkaW9CdXR0b25GaWx0ZXIoYnV0dG9uVmFsdWUpKTsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdCwgQm9vbGVhbj4oZmlsdGVyaW5nUFZNLCBuZXcgUmFkaW9CdXR0b25UcmFuc2Zvcm1lcihidXR0b25WYWx1ZSksIG5ldyBSZXZlcnNlUmFkaW9CdXR0b25UcmFuc2Zvcm1lcihidXR0b25WYWx1ZSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHVzZXIgY2Fubm90IGRlLXNlbGVjdCBhIHJhZGlvIGJ1dHRvbiAtIHRoZSB1c2VyCi0JICogY2FuIG9ubHkgKnNlbGVjdCogYSByYWRpbyBidXR0b24uIE9ubHkgdGhlIG1vZGVsIGNhbgotCSAqIGNhdXNlIGEgcmFkaW8gYnV0dG9uIHRvIGJlIGRlLXNlbGVjdGVkLiBXZSB1c2UgdGhlCi0JICogQVJNRUQgZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHdlIGFyZSBiZWluZyBkZS1zZWxlY3RlZAotCSAqIGJ5IHRoZSB1c2VyLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKGJvb2xlYW4gYikgewotCQkvLyBkbyBub3QgYWxsb3cgdGhlIHVzZXIgdG8gZGUtc2VsZWN0IGEgcmFkaW8gYnV0dG9uCi0JCS8vIHJhZGlvIGJ1dHRvbnMgY2FuCi0JCWlmICgoYiA9PSBmYWxzZSkgJiYgdGhpcy5pc0FybWVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5zZXRTZWxlY3RlZChiKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmlsdGVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGZpbHRlciB3aWxsIG9ubHkgcGFzcyB0aHJvdWdoIGEgbmV3IHZhbHVlIHRvIHRoZSB3cmFwcGVkCi0JICogdmFsdWUgbW9kZWwgd2hlbiBpdCBtYXRjaGVzIHRoZSBjb25maWd1cmVkIGJ1dHRvbiB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNldFJhZGlvQnV0dG9uRmlsdGVyCi0JCWltcGxlbWVudHMgRmlsdGVyPE9iamVjdD4KLQl7Ci0JCXByaXZhdGUgT2JqZWN0IGJ1dHRvblZhbHVlOwotCi0JCXB1YmxpYyBTZXRSYWRpb0J1dHRvbkZpbHRlcihPYmplY3QgYnV0dG9uVmFsdWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmJ1dHRvblZhbHVlID0gYnV0dG9uVmFsdWU7Ci0JCX0KLQotCQkvKioKLQkJICogcGFzcyB0aHJvdWdoIHRoZSB2YWx1ZSB0byB0aGUgd3JhcHBlZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbAotCQkgKiAqb25seSogd2hlbiBpdCBtYXRjaGVzIG91ciBidXR0b24gdmFsdWUKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3QgdmFsdWUpIHsKLQkJCXJldHVybiAodmFsdWUgIT0gbnVsbCkgJiYgdmFsdWUuZXF1YWxzKHRoaXMuYnV0dG9uVmFsdWUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRyYW5zZm9ybWVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIHRyYW5zZm9ybWVyIHdpbGwgY29udmVydCBhIHZhbHVlIHRvIHtAbGluayBCb29sZWFuI1RSVUV9Ci0JICogd2hlbiBpdCBtYXRjaGVzIHRoZSBjb25maWd1cmVkIGJ1dHRvbiB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFJhZGlvQnV0dG9uVHJhbnNmb3JtZXIKLQkJaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxPYmplY3QsIEJvb2xlYW4+Ci0JewotCQlwcml2YXRlIE9iamVjdCBidXR0b25WYWx1ZTsKLQotCQlwdWJsaWMgUmFkaW9CdXR0b25UcmFuc2Zvcm1lcihPYmplY3QgYnV0dG9uVmFsdWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmJ1dHRvblZhbHVlID0gYnV0dG9uVmFsdWU7Ci0JCX0KLQotCQkvKioKLQkJICogSWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBtYXRjaGVzIHRoZSBidXR0b24gdmFsdWUgcmV0dXJuIHtAbGluayBCb29sZWFuI1RSVUV9LAotCQkgKiBpZiBpdCBpcyBzb21lIG90aGVyIHZhbHVlIHJldHVybiB7QGxpbmsgQm9vbGVhbiNGQUxTRX07Ci0JCSAqIGJ1dCBpZiBpdCBpcyA8Y29kZT5udWxsPC9jb2RlPiBzaW1wbHkgcGFzcyBpdCB0aHJvdWdoIGJlY2F1c2UgaXQgd2lsbAotCQkgKiBjYXVzZSB0aGUgYnV0dG9uIG1vZGVsJ3MgZGVmYXVsdCB2YWx1ZSB0byBiZSB1c2VkCi0JCSAqLwotCQlwdWJsaWMgQm9vbGVhbiB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKSB7Ci0JCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gbnVsbCA6IEJvb2xlYW4udmFsdWVPZih2YWx1ZS5lcXVhbHModGhpcy5idXR0b25WYWx1ZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyB0cmFuc2Zvcm1lciB3aWxsIGNvbnZlcnQge0BsaW5rIEJvb2xlYW4jVFJVRX0gdG8gdGhlIGNvbmZpZ3VyZWQKLQkgKiBidXR0b24gdmFsdWUgYW5kIHtAbGluayBCb29sZWFuI0ZBTFNFfSB0byA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFJldmVyc2VSYWRpb0J1dHRvblRyYW5zZm9ybWVyCi0JCWltcGxlbWVudHMgVHJhbnNmb3JtZXI8Qm9vbGVhbiwgT2JqZWN0PgotCXsKLQkJcHJpdmF0ZSBPYmplY3QgYnV0dG9uVmFsdWU7Ci0KLQkJcHVibGljIFJldmVyc2VSYWRpb0J1dHRvblRyYW5zZm9ybWVyKE9iamVjdCBidXR0b25WYWx1ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYnV0dG9uVmFsdWUgPSBidXR0b25WYWx1ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBJZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIHtAbGluayBCb29sZWFuI1RSVUV9LAotCQkgKiBwYXNzIHRocm91Z2ggdGhlIG91ciBidXR0b24gdmFsdWU7Ci0JCSAqIG90aGVyd2lzZSBwYXNzIHRocm91Z2ggPGNvZGU+bnVsbDwvY29kZT4uCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybSAoQm9vbGVhbiB2YWx1ZSkgewotCQkJcmV0dXJuICh2YWx1ZS5ib29sZWFuVmFsdWUoKSkgPyB0aGlzLmJ1dHRvblZhbHVlIDogbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1NwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1NwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUzN2I3Mi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdFNwaW5uZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck51bWJlck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5TcGlubmVyTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIENoYW5nZUxpc3RlbmVyCi0gKiAoZS5nLiBhIEpTcGlubmVyKSBpbiBzeW5jaCB3aXRoIGEgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgYSB2YWx1ZS4KLSAqIAotICogTm90ZTogaXQgaXMgbGlrZWx5IHlvdSB3YW50IHRvIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBjbGFzc2VzIGluc3RlYWQgb2YKLSAqIHRoaXMgb25lOgotICogICAgIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyCi0gKiAgICAgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcgotICogICAgIExpc3RTcGlubmVyTW9kZWxBZGFwdGVyCi0gKiAKLSAqIE5COiBUaGlzIG1vZGVsIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHZhbHVlcyB0aGF0IGhhdmUgYSBmYWlybHkKLSAqIGluZXhwZW5zaXZlICNlcXVhbHMoKSBpbXBsZW1lbnRhdGlvbi4KLSAqIEBzZWUgI3N5bmNocm9uaXplRGVsZWdhdGUoT2JqZWN0KQotICovCi1wdWJsaWMgY2xhc3MgU3Bpbm5lck1vZGVsQWRhcHRlcgotCWV4dGVuZHMgQWJzdHJhY3RTcGlubmVyTW9kZWwKLXsKLQkvKiogVGhlIGRlbGVnYXRlIHNwaW5uZXIgbW9kZWwgd2hvc2UgYmVoYXZpb3Igd2UgImVuaGFuY2UiLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTcGlubmVyTW9kZWwgZGVsZWdhdGU7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBmb3J3YXJkIGFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGRlbGVnYXRlIHNwaW5uZXIgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIENoYW5nZUxpc3RlbmVyIGRlbGVnYXRlTGlzdGVuZXI7Ci0KLQkvKiogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdmFsdWVMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGFuZCBkZWxlZ2F0ZSBhcmUgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFNwaW5uZXJNb2RlbEFkYXB0ZXIoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBTcGlubmVyTW9kZWwgZGVsZWdhdGUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHZhbHVlSG9sZGVyID09IG51bGwgfHwgZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy52YWx1ZUhvbGRlciA9IHZhbHVlSG9sZGVyOwotCQl0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JCS8vIHBvc3Rwb25lIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyB2YWx1ZQotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQkJdGhpcy52YWx1ZUxpc3RlbmVyID0gdGhpcy5idWlsZFZhbHVlTGlzdGVuZXIoKTsKLQkJdGhpcy5kZWxlZ2F0ZUxpc3RlbmVyID0gdGhpcy5idWlsZERlbGVnYXRlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhpcyB3aWxsIHdyYXAgYSBzaW1wbGUgbnVtYmVyIHNwaW5uZXIgbW9kZWwuCi0JICovCi0JcHVibGljIFNwaW5uZXJNb2RlbEFkYXB0ZXIoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIG5ldyBTcGlubmVyTnVtYmVyTW9kZWwoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkVmFsdWVMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlTcGlubmVyTW9kZWxBZGFwdGVyLnRoaXMudmFsdWVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIGV4cGFuZCBhY2Nlc3MgYSBiaXQgZm9yIGlubmVyIGNsYXNzCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVN0YXRlQ2hhbmdlZCgpIHsKLQkJc3VwZXIuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCBDaGFuZ2VMaXN0ZW5lciBidWlsZERlbGVnYXRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkvLyBmb3J3YXJkIHRoZSBldmVudCwgd2l0aCB0aGlzIGFzIHRoZSBzb3VyY2UKLQkJCQlTcGlubmVyTW9kZWxBZGFwdGVyLnRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiZGVsZWdhdGUgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNwaW5uZXJNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byB1cGRhdGUgdGhlIHVuZGVybHlpbmcgdmFsdWUgZGlyZWN0bHkuCi0JICogVGhlIHJlc3VsdGluZyBldmVudCB3aWxsIGJlIGlnbm9yZWQ6IEBzZWUgI3N5bmNocm9uaXplRGVsZWdhdGUoT2JqZWN0KS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJdGhpcy5kZWxlZ2F0ZS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TmV4dFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXROZXh0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByZXZpb3VzVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFByZXZpb3VzVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChDaGFuZ2VMaXN0ZW5lci5jbGFzcykgPT0gMCkgewotCQkJdGhpcy5kZWxlZ2F0ZS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmRlbGVnYXRlTGlzdGVuZXIpOwotCQkJdGhpcy5lbmdhZ2VWYWx1ZUhvbGRlcigpOwotCQl9Ci0JCXN1cGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChDaGFuZ2VMaXN0ZW5lci5jbGFzcykgPT0gMCkgewotCQkJdGhpcy5kaXNlbmdhZ2VWYWx1ZUhvbGRlcigpOwotCQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmRlbGVnYXRlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIEEgdGhpcmQgcGFydHkgaGFzIG1vZGlmaWVkIHRoZSB1bmRlcmx5aW5nIHZhbHVlLgotCSAqIFN5bmNocm9uaXplIHRoZSBkZWxlZ2F0ZSBtb2RlbCBhY2NvcmRpbmdseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnN5bmNocm9uaXplRGVsZWdhdGUoZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBkZWxlZ2F0ZSdzIHZhbHVlIGlmIGl0IGhhcyBjaGFuZ2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplRGVsZWdhdGUoT2JqZWN0IHZhbHVlKSB7Ci0JCS8vIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSBkZWxlZ2F0ZSBoYXMgYWxyZWFkeSBiZWVuIHN5bmNocm9uaXplZAotCQkvLyAodmlhICNzZXRWYWx1ZSgpKQotCQlpZiAoICEgdGhpcy5kZWxlZ2F0ZS5nZXRWYWx1ZSgpLmVxdWFscyh2YWx1ZSkpIHsKLQkJCXRoaXMuZGVsZWdhdGUuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWVIb2xkZXIoKSB7Ci0JCXRoaXMudmFsdWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudmFsdWVMaXN0ZW5lcik7Ci0JCXRoaXMuc3luY2hyb25pemVEZWxlZ2F0ZSh0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlSG9sZGVyKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnZhbHVlTGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMudmFsdWVIb2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RhYmxlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZjEzNDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVGFibGVNb2RlbExpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLkFic3RyYWN0VGFibGVNb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIFRhYmxlTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIFRhYmxlTW9kZWxMaXN0ZW5lciAoZS5nLiBhIEpUYWJsZSkKLSAqIGluIHN5bmNoIHdpdGggYSBMaXN0VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgY29sbGVjdGlvbiBvZiBtb2RlbCBvYmplY3RzLAotICogZWFjaCBvZiB3aGljaCBjb3JyZXNwb25kcyB0byBhIHJvdyBpbiB0aGUgdGFibGUuCi0gKiBUeXBpY2FsbHksIGVhY2ggY29sdW1uIG9mIHRoZSB0YWJsZSB3aWxsIGJlIGJvdW5kIHRvIGEgZGlmZmVyZW50IGFzcGVjdAotICogb2YgdGhlIGNvbnRhaW5lZCBtb2RlbCBvYmplY3RzLgotICogCi0gKiBGb3IgZXhhbXBsZSwgYSBNV1RhYmxlIGhhcyBhbiBhdHRyaWJ1dGUgJ2RhdGFiYXNlRmllbGRzJyB0aGF0IGhvbGRzCi0gKiBhIGNvbGxlY3Rpb24gb2YgTVdEYXRhYmFzZUZpZWxkcyB0aGF0IHdvdWxkIGNvcnJlc3BvbmQgdG8gdGhlIHJvd3Mgb2YKLSAqIGEgSlRhYmxlOyBhbmQgZWFjaCBNV0RhdGFiYXNlRmllbGQgaGFzIGEgbnVtYmVyCi0gKiBvZiBhdHRyaWJ1dGVzIChlLmcuIG5hbWUsIHR5cGUsIHNpemUpIHRoYXQgY2FuIGJlIGJvdW5kIHRvIHRoZSBjb2x1bW5zIG9mCi0gKiBhIHJvdyBpbiB0aGUgSlRhYmxlLiBBcyB0aGVzZSBkYXRhYmFzZSBmaWVsZHMgYXJlIGFkZGVkLCByZW1vdmVkLCBhbmQKLSAqIGNoYW5nZWQsIHRoaXMgbW9kZWwgd2lsbCBrZWVwIHRoZSBsaXN0ZW5lcnMgYXdhcmUgb2YgdGhlIGNoYW5nZXMuCi0gKiAKLSAqIEFuIGluc3RhbmNlIG9mIHRoaXMgVGFibGVNb2RlbCBtdXN0IGJlIHN1cHBsaWVkIHdpdGggYQotICogbGlzdCBob2xkZXIgKGUuZy4gdGhlICdkYXRhYmFzZUZpZWxkcycpLCB3aGljaCBpcyBhIHZhbHVlCi0gKiBtb2RlbCBvbiB0aGUgYm91bmQgY29sbGVjdGlvbiBUaGlzIGlzIHJlcXVpcmVkIC0gdGhlCi0gKiBjb2xsZWN0aW9uIGl0c2VsZiBjYW4gYmUgbnVsbCwgYnV0IHRoZSBsaXN0IHZhbHVlIG1vZGVsIHRoYXQKLSAqIGhvbGRzIGl0IGlzIHJlcXVpcmVkLiBUeXBpY2FsbHkgdGhpcyBsaXN0IHdpbGwgYmUgc29ydGVkIChAc2VlCi0gKiBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXIpLgotICogCi0gKiBUaGlzIFRhYmxlTW9kZWwgbXVzdCBhbHNvIGJlIHN1cHBsaWVkIHdpdGggYSBDb2x1bW5BZGFwdGVyIHRoYXQKLSAqIHdpbGwgYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIGhlYWRlcnMsIHJlbmRlcmVycywgZWRpdG9ycywgYW5kIGNvbnRlbnRzCi0gKiBvZiB0aGUgdmFyaW91cyBjb2x1bW5zLgotICogCi0gKiBEZXNpZ24gZGVjaXNpb246Ci0gKiBDZWxsIGxpc3RlbmVyIG9wdGlvbnMgKGZyb20gbG93IHNwYWNlL2hpZ2ggdGltZSB0byBoaWdoIHNwYWNlL2xvdyB0aW1lKToKLSAqIAktIDEgY2VsbCBsaXN0ZW5lciBsaXN0ZW5pbmcgdG8gZXZlcnkgY2VsbCAodGhpcyBpcyB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbikKLSAqIAktIDEgY2VsbCBsaXN0ZW5lciBwZXIgcm93Ci0gKiAJLSAxIGNlbGwgbGlzdGVuZXIgcGVyIGNlbGwKLSAqLwotcHVibGljIGNsYXNzIFRhYmxlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwKLXsKLQkvKioKLQkgKiBhIGxpc3Qgb2YgdXNlciBvYmplY3RzIHRoYXQgYXJlIGNvbnZlcnRlZCB0bwotCSAqIHJvd3MgdmlhIHRoZSBjb2x1bW4gYWRhcHRlcgotCSAqLwotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogZWFjaCByb3cgaXMgYW4gYXJyYXkgb2YgY2VsbCBtb2RlbHMKLQkgKi8KLQkvLyBkZWNsYXJlIGFzIEFycmF5TGlzdCBzbyB3ZSBjYW4gdXNlICNlbnN1cmVDYXBhY2l0eShpbnQpCi0JcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8TW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10+IHJvd3M7Ci0KLQkvKioKLQkgKiBjbGllbnQtc3VwcGxpZWQgYWRhcHRlciB0aGF0IHByb3ZpZGVzIHdpdGggdGhlIHZhcmlvdXMgY29sdW1uCi0JICogc2V0dGluZ3MgYW5kIGNvbnZlcnRzIHRoZSBvYmplY3RzIGluIHRoZSBMVk0KLQkgKiBpbnRvIGFuIGFycmF5IG9mIGNlbGwgbW9kZWxzCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb2x1bW5BZGFwdGVyIGNvbHVtbkFkYXB0ZXI7Ci0KLQkvKioKLQkgKiB0aGUgc2luZ2xlIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBldmVyeSBjZWxsJ3MgbW9kZWwKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgY2VsbExpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0YWJsZSBtb2RlbCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdHMKLQkgKiBhbmQgYWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgVGFibGVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIsIENvbHVtbkFkYXB0ZXIgY29sdW1uQWRhcHRlcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdEhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RIb2xkZXIgPSBsaXN0SG9sZGVyOwotCQl0aGlzLmNvbHVtbkFkYXB0ZXIgPSBjb2x1bW5BZGFwdGVyOwotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5yb3dzID0gbmV3IEFycmF5TGlzdDxNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXT4oKTsKLQkJdGhpcy5jZWxsTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ2VsbExpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdGFibGUgbW9kZWwgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3RzCi0JICogYW5kIGFkYXB0ZXIuCi0JICovCi0JcHVibGljIFRhYmxlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyLCBDb2x1bW5BZGFwdGVyIGNvbHVtbkFkYXB0ZXIpIHsKLQkJdGhpcyhuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPihjb2xsZWN0aW9uSG9sZGVyKSwgY29sdW1uQWRhcHRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMuYWRkUm93cyhldmVudC5nZXRJbmRleCgpLCBldmVudC5nZXRJdGVtc1NpemUoKSwgdGhpcy5nZXRJdGVtcyhldmVudCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMucmVtb3ZlUm93cyhldmVudC5nZXRJbmRleCgpLCBldmVudC5nZXRJdGVtc1NpemUoKSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLnJlcGxhY2VSb3dzKGV2ZW50LmdldEluZGV4KCksIHRoaXMuZ2V0TmV3SXRlbXMoZXZlbnQpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMubW92ZVJvd3MoZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKSwgZXZlbnQuZ2V0U291cmNlSW5kZXgoKSwgZXZlbnQuZ2V0TGVuZ3RoKCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLmNsZWFyVGFibGUoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMucmVidWlsZFRhYmxlKCk7Ci0JCQl9Ci0JCQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwcm90ZWN0ZWQgSXRlcmFibGU8T2JqZWN0PiBnZXRJdGVtcyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlyZXR1cm4gKEl0ZXJhYmxlPE9iamVjdD4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JCQl9Ci0JCQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwcm90ZWN0ZWQgSXRlcmFibGU8T2JqZWN0PiBnZXROZXdJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJcmV0dXJuIChJdGVyYWJsZTxPYmplY3Q+KSBldmVudC5nZXROZXdJdGVtcygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ2VsbExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRDZWxsTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ2VsbExpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMuY2VsbENoYW5nZWQoKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PikgZXZlbnQuZ2V0U291cmNlKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY2VsbCBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbkNvdW50KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRSb3dDb3VudCgpIHsKLQkJcmV0dXJuIHRoaXMucm93cy5zaXplKCk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uQWRhcHRlci5jb2x1bW5OYW1lKGNvbHVtbik7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIENsYXNzPD8+IGdldENvbHVtbkNsYXNzKGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbkNsYXNzKGNvbHVtbkluZGV4KTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0NlbGxFZGl0YWJsZShpbnQgcm93SW5kZXgsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbklzRWRpdGFibGUoY29sdW1uSW5kZXgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChpbnQgcm93SW5kZXgsIGludCBjb2x1bW5JbmRleCkgewotCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByb3cgPSB0aGlzLnJvd3MuZ2V0KHJvd0luZGV4KTsKLQkJcmV0dXJuIHJvd1tjb2x1bW5JbmRleF0uZ2V0VmFsdWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZUF0KE9iamVjdCB2YWx1ZSwgaW50IHJvd0luZGV4LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93ID0gdGhpcy5yb3dzLmdldChyb3dJbmRleCk7Ci0JCXJvd1tjb2x1bW5JbmRleF0uc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRhYmxlTW9kZWxMaXN0ZW5lcihUYWJsZU1vZGVsTGlzdGVuZXIgbCkgewotCQlpZiAodGhpcy5oYXNOb1RhYmxlTW9kZWxMaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZFRhYmxlTW9kZWxMaXN0ZW5lcihsKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZVRhYmxlTW9kZWxMaXN0ZW5lcihUYWJsZU1vZGVsTGlzdGVuZXIgbCkgewotCQlzdXBlci5yZW1vdmVUYWJsZU1vZGVsTGlzdGVuZXIobCk7Ci0JCWlmICh0aGlzLmhhc05vVGFibGVNb2RlbExpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVuZGVybHlpbmcgbGlzdCBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdW5kZXJseWluZyBsaXN0IG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIpIHsKLQkJaWYgKGxpc3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJYm9vbGVhbiBoYXNMaXN0ZW5lcnMgPSB0aGlzLmhhc1RhYmxlTW9kZWxMaXN0ZW5lcnMoKTsKLQkJaWYgKGhhc0xpc3RlbmVycykgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXRoaXMubGlzdEhvbGRlciA9IGxpc3RIb2xkZXI7Ci0JCWlmIChoYXNMaXN0ZW5lcnMpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJCXRoaXMuZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdW5kZXJseWluZyBjb2xsZWN0aW9uIG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJdGhpcy5zZXRNb2RlbChuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPihjb2xsZWN0aW9uSG9sZGVyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtb2RlbCBoYXMgbm8gbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vVGFibGVNb2RlbExpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyQ291bnQoVGFibGVNb2RlbExpc3RlbmVyLmNsYXNzKSA9PSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbW9kZWwgaGFzIGFueSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzVGFibGVNb2RlbExpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNOb1RhYmxlTW9kZWxMaXN0ZW5lcnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IG9mIG9iamVjdHMgYW5kIHRoZSB2YXJpb3VzIGFzcGVjdHMKLQkgKiBvZiB0aGUgb2JqZWN0cyB0aGF0IG1ha2UgdXAgdGhlIHJvd3MuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmxpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuZW5nYWdlQWxsQ2VsbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBvYmplY3RzIGludG8gcm93cyBhbmQgbGlzdGVuIHRvIHRoZSBjZWxscy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5nYWdlQWxsQ2VsbHMoKSB7Ci0JCXRoaXMucm93cy5lbnN1cmVDYXBhY2l0eSh0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gc3RyZWFtID0gdGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93ID0gdGhpcy5jb2x1bW5BZGFwdGVyLmNlbGxNb2RlbHMoc3RyZWFtLm5leHQoKSk7Ci0JCQl0aGlzLmVuZ2FnZVJvdyhyb3cpOwotCQkJdGhpcy5yb3dzLmFkZChyb3cpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdGVuIHRvIHRoZSBjZWxscyBpbiB0aGUgc3BlY2lmaWVkIHJvdy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5nYWdlUm93KE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIHJvdykgewotCQlmb3IgKGludCBpID0gcm93Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlyb3dbaV0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuY2VsbExpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nLgotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5kaXNlbmdhZ2VBbGxDZWxscygpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc2VuZ2FnZUFsbENlbGxzKCkgewotCQlmb3IgKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIHJvdyA6IHRoaXMucm93cykgewotCQkJdGhpcy5kaXNlbmdhZ2VSb3cocm93KTsKLQkJfQotCQl0aGlzLnJvd3MuY2xlYXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzZW5nYWdlUm93KE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIHJvdykgewotCQlmb3IgKGludCBpID0gcm93Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlyb3dbaV0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuY2VsbExpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGJydXRlLWZvcmNlIHNlYXJjaCBmb3IgdGhlIGNlbGwocykgdGhhdCBjaGFuZ2VkLi4uCi0JICovCi0Jdm9pZCBjZWxsQ2hhbmdlZChNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gY2VsbEhvbGRlcikgewotCQlmb3IgKGludCBpID0gdGhpcy5yb3dzLnNpemUoKTsgaS0tID4gMDsgKSB7Ci0JCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByb3cgPSB0aGlzLnJvd3MuZ2V0KGkpOwotCQkJZm9yIChpbnQgaiA9IHJvdy5sZW5ndGg7IGotLSA+IDA7ICkgewotCQkJCWlmIChyb3dbal0gPT0gY2VsbEhvbGRlcikgewotCQkJCQl0aGlzLmZpcmVUYWJsZUNlbGxVcGRhdGVkKGksIGopOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGNvbnZlcnQgdGhlIGl0ZW1zIHRvIHJvd3MKLQkgKi8KLQl2b2lkIGFkZFJvd3MoaW50IGluZGV4LCBpbnQgc2l6ZSwgSXRlcmFibGU8T2JqZWN0PiBpdGVtcykgewotCQlMaXN0PE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdPiBuZXdSb3dzID0gbmV3IEFycmF5TGlzdDxNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXT4oc2l6ZSk7Ci0JCWZvciAoT2JqZWN0IGl0ZW0gOiBpdGVtcykgewotCQkJTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93ID0gdGhpcy5jb2x1bW5BZGFwdGVyLmNlbGxNb2RlbHMoaXRlbSk7Ci0JCQl0aGlzLmVuZ2FnZVJvdyhyb3cpOwotCQkJbmV3Um93cy5hZGQocm93KTsKLQkJfQotCQl0aGlzLnJvd3MuYWRkQWxsKGluZGV4LCBuZXdSb3dzKTsKLQkJdGhpcy5maXJlVGFibGVSb3dzSW5zZXJ0ZWQoaW5kZXgsIGluZGV4ICsgc2l6ZSAtIDEpOwotCX0KLQotCXZvaWQgcmVtb3ZlUm93cyhpbnQgaW5kZXgsIGludCBzaXplKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVJvdyh0aGlzLnJvd3MucmVtb3ZlKGluZGV4KSk7Ci0JCX0KLQkJdGhpcy5maXJlVGFibGVSb3dzRGVsZXRlZChpbmRleCwgaW5kZXggKyBzaXplIC0gMSk7Ci0JfQotCi0Jdm9pZCByZXBsYWNlUm93cyhpbnQgaW5kZXgsIEl0ZXJhYmxlPE9iamVjdD4gaXRlbXMpIHsKLQkJaW50IGkgPSBpbmRleDsKLQkJZm9yIChPYmplY3QgaXRlbSA6IGl0ZW1zKSB7Ci0JCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByb3cgPSB0aGlzLnJvd3MuZ2V0KGkpOwotCQkJdGhpcy5kaXNlbmdhZ2VSb3cocm93KTsKLQkJCXJvdyA9IHRoaXMuY29sdW1uQWRhcHRlci5jZWxsTW9kZWxzKGl0ZW0pOwotCQkJdGhpcy5lbmdhZ2VSb3cocm93KTsKLQkJCXRoaXMucm93cy5zZXQoaSwgcm93KTsKLQkJCWkrKzsKLQkJfQotCQl0aGlzLmZpcmVUYWJsZVJvd3NVcGRhdGVkKGluZGV4LCBpIC0gMSk7Ci0JfQotCi0Jdm9pZCBtb3ZlUm93cyhpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQlBcnJheUxpc3Q8TW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10+IHRlbXAgPSBuZXcgQXJyYXlMaXN0PE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdPihsZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQl0ZW1wLmFkZCh0aGlzLnJvd3MucmVtb3ZlKHNvdXJjZUluZGV4KSk7Ci0JCX0KLQkJdGhpcy5yb3dzLmFkZEFsbCh0YXJnZXRJbmRleCwgdGVtcCk7Ci0KLQkJaW50IHN0YXJ0ID0gTWF0aC5taW4odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJaW50IGVuZCA9IE1hdGgubWF4KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCkgKyBsZW5ndGggLSAxOwotCQl0aGlzLmZpcmVUYWJsZVJvd3NVcGRhdGVkKHN0YXJ0LCBlbmQpOwotCX0KLQotCXZvaWQgY2xlYXJUYWJsZSgpIHsKLQkJdGhpcy5kaXNlbmdhZ2VBbGxDZWxscygpOwotCQl0aGlzLmZpcmVUYWJsZURhdGFDaGFuZ2VkKCk7Ci0JfQotCi0Jdm9pZCByZWJ1aWxkVGFibGUoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlQWxsQ2VsbHMoKTsKLQkJdGhpcy5lbmdhZ2VBbGxDZWxscygpOwotCQl0aGlzLmZpcmVUYWJsZURhdGFDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Ub2dnbGVCdXR0b25Nb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RvZ2dsZUJ1dHRvbk1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTFkYWQwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RvZ2dsZUJ1dHRvbk1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuSXRlbUxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUb2dnbGVCdXR0b24uVG9nZ2xlQnV0dG9uTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGphdmF4LnN3aW5nLkJ1dHRvbk1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBsaXN0ZW5lcgotICogKGUuZy4gYSBKQ2hlY2tCb3ggb3IgYSBKUmFkaW9CdXR0b24pIGluIHN5bmNoIHdpdGggYSBQcm9wZXJ0eVZhbHVlTW9kZWwKLSAqIG9uIGEgYm9vbGVhbi4KLSAqLwotcHVibGljIGNsYXNzIFRvZ2dsZUJ1dHRvbk1vZGVsQWRhcHRlcgotCWV4dGVuZHMgVG9nZ2xlQnV0dG9uTW9kZWwKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgdG9nZ2xlIGJ1dHRvbjsgZm9yIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMgbnVsbC4KLQkgKiBUaGUgZGVmYXVsdCBbZGVmYXVsdCB2YWx1ZV0gaXMgZmFsc2UgKGkuZS4gdGhlIHRvZ2dsZSBidXR0b24gaXMgdW5jaGVja2VkL2VtcHR5KS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBkZWZhdWx0VmFsdWU7Ci0KLQkvKiogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBib29sZWFuLiAqLwotCXByb3RlY3RlZCBmaW5hbCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHdpdGgKLQkgKiBjaGFuZ2VzIG1hZGUgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgYm9vbGVhbi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBib29sZWFuQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBUb2dnbGVCdXR0b25Nb2RlbEFkYXB0ZXIoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcigpOwotCQlpZiAoYm9vbGVhbkhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmJvb2xlYW5Ib2xkZXIgPSBib29sZWFuSG9sZGVyOwotCQl0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXIoKTsKLQkJLy8gcG9zdHBvbmUgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsCi0JCS8vIHVudGlsIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcy4uLgotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBib29sZWFuIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIGZhbHNlLgotCSAqLwotCXB1YmxpYyBUb2dnbGVCdXR0b25Nb2RlbEFkYXB0ZXIoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyKSB7Ci0JCXRoaXMoYm9vbGVhbkhvbGRlciwgZmFsc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyLnRoaXMuYm9vbGVhbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiYm9vbGVhbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQnV0dG9uTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoYm9vbGVhbiBiKSB7Ci0JCWlmICh0aGlzLmlzU2VsZWN0ZWQoKSAhPSBiKSB7CS8vIHN0b3AgdGhlIHJlY3Vyc2lvbiEKLQkJCXN1cGVyLnNldFNlbGVjdGVkKGIpOy8vcHV0IHRoZSBzdXBlciBjYWxsIGZpcnN0LCBvdGhlcndpc2UgdGhlIGZvbGxvd2luZyBnZXRzIGNhbGxlZCB0d2ljZQotCQkJdGhpcy5ib29sZWFuSG9sZGVyLnNldFZhbHVlKEJvb2xlYW4udmFsdWVPZihiKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRBY3Rpb25MaXN0ZW5lcihBY3Rpb25MaXN0ZW5lciBsKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRBY3Rpb25MaXN0ZW5lcihsKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQWN0aW9uTGlzdGVuZXIoQWN0aW9uTGlzdGVuZXIgbCkgewotCQlzdXBlci5yZW1vdmVBY3Rpb25MaXN0ZW5lcihsKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkSXRlbUxpc3RlbmVyKEl0ZW1MaXN0ZW5lciBsKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRJdGVtTGlzdGVuZXIobCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUl0ZW1MaXN0ZW5lcihJdGVtTGlzdGVuZXIgbCkgewotCQlzdXBlci5yZW1vdmVJdGVtTGlzdGVuZXIobCk7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZENoYW5nZUxpc3RlbmVyKGwpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB3ZSBoYXZlIG5vIGxpc3RlbmVycyBhdCBhbGwuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckNvdW50KCkgPT0gMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3luY2hyb25pemUgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIElmIGl0IGlzIG51bGwsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSAod2hpY2ggaXMgdHlwaWNhbGx5IGZhbHNlKS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZWxlY3RlZChCb29sZWFuIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldFNlbGVjdGVkKHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQl9IGVsc2UgewotCQkJdGhpcy5zZXRTZWxlY3RlZCh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgdW5kZXJseWluZyBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIGFjY29yZGluZ2x5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJvb2xlYW5DaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZXRTZWxlY3RlZCgoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuYm9vbGVhbkhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnNldFNlbGVjdGVkKHRoaXMuYm9vbGVhbkhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5ib29sZWFuSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5ib29sZWFuSG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJmMGZhZi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UcmVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVQYXRoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlTm9kZVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy50cmVlLlRyZWVNb2RlbCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgVHJlZU1vZGVsTGlzdGVuZXIKLSAqIChlLmcuIGEgSlRyZWUpIGluIHN5bmNoIHdpdGggYSB0cmVlIG9mIFRyZWVOb2RlVmFsdWVNb2RlbCBvYmplY3RzLiBVbmxpa2UKLSAqIGphdmF4LnN3aW5nLnRyZWUuRGVmYXVsdFRyZWVNb2RlbCwgeW91IGRvIG5vdCBhZGQgYW5kIHJlbW92ZSBub2RlcyB3aXRoCi0gKiBtZXRob2RzIGltcGxlbWVudGVkIGhlcmUuIFlvdSBjYW4gYWRkIGFuZCByZW1vdmUgbm9kZXMgYnkgYWRkaW5nIGFuZAotICogcmVtb3ZpbmcgdGhlbSBkaXJlY3RseSB0by9mcm9tIHRoZSBub2RlcyAob3IsIG1vcmUgdHlwaWNhbGx5LCB0aGUgZG9tYWluCi0gKiBvYmplY3RzIHRoZSBub2RlcyBhcmUgd3JhcHBpbmcgYW5kIGxpc3RlbmluZyB0bykuCi0gKiAKLSAqIER1ZSB0byBsaW1pdGF0aW9ucyBpbiBKVHJlZSwgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgY2FuIG5ldmVyIGJlIG51bGwsCi0gKiB3aGljaCwgdHlwaWNhbGx5LCBzaG91bGQgbm90IGJlIGEgcHJvYmxlbS4gKElmIHlvdSB3YW50IHRvIGRpc3BsYXkgYW4gZW1wdHkKLSAqIHRyZWUgeW91IGNhbiBzZXQgdGhlIEpUcmVlJ3MgdHJlZU1vZGVsIHRvIG51bGwuKQotICovCi1wdWJsaWMgY2xhc3MgVHJlZU1vZGVsQWRhcHRlcjxUPgotCWV4dGVuZHMgQWJzdHJhY3RUcmVlTW9kZWwKLXsKLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIHRyZWUncyByb290IG5vZGUgYW5kIGl0cwotCSAqIGNvcnJlc3BvbmRpbmcgbGlzdGVuZXIuIFRoaXMgYWxsb3dzIGNsaWVudHMgdG8gc3dhcCBvdXQKLQkgKiB0aGUgZW50aXJlIHRyZWUuIER1ZSB0byBsaW1pdGF0aW9ucyBpbiBKVHJlZSwgdGhlIHJvb3Qgc2hvdWxkCi0JICogbmV2ZXIgYmUgc2V0IHRvIG51bGwgd2hpbGUgd2UgaGF2ZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiByb290SG9sZGVyOwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciByb290TGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgbm90aWZpZXMgdXMgd2hlbiBhIG5vZGUncyBpbnRlcm5hbAotCSAqICJzdGF0ZSIgY2hhbmdlcyAoYXMgb3Bwb3NlZCB0byB0aGUgbm9kZSdzIHZhbHVlIG9yIGxpc3Qgb2YKLQkgKiBjaGlsZHJlbiksIGFsbG93aW5nIHVzIHRvIGZvcndhcmQgbm90aWZpY2F0aW9uIHRvIG91ciBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdGF0ZUNoYW5nZUxpc3RlbmVyIG5vZGVTdGF0ZUxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IG5vdGlmaWVzIHVzIHdoZW4gYSBub2RlJ3MgInZhbHVlIgotCSAqIGNoYW5nZXMgKGFzIG9wcG9zZWQgdG8gdGhlIG5vZGUncyBzdGF0ZSBvciBsaXN0IG9mCi0JICogY2hpbGRyZW4pLCBhbGxvd2luZyB1cyB0byBmb3J3YXJkIG5vdGlmaWNhdGlvbiB0byBvdXIgbGlzdGVuZXJzLgotCSAqIFR5cGljYWxseSwgdGhpcyB3aWxsIG9ubHkgaGFwcGVuIHdpdGggbm9kZXMgdGhhdCBob2xkCi0JICogcHJpbWl0aXZlIGRhdGEuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIG5vZGVWYWx1ZUxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IG5vdGlmaWVzIHVzIHdoZW4gYW4gdW5kZXJseWluZyBub2RlJ3MKLQkgKiAibGlzdCIgb2YgY2hpbGRyZW4gY2hhbmdlcywgYWxsb3dpbmcgdXMgdG8ga2VlcCBvdXIKLQkgKiBpbnRlcm5hbCB0cmVlIGluIHN5bmNoIHdpdGggdGhlIHVuZGVybHlpbmcgdHJlZSBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBjaGlsZHJlbkxpc3RlbmVyOwotCi0JLyogdGhlc2UgYXR0cmlidXRlcyBtYWtlIHVwIG91ciBpbnRlcm5hbCB0cmVlICovCi0JLyoqCi0JICogVGhlIHJvb3QgY2Fubm90IGJlIG51bGwgd2hpbGUgd2UgaGF2ZSBsaXN0ZW5lcnMsIHdoaWNoIGlzCi0JICogbW9zdCBvZiB0aGUgdGltZS4gVGhlIHJvb3QgaXMgY2FjaGVkIHNvIHdlIGNhbiBkaXNlbmdhZ2UKLQkgKiBmcm9tIGl0IHdoZW4gaXQgaGFzIGJlZW4gc3dhcHBlZCBvdXQuCi0JICovCi0JcHJpdmF0ZSBUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcm9vdDsKLQotCS8qKgotCSAqIE1hcCB0aGUgbm9kZXMgdG8gdGhlaXIgbGlzdHMgb2YgY2hpbGRyZW4uCi0JICogV2UgY2FjaGUgdGhlc2Ugc28gd2UgY2FuIHN3YXAgb3V0IHRoZSBlbnRpcmUgbGlzdCBvZiBjaGlsZHJlbgotCSAqIHdoZW4gd2UgcmVjZWl2ZSBhICNsaXN0Q2hhbmdlZCgpIGV2ZW50ICh3aGljaCBkb2VzIG5vdCBpbmNsdWRlCi0JICogdGhlIGl0ZW1zIHRoYXQgd2VyZSBhZmZlY3RlZCkuCi0JICogQHNlZSBFdmVudENoYW5nZVBvbGljeSNyZWJ1aWxkQ2hpbGRyZW4oKQotCSAqLwotCWZpbmFsIElkZW50aXR5SGFzaE1hcDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4sIExpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+Pj4gY2hpbGRyZW5MaXN0czsKLQotCS8qKgotCSAqIE1hcCB0aGUgY2hpbGRyZW4gbW9kZWxzIHRvIHRoZWlyIHBhcmVudHMuCi0JICogV2UgY2FjaGUgdGhlc2Ugc28gd2UgY2FuIGZpZ3VyZSBvdXQgdGhlICJyZWFsIiBzb3VyY2Ugb2YgdGhlCi0JICogbGlzdCBjaGFuZ2UgZXZlbnRzICh0aGUgcGFyZW50KS4KLQkgKiBAc2VlIEV2ZW50Q2hhbmdlUG9saWN5I3BhcmVudCgpCi0JICovCi0JZmluYWwgSWRlbnRpdHlIYXNoTWFwPExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4sIFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gcGFyZW50czsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdHJlZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCByb290LgotCSAqLwotCXB1YmxpYyBUcmVlTW9kZWxBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IHJvb3RIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHJvb3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5yb290SG9sZGVyID0gcm9vdEhvbGRlcjsKLQkJdGhpcy5yb290TGlzdGVuZXIgPSB0aGlzLmJ1aWxkUm9vdExpc3RlbmVyKCk7Ci0JCXRoaXMubm9kZVN0YXRlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTm9kZVN0YXRlTGlzdGVuZXIoKTsKLQkJdGhpcy5ub2RlVmFsdWVMaXN0ZW5lciA9IHRoaXMuYnVpbGROb2RlVmFsdWVMaXN0ZW5lcigpOwotCQl0aGlzLmNoaWxkcmVuTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ2hpbGRyZW5MaXN0ZW5lcigpOwotCQl0aGlzLmNoaWxkcmVuTGlzdHMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPFRyZWVOb2RlVmFsdWVNb2RlbDxUPiwgTGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+PigpOwotCQl0aGlzLnBhcmVudHMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4sIFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0cmVlIG1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIHJvb3QuCi0JICovCi0JcHVibGljIFRyZWVNb2RlbEFkYXB0ZXIoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IHJvb3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4ocm9vdCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFJvb3RMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkUm9vdExpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFJvb3RMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLnJvb3RDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJyb290IGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTm9kZVZhbHVlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZE5vZGVWYWx1ZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE5vZGVWYWx1ZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5ub2RlQ2hhbmdlZCgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJub2RlIHZhbHVlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkTm9kZVN0YXRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZE5vZGVTdGF0ZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZE5vZGVTdGF0ZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5ub2RlQ2hhbmdlZCgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJub2RlIHN0YXRlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRDaGlsZHJlbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZENoaWxkcmVuTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRDaGlsZHJlbkxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCW5ldyBBZGRFdmVudENoYW5nZVBvbGljeShldmVudCkuYWRkQ2hpbGRyZW4oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgUmVtb3ZlRXZlbnRDaGFuZ2VQb2xpY3koZXZlbnQpLnJlbW92ZUNoaWxkcmVuKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgUmVwbGFjZUV2ZW50Q2hhbmdlUG9saWN5KGV2ZW50KS5yZXBsYWNlQ2hpbGRyZW4oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCW5ldyBNb3ZlRXZlbnRDaGFuZ2VQb2xpY3koZXZlbnQpLm1vdmVDaGlsZHJlbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgQ2xlYXJFdmVudENoYW5nZVBvbGljeShldmVudCkuY2xlYXJDaGlsZHJlbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJbmV3IENoYW5nZUV2ZW50Q2hhbmdlUG9saWN5KGV2ZW50KS5yZWJ1aWxkQ2hpbGRyZW4oKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNoaWxkcmVuIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUcmVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIE9iamVjdCBnZXRSb290KCkgewotCQlyZXR1cm4gdGhpcy5yb290OwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBPYmplY3QgZ2V0Q2hpbGQoT2JqZWN0IHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiAoKFRyZWVOb2RlVmFsdWVNb2RlbDxUPikgcGFyZW50KS5jaGlsZChpbmRleCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIGludCBnZXRDaGlsZENvdW50KE9iamVjdCBwYXJlbnQpIHsKLQkJcmV0dXJuICgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBwYXJlbnQpLmNoaWxkcmVuU2l6ZSgpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBib29sZWFuIGlzTGVhZihPYmplY3Qgbm9kZSkgewotCQlyZXR1cm4gKChUcmVlTm9kZVZhbHVlTW9kZWw8VD4pIG5vZGUpLmlzTGVhZigpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyB2b2lkIHZhbHVlRm9yUGF0aENoYW5nZWQoVHJlZVBhdGggcGF0aCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCSgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBwYXRoLmdldExhc3RQYXRoQ29tcG9uZW50KCkpLnNldFZhbHVlKChUKSBuZXdWYWx1ZSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIGludCBnZXRJbmRleE9mQ2hpbGQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkKSB7Ci0JCXJldHVybiAoKFRyZWVOb2RlVmFsdWVNb2RlbDxUPikgcGFyZW50KS5pbmRleE9mQ2hpbGQoKFRyZWVOb2RlVmFsdWVNb2RlbDxUPikgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuaGFzTm9UcmVlTW9kZWxMaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZFRyZWVNb2RlbExpc3RlbmVyKGwpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVUcmVlTW9kZWxMaXN0ZW5lcihUcmVlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZVRyZWVNb2RlbExpc3RlbmVyKGwpOwotCQlpZiAodGhpcy5oYXNOb1RyZWVNb2RlbExpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogTGlzdGVuIHRvIHRoZSByb290IGFuZCBhbGwgdGhlIG90aGVyIG5vZGVzCi0JICogaW4gdGhlIHVuZGVybHlpbmcgdHJlZSBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMucm9vdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5yb290TGlzdGVuZXIpOwotCQl0aGlzLnJvb3QgPSB0aGlzLnJvb3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJaWYgKHRoaXMucm9vdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsJLy8gdGhlIHJvb3QgY2Fubm90IGJlIG51bGwgd2hpbGUgd2UgaGF2ZSBsaXN0ZW5lcnMKLQkJfQotCQl0aGlzLmVuZ2FnZU5vZGUodGhpcy5yb290KTsKLQkJdGhpcy5hZGRSb290KCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSByb290IGFuZCBhbGwgb2YgdGhlIG5vZGVzIHRvIHRoZSB1bmRlcmx5aW5nIHRyZWUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFJvb3QoKSB7Ci0JCXRoaXMuYWRkTm9kZSgwLCB0aGlzLnJvb3QpOwotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSByb290IGFuZCBhbGwgdGhlIG90aGVyCi0JICogbm9kZXMgaW4gdGhlIHVuZGVybHlpbmcgdHJlZSBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMucmVtb3ZlUm9vdCgpOwotCQl0aGlzLmRpc2VuZ2FnZU5vZGUodGhpcy5yb290KTsKLQkJdGhpcy5yb290ID0gbnVsbDsKLQkJdGhpcy5yb290SG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnJvb3RMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSByb290IGFuZCBhbGwgb2YgdGhlIG5vZGVzIGZyb20gdGhlIHVuZGVybHlpbmcgdHJlZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUm9vdCgpIHsKLQkJdGhpcy5yZW1vdmVOb2RlKDAsIHRoaXMucm9vdCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHJvb3QgaGFzIGJlZW4gc3dhcHBlZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBhIGJpdCBnbmFybHkgYmVjYXVzZSB0aGUgQVBJIGZvciBub3RpZnlpbmcgbGlzdGVuZXJzCi0JICogdGhhdCB0aGUgcm9vdCBoYXMgY2hhbmdlZCBpcyBhIGJpdCBpbmNvbnNpc3RlbnQgd2l0aCB0aGF0IHVzZWQgZm9yCi0JICogbm9uLXJvb3Qgbm9kZXMuCi0JICovCi0Jdm9pZCByb290Q2hhbmdlZCgpIHsKLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5ld1Jvb3QgPSB0aGlzLnJvb3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJaWYgKG5ld1Jvb3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CS8vIHRoZSByb290IGNhbm5vdCBiZSBudWxsIHdoaWxlIHdlIGhhdmUgbGlzdGVuZXJzCi0JCX0KLQkJLy8gcmVtb3ZlIGFsbCB0aGUgY3VycmVudCByb290J3MgY2hpbGRyZW4gZnJvbSB0aGUgdHJlZQotCQkvLyBhbmQgcmVtb3ZlIHRoZSBpdCBmcm9tIHRoZSBpbnRlcm5hbCB0cmVlCi0JCXRoaXMucmVtb3ZlUm9vdCgpOyAKLQotCQkvLyBzYXZlIHRoZSBvbGQgcm9vdCBhbmQgc3dhcCBpbiB0aGUgbmV3IHJvb3QKLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG9sZFJvb3QgPSB0aGlzLnJvb3Q7Ci0JCXRoaXMucm9vdCA9IG5ld1Jvb3Q7Ci0KLQkJLy8gd2UgbXVzdCBiZSBsaXN0ZW5pbmcgdG8gYm90aCB0aGUgb2xkIGFuZCBuZXcgcm9vdHMgd2hlbiB3ZSBmaXJlIHRoZSBldmVudAotCQkvLyBiZWNhdXNlIHRoZWlyIHZhbHVlcyBjYW4gYmUgYWZmZWN0ZWQgYnkgd2hldGhlciB0aGV5IGhhdmUgbGlzdGVuZXJzCi0JCXRoaXMuZW5nYWdlTm9kZSh0aGlzLnJvb3QpOwotCQl0aGlzLmZpcmVUcmVlUm9vdFJlcGxhY2VkKHRoaXMucm9vdCk7Ci0JCS8vIG5vdyB3ZSBjYW4gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG9sZCByb290Ci0JCXRoaXMuZGlzZW5nYWdlTm9kZShvbGRSb290KTsKLQotCQkvLyBhZGQgdGhlIG5ldyByb290IHRvIHRoZSBpbnRlcm5hbCB0cmVlIGFuZAotCQkvLyBhZGQgYWxsIGl0cyBjaGlsZHJlbiB0byB0aGUgdHJlZSBhbHNvCi0JCXRoaXMuYWRkUm9vdCgpOwotCX0KLQotCS8qKgotCSAqIEVpdGhlciB0aGUgInZhbHVlIiBvciB0aGUgInN0YXRlIiBvZiB0aGUgc3BlY2lmaWVkIG5vZGUgaGFzIGNoYW5nZWQsCi0JICogZm9yd2FyZCBub3RpZmljYXRpb24gdG8gb3VyIGxpc3RlbmVycy4KLQkgKi8KLQl2b2lkIG5vZGVDaGFuZ2VkKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQgPSBub2RlLnBhcmVudCgpOwotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXRoaXMuZmlyZVRyZWVSb290Q2hhbmdlZChub2RlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZmlyZVRyZWVOb2RlQ2hhbmdlZChwYXJlbnQucGF0aCgpLCBwYXJlbnQuaW5kZXhPZkNoaWxkKG5vZGUpLCBub2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExpc3RlbiB0byB0aGUgbm9kZXMsIG5vdGlmeSBvdXIgbGlzdGVuZXJzIHRoYXQgdGhlIG5vZGVzIHdlcmUgYWRkZWQsCi0JICogYW5kIHRoZW4gYWRkIHRoZSBub2RlcyB0byBvdXIgaW50ZXJuYWwgdHJlZS4KLQkgKiBXZSBtdXN0IGxpc3RlbiB0byB0aGUgbm9kZXMgYmVmb3JlIG5vdGlmeWluZyBhbnlib2R5LCBiZWNhdXNlCi0JICogYWRkaW5nIGEgbGlzdGVuZXIgY2FuIGNoYW5nZSB0aGUgdmFsdWUgb2YgYSBub2RlLgotCSAqLwotCXZvaWQgYWRkQ2hpbGRyZW4oVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcGF0aCwgaW50W10gY2hpbGRJbmRpY2VzLCBUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBjaGlsZHJlbikgewotCQlpbnQgbGVuID0gY2hpbGRJbmRpY2VzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdGhpcy5lbmdhZ2VOb2RlKGNoaWxkcmVuW2ldKTsKLQkJfQotCQl0aGlzLmZpcmVUcmVlTm9kZXNJbnNlcnRlZChwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdGhpcy5hZGROb2RlKGNoaWxkSW5kaWNlc1tpXSwgY2hpbGRyZW5baV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdGVuIHRvIHRoZSBub2RlIGFuZCBpdHMgY2hpbGRyZW4gbW9kZWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuZ2FnZU5vZGUoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5vZGUpIHsKLQkJbm9kZS5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMubm9kZVN0YXRlTGlzdGVuZXIpOwotCQlub2RlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLm5vZGVWYWx1ZUxpc3RlbmVyKTsKLQkJbm9kZS5jaGlsZHJlbk1vZGVsKCkuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmNoaWxkcmVuTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbm9kZSB0byBvdXIgaW50ZXJuYWwgdHJlZTsKLQkgKiB0aGVuIHJlY3Vyc2UgZG93biB0aHJvdWdoIHRoZSBub2RlJ3MgY2hpbGRyZW4sCi0JICogYWRkaW5nIHRoZW0gdG8gdGhlIGludGVybmFsIHRyZWUgYWxzby4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTm9kZShpbnQgaW5kZXgsIFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCXRoaXMuYWRkTm9kZVRvSW50ZXJuYWxUcmVlKG5vZGUucGFyZW50KCksIGluZGV4LCBub2RlLCBub2RlLmNoaWxkcmVuTW9kZWwoKSk7Ci0JCW5ldyBOb2RlQ2hhbmdlUG9saWN5KG5vZGUpLmFkZENoaWxkcmVuKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbm9kZSB0byBvdXIgaW50ZXJuYWwgdHJlZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTm9kZVRvSW50ZXJuYWxUcmVlKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQsIGludCBpbmRleCwgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5vZGUsIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gY2hpbGRyZW5Nb2RlbCkgewotCQlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gc2libGluZ3MgPSB0aGlzLmNoaWxkcmVuTGlzdHMuZ2V0KHBhcmVudCk7Ci0JCWlmIChzaWJsaW5ncyA9PSBudWxsKSB7Ci0JCQlzaWJsaW5ncyA9IG5ldyBBcnJheUxpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PigpOwotCQkJdGhpcy5jaGlsZHJlbkxpc3RzLnB1dChwYXJlbnQsIHNpYmxpbmdzKTsKLQkJfQotCQlzaWJsaW5ncy5hZGQoaW5kZXgsIG5vZGUpOwotCi0JCXRoaXMucGFyZW50cy5wdXQoY2hpbGRyZW5Nb2RlbCwgbm9kZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIG5vZGVzIGZyb20gb3VyIGludGVybmFsIHRyZWUsIG5vdGlmeSBvdXIgbGlzdGVuZXJzIHRoYXQgdGhlCi0JICogbm9kZXMgd2VyZSByZW1vdmVkLCB0aGVuIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBub2Rlcy4KLQkgKiBXZSBtdXN0IGxpc3RlbiB0byB0aGUgbm9kZXMgdW50aWwgYWZ0ZXIgbm90aWZ5aW5nIGFueWJvZHksIGJlY2F1c2UKLQkgKiByZW1vdmluZyBhIGxpc3RlbmVyIGNhbiBjaGFuZ2UgdGhlIHZhbHVlIG9mIGEgbm9kZS4KLQkgKi8KLQl2b2lkIHJlbW92ZUNoaWxkcmVuKFRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIHBhdGgsIGludFtdIGNoaWxkSW5kaWNlcywgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gY2hpbGRyZW4pIHsKLQkJaW50IGxlbiA9IGNoaWxkSW5kaWNlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCS8vIHRoZSBpbmRpY2VzIHNsaWRlIGRvd24gYSBub3RjaCBlYWNoIHRpbWUgd2UgcmVtb3ZlIGEgY2hpbGQKLQkJCXRoaXMucmVtb3ZlTm9kZShjaGlsZEluZGljZXNbaV0gLSBpLCBjaGlsZHJlbltpXSk7Ci0JCX0KLQkJdGhpcy5maXJlVHJlZU5vZGVzUmVtb3ZlZChwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdGhpcy5kaXNlbmdhZ2VOb2RlKGNoaWxkcmVuW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpcnN0LCByZWN1cnNlIGRvd24gdGhyb3VnaCB0aGUgbm9kZSdzIGNoaWxkcmVuLAotCSAqIHJlbW92aW5nIHRoZW0gZnJvbSBvdXIgaW50ZXJuYWwgdHJlZTsKLQkgKiB0aGVuIHJlbW92ZSB0aGUgbm9kZSBpdHNlbGYgZnJvbSBvdXIgaW50ZXJuYWwgdHJlZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTm9kZShpbnQgaW5kZXgsIFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCW5ldyBOb2RlQ2hhbmdlUG9saWN5KG5vZGUpLnJlbW92ZUNoaWxkcmVuKCk7Ci0JCXRoaXMucmVtb3ZlTm9kZUZyb21JbnRlcm5hbFRyZWUobm9kZS5wYXJlbnQoKSwgaW5kZXgsIG5vZGUuY2hpbGRyZW5Nb2RlbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBub2RlIGZyb20gb3VyIGludGVybmFsIHRyZWUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU5vZGVGcm9tSW50ZXJuYWxUcmVlKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQsIGludCBpbmRleCwgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbk1vZGVsKSB7Ci0JCXRoaXMucGFyZW50cy5yZW1vdmUoY2hpbGRyZW5Nb2RlbCk7Ci0KLQkJTGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IHNpYmxpbmdzID0gdGhpcy5jaGlsZHJlbkxpc3RzLmdldChwYXJlbnQpOwotCQlzaWJsaW5ncy5yZW1vdmUoaW5kZXgpOwotCQlpZiAoc2libGluZ3MuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdHMucmVtb3ZlKHBhcmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbm9kZSBhbmQgaXRzIGNoaWxkcmVuIG1vZGVsLgotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNlbmdhZ2VOb2RlKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCW5vZGUuY2hpbGRyZW5Nb2RlbCgpLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5jaGlsZHJlbkxpc3RlbmVyKTsKLQkJbm9kZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ub2RlVmFsdWVMaXN0ZW5lcik7Ci0JCW5vZGUucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLm5vZGVTdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLQl2b2lkIG1vdmVDaGlsZHJlbihUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcGFyZW50LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gY2hpbGRyZW5MaXN0ID0gdGhpcy5jaGlsZHJlbkxpc3RzLmdldChwYXJlbnQpOwotCQlBcnJheUxpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiB0ZW1wID0gbmV3IEFycmF5TGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+KGxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCXRlbXAuYWRkKGNoaWxkcmVuTGlzdC5yZW1vdmUoc291cmNlSW5kZXgpKTsKLQkJfQotCQljaGlsZHJlbkxpc3QuYWRkQWxsKHRhcmdldEluZGV4LCB0ZW1wKTsKLQotCQl0aGlzLmZpcmVUcmVlU3RydWN0dXJlQ2hhbmdlZChwYXJlbnQucGF0aCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzc2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvYWxlc2NlIHNvbWUgb2YgdGhlIGNvbW1vbiBjaGFuZ2UgcG9saWN5IGJlaGF2aW9yLgotCSAqLwotCWFic3RyYWN0IGNsYXNzIENoYW5nZVBvbGljeSB7Ci0KLQkJQ2hhbmdlUG9saWN5KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgdGhlIGN1cnJlbnQgc2V0IG9mIGNoaWxkcmVuLgotCQkgKi8KLQkJdm9pZCBhZGRDaGlsZHJlbigpIHsKLQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5hZGRDaGlsZHJlbih0aGlzLnBhcmVudCgpLnBhdGgoKSwgdGhpcy5jaGlsZEluZGljZXMoKSwgdGhpcy5jaGlsZEFycmF5KCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgY3VycmVudCBzZXQgb2YgY2hpbGRyZW4uCi0JCSAqLwotCQl2b2lkIHJlbW92ZUNoaWxkcmVuKCkgewotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLnJlbW92ZUNoaWxkcmVuKHRoaXMucGFyZW50KCkucGF0aCgpLCB0aGlzLmNoaWxkSW5kaWNlcygpLCB0aGlzLmNoaWxkQXJyYXkoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGFuIGFycmF5IG9mIHRoZSBpbmRpY2VzIG9mIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbiwKLQkJICogd2hpY2ggc2hvdWxkIGJlIGNvbnRpZ3VvdXMuCi0JCSAqLwotCQlpbnRbXSBjaGlsZEluZGljZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5idWlsZEluZGljZXModGhpcy5jaGlsZHJlblN0YXJ0SW5kZXgoKSwgdGhpcy5jaGlsZHJlblNpemUoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGFuIGFycmF5IG9mIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCVRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIGNoaWxkQXJyYXkoKSB7Ci0JCQlyZXR1cm4gdGhpcy5idWlsZEFycmF5KHRoaXMuZ2V0Q2hpbGRyZW4oKSwgdGhpcy5jaGlsZHJlblNpemUoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQnVpbGQgYW4gYXJyYXkgdG8gaG9sZCB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkJICogSWYgdGhleSBhcmUgZGlmZmVyZW50IHNpemVzLCBzb21ldGhpbmcgaXMgc2NyZXdlZCB1cC4uLgotCQkgKi8KLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gYnVpbGRBcnJheShJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGVsZW1lbnRzLCBpbnQgc2l6ZSkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBhcnJheSA9IG5ldyBUcmVlTm9kZVZhbHVlTW9kZWxbc2l6ZV07Ci0JCQlpbnQgaSA9IDA7Ci0JCQlmb3IgKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBlbGVtZW50IDogZWxlbWVudHMpIHsKLQkJCQlhcnJheVtpKytdID0gZWxlbWVudDsKLQkJCX0KLQkJCXJldHVybiBhcnJheTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gYSBzZXQgb2YgaW5kaWNlcywgc3RhcnRpbmcgYXQgemVybyBhbmQKLQkJICogY29udGludWluZyBmb3IgdGhlIHNwZWNpZmllZCBzaXplLgotCQkgKi8KLQkJaW50W10gYnVpbGRJbmRpY2VzKGludCBzaXplKSB7Ci0JCQlyZXR1cm4gYnVpbGRJbmRpY2VzKDAsIHNpemUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBhIHNldCBvZiBpbmRpY2VzLCBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGFuZAotCQkgKiBjb250aW51aW5nIGZvciB0aGUgc3BlY2lmaWVkIHNpemUuCi0JCSAqLwotCQlpbnRbXSBidWlsZEluZGljZXMoaW50IHN0YXJ0LCBpbnQgc2l6ZSkgewotCQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbc2l6ZV07Ci0JCQlpbnQgaW5kZXggPSBzdGFydDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaW5kaWNlc1tpXSA9IGluZGV4Kys7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5kaWNlczsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHBhcmVudCBvZiB0aGUgY3VycmVudCBzZXQgb2YgY2hpbGRyZW4uCi0JCSAqLwotCQlhYnN0cmFjdCBUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcGFyZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc3RhcnRpbmcgaW5kZXggZm9yIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCWFic3RyYWN0IGludCBjaGlsZHJlblN0YXJ0SW5kZXgoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCWFic3RyYWN0IGludCBjaGlsZHJlblNpemUoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCWFic3RyYWN0IEl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gZ2V0Q2hpbGRyZW4oKTsKLQotCX0KLQotCi0JLyoqCi0JICogV3JhcHMgYSBMaXN0RXZlbnQgZm9yIGFkZGluZywgcmVtb3ZpbmcsIHJlcGxhY2luZywKLQkgKiBhbmQgY2hhbmdpbmcgY2hpbGRyZW4uCi0JICovCi0JYWJzdHJhY3QgY2xhc3MgRXZlbnRDaGFuZ2VQb2xpY3kgZXh0ZW5kcyBDaGFuZ2VQb2xpY3kgewotCQlmaW5hbCBMaXN0RXZlbnQgZXZlbnQ7Ci0KLQkJRXZlbnRDaGFuZ2VQb2xpY3koTGlzdEV2ZW50IGV2ZW50KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5ldmVudCA9IGV2ZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIE1hcCB0aGUgTGlzdENoYW5nZUV2ZW50J3Mgc291cmNlIHRvIHRoZSBjb3JyZXNwb25kaW5nIHBhcmVudC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcGFyZW50KCkgewotCQkJcmV0dXJuIFRyZWVNb2RlbEFkYXB0ZXIudGhpcy5wYXJlbnRzLmdldCh0aGlzLmV2ZW50LmdldFNvdXJjZSgpKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBXcmFwcyBhIExpc3RBZGRFdmVudCBmb3IgYWRkaW5nIGNoaWxkcmVuLgotCSAqLwotCWNsYXNzIEFkZEV2ZW50Q2hhbmdlUG9saWN5IGV4dGVuZHMgRXZlbnRDaGFuZ2VQb2xpY3kgewotCi0JCUFkZEV2ZW50Q2hhbmdlUG9saWN5KExpc3RBZGRFdmVudCBldmVudCkgewotCQkJc3VwZXIoZXZlbnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSBMaXN0QWRkRXZlbnQgZ2V0RXZlbnQoKSB7Ci0JCQlyZXR1cm4gKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdEFkZEV2ZW50J3MgaXRlbSBpbmRleCBpcyB0aGUgY2hpbGRyZW4gc3RhcnQgaW5kZXguCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU3RhcnRJbmRleCgpIHsKLQkJCXJldHVybiB0aGlzLmdldEV2ZW50KCkuZ2V0SW5kZXgoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdEFkZEV2ZW50J3Mgc2l6ZSBpcyB0aGUgY2hpbGRyZW4gc2l6ZS4KLQkJICovCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TaXplKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0RXZlbnQoKS5nZXRJdGVtc1NpemUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdEFkZEV2ZW50J3MgaXRlbXMgYXJlIHRoZSBjaGlsZHJlbi4KLQkJICovCi0JCUBPdmVycmlkZQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmFibGU8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBnZXRDaGlsZHJlbigpIHsKLQkJCXJldHVybiAoSXRlcmFibGU8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PikgdGhpcy5nZXRFdmVudCgpLmdldEl0ZW1zKCk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogV3JhcHMgYSBMaXN0UmVtb3ZlRXZlbnQgZm9yIGFkZGluZyBjaGlsZHJlbi4KLQkgKi8KLQljbGFzcyBSZW1vdmVFdmVudENoYW5nZVBvbGljeSBleHRlbmRzIEV2ZW50Q2hhbmdlUG9saWN5IHsKLQotCQlSZW1vdmVFdmVudENoYW5nZVBvbGljeShMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyKGV2ZW50KTsKLQkJfQotCi0JCXByaXZhdGUgTGlzdFJlbW92ZUV2ZW50IGdldEV2ZW50KCkgewotCQkJcmV0dXJuIChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIExpc3RSZW1vdmVFdmVudCdzIGl0ZW0gaW5kZXggaXMgdGhlIGNoaWxkcmVuIHN0YXJ0IGluZGV4LgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblN0YXJ0SW5kZXgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRFdmVudCgpLmdldEluZGV4KCk7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIExpc3RSZW1vdmVFdmVudCdzIHNpemUgaXMgdGhlIGNoaWxkcmVuIHNpemUuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLmdldEV2ZW50KCkuZ2V0SXRlbXNTaXplKCk7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIExpc3RSZW1vdmVFdmVudCdzIGl0ZW1zIGFyZSB0aGUgY2hpbGRyZW4uCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gZ2V0Q2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gKEl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4pIHRoaXMuZ2V0RXZlbnQoKS5nZXRJdGVtcygpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFdyYXBzIGEgTGlzdFJlcGxhY2VFdmVudCBmb3IgcmVwbGFjaW5nIGNoaWxkcmVuLgotCSAqLwotCWNsYXNzIFJlcGxhY2VFdmVudENoYW5nZVBvbGljeSBleHRlbmRzIEV2ZW50Q2hhbmdlUG9saWN5IHsKLQotCQlSZXBsYWNlRXZlbnRDaGFuZ2VQb2xpY3koTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJc3VwZXIoZXZlbnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSBMaXN0UmVwbGFjZUV2ZW50IGdldEV2ZW50KCkgewotCQkJcmV0dXJuIChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBMaXN0UmVwbGFjZUV2ZW50J3MgaXRlbSBpbmRleCBpcyB0aGUgY2hpbGRyZW4gc3RhcnQgaW5kZXguCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU3RhcnRJbmRleCgpIHsKLQkJCXJldHVybiB0aGlzLmdldEV2ZW50KCkuZ2V0SW5kZXgoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdFJlcGxhY2VFdmVudCdzIHNpemUgaXMgdGhlIGNoaWxkcmVuIHNpemUuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLmdldEV2ZW50KCkuZ2V0SXRlbXNTaXplKCk7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIExpc3RSZXBsYWNlRXZlbnQncyBpdGVtcyBhcmUgdGhlIGNoaWxkcmVuLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGdldENoaWxkcmVuKCkgewotCQkJcmV0dXJuIChJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+KSB0aGlzLmdldEV2ZW50KCkuZ2V0TmV3SXRlbXMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZW1vdmUgdGhlIG9sZCBub2RlcyBhbmQgYWRkIHRoZSBuZXcgb25lcy4KLQkJICovCi0JCXZvaWQgcmVwbGFjZUNoaWxkcmVuKCkgewotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcGFyZW50UGF0aCA9IHRoaXMucGFyZW50KCkucGF0aCgpOwotCQkJaW50W10gY2hpbGRJbmRpY2VzID0gdGhpcy5jaGlsZEluZGljZXMoKTsKLQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5yZW1vdmVDaGlsZHJlbihwYXJlbnRQYXRoLCBjaGlsZEluZGljZXMsIHRoaXMuZ2V0T2xkQ2hpbGRyZW4oKSk7Ci0JCQlUcmVlTW9kZWxBZGFwdGVyLnRoaXMuYWRkQ2hpbGRyZW4ocGFyZW50UGF0aCwgY2hpbGRJbmRpY2VzLCB0aGlzLmNoaWxkQXJyYXkoKSk7Ci0JCX0KLQotCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBnZXRPbGRDaGlsZHJlbigpIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkQXJyYXkodGhpcy5nZXRPbGRJdGVtcygpLCB0aGlzLmdldEV2ZW50KCkuZ2V0SXRlbXNTaXplKCkpOwotCQl9Ci0KLQkJLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXByb3RlY3RlZCBJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGdldE9sZEl0ZW1zKCkgewotCQkJcmV0dXJuIChJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+KSB0aGlzLmdldEV2ZW50KCkuZ2V0T2xkSXRlbXMoKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBXcmFwcyBhIExpc3RNb3ZlRXZlbnQgZm9yIG1vdmluZyBjaGlsZHJlbi4KLQkgKi8KLQljbGFzcyBNb3ZlRXZlbnRDaGFuZ2VQb2xpY3kgZXh0ZW5kcyBFdmVudENoYW5nZVBvbGljeSB7Ci0KLQkJTW92ZUV2ZW50Q2hhbmdlUG9saWN5KExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyKGV2ZW50KTsKLQkJfQotCi0JCXByaXZhdGUgTGlzdE1vdmVFdmVudCBnZXRFdmVudCgpIHsKLQkJCXJldHVybiAoTGlzdE1vdmVFdmVudCkgdGhpcy5ldmVudDsKLQkJfQotCi0JCXZvaWQgbW92ZUNoaWxkcmVuKCkgewotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLm1vdmVDaGlsZHJlbih0aGlzLnBhcmVudCgpLCB0aGlzLmdldEV2ZW50KCkuZ2V0VGFyZ2V0SW5kZXgoKSwgdGhpcy5nZXRFdmVudCgpLmdldFNvdXJjZUluZGV4KCksIHRoaXMuZ2V0RXZlbnQoKS5nZXRMZW5ndGgoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU3RhcnRJbmRleCgpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblNpemUoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGdldENoaWxkcmVuKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogV3JhcHMgYSBMaXN0Q2xlYXJFdmVudCBmb3IgY2xlYXJpbmcgY2hpbGRyZW4uCi0JICovCi0JY2xhc3MgQ2xlYXJFdmVudENoYW5nZVBvbGljeSBleHRlbmRzIEV2ZW50Q2hhbmdlUG9saWN5IHsKLQotCQlDbGVhckV2ZW50Q2hhbmdlUG9saWN5KExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQlzdXBlcihldmVudCk7Ci0JCX0KLQotCQkvKioKLQkJICogQ2xlYXIgYWxsIHRoZSBub2Rlcy4KLQkJICovCi0JCXZvaWQgY2xlYXJDaGlsZHJlbigpIHsKLQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQgPSB0aGlzLnBhcmVudCgpOwotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcGFyZW50UGF0aCA9IHBhcmVudC5wYXRoKCk7Ci0JCQlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gY2hpbGRyZW5MaXN0ID0gVHJlZU1vZGVsQWRhcHRlci50aGlzLmNoaWxkcmVuTGlzdHMuZ2V0KHBhcmVudCk7Ci0JCQlpbnRbXSBjaGlsZEluZGljZXMgPSB0aGlzLmJ1aWxkSW5kaWNlcyhjaGlsZHJlbkxpc3Quc2l6ZSgpKTsKLQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIGNoaWxkQXJyYXkgPSB0aGlzLmJ1aWxkQXJyYXkoY2hpbGRyZW5MaXN0LCBjaGlsZHJlbkxpc3Quc2l6ZSgpKTsKLQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5yZW1vdmVDaGlsZHJlbihwYXJlbnRQYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkQXJyYXkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblN0YXJ0SW5kZXgoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TaXplKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJSXRlcmFibGU8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBnZXRDaGlsZHJlbigpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFdyYXBzIGEgTGlzdENoYW5nZUV2ZW50IGZvciBjbGVhcmluZyBjaGlsZHJlbi4KLQkgKi8KLQljbGFzcyBDaGFuZ2VFdmVudENoYW5nZVBvbGljeSBleHRlbmRzIEV2ZW50Q2hhbmdlUG9saWN5IHsKLQotCQlDaGFuZ2VFdmVudENoYW5nZVBvbGljeShMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyKGV2ZW50KTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZW1vdmUgYWxsIHRoZSBvbGQgbm9kZXMgYW5kIGFkZCBhbGwgdGhlIG5ldyBub2Rlcy4KLQkJICovCi0JCXZvaWQgcmVidWlsZENoaWxkcmVuKCkgewotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IHBhcmVudCA9IHRoaXMucGFyZW50KCk7Ci0JCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBwYXJlbnRQYXRoID0gcGFyZW50LnBhdGgoKTsKLQkJCUxpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbkxpc3QgPSBUcmVlTW9kZWxBZGFwdGVyLnRoaXMuY2hpbGRyZW5MaXN0cy5nZXQocGFyZW50KTsKLQkJCWludFtdIGNoaWxkSW5kaWNlcyA9IHRoaXMuYnVpbGRJbmRpY2VzKGNoaWxkcmVuTGlzdC5zaXplKCkpOwotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gY2hpbGRBcnJheSA9IHRoaXMuYnVpbGRBcnJheShjaGlsZHJlbkxpc3QsIGNoaWxkcmVuTGlzdC5zaXplKCkpOwotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLnJlbW92ZUNoaWxkcmVuKHBhcmVudFBhdGgsIGNoaWxkSW5kaWNlcywgY2hpbGRBcnJheSk7Ci0KLQkJCWNoaWxkSW5kaWNlcyA9IHRoaXMuYnVpbGRJbmRpY2VzKHBhcmVudC5jaGlsZHJlbk1vZGVsKCkuc2l6ZSgpKTsKLQkJCWNoaWxkQXJyYXkgPSB0aGlzLmJ1aWxkQXJyYXkocGFyZW50LmNoaWxkcmVuTW9kZWwoKSwgcGFyZW50LmNoaWxkcmVuU2l6ZSgpKTsKLQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5hZGRDaGlsZHJlbihwYXJlbnRQYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkQXJyYXkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblN0YXJ0SW5kZXgoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TaXplKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJSXRlcmFibGU8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBnZXRDaGlsZHJlbigpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFdyYXBzIGEgVHJlZU5vZGVWYWx1ZU1vZGVsIGZvciBhZGRpbmcgYW5kIHJlbW92aW5nIGl0cyBjaGlsZHJlbi4KLQkgKi8KLQljbGFzcyBOb2RlQ2hhbmdlUG9saWN5IGV4dGVuZHMgQ2hhbmdlUG9saWN5IHsKLQkJcHJpdmF0ZSBmaW5hbCBUcmVlTm9kZVZhbHVlTW9kZWw8VD4gbm9kZTsKLQotCQlOb2RlQ2hhbmdlUG9saWN5KFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5ub2RlID0gbm9kZTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgbm9kZSBpdHNlbGYgaXMgdGhlIHBhcmVudC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcGFyZW50KCkgewotCQkJcmV0dXJuIHRoaXMubm9kZTsKLQkJfQotCi0JCS8qKgotCQkgKiBTaW5jZSB3ZSB3aWxsIGFsd2F5cyBiZSBkZWFsaW5nIHdpdGggYWxsIG9mIHRoZSBub2RlJ3MKLQkJICogY2hpbGRyZW4sIHRoZSBjaGlsZHJlbiBzdGFydCBpbmRleCBpcyBhbHdheXMgemVyby4KLQkJICovCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TdGFydEluZGV4KCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQkvKioKLQkJICogU2luY2Ugd2Ugd2lsbCBhbHdheXMgYmUgZGVhbGluZyB3aXRoIGFsbCBvZiB0aGUgbm9kZSdzCi0JCSAqIGNoaWxkcmVuLCB0aGUgY2hpbGRyZW4gc2l6ZSBpcyBhbHdheXMgZXF1YWwgdG8gdGhlIHNpemUKLQkJICogb2YgdGhlIGNoaWxkcmVuIG1vZGVsLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblNpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub2RlLmNoaWxkcmVuTW9kZWwoKS5zaXplKCk7Ci0JCX0KLQotCQkvKioKLQkJICogU2luY2Ugd2Ugd2lsbCBhbHdheXMgYmUgZGVhbGluZyB3aXRoIGFsbCBvZiB0aGUgbm9kZSdzCi0JCSAqIGNoaWxkcmVuLCB0aGUgY2hpbGRyZW4gYXJlIGFsbCB0aGUgb2JqZWN0cyBoZWxkIGJ5Ci0JCSAqIHRoZSBjaGlsZHJlbiBtb2RlbC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGdldENoaWxkcmVuKCkgewotCQkJcmV0dXJuIHRoaXMubm9kZS5jaGlsZHJlbk1vZGVsKCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9BYnN0cmFjdE5vZGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvQWJzdHJhY3ROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OTY0MmQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9BYnN0cmFjdE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5Bc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIE5vZGUgY2xhc3Nlcy4KLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBmb2xsb3dpbmc6Ci0gKiAgICAgaW5pdGlhbGl6YXRpb24KLSAqICAgICBlbmZvcmNlZCBvYmplY3QgaWRlbnRpdHkgd3J0ICNlcXVhbHMoKS8jaGFzaENvZGUoKQotICogICAgIGNvbnRhaW5tZW50IGhpZXJhcmNoeSAocGFyZW50L2NoaWxkKQotICogICAgIHVzZXIgY29tbWVudAotICogICAgIGRpcnR5IGZsYWcKLSAqICAgICBwcm9ibGVtcwotICogICAgIHNvcnRpbmcKLSAqIAotICogVHlwaWNhbGx5LCBzdWJjbGFzc2VzIHNob3VsZCBjb25zaWRlciBpbXBsZW1lbnRpbmcgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotICogICAgIHRoZSBhcHByb3ByaWF0ZSBjb25zdHJ1Y3RvcnMKLSAqICAgICAgICAgKHdpdGggdGhlIGFwcHJvcHJpYXRlbHktcmVzdHJpY3RpdmUgdHlwZSBkZWNsYXJhdGlvbiBmb3IgcGFyZW50KQotICogICAgICNpbml0aWFsaXplKCkKLSAqICAgICAjaW5pdGlhbGl6ZShOb2RlIHBhcmVudE5vZGUpCi0gKiAgICAgI2NoZWNrUGFyZW50KE5vZGUgcGFyZW50Tm9kZSkKLSAqICAgICAjYWRkQ2hpbGRyZW5UbyhMaXN0IGxpc3QpCi0gKiAgICAgI25vZGVSZW1vdmVkKE5vZGUpCi0gKiAgICAgI3ZhbGlkYXRvcigpCi0gKiAgICAgI3RyYW5zaWVudEFzcGVjdE5hbWVzKCkgb3IKLSAqICAgICAgICAgI2FkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8oU2V0IHRyYW5zaWVudEFzcGVjdE5hbWVzKQotICogICAgICNhZGRQcm9ibGVtc1RvKExpc3QgY3VycmVudFByb2JsZW1zKQotICogICAgICNub25WYWxpZGF0ZWRBc3BlY3ROYW1lcygpCi0gKiAgICAgICAgICNhZGROb25WYWxpZGF0ZWRBc3BlY3ROYW1lc1RvKFNldCBub25WYWxpZGF0ZWRBc3BlY3ROYW1lcykKLSAqICAgICAjZGlzcGxheVN0cmluZygpCi0gKiAgICAgI3RvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5vZGUgCi0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBOb2RlCi17Ci0KLQkvKiogQ29udGFpbm1lbnQgaGllcmFyY2h5LiAqLwotCXByaXZhdGUgTm9kZSBwYXJlbnQ7ICAvLyBwc2V1ZG8tZmluYWwKLQotCS8qKiBUcmFjayB3aGV0aGVyIHRoZSBub2RlIGhhcyBjaGFuZ2VkLiAqLwotCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBkaXJ0eTsKLQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gZGlydHlCcmFuY2g7Ci0KLQkvKioKLQkgKiBUaGUgbm9kZSdzIHByb2JsZW1zLCBhcyBjYWxjdWxhdGVkIGR1cmluZyB2YWxpZGF0aW9uLgotCSAqIFRoaXMgbGlzdCBzaG91bGQgb25seSBiZSBtb2RpZmllZCB2aWEgYSBQcm9ibGVtU3luY2hyb25pemVyLAotCSAqIGFsbG93aW5nIGZvciBhc3luY2hyb25vdXMgbW9kaWZpY2F0aW9uIGZyb20gYW5vdGhlciB0aHJlYWQuCi0JICovCi0JcHJpdmF0ZSBWZWN0b3I8UHJvYmxlbT4gcHJvYmxlbXM7CQkvLyBwc2V1ZG8tZmluYWwKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfUFJPQkxFTV9NRVNTQUdFX0FSR1VNRU5UUyA9IG5ldyBPYmplY3RbMF07Ci0KLQkvKioKLQkgKiBDYWNoZSB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zLCBhcyBjYWxjdWxhdGVkIGR1cmluZyB2YWxpZGF0aW9uLgotCSAqIFRoaXMgbGlzdCBzaG91bGQgb25seSBiZSBtb2RpZmllZCB2aWEgYSBQcm9ibGVtU3luY2hyb25pemVyLAotCSAqIGFsbG93aW5nIGZvciBhc3luY2hyb25vdXMgbW9kaWZpY2F0aW9uIGZyb20gYW5vdGhlciB0aHJlYWQuCi0JICogVGhpcyBtdXN0IGJlIHJlY2FsY3VsYXRlZCBldmVyeSB0aW1lIHRoaXMgbm9kZSBvciBvbmUgb2YgaXRzCi0JICogZGVzY2VuZGFudHMgY2hhbmdlcyBpdCBwcm9ibGVtcy4KLQkgKi8KLQlwcml2YXRlIFZlY3RvcjxQcm9ibGVtPiBicmFuY2hQcm9ibGVtczsJCS8vIHBzZXVkby1maW5hbAotCi0JLyoqIFVzZXIgY29tbWVudC4gKi8KLQlwcml2YXRlIHZvbGF0aWxlIFN0cmluZyBjb21tZW50OwotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBmaWVsZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0cyBvZiB0cmFuc2llbnQgYXNwZWN0IG5hbWVzLCBrZXllZCBieSBjbGFzcy4KLQkgKiBUaGlzIGlzIGJ1aWx0IHVwIGxhemlseSwgYXMgdGhlIG9iamVjdHMgYXJlIG1vZGlmaWVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIEFic3RyYWN0Tm9kZT4sIEhhc2hTZXQ8U3RyaW5nPj4gdHJhbnNpZW50QXNwZWN0TmFtZVNldHMgPSBuZXcgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgQWJzdHJhY3ROb2RlPiwgSGFzaFNldDxTdHJpbmc+PigpOwotCi0JLyoqCi0JICogU2V0cyBvZiBub24tdmFsaWRhdGVkIGFzcGVjdCBuYW1lcywga2V5ZWQgYnkgY2xhc3MuCi0JICogVGhpcyBpcyBidWlsdCB1cCBsYXppbHksIGFzIHRoZSBvYmplY3RzIGFyZSBtb2RpZmllZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBBYnN0cmFjdE5vZGU+LCBIYXNoU2V0PFN0cmluZz4+IG5vblZhbGlkYXRlZEFzcGVjdE5hbWVTZXRzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIEFic3RyYWN0Tm9kZT4sIEhhc2hTZXQ8U3RyaW5nPj4oKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogTW9zdCBvYmplY3RzIG11c3QgaGF2ZSBhIHBhcmVudC4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBuZXcgbm9kZS4KLQkgKiBAc2VlICNpbml0aWFsaXplKE5vZGUpCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0Tm9kZShOb2RlIHBhcmVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmluaXRpYWxpemUoKTsKLQkJdGhpcy5pbml0aWFsaXplKHBhcmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEluaXRpYWxpemUgYSBuZXdseS1jcmVhdGVkIGluc3RhbmNlLgotCSAqIEBzZWUgI2luaXRpYWxpemUoTm9kZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLmNvbW1lbnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGEgbmV3IG9iamVjdCBpcyBkaXJ0eSwgYnkgZGVmaW5pdGlvbgotCQl0aGlzLmRpcnR5ID0gdHJ1ZTsKLQkJdGhpcy5kaXJ0eUJyYW5jaCA9IHRydWU7Ci0KLQkJdGhpcy5wcm9ibGVtcyA9IG5ldyBWZWN0b3I8UHJvYmxlbT4oKTsKLQkJdGhpcy5icmFuY2hQcm9ibGVtcyA9IG5ldyBWZWN0b3I8UHJvYmxlbT4oKTsKLQotCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5pbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBhIG5ld2x5LWNyZWF0ZWQgaW5zdGFuY2UuCi0JICogQHNlZSAjaW5pdGlhbGl6ZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShOb2RlIHBhcmVudE5vZGUpIHsKLQkJdGhpcy5jaGVja1BhcmVudChwYXJlbnROb2RlKTsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnROb2RlOwotCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5pbml0aWFsaXplKHBhcmVudE5vZGUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIHRoaXMuYnVpbGRDaGFuZ2VTdXBwb3J0TGlzdGVuZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFzcGVjdENoYW5nZVN1cHBvcnQuTGlzdGVuZXIgYnVpbGRDaGFuZ2VTdXBwb3J0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQXNwZWN0Q2hhbmdlU3VwcG9ydC5MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFzcGVjdENoYW5nZWQoU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJCQlBYnN0cmFjdE5vZGUudGhpcy5hc3BlY3RDaGFuZ2VkKGFzcGVjdE5hbWUpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlcXVhbGl0eSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFbmZvcmNlIG9iamVjdCBpZGVudGl0eSAtIGRvIG5vdCBhbGxvdyBvYmplY3RzIHRvIGJlIGVxdWFsIHVubGVzcwotCSAqIHRoZXkgYXJlIHRoZSBzYW1lIG9iamVjdC4KLQkgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgLSB3ZSByZWx5IG9uIG9iamVjdCBpZGVudGl0eSBleHRlbnNpdmVseS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMgPT0gbzsKLQl9Ci0KLQkvKioKLQkgKiBFbmZvcmNlIG9iamVjdCBpZGVudGl0eSAtIGRvIG5vdCBhbGxvdyBvYmplY3RzIHRvIGJlIGVxdWFsIHVubGVzcwotCSAqIHRoZXkgYXJlIHRoZSBzYW1lIG9iamVjdC4KLQkgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgLSB3ZSByZWx5IG9uIG9iamVjdCBpZGVudGl0eSBleHRlbnNpdmVseS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbm1lbnQgaGllcmFyY2h5IChwYXJlbnQvY2hpbGRyZW4pICoqKioqKioqKioKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIHBhcmVudCBpbiB0aGUgY29udGFpbm1lbnQgaGllcmFyY2h5LgotCSAqIE1vc3Qgbm9kZXMgbXVzdCBoYXZlIGEgcGFyZW50LgotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHBhcmVudCBpcyBub3QgdmFsaWQKLQkgKiBmb3IgdGhlIG5vZGUuCi0JICogQnkgZGVmYXVsdCByZXF1aXJlIGEgbm9uLW51bGwgcGFyZW50LiBPdmVycmlkZSBpZiBvdGhlciByZXN0cmljdGlvbnMgZXhpc3QKLQkgKiBvciB0aGUgcGFyZW50IHNob3VsZCBiZSBudWxsLgotCSAqIE5COiBSb290IG5vZGUgbW9kZWwgaW1wbGVtZW50YXRpb25zIHdpbGwgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1BhcmVudChOb2RlIHBhcmVudE5vZGUpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHBhcmVudCBub2RlIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIGNoaWxkcmVuLCB3aGljaCBhcmUgYWxzbyBub2Rlcy4KLQkgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogT3ZlcnJpZGUgI2FkZENoaWxkcmVuVG8oTGlzdCkuCi0JICogQHNlZSAjZ2V0UGFyZW50KCkKLQkgKiBAc2VlICNhZGRDaGlsZHJlblRvKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBmaW5hbCBJdGVyYXRvcjxOb2RlPiBjaGlsZHJlbigpIHsKLQkJTGlzdDxOb2RlPiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKLQkJdGhpcy5hZGRDaGlsZHJlblRvKGNoaWxkcmVuKTsKLQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWRkIHRoZWlyIGNoaWxkcmVuCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlblRvKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0PE5vZGU+IGxpc3QpIHsKLQkJLy8gdGhpcyBjbGFzcyBoYXMgbm8gY2hpbGRyZW4sIHN1YmNsYXNzZXMgd2lsbC4uLgotCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5hZGRDaGlsZHJlblRvKGxpc3QpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgY29udGFpbm1lbnQgaGllcmFyY2h5J3Mgcm9vdCBub2RlLgotCSAqIE1vc3Qgbm9kZXMgbXVzdCBoYXZlIGEgcm9vdC4KLQkgKiBAc2VlICNnZXRQYXJlbnQoKQotCSAqIE5COiBBc3N1bWUgdGhlIHJvb3QgaGFzIG5vIHBhcmVudC4KLQkgKi8KLQlwdWJsaWMgTm9kZSByb290KCkgewotCQlOb2RlIHAgPSB0aGlzLnBhcmVudDsKLQkJcmV0dXJuIChwID09IG51bGwpID8gdGhpcyA6IHAucm9vdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCi0JICogQnkgZGVmaW5pdGlvbiwgYSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiBpdHNlbGYuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZXNjZW5kYW50T2YoTm9kZSBub2RlKSB7Ci0JCXJldHVybiAodGhpcyA9PSBub2RlKSB8fCB0aGlzLnBhcmVudElzRGVzY2VuZGFudE9mKG5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHBhcmVudElzRGVzY2VuZGFudE9mKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gKHRoaXMucGFyZW50ICE9IG51bGwpICYmIHRoaXMucGFyZW50LmlzRGVzY2VuZGFudE9mKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gaG9sZGluZyBhbGwgdGhlIG5vZGUncyAicmVmZXJlbmNlcyIsIGFuZCBhbGwKLQkgKiB0aGUgbm9kZSdzIGRlc2NlbmRhbnRzJyAicmVmZXJlbmNlcyIuICJSZWZlcmVuY2VzIiBhcmUKLQkgKiBvYmplY3RzIHRoYXQgYXJlICJyZWZlcmVuY2VkIiBieSBhbm90aGVyIG9iamVjdCwgYXMgb3Bwb3NlZAotCSAqIHRvICJvd25lZCIgYnkgYW5vdGhlciBvYmplY3QuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPE5vZGUuUmVmZXJlbmNlPiBicmFuY2hSZWZlcmVuY2VzKCkgewotCQlDb2xsZWN0aW9uPE5vZGUuUmVmZXJlbmNlPiBicmFuY2hSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdDxOb2RlLlJlZmVyZW5jZT4oMTAwMCk7CQkvLyBzdGFydCBiaWcKLQkJdGhpcy5hZGRCcmFuY2hSZWZlcmVuY2VzVG8oYnJhbmNoUmVmZXJlbmNlcyk7Ci0JCXJldHVybiBicmFuY2hSZWZlcmVuY2VzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBBZGQgdGhlIG5vZGUncyAicmVmZXJlbmNlcyIsIGFuZCBhbGwgdGhlIG5vZGUncyBkZXNjZW5kYW50cycKLQkgKiAicmVmZXJlbmNlcyIsIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4gIlJlZmVyZW5jZXMiIGFyZQotCSAqIG9iamVjdHMgdGhhdCBhcmUgInJlZmVyZW5jZWQiIGJ5IGFub3RoZXIgb2JqZWN0LCBhcyBvcHBvc2VkCi0JICogdG8gIm93bmVkIiBieSBhbm90aGVyIG9iamVjdC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBvZiBwYXJ0aWN1bGFyIGNvbmNlcm4gdG8gSGFuZGxlcywgc2luY2UgbW9zdAotCSAqIChob3BlZnVsbHkgYWxsKSAicmVmZXJlbmNlcyIgYXJlIGhlbGQgYnkgSGFuZGxlcy4KLQkgKiBAc2VlIFJlZmVyZW5jZQotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRCcmFuY2hSZWZlcmVuY2VzVG8oQ29sbGVjdGlvbjxOb2RlLlJlZmVyZW5jZT4gYnJhbmNoUmVmZXJlbmNlcykgewotCQlmb3IgKEl0ZXJhdG9yPE5vZGU+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW4oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlOb2RlIGNoaWxkID0gc3RyZWFtLm5leHQoKTsJCS8vIHB1bGwgb3V0IHRoZSBjaGlsZCB0byBlYXNlIGRlYnVnZ2luZwotCQkJY2hpbGQuYWRkQnJhbmNoUmVmZXJlbmNlc1RvKGJyYW5jaFJlZmVyZW5jZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgbm9kZXMgaW4gdGhlIG9iamVjdCdzIGJyYW5jaCBvZiB0aGUgdHJlZSwKLQkgKiBpbmNsdWRpbmcgdGhlIG5vZGUgaXRzZWxmLiBUaGUgbm9kZXMgd2lsbCBwcm9iYWJseSByZXR1cm5lZAotCSAqIGluICJkZXB0aC1maXJzdCIgb3JkZXIuCi0JICogT25seSByZWFsbHkgdXNlZCBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxOb2RlPiBhbGxOb2RlcygpIHsKLQkJQ29sbGVjdGlvbjxOb2RlPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oMTAwMCk7CQkvLyBzdGFydCBiaWcKLQkJdGhpcy5hZGRBbGxOb2Rlc1RvKG5vZGVzKTsKLQkJcmV0dXJuIG5vZGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEk/Ci0JICogQWRkIGFsbCB0aGUgbm9kZXMgaW4gdGhlIG9iamVjdCdzIGJyYW5jaCBvZiB0aGUgdHJlZSwKLQkgKiBpbmNsdWRpbmcgdGhlIG5vZGUgaXRzZWxmLCB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogT25seSByZWFsbHkgdXNlZCBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFsbE5vZGVzVG8oQ29sbGVjdGlvbjxOb2RlPiBub2RlcykgewotCQlub2Rlcy5hZGQodGhpcyk7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5hZGRBbGxOb2Rlc1RvKG5vZGVzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb2RlbCBzeW5jaHJvbml6YXRpb24gc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIFRoaXMgaXMgYSBnZW5lcmFsIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzcGVjaWZpZWQgbm9kZSBoYXMgYmVlbgotCSAqIHJlbW92ZWQgZnJvbSB0aGUgdHJlZS4gVGhlIG5vZGUgcmVjZWl2aW5nIHRoaXMgbm90aWZpY2F0aW9uCi0JICogc2hvdWxkIHBlcmZvcm0gYW55IG5lY2Vzc2FyeSB1cGRhdGVzIHRvIHJlbWFpbiBpbiBzeW5jaAotCSAqIHdpdGggdGhlIHRyZWUgKGUuZy4gY2xlYXJpbmcgb3V0IG9yIHJlcGxhY2luZyBhbnkgcmVmZXJlbmNlcwotCSAqIHRvIHRoZSByZW1vdmVkIG5vZGUgb3IgYW55IG9mIHRoZSByZW1vdmVkIG5vZGUncyBkZXNjZW5kYW50cykuCi0JICogQHNlZSAjaXNEZXNjZW5kYW50T2YoTm9kZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChOb2RlIG5vZGUpIHsKLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWNoaWxkLm5vZGVSZW1vdmVkKG5vZGUpOwotCQl9Ci0JLy8gd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGRvbid0IGZvcmdldCB0byBpbmNsdWRlOgotCS8vCXN1cGVyLm5vZGVSZW1vdmVkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIGNvbnZlbmllbmNlIG1ldGhvZAotCSAqIHJldHVybiB3aGV0aGVyIG5vZGUxIGlzIGEgZGVzY2VuZGFudCBvZiBub2RlMjsKLQkgKiBub2RlMSBjYW4gYmUgbnVsbAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG5vZGVJc0Rlc2NlbmRhbnRPZihOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSB7Ci0JCXJldHVybiAobm9kZTEgIT0gbnVsbCkgJiYgbm9kZTEuaXNEZXNjZW5kYW50T2Yobm9kZTIpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogVGhpcyBpcyBhIGdlbmVyYWwgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHNwZWNpZmllZCBub2RlIGhhcyBiZWVuCi0JICogcmVuYW1lZC4gVGhlIG5vZGUgcmVjZWl2aW5nIHRoaXMgbm90aWZpY2F0aW9uIHNob3VsZCBtYXJrIGl0cwotCSAqIGJyYW5jaCBkaXJ0eSBpZiBuZWNlc3NhcnkgKGkuZS4gaXQgcmVmZXJlbmNlcyB0aGUgcmVuYW1lZCBub2RlCi0JICogb3Igb25lIG9mIGl0cyBkZXNjZW5kYW50cykuIFRoaXMgbWV0aG9kIGlzIG9mIHBhcnRpY3VsYXIgY29uY2VybgotCSAqIHRvIEhhbmRsZXMuCi0JICogQHNlZSAjaXNEZXNjZW5kYW50T2YoTm9kZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2RlUmVuYW1lZChOb2RlIG5vZGUpIHsKLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWNoaWxkLm5vZGVSZW5hbWVkKG5vZGUpOwotCQl9Ci0JLy8gd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGRvbid0IGZvcmdldCB0byBpbmNsdWRlOgotCS8vCXN1cGVyLm5vZGVSZW5hbWVkKG5vZGUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHVzZXIgY29tbWVudCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCdzIHVzZXIgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGNvbW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmNvbW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBvYmplY3QncyB1c2VyIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgewotCQlPYmplY3Qgb2xkID0gdGhpcy5jb21tZW50OwotCQl0aGlzLmNvbW1lbnQgPSBjb21tZW50OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09NTUVOVF9QUk9QRVJUWSwgb2xkLCBjb21tZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogQW4gYXNwZWN0IG9mIHRoZSBub2RlIGhhcyBjaGFuZ2VkOgotCSAqIAktIGlmIGl0IGlzIGEgcGVyc2lzdGVudCBhc3BlY3QsIG1hcmsgdGhlIG9iamVjdCBkaXJ0eQotCSAqIAktIGlmIGl0IGlzIGEgc2lnbmlmaWNhbnQgYXNwZWN0LCB2YWxpZGF0ZSB0aGUgb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXNwZWN0Q2hhbmdlZChTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlpZiAodGhpcy5hc3BlY3RJc1BlcnNpc3RlbnQoYXNwZWN0TmFtZSkpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBkaXJ0eSBjaGFuZ2U6ICIgKyB0aGlzICsgIjogIiArIGFzcGVjdE5hbWUpOwotCQkJdGhpcy5tYXJrRGlydHkoKTsKLQkJfQotCQlpZiAodGhpcy5hc3BlY3RDaGFuZ2VSZXF1aXJlc1ZhbGlkYXRpb24oYXNwZWN0TmFtZSkpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiB2YWxpZGF0aW9uIGNoYW5nZTogIiArIHRoaXMgKyAiOiAiICsgYXNwZWN0TmFtZSk7Ci0JCQl0aGlzLnZhbGlkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJdGhpcy5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogUmV0dXJuIGEgdmFsaWRhdG9yIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW5ldmVyIGEKLQkgKiAidmFsaWRhdGVkIiBhc3BlY3Qgb2YgdGhlIG5vZGUgdHJlZSBjaGFuZ2VzLgotCSAqIFR5cGljYWxseSBvbmx5IHRoZSByb290IG5vZGUgZGlyZWN0bHkgaG9sZHMgYSB2YWxpZGF0b3IuCi0JICogTkI6IFJvb3Qgbm9kZSBtb2RlbCBpbXBsZW1lbnRhdGlvbnMgd2lsbCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBOb2RlLlZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIG5vZGUgc2hvdWxkIG5vdCBiZSBmaXJpbmcgY2hhbmdlIGV2ZW50cyBkdXJpbmcgaXRzIGNvbnN0cnVjdGlvbi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0aGlzLnBhcmVudC5nZXRWYWxpZGF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYSB2YWxpZGF0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbmV2ZXIgYQotCSAqICJ2YWxpZGF0ZWQiIGFzcGVjdCBvZiB0aGUgbm9kZSB0cmVlIGNoYW5nZXMuCi0JICogVHlwaWNhbGx5IG9ubHkgdGhlIHJvb3Qgbm9kZSBkaXJlY3RseSBob2xkcyBhIHZhbGlkYXRvci4KLQkgKiBOQjogUm9vdCBub2RlIG1vZGVsIGltcGxlbWVudGF0aW9ucyB3aWxsIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKE5vZGUuVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhpcyByb290IG5vZGUgc2hvdWxkIGltcGxlbWVudCAjc2V0VmFsaWRhdG9yKE5vZGUuVmFsaWRhdG9yKS4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiT25seSByb290IG5vZGVzIGltcGxlbWVudCAjc2V0VmFsaWRhdG9yKE5vZGUuVmFsaWRhdG9yKS4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXJ0eSBmbGFnIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW55IHBlcnNpc3RlbnQgYXNwZWN0cyBvZiB0aGUgb2JqZWN0Ci0JICogaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBvYmplY3Qgd2FzIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKiBUaGlzIGRvZXMgTk9UIGluY2x1ZGUgY2hhbmdlcyB0byB0aGUgb2JqZWN0J3MgZGVzY2VuZGFudHMuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZGlydHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW55IHBlcnNpc3RlbnQgYXNwZWN0cyBvZiB0aGUgb2JqZWN0LAotCSAqIG9yIGFueSBvZiBpdHMgZGVzY2VuZGFudHMsIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgb2JqZWN0IGFuZAotCSAqIGl0cyBkZXNjZW5kYW50cyB3ZXJlIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RpcnR5QnJhbmNoKCkgewotCQlyZXR1cm4gdGhpcy5kaXJ0eUJyYW5jaDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgb2JqZWN0IGlzIHVubW9kaWZpZWQKLQkgKiBzaW5jZSBpdCB3YXMgbGFzdCByZWFkIG9yIHNhdmVkLgotCSAqIFRoaXMgZG9lcyBOT1QgaW5jbHVkZSBjaGFuZ2VzIHRvIHRoZSBvYmplY3QncyBkZXNjZW5kYW50cy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NsZWFuKCkgewotCQlyZXR1cm4gISB0aGlzLmRpcnR5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBvYmplY3QgYW5kIGFsbCBvZiBpdHMgZGVzY2VuZGFudHMKLQkgKiBhcmUgdW5tb2RpZmllZCBzaW5jZSB0aGUgb2JqZWN0IGFuZAotCSAqIGl0cyBkZXNjZW5kYW50cyB3ZXJlIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NsZWFuQnJhbmNoKCkgewotCQlyZXR1cm4gISB0aGlzLmRpcnR5QnJhbmNoOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZGlydHkgYnJhbmNoIGZsYWcgc2V0dGluZy4gVGhpcyBpcyBzZXQgdG8gdHJ1ZQotCSAqIHdoZW4gZWl0aGVyIHRoZSBvYmplY3Qgb3Igb25lIG9mIGl0cyBkZXNjZW5kYW50cyBiZWNvbWVzIGRpcnR5LgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRJc0RpcnR5QnJhbmNoKGJvb2xlYW4gZGlydHlCcmFuY2gpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRpcnR5QnJhbmNoOwotCQl0aGlzLmRpcnR5QnJhbmNoID0gZGlydHlCcmFuY2g7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVJUWV9CUkFOQ0hfUFJPUEVSVFksIG9sZCwgZGlydHlCcmFuY2gpOwotCX0KLQotCS8qKgotCSAqIE1hcmsgdGhlIG9iamVjdCBhcyBkaXJ0eSBhbmQgYXMgYSBkaXJ0eSBicmFuY2guCi0JICogQW4gb2JqZWN0IGlzIG1hcmtlZCBkaXJ0eSB3aGVuIGVpdGhlciBhICJwZXJzaXN0ZW50IiBhdHRyaWJ1dGUKLQkgKiBoYXMgY2hhbmdlZCBvciBpdHMgc2F2ZSBsb2NhdGlvbiBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbWFya0RpcnR5KCkgewotCQl0aGlzLmRpcnR5ID0gdHJ1ZTsKLQkJdGhpcy5tYXJrQnJhbmNoRGlydHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIE1hcmsgdGhlIG5vZGUgYW5kIGl0cyBwYXJlbnQgYXMgZGlydHkgYnJhbmNoZXMuCi0JICogVGhpcyBtZXNzYWdlIGlzIHByb3BhZ2F0ZWQgdXAgdGhlIGNvbnRhaW5tZW50Ci0JICogdHJlZSB3aGVuIGEgcGFydGljdWxhciBub2RlIGJlY29tZXMgZGlydHkuCi0JICovCi0JcHVibGljIHZvaWQgbWFya0JyYW5jaERpcnR5KCkgewotCQkvLyBzaG9ydC1jaXJjdWl0IGFueSB1bm5lY2Vzc2FyeSBwcm9wYWdhdGlvbgotCQlpZiAodGhpcy5kaXJ0eUJyYW5jaCkgewotCQkJLy8gaWYgdGhpcyBpcyBhbHJlYWR5IGEgZGlydHkgYnJhbmNoLCB0aGUgcGFyZW50IG11c3QgYmUgYWxzbwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdGhpcy5zZXRJc0RpcnR5QnJhbmNoKHRydWUpOwotCQl0aGlzLm1hcmtQYXJlbnRCcmFuY2hEaXJ0eSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1hcmtQYXJlbnRCcmFuY2hEaXJ0eSgpIHsKLQkJaWYgKHRoaXMucGFyZW50ICE9IG51bGwpIHsKLQkJCXRoaXMucGFyZW50Lm1hcmtCcmFuY2hEaXJ0eSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFyayB0aGUgb2JqZWN0IGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzIGFzIGRpcnR5LgotCSAqIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBzYXZlIGxvY2F0aW9uIG9mIHNvbWUKLQkgKiB0b3AtbGV2ZWwgb2JqZWN0IGlzIGNoYW5nZWQgYW5kIHRoZSBlbnRpcmUKLQkgKiBjb250YWlubWVudCB0cmVlIG11c3QgYmUgbWFya2VkIGRpcnR5IHNvIGl0Ci0JICogd2lsbCBiZSB3cml0dGVuIG91dC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBtYXJrRW50aXJlQnJhbmNoRGlydHkoKSB7Ci0JCXRoaXMubWFya0RpcnR5KCk7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5tYXJrRW50aXJlQnJhbmNoRGlydHkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1hcmsgdGhlIG9iamVjdCBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cyBhcyBjbGVhbi4KLQkgKiBUaGVuIG5vdGlmeSB0aGUgb2JqZWN0J3MgcGFyZW50IHRoYXQgaXQgKHRoZSBwYXJlbnQpCi0JICogbWlnaHQgbm93IGJlIGEgY2xlYW4gYnJhbmNoIGFsc28uCi0JICogVHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgb2JqZWN0IGhhcyBqdXN0IGJlZW4KLQkgKiByZWFkIGluIG9yIHdyaXR0ZW4gb3V0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIG1hcmtFbnRpcmVCcmFuY2hDbGVhbigpIHsKLQkJdGhpcy5jYXNjYWRlTWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCXRoaXMubWFya1BhcmVudEJyYW5jaENsZWFuSWZQb3NzaWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1hcmtQYXJlbnRCcmFuY2hDbGVhbklmUG9zc2libGUoKSB7Ci0JCWlmICh0aGlzLnBhcmVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudC5tYXJrQnJhbmNoQ2xlYW5JZlBvc3NpYmxlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIE1hcmsgdGhlIG5vZGUgYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMgYXMgY2xlYW4uCi0JICogVHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgbm9kZSBoYXMganVzdCBiZWVuCi0JICogcmVhZCBpbiBvciB3cml0dGVuIG91dC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk7IGl0IGlzIG5vdCBmb3IKLQkgKiBjbGllbnQgdXNlLgotCSAqIE5vdCB0aGUgYmVzdCBvZiBtZXRob2QgbmFtZXMuLi4uIDotKAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNhc2NhZGVNYXJrRW50aXJlQnJhbmNoQ2xlYW4oKSB7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5jYXNjYWRlTWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCX0KLQkJdGhpcy5kaXJ0eSA9IGZhbHNlOwotCQl0aGlzLnNldElzRGlydHlCcmFuY2goZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogQSBjaGlsZCBub2RlJ3MgYnJhbmNoIGhhcyBiZWVuIG1hcmtlZCBjbGVhbi4gSWYgdGhlIG5vZGUKLQkgKiBpdHNlbGYgaXMgY2xlYW4gYW5kIGlmIGFsbCBvZiBpdHMgY2hpbGRyZW4gYXJlIGFsc28gY2xlYW4sIHRoZQotCSAqIG5vZGUncyBicmFuY2ggY2FuIGJlIG1hcmtlZCBjbGVhbi4gVGhlbiwgaWYgdGhlIG5vZGUncwotCSAqIGJyYW5jaCBpcyBjbGVhbiwgdGhlIG5vZGUgd2lsbCBub3RpZnkgaXRzIHBhcmVudCB0aGF0IGl0IG1pZ2h0Ci0JICogYmUgY2xlYW4gYWxzby4gVGhpcyBtZXNzYWdlIGlzIHByb3BhZ2F0ZWQgdXAgdGhlIGNvbnRhaW5tZW50Ci0JICogdHJlZSB3aGVuIGEgcGFydGljdWxhciBub2RlIGJlY29tZXMgY2xlYW4uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgbWFya0JyYW5jaENsZWFuSWZQb3NzaWJsZSgpIHsKLQkJLy8gc2hvcnQtY2lyY3VpdCBhbnkgdW5uZWNlc3NhcnkgcHJvcGFnYXRpb24KLQkJaWYgKHRoaXMuZGlydHkpIHsKLQkJCS8vIGlmIHRoZSBvYmplY3QgaXMgImxvY2FsbHkiIGRpcnR5LCBpdCBpcyBzdGlsbCBhIGRpcnR5IGJyYW5jaAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWlmIChjaGlsZC5pc0RpcnR5QnJhbmNoKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLnNldElzRGlydHlCcmFuY2goZmFsc2UpOwotCQl0aGlzLm1hcmtQYXJlbnRCcmFuY2hDbGVhbklmUG9zc2libGUoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYXNwZWN0SXNQZXJzaXN0ZW50KFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiAhIHRoaXMuYXNwZWN0SXNUcmFuc2llbnQoYXNwZWN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFzcGVjdElzVHJhbnNpZW50KFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zaWVudEFzcGVjdE5hbWVzKCkuY29udGFpbnMoYXNwZWN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IG9mIHRoZSBvYmplY3QncyB0cmFuc2llbnQgYXNwZWN0IG5hbWVzLgotCSAqIFRoZXNlIGFyZSB0aGUgYXNwZWN0cyB0aGF0LCB3aGVuIHRoZXkgY2hhbmdlLCB3aWxsIE5PVCBjYXVzZSB0aGUKLQkgKiBvYmplY3QgdG8gYmUgbWFya2VkIGRpcnR5LgotCSAqIElmIHlvdSBuZWVkIGluc3RhbmNlLWJhc2VkIGNhbGN1bGF0aW9uIG9mIHlvdXIgdHJhbnNpZW50IGFzcGVjdHMsCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuIElmIGNsYXNzLWJhc2VkIGNhbGN1bGF0aW9uIGlzIHN1ZmZpY2llbnQsCi0JICogb3ZlcnJpZGUgI2FkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8oU2V0KS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU2V0PFN0cmluZz4gdHJhbnNpZW50QXNwZWN0TmFtZXMoKSB7Ci0JCXN5bmNocm9uaXplZCAodHJhbnNpZW50QXNwZWN0TmFtZVNldHMpIHsKLQkJCUhhc2hTZXQ8U3RyaW5nPiB0cmFuc2llbnRBc3BlY3ROYW1lcyA9IHRyYW5zaWVudEFzcGVjdE5hbWVTZXRzLmdldCh0aGlzLmdldENsYXNzKCkpOwotCQkJaWYgKHRyYW5zaWVudEFzcGVjdE5hbWVzID09IG51bGwpIHsKLQkJCQl0cmFuc2llbnRBc3BlY3ROYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJCQl0aGlzLmFkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8odHJhbnNpZW50QXNwZWN0TmFtZXMpOwotCQkJCXRyYW5zaWVudEFzcGVjdE5hbWVTZXRzLnB1dCh0aGlzLmdldENsYXNzKCksIHRyYW5zaWVudEFzcGVjdE5hbWVzKTsKLQkJCX0KLQkJCXJldHVybiB0cmFuc2llbnRBc3BlY3ROYW1lczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgb2JqZWN0J3MgdHJhbnNpZW50IGFzcGVjdCBuYW1lcyB0byB0aGUgc3BlY2lmaWVkIHNldC4KLQkgKiBUaGVzZSBhcmUgdGhlIGFzcGVjdHMgdGhhdCwgd2hlbiB0aGV5IGNoYW5nZSwgd2lsbCBOT1QgY2F1c2UgdGhlCi0JICogb2JqZWN0IHRvIGJlIG1hcmtlZCBkaXJ0eS4KLQkgKiBJZiBjbGFzcy1iYXNlZCBjYWxjdWxhdGlvbiBvZiB5b3VyIHRyYW5zaWVudCBhc3BlY3RzIGlzIHN1ZmZpY2llbnQsCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuIElmIHlvdSBuZWVkIGluc3RhbmNlLWJhc2VkIGNhbGN1bGF0aW9uLAotCSAqIG92ZXJyaWRlICN0cmFuc2llbnRBc3BlY3ROYW1lcygpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8oU2V0PFN0cmluZz4gdHJhbnNpZW50QXNwZWN0TmFtZXMpIHsKLQkJdHJhbnNpZW50QXNwZWN0TmFtZXMuYWRkKERJUlRZX0JSQU5DSF9QUk9QRVJUWSk7Ci0JCXRyYW5zaWVudEFzcGVjdE5hbWVzLmFkZChCUkFOQ0hfUFJPQkxFTVNfTElTVCk7Ci0JCXRyYW5zaWVudEFzcGVjdE5hbWVzLmFkZChIQVNfQlJBTkNIX1BST0JMRU1TX1BST1BFUlRZKTsKLQkvLyB3aGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuYWRkVHJhbnNpZW50QXNwZWN0TmFtZXNUbyh0cmFuc2llbnRBc3BlY3ROYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkaXJ0eSBub2RlcyBpbiB0aGUgb2JqZWN0J3MgYnJhbmNoIG9mIHRoZSB0cmVlLAotCSAqIGluY2x1ZGluZyB0aGUgbm9kZSBpdHNlbGYgKGlmIGFwcHJvcHJpYXRlKS4KLQkgKiBPbmx5IHJlYWxseSB1c2VkIGZvciB0ZXN0aW5nIGFuZCBkZWJ1Z2dpbmcuCi0JICovCi0JcHVibGljIGZpbmFsIEl0ZXJhdG9yPE5vZGU+IGFsbERpcnR5Tm9kZXMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8Tm9kZT4odGhpcy5hbGxOb2RlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChOb2RlIG5vZGUpIHsKLQkJCQlyZXR1cm4gKG5vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdE5vZGUpICYmICgoQWJzdHJhY3ROb2RlKSBub2RlKS5pc0RpcnR5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByb2JsZW1zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbm9kZSdzIHByb2JsZW1zLgotCSAqIFRoaXMgZG9lcyBOT1QgaW5jbHVkZSB0aGUgcHJvYmxlbXMgb2YgdGhlIG5vZGUncyBkZXNjZW5kYW50cy4KLQkgKiBAc2VlICNicmFuY2hQcm9ibGVtcygpCi0JICovCi0JcHVibGljIGZpbmFsIEl0ZXJhdG9yPFByb2JsZW0+IHByb2JsZW1zKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8UHJvYmxlbT4odGhpcy5wcm9ibGVtcyk7CS8vIHJlbW92ZXMgYXJlIG5vdCBhbGxvd2VkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub2RlJ3MgcHJvYmxlbXMuCi0JICogVGhpcyBkb2VzIE5PVCBpbmNsdWRlIHRoZSBwcm9ibGVtcyBvZiB0aGUgbm9kZSdzIGRlc2NlbmRhbnRzLgotCSAqIEBzZWUgI2JyYW5jaFByb2JsZW1zU2l6ZSgpCi0JICovCi0JcHVibGljIGZpbmFsIGludCBwcm9ibGVtc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnByb2JsZW1zLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbm9kZSBoYXMgcHJvYmxlbXMKLQkgKiBUaGlzIGRvZXMgTk9UIGluY2x1ZGUgdGhlIHByb2JsZW1zIG9mIHRoZSBub2RlJ3MgZGVzY2VuZGFudHMuCi0JICogQHNlZSAjaGFzQnJhbmNoUHJvYmxlbXMoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1Byb2JsZW1zKCkgewotCQlyZXR1cm4gISB0aGlzLnByb2JsZW1zLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBub2RlJ3MgcHJvYmxlbXMgYWxvbmcgd2l0aCBhbGwgdGhlCi0JICogbm9kZSdzIGRlc2NlbmRhbnRzJyBwcm9ibGVtcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgTGlzdEl0ZXJhdG9yPFByb2JsZW0+IGJyYW5jaFByb2JsZW1zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFByb2JsZW0+KHRoaXMuYnJhbmNoUHJvYmxlbXMpOwkvLyByZW1vdmVzIGFyZSBub3QgYWxsb3dlZAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiBhbGwgdGhlIG5vZGUncyBwcm9ibGVtcyBhbG9uZyB3aXRoIGFsbCB0aGUKLQkgKiBub2RlJ3MgZGVzY2VuZGFudHMnIHByb2JsZW1zLgotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgYnJhbmNoUHJvYmxlbXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5icmFuY2hQcm9ibGVtcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgb3IgYW55IG9mIGl0cyBkZXNjZW5kYW50cyBoYXZlIHByb2JsZW1zLgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0JyYW5jaFByb2JsZW1zKCkgewotCQlyZXR1cm4gISB0aGlzLmJyYW5jaFByb2JsZW1zLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBjb250YWluc0JyYW5jaFByb2JsZW0oUHJvYmxlbSBwcm9ibGVtKSB7Ci0JCXJldHVybiB0aGlzLmJyYW5jaFByb2JsZW1zLmNvbnRhaW5zKHByb2JsZW0pOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBQcm9ibGVtIGJ1aWxkUHJvYmxlbShTdHJpbmcgbWVzc2FnZUtleSwgaW50IG1lc3NhZ2VUeXBlLCBPYmplY3QuLi4gbWVzc2FnZUFyZ3VtZW50cykgewotCQlyZXR1cm4gbmV3IERlZmF1bHRQcm9ibGVtKHRoaXMsIG1lc3NhZ2VLZXksIG1lc3NhZ2VUeXBlLCBtZXNzYWdlQXJndW1lbnRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUHJvYmxlbSBidWlsZFByb2JsZW0oU3RyaW5nIG1lc3NhZ2VLZXksIGludCBtZXNzYWdlVHlwZSkgewotCQlyZXR1cm4gdGhpcy5idWlsZFByb2JsZW0obWVzc2FnZUtleSwgbWVzc2FnZVR5cGUsIEVNUFRZX1BST0JMRU1fTUVTU0FHRV9BUkdVTUVOVFMpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBub2RlIGFuZCBhbGwgb2YgaXRzIGRlc2NlbmRhbnRzLAotCSAqIGFuZCB1cGRhdGUgdGhlaXIgc2V0cyBvZiAiYnJhbmNoIiBwcm9ibGVtcy4KLQkgKiBJZiB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGhhdmUgY2hhbmdlZCwKLQkgKiBub3RpZnkgdGhlIG5vZGUncyBwYXJlbnQuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVCcmFuY2goKSB7Ci0JCWlmICh0aGlzLnZhbGlkYXRlQnJhbmNoSW50ZXJuYWwoKSkgewotCQkJLy8gaWYgb3VyICJicmFuY2giIHByb2JsZW1zIGhhdmUgY2hhbmdlZCwgdGhlbgotCQkJLy8gb3VyIHBhcmVudCBtdXN0IHJlYnVpbGQgaXRzICJicmFuY2giIHByb2JsZW1zIGFsc28KLQkJCXRoaXMucmVidWlsZFBhcmVudEJyYW5jaFByb2JsZW1zKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWJ1aWxkUGFyZW50QnJhbmNoUHJvYmxlbXMoKSB7Ci0JCWlmICh0aGlzLnBhcmVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudC5yZWJ1aWxkQnJhbmNoUHJvYmxlbXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogVmFsaWRhdGUgdGhlIG5vZGUgYW5kIGFsbCBvZiBpdHMgZGVzY2VuZGFudHMsCi0JICogYW5kIHVwZGF0ZSB0aGVpciBzZXRzIG9mICJicmFuY2giIHByb2JsZW1zLgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIG9mICJicmFuY2giIHByb2JsZW1zIGhhcyBjaGFuZ2VkLgotCSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seTsgaXQgaXMgbm90IGZvcgotCSAqIGNsaWVudCB1c2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCcmFuY2hJbnRlcm5hbCgpIHsKLQkJLy8gcmVidWlsZCAiYnJhbmNoIiBwcm9ibGVtcyBpbiBjaGlsZHJlbiBmaXJzdAotCQlmb3IgKEl0ZXJhdG9yPE5vZGU+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW4oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlOb2RlIGNoaWxkID0gc3RyZWFtLm5leHQoKTsJCS8vIHB1bGwgb3V0IHRoZSBjaGlsZCB0byBlYXNlIGRlYnVnZ2luZwotCQkJLy8gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gcmVidWlsZCBvdXIgImJyYW5jaCIKLQkJCS8vIHByb2JsZW1zIG5vIG1hdHRlciB3aGF0LCB0byBzZWUgaWYgdGhleSBoYXZlIGNoYW5nZWQKLQkJCWNoaWxkLnZhbGlkYXRlQnJhbmNoSW50ZXJuYWwoKTsKLQkJfQotCi0JCXRoaXMucHJvYmxlbXMuY2xlYXIoKTsKLQkJdGhpcy5hZGRQcm9ibGVtc1RvKHRoaXMucHJvYmxlbXMpOwotCi0JCXJldHVybiB0aGlzLmNoZWNrQnJhbmNoUHJvYmxlbXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBmb3IgYW55IHByb2JsZW1zIGFuZCBhZGQgdGhlbSB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIE9OTFkgYWRkIHByb2JsZW1zIGZvciB0aGlzIHBhcnRpY3VsYXIgbm9kZTsKLQkgKiBpdCBzaG91bGQgTk9UIGFkZCBwcm9ibGVtcyBmb3IgYW55IG9mIHRoaXMgbm9kZSdzIGRlc2NlbmRhbnRzCi0JICogb3IgYW5jZXN0b3JzLiAoQWx0aG91Z2ggdGhlcmUgd2lsbCBiZSB0aW1lcyB3aGVuIGl0IGlzIGRlYmF0YWJsZQotCSAqIGFzIHRvIHdoaWNoIG5vZGUgYSBwcm9ibGVtICJiZWxvbmdzIiB0by4uLi4pCi0JICogCi0JICogTkI6IFRoaXMgbWV0aG9kIHNob3VsZCBOT1QgbW9kaWZ5IEFOWSBwYXJ0IG9mIHRoZSBub2RlJ3Mgc3RhdGUhCi0JICogSXQgaXMgYSBSRUFELU9OTFkgYmVoYXZpb3IuIE9OTFkgdGhlIGxpc3Qgb2YgY3VycmVudCBwcm9ibGVtcwotCSAqIHBhc3NlZCBpbiB0byB0aGUgbWV0aG9kIHNob3VsZCBiZSBtb2RpZmllZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9ibGVtc1RvKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0PFByb2JsZW0+IGN1cnJlbnRQcm9ibGVtcykgewotCQkvLyBUaGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLgotCQkvLyBXaGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuYWRkUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCX0KLQotCS8qKgotCSAqIFJlYnVpbGQgdGhlICJicmFuY2giIHByb2JsZW1zIGFuZCByZXR1cm4gd2hldGhlciB0aGV5IGhhdmUKLQkgKiBjaGFuZ2VkLgotCSAqIE5COiBUaGUgZW50aXJlIGNvbGxlY3Rpb24gb2YgImJyYW5jaCIgcHJvYmxlbXMgbXVzdCBiZSByZS1jYWxjdWxhdGVkCi0JICogd2l0aCBFVkVSWSAic2lnbmlmaWNhbnQiIGNoYW5nZSAtIHdlIGNhbm5vdCBrZWVwIGl0IGluIHN5bmMgdmlhCi0JICogY2hhbmdlIG5vdGlmaWNhdGlvbnMgYmVjYXVzZSBpZiBhIGRlc2NlbmRhbnQgd2l0aCBwcm9ibGVtcyBpcwotCSAqIHJlbW92ZWQgb3IgcmVwbGFjZWQgd2Ugd2lsbCBub3QgcmVjZWl2ZSBub3RpZmljYXRpb24gdGhhdCBpdHMKLQkgKiBwcm9ibGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSBvdXIgImJyYW5jaCIgcHJvYmxlbXMuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrQnJhbmNoUHJvYmxlbXMoKSB7Ci0JCVZlY3RvcjxQcm9ibGVtPiBvbGRCcmFuY2hQcm9ibGVtcyA9IG5ldyBWZWN0b3I8UHJvYmxlbT4odGhpcy5icmFuY2hQcm9ibGVtcyk7Ci0JCWludCBvbGRTaXplID0gdGhpcy5icmFuY2hQcm9ibGVtcy5zaXplKCk7Ci0KLQkJdGhpcy5icmFuY2hQcm9ibGVtcy5jbGVhcigpOwotCQl0aGlzLmJyYW5jaFByb2JsZW1zLmFkZEFsbCh0aGlzLnByb2JsZW1zKTsKLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWNoaWxkLmFkZEJyYW5jaFByb2JsZW1zVG8odGhpcy5icmFuY2hQcm9ibGVtcyk7Ci0JCX0KLQotCQkvLyBpZiB0aGUgc2l6ZSBoYXMgY2hhbmdlZCB0byBvciBmcm9tIHplcm8sIG91ciB2aXJ0dWFsIGZsYWcgaGFzIGNoYW5nZWQKLQkJaW50IG5ld1NpemUgPSB0aGlzLmJyYW5jaFByb2JsZW1zLnNpemUoKTsKLQkJaWYgKChvbGRTaXplID09IDApICYmIChuZXdTaXplICE9IDApKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSEFTX0JSQU5DSF9QUk9CTEVNU19QUk9QRVJUWSwgZmFsc2UsIHRydWUpOwotCQl9IGVsc2UgaWYgKChvbGRTaXplICE9IDApICYmIChuZXdTaXplID09IDApKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSEFTX0JSQU5DSF9QUk9CTEVNU19QUk9QRVJUWSwgdHJ1ZSwgZmFsc2UpOwotCQl9Ci0KLQkJaWYgKG9sZEJyYW5jaFByb2JsZW1zLmVxdWFscyh0aGlzLmJyYW5jaFByb2JsZW1zKSkgewotCQkJcmV0dXJuIGZhbHNlOwkJLy8gb3VyICJicmFuY2giIHByb2JsZW1zIGRpZCBub3QgY2hhbmdlCi0JCX0KLQkJLy8gb3VyICJicmFuY2giIHByb2JsZW1zIGNoYW5nZWQKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoQlJBTkNIX1BST0JMRU1TX0xJU1QsIHRoaXMuYnJhbmNoUHJvYmxlbXMpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIEFkZCBhbGwgdGhlIHByb2JsZW1zIG9mIHRoZSBub2RlIGFuZCBhbGwKLQkgKiB0aGUgcHJvYmxlbXMgb2YgaXRzIGRlc2NlbmRhbnRzIHRvIHRoZQotCSAqIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZEJyYW5jaFByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBsaXN0KSB7Ci0JCWxpc3QuYWRkQWxsKHRoaXMuYnJhbmNoUHJvYmxlbXMpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogQSBjaGlsZCBub2RlJ3MgImJyYW5jaCIgcHJvYmxlbXMgY2hhbmdlZDsKLQkgKiB0aGVyZWZvcmUgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBoYXZlIGNoYW5nZWQgYWxzbyBhbmQKLQkgKiBtdXN0IGJlIHJlYnVpbHQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVidWlsZEJyYW5jaFByb2JsZW1zKCkgewotCQlpZiAoICEgdGhpcy5jaGVja0JyYW5jaFByb2JsZW1zKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIndlIHNob3VsZCBub3QgZ2V0IGhlcmUgdW5sZXNzIG91ciBcImJyYW5jaFwiIHByb2JsZW1zIGhhdmUgY2hhbmdlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5yZWJ1aWxkUGFyZW50QnJhbmNoUHJvYmxlbXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGFuZCB0aGUgImJyYW5jaCIKLQkgKiBwcm9ibGVtcyBvZiBhbGwgb2YgaXRzIGRlc2NlbmRhbnRzLgotCSAqIElmIHRoZSBub2RlJ3MgImJyYW5jaCIgcHJvYmxlbXMgaGF2ZSBjaGFuZ2VkLAotCSAqIG5vdGlmeSB0aGUgbm9kZSdzIHBhcmVudC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjbGVhckFsbEJyYW5jaFByb2JsZW1zKCkgewotCQlpZiAodGhpcy5jbGVhckFsbEJyYW5jaFByb2JsZW1zSW50ZXJuYWwoKSkgewotCQkJLy8gaWYgb3VyICJicmFuY2giIHByb2JsZW1zIGhhdmUgY2hhbmdlZCwgdGhlbgotCQkJLy8gb3VyIHBhcmVudCBtdXN0IHJlYnVpbGQgaXRzICJicmFuY2giIHByb2JsZW1zIGFsc28KLQkJCXRoaXMucmVidWlsZFBhcmVudEJyYW5jaFByb2JsZW1zKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIENsZWFyIHRoZSBub2RlJ3MgImJyYW5jaCIgcHJvYmxlbXMgYW5kIHRoZSAiYnJhbmNoIgotCSAqIHByb2JsZW1zIG9mIGFsbCBvZiBpdHMgZGVzY2VuZGFudHMuCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGNvbGxlY3Rpb24gb2YgImJyYW5jaCIgcHJvYmxlbXMgaGFzIGNoYW5nZWQuCi0JICogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5OyBpdCBpcyBub3QgZm9yCi0JICogY2xpZW50IHVzZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBjbGVhckFsbEJyYW5jaFByb2JsZW1zSW50ZXJuYWwoKSB7Ci0JCWlmICh0aGlzLmJyYW5jaFByb2JsZW1zLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQkvLyBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBjbGVhciBvdXIgImJyYW5jaCIKLQkJCS8vIHByb2JsZW1zIG5vIG1hdHRlciB3aGF0Ci0JCQljaGlsZC5jbGVhckFsbEJyYW5jaFByb2JsZW1zSW50ZXJuYWwoKTsKLQkJfQotCQl0aGlzLnByb2JsZW1zLmNsZWFyKCk7Ci0JCXRoaXMuYnJhbmNoUHJvYmxlbXMuY2xlYXIoKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEhBU19CUkFOQ0hfUFJPQkxFTVNfUFJPUEVSVFksIHRydWUsIGZhbHNlKTsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoQlJBTkNIX1BST0JMRU1TX0xJU1QsIHRoaXMuYnJhbmNoUHJvYmxlbXMpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhIGNoYW5nZSB0byBzcGVjaWZpZWQgYXNwZWN0IHJlcXVpcmVzIGEgcmUtdmFsaWRhdGlvbgotCSAqIG9mIHRoZSBub2RlJ3MgdHJlZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gYXNwZWN0Q2hhbmdlUmVxdWlyZXNWYWxpZGF0aW9uKFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiAhIHRoaXMuYXNwZWN0Q2hhbmdlRG9lc05vdFJlcXVpcmVWYWxpZGF0aW9uKGFzcGVjdE5hbWUpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhc3BlY3RDaGFuZ2VEb2VzTm90UmVxdWlyZVZhbGlkYXRpb24oU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMubm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMoKS5jb250YWlucyhhc3BlY3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzZXQgb2YgdGhlIG9iamVjdCdzICJub24tdmFsaWRhdGVkIiBhc3BlY3QgbmFtZXMuCi0JICogVGhlc2UgYXJlIHRoZSBhc3BlY3RzIHRoYXQsIHdoZW4gdGhleSBjaGFuZ2UsIHdpbGwgTk9UIGNhdXNlIHRoZQotCSAqIG9iamVjdCAob3IgaXRzIGNvbnRhaW5pbmcgdHJlZSkgdG8gYmUgdmFsaWRhdGVkLCBpLmUuIGNoZWNrZWQgZm9yIHByb2JsZW1zLgotCSAqIElmIHlvdSBuZWVkIGluc3RhbmNlLWJhc2VkIGNhbGN1bGF0aW9uIG9mIHlvdXIgIm5vbi12YWxpZGF0ZWQiIGFzcGVjdHMsCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuIElmIGNsYXNzLWJhc2VkIGNhbGN1bGF0aW9uIGlzIHN1ZmZpY2llbnQsCi0JICogb3ZlcnJpZGUgI2FkZE5vblZhbGlkYXRlZEFzcGVjdE5hbWVzVG8oU2V0KS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU2V0PFN0cmluZz4gbm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMoKSB7Ci0JCXN5bmNocm9uaXplZCAobm9uVmFsaWRhdGVkQXNwZWN0TmFtZVNldHMpIHsKLQkJCUhhc2hTZXQ8U3RyaW5nPiBub25WYWxpZGF0ZWRBc3BlY3ROYW1lcyA9IG5vblZhbGlkYXRlZEFzcGVjdE5hbWVTZXRzLmdldCh0aGlzLmdldENsYXNzKCkpOwotCQkJaWYgKG5vblZhbGlkYXRlZEFzcGVjdE5hbWVzID09IG51bGwpIHsKLQkJCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJCQl0aGlzLmFkZE5vblZhbGlkYXRlZEFzcGVjdE5hbWVzVG8obm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMpOwotCQkJCW5vblZhbGlkYXRlZEFzcGVjdE5hbWVTZXRzLnB1dCh0aGlzLmdldENsYXNzKCksIG5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKTsKLQkJCX0KLQkJCXJldHVybiBub25WYWxpZGF0ZWRBc3BlY3ROYW1lczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgb2JqZWN0J3MgIm5vbi12YWxpZGF0ZWQiIGFzcGVjdCBuYW1lcyB0byB0aGUgc3BlY2lmaWVkIHNldC4KLQkgKiBUaGVzZSBhcmUgdGhlIGFzcGVjdHMgdGhhdCwgd2hlbiB0aGV5IGNoYW5nZSwgd2lsbCBOT1QgY2F1c2UgdGhlCi0JICogb2JqZWN0IChvciBpdHMgY29udGFpbmluZyB0cmVlKSB0byBiZSB2YWxpZGF0ZWQsIGkuZS4gY2hlY2tlZCBmb3IgcHJvYmxlbXMuCi0JICogSWYgY2xhc3MtYmFzZWQgY2FsY3VsYXRpb24gb2YgeW91ciAibm9uLXZhbGlkYXRlZCIgYXNwZWN0cyBpcyBzdWZmaWNpZW50LAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBJZiB5b3UgbmVlZCBpbnN0YW5jZS1iYXNlZCBjYWxjdWxhdGlvbiwKLQkgKiBvdmVycmlkZSAjbm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMoKS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb25WYWxpZGF0ZWRBc3BlY3ROYW1lc1RvKFNldDxTdHJpbmc+IG5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKSB7Ci0JCW5vblZhbGlkYXRlZEFzcGVjdE5hbWVzLmFkZChDT01NRU5UX1BST1BFUlRZKTsKLQkJbm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMuYWRkKERJUlRZX0JSQU5DSF9QUk9QRVJUWSk7Ci0JCW5vblZhbGlkYXRlZEFzcGVjdE5hbWVzLmFkZChCUkFOQ0hfUFJPQkxFTVNfTElTVCk7Ci0JCW5vblZhbGlkYXRlZEFzcGVjdE5hbWVzLmFkZChIQVNfQlJBTkNIX1BST0JMRU1TX1BST1BFUlRZKTsKLQkvLyB3aGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuYWRkTm9uVmFsaWRhdGVkQXNwZWN0TmFtZXNUbyhub25WYWxpZGF0ZWRBc3BlY3ROYW1lcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRpc3BsYXkgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBkZXZlbG9wZXItZnJpZW5kbHkgU3RyaW5nLiBJZiB5b3Ugd2FudCBzb21ldGhpbmcgdXNlZnVsIGZvcgotCSAqIGRpc3BsYXlpbmcgaW4gYSB1c2VyIGludGVyZmFjZSwgdXNlICNkaXNwbGF5U3RyaW5nKCkuCi0JICogSWYgeW91IHdhbnQgdG8gZ2l2ZSBtb3JlIGluZm9ybWF0aW9uIGluIHlvdXIgI3RvU3RyaW5nKCksCi0JICogb3ZlcnJpZGUgI3RvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpLiAKLQkgKiBXaGF0ZXZlciB5b3UgYWRkIHRvIHRoYXQgc3RyaW5nIGJ1ZmZlciB3aWxsIHNob3cgdXAgYmV0d2VlbiB0aGUgcGFyZW50aGVzZXMuCi0JICogQHNlZSBBYnN0cmFjdE1vZGVsI3RvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpCi0JICogQHNlZSAjZGlzcGxheVN0cmluZygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Bc3luY2hyb25vdXNWYWxpZGF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvQXN5bmNocm9ub3VzVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YTA2ZjEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Bc3luY2hyb25vdXNWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZEJvb2xlYW47Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUGx1Z2dhYmxlVmFsaWRhdG9yLkRlbGVnYXRlIGludGVyZmFjZQotICogc2ltcGx5IHNldHMgYSBzaGFyZWQgInZhbGlkYXRlIiBmbGFnIHRvIHRydWUuIFRoaXMgc2hvdWxkIHRyaWdnZXIgYQotICogc2VwYXJhdGUgInZhbGlkYXRpb24iIHRocmVhZCB0byBiZWdpbiB2YWxpZGF0aW5nIHRoZSBhcHByb3ByaWF0ZQotICogYnJhbmNoIG9mIG5vZGVzLgotICovCi1wdWJsaWMgY2xhc3MgQXN5bmNocm9ub3VzVmFsaWRhdG9yCi0JaW1wbGVtZW50cyBQbHVnZ2FibGVWYWxpZGF0b3IuRGVsZWdhdGUKLXsKLQlwcml2YXRlIFN5bmNocm9uaXplZEJvb2xlYW4gdmFsaWRhdGVGbGFnOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdmFsaWRhdG9yIGRlbGVnYXRlIHdpdGggdGhlIHNwZWNpZmllZCBzaGFyZWQKLQkgKiAidmFsaWRhdGUiIGZsYWcuIFRoaXMgZmxhZyBzaG91bGQgYmUgc2hhcmVkIHdpdGgKLQkgKiBhbm90aGVyIHRocmVhZCB0aGF0IHdpbGwgcGVyZm9ybSB0aGUgYWN0dWFsIHZhbGlkYXRpb24uCi0JICovCi0JcHVibGljIEFzeW5jaHJvbm91c1ZhbGlkYXRvcihTeW5jaHJvbml6ZWRCb29sZWFuIHZhbGlkYXRlRmxhZykgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbGlkYXRlRmxhZyA9IHZhbGlkYXRlRmxhZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNoYXJlZCAidmFsaWRhdGUiIGZsYWcgdG8gdHJ1ZSwgdHJpZ2dlcmluZwotCSAqIGFuIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIG9mIHRoZSBhcHByb3ByaWF0ZQotCSAqIGJyYW5jaCBvZiBub2Rlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJdGhpcy52YWxpZGF0ZUZsYWcuc2V0VHJ1ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMudmFsaWRhdGVGbGFnKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvRGVmYXVsdFByb2JsZW0uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvRGVmYXVsdFByb2JsZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhMmYzYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9ub2RlL0RlZmF1bHRQcm9ibGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUHJvYmxlbSBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvYmxlbQotCWltcGxlbWVudHMgUHJvYmxlbQotewotCXByaXZhdGUgZmluYWwgTm9kZSBzb3VyY2U7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWVzc2FnZUtleTsKLQlwcml2YXRlIGZpbmFsIGludCBtZXNzYWdlVHlwZTsKLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHM7Ci0KLQotCURlZmF1bHRQcm9ibGVtKE5vZGUgc291cmNlLCBTdHJpbmcgbWVzc2FnZUtleSwgaW50IG1lc3NhZ2VUeXBlLCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc291cmNlID0gc291cmNlOwotCQl0aGlzLm1lc3NhZ2VLZXkgPSBtZXNzYWdlS2V5OwotCQl0aGlzLm1lc3NhZ2VUeXBlID0gbWVzc2FnZVR5cGU7Ci0JCXRoaXMubWVzc2FnZUFyZ3VtZW50cyA9IG1lc3NhZ2VBcmd1bWVudHM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb2JsZW0gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIE5vZGUgc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5zb3VyY2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBtZXNzYWdlS2V5KCkgewotCQlyZXR1cm4gdGhpcy5tZXNzYWdlS2V5OwotCX0KLQotCXB1YmxpYyBpbnQgbWVzc2FnZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm1lc3NhZ2VUeXBlOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKCkgewotCQlyZXR1cm4gdGhpcy5tZXNzYWdlQXJndW1lbnRzOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFdlIGltcGxlbWVudCAjZXF1YWxzKE9iamVjdCkgYmVjYXVzZSBwcm9ibGVtcyBhcmUgcmVwZWF0ZWRseQotCSAqIHJlLWNhbGN1bGF0ZWQgYW5kIHRoZSByZXN1bHRpbmcgcHJvYmxlbXMgbWVyZ2VkIHdpdGggdGhlIGV4aXN0aW5nCi0JICogc2V0IG9mIHByb2JsZW1zOyBhbmQgd2Ugd2FudCB0byBrZWVwIHRoZSBvcmlnaW5hbCBwcm9ibGVtcyBhbmQKLQkgKiBpZ25vcmUgYW55IGZyZXNobHktZ2VuZXJhdGVkIGR1cGxpY2F0ZXMuCi0JICogQWxzbywgcHJvYmxlbXMgYXJlIG5vdCBzYXZlZCB0byBkaXNrLi4uLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBQcm9ibGVtKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVByb2JsZW0gb3RoZXIgPSAoUHJvYmxlbSkgbzsKLQkJcmV0dXJuIHRoaXMuc291cmNlID09IG90aGVyLnNvdXJjZSgpCi0JCQkJJiYgdGhpcy5tZXNzYWdlS2V5LmVxdWFscyhvdGhlci5tZXNzYWdlS2V5KCkpCi0JCQkJJiYgQXJyYXlzLmVxdWFscyh0aGlzLm1lc3NhZ2VBcmd1bWVudHMsIG90aGVyLm1lc3NhZ2VBcmd1bWVudHMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuc291cmNlLmhhc2hDb2RlKCkgXiB0aGlzLm1lc3NhZ2VLZXkuaGFzaENvZGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm1lc3NhZ2VLZXkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Ob2RlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9ub2RlL05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVhYjIwMC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9ub2RlL05vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgdGhlIG1ldGhvZHMgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkCi0gKiBieSBhbnkgY2xhc3Mgd2hvc2UgaW5zdGFuY2VzIGFyZSB0byBiZSBwYXJ0IG9mIGEgY29udGFpbm1lbnQgaGllcmFyY2h5Ci0gKiB0aGF0IHN1cHBvcnRzIGEgImRpcnR5IiBzdGF0ZSBhbmQgdmFsaWRhdGlvbiAicHJvYmxlbXMiLgotICogCi0gKiBOb3RlOiBNZXRob2RzIG1hcmtlZCAiSU5UUkEtVFJFRSBBUEkiIGFyZSB0eXBpY2FsbHkgb25seSB1c2VkIGJ5Ci0gKiB0aGUgbm9kZXMgdGhlbXNlbHZlcywgYXMgb3Bwb3NlZCB0byBjbGllbnRzIG9mIHRoZSBub2Rlcy4gVGhlc2UKLSAqIG1ldGhvZHMgYXJlIGNhbGxlZCBieSBhIG5vZGUgb24gZWl0aGVyIGl0cyBwYXJlbnQgb3IgaXRzIGNoaWxkcmVuLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5vZGUgZXh0ZW5kcyBNb2RlbCB7Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbm1lbnQgaGllcmFyY2h5IChwYXJlbnQvY2hpbGRyZW4pICoqKioqKioqKioKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIHBhcmVudCBpbiB0aGUgY29udGFpbm1lbnQgaGllcmFyY2h5LgotCSAqIE1vc3Qgbm9kZXMgbXVzdCBoYXZlIGEgcGFyZW50LiBUaGUgcGFyZW50IGlzIGltbXV0YWJsZS4KLQkgKiBAc2VlICNjaGlsZHJlbigpCi0JICovCi0JTm9kZSBnZXRQYXJlbnQoKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIGNoaWxkcmVuLCB3aGljaCBhcmUgYWxzbyBub2Rlcy4KLQkgKiBAc2VlICNnZXRQYXJlbnQoKQotCSAqLwotCUl0ZXJhdG9yPE5vZGU+IGNoaWxkcmVuKCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQST8KLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5tZW50IGhpZXJhcmNoeSdzIHJvb3Qgbm9kZS4KLQkgKiBNb3N0IG5vZGVzIG11c3QgaGF2ZSBhIHJvb3QuCi0JICogQHNlZSAjZ2V0UGFyZW50KCkKLQkgKi8KLQlOb2RlIHJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCi0JICogQnkgZGVmaW5pdGlvbiwgYSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiBpdHNlbGYuCi0JICovCi0JYm9vbGVhbiBpc0Rlc2NlbmRhbnRPZihOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBBZGQgdGhlIG5vZGUncyAicmVmZXJlbmNlcyIsIGFuZCBhbGwgdGhlIG5vZGUncyBkZXNjZW5kYW50cycKLQkgKiAicmVmZXJlbmNlcyIsIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4gIlJlZmVyZW5jZXMiIGFyZQotCSAqIG9iamVjdHMgdGhhdCBhcmUgInJlZmVyZW5jZWQiIGJ5IGFub3RoZXIgb2JqZWN0LCBhcyBvcHBvc2VkCi0JICogdG8gIm93bmVkIiBieSBhbm90aGVyIG9iamVjdC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBvZiBwYXJ0aWN1bGFyIGNvbmNlcm4gdG8gSGFuZGxlcywgc2luY2UgbW9zdAotCSAqIChob3BlZnVsbHkgYWxsKSAicmVmZXJlbmNlcyIgYXJlIGhlbGQgYnkgSGFuZGxlcy4KLQkgKiBAc2VlIFJlZmVyZW5jZQotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQl2b2lkIGFkZEJyYW5jaFJlZmVyZW5jZXNUbyhDb2xsZWN0aW9uPE5vZGUuUmVmZXJlbmNlPiBicmFuY2hSZWZlcmVuY2VzKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIEFkZCBhbGwgdGhlIG5vZGVzIGluIHRoZSBvYmplY3QncyBicmFuY2ggb2YgdGhlIHRyZWUsCi0JICogaW5jbHVkaW5nIHRoZSBub2RlIGl0c2VsZiwgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIE9ubHkgcmVhbGx5IHVzZWQgZm9yIHRlc3RpbmcgYW5kIGRlYnVnZ2luZy4KLQkgKi8KLQl2b2lkIGFkZEFsbE5vZGVzVG8oQ29sbGVjdGlvbjxOb2RlPiBub2Rlcyk7Ci0KLQotCS8vICoqKioqKioqKiogbW9kZWwgc3luY2hyb25pemF0aW9uIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBUaGlzIGlzIGEgZ2VuZXJhbCBub3RpZmljYXRpb24gdGhhdCB0aGUgc3BlY2lmaWVkIG5vZGUgaGFzIGJlZW4KLQkgKiByZW1vdmVkIGZyb20gdGhlIHRyZWUuIFRoZSBub2RlIHJlY2VpdmluZyB0aGlzIG5vdGlmaWNhdGlvbgotCSAqIHNob3VsZCBwZXJmb3JtIGFueSBuZWNlc3NhcnkgdXBkYXRlcyB0byByZW1haW4gaW4gc3luY2gKLQkgKiB3aXRoIHRoZSB0cmVlIChlLmcuIGNsZWFyaW5nIG91dCBvciByZXBsYWNpbmcgYW55IHJlZmVyZW5jZXMKLQkgKiB0byB0aGUgcmVtb3ZlZCBub2RlIG9yIGFueSBvZiB0aGUgcmVtb3ZlZCBub2RlJ3MgZGVzY2VuZGFudHMpLgotCSAqIEBzZWUgI2lzRGVzY2VuZGFudE9mKE5vZGUpCi0JICovCi0Jdm9pZCBub2RlUmVtb3ZlZChOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBUaGlzIGlzIGEgZ2VuZXJhbCBub3RpZmljYXRpb24gdGhhdCB0aGUgc3BlY2lmaWVkIG5vZGUgaGFzIGJlZW4KLQkgKiByZW5hbWVkLiBUaGUgbm9kZSByZWNlaXZpbmcgdGhpcyBub3RpZmljYXRpb24gc2hvdWxkIG1hcmsgaXRzCi0JICogYnJhbmNoIGRpcnR5IGlmIG5lY2Vzc2FyeSAoaS5lLiBpdCByZWZlcmVuY2VzIHRoZSByZW5hbWVkIG5vZGUKLQkgKiBvciBvbmUgb2YgaXRzIGRlc2NlbmRhbnRzKS4gVGhpcyBtZXRob2QgaXMgb2YgcGFydGljdWxhciBjb25jZXJuCi0JICogdG8gSGFuZGxlcy4KLQkgKiBAc2VlICNpc0Rlc2NlbmRhbnRPZihOb2RlKQotCSAqLwotCXZvaWQgbm9kZVJlbmFtZWQoTm9kZSBub2RlKTsKLQkKLQotCS8vICoqKioqKioqKiogZGlydHkgZmxhZyBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGFueSBwZXJzaXN0ZW50IGFzcGVjdHMgb2YgdGhlIG5vZGUsCi0JICogb3IgYW55IG9mIGl0cyBkZXNjZW5kYW50cywgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBub2RlIGFuZAotCSAqIGl0cyBkZXNjZW5kYW50cyB3ZXJlIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKi8KLQlib29sZWFuIGlzRGlydHlCcmFuY2goKTsKLQkJU3RyaW5nIERJUlRZX0JSQU5DSF9QUk9QRVJUWSA9ICJkaXJ0eUJyYW5jaCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogTWFyayB0aGUgbm9kZSBhbmQgaXRzIHBhcmVudCBhcyBkaXJ0eSBicmFuY2hlcy4KLQkgKiBUaGlzIG1lc3NhZ2UgaXMgcHJvcGFnYXRlZCB1cCB0aGUgY29udGFpbm1lbnQKLQkgKiB0cmVlIHdoZW4gYSBwYXJ0aWN1bGFyIG5vZGUgYmVjb21lcyBkaXJ0eS4KLQkgKi8KLQl2b2lkIG1hcmtCcmFuY2hEaXJ0eSgpOwotCi0JLyoqCi0JICogTWFyayB0aGUgbm9kZSBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cyBhcyBkaXJ0eS4KLQkgKiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgc2F2ZSBsb2NhdGlvbiBvZiBzb21lCi0JICogdG9wLWxldmVsIG5vZGUgaXMgY2hhbmdlZCBhbmQgdGhlIGVudGlyZQotCSAqIGNvbnRhaW5tZW50IHRyZWUgbXVzdCBiZSBtYXJrZWQgZGlydHkgc28gaXQKLQkgKiB3aWxsIGJlIHdyaXR0ZW4gb3V0LgotCSAqLwotCXZvaWQgbWFya0VudGlyZUJyYW5jaERpcnR5KCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIEEgY2hpbGQgbm9kZSdzIGJyYW5jaCBoYXMgYmVlbiBtYXJrZWQgY2xlYW4uIElmIHRoZSBub2RlCi0JICogaXRzZWxmIGlzIGNsZWFuIGFuZCBpZiBhbGwgb2YgaXRzIGNoaWxkcmVuIGFyZSBhbHNvIGNsZWFuLCB0aGUKLQkgKiBub2RlJ3MgYnJhbmNoIGNhbiBiZSBtYXJrZWQgY2xlYW4uIFRoZW4sIGlmIHRoZSBub2RlJ3MKLQkgKiBicmFuY2ggaXMgY2xlYW4sIHRoZSBub2RlIHdpbGwgbm90aWZ5IGl0cyBwYXJlbnQgdGhhdCBpdCBtaWdodAotCSAqIGJlIGNsZWFuIGFsc28uIFRoaXMgbWVzc2FnZSBpcyBwcm9wYWdhdGVkIHVwIHRoZSBjb250YWlubWVudAotCSAqIHRyZWUgd2hlbiBhIHBhcnRpY3VsYXIgbm9kZSBiZWNvbWVzIGNsZWFuLgotCSAqLwotCXZvaWQgbWFya0JyYW5jaENsZWFuSWZQb3NzaWJsZSgpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBNYXJrIHRoZSBub2RlIGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzIGFzIGNsZWFuLgotCSAqIFR5cGljYWxseSB1c2VkIHdoZW4gdGhlIG5vZGUgaGFzIGp1c3QgYmVlbgotCSAqIHJlYWQgaW4gb3Igd3JpdHRlbiBvdXQuCi0JICogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5OyBpdCBpcyBub3QgZm9yCi0JICogY2xpZW50IHVzZS4KLQkgKiBOb3QgdGhlIGJlc3Qgb2YgbWV0aG9kIG5hbWVzLi4uLiA6LSgKLQkgKi8KLQl2b2lkIGNhc2NhZGVNYXJrRW50aXJlQnJhbmNoQ2xlYW4oKTsKLQotCi0JLy8gKioqKioqKioqKiBwcm9ibGVtcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIFJldHVybiBhIHZhbGlkYXRvciB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuZXZlciBhCi0JICogInZhbGlkYXRlZCIgYXNwZWN0IG9mIHRoZSBub2RlIHRyZWUgY2hhbmdlcy4KLQkgKiBUeXBpY2FsbHkgb25seSB0aGUgcm9vdCBub2RlIGRpcmVjdGx5IGhvbGRzIGEgdmFsaWRhdG9yLgotCSAqLwotCVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKTsKLQotCS8qKgotCSAqIFNldCBhIHZhbGlkYXRvciB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuZXZlciBhCi0JICogInZhbGlkYXRlZCIgYXNwZWN0IG9mIHRoZSBub2RlIHRyZWUgY2hhbmdlcy4KLQkgKiBUeXBpY2FsbHkgb25seSB0aGUgcm9vdCBub2RlIGRpcmVjdGx5IGhvbGRzIGEgdmFsaWRhdG9yLgotCSAqLwotCXZvaWQgc2V0VmFsaWRhdG9yKFZhbGlkYXRvciB2YWxpZGF0b3IpOwotCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50cy4KLQkgKiBUaGlzIGlzIGFuIGV4cGxpY2l0IHJlcXVlc3QgaW52b2tlZCBieSBhIGNsaWVudDsgYW5kIGl0IHdpbGwKLQkgKiB0eXBpY2FsbHkgYmUgZm9sbG93ZWQgYnkgYSBjYWxsIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0JICogCSNicmFuY2hQcm9ibGVtcygpCi0JICogCSNoYXNCcmFuY2hQcm9ibGVtcygpCi0JICogV2hldGhlciB0aGUgbm9kZSBtYWludGFpbnMgaXRzIHByb2JsZW1zIG9uIHRoZSBmbHkKLQkgKiBvciB3YWl0cyB1bnRpbCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBpbXBsZW1lbnRhdGlvbi4KLQkgKiBAc2VlIFByb2JsZW0KLQkgKi8KLQl2b2lkIHZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIFZhbGlkYXRlIHRoZSBub2RlIGFuZCBhbGwgb2YgaXRzIGRlc2NlbmRhbnRzLAotCSAqIGFuZCB1cGRhdGUgdGhlaXIgc2V0cyBvZiAiYnJhbmNoIiBwcm9ibGVtcy4KLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29sbGVjdGlvbiBvZiAiYnJhbmNoIiBwcm9ibGVtcyBoYXMgY2hhbmdlZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk7IGl0IGlzIG5vdCBmb3IKLQkgKiBjbGllbnQgdXNlLgotCSAqLwotCWJvb2xlYW4gdmFsaWRhdGVCcmFuY2hJbnRlcm5hbCgpOwotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgbm9kZSdzIHByb2JsZW1zIGFsb25nIHdpdGggYWxsIHRoZQotCSAqIG5vZGUncyBkZXNjZW5kYW50cycgcHJvYmxlbXMuCi0JICovCi0JTGlzdEl0ZXJhdG9yPFByb2JsZW0+IGJyYW5jaFByb2JsZW1zKCk7Ci0JCVN0cmluZyBCUkFOQ0hfUFJPQkxFTVNfTElTVCA9ICJicmFuY2hQcm9ibGVtcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiBhbGwgdGhlIG5vZGUncyBwcm9ibGVtcyBhbG9uZyB3aXRoIGFsbCB0aGUKLQkgKiBub2RlJ3MgZGVzY2VuZGFudHMnIHByb2JsZW1zLgotCSAqLwotCWludCBicmFuY2hQcm9ibGVtc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIG9yIGFueSBvZiBpdHMgZGVzY2VuZGFudHMgaGF2ZSBwcm9ibGVtcy4KLQkgKi8KLQlib29sZWFuIGhhc0JyYW5jaFByb2JsZW1zKCk7Ci0JCVN0cmluZyBIQVNfQlJBTkNIX1BST0JMRU1TX1BST1BFUlRZID0gImhhc0JyYW5jaFByb2JsZW1zIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgY29udGFpbnMgdGhlIHNwZWNpZmllZCBicmFuY2ggcHJvYmxlbS4KLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zQnJhbmNoUHJvYmxlbShQcm9ibGVtIHByb2JsZW0pOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBTb21ldGhpbmcgY2hhbmdlZCwgcmVidWlsZCB0aGUgbm9kZSdzIGNvbGxlY3Rpb24gb2YgYnJhbmNoIHByb2JsZW1zLgotCSAqLwotCXZvaWQgcmVidWlsZEJyYW5jaFByb2JsZW1zKCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIEFkZCB0aGUgbm9kZSdzIHByb2JsZW1zLCBhbmQgYWxsIHRoZSBub2RlJ3MgZGVzY2VuZGFudHMnCi0JICogcHJvYmxlbXMsIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKiBBIGNhbGwgdG8gdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGltbWVkaWF0ZWx5IHByZWNlZGVkIGJ5IGEgY2FsbCB0bwotCSAqICN2YWxpZGF0ZUJyYW5jaCgpIG9yIGFsbCBvZiB0aGUgcHJvYmxlbXMgbWlnaHQgbm90IGJlCi0JICogYWRkZWQgdG8gdGhlIGxpc3QuCi0JICogQHNlZSBQcm9ibGVtCi0JICovCi0Jdm9pZCBhZGRCcmFuY2hQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gYnJhbmNoUHJvYmxlbXMpOwotCi0JLyoqCi0JICogQ2xlYXIgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBhbmQgdGhlICJicmFuY2giCi0JICogcHJvYmxlbXMgb2YgYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4KLQkgKi8KLQl2b2lkIGNsZWFyQWxsQnJhbmNoUHJvYmxlbXMoKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogQ2xlYXIgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBhbmQgdGhlICJicmFuY2giCi0JICogcHJvYmxlbXMgb2YgYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4KLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29sbGVjdGlvbiBvZiAiYnJhbmNoIiBwcm9ibGVtcyBoYXMgY2hhbmdlZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk7IGl0IGlzIG5vdCBmb3IKLQkgKiBjbGllbnQgdXNlLgotCSAqLwotCWJvb2xlYW4gY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCk7Ci0KLQotCS8vICoqKioqKioqKiogY29tbWVudCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVzZXIgY29tbWVudCBjb25jZXJuaW5nIHRoZSBub2RlLgotCSAqLwotCVN0cmluZyBjb21tZW50KCk7Ci0JCVN0cmluZyBDT01NRU5UX1BST1BFUlRZID0gImNvbW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXQgdGhlIHVzZXIgY29tbWVudCBjb25jZXJuaW5nIHRoZSBub2RlLgotCSAqLwotCXZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCk7Ci0KLQotCS8vICoqKioqKioqKiogZGlzcGxheWluZy9zb3J0aW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwsIHN1aXRhYmxlIGZvciBzb3J0aW5nLgotCSAqLwotCVN0cmluZyBkaXNwbGF5U3RyaW5nKCk7Ci0KLQotCS8vICoqKioqKioqKiogc3ViLWludGVyZmFjZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogU2ltcGxlIGludGVyZmFjZSBkZWZpbmluZyBhICJyZWZlcmVuY2UiIGJldHdlZW4gdHdvIG5vZGVzLgotCSAqIEBzZWUgTm9kZSNhZGRCcmFuY2hSZWZlcmVuY2VzVG8oamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JaW50ZXJmYWNlIFJlZmVyZW5jZSB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgInNvdXJjZSIgbm9kZSBvZiB0aGUgcmVmZXJlbmNlLCBpLmUuIHRoZSBub2RlIHRoYXQKLQkJICogcmVmZXJlbmNlcyB0aGUgInRhcmdldCIgbm9kZS4KLQkJICovCi0JCU5vZGUgc291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgInRhcmdldCIgbm9kZSBvZiB0aGUgcmVmZXJlbmNlLCBpLmUuIHRoZSBub2RlIHRoYXQKLQkJICogaXMgcmVmZXJlbmNlZCBieSB0aGUgInNvdXJjZSIgbm9kZS4KLQkJICovCi0JCU5vZGUgdGFyZ2V0KCk7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIEEgdmFsaWRhdG9yIHdpbGwgdmFsaWRhdGUgYSBub2RlIGFzIGFwcHJvcHJpYXRlLgotCSAqIFR5cGljYWxseSB0aGUgdmFsaWRhdGlvbiB3aWxsCi0JICogCS0gb2NjdXIgd2hlbmV2ZXIgYSBub2RlIGhhcyBjaGFuZ2VkCi0JICogCS0gZW5jb21wYXNzIHRoZSBlbnRpcmUgdHJlZSBjb250YWluaW5nIHRoZSBub2RlCi0JICogCS0gZXhlY3V0ZSBhc3luY2hyb25vdXNseQotCSAqLwotCWludGVyZmFjZSBWYWxpZGF0b3IgewotCi0JCS8qKgotCQkgKiBBICJzaWduaWZpY2FudCIgYXNwZWN0IGhhcyBjaGFuZ2VkOwotCQkgKiB2YWxpZGF0ZSB0aGUgbm9kZSBhcyBhcHByb3ByaWF0ZQotCQkgKi8KLQkJdm9pZCB2YWxpZGF0ZSgpOwotCi0JCS8qKgotCQkgKiBTdG9wIGFsbCB2YWxpZGF0aW9uIG9mIHRoZSBub2RlIHVudGlsICNyZXN1bWUoKSBpcyBjYWxsZWQuCi0JCSAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgYW55IGxvbmctcnVubmluZwotCQkgKiBhY3Rpb24gdGhhdCB0cmlnZ2VycyBudW1lcm91cyBjaGFuZ2VzIHRvIHRoZSBub2RlLiBCZSBzdXJlIHRvCi0JCSAqIG1hdGNoIGEgY2FsbCB0byB0aGlzIG1ldGhvZCB3aXRoIGEgY29ycmVzcG9uZGluZyBjYWxsIHRvCi0JCSAqICNyZXN1bWUoKS4KLQkJICovCi0JCXZvaWQgcGF1c2UoKTsKLQotCQkvKioKLQkJICogUmVzdW1lIHZhbGlkYXRpb24gb2YgdGhlIG5vZGUuIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlCi0JCSAqIGNhbGxlZCBhZnRlciBhIG1hdGNoaW5nIGNhbGwgdG8gI3BhdXNlKCkuCi0JCSAqLwotCQl2b2lkIHJlc3VtZSgpOwotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGhlbHBlciBpbXBsZW1lbnRhdGlvbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBSZWZlcmVuY2UgaW50ZXJmYWNlCi0JICogZGVmaW5lZCBhYm92ZS4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgU2ltcGxlUmVmZXJlbmNlIGltcGxlbWVudHMgUmVmZXJlbmNlIHsKLQkJcHJpdmF0ZSBOb2RlIHNvdXJjZTsKLQkJcHJpdmF0ZSBOb2RlIHRhcmdldDsKLQkJcHVibGljIFNpbXBsZVJlZmVyZW5jZShOb2RlIHNvdXJjZSwgTm9kZSB0YXJnZXQpIHsKLQkJCXN1cGVyKCk7Ci0JCQlpZiAoc291cmNlID09IG51bGwgfHwgdGFyZ2V0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JCX0KLQkJcHVibGljIE5vZGUgc291cmNlKCkgewotCQkJcmV0dXJuIHRoaXMuc291cmNlOwotCQl9Ci0JCXB1YmxpYyBOb2RlIHRhcmdldCgpIHsKLQkJCXJldHVybiB0aGlzLnRhcmdldDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuc291cmNlICsgIiA9PiAiICsgdGhpcy50YXJnZXQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgdmFsaWRhdG9yIGRvZXMgbm90aGluZyB0byB2YWxpZGF0ZSB0aGUgbm9kZS4KLQkgKi8KLQlWYWxpZGF0b3IgTlVMTF9WQUxJREFUT1IgPQotCQluZXcgUGx1Z2dhYmxlVmFsaWRhdG9yKFBsdWdnYWJsZVZhbGlkYXRvci5EZWxlZ2F0ZS5OdWxsLmluc3RhbmNlKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIk5vZGUuTlVMTF9WQUxJREFUT1IiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvUGx1Z2dhYmxlVmFsaWRhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1BsdWdnYWJsZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGYyN2QyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvUGx1Z2dhYmxlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkQm9vbGVhbjsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBWYWxpZGF0b3IgaW50ZXJmYWNlIGltcGxlbWVudHMgdGhlCi0gKiBwYXVzZS9yZXN1bWUgcG9ydGlvbiBvZiB0aGUgcHJvdG9jb2wsIGJ1dCBkZWxlZ2F0ZXMgdGhlIGFjdHVhbAotICogdmFsaWRhdGlvbiB0byBhICJwbHVnZ2FibGUiIGRlbGVnYXRlLgotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2dhYmxlVmFsaWRhdG9yCi0JaW1wbGVtZW50cyBOb2RlLlZhbGlkYXRvcgotewotCXByaXZhdGUgYm9vbGVhbiBwYXVzZTsKLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVPblJlc3VtZTsKLQlwcml2YXRlIGZpbmFsIERlbGVnYXRlIGRlbGVnYXRlOwotCi0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBmYWN0b3J5IG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUuVmFsaWRhdG9yIGJ1aWxkQXN5bmNocm9ub3VzVmFsaWRhdG9yKFN5bmNocm9uaXplZEJvb2xlYW4gdmFsaWRhdGVGbGFnKSB7Ci0JCXJldHVybiBuZXcgUGx1Z2dhYmxlVmFsaWRhdG9yKG5ldyBBc3luY2hyb25vdXNWYWxpZGF0b3IodmFsaWRhdGVGbGFnKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgZmFjdG9yeSBtZXRob2QuCi0JICovCi0JcHVibGljIHN0YXRpYyBOb2RlLlZhbGlkYXRvciBidWlsZFN5bmNocm9ub3VzVmFsaWRhdG9yKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbmV3IFBsdWdnYWJsZVZhbGlkYXRvcihuZXcgU3luY2hyb25vdXNWYWxpZGF0b3Iobm9kZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHZhbGlkYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsZWdhdGUuCi0JICovCi0JcHVibGljIFBsdWdnYWJsZVZhbGlkYXRvcihEZWxlZ2F0ZSBkZWxlZ2F0ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnBhdXNlID0gZmFsc2U7Ci0JCXRoaXMudmFsaWRhdGVPblJlc3VtZSA9IGZhbHNlOwotCQl0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHZhbGlkYXRlKCkgewotCQlpZiAodGhpcy5wYXVzZSkgewotCQkJdGhpcy52YWxpZGF0ZU9uUmVzdW1lID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZGVsZWdhdGUudmFsaWRhdGUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwYXVzZSgpIHsKLQkJaWYgKHRoaXMucGF1c2UpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFscmVhZHkgcGF1c2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLnBhdXNlID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzdW1lKCkgewotCQlpZiAoICEgdGhpcy5wYXVzZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IHBhdXNlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5wYXVzZSA9IGZhbHNlOwotCQkvLyB2YWxpZGF0ZSBhbnkgY2hhbmdlcyB0aGF0IG9jY3VycmVkIHdoaWxlIHRoZSB2YWxpZGF0aW9uIHdhcyBwYXVzZWQKLQkJaWYgKHRoaXMudmFsaWRhdGVPblJlc3VtZSkgewotCQkJdGhpcy52YWxpZGF0ZU9uUmVzdW1lID0gZmFsc2U7Ci0JCQl0aGlzLmRlbGVnYXRlLnZhbGlkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmRlbGVnYXRlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYW55IGRlbGVnYXRlcyBvZiBhIHBsdWdnYWJsZSB2YWxpZGF0b3IuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBEZWxlZ2F0ZSB7Ci0KLQkJLyoqCi0JCSAqIFRoZSB2YWxpZGF0b3IgaXMgbm90ICJwYXVzZWQiIC0gcGVyZm9ybSB0aGUgYXBwcm9wcmlhdGUgdmFsaWRhdGlvbi4KLQkJICovCi0JCXZvaWQgdmFsaWRhdGUoKTsKLQotCi0JCS8qKgotCQkgKiBUaGlzIGRlbGVnYXRlIGRvZXMgbm90aGluZy4KLQkJICovCi0JCWZpbmFsIGNsYXNzIE51bGwKLQkJCWltcGxlbWVudHMgRGVsZWdhdGUsIFNlcmlhbGl6YWJsZQotCQl7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIERlbGVnYXRlIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJCXB1YmxpYyBzdGF0aWMgRGVsZWdhdGUgaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCQl9Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Qcm9ibGVtLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1Byb2JsZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNiNDc3OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1Byb2JsZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGU7Ci0KLS8qKgotICogRGVmaW5lIGFuIGludGVyZmFjZSBkZXNjcmliaW5nIHRoZSBwcm9ibGVtcyBhc3NvY2lhdGVkIHdpdGggYSBub2RlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2JsZW0gewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBub2RlIG1vc3QgY2xvc2VseSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2JsZW0uCi0JICovCi0JTm9kZSBzb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGtleSB0aGF0IGNhbiBiZSB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBwcm9ibGVtJ3MgbWVzc2FnZS4KLQkgKi8KLQlTdHJpbmcgbWVzc2FnZUtleSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcmd1bWVudHMgYXNzb2NpYXRlIHdpdGggdGhlIHByb2JsZW0ncyBtZXNzYWdlLgotCSAqLwotCU9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGlkZW50aWZpZWQgcHJvYmxlbSdzIG1lc3NhZ2UKLQkgKi8KLQlpbnQgbWVzc2FnZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwcm9ibGVtIGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIEl0IGlzIGVxdWFsIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGEgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0JICogUHJvYmxlbSBpbnRlcmZhY2UgYW5kIGl0cyBzb3VyY2UsIG1lc3NhZ2Uga2V5LCBhbmQgbWVzc2FnZQotCSAqIGFyZ3VtZW50cyBhcmUgYWxsIGVxdWFsIHRvIHRoaXMgcHJvYmxlbSdzLgotCSAqLwotCWJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvYmxlbSdzIGhhc2ggY29kZSwgd2hpY2ggc2hvdWxkIGNhbGN1bGF0ZWQgYXMgYW4KLQkgKiBYT1Igb2YgdGhlIHNvdXJjZSdzIGhhc2ggY29kZSBhbmQgdGhlIG1lc3NhZ2Uga2V5J3MgaGFzaCBjb2RlLgotCSAqLwotCWludCBoYXNoQ29kZSgpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1N5bmNocm9ub3VzVmFsaWRhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1N5bmNocm9ub3VzVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNzY2ODUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9TeW5jaHJvbm91c1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBQbHVnZ2FibGVWYWxpZGF0b3IuRGVsZWdhdGUgaW50ZXJmYWNlCi0gKiB3aWxsIHZhbGlkYXRlIHRoZSBub2RlIGltbWVkaWF0ZWx5LgotICogCi0gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGluIGEgc2luZ2xlIHRocmVhZCBvciBnZW5lcmF0aW5nCi0gKiBwcm9ibGVtIHJlcG9ydHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbm91c1ZhbGlkYXRvcgotCWltcGxlbWVudHMgUGx1Z2dhYmxlVmFsaWRhdG9yLkRlbGVnYXRlCi17Ci0JcHJpdmF0ZSBmaW5hbCBOb2RlIG5vZGU7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB2YWxpZGF0b3IgdGhhdCB3aWxsIGltbWVkaWF0ZWx5IHZhbGlkYXRlIHRoZQotCSAqIHNwZWNpZmllZCBub2RlLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbm91c1ZhbGlkYXRvcihOb2RlIG5vZGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5ub2RlID0gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJdGhpcy5ub2RlLnZhbGlkYXRlQnJhbmNoKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5ub2RlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL0NhY2hpbmdDb21ib0JveE1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9DYWNoaW5nQ29tYm9Cb3hNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDY0MTJlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL0NhY2hpbmdDb21ib0JveE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkNvbWJvQm94TW9kZWw7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgYWxsb3dzIGEgY2xpZW50IHRvIGJldHRlciBjb250cm9sIHRoZSBwZXJmb3JtYW5jZSBvZgotICogYSBjb21ibyBib3ggbW9kZWwgYnkgYWxsb3dpbmcgdGhlIGNsaWVudCB0byBzcGVjaWZ5IHdoZW4gaXQgaXMKLSAqIGFjY2VwdGFibGUgZm9yIHRoZSBtb2RlbCB0byAiY2FjaGUiIGFuZCAidW5jYWNoZSIgaXRzIGxpc3Qgb2YgZWxlbWVudHMuCi0gKiBUaGUgbW9kZWwgbWF5IGlnbm9yZSB0aGVzZSBoaW50cyBpZiBhcHByb3ByaWF0ZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBDYWNoaW5nQ29tYm9Cb3hNb2RlbCBleHRlbmRzIENvbWJvQm94TW9kZWwgewotICAgIAotICAgIC8qKgotICAgICAqIENhY2hlIHRoZSBjb21ib0JveE1vZGVsIExpc3QuICBJZiB5b3UgY2FsbCB0aGlzLCB5b3UKLSAgICAgKiBtdXN0IG1ha2Ugc3VyZSB0byBjYWxsIHVuY2FjaGVMaXN0KCkgYXMgd2VsbC4gIE90aGVyd2lzZQotICAgICAqIHN0YWxlIGRhdGEgd2lsbCBiZSBpbiB0aGUgQ29tYm9Cb3ggdW50aWwgY2FjaGVMaXN0KCkgaXMgCi0gICAgICogY2FsbGVkIGFnYWluIG9yIHVuY2FjaGVMaXN0KCkgaXMgY2FsbGVkLgotICAgICAqLwotICAgIHZvaWQgY2FjaGVMaXN0KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2xlYXIgdGhlIGNhY2hlZCBsaXN0LiAgTmV4dCB0aW1lIHRoZSBsaXN0IGlzIG5lZWRlZCBpdCB3aWxsCi0gICAgICogYmUgYnVpbHQgd2hlbiBpdCBpcyBub3QgY2FjaGVkLgotICAgICAqLwotICAgIHZvaWQgdW5jYWNoZUxpc3QoKTsKLQotICAgIC8qKgotICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgbGlzdCBpcyBhbHJlYWR5IGNhY2hlZC4gIFRoaXMgY2FuIGJlIHVzZWQgZm9yIAotICAgICAqIE1vdXNlRXZlbnRzLCBzaW5jZSB0aGV5IGFyZSBub3QgdGVycmlibHkgcHJlZGljdGFibGUuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0NhY2hlZCgpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9DaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9DaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YTJiMmUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQ2hlY2tCb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRhYmxlOwotaW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnN3aW5nLlVJTWFuYWdlcjsKLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZy5UYWJsZUNlbGxFZGl0b3JBZGFwdGVyLkltbWVkaWF0ZUVkaXRMaXN0ZW5lcjsKLQotLyoqCi0gKiBNYWtlIHRoZSBjZWxsIGxvb2sgbGlrZSBhIGNoZWNrIGJveC4KLSAqLwotcHVibGljIGNsYXNzIENoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIgaW1wbGVtZW50cyBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLlJlbmRlcmVyIHsKLQotCS8qKiB0aGUgY29tcG9uZW50IHVzZWQgdG8gcGFpbnQgdGhlIGNlbGwgKi8KLQlwcml2YXRlIGZpbmFsIEpDaGVja0JveCBjaGVja0JveDsKLQkKLQkvKiogdGhlIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkIG9uIGFuIGltbWVkaWF0ZSBlZGl0ICovCi0JcHJvdGVjdGVkIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuSW1tZWRpYXRlRWRpdExpc3RlbmVyIGltbWVkaWF0ZUVkaXRMaXN0ZW5lcjsKLQotCS8qKiAibm9ybWFsIiBib3JkZXIgLSBhc3N1bWUgdGhlIGRlZmF1bHQgdGFibGUgImZvY3VzIiBib3JkZXIgaXMgMSBwaXhlbCB0aGljayAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJvcmRlciBOT19GT0NVU19CT1JERVIgPSBCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDEsIDEsIDEsIDEpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHdpdGggbm8gbGFiZWwgb3IgaWNvbi4KLQkgKi8KLQlwdWJsaWMgQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlcigpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jaGVja0JveCA9IHRoaXMuYnVpbGRDaGVja0JveCgpOwotCQkvLyBieSBkZWZhdWx0LCBjaGVjayBib3hlcyBkbyBub3QgcGFpbnQgdGhlaXIgYm9yZGVycwotCQl0aGlzLmNoZWNrQm94LnNldEJvcmRlclBhaW50ZWQodHJ1ZSk7Ci0JCS8vIHRoaXMgc2V0dGluZyBpcyByZWNvbW1lbmRlZCBmb3IgY2hlY2sgYm94ZXMgaW5zaWRlIG9mIHRyZWVzIGFuZCB0YWJsZXMKLQkJdGhpcy5jaGVja0JveC5zZXRCb3JkZXJQYWludGVkRmxhdCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0IGFuZCBpY29uLAotCSAqIGVpdGhlciBvZiB3aGljaCBtYXkgYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlcihTdHJpbmcgdGV4dCwgSWNvbiBpY29uKSB7Ci0JCXRoaXMoKTsKLQkJdGhpcy5zZXRUZXh0KHRleHQpOwotCQl0aGlzLnNldEljb24oaWNvbik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCByZW5kZXJlciB3aXRoIHRoZSBzcGVjaWZpZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlcihTdHJpbmcgdGV4dCkgewotCQl0aGlzKHRleHQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGljb24uCi0JICovCi0JcHVibGljIENoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIoSWNvbiBpY29uKSB7Ci0JCXRoaXMobnVsbCwgaWNvbik7Ci0JfQotCi0JcHJvdGVjdGVkIEpDaGVja0JveCBidWlsZENoZWNrQm94KCkgewotCQlKQ2hlY2tCb3ggY2IgPSBuZXcgSkNoZWNrQm94KCk7Ci0JCWNiLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRBY3Rpb25MaXN0ZW5lcigpKTsKLQkJcmV0dXJuIGNiOwotCX0KLQkKLQlwcml2YXRlIEFjdGlvbkxpc3RlbmVyIGJ1aWxkQWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlci50aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lci5pbW1lZGlhdGVFZGl0KCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUYWJsZUNlbGxSZW5kZXJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgQ29tcG9uZW50IGdldFRhYmxlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KEpUYWJsZSB0YWJsZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JICAgIHRoaXMuY2hlY2tCb3guc2V0SG9yaXpvbnRhbEFsaWdubWVudChTd2luZ0NvbnN0YW50cy5DRU5URVIpOwotCQl0aGlzLmNoZWNrQm94LnNldENvbXBvbmVudE9yaWVudGF0aW9uKHRhYmxlLmdldENvbXBvbmVudE9yaWVudGF0aW9uKCkpOwotCQl0aGlzLmNoZWNrQm94LnNldEZvbnQodGFibGUuZ2V0Rm9udCgpKTsKLQkJdGhpcy5jaGVja0JveC5zZXRFbmFibGVkKHRhYmxlLmlzRW5hYmxlZCgpKTsKLQotCQl0aGlzLmNoZWNrQm94LnNldEZvcmVncm91bmQodGhpcy5mb3JlZ3JvdW5kQ29sb3IodGFibGUsIHZhbHVlLCBzZWxlY3RlZCwgaGFzRm9jdXMsIHJvdywgY29sdW1uKSk7Ci0JCXRoaXMuY2hlY2tCb3guc2V0QmFja2dyb3VuZCh0aGlzLmJhY2tncm91bmRDb2xvcih0YWJsZSwgdmFsdWUsIHNlbGVjdGVkLCBoYXNGb2N1cywgcm93LCBjb2x1bW4pKTsKLQkJLy8gb25jZSB0aGUgY29sb3JzIGFyZSBzZXQsIGNhbGN1bGF0ZSBvcGFxdWUgc2V0dGluZwotCQl0aGlzLmNoZWNrQm94LnNldE9wYXF1ZSh0aGlzLmNlbGxJc09wYXF1ZUluKHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIGhhc0ZvY3VzLCByb3csIGNvbHVtbikpOwotCQl0aGlzLmNoZWNrQm94LnNldEJvcmRlcih0aGlzLmJvcmRlcih0YWJsZSwgdmFsdWUsIHNlbGVjdGVkLCBoYXNGb2N1cywgcm93LCBjb2x1bW4pKTsKLQotCQl0aGlzLnNldFZhbHVlKHZhbHVlKTsKLQkJcmV0dXJuIHRoaXMuY2hlY2tCb3g7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgZm9yZWdyb3VuZCBjb2xvci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sb3IgZm9yZWdyb3VuZENvbG9yKEpUYWJsZSB0YWJsZSwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBoYXNGb2N1cywgaW50IHJvdywgaW50IGNvbHVtbikgewotCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCWlmIChoYXNGb2N1cyAmJiB0YWJsZS5pc0NlbGxFZGl0YWJsZShyb3csIGNvbHVtbikpIHsKLQkJCQlyZXR1cm4gVUlNYW5hZ2VyLmdldENvbG9yKCJUYWJsZS5mb2N1c0NlbGxGb3JlZ3JvdW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiB0YWJsZS5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCk7Ci0JCX0KLQkJcmV0dXJuIHRhYmxlLmdldEZvcmVncm91bmQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNlbGwncyBiYWNrZ3JvdW5kIGNvbG9yLgotCSAqLwotCXByb3RlY3RlZCBDb2xvciBiYWNrZ3JvdW5kQ29sb3IoSlRhYmxlIHRhYmxlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJaWYgKGhhc0ZvY3VzICYmIHRhYmxlLmlzQ2VsbEVkaXRhYmxlKHJvdywgY29sdW1uKSkgewotCQkJCXJldHVybiBVSU1hbmFnZXIuZ2V0Q29sb3IoIlRhYmxlLmZvY3VzQ2VsbEJhY2tncm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIHRhYmxlLmdldFNlbGVjdGlvbkJhY2tncm91bmQoKTsKLQkJfQotCQlyZXR1cm4gdGFibGUuZ2V0QmFja2dyb3VuZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGJvcmRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQm9yZGVyIGJvcmRlcihAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSlRhYmxlIHRhYmxlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgT2JqZWN0IHZhbHVlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBoYXNGb2N1cywgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCByb3csIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBoYXNGb2N1cyA/ICBVSU1hbmFnZXIuZ2V0Qm9yZGVyKCJUYWJsZS5mb2N1c0NlbGxIaWdobGlnaHRCb3JkZXIiKSA6IE5PX0ZPQ1VTX0JPUkRFUjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjZWxsIHNob3VsZCBiZSBvcGFxdWUgaW4gdGhlIHRhYmxlLgotCSAqIElmIHRoZSBjZWxsJ3MgYmFja2dyb3VuZCBpcyB0aGUgc2FtZSBhcyB0aGUgdGFibGUncyBiYWNrZ3JvdW5kCi0JICogYW5kIHRhYmxlIGlzIG9wYXF1ZSwgd2UgZG9uJ3QgbmVlZCB0byBwYWludCB0aGUgYmFja2dyb3VuZCAtCi0JICogdGhlIHRhYmxlIHdpbGwgZG8gaXQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2VsbElzT3BhcXVlSW4oSlRhYmxlIHRhYmxlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgT2JqZWN0IHZhbHVlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBzZWxlY3RlZCwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGJvb2xlYW4gaGFzRm9jdXMsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgcm93LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IGNvbHVtbikgewotCQlDb2xvciBjZWxsQmFja2dyb3VuZCA9IHRoaXMuY2hlY2tCb3guZ2V0QmFja2dyb3VuZCgpOwotCQlDb2xvciB0YWJsZUJhY2tncm91bmQgPSB0YWJsZS5nZXRCYWNrZ3JvdW5kKCk7Ci0JCXJldHVybiAhICh0YWJsZS5pc09wYXF1ZSgpICYmIGNlbGxCYWNrZ3JvdW5kLmVxdWFscyh0YWJsZUJhY2tncm91bmQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGNoZWNrIGJveCdzIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQkvLyBDUiMzOTk5MzE4IC0gVGhpcyBudWxsIGNoZWNrIG5lZWRzIHRvIGJlIHJlbW92ZWQgb25jZSBKREsgYnVnIGlzIGZpeGVkCi0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl2YWx1ZSA9IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJdGhpcy5jaGVja0JveC5zZXRTZWxlY3RlZCgoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuUmVuZGVyZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLmNoZWNrQm94LmlzU2VsZWN0ZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEltbWVkaWF0ZUVkaXRMaXN0ZW5lcihJbW1lZGlhdGVFZGl0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5pbW1lZGlhdGVFZGl0TGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0IHRoZSBjaGVjayBib3gncyB0ZXh0OyB3aGljaCBieSBkZWZhdWx0IGlzIGJsYW5rLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJdGhpcy5jaGVja0JveC5zZXRUZXh0KHRleHQpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY2hlY2sgYm94J3MgaWNvbjsgd2hpY2ggYnkgZGVmYXVsdCBpcyBub3QgcHJlc2VudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJY29uKEljb24gaWNvbikgewotCQl0aGlzLmNoZWNrQm94LnNldEljb24oaWNvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZW5kZXJlcidzIHByZWZlcnJlZCBoZWlnaHQuIFRoaXMgYWxsb3dzIHlvdQotCSAqIHRvIHNldCB0aGUgdGFibGUncyByb3cgaGVpZ2h0IHRvIHNvbWV0aGluZyB0aGUgY2hlY2sgYm94Ci0JICogd2lsbCBsb29rIGdvb2QgaW4uLi4uCi0JICovCi0JcHVibGljIGludCBwcmVmZXJyZWRIZWlnaHQoKSB7Ci0JCS8vIGFkZCBpbiBzcGFjZSBmb3IgdGhlIGJvcmRlciB0b3AgYW5kIGJvdHRvbQotCQlyZXR1cm4gKGludCkgdGhpcy5jaGVja0JveC5nZXRQcmVmZXJyZWRTaXplKCkuZ2V0SGVpZ2h0KCkgKyAyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTVhNDNiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL0NvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnN3aW5nLkNvbWJvQm94TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKLWltcG9ydCBqYXZheC5zd2luZy5KVGFibGU7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBqYXZheC5zd2luZy5Td2luZ0NvbnN0YW50czsKLWltcG9ydCBqYXZheC5zd2luZy5VSU1hbmFnZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkJvcmRlcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Qb3B1cE1lbnVFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Qb3B1cE1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotCi0vKioKLSAqIE1ha2UgdGhlIGNlbGwgbG9vayBsaWtlIGEgY29tYm8tYm94LgotICovCi1wdWJsaWMgY2xhc3MgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlciBpbXBsZW1lbnRzIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuUmVuZGVyZXIgewotCi0JLyogY2FjaGluZyB0aGUgY29tYm8gYm94IGJlY2F1c2Ugd2UgYXJlIGNhY2hpbmcgdGhlIGNvbWJvQm94TW9kZWwuCi0JICogRXZlcnl0aW1lIHdlIHJlYnVpbHQgdGhlIGNvbWJvQm94IHdlIHdvdWxkIHNldCB0aGUgbW9kZWwgb24gaXQgYW5kIG5vdAotCSAqIHJlbW92ZSB0aGUgbW9kZWwgZnJvbSB0aGUgb2xkIGNvbWJvIGJveC4gIFRoaXMgbWVhbnQgdGhhdCBuZXcgbGlzdGVuZXJzCi0JICoga2VwdCBiZWluZyBhZGRlZCB0byB0aGUgY29tYm9Cb3hNb2RlbCBmb3IgZXZlcnkgY29tYm9Cb3ggYnVpbGQuCi0JICogTm90IHN1cmUgaWYgdGhlcmUgaXMgYSB3YXkgdG8gY2xlYXIgb3V0IHRoZSBvbGQgY29tYm8gYm94LCBvciB3aHkKLQkgKiB3ZSB3ZXJlIGJ1aWxkaWcgYSBuZXcgY29tYm8gYm94IGV2ZXJ5IHRpbWUgc28gSSB3ZW50IHdpdGggY2FjaGluZyBpdC4KLQkgKi8KLQlwcml2YXRlIEpDb21ib0JveCBjb21ib0JveDsKLQkKLQkvKiogdGhlIGl0ZW1zIHVzZWQgdG8gcG9wdWxhdGUgdGhlIGNvbWJvIGJveCAqLwotCXByaXZhdGUgQ2FjaGluZ0NvbWJvQm94TW9kZWwgbW9kZWw7Ci0JcHJpdmF0ZSBMaXN0Q2VsbFJlbmRlcmVyIHJlbmRlcmVyOwotCU9iamVjdCB2YWx1ZTsKLQlwcml2YXRlIHN0YXRpYyBpbnQgaGVpZ2h0ID0gLTE7Ci0JYm9vbGVhbiBmYWtlRm9jdXNGbGFnOwotCi0JLyoqIHRoZSBsaXN0ZW5lciB0byBiZSBub3RpZmllZCBvbiBhbiBpbW1lZGlhdGUgZWRpdCAqLwotCXByb3RlY3RlZCBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLkltbWVkaWF0ZUVkaXRMaXN0ZW5lciBpbW1lZGlhdGVFZGl0TGlzdGVuZXI7Ci0JCi0JLyoqIGhvbGQgdGhlIG9yaWdpbmFsIGNvbG9ycyBvZiB0aGUgY29tYm8tYm94ICovCi0JcHJpdmF0ZSBzdGF0aWMgQ29sb3IgZGVmYXVsdEZvcmVncm91bmQ7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29sb3IgZGVmYXVsdEJhY2tncm91bmQ7Ci0KLQkvKiogIm5vcm1hbCIgYm9yZGVyIC0gYXNzdW1lIHRoZSBkZWZhdWx0IHRhYmxlICJmb2N1cyIgYm9yZGVyIGlzIDEgcGl4ZWwgdGhpY2sgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBCb3JkZXIgTk9fRk9DVVNfQk9SREVSID0gQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigxLCAxLCAxLCAxKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcml2YXRlIENvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkIGNvbWJvLWJveCBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcihDb21ib0JveE1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMobmV3IE5vbkNhY2hpbmdDb21ib0JveE1vZGVsKG1vZGVsKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgY2FjaGluZyBjb21iby1ib3ggbW9kZWwuCi0JICovCi0JcHVibGljIENvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIoQ2FjaGluZ0NvbWJvQm94TW9kZWwgbW9kZWwpIHsKLQkJdGhpcygpOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCByZW5kZXJlciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZAotCSAqIGNvbWJvLWJveCBtb2RlbCBhbmQgcmVuZGVyZXIuCi0JICovCi0JcHVibGljIENvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIoQ29tYm9Cb3hNb2RlbCBtb2RlbCwgTGlzdENlbGxSZW5kZXJlciByZW5kZXJlcikgewotCQl0aGlzKG5ldyBOb25DYWNoaW5nQ29tYm9Cb3hNb2RlbChtb2RlbCksIHJlbmRlcmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCByZW5kZXJlciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZAotCSAqIGNhY2hpbmcgY29tYm8tYm94IG1vZGVsIGFuZCByZW5kZXJlci4KLQkgKi8KLQlwdWJsaWMgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcihDYWNoaW5nQ29tYm9Cb3hNb2RlbCBtb2RlbCwgTGlzdENlbGxSZW5kZXJlciByZW5kZXJlcikgewotCQl0aGlzKG1vZGVsKTsKLQkJdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCS8vIHNhdmUgdGhlIG9yaWdpbmFsIGNvbG9ycyBvZiB0aGUgY29tYm8tYm94LCBzbyB3ZQotCQkvLyBjYW4gdXNlIHRoZW0gdG8gcGFpbnQgbm9uLXNlbGVjdGVkIGNlbGxzCi0JCWlmIChoZWlnaHQgPT0gLTEpIHsKLQkJCUpDb21ib0JveCBjYiA9IG5ldyBKQ29tYm9Cb3goKTsKLQkJCWNiLmFkZEl0ZW0oIm0iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBhZGQgaW4gc3BhY2UgZm9yIHRoZSBib3JkZXIgdG9wIGFuZCBib3R0b20KLQkJCWhlaWdodCA9IGNiLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQgKyAyOwotCi0JCQlkZWZhdWx0Rm9yZWdyb3VuZCA9IGNiLmdldEZvcmVncm91bmQoKTsKLQkJCWRlZmF1bHRCYWNrZ3JvdW5kID0gY2IuZ2V0QmFja2dyb3VuZCgpOwotCQl9Ci0JfQotCi0gICAgc3RhdGljIEpMYWJlbCBwcm90b3R5cGVMYWJlbCA9IG5ldyBKTGFiZWwoIlByb3RvdHlwZSIsIG5ldyBFbXB0eUljb24oMTYpLCBTd2luZ0NvbnN0YW50cy5MRUFESU5HKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJvdGVjdGVkIEpDb21ib0JveCBidWlsZENvbWJvQm94KCkgewotCi0JCWZpbmFsIEpDb21ib0JveCByZXN1bHQgPSBuZXcgSkNvbWJvQm94KCkgewotCQkJcHJpdmF0ZSBib29sZWFuIGZha2VGb2N1czsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7Ci0JCQkJcmV0dXJuIGZha2VGb2N1cyB8fCBzdXBlci5oYXNGb2N1cygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBnKSB7Ci0JCQkJZmFrZUZvY3VzID0gQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlci50aGlzLmZha2VGb2N1c0ZsYWc7Ci0JCQkJc3VwZXIucGFpbnQoZyk7Ci0JCQkJZmFrZUZvY3VzID0gZmFsc2U7Ci0JCQl9Ci0JCQkvL3dyYXAgdGhlIHJlbmRlcmVyIHRvIGRlYWwgd2l0aCB0aGUgcHJvdG90eXBlRGlzcGxheVZhbHVlCi0JCSAgICBAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHNldFJlbmRlcmVyKGZpbmFsIExpc3RDZWxsUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCSAgICAgICAgc3VwZXIuc2V0UmVuZGVyZXIobmV3IExpc3RDZWxsUmVuZGVyZXIoKXsKLQkJICAgICAgICAgICAgcHVibGljIENvbXBvbmVudCBnZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KEpMaXN0IGxpc3QsIE9iamVjdCB2LCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCwgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLQkJICAgICAgICAgICAgICAgIGlmICh2ID09IHByb3RvdHlwZUxhYmVsKSB7Ci0JCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvdHlwZUxhYmVsOwotCQkgICAgICAgICAgICAgICAgfQotCQkgICAgICAgICAgICAgICAgcmV0dXJuIGFSZW5kZXJlci5nZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KGxpc3QsIHYsIGluZGV4LCBpc1NlbGVjdGVkLCBjZWxsSGFzRm9jdXMpOwotCQkgICAgICAgICAgICB9Ci0JCSAgICAgICAgfSk7Ci0JCSAgICB9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJbmRleCgpIHsKLQkJICAgICAgICBib29sZWFuIGxpc3ROb3RDYWNoZWQgPSAhbGlzdElzQ2FjaGVkKCk7Ci0JCSAgICAgICAgaWYgKGxpc3ROb3RDYWNoZWQpIHsKLQkJICAgICAgICAgICAgY2FjaGVMaXN0KCk7Ci0JCSAgICAgICAgfQotCQkgICAgICAgIAotCQkJCWludCBpbmRleCA9IHN1cGVyLmdldFNlbGVjdGVkSW5kZXgoKTsKLQotCQkgICAgICAgIGlmIChsaXN0Tm90Q2FjaGVkKSB7Ci0JCSAgICAgICAgICAgIHVuY2FjaGVMaXN0KCk7Ci0JCSAgICAgICAgfQotCQkJCXJldHVybiBpbmRleDsKLQkJICAgfQotCi0JCX07Ci0JCS8vIHN0b2xlIHRoaXMgY29kZSBmcm9tIGphdmF4LnN3aW5nLkRlZmF1bHRDZWxsRWRpdG9yCi0JCXJlc3VsdC5wdXRDbGllbnRQcm9wZXJ0eSgiSkNvbWJvQm94LmlzVGFibGVDZWxsRWRpdG9yIiwgQm9vbGVhbi5UUlVFKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYWRkQWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZEFjdGlvbkxpc3RlbmVyKCkpOwotCQlyZXN1bHQuYWRkUG9wdXBNZW51TGlzdGVuZXIodGhpcy5idWlsZFBvcHVwTWVudUxpc3RlbmVyKCkpOwotCQkKLSAgICAgICAgLy9UaGVzZSBhcmUgdXNlZCB0byB3b3JrYXJvdW5kIHByb2JsZW1zIHdpdGggU3dpbmcgdHJ5aW5nIHRvIAotICAgICAgICAvL2RldGVybWluZSB0aGUgc2l6ZSBvZiBhIGNvbWJvQm94IHdpdGggYSBsYXJnZSBtb2RlbAotICAgICAgICByZXN1bHQuc2V0UHJvdG90eXBlRGlzcGxheVZhbHVlKHByb3RvdHlwZUxhYmVsKTsKLSAgICAgICAgZ2V0TGlzdEJveChyZXN1bHQpLnNldFByb3RvdHlwZUNlbGxWYWx1ZShwcm90b3R5cGVMYWJlbCk7Ci0gICAgICAgIAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLSAgICAKLSAgICBwcml2YXRlIEpMaXN0IGdldExpc3RCb3goSkNvbWJvQm94IHJlc3VsdCkgewotICAgICAgICByZXR1cm4gKEpMaXN0KSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShyZXN1bHQuZ2V0VUkoKSwgImxpc3RCb3giKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotCQotCXByaXZhdGUgQWN0aW9uTGlzdGVuZXIgYnVpbGRBY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0JCQkJSkNvbWJvQm94IGNiID0gKEpDb21ib0JveCkgZS5nZXRTb3VyY2UoKTsKLQkJCQlPYmplY3Qgc2VsZWN0ZWRJdGVtID0gY2IuZ2V0U2VsZWN0ZWRJdGVtKCk7Ci0KLQkJCQkvLyBPbmx5IHVwZGF0ZSB0aGUgc2VsZWN0ZWQgaXRlbSBhbmQgaW52b2tlIGltbWVkaWF0ZUVkaXQoKSBpZiB0aGUKLQkJCQkvLyBzZWxlY3RlZCBpdGVtIGFjdHVhbGx5IGNoYW5nZWQsIGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlCi0JCQkJLy8gZWRpdGluZywgdGhlIG1vZGVsIGNoYW5nZXMgYW5kIGNhdXNlcyB0aGlzIG1ldGhvZCB0byBiZSBpbnZva2VkLAotCQkJCS8vIGl0IGNhdXNlcyBDUiMzOTYzNjc1IHRvIG9jY3VyIGJlY2F1c2UgaW1tZWRpYXRlRWRpdCgpIHN0b3AgdGhlCi0JCQkJLy8gZWRpdGluZywgd2hpY2ggaXMgZG9uZSBhdCB0aGUgd3JvbmcgdGltZQotCQkJCWlmIChDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMudmFsdWUgIT0gc2VsZWN0ZWRJdGVtKSB7Ci0JCQkJCUNvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIudGhpcy52YWx1ZSA9IGNiLmdldFNlbGVjdGVkSXRlbSgpOwotCQkJCQlDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMuaW1tZWRpYXRlRWRpdCgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIGltbWVkaWF0ZUVkaXQoKSB7Ci0JCWlmICh0aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQl0aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lci5pbW1lZGlhdGVFZGl0KCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBQb3B1cE1lbnVMaXN0ZW5lciBidWlsZFBvcHVwTWVudUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFBvcHVwTWVudUxpc3RlbmVyKCkgewotCQkKLQkJCXB1YmxpYyB2b2lkIHBvcHVwTWVudVdpbGxCZWNvbWVWaXNpYmxlKFBvcHVwTWVudUV2ZW50IGUpIHsKLQkJCQlpZiAobGlzdElzQ2FjaGVkKCkpIHsKLQkJCQkJdW5jYWNoZUxpc3QoKTsKLQkJCQl9Ci0JCQkJY2FjaGVMaXN0KCk7Ci0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgcG9wdXBNZW51V2lsbEJlY29tZUludmlzaWJsZShQb3B1cE1lbnVFdmVudCBlKSB7Ci0JICAgICAgICAgICAgaWYgKGxpc3RJc0NhY2hlZCgpKSB7Ci0JICAgICAgICAgICAgICAgIHVuY2FjaGVMaXN0KCk7Ci0JICAgICAgICAgICAgfQotCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgcG9wdXBNZW51Q2FuY2VsZWQoUG9wdXBNZW51RXZlbnQgZSkgewotCSAgICAgICAgICAgIGlmIChsaXN0SXNDYWNoZWQoKSkgewotCSAgICAgICAgICAgICAgICB1bmNhY2hlTGlzdCgpOwotCSAgICAgICAgICAgIH0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkKLQl2b2lkIGNhY2hlTGlzdCgpIHsKLQkJdGhpcy5tb2RlbC5jYWNoZUxpc3QoKTsKLQl9Ci0JCi0Jdm9pZCB1bmNhY2hlTGlzdCgpIHsKLQkJdGhpcy5tb2RlbC51bmNhY2hlTGlzdCgpOwotCX0JCi0JCi0JYm9vbGVhbiBsaXN0SXNDYWNoZWQoKSB7Ci0JCXJldHVybiB0aGlzLm1vZGVsLmlzQ2FjaGVkKCk7Ci0JfQotCS8vICoqKioqKioqKiogVGFibGVDZWxsUmVuZGVyZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIENvbXBvbmVudCBnZXRUYWJsZUNlbGxSZW5kZXJlckNvbXBvbmVudChKVGFibGUgdGFibGUsIE9iamVjdCB2YWwsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJdGhpcy5mYWtlRm9jdXNGbGFnID0gc2VsZWN0ZWQgfHwgaGFzRm9jdXM7Ci0JCWlmICh0aGlzLmNvbWJvQm94ID09IG51bGwpIHsKLQkJCXRoaXMuY29tYm9Cb3ggPSB0aGlzLmJ1aWxkQ29tYm9Cb3goKTsKLQkKLQkJCXRoaXMuY29tYm9Cb3guc2V0Q29tcG9uZW50T3JpZW50YXRpb24odGFibGUuZ2V0Q29tcG9uZW50T3JpZW50YXRpb24oKSk7Ci0JCQl0aGlzLmNvbWJvQm94LnNldE1vZGVsKHRoaXMubW9kZWwpOwotCQkJaWYgKHRoaXMucmVuZGVyZXIgIT0gbnVsbCkgewotCQkJCXRoaXMuY29tYm9Cb3guc2V0UmVuZGVyZXIodGhpcy5yZW5kZXJlcik7Ci0JCQl9Ci0JCQl0aGlzLmNvbWJvQm94LnNldEZvbnQodGFibGUuZ2V0Rm9udCgpKTsKLQkJCXRoaXMuY29tYm9Cb3guc2V0RW5hYmxlZCh0YWJsZS5pc0VuYWJsZWQoKSk7Ci0JCQl0aGlzLmNvbWJvQm94LnNldEJvcmRlcih0aGlzLmJvcmRlcih0YWJsZSwgdmFsLCBzZWxlY3RlZCwgaGFzRm9jdXMsIHJvdywgY29sdW1uKSk7Ci0JCX0KLQotCQkvLyBXZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIG1vZGVsIHNpbmNlIEpDb21ib0JveCBtaWdodCBwcmV2ZW50IHVzIGZyb20KLQkJLy8gc2VsZWN0aW5nIHRoZSB2YWx1ZS4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIHZhbHVlIGlzIG5vdCBjb250YWluZWQKLQkJLy8gaW4gdGhlIG1vZGVsLCBzZWUgQ1IjMzk1MDA0NCBmb3IgYW4gZXhhbXBsZQotCQl0aGlzLm1vZGVsLnNldFNlbGVjdGVkSXRlbSh2YWwpOwotCi0JCXJldHVybiB0aGlzLmNvbWJvQm94OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGZvcmVncm91bmQgY29sb3IuCi0JICovCi0JcHJvdGVjdGVkIENvbG9yIGZvcmVncm91bmRDb2xvcihKVGFibGUgdGFibGUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgdmFsLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJaWYgKGhhc0ZvY3VzICYmIHRhYmxlLmlzQ2VsbEVkaXRhYmxlKHJvdywgY29sdW1uKSkgewotCQkJCXJldHVybiBkZWZhdWx0Rm9yZWdyb3VuZDsKLQkJCX0KLQkJCXJldHVybiB0YWJsZS5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCk7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRGb3JlZ3JvdW5kOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGJhY2tncm91bmQgY29sb3IuCi0JICovCi0JcHJvdGVjdGVkIENvbG9yIGJhY2tncm91bmRDb2xvcihKVGFibGUgdGFibGUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgdmFsLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJaWYgKGhhc0ZvY3VzICYmIHRhYmxlLmlzQ2VsbEVkaXRhYmxlKHJvdywgY29sdW1uKSkgewotCQkJCXJldHVybiBkZWZhdWx0QmFja2dyb3VuZDsKLQkJCX0KLQkJCXJldHVybiB0YWJsZS5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCk7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRCYWNrZ3JvdW5kOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGJvcmRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQm9yZGVyIGJvcmRlcihAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSlRhYmxlIHRhYmxlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgT2JqZWN0IHZhbCwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgcm93LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IGNvbHVtbikgewotCQlyZXR1cm4gaGFzRm9jdXMgPwotCQkJVUlNYW5hZ2VyLmdldEJvcmRlcigiVGFibGUuZm9jdXNDZWxsSGlnaGxpZ2h0Qm9yZGVyIikgLy8kTk9OLU5MUy0xJAotCQk6Ci0JCQlOT19GT0NVU19CT1JERVI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuUmVuZGVyZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEltbWVkaWF0ZUVkaXRMaXN0ZW5lcihUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLkltbWVkaWF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVuZGVyZXIncyBwcmVmZXJyZWQgaGVpZ2h0LiBUaGlzIGFsbG93cyB5b3UKLQkgKiB0byBzZXQgdGhlIHJvdyBoZWlnaHQgdG8gc29tZXRoaW5nIHRoZSBjb21iby1ib3ggd2lsbCBsb29rIGdvb2QgaW4uLi4uCi0JICovCi0JcHVibGljIGludCBwcmVmZXJyZWRIZWlnaHQoKSB7Ci0JCXJldHVybiBoZWlnaHQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRGlzcGxheWFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL0Rpc3BsYXlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhM2FkYjcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRGlzcGxheWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBVc2VkIGJ5IGdlbmVyYWwtcHVycG9zZSBVSSBtb2RlbHMgYW5kIHJlbmRlcmVycyB0byBjYXN0Ci0gKiBhcHBsaWNhdGlvbiBtb2RlbCBvYmplY3RzIHRvIHNvbWV0aGluZyBkaXNwbGF5YWJsZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBEaXNwbGF5YWJsZQotCWV4dGVuZHMgTW9kZWwKLXsKLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBtb2RlbAotCSAqIGluIGEgdGV4dHVhbCBVSSBzZXR0aW5nICh0eXBpY2FsbHkgdGhlIG9iamVjdCdzIG5hbWUpLgotCSAqIFdoZW4gdGhlIGRpc3BsYXkgc3RyaW5nIGNoYW5nZXMsIHRoZSBtb2RlbCBzaG91bGQgZmlyZQotCSAqIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9uOgotCSAqICAgICB0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIG9sZERpc3BsYXlTdHJpbmcsIHRoaXMuZGlzcGxheVN0cmluZygpKTsKLQkgKi8KLQlTdHJpbmcgZGlzcGxheVN0cmluZygpOwotCQlTdHJpbmcgRElTUExBWV9TVFJJTkdfUFJPUEVSVFkgPSAiZGlzcGxheVN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1vZGVsCi0JICogaW4gYSBVSSBjb21wb25lbnQgdGhhdCBzdXBwb3J0cyBpY29ucyAodGhlIGljb24gY2FuIGJlIG51bGwpLgotCSAqIFdoZW4gdGhlIGljb24gY2hhbmdlcywgdGhlIG1vZGVsIHNob3VsZCBmaXJlCi0JICogdGhlIGFwcHJvcHJpYXRlIGNoYW5nZSBub3RpZmljYXRpb246Ci0JICogICAgIHRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChJQ09OX1BST1BFUlRZLCBvbGRJY29uLCB0aGlzLmljb24oKSk7Ci0JICovCi0JSWNvbiBpY29uKCk7Ci0JCVN0cmluZyBJQ09OX1BST1BFUlRZID0gImljb24iOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL0VtcHR5SWNvbi5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRW1wdHlJY29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNGZiY2YuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRW1wdHlJY29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotCi0vKioKLSAqIEltcGxlbWVudCB0aGUgSWNvbiBpbnRlcmZhY2Ugd2l0aCBhbiBpY29uIHRoYXQgaGFzIGEgc2l6ZSBidXQKLSAqIGRvZXMgbm90IHBhaW50IGFueXRoaW5nIG9uIHRoZSBncmFwaGljcyBjb250ZXh0LgotICovCi1wdWJsaWMgY2xhc3MgRW1wdHlJY29uCi0JaW1wbGVtZW50cyBJY29uCi17Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgd2lkdGg7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgaGVpZ2h0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbXB0eUljb24gTlVMTF9JTlNUQU5DRSA9IG5ldyBFbXB0eUljb24oMCk7Ci0KLQotCXB1YmxpYyBFbXB0eUljb24oaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMud2lkdGggPSB3aWR0aDsKLQkJdGhpcy5oZWlnaHQgPSBoZWlnaHQ7Ci0JfQotCi0JcHVibGljIEVtcHR5SWNvbihpbnQgc2l6ZSkgewotCQl0aGlzKHNpemUsIHNpemUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJY29uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHBhaW50SWNvbihDb21wb25lbnQgYywgR3JhcGhpY3MgZywgaW50IHgsIGludCB5KSB7Ci0JCS8vIGRvbid0IHBhaW50IGFueXRoaW5nIGZvciBhbiBlbXB0eSBpY29uCi0JfQotCi0JcHVibGljIGludCBnZXRJY29uV2lkdGgoKSB7IAotCQlyZXR1cm4gdGhpcy53aWR0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEljb25IZWlnaHQoKSB7Ci0JCXJldHVybiB0aGlzLmhlaWdodDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL0ZpbHRlcmluZ0xpc3RCcm93c2VyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9GaWx0ZXJpbmdMaXN0QnJvd3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGVlOWFhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL0ZpbHRlcmluZ0xpc3RCcm93c2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KT3B0aW9uUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0TW9kZWw7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBMb25nTGlzdENvbXBvbmVudC5Ccm93c2VyIHVzZXMgYQotICogSk9wdGlvblBhbmUgdG8gcHJvbXB0IHRoZSB1c2VyIGZvciB0aGUgc2VsZWN0aW9uLiBUaGUgSk9QdGlvblBhbmUKLSAqIGlzIHBhc3NlZCBhIEZpbHRlcmluZ0xpc3RQYW5lbCB0byBhc3Npc3QgdGhlIHVzZXIgaW4gbWFraW5nCi0gKiBhIHNlbGVjdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEZpbHRlcmluZ0xpc3RCcm93c2VyPFQ+IAotCWltcGxlbWVudHMgTGlzdENob29zZXIuTGlzdEJyb3dzZXIgCi17Ci0JcHJpdmF0ZSBGaWx0ZXJpbmdMaXN0UGFuZWw8VD4gcGFuZWw7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdMaXN0QnJvd3NlcigpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wYW5lbCA9IHRoaXMuYnVpbGRQYW5lbCgpOwotCX0KLQotCXByb3RlY3RlZCBGaWx0ZXJpbmdMaXN0UGFuZWw8VD4gYnVpbGRQYW5lbCgpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbEZpbHRlcmluZ0xpc3RQYW5lbDxUPigpOwotCX0KLQotCS8qKgotCSAqIFByb21wdCB0aGUgdXNlciB1c2luZyBhIEpPcHRpb25QYW5lIHdpdGggYSBmaWx0ZXJpbmcKLQkgKiBsaXN0IHBhbmVsLgotCSAqLwotCXB1YmxpYyB2b2lkIGJyb3dzZShMaXN0Q2hvb3NlciBjaG9vc2VyKSB7CQotCQl0aGlzLmluaXRpYWxpemVDZWxsUmVuZGVyZXIoY2hvb3Nlcik7Ci0JCQotCQlpbnQgb3B0aW9uID0gCi0JCQlKT3B0aW9uUGFuZS5zaG93T3B0aW9uRGlhbG9nKAotCQkJCWNob29zZXIsIAotCQkJCXRoaXMubWVzc2FnZShjaG9vc2VyKSwgCi0JCQkJdGhpcy50aXRsZShjaG9vc2VyKSwgCi0JCQkJdGhpcy5vcHRpb25UeXBlKGNob29zZXIpLCAKLQkJCQl0aGlzLm1lc3NhZ2VUeXBlKGNob29zZXIpLCAKLQkJCQl0aGlzLmljb24oY2hvb3NlciksIAotCQkJCXRoaXMuc2VsZWN0aW9uVmFsdWVzKGNob29zZXIpLCAKLQkJCQl0aGlzLmluaXRpYWxTZWxlY3Rpb25WYWx1ZShjaG9vc2VyKQotCQkpOwotCQkKLQkJaWYgKG9wdGlvbiA9PSBKT3B0aW9uUGFuZS5PS19PUFRJT04pIHsKLQkJCWNob29zZXIuZ2V0TW9kZWwoKS5zZXRTZWxlY3RlZEl0ZW0odGhpcy5wYW5lbC5zZWxlY3Rpb24oKSk7Ci0JCX0KLQkJCi0JCS8vIGNsZWFyIHRoZSB0ZXh0IGZpZWxkIHNvIHRoZSBsaXN0IGJveCBpcyByZS1maWx0ZXJlZAotCQl0aGlzLnBhbmVsLnRleHRGaWVsZCgpLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDZWxsUmVuZGVyZXIoSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCS8vIGRlZmF1bHQgYmVoYXZpb3Igc2hvdWxkIGJlIHRvIHVzZSB0aGUgY2VsbCByZW5kZXJlciBmcm9tIHRoZSBjb21ib2JveC4KLQkJdGhpcy5wYW5lbC5saXN0Qm94KCkuc2V0Q2VsbFJlbmRlcmVyKGNvbWJvQm94LmdldFJlbmRlcmVyKCkpOwotCX0KLQotCS8qKgotCSAqIHRoZSBtZXNzYWdlIGNhbiBiZSBhbnl0aGluZyAtIGhlcmUgd2UgYnVpbGQgYSBjb21wb25lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IG1lc3NhZ2UoSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXRoaXMucGFuZWwuc2V0Q29tcGxldGVMaXN0KHRoaXMuY29udmVydFRvQXJyYXkoY29tYm9Cb3guZ2V0TW9kZWwoKSkpOwotCQl0aGlzLnBhbmVsLnNldFNlbGVjdGlvbihjb21ib0JveC5nZXRNb2RlbCgpLmdldFNlbGVjdGVkSXRlbSgpKTsKLQkJcmV0dXJuIHRoaXMucGFuZWw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBpbnQgb3B0aW9uVHlwZShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXJldHVybiBKT3B0aW9uUGFuZS5PS19DQU5DRUxfT1BUSU9OOwotCX0KLQotCXByb3RlY3RlZCBpbnQgbWVzc2FnZVR5cGUoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gSk9wdGlvblBhbmUuUVVFU1RJT05fTUVTU0FHRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSWNvbiBpY29uKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdFtdIHNlbGVjdGlvblZhbHVlcyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgaW5pdGlhbFNlbGVjdGlvblZhbHVlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgbGlzdCBvZiBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgbGlzdCBtb2RlbAotCSAqIGludG8gYW4gYXJyYXkuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIGNvbnZlcnRUb0FycmF5KExpc3RNb2RlbCBtb2RlbCkgewotCQlpbnQgc2l6ZSA9IG1vZGVsLmdldFNpemUoKTsKLQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IG1vZGVsLmdldEVsZW1lbnRBdChpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGN1c3RvbSBwYW5lbCAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBMb2NhbEZpbHRlcmluZ0xpc3RQYW5lbDxTPiBleHRlbmRzIEZpbHRlcmluZ0xpc3RQYW5lbDxTPiB7Ci0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotCi0JCXByb3RlY3RlZCBMb2NhbEZpbHRlcmluZ0xpc3RQYW5lbCgpIHsKLQkJCXN1cGVyKEVNUFRZX0FSUkFZLCBudWxsKTsKLQkJfQotCQotCQkvKioKLQkJICogRGlzYWJsZSB0aGUgcGVyZm9ybWFuY2UgdHdlYWsgYmVjYXVzZSBKT3B0aW9uUGFuZQotCQkgKiB3aWxsIHRyeSBvcGVuIHdpZGUgZW5vdWdoIHRvIGRpc2FibGUgdGhlIGhvcml6b250YWwgc2Nyb2xsIGJhcjsKLQkJICogYW5kIGl0IGxvb2tzIGEgYml0IGNsdW1zeS4KLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIHByb3RvdHlwZUNlbGxWYWx1ZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9GaWx0ZXJpbmdMaXN0UGFuZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL0ZpbHRlcmluZ0xpc3RQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTg2MDhjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL0ZpbHRlcmluZ0xpc3RQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkZvbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RMaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxpc3Q7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0RmllbGQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5Cb3JkZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Eb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVTdHJpbmdNYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ01hdGNoZXI7Ci0KLS8qKgotICogVGhpcyBwYW5lbCBwcmVzZW50cyBhbiBlbnRyeSBmaWVsZCBhbmQgYSBsaXN0IGJveCBvZiBjaG9pY2VzIHRoYXQKLSAqIGFsbG93cyB0aGUgdXNlciB0byBmaWx0ZXIgdGhlIGVudHJpZXMgaW4gdGhlIGxpc3QgYm94IGJ5IGVudGVyaW5nCi0gKiBhIHBhdHRlcm4gaW4gdGhlIGVudHJ5IGZpZWxkLgotICogCi0gKiBCeSBkZWZhdWx0LCB0d28gd2lsZGNhcmRzIGFyZSBhbGxvd2VkIGluIHRoZSBwYXR0ZXJuOgotICogCScqJyB3aWxsIG1hdGNoIGFueSBzZXQgb2YgemVybyBvciBtb3JlIGNoYXJhY3RlcnMKLSAqIAknPycgd2lsbCBtYXRjaCBhbnkgc2luZ2xlIGNoYXJhY3RlcgotICogCi0gKiBUaGUgcGFuZWwgY29uc2lzdHMgb2YgNCBjb21wb25lbnRzIHRoYXQgY2FuIGJlIGN1c3RvbWl6ZWQ6Ci0gKiAJLSAxIHRleHQgZmllbGQKLSAqIAktIDEgbGlzdCBib3gKLSAqIAktIDIgbGFiZWxzLCBvbmUgZm9yIGVhY2ggb2YgdGhlIGFib3ZlCi0gKiAKLSAqIE90aGVyIGFzcGVjdHMgb2YgdGhlIHBhbmVsJ3MgYmVoYXZpb3IgY2FuIGJlIGNoYW5nZWQ6Ci0gKiAJLSB0aGUgc3RyaW5nIGNvbnZlcnRlciBkZXRlcm1pbmVzIGhvdyB0aGUgb2JqZWN0cyBpbiB0aGUKLSAqIAkJbGlzdCBhcmUgY29udmVydGVkIHRvIHN0cmluZ3MgYW5kIGNvbXBhcmVkIHRvIHRoZSBwYXR0ZXJuCi0gKiAJCWVudGVyZWQgaW4gdGhlIHRleHQgZmllbGQ7IGJ5IGRlZmF1bHQgdGhlIGNvbnZlcnRlciBzaW1wbHkKLSAqIAkJdXNlcyB0aGUgcmVzdWx0IG9mIHRoZSBvYmplY3QncyAjdG9TdHJpbmcoKSBtZXRob2QKLSAqIAkJKGlmIHlvdSByZXBsYWNlIHRoZSBzdHJpbmcgY29udmVydGVyLCB5b3Ugd2lsbCBwcm9iYWJseQotICogCQl3YW50IHRvIHJlcGxhY2UgdGhlIGxpc3QgYm94J3MgY2VsbCByZW5kZXJlciBhbHNvKQotICogCS0gdGhlIHN0cmluZyBtYXRjaGVyIGNhbiBhbHNvIGJlIGNoYW5nZWQgaWYgeW91IHdvdWxkCi0gKiAJCWxpa2UgZGlmZmVyZW50IHBhdHRlcm4gbWF0Y2hpbmcgYmVoYXZpb3IgdGhhbiB0aGF0Ci0gKiAJCWRlc2NyaWJlZCBhYm92ZQotICogCS0geW91IGNhbiBzcGVjaWZ5IHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGxpc3QgLSB0aGlzIG1heQotICogCQlmb3JjZSB0aGUgdXNlciB0byBlbnRlciBhIHBhdHRlcm4gcmVzdHJpY3RpdmUgZW5vdWdoCi0gKiAJCXRvIHJlc3VsdCBpbiBhIGxpc3Qgc21hbGxlciB0aGFuIHRoZSBtYXhpbXVtIHNpemU7IHRoZQotICogCQlkZWZhdWx0IGlzIC0xLCB3aGljaCBkaXNhYmxlcyB0aGUgcmVzdHJpY3Rpb24KLSAqIAotICogVGhpcyBwYW5lbCBpcyBub3QgYSB0eXBpY2FsIHBhbmVsLCBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBkb2VzIG5vdCBzaGFyZQotICogaXRzIG1vZGVsIHdpdGggY2xpZW50cyB2aWEgdmFsdWUgbW9kZWxzLiBJbnN0ZWFkLCB0aGlzIHBhbmVsJ3MgbW9kZWwKLSAqIGlzIHNldCBhbmQgcXVlcmllZCBkaXJlY3RseSBiZWNhdXNlIGl0IGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgaW4gYQotICogZGlhbG9nIHRoYXQgZGlyZWN0cyB0aGUgdXNlcidzIGJlaGF2aW9yIChhcyBvcHBvc2VkIHRvIGEgIm5vcm1hbCIKLSAqIHdpbmRvdykuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdMaXN0UGFuZWw8VD4gZXh0ZW5kcyBKUGFuZWwgewotCi0JLyoqCi0JICogVGhlIGNvbXBsZXRlIGxpc3Qgb2YgYXZhaWxhYmxlIGNob2ljZXMKLQkgKiAoYXMgb3Bwb3NlZCB0byB0aGUgcGFydGlhbCBsaXN0IGhlbGQgYnkgdGhlIGxpc3QgYm94KS4KLQkgKi8KLQlwcml2YXRlIE9iamVjdFtdIGNvbXBsZXRlTGlzdDsKLQotCS8qKgotCSAqIEFuIGFkYXB0ZXIgdXNlZCB0byBjb252ZXJ0IHRoZSBvYmplY3RzIGluIHRoZSBsaXN0Ci0JICogdG8gc3RyaW5ncyBzbyB0aGV5IGNhbiBiZSBydW4gdGhyb3VnaCB0aGUgbWF0Y2hlcgotCSAqIGFuZCBkaXNwbGF5ZWQgaW4gdGhlIHRleHQgZmllbGQuCi0JICovCi0JU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcjsKLQotCS8qKiBUaGUgdGV4dCBmaWVsZC4gKi8KLQlwcml2YXRlIEpUZXh0RmllbGQgdGV4dEZpZWxkOwotCXByaXZhdGUgSkxhYmVsIHRleHRGaWVsZExhYmVsOwotCXByaXZhdGUgRG9jdW1lbnRMaXN0ZW5lciB0ZXh0RmllbGRMaXN0ZW5lcjsKLQotCS8qKiBUaGUgbGlzdCBib3guICovCi0JcHJpdmF0ZSBKTGlzdCBsaXN0Qm94OwotCXByaXZhdGUgSkxhYmVsIGxpc3RCb3hMYWJlbDsKLQotCS8qKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyBkaXNwbGF5ZWQgaW4gdGhlIGxpc3QgYm94LiAqLwotCXByaXZhdGUgaW50IG1heExpc3RTaXplOwotCi0JLyoqCi0JICogVGhlIG1hdGNoZXIgdXNlZCB0byBmaWx0ZXIgdGhlIGxpc3QgYWdhaW5zdAotCSAqIHRoZSBwYXR0ZXJuIGVudGVyZWQgaW4gdGhlIHRleHQgZmllbGQuIEJ5IGRlZmF1bHQsCi0JICogdGhpcyBhbGxvd3MgdGhlIHR3byB3aWxkY2FyZCBjaGFyYWN0ZXJzIGRlc2NyaWJlZCBpbgotCSAqIHRoZSBjbGFzcyBjb21tZW50LgotCSAqLwotCXByaXZhdGUgU3RyaW5nTWF0Y2hlciBzdHJpbmdNYXRjaGVyOwotCi0JLyoqCi0JICogUGVyZm9ybWFuY2UgdHdlYWs6IFdlIHVzZSB0aGlzIGJ1ZmZlciBpbnN0ZWFkIG9mCi0JICogYSB0ZW1wb3JhcnkgdmFyaWFibGUgZHVyaW5nIGZpbHRlcmluZyBzbyB3ZSBkb24ndCBoYXZlCi0JICogdG8ga2VlcCByZS1hbGxvY2F0aW5nIGl0LgotCSAqLwotCXByaXZhdGUgT2JqZWN0W10gYnVmZmVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9yZGVyIFRFWFRfRklFTERfTEFCRUxfQk9SREVSID0gQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigwLCAwLCA1LCAwKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBCb3JkZXIgTElTVF9CT1hfTEFCRUxfQk9SREVSID0gQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcig1LCAwLCA1LCAwKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgRmlsdGVyaW5nTGlzdFBhbmVsIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG9mIGNob2ljZXMKLQkgKiBhbmQgaW5pdGlhbCBzZWxlY3Rpb24uIFVzZSB0aGUgZGVmYXVsdCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlCi0JICogY2hvaWNlcyBhbmQgc2VsZWN0aW9uIHRvIHN0cmluZ3MgKHdoaWNoIHNpbXBseSBjYWxscyAjdG9TdHJpbmcoKSBvbgotCSAqIHRoZSBvYmplY3RzKS4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nTGlzdFBhbmVsKE9iamVjdFtdIGNvbXBsZXRlTGlzdCwgT2JqZWN0IGluaXRpYWxTZWxlY3Rpb24pIHsKLQkJdGhpcyhjb21wbGV0ZUxpc3QsIGluaXRpYWxTZWxlY3Rpb24sIFN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxUPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIEZpbHRlcmluZ0xpc3RQYW5lbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBjaG9pY2VzCi0JICogYW5kIGluaXRpYWwgc2VsZWN0aW9uLiBVc2UgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlCi0JICogY2hvaWNlcyBhbmQgc2VsZWN0aW9uIHRvIHN0cmluZ3MuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0xpc3RQYW5lbChPYmplY3RbXSBjb21wbGV0ZUxpc3QsIE9iamVjdCBpbml0aWFsU2VsZWN0aW9uLCBTdHJpbmdDb252ZXJ0ZXI8VD4gc3RyaW5nQ29udmVydGVyKSB7Ci0JCXN1cGVyKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCXRoaXMuY29tcGxldGVMaXN0ID0gY29tcGxldGVMaXN0OwotCQl0aGlzLnN0cmluZ0NvbnZlcnRlciA9IHN0cmluZ0NvbnZlcnRlcjsKLQkJdGhpcy5pbml0aWFsaXplKGluaXRpYWxTZWxlY3Rpb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShPYmplY3QgaW5pdGlhbFNlbGVjdGlvbikgewotCQl0aGlzLm1heExpc3RTaXplID0gdGhpcy5kZWZhdWx0TWF4TGlzdFNpemUoKTsKLQkJdGhpcy5idWZmZXIgPSB0aGlzLmJ1aWxkQnVmZmVyKCk7Ci0KLQkJdGhpcy50ZXh0RmllbGRMaXN0ZW5lciA9IHRoaXMuYnVpbGRUZXh0RmllbGRMaXN0ZW5lcigpOwotCi0JCXRoaXMuc3RyaW5nTWF0Y2hlciA9IHRoaXMuYnVpbGRTdHJpbmdNYXRjaGVyKCk7Ci0KLQkJdGhpcy5pbml0aWFsaXplTGF5b3V0KGluaXRpYWxTZWxlY3Rpb24pOwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gYnVpbGRCdWZmZXIoKSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0W3RoaXMubWF4KCldOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBtYXggbnVtYmVyIG9mIGVudHJpZXMgYWxsb3dlZCBpbiB0aGUgbGlzdCBib3guCi0JICovCi0JcHJpdmF0ZSBpbnQgbWF4KCkgewotCQlpZiAodGhpcy5tYXhMaXN0U2l6ZSA9PSAtMSkgewotCQkJcmV0dXJuIHRoaXMuY29tcGxldGVMaXN0Lmxlbmd0aDsKLQkJfQotCQlyZXR1cm4gTWF0aC5taW4odGhpcy5tYXhMaXN0U2l6ZSwgdGhpcy5jb21wbGV0ZUxpc3QubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIGxpc3RlbmVyIHRoYXQgd2lsbCBsaXN0ZW4gdG8gY2hhbmdlcyBpbiB0aGUgdGV4dCBmaWVsZAotCSAqIGFuZCBmaWx0ZXIgdGhlIGxpc3QgYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcml2YXRlIERvY3VtZW50TGlzdGVuZXIgYnVpbGRUZXh0RmllbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEb2N1bWVudExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaW5zZXJ0VXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0xpc3RQYW5lbC50aGlzLmZpbHRlckxpc3QoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWRVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nTGlzdFBhbmVsLnRoaXMuZmlsdGVyTGlzdCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgcmVtb3ZlVXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0xpc3RQYW5lbC50aGlzLmZpbHRlckxpc3QoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRleHQgZmllbGQgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZGVmYXVsdE1heExpc3RTaXplKCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdNYXRjaGVyIGJ1aWxkU3RyaW5nTWF0Y2hlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVTdHJpbmdNYXRjaGVyPFQ+KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVMYXlvdXQoT2JqZWN0IGluaXRpYWxTZWxlY3Rpb24pIHsKLQkJLy8gdGV4dCBmaWVsZAotCQlKUGFuZWwgdGV4dEZpZWxkUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCXRoaXMudGV4dEZpZWxkTGFiZWwgPSBuZXcgSkxhYmVsKCk7Ci0JCXRoaXMudGV4dEZpZWxkTGFiZWwuc2V0Qm9yZGVyKFRFWFRfRklFTERfTEFCRUxfQk9SREVSKTsKLQkJdGV4dEZpZWxkUGFuZWwuYWRkKHRoaXMudGV4dEZpZWxkTGFiZWwsIEJvcmRlckxheW91dC5OT1JUSCk7Ci0KLQkJdGhpcy50ZXh0RmllbGQgPSBuZXcgSlRleHRGaWVsZCgpOwotCQl0aGlzLnRleHRGaWVsZC5nZXREb2N1bWVudCgpLmFkZERvY3VtZW50TGlzdGVuZXIodGhpcy50ZXh0RmllbGRMaXN0ZW5lcik7Ci0JCXRoaXMudGV4dEZpZWxkTGFiZWwuc2V0TGFiZWxGb3IodGhpcy50ZXh0RmllbGQpOwotCQl0ZXh0RmllbGRQYW5lbC5hZGQodGhpcy50ZXh0RmllbGQsIEJvcmRlckxheW91dC5DRU5URVIpOwotCi0JCXRoaXMuYWRkKHRleHRGaWVsZFBhbmVsLCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotCi0JCS8vIGxpc3QgYm94Ci0JCUpQYW5lbCBsaXN0Qm94UGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCXRoaXMubGlzdEJveExhYmVsID0gbmV3IEpMYWJlbCgpOwotCQl0aGlzLmxpc3RCb3hMYWJlbC5zZXRCb3JkZXIoTElTVF9CT1hfTEFCRUxfQk9SREVSKTsKLQkJbGlzdEJveFBhbmVsLmFkZCh0aGlzLmxpc3RCb3hMYWJlbCwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLQotCQl0aGlzLmxpc3RCb3ggPSBuZXcgSkxpc3QoKTsKLQkJdGhpcy5saXN0Qm94LnNldERvdWJsZUJ1ZmZlcmVkKHRydWUpOwotCQl0aGlzLmxpc3RCb3guc2V0TW9kZWwodGhpcy5idWlsZFBhcnRpYWxBcnJheUxpc3RNb2RlbCh0aGlzLmNvbXBsZXRlTGlzdCwgdGhpcy5tYXgoKSkpOwotCQl0aGlzLmxpc3RCb3guZ2V0U2VsZWN0aW9uTW9kZWwoKS5zZXRTZWxlY3Rpb25Nb2RlKExpc3RTZWxlY3Rpb25Nb2RlbC5TSU5HTEVfU0VMRUNUSU9OKTsKLQkJLy8gcGVyZm9ybWFuY2UgdHdlYWsoPykKLQkJdGhpcy5saXN0Qm94LnNldFByb3RvdHlwZUNlbGxWYWx1ZSh0aGlzLnByb3RvdHlwZUNlbGxWYWx1ZSgpKTsKLQkJdGhpcy5saXN0Qm94LnNldFByb3RvdHlwZUNlbGxWYWx1ZShudWxsKTsKLQkJdGhpcy5saXN0Qm94LnNldENlbGxSZW5kZXJlcih0aGlzLmJ1aWxkRGVmYXVsdENlbGxSZW5kZXJlcigpKTsKLQkJdGhpcy5saXN0Qm94TGFiZWwuc2V0TGFiZWxGb3IodGhpcy5saXN0Qm94KTsKLQkJLy8gYnVnIDI3Nzc4MDIgLSBzY3JvbGwgYmFycyBzaG91bGRuJ3QgYmUgb24gdGhlIHRhYiBzZXF1ZW5jZQotCQlKU2Nyb2xsUGFuZSBsaXN0Qm94U2Nyb2xsUGFuZSA9IG5ldyBKU2Nyb2xsUGFuZSh0aGlzLmxpc3RCb3gpOwotCQlsaXN0Qm94U2Nyb2xsUGFuZS5nZXRIb3Jpem9udGFsU2Nyb2xsQmFyKCkuc2V0Rm9jdXNhYmxlKGZhbHNlKTsKLQkJbGlzdEJveFNjcm9sbFBhbmUuZ2V0VmVydGljYWxTY3JvbGxCYXIoKS5zZXRGb2N1c2FibGUoZmFsc2UpOwotCQlsaXN0Qm94UGFuZWwuYWRkKGxpc3RCb3hTY3JvbGxQYW5lLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQotCQkvLyBpbml0aWFsaXplIHRoZSB3aWRnZXRzCi0JCXRoaXMubGlzdEJveC5zZXRTZWxlY3RlZFZhbHVlKGluaXRpYWxTZWxlY3Rpb24sIHRydWUpOwotCQl0aGlzLnRleHRGaWVsZC5zZWxlY3QoMCwgdGhpcy50ZXh0RmllbGQuZ2V0VGV4dCgpLmxlbmd0aCgpKTsKLQotCQl0aGlzLmFkZChsaXN0Qm94UGFuZWwsIEJvcmRlckxheW91dC5DRU5URVIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCXB1YmxpYyBPYmplY3Qgc2VsZWN0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5saXN0Qm94LmdldFNlbGVjdGVkVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oT2JqZWN0IHNlbGVjdGlvbikgewotCQl0aGlzLmxpc3RCb3guc2V0U2VsZWN0ZWRWYWx1ZShzZWxlY3Rpb24sIHRydWUpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBjb21wbGV0ZUxpc3QoKSB7Ci0JCXJldHVybiB0aGlzLmNvbXBsZXRlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiByZWJ1aWxkIHRoZSBmaWx0ZXJpbmcgYnVmZmVyIGFuZCByZS1hcHBseSB0aGUgZmlsdGVyCi0JICogdG8gdGhlIG5ldyBsaXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tcGxldGVMaXN0KE9iamVjdFtdIGNvbXBsZXRlTGlzdCkgewotCQl0aGlzLmNvbXBsZXRlTGlzdCA9IGNvbXBsZXRlTGlzdDsKLQkJaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA8IHRoaXMubWF4KCkpIHsKLQkJCS8vIHRoZSBidWZmZXIgd2lsbCBuZXZlciBzaHJpbmsgLSBtaWdodCB3YW50IHRvIHJlLWNvbnNpZGVyLi4uICB+Ymp2Ci0JCQl0aGlzLmJ1ZmZlciA9IHRoaXMuYnVpbGRCdWZmZXIoKTsKLQkJfQotCQl0aGlzLmZpbHRlckxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG1heExpc3RTaXplKCkgewotCQlyZXR1cm4gdGhpcy5tYXhMaXN0U2l6ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXhMaXN0U2l6ZShpbnQgbWF4TGlzdFNpemUpIHsKLQkJdGhpcy5tYXhMaXN0U2l6ZSA9IG1heExpc3RTaXplOwotCQlpZiAodGhpcy5idWZmZXIubGVuZ3RoIDwgdGhpcy5tYXgoKSkgewotCQkJLy8gdGhlIGJ1ZmZlciB3aWxsIG5ldmVyIHNocmluayAtIG1pZ2h0IHdhbnQgdG8gcmUtY29uc2lkZXIuLi4gIH5ianYKLQkJCXRoaXMuYnVmZmVyID0gdGhpcy5idWlsZEJ1ZmZlcigpOwotCQl9Ci0JCXRoaXMuZmlsdGVyTGlzdCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdDb252ZXJ0ZXI8VD4gc3RyaW5nQ29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5zdHJpbmdDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogYXBwbHkgdGhlIG5ldyBmaWx0ZXIgdG8gdGhlIGxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJpbmdDb252ZXJ0ZXIoU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcikgewotCQl0aGlzLnN0cmluZ0NvbnZlcnRlciA9IHN0cmluZ0NvbnZlcnRlcjsKLQkJdGhpcy5maWx0ZXJMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogYWxsb3cgY2xpZW50IGNvZGUgdG8gYWNjZXNzIHRoZSB0ZXh0IGZpZWxkCi0JICogKHNvIHdlIGNhbiBzZXQgdGhlIGZvY3VzKQotCSAqLwotCXB1YmxpYyBKVGV4dEZpZWxkIHRleHRGaWVsZCgpIHsKLQkJcmV0dXJuIHRoaXMudGV4dEZpZWxkOwotCX0KLQotCS8qKgotCSAqIGFsbG93IGNsaWVudCBjb2RlIHRvIGFjY2VzcyB0aGUgdGV4dCBmaWVsZCBsYWJlbAotCSAqLwotCXB1YmxpYyBKTGFiZWwgdGV4dEZpZWxkTGFiZWwoKSB7Ci0JCXJldHVybiB0aGlzLnRleHRGaWVsZExhYmVsOwotCX0KLQotCS8qKgotCSAqIGNvbnZlbmllbmNlIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRGaWVsZExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQl0aGlzLnRleHRGaWVsZExhYmVsLnNldFRleHQodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogYWxsb3cgY2xpZW50IGNvZGUgdG8gYWNjZXNzIHRoZSBsaXN0IGJveAotCSAqIChzbyB3ZSBjYW4gYWRkIG1vdXNlIGxpc3RlbmVycyBmb3IgZG91YmxlLWNsaWNraW5nKQotCSAqLwotCXB1YmxpYyBKTGlzdCBsaXN0Qm94KCkgewotCQlyZXR1cm4gdGhpcy5saXN0Qm94OwotCX0KLQotCS8qKgotCSAqIGNvbnZlbmllbmNlIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RCb3hDZWxsUmVuZGVyZXIoTGlzdENlbGxSZW5kZXJlciByZW5kZXJlcikgewotCQl0aGlzLmxpc3RCb3guc2V0Q2VsbFJlbmRlcmVyKHJlbmRlcmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBhbGxvdyBjbGllbnQgY29kZSB0byBhY2Nlc3MgdGhlIGxpc3QgYm94IGxhYmVsCi0JICovCi0JcHVibGljIEpMYWJlbCBsaXN0Qm94TGFiZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RCb3hMYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBjb252ZW5pZW5jZSBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0Qm94TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMubGlzdEJveExhYmVsLnNldFRleHQodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogY29udmVuaWVuY2UgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tcG9uZW50c0ZvbnQoRm9udCBmb250KSB7Ci0JCXRoaXMudGV4dEZpZWxkTGFiZWwuc2V0Rm9udChmb250KTsKLQkJdGhpcy50ZXh0RmllbGQuc2V0Rm9udChmb250KTsKLQkJdGhpcy5saXN0Qm94TGFiZWwuc2V0Rm9udChmb250KTsKLQkJdGhpcy5saXN0Qm94LnNldEZvbnQoZm9udCk7Ci0JfQotCi0JcHVibGljIFN0cmluZ01hdGNoZXIgc3RyaW5nTWF0Y2hlcigpIHsKLQkJcmV0dXJuIHRoaXMuc3RyaW5nTWF0Y2hlcjsKLQl9Ci0KLQkvKioKLQkgKiByZS1hcHBseSB0aGUgZmlsdGVyIHRvIHRoZSBsaXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3RyaW5nTWF0Y2hlcihTdHJpbmdNYXRjaGVyIHN0cmluZ01hdGNoZXIpIHsKLQkJdGhpcy5zdHJpbmdNYXRjaGVyID0gc3RyaW5nTWF0Y2hlcjsKLQkJdGhpcy5maWx0ZXJMaXN0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWxsb3cgc3ViY2xhc3NlcyB0byBkaXNhYmxlIHBlcmZvcm1hbmNlIHR3ZWFrCi0JICogYnkgcmV0dXJuaW5nIG51bGwgaGVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb3RvdHlwZUNlbGxWYWx1ZSgpIHsKLQkJcmV0dXJuICI9PT09PT09PT09PiBBX1NUUklOR19USEFUX0lTX0RFRklOSVRFTFlfTE9OR0VSX1RIQU5fRVZFUllfU1RSSU5HX0lOX1RIRV9MSVNUIDw9PT09PT09PT09IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIHVzZSB0aGUgc3RyaW5nIGNvbnZlcnRlciB0byBidWlsZCB0aGUgdGV4dAotCSAqIHVzZWQgYnkgdGhlIGxpc3QgYm94J3MgY2VsbCByZW5kZXJlci4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdENlbGxSZW5kZXJlciBidWlsZERlZmF1bHRDZWxsUmVuZGVyZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdENlbGxSZW5kZXJlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVGV4dChPYmplY3QgdmFsdWUpIHsKLQkJCQlyZXR1cm4gRmlsdGVyaW5nTGlzdFBhbmVsLnRoaXMuc3RyaW5nQ29udmVydGVyLmNvbnZlcnRUb1N0cmluZygoVCkgdmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFNvbWV0aGluZyBoYXMgY2hhbmdlZCB0aGF0IHJlcXVpcmVzIHVzIHRvIGZpbHRlciB0aGUgbGlzdC4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBzeW5jaHJvbml6ZWQgYmVjYXVzZSBhIGZhc3QgdHlwaXN0IGNhbgotCSAqIGdlbmVyYXRlIGV2ZW50cyBxdWlja2VyIHRoYW4gd2UgY2FuIGZpbHRlciB0aGUgbGlzdC4gKD8gIH5ianYpCi0JICovCi0Jc3luY2hyb25pemVkIHZvaWQgZmlsdGVyTGlzdCgpIHsKLQkJLy8gdGVtcG9yYXJpbHkgc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgYm94IHNlbGVjdGlvbiwgc2luY2Ugd2Ugd2lsbAotCQkvLyBiZSBjaGFuZ2luZyB0aGUgc2VsZWN0aW9uIGR1cmluZyB0aGUgZmlsdGVyaW5nIGFuZCBkb24ndCB3YW50Ci0JCS8vIHRoYXQgdG8gYWZmZWN0IHRoZSB0ZXh0IGZpZWxkCi0JCXRoaXMuZmlsdGVyTGlzdCh0aGlzLnRleHRGaWVsZC5nZXRUZXh0KCkpOwotCX0KLQotCS8qKgotCSAqIEZpbHRlciB0aGUgY29udGVudHMgb2YgdGhlIGxpc3QgYm94IHRvIG1hdGNoIHRoZQotCSAqIHNwZWNpZmllZCBwYXR0ZXJuLgotCSAqLwotCXByaXZhdGUgdm9pZCBmaWx0ZXJMaXN0KFN0cmluZyBwYXR0ZXJuKSB7Ci0JCWlmIChwYXR0ZXJuLmxlbmd0aCgpID09IDApIHsKLQkJCXRoaXMubGlzdEJveC5zZXRNb2RlbCh0aGlzLmJ1aWxkUGFydGlhbEFycmF5TGlzdE1vZGVsKHRoaXMuY29tcGxldGVMaXN0LCB0aGlzLm1heCgpKSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnN0cmluZ01hdGNoZXIuc2V0UGF0dGVyblN0cmluZyhwYXR0ZXJuKTsKLQkJCWludCBqID0gMDsKLQkJCWludCBsZW4gPSB0aGlzLmNvbXBsZXRlTGlzdC5sZW5ndGg7Ci0JCQlpbnQgbWF4ID0gdGhpcy5tYXgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCQlpZiAodGhpcy5zdHJpbmdNYXRjaGVyLm1hdGNoZXModGhpcy5zdHJpbmdDb252ZXJ0ZXIuY29udmVydFRvU3RyaW5nKHRoaXMuZW50cnkoaSkpKSkgewotCQkJCQl0aGlzLmJ1ZmZlcltqKytdID0gdGhpcy5jb21wbGV0ZUxpc3RbaV07Ci0JCQkJfQotCQkJCWlmIChqID09IG1heCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQl0aGlzLmxpc3RCb3guc2V0TW9kZWwodGhpcy5idWlsZFBhcnRpYWxBcnJheUxpc3RNb2RlbCh0aGlzLmJ1ZmZlciwgaikpOwotCQl9Ci0KLQkJLy8gYWZ0ZXIgZmlsdGVyaW5nIHRoZSBsaXN0LCBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIHNlbGVjdGlvbgotCQlpZiAodGhpcy5saXN0Qm94LmdldE1vZGVsKCkuZ2V0U2l6ZSgpID09IDApIHsKLQkJCXRoaXMubGlzdEJveC5nZXRTZWxlY3Rpb25Nb2RlbCgpLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmxpc3RCb3guZ2V0U2VsZWN0aW9uTW9kZWwoKS5zZXRBbmNob3JTZWxlY3Rpb25JbmRleCgwKTsKLQkJCXRoaXMubGlzdEJveC5nZXRTZWxlY3Rpb25Nb2RlbCgpLnNldExlYWRTZWxlY3Rpb25JbmRleCgwKTsKLQkJCXRoaXMubGlzdEJveC5lbnN1cmVJbmRleElzVmlzaWJsZSgwKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIFQgZW50cnkoaW50IGluZGV4KSB7Ci0JCXJldHVybiAoVCkgdGhpcy5jb21wbGV0ZUxpc3RbaW5kZXhdOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgbGlzdCBtb2RlbCB0aGF0IHdyYXBzIG9ubHkgYSBwb3J0aW9uIG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogVGhlIG1vZGVsIHdpbGwgaW5jbHVkZSB0aGUgYXJyYXkgZW50cmllcyBmcm9tIDAgdG8gKHNpemUgLSAxKS4KLQkgKi8KLQlwcml2YXRlIExpc3RNb2RlbCBidWlsZFBhcnRpYWxBcnJheUxpc3RNb2RlbChmaW5hbCBPYmplY3RbXSBhcnJheSwgZmluYWwgaW50IHNpemUpIHsKLQkJcmV0dXJuIG5ldyBBYnN0cmFjdExpc3RNb2RlbCgpIHsKLQkJCXB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKLQkJCQlyZXR1cm4gc2l6ZTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudEF0KGludCBpbmRleCkgewotCQkJCXJldHVybiBhcnJheVtpbmRleF07Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvTGlzdENob29zZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL0xpc3RDaG9vc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YmFkMjMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvTGlzdENob29zZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkFXVEV2ZW50OwotaW1wb3J0IGphdmEuYXd0LkFXVEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLWltcG9ydCBqYXZhLmF3dC5Qb2ludDsKLWltcG9ydCBqYXZhLmF3dC5Sb2JvdDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlBvcHVwTWVudUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlBvcHVwTWVudUxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuYmFzaWMuQmFzaWNDb21ib0JveFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci0KLS8qKgotICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSB3YXkgdG8gaGFuZGxlIHNlbGVjdGluZyBhbiBpdGVtIGZyb20gYQotICogbGlzdCB0aGF0IG1heSBncm93IHRvbyBsYXJnZSB0byBiZSBoYW5kbGVkIGNvbnZlbmllbnRseSBieSBhIGNvbWJvLWJveC4gCi0gKiBJZiB0aGUgbGlzdCdzIHNpemUgaXMgbGVzcyB0aGFuIHRoZSBkZXNpZ25hdGVkICJsb25nIiBsaXN0IHNpemUsIAotICogdGhlIGNob2ljZSBsaXN0IHdpbGwgYmUgZGlzcGxheWVkIGluIGEgbm9ybWFsIGNvbWJvLWJveCBwb3B1cDsgCi0gKiBvdGhlcndpc2UsIGEgZGlhbG9nIHdpbGwgYmUgdXNlZCB0byBwcm9tcHQgdGhlIHVzZXIgdG8gY2hvb3NlIGEgc2VsZWN0aW9uLgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIGJyb3dzZSBtZWNoYW5pc20sIHN1YmNsYXNzZXMgbWF5IAotICogCS0gb3ZlcnJpZGUgdGhlIG1ldGhvZCAjYnVpbGRCcm93c2VyKCkKLSAqICAtIG92ZXJyaWRlIHRoZSBtZXRob2QgI2Jyb3dzZSgpLCBpbiB3aGljaCBjYXNlIHRoZSBtZXRob2QgCi0gKiAJCSNidWlsZEJyb3dzZXIoKSBtYXkgYmUgaWdub3JlZC4KLSAqLwotcHVibGljIGNsYXNzIExpc3RDaG9vc2VyIAotCWV4dGVuZHMgSkNvbWJvQm94Ci17Ci0JCi0JLyoqIHRoZSBzaXplIG9mIGEgImxvbmciIGxpc3QgLSBhbnl0aGluZyBzbWFsbGVyIGlzIGEgInNob3J0IiBsaXN0ICovCi0JaW50IGxvbmdMaXN0U2l6ZSA9IERFRkFVTFRfTE9OR19MSVNUX1NJWkU7Ci0JCi0JLyoqIHRoZSBkZWZhdWx0IHNpemUgb2YgYSAibG9uZyIgbGlzdCwgd2hpY2ggaXMgMjAgKHRvIG1hdGNoIEpPcHRpb25QYW5lJ3MgYmVoYXZpb3IpICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9MT05HX0xJU1RfU0laRSA9IDIwOwotCQotCS8qKiBwcm9wZXJ0eSBjaGFuZ2UgYXNzb2NpYXRlZCB3aXRoIGxvbmcgbGlzdCBzaXplICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9OR19MSVNUX1NJWkVfUFJPUEVSVFkgPSAibG9uZ0xpc3RTaXplIjsgLy8kTk9OLU5MUy0xJAotCQotICAgIHN0YXRpYyBKTGFiZWwgcHJvdG90eXBlTGFiZWwgPSBuZXcgSkxhYmVsKCJQcm90b3R5cGUiLCBuZXcgRW1wdHlJY29uKDE3KSwgU3dpbmdDb25zdGFudHMuTEVBRElORyk7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKiAKLQkgKiB3aGV0aGVyIHRoZSBjaG9vc2VyIGlzIGNob29zYWJsZS4gIGlmIGEgY2hvb3NlciBpcyBub3QgY2hvb3NhYmxlLAotCSAqIGl0IG9ubHkgc2VydmVzIGFzIGEgZGlzcGxheSB3aWRnZXQuICBhIHVzZXIgbWF5IG5vdCBjaGFuZ2UgaXRzIAotCSAqIHNlbGVjdGVkIHZhbHVlLgotCSAqLwotCWJvb2xlYW4gY2hvb3NhYmxlID0gdHJ1ZTsKLQkKLQkvKiogcHJvcGVydHkgY2hhbmdlIGFzc29jaWF0ZWQgd2l0aCBjaG9vc2FibGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSE9PU0FCTEVfUFJPUEVSVFkgPSAiY2hvb3NhYmxlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiB0aGUgYnJvd3NlciB1c2VkIHRvIG1ha2UgYSBzZWxlY3Rpb24gZnJvbSB0aGUgbG9uZyBsaXN0IC0gdHlwaWNhbGx5IHZpYSBhIGRpYWxvZyAqLwotCXByaXZhdGUgTGlzdEJyb3dzZXIgYnJvd3NlcjsKLQkKLSAgICBwcml2YXRlIE5vZGVTZWxlY3RvciBub2RlU2VsZWN0b3I7Ci0gICAgCi0JLyoqIElOVEVSTkFMIC0gVGhlIHBvcHVwIGlzIGJlaW5nIHNob3duLiAgVXNlZCB0byBwcmV2ZW50IGluZmluaXRlIGxvb3AuICovCi0JYm9vbGVhbiBwb3B1cEFscmVhZHlJblByb2dyZXNzOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogQ29uc3RydWN0b3JzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgY2hvb3NlciBmb3IgdGhlIHNwZWNpZmllZCBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgTGlzdENob29zZXIoQ29tYm9Cb3hNb2RlbCBtb2RlbCkgewotCQl0aGlzKG1vZGVsLCBuZXcgTm9kZVNlbGVjdG9yLkRlZmF1bHROb2RlU2VsZWN0b3IoKSk7Ci0JfQotCQotICAgIHB1YmxpYyBMaXN0Q2hvb3NlcihDYWNoaW5nQ29tYm9Cb3hNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzKG1vZGVsLCBuZXcgTm9kZVNlbGVjdG9yLkRlZmF1bHROb2RlU2VsZWN0b3IoKSk7Ci0gICAgfQotICAgIAotCXB1YmxpYyBMaXN0Q2hvb3NlcihDb21ib0JveE1vZGVsIG1vZGVsLCBOb2RlU2VsZWN0b3Igbm9kZVNlbGVjdG9yKSB7Ci0gICAgICAgIHRoaXMobmV3IE5vbkNhY2hpbmdDb21ib0JveE1vZGVsKG1vZGVsKSwgbm9kZVNlbGVjdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3RDaG9vc2VyKENhY2hpbmdDb21ib0JveE1vZGVsIG1vZGVsLCBOb2RlU2VsZWN0b3Igbm9kZVNlbGVjdG9yKSB7Ci0gICAgICAgIHN1cGVyKG1vZGVsKTsKLSAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7Ci0gICAgICAgIHRoaXMubm9kZVNlbGVjdG9yID0gbm9kZVNlbGVjdG9yOwotICAgIH0KLQkvLyAqKioqKioqKioqKioqKioqIEluaXRpYWxpemF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLmFkZFBvcHVwTWVudUxpc3RlbmVyKHRoaXMuYnVpbGRQb3B1cE1lbnVMaXN0ZW5lcigpKTsKLQkJdGhpcy5zZXRSZW5kZXJlcihuZXcgRGVmYXVsdExpc3RDZWxsUmVuZGVyZXIoKSk7Ci0gICAgICAgIHRoaXMuYWRkS2V5TGlzdGVuZXIoYnVpbGRGM0tleUxpc3RlbmVyKCkpOwotICAgICAgICAKLSAgICAgICAgLy9UaGVzZSBhcmUgdXNlZCB0byB3b3JrYXJvdW5kIHByb2JsZW1zIHdpdGggU3dpbmcgdHJ5aW5nIHRvIAotICAgICAgICAvL2RldGVybWluZSB0aGUgc2l6ZSBvZiBhIGNvbWJvQm94IHdpdGggYSBsYXJnZSBtb2RlbAotICAgICAgICBzZXRQcm90b3R5cGVEaXNwbGF5VmFsdWUocHJvdG90eXBlTGFiZWwpOwotICAgICAgICBsaXN0Qm94KCkuc2V0UHJvdG90eXBlQ2VsbFZhbHVlKHByb3RvdHlwZUxhYmVsKTsKLQl9Ci0JCi0gICAgCi0gICAgcHJpdmF0ZSBKTGlzdCBsaXN0Qm94KCkgewotICAgICAgICByZXR1cm4gKEpMaXN0KSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZSh0aGlzLnVpLCAibGlzdEJveCIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotCS8qKiAKLQkgKiBXaGVuIHRoZSBwb3B1cCBpcyBhYm91dCB0byBiZSBzaG93biwgdGhlIGV2ZW50IGlzIGNvbnN1bWVkLCBhbmQgCi0JICogUG9wdXBIYW5kbGVyIGRldGVybWluZXMgd2hldGhlciB0byByZXNob3cgdGhlIHBvcHVwIG9yIHRvIHNob3cKLQkgKiB0aGUgbG9uZyBsaXN0IGJyb3dzZXIuCi0JICovCi0JcHJpdmF0ZSBQb3B1cE1lbnVMaXN0ZW5lciBidWlsZFBvcHVwTWVudUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFBvcHVwTWVudUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcG9wdXBNZW51V2lsbEJlY29tZVZpc2libGUoUG9wdXBNZW51RXZlbnQgZSkgewotCQkJCUxpc3RDaG9vc2VyLnRoaXMuYWJvdXRUb1Nob3dQb3B1cCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgcG9wdXBNZW51V2lsbEJlY29tZUludmlzaWJsZShQb3B1cE1lbnVFdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkJcHVibGljIHZvaWQgcG9wdXBNZW51Q2FuY2VsZWQoUG9wdXBNZW51RXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInBvcC11cCBtZW51IGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGlzIGNvZGUgaXMgYmVpbmcgcmVhY2hlZCBkdWUgdG8gdGhlIFBvcHVwSGFuZGxlciBhbHJlYWR5IGJlaW5nIGluIHByb2dyZXNzLAotCSAqIHRoZW4gZG8gbm90aGluZy4gIE90aGVyd2lzZSwgc2V0IHRoZSBmbGFnIHRvIHRydWUgYW5kIGxhdW5jaCB0aGUgUG9wdXBIYW5kbGVyLgotCSAqLwotCXZvaWQgYWJvdXRUb1Nob3dQb3B1cCgpIHsKLQkJaWYgKHRoaXMucG9wdXBBbHJlYWR5SW5Qcm9ncmVzcykgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQl0aGlzLnBvcHVwQWxyZWFkeUluUHJvZ3Jlc3MgPSB0cnVlOwotCQlFdmVudFF1ZXVlLmludm9rZUxhdGVyKG5ldyBQb3B1cEhhbmRsZXIoKSk7Ci0JfQotIAotICAgIAotCXByaXZhdGUgS2V5TGlzdGVuZXIgYnVpbGRGM0tleUxpc3RlbmVyKCkgewotICAgICAgICByZXR1cm4gbmV3IEtleUFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChlLmdldEtleUNvZGUoKSA9PSBLZXlFdmVudC5WS19GMykgewotICAgICAgICAgICAgICAgICAgICBnb1RvU2VsZWN0ZWRJdGVtKCk7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkYzIGtleSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLSAgICAgICAgfTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZ29Ub1NlbGVjdGVkSXRlbSgpIHsKLSAgICAgICAgaWYgKGdldFNlbGVjdGVkSXRlbSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3RDaG9vc2VyLnRoaXMubm9kZVNlbGVjdG9yLnNlbGVjdE5vZGVGb3IoZ2V0U2VsZWN0ZWRJdGVtKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotCS8vICoqKioqKioqKioqKioqKiogQnJvd3NpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKiAKLQkgKiBMYXppbHkgaW5pdGlhbGl6ZSBiZWNhdXNlIHN1YmNsYXNzZXMgbWF5IGhhdmUgZnVydGhlciBpbml0aWFsaXphdGlvbiB0byBkbwotCSAqIGJlZm9yZSBicm93c2VyIGNhbiBiZSBidWlsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicm93c2UoKSB7Ci0JCWlmICh0aGlzLmJyb3dzZXIgPT0gbnVsbCkgewotCQkJdGhpcy5icm93c2VyID0gdGhpcy5idWlsZEJyb3dzZXIoKTsKLQkJfQotCQkKLQkJdGhpcy5icm93c2VyLmJyb3dzZSh0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiYnJvd3NlciIgdXNlZCB0byBtYWtlIGEgc2VsZWN0aW9uIGZyb20gdGhlIGxvbmcgbGlzdCwKLQkgKiB0eXBpY2FsbHkgdmlhIGEgZGlhbG9nLgotCSAqLwotCXByb3RlY3RlZCBMaXN0Q2hvb3Nlci5MaXN0QnJvd3NlciBidWlsZEJyb3dzZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdEJyb3dzZXIoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBDaG9vc2FibGUgZnVuY3Rpb25hbGl0eSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqIG92ZXJyaWRlIGJlaGF2aW9yIC0gY29uc3VtZSBzZWxlY3Rpb24gaWYgY2hvb3NlciBpcyBub3QgY2hvb3NhYmxlICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRJbmRleChpbnQgYW5JbmRleCkgewotCQlpZiAodGhpcy5jaG9vc2FibGUpIHsKLQkJCXN1cGVyLnNldFNlbGVjdGVkSW5kZXgoYW5JbmRleCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUFycm93QnV0dG9uKCkgewotCQl0cnkgewotCQkJQmFzaWNDb21ib0JveFVJIGNvbWJvQm94VWkgPSAoQmFzaWNDb21ib0JveFVJKSBMaXN0Q2hvb3Nlci50aGlzLmdldFVJKCk7Ci0JCQlKQnV0dG9uIGFycm93QnV0dG9uID0gKEpCdXR0b24pIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKGNvbWJvQm94VWksICJhcnJvd0J1dHRvbiIpOyAvLyROT04tTkxTLTEkCi0JCQlhcnJvd0J1dHRvbi5zZXRFbmFibGVkKHRoaXMuaXNFbmFibGVkKCkgJiYgdGhpcy5jaG9vc2FibGUpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gdGhpcyBpcyBhIGh1Z2UgaGFjayB0byB0cnkgYW5kIG1ha2UgdGhlIGNvbWJvIGJveCBsb29rIHJpZ2h0LAotCQkJLy8gc28gaWYgaXQgZG9lc24ndCB3b3JrLCBqdXN0IHN3YWxsb3cgdGhlIGV4Y2VwdGlvbgotCQl9Ci0JfQotCQotCQotICAgIC8vICoqKioqKioqKioqKioqKiogTGlzdCBDYWNoaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIHZvaWQgY2FjaGVMaXN0KCkgewotICAgICAgICAoKENhY2hpbmdDb21ib0JveE1vZGVsKSBnZXRNb2RlbCgpKS5jYWNoZUxpc3QoKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCB1bmNhY2hlTGlzdCgpIHsKLSAgICAgICAgKChDYWNoaW5nQ29tYm9Cb3hNb2RlbCkgZ2V0TW9kZWwoKSkudW5jYWNoZUxpc3QoKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGxpc3RJc0NhY2hlZCgpIHsKLSAgICAgICAgcmV0dXJuICgoQ2FjaGluZ0NvbWJvQm94TW9kZWwpIGdldE1vZGVsKCkpLmlzQ2FjaGVkKCk7Ci0gICAgfQotICAgIAotCS8vICoqKioqKioqKioqKioqKiogUHVibGljICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBpbnQgbG9uZ0xpc3RTaXplKCkgewotCQlyZXR1cm4gdGhpcy5sb25nTGlzdFNpemU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExvbmdMaXN0U2l6ZShpbnQgbmV3TG9uZ0xpc3RTaXplKSB7Ci0JCWludCBvbGRMb25nTGlzdFNpemUgPSB0aGlzLmxvbmdMaXN0U2l6ZTsKLQkJdGhpcy5sb25nTGlzdFNpemUgPSBuZXdMb25nTGlzdFNpemU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlKExPTkdfTElTVF9TSVpFX1BST1BFUlRZLCBvbGRMb25nTGlzdFNpemUsIG5ld0xvbmdMaXN0U2l6ZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQ2hvb3NhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5jaG9vc2FibGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENob29zYWJsZShib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCWJvb2xlYW4gb2xkVmFsdWUgPSB0aGlzLmNob29zYWJsZTsKLQkJdGhpcy5jaG9vc2FibGUgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2UoQ0hPT1NBQkxFX1BST1BFUlRZLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQl0aGlzLnVwZGF0ZUFycm93QnV0dG9uKCk7Ci0JfQotCQotCS8vICoqKioqKioqKioqKioqKiogSGFuZGxlIHNlbGVjdGluZyBudWxsIGFzIGEgdmFsdWUgKioqKioqKioqKioqKioqKioqKioqKgotCi0JcHJpdmF0ZSBib29sZWFuIHNlbGVjdGVkSW5kZXhJc05vbmVTZWxlY3RlZEl0ZW0oaW50IGluZGV4KSB7Ci0JCXJldHVybiBpbmRleCA9PSAtMSAmJgotCQkJCSBnZXRNb2RlbCgpLmdldFNpemUoKSA+IDAgJiYKLQkJCQkgZ2V0TW9kZWwoKS5nZXRFbGVtZW50QXQoMCkgPT0gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGdldFNlbGVjdGVkSW5kZXgoKSB7Ci0gICAgICAgIGJvb2xlYW4gbGlzdE5vdENhY2hlZCA9ICFsaXN0SXNDYWNoZWQoKTsKLSAgICAgICAgaWYgKGxpc3ROb3RDYWNoZWQpIHsKLSAgICAgICAgICAgIGNhY2hlTGlzdCgpOwotICAgICAgICB9Ci0gICAgICAgIAotCQlpbnQgaW5kZXggPSBzdXBlci5nZXRTZWxlY3RlZEluZGV4KCk7Ci0KLQkJLy8gVXNlIGluZGV4IDAgdG8gc2hvdyB0aGUgPG5vbmUgc2VsZWN0ZWQ+IGl0ZW0gc2luY2UgdGhlIGFjdHVhbCB2YWx1ZSBpcwotCQkvLyBudWxsIGFuZCBKQ29tYm9Cb3ggZG9lcyBub3QgaGFuZGxlIG51bGwgdmFsdWVzCi0JCWlmIChzZWxlY3RlZEluZGV4SXNOb25lU2VsZWN0ZWRJdGVtKGluZGV4KSkgewotCQkJaW5kZXggPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxpc3ROb3RDYWNoZWQpIHsKLSAgICAgICAgICAgIHVuY2FjaGVMaXN0KCk7Ci0gICAgICAgIH0KLQkJcmV0dXJuIGluZGV4OwotICAgfQotCQotCS8vd3JhcCB0aGUgcmVuZGVyZXIgdG8gZGVhbCB3aXRoIHRoZSBwcm90b3R5cGVEaXNwbGF5VmFsdWUKLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRSZW5kZXJlcihmaW5hbCBMaXN0Q2VsbFJlbmRlcmVyIGFSZW5kZXJlcikgewotICAgICAgICBzdXBlci5zZXRSZW5kZXJlcihuZXcgTGlzdENlbGxSZW5kZXJlcigpewotICAgICAgICAgICAgcHVibGljIENvbXBvbmVudCBnZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KEpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gY2VsbEhhc0ZvY3VzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IHByb3RvdHlwZUxhYmVsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm90b3R5cGVMYWJlbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFSZW5kZXJlci5nZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KGxpc3QsIHZhbHVlLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotICAgIAotICAgIAotCS8vICoqKioqKioqKioqKioqKiogTWVtYmVyIGNsYXNzZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIERlZmluZSB0aGUgQVBJIHJlcXVpcmVkIGJ5IHRoaXMgTGlzdENob29zZXIgd2hlbiBpdCBtdXN0Ci0JICogcHJvbXB0IHRoZSB1c2VyIHRvIHNlbGVjdCBhbiBpdGVtIGZyb20gdGhlICJsb25nIiBsaXN0LgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTGlzdEJyb3dzZXIgCi0JewotCQkvKioKLQkJICogUHJvbXB0IHRoZSB1c2VyIHRvIG1ha2UgYSBzZWxlY3Rpb24gZnJvbSB0aGUgc3BlY2lmaWVkCi0JCSAqIGNvbWJvLWJveCdzIG1vZGVsLgotCQkgKi8KLQkJdm9pZCBicm93c2UoTGlzdENob29zZXIgcGFyZW50Q2hvb3Nlcik7Ci0JfQotCQotCQotCS8qKgotCSAqIFJ1bm5hYmxlIGNsYXNzIHRoYXQgY29uc3VtZXMgcG9wdXAgd2luZG93IGFuZCBkZXRlcm1pbmVzIHdoZXRoZXIKLQkgKiB0byByZXNob3cgcG9wdXAgb3IgdG8gbGF1bmNoIGJyb3dzZXIsIGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSBsaXN0LgotCSAqLwotCXByaXZhdGUgY2xhc3MgUG9wdXBIYW5kbGVyCi0JCWltcGxlbWVudHMgUnVubmFibGUKLQl7Ci0JCS8qKiBUaGUgbW91c2UgZXZlbnQgKi8KLQkJcHJpdmF0ZSBNb3VzZUV2ZW50IGxhc3RNb3VzZUV2ZW50OwotCQkKLQkJLyoqIFRoZSBjb21wb25lbnQgZnJvbSB3aGljaCB0aGUgbGFzdCBtb3VzZSBldmVudCB3YXMgdGhyb3duICovCi0JCXByaXZhdGUgSkNvbXBvbmVudCBldmVudENvbXBvbmVudDsKLQkJCi0JCS8qKiBUaGUgbG9jYXRpb24gb2YgdGhlIGNvbXBvbmVudCBhdCB0aGUgdGltZSB0aGUgbGFzdCBtb3VzZSBldmVudCB3YXMgdGhyb3duICovCi0JCXByaXZhdGUgUG9pbnQgY29tcG9uZW50TG9jYXRpb247Ci0JCQotCQkvKiogVGhlIGxvY2F0aW9uIG9mIHRoZSBtb3VzZSBhdCB0aGUgdGltZSB0aGUgbGFzdCBtb3VzZSBldmVudCB3YXMgdGhyb3duICovCi0JCXByaXZhdGUgUG9pbnQgbW91c2VMb2NhdGlvbjsKLQkJCi0JCQotCQlQb3B1cEhhbmRsZXIoKSB7Ci0JCQl0aGlzLmluaXRpYWxpemUoKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCQlBV1RFdmVudCBldmVudCA9IEV2ZW50UXVldWUuZ2V0Q3VycmVudEV2ZW50KCk7Ci0JCQkKLQkJCWlmIChldmVudCBpbnN0YW5jZW9mIE1vdXNlRXZlbnQpIHsKLQkJCQl0aGlzLmxhc3RNb3VzZUV2ZW50ID0gKE1vdXNlRXZlbnQpIGV2ZW50OwotCQkJCXRoaXMuZXZlbnRDb21wb25lbnQgPSAoSkNvbXBvbmVudCkgdGhpcy5sYXN0TW91c2VFdmVudC5nZXRTb3VyY2UoKTsKLQkJCQl0aGlzLmNvbXBvbmVudExvY2F0aW9uID0gdGhpcy5ldmVudENvbXBvbmVudC5nZXRMb2NhdGlvbk9uU2NyZWVuKCk7Ci0JCQkJdGhpcy5tb3VzZUxvY2F0aW9uID0gdGhpcy5sYXN0TW91c2VFdmVudC5nZXRQb2ludCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5ldmVudENvbXBvbmVudCA9IG51bGw7Ci0JCQkJdGhpcy5jb21wb25lbnRMb2NhdGlvbiA9IG51bGw7Ci0JCQkJdGhpcy5tb3VzZUxvY2F0aW9uID0gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJTGlzdENob29zZXIudGhpcy5oaWRlUG9wdXAoKTsKLQkJCQotICAgICAgICAgICAgY2FjaGVMaXN0KCk7Ci0JCQlpZiAoTGlzdENob29zZXIudGhpcy5jaG9vc2FibGUgPT0gdHJ1ZSkgewotCQkJCS8vIElmIHRoZSBjb21ibyBib3ggbW9kZWwgaXMgb2Ygc3VmZmljaWVudCBsZW5ndGgsIHRoZSBicm93c2VyIHdpbGwgYmUgc2hvd24uCi0JCQkJLy8gQXNraW5nIHRoZSBjb21ibyBib3ggbW9kZWwgZm9yIGl0cyBzaXplIHNob3VsZCBiZSBlbm91Z2ggdG8gZW5zdXJlIHRoYXQgCi0JCQkJLy8gIGl0cyBzaXplIGlzIHJlY2FsY3VsYXRlZC4KLQkJCQlpZiAoTGlzdENob29zZXIudGhpcy5nZXRNb2RlbCgpLmdldFNpemUoKSA+IExpc3RDaG9vc2VyLnRoaXMubG9uZ0xpc3RTaXplKSB7Ci0JCQkJCXRoaXMuY2hlY2tDb21ib0JveEJ1dHRvbigpOwotCQkJCQlMaXN0Q2hvb3Nlci50aGlzLmJyb3dzZSgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTGlzdENob29zZXIudGhpcy5zaG93UG9wdXAoKTsKLQkJCQkJdGhpcy5jaGVja01vdXNlUG9zaXRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0gICAgICAgICAgICBpZiAobGlzdElzQ2FjaGVkKCkpIHsKLSAgICAgICAgICAgICAgICB1bmNhY2hlTGlzdCgpOwotICAgICAgICAgICAgfQotCQkJCi0JCQlMaXN0Q2hvb3Nlci50aGlzLnBvcHVwQWxyZWFkeUluUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJfQotCQkKLQkJLyoqIElmIHRoaXMgaXMgbm90IGRvbmUsIHRoZSBidXR0b24gbmV2ZXIgYmVjb21lcyB1bi1wcmVzc2VkICovCi0JCXByaXZhdGUgdm9pZCBjaGVja0NvbWJvQm94QnV0dG9uKCkgewotCQkJdHJ5IHsKLQkJCQlCYXNpY0NvbWJvQm94VUkgY29tYm9Cb3hVaSA9IChCYXNpY0NvbWJvQm94VUkpIExpc3RDaG9vc2VyLnRoaXMuZ2V0VUkoKTsKLQkJCQlKQnV0dG9uIGFycm93QnV0dG9uID0gKEpCdXR0b24pIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKGNvbWJvQm94VWksICJhcnJvd0J1dHRvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYXJyb3dCdXR0b24uZ2V0TW9kZWwoKS5zZXRQcmVzc2VkKGZhbHNlKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyB0aGlzIGlzIGEgaHVnZSBoYWNrIHRvIHRyeSBhbmQgbWFrZSB0aGUgY29tYm8gYm94IGxvb2sgcmlnaHQsCi0JCQkJLy8gc28gaWYgaXQgZG9lc24ndCB3b3JrLCBqdXN0IHN3YWxsb3cgdGhlIGV4Y2VwdGlvbgotCQkJCXRoaXMuaGFuZGxlRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBoYW5kbGVFeGNlcHRpb24oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEV4Y2VwdGlvbiBleCkgewotCQkJLy8gZG8gbm90aGluZyBmb3Igbm93Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBNb3ZlcyB0aGUgbW91c2UgYmFjayB0byBpdHMgb3JpZ2luYWwgcG9zaXRpb24gYmVmb3JlIGFueSBqaWdnZXJ5IHBva2VyeSB0aGF0IHdlJ3ZlIGRvbmUuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY2hlY2tNb3VzZVBvc2l0aW9uKCkgewotCQkJaWYgKHRoaXMuZXZlbnRDb21wb25lbnQgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJZmluYWwgUG9pbnQgbmV3Q29tcG9uZW50TG9jYXRpb24gPSB0aGlzLmV2ZW50Q29tcG9uZW50LmdldExvY2F0aW9uT25TY3JlZW4oKTsKLQkJCWJvb2xlYW4gY29tcG9uZW50TW92ZWQgPSAKLQkJCQluZXdDb21wb25lbnRMb2NhdGlvbi54IC0gdGhpcy5jb21wb25lbnRMb2NhdGlvbi54ICE9IDAKLQkJCQl8fCBuZXdDb21wb25lbnRMb2NhdGlvbi55IC0gdGhpcy5jb21wb25lbnRMb2NhdGlvbi55ICE9IDA7Ci0JCQkKLQkJCWlmIChjb21wb25lbnRNb3ZlZCkgewotCQkJCXRyeSB7Ci0JCQkJCW5ldyBSb2JvdCgpLm1vdXNlTW92ZSgKLQkJCQkJCW5ld0NvbXBvbmVudExvY2F0aW9uLnggKyB0aGlzLm1vdXNlTG9jYXRpb24ueCwKLQkJCQkJCW5ld0NvbXBvbmVudExvY2F0aW9uLnkgKyB0aGlzLm1vdXNlTG9jYXRpb24ueQotCQkJCQkpOwotCQkJCX0KLQkJCQljYXRjaCAoQVdURXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIG1vdmUgZmFpbGVkIC0gZG8gbm90aGluZwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL05vZGVTZWxlY3Rvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvTm9kZVNlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MDc5YmUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvTm9kZVNlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotLyoqCi0gKiBUaGlzIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyBGMyBvciBjaG9vc2VzCi0gKiAnR28gVG8nIGluIHRoZSBjb250ZXh0IG1lbnUKLSAqLwotcHVibGljIGludGVyZmFjZSBOb2RlU2VsZWN0b3IgCi17ICAgICAgIAotICAgIC8qKgotICAgICAqIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgTm9kZSBpbiB0aGUgdHJlZSBvciB0aGUgZWRpdG9yIHBhbmVsLgotICAgICAqLwotICAgIHZvaWQgc2VsZWN0Tm9kZUZvcihPYmplY3QgaXRlbSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBOb2RlU2VsZWN0b3Igd2lsbCBkbyBub3RoaW5nIHdoZW4gc2VsZWN0Tm9kZUZvcihPYmplY3QpIGlzIGNhbGxlZAotICAgICAqLwotICAgIGNsYXNzIERlZmF1bHROb2RlU2VsZWN0b3IgaW1wbGVtZW50cyBOb2RlU2VsZWN0b3IgewotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0Tm9kZUZvcihPYmplY3QgaXRlbSkgewotICAgICAgICAgICAgLy9kZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9Ob25DYWNoaW5nQ29tYm9Cb3hNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvTm9uQ2FjaGluZ0NvbWJvQm94TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVmOWE3Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9Ob25DYWNoaW5nQ29tYm9Cb3hNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5Db21ib0JveE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3REYXRhTGlzdGVuZXI7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ2FjaGluZ0NvbWJvQm94TW9kZWwgaW50ZXJmYWNlIGNhbiBiZSB1c2VkCi0gKiB3aGVuZXZlciB0aGVyZSBpcyBubyBuZWVkIGZvciBjYWNoaW5nIChpLmUuIHRoZSBjb250ZW50cyBvZiB0aGUgc2VsZWN0aW9uCi0gKiBsaXN0IGNhbiBiZSBnZW5lcmF0ZWQgd2l0aCBsaXR0bGUgbGF0ZW5jeSkuIEFsbCB0aGUgbm9ybWFsIENvbWJvQm94TW9kZWwKLSAqIGJlaGF2aW9yIGlzIGRlbGVnYXRlZCB0byBhIGNsaWVudC1zdXBwbGllZCBDb21ib0JveE1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgTm9uQ2FjaGluZ0NvbWJvQm94TW9kZWwgaW1wbGVtZW50cyBDYWNoaW5nQ29tYm9Cb3hNb2RlbCB7Ci0JcHJpdmF0ZSBDb21ib0JveE1vZGVsIHdyYXBwZWRDb21ib0JveE1vZGVsOwotCi0JcHVibGljIE5vbkNhY2hpbmdDb21ib0JveE1vZGVsKENvbWJvQm94TW9kZWwgd3JhcHBlZENvbWJvQm94TW9kZWwpIHsKLQkJdGhpcy53cmFwcGVkQ29tYm9Cb3hNb2RlbCA9IHdyYXBwZWRDb21ib0JveE1vZGVsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDYWNoaW5nQ29tYm9Cb3hNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBjYWNoZUxpc3QoKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHVuY2FjaGVMaXN0KCkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NhY2hlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21ib0JveE1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkSXRlbShPYmplY3QgYW5JdGVtKSB7Ci0JCXRoaXMud3JhcHBlZENvbWJvQm94TW9kZWwuc2V0U2VsZWN0ZWRJdGVtKGFuSXRlbSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRTZWxlY3RlZEl0ZW0oKSB7Ci0JCXJldHVybiB0aGlzLndyYXBwZWRDb21ib0JveE1vZGVsLmdldFNlbGVjdGVkSXRlbSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0TW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRTaXplKCkgewotCQlyZXR1cm4gdGhpcy53cmFwcGVkQ29tYm9Cb3hNb2RlbC5nZXRTaXplKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRFbGVtZW50QXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLndyYXBwZWRDb21ib0JveE1vZGVsLmdldEVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdERhdGFMaXN0ZW5lcihMaXN0RGF0YUxpc3RlbmVyIGwpIHsKLQkJdGhpcy53cmFwcGVkQ29tYm9Cb3hNb2RlbC5hZGRMaXN0RGF0YUxpc3RlbmVyKGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3REYXRhTGlzdGVuZXIoTGlzdERhdGFMaXN0ZW5lciBsKSB7Ci0JCXRoaXMud3JhcHBlZENvbWJvQm94TW9kZWwucmVtb3ZlTGlzdERhdGFMaXN0ZW5lcihsKTsKLQl9ICAKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlRGlzcGxheWFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NpbXBsZURpc3BsYXlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMGI2YjQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlRGlzcGxheWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBEaXNwbGF5YWJsZSBjb252ZXJ0cyBhbnkgT2JqZWN0Ci0gKiB0byBhIERpc3BsYXlhYmxlLiBTdWJjbGFzcyBpdCB0byBvdmVycmlkZSAjZGlzcGxheVN0cmluZygpIGFuZAotICogI2ljb24oKSBpZiBuZWNlc3NhcnkuIENoYW5nZSBub3RpZmljYXRpb24gd2lsbCBiZSBmaXJlZCBpZiB0aGUKLSAqIG9iamVjdCBpcyBjaGFuZ2VkLgotICogCi0gKiBUaGlzIGNhbiBiZSB1c2VkIGZvciBTdHJpbmdzIC0gdGhlIGRpc3BsYXkgc3RyaW5nCi0gKiB3aWxsIHNpbXBseSBiZSB0aGUgU3RyaW5nIGl0c2VsZi4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZURpc3BsYXlhYmxlCi0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBEaXNwbGF5YWJsZQotewotCS8qKiBUaGUgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZCB0byBhIERpc3BsYXlhYmxlLiAqLwotCXByb3RlY3RlZCBPYmplY3Qgb2JqZWN0OwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBkaXNwbGF5YWJsZSBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICovCi0JcHVibGljIFNpbXBsZURpc3BsYXlhYmxlKE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JfQotCi0JcHVibGljIFNpbXBsZURpc3BsYXlhYmxlKGJvb2xlYW4gYikgewotCQl0aGlzKEJvb2xlYW4udmFsdWVPZihiKSk7Ci0JfQotCi0JcHVibGljIFNpbXBsZURpc3BsYXlhYmxlKGNoYXIgYykgewotCQl0aGlzKENoYXJhY3Rlci52YWx1ZU9mKGMpKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoYnl0ZSBiKSB7Ci0JCXRoaXMoQnl0ZS52YWx1ZU9mKGIpKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoc2hvcnQgcykgewotCQl0aGlzKFNob3J0LnZhbHVlT2YocykpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVEaXNwbGF5YWJsZShpbnQgaSkgewotCQl0aGlzKEludGVnZXIudmFsdWVPZihpKSk7Ci0JfQotCi0JcHVibGljIFNpbXBsZURpc3BsYXlhYmxlKGxvbmcgbCkgewotCQl0aGlzKExvbmcudmFsdWVPZihsKSk7Ci0JfQotCi0JcHVibGljIFNpbXBsZURpc3BsYXlhYmxlKGZsb2F0IGYpIHsKLQkJdGhpcyhGbG9hdC52YWx1ZU9mKGYpKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoZG91YmxlIGQpIHsKLQkJdGhpcyhEb3VibGUudmFsdWVPZihkKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERpc3BsYXlhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIEljb24gaWNvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2Vzc29ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBvbGREaXNwbGF5U3RyaW5nID0gdGhpcy5kaXNwbGF5U3RyaW5nKCk7Ci0JCUljb24gb2xkSWNvbiA9IHRoaXMuaWNvbigpOwotCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBvbGREaXNwbGF5U3RyaW5nLCB0aGlzLmRpc3BsYXlTdHJpbmcoKSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChJQ09OX1BST1BFUlRZLCBvbGRJY29uLCB0aGlzLmljb24oKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbigpIHsKLQkJcmV0dXJuICgoQm9vbGVhbikgdGhpcy5vYmplY3QpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJvb2xlYW4oYm9vbGVhbiBiKSB7Ci0JCXRoaXMuc2V0T2JqZWN0KEJvb2xlYW4udmFsdWVPZihiKSk7Ci0JfQotCi0JcHVibGljIGNoYXIgZ2V0Q2hhcigpIHsKLQkJcmV0dXJuICgoQ2hhcmFjdGVyKSB0aGlzLm9iamVjdCkuY2hhclZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2hhcihjaGFyIGMpIHsKLQkJdGhpcy5zZXRPYmplY3QoQ2hhcmFjdGVyLnZhbHVlT2YoYykpOwotCX0KLQotCXB1YmxpYyBieXRlIGdldEJ5dGUoKSB7Ci0JCXJldHVybiAoKEJ5dGUpIHRoaXMub2JqZWN0KS5ieXRlVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCeXRlKGJ5dGUgYikgewotCQl0aGlzLnNldE9iamVjdChCeXRlLnZhbHVlT2YoYikpOwotCX0KLQotCXB1YmxpYyBzaG9ydCBnZXRTaG9ydCgpIHsKLQkJcmV0dXJuICgoU2hvcnQpIHRoaXMub2JqZWN0KS5zaG9ydFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2hvcnQoc2hvcnQgcykgewotCQl0aGlzLnNldE9iamVjdChTaG9ydC52YWx1ZU9mKHMpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEludCgpIHsKLQkJcmV0dXJuICgoSW50ZWdlcikgdGhpcy5vYmplY3QpLmludFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW50KGludCBpKSB7Ci0JCXRoaXMuc2V0T2JqZWN0KEludGVnZXIudmFsdWVPZihpKSk7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0TG9uZygpIHsKLQkJcmV0dXJuICgoTG9uZykgdGhpcy5vYmplY3QpLmxvbmdWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvbmcobG9uZyBsKSB7Ci0JCXRoaXMuc2V0T2JqZWN0KExvbmcudmFsdWVPZihsKSk7Ci0JfQotCi0JcHVibGljIGZsb2F0IGdldEZsb2F0KCkgewotCQlyZXR1cm4gKChGbG9hdCkgdGhpcy5vYmplY3QpLmZsb2F0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGbG9hdChmbG9hdCBmKSB7Ci0JCXRoaXMuc2V0T2JqZWN0KEZsb2F0LnZhbHVlT2YoZikpOwotCX0KLQotCXB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKCkgewotCQlyZXR1cm4gKChEb3VibGUpIHRoaXMub2JqZWN0KS5kb3VibGVWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvdWJsZShkb3VibGUgZCkgewotCQl0aGlzLnNldE9iamVjdChEb3VibGUudmFsdWVPZihkKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5vYmplY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlTGlzdEJyb3dzZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NpbXBsZUxpc3RCcm93c2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MDA1MzIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlTGlzdEJyb3dzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tYm9Cb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSk9wdGlvblBhbmU7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdE1vZGVsOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgTGlzdENob29zZXIuQnJvd3NlciB1c2VzIGEKLSAqIEpPcHRpb25QYW5lIHRvIHByb21wdCB0aGUgdXNlciBmb3IgdGhlIHNlbGVjdGlvbi4gU3ViY2xhc3NlcyAKLSAqIGNhbiBjaGFuZ2UgdGhlIGRpYWxvZydzIHRpdGxlLCBtZXNzYWdlLCBhbmQvb3IgaWNvbi4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUxpc3RCcm93c2VyCi0JaW1wbGVtZW50cyBMaXN0Q2hvb3Nlci5MaXN0QnJvd3NlciAKLXsKLQkvKiogRGVmYXVsdCBjb25zdHJ1Y3RvciAqLwotCXByb3RlY3RlZCBTaW1wbGVMaXN0QnJvd3NlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogUHJvbXB0IHRoZSB1c2VyIHVzaW5nIGEgSk9wdGlvblBhbmUuCi0JICovCi0JcHVibGljIHZvaWQgYnJvd3NlKExpc3RDaG9vc2VyIGNob29zZXIpIHsKLQkJT2JqZWN0IHNlbGVjdGlvbiA9IAotCQkJSk9wdGlvblBhbmUuc2hvd0lucHV0RGlhbG9nKAotCQkJCWNob29zZXIsIAotCQkJCXRoaXMubWVzc2FnZShjaG9vc2VyKSwgCi0JCQkJdGhpcy50aXRsZShjaG9vc2VyKSwgCi0JCQkJdGhpcy5tZXNzYWdlVHlwZShjaG9vc2VyKSwgCi0JCQkJdGhpcy5pY29uKGNob29zZXIpLCAKLQkJCQl0aGlzLnNlbGVjdGlvblZhbHVlcyhjaG9vc2VyKSwgCi0JCQkJdGhpcy5pbml0aWFsU2VsZWN0aW9uVmFsdWUoY2hvb3NlcikKLQkJCSk7Ci0JCQotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCWNob29zZXIuZ2V0TW9kZWwoKS5zZXRTZWxlY3RlZEl0ZW0oc2VsZWN0aW9uKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IG1lc3NhZ2UoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgaW50IG1lc3NhZ2VUeXBlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIEpPcHRpb25QYW5lLlFVRVNUSU9OX01FU1NBR0U7Ci0JfQotCQotCXByb3RlY3RlZCBJY29uIGljb24oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdFtdIHNlbGVjdGlvblZhbHVlcyhKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydFRvQXJyYXkoY29tYm9Cb3guZ2V0TW9kZWwoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgaW5pdGlhbFNlbGVjdGlvblZhbHVlKEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gY29tYm9Cb3guZ2V0TW9kZWwoKS5nZXRTZWxlY3RlZEl0ZW0oKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCB0aGUgbGlzdCBvZiBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgbGlzdCBtb2RlbAotCSAqIGludG8gYW4gYXJyYXkuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIGNvbnZlcnRUb0FycmF5KExpc3RNb2RlbCBtb2RlbCkgewotCQlpbnQgc2l6ZSA9IG1vZGVsLmdldFNpemUoKTsKLQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IG1vZGVsLmdldEVsZW1lbnRBdChpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NpbXBsZUxpc3RDZWxsUmVuZGVyZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NpbXBsZUxpc3RDZWxsUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiZDI5MC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TaW1wbGVMaXN0Q2VsbFJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuRGVmYXVsdExpc3RDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKLQotLyoqCi0gKiBUaGlzIHJlbmRlcmVyIHNob3VsZCBiZWhhdmUgdGhlIHNhbWUgYXMgdGhlIERlZmF1bHRMaXN0Q2VsbFJlbmRlcmVyOwotICogYnV0IGl0IHNsaWdodGx5IHJlZmFjdG9ycyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGljb24gYW5kIHRleHQgb2YgdGhlIGxpc3QKLSAqIGNlbGwgc28gdGhhdCBzdWJjbGFzc2VzIGNhbiBlYXNpbHkgb3ZlcnJpZGUgdGhlIG1ldGhvZHMgdGhhdCBidWlsZAotICogdGhlIGljb24gYW5kIHRleHQuCi0gKiAKLSAqIEluIG1vc3QgY2FzZXMsIHlvdSBuZWVkIG9ubHkgb3ZlcnJpZGU6Ci0gKiAgICAgI2J1aWxkSWNvbihPYmplY3QgdmFsdWUpCi0gKiAgICAgI2J1aWxkVGV4dChPYmplY3QgdmFsdWUpCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVMaXN0Q2VsbFJlbmRlcmVyCi0JZXh0ZW5kcyBEZWZhdWx0TGlzdENlbGxSZW5kZXJlcgotewotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc2ltcGxlIHJlbmRlcmVyLgotCSAqLwotCXB1YmxpYyBTaW1wbGVMaXN0Q2VsbFJlbmRlcmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDb21wb25lbnQgZ2V0TGlzdENlbGxSZW5kZXJlckNvbXBvbmVudChKTGlzdCBsaXN0LCBPYmplY3QgdmFsdWUsIGludCBpbmRleCwgYm9vbGVhbiBpc1NlbGVjdGVkLCBib29sZWFuIGNlbGxIYXNGb2N1cykgewotCQkvLyBzdWJzdGl0dXRlIG51bGwgZm9yIHRoZSBjZWxsIHZhbHVlIHNvIG5vdGhpbmcgaXMgZHJhd24gaW5pdGlhbGx5Li4uCi0JCXN1cGVyLmdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQobGlzdCwgbnVsbCwgaW5kZXgsIGlzU2VsZWN0ZWQsIGNlbGxIYXNGb2N1cyk7Ci0JCXRoaXMuc2V0T3BhcXVlKHRydWUpOwotCi0JCS8vIC4uLnRoZW4gc2V0IHRoZSBpY29uIGFuZCB0ZXh0IG1hbnVhbGx5Ci0JCXRoaXMuc2V0SWNvbih0aGlzLmJ1aWxkSWNvbihsaXN0LCB2YWx1ZSwgaW5kZXgsIGlzU2VsZWN0ZWQsIGNlbGxIYXNGb2N1cykpOwotCQl0aGlzLnNldFRleHQodGhpcy5idWlsZFRleHQobGlzdCwgdmFsdWUsIGluZGV4LCBpc1NlbGVjdGVkLCBjZWxsSGFzRm9jdXMpKTsKLQotCQl0aGlzLnNldFRvb2xUaXBUZXh0KHRoaXMuYnVpbGRUb29sVGlwVGV4dChsaXN0LCB2YWx1ZSwgaW5kZXgsIGlzU2VsZWN0ZWQsIGNlbGxIYXNGb2N1cykpOwotCi0JCS8vIHRoZSBjb250ZXh0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgb25seSBpZiBhIHJlYWRlciBpcyBydW5uaW5nCi0JCWlmICh0aGlzLmFjY2Vzc2libGVDb250ZXh0ICE9IG51bGwpIHsKLQkJCXRoaXMuYWNjZXNzaWJsZUNvbnRleHQuc2V0QWNjZXNzaWJsZU5hbWUodGhpcy5idWlsZEFjY2Vzc2libGVOYW1lKGxpc3QsIHZhbHVlLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKSk7Ci0JCX0KLQotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGljb24gcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBjZWxsCi0JICogdmFsdWUgYW5kIG90aGVyIHNldHRpbmdzLiAoRXZlbiBtb3JlIHNldHRpbmdzIGFyZQotCSAqIGFjY2Vzc2libGUgdmlhIGluaGVyaXRlZCBnZXR0ZXJzOiBoYXNGb2N1cywgaXNFbmFibGVkLCBldGMuKQotCSAqLwotCXByb3RlY3RlZCBJY29uIGJ1aWxkSWNvbihAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IGluZGV4LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBpc1NlbGVjdGVkLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJY29uKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGljb24gcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBjZWxsCi0JICogdmFsdWUuIFRoZSBkZWZhdWx0IGlzIHRvIGRpc3BsYXkgbm8gaWNvbiBhdCBhbGwgdW5sZXNzIHRoZQotCSAqIHZhbHVlIGl0c2VsZiBpcyBhbiBpY29uLgotCSAqLwotCXByb3RlY3RlZCBJY29uIGJ1aWxkSWNvbihPYmplY3QgdmFsdWUpIHsKLQkJLy8gcmVwbGljYXRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yCi0JCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBJY29uKSA/IChJY29uKSB2YWx1ZSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgY2VsbAotCSAqIHZhbHVlIGFuZCBvdGhlciBzZXR0aW5ncy4gKEV2ZW4gbW9yZSBzZXR0aW5ncyBhcmUKLQkgKiBhY2Nlc3NpYmxlIHZpYSBpbmhlcml0ZWQgZ2V0dGVyczogaGFzRm9jdXMsIGlzRW5hYmxlZCwgZXRjLikKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVGV4dChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IGluZGV4LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBpc1NlbGVjdGVkLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUZXh0KHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBjZWxsCi0JICogdmFsdWUuIFRoZSBkZWZhdWx0IGlzIHRvIGRpc3BsYXkgdGhlIG9iamVjdCdzIGRlZmF1bHQgc3RyaW5nCi0JICogcmVwcmVzZW50YXRpb24gKGFzIHJldHVybmVkIGJ5ICN0b1N0cmluZygpKTsgdW5sZXNzIHRoZQotCSAqIHZhbHVlIGl0c2VsZiBpcyBhbiBpY29uLCBpbiB3aGljaCBjYXNlIG5vIHRleHQgaXMgZGlzcGxheWVkLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRUZXh0KE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgSWNvbikgPyAiIiA6ICgodmFsdWUgPT0gbnVsbCkgPyAiIiA6IHZhbHVlLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgZGlzcGxheWVkIHdoZW4gdGhlIGN1cnNvciBsaW5nZXJzIG92ZXIgdGhlIHNwZWNpZmllZCBjZWxsLgotCSAqIChFdmVuIG1vcmUgc2V0dGluZ3MgYXJlIGFjY2Vzc2libGUgdmlhIGluaGVyaXRlZCBnZXR0ZXJzOiBoYXNGb2N1cywgaXNFbmFibGVkLCBldGMuKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRUb29sVGlwVGV4dChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IGluZGV4LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBpc1NlbGVjdGVkLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUb29sVGlwVGV4dCh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXh0IGRpc3BsYXllZCB3aGVuIHRoZSBjdXJzb3IgbGluZ2VycyBvdmVyIHRoZSBzcGVjaWZpZWQgY2VsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVG9vbFRpcFRleHQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFjY2Vzc2libGUgbmFtZSB0byBiZSBnaXZlbiB0byB0aGUgY29tcG9uZW50IHVzZWQgdG8gcmVuZGVyCi0JICogdGhlIGdpdmVuIHZhbHVlIGFuZCBvdGhlciBzZXR0aW5ncy4gKEV2ZW4gbW9yZSBzZXR0aW5ncyBhcmUgYWNjZXNzaWJsZSB2aWEKLQkgKiBpbmhlcml0ZWQgZ2V0dGVyczogaGFzRm9jdXMsIGlzRW5hYmxlZCwgZXRjLikKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkQWNjZXNzaWJsZU5hbWUoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCBpbmRleCwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGJvb2xlYW4gaXNTZWxlY3RlZCwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGJvb2xlYW4gY2VsbEhhc0ZvY3VzKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQWNjZXNzaWJsZU5hbWUodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWNjZXNzaWJsZSBuYW1lIHRvIGJlIGdpdmVuIHRvIHRoZSBjb21wb25lbnQgdXNlZCB0byByZW5kZXIKLQkgKiB0aGUgZ2l2ZW4gdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZEFjY2Vzc2libGVOYW1lKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TcGlubmVyVGFibGVDZWxsUmVuZGVyZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NwaW5uZXJUYWJsZUNlbGxSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTdhZGEyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NwaW5uZXJUYWJsZUNlbGxSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5KU3Bpbm5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5KVGFibGU7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLlVJTWFuYWdlcjsKLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQm9yZGVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIE1ha2UgdGhlIGNlbGwgbG9vayBsaWtlIGEgc3Bpbm5lci4KLSAqLwotcHVibGljIGNsYXNzIFNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlciBpbXBsZW1lbnRzIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuUmVuZGVyZXIgewotCi0JLyoqIHRoZSBjb21wb25lbnQgdXNlZCB0byBwYWludCB0aGUgY2VsbCAqLwotCXByb3RlY3RlZCBKU3Bpbm5lciBzcGlubmVyOwotCQotCS8qKiB0aGUgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgb24gYW4gaW1tZWRpYXRlIGVkaXQgKi8KLQlwcm90ZWN0ZWQgVGFibGVDZWxsRWRpdG9yQWRhcHRlci5JbW1lZGlhdGVFZGl0TGlzdGVuZXIgaW1tZWRpYXRlRWRpdExpc3RlbmVyOwotCQotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgdGhhdCB1c2VzIHRoZSBkZWZhdWx0Ci0JICogc3Bpbm5lciBtb2RlbCwgd2hpY2ggaXMgYSAibnVtYmVyIiBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkCi0JICogc3Bpbm5lciBtb2RlbCwgd2hpY2ggd2lsbCBkZXRlcm1pbmUgaG93IHRoZSB2YWx1ZXMgYXJlIGRpc3BsYXllZC4KLQkgKi8KLQlwdWJsaWMgU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyKFNwaW5uZXJNb2RlbCBtb2RlbCkgewotCQl0aGlzKCk7Ci0JCXRoaXMuc2V0TW9kZWwobW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuc3Bpbm5lciA9IHRoaXMuYnVpbGRTcGlubmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEpTcGlubmVyIGJ1aWxkU3Bpbm5lcigpIHsKLQkJSlNwaW5uZXIgcyA9IG5ldyBKU3Bpbm5lcigpOwotCQlzLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJcmV0dXJuIHM7Ci0JfQotCQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJaWYgKFNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlci50aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCVNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlci50aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lci5pbW1lZGlhdGVFZGl0KCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUYWJsZUNlbGxSZW5kZXJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgQ29tcG9uZW50IGdldFRhYmxlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KEpUYWJsZSB0YWJsZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCXRoaXMuc3Bpbm5lci5zZXRDb21wb25lbnRPcmllbnRhdGlvbih0YWJsZS5nZXRDb21wb25lbnRPcmllbnRhdGlvbigpKTsKLQkJdGhpcy5zcGlubmVyLnNldEZvbnQodGFibGUuZ2V0Rm9udCgpKTsKLQkJdGhpcy5zcGlubmVyLnNldEVuYWJsZWQodGFibGUuaXNFbmFibGVkKCkpOwotCi0JCUpDb21wb25lbnQgZWRpdG9yID0gdGhpcy5lZGl0b3IoKTsKLQkJZWRpdG9yLnNldEZvcmVncm91bmQodGhpcy5mb3JlZ3JvdW5kQ29sb3IodGFibGUsIHZhbHVlLCBzZWxlY3RlZCwgaGFzRm9jdXMsIHJvdywgY29sdW1uKSk7Ci0JCWVkaXRvci5zZXRCYWNrZ3JvdW5kKHRoaXMuYmFja2dyb3VuZENvbG9yKHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIGhhc0ZvY3VzLCByb3csIGNvbHVtbikpOwotCQl0aGlzLnNwaW5uZXIuc2V0Qm9yZGVyKHRoaXMuYm9yZGVyKHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIGhhc0ZvY3VzLCByb3csIGNvbHVtbikpOwotCi0JCXRoaXMuc2V0VmFsdWUodmFsdWUpOwotCQlyZXR1cm4gdGhpcy5zcGlubmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGZvcmVncm91bmQgY29sb3IuCi0JICovCi0JcHJvdGVjdGVkIENvbG9yIGZvcmVncm91bmRDb2xvcihKVGFibGUgdGFibGUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQlpZiAoaGFzRm9jdXMgJiYgdGFibGUuaXNDZWxsRWRpdGFibGUocm93LCBjb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIFVJTWFuYWdlci5nZXRDb2xvcigiVGFibGUuZm9jdXNDZWxsRm9yZWdyb3VuZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gdGFibGUuZ2V0U2VsZWN0aW9uRm9yZWdyb3VuZCgpOwotCQl9Ci0JCXJldHVybiB0YWJsZS5nZXRGb3JlZ3JvdW5kKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgYmFja2dyb3VuZCBjb2xvci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sb3IgYmFja2dyb3VuZENvbG9yKEpUYWJsZSB0YWJsZSwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBoYXNGb2N1cywgaW50IHJvdywgaW50IGNvbHVtbikgewotCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCWlmIChoYXNGb2N1cyAmJiB0YWJsZS5pc0NlbGxFZGl0YWJsZShyb3csIGNvbHVtbikpIHsKLQkJCQlyZXR1cm4gVUlNYW5hZ2VyLmdldENvbG9yKCJUYWJsZS5mb2N1c0NlbGxCYWNrZ3JvdW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiB0YWJsZS5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCk7Ci0JCX0KLQkJcmV0dXJuIHRhYmxlLmdldEJhY2tncm91bmQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNlbGwncyBib3JkZXIuCi0JICovCi0JcHJvdGVjdGVkIEJvcmRlciBib3JkZXIoSlRhYmxlIHRhYmxlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IHJvdywgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCBjb2x1bW4pIHsKLQkJaWYgKGhhc0ZvY3VzKSB7Ci0JCQlyZXR1cm4gVUlNYW5hZ2VyLmdldEJvcmRlcigiVGFibGUuZm9jdXNDZWxsSGlnaGxpZ2h0Qm9yZGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCXJldHVybiBCb3JkZXJGYWN0b3J5LmNyZWF0ZUxpbmVCb3JkZXIodGFibGUuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpLCAxKTsKLQkJfQotCQlyZXR1cm4gQm9yZGVyRmFjdG9yeS5jcmVhdGVMaW5lQm9yZGVyKHRhYmxlLmdldEJhY2tncm91bmQoKSwgMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlZGl0b3IgY29tcG9uZW50IHdob3NlIGNvbG9ycyBzaG91bGQgYmUgc2V0Ci0JICogYnkgdGhlIHJlbmRlcmVyLgotCSAqLwotCXByb3RlY3RlZCBKQ29tcG9uZW50IGVkaXRvcigpIHsKLQkJSkNvbXBvbmVudCBlZGl0b3IgPSB0aGlzLnNwaW5uZXIuZ2V0RWRpdG9yKCk7Ci0JCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBKU3Bpbm5lci5EZWZhdWx0RWRpdG9yKSB7Ci0JCQkvLyB0eXBpY2FsbHksIHRoZSBlZGl0b3Igd2lsbCBiZSB0aGUgZGVmYXVsdCBvciBvbmUgb2YgaXRzIHN1YmNsYXNzZXMuLi4KLQkJCWVkaXRvciA9ICgoSlNwaW5uZXIuRGVmYXVsdEVkaXRvcikgZWRpdG9yKS5nZXRUZXh0RmllbGQoKTsKLQkJfQotCQlyZXR1cm4gZWRpdG9yOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3Bpbm5lcidzIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCS8vIENSIzM5OTkzMTggLSBUaGlzIG51bGwgY2hlY2sgbmVlZHMgdG8gYmUgcmVtb3ZlZCBvbmNlIEpESyBidWcgaXMgZml4ZWQKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gSW50ZWdlci52YWx1ZU9mKDApOwotCQl9Ci0JCXRoaXMuc3Bpbm5lci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuUmVuZGVyZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3Bpbm5lci5nZXRWYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbW1lZGlhdGVFZGl0TGlzdGVuZXIoVGFibGVDZWxsRWRpdG9yQWRhcHRlci5JbW1lZGlhdGVFZGl0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5pbW1lZGlhdGVFZGl0TGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXQgdGhlIHNwaW5uZXIncyBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChTcGlubmVyTW9kZWwgbW9kZWwpIHsKLQkJdGhpcy5zcGlubmVyLnNldE1vZGVsKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlbmRlcmVyJ3MgcHJlZmVycmVkIGhlaWdodC4gVGhpcyBhbGxvd3MgeW91Ci0JICogdG8gc2V0IHRoZSByb3cgaGVpZ2h0IHRvIHNvbWV0aGluZyB0aGUgc3Bpbm5lciB3aWxsIGxvb2sgZ29vZCBpbi4uLi4KLQkgKi8KLQlwdWJsaWMgaW50IHByZWZlcnJlZEhlaWdodCgpIHsKLQkJLy8gYWRkIGluIHNwYWNlIGZvciB0aGUgYm9yZGVyIHRvcCBhbmQgYm90dG9tCi0JCXJldHVybiAoaW50KSB0aGlzLnNwaW5uZXIuZ2V0UHJlZmVycmVkU2l6ZSgpLmdldEhlaWdodCgpICsgMjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL1RhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL1RhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlODJiYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9UYWJsZUNlbGxFZGl0b3JBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdENlbGxFZGl0b3I7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRhYmxlOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlQ2VsbEVkaXRvcjsKLWltcG9ydCBqYXZheC5zd2luZy50YWJsZS5UYWJsZUNlbGxSZW5kZXJlcjsKLQotLyoqCi0gKiBBIHRhYmxlIGNlbGwgZWRpdG9yIHRoYXQgd3JhcHMgYSB0YWJsZSBjZWxsIHJlbmRlcmVyLgotICovCi1wdWJsaWMgY2xhc3MgVGFibGVDZWxsRWRpdG9yQWRhcHRlciBleHRlbmRzIEFic3RyYWN0Q2VsbEVkaXRvciBpbXBsZW1lbnRzIFRhYmxlQ2VsbEVkaXRvciB7Ci0KLQkvKiogZGVsZWdhdGUgdG8gYSByZW5kZXJlciAqLwotCXByaXZhdGUgUmVuZGVyZXIgcmVuZGVyZXI7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCQotCXByaXZhdGUgVGFibGVDZWxsRWRpdG9yQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCBlZGl0b3IgdGhhdCBiZWhhdmVzIGxpa2UgdGhlIHNwZWNpZmllZCByZW5kZXJlci4KLQkgKi8KLQlwdWJsaWMgVGFibGVDZWxsRWRpdG9yQWRhcHRlcihSZW5kZXJlciByZW5kZXJlcikgewotCQl0aGlzKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZShyZW5kZXJlcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoUmVuZGVyZXIgcikgewotCQl0aGlzLnJlbmRlcmVyID0gcjsKLQkJci5zZXRJbW1lZGlhdGVFZGl0TGlzdGVuZXIodGhpcy5idWlsZEltbWVkaWF0ZUVkaXRMaXN0ZW5lcigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJbW1lZGlhdGVFZGl0TGlzdGVuZXIgYnVpbGRJbW1lZGlhdGVFZGl0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSW1tZWRpYXRlRWRpdExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaW1tZWRpYXRlRWRpdCgpIHsKLQkJCQlUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLnRoaXMuc3RvcENlbGxFZGl0aW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogQ2VsbEVkaXRvciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JcHVibGljIE9iamVjdCBnZXRDZWxsRWRpdG9yVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnJlbmRlcmVyLmdldFZhbHVlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogVGFibGVDZWxsRWRpdG9yIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBDb21wb25lbnQgZ2V0VGFibGVDZWxsRWRpdG9yQ29tcG9uZW50KEpUYWJsZSB0YWJsZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLnJlbmRlcmVyLmdldFRhYmxlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIHRydWUsIHJvdywgY29sdW1uKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBNZW1iZXIgY2xhc3NlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgbWV0aG9kcyB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYSByZW5kZXJlcgotCSAqIHRoYXQgY2FuIGJlIHdyYXBwZWQgYnkgYSBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXIgZXh0ZW5kcyBUYWJsZUNlbGxSZW5kZXJlciB7Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSByZW5kZXJlci4KLQkJICovCi0JCU9iamVjdCBnZXRWYWx1ZSgpOwotCQkKLQkJLyoqCi0JCSAqIFNldCB0aGUgaW1tZWRpYXRlIGVkaXQgbGlzdGVuZXIKLQkJICovCi0JCXZvaWQgc2V0SW1tZWRpYXRlRWRpdExpc3RlbmVyKEltbWVkaWF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JfQotCQotCQotCXB1YmxpYyBpbnRlcmZhY2UgSW1tZWRpYXRlRWRpdExpc3RlbmVyIHsKLQkJCi0JCS8qKgotCQkgKiBDYWxsZWQgd2hlbiB0aGUgcmVuZGVyZXIgZG9lcyBhbiAiaW1tZWRpYXRlIGVkaXQiCi0JCSAqLwotCQl2b2lkIGltbWVkaWF0ZUVkaXQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0NhbGxiYWNrU3luY2hyb25vdXNTeW5jaHJvbml6ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvQ2FsbGJhY2tTeW5jaHJvbm91c1N5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzc3NDAzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvQ2FsbGJhY2tTeW5jaHJvbm91c1N5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycy5DYWxsYmFja1N5bmNocm9uaXplcjsKLQotLyoqCi0gKiBFeHRlbmQgdGhlIHN5bmNocm9ub3VzIHN5bmNocm9uaXplciB0byBub3RpZnkgbGlzdGVuZXJzCi0gKiB3aGVuIGEgc3luY2hyb25pemF0aW9uICJjeWNsZSIgaXMgY29tcGxldGU7IGkuZS4gdGhlIHN5bmNocm9uaXphdGlvbiBoYXMsCi0gKiBmb3IgdGhlIG1vbWVudCwgaGFuZGxlZCBldmVyeSAic3luY2hyb25pemUiIHJlcXVlc3QgYW5kIHF1aWVzY2VkLgotICogVGhpcyBub3RpZmljYXRpb24gaXMgPGVtPm5vdDwvZW0+IGd1YXJhbnRlZWQgdG8gb2NjdXIgd2l0aCA8ZW0+ZXZlcnk8L2VtPgotICogc3luY2hyb25pemF0aW9uICJjeWNsZSI7Ci0gKiBzaW5jZSBvdGhlciwgdW5yZWxhdGVkLCBzeW5jaHJvbml6YXRpb25zIGNhbiBiZSB0cmlnZ2VyZWQgY29uY3VycmVudGx5LgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBJZiBhbm90aGVyIHN5bmNocm9uaXphdGlvbiBpcyBpbml0aWF0ZWQgd2hpbGUgd2UgYXJlCi0gKiBub3RpZnlpbmcgdGhlIHN5bmNocm9uaXplcidzIGxpc3RlbmVycyAoaS5lLiB0aGUgJ2FnYWluJyBmbGFnIGlzIHNldCksIGl0IHdpbGwgbm90Ci0gKiBzdGFydCB1bnRpbCBhbGwgdGhlIGxpc3RlbmVycyBhcmUgbm90aWZpZWQuCi0gKiBOb3RlIGFsc28sIHRoZSBzeW5jaHJvbml6ZXIncyBsaXN0ZW5lcnMgY2FuLCB0aGVtc2VsdmVzLAotICogdHJpZ2dlciBhbm90aGVyIHN5bmNocm9uaXphdGlvbiAoYnkgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBjYWxsaW5nCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnMuU3luY2hyb25pemVyI3N5bmNocm9uaXplKCl9KTsKLSAqIGJ1dCB0aGlzIHN5bmNocm9uaXphdGlvbiB3aWxsIG5vdCBvY2N1ciB1bnRpbCA8ZW0+YWZ0ZXI8L2VtPiBhbGwgdGhlCi0gKiBsaXN0ZW5lcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLgotICovCi1wdWJsaWMgY2xhc3MgQ2FsbGJhY2tTeW5jaHJvbm91c1N5bmNocm9uaXplcgotCWV4dGVuZHMgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIKLQlpbXBsZW1lbnRzIENhbGxiYWNrU3luY2hyb25pemVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2FsbGJhY2sgc3luY2hyb25vdXMgc3luY2hyb25pemVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkCi0JICogY29tbWFuZCB0byBwZXJmb3JtIHRoZSBzeW5jaHJvbml6YXRpb24uCi0JICovCi0JcHVibGljIENhbGxiYWNrU3luY2hyb25vdXNTeW5jaHJvbml6ZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXN1cGVyKGNvbW1hbmQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDYWxsYmFja1N5bmNocm9uaXplciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN5bmNocm9uaXphdGlvblF1aWVzY2VkKCkgewotCQlmb3IgKExpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCWxpc3RlbmVyLnN5bmNocm9uaXphdGlvblF1aWVzY2VkKHRoaXMpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXZvaWQgZXhlY3V0ZV8oKSB7Ci0JCXN1cGVyLmV4ZWN1dGVfKCk7Ci0JCWlmICh0aGlzLnN0YXRlLmdldFZhbHVlKCkgIT0gU3RhdGUuUkVQRUFUKSB7Ci0JCQkvLyBobW1tIC0gd2Ugd2lsbCBub3RpZnkgbGlzdGVuZXJzIGV2ZW4gd2hlbiB3ZSBhcmUgInN0b3BwZWQiOwotCQkJLy8gdGhhdCBzZWVtcyBvay4uLiAgfmJqdgotCQkJdGhpcy5zeW5jaHJvbml6YXRpb25RdWllc2NlZCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3luY2hyb25pemVycy9TeW5jaHJvbm91c1N5bmNocm9uaXplci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3luY2hyb25pemVycy9TeW5jaHJvbm91c1N5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2I5Nzk2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvU3luY2hyb25vdXNTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db21wb3NpdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnMuU3luY2hyb25pemVyOwotCi0vKioKLSAqIFRoaXMgc3luY2hyb25pemVyIHdpbGwgc3luY2hyb25pemUgaW1tZWRpYXRlbHkgYW5kIG5vdCByZXR1cm4gdW50aWwgdGhlCi0gKiBzeW5jaHJvbml6YXRpb24gYW5kIGFueSBuZXN0ZWQgKHJlY3Vyc2l2ZSkgc3luY2hyb25pemF0aW9ucyBhcmUgY29tcGxldGUuCi0gKiBJbiBzb21lIHNpdHVhdGlvbnMgdGhpcyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgdXNlZCBzcGFyaW5nbHksIGFuZCBmb3IgYXMKLSAqIHNob3J0IGEgdGltZSBhcyBwb3NzaWJsZSwgYXMgaXQgaW5jcmVhc2VzIHRoZSBwcm9iYWJpbGl0eSBvZiBkZWFkbG9ja3MuIEEKLSAqIGRlYWRsb2NrIGNhbiBvY2N1ciB3aGVuIHtAbGluayBTeW5jaHJvbml6ZXIjc3luY2hyb25pemUoKX0gaXMgY2FsbGVkIGZyb20gbXVsdGlwbGUKLSAqIHRocmVhZHMgYW5kIG11bHRpcGxlIHJlc291cmNlcyBhcmUgbG9ja2VkIGJ5IHRoZSBzeW5jaHJvbml6YXRpb24gaW4gdmFyeWluZwotICogb3JkZXJzLgotICogPHA+Ci0gKiBBcyBkZWZpbmVkIGluIHRoZSB7QGxpbmsgU3luY2hyb25pemVyfSBpbnRlcmZhY2UsIHtAbGluayBTeW5jaHJvbml6ZXIjc3RhcnQoKX0KLSAqIGFuZCB7QGxpbmsgU3luY2hyb25pemVyI3N0b3AoKX0KLSAqIHNob3VsZCBiZSBjYWxsZWQgaW4gdGhlIHNhbWUgdGhyZWFkLCBidXQgaXQgaXMgbm90IHJlcXVpcmVkLgotICoge0BsaW5rIFN5bmNocm9uaXplciNzeW5jaHJvbml6ZSgpfSBzaG91bGQKLSAqIGFsd2F5cyBiZSBjYWxsZWQgaW4gdGhlIHNhbWUgdGhyZWFkIChpLmUuIG9ubHkgcmVjdXJzaXZlbHksIGJleW9uZCB0aGUKLSAqIGluaXRpYWwgY2FsbCk7IGFsdGhvdWdoLCB0aGlzIHRvbyBpcyBub3QgcmVxdWlyZWQuCi0gKiBUaGlzIHRocmVhZCBuZWVkIG5vdCBiZSB0aGUgc2FtZSB0aHJlYWQgdGhhdCBleGVjdXRlcwotICoge0BsaW5rIFN5bmNocm9uaXplciNzdGFydCgpfSBhbmQge0BsaW5rIFN5bmNocm9uaXplciNzdG9wKCl9LgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIKLQlpbXBsZW1lbnRzIFN5bmNocm9uaXplcgotewotCS8qKgotCSAqIFRoZSBjbGllbnQtc3VwcGxpZWQgY29tbWFuZCB0aGF0IHBlcmZvcm1zIHRoZSBzeW5jaHJvbml6YXRpb24uIEl0IG1heQotCSAqIHRyaWdnZXIgZnVydGhlciBjYWxscyB0byB7QGxpbmsgI3N5bmNocm9uaXplKCl9IChpLmUuIHRoZQotCSAqIHN5bmNocm9uaXphdGlvbiBtYXkgcmVjdXJzZSkuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb21tYW5kIGNvbW1hbmQ7Ci0KLQkvKioKLQkgKiBUaGUgc3luY2hyb25pemVyJ3MgY3VycmVudCBzdGF0ZS4KLQkgKi8KLQlmaW5hbCBTeW5jaHJvbml6ZWRPYmplY3Q8U3RhdGU+IHN0YXRlOwotCi0JLyoqCi0JICogVGhlIHN5bmNocm9uaXplcidzIGluaXRpYWwgc3RhdGUgaXMge0BsaW5rICNTVE9QUEVEfS4KLQkgKi8KLQllbnVtIFN0YXRlIHsKLQkJU1RPUFBFRCwKLQkJUkVBRFksCi0JCUVYRUNVVElORywKLQkJUkVQRUFULAotCQlTVE9QUElORwotCX0KLQotCS8qKgotCSAqIEEgbGlzdCBvZiB0aGUgdW5jYXVnaHQgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JZmluYWwgVmVjdG9yPFRocm93YWJsZT4gZXhjZXB0aW9ucyA9IG5ldyBWZWN0b3I8VGhyb3dhYmxlPigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzeW5jaHJvbm91cyBzeW5jaHJvbml6ZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgY29tbWFuZCB0bwotCSAqIHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChjb21tYW5kID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0JCS8vIHVzZSB0aGUgc3luY2hyb25pemVyIGFzIHRoZSBtdXRleCBzbyBpdCBpcyBmcmVlZCB1cCBieSB0aGUgd2FpdCBpbiAjc3RvcCgpCi0JCXRoaXMuc3RhdGUgPSBuZXcgU3luY2hyb25pemVkT2JqZWN0PFN0YXRlPihTdGF0ZS5TVE9QUEVELCB0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3luY2hyb25pemVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgc3luY2hyb25pemVyJ3Mge0BsaW5rICNzdGF0ZX0gdG8ge0BsaW5rIFN0YXRlI1JFQURZIFJFQURZfQotCSAqIGFuZCBleGVjdXRlIHRoZSBmaXJzdCBzeW5jaHJvbml6YXRpb24uIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUKLQkgKiBzeW5jaHJvbml6ZXIgaXMgbm90IHtAbGluayBTdGF0ZSNTVE9QUEVEIFNUT1BQRUR9LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKLQkJc3dpdGNoICh0aGlzLnN0YXRlLmdldFZhbHVlKCkpIHsKLQkJCWNhc2UgU1RPUFBFRDoKLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLlJFQURZKTsKLQkJCQl0aGlzLnN5bmNocm9uaXplKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFQURZOgotCQkJY2FzZSBFWEVDVVRJTkc6Ci0JCQljYXNlIFJFUEVBVDoKLQkJCWNhc2UgU1RPUFBJTkc6Ci0JCQkJdGhyb3cgdGhpcy5idWlsZElTRSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSXQncyBwb3NzaWJsZSB0byBjb21lIGJhY2sgaGVyZSBpZiB0aGUgc3luY2hyb25pemF0aW9uIGNvbW1hbmQgcmVjdXJzZXMKLQkgKiBhbmQgdHJpZ2dlcnMgYW5vdGhlciBzeW5jaHJvbml6YXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc3luY2hyb25pemUoKSB7Ci0JCWlmICh0aGlzLmJlZ2luU3luY2hyb25pemF0aW9uKCkpIHsKLQkJCXRoaXMuc3luY2hyb25pemVfKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIGNsaWVudCBoYXMgcmVxdWVzdGVkIGEgc3luY2hyb25pemF0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHdlIGNhbiBiZWdpbiBhIG5ldyBzeW5jaHJvbml6YXRpb24uCi0JICogSWYgYSBzeW5jaHJvbml6YXRpb24gaXMgYWxyZWFkeSB1bmRlciB3YXksIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT47Ci0JICogYnV0IHNldCB0aGUge0BsaW5rICNzdGF0ZX0gdG8ge0BsaW5rIFN0YXRlI1JFUEVBVCBSRVBFQVR9Ci0JICogc28gYW5vdGhlciBzeW5jaHJvbml6YXRpb24gd2lsbCBvY2N1ciBvbmNlIHRoZSBjdXJyZW50Ci0JICogc3luY2hyb25pemF0aW9uIGlzIGNvbXBsZXRlLgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gYmVnaW5TeW5jaHJvbml6YXRpb24oKSB7Ci0JCXN3aXRjaCAodGhpcy5zdGF0ZS5nZXRWYWx1ZSgpKSB7Ci0JCQljYXNlIFNUT1BQRUQ6Ci0JCQkJLy8gc3luY2hyb25pemF0aW9uIGlzIG5vdCBhbGxvd2VkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJY2FzZSBSRUFEWToKLQkJCQkvLyBiZWdpbiBhIG5ldyBzeW5jaHJvbml6YXRpb24KLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLkVYRUNVVElORyk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQljYXNlIEVYRUNVVElORzoKLQkJCQkvLyBzZXQgZmxhZyBzbyBhIG5ldyBzeW5jaHJvbml6YXRpb24gd2lsbCBvY2N1ciBvbmNlIHRoZSBjdXJyZW50IG9uZSBpcyBmaW5pc2hlZAotCQkJCXRoaXMuc3RhdGUuc2V0VmFsdWUoU3RhdGUuUkVQRUFUKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQljYXNlIFJFUEVBVDoKLQkJCQkvLyB0aGUgInJlcGVhdCIgZmxhZyBpcyBhbHJlYWR5IHNldAotCQkJCXJldHVybiBmYWxzZTsKLQkJCWNhc2UgU1RPUFBJTkc6Ci0JCQkJLy8gbm8gZnVydGhlciBzeW5jaHJvbml6YXRpb25zIGFyZSBhbGxvd2VkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXRocm93IHRoaXMuYnVpbGRJU0UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgc2V0IG9mICJyZWN1cnNpbmciCi0JICogc3luY2hyb25pemF0aW9ucy4gQW55IHJlY3Vyc2l2ZSBjYWxsIHRvIHtAbGluayAjc3luY2hyb25pemUoKX0gd2lsbAotCSAqIHNpbXBseSBzZXQgdGhlIHtAbGluayAjc3RhdGV9IHRvIHtAbGluayBTdGF0ZSNSRVBFQVQgUkVQRUFUfSwKLQkgKiBjYXVzaW5nIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgYWdhaW4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN5bmNocm9uaXplXygpIHsKLQkJZG8gewotCQkJdGhpcy5leGVjdXRlKCk7Ci0JCX0gd2hpbGUgKHRoaXMucmVwZWF0U3luY2hyb25pemF0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNsaWVudC1zdXBwbGllZCBjb21tYW5kLiBEbyBub3QgYWxsb3cgYW55IHVuaGFuZGxlZAotCSAqIGV4Y2VwdGlvbnMgdG8ga2lsbCB0aGUgdGhyZWFkLiBTdG9yZSB0aGVtIHVwIGZvciBsYXRlciBwYWluLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlKCkgewotCQl0cnkgewotCQkJdGhpcy5leGVjdXRlXygpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLQkJCXRoaXMuZXhjZXB0aW9ucy5hZGQoZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwganVzdCBleGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXZvaWQgZXhlY3V0ZV8oKSB7Ci0JCXRoaXMuY29tbWFuZC5leGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGN1cnJlbnQgc3luY2hyb25pemF0aW9uIGhhcyBmaW5pc2hlZC4KLQkgKiBSZXR1cm4gd2hldGhlciB3ZSBzaG91bGQgYmVnaW4gYW5vdGhlciBzeW5jaHJvbml6YXRpb24uCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZXBlYXRTeW5jaHJvbml6YXRpb24oKSB7Ci0JCXN3aXRjaCAodGhpcy5zdGF0ZS5nZXRWYWx1ZSgpKSB7Ci0JCQljYXNlIFNUT1BQRUQ6Ci0JCQljYXNlIFJFQURZOgotCQkJCXRocm93IHRoaXMuYnVpbGRJU0UoKTsKLQkJCWNhc2UgRVhFQ1VUSU5HOgotCQkJCS8vIHN5bmNocm9uaXphdGlvbiBoYXMgZmluaXNoZWQgYW5kIHRoZXJlIGFyZSBubyBvdXRzdGFuZGluZyByZXF1ZXN0cyBmb3IgYW5vdGhlcjsgcmV0dXJuIHRvICJyZWFkeSIKLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLlJFQURZKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQljYXNlIFJFUEVBVDoKLQkJCQkvLyB0aGUgInJlcGVhdCIgZmxhZyB3YXMgc2V0OyBjbGVhciBpdCBhbmQgc3RhcnQgYW5vdGhlciBzeW5jaHJvbml6YXRpb24KLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLkVYRUNVVElORyk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQljYXNlIFNUT1BQSU5HOgotCQkJCS8vIGEgY2xpZW50IGhhcyBpbml0aWF0ZWQgYSAic3RvcCI7IG1hcmsgdGhlICJzdG9wIiBjb21wbGV0ZSBhbmQgcGVyZm9ybSBubyBtb3JlIHN5bmNocm9uaXphdGlvbnMKLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLlNUT1BQRUQpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQl0aHJvdyB0aGlzLmJ1aWxkSVNFKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBmbGFncyBzbyB0aGF0IG5vIGZ1cnRoZXIgc3luY2hyb25pemF0aW9ucyBvY2N1ci4gSWYgYW55IHVuY2F1Z2h0Ci0JICogZXhjZXB0aW9ucyB3ZXJlIHRocm93biB3aGlsZSB0aGUgc3luY2hyb25pemF0aW9uIHdhcyBleGVjdXRpbmcsCi0JICogd3JhcCB0aGVtIGluIGEgY29tcG9zaXRlIGV4Y2VwdGlvbiBhbmQgdGhyb3cgdGhlIGNvbXBvc2l0ZSBleGNlcHRpb24uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB7Ci0JCXN3aXRjaCAodGhpcy5zdGF0ZS5nZXRWYWx1ZSgpKSB7Ci0JCQljYXNlIFNUT1BQRUQ6Ci0JCQkJdGhyb3cgdGhpcy5idWlsZElTRSgpOwotCQkJY2FzZSBSRUFEWToKLQkJCQkvLyBzaW1wbHkgcmV0dXJuIHRvICJzdG9wcGVkIiBzdGF0ZQotCQkJCXRoaXMuc3RhdGUuc2V0VmFsdWUoU3RhdGUuU1RPUFBFRCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVYRUNVVElORzoKLQkJCWNhc2UgUkVQRUFUOgotCQkJCS8vIHNldCB0aGUgInN0b3BwaW5nIiBmbGFnIGFuZCB3YWl0IHVudGlsIHRoZSBzeW5jaHJvbml6YXRpb24gaGFzIGZpbmlzaGVkCi0JCQkJdGhpcy5zdGF0ZS5zZXRWYWx1ZShTdGF0ZS5TVE9QUElORyk7Ci0JCQkJdGhpcy53YWl0VW50aWxTdG9wcGVkKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNUT1BQSU5HOgotCQkJCXRocm93IHRoaXMuYnVpbGRJU0UoKTsKLQkJfQotCi0JCWlmICh0aGlzLmV4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJVGhyb3dhYmxlW10gdGVtcCA9IHRoaXMuZXhjZXB0aW9ucy50b0FycmF5KG5ldyBUaHJvd2FibGVbdGhpcy5leGNlcHRpb25zLnNpemUoKV0pOwotCQkJdGhpcy5leGNlcHRpb25zLmNsZWFyKCk7Ci0JCQl0aHJvdyBuZXcgQ29tcG9zaXRlRXhjZXB0aW9uKHRlbXApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3YWl0IHdpbGwgZnJlZSB1cCB0aGUgc3luY2hyb25pemVyJ3Mgc3luY2hyb25pemVkIG1ldGhvZHMKLQkgKiAoc2luY2UgdGhlIHN5bmNocm9uaXplciBpcyB0aGUgc3RhdGUncyBtdXRleCkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbFN0b3BwZWQoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLnN0YXRlLndhaXRVbnRpbFZhbHVlSXMoU3RhdGUuU1RPUFBFRCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyB0aGUgdGhyZWFkIHRoYXQgY2FsbGVkICNzdG9wKCkgd2FzIGludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcKLQkJCS8vIGZvciB0aGUgc3luY2hyb25pemF0aW9uIHRvIGZpbmlzaCAtIGlnbm9yZTsKLQkJCS8vICdzdGF0ZScgaXMgc3RpbGwgc2V0IHRvICdTVE9QUElORycsIHNvIHRoZSAjc3luY2hyb25pemVfKCkgbG9vcAotCQkJLy8gd2lsbCBzdGlsbCBzdG9wIC0gd2UganVzdCB3b24ndCB3YWl0IGFyb3VuZCBmb3IgaXQuLi4KLQkJfQotCX0KLQotCXByaXZhdGUgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGJ1aWxkSVNFKCkgewotCQlyZXR1cm4gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic3RhdGU6ICIgKyB0aGlzLnN0YXRlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuc3RhdGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL01vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9Nb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTBjYjI1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL01vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5IG1vZGVscyB0aGF0IG5vdGlmeSBsaXN0ZW5lcnMgb2YKLSAqIGNoYW5nZXMgdG8gYm91bmQgcHJvcGVydGllcywgY29sbGVjdGlvbnMsIGxpc3RzLCBhbmQvb3IgdHJlZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAc2VlIENoYW5nZUxpc3RlbmVyCi0gKiBAc2VlIFN0YXRlQ2hhbmdlTGlzdGVuZXIKLSAqIEBzZWUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotICogQHNlZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIKLSAqIEBzZWUgTGlzdENoYW5nZUxpc3RlbmVyCi0gKiBAc2VlIFRyZWVDaGFuZ2VMaXN0ZW5lcgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbAotICovCi0vLyBUT0RPIHVzZSBvYmplY3RzIChJRHM/KSBpbnN0ZWFkIG9mIHN0cmluZ3MgdG8gaWRlbnRpZnkgYXNwZWN0cz8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWwgewotCi0JLy8gKioqKioqKioqKiBjaGFuZ2UgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBjaGFuZ2UgZXZlbnRzLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgc2FtZSBsaXN0ZW5lciBpcyBhZGRlZCBtb3JlIHRoYW4gb25jZS4KLQkgKiBUaGUgbGlzdGVuZXIgY2Fubm90IGJlIG51bGwuCi0JICovCi0Jdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBjaGFuZ2UgbGlzdGVuZXIuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGUgY2hhbmdlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgc3RhdGUgY2hhbmdlIGV2ZW50cy4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHNhbWUgbGlzdGVuZXIgaXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UuCi0JICogVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXZvaWQgYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHN0YXRlIGNoYW5nZSBsaXN0ZW5lci4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGxpc3RlbmVyIGlzIG51bGwgb3IgaWYgdGhlIGxpc3RlbmVyIHdhcyBuZXZlciBhZGRlZC4KLQkgKi8KLQl2b2lkIHJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQotCS8vICoqKioqKioqKiogcHJvcGVydHkgY2hhbmdlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgcHJvcGVydHkgY2hhbmdlIGV2ZW50cyB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBuYW1lLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgc2FtZSBsaXN0ZW5lciBpcyBhZGRlZCBtb3JlIHRoYW4gb25jZS4KLQkgKiBUaGUgbGlzdGVuZXIgY2Fubm90IGJlIG51bGwuCi0JICovCi0Jdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzLAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBuYW1lLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbCBvciBpZiB0aGUgbGlzdGVuZXIgd2FzIG5ldmVyIGFkZGVkLgotCSAqLwotCXZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uIGNoYW5nZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50cyB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG5hbWUuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBzYW1lIGxpc3RlbmVyIGlzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLgotCSAqIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQl2b2lkIGFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50cywKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBuYW1lLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbCBvciBpZiB0aGUgbGlzdGVuZXIgd2FzIG5ldmVyIGFkZGVkLgotCSAqLwotCXZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGxpc3QgY2hhbmdlIGV2ZW50cyB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBsaXN0IG5hbWUuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBzYW1lIGxpc3RlbmVyIGlzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLgotCSAqIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQl2b2lkIGFkZExpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGxpc3QgY2hhbmdlIGV2ZW50cywKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBuYW1lLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbCBvciBpZiB0aGUgbGlzdGVuZXIgd2FzIG5ldmVyIGFkZGVkLgotCSAqLwotCXZvaWQgcmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCi0JLy8gKioqKioqKioqKiB0cmVlIGNoYW5nZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRyZWUgY2hhbmdlIGV2ZW50cyB3aXRoCi0JICogdGhlIHNwZWNpZmllZCB0cmVlIG5hbWUuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBzYW1lIGxpc3RlbmVyIGlzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLgotCSAqIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQl2b2lkIGFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgdHJlZU5hbWUsIFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRyZWUgY2hhbmdlIGV2ZW50cywKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgdHJlZSBuYW1lLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbCBvciBpZiB0aGUgbGlzdGVuZXIgd2FzIG5ldmVyIGFkZGVkLgotCSAqLwotCXZvaWQgcmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFN0cmluZyB0cmVlTmFtZSwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvQ2hhbmdlRXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0NoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMjQ3ZWMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgZm9yIGFsbCB0aGUgY2hhbmdlIGV2ZW50cyB0aGF0IGNhbiBiZSBmaXJlZCBieSBtb2RlbHMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDaGFuZ2VFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgY2hhbmdlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICovCi0JcHJvdGVjdGVkIENoYW5nZUV2ZW50KE1vZGVsIHNvdXJjZSkgewotCQlzdXBlcihzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIENvdmFyaWFudCBvdmVycmlkZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTW9kZWwgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gKE1vZGVsKSBzdXBlci5nZXRTb3VyY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuYXBwZW5kU2ltcGxlVG9TdHJpbmcoc2IsIHRoaXMpOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJaW50IGxlbiA9IHNiLmxlbmd0aCgpOwotCQl0aGlzLnRvU3RyaW5nKHNiKTsKLQkJaWYgKHNiLmxlbmd0aCgpID09IGxlbikgewotCQkJc2IuZGVsZXRlQ2hhckF0KGxlbiAtIDEpOwotCQl9IGVsc2UgewotCQkJc2IuYXBwZW5kKCcpJyk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJLy8gc3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyB0byBkbyBzb21ldGhpbmcgYSBiaXQgbW9yZSBoZWxwZnVsCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uQWRkRXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25BZGRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmEyZTdiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25BZGRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJjb2xsZWN0aW9uIGFkZCIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBhZGRzIGl0ZW1zIHRvIGEKLSAqICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiBjb2xsZWN0aW9uLiBBIDxjb2RlPkNvbGxlY3Rpb25BZGRFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotLyogCi0gKiBEZXNpZ24gb3B0aW9uczoKLSAqIC0gY3JlYXRlIGEgY29sbGVjdGlvbiB0byB3cmFwIGEgc2luZ2xlIGFkZGVkIG9yIHJlbW92ZWQgaXRlbQotICogCSh0aGlzIGlzIHRoZSBvcHRpb24gd2UgaW1wbGVtZW50ZWQgYmVsb3cgYW5kIGluIGNvbGxhYm9yYXRpbmcgY29kZSkKLSAqIAlzaW5jZSB0aGVyZSBpcyBubyB3YXkgdG8gb3B0aW1pemUgZG93bnN0cmVhbSBjb2RlIGZvcgotICogCXNpbmdsZSBpdGVtcywgd2UgdGFrZSBhbm90aGVyIHBlcmZvcm1hbmNlIGhpdCBieSBidWlsZGluZwotICogCWEgY29sbGVjdGlvbiBlYWNoIHRpbWUgIChAc2VlIENvbGxlY3Rpb25zI3NpbmdsZXRvbihPYmplY3QpKQotICogCWFuZCBmb3JjaW5nIGRvd25zdHJlYW0gY29kZSB0byB1c2UgYW4gaXRlcmF0b3IgZXZlcnkgdGltZQotICogCi0gKiAtIGZpcmUgYSBzZXBhcmF0ZSBldmVudCBmb3IgZWFjaCBpdGVtIGFkZGVkIG9yIHJlbW92ZWQKLSAqIAllbGltaW5hdGVzIGFueSBwb3RlbnRpYWwgZm9yIG9wdGltaXphdGlvbnMgdG8gZG93bnN0cmVhbSBjb2RlCi0gKiAKLSAqIC0gYWRkIHByb3RvY29sIHRvIHN1cHBvcnQgYm90aCBzaW5nbGUgaXRlbXMgYW5kIGNvbGxlY3Rpb25zCi0gKiAJYWRkcyBjb25kaXRpb25hbCBsb2dpYyB0byBkb3duc3RyZWFtIGNvZGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbGxlY3Rpb25BZGRFdmVudCBleHRlbmRzIENvbGxlY3Rpb25FdmVudCB7Ci0KLQkvKiogVGhlIGl0ZW1zIGFkZGVkIHRvIHRoZSBjb2xsZWN0aW9uLiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gaXRlbXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGNvbGxlY3Rpb24gYWRkIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGNvbGxlY3Rpb25OYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIGFkZGVkIHRvIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQWRkRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMoc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgbmV3IE9iamVjdFtdIHtpdGVtfSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGNvbGxlY3Rpb24gYWRkIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGNvbGxlY3Rpb25OYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBpdGVtcyBUaGUgaXRlbXMgYWRkZWQgdG8gdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25BZGRFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiBpdGVtcykgewotCQl0aGlzKHNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIGl0ZW1zLnRvQXJyYXkoKSk7ICAvLyBOUEUgaWYgJ2l0ZW1zJyBpcyBudWxsCi0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQWRkRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdFtdIGl0ZW1zKSB7Ci0JCXN1cGVyKHNvdXJjZSwgY29sbGVjdGlvbk5hbWUpOwotCQl0aGlzLml0ZW1zID0gaXRlbXM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlbXMgYWRkZWQgdG8gdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldEl0ZW1zKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8T2JqZWN0Pih0aGlzLml0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBhZGRlZCB0byB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RoOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nVG9vbHMuYXBwZW5kKHNiLCB0aGlzLml0ZW1zKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkFkZEV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMuY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGNvbGxlY3Rpb24gbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGNvbGxlY3Rpb24gbmFtZS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkFkZEV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0NvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkFkZEV2ZW50KG5ld1NvdXJjZSwgbmV3Q29sbGVjdGlvbk5hbWUsIHRoaXMuaXRlbXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkNoYW5nZUV2ZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMyYzc1OS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAiY29sbGVjdGlvbiBjaGFuZ2UiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIG9yICJjb25zdHJhaW5lZCIgY29sbGVjdGlvbiBpbiBhIG1hbm5lciB0aGF0IGlzIG5vdCBlYXNpbHkgY2hhcmFjdGVyaXplZCBieQotICogdGhlIG90aGVyIGNvbGxlY3Rpb24gZXZlbnRzLgotICogQSA8Y29kZT5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ8L2NvZGU+IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcn0uCi0gKiBBIDxjb2RlPkNvbGxlY3Rpb25DaGFuZ2VFdmVudDwvY29kZT4gaXMgYWNjb21wYW5pZWQgYnkgdGhlIGNvbGxlY3Rpb24gbmFtZSBhbmQKLSAqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjb2xsZWN0aW9uLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV4dGVuZHMgQ29sbGVjdGlvbkV2ZW50IHsKLQotCS8qKgotCSAqIFRoZSB0aGUgY29sbGVjdGlvbiBpbiBpdHMgY3VycmVudCBzdGF0ZS4KLQkgKiBDbGllbnRzIHdpbGwgbmVlZCB0byBjYWxjdWxhdGUgdGhlIG5lY2Vzc2FyeSBjaGFuZ2VzIHRvIHN5bmNocm9uaXplCi0JICogd2l0aCB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIGNvbGxlY3Rpb247Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGNvbGxlY3Rpb25OYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQl0aGlzKHNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIGNvbGxlY3Rpb24udG9BcnJheSgpKTsgIC8vIE5QRSBpZiAnY29sbGVjdGlvbicgaXMgbnVsbAotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3RbXSBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKHNvdXJjZSwgY29sbGVjdGlvbk5hbWUpOwotCQl0aGlzLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldENvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMuY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb2xsZWN0aW9uU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbi5sZW5ndGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMuY29sbGVjdGlvbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLmNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdDb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VFdmVudChuZXdTb3VyY2UsIG5ld0NvbGxlY3Rpb25OYW1lLCB0aGlzLmNvbGxlY3Rpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkNsZWFyRXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25DbGVhckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYjJhZGMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkNsZWFyRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgImNvbGxlY3Rpb24gY2xlYXIiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2xlYXJzCi0gKiBhICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiBjb2xsZWN0aW9uLiBBIDxjb2RlPkNvbGxlY3Rpb25DbGVhckV2ZW50PC9jb2RlPiBpcyBzZW50Ci0gKiBhcyBhbiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXh0ZW5kcyBDb2xsZWN0aW9uRXZlbnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBjb2xsZWN0aW9uIGNsZWFyIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGNvbGxlY3Rpb25OYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQ2xlYXJFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlzdXBlcihzb3VyY2UsIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkNsZWFyRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgdGhpcy5jb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgY29sbGVjdGlvbiBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgY29sbGVjdGlvbiBuYW1lLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQ2xlYXJFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdDb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DbGVhckV2ZW50KG5ld1NvdXJjZSwgbmV3Q29sbGVjdGlvbk5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkV2ZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlMGJkYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotLy8gVE9ETyBhZGQgIml0ZW0vb3JpZ2luYWwvbmVzdGVkIGV2ZW50IiBmb3IgaXRlbSBjaGFuZ2VkPwotLyoqCi0gKiBBICJjb2xsZWN0aW9uIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgYSAiYm91bmQiCi0gKiBvciAiY29uc3RyYWluZWQiIGNvbGxlY3Rpb24uIEEgPGNvZGU+Q29sbGVjdGlvbkV2ZW50PC9jb2RlPiBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJ9LgotICogVGhlIGludGVudCBpcyB0aGF0IGFueSBsaXN0ZW5lcgotICogY2FuIGtlZXAgaXRzZWxmIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbCdzIGNvbGxlY3Rpb24gdmlhIHRoZSBjb2xsZWN0aW9uCi0gKiBldmVudHMgaXQgcmVjZWl2ZXMgYW5kIG5lZWQgbm90IG1haW50YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbAotICogY29sbGVjdGlvbi4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25FdmVudCBleHRlbmRzIENoYW5nZUV2ZW50IHsKLQotCS8qKiBOYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgY2hhbmdlZC4gKi8KLQlmaW5hbCBTdHJpbmcgY29sbGVjdGlvbk5hbWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGNvbGxlY3Rpb24gZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25FdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlzdXBlcihzb3VyY2UpOwotCQlpZiAoY29sbGVjdGlvbk5hbWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb2xsZWN0aW9uTmFtZSA9IGNvbGxlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCB3YXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbGxlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uTmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25SZW1vdmVFdmVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvblJlbW92ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMjIxOGQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvblJlbW92ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgImNvbGxlY3Rpb24gcmVtb3ZlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIHJlbW92ZXMgaXRlbXMKLSAqIGZyb20gYSAiYm91bmQiIG9yICJjb25zdHJhaW5lZCIgY29sbGVjdGlvbi4gQSA8Y29kZT5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ8L2NvZGU+IGlzIHNlbnQKLSAqIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLS8qCi0gKiBTZWUgZGVzaWduIGRpc2N1c3Npb24gaW4gQ29sbGVjdGlvbkFkZEV2ZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXh0ZW5kcyBDb2xsZWN0aW9uRXZlbnQgewotCi0JLyoqIFRoZSBpdGVtcyByZW1vdmVkIGZyb20gdGhlIGNvbGxlY3Rpb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBpdGVtczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgY29sbGVjdGlvbiByZW1vdmUgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMoc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgbmV3IE9iamVjdFtdIHtpdGVtfSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGNvbGxlY3Rpb24gcmVtb3ZlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGNvbGxlY3Rpb25OYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBpdGVtcyBUaGUgaXRlbXMgcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gaXRlbXMpIHsKLQkJdGhpcyhzb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCBpdGVtcy50b0FycmF5KCkpOyAgLy8gTlBFIGlmICdpdGVtcycgaXMgbnVsbAotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblJlbW92ZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3RbXSBpdGVtcykgewotCQlzdXBlcihzb3VyY2UsIGNvbGxlY3Rpb25OYW1lKTsKLQkJdGhpcy5pdGVtcyA9IGl0ZW1zOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZW1zIHJlbW92ZWQgZnJvbSB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8Pz4gZ2V0SXRlbXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMuaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIHJlbW92ZWQgZnJvbSB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RoOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nVG9vbHMuYXBwZW5kKHNiLCB0aGlzLml0ZW1zKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvblJlbW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMuY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGNvbGxlY3Rpb24gbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGNvbGxlY3Rpb24gbmFtZS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvblJlbW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0NvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvblJlbW92ZUV2ZW50KG5ld1NvdXJjZSwgbmV3Q29sbGVjdGlvbk5hbWUsIHRoaXMuaXRlbXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdEFkZEV2ZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0QWRkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAwNzQwYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0QWRkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAibGlzdCBhZGQiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgYWRkcyBpdGVtcyB0byBhCi0gKiAiYm91bmQiIG9yICJjb25zdHJhaW5lZCIgbGlzdC4gQSA8Y29kZT5MaXN0QWRkRXZlbnQ8L2NvZGU+IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLS8qCi0gKiBTZWUgZGVzaWduIGRpc2N1c3Npb24gaW4gQ29sbGVjdGlvbkFkZEV2ZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaXN0QWRkRXZlbnQgZXh0ZW5kcyBMaXN0RXZlbnQgewotCi0JLyoqIFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSBhZGRlZC4gKi8KLQlwcml2YXRlIGZpbmFsIGludCBpbmRleDsKLQotCS8qKiBUaGUgaXRlbXMgYWRkZWQgdG8gdGhlIGxpc3QuICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBpdGVtczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgbGlzdCBhZGQgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSBhZGRlZC4KLQkgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSBhZGRlZCB0byB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgTGlzdEFkZEV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMoc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIG5ldyBPYmplY3RbXSB7aXRlbX0pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBsaXN0IGFkZCBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBsaXN0TmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGxpc3QgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIGFkZGVkLgotCSAqIEBwYXJhbSBpdGVtcyBUaGUgaXRlbXMgYWRkZWQgdG8gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIExpc3RBZGRFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IGl0ZW1zKSB7Ci0JCXRoaXMoc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIGl0ZW1zLnRvQXJyYXkoKSk7ICAvLyBOUEUgaWYgJ2l0ZW1zJyBpcyBudWxsCi0JfQotCi0JcHJpdmF0ZSBMaXN0QWRkRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0W10gaXRlbXMpIHsKLQkJc3VwZXIoc291cmNlLCBsaXN0TmFtZSk7Ci0JCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJdGhpcy5pdGVtcyA9IGl0ZW1zOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLmluZGV4OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlbXMgYWRkZWQgdG8gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldEl0ZW1zKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8T2JqZWN0Pih0aGlzLml0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBhZGRlZCB0byB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RoOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nVG9vbHMuYXBwZW5kKHNiLCB0aGlzLml0ZW1zKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgTGlzdEFkZEV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMubGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgTGlzdEFkZEV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZSBhbmQgZGlzcGxhY2luZwotCSAqIHRoZSBpbmRleCBieSB0aGUgc3BlY2lmaWVkIGFtb3VudC4KLQkgKi8KLQlwdWJsaWMgTGlzdEFkZEV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBuZXcgTGlzdEFkZEV2ZW50KG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIHRoaXMuaW5kZXggKyBvZmZzZXQsIHRoaXMuaXRlbXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdENoYW5nZUV2ZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0Q2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjZjI5MS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0Q2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAibGlzdCBjaGFuZ2UiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIG9yICJjb25zdHJhaW5lZCIgbGlzdCBpbiBhIG1hbm5lciB0aGF0IGlzIG5vdCBlYXNpbHkgY2hhcmFjdGVyaXplZCBieQotICogdGhlIG90aGVyIGxpc3QgZXZlbnRzLgotICogQSA8Y29kZT5MaXN0Q2hhbmdlRXZlbnQ8L2NvZGU+IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcn0uCi0gKiBBIDxjb2RlPkxpc3RDaGFuZ2VFdmVudDwvY29kZT4gaXMgYWNjb21wYW5pZWQgYnkgdGhlIGxpc3QgbmFtZSBhbmQKLSAqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBsaXN0LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTGlzdENoYW5nZUV2ZW50IGV4dGVuZHMgTGlzdEV2ZW50IHsKLQotCS8qKgotCSAqIFRoZSB0aGUgbGlzdCBpbiBpdHMgY3VycmVudCBzdGF0ZS4KLQkgKiBDbGllbnRzIHdpbGwgbmVlZCB0byBjYWxjdWxhdGUgdGhlIG5lY2Vzc2FyeSBjaGFuZ2VzIHRvIHN5bmNocm9uaXplCi0JICogd2l0aCB0aGUgbGlzdC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIGxpc3Q7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgY2hhbmdlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGxpc3ROYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgbGlzdCB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBMaXN0Q2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIExpc3Q8Pz4gbGlzdCkgewotCQl0aGlzKHNvdXJjZSwgbGlzdE5hbWUsIGxpc3QudG9BcnJheSgpKTsgIC8vIE5QRSBpZiAnbGlzdCcgaXMgbnVsbAotCX0KLQotCXByaXZhdGUgTGlzdENoYW5nZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lLCBPYmplY3RbXSBsaXN0KSB7Ci0JCXN1cGVyKHNvdXJjZSwgbGlzdE5hbWUpOwotCQl0aGlzLmxpc3QgPSBsaXN0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGxpc3QuCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldExpc3QoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMubGlzdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGxpc3QuCi0JICovCi0JcHVibGljIGludCBnZXRMaXN0U2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5sZW5ndGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMubGlzdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UuCi0JICovCi0JcHVibGljIExpc3RDaGFuZ2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLmxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBsaXN0IG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBsaXN0IG5hbWUuCi0JICovCi0JcHVibGljIExpc3RDaGFuZ2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdMaXN0TmFtZSkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VFdmVudChuZXdTb3VyY2UsIG5ld0xpc3ROYW1lLCB0aGlzLmxpc3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdENsZWFyRXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RDbGVhckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYWY1NTguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdENsZWFyRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgImxpc3QgY2xlYXIiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2xlYXJzCi0gKiBhICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiBsaXN0LiBBIDxjb2RlPkxpc3RDbGVhckV2ZW50PC9jb2RlPiBpcyBzZW50Ci0gKiBhcyBhbiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTGlzdENsZWFyRXZlbnQgZXh0ZW5kcyBMaXN0RXZlbnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgY2xlYXIgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIExpc3RDbGVhckV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXN1cGVyKHNvdXJjZSwgbGlzdE5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlLgotCSAqLwotCXB1YmxpYyBMaXN0Q2xlYXJFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLmxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBsaXN0IG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBsaXN0IG5hbWUuCi0JICovCi0JcHVibGljIExpc3RDbGVhckV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lKSB7Ci0JCXJldHVybiBuZXcgTGlzdENsZWFyRXZlbnQobmV3U291cmNlLCBuZXdMaXN0TmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0RXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2QzNDU4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8vIFRPRE8gYWRkICJpdGVtL29yaWdpbmFsL25lc3RlZCBldmVudCIgZm9yIGl0ZW0gY2hhbmdlZD8KLS8qKgotICogQSAibGlzdCIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogb3IgImNvbnN0cmFpbmVkIiBsaXN0LiBBIDxjb2RlPkxpc3RFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyfS4KLSAqIFRoZSBpbnRlbnQgaXMgdGhhdCBhbnkgbGlzdGVuZXIKLSAqIGNhbiBrZWVwIGl0c2VsZiBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgbW9kZWwncyBsaXN0IHZpYSB0aGUgbGlzdAotICogZXZlbnRzIGl0IHJlY2VpdmVzIGFuZCBuZWVkIG5vdCBtYWludGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwKLSAqIGxpc3QuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0RXZlbnQgZXh0ZW5kcyBDaGFuZ2VFdmVudCB7Ci0KLQkvKiogTmFtZSBvZiB0aGUgbGlzdCB0aGF0IGNoYW5nZWQuICovCi0JZmluYWwgU3RyaW5nIGxpc3ROYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBsaXN0IGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGxpc3ROYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgbGlzdCB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBMaXN0RXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJaWYgKGxpc3ROYW1lID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdE5hbWUgPSBsaXN0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXN0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdE5hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5saXN0TmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0TW92ZUV2ZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0TW92ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MjdlZGIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdE1vdmVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgImxpc3QgbW92ZSIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBtb3ZlcyB0aGUgZWxlbWVudHMgaW4KLSAqIGEgImJvdW5kIiBvciAiY29uc3RyYWluZWQiIGxpc3QuIEEgPGNvZGU+TGlzdE1vdmVFdmVudDwvY29kZT4gaXMgc2VudAotICogYXMgYW4gYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIExpc3RNb3ZlRXZlbnQgZXh0ZW5kcyBMaXN0RXZlbnQgewotCi0JLyoqIFRoZSBpbmRleCB0byB3aGljaCB0aGUgaXRlbXMgd2VyZSBtb3ZlZC4gKi8KLQlwcml2YXRlIGZpbmFsIGludCB0YXJnZXRJbmRleDsKLQotCS8qKiBUaGUgaW5kZXggZnJvbSB3aGljaCB0aGUgaXRlbXMgd2VyZSBtb3ZlZC4gKi8KLQlwcml2YXRlIGZpbmFsIGludCBzb3VyY2VJbmRleDsKLQotCS8qKiBUaGUgbnVtYmVyIG9mIGl0ZW1zIG1vdmVkLiAqLwotCXByaXZhdGUgZmluYWwgaW50IGxlbmd0aDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBsaXN0IG1vdmUgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIHRhcmdldEluZGV4IFRoZSBpbmRleCB0byB3aGljaCB0aGUgaXRlbXMgd2VyZSBtb3ZlZC4KLQkgKiBAcGFyYW0gc291cmNlSW5kZXggVGhlIGluZGV4IGZyb20gd2hpY2ggdGhlIGl0ZW1zIHdlcmUgbW92ZWQuCi0JICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGl0ZW1zIG1vdmVkLgotCSAqLwotCXB1YmxpYyBMaXN0TW92ZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQlzdXBlcihzb3VyY2UsIGxpc3ROYW1lKTsKLQkJdGhpcy50YXJnZXRJbmRleCA9IHRhcmdldEluZGV4OwotCQl0aGlzLnNvdXJjZUluZGV4ID0gc291cmNlSW5kZXg7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IHRvIHdoaWNoIHRoZSBpdGVtcyB3ZXJlIG1vdmVkLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFyZ2V0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLnRhcmdldEluZGV4OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggZnJvbSB3aGljaCB0aGUgaXRlbXMgd2VyZSBtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNvdXJjZUluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5zb3VyY2VJbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMubGVuZ3RoOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMuc291cmNlSW5kZXgpOwotCQlzYi5hcHBlbmQoIiA9PiAiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQodGhpcy50YXJnZXRJbmRleCk7Ci0JCXNiLmFwcGVuZCgiIGxlbmd0aD0iKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQodGhpcy5sZW5ndGgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlLgotCSAqLwotCXB1YmxpYyBMaXN0TW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMubGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgTGlzdE1vdmVFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdMaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIG5ld0xpc3ROYW1lLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBsaXN0IG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBsaXN0IG5hbWUgYW5kIGRpc3BsYWNpbmcKLQkgKiB0aGUgaW5kZXggYnkgdGhlIHNwZWNpZmllZCBhbW91bnQuCi0JICovCi0JcHVibGljIExpc3RNb3ZlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3TGlzdE5hbWUsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TW92ZUV2ZW50KG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIHRoaXMudGFyZ2V0SW5kZXggKyBvZmZzZXQsIHRoaXMuc291cmNlSW5kZXggKyBvZmZzZXQsIHRoaXMubGVuZ3RoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RSZW1vdmVFdmVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdFJlbW92ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYjgyZDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdFJlbW92ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgImxpc3QgcmVtb3ZlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIHJlbW92ZXMgaXRlbXMKLSAqIGZyb20gYSAiYm91bmQiIG9yICJjb25zdHJhaW5lZCIgbGlzdC4gQSA8Y29kZT5MaXN0UmVtb3ZlRXZlbnQ8L2NvZGU+IGlzIHNlbnQKLSAqIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLS8qCi0gKiBTZWUgZGVzaWduIGRpc2N1c3Npb24gaW4gQ29sbGVjdGlvbkFkZEV2ZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaXN0UmVtb3ZlRXZlbnQgZXh0ZW5kcyBMaXN0RXZlbnQgewotCi0JLyoqIFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSByZW1vdmVkLiAqLwotCXByaXZhdGUgZmluYWwgaW50IGluZGV4OwotCi0JLyoqIFRoZSBpdGVtcyByZW1vdmVkIGZyb20gdGhlIGxpc3QuICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBpdGVtczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgbGlzdCByZW1vdmUgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSByZW1vdmVkLgotCSAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgTGlzdFJlbW92ZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMoc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIG5ldyBPYmplY3RbXSB7aXRlbX0pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBsaXN0IHJlbW92ZSBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uTmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGxpc3QgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIHJlbW92ZWQuCi0JICogQHBhcmFtIGl0ZW1zIFRoZSBpdGVtcyByZW1vdmVkIGZyb20gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIExpc3RSZW1vdmVFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBDb2xsZWN0aW9uPD8+IGl0ZW1zKSB7Ci0JCXRoaXMoc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIGl0ZW1zLnRvQXJyYXkoKSk7ICAvLyBOUEUgaWYgJ2l0ZW1zJyBpcyBudWxsCi0JfQotCi0JcHJpdmF0ZSBMaXN0UmVtb3ZlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0W10gaXRlbXMpIHsKLQkJc3VwZXIoc291cmNlLCBsaXN0TmFtZSk7Ci0JCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJdGhpcy5pdGVtcyA9IGl0ZW1zOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5pbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZW1zIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8Pz4gZ2V0SXRlbXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMuaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RoOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nVG9vbHMuYXBwZW5kKHNiLCB0aGlzLml0ZW1zKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgTGlzdFJlbW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMubGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgTGlzdFJlbW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZSBhbmQgZGlzcGxhY2luZwotCSAqIHRoZSBpbmRleCBieSB0aGUgc3BlY2lmaWVkIGFtb3VudC4KLQkgKi8KLQlwdWJsaWMgTGlzdFJlbW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBuZXcgTGlzdFJlbW92ZUV2ZW50KG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIHRoaXMuaW5kZXggKyBvZmZzZXQsIHRoaXMuaXRlbXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdFJlcGxhY2VFdmVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdFJlcGxhY2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDZmMzc2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RSZXBsYWNlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAibGlzdCByZXBsYWNlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIHJlcGxhY2VzIGl0ZW1zIGluIGEKLSAqICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiBsaXN0LiBBIDxjb2RlPkxpc3RSZXBsYWNlRXZlbnQ8L2NvZGU+IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaXN0UmVwbGFjZUV2ZW50IGV4dGVuZHMgTGlzdEV2ZW50IHsKLQotCS8qKiBUaGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgcmVwbGFjZWQuICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7Ci0KLQkvKiogVGhlIG5ldyBpdGVtcyB0aGF0IHJlcGxhY2VkIHRoZSBvbGQgaXRlbXMgaW4gdGhlIGxpc3QuICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBuZXdJdGVtczsKLQotCS8qKiBUaGUgb2xkIGl0ZW1zIHRoYXQgd2VyZSByZXBsYWNlZCBieSB0aGUgbmV3IGl0ZW1zIGluIHRoZSBsaXN0LiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gb2xkSXRlbXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgcmVwbGFjZSBldmVudCBmb3IgYSBsaXN0IG9mIHJlcGxhY2VkIGl0ZW1zLgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGxpc3ROYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgbGlzdCB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW0gaW4gdGhlIGxpc3Qgd2FzIHJlcGxhY2VkLgotCSAqIEBwYXJhbSBuZXdJdGVtIFRoZSBuZXcgaXRlbSBpbiB0aGUgbGlzdC4KLQkgKiBAcGFyYW0gb2xkSXRlbSBUaGUgb2xkIGl0ZW0gaW4gdGhlIGxpc3QgdGhhdCB3ZXJlIHJlcGxhY2VkLgotCSAqLwotCXB1YmxpYyBMaXN0UmVwbGFjZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBuZXdJdGVtLCBPYmplY3Qgb2xkSXRlbSkgewotCQl0aGlzKHNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBuZXcgT2JqZWN0W10ge25ld0l0ZW19LCBuZXcgT2JqZWN0W10ge29sZEl0ZW19KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgbGlzdCByZXBsYWNlIGV2ZW50IGZvciBhIGxpc3Qgb2YgcmVwbGFjZWQgaXRlbXMuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgaW4gdGhlIGxpc3Qgd2VyZSByZXBsYWNlZC4KLQkgKiBAcGFyYW0gbmV3SXRlbXMgVGhlIG5ldyBpdGVtcyBpbiB0aGUgbGlzdC4KLQkgKiBAcGFyYW0gb2xkSXRlbXMgVGhlIG9sZCBpdGVtcyBpbiB0aGUgbGlzdCB0aGF0IHdlcmUgcmVwbGFjZWQuCi0JICovCi0JcHVibGljIExpc3RSZXBsYWNlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiBuZXdJdGVtcywgTGlzdDw/PiBvbGRJdGVtcykgewotCQl0aGlzKHNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtcy50b0FycmF5KCksIG9sZEl0ZW1zLnRvQXJyYXkoKSk7ICAvLyBOUEUgaWYgZWl0aGVyICduZXdJdGVtcycgb3IgJ29sZEl0ZW1zJyBpcyBudWxsCi0JfQotCi0JcHJpdmF0ZSBMaXN0UmVwbGFjZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdFtdIG5ld0l0ZW1zLCBPYmplY3RbXSBvbGRJdGVtcykgewotCQlzdXBlcihzb3VyY2UsIGxpc3ROYW1lKTsKLQkJaWYgKG5ld0l0ZW1zLmxlbmd0aCAhPSBvbGRJdGVtcy5sZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNpemVzIG11c3QgbWF0Y2ggLSBuZXcgaXRlbXMgc2l6ZTogIiArIG5ld0l0ZW1zLmxlbmd0aCAvLyROT04tTkxTLTEkCi0JCQkJCSsgIiBvbGQgaXRlbXMgc2l6ZTogIiArIG9sZEl0ZW1zLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCXRoaXMubmV3SXRlbXMgPSBuZXdJdGVtczsKLQkJdGhpcy5vbGRJdGVtcyA9IG9sZEl0ZW1zOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIHJlcGxhY2VkIGluIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLmluZGV4OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmV3IGl0ZW1zIHRoYXQgcmVwbGFjZWQgdGhlIG9sZCBpdGVtcyBpbiB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8Pz4gZ2V0TmV3SXRlbXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMubmV3SXRlbXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb2xkIGl0ZW1zIHRoYXQgd2VyZSByZXBsYWNlZCBieSB0aGUgbmV3IGl0ZW1zIGluIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTw/PiBnZXRPbGRJdGVtcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPE9iamVjdD4odGhpcy5vbGRJdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCB3ZXJlIHJlcGxhY2VkLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SXRlbXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5uZXdJdGVtcy5sZW5ndGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMub2xkSXRlbXMpOwotCQlzYi5hcHBlbmQoIiA9PiAiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMubmV3SXRlbXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlLgotCSAqLwotCXB1YmxpYyBMaXN0UmVwbGFjZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMubGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgTGlzdFJlcGxhY2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdMaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIG5ld0xpc3ROYW1lLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBsaXN0IG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBsaXN0IG5hbWUgYW5kIGRpc3BsYWNpbmcKLQkgKiB0aGUgaW5kZXggYnkgdGhlIHNwZWNpZmllZCBhbW91bnQuCi0JICovCi0JcHVibGljIExpc3RSZXBsYWNlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3TGlzdE5hbWUsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIG5ldyBMaXN0UmVwbGFjZUV2ZW50KG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIHRoaXMuaW5kZXggKyBvZmZzZXQsIHRoaXMubmV3SXRlbXMsIHRoaXMub2xkSXRlbXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvUHJvcGVydHlDaGFuZ2VFdmVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvUHJvcGVydHlDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWM3NDc1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L1Byb3BlcnR5Q2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJwcm9wZXJ0eSBjaGFuZ2UiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIG9yICJjb25zdHJhaW5lZCIgcHJvcGVydHkuIEEgPGNvZGU+UHJvcGVydHlDaGFuZ2VFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcn0uCi0gKiBBIDxjb2RlPlByb3BlcnR5Q2hhbmdlRXZlbnQ8L2NvZGU+IGlzIGFjY29tcGFuaWVkIGJ5IHRoZSBvbGQgYW5kIG5ldyB2YWx1ZXMKLSAqIG9mIHRoZSBwcm9wZXJ0eS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXh0ZW5kcyBDaGFuZ2VFdmVudCB7Ci0KLQkvKiogTmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkLiAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZTsKLQotCS8qKiBUaGUgcHJvcGVydHkncyBvbGQgdmFsdWUsIGJlZm9yZSB0aGUgY2hhbmdlLiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0IG9sZFZhbHVlOwotCi0JLyoqIFRoZSBwcm9wZXJ0eSdzIG5ldyB2YWx1ZSwgYWZ0ZXIgdGhlIGNoYW5nZS4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBuZXdWYWx1ZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIG9sZFZhbHVlIFRoZSBvbGQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotCSAqIEBwYXJhbSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydHlDaGFuZ2VFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JCWlmIChwcm9wZXJ0eU5hbWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0JCXRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTsKLQkJdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5wcm9wZXJ0eU5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2xkVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLm9sZFZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE5ld1ZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5uZXdWYWx1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnByb3BlcnR5TmFtZSk7Ci0JCXNiLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQodGhpcy5vbGRWYWx1ZSk7Ci0JCXNiLmFwcGVuZCgiID0+ICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCh0aGlzLm5ld1ZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgUHJvcGVydHlDaGFuZ2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KG5ld1NvdXJjZSwgdGhpcy5wcm9wZXJ0eU5hbWUsIHRoaXMub2xkVmFsdWUsIHRoaXMubmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIHByb3BlcnR5IG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBwcm9wZXJ0eSBuYW1lLgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eUNoYW5nZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld1Byb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQobmV3U291cmNlLCBuZXdQcm9wZXJ0eU5hbWUsIHRoaXMub2xkVmFsdWUsIHRoaXMubmV3VmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvU3RhdGVDaGFuZ2VFdmVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvU3RhdGVDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGFjMzk5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L1N0YXRlQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgZ2VuZXJpYyAic3RhdGUgY2hhbmdlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgdG8KLSAqIHN1Y2ggZXh0ZW50IHRoYXQgaXQgY2Fubm90IGJlIGRlbGluZWF0ZWQgYWxsIGFzcGVjdHMgb2YgaXQgdGhhdCBoYXZlIGNoYW5nZWQuCi0gKiBBbnkgbGlzdGVuZXIgY2FuIHN5bmNocm9uaXplIHdpdGggdGhlIG1vZGVsIGFzIG5lY2Vzc2FyeSBzaW5jZSB0aGUgbW9kZWwgaXMKLSAqIGF2YWlsYWJsZSBhcyB0aGUgZXZlbnQncyAnc291cmNlJy4KLSAqIEEgPGNvZGU+U3RhdGVDaGFuZ2VFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbiBhcmd1bWVudCB0byB0aGUKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0ZUNoYW5nZUV2ZW50IGV4dGVuZHMgQ2hhbmdlRXZlbnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBzdGF0ZSBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKi8KLQlwdWJsaWMgU3RhdGVDaGFuZ2VFdmVudChNb2RlbCBzb3VyY2UpIHsKLQkJc3VwZXIoc291cmNlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RhdGVDaGFuZ2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIG5ldyBTdGF0ZUNoYW5nZUV2ZW50KG5ld1NvdXJjZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlQWRkRXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVBZGRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTUwMjcxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVBZGRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAidHJlZSBhZGQiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgYWRkcyBhIG5vZGUgdG8gYSAiYm91bmQiCi0gKiBvciAiY29uc3RyYWluZWQiIHRyZWUuIEEgPGNvZGU+VHJlZUNoYW5nZUV2ZW50PC9jb2RlPiBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJlZUFkZEV2ZW50IGV4dGVuZHMgVHJlZUV2ZW50IHsKLQotCS8qKgotICAgICAqIFBhdGggdG8gdGhlIG5vZGUgYWRkZWQgdG8gdGhlIHRyZWUuCi0gICAgICovCi0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdFtdIHBhdGg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IHRyZWUgYWRkIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIHRyZWVOYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgdHJlZSB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIHRoZSBwYXJ0IG9mIHRoZSB0cmVlIHRoYXQgd2FzIGFkZGVkLgotCSAqLwotCXB1YmxpYyBUcmVlQWRkRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgdHJlZU5hbWUsIExpc3Q8Pz4gcGF0aCkgewotCQl0aGlzKHNvdXJjZSwgdHJlZU5hbWUsIHBhdGgudG9BcnJheSgpKTsgIC8vIE5QRSBpZiAncGF0aCcgaXMgbnVsbAotCX0KLQotCXByaXZhdGUgVHJlZUFkZEV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIHRyZWVOYW1lLCBPYmplY3RbXSBwYXRoKSB7Ci0JCXN1cGVyKHNvdXJjZSwgdHJlZU5hbWUpOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhdGggdG8gdGhlIHBhcnQgb2YgdGhlIHRyZWUgdGhhdCB3YXMgYWRkZWQuCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldFBhdGgoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMucGF0aCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JcHVibGljIFRyZWVBZGRFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLnRyZWVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCB0cmVlIG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCB0cmVlIG5hbWUuCi0JICovCi0JcHVibGljIFRyZWVBZGRFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdUcmVlTmFtZSkgewotCQlyZXR1cm4gbmV3IFRyZWVBZGRFdmVudChuZXdTb3VyY2UsIG5ld1RyZWVOYW1lLCB0aGlzLnBhdGgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUNoYW5nZUV2ZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FkN2UwMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgInRyZWUgY2hhbmdlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgYSAiYm91bmQiCi0gKiBvciAiY29uc3RyYWluZWQiIHRyZWUgaW4gYSBtYW5uZXIgdGhhdCBpcyBub3QgZWFzaWx5IGNoYXJhY3Rlcml6ZWQgYnkKLSAqIHRoZSBvdGhlciB0cmVlIGV2ZW50cy4KLSAqIEEgPGNvZGU+VHJlZUNoYW5nZUV2ZW50PC9jb2RlPiBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJlZUNoYW5nZUV2ZW50IGV4dGVuZHMgVHJlZUV2ZW50IHsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IG5vZGVzIGluIHRoZSBjaGFuZ2VkIHRyZWUuCi0gICAgICovCi0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdFtdIG5vZGVzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IHRyZWUgY2hhbmdlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIHRyZWVOYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgdHJlZSB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBub2RlcyBUaGUgY3VycmVudCBub2RlcyBpbiB0aGUgY2hhbmdlZCB0cmVlLgotCSAqLwotCXB1YmxpYyBUcmVlQ2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgdHJlZU5hbWUsIENvbGxlY3Rpb248Pz4gbm9kZXMpIHsKLQkJdGhpcyhzb3VyY2UsIHRyZWVOYW1lLCBub2Rlcy50b0FycmF5KCkpOyAgLy8gTlBFIGlmICdub2RlcycgaXMgbnVsbAotCX0KLQkKLQlwcml2YXRlIFRyZWVDaGFuZ2VFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyB0cmVlTmFtZSwgT2JqZWN0W10gbm9kZXMpIHsKLQkJc3VwZXIoc291cmNlLCB0cmVlTmFtZSk7Ci0JCXRoaXMubm9kZXMgPSBub2RlczsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBub2RlcyBpbiB0aGUgY2hhbmdlZCB0cmVlLgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTw/PiBnZXROb2RlcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPE9iamVjdD4odGhpcy5ub2Rlcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IG5vZGVzIGluIHRoZSBjaGFuZ2VkIHRyZWUuCi0JICovCi0JcHVibGljIGludCBnZXROb2Rlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLm5vZGVzLmxlbmd0aDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgVHJlZUNoYW5nZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMudHJlZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIHRyZWUgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIHRyZWUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUNoYW5nZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld1RyZWVOYW1lKSB7Ci0JCXJldHVybiBuZXcgVHJlZUNoYW5nZUV2ZW50KG5ld1NvdXJjZSwgbmV3VHJlZU5hbWUsIHRoaXMubm9kZXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUNsZWFyRXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVDbGVhckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTY1NjguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUNsZWFyRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgInRyZWUgY2xlYXIiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2xlYXJzCi0gKiBhICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiB0cmVlLiBBIDxjb2RlPlRyZWVDbGVhckV2ZW50PC9jb2RlPiBpcyBzZW50Ci0gKiBhcyBhbiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJlZUNsZWFyRXZlbnQgZXh0ZW5kcyBUcmVlRXZlbnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyB0cmVlIGNsZWFyIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGNvbGxlY3Rpb25OYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgdHJlZSB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBUcmVlQ2xlYXJFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyB0cmVlTmFtZSkgewotCQlzdXBlcihzb3VyY2UsIHRyZWVOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUNsZWFyRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgdGhpcy50cmVlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgY29sbGVjdGlvbiBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgY29sbGVjdGlvbiBuYW1lLgotCSAqLwotCXB1YmxpYyBUcmVlQ2xlYXJFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdDb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gbmV3IFRyZWVDbGVhckV2ZW50KG5ld1NvdXJjZSwgbmV3Q29sbGVjdGlvbk5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUV2ZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3Nzc3YS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgInRyZWUiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIG9yICJjb25zdHJhaW5lZCIgdHJlZS4gQSA8Y29kZT5UcmVlRXZlbnQ8L2NvZGU+IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcn0uCi0gKiBUaGUgaW50ZW50IGlzIHRoYXQgYW55IGxpc3RlbmVyCi0gKiBjYW4ga2VlcCBpdHNlbGYgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsJ3MgdHJlZSB2aWEgdGhlIHRyZWUgZXZlbnRzCi0gKiBpdCByZWNlaXZlcyBhbmQgbmVlZCBub3QgbWFpbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHRyZWUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmVlRXZlbnQgZXh0ZW5kcyBDaGFuZ2VFdmVudCB7Ci0KLQkvKiogTmFtZSBvZiB0aGUgdHJlZSB0aGF0IGNoYW5nZWQuICovCi0JZmluYWwgU3RyaW5nIHRyZWVOYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyB0cmVlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIHRyZWVOYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgdHJlZSB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBUcmVlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgdHJlZU5hbWUpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJaWYgKHRyZWVOYW1lID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMudHJlZU5hbWUgPSB0cmVlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSB0cmVlIHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUcmVlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudHJlZU5hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy50cmVlTmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlUmVtb3ZlRXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVSZW1vdmVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmEzMTU3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVSZW1vdmVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAidHJlZSByZW1vdmUiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgcmVtb3ZlcyBhIG5vZGUgcm9tIGEKLSAqICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiB0cmVlLiBBIDxjb2RlPlRyZWVDaGFuZ2VFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRyZWVSZW1vdmVFdmVudCBleHRlbmRzIFRyZWVFdmVudCB7Ci0KLQkvKioKLSAgICAgKiBQYXRoIHRvIHRoZSBub2RlIHJlbW92ZWQgZnJvbSB0aGUgdHJlZS4KLSAgICAgKi8KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0W10gcGF0aDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgdHJlZSByZW1vdmUgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gdHJlZU5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSB0cmVlIHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gdGhlIHBhcnQgb2YgdGhlIHRyZWUgdGhhdCB3YXMgcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgVHJlZVJlbW92ZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIHRyZWVOYW1lLCBMaXN0PD8+IHBhdGgpIHsKLQkJdGhpcyhzb3VyY2UsIHRyZWVOYW1lLCBwYXRoLnRvQXJyYXkoKSk7ICAvLyBOUEUgaWYgJ3BhdGgnIGlzIG51bGwKLQl9Ci0KLQlwcml2YXRlIFRyZWVSZW1vdmVFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyB0cmVlTmFtZSwgT2JqZWN0W10gcGF0aCkgewotCQlzdXBlcihzb3VyY2UsIHRyZWVOYW1lKTsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgc3RhdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBwYXJ0IG9mIHRoZSB0cmVlIHRoYXQgd2FzIHJlbW92ZWQuCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldFBhdGgoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMucGF0aCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JcHVibGljIFRyZWVSZW1vdmVFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLnRyZWVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCB0cmVlIG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCB0cmVlIG5hbWUuCi0JICovCi0JcHVibGljIFRyZWVSZW1vdmVFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdUcmVlTmFtZSkgewotCQlyZXR1cm4gbmV3IFRyZWVSZW1vdmVFdmVudChuZXdTb3VyY2UsIG5ld1RyZWVOYW1lLCB0aGlzLnBhdGgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQWJzdHJhY3RDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQWJzdHJhY3RDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWZmMThlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0Fic3RyYWN0Q2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENoYW5nZUxpc3RlbmVyfS4KLSAqIEFsbCBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBhcmUgZnVubmVsZWQgdGhyb3VnaCBhIHNpbmdsZSBtZXRob2QuCi0gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGJ5Ci0gKiBzdWJjbGFzc2luZyBpdCBhbmQgb3ZlcnJpZGluZyBlaXRoZXIge0BsaW5rICNtb2RlbENoYW5nZWQoQ2hhbmdlRXZlbnQpfQotICogKGlmIGFjY2VzcyB0byB0aGUgZXZlbnQgaXMgcmVxdWlyZWQpIG9yIHtAbGluayAjbW9kZWxDaGFuZ2VkKCl9IChpZiBhY2Nlc3MKLSAqIHRvIHRoZSBldmVudCBpcyBub3QgcmVxdWlyZWQpLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDaGFuZ2VMaXN0ZW5lcgotCWltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIKLXsKLQlwdWJsaWMgQWJzdHJhY3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBub3RpZmllZCB0aGUgbGlzdGVuZXIgb2YgdGhlIGNoYW5nZSBkZXNjcmliZWQgYnkgdGhlCi0JICogc3BlY2lmaWVkIGNoYW5nZSBldmVudC4gQnkgZGVmYXVsdCB0aGUgbGlzdGVuZXIgZXhlY3V0ZXMge0BsaW5rICNtb2RlbENoYW5nZWQoKX0uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbW9kZWxDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgbm90aWZpZWQgdGhlIGxpc3RlbmVyIG9mIGEgY2hhbmdlLgotCSAqIEJ5IGRlZmF1bHQgdGhlIGxpc3RlbmVyIHRocm93cyBhbiBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbW9kZWxDaGFuZ2VkKCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ2hhbmdlQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ2hhbmdlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTY3YjkwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NoYW5nZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgQ2hhbmdlQWRhcHRlcgotCWltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIKLXsKLQlwdWJsaWMgQ2hhbmdlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKiBzdGF0ZQotCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvLyAqKioqKiBwcm9wZXJ0eQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvLyAqKioqKiBjb2xsZWN0aW9uCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8vICoqKioqIGxpc3QKLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8vICoqKioqIHRyZWUKLQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NoYW5nZUxpc3RlbmVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9DaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWM2MjAzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotLyoqCi0gKiBHZW5lcmFsIHB1cnBvc2UgY2hhbmdlIGxpc3RlbmVyLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDaGFuZ2VMaXN0ZW5lcgotCWV4dGVuZHMgU3RhdGVDaGFuZ2VMaXN0ZW5lciwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLCBMaXN0Q2hhbmdlTGlzdGVuZXIsIFRyZWVDaGFuZ2VMaXN0ZW5lcgotewotCS8vIGNvbWJpbmUgdGhlIG90aGVyIGxpc3RlbmVyIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Db2xsZWN0aW9uQ2hhbmdlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTZmNTU1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uQ2hhbmdlQWRhcHRlcgotCWltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyCi17Ci0JcHVibGljIENvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGZmNjY0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLQotLyoqCi0gKiBBICJjb2xsZWN0aW9uIGNoYW5nZSIgZXZlbnQgZ2V0cyBmaXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgYSAiYm91bmQiCi0gKiBjb2xsZWN0aW9uLiBZb3UgY2FuIHJlZ2lzdGVyIGEgPGNvZGU+Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPC9jb2RlPiB3aXRoIGEgc291cmNlCi0gKiBtb2RlbCBzbyBhcyB0byBiZSBub3RpZmllZCBvZiBhbnkgYm91bmQgY29sbGVjdGlvbiB1cGRhdGVzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gaXRlbXMgYXJlIGFkZGVkIHRvIGEgYm91bmQgY29sbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlLAotCSAqIHRoZSBjb2xsZWN0aW9uIHRoYXQgY2hhbmdlZCwgYW5kIHRoZSBpdGVtcyB0aGF0IHdlcmUgYWRkZWQuCi0JICovCi0Jdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGl0ZW1zIGFyZSByZW1vdmVkIGZyb20gYSBib3VuZCBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIGNvbGxlY3Rpb24gdGhhdCBjaGFuZ2VkLCBhbmQgdGhlIGl0ZW1zIHRoYXQgd2VyZSByZW1vdmVkLgotCSAqLwotCXZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGEgYm91bmQgY29sbGVjdGlvbiBpcyBjbGVhcmVkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UgCi0JICogYW5kIHRoZSBjb2xsZWN0aW9uIHRoYXQgY2hhbmdlZC4KLQkgKi8KLQl2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBib3VuZCBjb2xsZWN0aW9uIGlzIGNoYW5nZWQgaW4gYSBtYW5uZXIKLQkgKiB0aGF0IGlzIG5vdCBlYXNpbHkgY2hhcmFjdGVyaXplZCBieSB0aGUgb3RoZXIgbWV0aG9kcyBpbiB0aGlzIGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlIAotCSAqIGFuZCB0aGUgY29sbGVjdGlvbiB0aGF0IGNoYW5nZWQuCi0JICovCi0Jdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Db21tYW5kQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NvbW1hbmRDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDYwMWViLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NvbW1hbmRDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kOwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDaGFuZ2VMaXN0ZW5lcn0uCi0gKiBBbGwgY2hhbmdlIG5vdGlmaWNhdGlvbnMgYXJlIGZ1bm5lbGVkIHRocm91Z2ggYSBzaW5nbGUgY29tbWFuZC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRDaGFuZ2VMaXN0ZW5lcgotCWV4dGVuZHMgQWJzdHJhY3RDaGFuZ2VMaXN0ZW5lcgotewotCXByb3RlY3RlZCBmaW5hbCBDb21tYW5kIGNvbW1hbmQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCBleGVjdXRlcyB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgd2hlbmV2ZXIKLQkgKiBpdCByZWNlaXZlcyBhbnkgY2hhbmdlIG5vdGlmaWNhdGlvbiBmcm9tIHRoZSBtb2RlbCB0byB3aGljaCBpdCBpcyBhZGRlZAotCSAqIGFzIGEgbGlzdGVuZXIuCi0JICovCi0JcHVibGljIENvbW1hbmRDaGFuZ2VMaXN0ZW5lcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBtb2RlbENoYW5nZWQoKSB7Ci0JCXRoaXMuY29tbWFuZC5leGVjdXRlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTGlzdENoYW5nZUFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0xpc3RDaGFuZ2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZjU0MTMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTGlzdENoYW5nZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgTGlzdENoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIExpc3RDaGFuZ2VBZGFwdGVyCi0JaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIKLXsKLQlwdWJsaWMgTGlzdENoYW5nZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9MaXN0Q2hhbmdlTGlzdGVuZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0xpc3RDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjgwYzU1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0xpc3RDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLQotLyoqCi0gKiBBICJsaXN0IGNoYW5nZSIgZXZlbnQgZ2V0cyBmaXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgYSAiYm91bmQiCi0gKiBsaXN0LiBZb3UgY2FuIHJlZ2lzdGVyIGEgPGNvZGU+TGlzdENoYW5nZUxpc3RlbmVyPC9jb2RlPiB3aXRoIGEgc291cmNlCi0gKiBtb2RlbCBzbyBhcyB0byBiZSBub3RpZmllZCBvZiBhbnkgYm91bmQgbGlzdCB1cGRhdGVzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBMaXN0Q2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gaXRlbXMgYXJlIGFkZGVkIHRvIGEgYm91bmQgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlLAotCSAqIHRoZSBsaXN0IHRoYXQgY2hhbmdlZCwgdGhlIGl0ZW1zIHRoYXQgd2VyZSBhZGRlZCwgYW5kIHRoZSBpbmRleAotCSAqIGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIGFkZGVkLgotCSAqLwotCXZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBpdGVtcyBhcmUgcmVtb3ZlZCBmcm9tIGEgYm91bmQgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlLAotCSAqIHRoZSBsaXN0IHRoYXQgY2hhbmdlZCwgdGhlIGl0ZW1zIHRoYXQgd2VyZSByZW1vdmVkLCBhbmQgdGhlIGluZGV4Ci0JICogYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgcmVtb3ZlZC4KLQkgKi8KLQl2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBpdGVtcyBpbiBhIGJvdW5kIGxpc3QgYXJlIHJlcGxhY2VkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIGxpc3QgdGhhdCBjaGFuZ2VkLCB0aGUgaXRlbXMgdGhhdCB3ZXJlIGFkZGVkLCB0aGUgaXRlbXMgdGhhdCB3ZXJlCi0JICogcmVwbGFjZWQsIGFuZCB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgcmVwbGFjZWQuCi0JICovCi0Jdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBpdGVtcyBpbiBhIGJvdW5kIGxpc3QgYXJlIG1vdmVkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIGxpc3QgdGhhdCBjaGFuZ2VkLCBhbmQgdGhlIGluZGljZXMgb2Ygd2hlcmUgaXRlbXMgd2VyZSBtb3ZlZAotCSAqIGZyb20gYW5kIHRvLgotCSAqLwotCXZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBib3VuZCBsaXN0IGlzIGNsZWFyZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEEgTGlzdENsZWFyRXZlbnQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSAKLQkgKiBhbmQgdGhlIGxpc3QgdGhhdCBjaGFuZ2VkLgotCSAqLwotCXZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIGJvdW5kIGxpc3QgaXMgY2hhbmdlZCBpbiBhIG1hbm5lcgotCSAqIHRoYXQgaXMgbm90IGVhc2lseSBjaGFyYWN0ZXJpemVkIGJ5IHRoZSBvdGhlciBtZXRob2RzIGluIHRoaXMgaW50ZXJmYWNlLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBIExpc3RDaGFuZ2VFdmVudCBvYmplY3QgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlIAotCSAqIGFuZCB0aGUgbGlzdCB0aGF0IGNoYW5nZWQuCi0JICovCi0Jdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9NdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTXVsdGlNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU3NjJiZi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9NdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgYnkge0BsaW5rIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcn0gd2hlbiB0aGUgcmVxdWVzdGVkIGxpc3RlbmVyCi0gKiBuZWVkcyB0byBpbXBsZW1lbnQgbXVsdGlwbGUgbWV0aG9kcyAoaS5lLiB7QGxpbmsgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyfSwKLSAqIHtAbGluayBMaXN0Q2hhbmdlTGlzdGVuZXJ9LCBvciB7QGxpbmsgVHJlZUNoYW5nZUxpc3RlbmVyfSkuCi0gKi8KLWNsYXNzIE11bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyCi0JZXh0ZW5kcyBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIgCi0JaW1wbGVtZW50cyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIsIExpc3RDaGFuZ2VMaXN0ZW5lciwgVHJlZUNoYW5nZUxpc3RlbmVyCi17Ci0JLyoqIHRoZSBtZXRob2RzIHdlIHdpbGwgaW52b2tlIG9uIHRoZSB0YXJnZXQgb2JqZWN0ICovCi0JcHJpdmF0ZSBmaW5hbCBNZXRob2QgYWRkTWV0aG9kOwotCXByaXZhdGUgZmluYWwgTWV0aG9kIHJlbW92ZU1ldGhvZDsKLQlwcml2YXRlIGZpbmFsIE1ldGhvZCByZXBsYWNlTWV0aG9kOwkvLyB0aGlzIGNhbiBiZSBudWxsCi0JcHJpdmF0ZSBmaW5hbCBNZXRob2QgbW92ZU1ldGhvZDsJLy8gdGhpcyBjYW4gYmUgbnVsbAotCXByaXZhdGUgZmluYWwgTWV0aG9kIGNsZWFyTWV0aG9kOwotCXByaXZhdGUgZmluYWwgTWV0aG9kIGNoYW5nZU1ldGhvZDsKLQotCi0JLyoqCi0JICogVGhlICJyZXBsYWNlIiBhbmQgIm1vdmUiIG1ldGhvZHMgYXJlIG9wdGlvbmFsLgotCSAqLwotCU11bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBhZGRNZXRob2QsIE1ldGhvZCByZW1vdmVNZXRob2QsIE1ldGhvZCByZXBsYWNlTWV0aG9kLCBNZXRob2QgbW92ZU1ldGhvZCwgTWV0aG9kIGNsZWFyTWV0aG9kLCBNZXRob2QgY2hhbmdlTWV0aG9kKSB7Ci0JCXN1cGVyKHRhcmdldCk7Ci0JCXRoaXMuYWRkTWV0aG9kID0gYWRkTWV0aG9kOwotCQl0aGlzLnJlbW92ZU1ldGhvZCA9IHJlbW92ZU1ldGhvZDsKLQkJdGhpcy5yZXBsYWNlTWV0aG9kID0gcmVwbGFjZU1ldGhvZDsKLQkJdGhpcy5tb3ZlTWV0aG9kID0gbW92ZU1ldGhvZDsKLQkJdGhpcy5jbGVhck1ldGhvZCA9IGNsZWFyTWV0aG9kOwotCQl0aGlzLmNoYW5nZU1ldGhvZCA9IGNoYW5nZU1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiBObyAicmVwbGFjZSIgb3IgIm1vdmUiIG1ldGhvZHMuCi0JICovCi0JTXVsdGlNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIGFkZE1ldGhvZCwgTWV0aG9kIHJlbW92ZU1ldGhvZCwgTWV0aG9kIGNsZWFyTWV0aG9kLCBNZXRob2QgY2hhbmdlTWV0aG9kKSB7Ci0JCXRoaXModGFyZ2V0LCBhZGRNZXRob2QsIHJlbW92ZU1ldGhvZCwgbnVsbCwgbnVsbCwgY2xlYXJNZXRob2QsIGNoYW5nZU1ldGhvZCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgaW52b2tlKE1ldGhvZCBtZXRob2QsIENvbGxlY3Rpb25FdmVudCBldmVudCkgewotCQlpZiAobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDApIHsKLQkJCVJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKG1ldGhvZCwgdGhpcy50YXJnZXQsIEVNUFRZX09CSkVDVF9BUlJBWSk7Ci0JCX0gZWxzZSB7Ci0JCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChtZXRob2QsIHRoaXMudGFyZ2V0LCBuZXcgQ29sbGVjdGlvbkV2ZW50W10ge2V2ZW50fSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmFkZE1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5yZW1vdmVNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmNsZWFyTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMuY2hhbmdlTWV0aG9kLCBldmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgaW52b2tlKE1ldGhvZCBtZXRob2QsIExpc3RFdmVudCBldmVudCkgewotCQlpZiAobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDApIHsKLQkJCVJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKG1ldGhvZCwgdGhpcy50YXJnZXQsIEVNUFRZX09CSkVDVF9BUlJBWSk7Ci0JCX0gZWxzZSB7Ci0JCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChtZXRob2QsIHRoaXMudGFyZ2V0LCBuZXcgTGlzdEV2ZW50W10ge2V2ZW50fSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmFkZE1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5yZW1vdmVNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5yZXBsYWNlTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMubW92ZU1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMuY2xlYXJNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5jaGFuZ2VNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVHJlZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBpbnZva2UoTWV0aG9kIG1ldGhvZCwgVHJlZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gMCkgewotCQkJUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QobWV0aG9kLCB0aGlzLnRhcmdldCwgRU1QVFlfT0JKRUNUX0FSUkFZKTsKLQkJfSBlbHNlIHsKLQkJCVJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKG1ldGhvZCwgdGhpcy50YXJnZXQsIG5ldyBUcmVlRXZlbnRbXSB7ZXZlbnR9KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5hZGRNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5yZW1vdmVNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmNsZWFyTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMuY2hhbmdlTWV0aG9kLCBldmVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Qcm9wZXJ0eUNoYW5nZUFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1Byb3BlcnR5Q2hhbmdlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWY1NGVhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1Byb3BlcnR5Q2hhbmdlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJ9LgotICogVGhpcyBpcyBwcm9iYWJseSBvZiBsaW1pdGVkIHVzZSwgc2luY2UgdGhlcmUgb25seSBhIHNpbmdsZSBtZXRob2QgdG8gaW1wbGVtZW50OwotICogbWF5YmUgaXQgaXMgdXNlZnVsIGFzIGEgbnVsbCBpbXBsZW1lbnRhdGlvbi4gT25lIG1pbm9yIGJlbmVmaXQgaXMgdGhlCi0gKiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgI3RvU3RyaW5nKCl9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFuZ2VBZGFwdGVyCi0JaW1wbGVtZW50cyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi17Ci0JcHVibGljIFByb3BlcnR5Q2hhbmdlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmI0ODhmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBBICJwcm9wZXJ0eSBjaGFuZ2UiIGV2ZW50IGdldHMgZmlyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogcHJvcGVydHkuIFlvdSBjYW4gcmVnaXN0ZXIgYSA8Y29kZT5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPC9jb2RlPiB3aXRoIGEgc291cmNlCi0gKiBtb2RlbCBzbyBhcyB0byBiZSBub3RpZmllZCBvZiBhbnkgYm91bmQgcHJvcGVydHkgdXBkYXRlcy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIG1vZGVsIGhhcyBjaGFuZ2VkIGEgYm91bmQgcHJvcGVydHkuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZQotCSAqIGFuZCB0aGUgcHJvcGVydHkncyBvbGQgYW5kIG5ldyB2YWx1ZXMuCi0JICovCi0Jdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMjRjZDUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLQotLyoqCi0gKiBUaGlzIGZhY3RvcnkgYnVpbGRzIGxpc3RlbmVycyB0aGF0IHJlZmxlY3RpdmVseSBmb3J3YXJkIGNoYW5nZSBldmVudHMuCi0gKiBJZiB5b3UgYXJlIHdvcnJpZWQgYWJvdXQgaGF2aW5nIHRvbyBtYW55IGxpdHRsZSBjbGFzc2VzIHRoYXQgaGF2ZSB0byBiZQotICogbG9hZGVkIGFuZCBtYWludGFpbmVkIGJ5IHRoZSBjbGFzcyBsb2FkZXIsIHlvdSBjYW4gdXNlIG9uZSBvZiB0aGVzZS4KLSAqIE9mIGNvdXJzZSwgdGhpcyBjb21lcyB3aXRoIHRoZSBhZGRpdGlvbmFsIG92ZXJoZWFkIG9mIHJlZmxlY3Rpb24uLi4uCi0gKiBBbHNvIG5vdGUgdGhhdCB0aGUgdmFsaWRpdHkgb2YgdGhlIG1ldGhvZCBuYW1lIGlzIG5vdCBjaGVja2VkIGF0IGNvbXBpbGUKLSAqIHRpbWUsIGJ1dCBhdCBydW50aW1lOyBhbHRob3VnaCB3ZSA8ZW0+ZG88L2VtPiBjaGVjayB0aGUgbWV0aG9kIGFzIHNvb24gYXMgdGhlCi0gKiBsaXN0ZW5lciBpcyBpbnN0YW50aWF0ZWQuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIgewotCi0JLyoqIHRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHdlIHdpbGwgaW52b2tlIHRoZSBtZXRob2QgKi8KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IHRhcmdldDsKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxTdGF0ZUNoYW5nZUV2ZW50PiBTVEFURV9DSEFOR0VfRVZFTlRfQ0xBU1MgPSBTdGF0ZUNoYW5nZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8U3RhdGVDaGFuZ2VFdmVudD5bXSBTVEFURV9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7U1RBVEVfQ0hBTkdFX0VWRU5UX0NMQVNTfTsKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxQcm9wZXJ0eUNoYW5nZUV2ZW50PiBQUk9QRVJUWV9DSEFOR0VfRVZFTlRfQ0xBU1MgPSBQcm9wZXJ0eUNoYW5nZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8UHJvcGVydHlDaGFuZ2VFdmVudD5bXSBQUk9QRVJUWV9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7UFJPUEVSVFlfQ0hBTkdFX0VWRU5UX0NMQVNTfTsKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uRXZlbnQ+IENPTExFQ1RJT05fRVZFTlRfQ0xBU1MgPSBDb2xsZWN0aW9uRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uRXZlbnQ+W10gQ09MTEVDVElPTl9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtDT0xMRUNUSU9OX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8Q29sbGVjdGlvbkFkZEV2ZW50PiBDT0xMRUNUSU9OX0FERF9FVkVOVF9DTEFTUyA9IENvbGxlY3Rpb25BZGRFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPENvbGxlY3Rpb25BZGRFdmVudD5bXSBDT0xMRUNUSU9OX0FERF9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtDT0xMRUNUSU9OX0FERF9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPENvbGxlY3Rpb25SZW1vdmVFdmVudD4gQ09MTEVDVElPTl9SRU1PVkVfRVZFTlRfQ0xBU1MgPSBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uUmVtb3ZlRXZlbnQ+W10gQ09MTEVDVElPTl9SRU1PVkVfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7Q09MTEVDVElPTl9SRU1PVkVfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uQ2xlYXJFdmVudD4gQ09MTEVDVElPTl9DTEVBUl9FVkVOVF9DTEFTUyA9IENvbGxlY3Rpb25DbGVhckV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8Q29sbGVjdGlvbkNsZWFyRXZlbnQ+W10gQ09MTEVDVElPTl9DTEVBUl9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtDT0xMRUNUSU9OX0NMRUFSX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8Q29sbGVjdGlvbkNoYW5nZUV2ZW50PiBDT0xMRUNUSU9OX0NIQU5HRV9FVkVOVF9DTEFTUyA9IENvbGxlY3Rpb25DaGFuZ2VFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPENvbGxlY3Rpb25DaGFuZ2VFdmVudD5bXSBDT0xMRUNUSU9OX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtDT0xMRUNUSU9OX0NIQU5HRV9FVkVOVF9DTEFTU307Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdEV2ZW50PiBMSVNUX0VWRU5UX0NMQVNTID0gTGlzdEV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdEV2ZW50PltdIExJU1RfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7TElTVF9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RBZGRFdmVudD4gTElTVF9BRERfRVZFTlRfQ0xBU1MgPSBMaXN0QWRkRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0QWRkRXZlbnQ+W10gTElTVF9BRERfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7TElTVF9BRERfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0UmVtb3ZlRXZlbnQ+IExJU1RfUkVNT1ZFX0VWRU5UX0NMQVNTID0gTGlzdFJlbW92ZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdFJlbW92ZUV2ZW50PltdIExJU1RfUkVNT1ZFX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge0xJU1RfUkVNT1ZFX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdFJlcGxhY2VFdmVudD4gTElTVF9SRVBMQUNFX0VWRU5UX0NMQVNTID0gTGlzdFJlcGxhY2VFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RSZXBsYWNlRXZlbnQ+W10gTElTVF9SRVBMQUNFX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge0xJU1RfUkVQTEFDRV9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RNb3ZlRXZlbnQ+IExJU1RfTU9WRV9FVkVOVF9DTEFTUyA9IExpc3RNb3ZlRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0TW92ZUV2ZW50PltdIExJU1RfTU9WRV9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtMSVNUX01PVkVfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0Q2xlYXJFdmVudD4gTElTVF9DTEVBUl9FVkVOVF9DTEFTUyA9IExpc3RDbGVhckV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdENsZWFyRXZlbnQ+W10gTElTVF9DTEVBUl9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtMSVNUX0NMRUFSX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdENoYW5nZUV2ZW50PiBMSVNUX0NIQU5HRV9FVkVOVF9DTEFTUyA9IExpc3RDaGFuZ2VFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RDaGFuZ2VFdmVudD5bXSBMSVNUX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtMSVNUX0NIQU5HRV9FVkVOVF9DTEFTU307Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8VHJlZUV2ZW50PiBUUkVFX0VWRU5UX0NMQVNTID0gVHJlZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8VHJlZUV2ZW50PltdIFRSRUVfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7VFJFRV9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVBZGRFdmVudD4gVFJFRV9BRERfRVZFTlRfQ0xBU1MgPSBUcmVlQWRkRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxUcmVlQWRkRXZlbnQ+W10gVFJFRV9BRERfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7VFJFRV9BRERfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxUcmVlUmVtb3ZlRXZlbnQ+IFRSRUVfUkVNT1ZFX0VWRU5UX0NMQVNTID0gVHJlZVJlbW92ZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8VHJlZVJlbW92ZUV2ZW50PltdIFRSRUVfUkVNT1ZFX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge1RSRUVfUkVNT1ZFX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8VHJlZUNsZWFyRXZlbnQ+IFRSRUVfQ0xFQVJfRVZFTlRfQ0xBU1MgPSBUcmVlQ2xlYXJFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVDbGVhckV2ZW50PltdIFRSRUVfQ0xFQVJfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7VFJFRV9DTEVBUl9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVDaGFuZ2VFdmVudD4gVFJFRV9DSEFOR0VfRVZFTlRfQ0xBU1MgPSBUcmVlQ2hhbmdlRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxUcmVlQ2hhbmdlRXZlbnQ+W10gVFJFRV9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7VFJFRV9DSEFOR0VfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9PQkpFQ1RfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotCi0KLQkvLyAqKioqKioqKioqIGhlbHBlciBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEZpbmQgYW5kIHJldHVybiBhIG1ldGhvZCBpbXBsZW1lbnRlZCBieSB0aGUgdGFyZ2V0IHRoYXQgY2FuIGJlIGludm9rZWQKLQkgKiByZWZsZWN0aXZlbHkgd2hlbiBhIGNoYW5nZSBldmVudCBvY2N1cnMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZChPYmplY3QgdGFyZ2V0LCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8PyBleHRlbmRzIENoYW5nZUV2ZW50PltdIGV2ZW50Q2xhc3NBcnJheSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJlZmxlY3Rpb25Ub29scy5nZXRNZXRob2QodGFyZ2V0LCBtZXRob2ROYW1lLCBldmVudENsYXNzQXJyYXkpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4MSkgewotCQkJcmV0dXJuIFJlZmxlY3Rpb25Ub29scy5nZXRNZXRob2QodGFyZ2V0LCBtZXRob2ROYW1lKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBtZXRob2QgaXMgc3VpdGFibGUgZm9yIGJlaW5nIGludm9rZWQgd2hlbiBhCi0JICogY2hhbmdlIGV2ZW50IGhhcyBvY2N1cnJlZC4gVGhyb3cgYW4gZXhjZXB0aW9uIGlmIGl0IGlzIG5vdCBzdWl0YWJsZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoTWV0aG9kIG1ldGhvZCwgQ2xhc3M8PyBleHRlbmRzIENoYW5nZUV2ZW50PiBldmVudENsYXNzKSB7Ci0JCUNsYXNzPD8+W10gcGFybVR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCWludCBwYXJtVHlwZXNMZW5ndGggPSBwYXJtVHlwZXMubGVuZ3RoOwotCQlpZiAocGFybVR5cGVzTGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKHBhcm1UeXBlc0xlbmd0aCA9PSAxKSAmJiBwYXJtVHlwZXNbMF0uaXNBc3NpZ25hYmxlRnJvbShldmVudENsYXNzKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obWV0aG9kLnRvU3RyaW5nKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5IG1ldGhvZHM6IFN0YXRlQ2hhbmdlTGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhdGUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpIHsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChtZXRob2QsIFNUQVRFX0NIQU5HRV9FVkVOVF9DTEFTUyk7Ci0JCXJldHVybiBuZXcgU2luZ2xlTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZAotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LiBJZiBhIHNpbmdsZS1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogbmFtZSBhbmQgYXBwcm9wcmlhdGUgYXJndW1lbnQgaXMgZm91bmQsIGl0IHdpbGwgYmUgaW52b2tlZDsgb3RoZXJ3aXNlLAotCSAqIGEgemVyby1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgd2lsbCBiZSBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIFNUQVRFX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5IG1ldGhvZHM6IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpIHsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChtZXRob2QsIFBST1BFUlRZX0NIQU5HRV9FVkVOVF9DTEFTUyk7Ci0JCXJldHVybiBuZXcgU2luZ2xlTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZAotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LiBJZiBhIHNpbmdsZS1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogbmFtZSBhbmQgYXBwcm9wcmlhdGUgYXJndW1lbnQgaXMgZm91bmQsIGl0IHdpbGwgYmUgaW52b2tlZDsgb3RoZXJ3aXNlLAotCSAqIGEgemVyby1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgd2lsbCBiZSBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIFBST1BFUlRZX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5IG1ldGhvZHM6IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kcwotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBhZGRNZXRob2QsIE1ldGhvZCByZW1vdmVNZXRob2QsIE1ldGhvZCBjbGVhck1ldGhvZCwgTWV0aG9kIGNoYW5nZU1ldGhvZCkgewotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKGFkZE1ldGhvZCwgQ09MTEVDVElPTl9BRERfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKHJlbW92ZU1ldGhvZCwgQ09MTEVDVElPTl9SRU1PVkVfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKGNsZWFyTWV0aG9kLCBDT0xMRUNUSU9OX0NMRUFSX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChjaGFuZ2VNZXRob2QsIENPTExFQ1RJT05fQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJcmV0dXJuIG5ldyBNdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGFkZE1ldGhvZCwgcmVtb3ZlTWV0aG9kLCBjbGVhck1ldGhvZCwgY2hhbmdlTWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGFueSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkgewotCQlyZXR1cm4gYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QsIG1ldGhvZCwgbWV0aG9kLCBtZXRob2QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2RzCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGNoYW5nZSBldmVudHMuIElmIGEgc2luZ2xlLWFyZ3VtZW50IG1ldGhvZAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBhcHByb3ByaWF0ZSBhcmd1bWVudCBpcyBmb3VuZCwgaXQgd2lsbCBiZSBpbnZva2VkOwotCSAqIG90aGVyd2lzZSwgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB3aWxsIGJlIGludm9rZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIGFkZE1ldGhvZE5hbWUsIFN0cmluZyByZW1vdmVNZXRob2ROYW1lLCBTdHJpbmcgY2xlYXJNZXRob2ROYW1lLCBTdHJpbmcgY2hhbmdlTWV0aG9kTmFtZSkgewotCQlyZXR1cm4gYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoCi0JCQkJdGFyZ2V0LAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIGFkZE1ldGhvZE5hbWUsIENPTExFQ1RJT05fQUREX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCByZW1vdmVNZXRob2ROYW1lLCBDT0xMRUNUSU9OX1JFTU9WRV9FVkVOVF9DTEFTU19BUlJBWSksCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgY2xlYXJNZXRob2ROYW1lLCBDT0xMRUNUSU9OX0NMRUFSX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBjaGFuZ2VNZXRob2ROYW1lLCBDT0xMRUNUSU9OX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGFueSBjaGFuZ2UgZXZlbnQuIElmIGEgc2luZ2xlLWFyZ3VtZW50IG1ldGhvZAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBhcHByb3ByaWF0ZSBhcmd1bWVudCBpcyBmb3VuZCwgaXQgd2lsbCBiZSBpbnZva2VkOwotCSAqIG90aGVyd2lzZSwgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB3aWxsIGJlIGludm9rZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRhcmdldCwgZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgbWV0aG9kTmFtZSwgQ09MTEVDVElPTl9FVkVOVF9DTEFTU19BUlJBWSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5IG1ldGhvZHM6IExpc3RDaGFuZ2VMaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kcwotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBhZGRNZXRob2QsIE1ldGhvZCByZW1vdmVNZXRob2QsIE1ldGhvZCByZXBsYWNlTWV0aG9kLCBNZXRob2QgbW92ZU1ldGhvZCwgTWV0aG9kIGNsZWFyTWV0aG9kLCBNZXRob2QgY2hhbmdlTWV0aG9kKSB7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoYWRkTWV0aG9kLCBMSVNUX0FERF9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QocmVtb3ZlTWV0aG9kLCBMSVNUX1JFTU9WRV9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QocmVwbGFjZU1ldGhvZCwgTElTVF9SRVBMQUNFX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChtb3ZlTWV0aG9kLCBMSVNUX01PVkVfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKGNsZWFyTWV0aG9kLCBMSVNUX0NMRUFSX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChjaGFuZ2VNZXRob2QsIExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJcmV0dXJuIG5ldyBNdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGFkZE1ldGhvZCwgcmVtb3ZlTWV0aG9kLCByZXBsYWNlTWV0aG9kLCBtb3ZlTWV0aG9kLCBjbGVhck1ldGhvZCwgY2hhbmdlTWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGFueSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkgewotCQlyZXR1cm4gYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QsIG1ldGhvZCwgbWV0aG9kLCBtZXRob2QsIG1ldGhvZCwgbWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kcwotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZvciBjaGFuZ2UgZXZlbnRzLiBJZiBhIHNpbmdsZS1hcmd1bWVudCBtZXRob2QKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgYXBwcm9wcmlhdGUgYXJndW1lbnQgaXMgZm91bmQsIGl0IHdpbGwgYmUgaW52b2tlZDsKLQkgKiBvdGhlcndpc2UsIGEgemVyby1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgd2lsbCBiZSBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIFN0cmluZyBhZGRNZXRob2ROYW1lLCBTdHJpbmcgcmVtb3ZlTWV0aG9kTmFtZSwgU3RyaW5nIHJlcGxhY2VNZXRob2ROYW1lLCBTdHJpbmcgbW92ZU1ldGhvZE5hbWUsIFN0cmluZyBjbGVhck1ldGhvZE5hbWUsIFN0cmluZyBjaGFuZ2VNZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigKLQkJCQl0YXJnZXQsCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgYWRkTWV0aG9kTmFtZSwgTElTVF9BRERfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIHJlbW92ZU1ldGhvZE5hbWUsIExJU1RfUkVNT1ZFX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCByZXBsYWNlTWV0aG9kTmFtZSwgTElTVF9SRVBMQUNFX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBtb3ZlTWV0aG9kTmFtZSwgTElTVF9NT1ZFX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBjbGVhck1ldGhvZE5hbWUsIExJU1RfQ0xFQVJfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIGNoYW5nZU1ldGhvZE5hbWUsIExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZKQotCQkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBmb3IgYW55IGNoYW5nZSBldmVudC4gSWYgYSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGFwcHJvcHJpYXRlIGFyZ3VtZW50IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGludm9rZWQ7Ci0JICogb3RoZXJ3aXNlLCBhIHplcm8tYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHdpbGwgYmUgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBtZXRob2ROYW1lLCBMSVNUX0VWRU5UX0NMQVNTX0FSUkFZKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY3RvcnkgbWV0aG9kczogVHJlZUNoYW5nZUxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2RzCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIGFkZE1ldGhvZCwgTWV0aG9kIHJlbW92ZU1ldGhvZCwgTWV0aG9kIGNsZWFyTWV0aG9kLCBNZXRob2QgY2hhbmdlTWV0aG9kKSB7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoYWRkTWV0aG9kLCBUUkVFX0FERF9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QocmVtb3ZlTWV0aG9kLCBUUkVFX1JFTU9WRV9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoY2xlYXJNZXRob2QsIFRSRUVfQ0xFQVJfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKGNoYW5nZU1ldGhvZCwgVFJFRV9DSEFOR0VfRVZFTlRfQ0xBU1MpOwotCQlyZXR1cm4gbmV3IE11bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgYWRkTWV0aG9kLCByZW1vdmVNZXRob2QsIGNsZWFyTWV0aG9kLCBjaGFuZ2VNZXRob2QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBmb3IgYW55IGNoYW5nZSBldmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVDaGFuZ2VMaXN0ZW5lciBidWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiBidWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCwgbWV0aG9kLCBtZXRob2QsIG1ldGhvZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZHMKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBmb3IgY2hhbmdlIGV2ZW50cy4gSWYgYSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGFwcHJvcHJpYXRlIGFyZ3VtZW50IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGludm9rZWQ7Ci0JICogb3RoZXJ3aXNlLCBhIHplcm8tYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHdpbGwgYmUgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVDaGFuZ2VMaXN0ZW5lciBidWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBTdHJpbmcgYWRkTWV0aG9kTmFtZSwgU3RyaW5nIHJlbW92ZU1ldGhvZE5hbWUsIFN0cmluZyBjbGVhck1ldGhvZE5hbWUsIFN0cmluZyBjaGFuZ2VNZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcigKLQkJCQl0YXJnZXQsCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgYWRkTWV0aG9kTmFtZSwgVFJFRV9BRERfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIHJlbW92ZU1ldGhvZE5hbWUsIFRSRUVfUkVNT1ZFX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBjbGVhck1ldGhvZE5hbWUsIFRSRUVfQ0xFQVJfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIGNoYW5nZU1ldGhvZE5hbWUsIFRSRUVfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZKQotCQkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBmb3IgYW55IGNoYW5nZSBldmVudC4gSWYgYSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGFwcHJvcHJpYXRlIGFyZ3VtZW50IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGludm9rZWQ7Ci0JICogb3RoZXJ3aXNlLCBhIHplcm8tYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHdpbGwgYmUgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVDaGFuZ2VMaXN0ZW5lciBidWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBtZXRob2ROYW1lLCBUUkVFX0VWRU5UX0NMQVNTX0FSUkFZKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9TaW5nbGVNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1NpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDZlNzVmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1NpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgYnkge0BsaW5rIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcn0gd2hlbiB0aGUgcmVxdWVzdGVkIGxpc3RlbmVyCi0gKiBuZWVkIG9ubHkgaW1wbGVtZW50IGEgc2luZ2xlIG1ldGhvZCAoaS5lLiB7QGxpbmsgU3RhdGVDaGFuZ2VMaXN0ZW5lcn0gb3IKLSAqIHtAbGluayBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyfSkuCi0gKi8KLWNsYXNzIFNpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcgotCWV4dGVuZHMgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyCi0JaW1wbGVtZW50cyBTdGF0ZUNoYW5nZUxpc3RlbmVyLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi17Ci0KLQkvKiogdGhlIG1ldGhvZCB3ZSB3aWxsIGludm9rZSBvbiB0aGUgdGFyZ2V0IG9iamVjdCAqLwotCXByaXZhdGUgZmluYWwgTWV0aG9kIG1ldGhvZDsKLQkvKiogY2FjaGUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gbWV0aG9kSXNaZXJvQXJndW1lbnQ7Ci0KLQlTaW5nbGVNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkgewotCQlzdXBlcih0YXJnZXQpOwotCQl0aGlzLm1ldGhvZCA9IG1ldGhvZDsKLQkJdGhpcy5tZXRob2RJc1plcm9Bcmd1bWVudCA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTdGF0ZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLm1ldGhvZElzWmVyb0FyZ3VtZW50KSB7Ci0JCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZCh0aGlzLm1ldGhvZCwgdGhpcy50YXJnZXQsIEVNUFRZX09CSkVDVF9BUlJBWSk7Ci0JCX0gZWxzZSB7Ci0JCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZCh0aGlzLm1ldGhvZCwgdGhpcy50YXJnZXQsIG5ldyBTdGF0ZUNoYW5nZUV2ZW50W10ge2V2ZW50fSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5tZXRob2RJc1plcm9Bcmd1bWVudCkgewotCQkJUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QodGhpcy5tZXRob2QsIHRoaXMudGFyZ2V0LCBFTVBUWV9PQkpFQ1RfQVJSQVkpOwotCQl9IGVsc2UgewotCQkJUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QodGhpcy5tZXRob2QsIHRoaXMudGFyZ2V0LCBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudFtdIHtldmVudH0pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9TdGF0ZUNoYW5nZUFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1N0YXRlQ2hhbmdlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2M1ZjE4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1N0YXRlQ2hhbmdlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgU3RhdGVDaGFuZ2VMaXN0ZW5lcn0uCi0gKiBUaGlzIGlzIHByb2JhYmx5IG9mIGxpbWl0ZWQgdXNlLCBzaW5jZSB0aGVyZSBvbmx5IGEgc2luZ2xlIG1ldGhvZCB0byBpbXBsZW1lbnQ7Ci0gKiBtYXliZSBhcyBhIG51bGwgaW1wbGVtZW50YXRpb24uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0ZUNoYW5nZUFkYXB0ZXIgaW1wbGVtZW50cyBTdGF0ZUNoYW5nZUxpc3RlbmVyIHsKLQotCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1N0YXRlQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1N0YXRlQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjljNTk5ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9TdGF0ZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogQSBnZW5lcmljICJzdGF0ZSBjaGFuZ2UiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyB0byAKLSAqIHN1Y2ggZXh0ZW50IHRoYXQgaXQgY2Fubm90IGJlIGRlbGluZWF0ZWQgYWxsIGFzcGVjdHMgb2YgaXQgdGhhdCBoYXZlIGNoYW5nZWQuIAotICogWW91IGNhbiByZWdpc3RlciBhIDxjb2RlPlN0YXRlQ2hhbmdlTGlzdGVuZXI8L2NvZGU+IHdpdGggYSBzb3VyY2UgbW9kZWwgc28gYXMgdG8gYmUgbm90aWZpZWQgCi0gKiBvZiBhbnkgc3VjaCBjaGFuZ2VzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBTdGF0ZUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGEgbW9kZWwgaGFzIGNoYW5nZWQgaW4gc29tZSBnZW5lcmFsIGZhc2hpb24uCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZS4KLQkgKi8KLQl2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvVHJlZUNoYW5nZUFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1RyZWVDaGFuZ2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkN2NjZWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvVHJlZUNoYW5nZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBUcmVlQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgVHJlZUNoYW5nZUFkYXB0ZXIgaW1wbGVtZW50cyBUcmVlQ2hhbmdlTGlzdGVuZXIgewotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgVHJlZUNoYW5nZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1RyZWVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvVHJlZUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlOGM4OTguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvVHJlZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotCi0vKioKLSAqIEEgInRyZWUgY2hhbmdlIiBldmVudCBnZXRzIGZpcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIHRyZWUuIFlvdSBjYW4gcmVnaXN0ZXIgYSA8Y29kZT5UcmVlQ2hhbmdlTGlzdGVuZXI8L2NvZGU+IHdpdGggYSBzb3VyY2UKLSAqIG1vZGVsIHNvIGFzIHRvIGJlIG5vdGlmaWVkIG9mIGFueSBib3VuZCB0cmVlIHVwZGF0ZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRyZWVDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIG5vZGUgaXMgYWRkZWQgdG8gYSBib3VuZCB0cmVlLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIHRyZWUgdGhhdCBjaGFuZ2VkLCBhbmQgdGhlIHBhdGggdG8gdGhlIG5vZGUgdGhhdCB3YXMgYWRkZWQuCi0JICovCi0Jdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBub2RlIGlzIHJlbW92ZWQgZnJvbSBhIGJvdW5kIHRyZWUuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgdHJlZSB0aGF0IGNoYW5nZWQsIGFuZCB0aGUgcGF0aCB0byB0aGUgbm9kZSB0aGF0IHdhcyByZW1vdmVkLgotCSAqLwotCXZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBib3VuZCB0cmVlIGlzIGNsZWFyZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgdHJlZSB0aGF0IGNoYW5nZWQsIGFuZCBhbiBlbXB0eSBwYXRoLgotCSAqLwotCXZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIHBvcnRpb24gb2YgYSBib3VuZCB0cmVlIGlzIGNoYW5nZWQgaW4KLQkgKiBhIG1hbm5lciB0aGF0IGlzIG5vdCBlYXNpbHkgY2hhcmFjdGVyaXplZCBieSB0aGUgb3RoZXIgbWV0aG9kcyBpbiB0aGlzCi0JICogaW50ZXJmYWNlLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIHRyZWUgdGhhdCBjaGFuZ2VkLCBhbmQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlCi0JICogdHJlZSB0aGF0IGNoYW5nZWQuCi0JICovCi0Jdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhZGY1MC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIHRvIGFic3RyYWN0IGNvbGxlY3Rpb24gYWNjZXNzaW5nIGFuZAotICogY2hhbmdlIG5vdGlmaWNhdGlvbiBhbmQgbWFrZSBpdCBtb3JlIHBsdWdnYWJsZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgdmFsdWVzIGhlbGQgYnkgdGhlIG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIE1vZGVsLCBJdGVyYWJsZTxFPgotewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb2xsZWN0aW9uJ3MgdmFsdWVzLgotCSAqLwotCUl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBWQUxVRVMgPSAidmFsdWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCWludCBzaXplKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlL0xpc3RWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9MaXN0VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmQ4ODI4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlL0xpc3RWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdXNlZCB0byBhYnN0cmFjdCBsaXN0IGFjY2Vzc2luZyBhbmQKLSAqIGNoYW5nZSBub3RpZmljYXRpb24gYW5kIG1ha2UgaXQgbW9yZSBwbHVnZ2FibGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIHZhbHVlcyBoZWxkIGJ5IHRoZSBsaXN0IG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGlzdFZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIE1vZGVsLCBJdGVyYWJsZTxFPgotewotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCdzIHZhbHVlcy4KLQkgKi8KLQlJdGVyYXRvcjxFPiBpdGVyYXRvcigpOwotCQlTdHJpbmcgTElTVF9WQUxVRVMgPSAibGlzdCB2YWx1ZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QncyB2YWx1ZXMuCi0JICovCi0JTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBsaXN0LgotCSAqLwotCWludCBzaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGUgbGlzdC4KLQkgKi8KLQlFIGdldChpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0J3MgdmFsdWVzLgotCSAqLwotCU9iamVjdFtdIHRvQXJyYXkoKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvTW9kaWZpYWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9Nb2RpZmlhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY1NThkYy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9Nb2RpZmlhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9IHRvIGFsbG93IHRoZSBzZXR0aW5nIG9mIHRoZQotICogY29sbGVjdGlvbidzIHZhbHVlcy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgdmFsdWVzIGhlbGQgYnkgdGhlIG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kaWZpYWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotewotCS8qKgotCSAqIFNldCB0aGUgdmFsdWVzIGFuZCBmaXJlIGEgY29sbGVjdGlvbiBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCSAqIEBzZWUgQ29sbGVjdGlvblZhbHVlTW9kZWwjVkFMVUVTCi0JICovCi0Jdm9pZCBzZXRWYWx1ZXMoSXRlcmFibGU8RT4gdmFsdWVzKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlL01vZGlmaWFibGVMaXN0VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvTW9kaWZpYWJsZUxpc3RWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NzEzODcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvTW9kaWZpYWJsZUxpc3RWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZTsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIExpc3RWYWx1ZU1vZGVsfSB0byBhbGxvdyB0aGUgc2V0dGluZyBvZiB0aGUKLSAqIGxpc3QncyB2YWx1ZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIHZhbHVlcyBoZWxkIGJ5IHRoZSBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGlmaWFibGVMaXN0VmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQkvKioKLQkgKiBTZXQgdGhlIGxpc3QgdmFsdWVzIGFuZCBmaXJlIGEgbGlzdCBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCSAqIEBzZWUgTGlzdFZhbHVlTW9kZWwjTElTVF9WQUxVRVMKLQkgKi8KLQl2b2lkIHNldExpc3RWYWx1ZXMoSXRlcmFibGU8RT4gdmFsdWVzKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlL01vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlL01vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFmZTA1MC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZTsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH0gdG8gYWxsb3cgdGhlIHNldHRpbmcgb2YgdGhlIHByb3BlcnR5J3MgdmFsdWUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAcGFyYW0gPFY+IHRoZSB0eXBlIG9mIHZhbHVlIGhlbGQgYnkgdGhlIG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPgotCWV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPFY+Ci17Ci0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBhbmQgZmlyZSBhIHByb3BlcnR5IGNoYW5nZSBub3RpZmljYXRpb24uCi0JICogQHNlZSBQcm9wZXJ0eVZhbHVlTW9kZWwjVkFMVUUKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFYgdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9Qcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5OGM4OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9Qcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIHRvIGFic3RyYWN0IHByb3BlcnR5IGFjY2Vzc2luZyBhbmQKLSAqIGNoYW5nZSBub3RpZmljYXRpb24gYW5kIG1ha2UgaXQgbW9yZSBwbHVnZ2FibGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAcGFyYW0gPFY+IHRoZSB0eXBlIG9mIHZhbHVlIGhlbGQgYnkgdGhlIG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlWYWx1ZU1vZGVsPFY+Ci0JZXh0ZW5kcyBNb2RlbAotewotCS8qKgotCSAqIFJldHVybiB0aGUgbW9kZWwncyB2YWx1ZS4KLQkgKi8KLQlWIGdldFZhbHVlKCk7Ci0JCVN0cmluZyBWQUxVRSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlL1RyZWVOb2RlVmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZU5vZGVWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZGMyNjMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZU5vZGVWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZTsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9IHRvIGJldHRlciBzdXBwb3J0Ci0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRyZWVNb2RlbEFkYXB0ZXJ9LgotICogPHA+Ci0gKiBJbXBsZW1lbnRvcnMgb2YgdGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGZpcmUgYSAic3RhdGUgY2hhbmdlIiBldmVudAotICogd2hlbmV2ZXIgdGhlIG5vZGUncyBpbnRlcm5hbCBzdGF0ZSBjaGFuZ2VzIGluIGEgd2F5IHRoYXQgdGhlCi0gKiB0cmVlIGxpc3RlbmVycyBzaG91bGQgYmUgbm90aWZpZWQuCi0gKiA8cD4KLSAqIEltcGxlbWVudG9ycyBvZiB0aGlzIGludGVyZmFjZSBzaG91bGQgYWxzbyBmaXJlIGEgInZhbHVlIHByb3BlcnR5IGNoYW5nZSIKLSAqIGV2ZW50IHdoZW5ldmVyIHRoZSBub2RlJ3MgdmFsdWUgY2hhbmdlcy4gVHlwaWNhbGx5LCBvbmx5IG5vZGVzIHRoYXQKLSAqIGhvbGQgInByaW1pdGl2ZSIgZGF0YSB3aWxsIGZpcmUgdGhpcyBldmVudC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBwYXJhbSA8VD4gdGhlIHR5cGUgb2YgdmFsdWVzIGhlbGQgYnkgdGhlIG1vZGVsCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5vZGUncyBwYXJlbnQgbm9kZTsgbnVsbCBpZiB0aGUgbm9kZQotCSAqIGlzIHRoZSByb290LgotCSAqLwotCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGF0aCB0byB0aGUgbm9kZS4KLQkgKi8KLQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBwYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IHZhbHVlIG1vZGVsIG9mIHRoZSBub2RlJ3MgY2hpbGQgbm9kZXMuCi0JICovCi0JTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbk1vZGVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5vZGUncyBjaGlsZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBjaGlsZChpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub2RlJ3MgbGlzdCBvZiBjaGlsZHJlbi4KLQkgKi8KLQlpbnQgY2hpbGRyZW5TaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGluIHRoZSBub2RlJ3MgbGlzdCBvZiBjaGlsZHJlbiBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkLgotCSAqLwotCWludCBpbmRleE9mQ2hpbGQoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IGNoaWxkKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgbGVhZiAoaS5lLiBpdCBoYXMgbm8gY2hpbGRyZW4pCi0JICovCi0JYm9vbGVhbiBpc0xlYWYoKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlL1RyZWVWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhM2U0NGQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdXNlZCB0byBhYnN0cmFjdCB0cmVlIGFjY2Vzc2luZyBhbmQKLSAqIGNoYW5nZSBub3RpZmljYXRpb24gYW5kIG1ha2UgaXQgbW9yZSBwbHVnZ2FibGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIHZhbHVlcyBoZWxkIGJ5IHRoZSBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRyZWVWYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBNb2RlbAotewotCS8qKgotCSAqIFJldHVybiB0aGUgdHJlZSdzIG5vZGVzLgotCSAqLwotCUl0ZXJhdG9yPEU+IG5vZGVzKCk7Ci0JCVN0cmluZyBOT0RFUyA9ICJub2RlcyI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvc3luY2hyb25pemVycy9DYWxsYmFja1N5bmNocm9uaXplci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvc3luY2hyb25pemVycy9DYWxsYmFja1N5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjE2NjJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3N5bmNocm9uaXplcnMvQ2FsbGJhY2tTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBTeW5jaHJvbml6ZXJ9IHRvIG5vdGlmeSBsaXN0ZW5lcnMKLSAqIHdoZW4gYSBzeW5jaHJvbml6YXRpb24gImN5Y2xlIiBpcyBjb21wbGV0ZTsgaS5lLiB0aGUgc3luY2hyb25pemF0aW9uIGhhcywKLSAqIGZvciB0aGUgbW9tZW50LCBxdWllc2NlZC4KLSAqLwotcHVibGljIGludGVyZmFjZSBDYWxsYmFja1N5bmNocm9uaXplcgotCWV4dGVuZHMgU3luY2hyb25pemVyCi17Ci0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgd2hlbmV2ZXIgdGhlIHN5bmNocm9uaXplciBoYXMKLQkgKiBxdWllc2NlZC4KLQkgKiBAc2VlICNyZW1vdmVMaXN0ZW5lcihMaXN0ZW5lcikKLQkgKi8KLQl2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyLgotCSAqIEBzZWUgI2FkZExpc3RlbmVyKExpc3RlbmVyKQotCSAqLwotCXZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBsaXN0ZW5lcnMgdG8gYmUgbm90aWZpZWQgd2hlbmV2ZXIgdGhlCi0JICogc3luY2hyb25pemVyIGhhcyBxdWllc2NlZC4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyCi0JCWV4dGVuZHMgRXZlbnRMaXN0ZW5lcgotCXsKLQkJLyoqCi0JCSAqIFRoZSBzcGVjaWZpZWQgc3luY2hyb25pemVyIGhhcyBxdWllc2NlZC4KLQkJICovCi0JCXZvaWQgc3luY2hyb25pemF0aW9uUXVpZXNjZWQoQ2FsbGJhY2tTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIENhbGxiYWNrU3luY2hyb25pemVyfSBpbnRlcmZhY2UgdGhhdCB3aWxsIGRvCi0JICogbm90aGluZy4KLQkgKi8KLQlmaW5hbCBjbGFzcyBOdWxsCi0JCWltcGxlbWVudHMgQ2FsbGJhY2tTeW5jaHJvbml6ZXIsIFNlcmlhbGl6YWJsZQotCXsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBDYWxsYmFja1N5bmNocm9uaXplciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCXB1YmxpYyBzdGF0aWMgQ2FsbGJhY2tTeW5jaHJvbml6ZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3N5bmNocm9uaXplcnMvU3luY2hyb25pemVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9zeW5jaHJvbml6ZXJzL1N5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQ1ZDc4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3N5bmNocm9uaXplcnMvU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5zeW5jaHJvbml6ZXJzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgdGhlIHByb3RvY29sIGZvciBzdGFydGluZywgc3RvcHBpbmcsIGFuZCBleGVjdXRpbmcgYQotICogbG9uZy1ydW5uaW5nLCByZXBlYXRhYmxlLCBhbmQgcG9zc2libHkgcmVjdXJzaXZlICJzeW5jaHJvbml6YXRpb24iIHByb2Nlc3MuCi0gKiBUaGUgaW50ZW50IGlzIGZvciB0aGUgc3luY2hyb25pemVyIHRvIHN5bmNocm9uaXplIGEgInNlY29uZGFyeSIgbW9kZWwgd2l0aAotICogYSAicHJpbWFyeSIgbW9kZWwuIEFueSBjaGFuZ2UgdG8gdGhlICJwcmltYXJ5IiBtb2RlbCB3aWxsIHRyaWdnZXIgdGhlCi0gKiBzeW5jaHJvbml6YXRpb24uIFRoZSBzeW5jaHJvbml6ZXIgaW1wbGVtZW50YXRpb24gd2lsbCBkZXRlcm1pbmUgd2hldGhlciB0aGUKLSAqICJzZWNvbmRhcnkiIG1vZGVsIHJlbWFpbnMgaW4gc3luYyBzeW5jaHJvbm91c2x5IG9yIGFzeW5jaHJvbm91c2x5LgotICogPHA+Ci0gKiBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoZSB7QGxpbmsgI3N0YXJ0KCl9IGFuZCB7QGxpbmsgI3N0b3AoKX0gbWV0aG9kcyB3aWxsIGJlIGNhbGxlZCBmcm9tCi0gKiBhIHNpbmdsZSBtYXN0ZXIgdGhyZWFkIHRoYXQgd291bGQgY29udHJvbCB0aGUgc3luY2hyb25pemVyJ3MgbGlmZWN5Y2xlIGFuZAotICogdGhlIHtAbGluayAjc3luY2hyb25pemUoKX0gbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLCBwb3NzaWJseSBmcm9tCi0gKiBtdWx0aXBsZSB0aHJlYWRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN5bmNocm9uaXplciB7Ci0KLQkvKioKLQkgKiBFbmFibGUgdGhlIHN5bmNocm9uaXplciB0byBhbGxvdyBmdXR1cmUgc3luY2hyb25pemF0aW9ucyBhcyByZXF1ZXN0ZWQKLQkgKiBieSBjYWxscyB0byB7QGxpbmsgI3N5bmNocm9uaXplKCl9LgotCSAqLwotCXZvaWQgc3RhcnQoKTsKLQotCS8qKgotCSAqIFN5bmNocm9uaXplIHRoZSBkZXBlbmRlbnQgbW9kZWwgd2l0aCB0aGUgcHJpbWFyeSBtb2RlbC4gRG8gbm90aGluZyBpZgotCSAqIHtAbGluayAjc3RhcnQoKX0gaGFzIG5vdCBwcmV2aW91c2x5IGJlZW4gY2FsbGVkLiBEbyBub3RoaW5nIGlmIHtAbGluayAjc3RvcH0KLQkgKiBoYXMgYmVlbiBjYWxsZWQgKHdpdGhvdXQgYW55IGludGVybWVkaWF0ZSBjYWxsIHRvIHtAbGluayAjc3RhcnQoKX0uCi0JICovCi0Jdm9pZCBzeW5jaHJvbml6ZSgpOwotCi0JLyoqCi0JICogU3RvcCB0aGUgc3luY2hyb25pemVyIGltbWVkaWF0ZWx5IG9yLCBpZiBhIHN5bmNocm9uaXphdGlvbiBpcyBjdXJyZW50bHkKLQkgKiBpbiBwcm9ncmVzcywgd2hlbiBpdCBjb21wbGV0ZXMuIFJldHVybiB3aGVuIHRoZSBzeW5jaHJvbml6ZXIgaXMgc3RvcHBlZC4KLQkgKiBObyBmdXJ0aGVyIHN5bmNob25pemF0aW9ucyB3aWxsIHBlcmZvcm1lZCB1bnRpbCB7QGxpbmsgI3N0YXJ0KCl9IGlzIGNhbGxlZC4KLQkgKi8KLQl2b2lkIHN0b3AoKTsKLQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgU3luY2hyb25pemVyfSBpbnRlcmZhY2UgdGhhdCB3aWxsIGRvCi0JICogbm90aGluZy4KLQkgKi8KLQlmaW5hbCBjbGFzcyBOdWxsCi0JCWltcGxlbWVudHMgU3luY2hyb25pemVyLCBTZXJpYWxpemFibGUKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3luY2hyb25pemVyIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJcHVibGljIHN0YXRpYyBTeW5jaHJvbml6ZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy8uY2xhc3NwYXRoIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTUzMDM5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy8uY3ZzaWdub3JlIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy8ucHJvamVjdCBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MzlkMTMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTQwOTBiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDY6MjQgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzNzBkYS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSJbNC4wLjAsNS4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0O3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvYWJvdXQuaHRtbCBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2QyOWJjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjJiODIwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb21tb24gQ29yZSBUZXN0cwotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvSnB0Q29tbW9uQ29yZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvSnB0Q29tbW9uQ29yZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MzI1M2EuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL0pwdENvbW1vbkNvcmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkpwdENvbW1vbkNvcmVSZXNvdXJjZUphdmFUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQuSnB0Q29tbW9uQ29yZVV0aWxpdHlKZHRUZXN0czsKLQotcHVibGljIGNsYXNzIEpwdENvbW1vbkNvcmVUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0Q29tbW9uQ29yZVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdENvbW1vbkNvcmVSZXNvdXJjZUphdmFUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRDb21tb25Db3JlVXRpbGl0eUpkdFRlc3RzLnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXByaXZhdGUgSnB0Q29tbW9uQ29yZVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEZhY2V0ZWRQcm9qZWN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEZhY2V0ZWRQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYmE3NGIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RGYWNldGVkUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogVGhpcyBidWlsZHMgYW5kIGhvbGRzIGEgImZhY2V0ZWQiIHByb2plY3QuCi0gKiBTdXBwb3J0IGZvciBpbnN0YWxsaW5nIGZhY2V0cy4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RGYWNldGVkUHJvamVjdCBleHRlbmRzIFRlc3RQbGF0Zm9ybVByb2plY3QgewotCXByaXZhdGUgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0OwotCi0KLQkvLyAqKioqKioqKioqIGJ1aWxkZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUZXN0RmFjZXRlZFByb2plY3QgYnVpbGRGYWNldGVkUHJvamVjdChTdHJpbmcgYmFzZVByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBUZXN0RmFjZXRlZFByb2plY3QoYmFzZVByb2plY3ROYW1lLCBhdXRvQnVpbGQpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGVzdEZhY2V0ZWRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzKHByb2plY3ROYW1lLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIFRlc3RGYWNldGVkUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKHByb2plY3ROYW1lLCBhdXRvQnVpbGQpOwotCQl0aGlzLmZhY2V0ZWRQcm9qZWN0ID0gdGhpcy5jcmVhdGVGYWNldGVkUHJvamVjdCgpOwotCX0KLQotCXByaXZhdGUgSUZhY2V0ZWRQcm9qZWN0IGNyZWF0ZUZhY2V0ZWRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHRoaXMuZ2V0UHJvamVjdCgpLCB0cnVlLCBudWxsKTsJCS8vIHRydWUgPSAiY29udmVydCBpZiBuZWNlc3NhcnkiCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBJRmFjZXRlZFByb2plY3QgZ2V0RmFjZXRlZFByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLmZhY2V0ZWRQcm9qZWN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGluc3RhbGxGYWNldChTdHJpbmcgZmFjZXROYW1lLCBTdHJpbmcgdmVyc2lvbk5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhpcy5pbnN0YWxsRmFjZXQoZmFjZXROYW1lLCB2ZXJzaW9uTmFtZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsRmFjZXQoU3RyaW5nIGZhY2V0TmFtZSwgU3RyaW5nIHZlcnNpb25OYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRoaXMudW5pbnN0YWxsRmFjZXQoZmFjZXROYW1lLCB2ZXJzaW9uTmFtZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogaWYgJ2NvbmZpZycgaXMgbnVsbCAoYW5kICdmYWNldE5hbWUnIGlzICJqcHQuanBhIiksIHRoZSBKUEEgcHJvamVjdCB3aWxsIGJlIGJ1aWx0IHdpdGggdGhlIGRlZmF1bHRzCi0JICogZGVmaW5lZCBpbiBKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciNnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nKQotCSAqIEluIEpQQSB0aGUgY29uZmlnIG9iamVjdCB3aWxsIGJlIGFuIElEYXRhTW9kZWwKLQkgKiBJbiBKQVhCIHRoZSBjb25maWcgb2JqZWN0IHdpbGwgYmUgYSBKYXhiRmFjZXRJbnN0YWxsQ29uZmlnCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbEZhY2V0KFN0cmluZyBmYWNldE5hbWUsIFN0cmluZyB2ZXJzaW9uTmFtZSwgT2JqZWN0IGNvbmZpZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzLmZhY2V0ZWRQcm9qZWN0Lmluc3RhbGxQcm9qZWN0RmFjZXQodGhpcy5mYWNldFZlcnNpb24oZmFjZXROYW1lLCB2ZXJzaW9uTmFtZSksIGNvbmZpZywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogSW4gSlBBIHRoZSBjb25maWcgb2JqZWN0IHdpbGwgYmUgYW4gSURhdGFNb2RlbAotCSAqIEluIEpBWEIgdGhlIGNvbmZpZyBvYmplY3Qgd2lsbCBiZSBhIEpheGJGYWNldFVuaW5zdGFsbENvbmZpZwotCSAqLwotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbEZhY2V0KFN0cmluZyBmYWNldE5hbWUsIFN0cmluZyB2ZXJzaW9uTmFtZSwgT2JqZWN0IGNvbmZpZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzLmZhY2V0ZWRQcm9qZWN0LnVuaW5zdGFsbFByb2plY3RGYWNldCh0aGlzLmZhY2V0VmVyc2lvbihmYWNldE5hbWUsIHZlcnNpb25OYW1lKSwgY29uZmlnLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZhY2V0VmVyc2lvbihTdHJpbmcgZmFjZXROYW1lLCBTdHJpbmcgdmVyc2lvbk5hbWUpIHsKLQkJcmV0dXJuIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChmYWNldE5hbWUpLmdldFZlcnNpb24odmVyc2lvbk5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RKYXZhUHJvamVjdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RKYXZhUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWE3ZTM4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC9wcm9qZWN0cy9UZXN0SmF2YVByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLQotLyoqCi0gKiBUaGlzIGJ1aWxkcyBhbmQgaG9sZHMgYSAiSmF2YSIgcHJvamVjdC4KLSAqIFN1cHBvcnQgZm9yIGFkZGluZyBwYWNrYWdlcyBhbmQgdHlwZXMuCi0gKiAKLSAqICJKYXZhIiBwcm9qZWN0cyBhcmVuJ3QgcmVxdWlyZWQgdG8gYmUgImZhY2V0ZWQiIHByb2plY3RzLCBidXQgZm9yIEpQQQotICogdGVzdGluZyB0aGV5IGFyZS4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGVzdEphdmFQcm9qZWN0IGV4dGVuZHMgVGVzdEZhY2V0ZWRQcm9qZWN0IHsKLQlwcml2YXRlIGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLQlwcml2YXRlIGZpbmFsIElQYWNrYWdlRnJhZ21lbnRSb290IHNvdXJjZUZvbGRlcjsKLQotCi0JLy8gKioqKioqKioqKiBidWlsZGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVGVzdEphdmFQcm9qZWN0IGJ1aWxkSmF2YVByb2plY3QoU3RyaW5nIGJhc2VQcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgVGVzdEphdmFQcm9qZWN0KGJhc2VQcm9qZWN0TmFtZSwgYXV0b0J1aWxkKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRlc3RKYXZhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhpcyhwcm9qZWN0TmFtZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBUZXN0SmF2YVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlcihwcm9qZWN0TmFtZSwgYXV0b0J1aWxkKTsKLQkJdGhpcy5pbnN0YWxsRmFjZXQoImpzdC5qYXZhIiwgIjUuMCIpOwotCQl0aGlzLmphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHRoaXMuZ2V0UHJvamVjdCgpKTsKLQkJdGhpcy5zb3VyY2VGb2xkZXIgPSB0aGlzLmphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QodGhpcy5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJzcmMiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkSmFyKFN0cmluZyBqYXJQYXRoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJdGhpcy5hZGRDbGFzc3BhdGhFbnRyeShKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkobmV3IFBhdGgoamFyUGF0aCksIG51bGwsIG51bGwpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ2xhc3NwYXRoRW50cnkoSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgoQXJyYXlUb29scy5hZGQodGhpcy5qYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSwgZW50cnkpLCBudWxsKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0OwotCX0KLQotCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50IGNyZWF0ZVBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLnNvdXJjZUZvbGRlci5jcmVhdGVQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUsIGZhbHNlLCBudWxsKTsJLy8gZmFsc2UgPSAibm8gZm9yY2UiCi0JfQotCi0JLyoqCi0JICogVGhlIHNvdXJjZSBzaG91bGQgTk9UIGNvbnRhaW4gYSBwYWNrYWdlIGRlY2xhcmF0aW9uOwotCSAqIGl0IHdpbGwgYmUgYWRkZWQgaGVyZS4KLQkgKi8KLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgY29tcGlsYXRpb25Vbml0TmFtZSwgU3RyaW5nIHNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVDb21waWxhdGlvblVuaXQodGhpcy5jcmVhdGVQYWNrYWdlKHBhY2thZ2VOYW1lKSwgY29tcGlsYXRpb25Vbml0TmFtZSwgbmV3IFNpbXBsZVNvdXJjZVdyaXRlcihzb3VyY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc291cmNlIHNob3VsZCBOT1QgY29udGFpbiBhIHBhY2thZ2UgZGVjbGFyYXRpb247Ci0JICogaXQgd2lsbCBiZSBhZGRlZCBoZXJlLgotCSAqLwotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBjb21waWxhdGlvblVuaXROYW1lLCBTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCh0aGlzLmNyZWF0ZVBhY2thZ2UocGFja2FnZU5hbWUpLCBjb21waWxhdGlvblVuaXROYW1lLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzb3VyY2Ugc2hvdWxkIE5PVCBjb250YWluIGEgcGFja2FnZSBkZWNsYXJhdGlvbjsKLQkgKiBpdCB3aWxsIGJlIGFkZGVkIGhlcmUuCi0JICovCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0KElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50LCBTdHJpbmcgY29tcGlsYXRpb25Vbml0TmFtZSwgU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwMCk7Ci0JCXNvdXJjZVdyaXRlci5hcHBlbmRTb3VyY2VUbyhzYik7Ci0JCVN0cmluZyBzb3VyY2UgPSBzYi50b1N0cmluZygpOwotCQlyZXR1cm4gcGFja2FnZUZyYWdtZW50LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChjb21waWxhdGlvblVuaXROYW1lLCBzb3VyY2UsIGZhbHNlLCBudWxsKTsJLy8gZmFsc2UgPSAibm8gZm9yY2UiCi0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioKLQotCXB1YmxpYyBpbnRlcmZhY2UgU291cmNlV3JpdGVyIHsKLQkJdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKTsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgU2ltcGxlU291cmNlV3JpdGVyIGltcGxlbWVudHMgU291cmNlV3JpdGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc291cmNlOwotCQlwdWJsaWMgU2ltcGxlU291cmNlV3JpdGVyKFN0cmluZyBzb3VyY2UpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5zb3VyY2UpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdFBsYXRmb3JtUHJvamVjdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RQbGF0Zm9ybVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJlYTQwMC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdFBsYXRmb3JtUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi0vKioKLSAqIFRoaXMgYnVpbGRzIGFuZCBob2xkcyBhICJnZW5lcmFsIiBFY2xpcHNlIHByb2plY3QuCi0gKiBTdXBwb3J0IGZvciBhZGRpbmcgbmF0dXJlcywgZm9sZGVycywgYW5kIGZpbGVzLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdFBsYXRmb3JtUHJvamVjdCB7Ci0JcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBwcm9qZWN0OwotCi0JLyoqIGNhcnJpYWdlIHJldHVybiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3RyaW5nVG9vbHMuQ1I7Ci0KLQkKLQkvLyAqKioqKioqKioqIGJ1aWxkZXJzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3RQbGF0Zm9ybVByb2plY3QgYnVpbGRQbGF0Zm9ybVByb2plY3QoU3RyaW5nIGJhc2VQcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgVGVzdFBsYXRmb3JtUHJvamVjdChiYXNlUHJvamVjdE5hbWUsIGF1dG9CdWlsZCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgVGVzdFBsYXRmb3JtUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc2V0QXV0b0J1aWxkKGF1dG9CdWlsZCk7ICAvLyB3b3Jrc3BhY2Utd2lkZSBzZXR0aW5nCi0JCXRoaXMucHJvamVjdCA9IHRoaXMuYnVpbGRQbGF0Zm9ybVByb2plY3QocHJvamVjdE5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRBdXRvQnVpbGQoYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCk7Ci0JCWRlc2NyaXB0aW9uLnNldEF1dG9CdWlsZGluZyhhdXRvQnVpbGQpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCX0KLQotCXByaXZhdGUgSVByb2plY3QgYnVpbGRQbGF0Zm9ybVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHAgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQl0aGlzLmNyZWF0ZVByb2plY3QocCk7Ci0JCXAub3BlbihudWxsKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3QoSVByb2plY3QgcCkgewotCQlUZXN0VG9vbHMuZXhlY3V0ZShuZXcgQ3JlYXRlUHJvamVjdENvbW1hbmQocCksIDQpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQ3JlYXRlUHJvamVjdENvbW1hbmQKLQkJaW1wbGVtZW50cyBUZXN0Q29tbWFuZAotCXsKLQkJcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBwcm9qZWN0OwotCQlwcm90ZWN0ZWQgQ3JlYXRlUHJvamVjdENvbW1hbmQoSVByb2plY3QgcHJvamVjdCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JCX0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkJdGhpcy5wcm9qZWN0LmNyZWF0ZShudWxsKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMucHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQcm9qZWN0TmF0dXJlKFN0cmluZyBuYXR1cmVJRCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gdGhpcy5wcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhBcnJheVRvb2xzLmFkZChkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKSwgbmF0dXJlSUQpKTsKLQkJdGhpcy5wcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9qZWN0TmF0dXJlKFN0cmluZyBuYXR1cmVJRCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gdGhpcy5wcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpLCBuYXR1cmVJRCkpOwotCQl0aGlzLnByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY5NTJjNS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuR2VuZXJpY0Fubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlUGFja2FnZUluZm9Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVR5cGVDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk51bGxBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRW51bUNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2VJbmZvQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGlvblRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQml0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZQotCQlleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBKYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyIGphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXI7Ci0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ7Ci0JCi0JCi0JcHVibGljIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lciA9IG5ldyBKYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyKCk7Ci0JCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcy5qYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJSmF2YUNvcmUucmVtb3ZlRWxlbWVudENoYW5nZWRMaXN0ZW5lcih0aGlzLmphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIgPSBudWxsOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIEphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIKLQkJCWltcGxlbWVudHMgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgewotCQkKLQkJSmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UudGhpcy5qYXZhRWxlbWVudENoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0JfQotCQotCXZvaWQgamF2YUVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLnN5bmNXaXRoSmF2YURlbHRhKGV2ZW50LmdldERlbHRhKCkpOwotCX0KLQkKLQkvKioKLQkgKiBOQjogdGhpcyBpcyBjb3BpZWQgZnJvbSBHZW5lcmljSnBhUHJvamVjdCwgc28gaXQgbWlnaHQgbmVlZCB0byBiZQotCSAqIGtlcHQgaW4gc3luY2ggd2l0aCB0aGF0IGNvZGUgaWYgaXQgY2hhbmdlcy4uLiB5ZWNoLi4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3luY1dpdGhKYXZhRGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJc3dpdGNoIChkZWx0YS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9NT0RFTCA6Ci0JCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QgOgotCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UIDoKLQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgotCQkJCXRoaXMuc3luY1dpdGhKYXZhRGVsdGFDaGlsZHJlbihkZWx0YSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUIDoKLQkJCQl0aGlzLmphdmFDb21waWxhdGlvblVuaXRDaGFuZ2VkKGRlbHRhKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOyAvLyBpZ25vcmUgdGhlIGVsZW1lbnRzIGluc2lkZSBhIGNvbXBpbGF0aW9uIHVuaXQKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNXaXRoSmF2YURlbHRhQ2hpbGRyZW4oSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJZm9yIChJSmF2YUVsZW1lbnREZWx0YSBjaGlsZCA6IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkgewotCQkJdGhpcy5zeW5jV2l0aEphdmFEZWx0YShjaGlsZCk7IC8vIHJlY3Vyc2UKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGphdmFDb21waWxhdGlvblVuaXRDaGFuZ2VkKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmICh0aGlzLmRlbHRhSXNSZWxldmFudChkZWx0YSkpIHsKLQkJCXRoaXMuamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LnN5bmNocm9uaXplV2l0aEphdmFTb3VyY2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGRlbHRhSXNSZWxldmFudChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlpZiAoQml0VG9vbHMub25seUZsYWdJc1NldChkZWx0YS5nZXRGbGFncygpLCBJSmF2YUVsZW1lbnREZWx0YS5GX1BSSU1BUllfV09SS0lOR19DT1BZKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIFN0cmluZyBhbm5vdGF0aW9uQm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChwYWNrYWdlTmFtZSwgYW5ub3RhdGlvbk5hbWUgKyAiLmphdmEiLCAicHVibGljIEBpbnRlcmZhY2UgIiArIGFubm90YXRpb25OYW1lICsgIiB7ICIgKyBhbm5vdGF0aW9uQm9keSArICIgfSIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVFbnVtQW5kTWVtYmVycyhTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBlbnVtTmFtZSwgU3RyaW5nIGVudW1Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KHBhY2thZ2VOYW1lLCBlbnVtTmFtZSArICIuamF2YSIsICJwdWJsaWMgZW51bSAiICsgZW51bU5hbWUgKyAiIHsgIiArIGVudW1Cb2R5ICsgIiB9Iik7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQYWNrYWdlIGJ1aWxkSmF2YVJlc291cmNlUGFja2FnZShJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2VJbmZvQ29tcGlsYXRpb25Vbml0IHBrZ0N1ID0gCi0JCQkJbmV3IFNvdXJjZVBhY2thZ2VJbmZvQ29tcGlsYXRpb25Vbml0KAotCQkJCQkJY3UsCi0JCQkJCQl0aGlzLmJ1aWxkQW5ub3RhdGlvblByb3ZpZGVyKCksCi0JCQkJCQlOdWxsQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSwKLQkJCQkJCUNvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCkpOwotCQl0aGlzLmphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCA9IHBrZ0N1OwotCQlyZXR1cm4gcGtnQ3UuZ2V0UGFja2FnZSgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VUeXBlIGJ1aWxkSmF2YVJlc291cmNlVHlwZShJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiAoSmF2YVJlc291cmNlVHlwZSkgdGhpcy5idWlsZEphdmFSZXNvdXJjZVR5cGVfKGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlRW51bSBidWlsZEphdmFSZXNvdXJjZUVudW0oSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gKEphdmFSZXNvdXJjZUVudW0pIHRoaXMuYnVpbGRKYXZhUmVzb3VyY2VUeXBlXyhjdSk7Ci0JfQotCi0JcHJpdmF0ZSBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYnVpbGRKYXZhUmVzb3VyY2VUeXBlXyhJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXRoaXMuamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0ID0gdGhpcy5idWlsZEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChjdSk7Ci0JCXRoaXMuamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LnJlc29sdmVUeXBlcygpOwotCQlyZXR1cm4gdGhpcy5oYWNrSmF2YVJlc291cmNlVHlwZSgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VGaWVsZCBnZXRGaWVsZChKYXZhUmVzb3VyY2VUeXBlIHR5cGUsIGludCBpbmRleCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmdldCh0eXBlLmdldEZpZWxkcygpLCBpbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZU1ldGhvZCBnZXRNZXRob2QoSmF2YVJlc291cmNlVHlwZSB0eXBlLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5nZXQodHlwZS5nZXRNZXRob2RzKCksIGluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlRW51bUNvbnN0YW50IGdldEVudW1Db25zdGFudChKYXZhUmVzb3VyY2VFbnVtIHJlc291cmNlRW51bSwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlRW51bS5nZXRFbnVtQ29uc3RhbnRzKCksIGluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGhhY2tKYXZhUmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gKEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUodGhpcy5qYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQsICJwcmltYXJ5VHlwZSIpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgYnVpbGRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlpZiAodGhpcy5qYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiBuZXcgU291cmNlVHlwZUNvbXBpbGF0aW9uVW5pdCgKLQkJCQljdSwKLQkJCQl0aGlzLmJ1aWxkQW5ub3RhdGlvblByb3ZpZGVyKCksCi0JCQkJTnVsbEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCksCi0JCQkJQ29tbWFuZEV4ZWN1dG9yLkRlZmF1bHQuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb25Qcm92aWRlciBidWlsZEFubm90YXRpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljQW5ub3RhdGlvblByb3ZpZGVyKHRoaXMuYW5ub3RhdGlvbkRlZmluaXRpb25zKCksIHRoaXMubmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBBbm5vdGF0aW9uRGVmaW5pdGlvbltdIGFubm90YXRpb25EZWZpbml0aW9ucygpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uW10gbmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pwdENvbW1vbkNvcmVSZXNvdXJjZUphdmFUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSnB0Q29tbW9uQ29yZVJlc291cmNlSmF2YVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZjZhNjguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSnB0Q29tbW9uQ29yZVJlc291cmNlSmF2YVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotCi1wdWJsaWMgY2xhc3MgSnB0Q29tbW9uQ29yZVJlc291cmNlSmF2YVRlc3RzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0Q29tbW9uQ29yZVJlc291cmNlSmF2YVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU291cmNlQXR0cmlidXRlVGVzdHMuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXByaXZhdGUgSnB0Q29tbW9uQ29yZVJlc291cmNlSmF2YVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Tb3VyY2VBdHRyaWJ1dGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvU291cmNlQXR0cmlidXRlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjZmM4OS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Tb3VyY2VBdHRyaWJ1dGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLQotCi1wdWJsaWMgY2xhc3MgU291cmNlQXR0cmlidXRlVGVzdHMKLQkJZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVEVTVF9DTEFTU19OQU1FID0gIlRlc3RDbGFzcyI7Ci0JCi0JCi0JcHVibGljIFNvdXJjZUF0dHJpYnV0ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkRlZmluaXRpb25bXSBhbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGlvbkRlZmluaXRpb25bMF07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uW10gbmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvblswXTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDbGFzc1dpdGhWYXJpb3VzQXR0cmlidXRlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoImltcG9ydCBqYXZhLnV0aWwuTGlzdDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKFRFU1RfQ0xBU1NfTkFNRSkuYXBwZW5kKCI8VCBleHRlbmRzIE51bWJlcj4gIikuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgU3RyaW5nIHN0cmluZzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gc3RyaW5nTGlzdDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBTdHJpbmdbXSBzdHJpbmdBcnJheTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBTdHJpbmdbXVtdIHN0cmluZ0RvdWJsZUFycmF5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIFQgZ2VuZXJpYzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBMaXN0PFQ+IGdlbmVyaWNMaXN0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIFRbXSBnZW5lcmljQXJyYXk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgTGlzdDw/PiB3aWxkY2FyZExpc3Q7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCBURVNUX0NMQVNTX05BTUUgKyAiLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlVHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCB0ZXN0Q2xhc3NDVSA9IGNyZWF0ZVRlc3RDbGFzc1dpdGhWYXJpb3VzQXR0cmlidXRlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHRlc3RDbGFzcyA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZSh0ZXN0Q2xhc3NDVSk7Ci0JCQotCQkvLyBTdHJpbmcgc3RyaW5nCi0JCUphdmFSZXNvdXJjZUZpZWxkIGF0dCA9IGdldEZpZWxkKHRlc3RDbGFzcywgMCk7Ci0JCWFzc2VydEVxdWFscygic3RyaW5nIiwgYXR0LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIGF0dC5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHQudHlwZUlzQXJyYXkoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhdHQuZ2V0VHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHQuZ2V0VHlwZUFycmF5RGltZW5zaW9uYWxpdHkoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHQuZ2V0VHlwZVR5cGVBcmd1bWVudE5hbWVzU2l6ZSgpKTsKLQkJCi0JCS8vIExpc3Q8U3RyaW5nPiBzdHJpbmdMaXN0Ci0JCWF0dCA9IGdldEZpZWxkKHRlc3RDbGFzcywgMSk7Ci0JCWFzc2VydEVxdWFscygic3RyaW5nTGlzdCIsIGF0dC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0IiwgYXR0LmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dC50eXBlSXNBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGF0dC5nZXRUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGF0dC5nZXRUeXBlQXJyYXlEaW1lbnNpb25hbGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dC5nZXRUeXBlVHlwZUFyZ3VtZW50TmFtZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBhdHQuZ2V0VHlwZVR5cGVBcmd1bWVudE5hbWUoMCkpOwotCQkKLQkJLy8gU3RyaW5nW10gc3RyaW5nQXJyYXkKLQkJYXR0ID0gZ2V0RmllbGQodGVzdENsYXNzLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdHJpbmdBcnJheSIsIGF0dC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmdbXSIsIGF0dC5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dC50eXBlSXNBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgYXR0LmdldFR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0LmdldFR5cGVBcnJheURpbWVuc2lvbmFsaXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYXR0LmdldFR5cGVUeXBlQXJndW1lbnROYW1lc1NpemUoKSk7Ci0JCQotCQkvLyBTdHJpbmdbXSBzdHJpbmdEb3VibGVBcnJheQotCQlhdHQgPSBnZXRGaWVsZCh0ZXN0Q2xhc3MsIDMpOwotCQlhc3NlcnRFcXVhbHMoInN0cmluZ0RvdWJsZUFycmF5IiwgYXR0LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZ1tdW10iLCBhdHQuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhdHQudHlwZUlzQXJyYXkoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIGF0dC5nZXRUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dC5nZXRUeXBlQXJyYXlEaW1lbnNpb25hbGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGF0dC5nZXRUeXBlVHlwZUFyZ3VtZW50TmFtZXNTaXplKCkpOwotCQkKLQkJLy8gVCBnZW5lcmljCi0JCWF0dCA9IGdldEZpZWxkKHRlc3RDbGFzcywgNCk7Ci0JCWFzc2VydEVxdWFscygiZ2VuZXJpYyIsIGF0dC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdW1iZXIiLCBhdHQuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgYXR0LnR5cGVJc0FycmF5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYXR0LmdldFR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYXR0LmdldFR5cGVBcnJheURpbWVuc2lvbmFsaXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYXR0LmdldFR5cGVUeXBlQXJndW1lbnROYW1lc1NpemUoKSk7Ci0JCQotCQkvLyBMaXN0PFQ+IGdlbmVyaWNMaXN0Ci0JCWF0dCA9IGdldEZpZWxkKHRlc3RDbGFzcywgNSk7Ci0JCWFzc2VydEVxdWFscygiZ2VuZXJpY0xpc3QiLCBhdHQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTGlzdCIsIGF0dC5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHQudHlwZUlzQXJyYXkoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhdHQuZ2V0VHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHQuZ2V0VHlwZUFycmF5RGltZW5zaW9uYWxpdHkoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHQuZ2V0VHlwZVR5cGVBcmd1bWVudE5hbWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTnVtYmVyIiwgYXR0LmdldFR5cGVUeXBlQXJndW1lbnROYW1lKDApKTsKLQkJCi0JCS8vIFRbXSBnZW5lcmljQXJyYXkKLQkJYXR0ID0gZ2V0RmllbGQodGVzdENsYXNzLCA2KTsKLQkJYXNzZXJ0RXF1YWxzKCJnZW5lcmljQXJyYXkiLCBhdHQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTnVtYmVyW10iLCBhdHQuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhdHQudHlwZUlzQXJyYXkoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk51bWJlciIsIGF0dC5nZXRUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dC5nZXRUeXBlQXJyYXlEaW1lbnNpb25hbGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGF0dC5nZXRUeXBlVHlwZUFyZ3VtZW50TmFtZXNTaXplKCkpOwotCQkKLQkJLy8gTGlzdDw/PiB3aWxkY2FyZExpc3QKLQkJYXR0ID0gZ2V0RmllbGQodGVzdENsYXNzLCA3KTsKLQkJYXNzZXJ0RXF1YWxzKCJ3aWxkY2FyZExpc3QiLCBhdHQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTGlzdCIsIGF0dC5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHQudHlwZUlzQXJyYXkoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhdHQuZ2V0VHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHQuZ2V0VHlwZUFycmF5RGltZW5zaW9uYWxpdHkoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHQuZ2V0VHlwZVR5cGVBcmd1bWVudE5hbWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgYXR0LmdldFR5cGVUeXBlQXJndW1lbnROYW1lKDApKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQVNUVG9vbHNUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0FTVFRvb2xzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThkMjYxMi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQVNUVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVEZpZWxkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQVNUVG9vbHNUZXN0cwotCQlleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEFTVFRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVDbGFzc0FuZE1lbWJlcnMoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGNsYXNzQm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KCJjbGF6eiIsIGNsYXNzTmFtZSArICIuamF2YSIsICJwdWJsaWMgY2xhc3MgIiArIGNsYXNzTmFtZSArICIgeyAiICsgY2xhc3NCb2R5ICsgIiB9Iik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnVtQW5kTWVtYmVycyhTdHJpbmcgZW51bU5hbWUsIFN0cmluZyBlbnVtQm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KCJlbnVtcyIsIGVudW1OYW1lICsgIi5qYXZhIiwgInB1YmxpYyBlbnVtICIgKyBlbnVtTmFtZSArICIgeyAiICsgZW51bUJvZHkgKyAiIH0iKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGFubm90YXRpb25Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImFubm90IiwgYW5ub3RhdGlvbk5hbWUgKyAiLmphdmEiLCAicHVibGljIEBpbnRlcmZhY2UgIiArIGFubm90YXRpb25OYW1lICsgIiB7ICIgKyBhbm5vdGF0aW9uQm9keSArICIgfSIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGUoZmluYWwgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzLCBmaW5hbCBTdHJpbmcgaWRGaWVsZEFubm90YXRpb24pCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RUeXBlKAotCQkJCW5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJCQlyZXR1cm4gaW1wb3J0czsKLQkJCQkJfQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCQlzYi5hcHBlbmQoaWRGaWVsZEFubm90YXRpb24pOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlc29sdmVFbnVtMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJUZXN0RW51bSIsICJGT08sIEJBUiwgQkFaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRlc3RBbm5vdGF0aW9uIiwgIlRlc3RFbnVtIGZvbygpOyIpOwotCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuVGVzdEFubm90YXRpb24oZm9vPWVudW1zLlRlc3RFbnVtLkJBWikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuVGVzdEFubm90YXRpb24iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiZm9vIik7Ci0JCUpEVEZpZWxkQXR0cmlidXRlIGZpZWxkID0gdGhpcy5pZEZpZWxkKGN1KTsKLQotCQlTdHJpbmcgYWN0dWFsID0gQVNUVG9vbHMucmVzb2x2ZUVudW0oKE5hbWUpIGRhZWEuZ2V0RXhwcmVzc2lvbihmaWVsZC5nZXRNb2RpZmllZERlY2xhcmF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbnVtcy5UZXN0RW51bS5CQVoiLCBhY3R1YWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlRW51bTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiVGVzdEVudW0iLCAiRk9PLCBCQVIsIEJBWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJUZXN0QW5ub3RhdGlvbiIsICJUZXN0RW51bSBmb28oKTsiKTsKLQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgic3RhdGljIGVudW1zLlRlc3RFbnVtLkJBWiIsICJAYW5ub3QuVGVzdEFubm90YXRpb24oZm9vPUJBWikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuVGVzdEFubm90YXRpb24iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiZm9vIik7Ci0JCUpEVEZpZWxkQXR0cmlidXRlIGZpZWxkID0gdGhpcy5pZEZpZWxkKGN1KTsKLQotCQlTdHJpbmcgYWN0dWFsID0gQVNUVG9vbHMucmVzb2x2ZUVudW0oKE5hbWUpIGRhZWEuZ2V0RXhwcmVzc2lvbihmaWVsZC5nZXRNb2RpZmllZERlY2xhcmF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbnVtcy5UZXN0RW51bS5CQVoiLCBhY3R1YWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlRW51bTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiVGVzdEVudW0iLCAiRk9PLCBCQVIsIEJBWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJUZXN0QW5ub3RhdGlvbiIsICJUZXN0RW51bSBmb28oKTsiKTsKLQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgic3RhdGljIGVudW1zLlRlc3RFbnVtLioiLCAiQGFubm90LlRlc3RBbm5vdGF0aW9uKGZvbz1CQVopIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LlRlc3RBbm5vdGF0aW9uIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImZvbyIpOwotCQlKRFRGaWVsZEF0dHJpYnV0ZSBmaWVsZCA9IHRoaXMuaWRGaWVsZChjdSk7Ci0KLQkJU3RyaW5nIGFjdHVhbCA9IEFTVFRvb2xzLnJlc29sdmVFbnVtKChOYW1lKWRhZWEuZ2V0RXhwcmVzc2lvbihmaWVsZC5nZXRNb2RpZmllZERlY2xhcmF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbnVtcy5UZXN0RW51bS5CQVoiLCBhY3R1YWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlRW51bTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiVGVzdEVudW0iLCAiRk9PLCBCQVIsIEJBWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJUZXN0QW5ub3RhdGlvbiIsICJUZXN0RW51bSBmb28oKTsiKTsKLQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiZW51bXMuVGVzdEVudW0iLCAiQGFubm90LlRlc3RBbm5vdGF0aW9uKGZvbz1UZXN0RW51bS5CQVopIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LlRlc3RBbm5vdGF0aW9uIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImZvbyIpOwotCQlKRFRGaWVsZEF0dHJpYnV0ZSBmaWVsZCA9IHRoaXMuaWRGaWVsZChjdSk7Ci0KLQkJU3RyaW5nIGFjdHVhbCA9IEFTVFRvb2xzLnJlc29sdmVFbnVtKChOYW1lKSBkYWVhLmdldEV4cHJlc3Npb24oZmllbGQuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKSk7Ci0JCWFzc2VydEVxdWFscygiZW51bXMuVGVzdEVudW0uQkFaIiwgYWN0dWFsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlc29sdmVGdWxseVF1YWxpZmllZE5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFN0cmluZyBvdGhlckNsYXNzTmFtZSA9ICJPdGhlckNsYXNzIjsKLQkJZmluYWwgU3RyaW5nIG90aGVyQ2xhc3NOYW1lMiA9ICJPdGhlckNsYXNzMiI7Ci0JCWZpbmFsIFN0cmluZyBmcU90aGVyQ2xhc3NOYW1lID0gImNsYXp6Lk90aGVyQ2xhc3MiOwotCQlmaW5hbCBTdHJpbmcgZnFPdGhlckNsYXNzTmFtZTIgPSAiY2xhenouT3RoZXJDbGFzczIiOwotCQlmaW5hbCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSAiVGVzdEFubm90YXRpb24iOwotCQlmaW5hbCBTdHJpbmcgZnFBbm5vdGF0aW9uTmFtZSA9ICJhbm5vdC5UZXN0QW5ub3RhdGlvbiI7Ci0JCQotCQljcmVhdGVDbGFzc0FuZE1lbWJlcnMob3RoZXJDbGFzc05hbWUsICIiKTsKLQkJY3JlYXRlQ2xhc3NBbmRNZW1iZXJzKG90aGVyQ2xhc3NOYW1lMiwgIiIpOwotCQljcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycyhhbm5vdGF0aW9uTmFtZSwgIkNsYXNzW10gZm9vKCk7Iik7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGUoCi0JCQkJbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihuZXcgU3RyaW5nW10ge2ZxT3RoZXJDbGFzc05hbWUsIGZxT3RoZXJDbGFzc05hbWUyLCBmcUFubm90YXRpb25OYW1lfSksCi0JCQkJIkBUZXN0QW5ub3RhdGlvbihmb289eyIgKyBvdGhlckNsYXNzTmFtZSArICIuY2xhc3MsICIgKyBvdGhlckNsYXNzTmFtZTIgKyAiLmNsYXNzfSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihmcUFubm90YXRpb25OYW1lKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSAKLQkJCQluZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPigKLQkJCQkJCWRhYSwgImZvbyIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yVHlwZXMoKSk7Ci0JCUpEVEZpZWxkQXR0cmlidXRlIGZpZWxkID0gaWRGaWVsZChjdSk7Ci0JCQotCQlJdGVyYWJsZTxTdHJpbmc+IGFjdHVhbCA9IEFTVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWVzKGRhZWEuZ2V0RXhwcmVzc2lvbihmaWVsZC5nZXRNb2RpZmllZERlY2xhcmF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpKTsKLQkJCi0JCWFzc2VydEVxdWFscygKLQkJCQlDb2xsZWN0aW9uVG9vbHMubGlzdChuZXcgU3RyaW5nW10ge2ZxT3RoZXJDbGFzc05hbWUsIGZxT3RoZXJDbGFzc05hbWUyfSksCi0JCQkJQ29sbGVjdGlvblRvb2xzLmxpc3QoYWN0dWFsKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nIG90aGVyQ2xhc3NOYW1lID0gIk90aGVyQ2xhc3MiOwotCQlmaW5hbCBTdHJpbmcgb3RoZXJDbGFzc05hbWUyID0gIk90aGVyQ2xhc3MyIjsKLQkJZmluYWwgU3RyaW5nIGZxT3RoZXJDbGFzc05hbWUgPSAiY2xhenouT3RoZXJDbGFzcyI7Ci0JCWZpbmFsIFN0cmluZyBmcU90aGVyQ2xhc3NOYW1lMiA9ICJjbGF6ei5PdGhlckNsYXNzMiI7Ci0JCWZpbmFsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSA9ICJUZXN0QW5ub3RhdGlvbiI7Ci0JCWZpbmFsIFN0cmluZyBmcUFubm90YXRpb25OYW1lID0gImFubm90LlRlc3RBbm5vdGF0aW9uIjsKLQkJCi0JCWNyZWF0ZUNsYXNzQW5kTWVtYmVycyhvdGhlckNsYXNzTmFtZSwgIiIpOwotCQljcmVhdGVDbGFzc0FuZE1lbWJlcnMob3RoZXJDbGFzc05hbWUyLCAiIik7Ci0JCWNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKGFubm90YXRpb25OYW1lLCAiQ2xhc3NbXSBmb28oKTsiKTsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZSgKLQkJCQluZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KG5ldyBTdHJpbmdbXSB7ZnFPdGhlckNsYXNzTmFtZSwgZnFPdGhlckNsYXNzTmFtZTIsIGZxQW5ub3RhdGlvbk5hbWV9KSwKLQkJCQkiQFRlc3RBbm5vdGF0aW9uKGZvbz17MSwgIiArIG90aGVyQ2xhc3NOYW1lICsgIi5jbGFzc30pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZnFBbm5vdGF0aW9uTmFtZSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gCi0JCQkJbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oCi0JCQkJCQlkYWEsICJmb28iLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclR5cGVzKCkpOwotCQlKRFRGaWVsZEF0dHJpYnV0ZSBmaWVsZCA9IGlkRmllbGQoY3UpOwotCQkKLQkJSXRlcmFibGU8U3RyaW5nPiBhY3R1YWwgPSBBU1RUb29scy5yZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lcyhkYWVhLmdldEV4cHJlc3Npb24oZmllbGQuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoCi0JCQkJQ29sbGVjdGlvblRvb2xzLmxpc3QobmV3IFN0cmluZ1tdIHtudWxsLCBmcU90aGVyQ2xhc3NOYW1lfSksCi0JCQkJQ29sbGVjdGlvblRvb2xzLmxpc3QoYWN0dWFsKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nIG90aGVyQ2xhc3NOYW1lID0gIk90aGVyQ2xhc3MiOwotCQlmaW5hbCBTdHJpbmcgb3RoZXJDbGFzc05hbWUyID0gIk90aGVyQ2xhc3MyIjsKLQkJZmluYWwgU3RyaW5nIGZxT3RoZXJDbGFzc05hbWUgPSAiY2xhenouT3RoZXJDbGFzcyI7Ci0JCWZpbmFsIFN0cmluZyBmcU90aGVyQ2xhc3NOYW1lMiA9ICJjbGF6ei5PdGhlckNsYXNzMiI7Ci0JCWZpbmFsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSA9ICJUZXN0QW5ub3RhdGlvbiI7Ci0JCWZpbmFsIFN0cmluZyBmcUFubm90YXRpb25OYW1lID0gImFubm90LlRlc3RBbm5vdGF0aW9uIjsKLQkJCi0JCWNyZWF0ZUNsYXNzQW5kTWVtYmVycyhvdGhlckNsYXNzTmFtZSwgIiIpOwotCQljcmVhdGVDbGFzc0FuZE1lbWJlcnMob3RoZXJDbGFzc05hbWUyLCAiIik7Ci0JCWNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKGFubm90YXRpb25OYW1lLCAiQ2xhc3NbXSBmb28oKTsiKTsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZSgKLQkJCQluZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KG5ldyBTdHJpbmdbXSB7ZnFPdGhlckNsYXNzTmFtZSwgZnFPdGhlckNsYXNzTmFtZTIsIGZxQW5ub3RhdGlvbk5hbWV9KSwKLQkJCQkiQFRlc3RBbm5vdGF0aW9uKGZvbz17QFRlc3RBbm5vdGF0aW9uKCksICIgKyBvdGhlckNsYXNzTmFtZSArICIuY2xhc3N9Iik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZnFBbm5vdGF0aW9uTmFtZSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gCi0JCQkJbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oCi0JCQkJCQlkYWEsICJmb28iLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclR5cGVzKCkpOwotCQlKRFRGaWVsZEF0dHJpYnV0ZSBmaWVsZCA9IGlkRmllbGQoY3UpOwotCQkKLQkJSXRlcmFibGU8U3RyaW5nPiBhY3R1YWwgPSBBU1RUb29scy5yZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lcyhkYWVhLmdldEV4cHJlc3Npb24oZmllbGQuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoCi0JCQkJQ29sbGVjdGlvblRvb2xzLmxpc3QobmV3IFN0cmluZ1tdIHtudWxsLCBmcU90aGVyQ2xhc3NOYW1lfSksCi0JCQkJQ29sbGVjdGlvblRvb2xzLmxpc3QoYWN0dWFsKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0Fubm90YXRpb25UZXN0Q2FzZS5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0Fubm90YXRpb25UZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWNhNWUyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9Bbm5vdGF0aW9uVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvZHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9vbGVhbkxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bUNvbnN0YW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVudW1EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUV4dGVuZGVkTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTnVtYmVyTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUGFja2FnZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVEZpZWxkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5KRFRNZXRob2RBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotLyoqCi0gKiBQcm92aWRlIGFuIGVhc3koPykgd2F5IHRvIGJ1aWxkIGFuIGFubm90YXRlZCBzb3VyY2UgZmlsZS4KLSAqIFRoZSB0eXBlIG11c3QgYmUgY3JlYXRlZCBieSBjYWxsaW5nIG9uZSBvZiB0aGUge0BsaW5rICNjcmVhdGVUZXN0VHlwZSgpfQotICogbWV0aG9kcyBiZWZvcmUgY2FsbGluZyBhbnkgb2YgdGhlIHZhcmlvdXMgaGVscGVyIG1ldGhvZHMgKGkuZS4gdGhlIHR5cGUgaXMKLSAqIDxlbT5ub3Q8L2VtPiBjcmVhdGVkIGR1cmluZyB7QGxpbmsgI3NldFVwKCl9KS4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5ub3RhdGlvblRlc3RDYXNlCi0JZXh0ZW5kcyBUZXN0Q2FzZQotewotCXByb3RlY3RlZCBUZXN0SmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVAgPSBGaWxlLnNlcGFyYXRvcjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiQW5ub3RhdGlvblRlc3RQcm9qZWN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAidGVzdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FXyA9IFBBQ0tBR0VfTkFNRSArICcuJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX0lORk9fRklMRV9OQU1FID0gInBhY2thZ2UtaW5mby5qYXZhIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQYXRoIFBBQ0tBR0VfSU5GT19GSUxFX1BBVEggPSBuZXcgUGF0aCgic3JjIiArIFNFUCArIFBBQ0tBR0VfTkFNRSArIFNFUCArIFBBQ0tBR0VfSU5GT19GSUxFX05BTUUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTkFNRSA9ICJBbm5vdGF0aW9uVGVzdFR5cGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUVfICsgVFlQRV9OQU1FOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfTkFNRSA9IFRZUEVfTkFNRSArICIuamF2YSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBGSUxFX1BBVEggPSBuZXcgUGF0aCgic3JjIiArIFNFUCArIFBBQ0tBR0VfTkFNRSArIFNFUCArIEZJTEVfTkFNRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX1NUUklOR19BUlJBWSA9IG5ldyBTdHJpbmdbMF07Ci0KLQotCS8vICoqKioqKioqKiogVGVzdENhc2UgYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFubm90YXRpb25UZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmphdmFQcm9qZWN0ID0gdGhpcy5idWlsZEphdmFQcm9qZWN0KGZhbHNlKTsgIC8vIGZhbHNlID0gbm8gYXV0by1idWlsZAotCX0KLQkKLQlwcm90ZWN0ZWQgVGVzdEphdmFQcm9qZWN0IGJ1aWxkSmF2YVByb2plY3QoYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5idWlsZEphdmFQcm9qZWN0KFBST0pFQ1RfTkFNRSwgYXV0b0J1aWxkKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRlc3RKYXZhUHJvamVjdCBidWlsZEphdmFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFRlc3RKYXZhUHJvamVjdChwcm9qZWN0TmFtZSwgYXV0b0J1aWxkKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotLy8JCXRoaXMuZHVtcFNvdXJjZSgpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoKTsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVQcm9qZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWludCBpID0gMTsKLQkJYm9vbGVhbiBkZWxldGVkID0gZmFsc2U7Ci0JCXdoaWxlICggISBkZWxldGVkKSB7Ci0JCQl0cnkgewotCQkJCXRoaXMuamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQlkZWxldGVkID0gdHJ1ZTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQlpZiAoaSA9PSA0KSB7Ci0JCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHRoaXMuZ2V0TmFtZSgpICsgIiAtIHVuYWJsZSB0byBkZWxldGUgcHJvamVjdCIsIGV4KTsKLQkJCQl9Ci0JCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJCWkrKzsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBTb3VyY2UoSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiKioqICIgKyB0aGlzLmdldE5hbWUoKSArICIgKioqKiIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXRTb3VyY2UoY3UpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogcGFja2FnZSBjcmVhdGlvbiAqKioqKioqKioKLQkKLQkvKiogCi0JICogY3JlYXRlIGFuIHVuLWFubm90YXRlZCBwYWNrYWdlLWluZm8KLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UGFja2FnZUluZm8oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RQYWNrYWdlSW5mbyhuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSk7Ci0JfQotCQotCS8qKiAKLQkgKiBjcmVhdGUgYW4gdW4tYW5ub3RhdGVkIHBhY2thZ2UtaW5mbyBpbiBhIHBhY2thZ2UgdGhlIGdpdmVuIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UGFja2FnZUluZm8oU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RQYWNrYWdlSW5mbyhwYWNrYWdlTmFtZSwgbmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkpOwotCX0KLQkKLQkvKioKLQkgKiBzaG9ydGN1dCBmb3Igc2ltcGx5IGFkZGluZyBhbiBhbm5vdGF0aW9uIHRvIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFBhY2thZ2VJbmZvKAotCQkJZmluYWwgU3RyaW5nIHBhY2thZ2VBbm5vdGF0aW9uLCBmaW5hbCBTdHJpbmcgLi4uIGltcG9ydHMpIAotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJcmV0dXJuIGNyZWF0ZVRlc3RQYWNrYWdlSW5mbygKLQkJCQluZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oaW1wb3J0cyk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwdWJsaWMgdm9pZCBhcHBlbmRQYWNrYWdlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJCXNiLmFwcGVuZChwYWNrYWdlQW5ub3RhdGlvbik7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFBhY2thZ2VJbmZvKEFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0UGFja2FnZUluZm8oUEFDS0FHRV9OQU1FLCBhbm5vdGF0aW9uV3JpdGVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFBhY2thZ2VJbmZvKFN0cmluZyBwYWNrYWdlTmFtZSwgQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgKLQkJCXBhY2thZ2VOYW1lLCBQQUNLQUdFX0lORk9fRklMRV9OQU1FLCB0aGlzLmNyZWF0ZVNvdXJjZVdyaXRlcihhbm5vdGF0aW9uV3JpdGVyLCBwYWNrYWdlTmFtZSwgbnVsbCkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHR5cGUgY3JlYXRpb24gKioqKioqKioqKgotCQotCS8qKgotCSAqIGNyZWF0ZSBhbiB1bi1hbm5vdGF0ZWQgdHlwZQotCSAqLwotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSk7Ci0JfQotCQotCS8qKgotCSAqIHNob3J0Y3V0IGZvciBzaW1wbHkgYWRkaW5nIGFuIGFubm90YXRpb24gdG8gdGhlICdpZCcgZmllbGQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZShmaW5hbCBTdHJpbmcgYW5ub3RhdGlvbkltcG9ydCwgZmluYWwgU3RyaW5nIGlkRmllbGRBbm5vdGF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gKGFubm90YXRpb25JbXBvcnQgPT0gbnVsbCkgPwotCQkJCQlFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+aW5zdGFuY2UoKSA6Ci0JCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8U3RyaW5nPihhbm5vdGF0aW9uSW1wb3J0KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKGlkRmllbGRBbm5vdGF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIHNob3J0Y3V0IGZvciBzaW1wbHkgYWRkaW5nIGEgZnVsbHktcXVhbGlmaWVkIGFubm90YXRpb24gdG8gdGhlICdpZCcgZmllbGQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZShmaW5hbCBTdHJpbmcgaWRGaWVsZEFubm90YXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobnVsbCwgaWRGaWVsZEFubm90YXRpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZShBbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgRklMRV9OQU1FLCB0aGlzLmNyZWF0ZVNvdXJjZVdyaXRlcihhbm5vdGF0aW9uV3JpdGVyKSk7Ci0JfQotCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlKFN0cmluZyB0eXBlTmFtZSwgQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIHR5cGVOYW1lICsgIi5qYXZhIiwgY3JlYXRlU291cmNlV3JpdGVyKGFubm90YXRpb25Xcml0ZXIsIHR5cGVOYW1lKSk7Ci0JfQotCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgdHlwZU5hbWUsIEFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQocGFja2FnZU5hbWUsIGZpbGVOYW1lLCB0aGlzLmNyZWF0ZVNvdXJjZVdyaXRlcihhbm5vdGF0aW9uV3JpdGVyLCB0eXBlTmFtZSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU291cmNlV3JpdGVyIGNyZWF0ZVNvdXJjZVdyaXRlcihBbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRTb3VyY2VXcml0ZXIoYW5ub3RhdGlvbldyaXRlcik7Ci0JfQotCQotCXByb3RlY3RlZCBTb3VyY2VXcml0ZXIgY3JlYXRlU291cmNlV3JpdGVyKEFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlciwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkU291cmNlV3JpdGVyKGFubm90YXRpb25Xcml0ZXIsIHR5cGVOYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFNvdXJjZVdyaXRlciBjcmVhdGVTb3VyY2VXcml0ZXIoQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyLCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyB0eXBlTmFtZSkgewotCQlyZXR1cm4gbmV3IEFubm90YXRlZFNvdXJjZVdyaXRlcihhbm5vdGF0aW9uV3JpdGVyLCBwYWNrYWdlTmFtZSwgdHlwZU5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW51bShFbnVtQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIEZJTEVfTkFNRSwgdGhpcy5jcmVhdGVFbnVtU291cmNlV3JpdGVyKGFubm90YXRpb25Xcml0ZXIpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudW0oU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBlbnVtTmFtZSwgRW51bUFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQocGFja2FnZU5hbWUsIGZpbGVOYW1lLCB0aGlzLmNyZWF0ZUVudW1Tb3VyY2VXcml0ZXIoYW5ub3RhdGlvbldyaXRlciwgZW51bU5hbWUpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFNvdXJjZVdyaXRlciBjcmVhdGVFbnVtU291cmNlV3JpdGVyKEVudW1Bbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIpIHsKLQkJcmV0dXJuIG5ldyBFbnVtQW5ub3RhdGVkU291cmNlV3JpdGVyKGFubm90YXRpb25Xcml0ZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU291cmNlV3JpdGVyIGNyZWF0ZUVudW1Tb3VyY2VXcml0ZXIoRW51bUFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlciwgU3RyaW5nIGVudW1OYW1lKSB7Ci0JCXJldHVybiBuZXcgRW51bUFubm90YXRlZFNvdXJjZVdyaXRlcihhbm5vdGF0aW9uV3JpdGVyLCBlbnVtTmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBTb3VyY2VXcml0ZXIgY3JlYXRlRW51bVNvdXJjZVdyaXRlcihFbnVtQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyLCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBlbnVtTmFtZSkgewotCQlyZXR1cm4gbmV3IEVudW1Bbm5vdGF0ZWRTb3VyY2VXcml0ZXIoYW5ub3RhdGlvbldyaXRlciwgcGFja2FnZU5hbWUsIGVudW1OYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlQW5ub3RhdGVkRW51bUFuZE1lbWJlcnMoU3RyaW5nIGVudW1OYW1lLCBTdHJpbmcgZW51bUJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJc2IuYXBwZW5kKCJwYWNrYWdlICIpLmFwcGVuZChQQUNLQUdFX05BTUUpLmFwcGVuZCgiOyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRW51bTsiKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCJAWG1sRW51bSIpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoInB1YmxpYyBlbnVtICIpLmFwcGVuZChlbnVtTmFtZSkuYXBwZW5kKCIgeyAiKS5hcHBlbmQoZW51bUJvZHkpLmFwcGVuZCgiIH0iKTsKLQkJCi0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIGVudW1OYW1lICsgIi5qYXZhIiwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCQotCS8qKgotCSAqIHdyaXRlcyBzb3VyY2UgZm9yIHBhY2thZ2UtaW5mbyBqYXZhIGZpbGVzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXBwZW5kU291cmNlVG8oCi0JCQlTdHJpbmdCdWlsZGVyIHNiLCBBbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIsIFN0cmluZyBwYWNrYWdlTmFtZSkgewotCQkKLQkJYW5ub3RhdGlvbldyaXRlci5hcHBlbmRQYWNrYWdlQW5ub3RhdGlvblRvKHNiKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCJwYWNrYWdlICIpLmFwcGVuZChwYWNrYWdlTmFtZSkuYXBwZW5kKCI7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGFubm90YXRpb25Xcml0ZXIuaW1wb3J0cygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChzdHJlYW0ubmV4dCgpKS5hcHBlbmQoIjsiKS5hcHBlbmQoQ1IpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIHdyaXRlcyBzb3VyY2UgZm9yIHR5cGljYWwgamF2YSBmaWxlcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFwcGVuZFNvdXJjZVRvKAotCQkJU3RyaW5nQnVpbGRlciBzYiwgQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyLCAKLQkJCVN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCQotCQlzYi5hcHBlbmQoInBhY2thZ2UgIikuYXBwZW5kKHBhY2thZ2VOYW1lKS5hcHBlbmQoIjsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gYW5ub3RhdGlvbldyaXRlci5pbXBvcnRzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQlzYi5hcHBlbmQoc3RyZWFtLm5leHQoKSk7Ci0JCQlzYi5hcHBlbmQoIjsiKTsKLQkJCXNiLmFwcGVuZChDUik7Ci0JCX0KLQkJc2IuYXBwZW5kKENSKTsKLQkJYW5ub3RhdGlvbldyaXRlci5hcHBlbmRUeXBlQW5ub3RhdGlvblRvKHNiKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKHR5cGVOYW1lKS5hcHBlbmQoIiAiKTsKLQkJYW5ub3RhdGlvbldyaXRlci5hcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKHNiKTsKLQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCWFubm90YXRpb25Xcml0ZXIuYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhzYik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgICIpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZE5hbWVGaWVsZEFubm90YXRpb25UbyhzYik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCWFubm90YXRpb25Xcml0ZXIuYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oc2IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgaW50IGdldElkKCkgeyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgICAgICByZXR1cm4gdGhpcy5pZDsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCWFubm90YXRpb25Xcml0ZXIuYXBwZW5kU2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oc2IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgdm9pZCBzZXRJZChpbnQgaWQpIHsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICAgICAgdGhpcy5pZCA9IGlkOyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJYW5ub3RhdGlvbldyaXRlci5hcHBlbmRHZXROYW1lTWV0aG9kQW5ub3RhdGlvblRvKHNiKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgICAgICByZXR1cm4gdGhpcy5uYW1lOyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJYW5ub3RhdGlvbldyaXRlci5hcHBlbmRTZXROYW1lTWV0aG9kQW5ub3RhdGlvblRvKHNiKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgcHVibGljIHZvaWQgc2V0VGVzdEZpZWxkKFN0cmluZyB0ZXN0RmllbGQpIHsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICAgICAgdGhpcy50ZXN0RmllbGQgPSB0ZXN0RmllbGQ7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCWFubm90YXRpb25Xcml0ZXIuYXBwZW5kTWVtYmVyVHlwZVRvKHNiKTsKLQkJc2IuYXBwZW5kKENSKTsJCQotCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZFRvcExldmVsVHlwZXNUbyhzYik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JfQotCi0JCi0JLyoqCi0JICogd3JpdGVzIHNvdXJjZSBmb3IgdHlwaWNhbCBqYXZhIGVudW0gZmlsZXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmRFbnVtU291cmNlVG8oCi0JCQlTdHJpbmdCdWlsZGVyIHNiLCBFbnVtQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyLCAKLQkJCVN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGVudW1OYW1lKSB7Ci0JCQotCQlzYi5hcHBlbmQoInBhY2thZ2UgIikuYXBwZW5kKHBhY2thZ2VOYW1lKS5hcHBlbmQoIjsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gYW5ub3RhdGlvbldyaXRlci5pbXBvcnRzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQlzYi5hcHBlbmQoc3RyZWFtLm5leHQoKSk7Ci0JCQlzYi5hcHBlbmQoIjsiKTsKLQkJCXNiLmFwcGVuZChDUik7Ci0JCX0KLQkJc2IuYXBwZW5kKENSKTsKLQkJYW5ub3RhdGlvbldyaXRlci5hcHBlbmRFbnVtQW5ub3RhdGlvblRvKHNiKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCJwdWJsaWMgZW51bSAiKS5hcHBlbmQoZW51bU5hbWUpLmFwcGVuZCgiIHsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJYW5ub3RhdGlvbldyaXRlci5hcHBlbmRTdW5kYXlFbnVtQ29uc3RhbnRBbm5vdGF0aW9uVG8oc2IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBTVU5EQVksICIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgICIpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZE1vbmRheUVudW1Db25zdGFudEFubm90YXRpb25UbyhzYik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIE1PTkRBWSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFRlc3RKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3Q7Ci0JfQotCi0JcHJvdGVjdGVkIEpEVFR5cGUgdGVzdFR5cGUoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gdGhpcy5idWlsZFR5cGUoVFlQRV9OQU1FLCBjdSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpEVFR5cGUgYnVpbGRUeXBlKFN0cmluZyBuYW1lLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHlwZShuYW1lLCAxLCBjdSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpEVFR5cGUgYnVpbGRUeXBlKFN0cmluZyBuYW1lLCBpbnQgb2NjdXJyZW5jZSwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gdGhpcy5idWlsZFR5cGUobnVsbCwgbmFtZSwgb2NjdXJyZW5jZSwgY3UpOwotCX0KLQotCXByb3RlY3RlZCBKRFRUeXBlIGJ1aWxkVHlwZShUeXBlIGRlY2xhcmluZ1R5cGUsIFN0cmluZyBuYW1lLCBpbnQgb2NjdXJyZW5jZSwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gbmV3IEpEVFR5cGUoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY3UpOwotCX0KLQotCXByb3RlY3RlZCBKRFRGaWVsZEF0dHJpYnV0ZSBpZEZpZWxkKElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRGaWVsZCgiaWQiLCBjdSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpEVEZpZWxkQXR0cmlidXRlIG5hbWVGaWVsZChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmllbGQoIm5hbWUiLCBjdSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpEVEZpZWxkQXR0cmlidXRlIGJ1aWxkRmllbGQoU3RyaW5nIG5hbWUsIElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRGaWVsZChuYW1lLCAxLCBjdSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpEVEZpZWxkQXR0cmlidXRlIGJ1aWxkRmllbGQoU3RyaW5nIG5hbWUsIGludCBvY2N1cnJlbmNlLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmllbGQodGhpcy50ZXN0VHlwZShjdSksIG5hbWUsIG9jY3VycmVuY2UsIGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkRURmllbGRBdHRyaWJ1dGUgYnVpbGRGaWVsZChUeXBlIGRlY2xhcmluZ1R5cGUsIFN0cmluZyBuYW1lLCBpbnQgb2NjdXJyZW5jZSwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gbmV3IEpEVEZpZWxkQXR0cmlidXRlKGRlY2xhcmluZ1R5cGUsIG5hbWUsIG9jY3VycmVuY2UsIGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkRUTWV0aG9kQXR0cmlidXRlIGlkR2V0TWV0aG9kKElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRNZXRob2QoImdldElkIiwgY3UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSkRUTWV0aG9kQXR0cmlidXRlIGlkU2V0TWV0aG9kKElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRNZXRob2QoInNldElkIiwgbmV3IFN0cmluZ1tdIHsiaW50In0sIGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkRUTWV0aG9kQXR0cmlidXRlIG5hbWVHZXRNZXRob2QoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gdGhpcy5idWlsZE1ldGhvZCgiZ2V0TmFtZSIsIGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkRUTWV0aG9kQXR0cmlidXRlIGJ1aWxkTWV0aG9kKFN0cmluZyBuYW1lLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTWV0aG9kKG5hbWUsIEVNUFRZX1NUUklOR19BUlJBWSwgY3UpOwotCX0KLQotCXByb3RlY3RlZCBKRFRNZXRob2RBdHRyaWJ1dGUgYnVpbGRNZXRob2QoU3RyaW5nIG5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVOYW1lcywgSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gdGhpcy5idWlsZE1ldGhvZChuYW1lLCBwYXJhbWV0ZXJUeXBlTmFtZXMsIDEsIGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkRUTWV0aG9kQXR0cmlidXRlIGJ1aWxkTWV0aG9kKFN0cmluZyBuYW1lLCBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlTmFtZXMsIGludCBvY2N1cnJlbmNlLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiBuZXcgSkRUTWV0aG9kQXR0cmlidXRlKHRoaXMudGVzdFR5cGUoY3UpLCBuYW1lLCBwYXJhbWV0ZXJUeXBlTmFtZXMsIG9jY3VycmVuY2UsIGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkRUTWV0aG9kQXR0cmlidXRlIGJ1aWxkTWV0aG9kKFR5cGUgZGVjbGFyaW5nVHlwZSwgU3RyaW5nIG5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVOYW1lcywgaW50IG9jY3VycmVuY2UsIElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIG5ldyBKRFRNZXRob2RBdHRyaWJ1dGUoZGVjbGFyaW5nVHlwZSwgbmFtZSwgcGFyYW1ldGVyVHlwZU5hbWVzLCBvY2N1cnJlbmNlLCBjdSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTb3VyY2UoSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjdS5nZXRCdWZmZXIoKS5nZXRDb250ZW50cygpOwotCX0KLQotCXByb3RlY3RlZCBDb21waWxhdGlvblVuaXQgYnVpbGRBU1RSb290KElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIEFTVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRlc3QgdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRTb3VyY2VDb250YWlucyhTdHJpbmcgcywgSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzb3VyY2UgPSB0aGlzLmdldFNvdXJjZShjdSk7Ci0JCWJvb2xlYW4gZm91bmQgPSBzb3VyY2UuaW5kZXhPZihzKSA+IC0xOwotCQlpZiAoICEgZm91bmQpIHsKLQkJCVN0cmluZyBtc2cgPSAic291cmNlIGRvZXMgbm90IGNvbnRhaW4gdGhlIGV4cGVjdGVkIHN0cmluZzogIiArIHMgKyAiIChzZWUgU3lzdGVtIGNvbnNvbGUpIjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqICIgKyB0aGlzLmdldE5hbWUoKSArICIgKioqKiIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oc291cmNlKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJZmFpbChtc2cpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oU3RyaW5nIHMsIElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlTdHJpbmcgc291cmNlID0gdGhpcy5nZXRTb3VyY2UoY3UpOwotCQlpbnQgcG9zID0gc291cmNlLmluZGV4T2Yocyk7Ci0JCWlmIChwb3MgIT0gLTEpIHsKLQkJCVN0cmluZyBtc2cgPSAidW5leHBlY3RlZCBzdHJpbmcgaW4gc291cmNlIChwb3NpdGlvbjogIiArIHBvcyArICIpOiAiICsgcyArICIgKHNlZSBTeXN0ZW0gY29uc29sZSkiOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiogIiArIHRoaXMuZ2V0TmFtZSgpICsgIiAqKioqIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzb3VyY2UpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlmYWlsKG1zZyk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFuaXB1bGF0ZSBhbm5vdGF0aW9ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICpmaXJzdCogbWVtYmVyIHZhbHVlIHBhaXIgZm9yIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiBlbGVtZW50Ci0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGFubm90YXRpb24gaGFzIG5vIHN1Y2ggZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlmb3IgKE1lbWJlclZhbHVlUGFpciBwYWlyIDogdGhpcy52YWx1ZXMoYW5ub3RhdGlvbikpIHsKLQkJCWlmIChwYWlyLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoZWxlbWVudE5hbWUpKSB7Ci0JCQkJcmV0dXJuIHBhaXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogbWluaW1pemUgdGhlIHNjb3BlIG9mIHRoZSBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiB2YWx1ZXMoTm9ybWFsQW5ub3RhdGlvbiBuYSkgewotCQlyZXR1cm4gbmEudmFsdWVzKCk7Ci0JfQotCi0JLyoqCi0JICogbWluaW1pemUgdGhlIHNjb3BlIG9mIHRoZSBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3Q8RW51bUNvbnN0YW50RGVjbGFyYXRpb24+IGVudW1Db25zdGFudHMoRW51bURlY2xhcmF0aW9uIGVkKSB7Ci0JCXJldHVybiBlZC5lbnVtQ29uc3RhbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgZm9yIG51bGwgbWVtYmVyIHZhbHVlIHBhaXIKLQkgKi8KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiB2YWx1ZV8oTWVtYmVyVmFsdWVQYWlyIHBhaXIpIHsKLQkJcmV0dXJuIChwYWlyID09IG51bGwpID8gbnVsbCA6IHBhaXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAqZmlyc3QqIGFubm90YXRpb24gZWxlbWVudAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBhbm5vdGF0aW9uIGhhcyBubyBzdWNoIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZShOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gdGhpcy52YWx1ZV8odGhpcy5tZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgZWxlbWVudE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAqZmlyc3QqIGFubm90YXRpb24gZWxlbWVudAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBhbm5vdGF0aW9uIGhhcyBubyBzdWNoIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZShTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gZWxlbWVudE5hbWUuZXF1YWxzKCJ2YWx1ZSIpID8gYW5ub3RhdGlvbi5nZXRWYWx1ZSgpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAqZmlyc3QqIGFubm90YXRpb24gZWxlbWVudAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBhbm5vdGF0aW9uIGhhcyBubyBzdWNoIGVsZW1lbnQuCi0JICogKEFuIGVsZW1lbnQgbmFtZSBvZiAidmFsdWUiIHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBvZiBhIHNpbmdsZQotCSAqIG1lbWJlciBhbm5vdGF0aW9uLikKLQkgKi8KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBhbm5vdGF0aW9uRWxlbWVudFZhbHVlKEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCWlmIChhbm5vdGF0aW9uLmlzTm9ybWFsQW5ub3RhdGlvbigpKSB7Ci0JCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uLCBlbGVtZW50TmFtZSk7Ci0JCX0KLQkJaWYgKGFubm90YXRpb24uaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpIHsKLQkJCXJldHVybiB0aGlzLmFubm90YXRpb25FbGVtZW50VmFsdWUoKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGFubm90YXRpb24sIGVsZW1lbnROYW1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFycmF5SW5pdGlhbGl6ZXIgbmV3QXJyYXlJbml0aWFsaXplcihBU1QgYXN0LCBFeHByZXNzaW9uLi4uIGV4cHJlc3Npb25zKSB7Ci0JCUFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplciA9IGFzdC5uZXdBcnJheUluaXRpYWxpemVyKCk7Ci0JCWZvciAoRXhwcmVzc2lvbiBleHByZXNzaW9uIDogZXhwcmVzc2lvbnMpIHsKLQkJCWFycmF5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMoKS5hZGQoZXhwcmVzc2lvbik7Ci0JCX0KLQkJcmV0dXJuIGFycmF5SW5pdGlhbGl6ZXI7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGEgbnVtYmVyIGxpdGVyYWwgYW5kIHNldCBpdHMgaW5pdGlhbCB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIGxpdGVyYWwuCi0JICovCi0JcHJvdGVjdGVkIE51bWJlckxpdGVyYWwgbmV3TnVtYmVyTGl0ZXJhbChBU1QgYXN0LCBpbnQgdmFsdWUpIHsKLQkJcmV0dXJuIGFzdC5uZXdOdW1iZXJMaXRlcmFsKEludGVnZXIudG9TdHJpbmcodmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIG51bWJlciBsaXRlcmFsIGFuZCBzZXQgaXRzIGluaXRpYWwgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBsaXRlcmFsLgotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuTGl0ZXJhbCBuZXdCb29sZWFuTGl0ZXJhbChBU1QgYXN0LCBib29sZWFuIHZhbHVlKSB7Ci0JCXJldHVybiBhc3QubmV3Qm9vbGVhbkxpdGVyYWwodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgc3RyaW5nIGxpdGVyYWwgYW5kIHNldCBpdHMgaW5pdGlhbCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nTGl0ZXJhbCBuZXdTdHJpbmdMaXRlcmFsKEFTVCBhc3QsIFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSBhc3QubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZSh2YWx1ZSk7Ci0JCXJldHVybiBzdHJpbmdMaXRlcmFsOwotCX0KLQotCXByb3RlY3RlZCBUeXBlTGl0ZXJhbCBuZXdUeXBlTGl0ZXJhbChBU1QgYXN0LCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJVHlwZUxpdGVyYWwgdHlwZUxpdGVyYWwgPSBhc3QubmV3VHlwZUxpdGVyYWwoKTsKLQkJdHlwZUxpdGVyYWwuc2V0VHlwZSh0aGlzLm5ld1NpbXBsZVR5cGUoYXN0LCB0eXBlTmFtZSkpOwotCQlyZXR1cm4gdHlwZUxpdGVyYWw7Ci0JfQotCi0JcHJvdGVjdGVkIFNpbXBsZVR5cGUgbmV3U2ltcGxlVHlwZShBU1QgYXN0LCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMubmV3U2ltcGxlVHlwZShhc3QsIGFzdC5uZXdOYW1lKHR5cGVOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFNpbXBsZVR5cGUgbmV3U2ltcGxlVHlwZShBU1QgYXN0LCBOYW1lIHR5cGVOYW1lKSB7Ci0JCXJldHVybiBhc3QubmV3U2ltcGxlVHlwZSh0eXBlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIE1lbWJlclZhbHVlUGFpciBuZXdNZW1iZXJWYWx1ZVBhaXIoQVNUIGFzdCwgU2ltcGxlTmFtZSBuYW1lLCBFeHByZXNzaW9uIHZhbHVlKSB7Ci0JCU1lbWJlclZhbHVlUGFpciBwYWlyID0gYXN0Lm5ld01lbWJlclZhbHVlUGFpcigpOwotCQlwYWlyLnNldE5hbWUobmFtZSk7Ci0JCXBhaXIuc2V0VmFsdWUodmFsdWUpOwotCQlyZXR1cm4gcGFpcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWVtYmVyVmFsdWVQYWlyIG5ld01lbWJlclZhbHVlUGFpcihBU1QgYXN0LCBTdHJpbmcgbmFtZSwgRXhwcmVzc2lvbiB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoYXN0LCBhc3QubmV3U2ltcGxlTmFtZShuYW1lKSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBNZW1iZXJWYWx1ZVBhaXIgbmV3TWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKGFzdCwgbmFtZSwgdGhpcy5uZXdTdHJpbmdMaXRlcmFsKGFzdCwgdmFsdWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWVtYmVyVmFsdWVQYWlyIG5ld01lbWJlclZhbHVlUGFpcihBU1QgYXN0LCBTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLm5ld01lbWJlclZhbHVlUGFpcihhc3QsIG5hbWUsIHRoaXMubmV3TnVtYmVyTGl0ZXJhbChhc3QsIHZhbHVlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIE1lbWJlclZhbHVlUGFpciBuZXdNZW1iZXJWYWx1ZVBhaXIoQVNUIGFzdCwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKGFzdCwgbmFtZSwgdGhpcy5uZXdCb29sZWFuTGl0ZXJhbChhc3QsIHZhbHVlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVudW1Db25zdGFudERlY2xhcmF0aW9uIG5ld0VudW1Db25zdGFudERlY2xhcmF0aW9uKEFTVCBhc3QsIFN0cmluZyBlbnVtQ29uc3RhbnROYW1lKSB7Ci0JCUVudW1Db25zdGFudERlY2xhcmF0aW9uIGVudW1Db25zdGFudERlY2xhcmF0aW9uID0gYXN0Lm5ld0VudW1Db25zdGFudERlY2xhcmF0aW9uKCk7Ci0JCWVudW1Db25zdGFudERlY2xhcmF0aW9uLnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUoZW51bUNvbnN0YW50TmFtZSkpOwotCQlyZXR1cm4gZW51bUNvbnN0YW50RGVjbGFyYXRpb247Ci0JfQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG1lbWJlciB2YWx1ZSBwYWlyIHRvIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gdGhlIHJlc3VsdGluZyBhbm5vdGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBOb3JtYWxBbm5vdGF0aW9uIGFkZE1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIE1lbWJlclZhbHVlUGFpciBwYWlyKSB7Ci0JCXRoaXMudmFsdWVzKGFubm90YXRpb24pLmFkZChwYWlyKTsKLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbWVtYmVyIHZhbHVlIHBhaXIgdG8gdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uLgotCSAqIFJldHVybiB0aGUgcmVzdWx0aW5nIGFubm90YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE5vcm1hbEFubm90YXRpb24gYWRkTWVtYmVyVmFsdWVQYWlyKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgdGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbi5nZXRBU1QoKSwgbmFtZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBtZW1iZXIgdmFsdWUgcGFpciB0byB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24uCi0JICogUmV0dXJuIHRoZSByZXN1bHRpbmcgYW5ub3RhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9ybWFsQW5ub3RhdGlvbiBhZGRNZW1iZXJWYWx1ZVBhaXIoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCB0aGlzLm5ld01lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLmdldEFTVCgpLCBuYW1lLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG1lbWJlciB2YWx1ZSBwYWlyIHRvIHRoZSBtYXJrZXIgYW5ub3RhdGlvbgotCSAqIGJ5IGZpcnN0IHJlcGxhY2luZyBpdCB3aXRoIGEgbm9ybWFsIGFubm90YXRpb24uCi0JICogUmV0dXJuIHRoZSByZXN1bHRpbmcgbm9ybWFsIGFubm90YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE5vcm1hbEFubm90YXRpb24gYWRkTWVtYmVyVmFsdWVQYWlyKE1hcmtlckFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb24gPSB0aGlzLnJlcGxhY2VNYXJrZXJBbm5vdGF0aW9uKGFubm90YXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihub3JtYWxBbm5vdGF0aW9uLCB0aGlzLm5ld01lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLmdldEFTVCgpLCBuYW1lLCB2YWx1ZSkpOwotCQlyZXR1cm4gbm9ybWFsQW5ub3RhdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9ybWFsQW5ub3RhdGlvbiBhZGRNZW1iZXJWYWx1ZVBhaXIoTWFya2VyQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotCQlOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb24gPSB0aGlzLnJlcGxhY2VNYXJrZXJBbm5vdGF0aW9uKGFubm90YXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihub3JtYWxBbm5vdGF0aW9uLCB0aGlzLm5ld01lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLmdldEFTVCgpLCBuYW1lLCB2YWx1ZSkpOwotCQlyZXR1cm4gbm9ybWFsQW5ub3RhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBtZW1iZXIgdmFsdWUgcGFpciB0byB0aGUgbWFya2VyIGFubm90YXRpb24KLQkgKiBieSBmaXJzdCByZXBsYWNpbmcgaXQgd2l0aCBhIG5vcm1hbCBhbm5vdGF0aW9uLgotCSAqIFJldHVybiB0aGUgcmVzdWx0aW5nIG5vcm1hbCBhbm5vdGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBOb3JtYWxBbm5vdGF0aW9uIGFkZE1lbWJlclZhbHVlUGFpcihNYXJrZXJBbm5vdGF0aW9uIGFubm90YXRpb24sIE1lbWJlclZhbHVlUGFpciBwYWlyKSB7Ci0JCU5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiA9IHRoaXMucmVwbGFjZU1hcmtlckFubm90YXRpb24oYW5ub3RhdGlvbik7Ci0JCXJldHVybiB0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihub3JtYWxBbm5vdGF0aW9uLCBwYWlyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXNldE1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgYW5ub3RhdGlvbk5hbWUsICJ2YWx1ZSIsIHZhbHVlKTsKLQl9Ci0JCQotCXByb3RlY3RlZCB2b2lkIHNldE1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChhbm5vdGF0aW9uTmFtZSk7Ci0JCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCWFubm90YXRpb24gPSBhZGROb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIGFubm90YXRpb25OYW1lKTsKLQkJfQotCQllbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTWFya2VyQW5ub3RhdGlvbikgewotCQkJYW5ub3RhdGlvbiA9IHJlcGxhY2VNYXJrZXJBbm5vdGF0aW9uKChNYXJrZXJBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKTsKLQkJfQotCQlzZXRNZW1iZXJWYWx1ZVBhaXIoKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb24sIGVsZW1lbnROYW1lLCB2YWx1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldE1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCU1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgPSB0aGlzLm1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCBlbGVtZW50TmFtZSk7Ci0JCWlmIChtZW1iZXJWYWx1ZVBhaXIgPT0gbnVsbCkgewotCQkJYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sIGVsZW1lbnROYW1lLCB2YWx1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQltZW1iZXJWYWx1ZVBhaXIuc2V0VmFsdWUobmV3U3RyaW5nTGl0ZXJhbChhbm5vdGF0aW9uLmdldEFTVCgpLCB2YWx1ZSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJcmVtb3ZlTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBhbm5vdGF0aW9uTmFtZSwgInZhbHVlIik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKGFubm90YXRpb25OYW1lKTsKLQkJdmFsdWVzKGFubm90YXRpb24pLnJlbW92ZShtZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgZWxlbWVudE5hbWUpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW51bU1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIFN0cmluZyBlbnVtVmFsdWUpIHsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChhbm5vdGF0aW9uTmFtZSk7Ci0JCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCWFubm90YXRpb24gPSBhZGROb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIGFubm90YXRpb25OYW1lKTsKLQkJfQotCQl0aGlzLnNldEVudW1NZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInZhbHVlIiwgZW51bVZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbnVtTWVtYmVyVmFsdWVQYWlyKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgZW51bVZhbHVlKSB7Ci0JCU1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgPSB0aGlzLm1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCBlbGVtZW50TmFtZSk7Ci0JCWlmIChtZW1iZXJWYWx1ZVBhaXIgPT0gbnVsbCkgewotCQkJdGhpcy5hZGRFbnVtTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sIGVsZW1lbnROYW1lLCBlbnVtVmFsdWUpOwotCQl9Ci0JCWVsc2UgewotCQkJbWVtYmVyVmFsdWVQYWlyLnNldFZhbHVlKGFubm90YXRpb24uZ2V0QVNUKCkubmV3TmFtZShlbnVtVmFsdWUpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVudW1NZW1iZXJWYWx1ZVBhaXIoTWFya2VyQW5ub3RhdGlvbiBtYXJrZXJBbm5vdGF0aW9uLCBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLmFkZEVudW1NZW1iZXJWYWx1ZVBhaXIodGhpcy5yZXBsYWNlTWFya2VyQW5ub3RhdGlvbihtYXJrZXJBbm5vdGF0aW9uKSwgZWxlbWVudE5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbnVtTWVtYmVyVmFsdWVQYWlyKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgZWxlbWVudE5hbWUsIGFubm90YXRpb24uZ2V0QVNUKCkubmV3TmFtZSh2YWx1ZSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBlbGVtZW50TmFtZSwgRXhwcmVzc2lvbiB2YWx1ZSkgewotCQlNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyID0gdGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbi5nZXRBU1QoKSwgZWxlbWVudE5hbWUsIHZhbHVlKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgbWVtYmVyVmFsdWVQYWlyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZW1iZXJWYWx1ZVBhaXIoTWFya2VyQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgZWxlbWVudE5hbWUsIEV4cHJlc3Npb24gdmFsdWUpIHsKLQkJTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA9IHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24uZ2V0QVNUKCksIGVsZW1lbnROYW1lLCB2YWx1ZSk7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sIG1lbWJlclZhbHVlUGFpcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEVudW1Db25zdGFudChFbnVtRGVjbGFyYXRpb24gZW51bURlY2xhcmF0aW9uLCBTdHJpbmcgZW51bUNvbnN0YW50TmFtZSkgewotCQlFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBlbnVtQ29uc3RhbnREZWNsYXJhdGlvbiA9IHRoaXMubmV3RW51bUNvbnN0YW50RGVjbGFyYXRpb24oZW51bURlY2xhcmF0aW9uLmdldEFTVCgpLCBlbnVtQ29uc3RhbnROYW1lKTsKLQkJdGhpcy5lbnVtQ29uc3RhbnRzKGVudW1EZWNsYXJhdGlvbikuYWRkKGVudW1Db25zdGFudERlY2xhcmF0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRW51bUNvbnN0YW50KEVudW1EZWNsYXJhdGlvbiBlbnVtRGVjbGFyYXRpb24sIFN0cmluZyBlbnVtQ29uc3RhbnROYW1lKSB7Ci0JCUxpc3Q8RW51bUNvbnN0YW50RGVjbGFyYXRpb24+IGVudW1Db25zdGFudHNMaXN0ID0gdGhpcy5lbnVtQ29uc3RhbnRzKGVudW1EZWNsYXJhdGlvbik7Ci0JCWZvciAoRW51bUNvbnN0YW50RGVjbGFyYXRpb24gY29uc3RhbnQgOiBlbnVtQ29uc3RhbnRzTGlzdCkgewotCQkJaWYgKGNvbnN0YW50LmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoZW51bUNvbnN0YW50TmFtZSkpIHsKLQkJCQllbnVtQ29uc3RhbnRzTGlzdC5yZW1vdmUoY29uc3RhbnQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNoYW5nZUVudW1Db25zdGFudE5hbWUoRW51bURlY2xhcmF0aW9uIGVudW1EZWNsYXJhdGlvbiwgU3RyaW5nIG9sZEVudW1Db25zdGFudE5hbWUsIFN0cmluZyBuZXdFbnVtQ29uc3RhbnROYW1lKSB7Ci0JCUxpc3Q8RW51bUNvbnN0YW50RGVjbGFyYXRpb24+IGVudW1Db25zdGFudHNMaXN0ID0gdGhpcy5lbnVtQ29uc3RhbnRzKGVudW1EZWNsYXJhdGlvbik7Ci0JCWZvciAoRW51bUNvbnN0YW50RGVjbGFyYXRpb24gY29uc3RhbnQgOiBlbnVtQ29uc3RhbnRzTGlzdCkgewotCQkJaWYgKGNvbnN0YW50LmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMob2xkRW51bUNvbnN0YW50TmFtZSkpIHsKLQkJCQl0aGlzLmNoYW5nZUVudW1Db25zdGFudE5hbWUoY29uc3RhbnQsIG5ld0VudW1Db25zdGFudE5hbWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNoYW5nZUVudW1Db25zdGFudE5hbWUoRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZW51bUNvbnN0YW50RGVjbGFyYXRpb24sIFN0cmluZyBuZXdFbnVtQ29uc3RhbnROYW1lKSB7Ci0JCWVudW1Db25zdGFudERlY2xhcmF0aW9uLnNldE5hbWUoZW51bUNvbnN0YW50RGVjbGFyYXRpb24uZ2V0QVNUKCkubmV3U2ltcGxlTmFtZShuZXdFbnVtQ29uc3RhbnROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBhcnJheSBlbGVtZW50IHRvIGFuIGFubm90YXRpb24gdGhhdCBpcyBlaXRoZXIgYSBub3JtYWwgYW5ub3RhdGlvbiBvciBhIG1hcmtlciBhbm5vdGF0aW9uLgotCSAqIElmIGl0IGlzIGEgbWFya2VyIGFubm90YXRpb24gZmlyc3QgbWFrZSBpdCBhIG5vcm1hbCBhbm5vdGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFycmF5RWxlbWVudChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIGludCBpbmRleCwgU3RyaW5nIGVsZW1lbnROYW1lLCBFeHByZXNzaW9uIGFycmF5RWxlbWVudCkgewotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoYW5ub3RhdGlvbk5hbWUpOwotCQlOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb247Ci0JCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCW5vcm1hbEFubm90YXRpb24gPSB0aGlzLmFkZE5vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgYW5ub3RhdGlvbk5hbWUpOwotCQl9Ci0JCWVsc2UgaWYgKGFubm90YXRpb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLk1BUktFUl9BTk5PVEFUSU9OKSB7Ci0JCQlub3JtYWxBbm5vdGF0aW9uID0gdGhpcy5yZXBsYWNlTWFya2VyQW5ub3RhdGlvbigoTWFya2VyQW5ub3RhdGlvbikgYW5ub3RhdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub3JtYWxBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb247Ci0JCX0KLQkJdGhpcy5hZGRBcnJheUVsZW1lbnQobm9ybWFsQW5ub3RhdGlvbiwgaW5kZXgsIGVsZW1lbnROYW1lLCBhcnJheUVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgYXJyYXkgZWxlbWVudCB0byB0aGUgZ2l2ZW4gbm9ybWFsIGFubm90YXRpb24ncyBlbGVtZW50IG5hbWVkIGVsZW1lbnROYW1lLgotCSAqIEFkZCBhIG5ldyBtZW1iZXIgdmFsdWUgcGFpciBpZiBvbmUgZG9lcyBub3QgZXhpc3QuCi0JICogSWYgdGhlIG1lbWJlciB2YWx1ZSBwYWlyIGV4aXN0cyBidXQgdGhlIHZhbHVlIGlzIG5vdCB5ZXQgYW4gYXJyYXksIG1ha2UgaXQgYW4gYXJyYXkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXJyYXlFbGVtZW50KE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgaW50IGluZGV4LCBTdHJpbmcgZWxlbWVudE5hbWUsIEV4cHJlc3Npb24gYXJyYXlFbGVtZW50KSB7Ci0JCU1lbWJlclZhbHVlUGFpciBwYWlyID0gdGhpcy5tZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgZWxlbWVudE5hbWUpOwotCQlpZiAocGFpciA9PSBudWxsKSB7Ci0JCQlwYWlyID0gdGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbi5nZXRBU1QoKSwgZWxlbWVudE5hbWUsIGFycmF5RWxlbWVudCk7Ci0JCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCBwYWlyKTsKLQkJfQotCQllbHNlIHsKLQkJCUV4cHJlc3Npb24gdmFsdWUgPSBwYWlyLmdldFZhbHVlKCk7Ci0JCQlpZiAodmFsdWUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSKSB7Ci0JCQkJdGhpcy5leHByZXNzaW9ucygoQXJyYXlJbml0aWFsaXplcikgdmFsdWUpLmFkZChpbmRleCwgYXJyYXlFbGVtZW50KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplciA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3QXJyYXlJbml0aWFsaXplcigpOwotCQkJCXBhaXIuc2V0VmFsdWUoYXJyYXlJbml0aWFsaXplcik7Ci0JCQkJdGhpcy5leHByZXNzaW9ucyhhcnJheUluaXRpYWxpemVyKS5hZGQodmFsdWUpOwotCQkJCXRoaXMuZXhwcmVzc2lvbnMoYXJyYXlJbml0aWFsaXplcikuYWRkKGluZGV4LCBhcnJheUVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhc3N1bWVzIGFuIGVsZW1lbnQgd2l0aCBuYW1lIGVsZW1lbnROYW1lIGV4aXN0cyB3aXRoIGFuIGFycmF5IGFzIGl0cyB2YWx1ZS4KLQkgKiBNb3ZlIHRoZSBhcnJheSBlbGVtZW50IGF0IHNvdXJjZUluZGV4IHRvIHRoZSB0YXJnZXRJbmRleAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1vdmVBcnJheUVsZW1lbnQoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgZWxlbWVudE5hbWUsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCU1lbWJlclZhbHVlUGFpciBwYWlyID0gdGhpcy5tZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgZWxlbWVudE5hbWUpOwotCQlBcnJheUluaXRpYWxpemVyIGFycmF5ID0gKEFycmF5SW5pdGlhbGl6ZXIpIHBhaXIuZ2V0VmFsdWUoKTsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5leHByZXNzaW9ucyhhcnJheSksIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhc3N1bWVzIGFuIGVsZW1lbnQgd2l0aCBuYW1lIGVsZW1lbnROYW1lIGV4aXN0cyB3aXRoIHBvdGVudGlhbGx5IGFuIGFycmF5IGFzIGl0cyB2YWx1ZS4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgbm90IGFuIGFycmF5LCB0aGVuIHRoZSBtZW1iZXIgdmFsdWUgcGFpciBpcyByZW1vdmVkLgotCSAqIElmIHRoZSBhcnJheSBlbGVtZW50IGlzIHJlbW92ZWQgYW5kIHRoZXJlIGlzIG9ubHkgMSBhcnJheSBlbGVtZW50IGxlZnQsIHRoZSBhcnJheSBpdHNlbGYgaXMgcmVtb3ZlZAotCSAqIGFuZCB0aGUgcmVtYWluaW5nIGVsZW1lbnQgaXMgc2V0IGFzIHRoZSB2YWx1ZSBvZiB0aGUgbWVtYmVyIHZhbHVlIHBhaXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBcnJheUVsZW1lbnQoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgZWxlbWVudE5hbWUsIGludCBpbmRleCkgewotCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IHRoaXMubWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sIGVsZW1lbnROYW1lKTsKLQkJaWYgKHBhaXIuZ2V0VmFsdWUoKS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIpIHsKLQkJCUFycmF5SW5pdGlhbGl6ZXIgYXJyYXkgPSAoQXJyYXlJbml0aWFsaXplcikgcGFpci5nZXRWYWx1ZSgpOwotCQkJdGhpcy5leHByZXNzaW9ucyhhcnJheSkucmVtb3ZlKGluZGV4KTsKLQkJCWlmICh0aGlzLmV4cHJlc3Npb25zKGFycmF5KS5zaXplKCkgPT0gMSkgewotCQkJCXBhaXIuc2V0VmFsdWUodGhpcy5leHByZXNzaW9ucyhhcnJheSkucmVtb3ZlKDApKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMudmFsdWVzKGFubm90YXRpb24pLnJlbW92ZShwYWlyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgdGhlIGdpdmVuIG1hcmtlciBhbm5vdGF0aW9uIHdpdGggYSBub3JtYWwgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gdGhlIHJlc3VsdGluZyBub3JtYWwgYW5ub3RhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9ybWFsQW5ub3RhdGlvbiByZXBsYWNlTWFya2VyQW5ub3RhdGlvbihNYXJrZXJBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gYW5ub3RhdGlvbnMgPSB0aGlzLmFubm90YXRpb25zKGFubm90YXRpb24uZ2V0UGFyZW50KCkpOwotCQlpbnQgaW5kZXggPSBhbm5vdGF0aW9ucy5pbmRleE9mKGFubm90YXRpb24pOwotCQlOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb24gPSBuZXdOb3JtYWxBbm5vdGF0aW9uKGFubm90YXRpb24uZ2V0QVNUKCksIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFubm90YXRpb25zLnNldChpbmRleCwgbm9ybWFsQW5ub3RhdGlvbik7Ci0JCXJldHVybiBub3JtYWxBbm5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgbm9ybWFsIGFubm90YXRpb24gYW5kIHNldCBpdHMgbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9ybWFsQW5ub3RhdGlvbiBuZXdOb3JtYWxBbm5vdGF0aW9uKEFTVCBhc3QsIFN0cmluZyBuYW1lKSB7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFzdC5uZXdOb3JtYWxBbm5vdGF0aW9uKCk7Ci0JCWFubm90YXRpb24uc2V0VHlwZU5hbWUoYXN0Lm5ld05hbWUobmFtZSkpOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIG5vcm1hbCBhbm5vdGF0aW9uIHRvIHRoZSBnaXZlbiBBU1Qgbm9kZS4gCi0JICogVGhpcyBzaG91bGQgYmUgYSBQYWNrYWdlRGVjbGFyYXRpb24gb3IgYSBCb2R5RGVjbGFyYXRpb24uCi0JICogUmV0dXJuIHRoZSByZXN1bHRpbmcgbm9ybWFsIGFubm90YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE5vcm1hbEFubm90YXRpb24gYWRkTm9ybWFsQW5ub3RhdGlvbihBU1ROb2RlIGFzdE5vZGUsIFN0cmluZyBuYW1lKSB7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMubmV3Tm9ybWFsQW5ub3RhdGlvbihhc3ROb2RlLmdldEFTVCgpLCBuYW1lKTsKLQkJdGhpcy5hZGRBbm5vdGF0aW9uKGFzdE5vZGUsIGFubm90YXRpb24pOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIGFubm90YXRpb24gdG8gdGhlIGdpdmVuIEFTVCBub2RlLiAKLQkgKiBUaGlzIHNob3VsZCBiZSBhIFBhY2thZ2VEZWNsYXJhdGlvbiBvciBhIEJvZHlEZWNsYXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uKEFTVE5vZGUgYXN0Tm9kZSwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXRoaXMuYW5ub3RhdGlvbnMoYXN0Tm9kZSkuYWRkKGFubm90YXRpb24pOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgbWFya2VyIGFubm90YXRpb24gYW5kIHNldCBpdHMgbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFya2VyQW5ub3RhdGlvbiBuZXdNYXJrZXJBbm5vdGF0aW9uKEFTVCBhc3QsIFN0cmluZyBuYW1lKSB7Ci0JCU1hcmtlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFzdC5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCWFubm90YXRpb24uc2V0VHlwZU5hbWUoYXN0Lm5ld05hbWUobmFtZSkpOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIG5vcm1hbCBhbm5vdGF0aW9uIHRvIHRoZSBnaXZlbiBBU1Qgbm9kZS4gCi0JICogVGhpcyBzaG91bGQgYmUgYSBQYWNrYWdlRGVjbGFyYXRpb24gb3IgYSBCb2R5RGVjbGFyYXRpb24uCi0JICogUmV0dXJuIHRoZSByZXN1bHRpbmcgbm9ybWFsIGFubm90YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE1hcmtlckFubm90YXRpb24gYWRkTWFya2VyQW5ub3RhdGlvbihBU1ROb2RlIGFzdE5vZGUsIFN0cmluZyBuYW1lKSB7Ci0JCU1hcmtlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMubmV3TWFya2VyQW5ub3RhdGlvbihhc3ROb2RlLmdldEFTVCgpLCBuYW1lKTsKLQkJdGhpcy5hZGRBbm5vdGF0aW9uKGFzdE5vZGUsIGFubm90YXRpb24pOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQobmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gZnJvbSB0aGUgQVNUIG5vZGUuCi0JICogVGhpcyBzaG91bGQgYmUgYSBQYWNrYWdlRGVjbGFyYXRpb24gb3IgYSBCb2R5RGVjbGFyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihBU1ROb2RlIGFzdE5vZGUsIEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQl0aGlzLmFubm90YXRpb25zKGFzdE5vZGUpLnJlbW92ZShhbm5vdGF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBtaW5pbWl6ZSB0aGUgc2NvcGUgb2YgdGhlIHN1cHByZXNzZWQgd2FybmluZ3MKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gYW5ub3RhdGlvbnMoQVNUTm9kZSBhc3ROb2RlKSB7Ci0JCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgQm9keURlY2xhcmF0aW9uKSB7Ci0JCQlyZXR1cm4gKChCb2R5RGVjbGFyYXRpb24pIGFzdE5vZGUpLm1vZGlmaWVycygpOwotCQl9Ci0JCWVsc2UgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBQYWNrYWdlRGVjbGFyYXRpb24pIHsKLQkJCXJldHVybiAoKFBhY2thZ2VEZWNsYXJhdGlvbikgYXN0Tm9kZSkuYW5ub3RhdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogbWluaW1pemUgdGhlIHNjb3BlIG9mIHRoZSBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMoQXJyYXlJbml0aWFsaXplciBhcnJheUluaXRpYWxpemVyKSB7Ci0JCXJldHVybiBhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioKLQotCXB1YmxpYyBpbnRlcmZhY2UgQW5ub3RhdGlvbldyaXRlciB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpOwotCQl2b2lkIGFwcGVuZFBhY2thZ2VBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JCXZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKTsKLQkJdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpOwotCQl2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JCXZvaWQgYXBwZW5kTmFtZUZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpOwotCQl2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpOwotCQl2b2lkIGFwcGVuZFNldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpOwotCQl2b2lkIGFwcGVuZEdldE5hbWVNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JCXZvaWQgYXBwZW5kU2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKTsKLQkJdm9pZCBhcHBlbmRNZW1iZXJUeXBlVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JCXZvaWQgYXBwZW5kVG9wTGV2ZWxUeXBlc1RvKFN0cmluZ0J1aWxkZXIgc2IpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIgaW1wbGVtZW50cyBBbm5vdGF0aW9uV3JpdGVyIHsKLQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHtyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpO30KLQkJcHVibGljIHZvaWQgYXBwZW5kUGFja2FnZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kTmFtZUZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kU2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgey8qIGRvIG5vdGhpbmcgKi99Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZEdldE5hbWVNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgey8qIGRvIG5vdGhpbmcgKi99Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZFNldE5hbWVNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgey8qIGRvIG5vdGhpbmcgKi99Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZE1lbWJlclR5cGVUbyhTdHJpbmdCdWlsZGVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kVG9wTGV2ZWxUeXBlc1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQW5ub3RhdGlvbldyaXRlcldyYXBwZXIgaW1wbGVtZW50cyBBbm5vdGF0aW9uV3JpdGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uV3JpdGVyIGF3OwotCQlwdWJsaWMgQW5ub3RhdGlvbldyaXRlcldyYXBwZXIoQW5ub3RhdGlvbldyaXRlciBhdykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYXcgPSBhdzsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkge3JldHVybiB0aGlzLmF3LmltcG9ydHMoKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZFBhY2thZ2VBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikge3RoaXMuYXcuYXBwZW5kUGFja2FnZUFubm90YXRpb25UbyhzYik7fQotCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHt0aGlzLmF3LmFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oc2IpO30KLQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7dGhpcy5hdy5hcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKHNiKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikge3RoaXMuYXcuYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhzYik7fQotCQlwdWJsaWMgdm9pZCBhcHBlbmROYW1lRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikge3RoaXMuYXcuYXBwZW5kTmFtZUZpZWxkQW5ub3RhdGlvblRvKHNiKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHt0aGlzLmF3LmFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKHNiKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZFNldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHt0aGlzLmF3LmFwcGVuZFNldElkTWV0aG9kQW5ub3RhdGlvblRvKHNiKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZEdldE5hbWVNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikge3RoaXMuYXcuYXBwZW5kR2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhzYik7fQotCQlwdWJsaWMgdm9pZCBhcHBlbmRTZXROYW1lTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHt0aGlzLmF3LmFwcGVuZFNldE5hbWVNZXRob2RBbm5vdGF0aW9uVG8oc2IpO30KLQkJcHVibGljIHZvaWQgYXBwZW5kTWVtYmVyVHlwZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHt0aGlzLmF3LmFwcGVuZE1lbWJlclR5cGVUbyhzYik7fQotCQlwdWJsaWMgdm9pZCBhcHBlbmRUb3BMZXZlbFR5cGVzVG8oU3RyaW5nQnVpbGRlciBzYikge3RoaXMuYXcuYXBwZW5kVG9wTGV2ZWxUeXBlc1RvKHNiKTt9Ci0JfQotCi0JcHVibGljIGNsYXNzIEFubm90YXRlZFNvdXJjZVdyaXRlcgotCQkJaW1wbGVtZW50cyBTb3VyY2VXcml0ZXIgewotCQkKLQkJcHJpdmF0ZSBBbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXI7Ci0JCXByaXZhdGUgU3RyaW5nIHBhY2thZ2VOYW1lOwotCQlwcml2YXRlIFN0cmluZyB0eXBlTmFtZTsKLQkJCi0JCXB1YmxpYyBBbm5vdGF0ZWRTb3VyY2VXcml0ZXIoQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyKSB7Ci0JCQl0aGlzKGFubm90YXRpb25Xcml0ZXIsIFRZUEVfTkFNRSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0ZWRTb3VyY2VXcml0ZXIoQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJCXRoaXMoYW5ub3RhdGlvbldyaXRlciwgUEFDS0FHRV9OQU1FLCB0eXBlTmFtZSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0ZWRTb3VyY2VXcml0ZXIoQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyLCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyB0eXBlTmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYW5ub3RhdGlvbldyaXRlciA9IGFubm90YXRpb25Xcml0ZXI7Ci0JCQl0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0JCQl0aGlzLnR5cGVOYW1lID0gdHlwZU5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCWlmICh0aGlzLnR5cGVOYW1lICE9IG51bGwpIHsKLQkJCQlBbm5vdGF0aW9uVGVzdENhc2UudGhpcy5hcHBlbmRTb3VyY2VUbyhzYiwgdGhpcy5hbm5vdGF0aW9uV3JpdGVyLCB0aGlzLnBhY2thZ2VOYW1lLCB0aGlzLnR5cGVOYW1lKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUFubm90YXRpb25UZXN0Q2FzZS50aGlzLmFwcGVuZFNvdXJjZVRvKHNiLCB0aGlzLmFubm90YXRpb25Xcml0ZXIsIHRoaXMucGFja2FnZU5hbWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBFbnVtQW5ub3RhdGlvbldyaXRlciB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpOwotCQl2b2lkIGFwcGVuZFBhY2thZ2VBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JCXZvaWQgYXBwZW5kRW51bUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKTsKLQkJdm9pZCBhcHBlbmRTdW5kYXlFbnVtQ29uc3RhbnRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JCXZvaWQgYXBwZW5kTW9uZGF5RW51bUNvbnN0YW50QW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRGVmYXVsdEVudW1Bbm5vdGF0aW9uV3JpdGVyIGltcGxlbWVudHMgRW51bUFubm90YXRpb25Xcml0ZXIgewotCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkge3JldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7fQotCQlwdWJsaWMgdm9pZCBhcHBlbmRQYWNrYWdlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCQlwdWJsaWMgdm9pZCBhcHBlbmRFbnVtQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCQlwdWJsaWMgdm9pZCBhcHBlbmRTdW5kYXlFbnVtQ29uc3RhbnRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgey8qIGRvIG5vdGhpbmcgKi99Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZE1vbmRheUVudW1Db25zdGFudEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgRW51bUFubm90YXRlZFNvdXJjZVdyaXRlcgotCQkJaW1wbGVtZW50cyBTb3VyY2VXcml0ZXIgewotCQkKLQkJcHJpdmF0ZSBFbnVtQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyOwotCQlwcml2YXRlIFN0cmluZyBwYWNrYWdlTmFtZTsKLQkJcHJpdmF0ZSBTdHJpbmcgZW51bU5hbWU7Ci0JCQotCQlwdWJsaWMgRW51bUFubm90YXRlZFNvdXJjZVdyaXRlcihFbnVtQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyKSB7Ci0JCQl0aGlzKGFubm90YXRpb25Xcml0ZXIsIFRZUEVfTkFNRSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBFbnVtQW5ub3RhdGVkU291cmNlV3JpdGVyKEVudW1Bbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIsIFN0cmluZyBlbnVtTmFtZSkgewotCQkJdGhpcyhhbm5vdGF0aW9uV3JpdGVyLCBQQUNLQUdFX05BTUUsIGVudW1OYW1lKTsKLQkJfQotCQkKLQkJcHVibGljIEVudW1Bbm5vdGF0ZWRTb3VyY2VXcml0ZXIoRW51bUFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlciwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZW51bU5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmFubm90YXRpb25Xcml0ZXIgPSBhbm5vdGF0aW9uV3JpdGVyOwotCQkJdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotCQkJdGhpcy5lbnVtTmFtZSA9IGVudW1OYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlBbm5vdGF0aW9uVGVzdENhc2UudGhpcy5hcHBlbmRFbnVtU291cmNlVG8oc2IsIHRoaXMuYW5ub3RhdGlvbldyaXRlciwgdGhpcy5wYWNrYWdlTmFtZSwgdGhpcy5lbnVtTmFtZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRmOTJmYS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzIGV4dGVuZHMgQW5ub3RhdGlvblRlc3RDYXNlIHsKLQotCXB1YmxpYyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGFubm90YXRpb25Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImFubm90IiwgYW5ub3RhdGlvbk5hbWUgKyAiLmphdmEiLCAicHVibGljIEBpbnRlcmZhY2UgIiArIGFubm90YXRpb25OYW1lICsgIiB7ICIgKyBhbm5vdGF0aW9uQm9keSArICIgfSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSURcIikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsIDApOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImFubm90LkpvaW5Db2x1bW4iLCBhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSURcIikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEXCIpKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgMCk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuSm9pbkNvbHVtbiIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc05vcm1hbEFubm90YXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSURcIikpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyh7QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuSm9pbkNvbHVtbiIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc05vcm1hbEFubm90YXRpb24oKSk7Ci0JCVN0cmluZyB2YWx1ZSA9ICgoU3RyaW5nTGl0ZXJhbCkgdGhpcy52YWx1ZXMoKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb24pLmdldCgwKS5nZXRWYWx1ZSgpKS5nZXRMaXRlcmFsVmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJBRERSRVNTX0lEMiIsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyh7QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuSm9pbkNvbHVtbiIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc05vcm1hbEFubm90YXRpb24oKSk7Ci0JCVN0cmluZyB2YWx1ZSA9ICgoU3RyaW5nTGl0ZXJhbCkgdGhpcy52YWx1ZXMoKChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKSkuZ2V0KDApLmdldFZhbHVlKCkpLmdldExpdGVyYWxWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoIkFERFJFU1NfSUQyIiwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRFwiKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgMCk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkpvaW5Db2x1bW4iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSURcIikpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAwKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQUREUkVTU19JRCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyh7QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkpvaW5Db2x1bW5zIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJBRERSRVNTX0lEMiIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiSm9pbkNvbHVtbnMiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkFERFJFU1NfSUQyIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb241KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiU3RyaW5nIGNvbW1lbnQoKTsgSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb21tZW50PVwidGVzdFwiLGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb21tZW50PVwidGVzdFwiLGNvbHVtbnM9QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhudWxsKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgMCk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Kb2luQ29sdW1ucyhudWxsKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBKb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSI7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAidmFsdWUiLCAyKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiSm9pbkNvbHVtbnMiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKHtudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIil9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuSm9pbkNvbHVtbiIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJ2YWx1ZSIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQUREUkVTU19JRCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjE0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpLCBudWxsfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBKb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSI7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAidmFsdWUiLCAyKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjE1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDNcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkpvaW5Db2x1bW5zKHtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIG51bGwsIG51bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEM1wiKX0pIjsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJ2YWx1ZSIsIDIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyh7QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEM1wiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgInZhbHVlIiwgMyk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKHtudWxsLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuSm9pbkNvbHVtbiIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJ2YWx1ZSIsIDIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQUREUkVTU19JRDIiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiSm9pbkNvbHVtbiIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMCk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJKb2luQ29sdW1uIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1ucyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW4iKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiSm9pbkNvbHVtbnMiLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKGNvbHVtbnMgPSB7IEBKb2luQ29sdW1uLCBASm9pbkNvbHVtbiB9KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uLCBAYW5ub3QuSm9pbkNvbHVtbn0pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uLCBAYW5ub3QuSm9pbkNvbHVtbiwiICsgQ1IgKyAiICAgIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKDc3KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAwKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkpvaW5Db2x1bW4iLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkpvaW5Db2x1bW5zIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCI3NyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9QGFubm90LkpvaW5Db2x1bW4oNzcpKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAwKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPUBKb2luQ29sdW1uKSIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiNzciLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPUBhbm5vdC5Kb2luQ29sdW1uKDc3KSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4oNzcpLEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKDc3KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhjb2x1bW5zID0geyBASm9pbkNvbHVtbig3NyksIEBKb2luQ29sdW1uIH0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4oNzcpLEBhbm5vdC5Kb2luQ29sdW1uKDg4KX0pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKDc3KSxASm9pbkNvbHVtbn0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uOSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7IFN0cmluZyB0ZXh0KCk7IGludCBudW0oKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKHRleHQ9XCJibGFoXCIsbnVtPTQyKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhjb2x1bW5zID0geyBASm9pbkNvbHVtbih0ZXh0ID0gXCJibGFoXCIsIG51bSA9IDQyKSwgQEpvaW5Db2x1bW4gfSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7IFN0cmluZyB0ZXh0KCk7IGludCBudW0oKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKHRleHQ9XCJiXCIsbnVtPTQpIik7Ci0JCVN0cmluZyBleHBlY3RlZDEgPSAiQEpvaW5Db2x1bW5zKGNvbHVtbnMgPSB7IEBKb2luQ29sdW1uKHRleHQgPSBcImJcIiwgbnVtID0gNCksIG51bGwsIjsKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJASm9pbkNvbHVtbiB9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQxLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQyLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyBTdHJpbmcgdGV4dCgpOyBpbnQgbnVtKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW4odGV4dD1cImJsYWhcIixudW09NDIpIik7CQotCQkKLQkJLy9Vc2Ugb2xkIGZvcm1hdHRpbmcgaWYgamR0IGNvcmUgdmVyc2lvbiBpcyAzLjUgb3IgYmVsb3cgLSBzZWUgYnVnIDI4NTYwNAotCQlWZXJzaW9uIHZlcnNpb24gPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmpkdC5jb3JlIikuZ2V0VmVyc2lvbigpOwotCQlpbnQgbWFqb3JWZXJzaW9uID0gdmVyc2lvbi5nZXRNYWpvcigpOwotCQlpbnQgbWlub3JWZXJzaW9uID0gdmVyc2lvbi5nZXRNaW5vcigpOwotCQkvL1RoaXMgY29uZGl0aW9uIHNob3VsZCBiZSByZW1vdmVkIGFuZCB0ZXN0IHVwZGF0ZWQgYWZ0ZXIgRGFsaSAzLjAgYnJhbmNoZXMgCi0JCVN0cmluZyBleHBlY3RlZDE7Ci0JCWlmIChtYWpvclZlcnNpb24gPT0gMyAmJiBtaW5vclZlcnNpb24gPD0gNSkgewotCQkJZXhwZWN0ZWQxID0gIkBKb2luQ29sdW1ucyggeyI7Ci0JCX0KLQkJZWxzZSBleHBlY3RlZDEgPSAiQEpvaW5Db2x1bW5zKHsiOwotCQkKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJASm9pbkNvbHVtbih0ZXh0ID0gXCJibGFoXCIsIG51bSA9IDQyKSwgbnVsbCwiOwotCQlTdHJpbmcgZXhwZWN0ZWQzID0gIkBKb2luQ29sdW1uICIgKyBDUiArICIgICAgfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMywgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgInZhbHVlIiwgMik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgbnVsbCwgbnVsbCwiOyAgLy8gdGhlIGxpbmUgZ2V0cyBzcGxpdAotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBKb2luQ29sdW1ufSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCA0KTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjI2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBudWxsLCBudWxsLCI7ICAvLyB0aGUgbGluZSBnZXRzIHNwbGl0Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQEpvaW5Db2x1bW59KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQxLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQyLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAidmFsdWUiLCA0KTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEpvaW5Db2x1bW5zKGNvbHVtbnMgPSB7IG51bGwsIEBKb2luQ29sdW1uKG5hbWUgPSBcIkFERFJFU1NfSUQwXCIpIH0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAwKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17bnVsbCxAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpIjsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMSk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1ucyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24yYSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKHtudWxsLEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJASm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIikiOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgInZhbHVlIiwgMSk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1ucyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDNcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEM1wiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMyk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEM1wiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQ0XCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDNcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDRcIil9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMyk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigzKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e251bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIil9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMCk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigzKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e251bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDMpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb244KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDRcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e251bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDRcIil9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMyk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e251bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShleHBlY3RlZCk7ICAvLyB0aGUgc291cmNlIHNob3VsZCBiZSB1bmNoYW5nZWQKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMCk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigzKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJASm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIikiOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAyKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBhbm5vdC5Kb2luQ29sdW1ucyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xMGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyh7QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpIjsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJ2YWx1ZSIsIDIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQGFubm90LkpvaW5Db2x1bW5zIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSIpOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1uIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIG51bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJASm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIikiOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAyKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBhbm5vdC5Kb2luQ29sdW1ucyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIG51bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEM1wiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQzXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIil9KSI7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDMpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9EZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0RlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMzdjYzkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0RlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5EZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyVGVzdHMgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewotCi0KLQkvLyAqKioqKioqKioqIFRlc3RDYXNlIGJlaGF2aW9yICoqKioqKioqKioKLQotCXB1YmxpYyBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGVzdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbW1hTGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmNvbW1hTGVuZ3RoKCIsIikpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5jb21tYUxlbmd0aCgiLCAiKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmNvbW1hTGVuZ3RoKCIsICAgIikpOwotCi0JCWFzc2VydEVxdWFscygyLCB0aGlzLmNvbW1hTGVuZ3RoKCIgLCIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuY29tbWFMZW5ndGgoIiAsICIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuY29tbWFMZW5ndGgoIiAsICAgIikpOwotCi0JCWFzc2VydEVxdWFscygzLCB0aGlzLmNvbW1hTGVuZ3RoKCIgICwiKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLmNvbW1hTGVuZ3RoKCIgICwgIikpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5jb21tYUxlbmd0aCgiICAsICAgIikpOwotCi0JCWFzc2VydEVxdWFscygwLCB0aGlzLmNvbW1hTGVuZ3RoKCIgICwsLCIpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29tbWFMZW5ndGgoIiAgLCwsICIpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29tbWFMZW5ndGgoIiAgLCAgICwiKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29tbWFMZW5ndGgoIiAgLHgiKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmNvbW1hTGVuZ3RoKCIgICx4ICIpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29tbWFMZW5ndGgoIiAgLCAgIHgiKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29tbWFMZW5ndGgoInggICwiKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmNvbW1hTGVuZ3RoKCJ4ICAsICIpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29tbWFMZW5ndGgoInggICwgICAiKSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tbWFMZW5ndGgoU3RyaW5nIHMpIHsKLQkJSW50ZWdlciBsZW4gPSAoSW50ZWdlcikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QoRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCksICJjb21tYUxlbmd0aCIsIFN0cmluZy5jbGFzcywgcyk7Ci0JCXJldHVybiBsZW4uaW50VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zdHJpbmdJc0Fubm90YXRpb24oIkBGIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3RyaW5nSXNBbm5vdGF0aW9uKCJARm9vIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3RyaW5nSXNBbm5vdGF0aW9uKCJAb3JnLmJhci5Gb28iKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5zdHJpbmdJc0Fubm90YXRpb24oIiIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdHJpbmdJc0Fubm90YXRpb24oIkAiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3RyaW5nSXNBbm5vdGF0aW9uKCJGb28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3RyaW5nSXNBbm5vdGF0aW9uKCJGb29AIikpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzdHJpbmdJc0Fubm90YXRpb24oU3RyaW5nIHMpIHsKLQkJQm9vbGVhbiBiID0gKEJvb2xlYW4pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpLCAic3RyaW5nSXNBbm5vdGF0aW9uIiwgU3RyaW5nLmNsYXNzLCBzKTsKLQkJcmV0dXJuIGIuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUVG9vbHNUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVFRvb2xzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkZGNjZS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSkRUVG9vbHM7Ci0KLQotcHVibGljIGNsYXNzIEpEVFRvb2xzVGVzdHMKLQkJZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewotCQotCXB1YmxpYyBKRFRUb29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZUlzU3VidHlwZSgpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCUlKYXZhUHJvamVjdCBqUHJvaiA9IGdldEphdmFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKTsKLQkJCi0JCS8vIHNhbWUgdHlwZQotCQlhc3NlcnRUcnVlKEpEVFRvb2xzLnR5cGVJc1N1YlR5cGUoalByb2osIEFycmF5TGlzdC5jbGFzcy5nZXROYW1lKCksIEFycmF5TGlzdC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShKRFRUb29scy50eXBlSXNTdWJUeXBlKGpQcm9qLCBMaXN0LmNsYXNzLmdldE5hbWUoKSwgTGlzdC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJCi0JCS8vIGNvbmNyZXRlIHR5cGUgaXMgc3VidHlwZSBvZiBpbnRlcmZhY2UKLQkJYXNzZXJ0VHJ1ZShKRFRUb29scy50eXBlSXNTdWJUeXBlKGpQcm9qLCBBcnJheUxpc3QuY2xhc3MuZ2V0TmFtZSgpLCBMaXN0LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKEpEVFRvb2xzLnR5cGVJc1N1YlR5cGUoalByb2osIFRyZWVTZXQuY2xhc3MuZ2V0TmFtZSgpLCBJdGVyYWJsZS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJCi0JCS8vIGNvbmNyZXRlIHR5cGUgaXMgbm90IHN1YnR5cGUgb2YgaW50ZXJmYWNlCi0JCWFzc2VydEZhbHNlKEpEVFRvb2xzLnR5cGVJc1N1YlR5cGUoalByb2osIEFycmF5TGlzdC5jbGFzcy5nZXROYW1lKCksIE1hcC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoSkRUVG9vbHMudHlwZUlzU3ViVHlwZShqUHJvaiwgVHJlZVNldC5jbGFzcy5nZXROYW1lKCksIE1hcC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJCi0JCS8vIGludGVyZmFjZSBpcyBzdWJ0eXBlIG9mIGludGVyZmFjZQotCQlhc3NlcnRUcnVlKEpEVFRvb2xzLnR5cGVJc1N1YlR5cGUoalByb2osIExpc3QuY2xhc3MuZ2V0TmFtZSgpLCBDb2xsZWN0aW9uLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKEpEVFRvb2xzLnR5cGVJc1N1YlR5cGUoalByb2osIFNvcnRlZFNldC5jbGFzcy5nZXROYW1lKCksIEl0ZXJhYmxlLmNsYXNzLmdldE5hbWUoKSkpOwotCQkKLQkJLy8gaW50ZXJmYWNlIGlzIG5vdCBzdWJ0eXBlIG9mIGludGVyZmFjZQotCQlhc3NlcnRGYWxzZShKRFRUb29scy50eXBlSXNTdWJUeXBlKGpQcm9qLCBMaXN0LmNsYXNzLmdldE5hbWUoKSwgTWFwLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShKRFRUb29scy50eXBlSXNTdWJUeXBlKGpQcm9qLCBTb3J0ZWRTZXQuY2xhc3MuZ2V0TmFtZSgpLCBNYXAuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCQotCQkvLyBjb25jcmV0ZSB0eXBlIGlzIHN1YnR5cGUgb2YgY29uY3JldGUgdHlwZQotCQlhc3NlcnRUcnVlKEpEVFRvb2xzLnR5cGVJc1N1YlR5cGUoalByb2osIEFycmF5TGlzdC5jbGFzcy5nZXROYW1lKCksIEFic3RyYWN0TGlzdC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShKRFRUb29scy50eXBlSXNTdWJUeXBlKGpQcm9qLCBMaW5rZWRMaXN0LmNsYXNzLmdldE5hbWUoKSwgQWJzdHJhY3RDb2xsZWN0aW9uLmNsYXNzLmdldE5hbWUoKSkpOwotCQkKLQkJLy8gY29uY3JldGUgdHlwZSBpcyBub3Qgc3VidHlwZSBvZiBjb25jcmV0ZSB0eXBlCi0JCWFzc2VydEZhbHNlKEpEVFRvb2xzLnR5cGVJc1N1YlR5cGUoalByb2osIEFycmF5TGlzdC5jbGFzcy5nZXROYW1lKCksIFZlY3Rvci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoSkRUVG9vbHMudHlwZUlzU3ViVHlwZShqUHJvaiwgTGlua2VkTGlzdC5jbGFzcy5nZXROYW1lKCksIFZlY3Rvci5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSnB0Q29tbW9uQ29yZVV0aWxpdHlKZHRUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0pwdENvbW1vbkNvcmVVdGlsaXR5SmR0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY0ODU5NS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSnB0Q29tbW9uQ29yZVV0aWxpdHlKZHRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSnB0Q29tbW9uQ29yZVV0aWxpdHlKZHRUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0Q29tbW9uQ29yZVV0aWxpdHlKZHRUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBU1RUb29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpEVFRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFR5cGVUZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdENvbW1vbkNvcmVVdGlsaXR5SmR0VGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L01lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRmMmZhNy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Cb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ2hhcmFjdGVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5JbmRleGVkQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRXhwcmVzc2lvbkNvbnZlcnRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyVGVzdHMgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewotCi0JcHVibGljIE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycyhTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIFN0cmluZyBhbm5vdGF0aW9uQm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KCJhbm5vdCIsIGFubm90YXRpb25OYW1lICsgIi5qYXZhIiwgInB1YmxpYyBAaW50ZXJmYWNlICIgKyBhbm5vdGF0aW9uTmFtZSArICIgeyAiICsgYW5ub3RhdGlvbkJvZHkgKyAiIH0iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW51bShTdHJpbmcgZW51bU5hbWUsIFN0cmluZyBlbnVtQm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiZW51bXMiLCBlbnVtTmFtZSwgZW51bUJvZHkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnVtKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGVudW1OYW1lLCBTdHJpbmcgZW51bUJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChwYWNrYWdlTmFtZSwgZW51bU5hbWUgKyAiLmphdmEiLCAicHVibGljIGVudW0gIiArIGVudW1OYW1lICsgIiB7ICIgKyBlbnVtQm9keSArICIgfSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPVwieHh4XCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJ4eHgiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiaW50IGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9NDgpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPihkYWEsICJiYXIiLCBOdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ4KSwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImNoYXIgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj0nYycpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgQ2hhcmFjdGVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJjIiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImJvb2xlYW4gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1mYWxzZSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGRhYSwgImJhciIsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiYm9vbGVhbiBmcmVkKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXogamltbXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuQmFyKGppbW15PUBhbm5vdC5CYXooZnJlZD1mYWxzZSkpKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEzID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgImppbW15IiwgImFubm90LkJheiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihkYWEzLCAiZnJlZCIsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYm9vbGVhbiB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhmYWxzZSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGRhYSwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVOdWxsMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZU51bGwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoIkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0TnVsbChhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlTnVsbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmF6IiwgIlN0cmluZyBmcmVkKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXogamltbXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuQmFyKGppbW15PUBhbm5vdC5CYXopKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEzID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgImppbW15IiwgImFubm90LkJheiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEzLCAiZnJlZCIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnROdWxsKGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVTdHJpbmdDb25jYXRlbmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1cInh4eFwiICsgXCJ5eXlcIiArIFwienp6XCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJ4eHh5eXl6enoiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlU3RyaW5nQ29uc3RhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsiKTsKLQkJLy8ganVzdCBhIGJpdCBoYWNreToKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoInByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT09fQkFSID0gXCJ4eHhcIjsgQGFubm90LkZvbyhiYXI9Rk9PX0JBUiArIFwieXl5XCIgKyBcInp6elwiKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscygieHh4eXl5enp6IiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZU51bWJlckFyaXRobWV0aWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImludCBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPTQ3IC0gNyArIDIgKiAxIC8gMSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yTnVtYmVycyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQyKSwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZU51bWJlclNoaWZ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJpbnQgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj0yIDw8IDIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvck51bWJlcnMoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4KSwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZU51bWJlckNvbnN0YW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJpbnQgYmFyKCk7Iik7Ci0JCS8vIGp1c3QgYSBiaXQgaGFja3k6Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRk9PX0JBUiA9IDc3OyBAYW5ub3QuRm9vKGJhcj1GT09fQkFSKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JOdW1iZXJzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNzcpLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlQ2hhcmFjdGVyQ29uc3RhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImNoYXIgYmFyKCk7Iik7Ci0JCS8vIGp1c3QgYSBiaXQgaGFja3k6Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEZPT19CQVIgPSAnUSc7IEBhbm5vdC5Gb28oYmFyPUZPT19CQVIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yQ2hhcmFjdGVycyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJRIiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUNoYXJhY3RlckNhc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImNoYXIgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj0oY2hhcikgMHg0MSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JDaGFyYWN0ZXJzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoIkEiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlQm9vbGVhbk9wZXJhdG9yMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYm9vbGVhbiBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPTcgPiAyKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JCb29sZWFucyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlQm9vbGVhbk9wZXJhdG9yMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYm9vbGVhbiBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPTcgPT0gMikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yQm9vbGVhbnMoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVCb29sZWFuT3BlcmF0b3IzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJib29sZWFuIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9KDcgIT0gMikgJiYgZmFsc2UpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckJvb2xlYW5zKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlQm9vbGVhbk9wZXJhdG9yNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYm9vbGVhbiBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPSg3ICE9IDIpID8gZmFsc2UgOiB0cnVlKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JCb29sZWFucyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUludmFsaWRWYWx1ZTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPTc3KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUludmFsaWRWYWx1ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWJhenp6eikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnROdWxsKGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVJbnZhbGlkVmFsdWUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJib29sZWFuIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9YmF6enp6KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JCb29sZWFucyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnROdWxsKGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVJbnZhbGlkVmFsdWU0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJjaGFyIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9XCJiYXp6enpcIikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JDaGFyYWN0ZXJzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnROdWxsKGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVJbnZhbGlkVmFsdWU1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPVwiamF2YS5sYW5nLk9iamVjdFwiKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnROdWxsKGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVJbnZhbGlkVmFsdWU2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW0gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1lbnVtcy5UZXN0RW51bS5jbGFzcykiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUludmFsaWRWYWx1ZTcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmF6IiwgImJvb2xlYW4gZnJlZCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6IGppbW15KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJU3RyaW5nIHZhbHVlID0gIlwiZmFsc2VcIiI7Ci0JCVN0cmluZyBlbGVtZW50ID0gImZyZWQ9IiArIHZhbHVlOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoamltbXk9QGFubm90LkJheigiICsgZWxlbWVudCArICIpKSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJqaW1teSIsICJhbm5vdC5CYXoiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oZGFhMywgImZyZWQiLCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnROdWxsKGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVJbnZhbGlkVmFsdWU4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPXt0cnVlLCBmYWxzZX0pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGRhYSwgImJhciIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10ge251bGwsIG51bGx9LCBhZWEuZ2V0VmFsdWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUludmFsaWRWYWx1ZTkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9NzcpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGRhYSwgImJhciIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nWzBdLCBhZWEuZ2V0VmFsdWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBU1ROb2RlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlTdHJpbmcgdmFsdWUgPSAiXCJ4eHhcIiI7Ci0JCVN0cmluZyBlbGVtZW50ID0gImJhcj0iICsgdmFsdWU7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oIiArIGVsZW1lbnQgKyAiKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0KLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IEFTVFRvb2xzLmJ1aWxkVGV4dFJhbmdlKGFlYS5nZXRBc3ROb2RlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5nZXRTb3VyY2UoY3UpLmluZGV4T2YodmFsdWUpLCB0ZXh0UmFuZ2UuZ2V0T2Zmc2V0KCkpOwotCQlhc3NlcnRFcXVhbHModmFsdWUubGVuZ3RoKCksIHRleHRSYW5nZS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg3LCB0ZXh0UmFuZ2UuZ2V0TGluZU51bWJlcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QVNUTm9kZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmF6IiwgImJvb2xlYW4gZnJlZCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6IGppbW15KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJU3RyaW5nIHZhbHVlID0gImZhbHNlIjsKLQkJU3RyaW5nIGVsZW1lbnQgPSAiZnJlZD0iICsgdmFsdWU7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oQGFubm90LkJhcihqaW1teT1AYW5ub3QuQmF6KCIgKyBlbGVtZW50ICsgIikpKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEzID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgImppbW15IiwgImFubm90LkJheiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihkYWEzLCAiZnJlZCIsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBBU1RUb29scy5idWlsZFRleHRSYW5nZShhZWEuZ2V0QXN0Tm9kZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQkJYXNzZXJ0RXF1YWxzKHZhbHVlLmxlbmd0aCgpLCB0ZXh0UmFuZ2UuZ2V0TGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBU1ROb2RlMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBlbGVtZW50ID0gIlwieHh4XCIiOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKCIgKyBlbGVtZW50ICsgIikiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0KLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IEFTVFRvb2xzLmJ1aWxkVGV4dFJhbmdlKGFlYS5nZXRBc3ROb2RlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5nZXRTb3VyY2UoY3UpLmluZGV4T2YoZWxlbWVudCksIHRleHRSYW5nZS5nZXRPZmZzZXQoKSk7Ci0JCWFzc2VydEVxdWFscyhlbGVtZW50Lmxlbmd0aCgpLCB0ZXh0UmFuZ2UuZ2V0TGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBU1ROb2RlNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28iOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0KLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IEFTVFRvb2xzLmJ1aWxkVGV4dFJhbmdlKGFlYS5nZXRBc3ROb2RlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5nZXRTb3VyY2UoY3UpLmluZGV4T2YoYW5ub3RhdGlvbiksIHRleHRSYW5nZS5nZXRPZmZzZXQoKSk7Ci0JCWFzc2VydEVxdWFscyhhbm5vdGF0aW9uLmxlbmd0aCgpLCB0ZXh0UmFuZ2UuZ2V0TGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhiYXI9XCJ4eHhcIikiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImJhciIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgYmFyKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oYmFyPVwieHh4XCIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0KLQkJYWVhLnNldFZhbHVlKG51bGwpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24sIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJheiIsICJib29sZWFuIGZyZWQoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheiBqaW1teSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oQGFubm90LkJhcihqaW1teT1AYW5ub3QuQmF6KGZyZWQ9ZmFsc2UpKSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAiamltbXkiLCAiYW5ub3QuQmF6Iik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGRhYTMsICJmcmVkIiwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJmcmVkIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTNhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJheiIsICJib29sZWFuIGZyZWQoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheiBqaW1teSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oQGFubm90LkJhcihqaW1teT1AYW5ub3QuQmF6KGZyZWQ9ZmFsc2UpKSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAiamltbXkiLCAiYW5ub3QuQmF6Iik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGRhYTMsICJmcmVkIiwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJmcmVkIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoamltbXk9QEJheikpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZSgieHh4Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oYmFyID0gXCJ4eHhcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiYm9vbGVhbiBmcmVkKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXogamltbXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoamltbXk9QGFubm90LkJheihmcmVkPWZhbHNlKSkpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEzID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgImppbW15IiwgImFubm90LkJheiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihkYWEzLCAiZnJlZCIsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0KLQkJYWVhLnNldFZhbHVlKEJvb2xlYW4uVFJVRSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoamltbXk9QGFubm90LkJheihmcmVkPXRydWUpKSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiYm9vbGVhbiBmcmVkKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXogamltbXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEzID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgImppbW15IiwgImFubm90LkJheiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihkYWEzLCAiZnJlZCIsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0KLQkJYWVhLnNldFZhbHVlKEJvb2xlYW4uVFJVRSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oQEJhcihqaW1teSA9IEBCYXooZnJlZCA9IHRydWUpKSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKGJhcj1cInh4eFwiKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZSgieXl5Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKGJhcj1cInl5eVwiKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWU4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgYmFyKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28iOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUoInh4eCIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKGJhciA9IFwieHh4XCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB2YWx1ZSgpOyBTdHJpbmcgYmFyKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oXCJ6enpcIikiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUoInh4eCIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24sIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyh2YWx1ZSA9IFwienp6XCIsIGJhciA9IFwieHh4XCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgYmFyKCk7IFN0cmluZyBiYXooKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhiYXI9XCJ4eHhcIikiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXoiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUoInl5eSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24sIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyhiYXI9XCJ4eHhcIiwgYmF6ID0gXCJ5eXlcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmF6IiwgImludCBmcmVkKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXpbXSBqaW1teSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oQGFubm90LkJhcihqaW1teT17QGFubm90LkJheihmcmVkPTApLCBAYW5ub3QuQmF6KGZyZWQ9MSksIEBhbm5vdC5CYXooZnJlZD0yKSwgQGFubm90LkJheihmcmVkPTMpfSkpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEzID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJqaW1teSIsIDIsICJhbm5vdC5CYXoiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oZGFhMywgImZyZWQiLCBOdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMiksIGFlYS5nZXRWYWx1ZSgpKTsKLQkJYWVhLnNldFZhbHVlKEludGVnZXIudmFsdWVPZig0OCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoamltbXk9e0Bhbm5vdC5CYXooZnJlZD0wKSwgQGFubm90LkJheihmcmVkPTEpLCBAYW5ub3QuQmF6KGZyZWQ9NDgpLCBAYW5ub3QuQmF6KGZyZWQ9Myl9KSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlMTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAidmFsdWUiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUoInh4eCIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKFwieHh4XCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTEzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhcInp6elwiKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgInZhbHVlIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0KLQkJYWVhLnNldFZhbHVlKCJ4eHgiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oXCJ4eHhcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZVR5cGVMaXRlcmFsMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1qYXZhLmxhbmcuT2JqZWN0LmNsYXNzKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZVR5cGVMaXRlcmFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFlYS5zZXRWYWx1ZSgiamF2YS5sYW5nLk9iamVjdCIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKGJhciA9IGphdmEubGFuZy5PYmplY3QuY2xhc3MpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVUeXBlTGl0ZXJhbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9aW50LmNsYXNzKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnROdWxsKGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlVHlwZUxpdGVyYWw0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcC5FbnRyeSIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlVHlwZUxpdGVyYWwxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWludC5jbGFzcykiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZVR5cGVMaXRlcmFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgUHJpbWl0aXZlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFlYS5zZXRWYWx1ZSgiaW50Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oYmFyID0gaW50LmNsYXNzKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlVHlwZUxpdGVyYWwzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWphdmEubGFuZy5PYmplY3QuY2xhc3MpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgUHJpbWl0aXZlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVUeXBlTGl0ZXJhbDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9dm9pZC5jbGFzcykiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2b2lkIiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlTGl0ZXJhbDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9amF2YS5sYW5nLk9iamVjdC5jbGFzcykiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlTGl0ZXJhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhZWEuc2V0VmFsdWUoImphdmEubGFuZy5PYmplY3QiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhiYXIgPSBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZUxpdGVyYWwzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcC5FbnRyeSIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZUxpdGVyYWwxNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1pbnQuY2xhc3MpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlTGl0ZXJhbDUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhZWEuc2V0VmFsdWUoImludCIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKGJhciA9IGludC5jbGFzcykiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFR5cGVMaXRlcmFsNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj12b2lkLmNsYXNzKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlRW51bTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWVudW1zLlRlc3RFbnVtLlhYWCkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscygiZW51bXMuVGVzdEVudW0uWFhYIiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUVudW0yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW0gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJzdGF0aWMgZW51bXMuVGVzdEVudW0uWFhYIiwgIkBhbm5vdC5Gb28oYmFyPVhYWCkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscygiZW51bXMuVGVzdEVudW0uWFhYIiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUVudW0zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW0gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnROdWxsKGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVFbnVtNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiZW51bXMuVGVzdEVudW0iLCAiQGFubm90LkZvbyhiYXI9VGVzdEVudW0uWFhYKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbnVtcy5UZXN0RW51bS5YWFgiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bSBiYXIoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oYmFyPVhYWCkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgic3RhdGljIGVudW1zLlRlc3RFbnVtLlhYWCIsIGV4cGVjdGVkKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKG51bGwpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJiYXIiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bSBiYXIoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oYmFyID0gWFhYKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFlYS5zZXRWYWx1ZSgiZW51bXMuVGVzdEVudW0uWFhYIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0uWFhYOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUVudW1JbXBvcnRDb2xsaXNpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiZW51bXMxIiwgIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczIiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMxLlRlc3RFbnVtIGJhcjEoKTsgIGVudW1zMi5UZXN0RW51bSBiYXIyKCk7Iik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKGJhcjEgPSBYWFgsIGJhcjIgPSBUZXN0RW51bS5YWFgpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYTEgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjEiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhMSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTEpOwotCQlhZWExLnNldFZhbHVlKCJlbnVtczEuVGVzdEVudW0uWFhYIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhMiA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMiIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMik7Ci0JCWFlYTIuc2V0VmFsdWUoImVudW1zMi5UZXN0RW51bS5YWFgiKTsKLQotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zMS5UZXN0RW51bS5YWFg7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgc3RhdGljIGVudW1zMi5UZXN0RW51bS5YWFg7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgZW51bXMyLlRlc3RFbnVtOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUVudW1JbXBvcnRDb2xsaXNpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiZW51bXMxIiwgIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczIiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMxLlRlc3RFbnVtIGJhcjEoKTsgIGVudW1zMi5UZXN0RW51bSBiYXIyKCk7Iik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKGJhcjE9WFhYLCBiYXIyID0gVGVzdEVudW0uWFhYKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJzdGF0aWMgZW51bXMxLlRlc3RFbnVtLioiLCAiQGFubm90LkZvbyhiYXIxPVhYWCkiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYTEgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjEiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhMSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTEpOwotCQlhc3NlcnROb3ROdWxsKGFlYTEuZ2V0VmFsdWUoKSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhMiA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMiIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMik7Ci0JCWFlYTIuc2V0VmFsdWUoImVudW1zMi5UZXN0RW51bS5YWFgiKTsKLQotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zMS5UZXN0RW51bS4qOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IHN0YXRpYyBlbnVtczIuVGVzdEVudW0uWFhYOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGVudW1zMi5UZXN0RW51bTsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtSW1wb3J0Q29sbGlzaW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtMSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0yIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtMSBiYXIxKCk7ICBlbnVtcy5UZXN0RW51bTIgYmFyMigpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhiYXIxID0gWFhYLCBiYXIyID0gVGVzdEVudW0yLlhYWCkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhMSA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMSIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWExID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMSk7Ci0JCWFlYTEuc2V0VmFsdWUoImVudW1zLlRlc3RFbnVtMS5YWFgiKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEyID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYTIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEyKTsKLQkJYWVhMi5zZXRWYWx1ZSgiZW51bXMuVGVzdEVudW0yLlhYWCIpOwotCi0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0xLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBlbnVtcy5UZXN0RW51bTI7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUltcG9ydENvbGxpc2lvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bTEiLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtMiIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bTEgYmFyMSgpOyAgZW51bXMuVGVzdEVudW0yIGJhcjIoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oYmFyMT1YWFgsIGJhcjIgPSBUZXN0RW51bTIuWFhYKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJzdGF0aWMgZW51bXMuVGVzdEVudW0xLioiLCAiQGFubm90LkZvbyhiYXIxPVhYWCkiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYTEgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjEiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhMSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTEpOwotCQlhc3NlcnROb3ROdWxsKGFlYTEuZ2V0VmFsdWUoKSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhMiA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMiIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMik7Ci0JCWFlYTIuc2V0VmFsdWUoImVudW1zLlRlc3RFbnVtMi5YWFgiKTsKLQotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zLlRlc3RFbnVtMS4qOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGVudW1zLlRlc3RFbnVtMjsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQkvKioKLQkgKiBub3Qgc3VyZSB0aGlzIGlzIGV4YWN0bHkgd2hhdCB3ZSB3YW50Li4uCi0JICogaXQgd291bGQgYmUgbmljZSBpZiB3ZSBqdXN0IHNraXAgdGhlIHN0YXRpYyBpbXBvcnQ7IGJ1dCBpdCdzIGEgbWF0dGVyIG9mIHRhc3RlLi4uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUltcG9ydENvbGxpc2lvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bTEiLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtMiIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bTEgYmFyMSgpOyAgZW51bXMuVGVzdEVudW0yIGJhcjIoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oYmFyMSA9IFhYWCwgYmFyMiA9IFRlc3RFbnVtMi5YWFgpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoImVudW1zLioiLCAiIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWExID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIxIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYTEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWExKTsKLQkJYWVhMS5zZXRWYWx1ZSgiZW51bXMuVGVzdEVudW0xLlhYWCIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYTIgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhMiA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTIpOwotCQlhZWEyLnNldFZhbHVlKCJlbnVtcy5UZXN0RW51bTIuWFhYIik7Ci0KLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGVudW1zLio7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zLlRlc3RFbnVtMS5YWFg7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgZW51bXMuVGVzdEVudW0yOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUVudW1JbXBvcnRDb2xsaXNpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiZW51bXMxIiwgIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczIiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUVudW0oImVudW1zMyIsICJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtczEuVGVzdEVudW0gYmFyMSgpOyAgZW51bXMyLlRlc3RFbnVtIGJhcjIoKTsgIGVudW1zMy5UZXN0RW51bSBiYXIzKCk7Iik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKGJhcjEgPSBYWFgsIGJhcjIgPSBUZXN0RW51bS5YWFgsIGJhcjMgPSBlbnVtczMuVGVzdEVudW0uWFhYKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWExID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIxIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYTEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWExKTsKLQkJYWVhMS5zZXRWYWx1ZSgiZW51bXMxLlRlc3RFbnVtLlhYWCIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYTIgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhMiA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTIpOwotCQlhZWEyLnNldFZhbHVlKCJlbnVtczIuVGVzdEVudW0uWFhYIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhMyA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMyIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEzID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMyk7Ci0JCWFlYTMuc2V0VmFsdWUoImVudW1zMy5UZXN0RW51bS5YWFgiKTsKLQotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zMS5UZXN0RW51bS5YWFg7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgc3RhdGljIGVudW1zMi5UZXN0RW51bS5YWFg7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgZW51bXMyLlRlc3RFbnVtOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IHN0YXRpYyBlbnVtczMiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBlbnVtczMiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVTdHJpbmdBcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nW10gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj17XCJzdHJpbmcwXCIsIFwic3RyaW5nMVwifSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oZGFhLCAiYmFyIiwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7InN0cmluZzAiLCAic3RyaW5nMSJ9LCBhZWEuZ2V0VmFsdWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZVN0cmluZ0FycmF5Q29uY2F0ZW5hdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nW10gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj17XCJzdHJpXCIgKyBcIm5nMFwiLCBcInNcIiArIFwidHJpbmcxXCJ9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsic3RyaW5nMCIsICJzdHJpbmcxIn0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlU3RyaW5nQXJyYXlFbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nW10gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj17fSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oZGFhLCAiYmFyIiwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbMF0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlU3RyaW5nQXJyYXlTaW5nbGVFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPVwic3RyaW5nMFwiKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsic3RyaW5nMCJ9LCBhZWEuZ2V0VmFsdWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZU51bGxTdHJpbmdBcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nW10gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKCkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEluZGV4ZWRDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1swXSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVTdHJpbmdBcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nW10gYmFyKCk7Iik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKGJhciA9IHsgXCJzdHJpbmcwXCIsIFwic3RyaW5nMVwiIH0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgSW5kZXhlZENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFlYS5zZXRWYWx1ZShuZXcgU3RyaW5nW10geyJzdHJpbmcwIiwgInN0cmluZzEifSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVTdHJpbmdBcnJheUVtcHR5UmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28iOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBJbmRleGVkQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbMF0pOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlU3RyaW5nQXJyYXlFbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nW10gYmFyKCk7Iik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKGJhciA9IHt9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUluZGV4ZWRFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gZXhwcmVzc2lvbkNvbnZlcnRlciA9IG5ldyBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyKFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSwgZmFsc2UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBJbmRleGVkQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgZXhwcmVzc2lvbkNvbnZlcnRlcik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhZWEuc2V0VmFsdWUobmV3IFN0cmluZ1swXSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVTdHJpbmdBcnJheVNpbmdsZUVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJARm9vKGJhciA9IFwic3RyaW5nMFwiKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgSW5kZXhlZENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFlYS5zZXRWYWx1ZShuZXcgU3RyaW5nW10geyJzdHJpbmcwIn0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVFbnVtQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bVtdIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9e2VudW1zLlRlc3RFbnVtLlhYWCwgZW51bXMuVGVzdEVudW0uWVlZfSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ImVudW1zLlRlc3RFbnVtLlhYWCIsICJlbnVtcy5UZXN0RW51bS5ZWVkifSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVFbnVtQXJyYXlJbnZhbGlkRW50cnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bVtdIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9e2VudW1zLlRlc3RFbnVtLlhYWCwgODh9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsiZW51bXMuVGVzdEVudW0uWFhYIiwgbnVsbH0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlRW51bUFycmF5RW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bVtdIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9e30pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nWzBdLCBhZWEuZ2V0VmFsdWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUVudW1BcnJheVNpbmdsZUVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bVtdIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9ZW51bXMuVGVzdEVudW0uWFhYKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsiZW51bXMuVGVzdEVudW0uWFhYIn0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlRW51bUFycmF5U2luZ2xlRWxlbWVudEludmFsaWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bVtdIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9XCJcIikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7bnVsbH0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlTnVsbEVudW1BcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKCkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbMF0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW1bXSBiYXIoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oYmFyID0geyBYWFgsIFlZWSB9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7ImVudW1zLlRlc3RFbnVtLlhYWCIsICJlbnVtcy5UZXN0RW51bS5ZWVkifSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0uWFhYOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtcy5UZXN0RW51bS5ZWVk7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUFycmF5RW1wdHlSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bVtdIGJhcigpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbMF0pOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUFycmF5RW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bVtdIGJhcigpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhiYXIgPSB7fSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiLCBmYWxzZSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhZWEuc2V0VmFsdWUobmV3IFN0cmluZ1swXSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXlTaW5nbGVFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW1bXSBiYXIoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oYmFyID0gWFhYKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7ImVudW1zLlRlc3RFbnVtLlhYWCJ9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtcy5UZXN0RW51bS5YWFg7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUFycmF5SW1wb3J0Q29sbGlzaW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oImVudW1zMSIsICJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlRW51bSgiZW51bXMyIiwgIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zMS5UZXN0RW51bVtdIGJhcjEoKTsgIGVudW1zMi5UZXN0RW51bVtdIGJhcjIoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oYmFyMSA9IHsgWFhYLCBZWVkgfSwgYmFyMiA9IHsgVGVzdEVudW0uWFhYLCBUZXN0RW51bS5ZWVkgfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWExID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjEiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWExID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWExKTsKLQkJYWVhMS5zZXRWYWx1ZShuZXcgU3RyaW5nW10geyJlbnVtczEuVGVzdEVudW0uWFhYIiwgImVudW1zMS5UZXN0RW51bS5ZWVkifSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEyID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEyKTsKLQkJYWVhMi5zZXRWYWx1ZShuZXcgU3RyaW5nW10geyJlbnVtczIuVGVzdEVudW0uWFhYIiwgImVudW1zMi5UZXN0RW51bS5ZWVkifSk7Ci0KLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtczEuVGVzdEVudW0uWFhYOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtczEuVGVzdEVudW0uWVlZOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IHN0YXRpYyBlbnVtczIuVGVzdEVudW0uWFhYOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IHN0YXRpYyBlbnVtczIuVGVzdEVudW0uWVlZOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGVudW1zMi5UZXN0RW51bTsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXlJbXBvcnRDb2xsaXNpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiZW51bXMxIiwgIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczIiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMxLlRlc3RFbnVtW10gYmFyMSgpOyAgZW51bXMyLlRlc3RFbnVtW10gYmFyMigpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhiYXIxPXtYWFgsWVlZfSwgYmFyMiA9IHsgVGVzdEVudW0uWFhYLCBUZXN0RW51bS5ZWVkgfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgic3RhdGljIGVudW1zMS5UZXN0RW51bS4qIiwgIkBhbm5vdC5Gb28oYmFyMT17WFhYLFlZWX0pIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYTEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMSIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYTEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTEpOwotCQlhc3NlcnROb3ROdWxsKGFlYTEuZ2V0VmFsdWUoKSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEyID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEyKTsKLQkJYWVhMi5zZXRWYWx1ZShuZXcgU3RyaW5nW10geyJlbnVtczIuVGVzdEVudW0uWFhYIiwgImVudW1zMi5UZXN0RW51bS5ZWVkifSk7Ci0KLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtczEuVGVzdEVudW0uKjsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMyLlRlc3RFbnVtLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMyLlRlc3RFbnVtLllZWTsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBlbnVtczIuVGVzdEVudW07IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUFycmF5SW1wb3J0Q29sbGlzaW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtMSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0yIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtMVtdIGJhcjEoKTsgIGVudW1zLlRlc3RFbnVtMltdIGJhcjIoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oYmFyMSA9IHsgWFhYLCBZWVkgfSwgYmFyMiA9IHsgVGVzdEVudW0yLlhYWCwgVGVzdEVudW0yLllZWSB9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYTEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMSIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYTEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTEpOwotCQlhZWExLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7ImVudW1zLlRlc3RFbnVtMS5YWFgiLCAiZW51bXMuVGVzdEVudW0xLllZWSJ9KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYTIgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMiIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYTIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTIpOwotCQlhZWEyLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7ImVudW1zLlRlc3RFbnVtMi5YWFgiLCAiZW51bXMuVGVzdEVudW0yLllZWSJ9KTsKLQotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zLlRlc3RFbnVtMS5YWFg7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zLlRlc3RFbnVtMS5ZWVk7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgc3RhdGljIGVudW1zLlRlc3RFbnVtMi5YWFg7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgc3RhdGljIGVudW1zLlRlc3RFbnVtMi5ZWVk7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgZW51bXMuVGVzdEVudW0yOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUVudW1BcnJheUltcG9ydENvbGxpc2lvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bTEiLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtMiIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bTFbXSBiYXIxKCk7ICBlbnVtcy5UZXN0RW51bTJbXSBiYXIyKCk7Iik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKGJhcjE9e1hYWCxZWVl9LCBiYXIyID0geyBUZXN0RW51bTIuWFhYLCBUZXN0RW51bTIuWVlZIH0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoInN0YXRpYyBlbnVtcy5UZXN0RW51bTEuKiIsICJAYW5ub3QuRm9vKGJhcjE9e1hYWCxZWVl9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWExID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjEiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWExID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWExKTsKLQkJYXNzZXJ0Tm90TnVsbChhZWExLmdldFZhbHVlKCkpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhMiA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhMiA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMik7Ci0JCWFlYTIuc2V0VmFsdWUobmV3IFN0cmluZ1tdIHsiZW51bXMuVGVzdEVudW0yLlhYWCIsICJlbnVtcy5UZXN0RW51bTIuWVlZIn0pOwotCi0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0xLio7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgc3RhdGljIGVudW1zLlRlc3RFbnVtMi5YWFg7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgc3RhdGljIGVudW1zLlRlc3RFbnVtMi5ZWVk7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgZW51bXMuVGVzdEVudW0yOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUVudW1BcnJheUltcG9ydENvbGxpc2lvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczEiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUVudW0oImVudW1zMiIsICJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlRW51bSgiZW51bXMzIiwgIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zMS5UZXN0RW51bVtdIGJhcjEoKTsgIGVudW1zMi5UZXN0RW51bVtdIGJhcjIoKTsgIGVudW1zMy5UZXN0RW51bVtdIGJhcjMoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oYmFyMSA9IHsgWFhYLCBZWVkgfSwgYmFyMiA9IHsgVGVzdEVudW0uWFhYLCBUZXN0RW51bS5ZWVkgfSwgYmFyMyA9IHsgZW51bXMzLlRlc3RFbnVtLlhYWCwgZW51bXMzLlRlc3RFbnVtLllZWSB9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYTEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMSIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYTEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTEpOwotCQlhZWExLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7ImVudW1zMS5UZXN0RW51bS5YWFgiLCAiZW51bXMxLlRlc3RFbnVtLllZWSJ9KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYTIgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMiIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYTIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTIpOwotCQlhZWEyLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7ImVudW1zMi5UZXN0RW51bS5YWFgiLCAiZW51bXMyLlRlc3RFbnVtLllZWSJ9KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYTMgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMyIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYTMgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTMpOwotCQlhZWEzLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7ImVudW1zMy5UZXN0RW51bS5YWFgiLCAiZW51bXMzLlRlc3RFbnVtLllZWSJ9KTsKLQotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zMS5UZXN0RW51bS5YWFg7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zMS5UZXN0RW51bS5ZWVk7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgc3RhdGljIGVudW1zMiIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGVudW1zMi5UZXN0RW51bTsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMzIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgZW51bXMzIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTWlzY1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTWlzY1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZWY1M2EuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L01pc2NUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNaXNjVGVzdHMgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewotCi0JcHVibGljIE1pc2NUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIFNpZ25hdHVyZS50b1N0cmluZyguLi4pIHJldHVybnMgYSBkb3QtcXVhbGlmaWVkIG5hbWUgZm9yIG1lbWJlciB0eXBlcwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTaWduYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSVR5cGUgaGFzaFRhYmxlVHlwZSA9IHRoaXMuZ2V0SmF2YVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKCJqYXZhLnV0aWwuSGFzaHRhYmxlIik7Ci0JCUlGaWVsZCB0YWJsZUZpZWxkID0gaGFzaFRhYmxlVHlwZS5nZXRGaWVsZCgidGFibGUiKTsKLQkJU3RyaW5nIHRhYmxlRmllbGRUeXBlU2lnbmF0dXJlID0gdGFibGVGaWVsZC5nZXRUeXBlU2lnbmF0dXJlKCk7Ci0JCVN0cmluZyB0YWJsZUZpZWxkVHlwZU5hbWUgPSBTaWduYXR1cmUudG9TdHJpbmcodGFibGVGaWVsZFR5cGVTaWduYXR1cmUpOwotCQlhc3NlcnRFcXVhbHModGFibGVGaWVsZFR5cGVOYW1lLCAiamF2YS51dGlsLkhhc2h0YWJsZS5FbnRyeVtdIik7Ci0JfQotCi0JLyoKLQkgKiBJVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSByZXR1cm5zIGEgZG9sbGFyLXF1YWxpZmllZCBuYW1lIGZvciBtZW1iZXIgdHlwZXMKLQkgKiAoYnV0IHRoZSBsb29rdXAgb24gSUphdmFQcm9qZWN0IHRha2VzIGEgZG90LXF1YWxpZmllZCBuYW1lISkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SVR5cGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlUeXBlIGhhc2hUYWJsZUVudHJ5VHlwZSA9IHRoaXMuZ2V0SmF2YVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKCJqYXZhLnV0aWwuSGFzaHRhYmxlLkVudHJ5Iik7Ci0JCWFzc2VydEVxdWFscyhoYXNoVGFibGVFbnRyeVR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksICJqYXZhLnV0aWwuSGFzaHRhYmxlJEVudHJ5Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElUeXBlUGFyYW1ldGVyaXplZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSVR5cGUgbWFwVHlwZSA9IHRoaXMuZ2V0SmF2YVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKCJqYXZhLnV0aWwuTWFwIik7Ci0JCWFzc2VydEVxdWFscyhtYXBUeXBlLmdldEZ1bGx5UXVhbGlmaWVkUGFyYW1ldGVyaXplZE5hbWUoKSwgImphdmEudXRpbC5NYXA8SyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QsIFYgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PiIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L05lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L05lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTJlMmQ4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9OZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzIGV4dGVuZHMgQW5ub3RhdGlvblRlc3RDYXNlIHsKLQotCXB1YmxpYyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGFubm90YXRpb25Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImFubm90IiwgYW5ub3RhdGlvbk5hbWUgKyAiLmphdmEiLCAicHVibGljIEBpbnRlcmZhY2UgIiArIGFubm90YXRpb25OYW1lICsgIiB7ICIgKyBhbm5vdGF0aW9uQm9keSArICIgfSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uPUBhbm5vdC5CYXIpIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImFubm90LkJhciIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJheiIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheiB5YW5hKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uPUBhbm5vdC5CYXIoeWFuYT1AYW5ub3QuQmF6KSkiKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAieWFuYSIsICJhbm5vdC5CYXoiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTMpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuQmF6IiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGwxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKCkiKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb25OdWxsMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGwzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb249XCJhbm5vdC5CYXJcIikiKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb25OdWxsNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhcjIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbj1AYW5ub3QuQmFyMikiKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb249QGFubm90LkJhcikiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm5lc3RlZEFubm90YXRpb24iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xYSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uPUBhbm5vdC5CYXIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJGb28iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb249XCJhbm5vdC5CYXJcIikiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyMiIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcjIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uPUBhbm5vdC5CYXIyKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmF6IiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6IG5lc3RlZEFubm90YXRpb24yKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbjEoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbjE9QGFubm90LkJhcihuZXN0ZWRBbm5vdGF0aW9uMj1AYW5ub3QuQmF6KSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYUZvbyA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWFCYXIgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWFGb28sICJuZXN0ZWRBbm5vdGF0aW9uMSIsICJhbm5vdC5CYXIiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWFCYXIsICJuZXN0ZWRBbm5vdGF0aW9uMiIsICJhbm5vdC5CYXoiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQmF6IiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uNWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmF6IiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6IG5lc3RlZEFubm90YXRpb24yKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbjEoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbjE9QGFubm90LkJhcihuZXN0ZWRBbm5vdGF0aW9uMj1AYW5ub3QuQmF6KSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYUZvbyA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWFCYXIgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWFGb28sICJuZXN0ZWRBbm5vdGF0aW9uMSIsICJhbm5vdC5CYXIiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWFCYXIsICJuZXN0ZWRBbm5vdGF0aW9uMiIsICJhbm5vdC5CYXoiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uMT1AQmFyKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28obmVzdGVkQW5ub3RhdGlvbiA9IEBCYXIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKEBCYXIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsgU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKHZhbHVlID0gXCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbiA9IEBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0IHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB4eHgoKTsgYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgeHh4KCk7IGFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIsIHZhbHVlID0gQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIiwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjEoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcihcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIiwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJc3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShzdHJpbmdMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKEBCYXIoXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSIsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKHN0cmluZ0xpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcihcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjMoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24zKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJc3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShzdHJpbmdMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKEBCYXIoXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb240KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKHN0cmluZ0xpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyBTdHJpbmcgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28odmFsdWUgPSBcInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcihcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjUoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb241KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJc3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShzdHJpbmdMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0IHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIoXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb242KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKHN0cmluZ0xpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyBTdHJpbmcgeHh4KCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbiA9IEBCYXIoXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb243KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCXN0cmluZ0xpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUoc3RyaW5nTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb244KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyBTdHJpbmcgeHh4KCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIiwgdmFsdWUgPSBAQmFyKFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uOChkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjgoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJc3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShzdHJpbmdMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB5eXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24xKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28obmVzdGVkQW5ub3RhdGlvbiA9IEBCYXIoeXl5ID0gXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSIsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInl5eSIsICJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgeXl5KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIiwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjIoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhAQmFyKHl5eSA9IFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieXl5IiwgInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB5eXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKG5lc3RlZEFubm90YXRpb24gPSBAQmFyKHl5eSA9IFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMyhkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjMoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ5eXkiLCAidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHl5eSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKEBCYXIoeXl5ID0gXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb240KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ5eXkiLCAidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHl5eSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsgU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKHZhbHVlID0gXCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbiA9IEBCYXIoeXl5ID0gXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb241KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInl5eSIsICJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgeXl5KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3QgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQEJhcih5eXkgPSBcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjYoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb242KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInl5eSIsICJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgeXl5KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgeHh4KCk7IGFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbiA9IEBCYXIoeXl5ID0gXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb243KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInl5eSIsICJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb244KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgeXl5KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgeHh4KCk7IGFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIsIHZhbHVlID0gQEJhcih5eXkgPSBcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjgoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb244KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInl5eSIsICJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L05lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0ZjBmOS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTnVtYmVyTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cyBleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKGFubm90YXRpb25OYW1lLCAiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGFubm90YXRpb25Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImFubm90IiwgYW5ub3RhdGlvbk5hbWUgKyAiLmphdmEiLCAicHVibGljIEBpbnRlcmZhY2UgIiArIGFubm90YXRpb25OYW1lICsgIiB7ICIgKyBhbm5vdGF0aW9uQm9keSArICIgfSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhciwgQGFubm90LkJhcihcInR3b1wiKX0pIik7Ci0JCS8vIDAKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KGN1KTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbm5vdC5CYXIiLCBhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNNYXJrZXJBbm5vdGF0aW9uKCkpOwotCi0JCS8vIDEKLQkJZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMSwgImFubm90LkJhciIpOwotCQlhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oYXN0Um9vdCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuQmFyIiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJCYXoiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheltdIHlhbmEoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5CYXIoeWFuYT1AYW5ub3QuQmF6KSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgInlhbmEiLCAwLCAiYW5ub3QuQmF6Iik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEzKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImFubm90LkJheiIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiQmF6Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXpbXSB5YW5hKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKHlhbmE9e0Bhbm5vdC5CYXp9KSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgInlhbmEiLCAwLCAiYW5ub3QuQmF6Iik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEzKTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSB0aGlzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oYXN0Um9vdCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuQmF6IiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKTsKLQotCQkvLyBuYW1lIG1pc21hdGNoCi0JCWRhYTMgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgInlhbmEiLCAwLCAiYW5ub3QuWHl6Iik7Ci0JCWFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEzKTsKLQkJYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oYXN0Um9vdCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb25OdWxsMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkJhciIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiQmFyIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGwzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiQmFyIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1cImFubm90LkJhclwiKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGw0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiTm90QmFyIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiQmFyIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuTm90QmFyKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGw1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyLCBAYW5ub3QuQmFyKFwidHdvXCIpfSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb25OdWxsNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIlh5eiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkJheiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6W10geWFuYSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90LkJhcih5YW5hPXtAYW5ub3QuQmF6fSkpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJGb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEzID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJ5YW5hIiwgMCwgImFubm90Llh5eiIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMyk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIoMCksIEBhbm5vdC5CYXIoMSl9KSI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtudWxsLCBAYW5ub3QuQmFyKDEpfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17XCJhbm5vdC5CYXIxXCIsIFwiYW5ub3QuQmFyMlwiLCBcImFubm90LkJhcjNcIn0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuTm90QmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5Ob3RCYXIoMCksIEBhbm5vdC5Ob3RCYXIoMSl9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigibmVzdGVkQW5ub3RhdGlvbnMiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb241YSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWExID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWExKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEyKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEyLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRUcnVlKGFhMS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSkuaXNNYXJrZXJBbm5vdGF0aW9uKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBhbm5vdC5Gb287IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1cImFubm90LkJhclwiKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJOb3RCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90Lk5vdEJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5Ob3RCYXIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb244KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyKDApLCBAYW5ub3QuQmFyKDEpLCBAYW5ub3QuQmFyKDIpLCBAYW5ub3QuQmFyKDMpfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRUcnVlKGFhMS5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpLmlzTm9ybWFsQW5ub3RhdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIsIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZShhYTEuZ2V0QW5ub3RhdGlvbihhc3RSb290KSwgIm5lc3RlZEFubm90YXRpb25zIikuZ2V0Tm9kZVR5cGUoKSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhcigwKSwgQGFubm90LkJhcigxKSwgbnVsbCwgQGFubm90LkJhcigzKX0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uOSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigwKSwgQGFubm90LkJhcigxKSwgQGFubm90LkJhcigyKSwgQGFubm90LkJhcigzKX0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTEpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgMiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KGN1KTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEyLmdldEFubm90YXRpb24oYXN0Um9vdCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEyLnJlbW92ZUFubm90YXRpb24oKTsKLQkJYXNzZXJ0VHJ1ZShhYTEuZ2V0QW5ub3RhdGlvbihhc3RSb290KS5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSLCB0aGlzLmFubm90YXRpb25FbGVtZW50VmFsdWUoYWExLmdldEFubm90YXRpb24oYXN0Um9vdCksICJ2YWx1ZSIpLmdldE5vZGVUeXBlKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMCksIEBhbm5vdC5CYXIoMSksIG51bGwsIEBhbm5vdC5CYXIoMyl9KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDApLCBAYW5ub3QuQmFyKDEpfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7bnVsbCwgQGFubm90LkJhcigxKX0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhMi5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEyLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigwKSwgQGFubm90LkJhcigxKX0pIjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQGFubm90LkJhcigwKSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWExID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWExKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsIDEsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEyKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEyLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5TSU5HTEVfTUVNQkVSX0FOTk9UQVRJT04sIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZShhYTEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpLCAidmFsdWUiKS5nZXROb2RlVHlwZSgpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigwKSwgbnVsbCwgQGFubm90LkJhcigyKX0pIjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQGFubm90LkJhcigwKSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWExID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWExKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsIDIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEyKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEyLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5TSU5HTEVfTUVNQkVSX0FOTk9UQVRJT04sIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZShhYTEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpLCAidmFsdWUiKS5nZXROb2RlVHlwZSgpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyh7bnVsbCwgQGFubm90LkJhcigxKX0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgMSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkJhciIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjE0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDApLCBudWxsLCBAYW5ub3QuQmFyKDIpLCBudWxsfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKDApKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTEpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgMiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyhBU1ROb2RlLlNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSksICJ2YWx1ZSIpLmdldE5vZGVUeXBlKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjE1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDApLCBudWxsLCBAYW5ub3QuQmFyKDIpLCBAYW5ub3QuQmFyKDMpfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigwKSwgbnVsbCwgbnVsbCwgQGFubm90LkJhcigzKX0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpLCAidmFsdWUiKS5nZXROb2RlVHlwZSgpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigwKSwgbnVsbCwgQGFubm90LkJhcigyKSwgQGFubm90LkJhcigzKX0pIjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMCksIG51bGwsIEBhbm5vdC5CYXIoMil9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTEpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgMywgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KGN1KTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEyLmdldEFubm90YXRpb24oYXN0Um9vdCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEyLnJlbW92ZUFubm90YXRpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIsIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZShhYTEuZ2V0QW5ub3RhdGlvbihhc3RSb290KSwgInZhbHVlIikuZ2V0Tm9kZVR5cGUoKSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIoMCksIG51bGwsIEBhbm5vdC5CYXIoMil9KSI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5CYXIoMCkpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhMi5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEyLnJlbW92ZUFubm90YXRpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKEFTVE5vZGUuU0lOR0xFX01FTUJFUl9BTk5PVEFUSU9OLCB0aGlzLmFubm90YXRpb25FbGVtZW50VmFsdWUoYWExLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKSwgIm5lc3RlZEFubm90YXRpb25zIikuZ2V0Tm9kZVR5cGUoKSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e251bGwsIEBhbm5vdC5CYXIoMSl9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDEsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEyKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEyLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJuZXN0ZWRBbm5vdGF0aW9ucyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjE5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyKDApLCBudWxsLCBAYW5ub3QuQmFyKDIpLCBudWxsfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKDApKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTEpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyhBU1ROb2RlLlNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSksICJuZXN0ZWRBbm5vdGF0aW9ucyIpLmdldE5vZGVUeXBlKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyKDApLCBudWxsLCBAYW5ub3QuQmFyKDIpLCBAYW5ub3QuQmFyKDMpfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhcigwKSwgbnVsbCwgbnVsbCwgQGFubm90LkJhcigzKX0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpLCAibmVzdGVkQW5ub3RhdGlvbnMiKS5nZXROb2RlVHlwZSgpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24yMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhcigwKSwgbnVsbCwgQGFubm90LkJhcigyKSwgQGFubm90LkJhcigzKX0pIjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIoMCksIG51bGwsIEBhbm5vdC5CYXIoMil9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTEpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMywgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KGN1KTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEyLmdldEFubm90YXRpb24oYXN0Um9vdCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEyLnJlbW92ZUFubm90YXRpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIsIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZShhYTEuZ2V0QW5ub3RhdGlvbihhc3RSb290KSwgIm5lc3RlZEFubm90YXRpb25zIikuZ2V0Tm9kZVR5cGUoKSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKG5lc3RlZEFubm90YXRpb25zID0gQEJhcikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oQEJhcikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKG5lc3RlZEFubm90YXRpb25zID0gQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKEBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgdmFsdWUoKTsgYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28odmFsdWUgPSBcInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9ucyA9IEBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHh4eCgpOyBhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zID0gQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb244KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB4eHgoKTsgYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiLCB2YWx1ZSA9IEBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uOSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYXNzZXJ0TnVsbChhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucyA9IHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgQEJhciB9KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB2YWx1ZSgpOyBhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBGb28odmFsdWUgPSBcInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9ucyA9IHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIm51bGwsIEBCYXIgfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe1wib25lXCIsIFwidHdvXCJ9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QEJhciwgXCJ0d29cIn0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe1wib25lXCIsIFwidHdvXCJ9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJCYXJ9KSIsIGN1KTsgIC8vIHNwbGl0IGxpbmUKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjEzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKDcpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oNykiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQmFyIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyh7NyxudWxsLG51bGwsbnVsbCxudWxsLEBCYXJ9KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjE1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oQGFubm90Lk5vdEJhcikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24xNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuQmFyKDU1KSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoNTUpLEBCYXJ9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDEsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjE3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtcInNvbWV0aGluZ1wifSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0BCYXJ9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjE4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtcInNvbWV0aGluZ1wifSkiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQmFyIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQmFyfSkiLCBjdSk7ICAvLyBzcGxpdCBsaW5lCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24xOSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90Lk5vdEJhcikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJOb3RCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5Ob3RCYXIpIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuTm90QmFyLG51bGwsbnVsbCxudWxsLG51bGwsQEJhcn0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90LkJhcig4OCkpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKDg4KSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIoODgpLG51bGwsQEJhcn0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuQmFyKDg4KSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoODgpLG51bGwsQEJhcn0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhcig4OCksIEBhbm5vdC5CYXIoNzcpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyKDg4KSwgQGFubm90LkJhcig3NyksIG51bGwsIG51bGwsIjsgIC8vIHRoZSBsaW5lIGdldHMgc3BsaXQKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJAQmFyfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgNCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoODgpLCBAYW5ub3QuQmFyKDc3KX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZDEgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcig4OCksIEBhbm5vdC5CYXIoNzcpLCBudWxsLCBudWxsLCI7ICAvLyB0aGUgbGluZSBnZXRzIHNwbGl0Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQEJhcn0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZDEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZDIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDQsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEZvbyIsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKG5lc3RlZEFubm90YXRpb25zID0gQEJhcig4OCkpIiwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJARm9vIiwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oQEJhcig4OCkpIiwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucyA9IEBCYXIoODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMyhkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjMoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTnVtYmVyTGl0ZXJhbCBudW1iZXJMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCW51bWJlckxpdGVyYWwuc2V0VG9rZW4oIjg4Iik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUobnVtYmVyTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKEBCYXIoODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNChkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTnVtYmVyTGl0ZXJhbCBudW1iZXJMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCW51bWJlckxpdGVyYWwuc2V0VG9rZW4oIjg4Iik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUobnVtYmVyTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb241KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB2YWx1ZSgpOyBhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyh2YWx1ZSA9IFwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zID0gQEJhcig4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb241KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQEJhcig4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb242KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHh4eCgpOyBhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zID0gQEJhcig4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb243KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHh4eCgpOyBhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIsIHZhbHVlID0gQEJhcig4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb244KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uOChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28obmVzdGVkQW5ub3RhdGlvbnMgPSB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIEBCYXIoTUlTU0lORykgfSkiLCBjdSk7ICAvLyA/Pz8KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB2YWx1ZSgpOyBhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBGb28odmFsdWUgPSBcInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9ucyA9IHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIm51bGwsIEBCYXIoTUlTU0lORykgfSkiOyAgLy8gPz8/Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe1wib25lXCIsIFwidHdvXCJ9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QEJhcig4OCksIFwidHdvXCJ9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTEoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xMShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtcIm9uZVwiLCBcInR3b1wifSkiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBCYXIoTUlTU0lORyl9KSIsIGN1KTsgIC8vIHNwbGl0IGxpbmUKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjEzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKDcpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIoODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTMoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xMyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKDcpIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKHs3LG51bGwsbnVsbCxudWxsLG51bGwsQEJhcihNSVNTSU5HKX0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTm90QmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuTm90QmFyKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE1KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTnVtYmVyTGl0ZXJhbCBudW1iZXJMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCW51bWJlckxpdGVyYWwuc2V0VG9rZW4oIjg4Iik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUobnVtYmVyTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuQmFyKDU1KSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoNTUpLEBCYXIoODgpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE2KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTYoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDEsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTnVtYmVyTGl0ZXJhbCBudW1iZXJMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCW51bWJlckxpdGVyYWwuc2V0VG9rZW4oIjg4Iik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUobnVtYmVyTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17XCJzb21ldGhpbmdcIn0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAQmFyKDg4KX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xNyhkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE3KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e1wic29tZXRoaW5nXCJ9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEJhcihNSVNTSU5HKX0pIiwgY3UpOyAgLy8gPz8/Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xOSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE5KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTkoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTnVtYmVyTGl0ZXJhbCBudW1iZXJMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCW51bWJlckxpdGVyYWwuc2V0VG9rZW4oIjg4Iik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUobnVtYmVyTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yMCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJOb3RCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5Ob3RCYXIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBCYXIoODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMjAoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yMChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90Lk5vdEJhcikiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5Ob3RCYXIsbnVsbCxudWxsLG51bGwsbnVsbCxAQmFyKE1JU1NJTkcpfSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKDc3KSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QEJhcig4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yMihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTnVtYmVyTGl0ZXJhbCBudW1iZXJMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCW51bWJlckxpdGVyYWwuc2V0VG9rZW4oIjg4Iik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUobnVtYmVyTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBGb28iLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjEoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucyA9IEBCYXIoeHh4ID0gODgpKSIsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEZvbyIsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKEBCYXIoeHh4ID0gODgpKSIsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28obmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKHh4eCA9IDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjMoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24zKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhAQmFyKHh4eCA9IDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjQoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb240KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb241KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyBTdHJpbmcgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28odmFsdWUgPSBcInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9ucyA9IEBCYXIoeHh4ID0gODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIoeHh4ID0gODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjYoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7IFN0cmluZyB4eHgoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9ucyA9IEBCYXIoeHh4ID0gODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNyhkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjcoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7IFN0cmluZyB4eHgoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiLCB2YWx1ZSA9IEBCYXIoeHh4ID0gODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uOChkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjgoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7IFN0cmluZyB4eHgoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28obmVzdGVkQW5ub3RhdGlvbnMgPSB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIEBCYXIoKSB9KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyBTdHJpbmcgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJARm9vKHZhbHVlID0gXCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbnMgPSB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIjsKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJudWxsLCBAQmFyKCkgfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld05vcm1hbEFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7IFwib25lXCIsIFwidHdvXCIgfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeyBAQmFyKHh4eCA9IDg4KSwgXCJ0d29cIiB9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMTEoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24xMShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtcIm9uZVwiLCBcInR3b1wifSkiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBCYXIoKX0pIiwgY3UpOyAgLy8gc3BsaXQgbGluZQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKDcpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIoeHh4ID0gODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMTMoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24xMyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKDcpIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3Tm9ybWFsQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKHs3LG51bGwsbnVsbCxudWxsLG51bGwsQEJhcigpfSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJOb3RCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oQGFubm90Lk5vdEJhcikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQEJhcih4eHggPSA4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24xNShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjE1KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oQGFubm90LkJhcig1NSkpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDU1KSxAQmFyKHh4eD04OCl9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMTYoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24xNihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMSwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMTcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zID0geyBcInNvbWV0aGluZ1wiIH0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zID0geyBAQmFyKHh4eCA9IDg4KSB9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMTcoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24xNyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtcInNvbWV0aGluZ1wifSkiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBCYXIoKX0pIiwgY3UpOyAgLy8gc3BsaXQgbGluZQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMTkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zID0gXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKHh4eCA9IDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjE5KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMTkoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucyA9IEBhbm5vdC5Ob3RCYXIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zID0gQEJhcih4eHggPSA4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24yMChkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjIwKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24yMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJOb3RCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90Lk5vdEJhcikiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5Ob3RCYXIsbnVsbCxudWxsLG51bGwsbnVsbCxAQmFyKCl9KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucyA9IEBhbm5vdC5CYXIoNzcpKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucyA9IEBCYXIoeHh4ID0gODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMjIoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24yMihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuQmFyKDAwKSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe251bGwsQGFubm90LkJhcigwMCl9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7bnVsbCwgQGFubm90LkJhcigxMSl9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKDExKSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDEsICJhbm5vdC5CYXIiKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMDApLCBAYW5ub3QuQmFyKDExKSwgQGFubm90LkJhcigyMiksIEBhbm5vdC5CYXIoMzMpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMzMpLCBAYW5ub3QuQmFyKDExKSwgQGFubm90LkJhcigyMil9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMywgImFubm90LkJhciIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7QGFubm90LkJhcigwMCksIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKSwgQGFubm90LkJhcigzMyksIEBhbm5vdC5CYXIoNDQpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMzMpLCBAYW5ub3QuQmFyKDExKSwgQGFubm90LkJhcigyMiksIG51bGwsIEBhbm5vdC5CYXIoNDQpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDMsICJhbm5vdC5CYXIiKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMDApLCBAYW5ub3QuQmFyKDExKSwgQGFubm90LkJhcigyMil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigwMCksIEBhbm5vdC5CYXIoMTEpLCBudWxsLCBAYW5ub3QuQmFyKDIyKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMyk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgQGFubm90LkJhcigxMSksIEBhbm5vdC5CYXIoMjIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe251bGwsIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKSwgQGFubm90LkJhcigwMCl9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDMpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7QGFubm90LkJhcigwMCksIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtudWxsLCBAYW5ub3QuQmFyKDExKSwgQGFubm90LkJhcigyMil9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMywgImFubm90LkJhciIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7QGFubm90LkJhcigwMCksIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKSwgbnVsbCwgQGFubm90LkJhcig0NCl9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7bnVsbCwgQGFubm90LkJhcigxMSksIEBhbm5vdC5CYXIoMjIpLCBudWxsLCBAYW5ub3QuQmFyKDQ0KX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAzLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb245KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtudWxsLCBAYW5ub3QuQmFyKDExKSwgQGFubm90LkJhcigyMil9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGV4cGVjdGVkKTsgIC8vIHRoZSBzb3VyY2Ugc2hvdWxkIGJlIHVuY2hhbmdlZAotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMyk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xMCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7QGFubm90LkJhcigwMCksIEBhbm5vdC5CYXIoMTEpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQGFubm90LkJhcigwMCkpIjsKLQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMiwgImFubm90LkJhciIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWlhYS5tb3ZlQW5ub3RhdGlvbigxKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoMDApKSIpOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAxLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkJhciIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7QGFubm90LkJhcigwMCksIG51bGwsIEBhbm5vdC5CYXIoMjIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQGFubm90LkJhcigyMikpIjsKLQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMiwgImFubm90LkJhciIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uMTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMDApLCBAYW5ub3QuQmFyKDExKSwgbnVsbCwgQGFubm90LkJhcigzMyl9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigzMyksIEBhbm5vdC5CYXIoMTEpfSkiOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAzLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM4NmI5My4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bWJlckxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzIGV4dGVuZHMgQW5ub3RhdGlvblRlc3RDYXNlIHsKLQotCXB1YmxpYyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJhbm5vdCIsIGFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQW5ub3RhdGlvbihTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KHBhY2thZ2VOYW1lLCBhbm5vdGF0aW9uTmFtZSArICIuamF2YSIsICJwdWJsaWMgQGludGVyZmFjZSAiICsgYW5ub3RhdGlvbk5hbWUgKyAiIHt9Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9vIik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImFubm90LkZvbyIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9vIik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKDEpIEBhbm5vdC5Gb28oMikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuRm9vIiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKTsKLQkJRXhwcmVzc2lvbiB2YWx1ZSA9ICgoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgYW5ub3RhdGlvbikuZ2V0VmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKEFTVE5vZGUuTlVNQkVSX0xJVEVSQUwsIHZhbHVlLmdldE5vZGVUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIjEiLCAoKE51bWJlckxpdGVyYWwpIHZhbHVlKS5nZXRUb2tlbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoImFubm90LkZvbyIsICJARm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb25OdWxsMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9vIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9wIik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9wIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9wIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uTnVsbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJLy8gdW4tcXVhbGlmaWVkIG5hbWUKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9vIik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28iLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQGFubm90LkZvbyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oMSkgQGFubm90LkZvbygyKSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKDEpIEBhbm5vdC5Gb28oMikiLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQGFubm90LkZvbygxKSIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbygyKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IGFubm90LkZvbzsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBGb28iLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGFubm90LkZvbzsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9vIik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKDg4KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBhbm5vdC5Gb287IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAYW5ub3QuRm9vKDg4KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJARm9vIiwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgYW5ub3QuRm9vOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikiLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJc3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShzdHJpbmdMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJARm9vIiwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgYW5ub3QuRm9vOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhiYXIgPSBcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikiLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlNZW1iZXJWYWx1ZVBhaXIgbXZwID0gdGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbi5nZXRBU1QoKSwgImJhciIsICJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JCXRoaXMudmFsdWVzKGFubm90YXRpb24pLmFkZChtdnApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRDb2xsaXNpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiYW5ub3QxIiwgIkZvbyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oImFubm90MiIsICJGb28iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEZvbyIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90MS5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90Mi5Gb28iKTsKLQotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24xID0gYWExLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uMSk7Ci0KLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEyKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uMiA9IGFhMi5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbjIpOwotCi0JCWFhMS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBhbm5vdDEuRm9vOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyIsIGN1KTsKLQotCQlhYTIubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgYW5ub3QyLkZvbzsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdDIuRm9vIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRDb2xsaXNpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiYW5ub3QxIiwgIkZvbyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oImFubm90MiIsICJGb28iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoImFubm90MS4qIiwgIkBGb28iKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGFubm90MS4qOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90MS5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90Mi5Gb28iKTsKLQotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24xID0gYWExLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uMSk7Ci0KLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEyKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uMiA9IGFhMi5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbjIpOwotCi0JCWFhMi5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBhbm5vdDIuRm9vOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90Mi5Gb28iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEltcG9ydFdpbGRDYXJkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9vIik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJhbm5vdC4qIiwgIiIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgYW5ub3QuKjsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBGb28iLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24xID0gYWExLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uMSk7Ci0KLQkJYWExLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IGFubm90LkZvbzsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28iLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvVHlwZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvVHlwZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZDgwYTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L1R5cGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUeXBlVGVzdHMgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewotCi0JcHVibGljIFR5cGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCX0KLQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChTdHJpbmcgc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIEZJTEVfTkFNRSwgc291cmNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3QxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgamR0Q29tcGlsYXRpb25Vbml0ID0gdGhpcy5jcmVhdGVDb21waWxhdGlvblVuaXQodGhpcy5idWlsZFRlc3QxU291cmNlKCkpOwotCQlhc3NlcnROb3ROdWxsKGpkdENvbXBpbGF0aW9uVW5pdCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUZXN0MVNvdXJjZSgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZChUWVBFX05BTUUpLmFwcGVuZCgiIHsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgaW50IGdldElkKCkgeyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgICAgICByZXR1cm4gdGhpcy5pZDsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3Rlc3QueG1sIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAzNDY4NS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvLmNsYXNzcGF0aCBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZGQxNTEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy8uY3ZzaWdub3JlIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy8ucHJvamVjdCBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTA2MzNlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYTFjZDEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDY6NDQgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGNjZmUzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNi4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZTtidW5kbGUtdmVyc2lvbj0iWzMuNy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5mb3JtcztidW5kbGUtdmVyc2lvbj0iWzMuNS4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IlszLjcuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSJbNC4wLjAsNS4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLmpmYWNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy5pbnRlcm5hbC5zd3Q7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWxpdHkuc3d0O3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGNlNjc2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I4MTk5Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIENvbW1vbiBVSSBUZXN0cwotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9KcHRDb21tb25VaVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9KcHRDb21tb25VaVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiM2I3MmYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvSnB0Q29tbW9uVWlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwuc3d0LkpwdFVpU1dUVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy5pbnRlcm5hbC51dGlsLkpwdFVpVXRpbFRlc3RzOwotCi0vKioKLSAqIFJ1bnMgYWxsIEpQVCBVSSBUZXN0cwotICovCi1wdWJsaWMgY2xhc3MgSnB0Q29tbW9uVWlUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0Q29tbW9uVWlUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVaVNXVFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFVpVXRpbFRlc3RzLnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRDb21tb25VaVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdMYWJlbFByb3ZpZGVyVWlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9qZmFjZS9EZWxlZ2F0aW5nTGFiZWxQcm92aWRlclVpVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDg5MWYzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdMYWJlbFByb3ZpZGVyVWlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdEl0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5JdGVtVHJlZVN0YXRlUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuU3RhdGljSXRlbVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbUV4dGVuZGVkTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1UcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbVRyZWVDb250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuVHJlZVN0YXRlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUGFsZXR0ZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotcHVibGljIGNsYXNzIERlbGVnYXRpbmdMYWJlbFByb3ZpZGVyVWlUZXN0IGV4dGVuZHMgQXBwbGljYXRpb25XaW5kb3cKLXsKLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZTsKLQkKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VmVoaWNsZT4gc2VsZWN0ZWRWZWhpY2xlOwotCQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBEZWxlZ2F0aW5nTGFiZWxQcm92aWRlclVpVGVzdChhcmdzKTsKLQkJd2luZG93LnNldEJsb2NrT25PcGVuKHRydWUpOwotCQl3aW5kb3cub3BlbigpOwotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5kaXNwb3NlKCk7Ci0JCVN5c3RlbS5leGl0KDApOwotCX0KLQkKLQkKLQlwcml2YXRlIERlbGVnYXRpbmdMYWJlbFByb3ZpZGVyVWlUZXN0KFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMuc2VsZWN0ZWRWZWhpY2xlID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxWZWhpY2xlPigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCSgoU2hlbGwpIHBhcmVudCkuc2V0VGV4dCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJcGFyZW50LnNldFNpemUoNDAwLCA0MDApOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlDb21wb3NpdGUgbWFpblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbWFpblBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlidWlsZFRyZWVQYW5lbChtYWluUGFuZWwpOwotCQlidWlsZENvbnRyb2xQYW5lbChtYWluUGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRUcmVlUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HLCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQlsYWJlbC5zZXRUZXh0KCJNeSBWZWhpY2xlcyIpOwotCQkKLQkJdHJlZSA9IG5ldyBUcmVlVmlld2VyKHBhbmVsLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCXRyZWUuZ2V0VHJlZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIHRydWUpKTsKLQkJVHJlZVN0YXRlUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIgPSAKLQkJCW5ldyBJdGVtVHJlZVN0YXRlUHJvdmlkZXJNYW5hZ2VyKAotCQkJCW5ldyBWZWhpY2xlQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpLAotCQkJCW5ldyBWZWhpY2xlTGFiZWxQcm92aWRlckZhY3RvcnkoKSk7Ci0JCXRyZWUuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJdHJlZS5zZXRMYWJlbFByb3ZpZGVyKGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJdHJlZS5zZXRJbnB1dChuZXcgUm9vdCgpKTsKLQkJdHJlZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoYnVpbGRUcmVlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkpOwotCX0KLQkKLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgYnVpbGRUcmVlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXNlbGVjdGVkVmVoaWNsZS5zZXRWYWx1ZSgoVmVoaWNsZSkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWJ1aWxkVXBwZXJDb250cm9sUGFuZWwocGFuZWwpOwotCQlidWlsZExvd2VyQ29udHJvbFBhbmVsKHBhbmVsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVXBwZXJDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7Ci0JCWJ1aWxkVmVoaWNsZUNvbWJvKHBhbmVsKTsKLQkJYnVpbGRDb2xvckNvbWJvKHBhbmVsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVmVoaWNsZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgQ29tYm9WaWV3ZXIgY29tYm8gPSBuZXcgQ29tYm9WaWV3ZXIocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLQkJY29tYm8uZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCWNvbWJvLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWNvbWJvLnNldExhYmVsUHJvdmlkZXIobmV3IFZlaGljbGVUeXBlTGFiZWxQcm92aWRlcigpKTsKLQkJY29tYm8uc2V0SW5wdXQoCi0JCQluZXcgVmVoaWNsZVR5cGVbXSB7Ci0JCQkJVmVoaWNsZVR5cGUuQklDWUNMRSwgVmVoaWNsZVR5cGUuQ0FSLCAKLQkJCQlWZWhpY2xlVHlwZS5UUlVDSywgVmVoaWNsZVR5cGUuQk9BVAotCQkJfSk7Ci0JCWNvbWJvLmdldENvbWJvKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWNvbWJvLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCXNlbGVjdGVkVmVoaWNsZSgpLnNldFZlaGljbGVUeXBlKChWZWhpY2xlVHlwZSkgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkpOyAKLQkJCQl9Ci0JCQl9KTsKLQkJc2VsZWN0ZWRWZWhpY2xlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIAotCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJVmVoaWNsZSB2ZWhpY2xlID0gc2VsZWN0ZWRWZWhpY2xlKCk7Ci0JCQkJCWNvbWJvLmdldENvbWJvKCkuc2V0RW5hYmxlZCh2ZWhpY2xlICE9IG51bGwpOwotCQkJCQljb21iby5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKHZlaGljbGUgPT0gbnVsbCkgPyBudWxsIDogdmVoaWNsZS52ZWhpY2xlVHlwZSgpKSk7Ci0JCQkJfQotCQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZENvbG9yQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBDb21ib1ZpZXdlciBjb21ibyA9IG5ldyBDb21ib1ZpZXdlcihwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQljb21iby5nZXRDb21ibygpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJY29tYm8uc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJY29tYm8uc2V0TGFiZWxQcm92aWRlcihuZXcgQ29sb3JMYWJlbFByb3ZpZGVyKCkpOwotCQljb21iby5zZXRJbnB1dChuZXcgQ29sb3JbXSB7Q29sb3IuUkVELCBDb2xvci5CTFVFLCBDb2xvci5ZRUxMT1csIENvbG9yLkdSRUVOfSk7Ci0JCWNvbWJvLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCXNlbGVjdGVkVmVoaWNsZSgpLnNldENvbG9yKChDb2xvcikgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkpOyAKLQkJCQl9Ci0JCQl9KTsKLQkJc2VsZWN0ZWRWZWhpY2xlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIAotCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJVmVoaWNsZSB2ZWhpY2xlID0gc2VsZWN0ZWRWZWhpY2xlKCk7Ci0JCQkJCWNvbWJvLmdldENvbWJvKCkuc2V0RW5hYmxlZCh2ZWhpY2xlICE9IG51bGwpOwotCQkJCQljb21iby5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKHZlaGljbGUgPT0gbnVsbCkgPyBudWxsIDogdmVoaWNsZS5jb2xvcigpKSk7Ci0JCQkJfQotCQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZExvd2VyQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJYnVpbGRFZmZlY3RzTGFiZWwocGFuZWwpOwotCQlidWlsZEdyZXllZENoZWNrQm94KHBhbmVsKTsKLQkJYnVpbGRUcmFuc2x1Y2VudENoZWNrQm94KHBhbmVsKTsKLQkJYnVpbGRBY3Rpb25QYW5lbChwYW5lbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZEVmZmVjdHNMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KCJDb2xvciBlZmZlY3RzOiAiKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HLCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSwgMywgMSkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRHcmV5ZWRDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORywgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJYnV0dG9uLnNldFRleHQoImdyZXllZCIpOwotCQlidXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJc2VsZWN0ZWRWZWhpY2xlKCkuc2V0R3JleWVkKGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCXNlbGVjdGVkVmVoaWNsZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAKLQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCVZlaGljbGUgdmVoaWNsZSA9IHNlbGVjdGVkVmVoaWNsZSgpOwotCQkJCQlidXR0b24uc2V0RW5hYmxlZCh2ZWhpY2xlICE9IG51bGwpOwotCQkJCQlidXR0b24uc2V0U2VsZWN0aW9uKHZlaGljbGUgIT0gbnVsbCAmJiB2ZWhpY2xlLmlzR3JleWVkKCkpOwotCQkJCX0KLQkJCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRUcmFuc2x1Y2VudENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJ0cmFuc2x1Y2VudCIpOwotCQlidXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJc2VsZWN0ZWRWZWhpY2xlKCkuc2V0VHJhbnNsdWNlbnQoYnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJc2VsZWN0ZWRWZWhpY2xlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIAotCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJVmVoaWNsZSB2ZWhpY2xlID0gc2VsZWN0ZWRWZWhpY2xlKCk7Ci0JCQkJCWJ1dHRvbi5zZXRFbmFibGVkKHZlaGljbGUgIT0gbnVsbCk7Ci0JCQkJCWJ1dHRvbi5zZXRTZWxlY3Rpb24odmVoaWNsZSAhPSBudWxsICYmIHZlaGljbGUuaXNUcmFuc2x1Y2VudCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQWN0aW9uUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQsIEdyaWREYXRhLkZJTEwsIGZhbHNlLCBmYWxzZSkpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWJ1aWxkUmVmcmVzaFRyZWVBQ0koKS5maWxsKHBhbmVsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVmcmVzaFRyZWVBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJSZWZyZXNoIHRyZWUiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyZWZyZXNoVHJlZSgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoIlJlZnJlc2ggdGhlIHRyZWUncyBsYWJlbHMiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCQotCXZvaWQgcmVmcmVzaFRyZWUoKSB7Ci0JCXRyZWUucmVmcmVzaCgpOwotCX0KLQkKLQlwcml2YXRlIFZlaGljbGUgc2VsZWN0ZWRWZWhpY2xlKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRWZWhpY2xlLmdldFZhbHVlKCk7Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZlaGljbGVUeXBlTGFiZWxQcm92aWRlciBleHRlbmRzIEJhc2VMYWJlbFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuICgoVmVoaWNsZVR5cGUpIGVsZW1lbnQpLmRlc2NyaXB0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29sb3JMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlcgotCXsKLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChDb2xvcikgZWxlbWVudCkuZGVzY3JpcHRpb24oKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBWZWhpY2xlQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCQlpbXBsZW1lbnRzIEl0ZW1UcmVlQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCXsKLQkJcHVibGljIEl0ZW1UcmVlQ29udGVudFByb3ZpZGVyIGJ1aWxkUHJvdmlkZXIoT2JqZWN0IGl0ZW0sIEl0ZW1UcmVlQ29udGVudFByb3ZpZGVyLk1hbmFnZXIgbWFuYWdlcikgewotCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBSb290KSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRSb290UHJvdmlkZXIoKFJvb3QpIGl0ZW0pOwotCQkJfQotCQkJcmV0dXJuIHRoaXMuYnVpbGRWZWhpY2xlUHJvdmlkZXIoKFZlaGljbGUpIGl0ZW0pOwotCQl9Ci0JCXByb3RlY3RlZCBJdGVtVHJlZUNvbnRlbnRQcm92aWRlciBidWlsZFJvb3RQcm92aWRlcihSb290IGl0ZW0pIHsKLQkJCXJldHVybiBuZXcgU3RhdGljSXRlbVRyZWVDb250ZW50UHJvdmlkZXIobnVsbCwgaXRlbS52ZWhpY2xlcygpKTsKLQkJfQotCQlwcm90ZWN0ZWQgSXRlbVRyZWVDb250ZW50UHJvdmlkZXIgYnVpbGRWZWhpY2xlUHJvdmlkZXIoVmVoaWNsZSBpdGVtKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXRpY0l0ZW1UcmVlQ29udGVudFByb3ZpZGVyKGl0ZW0ucGFyZW50KCkpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZlaGljbGVMYWJlbFByb3ZpZGVyRmFjdG9yeQotCQlpbXBsZW1lbnRzIEl0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXJGYWN0b3J5Ci0JewotCQlwdWJsaWMgSXRlbUV4dGVuZGVkTGFiZWxQcm92aWRlciBidWlsZFByb3ZpZGVyKE9iamVjdCBpdGVtLCBJdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyLk1hbmFnZXIgbWFuYWdlcikgewotCQkJcmV0dXJuIG5ldyBWZWhpY2xlTGFiZWxQcm92aWRlcigoVmVoaWNsZSkgaXRlbSwgbWFuYWdlcik7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmVoaWNsZUxhYmVsUHJvdmlkZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdEl0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXI8VmVoaWNsZT4KLQl7Ci0JCXB1YmxpYyBWZWhpY2xlTGFiZWxQcm92aWRlcihWZWhpY2xlIHZlaGljbGUsIEl0ZW1MYWJlbFByb3ZpZGVyLk1hbmFnZXIgbWFuYWdlcikgewotCQkJc3VwZXIodmVoaWNsZSwgbWFuYWdlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxWZWhpY2xlLCBJbWFnZT4oSU1BR0VfQVNQRUNUX05BTUVTLCB0aGlzLml0ZW0pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSW1hZ2UgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBzdWJqZWN0LmltYWdlKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBJTUFHRV9BU1BFQ1RfTkFNRVMgPQotCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCVZlaGljbGUuQ09MT1JfUFJPUEVSVFksCi0JCQkJCVZlaGljbGUuR1JFWUVEX1BST1BFUlRZLAotCQkJCQlWZWhpY2xlLlRSQU5TTFVDRU5UX1BST1BFUlRZCi0JCQkJfTsKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxWZWhpY2xlLCBTdHJpbmc+KFRFWFRfQVNQRUNUX05BTUVTLCB0aGlzLml0ZW0pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5jb2xvcigpLmRlc2NyaXB0aW9uKCkgKyAnICcgKyBzdWJqZWN0LnZlaGljbGVUeXBlKCkuZGVzY3JpcHRpb24oKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRFWFRfQVNQRUNUX05BTUVTID0KLQkJCQluZXcgU3RyaW5nW10gewotCQkJCQlWZWhpY2xlLlZFSElDTEVfVFlQRV9QUk9QRVJUWSwKLQkJCQkJVmVoaWNsZS5DT0xPUl9QUk9QRVJUWQotCQkJCX07Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVzY3JpcHRpb25Nb2RlbCgpIHsKLQkJCXJldHVybiBidWlsZFRleHRNb2RlbCgpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIFRyZWVOb2RlIGV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCXsKLQkJcHJpdmF0ZSBUcmVlTm9kZSBwYXJlbnQ7Ci0JCQotCQkKLQkJcHVibGljIFRyZWVOb2RlKFRyZWVOb2RlIHBhcmVudCkgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgVHJlZU5vZGUgcGFyZW50KCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSb290IGV4dGVuZHMgVHJlZU5vZGUKLQl7Ci0JCXByb3RlY3RlZCBmaW5hbCBWZWhpY2xlW10gdmVoaWNsZXM7Ci0JCQotCQkKLQkJcHVibGljIFJvb3QoKSB7Ci0JCQlzdXBlcihudWxsKTsKLQkJCXZlaGljbGVzID0gbmV3IFZlaGljbGVbXSB7Ci0JCQkJbmV3IFZlaGljbGUodGhpcywgVmVoaWNsZVR5cGUuQklDWUNMRSwgQ29sb3IuQkxVRSksCi0JCQkJbmV3IFZlaGljbGUodGhpcywgVmVoaWNsZVR5cGUuQ0FSLCBDb2xvci5ZRUxMT1cpLAotCQkJCW5ldyBWZWhpY2xlKHRoaXMsIFZlaGljbGVUeXBlLlRSVUNLLCBDb2xvci5SRUQpLAotCQkJCW5ldyBWZWhpY2xlKHRoaXMsIFZlaGljbGVUeXBlLkJPQVQsIENvbG9yLkdSRUVOKX07Ci0JCX0KLQkJCi0JCXB1YmxpYyBWZWhpY2xlW10gdmVoaWNsZXMoKSB7Ci0JCQlyZXR1cm4gdmVoaWNsZXM7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmVoaWNsZSBleHRlbmRzIFRyZWVOb2RlCi0JewotCQlwcml2YXRlIFZlaGljbGVUeXBlIHZlaGljbGVUeXBlOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWRUhJQ0xFX1RZUEVfUFJPUEVSVFkgPSAidmVoaWNsZVR5cGUiOwotCQkKLQkJcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09MT1JfUFJPUEVSVFkgPSAiY29sb3IiOwotCQkKLQkJcHJpdmF0ZSBib29sZWFuIGdyZXllZCA9IGZhbHNlOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBHUkVZRURfUFJPUEVSVFkgPSAiZ3JleWVkIjsKLQkJCi0JCXByaXZhdGUgYm9vbGVhbiB0cmFuc2x1Y2VudCA9IGZhbHNlOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUUkFOU0xVQ0VOVF9QUk9QRVJUWSA9ICJ0cmFuc2x1Y2VudCI7Ci0JCQotCQlwcml2YXRlIEltYWdlIGltYWdlOwotCQkKLQkJCQotCQlwdWJsaWMgVmVoaWNsZShUcmVlTm9kZSBwYXJlbnQsIFZlaGljbGVUeXBlIHZlaGljbGVUeXBlLCBDb2xvciBjb2xvcikgewotCQkJc3VwZXIocGFyZW50KTsKLQkJCXRoaXMudmVoaWNsZVR5cGUgPSB2ZWhpY2xlVHlwZTsKLQkJCXRoaXMuY29sb3IgPSBjb2xvcjsKLQkJfQotCQkKLQkJcHVibGljIFZlaGljbGVUeXBlIHZlaGljbGVUeXBlKCkgewotCQkJcmV0dXJuIHZlaGljbGVUeXBlOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRWZWhpY2xlVHlwZShWZWhpY2xlVHlwZSBuZXdWZWhpY2xlVHlwZSkgewotCQkJVmVoaWNsZVR5cGUgb2xkVmVoaWNsZVR5cGUgPSB2ZWhpY2xlVHlwZTsKLQkJCXZlaGljbGVUeXBlID0gbmV3VmVoaWNsZVR5cGU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZFSElDTEVfVFlQRV9QUk9QRVJUWSwgb2xkVmVoaWNsZVR5cGUsIG5ld1ZlaGljbGVUeXBlKTsKLQkJfQotCQkKLQkJcHVibGljIENvbG9yIGNvbG9yKCkgewotCQkJcmV0dXJuIGNvbG9yOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihDb2xvciBuZXdDb2xvcikgewotCQkJQ29sb3Igb2xkQ29sb3IgPSBjb2xvcjsKLQkJCWNvbG9yID0gbmV3Q29sb3I7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENPTE9SX1BST1BFUlRZLCBvbGRDb2xvciwgbmV3Q29sb3IpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc0dyZXllZCgpIHsKLQkJCXJldHVybiBncmV5ZWQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldEdyZXllZChib29sZWFuIG5ld0dyZXllZCkgewotCQkJYm9vbGVhbiBvbGRHcmV5ZWQgPSBncmV5ZWQ7Ci0JCQlncmV5ZWQgPSBuZXdHcmV5ZWQ7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEdSRVlFRF9QUk9QRVJUWSwgb2xkR3JleWVkLCBuZXdHcmV5ZWQpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zbHVjZW50KCkgewotCQkJcmV0dXJuIHRyYW5zbHVjZW50OwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRUcmFuc2x1Y2VudChib29sZWFuIG5ld1RyYW5zbHVjZW50KSB7Ci0JCQlib29sZWFuIG9sZFRyYW5zbHVjZW50ID0gdHJhbnNsdWNlbnQ7Ci0JCQl0cmFuc2x1Y2VudCA9IG5ld1RyYW5zbHVjZW50OwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUUkFOU0xVQ0VOVF9QUk9QRVJUWSwgb2xkVHJhbnNsdWNlbnQsIG5ld1RyYW5zbHVjZW50KTsKLQkJfQotCQkKLQkJcHVibGljIEltYWdlIGltYWdlKCkgewotCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBJbWFnZUZhY3RvcnkuaW1hZ2UoY29sb3IoKSwgZ3JleWVkLCB0cmFuc2x1Y2VudCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZW51bSBWZWhpY2xlVHlwZQotCXsKLQkJQklDWUNMRSgiYmljeWNsZSIpLAotCQlDQVIoImNhciIpLAotCQlUUlVDSygidHJ1Y2siKSwKLQkJQk9BVCgiYm9hdCIpOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247Ci0JCQotCQlwcml2YXRlIFZlaGljbGVUeXBlKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBkZXNjcmlwdGlvbigpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGVudW0gQ29sb3IKLQl7Ci0JCVJFRCgicmVkIiwgbmV3IFJHQigyNTUsIDAsIDApKSwKLQkJQkxVRSgiYmx1ZSIsIG5ldyBSR0IoMCwgMCwgMjU1KSksCi0JCVlFTExPVygieWVsbG93IiwgbmV3IFJHQigyNTUsIDI1NSwgMCkpLAotCQlHUkVFTigiZ3JlZW4iLCBuZXcgUkdCKDAsIDI1NSwgMCkpOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247Ci0JCQotCQlwcml2YXRlIGZpbmFsIFJHQiByZ2I7Ci0JCQotCQlwcml2YXRlIENvbG9yKFN0cmluZyBkZXNjcmlwdGlvbiwgUkdCIHJnYikgewotCQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQkJdGhpcy5yZ2IgPSByZ2I7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBSR0IgcmdiKCkgewotCQkJcmV0dXJuIHJnYjsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb24oKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJbWFnZUZhY3RvcnkKLQl7Ci0JCXByaXZhdGUgc3RhdGljIFJHQiByZ2IoQ29sb3IgY29sb3IsIGJvb2xlYW4gZ3JleWVkLCBib29sZWFuIHRyYW5zbHVjZW50KSB7Ci0JCQlSR0IgcmdiID0gKGdyZXllZCkgPyBuZXcgUkdCKDEyNywgMTI3LCAxMjcpIDogY29sb3IucmdiKCk7Ci0JCQlpZiAodHJhbnNsdWNlbnQpIHsKLQkJCQlyZ2IgPSBuZXcgUkdCKHRyYW5zbHVjaWZ5KHJnYi5yZWQpLCB0cmFuc2x1Y2lmeShyZ2IuZ3JlZW4pLCB0cmFuc2x1Y2lmeShyZ2IuYmx1ZSkpOwotCQkJfQotCQkJcmV0dXJuIHJnYjsKLQkJfQotCQkKLQkJcHJpdmF0ZSBzdGF0aWMgaW50IHRyYW5zbHVjaWZ5KGludCBjb2xvcikgewotCQkJcmV0dXJuIDI1NSAtIChpbnQpICgoMjU1IC0gY29sb3IpICogMC4zKTsKLQkJfQotCQkKLQkJcHVibGljIHN0YXRpYyBJbWFnZSBpbWFnZShDb2xvciBjb2xvciwgYm9vbGVhbiBncmV5ZWQsIGJvb2xlYW4gdHJhbnNsdWNlbnQpIHsKLQkJCVBhbGV0dGVEYXRhIHBkID0gbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7cmdiKGNvbG9yLCBncmV5ZWQsIHRyYW5zbHVjZW50KX0pOwotCQkJSW1hZ2VEYXRhIGlkID0gbmV3IEltYWdlRGF0YSgyMCwgMjAsIDEsIHBkKTsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgMjA7IHggKyspIHsKLQkJCQlmb3IgKGludCB5ID0gMDsgeSA8IDIwOyB5ICsrKSB7Ci0JCQkJCWlkLnNldFBpeGVsKHgsIHksIDApOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgSW1hZ2UoRGlzcGxheS5nZXRDdXJyZW50KCksIGlkKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdUcmVlQ29udGVudFByb3ZpZGVyVWlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9qZmFjZS9EZWxlZ2F0aW5nVHJlZUNvbnRlbnRQcm92aWRlclVpVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjhhYmQ3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdUcmVlQ29udGVudFByb3ZpZGVyVWlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdEl0ZW1UcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuSXRlbVRyZWVTdGF0ZVByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1UcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbVRyZWVDb250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLk5vdE51bGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGluZ1RyZWVDb250ZW50UHJvdmlkZXJVaVRlc3QgZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdwotewotCXByaXZhdGUgZmluYWwgUm9vdCByb290OwotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlPiBzZWxlY3RlZE5vZGU7Ci0KLQlwcml2YXRlIFRyZWVWaWV3ZXIgY29udHJvbFRyZWU7Ci0KLQlwcml2YXRlIFRyZWVWaWV3ZXIgdmlld1RyZWU7Ci0KLQlwcml2YXRlIFRleHQgbm9kZU5hbWVUZXh0OwotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVdpbmRvdyB3aW5kb3cgPSBuZXcgRGVsZWdhdGluZ1RyZWVDb250ZW50UHJvdmlkZXJVaVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIERlbGVnYXRpbmdUcmVlQ29udGVudFByb3ZpZGVyVWlUZXN0KFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMucm9vdCA9IG5ldyBSb290KCk7Ci0JCXRoaXMucm9vdC5hZGRDaGlsZCgiUGFyZW50XzEiKTsKLQkJdGhpcy5zZWxlY3RlZE5vZGUgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlPih0aGlzLnJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlwYXJlbnQuc2V0U2l6ZSg4MDAsIDQwMCk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCW1haW5QYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWJ1aWxkVHJlZVBhbmVsKG1haW5QYW5lbCk7Ci0JCWJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVHJlZVBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7Ci0JCWJ1aWxkQ29udHJvbFRyZWVQYW5lbChwYW5lbCk7Ci0JCWJ1aWxkVmlld1RyZWVQYW5lbChwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFRyZWVQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNvbnRyb2xUcmVlID0gYnVpbGRUcmVlUGFuZWwoCi0JCQkJcGFyZW50LCAiQ29udHJvbCB0cmVlIiwKLQkJCQluZXcgSXRlbVRyZWVTdGF0ZVByb3ZpZGVyTWFuYWdlcihuZXcgQ29udHJvbFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpKSwKLQkJCQluZXcgTGFiZWxQcm92aWRlcigpKTsKLQkJY29udHJvbFRyZWUuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGJ1aWxkVHJlZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpKTsKLQkJc2VsZWN0ZWROb2RlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQkJY29udHJvbFRyZWUuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGV2ZW50LmdldE5ld1ZhbHVlKCkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVmlld1RyZWVQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXZpZXdUcmVlID0gYnVpbGRUcmVlUGFuZWwoCi0JCQkJcGFyZW50LCAiVmlldyB0cmVlIiwKLQkJCQluZXcgSXRlbVRyZWVTdGF0ZVByb3ZpZGVyTWFuYWdlcihuZXcgVmlld0l0ZW1UcmVlQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpKSwKLQkJCQluZXcgTGFiZWxQcm92aWRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVWaWV3ZXIgYnVpbGRUcmVlUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCwgSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyLCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HLCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQlsYWJlbC5zZXRUZXh0KGxhYmVsVGV4dCk7Ci0KLQkJZmluYWwgVHJlZVZpZXdlciB0cmVlID0gbmV3IFRyZWVWaWV3ZXIocGFuZWwsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJdHJlZS5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0cmVlLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQl0cmVlLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXRyZWUuc2V0SW5wdXQocm9vdCk7Ci0KLQkJcmV0dXJuIHRyZWU7Ci0JfQotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGJ1aWxkVHJlZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlTm9kZSBzZWxlY3Rpb24gPSAoVHJlZU5vZGUpICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlzZWxlY3RlZE5vZGUuc2V0VmFsdWUoKHNlbGVjdGlvbiA9PSBudWxsKSA/IHJvb3QgOiBzZWxlY3Rpb24pOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCg2LCBmYWxzZSkpOwotCQlidWlsZE5vZGVOYW1lVGV4dChwYW5lbCk7Ci0JCWJ1aWxkQWRkQ2hpbGRBQ0koKS5maWxsKHBhbmVsKTsKLQkJYnVpbGRBZGROZXN0ZWRDaGlsZEFDSSgpLmZpbGwocGFuZWwpOwotCQlidWlsZFJlbW92ZUFDSSgpLmZpbGwocGFuZWwpOwotCQlidWlsZENsZWFyTW9kZWxBQ0koKS5maWxsKHBhbmVsKTsKLQkJYnVpbGRSZXN0b3JlTW9kZWxBQ0koKS5maWxsKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGROb2RlTmFtZVRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlub2RlTmFtZVRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJbm9kZU5hbWVUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRBZGRDaGlsZEFDSSgpIHsKLQkJZmluYWwgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIkFkZCBjaGlsZCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWFkZENoaWxkKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiQWRkIGEgY2hpbGQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSIpOwotCQlzZWxlY3RlZE5vZGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlhY3Rpb24uc2V0RW5hYmxlZCgoKFRyZWVOb2RlKSBldmVudC5nZXROZXdWYWx1ZSgpKS5jYW5IYXZlQ2hpbGRyZW4oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRBZGROZXN0ZWRDaGlsZEFDSSgpIHsKLQkJZmluYWwgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIkFkZCBuZXN0ZWQgY2hpbGQiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlhZGROZXN0ZWRDaGlsZCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoIkFkZCBhIG5lc3RlZCBjaGlsZCB3aXRoIHRoZSBnaXZlbiBuYW1lIik7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJc2VsZWN0ZWROb2RlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoKChUcmVlTm9kZSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuY2FuSGF2ZU5lc3RlZENoaWxkcmVuKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVtb3ZlQUNJKCkgewotCQlmaW5hbCBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiUmVtb3ZlIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmVtb3ZlKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiUmVtb3ZlIHRoZSBzZWxlY3RlZCBub2RlIik7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJc2VsZWN0ZWROb2RlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoZXZlbnQuZ2V0TmV3VmFsdWUoKSAhPSByb290KTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJDbGVhciBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJDbGVhciB0aGUgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiUmVzdG9yZSBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoIlJlc3RvcmUgdGhlIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgYWRkQ2hpbGQoKSB7Ci0JCVN0cmluZyBub2RlTmFtZSA9IG5vZGVOYW1lVGV4dC5nZXRUZXh0KCk7Ci0JCWlmIChub2RlTmFtZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlzZWxlY3RlZE5vZGUuZ2V0VmFsdWUoKS5hZGRDaGlsZChub2RlTmFtZSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGFkZE5lc3RlZENoaWxkKCkgewotCQlTdHJpbmcgbm9kZU5hbWUgPSBub2RlTmFtZVRleHQuZ2V0VGV4dCgpOwotCQlpZiAobm9kZU5hbWUubGVuZ3RoKCkgIT0gMCkgewotCQkJc2VsZWN0ZWROb2RlLmdldFZhbHVlKCkuYWRkTmVzdGVkQ2hpbGQobm9kZU5hbWUpOwotCQl9Ci0JfQotCi0Jdm9pZCByZW1vdmUoKSB7Ci0JCVRyZWVOb2RlIG5vZGUgPSBzZWxlY3RlZE5vZGUuZ2V0VmFsdWUoKTsKLQkJbm9kZS5wYXJlbnQoKS5yZW1vdmVDaGlsZChub2RlKTsKLQl9Ci0KLQl2b2lkIGNsZWFyTW9kZWwoKSB7Ci0JCWNvbnRyb2xUcmVlLnNldElucHV0KG51bGwpOwotCQl2aWV3VHJlZS5zZXRJbnB1dChudWxsKTsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJY29udHJvbFRyZWUuc2V0SW5wdXQocm9vdCk7Ci0JCXZpZXdUcmVlLnNldElucHV0KHJvb3QpOwotCX0KLQotCi0Jc3RhdGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JCWltcGxlbWVudHMgSXRlbVRyZWVDb250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JewotCQlwdWJsaWMgSXRlbVRyZWVDb250ZW50UHJvdmlkZXIgYnVpbGRQcm92aWRlcihPYmplY3QgaXRlbSwgSXRlbVRyZWVDb250ZW50UHJvdmlkZXIuTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQlyZXR1cm4gbmV3IEdlbmVyaWNJdGVtVHJlZUNvbnRlbnRQcm92aWRlcigoVHJlZU5vZGUpIGl0ZW0sIG1hbmFnZXIpOwotCQl9Ci0JfQotCi0KLQlzdGF0aWMgY2xhc3MgQ29udHJvbFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCQlleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JewotCQkvLyBub3RoaW5nCi0JfQotCi0KLQlzdGF0aWMgY2xhc3MgVmlld0l0ZW1UcmVlQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCQlleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEl0ZW1UcmVlQ29udGVudFByb3ZpZGVyIGJ1aWxkUHJvdmlkZXIoT2JqZWN0IGl0ZW0sIEl0ZW1UcmVlQ29udGVudFByb3ZpZGVyLk1hbmFnZXIgbWFuYWdlcikgewotCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBQYXJlbnQpIHsKLQkJCQlyZXR1cm4gbmV3IFZpZXdQYXJlbnRJdGVtVHJlZUNvbnRlbnRQcm92aWRlcigoUGFyZW50KSBpdGVtLCBtYW5hZ2VyKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5idWlsZFByb3ZpZGVyKGl0ZW0sIG1hbmFnZXIpOwotCQl9Ci0JfQotCi0KLQlzdGF0aWMgY2xhc3MgR2VuZXJpY0l0ZW1UcmVlQ29udGVudFByb3ZpZGVyCi0JCWV4dGVuZHMgQWJzdHJhY3RJdGVtVHJlZUNvbnRlbnRQcm92aWRlcjxUcmVlTm9kZSwgVHJlZU5vZGU+Ci0JewotCQlwdWJsaWMgR2VuZXJpY0l0ZW1UcmVlQ29udGVudFByb3ZpZGVyKFRyZWVOb2RlIHRyZWVOb2RlLCBJdGVtVHJlZUNvbnRlbnRQcm92aWRlci5NYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCXN1cGVyKHRyZWVOb2RlLCBtYW5hZ2VyKTsKLQkJfQotCi0JCXB1YmxpYyBUcmVlTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVtLnBhcmVudCgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxUcmVlTm9kZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJcmV0dXJuIG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFRyZWVOb2RlPigKLQkJCW5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUcmVlTm9kZSwgVHJlZU5vZGU+KFRyZWVOb2RlLkNISUxEUkVOX0xJU1QsIHRoaXMuaXRlbSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8VHJlZU5vZGU+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuY2hpbGRyZW4oKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBWaWV3UGFyZW50SXRlbVRyZWVDb250ZW50UHJvdmlkZXIKLQkJZXh0ZW5kcyBHZW5lcmljSXRlbVRyZWVDb250ZW50UHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBWaWV3UGFyZW50SXRlbVRyZWVDb250ZW50UHJvdmlkZXIoVHJlZU5vZGUgdHJlZU5vZGUsIEl0ZW1UcmVlQ29udGVudFByb3ZpZGVyLk1hbmFnZXIgbWFuYWdlcikgewotCQkJc3VwZXIodHJlZU5vZGUsIG1hbmFnZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBUcmVlTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCQlUcmVlTm9kZSBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQoKTsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBOZXN0KSB7Ci0JCQkJcGFyZW50ID0gcGFyZW50LnBhcmVudCgpOwotCQkJfQotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8VHJlZU5vZGU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFRyZWVOb2RlLCBUcmVlTm9kZT4oc3VwZXIuYnVpbGRDaGlsZHJlbk1vZGVsKCkpIHsKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFRyZWVOb2RlPiB0cmFuc2Zvcm0oVHJlZU5vZGUgdmFsdWUpIHsKLQkJCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBOZXN0KSB7Ci0JCQkJCQkJCWZpbmFsIE5lc3QgbmVzdCA9IChOZXN0KSB2YWx1ZTsKLQkJCQkJCQkJcmV0dXJuIG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFRyZWVOb2RlPigKLQkJCQkJCQkJCQluZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VHJlZU5vZGUsIFRyZWVOb2RlPihUcmVlTm9kZS5DSElMRFJFTl9MSVNULCBuZXN0KSB7Ci0JCQkJCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFRyZWVOb2RlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCQkJCQkJCQkJcmV0dXJuIG5lc3QuY2hpbGRyZW4oKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCSk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBuZXcgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8VHJlZU5vZGU+KENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHZhbHVlKSk7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCX0KLQl9Ci0KLQotCXN0YXRpYyBjbGFzcyBMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlcgotCXsKLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuICgoVHJlZU5vZGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJfQotCX0KLQotCi0Jc3RhdGljIGFic3RyYWN0IGNsYXNzIFRyZWVOb2RlIGV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCXsKLQkJcHJpdmF0ZSBUcmVlTm9kZSBwYXJlbnQ7Ci0KLQkJcHJvdGVjdGVkIGZpbmFsIExpc3Q8VHJlZU5vZGU+IGNoaWxkcmVuOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDSElMRFJFTl9MSVNUID0gImNoaWxkcmVuIjsKLQotCQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQotCQlwdWJsaWMgVHJlZU5vZGUoVHJlZU5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLmNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxUcmVlTm9kZT4oKTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgVHJlZU5vZGUgcGFyZW50KCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCi0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKCkgewotCQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxUcmVlTm9kZT4oY2hpbGRyZW4pOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGQoVHJlZU5vZGUgY2hpbGQpIHsKLQkJCWFkZEl0ZW1Ub0xpc3QoY2hpbGQsIGNoaWxkcmVuLCBDSElMRFJFTl9MSVNUKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKFRyZWVOb2RlIGNoaWxkKSB7Ci0JCQlyZW1vdmVJdGVtRnJvbUxpc3QoY2hpbGQsIGNoaWxkcmVuLCBDSElMRFJFTl9MSVNUKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKGludCBpbmRleCkgewotCQkJcmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCBjaGlsZHJlbiwgQ0hJTERSRU5fTElTVCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJCW5hbWUgPSBuZXdOYW1lOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVDaGlsZHJlbigpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVOZXN0ZWRDaGlsZHJlbigpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZE5lc3RlZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQotCi0Jc3RhdGljIGNsYXNzIFJvb3QgZXh0ZW5kcyBUcmVlTm9kZQotCXsKLQkJcHVibGljIFJvb3QoKSB7Ci0JCQlzdXBlcihudWxsLCBudWxsKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBjYW5IYXZlQ2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBhZGRDaGlsZChTdHJpbmcgbmFtZSkgewotCQkJYWRkQ2hpbGQobmV3IFBhcmVudCh0aGlzLCBuYW1lKSk7Ci0JCX0KLQl9Ci0KLQotCXN0YXRpYyBjbGFzcyBQYXJlbnQgZXh0ZW5kcyBUcmVlTm9kZQotCXsKLQkJcHVibGljIFBhcmVudChUcmVlTm9kZSBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihwYXJlbnQsIG5hbWUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVDaGlsZHJlbigpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGFkZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQlhZGRDaGlsZChuZXcgQ2hpbGQodGhpcywgbmFtZSkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVOZXN0ZWRDaGlsZHJlbigpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGFkZE5lc3RlZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQlUcmVlTm9kZSBuZXN0ID0gbmV3IE5lc3QodGhpcyk7Ci0JCQlhZGRDaGlsZChuZXN0KTsKLQkJCW5lc3QuYWRkQ2hpbGQobmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3I8Q2hpbGQ+IG5lc3RsZXNzQ2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPENoaWxkPigKLQkJCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8VHJlZU5vZGUsIENoaWxkPihjaGlsZHJlbigpKSB7Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBDaGlsZCB0cmFuc2Zvcm0oVHJlZU5vZGUgbmV4dCkgewotCQkJCQkJCWlmIChuZXh0IGluc3RhbmNlb2YgTmVzdCkgewotCQkJCQkJCQlyZXR1cm4gKChOZXN0KSBuZXh0KS5jaGlsZCgpOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gKENoaWxkKSBuZXh0OwotCQkJCQkJfQotCQkJCQl9LAotCQkJCQlOb3ROdWxsRmlsdGVyLjxDaGlsZD5pbnN0YW5jZSgpCi0JCQkJKTsKLQkJfQotCX0KLQotCi0Jc3RhdGljIGNsYXNzIE5lc3QgZXh0ZW5kcyBUcmVlTm9kZQotCXsKLQkJcHVibGljIE5lc3QoVHJlZU5vZGUgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQsICJuZXN0Iik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gY2FuSGF2ZUNoaWxkcmVuKCkgewotCQkJcmV0dXJuIGNoaWxkcmVuLnNpemUoKSA9PSAwOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGFkZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQlhZGRDaGlsZChuZXcgQ2hpbGQodGhpcywgbmFtZSkpOwotCQl9Ci0KLQkJLyogY2FuIG9ubHkgaGF2ZSBvbmUgY2hpbGQgKi8KLQkJcHVibGljIENoaWxkIGNoaWxkKCkgewotCQkJcmV0dXJuIChjaGlsZHJlbi5pc0VtcHR5KCkpID8gbnVsbCA6IChDaGlsZCkgY2hpbGRyZW4uZ2V0KDApOwotCQl9Ci0JfQotCi0KLQlzdGF0aWMgY2xhc3MgQ2hpbGQgZXh0ZW5kcyBUcmVlTm9kZQotCXsKLQkJcHVibGljIENoaWxkKFRyZWVOb2RlIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKHBhcmVudCwgbmFtZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9zd3QvQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlclRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3N3dC9BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njk0MDIwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3N3dC9BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnN3dDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LkFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci5TZWxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLlNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLlNpbXBsZURpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdCB7Ci0KLQlwcml2YXRlIE1vZGVsIG1vZGVsOwotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTaW1wbGVEaXNwbGF5YWJsZT4gc2VsZWN0ZWRJdGVtSG9sZGVyOwotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPiBzdWJqZWN0SG9sZGVyOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RWYWx1ZU1vZGVsPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZEVtcHR5TGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTaW1wbGVEaXNwbGF5YWJsZT4oKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+KCk7Ci0JCXBvcHVsYXRlQ29sbGVjdGlvbihsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RWYWx1ZU1vZGVsPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8TW9kZWwsIFNpbXBsZURpc3BsYXlhYmxlPihzdWJqZWN0SG9sZGVyLCBNb2RlbC5JVEVNU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U2ltcGxlRGlzcGxheWFibGU+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuaXRlbXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0Lml0ZW1zU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCXByaXZhdGUgU2ltcGxlRGlzcGxheWFibGUgYnVpbGRTZWxlY3RlZEl0ZW0oKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlRGlzcGxheWFibGUoImJheiIpOwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1vZGVsLCBTaW1wbGVEaXNwbGF5YWJsZT4oc3ViamVjdEhvbGRlciwgTW9kZWwuSVRFTV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2ltcGxlRGlzcGxheWFibGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0SXRlbSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTaW1wbGVEaXNwbGF5YWJsZSB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0SXRlbSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ0NvbnZlcnRlcjxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRTdHJpbmdDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFNpbXBsZURpc3BsYXlhYmxlPigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFNpbXBsZURpc3BsYXlhYmxlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/ICIiIDogdmFsdWUuZGlzcGxheVN0cmluZygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxNb2RlbD4gYnVpbGRTdWJqZWN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxNb2RlbD4oKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGNvbWJvU2VsZWN0ZWRJdGVtKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBlbXB0eUNvbWJvQ2FuSGF2ZVNlbGVjdGVkVmFsdWUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgaXRlbUF0KGludCBpbmRleCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGl0ZW1Db3VudHMoKTsKLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxTaW1wbGVEaXNwbGF5YWJsZT4gYykgewotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImZvbyIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJiYXIiKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiYmF6IikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImpvbyIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJqYXIiKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiamF6IikpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFNpbXBsZURpc3BsYXlhYmxlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCXJldHVybiBzZWxlY3RlZEl0ZW1Ib2xkZXI7Ci0JfQotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc2hlbGwgICAgICAgICAgICAgID0gbmV3IFNoZWxsKERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLQkJbW9kZWwgICAgICAgICAgICAgID0gbmV3IE1vZGVsKCk7Ci0JCXN1YmplY3RIb2xkZXIgICAgICA9IGJ1aWxkU3ViamVjdEhvbGRlcigpOwotCQlzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBTaGVsbCBzaGVsbCgpIHsKLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPiBzdWJqZWN0SG9sZGVyKCkgewotCQlyZXR1cm4gc3ViamVjdEhvbGRlcjsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCX0KLQotCQlzaGVsbCAgICAgICAgICAgICAgPSBudWxsOwotCQlzdWJqZWN0SG9sZGVyICAgICAgPSBudWxsOwotCQlzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0SXRlbXMoKSB7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBjb3VudCBvZiBpdGVtcyBpcyBub3QgaW4gc3luYyB3aXRoIHRoZSBtb2RlbCIsCi0JCQltb2RlbC5pdGVtc1NpemUoKSwKLQkJCWl0ZW1Db3VudHMoKQotCQkpOwotCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBtb2RlbC5pdGVtc1NpemUoKTsgaW5kZXgrKykgewotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgaXRlbSBhdCBpbmRleCAiICsgaW5kZXggKyAiIGlzIG5vdCB0aGUgc2FtZSBiZXR3ZWVuIHRoZSBtb2RlbCBhbmQgdGhlIGNvbWJvIiwKLQkJCQltb2RlbC5pdGVtQXQoaW5kZXgpLmRpc3BsYXlTdHJpbmcoKSwKLQkJCQlpdGVtQXQoaW5kZXgpCi0JCQkpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9BZGRlZEFmdGVyX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCXRlc3RSZW1vdmVJdGVtc19BZGRlZEFmdGVyKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9BZGRlZEFmdGVyX1JlbW92ZUl0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCXRlc3RSZW1vdmVJdGVtc19BZGRlZEFmdGVyKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9BZGRlZEJlZm9yZV9SZW1vdmVJdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCi0JCUFycmF5TGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPigpOwotCQlpdGVtcy5hZGQobW9kZWwuaXRlbUF0KDApKTsKLQkJaXRlbXMuYWRkKG1vZGVsLml0ZW1BdCgzKSk7Ci0JCW1vZGVsLnJlbW92ZUl0ZW1zKGl0ZW1zLml0ZXJhdG9yKCkpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX0FkZGVkQmVmb3JlX1JlbW92ZUl0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0KLQkJQXJyYXlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+KCk7Ci0JCWl0ZW1zLmFkZChtb2RlbC5pdGVtQXQoMCkpOwotCQlpdGVtcy5hZGQobW9kZWwuaXRlbUF0KDMpKTsKLQkJbW9kZWwucmVtb3ZlSXRlbXMoaXRlbXMuaXRlcmF0b3IoKSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc0FmdGVyQWZ0ZXJfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc0FmdGVyQWZ0ZXJfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc0FmdGVyQmVmb3JlX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNBZnRlckJlZm9yZV9SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zQmVmb3JlX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zQmVmb3JlX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9OdWxsU2VsZWN0ZWRJdGVtX05vSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9OdWxsU2VsZWN0ZWRJdGVtX05vSXRlbXNfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9TZWxlY3RlZEl0ZW1DaGFuZ2VkX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBtb2RlbC5pdGVtQXQoMCk7Ci0KLQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxTaW1wbGVEaXNwbGF5YWJsZT4gYWRhcHRlciA9IGJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQlhZGFwdGVyLmFkZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW1DaGFuZ2VkKHNlbGVjdGVkSXRlbSwgc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1BZnRlcl9FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IGJ1aWxkU2VsZWN0ZWRJdGVtKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUFmdGVyX0l0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gYnVpbGRTZWxlY3RlZEl0ZW0oKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9Ob25OdWxsU2VsZWN0ZWRJdGVtQWZ0ZXJfSXRlbXNfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBsaXN0ID0gYnVpbGRMaXN0KCk7Ci0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IGxpc3QuZ2V0KDApOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1BZnRlcl9SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGxpc3QgPSBidWlsZExpc3QoKTsKLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbGlzdC5nZXQoMCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUJlZm9yZV9FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbW9kZWwuaXRlbUF0KDApOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQltb2RlbC5jbGVhckl0ZW1DYWxsZWRGbGFnKCk7Ci0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUJlZm9yZV9JdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbW9kZWwuaXRlbUF0KDApOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQltb2RlbC5jbGVhckl0ZW1DYWxsZWRGbGFnKCk7Ci0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUJlZm9yZV9JdGVtc19SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGxpc3QgPSBidWlsZExpc3QoKTsKLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbGlzdC5nZXQoMCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCi0JCW1vZGVsLmNsZWFySXRlbUNhbGxlZEZsYWcoKTsKLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9Ob25OdWxsU2VsZWN0ZWRJdGVtQmVmb3JlX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gbGlzdCA9IGJ1aWxkTGlzdCgpOwotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBsaXN0LmdldCgwKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0KLQkJbW9kZWwuY2xlYXJJdGVtQ2FsbGVkRmxhZygpOwotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlhc3NlcnRGYWxzZSgiVGhlIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnROdWxsKCJUaGUgc2VsZWN0ZWQgaXRlbSBpcyBzdXBwb3NlZCB0byByZW1haW4gbnVsbCIsIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlhc3NlcnRGYWxzZSgiVGhlIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnROdWxsKCJUaGUgc2VsZWN0ZWQgaXRlbSBpcyBzdXBwb3NlZCB0byByZW1haW4gbnVsbCIsIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX051bGxTZWxlY3RlZEl0ZW1fTm9JdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCWFzc2VydEZhbHNlKCJUaGUgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydE51bGwoIlRoZSBzZWxlY3RlZCBpdGVtIGlzIHN1cHBvc2VkIHRvIHJlbWFpbiBudWxsIiwgbW9kZWwuZ2V0SXRlbSgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTnVsbFNlbGVjdGVkSXRlbV9Ob0l0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJYXNzZXJ0RmFsc2UoIlRoZSBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0TnVsbCgiVGhlIHNlbGVjdGVkIGl0ZW0gaXMgc3VwcG9zZWQgdG8gcmVtYWluIG51bGwiLCBtb2RlbC5nZXRJdGVtKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9TZWxlY3RlZEl0ZW1DaGFuZ2VkX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCi0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IG1vZGVsLml0ZW1BdCgzKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxTaW1wbGVEaXNwbGF5YWJsZT4gYWRhcHRlciA9IGJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQlhZGFwdGVyLmFkZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW1DaGFuZ2VkKHNlbGVjdGVkSXRlbSwgc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0TnVsbFN1YmplY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlhc3NlcnROdWxsKCJUaGUgc2VsZWN0ZWQgaXRlbSBzaG91bGQgYmUgbnVsbCIsIHNlbGVjdGVkSXRlbUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUoYnVpbGRTZWxlY3RlZEl0ZW0oKSk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJLy8gTnVsbCBiZWNhdXNlIHRoZSBzdWJqZWN0IGhvbGRlciBkb2Vzbid0IGhhdmUgdGhlIHN1YmplY3Qgc2V0Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE51bGxTdWJqZWN0X051bGxTZWxlY3RlZEl0ZW1fSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCXRlc3ROdWxsU3ViamVjdCgpOwotCQl0ZXN0SXRlbXMoKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROdWxsU3ViamVjdF9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0TnVsbFN1YmplY3QoKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFN1YmplY3RfTnVsbFNlbGVjdGVkSXRlbV9Ob0l0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0TnVsbFN1YmplY3QoKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFN1YmplY3RfTnVsbFNlbGVjdGVkSXRlbV9Ob0l0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0TnVsbFN1YmplY3QoKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRlc3RSZW1vdmVJdGVtc19BZGRlZEFmdGVyKCkgewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0KLQkJQXJyYXlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+KCk7Ci0JCWl0ZW1zLmFkZChtb2RlbC5pdGVtQXQoMCkpOwotCQlpdGVtcy5hZGQobW9kZWwuaXRlbUF0KDMpKTsKLQkJbW9kZWwucmVtb3ZlSXRlbXMoaXRlbXMuaXRlcmF0b3IoKSk7Ci0KLQkJdGVzdEl0ZW1zKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRlc3RTZWxlY3RlZEl0ZW0oU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtKSB7Ci0KLQkJaWYgKHNlbGVjdGVkSXRlbSA9PSBudWxsKSB7Ci0KLQkJCWFzc2VydE51bGwoCi0JCQkJIlRoZSBzZWxlY3RlZCBpdGVtIGlzIHN1cHBvc2VkIHRvIGJlIG51bGwiLAotCQkJCW1vZGVsLmdldEl0ZW0oKQotCQkJKTsKLQotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgY29tYm8ncyBzZWxlY3RlZCBpdGVtIHNob3VsZCBiZSBudWxsIiwKLQkJCQkiIiwKLQkJCQljb21ib1NlbGVjdGVkSXRlbSgpCi0JCQkpOwotCQl9Ci0JCWVsc2UgaWYgKCFlbXB0eUNvbWJvQ2FuSGF2ZVNlbGVjdGVkVmFsdWUoKSkgewotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgY29ycmVjdGx5IiwKLQkJCQlzZWxlY3RlZEl0ZW0sCi0JCQkJbW9kZWwuZ2V0SXRlbSgpCi0JCQkpOwotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBjb21ibydzIHNlbGVjdGVkIGl0ZW0gc2hvdWxkIGJlIG51bGwiLAotCQkJCSIiLAotCQkJCWNvbWJvU2VsZWN0ZWRJdGVtKCkKLQkJCSk7Ci0JCX0KLQkJZWxzZSB7Ci0KLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBjb3JyZWN0bHkiLAotCQkJCXNlbGVjdGVkSXRlbSwKLQkJCQltb2RlbC5nZXRJdGVtKCkKLQkJCSk7Ci0KLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBjb3JyZWN0bHkiLAotCQkJCXNlbGVjdGVkSXRlbS5kaXNwbGF5U3RyaW5nKCksCi0JCQkJY29tYm9TZWxlY3RlZEl0ZW0oKQotCQkJKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0U2VsZWN0ZWRJdGVtQ2hhbmdlZChTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyKSB7Ci0KLQkJLy8gVGVzdCAxCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgU2VsZWN0aW9uTGlzdGVuZXIgd2FzIHN1cHBvc2VkIHRvIGJlIG5vdGlmaWVkIiwgc2VsZWN0aW9uTGlzdGVuZXIuaXNMaXN0ZW5lck5vdGlmaWVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgU2VsZWN0aW9uTGlzdGVuZXIgd2FzIHN1cHBvc2VkIHRvIGJlIG5vdGlmaWVkIiwgc2VsZWN0ZWRJdGVtLCBzZWxlY3Rpb25MaXN0ZW5lci5nZXRJdGVtKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0KLQkJLy8gVGVzdCAyCi0JCXNlbGVjdGVkSXRlbSA9IG1vZGVsLml0ZW1BdCgxKTsKLQkJbW9kZWwuY2xlYXJJdGVtQ2FsbGVkRmxhZygpOwotCQlzZWxlY3Rpb25MaXN0ZW5lci5jbGVhckluZm8oKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGlvbkxpc3RlbmVyLmlzTGlzdGVuZXJOb3RpZmllZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGVkSXRlbSwgc2VsZWN0aW9uTGlzdGVuZXIuZ2V0SXRlbSgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCi0JCS8vIFRlc3QgMwotCQlzZWxlY3RlZEl0ZW0gPSBudWxsOwotCQltb2RlbC5jbGVhckl0ZW1DYWxsZWRGbGFnKCk7Ci0JCXNlbGVjdGlvbkxpc3RlbmVyLmNsZWFySW5mbygpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnROdWxsKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5IiwgbW9kZWwuZ2V0SXRlbSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGlvbkxpc3RlbmVyLmlzTGlzdGVuZXJOb3RpZmllZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGVkSXRlbSwgc2VsZWN0aW9uTGlzdGVuZXIuZ2V0SXRlbSgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCi0JCS8vIFRlc3QgMwotCQlzZWxlY3RlZEl0ZW0gPSBtb2RlbC5pdGVtQXQoMik7Ci0JCW1vZGVsLmNsZWFySXRlbUNhbGxlZEZsYWcoKTsKLQkJc2VsZWN0aW9uTGlzdGVuZXIuY2xlYXJJbmZvKCk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCWFzc2VydFRydWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3Rpb25MaXN0ZW5lci5pc0xpc3RlbmVyTm90aWZpZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3RlZEl0ZW0sIHNlbGVjdGlvbkxpc3RlbmVyLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JCXByaXZhdGUgU2ltcGxlRGlzcGxheWFibGUgaXRlbTsKLQkJcHJpdmF0ZSBMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+KCk7Ci0JCXByaXZhdGUgYm9vbGVhbiBzZXRJdGVtQ2FsbGVkOwotCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFTV9QUk9QRVJUWSA9ICJpdGVtIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBJVEVNU19MSVNUID0gIml0ZW1zIjsKLQotCQl2b2lkIGFkZEl0ZW1zKEl0ZXJhdG9yPFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtcykgewotCQkJYWRkSXRlbXNUb0xpc3QoaXRlbXMsIHRoaXMuaXRlbXMsIElURU1TX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCBhZGRJdGVtcyhMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtcykgewotCQkJYWRkSXRlbXNUb0xpc3QoaXRlbXMsIHRoaXMuaXRlbXMsIElURU1TX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCBjbGVhckl0ZW1DYWxsZWRGbGFnKCkgewotCQkJc2V0SXRlbUNhbGxlZCA9IGZhbHNlOwotCQl9Ci0KLQkJU2ltcGxlRGlzcGxheWFibGUgZ2V0SXRlbSgpIHsKLQkJCXJldHVybiBpdGVtOwotCQl9Ci0KLQkJYm9vbGVhbiBpc1NldEl0ZW1DYWxsZWQoKSB7Ci0JCQlyZXR1cm4gc2V0SXRlbUNhbGxlZDsKLQkJfQotCi0JCVNpbXBsZURpc3BsYXlhYmxlIGl0ZW1BdChpbnQgaW5kZXgpIHsKLQkJCXJldHVybiB0aGlzLml0ZW1zLmdldChpbmRleCk7Ci0JCX0KLQotCQlMaXN0SXRlcmF0b3I8U2ltcGxlRGlzcGxheWFibGU+IGl0ZW1zKCkgewotCQkJcmV0dXJuIGl0ZW1zLmxpc3RJdGVyYXRvcigpOwotCQl9Ci0KLQkJaW50IGl0ZW1zU2l6ZSgpIHsKLQkJCXJldHVybiBpdGVtcy5zaXplKCk7Ci0JCX0KLQotCQl2b2lkIHJlbW92ZUl0ZW1zKEl0ZXJhdG9yPFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtcykgewotCQkJcmVtb3ZlSXRlbXNGcm9tTGlzdChpdGVtcywgdGhpcy5pdGVtcywgSVRFTVNfTElTVCk7Ci0JCX0KLQotCQl2b2lkIHNldEl0ZW0oU2ltcGxlRGlzcGxheWFibGUgaXRlbSkgewotCQkJc2V0SXRlbUNhbGxlZCA9IHRydWU7Ci0KLQkJCVNpbXBsZURpc3BsYXlhYmxlIG9sZEl0ZW0gPSB0aGlzLml0ZW07Ci0JCQl0aGlzLml0ZW0gPSBpdGVtOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChJVEVNX1BST1BFUlRZLCBvbGRJdGVtLCBpdGVtKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgU2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxTaW1wbGVEaXNwbGF5YWJsZT4gewotCi0JCXByaXZhdGUgU2ltcGxlRGlzcGxheWFibGUgaXRlbTsKLQkJcHJpdmF0ZSBib29sZWFuIGxpc3RlbmVyTm90aWZpZWQ7Ci0KLQkJdm9pZCBjbGVhckluZm8oKSB7Ci0JCQl0aGlzLmxpc3RlbmVyTm90aWZpZWQgPSBmYWxzZTsKLQkJCXRoaXMuaXRlbSA9IG51bGw7Ci0JCX0KLQotCQlTaW1wbGVEaXNwbGF5YWJsZSBnZXRJdGVtKCkgewotCQkJcmV0dXJuIGl0ZW07Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0xpc3RlbmVyTm90aWZpZWQoKSB7Ci0JCQlyZXR1cm4gbGlzdGVuZXJOb3RpZmllZDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlRXZlbnQ8U2ltcGxlRGlzcGxheWFibGU+IGUpIHsKLQkJCWxpc3RlbmVyTm90aWZpZWQgPSB0cnVlOwotCQkJaXRlbSA9IGUuc2VsZWN0ZWRJdGVtKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9zd3QvQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9zd3QvQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMzc5MzEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0NvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5Db21ib01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuU2ltcGxlRGlzcGxheWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb21ib01vZGVsQWRhcHRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdCB7Ci0KLQlwcml2YXRlIENvbWJvIGNvbWJvOwotCXByaXZhdGUgYm9vbGVhbiBlZGl0YWJsZTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKSB7Ci0KLQkJY29tYm8gPSBuZXcgQ29tYm8oc2hlbGwoKSwgU1dULk5VTEwpOwotCQllZGl0YWJsZSA9IHRydWU7Ci0KLQkJcmV0dXJuIENvbWJvTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJYnVpbGRMaXN0SG9sZGVyKCksCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKLQkJCWNvbWJvLAotCQkJYnVpbGRTdHJpbmdDb252ZXJ0ZXIoKQotCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKSB7Ci0KLQkJY29tYm8gPSBuZXcgQ29tYm8oc2hlbGwoKSwgU1dULlJFQURfT05MWSk7Ci0JCWVkaXRhYmxlID0gZmFsc2U7Ci0KLQkJcmV0dXJuIENvbWJvTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJYnVpbGRMaXN0SG9sZGVyKCksCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKLQkJCWNvbWJvLAotCQkJYnVpbGRTdHJpbmdDb252ZXJ0ZXIoKQotCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29tYm9TZWxlY3RlZEl0ZW0oKSB7Ci0JCXJldHVybiBjb21iby5nZXRUZXh0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW1wdHlDb21ib0NhbkhhdmVTZWxlY3RlZFZhbHVlKCkgewotCQlyZXR1cm4gZWRpdGFibGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBpdGVtQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmNvbWJvLmdldEl0ZW0oaW5kZXgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgaXRlbUNvdW50cygpIHsKLQkJcmV0dXJuIGNvbWJvLmdldEl0ZW1Db3VudCgpOwotCX0KLQotCUBBZnRlcgotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCWNvbWJvID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9zd3QvSnB0VWlTV1RUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0pwdFVpU1dUVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI3ZjVkMy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9zd3QvSnB0VWlTV1RUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkpVbml0NFRlc3RBZGFwdGVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlLlN1aXRlQ2xhc3NlczsKLQotQFN1aXRlQ2xhc3NlcwotKHsKLQlDb21ib01vZGVsQWRhcHRlclRlc3QuY2xhc3MsCi0JU3Bpbm5lck1vZGVsQWRhcHRlclRlc3QuY2xhc3MsCi0JVGFibGVNb2RlbEFkYXB0ZXJUZXN0LmNsYXNzCi19KQotQFJ1bldpdGgoU3VpdGUuY2xhc3MpCi1wdWJsaWMgZmluYWwgY2xhc3MgSnB0VWlTV1RUZXN0cyB7Ci0KLQlwcml2YXRlIEpwdFVpU1dUVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBKVW5pdDRUZXN0QWRhcHRlcihKcHRVaVNXVFRlc3RzLmNsYXNzKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9zd3QvU3Bpbm5lck1vZGVsQWRhcHRlclRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3N3dC9TcGlubmVyTW9kZWxBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDVkNWJiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3N3dC9TcGlubmVyTW9kZWxBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnN3dDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LlNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTcGlubmVyTW9kZWxBZGFwdGVyVGVzdCB7Ci0KLQlwcml2YXRlIE1vZGVsIG1vZGVsOwotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPiBzdWJqZWN0SG9sZGVyOwotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPiBidWlsZFN1YmplY3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPigpOwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNb2RlbCwgSW50ZWdlcj4oc3ViamVjdEhvbGRlciwgTW9kZWwuVkFMVUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VmFsdWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0VmFsdWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXNoZWxsICAgICAgICAgICAgICA9IG5ldyBTaGVsbChEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCW1vZGVsICAgICAgICAgICAgICA9IG5ldyBNb2RlbCgpOwotCQlzdWJqZWN0SG9sZGVyICAgICAgPSBidWlsZFN1YmplY3RIb2xkZXIoKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCX0KLQotCQlzaGVsbCAgICAgICAgID0gbnVsbDsKLQkJc3ViamVjdEhvbGRlciA9IG51bGw7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZWQoKSB7Ci0KLQkJaW50IHZhbHVlID0gMjsKLQkJbW9kZWwuc2V0VmFsdWUodmFsdWUpOwotCQltb2RlbC5jbGVhclNldFZhbHVlQ2FsbGVkRmxhZygpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihzaGVsbCwgU1dULk5VTEwpOwotCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciA9IGJ1aWxkVmFsdWVIb2xkZXIoKTsKLQkJaW50IGRlZmF1bHRWYWx1ZSA9IDE7Ci0KLQkJU3Bpbm5lck1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCW51bWJlckhvbGRlciwKLQkJCXNwaW5uZXIsCi0JCQlkZWZhdWx0VmFsdWUKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgY29taW5nIGZyb20gdGhlIG1vZGVsIiwKLQkJCXZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbnVtYmVyIGhvbGRlcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgbW9kZWwncyB2YWx1ZSIsCi0JCQltb2RlbC5nZXRWYWx1ZSgpLAotCQkJbnVtYmVySG9sZGVyLmdldFZhbHVlKCkKLQkJKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgbW9kZWwgc2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIHRoZSB2YWx1ZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24iLAotCQkJbW9kZWwuaXNTZXRWYWx1ZUNhbGxlZCgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSB2YWx1ZSBpbiB0aGUgbW9kZWwKLQkJc3Bpbm5lci5kaXNwb3NlKCk7Ci0KLQkJdmFsdWUgPSA0OwotCQltb2RlbC5zZXRWYWx1ZSh2YWx1ZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBtb2RlbCdzIHZhbHVlIHdhcyBzb21laG93IGNoYW5nZWQiLAotCQkJSW50ZWdlci52YWx1ZU9mKHZhbHVlKSwKLQkJCW1vZGVsLmdldFZhbHVlKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXphdGlvbl8xKCkgewotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyKHNoZWxsLCBTV1QuTlVMTCk7Ci0JCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPigpOwotCQlpbnQgZGVmYXVsdFZhbHVlID0gMTsKLQotCQlTcGlubmVyTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbnVtYmVySG9sZGVyLAotCQkJc3Bpbm5lciwKLQkJCWRlZmF1bHRWYWx1ZQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgZGVmYXVsdCB2YWx1ZSIsCi0JCQlkZWZhdWx0VmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0KLQkJYXNzZXJ0TnVsbCgKLQkJCSJUaGUgbnVtYmVyIGhvbGRlcidzIHZhbHVlIHNob3VsZCBiZSBudWxsIiwKLQkJCW51bWJlckhvbGRlci5nZXRWYWx1ZSgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6YXRpb25fMigpIHsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihzaGVsbCwgU1dULk5VTEwpOwotCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciA9IGJ1aWxkVmFsdWVIb2xkZXIoKTsKLQkJaW50IGRlZmF1bHRWYWx1ZSA9IDE7Ci0KLQkJU3Bpbm5lck1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCW51bWJlckhvbGRlciwKLQkJCXNwaW5uZXIsCi0JCQlkZWZhdWx0VmFsdWUKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgdGhlIGRlZmF1bHQgdmFsdWUiLAotCQkJZGVmYXVsdFZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydE51bGwoCi0JCQkiVGhlIG51bWJlciBob2xkZXIncyB2YWx1ZSBzaG91bGQgYmUgbnVsbCIsCi0JCQludW1iZXJIb2xkZXIuZ2V0VmFsdWUoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemF0aW9uXzMoKSB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIoc2hlbGwsIFNXVC5OVUxMKTsKLQkJTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIgPSBidWlsZFZhbHVlSG9sZGVyKCk7Ci0JCWludCBkZWZhdWx0VmFsdWUgPSAxOwotCi0JCVNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQludW1iZXJIb2xkZXIsCi0JCQlzcGlubmVyLAotCQkJZGVmYXVsdFZhbHVlCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IHZhbHVlIiwKLQkJCWRlZmF1bHRWYWx1ZSwKLQkJCXNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkKLQkJKTsKLQotCQlhc3NlcnROdWxsKAotCQkJIlRoZSBudW1iZXIgaG9sZGVyJ3MgdmFsdWUgc2hvdWxkIGJlIG51bGwiLAotCQkJbnVtYmVySG9sZGVyLmdldFZhbHVlKCkKLQkJKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgbW9kZWwgc2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIHRoZSB2YWx1ZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24iLAotCQkJbW9kZWwuaXNTZXRWYWx1ZUNhbGxlZCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6YXRpb25fNCgpIHsKLQotCQlpbnQgdmFsdWUgPSAyOwotCQltb2RlbC5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCW1vZGVsLmNsZWFyU2V0VmFsdWVDYWxsZWRGbGFnKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyKHNoZWxsLCBTV1QuTlVMTCk7Ci0JCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyID0gYnVpbGRWYWx1ZUhvbGRlcigpOwotCQlpbnQgZGVmYXVsdFZhbHVlID0gMTsKLQotCQlTcGlubmVyTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbnVtYmVySG9sZGVyLAotCQkJc3Bpbm5lciwKLQkJCWRlZmF1bHRWYWx1ZQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgdmFsdWUgY29taW5nIGZyb20gdGhlIG1vZGVsIiwKLQkJCXZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbnVtYmVyIGhvbGRlcidzIHZhbHVlIHNob3VsZCBiZSAiICsgdmFsdWUsCi0JCQlJbnRlZ2VyLnZhbHVlT2YodmFsdWUpLAotCQkJbnVtYmVySG9sZGVyLmdldFZhbHVlKCkKLQkJKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgbW9kZWwgc2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIHRoZSB2YWx1ZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24iLAotCQkJbW9kZWwuaXNTZXRWYWx1ZUNhbGxlZCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVDaGFuZ2VkKCkgewotCi0JCWludCB2YWx1ZSA9IDI7Ci0JCW1vZGVsLnNldFZhbHVlKHZhbHVlKTsKLQkJbW9kZWwuY2xlYXJTZXRWYWx1ZUNhbGxlZEZsYWcoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIoc2hlbGwsIFNXVC5OVUxMKTsKLQkJTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIgPSBidWlsZFZhbHVlSG9sZGVyKCk7Ci0JCWludCBkZWZhdWx0VmFsdWUgPSAxOwotCi0JCVNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQludW1iZXJIb2xkZXIsCi0JCQlzcGlubmVyLAotCQkJZGVmYXVsdFZhbHVlCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIGNvbWluZyBmcm9tIHRoZSBtb2RlbCIsCi0JCQl2YWx1ZSwKLQkJCXNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIG51bWJlciBob2xkZXIncyB2YWx1ZSBzaG91bGQgYmUgdGhlIG1vZGVsJ3MgdmFsdWUiLAotCQkJbW9kZWwuZ2V0VmFsdWUoKSwKLQkJCW51bWJlckhvbGRlci5nZXRWYWx1ZSgpCi0JCSk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIG1vZGVsIHNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCB0aGUgdmFsdWUgZHVyaW5nIGluaXRpYWxpemF0aW9uIiwKLQkJCW1vZGVsLmlzU2V0VmFsdWVDYWxsZWQoKQotCQkpOwotCi0JCS8vIENoYW5nZSB0aGUgdmFsdWUgaW4gdGhlIG1vZGVsCi0JCXZhbHVlID0gNDsKLQkJbW9kZWwuc2V0VmFsdWUodmFsdWUpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSBjb21pbmcgZnJvbSB0aGUgbW9kZWwiLAotCQkJdmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBtb2RlbCdzIHZhbHVlIHdhcyBzb21laG93IGNoYW5nZWQiLAotCQkJSW50ZWdlci52YWx1ZU9mKHZhbHVlKSwKLQkJCW1vZGVsLmdldFZhbHVlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2UgdGhlIHZhbHVlIGZyb20gdGhlIHNwaW5uZXIKLQkJdmFsdWUgPSA2OwotCQlzcGlubmVyLnNldFNlbGVjdGlvbih2YWx1ZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIHRoZSBuZXcgdmFsdWUgc2V0IiwKLQkJCXZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbW9kZWwncyB2YWx1ZSB3YXMgc3VwcG9zZWQgdG8gYmUgdXBkYXRlZCIsCi0JCQlJbnRlZ2VyLnZhbHVlT2YodmFsdWUpLAotCQkJbW9kZWwuZ2V0VmFsdWUoKQotCQkpOwotCi0JCS8vIERpc2Nvbm5lY3QgZnJvbSBtb2RlbAotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgZGVmYXVsdCB2YWx1ZSIsCi0JCQlkZWZhdWx0VmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQotCQlwcml2YXRlIGJvb2xlYW4gc2V0VmFsdWVDYWxsZWQ7Ci0JCXByaXZhdGUgSW50ZWdlciB2YWx1ZTsKLQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsKLQotCQl2b2lkIGNsZWFyU2V0VmFsdWVDYWxsZWRGbGFnKCkgewotCQkJc2V0VmFsdWVDYWxsZWQgPSBmYWxzZTsKLQkJfQotCi0JCUludGVnZXIgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQotCQlib29sZWFuIGlzU2V0VmFsdWVDYWxsZWQoKSB7Ci0JCQlyZXR1cm4gc2V0VmFsdWVDYWxsZWQ7Ci0JCX0KLQotCQl2b2lkIHNldFZhbHVlKEludGVnZXIgdmFsdWUpIHsKLQkJCXNldFZhbHVlQ2FsbGVkID0gdHJ1ZTsKLQotCQkJSW50ZWdlciBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGRWYWx1ZSwgdmFsdWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1RhYmxlTW9kZWxBZGFwdGVyVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1RhYmxlTW9kZWxBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTEwMmE5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3N3dC9UYWJsZU1vZGVsQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuQ29sdW1uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5UYWJsZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5UYWJsZU1vZGVsQWRhcHRlci5TZWxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5UYWJsZU1vZGVsQWRhcHRlci5TZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUYWJsZU1vZGVsQWRhcHRlclRlc3QgewotCi0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TWFuYWdlcj4gc3ViamVjdEhvbGRlcjsKLQotCXByaXZhdGUgQ29sdW1uQWRhcHRlcjxFbXBsb3llZT4gYnVpbGRDb2x1bW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFRhYmxlQ29sdW1uQWRhcHRlcigpOwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gYnVpbGRFbXBsb3llZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+KCk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFbXBsb3llZT4gYnVpbGRFbXBsb3llZUhvbGRlcnMoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RW1wbG95ZWU+KCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8TWFuYWdlciwgRW1wbG95ZWU+KHN1YmplY3RIb2xkZXIsIE1hbmFnZXIuRU1QTE9ZRUVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFbXBsb3llZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5lbXBsb3llZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmVtcGxveWVlc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIElUYWJsZUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFRhYmxlTGFiZWxQcm92aWRlcigpOwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RW1wbG95ZWU+IGJ1aWxkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoZmluYWwgQ29sbGVjdGlvbjxFbXBsb3llZT4gZW1wbG95ZWVzKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RW1wbG95ZWU+KCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VFdmVudDxFbXBsb3llZT4gZSkgewotCQkJCWVtcGxveWVlcy5jbGVhcigpOwotCQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZW1wbG95ZWVzLCBlLnNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TWFuYWdlcj4gYnVpbGRTdWJqZWN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxNYW5hZ2VyPigpOwotCX0KLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXNoZWxsICAgICAgICAgPSBuZXcgU2hlbGwoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQlzdWJqZWN0SG9sZGVyID0gYnVpbGRTdWJqZWN0SG9sZGVyKCk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQl9Ci0KLQkJc2hlbGwgICAgICAgICA9IG51bGw7Ci0JCXN1YmplY3RIb2xkZXIgPSBudWxsOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENoYW5nZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQluZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBNYWtlIHN1cmUgdGhlIFRhYmxlIHdhcyBwb3B1bGF0ZWQKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW1zIHNob3VsZCBiZSAzIiwgMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCS8vIENoYW5nZSB0aGUgbGlzdCBvZiBFbXBsb3llZXMKLQkJQXJyYXlMaXN0PEVtcGxveWVlPiBlbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigzKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTMpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMik7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5jaGFuZ2VFbXBsb3llZXMoZW1wbG95ZWVzKTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbXMgc2hvdWxkIGJlIDMiLCAzLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIDAsIGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkTWFuYWdlcjMsIGV4cGVjdGVkVGl0bGUzKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIDEsIGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkTWFuYWdlcjIsIGV4cGVjdGVkVGl0bGUyKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIDIsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDbGVhcmVkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gTWFrZSBzdXJlIHRoZSBUYWJsZSB3YXMgcG9wdWxhdGVkCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtcyBzaG91bGQgYmUgMyIsIDMsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQkvLyBUZXN0IHJlbW92aW5nIHRoZW0gYWxsCi0JCW1hbmFnZXIucmVtb3ZlQWxsRW1wbG95ZWVzKCk7Ci0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGxpc3QgaG9sZGVyIHNob3VsZCBoYXZlIGJlZW4gY2xlYXJlZCIsIDAsIGxpc3RIb2xkZXIuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIFRhYmxlIHNob3VsZCBoYXZlIGJlZW4gY2xlYXJlZCIsIDAsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJdGVtQWRkZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgYSBuZXcgRW1wbG95ZWUKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZSAgICA9ICJEYWxpIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlciA9ICJXVFAiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZSAgID0gInBsdWctaW4iOwotCi0JCUVtcGxveWVlIGVtcGxveWVlID0gbWFuYWdlci5hZGRFbXBsb3llZShleHBlY3RlZE5hbWUsIGV4cGVjdGVkVGl0bGUsIGV4cGVjdGVkTWFuYWdlcik7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgY3JlYXRlZCIsIGVtcGxveWVlKTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgVGFibGVJdGVtIHJlcHJlc2VudGluZyB0aGUgbmV3IEVtcGxveWVlCi0JCWludCBpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBuZXcgRW1wbG95ZWUgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAxIiwgMSwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleCwgZXhwZWN0ZWROYW1lLCBleHBlY3RlZE1hbmFnZXIsIGV4cGVjdGVkVGl0bGUpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEl0ZW1Nb3ZlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCi0JCS8vIE1ha2Ugc3VyZSB0aGUgRW1wbG95ZWVzIHdlcmUgYWRkZWQgdG8gdGhlIFRhYmxlCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAzIiwgMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCS8vIE1vdmUgYW4gRW1wbG95ZWUgdXAgdGhlIGxpc3QKLQkJbWFuYWdlci5tb3ZlRW1wbG95ZWVVcChlbXBsb3llZTIpOwotCi0JCWludCBpbmRleDEgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDEgd2FzIG5vdCBtb3ZlZCBpbiB0aGUgdGFibGUgbW9kZWwiLCAxLCBpbmRleDEpOwotCi0JCWludCBpbmRleDIgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUyKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDIgd2FzIG5vdCBtb3ZlZCBpbiB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleDIpOwotCi0JCWludCBpbmRleDMgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDMgc2hvdWxkIG5vdCBoYXZlIGJlZW4gbW92ZWQgaW4gdGhlIHRhYmxlIG1vZGVsIiwgMiwgaW5kZXgzKTsKLQotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgxLCBleHBlY3RlZE5hbWUxLCBleHBlY3RlZE1hbmFnZXIxLCBleHBlY3RlZFRpdGxlMSk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDIsIGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkTWFuYWdlcjIsIGV4cGVjdGVkVGl0bGUyKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MywgZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRNYW5hZ2VyMywgZXhwZWN0ZWRUaXRsZTMpOwotCi0JCS8vIE1vdmUgYW4gRW1wbG95ZWUgZG93biB0aGUgbGlzdAotCQltYW5hZ2VyLm1vdmVFbXBsb3llZURvd24oZW1wbG95ZWUxKTsKLQotCQlpbmRleDEgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDEgc2hvdWxkIG5vdCBoYXZlIGJlZW4gbW92ZWQgaW4gdGhlIHRhYmxlIG1vZGVsIiwgMiwgaW5kZXgxKTsKLQotCQlpbmRleDIgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUyKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDIgd2FzIG5vdCBtb3ZlZCBpbiB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleDIpOwotCi0JCWluZGV4MyA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMyB3YXMgbm90IG1vdmVkIGluIHRoZSB0YWJsZSBtb2RlbCIsIDEsIGluZGV4Myk7Ci0KLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MSwgZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRNYW5hZ2VyMSwgZXhwZWN0ZWRUaXRsZTEpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgyLCBleHBlY3RlZE5hbWUyLCBleHBlY3RlZE1hbmFnZXIyLCBleHBlY3RlZFRpdGxlMik7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDMsIGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkTWFuYWdlcjMsIGV4cGVjdGVkVGl0bGUzKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJdGVtUmVtb3ZlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBhIG5ldyBFbXBsb3llZQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lICAgID0gIkRhbGkiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyID0gIldUUCI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlICAgPSAicGx1Zy1pbiI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUgPSBtYW5hZ2VyLmFkZEVtcGxveWVlKGV4cGVjdGVkTmFtZSwgZXhwZWN0ZWRUaXRsZSwgZXhwZWN0ZWRNYW5hZ2VyKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBuZXcgRW1wbG95ZWUgd2FzIG5vdCBjcmVhdGVkIiwgZW1wbG95ZWUpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMSIsIDEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQkvLyBNYWtlIHN1cmUgaXQgd2FzIGFkZGVkIHRvIHRoZSBtb2RlbAotCQlpbnQgaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgYWRkZWQgdG8gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgsIGV4cGVjdGVkTmFtZSwgZXhwZWN0ZWRNYW5hZ2VyLCBleHBlY3RlZFRpdGxlKTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgVGFibGVJdGVtIHJlcHJlc2VudGluZyB0aGUgbmV3IEVtcGxveWVlCi0JCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSB0YWJsZS5nZXRJdGVtKGluZGV4KTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIk5vIFRhYmxlSXRlbSB3YXMgZm91bmQgZm9yIHRoZSBuZXcgRW1wbG95ZWUiLCB0YWJsZUl0ZW0pOwotCi0JCS8vIE5vdyB0ZXN0IHRoZSBpdGVtIGJlaW5nIHJlbW92ZWQKLQkJbWFuYWdlci5yZW1vdmVFbXBsb3llZShlbXBsb3llZSk7Ci0JCWluZGV4ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIHdhcyBub3QgcmVtb3ZlZCBmcm9tIHRoZSB0YWJsZSBtb2RlbCIsIC0xLCBpbmRleCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAwIiwgMCwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZXBsYWNlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBhIG5ldyBFbXBsb3llZQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbWFuYWdlci5hZGRFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgY3JlYXRlZCIsIGVtcGxveWVlMSk7Ci0KLQkJLy8gTWFrZSBzdXJlIGl0IHdhcyBhZGRlZCB0byB0aGUgbW9kZWwKLQkJaW50IGluZGV4MSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgYWRkZWQgdG8gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDEiLCAxLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIFRhYmxlSXRlbSByZXByZXNlbnRpbmcgdGhlIG5ldyBFbXBsb3llZQotCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGUuZ2V0SXRlbShpbmRleDEpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiTm8gVGFibGVJdGVtIHdhcyBmb3VuZCBmb3IgdGhlIG5ldyBFbXBsb3llZSIsIHRhYmxlSXRlbSk7Ci0KLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MSwgZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRNYW5hZ2VyMSwgZXhwZWN0ZWRUaXRsZTEpOwotCi0JCS8vIFJlcGxhY2UgdGhlIEVtcGxveWVlCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQltYW5hZ2VyLnJlcGxhY2UoZW1wbG95ZWUxLCBlbXBsb3llZTIpOwotCi0JCWludCBpbmRleDIgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUyKTsKLQkJQXNzZXJ0LmFzc2VydFNhbWUoIlRoZSBFbXBsb3llZSB0aGF0IGdvdCByZXBsYWNlZCBzaG91bGQgYmUgYXQgaW5kZXggIiArIGluZGV4MSwgaW5kZXgxLCBpbmRleDIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMSIsIDEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgyLCBleHBlY3RlZE5hbWUyLCBleHBlY3RlZE1hbmFnZXIyLCBleHBlY3RlZFRpdGxlMik7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbXNBZGRlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCi0JCS8vIFJldHJpZXZlIHRoZSBUYWJsZUl0ZW1zIHJlcHJlc2VudGluZyB0aGUgZW1wbG95ZWVzCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAzIiwgMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCWludCBpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMSB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDAsIGluZGV4KTsKLQotCQlpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMiB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDEsIGluZGV4KTsKLQotCQlpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMyB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDIsIGluZGV4KTsKLQotCQkvLyBNYWtlIHN1cmUgdGhlIFRhYmxlSXRlbSB3YXMgY29ycmVjdGx5IHBvcHVsYXRlZAotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgMCwgZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRNYW5hZ2VyMSwgZXhwZWN0ZWRUaXRsZTEpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgMSwgZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRNYW5hZ2VyMiwgZXhwZWN0ZWRUaXRsZTIpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgMiwgZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRNYW5hZ2VyMywgZXhwZWN0ZWRUaXRsZTMpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEl0ZW1zTW92ZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWU0ICAgID0gIkRhbGlfNCI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXI0ID0gIldUUF80IjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGU0ICAgPSAicGx1Zy1pbl80IjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lNSAgICA9ICJEYWxpXzUiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyNSA9ICJXVFBfNSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlNSAgID0gInBsdWctaW5fNSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTYgICAgPSAiRGFsaV82IjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjYgPSAiV1RQXzYiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTYgICA9ICJwbHVnLWluXzYiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0JCUVtcGxveWVlIGVtcGxveWVlNCA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWU0LCBleHBlY3RlZFRpdGxlNCwgZXhwZWN0ZWRNYW5hZ2VyNCk7Ci0JCUVtcGxveWVlIGVtcGxveWVlNSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWU1LCBleHBlY3RlZFRpdGxlNSwgZXhwZWN0ZWRNYW5hZ2VyNSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlNiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWU2LCBleHBlY3RlZFRpdGxlNiwgZXhwZWN0ZWRNYW5hZ2VyNik7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTQpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlNSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWU2KTsKLQotCQkvLyBNYWtlIHN1cmUgdGhlIEVtcGxveWVlcyB3ZXJlIGFkZGVkIHRvIHRoZSBUYWJsZQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgNiIsIDYsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQkvLyBNb3ZlIGFuIEVtcGxveWVlIHVwIHRoZSBsaXN0Ci0JCUFycmF5TGlzdDxFbXBsb3llZT4gZW1wbG95ZWVzID0gbmV3IEFycmF5TGlzdDxFbXBsb3llZT4oMyk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUzKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTQpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlNSk7Ci0JCW1hbmFnZXIubW92ZUVtcGxveWVlcyhlbXBsb3llZXMsIDApOwotCi0JCWludCBpbmRleDEgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUxKTsKLQkJaW50IGluZGV4MiA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTIpOwotCQlpbnQgaW5kZXgzID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMyk7Ci0JCWludCBpbmRleDQgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWU0KTsKLQkJaW50IGluZGV4NSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTUpOwotCQlpbnQgaW5kZXg2ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlNik7Ci0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDEgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDMsIGluZGV4MSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAyIGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCA0LCBpbmRleDIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMyBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMCwgaW5kZXgzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDQgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDEsIGluZGV4NCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSA1IGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCAyLCBpbmRleDUpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgNiBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgNSwgaW5kZXg2KTsKLQotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgxLCBleHBlY3RlZE5hbWUxLCBleHBlY3RlZE1hbmFnZXIxLCBleHBlY3RlZFRpdGxlMSk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDIsIGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkTWFuYWdlcjIsIGV4cGVjdGVkVGl0bGUyKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MywgZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRNYW5hZ2VyMywgZXhwZWN0ZWRUaXRsZTMpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXg0LCBleHBlY3RlZE5hbWU0LCBleHBlY3RlZE1hbmFnZXI0LCBleHBlY3RlZFRpdGxlNCk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDUsIGV4cGVjdGVkTmFtZTUsIGV4cGVjdGVkTWFuYWdlcjUsIGV4cGVjdGVkVGl0bGU1KTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4NiwgZXhwZWN0ZWROYW1lNiwgZXhwZWN0ZWRNYW5hZ2VyNiwgZXhwZWN0ZWRUaXRsZTYpOwotCi0JCS8vIE1vdmUgYW4gRW1wbG95ZWUgZG93biB0aGUgbGlzdAotCQllbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigyKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTEpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIubW92ZUVtcGxveWVlcyhlbXBsb3llZXMsIDQpOwotCi0JCWluZGV4MSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlpbmRleDIgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUyKTsKLQkJaW5kZXgzID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMyk7Ci0JCWluZGV4NCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTQpOwotCQlpbmRleDUgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWU1KTsKLQkJaW5kZXg2ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlNik7Ci0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDEgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDQsIGluZGV4MSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAyIGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCA1LCBpbmRleDIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMyBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMCwgaW5kZXgzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDQgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDEsIGluZGV4NCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSA1IGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCAyLCBpbmRleDUpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgNiBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMywgaW5kZXg2KTsKLQotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgxLCBleHBlY3RlZE5hbWUxLCBleHBlY3RlZE1hbmFnZXIxLCBleHBlY3RlZFRpdGxlMSk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDIsIGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkTWFuYWdlcjIsIGV4cGVjdGVkVGl0bGUyKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MywgZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRNYW5hZ2VyMywgZXhwZWN0ZWRUaXRsZTMpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXg0LCBleHBlY3RlZE5hbWU0LCBleHBlY3RlZE1hbmFnZXI0LCBleHBlY3RlZFRpdGxlNCk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDUsIGV4cGVjdGVkTmFtZTUsIGV4cGVjdGVkTWFuYWdlcjUsIGV4cGVjdGVkVGl0bGU1KTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4NiwgZXhwZWN0ZWROYW1lNiwgZXhwZWN0ZWRNYW5hZ2VyNiwgZXhwZWN0ZWRUaXRsZTYpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEl0ZW1zUmVtb3ZlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCi0JCS8vIFJldHJpZXZlIHRoZSBUYWJsZUl0ZW1zIHJlcHJlc2VudGluZyB0aGUgZW1wbG95ZWVzCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAzIiwgMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCWludCBpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMSB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDAsIGluZGV4KTsKLQotCQlpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMiB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDEsIGluZGV4KTsKLQotCQlpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMyB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDIsIGluZGV4KTsKLQotCQkvLyBSZW1vdmUgMiBpdGVtcwotCQlBcnJheUxpc3Q8RW1wbG95ZWU+IGVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KDIpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMSk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUzKTsKLQkJbWFuYWdlci5yZW1vdmVFbXBsb3llZXMoZW1wbG95ZWVzKTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMSIsIDEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgYSBuZXcgRW1wbG95ZWUKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZSAgICA9ICJEYWxpIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlciA9ICJXVFAiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZSAgID0gInBsdWctaW4iOwotCi0JCUVtcGxveWVlIGVtcGxveWVlID0gbWFuYWdlci5hZGRFbXBsb3llZShleHBlY3RlZE5hbWUsIGV4cGVjdGVkVGl0bGUsIGV4cGVjdGVkTWFuYWdlcik7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgY3JlYXRlZCIsIGVtcGxveWVlKTsKLQotCQkvLyBNYWtlIHN1cmUgaXQgd2FzIGFkZGVkIHRvIHRoZSBtb2RlbAotCQlpbnQgaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgYWRkZWQgdG8gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMSIsIDEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgVGFibGVJdGVtIHJlcHJlc2VudGluZyB0aGUgbmV3IEVtcGxveWVlCi0JCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSB0YWJsZS5nZXRJdGVtKGluZGV4KTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIk5vIFRhYmxlSXRlbSB3YXMgZm91bmQgZm9yIHRoZSBuZXcgRW1wbG95ZWUiLCB0YWJsZUl0ZW0pOwotCi0JCS8vIE5hbWUgcHJvcGVydHkKLQkJU3RyaW5nIGFjdHVhbE5hbWUgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bTkFNRV9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkTmFtZSwgYWN0dWFsTmFtZSk7Ci0KLQkJZXhwZWN0ZWROYW1lID0gIkpwdCI7Ci0JCWVtcGxveWVlLnNldE5hbWUoZXhwZWN0ZWROYW1lKTsKLQotCQlhY3R1YWxOYW1lID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLk5BTUVfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW05BTUVfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZE5hbWUsIGFjdHVhbE5hbWUpOwotCi0JCS8vIE1hbmFnZXIgcHJvcGVydHkKLQkJU3RyaW5nIGFjdHVhbE1hbmFnZXIgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuTUFOQUdFUl9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bTUFOQUdFUl9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkTWFuYWdlciwgYWN0dWFsTWFuYWdlcik7Ci0KLQkJZXhwZWN0ZWRNYW5hZ2VyID0gImJvc3MiOwotCQllbXBsb3llZS5zZXRNYW5hZ2VyKGV4cGVjdGVkTWFuYWdlcik7Ci0KLQkJYWN0dWFsTWFuYWdlciA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5NQU5BR0VSX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtNQU5BR0VSX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWRNYW5hZ2VyLCBhY3R1YWxNYW5hZ2VyKTsKLQotCQkvLyBUaXRsZSBwcm9wZXJ0eQotCQlTdHJpbmcgYWN0dWFsVGl0bGUgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuVElUTEVfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW1RJVExFX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWRUaXRsZSwgYWN0dWFsVGl0bGUpOwotCi0JCWV4cGVjdGVkVGl0bGUgPSAiRWNsaXBzZUxpbmsiOwotCQllbXBsb3llZS5zZXRUaXRsZShleHBlY3RlZFRpdGxlKTsKLQotCQlhY3R1YWxUaXRsZSA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5USVRMRV9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bVElUTEVfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZFRpdGxlLCBhY3R1YWxUaXRsZSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0ZWRJdGVtc0FkZGVkUmVtb3ZlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1zSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcnMoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbXNIb2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBUZXN0IGFkZGluZyBzZWxlY3RlZCBpdGVtcwotCQlBcnJheUxpc3Q8RW1wbG95ZWU+IGVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KDIpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMSk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUzKTsKLQkJc2VsZWN0ZWRJdGVtc0hvbGRlci5hZGRBbGwoZW1wbG95ZWVzKTsKLQotCQlDb2xsZWN0aW9uPEVtcGxveWVlPiBhY3R1YWxFbXBsb3llZXMgPSB0YWJsZU1vZGVsLnNlbGVjdGVkSXRlbXMoKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIGl0ZW1zIGNhbid0IGJlIG51bGwiLCBhY3R1YWxFbXBsb3llZXMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgY291bnQgb2Ygc2VsZWN0ZWQgaXRlbXMgc2hvdWxkIGJlIDIiLCAyLCBhY3R1YWxFbXBsb3llZXMuc2l6ZSgpKTsKLQotCQlhY3R1YWxFbXBsb3llZXMucmVtb3ZlKGVtcGxveWVlMSk7Ci0JCWFjdHVhbEVtcGxveWVlcy5yZW1vdmUoZW1wbG95ZWUzKTsKLQotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW1zIHdhcyBub3QgcmV0cmlldmVkIGNvcnJlY3RseSIsIGFjdHVhbEVtcGxveWVlcy5pc0VtcHR5KCkpOwotCi0JCS8vIFRlc3QgcmVtb3Zpbmcgc2VsZWN0ZWQgaXRlbXMKLQkJc2VsZWN0ZWRJdGVtc0hvbGRlci5yZW1vdmUoZW1wbG95ZWUxKTsKLQotCQlhY3R1YWxFbXBsb3llZXMgPSB0YWJsZU1vZGVsLnNlbGVjdGVkSXRlbXMoKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIGl0ZW1zIGNhbid0IGJlIG51bGwiLCBhY3R1YWxFbXBsb3llZXMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgY291bnQgb2Ygc2VsZWN0ZWQgaXRlbXMgc2hvdWxkIGJlIDEiLCAxLCBhY3R1YWxFbXBsb3llZXMuc2l6ZSgpKTsKLQotCQlhY3R1YWxFbXBsb3llZXMucmVtb3ZlKGVtcGxveWVlMyk7Ci0KLQkJQXNzZXJ0LmFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtcyB3YXMgbm90IHJldHJpZXZlZCBjb3JyZWN0bHkiLCBhY3R1YWxFbXBsb3llZXMuaXNFbXB0eSgpKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZWxlY3RlZEl0ZW1zQ2xlYXJlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1zSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcnMoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbXNIb2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBUZXN0IGFkZGluZyBzZWxlY3RlZCBpdGVtcwotCQlBcnJheUxpc3Q8RW1wbG95ZWU+IGVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KDIpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMSk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUzKTsKLQkJc2VsZWN0ZWRJdGVtc0hvbGRlci5hZGRBbGwoZW1wbG95ZWVzKTsKLQotCQlDb2xsZWN0aW9uPEVtcGxveWVlPiBhY3R1YWxFbXBsb3llZXMgPSB0YWJsZU1vZGVsLnNlbGVjdGVkSXRlbXMoKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIGl0ZW1zIGNhbid0IGJlIG51bGwiLCBhY3R1YWxFbXBsb3llZXMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgY291bnQgb2Ygc2VsZWN0ZWQgaXRlbXMgc2hvdWxkIGJlIDIiLCAyLCBhY3R1YWxFbXBsb3llZXMuc2l6ZSgpKTsKLQotCQlhY3R1YWxFbXBsb3llZXMucmVtb3ZlKGVtcGxveWVlMSk7Ci0JCWFjdHVhbEVtcGxveWVlcy5yZW1vdmUoZW1wbG95ZWUzKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtcyB3YXMgbm90IHJldHJpZXZlZCBjb3JyZWN0bHkiLCBhY3R1YWxFbXBsb3llZXMuaXNFbXB0eSgpKTsKLQotCQkvLyBUZXN0IHJlbW92aW5nIHNlbGVjdGVkIGl0ZW1zCi0JCXNlbGVjdGVkSXRlbXNIb2xkZXIuY2xlYXIoKTsKLQotCQlhY3R1YWxFbXBsb3llZXMgPSB0YWJsZU1vZGVsLnNlbGVjdGVkSXRlbXMoKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIGl0ZW1zIGNhbid0IGJlIG51bGwiLCBhY3R1YWxFbXBsb3llZXMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgY291bnQgb2Ygc2VsZWN0ZWQgaXRlbXMgc2hvdWxkIGJlICIsIDAsIGFjdHVhbEVtcGxveWVlcy5zaXplKCkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpLAotCQkJYnVpbGRFbXBsb3llZUhvbGRlcigpLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJQ29sbGVjdGlvbjxFbXBsb3llZT4gZW1wbG95ZWVzID0gbmV3IEFycmF5TGlzdDxFbXBsb3llZT4oKTsKLQkJdGFibGVNb2RlbC5hZGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihidWlsZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGVtcGxveWVlcykpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCi0JCS8vIFRlc3QgYWRkaW5nIHNlbGVjdGVkIGl0ZW1zCi0JCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W10geyAwLCAyIH0pOwotCi0JCS8vIEl0IHNlZW1zIGEgbWFudWFsIHNlbGVjdGlvbiBkb2Vzbid0IHNlbmQgYW55IHNlbGVjdGlvbiBldmVudAotCQl0YWJsZU1vZGVsLnRhYmxlU2VsZWN0aW9uQ2hhbmdlZChudWxsKTsKLQotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgaXRlbXMgY2FuJ3QgYmUgbnVsbCIsIGVtcGxveWVlcyk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBjb3VudCBvZiBzZWxlY3RlZCBpdGVtcyBzaG91bGQgYmUgMiIsIDIsIGVtcGxveWVlcy5zaXplKCkpOwotCi0JCWVtcGxveWVlcy5yZW1vdmUoZW1wbG95ZWUxKTsKLQkJZW1wbG95ZWVzLnJlbW92ZShlbXBsb3llZTMpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW1zIHdhcyBub3QgcmV0cmlldmVkIGNvcnJlY3RseSIsIGVtcGxveWVlcy5pc0VtcHR5KCkpOwotCi0JCS8vIFRlc3QgYWRkaW5nIHNlbGVjdGVkIGl0ZW1zCi0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUxKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTMpOwotCQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCi0JCS8vIEl0IHNlZW1zIGEgbWFudWFsIHNlbGVjdGlvbiBkb2Vzbid0IHNlbmQgYW55IHNlbGVjdGlvbiBldmVudAotCQl0YWJsZU1vZGVsLnRhYmxlU2VsZWN0aW9uQ2hhbmdlZChudWxsKTsKLQotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgaXRlbXMgY2FuJ3QgYmUgbnVsbCIsIGVtcGxveWVlcyk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBjb3VudCBvZiBzZWxlY3RlZCBpdGVtcyBzaG91bGQgYmUgMCIsIDAsIGVtcGxveWVlcy5zaXplKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0VGFibGVJdGVtUHJvcGVydGllcyhUYWJsZSB0YWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWROYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRUaXRsZSkKLQl7Ci0JCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSB0YWJsZS5nZXRJdGVtKGluZGV4KTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIk5vIFRhYmxlSXRlbSB3YXMgZm91bmQgZm9yIHRoZSBFbXBsb3llZSIsIHRhYmxlSXRlbSk7Ci0KLQkJU3RyaW5nIGFjdHVhbE5hbWUgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bTkFNRV9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkTmFtZSwgYWN0dWFsTmFtZSk7Ci0KLQkJU3RyaW5nIGFjdHVhbFRpdGxlID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLlRJVExFX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtUSVRMRV9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkVGl0bGUsIGFjdHVhbFRpdGxlKTsKLQotCQlTdHJpbmcgYWN0dWFsTWFuYWdlciA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5NQU5BR0VSX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtNQU5BR0VSX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWRNYW5hZ2VyLCBhY3R1YWxNYW5hZ2VyKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEVtcGxveWVlIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgbWFuYWdlcjsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBTdHJpbmcgdGl0bGU7Ci0KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBNQU5BR0VSX1BST1BFUlRZID0gIm1hbmFnZXIiOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEVfUFJPUEVSVFkgPSAidGl0bGUiOwotCi0JCUVtcGxveWVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtYW5hZ2VyKSB7Ci0JCQlzdXBlcigpOwotCi0JCQl0aGlzLm5hbWUgICAgPSBuYW1lOwotCQkJdGhpcy50aXRsZSAgID0gdGl0bGU7Ci0JCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCQl9Ci0KLQkJU3RyaW5nIGdldE1hbmFnZXIoKSB7Ci0JCQlyZXR1cm4gbWFuYWdlcjsKLQkJfQotCi0JCVN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCQlyZXR1cm4gdGl0bGU7Ci0JCX0KLQotCQl2b2lkIHNldE1hbmFnZXIoU3RyaW5nIG1hbmFnZXIpIHsKLQkJCVN0cmluZyBvbGRNYW5hZ2VyID0gdGhpcy5tYW5hZ2VyOwotCQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFOQUdFUl9QUk9QRVJUWSwgb2xkTWFuYWdlciwgbWFuYWdlcik7Ci0JCX0KLQotCQl2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmFtZSk7Ci0JCX0KLQotCQl2b2lkIHNldFRpdGxlKFN0cmluZyB0aXRsZSkgewotCQkJU3RyaW5nIG9sZFRpdGxlID0gdGhpcy50aXRsZTsKLQkJCXRoaXMudGl0bGUgPSB0aXRsZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVElUTEVfUFJPUEVSVFksIG9sZFRpdGxlLCB0aXRsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIE1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQotCQlwcml2YXRlIExpc3Q8RW1wbG95ZWU+IGVtcGxveWVlczsKLQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVNUExPWUVFU19MSVNUID0gImVtcGxveWVlcyI7Ci0KLQkJTWFuYWdlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCQllbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigpOwotCQl9Ci0KLQkJRW1wbG95ZWUgYWRkRW1wbG95ZWUoRW1wbG95ZWUgZW1wbG95ZWUpIHsKLQkJCWFkZEl0ZW1Ub0xpc3QoZW1wbG95ZWUsIGVtcGxveWVlcywgRU1QTE9ZRUVTX0xJU1QpOwotCQkJcmV0dXJuIGVtcGxveWVlOwotCQl9Ci0KLQkJRW1wbG95ZWUgYWRkRW1wbG95ZWUoU3RyaW5nIG5hbWUsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1hbmFnZXIpIHsKLQkJCUVtcGxveWVlIGVtcGxveWVlID0gbmV3IEVtcGxveWVlKG5hbWUsIHRpdGxlLCBtYW5hZ2VyKTsKLQkJCXJldHVybiBhZGRFbXBsb3llZShlbXBsb3llZSk7Ci0JCX0KLQotCQl2b2lkIGNoYW5nZUVtcGxveWVlcyhMaXN0PEVtcGxveWVlPiBuZXdFbXBsb3llZXMpIHsKLQkJCXRoaXMuc3luY2hyb25pemVMaXN0KG5ld0VtcGxveWVlcywgdGhpcy5lbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJfQotCi0JCUxpc3RJdGVyYXRvcjxFbXBsb3llZT4gZW1wbG95ZWVzKCkgewotCQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxFbXBsb3llZT4oZW1wbG95ZWVzKTsKLQkJfQotCi0JCWludCBlbXBsb3llZXNTaXplKCkgewotCQkJcmV0dXJuIGVtcGxveWVlcy5zaXplKCk7Ci0JCX0KLQotCQl2b2lkIG1vdmVFbXBsb3llZURvd24oRW1wbG95ZWUgZW1wbG95ZWUpIHsKLQkJCWludCBpbmRleCA9IGVtcGxveWVlcy5pbmRleE9mKGVtcGxveWVlKTsKLQkJCW1vdmVJdGVtSW5MaXN0KGluZGV4ICsgMSwgaW5kZXgsIGVtcGxveWVlcywgRU1QTE9ZRUVTX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCBtb3ZlRW1wbG95ZWVzKENvbGxlY3Rpb248RW1wbG95ZWU+IGVtcGxveWVlcywgaW50IHRhcmdldEluZGV4KSB7Ci0KLQkJCWludCBzb3VyY2VJbmRleCA9IEludGVnZXIuTUFYX1ZBTFVFOwotCi0JCQlmb3IgKEVtcGxveWVlIGVtcGxveWVlIDogZW1wbG95ZWVzKSB7Ci0JCQkJc291cmNlSW5kZXggPSBNYXRoLm1pbihzb3VyY2VJbmRleCwgdGhpcy5lbXBsb3llZXMuaW5kZXhPZihlbXBsb3llZSkpOwotCQkJfQotCi0JCQltb3ZlSXRlbXNJbkxpc3QoCi0JCQkJdGFyZ2V0SW5kZXgsCi0JCQkJc291cmNlSW5kZXgsCi0JCQkJZW1wbG95ZWVzLnNpemUoKSwKLQkJCQl0aGlzLmVtcGxveWVlcywKLQkJCQlFTVBMT1lFRVNfTElTVAotCQkJKTsKLQkJfQotCi0JCXZvaWQgbW92ZUVtcGxveWVlVXAoRW1wbG95ZWUgZW1wbG95ZWUpIHsKLQkJCWludCBpbmRleCA9IGVtcGxveWVlcy5pbmRleE9mKGVtcGxveWVlKTsKLQkJCW1vdmVJdGVtSW5MaXN0KGluZGV4IC0gMSwgaW5kZXgsIGVtcGxveWVlcywgRU1QTE9ZRUVTX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCByZW1vdmVBbGxFbXBsb3llZXMoKSB7Ci0JCQljbGVhckxpc3QoZW1wbG95ZWVzLCBFTVBMT1lFRVNfTElTVCk7Ci0JCX0KLQotCQl2b2lkIHJlbW92ZUVtcGxveWVlKEVtcGxveWVlIGVtcGxveWVlKSB7Ci0JCQlyZW1vdmVJdGVtRnJvbUxpc3QoZW1wbG95ZWUsIGVtcGxveWVlcywgRU1QTE9ZRUVTX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCByZW1vdmVFbXBsb3llZXMoQ29sbGVjdGlvbjxFbXBsb3llZT4gZW1wbG95ZWVzKSB7Ci0JCQlyZW1vdmVJdGVtc0Zyb21MaXN0KGVtcGxveWVlcy5pdGVyYXRvcigpLCB0aGlzLmVtcGxveWVlcywgRU1QTE9ZRUVTX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCByZXBsYWNlKEVtcGxveWVlIG9sZEVtcGxveWVlLCBFbXBsb3llZSBuZXdFbXBsb3llZSkgewotCQkJcmVwbGFjZUl0ZW1Jbkxpc3Qob2xkRW1wbG95ZWUsIG5ld0VtcGxveWVlLCBlbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFibGVDb2x1bW5BZGFwdGVyIGltcGxlbWVudHMgQ29sdW1uQWRhcHRlcjxFbXBsb3llZT4gewotCi0JCXN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0NPVU5UID0gMzsKLQkJc3RhdGljIGZpbmFsIGludCBNQU5BR0VSX0NPTFVNTiA9IDI7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgTkFNRV9DT0xVTU4gPSAwOwotCQlzdGF0aWMgZmluYWwgaW50IFRJVExFX0NPTFVNTiA9IDE7Ci0KLQkJcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRNYW5hZ2VySG9sZGVyKEVtcGxveWVlIHN1YmplY3QpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVtcGxveWVlLCBTdHJpbmc+KEVtcGxveWVlLk1BTkFHRVJfUFJPUEVSVFksIHN1YmplY3QpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRNYW5hZ2VyKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQlzdWJqZWN0LnNldE1hbmFnZXIodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVIb2xkZXIoRW1wbG95ZWUgc3ViamVjdCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1wbG95ZWUsIFN0cmluZz4oRW1wbG95ZWUuTkFNRV9QUk9QRVJUWSwgc3ViamVjdCkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBzdWJqZWN0LmdldE5hbWUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGl0bGVIb2xkZXIoRW1wbG95ZWUgc3ViamVjdCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1wbG95ZWUsIFN0cmluZz4oRW1wbG95ZWUuVElUTEVfUFJPUEVSVFksIHN1YmplY3QpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRUaXRsZSgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJc3ViamVjdC5zZXRUaXRsZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXB1YmxpYyBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gY2VsbE1vZGVscyhFbXBsb3llZSBzdWJqZWN0KSB7Ci0JCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gaG9sZGVycyA9IG5ldyBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+WzNdOwotCQkJaG9sZGVyc1tOQU1FX0NPTFVNTl0gPSBidWlsZE5hbWVIb2xkZXIoc3ViamVjdCk7Ci0JCQlob2xkZXJzW1RJVExFX0NPTFVNTl0gPSBidWlsZFRpdGxlSG9sZGVyKHN1YmplY3QpOwotCQkJaG9sZGVyc1tNQU5BR0VSX0NPTFVNTl0gPSBidWlsZE1hbmFnZXJIb2xkZXIoc3ViamVjdCk7Ci0JCQlyZXR1cm4gaG9sZGVyczsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29sdW1uQ291bnQoKSB7Ci0JCQlyZXR1cm4gQ09MVU1OX0NPVU5UOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBjb2x1bW5OYW1lKGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGNvbHVtbkluZGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJRW1wbG95ZWUgZW1wbG95ZWUgPSAoRW1wbG95ZWUpIGVsZW1lbnQ7Ci0KLQkJCWlmIChjb2x1bW5JbmRleCA9PSBUYWJsZUNvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU4pIHsKLQkJCQlyZXR1cm4gZW1wbG95ZWUuZ2V0TmFtZSgpOwotCQkJfQotCi0JCQlpZiAoY29sdW1uSW5kZXggPT0gVGFibGVDb2x1bW5BZGFwdGVyLlRJVExFX0NPTFVNTikgewotCQkJCXJldHVybiBlbXBsb3llZS5nZXRUaXRsZSgpOwotCQkJfQotCi0JCQlyZXR1cm4gZW1wbG95ZWUuZ2V0TWFuYWdlcigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZU1vZGVsIGV4dGVuZHMgVGFibGVNb2RlbEFkYXB0ZXI8RW1wbG95ZWU+IHsKLQotCQlUYWJsZU1vZGVsKExpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyLAotCQkgICAgICAgICAgIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1zSG9sZGVyLAotCQkgICAgICAgICAgIFRhYmxlIHRhYmxlLAotCQkgICAgICAgICAgIENvbHVtbkFkYXB0ZXI8RW1wbG95ZWU+IGNvbHVtbkFkYXB0ZXIsCi0JCSAgICAgICAgICAgSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0KLQkJCXN1cGVyKGxpc3RIb2xkZXIsCi0JCQkgICAgICBzZWxlY3RlZEl0ZW1zSG9sZGVyLAotCQkJICAgICAgdGFibGUsCi0JCQkgICAgICBjb2x1bW5BZGFwdGVyLAotCQkJICAgICAgbGFiZWxQcm92aWRlcik7Ci0JCX0KLQotCQlUYWJsZU1vZGVsKExpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyLAotCQkgICAgICAgICAgIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJICAgICAgICAgICBUYWJsZSB0YWJsZSwKLQkJICAgICAgICAgICBDb2x1bW5BZGFwdGVyPEVtcGxveWVlPiBjb2x1bW5BZGFwdGVyLAotCQkgICAgICAgICAgIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCQlzdXBlcihsaXN0SG9sZGVyLAotCQkJCQluZXcgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RW1wbG95ZWU+KHNlbGVjdGVkSXRlbUhvbGRlciksCi0JCQkgICAgICB0YWJsZSwKLQkJCSAgICAgIGNvbHVtbkFkYXB0ZXIsCi0JCQkgICAgICBsYWJlbFByb3ZpZGVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgaW50IGluZGV4T2YoRW1wbG95ZWUgaXRlbSkgewotCQkJcmV0dXJuIHN1cGVyLmluZGV4T2YoaXRlbSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb248RW1wbG95ZWU+IHNlbGVjdGVkSXRlbXMoKSB7Ci0JCQlyZXR1cm4gc3VwZXIuc2VsZWN0ZWRJdGVtcygpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHRhYmxlU2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJc3VwZXIudGFibGVTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3N3dC9UcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9zd3QvVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmI4MDc4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3N3dC9UcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRGVmYXVsdFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlRyaVN0YXRlQ2hlY2tCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIHRyaS1zdGF0ZSBjaGVjayBib3hlcy4KLSAqLwotcHVibGljIGNsYXNzIFRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JcHJpdmF0ZSBmaW5hbCBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgZmluYWwgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHRlc3RNb2RlbEhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZmxhZzFIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGZsYWcySG9sZGVyOwotCXByaXZhdGUgZmluYWwgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBub3RGbGFnMkhvbGRlcjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlXaW5kb3cgd2luZG93ID0gbmV3IFRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIFRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QoU3RyaW5nW10gYXJncykgewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy50ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKEJvb2xlYW4uVFJVRSwgQm9vbGVhbi5GQUxTRSk7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+KHRoaXMudGVzdE1vZGVsKTsKLQkJdGhpcy5mbGFnMUhvbGRlciA9IHRoaXMuYnVpbGRGbGFnMUhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMuZmxhZzJIb2xkZXIgPSB0aGlzLmJ1aWxkRmxhZzJIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLm5vdEZsYWcySG9sZGVyID0gdGhpcy5idWlsZE5vdEZsYWcySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRGbGFnMUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgVGVzdE1vZGVsLkZMQUcxX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuaXNGbGFnMSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRGbGFnMSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRmxhZzJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIFRlc3RNb2RlbC5GTEFHMl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmlzRmxhZzIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzIodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE5vdEZsYWcySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBUZXN0TW9kZWwuTk9UX0ZMQUcyX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuaXNOb3RGbGFnMigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXROb3RGbGFnMih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkoKFNoZWxsKSBwYXJlbnQpLnNldFRleHQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCXBhcmVudC5zZXRTaXplKDQwMCwgMTAwKTsKLQkJQ29tcG9zaXRlIG1haW5QYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW1haW5QYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgY2hlY2tCb3hQYW5lbCA9IHRoaXMuYnVpbGRDaGVja0JveFBhbmVsKG1haW5QYW5lbCk7Ci0JCXRoaXMuYnVpbGRDb250cm9sUGFuZWwobWFpblBhbmVsLCBjaGVja0JveFBhbmVsKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRDaGVja0JveFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTM1KTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRGbGFnMUNoZWNrQm94KHBhbmVsKTsKLQkJdGhpcy5idWlsZEZsYWcyQ2hlY2tCb3gocGFuZWwpOwotCQl0aGlzLmJ1aWxkTm90RmxhZzJDaGVja0JveChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRVbmF0dGFjaGVkQ2hlY2tCb3gocGFuZWwpOwotCi0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRGbGFnMUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVHJpU3RhdGVDaGVja0JveCBjaGVja0JveCA9IG5ldyBUcmlTdGF0ZUNoZWNrQm94KHBhcmVudCwgImZsYWcgMSIsIERlZmF1bHRXaWRnZXRGYWN0b3J5Lmluc3RhbmNlKCkpOwotCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyLmFkYXB0KHRoaXMuZmxhZzFIb2xkZXIsIGNoZWNrQm94KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRGbGFnMkNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVHJpU3RhdGVDaGVja0JveCBjaGVja0JveCA9IG5ldyBUcmlTdGF0ZUNoZWNrQm94KHBhcmVudCwgImZsYWcgMiIsIERlZmF1bHRXaWRnZXRGYWN0b3J5Lmluc3RhbmNlKCkpOwotCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyLmFkYXB0KHRoaXMuZmxhZzJIb2xkZXIsIGNoZWNrQm94KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGROb3RGbGFnMkNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVHJpU3RhdGVDaGVja0JveCBjaGVja0JveCA9IG5ldyBUcmlTdGF0ZUNoZWNrQm94KHBhcmVudCwgIm5leHQgZmxhZyAyIiwgRGVmYXVsdFdpZGdldEZhY3RvcnkuaW5zdGFuY2UoKSk7Ci0JCVRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIuYWRhcHQodGhpcy5ub3RGbGFnMkhvbGRlciwgY2hlY2tCb3gpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFVuYXR0YWNoZWRDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsICJ1bmF0dGFjaGVkIiwgRGVmYXVsdFdpZGdldEZhY3RvcnkuaW5zdGFuY2UoKSk7Ci0JCWNoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRVbmF0dGFjaGVkU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFVuYXR0YWNoZWRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmF0dGFjaGVkIGRlZmF1bHQgc2VsZWN0ZWQ6ICIgKyBlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuYXR0YWNoZWQgc2VsZWN0ZWQ6ICIgKyBlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCBjaGVja0JveFBhbmVsKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY2hlY2tCb3hQYW5lbCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRGbGlwRmxhZzFCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkUHJpbnRNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRmxpcEZsYWcxQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZEZsaXBGbGFnMUFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRGbGlwRmxhZzFBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJuZXh0IGZsYWcgMSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5uZXh0RmxhZzEoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJuZXh0IGZsYWcgMSIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIG5leHRGbGFnMSgpIHsKLQkJdGhpcy50ZXN0TW9kZWwubmV4dEZsYWcxKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRDbGVhck1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjbGVhciBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlc3RvcmVNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInJlc3RvcmUgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVzdG9yZSBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0TW9kZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFByaW50TW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkUHJpbnRNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRQcmludE1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicHJpbnQgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucHJpbnRNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInByaW50IG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgcHJpbnRNb2RlbCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJmbGFnIDE6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcxKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImZsYWcgMjogIiArIHRoaXMudGVzdE1vZGVsLmlzRmxhZzIoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigibm90IGZsYWcgMjogIiArIHRoaXMudGVzdE1vZGVsLmlzTm90RmxhZzIoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiKioqIik7Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIEJvb2xlYW4gZmxhZzE7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHMV9QUk9QRVJUWSA9ICJmbGFnMSI7Ci0JCXByaXZhdGUgQm9vbGVhbiBmbGFnMjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUcyX1BST1BFUlRZID0gImZsYWcyIjsKLQkJcHJpdmF0ZSBCb29sZWFuIG5vdEZsYWcyOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX0ZMQUcyX1BST1BFUlRZID0gIm5vdEZsYWcyIjsKLQkKLQkJcHVibGljIFRlc3RNb2RlbChCb29sZWFuIGZsYWcxLCBCb29sZWFuIGZsYWcyKSB7Ci0JCQl0aGlzLmZsYWcxID0gZmxhZzE7Ci0JCQl0aGlzLmZsYWcyID0gZmxhZzI7Ci0JCQl0aGlzLm5vdEZsYWcyID0gdGhpcy5uZXh0KGZsYWcyKTsKLQkJfQotCQlwcml2YXRlIEJvb2xlYW4gbmV4dChCb29sZWFuIGIpIHsKLQkJCXJldHVybiAoYiA9PSBudWxsKSA/IEJvb2xlYW4uVFJVRSA6IGIuYm9vbGVhblZhbHVlKCkgPyBCb29sZWFuLkZBTFNFIDogbnVsbDsKLQkJfQotCQlwdWJsaWMgQm9vbGVhbiBpc0ZsYWcxKCkgewotCQkJcmV0dXJuIHRoaXMuZmxhZzE7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RmxhZzEoQm9vbGVhbiBmbGFnMSkgewotCQkJQm9vbGVhbiBvbGQgPSB0aGlzLmZsYWcxOwotCQkJdGhpcy5mbGFnMSA9IGZsYWcxOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZMQUcxX1BST1BFUlRZLCBvbGQsIGZsYWcxKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBuZXh0RmxhZzEoKSB7Ci0JCQl0aGlzLnNldEZsYWcxKHRoaXMubmV4dCh0aGlzLmZsYWcxKSk7Ci0JCX0KLQkJcHVibGljIEJvb2xlYW4gaXNGbGFnMigpIHsKLQkJCXJldHVybiB0aGlzLmZsYWcyOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEZsYWcyKEJvb2xlYW4gZmxhZzIpIHsKLQkJCUJvb2xlYW4gb2xkID0gdGhpcy5mbGFnMjsKLQkJCXRoaXMuZmxhZzIgPSBmbGFnMjsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGTEFHMl9QUk9QRVJUWSwgb2xkLCBmbGFnMik7Ci0KLQkJCW9sZCA9IHRoaXMubm90RmxhZzI7Ci0JCQl0aGlzLm5vdEZsYWcyID0gdGhpcy5uZXh0KGZsYWcyKTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOT1RfRkxBRzJfUFJPUEVSVFksIG9sZCwgdGhpcy5ub3RGbGFnMik7Ci0JCX0KLQkJcHVibGljIHZvaWQgbmV4dEZsYWcyKCkgewotCQkJdGhpcy5zZXRGbGFnMih0aGlzLm5leHQodGhpcy5mbGFnMikpOwotCQl9Ci0JCXB1YmxpYyBCb29sZWFuIGlzTm90RmxhZzIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub3RGbGFnMjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROb3RGbGFnMihCb29sZWFuIG5vdEZsYWcyKSB7Ci0JCQl0aGlzLnNldEZsYWcyKHRoaXMubmV4dChmbGFnMikpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG5leHROb3RGbGFnMigpIHsKLQkJCXRoaXMuc2V0Tm90RmxhZzIodGhpcy5uZXh0KHRoaXMubm90RmxhZzIpKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE1vZGVsKCIgKyB0aGlzLmlzRmxhZzEoKSArICIgLSAiICsgdGhpcy5pc0ZsYWcyKCkgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbEFsaWduZXJUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xBbGlnbmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzI5MDRlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbEFsaWduZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RTYW1lOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5UaXRsZUFyZWFEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xBbGlnbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250cm9sQWxpZ25lclRlc3QgewotCi0JcHJpdmF0ZSBDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotCXByaXZhdGUgTGF5b3V0IGJ1aWxkU3BhY2VyTGF5b3V0KCkgewotCQlyZXR1cm4gbmV3IExheW91dCgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoSGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0SGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQotCQkJCXJldHVybiBuZXcgUG9pbnQod2lkdGhIaW50LCBoZWlnaHRIaW50KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSkgY29tcG9zaXRlLmdldExheW91dERhdGEoKTsKLQkJCQljb21wb3NpdGUuc2V0Qm91bmRzKDAsIDAsIGRhdGEud2lkdGhIaW50LCBkYXRhLmhlaWdodEhpbnQpOwotCQkJfQotCQl9OwotCX0KLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQotCQljb250cm9sQWxpZ25lciA9IG5ldyBDb250cm9sQWxpZ25lcigpOwotCi0JCXNoZWxsICA9IG5ldyBTaGVsbChEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQotCQlpZiAoY29udHJvbEFsaWduZXIgIT0gbnVsbCkgewotCQkJY29udHJvbEFsaWduZXIuZGlzcG9zZSgpOwotCQkJY29udHJvbEFsaWduZXIgPSBudWxsOwotCQl9Ci0KLQkJaWYgKHNoZWxsICE9IG51bGwpIHsKLQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCXNoZWxsID0gbnVsbDsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2wxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlwYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmUsIFNXVC5OVUxMKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwpOwotCi0JCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBtYXhpbXVtIHdpZHRoIHNob3VsZCBiZSAwLCIsCi0JCQkwLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCVBvaW50IHNpemUgPSBsYWJlbC5nZXRTaXplKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHNpemUueCArICIsIiwKLQkJCXNpemUueCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udHJvbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFuZSwgU1dULk5VTEwpOwotCQlidXR0b24uc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJUG9pbnQgc2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHNpemUueCArICIsIiwKLQkJCXNpemUueCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udHJvbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZSwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIHZlcnkgbG9uZyB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJTaG9ydCB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0KLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbCk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChidXR0b24pOwotCi0JCVBvaW50IGxhYmVsU2l6ZSAgPSBsYWJlbC5nZXRTaXplKCk7Ci0JCVBvaW50IGJ1dHRvblNpemUgPSBidXR0b24uZ2V0U2l6ZSgpOwotCQlpbnQgbWF4ID0gTWF0aC5tYXgobGFiZWxTaXplLngsIGJ1dHRvblNpemUueCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIG1heCArICIsIiwKLQkJCW1heCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udHJvbEFsaWduZXIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJdXBkYXRlR3JpZERhdGEobGFiZWwxKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwyKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwxKTsKLQotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjIgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2xBbGlnbmVyMik7Ci0JCWNvbnRyb2xBbGlnbmVyMi5hZGQobGFiZWwyKTsKLQotCQlsYWJlbDEuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCWxhYmVsMi5zZXRUZXh0KCJUaGlzIGlzIGEgdmVyeSBsb25nIENvbnRyb2xBbGlnbmVyIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQlQb2ludCBzaXplMSA9IGxhYmVsMS5nZXRTaXplKCk7Ci0JCVBvaW50IHNpemUyID0gbGFiZWwyLmdldFNpemUoKTsKLQkJaW50IHdpZHRoID0gTWF0aC5tYXgoc2l6ZTEueCwgc2l6ZTIueCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udHJvbEFsaWduZXIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJdXBkYXRlR3JpZERhdGEobGFiZWwxKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwyKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwxKTsKLQotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjIgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIyLmFkZChsYWJlbDIpOwotCi0JCWxhYmVsMS5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLQkJbGFiZWwyLnNldFRleHQoIlRoaXMgaXMgYSB2ZXJ5IGxvbmcgQ29udHJvbEFsaWduZXIiKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQoY29udHJvbEFsaWduZXIyKTsKLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCVBvaW50IHNpemUxID0gbGFiZWwxLmdldFNpemUoKTsKLQkJUG9pbnQgc2l6ZTIgPSBsYWJlbDIuZ2V0U2l6ZSgpOwotCQlpbnQgd2lkdGggPSBNYXRoLm1heChzaXplMS54LCBzaXplMi54KTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdChleHBlY3RlZD1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2xBbGlnbmVyVG9JdHNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2xBbGlnbmVyKTsKLQkJZmFpbCgiQSBDb250cm9sQWxpZ25lciBjYW4ndCBiZSBhZGRlZCB0byBpdHNlbGYiKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3REaWFsb2dfQWRkQ29udHJvbDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlmaW5hbCBpbnRbXSBtYXhpbXVtV2lkdGggPSBuZXcgaW50WzFdOwotCQlmaW5hbCBpbnRbXSBzaXplID0gbmV3IGludFsxXTsKLQotCQlUaXRsZUFyZWFEaWFsb2cgZGlhbG9nID0gbmV3IFRpdGxlQXJlYURpYWxvZyhTV1RVdGlsLmdldFNoZWxsKCkpIHsKLQotCQkJcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJCUNvbXBvc2l0ZSBwYW5lID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQkJCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCQlsYWJlbCA9IG5ldyBMYWJlbChwYW5lLCBTV1QuTEVGVCk7Ci0JCQkJbGFiZWwuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCQkJdXBkYXRlR3JpZERhdGEobGFiZWwpOwotCi0JCQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsKTsKLQotCQkJCXJldHVybiBwYXJlbnQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJvdW5kcygpIHsKLQkJCQlzdXBlci5pbml0aWFsaXplQm91bmRzKCk7Ci0JCQkJc2l6ZVswXSA9IGxhYmVsLmdldFNpemUoKS54OwotCQkJCW1heGltdW1XaWR0aFswXSA9IGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpOwotCQkJfQotCQl9OwotCi0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmNsb3NlKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHNpemVbMF0gKyAiLCIsCi0JCQlzaXplWzBdLAotCQkJbWF4aW11bVdpZHRoWzBdCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RGlhbG9nX0FkZENvbnRyb2wyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJZmluYWwgaW50W10gbWF4aW11bVdpZHRoID0gbmV3IGludFsxXTsKLQkJZmluYWwgaW50W10gc2l6ZXMgPSBuZXcgaW50WzJdOwotCi0JCVRpdGxlQXJlYURpYWxvZyBkaWFsb2cgPSBuZXcgVGl0bGVBcmVhRGlhbG9nKFNXVFV0aWwuZ2V0U2hlbGwoKSkgewotCi0JCQlwcml2YXRlIEJ1dHRvbiBidXR0b247Ci0JCQlwcml2YXRlIExhYmVsIGxhYmVsOwotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQkJCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCQkJcGFuZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkJCWxhYmVsID0gbmV3IExhYmVsKHBhbmUsIFNXVC5OVUxMKTsKLQkJCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLQkJCQl1cGRhdGVHcmlkRGF0YShsYWJlbCk7Ci0KLQkJCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwpOwotCi0JCQkJYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCQkJYnV0dG9uLnNldFRleHQoIlNob3J0IHRleHQiKTsKLQkJCQl1cGRhdGVHcmlkRGF0YShidXR0b24pOwotCi0JCQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0KLQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCb3VuZHMoKSB7Ci0JCQkJc3VwZXIuaW5pdGlhbGl6ZUJvdW5kcygpOwotCQkJCXNpemVzWzBdID0gbGFiZWwuZ2V0U2l6ZSgpLng7Ci0JCQkJc2l6ZXNbMV0gPSBidXR0b24uZ2V0U2l6ZSgpLng7Ci0JCQkJbWF4aW11bVdpZHRoWzBdID0gY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuY2xvc2UoKTsKLQotCQlpbnQgbGFiZWxTaXplICA9IHNpemVzWzBdOwotCQlpbnQgYnV0dG9uU2l6ZSA9IHNpemVzWzFdOwotCQlpbnQgbWF4ID0gTWF0aC5tYXgobGFiZWxTaXplLCBidXR0b25TaXplKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgbWF4ICsgIiwiLAotCQkJbWF4LAotCQkJbWF4aW11bVdpZHRoWzBdCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUNvbXBvc2l0ZSBwYW5lID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJcGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJcGFuZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYW5lLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoIlRoaXMgaXMgdmVyeSBsb25nIHRleHQiKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwpOwotCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhbmUsIFNXVC5OVUxMKTsKLQkJYnV0dG9uLnNldFRleHQoIlNob3J0IHRleHQiKTsKLQkJdXBkYXRlR3JpZERhdGEoYnV0dG9uKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwpOwotCQljb250cm9sQWxpZ25lci5hZGQoYnV0dG9uKTsKLQotCQlQb2ludCBsYWJlbFNpemUgID0gbGFiZWwuZ2V0U2l6ZSgpOwotCQlQb2ludCBidXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQkJaW50IG1heCA9IE1hdGgubWF4KGxhYmVsU2l6ZS54LCBidXR0b25TaXplLngpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBtYXggKyAiLCIsCi0JCQltYXgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWxhYmVsLmRpc3Bvc2UoKTsKLQotCQlQb2ludCBuZXdCdXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQotCQlhc3NlcnROb3RTYW1lKAotCQkJIlRoZSBvbGQgbWF4IGFuZCBuZXcgbWF4IHNob3VsZCBub3QgYmUgdGhlIHNhbWUiLAotCQkJbWF4LAotCQkJbmV3QnV0dG9uU2l6ZS54Ci0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBDb250cm9sQWxpZ25lciBkb2Vzbid0IGhhdmUgdGhlIHJpZ2h0IG1heGltdW0gd2lkdGgiLAotCQkJbmV3QnV0dG9uU2l6ZS54LAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RIaWVyYXJjaHlPZkNvbnRyb2xBbGlnbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vIEFsaWduZXIxCi0JCS8vICBeCi0JCS8vICB8LUFsaWduZXIyCi0JCS8vICAgICBeCi0JCS8vICAgICB8LUFsaWduZXIzCi0JCUNvbnRyb2xBbGlnbmVyIGNvbnRyb2xBbGlnbmVyMiA9IG5ldyBDb250cm9sQWxpZ25lcigpOwotCQljb250cm9sQWxpZ25lci5hZGQoY29udHJvbEFsaWduZXIyKTsKLQotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjMgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIyLmFkZChjb250cm9sQWxpZ25lcjMpOwotCi0JCS8vIFRlc3QgMQotCQlMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsMS5zZXRUZXh0KCJUaGlzIGlzIGEgbGFiZWwgd2lkZ2V0Iik7Ci0JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJaW50IGxhYmVsV2lkdGgxID0gbGFiZWwxLmdldFNpemUoKS54OwotCQljb250cm9sQWxpZ25lcjMuYWRkKGxhYmVsMSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMy5nZXRNYXhpbXVtV2lkdGgoKSwgbGFiZWxXaWR0aDEpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpLCBsYWJlbFdpZHRoMSk7Ci0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSwgbGFiZWxXaWR0aDEpOwotCi0JCS8vIFRlc3QgMgotCQlMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsMi5zZXRUZXh0KCJTaG9ydExhYmVsIik7Ci0JCWNvbnRyb2xBbGlnbmVyMi5hZGQobGFiZWwyKTsKLQkJcGFyZW50LmxheW91dCh0cnVlKTsKLQotCQlpbnQgbmV3TGFiZWxXaWR0aDEgPSBsYWJlbDEuZ2V0U2l6ZSgpLng7Ci0JCWludCBuZXdMYWJlbFdpZHRoMiA9IGxhYmVsMi5nZXRTaXplKCkueDsKLQotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIzLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMSwgbmV3TGFiZWxXaWR0aDIpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQotCQkvLyBUZXN0IDMKLQkJTGFiZWwgbGFiZWwzID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlsYWJlbDMuc2V0VGV4dCgiQSB2ZXJ5IGxvbmcgbGFiZWwgdGhhdCB0YWtlcyBhIGxvdCBvZiBob3Jpem9udGFsIHNwYWNlIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsMyk7Ci0KLQkJbmV3TGFiZWxXaWR0aDEgPSBsYWJlbDEuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgyID0gbGFiZWwyLmdldFNpemUoKS54OwotCQlpbnQgbmV3TGFiZWxXaWR0aDMgPSBsYWJlbDMuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMy5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIG5ld0xhYmVsV2lkdGgyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgyLCBuZXdMYWJlbFdpZHRoMyk7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCi0JCS8vIE1ha2Ugc3VyZSBhbGwgdGhlIGxvY2tlZCBhcmUgcmVtb3ZlZAotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyMiwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlXyhjb250cm9sQWxpZ25lcjMsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSB0ZXh0IG9mIGxhYmVsMgotCQlsYWJlbDIuc2V0VGV4dCgibW0iKTsKLS8vCQlwYXJlbnQubGF5b3V0KHRydWUpOwotCi0JCW5ld0xhYmVsV2lkdGgxID0gbGFiZWwxLmdldFNpemUoKS54OwotCQluZXdMYWJlbFdpZHRoMiA9IGxhYmVsMi5nZXRTaXplKCkueDsKLQkJbmV3TGFiZWxXaWR0aDMgPSBsYWJlbDMuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMy5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIG5ld0xhYmVsV2lkdGgyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgyLCBuZXdMYWJlbFdpZHRoMyk7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCi0JCWFzc2VydEVxdWFscyhSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZV8oY29udHJvbEFsaWduZXIsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZV8oY29udHJvbEFsaWduZXIyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyMywgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQotCQkvLyBDaGFuZ2UgdGhlIHRleHQgb2YgbGFiZWwxCi0JCWxhYmVsMS5zZXRUZXh0KCJhIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlKTsKLQotCQlDb21wb3NpdGUgcGFyZW50MSA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTlVMTCk7Ci0JCXBhcmVudDEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCUxhYmVsIHRlbXBMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQxLCBTV1QuTlVMTCk7Ci0JCXRlbXBMYWJlbC5zZXRUZXh0KCJhIik7Ci0vLwkJcGFyZW50MS5sYXlvdXQodHJ1ZSk7Ci0KLQkJaW50IHJlYWxXaWR0aCA9IHRlbXBMYWJlbC5nZXRTaXplKCkueDsKLQotCQluZXdMYWJlbFdpZHRoMSA9IGxhYmVsMS5nZXRTaXplKCkueDsKLQkJbmV3TGFiZWxXaWR0aDIgPSBsYWJlbDIuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgzID0gbGFiZWwzLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjMuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBuZXdMYWJlbFdpZHRoMik7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMiwgbmV3TGFiZWxXaWR0aDMpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RmFsc2UobmV3TGFiZWxXaWR0aDEgPT0gcmVhbFdpZHRoKTsKLQotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyMiwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlXyhjb250cm9sQWxpZ25lcjMsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSB0ZXh0IG9mIGxhYmVsMQotCQlsYWJlbDEuc2V0VGV4dCgiWWVzIGFub3RoZXIgYmlnIGxvbmcgbG9uZyB0ZXh0IHNvIHRoYXQgYWxsIHRoZSBsYWJlbHMgd2lsbCBoYXZlIHRvIHRha2UgdGhlIHNpemUgb2YgdGhpcyBsYWJlbCB0byBtYWtlIHN1cmUgQ29udHJvbEFsaWduZXIgd29ya3MgY29ycmVjdGx5Iik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlKTsKLQotCQkvLyBXZWlyZDogSXQgc2VlbXMgbm8gbm90aWZpY2F0aW9uIGlzIHNlbnQsIGZpcmUgb25lIG1hbnVhbGx5Ci0JCUV2ZW50IGV2ZW50ICA9IG5ldyBFdmVudCgpOwotCQlldmVudC53aWRnZXQgPSBsYWJlbDE7Ci0JCWV2ZW50LnR5cGUgICA9IFNXVC5SZXNpemU7Ci0JCWxhYmVsMS5ub3RpZnlMaXN0ZW5lcnMoU1dULlJlc2l6ZSwgZXZlbnQpOwotCi0JCUNvbXBvc2l0ZSBwYXJlbnQyID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OVUxMKTsKLQkJcGFyZW50Mi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJdGVtcExhYmVsID0gbmV3IExhYmVsKHBhcmVudDIsIFNXVC5OVUxMKTsKLQkJdGVtcExhYmVsLnNldFRleHQobGFiZWwxLmdldFRleHQoKSk7Ci0JCXBhcmVudDIubGF5b3V0KHRydWUpOwotCi0JCXJlYWxXaWR0aCA9IHRlbXBMYWJlbC5nZXRTaXplKCkueDsKLQotCQluZXdMYWJlbFdpZHRoMSA9IGxhYmVsMS5nZXRTaXplKCkueDsKLQkJbmV3TGFiZWxXaWR0aDIgPSBsYWJlbDIuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgzID0gbGFiZWwzLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjMuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBuZXdMYWJlbFdpZHRoMik7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMiwgbmV3TGFiZWxXaWR0aDMpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCksIG5ld0xhYmVsV2lkdGgxKTsKLQkJYXNzZXJ0RXF1YWxzKHJlYWxXaWR0aCwgbmV3TGFiZWxXaWR0aDEpOwotCi0JCWFzc2VydEVxdWFscyhSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZV8oY29udHJvbEFsaWduZXIsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZV8oY29udHJvbEFsaWduZXIyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyMywgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb250cm9sMSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUNvbXBvc2l0ZSBwYW5lID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJcGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJcGFuZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLQkJdXBkYXRlR3JpZERhdGEoYnV0dG9uKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQoYnV0dG9uKTsKLQkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQlQb2ludCBzaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgc2l6ZS54ICsgIiwiLAotCQkJc2l6ZS54LAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQljb250cm9sQWxpZ25lci5yZW1vdmUoYnV0dG9uKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAwLCAiLAotCQkJMCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udHJvbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZSwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIHZlcnkgbG9uZyB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJTaG9ydCB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwpOwotCQljb250cm9sQWxpZ25lci5hZGQoYnV0dG9uKTsKLQotCQlQb2ludCBsYWJlbFNpemUgID0gbGFiZWwuZ2V0U2l6ZSgpOwotCQlQb2ludCBidXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQkJaW50IG1heCA9IE1hdGgubWF4KGxhYmVsU2l6ZS54LCBidXR0b25TaXplLngpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBtYXggKyAiLCIsCi0JCQltYXgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWNvbnRyb2xBbGlnbmVyLnJlbW92ZShsYWJlbCk7Ci0KLQkJUG9pbnQgbmV3QnV0dG9uU2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0KLQkJYXNzZXJ0Tm90U2FtZSgKLQkJCSJUaGUgb2xkIG1heCBhbmQgbmV3IG1heCBzaG91bGQgbm90IGJlIHRoZSBzYW1lIiwKLQkJCW1heCwKLQkJCW5ld0J1dHRvblNpemUueAotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgQ29udHJvbEFsaWduZXIgZG9lc24ndCBoYXZlIHRoZSByaWdodCBtYXhpbXVtIHdpZHRoIiwKLQkJCW5ld0J1dHRvblNpemUueCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udHJvbDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gV2lkZ2V0IDEKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZSwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIHZlcnkgbG9uZyB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsKTsKLQotCQkvLyBXaWRnZXQgMgotCQlDb21wb3NpdGUgc3BhY2VyID0gbmV3IENvbXBvc2l0ZShwYW5lLCBTV1QuTlVMTCk7Ci0JCXNwYWNlci5zZXRMYXlvdXQoYnVpbGRTcGFjZXJMYXlvdXQoKSk7Ci0JCXVwZGF0ZUdyaWREYXRhKHNwYWNlcik7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChzcGFjZXIpOwotCi0JCS8vIFdpZGdldCAzCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhbmUsIFNXVC5OVUxMKTsKLQkJYnV0dG9uLnNldFRleHQoIlNob3J0IHRleHQiKTsKLQkJdXBkYXRlR3JpZERhdGEoYnV0dG9uKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0KLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCS8vIE1ha2Ugc3VyZSB0aGUgMyB3aWRnZXRzIGhhdmUgdGhlIHNhbWUgd2lkdGgKLQkJUG9pbnQgbGFiZWxTaXplICA9IGxhYmVsLmdldFNpemUoKTsKLQkJUG9pbnQgc3BhY2VyU2l6ZSA9IHNwYWNlci5nZXRTaXplKCk7Ci0JCVBvaW50IGJ1dHRvblNpemUgPSBidXR0b24uZ2V0U2l6ZSgpOwotCQlpbnQgbWF4ID0gTWF0aC5tYXgobGFiZWxTaXplLngsIGJ1dHRvblNpemUueCk7Ci0JCW1heCA9IE1hdGgubWF4KG1heCwgc3BhY2VyU2l6ZS54KTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgbWF4ICsgIiwiLAotCQkJbWF4LAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwYWNlcidzIHdpZHRoIHNob3VsZCBiZSAiICsgbWF4ICsgIiwiLAotCQkJbWF4LAotCQkJc3BhY2VyU2l6ZS54Ci0JCSk7Ci0KLQkJLy8gUmVtb3ZlIHRoZSBsYWJlbCAodGhlIHdpZGVzdCB3aWRnZXQpIGFuZCBtYWtlIHN1cmUgdGhlIHdpZHRoIHdhcwotCQkvLyBjb3JyZWN0bHkgY2FsY3VsYXRlZAotCQljb250cm9sQWxpZ25lci5yZW1vdmUobGFiZWwpOwotCi0JCXNwYWNlclNpemUgPSBzcGFjZXIuZ2V0U2l6ZSgpOwotCQlidXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQkJaW50IG1heDIgPSBNYXRoLm1heChzcGFjZXJTaXplLngsIGJ1dHRvblNpemUueCk7Ci0KLQkJYXNzZXJ0Tm90U2FtZSgKLQkJCSJUaGUgb2xkIG1heCBhbmQgbmV3IG1heCBzaG91bGQgbm90IGJlIHRoZSBzYW1lIiwKLQkJCW1heCwKLQkJCW1heDIKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIENvbnRyb2xBbGlnbmVyIGRvZXNuJ3QgaGF2ZSB0aGUgcmlnaHQgbWF4aW11bSB3aWR0aCIsCi0JCQltYXgyLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwYWNlcidzIHdpZHRoIHNob3VsZCBoYXZlIGJlZW4gYWRqdXN0ZWQiLAotCQkJbWF4MiwKLQkJCXNwYWNlclNpemUueAotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvbnRyb2xBbGlnbmVyMSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMSk7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsMSk7Ci0KLQkJQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIyID0gbmV3IENvbnRyb2xBbGlnbmVyKCk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChjb250cm9sQWxpZ25lcjIpOwotCQljb250cm9sQWxpZ25lcjIuYWRkKGxhYmVsMik7Ci0KLQkJbGFiZWwxLnNldFRleHQoIlRoaXMgaXMgYSBDb250cm9sQWxpZ25lciIpOwotCQlsYWJlbDIuc2V0VGV4dCgiVGhpcyBpcyBhIHZlcnkgbG9uZyBDb250cm9sQWxpZ25lciIpOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJUG9pbnQgc2l6ZTEgPSBsYWJlbDEuZ2V0U2l6ZSgpOwotCQlQb2ludCBzaXplMiA9IGxhYmVsMi5nZXRTaXplKCk7Ci0JCWludCB3aWR0aCA9IE1hdGgubWF4KHNpemUxLngsIHNpemUyLngpOwotCi0JCS8vIFRlc3QgMQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQkvLyBUZXN0IDIKLQkJY29udHJvbEFsaWduZXIucmVtb3ZlKGxhYmVsMSk7Ci0KLQkJd2lkdGggPSBsYWJlbDIuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udHJvbEFsaWduZXIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJdXBkYXRlR3JpZERhdGEobGFiZWwxKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwyKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwxKTsKLQotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjIgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2xBbGlnbmVyMik7Ci0JCWNvbnRyb2xBbGlnbmVyMi5hZGQobGFiZWwyKTsKLQotCQlsYWJlbDEuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCWxhYmVsMi5zZXRUZXh0KCJUaGlzIGlzIGEgdmVyeSBsb25nIENvbnRyb2xBbGlnbmVyIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQlQb2ludCBzaXplMSA9IGxhYmVsMS5nZXRTaXplKCk7Ci0JCVBvaW50IHNpemUyID0gbGFiZWwyLmdldFNpemUoKTsKLQkJaW50IHdpZHRoID0gTWF0aC5tYXgoc2l6ZTEueCwgc2l6ZTIueCk7Ci0KLQkJLy8gVGVzdCAxCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCS8vIFRlc3QgMgotCQljb250cm9sQWxpZ25lcjIucmVtb3ZlKGxhYmVsMik7Ci0KLQkJd2lkdGggPSBsYWJlbDEuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbnRyb2wgY29udHJvbCkgewotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQljb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbEVuYWJsZXJUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xFbmFibGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQwNmExLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbEVuYWJsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250cm9sRW5hYmxlclRlc3QgewotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoU3RhdGUoKSB7Ci0KLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIgPQotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPih0cnVlKTsKLQotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIpOwotCi0JCVNXVFRvb2xzLmNvbnRyb2xFbmFibGVkU3RhdGUoYm9vbGVhbkhvbGRlciwgY29tYm8pOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIENvbWJvIHNob3VsZCBiZSBlbmFibGVkIiwKLQkJCWNvbWJvLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChudWxsKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBDb21ibyBzaG91bGQgbm90IGJlIGVuYWJsZWQiLAotCQkJY29tYm8uaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKHRydWUpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIGJlIGVuYWJsZWQiLAotCQkJY29tYm8uaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKGZhbHNlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKGZhbHNlKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIG5vdCBiZSBlbmFibGVkIiwKLQkJCWNvbWJvLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gRGlzcG9zZQotCQljb21iby5kaXNwb3NlKCk7Ci0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sU3dpdGNoZXJUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xTd2l0Y2hlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxMTFiZC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xTd2l0Y2hlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuQ29udHJvbFN3aXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250cm9sU3dpdGNoZXJUZXN0IHsKLQotCXByaXZhdGUgUGFnZUJvb2sgcGFnZUJvb2s7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFuZTE7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFuZTI7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgYnVpbGRQYW5lMSgpIHsKLQotCQlpZiAocGFuZTEgPT0gbnVsbCkgewotCi0JCQlwYW5lMSA9IG5ldyBDb21wb3NpdGUocGFnZUJvb2ssIFNXVC5OVUxMKTsKLQkJCXBhbmUxLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYW5lMSwgU1dULk5VTEwpOwotCQkJbGFiZWwuc2V0VGV4dCgiJlRlc3QyOiIpOwotCi0JCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYW5lMSwgU1dULkJPUkRFUik7Ci0JCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYW5lMSwgU1dULkJPUkRFUik7Ci0KLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJY29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJfQotCi0JCXJldHVybiBwYW5lMTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBidWlsZFBhbmUyKCkgewotCi0JCWlmIChwYW5lMiA9PSBudWxsKSB7Ci0KLQkJCXBhbmUyID0gbmV3IENvbXBvc2l0ZShwYWdlQm9vaywgU1dULk5VTEwpOwotCQkJcGFuZTIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmUyLCBTV1QuTlVMTCk7Ci0JCQlsYWJlbC5zZXRUZXh0KCImVGVzdDE6Iik7Ci0KLQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhbmUyLCBTV1QuQk9SREVSKTsKLQkJCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCX0KLQotCQlyZXR1cm4gcGFuZTI7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxCb29sZWFuLCBDb250cm9sPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPEJvb2xlYW4sIENvbnRyb2w+KCkgewotCQkJcHVibGljIENvbnRyb2wgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gbnVsbCA6ICh2YWx1ZSA/IHBhbmUxIDogcGFuZTIpOwotCQkJfQotCQl9OwotCX0KLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhwYXJlbnQsIFNXVC5OVUxMKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0KLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0KLQkJCXBhcmVudC5kaXNwb3NlKCk7Ci0KLQkJCXBhcmVudCAgID0gbnVsbDsKLQkJCXBhZ2VCb29rID0gbnVsbDsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFN3aXRjaCgpIHsKLQotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gc3dpdGNoSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPigpOwotCQlUcmFuc2Zvcm1lcjxCb29sZWFuLCBDb250cm9sPiB0cmFuc2Zvcm1lciA9IGJ1aWxkVHJhbnNmb3JtZXIoKTsKLQotCQlwYW5lMSA9IGJ1aWxkUGFuZTEoKTsKLQkJcGFuZTEuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJcGFuZTIgPSBidWlsZFBhbmUyKCk7Ci0JCXBhbmUyLnNldFZpc2libGUoZmFsc2UpOwotCi0JCW5ldyBDb250cm9sU3dpdGNoZXIoCi0JCQlzd2l0Y2hIb2xkZXIsCi0JCQl0cmFuc2Zvcm1lciwKLQkJCXBhZ2VCb29rCi0JCSk7Ci0KLQkJLy8gVGVzdCAxCi0JCXN3aXRjaEhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQkJQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHBhZ2VCb29rLCAiY3VycmVudFBhZ2UiKTsKLQotCQlhc3NlcnROb3ROdWxsKAotCQkJIlRoZSBwYWdlIGJvb2sncyBwYWdlIHNob3VsZG4ndCBiZSBudWxsIiwKLQkJCWNvbnRyb2wKLQkJKTsKLQotCQlhc3NlcnRTYW1lKAotCQkJIlRoZSBjdXJyZW50IHBhbmUgc2hvdWxkIGJlIHBhbmUxIiwKLQkJCXBhbmUxLAotCQkJY29udHJvbAotCQkpOwotCi0JCVBvaW50IHBhbmUxU2l6ZSA9IHBhbmUxLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCVBvaW50IHBhZ2VCb29rU2l6ZSA9IHBhZ2VCb29rLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBvZiB0aGUgUGFnZUJvb2sgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSB3aWR0aCBvZiBwYW5lMSIsCi0JCQlwYW5lMVNpemUueCwKLQkJCXBhZ2VCb29rU2l6ZS54Ci0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBoZWlnaHQgb2YgdGhlIFBhZ2VCb29rIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgaGVpZ2h0IG9mIHBhbmUxIiwKLQkJCXBhbmUxU2l6ZS55LAotCQkJcGFnZUJvb2tTaXplLnkKLQkJKTsKLQotCQkvLyBUZXN0IDIKLQkJc3dpdGNoSG9sZGVyLnNldFZhbHVlKGZhbHNlKTsKLQkJY29udHJvbCA9IChDb250cm9sKSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShwYWdlQm9vaywgImN1cnJlbnRQYWdlIik7Ci0KLQkJYXNzZXJ0Tm90TnVsbCgKLQkJCSJUaGUgcGFnZSBib29rJ3MgcGFnZSBzaG91bGRuJ3QgYmUgbnVsbCIsCi0JCQljb250cm9sCi0JCSk7Ci0KLQkJYXNzZXJ0U2FtZSgKLQkJCSJUaGUgY3VycmVudCBwYW5lIHNob3VsZCBiZSBwYW5lMiIsCi0JCQlwYW5lMiwKLQkJCWNvbnRyb2wKLQkJKTsKLQotCQlQb2ludCBwYW5lMlNpemUgPSBwYW5lMi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlwYWdlQm9va1NpemUgPSBwYWdlQm9vay5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggb2YgdGhlIFBhZ2VCb29rIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgd2lkdGggb2YgcGFuZTIiLAotCQkJcGFuZTJTaXplLngsCi0JCQlwYWdlQm9va1NpemUueAotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgaGVpZ2h0IG9mIHRoZSBQYWdlQm9vayBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIGhlaWdodCBvZiBwYW5lMiIsCi0JCQlwYW5lMlNpemUueSwKLQkJCXBhZ2VCb29rU2l6ZS55Ci0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xWaXNpYmlsaXR5RW5hYmxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk3OGVkMS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xWaXNpYmlsaXR5RW5hYmxlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3QuU1dUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIENvbnRyb2xWaXNpYmlsaXR5RW5hYmxlclRlc3QgewotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoU3RhdGUoKSB7Ci0KLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIgPQotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPih0cnVlKTsKLQotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIpOwotCi0JCVNXVFRvb2xzLmNvbnRyb2xWaXNpYmxlU3RhdGUoYm9vbGVhbkhvbGRlciwgY29tYm8pOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIENvbWJvIHNob3VsZCBiZSB2aXNpYmxlIiwKLQkJCWNvbWJvLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChudWxsKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBDb21ibyBzaG91bGQgbm90IGJlIHZpc2libGUiLAotCQkJY29tYm8uaXNWaXNpYmxlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKHRydWUpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIGJlIHZpc2libGUiLAotCQkJY29tYm8uaXNWaXNpYmxlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKGZhbHNlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKGZhbHNlKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIG5vdCBiZSB2aXNpYmxlIiwKLQkJCWNvbWJvLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gRGlzcG9zZQotCQljb21iby5kaXNwb3NlKCk7Ci0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9KcHRVaVV0aWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9KcHRVaVV0aWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGYwMGQyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvSnB0VWlVdGlsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuSlVuaXQ0VGVzdEFkYXB0ZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGUuU3VpdGVDbGFzc2VzOwotCi1AU3VpdGVDbGFzc2VzCi0oewotCUNvbnRyb2xBbGlnbmVyVGVzdC5jbGFzcywKLQlDb250cm9sU3dpdGNoZXJUZXN0LmNsYXNzLAotCUNvbnRyb2xFbmFibGVyVGVzdC5jbGFzcywKLQlDb250cm9sVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmNsYXNzLAotCUxhYmVsZWRCdXR0b25UZXN0LmNsYXNzLAotCUxhYmVsZWRMYWJlbFRlc3QuY2xhc3MsCi0JTGFiZWxlZENvbnRyb2xVcGRhdGVyVGVzdC5jbGFzcywKLQlQYW5lRW5hYmxlclRlc3QuY2xhc3MsCi0JUGFuZVZpc2liaWxpdHlFbmFibGVyVGVzdC5jbGFzcywKLX0pCi1AUnVuV2l0aChTdWl0ZS5jbGFzcykKLXB1YmxpYyBmaW5hbCBjbGFzcyBKcHRVaVV0aWxUZXN0cyB7Ci0KLQlwcml2YXRlIEpwdFVpVXRpbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgSlVuaXQ0VGVzdEFkYXB0ZXIoSnB0VWlVdGlsVGVzdHMuY2xhc3MpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZEJ1dHRvblRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZEJ1dHRvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI1MTVhYy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRCdXR0b25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBMYWJlbGVkQnV0dG9uVGVzdCB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQkJCXBhcmVudCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RMYWJlbGVkQnV0dG9uMSgpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTlVMTCk7Ci0JCW5ldyBMYWJlbGVkQnV0dG9uKGJ1dHRvbik7Ci0JfQotCi0JQFRlc3QoZXhwZWN0ZWQ9QXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uLmNsYXNzKQotCXB1YmxpYyB2b2lkIHRlc3RMYWJlbGVkQnV0dG9uMigpIHsKLQkJbmV3IExhYmVsZWRCdXR0b24obnVsbCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW1hZ2UoKSB7Ci0KLQkJSW1hZ2UgZXhwZWN0ZWQgPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgMTYsIDE2KTsKLQotCQl0cnkgewotCQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlMYWJlbGVkQnV0dG9uIGxhYmVsZWRCdXR0b24gPSBuZXcgTGFiZWxlZEJ1dHRvbihidXR0b24pOwotCi0JCQlsYWJlbGVkQnV0dG9uLnNldEltYWdlKGV4cGVjdGVkKTsKLQotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgQnV0dG9uIGRpZG4ndCByZWNlaXZlIHRoZSBJbWFnZSIsCi0JCQkJZXhwZWN0ZWQsCi0JCQkJYnV0dG9uLmdldEltYWdlKCkKLQkJCSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlleHBlY3RlZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbWFnZURpc3Bvc2UoKSB7Ci0KLQkJSW1hZ2UgZXhwZWN0ZWQgPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgMTYsIDE2KTsKLQotCQl0cnkgewotCQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlMYWJlbGVkQnV0dG9uIGxhYmVsZWRCdXR0b24gPSBuZXcgTGFiZWxlZEJ1dHRvbihidXR0b24pOwotCi0JCQlidXR0b24uZGlzcG9zZSgpOwotCi0JCQkvLyBUaGlzIHNob3VsZCBub3QgZmFpbCBidXQgc2ltcGx5IGRvIG5vdGhpbmcKLQkJCWxhYmVsZWRCdXR0b24uc2V0SW1hZ2UoZXhwZWN0ZWQpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZXhwZWN0ZWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGV4dCgpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUxhYmVsZWRCdXR0b24gbGFiZWxlZEJ1dHRvbiA9IG5ldyBMYWJlbGVkQnV0dG9uKGJ1dHRvbik7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkID0gIlRoaXMgaXMgYSB0ZXN0IjsKLQkJbGFiZWxlZEJ1dHRvbi5zZXRUZXh0KGV4cGVjdGVkKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIEJ1dHRvbiBkaWRuJ3QgcmVjZWl2ZSB0aGUgdGV4dCIsCi0JCQlleHBlY3RlZCwKLQkJCWJ1dHRvbi5nZXRUZXh0KCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRUZXh0RGlzcG9zZSgpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUxhYmVsZWRCdXR0b24gbGFiZWxlZEJ1dHRvbiA9IG5ldyBMYWJlbGVkQnV0dG9uKGJ1dHRvbik7Ci0KLQkJYnV0dG9uLmRpc3Bvc2UoKTsKLQotCQkvLyBUaGlzIHNob3VsZCBub3QgZmFpbCBidXQgc2ltcGx5IGRvIG5vdGhpbmcKLQkJU3RyaW5nIGV4cGVjdGVkID0gIlRoaXMgaXMgYSB0ZXN0IjsKLQkJbGFiZWxlZEJ1dHRvbi5zZXRUZXh0KGV4cGVjdGVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sVXBkYXRlclRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZENvbnRyb2xVcGRhdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzhkNmVlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZENvbnRyb2xVcGRhdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRDb250cm9sVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuTGFiZWxlZExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgTGFiZWxlZENvbnRyb2xVcGRhdGVyVGVzdCB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQkJCXBhcmVudCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbWFnZSgpIHsKLQotCQlJbWFnZSBleHBlY3RlZCA9IG5ldyBJbWFnZShwYXJlbnQuZ2V0RGlzcGxheSgpLCAxNiwgMTYpOwotCi0JCXRyeSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQkJTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gaW1hZ2VIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPigpOwotCQkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcihsYWJlbGVkTGFiZWwsIG51bGwsIGltYWdlSG9sZGVyKTsKLQotCQkJbGFiZWxlZExhYmVsLnNldEltYWdlKGV4cGVjdGVkKTsKLQotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgTGFiZWwgZGlkbid0IHJlY2VpdmUgdGhlIEltYWdlIiwKLQkJCQlleHBlY3RlZCwKLQkJCQlsYWJlbC5nZXRJbWFnZSgpCi0JCQkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZXhwZWN0ZWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW1hZ2VEaXNwb3NlKCkgewotCi0JCUltYWdlIGV4cGVjdGVkID0gbmV3IEltYWdlKHBhcmVudC5nZXREaXNwbGF5KCksIDE2LCAxNik7Ci0KLQkJdHJ5IHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQkJTGFiZWxlZExhYmVsIGxhYmVsZWRMYWJlbCA9IG5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCi0JCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBpbWFnZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KCk7Ci0JCQluZXcgTGFiZWxlZENvbnRyb2xVcGRhdGVyKGxhYmVsZWRMYWJlbCwgbnVsbCwgaW1hZ2VIb2xkZXIpOwotCi0JCQlsYWJlbC5kaXNwb3NlKCk7Ci0JCQlsYWJlbGVkTGFiZWwuc2V0SW1hZ2UoZXhwZWN0ZWQpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZXhwZWN0ZWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGV4dCgpIHsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWxlZExhYmVsIGxhYmVsZWRMYWJlbCA9IG5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCi0JCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIobGFiZWxlZExhYmVsLCB0ZXh0SG9sZGVyKTsKLQotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiVGhpcyBpcyBhIHRlc3QiOwotCQl0ZXh0SG9sZGVyLnNldFZhbHVlKGV4cGVjdGVkKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIExhYmVsIGRpZG4ndCByZWNlaXZlIHRoZSB0ZXh0IiwKLQkJCWV4cGVjdGVkLAotCQkJbGFiZWwuZ2V0VGV4dCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGV4dERpc3Bvc2UoKSB7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQluZXcgTGFiZWxlZENvbnRyb2xVcGRhdGVyKGxhYmVsZWRMYWJlbCwgdGV4dEhvbGRlcik7Ci0KLQkJbGFiZWwuZGlzcG9zZSgpOwotCi0JCVN0cmluZyBleHBlY3RlZCA9ICJUaGlzIGlzIGEgdGVzdCI7Ci0JCXRleHRIb2xkZXIuc2V0VmFsdWUoZXhwZWN0ZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZExhYmVsVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkTGFiZWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0M2JjZWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkTGFiZWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgTGFiZWxlZExhYmVsVGVzdCB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQkJCXBhcmVudCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RMYWJlbGVkQnV0dG9uMSgpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCW5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCX0KLQotCUBUZXN0KGV4cGVjdGVkPUFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbi5jbGFzcykKLQlwdWJsaWMgdm9pZCB0ZXN0TGFiZWxlZEJ1dHRvbjIoKSB7Ci0JCW5ldyBMYWJlbGVkTGFiZWwobnVsbCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW1hZ2UoKSB7Ci0KLQkJSW1hZ2UgZXhwZWN0ZWQgPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgMTYsIDE2KTsKLQotCQl0cnkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlMYWJlbGVkTGFiZWwgbGFiZWxlZExhYmVsID0gbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0KLQkJCWxhYmVsZWRMYWJlbC5zZXRJbWFnZShleHBlY3RlZCk7Ci0KLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIExhYmVsIGRpZG4ndCByZWNlaXZlIHRoZSBJbWFnZSIsCi0JCQkJZXhwZWN0ZWQsCi0JCQkJbGFiZWwuZ2V0SW1hZ2UoKQotCQkJKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWV4cGVjdGVkLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldEltYWdlRGlzcG9zZSgpIHsKLQotCQlJbWFnZSBleHBlY3RlZCA9IG5ldyBJbWFnZShwYXJlbnQuZ2V0RGlzcGxheSgpLCAxNiwgMTYpOwotCi0JCXRyeSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQkJbGFiZWwuZGlzcG9zZSgpOwotCi0JCQkvLyBUaGlzIHNob3VsZCBub3QgZmFpbCBidXQgc2ltcGx5IGRvIG5vdGhpbmcKLQkJCWxhYmVsZWRMYWJlbC5zZXRJbWFnZShleHBlY3RlZCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlleHBlY3RlZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRUZXh0KCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWxlZExhYmVsIGxhYmVsZWRMYWJlbCA9IG5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCi0JCVN0cmluZyBleHBlY3RlZCA9ICJUaGlzIGlzIGEgdGVzdCI7Ci0JCWxhYmVsZWRMYWJlbC5zZXRUZXh0KGV4cGVjdGVkKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIExhYmVsIGRpZG4ndCByZWNlaXZlIHRoZSB0ZXh0IiwKLQkJCWV4cGVjdGVkLAotCQkJbGFiZWwuZ2V0VGV4dCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGV4dERpc3Bvc2UoKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbGVkTGFiZWwgbGFiZWxlZExhYmVsID0gbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0KLQkJbGFiZWwuZGlzcG9zZSgpOwotCi0JCS8vIFRoaXMgc2hvdWxkIG5vdCBmYWlsIGJ1dCBzaW1wbHkgZG8gbm90aGluZwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiVGhpcyBpcyBhIHRlc3QiOwotCQlsYWJlbGVkTGFiZWwuc2V0VGV4dChleHBlY3RlZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9QYW5lRW5hYmxlclRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvUGFuZUVuYWJsZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OGZkOTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9QYW5lRW5hYmxlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRGlhbG9nUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBQYW5lRW5hYmxlclRlc3QgewotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoU3RhdGUoKSB7Ci0KLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIgPQotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPih0cnVlKTsKLQotCQlEaWFsb2dQYW5lPE5vZGU+IHBhbmUgPSBuZXcgRGlhbG9nUGFuZTxOb2RlPigKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Tm9kZT4oKSwKLQkJCXBhcmVudCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCX0KLQkJfTsKLQotCQluZXcgUGFuZUVuYWJsZXIoYm9vbGVhbkhvbGRlciwgcGFuZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgcGFuZSBzaG91bGQgYmUgZW5hYmxlZCIsCi0JCQlwYW5lLmdldENvbnRyb2woKS5pc0VuYWJsZWQoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAobnVsbCkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgcGFuZSBzaG91bGQgbm90IGJlIGVuYWJsZWQiLAotCQkJcGFuZS5nZXRDb250cm9sKCkuaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKHRydWUpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgcGFuZSBzaG91bGQgYmUgZW5hYmxlZCIsCi0JCQlwYW5lLmdldENvbnRyb2woKS5pc0VuYWJsZWQoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAoZmFsc2UpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUoZmFsc2UpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBub3QgYmUgZW5hYmxlZCIsCi0JCQlwYW5lLmdldENvbnRyb2woKS5pc0VuYWJsZWQoKQotCQkpOwotCi0JCS8vIERpc3Bvc2UKLQkJcGFuZS5kaXNwb3NlKCk7Ci0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9QYW5lVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL1BhbmVWaXNpYmlsaXR5RW5hYmxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBhYzNjZS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL1BhbmVWaXNpYmlsaXR5RW5hYmxlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lVmlzaWJpbGl0eUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkRpYWxvZ1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgUGFuZVZpc2liaWxpdHlFbmFibGVyVGVzdCB7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgewotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hTdGF0ZSgpIHsKLQotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciA9Ci0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KHRydWUpOwotCi0JCURpYWxvZ1BhbmU8Tm9kZT4gcGFuZSA9IG5ldyBEaWFsb2dQYW5lPE5vZGU+KAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOb2RlPigpLAotCQkJcGFyZW50KQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJfQotCQl9OwotCi0JCW5ldyBQYW5lVmlzaWJpbGl0eUVuYWJsZXIoYm9vbGVhbkhvbGRlciwgcGFuZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgcGFuZSBzaG91bGQgYmUgdmlzaWJsZSIsCi0JCQlwYW5lLmdldENvbnRyb2woKS5pc1Zpc2libGUoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAobnVsbCkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgcGFuZSBzaG91bGQgbm90IGJlIHZpc2libGUiLAotCQkJcGFuZS5nZXRDb250cm9sKCkuaXNWaXNpYmxlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKHRydWUpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgcGFuZSBzaG91bGQgYmUgdmlzaWJsZSIsCi0JCQlwYW5lLmdldENvbnRyb2woKS5pc1Zpc2libGUoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAoZmFsc2UpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUoZmFsc2UpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBub3QgYmUgdmlzaWJsZSIsCi0JCQlwYW5lLmdldENvbnRyb2woKS5pc1Zpc2libGUoKQotCQkpOwotCi0JCS8vIERpc3Bvc2UKLQkJcGFuZS5kaXNwb3NlKCk7Ci0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDMwOTc3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0Jvb2xlYW5TdGF0ZUNvbnRyb2xsZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3QuU1dUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGJvb2xlYW4gc3RhdGUgY29udHJvbGxlcnMgKCdlbmFibGVkJyBhbmQgJ3Zpc2libGUnKS4KLSAqIDxwPgotICogTm90ZSB0aGUgYmVoYXZpb3Igb2YgY29tcG9zaXRlczo8dWw+Ci0gKiA8bGk+V2hlbiBhIGNvbXBvc2l0ZSBpcyBkaXNhYmxlZCwgaXRzIGNoaWxkcmVuIGFyZSBkaXNhYmxlZCBidXQgPGVtPm5vdDwvZW0+Ci0gKiAgICAgZ3JheWVkIG91dC4KLSAqIDxsaT5XaGVuIGEgY29tcG9zaXRlIGlzIG1hZGUgaW52aXNpYmxlLCBpdHMgY2hpbGRyZW4gYXJlIGFsc28gbWFkZQotICogICAgIGludmlzaWJsZS4KLSAqIDwvdWw+Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXJVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JcHJpdmF0ZSBmaW5hbCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGVuYWJsZWRIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHZpc2libGVIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdFNlbGVjdGlvbkhvbGRlcjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlXaW5kb3cgd2luZG93ID0gbmV3IEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXJVSVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXJVSVRlc3QoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMuZW5hYmxlZEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKTsKLQkJdGhpcy52aXNpYmxlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpOwotCQl0aGlzLmxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQl0aGlzLmxpc3RTZWxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4obnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiByZXN1bHQgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJ6ZXJvIik7Ci0JCXJlc3VsdC5hZGQoIm9uZSIpOwotCQlyZXN1bHQuYWRkKCJ0d28iKTsKLQkJcmVzdWx0LmFkZCgidGhyZWUiKTsKLQkJcmVzdWx0LmFkZCgiZm91ciIpOwotCQlyZXN1bHQuYWRkKCJmaXZlIik7Ci0JCXJlc3VsdC5hZGQoInNpeCIpOwotCQlyZXN1bHQuYWRkKCJzZXZlbiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlwYXJlbnQuc2V0U2l6ZSg1MDAsIDE1MCk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIHdpZGdldFBhbmVsID0gdGhpcy5idWlsZFdpZGdldFBhbmVscyhtYWluUGFuZWwpOwotCQl0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCwgd2lkZ2V0UGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFdpZGdldFBhbmVscyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0zNSk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCi0JCXRoaXMuYnVpbGRXaWRnZXRQYW5lbDEocGFuZWwpOwotCQl0aGlzLmJ1aWxkV2lkZ2V0UGFuZWwyKHBhbmVsKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkV2lkZ2V0UGFuZWwxKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5IT1JJWk9OVEFMKSk7Ci0KLQkJQnV0dG9uIGVuYWJsZWRDb21ib0JveENoZWNrQm94ID0gdGhpcy5idWlsZEVuYWJsZWRDb21ib0JveENoZWNrQm94KHBhbmVsKTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLmVuYWJsZWRIb2xkZXIsIGVuYWJsZWRDb21ib0JveENoZWNrQm94KTsKLQotCQlCdXR0b24gdmlzaWJsZUNvbWJvQm94Q2hlY2tCb3ggPSB0aGlzLmJ1aWxkVmlzaWJsZUNvbWJvQm94Q2hlY2tCb3gocGFuZWwpOwotCQlTV1RUb29scy5iaW5kKHRoaXMudmlzaWJsZUhvbGRlciwgdmlzaWJsZUNvbWJvQm94Q2hlY2tCb3gpOwotCi0JCUxhYmVsIGNvbWJvQm94TGFiZWwgPSB0aGlzLmJ1aWxkQ29tYm9Cb3hMYWJlbChwYW5lbCk7Ci0JCUNvbWJvIGNvbWJvQm94ID0gdGhpcy5idWlsZENvbWJvQm94KHBhbmVsKTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLmxpc3RIb2xkZXIsIHRoaXMubGlzdFNlbGVjdGlvbkhvbGRlciwgY29tYm9Cb3gpOwotCQlTV1RUb29scy5jb250cm9sRW5hYmxlZFN0YXRlKHRoaXMuZW5hYmxlZEhvbGRlciwgY29tYm9Cb3hMYWJlbCwgY29tYm9Cb3gpOwotCQlTV1RUb29scy5jb250cm9sVmlzaWJsZVN0YXRlKHRoaXMudmlzaWJsZUhvbGRlciwgY29tYm9Cb3hMYWJlbCwgY29tYm9Cb3gpOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGJ1aWxkRW5hYmxlZENvbWJvQm94Q2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENoZWNrQm94KHBhcmVudCwgImVuYWJsZWQiKTsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbiBidWlsZFZpc2libGVDb21ib0JveENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDaGVja0JveChwYXJlbnQsICJ2aXNpYmxlIik7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gYnVpbGRDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dCh0ZXh0KTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgTGFiZWwgYnVpbGRDb21ib0JveExhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQoImxpc3Q6Iik7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIENvbWJvIGJ1aWxkQ29tYm9Cb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkV2lkZ2V0UGFuZWwyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5IT1JJWk9OVEFMKSk7Ci0KLQkJQnV0dG9uIGNoZWNrQm94MSA9IHRoaXMuYnVpbGRDaGVja0JveChwYW5lbCwgIm9uZSIpOwotCQl0aGlzLmJ1aWxkQ2hlY2tCb3gocGFuZWwsICJ0d28iKTsKLQkJdGhpcy5idWlsZENoZWNrQm94KHBhbmVsLCAidGhyZWUiKTsKLQkJdGhpcy5idWlsZENoZWNrQm94KHBhbmVsLCAiZm91ciIpOwotCi0JCVNXVFRvb2xzLmNvbnRyb2xFbmFibGVkU3RhdGUodGhpcy5lbmFibGVkSG9sZGVyLCBwYW5lbCwgY2hlY2tCb3gxKTsKLQkJU1dUVG9vbHMuY29udHJvbFZpc2libGVTdGF0ZSh0aGlzLnZpc2libGVIb2xkZXIsIHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCB3aWRnZXRQYW5lbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHdpZGdldFBhbmVsKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZENsZWFyRW5hYmxlZE1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyVmlzaWJsZU1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZE51bGxTZWxlY3Rpb25Nb2RlbEJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGROZXh0QnV0dG9uKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDbGVhckVuYWJsZWRNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRDbGVhckVuYWJsZWRNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhckVuYWJsZWRNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIGVuYWJsZWQgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlCb29sZWFuU3RhdGVDb250cm9sbGVyVUlUZXN0LnRoaXMuY2xlYXJFbmFibGVkTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciBlbmFibGVkIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgY2xlYXJFbmFibGVkTW9kZWwoKSB7Ci0JCXRoaXMuZW5hYmxlZEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDbGVhclZpc2libGVNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRDbGVhclZpc2libGVNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhclZpc2libGVNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIHZpc2libGUgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlCb29sZWFuU3RhdGVDb250cm9sbGVyVUlUZXN0LnRoaXMuY2xlYXJWaXNpYmxlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciB2aXNpYmxlIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgY2xlYXJWaXNpYmxlTW9kZWwoKSB7Ci0JCXRoaXMudmlzaWJsZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGROdWxsU2VsZWN0aW9uTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTnVsbFNlbGVjdGlvbk1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZE51bGxTZWxlY3Rpb25Nb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIm51bGwgc2VsZWN0aW9uIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdC50aGlzLnNldFNlbGVjdGlvbk1vZGVsTnVsbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoIm51bGwgc2VsZWN0aW9uIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgc2V0U2VsZWN0aW9uTW9kZWxOdWxsKCkgewotCQl0aGlzLmxpc3RTZWxlY3Rpb25Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTmV4dEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGROZXh0QUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZE5leHRBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJuZXh0IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdC50aGlzLm5leHQoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJuZXh0Iik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgbmV4dCgpIHsKLQkJdGhpcy5saXN0U2VsZWN0aW9uSG9sZGVyLnNldFZhbHVlKHRoaXMuZ2V0TmV4dExpc3RTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmV4dExpc3RTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXIuZ2V0KHRoaXMuZ2V0TmV4dExpc3RTZWxlY3Rpb25JbmRleCgpKTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXROZXh0TGlzdFNlbGVjdGlvbkluZGV4KCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldExpc3RTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWluZGV4Kys7Ci0JCXJldHVybiAoaW5kZXggPT0gdGhpcy5saXN0SG9sZGVyLnNpemUoKSkgPyAwIDogaW5kZXg7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0TGlzdFNlbGVjdGlvbkluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLmluZGV4T2YodGhpcy5nZXRMaXN0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldExpc3RTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RTZWxlY3Rpb25Ib2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0NoZWNrQm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9DaGVja0JveE1vZGVsQmluZGluZ1VJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjY1ZTM5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0NoZWNrQm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2YgY2hlY2sgYm94ZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENoZWNrQm94TW9kZWxCaW5kaW5nVUlUZXN0Ci0JZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdwotewotCXByaXZhdGUgZmluYWwgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlwcml2YXRlIGZpbmFsIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGZsYWcxSG9sZGVyOwotCXByaXZhdGUgZmluYWwgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnMkhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gbm90RmxhZzJIb2xkZXI7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBDaGVja0JveE1vZGVsQmluZGluZ1VJVGVzdChhcmdzKTsKLQkJd2luZG93LnNldEJsb2NrT25PcGVuKHRydWUpOwotCQl3aW5kb3cub3BlbigpOwotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5kaXNwb3NlKCk7Ci0JCVN5c3RlbS5leGl0KDApOwotCX0KLQotCXByaXZhdGUgQ2hlY2tCb3hNb2RlbEJpbmRpbmdVSVRlc3QoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMudGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCh0cnVlLCB0cnVlKTsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4odGhpcy50ZXN0TW9kZWwpOwotCQl0aGlzLmZsYWcxSG9sZGVyID0gdGhpcy5idWlsZEZsYWcxSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5mbGFnMkhvbGRlciA9IHRoaXMuYnVpbGRGbGFnMkhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMubm90RmxhZzJIb2xkZXIgPSB0aGlzLmJ1aWxkTm90RmxhZzJIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEZsYWcxSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBUZXN0TW9kZWwuRkxBRzFfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNGbGFnMSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzEodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEZsYWcySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBUZXN0TW9kZWwuRkxBRzJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNGbGFnMigpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzIodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE5vdEZsYWcySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBUZXN0TW9kZWwuTk9UX0ZMQUcyX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzTm90RmxhZzIoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5vdEZsYWcyKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCSgoU2hlbGwpIHBhcmVudCkuc2V0VGV4dCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJcGFyZW50LnNldFNpemUoNDAwLCAxMDApOwotCQlDb21wb3NpdGUgbWFpblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbWFpblBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCBjaGVja0JveFBhbmVsID0gdGhpcy5idWlsZENoZWNrQm94UGFuZWwobWFpblBhbmVsKTsKLQkJdGhpcy5idWlsZENvbnRyb2xQYW5lbChtYWluUGFuZWwsIGNoZWNrQm94UGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZENoZWNrQm94UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMzUpOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZEZsYWcxQ2hlY2tCb3gocGFuZWwpOwotCQl0aGlzLmJ1aWxkRmxhZzJDaGVja0JveChwYW5lbCk7Ci0JCXRoaXMuYnVpbGROb3RGbGFnMkNoZWNrQm94KHBhbmVsKTsKLQkJdGhpcy5idWlsZFVuYXR0YWNoZWRDaGVja0JveChwYW5lbCk7Ci0KLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEZsYWcxQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dCgiZmxhZyAxIik7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5mbGFnMUhvbGRlciwgY2hlY2tCb3gpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEZsYWcyQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dCgiZmxhZyAyIik7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5mbGFnMkhvbGRlciwgY2hlY2tCb3gpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE5vdEZsYWcyQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dCgibm90IGZsYWcgMiIpOwotCQlTV1RUb29scy5iaW5kKHRoaXMubm90RmxhZzJIb2xkZXIsIGNoZWNrQm94KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRVbmF0dGFjaGVkQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dCgidW5hdHRhY2hlZCIpOwotCQljaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkVW5hdHRhY2hlZFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRVbmF0dGFjaGVkU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidW5hdHRhY2hlZCBkZWZhdWx0IHNlbGVjdGVkOiAiICsgZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmF0dGFjaGVkIHNlbGVjdGVkOiAiICsgZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgY2hlY2tCb3hQYW5lbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNoZWNrQm94UGFuZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkRmxpcEZsYWcxQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZE5vdEZsYWcyVG9nZ2xlQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24ocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEZsaXBGbGFnMUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRGbGlwRmxhZzFBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkRmxpcEZsYWcxQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiZmxpcCBmbGFnIDEiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlDaGVja0JveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmZsaXBGbGFnMSgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImZsaXAgZmxhZyAxIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgZmxpcEZsYWcxKCkgewotCQl0aGlzLnRlc3RNb2RlbC5zZXRGbGFnMSggISB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcxKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE5vdEZsYWcyVG9nZ2xlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5UT0dHTEUpOwotCQljaGVja0JveC5zZXRUZXh0KCJub3QgZmxhZyAyIik7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5ub3RGbGFnMkhvbGRlciwgY2hlY2tCb3gpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENsZWFyTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhck1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlDaGVja0JveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIGNsZWFyTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFJlc3RvcmVNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRSZXN0b3JlTW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVzdG9yZSBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUNoZWNrQm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVzdG9yZSBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0TW9kZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFByaW50TW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkUHJpbnRNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRQcmludE1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicHJpbnQgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlDaGVja0JveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJwcmludCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHByaW50TW9kZWwoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZmxhZyAxOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJmbGFnIDI6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcyKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vdCBmbGFnIDI6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc05vdEZsYWcyKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKiIpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBib29sZWFuIGZsYWcxOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBRzFfUFJPUEVSVFkgPSAiZmxhZzEiOwotCQlwcml2YXRlIGJvb2xlYW4gZmxhZzI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHMl9QUk9QRVJUWSA9ICJmbGFnMiI7Ci0JCXByaXZhdGUgYm9vbGVhbiBub3RGbGFnMjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9GTEFHMl9QUk9QRVJUWSA9ICJub3RGbGFnMiI7Ci0JCi0JCXB1YmxpYyBUZXN0TW9kZWwoYm9vbGVhbiBmbGFnMSwgYm9vbGVhbiBmbGFnMikgewotCQkJdGhpcy5mbGFnMSA9IGZsYWcxOwotCQkJdGhpcy5mbGFnMiA9IGZsYWcyOwotCQkJdGhpcy5ub3RGbGFnMiA9ICEgZmxhZzI7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNGbGFnMSgpIHsKLQkJCXJldHVybiB0aGlzLmZsYWcxOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEZsYWcxKGJvb2xlYW4gZmxhZzEpIHsKLQkJCWJvb2xlYW4gb2xkID0gdGhpcy5mbGFnMTsKLQkJCXRoaXMuZmxhZzEgPSBmbGFnMTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGTEFHMV9QUk9QRVJUWSwgb2xkLCBmbGFnMSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNGbGFnMigpIHsKLQkJCXJldHVybiB0aGlzLmZsYWcyOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEZsYWcyKGJvb2xlYW4gZmxhZzIpIHsKLQkJCWJvb2xlYW4gb2xkID0gdGhpcy5mbGFnMjsKLQkJCXRoaXMuZmxhZzIgPSBmbGFnMjsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGTEFHMl9QUk9QRVJUWSwgb2xkLCBmbGFnMik7Ci0JCi0JCQlvbGQgPSB0aGlzLm5vdEZsYWcyOwotCQkJdGhpcy5ub3RGbGFnMiA9ICEgZmxhZzI7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9UX0ZMQUcyX1BST1BFUlRZLCBvbGQsIHRoaXMubm90RmxhZzIpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzTm90RmxhZzIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub3RGbGFnMjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROb3RGbGFnMihib29sZWFuIG5vdEZsYWcyKSB7Ci0JCQl0aGlzLnNldEZsYWcyKCAhIG5vdEZsYWcyKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE1vZGVsKCIgKyB0aGlzLmlzRmxhZzEoKSArICIgLSAiICsgdGhpcy5pc0ZsYWcyKCkgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0Ryb3BEb3duTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MWI0OGQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2YgcmVhZC1vbmx5IGNvbWJvLWJveGVzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JZmluYWwgVGFza0xpc3QgdGFza0xpc3Q7Ci0JcHJpdmF0ZSBmaW5hbCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRhc2tMaXN0PiB0YXNrTGlzdEhvbGRlcjsKLQlwcml2YXRlIFRleHQgdGFza1RleHRGaWVsZDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlXaW5kb3cgd2luZG93ID0gbmV3IERyb3BEb3duTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdChhcmdzKTsKLQkJd2luZG93LnNldEJsb2NrT25PcGVuKHRydWUpOwotCQl3aW5kb3cub3BlbigpOwotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5kaXNwb3NlKCk7Ci0JCVN5c3RlbS5leGl0KDApOwotCX0KLQotCXByaXZhdGUgRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLnRhc2tMaXN0ID0gbmV3IFRhc2tMaXN0KCk7Ci0JCXRoaXMudGFza0xpc3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRhc2tMaXN0Pih0aGlzLnRhc2tMaXN0KTsKLQkJdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJzd2ltIik7Ci0JCXRoaXMudGFza0xpc3QuYWRkVGFzaygiYmlrZSIpOwotCQl0aGlzLnRhc2tMaXN0LmFkZFRhc2soInJ1biIpOwotCQlUYXNrIHJlc3QgPSB0aGlzLnRhc2tMaXN0LmFkZFRhc2soInJlc3QiKTsKLQkJdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJyZXBlYXQiKTsKLQkJdGhpcy50YXNrTGlzdC5zZXRQcmlvcml0eVRhc2socmVzdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkoKFNoZWxsKSBwYXJlbnQpLnNldFRleHQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCXBhcmVudC5zZXRTaXplKDgwMCwgMzAwKTsKLQkJQ29tcG9zaXRlIG1haW5QYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW1haW5QYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgdGFza0xpc3RQYW5lbCA9IHRoaXMuYnVpbGRUYXNrTGlzdFBhbmVsKG1haW5QYW5lbCk7Ci0JCXRoaXMuYnVpbGRDb250cm9sUGFuZWwobWFpblBhbmVsLCB0YXNrTGlzdFBhbmVsKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRUYXNrTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTMwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRUYXNrTGlzdFBhbmVsXyhwYW5lbCk7ICAvLyBmYWxzZSA9IG5hdGl2ZSAoQ29tYm8pCi0KLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFRhc2tMaXN0UGFuZWxfKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDUwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZE9iamVjdFRhc2tMaXN0UGFuZWwocGFuZWwpOwotCi0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRQcmltaXRpdmVUYXNrTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDUwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRVbnNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE9iamVjdFRhc2tMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkVW5zb3J0ZWRPYmplY3RMaXN0UGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRPYmplY3RMaXN0UGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkT2JqZWN0TGlzdFBhbmVsKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRVbnNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICJwcmltaXRpdmUgdW5zb3J0ZWQiOwotCQl0aGlzLmJ1aWxkQ29tYm9Cb3hQYW5lbChwYXJlbnQsIGxhYmVsLCB0aGlzLmJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza05hbWVBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RyaW5nIGxhYmVsID0gInByaW1pdGl2ZSBzb3J0ZWQiOwotCQl0aGlzLmJ1aWxkQ29tYm9Cb3hQYW5lbChwYXJlbnQsIGxhYmVsLCB0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza05hbWVBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICJwcmltaXRpdmUgcmV2ZXJzZSBzb3J0ZWQiOwotCQl0aGlzLmJ1aWxkQ29tYm9Cb3hQYW5lbChwYXJlbnQsIGxhYmVsLCB0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCksIHRoaXMuYnVpbGRQcmlvcml0eVRhc2tOYW1lQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRVbnNvcnRlZE9iamVjdExpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICJvYmplY3QgdW5zb3J0ZWQiOwotCQl0aGlzLmJ1aWxkQ29tYm9Cb3hQYW5lbChwYXJlbnQsIGxhYmVsLCB0aGlzLmJ1aWxkVW5zb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza0FkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkU3RhbmRhcmRTb3J0ZWRPYmplY3RMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTdHJpbmcgbGFiZWwgPSAib2JqZWN0IHNvcnRlZCI7Ci0JCXRoaXMuYnVpbGRDb21ib0JveFBhbmVsKHBhcmVudCwgbGFiZWwsIHRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZE9iamVjdExpc3RNb2RlbCgpLCB0aGlzLmJ1aWxkUHJpb3JpdHlUYXNrQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTdHJpbmcgbGFiZWwgPSAib2JqZWN0IHJldmVyc2Ugc29ydGVkIjsKLQkJdGhpcy5idWlsZENvbWJvQm94UGFuZWwocGFyZW50LCBsYWJlbCwgdGhpcy5idWlsZEN1c3RvbVNvcnRlZE9iamVjdExpc3RNb2RlbCgpLCB0aGlzLmJ1aWxkUHJpb3JpdHlUYXNrQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRVbnNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPih0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPih0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCksIHRoaXMuYnVpbGRDdXN0b21TdHJpbmdDb21wYXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGRVbnNvcnRlZE9iamVjdExpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRPYmplY3RUYXNrTGlzdEFkYXB0ZXIoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkU3RhbmRhcmRTb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFRhc2s+KHRoaXMuYnVpbGRPYmplY3RUYXNrTGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUYXNrPiBidWlsZEN1c3RvbVNvcnRlZE9iamVjdExpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8VGFzaz4odGhpcy5idWlsZE9iamVjdFRhc2tMaXN0QWRhcHRlcigpLCB0aGlzLmJ1aWxkQ3VzdG9tVGFza0NvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSA8RT4gdm9pZCBidWlsZENvbWJvQm94UGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBMaXN0VmFsdWVNb2RlbDxFPiBtb2RlbCwgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1Nb2RlbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0KLQkJTGFiZWwgY29tYm9Cb3hMYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULkxFRlQgfCBTV1QuVkVSVElDQUwpOwotCQljb21ib0JveExhYmVsLnNldFRleHQobGFiZWwpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDMpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDIwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNSk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQljb21ib0JveExhYmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCUNvbWJvIGNvbWJvQm94ID0gdGhpcy5idWlsZENvbWJvQm94KHBhbmVsKTsKLQkJZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjb21ib0JveExhYmVsKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCWNvbWJvQm94LnNldExheW91dERhdGEoZmQpOwotCQlTV1RUb29scy5iaW5kKG1vZGVsLCBzZWxlY3RlZEl0ZW1Nb2RlbCwgY29tYm9Cb3gpOyAgLy8gdXNlICN0b1N0cmluZygpCi0JfQotCi0JcHJpdmF0ZSBDb21ibyBidWlsZENvbWJvQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkQ3VzdG9tU3RyaW5nQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJCQlyZXR1cm4gczIuY29tcGFyZVRvKHMxKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8VGFzaz4gYnVpbGRDdXN0b21UYXNrQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFRhc2s+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFRhc2sgdG8xLCBUYXNrIHRvMikgewotCQkJCXJldHVybiB0bzIuY29tcGFyZVRvKHRvMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFRhc2tMaXN0LCBTdHJpbmc+KHRoaXMudGFza0xpc3RIb2xkZXIsIFRhc2tMaXN0LlRBU0tfTkFNRVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnRhc2tOYW1lcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGRPYmplY3RUYXNrTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFRhc2s+KHRoaXMudGFza0xpc3RIb2xkZXIsIFRhc2tMaXN0LlRBU0tTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxUYXNrPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QudGFza3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFzaz4gYnVpbGRQcmlvcml0eVRhc2tBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByaW9yaXR5VGFza0FkYXB0ZXIodGhpcy50YXNrTGlzdEhvbGRlcik7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByaW9yaXR5VGFza0FkYXB0ZXIKLQkJZXh0ZW5kcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFRhc2s+Ci0JewotCQlQcmlvcml0eVRhc2tBZGFwdGVyKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFza0xpc3Q+IHRhc2tMaXN0SG9sZGVyKSB7Ci0JCQlzdXBlcih0YXNrTGlzdEhvbGRlciwgVGFza0xpc3QuUFJJT1JJVFlfVEFTS19QUk9QRVJUWSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBUYXNrIGJ1aWxkVmFsdWVfKCkgewotCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQcmlvcml0eVRhc2soKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFRhc2sgdmFsdWUpIHsKLQkJCXRoaXMuc3ViamVjdC5zZXRQcmlvcml0eVRhc2sodmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQcmlvcml0eVRhc2tOYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcmlvcml0eVRhc2tOYW1lQWRhcHRlcih0aGlzLnRhc2tMaXN0SG9sZGVyKTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgUHJpb3JpdHlUYXNrTmFtZUFkYXB0ZXIKLQkJZXh0ZW5kcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFN0cmluZz4KLQl7Ci0JCVByaW9yaXR5VGFza05hbWVBZGFwdGVyKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFza0xpc3Q+IHRhc2tMaXN0SG9sZGVyKSB7Ci0JCQlzdXBlcih0YXNrTGlzdEhvbGRlciwgVGFza0xpc3QuUFJJT1JJVFlfVEFTS19OQU1FX1BST1BFUlRZKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UHJpb3JpdHlUYXNrTmFtZSgpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50LCBDb250cm9sIHRhc2tMaXN0UGFuZWwpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh0YXNrTGlzdFBhbmVsKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCBtaXNjID0gdGhpcy5idWlsZE1pc2NUYXNrUGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQWRkUmVtb3ZlVGFza1BhbmVsKHBhbmVsLCBtaXNjKTsKLQl9Ci0KLQkvLyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gYXNzb2NpYXRlIGFuIEFDSSB3aXRoIGZvcm0gZGF0YT8KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRNaXNjVGFza1BhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC00MDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkQ2xlYXJMaXN0QUNJKCkuZmlsbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDbGVhck1vZGVsQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRSZXN0b3JlTW9kZWxBQ0koKS5maWxsKHBhbmVsKTsKLQkJdGhpcy5idWlsZENoYW5nZVByaW9yaXR5VGFza0FDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ2xlYXJQcmlvcml0eVRhc2tBQ0koKS5maWxsKHBhbmVsKTsKLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyTGlzdEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIGxpc3QiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5jbGVhclRhc2tzKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgYWxsIHRoZSB0YXNrcyIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhck1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgdGhlIHRhc2sgbGlzdCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVzdG9yZSB0aGUgdGFzayBsaXN0IG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENoYW5nZVByaW9yaXR5VGFza0FDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNoYW5nZSBwcmlvcml0eSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURyb3BEb3duTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmNoYW5nZVByaW9yaXR5VGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNoYW5nZSB0aGUgcHJpb3JpdHkgdGFzayIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhclByaW9yaXR5VGFza0FDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIHByaW9yaXR5IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuY2xlYXJQcmlvcml0eVRhc2soKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciB0aGUgcHJpb3JpdHkgdGFzayIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRBZGRSZW1vdmVUYXNrUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCBjbGVhckJ1dHRvbikgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY2xlYXJCdXR0b24pOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgYWRkQnV0dG9uID0gdGhpcy5idWlsZEFkZEJ1dHRvbihwYW5lbCk7Ci0JCUNvbnRyb2wgcmVtb3ZlQnV0dG9uID0gdGhpcy5idWlsZFJlbW92ZUJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRUYXNrVGV4dEZpZWxkKHBhbmVsLCBhZGRCdXR0b24sIHJlbW92ZUJ1dHRvbik7Ci0JfQotCi0JLy8gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGFzc29jaWF0ZSBhbiBBQ0kgd2l0aCBmb3JtIGRhdGE/Ci0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkQWRkQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkQWRkQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRBZGRBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJhZGQiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5hZGRUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiYWRkIGEgdGFzayB3aXRoIHRoZSBuYW1lIGluIHRoZSBlbnRyeSBmaWVsZCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQkvLyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gYXNzb2NpYXRlIGFuIEFDSSB3aXRoIGZvcm0gZGF0YT8KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRSZW1vdmVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZFJlbW92ZUFDSSgpLmZpbGwocGFuZWwpOwotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVtb3ZlQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVtb3ZlIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMucmVtb3ZlVGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlbW92ZSB0aGUgdGFzayB3aXRoIHRoZSBuYW1lIGluIHRoZSBlbnRyeSBmaWVsZCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRUYXNrVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgYWRkQnV0dG9uLCBDb250cm9sIHJlbW92ZUJ1dHRvbikgewotCQl0aGlzLnRhc2tUZXh0RmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChhZGRCdXR0b24pOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocmVtb3ZlQnV0dG9uKTsKLQkJdGhpcy50YXNrVGV4dEZpZWxkLnNldExheW91dERhdGEoZmQpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHRhc2tUZXh0RmllbGRUZXh0KCkgewotCQlyZXR1cm4gdGhpcy50YXNrVGV4dEZpZWxkLmdldFRleHQoKTsKLQl9Ci0KLQl2b2lkIGFkZFRhc2soKSB7Ci0JCVN0cmluZyB0YXNrVGV4dCA9IHRoaXMudGFza1RleHRGaWVsZFRleHQoKTsKLQkJaWYgKHRhc2tUZXh0Lmxlbmd0aCgpICE9IDApIHsKLQkJCXRoaXMudGFza0xpc3QuYWRkVGFzayh0YXNrVGV4dCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZVRhc2soKSB7Ci0JCVN0cmluZyB0YXNrID0gdGhpcy50YXNrVGV4dEZpZWxkVGV4dCgpOwotCQlpZiAodGFzay5sZW5ndGgoKSAhPSAwKSB7Ci0JCQl0aGlzLnRhc2tMaXN0LnJlbW92ZVRhc2sodGFzayk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGNsZWFyVGFza3MoKSB7Ci0JCXRoaXMudGFza0xpc3QuY2xlYXJUYXNrcygpOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50YXNrTGlzdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50YXNrTGlzdEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRhc2tMaXN0KTsKLQl9Ci0KLQl2b2lkIGNoYW5nZVByaW9yaXR5VGFzaygpIHsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlmb3IgKFRhc2sgdGFzayA6IHRoaXMudGFza0xpc3QuZ2V0VGFza3MoKSkgewotCQkJaWYgKHRoaXMudGFza0xpc3QuZ2V0UHJpb3JpdHlUYXNrKCkgPT0gdGFzaykgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZvdW5kKSB7Ci0JCQkJCXRoaXMudGFza0xpc3Quc2V0UHJpb3JpdHlUYXNrKHRhc2spOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUl0ZXJhdG9yPFRhc2s+IHRhc2tzID0gdGhpcy50YXNrTGlzdC50YXNrcygpOwotCQlpZiAodGFza3MuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLnRhc2tMaXN0LnNldFByaW9yaXR5VGFzayh0YXNrcy5uZXh0KCkpOwotCQl9Ci0JfQotCi0Jdm9pZCBjbGVhclByaW9yaXR5VGFzaygpIHsKLQkJdGhpcy50YXNrTGlzdC5zZXRQcmlvcml0eVRhc2sobnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhc2tMaXN0ICoqKioqKioqKioKLQotCS8vIG5vdGUgYWJzZW5jZSBvZiB2YWxpZGF0aW9uLi4uCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUYXNrTGlzdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiB0YXNrTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfTkFNRVNfTElTVCA9ICJ0YXNrTmFtZXMiOwotCQlwcml2YXRlIGZpbmFsIExpc3Q8VGFzaz4gdGFza3MgPSBuZXcgQXJyYXlMaXN0PFRhc2s+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLU19MSVNUID0gInRhc2tzIjsKLQkJcHJpdmF0ZSBTdHJpbmcgcHJpb3JpdHlUYXNrTmFtZSA9IG51bGw7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklPUklUWV9UQVNLX05BTUVfUFJPUEVSVFkgPSAicHJpb3JpdHlUYXNrTmFtZSI7Ci0JCXByaXZhdGUgVGFzayBwcmlvcml0eVRhc2sgPSBudWxsOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfVEFTS19QUk9QRVJUWSA9ICJwcmlvcml0eVRhc2siOwotCQlwdWJsaWMgVGFza0xpc3QoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiB0YXNrTmFtZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXNrTmFtZXMubGlzdEl0ZXJhdG9yKCk7Ci0JCX0KLQkJcHVibGljIEl0ZXJhYmxlPFRhc2s+IGdldFRhc2tzKCkgewotCQkJcmV0dXJuIHRoaXMudGFza3M7Ci0JCX0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxUYXNrPiB0YXNrcygpIHsKLQkJCXJldHVybiB0aGlzLnRhc2tzLmxpc3RJdGVyYXRvcigpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0UHJpb3JpdHlUYXNrTmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLnByaW9yaXR5VGFza05hbWU7Ci0JCX0KLQkJcHVibGljIFRhc2sgZ2V0UHJpb3JpdHlUYXNrKCkgewotCQkJcmV0dXJuIHRoaXMucHJpb3JpdHlUYXNrOwotCQl9Ci0JCXB1YmxpYyBUYXNrIGFkZFRhc2soU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0xpc3QodGFza05hbWUsIHRoaXMudGFza05hbWVzLCBUQVNLX05BTUVTX0xJU1QpOwotCQkJVGFzayB0YXNrID0gbmV3IFRhc2sodGFza05hbWUpOwotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KHRhc2ssIHRoaXMudGFza3MsIFRBU0tTX0xJU1QpOwotCQkJcmV0dXJuIHRhc2s7Ci0JCX0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVUYXNrKFN0cmluZyB0YXNrTmFtZSkgewotCQkJaW50IGluZGV4ID0gdGhpcy50YXNrTmFtZXMuaW5kZXhPZih0YXNrTmFtZSk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlUYXNrIHRhc2sgPSB0aGlzLnRhc2tzLmdldChpbmRleCk7Ci0JCQkJaWYgKHRhc2sgPT0gdGhpcy5wcmlvcml0eVRhc2spIHsKLQkJCQkJdGhpcy5zZXRQcmlvcml0eVRhc2sobnVsbCk7Ci0JCQkJfQotCQkJCS8vIGFzc3VtZSB0aGUgaW5kZXhlcyBtYXRjaC4uLgotCQkJCXRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLnRhc2tOYW1lcywgVEFTS19OQU1FU19MSVNUKTsKLQkJCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy50YXNrcywgVEFTS1NfTElTVCk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXJUYXNrcygpIHsKLQkJCXRoaXMuc2V0UHJpb3JpdHlUYXNrKG51bGwpOwotCQkJdGhpcy5jbGVhckxpc3QodGhpcy50YXNrTmFtZXMsIFRBU0tfTkFNRVNfTElTVCk7Ci0JCQl0aGlzLmNsZWFyTGlzdCh0aGlzLnRhc2tzLCBUQVNLU19MSVNUKTsKLQkJfQotCQlwcml2YXRlIHZvaWQgc2V0UHJpb3JpdHlUYXNrTmFtZShTdHJpbmcgcHJpb3JpdHlUYXNrTmFtZSkgewotCQkJU3RyaW5nIG9sZCA9IHRoaXMucHJpb3JpdHlUYXNrTmFtZTsKLQkJCXRoaXMucHJpb3JpdHlUYXNrTmFtZSA9IHByaW9yaXR5VGFza05hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJJT1JJVFlfVEFTS19OQU1FX1BST1BFUlRZLCBvbGQsIHByaW9yaXR5VGFza05hbWUpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFByaW9yaXR5VGFzayhUYXNrIHByaW9yaXR5VGFzaykgewotCQkJVGFzayBvbGQgPSB0aGlzLnByaW9yaXR5VGFzazsKLQkJCXRoaXMucHJpb3JpdHlUYXNrID0gcHJpb3JpdHlUYXNrOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBSSU9SSVRZX1RBU0tfUFJPUEVSVFksIG9sZCwgcHJpb3JpdHlUYXNrKTsKLQkJCXRoaXMuc2V0UHJpb3JpdHlUYXNrTmFtZSgocHJpb3JpdHlUYXNrID09IG51bGwpID8gbnVsbCA6IHByaW9yaXR5VGFzay5nZXROYW1lKCkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhc2sgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUYXNrIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIERpc3BsYXlhYmxlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBpbnQgaW5zdGFuY2VDb3VudDsKLQkJcHJpdmF0ZSBzdGF0aWMgaW50IElOU1RBTkNFX0NPVU5UID0gMTsKLQkJcHVibGljIFRhc2soU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmluc3RhbmNlQ291bnQgPSBJTlNUQU5DRV9DT1VOVCsrOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLm5hbWUgKyAiOiAiICsgdGhpcy5pbnN0YW5jZUNvdW50OwotCQl9Ci0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKERpc3BsYXlhYmxlIG8pIHsKLQkJCXJldHVybiBERUZBVUxUX0NPTVBBUkFUT1IuY29tcGFyZSh0aGlzLCBvKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMuZGlzcGxheVN0cmluZygpOwotCQl9Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBEaXNwbGF5YWJsZSBleHRlbmRzIE1vZGVsLCBDb21wYXJhYmxlPERpc3BsYXlhYmxlPiB7Ci0JCi0JCVN0cmluZyBkaXNwbGF5U3RyaW5nKCk7Ci0JCQlTdHJpbmcgRElTUExBWV9TVFJJTkdfUFJPUEVSVFkgPSAiZGlzcGxheVN0cmluZyI7Ci0JCi0JCi0JCS8vICoqKioqKioqKiogaGVscGVyIGltcGxlbWVudGF0aW9ucyAqKioqKioqKioqCi0JCi0JCUNvbGxhdG9yIERFRkFVTFRfQ09MTEFUT1IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQotCQlDb21wYXJhdG9yPERpc3BsYXlhYmxlPiBERUZBVUxUX0NPTVBBUkFUT1IgPQotCQkJbmV3IENvbXBhcmF0b3I8RGlzcGxheWFibGU+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShEaXNwbGF5YWJsZSBkMSwgRGlzcGxheWFibGUgZDIpIHsKLQkJCQkJLy8gZGlzYWxsb3cgZHVwbGljYXRlcyBiYXNlZCBvbiBvYmplY3QgaWRlbnRpdHkKLQkJCQkJaWYgKGQxID09IGQyKSB7Ci0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJfQotCQotCQkJCQkvLyBmaXJzdCBjb21wYXJlIGRpc3BsYXkgc3RyaW5ncyB1c2luZyB0aGUgZGVmYXVsdCBjb2xsYXRvcgotCQkJCQlpbnQgcmVzdWx0ID0gREVGQVVMVF9DT0xMQVRPUi5jb21wYXJlKGQxLmRpc3BsYXlTdHJpbmcoKSwgZDIuZGlzcGxheVN0cmluZygpKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQl9Ci0JCi0JCQkJCS8vIHRoZW4gY29tcGFyZSB1c2luZyBvYmplY3QtaWQKLQkJCQkJcmVzdWx0ID0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoZDEpIC0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoZDIpOwotCQkJCQlpZiAocmVzdWx0ICE9IDApIHsKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCX0KLQkKLQkJCQkJLy8gSXQncyB1bmxpa2VseSB0aGF0IHdlIGdldCB0byB0aGlzIHBvaW50OyBidXQsIGp1c3QgaW4gY2FzZSwgd2Ugd2lsbCByZXR1cm4gLTEuCi0JCQkJCS8vIFVuZm9ydHVuYXRlbHksIHRoaXMgaW50cm9kdWNlcyBzb21lIG1pbGQgdW5wcmVkaWN0YWJpbGl0eSB0byB0aGUgc29ydCBvcmRlcgotCQkJCQkvLyAodW5sZXNzIHRoZSBvYmplY3RzIGFyZSBhbHdheXMgcGFzc2VkIGludG8gdGhpcyBtZXRob2QgaW4gdGhlIHNhbWUgb3JkZXIpLgotCQkJCQlyZXR1cm4gLTE7CQkvLyBpZiBhbGwgZWxzZSBmYWlscywgaW5kaWNhdGUgdGhhdCBvMSA8IG8yCi0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiAiRGlzcGxheWFibGUuREVGQVVMVF9DT01QQVJBVE9SIjsKLQkJCQl9Ci0JCQl9OwotCQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0xpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0xpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFlN2M3OS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIGxpc3QgYm94ZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIExpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JZmluYWwgVGFza0xpc3QgdGFza0xpc3Q7Ci0JcHJpdmF0ZSBmaW5hbCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRhc2tMaXN0PiB0YXNrTGlzdEhvbGRlcjsKLQlwcml2YXRlIFRleHQgdGFza1RleHRGaWVsZDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlXaW5kb3cgd2luZG93ID0gbmV3IExpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMudGFza0xpc3QgPSBuZXcgVGFza0xpc3QoKTsKLQkJdGhpcy50YXNrTGlzdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFza0xpc3Q+KHRoaXMudGFza0xpc3QpOwotCQl0aGlzLnRhc2tMaXN0LmFkZFRhc2soInN3aW0iKTsKLQkJdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJiaWtlIik7Ci0JCXRoaXMudGFza0xpc3QuYWRkVGFzaygicnVuIik7Ci0JCVRhc2sgcmVzdCA9IHRoaXMudGFza0xpc3QuYWRkVGFzaygicmVzdCIpOwotCQl0aGlzLnRhc2tMaXN0LmFkZFByaW9yaXR5VGFzayhyZXN0KTsKLQkJVGFzayByZXBlYXQgPSB0aGlzLnRhc2tMaXN0LmFkZFRhc2soInJlcGVhdCIpOwotCQl0aGlzLnRhc2tMaXN0LmFkZFByaW9yaXR5VGFzayhyZXBlYXQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlwYXJlbnQuc2V0U2l6ZSg4MDAsIDQwMCk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIHRhc2tMaXN0UGFuZWwgPSB0aGlzLmJ1aWxkVGFza0xpc3RQYW5lbChtYWluUGFuZWwpOwotCQl0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCwgdGFza0xpc3RQYW5lbCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkVGFza0xpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0zMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRPYmplY3RUYXNrTGlzdFBhbmVsKHBhbmVsKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUHJpbWl0aXZlVGFza0xpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRPYmplY3RUYXNrTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDUwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZFVuc29ydGVkT2JqZWN0TGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZEN1c3RvbVNvcnRlZE9iamVjdExpc3RQYW5lbChwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTGlzdFBhbmVsKHBhcmVudCwgInByaW1pdGl2ZSB1bnNvcnRlZCIsIHRoaXMuYnVpbGRVbnNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpLCBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRMaXN0UGFuZWwocGFyZW50LCAicHJpbWl0aXZlIHNvcnRlZCIsIHRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpLCBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTGlzdFBhbmVsKHBhcmVudCwgInByaW1pdGl2ZSByZXZlcnNlIHNvcnRlZCIsIHRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSwgbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVW5zb3J0ZWRPYmplY3RMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTGlzdFBhbmVsKHBhcmVudCwgIm9iamVjdCB1bnNvcnRlZCIsIHRoaXMuYnVpbGRVbnNvcnRlZE9iamVjdExpc3RNb2RlbCgpLCB0aGlzLmJ1aWxkUHJpb3JpdHlUYXNrTGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkU3RhbmRhcmRTb3J0ZWRPYmplY3RMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTGlzdFBhbmVsKHBhcmVudCwgIm9iamVjdCBzb3J0ZWQiLCB0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEN1c3RvbVNvcnRlZE9iamVjdExpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRMaXN0UGFuZWwocGFyZW50LCAib2JqZWN0IHJldmVyc2Ugc29ydGVkIiwgdGhpcy5idWlsZEN1c3RvbVNvcnRlZE9iamVjdExpc3RNb2RlbCgpLCB0aGlzLmJ1aWxkUHJpb3JpdHlUYXNrTGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4odGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4odGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpLCB0aGlzLmJ1aWxkQ3VzdG9tU3RyaW5nQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkVW5zb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUYXNrPiBidWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxUYXNrPih0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFRhc2s+KHRoaXMuYnVpbGRPYmplY3RUYXNrTGlzdEFkYXB0ZXIoKSwgdGhpcy5idWlsZEN1c3RvbVRhc2tDb21wYXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgPEU+IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QgYnVpbGRMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBMaXN0VmFsdWVNb2RlbDxFPiBtb2RlbCwgTW9kaWZpYWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbXNNb2RlbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0KLQkJTGFiZWwgbGlzdExhYmVsID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTEVGVCB8IFNXVC5WRVJUSUNBTCk7Ci0JCWxpc3RMYWJlbC5zZXRUZXh0KGxhYmVsKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAzKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAyMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUpOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJbGlzdExhYmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCW9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QgbGlzdEJveCA9IG5ldyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0KHBhbmVsLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQkJZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChsaXN0TGFiZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJbGlzdEJveC5zZXRMYXlvdXREYXRhKGZkKTsKLQkJU1dUVG9vbHMuYmluZChtb2RlbCwgc2VsZWN0ZWRJdGVtc01vZGVsLCBsaXN0Qm94KTsgIC8vIHVzZSAjdG9TdHJpbmcoKQotCQlyZXR1cm4gbGlzdEJveDsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiBidWlsZEN1c3RvbVN0cmluZ0NvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCQkJcmV0dXJuIHMyLmNvbXBhcmVUbyhzMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPFRhc2s+IGJ1aWxkQ3VzdG9tVGFza0NvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxUYXNrPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShUYXNrIHRvMSwgVGFzayB0bzIpIHsKLQkJCQlyZXR1cm4gdG8yLmNvbXBhcmVUbyh0bzEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUYXNrTGlzdCwgU3RyaW5nPih0aGlzLnRhc2tMaXN0SG9sZGVyLCBUYXNrTGlzdC5UQVNLX05BTUVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC50YXNrTmFtZXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFRhc2tMaXN0LCBUYXNrPih0aGlzLnRhc2tMaXN0SG9sZGVyLCBUYXNrTGlzdC5UQVNLU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8VGFzaz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnRhc2tzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw8VGFzaz4gYnVpbGRQcmlvcml0eVRhc2tMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcmlvcml0eVRhc2tMaXN0QWRhcHRlcih0aGlzLnRhc2tMaXN0SG9sZGVyKTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgUHJpb3JpdHlUYXNrTGlzdEFkYXB0ZXIKLQkJZXh0ZW5kcyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxUYXNrTGlzdCwgVGFzaz4KLQkJaW1wbGVtZW50cyBNb2RpZmlhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw8VGFzaz4KLQl7Ci0JCVByaW9yaXR5VGFza0xpc3RBZGFwdGVyKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFza0xpc3Q+IHRhc2tMaXN0SG9sZGVyKSB7Ci0JCQlzdXBlcih0YXNrTGlzdEhvbGRlciwgVGFza0xpc3QuUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJdGVyYXRvcjxUYXNrPiBpdGVyYXRvcl8oKSB7Ci0JCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnByaW9yaXR5VGFza3MoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoSXRlcmFibGU8VGFzaz4gdmFsdWVzKSB7Ci0JCQl0aGlzLnN1YmplY3Quc2V0UHJpb3JpdHlUYXNrcyh2YWx1ZXMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgdGFza0xpc3RQYW5lbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHRhc2tMaXN0UGFuZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIG1pc2MgPSB0aGlzLmJ1aWxkTWlzY1Rhc2tQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRBZGRSZW1vdmVUYXNrUGFuZWwocGFuZWwsIG1pc2MpOwotCX0KLQotCS8vIGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBhc3NvY2lhdGUgYW4gQUNJIHdpdGggZm9ybSBkYXRhPwotCXByaXZhdGUgQ29udHJvbCBidWlsZE1pc2NUYXNrUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTQwMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRDbGVhckxpc3RBQ0koKS5maWxsKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxBQ0koKS5maWxsKHBhbmVsKTsKLQkJdGhpcy5idWlsZFJlc3RvcmVNb2RlbEFDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQWRkUHJpb3JpdHlUYXNrQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRSZW1vdmVQcmlvcml0eVRhc2tBQ0koKS5maWxsKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyUHJpb3JpdHlUYXNrc0FDSSgpLmZpbGwocGFuZWwpOwotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJMaXN0QUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbGlzdCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5jbGVhclRhc2tzKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgYWxsIHRoZSB0YXNrcyIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhck1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNsZWFyIHRoZSB0YXNrIGxpc3QgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVzdG9yZSBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJyZXN0b3JlIHRoZSB0YXNrIGxpc3QgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQWRkUHJpb3JpdHlUYXNrQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiYWRkIHByaW9yaXR5IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmFkZFByaW9yaXR5VGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImFkZCBhIHRhc2sgdG8gdGhlIHByaW9yaXR5IHRhc2tzIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlbW92ZVByaW9yaXR5VGFza0FDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInJlbW92ZSBwcmlvcml0eSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5yZW1vdmVQcmlvcml0eVRhc2soKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJyZW1vdmUgYSB0YXNrIGZyb20gdGhlIHByaW9yaXR5IHRhc2tzIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyUHJpb3JpdHlUYXNrc0FDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIHByaW9yaXR5IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmNsZWFyUHJpb3JpdHlUYXNrcygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNsZWFyIHRoZSBwcmlvcml0eSB0YXNrcyIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRBZGRSZW1vdmVUYXNrUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCBjbGVhckJ1dHRvbikgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY2xlYXJCdXR0b24pOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgYWRkQnV0dG9uID0gdGhpcy5idWlsZEFkZEJ1dHRvbihwYW5lbCk7Ci0JCUNvbnRyb2wgcmVtb3ZlQnV0dG9uID0gdGhpcy5idWlsZFJlbW92ZUJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRUYXNrVGV4dEZpZWxkKHBhbmVsLCBhZGRCdXR0b24sIHJlbW92ZUJ1dHRvbik7Ci0JfQotCi0JLy8gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGFzc29jaWF0ZSBhbiBBQ0kgd2l0aCBmb3JtIGRhdGE/Ci0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkQWRkQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkQWRkQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRBZGRBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJhZGQiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuYWRkVGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImFkZCBhIHRhc2sgd2l0aCB0aGUgbmFtZSBpbiB0aGUgZW50cnkgZmllbGQiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JLy8gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGFzc29jaWF0ZSBhbiBBQ0kgd2l0aCBmb3JtIGRhdGE/Ci0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkUmVtb3ZlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01MCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRSZW1vdmVBQ0koKS5maWxsKHBhbmVsKTsKLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlbW92ZUFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInJlbW92ZSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5yZW1vdmVUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVtb3ZlIHRoZSB0YXNrIHdpdGggdGhlIG5hbWUgaW4gdGhlIGVudHJ5IGZpZWxkIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFRhc2tUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCBhZGRCdXR0b24sIENvbnRyb2wgcmVtb3ZlQnV0dG9uKSB7Ci0JCXRoaXMudGFza1RleHRGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGFkZEJ1dHRvbik7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChyZW1vdmVCdXR0b24pOwotCQl0aGlzLnRhc2tUZXh0RmllbGQuc2V0TGF5b3V0RGF0YShmZCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgdGFza1RleHRGaWVsZFRleHQoKSB7Ci0JCXJldHVybiB0aGlzLnRhc2tUZXh0RmllbGQuZ2V0VGV4dCgpOwotCX0KLQotCXZvaWQgYWRkVGFzaygpIHsKLQkJU3RyaW5nIHRhc2tUZXh0ID0gdGhpcy50YXNrVGV4dEZpZWxkVGV4dCgpOwotCQlpZiAodGFza1RleHQubGVuZ3RoKCkgIT0gMCkgewotCQkJdGhpcy50YXNrTGlzdC5hZGRUYXNrKHRhc2tUZXh0KTsKLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlVGFzaygpIHsKLQkJU3RyaW5nIHRhc2sgPSB0aGlzLnRhc2tUZXh0RmllbGRUZXh0KCk7Ci0JCWlmICh0YXNrLmxlbmd0aCgpICE9IDApIHsKLQkJCXRoaXMudGFza0xpc3QucmVtb3ZlVGFzayh0YXNrKTsKLQkJfQotCX0KLQotCXZvaWQgY2xlYXJUYXNrcygpIHsKLQkJdGhpcy50YXNrTGlzdC5jbGVhclRhc2tzKCk7Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRhc2tMaXN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRhc2tMaXN0SG9sZGVyLnNldFZhbHVlKHRoaXMudGFza0xpc3QpOwotCX0KLQotCXZvaWQgYWRkUHJpb3JpdHlUYXNrKCkgewotCQlJdGVyYXRvcjxUYXNrPiB0YXNrcyA9IHRoaXMudGFza0xpc3QudGFza3MoKTsKLQkJd2hpbGUgKHRhc2tzLmhhc05leHQoKSkgewotCQkJaWYgKHRoaXMudGFza0xpc3QuYWRkUHJpb3JpdHlUYXNrKHRhc2tzLm5leHQoKSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZVByaW9yaXR5VGFzaygpIHsKLQkJSXRlcmF0b3I8VGFzaz4gcFRhc2tzID0gdGhpcy50YXNrTGlzdC5wcmlvcml0eVRhc2tzKCk7Ci0JCWlmIChwVGFza3MuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLnRhc2tMaXN0LnJlbW92ZVByaW9yaXR5VGFzayhwVGFza3MubmV4dCgpKTsKLQkJfQotCX0KLQotCXZvaWQgY2xlYXJQcmlvcml0eVRhc2tzKCkgewotCQl0aGlzLnRhc2tMaXN0LmNsZWFyUHJpb3JpdHlUYXNrcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUYXNrTGlzdCAqKioqKioqKioqCi0KLQkvLyBub3RlIGFic2VuY2Ugb2YgdmFsaWRhdGlvbi4uLgotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVGFza0xpc3QgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gdGFza05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX05BTUVTX0xJU1QgPSAidGFza05hbWVzIjsKLQkJcHJpdmF0ZSBmaW5hbCBMaXN0PFRhc2s+IHRhc2tzID0gbmV3IEFycmF5TGlzdDxUYXNrPigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS1NfTElTVCA9ICJ0YXNrcyI7Ci0JCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxUYXNrPiBwcmlvcml0eVRhc2tzID0gbmV3IEhhc2hTZXQ8VGFzaz4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU9SSVRZX1RBU0tTX0NPTExFQ1RJT04gPSAicHJpb3JpdHlUYXNrcyI7Ci0JCXB1YmxpYyBUYXNrTGlzdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHRhc2tOYW1lcygpIHsKLQkJCXJldHVybiB0aGlzLnRhc2tOYW1lcy5saXN0SXRlcmF0b3IoKTsKLQkJfQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFRhc2s+IHRhc2tzKCkgewotCQkJcmV0dXJuIHRoaXMudGFza3MubGlzdEl0ZXJhdG9yKCk7Ci0JCX0KLQkJcHVibGljIEl0ZXJhdG9yPFRhc2s+IHByaW9yaXR5VGFza3MoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wcmlvcml0eVRhc2tzLml0ZXJhdG9yKCk7Ci0JCX0KLQkJcHVibGljIFRhc2sgYWRkVGFzayhTdHJpbmcgdGFza05hbWUpIHsKLQkJCXRoaXMuYWRkSXRlbVRvTGlzdCh0YXNrTmFtZSwgdGhpcy50YXNrTmFtZXMsIFRBU0tfTkFNRVNfTElTVCk7Ci0JCQlUYXNrIHRhc2sgPSBuZXcgVGFzayh0YXNrTmFtZSk7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0xpc3QodGFzaywgdGhpcy50YXNrcywgVEFTS1NfTElTVCk7Ci0JCQlyZXR1cm4gdGFzazsKLQkJfQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVRhc2soU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCQlpbnQgaW5kZXggPSB0aGlzLnRhc2tOYW1lcy5pbmRleE9mKHRhc2tOYW1lKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCXRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLnRhc2tOYW1lcywgVEFTS19OQU1FU19MSVNUKTsKLQkJCQkvLyBhc3N1bWUgdGhlIGluZGV4ZXMgbWF0Y2guLi4KLQkJCQlUYXNrIHJlbW92ZWRUYXNrID0gdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMudGFza3MsIFRBU0tTX0xJU1QpOwotCQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKHJlbW92ZWRUYXNrLCB0aGlzLnByaW9yaXR5VGFza3MsIFBSSU9SSVRZX1RBU0tTX0NPTExFQ1RJT04pOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGNsZWFyVGFza3MoKSB7Ci0JCQl0aGlzLmNsZWFyQ29sbGVjdGlvbih0aGlzLnByaW9yaXR5VGFza3MsIFBSSU9SSVRZX1RBU0tTX0NPTExFQ1RJT04pOwotCQkJdGhpcy5jbGVhckxpc3QodGhpcy50YXNrTmFtZXMsIFRBU0tfTkFNRVNfTElTVCk7Ci0JCQl0aGlzLmNsZWFyTGlzdCh0aGlzLnRhc2tzLCBUQVNLU19MSVNUKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBhZGRQcmlvcml0eVRhc2soVGFzayB0YXNrKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKHRhc2ssIHRoaXMucHJpb3JpdHlUYXNrcywgUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTik7Ci0JCX0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVQcmlvcml0eVRhc2soVGFzayB0YXNrKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbih0YXNrLCB0aGlzLnByaW9yaXR5VGFza3MsIFBSSU9SSVRZX1RBU0tTX0NPTExFQ1RJT04pOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNsZWFyUHJpb3JpdHlUYXNrcygpIHsKLQkJCXRoaXMuY2xlYXJDb2xsZWN0aW9uKHRoaXMucHJpb3JpdHlUYXNrcywgUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTik7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0UHJpb3JpdHlUYXNrcyhJdGVyYWJsZTxUYXNrPiB0YXNrcykgewotCQkJdGhpcy5wcmlvcml0eVRhc2tzLmNsZWFyKCk7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMucHJpb3JpdHlUYXNrcywgdGFza3MpOwotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTiwgdGhpcy5wcmlvcml0eVRhc2tzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBUYXNrICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVGFzayBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBEaXNwbGF5YWJsZSB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgaW50IGluc3RhbmNlQ291bnQ7Ci0JCXByaXZhdGUgc3RhdGljIGludCBJTlNUQU5DRV9DT1VOVCA9IDE7Ci0JCXB1YmxpYyBUYXNrKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5pbnN0YW5jZUNvdW50ID0gSU5TVEFOQ0VfQ09VTlQrKzsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lICsgIjogIiArIHRoaXMuaW5zdGFuY2VDb3VudDsKLQkJfQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhEaXNwbGF5YWJsZSBvKSB7Ci0JCQlyZXR1cm4gREVGQVVMVF9DT01QQVJBVE9SLmNvbXBhcmUodGhpcywgbyk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLmRpc3BsYXlTdHJpbmcoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnRlcmZhY2UgRGlzcGxheWFibGUgZXh0ZW5kcyBNb2RlbCwgQ29tcGFyYWJsZTxEaXNwbGF5YWJsZT4gewotCQotCQlTdHJpbmcgZGlzcGxheVN0cmluZygpOwotCQkJU3RyaW5nIERJU1BMQVlfU1RSSU5HX1BST1BFUlRZID0gImRpc3BsYXlTdHJpbmciOwotCQotCQotCQkvLyAqKioqKioqKioqIGhlbHBlciBpbXBsZW1lbnRhdGlvbnMgKioqKioqKioqKgotCQotCQlDb2xsYXRvciBERUZBVUxUX0NPTExBVE9SID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkKLQkJQ29tcGFyYXRvcjxEaXNwbGF5YWJsZT4gREVGQVVMVF9DT01QQVJBVE9SID0KLQkJCW5ldyBDb21wYXJhdG9yPERpc3BsYXlhYmxlPigpIHsKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoRGlzcGxheWFibGUgZDEsIERpc3BsYXlhYmxlIGQyKSB7Ci0JCQkJCS8vIGRpc2FsbG93IGR1cGxpY2F0ZXMgYmFzZWQgb24gb2JqZWN0IGlkZW50aXR5Ci0JCQkJCWlmIChkMSA9PSBkMikgewotCQkJCQkJcmV0dXJuIDA7Ci0JCQkJCX0KLQkKLQkJCQkJLy8gZmlyc3QgY29tcGFyZSBkaXNwbGF5IHN0cmluZ3MgdXNpbmcgdGhlIGRlZmF1bHQgY29sbGF0b3IKLQkJCQkJaW50IHJlc3VsdCA9IERFRkFVTFRfQ09MTEFUT1IuY29tcGFyZShkMS5kaXNwbGF5U3RyaW5nKCksIGQyLmRpc3BsYXlTdHJpbmcoKSk7Ci0JCQkJCWlmIChyZXN1bHQgIT0gMCkgewotCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJfQotCQotCQkJCQkvLyB0aGVuIGNvbXBhcmUgdXNpbmcgb2JqZWN0LWlkCi0JCQkJCXJlc3VsdCA9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKGQxKSAtIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKGQyKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQl9Ci0JCi0JCQkJCS8vIEl0J3MgdW5saWtlbHkgdGhhdCB3ZSBnZXQgdG8gdGhpcyBwb2ludDsgYnV0LCBqdXN0IGluIGNhc2UsIHdlIHdpbGwgcmV0dXJuIC0xLgotCQkJCQkvLyBVbmZvcnR1bmF0ZWx5LCB0aGlzIGludHJvZHVjZXMgc29tZSBtaWxkIHVucHJlZGljdGFiaWxpdHkgdG8gdGhlIHNvcnQgb3JkZXIKLQkJCQkJLy8gKHVubGVzcyB0aGUgb2JqZWN0cyBhcmUgYWx3YXlzIHBhc3NlZCBpbnRvIHRoaXMgbWV0aG9kIGluIHRoZSBzYW1lIG9yZGVyKS4KLQkJCQkJcmV0dXJuIC0xOwkJLy8gaWYgYWxsIGVsc2UgZmFpbHMsIGluZGljYXRlIHRoYXQgbzEgPCBvMgotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCQlyZXR1cm4gIkRpc3BsYXlhYmxlLkRFRkFVTFRfQ09NUEFSQVRPUiI7Ci0JCQkJfQotCQkJfTsKLQkKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9UZXh0RmllbGRNb2RlbEJpbmRpbmdVSVRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L1RleHRGaWVsZE1vZGVsQmluZGluZ1VJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmM0NzZhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L1RleHRGaWVsZE1vZGVsQmluZGluZ1VJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIGVudHJ5IGZpZWxkcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGV4dEZpZWxkTW9kZWxCaW5kaW5nVUlUZXN0Ci0JZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdwotewotCXByaXZhdGUgZmluYWwgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTkFNRSA9ICJTY29vYnkgRG9vIjsKLQlwcml2YXRlIGZpbmFsIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbmFtZUhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBhbGxDYXBzTmFtZUhvbGRlcjsKLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVdpbmRvdyB3aW5kb3cgPSBuZXcgVGV4dEZpZWxkTW9kZWxCaW5kaW5nVUlUZXN0KCk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIFRleHRGaWVsZE1vZGVsQmluZGluZ1VJVGVzdCgpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMudGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbChERUZBVUxUX05BTUUpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMubmFtZUhvbGRlciA9IHRoaXMuYnVpbGROYW1lSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5hbGxDYXBzTmFtZUhvbGRlciA9IHRoaXMuYnVpbGRBbGxDYXBzTmFtZUhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHZtKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgU3RyaW5nPih2bSwgVGVzdE1vZGVsLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEFsbENhcHNOYW1lSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHZtKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgU3RyaW5nPih2bSwgVGVzdE1vZGVsLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWUoKS50b1VwcGVyQ2FzZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlwYXJlbnQuc2V0U2l6ZSg0MDAsIDEwMCk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIHRleHRGaWVsZFBhbmVsID0gdGhpcy5idWlsZFRleHRGaWVsZFBhbmVsKG1haW5QYW5lbCk7Ci0JCXRoaXMuYnVpbGRDb250cm9sUGFuZWwobWFpblBhbmVsLCB0ZXh0RmllbGRQYW5lbCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkVGV4dEZpZWxkUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMzUpOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZE5hbWVUZXh0RmllbGQocGFuZWwpOwotCQl0aGlzLmJ1aWxkUmVhZE9ubHlOYW1lVGV4dEZpZWxkKHBhbmVsKTsKLQkJdGhpcy5idWlsZEFsbENhcHNOYW1lVGV4dEZpZWxkKHBhbmVsKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTmFtZVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRleHQgdGV4dEZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFKTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLm5hbWVIb2xkZXIsIHRleHRGaWVsZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUmVhZE9ubHlOYW1lVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVGV4dCB0ZXh0RmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUpOwotCQl0ZXh0RmllbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5uYW1lSG9sZGVyLCB0ZXh0RmllbGQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEFsbENhcHNOYW1lVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVGV4dCB0ZXh0RmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUpOwotCQl0ZXh0RmllbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5hbGxDYXBzTmFtZUhvbGRlciwgdGV4dEZpZWxkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCBjaGVja0JveFBhbmVsKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY2hlY2tCb3hQYW5lbCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRSZXNldE5hbWVCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkUHJpbnRNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUmVzZXROYW1lQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFJlc2V0TmFtZUFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXNldE5hbWVBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXNldCBuYW1lIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGV4dEZpZWxkTW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMucmVzZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVzZXQgbmFtZSIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHJlc2V0TmFtZSgpIHsKLQkJdGhpcy50ZXN0TW9kZWwuc2V0TmFtZShERUZBVUxUX05BTUUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENsZWFyTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhck1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUZXh0RmllbGRNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlc3RvcmVNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInJlc3RvcmUgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUZXh0RmllbGRNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJyZXN0b3JlIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUHJpbnRNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRQcmludE1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFByaW50TW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJwcmludCBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRleHRGaWVsZE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJwcmludCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHByaW50TW9kZWwoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigibmFtZTogIiArIHRoaXMudGVzdE1vZGVsLm5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1vZGVsIGNsYXNzICoqKioqKioqKioKLQotCWNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQotCQlwdWJsaWMgVGVzdE1vZGVsKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE1vZGVsKCIgKyB0aGlzLm5hbWUgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvLmNsYXNzcGF0aCBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxMjhmMy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy8uY3ZzaWdub3JlIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy8ucHJvamVjdCBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OGUyMzAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzIxNTg2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDY6NTcgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y5Mzk4Yi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cwotQnVuZGxlLVZlcnNpb246IDIuMS4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iWzQuMC4wLDUuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuY29tbWFuZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5lbnVtZXJhdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5ub2RlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLnN5bmNocm9uaXplcnM7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9hYm91dC5odG1sIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZTljMDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYTQ0N2IuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gQ29tbW9uIFV0aWxpdHkgVGVzdHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvcmVzb3VyY2UvQ2xhc3NUb29scy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9yZXNvdXJjZS9DbGFzc1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYzE3YjYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9yZXNvdXJjZS9DbGFzc1Rvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgdGVzdDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgbWV0aG9kcyByZWxhdGVkIHRvIHRoZSBqYXZhLmxhbmcucmVmbGVjdCBwYWNrYWdlLgotICogVGhlc2UgbWV0aG9kcyBwcm92aWRlIHNob3J0Y3V0cyBmb3IgbWFuaXB1bGF0aW5nIG9iamVjdHMgdmlhCi0gKiByZWZsZWN0aW9uOyBwYXJ0aWN1bGFybHkgd2hlbiBkZWFsaW5nIHdpdGggZmllbGRzIGFuZC9vciBtZXRob2RzIHRoYXQKLSAqIGFyZSBub3QgcHVibGljbHkgYWNjZXNzaWJsZSBvciBhcmUgaW5oZXJpdGVkLgotICogCi0gKiBJbiBtb3N0IGNhc2VzLCBhbGwgdGhlIGV4Y2VwdGlvbnMgYXJlIGhhbmRsZWQgYW5kCi0gKiB3cmFwcGVkIGluIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uczsgc28gdGhlc2UgbWV0aG9kcyBzaG91bGQKLSAqIGJlIHVzZWQgd2hlbiB5b3UgYXJlIGNvbmZpZGVudCB0aGF0IHlvdSB3aWxsIG5vdCBoYXZpbmcgYW55IHByb2JsZW1zCi0gKiB1c2luZyByZWZsZWN0aW9uLgotICogCi0gKiBUaGVyZSBhcmUgYWxzbyBhIG51bWJlciBvZiBtZXRob2RzIHdob3NlIG5hbWVzCi0gKiBiZWdpbiB3aXRoICJhdHRlbXB0Ii4gVGhlc2UgbWV0aG9kcyB3aWxsIHRocm93IGEgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gKiBvciBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB3aGVuIGFwcHJvcHJpYXRlLCBhbGxvd2luZyB5b3UgdG8gcHJvYmUKLSAqIGZvciBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIHByZXNlbnQgYnV0IG1pZ2h0IG5vdC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENsYXNzVG9vbHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIFpFUk9fUEFSQU1FVEVSX1RZUEVTID0gbmV3IENsYXNzWzBdOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0W10gWkVST19QQVJBTUVURVJTID0gbmV3IE9iamVjdFswXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTdHJpbmdUb29scy5DUjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IgPSAnJCc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQVJSQVlfSU5ESUNBVE9SID0gJ1snOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBUWVBFX0RFQ0xBUkFUSU9OX0FSUkFZX09QRU4gPSAnWyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFRZUEVfREVDTEFSQVRJT05fQVJSQVlfQ0xPU0UgPSAnXSc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUkVGRVJFTkNFX0NMQVNTX0NPREUgPSAnTCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFJFRkVSRU5DRV9DTEFTU19OQU1FX0RFTElNSVRFUiA9ICc7JzsKLQkKLQlwcml2YXRlIHN0YXRpYyBQcmltaXRpdmVbXSBQUklNSVRJVkVTOyAgLy8gcHNldWRvLSdmaW5hbCcgLSBsYXp5LWluaXRpYWxpemVkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEJZVEVfQ09ERSA9ICdCJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0hBUl9DT0RFID0gJ0MnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBET1VCTEVfQ09ERSA9ICdEJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRkxPQVRfQ09ERSA9ICdGJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgSU5UX0NPREUgPSAnSSc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIExPTkdfQ09ERSA9ICdKJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgU0hPUlRfQ09ERSA9ICdTJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQk9PTEVBTl9DT0RFID0gJ1onOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBWT0lEX0NPREUgPSAnVic7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEggPSAtMTsgIC8vIHBzZXVkby0nZmluYWwnIC0gbGF6eS1pbml0aWFsaXplZAotCXByaXZhdGUgc3RhdGljIGludCBNQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEggPSAtMTsgIC8vIHBzZXVkby0nZmluYWwnIC0gbGF6eS1pbml0aWFsaXplZAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRF9DTEFTU19OQU1FID0gdm9pZC5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRF9XUkFQUEVSX0NMQVNTX05BTUUgPSBqYXZhLmxhbmcuVm9pZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIGZpZWxkcyBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGNsYXNzLCBpbmNsdWRpbmcgaW5oZXJpdGVkIGZpZWxkcy4KLQkgKiBDbGFzcyNhbGxGaWVsZHMoKQotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBGaWVsZFtdIGFsbEZpZWxkcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJU3RhY2s8RmllbGQ+IHN0YWNrID0gbmV3IFN0YWNrPEZpZWxkPigpOwotCQlmb3IgKENsYXNzPD8+IHRlbXBDbGFzcyA9IGphdmFDbGFzczsgdGVtcENsYXNzICE9IG51bGw7IHRlbXBDbGFzcyA9IHRlbXBDbGFzcy5nZXRTdXBlcmNsYXNzKCkpIHsKLQkJCXB1c2hEZWNsYXJlZEZpZWxkcyh0ZW1wQ2xhc3MsIHN0YWNrKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKHN0YWNrKTsKLQkJcmV0dXJuIHN0YWNrLnRvQXJyYXkobmV3IEZpZWxkW3N0YWNrLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBtZXRob2RzIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgY2xhc3MsIGluY2x1ZGluZyBpbmhlcml0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNhbGxNZXRob2RzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFtdIGFsbE1ldGhvZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCVN0YWNrPE1ldGhvZD4gc3RhY2sgPSBuZXcgU3RhY2s8TWV0aG9kPigpOwotCQlmb3IgKENsYXNzPD8+IHRlbXBDbGFzcyA9IGphdmFDbGFzczsgdGVtcENsYXNzICE9IG51bGw7IHRlbXBDbGFzcyA9IHRlbXBDbGFzcy5nZXRTdXBlcmNsYXNzKCkpIHsKLQkJCXB1c2hEZWNsYXJlZE1ldGhvZHModGVtcENsYXNzLCBzdGFjayk7Ci0JCX0KLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShzdGFjayk7Ci0JCXJldHVybiBzdGFjay50b0FycmF5KG5ldyBNZXRob2Rbc3RhY2suc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiB1c2luZyB0aGUgY2xhc3MncyBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgbm90IGRlZmluZWQuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIDxUPiBUIGF0dGVtcHROZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdE5ld0luc3RhbmNlKGphdmFDbGFzcywgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIHBhcmFtZXRlcnMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBhdHRlbXB0TmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBjb25zdHJ1Y3RvcihqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKS5uZXdJbnN0YW5jZShwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcyksIGllKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgZnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSwgaWFlKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcykgKyBDUiArIGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKSwgaXRlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlIGFuZCBwYXJhbWV0ZXIuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBhdHRlbXB0TmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGF0dGVtcHROZXdJbnN0YW5jZShqYXZhQ2xhc3MsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBnZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgb2JqZWN0IGFuZCBmaWVsZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQkgKiBPYmplY3QjZ2V0RmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9HZXRGaWVsZFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmllbGQob2JqZWN0LCBmaWVsZE5hbWUpLmdldChvYmplY3QpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIGlhZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBnZXQgYSBzdGF0aWMgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIG9iamVjdCBhbmQgZmllbGQgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgaXMgbm90IGRlZmluZWQuCi0JICogQ2xhc3MjZ2V0U3RhdGljRmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9HZXRTdGF0aWNGaWVsZFZhbHVlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmaWVsZChqYXZhQ2xhc3MsIGZpZWxkTmFtZSkuZ2V0KG51bGwpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIGlhZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgbWV0aG9kLAotCSAqIGdpdmVuIHRoZSByZWNlaXZlciBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBwYXJhbWV0ZXIuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kKG1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCByZWNlaXZlciwgcGFyYW1ldGVycyk7Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBJZiB0aGUgZXhlY3V0ZWQgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHJldGhyb3cgdGhhdCBleGNlcHRpb24uCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIAotCQl0aHJvd3MgVGhyb3dhYmxlLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gCi0JewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24obWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIHJlY2VpdmVyLCBwYXJhbWV0ZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgc3RhdGljIG1ldGhvZCwKLQkgKiBnaXZlbiB0aGUgY2xhc3MgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBleGVjdXRlU3RhdGljTWV0aG9kKHN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgcGFyYW1ldGVycyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgcGFyYW1ldGVyLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBzZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlCi0JICogY29udGFpbmluZyBvYmplY3QsIGZpZWxkIG5hbWUsIGFuZCBuZXcgZmllbGQgdmFsdWUuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGlzIG5vdCBkZWZpbmVkLgotCSAqIE9iamVjdCNzZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXR0ZW1wdFRvU2V0RmllbGRWYWx1ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWZpZWxkKG9iamVjdCwgZmllbGROYW1lKS5zZXQob2JqZWN0LCBmaWVsZFZhbHVlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LCBmaWVsZE5hbWUpLCBpYWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gc2V0IGEgc3RhdGljIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUKLQkgKiBjb250YWluaW5nIGNsYXNzLCBmaWVsZCBuYW1lLCBhbmQgbmV3IGZpZWxkIHZhbHVlLgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNzZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXR0ZW1wdFRvU2V0U3RhdGljRmllbGRWYWx1ZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0cnkgewotCQkJZmllbGQoamF2YUNsYXNzLCBmaWVsZE5hbWUpLnNldChudWxsLCBmaWVsZFZhbHVlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpLCBpYWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yCi0JICogZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3JzLgotCSAqIENsYXNzI2NvbnN0cnVjdG9yKCkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGNvbnN0cnVjdG9yKENsYXNzPFQ+IGphdmFDbGFzcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb25zdHJ1Y3RvcihqYXZhQ2xhc3MsIFpFUk9fUEFSQU1FVEVSX1RZUEVTKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9ycy4KLQkgKiBDbGFzcyNjb25zdHJ1Y3RvcihDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihwYXJhbWV0ZXJUeXBlcyk7Ci0JCWNvbnN0cnVjdG9yLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCXJldHVybiBjb25zdHJ1Y3RvcjsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9ycy4KLQkgKiBDbGFzcyNjb25zdHJ1Y3RvcihDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yKGphdmFDbGFzcywgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWNsYXJlZCBmaWVsZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGRzLgotCSAqIENsYXNzI2FjY2Vzc2libGVEZWNsYXJlZEZpZWxkcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZFtdIGRlY2xhcmVkRmllbGRzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlGaWVsZFtdIGZpZWxkcyA9IGphdmFDbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpOwotCQlmb3IgKEZpZWxkIGZpZWxkIDogZmllbGRzKSB7Ci0JCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQl9Ci0JCXJldHVybiBmaWVsZHM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVjbGFyZWQgbWV0aG9kcyBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGNsYXNzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjYWNjZXNzaWJsZURlY2xhcmVkTWV0aG9kcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RbXSBkZWNsYXJlZE1ldGhvZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JCWZvciAoTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKLQkJCW1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQl9Ci0JCXJldHVybiBtZXRob2RzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yCi0JICogZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3JzLgotCSAqIENsYXNzI2RlZmF1bHRDb25zdHJ1Y3RvcigpCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gZGVmYXVsdENvbnN0cnVjdG9yKENsYXNzPFQ+IGphdmFDbGFzcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb25zdHJ1Y3RvcihqYXZhQ2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBmaWVsZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBhbmQgZmllbGQgbmFtZS4KLQkgKiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBkZWZpbmUgdGhlIGZpZWxkLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmllbGQgZmllbGQoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlGaWVsZCBmaWVsZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmaWVsZCA9IGphdmFDbGFzcy5nZXREZWNsYXJlZEZpZWxkKGZpZWxkTmFtZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7Ci0JCQlDbGFzczw/PiBzdXBlcmNsYXNzID0gamF2YUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQkJCWlmIChzdXBlcmNsYXNzID09IG51bGwpIHsKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJCS8vIHJlY3Vyc2UKLQkJCXJldHVybiBmaWVsZChzdXBlcmNsYXNzLCBmaWVsZE5hbWUpOwotCQl9Ci0JCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCXJldHVybiBmaWVsZDsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgZmllbGQgbmFtZS4KLQkgKiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBkZWZpbmUgdGhlIGZpZWxkLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmllbGQgZmllbGQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZpZWxkKG9iamVjdC5nZXRDbGFzcygpLCBmaWVsZE5hbWUpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKENsYXNzPD8+IGphdmFDbGFzcywgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoamF2YUNsYXNzLCBudWxsLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCQlzYi5hcHBlbmQoJy4nKTsKLQkJc2IuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXJldHVybiBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QuZ2V0Q2xhc3MoKSwgZmllbGROYW1lKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBtZXRob2QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJLy8gdGhpcyBjaGVjayBhbGxvd3MgdXMgdG8gdXNlIHRoaXMgY29kZSBmb3IgY29uc3RydWN0b3JzLCB3aGVyZSB0aGUgbWV0aG9kTmFtZSBpcyBudWxsCi0JCWlmIChtZXRob2ROYW1lICE9IG51bGwpIHsKLQkJCXNiLmFwcGVuZCgnLicpOwotCQkJc2IuYXBwZW5kKG1ldGhvZE5hbWUpOwotCQl9Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlpbnQgbWF4ID0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoIC0gMTsKLQkJaWYgKG1heCAhPSAtMSkgewotCQkJLy8gc3RvcCBvbmUgc2hvcnQgb2YgdGhlIGVuZCBvZiB0aGUgYXJyYXkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlzYi5hcHBlbmQocGFyYW1ldGVyVHlwZXNbaV0uZ2V0TmFtZSgpKTsKLQkJCQlzYi5hcHBlbmQoIiwgIik7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQocGFyYW1ldGVyVHlwZXNbbWF4XS5nZXROYW1lKCkpOwotCQl9Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBtZXRob2QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJcmV0dXJuIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKHJlY2VpdmVyLmdldENsYXNzKCksIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGEgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIG9iamVjdCBhbmQgZmllbGQgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIE9iamVjdCNnZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZmllbGRWYWx1ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYXR0ZW1wdFRvR2V0RmllbGRWYWx1ZShvYmplY3QsIGZpZWxkTmFtZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIG5zZmUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zZmUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdCwgZmllbGROYW1lKSwgbnNmZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0IGEgc3RhdGljIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBjbGFzcyBhbmQgZmllbGQgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIENsYXNzI2dldFN0YXRpY0ZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBzdGF0aWNGaWVsZFZhbHVlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHRUb0dldFN0YXRpY0ZpZWxkVmFsdWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBuc2ZlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc2ZlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIG5zZmUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgemVyby1hcmd1bWVudCBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIGEgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc21lICsgQ1IgKyBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBuc21lKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIG9uZS1hcmd1bWVudCBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBwYXJhbWV0ZXIuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBJZiB0aGUgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHJldGhyb3cgdGhhdCBleGNlcHRpb24uCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lKSAKLQkJdGhyb3dzIFRocm93YWJsZQotCXsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSBvbmUtYXJndW1lbnQgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgcGFyYW1ldGVyLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIElmIHRoZSBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmV0aHJvdyB0aGF0IGV4Y2VwdGlvbi4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIAotCQl0aHJvd3MgVGhyb3dhYmxlCi0JewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24ocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIElmIHRoZSBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmV0aHJvdyB0aGF0IGV4Y2VwdGlvbi4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIAotCQl0aHJvd3MgVGhyb3dhYmxlCi0JewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHRUb0V4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc21lICsgQ1IgKyBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBuc21lKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIENvbnZlcnQgZXhjZXB0aW9ucyB0byBSdW50aW1lRXhjZXB0aW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE1ldGhvZCBtZXRob2QsIE9iamVjdCByZWNlaXZlciwgT2JqZWN0W10gcGFyYW1ldGVycykgewotCQl0cnkgewotCQkJcmV0dXJuIG1ldGhvZC5pbnZva2UocmVjZWl2ZXIsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBtZXRob2QsIGlhZSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXRob2QgKyBDUiArIGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKSwgaXRlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIElmIHRoZSBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmV0aHJvdyB0aGF0IGV4Y2VwdGlvbi4KLQkgKiBDb252ZXJ0IGFsbCBvdGhlciBleGNlcHRpb25zIHRvIFJ1bnRpbWVFeGNlcHRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKE1ldGhvZCBtZXRob2QsIE9iamVjdCByZWNlaXZlciwgT2JqZWN0W10gcGFyYW1ldGVycykKLQkJdGhyb3dzIFRocm93YWJsZQotCXsKLQkJdHJ5IHsKLQkJCXJldHVybiBtZXRob2QuaW52b2tlKHJlY2VpdmVyLCBwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgbWV0aG9kLCBpYWUpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotCQkJVGhyb3dhYmxlIGNhdXNlID0gaXRlLmdldENhdXNlKCk7Ci0JCQlpZiAoY2F1c2UgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1ldGhvZC50b1N0cmluZygpLCBpdGUpOwotCQkJfQotCQkJdGhyb3cgY2F1c2U7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSB6ZXJvLWFyZ3VtZW50IHN0YXRpYyBtZXRob2QsCi0JICogZ2l2ZW4gdGhlIGNsYXNzIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBleGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNleGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc21lICsgQ1IgKyBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgbnNtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgcGFyYW1ldGVyLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHsKLQkJcmV0dXJuIGV4ZWN1dGVTdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBzdGF0aWMgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIENvbnZlcnQgZXhjZXB0aW9ucyB0byBSdW50aW1lRXhjZXB0aW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kKE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2QobWV0aG9kLCBudWxsLCBwYXJhbWV0ZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHplcm8tYXJndW1lbnQgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIG1ldGhvZCBuYW1lLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gbWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1ldGhvZCA9IGphdmFDbGFzcy5nZXREZWNsYXJlZE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotCQkJQ2xhc3M8Pz4gc3VwZXJjbGFzcyA9IGphdmFDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0JCQlpZiAoc3VwZXJjbGFzcyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgZXg7Ci0JCQl9Ci0JCQkvLyByZWN1cnNlCi0JCQlyZXR1cm4gbWV0aG9kKHN1cGVyY2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfQotCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJcmV0dXJuIG1ldGhvZDsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcywgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QKLQkgKiBhbmQgbWV0aG9kIG5hbWUuIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBtZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gbWV0aG9kKG9iamVjdC5nZXRDbGFzcygpLCBtZXRob2ROYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1ldGhvZChvYmplY3QuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCwgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZS4gSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtZXRob2Qob2JqZWN0LmdldENsYXNzKCksIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGUpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgY2xhc3MgKHdpdGhvdXQgdGhlIGNoZWNrZWQgZXhjZXB0aW9uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihjbGFzc05hbWUsIGV4KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShqYXZhQ2xhc3MsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGNsYXNzTmFtZSwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiB1c2luZyB0aGUgY2xhc3MncyBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLCBjbGFzc0xvYWRlcikpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzIGFuZCBwYXJhbWV0ZXJzLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBuZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0TmV3SW5zdGFuY2UoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc21lICsgQ1IgKyBmdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLCBuc21lKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzIGFuZCBwYXJhbWV0ZXJzLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NOYW1lLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycywgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIHBhcmFtZXRlcnMuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIHRydWUsIGNsYXNzTG9hZGVyKSwgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlIGFuZCBwYXJhbWV0ZXIuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoamF2YUNsYXNzLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZSBhbmQgcGFyYW1ldGVyLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NOYW1lLCBwYXJhbWV0ZXJUeXBlLCBwYXJhbWV0ZXIsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIHBhcmFtZXRlci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgZmFsc2UsIGNsYXNzTG9hZGVyKSwgcGFyYW1ldGVyVHlwZSwgcGFyYW1ldGVyKTsKLQl9Ci0JCi0JLyoKLQkgKiBQdXNoIHRoZSBkZWNsYXJlZCBmaWVsZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBvbnRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcHVzaERlY2xhcmVkRmllbGRzKENsYXNzPD8+IGphdmFDbGFzcywgU3RhY2s8RmllbGQ+IHN0YWNrKSB7Ci0JCUZpZWxkW10gZmllbGRzID0gZGVjbGFyZWRGaWVsZHMoamF2YUNsYXNzKTsKLQkJZm9yIChpbnQgaSA9IGZpZWxkcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJc3RhY2sucHVzaChmaWVsZHNbaV0pOwotCQl9Ci0JfQotCQotCS8qCi0JICogUHVzaCB0aGUgZGVjbGFyZWQgbWV0aG9kcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIG9udG8gdGhlIHRvcCBvZiB0aGUgc3RhY2suCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdXNoRGVjbGFyZWRNZXRob2RzKENsYXNzPD8+IGphdmFDbGFzcywgU3RhY2s8TWV0aG9kPiBzdGFjaykgewotCQlNZXRob2RbXSBtZXRob2RzID0gZGVjbGFyZWRNZXRob2RzKGphdmFDbGFzcyk7Ci0JCWZvciAoaW50IGkgPSBtZXRob2RzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlzdGFjay5wdXNoKG1ldGhvZHNbaV0pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldCBhIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBvYmplY3QsIGZpZWxkIG5hbWUsIGFuZCBuZXcgZmllbGQgdmFsdWUuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBPYmplY3Qjc2V0RmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmllbGRWYWx1ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkgewotCQl0cnkgewotCQkJYXR0ZW1wdFRvU2V0RmllbGRWYWx1ZShvYmplY3QsIGZpZWxkTmFtZSwgZmllbGRWYWx1ZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIG5zZmUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zZmUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdCwgZmllbGROYW1lKSwgbnNmZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0IGEgc3RhdGljIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBjbGFzcywgZmllbGQgbmFtZSwgYW5kIG5ldyBmaWVsZCB2YWx1ZS4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIENsYXNzI3NldFN0YXRpY0ZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFN0YXRpY0ZpZWxkVmFsdWUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkgewotCQl0cnkgewotCQkJYXR0ZW1wdFRvU2V0U3RhdGljRmllbGRWYWx1ZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSwgZmllbGRWYWx1ZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIG5zZmUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zZmUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKGphdmFDbGFzcywgZmllbGROYW1lKSwgbnNmZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBvYmplY3QncyBjbGFzcy4KLQkgKiBDbGFzcyNnZXRTaG9ydE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHNob3J0TmFtZUZvcihvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2hvcnQgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gIk9iamVjdCIpLgotCSAqIENsYXNzI2dldFNob3J0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnROYW1lRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2hvcnQgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gIk9iamVjdCIpLgotCSAqIENsYXNzI2dldFNob3J0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnROYW1lRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gc2hvcnROYW1lRm9yQ2xhc3NOYW1lZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXN0ZWQgbmFtZSBvZiB0aGUgb2JqZWN0J3MgY2xhc3MuCi0JICogQ2xhc3MjZ2V0TmVzdGVkTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmVzdGVkQ2xhc3NOYW1lRm9yT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG5lc3RlZE5hbWVGb3Iob2JqZWN0LmdldENsYXNzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5lc3RlZCBuYW1lIG9mIHRoZSBjbGFzcyAoZS5nLiAiRW50cnkiKS4KLQkgKiBDbGFzcyNnZXROZXN0ZWROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXN0ZWROYW1lRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpICsgMSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmVzdGVkIG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJFbnRyeSIpLgotCSAqIENsYXNzI2dldE5lc3RlZE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5lc3RlZE5hbWVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBuZXN0ZWROYW1lRm9yQ2xhc3NOYW1lZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAidG9TdHJpbmcoKSIgbmFtZSBvZiB0aGUgb2JqZWN0J3MgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmdDbGFzc05hbWVGb3JPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdG9TdHJpbmdOYW1lRm9yKG9iamVjdC5nZXRDbGFzcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAidG9TdHJpbmcoKSIgbmFtZSBvZiB0aGUgY2xhc3MuCi0JICogIk1lbWJlciIgY2xhc3NlcyB3aWxsIHJldHVybiBvbmx5IHRoZSBmaW5hbCBuYW1lOgotCSAqICAgICAiY29tLmZvby5iYXIuVG9wTGV2ZWxDbGFzcyRNZW1iZXJDbGFzcyROZXN0ZWRNZW1iZXJDbGFzcyIKLQkgKiAgICAgICAgID0+ICJOZXN0ZWRNZW1iZXJDbGFzcyIKLQkgKiAiTG9jYWwiIGFuZCAiYW5vbnltb3VzIiBjbGFzc2VzIHdpbGwgc3RpbGwgcmV0dXJuIHRoZSBlbWJlZGRlZCAnJCdzOgotCSAqICAgICAiY29tLmZvby5iYXIuVG9wTGV2ZWxDbGFzcyQxTG9jYWxDbGFzcyIKLQkgKiAgICAgICAgID0+ICJUb3BMZXZlbENsYXNzJDFMb2NhbENsYXNzIgotCSAqICAgICAiY29tLmZvby5iYXIuVG9wTGV2ZWxDbGFzcyQxIgotCSAqICAgICAgICAgPT4gIlRvcExldmVsQ2xhc3MkMSIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZ05hbWVGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZWRJc01lbWJlcihjbGFzc05hbWUpID8KLQkJCWNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUikgKyAxKQotCQk6Ci0JCQljbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgInRvU3RyaW5nKCkiIG5hbWUgb2YgdGhlIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nTmFtZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIHRvU3RyaW5nTmFtZUZvckNsYXNzTmFtZWQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBjbGFzcyAoZS5nLiAiamF2YS5sYW5nIikuCi0JICogQ2xhc3MjZ2V0UGFja2FnZU5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhY2thZ2VOYW1lRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gcGFja2FnZU5hbWVGb3JDbGFzc05hbWVkKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gImphdmEubGFuZyIpLgotCSAqIENsYXNzI2dldFBhY2thZ2VOYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWNrYWdlTmFtZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpbnQgbGFzdFBlcmlvZCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAobGFzdFBlcmlvZCA9PSAtMSkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGxhc3RQZXJpb2QpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNob3J0IG5hbWUgb2YgdGhlIGNsYXNzLAotCSAqIGZvbGxvd2VkIGJ5IGl0cyBwYWNrYWdlIG5hbWUgKGUuZy4gIk9iamVjdCAoamF2YS5sYW5nKSIpLgotCSAqIENsYXNzI2dldFNob3J0TmFtZVdpdGhQYWNrYWdlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydE5hbWVXaXRoUGFja2FnZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZChzaG9ydE5hbWVGb3IoamF2YUNsYXNzKSk7Ci0JCWlmICggISBqYXZhQ2xhc3MuaXNQcmltaXRpdmUoKSkgewotCQkJc2IuYXBwZW5kKCIgKCIpOwotCQkJc2IuYXBwZW5kKHBhY2thZ2VOYW1lRm9yKGphdmFDbGFzcykpOwotCQkJc2IuYXBwZW5kKCcpJyk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSB6ZXJvLWFyZ3VtZW50LCBzdGF0aWMgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIG1ldGhvZCBuYW1lLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2Qgc3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gc3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBzdGF0aWMgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIHN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJaWYgKE1vZGlmaWVyLmlzU3RhdGljKG1ldGhvZC5nZXRNb2RpZmllcnMoKSkpIHsKLQkJCXJldHVybiBtZXRob2Q7Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbihmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBzdGF0aWMgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2Qgc3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlc30pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgY2FuIGJlICJkZWNsYXJlZCIgaW4gY29kZTsKLQkgKiBpLmUuIGl0IGlzIGVpdGhlciBhICJ0b3AtbGV2ZWwiIGNsYXNzIG9yIGEgIm1lbWJlciIgY2xhc3MsIGJ1dCBpdAotCSAqIGlzIG5vdCBhbiAiYXJyYXkiIGNsYXNzLiBUaGlzIG1ldGhvZCByb2xscyB0b2dldGhlciBhbGwgdGhlIGNoZWNrcwotCSAqIGZyb20gdGhlIG90aGVyIG1ldGhvZHMgZm9yIGEgYml0IG9mIGEgcGVyZm9ybWFuY2UgdHdlYWsuCi0JICogQ2xhc3MjaXNEZWNsYXJhYmxlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzRGVjbGFyYWJsZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWUuY2hhckF0KDApID09IEFSUkFZX0lORElDQVRPUikgewotCQkJcmV0dXJuIGZhbHNlOwkJLy8gaXQgaXMgYW4gImFycmF5IiBjbGFzcwotCQl9Ci0JCWludCBpbmRleCA9IGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUik7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIHRydWU7CQkvLyBpdCBpcyBhICJ0b3AtbGV2ZWwiIGNsYXNzCi0JCX0KLQkJZG8gewotCQkJLy8gdGhlIGNoYXJhY3RlciBpbW1lZGlhdGVseSBhZnRlciBlYWNoIGRvbGxhciBzaWduIGNhbm5vdCBiZSBhIGRpZ2l0Ci0JCQlpbmRleCsrOwotCQkJaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoaW5kZXgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SLCBpbmRleCk7Ci0JCX0gd2hpbGUgKGluZGV4ICE9IC0xKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAidG9wLWxldmVsIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgIm1lbWJlciIsICJsb2NhbCIsIG9yICJhbm9ueW1vdXMiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBqZGsgbmFtaW5nIGNvbnZlbnRpb25zIChpLmUuIHRoZSBjbGFzcwotCSAqIG5hbWUgZG9lcyBOT1QgY29udGFpbiBhICckJzogIlRvcExldmVsQ2xhc3MiKS4KLQkgKiBDbGFzcyNpc1RvcExldmVsKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzVG9wTGV2ZWwoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpID09IC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAibWVtYmVyIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgInRvcC1sZXZlbCIsICJsb2NhbCIsIG9yICJhbm9ueW1vdXMiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBqZGsgbmFtaW5nIGNvbnZlbnRpb25zIChpLmUuIHRoZSBjbGFzcwotCSAqIG5hbWUgY29udGFpbnMgYXQgbGVhc3Qgb25lICckJyBhbmQgYWxsIHRoZSBuYW1lcyBiZXR3ZWVuCi0JICogZWFjaCAnJCcgYXJlIGxlZ2FsIGNsYXNzIG5hbWVzOgotCSAqICJUb3BMZXZlbENsYXNzJE1lbWJlckNsYXNzJE5lc3RlZE1lbWJlckNsYXNzIikuCi0JICogQ2xhc3MjaXNNZW1iZXIoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNNZW1iZXIoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBpbmRleCA9IGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUik7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIGZhbHNlOwkvLyBpdCBpcyBhICJ0b3AtbGV2ZWwiIGNsYXNzCi0JCX0KLQkJZG8gewotCQkJLy8gdGhlIGNoYXJhY3RlciBpbW1lZGlhdGVseSBhZnRlciBlYWNoIGRvbGxhciBzaWduIGNhbm5vdCBiZSBhIGRpZ2l0Ci0JCQlpbmRleCsrOwotCQkJaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoaW5kZXgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SLCBpbmRleCk7Ci0JCX0gd2hpbGUgKGluZGV4ICE9IC0xKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJsb2NhbCIgY2xhc3MsCi0JICogYXMgb3Bwb3NlZCB0byBhICJ0b3AtbGV2ZWwiLCAibWVtYmVyIiwgb3IgImFub255bW91cyIgY2xhc3MsCi0JICogdXNpbmcgdGhlIHN0YW5kYXJkIGpkayAob3IgRWNsaXBzZSkgbmFtaW5nIGNvbnZlbnRpb25zLgotCSAqIEluIHRoZSBqZGssIHRoZSBjbGFzcyBuYW1lIGVuZHMgd2l0aCAnJG5ublhYWCcgd2hlcmUgdGhlICckJyBpcwotCSAqIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mIG51bWVyaWMgZGlnaXRzIHdoaWNoIGFyZSBmb2xsb3dlZCBieSB0aGUKLQkgKiBsb2NhbCBjbGFzcyBuYW1lOiAiVG9wTGV2ZWxDbGFzcyQxTG9jYWxDbGFzcyIuCi0JICogSW4gRWNsaXBzZSwgdGhlIGNsYXNzIG5hbWUgZW5kcyB3aXRoICckbm5uJFhYWCcgd2hlcmUgdGhlICckJyBpcwotCSAqIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mIG51bWVyaWMgZGlnaXRzIHdoaWNoIGFyZSBzZXBhcmF0ZWQgZnJvbQotCSAqIHRoZSBsb2NhbCBjbGFzcyBuYW1lIGJ5IGFub3RoZXIgJyQnOiAiVG9wTGV2ZWxDbGFzcyQxJExvY2FsQ2xhc3MiLgotCSAqIENsYXNzI2lzTG9jYWwoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNMb2NhbChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGRvbGxhciA9IGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUik7Ci0JCWlmIChkb2xsYXIgPT0gLTEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoICEgQ2hhcmFjdGVyLmlzRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChkb2xsYXIgKyAxKSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgbGVuID0gY2xhc3NOYW1lLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gZG9sbGFyICsgMjsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjbGFzc05hbWUuY2hhckF0KGkpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCS8vIGFsbCB0aGUgY2hhcmFjdGVycyBwYXN0IHRoZSAkIGFyZSBkaWdpdHMgKGFub255bW91cykKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYW4gImFub255bW91cyIgY2xhc3MsCi0JICogYXMgb3Bwb3NlZCB0byBhICJ0b3AtbGV2ZWwiLCAibWVtYmVyIiwgb3IgImxvY2FsIiBjbGFzcywKLQkgKiB1c2luZyB0aGUgc3RhbmRhcmQgamRrIG5hbWluZyBjb252ZW50aW9ucyAoaS5lLiB0aGUgY2xhc3MKLQkgKiBuYW1lIGVuZHMgd2l0aCAnJG5ubicgd2hlcmUgYWxsIHRoZSBjaGFyYWN0ZXJzIHBhc3QgdGhlCi0JICogbGFzdCAnJCcgYXJlIG51bWVyaWMgZGlnaXRzOiAiVG9wTGV2ZWxDbGFzcyQxIikuCi0JICogQ2xhc3MjaXNBbm9ueW1vdXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNBbm9ueW1vdXMoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBkb2xsYXIgPSBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpOwotCQlpZiAoZG9sbGFyID09IC0xKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IHN0YXJ0ID0gZG9sbGFyICsgMTsKLQkJZm9yIChpbnQgaSA9IGNsYXNzTmFtZS5sZW5ndGgoKTsgaS0tID4gc3RhcnQ7ICkgewotCQkJaWYgKCAhIENoYXJhY3Rlci5pc0RpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoaSkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCS8vIGFsbCB0aGUgY2hhcmFjdGVycyBwYXN0IHRoZSAkIGFyZSBkaWdpdHMKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiYXJyYXkgZGVwdGgiIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGRlcHRoIGlzIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBmb3IgYW4gYXJyYXkgdHlwZS4KLQkgKiBOb24tYXJyYXkgdHlwZXMgaGF2ZSBhIGRlcHRoIG9mIHplcm8uCi0JICogQ2xhc3MjZ2V0QXJyYXlEZXB0aCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgYXJyYXlEZXB0aEZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJaW50IGRlcHRoID0gMDsKLQkJd2hpbGUgKGphdmFDbGFzcy5pc0FycmF5KCkpIHsKLQkJCWRlcHRoKys7Ci0JCQlqYXZhQ2xhc3MgPSBqYXZhQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBkZXB0aDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiYXJyYXkgZGVwdGgiIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIFRoZSBkZXB0aCBpcyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgZm9yIGFuIGFycmF5LgotCSAqIE5vbi1hcnJheXMgaGF2ZSBhIGRlcHRoIG9mIHplcm8uCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgYXJyYXlEZXB0aEZvck9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBhcnJheURlcHRoRm9yKG9iamVjdC5nZXRDbGFzcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiYXJyYXkgZGVwdGgiIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGRlcHRoIGlzIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBmb3IgYW4gYXJyYXkgdHlwZS4KLQkgKiBOb24tYXJyYXkgdHlwZXMgaGF2ZSBhIGRlcHRoIG9mIHplcm8uCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICogQ2xhc3MjZ2V0QXJyYXlEZXB0aCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgYXJyYXlEZXB0aEZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpbnQgZGVwdGggPSAwOwotCQl3aGlsZSAoY2xhc3NOYW1lLmNoYXJBdChkZXB0aCkgPT0gQVJSQVlfSU5ESUNBVE9SKSB7Ci0JCQlkZXB0aCsrOwotCQl9Ci0JCXJldHVybiBkZXB0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGFuIGFycmF5IHR5cGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc0FycmF5KFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZS5jaGFyQXQoMCkgPT0gQVJSQVlfSU5ESUNBVE9SOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImVsZW1lbnQgdHlwZSIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZWxlbWVudCB0eXBlIGlzIHRoZSBiYXNlIHR5cGUgaGVsZCBieSBhbiBhcnJheSB0eXBlLgotCSAqIEEgbm9uLWFycmF5IHR5cGUgc2ltcGx5IHJldHVybnMgaXRzZWxmLgotCSAqIENsYXNzI2dldEVsZW1lbnRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGVsZW1lbnRUeXBlRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQl3aGlsZSAoamF2YUNsYXNzLmlzQXJyYXkoKSkgewotCQkJamF2YUNsYXNzID0gamF2YUNsYXNzLmdldENvbXBvbmVudFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gamF2YUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImVsZW1lbnQgdHlwZSIgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogVGhlIGVsZW1lbnQgdHlwZSBpcyB0aGUgYmFzZSB0eXBlIGhlbGQgYnkgYW4gYXJyYXkuCi0JICogQSBub24tYXJyYXkgc2ltcGx5IHJldHVybnMgaXRzIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZWxlbWVudFR5cGVGb3JPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZWxlbWVudFR5cGVGb3Iob2JqZWN0LmdldENsYXNzKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImVsZW1lbnQgdHlwZSIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZWxlbWVudCB0eXBlIGlzIHRoZSBiYXNlIHR5cGUgaGVsZCBieSBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBzaW1wbHkgcmV0dXJuIHRoZW1zZWx2ZXMuCi0JICogQ2xhc3MjZ2V0RWxlbWVudFR5cGUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGVsZW1lbnRUeXBlRm9yKGphdmFDbGFzcykuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImVsZW1lbnQgdHlwZSIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZWxlbWVudCB0eXBlIGlzIHRoZSBiYXNlIHR5cGUgaGVsZCBieSBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBzaW1wbHkgcmV0dXJuIHRoZW1zZWx2ZXMuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICogQ2xhc3MjZ2V0RWxlbWVudFR5cGUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpbnQgZGVwdGggPSBhcnJheURlcHRoRm9yQ2xhc3NOYW1lZChjbGFzc05hbWUpOwotCQlpZiAoZGVwdGggPT0gMCkgewotCQkJLy8gdGhlIG5hbWUgaXMgaW4gdGhlIGZvcm06ICJqYXZhLmxhbmcuT2JqZWN0IiBvciAiaW50IgotCQkJcmV0dXJuIGNsYXNzTmFtZTsKLQkJfQotCQlpbnQgbGFzdCA9IGNsYXNzTmFtZS5sZW5ndGgoKSAtIDE7Ci0JCWlmIChjbGFzc05hbWUuY2hhckF0KGRlcHRoKSA9PSBSRUZFUkVOQ0VfQ0xBU1NfQ09ERSkgewotCQkJLy8gdGhlIG5hbWUgaXMgaW4gdGhlIGZvcm06ICJbW1tMamF2YS5sYW5nLk9iamVjdDsiCi0JCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhkZXB0aCArIDEsIGxhc3QpOwkvLyBkcm9wIHRoZSB0cmFpbGluZyAnOycKLQkJfQotCQkvLyB0aGUgbmFtZSBpcyBpbiB0aGUgZm9ybTogIltbW0kiCi0JCXJldHVybiBjbGFzc05hbWVGb3JDb2RlKGNsYXNzTmFtZS5jaGFyQXQobGFzdCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInJlZmVyZW5jZSIKLQkgKiBjbGFzcyAoaS5lLiBuZWl0aGVyICd2b2lkJyBub3Igb25lIG9mIHRoZSBwcmltaXRpdmUgdmFyaWFibGUgY2xhc3NlcywKLQkgKiBbJ2Jvb2xlYW4nLCAnaW50JywgJ2Zsb2F0JywgZXRjLl0pLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNSZWZlcmVuY2UoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gISBjbGFzc05hbWVkSXNQcmltaXRpdmUoY2xhc3NOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgcHJpbWl0aXZlCi0JICogY2xhc3MgKGkuZS4gJ3ZvaWQnIG9yIG9uZSBvZiB0aGUgcHJpbWl0aXZlIHZhcmlhYmxlIGNsYXNzZXMsCi0JICogWydib29sZWFuJywgJ2ludCcsICdmbG9hdCcsIGV0Yy5dKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzUHJpbWl0aXZlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkgfHwgKGNsYXNzTmFtZS5sZW5ndGgoKSA+IG1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJfQotCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoY29kZXNbaV0uamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInZhcmlhYmxlIiBwcmltaXRpdmUKLQkgKiBjbGFzcyAoaS5lLiAnYm9vbGVhbicsICdpbnQnLCAnZmxvYXQnLCBldGMuLCBidXQgbm90ICd2b2lkJykuCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZWRJc1ByaW1pdGl2ZShjbGFzc05hbWUpCi0JCQkmJiAoICEgY2xhc3NOYW1lLmVxdWFscyhWT0lEX0NMQVNTX05BTUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgcHJpbWl0aXZlIHdyYXBwZXIKLQkgKiBjbGFzcyAoaS5lLiAnamF2YS5sYW5nLlZvaWQnIG9yIG9uZSBvZiB0aGUgcHJpbWl0aXZlIHZhcmlhYmxlIHdyYXBwZXIgY2xhc3NlcywKLQkgKiBbJ2phdmEubGFuZy5Cb29sZWFuJywgJ2phdmEubGFuZy5JbnRlZ2VyJywgJ2phdmEubGFuZy5GbG9hdCcsIGV0Yy5dKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzUHJpbWl0aXZlV3JhcHBlckNsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkgfHwgKGNsYXNzTmFtZS5sZW5ndGgoKSA+IG1heFByaW1pdGl2ZVdyYXBwZXJDbGFzc05hbWVMZW5ndGgoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGNvZGVzW2ldLndyYXBwZXJDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ2YXJpYWJsZSIgcHJpbWl0aXZlCi0JICogY2xhc3MgKGkuZS4gJ2Jvb2xlYW4nLCAnaW50JywgJ2Zsb2F0JywgZXRjLiwgYnV0IG5vdCAndm9pZCcpLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWVkSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3MoY2xhc3NOYW1lKQotCQkJJiYgKCAhIGNsYXNzTmFtZS5lcXVhbHMoVk9JRF9XUkFQUEVSX0NMQVNTX05BTUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgcHJpbWl0aXZlIHdyYXBwZXIKLQkgKiBjbGFzcyAoaS5lLiAnamF2YS5sYW5nLlZvaWQnIG9yIG9uZSBvZiB0aGUgcHJpbWl0aXZlIHZhcmlhYmxlIHdyYXBwZXIgY2xhc3NlcywKLQkgKiBbJ2phdmEubGFuZy5Cb29sZWFuJywgJ2phdmEubGFuZy5JbnRlZ2VyJywgJ2phdmEubGFuZy5GbG9hdCcsIGV0Yy5dKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJaWYgKGphdmFDbGFzcy5pc0FycmF5KCkgfHwgKGphdmFDbGFzcy5nZXROYW1lKCkubGVuZ3RoKCkgPiBtYXhQcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lTGVuZ3RoKCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChjb2Rlc1tpXS53cmFwcGVyQ2xhc3MgPT0gamF2YUNsYXNzKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAidmFyaWFibGUiIHByaW1pdGl2ZQotCSAqIGNsYXNzIChpLmUuICdib29sZWFuJywgJ2ludCcsICdmbG9hdCcsIGV0Yy4sIGJ1dCBub3QgJ3ZvaWQnKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhQ2xhc3MpCi0JCQkmJiAoamF2YUNsYXNzICE9IGphdmEubGFuZy5Wb2lkLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MgY29kZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc05hbWVGb3JDb2RlKGNoYXIgY2xhc3NDb2RlKSB7Ci0JCXJldHVybiBjbGFzc0ZvckNvZGUoY2xhc3NDb2RlKS5nZXROYW1lKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZUZvckNvZGUoaW50IGNsYXNzQ29kZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lRm9yQ29kZSgoY2hhcikgY2xhc3NDb2RlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JDb2RlKGNoYXIgY2xhc3NDb2RlKSB7Ci0JCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChjb2Rlc1tpXS5jb2RlID09IGNsYXNzQ29kZSkgewotCQkJCXJldHVybiBjb2Rlc1tpXS5qYXZhQ2xhc3M7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcudmFsdWVPZihjbGFzc0NvZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIGNvZGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0ZvckNvZGUoaW50IGNsYXNzQ29kZSkgewotCQlyZXR1cm4gY2xhc3NGb3JDb2RlKChjaGFyKSBjbGFzc0NvZGUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGNvZGUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyIGNvZGVGb3JDbGFzcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJaWYgKCggISBqYXZhQ2xhc3MuaXNBcnJheSgpKSAmJiAoamF2YUNsYXNzLmdldE5hbWUoKS5sZW5ndGgoKSA8PSBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSkpIHsKLQkJCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGNvZGVzW2ldLmphdmFDbGFzcyA9PSBqYXZhQ2xhc3MpIHsKLQkJCQkJcmV0dXJuIGNvZGVzW2ldLmNvZGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oamF2YUNsYXNzLmdldE5hbWUoKSk7CQkKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBjb2RlIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhciBjb2RlRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmICgoICEgY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSkgJiYgKGNsYXNzTmFtZS5sZW5ndGgoKSA8PSBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSkpIHsKLQkJCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGNvZGVzW2ldLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQkJcmV0dXJuIGNvZGVzW2ldLmNvZGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY2xhc3NOYW1lKTsJCQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uLCBDbGFzc1Rvb2xzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIiwKLQkgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IHR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCQlyZXR1cm4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24odGQuZWxlbWVudFR5cGVOYW1lLCB0ZC5hcnJheURlcHRoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJdHlwZURlY2xhcmF0aW9uID0gU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZSh0eXBlRGVjbGFyYXRpb24pOwotCQlpbnQgYXJyYXlEZXB0aCA9IGFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25fKHR5cGVEZWNsYXJhdGlvbik7Ci0JCVN0cmluZyBlbGVtZW50VHlwZU5hbWUgPSB0eXBlRGVjbGFyYXRpb24uc3Vic3RyaW5nKDAsIHR5cGVEZWNsYXJhdGlvbi5sZW5ndGgoKSAtIChhcnJheURlcHRoICogMikpOwotCQlyZXR1cm4gbmV3IFR5cGVEZWNsYXJhdGlvbihlbGVtZW50VHlwZU5hbWUsIGFycmF5RGVwdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKGVsZW1lbnRUeXBlTmFtZSwgYXJyYXlEZXB0aCwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLAotCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2xhc3MgbG9hZGVyLgotCSAqLwotCS8vIHNlZSB0aGUgIkV2YWx1YXRpb24iIG9mIGpkayBidWcgNjQ0NjYyNyBmb3IgYSBkaXNjdXNzaW9uIG9mIGxvYWRpbmcgY2xhc3NlcwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCS8vIHByaW1pdGl2ZXMgY2Fubm90IGJlIGxvYWRlZCB2aWEgQ2xhc3MjZm9yTmFtZSgpLAotCQkvLyBzbyBjaGVjayBmb3IgYSBwcmltaXRpdmUgY2xhc3MgbmFtZSBmaXJzdAotCQlQcmltaXRpdmUgcGNjID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSA8PSBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSkgeyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGNvZGVzW2ldLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnRUeXBlTmFtZSkpIHsKLQkJCQkJcGNjID0gY29kZXNbaV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIG5vbi1hcnJheQotCQlpZiAoYXJyYXlEZXB0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gKHBjYyA9PSBudWxsKSA/IENsYXNzLmZvck5hbWUoZWxlbWVudFR5cGVOYW1lLCBmYWxzZSwgY2xhc3NMb2FkZXIpIDogcGNjLmphdmFDbGFzczsKLQkJfQotCi0JCS8vIGFycmF5Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDApOwotCQlmb3IgKGludCBpID0gYXJyYXlEZXB0aDsgaS0tID4gMDsgKSB7Ci0JCQlzYi5hcHBlbmQoQVJSQVlfSU5ESUNBVE9SKTsKLQkJfQotCQlpZiAocGNjID09IG51bGwpIHsKLQkJCXNiLmFwcGVuZChSRUZFUkVOQ0VfQ0xBU1NfQ09ERSk7Ci0JCQlzYi5hcHBlbmQoZWxlbWVudFR5cGVOYW1lKTsKLQkJCXNiLmFwcGVuZChSRUZFUkVOQ0VfQ0xBU1NfTkFNRV9ERUxJTUlURVIpOwotCQl9IGVsc2UgewotCQkJc2IuYXBwZW5kKHBjYy5jb2RlKTsKLQkJfQotCQlyZXR1cm4gQ2xhc3MuZm9yTmFtZShzYi50b1N0cmluZygpLCBmYWxzZSwgY2xhc3NMb2FkZXIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iOyBlLmcuCi0JICogICAgICJpbnRbXSIgLT4gIltJIgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IHR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCQlyZXR1cm4gY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKHRkLmVsZW1lbnRUeXBlTmFtZSwgdGQuYXJyYXlEZXB0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBkZXB0aCBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiI7IGUuZy4KLQkgKiAgICAgImludFtdIiAtPiAxCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgYXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBhcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uXyhTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlKHR5cGVEZWNsYXJhdGlvbikpOwotCX0KLQotCS8qCi0JICogQXNzdW1lIG5vIHdoaXRlc3BhY2UgaW4gdGhlIHR5cGUgZGVjbGFyYXRpb24uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25fKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJaW50IGxhc3QgPSB0eXBlRGVjbGFyYXRpb24ubGVuZ3RoKCkgLSAxOwotCQlpbnQgZGVwdGggPSAwOwotCQlpbnQgY2xvc2UgPSBsYXN0OwotCQl3aGlsZSAodHlwZURlY2xhcmF0aW9uLmNoYXJBdChjbG9zZSkgPT0gVFlQRV9ERUNMQVJBVElPTl9BUlJBWV9DTE9TRSkgewotCQkJaWYgKHR5cGVEZWNsYXJhdGlvbi5jaGFyQXQoY2xvc2UgLSAxKSA9PSBUWVBFX0RFQ0xBUkFUSU9OX0FSUkFZX09QRU4pIHsKLQkJCQlkZXB0aCsrOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHR5cGUgZGVjbGFyYXRpb246ICIgKyB0eXBlRGVjbGFyYXRpb24pOwotCQkJfQotCQkJY2xvc2UgPSBsYXN0IC0gKGRlcHRoICogMik7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCkgewotCQkvLyBub24tYXJyYXkKLQkJaWYgKGFycmF5RGVwdGggPT0gMCkgewotCQkJcmV0dXJuIGVsZW1lbnRUeXBlTmFtZTsKLQkJfQotCi0JCWlmIChlbGVtZW50VHlwZU5hbWUuZXF1YWxzKFZPSURfQ0xBU1NfTkFNRSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIiciICsgVk9JRF9DTEFTU19OQU1FICsgIicgbXVzdCBoYXZlIGFuIGFycmF5IGRlcHRoIG9mIHplcm86ICIgKyBhcnJheURlcHRoICsgJy4nKTsKLQkJfQotCQkvLyBhcnJheQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMTAwKTsKLQkJZm9yIChpbnQgaSA9IGFycmF5RGVwdGg7IGktLSA+IDA7ICkgewotCQkJc2IuYXBwZW5kKEFSUkFZX0lORElDQVRPUik7Ci0JCX0KLQotCQkvLyBsb29rIGZvciBhIHByaW1pdGl2ZSBmaXJzdAotCQlQcmltaXRpdmUgcGNjID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSA8PSBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSkgeyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGNvZGVzW2ldLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnRUeXBlTmFtZSkpIHsKLQkJCQkJcGNjID0gY29kZXNbaV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChwY2MgPT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKFJFRkVSRU5DRV9DTEFTU19DT0RFKTsKLQkJCXNiLmFwcGVuZChlbGVtZW50VHlwZU5hbWUpOwotCQkJc2IuYXBwZW5kKFJFRkVSRU5DRV9DTEFTU19OQU1FX0RFTElNSVRFUik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQocGNjLmNvZGUpOwotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IG1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpIHsKLQkJaWYgKE1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEggPT0gLTEpIHsKLQkJCU1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEggPSBjYWxjdWxhdGVNYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKTsKLQkJfQotCQlyZXR1cm4gTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgY2FsY3VsYXRlTWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkgewotCQlpbnQgbWF4ID0gLTE7Ci0JCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWludCBsZW4gPSBjb2Rlc1tpXS5qYXZhQ2xhc3MuZ2V0TmFtZSgpLmxlbmd0aCgpOwotCQkJaWYgKGxlbiA+IG1heCkgewotCQkJCW1heCA9IGxlbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBtYXhQcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lTGVuZ3RoKCkgewotCQlpZiAoTUFYX1BSSU1JVElWRV9XUkFQUEVSX0NMQVNTX05BTUVfTEVOR1RIID09IC0xKSB7Ci0JCQlNQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEggPSBjYWxjdWxhdGVNYXhQcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lTGVuZ3RoKCk7Ci0JCX0KLQkJcmV0dXJuIE1BWF9QUklNSVRJVkVfV1JBUFBFUl9DTEFTU19OQU1FX0xFTkdUSDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgY2FsY3VsYXRlTWF4UHJpbWl0aXZlV3JhcHBlckNsYXNzTmFtZUxlbmd0aCgpIHsKLQkJaW50IG1heCA9IC0xOwotCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpbnQgbGVuID0gY29kZXNbaV0ud3JhcHBlckNsYXNzLmdldE5hbWUoKS5sZW5ndGgoKTsKLQkJCWlmIChsZW4gPiBtYXgpIHsKLQkJCQltYXggPSBsZW47Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1heDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBQcmltaXRpdmVbXSBwcmltaXRpdmVzKCkgewotCQlpZiAoUFJJTUlUSVZFUyA9PSBudWxsKSB7Ci0JCQlQUklNSVRJVkVTID0gYnVpbGRQcmltaXRpdmVzKCk7Ci0JCX0KLQkJcmV0dXJuIFBSSU1JVElWRVM7Ci0JfQotCQotCS8qKgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIFByaW1pdGl2ZVtdIGJ1aWxkUHJpbWl0aXZlcygpIHsKLQkJUHJpbWl0aXZlW10gcmVzdWx0ID0gbmV3IFByaW1pdGl2ZVs5XTsKLQkJcmVzdWx0WzBdID0gbmV3IFByaW1pdGl2ZShCWVRFX0NPREUsIGphdmEubGFuZy5CeXRlLmNsYXNzKTsKLQkJcmVzdWx0WzFdID0gbmV3IFByaW1pdGl2ZShDSEFSX0NPREUsIGphdmEubGFuZy5DaGFyYWN0ZXIuY2xhc3MpOwotCQlyZXN1bHRbMl0gPSBuZXcgUHJpbWl0aXZlKERPVUJMRV9DT0RFLCBqYXZhLmxhbmcuRG91YmxlLmNsYXNzKTsKLQkJcmVzdWx0WzNdID0gbmV3IFByaW1pdGl2ZShGTE9BVF9DT0RFLCBqYXZhLmxhbmcuRmxvYXQuY2xhc3MpOwotCQlyZXN1bHRbNF0gPSBuZXcgUHJpbWl0aXZlKElOVF9DT0RFLCBqYXZhLmxhbmcuSW50ZWdlci5jbGFzcyk7Ci0JCXJlc3VsdFs1XSA9IG5ldyBQcmltaXRpdmUoTE9OR19DT0RFLCBqYXZhLmxhbmcuTG9uZy5jbGFzcyk7Ci0JCXJlc3VsdFs2XSA9IG5ldyBQcmltaXRpdmUoU0hPUlRfQ09ERSwgamF2YS5sYW5nLlNob3J0LmNsYXNzKTsKLQkJcmVzdWx0WzddID0gbmV3IFByaW1pdGl2ZShCT09MRUFOX0NPREUsIGphdmEubGFuZy5Cb29sZWFuLmNsYXNzKTsKLQkJcmVzdWx0WzhdID0gbmV3IFByaW1pdGl2ZShWT0lEX0NPREUsIGphdmEubGFuZy5Wb2lkLmNsYXNzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgQ2xhc3NUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFByaW1pdGl2ZSB7Ci0JCWZpbmFsIGNoYXIgY29kZTsKLQkJZmluYWwgQ2xhc3M8Pz4gamF2YUNsYXNzOwotCQlmaW5hbCBDbGFzczw/PiB3cmFwcGVyQ2xhc3M7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXUkFQUEVSX0NMQVNTX1RZUEVfRklFTERfTkFNRSA9ICJUWVBFIjsKLQkJLy8gZS5nLiBqYXZhLmxhbmcuQm9vbGVhbi5UWVBFID0+IGJvb2xlYW4uY2xhc3MKLQkJUHJpbWl0aXZlKGNoYXIgY29kZSwgQ2xhc3M8Pz4gd3JhcHBlckNsYXNzKSB7Ci0JCQl0aGlzLmNvZGUgPSBjb2RlOwotCQkJdGhpcy53cmFwcGVyQ2xhc3MgPSB3cmFwcGVyQ2xhc3M7Ci0JCQl0aGlzLmphdmFDbGFzcyA9IChDbGFzczw/Pikgc3RhdGljRmllbGRWYWx1ZSh3cmFwcGVyQ2xhc3MsIFdSQVBQRVJfQ0xBU1NfVFlQRV9GSUVMRF9OQU1FKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFR5cGVEZWNsYXJhdGlvbiB7Ci0JCWZpbmFsIFN0cmluZyBlbGVtZW50VHlwZU5hbWU7Ci0JCWZpbmFsIGludCBhcnJheURlcHRoOwotCQlUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHsKLQkJCXRoaXMuZWxlbWVudFR5cGVOYW1lID0gZWxlbWVudFR5cGVOYW1lOwotCQkJdGhpcy5hcnJheURlcHRoID0gYXJyYXlEZXB0aDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0FycmF5VG9vbHNUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0FycmF5VG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWY4NDA3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9BcnJheVRvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZXZlcnNlQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEFycmF5VG9vbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBBcnJheVRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluc3RhbnRpYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdE5ld0FycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGFycmF5MSA9IG5ldyBTdHJpbmdbMl07Ci0JCVN0cmluZ1tdIGFycmF5MiA9IEFycmF5VG9vbHMubmV3QXJyYXkoYXJyYXkxKTsKLQkJYXJyYXkyWzBdID0gImZvbyI7Ci0JCWFycmF5MlsxXSA9ICJiYXIiOwotCQlhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBhcnJheTIuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgYXJyYXkyLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld0FycmF5T2JqZWN0QXJyYXlJbnQoKSB7Ci0JCVN0cmluZ1tdIGFycmF5MSA9IG5ldyBTdHJpbmdbMl07Ci0JCVN0cmluZ1tdIGFycmF5MiA9IEFycmF5VG9vbHMubmV3QXJyYXkoYXJyYXkxLCA1KTsKLQkJYXJyYXkyWzBdID0gImZvbyI7Ci0JCWFycmF5Mls0XSA9ICJiYXIiOwotCQlhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBhcnJheTIuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgYXJyYXkyLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld0FycmF5T2JqZWN0QXJyYXlJbnRfRXhjZXB0aW9uKCkgewotCQlTdHJpbmdbXSBhcnJheTEgPSBuZXcgU3RyaW5nWzJdOwotCQlPYmplY3RbXSBhcnJheTIgPSBBcnJheVRvb2xzLm5ld0FycmF5KGFycmF5MSwgNSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWFycmF5MlsxXSA9IEludGVnZXIudmFsdWVPZig3KTsKLQkJCWZhaWwoImJvZ3VzIGFycmF5OiAiICsgQXJyYXlzLnRvU3RyaW5nKGFycmF5MikpOwotCQl9IGNhdGNoIChBcnJheVN0b3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBvbmVudFR5cGUoKSB7Ci0JCVN0cmluZ1tdIGFycmF5ID0gbmV3IFN0cmluZ1syXTsKLQkJQ2xhc3M8PyBleHRlbmRzIFN0cmluZz4gamF2YUNsYXNzID0gQXJyYXlUb29scy5jb21wb25lbnRUeXBlKGFycmF5KTsKLQkJYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgamF2YUNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3QXJyYXlDbGFzc0ludCgpIHsKLQkJU3RyaW5nW10gYXJyYXkgPSBBcnJheVRvb2xzLm5ld0FycmF5KFN0cmluZy5jbGFzcywgNSk7Ci0JCWFycmF5WzBdID0gImZvbyI7Ci0JCWFycmF5WzRdID0gImJhciI7Ci0JCWFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGFycmF5LmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld0FycmF5Q2xhc3NJbnRfRXhjZXB0aW9uKCkgewotCQlPYmplY3RbXSBhcnJheSA9IEFycmF5VG9vbHMubmV3QXJyYXkoU3RyaW5nLmNsYXNzLCA1KTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJYXJyYXlbMV0gPSBJbnRlZ2VyLnZhbHVlT2YoNyk7Ci0JCQlmYWlsKCJib2d1cyBhcnJheTogIiArIEFycmF5cy50b1N0cmluZyhhcnJheSkpOwotCQl9IGNhdGNoIChBcnJheVN0b3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld0FycmF5Q2xhc3NJbnRfUHJpbWl0aXZlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlPYmplY3RbXSBhcnJheSA9IEFycmF5VG9vbHMubmV3QXJyYXkoaW50LmNsYXNzLCA1KTsKLQkJCWZhaWwoImJvZ3VzIGFycmF5OiAiICsgQXJyYXlzLnRvU3RyaW5nKGFycmF5KSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJzaW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhYmxlKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCU9iamVjdFtdIGEgPSBBcnJheVRvb2xzLmFycmF5KGl0ZXJhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlPYmplY3RbXSBhID0gQXJyYXlUb29scy5hcnJheShpdGVyYWJsZSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmFibGVPYmplY3RBcnJheV9TdHJpbmcoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJU3RyaW5nW10gYSA9IEFycmF5VG9vbHMuYXJyYXkoaXRlcmFibGUsIG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhYmxlT2JqZWN0QXJyYXlfT2JqZWN0KCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCU9iamVjdFtdIGEgPSBBcnJheVRvb2xzLmFycmF5KGl0ZXJhYmxlLCBuZXcgT2JqZWN0WzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYWJsZUludE9iamVjdEFycmF5KCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCVN0cmluZ1tdIGEgPSBBcnJheVRvb2xzLmFycmF5KGl0ZXJhYmxlLCAzLCBuZXcgU3RyaW5nWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYXRvcigpIHsKLQkJT2JqZWN0W10gYSA9IEFycmF5VG9vbHMuYXJyYXkodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JfRW1wdHkoKSB7Ci0JCU9iamVjdFtdIGEgPSBBcnJheVRvb2xzLmFycmF5KEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JJbnQoKSB7Ci0JCU9iamVjdFtdIGEgPSBBcnJheVRvb2xzLmFycmF5KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9ySW50X0VtcHR5KCkgewotCQlPYmplY3RbXSBhID0gQXJyYXlUb29scy5hcnJheShFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9yT2JqZWN0QXJyYXlfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gQXJyYXlUb29scy5hcnJheSh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCBuZXcgU3RyaW5nWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYXRvck9iamVjdEFycmF5X0VtcHR5KCkgewotCQlTdHJpbmdbXSBhID0gQXJyYXlUb29scy5hcnJheShFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+aW5zdGFuY2UoKSwgbmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JPYmplY3RBcnJheV9FbXB0eV9DbGVhckFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gQXJyYXlUb29scy5hcnJheShFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+aW5zdGFuY2UoKSwgbmV3IFN0cmluZ1s1XSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydE51bGwoYVswXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JPYmplY3RBcnJheV9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSBBcnJheVRvb2xzLmFycmF5KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIG5ldyBPYmplY3RbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9ySW50T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBBcnJheVRvb2xzLmFycmF5KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMsIG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9ySW50T2JqZWN0QXJyYXlfRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBBcnJheVRvb2xzLmFycmF5KEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpLCAzLCBuZXcgU3RyaW5nWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEubGVuZ3RoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRPYmplY3RBcnJheU9iamVjdF9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSBBcnJheVRvb2xzLmFkZCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksICJ0d2VudHkiKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0d2VudHkiKSk7Ci0JCWFzc2VydEVxdWFscygidHdlbnR5IiwgYVthLmxlbmd0aC0xXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5T2JqZWN0X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IEFycmF5VG9vbHMuYWRkKHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSwgInR3ZW50eSIpOwotCQlhc3NlcnRFcXVhbHMoNCwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgInR3ZW50eSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d2VudHkiLCBhW2EubGVuZ3RoLTFdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkT2JqZWN0QXJyYXlPYmplY3RfRW1wdHlBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAidHdlbnR5Iik7Ci0JCWFzc2VydEVxdWFscygxLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAidHdlbnR5IikpOwotCQlhc3NlcnRFcXVhbHMoInR3ZW50eSIsIGFbMF0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRPYmplY3RBcnJheUludE9iamVjdF9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDIsICJYIik7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiWCIsICJjIiwgImQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkT2JqZWN0QXJyYXlJbnRPYmplY3RfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAyLCAiWCIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgIlgiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5SW50T2JqZWN0X0VuZCgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgNCwgIlgiKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImQiLCAiWCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRPYmplY3RBcnJheUludE9iamVjdF9aZXJvKCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAwLCAiWCIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiWCIsICJhIiwgImIiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5SW50T2JqZWN0X0V4Y2VwdGlvbigpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhID0gQXJyYXlUb29scy5hZGQoYSwgMzMsICJYIik7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ2hhckFycmF5Q2hhcigpIHsKLQkJY2hhcltdIGEgPSBBcnJheVRvb2xzLmFkZCh0aGlzLmJ1aWxkQ2hhckFycmF5KCksICdkJyk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnZCcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ2hhckFycmF5Q2hhcl9FbXB0eSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhclswXTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICdkJyk7Ci0JCWFzc2VydEVxdWFscygxLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnZCcpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDaGFyQXJyYXlJbnRDaGFyKCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDIsICdYJyk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnWCcpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnYScsICdiJywgJ1gnLCAnYycsICdkJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZENoYXJBcnJheUludENoYXJfWmVybygpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAwLCAnWCcpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ1gnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ1gnLCAnYScsICdiJywgJ2MnLCAnZCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDaGFyQXJyYXlJbnRDaGFyX0VuZCgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCA0LCAnWCcpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ1gnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnWCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IEFycmF5VG9vbHMuYWRkKHRoaXMuYnVpbGRJbnRBcnJheSgpLCAzMCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAzMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnRBcnJheUludF9FbXB0eSgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbMF07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAzMCk7Ci0JCWFzc2VydEVxdWFscygxLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAzMCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMzAgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnRBcnJheUludEludCgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDEsIDIsIDMsIDQgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDIsIDk5KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDk5KSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAyLCA5OSwgMywgNCB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEludEFycmF5SW50SW50X1plcm8oKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyAxLCAyLCAzLCA0IH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAwLCA5OSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCA5OSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgOTksIDEsIDIsIDMsIDQgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnRBcnJheUludEludF9FbmQoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyAxLCAyLCAzLCA0IH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCA0LCA5OSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCA5OSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMSwgMiwgMywgNCwgOTkgfSwgYSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGQgYWxsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIGMpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uX09iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCBjKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9FbXB0eUFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1swXTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCBjKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50Q29sbGVjdGlvbl9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMSwgYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludENvbGxlY3Rpb25fU3RyaW5nX0VuZCgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAzLCBjKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50Q29sbGVjdGlvbl9FbXB0eUFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1swXTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAwLCBjKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50Q29sbGVjdGlvbl9FbXB0eUFycmF5X0V4Y2VwdGlvbigpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMywgYyk7Ci0JCQlmYWlsKCJib2d1cyBhcnJheTogIiArIEFycmF5cy50b1N0cmluZyhuZXdBcnJheSkpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50Q29sbGVjdGlvbl9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMSwgYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmFibGVfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMSwgaXRlcmFibGUpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmFibGVfRW1wdHlBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAwLCBpdGVyYWJsZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYWJsZV9FbXB0eUl0ZXJhYmxlKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMSwgaXRlcmFibGUpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhYmxlSW50X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhYmxlLCAzKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhYmxlSW50X0VtcHR5QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMCwgaXRlcmFibGUsIDMpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmFibGVJbnRfRW1wdHlJdGVyYWJsZSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhYmxlLCAwKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhdG9yX0VtcHR5QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAwLCBpdGVyYXRvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYXRvcl9FbXB0eUl0ZXJhYmxlKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYXRvckludF9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhdG9yLCAzKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhdG9ySW50X0VtcHR5QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAwLCBpdGVyYXRvciwgMyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYXRvckludF9FbXB0eUl0ZXJhdG9yKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhdG9yLCAwKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJdGVyYWJsZSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIGl0ZXJhYmxlKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUl0ZXJhYmxlSW50KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgaXRlcmFibGUsIDMzKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUl0ZXJhdG9yX1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgaXRlcmF0b3IpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SXRlcmF0b3JfT2JqZWN0KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxPYmplY3Q+IGl0ZXJhdG9yID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCkuaXRlcmF0b3IoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCBpdGVyYXRvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZE9iamVjdExpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJdGVyYXRvcl9FbXB0eUl0ZXJhdG9yKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIGl0ZXJhdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUl0ZXJhdG9ySW50KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxPYmplY3Q+IGl0ZXJhdG9yID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCkuaXRlcmF0b3IoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCBpdGVyYXRvciwgMyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZE9iamVjdExpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJdGVyYXRvckludF9FbXB0eUl0ZXJhdG9yKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIGl0ZXJhdG9yLCAwKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X09iamVjdCgpIHsKLQkJT2JqZWN0W10gYTEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCU9iamVjdFtdIGEyID0gdGhpcy5idWlsZE9iamVjdEFycmF5MigpOwotCQlPYmplY3RbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGExLCBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgYTEpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYTEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCVN0cmluZ1tdIGEyID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGExLCBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgKE9iamVjdFtdKSBhMSkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIChPYmplY3RbXSkgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9PYmplY3RTdHJpbmcoKSB7Ci0JCU9iamVjdFtdIGExID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlTdHJpbmdbXSBhMiA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTIoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhMSwgKE9iamVjdFtdKSBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgYTEpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCAoT2JqZWN0W10pIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5T2JqZWN0QXJyYXlfRW1wdHlBcnJheTEoKSB7Ci0JCU9iamVjdFtdIGExID0gbmV3IE9iamVjdFswXTsKLQkJT2JqZWN0W10gYTIgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkyKCk7Ci0JCU9iamVjdFtdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYTEsIGEyKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X0VtcHR5QXJyYXkyKCkgewotCQlPYmplY3RbXSBhMSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJT2JqZWN0W10gYTIgPSBuZXcgT2JqZWN0WzBdOwotCQlPYmplY3RbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGExLCBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgYTEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRPYmplY3RBcnJheV9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDIsIG5ldyBPYmplY3RbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiWCIsICJYIiwgIlgiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50T2JqZWN0QXJyYXlfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAyLCBuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgIlgiLCAiWCIsICJYIiwgImMiLCAiZCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludE9iamVjdEFycmF5X09iamVjdFN0cmluZygpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMiwgKE9iamVjdFtdKSBuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgIlgiLCAiWCIsICJYIiwgImMiLCAiZCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludE9iamVjdEFycmF5X0VuZCgpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgNCwgKE9iamVjdFtdKSBuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiLCAiZCIsICJYIiwgIlgiLCAiWCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludE9iamVjdEFycmF5X1plcm8oKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgT2JqZWN0WzBdOwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMCwgKE9iamVjdFtdKSBuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWCIsICJYIiwgIlgiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRPYmplY3RBcnJheV9FbXB0eUFycmF5MigpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgNCwgKE9iamVjdFtdKSBuZXcgU3RyaW5nWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50T2JqZWN0QXJyYXlfRW1wdHlBcnJheTEoKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMCwgbmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiwgImQiIH0pOwotCQlhc3NlcnRFcXVhbHMoNCwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiwgImQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ2hhckFycmF5Q2hhckFycmF5KCkgewotCQljaGFyW10gYSA9IEFycmF5VG9vbHMuYWRkQWxsKHRoaXMuYnVpbGRDaGFyQXJyYXkoKSwgbmV3IGNoYXJbXSB7ICdkJywgJ2UnIH0pOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ2QnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnZScpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ2hhckFycmF5Q2hhckFycmF5X0VtcHR5QXJyYXkyKCkgewotCQljaGFyW10gYSA9IEFycmF5VG9vbHMuYWRkQWxsKHRoaXMuYnVpbGRDaGFyQXJyYXkoKSwgbmV3IGNoYXJbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDaGFyQXJyYXlDaGFyQXJyYXlFbXB0eUFycmF5MSgpIHsKLQkJY2hhcltdIGEgPSBBcnJheVRvb2xzLmFkZEFsbChuZXcgY2hhclswXSwgbmV3IGNoYXJbXSB7ICdkJywgJ2UnIH0pOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ2QnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnZScpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ2hhckFycmF5SW50Q2hhckFycmF5KCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDIsIG5ldyBjaGFyW10geyAnWCcsICdYJywgJ1gnIH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ1gnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdYJywgJ1gnLCAnWCcsICdjJywgJ2QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ2hhckFycmF5SW50Q2hhckFycmF5X0VuZCgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCA0LCBuZXcgY2hhcltdIHsgJ1gnLCAnWCcsICdYJyB9KTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdYJykpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJywgJ1gnLCAnWCcsICdYJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENoYXJBcnJheUludENoYXJBcnJheV9FbXB0eUFycmF5MSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhclswXTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDAsIG5ldyBjaGFyW10geyAnWCcsICdYJywgJ1gnIH0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ1gnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ1gnLCAnWCcsICdYJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENoYXJBcnJheUludENoYXJBcnJheV9FbXB0eUFycmF5MigpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAyLCBuZXcgY2hhclswXSk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRBcnJheSgpIHsKLQkJaW50W10gYSA9IEFycmF5VG9vbHMuYWRkQWxsKHRoaXMuYnVpbGRJbnRBcnJheSgpLCBuZXcgaW50W10geyAzMCwgNDAgfSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAzMCkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgNDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eUFycmF5MigpIHsKLQkJaW50W10gYSA9IEFycmF5VG9vbHMuYWRkQWxsKHRoaXMuYnVpbGRJbnRBcnJheSgpLCBuZXcgaW50WzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eUFycmF5MSgpIHsKLQkJaW50W10gYSA9IEFycmF5VG9vbHMuYWRkQWxsKG5ldyBpbnRbMF0sIG5ldyBpbnRbXSB7IDMwLCA0MCB9KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDMwKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCA0MCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxJbnRBcnJheUludEludEFycmF5KCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgMSwgMiwgMywgNCB9OwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMiwgbmV3IGludFtdIHsgOTksIDk5LCA5OSB9KTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDk5KSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAyLCA5OSwgOTksIDk5LCAzLCA0IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRJbnRBcnJheV9FbmQoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyAxLCAyLCAzLCA0IH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCA0LCBuZXcgaW50W10geyA5OSwgOTksIDk5IH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgOTkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDEsIDIsIDMsIDQsIDk5LCA5OSwgOTkgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxJbnRBcnJheUludEludEFycmF5X0VtcHR5QXJyYXkyKCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgMSwgMiwgMywgNCB9OwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMiwgbmV3IGludFswXSk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAyLCAzLCA0IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRJbnRBcnJheV9FbXB0eUFycmF5MSgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbMF07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAwLCBuZXcgaW50W10geyA5OSwgOTksIDk5IH0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgOTkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDk5LCA5OSwgOTkgfSwgYSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbGVhciAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMuY2xlYXIoYSk7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsZWFyT2JqZWN0QXJyYXlfRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5jbGVhcihhKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEubGVuZ3RoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uY2F0ZW5hdGUgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbmNhdGVuYXRlT2JqZWN0QXJyYXlBcnJheSgpIHsKLQkJU3RyaW5nW10gYUFycmF5ID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCVN0cmluZ1tdIGVBcnJheSA9IG5ldyBTdHJpbmdbXSB7ICJlIiwgImYiLCAiZyIsICJoIiB9OwotCQlTdHJpbmdbXSBpQXJyYXkgPSBuZXcgU3RyaW5nW10geyAiaSIsICJqIiwgImsiLCAibCIgfTsKLQotCQlTdHJpbmdbXSBleHBlY3RlZCA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiIsICJnIiwgImgiLCAiaSIsICJqIiwgImsiLCAibCIgfTsKLQkJU3RyaW5nW10gYWN0dWFsID0gQXJyYXlUb29scy5jb25jYXRlbmF0ZShhQXJyYXksIGVBcnJheSwgaUFycmF5KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY2F0ZW5hdGVPYmplY3RBcnJheUFycmF5X0VtcHR5KCkgewotCQlTdHJpbmdbXSBhQXJyYXkgPSBuZXcgU3RyaW5nW10geyAgfTsKLQkJU3RyaW5nW10gZUFycmF5ID0gbmV3IFN0cmluZ1swXTsKLQkJU3RyaW5nW10gaUFycmF5ID0gbmV3IFN0cmluZ1swXTsKLQotCQlTdHJpbmdbXSBleHBlY3RlZCA9IG5ldyBTdHJpbmdbMF07Ci0JCVN0cmluZ1tdIGFjdHVhbCA9IEFycmF5VG9vbHMuY29uY2F0ZW5hdGUoYUFycmF5LCBlQXJyYXksIGlBcnJheSk7Ci0JCWFzc2VydEVxdWFscygwLCBhY3R1YWwubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY2F0ZW5hdGVDaGFyQXJyYXlBcnJheSgpIHsKLQkJY2hhcltdIGFBcnJheSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcgfTsKLQkJY2hhcltdIGVBcnJheSA9IG5ldyBjaGFyW10geyAnZScsICdmJywgJ2cnLCAnaCcgfTsKLQkJY2hhcltdIGlBcnJheSA9IG5ldyBjaGFyW10geyAnaScsICdqJywgJ2snLCAnbCcgfTsKLQotCQljaGFyW10gZXhwZWN0ZWQgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onLCAnaycsICdsJyB9OwotCQljaGFyW10gYWN0dWFsID0gQXJyYXlUb29scy5jb25jYXRlbmF0ZShhQXJyYXksIGVBcnJheSwgaUFycmF5KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY2F0ZW5hdGVDaGFyQXJyYXlBcnJheV9FbXB0eSgpIHsKLQkJY2hhcltdIGFBcnJheSA9IG5ldyBjaGFyW10geyAgfTsKLQkJY2hhcltdIGVBcnJheSA9IG5ldyBjaGFyWzBdOwotCQljaGFyW10gaUFycmF5ID0gbmV3IGNoYXJbMF07Ci0KLQkJY2hhcltdIGV4cGVjdGVkID0gbmV3IGNoYXJbMF07Ci0JCWNoYXJbXSBhY3R1YWwgPSBBcnJheVRvb2xzLmNvbmNhdGVuYXRlKGFBcnJheSwgZUFycmF5LCBpQXJyYXkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYWN0dWFsLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbmNhdGVuYXRlSW50QXJyYXlBcnJheSgpIHsKLQkJaW50W10gYUFycmF5ID0gbmV3IGludFtdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWludFtdIGVBcnJheSA9IG5ldyBpbnRbXSB7ICdlJywgJ2YnLCAnZycsICdoJyB9OwotCQlpbnRbXSBpQXJyYXkgPSBuZXcgaW50W10geyAnaScsICdqJywgJ2snLCAnbCcgfTsKLQotCQlpbnRbXSBleHBlY3RlZCA9IG5ldyBpbnRbXSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCcgfTsKLQkJaW50W10gYWN0dWFsID0gQXJyYXlUb29scy5jb25jYXRlbmF0ZShhQXJyYXksIGVBcnJheSwgaUFycmF5KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY2F0ZW5hdGVJbnRBcnJheUFycmF5X0VtcHR5KCkgewotCQlpbnRbXSBhQXJyYXkgPSBuZXcgaW50W10geyAgfTsKLQkJaW50W10gZUFycmF5ID0gbmV3IGludFswXTsKLQkJaW50W10gaUFycmF5ID0gbmV3IGludFswXTsKLQotCQlpbnRbXSBleHBlY3RlZCA9IG5ldyBpbnRbMF07Ci0JCWludFtdIGFjdHVhbCA9IEFycmF5VG9vbHMuY29uY2F0ZW5hdGUoYUFycmF5LCBlQXJyYXksIGlBcnJheSk7Ci0JCWFzc2VydEVxdWFscygwLCBhY3R1YWwubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zT2JqZWN0QXJyYXlPYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAib25lIikpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIG51bGwpKTsKLQkJT2JqZWN0W10gYTIgPSBBcnJheVRvb2xzLmFkZChhLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEyLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zT2JqZWN0QXJyYXlPYmplY3RfRW1wdHlBcnJheSgpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbMF07Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWlucyhhLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQ2hhckFycmF5Q2hhcigpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnYScpKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWlucyhhLCAneicpKTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5hZGQoYSwgJ3onKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEyLCAneicpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNDaGFyQXJyYXlPYmplY3RfRW1wdHlBcnJheSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhclswXTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWlucyhhLCAnYScpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgMTApKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWlucyhhLCA1NSkpOwotCQlpbnRbXSBhMiA9IEFycmF5VG9vbHMuYWRkKGEsIDU1KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEyLCA1NSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0ludEFycmF5T2JqZWN0X0VtcHR5QXJyYXkoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50WzBdOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdhJykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250YWlucyBhbGwgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uKCkgewotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxPYmplY3RBcnJheUl0ZXJhYmxlKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksIGl0ZXJhYmxlKSk7Ci0JCWl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCBpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbE9iamVjdEFycmF5SXRlcmF0b3IoKSB7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxPYmplY3RBcnJheUl0ZXJhdG9yX0VtcHR5KCkgewotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxPYmplY3RBcnJheU9iamVjdEFycmF5KCkgewotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksIHRoaXMuYnVpbGRPYmplY3RBcnJheTIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbENoYXJBcnJheUNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRDaGFyQXJyYXkoKSwgdGhpcy5idWlsZENoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZENoYXJBcnJheSgpLCBuZXcgY2hhcltdIHsgJ3gnLCAneScgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEludEFycmF5SW50QXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkSW50QXJyYXkoKSwgdGhpcy5idWlsZEludEFycmF5KCkpKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkSW50QXJyYXkoKSwgbmV3IGludFtdIHsgNDQ0LCA4ODggfSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaWZmICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3REaWZmRW5kKCkgewotCQlTdHJpbmcgYSA9ICJhIjsKLQkJU3RyaW5nIGIgPSAiYiI7Ci0JCVN0cmluZyBjID0gImMiOwotCQlTdHJpbmcgZCA9ICJkIjsKLQkJU3RyaW5nIGUgPSAiZSI7Ci0JCVN0cmluZyBhXyA9IG5ldyBTdHJpbmcoImEiKTsKLQkJU3RyaW5nIGJfID0gbmV3IFN0cmluZygiYiIpOwotCQlTdHJpbmcgY18gPSBuZXcgU3RyaW5nKCJjIik7Ci0JCVN0cmluZyBkXyA9IG5ldyBTdHJpbmcoImQiKTsKLQkJU3RyaW5nIGVfID0gbmV3IFN0cmluZygiZSIpOwotCQlhc3NlcnRUcnVlKChhICE9IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiICE9IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkICE9IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlICE9IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8gfTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscyg0LCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBhXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygzLCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlTdHJpbmcgY19fID0gbmV3IFN0cmluZyhjKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjX18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjX18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgbnVsbCwgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpZmZSYW5nZSgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBhOwotCQlTdHJpbmcgYl8gPSBiOwotCQlTdHJpbmcgY18gPSBjOwotCQlTdHJpbmcgZF8gPSBkOwotCQlTdHJpbmcgZV8gPSBlOwotCQlhc3NlcnRUcnVlKChhID09IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiID09IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjID09IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkID09IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlID09IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDUsIC0xKSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMSwgLTEpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgNCksIEFycmF5VG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCA0KSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIC0xKSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGJfLCBjXywgYV8sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDIpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCAwKSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMywgMyksIEFycmF5VG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJU3RyaW5nIGNfXyA9IG5ldyBTdHJpbmcoYyk7Ci0JCWFzc2VydFRydWUoKGMgIT0gY19fKSAmJiBjLmVxdWFscyhjXykpOwotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY19fLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSg1LCAtMSksIEFycmF5VG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgyLCAyKSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgbnVsbCwgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoNSwgLTEpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaWZmU3RhcnQoKSB7Ci0JCVN0cmluZyBhID0gImEiOwotCQlTdHJpbmcgYiA9ICJiIjsKLQkJU3RyaW5nIGMgPSAiYyI7Ci0JCVN0cmluZyBkID0gImQiOwotCQlTdHJpbmcgZSA9ICJlIjsKLQkJU3RyaW5nIGFfID0gbmV3IFN0cmluZygiYSIpOwotCQlTdHJpbmcgYl8gPSBuZXcgU3RyaW5nKCJiIik7Ci0JCVN0cmluZyBjXyA9IG5ldyBTdHJpbmcoImMiKTsKLQkJU3RyaW5nIGRfID0gbmV3IFN0cmluZygiZCIpOwotCQlTdHJpbmcgZV8gPSBuZXcgU3RyaW5nKCJlIik7Ci0JCWFzc2VydFRydWUoKGEgIT0gYV8pICYmIGEuZXF1YWxzKGFfKSk7Ci0JCWFzc2VydFRydWUoKGIgIT0gYl8pICYmIGIuZXF1YWxzKGJfKSk7Ci0JCWFzc2VydFRydWUoKGMgIT0gY18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFzc2VydFRydWUoKGQgIT0gZF8pICYmIGQuZXF1YWxzKGRfKSk7Ci0JCWFzc2VydFRydWUoKGUgIT0gZV8pICYmIGUuZXF1YWxzKGVfKSk7Ci0JCVN0cmluZ1tdIGFycmF5MTsKLQkJU3RyaW5nW10gYXJyYXkyOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg1LCBBcnJheVRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgZV8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMoMiwgQXJyYXlUb29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygzLCBBcnJheVRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJU3RyaW5nIGNfXyA9IG5ldyBTdHJpbmcoYyk7Ci0JCWFzc2VydFRydWUoKGMgIT0gY19fKSAmJiBjLmVxdWFscyhjX18pKTsKLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg1LCBBcnJheVRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBudWxsLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDUsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlkZW50aXR5IGRpZmYgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdElkZW50aXR5RGlmZkVuZCgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBhOwotCQlTdHJpbmcgYl8gPSBiOwotCQlTdHJpbmcgY18gPSBjOwotCQlTdHJpbmcgZF8gPSBkOwotCQlTdHJpbmcgZV8gPSBlOwotCQlhc3NlcnRUcnVlKChhID09IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiID09IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjID09IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkID09IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlID09IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGFfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygzLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCVN0cmluZyBjX18gPSBuZXcgU3RyaW5nKGMpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBudWxsLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eURpZmZSYW5nZSgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBhOwotCQlTdHJpbmcgYl8gPSBiOwotCQlTdHJpbmcgY18gPSBjOwotCQlTdHJpbmcgZF8gPSBkOwotCQlTdHJpbmcgZV8gPSBlOwotCQlhc3NlcnRUcnVlKChhID09IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiID09IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjID09IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkID09IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlID09IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDUsIC0xKSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgxLCAtMSksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgNCksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgNCksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIC0xKSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBhXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgMiksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgMCksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMywgMyksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlTdHJpbmcgY19fID0gbmV3IFN0cmluZyhjKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjX18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjX18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDIsIDIpLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgyLCAyKSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBudWxsLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSg1LCAtMSksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHlEaWZmU3RhcnQoKSB7Ci0JCVN0cmluZyBhID0gImEiOwotCQlTdHJpbmcgYiA9ICJiIjsKLQkJU3RyaW5nIGMgPSAiYyI7Ci0JCVN0cmluZyBkID0gImQiOwotCQlTdHJpbmcgZSA9ICJlIjsKLQkJU3RyaW5nIGFfID0gYTsKLQkJU3RyaW5nIGJfID0gYjsKLQkJU3RyaW5nIGNfID0gYzsKLQkJU3RyaW5nIGRfID0gZDsKLQkJU3RyaW5nIGVfID0gZTsKLQkJYXNzZXJ0VHJ1ZSgoYSA9PSBhXykgJiYgYS5lcXVhbHMoYV8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYiA9PSBiXykgJiYgYi5lcXVhbHMoYl8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYyA9PSBjXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXNzZXJ0VHJ1ZSgoZCA9PSBkXykgJiYgZC5lcXVhbHMoZF8pKTsKLQkJYXNzZXJ0VHJ1ZSgoZSA9PSBlXykgJiYgZS5lcXVhbHMoZV8pKTsKLQkJU3RyaW5nW10gYXJyYXkxOwotCQlTdHJpbmdbXSBhcnJheTI7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDUsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfIH07Ci0JCWFzc2VydEVxdWFscygxLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGVfLCBjXywgZF8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygzLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCVN0cmluZyBjX18gPSBuZXcgU3RyaW5nKGMpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgbnVsbCwgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg1LCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGVsZW1lbnRzIGFyZSBpZGVudGljYWwgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlSWRlbnRpY2FsT2JqZWN0QXJyYXlPYmplY3RBcnJheSgpIHsKLQkJT2JqZWN0W10gYTEgPSBuZXcgT2JqZWN0WzRdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlhMVtpXSA9IFN0cmluZy52YWx1ZU9mKGkgKiAxMDAwKTsKLQkJfQotCi0JCU9iamVjdFtdIGEyID0gbmV3IE9iamVjdFthMS5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGEyLmxlbmd0aDsgaSsrKSB7Ci0JCQlhMltpXSA9IGExW2ldOwotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmVsZW1lbnRzQXJlSWRlbnRpY2FsKGExLCBhMikpOwotCQlhMlsyXSA9ICIyMDAwIjsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5lbGVtZW50c0FyZUlkZW50aWNhbChhMSwgYTIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZUlkZW50aWNhbE9iamVjdEFycmF5T2JqZWN0QXJyYXlfQm90aE51bGwoKSB7Ci0JCU9iamVjdFtdIGExID0gbnVsbDsKLQkJT2JqZWN0W10gYTIgPSBudWxsOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuZWxlbWVudHNBcmVJZGVudGljYWwoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlSWRlbnRpY2FsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9PbmVOdWxsKCkgewotCQlPYmplY3RbXSBhMSA9IG51bGw7Ci0JCU9iamVjdFtdIGEyID0gbmV3IE9iamVjdFswXTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5lbGVtZW50c0FyZUlkZW50aWNhbChhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVJZGVudGljYWxPYmplY3RBcnJheU9iamVjdEFycmF5X0RpZmZlcmVudExlbmd0aHMoKSB7Ci0JCU9iamVjdFtdIGExID0gbmV3IFN0cmluZ1tdIHsiZm9vIiwgImJhciJ9OwotCQlPYmplY3RbXSBhMiA9IG5ldyBTdHJpbmdbXSB7ImZvbyIsICJiYXIiLCAiYmF6In07Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuZWxlbWVudHNBcmVJZGVudGljYWwoYTEsIGEyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluZGV4IG9mICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWFzc2VydEVxdWFscygxLCBBcnJheVRvb2xzLmluZGV4T2YoYSwgIm9uZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZk9iamVjdEFycmF5T2JqZWN0X05vdEZvdW5kKCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaW5kZXhPZihhLCAidHdlbnR5IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3RfTnVsbCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoYS5sZW5ndGggLSAxLCBBcnJheVRvb2xzLmluZGV4T2YoYSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3RfTnVsbF9Ob3RGb3VuZCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmluZGV4T2YoYSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eUluZGV4T2ZPYmplY3RBcnJheU9iamVjdCgpIHsKLQkJU3RyaW5nIGZvbyA9ICJmb28iOwotCQlTdHJpbmcgYmFyID0gImJhciI7Ci0JCVN0cmluZyBiYXogPSAiYmF6IjsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbM107Ci0JCWFbMF0gPSBmb287Ci0JCWFbMV0gPSBiYXI7Ci0JCWFbMl0gPSBiYXo7Ci0JCWFzc2VydEVxdWFscygxLCBBcnJheVRvb2xzLmlkZW50aXR5SW5kZXhPZihhLCBiYXIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHlJbmRleE9mT2JqZWN0QXJyYXlPYmplY3RfTm90Rm91bmQoKSB7Ci0JCVN0cmluZyBmb28gPSAiZm9vIjsKLQkJU3RyaW5nIGJhciA9ICJiYXIiOwotCQlTdHJpbmcgYmF6ID0gImJheiI7Ci0JCU9iamVjdFtdIGEgPSBuZXcgT2JqZWN0WzNdOwotCQlhWzBdID0gZm9vOwotCQlhWzFdID0gYmFyOwotCQlhWzJdID0gYmF6OwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaWRlbnRpdHlJbmRleE9mKGEsIG5ldyBTdHJpbmcoImJhciIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4T2ZDaGFyQXJyYXlDaGFyKCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEFycmF5VG9vbHMuaW5kZXhPZihhLCAnYicpKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICdkJyk7Ci0JCWFzc2VydEVxdWFscyhhLmxlbmd0aCAtIDEsIEFycmF5VG9vbHMuaW5kZXhPZihhLCAnZCcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkNoYXJBcnJheUNoYXJfTm90Rm91bmQoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaW5kZXhPZihhLCAneicpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkludEFycmF5SW50KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWFzc2VydEVxdWFscygxLCBBcnJheVRvb2xzLmluZGV4T2YoYSwgMTApKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDMwKTsKLQkJYXNzZXJ0RXF1YWxzKGEubGVuZ3RoIC0gMSwgQXJyYXlUb29scy5pbmRleE9mKGEsIDMwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4T2ZJbnRBcnJheUludF9Ob3RGb3VuZCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaW5kZXhPZihhLCAxMDAwKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluc2VydGlvbiBpbmRleCBvZiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0aW9uSW5kZXhPZk9iamVjdEFycmF5Q29tcGFyYWJsZSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkMiLCAiRCIgfTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEFycmF5VG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJDIiwgIkQiIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkIiKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJCIiwgIkIiLCAiQyIsICJEIiB9OwotCQlhc3NlcnRFcXVhbHMoNiwgQXJyYXlUb29scy5pbnNlcnRpb25JbmRleE9mKGEsICJFIikpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiQiIsICJCIiwgIkIiLCAiQyIsICJEIiB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5pbnNlcnRpb25JbmRleE9mKGEsICJBIikpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkQiIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkEiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc2VydGlvbkluZGV4T2ZPYmplY3RBcnJheU9iamVjdENvbXBhcmF0b3IoKSB7Ci0JCUNvbXBhcmF0b3I8U3RyaW5nPiBjID0gbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKTsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQSIgfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIEFycmF5VG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIsIGMpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkEiIH07Ci0JCWFzc2VydEVxdWFscygzLCBBcnJheVRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkIiLCBjKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkIiLCAiQSIgfTsKLQkJYXNzZXJ0RXF1YWxzKDUsIEFycmF5VG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIsIGMpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQiIsICJBIiB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5pbnNlcnRpb25JbmRleE9mKGEsICJFIiwgYykpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJCIiB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQXJyYXlUb29scy5pbnNlcnRpb25JbmRleE9mKGEsICJBIiwgYykpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJBIiwgIkEiIH07Ci0JCWFzc2VydEVxdWFscyg2LCBBcnJheVRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkEiLCBjKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxhc3QgaW5kZXggb2YgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWFzc2VydEVxdWFscygxLCBBcnJheVRvb2xzLmxhc3RJbmRleE9mKGEsICJvbmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3RfTm90Rm91bmQoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5sYXN0SW5kZXhPZihhLCAidHdlbnR5IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SW5kZXhPZk9iamVjdEFycmF5T2JqZWN0X051bGwoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGEubGVuZ3RoIC0gMSwgQXJyYXlUb29scy5sYXN0SW5kZXhPZihhLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3RfTnVsbF9Ob3RGb3VuZCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmxhc3RJbmRleE9mKGEsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZDaGFyQXJyYXlDaGFyKCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEFycmF5VG9vbHMubGFzdEluZGV4T2YoYSwgJ2InKSk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAnZCcpOwotCQlhc3NlcnRFcXVhbHMoYS5sZW5ndGggLSAxLCBBcnJheVRvb2xzLmxhc3RJbmRleE9mKGEsICdkJykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SW5kZXhPZkNoYXJBcnJheUNoYXJfTm90Rm91bmQoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMubGFzdEluZGV4T2YoYSwgJ3onKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEFycmF5VG9vbHMubGFzdEluZGV4T2YoYSwgMTApKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDMwKTsKLQkJYXNzZXJ0RXF1YWxzKGEubGVuZ3RoIC0gMSwgQXJyYXlUb29scy5sYXN0SW5kZXhPZihhLCAzMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SW5kZXhPZkludEFycmF5SW50X05vdEZvdW5kKCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5sYXN0SW5kZXhPZihhLCAxMDAwKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pbi9tYXggKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdE1pbkNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCdhJywgQXJyYXlUb29scy5taW4odGhpcy5idWlsZENoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pbkNoYXJBcnJheV9FeGNlcHRpb24oKSB7Ci0JCWNoYXJbXSBhcnJheSA9IG5ldyBjaGFyWzBdOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQljaGFyIGMgPSBBcnJheVRvb2xzLm1pbihhcnJheSk7Ci0JCQlmYWlsKCJib2d1cyBjaGFyOiAiICsgYyk7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWluSW50QXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLm1pbih0aGlzLmJ1aWxkSW50QXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaW5JbnRBcnJheV9FeGNlcHRpb24oKSB7Ci0JCWludFtdIGFycmF5ID0gbmV3IGludFswXTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaW50IGkgPSBBcnJheVRvb2xzLm1pbihhcnJheSk7Ci0JCQlmYWlsKCJib2d1cyBpbnQ6ICIgKyBpKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXhDaGFyQXJyYXkxKCkgewotCQlhc3NlcnRFcXVhbHMoJ2MnLCBBcnJheVRvb2xzLm1heCh0aGlzLmJ1aWxkQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWF4Q2hhckFycmF5MigpIHsKLQkJY2hhcltdIGFycmF5ID0gbmV3IGNoYXJbXSB7ICd4JywgJ2EnLCAnYicsICdjJyB9OwotCQlhc3NlcnRFcXVhbHMoJ3gnLCBBcnJheVRvb2xzLm1heChhcnJheSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXhDaGFyQXJyYXlfRXhjZXB0aW9uKCkgewotCQljaGFyW10gYXJyYXkgPSBuZXcgY2hhclswXTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJY2hhciBjID0gQXJyYXlUb29scy5tYXgoYXJyYXkpOwotCQkJZmFpbCgiYm9ndXMgY2hhcjogIiArIGMpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1heEludEFycmF5MSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDIwLCBBcnJheVRvb2xzLm1heCh0aGlzLmJ1aWxkSW50QXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXhJbnRBcnJheTIoKSB7Ci0JCWludFtdIGFycmF5ID0gbmV3IGludFtdIHsgNzcsIDMsIDEsIC0zIH07Ci0JCWFzc2VydEVxdWFscyg3NywgQXJyYXlUb29scy5tYXgoYXJyYXkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWF4SW50QXJyYXlfRXhjZXB0aW9uKCkgewotCQlpbnRbXSBhcnJheSA9IG5ldyBpbnRbMF07Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWludCBpID0gQXJyYXlUb29scy5tYXgoYXJyYXkpOwotCQkJZmFpbCgiYm9ndXMgaW50OiAiICsgaSk7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbW92ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZU9iamVjdEFycmF5SW50SW50KCkgewotCQlTdHJpbmdbXSBhcnJheSA9IG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIgfTsKLQotCQlTdHJpbmdbXSByZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDQsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIsICI1IiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDAsIDUpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIxIiwgIjMiLCAiNCIsICIyIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDQsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZU9iamVjdEFycmF5SW50SW50SW50KCkgewotCQlTdHJpbmdbXSBhcnJheSA9IG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIgfTsKLQotCQlTdHJpbmdbXSByZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDQsIDIsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIsICI1IiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIxIiwgIjMiLCAiNCIsICIyIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjAiLCAiMyIsICIyIiwgIjQiLCAiNSIsICIxIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDAsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUludEFycmF5SW50SW50KCkgewotCQlpbnRbXSBhcnJheSA9IG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMsIDQsIDUgfTsKLQotCQlpbnRbXSByZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDQsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMCwgMSwgMywgNCwgMiwgNSB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDAsIDUpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMSwgMywgNCwgMiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgNCwgMSwgMywgMiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgNCwgMSwgMywgMiB9LCByZXN1bHQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUludEFycmF5SW50SW50SW50KCkgewotCQlpbnRbXSBhcnJheSA9IG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMsIDQsIDUgfTsKLQotCQlpbnRbXSByZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDQsIDIsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMCwgMSwgMywgNCwgMiwgNSB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMSwgMywgNCwgMiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgNCwgMSwgMywgMiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMywgMiwgNCwgMSB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMCwgMywgMiwgNCwgNSwgMSB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDAsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMywgMiwgNCwgMSB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMywgMiwgNCwgMSB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMywgMiwgNCwgMSB9LCByZXN1bHQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUNoYXJBcnJheUludEludCgpIHsKLQkJY2hhcltdIGFycmF5ID0gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicgfTsKLQotCQljaGFyW10gcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCA0LCAyKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnYScsICdiJywgJ2QnLCAnZScsICdjJywgJ2YnIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMCwgNSk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2YnLCAnYScsICdiJywgJ2QnLCAnZScsICdjJyB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdmJywgJ2EnLCAnZScsICdiJywgJ2QnLCAnYycgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAyLCAyKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZicsICdhJywgJ2UnLCAnYicsICdkJywgJ2MnIH0sIHJlc3VsdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQ2hhckFycmF5SW50SW50SW50KCkgewotCQljaGFyW10gYXJyYXkgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdiJywgJ2MnLCAnZCcsICdlJyB9OwotCi0JCWNoYXJbXSByZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDQsIDIsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2InLCAnZScgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAwLCA1LCAxKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2InLCAnYycsICdkJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMiwgNCwgMSk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2UnLCAnYScsICdkJywgJ2InLCAnYycsICdiJyB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdlJywgJ2EnLCAnYycsICdiJywgJ2QnLCAnYicgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAwLCAxLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnYScsICdjJywgJ2InLCAnZCcsICdlJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMSwgMCwgNCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2UnLCAnYScsICdjJywgJ2InLCAnZCcsICdiJyB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdlJywgJ2EnLCAnYycsICdiJywgJ2QnLCAnYicgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAxLCAwLCAwKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2MnLCAnYicsICdkJywgJ2InIH0sIHJlc3VsdCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU9iamVjdEFycmF5T2JqZWN0X09iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICJ0aHJlZSIpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgImZvdXIiKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICJmaXZlIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlKGEsICJ0aHJlZSIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJmb3VyIikpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgImZpdmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU9iamVjdEFycmF5T2JqZWN0X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICJ0aHJlZSIpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgImZvdXIiKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICJmaXZlIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlKGEsICJ0aHJlZSIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJmb3VyIikpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgImZpdmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNoYXJBcnJheUNoYXIoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgJ2QnKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICdlJyk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAnZicpOwotCi0JCWFzc2VydEVxdWFscyg2LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnZCcpKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlKGEsICdkJyk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ2QnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnZScpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdmJykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgMzApOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgNDApOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgNTApOwotCi0JCWFzc2VydEVxdWFscyg2LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAzMCkpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmUoYSwgMzApOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDMwKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCA0MCkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgNTApKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGFsbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCVN0cmluZ1tdIGEyID0gbmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIgfTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgKE9iamVjdFtdKSBhMik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRiIsICJGIiB9LCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X0VtcHR5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJU3RyaW5nW10gYTIgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCAoT2JqZWN0W10pIGEyKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X05vTWF0Y2hlcygpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCVN0cmluZ1tdIGEyID0gbmV3IFN0cmluZ1tdIHsgIlgiLCAiWSIsICJaIiB9OwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCAoT2JqZWN0W10pIGEyKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUl0ZXJhYmxlKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJSXRlcmFibGU8Pz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBpdGVyYWJsZSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRiIsICJGIiB9LCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUl0ZXJhYmxlSW50KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJSXRlcmFibGU8Pz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBpdGVyYWJsZSwgNyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRiIsICJGIiB9LCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUl0ZXJhdG9yKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJSXRlcmFibGU8Pz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJGIiwgIkYiIH0sIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5SXRlcmF0b3JfRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5SXRlcmF0b3JJbnQoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlJdGVyYWJsZTw/PiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIgfSk7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGl0ZXJhYmxlLml0ZXJhdG9yKCksIDcpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkYiLCAiRiIgfSwgYTMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlJdGVyYXRvckludF9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgNyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJGIiwgIkYiIH0sIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGNvbGxlY3Rpb24pOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9FbXB0eUFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgY29sbGVjdGlvbik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTMpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9Ob01hdGNoZXMoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWSIsICJaIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgY29sbGVjdGlvbik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ2hhckFycmF5Q2hhckFycmF5KCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ0EnLCAnQScsICdCJywgJ0InLCAnQycsICdDJywgJ0QnLCAnRCcsICdFJywgJ0UnLCAnRicsICdGJyB9OwotCQljaGFyW10gYTIgPSBuZXcgY2hhcltdIHsgJ0UnLCAnQicgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnQScsICdBJywgJ0MnLCAnQycsICdEJywgJ0QnLCAnRicsICdGJyB9LCBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgYTIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENoYXJBcnJheUNoYXJBcnJheV9FbXB0eTEoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyWzBdOwotCQljaGFyW10gYTIgPSBuZXcgY2hhcltdIHsgJ0UnLCAnQicgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgYTIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENoYXJBcnJheUNoYXJBcnJheV9FbXB0eTIoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnQScsICdBJywgJ0InLCAnQicsICdDJywgJ0MnLCAnRCcsICdEJywgJ0UnLCAnRScsICdGJywgJ0YnIH07Ci0JCWNoYXJbXSBhMiA9IG5ldyBjaGFyWzBdOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ2hhckFycmF5Q2hhckFycmF5X05vTWF0Y2hlcygpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdBJywgJ0EnLCAnQicsICdCJywgJ0MnLCAnQycsICdEJywgJ0QnLCAnRScsICdFJywgJ0YnLCAnRicgfTsKLQkJY2hhcltdIGEyID0gbmV3IGNoYXJbXSB7ICdYJywgJ1onIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxJbnRBcnJheUludEFycmF5KCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbXSB7IDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYgfTsKLQkJaW50W10gYTIgPSBuZXcgaW50W10geyA1LCAyIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAxLCAzLCAzLCA0LCA0LCA2LCA2IH0sIEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eTEoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFswXTsKLQkJaW50W10gYTIgPSBuZXcgaW50W10geyA1LCAyIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxJbnRBcnJheUludEFycmF5X0VtcHR5MigpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2IH07Ci0JCWludFtdIGEyID0gbmV3IGludFswXTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgYTIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbEludEFycmF5SW50QXJyYXlfTm9NYXRjaGVzKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbXSB7IDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYgfTsKLQkJaW50W10gYTIgPSBuZXcgaW50W10geyA1MiwgNjcgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgYTIpKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzT2JqZWN0QXJyYXlPYmplY3QoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICJ0aHJlZSIpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAidHdvIik7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICJ0d28iKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgImZpdmUiKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICJmaXZlIik7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAiZml2ZSIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAiZml2ZSIpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAiZml2ZSIpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCi0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCBudWxsKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIG51bGwpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNPYmplY3RBcnJheU9iamVjdF9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICJ0aHJlZSIpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheUNoYXIoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAnZCcpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAnYicpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAnYicpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCi0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAnZycpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgJ2cnKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICdnJyk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICdnJyk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICdnJyk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzQ2hhckFycmF5Q2hhcl9FbXB0eSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhclswXTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgJ2EnKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCA1NSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsIDEwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgMTApOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCi0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCA3Nyk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCA3Nyk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCA3Nyk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsIDc3KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgNzcpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc0ludEFycmF5SW50X0VtcHR5KCkgewotCQlpbnRbXSBhID0gbmV3IGludFswXTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgMjIpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgZHVwbGljYXRlIGVsZW1lbnRzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c09iamVjdEFycmF5KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCk7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJ0d28iKTsKLQkJbGlzdC5hZGQoInplcm8iKTsKLQkJU3RyaW5nW10gYXJyYXkgPSBBcnJheVRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSkpOwotCQlpbnQgaSA9IDA7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFycmF5W2krK10pOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGFycmF5W2krK10pOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGFycmF5W2krK10pOwotCQlhc3NlcnRFcXVhbHMoaSwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRHVwbGljYXRlRWxlbWVudHNPYmplY3RBcnJheV9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYXJyYXkgPSBBcnJheVRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoMCwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRHVwbGljYXRlRWxlbWVudHNPYmplY3RBcnJheV9TaW5nbGVFbGVtZW50KCkgewotCQlTdHJpbmdbXSBhcnJheSA9IEFycmF5VG9vbHMucmVtb3ZlRHVwbGljYXRlRWxlbWVudHMobmV3IFN0cmluZ1tdIHsgImZvbyIgfSk7Ci0JCWFzc2VydEVxdWFscygxLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c09iamVjdEFycmF5X05vRHVwbGljYXRlcygpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiZm9vIiwgImJhciIsICJiYXoiIH07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhhMSk7Ci0JCWFzc2VydEVxdWFscygzLCBhMi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBlbGVtZW50IGF0IGluZGV4ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50QXRJbmRleE9iamVjdEFycmF5SW50KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkMiLCAiQSIsICJEIiB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50QXRJbmRleChhLCAzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJBIiwgIkQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudEF0SW5kZXhDaGFyQXJyYXlJbnQoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudEF0SW5kZXgoYSwgMyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0EnLCAnQicsICdBJywgJ0EnLCAnRCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50QXRJbmRleEludEFycmF5SW50KCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgOCwgNiwgNywgMzMsIDIsIDExIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChhLCAzLCAzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDgsIDYsIDcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGaXJzdE9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkMiLCAiQSIsICJEIiB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVGaXJzdChhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJCIiwgIkEiLCAiQyIsICJBIiwgIkQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRmlyc3QoYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGaXJzdEludEFycmF5KCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgOCwgNiwgNywgMzMsIDIsIDExIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUZpcnN0KGEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNiwgNywgMzMsIDIsIDExIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTGFzdE9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkMiLCAiQSIsICJEIiB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVMYXN0KGEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkMiLCAiQSIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVMYXN0Q2hhckFycmF5KCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnQScsICdCJywgJ0EnLCAnQycsICdBJywgJ0QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUxhc3QoYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0EnLCAnQicsICdBJywgJ0MnLCAnQScgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVMYXN0SW50QXJyYXkoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyA4LCA2LCA3LCAzMywgMiwgMTEgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlTGFzdChhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDgsIDYsIDcsIDMzLCAyIH0sIGEpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGVsZW1lbnRzIGF0IGluZGV4ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhPYmplY3RBcnJheUludEludCgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGEsIDMsIDIpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4T2JqZWN0QXJyYXlJbnRJbnRfWmVyb0xlbmd0aCgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiQyIsICJBIiwgIkQiIH07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYTEsIDMsIDApOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnRzQXRJbmRleE9iamVjdEFycmF5SW50SW50X0VtcHR5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkMiLCAiQSIsICJEIiB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYSwgMCwgNik7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnRzQXRJbmRleENoYXJBcnJheUludEludCgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ0EnLCAnQicsICdBJywgJ0MnLCAnQScsICdEJyB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYSwgMCwgNSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4Q2hhckFycmF5SW50SW50X1plcm9MZW5ndGgoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnQScsICdCJywgJ0EnLCAnQycsICdBJywgJ0QnIH07Ci0JCWNoYXJbXSBhMiA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGExLCAzLCAwKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhDaGFyQXJyYXlJbnRJbnRfRW1wdHkoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGEsIDAsIDYpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhJbnRBcnJheUludEludCgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDgsIDYsIDcsIDMzLCAyLCAxMSB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYSwgMywgMyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA4LCA2LCA3IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4SW50QXJyYXlJbnRJbnRfWmVyb0xlbmd0aCgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyA4LCA2LCA3LCAzMywgMiwgMTEgfTsKLQkJaW50W10gYTIgPSBBcnJheVRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChhMSwgMywgMCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4SW50QXJyYXlJbnRJbnRfRW1wdHkoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyA4LCA2LCA3LCAzMywgMiwgMTEgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGEsIDAsIDYpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXBsYWNlIGFsbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUFsbE9iamVjdEFycmF5T2JqZWN0T2JqZWN0X09iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVwbGFjZUFsbChhLCAiQSIsICJaIik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWiIsICJCIiwgIloiLCAiQyIsICJaIiwgIkQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUFsbE9iamVjdEFycmF5T2JqZWN0T2JqZWN0X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVwbGFjZUFsbChhLCAiQSIsICJaIik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiWiIsICJCIiwgIloiLCAiQyIsICJaIiwgIkQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUFsbE9iamVjdEFycmF5T2JqZWN0T2JqZWN0X051bGwoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyBudWxsLCAiQiIsIG51bGwsICJDIiwgbnVsbCwgIkQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlcGxhY2VBbGwoYSwgbnVsbCwgIloiKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJaIiwgIkIiLCAiWiIsICJDIiwgIloiLCAiRCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlQWxsQ2hhckFycmF5Q2hhckNoYXIoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVwbGFjZUFsbChhLCAnQScsICdaJyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ1onLCAnQicsICdaJywgJ0MnLCAnWicsICdEJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VBbGxJbnRBcnJheUludEludCgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDAsIDEsIDAsIDcsIDAsIDk5IH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlcGxhY2VBbGwoYSwgMCwgMTMpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMTMsIDEsIDEzLCA3LCAxMywgOTkgfSwgYSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXRhaW4gYWxsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJT2JqZWN0W10gYTIgPSBuZXcgT2JqZWN0W10geyAiRSIsICJCIiwgbmV3IEludGVnZXIoNykgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJCIiwgIkIiLCAiRSIsICJFIiB9LCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgYTIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5T2JqZWN0QXJyYXlfRW1wdHlPYmplY3RBcnJheTEoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1swXTsKLQkJU3RyaW5nW10gYTIgPSBuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgYTIpOwotCQlhc3NlcnRFcXVhbHMoMCwgYTMubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9FbXB0eU9iamVjdEFycmF5MigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfTsKLQkJU3RyaW5nW10gYTIgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBhMik7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheU9iamVjdEFycmF5X0JvdGhFbXB0eSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMiA9IG5ldyBTdHJpbmdbMF07Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5SXRlcmFibGUoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQiIsICJCIiwgIkUiLCAiRSIgfSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGl0ZXJhYmxlKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUl0ZXJhYmxlX0VtcHR5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1swXTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUl0ZXJhYmxlSW50KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH0pOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJFIiwgIkUiIH0sIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBpdGVyYWJsZSwgMykpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYWJsZUludF9FbXB0eU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgaXRlcmFibGUsIDMpOwotCQlhc3NlcnRFcXVhbHMoMCwgYTMubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYXRvcigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KS5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJFIiwgIkUiIH0sIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBpdGVyYXRvcikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYXRvcl9FbXB0eU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBpdGVyYXRvcik7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUl0ZXJhdG9yX0VtcHR5SXRlcmF0b3IoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1swXSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYXRvckludCgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KS5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJFIiwgIkUiIH0sIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBpdGVyYXRvciwgMykpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYXRvckludF9FbXB0eUl0ZXJhdG9yKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbMF0sIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCksIDMpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5SXRlcmF0b3JJbnRfRW1wdHlPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfSkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgaXRlcmF0b3IsIDMpOwotCQlhc3NlcnRFcXVhbHMoMCwgYTMubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJCIiwgIkIiLCAiRSIsICJFIiB9LCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgY29sbGVjdGlvbikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uX0VtcHR5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1swXTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgY29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fRW1wdHlDb2xsZWN0aW9uKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgY29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fQWxsKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIgfSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGNvbGxlY3Rpb24pKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENoYXJBcnJheUNoYXJBcnJheSgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdBJywgJ0EnLCAnQicsICdCJywgJ0MnLCAnQycsICdEJywgJ0QnLCAnRScsICdFJywgJ0YnLCAnRicgfTsKLQkJY2hhcltdIGEyID0gbmV3IGNoYXJbXSB7ICdFJywgJ0InIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0InLCAnQicsICdFJywgJ0UnIH0sIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ2hhckFycmF5Q2hhckFycmF5X0VtcHR5Q2hhckFycmF5MSgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbMF07Ci0JCWNoYXJbXSBhMiA9IG5ldyBjaGFyW10geyAnRScsICdCJyB9OwotCQlhc3NlcnRTYW1lKGExLCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ2hhckFycmF5Q2hhckFycmF5X0VtcHR5Q2hhckFycmF5MigpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdFJywgJ0InIH07Ci0JCWNoYXJbXSBhMiA9IG5ldyBjaGFyWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDaGFyQXJyYXlDaGFyQXJyYXlfUmV0YWluQWxsKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ0UnLCAnQicsICdFJywgJ0InLCAnRScsICdCJywgJ0UnLCAnQicsICdFJyB9OwotCQljaGFyW10gYTIgPSBuZXcgY2hhcltdIHsgJ0UnLCAnQicgfTsKLQkJYXNzZXJ0U2FtZShhMSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbEludEFycmF5SW50QXJyYXkoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiB9OwotCQlpbnRbXSBhMiA9IG5ldyBpbnRbXSB7IDUsIDIgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDIsIDIsIDUsIDUgfSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxJbnRBcnJheUludEFycmF5X0VtcHR5SW50QXJyYXkxKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbMF07Ci0JCWludFtdIGEyID0gbmV3IGludFtdIHsgNSwgMiB9OwotCQlhc3NlcnRTYW1lKGExLCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eUludEFycmF5MigpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyA1LCAyIH07Ci0JCWludFtdIGEyID0gbmV3IGludFswXTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBhMikubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsSW50QXJyYXlJbnRBcnJheV9SZXRhaW5BbGwoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgNSwgMiwgNSwgMiwgNSwgMiwgNSwgMiwgNSwgMiwgNSB9OwotCQlpbnRbXSBhMiA9IG5ldyBpbnRbXSB7IDUsIDIgfTsKLQkJYXNzZXJ0U2FtZShhMSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJldmVyc2UgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VPYmplY3RBcnJheV9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJldmVyc2UoYSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlT2JqZWN0QXJyYXlfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhID0gQXJyYXlUb29scy5yZXZlcnNlKGEpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZU9iamVjdEFycmF5X1NpbmdsZXRvbigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiZm9vIiB9OwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMucmV2ZXJzZShhMSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZUNoYXJBcnJheSgpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJldmVyc2UoYSk7Ci0JCWFzc2VydEVxdWFscygnYycsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoJ2InLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCdhJywgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VDaGFyQXJyYXlfU2luZ2xldG9uKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ2YnIH07Ci0JCWNoYXJbXSBhMiA9IEFycmF5VG9vbHMucmV2ZXJzZShhMSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZUludEFycmF5KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJldmVyc2UoYSk7Ci0JCWFzc2VydEVxdWFscygyMCwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygxMCwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygwLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZUludEFycmF5X1NpbmdsZXRvbigpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyA3IH07Ci0JCWludFtdIGEyID0gQXJyYXlUb29scy5yZXZlcnNlKGExKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByb3RhdGUgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhID0gQXJyYXlUb29scy5yb3RhdGUoYSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVPYmplY3RBcnJheV9aZXJvKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZU9iamVjdEFycmF5X09uZSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiZm9vICAiIH07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZU9iamVjdEFycmF5SW50KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhID0gQXJyYXlUb29scy5yb3RhdGUoYSwgMik7Ci0JCWFzc2VydEVxdWFscygib25lIiwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVPYmplY3RBcnJheUludF9aZXJvRGlzdGFuY2UoKSB7Ci0JCVN0cmluZ1tdIGExID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExLCAwKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVPYmplY3RBcnJheUludF9OZWdhdGl2ZURpc3RhbmNlKCkgewotCQlTdHJpbmdbXSBhMSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJU3RyaW5nW10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSwgLTEpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGEyWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBhMlsxXSk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGEyWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlT2JqZWN0QXJyYXlJbnRfWmVybygpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExLCA3KTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVPYmplY3RBcnJheUludF9PbmUoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgImZvbyAgIiB9OwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExLCA4KTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5yb3RhdGUoYSk7Ci0JCWFzc2VydEVxdWFscygnYycsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoJ2EnLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCdiJywgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUNoYXJBcnJheV9aZXJvKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhclswXTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUNoYXJBcnJheV9PbmUoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnYScgfTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUNoYXJBcnJheUludCgpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJvdGF0ZShhLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKCdiJywgYVswXSk7Ci0JCWFzc2VydEVxdWFscygnYycsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoJ2EnLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlQ2hhckFycmF5SW50X1plcm9EaXN0YW5jZSgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycgfTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEsIDApOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUNoYXJBcnJheUludF9OZWdhdGl2ZURpc3RhbmNlKCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYSA9IEFycmF5VG9vbHMucm90YXRlKGEsIC0xKTsKLQkJYXNzZXJ0RXF1YWxzKCdiJywgYVswXSk7Ci0JCWFzc2VydEVxdWFscygnYycsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoJ2EnLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlQ2hhckFycmF5SW50X1plcm8oKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyWzBdOwotCQljaGFyW10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSwgMjAwMSk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlQ2hhckFycmF5SW50X09uZSgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdhJyB9OwotCQljaGFyW10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSwgMjIpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUludEFycmF5KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJvdGF0ZShhKTsKLQkJYXNzZXJ0RXF1YWxzKDIwLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoMTAsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVJbnRBcnJheV9aZXJvKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbMF07Ci0JCWludFtdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUludEFycmF5X09uZSgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyA3NyB9OwotCQlpbnRbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5yb3RhdGUoYSwgMik7Ci0JCWFzc2VydEVxdWFscygxMCwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygyMCwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygwLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlSW50QXJyYXlJbnRfWmVyb0Rpc3RhbmNlKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbXSB7IDMsIDIsIDEgfTsKLQkJaW50W10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSwgMCk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlSW50QXJyYXlJbnRfTmVnYXRpdmVEaXN0YW5jZSgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5yb3RhdGUoYSwgLTEpOwotCQlhc3NlcnRFcXVhbHMoMTAsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoMjAsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoMCwgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUludEFycmF5SW50X1plcm8oKSB7Ci0JCWludFtdIGExID0gbmV3IGludFswXTsKLQkJaW50W10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSwgMyk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlSW50QXJyYXlJbnRfT25lKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbXSB7IDc3IH07Ci0JCWludFtdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEsIDQ0KTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzaHVmZmxlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTaHVmZmxlT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGFycmF5MSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJU3RyaW5nW10gYXJyYXkyID0gQXJyYXlUb29scy5zaHVmZmxlKHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscyhhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGFycmF5MSwgKE9iamVjdFtdKSBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZU9iamVjdEFycmF5X1NpbmdsZXRvbigpIHsKLQkJU3RyaW5nW10gYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgImZvbyIgfTsKLQkJU3RyaW5nW10gYXJyYXkyID0gQXJyYXlUb29scy5zaHVmZmxlKG5ldyBTdHJpbmdbXSB7ICJmb28iIH0pOwotCQlhc3NlcnRFcXVhbHMoYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhcnJheTEsIChPYmplY3RbXSkgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNodWZmbGVDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhcnJheTEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWNoYXJbXSBhcnJheTIgPSBBcnJheVRvb2xzLnNodWZmbGUodGhpcy5idWlsZENoYXJBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZUNoYXJBcnJheV9TaW5nbGV0b24oKSB7Ci0JCWNoYXJbXSBhcnJheTEgPSBuZXcgY2hhcltdIHsgJ2YnIH07Ci0JCWNoYXJbXSBhcnJheTIgPSBBcnJheVRvb2xzLnNodWZmbGUobmV3IGNoYXJbXSB7ICdmJyB9KTsKLQkJYXNzZXJ0RXF1YWxzKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZUludEFycmF5KCkgewotCQlpbnRbXSBhcnJheTEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJaW50W10gYXJyYXkyID0gQXJyYXlUb29scy5zaHVmZmxlKHRoaXMuYnVpbGRJbnRBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZUludEFycmF5X1NpbmdsZXRvbigpIHsKLQkJaW50W10gYXJyYXkxID0gbmV3IGludFtdIHsgNyB9OwotCQlpbnRbXSBhcnJheTIgPSBBcnJheVRvb2xzLnNodWZmbGUobmV3IGludFtdIHsgNyB9KTsKLQkJYXNzZXJ0RXF1YWxzKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3ViLWFycmF5ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJBcnJheU9iamVjdEFycmF5SW50SW50KCkgewotCQlTdHJpbmdbXSBhcnJheSA9IG5ldyBTdHJpbmdbXSB7ImZvbyIsICJiYXIiLCAiYmF6IiwgImpvbyIsICJqYXIiLCAiamF6In07Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbXSB7ImZvbyIsICJiYXIiLCAiYmF6IiwgImpvbyJ9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCAwLCA0KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBTdHJpbmdbXSB7ImphciJ9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCA0LCA1KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIEFycmF5VG9vbHMuc3ViQXJyYXkoYXJyYXksIDUsIDUpKSk7Ci0KLQkJcmVzdWx0ID0gbmV3IFN0cmluZ1tdIHsiam9vIiwgImphciIsICJqYXoifTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQXJyYXlUb29scy5zdWJBcnJheShhcnJheSwgMywgNikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViQXJyYXlJbnRBcnJheUludEludCgpIHsKLQkJaW50W10gYXJyYXkgPSBuZXcgaW50W10gezc3LCA5OSwgMzMzLCA0LCA5MDkwLCA0Mn07Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbXSB7NzcsIDk5LCAzMzMsIDR9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCAwLCA0KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBpbnRbXSB7OTA5MH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIEFycmF5VG9vbHMuc3ViQXJyYXkoYXJyYXksIDQsIDUpKSk7Ci0KLQkJcmVzdWx0ID0gbmV3IGludFswXTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQXJyYXlUb29scy5zdWJBcnJheShhcnJheSwgNSwgNSkpKTsKLQotCQlyZXN1bHQgPSBuZXcgaW50W10gezQsIDkwOTAsIDQyfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQXJyYXlUb29scy5zdWJBcnJheShhcnJheSwgMywgNikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViQXJyYXlDaGFyQXJyYXlJbnRJbnQoKSB7Ci0JCWNoYXJbXSBhcnJheSA9IG5ldyBjaGFyW10geydhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZid9OwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbXSB7J2EnLCAnYicsICdjJywgJ2QnfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQXJyYXlUb29scy5zdWJBcnJheShhcnJheSwgMCwgNCkpKTsKLQotCQlyZXN1bHQgPSBuZXcgY2hhcltdIHsnZSd9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCA0LCA1KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBjaGFyWzBdOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCA1LCA1KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBjaGFyW10geydkJywgJ2UnLCAnZid9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCAzLCA2KSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzd2FwICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTd2FwT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWEgPSBBcnJheVRvb2xzLnN3YXAoYSwgMSwgMik7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTd2FwT2JqZWN0QXJyYXlfU2FtZUluZGljZXMoKSB7Ci0JCVN0cmluZ1tdIGExID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlTdHJpbmdbXSBhMiA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYTEgPSBBcnJheVRvb2xzLnN3YXAoYTEsIDEsIDEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN3YXBDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5zd2FwKGEsIDEsIDIpOwotCQlhc3NlcnRFcXVhbHMoJ2EnLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCdjJywgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygnYicsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTd2FwQ2hhckFycmF5X1NhbWVJbmRpY2VzKCkgewotCQljaGFyW10gYTEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWNoYXJbXSBhMiA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYTEgPSBBcnJheVRvb2xzLnN3YXAoYTEsIDEsIDEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN3YXBJbnRBcnJheSgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5zd2FwKGEsIDEsIDIpOwotCQlhc3NlcnRFcXVhbHMoMCwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygyMCwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygxMCwgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN3YXBJbnRBcnJheV9TYW1lSW5kaWNlcygpIHsKLQkJaW50W10gYTEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJaW50W10gYTIgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYTEgPSBBcnJheVRvb2xzLnN3YXAoYTEsIDEsIDEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFycmF5cyBlbmhhbmNlbWVudHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxCb29sZWFuQXJyYXlCb29sZWFuKCkgewotCQlib29sZWFuW10gYTEgPSBuZXcgYm9vbGVhbls5XTsKLQkJYm9vbGVhbltdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCB0cnVlKTsKLQkJZm9yIChib29sZWFuIHggOiBhMSkgewotCQkJYXNzZXJ0VHJ1ZSh4KTsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxCb29sZWFuQXJyYXlJbnRJbnRCb29sZWFuKCkgewotCQlib29sZWFuW10gYTEgPSBuZXcgYm9vbGVhbls5XTsKLQkJYm9vbGVhbltdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCBmYWxzZSk7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJYm9vbGVhbltdIGEzID0gQXJyYXlUb29scy5maWxsKGEyLCBmcm9tLCB0bywgdHJ1ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4geCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRGYWxzZSh4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0VHJ1ZSh4KTsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbEJ5dGVBcnJheUJ5dGUoKSB7Ci0JCWJ5dGVbXSBhMSA9IG5ldyBieXRlWzldOwotCQlieXRlW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIChieXRlKSA3Nyk7Ci0JCWZvciAoYnl0ZSB4IDogYTEpIHsKLQkJCWFzc2VydEVxdWFscyg3NywgeCk7Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsQnl0ZUFycmF5SW50SW50Qnl0ZSgpIHsKLQkJYnl0ZVtdIGExID0gbmV3IGJ5dGVbOV07Ci0JCWJ5dGVbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgKGJ5dGUpIDMpOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCWJ5dGVbXSBhMyA9IEFycmF5VG9vbHMuZmlsbChhMiwgZnJvbSwgdG8sIChieXRlKSA3Nyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCWJ5dGUgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoMywgeCk7Ci0JCQl9IGVsc2UgewotCQkJCWFzc2VydEVxdWFscyg3NywgeCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCQlhc3NlcnRTYW1lKGExLCBhMyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxDaGFyQXJyYXlDaGFyKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcls5XTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAnYycpOwotCQlmb3IgKGNoYXIgeCA6IGExKSB7Ci0JCQlhc3NlcnRFcXVhbHMoJ2MnLCB4KTsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxDaGFyQXJyYXlJbnRJbnRDaGFyKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcls5XTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAnYScpOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCWNoYXJbXSBhMyA9IEFycmF5VG9vbHMuZmlsbChhMiwgZnJvbSwgdG8sICdjJyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoJ2EnLCB4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCdjJywgeCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCQlhc3NlcnRTYW1lKGExLCBhMyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxEb3VibGVBcnJheURvdWJsZSgpIHsKLQkJZG91YmxlW10gYTEgPSBuZXcgZG91YmxlWzldOwotCQlkb3VibGVbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgNzcuNzcpOwotCQlmb3IgKGRvdWJsZSB4IDogYTEpIHsKLQkJCWFzc2VydEVxdWFscyg3Ny43NywgeCwgMC4wKTsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxEb3VibGVBcnJheUludEludERvdWJsZSgpIHsKLQkJZG91YmxlW10gYTEgPSBuZXcgZG91YmxlWzldOwotCQlkb3VibGVbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgMy4zKTsKLQkJaW50IGZyb20gPSAzOwotCQlpbnQgdG8gPSA2OwotCQlkb3VibGVbXSBhMyA9IEFycmF5VG9vbHMuZmlsbChhMiwgZnJvbSwgdG8sIDc3Ljc3KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJZG91YmxlIHggPSBhMVtpXTsKLQkJCWlmIChpIDwgZnJvbSB8fCBpID49IHRvKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMuMywgeCwgMC4wKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDc3Ljc3LCB4LCAwLjApOwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsRmxvYXRBcnJheUZsb2F0KCkgewotCQlmbG9hdFtdIGExID0gbmV3IGZsb2F0WzldOwotCQlmbG9hdFtdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCA3Ny43N2YpOwotCQlmb3IgKGZsb2F0IHggOiBhMSkgewotCQkJYXNzZXJ0RXF1YWxzKDc3Ljc3ZiwgeCwgMC4wKTsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxGbG9hdEFycmF5SW50SW50RmxvYXQoKSB7Ci0JCWZsb2F0W10gYTEgPSBuZXcgZmxvYXRbOV07Ci0JCWZsb2F0W10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIDMuM2YpOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCWZsb2F0W10gYTMgPSBBcnJheVRvb2xzLmZpbGwoYTIsIGZyb20sIHRvLCA3Ny43N2YpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlmbG9hdCB4ID0gYTFbaV07Ci0JCQlpZiAoaSA8IGZyb20gfHwgaSA+PSB0bykgewotCQkJCWFzc2VydEVxdWFscygzLjNmLCB4LCAwLjApOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRFcXVhbHMoNzcuNzdmLCB4LCAwLjApOwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFs5XTsKLQkJaW50W10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIDc3KTsKLQkJZm9yIChpbnQgeCA6IGExKSB7Ci0JCQlhc3NlcnRFcXVhbHMoNzcsIHgpOwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbEludEFycmF5SW50SW50SW50KCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbOV07Ci0JCWludFtdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAzKTsKLQkJaW50IGZyb20gPSAzOwotCQlpbnQgdG8gPSA2OwotCQlpbnRbXSBhMyA9IEFycmF5VG9vbHMuZmlsbChhMiwgZnJvbSwgdG8sIDc3KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJaW50IHggPSBhMVtpXTsKLQkJCWlmIChpIDwgZnJvbSB8fCBpID49IHRvKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMsIHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRFcXVhbHMoNzcsIHgpOwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsT2JqZWN0QXJyYXlPYmplY3QoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1s5XTsKLQkJU3RyaW5nW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsICI3NyIpOwotCQlmb3IgKFN0cmluZyB4IDogYTEpIHsKLQkJCWFzc2VydEVxdWFscygiNzciLCB4KTsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxPYmplY3RBcnJheUludEludE9iamVjdCgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzldOwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgIjMiKTsKLQkJaW50IGZyb20gPSAzOwotCQlpbnQgdG8gPSA2OwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMuZmlsbChhMiwgZnJvbSwgdG8sICI3NyIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoIjMiLCB4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCI3NyIsIHgpOwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsTG9uZ0FycmF5TG9uZygpIHsKLQkJbG9uZ1tdIGExID0gbmV3IGxvbmdbOV07Ci0JCWxvbmdbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgNzcpOwotCQlmb3IgKGxvbmcgeCA6IGExKSB7Ci0JCQlhc3NlcnRFcXVhbHMoNzcsIHgpOwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbExvbmdBcnJheUludEludExvbmcoKSB7Ci0JCWxvbmdbXSBhMSA9IG5ldyBsb25nWzldOwotCQlsb25nW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIDMpOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCWxvbmdbXSBhMyA9IEFycmF5VG9vbHMuZmlsbChhMiwgZnJvbSwgdG8sIDc3KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJbG9uZyB4ID0gYTFbaV07Ci0JCQlpZiAoaSA8IGZyb20gfHwgaSA+PSB0bykgewotCQkJCWFzc2VydEVxdWFscygzLCB4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDc3LCB4KTsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbFNob3J0QXJyYXlTaG9ydCgpIHsKLQkJc2hvcnRbXSBhMSA9IG5ldyBzaG9ydFs5XTsKLQkJc2hvcnRbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgKHNob3J0KSA3Nyk7Ci0JCWZvciAoc2hvcnQgeCA6IGExKSB7Ci0JCQlhc3NlcnRFcXVhbHMoNzcsIHgpOwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbFNob3J0QXJyYXlJbnRJbnRTaG9ydCgpIHsKLQkJc2hvcnRbXSBhMSA9IG5ldyBzaG9ydFs5XTsKLQkJc2hvcnRbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgKHNob3J0KSAzKTsKLQkJaW50IGZyb20gPSAzOwotCQlpbnQgdG8gPSA2OwotCQlzaG9ydFtdIGEzID0gQXJyYXlUb29scy5maWxsKGEyLCBmcm9tLCB0bywgKHNob3J0KSA3Nyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCXNob3J0IHggPSBhMVtpXTsKLQkJCWlmIChpIDwgZnJvbSB8fCBpID49IHRvKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMsIHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRFcXVhbHMoNzcsIHgpOwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0Qnl0ZUFycmF5KCkgewotCQlieXRlW10gYTEgPSBuZXcgYnl0ZVszXTsKLQkJYTFbMF0gPSAoYnl0ZSkgMzM7Ci0JCWExWzFdID0gKGJ5dGUpIDExOwotCQlhMVsyXSA9IChieXRlKSAyMjsKLQkJYnl0ZVtdIGEyID0gQXJyYXlUb29scy5zb3J0KGExKTsKLQkJYnl0ZSBsYXN0ID0gKGJ5dGUpIDA7Ci0JCWZvciAoYnl0ZSB4IDogYTEpIHsKLQkJCWFzc2VydFRydWUobGFzdCA8IHgpOwotCQkJbGFzdCA9IHg7Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0Qnl0ZUFycmF5SW50SW50KCkgewotCQlieXRlW10gYTEgPSBuZXcgYnl0ZVs5XTsKLQkJYnl0ZVtdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAoYnl0ZSkgMyk7Ci0JCWEyWzNdID0gKGJ5dGUpIDMzOwotCQlhMls0XSA9IChieXRlKSAxMTsKLQkJYTJbNV0gPSAoYnl0ZSkgMjI7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJYnl0ZVtdIGEzID0gQXJyYXlUb29scy5zb3J0KGEyLCBmcm9tLCB0byk7Ci0JCWJ5dGUgbGFzdCA9IChieXRlKSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlieXRlIHggPSBhMVtpXTsKLQkJCWlmIChpIDwgZnJvbSB8fCBpID49IHRvKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMsIHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRUcnVlKGxhc3QgPCB4KTsKLQkJCQlsYXN0ID0geDsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydENoYXJBcnJheSgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbM107Ci0JCWExWzBdID0gJ3onOwotCQlhMVsxXSA9ICdiJzsKLQkJYTFbMl0gPSAnbSc7Ci0JCWNoYXJbXSBhMiA9IEFycmF5VG9vbHMuc29ydChhMSk7Ci0JCWNoYXIgbGFzdCA9ICdhJzsKLQkJZm9yIChjaGFyIHggOiBhMSkgewotCQkJYXNzZXJ0VHJ1ZShsYXN0IDwgeCk7Ci0JCQlsYXN0ID0geDsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRDaGFyQXJyYXlJbnRJbnQoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyWzldOwotCQljaGFyW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsICdjJyk7Ci0JCWEyWzNdID0gJ3onOwotCQlhMls0XSA9ICdiJzsKLQkJYTJbNV0gPSAnbSc7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJY2hhcltdIGEzID0gQXJyYXlUb29scy5zb3J0KGEyLCBmcm9tLCB0byk7Ci0JCWNoYXIgbGFzdCA9ICdhJzsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJY2hhciB4ID0gYTFbaV07Ci0JCQlpZiAoaSA8IGZyb20gfHwgaSA+PSB0bykgewotCQkJCWFzc2VydEVxdWFscygnYycsIHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRUcnVlKGxhc3QgPCB4KTsKLQkJCQlsYXN0ID0geDsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydERvdWJsZUFycmF5KCkgewotCQlkb3VibGVbXSBhMSA9IG5ldyBkb3VibGVbM107Ci0JCWExWzBdID0gMzMuMzM7Ci0JCWExWzFdID0gMTEuMTE7Ci0JCWExWzJdID0gMjIuMjI7Ci0JCWRvdWJsZVtdIGEyID0gQXJyYXlUb29scy5zb3J0KGExKTsKLQkJZG91YmxlIGxhc3QgPSAwOwotCQlmb3IgKGRvdWJsZSB4IDogYTEpIHsKLQkJCWFzc2VydFRydWUobGFzdCA8IHgpOwotCQkJbGFzdCA9IHg7Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0RG91YmxlQXJyYXlJbnRJbnQoKSB7Ci0JCWRvdWJsZVtdIGExID0gbmV3IGRvdWJsZVs5XTsKLQkJZG91YmxlW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIDMuMyk7Ci0JCWEyWzNdID0gMzMuMzM7Ci0JCWEyWzRdID0gMTEuMTE7Ci0JCWEyWzVdID0gMjIuMjI7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJZG91YmxlW10gYTMgPSBBcnJheVRvb2xzLnNvcnQoYTIsIGZyb20sIHRvKTsKLQkJZG91YmxlIGxhc3QgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlkb3VibGUgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoMy4zLCB4LCAwLjApOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRUcnVlKGxhc3QgPCB4KTsKLQkJCQlsYXN0ID0geDsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydEZsb2F0QXJyYXkoKSB7Ci0JCWZsb2F0W10gYTEgPSBuZXcgZmxvYXRbM107Ci0JCWExWzBdID0gMzMuMzNmOwotCQlhMVsxXSA9IDExLjExZjsKLQkJYTFbMl0gPSAyMi4yMmY7Ci0JCWZsb2F0W10gYTIgPSBBcnJheVRvb2xzLnNvcnQoYTEpOwotCQlmbG9hdCBsYXN0ID0gMDsKLQkJZm9yIChmbG9hdCB4IDogYTEpIHsKLQkJCWFzc2VydFRydWUobGFzdCA8IHgpOwotCQkJbGFzdCA9IHg7Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0RmxvYXRBcnJheUludEludCgpIHsKLQkJZmxvYXRbXSBhMSA9IG5ldyBmbG9hdFs5XTsKLQkJZmxvYXRbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgMy4zZik7Ci0JCWEyWzNdID0gMzMuMzNmOwotCQlhMls0XSA9IDExLjExZjsKLQkJYTJbNV0gPSAyMi4yMmY7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJZmxvYXRbXSBhMyA9IEFycmF5VG9vbHMuc29ydChhMiwgZnJvbSwgdG8pOwotCQlmbG9hdCBsYXN0ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJZmxvYXQgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoMy4zZiwgeCwgMC4wKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0VHJ1ZShsYXN0IDwgeCk7Ci0JCQkJbGFzdCA9IHg7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCQlhc3NlcnRTYW1lKGExLCBhMyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJbnRBcnJheSgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50WzNdOwotCQlhMVswXSA9IDMzOwotCQlhMVsxXSA9IDExOwotCQlhMVsyXSA9IDIyOwotCQlpbnRbXSBhMiA9IEFycmF5VG9vbHMuc29ydChhMSk7Ci0JCWludCBsYXN0ID0gMDsKLQkJZm9yIChpbnQgeCA6IGExKSB7Ci0JCQlhc3NlcnRUcnVlKGxhc3QgPCB4KTsKLQkJCWxhc3QgPSB4OwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydEludEFycmF5SW50SW50KCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbOV07Ci0JCWludFtdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAzKTsKLQkJYTJbM10gPSAzMzsKLQkJYTJbNF0gPSAxMTsKLQkJYTJbNV0gPSAyMjsKLQkJaW50IGZyb20gPSAzOwotCQlpbnQgdG8gPSA2OwotCQlpbnRbXSBhMyA9IEFycmF5VG9vbHMuc29ydChhMiwgZnJvbSwgdG8pOwotCQlpbnQgbGFzdCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCWludCB4ID0gYTFbaV07Ci0JCQlpZiAoaSA8IGZyb20gfHwgaSA+PSB0bykgewotCQkJCWFzc2VydEVxdWFscygzLCB4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0VHJ1ZShsYXN0IDwgeCk7Ci0JCQkJbGFzdCA9IHg7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCQlhc3NlcnRTYW1lKGExLCBhMyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzNdOwotCQlhMVswXSA9ICJ5IjsKLQkJYTFbMV0gPSAiYiI7Ci0JCWExWzJdID0gIm0iOwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMuc29ydChhMSk7Ci0JCVN0cmluZyBsYXN0ID0gImEiOwotCQlmb3IgKFN0cmluZyB4IDogYTEpIHsKLQkJCWFzc2VydFRydWUobGFzdC5jb21wYXJlVG8oeCkgPCAwKTsKLQkJCWxhc3QgPSB4OwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydE9iamVjdEFycmF5Q29tcGFyYXRvcigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzNdOwotCQlhMVswXSA9ICJ5IjsKLQkJYTFbMV0gPSAiYiI7Ci0JCWExWzJdID0gIm0iOwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMuc29ydChhMSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCVN0cmluZyBsYXN0ID0gInoiOwotCQlmb3IgKFN0cmluZyB4IDogYTEpIHsKLQkJCWFzc2VydFRydWUobGFzdC5jb21wYXJlVG8oeCkgPiAwKTsKLQkJCWxhc3QgPSB4OwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydE9iamVjdEFycmF5SW50SW50KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbOV07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAiYyIpOwotCQlhMlszXSA9ICJ5IjsKLQkJYTJbNF0gPSAiYiI7Ci0JCWEyWzVdID0gIm0iOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5zb3J0KGEyLCBmcm9tLCB0byk7Ci0JCVN0cmluZyBsYXN0ID0gImEiOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoImMiLCB4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0VHJ1ZShsYXN0LmNvbXBhcmVUbyh4KSA8IDApOwotCQkJCWxhc3QgPSB4OwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0T2JqZWN0QXJyYXlJbnRJbnRDb21wYXJhdG9yKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbOV07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAiYyIpOwotCQlhMlszXSA9ICJ5IjsKLQkJYTJbNF0gPSAiYiI7Ci0JCWEyWzVdID0gIm0iOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5zb3J0KGEyLCBmcm9tLCB0bywgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCVN0cmluZyBsYXN0ID0gInoiOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoImMiLCB4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0VHJ1ZShsYXN0LmNvbXBhcmVUbyh4KSA+IDApOwotCQkJCWxhc3QgPSB4OwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0TG9uZ0FycmF5KCkgewotCQlsb25nW10gYTEgPSBuZXcgbG9uZ1szXTsKLQkJYTFbMF0gPSAzMzsKLQkJYTFbMV0gPSAxMTsKLQkJYTFbMl0gPSAyMjsKLQkJbG9uZ1tdIGEyID0gQXJyYXlUb29scy5zb3J0KGExKTsKLQkJbG9uZyBsYXN0ID0gMDsKLQkJZm9yIChsb25nIHggOiBhMSkgewotCQkJYXNzZXJ0VHJ1ZShsYXN0IDwgeCk7Ci0JCQlsYXN0ID0geDsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRMb25nQXJyYXlJbnRJbnQoKSB7Ci0JCWxvbmdbXSBhMSA9IG5ldyBsb25nWzldOwotCQlsb25nW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIDMpOwotCQlhMlszXSA9IDMzOwotCQlhMls0XSA9IDExOwotCQlhMls1XSA9IDIyOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCWxvbmdbXSBhMyA9IEFycmF5VG9vbHMuc29ydChhMiwgZnJvbSwgdG8pOwotCQlsb25nIGxhc3QgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlsb25nIHggPSBhMVtpXTsKLQkJCWlmIChpIDwgZnJvbSB8fCBpID49IHRvKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMsIHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRUcnVlKGxhc3QgPCB4KTsKLQkJCQlsYXN0ID0geDsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydFNob3J0QXJyYXkoKSB7Ci0JCXNob3J0W10gYTEgPSBuZXcgc2hvcnRbM107Ci0JCWExWzBdID0gKHNob3J0KSAzMzsKLQkJYTFbMV0gPSAoc2hvcnQpIDExOwotCQlhMVsyXSA9IChzaG9ydCkgMjI7Ci0JCXNob3J0W10gYTIgPSBBcnJheVRvb2xzLnNvcnQoYTEpOwotCQlzaG9ydCBsYXN0ID0gKHNob3J0KSAwOwotCQlmb3IgKHNob3J0IHggOiBhMSkgewotCQkJYXNzZXJ0VHJ1ZShsYXN0IDwgeCk7Ci0JCQlsYXN0ID0geDsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRTaG9ydEFycmF5SW50SW50KCkgewotCQlzaG9ydFtdIGExID0gbmV3IHNob3J0WzldOwotCQlzaG9ydFtdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAoc2hvcnQpIDMpOwotCQlhMlszXSA9IChzaG9ydCkgMzM7Ci0JCWEyWzRdID0gKHNob3J0KSAxMTsKLQkJYTJbNV0gPSAoc2hvcnQpIDIyOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCXNob3J0W10gYTMgPSBBcnJheVRvb2xzLnNvcnQoYTIsIGZyb20sIHRvKTsKLQkJc2hvcnQgbGFzdCA9IChzaG9ydCkgMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJc2hvcnQgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoMywgeCk7Ci0JCQl9IGVsc2UgewotCQkJCWFzc2VydFRydWUobGFzdCA8IHgpOwotCQkJCWxhc3QgPSB4OwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU9iamVjdCBhdCA9IFJlZmxlY3Rpb25Ub29scy5uZXdJbnN0YW5jZShBcnJheVRvb2xzLmNsYXNzKTsKLQkJCWZhaWwoImJvZ3VzOiAiICsgYXQpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCQlpZiAoZXguZ2V0Q2F1c2UoKS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24pIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdXRpbGl0eSAqKioqKioqKioqCi0KLQlwcml2YXRlIE9iamVjdFtdIGJ1aWxkT2JqZWN0QXJyYXkxKCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGJ1aWxkU3RyaW5nQXJyYXkxKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQl9Ci0KLQlwcml2YXRlIGNoYXJbXSBidWlsZENoYXJBcnJheSgpIHsKLQkJcmV0dXJuIG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnIH07Ci0JfQotCi0JcHJpdmF0ZSBpbnRbXSBidWlsZEludEFycmF5KCkgewotCQlyZXR1cm4gbmV3IGludFtdIHsgMCwgMTAsIDIwIH07Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBidWlsZE9iamVjdEFycmF5MigpIHsKLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7ICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiIH07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBidWlsZFN0cmluZ0FycmF5MigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiIH07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRTdHJpbmdMaXN0MSgpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKGwpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8T2JqZWN0PiBidWlsZE9iamVjdExpc3QxKCkgewotCQlMaXN0PE9iamVjdD4gbCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQl0aGlzLmFkZFRvQ29sbGVjdGlvbjEobCk7Ci0JCXJldHVybiBsOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRUb0NvbGxlY3Rpb24xKENvbGxlY3Rpb248PyBzdXBlciBTdHJpbmc+IGMpIHsKLQkJYy5hZGQoInplcm8iKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRTdHJpbmdMaXN0MigpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24yKGwpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVG9Db2xsZWN0aW9uMihDb2xsZWN0aW9uPD8gc3VwZXIgU3RyaW5nPiBjKSB7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQljLmFkZCgiZm91ciIpOwotCQljLmFkZCgiZml2ZSIpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRTdHJpbmdWZWN0b3IxKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkVG9Db2xsZWN0aW9uMSh2KTsKLQkJcmV0dXJuIHY7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQmFnVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CYWdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDE4ZGZhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CYWdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBCYWdUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBCYWdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlCYWdfaXRlcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoQmFnLkVtcHR5Lmluc3RhbmNlKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUJhZ19zaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBCYWcuRW1wdHkuaW5zdGFuY2UoKS5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUJhZ191bmlxdWVJdGVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZShCYWcuRW1wdHkuaW5zdGFuY2UoKS51bmlxdWVJdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5QmFnX3VuaXF1ZUNvdW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBCYWcuRW1wdHkuaW5zdGFuY2UoKS51bmlxdWVDb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlCYWdfY291bnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIEJhZy5FbXB0eS5pbnN0YW5jZSgpLmNvdW50KCJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5QmFnX2VudHJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoQmFnLkVtcHR5Lmluc3RhbmNlKCkuZW50cmllcygpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5QmFnX3JlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZShCYWcuRW1wdHkuaW5zdGFuY2UoKS5yZW1vdmUoImZvbyIsIDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlCYWdfYWRkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUJhZy5FbXB0eS5pbnN0YW5jZSgpLmFkZCgiZm9vIiwgMyk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5QmFnX2VxdWFscygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKEJhZy5FbXB0eS5pbnN0YW5jZSgpLmVxdWFscyhCYWcuRW1wdHkuaW5zdGFuY2UoKSkpOwotCQlhc3NlcnRGYWxzZShCYWcuRW1wdHkuaW5zdGFuY2UoKS5lcXVhbHMoImZvbyIpKTsKLQotCQlCYWc8T2JqZWN0PiBiYWcgPSBuZXcgSGFzaEJhZzxPYmplY3Q+KCk7Ci0JCWFzc2VydFRydWUoQmFnLkVtcHR5Lmluc3RhbmNlKCkuZXF1YWxzKGJhZykpOwotCQliYWcuYWRkKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UoQmFnLkVtcHR5Lmluc3RhbmNlKCkuZXF1YWxzKGJhZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUJhZ19oYXNoQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgQmFnLkVtcHR5Lmluc3RhbmNlKCkuaGFzaENvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5QmFnX3NlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQmFnPD8+IHh4eCA9IFRlc3RUb29scy5zZXJpYWxpemUoQmFnLkVtcHR5Lmluc3RhbmNlKCkpOwotCQlhc3NlcnRTYW1lKEJhZy5FbXB0eS5pbnN0YW5jZSgpLCB4eHgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0JpZGlGaWx0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0JpZGlGaWx0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmQxNTY0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaWRpRmlsdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJpZGlGaWx0ZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEJpZGlGaWx0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBCaWRpRmlsdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxCaWRpRmlsdGVyX2FjY2VwdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKEJpZGlGaWx0ZXIuTnVsbC5pbnN0YW5jZSgpLmFjY2VwdCgiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQmlkaUZpbHRlcl9yZXZlcnNlQWNjZXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoQmlkaUZpbHRlci5OdWxsLmluc3RhbmNlKCkucmV2ZXJzZUFjY2VwdCgiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQmlkaUZpbHRlcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKEJpZGlGaWx0ZXIuTnVsbC5pbnN0YW5jZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQmlkaUZpbHRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlGaWx0ZXI8Pz4geHh4ID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShCaWRpRmlsdGVyLk51bGwuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydFNhbWUoQmlkaUZpbHRlci5OdWxsLmluc3RhbmNlKCksIHh4eCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9wYXF1ZUJpZGlGaWx0ZXJfYWNjZXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKEJpZGlGaWx0ZXIuT3BhcXVlLmluc3RhbmNlKCkuYWNjZXB0KCJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9wYXF1ZUJpZGlGaWx0ZXJfcmV2ZXJzZUFjY2VwdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZShCaWRpRmlsdGVyLk9wYXF1ZS5pbnN0YW5jZSgpLnJldmVyc2VBY2NlcHQoImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3BhcXVlQmlkaUZpbHRlcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKEJpZGlGaWx0ZXIuT3BhcXVlLmluc3RhbmNlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9wYXF1ZUJpZGlGaWx0ZXJfc2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlCaWRpRmlsdGVyPD8+IHh4eCA9IFRlc3RUb29scy5zZXJpYWxpemUoQmlkaUZpbHRlci5PcGFxdWUuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydFNhbWUoQmlkaUZpbHRlci5PcGFxdWUuaW5zdGFuY2UoKSwgeHh4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRCaWRpRmlsdGVyX2FjY2VwdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlCaWRpRmlsdGVyLkRpc2FibGVkLmluc3RhbmNlKCkuYWNjZXB0KCJmb28iKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRCaWRpRmlsdGVyX3JldmVyc2VBY2NlcHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQmlkaUZpbHRlci5EaXNhYmxlZC5pbnN0YW5jZSgpLnJldmVyc2VBY2NlcHQoImZvbyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlGaWx0ZXJfdG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChCaWRpRmlsdGVyLkRpc2FibGVkLmluc3RhbmNlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkQmlkaUZpbHRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlGaWx0ZXI8Pz4geHh4ID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShCaWRpRmlsdGVyLkRpc2FibGVkLmluc3RhbmNlKCkpOwotCQlhc3NlcnRTYW1lKEJpZGlGaWx0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKSwgeHh4KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaWRpU3RyaW5nQ29udmVydGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaWRpU3RyaW5nQ29udmVydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwNDAwYi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQmlkaVN0cmluZ0NvbnZlcnRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmlkaVN0cmluZ0NvbnZlcnRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQmlkaVN0cmluZ0NvbnZlcnRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEJpZGlTdHJpbmdDb252ZXJ0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCkuY29udmVydFRvU3RyaW5nKCJmb28iKSk7Ci0JCWFzc2VydE51bGwoQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCkuY29udmVydFRvU3RyaW5nKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCkuY29udmVydFRvT2JqZWN0KCJmb28iKSk7Ci0JCWFzc2VydE51bGwoQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCkuY29udmVydFRvU3RyaW5nKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJpZGlTdHJpbmdDb252ZXJ0ZXJfdG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChCaWRpU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuaW5zdGFuY2UoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJpZGlTdHJpbmdDb252ZXJ0ZXJfc2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlCaWRpU3RyaW5nQ29udmVydGVyPD8+IHh4eCA9IFRlc3RUb29scy5zZXJpYWxpemUoQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCkpOwotCQlhc3NlcnRTYW1lKEJpZGlTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC5pbnN0YW5jZSgpLCB4eHgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUJpZGlTdHJpbmdDb252ZXJ0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKS5jb252ZXJ0VG9TdHJpbmcoImZvbyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUJpZGlTdHJpbmdDb252ZXJ0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKS5jb252ZXJ0VG9PYmplY3QoImZvbyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlTdHJpbmdDb252ZXJ0ZXJfdG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChCaWRpU3RyaW5nQ29udmVydGVyLkRpc2FibGVkLmluc3RhbmNlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkQmlkaVN0cmluZ0NvbnZlcnRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlTdHJpbmdDb252ZXJ0ZXI8Pz4geHh4ID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShCaWRpU3RyaW5nQ29udmVydGVyLkRpc2FibGVkLmluc3RhbmNlKCkpOwotCQlhc3NlcnRTYW1lKEJpZGlTdHJpbmdDb252ZXJ0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKSwgeHh4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbkJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygidHJ1ZSIsIEJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnRUb1N0cmluZyhCb29sZWFuLlRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIEJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnRUb1N0cmluZyhCb29sZWFuLkZBTFNFKSk7Ci0JCWFzc2VydE51bGwoQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydFRvU3RyaW5nKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbkJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIEJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnRUb09iamVjdCgidHJ1ZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydFRvT2JqZWN0KCJUUlVFIikpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydFRvT2JqZWN0KCJmYWxzZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIEJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnRUb09iamVjdCgieHh4eCIpKTsKLQkJYXNzZXJ0TnVsbChCaWRpU3RyaW5nQ29udmVydGVyLkJvb2xlYW5Db252ZXJ0ZXIuaW5zdGFuY2UoKS5jb252ZXJ0VG9PYmplY3QobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb29sZWFuQmlkaVN0cmluZ0NvbnZlcnRlcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKEJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb29sZWFuQmlkaVN0cmluZ0NvbnZlcnRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlTdHJpbmdDb252ZXJ0ZXI8Pz4geHh4ID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShCaWRpU3RyaW5nQ29udmVydGVyLkJvb2xlYW5Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydFNhbWUoQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyLmluc3RhbmNlKCksIHh4eCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludGVnZXJCaWRpU3RyaW5nQ29udmVydGVyX2NvbnZlcnRUb1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoIjciLCBCaWRpU3RyaW5nQ29udmVydGVyLkludGVnZXJDb252ZXJ0ZXIuaW5zdGFuY2UoKS5jb252ZXJ0VG9TdHJpbmcoSW50ZWdlci52YWx1ZU9mKDcpKSk7Ci0JCWFzc2VydE51bGwoQmlkaVN0cmluZ0NvbnZlcnRlci5JbnRlZ2VyQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydFRvU3RyaW5nKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlckJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNyksIEJpZGlTdHJpbmdDb252ZXJ0ZXIuSW50ZWdlckNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnRUb09iamVjdCgiNyIpKTsKLQkJYXNzZXJ0TnVsbChCaWRpU3RyaW5nQ29udmVydGVyLkludGVnZXJDb252ZXJ0ZXIuaW5zdGFuY2UoKS5jb252ZXJ0VG9PYmplY3QobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyQmlkaVN0cmluZ0NvbnZlcnRlcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKEJpZGlTdHJpbmdDb252ZXJ0ZXIuSW50ZWdlckNvbnZlcnRlci5pbnN0YW5jZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyQmlkaVN0cmluZ0NvbnZlcnRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlTdHJpbmdDb252ZXJ0ZXI8Pz4geHh4ID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShCaWRpU3RyaW5nQ29udmVydGVyLkludGVnZXJDb252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydFNhbWUoQmlkaVN0cmluZ0NvbnZlcnRlci5JbnRlZ2VyQ29udmVydGVyLmluc3RhbmNlKCksIHh4eCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQmlkaVRyYW5zZm9ybWVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaWRpVHJhbnNmb3JtZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzNmMTUzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaWRpVHJhbnNmb3JtZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmlkaVRyYW5zZm9ybWVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBCaWRpVHJhbnNmb3JtZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBCaWRpVHJhbnNmb3JtZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbEJpZGlUcmFuc2Zvcm1lcl90cmFuc2Zvcm0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBCaWRpVHJhbnNmb3JtZXIuTnVsbC5pbnN0YW5jZSgpLnRyYW5zZm9ybSgiZm9vIikpOwotCQlhc3NlcnROdWxsKEJpZGlUcmFuc2Zvcm1lci5OdWxsLmluc3RhbmNlKCkudHJhbnNmb3JtKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbEJpZGlUcmFuc2Zvcm1lcl9yZXZlcnNlVHJhbnNmb3JtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQmlkaVRyYW5zZm9ybWVyLk51bGwuaW5zdGFuY2UoKS5yZXZlcnNlVHJhbnNmb3JtKCJmb28iKSk7Ci0JCWFzc2VydE51bGwoQmlkaVRyYW5zZm9ybWVyLk51bGwuaW5zdGFuY2UoKS50cmFuc2Zvcm0obnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQmlkaVRyYW5zZm9ybWVyX3RvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE5vdE51bGwoQmlkaVRyYW5zZm9ybWVyLk51bGwuaW5zdGFuY2UoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbEJpZGlUcmFuc2Zvcm1lcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlUcmFuc2Zvcm1lcjw/LCA/PiB4eHggPSBUZXN0VG9vbHMuc2VyaWFsaXplKEJpZGlUcmFuc2Zvcm1lci5OdWxsLmluc3RhbmNlKCkpOwotCQlhc3NlcnRTYW1lKEJpZGlUcmFuc2Zvcm1lci5OdWxsLmluc3RhbmNlKCksIHh4eCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkQmlkaVRyYW5zZm9ybWVyX3RyYW5zZm9ybSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlCaWRpVHJhbnNmb3JtZXIuRGlzYWJsZWQuaW5zdGFuY2UoKS50cmFuc2Zvcm0oImZvbyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlUcmFuc2Zvcm1lcl9yZXZlcnNlVHJhbnNmb3JtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUJpZGlUcmFuc2Zvcm1lci5EaXNhYmxlZC5pbnN0YW5jZSgpLnJldmVyc2VUcmFuc2Zvcm0oImZvbyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlUcmFuc2Zvcm1lcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKEJpZGlUcmFuc2Zvcm1lci5EaXNhYmxlZC5pbnN0YW5jZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlUcmFuc2Zvcm1lcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlUcmFuc2Zvcm1lcjw/LCA/PiB4eHggPSBUZXN0VG9vbHMuc2VyaWFsaXplKEJpZGlUcmFuc2Zvcm1lci5EaXNhYmxlZC5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0U2FtZShCaWRpVHJhbnNmb3JtZXIuRGlzYWJsZWQuaW5zdGFuY2UoKSwgeHh4KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaXRUb29sc1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQml0VG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDE5NDEyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaXRUb29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJpdFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBCaXRUb29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEJpdFRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZsYWdJc1NldEludEludCgpIHsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNTZXQoMHgwMDAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNTZXQoMHgwMzAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNTZXQoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNTZXQoMHgwMzAzLCAweDAxMDMpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5mbGFnSXNTZXQoMHgwMzAzLCAweDExMDMpKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuZmxhZ0lzU2V0KDB4MDAwMCwgMHgxMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZsYWdJc09mZkludEludCgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuZmxhZ0lzT2ZmKDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmZsYWdJc09mZigweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5mbGFnSXNPZmYoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuZmxhZ0lzT2ZmKDB4MDMwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNPZmYoMHgyMjA0LCAweDExMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNPZmYoMHgwMDAwLCAweDExMDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T25seUZsYWdJc1NldEludEludCgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAwMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMDAxLCAweDAwMDEpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDMwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAwMDEsIDB4MDAwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDEwMSwgMHgwMTAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAzMDMsIDB4MDEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMTAzLCAweDAxMDMpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDMwMywgMHgxMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdJc1NldCgweDExMDMsIDB4MTEwMykpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMDAwLCAweDExMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDEwMywgMHgwMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9ubHlGbGFnSXNPZmZJbnRJbnQoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHgwMDAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc09mZigweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHhGRkZGRkZGRSwgMHgwMDAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc09mZigweDAzMDMsIDB4MDEwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHhGRkZGRkVGRSwgMHgwMTAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc09mZigweDAzMDMsIDB4MDEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHhGRkZGRkVGQywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc09mZigweDAzMDMsIDB4MTEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHhGRkZGRUVGQywgMHgxMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbEZsYWdzQXJlU2V0SW50SW50KCkgewotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAzMDMsIDB4MDEwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCAweDExMDMpKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMDAwLCAweDExMDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsRmxhZ3NBcmVPZmZJbnRJbnQoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgMHgwMDAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgMHgwMTAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDIyMDQsIDB4MTEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDAwMCwgMHgxMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9ubHlGbGFnc0FyZVNldEludEludCgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMSwgMHgwMDAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMSwgMHgwMDAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgMHgwMTAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDEwMSwgMHgwMTAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgMHgwMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDEwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgMHgxMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MTEwMywgMHgxMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMCwgMHgxMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDEwMywgMHgwMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9ubHlGbGFnc0FyZU9mZkludEludCgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZGRkZFLCAweDAwMDEpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHhGRkZGRkVGRSwgMHgwMTAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDMwMywgMHgwMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4RkZGRkZFRkMsIDB4MDEwMykpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweDAzMDMsIDB4MTEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZFRUZDLCAweDExMDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW55RmxhZ3NBcmVTZXRJbnRJbnQoKSB7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMDAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweEZGRkYsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDAwMywgMHhGRkZGKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMzAzLCAweDEwMTApKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMDAwLCAweEZGRkYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW55RmxhZ3NBcmVPZmZJbnRJbnQoKSB7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHgzMzNFLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweEZGRkUsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlT2ZmKDB4MDAwMywgMHhGRkZGKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHg3MzczLCAweDEwMTApKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHhGRkZGLCAweEZGRkYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsRmxhZ3NBcmVTZXRJbnRJbnRBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAwMDMsIG5ldyBpbnRbXSB7IDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgwMTAwLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweDEwMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAwMDAsIG5ldyBpbnRbXSB7IDB4MTAwMCwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbEZsYWdzQXJlT2ZmSW50SW50QXJyYXkoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDAwMywgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMDEgfSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDEwMCwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgxMDAwLCAweDA0MDAsIDB4MDAyMCwgMHgwMDAwIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAwMDAsIG5ldyBpbnRbXSB7IDB4MTAwMCwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9ubHlGbGFnc0FyZVNldEludEludEFycmF5KCkgewotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMDAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMSwgbmV3IGludFtdIHsgMHgwMDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMDAxLCBuZXcgaW50W10geyAweDAwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDEwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAxMDEsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAxMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDEwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDExLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgxMTAzLCBuZXcgaW50W10geyAweDExMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAwMDAsIG5ldyBpbnRbXSB7IDB4MDExLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMTAzLCBuZXcgaW50W10geyAweDAxMDEsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPbmx5RmxhZ3NBcmVPZmZJbnRJbnRBcnJheSgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDAwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4RkZGRkZGRkUsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMTAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4RkZGRkZFRkUsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAxMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4RkZGRkZFRkMsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDExMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZFRUZDLCBuZXcgaW50W10geyAweDExMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbnlGbGFnc0FyZVNldEludEludEFycmF5KCkgewotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDAwMywgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweEZGRkYsIG5ldyBpbnRbXSB7IDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweEYwMDAsIDB4MEYwMCwgMHgwMEYwLCAweDAwMEYgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgxMDAwLCAweDAwMTAgfSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweDAwMDAsIG5ldyBpbnRbXSB7IDB4RjAwMCwgMHgwRjAwLCAweDAwRjAsIDB4MDAwRiB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFueUZsYWdzQXJlT2ZmSW50SW50QXJyYXkoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlT2ZmKDB4MDAwMywgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHhGRkZGLCBuZXcgaW50W10geyAweDAwMDEgfSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDEwMCwgMHgwMjAwLCAweDAwMDMsIDB4MDAwMiB9KSk7Ci0KLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDEwMCwgMHgwMDEwIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweDAwMDAsIG5ldyBpbnRbXSB7IDB4RjAwMCwgMHgwRjAwLCAweDAwRjAsIDB4MDAwRiB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9yRmxhZ3MoKSB7Ci0JCWFzc2VydEVxdWFscygweDAwMDEsIEJpdFRvb2xzLm9yRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMDAgfSkpOwotCQlhc3NlcnRFcXVhbHMoMHgwMDExLCBCaXRUb29scy5vckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4RjAxMSwgQml0VG9vbHMub3JGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAxMSwgMHhGMDAwIH0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5kRmxhZ3MoKSB7Ci0JCWFzc2VydEVxdWFscygweDAwMDEsIEJpdFRvb2xzLmFuZEZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4MDAwMSwgQml0VG9vbHMuYW5kRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMTEgfSkpOwotCQlhc3NlcnRFcXVhbHMoMHgwMDAwLCBCaXRUb29scy5hbmRGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAxMSwgMHhGMDAwIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4MDAwMSwgQml0VG9vbHMuYW5kRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMTEsIDB4RjAwMSB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFhvckZsYWdzKCkgewotCQlhc3NlcnRFcXVhbHMoMHgwMDAxLCBCaXRUb29scy54b3JGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAwMCB9KSk7Ci0JCWFzc2VydEVxdWFscygweDAwMTAsIEJpdFRvb2xzLnhvckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4RjAxMCwgQml0VG9vbHMueG9yRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMTEsIDB4RjAwMCB9KSk7Ci0JCWFzc2VydEVxdWFscygweEZGMTEsIEJpdFRvb2xzLnhvckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExLCAweEYwMDAsIDB4MEYwMSB9KSk7Ci0JCWFzc2VydEVxdWFscygweEYwMTAsIEJpdFRvb2xzLnhvckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExLCAweEYwMDAsIDB4MEYwMSwgMHgwRjAxIH0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU9iamVjdCBhdCA9IFJlZmxlY3Rpb25Ub29scy5uZXdJbnN0YW5jZShCaXRUb29scy5jbGFzcyk7Ci0JCQlmYWlsKCJib2d1czogIiArIGF0KTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCQlpZiAoZXguZ2V0Q2F1c2UoKS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24pIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Cb29sZWFuVG9vbHNUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0Jvb2xlYW5Ub29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMzRhNzAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0Jvb2xlYW5Ub29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQm9vbGVhblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBCb29sZWFuVG9vbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRSVUUgPSBCb29sZWFuLlRSVUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9vbGVhbiBGQUxTRSA9IEJvb2xlYW4uRkFMU0U7Ci0KLQlwdWJsaWMgQm9vbGVhblRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5PVCgpIHsKLQkJYXNzZXJ0RXF1YWxzKEZBTFNFLCBCb29sZWFuVG9vbHMubm90KFRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy5ub3QoRkFMU0UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QU5EKCkgewotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLmFuZChUUlVFLCBUUlVFKSk7Ci0JCWFzc2VydEVxdWFscyhGQUxTRSwgQm9vbGVhblRvb2xzLmFuZChUUlVFLCBGQUxTRSkpOwotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy5hbmQoRkFMU0UsIFRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKEZBTFNFLCBCb29sZWFuVG9vbHMuYW5kKEZBTFNFLCBGQUxTRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPUigpIHsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy5vcihUUlVFLCBUUlVFKSk7Ci0JCWFzc2VydEVxdWFscyhUUlVFLCBCb29sZWFuVG9vbHMub3IoVFJVRSwgRkFMU0UpKTsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy5vcihGQUxTRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy5vcihGQUxTRSwgRkFMU0UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WE9SKCkgewotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy54b3IoVFJVRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLnhvcihUUlVFLCBGQUxTRSkpOwotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLnhvcihGQUxTRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy54b3IoRkFMU0UsIEZBTFNFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5BTkQoKSB7Ci0JCWFzc2VydEVxdWFscyhGQUxTRSwgQm9vbGVhblRvb2xzLm5hbmQoVFJVRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLm5hbmQoVFJVRSwgRkFMU0UpKTsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy5uYW5kKEZBTFNFLCBUUlVFKSk7Ci0JCWFzc2VydEVxdWFscyhUUlVFLCBCb29sZWFuVG9vbHMubmFuZChGQUxTRSwgRkFMU0UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tk9SKCkgewotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy5ub3IoVFJVRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy5ub3IoVFJVRSwgRkFMU0UpKTsKLQkJYXNzZXJ0RXF1YWxzKEZBTFNFLCBCb29sZWFuVG9vbHMubm9yKEZBTFNFLCBUUlVFKSk7Ci0JCWFzc2VydEVxdWFscyhUUlVFLCBCb29sZWFuVG9vbHMubm9yKEZBTFNFLCBGQUxTRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RYTk9SKCkgewotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLnhub3IoVFJVRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy54bm9yKFRSVUUsIEZBTFNFKSk7Ci0JCWFzc2VydEVxdWFscyhGQUxTRSwgQm9vbGVhblRvb2xzLnhub3IoRkFMU0UsIFRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy54bm9yKEZBTFNFLCBGQUxTRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJT2JqZWN0IGF0ID0gUmVmbGVjdGlvblRvb2xzLm5ld0luc3RhbmNlKEJvb2xlYW5Ub29scy5jbGFzcyk7Ci0JCQlmYWlsKCJib2d1czogIiArIGF0KTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCQlpZiAoZXguZ2V0Q2F1c2UoKS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24pIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc05hbWVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NsYXNzTmFtZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMDcwYjYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NsYXNzTmFtZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENsYXNzTmFtZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIENsYXNzTmFtZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0FycmF5KCkgewotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBcnJheShpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzQXJyYXkoaW50W10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzQXJyYXkoaW50W11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBcnJheShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc0FycmF5KGphdmEubGFuZy5TdHJpbmdbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNBcnJheShqYXZhLmxhbmcuU3RyaW5nW11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RWxlbWVudFR5cGVOYW1lKCkgewotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRFbGVtZW50VHlwZU5hbWUoamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRFbGVtZW50VHlwZU5hbWUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHModm9pZC5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRFbGVtZW50VHlwZU5hbWUodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0RWxlbWVudFR5cGVOYW1lKGphdmEudXRpbC5WZWN0b3JbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRFbGVtZW50VHlwZU5hbWUoaW50W10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldEVsZW1lbnRUeXBlTmFtZShqYXZhLnV0aWwuVmVjdG9yW11bXVtdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldEVsZW1lbnRUeXBlTmFtZShpbnRbXVtdW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFycmF5RGVwdGgoKSB7Ci0JCWFzc2VydEVxdWFscygwLCBDbGFzc05hbWUuZ2V0QXJyYXlEZXB0aChqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ2xhc3NOYW1lLmdldEFycmF5RGVwdGgoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ2xhc3NOYW1lLmdldEFycmF5RGVwdGgodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENsYXNzTmFtZS5nZXRBcnJheURlcHRoKGphdmEudXRpbC5WZWN0b3JbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENsYXNzTmFtZS5nZXRBcnJheURlcHRoKGludFtdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoMywgQ2xhc3NOYW1lLmdldEFycmF5RGVwdGgoamF2YS51dGlsLlZlY3RvcltdW11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENsYXNzTmFtZS5nZXRBcnJheURlcHRoKGludFtdW11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29tcG9uZW50VHlwZU5hbWUoKSB7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBDbGFzc05hbWUuZ2V0Q29tcG9uZW50VHlwZU5hbWUoamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5PYmplY3QuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0Q29tcG9uZW50VHlwZU5hbWUoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldENvbXBvbmVudFR5cGVOYW1lKGphdmEubGFuZy5PYmplY3RbXVtdLmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCBDbGFzc05hbWUuZ2V0Q29tcG9uZW50VHlwZU5hbWUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldENvbXBvbmVudFR5cGVOYW1lKGludFtdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoaW50W10uY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0Q29tcG9uZW50VHlwZU5hbWUoaW50W11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2ltcGxlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoIk9iamVjdCIsIENsYXNzTmFtZS5nZXRTaW1wbGVOYW1lKGphdmEubGFuZy5PYmplY3QuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygiT2JqZWN0W10iLCBDbGFzc05hbWUuZ2V0U2ltcGxlTmFtZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygiT2JqZWN0W11bXSIsIENsYXNzTmFtZS5nZXRTaW1wbGVOYW1lKGphdmEubGFuZy5PYmplY3RbXVtdLmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuTWFwLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUoamF2YS51dGlsLk1hcC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBDbGFzc05hbWUuZ2V0U2ltcGxlTmFtZShqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCWFzc2VydEVxdWFscygiaW50IiwgQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoImludFtdIiwgQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUoaW50W10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygiaW50W11bXSIsIENsYXNzTmFtZS5nZXRTaW1wbGVOYW1lKGludFtdW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJT2JqZWN0IGFub25PYmplY3QgPSBuZXcgT2JqZWN0KCkgewotCQkJLy8gYW5vbnltb3VzIGNsYXNzCi0JCX07Ci0JCWFzc2VydEVxdWFscygiIiwgQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUoYW5vbk9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCi0JCWNsYXNzIExvY2FsIHsKLQkJCS8vIGFub255bW91cyBjbGFzcwotCQl9Ci0JCUxvY2FsIGxvY2FsT2JqZWN0ID0gbmV3IExvY2FsKCk7Ci0JCWFzc2VydEVxdWFscygiTG9jYWwiLCBDbGFzc05hbWUuZ2V0U2ltcGxlTmFtZShsb2NhbE9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQYWNrYWdlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUoamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIENsYXNzTmFtZS5nZXRQYWNrYWdlTmFtZShqYXZhLmxhbmcuT2JqZWN0W11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLk1hcC5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUoamF2YS51dGlsLk1hcC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldFBhY2thZ2VOYW1lKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCIiLCBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIENsYXNzTmFtZS5nZXRQYWNrYWdlTmFtZShpbnRbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUoaW50W11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRFcXVhbHMoIiIsIENsYXNzTmFtZS5nZXRQYWNrYWdlTmFtZSh2b2lkLmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCU9iamVjdCBhbm9uT2JqZWN0ID0gbmV3IE9iamVjdCgpIHsKLQkJCS8vIGFub255bW91cyBjbGFzcwotCQl9OwotCQlhc3NlcnRFcXVhbHMoYW5vbk9iamVjdC5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRQYWNrYWdlTmFtZShhbm9uT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzVG9wTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNUb3BMZXZlbChqYXZhLnV0aWwuTWFwLmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVG9wTGV2ZWwoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1RvcExldmVsKENsYXNzLmZvck5hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMUxvY2FsQ2xhc3MiKS5nZXROYW1lKCkpKTsgLy8gbG9jYWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVG9wTGV2ZWwoQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIikuZ2V0TmFtZSgpKSk7IC8vIGFub255bW91cwotCi0JCU9iamVjdFtdIGFycmF5ID0gbmV3IGphdmEudXRpbC5NYXBbMF07IC8vIHRvcC1sZXZlbAotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNUb3BMZXZlbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwLkVudHJ5WzBdOyAvLyBtZW1iZXIKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVG9wTGV2ZWwoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gbG9jYWxDbGFzcyA9IENsYXNzLmZvck5hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMUxvY2FsQ2xhc3MiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGxvY2FsQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNUb3BMZXZlbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBhbm9uQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGFub25DbGFzcywgMCk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1RvcExldmVsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTWVtYmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc01lbWJlcihqYXZhLnV0aWwuTWFwLmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNNZW1iZXIoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc01lbWJlcihDbGFzcy5mb3JOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDFMb2NhbENsYXNzIikuZ2V0TmFtZSgpKSk7IC8vIGxvY2FsCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc01lbWJlcihDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKS5nZXROYW1lKCkpKTsgLy8gYW5vbnltb3VzCi0KLQkJT2JqZWN0W10gYXJyYXkgPSBuZXcgamF2YS51dGlsLk1hcFswXTsgLy8gdG9wLWxldmVsCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc01lbWJlcihhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwLkVudHJ5WzBdOyAvLyBtZW1iZXIKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTWVtYmVyKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGxvY2FsQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDFMb2NhbENsYXNzIik7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShsb2NhbENsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTWVtYmVyKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGFub25DbGFzcyA9IENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpOyAvLyBsb2NhbAotCQlhcnJheSA9IChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2UoYW5vbkNsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTWVtYmVyKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0KLQkJLy8gdGVzdCBhIGZldyBlZGdlIGNhc2VzCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJGExIikpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc01lbWJlcigiamF2YS51dGlsLk1hcCQxYWEkYWFhIikpOyAgLy8gbWVtYmVyIGluc2lkZSBsb2NhbAotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc01lbWJlcigiamF2YS51dGlsLk1hcCQxJGFhYSIpKTsgIC8vIG1lbWJlciBpbnNpZGUgYW5vbnltb3VzCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJGExJGFhYSRiYmIiKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJDFhMSRhYWEiKSk7ICAvLyBtZW1iZXIgaW5zaWRlIGxvY2FsCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc01lbWJlcigiamF2YS51dGlsLk1hcCQxYSIpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNNZW1iZXIoImphdmEudXRpbC5NYXAkYTEyMzQ1JGIxMjM0NSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJDEyMzQ1YSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJDMzMyIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTWVtYmVyKCJqYXZhLnV0aWwuTWFwMyQzMzMiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTG9jYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY2xhc3MgTG9jYWxDbGFzcyB7Ci0JCQl2b2lkIGZvbygpIHsKLQkJCQlTeXN0ZW0uZ2V0UHJvcGVydHkoImZvbyIpOwotCQkJfQotCQl9Ci0JCW5ldyBMb2NhbENsYXNzKCkuZm9vKCk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0xvY2FsKGphdmEudXRpbC5NYXAuY2xhc3MuZ2V0TmFtZSgpKSk7IC8vIHRvcC1sZXZlbAotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNMb2NhbChqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzLmdldE5hbWUoKSkpOyAvLyBtZW1iZXIKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNMb2NhbChDbGFzcy5mb3JOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDFMb2NhbENsYXNzIikuZ2V0TmFtZSgpKSk7IC8vIGxvY2FsCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0xvY2FsKENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpLmdldE5hbWUoKSkpOyAvLyBhbm9ueW1vdXMKLQotCQlPYmplY3RbXSBhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwWzBdOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTG9jYWwoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJYXJyYXkgPSBuZXcgamF2YS51dGlsLk1hcC5FbnRyeVswXTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0xvY2FsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGxvY2FsQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDFMb2NhbENsYXNzIik7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShsb2NhbENsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTG9jYWwoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gYW5vbkNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIik7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShhbm9uQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNMb2NhbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCi0JCS8vIHRlc3QgYSBmZXcgZWRnZSBjYXNlcwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNMb2NhbCgiamF2YS51dGlsLk1hcCRhMSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTG9jYWwoImphdmEudXRpbC5NYXAkYTEkYWFhJGJiYiIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTG9jYWwoImphdmEudXRpbC5NYXAkMTEkYWFhIikpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc0xvY2FsKCJqYXZhLnV0aWwuTWFwJDFhIikpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc0xvY2FsKCJqYXZhLnV0aWwuTWFwJDJhYmMiKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzTG9jYWwoImphdmEudXRpbC5NYXAkMmFiYzEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0xvY2FsKCJqYXZhLnV0aWwuTWFwJGExMjM0NSRiMTIzNDUiKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzTG9jYWwoImphdmEudXRpbC5NYXAkMTIzNDUkMTIzNGEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0xvY2FsKCJqYXZhLnV0aWwuTWFwJDMzMyIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTG9jYWwoImphdmEudXRpbC5NYXAzJDMzMyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNBbm9ueW1vdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKGphdmEudXRpbC5NYXAuY2xhc3MuZ2V0TmFtZSgpKSk7IC8vIHRvcC1sZXZlbAotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0Fub255bW91cyhDbGFzcy5mb3JOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDFMb2NhbENsYXNzIikuZ2V0TmFtZSgpKSk7IC8vIGxvY2FsCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpLmdldE5hbWUoKSkpOyAvLyBhbm9ueW1vdXMKLQotCQlPYmplY3RbXSBhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwWzBdOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCWFycmF5ID0gbmV3IGphdmEudXRpbC5NYXAuRW50cnlbMF07IC8vIG1lbWJlcgotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gbG9jYWxDbGFzcyA9IENsYXNzLmZvck5hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMUxvY2FsQ2xhc3MiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGxvY2FsQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gYW5vbkNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIik7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShhbm9uQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQotCQkvLyB0ZXN0IGEgZmV3IGVkZ2UgY2FzZXMKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJGExIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoImphdmEudXRpbC5NYXAkYTEkYWFhJGJiYiIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJDFhMSRhYWEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0Fub255bW91cygiamF2YS51dGlsLk1hcCQxJGEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0Fub255bW91cygiamF2YS51dGlsLk1hcCQxYSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJGExMjM0NSRiMTIzNDUiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0Fub255bW91cygiamF2YS51dGlsLk1hcCQxMjM0NSRhMTIzNCIpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoImphdmEudXRpbC5NYXAkMzMzIikpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc0Fub255bW91cygiamF2YS51dGlsLk1hcDMkMzMzIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1JlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNSZWZlcmVuY2UoaW50LmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1JlZmVyZW5jZShqYXZhLnV0aWwuTWFwLmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNSZWZlcmVuY2UoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzUmVmZXJlbmNlKENsYXNzLmZvck5hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMUxvY2FsQ2xhc3MiKS5nZXROYW1lKCkpKTsgLy8gbG9jYWwKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNSZWZlcmVuY2UoQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIikuZ2V0TmFtZSgpKSk7IC8vIGFub255bW91cwotCi0JCU9iamVjdFtdIGFycmF5ID0gbmV3IGphdmEudXRpbC5NYXBbMF07IC8vIHRvcC1sZXZlbAotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1JlZmVyZW5jZShhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwLkVudHJ5WzBdOyAvLyBtZW1iZXIKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNSZWZlcmVuY2UoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gbG9jYWxDbGFzcyA9IENsYXNzLmZvck5hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMUxvY2FsQ2xhc3MiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGxvY2FsQ2xhc3MsIDApOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1JlZmVyZW5jZShhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBhbm9uQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGFub25DbGFzcywgMCk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzUmVmZXJlbmNlKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzUHJpbWl0aXZlKCkgewotCQlhc3NlcnRUcnVlKHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNQcmltaXRpdmUodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNQcmltaXRpdmUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1ByaW1pdGl2ZShmbG9hdC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNQcmltaXRpdmUoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNQcmltaXRpdmUoamF2YS5sYW5nLk51bWJlci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzUHJpbWl0aXZlKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ByaW1pdGl2ZShqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzUHJpbWl0aXZlKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1ByaW1pdGl2ZVdyYXBwZXIoKSB7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ByaW1pdGl2ZVdyYXBwZXIodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzUHJpbWl0aXZlV3JhcHBlcihpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ByaW1pdGl2ZVdyYXBwZXIoZmxvYXQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ByaW1pdGl2ZVdyYXBwZXIoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1ZhcmlhYmxlUHJpbWl0aXZlKCkgewotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZSh2b2lkLmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlKGZsb2F0LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlKGJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmUoamF2YS5sYW5nLk51bWJlci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmUoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmUoamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKCkgewotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLlZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLkludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5GbG9hdC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5OdW1iZXIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0V3JhcHBlckNsYXNzTmFtZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5Wb2lkLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldFdyYXBwZXJDbGFzc05hbWUodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldFdyYXBwZXJDbGFzc05hbWUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLkZsb2F0LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldFdyYXBwZXJDbGFzc05hbWUoZmxvYXQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRXcmFwcGVyQ2xhc3NOYW1lKGJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0TnVsbChDbGFzc05hbWUuZ2V0V3JhcHBlckNsYXNzTmFtZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcmltaXRpdmVDbGFzc05hbWUoKSB7Ci0JCWFzc2VydEVxdWFscyh2b2lkLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldFByaW1pdGl2ZUNsYXNzTmFtZShqYXZhLmxhbmcuVm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRQcmltaXRpdmVDbGFzc05hbWUoamF2YS5sYW5nLkludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhmbG9hdC5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRQcmltaXRpdmVDbGFzc05hbWUoamF2YS5sYW5nLkZsb2F0LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRQcmltaXRpdmVDbGFzc05hbWUoamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0TnVsbChDbGFzc05hbWUuZ2V0UHJpbWl0aXZlQ2xhc3NOYW1lKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBcmVBdXRvYm94RXF1aXZhbGVudHMoKSB7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmFyZUF1dG9ib3hFcXVpdmFsZW50cyhJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSwgSW50ZWdlci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuYXJlQXV0b2JveEVxdWl2YWxlbnRzKGludC5jbGFzcy5nZXROYW1lKCksIEludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmFyZUF1dG9ib3hFcXVpdmFsZW50cyhJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSwgaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuYXJlQXV0b2JveEVxdWl2YWxlbnRzKGludC5jbGFzcy5nZXROYW1lKCksIEJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmFyZUF1dG9ib3hFcXVpdmFsZW50cyhTdHJpbmcuY2xhc3MuZ2V0TmFtZSgpLCBTdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RGb3JDb2RlKCkgewotCQlhc3NlcnRFcXVhbHMoImJ5dGUiLCBDbGFzc05hbWUuZm9yQ29kZSgnQicpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaGFyIiwgQ2xhc3NOYW1lLmZvckNvZGUoJ0MnKSk7Ci0JCWFzc2VydEVxdWFscygiZG91YmxlIiwgQ2xhc3NOYW1lLmZvckNvZGUoJ0QnKSk7Ci0JCWFzc2VydEVxdWFscygiZmxvYXQiLCBDbGFzc05hbWUuZm9yQ29kZSgnRicpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBDbGFzc05hbWUuZm9yQ29kZSgnSScpKTsKLQkJYXNzZXJ0RXF1YWxzKCJsb25nIiwgQ2xhc3NOYW1lLmZvckNvZGUoJ0onKSk7Ci0JCWFzc2VydEVxdWFscygic2hvcnQiLCBDbGFzc05hbWUuZm9yQ29kZSgnUycpKTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgQ2xhc3NOYW1lLmZvckNvZGUoJ1onKSk7Ci0JCWFzc2VydEVxdWFscygidm9pZCIsIENsYXNzTmFtZS5mb3JDb2RlKCdWJykpOwotCi0JCWFzc2VydE51bGwoQ2xhc3NOYW1lLmZvckNvZGUoJ1gnKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJieXRlIiwgQ2xhc3NOYW1lLmZvckNvZGUoKGludCkgJ0InKSk7Ci0JCWFzc2VydEVxdWFscygiY2hhciIsIENsYXNzTmFtZS5mb3JDb2RlKChpbnQpICdDJykpOwotCQlhc3NlcnRFcXVhbHMoImRvdWJsZSIsIENsYXNzTmFtZS5mb3JDb2RlKChpbnQpICdEJykpOwotCQlhc3NlcnRFcXVhbHMoImZsb2F0IiwgQ2xhc3NOYW1lLmZvckNvZGUoKGludCkgJ0YnKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgQ2xhc3NOYW1lLmZvckNvZGUoKGludCkgJ0knKSk7Ci0JCWFzc2VydEVxdWFscygibG9uZyIsIENsYXNzTmFtZS5mb3JDb2RlKChpbnQpICdKJykpOwotCQlhc3NlcnRFcXVhbHMoInNob3J0IiwgQ2xhc3NOYW1lLmZvckNvZGUoKGludCkgJ1MnKSk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIENsYXNzTmFtZS5mb3JDb2RlKChpbnQpICdaJykpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBDbGFzc05hbWUuZm9yQ29kZSgoaW50KSAnVicpKTsKLQotCQlhc3NlcnROdWxsKENsYXNzTmFtZS5mb3JDb2RlKChpbnQpICdYJykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2RlRm9yQ2xhc3NOYW1lKCkgewotCQlhc3NlcnRFcXVhbHMoJ0knLCBDbGFzc05hbWUuZ2V0Q29kZUZvckNsYXNzTmFtZShpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygnSScsIENsYXNzTmFtZS5nZXRDb2RlRm9yQ2xhc3NOYW1lKCJpbnQiKSk7Ci0JCWFzc2VydEVxdWFscygnQicsIENsYXNzTmFtZS5nZXRDb2RlRm9yQ2xhc3NOYW1lKGJ5dGUuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygnQicsIENsYXNzTmFtZS5nZXRDb2RlRm9yQ2xhc3NOYW1lKCJieXRlIikpOwotCi0JCWFzc2VydEVxdWFscygoY2hhcikgMCwgQ2xhc3NOYW1lLmdldENvZGVGb3JDbGFzc05hbWUoamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU9iamVjdCBhdCA9IFJlZmxlY3Rpb25Ub29scy5uZXdJbnN0YW5jZShDbGFzc05hbWUuY2xhc3MpOwotCQkJZmFpbCgiYm9ndXM6ICIgKyBhdCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQkJaWYgKGV4LmdldENhdXNlKCkuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ2xhc3NwYXRoVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc3BhdGhUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTQyNjYyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc3BhdGhUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNsYXNzcGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfSE9NRSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIik7Ci0KLQlwdWJsaWMgQ2xhc3NwYXRoVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXByZXNzZWQoKSB7Ci0JCVN0cmluZyBwYXRoID0gIiI7Ci0KLQkJLy8gbm8gY2hhbmdlcwotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLmdldFBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpLCBwYXRoKTsKLQotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5nZXRQYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5nZXRQYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpKS5jb21wcmVzc2VkKCkuZ2V0UGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLmdldFBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpLCBwYXRoKTsKLQotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xccnQuamFyOzs7O0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXHJ0Lmphcjs7OyIpKS5jb21wcmVzc2VkKCkuZ2V0UGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCS8vIG5vIGNoYW5nZXMKLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5nZXRQYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpKS5jb21wcmVzc2VkKCkuZ2V0UGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFwuLlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphciIpKS5jb21wcmVzc2VkKCkuZ2V0UGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGsxXFxqZGsyXFxqZGszXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpkazFcXGpkazJcXGpkazNcXC4uXFwuLlxcLi5cXGpkazFcXGpkazJcXGpkazNcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5nZXRQYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrMVxcamRrMlxcamRrM1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0NsYXNzTmFtZSgpIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gImphdmEvbGFuZy9TdHJpbmcuY2xhc3MiOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBDbGFzc3BhdGguY29udmVydFRvQ2xhc3NOYW1lKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCksIGNsYXNzTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0NsYXNzKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZU5hbWUgPSAiamF2YS9sYW5nL1N0cmluZy5jbGFzcyI7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJQ2xhc3M8Pz4gamF2YUNsYXNzID0gQ2xhc3NwYXRoLmNvbnZlcnRUb0NsYXNzKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YUNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZSgpIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gQ2xhc3NwYXRoLmNvbnZlcnRUb0FyY2hpdmVDbGFzc0ZpbGVFbnRyeU5hbWUoamF2YS5sYW5nLlN0cmluZy5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS9sYW5nL1N0cmluZy5jbGFzcyIsIGZpbGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvQXJjaGl2ZUVudHJ5TmFtZUJhc2UoKSB7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IENsYXNzcGF0aC5jb252ZXJ0VG9BcmNoaXZlRW50cnlOYW1lQmFzZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhL2xhbmcvU3RyaW5nIiwgZmlsZU5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKCkgewotCQljaGFyIHNjID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBDbGFzc3BhdGguY29udmVydFRvQ2xhc3NGaWxlTmFtZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhIiArIHNjICsgImxhbmciICsgc2MgKyAiU3RyaW5nLmNsYXNzIiwgZmlsZU5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9DbGFzc0ZpbGVTdHJpbmcoKSB7Ci0JCWNoYXIgc2MgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCUZpbGUgZmlsZSA9IENsYXNzcGF0aC5jb252ZXJ0VG9DbGFzc0ZpbGUoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEiICsgc2MgKyAibGFuZyIgKyBzYyArICJTdHJpbmcuY2xhc3MiLCBmaWxlLmdldFBhdGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0NsYXNzRmlsZUNsYXNzKCkgewotCQljaGFyIHNjID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlGaWxlIGZpbGUgPSBDbGFzc3BhdGguY29udmVydFRvQ2xhc3NGaWxlKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEiICsgc2MgKyAibGFuZyIgKyBzYyArICJTdHJpbmcuY2xhc3MiLCBmaWxlLmdldFBhdGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0phdmFGaWxlTmFtZSgpIHsKLQkJY2hhciBzYyA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJU3RyaW5nIGZpbGVOYW1lID0gQ2xhc3NwYXRoLmNvbnZlcnRUb0phdmFGaWxlTmFtZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhIiArIHNjICsgImxhbmciICsgc2MgKyAiU3RyaW5nLmphdmEiLCBmaWxlTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0phdmFGaWxlU3RyaW5nKCkgewotCQljaGFyIHNjID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlGaWxlIGZpbGUgPSBDbGFzc3BhdGguY29udmVydFRvSmF2YUZpbGUoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEiICsgc2MgKyAibGFuZyIgKyBzYyArICJTdHJpbmcuamF2YSIsIGZpbGUuZ2V0UGF0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvSmF2YUZpbGVDbGFzcygpIHsKLQkJY2hhciBzYyA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJRmlsZSBmaWxlID0gQ2xhc3NwYXRoLmNvbnZlcnRUb0phdmFGaWxlKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEiICsgc2MgKyAibGFuZyIgKyBzYyArICJTdHJpbmcuamF2YSIsIGZpbGUuZ2V0UGF0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvRmlsZU5hbWVCYXNlKCkgewotCQljaGFyIHNjID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBDbGFzc3BhdGguY29udmVydFRvRmlsZU5hbWVCYXNlKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEiICsgc2MgKyAibGFuZyIgKyBzYyArICJTdHJpbmciLCBmaWxlTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VSTHMoKSB7Ci0JCUl0ZXJhdG9yPFVSTD4gZW50cmllcyA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5nZXRVUkxzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGhVUkwoIi9DOi9qZGsvcnQuamFyIiksIGVudHJpZXMubmV4dCgpLmdldFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoVVJMKCIvQzovamRrL2kxOG4uamFyIiksIGVudHJpZXMubmV4dCgpLmdldFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoVVJMKCIvQzovamRrL2phd3MuamFyIiksIGVudHJpZXMubmV4dCgpLmdldFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoVVJMKCIvQzovZm9vL2NsYXNzZXMiKSwgZW50cmllcy5uZXh0KCkuZ2V0UGF0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGhVUkwoIi9DOi9iYXIvYmFyLmphciIpLCBlbnRyaWVzLm5leHQoKS5nZXRQYXRoKCkpOwotCQlhc3NlcnRGYWxzZShlbnRyaWVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEVudHJpZXMoKSB7Ci0JCUNsYXNzcGF0aCBjcCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyOzsuO0M6XFxqZGtcXGkxOG4uamFyOzs7QzpcXGpka1xcamF3cy5qYXI7O0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphcjtDOlxcYmFyXFxiYXIuamFyOyIpKTsKLQkJSXRlcmF0b3I8Q2xhc3NwYXRoLkVudHJ5PiBlbnRyaWVzID0gY3AuZ2V0RW50cmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCIuIiksIGVudHJpZXMubmV4dCgpLmdldEZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXIiKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxqYXdzLmphciIpLCBlbnRyaWVzLm5leHQoKS5nZXRGaWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxmb29cXGNsYXNzZXMiKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcYmFyXFxiYXIuamFyIiksIGVudHJpZXMubmV4dCgpLmdldEZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGJhclxcYmFyLmphciIpLCBlbnRyaWVzLm5leHQoKS5nZXRGaWxlTmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZW50cmllcy5oYXNOZXh0KCkpOwotCi0JCWNwID0gY3AuY29tcHJlc3NlZCgpOwotCQllbnRyaWVzID0gY3AuZ2V0RW50cmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCIuIiksIGVudHJpZXMubmV4dCgpLmdldEZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXIiKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxqYXdzLmphciIpLCBlbnRyaWVzLm5leHQoKS5nZXRGaWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxmb29cXGNsYXNzZXMiKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcYmFyXFxiYXIuamFyIiksIGVudHJpZXMubmV4dCgpLmdldEZpbGVOYW1lKCkpOwotCQlhc3NlcnRGYWxzZShlbnRyaWVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEVudHJ5Rm9yRmlsZU5hbWVkKCkgewotCQlDbGFzc3BhdGguRW50cnkgZW50cnkgPSBudWxsOwotCi0JCS8vIGluIHRoZSBtaWRkbGUgLSBxdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXIiKSkuZ2V0RW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIiksIGVudHJ5LmdldEZpbGVOYW1lKCkpOwotCi0JCS8vIGluIHRoZSBtaWRkbGUgLSB1bnF1YWxpZmllZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7cnQuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5nZXRFbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscygicnQuamFyIiwgZW50cnkuZ2V0RmlsZU5hbWUoKSk7Ci0KLQkJLy8gYXQgdGhlIGJlZ2lubmluZyAtIHF1YWxpZmllZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5nZXRFbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cnkuZ2V0RmlsZU5hbWUoKSk7Ci0KLQkJLy8gYXQgdGhlIGJlZ2lubmluZyAtIHVucXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJydC5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyIikpLmdldEVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJydC5qYXIiLCBlbnRyeS5nZXRGaWxlTmFtZSgpKTsKLQotCQkvLyBhdCB0aGUgZW5kIC0gcXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXI7QzpcXGpka1xccnQuamFyIikpLmdldEVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyeS5nZXRGaWxlTmFtZSgpKTsKLQotCQkvLyBhdCB0aGUgZW5kIC0gdW5xdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphcjtydC5qYXIiKSkuZ2V0RW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHMoInJ0LmphciIsIGVudHJ5LmdldEZpbGVOYW1lKCkpOwotCi0JCS8vIGFsb25lIC0gcXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSkuZ2V0RW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIiksIGVudHJ5LmdldEZpbGVOYW1lKCkpOwotCi0JCS8vIGFsb25lIC0gdW5xdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKCJydC5qYXIiKS5nZXRFbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscygicnQuamFyIiwgZW50cnkuZ2V0RmlsZU5hbWUoKSk7Ci0KLQkJLy8gdHJpY2sgZW50cnkgYXQgdGhlIGJlZ2lubmluZwotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgicnQuamFyLm5ldztDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyIikpLmdldEVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyeS5nZXRGaWxlTmFtZSgpKTsKLQotCQkvLyB0cmljayBlbnRyeSBpbiB0aGUgbWlkZGxlCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJydC5qYXIubmV3O0M6XFxqZGtcXHJ0cnRydC5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5nZXRFbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cnkuZ2V0RmlsZU5hbWUoKSk7Ci0KLQkJLy8gdHJpY2sgZW50cnkgYXQgdGhlIGVuZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgicnQuamFyLm5ldztDOlxcamRrXFxydHJ0cnQuamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXI7QzpcXGpka1xccnRydHJ0LmphciIpKS5nZXRFbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cnkuZ2V0RmlsZU5hbWUoKSk7Ci0KLQkJLy8gbWlzc2luZwotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgicnQuamFyLm5ldztDOlxcamRrXFxydHJ0cnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphcjtDOlxcamRrXFxydHJ0cnQuamFyIikpLmdldEVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJwYXRoIGVudHJ5IHNob3VsZCBub3QgYmUgZm91bmQiLCBudWxsLCBlbnRyeSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RW50cnlGb3JDbGFzc05hbWVkKCkgewotCQlhc3NlcnROb3ROdWxsKENsYXNzcGF0aC5jb21wbGV0ZUNsYXNzcGF0aCgpLmdldEVudHJ5Rm9yQ2xhc3NOYW1lZChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnROdWxsKENsYXNzcGF0aC5jb21wbGV0ZUNsYXNzcGF0aCgpLmdldEVudHJ5Rm9yQ2xhc3NOYW1lZCgiZm9vLmJhci5CYXoiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExvY2F0aW9uRm9yQ2xhc3MoKSB7Ci0JCUNsYXNzPD8+IGphdmFDbGFzcyA9IENsYXNzcGF0aC5jbGFzczsKLQkJRmlsZSBlbnRyeSA9IG5ldyBGaWxlKENsYXNzcGF0aC5sb2NhdGlvbkZvcihqYXZhQ2xhc3MpKTsKLQkJaWYgKGVudHJ5LmlzRmlsZSgpIHx8IGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCWFzc2VydFRydWUoZW50cnkuZXhpc3RzKCkpOwotCQl9Ci0JCWlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlhc3NlcnRUcnVlKG5ldyBGaWxlKGVudHJ5LCBDbGFzc3BhdGguY29udmVydFRvQ2xhc3NGaWxlTmFtZShqYXZhQ2xhc3MpKS5leGlzdHMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UnRKYXJOYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBydEZpbGUgPSBuZXcgRmlsZShDbGFzc3BhdGgucnRKYXJOYW1lKCkpOwotCQlhc3NlcnRUcnVlKCJydC5qYXIgZG9lcyBub3QgZXhpc3QiLCBydEZpbGUuZXhpc3RzKCkpOwotCi0JCUphckZpbGUgcnRKYXJGaWxlID0gbmV3IEphckZpbGUocnRGaWxlKTsKLQkJSmFyRW50cnkgZW50cnkgPSBydEphckZpbGUuZ2V0SmFyRW50cnkoImphdmEvbGFuZy9PYmplY3QuY2xhc3MiKTsKLQkJcnRKYXJGaWxlLmNsb3NlKCk7Ci0JCWFzc2VydFRydWUoImJvZ3VzIHJ0LmphciIsIGVudHJ5ICE9IG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKUkVDbGFzc05hbWVzKCkgewotCQlhc3NlcnRUcnVlKCJWZWN0b3IgaXMgbWlzc2luZyBmcm9tIEpSRSBjbGFzcyBuYW1lcyIsIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhDbGFzc3BhdGguYm9vdENsYXNzcGF0aCgpLmdldENsYXNzTmFtZXMoKSwgamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZSgiRmlsZSBpcyBtaXNzaW5nIGZyb20gSlJFIGNsYXNzIG5hbWVzIiwgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuZ2V0Q2xhc3NOYW1lcygpLCBqYXZhLmlvLkZpbGUuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFFeHRlbnNpb25EaXJlY3RvcnlOYW1lcygpIHsKLQkJY2hhciBzZXAgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCVN0cmluZyBzdGRFeHREaXJOYW1lID0gSkFWQV9IT01FICsgc2VwICsgImxpYiIgKyBzZXAgKyAiZXh0IjsKLQkJYXNzZXJ0VHJ1ZSgic3RhbmRhcmQgZXh0ZW5zaW9uIGRpciBuYW1lIG1pc3Npbmc6ICIgKyBzdGRFeHREaXJOYW1lLCBBcnJheVRvb2xzLmNvbnRhaW5zKENsYXNzcGF0aC5qYXZhRXh0ZW5zaW9uRGlyZWN0b3J5TmFtZXMoKSwgc3RkRXh0RGlyTmFtZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhRXh0ZW5zaW9uRGlyZWN0b3JpZXMoKSB7Ci0JCWNoYXIgc2VwID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlGaWxlIHN0ZEV4dERpciA9IG5ldyBGaWxlKEpBVkFfSE9NRSArIHNlcCArICJsaWIiICsgc2VwICsgImV4dCIpOwotCQlhc3NlcnRUcnVlKCJzdGFuZGFyZCBleHRlbnNpb24gZGlyIG1pc3Npbmc6ICIgKyBzdGRFeHREaXIuZ2V0UGFyZW50KCksIEFycmF5VG9vbHMuY29udGFpbnMoQ2xhc3NwYXRoLmphdmFFeHRlbnNpb25EaXJlY3RvcmllcygpLCBzdGRFeHREaXIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUV4dGVuc2lvbkNsYXNzcGF0aEVudHJpZXMoKSB7Ci0JCWNoYXIgc2VwID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlTdHJpbmcgamRrID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iKTsKLQkJaWYgKGpkay5zdGFydHNXaXRoKCIxLjQiKSB8fCBqZGsuc3RhcnRzV2l0aCgiMS41IikgfHwgamRrLnN0YXJ0c1dpdGgoIjEuNiIpKSB7Ci0JCQlDb2xsZWN0aW9uPFN0cmluZz4gamFyTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCUl0ZXJhYmxlPENsYXNzcGF0aC5FbnRyeT4gZW50cmllcyA9IENsYXNzcGF0aC5qYXZhRXh0ZW5zaW9uQ2xhc3NwYXRoKCkuZ2V0RW50cmllcygpOwotCQkJZm9yIChDbGFzc3BhdGguRW50cnkgZW50cnkgOiBlbnRyaWVzKSB7Ci0JCQkJamFyTmFtZXMuYWRkKGVudHJ5LmdldEZpbGVOYW1lKCkpOwotCQkJfQotCQkJU3RyaW5nIHN0ZEV4dEphck5hbWUgPSBKQVZBX0hPTUUgKyBzZXAgKyAibGliIiArIHNlcCArICJleHQiICsgc2VwICsgImRuc25zLmphciI7Ci0JCQlTdHJpbmcgbXNnID0gImpkayAxLjQueCBzdGFuZGFyZCBleHRlbnNpb24gamFyIG1pc3Npbmc6ICIgKyBzdGRFeHRKYXJOYW1lOwotCQkJYm9vbGVhbiBqYXJQcmVzZW50ID0gamFyTmFtZXMuY29udGFpbnMoc3RkRXh0SmFyTmFtZSk7Ci0JCQlpZiAoVG9vbHMuanZtSXNTdW4oKSB8fCAoVG9vbHMuanZtSXNJQk0oKSAmJiBqZGsuc3RhcnRzV2l0aCgiMS42IikpKSB7Ci0JCQkJYXNzZXJ0VHJ1ZShtc2csIGphclByZXNlbnQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJZmFpbCgid2UgbmVlZCB0byB1cGRhdGUgdGhpcyB0ZXN0IGZvciB0aGUgY3VycmVudCBqZGsiKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhRXh0ZW5zaW9uQ2xhc3NOYW1lcygpIHsKLQkJU3RyaW5nIGpkayA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIik7Ci0JCWlmIChqZGsuc3RhcnRzV2l0aCgiMS40IikgfHwgamRrLnN0YXJ0c1dpdGgoIjEuNSIpIHx8IGpkay5zdGFydHNXaXRoKCIxLjYiKSkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9ICJzdW4ubmV0LnNwaS5uYW1lc2VydmljZS5kbnMuRE5TTmFtZVNlcnZpY2UiOwotCQkJU3RyaW5nIG1zZyA9ICJqZGsgMS40Lnggc3RhbmRhcmQgZXh0ZW5zaW9uIGNsYXNzIG1pc3Npbmc6ICIgKyBjbGFzc05hbWU7Ci0JCQlib29sZWFuIGNsYXNzUHJlc2VudCA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyhDbGFzc3BhdGguamF2YUV4dGVuc2lvbkNsYXNzcGF0aCgpLmNsYXNzTmFtZXMoKSwgY2xhc3NOYW1lKTsKLQkJCWlmIChUb29scy5qdm1Jc1N1bigpIHx8IChUb29scy5qdm1Jc0lCTSgpICYmIGpkay5zdGFydHNXaXRoKCIxLjYiKSkpIHsKLQkJCQlhc3NlcnRUcnVlKG1zZywgY2xhc3NQcmVzZW50KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZhaWwoIndlIG5lZWQgdG8gdXBkYXRlIHRoaXMgdGVzdCBmb3IgdGhlIGN1cnJlbnQgamRrIik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUNsYXNzcGF0aENsYXNzTmFtZXMoKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlDbGFzc0xvYWRlciBjbCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotCQkvLyBtYWtlIHN1cmUgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgdGhlICJub3JtYWwiIGNsYXNzIGxvYWRlcjsKLQkJLy8gd2hlbiB0aGUgdGVzdHMgYXJlIGV4ZWN1dGVkIGFzIGFuIEFOVCB0YXNrLCB0aGV5IGFyZSBydW4gdW5kZXIKLQkJLy8gYW4gQU5UIGNsYXNzIGxvYWRlciBhbmQgdGhlICJKYXZhIiBjbGFzc3BhdGggZG9lcyBub3QgaW5jbHVkZSB0aGlzIGNsYXNzCi0JCWlmIChjbC5nZXRDbGFzcygpLmdldE5hbWUoKS5zdGFydHNXaXRoKCJzdW4ubWlzYyIpKSB7Ci0JCQlhc3NlcnRUcnVlKCJjbGFzcyBtaXNzaW5nOiAiICsgY2xhc3NOYW1lLCBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoQ2xhc3NwYXRoLmphdmFDbGFzc3BhdGgoKS5nZXRDbGFzc05hbWVzKCksIGNsYXNzTmFtZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBsZXRlQ2xhc3NwYXRoQ2xhc3NOYW1lcygpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCUNsYXNzTG9hZGVyIGNsID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0JCS8vIG1ha2Ugc3VyZSB3ZSBhcmUgcnVubmluZyB1bmRlciB0aGUgIm5vcm1hbCIgY2xhc3MgbG9hZGVyOwotCQkvLyB3aGVuIHRoZSB0ZXN0cyBhcmUgZXhlY3V0ZWQgYXMgYW4gQU5UIHRhc2ssIHRoZXkgYXJlIHJ1biB1bmRlcgotCQkvLyBhbiBBTlQgY2xhc3MgbG9hZGVyIGFuZCB0aGUgIkphdmEiIGNsYXNzcGF0aCBkb2VzIG5vdCBpbmNsdWRlIHRoaXMgY2xhc3MKLQkJaWYgKGNsLmdldENsYXNzKCkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInN1bi5taXNjIikpIHsKLQkJCWFzc2VydFRydWUoImNsYXNzIG1pc3Npbmc6ICIgKyBjbGFzc05hbWUsIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhDbGFzc3BhdGguY29tcGxldGVDbGFzc3BhdGgoKS5nZXRDbGFzc05hbWVzKCksIGNsYXNzTmFtZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aEZvckNsYXNzKCkgewotCQlhc3NlcnROb3ROdWxsKENsYXNzcGF0aC5jbGFzc3BhdGhGb3IoamF2YS5sYW5nLlN0cmluZy5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDbGFzc05hbWVzVG8oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDEwMDApOwotCQlDbGFzc3BhdGguYm9vdENsYXNzcGF0aCgpLmFkZENsYXNzTmFtZXNUbyhjbGFzc05hbWVzKTsKLQkJYXNzZXJ0VHJ1ZShjbGFzc05hbWVzLmNvbnRhaW5zKGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVudHJ5X2dldENhbm9uaWNhbEZpbGUoKSB7Ci0JCUNsYXNzcGF0aC5FbnRyeSBlbnRyeSA9IENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuZ2V0RW50cnlGb3JDbGFzc05hbWVkKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRyeS5nZXRDYW5vbmljYWxGaWxlKCkuZ2V0UGF0aCgpLmVuZHNXaXRoKCIuamFyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbnRyeV9nZXRDYW5vbmljYWxGaWxlTmFtZSgpIHsKLQkJQ2xhc3NwYXRoLkVudHJ5IGVudHJ5ID0gQ2xhc3NwYXRoLmJvb3RDbGFzc3BhdGgoKS5nZXRFbnRyeUZvckNsYXNzTmFtZWQoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpOwotCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldENhbm9uaWNhbEZpbGVOYW1lKCk7Ci0JCWlmIChUb29scy5qdm1Jc1N1bigpKSB7Ci0JCQlhc3NlcnRUcnVlKG5hbWUuZW5kc1dpdGgoInJ0LmphciIpKTsKLQkJfSBlbHNlIGlmIChUb29scy5qdm1Jc0lCTSgpKSB7Ci0JCQlhc3NlcnRUcnVlKG5hbWUuZW5kc1dpdGgoInZtLmphciIpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbnRyeV9lcXVhbHMoKSB7Ci0JCUNsYXNzcGF0aC5FbnRyeSBlbnRyeSA9IENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuZ2V0RW50cnlGb3JDbGFzc05hbWVkKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZW50cnkuZXF1YWxzKCJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVudHJ5X2NvbnRhaW5zQ2xhc3MoKSB7Ci0JCUNsYXNzcGF0aC5FbnRyeSBlbnRyeSA9IENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuZ2V0RW50cnlGb3JDbGFzc05hbWVkKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRyeS5jb250YWlucyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVudHJ5X2NvbnRhaW5zU3RyaW5nKCkgewotCQlDbGFzc3BhdGguRW50cnkgZW50cnkgPSBDbGFzc3BhdGguYm9vdENsYXNzcGF0aCgpLmdldEVudHJ5Rm9yQ2xhc3NOYW1lZChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoZW50cnkuY29udGFpbnMoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW50cnlfZ2V0Q2xhc3NOYW1lcygpIHsKLQkJQ2xhc3NwYXRoLkVudHJ5IGVudHJ5ID0gQ2xhc3NwYXRoLmJvb3RDbGFzc3BhdGgoKS5nZXRFbnRyeUZvckNsYXNzTmFtZWQoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhlbnRyeS5nZXRDbGFzc05hbWVzKCksIGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVudHJ5X2NsYXNzTmFtZXMoKSB7Ci0JCUNsYXNzcGF0aC5FbnRyeSBlbnRyeSA9IENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuZ2V0RW50cnlGb3JDbGFzc05hbWVkKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoZW50cnkuY2xhc3NOYW1lcygpLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCX0KLQotCS8qKgotCSAqIG1vcnBoIHRoZSBzcGVjaWZpZWQgcGF0aCB0byBhIHBsYXRmb3JtLWluZGVwZW5kZW50IHBhdGgKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBtb3JwaChTdHJpbmcgcGF0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gcGF0aDsKLQkJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoJ1xcJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoJzsnLCBGaWxlLnBhdGhTZXBhcmF0b3JDaGFyKTsKLQkJaWYgKCFBcnJheVRvb2xzLmNvbnRhaW5zKEZpbGUubGlzdFJvb3RzKCksIG5ldyBGaWxlKCJDOlxcIikpKSB7Ci0JCQlyZXN1bHQgPSByZXN1bHQucmVwbGFjZUFsbCgiQzoiLCAiIik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBtb3JwaCB0aGUgc3BlY2lmaWVkIFVSTCB0byBhIHBsYXRmb3JtLWluZGVwZW5kZW50IHBhdGgKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBtb3JwaFVSTChTdHJpbmcgdXJsKSB7Ci0JCVN0cmluZyByZXN1bHQgPSB1cmw7Ci0JCWlmICghQXJyYXlUb29scy5jb250YWlucyhGaWxlLmxpc3RSb290cygpLCBuZXcgRmlsZSgiQzpcXCIpKSkgewotCQkJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2VBbGwoIi9DOiIsICIiKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbGxlY3Rpb25Ub29sc1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiMDIyMC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZXZlcnNlQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuZW51bWVyYXRpb25zLkVtcHR5RW51bWVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbGxlY3Rpb25Ub29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIENvbGxlY3Rpb25Ub29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGQgYWxsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmFibGVfU3RyaW5nTW9kaWZpZWQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIGl0ZXJhYmxlMi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYWJsZV9TdHJpbmdVbm1vZGlmaWVkKCkgewotCQlTZXQ8U3RyaW5nPiBzZXQxID0gdGhpcy5idWlsZFN0cmluZ1NldDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzZXQxCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0MSwgaXRlcmFibGUzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYWJsZV9PYmplY3RNb2RpZmllZCgpIHsKLQkJTGlzdDxPYmplY3Q+IGxpc3QxID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0MSwgaXRlcmFibGUyKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKChMaXN0PFN0cmluZz4pIGl0ZXJhYmxlMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmFibGVfT2JqZWN0VW5tb2RpZmllZCgpIHsKLQkJU2V0PE9iamVjdD4gc2V0MSA9IHRoaXMuYnVpbGRPYmplY3RTZXQxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUzID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7IC8vIHNhbWUgZWxlbWVudHMgYXMgc2V0MQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldDEsIGl0ZXJhYmxlMykpOwotCQlhc3NlcnRFcXVhbHMoMywgc2V0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHNldDEuY29udGFpbnNBbGwoKExpc3Q8U3RyaW5nPikgaXRlcmFibGUzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYWJsZV9FbXB0eUl0ZXJhYmxlKCkgewotCQlTZXQ8T2JqZWN0PiBzZXQxID0gdGhpcy5idWlsZE9iamVjdFNldDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQxLCBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhYmxlSW50X01vZGlmaWVkKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gbGlzdDI7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0MSwgaXRlcmFibGUyLCBsaXN0Mi5zaXplKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdDEuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhYmxlSW50X1VubW9kaWZpZWQoKSB7Ci0JCVNldDxTdHJpbmc+IHNldDEgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzZXQxCi0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUzID0gbGlzdDE7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0MSwgaXRlcmFibGUzLCBsaXN0MS5zaXplKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvcl9TdHJpbmdNb2RpZmllZCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdDEuY29udGFpbnNBbGwobGlzdDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX1N0cmluZ1VubW9kaWZpZWQoKSB7Ci0JCVNldDxTdHJpbmc+IHNldDEgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzMQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldDEsIGxpc3QzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKGxpc3QzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvcl9PYmplY3RNb2RpZmllZCgpIHsKLQkJTGlzdDxPYmplY3Q+IGxpc3QxID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdDEuY29udGFpbnNBbGwobGlzdDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX09iamVjdFVubW9kaWZpZWQoKSB7Ci0JCVNldDxPYmplY3Q+IHNldDEgPSB0aGlzLmJ1aWxkT2JqZWN0U2V0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzMQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldDEsIGxpc3QzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKGxpc3QzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvcl9FbXB0eUl0ZXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0MSwgRW1wdHlJdGVyYXRvci48U3RyaW5nPmluc3RhbmNlKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3QxLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvckludF9Nb2RpZmllZCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIGxpc3QyLml0ZXJhdG9yKCksIDMpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdDEuY29udGFpbnNBbGwobGlzdDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50X1VubW9kaWZpZWQoKSB7Ci0JCVNldDxTdHJpbmc+IHNldDEgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzMQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldDEsIGxpc3QzLml0ZXJhdG9yKCksIDMpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKGxpc3QzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvckludF9FbXB0eUl0ZXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0MSwgRW1wdHlJdGVyYXRvci48U3RyaW5nPmluc3RhbmNlKCksIDApKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3QxLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9TdHJpbmdNb2RpZmllZCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIGEpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zQWxsKENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGEpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9TdHJpbmdMaXN0RW1wdHlBcnJheSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCBuZXcgU3RyaW5nWzBdKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9TdHJpbmdVbm1vZGlmaWVkKCkgewotCQlTZXQ8U3RyaW5nPiBzZXQgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldCwgYSkpOwotCQlhc3NlcnRFcXVhbHMoMywgc2V0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc2V0LmNvbnRhaW5zQWxsKENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGEpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQsIG5ldyBTdHJpbmdbMF0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5X1N0cmluZ1NldEVtcHR5QXJyYXkoKSB7Ci0JCVNldDxTdHJpbmc+IHNldCA9IHRoaXMuYnVpbGRTdHJpbmdTZXQxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0LCBuZXcgU3RyaW5nWzBdKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9PYmplY3RNb2RpZmllZCgpIHsKLQkJTGlzdDxPYmplY3Q+IGxpc3QgPSB0aGlzLmJ1aWxkT2JqZWN0TGlzdDEoKTsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgYSkpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnNBbGwoQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oYSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5X09iamVjdFVubW9kaWZpZWQoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCVNldDxPYmplY3Q+IHNldCA9IHRoaXMuYnVpbGRPYmplY3RTZXQxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0LCBhKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZXQuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQuY29udGFpbnNBbGwoQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oYSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludE9iamVjdEFycmF5KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJYIiwgIlgiLCAiWCIsICJ0d28iIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRPYmplY3RBcnJheV9aZXJvKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDAsIG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJYIiwgIlgiLCAiWCIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludE9iamVjdEFycmF5X0VtcHR5QXJyYXkoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgbmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmFibGUoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAiWCIsICJYIiwgIlgiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmFibGVfWmVybygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAwLCBpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJYIiwgIlgiLCAiWCIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhYmxlX0VtcHR5SXRlcmFibGUoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhYmxlSW50KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhYmxlLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgIlgiLCAiWCIsICJYIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhYmxlSW50X1plcm8oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMCwgaXRlcmFibGUsIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWCIsICJYIiwgIlgiIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYWJsZUludF9FbXB0eUl0ZXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhYmxlLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJ0d28iIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KS5pdGVyYXRvcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgIlgiLCAiWCIsICJYIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhdG9yX1plcm8oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSkuaXRlcmF0b3IoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAwLCBpdGVyYXRvcik7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJYIiwgIlgiLCAiWCIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhdG9yX0VtcHR5SXRlcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgaXRlcmF0b3IpOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhdG9ySW50KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pLml0ZXJhdG9yKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgaXRlcmF0b3IsIDMpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAiWCIsICJYIiwgIlgiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmF0b3JJbnRfWmVybygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KS5pdGVyYXRvcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDAsIGl0ZXJhdG9yLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgIlgiLCAiWCIsICJYIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmF0b3JJbnRfRW1wdHlJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAyLCBpdGVyYXRvciwgMCk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiYWcgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0VudW1lcmF0aW9uX1N0cmluZygpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKS5lbGVtZW50cygpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGIuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnRW51bWVyYXRpb25fT2JqZWN0KCkgewotCQlCYWc8T2JqZWN0PiBiID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+YmFnKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkuZWxlbWVudHMoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0VudW1lcmF0aW9uX0VtcHR5KCkgewotCQlCYWc8T2JqZWN0PiBiID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+YmFnKEVtcHR5RW51bWVyYXRpb24uaW5zdGFuY2UoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBiLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0VudW1lcmF0aW9uSW50KCkgewotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpLmVsZW1lbnRzKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdFbnVtZXJhdGlvbkludF9FbXB0eSgpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcoRW1wdHlFbnVtZXJhdGlvbi48U3RyaW5nPmluc3RhbmNlKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMCwgYi5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyhpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyhpdGVyYWJsZSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JfU3RyaW5nT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiemVybyIpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCUJhZzxPYmplY3Q+IGIgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5iYWcoYy5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGIuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zQWxsKGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JfRW1wdHkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGIuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JJbnQoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JJbnRfRW1wdHkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGIuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnT2JqZWN0QXJyYXkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGIsIChPYmplY3RbXSkgdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ09iamVjdEFycmF5X1ZhcmFyZygpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcoImZvbyIsICJiYXIiLCAiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGIsIG5ldyBPYmplY3RbXXsiZm9vIiwgImJhciIsICJiYXoifSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdPYmplY3RBcnJheV9FbXB0eSgpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcoQmFnLkVtcHR5LjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBiLnNpemUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25FbnVtZXJhdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpLmVsZW1lbnRzKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uRW51bWVyYXRpb25fT2JqZWN0U3RyaW5nKCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYyA9IENvbGxlY3Rpb25Ub29scy48T2JqZWN0PmNvbGxlY3Rpb24odGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKS5lbGVtZW50cygpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkVudW1lcmF0aW9uSW50KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkuZWxlbWVudHMoKSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25JdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGl0ZXJhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25JdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGl0ZXJhYmxlLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25JdGVyYXRvcigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25JdGVyYXRvcl9PYmplY3RTdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+Y29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25JdGVyYXRvckludCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25PYmplY3RBcnJheSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjLCAoT2JqZWN0W10pIHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250YWlucyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNFbnVtZXJhdGlvbk9iamVjdF9TdHJpbmcoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSB0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh2LmVsZW1lbnRzKCksICJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh2LmVsZW1lbnRzKCksIG51bGwpKTsKLQkJdi5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHYuZWxlbWVudHMoKSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0VudW1lcmF0aW9uT2JqZWN0X09iamVjdCgpIHsKLQkJVmVjdG9yPE9iamVjdD4gYyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOwotCQljLmFkZCgiemVybyIpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCVN0cmluZyBvbmUgPSAib25lIjsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5lbGVtZW50cygpLCBvbmUpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuZWxlbWVudHMoKSwgbnVsbCkpOwotCQljLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5lbGVtZW50cygpLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zSXRlcmFibGVPYmplY3QoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBjOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhpdGVyYWJsZSwgIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGl0ZXJhYmxlLCBudWxsKSk7Ci0JCWMuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhpdGVyYWJsZSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0l0ZXJhdG9yT2JqZWN0X1N0cmluZygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5pdGVyYXRvcigpLCAib25lIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5pdGVyYXRvcigpLCBudWxsKSk7Ci0JCWMuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjLml0ZXJhdG9yKCksIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNJdGVyYXRvck9iamVjdF9PYmplY3QoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjID0gbmV3IEhhc2hCYWc8T2JqZWN0PigpOwotCQljLmFkZCgiemVybyIpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCVN0cmluZyBvbmUgPSAib25lIjsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5pdGVyYXRvcigpLCBvbmUpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuaXRlcmF0b3IoKSwgbnVsbCkpOwotCQljLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5pdGVyYXRvcigpLCBudWxsKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnRhaW5zIGFsbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDb2xsZWN0aW9uSXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDb2xsZWN0aW9uSXRlcmF0b3JfT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYzEgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJYzEuYWRkKCJ6ZXJvIik7Ci0JCWMxLmFkZCgib25lIik7Ci0JCWMxLmFkZCgidHdvIik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMi5hZGQoInR3byIpOwotCQljMi5hZGQoInplcm8iKTsKLQkJYzIuYWRkKCJvbmUiKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoYzEsIGMyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfU3RyaW5nT2JqZWN0KCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5KCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYWJsZUNvbGxlY3Rpb24oKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmFibGVJbnRDb2xsZWN0aW9uKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlLCAzLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhYmxlSXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlMSwgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmFibGVJbnRJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTIgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUxLCAzLCBpdGVyYWJsZTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYWJsZUl0ZXJhdG9yKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmFibGVJbnRJdGVyYXRvcigpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChpdGVyYWJsZSwgMywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhYmxlT2JqZWN0QXJyYXkoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhYmxlSW50T2JqZWN0QXJyYXkoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIDMsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIDMsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9yQ29sbGVjdGlvbl9TdHJpbmdTdHJpbmcoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9yQ29sbGVjdGlvbl9PYmplY3RTdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjMSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQljMS5hZGQoInplcm8iKTsKLQkJYzEuYWRkKCJvbmUiKTsKLQkJYzEuYWRkKCJ0d28iKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiemVybyIpOwotCQljMi5hZGQoIm9uZSIpOwotCQljMi5hZGQoInR3byIpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjMS5pdGVyYXRvcigpLCBjMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9ySW50Q29sbGVjdGlvbigpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgNSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDUsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCBpdGVyYWJsZSkpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYXRvckludEl0ZXJhYmxlKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMsIGl0ZXJhYmxlKSk7Ci0JCWl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzLCBpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9ySXRlcmF0b3JfU3RyaW5nU3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJdGVyYXRvcl9PYmplY3RTdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjMSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQljMS5hZGQoInplcm8iKTsKLQkJYzEuYWRkKCJvbmUiKTsKLQkJYzEuYWRkKCJ0d28iKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiemVybyIpOwotCQljMi5hZGQoIm9uZSIpOwotCQljMi5hZGQoInR3byIpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjMS5pdGVyYXRvcigpLCBjMi5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJbnRJdGVyYXRvcigpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMywgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9yT2JqZWN0QXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgdGhpcy5idWlsZE9iamVjdEFycmF5MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJbnRPYmplY3RBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMywgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkyKCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGlmZiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlmZkVuZExpc3RMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCJhIik7Ci0JCWxpc3QxLmFkZCgiYiIpOwotCQlsaXN0MS5hZGQoImMiKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QyLmFkZChuZXcgU3RyaW5nKCJhIikpOwotCQlsaXN0Mi5hZGQobmV3IFN0cmluZygiYiIpKTsKLQkJbGlzdDIuYWRkKG5ldyBTdHJpbmcoImMiKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmRpZmZFbmQobGlzdDEsIGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpZmZSYW5nZUxpc3RMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCJhIik7Ci0JCWxpc3QxLmFkZCgiYiIpOwotCQlsaXN0MS5hZGQoImMiKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QyLmFkZChuZXcgU3RyaW5nKCJhIikpOwotCQlsaXN0Mi5hZGQobmV3IFN0cmluZygiYiIpKTsKLQkJbGlzdDIuYWRkKG5ldyBTdHJpbmcoImMiKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMywgLTEpLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlJhbmdlKGxpc3QxLCBsaXN0MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaWZmU3RhcnRMaXN0TGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiYSIpOwotCQlsaXN0MS5hZGQoImIiKTsKLQkJbGlzdDEuYWRkKCJjIik7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0Mi5hZGQobmV3IFN0cmluZygiYSIpKTsKLQkJbGlzdDIuYWRkKG5ldyBTdHJpbmcoImIiKSk7Ci0JCWxpc3QyLmFkZChuZXcgU3RyaW5nKCJjIikpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLmRpZmZTdGFydChsaXN0MSwgbGlzdDIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaWRlbnRpdHkgZGlmZiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHlEaWZmRW5kTGlzdExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoImEiKTsKLQkJbGlzdDEuYWRkKCJiIik7Ci0JCWxpc3QxLmFkZCgiYyIpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDIuYWRkKCJhIik7Ci0JCWxpc3QyLmFkZCgiYiIpOwotCQlsaXN0Mi5hZGQoImMiKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmRW5kKGxpc3QxLCBsaXN0MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eURpZmZSYW5nZUxpc3RMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCJhIik7Ci0JCWxpc3QxLmFkZCgiYiIpOwotCQlsaXN0MS5hZGQoImMiKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QyLmFkZCgiYSIpOwotCQlsaXN0Mi5hZGQoImIiKTsKLQkJbGlzdDIuYWRkKCJjIik7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMywgLTEpLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UobGlzdDEsIGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElkZW50aXR5RGlmZlN0YXJ0TGlzdExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoImEiKTsKLQkJbGlzdDEuYWRkKCJiIik7Ci0JCWxpc3QxLmFkZCgiYyIpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDIuYWRkKCJhIik7Ci0JCWxpc3QyLmFkZCgiYiIpOwotCQlsaXN0Mi5hZGQoImMiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZTdGFydChsaXN0MSwgbGlzdDIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZWxlbWVudHMgYXJlIGVxdWFsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZURpZmZlcmVudEl0ZXJhYmxlSXRlcmFibGUoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjEwMDAiKTsKLQkJbGlzdDEuYWRkKCIyMDAwIik7Ci0JCWxpc3QxLmFkZCgiMzAwMCIpOwotCQlsaXN0MS5hZGQoIjQwMDAiKTsKLQotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZURpZmZlcmVudChsaXN0MSwgbGlzdDIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwobGlzdDEsIGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlRGlmZmVyZW50SXRlcmF0b3JJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiMTAwMCIpOwotCQlsaXN0MS5hZGQoIjIwMDAiKTsKLQkJbGlzdDEuYWRkKCIzMDAwIik7Ci0JCWxpc3QxLmFkZCgiNDAwMCIpOwotCi0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRGlmZmVyZW50KGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwobGlzdDEsIGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlRXF1YWxJdGVyYWJsZUl0ZXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCIxMDAwIik7Ci0JCWxpc3QxLmFkZCgiMjAwMCIpOwotCQlsaXN0MS5hZGQoIjMwMDAiKTsKLQkJbGlzdDEuYWRkKCI0MDAwIik7Ci0KLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdDEuc2l6ZSgpOyBpKyspIHsKLQkJCWxpc3QyLmFkZChTdHJpbmcudmFsdWVPZigoaSArIDEpICogMTAwMCkpOwotCQl9Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUlkZW50aWNhbChsaXN0MSwgbGlzdDIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRGlmZmVyZW50KGxpc3QxLCBsaXN0MikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGxpc3QxLCBsaXN0MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZUVxdWFsSXRlcmF0b3JJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiMTAwMCIpOwotCQlsaXN0MS5hZGQoIjIwMDAiKTsKLQkJbGlzdDEuYWRkKCIzMDAwIik7Ci0JCWxpc3QxLmFkZCgiNDAwMCIpOwotCi0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QxLnNpemUoKTsgaSsrKSB7Ci0JCQlsaXN0Mi5hZGQoU3RyaW5nLnZhbHVlT2YoKGkgKyAxKSAqIDEwMDApKTsKLQkJfQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVJZGVudGljYWwobGlzdDEuaXRlcmF0b3IoKSwgbGlzdDIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVEaWZmZXJlbnQobGlzdDEuaXRlcmF0b3IoKSwgbGlzdDIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZWxlbWVudHMgYXJlIGlkZW50aWNhbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVJZGVudGljYWxJdGVyYWJsZUl0ZXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCIwIik7Ci0JCWxpc3QxLmFkZCgiMSIpOwotCQlsaXN0MS5hZGQoIjIiKTsKLQkJbGlzdDEuYWRkKCIzIik7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUxID0gbGlzdDE7Ci0KLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoU3RyaW5nIHMgOiBsaXN0MSkgewotCQkJbGlzdDIuYWRkKHMpOwotCQl9Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gbGlzdDI7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlSWRlbnRpY2FsKGl0ZXJhYmxlMSwgaXRlcmFibGUyKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoaXRlcmFibGUxLCBpdGVyYWJsZTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVJZGVudGljYWxJdGVyYXRvckl0ZXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCIwIik7Ci0JCWxpc3QxLmFkZCgiMSIpOwotCQlsaXN0MS5hZGQoIjIiKTsKLQkJbGlzdDEuYWRkKCIzIik7Ci0KLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoU3RyaW5nIHMgOiBsaXN0MSkgewotCQkJbGlzdDIuYWRkKHMpOwotCQl9Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlSWRlbnRpY2FsKGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChsaXN0MS5pdGVyYXRvcigpLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlSWRlbnRpY2FsSXRlcmF0b3JJdGVyYXRvcl9Ob3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjAiKTsKLQkJbGlzdDEuYWRkKCIxIik7Ci0JCWxpc3QxLmFkZCgiMiIpOwotCQlsaXN0MS5hZGQoIjMiKTsKLQotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgcyA6IGxpc3QxKSB7Ci0JCQlsaXN0Mi5hZGQocyk7Ci0JCX0KLQkJbGlzdDIucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVJZGVudGljYWwobGlzdDEuaXRlcmF0b3IoKSwgbGlzdDIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChsaXN0MS5pdGVyYXRvcigpLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlSWRlbnRpY2FsSXRlcmF0b3JJdGVyYXRvcl9EaWZmZXJlbnRTaXplcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiMCIpOwotCQlsaXN0MS5hZGQoIjEiKTsKLQkJbGlzdDEuYWRkKCIyIik7Ci0JCWxpc3QxLmFkZCgiMyIpOwotCi0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKFN0cmluZyBzIDogbGlzdDEpIHsKLQkJCWxpc3QyLmFkZChzKTsKLQkJfQotCQlsaXN0Mi5yZW1vdmUoMyk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUlkZW50aWNhbChsaXN0MS5pdGVyYXRvcigpLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVOb3RJZGVudGljYWxJdGVyYWJsZUl0ZXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCIwIik7Ci0JCWxpc3QxLmFkZCgiMSIpOwotCQlsaXN0MS5hZGQoIjIiKTsKLQkJbGlzdDEuYWRkKCIzIik7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUxID0gbGlzdDE7Ci0KLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoU3RyaW5nIHMgOiBsaXN0MSkgewotCQkJbGlzdDIuYWRkKHMpOwotCQl9Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gbGlzdDI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZU5vdElkZW50aWNhbChpdGVyYWJsZTEsIGl0ZXJhYmxlMikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGl0ZXJhYmxlMSwgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlTm90SWRlbnRpY2FsSXRlcmF0b3JJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiMCIpOwotCQlsaXN0MS5hZGQoIjEiKTsKLQkJbGlzdDEuYWRkKCIyIik7Ci0JCWxpc3QxLmFkZCgiMyIpOwotCi0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKFN0cmluZyBzIDogbGlzdDEpIHsKLQkJCWxpc3QyLmFkZChzKTsKLQkJfQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVOb3RJZGVudGljYWwobGlzdDEuaXRlcmF0b3IoKSwgbGlzdDIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVOb3RJZGVudGljYWxJdGVyYXRvckl0ZXJhdG9yX05vdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiMCIpOwotCQlsaXN0MS5hZGQoIjEiKTsKLQkJbGlzdDEuYWRkKCIyIik7Ci0JCWxpc3QxLmFkZCgiMyIpOwotCi0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKFN0cmluZyBzIDogbGlzdDEpIHsKLQkJCWxpc3QyLmFkZChzKTsKLQkJfQotCQlsaXN0Mi5yZW1vdmUoMCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlTm90SWRlbnRpY2FsKGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwobGlzdDEuaXRlcmF0b3IoKSwgbGlzdDIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZU5vdElkZW50aWNhbEl0ZXJhdG9ySXRlcmF0b3JfRGlmZmVyZW50U2l6ZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjAiKTsKLQkJbGlzdDEuYWRkKCIxIik7Ci0JCWxpc3QxLmFkZCgiMiIpOwotCQlsaXN0MS5hZGQoIjMiKTsKLQotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgcyA6IGxpc3QxKSB7Ci0JCQlsaXN0Mi5hZGQocyk7Ci0JCX0KLQkJbGlzdDIucmVtb3ZlKDMpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZU5vdElkZW50aWNhbChsaXN0MS5pdGVyYXRvcigpLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZ2V0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJdGVyYWJsZUludCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCVN0cmluZyBvID0gQ29sbGVjdGlvblRvb2xzLmdldChpdGVyYWJsZSwgMSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgbyk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlvID0gQ29sbGVjdGlvblRvb2xzLmdldChpdGVyYWJsZSwgMyk7Ci0JCWFzc2VydE51bGwobyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEl0ZXJhdG9ySW50MSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJU3RyaW5nIG8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGxpc3QuaXRlcmF0b3IoKSwgMSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgbyk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlvID0gQ29sbGVjdGlvblRvb2xzLmdldChsaXN0Lml0ZXJhdG9yKCksIGxpc3Quc2l6ZSgpIC0gMSk7Ci0JCWFzc2VydE51bGwobyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEl0ZXJhdG9ySW50MigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQ29sbGVjdGlvblRvb2xzLmdldChsaXN0Lml0ZXJhdG9yKCksIGxpc3Quc2l6ZSgpKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBoYXNoIGNvZGUgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlSXRlcmFibGUxKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gbnVsbDsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5oYXNoQ29kZShpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZUl0ZXJhYmxlMigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCWludCBoYXNoQ29kZSA9IENvbGxlY3Rpb25Ub29scy5oYXNoQ29kZShpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscyhsaXN0Lmhhc2hDb2RlKCksIGhhc2hDb2RlKTsKLQotCQlsaXN0LmFkZChudWxsKTsKLQkJaGFzaENvZGUgPSBDb2xsZWN0aW9uVG9vbHMuaGFzaENvZGUoaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMobGlzdC5oYXNoQ29kZSgpLCBoYXNoQ29kZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluZGV4IG9mICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mSXRlcmFibGVPYmplY3RfU3RyaW5nKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihpdGVyYWJsZSwgIm9uZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkl0ZXJhdG9yT2JqZWN0X1N0cmluZygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGxpc3QuaXRlcmF0b3IoKSwgIm9uZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkl0ZXJhdG9yT2JqZWN0X1N0cmluZ19Ob3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YobGlzdC5pdGVyYXRvcigpLCBudWxsKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YobGlzdC5pdGVyYXRvcigpLCAic2hhemFtIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mSXRlcmF0b3JPYmplY3RfTnVsbCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJbGlzdC5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhsaXN0LnNpemUoKSAtIDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGxpc3QuaXRlcmF0b3IoKSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mSXRlcmF0b3JPYmplY3RfT2JqZWN0KCkgewotCQlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMSIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCi0JCVN0cmluZyBvbmUgPSAiMSI7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihsaXN0Lml0ZXJhdG9yKCksIG9uZSkpOwotCQlsaXN0LmFkZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpIC0gMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YobGlzdC5pdGVyYXRvcigpLCBudWxsKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluc2VydGlvbiBpbmRleCBvZiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0aW9uSW5kZXhPZkxpc3RDb21wYXJhYmxlUmFuZG9tQWNjZXNzKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkEiLCAiQyIsICJEIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIikpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIsICJEIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIikpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfSk7Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pOwotCQlhc3NlcnRFcXVhbHMoNiwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkUiKSk7Ci0KLQkJbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQSIpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc2VydGlvbkluZGV4T2ZMaXN0Q29tcGFyYWJsZU5vblJhbmRvbUFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkEiLCAiQyIsICJEIiB9KSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIpKTsKLQotCQlsaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIsICJEIiB9KSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIpKTsKLQotCQlsaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfSkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkIiKSk7Ci0KLQkJbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJFIikpOwotCi0JCWxpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiKSk7Ci0KLQkJbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJBIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnNlcnRpb25JbmRleE9mTGlzdE9iamVjdENvbXBhcmF0b3JSYW5kb21BY2Nlc3MoKSB7Ci0JCUNvbXBhcmF0b3I8U3RyaW5nPiBjID0gbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQSIgfSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIsIGMpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQSIgfSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIsIGMpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJCIiwgIkEiIH0pOwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkIiLCBjKSk7Ci0KLQkJbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQiIsICJBIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJFIiwgYykpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkIiIH0pOwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiLCBjKSk7Ci0KLQkJbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQSIsICJBIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJBIiwgYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnNlcnRpb25JbmRleE9mTGlzdE9iamVjdENvbXBhcmF0b3JOb25SYW5kb21BY2Nlc3MoKSB7Ci0JCUNvbXBhcmF0b3I8U3RyaW5nPiBjID0gbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJBIiB9KSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIsIGMpKTsKLQotCQlsaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJBIiB9KSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIsIGMpKTsKLQotCQlsaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkIiLCAiQSIgfSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkIiLCBjKSk7Ci0KLQkJbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJCIiwgIkEiIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJFIiwgYykpOwotCi0JCWxpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQiIgfSkpOwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiLCBjKSk7Ci0KLQkJbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJBIiwgIkEiIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJBIiwgYykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpcyBlbXB0eSAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgdGVzdElzRW1wdHlJdGVyYWJsZSgpIHsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoYnVpbGRPYmplY3RMaXN0MSgpKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0VtcHR5SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KGJ1aWxkT2JqZWN0TGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogaXRlcmFibGUvaXRlcmF0b3IgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhYmxlT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIHN0cmluZ3MgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHN0cmluZ3MpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoc3RyaW5nc1tpKytdLCBzdHJpbmcpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihhKTsgc3RyZWFtLmhhc05leHQoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoYVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGFzdCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEl0ZXJhYmxlMSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgQ29sbGVjdGlvblRvb2xzLmxhc3QoaXRlcmFibGUpKTsKLQkJbGlzdC5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBDb2xsZWN0aW9uVG9vbHMubGFzdChpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SXRlcmFibGUyKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUNvbGxlY3Rpb25Ub29scy5sYXN0KGl0ZXJhYmxlKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SXRlcmF0b3IxKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIENvbGxlY3Rpb25Ub29scy5sYXN0KGxpc3QuaXRlcmF0b3IoKSkpOwotCQlsaXN0LmFkZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIENvbGxlY3Rpb25Ub29scy5sYXN0KGxpc3QuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SXRlcmF0b3IyKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlDb2xsZWN0aW9uVG9vbHMubGFzdChsaXN0Lml0ZXJhdG9yKCkpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxhc3QgaW5kZXggb2YgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSXRlcmFibGVPYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBsaXN0OwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGl0ZXJhYmxlLCAib25lIikpOwotCQlsaXN0LmFkZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpIC0gMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGl0ZXJhYmxlLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSXRlcmFibGVJbnRPYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBsaXN0OwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGl0ZXJhYmxlLCAyMywgIm9uZSIpKTsKLQkJbGlzdC5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhsaXN0LnNpemUoKSAtIDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihpdGVyYWJsZSwgNDIsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZJdGVyYXRvck9iamVjdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihsaXN0Lml0ZXJhdG9yKCksICJvbmUiKSk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobGlzdC5zaXplKCkgLSAxLCBDb2xsZWN0aW9uVG9vbHMubGFzdEluZGV4T2YobGlzdC5pdGVyYXRvcigpLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSXRlcmF0b3JPYmplY3RfRW1wdHkoKSB7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZJdGVyYXRvckludE9iamVjdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihsaXN0Lml0ZXJhdG9yKCksIDMsICJvbmUiKSk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobGlzdC5zaXplKCkgLSAxLCBDb2xsZWN0aW9uVG9vbHMubGFzdEluZGV4T2YobGlzdC5pdGVyYXRvcigpLCA0LCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSXRlcmF0b3JJbnRPYmplY3RfRW1wdHkoKSB7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgNDIsICJmb28iKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhYmxlLCAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvcl9TdHJpbmdPYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjAiKTsKLQkJbGlzdDEuYWRkKCIxIik7Ci0JCWxpc3QxLmFkZCgiMiIpOwotCQlsaXN0MS5hZGQoIjMiKTsKLQotCQlMaXN0PE9iamVjdD4gbGlzdDIgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5saXN0KGxpc3QxLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMobGlzdDEsIGxpc3QyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yX0VtcHR5KCkgewotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmxpc3QoRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKS5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlcmF0b3JJbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMyk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvckludF9FbXB0eSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5saXN0KEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgNSkuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdE9iamVjdEFycmF5KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvck9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLmxpc3RJdGVyYXRvcihhKTsgc3RyZWFtLmhhc05leHQoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoYVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yT2JqZWN0QXJyYXlJbnQoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWludCBpID0gMTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMubGlzdEl0ZXJhdG9yKGEsIDEpOyBzdHJlYW0uaGFzTmV4dCgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhhW2ldLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb3ZlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTGlzdEludEludFJhbmRvbUFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCBuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH0pOwotCi0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCA0LCAyKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIsICI1IiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMCwgNSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDIsIDQpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjQiLCAiMSIsICIzIiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCAyKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVMaXN0SW50SW50U2VxdWVudGlhbEFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgbmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiB9KTsKLQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgNCwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDUpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCA0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMiwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiNCIsICIxIiwgIjMiLCAiMiIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTGlzdEludEludEludFJhbmRvbUFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH0pKTsKLQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgNCwgMiwgMSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCA0LCAxKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMiwgNCwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiMCIsICIzIiwgIjIiLCAiNCIsICI1IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAxLCAwLCA0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMSwgMSwgNCk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjMiLCAiMiIsICI0IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUxpc3RJbnRJbnRJbnRTZXF1ZW50aWFsQWNjZXNzKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH0pKTsKLQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgNCwgMiwgMSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCA0LCAxKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMiwgNCwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiMCIsICIzIiwgIjIiLCAiNCIsICI1IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAxLCAwLCA0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMSwgMSwgNCk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjMiLCAiMiIsICI0IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGFsbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbkl0ZXJhYmxlKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBpdGVyYWJsZSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidGhyZWUiKSk7Ci0KLQkJYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhYmxlKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbkl0ZXJhYmxlSW50KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBpdGVyYWJsZSwgNCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidGhyZWUiKSk7Ci0KLQkJYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhYmxlLCA1NSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuc2l6ZSgpLCBjLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25JdGVyYXRvcl9FbXB0eSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQljID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50X0VtcHR5KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgNSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidGhyZWUiKSk7Ci0KLQkJYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpLml0ZXJhdG9yKCksIDUpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCksIDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDb2xsZWN0aW9uSXRlcmF0b3JfRHVwbGljYXRlcygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImIiKTsKLQkJYy5hZGQoImMiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImQiKTsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImQiIH07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGEpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgaXRlcmF0b3IpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygiYSIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJiIikpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnMoImMiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImQiKSk7Ci0KLQkJaXRlcmF0b3IgPSBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGEpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhdG9yKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25JdGVyYXRvcl9PYmplY3RTdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJiIik7Ci0JCWMuYWRkKCJjIik7Ci0JCWMuYWRkKCJkIik7Ci0JCWMuYWRkKCJkIik7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJkIiB9OwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihhKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhdG9yKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImEiKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWlucygiYiIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJjIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJkIikpOwotCi0JCWl0ZXJhdG9yID0gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihhKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBpdGVyYXRvcikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfRW1wdHkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkyKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBuZXcgT2JqZWN0WzBdKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5X0R1cGxpY2F0ZXMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJiIik7Ci0JCWMuYWRkKCJjIik7Ci0JCWMuYWRkKCJkIik7Ci0JCWMuYWRkKCJkIik7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJkIiB9OwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgKE9iamVjdFtdKSBhKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImEiKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWlucygiYiIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJjIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJkIikpOwotCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywoT2JqZWN0W10pICBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9Nb3JlRHVwbGljYXRlcygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImIiKTsKLQkJYy5hZGQoImMiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImMiKTsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImQiIH07Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCAoT2JqZWN0W10pIGEpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygiYSIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJiIikpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnMoImMiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImQiKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCAoT2JqZWN0W10pIGEpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNDb2xsZWN0aW9uT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYywgInRocmVlIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhjLCAidHdvIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYywgInR3byIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQotCQljLmFkZCgiZml2ZSIpOwotCQljLmFkZCgiZml2ZSIpOwotCQljLmFkZCgiZml2ZSIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhjLCAiZml2ZSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsICJmaXZlIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgYy5zaXplKCkpOwotCi0JCWMuYWRkKG51bGwpOwotCQljLmFkZChudWxsKTsKLQkJYy5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyg1LCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsIG51bGwpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsIG51bGwpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGVsZW1lbnRzIGF0IGluZGV4ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhMaXN0SW50SW50KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfSkpOwotCQlMaXN0PFN0cmluZz4gcmVtb3ZlZCA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgobGlzdCwgMywgMik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiRCIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJDIiwgIkEiIH0sIHJlbW92ZWQudG9BcnJheSgpKSk7Ci0KLQkJbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIgfSkpOwotCQlyZW1vdmVkID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChsaXN0LCAzLCAzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJEIiwgIkUiLCAiRiIgfSwgcmVtb3ZlZC50b0FycmF5KCkpKTsKLQotCQlsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiB9KSk7Ci0JCXJlbW92ZWQgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGxpc3QsIDAsIDMpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkQiLCAiRSIsICJGIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJDIiB9LCByZW1vdmVkLnRvQXJyYXkoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgZHVwbGljYXRlIGVsZW1lbnRzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c0xpc3QxKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCk7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJ0d28iKTsKLQkJbGlzdC5hZGQoInplcm8iKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRHVwbGljYXRlRWxlbWVudHMobGlzdCkpOwotCQlpbnQgaSA9IDA7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoaSwgbGlzdC5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c0xpc3QyKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhsaXN0KSk7Ci0JCWludCBpID0gMDsKLQkJYXNzZXJ0RXF1YWxzKCJ6ZXJvIiwgbGlzdC5nZXQoaSsrKSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgbGlzdC5nZXQoaSsrKSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgbGlzdC5nZXQoaSsrKSk7Ci0JCWFzc2VydEVxdWFscyhpLCBsaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzTGlzdF9FbXB0eSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKGxpc3QpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3Quc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRHVwbGljYXRlRWxlbWVudHNMaXN0X1NpbmdsZUVsZW1lbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhsaXN0KSk7Ci0JCWFzc2VydEVxdWFscygxLCBsaXN0LnNpemUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJldGFpbiBhbGwgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYWJsZSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIGl0ZXJhYmxlKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgaXRlcmFibGUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uSXRlcmFibGVJbnQoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBpdGVyYWJsZSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuc2l6ZSgpLCBjLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgYyk7Ci0KLQkJaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIGl0ZXJhYmxlLCA3KSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX09iamVjdFN0cmluZygpIHsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IGMxID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWMxLmFkZCgiemVybyIpOwotCQljMS5hZGQoIm9uZSIpOwotCQljMS5hZGQoInR3byIpOwotCQkKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiemVybyIpOwotCQljMi5hZGQoIm9uZSIpOwotCQljMi5hZGQoInR3byIpOwotCQkKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjMSwgYzIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoYzIuc2l6ZSgpLCBjMS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoYzIsIGMxKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzMuYWRkKCJ0aHJlZSIpOwotCQljMy5hZGQoImZvdXIiKTsKLQkJYzMuYWRkKCJmaXZlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvcl9FbXB0eUl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvcl9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uSXRlcmF0b3JfRW1wdHlDb2xsZWN0aW9uRW1wdHlJdGVyYXRvcigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpLCA5KSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50X0VtcHR5SXRlcmF0b3IoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCksIDApKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50X0VtcHR5Q29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvckludF9FbXB0eUNvbGxlY3Rpb25FbXB0eUl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgMCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZE9iamVjdEFycmF5MigpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5X0VtcHR5T2JqZWN0QXJyYXkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBuZXcgT2JqZWN0WzBdKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgKE9iamVjdFtdKSBuZXcgU3RyaW5nW10geyAiZm9vIiB9KSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9FbXB0eUNvbGxlY3Rpb25FbXB0eU9iamVjdEFycmF5KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIChPYmplY3RbXSkgbmV3IFN0cmluZ1swXSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXZlcnNlIGxpc3QgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IGFjdHVhbCA9IENvbGxlY3Rpb25Ub29scy5yZXZlcnNlTGlzdChpdGVyYWJsZSk7Ci0JCUxpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKGV4cGVjdGVkKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlTGlzdEl0ZXJhYmxlSW50KCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QoaXRlcmFibGUsIDEwKTsKLQkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UoZXhwZWN0ZWQpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmF0b3JfU3RyaW5nKCkgewotCQlMaXN0PFN0cmluZz4gYWN0dWFsID0gQ29sbGVjdGlvblRvb2xzLnJldmVyc2VMaXN0KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShleHBlY3RlZCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZUxpc3RJdGVyYXRvcl9PYmplY3QoKSB7Ci0JCUxpc3Q8T2JqZWN0PiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5yZXZlcnNlTGlzdCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJTGlzdDxPYmplY3Q+IGV4cGVjdGVkID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UoZXhwZWN0ZWQpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmF0b3JJbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMzMpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShleHBlY3RlZCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcm90YXRlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gYWN0dWFsID0gQ29sbGVjdGlvblRvb2xzLnJvdGF0ZSh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9ucy5yb3RhdGUoZXhwZWN0ZWQsIDEpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNldCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNldChpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdTZXQxKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KGl0ZXJhYmxlLCAyMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuYnVpbGRTdHJpbmdTZXQxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVyYXRvcl9PYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCVNldDxTdHJpbmc+IHNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJc2V0LmFkZEFsbChsaXN0KTsKLQotCQlhc3NlcnRFcXVhbHMoc2V0LCBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5zZXQobGlzdC5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEl0ZXJhdG9ySW50KCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLml0ZXJhdG9yKCksIDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0QXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuYnVpbGRTdHJpbmdTZXQxKCkudG9BcnJheSgpKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNpbmdsZXRvbiBpdGVyYXRvciAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uSXRlcmF0b3JfU3RyaW5nKCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy5zaW5nbGV0b25JdGVyYXRvcigiZm9vIik7Ci0JCWFzc2VydFRydWUoc3RyZWFtLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RyZWFtLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbkl0ZXJhdG9yX09iamVjdCgpIHsKLQkJSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5zaW5nbGV0b25JdGVyYXRvcigiZm9vIik7Ci0JCWFzc2VydFRydWUoc3RyZWFtLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RyZWFtLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbkl0ZXJhdG9yX0Nhc3QoKSB7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKChPYmplY3QpICJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShzdHJlYW0uaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdHJlYW0ubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uTGlzdEl0ZXJhdG9yX1N0cmluZygpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkxpc3RJdGVyYXRvcigiZm9vIik7Ci0JCWFzc2VydFRydWUoc3RyZWFtLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHN0cmVhbS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKHN0cmVhbS5oYXNQcmV2aW91cygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdHJlYW0ucHJldmlvdXMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNpemUgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFNpemVJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8T2JqZWN0PiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRPYmplY3RMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZUl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5idWlsZE9iamVjdExpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHNvcnQgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYWJsZSgpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTEgPSBsaXN0OwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnQoaXRlcmFibGUxKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChzcywgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYWJsZUludCgpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTEgPSBsaXN0OwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnQoaXRlcmFibGUxLCA3Nyk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoc3MsIGl0ZXJhYmxlMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0SXRlcmFibGVDb21wYXJhdG9yKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0KLQkJU29ydGVkU2V0PFN0cmluZz4gc3MgPSBuZXcgVHJlZVNldDxTdHJpbmc+KG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCkpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTEgPSBsaXN0OwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnQoaXRlcmFibGUxLCBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChzcywgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYWJsZUNvbXBhcmF0b3JJbnQoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4obmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXNzLmFkZEFsbChsaXN0KTsKLQotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMSA9IGxpc3Q7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gQ29sbGVjdGlvblRvb2xzLjxTdHJpbmc+c29ydChpdGVyYWJsZTEsIG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCksIDc3KTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChzcywgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYXRvcigpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcjEgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IyID0gQ29sbGVjdGlvblRvb2xzLjxTdHJpbmc+c29ydChpdGVyYXRvcjEpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKHNzLml0ZXJhdG9yKCksIGl0ZXJhdG9yMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0SXRlcmF0b3JJbnQoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJc3MuYWRkQWxsKGxpc3QpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IxID0gbGlzdC5pdGVyYXRvcigpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnQoaXRlcmF0b3IxLCA3Nyk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoc3MuaXRlcmF0b3IoKSwgaXRlcmF0b3IyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYXRvckNvbXBhcmF0b3IoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4obmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXNzLmFkZEFsbChsaXN0KTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yMSA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcjIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0KGl0ZXJhdG9yMSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoc3MuaXRlcmF0b3IoKSwgaXRlcmF0b3IyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYXRvckNvbXBhcmF0b3JJbnQoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4obmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXNzLmFkZEFsbChsaXN0KTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yMSA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcjIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0KGl0ZXJhdG9yMSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSwgNzcpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKHNzLml0ZXJhdG9yKCksIGl0ZXJhdG9yMikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzb3J0ZWQgc2V0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0ZWRTZXRJdGVyYWJsZSgpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMSA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJc3MxLmFkZEFsbChsaXN0KTsKLQotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gbGlzdDsKLQkJU29ydGVkU2V0PFN0cmluZz4gc3MyID0gQ29sbGVjdGlvblRvb2xzLjxTdHJpbmc+c29ydGVkU2V0KGl0ZXJhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKHNzMSwgc3MyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0SXRlcmFibGVJbnQoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzczEgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7Ci0JCXNzMS5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnRlZFNldChpdGVyYWJsZSwgNSk7Ci0JCWFzc2VydEVxdWFscyhzczEsIHNzMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldEl0ZXJhYmxlQ29tcGFyYXRvcigpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMSA9IG5ldyBUcmVlU2V0PFN0cmluZz4obmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXNzMS5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnRlZFNldChpdGVyYWJsZSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCWFzc2VydEVxdWFscyhzczEsIHNzMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldEl0ZXJhYmxlQ29tcGFyYXRvckludCgpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMSA9IG5ldyBUcmVlU2V0PFN0cmluZz4obmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXNzMS5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnRlZFNldChpdGVyYWJsZSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSwgNSk7Ci0JCWFzc2VydEVxdWFscyhzczEsIHNzMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldEl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFNvcnRlZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldCh0aGlzLmJ1aWxkU29ydGVkU3RyaW5nU2V0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0SXRlcmF0b3JfVHJlZVNldCgpIHsKLQkJU29ydGVkU2V0PFN0cmluZz4gc3MxID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlzczEuYWRkKCIwIik7Ci0JCXNzMS5hZGQoIjIiKTsKLQkJc3MxLmFkZCgiMyIpOwotCQlzczEuYWRkKCIxIik7Ci0KLQkJU29ydGVkU2V0PFN0cmluZz4gc2V0MiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnRlZFNldChzczEuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyhzczEsIHNldDIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0ZWRTZXRJdGVyYXRvckludCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTb3J0ZWRTdHJpbmdTZXQxKCksIENvbGxlY3Rpb25Ub29scy5zb3J0ZWRTZXQodGhpcy5idWlsZFNvcnRlZFN0cmluZ1NldDEoKS5pdGVyYXRvcigpLCA4KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldE9iamVjdEFycmF5KCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFNvcnRlZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldCh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0T2JqZWN0QXJyYXlDb21wYXJhdG9yKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0KLQkJU29ydGVkU2V0PFN0cmluZz4gc3MxID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpKTsKLQkJc3MxLmFkZEFsbChsaXN0KTsKLQotCQlTdHJpbmdbXSBhcnJheSA9IGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSk7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnRlZFNldChhcnJheSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCWFzc2VydEVxdWFscyhzczEsIHNzMik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9sZCBTY2hvb2wgVmVjdG9yICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RWZWN0b3JJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlWZWN0b3I8U3RyaW5nPiB2ID0gQ29sbGVjdGlvblRvb2xzLnZlY3RvcihpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygzLCB2LnNpemUoKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZWN0b3JJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlWZWN0b3I8U3RyaW5nPiB2ID0gQ29sbGVjdGlvblRvb2xzLnZlY3RvcihpdGVyYWJsZSwgOCk7Ci0JCWFzc2VydEVxdWFscygzLCB2LnNpemUoKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZWN0b3JJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVjdG9ySXRlcmF0b3JfT2JqZWN0KCkgewotCQlWZWN0b3I8T2JqZWN0PiB2ID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+dmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVjdG9ySXRlcmF0b3JJbnQoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDcpOwotCQlhc3NlcnRFcXVhbHMoMywgdi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVjdG9yT2JqZWN0QXJyYXkoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB2LnNpemUoKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzaW5nbGUtdXNlIGl0ZXJhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYWJsZUl0ZXJhdG9yKCkgewotCQlJdGVyYXRvcjxPYmplY3Q+IGVtcHR5SXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCUl0ZXJhYmxlPE9iamVjdD4gZW1wdHlJdGVyYWJsZSA9IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShlbXB0eUl0ZXJhdG9yKTsKLQkJCi0JCWFzc2VydEZhbHNlKGVtcHR5SXRlcmFibGUuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWVtcHR5SXRlcmF0b3IgPSBlbXB0eUl0ZXJhYmxlLml0ZXJhdG9yKCk7Ci0JCQlmYWlsKCJpbnZhbGlkIGl0ZXJhdG9yOiAiICsgZW1wdHlJdGVyYXRvcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24uIiwgZXhjZXB0aW9uVGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmFibGVJdGVyYXRvcl9OUEUoKSB7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gbnVsbEl0ZXJhdG9yID0gbnVsbDsKLQkJYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUl0ZXJhYmxlPE9iamVjdD4gZW1wdHlJdGVyYWJsZSA9IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShudWxsSXRlcmF0b3IpOwotCQkJZmFpbCgiaW52YWxpZCBpdGVyYWJsZTogIiArIGVtcHR5SXRlcmFibGUpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBpc2UpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYWJsZUl0ZXJhdG9yX1RvU3RyaW5nKCkgewotCQlJdGVyYXRvcjxPYmplY3Q+IGVtcHR5SXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCUl0ZXJhYmxlPE9iamVjdD4gZW1wdHlJdGVyYWJsZSA9IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShlbXB0eUl0ZXJhdG9yKTsKLQkJYXNzZXJ0Tm90TnVsbChlbXB0eUl0ZXJhYmxlLnRvU3RyaW5nKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMgZW5oYW5jZW1lbnRzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5TGlzdExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzcmMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IGRlc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgcyA6IHNyYykgewotCQkJZGVzdC5hZGQocy50b1VwcGVyQ2FzZSgpKTsKLQkJfQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLmNvcHkoZGVzdCwgc3JjKTsKLQkJYXNzZXJ0U2FtZShkZXN0LCByZXN1bHQpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUlkZW50aWNhbChzcmMsIGRlc3QpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbExpc3RPYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMuZmlsbChsaXN0LCAiZm9vIik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogcmVzdWx0KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0cmluZyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZUxpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMuc2h1ZmZsZShsaXN0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaHVmZmxlTGlzdFJhbmRvbSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5zaHVmZmxlKGxpc3QsIG5ldyBSYW5kb20oKSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMuc29ydChsaXN0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKHNzLCByZXN1bHQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3dhcExpc3RJbnRJbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMuc3dhcChsaXN0LCAwLCAxKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOwotCQlMaXN0PFN0cmluZz4gb3JpZ2luYWwgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLmdldCgwKSwgcmVzdWx0LmdldCgxKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5nZXQoMSksIHJlc3VsdC5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwuZ2V0KDIpLCByZXN1bHQuZ2V0KDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU9iamVjdCBhdCA9IFJlZmxlY3Rpb25Ub29scy5uZXdJbnN0YW5jZShDb2xsZWN0aW9uVG9vbHMuY2xhc3MpOwotCQkJZmFpbCgiYm9ndXM6ICIgKyBhdCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQkJaWYgKGV4LmdldENhdXNlKCkuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRlc3QgaGFybmVzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIE9iamVjdFtdIGJ1aWxkT2JqZWN0QXJyYXkxKCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGJ1aWxkU3RyaW5nQXJyYXkxKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGJ1aWxkT2JqZWN0QXJyYXkyKCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgInRocmVlIiwgImZvdXIiLCAiZml2ZSIgfTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGJ1aWxkU3RyaW5nVmVjdG9yMSgpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQl0aGlzLmFkZFRvQ29sbGVjdGlvbjEodik7Ci0JCXJldHVybiB2OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkU3RyaW5nTGlzdDEoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkVG9Db2xsZWN0aW9uMShsKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PE9iamVjdD4gYnVpbGRPYmplY3RMaXN0MSgpIHsKLQkJTGlzdDxPYmplY3Q+IGwgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKGwpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVG9Db2xsZWN0aW9uMShDb2xsZWN0aW9uPD8gc3VwZXIgU3RyaW5nPiBjKSB7Ci0JCWMuYWRkKCJ6ZXJvIik7Ci0JCWMuYWRkKCJvbmUiKTsKLQkJYy5hZGQoInR3byIpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkU3RyaW5nTGlzdDIoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkVG9Db2xsZWN0aW9uMihsKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFRvQ29sbGVjdGlvbjIoQ29sbGVjdGlvbjw/IHN1cGVyIFN0cmluZz4gYykgewotCQljLmFkZCgidGhyZWUiKTsKLQkJYy5hZGQoImZvdXIiKTsKLQkJYy5hZGQoImZpdmUiKTsKLQl9Ci0KLQlwcml2YXRlIFNldDxTdHJpbmc+IGJ1aWxkU3RyaW5nU2V0MSgpIHsKLQkJU2V0PFN0cmluZz4gcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQlwcml2YXRlIFNldDxPYmplY3Q+IGJ1aWxkT2JqZWN0U2V0MSgpIHsKLQkJU2V0PE9iamVjdD4gcyA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQlwcml2YXRlIFNvcnRlZFNldDxTdHJpbmc+IGJ1aWxkU29ydGVkU3RyaW5nU2V0MSgpIHsKLQkJU29ydGVkU2V0PFN0cmluZz4gcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9FeGNlcHRpb25IYW5kbGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9FeGNlcHRpb25IYW5kbGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBmOTk3Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvRXhjZXB0aW9uSGFuZGxlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5FeGNlcHRpb25IYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uSGFuZGxlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEV4Y2VwdGlvbkhhbmRsZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbEV4Y2VwdGlvbkhhbmRsZXIoKSB7Ci0JCUV4Y2VwdGlvbkhhbmRsZXIgZXhjZXB0aW9uSGFuZGxlciA9IEV4Y2VwdGlvbkhhbmRsZXIuTnVsbC5pbnN0YW5jZSgpOwotCQlleGNlcHRpb25IYW5kbGVyLmhhbmRsZUV4Y2VwdGlvbihuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKSk7ICAvLyBqdXN0IG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGJsb3cgdXA/Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxFeGNlcHRpb25IYW5kbGVyVG9TdHJpbmcoKSB7Ci0JCUV4Y2VwdGlvbkhhbmRsZXIgZXhjZXB0aW9uSGFuZGxlciA9IEV4Y2VwdGlvbkhhbmRsZXIuTnVsbC5pbnN0YW5jZSgpOwotCQlhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbkhhbmRsZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJ1bnRpbWVFeGNlcHRpb25IYW5kbGVyMSgpIHsKLQkJRXhjZXB0aW9uIG5wZSA9IG5ldyBFeGNlcHRpb24oKTsKLQkJRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyID0gRXhjZXB0aW9uSGFuZGxlci5SdW50aW1lLmluc3RhbmNlKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlRXhjZXB0aW9uKG5wZSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWFzc2VydFNhbWUobnBlLCBleC5nZXRDYXVzZSgpKTsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UnVudGltZUV4Y2VwdGlvbkhhbmRsZXIyKCkgewotCQlFeGNlcHRpb24gbnBlID0gbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCUV4Y2VwdGlvbkhhbmRsZXIgZXhjZXB0aW9uSGFuZGxlciA9IEV4Y2VwdGlvbkhhbmRsZXIuUnVudGltZS5pbnN0YW5jZSgpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlleGNlcHRpb25IYW5kbGVyLmhhbmRsZUV4Y2VwdGlvbihucGUpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlhc3NlcnRTYW1lKG5wZSwgZXgpOwotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSdW50aW1lRXhjZXB0aW9uSGFuZGxlclRvU3RyaW5nKCkgewotCQlFeGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbkhhbmRsZXIgPSBFeGNlcHRpb25IYW5kbGVyLlJ1bnRpbWUuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChleGNlcHRpb25IYW5kbGVyLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0ZpbGVUb29sc1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvRmlsZVRvb2xzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ4M2I4NS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvRmlsZVRvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkZpbGVUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRmlsZVRvb2xzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBGaWxlIHRlbXBEaXI7Ci0KLQlwdWJsaWMgRmlsZVRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy50ZW1wRGlyID0gdGhpcy5idWlsZFRlbXBEaXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQl0aGlzLmRlbGV0ZURpcih0aGlzLnRlbXBEaXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxlc0luKCkgewotCQlDb2xsZWN0aW9uPEZpbGU+IGZpbGVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oRmlsZVRvb2xzLmZpbGVzSW4odGhpcy50ZW1wRGlyLmdldFBhdGgoKSkpOwotCQlhc3NlcnRFcXVhbHMoImludmFsaWQgZmlsZSBjb3VudCIsIDMsIGZpbGVzLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcmVjdG9yaWVzSW4oKSB7Ci0JCUNvbGxlY3Rpb248RmlsZT4gZmlsZXMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihGaWxlVG9vbHMuZGlyZWN0b3JpZXNJbih0aGlzLnRlbXBEaXIuZ2V0UGF0aCgpKSk7Ci0JCWFzc2VydEVxdWFscygiaW52YWxpZCBkaXJlY3RvcnkgY291bnQiLCAyLCBmaWxlcy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxlc0luVHJlZSgpIHsKLQkJQ29sbGVjdGlvbjxGaWxlPiBmaWxlcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKEZpbGVUb29scy5maWxlc0luVHJlZSh0aGlzLnRlbXBEaXIuZ2V0UGF0aCgpKSk7Ci0JCWFzc2VydEVxdWFscygiaW52YWxpZCBmaWxlIGNvdW50IiwgOSwgZmlsZXMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlyZWN0b3JpZXNJblRyZWUoKSB7Ci0JCUNvbGxlY3Rpb248RmlsZT4gZmlsZXMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihGaWxlVG9vbHMuZGlyZWN0b3JpZXNJblRyZWUodGhpcy50ZW1wRGlyLmdldFBhdGgoKSkpOwotCQlhc3NlcnRFcXVhbHMoImludmFsaWQgZGlyZWN0b3J5IGNvdW50IiwgMywgZmlsZXMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlRGlyZWN0b3J5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gYnVpbGQgYW5vdGhlciB0ZW1wb3JhcnkgZGlyZWN0b3J5IGp1c3QgZm9yIHRoaXMgdGVzdAotCQlGaWxlIGRpciA9IHRoaXMuYnVpbGRUZW1wRGlyKCk7Ci0JCWFzc2VydFRydWUoInRlbXBvcmFyeSBkaXJlY3Rvcnkgbm90IGNyZWF0ZWQiLCBkaXIuZXhpc3RzKCkpOwotCQlGaWxlVG9vbHMuZGVsZXRlRGlyZWN0b3J5KGRpci5nZXRQYXRoKCkpOwotCQlhc3NlcnRGYWxzZSgidGVtcG9yYXJ5IGRpcmVjdG9yeSBub3QgZGVsZXRlZCIsIGRpci5leGlzdHMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gYnVpbGQgYW5vdGhlciB0ZW1wb3JhcnkgZGlyZWN0b3J5IGp1c3QgZm9yIHRoaXMgdGVzdAotCQlGaWxlIGRpciA9IHRoaXMuYnVpbGRUZW1wRGlyKCk7Ci0JCWFzc2VydFRydWUoInRlbXBvcmFyeSBkaXJlY3Rvcnkgbm90IGNyZWF0ZWQiLCBkaXIuZXhpc3RzKCkpOwotCQlGaWxlVG9vbHMuZGVsZXRlRGlyZWN0b3J5Q29udGVudHMoZGlyLmdldFBhdGgoKSk7Ci0JCWFzc2VydFRydWUoInRlbXBvcmFyeSBkaXJlY3Rvcnkgc2hvdWxkIG5vdCBoYXZlIGJlZW4gZGVsZXRlZCIsIGRpci5leGlzdHMoKSk7Ci0JCWFzc2VydFRydWUoInRlbXBvcmFyeSBkaXJlY3RvcnkgY29udGVudHMgbm90IGRlbGV0ZWQiLCBkaXIubGlzdEZpbGVzKCkubGVuZ3RoID09IDApOwotCQlkaXIuZGVsZXRlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvcHlUb0ZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIGRlc3RGaWxlID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCAiZGVzdGZpbGUudHh0Iik7Ci0JCXRoaXMuY29weVRvRmlsZShkZXN0RmlsZSwgInRlc3RDb3B5VG9GaWxlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvcHlUb1ByZUV4aXN0aW5nRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZSh0aGlzLnRlbXBEaXIsICJkZXN0ZmlsZS50eHQiKTsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdEZpbGUpKTsKLQkJd3JpdGVyLndyaXRlKCJ0aGlzIHRleHQgc2hvdWxkIGJlIHJlcGxhY2VkLi4uIik7Ci0JCXdyaXRlci5jbG9zZSgpOwotCQl0aGlzLmNvcHlUb0ZpbGUoZGVzdEZpbGUsICJ0ZXN0Q29weVRvUHJlRXhpc3RpbmdGaWxlIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvcHlUb0ZpbGUoRmlsZSBkZXN0RmlsZSwgU3RyaW5nIHdyaXRlU3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIHNvdXJjZUZpbGUgPSBuZXcgRmlsZSh0aGlzLnRlbXBEaXIsICJzb3VyY2VmaWxlLnR4dCIpOwotCQljaGFyW10gcmVhZEJ1ZmZlciA9IG5ldyBjaGFyW3dyaXRlU3RyaW5nLmxlbmd0aCgpXTsKLQotCQlXcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShzb3VyY2VGaWxlKSk7Ci0JCXdyaXRlci53cml0ZSh3cml0ZVN0cmluZyk7Ci0JCXdyaXRlci5jbG9zZSgpOwotCi0JCUZpbGVUb29scy5jb3B5VG9GaWxlKHNvdXJjZUZpbGUsIGRlc3RGaWxlKTsKLQotCQlSZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0oZGVzdEZpbGUpKTsKLQkJcmVhZGVyLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlTdHJpbmcgcmVhZFN0cmluZyA9IG5ldyBTdHJpbmcocmVhZEJ1ZmZlcik7Ci0JCWFzc2VydEVxdWFscyh3cml0ZVN0cmluZywgcmVhZFN0cmluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvcHlUb0RpcmVjdG9yeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKHRoaXMudGVtcERpciwgInNvdXJjZWZpbGUudHh0Iik7Ci0JCVN0cmluZyB3cml0ZVN0cmluZyA9ICJ0ZXN0Q29weVRvRGlyZWN0b3J5IjsKLQotCQlGaWxlIGRlc3REaXIgPSBuZXcgRmlsZSh0aGlzLnRlbXBEaXIsICJkZXN0ZGlyIik7Ci0JCWRlc3REaXIubWtkaXIoKTsKLQkJRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKGRlc3REaXIsICJzb3VyY2VmaWxlLnR4dCIpOwotCQljaGFyW10gcmVhZEJ1ZmZlciA9IG5ldyBjaGFyW3dyaXRlU3RyaW5nLmxlbmd0aCgpXTsKLQotCQlXcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShzb3VyY2VGaWxlKSk7Ci0JCXdyaXRlci53cml0ZSh3cml0ZVN0cmluZyk7Ci0JCXdyaXRlci5jbG9zZSgpOwotCi0JCUZpbGVUb29scy5jb3B5VG9EaXJlY3Rvcnkoc291cmNlRmlsZSwgZGVzdERpcik7Ci0KLQkJUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGRlc3RGaWxlKSk7Ci0JCXJlYWRlci5yZWFkKHJlYWRCdWZmZXIpOwotCQlyZWFkZXIuY2xvc2UoKTsKLQkJU3RyaW5nIHJlYWRTdHJpbmcgPSBuZXcgU3RyaW5nKHJlYWRCdWZmZXIpOwotCQlhc3NlcnRFcXVhbHMod3JpdGVTdHJpbmcsIHJlYWRTdHJpbmcpOwotCQkKLQkJRmlsZVRvb2xzLmNvcHlUb0RpcmVjdG9yeShzb3VyY2VGaWxlLCBkZXN0RGlyKTsgLy9UcnkgYWdhaW4gd2l0aCB0aGUgZGlyZWN0b3J5IGlzIGFscmVhZHkgY3JlYXRlZAotCQlyZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShkZXN0RmlsZSkpOwotCQlyZWFkZXIucmVhZChyZWFkQnVmZmVyKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCXJlYWRTdHJpbmcgPSBuZXcgU3RyaW5nKHJlYWRCdWZmZXIpOwotCQlhc3NlcnRFcXVhbHMod3JpdGVTdHJpbmcsIHJlYWRTdHJpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWx0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgcHJlZml4ID0gIlhYWHRlc3RGaWxlWFhYIjsKLQkJRmlsZSB0ZXN0RmlsZTEgPSBuZXcgRmlsZSh0aGlzLnRlbXBEaXIsIHByZWZpeCArICIxIik7Ci0JCXRlc3RGaWxlMS5jcmVhdGVOZXdGaWxlKCk7Ci0JCUZpbGUgdGVzdEZpbGUyID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCBwcmVmaXggKyAiMiIpOwotCQl0ZXN0RmlsZTIuY3JlYXRlTmV3RmlsZSgpOwotCi0JCUZpbGVGaWx0ZXIgZmlsdGVyID0gdGhpcy5idWlsZEZpbGVGaWx0ZXIocHJlZml4KTsKLQkJSXRlcmF0b3I8RmlsZT4gZmlsdGVyZWRGaWxlc0l0ZXJhdG9yID0gRmlsZVRvb2xzLmZpbHRlcihGaWxlVG9vbHMuZmlsZXNJbih0aGlzLnRlbXBEaXIpLCBmaWx0ZXIpOwotCQlDb2xsZWN0aW9uPEZpbGU+IGZpbHRlcmVkRmlsZXMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihmaWx0ZXJlZEZpbGVzSXRlcmF0b3IpOwotCQlhc3NlcnRFcXVhbHMoMiwgZmlsdGVyZWRGaWxlcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGZpbHRlcmVkRmlsZXMuY29udGFpbnModGVzdEZpbGUxKSk7Ci0JCWFzc2VydFRydWUoZmlsdGVyZWRGaWxlcy5jb250YWlucyh0ZXN0RmlsZTIpKTsKLQl9Ci0KLQlwcml2YXRlIEZpbGVGaWx0ZXIgYnVpbGRGaWxlRmlsdGVyKGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIG5ldyBGaWxlRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZmlsZSkgewotCQkJCXJldHVybiBmaWxlLmdldE5hbWUoKS5zdGFydHNXaXRoKHByZWZpeCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmlwRXh0ZW5zaW9uKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIEZpbGVUb29scy5zdHJpcEV4dGVuc2lvbigiZm9vLnhtbCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28uYmFyIiwgRmlsZVRvb2xzLnN0cmlwRXh0ZW5zaW9uKCJmb28uYmFyLnhtbCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBGaWxlVG9vbHMuc3RyaXBFeHRlbnNpb24oImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBGaWxlVG9vbHMuc3RyaXBFeHRlbnNpb24oImZvby4iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvbigpIHsKLQkJYXNzZXJ0RXF1YWxzKCIueG1sIiwgRmlsZVRvb2xzLmV4dGVuc2lvbigiZm9vLnhtbCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCIueG1sIiwgRmlsZVRvb2xzLmV4dGVuc2lvbigiZm9vLmJhci54bWwiKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgRmlsZVRvb2xzLmV4dGVuc2lvbigiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoIiIsIEZpbGVUb29scy5leHRlbnNpb24oImZvbyx4bWwiKSk7Ci0JCWFzc2VydEVxdWFscygiLiIsIEZpbGVUb29scy5leHRlbnNpb24oImZvby4iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5VGVtcG9yYXJ5RGlyZWN0b3J5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSB0ZW1wRGlyMSA9IEZpbGVUb29scy50ZW1wb3JhcnlEaXJlY3RvcnkoKTsKLQkJRmlsZSB0ZXN0RmlsZTEgPSBuZXcgRmlsZSh0ZW1wRGlyMSwgImp1bmsiKTsKLQkJdGVzdEZpbGUxLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlGaWxlIHRlbXBEaXIyID0gRmlsZVRvb2xzLmVtcHR5VGVtcG9yYXJ5RGlyZWN0b3J5KCk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wRGlyMSwgdGVtcERpcjIpOwotCQlhc3NlcnRUcnVlKHRlbXBEaXIyLmlzRGlyZWN0b3J5KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGVtcERpcjIubGlzdEZpbGVzKCkubGVuZ3RoKTsKLQkJdGVtcERpcjIuZGVsZXRlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhbm9uaWNhbEZpbGVOYW1lKCkgewotCQlGaWxlIGZpbGUxID0gbmV3IEZpbGUoImZvbyIpOwotCQlmaWxlMSA9IG5ldyBGaWxlKGZpbGUxLCAiYmFyIik7Ci0JCWZpbGUxID0gbmV3IEZpbGUoZmlsZTEsICJiYXoiKTsKLQkJZmlsZTEgPSBuZXcgRmlsZShmaWxlMSwgIi4uIik7Ci0JCWZpbGUxID0gbmV3IEZpbGUoZmlsZTEsICIuLiIpOwotCQlmaWxlMSA9IG5ldyBGaWxlKGZpbGUxLCAiYmFyIik7Ci0JCWZpbGUxID0gbmV3IEZpbGUoZmlsZTEsICJiYXoiKTsKLQkJRmlsZSBmaWxlMiA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSk7Ci0JCWZpbGUyID0gbmV3IEZpbGUoZmlsZTIsICJmb28iKTsKLQkJZmlsZTIgPSBuZXcgRmlsZShmaWxlMiwgImJhciIpOwotCQlmaWxlMiA9IG5ldyBGaWxlKGZpbGUyLCAiYmF6Iik7Ci0JCUZpbGUgZmlsZTMgPSBGaWxlVG9vbHMuY2Fub25pY2FsRmlsZShmaWxlMSk7Ci0JCWFzc2VydEVxdWFscyhmaWxlMiwgZmlsZTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYXRoRmlsZXMoKSB7Ci0JCUZpbGVbXSBleHBlY3RlZDsKLQkJRmlsZVtdIGFjdHVhbDsKLQotCQlpZiAoVG9vbHMub3NJc1dpbmRvd3MoKSkgewotCQkJZXhwZWN0ZWQgPSBuZXcgRmlsZVtdIHsgbmV3IEZpbGUoIkM6LyIpLCBuZXcgRmlsZSgiQzovZm9vIiksIG5ldyBGaWxlKCJDOi9mb28vYmFyIiksIG5ldyBGaWxlKCJDOi9mb28vYmFyL2Jhei50eHQiKSB9OwotCQkJYWN0dWFsID0gdGhpcy5wYXRoRmlsZXMobmV3IEZpbGUoIkM6L2Zvby9iYXIvYmF6LnR4dCIpKTsKLQkJCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSk7Ci0JCX0KLQotCQlleHBlY3RlZCA9IG5ldyBGaWxlW10geyBuZXcgRmlsZSgiLyIpLCBuZXcgRmlsZSgiL2ZvbyIpLCBuZXcgRmlsZSgiL2Zvby9iYXIiKSwgbmV3IEZpbGUoIi9mb28vYmFyL2Jhei50eHQiKSB9OwotCQlhY3R1YWwgPSB0aGlzLnBhdGhGaWxlcyhuZXcgRmlsZSgiL2Zvby9iYXIvYmF6LnR4dCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQotCQlleHBlY3RlZCA9IG5ldyBGaWxlW10geyBuZXcgRmlsZSgiZm9vIiksIG5ldyBGaWxlKCJmb28vYmFyIiksIG5ldyBGaWxlKCJmb28vYmFyL2Jhei50eHQiKSB9OwotCQlhY3R1YWwgPSB0aGlzLnBhdGhGaWxlcyhuZXcgRmlsZSgiZm9vL2Jhci9iYXoudHh0IikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpOwotCi0JCWV4cGVjdGVkID0gbmV3IEZpbGVbXSB7IG5ldyBGaWxlKCIuLiIpLCBuZXcgRmlsZSgiLi4vZm9vIiksIG5ldyBGaWxlKCIuLi9mb28vYmFyIiksIG5ldyBGaWxlKCIuLi9mb28vYmFyL2Jhei50eHQiKSB9OwotCQlhY3R1YWwgPSB0aGlzLnBhdGhGaWxlcyhuZXcgRmlsZSgiLi4vZm9vL2Jhci9iYXoudHh0IikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpOwotCi0JCWV4cGVjdGVkID0gbmV3IEZpbGVbXSB7IG5ldyBGaWxlKCIuIiksIG5ldyBGaWxlKCIuL2ZvbyIpLCBuZXcgRmlsZSgiLi9mb28vYmFyIiksIG5ldyBGaWxlKCIuL2Zvby9iYXIvYmF6LnR4dCIpIH07Ci0JCWFjdHVhbCA9IHRoaXMucGF0aEZpbGVzKG5ldyBGaWxlKCIuL2Zvby9iYXIvYmF6LnR4dCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQl9Ci0KLQlwcml2YXRlIEZpbGVbXSBwYXRoRmlsZXMoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiAoRmlsZVtdKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZVN0YXRpY01ldGhvZChGaWxlVG9vbHMuY2xhc3MsICJwYXRoRmlsZXMiLCBGaWxlLmNsYXNzLCBmaWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpdmVQYXJlbnRGaWxlKCkgewotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi4uIiksIHRoaXMucmVsYXRpdmVQYXJlbnRGaWxlKDEpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCIuLi8uLiIpLCB0aGlzLnJlbGF0aXZlUGFyZW50RmlsZSgyKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLi4vLi4vLi4iKSwgdGhpcy5yZWxhdGl2ZVBhcmVudEZpbGUoMykpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUZpbGUgZmlsZSA9IHRoaXMucmVsYXRpdmVQYXJlbnRGaWxlKDApOwotCQkJZmFpbCgiaW52YWxpZCByZXR1cm46ICIgKyBmaWxlKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQkJSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUgPSAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgZXguZ2V0Q2F1c2UoKTsKLQkJCQlpZiAoaXRlLmdldFRhcmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIHJlbGF0aXZlUGFyZW50RmlsZShpbnQgbGVuKSB7Ci0JCXJldHVybiAoRmlsZSkgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVTdGF0aWNNZXRob2QoRmlsZVRvb2xzLmNsYXNzLCAicmVsYXRpdmVQYXJlbnRGaWxlIiwgaW50LmNsYXNzLCBuZXcgSW50ZWdlcihsZW4pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvUmVsYXRpdmVGaWxlKCkgewotCQlTdHJpbmcgcHJlZml4ID0gVG9vbHMub3NJc1dpbmRvd3MoKSA/ICJDOiIgOiAiIjsKLQkJRmlsZSBmaWxlOwotCQlGaWxlIGRpcjsKLQkJRmlsZSByZWxhdGl2ZUZpbGU7Ci0KLQkJaWYgKFRvb2xzLm9zSXNXaW5kb3dzKCkpIHsKLQkJCS8vIG9uIFdpbmRvd3MsIGEgZHJpdmUgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGEgZmlsZSB0byBiZSBhYnNvbHV0ZSAoaS5lLiBub3QgcmVsYXRpdmUpCi0JCQl0aGlzLnZlcmlmeVVuY2hhbmdlZFJlbGF0aXZlRmlsZSgiL2RpcjEvZGlyMi9maWxlLnR4dCIsICJDOi9kaXIxL2RpcjIiKTsKLQkJCS8vIGRpZmZlcmVudCBkcml2ZXMKLQkJCXRoaXMudmVyaWZ5VW5jaGFuZ2VkUmVsYXRpdmVGaWxlKCJEOi9kaXIxL2RpcjIvZmlsZS50eHQiLCAiQzovZGlyMS9kaXIyIik7Ci0JCX0KLQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRSZWxhdGl2ZUZpbGUoImRpcjEvZGlyMi9maWxlLnR4dCIsIHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCXRoaXMudmVyaWZ5VW5jaGFuZ2VkUmVsYXRpdmVGaWxlKCIuL2RpcjEvZGlyMi9maWxlLnR4dCIsIHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCXRoaXMudmVyaWZ5VW5jaGFuZ2VkUmVsYXRpdmVGaWxlKCIuLi8uLi9kaXIxL2RpcjIvZmlsZS50eHQiLCBwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLiIpLCByZWxhdGl2ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiZmlsZS50eHQiKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvLi4vZGlyMi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiZmlsZS50eHQiKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoImRpcjMvZGlyNC9kaXI1L2ZpbGUudHh0IiksIHJlbGF0aXZlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2RpcjMvZGlyNC9kaXI1Iik7Ci0JCXJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCIuLi8uLi8uLi9maWxlLnR4dCIpLCByZWxhdGl2ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzIik7Ci0JCXJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCIuLi9maWxlLnR4dCIpLCByZWxhdGl2ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXJBL2RpckIvZGlyQy9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzL2RpcjQvZGlyNSIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLi4vLi4vLi4vZGlyQS9kaXJCL2RpckMvZmlsZS50eHQiKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi4uLy4uLy4uIiksIHJlbGF0aXZlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKHByZWZpeCArICIvTXkgRG9jdW1lbnRzL015IFdvcmtzcGFjZS9Qcm9qZWN0IDEvbGliL3RvcGxpbmsuamFyIik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvTXkgRG9jdW1lbnRzL015IFdvcmtzcGFjZS9Qcm9qZWN0IDEiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoImxpYi90b3BsaW5rLmphciIpLCByZWxhdGl2ZUZpbGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNoYW5nZWRSZWxhdGl2ZUZpbGUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgZGlyTmFtZSkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUoZGlyTmFtZSk7Ci0JCUZpbGUgcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMoZmlsZSwgcmVsYXRpdmVGaWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvQWJzb2x1dGVGaWxlKCkgewotCQlTdHJpbmcgcHJlZml4ID0gVG9vbHMub3NJc1dpbmRvd3MoKSA/ICJDOiIgOiAiIjsKLQkJRmlsZSBmaWxlOwotCQlGaWxlIGRpcjsKLQkJRmlsZSBhYnNvbHV0ZUZpbGU7Ci0KLQkJaWYgKFRvb2xzLm9zSXNXaW5kb3dzKCkpIHsKLQkJCS8vIG9uIFdpbmRvd3MsIGEgZHJpdmUgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGEgZmlsZSB0byBiZSBhYnNvbHV0ZSAoaS5lLiBub3QgcmVsYXRpdmUpCi0JCQl0aGlzLnZlcmlmeVVuY2hhbmdlZEFic29sdXRlRmlsZSgiQzovZGlyMS9kaXIyL2ZpbGUudHh0IiwgIkM6L2RpcjEvZGlyMiIpOwotCQkJLy8gZGlmZmVyZW50IGRyaXZlcwotCQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUoIkQ6L2RpcjEvZGlyMi9maWxlLnR4dCIsICJDOi9kaXIxL2RpcjIiKTsKLQkJfQotCQl0aGlzLnZlcmlmeVVuY2hhbmdlZEFic29sdXRlRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9maWxlLnR4dCIsIHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCXRoaXMudmVyaWZ5VW5jaGFuZ2VkQWJzb2x1dGVGaWxlKHByZWZpeCArICIvLi9kaXIxL2RpcjIvZmlsZS50eHQiLCBwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQl0aGlzLnZlcmlmeVVuY2hhbmdlZEFic29sdXRlRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi8uLi8uLi9kaXIxL2RpcjIvZmlsZS50eHQiLCBwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiLiIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiLi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9maWxlLnR4dCIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi4uL2RpcjIvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoImRpcjMvZGlyNC9kaXI1L2ZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2RpcjMvZGlyNC9kaXI1L2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi8uLi8uLi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzL2RpcjQvZGlyNSIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9maWxlLnR4dCIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCS8vIHRvbyBtYW55ICIuLiIgZGlyZWN0b3JpZXMgd2lsbCByZXNvbHZlIHRvIHRoZSByb290OwotCQkvLyB0aGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBXaW5kb3dzIGFuZCBMaW51eCBjb21tYW5kIHNoZWxscwotCQlmaWxlID0gbmV3IEZpbGUoIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2ZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZmlsZS50eHQiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi4uL2ZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2RpcjMiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi4uLy4uLy4uL2RpckEvZGlyQi9kaXJDL2ZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2RpcjMvZGlyNC9kaXI1Iik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2RpckEvZGlyQi9kaXJDL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi8uLi8uLiIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzL2RpcjQvZGlyNSIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgibGliL3RvcGxpbmsuamFyIik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvTXkgRG9jdW1lbnRzL015IFdvcmtzcGFjZS9Qcm9qZWN0IDEiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9NeSBEb2N1bWVudHMvTXkgV29ya3NwYWNlL1Byb2plY3QgMS9saWIvdG9wbGluay5qYXIiKSwgYWJzb2x1dGVGaWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZU5hbWVJc1Jlc2VydmVkKCkgewotCQlib29sZWFuIGV4cGVjdGVkID0gVG9vbHMub3NJc1dpbmRvd3MoKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJDT04iKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiY29uIikpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlTmFtZUlzUmVzZXJ2ZWQoImNPTiIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJBVVgiKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiQ09NMyIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJMUFQzIikpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlTmFtZUlzUmVzZXJ2ZWQoIm5VTCIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJQcm4iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMoKSB7Ci0JCWJvb2xlYW4gZXhwZWN0ZWQgPSBUb29scy5vc0lzV2luZG93cygpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCJDOi9DT04iKSkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCIvY29uL2ZvbyIpKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMobmV3IEZpbGUoImM6L3RlbXAvY09OIikpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhuZXcgRmlsZSgiYmFyLy9iYXovL0FVWCIpKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMobmV3IEZpbGUoIkNPTTMvL3R0dCIpKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMobmV3IEZpbGUoImQ6L0xQVDMveHh4IikpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhuZXcgRmlsZSgiYzovbXkgZG9jcyBhbmQgc3R1ZmYvdHVlc2RheS9uVUwiKSkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCJQcm4iKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaG9ydGVuRmlsZU5hbWVGaWxlKCkgewotCQlpZiAoVG9vbHMub3NJc1dpbmRvd3MoKSkgewotCQkJdGhpcy52ZXJpZnlTaG9ydGVuRmlsZU5hbWVGaWxlV2luKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnZlcmlmeVNob3J0ZW5GaWxlTmFtZUZpbGVOb25XaW4oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTaG9ydGVuRmlsZU5hbWVGaWxlV2luKCkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSgiQzpcXERvY3VtZW50cyBhbmQgU2V0dGluZ3NcXEFkbWluaXN0cmF0b3JcXERlc2t0b3BcXFByb2plY3RcXFRleHQudHh0Iik7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSk7Ci0JCWFzc2VydEVxdWFscygiQzpcXERvY3VtZW50cyBhbmQgU2V0dGluZ3NcXC4uLlxcRGVza3RvcFxcUHJvamVjdFxcVGV4dC50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydFRydWUoZmlsZU5hbWUubGVuZ3RoKCkgPD0gRmlsZVRvb2xzLk1BWElNVU1fU0hPUlRFTkVEX0ZJTEVfTkFNRV9MRU5HVEgpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiQzovIik7Ci0JCWZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlKTsKLQkJYXNzZXJ0RXF1YWxzKCJDOlxcIiwgZmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbGVOYW1lLmxlbmd0aCgpIDw9IEZpbGVUb29scy5NQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZU5vbldpbigpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoIi9ob21lL2FkbWluaXN0cmF0b3IvZG9jdW1lbnRzIGFuZCBzZXR0aW5ncy9kZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlKTsKLQkJYXNzZXJ0RXF1YWxzKCIvaG9tZS9hZG1pbmlzdHJhdG9yLy4uLi9kZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydFRydWUoZmlsZU5hbWUubGVuZ3RoKCkgPD0gRmlsZVRvb2xzLk1BWElNVU1fU0hPUlRFTkVEX0ZJTEVfTkFNRV9MRU5HVEgpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiL2hvbWUiKTsKLQkJZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoIi9ob21lIiwgZmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbGVOYW1lLmxlbmd0aCgpIDw9IEZpbGVUb29scy5NQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2hvcnRlbkZpbGVOYW1lRmlsZUludCgpIHsKLQkJaWYgKFRvb2xzLm9zSXNXaW5kb3dzKCkpIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZUludFdpbigpOwotCQl9IGVsc2UgewotCQkJdGhpcy52ZXJpZnlTaG9ydGVuRmlsZU5hbWVGaWxlSW50Tm9uV2luKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZUludFdpbigpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoIkM6XFxEb2N1bWVudHMgYW5kIFNldHRpbmdzXFxBZG1pbmlzdHJhdG9yXFxEZXNrdG9wXFxQcm9qZWN0XFxUZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKGZpbGUsIDMxKTsKLQkJYXNzZXJ0RXF1YWxzKCJDOlxcLi4uXFxEZXNrdG9wXFxQcm9qZWN0XFxUZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKDMxLCBmaWxlTmFtZS5sZW5ndGgoKSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCJDOi9UaGlzIGlzIHRoZSBmaWxlIG5hbWUudHh0Iik7Ci0JCWZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlLCAxMCk7Ci0JCWFzc2VydEVxdWFscygiQzpcXFRoaXMgaXMgdGhlIGZpbGUgbmFtZS50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydEVxdWFscygyOCwgZmlsZU5hbWUubGVuZ3RoKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTaG9ydGVuRmlsZU5hbWVGaWxlSW50Tm9uV2luKCkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSgiL2hvbWUvYWRtaW5pc3RyYXRvci9kb2N1bWVudHMgYW5kIHNldHRpbmdzL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKGZpbGUsIDMxKTsKLQkJYXNzZXJ0RXF1YWxzKCIvaG9tZS8uLi4vZGVza3RvcC9Qcm9qZWN0L1RleHQudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoMzQsIGZpbGVOYW1lLmxlbmd0aCgpKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi9UaGlzIGlzIHRoZSBmaWxlIG5hbWUudHh0Iik7Ci0JCWZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlLCAxMCk7Ci0JCWFzc2VydEVxdWFscygiL1RoaXMgaXMgdGhlIGZpbGUgbmFtZS50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydEVxdWFscygyNiwgZmlsZU5hbWUubGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaG9ydGVuRmlsZU5hbWVVUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKFRvb2xzLm9zSXNXaW5kb3dzKCkpIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lVVJMV2luKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTE5vbldpbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTFdpbigpIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsICIiLCAiQzovRG9jdW1lbnRzIGFuZCBTZXR0aW5ncy9BZG1pbmlzdHJhdG9yL0Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKHVybCk7Ci0JCWFzc2VydEVxdWFscygiQzpcXERvY3VtZW50cyBhbmQgU2V0dGluZ3NcXC4uLlxcRGVza3RvcFxcUHJvamVjdFxcVGV4dC50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydFRydWUoZmlsZU5hbWUubGVuZ3RoKCkgPD0gRmlsZVRvb2xzLk1BWElNVU1fU0hPUlRFTkVEX0ZJTEVfTkFNRV9MRU5HVEgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTaG9ydGVuRmlsZU5hbWVVUkxOb25XaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGUiLCAiIiwgIi9ob21lL2FkbWluaXN0cmF0b3IvZG9jdW1lbnRzIGFuZCBzZXR0aW5ncy9kZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZSh1cmwpOwotCQlhc3NlcnRFcXVhbHMoIi9ob21lL2FkbWluaXN0cmF0b3IvLi4uL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZS5sZW5ndGgoKSA8PSBGaWxlVG9vbHMuTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNob3J0ZW5GaWxlTmFtZVVSTEludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoVG9vbHMub3NJc1dpbmRvd3MoKSkgewotCQkJdGhpcy52ZXJpZnlTaG9ydGVuRmlsZU5hbWVVUkxJbnRXaW4oKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lVVJMSW50Tm9uV2luKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2hvcnRlbkZpbGVOYW1lVVJMSW50V2luKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVVSTCB1cmwgPSBuZXcgVVJMKCJmaWxlIiwgIiIsICIvQzovRG9jdW1lbnRzIGFuZCBTZXR0aW5ncy9BZG1pbmlzdHJhdG9yL0Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKHVybCwgMzEpOwotCQlhc3NlcnRFcXVhbHMoIkM6XFwuLi5cXERlc2t0b3BcXFByb2plY3RcXFRleHQudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoMzEsIGZpbGVOYW1lLmxlbmd0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2hvcnRlbkZpbGVOYW1lVVJMSW50Tm9uV2luKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVVSTCB1cmwgPSBuZXcgVVJMKCJmaWxlIiwgIiIsICIvaG9tZS9hZG1pbmlzdHJhdG9yL2RvY3VtZW50cyBhbmQgc2V0dGluZ3MvZGVza3RvcC9Qcm9qZWN0L1RleHQudHh0Iik7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUodXJsLCAzMSk7Ci0JCWFzc2VydEVxdWFscygiL2hvbWUvLi4uL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKDM0LCBmaWxlTmFtZS5sZW5ndGgoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2hhbmdlZEFic29sdXRlRmlsZShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBkaXJOYW1lKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJRmlsZSBkaXIgPSBuZXcgRmlsZShkaXJOYW1lKTsKLQkJRmlsZSBhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhmaWxlLCBhYnNvbHV0ZUZpbGUpOwotCX0KLQotCXByaXZhdGUgRmlsZSBidWlsZFRlbXBEaXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBidWlsZCBhIG5ldyBkaXJlY3RvcnkgZm9yIGVhY2ggdGVzdCwgdG8gcHJldmVudCBhbnkgY3Jvc3MtdGVzdCBlZmZlY3RzCi0JCUZpbGUgZGlyID0gRmlsZVRvb2xzLm5ld1RlbXBvcmFyeURpcmVjdG9yeSh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIi4iICsgdGhpcy5nZXROYW1lKCkpOwotCi0JCUZpbGUgZmlsZTBhID0gbmV3IEZpbGUoZGlyLCAiZmlsZTBhIik7Ci0JCWZpbGUwYS5jcmVhdGVOZXdGaWxlKCk7Ci0JCUZpbGUgZmlsZTBiID0gbmV3IEZpbGUoZGlyLCAiZmlsZTBiIik7Ci0JCWZpbGUwYi5jcmVhdGVOZXdGaWxlKCk7Ci0JCUZpbGUgZmlsZTBjID0gbmV3IEZpbGUoZGlyLCAiZmlsZTBjIik7Ci0JCWZpbGUwYy5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJRmlsZSBzdWJkaXIxID0gbmV3IEZpbGUoZGlyLCAic3ViZGlyMSIpOwotCQlzdWJkaXIxLm1rZGlyKCk7Ci0JCUZpbGUgZmlsZTFhID0gbmV3IEZpbGUoc3ViZGlyMSwgImZpbGUxYSIpOwotCQlmaWxlMWEuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIGZpbGUxYiA9IG5ldyBGaWxlKHN1YmRpcjEsICJmaWxlMWIiKTsKLQkJZmlsZTFiLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlGaWxlIHN1YmRpcjIgPSBuZXcgRmlsZShkaXIsICJzdWJkaXIyIik7Ci0JCXN1YmRpcjIubWtkaXIoKTsKLQkJRmlsZSBmaWxlMmEgPSBuZXcgRmlsZShzdWJkaXIyLCAiZmlsZTJhIik7Ci0JCWZpbGUyYS5jcmVhdGVOZXdGaWxlKCk7Ci0JCUZpbGUgZmlsZTJiID0gbmV3IEZpbGUoc3ViZGlyMiwgImZpbGUyYiIpOwotCQlmaWxlMmIuY3JlYXRlTmV3RmlsZSgpOwotCi0JCUZpbGUgc3ViZGlyMyA9IG5ldyBGaWxlKHN1YmRpcjIsICJzdWJkaXIzIik7Ci0JCXN1YmRpcjMubWtkaXIoKTsKLQkJRmlsZSBmaWxlM2EgPSBuZXcgRmlsZShzdWJkaXIzLCAiZmlsZTNhIik7Ci0JCWZpbGUzYS5jcmVhdGVOZXdGaWxlKCk7Ci0JCUZpbGUgZmlsZTNiID0gbmV3IEZpbGUoc3ViZGlyMywgImZpbGUzYiIpOwotCQlmaWxlM2IuY3JlYXRlTmV3RmlsZSgpOwotCi0JCXJldHVybiBkaXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZURpcihGaWxlIGRpcikgewotCQlGaWxlVG9vbHMuZGVsZXRlRGlyZWN0b3J5KGRpcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvRmlsdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9GaWx0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGVjOGNlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9GaWx0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBGaWx0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBGaWx0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbEZpbHRlcigpIHsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gRmlsdGVyLlRyYW5zcGFyZW50Lmluc3RhbmNlKCk7Ci0JCWFzc2VydFRydWUoZmlsdGVyLmFjY2VwdCgiIikpOwotCQlhc3NlcnRUcnVlKGZpbHRlci5hY2NlcHQoImZvbyIpKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXIuYWNjZXB0KCJiYXIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxGaWx0ZXJfdG9TdHJpbmcoKSB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IEZpbHRlci5UcmFuc3BhcmVudC5pbnN0YW5jZSgpOwotCQlhc3NlcnROb3ROdWxsKGZpbHRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbEZpbHRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IEZpbHRlci5UcmFuc3BhcmVudC5pbnN0YW5jZSgpOwotCQlhc3NlcnRTYW1lKGZpbHRlciwgVGVzdFRvb2xzLnNlcmlhbGl6ZShmaWx0ZXIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3BhcXVlRmlsdGVyKCkgewotCQlGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSBGaWx0ZXIuT3BhcXVlLmluc3RhbmNlKCk7Ci0JCWFzc2VydEZhbHNlKGZpbHRlci5hY2NlcHQoIiIpKTsKLQkJYXNzZXJ0RmFsc2UoZmlsdGVyLmFjY2VwdCgiZm9vIikpOwotCQlhc3NlcnRGYWxzZShmaWx0ZXIuYWNjZXB0KCJiYXIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9wYXF1ZUZpbHRlcl90b1N0cmluZygpIHsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gRmlsdGVyLk9wYXF1ZS5pbnN0YW5jZSgpOwotCQlhc3NlcnROb3ROdWxsKGZpbHRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3BhcXVlRmlsdGVyX3NlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gRmlsdGVyLk9wYXF1ZS5pbnN0YW5jZSgpOwotCQlhc3NlcnRTYW1lKGZpbHRlciwgVGVzdFRvb2xzLnNlcmlhbGl6ZShmaWx0ZXIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRGaWx0ZXIoKSB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IEZpbHRlci5EaXNhYmxlZC5pbnN0YW5jZSgpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRGYWxzZShmaWx0ZXIuYWNjZXB0KCJmb28iKSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkRmlsdGVyX3RvU3RyaW5nKCkgewotCQlGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSBGaWx0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChmaWx0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkRmlsdGVyX3NlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gRmlsdGVyLkRpc2FibGVkLmluc3RhbmNlKCk7Ci0JCWFzc2VydFNhbWUoZmlsdGVyLCBUZXN0VG9vbHMuc2VyaWFsaXplKGZpbHRlcikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9IYXNoQmFnVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9IYXNoQmFnVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyYTEwYi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSGFzaEJhZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBIYXNoQmFnVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBIYXNoQmFnPFN0cmluZz4gYmFnOwotCi0JcHVibGljIEhhc2hCYWdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmJhZyA9IHRoaXMuYnVpbGRCYWcoKTsKLQl9Ci0KLQlwcml2YXRlIEhhc2hCYWc8U3RyaW5nPiBidWlsZEJhZygpIHsKLQkJSGFzaEJhZzxTdHJpbmc+IGIgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCWIuYWRkKG51bGwpOwotCQliLmFkZChuZXcgU3RyaW5nKCJvbmUiKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoInR3byIpKTsKLQkJYi5hZGQobmV3IFN0cmluZygidHdvIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJ0aHJlZSIpKTsKLQkJYi5hZGQobmV3IFN0cmluZygidGhyZWUiKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoInRocmVlIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQlyZXR1cm4gYjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZChuZXcgU3RyaW5nKCJmb28iKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoImZvbyIpKTsKLQkJYy5hZGQobmV3IFN0cmluZygiYmFyIikpOwotCQljLmFkZChuZXcgU3RyaW5nKCJiYXIiKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoImJhciIpKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN0b3JDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCUJhZzxTdHJpbmc+IGIgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KGMpOwotCQlmb3IgKFN0cmluZyBzIDogYykgewotCQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zKHMpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdG9ySW50RmxvYXQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQ7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMuYmFnID0gbmV3IEhhc2hCYWc8U3RyaW5nPigtMjAsIDAuNjZmKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMuYmFnID0gbmV3IEhhc2hCYWc8U3RyaW5nPigyMCwgLTAuNjZmKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJLy8gdGhlIG90aGVyIGFkZHMgdG9vayBwbGFjZSBpbiBzZXRVcAotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmFkZCgiZml2ZSIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoImZvdXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoImZpdmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZENvdW50KCkgewotCQkvLyB0aGUgb3RoZXIgYWRkcyB0b29rIHBsYWNlIGluIHNldFVwCi0JCXRoaXMuYmFnLmFkZCgibWludXMzIiwgLTMpOwotCQl0aGlzLmJhZy5hZGQoInplcm8iLCAwKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIiwgNSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoIm1pbnVzMyIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoInplcm8iKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmJhZy5jb3VudCgib25lIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5iYWcuY291bnQoInR3byIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuYmFnLmNvdW50KCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuYmFnLmNvdW50KCJmb3VyIikpOwotCQlhc3NlcnRFcXVhbHMoNSwgdGhpcy5iYWcuY291bnQoImZpdmUiKSk7Ci0KLQkJdGhpcy5iYWcuYWRkKCJ0aHJlZSIsIDIpOwotCQlhc3NlcnRFcXVhbHMoNSwgdGhpcy5iYWcuY291bnQoInRocmVlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGwoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5hZGRBbGwoYykpOwotCQlmb3IgKFN0cmluZyBzIDogYykgewotCQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhzKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygiZm91ciIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgdGhpcy5iYWcuc2l6ZSgpKTsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygiZm91ciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMobnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5iYWcuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCUJhZzxTdHJpbmc+IGJhZzIgPSB0aGlzLmJhZy5jbG9uZSgpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnICE9IGJhZzIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcsIGJhZzIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmhhc2hDb2RlKCkgPT0gYmFnMi5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMobnVsbCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoImZvdXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMobmV3IFN0cmluZygiZm91ciIpKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoImZvIiArICJ1ciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoImZpdmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZChudWxsKTsKLQkJYy5hZGQobmV3IFN0cmluZygib25lIikpOwotCQljLmFkZChuZXcgU3RyaW5nKCJ0d28iKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoInRocmVlIikpOwotCQljLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zQWxsKGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q291bnQoKSB7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmJhZy5jb3VudCgiemVybyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuYmFnLmNvdW50KCJvbmUiKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLmJhZy5jb3VudCgidHdvIikpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5iYWcuY291bnQoInRocmVlIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5iYWcuY291bnQoImZvdXIiKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmJhZy5jb3VudCgiZml2ZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotCQlCYWc8U3RyaW5nPiBiYWcyID0gdGhpcy5idWlsZEJhZygpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcsIGJhZzIpOwotCQliYWcyLmFkZCgiZml2ZSIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5lcXVhbHMoYmFnMikpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPih0aGlzLmJhZyk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmVxdWFscyhjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotCQlCYWc8U3RyaW5nPiBiYWcyID0gdGhpcy5idWlsZEJhZygpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcuaGFzaENvZGUoKSwgYmFnMi5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuaXNFbXB0eSgpKTsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5pc0VtcHR5KCkpOwotCQl0aGlzLmJhZy5hZGQoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUl0ZXJhdG9yKCkgewotCQl0aGlzLmJhZy5jbGVhcigpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDExLCBpKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCB0aGlzLmJhZy5zaXplKCkpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLml0ZXJhdG9yKCk7Ci0JCXRoaXMuYmFnLmFkZCgiZml2ZSIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUl0ZXJhdG9yKCkgewotCQlpbnQgaSA9IDA7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJhZy51bmlxdWVJdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNSwgaSk7Ci0JCWFzc2VydEZhbHNlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbChlbGVtZW50LnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCk7Ci0JCU9iamVjdCBuZXh0ID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSAmJiAhImZvdXIiLmVxdWFscyhuZXh0KSkgewotCQkJbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHRoaXMuYmFnLnNpemUoKSk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW50cmllcygpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxCYWcuRW50cnk8U3RyaW5nPj4gaXRlcmF0b3IgPSB0aGlzLmJhZy5lbnRyaWVzKCk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg1LCBpKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcuZW50cmllcygpOwotCQlCYWcuRW50cnk8U3RyaW5nPiBuZXh0ID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0LmdldEVsZW1lbnQoKS5lcXVhbHMoImZvdXIiKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscyg3LCB0aGlzLmJhZy5zaXplKCkpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLmVudHJpZXMoKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaGluZ0Rpc3RyaWJ1dGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlCYWc8U3RyaW5nPiBiaWdCYWcgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgewotCQkJYmlnQmFnLmFkZCgib2JqZWN0IiArIGkpOwotCQl9Ci0KLQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZmllbGQgPSBiaWdCYWcuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJ0YWJsZSIpOwotCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQlPYmplY3RbXSB0YWJsZSA9IChPYmplY3RbXSkgZmllbGQuZ2V0KGJpZ0JhZyk7Ci0JCWludCBidWNrZXRDb3VudCA9IHRhYmxlLmxlbmd0aDsKLQkJaW50IGZpbGxlZEJ1Y2tldENvdW50ID0gMDsKLQkJZm9yIChPYmplY3QgbyA6IHRhYmxlKSB7Ci0JCQlpZiAobyAhPSBudWxsKSB7Ci0JCQkJZmlsbGVkQnVja2V0Q291bnQrKzsKLQkJCX0KLQkJfQotCQlmbG9hdCBsb2FkRmFjdG9yID0gKChmbG9hdCkgZmlsbGVkQnVja2V0Q291bnQpIC8gKChmbG9hdCkgYnVja2V0Q291bnQpOwotCQlpZiAoKGxvYWRGYWN0b3IgPCAwLjIwKSB8fCAobG9hZEZhY3RvciA+IDAuODApKSB7Ci0JCQlTdHJpbmcgbXNnID0gInBvb3IgbG9hZCBmYWN0b3I6ICIgKyBsb2FkRmFjdG9yOwotCQkJaWYgKFRvb2xzLmp2bUlzU3VuKCkpIHsKLQkJCQlmYWlsKG1zZyk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHBvb3IgbG9hZCBmYWN0b3IgaXMgc2VlbiBpbiB0aGUgRWNsaXBzZSBidWlsZCBlbnZpcm9ubWVudCBmb3Igc29tZSByZWFzb24uLi4KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICcuJyArIHRoaXMuZ2V0TmFtZSgpICsgIiAtICIgKyBtc2cpOwotCQkJCVRlc3RUb29scy5wcmludFN5c3RlbVByb3BlcnRpZXMoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgib25lIikpOwotCi0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJ0d28iKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgidHdvIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb3VudCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJvbmUiLCAwKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSgib25lIiwgMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoIm9uZSIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoInR3byIsIC0zKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJ0d28iLCAxKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSgidHdvIiwgMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoInR3byIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSgidGhyZWUiLCAzKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZUFsbChjKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgidGhyZWUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZUFsbChjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidGhyZWUiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZXRhaW5BbGwoYykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygiZm91ciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgiZm91ciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmV0YWluQWxsKGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5zaXplKCkgPT0gMTEpOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCXRoaXMuYmFnLmFkZCgiZml2ZSIpOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCWFzc2VydEVxdWFscygxNiwgdGhpcy5iYWcuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlCYWc8U3RyaW5nPiBiYWcyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZSh0aGlzLmJhZyk7Ci0KLQkJYXNzZXJ0VHJ1ZSgic2FtZSBvYmplY3Q/IiwgdGhpcy5iYWcgIT0gYmFnMik7Ci0JCWFzc2VydEVxdWFscygxMSwgYmFnMi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcsIGJhZzIpOwotCQkvLyBsb29rIGZvciBzaW1pbGFyIGVsZW1lbnRzCi0JCWFzc2VydFRydWUoYmFnMi5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydFRydWUoYmFnMi5jb250YWlucygib25lIikpOwotCQlhc3NlcnRUcnVlKGJhZzIuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZShiYWcyLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZShiYWcyLmNvbnRhaW5zKCJmb3VyIikpOwotCi0JCWludCBudWxsQ291bnQgPSAwLCBvbmVDb3VudCA9IDAsIHR3b0NvdW50ID0gMCwgdGhyZWVDb3VudCA9IDAsIGZvdXJDb3VudCA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBiYWcyKSB7Ci0JCQlpZiAocyA9PSBudWxsKSB7Ci0JCQkJbnVsbENvdW50Kys7Ci0JCQl9IGVsc2UgaWYgKHMuZXF1YWxzKCJvbmUiKSkgewotCQkJCW9uZUNvdW50Kys7Ci0JCQl9IGVsc2UgaWYgKHMuZXF1YWxzKCJ0d28iKSkgewotCQkJCXR3b0NvdW50Kys7Ci0JCQl9IGVsc2UgaWYgKHMuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdGhyZWVDb3VudCsrOwotCQkJfSBlbHNlIGlmIChzLmVxdWFscygiZm91ciIpKSB7Ci0JCQkJZm91ckNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDEsIG51bGxDb3VudCk7Ci0JCWFzc2VydEVxdWFscygxLCBvbmVDb3VudCk7Ci0JCWFzc2VydEVxdWFscygyLCB0d29Db3VudCk7Ci0JCWFzc2VydEVxdWFscygzLCB0aHJlZUNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGZvdXJDb3VudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvQXJyYXkoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJhZy50b0FycmF5KCk7Ci0JCWFzc2VydEVxdWFscygxMSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgbnVsbCkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIm9uZSIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0d28iKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAiZm91ciIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1sxMl07Ci0JCWFbMTFdID0gIm5vdCBudWxsIjsKLQkJU3RyaW5nW10gYiA9IHRoaXMuYmFnLnRvQXJyYXkoYSk7Ci0JCWFzc2VydEVxdWFscyhhLCBiKTsKLQkJYXNzZXJ0RXF1YWxzKDEyLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCBudWxsKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAib25lIikpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJmb3VyIikpOwotCQlhc3NlcnRUcnVlKGFbMTFdID09IG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJU3RyaW5nIHMgPSB0aGlzLmJhZy50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHMuc3RhcnRzV2l0aCgiWyIpKTsKLQkJYXNzZXJ0VHJ1ZShzLmVuZHNXaXRoKCJdIikpOwotCQlpbnQgY29tbWFDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAocy5jaGFyQXQoaSkgPT0gJywnKSB7Ci0JCQkJY29tbWFDb3VudCsrOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygxMCwgY29tbWFDb3VudCk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJvbmUiKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJ0d28iKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJ0aHJlZSIpICE9IC0xKTsKLQkJYXNzZXJ0VHJ1ZShzLmluZGV4T2YoImZvdXIiKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJudWxsIikgIT0gLTEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0lkZW50aXR5SGFzaEJhZ1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSWRlbnRpdHlIYXNoQmFnVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3MzhiZC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSWRlbnRpdHlIYXNoQmFnVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSWRlbnRpdHlIYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSWRlbnRpdHlIYXNoQmFnVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBiYWc7Ci0JcHJpdmF0ZSBTdHJpbmcgb25lID0gIm9uZSI7Ci0JcHJpdmF0ZSBTdHJpbmcgdHdvID0gInR3byI7Ci0JcHJpdmF0ZSBTdHJpbmcgdGhyZWUgPSAidGhyZWUiOwotCXByaXZhdGUgU3RyaW5nIGZvdXIgPSAiZm91ciI7Ci0JcHJpdmF0ZSBTdHJpbmcgZm9vID0gImZvbyI7Ci0JcHJpdmF0ZSBTdHJpbmcgYmFyID0gImJhciI7Ci0KLQlwdWJsaWMgSWRlbnRpdHlIYXNoQmFnVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5iYWcgPSB0aGlzLmJ1aWxkQmFnKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBidWlsZEJhZygpIHsKLQkJSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4gcmVzdWx0ID0gbmV3IElkZW50aXR5SGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQobnVsbCk7Ci0JCXJlc3VsdC5hZGQodGhpcy5vbmUpOwotCQlyZXN1bHQuYWRkKHRoaXMudHdvKTsKLQkJcmVzdWx0LmFkZCh0aGlzLnR3byk7Ci0JCXJlc3VsdC5hZGQodGhpcy50aHJlZSk7Ci0JCXJlc3VsdC5hZGQodGhpcy50aHJlZSk7Ci0JCXJlc3VsdC5hZGQodGhpcy50aHJlZSk7Ci0JCXJlc3VsdC5hZGQodGhpcy5mb3VyKTsKLQkJcmVzdWx0LmFkZCh0aGlzLmZvdXIpOwotCQlyZXN1bHQuYWRkKHRoaXMuZm91cik7Ci0JCXJlc3VsdC5hZGQodGhpcy5mb3VyKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQodGhpcy5mb28pOwotCQljLmFkZCh0aGlzLmZvbyk7Ci0JCWMuYWRkKHRoaXMuYmFyKTsKLQkJYy5hZGQodGhpcy5iYXIpOwotCQljLmFkZCh0aGlzLmJhcik7Ci0JCXJldHVybiBjOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q3RvckNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4gbG9jYWxCYWcgPSBuZXcgSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4oYyk7Ci0JCWZvciAoU3RyaW5nIHMgOiBjKSB7Ci0JCQlhc3NlcnRUcnVlKGxvY2FsQmFnLmNvbnRhaW5zKHMpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q3RvckludEZsb2F0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0OwotCQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5iYWcgPSBuZXcgSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4oLTIwLCAwLjY2Zik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5iYWcgPSBuZXcgSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4oMjAsIC0wLjY2Zik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQkvLyB0aGUgb3RoZXIgYWRkcyB0b29rIHBsYWNlIGluIHNldFVwCi0JCVN0cmluZyBmaXZlID0gImZpdmUiOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmFkZChmaXZlKSk7Ci0JCi0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhmaXZlKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb3VudCgpIHsKLQkJU3RyaW5nIG1pbnVzMyA9ICJtaW51czMiOwotCQlTdHJpbmcgemVybyA9ICJ6ZXJvIjsKLQkJU3RyaW5nIGZpdmUgPSAiZml2ZSI7Ci0JCS8vIHRoZSBvdGhlciBhZGRzIHRvb2sgcGxhY2UgaW4gc2V0VXAKLQkJdGhpcy5iYWcuYWRkKG1pbnVzMywgLTMpOwotCQl0aGlzLmJhZy5hZGQoemVybywgMCk7Ci0JCXRoaXMuYmFnLmFkZChmaXZlLCA1KTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyhtaW51czMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoemVybykpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5iYWcuY291bnQodGhpcy5vbmUpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuYmFnLmNvdW50KHRoaXMudHdvKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLmJhZy5jb3VudCh0aGlzLnRocmVlKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLmJhZy5jb3VudCh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHRoaXMuYmFnLmNvdW50KGZpdmUpKTsKLQotCQl0aGlzLmJhZy5hZGQodGhpcy50aHJlZSwgMik7Ci0JCWFzc2VydEVxdWFscyg1LCB0aGlzLmJhZy5jb3VudCh0aGlzLnRocmVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmFkZEFsbChjKSk7Ci0JCWZvciAoU3RyaW5nIHMgOiBjKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHMpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgdGhpcy5iYWcuc2l6ZSgpKTsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50d28pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50aHJlZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMobnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5iYWcuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBiYWcyID0gdGhpcy5iYWcuY2xvbmUoKTsKLQkJYXNzZXJ0VHJ1ZSgiYmFkIGNsb25lIiwgdGhpcy5iYWcgIT0gYmFnMik7Ci0JCWFzc2VydEVxdWFscygiYmFkIGNsb25lIiwgdGhpcy5iYWcsIGJhZzIpOwotCQlhc3NlcnRUcnVlKCJiYWQgY2xvbmUiLCB0aGlzLmJhZy5oYXNoQ29kZSgpID09IGJhZzIuaGFzaENvZGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWlucygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyhuZXcgU3RyaW5nKCJmb3VyIikpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoImZpdmUiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQobnVsbCk7Ci0JCWMuYWRkKHRoaXMub25lKTsKLQkJYy5hZGQodGhpcy50d28pOwotCQljLmFkZCh0aGlzLnRocmVlKTsKLQkJYy5hZGQodGhpcy5mb3VyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWluc0FsbChjKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcodGhpcy5mb3VyKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zQWxsKGMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvdW50KCkgewotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5iYWcuY291bnQoInplcm8iKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmJhZy5jb3VudCgib25lIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5iYWcuY291bnQoInR3byIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuYmFnLmNvdW50KCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuYmFnLmNvdW50KCJmb3VyIikpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5iYWcuY291bnQoImZpdmUiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCUlkZW50aXR5SGFzaEJhZzxTdHJpbmc+IGJhZzIgPSB0aGlzLmJ1aWxkQmFnKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhZywgYmFnMik7Ci0JCWJhZzIuYWRkKCJmaXZlIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmVxdWFscyhiYWcyKSk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHRoaXMuYmFnKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuZXF1YWxzKGMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotCQlJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBiYWcyID0gdGhpcy5idWlsZEJhZygpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcuaGFzaENvZGUoKSwgYmFnMi5oYXNoQ29kZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRW1wdHkoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmlzRW1wdHkoKSk7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuaXNFbXB0eSgpKTsKLQkJdGhpcy5iYWcuYWRkKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuaXNFbXB0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5SXRlcmF0b3IoKSB7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJhZy5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0JCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDExLCBpKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgZWxlbWVudCwgZXhDYXVnaHQpOwotCQotCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCB0aGlzLmJhZy5zaXplKCkpOwotCQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDUsIGkpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoZWxlbWVudC50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCS8vIHN0YXJ0IG92ZXIKLQkJaXRlcmF0b3IgPSB0aGlzLmJhZy51bmlxdWVJdGVyYXRvcigpOwotCQlPYmplY3QgbmV4dCA9IG51bGw7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkgJiYgIXRoaXMuZm91ci5lcXVhbHMobmV4dCkpIHsKLQkJCW5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCWFzc2VydEVxdWFscyg3LCB0aGlzLmJhZy5zaXplKCkpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBmaXZlID0gImZpdmUiOwotCQl0aGlzLmJhZy5hZGQoZml2ZSk7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW50cmllcygpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmFnLkVudHJ5PFN0cmluZz4+IGl0ZXJhdG9yID0gdGhpcy5iYWcuZW50cmllcygpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNSwgaSk7Ci0JCWFzc2VydEZhbHNlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbChlbGVtZW50LnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLmVudHJpZXMoKTsKLQkJb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZy5FbnRyeTxTdHJpbmc+IG5leHQgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQluZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQuZ2V0RWxlbWVudCgpLmVxdWFscyh0aGlzLmZvdXIpKSB7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDcsIHRoaXMuYmFnLnNpemUoKSk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcuZW50cmllcygpOwotCQlTdHJpbmcgZml2ZSA9ICJmaXZlIjsKLQkJdGhpcy5iYWcuYWRkKGZpdmUpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hpbmdEaXN0cmlidXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4gYmlnQmFnID0gbmV3IElkZW50aXR5SGFzaEJhZzxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgewotCQkJYmlnQmFnLmFkZCgib2JqZWN0IiArIGkpOwotCQl9Ci0JCi0JCWphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGZpZWxkID0gYmlnQmFnLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgidGFibGUiKTsKLQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJT2JqZWN0W10gdGFibGUgPSAoT2JqZWN0W10pIGZpZWxkLmdldChiaWdCYWcpOwotCQlpbnQgYnVja2V0Q291bnQgPSB0YWJsZS5sZW5ndGg7Ci0JCWludCBmaWxsZWRCdWNrZXRDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVja2V0Q291bnQ7IGkrKykgewotCQkJaWYgKHRhYmxlW2ldICE9IG51bGwpIHsKLQkJCQlmaWxsZWRCdWNrZXRDb3VudCsrOwotCQkJfQotCQl9Ci0JCWZsb2F0IGxvYWRGYWN0b3IgPSAoKGZsb2F0KSBmaWxsZWRCdWNrZXRDb3VudCkgLyAoKGZsb2F0KSBidWNrZXRDb3VudCk7Ci0JCWlmICgobG9hZEZhY3RvciA8IDAuMjApIHx8IChsb2FkRmFjdG9yID4gMC44MCkpIHsKLQkJCVN0cmluZyBtc2cgPSAicG9vciBsb2FkIGZhY3RvcjogIiArIGxvYWRGYWN0b3I7Ci0JCQlpZiAoVG9vbHMuanZtSXNTdW4oKSkgewotCQkJCWZhaWwobXNnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gcG9vciBsb2FkIGZhY3RvciBpcyBzZWVuIGluIHRoZSBFY2xpcHNlIGJ1aWxkIGVudmlyb25tZW50IGZvciBzb21lIHJlYXNvbi4uLgotCQkJCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgJy4nICsgdGhpcy5nZXROYW1lKCkgKyAiIC0gIiArIG1zZyk7Ci0JCQkJVGVzdFRvb2xzLnByaW50U3lzdGVtUHJvcGVydGllcygpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKHRoaXMub25lKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMub25lKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLm9uZSkpOwotCQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnR3bykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28pKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUobmV3IFN0cmluZyh0aGlzLnRocmVlKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ291bnQoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLm9uZSwgMCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMub25lKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUodGhpcy5vbmUsIDEpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMub25lKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMudHdvLCAtMykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnR3bywgMSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudHdvKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28sIDEpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50d28pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMudHdvKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50aHJlZSwgMykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnRocmVlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnRocmVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQodGhpcy5vbmUpOwotCQljLmFkZChuZXcgU3RyaW5nKHRoaXMudHdvKSk7Ci0JCWMuYWRkKHRoaXMudGhyZWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZUFsbChjKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMub25lKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy50d28pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50aHJlZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlQWxsKGMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQodGhpcy5vbmUpOwotCQljLmFkZChuZXcgU3RyaW5nKHRoaXMudHdvKSk7Ci0JCWMuYWRkKHRoaXMudGhyZWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJldGFpbkFsbChjKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50d28pKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnRocmVlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMuZm91cikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMuZm91cikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZXRhaW5BbGwoYykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5zaXplKCkgPT0gMTEpOwotCQlTdHJpbmcgZml2ZSA9ICJmaXZlIjsKLQkJdGhpcy5iYWcuYWRkKGZpdmUpOwotCQl0aGlzLmJhZy5hZGQoZml2ZSk7Ci0JCXRoaXMuYmFnLmFkZChmaXZlKTsKLQkJdGhpcy5iYWcuYWRkKGZpdmUpOwotCQl0aGlzLmJhZy5hZGQobmV3IFN0cmluZyhmaXZlKSk7Ci0JCWFzc2VydEVxdWFscygxNiwgdGhpcy5iYWcuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4gYmFnMiA9IFRlc3RUb29scy5zZXJpYWxpemUodGhpcy5iYWcpOwotCQotCQlhc3NlcnRUcnVlKCJzYW1lIG9iamVjdD8iLCB0aGlzLmJhZyAhPSBiYWcyKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBiYWcyLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYmFnLml0ZXJhdG9yKCkpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGJhZzIuaXRlcmF0b3IoKSkpOwotCQkvLyBsb29rIGZvciBzaW1pbGFyIGVsZW1lbnRzCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmJhZyhiYWcyLml0ZXJhdG9yKCkpLmNvbnRhaW5zKG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYmFnKGJhZzIuaXRlcmF0b3IoKSkuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYmFnKGJhZzIuaXRlcmF0b3IoKSkuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYmFnKGJhZzIuaXRlcmF0b3IoKSkuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5iYWcoYmFnMi5pdGVyYXRvcigpKS5jb250YWlucygiZm91ciIpKTsKLQkKLQkJaW50IG51bGxDb3VudCA9IDAsIG9uZUNvdW50ID0gMCwgdHdvQ291bnQgPSAwLCB0aHJlZUNvdW50ID0gMCwgZm91ckNvdW50ID0gMDsKLQkJZm9yIChTdHJpbmcgbmV4dCA6IGJhZzIpIHsKLQkJCWlmIChuZXh0ID09IG51bGwpCi0JCQkJbnVsbENvdW50Kys7Ci0JCQllbHNlIGlmIChuZXh0LmVxdWFscygib25lIikpCi0JCQkJb25lQ291bnQrKzsKLQkJCWVsc2UgaWYgKG5leHQuZXF1YWxzKCJ0d28iKSkKLQkJCQl0d29Db3VudCsrOwotCQkJZWxzZSBpZiAobmV4dC5lcXVhbHMoInRocmVlIikpCi0JCQkJdGhyZWVDb3VudCsrOwotCQkJZWxzZSBpZiAobmV4dC5lcXVhbHMoImZvdXIiKSkKLQkJCQlmb3VyQ291bnQrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMSwgbnVsbENvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9uZUNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHR3b0NvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRocmVlQ291bnQpOwotCQlhc3NlcnRFcXVhbHMoNCwgZm91ckNvdW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRvQXJyYXkoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJhZy50b0FycmF5KCk7Ci0JCWFzc2VydEVxdWFscygxMSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgbnVsbCkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgdGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIHRoaXMudHdvKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCB0aGlzLnRocmVlKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCB0aGlzLmZvdXIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRvQXJyYXlPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMTJdOwotCQlhWzExXSA9ICJub3QgbnVsbCI7Ci0JCVN0cmluZ1tdIGIgPSB0aGlzLmJhZy50b0FycmF5KGEpOwotCQlhc3NlcnRFcXVhbHMoYSwgYik7Ci0JCWFzc2VydEVxdWFscygxMiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgbnVsbCkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgdGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIHRoaXMudHdvKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCB0aGlzLnRocmVlKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCB0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0VHJ1ZShhWzExXSA9PSBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlTdHJpbmcgcyA9IHRoaXMuYmFnLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocy5zdGFydHNXaXRoKCJbIikpOwotCQlhc3NlcnRUcnVlKHMuZW5kc1dpdGgoIl0iKSk7Ci0JCWludCBjb21tYUNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChzLmNoYXJBdChpKSA9PSAnLCcpIHsKLQkJCQljb21tYUNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIG51bWJlciBvZiBjb21tYXMiLCAxMCwgY29tbWFDb3VudCk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJvbmUiKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJ0d28iKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJ0aHJlZSIpICE9IC0xKTsKLQkJYXNzZXJ0VHJ1ZShzLmluZGV4T2YoImZvdXIiKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJudWxsIikgIT0gLTEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0luZGVudGluZ1ByaW50V3JpdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9JbmRlbnRpbmdQcmludFdyaXRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZDMzMWIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0luZGVudGluZ1ByaW50V3JpdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5JbmRlbnRpbmdQcmludFdyaXRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSW5kZW50aW5nUHJpbnRXcml0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlTdHJpbmdXcml0ZXIgc3cxOwotCVN0cmluZ1dyaXRlciBzdzI7Ci0JSW5kZW50aW5nUHJpbnRXcml0ZXIgaXB3MTsKLQlJbmRlbnRpbmdQcmludFdyaXRlciBpcHcyOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotCXB1YmxpYyBJbmRlbnRpbmdQcmludFdyaXRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3cxID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQl0aGlzLmlwdzEgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIodGhpcy5zdzEpOwotCQl0aGlzLnN3MiA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJdGhpcy5pcHcyID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKHRoaXMuc3cyLCAiICAgICIpOyAvLyBpbmRlbnQgd2l0aCA0IHNwYWNlcyBpbnN0ZWFkIG9mIGEgdGFiCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRlbnQoKSB7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMCwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCQl0aGlzLmlwdzEuaW5kZW50KCk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMSwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbnQoKSB7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMCwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCQl0aGlzLmlwdzEuaW5kZW50KCk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMSwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCQl0aGlzLmlwdzEudW5kZW50KCk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMCwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmNyZW1lbnRJbmRlbnRMZXZlbCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAwLCB0aGlzLmlwdzEuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JCXRoaXMuaXB3MS5pbmNyZW1lbnRJbmRlbnRMZXZlbCgpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDEsIHRoaXMuaXB3MS5nZXRJbmRlbnRMZXZlbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVjcmVtZW50SW5kZW50TGV2ZWwoKSB7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMCwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCQl0aGlzLmlwdzEuaW5jcmVtZW50SW5kZW50TGV2ZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAxLCB0aGlzLmlwdzEuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JCXRoaXMuaXB3MS5kZWNyZW1lbnRJbmRlbnRMZXZlbCgpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDAsIHRoaXMuaXB3MS5nZXRJbmRlbnRMZXZlbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbnRUYWIoKSB7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJmb28wIiArIENSICsgIlx0Zm9vMSIgKyBDUiArICJcdGZvbzEiICsgQ1IgKyAiXHRcdGZvbzIiICsgQ1IgKyAiXHRmb28xIiArIENSICsgIlx0Zm9vMSIgKyBDUiArICJmb28wIiArIENSOwotCi0JCXRoaXMuaXB3MS5wcmludGxuKCJmb28wIik7Ci0JCXRoaXMuaXB3MS5pbmRlbnQoKTsKLQkJdGhpcy5pcHcxLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcxLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcxLmluZGVudCgpOwotCQl0aGlzLmlwdzEucHJpbnRsbigiZm9vMiIpOwotCQl0aGlzLmlwdzEudW5kZW50KCk7Ci0JCXRoaXMuaXB3MS5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3MS5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3MS51bmRlbnQoKTsKLQkJdGhpcy5pcHcxLnByaW50bG4oImZvbzAiKTsKLQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIG91dHB1dCIsIGV4cGVjdGVkLCB0aGlzLnN3MS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbnRTcGFjZXMoKSB7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJmb28wIiArIENSICsgIiAgICBmb28xIiArIENSICsgIiAgICBmb28xIiArIENSICsgIiAgICAgICAgZm9vMiIgKyBDUiArICIgICAgZm9vMSIgKyBDUiArICIgICAgZm9vMSIgKyBDUiArICJmb28wIiArIENSOwotCi0JCXRoaXMuaXB3Mi5wcmludGxuKCJmb28wIik7Ci0JCXRoaXMuaXB3Mi5pbmRlbnQoKTsKLQkJdGhpcy5pcHcyLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcyLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcyLmluZGVudCgpOwotCQl0aGlzLmlwdzIucHJpbnRsbigiZm9vMiIpOwotCQl0aGlzLmlwdzIudW5kZW50KCk7Ci0JCXRoaXMuaXB3Mi5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3Mi5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3Mi51bmRlbnQoKTsKLQkJdGhpcy5pcHcyLnByaW50bG4oImZvbzAiKTsKLQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIG91dHB1dCIsIGV4cGVjdGVkLCB0aGlzLnN3Mi50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KREJDVHlwZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSkRCQ1R5cGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODUzNDYzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KREJDVHlwZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuc3FsLlR5cGVzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSkRCQ1R5cGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpEQkNUeXBlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgSkRCQ1R5cGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZXNTaXplKCkgewotCQlhc3NlcnRFcXVhbHMoVHlwZXMuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKS5sZW5ndGgsIEpEQkNUeXBlLnR5cGVzKCkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZSgpIHsKLQkJSkRCQ1R5cGUgamRiY1R5cGU7Ci0JCWpkYmNUeXBlID0gSkRCQ1R5cGUudHlwZShUeXBlcy5WQVJDSEFSKTsKLQkJYXNzZXJ0RXF1YWxzKCJWQVJDSEFSIiwgamRiY1R5cGUubmFtZSgpKTsKLQotCQlqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoVHlwZXMuSU5URUdFUik7Ci0JCWFzc2VydEVxdWFscygiSU5URUdFUiIsIGpkYmNUeXBlLm5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvZGUoKSB7Ci0JCUpEQkNUeXBlIGpkYmNUeXBlOwotCQlqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoVHlwZXMuVkFSQ0hBUik7Ci0JCWFzc2VydEVxdWFscyhUeXBlcy5WQVJDSEFSLCBqZGJjVHlwZS5jb2RlKCkpOwotCi0JCWpkYmNUeXBlID0gSkRCQ1R5cGUudHlwZShUeXBlcy5JTlRFR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKFR5cGVzLklOVEVHRVIsIGpkYmNUeXBlLmNvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRUeXBlQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKREJDVHlwZSBqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoNTUpOwotCQkJZmFpbCgiaW52YWxpZCBKREJDVHlwZTogIiArIGpkYmNUeXBlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRUeXBlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKREJDVHlwZSBqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoIlZBUkNIQVIyIik7Ci0JCQlmYWlsKCJpbnZhbGlkIEpEQkNUeXBlOiAiICsgamRiY1R5cGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KYXZhVHlwZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSmF2YVR5cGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTA3YTAyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KYXZhVHlwZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkphdmFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVKYXZhVHlwZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmF2YVR5cGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBKYXZhVHlwZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRWxlbWVudFR5cGVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKG51bGwsIDApOwotCQkJZmFpbCgiaW52YWxpZCBKYXZhVHlwZTogIiArIGphdmFUeXBlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRFbGVtZW50VHlwZUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKCIiLCAwKTsKLQkJCWZhaWwoImludmFsaWQgSmF2YVR5cGU6ICIgKyBqYXZhVHlwZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRWxlbWVudFR5cGVBcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKYXZhVHlwZSBqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MuZ2V0TmFtZSgpLCAwKTsKLQkJCWZhaWwoImludmFsaWQgSmF2YVR5cGU6ICIgKyBqYXZhVHlwZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQXJyYXlEZXB0aE5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3QuY2xhc3MuZ2V0TmFtZSgpLCAtMik7Ci0JCQlmYWlsKCJpbnZhbGlkIEphdmFUeXBlOiAiICsgamF2YVR5cGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFZvaWRBcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKYXZhVHlwZSBqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzLmdldE5hbWUoKSwgMik7Ci0JCQlmYWlsKCJpbnZhbGlkIEphdmFUeXBlOiAiICsgamF2YVR5cGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudFR5cGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlOwotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgamF2YVR5cGUuZ2V0RWxlbWVudFR5cGVOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgamF2YVR5cGUuZ2V0RWxlbWVudFR5cGVOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKHZvaWQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBqYXZhVHlwZS5nZXRFbGVtZW50VHlwZU5hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcCRFbnRyeSIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcCRFbnRyeSIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlEZXB0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqYXZhVHlwZTsKLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygxLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludFtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGphdmFUeXBlLmdldEFycmF5RGVwdGgoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUodm9pZC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoMCwgamF2YVR5cGUuZ2V0QXJyYXlEZXB0aCgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygyLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlOwotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MpOwotCQlhc3NlcnRUcnVlKGphdmFUeXBlLmlzQXJyYXkoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuaXNBcnJheSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5SmF2YUNsYXNzKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhpbnQuY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhpbnRbXS5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5SmF2YUNsYXNzKHZvaWQuY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlKYXZhQ2xhc3MoamF2YS51dGlsLk1hcC5FbnRyeVtdW10uY2xhc3MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlKYXZhQ2xhc3MoQ2xhc3M8Pz4gamF2YUNsYXNzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSmF2YVR5cGUgamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YUNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFDbGFzcywgamF2YVR5cGUuZ2V0SmF2YUNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhQ2xhc3NOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlOwotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgamF2YVR5cGUuZ2V0SmF2YUNsYXNzTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoIltMamF2YS5sYW5nLk9iamVjdDsiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgamF2YVR5cGUuZ2V0SmF2YUNsYXNzTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiW0kiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKHZvaWQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5NYXAkRW50cnkiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJbW0xqYXZhLnV0aWwuTWFwJEVudHJ5OyIsIGphdmFUeXBlLmdldEphdmFDbGFzc05hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlc2NyaWJlcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeURlc2NyaWJlcyhqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoaW50LmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoaW50W10uY2xhc3MpOwotCQl0aGlzLnZlcmlmeURlc2NyaWJlcyh2b2lkLmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5RGVzY3JpYmVzKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGVzY3JpYmVzKENsYXNzPD8+IGphdmFDbGFzcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmFDbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuZGVzY3JpYmVzKGphdmFDbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWNsYXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqYXZhVHlwZTsKLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIGphdmFUeXBlLmRlY2xhcmF0aW9uKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdFtdIiwgamF2YVR5cGUuZGVjbGFyYXRpb24oKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBqYXZhVHlwZS5kZWNsYXJhdGlvbigpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiaW50W10iLCBqYXZhVHlwZS5kZWNsYXJhdGlvbigpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2b2lkIiwgamF2YVR5cGUuZGVjbGFyYXRpb24oKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcC5FbnRyeSIsIGphdmFUeXBlLmRlY2xhcmF0aW9uKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTWFwLkVudHJ5W11bXSIsIGphdmFUeXBlLmRlY2xhcmF0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1ByaW1pdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqYXZhVHlwZTsKLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JCWFzc2VydEZhbHNlKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEZhbHNlKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludC5jbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuaXNQcmltaXRpdmUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50W10uY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNQcmltaXRpdmUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeVtdW10uY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KcHRDb21tb25VdGlsaXR5VGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KcHRDb21tb25VdGlsaXR5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyYmFkOC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSnB0Q29tbW9uVXRpbGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLmNvbW1hbmQuSnB0VXRpbGl0eUNvbW1hbmRUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuZW51bWVyYXRpb25zLkpwdFV0aWxpdHlFbnVtZXJhdGlvbnNUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzLkpwdFV0aWxpdHlJdGVyYWJsZXNUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzLkpwdFV0aWxpdHlJdGVyYXRvcnNUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwuSnB0VXRpbGl0eU1vZGVsVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm5vZGUuSnB0VXRpbGl0eU5vZGVUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuc3luY2hyb25pemVycy5KcHRVdGlsaXR5U3luY2hyb25pemVyc1Rlc3RzOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdENvbW1vblV0aWxpdHlUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0Q29tbW9uVXRpbGl0eVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3QoSnB0VXRpbGl0eUNvbW1hbmRUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVdGlsaXR5RW51bWVyYXRpb25zVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0VXRpbGl0eUl0ZXJhYmxlc1Rlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlJdGVyYXRvcnNUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVdGlsaXR5TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVdGlsaXR5Tm9kZVRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlTeW5jaHJvbml6ZXJzVGVzdHMuc3VpdGUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFycmF5VG9vbHNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShCYWdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShCaWRpRmlsdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQmlkaVN0cmluZ0NvbnZlcnRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJpZGlUcmFuc2Zvcm1lclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJpdFRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlQm9vbGVhblJlZmVyZW5jZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJvb2xlYW5Ub29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENsYXNzcGF0aFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENsYXNzTmFtZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbGxlY3Rpb25Ub29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEV4Y2VwdGlvbkhhbmRsZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShGaWxlVG9vbHNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShGaWx0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShIYXNoQmFnVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSWRlbnRpdHlIYXNoQmFnVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSW5kZW50aW5nUHJpbnRXcml0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVJbnRSZWZlcmVuY2VUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhVHlwZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpEQkNUeXBlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoS2V5ZWRTZXRUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMaXN0ZW5lckxpc3RUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNZXRob2RTaWduYXR1cmVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOYW1lVG9vbHNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOb3ROdWxsRmlsdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmFuZ2VUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWZsZWN0aW9uVG9vbHNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZXZlcnNlQ29tcGFyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZUFzc29jaWF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlT2JqZWN0UmVmZXJlbmNlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlUXVldWVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVTdGFja1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN0cmluZ1Rvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3luY2hyb25pemVkQm9vbGVhblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN5bmNocm9uaXplZEludFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN5bmNocm9uaXplZE9iamVjdFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN5bmNocm9uaXplZFF1ZXVlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3luY2hyb25pemVkU3RhY2tUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUb29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFZlcnNpb25Db21wYXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWE1MU3RyaW5nRW5jb2RlclRlc3RzLmNsYXNzKTsKLQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRDb21tb25VdGlsaXR5VGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9LZXllZFNldFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvS2V5ZWRTZXRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzI3ZTVkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9LZXllZFNldFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLktleWVkU2V0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBLZXllZFNldFRlc3RzCi0JCWV4dGVuZHMgVGVzdENhc2UgewotCQotCXByaXZhdGUgS2V5ZWRTZXQ8U3RyaW5nLCBTdHJpbmc+IG5pY2tuYW1lczsKLQkKLQkKLQlwdWJsaWMgS2V5ZWRTZXRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5uaWNrbmFtZXMgPSB0aGlzLmJ1aWxkTmlja25hbWVzKCk7Ci0JfQotCQotCXByaXZhdGUgS2V5ZWRTZXQ8U3RyaW5nLCBTdHJpbmc+IGJ1aWxkTmlja25hbWVzKCkgewotCQlLZXllZFNldDxTdHJpbmcsIFN0cmluZz4ga3MgPSBuZXcgS2V5ZWRTZXQ8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCWtzLmFkZEl0ZW0oIkppbW15IiwgIkphbWVzIFN1bGxpdmFuIik7Ci0JCWtzLmFkZEtleSgiU3VsbHkiLCAiSmFtZXMgU3VsbGl2YW4iKTsKLQkJa3MuYWRkSXRlbSgiQm9iIiwgIlJvYmVydCBNY0tlbm5hIik7Ci0JCWtzLmFkZEtleSgiTWFjIiwgIlJvYmVydCBNY0tlbm5hIik7Ci0JCXJldHVybiBrczsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbSgpIHsKLQkJLy8gaXRlbXMgYWRkZWQgaW4gc2V0dXAKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0l0ZW0oIkphbWVzIFN1bGxpdmFuIikpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zSXRlbSgiUm9iZXJ0IE1jS2VubmEiKSk7Ci0JCQotCQlhc3NlcnRGYWxzZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0l0ZW0oIkpvaG4gVGVhc2RhbGUiKSk7Ci0JCXRoaXMubmlja25hbWVzLmFkZEl0ZW0oIkphY2siLCAiSm9obiBUZWFzZGFsZSIpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zSXRlbSgiSm9obiBUZWFzZGFsZSIpKTsKLQkJCi0JCXRoaXMubmlja25hbWVzLmFkZEl0ZW0oIlRlYXNlciIsICJKb2huIFRlYXNkYWxlIik7Ci0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNJdGVtKCJKb2huIFRlYXNkYWxlIikpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJUZWFzZXIiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRLZXkoKSB7Ci0JCS8vIGl0ZW1zIGFkZGVkIGluIHNldHVwCi0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNLZXkoIkppbW15IikpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJTdWxseSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiQm9iIikpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJNYWMiKSk7Ci0JCQotCQlhc3NlcnRGYWxzZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiUm9iYmllIikpOwotCQl0aGlzLm5pY2tuYW1lcy5hZGRLZXkoIlJvYmJpZSIsICJSb2JlcnQgTWNLZW5uYSIpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJSb2JiaWUiKSk7Ci0JCQotCQlib29sZWFuIGV4Y2VwdGlvbkNhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5uaWNrbmFtZXMuYWRkS2V5KCJUZWFzZXIiLCAiSm9obiBUZWFzZGFsZSIpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQlleGNlcHRpb25DYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhjZXB0aW9uQ2F1Z2h0KTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJdGVtKCkgewotCQkvLyBpdGVtcyBhZGRlZCBpbiBzZXR1cAotCQlhc3NlcnRFcXVhbHModGhpcy5uaWNrbmFtZXMuZ2V0SXRlbSgiSmltbXkiKSwgIkphbWVzIFN1bGxpdmFuIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm5pY2tuYW1lcy5nZXRJdGVtKCJTdWxseSIpLCAiSmFtZXMgU3VsbGl2YW4iKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubmlja25hbWVzLmdldEl0ZW0oIkJvYiIpLCAiUm9iZXJ0IE1jS2VubmEiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubmlja25hbWVzLmdldEl0ZW0oIk1hYyIpLCAiUm9iZXJ0IE1jS2VubmEiKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLm5pY2tuYW1lcy5nZXRJdGVtKCJKYWNrIikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbSgpIHsKLQkJLy8gaXRlbXMgYWRkZWQgaW4gc2V0dXAKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0l0ZW0oIkphbWVzIFN1bGxpdmFuIikpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJKaW1teSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiU3VsbHkiKSk7Ci0JCQotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLnJlbW92ZUl0ZW0oIkphbWVzIFN1bGxpdmFuIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0l0ZW0oIkphbWVzIFN1bGxpdmFuIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiSmltbXkiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJTdWxseSIpKTsKLQkJCi0JCWFzc2VydEZhbHNlKHRoaXMubmlja25hbWVzLnJlbW92ZUl0ZW0oIldpbGxpYW0gR29sZGJlcmciKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVLZXkoKSB7Ci0JCS8vIGl0ZW1zIGFkZGVkIGluIHNldHVwCi0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNJdGVtKCJKYW1lcyBTdWxsaXZhbiIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiSmltbXkiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNLZXkoIlN1bGx5IikpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5yZW1vdmVLZXkoIkppbW15IikpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zSXRlbSgiSmFtZXMgU3VsbGl2YW4iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJKaW1teSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiU3VsbHkiKSk7Ci0JCQotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLnJlbW92ZUtleSgiU3VsbHkiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zSXRlbSgiSmFtZXMgU3VsbGl2YW4iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJKaW1teSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5uaWNrbmFtZXMuY29udGFpbnNLZXkoIlN1bGx5IikpOwotCQkKLQkJYXNzZXJ0RmFsc2UodGhpcy5uaWNrbmFtZXMucmVtb3ZlS2V5KCJCaWxseSIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTGlzdGVuZXJMaXN0VGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9MaXN0ZW5lckxpc3RUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGQwZjUyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9MaXN0ZW5lckxpc3RUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBMaXN0ZW5lckxpc3RUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBMaXN0ZW5lckxpc3RUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4oTGlzdGVuZXIuY2xhc3MpOwotCQlMaXN0ZW5lciBsaXN0ZW5lcjEgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlMaXN0ZW5lciBsaXN0ZW5lcjIgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlJdGVyYWJsZTxMaXN0ZW5lcj4gbGlzdGVuZXJzID0gbGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUobGlzdGVuZXJzKSk7Ci0KLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjEpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyMik7Ci0JCWxpc3RlbmVycyA9IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGxpc3RlbmVycykpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lcnMsIGxpc3RlbmVyMSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lcnMsIGxpc3RlbmVyMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4oTGlzdGVuZXIuY2xhc3MpOwotCQlMaXN0ZW5lciBsaXN0ZW5lcjEgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlMaXN0ZW5lciBsaXN0ZW5lcjIgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgbGlzdGVuZXJMaXN0LnNpemUoKSk7Ci0KLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjEpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyMik7Ci0JCWFzc2VydEVxdWFscygyLCBsaXN0ZW5lckxpc3Quc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIxID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0ZW5lckxpc3QuaXNFbXB0eSgpKTsKLQotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyMSk7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIyKTsKLQkJYXNzZXJ0RmFsc2UobGlzdGVuZXJMaXN0LmlzRW1wdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZF9udWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4oTGlzdGVuZXIuY2xhc3MpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlsaXN0ZW5lckxpc3QuYWRkKG51bGwpOwotCQkJZmFpbCgiaW52YWxpZCBsaXN0ZW5lciBsaXN0OiAiICsgbGlzdGVuZXJMaXN0KTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkX2R1cGxpY2F0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQkJCWZhaWwoImludmFsaWQgbGlzdGVuZXIgbGlzdDogIiArIGxpc3RlbmVyTGlzdCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyMSA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyMiA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIxKTsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjIpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCksIGxpc3RlbmVyMSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCksIGxpc3RlbmVyMikpOwotCi0JCWxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIxKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSwgbGlzdGVuZXIxKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSwgbGlzdGVuZXIyKSk7Ci0KLQkJbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcjIpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMobGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpLCBsaXN0ZW5lcjIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlX251bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWxpc3RlbmVyTGlzdC5yZW1vdmUobnVsbCk7Ci0JCQlmYWlsKCJpbnZhbGlkIGxpc3RlbmVyIGxpc3Q6ICIgKyBsaXN0ZW5lckxpc3QpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVfdW5yZWdpc3RlcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4oTGlzdGVuZXIuY2xhc3MpOwotCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCQlsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQkJCWZhaWwoImludmFsaWQgbGlzdGVuZXIgbGlzdDogIiArIGxpc3RlbmVyTGlzdCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIxID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjEpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyMik7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSwgbGlzdGVuZXIxKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSwgbGlzdGVuZXIyKSk7Ci0KLQkJbGlzdGVuZXJMaXN0LmNsZWFyKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCksIGxpc3RlbmVyMSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMobGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpLCBsaXN0ZW5lcjIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUaGlzIHRlc3QgZG9lc24ndCBwYXNzIGluIHRoZSBFY2xpcHNlIGJ1aWxkIGVudmlyb25tZW50IChMaW51eC9JQk0gVk0pIGZvciBzb21lIHJlYXNvbgotCQlpZiAoVG9vbHMuanZtSXNTdW4oKSkgewotCQkJdGhpcy52ZXJpZnlTZXJpYWxpemF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIxID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjEpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyMik7Ci0KLQkJTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShsaXN0ZW5lckxpc3QpOwotCQlhc3NlcnROb3RTYW1lKGxpc3RlbmVyTGlzdCwgbGlzdGVuZXJMaXN0Mik7Ci0JCWFzc2VydEVxdWFscygyLCBsaXN0ZW5lckxpc3QyLnNpemUoKSk7Ci0KLQkJTGlzdGVuZXIgbGlzdGVuZXIzID0gbmV3IE5vblNlcmlhbGl6YWJsZUxpc3RlbmVyKCk7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIzKTsKLQotCQlsaXN0ZW5lckxpc3QyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShsaXN0ZW5lckxpc3QpOwotCQlhc3NlcnROb3RTYW1lKGxpc3RlbmVyTGlzdCwgbGlzdGVuZXJMaXN0Mik7Ci0JCWFzc2VydEVxdWFscygyLCBsaXN0ZW5lckxpc3QyLnNpemUoKSk7Ci0KLQl9Ci0KLQlpbnRlcmZhY2UgTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQkJdm9pZCBzb21ldGhpbmdIYXBwZW5lZCgpOwotCX0KLQkKLQlzdGF0aWMgY2xhc3MgTG9jYWxMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RlbmVyLCBTZXJpYWxpemFibGUgewotCQlwdWJsaWMgdm9pZCBzb21ldGhpbmdIYXBwZW5lZCgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQkKLQlzdGF0aWMgY2xhc3MgTm9uU2VyaWFsaXphYmxlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHNvbWV0aGluZ0hhcHBlbmVkKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL01ldGhvZFNpZ25hdHVyZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTWV0aG9kU2lnbmF0dXJlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU1OGUyZi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTWV0aG9kU2lnbmF0dXJlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lk1ldGhvZFNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZU1ldGhvZFNpZ25hdHVyZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2lnbmF0dXJlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTWV0aG9kU2lnbmF0dXJlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgoU3RyaW5nKSBudWxsKTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWROYW1lRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUoIiIpOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBhcmFtZXRlclR5cGVzTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgiZm9vIiwgKEphdmFUeXBlW10pIG51bGwpOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBhcmFtZXRlclR5cGVzTnVsbEl0ZW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUoImZvbyIsIG5ldyBKYXZhVHlwZVsxXSk7Ci0JCQlmYWlsKCJpbnZhbGlkIE1ldGhvZFNpZ25hdHVyZTogIiArIG1ldGhvZFNpZ25hdHVyZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGFyYW1ldGVyVHlwZXNWb2lkSXRlbSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqdCA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCJmb28iLCBuZXcgSmF2YVR5cGVbXSB7anR9KTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJUeXBlTmFtZXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCJmb28iLCAoU3RyaW5nW10pIG51bGwpOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBhcmFtZXRlclR5cGVOYW1lc051bGxJdGVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCJmb28iLCBuZXcgU3RyaW5nWzFdKTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJKYXZhQ2xhc3Nlc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUoImZvbyIsIChDbGFzczw/PltdKSBudWxsKTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJKYXZhQ2xhc3Nlc051bGxJdGVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCJmb28iLCBuZXcgQ2xhc3NbMV0pOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2lnbmF0dXJlMCgpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QwIikpOwotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZDAoKSIsIG1zLmdldFNpZ25hdHVyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2lnbmF0dXJlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QxIikpOwotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZDEoaW50KSIsIG1zLmdldFNpZ25hdHVyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2lnbmF0dXJlMigpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QyIikpOwotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZDIoaW50LCBqYXZhLmxhbmcuU3RyaW5nKSIsIG1zLmdldFNpZ25hdHVyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2lnbmF0dXJlMygpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QzIikpOwotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZDMoaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W11bXSkiLCBtcy5nZXRTaWduYXR1cmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kU2lnbmF0dXJlIG1zID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtZXRob2QyIiwgbXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UGFyYW1ldGVyVHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kU2lnbmF0dXJlIG1zID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMyIpKTsKLQkJSmF2YVR5cGVbXSBleHBlY3RlZCA9IG5ldyBKYXZhVHlwZVszXTsKLQkJZXhwZWN0ZWRbMF0gPSBuZXcgU2ltcGxlSmF2YVR5cGUoImludCIpOwotCQlleHBlY3RlZFsxXSA9IG5ldyBTaW1wbGVKYXZhVHlwZSgiamF2YS5sYW5nLlN0cmluZyIpOwotCQlleHBlY3RlZFsyXSA9IG5ldyBTaW1wbGVKYXZhVHlwZSgiamF2YS5sYW5nLk9iamVjdCIsIDIpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIG1zLmdldFBhcmFtZXRlclR5cGVzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBtczEgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QzIikpOwotCQlPYmplY3QgbXMyID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMyIpKTsKLQkJYXNzZXJ0Tm90U2FtZShtczEsIG1zMik7Ci0JCWFzc2VydEVxdWFscyhtczEsIG1zMSk7Ci0JCWFzc2VydEVxdWFscyhtczEsIG1zMik7Ci0JCWFzc2VydEVxdWFscyhtczEuaGFzaENvZGUoKSwgbXMyLmhhc2hDb2RlKCkpOwotCi0JCU9iamVjdCBtczMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QyIikpOwotCQlhc3NlcnROb3RTYW1lKG1zMSwgbXMzKTsKLQkJYXNzZXJ0RmFsc2UobXMxLmVxdWFscyhtczMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTWV0aG9kU2lnbmF0dXJlIG1zMSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDMiKSk7Ci0JCVNpbXBsZU1ldGhvZFNpZ25hdHVyZSBtczIgPSAoU2ltcGxlTWV0aG9kU2lnbmF0dXJlKSBtczEuY2xvbmUoKTsKLQkJYXNzZXJ0Tm90U2FtZShtczEsIG1zMik7Ci0JCWFzc2VydEVxdWFscyhtczEsIG1zMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTWV0aG9kU2lnbmF0dXJlIG1zMSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDMiKSk7Ci0JCVNpbXBsZU1ldGhvZFNpZ25hdHVyZSBtczIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKG1zMSk7Ci0JCWFzc2VydE5vdFNhbWUobXMxLCBtczIpOwotCQlhc3NlcnRFcXVhbHMobXMxLCBtczIpOwotCX0KLQotCXByaXZhdGUgTWV0aG9kIGdldE1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlmb3IgKE1ldGhvZCBtZXRob2QgOiB0aGlzLmdldENsYXNzKCkuZ2V0TWV0aG9kcygpKSB7Ci0JCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kTmFtZSkpIHsKLQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1ldGhvZCBub3QgZm91bmQ6ICIgKyBtZXRob2ROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtZXRob2QwKCkgeyAvKiB1c2VkIGJ5IHRlc3RzICovIH0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgcHVibGljIHZvaWQgbWV0aG9kMShpbnQgZm9vKSB7IC8qIHVzZWQgYnkgdGVzdHMgKi8gfQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBwdWJsaWMgdm9pZCBtZXRob2QyKGludCBmb28sIFN0cmluZyBiYXIpIHsgLyogdXNlZCBieSB0ZXN0cyAqLyB9Ci0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIHB1YmxpYyB2b2lkIG1ldGhvZDMoaW50IGZvbywgU3RyaW5nIGJhciwgT2JqZWN0W11bXSBiYXopIHsgLyogdXNlZCBieSB0ZXN0cyAqLyB9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgcHVibGljIHZvaWQgbWV0aG9kQShpbnQgZm9vLCBTdHJpbmcgYmFyKSB7IC8qIHVzZWQgYnkgdGVzdHMgKi8gfQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBwdWJsaWMgdm9pZCBtZXRob2RBKGludCBmb28sIFN0cmluZyBiYXIsIFN0cmluZyBiYXopIHsgLyogdXNlZCBieSB0ZXN0cyAqLyB9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgcHVibGljIHZvaWQgbWV0aG9kQihpbnQgZm9vLCBPYmplY3QgYmFyKSB7IC8qIHVzZWQgYnkgdGVzdHMgKi8gfQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBwdWJsaWMgdm9pZCBtZXRob2RCKGludCBmb28sIFN0cmluZyBiYXIpIHsgLyogdXNlZCBieSB0ZXN0cyAqLyB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9NdWx0aVRocmVhZGVkVGVzdENhc2UuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9NdWx0aVRocmVhZGVkVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ5MjUzYS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTXVsdGlUaHJlYWRlZFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db21wb3NpdGVFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVGhpcyB0ZXN0IGNhc2UgaGVscHMgc2ltcGxpZnkgdGhlIHRlc3Rpbmcgb2YgbXVsdGktdGhyZWFkZWQgY29kZS4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi0JZXh0ZW5kcyBUZXN0Q2FzZQotewotCXByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFRocmVhZD4gdGhyZWFkcyA9IG5ldyBBcnJheUxpc3Q8VGhyZWFkPigpOwotCS8qIHByaXZhdGUgKi8gZmluYWwgVmVjdG9yPFRocm93YWJsZT4gZXhjZXB0aW9ucyA9IG5ldyBWZWN0b3I8VGhyb3dhYmxlPigpOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgInRpY2siIGlzIG9uZSBzZWNvbmQuCi0JICogU3BlY2lmeSB0aGUgYXBwcm9wcmlhdGUgc3lzdGVtIHByb3BlcnR5IHRvIG92ZXJyaWRlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJQ0tfU1lTVEVNX1BST1BFUlRZX05BTUUgPSAib3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLnRpY2siOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBUSUNLID0gTG9uZy5nZXRMb25nKFRJQ0tfU1lTVEVNX1BST1BFUlRZX05BTUUsIDEwMDApLmxvbmdWYWx1ZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBUV09fVElDS1MgPSAyICogVElDSzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVEhSRUVfVElDS1MgPSAzICogVElDSzsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIE11bHRpVGhyZWFkZWRUZXN0Q2FzZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lZCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JfQotCi0JLyoqCi0JICogU3RvcCBhbGwgdGhlIHRocmVhZHMgY29uc3RydWN0ZWQgZHVyaW5nIHRoZSB0ZXN0IGNhc2UuCi0JICogSWYgYW55IGV4Y2VwdGlvbnMgd2VyZSB0aHJvd24gYnkgdGhlIHRocmVhZHMsIHJlLXRocm93IHRoZW0gaGVyZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlmb3IgKFRocmVhZCB0aHJlYWQgOiB0aGlzLnRocmVhZHMpIHsKLQkJCWlmICh0aHJlYWQuaXNBbGl2ZSgpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGhyZWFkIGlzIHN0aWxsIGFsaXZlOiAiICsgdGhyZWFkKTsKLQkJCX0KLQkJfQotCQlpZiAoICEgdGhpcy5leGNlcHRpb25zLmlzRW1wdHkoKSkgewotCQkJdGhyb3cgbmV3IENvbXBvc2l0ZUV4Y2VwdGlvbih0aGlzLmV4Y2VwdGlvbnMpOwotCQl9Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGhyZWFkIGJ1aWxkVGhyZWFkKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGhyZWFkIGJ1aWxkVGhyZWFkKFJ1bm5hYmxlIHJ1bm5hYmxlLCBTdHJpbmcgbmFtZSkgewotCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZChuZXcgUnVubmFibGVXcmFwcGVyKHJ1bm5hYmxlKSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXRocmVhZC5zZXROYW1lKG5hbWUpOwotCQl9Ci0JCXRoaXMudGhyZWFkcy5hZGQodGhyZWFkKTsKLQkJcmV0dXJuIHRocmVhZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGhyZWFkRmFjdG9yeSBidWlsZFRocmVhZEZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFRocmVhZEZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdGhhdCBoYW5kbGVzIHtAbGluayBJbnRlcnJ1cHRlZEV4Y2VwdGlvbn0uCi0JICovCi0JcHVibGljIHZvaWQgc2xlZXAobG9uZyBtaWxsaXMpIHsKLQkJVGVzdFRvb2xzLnNsZWVwKG1pbGxpcyk7Ci0JfQotCi0KLQkvKioKLQkgKiBXcmFwIGEgcnVubmFibGUgYW5kIGxvZyBhbnkgZXhjZXB0aW9uIGl0IHRocm93cy4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgVGVzdFRocmVhZEZhY3RvcnkgaW1wbGVtZW50cyBUaHJlYWRGYWN0b3J5IHsKLQkJcHVibGljIFRocmVhZCBuZXdUaHJlYWQoUnVubmFibGUgcikgewotCQkJcmV0dXJuIE11bHRpVGhyZWFkZWRUZXN0Q2FzZS50aGlzLmJ1aWxkVGhyZWFkKHIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2ltcGxpZnkgcnVubmFibGVzIHRoYXQgZXhlY3V0ZSBjYWxsIHRoYXQgdGhyb3dzIGNoZWNrZWQgZXhjZXB0aW9ucy4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGVzdFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgewotCQlwdWJsaWMgZmluYWwgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCXRoaXMucnVuXygpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQl9Ci0JCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHJ1bl8oKSB0aHJvd3MgVGhyb3dhYmxlOwotCX0KLQotCS8qKgotCSAqIFdyYXAgYSBydW5uYWJsZSBhbmQgbG9nIGFueSBleGNlcHRpb24gaXQgdGhyb3dzLgotCSAqLwotCXByaXZhdGUgY2xhc3MgUnVubmFibGVXcmFwcGVyIGltcGxlbWVudHMgUnVubmFibGUgewotCQlwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlOwotCQlSdW5uYWJsZVdyYXBwZXIoUnVubmFibGUgcnVubmFibGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnJ1bm5hYmxlID0gcnVubmFibGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQl0aGlzLnJ1bm5hYmxlLnJ1bigpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJCU11bHRpVGhyZWFkZWRUZXN0Q2FzZS50aGlzLmV4Y2VwdGlvbnMuYWRkKGV4KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9OYW1lVG9vbHNUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL05hbWVUb29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ODZhYWIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL05hbWVUb29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5OYW1lVG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE5hbWVUb29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIE5hbWVUb29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdBYnNlbnRJZ25vcmVDYXNlKCkgewotCQlMaXN0PFN0cmluZz4gY29sb3JDb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbG9yQ29sbGVjdGlvbigpOwotCQlTdHJpbmcgcmV0dXJuZWQgPSBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIlRhdXBlIiwgY29sb3JDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJUYXVwZSIsIHJldHVybmVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nUHJlc2VudENhc2VEaWZmZXJzKCkgewotCQlMaXN0PFN0cmluZz4gY29sb3JDb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbG9yQ29sbGVjdGlvbigpOwotCQlTdHJpbmcgcmV0dXJuZWQgPSBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiZ3JlZW4iLCBjb2xvckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHMoImdyZWVuIiwgcmV0dXJuZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdQcmVzZW50SWdub3JlQ2FzZSgpIHsKLQkJTGlzdDxTdHJpbmc+IGNvbG9yQ29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xvckNvbGxlY3Rpb24oKTsKLQkJU3RyaW5nIHJldHVybmVkID0gTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJncmVlbiIsIGNvbG9yQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscygiZ3JlZW4yIiwgcmV0dXJuZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdQcmVzZW50V2l0aEFwcGVuZGljZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjb2xvckNvbGxlY3Rpb24gPSB0aGlzLmJ1aWxkQ29sb3JDb2xsZWN0aW9uKCk7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIlJlZDEiKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgicmVkMiIpOwotCQlTdHJpbmcgcmV0dXJuZWQgPSBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoInJlZCIsIGNvbG9yQ29sbGVjdGlvbik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5yZW1vdmUoIlJlZDEiKTsKLQkJY29sb3JDb2xsZWN0aW9uLnJlbW92ZSgicmVkMiIpOwotCQlhc3NlcnRFcXVhbHMoInJlZDMiLCByZXR1cm5lZCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRDb2xvckNvbGxlY3Rpb24oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjb2xvckNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiUmVkIik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIk9yYW5nZSIpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJZZWxsb3ciKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiR3JlZW4iKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiQmx1ZSIpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJJbmRpZ28iKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiVmlvbGV0Iik7Ci0JCXJldHVybiBjb2xvckNvbGxlY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZU5hbWVGb3JDb2xsZWN0aW9uMSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIENvcnBvcmF0aW9uIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUyIik7Ci0JCXN0cmluZ3MuYWRkKCJvcmFjbGUxIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbCIpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJPcmFjbGUiLCBzdHJpbmdzKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJUZXN0Iiwgc3RyaW5ncykpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiT3JhY2xlIiwgc3RyaW5ncykpOwotCQlhc3NlcnRFcXVhbHMoIm9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIm9yYWNsZSIsIHN0cmluZ3MpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJUZXN0Iiwgc3RyaW5ncykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVOYW1lRm9yQ29sbGVjdGlvbjIoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIm9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMiIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMSIpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJPcmFjbGUiLCBzdHJpbmdzKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJUZXN0Iiwgc3RyaW5ncykpOwotCi0JCXN0cmluZ3MuYWRkKCJPcmFjbGUgQ29ycG9yYXRpb24iKTsKLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJPcmFjbGUiLCBzdHJpbmdzKSk7Ci0JCWFzc2VydEVxdWFscygib3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgib3JhY2xlIiwgc3RyaW5ncykpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIlRlc3QiLCBzdHJpbmdzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZU5hbWVGb3JDb2xsZWN0aW9uMygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUyIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUxIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIk9yYWNsZSIsIHN0cmluZ3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlTmFtZUZvckl0ZXJhdG9yMSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIENvcnBvcmF0aW9uIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUyIik7Ci0JCXN0cmluZ3MuYWRkKCJvcmFjbGUxIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbCIpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJPcmFjbGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIlRlc3QiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIk9yYWNsZSIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoIm9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIm9yYWNsZSIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIlRlc3QiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlTmFtZUZvckl0ZXJhdG9yMigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgib3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUyIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUxIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIk9yYWNsZSIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiVGVzdCIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCi0JCXN0cmluZ3MuYWRkKCJPcmFjbGUgQ29ycG9yYXRpb24iKTsKLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJPcmFjbGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJvcmFjbGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJUZXN0Iiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZU5hbWVGb3JJdGVyYXRvcjMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMiIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMSIpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJPcmFjbGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVpbGRRdWFsaWZpZWREYXRhYmFzZU9iamVjdE5hbWUoKSB7Ci0JCWFzc2VydEVxdWFscygiY2F0YWxvZy5zY2hlbWEubmFtZSIsIE5hbWVUb29scy5idWlsZFF1YWxpZmllZERhdGFiYXNlT2JqZWN0TmFtZSgiY2F0YWxvZyIsICJzY2hlbWEiLCAibmFtZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjYXRhbG9nLi5uYW1lIiwgTmFtZVRvb2xzLmJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKCJjYXRhbG9nIiwgbnVsbCwgIm5hbWUiKSk7Ci0JCWFzc2VydEVxdWFscygic2NoZW1hLm5hbWUiLCBOYW1lVG9vbHMuYnVpbGRRdWFsaWZpZWREYXRhYmFzZU9iamVjdE5hbWUobnVsbCwgInNjaGVtYSIsICJuYW1lIikpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBOYW1lVG9vbHMuYnVpbGRRdWFsaWZpZWREYXRhYmFzZU9iamVjdE5hbWUobnVsbCwgbnVsbCwgIm5hbWUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFSZXNlcnZlZFdvcmRzKCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhOYW1lVG9vbHMuamF2YVJlc2VydmVkV29yZHMoKSwgImNsYXNzIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoTmFtZVRvb2xzLmphdmFSZXNlcnZlZFdvcmRzKCksICJDbGFzcyIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoTmFtZVRvb2xzLmphdmFSZXNlcnZlZFdvcmRzKCksICJwcml2YXRlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3Rjb252ZXJ0VG9KYXZhSWRlbnRpZmllclN0cmluZygpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28xIikpOwotCQlhc3NlcnRFcXVhbHMoInByaXZhdGVfIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJwcml2YXRlIikpOwotCQlhc3NlcnRFcXVhbHMoInRocm93XyIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigidGhyb3ciKSk7Ci0JCWFzc2VydEVxdWFscygiX2ZvbyIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiMWZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29fIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28lIikpOwotCQlhc3NlcnRFcXVhbHMoImZvb19fYmFyX18iLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoImZvbyAgYmFyICAiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdGNvbnZlcnRUb0phdmFJZGVudGlmaWVyU3RyaW5nQ2hhcigpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoImZvbyIsICckJykpOwotCQlhc3NlcnRFcXVhbHMoImZvbzEiLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoImZvbzEiLCAnJCcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcml2YXRlJCIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigicHJpdmF0ZSIsICckJykpOwotCQlhc3NlcnRFcXVhbHMoInRocm93c3MiLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoInRocm93IiwgJ3MnKSk7Ci0JCWFzc2VydEVxdWFscygiJGZvbyIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiMWZvbyIsICckJykpOwotCQlhc3NlcnRFcXVhbHMoImZvbyQiLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoImZvbyUiLCAnJCcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28kJGJhciQkIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28gIGJhciAgIiwgJyQnKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nIHMgPSBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoIjFmb28iLCAnNycpOwotCQkJZmFpbCgiaW52YWxpZCBzdHJpbmc6IFwiIiArIHMgKyAiXCIiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0TWVzc2FnZSgpLmluZGV4T2YoJzcnKSAhPSAtMSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nIHMgPSBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoImZvbyUiLCAnXicpOwotCQkJZmFpbCgiaW52YWxpZCBzdHJpbmc6IFwiIiArIHMgKyAiXCIiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0TWVzc2FnZSgpLmluZGV4T2YoJ14nKSAhPSAtMSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nIHMgPSBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoInByaXZhdGUiLCAnXicpOwotCQkJZmFpbCgiaW52YWxpZCBzdHJpbmc6IFwiIiArIHMgKyAiXCIiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0TWVzc2FnZSgpLmluZGV4T2YoJ14nKSAhPSAtMSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc0xlZ2FsSmF2YUlkZW50aWZpZXIoKSB7Ci0JCWFzc2VydEZhbHNlKE5hbWVUb29scy5zdHJpbmdJc0xlZ2FsSmF2YUlkZW50aWZpZXIoImNsYXNzIikpOwotCQlhc3NlcnRUcnVlKE5hbWVUb29scy5zdHJpbmdJc0xlZ2FsSmF2YUlkZW50aWZpZXIoImNsYXNTIikpOwotCi0JCWFzc2VydEZhbHNlKE5hbWVUb29scy5zdHJpbmdJc0xlZ2FsSmF2YUlkZW50aWZpZXIoIjdmb28iKSk7Ci0JCWFzc2VydEZhbHNlKE5hbWVUb29scy5zdHJpbmdJc0xlZ2FsSmF2YUlkZW50aWZpZXIoImZvb0BiYXIiKSk7Ci0JCWFzc2VydFRydWUoTmFtZVRvb2xzLnN0cmluZ0lzTGVnYWxKYXZhSWRlbnRpZmllcigiX2ZvbyIpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Ob3ROdWxsRmlsdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Ob3ROdWxsRmlsdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FmMDY3MC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTm90TnVsbEZpbHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLk5vdE51bGxGaWx0ZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE5vdE51bGxGaWx0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBOb3ROdWxsRmlsdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vdE51bGxGaWx0ZXIoKSB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IE5vdE51bGxGaWx0ZXIuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXIuYWNjZXB0KCIiKSk7Ci0JCWFzc2VydEZhbHNlKGZpbHRlci5hY2NlcHQobnVsbCkpOwotCQlhc3NlcnRUcnVlKGZpbHRlci5hY2NlcHQoImZvbyIpKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXIuYWNjZXB0KCJiYXIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSBOb3ROdWxsRmlsdGVyLmluc3RhbmNlKCk7Ci0JCWFzc2VydE5vdE51bGwoZmlsdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1JhbmdlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SYW5nZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZDk1OTIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1JhbmdlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SYW5nZTsKLQotcHVibGljIGNsYXNzIFJhbmdlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUmFuZ2VUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5jbHVkZXMoKSB7Ci0JCVJhbmdlIHJhbmdlID0gbmV3IFJhbmdlKDUsIDE3KTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UuaW5jbHVkZXMoLTU1KSk7Ci0JCWFzc2VydEZhbHNlKHJhbmdlLmluY2x1ZGVzKDApKTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UuaW5jbHVkZXMoNCkpOwotCQlhc3NlcnRUcnVlKHJhbmdlLmluY2x1ZGVzKDUpKTsKLQkJYXNzZXJ0VHJ1ZShyYW5nZS5pbmNsdWRlcyg2KSk7Ci0JCWFzc2VydFRydWUocmFuZ2UuaW5jbHVkZXMoMTYpKTsKLQkJYXNzZXJ0VHJ1ZShyYW5nZS5pbmNsdWRlcygxNykpOwotCQlhc3NlcnRGYWxzZShyYW5nZS5pbmNsdWRlcygxOCkpOwotCQlhc3NlcnRGYWxzZShyYW5nZS5pbmNsdWRlcygyMDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotCQlSYW5nZSByYW5nZTEgPSBuZXcgUmFuZ2UoNSwgMTcpOwotCQlSYW5nZSByYW5nZTIgPSBuZXcgUmFuZ2UoNSwgMTcpOwotCQlhc3NlcnROb3RTYW1lKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMiwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMS5oYXNoQ29kZSgpLCByYW5nZTIuaGFzaENvZGUoKSk7Ci0KLQkJcmFuZ2UyID0gbmV3IFJhbmdlKDE3LCA1KTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UxLmVxdWFscyhyYW5nZTIpKTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UyLmVxdWFscyhyYW5nZTEpKTsKLQkJLy8gYWx0aG91Z2ggdGhleSBhcmUgdW5lcXVhbCwgdGhleSBjYW4gaGF2ZSB0aGUgc2FtZSBoYXNoIGNvZGUKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMS5oYXNoQ29kZSgpLCByYW5nZTIuaGFzaENvZGUoKSk7Ci0KLQkJcmFuZ2UyID0gbmV3IFJhbmdlKDUsIDE1KTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UxLmVxdWFscyhyYW5nZTIpKTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UyLmVxdWFscyhyYW5nZTEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCVJhbmdlIHJhbmdlMSA9IG5ldyBSYW5nZSg1LCAxNyk7Ci0JCVJhbmdlIHJhbmdlMiA9IHJhbmdlMS5jbG9uZSgpOwotCQlhc3NlcnROb3RTYW1lKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMiwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMS5oYXNoQ29kZSgpLCByYW5nZTIuaGFzaENvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmFuZ2UgcmFuZ2UxID0gbmV3IFJhbmdlKDUsIDE3KTsKLQkJUmFuZ2UgcmFuZ2UyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShyYW5nZTEpOwotCQlhc3NlcnROb3RTYW1lKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMiwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMS5oYXNoQ29kZSgpLCByYW5nZTIuaGFzaENvZGUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmVmbGVjdGlvblRvb2xzVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SZWZsZWN0aW9uVG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjEwY2IwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SZWZsZWN0aW9uVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWZsZWN0aW9uVG9vbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0ZXN0U3RhdGljRmllbGQ7Ci0KLQlwdWJsaWMgUmVmbGVjdGlvblRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0vLyB0aGlzIGlzIG5vIGxvbmdlciB0cnVlIC0gaXQgYXBwZWFycyB0aGUgSkxTIG5vdyBkZWZpbmVzIHRoZSBnZW5lcmF0ZWQgbmFtZXMuLi4KLS8vCS8qKgotLy8JICogUmV0dXJuIHRoZSBjb21waWxlci1nZW5lcmF0ZWQgY2xhc3MgbmFtZS4gVGhlIEVjbGlwc2UgY29tcGlsZXIgZ2VuZXJhdGVzCi0vLwkgKiAibG9jYWwiIGNsYXNzZXMgd2l0aCBuYW1lcyBpbiB0aGUgZm9ybSAiY29tLmZvby5PdXRlciQxJExvY2FsIjsgd2hpbGUgdGhlCi0vLwkgKiBKREsgY29tcGlsZXIgZ2VuZXJhdGVzICJjb20uZm9vLk91dGVyJDFMb2NhbCIuIFRoZXJlIG1pZ2h0IGJlIG90aGVyCi0vLwkgKiBkaWZmZXJlbmNlcy4uLi4gfmJqdgotLy8JICovCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21waWxlckRlcGVuZGVudENsYXNzTmFtZUZvcihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0vLwkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoIiQxJCIpOwotLy8JCWlmIChpbmRleCA9PSAtMSkgewotLy8JCQlyZXR1cm4gY2xhc3NOYW1lOwotLy8JCX0KLS8vCQl0cnkgewotLy8JCQlDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0vLwkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotLy8JCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBpbmRleCArIDIpICsgY2xhc3NOYW1lLnN1YnN0cmluZyhpbmRleCArIDMpOwotLy8JCX0KLS8vCQlyZXR1cm4gY2xhc3NOYW1lOwotLy8JfQotLy8KLS8vCXByaXZhdGUgc3RhdGljIFN0cmluZyBtdW5nZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0vLwkJcmV0dXJuIGNvbXBpbGVyRGVwZW5kZW50Q2xhc3NOYW1lRm9yKGNsYXNzTmFtZSk7Ci0vLwl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsRmllbGRzKCkgewotCQlpbnQgZmllbGRDb3VudCA9IDA7Ci0JCWZpZWxkQ291bnQgKz0gamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpLmxlbmd0aDsKLQkJZmllbGRDb3VudCArPSBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0LmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCkubGVuZ3RoOwotCQlmaWVsZENvdW50ICs9IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24uY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKS5sZW5ndGg7Ci0JCWZpZWxkQ291bnQgKz0gamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpLmxlbmd0aDsKLQkJSXRlcmFibGU8RmllbGQ+IGZpZWxkcyA9IFJlZmxlY3Rpb25Ub29scy5nZXRBbGxGaWVsZHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscyhmaWVsZENvdW50LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShmaWVsZHMpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5maWVsZE5hbWVzKGZpZWxkcyksICJtb2RDb3VudCIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5maWVsZE5hbWVzKGZpZWxkcyksICJzZXJpYWxWZXJzaW9uVUlEIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmZpZWxkTmFtZXMoZmllbGRzKSwgImNhcGFjaXR5SW5jcmVtZW50IikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmZpZWxkTmFtZXMoZmllbGRzKSwgImVsZW1lbnRDb3VudCIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5maWVsZE5hbWVzKGZpZWxkcyksICJlbGVtZW50RGF0YSIpKTsKLQkJYXNzZXJ0VHJ1ZShmaWVsZHMuaXRlcmF0b3IoKS5uZXh0KCkuaXNBY2Nlc3NpYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxNZXRob2RzKCkgewotCQlpbnQgbWV0aG9kQ291bnQgPSAwOwotCQltZXRob2RDb3VudCArPSBqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpLmxlbmd0aDsKLQkJbWV0aG9kQ291bnQgKz0gamF2YS51dGlsLkFic3RyYWN0TGlzdC5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKS5sZW5ndGg7Ci0JCW1ldGhvZENvdW50ICs9IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24uY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkubGVuZ3RoOwotCQltZXRob2RDb3VudCArPSBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpLmxlbmd0aDsKLQkJSXRlcmFibGU8TWV0aG9kPiBtZXRob2RzID0gUmVmbGVjdGlvblRvb2xzLmdldEFsbE1ldGhvZHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscyhtZXRob2RDb3VudCwgQ29sbGVjdGlvblRvb2xzLnNpemUobWV0aG9kcykpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLm1ldGhvZE5hbWVzKG1ldGhvZHMpLCAid2FpdCIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5tZXRob2ROYW1lcyhtZXRob2RzKSwgImFkZEVsZW1lbnQiKSk7Ci0JCWFzc2VydFRydWUobWV0aG9kcy5pdGVyYXRvcigpLm5leHQoKS5pc0FjY2Vzc2libGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld0luc3RhbmNlQ2xhc3MoKSB7Ci0JCVZlY3Rvcjw/PiB2ID0gUmVmbGVjdGlvblRvb2xzLm5ld0luc3RhbmNlKGphdmEudXRpbC5WZWN0b3IuY2xhc3MpOwotCQlhc3NlcnROb3ROdWxsKHYpOwotCQlhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdJbnN0YW5jZUNsYXNzQ2xhc3NPYmplY3QoKSB7Ci0JCWludCBpbml0aWFsQ2FwYWNpdHkgPSAyMDA7Ci0JCVZlY3Rvcjw/PiB2ID0gUmVmbGVjdGlvblRvb2xzLm5ld0luc3RhbmNlKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIGludC5jbGFzcywgbmV3IEludGVnZXIoaW5pdGlhbENhcGFjaXR5KSk7Ci0JCWFzc2VydE5vdE51bGwodik7Ci0JCWFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7Ci0JCU9iamVjdFtdIGVsZW1lbnREYXRhID0gKE9iamVjdFtdKSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZSh2LCAiZWxlbWVudERhdGEiKTsKLQkJYXNzZXJ0RXF1YWxzKGluaXRpYWxDYXBhY2l0eSwgZWxlbWVudERhdGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3SW5zdGFuY2VDbGFzc0NsYXNzQXJyYXlPYmplY3RBcnJheSgpIHsKLQkJaW50IGluaXRpYWxDYXBhY2l0eSA9IDIwMDsKLQkJQ2xhc3M8Pz5bXSBwYXJtVHlwZXMgPSBuZXcgQ2xhc3NbMV07Ci0JCXBhcm1UeXBlc1swXSA9IGludC5jbGFzczsKLQkJT2JqZWN0W10gcGFybXMgPSBuZXcgT2JqZWN0WzFdOwotCQlwYXJtc1swXSA9IG5ldyBJbnRlZ2VyKGluaXRpYWxDYXBhY2l0eSk7Ci0JCVZlY3Rvcjw/PiB2ID0gUmVmbGVjdGlvblRvb2xzLm5ld0luc3RhbmNlKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIHBhcm1UeXBlcywgcGFybXMpOwotCQlhc3NlcnROb3ROdWxsKHYpOwotCQlhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOwotCQlPYmplY3RbXSBlbGVtZW50RGF0YSA9IChPYmplY3RbXSkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUodiwgImVsZW1lbnREYXRhIik7Ci0JCWFzc2VydEVxdWFscyhpbml0aWFsQ2FwYWNpdHksIGVsZW1lbnREYXRhLmxlbmd0aCk7Ci0KLQkJcGFybXNbMF0gPSBuZXcgSW50ZWdlcigtMSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXYgPSBSZWZsZWN0aW9uVG9vbHMubmV3SW5zdGFuY2UoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgcGFybVR5cGVzLCBwYXJtcyk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJSdW50aW1lRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0KLQkJcGFybVR5cGVzWzBdID0gamF2YS5sYW5nLlN0cmluZy5jbGFzczsKLQkJcGFybXNbMF0gPSAiZm9vIjsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXYgPSBSZWZsZWN0aW9uVG9vbHMubmV3SW5zdGFuY2UoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgcGFybVR5cGVzLCBwYXJtcyk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWVsZFZhbHVlKCkgewotCQlpbnQgaW5pdGlhbENhcGFjaXR5ID0gMjAwOwotCQlWZWN0b3I8Pz4gdiA9IG5ldyBWZWN0b3I8T2JqZWN0Pihpbml0aWFsQ2FwYWNpdHkpOwotCQlPYmplY3RbXSBlbGVtZW50RGF0YSA9IChPYmplY3RbXSkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUodiwgImVsZW1lbnREYXRhIik7Ci0JCWFzc2VydEVxdWFscyhpbml0aWFsQ2FwYWNpdHksIGVsZW1lbnREYXRhLmxlbmd0aCk7Ci0KLQkJLy8gdGVzdCBpbmhlcml0ZWQgZmllbGQKLQkJSW50ZWdlciBtb2RDb3VudEludGVnZXIgPSAoSW50ZWdlcikgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUodiwgIm1vZENvdW50Iik7Ci0JCWludCBtb2RDb3VudCA9IG1vZENvdW50SW50ZWdlci5pbnRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgbW9kQ291bnQpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGJvZ3VzRmllbGRWYWx1ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlib2d1c0ZpZWxkVmFsdWUgPSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZSh2LCAiYm9ndXNGaWVsZCIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIE5vU3VjaEZpZWxkRXhjZXB0aW9uKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEZpZWxkRXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBib2d1c0ZpZWxkVmFsdWUsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZU1ldGhvZE9iamVjdFN0cmluZygpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQlpbnQgc2l6ZSA9ICgoSW50ZWdlcikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QodiwgInNpemUiKSkuaW50VmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNpemUpOwotCi0JCXYuYWRkRWxlbWVudCgiZm9vIik7Ci0JCXNpemUgPSAoKEludGVnZXIpIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKHYsICJzaXplIikpLmludFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscygxLCBzaXplKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZU1ldGhvZE9iamVjdFN0cmluZ0NsYXNzT2JqZWN0KCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCWJvb2xlYW4gYm9vbGVhblJlc3VsdCA9ICgoQm9vbGVhbikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QodiwgImFkZCIsIE9iamVjdC5jbGFzcywgImZvbyIpKS5ib29sZWFuVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShib29sZWFuUmVzdWx0KTsKLQkJYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKCJmb28iKSk7Ci0JCU9iamVjdCB2b2lkUmVzdWx0ID0gUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QodiwgImFkZEVsZW1lbnQiLCBPYmplY3QuY2xhc3MsICJiYXIiKTsKLQkJYXNzZXJ0TnVsbCh2b2lkUmVzdWx0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZU1ldGhvZE9iamVjdFN0cmluZ0NsYXNzQXJyYXlPYmplY3RBcnJheSgpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQlDbGFzczw/PltdIHBhcm1UeXBlcyA9IG5ldyBDbGFzc1sxXTsKLQkJcGFybVR5cGVzWzBdID0gamF2YS5sYW5nLk9iamVjdC5jbGFzczsKLQkJT2JqZWN0W10gcGFybXMgPSBuZXcgT2JqZWN0WzFdOwotCQlwYXJtc1swXSA9ICJmb28iOwotCQlib29sZWFuIGJvb2xlYW5SZXN1bHQgPSAoKEJvb2xlYW4pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKHYsICJhZGQiLCBwYXJtVHlwZXMsIHBhcm1zKSkuYm9vbGVhblZhbHVlKCk7Ci0JCWFzc2VydFRydWUoYm9vbGVhblJlc3VsdCk7Ci0JCWFzc2VydFRydWUodi5jb250YWlucygiZm9vIikpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGJvZ3VzTWV0aG9kUmV0dXJuVmFsdWUgPSBudWxsOwotCQl0cnkgewotCQkJYm9ndXNNZXRob2RSZXR1cm5WYWx1ZSA9IFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKHYsICJib2d1c01ldGhvZCIsIHBhcm1UeXBlcywgcGFybXMpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbikgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hNZXRob2RFeGNlcHRpb24gbm90IHRocm93bjogIiArIGJvZ3VzTWV0aG9kUmV0dXJuVmFsdWUsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZVN0YXRpY01ldGhvZENsYXNzU3RyaW5nKCkgewotCQlEb3VibGUgcmFuZG9tT2JqZWN0ID0gKERvdWJsZSkgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVTdGF0aWNNZXRob2QoamF2YS5sYW5nLk1hdGguY2xhc3MsICJyYW5kb20iKTsKLQkJYXNzZXJ0Tm90TnVsbChyYW5kb21PYmplY3QpOwotCQlkb3VibGUgcmFuZG9tID0gcmFuZG9tT2JqZWN0LmRvdWJsZVZhbHVlKCk7Ci0JCWFzc2VydFRydWUocmFuZG9tID49IDApOwotCQlhc3NlcnRUcnVlKHJhbmRvbSA8IDEpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlU3RhdGljTWV0aG9kQ2xhc3NTdHJpbmdDbGFzc09iamVjdCgpIHsKLQkJU3RyaW5nIHMgPSAoU3RyaW5nKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCAidmFsdWVPZiIsIGJvb2xlYW4uY2xhc3MsIEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydE5vdE51bGwocyk7Ci0JCWFzc2VydEVxdWFscygidHJ1ZSIsIHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlU3RhdGljTWV0aG9kQ2xhc3NTdHJpbmdDbGFzc0FycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCUNsYXNzPD8+W10gcGFybVR5cGVzID0gbmV3IENsYXNzWzFdOwotCQlwYXJtVHlwZXNbMF0gPSBib29sZWFuLmNsYXNzOwotCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbMV07Ci0JCXBhcm1zWzBdID0gQm9vbGVhbi5UUlVFOwotCQlTdHJpbmcgcyA9IChTdHJpbmcpIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlU3RhdGljTWV0aG9kKGphdmEubGFuZy5TdHJpbmcuY2xhc3MsICJ2YWx1ZU9mIiwgcGFybVR5cGVzLCBwYXJtcyk7Ci0JCWFzc2VydE5vdE51bGwocyk7Ci0JCWFzc2VydEVxdWFscygidHJ1ZSIsIHMpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGJvZ3VzU3RhdGljTWV0aG9kUmV0dXJuVmFsdWUgPSBudWxsOwotCQl0cnkgewotCQkJYm9ndXNTdGF0aWNNZXRob2RSZXR1cm5WYWx1ZSA9IFJlZmxlY3Rpb25Ub29scy5leGVjdXRlU3RhdGljTWV0aG9kKGphdmEubGFuZy5TdHJpbmcuY2xhc3MsICJib2d1c1N0YXRpY01ldGhvZCIsIHBhcm1UeXBlcywgcGFybXMpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbikgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hNZXRob2RFeGNlcHRpb24gbm90IHRocm93bjogIiArIGJvZ3VzU3RhdGljTWV0aG9kUmV0dXJuVmFsdWUsIGV4Q2F1Z2h0KTsKLQotCQkvLyB0ZXN0IG5vbi1zdGF0aWMgbWV0aG9kCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlib2d1c1N0YXRpY01ldGhvZFJldHVyblZhbHVlID0gUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVTdGF0aWNNZXRob2QoamF2YS5sYW5nLlN0cmluZy5jbGFzcywgInRvU3RyaW5nIik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgYm9ndXNTdGF0aWNNZXRob2RSZXR1cm5WYWx1ZSwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGaWVsZFZhbHVlKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCU9iamVjdFtdIG5ld0VsZW1lbnREYXRhID0gbmV3IE9iamVjdFs1XTsKLQkJbmV3RWxlbWVudERhdGFbMF0gPSAiZm9vIjsKLQkJUmVmbGVjdGlvblRvb2xzLnNldEZpZWxkVmFsdWUodiwgImVsZW1lbnREYXRhIiwgbmV3RWxlbWVudERhdGEpOwotCQlSZWZsZWN0aW9uVG9vbHMuc2V0RmllbGRWYWx1ZSh2LCAiZWxlbWVudENvdW50IiwgbmV3IEludGVnZXIoMSkpOwotCQkvLyB0ZXN0IGluaGVyaXRlZCBmaWVsZAotCQlSZWZsZWN0aW9uVG9vbHMuc2V0RmllbGRWYWx1ZSh2LCAibW9kQ291bnQiLCBuZXcgSW50ZWdlcigxKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWlucygiZm9vIikpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVJlZmxlY3Rpb25Ub29scy5zZXRGaWVsZFZhbHVlKHYsICJib2d1c0ZpZWxkIiwgImZvbyIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIE5vU3VjaEZpZWxkRXhjZXB0aW9uKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEZpZWxkRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFN0YXRpY0ZpZWxkVmFsdWUoKSB7Ci0JCVJlZmxlY3Rpb25Ub29scy5zZXRTdGF0aWNGaWVsZFZhbHVlKHRoaXMuZ2V0Q2xhc3MoKSwgInRlc3RTdGF0aWNGaWVsZCIsICJuZXcgdmFsdWUiKTsKLQkJYXNzZXJ0RXF1YWxzKHRlc3RTdGF0aWNGaWVsZCwgIm5ldyB2YWx1ZSIpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVJlZmxlY3Rpb25Ub29scy5zZXRTdGF0aWNGaWVsZFZhbHVlKHRoaXMuZ2V0Q2xhc3MoKSwgImJvZ3VzU3RhdGljRmllbGQiLCAibmV3IHZhbHVlIik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgTm9TdWNoRmllbGRFeGNlcHRpb24pIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRmllbGRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlTmFtZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJWZWN0b3IiLCBqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRW50cnkiLCBqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgaW50LmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW50W10iLCBpbnRbXS5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImludFtdW10iLCBpbnRbXVtdLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidm9pZCIsIHZvaWQuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZU5hbWUoKSB7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsIiwgamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwiLCBqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheURlcHRoRm9yKCkgewotCQlhc3NlcnRFcXVhbHMoMCwgUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGgoamF2YS51dGlsLlZlY3Rvci5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoMCwgUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGgoaW50LmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygwLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aCh2b2lkLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygxLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aChqYXZhLnV0aWwuVmVjdG9yW10uY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIFJlZmxlY3Rpb25Ub29scy5nZXRBcnJheURlcHRoKGludFtdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aChqYXZhLnV0aWwuVmVjdG9yW11bXVtdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aChpbnRbXVtdW10uY2xhc3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudFR5cGVGb3IoKSB7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGUoamF2YS51dGlsLlZlY3Rvci5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGUoaW50LmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyh2b2lkLmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGUodm9pZC5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldEVsZW1lbnRUeXBlKGphdmEudXRpbC5WZWN0b3JbXS5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGUoaW50W10uY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZShqYXZhLnV0aWwuVmVjdG9yW11bXVtdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZShpbnRbXVtdW10uY2xhc3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcygpIHsKLQkJYXNzZXJ0VHJ1ZShSZWZsZWN0aW9uVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLlZvaWQuY2xhc3MpKTsKLQkJYXNzZXJ0VHJ1ZShSZWZsZWN0aW9uVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MpKTsKLQkJYXNzZXJ0VHJ1ZShSZWZsZWN0aW9uVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLkludGVnZXIuY2xhc3MpKTsKLQkJYXNzZXJ0VHJ1ZShSZWZsZWN0aW9uVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLkZsb2F0LmNsYXNzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoUmVmbGVjdGlvblRvb2xzLmNsYXNzSXNQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpKTsKLQkJYXNzZXJ0RmFsc2UoUmVmbGVjdGlvblRvb2xzLmNsYXNzSXNQcmltaXRpdmVXcmFwcGVyKHZvaWQuY2xhc3MpKTsKLQkJYXNzZXJ0RmFsc2UoUmVmbGVjdGlvblRvb2xzLmNsYXNzSXNQcmltaXRpdmVXcmFwcGVyKGludC5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoKSB7Ci0JCWFzc2VydEZhbHNlKFJlZmxlY3Rpb25Ub29scy5jbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5Wb2lkLmNsYXNzKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShSZWZsZWN0aW9uVG9vbHMuY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcykpOwotCQlhc3NlcnRUcnVlKFJlZmxlY3Rpb25Ub29scy5jbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzKSk7Ci0JCWFzc2VydFRydWUoUmVmbGVjdGlvblRvb2xzLmNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLkZsb2F0LmNsYXNzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoUmVmbGVjdGlvblRvb2xzLmNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLlN0cmluZy5jbGFzcykpOwotCQlhc3NlcnRGYWxzZShSZWZsZWN0aW9uVG9vbHMuY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcih2b2lkLmNsYXNzKSk7Ci0JCWFzc2VydEZhbHNlKFJlZmxlY3Rpb25Ub29scy5jbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKGludC5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXcmFwcGVyQ2xhc3MoKSB7Ci0JCWFzc2VydEVxdWFscyhqYXZhLmxhbmcuVm9pZC5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldFdyYXBwZXJDbGFzcyh2b2lkLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLmxhbmcuSW50ZWdlci5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldFdyYXBwZXJDbGFzcyhpbnQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5GbG9hdC5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldFdyYXBwZXJDbGFzcyhmbG9hdC5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRXcmFwcGVyQ2xhc3MoYm9vbGVhbi5jbGFzcykpOwotCi0JCWFzc2VydE51bGwoUmVmbGVjdGlvblRvb2xzLmdldFdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzRm9yVHlwZURlY2xhcmF0aW9uU3RyaW5nSW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbigiaW50IiwgMCkpOwotCQlhc3NlcnRFcXVhbHMoaW50W10uY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbigiaW50IiwgMSkpOwotCQlhc3NlcnRFcXVhbHMoaW50W11bXVtdLmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oImludCIsIDMpKTsKLQotCQlhc3NlcnRFcXVhbHMoT2JqZWN0LmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3QiLCAwKSk7Ci0JCWFzc2VydEVxdWFscyhPYmplY3RbXVtdW10uY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLk9iamVjdCIsIDMpKTsKLQotCQlhc3NlcnRFcXVhbHModm9pZC5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKCJ2b2lkIiwgMCkpOwotCQl0cnkgewotCQkJUmVmbGVjdGlvblRvb2xzLmdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKHZvaWQuY2xhc3MuZ2V0TmFtZSgpLCAxKTsKLQkJCWZhaWwoInNob3VsZCBub3QgZ2V0IGhlcmUuLi4iKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2RlRm9yQ2xhc3MoKSB7Ci0JCWFzc2VydEVxdWFscygnSScsIFJlZmxlY3Rpb25Ub29scy5nZXRDb2RlRm9yQ2xhc3MoaW50LmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygnQicsIFJlZmxlY3Rpb25Ub29scy5nZXRDb2RlRm9yQ2xhc3MoYnl0ZS5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb25TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQiKSk7Ci0JCWFzc2VydEVxdWFscygiW0kiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnRbXSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJbW0kiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQgWyBdIFsgXSIpKTsKLQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0IikpOwotCQlhc3NlcnRFcXVhbHMoIltMamF2YS5sYW5nLk9iamVjdDsiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0XHRbXSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJbW0xqYXZhLmxhbmcuT2JqZWN0OyIsIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3RcdFtdXHRbXSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvblN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3QiKSk7Ci0JCWFzc2VydEVxdWFscygxLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLk9iamVjdFtdIikpOwotCQlhc3NlcnRFcXVhbHMoMywgUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3RbXVtdW10iKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIFJlZmxlY3Rpb25Ub29scy5nZXRBcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQiKSk7Ci0JCWFzc2VydEVxdWFscygxLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbigiaW50W10iKSk7Ci0JCWFzc2VydEVxdWFscygzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbigiaW50W11bXVtdIikpOwotCi0JCWFzc2VydEVxdWFscygwLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbigiZmxvYXQiKSk7Ci0JCWFzc2VydEVxdWFscygxLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbigiZmxvYXQgWyBdIikpOwotCQlhc3NlcnRFcXVhbHMoMywgUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oImZsb2F0W10gW10gW10iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvblN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0IikpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0W10iKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3RbXVtdW10iKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQiKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgUmVmbGVjdGlvblRvb2xzLmdldEVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiaW50W10iKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgUmVmbGVjdGlvblRvb2xzLmdldEVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiaW50W11bXVtdIikpOwotCi0JCWFzc2VydEVxdWFscygiZmxvYXQiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJmbG9hdCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmbG9hdCIsIFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oImZsb2F0IFsgXSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmbG9hdCIsIFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oImZsb2F0W10gW10gW10iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvblN0cmluZ0ludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSwgUmVmbGVjdGlvblRvb2xzLmdldENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiaW50IiwgMCkpOwotCQlhc3NlcnRFcXVhbHMoaW50W10uY2xhc3MuZ2V0TmFtZSgpLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQiLCAxKSk7Ci0JCWFzc2VydEVxdWFscyhpbnRbXVtdW10uY2xhc3MuZ2V0TmFtZSgpLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQiLCAzKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKE9iamVjdC5jbGFzcy5nZXROYW1lKCksIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3QiLCAwKSk7Ci0JCWFzc2VydEVxdWFscyhPYmplY3RbXVtdW10uY2xhc3MuZ2V0TmFtZSgpLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0IiwgMykpOwotCi0JCWFzc2VydEVxdWFscyh2b2lkLmNsYXNzLmdldE5hbWUoKSwgUmVmbGVjdGlvblRvb2xzLmdldENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigidm9pZCIsIDApKTsKLQkJdHJ5IHsKLQkJCVJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24odm9pZC5jbGFzcy5nZXROYW1lKCksIDEpOwotCQkJZmFpbCgic2hvdWxkIG5vdCBnZXQgaGVyZS4uLiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gZmllbGROYW1lcyhJdGVyYWJsZTxGaWVsZD4gZmllbGRzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxGaWVsZCwgU3RyaW5nPihmaWVsZHMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oRmllbGQgZmllbGQpIHsKLQkJCQlyZXR1cm4gZmllbGQuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBtZXRob2ROYW1lcyhJdGVyYWJsZTxNZXRob2Q+IG1ldGhvZHMpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPE1ldGhvZCwgU3RyaW5nPihtZXRob2RzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gbWV0aG9kLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SZXZlcnNlQ29tcGFyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmV2ZXJzZUNvbXBhcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjg3ODY4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SZXZlcnNlQ29tcGFyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJldmVyc2VDb21wYXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZXZlcnNlQ29tcGFyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IG5hdHVyYWxSZXZlcnNlQ29tcGFyYXRvcjsKLQlwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiBjdXN0b21Db21wYXJhdG9yOwotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGN1c3RvbVJldmVyc2VDb21wYXJhdG9yOwotCi0JcHVibGljIFJldmVyc2VDb21wYXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5uYXR1cmFsUmV2ZXJzZUNvbXBhcmF0b3IgPSBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpOwotCQl0aGlzLmN1c3RvbUNvbXBhcmF0b3IgPSB0aGlzLmJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpOwotCQl0aGlzLmN1c3RvbVJldmVyc2VDb21wYXJhdG9yID0gbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4odGhpcy5jdXN0b21Db21wYXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiBidWlsZEN1c3RvbUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCQkJU3RyaW5nIGxvd2VyMSA9IHMxLnRvTG93ZXJDYXNlKCk7Ci0JCQkJU3RyaW5nIGxvd2VyMiA9IHMyLnRvTG93ZXJDYXNlKCk7Ci0JCQkJaW50IHJlc3VsdCA9IGxvd2VyMS5jb21wYXJlVG8obG93ZXIyKTsKLQkJCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCQkJcmV0dXJuIHMxLmNvbXBhcmVUbyhzMik7IC8vIHVzZSBjYXNlIHRvIGRpZmZlcmVudGlhdGUgImVxdWFsIiBzdHJpbmdzCi0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRVbnNvcnRlZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiVCIpOwotCQlyZXN1bHQuYWRkKCJaIik7Ci0JCXJlc3VsdC5hZGQoIlkiKTsKLQkJcmVzdWx0LmFkZCgiTSIpOwotCQlyZXN1bHQuYWRkKCJtIik7Ci0JCXJlc3VsdC5hZGQoImEiKTsKLQkJcmVzdWx0LmFkZCgiQiIpOwotCQlyZXN1bHQuYWRkKCJiIik7Ci0JCXJlc3VsdC5hZGQoIkEiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZE5hdHVyYWxseVNvcnRlZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4odGhpcy5idWlsZFVuc29ydGVkTGlzdCgpKTsKLQkJQ29sbGVjdGlvbnMuc29ydChyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkQ3VzdG9tU29ydGVkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPih0aGlzLmJ1aWxkVW5zb3J0ZWRMaXN0KCkpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdCwgdGhpcy5jdXN0b21Db21wYXJhdG9yKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hdHVyYWwoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFVuc29ydGVkTGlzdCgpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIHRoaXMubmF0dXJhbFJldmVyc2VDb21wYXJhdG9yKTsKLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMuYnVpbGROYXR1cmFsbHlTb3J0ZWRMaXN0KCksIGxpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdXN0b20oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFVuc29ydGVkTGlzdCgpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIHRoaXMuY3VzdG9tUmV2ZXJzZUNvbXBhcmF0b3IpOwotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5idWlsZEN1c3RvbVNvcnRlZExpc3QoKSwgbGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3QoTGlzdDxTdHJpbmc+IG5vcm1hbCwgTGlzdDxTdHJpbmc+IHJldmVyc2UpIHsKLQkJaW50IHNpemUgPSBub3JtYWwuc2l6ZSgpOwotCQlpbnQgbWF4ID0gc2l6ZSAtIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMobm9ybWFsLmdldChpKSwgcmV2ZXJzZS5nZXQobWF4IC0gaSkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZUFzc29jaWF0aW9uVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVBc3NvY2lhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZmUxNjMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZUFzc29jaWF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Bc3NvY2lhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlQXNzb2NpYXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbXBsZUFzc29jaWF0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gYXNzb2M7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFNpbXBsZUFzc29jaWF0aW9uVGVzdHMuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgU2ltcGxlQXNzb2NpYXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmFzc29jID0gbmV3IFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPigiZm9vIiwgImJhciIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0S2V5KCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuYXNzb2MuZ2V0S2V5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmFzc29jLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmFzc29jLmdldFZhbHVlKCkpOwotCQl0aGlzLmFzc29jLnNldFZhbHVlKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLmFzc29jLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYXNzb2MuZXF1YWxzKCJmb28iKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYXNzb2MsIHRoaXMuY29weSh0aGlzLmFzc29jKSk7Ci0KLQkJU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+IGFzc29jMiA9IG5ldyBTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4oImZvbyIsICJiYXoiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hc3NvYy5lcXVhbHMoYXNzb2MyKSk7Ci0KLQkJYXNzb2MyID0gbmV3IFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPigiZm9wIiwgImJhciIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFzc29jLmVxdWFscyhhc3NvYzIpKTsKLQotCQlTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gYXNzb2MzID0gbmV3IFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPihudWxsLCBudWxsKTsKLQkJU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+IGFzc29jNCA9IG5ldyBTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4obnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhhc3NvYzMsIGFzc29jNCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5hc3NvYy5oYXNoQ29kZSgpLCB0aGlzLmNvcHkodGhpcy5hc3NvYykuaGFzaENvZGUoKSk7Ci0KLQkJU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+IGFzc29jMiA9IG5ldyBTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4obnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhhc3NvYzIuaGFzaENvZGUoKSwgdGhpcy5jb3B5KGFzc29jMikuaGFzaENvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYXNzb2MudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQl0aGlzLnZlcmlmeUNsb25lKHRoaXMuYXNzb2MsIHRoaXMuYXNzb2MuY2xvbmUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNsb25lKEFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPiBleHBlY3RlZCwgQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+IGFjdHVhbCkgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCWFzc2VydE5vdFNhbWUoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRLZXkoKSwgYWN0dWFsLmdldEtleSgpKTsKLQkJYXNzZXJ0U2FtZShleHBlY3RlZC5nZXRLZXkoKSwgYWN0dWFsLmdldEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldFZhbHVlKCksIGFjdHVhbC5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U2FtZShleHBlY3RlZC5nZXRWYWx1ZSgpLCBhY3R1YWwuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoImNhc3QiKQotCQlBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gYXNzb2MyID0gKEFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPikgVGVzdFRvb2xzLnNlcmlhbGl6ZSh0aGlzLmFzc29jKTsKLQotCQlhc3NlcnRFcXVhbHModGhpcy5hc3NvYywgYXNzb2MyKTsKLQkJYXNzZXJ0Tm90U2FtZSh0aGlzLmFzc29jLCBhc3NvYzIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hc3NvYy5nZXRLZXkoKSwgYXNzb2MyLmdldEtleSgpKTsKLQkJYXNzZXJ0Tm90U2FtZSh0aGlzLmFzc29jLmdldEtleSgpLCBhc3NvYzIuZ2V0S2V5KCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hc3NvYy5nZXRWYWx1ZSgpLCBhc3NvYzIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE5vdFNhbWUodGhpcy5hc3NvYy5nZXRWYWx1ZSgpLCBhc3NvYzIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gY29weShTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gc2EpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4oc2EuZ2V0S2V5KCksIHNhLmdldFZhbHVlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZUJvb2xlYW5SZWZlcmVuY2VUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZUJvb2xlYW5SZWZlcmVuY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGMwNmRkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVCb29sZWFuUmVmZXJlbmNlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlQm9vbGVhblJlZmVyZW5jZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2ltcGxlQm9vbGVhblJlZmVyZW5jZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFNpbXBsZUJvb2xlYW5SZWZlcmVuY2VUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB7Ci0JCVNpbXBsZUJvb2xlYW5SZWZlcmVuY2UgYnIgPSBuZXcgU2ltcGxlQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShici5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVEZWZhdWx0KCkgewotCQlTaW1wbGVCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IFNpbXBsZUJvb2xlYW5SZWZlcmVuY2UoKTsKLQkJYXNzZXJ0RmFsc2UoYnIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzKCkgewotCQlTaW1wbGVCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IFNpbXBsZUJvb2xlYW5SZWZlcmVuY2UodHJ1ZSk7Ci0JCWFzc2VydFRydWUoYnIuaXModHJ1ZSkpOwotCQlhc3NlcnRGYWxzZShici5pcyhmYWxzZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05vdCgpIHsKLQkJU2ltcGxlQm9vbGVhblJlZmVyZW5jZSBiciA9IG5ldyBTaW1wbGVCb29sZWFuUmVmZXJlbmNlKHRydWUpOwotCQlhc3NlcnRGYWxzZShici5pc05vdCh0cnVlKSk7Ci0JCWFzc2VydFRydWUoYnIuaXNOb3QoZmFsc2UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNUcnVlKCkgewotCQlTaW1wbGVCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IFNpbXBsZUJvb2xlYW5SZWZlcmVuY2UodHJ1ZSk7Ci0JCWFzc2VydFRydWUoYnIuaXNUcnVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0ZhbHNlKCkgewotCQlTaW1wbGVCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IFNpbXBsZUJvb2xlYW5SZWZlcmVuY2UodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKGJyLmlzRmFsc2UoKSk7Ci0JCWJyLnNldEZhbHNlKCk7Ci0JCWFzc2VydFRydWUoYnIuaXNGYWxzZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCVNpbXBsZUJvb2xlYW5SZWZlcmVuY2UgYnIgPSBuZXcgU2ltcGxlQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShici5nZXRWYWx1ZSgpKTsKLQkJYnIuc2V0VmFsdWUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmxpcCgpIHsKLQkJU2ltcGxlQm9vbGVhblJlZmVyZW5jZSBiciA9IG5ldyBTaW1wbGVCb29sZWFuUmVmZXJlbmNlKHRydWUpOwotCQlhc3NlcnRUcnVlKGJyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZShici5mbGlwKCkpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShici5mbGlwKCkpOwotCQlhc3NlcnRUcnVlKGJyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROb3RCb29sZWFuKCkgewotCQlTaW1wbGVCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IFNpbXBsZUJvb2xlYW5SZWZlcmVuY2UoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQkJYnIuc2V0Tm90KHRydWUpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQkJYnIuc2V0Tm90KHRydWUpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQkJYnIuc2V0Tm90KGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZShici5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VHJ1ZSgpIHsKLQkJU2ltcGxlQm9vbGVhblJlZmVyZW5jZSBiciA9IG5ldyBTaW1wbGVCb29sZWFuUmVmZXJlbmNlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UoYnIuZ2V0VmFsdWUoKSk7Ci0JCWJyLnNldFRydWUoKTsKLQkJYXNzZXJ0VHJ1ZShici5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmFsc2UoKSB7Ci0JCVNpbXBsZUJvb2xlYW5SZWZlcmVuY2UgYnIgPSBuZXcgU2ltcGxlQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShici5nZXRWYWx1ZSgpKTsKLQkJYnIuc2V0RmFsc2UoKTsKLQkJYXNzZXJ0RmFsc2UoYnIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlTaW1wbGVCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IFNpbXBsZUJvb2xlYW5SZWZlcmVuY2UodHJ1ZSk7Ci0JCVNpbXBsZUJvb2xlYW5SZWZlcmVuY2UgY2xvbmUgPSBici5jbG9uZSgpOwotCQlhc3NlcnRUcnVlKGNsb25lLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJU2ltcGxlQm9vbGVhblJlZmVyZW5jZSBicjEgPSBuZXcgU2ltcGxlQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJbdHJ1ZV0iLCBicjEudG9TdHJpbmcoKSk7Ci0JCWJyMS5zZXRGYWxzZSgpOwotCQlhc3NlcnRFcXVhbHMoIltmYWxzZV0iLCBicjEudG9TdHJpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlSW50UmVmZXJlbmNlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVJbnRSZWZlcmVuY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTY1NzBiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVJbnRSZWZlcmVuY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVJbnRSZWZlcmVuY2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbXBsZUludFJlZmVyZW5jZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFNpbXBsZUludFJlZmVyZW5jZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdG9ycygpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGlyLmdldFZhbHVlKCkpOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoNyk7Ci0JCWFzc2VydEVxdWFscyg3LCBpci5nZXRWYWx1ZSgpKTsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKC03KTsKLQkJYXNzZXJ0RXF1YWxzKC03LCBpci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzSW50KCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRUcnVlKGlyLmVxdWFscygwKSk7Ci0JCWFzc2VydEZhbHNlKGlyLmVxdWFscyg3KSk7Ci0KLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDcpOwotCQlhc3NlcnRUcnVlKGlyLmVxdWFscyg3KSk7Ci0JCWFzc2VydEZhbHNlKGlyLmVxdWFscygwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vdEVxdWFsSW50KCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRGYWxzZShpci5ub3RFcXVhbCgwKSk7Ci0JCWFzc2VydFRydWUoaXIubm90RXF1YWwoNykpOwotCi0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSg3KTsKLQkJYXNzZXJ0RmFsc2UoaXIubm90RXF1YWwoNykpOwotCQlhc3NlcnRUcnVlKGlyLm5vdEVxdWFsKDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNaZXJvKCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRUcnVlKGlyLmlzWmVybygpKTsKLQotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoNyk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzWmVybygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNOb3RaZXJvKCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRGYWxzZShpci5pc05vdFplcm8oKSk7Ci0KLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDcpOwotCQlhc3NlcnRUcnVlKGlyLmlzTm90WmVybygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNHcmVhdGVyVGhhbkludCgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0VHJ1ZShpci5pc0dyZWF0ZXJUaGFuKC0xKSk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzR3JlYXRlclRoYW4oMCkpOwotCQlhc3NlcnRGYWxzZShpci5pc0dyZWF0ZXJUaGFuKDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNHcmVhdGVyVGhhbk9yRXF1YWxJbnQoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydFRydWUoaXIuaXNHcmVhdGVyVGhhbk9yRXF1YWwoLTEpKTsKLQkJYXNzZXJ0VHJ1ZShpci5pc0dyZWF0ZXJUaGFuT3JFcXVhbCgwKSk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzR3JlYXRlclRoYW5PckVxdWFsKDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNMZXNzVGhhbkludCgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNMZXNzVGhhbigtMSkpOwotCQlhc3NlcnRGYWxzZShpci5pc0xlc3NUaGFuKDApKTsKLQkJYXNzZXJ0VHJ1ZShpci5pc0xlc3NUaGFuKDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNMZXNzVGhhbk9yRXF1YWxJbnQoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzTGVzc1RoYW5PckVxdWFsKC0xKSk7Ci0JCWFzc2VydFRydWUoaXIuaXNMZXNzVGhhbk9yRXF1YWwoMCkpOwotCQlhc3NlcnRUcnVlKGlyLmlzTGVzc1RoYW5PckVxdWFsKDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNQb3NpdGl2ZSgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoLTMpOwotCQlhc3NlcnRGYWxzZShpci5pc1Bvc2l0aXZlKCkpOwotCi0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRGYWxzZShpci5pc1Bvc2l0aXZlKCkpOwotCi0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSg3KTsKLQkJYXNzZXJ0VHJ1ZShpci5pc1Bvc2l0aXZlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05vdFBvc2l0aXZlKCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgtMyk7Ci0JCWFzc2VydFRydWUoaXIuaXNOb3RQb3NpdGl2ZSgpKTsKLQotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0VHJ1ZShpci5pc05vdFBvc2l0aXZlKCkpOwotCi0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSg3KTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNOb3RQb3NpdGl2ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNOZWdhdGl2ZSgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoLTMpOwotCQlhc3NlcnRUcnVlKGlyLmlzTmVnYXRpdmUoKSk7Ci0KLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzTmVnYXRpdmUoKSk7Ci0KLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDcpOwotCQlhc3NlcnRGYWxzZShpci5pc05lZ2F0aXZlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05vdE5lZ2F0aXZlKCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgtMyk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzTm90TmVnYXRpdmUoKSk7Ci0KLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydFRydWUoaXIuaXNOb3ROZWdhdGl2ZSgpKTsKLQotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoNyk7Ci0JCWFzc2VydFRydWUoaXIuaXNOb3ROZWdhdGl2ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVJbnQoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKC0zKTsKLQkJYXNzZXJ0RXF1YWxzKC0zLCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0zLCBpci5zZXRWYWx1ZSg0KSk7Ci0JCWFzc2VydEVxdWFscyg0LCBpci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzKCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgtMyk7Ci0JCWFzc2VydEVxdWFscygtMywgaXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBpci5hYnMoKSk7Ci0KLQkJaXIuc2V0VmFsdWUoMyk7Ci0JCWFzc2VydEVxdWFscygzLCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlyLmFicygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVnKCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgtMyk7Ci0JCWFzc2VydEVxdWFscygtMywgaXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBpci5uZWcoKSk7Ci0KLQkJaXIuc2V0VmFsdWUoMyk7Ci0JCWFzc2VydEVxdWFscygzLCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0zLCBpci5uZWcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFplcm8oKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKC0zKTsKLQkJYXNzZXJ0RXF1YWxzKC0zLCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0zLCBpci5zZXRaZXJvKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgaXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEludCgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpbnQgdmFsdWU7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgaXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdmFsdWUgPSBpci5hZGQoMyk7Ci0JCWFzc2VydEVxdWFscygzLCB2YWx1ZSk7Ci0KLQkJaXIuc2V0VmFsdWUoMyk7Ci0JCXZhbHVlID0gaXIuYWRkKC03KTsKLQkJYXNzZXJ0RXF1YWxzKC00LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluY3JlbWVudCgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpbnQgdmFsdWU7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgaXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdmFsdWUgPSBpci5pbmNyZW1lbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGlyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJ0cmFjdEludCgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpbnQgY291bnQ7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgaXIuZ2V0VmFsdWUoKSk7Ci0KLQkJY291bnQgPSBpci5zdWJ0cmFjdCgzKTsKLQkJYXNzZXJ0RXF1YWxzKC0zLCBjb3VudCk7Ci0KLQkJaXIuc2V0VmFsdWUoLTMpOwotCQljb3VudCA9IGlyLnN1YnRyYWN0KC03KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGNvdW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVjcmVtZW50KCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWludCBjb3VudDsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydEVxdWFscygwLCBpci5nZXRWYWx1ZSgpKTsKLQotCQljb3VudCA9IGlyLmRlY3JlbWVudCgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIGNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBpci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbHlJbnQoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDMpOwotCQlhc3NlcnRFcXVhbHMoMywgaXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyg5LCBpci5tdWx0aXBseSgzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpdmlkZUludCgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoMjQpOwotCQlhc3NlcnRFcXVhbHMoMjQsIGlyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoOCwgaXIuZGl2aWRlKDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtYWluZGVySW50KCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgyNSk7Ci0JCWFzc2VydEVxdWFscygyNSwgaXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBpci5yZW1haW5kZXIoMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaW5JbnQoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDI1KTsKLQkJYXNzZXJ0RXF1YWxzKDI1LCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlyLm1pbigzKSk7Ci0JCWFzc2VydEVxdWFscygyNSwgaXIubWluKDMzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1heEludCgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoMjUpOwotCQlhc3NlcnRFcXVhbHMoMjUsIGlyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjUsIGlyLm1heCgzKSk7Ci0JCWFzc2VydEVxdWFscygzMCwgaXIubWF4KDMwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBvd0ludCgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoNSk7Ci0JCWFzc2VydEVxdWFscyg1LCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpci5wb3coMikgPT0gMjVMKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVRvSW50UmVmZXJlbmNlKCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXIxID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSg0NCk7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDQ0KTsKLQkJYXNzZXJ0VHJ1ZShpcjEuY29tcGFyZVRvKGlyMikgPT0gMCk7Ci0JCWlyMiA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoNTUpOwotCQlhc3NlcnRUcnVlKGlyMS5jb21wYXJlVG8oaXIyKSA8IDApOwotCQlpcjIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDMzKTsKLQkJYXNzZXJ0VHJ1ZShpcjEuY29tcGFyZVRvKGlyMikgPiAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjEgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDQ0KTsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyMiA9IGlyMS5jbG9uZSgpOwotCQlhc3NlcnRFcXVhbHMoNDQsIGlyMi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZShpcjEsIGlyMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyMSA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoNDQpOwotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXIyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShpcjEpOwotCQlhc3NlcnRFcXVhbHMoNDQsIGlyMi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZShpcjEsIGlyMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSg1KTsKLQkJYXNzZXJ0RXF1YWxzKCJbNV0iLCBpci50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVPYmplY3RSZWZlcmVuY2VUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZU9iamVjdFJlZmVyZW5jZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOTFhYzkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZU9iamVjdFJlZmVyZW5jZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVPYmplY3RSZWZlcmVuY2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbXBsZU9iamVjdFJlZmVyZW5jZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFNpbXBsZU9iamVjdFJlZmVyZW5jZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHsKLQkJU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4gb3IgPSBuZXcgU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4oKTsKLQkJYXNzZXJ0TnVsbChvci5nZXRWYWx1ZSgpKTsKLQkJb3Iuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9yLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUVxdWFsc09iamVjdCgpIHsKLQkJU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4gb3IgPSBuZXcgU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4oKTsKLQkJYXNzZXJ0VHJ1ZShvci52YWx1ZUVxdWFscyhudWxsKSk7Ci0JCWFzc2VydEZhbHNlKG9yLnZhbHVlRXF1YWxzKCJmb28iKSk7Ci0KLQkJb3Iuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRGYWxzZShvci52YWx1ZUVxdWFscyhudWxsKSk7Ci0JCWFzc2VydFRydWUob3IudmFsdWVFcXVhbHMoImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVOb3RFcXVhbE9iamVjdCgpIHsKLQkJU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4gb3IgPSBuZXcgU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4oKTsKLQkJYXNzZXJ0RmFsc2Uob3IudmFsdWVOb3RFcXVhbChudWxsKSk7Ci0JCWFzc2VydFRydWUob3IudmFsdWVOb3RFcXVhbCgiZm9vIikpOwotCi0JCW9yLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShvci52YWx1ZU5vdEVxdWFsKG51bGwpKTsKLQkJYXNzZXJ0RmFsc2Uob3IudmFsdWVOb3RFcXVhbCgiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc051bGwoKSB7Ci0JCVNpbXBsZU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+IG9yID0gbmV3IFNpbXBsZU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+KCk7Ci0JCWFzc2VydFRydWUob3IuaXNOdWxsKCkpOwotCQlvci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKG9yLmlzTnVsbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNOb3ROdWxsKCkgewotCQlTaW1wbGVPYmplY3RSZWZlcmVuY2U8U3RyaW5nPiBvciA9IG5ldyBTaW1wbGVPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigpOwotCQlhc3NlcnRGYWxzZShvci5pc05vdE51bGwoKSk7Ci0JCW9yLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShvci5pc05vdE51bGwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE51bGwoKSB7Ci0JCVNpbXBsZU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+IG9yID0gbmV3IFNpbXBsZU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+KCk7Ci0JCWFzc2VydE51bGwob3IuZ2V0VmFsdWUoKSk7Ci0JCW9yLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvci5nZXRWYWx1ZSgpKTsKLQkJb3Iuc2V0TnVsbCgpOwotCQlhc3NlcnROdWxsKG9yLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4gb3IgPSBuZXcgU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4oImZvbyIpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygiY2FzdCIpCi0JCVNpbXBsZU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+IGNsb25lID0gKFNpbXBsZU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+KSBvci5jbG9uZSgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNsb25lLmdldFZhbHVlKCkpOwotCQlhc3NlcnROb3RTYW1lKG9yLCBjbG9uZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlTaW1wbGVPYmplY3RSZWZlcmVuY2U8U3RyaW5nPiBvciA9IG5ldyBTaW1wbGVPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigpOwotCQlhc3NlcnRFcXVhbHMoIltudWxsXSIsIG9yLnRvU3RyaW5nKCkpOwotCQlvci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiW2Zvb10iLCBvci50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVRdWV1ZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlUXVldWVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmI5OWRiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVRdWV1ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5RdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlUXVldWU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbXBsZVF1ZXVlVGVzdHMKLQlleHRlbmRzIE11bHRpVGhyZWFkZWRUZXN0Q2FzZQotewotCi0JcHVibGljIFNpbXBsZVF1ZXVlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JUXVldWU8U3RyaW5nPiBidWlsZFF1ZXVlKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVF1ZXVlPFN0cmluZz4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKLQkJUXVldWU8U3RyaW5nPiBxdWV1ZSA9IHRoaXMuYnVpbGRRdWV1ZSgpOwotCQlhc3NlcnRUcnVlKHF1ZXVlLmlzRW1wdHkoKSk7Ci0JCXF1ZXVlLmVucXVldWUoImZpcnN0Iik7Ci0JCWFzc2VydEZhbHNlKHF1ZXVlLmlzRW1wdHkoKSk7Ci0JCXF1ZXVlLmVucXVldWUoInNlY29uZCIpOwotCQlhc3NlcnRGYWxzZShxdWV1ZS5pc0VtcHR5KCkpOwotCQlxdWV1ZS5kZXF1ZXVlKCk7Ci0JCWFzc2VydEZhbHNlKHF1ZXVlLmlzRW1wdHkoKSk7Ci0JCXF1ZXVlLmRlcXVldWUoKTsKLQkJYXNzZXJ0VHJ1ZShxdWV1ZS5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbnF1ZXVlQW5kRGVxdWV1ZSgpIHsKLQkJUXVldWU8U3RyaW5nPiBxdWV1ZSA9IHRoaXMuYnVpbGRRdWV1ZSgpOwotCQlTdHJpbmcgZmlyc3QgPSAiZmlyc3QiOwotCQlTdHJpbmcgc2Vjb25kID0gInNlY29uZCI7Ci0KLQkJcXVldWUuZW5xdWV1ZShmaXJzdCk7Ci0JCXF1ZXVlLmVucXVldWUoc2Vjb25kKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBxdWV1ZS5kZXF1ZXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBxdWV1ZS5kZXF1ZXVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbnF1ZXVlQW5kUGVlaygpIHsKLQkJUXVldWU8U3RyaW5nPiBxdWV1ZSA9IHRoaXMuYnVpbGRRdWV1ZSgpOwotCQlTdHJpbmcgZmlyc3QgPSAiZmlyc3QiOwotCQlTdHJpbmcgc2Vjb25kID0gInNlY29uZCI7Ci0KLQkJcXVldWUuZW5xdWV1ZShmaXJzdCk7Ci0JCXF1ZXVlLmVucXVldWUoc2Vjb25kKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBxdWV1ZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHF1ZXVlLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgcXVldWUuZGVxdWV1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgcXVldWUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgcXVldWUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgcXVldWUuZGVxdWV1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlRdWV1ZUV4Y2VwdGlvblBlZWsoKSB7Ci0JCVF1ZXVlPFN0cmluZz4gcXVldWUgPSB0aGlzLmJ1aWxkUXVldWUoKTsKLQkJU3RyaW5nIGZpcnN0ID0gImZpcnN0IjsKLQkJU3RyaW5nIHNlY29uZCA9ICJzZWNvbmQiOwotCi0JCXF1ZXVlLmVucXVldWUoZmlyc3QpOwotCQlxdWV1ZS5lbnF1ZXVlKHNlY29uZCk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgcXVldWUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBxdWV1ZS5kZXF1ZXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBxdWV1ZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBxdWV1ZS5kZXF1ZXVlKCkpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXF1ZXVlLnBlZWsoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVF1ZXVlRXhjZXB0aW9uRGVxdWV1ZSgpIHsKLQkJUXVldWU8U3RyaW5nPiBxdWV1ZSA9IHRoaXMuYnVpbGRRdWV1ZSgpOwotCQlTdHJpbmcgZmlyc3QgPSAiZmlyc3QiOwotCQlTdHJpbmcgc2Vjb25kID0gInNlY29uZCI7Ci0KLQkJcXVldWUuZW5xdWV1ZShmaXJzdCk7Ci0JCXF1ZXVlLmVucXVldWUoc2Vjb25kKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBxdWV1ZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHF1ZXVlLmRlcXVldWUoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHF1ZXVlLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHF1ZXVlLmRlcXVldWUoKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJcXVldWUuZGVxdWV1ZSgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlTaW1wbGVRdWV1ZTxTdHJpbmc+IHF1ZXVlID0gKFNpbXBsZVF1ZXVlPFN0cmluZz4pIHRoaXMuYnVpbGRRdWV1ZSgpOwotCQlxdWV1ZS5lbnF1ZXVlKCJmaXJzdCIpOwotCQlxdWV1ZS5lbnF1ZXVlKCJzZWNvbmQiKTsKLQkJcXVldWUuZW5xdWV1ZSgidGhpcmQiKTsKLQotCQl0aGlzLnZlcmlmeUNsb25lKHF1ZXVlLCBxdWV1ZS5jbG9uZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlRdWV1ZTxTdHJpbmc+IHF1ZXVlID0gdGhpcy5idWlsZFF1ZXVlKCk7Ci0JCXF1ZXVlLmVucXVldWUoImZpcnN0Iik7Ci0JCXF1ZXVlLmVucXVldWUoInNlY29uZCIpOwotCQlxdWV1ZS5lbnF1ZXVlKCJ0aGlyZCIpOwotCi0JCXRoaXMudmVyaWZ5Q2xvbmUocXVldWUsIFRlc3RUb29scy5zZXJpYWxpemUocXVldWUpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2xvbmUoUXVldWU8U3RyaW5nPiBvcmlnaW5hbCwgUXVldWU8U3RyaW5nPiBjbG9uZSkgewotCQlhc3NlcnROb3RTYW1lKG9yaWdpbmFsLCBjbG9uZSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5wZWVrKCksIGNsb25lLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5kZXF1ZXVlKCksIGNsb25lLmRlcXVldWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5wZWVrKCksIGNsb25lLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5kZXF1ZXVlKCksIGNsb25lLmRlcXVldWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5pc0VtcHR5KCksIGNsb25lLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5wZWVrKCksIGNsb25lLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5kZXF1ZXVlKCksIGNsb25lLmRlcXVldWUoKSk7Ci0JCWFzc2VydFRydWUob3JpZ2luYWwuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLmlzRW1wdHkoKSwgY2xvbmUuaXNFbXB0eSgpKTsKLQotCQlvcmlnaW5hbC5lbnF1ZXVlKCJmb3VydGgiKTsKLQkJYXNzZXJ0RmFsc2Uob3JpZ2luYWwuaXNFbXB0eSgpKTsKLQkJLy8gY2xvbmUgc2hvdWxkIHN0aWxsIGJlIGVtcHR5Ci0JCWFzc2VydFRydWUoY2xvbmUuaXNFbXB0eSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVTdGFja1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlU3RhY2tUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzNkODYzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVTdGFja1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RhY2s7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbXBsZVN0YWNrVGVzdHMKLQlleHRlbmRzIE11bHRpVGhyZWFkZWRUZXN0Q2FzZQotewotCXB1YmxpYyBTaW1wbGVTdGFja1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCVN0YWNrPFN0cmluZz4gYnVpbGRTdGFjaygpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVTdGFjazxTdHJpbmc+KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzRW1wdHkoKSB7Ci0JCVN0YWNrPFN0cmluZz4gc3RhY2sgPSB0aGlzLmJ1aWxkU3RhY2soKTsKLQkJYXNzZXJ0VHJ1ZShzdGFjay5pc0VtcHR5KCkpOwotCQlzdGFjay5wdXNoKCJmaXJzdCIpOwotCQlhc3NlcnRGYWxzZShzdGFjay5pc0VtcHR5KCkpOwotCQlzdGFjay5wdXNoKCJzZWNvbmQiKTsKLQkJYXNzZXJ0RmFsc2Uoc3RhY2suaXNFbXB0eSgpKTsKLQkJc3RhY2sucG9wKCk7Ci0JCWFzc2VydEZhbHNlKHN0YWNrLmlzRW1wdHkoKSk7Ci0JCXN0YWNrLnBvcCgpOwotCQlhc3NlcnRUcnVlKHN0YWNrLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFB1c2hBbmRQb3AoKSB7Ci0JCVN0YWNrPFN0cmluZz4gc3RhY2sgPSB0aGlzLmJ1aWxkU3RhY2soKTsKLQkJU3RyaW5nIGZpcnN0ID0gImZpcnN0IjsKLQkJU3RyaW5nIHNlY29uZCA9ICJzZWNvbmQiOwotCi0JCXN0YWNrLnB1c2goZmlyc3QpOwotCQlzdGFjay5wdXNoKHNlY29uZCk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHN0YWNrLnBvcCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBzdGFjay5wb3AoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFB1c2hBbmRQZWVrKCkgewotCQlTdGFjazxTdHJpbmc+IHN0YWNrID0gdGhpcy5idWlsZFN0YWNrKCk7Ci0JCVN0cmluZyBmaXJzdCA9ICJmaXJzdCI7Ci0JCVN0cmluZyBzZWNvbmQgPSAic2Vjb25kIjsKLQotCQlzdGFjay5wdXNoKGZpcnN0KTsKLQkJc3RhY2sucHVzaChzZWNvbmQpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBzdGFjay5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBzdGFjay5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBzdGFjay5wb3AoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgc3RhY2sucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBzdGFjay5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHN0YWNrLnBvcCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdGFja0V4Y2VwdGlvblBlZWsoKSB7Ci0JCVN0YWNrPFN0cmluZz4gc3RhY2sgPSB0aGlzLmJ1aWxkU3RhY2soKTsKLQkJU3RyaW5nIGZpcnN0ID0gImZpcnN0IjsKLQkJU3RyaW5nIHNlY29uZCA9ICJzZWNvbmQiOwotCi0JCXN0YWNrLnB1c2goZmlyc3QpOwotCQlzdGFjay5wdXNoKHNlY29uZCk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHN0YWNrLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHN0YWNrLnBvcCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBzdGFjay5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHN0YWNrLnBvcCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzdGFjay5wZWVrKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKEVtcHR5U3RhY2tFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdGFja0V4Y2VwdGlvblBvcCgpIHsKLQkJU3RhY2s8U3RyaW5nPiBzdGFjayA9IHRoaXMuYnVpbGRTdGFjaygpOwotCQlTdHJpbmcgZmlyc3QgPSAiZmlyc3QiOwotCQlTdHJpbmcgc2Vjb25kID0gInNlY29uZCI7Ci0KLQkJc3RhY2sucHVzaChmaXJzdCk7Ci0JCXN0YWNrLnB1c2goc2Vjb25kKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgc3RhY2sucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgc3RhY2sucG9wKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHN0YWNrLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgc3RhY2sucG9wKCkpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN0YWNrLnBvcCgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChFbXB0eVN0YWNrRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlTaW1wbGVTdGFjazxTdHJpbmc+IHN0YWNrID0gKFNpbXBsZVN0YWNrPFN0cmluZz4pIHRoaXMuYnVpbGRTdGFjaygpOwotCQlzdGFjay5wdXNoKCJmaXJzdCIpOwotCQlzdGFjay5wdXNoKCJzZWNvbmQiKTsKLQkJc3RhY2sucHVzaCgidGhpcmQiKTsKLQotCQl0aGlzLnZlcmlmeUNsb25lKHN0YWNrLCBzdGFjay5jbG9uZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTdGFjazxTdHJpbmc+IHN0YWNrID0gdGhpcy5idWlsZFN0YWNrKCk7Ci0JCXN0YWNrLnB1c2goImZpcnN0Iik7Ci0JCXN0YWNrLnB1c2goInNlY29uZCIpOwotCQlzdGFjay5wdXNoKCJ0aGlyZCIpOwotCi0JCXRoaXMudmVyaWZ5Q2xvbmUoc3RhY2ssIFRlc3RUb29scy5zZXJpYWxpemUoc3RhY2spKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2xvbmUoU3RhY2s8U3RyaW5nPiBvcmlnaW5hbCwgU3RhY2s8U3RyaW5nPiBjbG9uZSkgewotCQlhc3NlcnROb3RTYW1lKG9yaWdpbmFsLCBjbG9uZSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5wZWVrKCksIGNsb25lLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5wb3AoKSwgY2xvbmUucG9wKCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwucGVlaygpLCBjbG9uZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwucG9wKCksIGNsb25lLnBvcCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLmlzRW1wdHkoKSwgY2xvbmUuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLnBlZWsoKSwgY2xvbmUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLnBvcCgpLCBjbG9uZS5wb3AoKSk7Ci0JCWFzc2VydFRydWUob3JpZ2luYWwuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLmlzRW1wdHkoKSwgY2xvbmUuaXNFbXB0eSgpKTsKLQotCQlvcmlnaW5hbC5wdXNoKCJmb3VydGgiKTsKLQkJYXNzZXJ0RmFsc2Uob3JpZ2luYWwuaXNFbXB0eSgpKTsKLQkJLy8gY2xvbmUgc2hvdWxkIHN0aWxsIGJlIGVtcHR5Ci0JCWFzc2VydFRydWUoY2xvbmUuaXNFbXB0eSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TdHJpbmdUb29sc1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3RyaW5nVG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzRiYWIyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TdHJpbmdUb29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTdHJpbmdUb29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFN0cmluZ1Rvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gYWN0dWFsKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgbmV3IFN0cmluZyhhY3R1YWwpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHBhZGRpbmcvdHJ1bmNhdGluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkKCkgewotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBTdHJpbmdUb29scy5wYWQoImZyZWQiLCA0KSk7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgU3RyaW5nVG9vbHMucGFkKCJmcmVkIiwgNikpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoImZyIiwgU3RyaW5nVG9vbHMucGFkKCJmcmVkIiwgMikpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkQ2hhckFycmF5KCkgewotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBTdHJpbmdUb29scy5wYWQobmV3IGNoYXJbXSB7ICdmJywgJ3InLCAnZScsICdkJyB9LCA0KSk7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgU3RyaW5nVG9vbHMucGFkKG5ldyBjaGFyW10geyAnZicsICdyJywgJ2UnLCAnZCcgfSwgNikpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoImZyIiwgU3RyaW5nVG9vbHMucGFkKG5ldyBjaGFyW10geyAnZicsICdyJywgJ2UnLCAnZCcgfSwgMikpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT25Xcml0ZXIoKSB7Ci0JCVdyaXRlciB3cml0ZXI7Ci0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCA0LCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5wYWRPbigiZnJlZCIsIDYsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCi0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCAyLCB3cml0ZXIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT25TdHJpbmdCdWZmZXIoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYjsKLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgNCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCA2LCBzYik7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgMiwgc2IpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT25TdHJpbmdCdWlsZGVyKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiOwotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgNCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgNiwgc2IpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQgICIsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCAyLCBzYik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPclRydW5jYXRlKCkgewotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBTdHJpbmdUb29scy5wYWRPclRydW5jYXRlKCJmcmVkIiwgNCkpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQgICIsIFN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGUoImZyZWQiLCA2KSk7Ci0JCWFzc2VydEVxdWFscygiZnIiLCBTdHJpbmdUb29scy5wYWRPclRydW5jYXRlKCJmcmVkIiwgMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPclRydW5jYXRlQ2hhckFycmF5KCkgewotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBTdHJpbmdUb29scy5wYWRPclRydW5jYXRlKG5ldyBjaGFyW10geyAnZicsICdyJywgJ2UnLCAnZCcgfSwgNCkpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQgICIsIFN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGUobmV3IGNoYXJbXSB7ICdmJywgJ3InLCAnZScsICdkJyB9LCA2KSk7Ci0JCWFzc2VydEVxdWFscygiZnIiLCBTdHJpbmdUb29scy5wYWRPclRydW5jYXRlKG5ldyBjaGFyW10geyAnZicsICdyJywgJ2UnLCAnZCcgfSwgMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPclRydW5jYXRlT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCJmcmVkIiwgImZyZWQiLCA0KTsKLQkJdGhpcy52ZXJpZnlQYWRPclRydW5jYXRlT25Xcml0ZXIoImZyZWQgICIsICJmcmVkIiwgNik7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCJmciIsICJmcmVkIiwgMik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVBhZE9yVHJ1bmNhdGVPbldyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigiZnJlZCIsICJmcmVkIiwgNCk7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCJmcmVkICAiLCAiZnJlZCIsIDYpOwotCQl0aGlzLnZlcmlmeVBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigiZnIiLCAiZnJlZCIsIDIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigiZnJlZCIsICJmcmVkIiwgNCk7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigiZnJlZCAgIiwgImZyZWQiLCA2KTsKLQkJdGhpcy52ZXJpZnlQYWRPclRydW5jYXRlT25TdHJpbmdCdWlsZGVyKCJmciIsICJmcmVkIiwgMik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5wYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCIxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZCgiMTIzNCIsIDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkKCIxMjM0IiwgNikpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjEyIiwgU3RyaW5nVG9vbHMuemVyb1BhZCgiMTIzNCIsIDIpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscygiMTIzNCIsIFN0cmluZ1Rvb2xzLnplcm9QYWQobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCA0KSk7Ci0JCWFzc2VydEVxdWFscygiMDAxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZChuZXcgY2hhcltdIHsgJzEnLCAnMicsICczJywgJzQnIH0sIDYpKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJYXNzZXJ0RXF1YWxzKCIxMiIsIFN0cmluZ1Rvb2xzLnplcm9QYWQobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCAyKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkT25Xcml0ZXIoKSB7Ci0JCVdyaXRlciB3cml0ZXI7Ci0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgNCwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKCIxMjM0Iiwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCi0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgNiwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCAyLCB3cml0ZXIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZE9uU3RyaW5nQnVmZmVyKCkgewotCQlTdHJpbmdCdWZmZXIgc2I7Ci0JCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCA0LCBzYik7Ci0JCWFzc2VydEVxdWFscygiMTIzNCIsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCA2LCBzYik7Ci0JCWFzc2VydEVxdWFscygiMDAxMjM0Iiwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDIsIHNiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2I7Ci0JCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgNCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoIjEyMzQiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDYsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDIsIHNiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPclRydW5jYXRlKCkgewotCQlhc3NlcnRFcXVhbHMoIjEyMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZSgiMTIzNCIsIDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZSgiMTIzNCIsIDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCIzNCIsIFN0cmluZ1Rvb2xzLnplcm9QYWRPclRydW5jYXRlKCIxMjM0IiwgMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkT3JUcnVuY2F0ZUNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCIxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGUobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCA0KSk7Ci0JCWFzc2VydEVxdWFscygiMDAxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGUobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCA2KSk7Ci0JCWFzc2VydEVxdWFscygiMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZShuZXcgY2hhcltdIHsgJzEnLCAnMicsICczJywgJzQnIH0sIDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZE9yVHJ1bmNhdGVPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCIxMjM0IiwgIjEyMzQiLCA0KTsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCIwMDEyMzQiLCAiMTIzNCIsIDYpOwotCQl0aGlzLnZlcmlmeVplcm9QYWRPclRydW5jYXRlT25Xcml0ZXIoIjM0IiwgIjEyMzQiLCAyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPbldyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigiMTIzNCIsICIxMjM0IiwgNCk7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigiMDAxMjM0IiwgIjEyMzQiLCA2KTsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCIzNCIsICIxMjM0IiwgMik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVplcm9QYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigiMTIzNCIsICIxMjM0IiwgNCk7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoIjAwMTIzNCIsICIxMjM0IiwgNik7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoIjM0IiwgIjEyMzQiLCAyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzZXBhcmF0aW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTZXBhcmF0ZVN0cmluZ0NoYXJJbnQoKSB7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGUoIjAxMjM0NSIsICctJywgMjIsICIwMTIzNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZSgiMDEyMzQ1IiwgJy0nLCAgNiwgIjAxMjM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlKCIwMTIzNDUiLCAnLScsICA1LCAiMDEyMzQtNSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlKCIwMTIzNDUiLCAnLScsICA0LCAiMDEyMy00NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlKCIwMTIzNDUiLCAnLScsICAzLCAiMDEyLTM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlKCIwMTIzNDUiLCAnLScsICAyLCAiMDEtMjMtNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZSgiMDEyMzQ1IiwgJy0nLCAgMSwgIjAtMS0yLTMtNC01Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNlcGFyYXRlKFN0cmluZyBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudExlbmd0aCwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMuc2VwYXJhdGUoc3RyaW5nLCBzZXBhcmF0b3IsIHNlZ21lbnRMZW5ndGgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VwYXJhdGVPblN0cmluZ0NoYXJJbnRXcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVPbldyaXRlcigiMDEyMzQ1IiwgJy0nLCAyMiwgIjAxMjM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlT25Xcml0ZXIoIjAxMjM0NSIsICctJywgIDYsICIwMTIzNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uV3JpdGVyKCIwMTIzNDUiLCAnLScsICA1LCAiMDEyMzQtNSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlT25Xcml0ZXIoIjAxMjM0NSIsICctJywgIDQsICIwMTIzLTQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVPbldyaXRlcigiMDEyMzQ1IiwgJy0nLCAgMywgIjAxMi0zNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uV3JpdGVyKCIwMTIzNDUiLCAnLScsICAyLCAiMDEtMjMtNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uV3JpdGVyKCIwMTIzNDUiLCAnLScsICAxLCAiMC0xLTItMy00LTUiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2VwYXJhdGVPbldyaXRlcihTdHJpbmcgc3RyaW5nLCBjaGFyIHNlcGFyYXRvciwgaW50IHNlZ21lbnRMZW5ndGgsIFN0cmluZyBleHBlY3RlZCkgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5zZXBhcmF0ZU9uKHN0cmluZywgc2VwYXJhdG9yLCBzZWdtZW50TGVuZ3RoLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VwYXJhdGVPblN0cmluZ0NoYXJJbnRTdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVPblN0cmluZ0J1ZmZlcigiMDEyMzQ1IiwgJy0nLCAyMiwgIjAxMjM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlT25TdHJpbmdCdWZmZXIoIjAxMjM0NSIsICctJywgIDYsICIwMTIzNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uU3RyaW5nQnVmZmVyKCIwMTIzNDUiLCAnLScsICA1LCAiMDEyMzQtNSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlT25TdHJpbmdCdWZmZXIoIjAxMjM0NSIsICctJywgIDQsICIwMTIzLTQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVPblN0cmluZ0J1ZmZlcigiMDEyMzQ1IiwgJy0nLCAgMywgIjAxMi0zNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uU3RyaW5nQnVmZmVyKCIwMTIzNDUiLCAnLScsICAyLCAiMDEtMjMtNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uU3RyaW5nQnVmZmVyKCIwMTIzNDUiLCAnLScsICAxLCAiMC0xLTItMy00LTUiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2VwYXJhdGVPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBjaGFyIHNlcGFyYXRvciwgaW50IHNlZ21lbnRMZW5ndGgsIFN0cmluZyBleHBlY3RlZCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnNlcGFyYXRlT24oc3RyaW5nLCBzZXBhcmF0b3IsIHNlZ21lbnRMZW5ndGgsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VwYXJhdGVPblN0cmluZ0NoYXJJbnRTdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVNlcGFyYXRlT25TdHJpbmdCdWlsZGVyKCIwMTIzNDUiLCAnLScsIDIyLCAiMDEyMzQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVPblN0cmluZ0J1aWxkZXIoIjAxMjM0NSIsICctJywgIDYsICIwMTIzNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uU3RyaW5nQnVpbGRlcigiMDEyMzQ1IiwgJy0nLCAgNSwgIjAxMjM0LTUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uU3RyaW5nQnVpbGRlcigiMDEyMzQ1IiwgJy0nLCAgNCwgIjAxMjMtNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uU3RyaW5nQnVpbGRlcigiMDEyMzQ1IiwgJy0nLCAgMywgIjAxMi0zNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uU3RyaW5nQnVpbGRlcigiMDEyMzQ1IiwgJy0nLCAgMiwgIjAxLTIzLTQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVPblN0cmluZ0J1aWxkZXIoIjAxMjM0NSIsICctJywgIDEsICIwLTEtMi0zLTQtNSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTZXBhcmF0ZU9uU3RyaW5nQnVpbGRlcihTdHJpbmcgc3RyaW5nLCBjaGFyIHNlcGFyYXRvciwgaW50IHNlZ21lbnRMZW5ndGgsIFN0cmluZyBleHBlY3RlZCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuc2VwYXJhdGVPbihzdHJpbmcsIHNlcGFyYXRvciwgc2VnbWVudExlbmd0aCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXBhcmF0ZUNoYXJBcnJheUNoYXJJbnQoKSB7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXkoIjAxMjM0NSIsICctJywgMjIsICIwMTIzNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheSgiMDEyMzQ1IiwgJy0nLCAgNiwgIjAxMjM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5KCIwMTIzNDUiLCAnLScsICA1LCAiMDEyMzQtNSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5KCIwMTIzNDUiLCAnLScsICA0LCAiMDEyMy00NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5KCIwMTIzNDUiLCAnLScsICAzLCAiMDEyLTM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5KCIwMTIzNDUiLCAnLScsICAyLCAiMDEtMjMtNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheSgiMDEyMzQ1IiwgJy0nLCAgMSwgIjAtMS0yLTMtNC01Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNlcGFyYXRlQ2hhckFycmF5KFN0cmluZyBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudExlbmd0aCwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMuc2VwYXJhdGUoc3RyaW5nLnRvQ2hhckFycmF5KCksIHNlcGFyYXRvciwgc2VnbWVudExlbmd0aCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXBhcmF0ZU9uQ2hhckFycmF5Q2hhckludFdyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uV3JpdGVyKCIwMTIzNDUiLCAnLScsIDIyLCAiMDEyMzQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXlPbldyaXRlcigiMDEyMzQ1IiwgJy0nLCAgNiwgIjAxMjM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25Xcml0ZXIoIjAxMjM0NSIsICctJywgIDUsICIwMTIzNC01Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXlPbldyaXRlcigiMDEyMzQ1IiwgJy0nLCAgNCwgIjAxMjMtNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uV3JpdGVyKCIwMTIzNDUiLCAnLScsICAzLCAiMDEyLTM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25Xcml0ZXIoIjAxMjM0NSIsICctJywgIDIsICIwMS0yMy00NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25Xcml0ZXIoIjAxMjM0NSIsICctJywgIDEsICIwLTEtMi0zLTQtNSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uV3JpdGVyKFN0cmluZyBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudExlbmd0aCwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnNlcGFyYXRlT24oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNlcGFyYXRvciwgc2VnbWVudExlbmd0aCwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcGFyYXRlT25DaGFyQXJyYXlDaGFySW50U3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25TdHJpbmdCdWZmZXIoIjAxMjM0NSIsICctJywgMjIsICIwMTIzNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uU3RyaW5nQnVmZmVyKCIwMTIzNDUiLCAnLScsICA2LCAiMDEyMzQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXlPblN0cmluZ0J1ZmZlcigiMDEyMzQ1IiwgJy0nLCAgNSwgIjAxMjM0LTUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uU3RyaW5nQnVmZmVyKCIwMTIzNDUiLCAnLScsICA0LCAiMDEyMy00NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25TdHJpbmdCdWZmZXIoIjAxMjM0NSIsICctJywgIDMsICIwMTItMzQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXlPblN0cmluZ0J1ZmZlcigiMDEyMzQ1IiwgJy0nLCAgMiwgIjAxLTIzLTQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXlPblN0cmluZ0J1ZmZlcigiMDEyMzQ1IiwgJy0nLCAgMSwgIjAtMS0yLTMtNC01Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25TdHJpbmdCdWZmZXIoU3RyaW5nIHN0cmluZywgY2hhciBzZXBhcmF0b3IsIGludCBzZWdtZW50TGVuZ3RoLCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5zZXBhcmF0ZU9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBzZXBhcmF0b3IsIHNlZ21lbnRMZW5ndGgsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VwYXJhdGVPbkNoYXJBcnJheUNoYXJJbnRTdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25TdHJpbmdCdWlsZGVyKCIwMTIzNDUiLCAnLScsIDIyLCAiMDEyMzQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXlPblN0cmluZ0J1aWxkZXIoIjAxMjM0NSIsICctJywgIDYsICIwMTIzNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uU3RyaW5nQnVpbGRlcigiMDEyMzQ1IiwgJy0nLCAgNSwgIjAxMjM0LTUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uU3RyaW5nQnVpbGRlcigiMDEyMzQ1IiwgJy0nLCAgNCwgIjAxMjMtNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uU3RyaW5nQnVpbGRlcigiMDEyMzQ1IiwgJy0nLCAgMywgIjAxMi0zNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uU3RyaW5nQnVpbGRlcigiMDEyMzQ1IiwgJy0nLCAgMiwgIjAxLTIzLTQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXlPblN0cmluZ0J1aWxkZXIoIjAxMjM0NSIsICctJywgIDEsICIwLTEtMi0zLTQtNSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uU3RyaW5nQnVpbGRlcihTdHJpbmcgc3RyaW5nLCBjaGFyIHNlcGFyYXRvciwgaW50IHNlZ21lbnRMZW5ndGgsIFN0cmluZyBleHBlY3RlZCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuc2VwYXJhdGVPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2VwYXJhdG9yLCBzZWdtZW50TGVuZ3RoLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBkZWxpbWl0aW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3REZWxpbWl0KCkgewotCQl0aGlzLnZlcmlmeURlbGltaXQoIkVtcGxveWVlIiwgIjEyMyIsICIxMjNFbXBsb3llZTEyMyIpOwotCQl0aGlzLnZlcmlmeURlbGltaXQoIjEyMyIsICIxMjMiLCAiMTIzMTIzMTIzIik7Ci0JCXRoaXMudmVyaWZ5RGVsaW1pdCgiIiwgIjEyMyIsICIxMjMxMjMiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGVsaW1pdChTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZGVsaW1pdGVyLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5kZWxpbWl0KHN0cmluZywgZGVsaW1pdGVyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlbGltaXRPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlEZWxpbWl0T25Xcml0ZXIoIkVtcGxveWVlIiwgIjEyMyIsICIxMjNFbXBsb3llZTEyMyIpOwotCQl0aGlzLnZlcmlmeURlbGltaXRPbldyaXRlcigiMTIzIiwgIjEyMyIsICIxMjMxMjMxMjMiKTsKLQkJdGhpcy52ZXJpZnlEZWxpbWl0T25Xcml0ZXIoIiIsICIxMjMiLCAiMTIzMTIzIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeURlbGltaXRPbldyaXRlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZGVsaW1pdGVyLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVsaW1pdE9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeURlbGltaXRPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUiLCAiMTIzIiwgIjEyM0VtcGxveWVlMTIzIik7Ci0JCXRoaXMudmVyaWZ5RGVsaW1pdE9uU3RyaW5nQnVmZmVyKCIxMjMiLCAiMTIzIiwgIjEyMzEyMzEyMyIpOwotCQl0aGlzLnZlcmlmeURlbGltaXRPblN0cmluZ0J1ZmZlcigiIiwgIjEyMyIsICIxMjMxMjMiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGVsaW1pdE9uU3RyaW5nQnVmZmVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyBkZWxpbWl0ZXIsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmRlbGltaXRPbihzdHJpbmcsIGRlbGltaXRlciwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWxpbWl0T25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeURlbGltaXRPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlIiwgIjEyMyIsICIxMjNFbXBsb3llZTEyMyIpOwotCQl0aGlzLnZlcmlmeURlbGltaXRPblN0cmluZ0J1aWxkZXIoIjEyMyIsICIxMjMiLCAiMTIzMTIzMTIzIik7Ci0JCXRoaXMudmVyaWZ5RGVsaW1pdE9uU3RyaW5nQnVpbGRlcigiIiwgIjEyMyIsICIxMjMxMjMiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGVsaW1pdE9uU3RyaW5nQnVpbGRlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZGVsaW1pdGVyLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmRlbGltaXRPbihzdHJpbmcsIGRlbGltaXRlciwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RRdW90ZSgpIHsKLQkJdGhpcy52ZXJpZnlRdW90ZSgiRW1wbG95ZWUiLCAiXCJFbXBsb3llZVwiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGUoIjEyMyIsICJcIjEyM1wiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGUoIiIsICJcIlwiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGUoIkVtcFwibG95ZWUiLCAiXCJFbXBcIlwibG95ZWVcIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlRdW90ZShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5xdW90ZShzdHJpbmcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UXVvdGVPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uV3JpdGVyKCJFbXBsb3llZSIsICJcIkVtcGxveWVlXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uV3JpdGVyKCIxMjMiLCAiXCIxMjNcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25Xcml0ZXIoIiIsICJcIlwiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPbldyaXRlcigiRW1wXCJsb3llZSIsICJcIkVtcFwiXCJsb3llZVwiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVF1b3RlT25Xcml0ZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnF1b3RlT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UXVvdGVPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSIsICJcIkVtcGxveWVlXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uU3RyaW5nQnVmZmVyKCIxMjMiLCAiXCIxMjNcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25TdHJpbmdCdWZmZXIoIiIsICJcIlwiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPblN0cmluZ0J1ZmZlcigiRW1wXCJsb3llZSIsICJcIkVtcFwiXCJsb3llZVwiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVF1b3RlT25TdHJpbmdCdWZmZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucXVvdGVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UXVvdGVPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlIiwgIlwiRW1wbG95ZWVcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25TdHJpbmdCdWlsZGVyKCIxMjMiLCAiXCIxMjNcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25TdHJpbmdCdWlsZGVyKCIiLCAiXCJcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25TdHJpbmdCdWlsZGVyKCJFbXBcImxveWVlIiwgIlwiRW1wXCJcImxveWVlXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UXVvdGVPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5xdW90ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogcmVtb3ZpbmcgY2hhcmFjdGVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPY2N1cnJlbmNlKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZSgiRW1wbG8meWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoIkVtcGxvJnllZSYiLCAnJicsICJFbXBsb3llZSYiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoIkVtcGxveWVlICZGb28iLCAnJicsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoIkVtcGxveWVlJiIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlKCImRW1wbG95ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIFN0cmluZ1Rvb2xzLnJlbW92ZUZpcnN0T2NjdXJyZW5jZShzdHJpbmcsIGNoYXJUb1JlbW92ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGaXJzdE9jY3VycmVuY2VDaGFyQXJyYXkoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlQ2hhckFycmF5KCJFbXBsbyZ5ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheSgiRW1wbG8meWVlJiIsICcmJywgIkVtcGxveWVlJiIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheSgiRW1wbG95ZWUgJkZvbyIsICcmJywgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheSgiRW1wbG95ZWUmIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VDaGFyQXJyYXkoIiZFbXBsb3llZSIsICcmJywgIkVtcGxveWVlIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheShTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgU3RyaW5nVG9vbHMucmVtb3ZlRmlyc3RPY2N1cnJlbmNlKHN0cmluZy50b0NoYXJBcnJheSgpLCBjaGFyVG9SZW1vdmUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25Xcml0ZXIoIkVtcGxvJnllZSIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25Xcml0ZXIoIkVtcGxvJnllZSYiLCAnJicsICJFbXBsb3llZSYiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPbldyaXRlcigiRW1wbG95ZWUgJkZvbyIsICcmJywgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uV3JpdGVyKCJFbXBsb3llZSYiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uV3JpdGVyKCImRW1wbG95ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPbldyaXRlcihTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKHN0cmluZywgY2hhclRvUmVtb3ZlLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWZmZXIoIkVtcGxvJnllZSIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWZmZXIoIkVtcGxvJnllZSYiLCAnJicsICJFbXBsb3llZSYiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUgJkZvbyIsICcmJywgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSYiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVmZmVyKCImRW1wbG95ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oc3RyaW5nLCBjaGFyVG9SZW1vdmUsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVpbGRlcigiRW1wbG8meWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxvJnllZSYiLCAnJicsICJFbXBsb3llZSYiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlICZGb28iLCAnJicsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlJiIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWlsZGVyKCImRW1wbG95ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oc3RyaW5nLCBjaGFyVG9SZW1vdmUsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXMoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXMoIkVtcGxveWVlIEZyZWQiLCAnICcsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlcygiIEVtcGxveWVlICIsICcgJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXMoIkVtcGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlcygiIEVtcCBsb3llZSAgIEZvbyIsICcgJywgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzKFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhzdHJpbmcsIGNoYXJUb1JlbW92ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheSgpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheSgiRW1wbG95ZWUgRnJlZCIsICcgJywgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzQ2hhckFycmF5KCIgRW1wbG95ZWUgIiwgJyAnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheSgiRW1wbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzQ2hhckFycmF5KCIgRW1wIGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNDaGFyQXJyYXkoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIFN0cmluZ1Rvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKHN0cmluZy50b0NoYXJBcnJheSgpLCBjaGFyVG9SZW1vdmUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uV3JpdGVyKCJFbXBsb3llZSBGcmVkIiwgJyAnLCAiRW1wbG95ZWVGcmVkIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPbldyaXRlcigiIEVtcGxveWVlICIsICcgJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPbldyaXRlcigiRW1wbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25Xcml0ZXIoIiBFbXAgbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uV3JpdGVyKFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsIGNoYXJUb1JlbW92ZSwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUgRnJlZCIsICcgJywgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWZmZXIoIiBFbXBsb3llZSAiLCAnICcsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVmZmVyKCIgRW1wIGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsIGNoYXJUb1JlbW92ZSwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVpbGRlcigiRW1wbG95ZWUgRnJlZCIsICcgJywgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWlsZGVyKCIgRW1wbG95ZWUgIiwgJyAnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVpbGRlcigiRW1wbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWlsZGVyKCIgRW1wIGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsIGNoYXJUb1JlbW92ZSwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxXaGl0ZXNwYWNlKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2UoIkVtcGxveWVlIEZyZWRcdCIsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlKCJcdEVtcGxveWVlXG4iLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlKCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlKCIgRW1wXHRsb3llZSBcbiBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlKHN0cmluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxXaGl0ZXNwYWNlQ2hhckFycmF5KCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VDaGFyQXJyYXkoIkVtcGxveWVlIEZyZWRcdCIsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlQ2hhckFycmF5KCJcdEVtcGxveWVlXG4iLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlQ2hhckFycmF5KCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlQ2hhckFycmF5KCIgRW1wXHRsb3llZSBcbiBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZUNoYXJBcnJheShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlKHN0cmluZy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbFdoaXRlc3BhY2VPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25Xcml0ZXIoIkVtcGxveWVlIEZyZWRcdCIsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25Xcml0ZXIoIlx0RW1wbG95ZWVcbiIsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPbldyaXRlcigiRW1wbG95ZWUgXHQgRm9vIiwgIkVtcGxveWVlRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uV3JpdGVyKCIgRW1wXHRsb3llZSBcbiBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uV3JpdGVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUgRnJlZFx0IiwgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1ZmZlcigiXHRFbXBsb3llZVxuIiwgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoIiBFbXBcdGxveWVlIFxuIEZvbyIsICJFbXBsb3llZUZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlIEZyZWRcdCIsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCJcdEVtcGxveWVlXG4iLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCIgRW1wXHRsb3llZSBcbiBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVpbGRlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUFsbFdoaXRlc3BhY2VPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcHJlc3NXaGl0ZXNwYWNlKCkgewotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZSgiRW1wbG95ZWUgICAgICBGcmVkXHQiLCAiRW1wbG95ZWUgRnJlZCAiKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2UoIlx0RW1wbG95ZWUgIFxuIiwgIiBFbXBsb3llZSAiKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2UoIkVtcGxveWVlIFx0IEZvbyIsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2UoIiBFbXBcdGxveWVlIFxuIEZvbyAiLCAiIEVtcCBsb3llZSBGb28gIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5jb21wcmVzc1doaXRlc3BhY2Uoc3RyaW5nKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXByZXNzV2hpdGVzcGFjZUNoYXJBcnJheSgpIHsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VDaGFyQXJyYXkoIkVtcGxveWVlICAgICAgRnJlZFx0IiwgIkVtcGxveWVlIEZyZWQgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlQ2hhckFycmF5KCJcdEVtcGxveWVlICBcbiIsICIgRW1wbG95ZWUgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlQ2hhckFycmF5KCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWUgRm9vIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlQ2hhckFycmF5KCIgRW1wXHRsb3llZSBcbiBGb28gIiwgIiBFbXAgbG95ZWUgRm9vICIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VDaGFyQXJyYXkoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgU3RyaW5nVG9vbHMuY29tcHJlc3NXaGl0ZXNwYWNlKHN0cmluZy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXByZXNzV2hpdGVzcGFjZU9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uV3JpdGVyKCJFbXBsb3llZSAgICAgIEZyZWRcdCIsICJFbXBsb3llZSBGcmVkICIpOwotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uV3JpdGVyKCJcdEVtcGxveWVlICBcbiIsICIgRW1wbG95ZWUgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25Xcml0ZXIoIkVtcGxveWVlIFx0IEZvbyIsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPbldyaXRlcigiIEVtcFx0bG95ZWUgXG4gRm9vICIsICIgRW1wIGxveWVlIEZvbyAiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25Xcml0ZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbXByZXNzV2hpdGVzcGFjZU9uKHN0cmluZywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXByZXNzV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSAgICAgIEZyZWRcdCIsICJFbXBsb3llZSBGcmVkICIpOwotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCJcdEVtcGxveWVlICBcbiIsICIgRW1wbG95ZWUgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlIFx0IEZvbyIsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPblN0cmluZ0J1ZmZlcigiIEVtcFx0bG95ZWUgXG4gRm9vICIsICIgRW1wIGxveWVlIEZvbyAiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29tcHJlc3NXaGl0ZXNwYWNlT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXByZXNzV2hpdGVzcGFjZU9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlICAgICAgRnJlZFx0IiwgIkVtcGxveWVlIEZyZWQgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCJcdEVtcGxveWVlICBcbiIsICIgRW1wbG95ZWUgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWUgRm9vIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCIgRW1wXHRsb3llZSBcbiBGb28gIiwgIiBFbXAgbG95ZWUgRm9vICIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5jb21wcmVzc1doaXRlc3BhY2VPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbW1vbiBwcmVmaXggKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbW1vblByZWZpeExlbmd0aCgpIHsKLQkJYXNzZXJ0RXF1YWxzKDMsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vWlpaIiwgImZvb0JCQiIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vIiwgImZvb0JCQiIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vWlpaIiwgImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tbW9uUHJlZml4TGVuZ3RoTWF4KCkgewotCQlhc3NlcnRFcXVhbHMoMiwgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb29aWloiLCAiZm9vQkJCIiwgMikpOwotCQlhc3NlcnRFcXVhbHMoMiwgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb28iLCAiZm9vQkJCIiwgMikpOwotCQlhc3NlcnRFcXVhbHMoMiwgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb29aWloiLCAiZm9vIiwgMikpOwotCQlhc3NlcnRFcXVhbHMoMiwgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb28iLCAiZm9vIiwgMikpOwotCX0KLQotCS8vICoqKioqKioqKiogY2FwaXRhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVDaGFyQXJyYXkoKSB7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiT3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdPJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiT3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdvJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiICAgIiwgbmV3IGNoYXJbXSB7ICcgJywgJyAnLCAnICcgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiT1JBQ0xFIiwgbmV3IGNoYXJbXSB7ICdPJywgJ1InLCAnQScsICdDJywgJ0wnLCAnRScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiIiwgbmV3IGNoYXJbMF0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVDaGFyQXJyYXkoIkEiLCBuZXcgY2hhcltdIHsgJ2EnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVDaGFyQXJyYXkoIlx1MDBDOWNvbGUiLCBuZXcgY2hhcltdIHsgJ1x1MDBFOScsICdjJywgJ28nLCAnbCcsICdlJyB9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheShTdHJpbmcgZXhwZWN0ZWQsIGNoYXJbXSBzdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy5jYXBpdGFsaXplKHN0cmluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplU3RyaW5nKCkgewotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVTdHJpbmcoIk9yYWNsZSIsICJPcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplU3RyaW5nKCJPcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZygiICAgIiwgIiAgICIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVTdHJpbmcoIk9SQUNMRSIsICJPUkFDTEUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplU3RyaW5nKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZygiQSIsICJhIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZygiXHUwMEM5Y29sZSIsICJcdTAwRTljb2xlIik7IC8vIO+/vWNvbGUtPu+/vUNPTEUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZyhTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy5jYXBpdGFsaXplKHN0cmluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJPcmFjbGUiLCBuZXcgY2hhcltdIHsgJ08nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiICAgIiwgbmV3IGNoYXJbXSB7ICcgJywgJyAnLCAnICcgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJPUkFDTEUiLCBuZXcgY2hhcltdIHsgJ08nLCAnUicsICdBJywgJ0MnLCAnTCcsICdFJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIkEiLCBuZXcgY2hhcltdIHsgJ2EnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiXHUwMEM5Y29sZSIsIG5ldyBjaGFyW10geyAnXHUwMEU5JywgJ2MnLCAnbycsICdsJywgJ2UnIH0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnTycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIiAgICIsIG5ldyBjaGFyW10geyAnICcsICcgJywgJyAnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIk9SQUNMRSIsIG5ldyBjaGFyW10geyAnTycsICdSJywgJ0EnLCAnQycsICdMJywgJ0UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJBIiwgbmV3IGNoYXJbXSB7ICdhJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJcdTAwQzljb2xlIiwgbmV3IGNoYXJbXSB7ICdcdTAwRTknLCAnYycsICdvJywgJ2wnLCAnZScgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5jYXBpdGFsaXplT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIk9yYWNsZSIsICJPcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIk9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIk9SQUNMRSIsICJPUkFDTEUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIkEiLCAiYSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiXHUwMEM5Y29sZSIsICJcdTAwRTljb2xlIik7IC8vIO+/vWNvbGUtPu+/vUNPTEUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNhcGl0YWxpemVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJPcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiT3JhY2xlIiwgIm9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiIiwgIiIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIkEiLCAiYSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIlx1MDBDOWNvbGUiLCAiXHUwMEU5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5jYXBpdGFsaXplT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnTycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiT3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdvJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCIgICAiLCBuZXcgY2hhcltdIHsgJyAnLCAnICcsICcgJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIk9SQUNMRSIsIG5ldyBjaGFyW10geyAnTycsICdSJywgJ0EnLCAnQycsICdMJywgJ0UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiIiwgbmV3IGNoYXJbMF0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiQSIsIG5ldyBjaGFyW10geyAnYScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCJcdTAwQzljb2xlIiwgbmV3IGNoYXJbXSB7ICdcdTAwRTknLCAnYycsICdvJywgJ2wnLCAnZScgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIGNoYXJbXSBzdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZU9uKHN0cmluZywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVPblN0cmluZ1dyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIk9yYWNsZSIsICJPcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIk9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIk9SQUNMRSIsICJPUkFDTEUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIkEiLCAiYSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiXHUwMEM5Y29sZSIsICJcdTAwRTljb2xlIik7IC8vIO+/vWNvbGUtPu+/vUNPTEUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5jYXBpdGFsaXplT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5hcGl0YWxpemVDaGFyQXJyYXkoKSB7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplQ2hhckFycmF5KCJvcmFjbGUiLCBuZXcgY2hhcltdIHsgJ08nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoIm9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZUNoYXJBcnJheSgiICAgIiwgbmV3IGNoYXJbXSB7ICcgJywgJyAnLCAnICcgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplQ2hhckFycmF5KCJPUkFDTEUiLCBuZXcgY2hhcltdIHsgJ08nLCAnUicsICdBJywgJ0MnLCAnTCcsICdFJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoImEiLCBuZXcgY2hhcltdIHsgJ0EnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZUNoYXJBcnJheSgiXHUwMEU5Y29sZSIsIG5ldyBjaGFyW10geyAnXHUwMEM5JywgJ2MnLCAnbycsICdsJywgJ2UnIH0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMudW5jYXBpdGFsaXplKHN0cmluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNhcGl0YWxpemVTdHJpbmcoKSB7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCJvcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCJvcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCIgICAiLCAiICAgIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCJhIiwgIkEiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVTdHJpbmcoIlx1MDBFOWNvbGUiLCAiXHUwMEM5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZVN0cmluZyhTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy51bmNhcGl0YWxpemUoc3RyaW5nKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJvcmFjbGUiLCBuZXcgY2hhcltdIHsgJ08nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigib3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdvJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIiAgICIsIG5ldyBjaGFyW10geyAnICcsICcgJywgJyAnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJPUkFDTEUiLCBuZXcgY2hhcltdIHsgJ08nLCAnUicsICdBJywgJ0MnLCAnTCcsICdFJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiIiwgbmV3IGNoYXJbMF0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJhIiwgbmV3IGNoYXJbXSB7ICdBJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiXHUwMEU5Y29sZSIsIG5ldyBjaGFyW10geyAnXHUwMEM5JywgJ2MnLCAnbycsICdsJywgJ2UnIH0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIGNoYXJbXSBzdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy51bmNhcGl0YWxpemVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigib3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdPJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJvcmFjbGUiLCBuZXcgY2hhcltdIHsgJ28nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIiAgICIsIG5ldyBjaGFyW10geyAnICcsICcgJywgJyAnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigiT1JBQ0xFIiwgbmV3IGNoYXJbXSB7ICdPJywgJ1InLCAnQScsICdDJywgJ0wnLCAnRScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCIiLCBuZXcgY2hhclswXSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJhIiwgbmV3IGNoYXJbXSB7ICdBJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIlx1MDBFOWNvbGUiLCBuZXcgY2hhcltdIHsgJ1x1MDBDOScsICdjJywgJ28nLCAnbCcsICdlJyB9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKFN0cmluZyBleHBlY3RlZCwgY2hhcltdIHN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5jYXBpdGFsaXplT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJvcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIm9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiICAgIiwgIiAgICIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiYSIsICJBIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIlx1MDBFOWNvbGUiLCAiXHUwMEM5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJvcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJvcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCIgICAiLCAiICAgIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJhIiwgIkEiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIlx1MDBFOWNvbGUiLCAiXHUwMEM5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigib3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdPJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIm9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCIgICAiLCBuZXcgY2hhcltdIHsgJyAnLCAnICcsICcgJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiT1JBQ0xFIiwgbmV3IGNoYXJbXSB7ICdPJywgJ1InLCAnQScsICdDJywgJ0wnLCAnRScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiYSIsIG5ldyBjaGFyW10geyAnQScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIlx1MDBFOWNvbGUiLCBuZXcgY2hhcltdIHsgJ1x1MDBDOScsICdjJywgJ28nLCAnbCcsICdlJyB9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZU9uKHN0cmluZywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJvcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIm9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiICAgIiwgIiAgICIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiYSIsICJBIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIlx1MDBFOWNvbGUiLCAiXHUwMEM5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy51bmNhcGl0YWxpemVPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogI3RvU3RyaW5nKCkgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEJ1aWxkVG9TdHJpbmdDbGFzc05hbWVfYW5vbnltb3VzKCkgewotCQlPYmplY3QgbyA9IG5ldyBPYmplY3QoKXsvKmFub255bW91cyBzdWJjbGFzcyBvZiBPYmplY3QqL307Ci0JCWFzc2VydEVxdWFscygiT2JqZWN0IiwgU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0NsYXNzTmFtZShvLmdldENsYXNzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVpbGRUb1N0cmluZ0NsYXNzTmFtZV9tZW1iZXIoKSB7Ci0JCWFzc2VydEVxdWFscygiTWFwLkVudHJ5IiwgU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0NsYXNzTmFtZShqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1aWxkVG9TdHJpbmdDbGFzc05hbWVfbG9jYWwoKSB7Ci0JCWNsYXNzIEZvbyB7Ci0JCQlCYXIgYmFyID0gbmV3IEJhcigpOwotCQkJY2xhc3MgQmFyIHsKLQkJCQlCYXIoKSB7Ci0JCQkJCXN1cGVyKCk7Ci0JCQkJfQotCQkJfQotCQkJRm9vKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCX0KLQkJRm9vIGZvbyA9IG5ldyBGb28oKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmdUb29sc1Rlc3RzLkZvbyIsIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdDbGFzc05hbWUoZm9vLmdldENsYXNzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmdUb29sc1Rlc3RzLkZvby5CYXIiLCBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nQ2xhc3NOYW1lKGZvby5iYXIuZ2V0Q2xhc3MoKSkpOwotCX0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNFbXB0eVN0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KChTdHJpbmcpIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KCIiKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSgiICAgICAgIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoIiAgICAgIFx0XHQgICAiKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSgiICAgICAgXHRcdCAgICIgKyBTdHJpbmdUb29scy5DUikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc0VtcHR5Q2hhckFycmF5KCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoKGNoYXJbXSkgbnVsbCkpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzRW1wdHlDaGFyQXJyYXkoIiIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzRW1wdHlDaGFyQXJyYXkoIiAgICAgIFx0XHQgICAiKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0VtcHR5Q2hhckFycmF5KCIgICAgICAiKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0VtcHR5Q2hhckFycmF5KCIgICAgICBcdFx0ICAgIiArIFN0cmluZ1Rvb2xzLkNSKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNFbXB0eUNoYXJBcnJheShTdHJpbmcgc3RyaW5nKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShzdHJpbmcudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdzQXJlRXF1YWxTdHJpbmdTdHJpbmcoKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKChTdHJpbmcpIG51bGwsIChTdHJpbmcpIG51bGwpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKG51bGwsICJhc2RmIikpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoImFzZGYiLCBudWxsKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKCJhc2RmIiwgImFzZGYiKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCgiYXNkZiIsICJBU0RGIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdzQXJlRXF1YWxDaGFyQXJyYXlDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKChjaGFyW10pIG51bGwsIChjaGFyW10pIG51bGwpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKChjaGFyW10pIG51bGwsICJhc2RmIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCgiYXNkZiIudG9DaGFyQXJyYXkoKSwgKGNoYXJbXSkgbnVsbCkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzZGYiLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiQVNERiIudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlU3RyaW5nU3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoKFN0cmluZykgbnVsbCwgKFN0cmluZykgbnVsbCkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKG51bGwsICJhc2RmIikpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCJhc2RmIiwgbnVsbCkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoImFzZGYiLCAiYXNkZiIpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCJhc2RmIiwgIkFTREYiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2VDaGFyQXJyYXlDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZSgoY2hhcltdKSBudWxsLCAoY2hhcltdKSBudWxsKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoKGNoYXJbXSkgbnVsbCwgImFzZGYiLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgKGNoYXJbXSkgbnVsbCkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJhc2RmIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgIkFTREYiLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2VTdHJpbmdTdHJpbmcoKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLCAiYXMiKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLCAiYVMiKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLCAiIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgIkEiKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLCAiYnNkZiIpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLCAiZyIpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLCAiYXNkZyIpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLCAiYXNkZmciKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFzZGZnZ2dnZ2ciKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlQ2hhckFycmF5Q2hhckFycmF5KCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiYXMiLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFTIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICIiLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgIkEiLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgIkFTREYiLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzZGYiLnRvQ2hhckFycmF5KCkpKTsKLQotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImJzZGYiLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJnIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiYXNkZyIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzZGZnIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiYXNkZmdnZ2dnZyIudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLmNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoJ2EnLCAnYScpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5jaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKCdhJywgJ0EnKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuY2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZSgnQScsICdhJykpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLmNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoJ0EnLCAnQScpKTsKLQotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5jaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKCdhJywgJ2InKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLmNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoJ0EnLCAnYicpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNVcHBlcmNhc2UoKSB7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNVcHBlcmNhc2UoIkZPTyIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzVXBwZXJjYXNlKCJGT08yIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNVcHBlcmNhc2UoIkYgTyBPIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzVXBwZXJjYXNlKCJGb28iKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNVcHBlcmNhc2UoIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTdHJpbmdJc1VwcGVyY2FzZShTdHJpbmcgcykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzVXBwZXJjYXNlKHMpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc1VwcGVyY2FzZShzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVueVN0cmluZ0lzVXBwZXJjYXNlKFN0cmluZyBzKSB7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzVXBwZXJjYXNlKHMpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNVcHBlcmNhc2Uocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzTG93ZXJjYXNlKCkgewotCQl0aGlzLnZlcmlmeVN0cmluZ0lzTG93ZXJjYXNlKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0xvd2VyY2FzZSgiZm9vMiIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzTG93ZXJjYXNlKCJmIG8gbyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0xvd2VyY2FzZSgiRm9vIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzTG93ZXJjYXNlKCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNMb3dlcmNhc2UoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0xvd2VyY2FzZShzKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNMb3dlcmNhc2Uocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbnlTdHJpbmdJc0xvd2VyY2FzZShTdHJpbmcgcykgewotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0xvd2VyY2FzZShzKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzTG93ZXJjYXNlKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCS8vICoqKioqKioqKiogY29udmVydCBjYW1lbC1jYXNlIHRvIGFsbC1jYXBzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCkgewotCQlhc3NlcnRFcXVhbHMoIlRFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJURVNUIikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3RUZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRlc3RUZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRFU1RUZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVGVzdFRFU1RUZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUX1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VEVTVFRlc3RUIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCJURVNUIiwgInRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoIlRFU1QiLCAiVEVTVCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbldyaXRlcigiVEVTVF9URVNUIiwgInRlc3RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCJURVNUX1RFU1QiLCAiVGVzdFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoIlRFU1RfVEVTVF9URVNUIiwgInRlc3RURVNUVGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbldyaXRlcigiVEVTVF9URVNUX1RFU1QiLCAiVGVzdFRFU1RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCJURVNUX1RFU1RfVEVTVF9UIiwgIlRlc3RURVNUVGVzdFQiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcigiVEVTVCIsICJ0ZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKCJURVNUIiwgIlRFU1QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVCIsICJ0ZXN0VGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUIiwgIlRlc3RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKCJURVNUX1RFU1RfVEVTVCIsICJ0ZXN0VEVTVFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVF9URVNUIiwgIlRlc3RURVNUVGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUX1RFU1RfVCIsICJUZXN0VEVTVFRlc3RUIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVCIsICJ0ZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVCIsICJURVNUIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVF9URVNUIiwgInRlc3RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVF9URVNUIiwgIlRlc3RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVF9URVNUX1RFU1QiLCAidGVzdFRFU1RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVF9URVNUX1RFU1QiLCAiVGVzdFRFU1RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigiVEVTVF9URVNUX1RFU1RfVCIsICJUZXN0VEVTVFRlc3RUIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGgoKSB7Ci0JCWFzc2VydEVxdWFscygiVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3QiLCA0NCkpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0IiwgNCkpOwotCQlhc3NlcnRFcXVhbHMoIlRFUyIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3QiLCAzKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRFU1QiLCA1KSk7Ci0JCWFzc2VydEVxdWFscygiVEUiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJURVNUIiwgMikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3RUZXN0IiwgOSkpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRlc3QiLCA4KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9UIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRlc3QiLCA2KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF8iLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0VGVzdCIsIDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRlc3QiLCA0KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVGVzdFRlc3QiLCA5KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVGVzdFRlc3QiLCAxMTAwKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUXyIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3RURVNUVGVzdCIsIDEwKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUX1RFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VEVTVFRlc3QiLCAxNCkpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUX1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VEVTVFRlc3RUIiwgMTYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1RfVEVTVF8iLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VEVTVFRlc3RUIiwgMTUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVCIsICJ0ZXN0IiwgNDQpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVCIsICJ0ZXN0IiwgNCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVMiLCAidGVzdCIsIDMpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVCIsICJURVNUIiwgNSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURSIsICJURVNUIiwgMik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1QiLCAidGVzdFRlc3QiLCA5KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTIiwgInRlc3RUZXN0IiwgOCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1QiLCAidGVzdFRlc3QiLCA2KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfIiwgInRlc3RUZXN0IiwgNSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUIiwgInRlc3RUZXN0IiwgNCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1QiLCAiVGVzdFRlc3QiLCA5KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTVCIsICJUZXN0VGVzdCIsIDExMDApOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVF9URVNUXyIsICJ0ZXN0VEVTVFRlc3QiLCAxMCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1RfVEVTVCIsICJUZXN0VEVTVFRlc3QiLCAxNCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1RfVEVTVF9UIiwgIlRlc3RURVNUVGVzdFQiLCAxNik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1RfVEVTVF8iLCAiVGVzdFRFU1RUZXN0VCIsIDE1KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgaW50IG1heCkgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oc3RyaW5nLCBtYXgsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUIiwgInRlc3QiLCA0NCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUIiwgInRlc3QiLCA0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFUyIsICJ0ZXN0IiwgMyk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUIiwgIlRFU1QiLCA1KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFIiwgIlRFU1QiLCAyKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVCIsICJ0ZXN0VGVzdCIsIDkpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF9URVMiLCAidGVzdFRlc3QiLCA4KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVCIsICJ0ZXN0VGVzdCIsIDYpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF8iLCAidGVzdFRlc3QiLCA1KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1QiLCAidGVzdFRlc3QiLCA0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVCIsICJUZXN0VGVzdCIsIDkpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUIiwgIlRlc3RUZXN0IiwgMTEwMCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUX1RFU1RfIiwgInRlc3RURVNUVGVzdCIsIDEwKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVF9URVNUIiwgIlRlc3RURVNUVGVzdCIsIDE0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVF9URVNUX1QiLCAiVGVzdFRFU1RUZXN0VCIsIDE2KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVF9URVNUXyIsICJUZXN0VEVTVFRlc3RUIiwgMTUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbWF4KSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKHN0cmluZywgbWF4LCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0IHVuZGVyc2NvcmVzIHRvIGFsbC1jYXBzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF8iLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9fX18iLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRlU1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfVEVTVCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9fX1RFU1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfVEVTVCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9URVNUX1RFU1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUX1RFU1RfVEVTVCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX1RFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX19URVNUX1RFU1RfVEVTVF9UIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfVEVTVF9URVNUX1QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfVEVTVF9URVNUX1RFU1RfVCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl9fVEVTVF9URVNUX1RFU1RfVCIsIHRydWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VMb3dlcmNhc2UoKSB7Ci0JCWFzc2VydEVxdWFscygidGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfX19fIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X3Rlc3QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfX190ZXN0IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X3Rlc3QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfdGVzdF90ZXN0IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdF90ZXN0X3Rlc3QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl90ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl9fdGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X3Rlc3RfdGVzdF90IiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX3Rlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfX3Rlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJURVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3QiLCAiVEVTVF8iLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJURVNUX19fXyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0IiwgIlRFU1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgIlRlU1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3QiLCAiVEVTVF9URVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0IiwgIlRFU1RfX19URVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0IiwgIlRFU1RfVEVTVCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdCIsICJURVNUX1RFU1RfVEVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3QiLCAiVEVTVF9URVNUX1RFU1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3RUIiwgIlRFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3RUZXN0VCIsICJfVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl9fVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3RUIiwgIlRFU1RfVEVTVF9URVNUX1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3RUIiwgIl9URVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3RUZXN0VCIsICJfX1RFU1RfVEVTVF9URVNUX1QiLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlckxvd2VyY2FzZSgpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgInRlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJ0ZXN0XyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgInRlc3RfX19fIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3QiLCAidGVzdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3QiLCAidGVzdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdCIsICJ0ZXN0X3Rlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3QiLCAidGVzdF9fX3Rlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3QiLCAidGVzdF90ZXN0IiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3RUZXN0IiwgInRlc3RfdGVzdF90ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdCIsICJ0ZXN0X3Rlc3RfdGVzdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdFQiLCAidGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl90ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdFQiLCAiX190ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdFQiLCAidGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdFQiLCAiX3Rlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3RUIiwgIl9fdGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihzdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdCIsICJURVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3QiLCAiVEVTVF8iLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdCIsICJURVNUX19fXyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0IiwgIlRFU1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0IiwgIlRlU1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3QiLCAiVEVTVF9URVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0IiwgIlRFU1RfX19URVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0IiwgIlRFU1RfVEVTVCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0VGVzdCIsICJURVNUX1RFU1RfVEVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3QiLCAiVEVTVF9URVNUX1RFU1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdFRlc3RUIiwgIlRFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3RUZXN0VCIsICJfVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl9fVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3RUIiwgIlRFU1RfVEVTVF9URVNUX1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3RUIiwgIl9URVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdFRlc3RUZXN0VCIsICJfX1RFU1RfVEVTVF9URVNUX1QiLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlckxvd2VyY2FzZSgpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0IiwgInRlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdCIsICJ0ZXN0XyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0IiwgInRlc3RfX19fIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3QiLCAidGVzdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3QiLCAidGVzdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdCIsICJ0ZXN0X3Rlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3QiLCAidGVzdF9fX3Rlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdFRlc3QiLCAidGVzdF90ZXN0IiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3RUZXN0IiwgInRlc3RfdGVzdF90ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0VGVzdCIsICJ0ZXN0X3Rlc3RfdGVzdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0VGVzdFQiLCAidGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl90ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0VGVzdFQiLCAiX190ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0VGVzdFQiLCAidGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0VGVzdFQiLCAiX3Rlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3RUIiwgIl9fdGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uKHN0cmluZywgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBkZWxpbWl0aW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc1F1b3RlZCgpIHsKLQkJdGhpcy5kZW55U3RyaW5nSXNRdW90ZWQoImZvbyIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzUXVvdGVkKCJcImZvb1wiIik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNRdW90ZWQoIiIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzUXVvdGVkKCJcIlwiIik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNRdW90ZWQoIlwiIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzUXVvdGVkKCIgIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzUXVvdGVkKCInJyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc1F1b3RlZCgiJ2ZvbyciKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNRdW90ZWQoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc1F1b3RlZChzKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNRdW90ZWQocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbnlTdHJpbmdJc1F1b3RlZChTdHJpbmcgcykgewotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc1F1b3RlZChzKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUXVvdGVkKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc1BhcmVudGhldGljYWwoKSB7Ci0JCXRoaXMuZGVueVN0cmluZ0lzUGFyZW50aGV0aWNhbCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNQYXJlbnRoZXRpY2FsKCIoZm9vKSIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzUGFyZW50aGV0aWNhbCgiIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNQYXJlbnRoZXRpY2FsKCIoKSIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzUGFyZW50aGV0aWNhbCgiKCIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc1BhcmVudGhldGljYWwoIiAiKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNQYXJlbnRoZXRpY2FsKCInJyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc1BhcmVudGhldGljYWwoIidmb28nIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN0cmluZ0lzUGFyZW50aGV0aWNhbChTdHJpbmcgcykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUGFyZW50aGV0aWNhbChzKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNQYXJlbnRoZXRpY2FsKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZW55U3RyaW5nSXNQYXJlbnRoZXRpY2FsKFN0cmluZyBzKSB7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUGFyZW50aGV0aWNhbChzKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUGFyZW50aGV0aWNhbChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNCcmFja2V0ZWQoKSB7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2tldGVkKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0JyYWNrZXRlZCgiW2Zvb10iKTsKLQotCQl0aGlzLmRlbnlTdHJpbmdJc0JyYWNrZXRlZCgiIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNCcmFja2V0ZWQoIltdIik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFja2V0ZWQoIlsiKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFja2V0ZWQoIiAiKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFja2V0ZWQoIicnIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2tldGVkKCInZm9vJyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTdHJpbmdJc0JyYWNrZXRlZChTdHJpbmcgcykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2tldGVkKHMpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0JyYWNrZXRlZChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVueVN0cmluZ0lzQnJhY2tldGVkKFN0cmluZyBzKSB7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2tldGVkKHMpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFja2V0ZWQocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzQnJhY2VkKCkgewotCQl0aGlzLmRlbnlTdHJpbmdJc0JyYWNlZCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNCcmFjZWQoIntmb299Iik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFjZWQoIiIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzQnJhY2VkKCJ7fSIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2VkKCJ7Iik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2VkKCIgIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2VkKCInJyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0JyYWNlZCgiJ2ZvbyciKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNCcmFjZWQoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0JyYWNlZChzKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFjZWQocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbnlTdHJpbmdJc0JyYWNlZChTdHJpbmcgcykgewotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0JyYWNlZChzKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2VkKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc0NoZXZyb25lZCgpIHsKLQkJdGhpcy5kZW55U3RyaW5nSXNDaGV2cm9uZWQoImZvbyIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzQ2hldnJvbmVkKCI8Zm9vPiIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzQ2hldnJvbmVkKCIiKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0NoZXZyb25lZCgiPD4iKTsKLQotCQl0aGlzLmRlbnlTdHJpbmdJc0NoZXZyb25lZCgieyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0NoZXZyb25lZCgiICIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0NoZXZyb25lZCgiJyciKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNDaGV2cm9uZWQoIidmb28nIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN0cmluZ0lzQ2hldnJvbmVkKFN0cmluZyBzKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNDaGV2cm9uZWQocykpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQ2hldnJvbmVkKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZW55U3RyaW5nSXNDaGV2cm9uZWQoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNDaGV2cm9uZWQocykpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0NoZXZyb25lZChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNEZWxpbWl0ZWQoKSB7Ci0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkKCJmb28iLCAnPycpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzRGVsaW1pdGVkKCI/Zm9vPyIsICc/Jyk7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQoIiIsICc/Jyk7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNEZWxpbWl0ZWQoIlwiXCIiLCAnIicpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzRGVsaW1pdGVkKCI/eHg/IiwgJz8nKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQoIj94eF0iLCAnPycpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkKCJcIiIsICciJyk7Ci0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkKCIgIiwgJyAnKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQoIicnIiwgJyInKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQoIidmb28nIiwgJz8nKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNEZWxpbWl0ZWQoU3RyaW5nIHMsIGNoYXIgYykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRGVsaW1pdGVkKHMsIGMpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChzLnRvQ2hhckFycmF5KCksIGMpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVueVN0cmluZ0lzRGVsaW1pdGVkKFN0cmluZyBzLCBjaGFyIGMpIHsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNEZWxpbWl0ZWQocywgYykpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChzLnRvQ2hhckFycmF5KCksIGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNEZWxpbWl0ZWQyKCkgewotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZDIoImZvbyIsICdbJywgJ10nKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0RlbGltaXRlZDIoIntmb299IiwgJ3snLCAnfScpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkMigiIiwgJ1snLCAnXScpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzRGVsaW1pdGVkMigiW10iLCAnWycsICddJyk7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNEZWxpbWl0ZWQyKCJbeHhdIiwgJ1snLCAnXScpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZDIoIj94eF0iLCAnWycsICddJyk7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQyKCJcIiIsICdbJywgJ10nKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQyKCIgIiwgJ1snLCAnXScpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZDIoIicnIiwgJ1snLCAnXScpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZDIoIidmb28nIiwgJ1snLCAnXScpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTdHJpbmdJc0RlbGltaXRlZDIoU3RyaW5nIHMsIGNoYXIgc3RhcnQsIGNoYXIgZW5kKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNEZWxpbWl0ZWQocywgc3RhcnQsIGVuZCkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRGVsaW1pdGVkKHMudG9DaGFyQXJyYXkoKSwgc3RhcnQsIGVuZCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZW55U3RyaW5nSXNEZWxpbWl0ZWQyKFN0cmluZyBzLCBjaGFyIHN0YXJ0LCBjaGFyIGVuZCkgewotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChzLCBzdGFydCwgZW5kKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRGVsaW1pdGVkKHMudG9DaGFyQXJyYXkoKSwgc3RhcnQsIGVuZCkpOwotCX0KLQotCS8vICoqKioqKioqKiogdW5kZWxpbWl0aW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbGltaXQoKSB7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0KCJcImZvb1wiIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdCgiXCJcIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXQoIidmb28nIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdCgiXCJmb1wiXCJvXCIiLCAiZm9cIm8iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXQoIlwiZm9vXCJcIlwiIiwgImZvb1wiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0KCJcIlwiXCJmb29cIiIsICJcImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdCgiW2Zvb10iLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0KCJcIlwiXCIiLCAiXCIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXQoIlwiZm9vXCJiYXJcIiIsICJmb29cIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdCgiXCJmb29cIlwiIiwgImZvb1wiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuZGVsaW1pdChTdHJpbmcgcywgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMudW5kZWxpbWl0KHMpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy51bmRlbGltaXQocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuZGVsaW1pdEludCgpIHsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRJbnQoIlwiZm9vXCIiLCAyLCAibyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdEludCgiXCJcImZvb1wiXCIiLCAyLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0SW50KCInZm9vJyIsIDIsICJvIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuZGVsaW1pdEludChTdHJpbmcgcywgaW50IGNvdW50LCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy51bmRlbGltaXQocywgY291bnQpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy51bmRlbGltaXQocy50b0NoYXJBcnJheSgpLCBjb3VudCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbGltaXRJbnRFeGNlcHRpb24oKSB7Ci0JCXRoaXMuZGVueVVuZGVsaW1pdEludCgiXCJcIiIsIDIpOwotCQl0aGlzLmRlbnlVbmRlbGltaXRJbnQoIidvJyIsIDIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZW55VW5kZWxpbWl0SW50KFN0cmluZyBzLCBpbnQgY291bnQpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nIGJvZ3VzID0gU3RyaW5nVG9vbHMudW5kZWxpbWl0KHMsIGNvdW50KTsKLQkJCWZhaWwoImludmFsaWQgc3RyaW5nOiAiICsgYm9ndXMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJY2hhcltdIGJvZ3VzID0gU3RyaW5nVG9vbHMudW5kZWxpbWl0KHMudG9DaGFyQXJyYXkoKSwgY291bnQpOwotCQkJZmFpbCgiaW52YWxpZCBzdHJpbmc6ICIgKyBuZXcgU3RyaW5nKGJvZ3VzKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbGltaXRPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPbldyaXRlcigiXCJmb29cIiIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPbldyaXRlcigiXCJcIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPbldyaXRlcigiJ2ZvbyciLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXIoIlwiZm9cIlwib1wiIiwgImZvXCJvIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXIoIlwiZm9vXCJcIlwiIiwgImZvb1wiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXIoIlwiXCJcImZvb1wiIiwgIlwiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXIoIltmb29dIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyKCJcIlwiXCIiLCAiXCIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPbldyaXRlcigiXCJmb29cImJhclwiIiwgImZvb1wiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXIoIlwiZm9vXCJcIiIsICJmb29cIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmRlbGltaXRPbldyaXRlcihTdHJpbmcgcywgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCi0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0T24ocy50b0NoYXJBcnJheSgpLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoIlwiZm9vXCIiLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoIlwiXCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoIidmb28nIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKCJcImZvXCJcIm9cIiIsICJmb1wibyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKCJcImZvb1wiXCJcIiIsICJmb29cIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKCJcIlwiXCJmb29cIiIsICJcImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKCJbZm9vXSIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1ZmZlcigiXCJcIlwiIiwgIlwiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoIlwiZm9vXCJiYXJcIiIsICJmb29cIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKCJcImZvb1wiXCIiLCAiZm9vXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoU3RyaW5nIHMsIFN0cmluZyBleHBlY3RlZCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0T24ocy50b0NoYXJBcnJheSgpLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXIoIlwiZm9vXCIiLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKCJcIlwiIiwgIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlcigiJ2ZvbyciLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKCJcImZvXCJcIm9cIiIsICJmb1wibyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlcigiXCJmb29cIlwiXCIiLCAiZm9vXCIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXIoIlwiXCJcImZvb1wiIiwgIlwiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKCJbZm9vXSIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXIoIlwiXCJcIiIsICJcIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlcigiXCJmb29cImJhclwiIiwgImZvb1wiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKCJcImZvb1wiXCIiLCAiZm9vXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKFN0cmluZyBzLCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMudG9DaGFyQXJyYXkoKSwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbGltaXRPbldyaXRlckNvdW50KCkgewotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyQ291bnQoIlwiZm9vXCIiLCAyLCAibyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyQ291bnQoIlwiXCJcIlwiIiwgMiwgIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyQ291bnQoIlhYZm9vWFgiLCAyLCAiZm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyQ291bnQoU3RyaW5nIHMsIGludCBjb3VudCwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMsIGNvdW50LCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQotCQl3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMudG9DaGFyQXJyYXkoKSwgY291bnQsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbGltaXRPblN0cmluZ0J1ZmZlckNvdW50KCkgewotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyQ291bnQoIlwiZm9vXCIiLCAyLCAibyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyQ291bnQoIlwiXCJcIlwiIiwgMiwgIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyQ291bnQoIlhYZm9vWFgiLCAyLCAiZm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyQ291bnQoU3RyaW5nIHMsIGludCBjb3VudCwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0T24ocywgY291bnQsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0T24ocy50b0NoYXJBcnJheSgpLCBjb3VudCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbGltaXRPblN0cmluZ0J1aWxkZXJDb3VudCgpIHsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXJDb3VudCgiXCJmb29cIiIsIDIsICJvIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyQ291bnQoIlwiXCJcIlwiIiwgMiwgIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlckNvdW50KCJYWGZvb1hYIiwgMiwgImZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXJDb3VudChTdHJpbmcgcywgaW50IGNvdW50LCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMsIGNvdW50LCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy51bmRlbGltaXRPbihzLnRvQ2hhckFycmF5KCksIGNvdW50LCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0aW5nIHRvIEphdmEgc3RyaW5nIGxpdGVyYWwgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKCIiLCAiXCJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKCJcIlwiIiwgIlwiXFxcIlxcXCJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKCInZm9vJyIsICJcIidmb28nXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgiZm9vXGJiYXIiLCAiXCJmb29cXGJiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKCJmb29cblx0YmFyIiwgIlwiZm9vXFxuXFx0YmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgiZm9vXCJiYXIiLCAiXCJmb29cXFwiYmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgiZm9vXFxiYXIiLCAiXCJmb29cXFxcYmFyXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoU3RyaW5nIHMsIFN0cmluZyBleHBlY3RlZCkgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKHMpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVmZmVyKCIiLCAiXCJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWZmZXIoIlwiXCIiLCAiXCJcXFwiXFxcIlwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1ZmZlcigiJ2ZvbyciLCAiXCInZm9vJ1wiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1ZmZlcigiZm9vXGJiYXIiLCAiXCJmb29cXGJiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWZmZXIoImZvb1xuXHRiYXIiLCAiXCJmb29cXG5cXHRiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWZmZXIoImZvb1wiYmFyIiwgIlwiZm9vXFxcImJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1ZmZlcigiZm9vXFxiYXIiLCAiXCJmb29cXFxcYmFyXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1ZmZlcihTdHJpbmcgcywgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihzLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT24ocy50b0NoYXJBcnJheSgpLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWlsZGVyKCIiLCAiXCJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWlsZGVyKCJcIlwiIiwgIlwiXFxcIlxcXCJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWlsZGVyKCInZm9vJyIsICJcIidmb28nXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVpbGRlcigiZm9vXGJiYXIiLCAiXCJmb29cXGJiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWlsZGVyKCJmb29cblx0YmFyIiwgIlwiZm9vXFxuXFx0YmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVpbGRlcigiZm9vXCJiYXIiLCAiXCJmb29cXFwiYmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVpbGRlcigiZm9vXFxiYXIiLCAiXCJmb29cXFxcYmFyXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHMsIFN0cmluZyBleHBlY3RlZCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihzLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKHMudG9DaGFyQXJyYXkoKSwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25Xcml0ZXIoIiIsICJcIlwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbldyaXRlcigiXCJcIiIsICJcIlxcXCJcXFwiXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uV3JpdGVyKCInZm9vJyIsICJcIidmb28nXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uV3JpdGVyKCJmb29cYmJhciIsICJcImZvb1xcYmJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbldyaXRlcigiZm9vXG5cdGJhciIsICJcImZvb1xcblxcdGJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbldyaXRlcigiZm9vXCJiYXIiLCAiXCJmb29cXFwiYmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uV3JpdGVyKCJmb29cXGJhciIsICJcImZvb1xcXFxiYXJcIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uV3JpdGVyKFN0cmluZyBzLCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihzLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQotCQl3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT24ocy50b0NoYXJBcnJheSgpLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVmMzFmOC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkQm9vbGVhblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkQm9vbGVhbjsKLQotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZEJvb2xlYW5UZXN0cwotCWV4dGVuZHMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSB2b2xhdGlsZSBTeW5jaHJvbml6ZWRCb29sZWFuIHNiOwotCXZvbGF0aWxlIGJvb2xlYW4gdGltZW91dE9jY3VycmVkOwotCXZvbGF0aWxlIGxvbmcgc3RhcnRUaW1lOwotCXZvbGF0aWxlIGxvbmcgZW5kVGltZTsKLQotCi0JcHVibGljIFN5bmNocm9uaXplZEJvb2xlYW5UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnNiID0gbmV3IFN5bmNocm9uaXplZEJvb2xlYW4oKTsKLQkJdGhpcy50aW1lb3V0T2NjdXJyZWQgPSBmYWxzZTsKLQkJdGhpcy5zdGFydFRpbWUgPSAwOwotCQl0aGlzLmVuZFRpbWUgPSAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJcygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc2IuaXMoZmFsc2UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNOb3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmlzTm90KHRydWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuaXNUcnVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0ZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5pc0ZhbHNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2Iuc2V0VmFsdWUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmlzVHJ1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmlzRmFsc2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldFZhbHVlKHRydWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5pc1RydWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuaXNGYWxzZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmxpcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc2IuZmxpcCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5mbGlwKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGYWxzZUFuZFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5hbmQodHJ1ZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcnVlQW5kVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldFZhbHVlKHRydWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuYW5kKHRydWUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGYWxzZUFuZEZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuYW5kKGZhbHNlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRydWVBbmRGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldFZhbHVlKHRydWUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmFuZChmYWxzZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGYWxzZU9yVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc2Iub3IodHJ1ZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRydWVPclRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zYi5zZXRWYWx1ZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLm9yKHRydWUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGYWxzZU9yRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5vcihmYWxzZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcnVlT3JGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldFZhbHVlKHRydWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2Iub3IoZmFsc2UpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGYWxzZVhvclRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLnhvcih0cnVlKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJ1ZVhvclRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zYi5zZXRWYWx1ZSh0cnVlKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi54b3IodHJ1ZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGYWxzZVhvckZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IueG9yKGZhbHNlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRydWVYb3JGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldFZhbHVlKHRydWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IueG9yKGZhbHNlKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Tm90VHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldE5vdCh0cnVlKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5pc1RydWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5pc0ZhbHNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROb3RGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldE5vdChmYWxzZSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmlzVHJ1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5pc0ZhbHNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldEZhbHNlKCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuaXNUcnVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuaXNGYWxzZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldFRydWUoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuaXNUcnVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmlzRmFsc2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbW1pdEZhbHNlU3VjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc2IuY29tbWl0KGZhbHNlLCBmYWxzZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21taXRUcnVlU3VjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc2IuY29tbWl0KGZhbHNlLCB0cnVlKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tbWl0RmFsc2VGYWlsdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuY29tbWl0KHRydWUsIGZhbHNlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbW1pdFRydWVGYWlsdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuY29tbWl0KHRydWUsIHRydWUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3dhcFNhbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5zd2FwKHRoaXMuc2IpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3dhcFNhbWVWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeW5jaHJvbml6ZWRCb29sZWFuIHNiMiA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2Iuc3dhcChzYjIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2IyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTd2FwRGlmZmVyZW50VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3luY2hyb25pemVkQm9vbGVhbiBzYjIgPSBuZXcgU3luY2hyb25pemVkQm9vbGVhbih0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLnN3YXAoc2IyKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2IyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNdXRleFRoaXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0U2FtZSh0aGlzLnNiLCB0aGlzLnNiLmdldE11dGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNdXRleE9iamVjdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPYmplY3QgbXV0ZXggPSBuZXcgT2JqZWN0KCk7Ci0JCVN5bmNocm9uaXplZEJvb2xlYW4gc3luY0Jvb2wgPSBuZXcgU3luY2hyb25pemVkQm9vbGVhbihtdXRleCk7Ci0JCWFzc2VydFNhbWUobXV0ZXgsIHN5bmNCb29sLmdldE11dGV4KCkpOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgdDEgc2V0cyB0aGUgdmFsdWUgdG8gdHJ1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VW50aWxUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFVudGlsVHJ1ZSgwKTsgIC8vIDAgPSBpbmRlZmluaXRlIHdhaXQKLQkJLy8gbm8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0RmFsc2UodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSBieSB0MgotCQlhc3NlcnRUcnVlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCkgPiBUSUNLKTsKLQl9Ci0KLQkvKioKLQkgKiB0MiB3aWxsIHRpbWUgb3V0IHdhaXRpbmcgZm9yIHQxIHRvIHNldCB0aGUgdmFsdWUgdG8gdHJ1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VW50aWxUcnVlVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRVbnRpbFRydWUoVElDSyk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHdpbGwgZXZlbnR1YWxseSBiZSBzZXQgdG8gdHJ1ZSBieSB0MQotCQlhc3NlcnRUcnVlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCkgPCBUSFJFRV9USUNLUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVdhaXRVbnRpbFRydWUobG9uZyB0MlRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV4ZWN1dGVUaHJlYWRzKHRoaXMuYnVpbGRTZXRUcnVlQ29tbWFuZCgpLCB0aGlzLmJ1aWxkV2FpdFVudGlsVHJ1ZUNvbW1hbmQodDJUaW1lb3V0KSk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCB0MSBzZXRzIHRoZSB2YWx1ZSB0byBmYWxzZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9TZXRGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1NldEZhbHNlKDApOyAgLy8gMCA9IGluZGVmaW5pdGUgd2FpdAotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCB0byBmYWxzZSBieSB0MgotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpID4gVElDSyk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB0aW1lIG91dCB3YWl0aW5nIGZvciB0MSB0byBzZXQgdGhlIHZhbHVlIHRvIGZhbHNlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1NldEZhbHNlVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1NldEZhbHNlKFRJQ0spOwotCQkvLyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRUcnVlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSB3aWxsIGV2ZW50dWFsbHkgYmUgc2V0IHRvIHRydWUgYnkgdDEKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpIDwgVEhSRUVfVElDS1MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VG9TZXRGYWxzZShsb25nIHQyVGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0ZVRocmVhZHModGhpcy5idWlsZFNldFRydWVDb21tYW5kKCksIHRoaXMuYnVpbGRXYWl0VG9TZXRGYWxzZUNvbW1hbmQodDJUaW1lb3V0KSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVUaHJlYWRzKENvbW1hbmQgdDFDb21tYW5kLCBDb21tYW5kIHQyQ29tbWFuZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2Iuc2V0RmFsc2UoKTsKLQkJUnVubmFibGUgcjEgPSB0aGlzLmJ1aWxkUnVubmFibGUodDFDb21tYW5kLCB0aGlzLnNiLCBUV09fVElDS1MpOwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0MkNvbW1hbmQsIHRoaXMuc2IsIDApOwotCQlUaHJlYWQgdDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHIxKTsKLQkJVGhyZWFkIHQyID0gdGhpcy5idWlsZFRocmVhZChyMik7Ci0JCXQxLnN0YXJ0KCk7Ci0JCXQyLnN0YXJ0KCk7Ci0JCXQxLmpvaW4oKTsKLQkJdDIuam9pbigpOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFNldFRydWVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZEJvb2xlYW4gc3luY0Jvb2wpIHsKLQkJCQlzeW5jQm9vbC5zZXRUcnVlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFVudGlsVHJ1ZUNvbW1hbmQoZmluYWwgbG9uZyB0aW1lb3V0KSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkQm9vbGVhbiBzeW5jQm9vbCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMudGhpcy5zdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMudGhpcy50aW1lb3V0T2NjdXJyZWQgPSAhIHN5bmNCb29sLndhaXRVbnRpbFRydWUodGltZW91dCk7Ci0JCQkJU3luY2hyb25pemVkQm9vbGVhblRlc3RzLnRoaXMuZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFdhaXRUb1NldEZhbHNlQ29tbWFuZChmaW5hbCBsb25nIHRpbWVvdXQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRCb29sZWFuIHN5bmNCb29sKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZEJvb2xlYW5UZXN0cy50aGlzLnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5bmNocm9uaXplZEJvb2xlYW5UZXN0cy50aGlzLnRpbWVvdXRPY2N1cnJlZCA9ICAhIHN5bmNCb29sLndhaXRUb1NldEZhbHNlKHRpbWVvdXQpOwotCQkJCVN5bmNocm9uaXplZEJvb2xlYW5UZXN0cy50aGlzLmVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUnVubmFibGUoZmluYWwgQ29tbWFuZCBjb21tYW5kLCBmaW5hbCBTeW5jaHJvbml6ZWRCb29sZWFuIHN5bmNCb29sLCBmaW5hbCBsb25nIGRlbGF5KSB7Ci0JCXJldHVybiBuZXcgVGVzdFJ1bm5hYmxlKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW5fKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlpZiAoZGVsYXkgIT0gMCkgewotCQkJCQlUaHJlYWQuc2xlZXAoZGVsYXkpOwotCQkJCX0KLQkJCQljb21tYW5kLmV4ZWN1dGUoc3luY0Jvb2wpOwotCQkJfQotCQl9OwotCX0KLQotCWxvbmcgY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSB7Ci0JCXJldHVybiB0aGlzLmVuZFRpbWUgLSB0aGlzLnN0YXJ0VGltZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29tbWFuZCBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JcHJpdmF0ZSBpbnRlcmZhY2UgQ29tbWFuZCB7Ci0JCXZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRCb29sZWFuIHN5bmNCb29sKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkSW50VGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRJbnRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjY2MDA0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRJbnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZEludDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkSW50VGVzdHMKLQlleHRlbmRzIE11bHRpVGhyZWFkZWRUZXN0Q2FzZQotewotCXByaXZhdGUgdm9sYXRpbGUgU3luY2hyb25pemVkSW50IHNpOwotCXZvbGF0aWxlIGJvb2xlYW4gdGltZW91dE9jY3VycmVkOwotCXZvbGF0aWxlIGludCB2YWx1ZSA9IDc7Ci0Jdm9sYXRpbGUgbG9uZyBzdGFydFRpbWU7Ci0Jdm9sYXRpbGUgbG9uZyBlbmRUaW1lOwotCXZvbGF0aWxlIGludCBzSW50VmFsdWU7Ci0KLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRJbnRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnNpID0gbmV3IFN5bmNocm9uaXplZEludCgpOwotCQl0aGlzLnRpbWVvdXRPY2N1cnJlZCA9IGZhbHNlOwotCQl0aGlzLnN0YXJ0VGltZSA9IDA7Ci0JCXRoaXMuZW5kVGltZSA9IDA7Ci0JCXRoaXMuc0ludFZhbHVlID0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2kuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc0ludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc2kuZXF1YWxzKDApKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmVxdWFscyg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vdEVxdWFsSW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5ub3RFcXVhbCg3KSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5ub3RFcXVhbCgwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzWmVybygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNaZXJvKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzWmVybygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNOb3RaZXJvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNOb3RaZXJvKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNOb3RaZXJvKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0dyZWF0ZXJUaGFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc0dyZWF0ZXJUaGFuKC0xKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNHcmVhdGVyVGhhbigwKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNHcmVhdGVyVGhhbigxKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc0dyZWF0ZXJUaGFuKC0xKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNHcmVhdGVyVGhhbig3KSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNHcmVhdGVyVGhhbig4KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzR3JlYXRlclRoYW5PckVxdWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc0dyZWF0ZXJUaGFuT3JFcXVhbCgtMSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNHcmVhdGVyVGhhbk9yRXF1YWwoMCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzR3JlYXRlclRoYW5PckVxdWFsKDEpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzR3JlYXRlclRoYW5PckVxdWFsKC0xKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc0dyZWF0ZXJUaGFuT3JFcXVhbCg3KSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNHcmVhdGVyVGhhbk9yRXF1YWwoOCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0xlc3NUaGFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNMZXNzVGhhbigtMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzTGVzc1RoYW4oMCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNMZXNzVGhhbigxKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNMZXNzVGhhbigtMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzTGVzc1RoYW4oNykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNMZXNzVGhhbig4KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTGVzc1RoYW5PckVxdWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNMZXNzVGhhbk9yRXF1YWwoLTEpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTGVzc1RoYW5PckVxdWFsKDApKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTGVzc1RoYW5PckVxdWFsKDEpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc0xlc3NUaGFuT3JFcXVhbCgtMSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNMZXNzVGhhbk9yRXF1YWwoNykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNMZXNzVGhhbk9yRXF1YWwoOCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1Bvc2l0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNQb3NpdGl2ZSgpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzUG9zaXRpdmUoKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUoLTMpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzUG9zaXRpdmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTm90UG9zaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTm90UG9zaXRpdmUoKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNOb3RQb3NpdGl2ZSgpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSgtMyk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc05vdFBvc2l0aXZlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNOZWdhdGl2ZSgpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc05lZ2F0aXZlKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKC0zKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTmVnYXRpdmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTm90TmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTm90TmVnYXRpdmUoKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc05vdE5lZ2F0aXZlKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKC0zKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc05vdE5lZ2F0aXZlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNpLnNldFZhbHVlKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc05vdFplcm8oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc1plcm8oKSk7Ci0KLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUsIHRoaXMuc2kuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc05vdFplcm8oKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNaZXJvKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2kuYWJzKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUsIHRoaXMuc2kuYWJzKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZSwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSgtdGhpcy52YWx1ZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlLCB0aGlzLnNpLmFicygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNpLm5lZygpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2kuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydEVxdWFscygtdGhpcy52YWx1ZSwgdGhpcy5zaS5uZWcoKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUoLXRoaXMudmFsdWUpOwotCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZSwgdGhpcy5zaS5uZWcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFplcm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zaS5zZXRaZXJvKCk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzTm90WmVybygpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzWmVybygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TXV0ZXhUaGlzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFNhbWUodGhpcy5zaSwgdGhpcy5zaS5nZXRNdXRleCgpKTsKLQl9Ci0KLQkvKioKLQkgKiB0MiB3aWxsIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIHQxIHNldHMgdGhlIHZhbHVlIHRvIDAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFVudGlsWmVybygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRVbnRpbFplcm8oMCk7ICAvLyAwID0gaW5kZWZpbml0ZSB3YWl0Ci0JCS8vIG5vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydEZhbHNlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIDAgYnkgdDIKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2kuZ2V0VmFsdWUoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJbG9uZyB0aW1lID0gdGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpOwotCQlhc3NlcnRUcnVlKCJ0MiBmaW5pc2hlZCBhIGJpdCBlYXJseSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlID4gIiArIFRJQ0sgKyAiKTogIiArIHRpbWUsIHRpbWUgPiBUSUNLKTsKLQl9Ci0KLQkvKioKLQkgKiB0MiB3aWxsIHRpbWUgb3V0IHdhaXRpbmcgZm9yIHQxIHRvIHNldCB0aGUgdmFsdWUgdG8gMAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VW50aWxaZXJvVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRVbnRpbFplcm8oVElDSyk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHdpbGwgZXZlbnR1YWxseSBiZSBzZXQgdG8gMCBieSB0MQotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGxhdGUgKGV4cGVjdGVkIHZhbHVlIHNob3VsZCBiZSA8ICIgKyBUSFJFRV9USUNLUyArICIpOiAiICsgdGltZSwgdGltZSA8IFRIUkVFX1RJQ0tTKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFVudGlsWmVybyhsb25nIHQyVGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0ZVRocmVhZHModGhpcy5idWlsZFNldFplcm9Db21tYW5kKCksIHRoaXMuYnVpbGRXYWl0VW50aWxaZXJvQ29tbWFuZCh0MlRpbWVvdXQpKTsKLQl9Ci0KLQkvKioKLQkgKiB0MiB3aWxsIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIHQxIHNldHMgdGhlIHZhbHVlIHRvIDA7Ci0JICogdGhlbiB0MiB3aWxsIHNldCB0aGUgdmFsdWUgdG8gNwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9TZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1NldFZhbHVlKDApOyAgLy8gMCA9IGluZGVmaW5pdGUgd2FpdAotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCB0byBhbiBvYmplY3QgYnkgdDIKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTm90WmVybygpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGVhcmx5IChleHBlY3RlZCB2YWx1ZSBzaG91bGQgYmUgPiAiICsgVElDSyArICIpOiAiICsgdGltZSwgdGltZSA+IFRJQ0spOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgdGltZSBvdXQgd2FpdGluZyBmb3IgdDEgdG8gc2V0IHRoZSB2YWx1ZSB0byAwCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1NldFZhbHVlVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1NldFZhbHVlKFRJQ0spOwotCQkvLyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRUcnVlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSB3aWxsIGV2ZW50dWFsbHkgYmUgc2V0IHRvIHplcm8gYnkgdDEKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzWmVybygpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGxhdGUgKGV4cGVjdGVkIHZhbHVlIHNob3VsZCBiZSA8ICIgKyBUSFJFRV9USUNLUyArICIpOiAiICsgdGltZSwgdGltZSA8IFRIUkVFX1RJQ0tTKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFRvU2V0VmFsdWUobG9uZyB0MlRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV4ZWN1dGVUaHJlYWRzKHRoaXMuYnVpbGRTZXRaZXJvQ29tbWFuZCgpLCB0aGlzLmJ1aWxkV2FpdFRvU2V0VmFsdWVDb21tYW5kKHQyVGltZW91dCkpOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgd2FpdCB1bnRpbCB0MSBpcyBmaW5pc2hlZCAiaW5pdGlhbGl6aW5nIiB0aGUgdmFsdWU7Ci0JICogdGhlbiB0MiB3aWxsIGdldCB0aGUgbmV3bHktaW5pdGlhbGl6ZWQgdmFsdWUgKDQyKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2kuc2V0VmFsdWUoMCk7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRJbml0aWFsaXplVmFsdWVDb21tYW5kKCksIHRoaXMuc2ksIDApOwotCQkvLyBnaXZlIHQxIGEgaGVhZCBzdGFydAotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkR2V0VmFsdWVDb21tYW5kKCksIHRoaXMuc2ksIFRJQ0spOwotCQlUaHJlYWQgdDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHIxKTsKLQkJVGhyZWFkIHQyID0gdGhpcy5idWlsZFRocmVhZChyMik7Ci0JCXQxLnN0YXJ0KCk7Ci0JCXQyLnN0YXJ0KCk7Ci0JCXQxLmpvaW4oKTsKLQkJdDIuam9pbigpOwotCQlhc3NlcnRFcXVhbHMoNDIsIHRoaXMuc2kuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyg0MiwgdGhpcy5zSW50VmFsdWUpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWxvbmcgdGltZSA9IHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgidDIgZmluaXNoZWQgYSBiaXQgZWFybHkgKGV4cGVjdGVkIHZhbHVlIHNob3VsZCBiZSA+ICIgKyBUV09fVElDS1MgKyAiKTogIiArIHRpbWUsIHRpbWUgPiBUV09fVElDS1MpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjdXRlVGhyZWFkcyhDb21tYW5kIHQxQ29tbWFuZCwgQ29tbWFuZCB0MkNvbW1hbmQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlSdW5uYWJsZSByMSA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0MUNvbW1hbmQsIHRoaXMuc2ksIFRXT19USUNLUyk7Ci0JCVJ1bm5hYmxlIHIyID0gdGhpcy5idWlsZFJ1bm5hYmxlKHQyQ29tbWFuZCwgdGhpcy5zaSwgMCk7Ci0JCVRocmVhZCB0MSA9IHRoaXMuYnVpbGRUaHJlYWQocjEpOwotCQlUaHJlYWQgdDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHIyKTsKLQkJdDEuc3RhcnQoKTsKLQkJdDIuc3RhcnQoKTsKLQkJdDEuam9pbigpOwotCQl0Mi5qb2luKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkU2V0WmVyb0NvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkSW50IHNJbnQpIHsKLQkJCQlzSW50LnNldFplcm8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VW50aWxaZXJvQ29tbWFuZChmaW5hbCBsb25nIHRpbWVvdXQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRJbnQgc0ludCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRJbnRUZXN0cy50aGlzLnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5bmNocm9uaXplZEludFRlc3RzLnRoaXMudGltZW91dE9jY3VycmVkID0gISBzSW50LndhaXRVbnRpbFplcm8odGltZW91dCk7Ci0JCQkJU3luY2hyb25pemVkSW50VGVzdHMudGhpcy5lbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFRvU2V0VmFsdWVDb21tYW5kKGZpbmFsIGxvbmcgdGltZW91dCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZEludCBzSW50KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZEludFRlc3RzLnRoaXMuc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3luY2hyb25pemVkSW50VGVzdHMudGhpcy50aW1lb3V0T2NjdXJyZWQgPSAhIHNJbnQud2FpdFRvU2V0VmFsdWUoU3luY2hyb25pemVkSW50VGVzdHMudGhpcy52YWx1ZSwgdGltZW91dCk7Ci0JCQkJU3luY2hyb25pemVkSW50VGVzdHMudGhpcy5lbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkSW5pdGlhbGl6ZVZhbHVlQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShmaW5hbCBTeW5jaHJvbml6ZWRJbnQgc0ludCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlzSW50LmV4ZWN1dGUoCi0JCQkJCW5ldyBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kKCkgewotCQkJCQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCQkJCQkvLyBwcmV0ZW5kIHRvIHBlcmZvcm0gc29tZSBsb25nIGluaXRpYWxpemF0aW9uIHByb2Nlc3MKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlUaHJlYWQuc2xlZXAoNSAqIFRJQ0spOwotCQkJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJCQkJCQl9Ci0JCQkJCQkJc0ludC5zZXRWYWx1ZSg0Mik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZEdldFZhbHVlQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRJbnQgc0ludCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRJbnRUZXN0cy50aGlzLnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5bmNocm9uaXplZEludFRlc3RzLnRoaXMuc0ludFZhbHVlID0gc0ludC5nZXRWYWx1ZSgpOwotCQkJCVN5bmNocm9uaXplZEludFRlc3RzLnRoaXMuZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBDb21tYW5kIGNvbW1hbmQsIGZpbmFsIFN5bmNocm9uaXplZEludCBzSW50LCBmaW5hbCBsb25nIHNsZWVwKSB7Ci0JCXJldHVybiBuZXcgVGVzdFJ1bm5hYmxlKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBydW5fKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlpZiAoc2xlZXAgIT0gMCkgewotCQkJCQlUaHJlYWQuc2xlZXAoc2xlZXApOwotCQkJCX0KLQkJCQljb21tYW5kLmV4ZWN1dGUoc0ludCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBsb25nIGNhbGN1bGF0ZUVsYXBzZWRUaW1lKCkgewotCQlyZXR1cm4gdGhpcy5lbmRUaW1lIC0gdGhpcy5zdGFydFRpbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbW1hbmQgaW50ZXJmYWNlICoqKioqKioqKioKLQotCXByaXZhdGUgaW50ZXJmYWNlIENvbW1hbmQgewotCQl2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkSW50IHNJbnQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkT2JqZWN0VGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRPYmplY3RUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGZhNzAzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRPYmplY3RUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZE9iamVjdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkT2JqZWN0VGVzdHMKLQlleHRlbmRzIE11bHRpVGhyZWFkZWRUZXN0Q2FzZQotewotCXByaXZhdGUgdm9sYXRpbGUgU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4gc287Ci0Jdm9sYXRpbGUgYm9vbGVhbiB0aW1lb3V0T2NjdXJyZWQ7Ci0Jdm9sYXRpbGUgT2JqZWN0IHZhbHVlID0gbmV3IE9iamVjdCgpOwotCXZvbGF0aWxlIGxvbmcgc3RhcnRUaW1lOwotCXZvbGF0aWxlIGxvbmcgZW5kVGltZTsKLQl2b2xhdGlsZSBPYmplY3Qgc29WYWx1ZTsKLQotCi0JcHVibGljIFN5bmNocm9uaXplZE9iamVjdFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc28gPSBuZXcgU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4oKTsKLQkJdGhpcy50aW1lb3V0T2NjdXJyZWQgPSBmYWxzZTsKLQkJdGhpcy5zdGFydFRpbWUgPSAwOwotCQl0aGlzLmVuZFRpbWUgPSAwOwotCQl0aGlzLnNvVmFsdWUgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zby5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNvLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNvLmlzTm90TnVsbCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNvLmlzTnVsbCgpKTsKLQotCQl0aGlzLnNvLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZSwgdGhpcy5zby5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNvLmlzTm90TnVsbCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zby5pc051bGwoKSk7Ci0KLQkJdGhpcy5zby5zZXROdWxsKCk7Ci0JCWFzc2VydE51bGwodGhpcy5zby5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zby5pc05vdE51bGwoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zby5pc051bGwoKSk7Ci0KLQkJYXNzZXJ0U2FtZSh0aGlzLnNvLCB0aGlzLnNvLmdldE11dGV4KCkpOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgdDEgc2V0cyB0aGUgdmFsdWUgdG8gbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VW50aWxOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFVudGlsTnVsbCgwKTsKLQkJLy8gbm8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0RmFsc2UodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gbnVsbCBieSB0MgotCQlhc3NlcnROdWxsKHRoaXMuc28uZ2V0VmFsdWUoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJbG9uZyB0aW1lID0gdGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpOwotCQlhc3NlcnRUcnVlKCJ0MiBmaW5pc2hlZCBhIGJpdCBlYXJseSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlID4gIiArIFRJQ0sgKyAiKTogIiArIHRpbWUsIHRpbWUgPiBUSUNLKTsKLQl9Ci0KLQkvKioKLQkgKiB0MiB3aWxsIHRpbWUgb3V0IHdhaXRpbmcgZm9yIHQxIHRvIHNldCB0aGUgdmFsdWUgdG8gbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VW50aWxOdWxsVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRVbnRpbE51bGwoVElDSyk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHdpbGwgZXZlbnR1YWxseSBiZSBzZXQgdG8gbnVsbCBieSB0MQotCQlhc3NlcnROdWxsKHRoaXMuc28uZ2V0VmFsdWUoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJbG9uZyB0aW1lID0gdGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpOwotCQlhc3NlcnRUcnVlKCJ0MiBmaW5pc2hlZCBhIGJpdCBsYXRlIChleHBlY3RlZCB2YWx1ZSBzaG91bGQgYmUgPCAiICsgVEhSRUVfVElDS1MgKyAiKTogIiArIHRpbWUsIHRpbWUgPCBUSFJFRV9USUNLUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVdhaXRVbnRpbE51bGwobG9uZyB0MlRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV4ZWN1dGVUaHJlYWRzKHRoaXMuYnVpbGRTZXROdWxsQ29tbWFuZCgpLCB0aGlzLmJ1aWxkV2FpdFVudGlsTnVsbENvbW1hbmQodDJUaW1lb3V0KSk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCB0MSBzZXRzIHRoZSB2YWx1ZSB0byBudWxsOwotCSAqIHRoZW4gdDIgd2lsbCBzZXQgdGhlIHZhbHVlIHRvIGFuIG9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9TZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1NldFZhbHVlKDApOwotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCB0byBhbiBvYmplY3QgYnkgdDIKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNvLmlzTm90TnVsbCgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGVhcmx5IChleHBlY3RlZCB2YWx1ZSBzaG91bGQgYmUgPiAiICsgVElDSyArICIpOiAiICsgdGltZSwgdGltZSA+IFRJQ0spOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgdGltZSBvdXQgd2FpdGluZyBmb3IgdDEgdG8gc2V0IHRoZSB2YWx1ZSB0byBudWxsCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1NldFZhbHVlVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1NldFZhbHVlKFRJQ0spOwotCQkvLyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRUcnVlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSB3aWxsIGV2ZW50dWFsbHkgYmUgc2V0IHRvIG51bGwgYnkgdDEKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNvLmlzTnVsbCgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGxhdGUgKGV4cGVjdGVkIHZhbHVlIHNob3VsZCBiZSA8ICIgKyBUSFJFRV9USUNLUyArICIpOiAiICsgdGltZSwgdGltZSA8IFRIUkVFX1RJQ0tTKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFRvU2V0VmFsdWUobG9uZyB0MlRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV4ZWN1dGVUaHJlYWRzKHRoaXMuYnVpbGRTZXROdWxsQ29tbWFuZCgpLCB0aGlzLmJ1aWxkV2FpdFRvU2V0VmFsdWVDb21tYW5kKHQyVGltZW91dCkpOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgd2FpdCB1bnRpbCB0MSBpcyBmaW5pc2hlZCAiaW5pdGlhbGl6aW5nIiB0aGUgdmFsdWU7Ci0JICogdGhlbiB0MiB3aWxsIGdldCB0aGUgbmV3bHktaW5pdGlhbGl6ZWQgdmFsdWUgKCJmb28iKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc28uc2V0VmFsdWUobnVsbCk7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRJbml0aWFsaXplVmFsdWVDb21tYW5kKCksIHRoaXMuc28sIDApOwotCQkvLyBnaXZlIHQxIGEgaGVhZCBzdGFydCBvZiAxMDAgbXMKLQkJUnVubmFibGUgcjIgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZEdldFZhbHVlQ29tbWFuZCgpLCB0aGlzLnNvLCBUSUNLKTsKLQkJVGhyZWFkIHQxID0gdGhpcy5idWlsZFRocmVhZChyMSk7Ci0JCVRocmVhZCB0MiA9IHRoaXMuYnVpbGRUaHJlYWQocjIpOwotCQl0MS5zdGFydCgpOwotCQl0Mi5zdGFydCgpOwotCQl0MS5qb2luKCk7Ci0JCXQyLmpvaW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLnNvLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuc29WYWx1ZSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJbG9uZyB0aW1lID0gdGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpOwotCQlhc3NlcnRUcnVlKCJ0MiBmaW5pc2hlZCBhIGJpdCBlYXJseSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlID4gIiArIFRXT19USUNLUyArICIpOiAiICsgdGltZSwgdGltZSA+IFRXT19USUNLUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVUaHJlYWRzKENvbW1hbmQgdDFDb21tYW5kLCBDb21tYW5kIHQyQ29tbWFuZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc28uc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHQxQ29tbWFuZCwgdGhpcy5zbywgVFdPX1RJQ0tTKTsKLQkJUnVubmFibGUgcjIgPSB0aGlzLmJ1aWxkUnVubmFibGUodDJDb21tYW5kLCB0aGlzLnNvLCAwKTsKLQkJVGhyZWFkIHQxID0gdGhpcy5idWlsZFRocmVhZChyMSk7Ci0JCVRocmVhZCB0MiA9IHRoaXMuYnVpbGRUaHJlYWQocjIpOwotCQl0MS5zdGFydCgpOwotCQl0Mi5zdGFydCgpOwotCQl0MS5qb2luKCk7Ci0JCXQyLmpvaW4oKTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRTZXROdWxsQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PiBzT2JqZWN0KSB7Ci0JCQkJc09iamVjdC5zZXROdWxsKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFVudGlsTnVsbENvbW1hbmQoZmluYWwgbG9uZyB0aW1lb3V0KSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4gc09iamVjdCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMudGltZW91dE9jY3VycmVkID0gISBzT2JqZWN0LndhaXRVbnRpbE51bGwodGltZW91dCk7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5lbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFRvU2V0VmFsdWVDb21tYW5kKGZpbmFsIGxvbmcgdGltZW91dCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNPYmplY3QpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5zdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnRpbWVvdXRPY2N1cnJlZCA9ICEgc09iamVjdC53YWl0VG9TZXRWYWx1ZShTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnZhbHVlLCB0aW1lb3V0KTsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLmVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRJbml0aWFsaXplVmFsdWVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNPYmplY3QpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJc09iamVjdC5leGVjdXRlKAotCQkJCQluZXcgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZCgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQkJCQkJLy8gcHJldGVuZCB0byBwZXJmb3JtIHNvbWUgbG9uZyBpbml0aWFsaXphdGlvbiBwcm9jZXNzCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJVGhyZWFkLnNsZWVwKDUgKiBUSUNLKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJCQkJCX0KLQkJCQkJCQlzT2JqZWN0LnNldFZhbHVlKCJmb28iKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkR2V0VmFsdWVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNPYmplY3QpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5zdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnNvVmFsdWUgPSBzT2JqZWN0LmdldFZhbHVlKCk7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5lbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIENvbW1hbmQgY29tbWFuZCwgZmluYWwgU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4gc09iamVjdCwgZmluYWwgbG9uZyBzbGVlcCkgewotCQlyZXR1cm4gbmV3IFRlc3RSdW5uYWJsZSgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcnVuXygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJaWYgKHNsZWVwICE9IDApIHsKLQkJCQkJVGhyZWFkLnNsZWVwKHNsZWVwKTsKLQkJCQl9Ci0JCQkJY29tbWFuZC5leGVjdXRlKHNPYmplY3QpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgbG9uZyBjYWxjdWxhdGVFbGFwc2VkVGltZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW5kVGltZSAtIHRoaXMuc3RhcnRUaW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21tYW5kIGludGVyZmFjZSAqKioqKioqKioqCi0KLQlwcml2YXRlIGludGVyZmFjZSBDb21tYW5kIHsKLQkJdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNvKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZFF1ZXVlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRRdWV1ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZDc2ODcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZFF1ZXVlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkUXVldWU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZFF1ZXVlVGVzdHMgZXh0ZW5kcyBTaW1wbGVRdWV1ZVRlc3RzIHsKLQlwcml2YXRlIHZvbGF0aWxlIFN5bmNocm9uaXplZFF1ZXVlPFN0cmluZz4gc3E7Ci0Jdm9sYXRpbGUgYm9vbGVhbiB0aW1lb3V0T2NjdXJyZWQ7Ci0Jdm9sYXRpbGUgbG9uZyBzdGFydFRpbWU7Ci0Jdm9sYXRpbGUgbG9uZyBlbmRUaW1lOwotCXZvbGF0aWxlIE9iamVjdCBkZXF1ZXVlZE9iamVjdDsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFTV8xID0gbmV3IFN0cmluZygpOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFTV8yID0gbmV3IFN0cmluZygpOwotCi0JcHVibGljIFN5bmNocm9uaXplZFF1ZXVlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JUXVldWU8U3RyaW5nPiBidWlsZFF1ZXVlKCkgewotCQlyZXR1cm4gbmV3IFN5bmNocm9uaXplZFF1ZXVlPFN0cmluZz4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCS8vIHN5bmNocm9uaXplZCBxdWV1ZSBpcyBub3QgY2xvbmVhYmxlCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zcSA9IG5ldyBTeW5jaHJvbml6ZWRRdWV1ZTxTdHJpbmc+KCk7Ci0JCXRoaXMudGltZW91dE9jY3VycmVkID0gZmFsc2U7Ci0JCXRoaXMuc3RhcnRUaW1lID0gMDsKLQkJdGhpcy5lbmRUaW1lID0gMDsKLQkJdGhpcy5kZXF1ZXVlZE9iamVjdCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBmaXJzdCB3aXRoIGFuIHVuc3luY2hyb25pemVkIHF1ZXVlLAotCSAqIHRoZW4gd2l0aCBhIHN5bmNocm9uaXplZCBxdWV1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDb25jdXJyZW50QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5Q29uY3VycmVudEFjY2VzcyhuZXcgU2xvd1NpbXBsZVF1ZXVlPFN0cmluZz4oKSwgImZpcnN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29uY3VycmVudEFjY2VzcyhuZXcgU2xvd1N5bmNocm9uaXplZFF1ZXVlPFN0cmluZz4oKSwgInNlY29uZCIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb25jdXJyZW50QWNjZXNzKFNsb3dRdWV1ZTxTdHJpbmc+IHNsb3dRdWV1ZSwgU3RyaW5nIGV4cGVjdGVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2xvd1F1ZXVlLmVucXVldWUoImZpcnN0Iik7Ci0JCXNsb3dRdWV1ZS5lbnF1ZXVlKCJzZWNvbmQiKTsKLQotCQlUaHJlYWQgdGhyZWFkID0gdGhpcy5idWlsZFRocmVhZCh0aGlzLmJ1aWxkUnVubmFibGUoc2xvd1F1ZXVlKSk7Ci0JCXRocmVhZC5zdGFydCgpOwotCQlUaHJlYWQuc2xlZXAoVFdPX1RJQ0tTKTsKLQotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNsb3dRdWV1ZS5kZXF1ZXVlKCkpOwotCQl0aHJlYWQuam9pbigpOwotCQlhc3NlcnRUcnVlKHNsb3dRdWV1ZS5pc0VtcHR5KCkpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBTbG93UXVldWU8U3RyaW5nPiBzbG93UXVldWUpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzbG93UXVldWUuc2xvd0RlcXVldWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCXByaXZhdGUgaW50ZXJmYWNlIFNsb3dRdWV1ZTxFPiBleHRlbmRzIFF1ZXVlPEU+IHsKLQkJT2JqZWN0IHNsb3dEZXF1ZXVlKCk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBTbG93U2ltcGxlUXVldWU8RT4gZXh0ZW5kcyBTaW1wbGVRdWV1ZTxFPiBpbXBsZW1lbnRzIFNsb3dRdWV1ZTxFPiB7Ci0JCVNsb3dTaW1wbGVRdWV1ZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBzbG93RGVxdWV1ZSgpIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDUgKiBUSUNLKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQkJcmV0dXJuIHRoaXMuZGVxdWV1ZSgpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFNsb3dTeW5jaHJvbml6ZWRRdWV1ZTxFPiBleHRlbmRzIFN5bmNocm9uaXplZFF1ZXVlPEU+IGltcGxlbWVudHMgU2xvd1F1ZXVlPEU+IHsKLQkJU2xvd1N5bmNocm9uaXplZFF1ZXVlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBzbG93RGVxdWV1ZSgpIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDUgKiBUSUNLKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQkJcmV0dXJuIHRoaXMuZGVxdWV1ZSgpOwotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogd2FpdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb0RlcXVldWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VG9EZXF1ZXVlKDApOwotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCBhbiBpdGVtIHNob3VsZCBoYXZlIGJlZW4gZGVxdWV1ZWQgYnkgdDIuLi4KLQkJYXNzZXJ0U2FtZShJVEVNXzEsIHRoaXMuZGVxdWV1ZWRPYmplY3QpOwotCQkvLyAuLi5hbmQgdGhlIHF1ZXVlIHNob3VsZCBiZSBlbXB0eQotCQlhc3NlcnRUcnVlKHRoaXMuc3EuaXNFbXB0eSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSA+IFRJQ0spOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9EZXF1ZXVlVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb0RlcXVldWUoVElDSyk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHF1ZXVlIHdhcyBuZXZlciBkZXF1ZXVlZC4uLgotCQlhc3NlcnROdWxsKHRoaXMuZGVxdWV1ZWRPYmplY3QpOwotCQkvLyAuLi5hbmQgaXQgc3RpbGwgaG9sZHMgdGhlIGl0ZW0KLQkJYXNzZXJ0U2FtZShJVEVNXzEsIHRoaXMuc3EucGVlaygpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSA8IFRIUkVFX1RJQ0tTKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFRvRGVxdWV1ZShsb25nIHRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24gewotCQlSdW5uYWJsZSByMSA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkRW5xdWV1ZUNvbW1hbmQoKSwgdGhpcy5zcSwgVFdPX1RJQ0tTKTsKLQkJUnVubmFibGUgcjIgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZFdhaXRUb0RlcXVldWVDb21tYW5kKHRpbWVvdXQpLCB0aGlzLnNxLCAwKTsKLQkJVGhyZWFkIHQxID0gdGhpcy5idWlsZFRocmVhZChyMSk7Ci0JCVRocmVhZCB0MiA9IHRoaXMuYnVpbGRUaHJlYWQocjIpOwotCQl0MS5zdGFydCgpOwotCQl0Mi5zdGFydCgpOwotCQl0MS5qb2luKCk7Ci0JCXQyLmpvaW4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvRW5xdWV1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb0VucXVldWUoMCk7Ci0JCS8vIG5vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydEZhbHNlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSBxdWV1ZSBnZXRzIGRlcXVldWVkIGJ5IHQxLi4uCi0JCWFzc2VydFNhbWUoSVRFTV8xLCB0aGlzLmRlcXVldWVkT2JqZWN0KTsKLQkJLy8gLi4uYW5kIGFuIGl0ZW0gaXMgZW5xdWV1ZWQgb24gdG8gdGhlIHF1ZXVlIGJ5IHQyCi0JCWFzc2VydEZhbHNlKHRoaXMuc3EuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0U2FtZShJVEVNXzIsIHRoaXMuc3EucGVlaygpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSA+IFRJQ0spOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9FbnF1ZXVlVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb0VucXVldWUoVElDSyk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHF1ZXVlIGlzIGV2ZW50dWFsbHkgZGVxdWV1ZWQgYnkgdDEuLi4KLQkJYXNzZXJ0U2FtZShJVEVNXzEsIHRoaXMuZGVxdWV1ZWRPYmplY3QpOwotCQkvLyAuLi5idXQgbm90aGluZyBpcyBlbnF1ZXVlZCBvbiB0byB0aGUgcXVldWUgYnkgdDIKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNxLmlzRW1wdHkoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCkgPCBUSFJFRV9USUNLUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVdhaXRUb0VucXVldWUobG9uZyB0aW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zcS5lbnF1ZXVlKElURU1fMSk7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGREZXF1ZXVlQ29tbWFuZCgpLCB0aGlzLnNxLCBUV09fVElDS1MpOwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkV2FpdFRvRW5xdWV1ZUNvbW1hbmQodGltZW91dCksIHRoaXMuc3EsIDApOwotCQlUaHJlYWQgdDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHIxKTsKLQkJVGhyZWFkIHQyID0gdGhpcy5idWlsZFRocmVhZChyMik7Ci0JCXQxLnN0YXJ0KCk7Ci0JCXQyLnN0YXJ0KCk7Ci0JCXQxLmpvaW4oKTsKLQkJdDIuam9pbigpOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZEVucXVldWVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFF1ZXVlPFN0cmluZz4gc3luY2hyb25pemVkUXVldWUpIHsKLQkJCQlzeW5jaHJvbml6ZWRRdWV1ZS5lbnF1ZXVlKElURU1fMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFRvRGVxdWV1ZUNvbW1hbmQoZmluYWwgbG9uZyB0aW1lb3V0KSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkUXVldWU8U3RyaW5nPiBzeW5jaHJvbml6ZWRRdWV1ZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRRdWV1ZVRlc3RzLnRoaXMuc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3luY2hyb25pemVkUXVldWVUZXN0cy50aGlzLmRlcXVldWVkT2JqZWN0ID0gc3luY2hyb25pemVkUXVldWUud2FpdFRvRGVxdWV1ZSh0aW1lb3V0KTsKLQkJCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVN5bmNocm9uaXplZFF1ZXVlVGVzdHMudGhpcy50aW1lb3V0T2NjdXJyZWQgPSB0cnVlOwotCQkJCX0KLQkJCQlTeW5jaHJvbml6ZWRRdWV1ZVRlc3RzLnRoaXMuZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZERlcXVldWVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFF1ZXVlPFN0cmluZz4gc3luY2hyb25pemVkUXVldWUpIHsKLQkJCQlTeW5jaHJvbml6ZWRRdWV1ZVRlc3RzLnRoaXMuZGVxdWV1ZWRPYmplY3QgPSBzeW5jaHJvbml6ZWRRdWV1ZS5kZXF1ZXVlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFRvRW5xdWV1ZUNvbW1hbmQoZmluYWwgbG9uZyB0aW1lb3V0KSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkUXVldWU8U3RyaW5nPiBzeW5jaHJvbml6ZWRRdWV1ZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRRdWV1ZVRlc3RzLnRoaXMuc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3luY2hyb25pemVkUXVldWVUZXN0cy50aGlzLnRpbWVvdXRPY2N1cnJlZCA9ICEgc3luY2hyb25pemVkUXVldWUud2FpdFRvRW5xdWV1ZShJVEVNXzIsIHRpbWVvdXQpOwotCQkJCVN5bmNocm9uaXplZFF1ZXVlVGVzdHMudGhpcy5lbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIENvbW1hbmQgY29tbWFuZCwgZmluYWwgU3luY2hyb25pemVkUXVldWU8U3RyaW5nPiBzeW5jaHJvbml6ZWRRdWV1ZSwgZmluYWwgbG9uZyBzbGVlcCkgewotCQlyZXR1cm4gbmV3IFRlc3RSdW5uYWJsZSgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcnVuXygpIHRocm93cyBUaHJvd2FibGUgewotCQkJCWlmIChzbGVlcCAhPSAwKSB7Ci0JCQkJCVRocmVhZC5zbGVlcChzbGVlcCk7Ci0JCQkJfQotCQkJCWNvbW1hbmQuZXhlY3V0ZShzeW5jaHJvbml6ZWRRdWV1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JbG9uZyBjYWxjdWxhdGVFbGFwc2VkVGltZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW5kVGltZSAtIHRoaXMuc3RhcnRUaW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21tYW5kIGludGVyZmFjZSAqKioqKioqKioqCi0KLQlwcml2YXRlIGludGVyZmFjZSBDb21tYW5kIHsKLQkJdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFF1ZXVlPFN0cmluZz4gc3luY2hyb25pemVkUXVldWUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRTdGFja1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkU3RhY2tUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmNiNjJmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRTdGFja1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRTdGFjazsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkU3RhY2tUZXN0cwotCWV4dGVuZHMgU2ltcGxlU3RhY2tUZXN0cwotewotCXByaXZhdGUgdm9sYXRpbGUgU3luY2hyb25pemVkU3RhY2s8U3RyaW5nPiBzczsKLQl2b2xhdGlsZSBib29sZWFuIHRpbWVvdXRPY2N1cnJlZDsKLQl2b2xhdGlsZSBsb25nIHN0YXJ0VGltZTsKLQl2b2xhdGlsZSBsb25nIGVuZFRpbWU7Ci0Jdm9sYXRpbGUgT2JqZWN0IHBvcHBlZE9iamVjdDsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFTV8xID0gbmV3IFN0cmluZygpOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFTV8yID0gbmV3IFN0cmluZygpOwotCi0JcHVibGljIFN5bmNocm9uaXplZFN0YWNrVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JU3RhY2s8U3RyaW5nPiBidWlsZFN0YWNrKCkgewotCQlyZXR1cm4gbmV3IFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCS8vIHN5bmNocm9uaXplZCBzdGFjayBpcyBub3QgY2xvbmVhYmxlCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zcyA9IG5ldyBTeW5jaHJvbml6ZWRTdGFjazxTdHJpbmc+KCk7Ci0JCXRoaXMudGltZW91dE9jY3VycmVkID0gZmFsc2U7Ci0JCXRoaXMuc3RhcnRUaW1lID0gMDsKLQkJdGhpcy5lbmRUaW1lID0gMDsKLQkJdGhpcy5wb3BwZWRPYmplY3QgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHRlc3QgZmlyc3Qgd2l0aCBhbiB1bnN5bmNocm9uaXplZCBzdGFjaywKLQkgKiB0aGVuIHdpdGggYSBzeW5jaHJvbml6ZWQgc3RhY2sKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY3VycmVudEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUNvbmN1cnJlbnRBY2Nlc3MobmV3IFNsb3dTaW1wbGVTdGFjazxTdHJpbmc+KCksICJzZWNvbmQiKTsKLQkJdGhpcy52ZXJpZnlDb25jdXJyZW50QWNjZXNzKG5ldyBTbG93U3luY2hyb25pemVkU3RhY2s8U3RyaW5nPigpLCAiZmlyc3QiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29uY3VycmVudEFjY2VzcyhTbG93U3RhY2s8U3RyaW5nPiBzbG93U3RhY2ssIFN0cmluZyBleHBlY3RlZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNsb3dTdGFjay5wdXNoKCJmaXJzdCIpOwotCQlzbG93U3RhY2sucHVzaCgic2Vjb25kIik7Ci0KLQkJVGhyZWFkIHRocmVhZCA9IHRoaXMuYnVpbGRUaHJlYWQodGhpcy5idWlsZFJ1bm5hYmxlKHNsb3dTdGFjaykpOwotCQl0aHJlYWQuc3RhcnQoKTsKLQkJVGhyZWFkLnNsZWVwKFRXT19USUNLUyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzbG93U3RhY2sucG9wKCkpOwotCQl0aHJlYWQuam9pbigpOwotCQlhc3NlcnRUcnVlKHNsb3dTdGFjay5pc0VtcHR5KCkpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBTbG93U3RhY2s8U3RyaW5nPiBzbG93U3RhY2spIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzbG93U3RhY2suc2xvd1BvcCgpOwotCQkJfQotCQl9OwotCX0KLQotCi0JcHJpdmF0ZSBpbnRlcmZhY2UgU2xvd1N0YWNrPEU+IGV4dGVuZHMgU3RhY2s8RT4gewotCQlPYmplY3Qgc2xvd1BvcCgpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgU2xvd1NpbXBsZVN0YWNrPEU+IGV4dGVuZHMgU2ltcGxlU3RhY2s8RT4gaW1wbGVtZW50cyBTbG93U3RhY2s8RT4gewotCQlTbG93U2ltcGxlU3RhY2soKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3Qgc2xvd1BvcCgpIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDUgKiBUSUNLKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQkJcmV0dXJuIHRoaXMucG9wKCk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgY2xhc3MgU2xvd1N5bmNocm9uaXplZFN0YWNrPEU+IGV4dGVuZHMgU3luY2hyb25pemVkU3RhY2s8RT4gaW1wbGVtZW50cyBTbG93U3RhY2s8RT4gewotCQlTbG93U3luY2hyb25pemVkU3RhY2soKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHNsb3dQb3AoKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCg1ICogVElDSyk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLnBvcCgpOwotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogd2FpdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1BvcCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1BvcCgwKTsKLQkJLy8gbm8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0RmFsc2UodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgYW4gaXRlbSBzaG91bGQgaGF2ZSBiZWVuIHBvcHBlZCBieSB0Mi4uLgotCQlhc3NlcnRTYW1lKElURU1fMSwgdGhpcy5wb3BwZWRPYmplY3QpOwotCQkvLyAuLi5hbmQgdGhlIHN0YWNrIHNob3VsZCBiZSBlbXB0eQotCQlhc3NlcnRUcnVlKHRoaXMuc3MuaXNFbXB0eSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSA+IFRJQ0spOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9Qb3BUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvUG9wKFRJQ0spOwotCQkvLyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRUcnVlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSBzdGFjayB3YXMgbmV2ZXIgcG9wcGVkLi4uCi0JCWFzc2VydE51bGwodGhpcy5wb3BwZWRPYmplY3QpOwotCQkvLyAuLi5hbmQgaXQgc3RpbGwgaG9sZHMgdGhlIGl0ZW0KLQkJYXNzZXJ0U2FtZShJVEVNXzEsIHRoaXMuc3MucGVlaygpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSA8IFRIUkVFX1RJQ0tTKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFRvUG9wKGxvbmcgdGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRQdXNoQ29tbWFuZCgpLCB0aGlzLnNzLCBUV09fVElDS1MpOwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkV2FpdFRvUG9wQ29tbWFuZCh0aW1lb3V0KSwgdGhpcy5zcywgMCk7Ci0JCVRocmVhZCB0MSA9IHRoaXMuYnVpbGRUaHJlYWQocjEpOwotCQlUaHJlYWQgdDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHIyKTsKLQkJdDEuc3RhcnQoKTsKLQkJdDIuc3RhcnQoKTsKLQkJdDEuam9pbigpOwotCQl0Mi5qb2luKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1B1c2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VG9QdXNoKDApOwotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgc3RhY2sgZ2V0cyBwb3BwZWQgYnkgdDEuLi4KLQkJYXNzZXJ0U2FtZShJVEVNXzEsIHRoaXMucG9wcGVkT2JqZWN0KTsKLQkJLy8gLi4uYW5kIGFuIGl0ZW0gaXMgcHVzaGVkIG9uIHRvIHRoZSBzdGFjayBieSB0MgotCQlhc3NlcnRGYWxzZSh0aGlzLnNzLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFNhbWUoSVRFTV8yLCB0aGlzLnNzLnBlZWsoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCkgPiBUSUNLKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvUHVzaFRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VG9QdXNoKFRJQ0spOwotCQkvLyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRUcnVlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSBzdGFjayBpcyBldmVudHVhbGx5IHBvcHBlZCBieSB0MS4uLgotCQlhc3NlcnRTYW1lKElURU1fMSwgdGhpcy5wb3BwZWRPYmplY3QpOwotCQkvLyAuLi5idXQgbm90aGluZyBpcyBwdXNoZWQgb24gdG8gdGhlIHN0YWNrIGJ5IHQyCi0JCWFzc2VydFRydWUodGhpcy5zcy5pc0VtcHR5KCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpIDwgVEhSRUVfVElDS1MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VG9QdXNoKGxvbmcgdGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc3MucHVzaChJVEVNXzEpOwotCQlSdW5uYWJsZSByMSA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkUG9wQ29tbWFuZCgpLCB0aGlzLnNzLCBUV09fVElDS1MpOwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkV2FpdFRvUHVzaENvbW1hbmQodGltZW91dCksIHRoaXMuc3MsIDApOwotCQlUaHJlYWQgdDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHIxKTsKLQkJVGhyZWFkIHQyID0gdGhpcy5idWlsZFRocmVhZChyMik7Ci0JCXQxLnN0YXJ0KCk7Ci0JCXQyLnN0YXJ0KCk7Ci0JCXQxLmpvaW4oKTsKLQkJdDIuam9pbigpOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFB1c2hDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4gc3luY2hyb25pemVkU3RhY2spIHsKLQkJCQlzeW5jaHJvbml6ZWRTdGFjay5wdXNoKElURU1fMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFRvUG9wQ29tbWFuZChmaW5hbCBsb25nIHRpbWVvdXQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRTdGFjazxTdHJpbmc+IHN5bmNocm9uaXplZFN0YWNrKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZFN0YWNrVGVzdHMudGhpcy5zdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl0cnkgewotCQkJCQlTeW5jaHJvbml6ZWRTdGFja1Rlc3RzLnRoaXMucG9wcGVkT2JqZWN0ID0gc3luY2hyb25pemVkU3RhY2sud2FpdFRvUG9wKHRpbWVvdXQpOwotCQkJCX0gY2F0Y2ggKEVtcHR5U3RhY2tFeGNlcHRpb24gZXgpIHsKLQkJCQkJU3luY2hyb25pemVkU3RhY2tUZXN0cy50aGlzLnRpbWVvdXRPY2N1cnJlZCA9IHRydWU7Ci0JCQkJfQotCQkJCVN5bmNocm9uaXplZFN0YWNrVGVzdHMudGhpcy5lbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkUG9wQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRTdGFjazxTdHJpbmc+IHN5bmNocm9uaXplZFN0YWNrKSB7Ci0JCQkJU3luY2hyb25pemVkU3RhY2tUZXN0cy50aGlzLnBvcHBlZE9iamVjdCA9IHN5bmNocm9uaXplZFN0YWNrLnBvcCgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFdhaXRUb1B1c2hDb21tYW5kKGZpbmFsIGxvbmcgdGltZW91dCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4gc3luY2hyb25pemVkU3RhY2spIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkU3RhY2tUZXN0cy50aGlzLnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5bmNocm9uaXplZFN0YWNrVGVzdHMudGhpcy50aW1lb3V0T2NjdXJyZWQgPSAhIHN5bmNocm9uaXplZFN0YWNrLndhaXRUb1B1c2goSVRFTV8yLCB0aW1lb3V0KTsKLQkJCQlTeW5jaHJvbml6ZWRTdGFja1Rlc3RzLnRoaXMuZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBDb21tYW5kIGNvbW1hbmQsIGZpbmFsIFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4gc3luY2hyb25pemVkU3RhY2ssIGZpbmFsIGxvbmcgc2xlZXApIHsKLQkJcmV0dXJuIG5ldyBUZXN0UnVubmFibGUoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHJ1bl8oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJCQlpZiAoc2xlZXAgIT0gMCkgewotCQkJCQlUaHJlYWQuc2xlZXAoc2xlZXApOwotCQkJCX0KLQkJCQljb21tYW5kLmV4ZWN1dGUoc3luY2hyb25pemVkU3RhY2spOwotCQkJfQotCQl9OwotCX0KLQotCWxvbmcgY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSB7Ci0JCXJldHVybiB0aGlzLmVuZFRpbWUgLSB0aGlzLnN0YXJ0VGltZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29tbWFuZCBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JcHJpdmF0ZSBpbnRlcmZhY2UgQ29tbWFuZCB7Ci0JCXZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRTdGFjazxTdHJpbmc+IHN5bmNocm9uaXplZFN0YWNrKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvVGVzdENvbW1hbmQuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9UZXN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDA0MGU0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9UZXN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLS8qKgotICogQ29tbWFuZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgdGVzdHM7IGkuZS4gYSBjb21tYW5kIHRoYXQgYWxsb3dzIGl0cwotICogaW1wbGVtZW50YXRpb24gdG8gdGhyb3cgZXhjZXB0aW9ucy4KLSAqLwotcHVibGljIGludGVyZmFjZSBUZXN0Q29tbWFuZCB7Ci0Jdm9pZCBleGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9UZXN0VG9vbHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9UZXN0VG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmZjJmZi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvVGVzdFRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RGYWlsdXJlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0OwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLQotLyoqCi0gKiBWYXJpb3VzIHRvb2xzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGVzdCBjYXNlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgVGVzdFRvb2xzIHsKLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGhhbmRsZXMge0BsaW5rIEludGVycnVwdGVkRXhjZXB0aW9ufS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2xlZXAobG9uZyBtaWxsaXMpIHsKLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcChtaWxsaXMpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQuIElmIGl0IHRocm93cyBhbiBleGNlcHRpb24sIHJlLWV4ZWN1dGUgaXQKLQkgKiByZXBlYXRlZGx5IHVudGlsIGl0IGV4ZWN1dGVzIHdpdGhvdXQgYW4gZXhjZXB0aW9uLgotCSAqIFRoZXJlIHdpbGwgYmUgYSBvbmUtc2Vjb25kIGRlbGF5IGJldHdlZW4gZWFjaCBleGVjdXRpb24uCi0JICogVGhpcyBpcyB1c2VmdWwgd2hlbiBjYWxsaW5nIHRoaXJkLXBhcnR5IGNvZGUgdGhhdCBpbnRlcm1pdHRlbnRseSB0aHJvd3MKLQkgKiBleGNlcHRpb25zIGJ1dCB3aWxsIDxlbT5ldmVudHVhbGx5PC9lbT4gZXhlY3V0ZSBzdWNjZXNzZnVsbHkgKGUuZy4gd2hlbgotCSAqIHRoZXJlIGFyZSBwcm9ibGVtcyBkZWxldGluZyBmaWxlcykuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGV4ZWN1dGUoVGVzdENvbW1hbmQgY29tbWFuZCkgewotCQlleGVjdXRlKGNvbW1hbmQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZC4gSWYgaXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmUtZXhlY3V0ZSBpdAotCSAqIHJlcGVhdGVkbHkgdW50aWwgaXQgZXhlY3V0ZXMgd2l0aG91dCBhbiBleGNlcHRpb24uIEV4ZWN1dGUgdGhlIGNvbW1hbmQKLQkgKiB1cCB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBhdHRlbXB0cy4KLQkgKiBUaGVyZSB3aWxsIGJlIGEgb25lLXNlY29uZCBkZWxheSBiZXR3ZWVuIGVhY2ggZXhlY3V0aW9uLgotCSAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gY2FsbGluZyB0aGlyZC1wYXJ0eSBjb2RlIHRoYXQgaW50ZXJtaXR0ZW50bHkgdGhyb3dzCi0JICogZXhjZXB0aW9ucyBidXQgd2lsbCA8ZW0+ZXZlbnR1YWxseTwvZW0+IGV4ZWN1dGUgc3VjY2Vzc2Z1bGx5IChlLmcuIHdoZW4KLQkgKiB0aGVyZSBhcmUgcHJvYmxlbXMgZGVsZXRpbmcgZmlsZXMpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBleGVjdXRlKFRlc3RDb21tYW5kIGNvbW1hbmQsIGludCBhdHRlbXB0cykgewotCQlleGVjdXRlKGNvbW1hbmQsIGF0dGVtcHRzLCAxMDAwKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZC4gSWYgaXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmUtZXhlY3V0ZSBpdAotCSAqIHJlcGVhdGVkbHkgdW50aWwgaXQgZXhlY3V0ZXMgd2l0aG91dCBhbiBleGNlcHRpb24uIEV4ZWN1dGUgdGhlIGNvbW1hbmQKLQkgKiB1cCB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBhdHRlbXB0c2wgd2l0aCBzcGVjaWZpZWQgZGVsYXkgYmV0d2VlbgotCSAqIGVhY2ggZXhlY3V0aW9uLgotCSAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gY2FsbGluZyB0aGlyZC1wYXJ0eSBjb2RlIHRoYXQgaW50ZXJtaXR0ZW50bHkgdGhyb3dzCi0JICogZXhjZXB0aW9ucyBidXQgd2lsbCA8ZW0+ZXZlbnR1YWxseTwvZW0+IGV4ZWN1dGUgc3VjY2Vzc2Z1bGx5IChlLmcuIHdoZW4KLQkgKiB0aGVyZSBhcmUgcHJvYmxlbXMgZGVsZXRpbmcgZmlsZXMpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBleGVjdXRlKFRlc3RDb21tYW5kIGNvbW1hbmQsIGludCBhdHRlbXB0cywgbG9uZyBkZWxheSkgewotCQlmb3IgKGludCBpID0gMTsgaSA8PSBhdHRlbXB0czsgaSsrKSB7ICAvLyBOQjogc3RhcnQgd2l0aCAxCi0JCQl0cnkgewotCQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQkJCXJldHVybjsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCWlmICgoYXR0ZW1wdHMgIT0gLTEpICYmIChpID09IGF0dGVtcHRzKSkgewotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiYXR0ZW1wdHM6ICIgKyBpLCBleCk7Ci0JCQkJfQotCQkJCXNsZWVwKGRlbGF5KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRlc3QgYW4gb2JqZWN0J3MgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFNlcmlhbGl6YWJsZX0gYnkgc2VyaWFsaXppbmcgdGhlCi0JICogc3BlY2lmaWVkIG9iamVjdCB0byBhIGJ5dGUgYXJyYXk7IHRoZW4gZGUtc2VyaWFsaXppbmcgdGhlIGJ5dGUgYXJyYXkgYW5kCi0JICogcmV0dXJuaW5nIHRoZSByZXN1bHRhbnQgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgc2VyaWFsaXplKFQgbykgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhT3V0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgyMDAwKTsKLQkJT2JqZWN0T3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFPdXRTdHJlYW0pOwotCQlvdXRTdHJlYW0ud3JpdGVPYmplY3Qobyk7Ci0JCW91dFN0cmVhbS5jbG9zZSgpOwotCi0JCUJ5dGVBcnJheUlucHV0U3RyZWFtIGJhSW5TdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFPdXRTdHJlYW0udG9CeXRlQXJyYXkoKSk7Ci0JCU9iamVjdElucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGJhSW5TdHJlYW0pOwotCQlUIG8yID0gcmVhZE9iamVjdChpblN0cmVhbSk7Ci0JCWluU3RyZWFtLmNsb3NlKCk7Ci0KLQkJcmV0dXJuIG8yOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIDxUPiBUIHJlYWRPYmplY3QoT2JqZWN0SW5wdXQgb2JqZWN0SW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoVCkgb2JqZWN0SW5wdXQucmVhZE9iamVjdCgpOwotCX0KLQotCS8qKgotCSAqIFJlZGlyZWN0IHN0ZCBvdXQgYW5kIHN0ZCBlcnIgdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZGlyZWN0U3lzdGVtU3RyZWFtc1RvKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHsKLQkJcmVkaXJlY3RTeXN0ZW1TdHJlYW1zVG8obmV3IFByaW50U3RyZWFtKG91dHB1dFN0cmVhbSkpOwotCX0KLQotCS8qKgotCSAqIFJlZGlyZWN0IHN0ZCBvdXQgYW5kIHN0ZCBlcnIgdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZGlyZWN0U3lzdGVtU3RyZWFtc1RvKFByaW50U3RyZWFtIHByaW50U3RyZWFtKSB7Ci0JCVN5c3RlbS5zZXRPdXQocHJpbnRTdHJlYW0pOwotCQlTeXN0ZW0uc2V0RXJyKHByaW50U3RyZWFtKTsKLQl9Ci0KLQkvKioKLQkgKiBTb3J0IGFuZCBwcmludCBvdXQgYWxsIHRoZSBjdXJyZW50IEphdmEgU3lzdGVtIHByb3BlcnRpZXMgb24gdGhlCi0JICogY29uc29sZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRTeXN0ZW1Qcm9wZXJ0aWVzKCkgewotCQlzeW5jaHJvbml6ZWQgKFN5c3RlbS5vdXQpIHsKLQkJCXByaW50U3lzdGVtUHJvcGVydGllc09uKFN5c3RlbS5vdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU29ydCBhbmQgcHJpbnQgb3V0IGFsbCB0aGUgY3VycmVudCBKYXZhIFN5c3RlbSBwcm9wZXJ0aWVzIG9uIHRoZQotCSAqIHNwZWNpZmllZCBwcmludCBzdHJlYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50U3lzdGVtUHJvcGVydGllc09uKFByaW50U3RyZWFtIHN0cmVhbSkgewotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzb3J0ZWRLZXlzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihTdHJpbmcuQ0FTRV9JTlNFTlNJVElWRV9PUkRFUik7Ci0JCWZvciAoT2JqZWN0IGtleSA6IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkua2V5U2V0KCkpIHsKLQkJCXNvcnRlZEtleXMuYWRkKChTdHJpbmcpIGtleSk7Ci0JCX0KLQkJZm9yIChTdHJpbmcga2V5IDogc29ydGVkS2V5cykgewotCQkJc3RyZWFtLnByaW50KGtleSk7Ci0JCQlzdHJlYW0ucHJpbnQoIiA9PiAiKTsKLQkJCXN0cmVhbS5wcmludChTeXN0ZW0uZ2V0UHJvcGVydHkoa2V5KSk7Ci0JCQlzdHJlYW0ucHJpbnRsbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIHRlc3QgYW5kIHJldHVybiBhIHRleHQgb3V0cHV0IG9mIGl0cyByZXN1bHRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4ZWN1dGUoVGVzdENhc2UgdGVzdENhc2UpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlUZXN0UmVzdWx0IHJlc3VsdCA9IHRlc3RDYXNlLnJ1bigpOwotCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCVN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpOwotCQl3cml0ZXIucHJpbnQodGVzdENhc2UuZ2V0TmFtZSgpKTsKLQkJd3JpdGVyLnByaW50KCI6ICIpOwotCQlpZiAocmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKSkgewotCQkJd3JpdGVyLnByaW50bG4oIk9LIik7Ci0JCX0gZWxzZSB7Ci0JCQlUZXN0RmFpbHVyZSBmYWlsdXJlID0gbnVsbDsKLQkJCWlmIChyZXN1bHQuZmFpbHVyZXMoKS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCWZhaWx1cmUgPSByZXN1bHQuZmFpbHVyZXMoKS5uZXh0RWxlbWVudCgpOwotCQkJfSBlbHNlIHsKLQkJCQlmYWlsdXJlID0gcmVzdWx0LmVycm9ycygpLm5leHRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlmYWlsdXJlLnRocm93bkV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZSh3cml0ZXIpOwotCQl9Ci0JCXdyaXRlci5wcmludCgiZWxhcHNlZCB0aW1lOiAiKTsKLQkJbG9uZyBlbGFwc2VkID0gZW5kIC0gc3RhcnQ7Ci0JCXdyaXRlci5wcmludChlbGFwc2VkIC8gMTAwMEwpOwotCQl3cml0ZXIucHJpbnRsbigiIHNlYy4iKTsKLQkJcmV0dXJuIHN0cmluZ1dyaXRlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIENsZWFyIG91dCBhbGwgdGhlIGluc3RhbmNlIHZhcmlhYmxlIG9mIHRoZSBzcGVjaWZpZWQgdGVzdCBjYXNlLCBhbGxvd2luZwotCSAqIHRoZSB2YXJpb3VzIHRlc3QgZml4dHVyZXMgdG8gYmUgZ2FyYmFnZS1jb2xsZWN0ZWQuIFR5cGljYWxseSB0aGlzIGlzCi0JICogY2FsbGVkIGluIHRoZSB0ZXN0IGNhc2UncyBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgVGVzdENhc2UjdGVhckRvd24oKX0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyKFRlc3RDYXNlIHRlc3RDYXNlKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0JCWZvciAoQ2xhc3M8Pz4gY2xhenogPSB0ZXN0Q2FzZS5nZXRDbGFzcygpOyBjbGF6eiAhPSBUZXN0Q2FzZV9jbGFzczsgY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCkpIHsKLQkJCWZvciAoRmllbGQgZmllbGQgOiBjbGF6ei5nZXREZWNsYXJlZEZpZWxkcygpKSB7Ci0JCQkJLy8gbGVhdmUgcHJpbWl0aXZlcyBhbG9uZSAtIHRoZXkgZG9uJ3QgZ2V0IGdhcmJhZ2UtY29sbGVjdGVkLCBhbmQgd2UgY2FuJ3Qgc2V0IHRoZW0gdG8gbnVsbC4uLgotCQkJCWlmIChmaWVsZC5nZXRUeXBlKCkuaXNQcmltaXRpdmUoKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJLy8gbGVhdmUgc3RhdGljIGZpZWxkcyBhbG9uZSAoPykKLQkJCQlpZiAoTW9kaWZpZXIuaXNTdGF0aWMoZmllbGQuZ2V0TW9kaWZpZXJzKCkpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQkJCWZpZWxkLnNldCh0ZXN0Q2FzZSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MncyA8Y29kZT5ERUJVRzwvY29kZT4gY29uc3RhbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlYnVnKENsYXNzPD8+IGNsYXp6KSB7Ci0JCUJvb2xlYW4gZGVidWcgPSAoQm9vbGVhbikgUmVmbGVjdGlvblRvb2xzLmdldFN0YXRpY0ZpZWxkVmFsdWUoY2xhenosICJERUJVRyIpOwotCQlyZXR1cm4gZGVidWcuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZ5IHRoZSBzcGVjaWZpZWQgY2xhc3MncyA8Y29kZT5ERUJVRzwvY29kZT4gY29uc3RhbnQgaXMgc2V0IHRvCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRGYWxzZURFQlVHKENsYXNzPD8+IGNsYXp6KSB7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZSgiUmVjb21waWxlIHdpdGggXCJERUJVRyA9IGZhbHNlXCI6ICIgKyBjbGF6ei5nZXROYW1lKCksIGRlYnVnKGNsYXp6KSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPFRlc3RDYXNlPiBUZXN0Q2FzZV9jbGFzcyA9IFRlc3RDYXNlLmNsYXNzOwotCi0JLyoqCi0JICogV29ya2Fyb3VuZCBmb3IgYSBKVW5pdCBidWc6IEpVbml0IGRvZXMgbm90IGNvbmZpZ3VyZSB0aGUgdGVzdGluZyB7QGxpbmsgVGhyZWFkfQotCSAqIHdpdGggYSBjb250ZXh0IGNsYXNzIGxvYWRlci4gVGhpcyBzaG91bGQgcHJvYmFibHkgaGFwcGVuIGluCi0JICoge0BsaW5rIFRlc3RSdW5uZXIjZG9SdW4oVGVzdCl9LCBqdXN0IGJlZm9yZSBzdGFydGluZyB0aGUgdGhyZWFkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcEpVbml0VGhyZWFkQ29udGV4dENsYXNzTG9hZGVyKCkgewotCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihUZXN0VG9vbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogc3VwcHJlc3NlZCBjb25zdHJ1Y3RvcgotCSAqLwotCXByaXZhdGUgVGVzdFRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvVG9vbHNUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1Rvb2xzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3ZmNiYS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRvb2xzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgVG9vbHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzQXJlRXF1YWwxKCkgewotCQlhc3NlcnRUcnVlKFRvb2xzLnZhbHVlc0FyZUVxdWFsKG51bGwsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzQXJlRXF1YWwyKCkgewotCQlhc3NlcnRGYWxzZShUb29scy52YWx1ZXNBcmVFcXVhbChudWxsLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZXNBcmVFcXVhbDMoKSB7Ci0JCWFzc2VydEZhbHNlKFRvb2xzLnZhbHVlc0FyZUVxdWFsKCJmb28iLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlc0FyZUVxdWFsNCgpIHsKLQkJYXNzZXJ0VHJ1ZShUb29scy52YWx1ZXNBcmVFcXVhbCgiZm9vIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzQXJlRXF1YWw1KCkgewotCQlhc3NlcnRGYWxzZShUb29scy52YWx1ZXNBcmVFcXVhbCgiZm9vIiwgImJhciIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzQXJlRGlmZmVyZW50MSgpIHsKLQkJYXNzZXJ0RmFsc2UoVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KG51bGwsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzQXJlRGlmZmVyZW50MigpIHsKLQkJYXNzZXJ0VHJ1ZShUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQobnVsbCwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzQXJlRGlmZmVyZW50MygpIHsKLQkJYXNzZXJ0VHJ1ZShUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQoImZvbyIsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzQXJlRGlmZmVyZW50NCgpIHsKLQkJYXNzZXJ0RmFsc2UoVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KCJmb28iLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZXNBcmVEaWZmZXJlbnQ1KCkgewotCQlhc3NlcnRUcnVlKFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCgiZm9vIiwgImJhciIpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9WZXJzaW9uQ29tcGFyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvVmVyc2lvbkNvbXBhcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTdlZmYxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9WZXJzaW9uQ29tcGFyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlZlcnNpb25Db21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5WZXJzaW9uQ29tcGFyYXRvci5TZWdtZW50UGFyc2VyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBWZXJzaW9uQ29tcGFyYXRvclRlc3RzCi0JZXh0ZW5kcyBUZXN0Q2FzZQotewotCXB1YmxpYyBWZXJzaW9uQ29tcGFyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uSXNFcXVhbF9pbnRlZ2VyKCkgewotCQlhc3NlcnRUcnVlKFZlcnNpb25Db21wYXJhdG9yLklOVEVHRVJfVkVSU0lPTl9DT01QQVJBVE9SLmNvbXBhcmUoIjIuMC4wIiwgIjIuMC4wIikgPT0gMCk7Ci0JCWFzc2VydFRydWUoVmVyc2lvbkNvbXBhcmF0b3IuSU5URUdFUl9WRVJTSU9OX0NPTVBBUkFUT1IuY29tcGFyZSgiMi4wLjAiLCAiMi4wLjAuMCIpID09IDApOwotCQlhc3NlcnRUcnVlKFZlcnNpb25Db21wYXJhdG9yLklOVEVHRVJfVkVSU0lPTl9DT01QQVJBVE9SLmNvbXBhcmUoIjIuMC4wLjAuMC4wLjAwMDAiLCAiMi4wIikgPT0gMCk7Ci0JCWFzc2VydFRydWUoVmVyc2lvbkNvbXBhcmF0b3IuSU5URUdFUl9WRVJTSU9OX0NPTVBBUkFUT1IuY29tcGFyZSgiMi4wLi0xIiwgIjIuMC4tMSIpID09IDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uSXNMZXNzX2ludGVnZXIoKSB7Ci0JCWFzc2VydFRydWUoVmVyc2lvbkNvbXBhcmF0b3IuSU5URUdFUl9WRVJTSU9OX0NPTVBBUkFUT1IuY29tcGFyZSgiMi4wLjAiLCAiMi4wLjEiKSA8IDApOwotCQlhc3NlcnRUcnVlKFZlcnNpb25Db21wYXJhdG9yLklOVEVHRVJfVkVSU0lPTl9DT01QQVJBVE9SLmNvbXBhcmUoIjIuNS4wIiwgIjIuMTQiKSA8IDApOwotCQlhc3NlcnRUcnVlKFZlcnNpb25Db21wYXJhdG9yLklOVEVHRVJfVkVSU0lPTl9DT01QQVJBVE9SLmNvbXBhcmUoIjIuNS4wIiwgIjIuNS4wLjAuMS4wIikgPCAwKTsKLQkJYXNzZXJ0VHJ1ZShWZXJzaW9uQ29tcGFyYXRvci5JTlRFR0VSX1ZFUlNJT05fQ09NUEFSQVRPUi5jb21wYXJlKCIyLjUuMC4wLjAuLTEiLCAiMi41IikgPCAwKTsKLQkJYXNzZXJ0VHJ1ZShWZXJzaW9uQ29tcGFyYXRvci5JTlRFR0VSX1ZFUlNJT05fQ09NUEFSQVRPUi5jb21wYXJlKCIyLjAuLTEiLCAiMi4wLjAiKSA8IDApOwotCQlhc3NlcnRUcnVlKFZlcnNpb25Db21wYXJhdG9yLklOVEVHRVJfVkVSU0lPTl9DT01QQVJBVE9SLmNvbXBhcmUoIjIuMC4tMSIsICIyIikgPCAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbklzR3JlYXRlcl9pbnRlZ2VyKCkgewotCQlhc3NlcnRUcnVlKFZlcnNpb25Db21wYXJhdG9yLklOVEVHRVJfVkVSU0lPTl9DT01QQVJBVE9SLmNvbXBhcmUoIjIuMC4yIiwgIjIuMC4xIikgPiAwKTsKLQkJYXNzZXJ0VHJ1ZShWZXJzaW9uQ29tcGFyYXRvci5JTlRFR0VSX1ZFUlNJT05fQ09NUEFSQVRPUi5jb21wYXJlKCIyLjAuMiIsICIyLjAuMSIpID4gMCk7Ci0JCWFzc2VydFRydWUoVmVyc2lvbkNvbXBhcmF0b3IuSU5URUdFUl9WRVJTSU9OX0NPTVBBUkFUT1IuY29tcGFyZSgiMi41LjAuMC4xLjAiLCAiMi41LjAiKSA+IDApOwotCQlhc3NlcnRUcnVlKFZlcnNpb25Db21wYXJhdG9yLklOVEVHRVJfVkVSU0lPTl9DT01QQVJBVE9SLmNvbXBhcmUoIjIuNSIsICIyLjUuMC4wLjAuLTEiKSA+IDApOwotCQlhc3NlcnRUcnVlKFZlcnNpb25Db21wYXJhdG9yLklOVEVHRVJfVkVSU0lPTl9DT01QQVJBVE9SLmNvbXBhcmUoIjIuMC4wIiwgIjIuMC4tMSIpID4gMCk7Ci0JCWFzc2VydFRydWUoVmVyc2lvbkNvbXBhcmF0b3IuSU5URUdFUl9WRVJTSU9OX0NPTVBBUkFUT1IuY29tcGFyZSgiMiIsICIyLjAuLTEiKSA+IDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uSXNFcXVhbF9pbnRlZ2VyX2NvbW1hKCkgewotCQlDb21wYXJhdG9yPFN0cmluZz4gdmVyc2lvbkNvbXBhcmF0b3IgPSBuZXcgVmVyc2lvbkNvbXBhcmF0b3I8QmlnRGVjaW1hbD4oIiwiLCBEZWNpbWFsU2VnbWVudFBhcnNlci5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLDAsMCIsICIyLDAsMCIpID09IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb25Db21wYXJhdG9yLmNvbXBhcmUoIjIsMC4wLDAiLCAiMiwwLDAiKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLDAuMCwwIiwgIjIsMCwwLjAiKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLjAsMC4wLDAiLCAiMiwwLDAuMCIpID09IDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uSXNMZXNzX2ludGVnZXJfY29tbWEoKSB7Ci0JCUNvbXBhcmF0b3I8U3RyaW5nPiB2ZXJzaW9uQ29tcGFyYXRvciA9IG5ldyBWZXJzaW9uQ29tcGFyYXRvcjxCaWdEZWNpbWFsPigiLCIsIERlY2ltYWxTZWdtZW50UGFyc2VyLmluc3RhbmNlKCkpOwotCQlhc3NlcnRUcnVlKHZlcnNpb25Db21wYXJhdG9yLmNvbXBhcmUoIjIsMCwwIiwgIjIsMCwxIikgPCAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLDAuMCwwIiwgIjIsMCwxIikgPCAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLDAsMCIsICIyLDAsMS4wIikgPCAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLjAsMCwwIiwgIjIsMCwxIikgPCAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbklzR3JlYXRlcl9pbnRlZ2VyX2NvbW1hKCkgewotCQlDb21wYXJhdG9yPFN0cmluZz4gdmVyc2lvbkNvbXBhcmF0b3IgPSBuZXcgVmVyc2lvbkNvbXBhcmF0b3I8QmlnRGVjaW1hbD4oIiwiLCBEZWNpbWFsU2VnbWVudFBhcnNlci5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLDAsMiIsICIyLDAsMSIpID4gMCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbkNvbXBhcmF0b3IuY29tcGFyZSgiMiwwLDIuMSIsICIyLDAsMSIpID4gMCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbkNvbXBhcmF0b3IuY29tcGFyZSgiMiwwLDIiLCAiMiwwLDEuOSIpID4gMCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbkNvbXBhcmF0b3IuY29tcGFyZSgiMi4wMDAsMCwyIiwgIjIsMCwxIikgPiAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbklzRXF1YWxfc3ViY2xhc3MoKSB7Ci0JCUNvbXBhcmF0b3I8U3RyaW5nPiB2ZXJzaW9uQ29tcGFyYXRvciA9IG5ldyBWZXJzaW9uQ29tcGFyYXRvcjxJbnRlZ2VyPigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBwYXJzZVNlZ21lbnQoaW50IGluZGV4LCBTdHJpbmcgcykgewotCQkJCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKHMpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBnZXRaZXJvKCkgewotCQkJCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKDApOwotCQkJCX0KLQkJCX07Ci0JCWFzc2VydFRydWUodmVyc2lvbkNvbXBhcmF0b3IuY29tcGFyZSgiMi4wLjAiLCAiMi4wLjAiKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLjAuMCIsICIyLjAuMC4wIikgPT0gMCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbkNvbXBhcmF0b3IuY29tcGFyZSgiMi4wLjAuMCIsICIyLjAiKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLjAuLTEiLCAiMi4wLi0xIikgPT0gMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZlcnNpb25Jc0xlc3Nfc3ViY2xhc3MoKSB7Ci0JCUNvbXBhcmF0b3I8U3RyaW5nPiB2ZXJzaW9uQ29tcGFyYXRvciA9IG5ldyBWZXJzaW9uQ29tcGFyYXRvcjxJbnRlZ2VyPigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBwYXJzZVNlZ21lbnQoaW50IGluZGV4LCBTdHJpbmcgcykgewotCQkJCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKHMpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBnZXRaZXJvKCkgewotCQkJCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKDApOwotCQkJCX0KLQkJCX07Ci0JCWFzc2VydFRydWUodmVyc2lvbkNvbXBhcmF0b3IuY29tcGFyZSgiMi4wLjAiLCAiMi4wLjEiKSA8IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb25Db21wYXJhdG9yLmNvbXBhcmUoIjIuNS4wIiwgIjIuMTQiKSA8IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb25Db21wYXJhdG9yLmNvbXBhcmUoIjIuNS4wIiwgIjIuNS4wLjAuMS4wIikgPCAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLjAuLTEiLCAiMi4wLjAiKSA8IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb25Db21wYXJhdG9yLmNvbXBhcmUoIjIuMC4tMSIsICIyIikgPCAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbklzR3JlYXRlcl9zdWJjbGFzcygpIHsKLQkJQ29tcGFyYXRvcjxTdHJpbmc+IHZlcnNpb25Db21wYXJhdG9yID0gbmV3IFZlcnNpb25Db21wYXJhdG9yPEludGVnZXI+KCkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJbnRlZ2VyIHBhcnNlU2VnbWVudChpbnQgaW5kZXgsIFN0cmluZyBzKSB7Ci0JCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2Yocyk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGdldFplcm8oKSB7Ci0JCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YoMCk7Ci0JCQkJfQotCQkJfTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLjAuMiIsICIyLjAuMSIpID4gMCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbkNvbXBhcmF0b3IuY29tcGFyZSgiMi4wLjIiLCAiMi4wLjEiKSA+IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb25Db21wYXJhdG9yLmNvbXBhcmUoIjIuNS4wLjAuMS4wIiwgIjIuNS4wIikgPiAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLjAuMCIsICIyLjAuLTEiKSA+IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb25Db21wYXJhdG9yLmNvbXBhcmUoIjIiLCAiMi4wLi0xIikgPiAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFkU3RyaW5nKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQkvLyBub3RlIHRoZSBsZXR0ZXIgJ08nIGluc3RlYWQgb2YgdGhlIG51bWVyYWwgJzAnCi0JCQlhc3NlcnRUcnVlKFZlcnNpb25Db21wYXJhdG9yLklOVEVHRVJfVkVSU0lPTl9DT01QQVJBVE9SLmNvbXBhcmUoIjIuMC4wIiwgIjIuTy5PIikgPT0gMCk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c1N1YmNsYXNzMSgpIHsKLQkJQ29tcGFyYXRvcjxTdHJpbmc+IHZlcnNpb25Db21wYXJhdG9yID0gbmV3IFZlcnNpb25Db21wYXJhdG9yPEludGVnZXI+KCkgewotCQkJCS8vIGJvZ3VzIC0gbXVzdCBvdmVycmlkZSBwYXJzZVNlZ21lbnQoLi4uKQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGdldFplcm8oKSB7Ci0JCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YoMCk7Ci0JCQkJfQotCQkJfTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLjAuMCIsICIyLjAuMCIpID09IDApOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c1N1YmNsYXNzMigpIHsKLQkJQ29tcGFyYXRvcjxTdHJpbmc+IHZlcnNpb25Db21wYXJhdG9yID0gbmV3IFZlcnNpb25Db21wYXJhdG9yPEludGVnZXI+KCkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJbnRlZ2VyIHBhcnNlU2VnbWVudChpbnQgaW5kZXgsIFN0cmluZyBzKSB7Ci0JCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2Yocyk7Ci0JCQkJfQotCQkJCS8vIGJvZ3VzIC0gbXVzdCBnZXRaZXJvKCkKLQkJCX07Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWFzc2VydFRydWUodmVyc2lvbkNvbXBhcmF0b3IuY29tcGFyZSgiMi4wLjAiLCAiMi4wLjAuMC4wIikgPT0gMCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQlzdGF0aWMgZmluYWwgY2xhc3MgRGVjaW1hbFNlZ21lbnRQYXJzZXIKLQkJaW1wbGVtZW50cyBTZWdtZW50UGFyc2VyPEJpZ0RlY2ltYWw+LCBTZXJpYWxpemFibGUKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU2VnbWVudFBhcnNlcjxCaWdEZWNpbWFsPiBJTlNUQU5DRSA9IG5ldyBEZWNpbWFsU2VnbWVudFBhcnNlcigpOwotCQlwdWJsaWMgc3RhdGljIFNlZ21lbnRQYXJzZXI8QmlnRGVjaW1hbD4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIERlY2ltYWxTZWdtZW50UGFyc2VyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBzaW1wbHkgcGFyc2UgdGhlIHNlZ21lbnQgYXMgYW4gaW50ZWdlcgotCQlwdWJsaWMgQmlnRGVjaW1hbCBwYXJzZShpbnQgc2VnbWVudEluZGV4LCBTdHJpbmcgc2VnbWVudCkgewotCQkJcmV0dXJuIG5ldyBCaWdEZWNpbWFsKHNlZ21lbnQpOwotCQl9Ci0JCXB1YmxpYyBCaWdEZWNpbWFsIGdldFplcm8oKSB7Ci0JCQlyZXR1cm4gWkVSTzsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFpFUk8gPSBuZXcgQmlnRGVjaW1hbCgwKTsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1hNTFN0cmluZ0VuY29kZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1hNTFN0cmluZ0VuY29kZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjEzMTNjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9YTUxTdHJpbmdFbmNvZGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuRmlsZVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5YTUxTdHJpbmdFbmNvZGVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBYTUxTdHJpbmdFbmNvZGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgWE1MU3RyaW5nRW5jb2RlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbmNvZGVOb0NoYXJhY3RlclNlcXVlbmNlcygpIHsKLQkJWE1MU3RyaW5nRW5jb2RlciBlbmNvZGVyID0gbmV3IFhNTFN0cmluZ0VuY29kZXIoRmlsZVRvb2xzLklOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUyk7Ci0KLQkJU3RyaW5nIHMgPSAiZm9vIjsKLQkJYXNzZXJ0RXF1YWxzKHMsIGVuY29kZXIuZW5jb2RlKHMpKTsKLQotCQlzID0gIjEyM2ZvbzEyMyI7Ci0JCWFzc2VydEVxdWFscyhzLCBlbmNvZGVyLmVuY29kZShzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVuY29kZUNoYXJhY3RlclNlcXVlbmNlcygpIHsKLQkJWE1MU3RyaW5nRW5jb2RlciBlbmNvZGVyID0gbmV3IFhNTFN0cmluZ0VuY29kZXIoRmlsZVRvb2xzLklOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUyk7Ci0KLQkJU3RyaW5nIHMgPSAiP2Zvbz8iOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiJiN4M2Y7Zm9vJiN4M2Y7IjsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBlbmNvZGVyLmVuY29kZShzKSk7Ci0KLQkJcyA9ICI/Zm9vJjEyMyI7Ci0JCWV4cGVjdGVkID0gIiYjeDNmO2ZvbyYjeDI2OzEyMyI7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgZW5jb2Rlci5lbmNvZGUocykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZW5vcm1hbGl6ZVZhbGlkRmlsZU5hbWUoKSB7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCi0JCVN0cmluZyBzID0gImZvbyI7Ci0JCWFzc2VydEVxdWFscyhzLCBlbmNvZGVyLmRlY29kZShzKSk7Ci0KLQkJcyA9ICIxMjNmb28xMjMiOwotCQlhc3NlcnRFcXVhbHMocywgZW5jb2Rlci5kZWNvZGUocykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZW5vcm1hbGl6ZUludmFsaWRGaWxlTmFtZSgpIHsKLQkJWE1MU3RyaW5nRW5jb2RlciBlbmNvZGVyID0gbmV3IFhNTFN0cmluZ0VuY29kZXIoRmlsZVRvb2xzLklOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUyk7Ci0KLQkJU3RyaW5nIHMgPSAiJiN4M2Y7Zm9vJiN4M2Y7IjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIj9mb28/IjsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBlbmNvZGVyLmRlY29kZShzKSk7Ci0KLQkJcyA9ICImI3gzZjtmb28mI3gyNjsxMjMiOwotCQlleHBlY3RlZCA9ICI/Zm9vJjEyMyI7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgZW5jb2Rlci5kZWNvZGUocykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3VuZFRyaXBOb0NoYXJhY3RlclNlcXVlbmNlcygpIHsKLQkJdGhpcy52ZXJpZnlSb3VuZFRyaXAoImZvbyIpOwotCQl0aGlzLnZlcmlmeVJvdW5kVHJpcCgiMTIzZm9vNDU2Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdW5kVHJpcENoYXJhY3RlclNlcXVlbmNlcygpIHsKLQkJdGhpcy52ZXJpZnlSb3VuZFRyaXAoIj9mb28/Iik7Ci0JCXRoaXMudmVyaWZ5Um91bmRUcmlwKCI/Zm9vJjEyMyYmJiYmJj4+Pj4iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Um91bmRUcmlwKFN0cmluZyBzKSB7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCQlTdHJpbmcgYWN0dWFsID0gZW5jb2Rlci5lbmNvZGUocyk7Ci0JCWFzc2VydEVxdWFscyhzLCBlbmNvZGVyLmRlY29kZShhY3R1YWwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYXJhY3RlclNlcXVlbmNlMSgpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImZvbyYiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYXJhY3RlclNlcXVlbmNlMigpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImZvbyYjIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTMoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mI3giKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYXJhY3RlclNlcXVlbmNlNCgpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImZvbyYjeDMiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYXJhY3RlclNlcXVlbmNlNSgpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImZvbyYjeDsiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYXJhY3RlclNlcXVlbmNlNigpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImZvbyZBIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTcoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mI0EiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzID0gZW5jb2Rlci5kZWNvZGUocyk7Ci0JCQlmYWlsKHMpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYXJhY3RlclNlcXVlbmNlOCgpIHsKLQkJU3RyaW5nIHMgPSAiZm9vJiN4WlpaWjsiOwotCQlYTUxTdHJpbmdFbmNvZGVyIGVuY29kZXIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihGaWxlVG9vbHMuSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJcyA9IGVuY29kZXIuZGVjb2RlKHMpOwotCQkJZmFpbChzKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvY29tbWFuZC9Bc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2NvbW1hbmQvQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3ODgyZi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvY29tbWFuZC9Bc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5FeGNlcHRpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuU3RhdGVmdWxDb21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLmNvbW1hbmQuQXN5bmNocm9ub3VzRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLk11bHRpVGhyZWFkZWRUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvclRlc3RzCi0JZXh0ZW5kcyBNdWx0aVRocmVhZGVkVGVzdENhc2UKLXsKLQlwdWJsaWMgQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0Q29tbWFuZCBjb21tYW5kID0gbmV3IFRlc3RDb21tYW5kKCk7Ci0JCUFzeW5jaHJvbm91c0V4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yLlNpbXBsZUNvbmZpZyBjb25maWcgPSBuZXcgQXN5bmNocm9ub3VzRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IuU2ltcGxlQ29uZmlnKCk7Ci0JCWNvbmZpZy5zZXRUaHJlYWRGYWN0b3J5KHRoaXMuYnVpbGRUaHJlYWRGYWN0b3J5KCkpOwotCQljb25maWcuc2V0RXhjZXB0aW9uSGFuZGxlcihFeGNlcHRpb25IYW5kbGVyLlJ1bnRpbWUuaW5zdGFuY2UoKSk7Ci0JCVN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvciA9IG5ldyBBc3luY2hyb25vdXNFeHRlbmRlZENvbW1hbmRFeGVjdXRvcihjb25maWcpOwotCQljb21tYW5kRXhlY3V0b3Iuc3RhcnQoKTsKLQkJY29tbWFuZEV4ZWN1dG9yLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCWNvbW1hbmRFeGVjdXRvci5leGVjdXRlKGNvbW1hbmQpOwotCQljb21tYW5kRXhlY3V0b3IuZXhlY3V0ZShjb21tYW5kKTsKLQkJVGhyZWFkLnNsZWVwKFRXT19USUNLUyk7ICAvLyB3YWl0IGZvciB0aGUgY29tbWFuZCB0byBleGVjdXRlCi0JCWNvbW1hbmRFeGVjdXRvci5zdG9wKCk7Ci0JCWFzc2VydEVxdWFscygzLCBjb21tYW5kLmNvdW50KTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVGVzdENvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRoaXMuY291bnQrKzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9jb21tYW5kL0FzeW5jaHJvbm91c1JlcGVhdGluZ0NvbW1hbmRXcmFwcGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9jb21tYW5kL0FzeW5jaHJvbm91c1JlcGVhdGluZ0NvbW1hbmRXcmFwcGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0Y2U4ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvY29tbWFuZC9Bc3luY2hyb25vdXNSZXBlYXRpbmdDb21tYW5kV3JhcHBlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5FeGNlcHRpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuUmVwZWF0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGluZ0V4Y2VwdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5jb21tYW5kLkFzeW5jaHJvbm91c1JlcGVhdGluZ0NvbW1hbmRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5NdWx0aVRocmVhZGVkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQXN5bmNocm9ub3VzUmVwZWF0aW5nQ29tbWFuZFdyYXBwZXJUZXN0cwotCWV4dGVuZHMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi17Ci0JUHJpbWFyeU1vZGVsMSBwcmltYXJ5TW9kZWwxOwotCVNlY29uZGFyeU1vZGVsMSBzZWNvbmRhcnlNb2RlbDE7Ci0JQ29tbWFuZCBjb21tYW5kMTsKLQlSZXBlYXRpbmdDb21tYW5kIHJlcGVhdGluZ0NvbW1hbmQxOwotCi0JUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWwyOwotCVNlY29uZGFyeU1vZGVsMiBzZWNvbmRhcnlNb2RlbDI7Ci0JQ29tbWFuZCBjb21tYW5kMjsKLQlSZXBlYXRpbmdDb21tYW5kIHJlcGVhdGluZ0NvbW1hbmQyOwotCi0JcHVibGljIEFzeW5jaHJvbm91c1JlcGVhdGluZ0NvbW1hbmRXcmFwcGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxID0gbmV3IFByaW1hcnlNb2RlbDEoKTsKLQkJdGhpcy5zZWNvbmRhcnlNb2RlbDEgPSBuZXcgU2Vjb25kYXJ5TW9kZWwxKHRoaXMucHJpbWFyeU1vZGVsMSk7Ci0JCXRoaXMuY29tbWFuZDEgPSBuZXcgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQxKHRoaXMuc2Vjb25kYXJ5TW9kZWwxKTsKLQkJdGhpcy5yZXBlYXRpbmdDb21tYW5kMSA9IG5ldyBBc3luY2hyb25vdXNSZXBlYXRpbmdDb21tYW5kV3JhcHBlcih0aGlzLmNvbW1hbmQxLCB0aGlzLmJ1aWxkVGhyZWFkRmFjdG9yeSgpLCBudWxsLCBFeGNlcHRpb25IYW5kbGVyLlJ1bnRpbWUuaW5zdGFuY2UoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRTeW5jaHJvbml6ZXIodGhpcy5yZXBlYXRpbmdDb21tYW5kMSk7Ci0KLQkJdGhpcy5wcmltYXJ5TW9kZWwyID0gbmV3IFByaW1hcnlNb2RlbDIoKTsKLQkJdGhpcy5zZWNvbmRhcnlNb2RlbDIgPSBuZXcgU2Vjb25kYXJ5TW9kZWwyKHRoaXMucHJpbWFyeU1vZGVsMik7Ci0JCXRoaXMuY29tbWFuZDIgPSBuZXcgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQyKHRoaXMucHJpbWFyeU1vZGVsMiwgdGhpcy5zZWNvbmRhcnlNb2RlbDIpOwotCQl0aGlzLnJlcGVhdGluZ0NvbW1hbmQyID0gbmV3IEFzeW5jaHJvbm91c1JlcGVhdGluZ0NvbW1hbmRXcmFwcGVyKHRoaXMuY29tbWFuZDIsIHRoaXMuYnVpbGRUaHJlYWRGYWN0b3J5KCksIG51bGwsIEV4Y2VwdGlvbkhhbmRsZXIuUnVudGltZS5pbnN0YW5jZSgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwyLnNldFN5bmNocm9uaXplcih0aGlzLnJlcGVhdGluZ0NvbW1hbmQyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnJlcGVhdGluZ0NvbW1hbmQxLnN0b3AoKTsKLQkJdGhpcy5yZXBlYXRpbmdDb21tYW5kMi5zdG9wKCk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemF0aW9uKCkgewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMucmVwZWF0aW5nQ29tbWFuZDEudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRDb3VudCg3KTsKLQotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aGlzLnJlcGVhdGluZ0NvbW1hbmQxLnN0b3AoKTsKLQkJdGhpcy5zbGVlcChUSUNLKTsKLQotCQlhc3NlcnRFcXVhbHMoMTQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCi0JCS8vIHJlLXN0YXJ0IHNvIHRlYXItZG93biB3b3JrcwotCQl0aGlzLnJlcGVhdGluZ0NvbW1hbmQxLnN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldFN5bmNocm9uaXplcihSZXBlYXRpbmdDb21tYW5kLk51bGwuaW5zdGFuY2UoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRDb3VudCg3KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0U3luY2hyb25pemVyKHRoaXMucmVwZWF0aW5nQ29tbWFuZDEpOwotCQkvLyB0aGUgYXN5bmMgc3luY2hyb25pemVyIGRvZXMgbm90IHN5bmNocm9uaXplIGF0IHN0YXJ0LXVwCi0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0Q291bnQoOCk7Ci0KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhpcy5yZXBlYXRpbmdDb21tYW5kMS5zdG9wKCk7Ci0JCXRoaXMuc2xlZXAoVElDSyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDE2LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQotCQkvLyByZS1zdGFydCBzbyB0ZWFyLWRvd24gd29ya3MKLQkJdGhpcy5yZXBlYXRpbmdDb21tYW5kMS5zdGFydCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLmRpc3Bvc2UoKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldENvdW50KDcpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0KLQkJLy8gcmUtc3RhcnQgc28gdGVhci1kb3duIHdvcmtzCi0JCXRoaXMucmVwZWF0aW5nQ29tbWFuZDEuc3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RG91YmxlU3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnByaW1hcnlNb2RlbDEuc3RhcnRTeW5jaHJvbml6ZXIoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRDb3VudCg3KTsKLQotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aGlzLnJlcGVhdGluZ0NvbW1hbmQxLnN0b3AoKTsKLQkJdGhpcy5zbGVlcChUSUNLKTsKLQotCQlhc3NlcnRFcXVhbHMoMTQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCi0JCS8vIHJlLXN0YXJ0IHNvIHRlYXItZG93biB3b3JrcwotCQl0aGlzLnJlcGVhdGluZ0NvbW1hbmQxLnN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERvdWJsZVN0b3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuZGlzcG9zZSgpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnByaW1hcnlNb2RlbDEuZGlzcG9zZSgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldENvdW50KDcpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0KLQkJLy8gcmUtc3RhcnQgc28gdGVhci1kb3duIHdvcmtzCi0JCXRoaXMucmVwZWF0aW5nQ29tbWFuZDEuc3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVjdXJzaXZlQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMi5nZXREb3VibGVDb3VudCgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwyLnNldENvdW50KDcpOwotCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCWFzc2VydEVxdWFscygxMCwgdGhpcy5wcmltYXJ5TW9kZWwyLmdldENvdW50UGx1czMoKSk7Ci0JCWFzc2VydEVxdWFscygxNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDIuZ2V0RG91YmxlQ291bnQoKSk7Ci0KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJYXNzZXJ0RXF1YWxzKDIwLCB0aGlzLnNlY29uZGFyeU1vZGVsMi5nZXREb3VibGVDb3VudFBsdXMzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQ29tbWFuZCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJUmVwZWF0aW5nQ29tbWFuZCBzID0gbmV3IEFzeW5jaHJvbm91c1JlcGVhdGluZ0NvbW1hbmRXcmFwcGVyKG51bGwsIHRoaXMuYnVpbGRUaHJlYWRGYWN0b3J5KCksIG51bGwsIEV4Y2VwdGlvbkhhbmRsZXIuUnVudGltZS5pbnN0YW5jZSgpKTsKLQkJCWZhaWwoImJvZ3VzOiAiICsgcyk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRocmVhZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVwZWF0aW5nQ29tbWFuZCBzID0gbmV3IEFzeW5jaHJvbm91c1JlcGVhdGluZ0NvbW1hbmRXcmFwcGVyKHRoaXMuY29tbWFuZDEsIHRoaXMuYnVpbGRUaHJlYWRGYWN0b3J5KCksICJzeW5jIiwgRXhjZXB0aW9uSGFuZGxlci5SdW50aW1lLmluc3RhbmNlKCkpOwotCQlzLnN0YXJ0KCk7Ci0JCUNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IgY3RjID0gKENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHMsICJjb25zdW1lclRocmVhZENvb3JkaW5hdG9yIik7Ci0JCVRocmVhZCB0ID0gKFRocmVhZCkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUoY3RjLCAidGhyZWFkIik7Ci0JCWFzc2VydEVxdWFscygic3luYyIsIHQuZ2V0TmFtZSgpKTsKLQkJcy5zdG9wKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVDYWxsZWRCZWZvcmVTdGFydCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVDb21tYW5kIGNvbW1hbmQgPSBuZXcgU2ltcGxlQ29tbWFuZCgpOwotCQlSZXBlYXRpbmdDb21tYW5kIHN5bmNocm9uaXplciA9IG5ldyBBc3luY2hyb25vdXNSZXBlYXRpbmdDb21tYW5kV3JhcHBlcihjb21tYW5kLCB0aGlzLmJ1aWxkVGhyZWFkRmFjdG9yeSgpLCBudWxsLCBFeGNlcHRpb25IYW5kbGVyLlJ1bnRpbWUuaW5zdGFuY2UoKSk7Ci0KLQkJc3luY2hyb25pemVyLmV4ZWN1dGUoKTsKLQkJc3luY2hyb25pemVyLnN0YXJ0KCk7Ci0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXN5bmNocm9uaXplci5zdG9wKCk7Ci0JCWFzc2VydEVxdWFscygxLCBjb21tYW5kLmNvdW50KTsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgU2ltcGxlQ29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgewotCQlpbnQgY291bnQgPSAwOwotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJdGhpcy5jb3VudCsrOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlCb2d1c0NvbW1hbmQgY29tbWFuZCA9IG5ldyBCb2d1c0NvbW1hbmQoKTsKLQkJQ29sbGVjdGluZ0V4Y2VwdGlvbkhhbmRsZXIgZXhIYW5kbGVyID0gbmV3IENvbGxlY3RpbmdFeGNlcHRpb25IYW5kbGVyKCk7Ci0JCVJlcGVhdGluZ0NvbW1hbmQgc3luY2hyb25pemVyID0gbmV3IEFzeW5jaHJvbm91c1JlcGVhdGluZ0NvbW1hbmRXcmFwcGVyKGNvbW1hbmQsIHRoaXMuYnVpbGRUaHJlYWRGYWN0b3J5KCksIG51bGwsIGV4SGFuZGxlcik7Ci0JCXN5bmNocm9uaXplci5zdGFydCgpOwotCi0JCXN5bmNocm9uaXplci5leGVjdXRlKCk7Ci0JCXRoaXMuc2xlZXAoVElDSyk7Ci0KLQkJc3luY2hyb25pemVyLmV4ZWN1dGUoKTsKLQkJdGhpcy5zbGVlcChUSUNLKTsKLQotCQlzeW5jaHJvbml6ZXIuc3RvcCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoZXhIYW5kbGVyLmdldEV4Y2VwdGlvbnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgY29tbWFuZC5jb3VudCk7Ci0JfQotCi0JcHVibGljIGNsYXNzIEJvZ3VzQ29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgewotCQlpbnQgY291bnQgPSAwOwotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJdGhpcy5jb3VudCsrOwotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNYWtlIHN1cmUgdGhlIDxjb2RlPkRFQlVHPC9jb2RlPiBjb25zdGFudCBpcyA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBiZWZvcmUgY2hlY2tpbmcgaW4gdGhlIGNvZGUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERFQlVHKCkgewotCQlUZXN0VG9vbHMuYXNzZXJ0RmFsc2VERUJVRyhBc3luY2hyb25vdXNSZXBlYXRpbmdDb21tYW5kV3JhcHBlci5jbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplIGNvbW1hbmRzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQxCi0JCWltcGxlbWVudHMgQ29tbWFuZAotCXsKLQkJcHJpdmF0ZSBmaW5hbCBTZWNvbmRhcnlNb2RlbDEgc2Vjb25kYXJ5TW9kZWw7Ci0KLQkJcHVibGljIFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMShTZWNvbmRhcnlNb2RlbDEgc2Vjb25kYXJ5TW9kZWwpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNlY29uZGFyeU1vZGVsID0gc2Vjb25kYXJ5TW9kZWw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJdGhpcy5zZWNvbmRhcnlNb2RlbC5zeW5jaHJvbml6ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogdGhlIHByaW1hcnkgbW9kZWwgKHN1YmNsYXNzKSBoYXMgdG8gc3luY2hyb25pemUgd2l0aCBpdHNlbGYgKHN1cGVyY2xhc3MpCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDIKLQkJZXh0ZW5kcyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDEKLQl7Ci0JCXByaXZhdGUgZmluYWwgUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWw7Ci0KLQkJcHVibGljIFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMihQcmltYXJ5TW9kZWwyIHByaW1hcnlNb2RlbCwgU2Vjb25kYXJ5TW9kZWwyIHNlY29uZGFyeU1vZGVsKSB7Ci0JCQlzdXBlcihzZWNvbmRhcnlNb2RlbCk7Ci0JCQl0aGlzLnByaW1hcnlNb2RlbCA9IHByaW1hcnlNb2RlbDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJc3VwZXIuZXhlY3V0ZSgpOwotCQkJdGhpcy5wcmltYXJ5TW9kZWwuc3luY2hyb25pemUoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmltYXJ5IG1vZGVscyAqKioqKioqKioqCi0KLQkvKioKLQkgKiB0aGlzIG9iamVjdCB3aWxsIGNhbGwgdGhlIHN5bmNocm9uaXplciB3aGVuZXZlciBpdHMgY291bnQgY2hhbmdlcywKLQkgKiBhbGxvd2luZyBpbnRlcmVzdGVkIHBhcnRpZXMgdG8gc3luY2hyb25pemUgd2l0aCB0aGUgY2hhbmdlCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQcmltYXJ5TW9kZWwxIHsKLQkJcHJvdGVjdGVkIFJlcGVhdGluZ0NvbW1hbmQgc3luY2hyb25pemVyOwotCQlwcm90ZWN0ZWQgaW50IGNvdW50ID0gMjsKLQotCQlwdWJsaWMgUHJpbWFyeU1vZGVsMSgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNldFN5bmNocm9uaXplcl8oUmVwZWF0aW5nQ29tbWFuZC5OdWxsLmluc3RhbmNlKCkpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb3VudCgpIHsKLQkJCXJldHVybiB0aGlzLmNvdW50OwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldENvdW50KGludCBjb3VudCkgewotCQkJaWYgKGNvdW50ICE9IHRoaXMuY291bnQpIHsKLQkJCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JCQkJdGhpcy5zdGF0ZUNoYW5nZWQoKTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHN0YXRlQ2hhbmdlZCgpIHsKLQkJCXRoaXMuc3luY2hyb25pemVyLmV4ZWN1dGUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFN5bmNocm9uaXplcihSZXBlYXRpbmdDb21tYW5kIHN5bmNocm9uaXplcikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCWlmIChzeW5jaHJvbml6ZXIgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5zeW5jaHJvbml6ZXIuc3RvcCgpOwotCQkJdGhpcy5zZXRTeW5jaHJvbml6ZXJfKHN5bmNocm9uaXplcik7Ci0JCX0KLQkJCQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRTeW5jaHJvbml6ZXJfKFJlcGVhdGluZ0NvbW1hbmQgc3luY2hyb25pemVyKSB7Ci0JCQl0aGlzLnN5bmNocm9uaXplciA9IHN5bmNocm9uaXplcjsKLQkJCXRoaXMuc3luY2hyb25pemVyLnN0YXJ0KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydFN5bmNocm9uaXplcigpIHsKLQkJCXRoaXMuc3luY2hyb25pemVyLnN0YXJ0KCk7ICAvLyB0aGlzIHNob3VsZCBjYXVzZSBhbiBleGNlcHRpb24KLQkJfQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCXRoaXMuc3luY2hyb25pemVyLnN0b3AoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQlzYi5hcHBlbmQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCQlzYi5hcHBlbmQoJygnKTsKLQkJCXRoaXMudG9TdHJpbmcoc2IpOwotCQkJc2IuYXBwZW5kKCcpJyk7Ci0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQoImNvdW50PSIpOwotCQkJc2IuYXBwZW5kKHRoaXMuY291bnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtb2RlbCBzeW5jaHJvbml6ZXMgd2l0aCBpdHNlbGYsIHRyaWdnZXJpbmcgYSByZWN1cnNpdmUgc3luY2hyb25pemF0aW9uCi0JICogd2l0aCB0aGUgY2hhbmdlLiBXaGVuZXZlciB0aGUgW2luaGVyaXRlZF0gJ2NvdW50JyBjaGFuZ2VzLCAnY291bnRQbHVzMycKLQkgKiBpcyB1cGRhdGVkIGFwcHJvcHJpYXRlbHkgYW5kIGFub3RoZXIgc3luY2hyb25pemUgaXMgaW5pdGlhdGVkIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJpbWFyeU1vZGVsMgotCQlleHRlbmRzIFByaW1hcnlNb2RlbDEKLQl7Ci0JCXByaXZhdGUgaW50IGNvdW50UGx1czMgPSAwOwotCi0JCXB1YmxpYyBQcmltYXJ5TW9kZWwyKCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY291bnRQbHVzMyA9IHRoaXMuY291bnQgKyAzOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb3VudFBsdXMzKCkgewotCQkJcmV0dXJuIHRoaXMuY291bnRQbHVzMzsKLQkJfQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRDb3VudFBsdXMzKGludCBjb3VudFBsdXMzKSB7Ci0JCQlpZiAoY291bnRQbHVzMyAhPSB0aGlzLmNvdW50UGx1czMpIHsKLQkJCQl0aGlzLmNvdW50UGx1czMgPSBjb3VudFBsdXMzOwotCQkJCXRoaXMuc3RhdGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzeW5jaHJvbml6ZSB3aXRoIGl0c2VsZiwgc28gdG8gc3BlYWsKLQkJcHVibGljIHZvaWQgc3luY2hyb25pemUoKSB7Ci0JCQl0aGlzLnNldENvdW50UGx1czModGhpcy5jb3VudCArIDMpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJCXNiLmFwcGVuZCgiLCBjb3VudFBsdXMzPSIpOwotCQkJc2IuYXBwZW5kKHRoaXMuY291bnRQbHVzMyk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2Vjb25kYXJ5IG1vZGVscyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGRlcGVuZGVudCBvYmplY3QgdXBkYXRlcyBpdHMgJ2RvdWJsZUNvdW50JyB3aGVuZXZlciB0aGUKLQkgKiBQcmltYXJ5TW9kZWwxJ3MgJ2NvdW50JyBjaGFuZ2VzLCB2aWEgdGhlICdzeW5jaHJvbml6ZXInLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2Vjb25kYXJ5TW9kZWwxIHsKLQkJcHJvdGVjdGVkIGZpbmFsIFByaW1hcnlNb2RlbDEgcHJpbWFyeU1vZGVsOwotCQlwcm90ZWN0ZWQgaW50IGRvdWJsZUNvdW50ID0gMDsKLQotCQlwdWJsaWMgU2Vjb25kYXJ5TW9kZWwxKFByaW1hcnlNb2RlbDEgcHJpbWFyeU1vZGVsKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wcmltYXJ5TW9kZWwgPSBwcmltYXJ5TW9kZWw7Ci0JCQl0aGlzLnN5bmNocm9uaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZSgpIHsKLQkJCXRoaXMuZG91YmxlQ291bnQgPSB0aGlzLnByaW1hcnlNb2RlbC5nZXRDb3VudCgpICogMjsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0RG91YmxlQ291bnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kb3VibGVDb3VudDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQlzYi5hcHBlbmQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCQlzYi5hcHBlbmQoJygnKTsKLQkJCXRoaXMudG9TdHJpbmcoc2IpOwotCQkJc2IuYXBwZW5kKCcpJyk7Ci0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQoImRvdWJsZUNvdW50PSIpOwotCQkJc2IuYXBwZW5kKHRoaXMuZG91YmxlQ291bnQpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTZWNvbmRhcnlNb2RlbDIKLQkJZXh0ZW5kcyBTZWNvbmRhcnlNb2RlbDEKLQl7Ci0JCXByaXZhdGUgaW50IGRvdWJsZUNvdW50UGx1czMgPSAwOwotCi0JCXB1YmxpYyBTZWNvbmRhcnlNb2RlbDIoUHJpbWFyeU1vZGVsMiBleHRlbmRlZFByaW1hcnlNb2RlbCkgewotCQkJc3VwZXIoZXh0ZW5kZWRQcmltYXJ5TW9kZWwpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFByaW1hcnlNb2RlbDIgZ2V0RXh0ZW5kZWRQcmltYXJ5TW9kZWwoKSB7Ci0JCQlyZXR1cm4gKFByaW1hcnlNb2RlbDIpIHRoaXMucHJpbWFyeU1vZGVsOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKCkgewotCQkJc3VwZXIuc3luY2hyb25pemUoKTsKLQkJCWludCB0ZW1wID0gdGhpcy5nZXRFeHRlbmRlZFByaW1hcnlNb2RlbCgpLmdldENvdW50UGx1czMoKSAqIDI7Ci0JCQlpZiAodGhpcy5kb3VibGVDb3VudFBsdXMzICE9IHRlbXApIHsKLQkJCQl0aGlzLmRvdWJsZUNvdW50UGx1czMgPSB0ZW1wOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGludCBnZXREb3VibGVDb3VudFBsdXMzKCkgewotCQkJcmV0dXJuIHRoaXMuZG91YmxlQ291bnRQbHVzMzsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCQlzYi5hcHBlbmQoIiwgZG91YmxlQ291bnRQbHVzMz0iKTsKLQkJCXNiLmFwcGVuZCh0aGlzLmRvdWJsZUNvdW50UGx1czMpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2NvbW1hbmQvQ29tbWFuZEV4ZWN1dG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9jb21tYW5kL0NvbW1hbmRFeGVjdXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiN2Q3NWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2NvbW1hbmQvQ29tbWFuZEV4ZWN1dG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLmNvbW1hbmQuVGhyZWFkTG9jYWxFeHRlbmRlZENvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuTXVsdGlUaHJlYWRlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBDb21tYW5kRXhlY3V0b3JUZXN0cwotCWV4dGVuZHMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi17Ci0KLQlwdWJsaWMgQ29tbWFuZEV4ZWN1dG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRDb21tYW5kRXhlY3V0b3JfdG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvciA9IENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCk7Ci0JCWFzc2VydE5vdE51bGwoY29tbWFuZEV4ZWN1dG9yLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0Q29tbWFuZEV4ZWN1dG9yX3NlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvcjEgPSBDb21tYW5kRXhlY3V0b3IuRGVmYXVsdC5pbnN0YW5jZSgpOwotCQlDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yMiA9IFRlc3RUb29scy5zZXJpYWxpemUoY29tbWFuZEV4ZWN1dG9yMSk7Ci0JCWFzc2VydFNhbWUoY29tbWFuZEV4ZWN1dG9yMSwgY29tbWFuZEV4ZWN1dG9yMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCVRlc3RDb21tYW5kIHRlc3RDb21tYW5kID0gbmV3IFRlc3RDb21tYW5kKCk7Ci0JCWFzc2VydEVxdWFscygwLCB0ZXN0Q29tbWFuZC5jb3VudCk7Ci0JCUNvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IgPSBDb21tYW5kRXhlY3V0b3IuRGVmYXVsdC5pbnN0YW5jZSgpOwotCQljb21tYW5kRXhlY3V0b3IuZXhlY3V0ZSh0ZXN0Q29tbWFuZCk7Ci0JCWFzc2VydEVxdWFscygxLCB0ZXN0Q29tbWFuZC5jb3VudCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFRlc3RDb21tYW5kIGltcGxlbWVudHMgQ29tbWFuZCB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0aGlzLmNvdW50Kys7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3JfdG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvciA9IG5ldyBUaHJlYWRMb2NhbEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yKCk7Ci0JCWFzc2VydE5vdE51bGwoY29tbWFuZEV4ZWN1dG9yLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlUaHJlYWRMb2NhbEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yIHRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yID0gbmV3IFRocmVhZExvY2FsRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IoKTsKLQkJVGVzdFJ1bm5hYmxlIHRlc3RSdW5uYWJsZTEgPSBuZXcgVGVzdFJ1bm5hYmxlKHRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yLCAxKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHRlc3RSdW5uYWJsZTEpOwotCQl0aHJlYWQxLnJ1bigpOwotCi0JCVRlc3RSdW5uYWJsZSB0ZXN0UnVubmFibGUyID0gbmV3IFRlc3RSdW5uYWJsZSh0aHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvciwgMik7Ci0JCVRocmVhZCB0aHJlYWQyID0gdGhpcy5idWlsZFRocmVhZCh0ZXN0UnVubmFibGUyKTsKLQkJdGhyZWFkMi5ydW4oKTsKLQotCQlUZXN0UnVubmFibGUgdGVzdFJ1bm5hYmxlMyA9IG5ldyBUZXN0UnVubmFibGUodGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IsIDMsIG51bGwpOwotCQlUaHJlYWQgdGhyZWFkMyA9IHRoaXMuYnVpbGRUaHJlYWQodGVzdFJ1bm5hYmxlMyk7Ci0JCXRocmVhZDMucnVuKCk7Ci0KLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCQl0aHJlYWQzLmpvaW4oKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgdGVzdFJ1bm5hYmxlMS50ZXN0Q29tbWFuZC5jb3VudCk7Ci0JCWFzc2VydEVxdWFscygxLCB0ZXN0UnVubmFibGUxLnRlc3RDb21tYW5kRXhlY3V0b3IuY291bnQpOwotCi0JCWFzc2VydEVxdWFscygyLCB0ZXN0UnVubmFibGUyLnRlc3RDb21tYW5kLmNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRlc3RSdW5uYWJsZTIudGVzdENvbW1hbmRFeGVjdXRvci5jb3VudCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIHRlc3RSdW5uYWJsZTMudGVzdENvbW1hbmQuY291bnQpOwotCQlhc3NlcnROdWxsKHRlc3RSdW5uYWJsZTMudGVzdENvbW1hbmRFeGVjdXRvcik7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFRlc3RDb21tYW5kRXhlY3V0b3IgaW1wbGVtZW50cyBFeHRlbmRlZENvbW1hbmRFeGVjdXRvciB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQl0aGlzLmNvdW50Kys7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB3YWl0VG9FeGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQkJdGhpcy5leGVjdXRlKGNvbW1hbmQpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIHdhaXRUb0V4ZWN1dGUoQ29tbWFuZCBjb21tYW5kLCBsb25nIHRpbWVvdXQpIHsKLQkJCXRoaXMuZXhlY3V0ZShjb21tYW5kKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFRlc3RSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgVGhyZWFkTG9jYWxFeHRlbmRlZENvbW1hbmRFeGVjdXRvciB0aHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcjsKLQkJZmluYWwgaW50IGV4ZWN1dGlvbkNvdW50OwotCQlmaW5hbCBUZXN0Q29tbWFuZCB0ZXN0Q29tbWFuZCA9IG5ldyBUZXN0Q29tbWFuZCgpOwotCQlmaW5hbCBUZXN0Q29tbWFuZEV4ZWN1dG9yIHRlc3RDb21tYW5kRXhlY3V0b3I7Ci0JCVRlc3RSdW5uYWJsZShUaHJlYWRMb2NhbEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yIHRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yLCBpbnQgZXhlY3V0aW9uQ291bnQpIHsKLQkJCXRoaXModGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IsIGV4ZWN1dGlvbkNvdW50LCBuZXcgVGVzdENvbW1hbmRFeGVjdXRvcigpKTsKLQkJfQotCQlUZXN0UnVubmFibGUoVGhyZWFkTG9jYWxFeHRlbmRlZENvbW1hbmRFeGVjdXRvciB0aHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvciwgaW50IGV4ZWN1dGlvbkNvdW50LCBUZXN0Q29tbWFuZEV4ZWN1dG9yIHRlc3RDb21tYW5kRXhlY3V0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yID0gdGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3I7Ci0JCQl0aGlzLmV4ZWN1dGlvbkNvdW50ID0gZXhlY3V0aW9uQ291bnQ7Ci0JCQl0aGlzLnRlc3RDb21tYW5kRXhlY3V0b3IgPSB0ZXN0Q29tbWFuZEV4ZWN1dG9yOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRoaXMudGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3Iuc2V0KHRoaXMudGVzdENvbW1hbmRFeGVjdXRvcik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuZXhlY3V0aW9uQ291bnQ7IGkrKykgewotCQkJCXRoaXMudGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IuZXhlY3V0ZSh0aGlzLnRlc3RDb21tYW5kKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9jb21tYW5kL0NvbW1hbmRSdW5uYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvY29tbWFuZC9Db21tYW5kUnVubmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWRjZTRlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9jb21tYW5kL0NvbW1hbmRSdW5uYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuY29tbWFuZC5Db21tYW5kUnVubmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbW1hbmRSdW5uYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCWJvb2xlYW4gY29tbWFuZEV4ZWN1dGVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgQ29tbWFuZFJ1bm5hYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxDb21tYW5kKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBDb21tYW5kUnVubmFibGUobnVsbCk7Ci0JCQlmYWlsKCJib2d1czogIiArIHJ1bm5hYmxlKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UnVuKCkgewotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBDb21tYW5kUnVubmFibGUodGhpcy5idWlsZENvbW1hbmQoKSk7Ci0JCXJ1bm5hYmxlLnJ1bigpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29tbWFuZEV4ZWN1dGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IENvbW1hbmRSdW5uYWJsZSh0aGlzLmJ1aWxkQ29tbWFuZCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChydW5uYWJsZS50b1N0cmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJCUNvbW1hbmRSdW5uYWJsZVRlc3RzLnRoaXMuY29tbWFuZEV4ZWN1dGVkID0gdHJ1ZTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvY29tbWFuZC9Db21tYW5kVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9jb21tYW5kL0NvbW1hbmRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjZhMDEwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9jb21tYW5kL0NvbW1hbmRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLkNvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuY29tbWFuZC5Db21tYW5kUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLmNvbW1hbmQuUnVubmFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5jb21tYW5kLlRocmVhZExvY2FsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuTXVsdGlUaHJlYWRlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBDb21tYW5kVGVzdHMKLQlleHRlbmRzIE11bHRpVGhyZWFkZWRUZXN0Q2FzZQotewotCXB1YmxpYyBDb21tYW5kVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxDb21tYW5kKCkgewotCQlDb21tYW5kIGNvbW1hbmQgPSBDb21tYW5kLk51bGwuaW5zdGFuY2UoKTsKLQkJY29tbWFuZC5leGVjdXRlKCk7ICAvLyBqdXN0IG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGJsb3cgdXA/Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxDb21tYW5kX3RvU3RyaW5nKCkgewotCQlDb21tYW5kIGNvbW1hbmQgPSBDb21tYW5kLk51bGwuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChjb21tYW5kLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQ29tbWFuZF9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUNvbW1hbmQgY29tbWFuZDEgPSBDb21tYW5kLk51bGwuaW5zdGFuY2UoKTsKLQkJQ29tbWFuZCBjb21tYW5kMiA9IFRlc3RUb29scy5zZXJpYWxpemUoY29tbWFuZDEpOwotCQlhc3NlcnRTYW1lKGNvbW1hbmQxLCBjb21tYW5kMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkQ29tbWFuZCgpIHsKLQkJQ29tbWFuZCBjb21tYW5kID0gQ29tbWFuZC5EaXNhYmxlZC5pbnN0YW5jZSgpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRDb21tYW5kX3RvU3RyaW5nKCkgewotCQlDb21tYW5kIGNvbW1hbmQgPSBDb21tYW5kLkRpc2FibGVkLmluc3RhbmNlKCk7Ci0JCWFzc2VydE5vdE51bGwoY29tbWFuZC50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRDb21tYW5kX3NlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQ29tbWFuZCBjb21tYW5kMSA9IENvbW1hbmQuRGlzYWJsZWQuaW5zdGFuY2UoKTsKLQkJQ29tbWFuZCBjb21tYW5kMiA9IFRlc3RUb29scy5zZXJpYWxpemUoY29tbWFuZDEpOwotCQlhc3NlcnRTYW1lKGNvbW1hbmQxLCBjb21tYW5kMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJ1bm5hYmxlQ29tbWFuZCgpIHsKLQkJU2ltcGxlVGVzdFJ1bm5hYmxlIHRlc3RSdW5uYWJsZSA9IG5ldyBTaW1wbGVUZXN0UnVubmFibGUoKTsKLQkJYXNzZXJ0RmFsc2UodGVzdFJ1bm5hYmxlLnJhbik7Ci0JCUNvbW1hbmQgY29tbWFuZCA9IG5ldyBSdW5uYWJsZUNvbW1hbmQodGVzdFJ1bm5hYmxlKTsKLQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCWFzc2VydFRydWUodGVzdFJ1bm5hYmxlLnJhbik7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFNpbXBsZVRlc3RSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJYm9vbGVhbiByYW4gPSBmYWxzZTsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGhpcy5yYW4gPSB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbW1hbmRSdW5uYWJsZSgpIHsKLQkJVGVzdENvbW1hbmQgdGVzdENvbW1hbmQgPSBuZXcgVGVzdENvbW1hbmQoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRlc3RDb21tYW5kLmNvdW50KTsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgQ29tbWFuZFJ1bm5hYmxlKHRlc3RDb21tYW5kKTsKLQkJcnVubmFibGUucnVuKCk7Ci0JCWFzc2VydEVxdWFscygxLCB0ZXN0Q29tbWFuZC5jb3VudCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFRlc3RDb21tYW5kIGltcGxlbWVudHMgQ29tbWFuZCB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0aGlzLmNvdW50Kys7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGhyZWFkTG9jYWxDb21tYW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRocmVhZExvY2FsQ29tbWFuZCB0aHJlYWRMb2NhbENvbW1hbmQgPSBuZXcgVGhyZWFkTG9jYWxDb21tYW5kKCk7Ci0JCVRlc3RSdW5uYWJsZSB0ZXN0UnVubmFibGUxID0gbmV3IFRlc3RSdW5uYWJsZSh0aHJlYWRMb2NhbENvbW1hbmQsIDEpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQodGVzdFJ1bm5hYmxlMSk7Ci0JCXRocmVhZDEucnVuKCk7Ci0KLQkJVGVzdFJ1bm5hYmxlIHRlc3RSdW5uYWJsZTIgPSBuZXcgVGVzdFJ1bm5hYmxlKHRocmVhZExvY2FsQ29tbWFuZCwgMik7Ci0JCVRocmVhZCB0aHJlYWQyID0gdGhpcy5idWlsZFRocmVhZCh0ZXN0UnVubmFibGUyKTsKLQkJdGhyZWFkMi5ydW4oKTsKLQotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIHRlc3RSdW5uYWJsZTEudGVzdENvbW1hbmQuY291bnQpOwotCi0JCWFzc2VydEVxdWFscygyLCB0ZXN0UnVubmFibGUyLnRlc3RDb21tYW5kLmNvdW50KTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVGVzdENvbW1hbmRFeGVjdXRvciBpbXBsZW1lbnRzIENvbW1hbmRFeGVjdXRvciB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQl0aGlzLmNvdW50Kys7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBUZXN0UnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCWZpbmFsIFRocmVhZExvY2FsQ29tbWFuZCB0aHJlYWRMb2NhbENvbW1hbmQ7Ci0JCWZpbmFsIGludCBleGVjdXRpb25Db3VudDsKLQkJZmluYWwgVGVzdENvbW1hbmQgdGVzdENvbW1hbmQgPSBuZXcgVGVzdENvbW1hbmQoKTsKLQkJVGVzdFJ1bm5hYmxlKFRocmVhZExvY2FsQ29tbWFuZCB0aHJlYWRMb2NhbENvbW1hbmQsIGludCBleGVjdXRpb25Db3VudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudGhyZWFkTG9jYWxDb21tYW5kID0gdGhyZWFkTG9jYWxDb21tYW5kOwotCQkJdGhpcy5leGVjdXRpb25Db3VudCA9IGV4ZWN1dGlvbkNvdW50OwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRoaXMudGhyZWFkTG9jYWxDb21tYW5kLnNldCh0aGlzLnRlc3RDb21tYW5kKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5leGVjdXRpb25Db3VudDsgaSsrKSB7Ci0JCQkJdGhpcy50aHJlYWRMb2NhbENvbW1hbmQuZXhlY3V0ZSgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2NvbW1hbmQvQ29tcG9zaXRlQ29tbWFuZFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvY29tbWFuZC9Db21wb3NpdGVDb21tYW5kVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlhYTFmOC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvY29tbWFuZC9Db21wb3NpdGVDb21tYW5kVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5jb21tYW5kLkNvbW1hbmRSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuY29tbWFuZC5Db21wb3NpdGVDb21tYW5kOwotCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlQ29tbWFuZFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCWJvb2xlYW4gY29tbWFuZDFFeGVjdXRlZCA9IGZhbHNlOwotCWJvb2xlYW4gY29tbWFuZDJFeGVjdXRlZCA9IGZhbHNlOwotCi0JcHVibGljIENvbXBvc2l0ZUNvbW1hbmRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UnVuKCkgewotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBDb21tYW5kUnVubmFibGUodGhpcy5idWlsZENvbXBvc2l0ZUNvbW1hbmQoKSk7Ci0JCXJ1bm5hYmxlLnJ1bigpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29tbWFuZDFFeGVjdXRlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb21tYW5kMkV4ZWN1dGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IENvbW1hbmRSdW5uYWJsZSh0aGlzLmJ1aWxkQ29tcG9zaXRlQ29tbWFuZCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChydW5uYWJsZS50b1N0cmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRDb21wb3NpdGVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUNvbW1hbmQoCi0JCQkJCXRoaXMuYnVpbGRDb21tYW5kMSgpLAotCQkJCQl0aGlzLmJ1aWxkQ29tbWFuZDIoKQotCQkJCSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkQ29tbWFuZDEoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQkJQ29tcG9zaXRlQ29tbWFuZFRlc3RzLnRoaXMuY29tbWFuZDFFeGVjdXRlZCA9IHRydWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkQ29tbWFuZDIoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQkJQ29tcG9zaXRlQ29tbWFuZFRlc3RzLnRoaXMuY29tbWFuZDJFeGVjdXRlZCA9IHRydWU7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2NvbW1hbmQvSnB0VXRpbGl0eUNvbW1hbmRUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2NvbW1hbmQvSnB0VXRpbGl0eUNvbW1hbmRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDQwYzk3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9jb21tYW5kL0pwdFV0aWxpdHlDb21tYW5kVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlDb21tYW5kVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFV0aWxpdHlDb21tYW5kVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFzeW5jaHJvbm91c1JlcGVhdGluZ0NvbW1hbmRXcmFwcGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tbWFuZEV4ZWN1dG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tbWFuZFJ1bm5hYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tbWFuZFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbXBvc2l0ZUNvbW1hbmRUZXN0cy5jbGFzcyk7Ci0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0VXRpbGl0eUNvbW1hbmRUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2VudW1lcmF0aW9ucy9FbXB0eUVudW1lcmF0aW9uVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9lbnVtZXJhdGlvbnMvRW1wdHlFbnVtZXJhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZmM5YzguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2VudW1lcmF0aW9ucy9FbXB0eUVudW1lcmF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLmVudW1lcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuZW51bWVyYXRpb25zLkVtcHR5RW51bWVyYXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVtcHR5RW51bWVyYXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFbXB0eUVudW1lcmF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc01vcmVFbGVtZW50cygpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEVudW1lcmF0aW9uPE9iamVjdD4gc3RyZWFtID0gRW1wdHlFbnVtZXJhdGlvbi5pbnN0YW5jZSgpOyBzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRFbGVtZW50KCkgewotCQlmb3IgKEVudW1lcmF0aW9uPE9iamVjdD4gc3RyZWFtID0gRW1wdHlFbnVtZXJhdGlvbi5pbnN0YW5jZSgpOyBzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgc3RyZWFtLm5leHRFbGVtZW50KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJRW51bWVyYXRpb248T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUVudW1lcmF0aW9uLmluc3RhbmNlKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJZWxlbWVudCA9IHN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvZW51bWVyYXRpb25zL0l0ZXJhdG9yRW51bWVyYXRpb25UZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2VudW1lcmF0aW9ucy9JdGVyYXRvckVudW1lcmF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q2Y2JhYS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvZW51bWVyYXRpb25zL0l0ZXJhdG9yRW51bWVyYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLmVudW1lcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuZW51bWVyYXRpb25zLkl0ZXJhdG9yRW51bWVyYXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEl0ZXJhdG9yRW51bWVyYXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBJdGVyYXRvckVudW1lcmF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc01vcmVFbGVtZW50cygpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEVudW1lcmF0aW9uPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEVudW1lcmF0aW9uKCk7IHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCXN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVmVjdG9yKCkuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTW9yZUVsZW1lbnRzVXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoRW51bWVyYXRpb248T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkRW51bWVyYXRpb25VcGNhc3QoKTsgc3RyZWFtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRWZWN0b3IoKS5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0RWxlbWVudCgpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlmb3IgKEVudW1lcmF0aW9uPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEVudW1lcmF0aW9uKCk7IHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIGl0ZXJhdG9yLm5leHQoKSwgc3RyZWFtLm5leHRFbGVtZW50KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJRW51bWVyYXRpb248U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkRW51bWVyYXRpb24oKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgRW51bWVyYXRpb248U3RyaW5nPiBidWlsZEVudW1lcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEVudW1lcmF0aW9uKHRoaXMuYnVpbGRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1lcmF0aW9uPE9iamVjdD4gYnVpbGRFbnVtZXJhdGlvblVwY2FzdCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRFbnVtZXJhdGlvblVwY2FzdCh0aGlzLmJ1aWxkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtZXJhdGlvbjxTdHJpbmc+IGJ1aWxkRW51bWVyYXRpb24oSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IEl0ZXJhdG9yRW51bWVyYXRpb248U3RyaW5nPihpdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtZXJhdGlvbjxPYmplY3Q+IGJ1aWxkRW51bWVyYXRpb25VcGNhc3QoSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IEl0ZXJhdG9yRW51bWVyYXRpb248T2JqZWN0PihpdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVmVjdG9yKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGJ1aWxkVmVjdG9yKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCXYuYWRkRWxlbWVudCgib25lIik7Ci0JCXYuYWRkRWxlbWVudCgidHdvIik7Ci0JCXYuYWRkRWxlbWVudCgidGhyZWUiKTsKLQkJdi5hZGRFbGVtZW50KCJmb3VyIik7Ci0JCXYuYWRkRWxlbWVudCgiZml2ZSIpOwotCQl2LmFkZEVsZW1lbnQoInNpeCIpOwotCQl2LmFkZEVsZW1lbnQoInNldmVuIik7Ci0JCXYuYWRkRWxlbWVudCgiZWlnaHQiKTsKLQkJcmV0dXJuIHY7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvZW51bWVyYXRpb25zL0pwdFV0aWxpdHlFbnVtZXJhdGlvbnNUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2VudW1lcmF0aW9ucy9KcHRVdGlsaXR5RW51bWVyYXRpb25zVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVkZmIwZi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvZW51bWVyYXRpb25zL0pwdFV0aWxpdHlFbnVtZXJhdGlvbnNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuZW51bWVyYXRpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5RW51bWVyYXRpb25zVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFV0aWxpdHlFbnVtZXJhdGlvbnNUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW1wdHlFbnVtZXJhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEl0ZXJhdG9yRW51bWVyYXRpb25UZXN0cy5jbGFzcyk7Ci0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0VXRpbGl0eUVudW1lcmF0aW9uc1Rlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQXJyYXlJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0FycmF5SXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzZlMmRhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQXJyYXlJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEFycmF5SXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBBcnJheUl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlpbnQgaSA9IDE7Ci0JCWZvciAoU3RyaW5nIHN0cmluZyA6IHRoaXMuYnVpbGRJdGVyYWJsZSgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaSsrLCBJbnRlZ2VyLnBhcnNlSW50KHN0cmluZykpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1Ykl0ZXJhdG9yKCkgewotCQlpbnQgaSA9IDM7Ci0JCWZvciAoU3RyaW5nIHN0cmluZyA6IHRoaXMuYnVpbGRJdGVyYWJsZSgyKSkgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgSW50ZWdlci5wYXJzZUludChzdHJpbmcpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSB7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigtMSwgMSk7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbig4LCAxKTsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKDAsIC0xKTsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKDAsIDkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZEl0ZXJhYmxlKHN0YXJ0LCBsZW5ndGgpOwotCQkJZmFpbCgiYm9ndXMgaXRlcmFibGU6ICIgKyBpdGVyYWJsZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEl0ZXJhYmxlKDApOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKGludCBzdGFydCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEl0ZXJhYmxlKHRoaXMuYnVpbGRBcnJheSgpLCBzdGFydCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoU3RyaW5nW10gYXJyYXksIGludCBzdGFydCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihhcnJheSwgc3RhcnQpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEl0ZXJhYmxlKHRoaXMuYnVpbGRBcnJheSgpLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZShTdHJpbmdbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KGFycmF5LCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGJ1aWxkQXJyYXkoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiB9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9BcnJheUxpc3RJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0FycmF5TGlzdEl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdjZDQwZi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0FycmF5TGlzdEl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBBcnJheUxpc3RJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEFycmF5TGlzdEl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlpbnQgaSA9IDE7Ci0JCUxpc3RJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZEl0ZXJhYmxlKCk7Ci0JCWZvciAoU3RyaW5nIHN0cmluZyA6IGl0ZXJhYmxlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaSsrLCBJbnRlZ2VyLnBhcnNlSW50KHN0cmluZykpOwotCQl9Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGl0ZXJhYmxlLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKC0taSwgSW50ZWdlci5wYXJzZUludChzdHJlYW0ucHJldmlvdXMoKSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1Ykl0ZXJhdG9yKCkgewotCQlpbnQgaSA9IDM7Ci0JCWZvciAoU3RyaW5nIHN0cmluZyA6IHRoaXMuYnVpbGRJdGVyYWJsZSgyKSkgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgSW50ZWdlci5wYXJzZUludChzdHJpbmcpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSB7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigtMSwgMSk7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbig4LCAxKTsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKDAsIC0xKTsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKDAsIDkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZEl0ZXJhYmxlKHN0YXJ0LCBsZW5ndGgpOwotCQkJZmFpbCgiYm9ndXMgaXRlcmFibGU6ICIgKyBpdGVyYWJsZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJdGVyYWJsZSgwKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoaW50IHN0YXJ0KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSXRlcmFibGUodGhpcy5idWlsZEFycmF5KCksIHN0YXJ0KTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoU3RyaW5nW10gYXJyYXksIGludCBzdGFydCkgewotCQlyZXR1cm4gKHN0YXJ0ID09IDApID8KLQkJCQluZXcgQXJyYXlMaXN0SXRlcmFibGU8U3RyaW5nPihhcnJheSkgOgotCQkJCW5ldyBBcnJheUxpc3RJdGVyYWJsZTxTdHJpbmc+KGFycmF5LCBzdGFydCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEl0ZXJhYmxlKHRoaXMuYnVpbGRBcnJheSgpLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoU3RyaW5nW10gYXJyYXksIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhYmxlPFN0cmluZz4oYXJyYXksIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gYnVpbGRBcnJheSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiIH07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0NoYWluSXRlcmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9DaGFpbkl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU4NDIzYi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0NoYWluSXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5DaGFpbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2hhaW5JdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2hhaW5JdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgZmluYWwgc3RhdGljIENsYXNzPD8+W10gVkVDVE9SX0hJRVJBUkNIWSA9IHsgVmVjdG9yLmNsYXNzLCBBYnN0cmFjdExpc3QuY2xhc3MsIEFic3RyYWN0Q29sbGVjdGlvbi5jbGFzcywgT2JqZWN0LmNsYXNzIH07Ci0KLQlwdWJsaWMgQ2hhaW5JdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRMaW5rKCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoQ2xhc3M8Pz4gY2xhenogOiB0aGlzLmJ1aWxkSXRlcmFibGUoKSkgewotCQkJYXNzZXJ0RXF1YWxzKFZFQ1RPUl9ISUVSQVJDSFlbaSsrXSwgY2xhenopOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpbmtlcigpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKENsYXNzPD8+IGNsYXp6IDogbmV3IENoYWluSXRlcmFibGU8Q2xhc3M8Pz4+KFZlY3Rvci5jbGFzcywgdGhpcy5idWlsZExpbmtlcigpKSkgewotCQkJYXNzZXJ0RXF1YWxzKFZFQ1RPUl9ISUVSQVJDSFlbaSsrXSwgY2xhenopOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbigpIHsKLQkJSXRlcmFibGU8Q2xhc3M8Pz4+IGl0ZXJhYmxlID0gbmV3IENoYWluSXRlcmFibGU8Q2xhc3M8Pz4+KFZlY3Rvci5jbGFzcyk7Ci0JCUl0ZXJhdG9yPENsYXNzPD8+PiBpdGVyYXRvciA9IGl0ZXJhYmxlLml0ZXJhdG9yKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUNsYXNzPD8+IGNsYXp6ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbCgiYm9ndXMgY2xhc3M6ICIgKyBjbGF6eik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5idWlsZEl0ZXJhYmxlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxDbGFzczw/Pj4gYnVpbGRJdGVyYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDaGFpbkl0ZXJhYmxlKFZlY3Rvci5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxDbGFzczw/Pj4gYnVpbGRDaGFpbkl0ZXJhYmxlKENsYXNzPD8+IHN0YXJ0TGluaykgewotCQkvLyBjaGFpbiB1cCB0aGUgY2xhc3MncyBoaWVyYXJjaHkKLQkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhYmxlPENsYXNzPD8+PihzdGFydExpbmspIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENsYXNzPD8+IG5leHRMaW5rKENsYXNzPD8+IGN1cnJlbnRMaW5rKSB7Ci0JCQkJcmV0dXJuIGN1cnJlbnRMaW5rLmdldFN1cGVyY2xhc3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYWluSXRlcmF0b3IuTGlua2VyPENsYXNzPD8+PiBidWlsZExpbmtlcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhdG9yLkxpbmtlcjxDbGFzczw/Pj4oKSB7Ci0JCQlwdWJsaWMgQ2xhc3M8Pz4gbmV4dExpbmsoQ2xhc3M8Pz4gY3VycmVudExpbmspIHsKLQkJCQlyZXR1cm4gY3VycmVudExpbmsuZ2V0U3VwZXJjbGFzcygpOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9DbG9uZUl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQ2xvbmVJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjkyZWMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9DbG9uZUl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIENsb25lSXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlOwotCi0JcHVibGljIENsb25lSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKCIwIik7Ci0JCWMuYWRkKCIxIik7Ci0JCWMuYWRkKCIyIik7Ci0JCWMuYWRkKCIzIik7Ci0JCWFzc2VydEVxdWFscyg0LCBjLnNpemUoKSk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGUoYyk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IHRoaXMuaXRlcmFibGUpIHsKLQkJCWFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZihpKyspLCBzKTsKLQkJCWMucmVtb3ZlKCIzIik7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDQsIGkpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWZpbmFsIExpc3Q8U3RyaW5nPiBjb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJdGhpcy5pdGVyYWJsZSA9IHRoaXMuYnVpbGRSZW1vdmluZ0l0ZXJhYmxlKGNvbGxlY3Rpb24pOwotCi0JCU9iamVjdCByZW1vdmVkID0gInRocmVlIjsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgcmVtb3ZlZCkpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoaXRlcmF0b3IubmV4dCgpLmVxdWFscyhyZW1vdmVkKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEZhbHNlKGNvbGxlY3Rpb24uY29udGFpbnMocmVtb3ZlZCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVyKCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGVXaXRoUmVtb3Zlcihjb2xsZWN0aW9uKTsKLQotCQlPYmplY3QgcmVtb3ZlZCA9ICJ0aHJlZSI7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsIHJlbW92ZWQpKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkgewotCQkJaWYgKGl0ZXJhdG9yLm5leHQoKS5lcXVhbHMocmVtb3ZlZCkpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlhc3NlcnRGYWxzZShjb2xsZWN0aW9uLmNvbnRhaW5zKHJlbW92ZWQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ1JlbW92ZXIoKSB7Ci0JCWZpbmFsIExpc3Q8U3RyaW5nPiBjb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJdGhpcy5pdGVyYWJsZSA9IHRoaXMuYnVpbGRJdGVyYWJsZShjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLml0ZXJhYmxlLnRvU3RyaW5nKCkpOwotCi0JCU9iamVjdCByZW1vdmVkID0gInRocmVlIjsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgcmVtb3ZlZCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKHJlbW92ZWQpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJCWZhaWwoKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGUoY29sbGVjdGlvbik7Ci0JCWFzc2VydE5vdE51bGwoaXRlcmFibGUudG9TdHJpbmcoKSk7Ci0JfQotCi0JYWJzdHJhY3QgSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKExpc3Q8U3RyaW5nPiBjKTsKLQotCWFic3RyYWN0IEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRSZW1vdmluZ0l0ZXJhYmxlKExpc3Q8U3RyaW5nPiBjKTsKLQotCWFic3RyYWN0IEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZVdpdGhSZW1vdmVyKExpc3Q8U3RyaW5nPiBjKTsKLQotCUNsb25lSXRlcmF0b3IuUmVtb3ZlcjxTdHJpbmc+IGJ1aWxkUmVtb3ZlcihmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3IuUmVtb3ZlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBjdXJyZW50KSB7Ci0JCQkJYy5yZW1vdmUoY3VycmVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcjxTdHJpbmc+IGJ1aWxkTXV0YXRvcihmaW5hbCBMaXN0PFN0cmluZz4gbGlzdCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIFN0cmluZyBzdHJpbmcpIHsKLQkJCQlsaXN0LmFkZChpbmRleCwgc3RyaW5nKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChpbnQgaW5kZXgsIFN0cmluZyBzdHJpbmcpIHsKLQkJCQlsaXN0LnNldChpbmRleCwgc3RyaW5nKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCQlsaXN0LnJlbW92ZShpbmRleCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JTGlzdDxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJTGlzdDxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQljLmFkZCgiZm91ciIpOwotCQljLmFkZCgiZml2ZSIpOwotCQljLmFkZCgic2l4Iik7Ci0JCWMuYWRkKCJzZXZlbiIpOwotCQljLmFkZCgiZWlnaHQiKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0NvbXBvc2l0ZUl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlSXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDU1MTZmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlSXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIwIik7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiNCIpOwotCQljMi5hZGQoIjUiKTsKLQkJYzIuYWRkKCI2Iik7Ci0JCWMyLmFkZCgiNyIpOwotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KGMxLCBjMik7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IGNvbXBvc2l0ZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4dHJhRWxlbWVudDEoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjAiKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KGMxLCAiNCIpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBjb21wb3NpdGUpIHsKLQkJCWFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZihpKyspLCBzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeHRyYUVsZW1lbnQyKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KCIwIiwgYzEpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBjb21wb3NpdGUpIHsKLQkJCWFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZihpKyspLCBzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uT2ZJdGVyYWJsZXMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjAiKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzIuYWRkKCI0Iik7Ci0JCWMyLmFkZCgiNSIpOwotCQljMi5hZGQoIjYiKTsKLQkJYzIuYWRkKCI3Iik7Ci0KLQkJQ29sbGVjdGlvbjxJdGVyYWJsZTxTdHJpbmc+PiBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxJdGVyYWJsZTxTdHJpbmc+PigpOwotCQljb2xsZWN0aW9uLmFkZChjMSk7Ci0JCWNvbGxlY3Rpb24uYWRkKGMyKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPihjb2xsZWN0aW9uKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjAiKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzIuYWRkKCI0Iik7Ci0JCWMyLmFkZCgiNSIpOwotCQljMi5hZGQoIjYiKTsKLQkJYzIuYWRkKCI3Iik7Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUl0ZXJhYmxlPFN0cmluZz4gY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oYzEsIGMyKTsKLQkJYXNzZXJ0Tm90TnVsbChjb21wb3NpdGUudG9TdHJpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0NvbXBvc2l0ZUxpc3RJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0NvbXBvc2l0ZUxpc3RJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZjA2Y2YuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9Db21wb3NpdGVMaXN0SXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RMaXN0SXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbXBvc2l0ZUxpc3RJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGMxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMxLmFkZCgiMCIpOwotCQljMS5hZGQoIjEiKTsKLQkJYzEuYWRkKCIyIik7Ci0JCWMxLmFkZCgiMyIpOwotCi0JCUxpc3Q8U3RyaW5nPiBjMiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMi5hZGQoIjQiKTsKLQkJYzIuYWRkKCI1Iik7Ci0JCWMyLmFkZCgiNiIpOwotCQljMi5hZGQoIjciKTsKLQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlPFN0cmluZz4oYzEsIGMyKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXh0cmFFbGVtZW50MSgpIHsKLQkJTGlzdDxTdHJpbmc+IGMxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMxLmFkZCgiMCIpOwotCQljMS5hZGQoIjEiKTsKLQkJYzEuYWRkKCIyIik7Ci0JCWMxLmFkZCgiMyIpOwotCi0JCUl0ZXJhYmxlPFN0cmluZz4gY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYWJsZTxTdHJpbmc+KGMxLCAiNCIpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBjb21wb3NpdGUpIHsKLQkJCWFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZihpKyspLCBzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeHRyYUVsZW1lbnQyKCkgewotCQlMaXN0PFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVMaXN0SXRlcmFibGU8U3RyaW5nPigiMCIsIGMxKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbk9mSXRlcmFibGVzKCkgewotCQlMaXN0PFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIwIik7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0KLQkJTGlzdDxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiNCIpOwotCQljMi5hZGQoIjUiKTsKLQkJYzIuYWRkKCI2Iik7Ci0JCWMyLmFkZCgiNyIpOwotCi0JCUxpc3Q8TGlzdEl0ZXJhYmxlPFN0cmluZz4+IGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PExpc3RJdGVyYWJsZTxTdHJpbmc+PigpOwotCQljb2xsZWN0aW9uLmFkZChuZXcgTGlzdExpc3RJdGVyYWJsZTxTdHJpbmc+KGMxKSk7Ci0JCWNvbGxlY3Rpb24uYWRkKG5ldyBMaXN0TGlzdEl0ZXJhYmxlPFN0cmluZz4oYzIpKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlPFN0cmluZz4oY29sbGVjdGlvbik7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IGNvbXBvc2l0ZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlMaXN0PFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIwIik7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0KLQkJTGlzdDxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiNCIpOwotCQljMi5hZGQoIjUiKTsKLQkJYzIuYWRkKCI2Iik7Ci0JCWMyLmFkZCgiNyIpOwotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVMaXN0SXRlcmFibGU8U3RyaW5nPihjMSwgYzIpOwotCQlhc3NlcnROb3ROdWxsKGNvbXBvc2l0ZS50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0VtcHR5SXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWZlMjMwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRW1wdHlJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVtcHR5SXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWZvciAoU3RyaW5nIHMgOiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSkgewotCQkJZmFpbCgiYm9ndXMgZWxlbWVudDogIiArIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQlhc3NlcnRTYW1lKGl0ZXJhYmxlLCBUZXN0VG9vbHMuc2VyaWFsaXplKGl0ZXJhYmxlKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0VtcHR5TGlzdEl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlMaXN0SXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjE1NTVjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlMaXN0SXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFbXB0eUxpc3RJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVtcHR5TGlzdEl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlmb3IgKFN0cmluZyBzIDogRW1wdHlMaXN0SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpKSB7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwoRW1wdHlMaXN0SXRlcmFibGUuaW5zdGFuY2UoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gRW1wdHlMaXN0SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0U2FtZShpdGVyYWJsZSwgVGVzdFRvb2xzLnNlcmlhbGl6ZShpdGVyYWJsZSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9GaWx0ZXJpbmdJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0ZpbHRlcmluZ0l0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmExYjU2MS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0ZpbHRlcmluZ0l0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAicHJlZml4IjsKLQotCXB1YmxpYyBGaWx0ZXJpbmdJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2NlcHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IHRoaXMuYnVpbGRJdGVyYWJsZSgpKSB7Ci0JCQlhc3NlcnRUcnVlKHMuY29udGFpbnMoUFJFRklYKSk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDYsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWx0ZXIoKSB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IHRoaXMuYnVpbGRGaWx0ZXIoKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4odGhpcy5idWlsZE5lc3RlZEl0ZXJhYmxlKCksIGZpbHRlcikpIHsKLQkJCWFzc2VydFRydWUocy5jb250YWlucyhQUkVGSVgpKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRJdGVyYWJsZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nRmlsdGVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBuZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPih0aGlzLmJ1aWxkTmVzdGVkSXRlcmFibGUoKSk7Ci0JCXRyeSB7Ci0JCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gaXRlcmFibGUuaXRlcmF0b3IoKTsKLQkJCWZhaWwoImJvZ3VzIGl0ZXJhdG9yOiAiICsgaXRlcmF0b3IpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmlsdGVyaW5nSXRlcmFibGUodGhpcy5idWlsZE5lc3RlZEl0ZXJhYmxlKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZEZpbHRlcmluZ0l0ZXJhYmxlKEl0ZXJhYmxlPFN0cmluZz4gbmVzdGVkSXRlcmFibGUpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxTdHJpbmc+KG5lc3RlZEl0ZXJhYmxlKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChTdHJpbmcgcykgewotCQkJCXJldHVybiBzLnN0YXJ0c1dpdGgoUFJFRklYKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aChQUkVGSVgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZE5lc3RlZEl0ZXJhYmxlKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZChQUkVGSVggKyAiMSIpOwotCQljLmFkZChQUkVGSVggKyAiMiIpOwotCQljLmFkZChQUkVGSVggKyAiMyIpOwotCQljLmFkZCgiNCIpOwotCQljLmFkZChQUkVGSVggKyAiNSIpOwotCQljLmFkZChQUkVGSVggKyAiNiIpOwotCQljLmFkZChQUkVGSVggKyAiNyIpOwotCQljLmFkZCgiOCIpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvR3JhcGhJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0dyYXBoSXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjM5YzQxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvR3JhcGhJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuR3JhcGhJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkdyYXBoSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR3JhcGhJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCS8qKiB0aGlzIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYWxsIHRoZSBub2RlcyBjcmVhdGVkIGZvciB0aGUgdGVzdCAqLwotCUNvbGxlY3Rpb248R3JhcGhOb2RlPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8R3JhcGhOb2RlPigpOwotCi0JcHVibGljIEdyYXBoSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5laWdoYm9yczEoKSB7Ci0JCWZvciAoR3JhcGhOb2RlIGduIDogdGhpcy5idWlsZEdyYXBoSXRlcmFibGUxKCkpIHsKLQkJCWFzc2VydFRydWUodGhpcy5ub2Rlcy5jb250YWlucyhnbikpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxHcmFwaE5vZGU+IGJ1aWxkR3JhcGhJdGVyYWJsZTEoKSB7Ci0JCXJldHVybiBuZXcgR3JhcGhJdGVyYWJsZTxHcmFwaE5vZGU+KHRoaXMuYnVpbGRHcmFwaFJvb3QoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8R3JhcGhOb2RlPiBuZWlnaGJvcnMoR3JhcGhOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5uZWlnaGJvcnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVpZ2hib3JzMigpIHsKLQkJZm9yIChHcmFwaE5vZGUgZ24gOiB0aGlzLmJ1aWxkR3JhcGhJdGVyYWJsZTIoKSkgewotCQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVzLmNvbnRhaW5zKGduKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEdyYXBoTm9kZT4gYnVpbGRHcmFwaEl0ZXJhYmxlMigpIHsKLQkJcmV0dXJuIG5ldyBHcmFwaEl0ZXJhYmxlPEdyYXBoTm9kZT4odGhpcy5idWlsZEdyYXBoUm9vdCgpLCB0aGlzLmJ1aWxkTWlzdGVyUm9nZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZWlnaGJvcnMzKCkgewotCQlmb3IgKEdyYXBoTm9kZSBnbiA6IHRoaXMuYnVpbGRHcmFwaEl0ZXJhYmxlMygpKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMubm9kZXMuY29udGFpbnMoZ24pKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8R3JhcGhOb2RlPiBidWlsZEdyYXBoSXRlcmFibGUzKCkgewotCQlyZXR1cm4gbmV3IEdyYXBoSXRlcmFibGU8R3JhcGhOb2RlPihuZXcgR3JhcGhOb2RlW10geyB0aGlzLmJ1aWxkR3JhcGhSb290KCkgfSkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8R3JhcGhOb2RlPiBuZWlnaGJvcnMoR3JhcGhOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5uZWlnaGJvcnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVpZ2hib3JzNCgpIHsKLQkJZm9yIChHcmFwaE5vZGUgZ24gOiB0aGlzLmJ1aWxkR3JhcGhJdGVyYWJsZTQoKSkgewotCQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVzLmNvbnRhaW5zKGduKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEdyYXBoTm9kZT4gYnVpbGRHcmFwaEl0ZXJhYmxlNCgpIHsKLQkJcmV0dXJuIG5ldyBHcmFwaEl0ZXJhYmxlPEdyYXBoTm9kZT4obmV3IEdyYXBoTm9kZVtdIHsgdGhpcy5idWlsZEdyYXBoUm9vdCgpIH0sIHRoaXMuYnVpbGRNaXN0ZXJSb2dlcnMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRHcmFwaEl0ZXJhYmxlMSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nTWlzdGVyUm9nZXJzKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlmb3IgKEdyYXBoTm9kZSBnbiA6IG5ldyBHcmFwaEl0ZXJhYmxlPEdyYXBoTm9kZT4odGhpcy5idWlsZEdyYXBoUm9vdCgpKSkgewotCQkJCWFzc2VydFRydWUodGhpcy5ub2Rlcy5jb250YWlucyhnbikpOwotCQkJfQotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxHcmFwaE5vZGU+IGJ1aWxkTWlzdGVyUm9nZXJzKCkgewotCQlyZXR1cm4gbmV3IEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzPEdyYXBoTm9kZT4oKSB7Ci0JCQlwdWJsaWMgSXRlcmF0b3I8R3JhcGhOb2RlPiBuZWlnaGJvcnMoR3JhcGhOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5uZWlnaGJvcnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEdyYXBoTm9kZSBidWlsZEdyYXBoUm9vdCgpIHsKLQkJR3JhcGhOb2RlIG5jTm9kZSA9IG5ldyBHcmFwaE5vZGUoIk5vcnRoIENhcm9saW5hIik7Ci0JCUdyYXBoTm9kZSB2YU5vZGUgPSBuZXcgR3JhcGhOb2RlKCJWaXJnaW5pYSIpOwotCQlHcmFwaE5vZGUgc2NOb2RlID0gbmV3IEdyYXBoTm9kZSgiU291dGggQ2Fyb2xpbmEiKTsKLQkJR3JhcGhOb2RlIGdhTm9kZSA9IG5ldyBHcmFwaE5vZGUoIkdlb3JnaWEiKTsKLQkJR3JhcGhOb2RlIGZsTm9kZSA9IG5ldyBHcmFwaE5vZGUoIkZsb3JpZGEiKTsKLQkJR3JhcGhOb2RlIGFsTm9kZSA9IG5ldyBHcmFwaE5vZGUoIkFsYWJhbWEiKTsKLQkJR3JhcGhOb2RlIG1zTm9kZSA9IG5ldyBHcmFwaE5vZGUoIk1pc3Npc3NpcHBpIik7Ci0JCUdyYXBoTm9kZSB0bk5vZGUgPSBuZXcgR3JhcGhOb2RlKCJUZW5uZXNzZWUiKTsKLQotCQluY05vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IHZhTm9kZSwgc2NOb2RlLCBnYU5vZGUsIHRuTm9kZSB9KTsKLQkJdmFOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBuY05vZGUsIHRuTm9kZSB9KTsKLQkJc2NOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBuY05vZGUsIGdhTm9kZSB9KTsKLQkJZ2FOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBuY05vZGUsIHNjTm9kZSwgZmxOb2RlLCBhbE5vZGUsIHRuTm9kZSB9KTsKLQkJZmxOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBnYU5vZGUgfSk7Ci0JCWFsTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgZ2FOb2RlLCBtc05vZGUsIHRuTm9kZSB9KTsKLQkJbXNOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBhbE5vZGUsIHRuTm9kZSB9KTsKLQkJdG5Ob2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyB2YU5vZGUsIG5jTm9kZSwgZ2FOb2RlLCBhbE5vZGUsIG1zTm9kZSB9KTsKLQotCQlyZXR1cm4gbmNOb2RlOwotCX0KLQotCXB1YmxpYyBjbGFzcyBHcmFwaE5vZGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JCXByaXZhdGUgQ29sbGVjdGlvbjxHcmFwaE5vZGU+IG5laWdoYm9ycyA9IG5ldyBBcnJheUxpc3Q8R3JhcGhOb2RlPigpOwotCi0JCXB1YmxpYyBHcmFwaE5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQlHcmFwaEl0ZXJhYmxlVGVzdHMudGhpcy5ub2Rlcy5hZGQodGhpcyk7IC8vIGxvZyBub2RlCi0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCi0JCXZvaWQgc2V0TmVpZ2hib3JzKEdyYXBoTm9kZVtdIG5laWdoYm9ycykgewotCQkJdGhpcy5uZWlnaGJvcnMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChuZWlnaGJvcnMpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPEdyYXBoTm9kZT4gbmVpZ2hib3JzKCkgewotCQkJcmV0dXJuIHRoaXMubmVpZ2hib3JzLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IG5laWdoYm9yc1NpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uZWlnaGJvcnMuc2l6ZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkdyYXBoTm9kZSgiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9KcHRVdGlsaXR5SXRlcmFibGVzVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvSnB0VXRpbGl0eUl0ZXJhYmxlc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYTU2MGQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9KcHRVdGlsaXR5SXRlcmFibGVzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogZGVjZW50cmFsaXplIHRlc3QgY3JlYXRpb24gY29kZQotICovCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eUl0ZXJhYmxlc1Rlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5SXRlcmFibGVzVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFycmF5SXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBcnJheUxpc3RJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENoYWluSXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21wb3NpdGVJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbXBvc2l0ZUxpc3RJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVtcHR5SXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbXB0eUxpc3RJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEZpbHRlcmluZ0l0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3VwZXJJdGVyYWJsZVdyYXBwZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHcmFwaEl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTGl2ZUNsb25lSXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMaXZlQ2xvbmVMaXN0SXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQZWVrYWJsZUl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUXVldWVJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZE9ubHlJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlYWRPbmx5TGlzdEl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2luZ2xlRWxlbWVudEl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNuYXBzaG90Q2xvbmVJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdGFja0l0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJhbnNmb3JtYXRpb25JdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJlZUl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdFV0aWxpdHlJdGVyYWJsZXNUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0xpdmVDbG9uZUl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lSXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmZkZTdmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lSXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIExpdmVDbG9uZUl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBDbG9uZUl0ZXJhYmxlVGVzdHMgewotCi0JcHVibGljIExpdmVDbG9uZUl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlzdXBlci50ZXN0SXRlcmF0b3IoKTsKLQkJLy8gaXRlcmFibGUgc2hvdWxkIG5vdyByZXR1cm4gb25seSAzIHN0cmluZ3MgKHNpbmNlIGl0J3MgImxpdmUiKQotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiB0aGlzLml0ZXJhYmxlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDMsIGkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCXN1cGVyLnRlc3RSZW1vdmUoKTsKLQkJLy8gImxpdmUiIGNsb25lIGl0ZXJhYmxlIHdpbGwgbm8gbG9uZ2VyIGNvbnRhaW4gdGhlIGVsZW1lbnQgcmVtb3ZlZCBmcm9tIHRoZQotCQkvLyBvcmlnaW5hbCBjb2xsZWN0aW9uCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCAidGhyZWUiKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZXIoKSB7Ci0JCXN1cGVyLnRlc3RSZW1vdmVyKCk7Ci0JCS8vICJsaXZlIiBjbG9uZSBpdGVyYWJsZSB3aWxsIG5vIGxvbmdlciBjb250YWluIHRoZSBlbGVtZW50IHJlbW92ZWQgZnJvbSB0aGUKLQkJLy8gb3JpZ2luYWwgY29sbGVjdGlvbgotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgInRocmVlIikpOwotCX0KLQotCUBPdmVycmlkZQotCUl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZShMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPFN0cmluZz4oYyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmFibGU8U3RyaW5nPiBidWlsZFJlbW92aW5nSXRlcmFibGUoZmluYWwgTGlzdDxTdHJpbmc+IGMpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxTdHJpbmc+KGMpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoU3RyaW5nIGN1cnJlbnQpIHsKLQkJCQkJYy5yZW1vdmUoY3VycmVudCk7Ci0JCQkJfQotCQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGVXaXRoUmVtb3ZlcihMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPFN0cmluZz4oYywgdGhpcy5idWlsZFJlbW92ZXIoYykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9MaXZlQ2xvbmVMaXN0SXRlcmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9MaXZlQ2xvbmVMaXN0SXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDcwYzAwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lTGlzdEl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBMaXZlQ2xvbmVJdGVyYWJsZVRlc3RzIHsKLQotCXB1YmxpYyBMaXZlQ2xvbmVMaXN0SXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkUmVtb3ZpbmdJdGVyYWJsZShjb2xsZWN0aW9uKTsKLQotCQlTdHJpbmcgYWRkZWQgPSAieHh4eCI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCBhZGRlZCkpOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoaXRlcmF0b3IubmV4dCgpLmVxdWFscygidHdvIikpIHsKLQkJCQlpdGVyYXRvci5hZGQoYWRkZWQpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoY29sbGVjdGlvbi5jb250YWlucyhhZGRlZCkpOwotCQkvLyAibGl2ZSIgY2xvbmUgaXRlcmFibGUgd2lsbCBjb250YWluIHRoZSBlbGVtZW50IGFkZGVkIHRvIHRoZQotCQkvLyBvcmlnaW5hbCBjb2xsZWN0aW9uCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsIGFkZGVkKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pc3NpbmdNdXRhdG9yQWRkKCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGUoY29sbGVjdGlvbik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5pdGVyYWJsZS50b1N0cmluZygpKTsKLQotCQlTdHJpbmcgYWRkZWQgPSAieHh4eCI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCBhZGRlZCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaXRlcmF0b3IuYWRkKGFkZGVkKTsKLQkJCQkJZmFpbCgpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0KCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkUmVtb3ZpbmdJdGVyYWJsZShjb2xsZWN0aW9uKTsKLQotCQlTdHJpbmcgYWRkZWQgPSAieHh4eCI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCBhZGRlZCkpOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoaXRlcmF0b3IubmV4dCgpLmVxdWFscygidHdvIikpIHsKLQkJCQlpdGVyYXRvci5zZXQoYWRkZWQpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoY29sbGVjdGlvbi5jb250YWlucyhhZGRlZCkpOwotCQlhc3NlcnRGYWxzZShjb2xsZWN0aW9uLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCS8vICJsaXZlIiBjbG9uZSBpdGVyYWJsZSB3aWxsIGNvbnRhaW4gdGhlIGVsZW1lbnQgYWRkZWQgdG8gdGhlCi0JCS8vIG9yaWdpbmFsIGNvbGxlY3Rpb24KLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgYWRkZWQpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsICJ0d28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pc3NpbmdNdXRhdG9yU2V0KCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGUoY29sbGVjdGlvbik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5pdGVyYWJsZS50b1N0cmluZygpKTsKLQotCQlTdHJpbmcgYWRkZWQgPSAieHh4eCI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCBhZGRlZCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaXRlcmF0b3Iuc2V0KGFkZGVkKTsKLQkJCQkJZmFpbCgpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoTGlzdDxTdHJpbmc+IGMpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPihjKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkUmVtb3ZpbmdJdGVyYWJsZShmaW5hbCBMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxTdHJpbmc+KGMpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBhZGQoaW50IGluZGV4LCBTdHJpbmcgZWxlbWVudCkgewotCQkJCQljLmFkZChpbmRleCwgZWxlbWVudCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCQkJYy5yZW1vdmUoaW5kZXgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXQoaW50IGluZGV4LCBTdHJpbmcgZWxlbWVudCkgewotCQkJCQljLnNldChpbmRleCwgZWxlbWVudCk7Ci0JCQkJfQotCQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGVXaXRoUmVtb3ZlcihMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxTdHJpbmc+KGMsIHRoaXMuYnVpbGRNdXRhdG9yKGMpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvUGVla2FibGVJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1BlZWthYmxlSXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzQ5OTJlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvUGVla2FibGVJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5QZWVrYWJsZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUGVla2FibGVJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUGVla2FibGVJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFBlZWthYmxlSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCVBlZWthYmxlSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRJdGVyYWJsZSgpOwotCQlQZWVrYWJsZUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBpdGVyYWJsZS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGl0ZXJhdG9yLnBlZWsoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRJdGVyYWJsZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXByaXZhdGUgUGVla2FibGVJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoKSB7Ci0JCXJldHVybiBuZXcgUGVla2FibGVJdGVyYWJsZTxTdHJpbmc+KHRoaXMuYnVpbGROZXN0ZWRJdGVyYWJsZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGROZXN0ZWRJdGVyYWJsZSgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4odGhpcy5idWlsZEFycmF5KCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gYnVpbGRBcnJheSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Im9uZSIsICJ0d28iLCAidGhyZWUifTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvUXVldWVJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1F1ZXVlSXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDlmMzM2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvUXVldWVJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuUXVldWVJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUXVldWVJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFF1ZXVlSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGUoKTsKLQkJZm9yIChTdHJpbmcgcyA6IGl0ZXJhYmxlKSB7Ci0JCQlhc3NlcnROb3ROdWxsKHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRJdGVyYWJsZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKCkgewotCQlyZXR1cm4gbmV3IFF1ZXVlSXRlcmFibGU8U3RyaW5nPih0aGlzLmJ1aWxkUXVldWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBRdWV1ZTxTdHJpbmc+IGJ1aWxkUXVldWUoKSB7Ci0JCVF1ZXVlPFN0cmluZz4gcSA9IG5ldyBTaW1wbGVRdWV1ZTxTdHJpbmc+KCk7Ci0JCXEuZW5xdWV1ZSgiZm9vIik7Ci0JCXEuZW5xdWV1ZSgiYmFyIik7Ci0JCXEuZW5xdWV1ZSgiYmF6Iik7Ci0JCXJldHVybiBxOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxN2IzOS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjAiKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQkJTGlzdEl0ZXJhYmxlPFN0cmluZz4gbGkxID0gbmV3IExpc3RMaXN0SXRlcmFibGU8U3RyaW5nPihjMSk7Ci0KLQkJTGlzdDxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiNCIpOwotCQljMi5hZGQoIjUiKTsKLQkJYzIuYWRkKCI2Iik7Ci0JCWMyLmFkZCgiNyIpOwotCQlMaXN0SXRlcmFibGU8U3RyaW5nPiBsaTIgPSBuZXcgTGlzdExpc3RJdGVyYWJsZTxTdHJpbmc+KGMyKTsKLQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGU8U3RyaW5nPihsaTEsIGxpMik7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IGNvbXBvc2l0ZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4dHJhRWxlbWVudDEoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjAiKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQkJTGlzdEl0ZXJhYmxlPFN0cmluZz4gbGkxID0gbmV3IExpc3RMaXN0SXRlcmFibGU8U3RyaW5nPihjMSk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGU8U3RyaW5nPihsaTEsICI0Iik7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IGNvbXBvc2l0ZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4dHJhRWxlbWVudDIoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjEiKTsKLQkJYzEuYWRkKCIyIik7Ci0JCWMxLmFkZCgiMyIpOwotCQlMaXN0SXRlcmFibGU8U3RyaW5nPiBsaTEgPSBuZXcgTGlzdExpc3RJdGVyYWJsZTxTdHJpbmc+KGMxKTsKLQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZTxTdHJpbmc+KCIwIiwgbGkxKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbk9mSXRlcmFibGVzKCkgewotCQlMaXN0PFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIwIik7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0JCUxpc3RJdGVyYWJsZTxTdHJpbmc+IGxpMSA9IG5ldyBMaXN0TGlzdEl0ZXJhYmxlPFN0cmluZz4oYzEpOwotCi0JCUxpc3Q8U3RyaW5nPiBjMiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMi5hZGQoIjQiKTsKLQkJYzIuYWRkKCI1Iik7Ci0JCWMyLmFkZCgiNiIpOwotCQljMi5hZGQoIjciKTsKLQkJTGlzdEl0ZXJhYmxlPFN0cmluZz4gbGkyID0gbmV3IExpc3RMaXN0SXRlcmFibGU8U3RyaW5nPihjMik7Ci0KLQkJTGlzdDxMaXN0SXRlcmFibGU8U3RyaW5nPj4gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8TGlzdEl0ZXJhYmxlPFN0cmluZz4+KCk7Ci0JCWNvbGxlY3Rpb24uYWRkKGxpMSk7Ci0JCWNvbGxlY3Rpb24uYWRkKGxpMik7Ci0JCUxpc3RJdGVyYWJsZTxMaXN0SXRlcmFibGU8U3RyaW5nPj4gbGkgPSBuZXcgTGlzdExpc3RJdGVyYWJsZTxMaXN0SXRlcmFibGU8U3RyaW5nPj4oY29sbGVjdGlvbik7Ci0JCQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZTxTdHJpbmc+KGxpKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjAiKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQkJTGlzdEl0ZXJhYmxlPFN0cmluZz4gbGkxID0gbmV3IExpc3RMaXN0SXRlcmFibGU8U3RyaW5nPihjMSk7Ci0KLQkJTGlzdDxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiNCIpOwotCQljMi5hZGQoIjUiKTsKLQkJYzIuYWRkKCI2Iik7Ci0JCWMyLmFkZCgiNyIpOwotCQlMaXN0SXRlcmFibGU8U3RyaW5nPiBsaTIgPSBuZXcgTGlzdExpc3RJdGVyYWJsZTxTdHJpbmc+KGMyKTsKLQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGU8U3RyaW5nPihsaTEsIGxpMik7Ci0JCWFzc2VydE5vdE51bGwoY29tcG9zaXRlLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvUmVhZE9ubHlJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzOTk4NTEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5SZWFkT25seUl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWFkT25seUl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUmVhZE9ubHlJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciA9IHRoaXMuYnVpbGRWZWN0b3IoKS5pdGVyYXRvcigpOwotCQlmb3IgKFN0cmluZyBzIDogdGhpcy5idWlsZFJlYWRPbmx5SXRlcmFibGUoKSkgewotCQkJYXNzZXJ0RXF1YWxzKG5lc3RlZEl0ZXJhdG9yLm5leHQoKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYWJsZSgpLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5idWlsZFJlYWRPbmx5SXRlcmFibGUoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRSZWFkT25seUl0ZXJhYmxlKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmFibGU8U3RyaW5nPih0aGlzLmJ1aWxkVmVjdG9yKCkpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRWZWN0b3IoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJdi5hZGRFbGVtZW50KCJvbmUiKTsKLQkJdi5hZGRFbGVtZW50KCJ0d28iKTsKLQkJdi5hZGRFbGVtZW50KCJ0aHJlZSIpOwotCQl2LmFkZEVsZW1lbnQoImZvdXIiKTsKLQkJdi5hZGRFbGVtZW50KCJmaXZlIik7Ci0JCXYuYWRkRWxlbWVudCgic2l4Iik7Ci0JCXYuYWRkRWxlbWVudCgic2V2ZW4iKTsKLQkJdi5hZGRFbGVtZW50KCJlaWdodCIpOwotCQlyZXR1cm4gdjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvUmVhZE9ubHlMaXN0SXRlcmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUxpc3RJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOTIzZmYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUxpc3RJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdExpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlJlYWRPbmx5TGlzdEl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWFkT25seUxpc3RJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFJlYWRPbmx5TGlzdEl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5idWlsZFZlY3RvcigpLml0ZXJhdG9yKCk7Ci0JCWZvciAoU3RyaW5nIHMgOiB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmFibGUoKSkgewotCQkJYXNzZXJ0RXF1YWxzKG5lc3RlZEl0ZXJhdG9yLm5leHQoKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmFibGUoKS5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYWJsZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZFJlYWRPbmx5TGlzdEl0ZXJhYmxlKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhYmxlPFN0cmluZz4odGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYWJsZSgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkTmVzdGVkTGlzdEl0ZXJhYmxlKCkgewotCQlyZXR1cm4gbmV3IExpc3RMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLmJ1aWxkVmVjdG9yKCkpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRWZWN0b3IoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJdi5hZGRFbGVtZW50KCJvbmUiKTsKLQkJdi5hZGRFbGVtZW50KCJ0d28iKTsKLQkJdi5hZGRFbGVtZW50KCJ0aHJlZSIpOwotCQl2LmFkZEVsZW1lbnQoImZvdXIiKTsKLQkJdi5hZGRFbGVtZW50KCJmaXZlIik7Ci0JCXYuYWRkRWxlbWVudCgic2l4Iik7Ci0JCXYuYWRkRWxlbWVudCgic2V2ZW4iKTsKLQkJdi5hZGRFbGVtZW50KCJlaWdodCIpOwotCQlyZXR1cm4gdjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvU2luZ2xlRWxlbWVudEl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvU2luZ2xlRWxlbWVudEl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwNjFkMy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NpbmdsZUVsZW1lbnRJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2luZ2xlRWxlbWVudEl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU2luZ2xlRWxlbWVudEl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlmb3IgKFN0cmluZyBzIDogdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRJdGVyYWJsZSgpKSB7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zaW5nbGVFbGVtZW50KCksIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhYmxlKCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQkJZmFpbCgiYm9ndXMgZWxlbWVudDogIiArIHN0cmluZyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhYmxlKCkuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHModGhpcy5zaW5nbGVFbGVtZW50KCkpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBidWlsZFNpbmdsZUVsZW1lbnRJdGVyYWJsZSgpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8U3RyaW5nPih0aGlzLnNpbmdsZUVsZW1lbnQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBzaW5nbGVFbGVtZW50KCkgewotCQlyZXR1cm4gInNpbmdsZSBlbGVtZW50IjsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDExNTIwZi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJZm9yIChTdHJpbmcgcyA6IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlKCkpIHsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNpbmdsZUVsZW1lbnQoKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlKCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQkJZmFpbCgiYm9ndXMgZWxlbWVudDogIiArIHN0cmluZyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZSgpLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKHRoaXMuc2luZ2xlRWxlbWVudCgpKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLnNpbmdsZUVsZW1lbnQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBzaW5nbGVFbGVtZW50KCkgewotCQlyZXR1cm4gInNpbmdsZSBlbGVtZW50IjsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDAwNmMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TbmFwc2hvdENsb25lSXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU25hcHNob3RDbG9uZUl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTbmFwc2hvdENsb25lSXRlcmFibGVUZXN0cyBleHRlbmRzIENsb25lSXRlcmFibGVUZXN0cyB7Ci0KLQlwdWJsaWMgU25hcHNob3RDbG9uZUl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlzdXBlci50ZXN0SXRlcmF0b3IoKTsKLQkJLy8gInNuYXBzaG90IiBpdGVyYWJsZSBzaG91bGQgc3RpbGwgcmV0dXJuIDQgc3RyaW5ncyAoc2luY2UgdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gd2FzIGNsb25lZCkKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogdGhpcy5pdGVyYWJsZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQl9Ci0JCWFzc2VydEVxdWFscyg0LCBpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlzdXBlci50ZXN0UmVtb3ZlKCk7Ci0JCS8vICJzbmFwc2hvdCIgY2xvbmUgaXRlcmFibGUgd2lsbCBzdGlsbCBjb250YWluIHRoZSBlbGVtZW50IHJlbW92ZWQgZnJvbSB0aGUKLQkJLy8gb3JpZ2luYWwgY29sbGVjdGlvbgotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCAidGhyZWUiKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZXIoKSB7Ci0JCXN1cGVyLnRlc3RSZW1vdmVyKCk7Ci0JCS8vICJzbmFwc2hvdCIgY2xvbmUgaXRlcmFibGUgd2lsbCBzdGlsbCBjb250YWluIHRoZSBlbGVtZW50IHJlbW92ZWQgZnJvbSB0aGUKLQkJLy8gb3JpZ2luYWwgY29sbGVjdGlvbgotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCAidGhyZWUiKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKExpc3Q8U3RyaW5nPiBjKSB7Ci0JCXJldHVybiBuZXcgU25hcHNob3RDbG9uZUl0ZXJhYmxlPFN0cmluZz4oYyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmFibGU8U3RyaW5nPiBidWlsZFJlbW92aW5nSXRlcmFibGUoZmluYWwgTGlzdDxTdHJpbmc+IGMpIHsKLQkJcmV0dXJuIG5ldyBTbmFwc2hvdENsb25lSXRlcmFibGU8U3RyaW5nPihjKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKFN0cmluZyBjdXJyZW50KSB7Ci0JCQkJCWMucmVtb3ZlKGN1cnJlbnQpOwotCQkJCX0KLQkJCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlV2l0aFJlbW92ZXIoTGlzdDxTdHJpbmc+IGMpIHsKLQkJcmV0dXJuIG5ldyBTbmFwc2hvdENsb25lSXRlcmFibGU8U3RyaW5nPihjLCB0aGlzLmJ1aWxkUmVtb3ZlcihjKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZjNWMxMy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZVRlc3RzIGV4dGVuZHMgU25hcHNob3RDbG9uZUl0ZXJhYmxlVGVzdHMgewotCi0JcHVibGljIFNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkUmVtb3ZpbmdJdGVyYWJsZShjb2xsZWN0aW9uKTsKLQotCQlTdHJpbmcgYWRkZWQgPSAieHh4eCI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCBhZGRlZCkpOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoaXRlcmF0b3IubmV4dCgpLmVxdWFscygidHdvIikpIHsKLQkJCQlpdGVyYXRvci5hZGQoYWRkZWQpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoY29sbGVjdGlvbi5jb250YWlucyhhZGRlZCkpOwotCQkvLyAic25hcHNob3QiIGNsb25lIGl0ZXJhYmxlIG5vdCB3aWxsIGNvbnRhaW4gdGhlIGVsZW1lbnQgYWRkZWQgdG8gdGhlCi0JCS8vIG9yaWdpbmFsIGNvbGxlY3Rpb24KLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsIGFkZGVkKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pc3NpbmdNdXRhdG9yQWRkKCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGUoY29sbGVjdGlvbik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5pdGVyYWJsZS50b1N0cmluZygpKTsKLQotCQlTdHJpbmcgYWRkZWQgPSAieHh4eCI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCBhZGRlZCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaXRlcmF0b3IuYWRkKGFkZGVkKTsKLQkJCQkJZmFpbCgpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0KCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkUmVtb3ZpbmdJdGVyYWJsZShjb2xsZWN0aW9uKTsKLQotCQlTdHJpbmcgYWRkZWQgPSAieHh4eCI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCBhZGRlZCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCAidHdvIikpOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoaXRlcmF0b3IubmV4dCgpLmVxdWFscygidHdvIikpIHsKLQkJCQlpdGVyYXRvci5zZXQoYWRkZWQpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoY29sbGVjdGlvbi5jb250YWlucyhhZGRlZCkpOwotCQlhc3NlcnRGYWxzZShjb2xsZWN0aW9uLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCS8vICJzbmFwc2hvdCIgY2xvbmUgaXRlcmFibGUgd2lsbCBub3QgYmUgY2hhbmdlZAotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgYWRkZWQpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgInR3byIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ011dGF0b3JTZXQoKSB7Ci0JCWZpbmFsIExpc3Q8U3RyaW5nPiBjb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJdGhpcy5pdGVyYWJsZSA9IHRoaXMuYnVpbGRJdGVyYWJsZShjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLml0ZXJhYmxlLnRvU3RyaW5nKCkpOwotCi0JCVN0cmluZyBhZGRlZCA9ICJ4eHh4IjsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsIGFkZGVkKSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkgewotCQkJaWYgKGl0ZXJhdG9yLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlpdGVyYXRvci5zZXQoYWRkZWQpOwotCQkJCQlmYWlsKCk7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCUBPdmVycmlkZQotCUl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZShMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IFNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPihjKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkUmVtb3ZpbmdJdGVyYWJsZShmaW5hbCBMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IFNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPihjKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgYWRkKGludCBpbmRleCwgU3RyaW5nIGVsZW1lbnQpIHsKLQkJCQkJYy5hZGQoaW5kZXgsIGVsZW1lbnQpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCQkJCWMucmVtb3ZlKGluZGV4KTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0KGludCBpbmRleCwgU3RyaW5nIGVsZW1lbnQpIHsKLQkJCQkJYy5zZXQoaW5kZXgsIGVsZW1lbnQpOwotCQkJCX0KLQkJCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlV2l0aFJlbW92ZXIoTGlzdDxTdHJpbmc+IGMpIHsKLQkJcmV0dXJuIG5ldyBTbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlPFN0cmluZz4oYywgdGhpcy5idWlsZE11dGF0b3IoYykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TdGFja0l0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvU3RhY2tJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYTk1YmMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TdGFja0l0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdGFja0l0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTdGFja0l0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU3RhY2tJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRJdGVyYWJsZSgpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygidGhyZWUiLCBpdGVyYXRvci5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgaXRlcmF0b3IubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5idWlsZEl0ZXJhYmxlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoKSB7Ci0JCXJldHVybiBuZXcgU3RhY2tJdGVyYWJsZTxTdHJpbmc+KHRoaXMuYnVpbGRTdGFjaygpKTsKLQl9Ci0KLQlwcml2YXRlIFN0YWNrPFN0cmluZz4gYnVpbGRTdGFjaygpIHsKLQkJU3RhY2s8U3RyaW5nPiBzdGFjayA9IG5ldyBTaW1wbGVTdGFjazxTdHJpbmc+KCk7Ci0JCXN0YWNrLnB1c2goIm9uZSIpOwotCQlzdGFjay5wdXNoKCJ0d28iKTsKLQkJc3RhY2sucHVzaCgidGhyZWUiKTsKLQkJcmV0dXJuIHN0YWNrOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TdXBlckl0ZXJhYmxlV3JhcHBlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1N1cGVySXRlcmFibGVXcmFwcGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY1NjA4ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1N1cGVySXRlcmFibGVXcmFwcGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdXBlckl0ZXJhYmxlV3JhcHBlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3VwZXJJdGVyYWJsZVdyYXBwZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBTdXBlckl0ZXJhYmxlV3JhcHBlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiZm9vIik7Ci0JCWxpc3QuYWRkKCJiYXIiKTsKLQkJbGlzdC5hZGQoImJheiIpOwotCQlTdHJpbmcgY29uY2F0ID0gIiI7Ci0JCWZvciAoU3RyaW5nIHMgOiBsaXN0KSB7Ci0JCQljb25jYXQgKz0gczsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImZvb2JhcmJheiIsIGNvbmNhdCk7Ci0KLQkJSXRlcmFibGU8T2JqZWN0PiBpdGVyYWJsZSA9IG5ldyBTdXBlckl0ZXJhYmxlV3JhcHBlcjxPYmplY3Q+KGxpc3QpOwotCQljb25jYXQgPSAiIjsKLQkJZm9yIChPYmplY3QgcyA6IGl0ZXJhYmxlKSB7Ci0JCQljb25jYXQgKz0gczsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImZvb2JhcmJheiIsIGNvbmNhdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlJdGVyYWJsZTxPYmplY3Q+IGl0ZXJhYmxlID0gbmV3IFN1cGVySXRlcmFibGVXcmFwcGVyPE9iamVjdD4oQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOwotCQlhc3NlcnROb3ROdWxsKGl0ZXJhYmxlLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25JdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMTZkZTYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25JdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmb3JtMSgpIHsKLQkJaW50IGkgPSAxOwotCQlmb3IgKEludGVnZXIgaW50ZWdlciA6IHRoaXMuYnVpbGRJdGVyYWJsZTEoKSkgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgaW50ZWdlci5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8SW50ZWdlcj4gYnVpbGRJdGVyYWJsZTEoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25JdGVyYWJsZTEodGhpcy5idWlsZE5lc3RlZEl0ZXJhYmxlKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8SW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlMShJdGVyYWJsZTxTdHJpbmc+IG5lc3RlZEl0ZXJhYmxlKSB7Ci0JCS8vIHRyYW5zZm9ybSBlYWNoIHN0cmluZyBpbnRvIGFuIGludGVnZXIgd2l0aCBhIHZhbHVlIG9mIHRoZSBzdHJpbmcncyBsZW5ndGgKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFN0cmluZywgSW50ZWdlcj4obmVzdGVkSXRlcmFibGUpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKG5leHQubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2Zvcm0yKCkgewotCQlpbnQgaSA9IDE7Ci0JCWZvciAoSW50ZWdlciBpbnRlZ2VyIDogdGhpcy5idWlsZEl0ZXJhYmxlMigpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaSsrLCBpbnRlZ2VyLmludFZhbHVlKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxJbnRlZ2VyPiBidWlsZEl0ZXJhYmxlMigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlMih0aGlzLmJ1aWxkTmVzdGVkSXRlcmFibGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWF0aW9uSXRlcmFibGUyKEl0ZXJhYmxlPFN0cmluZz4gbmVzdGVkSXRlcmFibGUpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8U3RyaW5nLCBJbnRlZ2VyPihuZXN0ZWRJdGVyYWJsZSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPigpIHsKLQkJCXB1YmxpYyBJbnRlZ2VyIHRyYW5zZm9ybShTdHJpbmcgbmV4dCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcihuZXh0Lmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGROZXN0ZWRJdGVyYWJsZSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoIjEiKTsKLQkJYy5hZGQoIjIyIik7Ci0JCWMuYWRkKCIzMzMiKTsKLQkJYy5hZGQoIjQ0NDQiKTsKLQkJYy5hZGQoIjU1NTU1Iik7Ci0JCWMuYWRkKCI2NjY2NjYiKTsKLQkJYy5hZGQoIjc3Nzc3NzciKTsKLQkJYy5hZGQoIjg4ODg4ODg4Iik7Ci0JCXJldHVybiBjOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmJ1aWxkSXRlcmFibGUxKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pc3NpbmdUcmFuc2Zvcm1lcigpIHsKLQkJSXRlcmFibGU8SW50ZWdlcj4gaXRlcmFibGUgPSBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxTdHJpbmcsIEludGVnZXI+KHRoaXMuYnVpbGROZXN0ZWRJdGVyYWJsZSgpKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaW50IGkgPSAxOwotCQkJZm9yIChJbnRlZ2VyIGludGVnZXIgOiBpdGVyYWJsZSkgewotCQkJCWFzc2VydEVxdWFscyhpKyssIGludGVnZXIuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYzZhMTYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zZm9ybTEoKSB7Ci0JCWludCBpID0gMTsKLQkJZm9yIChJbnRlZ2VyIGludGVnZXIgOiB0aGlzLmJ1aWxkSXRlcmFibGUxKCkpIHsKLQkJCWFzc2VydEVxdWFscyhpKyssIGludGVnZXIuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEludGVnZXI+IGJ1aWxkSXRlcmFibGUxKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlMSh0aGlzLmJ1aWxkTmVzdGVkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGUxKExpc3Q8U3RyaW5nPiBuZXN0ZWRMaXN0KSB7Ci0JCS8vIHRyYW5zZm9ybSBlYWNoIHN0cmluZyBpbnRvIGFuIGludGVnZXIgd2l0aCBhIHZhbHVlIG9mIHRoZSBzdHJpbmcncyBsZW5ndGgKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZTxTdHJpbmcsIEludGVnZXI+KG5lc3RlZExpc3QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKG5leHQubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2Zvcm0yKCkgewotCQlpbnQgaSA9IDE7Ci0JCWZvciAoSW50ZWdlciBpbnRlZ2VyIDogdGhpcy5idWlsZEl0ZXJhYmxlMigpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaSsrLCBpbnRlZ2VyLmludFZhbHVlKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxJbnRlZ2VyPiBidWlsZEl0ZXJhYmxlMigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZTIodGhpcy5idWlsZE5lc3RlZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlMihMaXN0PFN0cmluZz4gbmVzdGVkTGlzdCkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGU8U3RyaW5nLCBJbnRlZ2VyPihuZXN0ZWRMaXN0LCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSBlYWNoIHN0cmluZyBpbnRvIGFuIGludGVnZXIgd2l0aCBhIHZhbHVlIG9mIHRoZSBzdHJpbmcncyBsZW5ndGgKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+KCkgewotCQkJcHVibGljIEludGVnZXIgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKG5leHQubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTmVzdGVkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoIjEiKTsKLQkJYy5hZGQoIjIyIik7Ci0JCWMuYWRkKCIzMzMiKTsKLQkJYy5hZGQoIjQ0NDQiKTsKLQkJYy5hZGQoIjU1NTU1Iik7Ci0JCWMuYWRkKCI2NjY2NjYiKTsKLQkJYy5hZGQoIjc3Nzc3NzciKTsKLQkJYy5hZGQoIjg4ODg4ODg4Iik7Ci0JCXJldHVybiBjOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmJ1aWxkSXRlcmFibGUxKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pc3NpbmdUcmFuc2Zvcm1lcigpIHsKLQkJSXRlcmFibGU8SW50ZWdlcj4gaXRlcmFibGUgPSBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGU8U3RyaW5nLCBJbnRlZ2VyPih0aGlzLmJ1aWxkTmVzdGVkTGlzdCgpKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaW50IGkgPSAxOwotCQkJZm9yIChJbnRlZ2VyIGludGVnZXIgOiBpdGVyYWJsZSkgewotCQkJCWFzc2VydEVxdWFscyhpKyssIGludGVnZXIuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvVHJlZUl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvVHJlZUl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhMzUzMy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1RyZWVJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyZWVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUcmVlSXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKiogdGhpcyB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGFsbCB0aGUgbm9kZXMgY3JlYXRlZCBmb3IgdGhlIHRlc3QgKi8KLQlDb2xsZWN0aW9uPFRyZWVOb2RlPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8VHJlZU5vZGU+KCk7Ci0KLQlwdWJsaWMgVHJlZUl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcjEoKSB7Ci0JCWZvciAoVHJlZU5vZGUgdG4gOiB0aGlzLmJ1aWxkVHJlZUl0ZXJhYmxlMSgpKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMubm9kZXMuY29udGFpbnModG4pKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcjIoKSB7Ci0JCWZvciAoVHJlZU5vZGUgdG4gOiB0aGlzLmJ1aWxkVHJlZUl0ZXJhYmxlMigpKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMubm9kZXMuY29udGFpbnModG4pKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaWR3aWZlMSgpIHsKLQkJZm9yIChUcmVlTm9kZSB0biA6IG5ldyBUcmVlSXRlcmFibGU8VHJlZU5vZGU+KHRoaXMuYnVpbGRUcmVlKCksIHRoaXMuYnVpbGRNaWR3aWZlKCkpKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMubm9kZXMuY29udGFpbnModG4pKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaWR3aWZlMigpIHsKLQkJZm9yIChUcmVlTm9kZSB0biA6IG5ldyBUcmVlSXRlcmFibGU8VHJlZU5vZGU+KG5ldyBUcmVlTm9kZVtdIHsgdGhpcy5idWlsZFRyZWUoKSB9LCB0aGlzLmJ1aWxkTWlkd2lmZSgpKSkgewotCQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVzLmNvbnRhaW5zKHRuKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5idWlsZFRyZWVJdGVyYWJsZTEoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ01pZHdpZmUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWZvciAoVHJlZU5vZGUgdG4gOiBuZXcgVHJlZUl0ZXJhYmxlPFRyZWVOb2RlPih0aGlzLmJ1aWxkVHJlZSgpKSkgewotCQkJCWFzc2VydFRydWUodGhpcy5ub2Rlcy5jb250YWlucyh0bikpOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxUcmVlTm9kZT4gYnVpbGRUcmVlSXRlcmFibGUxKCkgewotCQlyZXR1cm4gbmV3IFRyZWVJdGVyYWJsZTxUcmVlTm9kZT4odGhpcy5idWlsZFRyZWUoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKFRyZWVOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5jaGlsZHJlbigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8VHJlZU5vZGU+IGJ1aWxkVHJlZUl0ZXJhYmxlMigpIHsKLQkJcmV0dXJuIG5ldyBUcmVlSXRlcmFibGU8VHJlZU5vZGU+KG5ldyBUcmVlTm9kZVtdIHsgdGhpcy5idWlsZFRyZWUoKSB9KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxUcmVlTm9kZT4gY2hpbGRyZW4oVHJlZU5vZGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmNoaWxkcmVuKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmVlSXRlcmF0b3IuTWlkd2lmZTxUcmVlTm9kZT4gYnVpbGRNaWR3aWZlKCkgewotCQlyZXR1cm4gbmV3IFRyZWVJdGVyYXRvci5NaWR3aWZlPFRyZWVOb2RlPigpIHsKLQkJCXB1YmxpYyBJdGVyYXRvcjxUcmVlTm9kZT4gY2hpbGRyZW4oVHJlZU5vZGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmNoaWxkcmVuKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmVlTm9kZSBidWlsZFRyZWUoKSB7Ci0JCVRyZWVOb2RlIHJvb3QgPSBuZXcgVHJlZU5vZGUoInJvb3QiKTsKLQkJVHJlZU5vZGUgY2hpbGQxID0gbmV3IFRyZWVOb2RlKHJvb3QsICJjaGlsZCAxIik7Ci0JCW5ldyBUcmVlTm9kZShjaGlsZDEsICJncmFuZGNoaWxkIDFBIik7Ci0JCVRyZWVOb2RlIGNoaWxkMiA9IG5ldyBUcmVlTm9kZShyb290LCAiY2hpbGQgMiIpOwotCQluZXcgVHJlZU5vZGUoY2hpbGQyLCAiZ3JhbmRjaGlsZCAyQSIpOwotCQlUcmVlTm9kZSBncmFuZGNoaWxkMkIgPSBuZXcgVHJlZU5vZGUoY2hpbGQyLCAiZ3JhbmRjaGlsZCAyQiIpOwotCQluZXcgVHJlZU5vZGUoZ3JhbmRjaGlsZDJCLCAiZ3JlYXQtZ3JhbmRjaGlsZCAyQjEiKTsKLQkJbmV3IFRyZWVOb2RlKGdyYW5kY2hpbGQyQiwgImdyZWF0LWdyYW5kY2hpbGQgMkIyIik7Ci0JCVRyZWVOb2RlIGdyYW5kY2hpbGQyQyA9IG5ldyBUcmVlTm9kZShjaGlsZDIsICJncmFuZGNoaWxkIDJDIik7Ci0JCW5ldyBUcmVlTm9kZShncmFuZGNoaWxkMkMsICJncmVhdC1ncmFuZGNoaWxkIDJDMSIpOwotCQluZXcgVHJlZU5vZGUocm9vdCwgImNoaWxkIDMiKTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JcHVibGljIGNsYXNzIFRyZWVOb2RlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFRyZWVOb2RlPiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8VHJlZU5vZGU+KCk7Ci0KLQkJcHVibGljIFRyZWVOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJVHJlZUl0ZXJhYmxlVGVzdHMudGhpcy5ub2Rlcy5hZGQodGhpcyk7IC8vIGxvZyBub2RlCi0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0KLQkJcHVibGljIFRyZWVOb2RlKFRyZWVOb2RlIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMobmFtZSk7Ci0JCQlwYXJlbnQuYWRkQ2hpbGQodGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGFkZENoaWxkKFRyZWVOb2RlIGNoaWxkKSB7Ci0JCQl0aGlzLmNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKCkgewotCQkJcmV0dXJuIHRoaXMuY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY2hpbGRyZW5TaXplKCkgewotCQkJcmV0dXJuIHRoaXMuY2hpbGRyZW4uc2l6ZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRyZWVOb2RlKCIgKyB0aGlzLm5hbWUgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlJdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzhjZGEwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEFycmF5SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBBcnJheUl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRBcnJheSgpLmxlbmd0aCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCWludCBpID0gMTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIGkrKywgSW50ZWdlci5wYXJzZUludChzdHJlYW0ubmV4dCgpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygiMyIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCkgewotCQl0aGlzLnRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oLTEsIDEpOwotCQl0aGlzLnRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oOCwgMSk7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigwLCAtMSk7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigwLCA5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY3MoKSB7Ci0JCUludGVnZXJbXSBpbnRlZ2VycyA9IG5ldyBJbnRlZ2VyWzNdOwotCQlpbnRlZ2Vyc1swXSA9IG5ldyBJbnRlZ2VyKDApOwotCQlpbnRlZ2Vyc1sxXSA9IG5ldyBJbnRlZ2VyKDEpOwotCQlpbnRlZ2Vyc1syXSA9IG5ldyBJbnRlZ2VyKDIpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8TnVtYmVyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkR2VuZXJpY0l0ZXJhdG9yKGludGVnZXJzKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscyhpKyssIHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKGludGVnZXJzLmxlbmd0aCwgaSk7Ci0JfQotCi0JSXRlcmF0b3I8TnVtYmVyPiBidWlsZEdlbmVyaWNJdGVyYXRvcihJbnRlZ2VyW10gaW50ZWdlcnMpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPE51bWJlcj4oaW50ZWdlcnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYXJhcmdzKCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8TnVtYmVyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkVmFyQXJnSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscyhpKyssIHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDMsIGkpOwotCX0KLQotCUl0ZXJhdG9yPE51bWJlcj4gYnVpbGRWYXJBcmdJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPE51bWJlcj4obmV3IEludGVnZXIoMCksIG5ldyBJbnRlZ2VyKDEpLCBuZXcgSW50ZWdlcigyKSk7Ci0JfQotCi0Jdm9pZCB0cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcihzdGFydCwgbGVuZ3RoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJlYW0sIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSXRlcmF0b3IodGhpcy5idWlsZEFycmF5KCkpOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcihTdHJpbmdbXSBhcnJheSkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihhcnJheSk7Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEl0ZXJhdG9yKHRoaXMuYnVpbGRBcnJheSgpLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoU3RyaW5nW10gYXJyYXksIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihhcnJheSwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0JU3RyaW5nW10gYnVpbGRBcnJheSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiIH07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWUxNzYyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUxpc3RJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQXJyYXlMaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIEFycmF5SXRlcmF0b3JUZXN0cyB7Ci0KLQlwdWJsaWMgQXJyYXlMaXN0SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJldmlvdXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkQXJyYXkoKS5sZW5ndGgsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91cygpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlpbnQgaSA9IHRoaXMuYnVpbGRBcnJheSgpLmxlbmd0aDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBpLS0sIEludGVnZXIucGFyc2VJbnQoc3RyZWFtLnByZXZpb3VzKCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXgoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91c0luZGV4KCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5wcmV2aW91cygpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uQWRkKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCIzIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0uYWRkKCIzLjUiKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uU2V0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCIzIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0uc2V0KCJ0aHJlZSIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYXRvcjxOdW1iZXI+IGJ1aWxkR2VuZXJpY0l0ZXJhdG9yKEludGVnZXJbXSBpbnRlZ2VycykgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPE51bWJlcj4oaW50ZWdlcnMpOwotCX0KLQotCUBPdmVycmlkZQotCUl0ZXJhdG9yPE51bWJlcj4gYnVpbGRWYXJBcmdJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxOdW1iZXI+KG5ldyBJbnRlZ2VyKDApLCBuZXcgSW50ZWdlcigxKSwgbmV3IEludGVnZXIoMikpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRMaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdEl0ZXJhdG9yKHRoaXMuYnVpbGRBcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTGlzdEl0ZXJhdG9yKFN0cmluZ1tdIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8U3RyaW5nPihhcnJheSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKFN0cmluZ1tdIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8U3RyaW5nPihhcnJheSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKFN0cmluZ1tdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxTdHJpbmc+KGFycmF5LCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2hhaW5JdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NoYWluSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGNkY2YxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2hhaW5JdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNoYWluSXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENoYWluSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczw/PltdIFZFQ1RPUl9ISUVSQVJDSFkgPSB7IFZlY3Rvci5jbGFzcywgQWJzdHJhY3RMaXN0LmNsYXNzLCBBYnN0cmFjdENvbGxlY3Rpb24uY2xhc3MsIE9iamVjdC5jbGFzcyB9OwotCi0JcHVibGljIENoYWluSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPENsYXNzPD8+PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKFZFQ1RPUl9ISUVSQVJDSFkubGVuZ3RoLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8Q2xhc3M8Pz4+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyhWRUNUT1JfSElFUkFSQ0hZLmxlbmd0aCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxDbGFzczw/Pj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBsaW5rIiwgVkVDVE9SX0hJRVJBUkNIWVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8Q2xhc3M8Pz4+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBsaW5rIiwgVkVDVE9SX0hJRVJBUkNIWVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxDbGFzczw/Pj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCUNsYXNzPD8+IGphdmFDbGFzcyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlqYXZhQ2xhc3MgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlqYXZhQ2xhc3MgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgamF2YUNsYXNzLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8Q2xhc3M8Pz4+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkgPT0gQWJzdHJhY3RDb2xsZWN0aW9uLmNsYXNzKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPENsYXNzPD8+PiBidWlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENoYWluSXRlcmF0b3IoVmVjdG9yLmNsYXNzLCB0aGlzLmJ1aWxkTGlua2VyKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8Q2xhc3M8Pz4+IGJ1aWxkSW5uZXJJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJbm5lckNoYWluSXRlcmF0b3IoVmVjdG9yLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPENsYXNzPD8+PiBidWlsZENoYWluSXRlcmF0b3IoQ2xhc3M8Pz4gc3RhcnRMaW5rLCBDaGFpbkl0ZXJhdG9yLkxpbmtlcjxDbGFzczw/Pj4gbGlua2VyKSB7Ci0JCXJldHVybiBuZXcgQ2hhaW5JdGVyYXRvcjxDbGFzczw/Pj4oc3RhcnRMaW5rLCBsaW5rZXIpOwotCX0KLQotCXByaXZhdGUgQ2hhaW5JdGVyYXRvci5MaW5rZXI8Q2xhc3M8Pz4+IGJ1aWxkTGlua2VyKCkgewotCQkvLyBjaGFpbiB1cCB0aGUgY2xhc3MncyBoaWVyYXJjaHkKLQkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhdG9yLkxpbmtlcjxDbGFzczw/Pj4oKSB7Ci0JCQlwdWJsaWMgQ2xhc3M8Pz4gbmV4dExpbmsoQ2xhc3M8Pz4gY3VycmVudExpbmspIHsKLQkJCQlyZXR1cm4gY3VycmVudExpbmsuZ2V0U3VwZXJjbGFzcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8Q2xhc3M8Pz4+IGJ1aWxkSW5uZXJDaGFpbkl0ZXJhdG9yKENsYXNzPD8+IHN0YXJ0TGluaykgewotCQkvLyBjaGFpbiB1cCB0aGUgY2xhc3MncyBoaWVyYXJjaHkKLQkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhdG9yPENsYXNzPD8+PihzdGFydExpbmspIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENsYXNzPD8+IG5leHRMaW5rKENsYXNzPD8+IGN1cnJlbnRMaW5rKSB7Ci0JCQkJcmV0dXJuIGN1cnJlbnRMaW5rLmdldFN1cGVyY2xhc3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYWluSXRlcmF0b3IoKSB7Ci0JCS8vIG1pc3NpbmcgbWV0aG9kIG92ZXJyaWRlCi0JCUl0ZXJhdG9yPENsYXNzPD8+PiBpdGVyYXRvciA9IG5ldyBDaGFpbkl0ZXJhdG9yPENsYXNzPD8+PihWZWN0b3IuY2xhc3MpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlDbGFzczw/PiBjID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbCgiaW52YWxpZCBjbGFzczogIiArIGMuZ2V0TmFtZSgpKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lSXRlcmF0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTljNDVkZi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuTXVsdGlUaHJlYWRlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENsb25lSXRlcmF0b3JUZXN0cwotCWV4dGVuZHMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi17Ci0JQ29sbGVjdGlvbjxTdHJpbmc+IG9yaWdpbmFsQ29sbGVjdGlvbjsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGNvbmN1cnJlbnRDb2xsZWN0aW9uOwotCi0JcHVibGljIENsb25lSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBvcmlnaW5hbFNpemUgPSB0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5zaXplKCk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJLy8gc2hvdWxkIGFsbG93IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uCi0JCQl0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydFRydWUob3JpZ2luYWxTaXplICE9IHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbFNpemUsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5vcmlnaW5hbENvbGxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRJdGVyYXRvci5uZXh0KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRGVmYXVsdCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsaW1pbmF0b3IoKSB7Ci0JCUNsb25lSXRlcmF0b3IuUmVtb3ZlcjxTdHJpbmc+IGVsaW1pbmF0b3IgPSBuZXcgQ2xvbmVJdGVyYXRvci5SZW1vdmVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIGVsZW1lbnQpIHsKLQkJCQlDbG9uZUl0ZXJhdG9yVGVzdHMudGhpcy5vcmlnaW5hbENvbGxlY3Rpb24ucmVtb3ZlKGVsZW1lbnQpOwotCQkJfQotCQl9OwotCQl0aGlzLnZlcmlmeVJlbW92ZShuZXcgQ2xvbmVJdGVyYXRvcjxTdHJpbmc+KHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLCBlbGltaW5hdG9yKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVN1YmNsYXNzKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZShuZXcgQ2xvbmVJdGVyYXRvcjxTdHJpbmc+KHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShTdHJpbmcgY3VycmVudCkgewotCQkJCUNsb25lSXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5yZW1vdmUoY3VycmVudCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFRlc3QgY29uY3VycmVudCBhY2Nlc3M6IEZpcnN0IGJ1aWxkIGEgY2xvbmUgaXRlcmF0b3IgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKLQkgKiB0aGF0IGhhbmdzIG1vbWVudGFyaWx5IGR1cmluZyBpdHMgY29uc3RydWN0aW9uOyB0aGVuIG1vZGlmeSB0aGUgc2hhcmVkCi0JICogY29sbGVjdGlvbiBpbiB0aGlzIHRocmVhZC4gVGhpcyB3b3VsZCBjYXVzZSBhCi0JICogQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpbiB0aGUgb3RoZXIgdGhyZWFkIGlmIHRoZSBjbG9uZSBpdGVyYXRvcgotCSAqIHdlcmUgbm90IHN5bmNocm9uaXplZCBvbiB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY3VycmVudEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTbG93Q29sbGVjdGlvbjxTdHJpbmc+IHNsb3cgPSBuZXcgU2xvd0NvbGxlY3Rpb248U3RyaW5nPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihzbG93KTsKLQkJLy8gdXNpbmcgdGhlIHVuc3luY2hyb25pemVkIGNvbGxlY3Rpb24gd2lsbCBjYXVzZSB0aGUgdGVzdCB0byBmYWlsCi0JCS8vCQl0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbiA9IHNsb3c7Ci0JCXRoaXMub3JpZ2luYWxDb2xsZWN0aW9uID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkQ29sbGVjdGlvbihzbG93KTsKLQotCQl0aGlzLmNvbmN1cnJlbnRDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVRocmVhZCB0aHJlYWQgPSB0aGlzLmJ1aWxkVGhyZWFkKHRoaXMuYnVpbGRSdW5uYWJsZSgpKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCXdoaWxlICggISBzbG93Lmhhc1N0YXJ0ZWRDbG9uZSgpKSB7Ci0JCQkvLyB3YWl0IGZvciB0aGUgb3RoZXIgdGhyZWFkIHRvIHN0YXJ0IHRoZSBjbG9uZS4uLgotCQkJVGhyZWFkLnlpZWxkKCk7Ci0JCX0KLQkJLy8gLi4udGhlbiBzbmVhayBpbiBhbiBleHRyYSBlbGVtZW50Ci0JCXRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLmFkZCgic2V2ZW50ZWVuIik7Ci0JCXRocmVhZC5qb2luKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBleHBlY3RlZCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihleHBlY3RlZCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgdGhpcy5jb25jdXJyZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RSdW5uYWJsZSgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcnVuXygpIHRocm93cyBUaHJvd2FibGUgewotCQkJCUNsb25lSXRlcmF0b3JUZXN0cy50aGlzLmxvb3BXaXRoQ2xvbmVJdGVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIHVzZSBhIGNsb25lIGl0ZXJhdG9yIHRvIGxvb3Agb3ZlciB0aGUgInNsb3ciIGNvbGxlY3Rpb24gYW5kIGNvcHkgaXRzCi0JICogY29udGVudHMgdG8gdGhlIGNvbmN1cnJlbnQgY29sbGVjdGlvbgotCSAqLwotCXZvaWQgbG9vcFdpdGhDbG9uZUl0ZXJhdG9yKCkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXRoaXMuY29uY3VycmVudENvbGxlY3Rpb24uYWRkKHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZShJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCU9iamVjdCByZW1vdmVkID0gInRocmVlIjsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5jb250YWlucyhyZW1vdmVkKSk7Ci0JCS8vIHRyeSB0byByZW1vdmUgYmVmb3JlIGNhbGxpbmcgI25leHQoKQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKHJlbW92ZWQpKSB7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJLy8gdHJ5IHRvIHJlbW92ZSB0d2ljZQotCQkJCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RmFsc2UodGhpcy5vcmlnaW5hbENvbGxlY3Rpb24uY29udGFpbnMocmVtb3ZlZCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZENsb25lSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ2xvbmVJdGVyYXRvcih0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ2xvbmVJdGVyYXRvcihDb2xsZWN0aW9uPFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8U3RyaW5nPihjKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZEVtcHR5Q29sbGVjdGlvbigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihjKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZEVtcHR5Q29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxTdHJpbmc+IGMpIHsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQljLmFkZCgiZm91ciIpOwotCQljLmFkZCgiZml2ZSIpOwotCQljLmFkZCgic2l4Iik7Ci0JCWMuYWRkKCJzZXZlbiIpOwotCQljLmFkZCgiZWlnaHQiKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGN1c3RvbSBjb2xsZWN0aW9uICoqKioqKioqKioKLQlzdGF0aWMgY2xhc3MgU2xvd0NvbGxlY3Rpb248RT4gZXh0ZW5kcyBBcnJheUxpc3Q8RT4gewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBib29sZWFuIGhhc1N0YXJ0ZWRDbG9uZSA9IGZhbHNlOwotCi0JCXB1YmxpYyBTbG93Q29sbGVjdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCQl0aGlzLnNldEhhc1N0YXJ0ZWRDbG9uZSh0cnVlKTsKLQkJCS8vIHRha2UgYSBsaXR0bGUgc25vb3plIGJlZm9yZSByZXR1cm5pbmcgdGhlIGFycmF5Ci0JCQlUZXN0VG9vbHMuc2xlZXAoMTAwKTsKLQkJCXJldHVybiBzdXBlci50b0FycmF5KCk7Ci0JCX0KLQotCQlzeW5jaHJvbml6ZWQgdm9pZCBzZXRIYXNTdGFydGVkQ2xvbmUoYm9vbGVhbiBoYXNTdGFydGVkQ2xvbmUpIHsKLQkJCXRoaXMuaGFzU3RhcnRlZENsb25lID0gaGFzU3RhcnRlZENsb25lOwotCQl9Ci0KLQkJc3luY2hyb25pemVkIGJvb2xlYW4gaGFzU3RhcnRlZENsb25lKCkgewotCQkJcmV0dXJuIHRoaXMuaGFzU3RhcnRlZENsb25lOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lTGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjNhODQxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5NdWx0aVRocmVhZGVkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cwotCWV4dGVuZHMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi17Ci0JTGlzdDxTdHJpbmc+IG9yaWdpbmFsTGlzdDsKLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGNvbmN1cnJlbnRMaXN0OwotCi0JcHVibGljIENsb25lTGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vcmlnaW5hbExpc3QgPSB0aGlzLmJ1aWxkTGlzdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgb3JpZ2luYWxTaXplID0gdGhpcy5vcmlnaW5hbExpc3Quc2l6ZSgpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJLy8gc2hvdWxkIGFsbG93IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uCi0JCQl0aGlzLm9yaWdpbmFsTGlzdC5hZGQoImZvbyIpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydFRydWUob3JpZ2luYWxTaXplICE9IHRoaXMub3JpZ2luYWxMaXN0LnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbFNpemUsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleCgpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gY2xvbmVMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkTGlzdEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYXRvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDc7IGkrKykgewotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCWNsb25lTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dEluZGV4KCksIGNsb25lTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpLCBjbG9uZUxpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCkpOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCW5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCQkJY2xvbmVMaXN0SXRlcmF0b3IucHJldmlvdXMoKTsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dEluZGV4KCksIGNsb25lTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpLCBjbG9uZUxpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCkpOwotCQl9Ci0KLQkJd2hpbGUgKG5lc3RlZExpc3RJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCW5lc3RlZExpc3RJdGVyYXRvci5uZXh0KCk7Ci0JCQljbG9uZUxpc3RJdGVyYXRvci5uZXh0KCk7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpLCBjbG9uZUxpc3RJdGVyYXRvci5uZXh0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSwgY2xvbmVMaXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNQcmV2aW91cygpIHsKLQkJaW50IG9yaWdpbmFsU2l6ZSA9IHRoaXMub3JpZ2luYWxMaXN0LnNpemUoKTsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQl0aGlzLm9yaWdpbmFsTGlzdC5hZGQoImZvbyIpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydFRydWUob3JpZ2luYWxTaXplICE9IHRoaXMub3JpZ2luYWxMaXN0LnNpemUoKSk7Ci0JCW9yaWdpbmFsU2l6ZSA9IHRoaXMub3JpZ2luYWxMaXN0LnNpemUoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCS8vIHNob3VsZCBhbGxvdyBjb25jdXJyZW50IG1vZGlmaWNhdGlvbgotCQkJdGhpcy5vcmlnaW5hbExpc3QuYWRkKCJiYXIiKTsKLQkJCWktLTsKLQkJfQotCQlhc3NlcnRUcnVlKG9yaWdpbmFsU2l6ZSAhPSB0aGlzLm9yaWdpbmFsTGlzdC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZXZpb3VzKCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXMoKSwgc3RyZWFtLnByZXZpb3VzKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5wcmV2aW91cygpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeURlZmF1bHQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5hZGQoInRocmVlIGFuZCBhIGhhbGYiKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5zZXQoImFub3RoZXIgdGhyZWUiKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU11dGF0b3JOZXh0KCkgewotCQl0aGlzLnZlcmlmeU1vZGlmeU5leHQobmV3IENsb25lTGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5vcmlnaW5hbExpc3QsIHRoaXMuYnVpbGRNdXRhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TXV0YXRvclByZXZpb3VzKCkgewotCQl0aGlzLnZlcmlmeU1vZGlmeVByZXZpb3VzKG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMub3JpZ2luYWxMaXN0LCB0aGlzLmJ1aWxkTXV0YXRvcigpKSk7Ci0JfQotCi0JcHJpdmF0ZSBDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yPFN0cmluZz4gYnVpbGRNdXRhdG9yKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIFN0cmluZyBvKSB7Ci0JCQkJQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsTGlzdC5hZGQoaW5kZXgsIG8pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCQkJQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsTGlzdC5yZW1vdmUoaW5kZXgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4LCBTdHJpbmcgbykgewotCQkJCUNsb25lTGlzdEl0ZXJhdG9yVGVzdHMudGhpcy5vcmlnaW5hbExpc3Quc2V0KGluZGV4LCBvKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3ViY2xhc3NOZXh0KCkgewotCQl0aGlzLnZlcmlmeU1vZGlmeU5leHQodGhpcy5idWlsZFN1YmNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTdWJjbGFzc1ByZXZpb3VzKCkgewotCQl0aGlzLnZlcmlmeU1vZGlmeVByZXZpb3VzKHRoaXMuYnVpbGRTdWJjbGFzcygpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkU3ViY2xhc3MoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLm9yaWdpbmFsTGlzdCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGQoaW50IGN1cnJlbnRJbmRleCwgU3RyaW5nIG8pIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxMaXN0LmFkZChjdXJyZW50SW5kZXgsIG8pOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShpbnQgY3VycmVudEluZGV4KSB7Ci0JCQkJQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsTGlzdC5yZW1vdmUoY3VycmVudEluZGV4KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXQoaW50IGN1cnJlbnRJbmRleCwgU3RyaW5nIG8pIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxMaXN0LnNldChjdXJyZW50SW5kZXgsIG8pOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlNb2RpZnlOZXh0KExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCVN0cmluZyByZW1vdmVkID0gInRocmVlIjsKLQkJU3RyaW5nIGFkZGVkQWZ0ZXIgPSAiZml2ZSI7Ci0JCVN0cmluZyBhZGRlZCA9ICJmaXZlIGFuZCBhIGhhbGYiOwotCQlTdHJpbmcgcmVwbGFjZWQgPSAic2V2ZW4iOwotCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSAiYW5vdGhlciBzZXZlbiI7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVtb3ZlZCkpOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKGFkZGVkQWZ0ZXIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZXBsYWNlZCkpOwotCQkvLyB0cnkgdG8gcmVtb3ZlIGJlZm9yZSBjYWxsaW5nICNuZXh0KCkKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0LmVxdWFscyhhZGRlZEFmdGVyKSkgewotCQkJCWl0ZXJhdG9yLmFkZChhZGRlZCk7Ci0JCQl9Ci0JCQlpZiAobmV4dC5lcXVhbHMocmVtb3ZlZCkpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkvLyB0cnkgdG8gcmVtb3ZlIHR3aWNlCi0JCQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJCQl0cnkgewotCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQkJCX0KLQkJCWlmIChuZXh0LmVxdWFscyhyZXBsYWNlZCkpIHsKLQkJCQlpdGVyYXRvci5zZXQocmVwbGFjZW1lbnQpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMoYWRkZWQpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVtb3ZlZCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZXBsYWNlZCkpOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlcGxhY2VtZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU1vZGlmeVByZXZpb3VzKExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCVN0cmluZyByZW1vdmVkID0gInRocmVlIjsKLQkJU3RyaW5nIGFkZGVkQmVmb3JlID0gImZpdmUiOwotCQlTdHJpbmcgYWRkZWQgPSAiZm91ciBhbmQgYSBoYWxmIjsKLQkJU3RyaW5nIHJlcGxhY2VkID0gInNldmVuIjsKLQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gImFub3RoZXIgc2V2ZW4iOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlbW92ZWQpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhhZGRlZEJlZm9yZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlcGxhY2VkKSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoaXRlcmF0b3IuaGFzUHJldmlvdXMoKSkgewotCQkJT2JqZWN0IHByZXZpb3VzID0gaXRlcmF0b3IucHJldmlvdXMoKTsKLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoYWRkZWRCZWZvcmUpKSB7Ci0JCQkJaXRlcmF0b3IuYWRkKGFkZGVkKTsKLQkJCX0KLQkJCWlmIChwcmV2aW91cy5lcXVhbHMocmVtb3ZlZCkpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkvLyB0cnkgdG8gcmVtb3ZlIHR3aWNlCi0JCQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQkJCXRyeSB7Ci0JCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCQkJfQotCQkJaWYgKHByZXZpb3VzLmVxdWFscyhyZXBsYWNlZCkpIHsKLQkJCQlpdGVyYXRvci5zZXQocmVwbGFjZW1lbnQpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMoYWRkZWQpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVtb3ZlZCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZXBsYWNlZCkpOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlcGxhY2VtZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZENsb25lTGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKHRoaXMub3JpZ2luYWxMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoTGlzdDxTdHJpbmc+IGxpc3QpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxTdHJpbmc+KGxpc3QpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLm9yaWdpbmFsTGlzdC5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZEVtcHR5TGlzdCgpOwotCQl0aGlzLnBvcHVsYXRlTGlzdChsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTGlzdChMaXN0PFN0cmluZz4gbGlzdCkgewotCQlsaXN0LmFkZCgiemVybyIpOwotCQlsaXN0LmFkZCgib25lIik7Ci0JCWxpc3QuYWRkKCJ0d28iKTsKLQkJbGlzdC5hZGQoInRocmVlIik7Ci0JCWxpc3QuYWRkKCJmb3VyIik7Ci0JCWxpc3QuYWRkKCJmaXZlIik7Ci0JCWxpc3QuYWRkKCJzaXgiKTsKLQkJbGlzdC5hZGQoInNldmVuIik7Ci0JCWxpc3QuYWRkKCJlaWdodCIpOwotCQlsaXN0LmFkZCgibmluZSIpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gYnVpbGRFbXB0eUxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGNvbmN1cnJlbnQgYWNjZXNzOiBGaXJzdCBidWlsZCBhIGNsb25lIGl0ZXJhdG9yIGluIGEgc2VwYXJhdGUgdGhyZWFkCi0JICogdGhhdCBoYW5ncyBtb21lbnRhcmlseSBkdXJpbmcgaXRzIGNvbnN0cnVjdGlvbjsgdGhlbiBtb2RpZnkgdGhlIHNoYXJlZAotCSAqIGNvbGxlY3Rpb24gaW4gdGhpcyB0aHJlYWQuIFRoaXMgd291bGQgY2F1c2UgYQotCSAqIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gaW4gdGhlIG90aGVyIHRocmVhZCBpZiB0aGUgY2xvbmUgaXRlcmF0b3IKLQkgKiB3ZXJlIG5vdCBzeW5jaHJvbml6ZWQgb24gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENvbmN1cnJlbnRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQ2xvbmVJdGVyYXRvclRlc3RzLlNsb3dDb2xsZWN0aW9uPFN0cmluZz4gc2xvdyA9IG5ldyBDbG9uZUl0ZXJhdG9yVGVzdHMuU2xvd0NvbGxlY3Rpb248U3RyaW5nPigpOwotCQl0aGlzLnBvcHVsYXRlTGlzdChzbG93KTsKLQkJLy8gdXNpbmcgdGhlIHVuc3luY2hyb25pemVkIGxpc3Qgd2lsbCBjYXVzZSB0aGUgdGVzdCB0byBmYWlsCi0JCS8vIHRoaXMub3JpZ2luYWxMaXN0ID0gc2xvdzsKLQkJdGhpcy5vcmlnaW5hbExpc3QgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KHNsb3cpOwotCi0JCXRoaXMuY29uY3VycmVudExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJVGhyZWFkIHRocmVhZCA9IHRoaXMuYnVpbGRUaHJlYWQodGhpcy5idWlsZFJ1bm5hYmxlKCkpOwotCQl0aHJlYWQuc3RhcnQoKTsKLQkJd2hpbGUgKCAhIHNsb3cuaGFzU3RhcnRlZENsb25lKCkpIHsKLQkJCS8vIHdhaXQgZm9yIHRoZSBvdGhlciB0aHJlYWQgdG8gc3RhcnQgdGhlIGNsb25lLi4uCi0JCQlUaHJlYWQueWllbGQoKTsKLQkJfQotCQkvLyAuLi50aGVuIHNuZWFrIGluIGFuIGV4dHJhIGVsZW1lbnQKLQkJdGhpcy5vcmlnaW5hbExpc3QuYWRkKCJzZXZlbnRlZW4iKTsKLQkJdGhyZWFkLmpvaW4oKTsKLQkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMucG9wdWxhdGVMaXN0KGV4cGVjdGVkKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbmN1cnJlbnRMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUnVubmFibGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFJ1bm5hYmxlKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBydW5fKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCQkJQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy50aGlzLmxvb3BXaXRoQ2xvbmVMaXN0SXRlcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiB1c2UgYSBjbG9uZSBpdGVyYXRvciB0byBsb29wIG92ZXIgdGhlICJzbG93IiBjb2xsZWN0aW9uIGFuZCBjb3B5IGl0cwotCSAqIGNvbnRlbnRzIHRvIHRoZSBjb25jdXJyZW50IGNvbGxlY3Rpb24KLQkgKi8KLQl2b2lkIGxvb3BXaXRoQ2xvbmVMaXN0SXRlcmF0b3IoKSB7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQl0aGlzLmNvbmN1cnJlbnRMaXN0LmFkZChzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVJdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE3ZGJkNy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbm90aGVyKCkgewotCQl0aGlzLnZlcmlmeUhhc0Fub3RoZXIodGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbm90aGVyMigpIHsKLQkJdGhpcy52ZXJpZnlIYXNBbm90aGVyKHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0Fub3RoZXIzKCkgewotCQl0aGlzLnZlcmlmeUhhc0Fub3RoZXIodGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yMygpKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeUhhc0Fub3RoZXIoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJdGhpcy52ZXJpZnlIYXNBbm90aGVyKDgsIHN0cmVhbSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlIYXNBbm90aGVyKGludCBleHBlY3RlZCwgSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm90aGVyKCkgewotCQl0aGlzLnZlcmlmeUFub3RoZXIodGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm90aGVyMigpIHsKLQkJdGhpcy52ZXJpZnlBbm90aGVyKHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFub3RoZXIzKCkgewotCQl0aGlzLnZlcmlmeUFub3RoZXIodGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yMygpKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeUFub3RoZXIoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJdGhpcy52ZXJpZnlBbm90aGVyKDEsIHN0cmVhbSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlBbm90aGVyKGludCBzdGFydCwgSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJaW50IGluZGV4ID0gc3RhcnQ7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBTdHJpbmcudmFsdWVPZihpbmRleCsrKSwgc3RyZWFtLm5leHQoKS5zdWJzdHJpbmcoMCwgMSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlSZW1vdmUoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRMaXN0MSgpOwotCQlPYmplY3QgbGFzdEVsZW1lbnQxID0gbGlzdDEuZ2V0KGxpc3QxLnNpemUoKSAtIDEpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSB0aGlzLmJ1aWxkTGlzdDIoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QzID0gdGhpcy5idWlsZExpc3QzKCk7Ci0KLQkJTGlzdDxJdGVyYXRvcjxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJdGVyYXRvcjxTdHJpbmc+PigpOwotCQlsaXN0LmFkZChsaXN0MS5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGxpc3QyLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDMubGlzdEl0ZXJhdG9yKCkpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKG5leHQuZXF1YWxzKCIzMzMiKSkgewotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCX0KLQkJCS8vIHRlc3Qgc3BlY2lhbCBjYXNlIC0gd2hlcmUgd2UgYXJlIGJldHdlZW4gaXRlcmF0b3JzCi0JCQlpZiAobmV4dC5lcXVhbHMobGFzdEVsZW1lbnQxKSkgewotCQkJCS8vIHRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBuZXh0IGl0ZXJhdG9yIHRvIGJlIGxvYWRlZAotCQkJCXN0cmVhbS5oYXNOZXh0KCk7Ci0JCQkJLy8gbm93IHRyeSB0byByZW1vdmUgZnJvbSB0aGUgcHJldmlvdXMgaXRlcmF0b3IKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJc3RyZWFtLnJlbW92ZSgpOwotCi0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAxIiwgdGhpcy5idWlsZExpc3QxKCkuc2l6ZSgpIC0gMiwgbGlzdDEuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMoIjMzMyIpKTsKLQkJYXNzZXJ0RmFsc2UoImxhc3QgZWxlbWVudCBzdGlsbCBpbiBjb2xsZWN0aW9uIDEiLCBsaXN0MS5jb250YWlucyhsYXN0RWxlbWVudDEpKTsKLQkJYXNzZXJ0VHJ1ZSgid3JvbmcgZWxlbWVudCByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMoIjIyIikpOwotCi0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAzIiwgdGhpcy5idWlsZExpc3QzKCkuc2l6ZSgpIC0gMSwgbGlzdDMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiAzIiwgbGlzdDMuY29udGFpbnMoIjg4ODg4ODg4IikpOwotCQlhc3NlcnRUcnVlKCJ3cm9uZyBlbGVtZW50IHJlbW92ZWQgZnJvbSBjb2xsZWN0aW9uIDMiLCBsaXN0My5jb250YWlucygiNjY2NjY2IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVFbGVtZW50KCkgewotCQlTdHJpbmcgaXRlbSA9ICIwIjsKLQkJdGhpcy52ZXJpZnlIYXNBbm90aGVyKDksIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcihpdGVtLCB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSkpOwotCQl0aGlzLnZlcmlmeUFub3RoZXIoMCwgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKGl0ZW0sIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCXRoaXMudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbih0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQl0aGlzLnZlcmlmeVVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKHRoaXMuYnVpbGRVbm1vZGlmaWFibGVDb21wb3NpdGVJdGVyYXRvcigpKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeVVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHN0cmluZy5lcXVhbHMoIjMzMyIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCX0KLQotCXZvaWQgdmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbih0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJc3RyZWFtLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlIYXNBbm90aGVyMSgpIHsKLQkJdGhpcy52ZXJpZnlFbXB0eUhhc0Fub3RoZXIodGhpcy5idWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IxKCkpOwotCX0KLQotCXZvaWQgdmVyaWZ5RW1wdHlIYXNBbm90aGVyKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eU5vU3VjaEVsZW1lbnRFeGNlcHRpb24xKCkgewotCQl0aGlzLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24odGhpcy5idWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjEoKSB7Ci0JCXRoaXMudmVyaWZ5RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24xKCk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjEoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKHRoaXMuYnVpbGRFbXB0eUNvbXBvc2l0ZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlIYXNBbm90aGVyMigpIHsKLQkJdGhpcy52ZXJpZnlFbXB0eUhhc0Fub3RoZXIodGhpcy5idWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eU5vU3VjaEVsZW1lbnRFeGNlcHRpb24yKCkgewotCQl0aGlzLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24odGhpcy5idWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjIoKSB7Ci0JCXRoaXMudmVyaWZ5RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24yKCk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjIoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKHRoaXMuYnVpbGRFbXB0eUNvbXBvc2l0ZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IodGhpcy5idWlsZEl0ZXJhdG9ycygpKTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkRW1wdHlDb21wb3NpdGVJdGVyYXRvcjEoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IodGhpcy5idWlsZEVtcHR5SXRlcmF0b3JzMSgpKTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkRW1wdHlDb21wb3NpdGVJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IodGhpcy5idWlsZEVtcHR5SXRlcmF0b3JzMigpKTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlQ29tcG9zaXRlSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IodGhpcy5idWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9ycygpKTsKLQl9Ci0KLQkvLyBsZWF2ZSB1bmNoZWNrZWQgc28gd2UgY2FuIG92ZXJyaWRlIGluIHN1YmNsYXNzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9ycykgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4oaXRlcmF0b3JzKTsKLQl9Ci0KLQkvLyB1c2UgdmFyYXJnIGNvbnN0cnVjdG9yCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KHRoaXMuYnVpbGRJdGVyYXRvcjEoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMigpLCB0aGlzLmJ1aWxkSXRlcmF0b3IzKCkpOwotCX0KLQotCS8vIHVzZSB2YXJhcmcgY29uc3RydWN0b3IKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4obmV3IEl0ZXJhdG9yW10geyB0aGlzLmJ1aWxkSXRlcmF0b3IxKCksIHRoaXMuYnVpbGRJdGVyYXRvcjIoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMygpIH0pOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcihTdHJpbmcgc3RyaW5nLCBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPihzdHJpbmcsIGl0ZXJhdG9yKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8SXRlcmF0b3I8U3RyaW5nPj4gYnVpbGRJdGVyYXRvcnMoKSB7Ci0JCUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZEl0ZXJhdG9yMSgpKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZEl0ZXJhdG9yMigpKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZEl0ZXJhdG9yMygpKTsKLQkJcmV0dXJuIGxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPEl0ZXJhdG9yPFN0cmluZz4+IGJ1aWxkRW1wdHlJdGVyYXRvcnMxKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEVtcHR5SXRlcmF0b3JJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxJdGVyYXRvcjxTdHJpbmc+PiBidWlsZEVtcHR5SXRlcmF0b3JzMigpIHsKLQkJTGlzdDxJdGVyYXRvcjxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJdGVyYXRvcjxTdHJpbmc+PigpOwotCQlsaXN0LmFkZCh0aGlzLmJ1aWxkRW1wdHlTdHJpbmdJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZEVtcHR5U3RyaW5nSXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKHRoaXMuYnVpbGRFbXB0eVN0cmluZ0l0ZXJhdG9yKCkpOwotCQlyZXR1cm4gbGlzdC5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8SXRlcmF0b3I8U3RyaW5nPj4gYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcnMoKSB7Ci0JCUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yMSgpKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yMigpKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yMygpKTsKLQkJcmV0dXJuIGxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcjEoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdDEoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0MigpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IzKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3QzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcjEoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTGlzdDEoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRVbm1vZGlmaWFibGVMaXN0MigpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IzKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFVubW9kaWZpYWJsZUxpc3QzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPEl0ZXJhdG9yPFN0cmluZz4+IGJ1aWxkRW1wdHlJdGVyYXRvckl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKSkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRFbXB0eVN0cmluZ0l0ZXJhdG9yKCkgewotCQlyZXR1cm4gKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0PFN0cmluZz4gYnVpbGRMaXN0MSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQkJbGlzdC5hZGQoIjIyIik7Ci0JCWxpc3QuYWRkKCIzMzMiKTsKLQkJbGlzdC5hZGQoIjQ0NDQiKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdDIoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQl9Ci0KLQlMaXN0PFN0cmluZz4gYnVpbGRMaXN0MygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjU1NTU1Iik7Ci0JCWxpc3QuYWRkKCI2NjY2NjYiKTsKLQkJbGlzdC5hZGQoIjc3Nzc3NzciKTsKLQkJbGlzdC5hZGQoIjg4ODg4ODg4Iik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCUxpc3Q8U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZUxpc3QxKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh0aGlzLmJ1aWxkTGlzdDEoKSk7Ci0JfQotCi0JTGlzdDxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTGlzdDIoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHRoaXMuYnVpbGRMaXN0MigpKTsKLQl9Ci0KLQlMaXN0PFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVMaXN0MygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodGhpcy5idWlsZExpc3QzKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTQ0ZTg2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlTGlzdEl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMgewotCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCXN1cGVyLnRlc3RSZW1vdmUoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZExpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRMaXN0MigpOwotCQlMaXN0PFN0cmluZz4gbGlzdDMgPSB0aGlzLmJ1aWxkTGlzdDMoKTsKLQkJT2JqZWN0IGZpcnN0RWxlbWVudDMgPSBsaXN0My5nZXQoMCk7Ci0KLQkJTGlzdDxJdGVyYXRvcjxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJdGVyYXRvcjxTdHJpbmc+PigpOwotCQlsaXN0LmFkZChsaXN0MS5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGxpc3QyLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDMubGlzdEl0ZXJhdG9yKCkpOwotCi0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCQkvLyBwb3NpdGlvbiB0byBlbmQgb2Ygc3RyZWFtCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJT2JqZWN0IHByZXZpb3VzID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpZiAocHJldmlvdXMuZXF1YWxzKCIzMzMiKSkgewotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCX0KLQkJCS8vIHRlc3Qgc3BlY2lhbCBjYXNlIC0gd2hlcmUgd2UgYXJlIGJldHdlZW4gaXRlcmF0b3JzCi0JCQlpZiAocHJldmlvdXMuZXF1YWxzKGZpcnN0RWxlbWVudDMpKSB7Ci0JCQkJLy8gdGhpcyB3aWxsIHRyaWdnZXIgdGhlIG5leHQgaXRlcmF0b3IgdG8gYmUgbG9hZGVkCi0JCQkJc3RyZWFtLmhhc1ByZXZpb3VzKCk7Ci0JCQkJLy8gbm93IHRyeSB0byByZW1vdmUgZnJvbSB0aGUgcHJldmlvdXMgaXRlcmF0b3IKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJc3RyZWFtLnJlbW92ZSgpOwotCi0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAxIiwgdGhpcy5idWlsZExpc3QxKCkuc2l6ZSgpIC0gMiwgbGlzdDEuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMoIjEiKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24gMSIsIGxpc3QxLmNvbnRhaW5zKCIzMzMiKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJub3RoaW5nIHJlbW92ZWQgZnJvbSBjb2xsZWN0aW9uIDMiLCB0aGlzLmJ1aWxkTGlzdDMoKS5zaXplKCkgLSAxLCBsaXN0My5zaXplKCkpOwotCQlhc3NlcnRGYWxzZSgiZmlyc3QgZWxlbWVudCBzdGlsbCBpbiBjb2xsZWN0aW9uIDMiLCBsaXN0My5jb250YWlucyhmaXJzdEVsZW1lbnQzKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCBmcm9tIGNvbGxlY3Rpb24gMyIsIGxpc3QzLmNvbnRhaW5zKCI2NjY2NjYiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZExpc3QxKCk7Ci0JCU9iamVjdCBsYXN0RWxlbWVudDEgPSBsaXN0MS5nZXQobGlzdDEuc2l6ZSgpIC0gMSk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRMaXN0MigpOwotCQlMaXN0PFN0cmluZz4gbGlzdDMgPSB0aGlzLmJ1aWxkTGlzdDMoKTsKLQkJT2JqZWN0IGZpcnN0RWxlbWVudDMgPSBsaXN0My5nZXQoMCk7Ci0KLQkJTGlzdDxJdGVyYXRvcjxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJdGVyYXRvcjxTdHJpbmc+PigpOwotCQlsaXN0LmFkZChsaXN0MS5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGxpc3QyLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDMubGlzdEl0ZXJhdG9yKCkpOwotCi0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKG5leHQuZXF1YWxzKCIzMzMiKSkgewotCQkJCXN0cmVhbS5hZGQoIjMuNSIpOwotCQkJfQotCQkJLy8gdGVzdCBzcGVjaWFsIGNhc2UgLSB3aGVyZSB3ZSBhcmUgYmV0d2VlbiBpdGVyYXRvcnMKLQkJCWlmIChuZXh0LmVxdWFscyhsYXN0RWxlbWVudDEpKSB7Ci0JCQkJLy8gdGhpcyB3aWxsIHRyaWdnZXIgdGhlIG5leHQgaXRlcmF0b3IgdG8gYmUgbG9hZGVkCi0JCQkJc3RyZWFtLmhhc05leHQoKTsKLQkJCQkvLyBub3cgdHJ5IHRvIGFkZCB0byB0aGUgaXRlcmF0b3IKLQkJCQlzdHJlYW0uYWRkKCJzb21ldGhpbmcgaW4gMyIpOwotCQkJfQotCQl9Ci0JCXN0cmVhbS5hZGQoImZpbmFsZSIpOwotCQlib29sZWFuIGNoZWNrRm9yRmluYWxlID0gdHJ1ZTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlPYmplY3QgcHJldmlvdXMgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWlmIChjaGVja0ZvckZpbmFsZSkgewotCQkJCWNoZWNrRm9yRmluYWxlID0gZmFsc2U7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJhZGRlZCBlbGVtZW50IGRyb3BwZWQiLCAiZmluYWxlIiwgcHJldmlvdXMpOwotCQkJfQotCQkJaWYgKHByZXZpb3VzLmVxdWFscygiMzMzIikpIHsKLQkJCQlzdHJlYW0uYWRkKCIyLjUiKTsKLQkJCX0KLQkJCS8vIHRlc3Qgc3BlY2lhbCBjYXNlIC0gd2hlcmUgd2UgYXJlIGJldHdlZW4gaXRlcmF0b3JzCi0JCQlpZiAocHJldmlvdXMuZXF1YWxzKGZpcnN0RWxlbWVudDMpKSB7Ci0JCQkJLy8gdGhpcyB3aWxsIHRyaWdnZXIgdGhlIG5leHQgaXRlcmF0b3IgdG8gYmUgbG9hZGVkCi0JCQkJc3RyZWFtLmhhc1ByZXZpb3VzKCk7Ci0JCQkJLy8gbm93IHRyeSB0byByZW1vdmUgZnJvbSB0aGUgcHJldmlvdXMgaXRlcmF0b3IKLQkJCQlzdHJlYW0uYWRkKCJvbGQgc3RhcnQgb2YgMyIpOwotCQkJfQotCQl9Ci0JCXN0cmVhbS5hZGQoInByZWx1ZGUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRlZCBlbGVtZW50IGRyb3BwZWQiLCAicHJlbHVkZSIsIHN0cmVhbS5wcmV2aW91cygpKTsKLQotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnRzIG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDEiLCB0aGlzLmJ1aWxkTGlzdDEoKS5zaXplKCkgKyAzLCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMSIsICJwcmVsdWRlIiwgbGlzdDEuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDEiLCAiMi41IiwgbGlzdDEuZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDEiLCAiMy41IiwgbGlzdDEuZ2V0KDUpKTsKLQotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnRzIG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDMiLCB0aGlzLmJ1aWxkTGlzdDMoKS5zaXplKCkgKyAzLCBsaXN0My5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMyIsICJzb21ldGhpbmcgaW4gMyIsIGxpc3QzLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3QgYWRkZWQgdG8gY29sbGVjdGlvbiAzIiwgIm9sZCBzdGFydCBvZiAzIiwgbGlzdDMuZ2V0KDEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDMiLCAiZmluYWxlIiwgbGlzdDMuZ2V0KGxpc3QzLnNpemUoKSAtIDEpKTsKLQotCQkvLyBhZGQgdG8gdGhlIGZyb250Ci0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0RmFsc2UoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ubmV4dCgpLmVxdWFscygiYmxhaCIpKTsKLQotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydFRydWUoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ucHJldmlvdXMoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydEZhbHNlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLm5leHQoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydFRydWUoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ucHJldmlvdXMoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJLy8gYWRkIHRvIHRoZSBtaWRkbGUKLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJc3RyZWFtLm5leHQoKTsKLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRGYWxzZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJibGFoIikpOwotCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXN0cmVhbS5uZXh0KCk7Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0VHJ1ZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5wcmV2aW91cygpLmVxdWFscygiYmxhaCIpKTsKLQotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRGYWxzZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJibGFoIikpOwotCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXN0cmVhbS5wcmV2aW91cygpOwotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydFRydWUoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ucHJldmlvdXMoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJLy8gYWRkIHRvIHRoZSBlbmQKLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRGYWxzZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5oYXNOZXh0KCkpOwotCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0VHJ1ZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5wcmV2aW91cygpLmVxdWFscygiYmxhaCIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkTGlzdDEoKTsKLQkJT2JqZWN0IGxhc3RFbGVtZW50MSA9IGxpc3QxLmdldChsaXN0MS5zaXplKCkgLSAxKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gdGhpcy5idWlsZExpc3QyKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MyA9IHRoaXMuYnVpbGRMaXN0MygpOwotCQlPYmplY3QgZmlyc3RFbGVtZW50MyA9IGxpc3QzLmdldCgwKTsKLQotCQlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKGxpc3QxLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDIubGlzdEl0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZChsaXN0My5saXN0SXRlcmF0b3IoKSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IobGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JCS8vIHBvc2l0aW9uIHRvIGVuZCBvZiBzdHJlYW0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBuZXh0ID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChuZXh0LmVxdWFscygiMzMzIikpIHsKLQkJCQlzdHJlYW0uc2V0KCIzMzNhIik7Ci0JCQl9Ci0JCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSAtIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIGl0ZXJhdG9ycwotCQkJaWYgKG5leHQuZXF1YWxzKGxhc3RFbGVtZW50MSkpIHsKLQkJCQkvLyB0aGlzIHdpbGwgdHJpZ2dlciB0aGUgbmV4dCBpdGVyYXRvciB0byBiZSBsb2FkZWQKLQkJCQlzdHJlYW0uaGFzTmV4dCgpOwotCQkJCS8vIG5vdyB0cnkgdG8gcmVtb3ZlIGZyb20gdGhlIHByZXZpb3VzIGl0ZXJhdG9yCi0JCQkJc3RyZWFtLnNldCgiZW5kIG9mIDEiKTsKLQkJCX0KLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCU9iamVjdCBwcmV2aW91cyA9IHN0cmVhbS5wcmV2aW91cygpOwotCQkJaWYgKHByZXZpb3VzLmVxdWFscygiMjIiKSkgewotCQkJCXN0cmVhbS5zZXQoIjIyYSIpOwotCQkJfQotCQkJLy8gdGVzdCBzcGVjaWFsIGNhc2UgLSB3aGVyZSB3ZSBhcmUgYmV0d2VlbiBpdGVyYXRvcnMKLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoZmlyc3RFbGVtZW50MykpIHsKLQkJCQkvLyB0aGlzIHdpbGwgdHJpZ2dlciB0aGUgbmV4dCBpdGVyYXRvciB0byBiZSBsb2FkZWQKLQkJCQlzdHJlYW0uaGFzUHJldmlvdXMoKTsKLQkJCQkvLyBub3cgdHJ5IHRvIHJlbW92ZSBmcm9tIHRoZSBwcmV2aW91cyBpdGVyYXRvcgotCQkJCXN0cmVhbS5zZXQoInN0YXJ0IG9mIDMiKTsKLQkJCX0KLQkJfQotCi0JCWFzc2VydEVxdWFscygiZWxlbWVudChzKSBhZGRlZCB0byBjb2xsZWN0aW9uIDEiLCB0aGlzLmJ1aWxkTGlzdDEoKS5zaXplKCksIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3Qgc2V0IGluIGNvbGxlY3Rpb24gMSIsICIyMmEiLCBsaXN0MS5nZXQoMSkpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBub3Qgc2V0IGluIGNvbGxlY3Rpb24gMSIsIGxpc3QxLmNvbnRhaW5zKCIyMiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAxIiwgIjMzM2EiLCBsaXN0MS5nZXQoMikpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBub3Qgc2V0IGluIGNvbGxlY3Rpb24gMSIsIGxpc3QxLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3Qgc2V0IGluIGNvbGxlY3Rpb24gMSIsICJlbmQgb2YgMSIsIGxpc3QxLmdldChsaXN0MS5zaXplKCkgLSAxKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMobGFzdEVsZW1lbnQxKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50KHMpIGFkZGVkIHRvIGNvbGxlY3Rpb24gMyIsIHRoaXMuYnVpbGRMaXN0MygpLnNpemUoKSwgbGlzdDMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAzIiwgInN0YXJ0IG9mIDMiLCBsaXN0My5nZXQoMCkpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBub3Qgc2V0IGluIGNvbGxlY3Rpb24gMyIsIGxpc3QzLmNvbnRhaW5zKGZpcnN0RWxlbWVudDMpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEluZGV4UHJldmlvdXNJbmRleCgpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBuZXh0ID0gc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJCWlmIChuZXh0LmVxdWFscygiMzMzIikpIHsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJaS0tOwotCQkJfQotCQkJaWYgKG5leHQuZXF1YWxzKCI3Nzc3Nzc3IikpIHsKLQkJCQlzdHJlYW0uYWRkKCI3LjUiKTsKLQkJCQlpKys7Ci0JCQl9Ci0JCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJpbmRleCBpcyBjb3JydXB0IiwgOCwgaSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJT2JqZWN0IHByZXZpb3VzID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpLS07Ci0JCQlpZiAocHJldmlvdXMuZXF1YWxzKCI2NjY2NjYiKSkgewotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQkvLyByZW1vdmluZyBhIHByZXZpb3VzIGVsZW1lbnQsIGRvZXMgbm90IGNoYW5nZSB0aGUgY3Vyc29yCi0JCQl9Ci0JCQlpZiAocHJldmlvdXMuZXF1YWxzKCIyMiIpKSB7Ci0JCQkJc3RyZWFtLmFkZCgiMS41Iik7Ci0JCQkJaSsrOwotCQkJfQotCQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiaW5kZXggaXMgY29ycnVwdCIsIDAsIGkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5SWxsZWdhbFN0YXRlRXhjZXB0aW9uMSgpIHsKLQkJdGhpcy52ZXJpZnlFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjEoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24yKCkgewotCQl0aGlzLnZlcmlmeUVtcHR5SWxsZWdhbFN0YXRlRXhjZXB0aW9uMigpOwotCX0KLQotCS8vIHVuY2hlY2tlZCBzbyB3ZSBjYW4gb3ZlcnJpZGUgdGhlIHVuY2hlY2tlZCBtZXRob2QgaW4gc3VwZXJjbGFzcwotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcihJdGVyYXRvciBpdGVyYXRvcnMpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0SXRlcmF0b3I8U3RyaW5nPigoTGlzdEl0ZXJhdG9yPExpc3RJdGVyYXRvcjxTdHJpbmc+PikgaXRlcmF0b3JzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IyKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMuYnVpbGRJdGVyYXRvcjEoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMigpLCB0aGlzLmJ1aWxkSXRlcmF0b3IzKCkpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcjMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4obmV3IExpc3RJdGVyYXRvcltdIHsgdGhpcy5idWlsZEl0ZXJhdG9yMSgpLCB0aGlzLmJ1aWxkSXRlcmF0b3IyKCksIHRoaXMuYnVpbGRJdGVyYXRvcjMoKSB9KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUxpc3RJdGVyYXRvcihTdHJpbmcgc3RyaW5nLCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHN0cmluZywgaXRlcmF0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMWU0ODQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFbXB0eUl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRW1wdHlJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWZhaWwoImJvZ3VzIGVsZW1lbnQ6ICIgKyBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPE51bWJlcj4gc3RyZWFtID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJZWxlbWVudCA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUxpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4OTI0MTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUxpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRW1wdHlMaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFbXB0eUxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlmb3IgKExpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEluZGV4KCkgewotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJldmlvdXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJaSA9IDA7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91cygpIHsKLQkJTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgc3RyZWFtLnByZXZpb3VzKCkpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJZmFpbCgiYm9ndXMgZWxlbWVudDogIiArIHN0cmVhbS5wcmV2aW91cygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91c0luZGV4KCkgewotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWVsZW1lbnQgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biAobmV4dCk6ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJZWxlbWVudCA9IHN0cmVhbS5wcmV2aW91cygpOwotCQl9Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24gKHByZXZpb3VzKTogIiArIGVsZW1lbnQsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCkucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biAocmVtb3ZlKSIsIGV4Q2F1Z2h0KTsKLQkJdHJ5IHsKLQkJCUVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCkuc2V0KG5ldyBPYmplY3QoKSk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biAoc2V0KSIsIGV4Q2F1Z2h0KTsKLQkJdHJ5IHsKLQkJCUVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCkuYWRkKG5ldyBPYmplY3QoKSk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biAoYWRkKSIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW51bWVyYXRpb25JdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VudW1lcmF0aW9uSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2M3ZDI4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW51bWVyYXRpb25JdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVudW1lcmF0aW9uSXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVudW1lcmF0aW9uSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFbnVtZXJhdGlvbkl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFZlY3RvcigpLnNpemUoKSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvclVwY2FzdCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFZlY3RvcigpLnNpemUoKSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCUVudW1lcmF0aW9uPFN0cmluZz4gZW51bWVyYXRpb24gPSB0aGlzLmJ1aWxkRW51bWVyYXRpb24oKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dFVwY2FzdCgpIHsKLQkJRW51bWVyYXRpb248U3RyaW5nPiBlbnVtZXJhdGlvbiA9IHRoaXMuYnVpbGRFbnVtZXJhdGlvbigpOwotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yVXBjYXN0KCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEl0ZXJhdG9yKHRoaXMuYnVpbGRFbnVtZXJhdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcihFbnVtZXJhdGlvbjxTdHJpbmc+IGVudW1lcmF0aW9uKSB7Ci0JCXJldHVybiBuZXcgRW51bWVyYXRpb25JdGVyYXRvcjxTdHJpbmc+KGVudW1lcmF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1lcmF0aW9uPFN0cmluZz4gYnVpbGRFbnVtZXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRWZWN0b3IoKS5lbGVtZW50cygpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRWZWN0b3IoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJdi5hZGRFbGVtZW50KCJvbmUiKTsKLQkJdi5hZGRFbGVtZW50KCJ0d28iKTsKLQkJdi5hZGRFbGVtZW50KCJ0aHJlZSIpOwotCQl2LmFkZEVsZW1lbnQoImZvdXIiKTsKLQkJdi5hZGRFbGVtZW50KCJmaXZlIik7Ci0JCXYuYWRkRWxlbWVudCgic2l4Iik7Ci0JCXYuYWRkRWxlbWVudCgic2V2ZW4iKTsKLQkJdi5hZGRFbGVtZW50KCJlaWdodCIpOwotCQlyZXR1cm4gdjsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRJdGVyYXRvclVwY2FzdCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJdGVyYXRvclVwY2FzdCh0aGlzLmJ1aWxkRW51bWVyYXRpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkSXRlcmF0b3JVcGNhc3QoRW51bWVyYXRpb248U3RyaW5nPiBlbnVtZXJhdGlvbikgewotCQlyZXR1cm4gbmV3IEVudW1lcmF0aW9uSXRlcmF0b3I8T2JqZWN0PihlbnVtZXJhdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0ZpbHRlcmluZ0l0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmU5MjBiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEZpbHRlcmluZ0l0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gInByZWZpeCI7Ci0KLQlwdWJsaWMgRmlsdGVyaW5nSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRBY2NlcHRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAoc3RyaW5nLmVxdWFscyhQUkVGSVggKyAiMyIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRBY2NlcHRJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEFjY2VwdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg2LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0TmV4dCgpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRBY2NlcHRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgYWNjZXB0Iiwgc3RyZWFtLm5leHQoKS5zdGFydHNXaXRoKFBSRUZJWCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVySGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDYsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lck5leHQoKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgYWNjZXB0Iiwgc3RyZWFtLm5leHQoKS5zdGFydHNXaXRoKFBSRUZJWCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlamVjdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWplY3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlamVjdE5leHQoKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVqZWN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEZhbHNlKCJib2d1cyByZWplY3QiLCBzdHJlYW0ubmV4dCgpLnN0YXJ0c1dpdGgoUFJFRklYKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm90aEhhc05leHQoKSB7Ci0JCS8vIGlmIGJvdGggYWNjZXB0KCkgYW5kIHJlamVjdCgpIGFyZSBvdmVycmlkZGVuLCBhY2NlcHQoKSBpcyB1c2VkCi0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRCb3RoSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDYsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMb2FkTmV4dCgpIHsKLQkJLy8gbG9hZE5leHQoKSB1c2VkIHRvIGNhdXNlIGEgTlBFIHdoZW4gZXhlY3V0aW5nIGR1cmluZyB0aGUKLQkJLy8gY29uc3RydWN0b3IgYmVjYXVzZSB0aGUgIm91dGVyIiBjbGFzcyBpcyBub3QgYm91bmQgdW50aWwgY29tcGxldGlvbgotCQkvLyBvZiB0aGUgY29uc3RydWN0b3IKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yMigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgYWNjZXB0Iiwgc3RyZWFtLm5leHQoKS5zdGFydHNXaXRoKFBSRUZJWCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbHRlckhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRGaWx0ZXJJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbHRlck5leHQoKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkRmlsdGVySXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydFRydWUoImJvZ3VzIGFjY2VwdCIsIHN0cmVhbS5uZXh0KCkuc3RhcnRzV2l0aChQUkVGSVgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZEZpbHRlcmVkSXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciwgRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nPihuZXN0ZWRJdGVyYXRvciwgZmlsdGVyKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJbm5lckZpbHRlcmVkSXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZz4obmVzdGVkSXRlcmF0b3IpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aChQUkVGSVgpOwotCQkJfQotCQl9OwotCX0KLQotCVN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBQUkVGSVg7Ci0JfQotCi0JLy8gdGhpcyBpbm5lciBpdGVyYXRvciB3aWxsIGNhbGwgdGhlICJvdXRlciIgb2JqZWN0Ci0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSW5uZXJGaWx0ZXJlZEl0ZXJhdG9yMihJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nPihuZXN0ZWRJdGVyYXRvcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKEZpbHRlcmluZ0l0ZXJhdG9yVGVzdHMudGhpcy5nZXRQcmVmaXgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKFBSRUZJWCArICIxIik7Ci0JCWMuYWRkKFBSRUZJWCArICIyIik7Ci0JCWMuYWRkKFBSRUZJWCArICIzIik7Ci0JCWMuYWRkKCI0Iik7Ci0JCWMuYWRkKFBSRUZJWCArICI1Iik7Ci0JCWMuYWRkKFBSRUZJWCArICI2Iik7Ci0JCWMuYWRkKFBSRUZJWCArICI3Iik7Ci0JCWMuYWRkKCI4Iik7Ci0JCXJldHVybiBjLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQWNjZXB0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmlsdGVyZWRJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZEFjY2VwdEZpbHRlcihQUkVGSVgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJbm5lckl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZElubmVyRmlsdGVyZWRJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JLy8gdGhpcyBpbm5lciBpdGVyYXRvciB3aWxsIGNhbGwgdGhlICJvdXRlciIgb2JqZWN0Ci0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSW5uZXJJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW5uZXJGaWx0ZXJlZEl0ZXJhdG9yMih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkRmlsdGVySXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmlsdGVyZWRJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZEZpbHRlckZpbHRlcihQUkVGSVgpKTsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkQWNjZXB0RmlsdGVyKFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVGaWx0ZXI8U3RyaW5nLCBTdHJpbmc+KHByZWZpeCkgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aCh0aGlzLmNyaXRlcmlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkUmVqZWN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmlsdGVyZWRJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZFJlamVjdEZpbHRlcihQUkVGSVgpKTsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkUmVqZWN0RmlsdGVyKFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVGaWx0ZXI8U3RyaW5nLCBTdHJpbmc+KHByZWZpeCkgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gcmVqZWN0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aCh0aGlzLmNyaXRlcmlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gdXNlIGFub255bW91cyBpbm5lciBGaWx0ZXIKLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkRmlsdGVyRmlsdGVyKGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChTdHJpbmcgcykgewotCQkJCXJldHVybiBzLnN0YXJ0c1dpdGgocHJlZml4KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRCb3RoSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmlsdGVyZWRJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZEJvdGhGaWx0ZXIoUFJFRklYKSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWx0ZXI8U3RyaW5nPiBidWlsZEJvdGhGaWx0ZXIoU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUZpbHRlcjxTdHJpbmcsIFN0cmluZz4ocHJlZml4KSB7Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiByZWplY3QoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKHRoaXMuY3JpdGVyaW9uKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKHRoaXMuY3JpdGVyaW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEZpbHRlcmluZ0l0ZXJhdG9yKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQkvLyBtaXNzaW5nIG1ldGhvZCBvdmVycmlkZQotCQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmc+KHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQkJCVN0cmluZyBzID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbCgiaW52YWxpZCBzdHJpbmc6ICIgKyBzKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0dyYXBoSXRlcmF0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyMGYyOC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0dyYXBoSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuR3JhcGhJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHcmFwaEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqIHRoaXMgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhbGwgdGhlIG5vZGVzIGNyZWF0ZWQgZm9yIHRoZSB0ZXN0ICovCi0JQ29sbGVjdGlvbjxHcmFwaE5vZGU+IG5vZGVzID0gbmV3IEFycmF5TGlzdDxHcmFwaE5vZGU+KCk7Ci0KLQlwdWJsaWMgR3JhcGhJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dDEoKSB7Ci0JCXRoaXMudmVyaWZ5SGFzTmV4dCh0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQyKCkgewotCQl0aGlzLnZlcmlmeUhhc05leHQodGhpcy5idWlsZEdyYXBoSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOZXh0KEl0ZXJhdG9yPEdyYXBoTm9kZT4gaXRlcmF0b3IpIHsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMubm9kZXMuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dDEoKSB7Ci0JCXRoaXMudmVyaWZ5TmV4dCh0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQyKCkgewotCQl0aGlzLnZlcmlmeU5leHQodGhpcy5idWlsZEdyYXBoSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlOZXh0KEl0ZXJhdG9yPEdyYXBoTm9kZT4gaXRlcmF0b3IpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgZWxlbWVudCIsIHRoaXMubm9kZXMuY29udGFpbnMoaXRlcmF0b3IubmV4dCgpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbjEoKSB7Ci0JCXRoaXMudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbih0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24yKCkgewotCQl0aGlzLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24odGhpcy5idWlsZEdyYXBoSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKEl0ZXJhdG9yPEdyYXBoTm9kZT4gaXRlcmF0b3IpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZTEoKSB7Ci0JCXRoaXMudmVyaWZ5U2l6ZSh0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUyKCkgewotCQl0aGlzLnZlcmlmeVNpemUodGhpcy5idWlsZEdyYXBoSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTaXplKEl0ZXJhdG9yPEdyYXBoTm9kZT4gaXRlcmF0b3IpIHsKLQkJaW50IGl0ZXJhdG9yU2l6ZSA9IENvbGxlY3Rpb25Ub29scy5zaXplKGl0ZXJhdG9yKTsKLQkJaW50IGFjdHVhbFNpemUgPSB0aGlzLm5vZGVzLnNpemUoKTsKLQkJYXNzZXJ0VHJ1ZSgiVG9vIGZldyBpdGVtcyBpbiBpdGVyYXRvci4iLCBpdGVyYXRvclNpemUgPj0gYWN0dWFsU2l6ZSk7Ci0JCWFzc2VydFRydWUoIlRvbyBtYW55IGl0ZW1zIGluIGl0ZXJhdG9yLiIsIGl0ZXJhdG9yU2l6ZSA8PSBhY3R1YWxTaXplKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEdyYXBoSXRlcmF0b3IoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCS8vIG1pc3NpbmcgbWV0aG9kIG92ZXJyaWRlCi0JCQlJdGVyYXRvcjxHcmFwaE5vZGU+IGl0ZXJhdG9yID0gbmV3IEdyYXBoSXRlcmF0b3I8R3JhcGhOb2RlPih0aGlzLmJ1aWxkR3JhcGhSb290KCkpOwotCQkJR3JhcGhOb2RlIGduID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbCgiaW52YWxpZCBncmFwaCBub2RlOiAiICsgZ24pOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQkvKioKLQkgKiBidWlsZCBhIGdyYXBoIGl0ZXJhdG9yIHdpdGggYW4gZXhwbGljaXQgbWlzdGVyUm9nZXJzCi0JICovCi0JcHJpdmF0ZSBJdGVyYXRvcjxHcmFwaE5vZGU+IGJ1aWxkR3JhcGhJdGVyYXRvcjEoKSB7Ci0JCXJldHVybiBuZXcgR3JhcGhJdGVyYXRvcjxHcmFwaE5vZGU+KHRoaXMuYnVpbGRHcmFwaFJvb3QoKSwgdGhpcy5idWlsZE1pc3RlclJvZ2VycygpKTsKLQl9Ci0KLQlwcml2YXRlIEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzPEdyYXBoTm9kZT4gYnVpbGRNaXN0ZXJSb2dlcnMoKSB7Ci0JCXJldHVybiBuZXcgR3JhcGhJdGVyYXRvci5NaXN0ZXJSb2dlcnM8R3JhcGhOb2RlPigpIHsKLQkJCXB1YmxpYyBJdGVyYXRvcjxHcmFwaE5vZGU+IG5laWdoYm9ycyhHcmFwaE5vZGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lm5laWdoYm9ycygpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIGJ1aWxkIGEgZ3JhcGggaXRlcmF0b3Igd2l0aCBhbiBvdmVycmlkZQotCSAqLwotCXByaXZhdGUgSXRlcmF0b3I8R3JhcGhOb2RlPiBidWlsZEdyYXBoSXRlcmF0b3IyKCkgewotCQlyZXR1cm4gbmV3IEdyYXBoSXRlcmF0b3I8R3JhcGhOb2RlPih0aGlzLmJ1aWxkR3JhcGhSb290KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPEdyYXBoTm9kZT4gbmVpZ2hib3JzKEdyYXBoTm9kZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQubmVpZ2hib3JzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBHcmFwaE5vZGUgYnVpbGRHcmFwaFJvb3QoKSB7Ci0JCUdyYXBoTm9kZSBuY05vZGUgPSBuZXcgR3JhcGhOb2RlKCJOb3J0aCBDYXJvbGluYSIpOwotCQlHcmFwaE5vZGUgdmFOb2RlID0gbmV3IEdyYXBoTm9kZSgiVmlyZ2luaWEiKTsKLQkJR3JhcGhOb2RlIHNjTm9kZSA9IG5ldyBHcmFwaE5vZGUoIlNvdXRoIENhcm9saW5hIik7Ci0JCUdyYXBoTm9kZSBnYU5vZGUgPSBuZXcgR3JhcGhOb2RlKCJHZW9yZ2lhIik7Ci0JCUdyYXBoTm9kZSBmbE5vZGUgPSBuZXcgR3JhcGhOb2RlKCJGbG9yaWRhIik7Ci0JCUdyYXBoTm9kZSBhbE5vZGUgPSBuZXcgR3JhcGhOb2RlKCJBbGFiYW1hIik7Ci0JCUdyYXBoTm9kZSBtc05vZGUgPSBuZXcgR3JhcGhOb2RlKCJNaXNzaXNzaXBwaSIpOwotCQlHcmFwaE5vZGUgdG5Ob2RlID0gbmV3IEdyYXBoTm9kZSgiVGVubmVzc2VlIik7Ci0KLQkJbmNOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyB2YU5vZGUsIHNjTm9kZSwgZ2FOb2RlLCB0bk5vZGUgfSk7Ci0JCXZhTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgbmNOb2RlLCB0bk5vZGUgfSk7Ci0JCXNjTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgbmNOb2RlLCBnYU5vZGUgfSk7Ci0JCWdhTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgbmNOb2RlLCBzY05vZGUsIGZsTm9kZSwgYWxOb2RlLCB0bk5vZGUgfSk7Ci0JCWZsTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgZ2FOb2RlIH0pOwotCQlhbE5vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IGdhTm9kZSwgbXNOb2RlLCB0bk5vZGUgfSk7Ci0JCW1zTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgYWxOb2RlLCB0bk5vZGUgfSk7Ci0JCXRuTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgdmFOb2RlLCBuY05vZGUsIGdhTm9kZSwgYWxOb2RlLCBtc05vZGUgfSk7Ci0KLQkJcmV0dXJuIG5jTm9kZTsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgR3JhcGhOb2RlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCQlwcml2YXRlIENvbGxlY3Rpb248R3JhcGhOb2RlPiBuZWlnaGJvcnMgPSBuZXcgQXJyYXlMaXN0PEdyYXBoTm9kZT4oKTsKLQotCQlwdWJsaWMgR3JhcGhOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJR3JhcGhJdGVyYXRvclRlc3RzLnRoaXMubm9kZXMuYWRkKHRoaXMpOyAvLyBsb2cgbm9kZQotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQotCQl2b2lkIHNldE5laWdoYm9ycyhHcmFwaE5vZGVbXSBuZWlnaGJvcnMpIHsKLQkJCXRoaXMubmVpZ2hib3JzID0gQ29sbGVjdGlvblRvb2xzLmxpc3QobmVpZ2hib3JzKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvcjxHcmFwaE5vZGU+IG5laWdoYm9ycygpIHsKLQkJCXJldHVybiB0aGlzLm5laWdoYm9ycy5pdGVyYXRvcigpOwotCQl9Ci0KLQkJcHVibGljIGludCBuZWlnaGJvcnNTaXplKCkgewotCQkJcmV0dXJuIHRoaXMubmVpZ2hib3JzLnNpemUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJHcmFwaE5vZGUoIiArIHRoaXMubmFtZSArICIpIjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0pwdFV0aWxpdHlJdGVyYXRvcnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGZiMjc2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlJdGVyYXRvcnNUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBcnJheUl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXJyYXlMaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDaGFpbkl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xvbmVJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENsb25lTGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tcG9zaXRlSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbXB0eUl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW1wdHlMaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbnVtZXJhdGlvbkl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRmlsdGVyaW5nSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdXBlckl0ZXJhdG9yV3JhcHBlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdyYXBoSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQZWVrYWJsZUl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWFkT25seUl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZE9ubHlMaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW5nbGVFbGVtZW50SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3luY2hyb25pemVkSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmVlSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUGVla2FibGVJdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1BlZWthYmxlSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEwNTZmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUGVla2FibGVJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUGVla2FibGVJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUGVla2FibGVJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFBlZWthYmxlSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChzdHJpbmcuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUGVla2FibGVJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yVXBjYXN0KCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg2LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUGVla2FibGVJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0aHJlZSIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvdXIiLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmaXZlIiwgc3RyZWFtLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRVcGNhc3QoKSB7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3JVcGNhc3QoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6ZXJvIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygidGhyZWUiLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb3VyIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZml2ZSIsIHN0cmVhbS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZWVrKCkgewotCQlPYmplY3QgbmV4dCA9IG51bGw7Ci0JCWZvciAoUGVla2FibGVJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcGVlayA9IHN0cmVhbS5wZWVrKCk7Ci0JCQlhc3NlcnRUcnVlKCJwZWVrIGFuZCBuZXh0IGFyZSBwcmVtYXR1cmVseSBpZGVudGljYWwiLCBwZWVrICE9IG5leHQpOwotCQkJbmV4dCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlhc3NlcnRUcnVlKCJwZWVrIGFuZCBuZXh0IGFyZSBub3QgaWRlbnRpY2FsIiwgcGVlayA9PSBuZXh0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZWVrVXBjYXN0KCkgewotCQlPYmplY3QgbmV4dCA9IG51bGw7Ci0JCWZvciAoUGVla2FibGVJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yVXBjYXN0KCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcGVlayA9IHN0cmVhbS5wZWVrKCk7Ci0JCQlhc3NlcnRUcnVlKCJwZWVrIGFuZCBuZXh0IGFyZSBwcmVtYXR1cmVseSBpZGVudGljYWwiLCBwZWVrICE9IG5leHQpOwotCQkJbmV4dCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlhc3NlcnRUcnVlKCJwZWVrIGFuZCBuZXh0IGFyZSBub3QgaWRlbnRpY2FsIiwgcGVlayA9PSBuZXh0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgUGVla2FibGVJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkUGVla2FibGVJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIFBlZWthYmxlSXRlcmF0b3I8T2JqZWN0PiBidWlsZFBlZWthYmxlSXRlcmF0b3JVcGNhc3QoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUGVla2FibGVJdGVyYXRvclVwY2FzdCh0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBQZWVrYWJsZUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBQZWVrYWJsZUl0ZXJhdG9yPFN0cmluZz4obmVzdGVkSXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgUGVla2FibGVJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkUGVla2FibGVJdGVyYXRvclVwY2FzdChJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgUGVla2FibGVJdGVyYXRvcjxPYmplY3Q+KG5lc3RlZEl0ZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGROZXN0ZWRJdGVyYXRvcigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoInplcm8iKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQljLmFkZCgiZm91ciIpOwotCQljLmFkZCgiZml2ZSIpOwotCQlyZXR1cm4gYy5pdGVyYXRvcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxZWVhNi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBDb21wb3NpdGVJdGVyYXRvclRlc3RzIHsKLQotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdmVyaWZ5SGFzQW5vdGhlcihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlIYXNBbm90aGVyKHN0cmVhbSk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbTIgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHN0cmVhbTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoc3RyZWFtMi5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0yLnByZXZpb3VzKCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDgsIGkpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdmVyaWZ5QW5vdGhlcihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlBbm90aGVyKHN0cmVhbSk7Ci0JCWludCBpID0gODsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQl3aGlsZSAoc3RyZWFtMi5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBTdHJpbmcudmFsdWVPZihpLS0pLCBzdHJlYW0yLnByZXZpb3VzKCkuc3Vic3RyaW5nKDAsIDEpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXhQcmV2aW91c0luZGV4KCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImluZGV4IGlzIGNvcnJ1cHQiLCA4LCBpKTsKLQotCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWktLTsKLQkJCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImluZGV4IGlzIGNvcnJ1cHQiLCAwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJldmlvdXNJbmRleCgpIHsKLQkJLy8gVE9ETwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCS8vICNyZW1vdmUoKSBpcyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpIHsKLQkJLy8gI3JlbW92ZSgpIGlzIG5vdCBzdXBwb3J0ZWQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24xKCkgewotCQkvLyAjcmVtb3ZlKCkgaXMgbm90IHN1cHBvcnRlZAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjIoKSB7Ci0JCS8vICNyZW1vdmUoKSBpcyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCB2ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCXN1cGVyLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24oc3RyZWFtKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtMi5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0yLnByZXZpb3VzKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbTIucHJldmlvdXMoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdmVyaWZ5VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJc3VwZXIudmVyaWZ5VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oc3RyZWFtKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSBzdHJlYW07Ci0JCXdoaWxlIChzdHJlYW0yLmhhc1ByZXZpb3VzKCkpIHsKLQkJCU9iamVjdCBzdHJpbmcgPSBzdHJlYW0yLnByZXZpb3VzKCk7Ci0JCQlpZiAoc3RyaW5nLmVxdWFscygiMzMzIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0yLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIHZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oc3RyZWFtKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0yLnNldCgianVuayIpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIHZlcmlmeUVtcHR5SGFzQW5vdGhlcihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlFbXB0eUhhc0Fub3RoZXIoc3RyZWFtKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChzdHJlYW0yLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbTIucHJldmlvdXMoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JLy8gdW5jaGVja2VkIHNvIHdlIGNhbiBvdmVycmlkZSB0aGUgdW5jaGVja2VkIG1ldGhvZCBpbiBzdXBlcmNsYXNzCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9ycykgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4oKExpc3RJdGVyYXRvcjxMaXN0SXRlcmF0b3I8U3RyaW5nPj4pIGl0ZXJhdG9ycyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMuYnVpbGRJdGVyYXRvcjEoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMigpLCB0aGlzLmJ1aWxkSXRlcmF0b3IzKCkpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcjMoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I8U3RyaW5nPihuZXcgTGlzdEl0ZXJhdG9yW10geyB0aGlzLmJ1aWxkSXRlcmF0b3IxKCksIHRoaXMuYnVpbGRJdGVyYXRvcjIoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMygpIH0pOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcihTdHJpbmcgc3RyaW5nLCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gdGhpcy5idWlsZENvbXBvc2l0ZUxpc3RJdGVyYXRvcihzdHJpbmcsIGl0ZXJhdG9yKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUxpc3RJdGVyYXRvcihTdHJpbmcgc3RyaW5nLCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4oc3RyaW5nLCBpdGVyYXRvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhcmllZE5lc3RlZEl0ZXJhdG9ycygpIHsKLQkJTGlzdDxJbnRlZ2VyPiBpbnRlZ2VyTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLQkJaW50ZWdlckxpc3QuYWRkKG5ldyBJbnRlZ2VyKDQyKSk7Ci0JCWludGVnZXJMaXN0LmFkZChuZXcgSW50ZWdlcig0MikpOwotCQlpbnRlZ2VyTGlzdC5hZGQobmV3IEludGVnZXIoMTExKSk7Ci0JCWludGVnZXJMaXN0LmFkZChuZXcgSW50ZWdlcig3NykpOwotCi0JCUxpc3Q8RmxvYXQ+IGZsb2F0TGlzdCA9IG5ldyBBcnJheUxpc3Q8RmxvYXQ+KCk7Ci0JCWZsb2F0TGlzdC5hZGQobmV3IEZsb2F0KDQyLjQyZikpOwotCQlmbG9hdExpc3QuYWRkKG5ldyBGbG9hdCgyMi4yMmYpKTsKLQkJZmxvYXRMaXN0LmFkZChuZXcgRmxvYXQoMTExLjExMWYpKTsKLQkJZmxvYXRMaXN0LmFkZChuZXcgRmxvYXQoNzcuNzdmKSk7Ci0KLQkJTGlzdDxMaXN0PD8gZXh0ZW5kcyBOdW1iZXI+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0PD8gZXh0ZW5kcyBOdW1iZXI+PigpOwotCQlsaXN0LmFkZChpbnRlZ2VyTGlzdCk7Ci0JCWxpc3QuYWRkKGZsb2F0TGlzdCk7Ci0JCUxpc3RJdGVyYXRvcjxOdW1iZXI+IGxpID0gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPE51bWJlcj4obGlzdCk7Ci0JCXdoaWxlIChsaS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydFRydWUobGkubmV4dCgpLmludFZhbHVlKCkgPiAwKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMDQxNzAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWFkT25seUl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUmVhZE9ubHlJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFZlY3RvcigpLnNpemUoKSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhdG9yVXBjYXN0KCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVmVjdG9yKCkuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZEl0ZXJhdG9yLm5leHQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dFVwY2FzdCgpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpOwotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZEl0ZXJhdG9yLm5leHQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZFJlYWRPbmx5SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkUmVhZE9ubHlJdGVyYXRvclVwY2FzdCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhdG9yVXBjYXN0KHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRSZWFkT25seUl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPFN0cmluZz4obmVzdGVkSXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8T2JqZWN0PiBidWlsZFJlYWRPbmx5SXRlcmF0b3JVcGNhc3QoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8T2JqZWN0PihuZXN0ZWRJdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVmVjdG9yKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGJ1aWxkVmVjdG9yKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCXYuYWRkRWxlbWVudCgib25lIik7Ci0JCXYuYWRkRWxlbWVudCgidHdvIik7Ci0JCXYuYWRkRWxlbWVudCgidGhyZWUiKTsKLQkJdi5hZGRFbGVtZW50KCJmb3VyIik7Ci0JCXYuYWRkRWxlbWVudCgiZml2ZSIpOwotCQl2LmFkZEVsZW1lbnQoInNpeCIpOwotCQl2LmFkZEVsZW1lbnQoInNldmVuIik7Ci0JCXYuYWRkRWxlbWVudCgiZWlnaHQiKTsKLQkJcmV0dXJuIHY7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDgxYTJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlMaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBSZWFkT25seUxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0QW5kSGFzUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkTGlzdCgpLnNpemUoKSwgaSk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWktLTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRBbmRIYXNQcmV2aW91c1VwY2FzdCgpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3JVcGNhc3QoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRMaXN0KCkuc2l6ZSgpLCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEFuZFByZXZpb3VzKCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXMoKSwgc3RyZWFtLnByZXZpb3VzKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRBbmRQcmV2aW91c1VwY2FzdCgpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkTGlzdEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYXRvcigpOwotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3JVcGNhc3QoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzKCksIHN0cmVhbS5wcmV2aW91cygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXhBbmRQcmV2aW91c0luZGV4KCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0SW5kZXgoKSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCW5lc3RlZExpc3RJdGVyYXRvci5uZXh0KCk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCB0aGlzLmJ1aWxkTGlzdCgpLnNpemUoKSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJCW5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIC0xLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEluZGV4QW5kUHJldmlvdXNJbmRleFVwY2FzdCgpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkTGlzdEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYXRvcigpOwotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3JVcGNhc3QoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dEluZGV4KCksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQluZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgdGhpcy5idWlsZExpc3QoKS5zaXplKCksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCQluZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXMoKTsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCAtMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnNldCgiYm9ndXMiKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLmFkZCgiYm9ndXMiKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8T2JqZWN0PiBidWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yVXBjYXN0KCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yVXBjYXN0KHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPFN0cmluZz4obmVzdGVkTGlzdEl0ZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3JVcGNhc3QoTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkTGlzdEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8T2JqZWN0PihuZXN0ZWRMaXN0SXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdCgpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbC5hZGQoIm9uZSIpOwotCQlsLmFkZCgidHdvIik7Ci0JCWwuYWRkKCJ0aHJlZSIpOwotCQlsLmFkZCgiZm91ciIpOwotCQlsLmFkZCgiZml2ZSIpOwotCQlsLmFkZCgic2l4Iik7Ci0JCWwuYWRkKCJzZXZlbiIpOwotCQlsLmFkZCgiZWlnaHQiKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRJdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmY2U1YTYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDEsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgdGhpcy5zaW5nbGVFbGVtZW50KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscyh0aGlzLnNpbmdsZUVsZW1lbnQoKSkpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxTdHJpbmc+KHRoaXMuc2luZ2xlRWxlbWVudCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNpbmdsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiAic2luZ2xlIGVsZW1lbnQiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzkzYTY1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBTaW5nbGVFbGVtZW50SXRlcmF0b3JUZXN0cyB7Ci0KLQlwdWJsaWMgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXgoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgMCwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIDEsIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1ByZXZpb3VzKCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygxLCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygyLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJldmlvdXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIHRoaXMuc2luZ2xlRWxlbWVudCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgdGhpcy5zaW5nbGVFbGVtZW50KCksIHN0cmVhbS5wcmV2aW91cygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91c0luZGV4KCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgMCwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCAwLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQl9Ci0KLQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIC0xLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yKCk7Ci0KLQkJdHJ5IHsKLQkJCXN0cmVhbS5hZGQoImZvbyIpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscyh0aGlzLnNpbmdsZUVsZW1lbnQoKSkpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0uc2V0KCJmb28iKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRTaW5nbGVFbGVtZW50SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMuc2luZ2xlRWxlbWVudCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhdG9yKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1N1cGVySXRlcmF0b3JXcmFwcGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU3VwZXJJdGVyYXRvcldyYXBwZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmI2ZGM2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU3VwZXJJdGVyYXRvcldyYXBwZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlN1cGVySXRlcmF0b3JXcmFwcGVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTdXBlckl0ZXJhdG9yV3JhcHBlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFN1cGVySXRlcmF0b3JXcmFwcGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCJmb28iKTsKLQkJbGlzdC5hZGQoImJhciIpOwotCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCVN0cmluZyBjb25jYXQgPSAiIjsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGxpc3QuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQljb25jYXQgKz0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImZvb2JhcmJheiIsIGNvbmNhdCk7Ci0KLQkJSXRlcmF0b3I8T2JqZWN0PiBpdGVyYXRvciA9IG5ldyBTdXBlckl0ZXJhdG9yV3JhcHBlcjxPYmplY3Q+KGxpc3QpOwotCQljb25jYXQgPSAiIjsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmV4dC5lcXVhbHMoImJhciIpKSB7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQl9IGVsc2UgewotCQkJCWNvbmNhdCArPSBuZXh0OwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygiZm9vYmF6IiwgY29uY2F0KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UobGlzdC5jb250YWlucygiYmFyIikpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TeW5jaHJvbml6ZWRJdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwMjM4Zi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TeW5jaHJvbml6ZWRJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuTXVsdGlUaHJlYWRlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZEl0ZXJhdG9yVGVzdHMKLQlleHRlbmRzIE11bHRpVGhyZWFkZWRUZXN0Q2FzZQotewotCXB1YmxpYyBTeW5jaHJvbml6ZWRJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgdGhhdCBhbiB1bnN5bmNocm9uaXplZCBpdGVyYXRvciB3aWxsIHByb2R1Y2UgY29ycnVwdCBvdXRwdXQ7Ci0JICogdGhyZWFkIDEgd2lsbCByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGZyb20gdGhlIGl0ZXJhdG9yCi0JICogYW5kIHRoZW4gc2xlZXAgZm9yIGEgYml0LCBhbGxvd2luZyB0aHJlYWQgMiB0byBzbmVhayBpbiBhbmQKLQkgKiByZWFkIHRoZSBzYW1lIGVsZW1lbnQgZnJvbSB0aGUgaXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zeW5jaHJvbml6ZWROZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFRlc3RJdGVyYXRvcihUV09fVElDS1MpOwotCi0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCWl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gYm90aCB0aHJlYWRzIHNob3VsZCBoYXZlIHJlYWQgdGhlIHNhbWUgZWxlbWVudCBmcm9tIHRoZSBpdGVyYXRvciA6LSgKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcnVubmFibGUyLm5leHQpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgdGhhdCBhIHN5bmNocm9uaXplZCBpdGVyYXRvciB3aWxsIHByb2R1Y2UgdmFsaWQgb3V0cHV0OwotCSAqIHRocmVhZCAxIHdpbGwgcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBmcm9tIHRoZSBpdGVyYXRvcgotCSAqIGFuZCB0aGVuIHNsZWVwIGZvciBhIGJpdCwgYnV0IHRocmVhZCAyIHdpbGwgYmUgbG9ja2VkIG91dCBhbmQKLQkgKiB3YWl0IHRvIHJlYWQgdGhlIHNlY29uZCBlbGVtZW50IGZyb20gdGhlIGl0ZXJhdG9yCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZE5leHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3luY2hyb25pemVkSXRlcmF0b3IobmVzdGVkSXRlcmF0b3IpOwotCi0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCW5lc3RlZEl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhlIHRocmVhZHMgc2hvdWxkIGhhdmUgcmVhZCB0aGUgY29ycmVjdCBlbGVtZW50cyBmcm9tIHRoZSBpdGVyYXRvciA6LSkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcnVubmFibGUyLm5leHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN5bmNocm9uaXplZEhhc05leHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCUhhc05leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgSGFzTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCWl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhyZWFkIDEgd2lsbCBoYXZlIHRoZSBsYXN0IGVsZW1lbnQsCi0JCS8vIGJ1dCB0aHJlYWQgMiB3aWxsIHRoaW5rIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIG9uIHRoZSBpdGVyYXRvciA6LSgKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBydW5uYWJsZTIuaGFzTmV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZEhhc05leHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3luY2hyb25pemVkSXRlcmF0b3IobmVzdGVkSXRlcmF0b3IpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IE5leHRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlIYXNOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUyID0gbmV3IEhhc05leHRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQyID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTIpOwotCQluZXN0ZWRJdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRocmVhZCAxIHdpbGwgaGF2ZSB0aGUgbGFzdCBlbGVtZW50LAotCQkvLyBhbmQgdGhyZWFkIDIgd2lsbCB0aGluayB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cyBvbiB0aGUgaXRlcmF0b3IgOi0pCi0JCWFzc2VydEVxdWFscygiYmF6IiwgcnVubmFibGUxLm5leHQpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHJ1bm5hYmxlMi5oYXNOZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zeW5jaHJvbml6ZWRSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IE5leHRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlSZW1vdmVUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgUmVtb3ZlVGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJaXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aGUgd3JvbmcgZWxlbWVudCB3YXMgcmVtb3ZlZCA6LSgKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydEZhbHNlKGl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IubGlzdC5jb250YWlucygiYmF6IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbml6ZWRSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3luY2hyb25pemVkSXRlcmF0b3IobmVzdGVkSXRlcmF0b3IpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0KLQkJTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMSA9IG5ldyBOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUxKTsKLQkJUmVtb3ZlVGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUyID0gbmV3IFJlbW92ZVRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCW5lc3RlZEl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhlIGNvcnJlY3QgZWxlbWVudCB3YXMgcmVtb3ZlZCA6LSkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydFRydWUobmVzdGVkSXRlcmF0b3IubGlzdC5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRGYWxzZShuZXN0ZWRJdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUobmVzdGVkSXRlcmF0b3IubGlzdC5jb250YWlucygiYmF6IikpOwotCX0KLQotCVRlc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVGVzdEl0ZXJhdG9yKGxvbmcgZGVsYXkpIHsKLQkJcmV0dXJuIG5ldyBUZXN0SXRlcmF0b3I8U3RyaW5nPihkZWxheSwgdGhpcy5idWlsZEFycmF5KCkpOwotCX0KLQotCVN0cmluZ1tdIGJ1aWxkQXJyYXkoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJmb28iLCAiYmFyIiwgImJheiJ9OwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRTeW5jaHJvbml6ZWRJdGVyYXRvcihJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgU3luY2hyb25pemVkSXRlcmF0b3I8U3RyaW5nPihuZXN0ZWRJdGVyYXRvcik7Ci0JfQotCi0KLQkvKioKLQkgKiBuZXh0IHJ1bm5hYmxlCi0JICovCi0JY2xhc3MgTmV4dFRlc3RSdW5uYWJsZTxFPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgSXRlcmF0b3I8RT4gaXRlcmF0b3I7Ci0JCUUgbmV4dDsKLQotCQlOZXh0VGVzdFJ1bm5hYmxlKEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGhpcy5uZXh0ID0gdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIGhhcyBuZXh0IHJ1bm5hYmxlCi0JICovCi0JY2xhc3MgSGFzTmV4dFRlc3RSdW5uYWJsZTxFPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgSXRlcmF0b3I8RT4gaXRlcmF0b3I7Ci0JCWJvb2xlYW4gaGFzTmV4dDsKLQotCQlIYXNOZXh0VGVzdFJ1bm5hYmxlKEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGhpcy5oYXNOZXh0ID0gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHJlbW92ZSBydW5uYWJsZQotCSAqLwotCWNsYXNzIFJlbW92ZVRlc3RSdW5uYWJsZTxFPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgSXRlcmF0b3I8RT4gaXRlcmF0b3I7Ci0KLQkJUmVtb3ZlVGVzdFJ1bm5hYmxlKEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGhpcy5pdGVyYXRvci5yZW1vdmUoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGVzdCBpdGVyYXRvcjogSWYge0BsaW5rICNuZXh0KCl9IGlzIGNhbGxlZCB3aGlsZSBleGVjdXRpbmcgb24gdGhlCi0JICoge0BsaW5rIHNsb3dUaHJlYWR9LCB0aGUgaXRlcmF0b3Igd2lsbCBkZWxheSBmb3IgdGhlIGNvbmZpZ3VyZWQgdGltZS4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgVGVzdEl0ZXJhdG9yPEU+IGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewotCQlmaW5hbCBsb25nIGRlbGF5OwotCQlmaW5hbCBBcnJheUxpc3Q8RT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RT4oKTsKLQkJaW50IG5leHRJbmRleCA9IDA7Ci0JCWludCBsYXN0SW5kZXggPSAtMTsKLQkJVGhyZWFkIHNsb3dUaHJlYWQ7Ci0KLQkJVGVzdEl0ZXJhdG9yKGxvbmcgZGVsYXksIEUuLi4gYXJyYXkpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRlbGF5ID0gZGVsYXk7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMubGlzdCwgYXJyYXkpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiB0aGlzLm5leHRJbmRleCAhPSB0aGlzLmxpc3Quc2l6ZSgpOwotCQl9Ci0KLQkJcHVibGljIEUgbmV4dCgpIHsKLQkJCWlmICh0aGlzLmhhc05leHQoKSkgewotCQkJCUUgbmV4dCA9IHRoaXMubGlzdC5nZXQodGhpcy5uZXh0SW5kZXgpOwotCQkJCWlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpID09IHRoaXMuc2xvd1RocmVhZCkgewotCQkJCQlUZXN0VG9vbHMuc2xlZXAodGhpcy5kZWxheSk7Ci0JCQkJfQotCQkJCXRoaXMubGFzdEluZGV4ID0gdGhpcy5uZXh0SW5kZXgrKzsKLQkJCQlyZXR1cm4gbmV4dDsKLQkJCX0KLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQlpZiAodGhpcy5sYXN0SW5kZXggPT0gLTEpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLmxpc3QucmVtb3ZlKHRoaXMubGFzdEluZGV4KTsKLQkJCWlmICh0aGlzLmxhc3RJbmRleCA8IHRoaXMubmV4dEluZGV4KSB7ICAvLyBjaGVjayBuZWNlc3NhcnkgZm9yIExpc3RJdGVyYXRvcgotCQkJCXRoaXMubmV4dEluZGV4LS07Ci0JCQl9Ci0JCQl0aGlzLmxhc3RJbmRleCA9IC0xOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZExpc3RJdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZExpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZjBhYzUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yVGVzdHMKLQlleHRlbmRzIFN5bmNocm9uaXplZEl0ZXJhdG9yVGVzdHMKLXsKLQlwdWJsaWMgU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3luY2hyb25pemVkUHJldmlvdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFRlc3RJdGVyYXRvcihUV09fVElDS1MpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMSA9IG5ldyBQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCVByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUyID0gbmV3IFByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJaXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyBib3RoIHRocmVhZHMgc2hvdWxkIGhhdmUgcmVhZCB0aGUgc2FtZSBlbGVtZW50IGZyb20gdGhlIGl0ZXJhdG9yIDotKAotCQlhc3NlcnRFcXVhbHMoImJhciIsIHJ1bm5hYmxlMS5wcmV2aW91cyk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcnVubmFibGUyLnByZXZpb3VzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVkUHJldmlvdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5idWlsZFRlc3RJdGVyYXRvcihUV09fVElDS1MpOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTeW5jaHJvbml6ZWRJdGVyYXRvcihuZXN0ZWRJdGVyYXRvcik7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCVByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IFByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUxKTsKLQkJUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQyID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTIpOwotCQluZXN0ZWRJdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRoZSB0aHJlYWRzIHNob3VsZCBoYXZlIHJlYWQgdGhlIGNvcnJlY3QgZWxlbWVudHMgZnJvbSB0aGUgaXRlcmF0b3IgOi0pCi0JCWFzc2VydEVxdWFscygiYmFyIiwgcnVubmFibGUxLnByZXZpb3VzKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBydW5uYWJsZTIucHJldmlvdXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN5bmNocm9uaXplZEhhc1ByZXZpb3VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRUZXN0SXRlcmF0b3IoVFdPX1RJQ0tTKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCVByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IFByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUxKTsKLQkJSGFzUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgSGFzUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQyID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTIpOwotCQlpdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRocmVhZCAxIHdpbGwgaGF2ZSB0aGUgZmlyc3QgZWxlbWVudCwKLQkJLy8gYnV0IHRocmVhZCAyIHdpbGwgdGhpbmsgdGhlcmUgYXJlIG1vcmUgInByZXZpb3VzIiBlbGVtZW50cyBvbiB0aGUgaXRlcmF0b3IgOi0oCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcnVubmFibGUxLnByZXZpb3VzKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHJ1bm5hYmxlMi5oYXNQcmV2aW91cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZEhhc1ByZXZpb3VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciA9IHRoaXMuYnVpbGRUZXN0SXRlcmF0b3IoVFdPX1RJQ0tTKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3luY2hyb25pemVkSXRlcmF0b3IobmVzdGVkSXRlcmF0b3IpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0KLQkJUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlIYXNQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMiA9IG5ldyBIYXNQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCW5lc3RlZEl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhyZWFkIDEgd2lsbCBoYXZlIHRoZSBmaXJzdCBlbGVtZW50LAotCQkvLyBhbmQgdGhyZWFkIDIgd2lsbCB0aGluayB0aGVyZSBhcmUgbm8gbW9yZSAicHJldmlvdXMiIGVsZW1lbnRzIG9uIHRoZSBpdGVyYXRvciA6LSkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBydW5uYWJsZTEucHJldmlvdXMpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHJ1bm5hYmxlMi5oYXNQcmV2aW91cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3luY2hyb25pemVkTmV4dEluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRUZXN0SXRlcmF0b3IoVFdPX1RJQ0tTKTsKLQotCQlOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IE5leHRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlOZXh0SW5kZXhUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgTmV4dEluZGV4VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJaXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aHJlYWQgMSB3aWxsIGhhdmUgdGhlIGZpcnN0IGVsZW1lbnQsCi0JCS8vIGJ1dCB0aHJlYWQgMiB3aWxsIHRoaW5rIHRoZSBuZXh0IGluZGV4IGlzIHN0aWxsIDAgOi0oCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcnVubmFibGUxLm5leHQpOwotCQlhc3NlcnRFcXVhbHMoMCwgcnVubmFibGUyLm5leHRJbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZE5leHRJbmRleCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN5bmNocm9uaXplZEl0ZXJhdG9yKG5lc3RlZEl0ZXJhdG9yKTsKLQotCQlOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IE5leHRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlOZXh0SW5kZXhUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgTmV4dEluZGV4VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJbmVzdGVkSXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aHJlYWQgMSB3aWxsIGhhdmUgdGhlIGZpcnN0IGVsZW1lbnQsCi0JCS8vIGFuZCB0aHJlYWQgMiB3aWxsIHRoaW5rIHRoZSBuZXh0IGluZGV4IGlzIDEgOi0pCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcnVubmFibGUxLm5leHQpOwotCQlhc3NlcnRFcXVhbHMoMSwgcnVubmFibGUyLm5leHRJbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3luY2hyb25pemVkUHJldmlvdXNJbmRleCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMSA9IG5ldyBQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCVByZXZpb3VzSW5kZXhUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgUHJldmlvdXNJbmRleFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCWl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhyZWFkIDEgd2lsbCBoYXZlIHRoZSBmaXJzdCBlbGVtZW50LAotCQkvLyBidXQgdGhyZWFkIDIgd2lsbCB0aGluayB0aGUgbmV4dCBpbmRleCBpcyBzdGlsbCAwIDotKAotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJ1bm5hYmxlMS5wcmV2aW91cyk7Ci0JCWFzc2VydEVxdWFscygwLCBydW5uYWJsZTIucHJldmlvdXNJbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZFByZXZpb3VzSW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5idWlsZFRlc3RJdGVyYXRvcihUV09fVElDS1MpOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTeW5jaHJvbml6ZWRJdGVyYXRvcihuZXN0ZWRJdGVyYXRvcik7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMSA9IG5ldyBQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCVByZXZpb3VzSW5kZXhUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgUHJldmlvdXNJbmRleFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCW5lc3RlZEl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhyZWFkIDEgd2lsbCBoYXZlIHRoZSBmaXJzdCBlbGVtZW50LAotCQkvLyBhbmQgdGhyZWFkIDIgd2lsbCB0aGluayB0aGUgbmV4dCBpbmRleCBpcyAtMSA6LSkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBydW5uYWJsZTEucHJldmlvdXMpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHJ1bm5hYmxlMi5wcmV2aW91c0luZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zeW5jaHJvbml6ZWRTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFRlc3RJdGVyYXRvcihUV09fVElDS1MpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0KLQkJTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMSA9IG5ldyBOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUxKTsKLQkJU2V0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUyID0gbmV3IFNldFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yLCAieHh4Iik7Ci0JCVRocmVhZCB0aHJlYWQyID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTIpOwotCQlpdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRoZSB3cm9uZyBlbGVtZW50IHdhcyBzZXQgOi0oCi0JCWFzc2VydEVxdWFscygiYmFyIiwgcnVubmFibGUxLm5leHQpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5saXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IubGlzdC5jb250YWlucygieHh4IikpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXoiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZFNldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN5bmNocm9uaXplZEl0ZXJhdG9yKG5lc3RlZEl0ZXJhdG9yKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCVNldFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMiA9IG5ldyBTZXRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvciwgInh4eCIpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJbmVzdGVkSXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aGUgcmlnaHQgZWxlbWVudCB3YXMgc2V0IDotKQotCQlhc3NlcnRFcXVhbHMoImJhciIsIHJ1bm5hYmxlMS5uZXh0KTsKLQkJYXNzZXJ0VHJ1ZShuZXN0ZWRJdGVyYXRvci5saXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEZhbHNlKG5lc3RlZEl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZShuZXN0ZWRJdGVyYXRvci5saXN0LmNvbnRhaW5zKCJ4eHgiKSk7Ci0JCWFzc2VydFRydWUobmVzdGVkSXRlcmF0b3IubGlzdC5jb250YWlucygiYmF6IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN5bmNocm9uaXplZEFkZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IE5leHRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlBZGRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgQWRkVGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IsICJ4eHgiKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCWl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhlIGVsZW1lbnQgd2FzIGFkZGVkIGF0IHRoZSB3cm9uZyBpbmRleCA6LSgKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IubGlzdC5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoMCwgaXRlcmF0b3IubGlzdC5pbmRleE9mKCJ4eHgiKSk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IubGlzdC5jb250YWlucygieHh4IikpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXoiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZEFkZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN5bmNocm9uaXplZEl0ZXJhdG9yKG5lc3RlZEl0ZXJhdG9yKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCUFkZFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMiA9IG5ldyBBZGRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvciwgInh4eCIpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJbmVzdGVkSXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aGUgZWxlbWVudCB3YXMgYWRkZWQgYXQgdGhlIGNvcnJlY3QgaW5kZXggOi0pCi0JCWFzc2VydEVxdWFscygiYmFyIiwgcnVubmFibGUxLm5leHQpOwotCQlhc3NlcnRUcnVlKG5lc3RlZEl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5lc3RlZEl0ZXJhdG9yLmxpc3QuaW5kZXhPZigieHh4IikpOwotCQlhc3NlcnRUcnVlKG5lc3RlZEl0ZXJhdG9yLmxpc3QuY29udGFpbnMoInh4eCIpKTsKLQkJYXNzZXJ0VHJ1ZShuZXN0ZWRJdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUobmVzdGVkSXRlcmF0b3IubGlzdC5jb250YWlucygiYmF6IikpOwotCX0KLQotCUBPdmVycmlkZQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkU3luY2hyb25pemVkSXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFN5bmNocm9uaXplZExpc3RJdGVyYXRvcjxTdHJpbmc+KChMaXN0SXRlcmF0b3I8U3RyaW5nPikgbmVzdGVkSXRlcmF0b3IpOwotCX0KLQotCUBPdmVycmlkZQotCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFRlc3RJdGVyYXRvcihsb25nIGRlbGF5KSB7Ci0JCXJldHVybiBuZXcgVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+KGRlbGF5LCB0aGlzLmJ1aWxkQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogcHJldmlvdXMgcnVubmFibGUKLQkgKi8KLQljbGFzcyBQcmV2aW91c1Rlc3RSdW5uYWJsZTxFPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yOwotCQlFIHByZXZpb3VzOwotCi0JCVByZXZpb3VzVGVzdFJ1bm5hYmxlKExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRoaXMucHJldmlvdXMgPSB0aGlzLml0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIGhhcyBwcmV2aW91cyBydW5uYWJsZQotCSAqLwotCWNsYXNzIEhhc1ByZXZpb3VzVGVzdFJ1bm5hYmxlPEU+IGltcGxlbWVudHMgUnVubmFibGUgewotCQlmaW5hbCBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3I7Ci0JCWJvb2xlYW4gaGFzUHJldmlvdXM7Ci0KLQkJSGFzUHJldmlvdXNUZXN0UnVubmFibGUoTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGhpcy5oYXNQcmV2aW91cyA9IHRoaXMuaXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogbmV4dCBpbmRleCBydW5uYWJsZQotCSAqLwotCWNsYXNzIE5leHRJbmRleFRlc3RSdW5uYWJsZTxFPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yOwotCQlpbnQgbmV4dEluZGV4OwotCi0JCU5leHRJbmRleFRlc3RSdW5uYWJsZShMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLm5leHRJbmRleCA9IHRoaXMuaXRlcmF0b3IubmV4dEluZGV4KCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHByZXZpb3VzIGluZGV4IHJ1bm5hYmxlCi0JICovCi0JY2xhc3MgUHJldmlvdXNJbmRleFRlc3RSdW5uYWJsZTxFPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yOwotCQlpbnQgcHJldmlvdXNJbmRleDsKLQotCQlQcmV2aW91c0luZGV4VGVzdFJ1bm5hYmxlKExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRoaXMucHJldmlvdXNJbmRleCA9IHRoaXMuaXRlcmF0b3IucHJldmlvdXNJbmRleCgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBzZXQgcnVubmFibGUKLQkgKi8KLQljbGFzcyBTZXRUZXN0UnVubmFibGU8RT4gaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCWZpbmFsIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcjsKLQkJZmluYWwgRSBlbGVtZW50OwotCi0JCVNldFRlc3RSdW5uYWJsZShMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IsIEUgZWxlbWVudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLnNldCh0aGlzLmVsZW1lbnQpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBhZGQgcnVubmFibGUKLQkgKi8KLQljbGFzcyBBZGRUZXN0UnVubmFibGU8RT4gaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCWZpbmFsIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcjsKLQkJZmluYWwgRSBlbGVtZW50OwotCi0JCUFkZFRlc3RSdW5uYWJsZShMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IsIEUgZWxlbWVudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLmFkZCh0aGlzLmVsZW1lbnQpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGl0ZXJhdG9yOiBJZiB7QGxpbmsgI25leHQoKX0gb3Ige0BsaW5rICNwcmV2aW91cygpfSBpcyBjYWxsZWQKLQkgKiB3aGlsZSBleGVjdXRpbmcgb24gdGhlIHtAbGluayBzbG93VGhyZWFkfSwgdGhlIGl0ZXJhdG9yIHdpbGwgZGVsYXkKLQkgKiBmb3IgdGhlIGNvbmZpZ3VyZWQgdGltZS4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgVGVzdExpc3RJdGVyYXRvcjxFPiBleHRlbmRzIFRlc3RJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPiB7Ci0KLQkJVGVzdExpc3RJdGVyYXRvcihsb25nIGRlbGF5LCBFLi4uIGFycmF5KSB7Ci0JCQlzdXBlcihkZWxheSwgYXJyYXkpOwotCQl9Ci0KLQkJcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uZXh0SW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJCXJldHVybiB0aGlzLm5leHRJbmRleCAhPSAwOwotCQl9Ci0KLQkJcHVibGljIEUgcHJldmlvdXMoKSB7Ci0JCQlpZiAodGhpcy5oYXNQcmV2aW91cygpKSB7Ci0JCQkJRSBwcmV2aW91cyA9IHRoaXMubGlzdC5nZXQodGhpcy5wcmV2aW91c0luZGV4KCkpOwotCQkJCWlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpID09IHRoaXMuc2xvd1RocmVhZCkgewotCQkJCQlUZXN0VG9vbHMuc2xlZXAodGhpcy5kZWxheSk7Ci0JCQkJfQotCQkJCXRoaXMubmV4dEluZGV4LS07Ci0JCQkJdGhpcy5sYXN0SW5kZXggPSB0aGlzLm5leHRJbmRleDsKLQkJCQlyZXR1cm4gcHJldmlvdXM7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQkJcmV0dXJuIHRoaXMubmV4dEluZGV4IC0gMTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldChFIGUpIHsKLQkJCWlmICh0aGlzLmxhc3RJbmRleCA9PSAtMSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMubGlzdC5zZXQodGhpcy5sYXN0SW5kZXgsIGUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkKEUgZSkgewotCQkJdGhpcy5saXN0LmFkZCh0aGlzLmxhc3RJbmRleCwgZSk7Ci0JCQl0aGlzLmxhc3RJbmRleCsrOwotCQkJdGhpcy5sYXN0SW5kZXggPSAtMTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uSXRlcmF0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY3MTg1YS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25JdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoOCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvclVwY2FzdCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoOCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVySGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyB0cmFuc2Zvcm1hdGlvbiIsICsraSwgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0VXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgdHJhbnNmb3JtYXRpb24iLCArK2ksICgoSW50ZWdlcikgc3RyZWFtLm5leHQoKSkuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgdHJhbnNmb3JtYXRpb24iLCArK2ksIHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZElubmVyVHJhbnNmb3JtYXRpb25JdGVyYXRvcihjLml0ZXJhdG9yKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZENvbGxlY3Rpb24oKS5zaXplKCkgLSAxLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24iLCBjLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGMuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lclJlbW92ZSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKGMuaXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZENvbGxlY3Rpb24oKS5zaXplKCkgLSAxLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24iLCBjLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGMuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlJbnRlZ2VyIGludGVnZXIgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJaW50ZWdlciA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWludGVnZXIgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgaW50ZWdlciwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaW50IGkgPSBzdHJlYW0ubmV4dCgpLmludFZhbHVlKCk7Ci0JCQlpZiAoaSA9PSAzKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLmJ1aWxkSXRlcmF0b3IoKS5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRJdGVyYXRvclVwY2FzdCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVXBjYXN0KHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXJVcGNhc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZElubmVySXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25JdGVyYXRvcih0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8SW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IsIFRyYW5zZm9ybWVyPFN0cmluZywgSW50ZWdlcj4gdHJhbnNmb3JtZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgSW50ZWdlcj4obmVzdGVkSXRlcmF0b3IsIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVXBjYXN0KEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IsIFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4gdHJhbnNmb3JtZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPE9iamVjdCwgT2JqZWN0PihuZXN0ZWRJdGVyYXRvciwgdHJhbnNmb3JtZXIpOwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPigpIHsKLQkJCXB1YmxpYyBJbnRlZ2VyIHRyYW5zZm9ybShTdHJpbmcgbmV4dCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcihuZXh0Lmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1lclVwY2FzdCgpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4oKSB7Ci0JCQlwdWJsaWMgSW50ZWdlciB0cmFuc2Zvcm0oT2JqZWN0IG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoKChTdHJpbmcpIG5leHQpLmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPihuZXN0ZWRJdGVyYXRvcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIobmV4dC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlQ29sbGVjdGlvbigpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiMSIpOwotCQljLmFkZCgiMjIiKTsKLQkJYy5hZGQoIjMzMyIpOwotCQljLmFkZCgiNDQ0NCIpOwotCQljLmFkZCgiNTU1NTUiKTsKLQkJYy5hZGQoIjY2NjY2NiIpOwotCQljLmFkZCgiNzc3Nzc3NyIpOwotCQljLmFkZCgiODg4ODg4ODgiKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IoKSB7Ci0JCS8vIG1pc3NpbmcgbWV0aG9kIG92ZXJyaWRlCi0JCUl0ZXJhdG9yPEludGVnZXI+IGl0ZXJhdG9yID0gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpLml0ZXJhdG9yKCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlJbnRlZ2VyIGludGVnZXIgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKCJpbnZhbGlkIGludGVnZXI6ICIgKyBpbnRlZ2VyKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTQzODA5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0QW5kSGFzUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dEFuZEhhc1ByZXZpb3VzVXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvclVwY2FzdCgpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJIYXNOZXh0QW5kSGFzUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDgsIGkpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpLS07Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0QW5kUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoKytpLCBzdHJlYW0ubmV4dCgpLmludFZhbHVlKCkpOwotCQl9Ci0KLQkJKytpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKC0taSwgc3RyZWFtLnByZXZpb3VzKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJOZXh0QW5kUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygrK2ksIHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0JCX0KLQotCQkrK2k7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoLS1pLCBzdHJlYW0ucHJldmlvdXMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXhBbmRQcmV2aW91c0luZGV4KCkgewotCQlpbnQgaSA9IC0xOwotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygrK2ksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0KLQkJKytpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKC0taSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lck5leHRJbmRleEFuZFByZXZpb3VzSW5kZXgoKSB7Ci0JCWludCBpID0gLTE7Ci0JCUxpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoKytpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCi0JCSsraTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygtLWksIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlMaXN0PFN0cmluZz4gbCA9IHRoaXMuYnVpbGRMaXN0KCk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lclRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKGwubGlzdEl0ZXJhdG9yKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZExpc3QoKS5zaXplKCkgLSAxLCBsLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGxpc3QiLCBsLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGwuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lclJlbW92ZSgpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSB0aGlzLmJ1aWxkTGlzdCgpOwotCQlmb3IgKExpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IobC5saXN0SXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZExpc3QoKS5zaXplKCkgLSAxLCBsLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGxpc3QiLCBsLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGwuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbk9uQWRkKCkgewotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5hZGQobmV3IEludGVnZXIoMCkpOwotCQkJZmFpbCgiZXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbk9uU2V0KCkgewotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5zZXQobmV3IEludGVnZXIoMCkpOwotCQkJZmFpbCgiZXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUxpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsKLQkJSW50ZWdlciBpbnRlZ2VyID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWludGVnZXIgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlpbnRlZ2VyID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIGludGVnZXIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWludCBpID0gc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpOwotCQkJaWYgKGkgPT0gMykgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5idWlsZEl0ZXJhdG9yKCkucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkSXRlcmF0b3JVcGNhc3QoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JVcGNhc3QodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lclVwY2FzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZElubmVySXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8SW50ZWdlcj4gYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcih0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IsIFRyYW5zZm9ybWVyPFN0cmluZywgSW50ZWdlcj4gdHJhbnNmb3JtZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjxTdHJpbmcsIEludGVnZXI+KG5lc3RlZEl0ZXJhdG9yLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8T2JqZWN0PiBidWlsZFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yVXBjYXN0KExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yLCBUcmFuc2Zvcm1lcjxPYmplY3QsIEludGVnZXI+IHRyYW5zZm9ybWVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8T2JqZWN0LCBPYmplY3Q+KG5lc3RlZEl0ZXJhdG9yLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSBlYWNoIHN0cmluZyBpbnRvIGFuIGludGVnZXIgd2l0aCBhIHZhbHVlIG9mIHRoZSBzdHJpbmcncyBsZW5ndGgKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+KCkgewotCQkJcHVibGljIEludGVnZXIgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKG5leHQubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8T2JqZWN0LCBJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWVyVXBjYXN0KCkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8T2JqZWN0LCBJbnRlZ2VyPigpIHsKLQkJCXB1YmxpYyBJbnRlZ2VyIHRyYW5zZm9ybShPYmplY3QgbmV4dCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcigoKFN0cmluZykgbmV4dCkubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPihuZXN0ZWRJdGVyYXRvcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIobmV4dC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZE5lc3RlZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3QoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTGlzdCgpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbC5hZGQoIjEiKTsKLQkJbC5hZGQoIjIyIik7Ci0JCWwuYWRkKCIzMzMiKTsKLQkJbC5hZGQoIjQ0NDQiKTsKLQkJbC5hZGQoIjU1NTU1Iik7Ci0JCWwuYWRkKCI2NjY2NjYiKTsKLQkJbC5hZGQoIjc3Nzc3NzciKTsKLQkJbC5hZGQoIjg4ODg4ODg4Iik7Ci0JCXJldHVybiBsOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTGlzdCgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcigpIHsKLQkJLy8gbWlzc2luZyBtZXRob2Qgb3ZlcnJpZGUKLQkJSXRlcmF0b3I8SW50ZWdlcj4gaXRlcmF0b3IgPSBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPih0aGlzLmJ1aWxkTGlzdCgpLmxpc3RJdGVyYXRvcigpKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJSW50ZWdlciBpbnRlZ2VyID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbCgiaW52YWxpZCBpbnRlZ2VyOiAiICsgaW50ZWdlcik7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmVlSXRlcmF0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmVlSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODAwZTEyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJlZUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJlZUl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqIHRoaXMgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhbGwgdGhlIG5vZGVzIGNyZWF0ZWQgZm9yIHRoZSB0ZXN0ICovCi0JQ29sbGVjdGlvbjxUcmVlTm9kZT4gbm9kZXMgPSBuZXcgQXJyYXlMaXN0PFRyZWVOb2RlPigpOwotCi0JcHVibGljIFRyZWVJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dDEoKSB7Ci0JCXRoaXMudmVyaWZ5SGFzTmV4dCh0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dDIoKSB7Ci0JCXRoaXMudmVyaWZ5SGFzTmV4dCh0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTmV4dChJdGVyYXRvcjxUcmVlTm9kZT4gaXRlcmF0b3IpIHsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMubm9kZXMuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dDEoKSB7Ci0JCXRoaXMudmVyaWZ5TmV4dCh0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dDIoKSB7Ci0JCXRoaXMudmVyaWZ5TmV4dCh0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TmV4dChJdGVyYXRvcjxUcmVlTm9kZT4gaXRlcmF0b3IpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgZWxlbWVudCIsIHRoaXMubm9kZXMuY29udGFpbnMoaXRlcmF0b3IubmV4dCgpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbjEoKSB7Ci0JCXRoaXMudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbih0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbjIoKSB7Ci0JCXRoaXMudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbih0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbihJdGVyYXRvcjxUcmVlTm9kZT4gaXRlcmF0b3IpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlMSgpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmUodGhpcy5idWlsZFRyZWVJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZTIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlKHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmUoSXRlcmF0b3I8VHJlZU5vZGU+IGl0ZXJhdG9yKSB7Ci0JCVN0cmluZyBwYXJlbnROYW1lID0gImNoaWxkIDIiOwotCQlTdHJpbmcgY2hpbGROYW1lID0gImdyYW5kY2hpbGQgMkEiOwotCQlpbnQgc3RhcnRTaXplID0gdGhpcy5jaGlsZHJlblNpemUocGFyZW50TmFtZSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVRyZWVOb2RlIG5vZGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobm9kZS5nZXROYW1lKCkuZXF1YWxzKGNoaWxkTmFtZSkpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlpbnQgZW5kU2l6ZSA9IHRoaXMuY2hpbGRyZW5TaXplKHBhcmVudE5hbWUpOwotCQlhc3NlcnRFcXVhbHMoc3RhcnRTaXplIC0gMSwgZW5kU2l6ZSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY2hpbGRyZW5TaXplKFN0cmluZyBub2RlTmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yPFRyZWVOb2RlPiBzdHJlYW0gPSB0aGlzLm5vZGVzLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlUcmVlTm9kZSBub2RlID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChub2RlLmdldE5hbWUoKS5lcXVhbHMobm9kZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIG5vZGUuY2hpbGRyZW5TaXplKCk7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihub2RlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogYnVpbGQgYSB0cmVlIGl0ZXJhdG9yIHdpdGggYW4gZXhwbGljaXQgbWlkd2lmZQotCSAqLwotCXByaXZhdGUgSXRlcmF0b3I8VHJlZU5vZGU+IGJ1aWxkVHJlZUl0ZXJhdG9yMSgpIHsKLQkJcmV0dXJuIG5ldyBUcmVlSXRlcmF0b3I8VHJlZU5vZGU+KHRoaXMuYnVpbGRUcmVlKCksIHRoaXMuYnVpbGRNaWR3aWZlKCkpOwotCX0KLQotCXByaXZhdGUgVHJlZUl0ZXJhdG9yLk1pZHdpZmU8VHJlZU5vZGU+IGJ1aWxkTWlkd2lmZSgpIHsKLQkJcmV0dXJuIG5ldyBUcmVlSXRlcmF0b3IuTWlkd2lmZTxUcmVlTm9kZT4oKSB7Ci0JCQlwdWJsaWMgSXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKFRyZWVOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5jaGlsZHJlbigpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIGJ1aWxkIGEgdHJlZSBpdGVyYXRvciB3aXRoIGFuIG92ZXJyaWRlCi0JICovCi0JcHJpdmF0ZSBJdGVyYXRvcjxUcmVlTm9kZT4gYnVpbGRUcmVlSXRlcmF0b3IyKCkgewotCQlyZXR1cm4gbmV3IFRyZWVJdGVyYXRvcjxUcmVlTm9kZT4odGhpcy5idWlsZFRyZWUoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKFRyZWVOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5jaGlsZHJlbigpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVHJlZUl0ZXJhdG9yKCkgewotCQkvLyBtaXNzaW5nIG1ldGhvZCBvdmVycmlkZQotCQlJdGVyYXRvcjxUcmVlTm9kZT4gaXRlcmF0b3IgPSBuZXcgVHJlZUl0ZXJhdG9yPFRyZWVOb2RlPih0aGlzLmJ1aWxkVHJlZSgpKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJVHJlZU5vZGUgdG4gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKCJpbnZhbGlkIHRyZWUgbm9kZTogIiArIHRuKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlTm9kZSBidWlsZFRyZWUoKSB7Ci0JCVRyZWVOb2RlIHJvb3QgPSBuZXcgVHJlZU5vZGUoInJvb3QiKTsKLQkJVHJlZU5vZGUgY2hpbGQxID0gbmV3IFRyZWVOb2RlKHJvb3QsICJjaGlsZCAxIik7Ci0JCW5ldyBUcmVlTm9kZShjaGlsZDEsICJncmFuZGNoaWxkIDFBIik7Ci0JCVRyZWVOb2RlIGNoaWxkMiA9IG5ldyBUcmVlTm9kZShyb290LCAiY2hpbGQgMiIpOwotCQluZXcgVHJlZU5vZGUoY2hpbGQyLCAiZ3JhbmRjaGlsZCAyQSIpOwotCQlUcmVlTm9kZSBncmFuZGNoaWxkMkIgPSBuZXcgVHJlZU5vZGUoY2hpbGQyLCAiZ3JhbmRjaGlsZCAyQiIpOwotCQluZXcgVHJlZU5vZGUoZ3JhbmRjaGlsZDJCLCAiZ3JlYXQtZ3JhbmRjaGlsZCAyQjEiKTsKLQkJbmV3IFRyZWVOb2RlKGdyYW5kY2hpbGQyQiwgImdyZWF0LWdyYW5kY2hpbGQgMkIyIik7Ci0JCVRyZWVOb2RlIGdyYW5kY2hpbGQyQyA9IG5ldyBUcmVlTm9kZShjaGlsZDIsICJncmFuZGNoaWxkIDJDIik7Ci0JCW5ldyBUcmVlTm9kZShncmFuZGNoaWxkMkMsICJncmVhdC1ncmFuZGNoaWxkIDJDMSIpOwotCQluZXcgVHJlZU5vZGUocm9vdCwgImNoaWxkIDMiKTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUcmVlTm9kZSB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxUcmVlTm9kZT4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PFRyZWVOb2RlPigpOwotCi0JCXB1YmxpYyBUcmVlTm9kZShTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCVRyZWVJdGVyYXRvclRlc3RzLnRoaXMubm9kZXMuYWRkKHRoaXMpOyAvLyBsb2cgbm9kZQotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBUcmVlTm9kZShUcmVlTm9kZSBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzKG5hbWUpOwotCQkJcGFyZW50LmFkZENoaWxkKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRDaGlsZChUcmVlTm9kZSBjaGlsZCkgewotCQkJdGhpcy5jaGlsZHJlbi5hZGQoY2hpbGQpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPFRyZWVOb2RlPiBjaGlsZHJlbigpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuLnNpemUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUcmVlTm9kZSgiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvQ2hhbmdlU3VwcG9ydFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvQ2hhbmdlU3VwcG9ydFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNjY4MjcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL0NoYW5nZVN1cHBvcnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDaGFuZ2VTdXBwb3J0VGVzdHMKLQlleHRlbmRzIFRlc3RDYXNlCi17Ci0JVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVE9fU1RSSU5HID0gInRoaXMgaXMgYSB0ZXN0IjsKLQotCUNoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyID0gbmV3IEFkYXB0ZXIoKTsKLQotCVN0YXRlQ2hhbmdlRXZlbnQgc3RhdGVDaGFuZ2VFdmVudDsKLQlib29sZWFuIHN0YXRlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCi0JUHJvcGVydHlDaGFuZ2VFdmVudCBwcm9wZXJ0eUNoYW5nZUV2ZW50OwotCWJvb2xlYW4gcHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUUgPSAicHJvcGVydHlOYW1lIjsKLQlzdGF0aWMgZmluYWwgT2JqZWN0IE9MRF9PQkpFQ1RfVkFMVUUgPSBuZXcgT2JqZWN0KCk7Ci0Jc3RhdGljIGZpbmFsIE9iamVjdCBORVdfT0JKRUNUX1ZBTFVFID0gbmV3IE9iamVjdCgpOwotCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIE9MRF9JTlRfVkFMVUUgPSBuZXcgSW50ZWdlcigyNyk7Ci0Jc3RhdGljIGZpbmFsIEJvb2xlYW4gT0xEX0JPT0xFQU5fVkFMVUUgPSBCb29sZWFuLlRSVUU7Ci0Jc3RhdGljIGZpbmFsIEludGVnZXIgTkVXX0lOVF9WQUxVRSA9IG5ldyBJbnRlZ2VyKDQyKTsKLQlzdGF0aWMgZmluYWwgQm9vbGVhbiBORVdfQk9PTEVBTl9WQUxVRSA9IEJvb2xlYW4uRkFMU0U7Ci0KLQlDb2xsZWN0aW9uRXZlbnQgY29sbGVjdGlvbkV2ZW50OwotCWJvb2xlYW4gaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JYm9vbGVhbiBjb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MTEVDVElPTl9OQU1FID0gImNvbGxlY3Rpb25OYW1lIjsKLQlzdGF0aWMgZmluYWwgT2JqZWN0IEFEREVEX09CSkVDVF9WQUxVRSA9IG5ldyBPYmplY3QoKTsKLQlzdGF0aWMgZmluYWwgT2JqZWN0IEFEREVEX09CSkVDVF9WQUxVRV8yID0gbmV3IE9iamVjdCgpOwotCXN0YXRpYyBmaW5hbCBPYmplY3QgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUgPSBuZXcgT2JqZWN0KCk7Ci0Jc3RhdGljIGZpbmFsIGludCBUQVJHRVRfSU5ERVggPSA3OwotCXN0YXRpYyBmaW5hbCBpbnQgU09VUkNFX0lOREVYID0gMjI7Ci0KLQlMaXN0RXZlbnQgbGlzdEV2ZW50OwotCWJvb2xlYW4gaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGl0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGl0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JYm9vbGVhbiBpdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gbGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX05BTUUgPSAibGlzdE5hbWUiOwotCXN0YXRpYyBmaW5hbCBpbnQgQUREX0lOREVYID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9JTkRFWCA9IDU7Ci0Jc3RhdGljIGZpbmFsIGludCBSRVBMQUNFX0lOREVYID0gMjsKLQotCVRyZWVFdmVudCB0cmVlRXZlbnQ7Ci0JYm9vbGVhbiBub2RlQWRkZWRDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIG5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JYm9vbGVhbiB0cmVlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gdHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRSRUVfTkFNRSA9ICJ0cmVlTmFtZSI7Ci0Jc3RhdGljIGZpbmFsIExpc3Q8T2JqZWN0PiBPQkpFQ1RfUEFUSCA9IEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHtuZXcgT2JqZWN0KCksIG5ldyBPYmplY3QoKSwgbmV3IFN0cmluZygpfSk7Ci0KLQotCXB1YmxpYyBDaGFuZ2VTdXBwb3J0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy50ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBnZW5lcmFsIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsU291cmNlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlDaGFuZ2VTdXBwb3J0IGNzID0gbmV3IENoYW5nZVN1cHBvcnQobnVsbCk7Ci0JCQlmYWlsKCJib2d1cyBjaGFuZ2Ugc3VwcG9ydDogIiArIGNzKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHN0YXRlIGNoYW5nZSB0ZXN0cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVN0YXRlQ2hhbmdlKCkgewotCQl0aGlzLnN0YXRlQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnN0YXRlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVTdGF0ZUNoYW5nZSgpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuc3RhdGVDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy5zdGF0ZUNoYW5nZUV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN0YXRlQ2hhbmdlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVyc0R1cGxpY2F0ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGROdWxsU3RhdGVMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihudWxsKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQm9ndXNTdGF0ZUxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKG5ldyBBZGFwdGVyKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihuZXcgU3RhdGVDaGFuZ2VBZGFwdGVyKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJvcGVydHkgY2hhbmdlIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnQoKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9PQkpFQ1RfVkFMVUUsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9PQkpFQ1RfVkFMVUUsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnROb0NoYW5nZSgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0KCkgewotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE9iamVjdCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT0xEX09CSkVDVF9WQUxVRSwgTkVXX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0KCk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChPTERfT0JKRUNUX1ZBTFVFLCBORVdfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3ROb0NoYW5nZSgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdCgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3QoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KG51bGwsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQobnVsbCwgTkVXX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdCgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRJbnRJbnQoKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkSW50SW50KCk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChPTERfSU5UX1ZBTFVFLCBORVdfSU5UX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludCgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRJbnRJbnQoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9JTlRfVkFMVUUsIE5FV19JTlRfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRJbnRJbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludE5vQ2hhbmdlKCkgewotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRJbnRJbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRJbnRJbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRJbnRJbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW4oKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW4oKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9CT09MRUFOX1ZBTFVFLCBORVdfQk9PTEVBTl9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbigpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbigpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT0xEX0JPT0xFQU5fVkFMVUUsIE5FV19CT09MRUFOX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW4oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEJvb2xlYW5Cb29sZWFuTm9DaGFuZ2UoKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW5Ob0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW5Ob0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbk5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEJvb2xlYW5Cb29sZWFuTm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE51bGxQcm9wZXJ0eUxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcihudWxsKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTnVsbFByb3BlcnR5TGlzdGVuZXJOYW1lKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCBudWxsKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQm9ndXNQcm9wZXJ0eUxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCBuZXcgUHJvcGVydHlDaGFuZ2VBZGFwdGVyKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbmV3IFByb3BlcnR5Q2hhbmdlQWRhcHRlcigpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIG5ldyBQcm9wZXJ0eUNoYW5nZUFkYXB0ZXIoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLnRlc3RNb2RlbCwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQUk9QRVJUWV9OQU1FLCB0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCB0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25FdmVudCgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25FdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25FdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbigpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbigpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbk5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25Ob0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbk5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtQWRkZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtQWRkZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50KCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25FdmVudCgpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnROb0NoYW5nZSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbigpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbk5vQ2hhbmdlKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbk5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25Ob0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtUmVtb3ZlZENvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZW1vdmVkQ29sbGVjdGlvbigpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVtb3ZlZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZW1vdmVkQ29sbGVjdGlvbigpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUNvbGxlY3Rpb25DbGVhcmVkKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNsZWFyZWQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DbGVhcmVkKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNsZWFyZWQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DbGVhcmVkKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNoYW5nZWRFdmVudCgpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNoYW5nZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1Ub0NvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0NvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0NvbGxlY3Rpb24oKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtVG9Db2xsZWN0aW9uKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1Ub0NvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbk1peGVkKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uTWl4ZWQoKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRV8yKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uTWl4ZWQoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uTWl4ZWQoKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRV8yKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uTWl4ZWQoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uTm9DaGFuZ2UoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQyKFJFTU9WRURfT0JKRUNUX1ZBTFVFLCAiZm9vIiwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25DaGFuZ2VFdmVudDIoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUsICJmb28iLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTEoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UxKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTEoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTIoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UyKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTIoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTMoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMygpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UzKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTMoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMygpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMSgpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMSgpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JLy8gY29sbGVjdGlvbiBjbGVhcmVkLi4uCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbjIoKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24yKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbjIoKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24yKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uTm9DaGFuZ2UxKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uTm9DaGFuZ2UxKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uTm9DaGFuZ2UxKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uTm9DaGFuZ2UxKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uTm9DaGFuZ2UxKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTIoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTIoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTIoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTIoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTIoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhckNvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJDb2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdENsZWFyQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJDb2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdENsZWFyQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhckNvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJDb2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RDbGVhckNvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdENsZWFyQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJDb2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVDb2xsZWN0aW9uMSgpIHsKLQkJQ29sbGVjdGlvblN5bmNoTGlzdGVuZXIgY3NsID0gbmV3IENvbGxlY3Rpb25TeW5jaExpc3RlbmVyKCk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKGNzbCk7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFN5bmNocm9uaXplQ29sbGVjdGlvbjEoKSk7Ci0JCWFzc2VydFRydWUoY3NsLml0ZW1zQWRkZWQpOwotCQlhc3NlcnRUcnVlKGNzbC5pdGVtc1JlbW92ZWQpOwotCQlhc3NlcnRGYWxzZShjc2wuY29sbGVjdGlvbkNoYW5nZWQpOwotCQlhc3NlcnRGYWxzZShjc2wuY29sbGVjdGlvbkNsZWFyZWQpOwotCQlhc3NlcnRFcXVhbHMoMiwgY3NsLmFkZGVkSXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoY3NsLmFkZGVkSXRlbXMsIG5ldyBPYmplY3RbXSB7ImpvbyIsICJqYXIifSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgY3NsLnJlbW92ZWRJdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjc2wucmVtb3ZlZEl0ZW1zLCBuZXcgT2JqZWN0W10geyJmb28iLCAiYmFyIn0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVDb2xsZWN0aW9uMigpIHsKLQkJQ29sbGVjdGlvblN5bmNoTGlzdGVuZXIgY3NsID0gbmV3IENvbGxlY3Rpb25TeW5jaExpc3RlbmVyKCk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKGNzbCk7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFN5bmNocm9uaXplQ29sbGVjdGlvbjIoKSk7Ci0JCWFzc2VydEZhbHNlKGNzbC5pdGVtc0FkZGVkKTsKLQkJYXNzZXJ0RmFsc2UoY3NsLml0ZW1zUmVtb3ZlZCk7Ci0JCWFzc2VydEZhbHNlKGNzbC5jb2xsZWN0aW9uQ2hhbmdlZCk7Ci0JCWFzc2VydFRydWUoY3NsLmNvbGxlY3Rpb25DbGVhcmVkKTsKLQkJYXNzZXJ0VHJ1ZShjc2wuYWRkZWRJdGVtcy5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGNzbC5yZW1vdmVkSXRlbXMuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVDb2xsZWN0aW9uMygpIHsKLQkJQ29sbGVjdGlvblN5bmNoTGlzdGVuZXIgY3NsID0gbmV3IENvbGxlY3Rpb25TeW5jaExpc3RlbmVyKCk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKGNzbCk7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFN5bmNocm9uaXplQ29sbGVjdGlvbjMoKSk7Ci0JCWFzc2VydFRydWUoY3NsLml0ZW1zQWRkZWQpOwotCQlhc3NlcnRGYWxzZShjc2wuaXRlbXNSZW1vdmVkKTsKLQkJYXNzZXJ0RmFsc2UoY3NsLmNvbGxlY3Rpb25DaGFuZ2VkKTsKLQkJYXNzZXJ0RmFsc2UoY3NsLmNvbGxlY3Rpb25DbGVhcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGNzbC5hZGRlZEl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGNzbC5hZGRlZEl0ZW1zLCBuZXcgT2JqZWN0W10geyJqb28iLCAiamFyIiwgImJheiJ9KSk7Ci0JCWFzc2VydFRydWUoY3NsLnJlbW92ZWRJdGVtcy5pc0VtcHR5KCkpOwotCX0KLQotCWNsYXNzIENvbGxlY3Rpb25TeW5jaExpc3RlbmVyIGV4dGVuZHMgQ2hhbmdlQWRhcHRlciB7Ci0JCWJvb2xlYW4gaXRlbXNBZGRlZCA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1zUmVtb3ZlZCA9IGZhbHNlOwotCQlib29sZWFuIGNvbGxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7Ci0JCWJvb2xlYW4gY29sbGVjdGlvbkNsZWFyZWQgPSBmYWxzZTsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IGFkZGVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNsZWFyZWQgPSB0cnVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJdGhpcy5pdGVtc0FkZGVkID0gdHJ1ZTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5hZGRlZEl0ZW1zLCBldmVudC5nZXRJdGVtcygpKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJdGhpcy5pdGVtc1JlbW92ZWQgPSB0cnVlOwotCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLnJlbW92ZWRJdGVtcywgZXZlbnQuZ2V0SXRlbXMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ09MTEVDVElPTl9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ09MTEVDVElPTl9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDT0xMRUNUSU9OX05BTUUpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDT0xMRUNUSU9OX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDT0xMRUNUSU9OX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENPTExFQ1RJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGROdWxsQ29sbGVjdGlvbkxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCb2d1c0NvbGxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCJmb28iLCBuZXcgQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIG5ldyBDb2xsZWN0aW9uQ2hhbmdlQWRhcHRlcigpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbGxlY3Rpb25FdmVudChPYmplY3QgaXRlbSkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE1vZGVsLCB0aGlzLmNvbGxlY3Rpb25FdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDT0xMRUNUSU9OX05BTUUsIHRoaXMuY29sbGVjdGlvbkV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaXRlbSwgdGhpcy5nZXRDb2xsZWN0aW9uRXZlbnRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8Pz4gZ2V0Q29sbGVjdGlvbkV2ZW50SXRlbXMoKSB7Ci0JCWlmICh0aGlzLmNvbGxlY3Rpb25FdmVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb25BZGRFdmVudCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvbkFkZEV2ZW50KSB0aGlzLmNvbGxlY3Rpb25FdmVudCkuZ2V0SXRlbXMoKTsKLQkJfSBlbHNlIGlmICh0aGlzLmNvbGxlY3Rpb25FdmVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb25SZW1vdmVFdmVudCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvblJlbW92ZUV2ZW50KSB0aGlzLmNvbGxlY3Rpb25FdmVudCkuZ2V0SXRlbXMoKTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbGxlY3Rpb25DaGFuZ2VFdmVudDIoT2JqZWN0Li4uIGl0ZW1zKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0TW9kZWwsIHRoaXMuY29sbGVjdGlvbkV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jb2xsZWN0aW9uRXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtcy5sZW5ndGgsIHRoaXMuZ2V0Q29sbGVjdGlvbkV2ZW50SXRlbXNTaXplKCkpOwotCQlmb3IgKE9iamVjdCBpdGVtIDogaXRlbXMpIHsKLQkJCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0Q29sbGVjdGlvbkV2ZW50SXRlbXMoKSwgaXRlbSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0Q29sbGVjdGlvbkV2ZW50SXRlbXNTaXplKCkgewotCQlpZiAodGhpcy5jb2xsZWN0aW9uRXZlbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uQWRkRXZlbnQpIHsKLQkJCXJldHVybiAoKENvbGxlY3Rpb25BZGRFdmVudCkgdGhpcy5jb2xsZWN0aW9uRXZlbnQpLmdldEl0ZW1zU2l6ZSgpOwotCQl9IGVsc2UgaWYgKHRoaXMuY29sbGVjdGlvbkV2ZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvblJlbW92ZUV2ZW50KSB7Ci0JCQlyZXR1cm4gKChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQpIHRoaXMuY29sbGVjdGlvbkV2ZW50KS5nZXRJdGVtc1NpemUoKTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0RXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoQUREX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudChBRERfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0RXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoQUREX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdEFkZEV2ZW50KEFERF9JTkRFWCwgQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZExpc3ROb0NoYW5nZSgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbUFkZGVkTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoQUREX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtQWRkZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbUFkZGVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudChBRERfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0RXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoUkVNT1ZFX0lOREVYLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0RXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KFJFTU9WRV9JTkRFWCwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudChSRU1PVkVfSU5ERVgsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudChSRU1PVkVfSU5ERVgsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1SZW1vdmVkTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KFJFTU9WRV9JTkRFWCwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZW1vdmVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudChSRU1PVkVfSU5ERVgsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZW1vdmVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnQoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlcGxhY2VFdmVudChSRVBMQUNFX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KFJFUExBQ0VfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnROb0NoYW5nZSgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlcGxhY2VFdmVudChSRVBMQUNFX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZXBsYWNlRXZlbnQoUkVQTEFDRV9JTkRFWCwgQURERURfT0JKRUNUX1ZBTFVFLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1SZXBsYWNlZExpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVwbGFjZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlcGxhY2VFdmVudChSRVBMQUNFX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlcGxhY2VkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZXBsYWNlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KFJFUExBQ0VfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVwbGFjZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0RXZlbnQoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdE1vdmVFdmVudChUQVJHRVRfSU5ERVgsIFNPVVJDRV9JTkRFWCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0RXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdE1vdmVFdmVudChUQVJHRVRfSU5ERVgsIFNPVVJDRV9JTkRFWCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0RXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0TW92ZUV2ZW50KFRBUkdFVF9JTkRFWCwgU09VUkNFX0lOREVYKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RNb3ZlRXZlbnQoVEFSR0VUX0lOREVYLCBTT1VSQ0VfSU5ERVgpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc01vdmVkTGlzdE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtTW92ZWRMaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbU1vdmVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RNb3ZlRXZlbnQoVEFSR0VUX0lOREVYLCBTT1VSQ0VfSU5ERVgpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtTW92ZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbU1vdmVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RNb3ZlRXZlbnQoVEFSR0VUX0lOREVYLCBTT1VSQ0VfSU5ERVgpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtTW92ZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUxpc3RDbGVhcmVkRXZlbnQoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2xlYXJlZEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdENsZWFyRXZlbnQoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENsZWFyZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDbGVhcmVkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2xlYXJFdmVudCgpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2xlYXJlZEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUxpc3RDbGVhcmVkKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENsZWFyZWQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2xlYXJFdmVudCgpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2xlYXJlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDbGVhcmVkKCk7Ci0JCXRoaXMudmVyaWZ5TGlzdENsZWFyRXZlbnQoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENsZWFyZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlTGlzdENoYW5nZWRFdmVudCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDaGFuZ2VkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDaGFuZ2VkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2hhbmdlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVMaXN0Q2hhbmdlZCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDaGFuZ2VkKCk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZUV2ZW50KCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDaGFuZ2VkKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENoYW5nZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtVG9MaXN0SW5kZXgoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0xpc3RJbmRleCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudCgyLCAiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvTGlzdEluZGV4KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtVG9MaXN0SW5kZXgoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoMiwgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0xpc3RJbmRleCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1Ub0xpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0xpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoMywgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0xpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0xpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoMywgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0xpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc1RvTGlzdEluZGV4KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdEluZGV4KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdEFkZEV2ZW50KDIsICJqb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdEluZGV4KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdEluZGV4KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdEFkZEV2ZW50KDIsICJqb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdEluZGV4KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbXNUb0xpc3RJbmRleE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdEluZGV4Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXhOb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0xpc3RJbmRleE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdEluZGV4Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc1RvTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0xpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoMywgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudCgzLCAiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0xpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc1RvTGlzdE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbUZyb21MaXN0SW5kZXgoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21MaXN0SW5kZXgoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMSwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUxpc3RJbmRleCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1Gcm9tTGlzdEluZGV4KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KDEsICJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21MaXN0SW5kZXgoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1Gcm9tTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMSwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMSwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0SW5kZXgoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMSwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0SW5kZXgoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0SW5kZXgoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMSwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0SW5kZXgoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdEluZGV4Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0SW5kZXhOb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMSwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudCgxLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3ROb0NoYW5nZSgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkl0ZW1zSW5MaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KDAsICJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudCgwLCAiZm9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5MaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbUluTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVwbGFjZUl0ZW1Jbkxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KDEsICJ4eHgiLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVwbGFjZUl0ZW1Jbkxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlcGxhY2VJdGVtSW5MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlcGxhY2VFdmVudCgxLCAieHh4IiwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlcGxhY2VJdGVtSW5MaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SXRlbXNJbkxpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFNldEl0ZW1zSW5MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlcGxhY2VFdmVudCgxLCAieHh4IiwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFNldEl0ZW1zSW5MaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RTZXRJdGVtc0luTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZXBsYWNlRXZlbnQoMSwgInh4eCIsICJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RTZXRJdGVtc0luTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVJdGVtc0luTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0TW92ZUl0ZW1zSW5MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdE1vdmVFdmVudCgyLCA0LCAyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RNb3ZlSXRlbXNJbkxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdE1vdmVJdGVtc0luTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RNb3ZlRXZlbnQoMiwgNCwgMik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0TW92ZUl0ZW1zSW5MaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJMaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RDbGVhckxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2xlYXJFdmVudCgpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdENsZWFyTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdENsZWFyRXZlbnQoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RDbGVhckxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbml6ZUxpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RTeW5jaHJvbml6ZUxpc3QoKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0U3luY2hyb25pemVMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0U3luY2hyb25pemVMaXN0KCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFN5bmNocm9uaXplTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExJU1RfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExJU1RfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTElTVF9OQU1FKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTElTVF9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTElTVF9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMSVNUX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTnVsbExpc3RMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCBudWxsKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQm9ndXNMaXN0TGlzdGVuZXIoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbmV3IExpc3RDaGFuZ2VBZGFwdGVyKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCBuZXcgTGlzdENoYW5nZUFkYXB0ZXIoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0QWRkRXZlbnQoaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE1vZGVsLCB0aGlzLmxpc3RFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMSVNUX05BTUUsIHRoaXMubGlzdEV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoaW5kZXgsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtLCAoKExpc3RBZGRFdmVudCkgdGhpcy5saXN0RXZlbnQpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE1vZGVsLCB0aGlzLmxpc3RFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMSVNUX05BTUUsIHRoaXMubGlzdEV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoaW5kZXgsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5saXN0RXZlbnQpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KGludCBpbmRleCwgT2JqZWN0IG5ld0l0ZW0sIE9iamVjdCBvbGRJdGVtKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0TW9kZWwsIHRoaXMubGlzdEV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExJU1RfTkFNRSwgdGhpcy5saXN0RXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhpbmRleCwgKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdJdGVtLCAoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMubGlzdEV2ZW50KS5nZXROZXdJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZEl0ZW0sICgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5saXN0RXZlbnQpLmdldE9sZEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0TW92ZUV2ZW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMudmVyaWZ5TGlzdE1vdmVFdmVudCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIDEpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0TW92ZUV2ZW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0TW9kZWwsIHRoaXMubGlzdEV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExJU1RfTkFNRSwgdGhpcy5saXN0RXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0YXJnZXRJbmRleCwgKChMaXN0TW92ZUV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0VGFyZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2VJbmRleCwgKChMaXN0TW92ZUV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0U291cmNlSW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhsZW5ndGgsICgoTGlzdE1vdmVFdmVudCkgdGhpcy5saXN0RXZlbnQpLmdldExlbmd0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdENsZWFyRXZlbnQoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0TW9kZWwsIHRoaXMubGlzdEV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExJU1RfTkFNRSwgdGhpcy5saXN0RXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0Q2xlYXJFdmVudC5jbGFzcywgdGhpcy5saXN0RXZlbnQuZ2V0Q2xhc3MoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RDaGFuZ2VFdmVudCgpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy5saXN0RXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTElTVF9OQU1FLCB0aGlzLmxpc3RFdmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RDaGFuZ2VFdmVudC5jbGFzcywgdGhpcy5saXN0RXZlbnQuZ2V0Q2xhc3MoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRyZWUgY2hhbmdlIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlTm9kZUFkZGVkVHJlZSgpIHsKLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRUcmVlKCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KE9CSkVDVF9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRUcmVlKCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRUcmVlKCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KE9CSkVDVF9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRUcmVlKCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlQWRkZWRUcmVlRXZlbnQoKSB7Ci0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlQWRkZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZUFkZGVkVHJlZUV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KE9CSkVDVF9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRUcmVlRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZUFkZGVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUFkZGVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVBZGRlZFRyZWVFdmVudCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChPQkpFQ1RfUEFUSCk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlQWRkZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlQWRkZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZUFkZGVkVHJlZUV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlUmVtb3ZlZFRyZWVFdmVudCgpIHsKLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZUV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KE9CSkVDVF9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZVJlbW92ZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZVJlbW92ZWRUcmVlRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZVJlbW92ZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlUmVtb3ZlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlUmVtb3ZlZFRyZWVFdmVudCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChPQkpFQ1RfUEFUSCk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlUmVtb3ZlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZUV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZSgpIHsKLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZSgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChPQkpFQ1RfUEFUSCk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlUmVtb3ZlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZSgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlUmVtb3ZlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZSgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChPQkpFQ1RfUEFUSCk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlUmVtb3ZlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZSgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlUmVtb3ZlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVUcmVlQ2xlYXJlZEV2ZW50KCkgewotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNsZWFyZWRFdmVudCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNsZWFyZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50cmVlQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDbGVhcmVkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy50cmVlQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDbGVhcmVkRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlVHJlZUNsZWFyZWQoKSB7Ci0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2xlYXJlZCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNsZWFyZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2xlYXJlZCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNsZWFyZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlVHJlZUNoYW5nZWRFdmVudCgpIHsKLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDaGFuZ2VkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy50cmVlQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDaGFuZ2VkRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2hhbmdlZEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJlZUNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2hhbmdlZEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVRyZWVDaGFuZ2VkKCkgewotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNoYW5nZWQoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy50cmVlQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDaGFuZ2VkKCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNoYW5nZWQoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy50cmVlQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDaGFuZ2VkKCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1RyZWVDaGFuZ2VMaXN0ZW5lcnMoVFJFRV9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoVFJFRV9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vVHJlZUNoYW5nZUxpc3RlbmVycyhUUkVFX05BTUUpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vVHJlZUNoYW5nZUxpc3RlbmVycyhUUkVFX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUUkVFX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9UcmVlQ2hhbmdlTGlzdGVuZXJzKFRSRUVfTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGROdWxsVHJlZUxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoImZvbyIsIG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCb2d1c1RyZWVMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKCJmb28iLCBuZXcgVHJlZUNoYW5nZUFkYXB0ZXIoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoImZvbyIsIG5ldyBUcmVlQ2hhbmdlQWRhcHRlcigpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVRyZWVFdmVudChMaXN0PD8+IHBhdGgpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy50cmVlRXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoVFJFRV9OQU1FLCB0aGlzLnRyZWVFdmVudC5nZXRUcmVlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBhdGgsIHRoaXMuZ2V0TGlzdFBhdGgoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PD8+IGdldExpc3RQYXRoKCkgewotCQlJdGVyYWJsZTw/PiBpdGVyYWJsZSA9IHRoaXMuZ2V0UGF0aCgpOwotCQlyZXR1cm4gKGl0ZXJhYmxlID09IG51bGwpICA/IG51bGwgOiBDb2xsZWN0aW9uVG9vbHMubGlzdChpdGVyYWJsZSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTw/PiBnZXRQYXRoKCkgewotCQlpZiAodGhpcy50cmVlRXZlbnQgaW5zdGFuY2VvZiBUcmVlQWRkRXZlbnQpIHsKLQkJCXJldHVybiAoKFRyZWVBZGRFdmVudCkgdGhpcy50cmVlRXZlbnQpLmdldFBhdGgoKTsKLQkJfQotCQlpZiAodGhpcy50cmVlRXZlbnQgaW5zdGFuY2VvZiBUcmVlUmVtb3ZlRXZlbnQpIHsKLQkJCXJldHVybiAoKFRyZWVSZW1vdmVFdmVudCkgdGhpcy50cmVlRXZlbnQpLmdldFBhdGgoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0KLQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZUVxdWFsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCJmb28iKTsKLQkJYzEuYWRkKCJiYXIiKTsKLQkJYzEuYWRkKCJiYXoiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiZm9vIik7Ci0JCWMyLmFkZCgiYmFyIik7Ci0JCWMyLmFkZCgiYmF6Iik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEVsZW1lbnRzQXJlRXF1YWwoYzEsIGMyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlRGlmZmVyZW50KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCJmb28iKTsKLQkJYzEuYWRkKCJiYXIiKTsKLQkJYzEuYWRkKCJiYXoiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiYmF6Iik7Ci0JCWMyLmFkZCgiYmFyIik7Ci0JCWMyLmFkZCgiZm9vIik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEVsZW1lbnRzQXJlRGlmZmVyZW50KGMxLCBjMikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBYnN0cmFjdE1vZGVsIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsVmFsdWVzQXJlRXF1YWwxKCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RWYWx1ZXNBcmVFcXVhbChudWxsLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxWYWx1ZXNBcmVFcXVhbDIoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFZhbHVlc0FyZUVxdWFsKCJmb28iLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsVmFsdWVzQXJlRXF1YWwzKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0VmFsdWVzQXJlRXF1YWwoImZvbyIsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbFZhbHVlc0FyZUVxdWFsNCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFZhbHVlc0FyZUVxdWFsKG51bGwsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxWYWx1ZXNBcmVFcXVhbDUoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RWYWx1ZXNBcmVFcXVhbCgiYmFyIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbFZhbHVlc0FyZURpZmZlcmVudDEoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RWYWx1ZXNBcmVEaWZmZXJlbnQobnVsbCwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsVmFsdWVzQXJlRGlmZmVyZW50MigpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFZhbHVlc0FyZURpZmZlcmVudCgiZm9vIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbFZhbHVlc0FyZURpZmZlcmVudDMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFZhbHVlc0FyZURpZmZlcmVudCgiZm9vIiwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsVmFsdWVzQXJlRGlmZmVyZW50NCgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0VmFsdWVzQXJlRGlmZmVyZW50KG51bGwsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxWYWx1ZXNBcmVEaWZmZXJlbnQ1KCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RWYWx1ZXNBcmVEaWZmZXJlbnQoImJhciIsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxBdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQxKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKG51bGwsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZDIoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQoImZvbyIsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxBdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RBdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQoImZvbyIsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZDQoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZChudWxsLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsQXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkNSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKCJiYXIiLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsQXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkMSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKG51bGwsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZDIoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCgiZm9vIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZDMoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQoImZvbyIsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZDQoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQobnVsbCwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZDUoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQoImJhciIsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxDbG9uZSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUFJPUEVSVFlfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0KLQkJLy8gdmVyaWZ5IHRoYXQgdGhlIGNsb25lIGRvZXMgbm90IGhhdmUgYW55IGxpc3RlbmVycwotCQlUZXN0TW9kZWwgY2xvbmUgPSB0aGlzLnRlc3RNb2RlbC5jbG9uZSgpOwotCQlhc3NlcnRGYWxzZShjbG9uZS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0JCWNsb25lLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGNsb25lLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQkJLy8gY2hlY2sgb3JpZ2luYWwKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0KLQkJLy8gbm93IHRlc3QgZXZlbnRzIGZpcmVkIGJ5IG9yaWdpbmFsCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3QoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9PQkpFQ1RfVkFMVUUsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCS8vIG5vdyB0ZXN0IGV2ZW50cyBmaXJlZCBieSBjbG9uZQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCWNsb25lLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0KCk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChjbG9uZSwgT0xEX09CSkVDVF9WQUxVRSwgTkVXX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxUb1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50b1N0cmluZygpLmNvbnRhaW5zKCcoJyArIFRFU1RfVE9fU1RSSU5HICsgJyknKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVyIGltcGxlbWVudGF0aW9ucyAqKioqKioqKioqCi0KLQljbGFzcyBBZGFwdGVyIGltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5zdGF0ZUNoYW5nZWRDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMuc3RhdGVDaGFuZ2VFdmVudCA9IGU7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IGU7Ci0JCX0KLQkKLQkKLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMuY29sbGVjdGlvbkV2ZW50ID0gZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMuY29sbGVjdGlvbkV2ZW50ID0gZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBlOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLmxpc3RFdmVudCA9IGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLmxpc3RFdmVudCA9IGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLmxpc3RFdmVudCA9IGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLmxpc3RFdmVudCA9IGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubGlzdEV2ZW50ID0gZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubGlzdEV2ZW50ID0gZTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLm5vZGVBZGRlZENhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy50cmVlRXZlbnQgPSBlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5ub2RlUmVtb3ZlZENhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy50cmVlRXZlbnQgPSBlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLnRyZWVDbGVhcmVkQ2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLnRyZWVFdmVudCA9IGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLnRyZWVFdmVudCA9IGU7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0JCVRlc3RNb2RlbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvLyAqKioqKiBzdGF0ZQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVN0YXRlQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQotCQkvLyAqKioqKiBwcm9wZXJ0eQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEV2ZW50KCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMsIFBST1BFUlRZX05BTUUsIE9MRF9PQkpFQ1RfVkFMVUUsIE5FV19PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLCBQUk9QRVJUWV9OQU1FLCBPTERfT0JKRUNUX1ZBTFVFLCBPTERfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE9iamVjdCgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9QRVJUWV9OQU1FLCBPTERfT0JKRUNUX1ZBTFVFLCBORVdfT0JKRUNUX1ZBTFVFKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJPUEVSVFlfTkFNRSwgT0xEX09CSkVDVF9WQUxVRSwgT0xEX09CSkVDVF9WQUxVRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdCgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9QRVJUWV9OQU1FLCBORVdfT0JKRUNUX1ZBTFVFKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJPUEVSVFlfTkFNRSwgbnVsbCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludCgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9QRVJUWV9OQU1FLCBPTERfSU5UX1ZBTFVFLmludFZhbHVlKCksIE5FV19JTlRfVkFMVUUuaW50VmFsdWUoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludE5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBST1BFUlRZX05BTUUsIE9MRF9JTlRfVkFMVUUuaW50VmFsdWUoKSwgT0xEX0lOVF9WQUxVRS5pbnRWYWx1ZSgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW4oKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJPUEVSVFlfTkFNRSwgT0xEX0JPT0xFQU5fVkFMVUUuYm9vbGVhblZhbHVlKCksIE5FV19CT09MRUFOX1ZBTFVFLmJvb2xlYW5WYWx1ZSgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW5Ob0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9QRVJUWV9OQU1FLCBPTERfQk9PTEVBTl9WQUxVRS5ib29sZWFuVmFsdWUoKSwgT0xEX0JPT0xFQU5fVkFMVUUuYm9vbGVhblZhbHVlKCkpOwotCQl9Ci0KLQkJLy8gKioqKiogY29sbGVjdGlvbgotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uRXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKG5ldyBDb2xsZWN0aW9uQWRkRXZlbnQodGhpcywgQ09MTEVDVElPTl9OQU1FLCBBRERFRF9PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25FdmVudE5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChuZXcgQ29sbGVjdGlvbkFkZEV2ZW50KHRoaXMsIENPTExFQ1RJT05fTkFNRSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbigpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQoQ09MTEVDVElPTl9OQU1FLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oQURERURfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKENPTExFQ1RJT05fTkFNRSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKSB7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoQ09MTEVDVElPTl9OQU1FLCBBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQobmV3IENvbGxlY3Rpb25SZW1vdmVFdmVudCh0aGlzLCBDT0xMRUNUSU9OX05BTUUsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25FdmVudE5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKG5ldyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQodGhpcywgQ09MTEVDVElPTl9OQU1FLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb24oKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoQ09MTEVDVElPTl9OQU1FLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbk5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKENPTExFQ1RJT05fTkFNRSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1SZW1vdmVkQ29sbGVjdGlvbigpIHsKLQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKENPTExFQ1RJT05fTkFNRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVDb2xsZWN0aW9uQ2xlYXJlZCgpIHsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChuZXcgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KHRoaXMsIENPTExFQ1RJT05fTkFNRSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKENPTExFQ1RJT05fTkFNRSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oQURERURfT0JKRUNUX1ZBTFVFLCBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKSwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RBZGRJdGVtVG9Db2xsZWN0aW9uTm9DaGFuZ2UoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCQlyZXR1cm4gdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKEFEREVEX09CSkVDVF9WQUxVRSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKENvbGxlY3Rpb25zLnNpbmdsZXRvbihBRERFRF9PQkpFQ1RfVkFMVUUpLCBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKSwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbk5vQ2hhbmdlKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24oQ29sbGVjdGlvbnMuc2luZ2xldG9uKEFEREVEX09CSkVDVF9WQUxVRSksIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25NaXhlZCgpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJY29sbGVjdGlvbi5hZGQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKG5ldyBPYmplY3RbXSB7QURERURfT0JKRUNUX1ZBTFVFLCBBRERFRF9PQkpFQ1RfVkFMVUVfMn0sIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oUkVNT1ZFRF9PQkpFQ1RfVkFMVUUsIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uTm9DaGFuZ2UoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbigiZm9vIiwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCQljb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCQljb2xsZWN0aW9uLmFkZCgiYmFyIik7Ci0JCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKG5ldyBPYmplY3RbXSB7ImZvbyIsICJiYXIiLCBSRU1PVkVEX09CSkVDVF9WQUxVRX0sIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMSgpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJY29sbGVjdGlvbi5hZGQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBjb2xsZWN0aW9uLCBDT0xMRUNUSU9OX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTIoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oQ29sbGVjdGlvbnMuc2luZ2xldG9uKCJmb28iKSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UzKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKENvbGxlY3Rpb25zLnNpbmdsZXRvbigiZm9vIiksIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24xKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCQljb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCQljb2xsZWN0aW9uLmFkZCgiYmFyIik7Ci0JCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihuZXcgT2JqZWN0W10geyJmb28iLCAiYmFyIn0sIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24yKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCQljb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCQljb2xsZWN0aW9uLmFkZCgiYmFyIik7Ci0JCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBjb2xsZWN0aW9uLCBDT0xMRUNUSU9OX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uTm9DaGFuZ2UxKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihuZXcgT2JqZWN0W10geyJmb28iLCAiYmFyIn0sIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTIoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJiYXIiKTsKLQkJCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKG5ldyBPYmplY3RbXSB7ImZvbyIsICJiYXIiLCBSRU1PVkVEX09CSkVDVF9WQUxVRX0sIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0Q2xlYXJDb2xsZWN0aW9uKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCQljb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCQljb2xsZWN0aW9uLmFkZCgiYmFyIik7Ci0JCQlyZXR1cm4gdGhpcy5jbGVhckNvbGxlY3Rpb24oY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RDbGVhckNvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJcmV0dXJuIHRoaXMuY2xlYXJDb2xsZWN0aW9uKGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0U3luY2hyb25pemVDb2xsZWN0aW9uMSgpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJY29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQkJY29sbGVjdGlvbi5hZGQoImJhciIpOwotCQkJY29sbGVjdGlvbi5hZGQoImJheiIpOwotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQluZXdDb2xsZWN0aW9uLmFkZCgiam9vIik7Ci0JCQluZXdDb2xsZWN0aW9uLmFkZCgiamFyIik7Ci0JCQluZXdDb2xsZWN0aW9uLmFkZCgiYmF6Iik7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRoaXMuc3luY2hyb25pemVDb2xsZWN0aW9uKG5ld0NvbGxlY3Rpb24sIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbik7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdFN5bmNocm9uaXplQ29sbGVjdGlvbjIoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJiYXIiKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJiYXoiKTsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJYm9vbGVhbiByZXN1bHQgPSB0aGlzLnN5bmNocm9uaXplQ29sbGVjdGlvbihuZXdDb2xsZWN0aW9uLCBjb2xsZWN0aW9uLCBDT0xMRUNUSU9OX05BTUUpOwotCQkJYXNzZXJ0RXF1YWxzKG5ld0NvbGxlY3Rpb24sIGNvbGxlY3Rpb24pOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RTeW5jaHJvbml6ZUNvbGxlY3Rpb24zKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCW5ld0NvbGxlY3Rpb24uYWRkKCJqb28iKTsKLQkJCW5ld0NvbGxlY3Rpb24uYWRkKCJqYXIiKTsKLQkJCW5ld0NvbGxlY3Rpb24uYWRkKCJiYXoiKTsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGhpcy5zeW5jaHJvbml6ZUNvbGxlY3Rpb24obmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJCWFzc2VydEVxdWFscyhuZXdDb2xsZWN0aW9uLCBjb2xsZWN0aW9uKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQkvLyAqKioqKiBsaXN0Ci0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQobmV3IExpc3RBZGRFdmVudCh0aGlzLCBMSVNUX05BTUUsIEFERF9JTkRFWCwgQURERURfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0RXZlbnROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQobmV3IExpc3RBZGRFdmVudCh0aGlzLCBMSVNUX05BTUUsIEFERF9JTkRFWCwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZExpc3QoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKExJU1RfTkFNRSwgQUREX0lOREVYLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KEFEREVEX09CSkVDVF9WQUxVRSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkTGlzdE5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChMSVNUX05BTUUsIEFERF9JTkRFWCwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtQWRkZWRMaXN0KCkgewotCQkJdGhpcy5maXJlSXRlbUFkZGVkKExJU1RfTkFNRSwgQUREX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0RXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQobmV3IExpc3RSZW1vdmVFdmVudCh0aGlzLCBMSVNUX05BTUUsIFJFTU9WRV9JTkRFWCwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQobmV3IExpc3RSZW1vdmVFdmVudCh0aGlzLCBMSVNUX05BTUUsIFJFTU9WRV9JTkRFWCwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChMSVNUX05BTUUsIFJFTU9WRV9JTkRFWCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChSRU1PVkVEX09CSkVDVF9WQUxVRSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoTElTVF9OQU1FLCBSRU1PVkVfSU5ERVgsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbVJlbW92ZWRMaXN0KCkgewotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoTElTVF9OQU1FLCBSRU1PVkVfSU5ERVgsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQobmV3IExpc3RSZXBsYWNlRXZlbnQodGhpcywgTElTVF9OQU1FLCBSRVBMQUNFX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQobmV3IExpc3RSZXBsYWNlRXZlbnQodGhpcywgTElTVF9OQU1FLCBSRVBMQUNFX0lOREVYLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3QoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKExJU1RfTkFNRSwgUkVQTEFDRV9JTkRFWCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChBRERFRF9PQkpFQ1RfVkFMVUUpLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KFJFTU9WRURfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKExJU1RfTkFNRSwgUkVQTEFDRV9JTkRFWCwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbVJlcGxhY2VkTGlzdCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZChMSVNUX05BTUUsIFJFUExBQ0VfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc01vdmVkTGlzdEV2ZW50KCkgewotCQkJdGhpcy5maXJlSXRlbXNNb3ZlZChuZXcgTGlzdE1vdmVFdmVudCh0aGlzLCBMSVNUX05BTUUsIFRBUkdFVF9JTkRFWCwgU09VUkNFX0lOREVYLCAxKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0RXZlbnROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zTW92ZWQobmV3IExpc3RNb3ZlRXZlbnQodGhpcywgTElTVF9OQU1FLCBTT1VSQ0VfSU5ERVgsIFNPVVJDRV9JTkRFWCwgMSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc01vdmVkTGlzdCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zTW92ZWQoTElTVF9OQU1FLCBUQVJHRVRfSU5ERVgsIFNPVVJDRV9JTkRFWCwgMSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc01vdmVkKExJU1RfTkFNRSwgU09VUkNFX0lOREVYLCBTT1VSQ0VfSU5ERVgsIDEpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtTW92ZWRMaXN0KCkgewotCQkJdGhpcy5maXJlSXRlbU1vdmVkKExJU1RfTkFNRSwgVEFSR0VUX0lOREVYLCBTT1VSQ0VfSU5ERVgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVMaXN0Q2xlYXJlZEV2ZW50KCkgewotCQkJdGhpcy5maXJlTGlzdENsZWFyZWQobmV3IExpc3RDbGVhckV2ZW50KHRoaXMsIExJU1RfTkFNRSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVMaXN0Q2xlYXJlZCgpIHsKLQkJCXRoaXMuZmlyZUxpc3RDbGVhcmVkKExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUxpc3RDaGFuZ2VkRXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChuZXcgTGlzdENoYW5nZUV2ZW50KHRoaXMsIExJU1RfTkFNRSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlTGlzdENoYW5nZWQoKSB7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX05BTUUsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtVG9MaXN0SW5kZXgoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KDIsICJqb28iLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1Ub0xpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KCJqb28iLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXgoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5hZGRJdGVtc1RvTGlzdCgyLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJqb28iKSwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc1RvTGlzdEluZGV4Tm9DaGFuZ2UoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5hZGRJdGVtc1RvTGlzdCgyLCBDb2xsZWN0aW9ucy48U3RyaW5nPmVtcHR5TGlzdCgpLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zVG9MaXN0KCkgewotCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWxpc3QuYWRkKCJmb28iKTsKLQkJCWxpc3QuYWRkKCJiYXIiKTsKLQkJCWxpc3QuYWRkKCJiYXoiKTsKLQkJCXRoaXMuYWRkSXRlbXNUb0xpc3QoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgiam9vIiksIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbXNUb0xpc3ROb0NoYW5nZSgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCksIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbUZyb21MaXN0SW5kZXgoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoMSwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtRnJvbUxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoImJhciIsIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdEluZGV4KCkgewotCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWxpc3QuYWRkKCJmb28iKTsKLQkJCWxpc3QuYWRkKCJiYXIiKTsKLQkJCWxpc3QuYWRkKCJiYXoiKTsKLQkJCXRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdCgxLCAxLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleE5vQ2hhbmdlKCkgewotCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWxpc3QuYWRkKCJmb28iKTsKLQkJCWxpc3QuYWRkKCJiYXIiKTsKLQkJCWxpc3QuYWRkKCJiYXoiKTsKLQkJCXRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdCgyLCAwLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoImJhciIpLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3ROb0NoYW5nZSgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCksIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluSXRlbXNJbkxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5yZXRhaW5JdGVtc0luTGlzdChuZXcgU3RyaW5nW10geyJiYXIiLCAiYmF6In0sIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUl0ZW1Jbkxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5yZXBsYWNlSXRlbUluTGlzdCgiYmFyIiwgInh4eCIsIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0U2V0SXRlbXNJbkxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5zZXRJdGVtc0luTGlzdCgxLCBuZXcgU3RyaW5nW10geyJ4eHgifSwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSXRlbXNJbkxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJbGlzdC5hZGQoInh4eCIpOwotCQkJbGlzdC5hZGQoInl5eSIpOwotCQkJbGlzdC5hZGQoInp6eiIpOwotCQkJdGhpcy5tb3ZlSXRlbXNJbkxpc3QoMiwgNCwgMiwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RDbGVhckxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5jbGVhckxpc3QobGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbml6ZUxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gb2xkTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJb2xkTGlzdC5hZGQoImZvbyIpOwotCQkJb2xkTGlzdC5hZGQoImJhciIpOwotCQkJb2xkTGlzdC5hZGQoImJheiIpOwotCQkJb2xkTGlzdC5hZGQoInh4eCIpOwotCQkJb2xkTGlzdC5hZGQoInl5eSIpOwotCQkJb2xkTGlzdC5hZGQoInp6eiIpOwotCQkJTGlzdDxTdHJpbmc+IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCW5ld0xpc3QuYWRkKCJmb28iKTsKLQkJCW5ld0xpc3QuYWRkKCJwcHAiKTsKLQkJCW5ld0xpc3QuYWRkKCJiYXoiKTsKLQkJCW5ld0xpc3QuYWRkKCJ4eHgiKTsKLQkJCW5ld0xpc3QuYWRkKCJxcXEiKTsKLQkJCXRoaXMuc3luY2hyb25pemVMaXN0KG5ld0xpc3QsIG9sZExpc3QsIExJU1RfTkFNRSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3TGlzdCwgb2xkTGlzdCk7Ci0JCX0KLQotCQkvLyAqKioqKiB0cmVlCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlTm9kZUFkZGVkVHJlZUV2ZW50KCkgewotCQkJdGhpcy5maXJlTm9kZUFkZGVkKG5ldyBUcmVlQWRkRXZlbnQodGhpcywgVFJFRV9OQU1FLCBPQkpFQ1RfUEFUSCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlQWRkZWRUcmVlKCkgewotCQkJdGhpcy5maXJlTm9kZUFkZGVkKFRSRUVfTkFNRSwgT0JKRUNUX1BBVEgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlUmVtb3ZlZFRyZWVFdmVudCgpIHsKLQkJCXRoaXMuZmlyZU5vZGVSZW1vdmVkKG5ldyBUcmVlUmVtb3ZlRXZlbnQodGhpcywgVFJFRV9OQU1FLCBPQkpFQ1RfUEFUSCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlUmVtb3ZlZFRyZWUoKSB7Ci0JCQl0aGlzLmZpcmVOb2RlUmVtb3ZlZChUUkVFX05BTUUsIE9CSkVDVF9QQVRIKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlVHJlZUNsZWFyZWRFdmVudCgpIHsKLQkJCXRoaXMuZmlyZVRyZWVDbGVhcmVkKG5ldyBUcmVlQ2xlYXJFdmVudCh0aGlzLCBUUkVFX05BTUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlVHJlZUNsZWFyZWQoKSB7Ci0JCQl0aGlzLmZpcmVUcmVlQ2xlYXJlZChUUkVFX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVUcmVlQ2hhbmdlZEV2ZW50KCkgewotCQkJdGhpcy5maXJlVHJlZUNoYW5nZWQobmV3IFRyZWVDaGFuZ2VFdmVudCh0aGlzLCBUUkVFX05BTUUsIE9CSkVDVF9QQVRIKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVRyZWVDaGFuZ2VkKCkgewotCQkJdGhpcy5maXJlVHJlZUNoYW5nZWQoVFJFRV9OQU1FLCBPQkpFQ1RfUEFUSCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0QXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIpIHsKLQkJCXJldHVybiB0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh2YWx1ZTEsIHZhbHVlMik7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0QXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIpIHsKLQkJCXJldHVybiB0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh2YWx1ZTEsIHZhbHVlMik7Ci0JCX0KLQotCQkvLyAqKioqKiBtaXNjCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgVGVzdE1vZGVsIGNsb25lKCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKFRlc3RNb2RlbCkgc3VwZXIuY2xvbmUoKTsKLQkJCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RWYWx1ZXNBcmVEaWZmZXJlbnQoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQkJcmV0dXJuIHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHZhbHVlMSwgdmFsdWUyKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RWYWx1ZXNBcmVFcXVhbChPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZXNBcmVFcXVhbCh2YWx1ZTEsIHZhbHVlMik7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0RWxlbWVudHNBcmVEaWZmZXJlbnQoSXRlcmFibGU8Pz4gaXRlcmFibGUxLCBJdGVyYWJsZTw/PiBpdGVyYWJsZTIpIHsKLQkJCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5lbGVtZW50c0FyZURpZmZlcmVudChpdGVyYWJsZTEsIGl0ZXJhYmxlMik7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0RWxlbWVudHNBcmVFcXVhbChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmVsZW1lbnRzQXJlRXF1YWwoaXRlcmFibGUxLCBpdGVyYWJsZTIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZChURVNUX1RPX1NUUklORyk7Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZXJpYWxpemF0aW9uIHRlc3QgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoVG9vbHMuanZtSXNTdW4oKSkgewotCQkJLy8gVGhpcyB0ZXN0IGRvZXNuJ3QgcGFzcyBpbiB0aGUgRWNsaXBzZSBidWlsZCBlbnZpcm9ubWVudCAoTGludXgvSUJNIEpWTSkgZm9yIHNvbWUgcmVhc29uCi0JCQl0aGlzLnZlcmlmeVNlcmlhbGl6YXRpb24oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTZXJpYWxpemF0aW9uKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlMb2NhbE1vZGVsIG1vZGVsMSA9IG5ldyBMb2NhbE1vZGVsKCk7Ci0JCUZvbyBmb28xID0gbmV3IEZvbygpOwotCQlCYXIgYmFyMSA9IG5ldyBCYXIoKTsKLQkJSm9vIGpvbzEgPSBuZXcgSm9vKCk7Ci0JCUphciBqYXIxID0gbmV3IEphcigpOwotCQltb2RlbDEuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihmb28xKTsKLQkJbW9kZWwxLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoYmFyMSk7Ci0JCW1vZGVsMS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoImZvbyIsIGpvbzEpOwotCQltb2RlbDEuYWRkTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCBqYXIxKTsKLQotCQlJdGVyYWJsZTxFdmVudExpc3RlbmVyPiBsaXN0ZW5lcnMxID0gdGhpcy5nZXRMaXN0ZW5lcnMobW9kZWwxLCBTdGF0ZUNoYW5nZUxpc3RlbmVyLmNsYXNzLCBudWxsKTsKLQkJT2JqZWN0W10gbGlzdGVuZXJzQXJyYXkxID0gQXJyYXlUb29scy5hcnJheShsaXN0ZW5lcnMxKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGxpc3RlbmVyc0FycmF5MS5sZW5ndGgpOwotCQkvLyB0aGUgb3JkZXIgb2YgdGhlc2UgY291bGQgY2hhbmdlLi4uCi0JCWFzc2VydEVxdWFscyhGb28uY2xhc3MsIGxpc3RlbmVyc0FycmF5MVswXS5nZXRDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJhci5jbGFzcywgbGlzdGVuZXJzQXJyYXkxWzFdLmdldENsYXNzKCkpOwotCi0JCWxpc3RlbmVyczEgPSB0aGlzLmdldExpc3RlbmVycyhtb2RlbDEsIExpc3RDaGFuZ2VMaXN0ZW5lci5jbGFzcywgImZvbyIpOwotCQlsaXN0ZW5lcnNBcnJheTEgPSBBcnJheVRvb2xzLmFycmF5KGxpc3RlbmVyczEpOwotCQlhc3NlcnRFcXVhbHMoMiwgbGlzdGVuZXJzQXJyYXkxLmxlbmd0aCk7Ci0JCS8vIHRoZSBvcmRlciBvZiB0aGVzZSBjb3VsZCBjaGFuZ2UuLi4KLQkJYXNzZXJ0RXF1YWxzKEpvby5jbGFzcywgbGlzdGVuZXJzQXJyYXkxWzBdLmdldENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoSmFyLmNsYXNzLCBsaXN0ZW5lcnNBcnJheTFbMV0uZ2V0Q2xhc3MoKSk7Ci0KLQkJTG9jYWxNb2RlbCBtb2RlbDIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKG1vZGVsMSk7Ci0KLQkJSXRlcmFibGU8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJzMiA9IHRoaXMuZ2V0TGlzdGVuZXJzKG1vZGVsMiwgU3RhdGVDaGFuZ2VMaXN0ZW5lci5jbGFzcywgbnVsbCk7Ci0JCU9iamVjdFtdIGxpc3RlbmVyc0FycmF5MiA9IEFycmF5VG9vbHMuYXJyYXkobGlzdGVuZXJzMik7Ci0JCWFzc2VydEVxdWFscygxLCBsaXN0ZW5lcnNBcnJheTIubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKEZvby5jbGFzcywgbGlzdGVuZXJzQXJyYXkyWzBdLmdldENsYXNzKCkpOwotCi0JCWxpc3RlbmVyczIgPSB0aGlzLmdldExpc3RlbmVycyhtb2RlbDIsIExpc3RDaGFuZ2VMaXN0ZW5lci5jbGFzcywgImZvbyIpOwotCQlsaXN0ZW5lcnNBcnJheTIgPSBBcnJheVRvb2xzLmFycmF5KGxpc3RlbmVyczIpOwotCQlhc3NlcnRFcXVhbHMoMSwgbGlzdGVuZXJzQXJyYXkyLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscyhKb28uY2xhc3MsIGxpc3RlbmVyc0FycmF5MlswXS5nZXRDbGFzcygpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEV2ZW50TGlzdGVuZXI+IGdldExpc3RlbmVycyhMb2NhbE1vZGVsIG1vZGVsLCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdGVuZXJMaXN0KG1vZGVsLCBsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lKS5nZXRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3RlbmVyTGlzdDxFdmVudExpc3RlbmVyPiBnZXRMaXN0ZW5lckxpc3QoTG9jYWxNb2RlbCBtb2RlbCwgQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCUNoYW5nZVN1cHBvcnQgY2hhbmdlU3VwcG9ydCA9IChDaGFuZ2VTdXBwb3J0KSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShtb2RlbCwgImNoYW5nZVN1cHBvcnQiKTsKLQkJcmV0dXJuIChMaXN0ZW5lckxpc3Q8RXZlbnRMaXN0ZW5lcj4pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKGNoYW5nZVN1cHBvcnQsICJnZXRMaXN0ZW5lckxpc3RfIiwgbmV3IENsYXNzPD8+W10ge0NsYXNzLmNsYXNzLCBTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W10ge2xpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWV9KTsKLQl9Ci0KLQkvLyB3ZSBoYXZlIHRvIG1hbnVhbGx5IGhhbmRsZSAnY2hhbmdlU3VwcG9ydCcgc2luY2UgQWJzdHJhY3RNb2RlbCBpcyBub3QgU2VyaWFsaXphYmxlCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9jYWxNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCQlMb2NhbE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQkJCXMud3JpdGVPYmplY3QodGhpcy5jaGFuZ2VTdXBwb3J0KTsKLQkgICAgfQotCQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBzKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkJcy5kZWZhdWx0UmVhZE9iamVjdCgpOwotCQkJdGhpcy5jaGFuZ2VTdXBwb3J0ID0gKENoYW5nZVN1cHBvcnQpIHMucmVhZE9iamVjdCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRm9vIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBTdGF0ZUNoYW5nZUxpc3RlbmVyIHsKLQkJRm9vKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQmFyIGltcGxlbWVudHMgU3RhdGVDaGFuZ2VMaXN0ZW5lciB7Ci0JCUJhcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEpvbyBleHRlbmRzIExpc3RDaGFuZ2VBZGFwdGVyIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQkJSm9vKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEphciBleHRlbmRzIExpc3RDaGFuZ2VBZGFwdGVyIHsKLQkJSmFyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBidWcoPykgdGVzdCAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNFX01FU1NBR0UgPSAidGhpcyBvYmplY3QgaXMgbm8gbG9uZ2VyIGxpc3RlbmluZyB0byBsb2NhbEEiOwotCi0JLyoqCi0JICogVGVzdCB0aGUgZm9sbG93aW5nIHNpdHVhdGlvbjoKLQkgKiAJLSBib3RoIEIgYW5kIEMgYXJlIGxpc3RlbmluZyB0byBBCi0JICogCS0gQyBpcyBhbHNvIGxpc3RlbmluZyB0byBCCi0JICogCS0gd2hlbiBCIHJlY2VpdmVzIGFuIGV2ZW50IGZyb20gQSwgaXQgd2lsbCBmaXJlIGFuIGV2ZW50IHRvIEMKLQkgKiAJLSB3aGVuIEMgcmVjZWl2ZXMgYW4gZXZlbnQgZnJvbSBCLCBpdCB3aWxsIFNUT1AgbGlzdGVuaW5nIHRvIEEKLQkgKiAJLSB0aGUgZXZlbnQgZnJvbSBCIHRvIEMgbWF5IGJlIHByZWNlZGVkIG9yIGZvbGxvd2VkIChkZXBlbmRpbmcgb24KLQkgKiAJCXRoZSBoYXNoIHBvc2l0aW9ucyBvZiBsaXN0ZW5lcnMpIGJ5IGFuIGV2ZW50IGZyb20gQSB0byBDOgotCSAqIAkJLSBpZiB0aGUgQSB0byBDIGV2ZW50IGNvbWVzIGZpcnN0LCBubyBwcm9ibGVtCi0JICogCQktIGJ1dCBpZiB0aGUgQSB0byBCIGV2ZW50IGNvbWVzIGZpcnN0LCB0aGUgQSB0byBDIGV2ZW50IHNob3VsZCBOT1QgaGFwcGVuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEluZGlyZWN0UmVtb3ZlU3RhdGVMaXN0ZW5lcigpIHsKLQkJdGhpcy52ZXJpZnlJbmRpcmVjdFJlbW92ZUxpc3RlbmVyKAotCQkJbmV3IE5vdGlmeUNvbW1hbmQoKSB7Ci0JCQkJcHVibGljIHZvaWQgbm90aWZ5TGlzdGVuZXJzKExvY2FsQSBsb2NhbEEpIHsKLQkJCQkJbG9jYWxBLm5vdGlmeVN0YXRlTGlzdGVuZXJzKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdFJlbW92ZVByb3BlcnR5TGlzdGVuZXIoKSB7Ci0JCXRoaXMudmVyaWZ5SW5kaXJlY3RSZW1vdmVMaXN0ZW5lcigKLQkJCW5ldyBOb3RpZnlDb21tYW5kKCkgewotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycyhMb2NhbEEgbG9jYWxBKSB7Ci0JCQkJCWxvY2FsQS5ub3RpZnlQcm9wZXJ0eUxpc3RlbmVycygpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kaXJlY3RSZW1vdmVDb2xsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXRoaXMudmVyaWZ5SW5kaXJlY3RSZW1vdmVMaXN0ZW5lcigKLQkJCW5ldyBOb3RpZnlDb21tYW5kKCkgewotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycyhMb2NhbEEgbG9jYWxBKSB7Ci0JCQkJCWxvY2FsQS5ub3RpZnlDb2xsZWN0aW9uTGlzdGVuZXJzKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdFJlbW92ZUxpc3RMaXN0ZW5lcigpIHsKLQkJdGhpcy52ZXJpZnlJbmRpcmVjdFJlbW92ZUxpc3RlbmVyKAotCQkJbmV3IE5vdGlmeUNvbW1hbmQoKSB7Ci0JCQkJcHVibGljIHZvaWQgbm90aWZ5TGlzdGVuZXJzKExvY2FsQSBsb2NhbEEpIHsKLQkJCQkJbG9jYWxBLm5vdGlmeUxpc3RMaXN0ZW5lcnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGlyZWN0UmVtb3ZlVHJlZUxpc3RlbmVyKCkgewotCQl0aGlzLnZlcmlmeUluZGlyZWN0UmVtb3ZlTGlzdGVuZXIoCi0JCQluZXcgTm90aWZ5Q29tbWFuZCgpIHsKLQkJCQlwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoTG9jYWxBIGxvY2FsQSkgewotCQkJCQlsb2NhbEEubm90aWZ5VHJlZUxpc3RlbmVycygpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2ZXJpZnlJbmRpcmVjdFJlbW92ZUxpc3RlbmVyKE5vdGlmeUNvbW1hbmQgY29tbWFuZCkgewotCQlMb2NhbEEgbG9jYWxBID0gbmV3IExvY2FsQSgpOwotCQlMb2NhbEIgbG9jYWxCID0gbmV3IExvY2FsQihsb2NhbEEpOwotCi0JCS8vIGJ1aWxkIGEgYnVuY2ggb2YgTG9jYWxDcyBzbyBhdCBsZWFzdCBvbmUgb2YgdGhlbSBpcyBub3RpZmllZCBBRlRFUiB0aGUgTG9jYWxCOwotCQkvLyB1c2luZyAxMDAwIHNlZW1lZCB0byBmYWlsIHZlcnkgY29uc2lzdGVudGx5IGJlZm9yZSBDaGFuZ2VTdXBwb3J0IHdhcyBmaXhlZAotCQlMb2NhbENbXSBsb2NhbENzID0gbmV3IExvY2FsQ1sxMDAwXTsKLQkJZm9yIChpbnQgaSA9IGxvY2FsQ3MubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWxvY2FsQ3NbaV0gPSBuZXcgTG9jYWxDKGxvY2FsQSwgbG9jYWxCKTsKLQkJfQotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWNvbW1hbmQubm90aWZ5TGlzdGVuZXJzKGxvY2FsQSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKSA9PSBJU0VfTUVTU0FHRSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgZXg7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RmFsc2UoZXhDYXVnaHQpOwotCi0JCWZvciAoaW50IGkgPSBsb2NhbENzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlhc3NlcnRGYWxzZShsb2NhbENzW2ldLmlzTGlzdGVuaW5nVG9Mb2NhbEEoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludGVyZmFjZSBOb3RpZnlDb21tYW5kIHsKLQkJdm9pZCBub3RpZnlMaXN0ZW5lcnMoTG9jYWxBIGxvY2FsQSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBvYmplY3Qgc2ltcGx5IGZpcmVzIGEgc3RhdGUgY2hhbmdlIGV2ZW50LiBCb3RoIExvY2FsQiBhbmQgTG9jYWxDCi0JICogd2lsbCBiZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9jYWxBIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCUxvY2FsQSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJdm9pZCBub3RpZnlTdGF0ZUxpc3RlbmVycygpIHsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JCXZvaWQgbm90aWZ5UHJvcGVydHlMaXN0ZW5lcnMoKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoImZvbyIsIDEsIDIpOwotCQl9Ci0JCXZvaWQgbm90aWZ5Q29sbGVjdGlvbkxpc3RlbmVycygpIHsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCJmb28iLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKLQkJfQotCQl2b2lkIG5vdGlmeUxpc3RMaXN0ZW5lcnMoKSB7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZCgiZm9vIiwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOwotCQl9Ci0JCXZvaWQgbm90aWZ5VHJlZUxpc3RlbmVycygpIHsKLQkJCXRoaXMuZmlyZVRyZWVDaGFuZ2VkKCJmb28iLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgb2JqZWN0IHdpbGwgZmlyZSBzdGF0ZSBjaGFuZ2UgZXZlbnRzIHdoZW5ldmVyIGl0IHJlY2VpdmVzCi0JICogYSBzdGF0ZSBjaGFuZ2UgZXZlbnQgZnJvbSBsb2NhbEEuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9jYWxCCi0JCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCQlpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyCi0JewotCQlMb2NhbEIoTG9jYWxBIGxvY2FsQSkgewotCQkJc3VwZXIoKTsKLQkJCWxvY2FsQS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoImJhciIsIDEsIDIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCJiYXIiLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0KLQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKCJiYXIiLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7LyppZ25vcmUqL30KLQotCQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5maXJlVHJlZUNoYW5nZWQoImJhciIsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG9iamVjdCB3aWxsIGxpc3RlbiB0byB0d28gb3RoZXIgb2JqZWN0cywgbG9jYWxBIGFuZCBsb2NhbEIuCi0JICogSWYgdGhpcyBvYmplY3QgcmVjZWl2ZXMgbm90aWZpY2F0aW9uIGZyb20gbG9jYWxCLCBpdCB3aWxsIHN0b3AgbGlzdGVuaW5nIHRvCi0JICogbG9jYWxBLiBJZiB0aGlzIG9iamVjdCByZWNlaXZlcyBub3RpZmljYXRpb24gZnJvbSBsb2NhbEEsIGl0IHdpbGwgY2hlY2sgdG8KLQkgKiBzZWUgd2hldGhlciBpdCBzdGlsbCBsaXN0ZW5pbmcgdG8gbG9jYWxBLiBJZiB0aGlzIG9iamVjdCBpcyBubyBsb25nZXIKLQkgKiBsaXN0ZW5pbmcgdG8gbG9jYWxBLCBpdCB3aWxsIGNvbXBsYWluIGFib3V0IHJlY2VpdmluZyB0aGUgZXZlbnQgYW5kCi0JICogdGhyb3cgYW4gZXhjZXB0aW9uLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIExvY2FsQwotCQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQkJaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lcgotCXsKLQkJcHJpdmF0ZSBMb2NhbEEgbG9jYWxBOwotCQlwcml2YXRlIExvY2FsQiBsb2NhbEI7Ci0JCXByaXZhdGUgYm9vbGVhbiBsaXN0ZW5pbmdUb0xvY2FsQTsKLQotCQlMb2NhbEMoTG9jYWxBIGxvY2FsQSwgTG9jYWxCIGxvY2FsQikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubG9jYWxBID0gbG9jYWxBOwotCQkJdGhpcy5sb2NhbEIgPSBsb2NhbEI7Ci0KLQkJCWxvY2FsQS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCXRoaXMubGlzdGVuaW5nVG9Mb2NhbEEgPSB0cnVlOwotCi0JCQlsb2NhbEIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJYm9vbGVhbiBpc0xpc3RlbmluZ1RvTG9jYWxBKCkgewotCQkJcmV0dXJuIHRoaXMubGlzdGVuaW5nVG9Mb2NhbEE7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQlPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsKLQkJCWlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEEpIHsKLQkJCQlpZiAoICEgdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKElTRV9NRVNTQUdFKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHNvdXJjZSA9PSB0aGlzLmxvY2FsQikgewotCQkJCXRoaXMubG9jYWxBLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJCXRoaXMubGlzdGVuaW5nVG9Mb2NhbEEgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYm9ndXMgZXZlbnQgc291cmNlOiAiICsgc291cmNlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCU9iamVjdCBzb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKHNvdXJjZSA9PSB0aGlzLmxvY2FsQSkgewotCQkJCWlmICggISB0aGlzLmxpc3RlbmluZ1RvTG9jYWxBKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSVNFX01FU1NBR0UpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoc291cmNlID09IHRoaXMubG9jYWxCKSB7Ci0JCQkJdGhpcy5sb2NhbEEucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQkJdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJib2d1cyBldmVudCBzb3VyY2U6ICIgKyBzb3VyY2UpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCU9iamVjdCBzb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKHNvdXJjZSA9PSB0aGlzLmxvY2FsQSkgewotCQkJCWlmICggISB0aGlzLmxpc3RlbmluZ1RvTG9jYWxBKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSVNFX01FU1NBR0UpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoc291cmNlID09IHRoaXMubG9jYWxCKSB7Ci0JCQkJdGhpcy5sb2NhbEEucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQkJdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJib2d1cyBldmVudCBzb3VyY2U6ICIgKyBzb3VyY2UpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7LyppZ25vcmUqL30KLQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlID09IHRoaXMubG9jYWxBKSB7Ci0JCQkJaWYgKCAhIHRoaXMubGlzdGVuaW5nVG9Mb2NhbEEpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJU0VfTUVTU0FHRSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEIpIHsKLQkJCQl0aGlzLmxvY2FsQS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCQl0aGlzLmxpc3RlbmluZ1RvTG9jYWxBID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImJvZ3VzIGV2ZW50IHNvdXJjZTogIiArIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7LyppZ25vcmUqL30KLQotCQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlID09IHRoaXMubG9jYWxBKSB7Ci0JCQkJaWYgKCAhIHRoaXMubGlzdGVuaW5nVG9Mb2NhbEEpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJU0VfTUVTU0FHRSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEIpIHsKLQkJCQl0aGlzLmxvY2FsQS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCQl0aGlzLmxpc3RlbmluZ1RvTG9jYWxBID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImJvZ3VzIGV2ZW50IHNvdXJjZTogIiArIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBlKSB7LyppZ25vcmUqL30KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL0pwdFV0aWxpdHlNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvSnB0VXRpbGl0eU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmNjRlZi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvSnB0VXRpbGl0eU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuSnB0VXRpbGl0eU1vZGVsTGlzdGVuZXJUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuSnB0VXRpbGl0eU1vZGVsVmFsdWVUZXN0czsKLQotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlNb2RlbFRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5TW9kZWxUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlNb2RlbExpc3RlbmVyVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0VXRpbGl0eU1vZGVsVmFsdWVUZXN0cy5zdWl0ZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2hhbmdlU3VwcG9ydFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE5ld0V2ZW50VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydFRlc3RzLmNsYXNzKTsKLQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVdGlsaXR5TW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvTmV3RXZlbnRUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL05ld0V2ZW50VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNlNGFjMC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvTmV3RXZlbnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi0vKioKLSAqIHRlc3Qgd2hhdCBpdCB0YWtlcyB0byBhZGQgYSBuZXcgdHlwZSBvZiBldmVudCB0bwotICogbW9kZWwgYW5kIGNoYW5nZSBzdXBwb3J0Ci0gKi8KLXB1YmxpYyBjbGFzcyBOZXdFdmVudFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgRm9vIGZvbzsKLQotCXB1YmxpYyBOZXdFdmVudFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmZvbyA9IG5ldyBGb28oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05vRm9vQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc05vRm9vQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlMb2NhbExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJdGhpcy5mb28uYWRkRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNOb0Zvb0NoYW5nZUxpc3RlbmVycygpKTsKLQkJdGhpcy5mb28ucmVtb3ZlRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc05vRm9vQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbnlGb29DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUZvb0NoYW5nZUxpc3RlbmVycygpKTsKLQkJTG9jYWxMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCXRoaXMuZm9vLmFkZEZvb0NoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmZvby5oYXNBbnlGb29DaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMuZm9vLnJlbW92ZUZvb0NoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55Rm9vQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlRm9vQ2hhbmdlRXZlbnQoKSB7Ci0JCUxvY2FsTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlhc3NlcnRGYWxzZShsaXN0ZW5lci5yZWNlaXZlZEZvb0V2ZW50KTsKLQkJdGhpcy5mb28uYWRkRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmZvby5mb28oKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0ZW5lci5yZWNlaXZlZEZvb0V2ZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaGFybmVzcyBjbGFzc2VzICoqKioqKioqKioKLQotCWNsYXNzIEZvbyBleHRlbmRzIEFic3RyYWN0Rm9vTW9kZWwgewotCQlGb28oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXZvaWQgZm9vKCkgewotCQkJdGhpcy5maXJlRm9vQ2hhbmdlRXZlbnQoKTsKLQkJfQotCX0KLQotCWNsYXNzIExvY2FsTGlzdGVuZXIgaW1wbGVtZW50cyBGb29DaGFuZ2VMaXN0ZW5lciB7Ci0JCWJvb2xlYW4gcmVjZWl2ZWRGb29FdmVudCA9IGZhbHNlOwotCQlMb2NhbExpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBmb29DaGFuZ2VkKEZvb0NoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQl0aGlzLnJlY2VpdmVkRm9vRXZlbnQgPSB0cnVlOwotCQl9Ci0JfQotCi0JaW50ZXJmYWNlIEZvb01vZGVsIGV4dGVuZHMgTW9kZWwgewotCQl2b2lkIGFkZEZvb0NoYW5nZUxpc3RlbmVyKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQkJdm9pZCByZW1vdmVGb29DaGFuZ2VMaXN0ZW5lcihGb29DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JfQotCi0JaW50ZXJmYWNlIEZvb0NoYW5nZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0JCXZvaWQgZm9vQ2hhbmdlZChGb29DaGFuZ2VFdmVudCBldmVudCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIEZvb0NoYW5nZUV2ZW50IGV4dGVuZHMgQ2hhbmdlRXZlbnQgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHVibGljIEZvb0NoYW5nZUV2ZW50KEZvb01vZGVsIHNvdXJjZSkgewotCQkJc3VwZXIoc291cmNlKTsKLQkJfQotCQlwdWJsaWMgRm9vQ2hhbmdlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCQlyZXR1cm4gbmV3IEZvb0NoYW5nZUV2ZW50KChGb29Nb2RlbCkgbmV3U291cmNlKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBBYnN0cmFjdEZvb01vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIEZvb01vZGVsIHsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgRm9vQ2hhbmdlU3VwcG9ydCBnZXRDaGFuZ2VTdXBwb3J0KCkgewotCQkJcmV0dXJuIChGb29DaGFuZ2VTdXBwb3J0KSBzdXBlci5nZXRDaGFuZ2VTdXBwb3J0KCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJCXJldHVybiBuZXcgRm9vQ2hhbmdlU3VwcG9ydCh0aGlzKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRGb29DaGFuZ2VMaXN0ZW5lcihGb29DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZUZvb0NoYW5nZUxpc3RlbmVyKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVGb29DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQkJcHJvdGVjdGVkIHZvaWQgZmlyZUZvb0NoYW5nZUV2ZW50KCkgewotCQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUZvb0NoYW5nZWQoKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlGb29DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuaGFzQW55Rm9vQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaGFzTm9Gb29DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCQlyZXR1cm4gISB0aGlzLmhhc0FueUZvb0NoYW5nZUxpc3RlbmVycygpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIEZvb0NoYW5nZVN1cHBvcnQgZXh0ZW5kcyBDaGFuZ2VTdXBwb3J0IHsKLQkJRm9vQ2hhbmdlU3VwcG9ydChGb29Nb2RlbCBzb3VyY2UpIHsKLQkJCXN1cGVyKHNvdXJjZSk7Ci0JCX0KLQkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxGb29DaGFuZ2VMaXN0ZW5lcj4gRk9PX0NIQU5HRV9MSVNURU5FUl9DTEFTUyA9IEZvb0NoYW5nZUxpc3RlbmVyLmNsYXNzOwotCQl2b2lkIGFkZEZvb0NoYW5nZUxpc3RlbmVyKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLmFkZExpc3RlbmVyKEZPT19DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3RlbmVyKTsKLQkJfQotCQl2b2lkIHJlbW92ZUZvb0NoYW5nZUxpc3RlbmVyKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLnJlbW92ZUxpc3RlbmVyKEZPT19DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3RlbmVyKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlGb29DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0ZW5lcnMoRk9PX0NIQU5HRV9MSVNURU5FUl9DTEFTUyk7Ci0JCX0KLQkJcHJpdmF0ZSBMaXN0ZW5lckxpc3Q8Rm9vQ2hhbmdlTGlzdGVuZXI+IGdldEZvb0NoYW5nZUxpc3RlbmVyTGlzdCgpIHsKLQkJCXJldHVybiB0aGlzLmdldExpc3RlbmVyTGlzdChGT09fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTKTsKLQkJfQotCQlwcml2YXRlIEl0ZXJhYmxlPEZvb0NoYW5nZUxpc3RlbmVyPiBnZXRGb29DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCQlMaXN0ZW5lckxpc3Q8Rm9vQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0Rm9vQ2hhbmdlTGlzdGVuZXJMaXN0KCk7Ci0JCQlyZXR1cm4gKGxpc3RlbmVyTGlzdCA9PSBudWxsKSA/IG51bGwgOiBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JCX0KLQkJcHJpdmF0ZSBib29sZWFuIGhhc0Zvb0NoYW5nZUxpc3RlbmVyKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0Rm9vQ2hhbmdlTGlzdGVuZXJzKCksIGxpc3RlbmVyKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBmaXJlRm9vQ2hhbmdlZCgpIHsKLQkJCUl0ZXJhYmxlPEZvb0NoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldEZvb0NoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJRm9vQ2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCQkJCWZvciAoRm9vQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQkJaWYgKHRoaXMuaGFzRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpKSB7Ci0JCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJCS8vIGhlcmUncyB0aGUgcmVhc29uIGZvciB0aGUgZHVwbGljYXRlIGNvZGUuLi4KLQkJCQkJCQlldmVudCA9IG5ldyBGb29DaGFuZ2VFdmVudCgoRm9vTW9kZWwpIHRoaXMuc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJCWxpc3RlbmVyLmZvb0NoYW5nZWQoZXZlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZGFlMDUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL1NpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLlNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnRUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJJbnZhbGlkQ2xhc3MoKSB7Ci0JCU1vZGVsIG1vZGVsID0gbmV3IFN0YXRlVGVzdE1vZGVsKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUFkYXB0ZXIoKTsKLQkJdHJ5IHsKLQkJCW1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIGxpc3RlbmVyKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lckludmFsaWRBc3BlY3QoKSB7Ci0JCU1vZGVsIG1vZGVsID0gbmV3IFByb3BlcnR5VGVzdE1vZGVsKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUFkYXB0ZXIoKTsKLQkJdHJ5IHsKLQkJCW1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImJhciIsIGxpc3RlbmVyKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVySW52YWxpZENsYXNzKCkgewotCQlNb2RlbCBtb2RlbCA9IG5ldyBTdGF0ZVRlc3RNb2RlbCgpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBDb2xsZWN0aW9uQ2hhbmdlQWRhcHRlcigpOwotCQl0cnkgewotCQkJbW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCJmb28iLCBsaXN0ZW5lcik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lckludmFsaWRBc3BlY3QoKSB7Ci0JCU1vZGVsIG1vZGVsID0gbmV3IENvbGxlY3Rpb25UZXN0TW9kZWwoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIoKTsKLQkJdHJ5IHsKLQkJCW1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiYmFyIiwgbGlzdGVuZXIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRMaXN0Q2hhbmdlTGlzdGVuZXJJbnZhbGlkQ2xhc3MoKSB7Ci0JCU1vZGVsIG1vZGVsID0gbmV3IFN0YXRlVGVzdE1vZGVsKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRyeSB7Ci0JCQltb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoImZvbyIsIGxpc3RlbmVyKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTGlzdENoYW5nZUxpc3RlbmVySW52YWxpZEFzcGVjdCgpIHsKLQkJTW9kZWwgbW9kZWwgPSBuZXcgTGlzdFRlc3RNb2RlbCgpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0Q2hhbmdlQWRhcHRlcigpOwotCQl0cnkgewotCQkJbW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKCJiYXIiLCBsaXN0ZW5lcik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFRyZWVDaGFuZ2VMaXN0ZW5lckludmFsaWRDbGFzcygpIHsKLQkJTW9kZWwgbW9kZWwgPSBuZXcgU3RhdGVUZXN0TW9kZWwoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVHJlZUNoYW5nZUFkYXB0ZXIoKTsKLQkJdHJ5IHsKLQkJCW1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbGlzdGVuZXIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRUcmVlQ2hhbmdlTGlzdGVuZXJJbnZhbGlkQXNwZWN0KCkgewotCQlNb2RlbCBtb2RlbCA9IG5ldyBUcmVlVGVzdE1vZGVsKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRyZWVDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRyeSB7Ci0JCQltb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoImJhciIsIGxpc3RlbmVyKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGVzdCBtb2RlbHMgKioqKioqKioqKgotCi0Jc3RhdGljIGNsYXNzIFN0YXRlVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCVN0YXRlVGVzdE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIFN0YXRlQ2hhbmdlTGlzdGVuZXIuY2xhc3MsIG51bGwpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByb3BlcnR5VGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCVByb3BlcnR5VGVzdE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3MsICJmb28iKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBDb2xsZWN0aW9uVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCUNvbGxlY3Rpb25UZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzLCAiZm9vIik7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgTGlzdFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlMaXN0VGVzdE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIExpc3RDaGFuZ2VMaXN0ZW5lci5jbGFzcywgImZvbyIpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFRyZWVUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJVHJlZVRlc3RNb2RlbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBUcmVlQ2hhbmdlTGlzdGVuZXIuY2xhc3MsICJmb28iKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL0pwdFV0aWxpdHlNb2RlbExpc3RlbmVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9KcHRVdGlsaXR5TW9kZWxMaXN0ZW5lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZTNmNzUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL0pwdFV0aWxpdHlNb2RlbExpc3RlbmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlNb2RlbExpc3RlbmVyVGVzdHMgewotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5TW9kZWxMaXN0ZW5lclRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWZsZWN0aXZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVmbGVjdGl2ZUxpc3RDaGFuZ2VMaXN0ZW5lclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlZmxlY3RpdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVmbGVjdGl2ZVN0YXRlQ2hhbmdlTGlzdGVuZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWZsZWN0aXZlVHJlZUNoYW5nZUxpc3RlbmVyVGVzdHMuY2xhc3MpOwotCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXByaXZhdGUgSnB0VXRpbGl0eU1vZGVsTGlzdGVuZXJUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmFlNWMzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWZsZWN0aXZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFJlZmxlY3RpdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJpdGVtQWRkZWRaZXJvQXJndW1lbnQiLCAiaXRlbVJlbW92ZWRaZXJvQXJndW1lbnQiLCAiY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnQiLCAiY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnQiKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIoT2JqZWN0IHRhcmdldCkgewotCQlyZXR1cm4gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRhcmdldCwgIml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50IiwgIml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnQiLCAiY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudCIsICJjb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1BZGRlZFplcm9Bcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbUFkZGVkU2luZ2xlQXJndW1lbnROYW1lZENvbGxlY3Rpb24oKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlbW92ZWRaZXJvQXJndW1lbnROYW1lZENvbGxlY3Rpb24oKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVtb3ZlU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlbW92ZVN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50TmFtZWRDb2xsZWN0aW9uKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmNsZWFyU3RyaW5ncygpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnROYW1lZENvbGxlY3Rpb24oKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5jbGVhclN0cmluZ3MoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlU3RyaW5ncyhuZXcgU3RyaW5nW10geyJiYXIiLCAiYmF6In0pOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnROYW1lZENvbGxlY3Rpb24oKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlU3RyaW5ncyhuZXcgU3RyaW5nW10geyJiYXIiLCAiYmF6In0pOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvZ3VzRG91YmxlQXJndW1lbnQxKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRhcmdldCwgImNvbGxlY3Rpb25DaGFuZ2VkRG91YmxlQXJndW1lbnQiKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKS5nZXRDbGFzcygpID09IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbi5jbGFzcykgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9ndXNEb3VibGVBcmd1bWVudDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCU1ldGhvZCBtZXRob2QgPSBSZWZsZWN0aW9uVG9vbHMuZ2V0TWV0aG9kKHRhcmdldCwgImNvbGxlY3Rpb25DaGFuZ2VkRG91YmxlQXJndW1lbnQiLCBuZXcgQ2xhc3NbXSB7Q29sbGVjdGlvbkNoYW5nZUV2ZW50LmNsYXNzLCBPYmplY3QuY2xhc3N9KTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0TWVzc2FnZSgpLmVxdWFscyhtZXRob2QudG9TdHJpbmcoKSkpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RlbmVyTWlzbWF0Y2goKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQkvLyBidWlsZCBhIENPTExFQ1RJT04gY2hhbmdlIGxpc3RlbmVyIGFuZCBoYWNrIGl0IHNvIHdlCi0JCS8vIGNhbiBhZGQgaXQgYXMgYSBMSVNUIGNoYW5nZSBsaXN0ZW5lcgotCQlPYmplY3QgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAiY29sbGVjdGlvbkV2ZW50U2luZ2xlQXJndW1lbnQiKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcigiYm9ndXMgbGlzdCIsIChMaXN0Q2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVyKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXN0TW9kZWwuY2hhbmdlTGlzdCgpOwotCQkJZmFpbCgibGlzdGVuZXIgbWlzbWF0Y2g6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR1NfQ09MTEVDVElPTiA9ICJzdHJpbmdzIjsKLQkJVGVzdE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmluZ3MoKSB7Ci0JCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8U3RyaW5nPih0aGlzLnN0cmluZ3MpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoU3RyaW5nIHMpIHsKLQkJCQkJVGVzdE1vZGVsLnRoaXMucmVtb3ZlU3RyaW5nKHMpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJdm9pZCBhZGRTdHJpbmcoU3RyaW5nIHN0cmluZykgewotCQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKHN0cmluZywgdGhpcy5zdHJpbmdzLCBTVFJJTkdTX0NPTExFQ1RJT04pOwotCQl9Ci0JCXZvaWQgcmVtb3ZlU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKHN0cmluZywgdGhpcy5zdHJpbmdzLCBTVFJJTkdTX0NPTExFQ1RJT04pOwotCQl9Ci0JCXZvaWQgY2xlYXJTdHJpbmdzKCkgewotCQkJdGhpcy5jbGVhckNvbGxlY3Rpb24odGhpcy5zdHJpbmdzLCBTVFJJTkdTX0NPTExFQ1RJT04pOwotCQl9Ci0JCXZvaWQgcmVwbGFjZVN0cmluZ3MoU3RyaW5nW10gbmV3U3RyaW5ncykgewotCQkJdGhpcy5zdHJpbmdzLmNsZWFyKCk7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMuc3RyaW5ncywgbmV3U3RyaW5ncyk7Ci0JCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChTVFJJTkdTX0NPTExFQ1RJT04sIHRoaXMuc3RyaW5ncyk7Ci0JCX0KLQkJdm9pZCBjaGFuZ2VMaXN0KCkgewotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoImJvZ3VzIGxpc3QiLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBUYXJnZXQgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQlTdHJpbmcgY29sbGVjdGlvbk5hbWU7Ci0JCVN0cmluZyBzdHJpbmc7Ci0JCWJvb2xlYW4gaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBjb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBjb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGNvbGxlY3Rpb25FdmVudFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlUYXJnZXQoVGVzdE1vZGVsIHRlc3RNb2RlbCwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy50ZXN0TW9kZWwgPSB0ZXN0TW9kZWw7Ci0JCQl0aGlzLmNvbGxlY3Rpb25OYW1lID0gY29sbGVjdGlvbk5hbWU7Ci0JCQl0aGlzLnN0cmluZyA9IHN0cmluZzsKLQkJfQotCQl2b2lkIGl0ZW1BZGRlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBpdGVtQWRkZWRTaW5nbGVBcmd1bWVudChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJdGhpcy5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5jb2xsZWN0aW9uTmFtZSwgZS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnN0cmluZywgZS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJfQotCQl2b2lkIGl0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJdGhpcy5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmNvbGxlY3Rpb25OYW1lLCBlLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3RyaW5nLCBlLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9Ci0JCXZvaWQgY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50KENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5jb2xsZWN0aW9uTmFtZSwgZS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJfQotCQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmNvbGxlY3Rpb25OYW1lLCBlLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQl9Ci0JCXZvaWQgY29sbGVjdGlvbkV2ZW50U2luZ2xlQXJndW1lbnQoQ29sbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkV2ZW50U2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuY29sbGVjdGlvbk5hbWUsIGUuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCX0KLQkJdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZERvdWJsZUFyZ3VtZW50KENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlLCBPYmplY3QgbykgewotCQkJZmFpbCgiYm9ndXMgZXZlbnQ6ICIgKyBlICsgIiBvYmplY3Q6ICIgKyBvKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVMaXN0Q2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVMaXN0Q2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGY2YzliLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlTGlzdENoYW5nZUxpc3RlbmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5SZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlZmxlY3RpdmVMaXN0Q2hhbmdlTGlzdGVuZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgUmVmbGVjdGl2ZUxpc3RDaGFuZ2VMaXN0ZW5lclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIoT2JqZWN0IHRhcmdldCkgewotCQlyZXR1cm4gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKHRhcmdldCwgIml0ZW1BZGRlZFplcm9Bcmd1bWVudCIsICJpdGVtUmVtb3ZlZFplcm9Bcmd1bWVudCIsICJpdGVtUmVwbGFjZWRaZXJvQXJndW1lbnQiLCAiaXRlbU1vdmVkWmVyb0FyZ3VtZW50IiwgImxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50IiwgImxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50Iik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJpdGVtQWRkZWRTaW5nbGVBcmd1bWVudCIsICJpdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50IiwgIml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50IiwgIml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50IiwgImxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnQiLCAibGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtQWRkZWRaZXJvQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBzdHJpbmcsIDApOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgc3RyaW5nLCAwKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBzdHJpbmcsIDApOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlbW92ZVN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHN0cmluZywgMCk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZW1vdmVTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtUmVwbGFjZWRaZXJvQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBvbGRTdHJpbmcgPSAiZm9vIjsKLQkJU3RyaW5nIG5ld1N0cmluZyA9ICJiYXIiOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKG9sZFN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgbmV3U3RyaW5nLCAwLCBvbGRTdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VTdHJpbmcob2xkU3RyaW5nLCBuZXdTdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgb2xkU3RyaW5nID0gImZvbyI7Ci0JCVN0cmluZyBuZXdTdHJpbmcgPSAiYmFyIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhvbGRTdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIG5ld1N0cmluZywgMCwgb2xkU3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VTdHJpbmcob2xkU3RyaW5nLCBuZXdTdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1Nb3ZlZFplcm9Bcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygiemVybyIpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJvbmUiKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygidHdvIik7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoInRocmVlIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgMCwgMik7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwubW92ZVN0cmluZygwLCAyKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtTW92ZWRTaW5nbGVBcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygiemVybyIpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJvbmUiKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygidHdvIik7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoInRocmVlIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgMCwgMik7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5tb3ZlU3RyaW5nKDAsIDIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDbGVhcmVkWmVyb0FyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBudWxsLCAtMSk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuY2xlYXJTdHJpbmdzKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgbnVsbCwgLTEpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuY2xlYXJTdHJpbmdzKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZWRaZXJvQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIG51bGwsIC0xKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlQWxsU3RyaW5ncyhuZXcgU3RyaW5nW10geyJiYXIiLCAiYmF6In0pOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIG51bGwsIC0xKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VBbGxTdHJpbmdzKG5ldyBTdHJpbmdbXSB7ImJhciIsICJiYXoifSk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9ndXNEb3VibGVBcmd1bWVudDEoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBzdHJpbmcsIDApOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAibGlzdENoYW5nZWREb3VibGVBcmd1bWVudCIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpLmdldENsYXNzKCkgPT0gTm9TdWNoTWV0aG9kRXhjZXB0aW9uLmNsYXNzKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0RvdWJsZUFyZ3VtZW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgc3RyaW5nLCAwKTsKLQkJTWV0aG9kIG1ldGhvZCA9IFJlZmxlY3Rpb25Ub29scy5nZXRNZXRob2QodGFyZ2V0LCAibGlzdENoYW5nZWREb3VibGVBcmd1bWVudCIsIG5ldyBDbGFzc1tdIHtMaXN0Q2hhbmdlRXZlbnQuY2xhc3MsIE9iamVjdC5jbGFzc30pOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRNZXNzYWdlKCkuZXF1YWxzKG1ldGhvZC50b1N0cmluZygpKSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJNaXNtYXRjaCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHN0cmluZywgMCk7Ci0JCS8vIGJ1aWxkIGEgTElTVCBjaGFuZ2UgbGlzdGVuZXIgYW5kIGhhY2sgaXQgc28gd2UKLQkJLy8gY2FuIGFkZCBpdCBhcyBhIENPTExFQ1RJT04gY2hhbmdlIGxpc3RlbmVyCi0JCU9iamVjdCBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJsaXN0RXZlbnRTaW5nbGVBcmd1bWVudCIpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCJib2d1cyBjb2xsZWN0aW9uIiwgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcikgbGlzdGVuZXIpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRlc3RNb2RlbC5jaGFuZ2VDb2xsZWN0aW9uKCk7Ci0JCQlmYWlsKCJsaXN0ZW5lciBtaXNtYXRjaDogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQljbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HU19MSVNUID0gInN0cmluZ3MiOwotCQlUZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmluZ3MoKSB7Ci0JCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5zdHJpbmdzKTsKLQkJfQotCQl2b2lkIGFkZFN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0xpc3Qoc3RyaW5nLCB0aGlzLnN0cmluZ3MsIFNUUklOR1NfTElTVCk7Ci0JCX0KLQkJdm9pZCByZW1vdmVTdHJpbmcoU3RyaW5nIHN0cmluZykgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QodGhpcy5zdHJpbmdzLmluZGV4T2Yoc3RyaW5nKSwgdGhpcy5zdHJpbmdzLCBTVFJJTkdTX0xJU1QpOwotCQl9Ci0JCXZvaWQgcmVwbGFjZVN0cmluZyhTdHJpbmcgb2xkU3RyaW5nLCBTdHJpbmcgbmV3U3RyaW5nKSB7Ci0JCQl0aGlzLnNldEl0ZW1Jbkxpc3QodGhpcy5zdHJpbmdzLmluZGV4T2Yob2xkU3RyaW5nKSwgbmV3U3RyaW5nLCB0aGlzLnN0cmluZ3MsIFNUUklOR1NfTElTVCk7Ci0JCX0KLQkJdm9pZCBtb3ZlU3RyaW5nKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCQl0aGlzLm1vdmVJdGVtSW5MaXN0KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgdGhpcy5zdHJpbmdzLCBTVFJJTkdTX0xJU1QpOwotCQl9Ci0JCXZvaWQgY2xlYXJTdHJpbmdzKCkgewotCQkJdGhpcy5jbGVhckxpc3QodGhpcy5zdHJpbmdzLCBTVFJJTkdTX0xJU1QpOwotCQl9Ci0JCXZvaWQgcmVwbGFjZUFsbFN0cmluZ3MoU3RyaW5nW10gbmV3U3RyaW5ncykgewotCQkJdGhpcy5zdHJpbmdzLmNsZWFyKCk7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMuc3RyaW5ncywgbmV3U3RyaW5ncyk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChTVFJJTkdTX0xJU1QsIHRoaXMuc3RyaW5ncyk7Ci0JCX0KLQkJdm9pZCBjaGFuZ2VDb2xsZWN0aW9uKCkgewotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoImJvZ3VzIGNvbGxlY3Rpb24iLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKLQkJfQotCX0KLQotCWNsYXNzIFRhcmdldCB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWw7Ci0JCVN0cmluZyBsaXN0TmFtZTsKLQkJU3RyaW5nIHN0cmluZzsKLQkJaW50IGluZGV4OwotCQlTdHJpbmcgcmVwbGFjZWRTdHJpbmc7Ci0JCWludCBzb3VyY2VJbmRleDsKLQkJYm9vbGVhbiBpdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBsaXN0RXZlbnRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJVGFyZ2V0KFRlc3RNb2RlbCB0ZXN0TW9kZWwsIFN0cmluZyBsaXN0TmFtZSwgU3RyaW5nIHN0cmluZywgaW50IGluZGV4KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy50ZXN0TW9kZWwgPSB0ZXN0TW9kZWw7Ci0JCQl0aGlzLmxpc3ROYW1lID0gbGlzdE5hbWU7Ci0JCQl0aGlzLnN0cmluZyA9IHN0cmluZzsKLQkJCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJfQotCQlUYXJnZXQoVGVzdE1vZGVsIHRlc3RNb2RlbCwgU3RyaW5nIGxpc3ROYW1lLCBTdHJpbmcgc3RyaW5nLCBpbnQgaW5kZXgsIFN0cmluZyByZXBsYWNlZFN0cmluZykgewotCQkJdGhpcyh0ZXN0TW9kZWwsIGxpc3ROYW1lLCBzdHJpbmcsIGluZGV4KTsKLQkJCXRoaXMucmVwbGFjZWRTdHJpbmcgPSByZXBsYWNlZFN0cmluZzsKLQkJfQotCQlUYXJnZXQoVGVzdE1vZGVsIHRlc3RNb2RlbCwgU3RyaW5nIGxpc3ROYW1lLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudGVzdE1vZGVsID0gdGVzdE1vZGVsOwotCQkJdGhpcy5saXN0TmFtZSA9IGxpc3ROYW1lOwotCQkJdGhpcy5pbmRleCA9IHRhcmdldEluZGV4OwotCQkJdGhpcy5zb3VyY2VJbmRleCA9IHNvdXJjZUluZGV4OwotCQl9Ci0JCXZvaWQgaXRlbUFkZGVkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIGl0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50KExpc3RBZGRFdmVudCBlKSB7Ci0JCQl0aGlzLml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmxpc3ROYW1lLCBlLmdldExpc3ROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3RyaW5nLCBlLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuaW5kZXgsIGUuZ2V0SW5kZXgoKSk7Ci0JCX0KLQkJdm9pZCBpdGVtUmVtb3ZlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIGl0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCXRoaXMuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5saXN0TmFtZSwgZS5nZXRMaXN0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnN0cmluZywgZS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmluZGV4LCBlLmdldEluZGV4KCkpOwotCQl9Ci0JCXZvaWQgaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIGl0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50KExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJdGhpcy5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5saXN0TmFtZSwgZS5nZXRMaXN0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnN0cmluZywgZS5nZXROZXdJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnJlcGxhY2VkU3RyaW5nLCBlLmdldE9sZEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuaW5kZXgsIGUuZ2V0SW5kZXgoKSk7Ci0JCX0KLQkJdm9pZCBpdGVtTW92ZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgaXRlbU1vdmVkU2luZ2xlQXJndW1lbnQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQl0aGlzLml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmxpc3ROYW1lLCBlLmdldExpc3ROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuaW5kZXgsIGUuZ2V0VGFyZ2V0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zb3VyY2VJbmRleCwgZS5nZXRTb3VyY2VJbmRleCgpKTsKLQkJfQotCQl2b2lkIGxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgbGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQl0aGlzLmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdE5hbWUsIGUuZ2V0TGlzdE5hbWUoKSk7Ci0JCX0KLQkJdm9pZCBsaXN0Q2xlYXJlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIGxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5saXN0TmFtZSwgZS5nZXRMaXN0TmFtZSgpKTsKLQkJfQotCQl2b2lkIGxpc3RDaGFuZ2VkRG91YmxlQXJndW1lbnQoTGlzdENoYW5nZUV2ZW50IGUsIE9iamVjdCBvKSB7Ci0JCQlmYWlsKCJib2d1cyBldmVudDogIiArIGUgKyAiIC0gb2JqZWN0OiAiICsgbyk7Ci0JCX0KLQkJdm9pZCBsaXN0RXZlbnRTaW5nbGVBcmd1bWVudChMaXN0RXZlbnQgZSkgewotCQkJdGhpcy5saXN0RXZlbnRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5saXN0TmFtZSwgZS5nZXRMaXN0TmFtZSgpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMjdkNTcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWZsZWN0aXZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXB1YmxpYyBSZWZsZWN0aXZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvQXJndW1lbnROYW1lZFByb3BlcnR5KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCg3KTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIDcsIDk5KTsKLQkJdGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgInByb3BlcnR5Q2hhbmdlZFplcm9Bcmd1bWVudCIpKTsKLQkJdGVzdE1vZGVsLnNldFZhbHVlKDk5KTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuemVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5zaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgbWV0aG9kIHRoYXQgaGFzIG1vcmUgZ2VuZXJhbCBtZXRob2QgcGFyYW1ldGVyIHR5cGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQXJndW1lbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKDcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgNywgOTkpOwotCQlNZXRob2QgbWV0aG9kID0gUmVmbGVjdGlvblRvb2xzLmdldE1ldGhvZCh0YXJnZXQsICJwcm9wZXJ0eUNoYW5nZWRTaW5nbGVBcmd1bWVudDIiLCBuZXcgQ2xhc3NbXSB7T2JqZWN0LmNsYXNzfSk7Ci0JCXRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCkpOwotCQl0ZXN0TW9kZWwuc2V0VmFsdWUoOTkpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuemVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LnNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZUFyZ3VtZW50TmFtZWRQcm9wZXJ0eSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoNyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCA3LCA5OSk7Ci0JCXRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJwcm9wZXJ0eUNoYW5nZWRTaW5nbGVBcmd1bWVudCIpKTsKLQkJdGVzdE1vZGVsLnNldFZhbHVlKDk5KTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lnplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5zaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgbWV0aG9kIHRoYXQgaGFzIG1vcmUgZ2VuZXJhbCBtZXRob2QgcGFyYW1ldGVyIHR5cGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQXJndW1lbnROYW1lZFByb3BlcnR5MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCg3KTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIDcsIDk5KTsKLQkJTWV0aG9kIG1ldGhvZCA9IFJlZmxlY3Rpb25Ub29scy5nZXRNZXRob2QodGFyZ2V0LCAicHJvcGVydHlDaGFuZ2VkU2luZ2xlQXJndW1lbnQyIiwgbmV3IENsYXNzW10ge09iamVjdC5jbGFzc30pOwotCQl0ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpKTsKLQkJdGVzdE1vZGVsLnNldFZhbHVlKDk5KTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lnplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5zaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lck1pc21hdGNoKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCg3KTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIDcsIDk5KTsKLQkJLy8gYnVpbGQgYSBQUk9QRVJUWSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGhhY2sgaXQgc28gd2UKLQkJLy8gY2FuIGFkZCBpdCBhcyBhIFNUQVRFIGNoYW5nZSBsaXN0ZW5lcgotCQlPYmplY3QgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgInByb3BlcnR5Q2hhbmdlZFNpbmdsZUFyZ3VtZW50Iik7Ci0JCXRlc3RNb2RlbC5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKChTdGF0ZUNoYW5nZUxpc3RlbmVyKSBsaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGVzdE1vZGVsLnNldFZhbHVlKDk5KTsKLQkJCWZhaWwoImxpc3RlbmVyIG1pc21hdGNoOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9ndXNEb3VibGVBcmd1bWVudDEoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKDcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgNywgOTkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJzdGF0ZUNoYW5nZWREb3VibGVBcmd1bWVudCIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpLmdldENsYXNzKCkgPT0gTm9TdWNoTWV0aG9kRXhjZXB0aW9uLmNsYXNzKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0RvdWJsZUFyZ3VtZW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCg3KTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIDcsIDk5KTsKLQkJTWV0aG9kIG1ldGhvZCA9IFJlZmxlY3Rpb25Ub29scy5nZXRNZXRob2QodGFyZ2V0LCAicHJvcGVydHlDaGFuZ2VkRG91YmxlQXJndW1lbnQiLCBuZXcgQ2xhc3NbXSB7UHJvcGVydHlDaGFuZ2VFdmVudC5jbGFzcywgT2JqZWN0LmNsYXNzfSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0TWVzc2FnZSgpLmVxdWFscyhtZXRob2QudG9TdHJpbmcoKSkpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQljbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBpbnQgdmFsdWUgPSAwOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOwotCQlUZXN0TW9kZWwoaW50IHZhbHVlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl9Ci0JCXZvaWQgc2V0VmFsdWUoaW50IHZhbHVlKSB7Ci0JCQlpbnQgb2xkID0gdGhpcy52YWx1ZTsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JCQlpZiAob2xkICE9IHZhbHVlKSB7Ci0JCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBUYXJnZXQgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQlTdHJpbmcgcHJvcGVydHlOYW1lOwotCQlPYmplY3Qgb2xkVmFsdWU7Ci0JCU9iamVjdCBuZXdWYWx1ZTsKLQkJYm9vbGVhbiB6ZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gc2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCVRhcmdldChUZXN0TW9kZWwgdGVzdE1vZGVsLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudGVzdE1vZGVsID0gdGVzdE1vZGVsOwotCQkJdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0JCQl0aGlzLm9sZFZhbHVlID0gbmV3IEludGVnZXIob2xkVmFsdWUpOwotCQkJdGhpcy5uZXdWYWx1ZSA9IG5ldyBJbnRlZ2VyKG5ld1ZhbHVlKTsKLQkJfQotCQl2b2lkIHByb3BlcnR5Q2hhbmdlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuemVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBwcm9wZXJ0eUNoYW5nZWRTaW5nbGVBcmd1bWVudChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuc2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMucHJvcGVydHlOYW1lLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCX0KLQkJdm9pZCBwcm9wZXJ0eUNoYW5nZWRTaW5nbGVBcmd1bWVudDIoT2JqZWN0IG8pIHsKLQkJCVByb3BlcnR5Q2hhbmdlRXZlbnQgZSA9IChQcm9wZXJ0eUNoYW5nZUV2ZW50KSBvOwotCQkJdGhpcy5zaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5wcm9wZXJ0eU5hbWUsIGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMub2xkVmFsdWUsIGUuZ2V0T2xkVmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5uZXdWYWx1ZSwgZS5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCQl2b2lkIHByb3BlcnR5Q2hhbmdlZERvdWJsZUFyZ3VtZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQgZSwgT2JqZWN0IG8pIHsKLQkJCWZhaWwoImJvZ3VzIGV2ZW50OiAiICsgZSArICIgLSBvYmplY3Q6ICIgKyBvKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVTdGF0ZUNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlU3RhdGVDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNzk5ZTMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVTdGF0ZUNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWZsZWN0aXZlU3RhdGVDaGFuZ2VMaXN0ZW5lclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXB1YmxpYyBSZWZsZWN0aXZlU3RhdGVDaGFuZ2VMaXN0ZW5lclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCk7Ci0JCXRlc3RNb2RlbC5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAic3RhdGVDaGFuZ2VkWmVyb0FyZ3VtZW50IikpOwotCQl0ZXN0TW9kZWwuY2hhbmdlU3RhdGUoKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuemVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5zaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVBcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsKTsKLQkJdGVzdE1vZGVsLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJzdGF0ZUNoYW5nZWRTaW5nbGVBcmd1bWVudCIpKTsKLQkJdGVzdE1vZGVsLmNoYW5nZVN0YXRlKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC56ZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuc2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IG1ldGhvZCB0aGF0IGhhcyBtb3JlIGdlbmVyYWwgbWV0aG9kIHBhcmFtZXRlciB0eXBlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZUFyZ3VtZW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwpOwotCQlNZXRob2QgbWV0aG9kID0gUmVmbGVjdGlvblRvb2xzLmdldE1ldGhvZCh0YXJnZXQsICJzdGF0ZUNoYW5nZWRTaW5nbGVBcmd1bWVudDIiLCBuZXcgQ2xhc3NbXSB7T2JqZWN0LmNsYXNzfSk7Ci0JCXRlc3RNb2RlbC5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpKTsKLQkJdGVzdE1vZGVsLmNoYW5nZVN0YXRlKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC56ZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuc2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJNaXNtYXRjaCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsKTsKLQkJLy8gYnVpbGQgYSBTVEFURSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGhhY2sgaXQgc28gd2UKLQkJLy8gY2FuIGFkZCBpdCBhcyBhIFBST1BFUlRZIGNoYW5nZSBsaXN0ZW5lcgotCQlPYmplY3QgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgInN0YXRlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50Iik7Ci0JCXRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJ2YWx1ZSIsIChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKSBsaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGVzdE1vZGVsLmNoYW5nZVByb3BlcnR5KCk7Ci0JCQlmYWlsKCJsaXN0ZW5lciBtaXNtYXRjaDogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvZ3VzRG91YmxlQXJndW1lbnQxKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJzdGF0ZUNoYW5nZWREb3VibGVBcmd1bWVudCIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpLmdldENsYXNzKCkgPT0gTm9TdWNoTWV0aG9kRXhjZXB0aW9uLmNsYXNzKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0RvdWJsZUFyZ3VtZW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwpOwotCQlNZXRob2QgbWV0aG9kID0gUmVmbGVjdGlvblRvb2xzLmdldE1ldGhvZCh0YXJnZXQsICJzdGF0ZUNoYW5nZWREb3VibGVBcmd1bWVudCIsIG5ldyBDbGFzc1tdIHtTdGF0ZUNoYW5nZUV2ZW50LmNsYXNzLCBPYmplY3QuY2xhc3N9KTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRNZXNzYWdlKCkuZXF1YWxzKG1ldGhvZC50b1N0cmluZygpKSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCWNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlUZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXZvaWQgY2hhbmdlU3RhdGUoKSB7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCQl2b2lkIGNoYW5nZVByb3BlcnR5KCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKCJ2YWx1ZSIsIDU1LCA0Mik7Ci0JCX0KLQl9Ci0KLQljbGFzcyBUYXJnZXQgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQlib29sZWFuIHplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBzaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJVGFyZ2V0KFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJfQotCQl2b2lkIHN0YXRlQ2hhbmdlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuemVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBzdGF0ZUNoYW5nZWRTaW5nbGVBcmd1bWVudChTdGF0ZUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuc2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQl9Ci0JCXZvaWQgc3RhdGVDaGFuZ2VkU2luZ2xlQXJndW1lbnQyKE9iamVjdCBlKSB7Ci0JCQl0aGlzLnNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCAoKFN0YXRlQ2hhbmdlRXZlbnQpIGUpLmdldFNvdXJjZSgpKTsKLQkJfQotCQl2b2lkIHN0YXRlQ2hhbmdlZERvdWJsZUFyZ3VtZW50KFN0YXRlQ2hhbmdlRXZlbnQgZSwgT2JqZWN0IG8pIHsKLQkJCWZhaWwoImJvZ3VzIGV2ZW50OiAiICsgZSArICIgLSBvYmplY3Q6ICIgKyBvKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVUcmVlQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVUcmVlQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmRiZmU3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlVHJlZUNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5SZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGl2ZVRyZWVDaGFuZ2VMaXN0ZW5lclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXB1YmxpYyBSZWZsZWN0aXZlVHJlZUNoYW5nZUxpc3RlbmVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcihPYmplY3QgdGFyZ2V0KSB7Ci0JCXJldHVybiBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAibm9kZUFkZGVkWmVyb0FyZ3VtZW50IiwgIm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50IiwgInRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50IiwgInRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50Iik7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJub2RlQWRkZWRTaW5nbGVBcmd1bWVudCIsICJub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50IiwgInRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnQiLCAidHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb2RlQWRkZWRaZXJvQXJndW1lbnROYW1lZFRyZWUoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImNoaWxkIn0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb2RlQWRkZWRTaW5nbGVBcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9kZVJlbW92ZWRaZXJvQXJndW1lbnROYW1lZFRyZWUoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImNoaWxkIn0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlbW92ZU5vZGUoImNoaWxkIik7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZW1vdmVOb2RlKCJjaGlsZCIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50TmFtZWRUcmVlKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgicm9vdCIsICJjaGlsZCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgiY2hpbGQiLCAiZ3JhbmRjaGlsZCIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIG5ldyBTdHJpbmdbMF0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmNsZWFyVHJlZSgpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnROYW1lZFRyZWUoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJjaGlsZCIsICJncmFuZGNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1swXSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5jbGVhclRyZWUoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmVlQ2hhbmdlZFplcm9Bcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiYW5vdGhlciBjaGlsZCJ9KTsKLQkJdGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlTm9kZSgiY2hpbGQiLCAiYW5vdGhlciBjaGlsZCIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnROYW1lZFRyZWUoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImFub3RoZXIgY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlTm9kZSgiY2hpbGQiLCAiYW5vdGhlciBjaGlsZCIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RlbmVyTWlzbWF0Y2goKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImNoaWxkIn0pOwotCQkvLyBidWlsZCBhIFRSRUUgY2hhbmdlIGxpc3RlbmVyIGFuZCBoYWNrIGl0IHNvIHdlCi0JCS8vIGNhbiBhZGQgaXQgYXMgYSBDT0xMRUNUSU9OIGNoYW5nZSBsaXN0ZW5lcgotCQlPYmplY3QgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAidHJlZUV2ZW50U2luZ2xlQXJndW1lbnQiKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiYm9ndXMgY29sbGVjdGlvbiIsIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVyKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXN0TW9kZWwuY2hhbmdlQ29sbGVjdGlvbigpOwotCQkJZmFpbCgibGlzdGVuZXIgbWlzbWF0Y2g6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIHJvb3Q7Ci0JCXByaXZhdGUgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PiBjaGlsZHJlbkxpc3RzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+KCk7Ci0JCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJlbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdTX1RSRUUgPSAic3RyaW5ncyI7Ci0JCVRlc3RNb2RlbChTdHJpbmcgcm9vdCkgewotCQkJc3VwZXIoKTsKLQkJCWlmIChyb290ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMucm9vdCA9IHJvb3Q7Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdHMucHV0KHJvb3QsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQkJCXRoaXMucGFyZW50cy5wdXQocm9vdCwgbnVsbCk7Ci0JCX0KLQkJU3RyaW5nIGdldFJvb3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5yb290OwotCQl9Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IHBhdGgoU3RyaW5nIG5vZGUpIHsKLQkJCVN0cmluZyB0ZW1wID0gbm9kZTsKLQkJCUxpc3Q8U3RyaW5nPiByZXZlcnNlUGF0aCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJZG8gewotCQkJCXJldmVyc2VQYXRoLmFkZCh0ZW1wKTsKLQkJCQl0ZW1wID0gdGhpcy5wYXJlbnRzLmdldCh0ZW1wKTsKLQkJCX0gd2hpbGUgKHRlbXAgIT0gbnVsbCk7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnJldmVyc2UocmV2ZXJzZVBhdGgpOwotCQl9Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncygpIHsKLQkJCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxTdHJpbmc+KHRoaXMuY2hpbGRyZW5MaXN0cy5rZXlTZXQoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShTdHJpbmcgcykgewotCQkJCQlUZXN0TW9kZWwudGhpcy5yZW1vdmVOb2RlKHMpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJdm9pZCBhZGROb2RlKFN0cmluZyBwYXJlbnQsIFN0cmluZyBjaGlsZCkgewotCQkJaWYgKChwYXJlbnQgPT0gbnVsbCkgfHwgKGNoaWxkID09IG51bGwpKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0KLQkJCUNvbGxlY3Rpb248U3RyaW5nPiBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW5MaXN0cy5nZXQocGFyZW50KTsKLQkJCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2Fubm90IGFkZCBhIGNoaWxkIHRvIGEgbm9uLWV4aXN0ZW50IHBhcmVudCIpOwotCQkJfQotCi0JCQlpZiAodGhpcy5jaGlsZHJlbkxpc3RzLmdldChjaGlsZCkgIT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCBhZGQgYSBjaGlsZCB0aGF0IGlzIGFscmVhZHkgaW4gdGhlIHRyZWUiKTsKLQkJCX0KLQkJCQotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCXRoaXMuY2hpbGRyZW5MaXN0cy5wdXQoY2hpbGQsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQkJCXRoaXMucGFyZW50cy5wdXQoY2hpbGQsIHBhcmVudCk7Ci0JCQl0aGlzLmZpcmVOb2RlQWRkZWQoU1RSSU5HU19UUkVFLCB0aGlzLnBhdGgoY2hpbGQpKTsKLQkJfQotCQl2b2lkIHJlbW92ZU5vZGUoU3RyaW5nIG5vZGUpIHsKLQkJCWlmIChub2RlID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQotCQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbkxpc3RzLmdldChub2RlKTsKLQkJCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm9kZSBpcyBub3QgaW4gdHJlZSIpOwotCQkJfQotCQkJTGlzdDxTdHJpbmc+IHBhdGggPSB0aGlzLnBhdGgobm9kZSk7Ci0JCQlmb3IgKFN0cmluZyBzIDogY2hpbGRyZW4pIHsKLQkJCQl0aGlzLnJlbW92ZU5vZGUocyk7Ci0JCQl9Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdHMucmVtb3ZlKG5vZGUpOwotCQkJdGhpcy5wYXJlbnRzLnJlbW92ZShub2RlKTsKLQkJCXRoaXMuZmlyZU5vZGVSZW1vdmVkKFNUUklOR1NfVFJFRSwgcGF0aCk7Ci0JCX0KLQkJdm9pZCByZXBsYWNlTm9kZShTdHJpbmcgb2xkTm9kZSwgU3RyaW5nIG5ld05vZGUpIHsKLQkJCWlmICgob2xkTm9kZSA9PSBudWxsKSB8fCAobmV3Tm9kZSA9PSBudWxsKSkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCi0JCQlDb2xsZWN0aW9uPFN0cmluZz4gY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuTGlzdHMucmVtb3ZlKG9sZE5vZGUpOwotCQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJvbGQgbm9kZSBpcyBub3QgaW4gdHJlZSIpOwotCQkJfQotCQkJdGhpcy5jaGlsZHJlbkxpc3RzLnB1dChuZXdOb2RlLCBjaGlsZHJlbik7Ci0JCQlmb3IgKFN0cmluZyBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0JCQkJdGhpcy5wYXJlbnRzLnB1dChjaGlsZCwgbmV3Tm9kZSk7Ci0JCQl9Ci0KLQkJCVN0cmluZyBwYXJlbnQgPSB0aGlzLnBhcmVudHMucmVtb3ZlKG9sZE5vZGUpOwotCQkJdGhpcy5wYXJlbnRzLnB1dChuZXdOb2RlLCBwYXJlbnQpOwotCi0JCQl0aGlzLmZpcmVUcmVlQ2hhbmdlZChTVFJJTkdTX1RSRUUsIHRoaXMucGF0aChuZXdOb2RlKSk7Ci0JCX0KLQkJdm9pZCBjbGVhclRyZWUoKSB7Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdHMuY2xlYXIoKTsKLQkJCXRoaXMuY2hpbGRyZW5MaXN0cy5wdXQocm9vdCwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwotCQkJdGhpcy5wYXJlbnRzLmNsZWFyKCk7Ci0JCQl0aGlzLnBhcmVudHMucHV0KHJvb3QsIG51bGwpOwotCQkJdGhpcy5maXJlVHJlZUNsZWFyZWQoU1RSSU5HU19UUkVFKTsKLQkJfQotCQl2b2lkIGNoYW5nZUNvbGxlY3Rpb24oKSB7Ci0JCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgiYm9ndXMgY29sbGVjdGlvbiIsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOwotCQl9Ci0JfQotCi0JY2xhc3MgVGFyZ2V0IHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJU3RyaW5nIHRyZWVOYW1lOwotCQlMaXN0PFN0cmluZz4gcGF0aDsKLQkJYm9vbGVhbiBub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiB0cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiB0cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIHRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIHRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gdHJlZUV2ZW50U2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCVRhcmdldChUZXN0TW9kZWwgdGVzdE1vZGVsLCBTdHJpbmcgdHJlZU5hbWUsIFN0cmluZ1tdIHBhdGgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJCXRoaXMudHJlZU5hbWUgPSB0cmVlTmFtZTsKLQkJCXRoaXMucGF0aCA9IEFycmF5cy5hc0xpc3QocGF0aCk7Ci0JCX0KLQkJdm9pZCBub2RlQWRkZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgbm9kZUFkZGVkU2luZ2xlQXJndW1lbnQoVHJlZUFkZEV2ZW50IGUpIHsKLQkJCXRoaXMubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMudHJlZU5hbWUsIGUuZ2V0VHJlZU5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5wYXRoLCBDb2xsZWN0aW9uVG9vbHMubGlzdChlLmdldFBhdGgoKSkpOwotCQl9Ci0JCXZvaWQgbm9kZVJlbW92ZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50KFRyZWVSZW1vdmVFdmVudCBlKSB7Ci0JCQl0aGlzLm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMudHJlZU5hbWUsIGUuZ2V0VHJlZU5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5wYXRoLCBDb2xsZWN0aW9uVG9vbHMubGlzdChlLmdldFBhdGgoKSkpOwotCQl9Ci0JCXZvaWQgdHJlZUNsZWFyZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCB0cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50KFRyZWVDbGVhckV2ZW50IGUpIHsKLQkJCXRoaXMudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy50cmVlTmFtZSwgZS5nZXRUcmVlTmFtZSgpKTsKLQkJfQotCQl2b2lkIHRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgdHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnRyZWVOYW1lLCBlLmdldFRyZWVOYW1lKCkpOwotCQl9Ci0JCXZvaWQgdHJlZUV2ZW50U2luZ2xlQXJndW1lbnQoVHJlZUV2ZW50IGUpIHsKLQkJCXRoaXMudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy50cmVlTmFtZSwgZS5nZXRUcmVlTmFtZSgpKTsKLQkJfQotCQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkRG91YmxlQXJndW1lbnQoVHJlZUNoYW5nZUV2ZW50IGUsIE9iamVjdCBvKSB7Ci0JCQlmYWlsKCJib2d1cyBldmVudDogIiArIGUgKyAiIC0gb2JqZWN0OiAiICsgbyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUzODM4MC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBFbXBsb3llZSBlbXBsb3llZTsKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IGVtcGxveWVlSG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZW1wbG95ZWVFdmVudDsKLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBpZEFkYXB0ZXI7Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbmFtZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPERhdGU+IGhpcmVEYXRlQWRhcHRlcjsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGFkYXB0ZXJFdmVudDsKLQotCXByaXZhdGUgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5UcmlnZ2VyIHRyaWdnZXI7Ci0JcHJpdmF0ZSBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1ZmZlcmVkSURIb2xkZXI7Ci0JcHJpdmF0ZSBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVmZmVyZWROYW1lSG9sZGVyOwotCXByaXZhdGUgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxEYXRlPiBidWZmZXJlZEhpcmVEYXRlSG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgYnVmZmVyZWRFdmVudDsKLQotCXB1YmxpYyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQotCQl0aGlzLmVtcGxveWVlID0gbmV3IEVtcGxveWVlKDE3LCAiRnJlZGR5IiwgbmV3IERhdGUoKSk7Ci0JCXRoaXMuZW1wbG95ZWVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPih0aGlzLmVtcGxveWVlKTsKLQotCQl0aGlzLnRyaWdnZXIgPSBuZXcgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5UcmlnZ2VyKCk7Ci0KLQkJdGhpcy5pZEFkYXB0ZXIgPSB0aGlzLmJ1aWxkSURBZGFwdGVyKHRoaXMuZW1wbG95ZWVIb2xkZXIpOwotCQl0aGlzLmJ1ZmZlcmVkSURIb2xkZXIgPSBuZXcgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPih0aGlzLmlkQWRhcHRlciwgdGhpcy50cmlnZ2VyKTsKLQotCQl0aGlzLm5hbWVBZGFwdGVyID0gdGhpcy5idWlsZE5hbWVBZGFwdGVyKHRoaXMuZW1wbG95ZWVIb2xkZXIpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlciA9IG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5uYW1lQWRhcHRlciwgdGhpcy50cmlnZ2VyKTsKLQotCQl0aGlzLmhpcmVEYXRlQWRhcHRlciA9IHRoaXMuYnVpbGRIaXJlRGF0ZUFkYXB0ZXIodGhpcy5lbXBsb3llZUhvbGRlcik7Ci0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlciA9IG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPERhdGU+KHRoaXMuaGlyZURhdGVBZGFwdGVyLCB0aGlzLnRyaWdnZXIpOwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZElEQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1wbG95ZWUsIEludGVnZXI+KGVIb2xkZXIsIEVtcGxveWVlLklEX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcih0aGlzLnN1YmplY3QuZ2V0SUQoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldElEKHZhbHVlLmludFZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBlSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVtcGxveWVlLCBTdHJpbmc+KGVIb2xkZXIsIEVtcGxveWVlLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RGF0ZT4gYnVpbGRIaXJlRGF0ZUFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBlSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVtcGxveWVlLCBEYXRlPihlSG9sZGVyLCBFbXBsb3llZS5ISVJFX0RBVEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIERhdGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRIaXJlRGF0ZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oRGF0ZSB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRIaXJlRGF0ZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWZmZXJlZExpc3RlbmVyID0gdGhpcy5idWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5idWZmZXJlZElESG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxNyksIHRoaXMuaWRBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTcpLCB0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLmVtcGxveWVlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlEYXRlIHRlbXAgPSB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCkpOwotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5idWZmZXJlZElESG9sZGVyLnNldFZhbHVlKG5ldyBJbnRlZ2VyKDMyMykpOwotCQlhc3NlcnRFcXVhbHMoMTcsIHRoaXMuZW1wbG95ZWUuZ2V0SUQoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxNyksIHRoaXMuaWRBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMzIzKSwgdGhpcy5idWZmZXJlZElESG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJSaXBsZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLmVtcGxveWVlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCkpOwotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyaWdnZXJBY2NlcHQoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWRJREhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQl0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuc2V0VmFsdWUobmV3IEludGVnZXIoMzIzKSk7Ci0JCWFzc2VydEVxdWFscygxNywgdGhpcy5lbXBsb3llZS5nZXRJRCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDE3KSwgdGhpcy5pZEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigzMjMpLCB0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIlJpcGxleSIpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCURhdGUgdGVtcCA9IHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKTsKLQkJdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5lbXBsb3llZS5nZXRIaXJlRGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuaGlyZURhdGVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMudHJpZ2dlci5hY2NlcHQoKTsKLQotCQlhc3NlcnRFcXVhbHMoMzIzLCB0aGlzLmVtcGxveWVlLmdldElEKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMzIzKSwgdGhpcy5pZEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigzMjMpLCB0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLmVtcGxveWVlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5lbXBsb3llZS5nZXRIaXJlRGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuaGlyZURhdGVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmlnZ2VyUmVzZXQoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWRJREhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQl0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuc2V0VmFsdWUobmV3IEludGVnZXIoMzIzKSk7Ci0JCWFzc2VydEVxdWFscygxNywgdGhpcy5lbXBsb3llZS5nZXRJRCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDE3KSwgdGhpcy5pZEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigzMjMpLCB0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIlJpcGxleSIpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCURhdGUgdGVtcCA9IHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKTsKLQkJdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5lbXBsb3llZS5nZXRIaXJlRGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuaGlyZURhdGVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMudHJpZ2dlci5yZXNldCgpOwotCi0JCWFzc2VydEVxdWFscygxNywgdGhpcy5lbXBsb3llZS5nZXRJRCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDE3KSwgdGhpcy5pZEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxNyksIHRoaXMuYnVmZmVyZWRJREhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCkpOwotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcoKSB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmJ1ZmZlcmVkSURIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5pZEFkYXB0ZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm5hbWVBZGFwdGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVtcGxveWVlLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuSURfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVtcGxveWVlLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5ISVJFX0RBVEVfUFJPUEVSVFkpKTsKLQotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWRJREhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmlkQWRhcHRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm5hbWVBZGFwdGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuaGlyZURhdGVBZGFwdGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuSURfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVtcGxveWVlLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEVtcGxveWVlLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVtcGxveWVlLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEVtcGxveWVlLkhJUkVfREFURV9QUk9QRVJUWSkpOwotCi0JCXRoaXMuYnVmZmVyZWRJREhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5idWZmZXJlZElESG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuaWRBZGFwdGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5uYW1lQWRhcHRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuaGlyZURhdGVBZGFwdGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCWFzc2VydFRydWUodGhpcy5lbXBsb3llZS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEVtcGxveWVlLklEX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5lbXBsb3llZS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEVtcGxveWVlLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVtcGxveWVlLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuSElSRV9EQVRFX1BST1BFUlRZKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMSgpIHsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWZmZXJlZExpc3RlbmVyID0gdGhpcy5idWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYWRhcHRlckxpc3RlbmVyID0gdGhpcy5idWlsZEFkYXB0ZXJMaXN0ZW5lcigpOwotCQl0aGlzLm5hbWVBZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBhZGFwdGVyTGlzdGVuZXIpOwotCi0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZW1wbG95ZWVMaXN0ZW5lciA9IHRoaXMuYnVpbGRFbXBsb3llZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZW1wbG95ZWUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihFbXBsb3llZS5OQU1FX1BST1BFUlRZLCBlbXBsb3llZUxpc3RlbmVyKTsKLQotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTIoKSB7Ci0JCUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihidWZmZXJlZExpc3RlbmVyKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBhZGFwdGVyTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQWRhcHRlckxpc3RlbmVyKCk7Ci0JCXRoaXMubmFtZUFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIoYWRhcHRlckxpc3RlbmVyKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBlbXBsb3llZUxpc3RlbmVyID0gdGhpcy5idWlsZEVtcGxveWVlTGlzdGVuZXIoKTsKLQkJdGhpcy5lbXBsb3llZS5hZGRDaGFuZ2VMaXN0ZW5lcihlbXBsb3llZUxpc3RlbmVyKTsKLQotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKSB7Ci0JCXRoaXMuYnVmZmVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuYWRhcHRlckV2ZW50ID0gbnVsbDsKLQkJdGhpcy5lbXBsb3llZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIlJpcGxleSIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuYnVmZmVyZWRFdmVudCwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgIkZyZWRkeSIsICJSaXBsZXkiKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmFkYXB0ZXJFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5lbXBsb3llZUV2ZW50KTsKLQotCQl0aGlzLmJ1ZmZlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLmFkYXB0ZXJFdmVudCA9IG51bGw7Ci0JCXRoaXMuZW1wbG95ZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJDaGFybGllIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5idWZmZXJlZEV2ZW50LCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAiUmlwbGV5IiwgIkNoYXJsaWUiKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmFkYXB0ZXJFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5lbXBsb3llZUV2ZW50KTsKLQotCQl0aGlzLmJ1ZmZlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLmFkYXB0ZXJFdmVudCA9IG51bGw7Ci0JCXRoaXMuZW1wbG95ZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJpZ2dlci5hY2NlcHQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmJ1ZmZlcmVkRXZlbnQpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuYWRhcHRlckV2ZW50LCB0aGlzLm5hbWVBZGFwdGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsICJGcmVkZHkiLCAiQ2hhcmxpZSIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZW1wbG95ZWVFdmVudCwgdGhpcy5lbXBsb3llZSwgRW1wbG95ZWUuTkFNRV9QUk9QRVJUWSwgIkZyZWRkeSIsICJDaGFybGllIik7Ci0KLQkJdGhpcy5idWZmZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5hZGFwdGVyRXZlbnQgPSBudWxsOwotCQl0aGlzLmVtcGxveWVlRXZlbnQgPSBudWxsOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiSmFzb24iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmJ1ZmZlcmVkRXZlbnQsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsICJDaGFybGllIiwgIkphc29uIik7Ci0JCWFzc2VydE51bGwodGhpcy5hZGFwdGVyRXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuZW1wbG95ZWVFdmVudCk7Ci0KLQkJdGhpcy5idWZmZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5hZGFwdGVyRXZlbnQgPSBudWxsOwotCQl0aGlzLmVtcGxveWVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyaWdnZXIucmVzZXQoKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmJ1ZmZlcmVkRXZlbnQsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsICJKYXNvbiIsICJDaGFybGllIik7Ci0JCWFzc2VydE51bGwodGhpcy5hZGFwdGVyRXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuZW1wbG95ZWVFdmVudCk7Ci0JfQotCi0JLyoqCi0JICogY2hhbmdpbmcgdGhlIHZhbHVlIHNob3VsZCB0cmlnZ2VyIGJ1ZmZlcmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RCdWZmZXJpbmcxKCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIlJpcGxleSIpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuaXNCdWZmZXJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogc2V0dGluZyB0byB0aGUgc2FtZSB2YWx1ZSBzaG91bGQgbm90IHRyaWdnZXIgYnVmZmVyaW5nICg/KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RCdWZmZXJpbmcyKCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIkZyZWRkeSIpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmlzQnVmZmVyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIHNldHRpbmcgdG8gdGhlIG9yaWdpbmFsIHZhbHVlIHNob3VsZCBub3QgdHJpZ2dlciBidWZmZXJpbmcgKD8pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEJ1ZmZlcmluZzMoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiUmlwbGV5Iik7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5pc0J1ZmZlcmluZygpKTsKLQotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiRnJlZGR5Iik7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuaXNCdWZmZXJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogYmFjay1kb29yIGNoYW5nZXMgYXJlIGlnbm9yZWQgLSAiTGFzdCBPbmUgSW4gV2lucyIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlQ29uZmxpY3QxKCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIlJpcGxleSIpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUoIkphc29uIik7Ci0JCWFzc2VydEVxdWFscygiSmFzb24iLCB0aGlzLmVtcGxveWVlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiSmFzb24iLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMudHJpZ2dlci5hY2NlcHQoKTsKLQkJLy8gIkphc29uIiBpcyBkcm9wcGVkIG9uIHRoZSBmbG9vci4uLgotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIGJhY2stZG9vciBjaGFuZ2VzIGNhbiBkZS1hY3RpdmF0ZSBidWZmZXJpbmcgKD8pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUNvbmZsaWN0MigpIHsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWZmZXJlZExpc3RlbmVyID0gdGhpcy5idWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJSaXBsZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLmVtcGxveWVlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5pc0J1ZmZlcmluZygpKTsKLQotCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKCJSaXBsZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLmVtcGxveWVlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuaXNCdWZmZXJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmJ1ZmZlcmVkRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRBZGFwdGVyTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmFkYXB0ZXJFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZEVtcGxveWVlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmVtcGxveWVlRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50LCBPYmplY3Qgc291cmNlLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhwcm9wZXJ0eU5hbWUsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZFZhbHVlLCBldmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JY2xhc3MgRW1wbG95ZWUgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBpbnQgaWQ7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9QUk9QRVJUWSA9ICJpZCI7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQlwcml2YXRlIERhdGUgaGlyZURhdGU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBISVJFX0RBVEVfUFJPUEVSVFkgPSAiaGlyZURhdGUiOwotCi0JCUVtcGxveWVlKGludCBpZCwgU3RyaW5nIG5hbWUsIERhdGUgaGlyZURhdGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmlkID0gaWQ7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5oaXJlRGF0ZSA9IGhpcmVEYXRlOwotCQl9Ci0JCWludCBnZXRJRCgpIHsKLQkJCXJldHVybiB0aGlzLmlkOwotCQl9Ci0JCXZvaWQgc2V0SUQoaW50IGlkKSB7Ci0JCQlpbnQgb2xkID0gdGhpcy5pZDsKLQkJCXRoaXMuaWQgPSBpZDsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChJRF9QUk9QRVJUWSwgb2xkLCBpZCk7Ci0JCX0KLQkJU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQlEYXRlIGdldEhpcmVEYXRlKCkgewotCQkJcmV0dXJuIHRoaXMuaGlyZURhdGU7Ci0JCX0KLQkJdm9pZCBzZXRIaXJlRGF0ZShEYXRlIGhpcmVEYXRlKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5oaXJlRGF0ZTsKLQkJCXRoaXMuaGlyZURhdGUgPSBoaXJlRGF0ZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChISVJFX0RBVEVfUFJPUEVSVFksIG9sZCwgaGlyZURhdGUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZmMzZjIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJpZGlUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc29uPiBvYmplY3RIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbj4gdHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCB0cmFuc2Zvcm1hdGlvbkV2ZW50OwotCi0JcHVibGljIENhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzb24+KG5ldyBQZXJzb24oIkthcmVuIiwgIlBlZ2d5IiwgbnVsbCkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyID0gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbiwgUGVyc29uPih0aGlzLm9iamVjdEhvbGRlciwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgQmlkaVRyYW5zZm9ybWVyPFBlcnNvbiwgUGVyc29uPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IEJpZGlUcmFuc2Zvcm1lcjxQZXJzb24sIFBlcnNvbj4oKSB7Ci0JCQlwdWJsaWMgUGVyc29uIHRyYW5zZm9ybShQZXJzb24gcCkgewotCQkJCXJldHVybiAocCA9PSBudWxsKSA/IG51bGwgOiBwLmdldFBhcmVudCgpOwotCQkJfQotCQkJcHVibGljIFBlcnNvbiByZXZlcnNlVHJhbnNmb3JtKFBlcnNvbiBwKSB7Ci0JCQkJcmV0dXJuIChwID09IG51bGwpID8gbnVsbCA6IHAuZ2V0Q2hpbGQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQkKLQkJUGVyc29uIHBlcnNvbiA9IHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscygiS2FyZW4iLCBwZXJzb24uZ2V0TmFtZSgpKTsKLQkJUGVyc29uIHBhcmVudCA9IHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbi5nZXRQYXJlbnQoKS5nZXROYW1lKCksIHBhcmVudC5nZXROYW1lKCkpOwotCQlhc3NlcnROb3RTYW1lKHBlcnNvbi5nZXRQYXJlbnQoKSwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBhcmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlQZXJzb24gcGVyc29uMSA9IG5ldyBQZXJzb24oIk1hdHQiLCAiTWl0Y2giLCBudWxsKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUocGVyc29uMSk7Ci0JCVBlcnNvbiBwYXJlbnQyID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMocGVyc29uMS5nZXRQYXJlbnQoKS5nZXROYW1lKCksIHBhcmVudDIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZShwZXJzb24xLmdldFBhcmVudCgpLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMocGFyZW50MiwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJUGVyc29uIHBlcnNvbjMgPSBuZXcgUGVyc29uKCJLYXJlbiIsICJQZWdneSIsIG51bGwpOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShwZXJzb24zKTsKLQkJYXNzZXJ0RXF1YWxzKCJLYXJlbiIsIHBlcnNvbjMuZ2V0TmFtZSgpKTsKLQkJUGVyc29uIHBhcmVudDMgPSB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscyhwZXJzb24zLmdldFBhcmVudCgpLmdldE5hbWUoKSwgcGFyZW50My5nZXROYW1lKCkpOwotCQlhc3NlcnROb3RTYW1lKHBlcnNvbjMuZ2V0UGFyZW50KCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhwYXJlbnQzLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdGVuaW5nKCkgewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UxKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMigpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlcygpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0JCVBlcnNvbiBrYXJlbiA9IHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCVBlcnNvbiBwZWdneVBhcmVudCA9IHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJUGVyc29uIHBlZ2d5ID0gbmV3IFBlcnNvbigiUGVnZ3kiLCAiTWFyaWFuIiwgbnVsbCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKHBlZ2d5KTsKLQkJUGVyc29uIG1hcmlhblBhcmVudCA9IHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwga2FyZW4sIHBlZ2d5KTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsIHBlZ2d5UGFyZW50LCBtYXJpYW5QYXJlbnQpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotCQlQZXJzb24gbWF0dCA9IG5ldyBQZXJzb24oIk1hdHQiLCAiTWl0Y2giLCBudWxsKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobWF0dCk7Ci0JCVBlcnNvbiBtaXRjaFBhcmVudCA9IHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgcGVnZ3ksIG1hdHQpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgbWFyaWFuUGFyZW50LCBtaXRjaFBhcmVudCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCBtYXR0LCBudWxsKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsIG1pdGNoUGFyZW50LCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobWF0dCk7Ci0JCW1pdGNoUGFyZW50ID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCBudWxsLCBtYXR0KTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsIG51bGwsIG1pdGNoUGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFRyYW5zZm9ybWF0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZFRyYW5zZm9ybWF0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQgZSwgT2JqZWN0IHNvdXJjZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIGUuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgZS5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQkKLQljbGFzcyBQZXJzb24KLQkJZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQkJCi0JCXByaXZhdGUgU3RyaW5nIHBhcmVudE5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfTkFNRV9QUk9QRVJUWSA9ICJwYXJlbnROYW1lIjsKLQkJCi0JCXByaXZhdGUgUGVyc29uIGNoaWxkOwotCQkKLQkJcHVibGljIFBlcnNvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHBhcmVudE5hbWUsIFBlcnNvbiBjaGlsZCkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMucGFyZW50TmFtZSA9IHBhcmVudE5hbWU7Ci0JCQl0aGlzLmNoaWxkID0gY2hpbGQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBQZXJzb24gZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIG5ldyBQZXJzb24odGhpcy5wYXJlbnROYW1lLCBudWxsLCB0aGlzKTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRQYXJlbnROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMucGFyZW50TmFtZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0UGFyZW50TmFtZShTdHJpbmcgbmV3UGFyZW50TmFtZSkgewotCQkJU3RyaW5nIG9sZFBhcmVudE5hbWUgPSB0aGlzLnBhcmVudE5hbWU7Ci0JCQl0aGlzLnBhcmVudE5hbWUgPSBuZXdQYXJlbnROYW1lOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQQVJFTlRfTkFNRV9QUk9QRVJUWSwgb2xkUGFyZW50TmFtZSwgbmV3UGFyZW50TmFtZSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBQZXJzb24gZ2V0Q2hpbGQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jaGlsZDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2FjaGluZ1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzcxMWEzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2FjaGluZ1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cwotCWV4dGVuZHMgVGVzdENhc2UKLXsKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc29uPiBvYmplY3RIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzb24+IHRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgdHJhbnNmb3JtYXRpb25FdmVudDsKLQotCXB1YmxpYyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzb24+KG5ldyBQZXJzb24oIkthcmVuIiwgIlBlZ2d5IiwgbnVsbCkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyID0gbmV3IFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc29uLCBQZXJzb24+KHRoaXMub2JqZWN0SG9sZGVyLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSwgdGhpcy5idWlsZFJldmVyc2VUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPFBlcnNvbiwgUGVyc29uPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPFBlcnNvbiwgUGVyc29uPigpIHsKLQkJCXB1YmxpYyBQZXJzb24gdHJhbnNmb3JtKFBlcnNvbiBwKSB7Ci0JCQkJcmV0dXJuIChwID09IG51bGwpID8gbnVsbCA6IHAuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxQZXJzb24sIFBlcnNvbj4gYnVpbGRSZXZlcnNlVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8UGVyc29uLCBQZXJzb24+KCkgewotCQkJcHVibGljIFBlcnNvbiB0cmFuc2Zvcm0oUGVyc29uIHApIHsKLQkJCQlyZXR1cm4gKHAgPT0gbnVsbCkgPyBudWxsIDogcC5nZXRDaGlsZCgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJCi0JCVBlcnNvbiBwZXJzb24gPSB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoIkthcmVuIiwgcGVyc29uLmdldE5hbWUoKSk7Ci0JCVBlcnNvbiBwYXJlbnQgPSB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscyhwZXJzb24uZ2V0UGFyZW50KCkuZ2V0TmFtZSgpLCBwYXJlbnQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZShwZXJzb24uZ2V0UGFyZW50KCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhwYXJlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJUGVyc29uIHBlcnNvbjEgPSBuZXcgUGVyc29uKCJNYXR0IiwgIk1pdGNoIiwgbnVsbCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKHBlcnNvbjEpOwotCQlQZXJzb24gcGFyZW50MiA9IHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbjEuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpLCBwYXJlbnQyLmdldE5hbWUoKSk7Ci0JCWFzc2VydE5vdFNhbWUocGVyc29uMS5nZXRQYXJlbnQoKSwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBhcmVudDIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCVBlcnNvbiBwZXJzb24zID0gbmV3IFBlcnNvbigiS2FyZW4iLCAiUGVnZ3kiLCBudWxsKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUocGVyc29uMyk7Ci0JCWFzc2VydEVxdWFscygiS2FyZW4iLCBwZXJzb24zLmdldE5hbWUoKSk7Ci0JCVBlcnNvbiBwYXJlbnQzID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMocGVyc29uMy5nZXRQYXJlbnQoKS5nZXROYW1lKCksIHBhcmVudDMuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZShwZXJzb24zLmdldFBhcmVudCgpLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMocGFyZW50MywgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJUGVyc29uIHBlcnNvbiA9IG5ldyBQZXJzb24oIkNocmlzIiwgIk5vZWwiLCBudWxsKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5zZXRWYWx1ZShwZXJzb24uZ2V0UGFyZW50KCkpOwotCQlhc3NlcnRFcXVhbHMocGVyc29uLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbi5nZXRQYXJlbnQoKS5nZXROYW1lKCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROb3RTYW1lKHBlcnNvbi5nZXRQYXJlbnQoKSwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlQZXJzb24gcGVyc29uMiA9IG5ldyBQZXJzb24oIkpvbiIsICJFbGl6YWJldGgiLCBudWxsKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5zZXRWYWx1ZShwZXJzb24yLmdldFBhcmVudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbjIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMocGVyc29uMi5nZXRQYXJlbnQoKS5nZXROYW1lKCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROb3RTYW1lKHBlcnNvbjIuZ2V0UGFyZW50KCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuc2V0VmFsdWUocGVyc29uLmdldFBhcmVudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhwZXJzb24uZ2V0UGFyZW50KCkuZ2V0TmFtZSgpLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZShwZXJzb24uZ2V0UGFyZW50KCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcoKSB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTEoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UyKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJUGVyc29uIG9sZFBlcnNvbiA9IHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCVBlcnNvbiBvbGRQYXJlbnQgPSB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCVBlcnNvbiBuZXdQZXJzb24gPSBuZXcgUGVyc29uKCJLYXJlbiIgLCAiUGVnZ3kiLCBudWxsKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobmV3UGVyc29uKTsKLQkJUGVyc29uIG5ld1BhcmVudCA9IHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgb2xkUGVyc29uLCBuZXdQZXJzb24pOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgb2xkUGFyZW50LCBuZXdQYXJlbnQpOwotCi0vLwotLy8JCXRoaXMuZXZlbnQgPSBudWxsOwotLy8JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0vLwkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoIkZvbyIpOwotLy8JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJiYXoiLCAiRm9vIik7Ci0vLwkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsICJCQVoiLCAiRk9PIik7Ci0vLwotLy8JCXRoaXMuZXZlbnQgPSBudWxsOwotLy8JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0vLwkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoIkZPTyIpOwotLy8JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJGb28iLCAiRk9PIik7Ci0vLwkJYXNzZXJ0TnVsbCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQpOwotLy8KLS8vCQl0aGlzLmV2ZW50ID0gbnVsbDsKLS8vCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotLy8JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotLy8JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJGT08iLCBudWxsKTsKLS8vCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgIkZPTyIsIG51bGwpOwotLy8KLS8vCQl0aGlzLmV2ZW50ID0gbnVsbDsKLS8vCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotLy8JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLS8vCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCBudWxsLCAiYmFyIik7Ci0vLwkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsIG51bGwsICJCQVIiKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZFRyYW5zZm9ybWF0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoUHJvcGVydHlDaGFuZ2VFdmVudCBlLCBPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCQotCWNsYXNzIFBlcnNvbiBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgcGFyZW50TmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9OQU1FX1BST1BFUlRZID0gInBhcmVudE5hbWUiOwotCQkKLQkJcHJpdmF0ZSBQZXJzb24gY2hpbGQ7Ci0JCQotCQlwdWJsaWMgUGVyc29uKFN0cmluZyBuYW1lLCBTdHJpbmcgcGFyZW50TmFtZSwgUGVyc29uIGNoaWxkKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5wYXJlbnROYW1lID0gcGFyZW50TmFtZTsKLQkJCXRoaXMuY2hpbGQgPSBjaGlsZDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQkJfQotCQkKLQkJcHVibGljIFBlcnNvbiBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gbmV3IFBlcnNvbih0aGlzLnBhcmVudE5hbWUsIG51bGwsIHRoaXMpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wYXJlbnROYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRQYXJlbnROYW1lKFN0cmluZyBuZXdQYXJlbnROYW1lKSB7Ci0JCQlTdHJpbmcgb2xkUGFyZW50TmFtZSA9IHRoaXMucGFyZW50TmFtZTsKLQkJCXRoaXMucGFyZW50TmFtZSA9IG5ld1BhcmVudE5hbWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBBUkVOVF9OQU1FX1BST1BFUlRZLCBvbGRQYXJlbnROYW1lLCBuZXdQYXJlbnROYW1lKTsKLQkJfQotCQkKLQkJcHVibGljIFBlcnNvbiBnZXRDaGlsZCgpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZGNjOTMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDE7Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyMTsKLQlwcml2YXRlIExvY2FsQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIgYWExOwotCXByaXZhdGUgQ29sbGVjdGlvbkV2ZW50IGV2ZW50MTsKLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjE7Ci0JcHJpdmF0ZSBTdHJpbmcgZXZlbnQxVHlwZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREQgPSAiYWRkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFID0gInJlbW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRSA9ICJjaGFuZ2UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBUiA9ICJjbGVhciI7Ci0KLQlwcml2YXRlIFRlc3RTdWJqZWN0IHN1YmplY3QyOwotCi0JcHVibGljIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zdWJqZWN0MSA9IG5ldyBUZXN0U3ViamVjdCgpOwotCQl0aGlzLnN1YmplY3QxLmFkZE5hbWVzKHRoaXMuc3ViamVjdDFOYW1lcygpKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGREZXNjcmlwdGlvbnModGhpcy5zdWJqZWN0MURlc2NyaXB0aW9ucygpKTsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+KHRoaXMuc3ViamVjdDEpOwotCQl0aGlzLmFhMSA9IHRoaXMuYnVpbGRBc3BlY3RBZGFwdGVyKHRoaXMuc3ViamVjdEhvbGRlcjEpOwotCQl0aGlzLmxpc3RlbmVyMSA9IHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyMSgpOwotCQl0aGlzLmFhMS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5ldmVudDFUeXBlID0gbnVsbDsKLQotCQl0aGlzLnN1YmplY3QyID0gbmV3IFRlc3RTdWJqZWN0KCk7Ci0JCXRoaXMuc3ViamVjdDIuYWRkTmFtZXModGhpcy5zdWJqZWN0Mk5hbWVzKCkpOwotCQl0aGlzLnN1YmplY3QyLmFkZERlc2NyaXB0aW9ucyh0aGlzLnN1YmplY3QyRGVzY3JpcHRpb25zKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHN1YmplY3QxTmFtZXMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImZvbyIpOwotCQlyZXN1bHQuYWRkKCJiYXIiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBzdWJqZWN0MURlc2NyaXB0aW9ucygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgidGhpcy5zdWJqZWN0MSBkZXNjcmlwdGlvbjEiKTsKLQkJcmVzdWx0LmFkZCgidGhpcy5zdWJqZWN0MSBkZXNjcmlwdGlvbjIiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBzdWJqZWN0Mk5hbWVzKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJiYXoiKTsKLQkJcmVzdWx0LmFkZCgiYmFtIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gc3ViamVjdDJEZXNjcmlwdGlvbnMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDIgZGVzY3JpcHRpb24xIik7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDIgZGVzY3JpcHRpb24yIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMb2NhbENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyIGJ1aWxkQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyKHN1YmplY3RIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUsIEFERCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQlDb2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlLCBSRU1PVkUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgewotCQkJCUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUsIENMRUFSKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSwgQ0hBTkdFKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHZhbHVlMUNoYW5nZWQoQ29sbGVjdGlvbkV2ZW50IGUsIFN0cmluZyBldmVudFR5cGUpIHsKLQkJdGhpcy5ldmVudDEgPSBlOwotCQl0aGlzLmV2ZW50MVR5cGUgPSBldmVudFR5cGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJqZWN0SG9sZGVyKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXZlbnQxVHlwZSwgQ0hBTkdFKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuZXZlbnQxLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0Mk5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLmV2ZW50MVR5cGUgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXZlbnQxVHlwZSwgQ0hBTkdFKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuZXZlbnQxLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuZXZlbnQxVHlwZSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0MSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5ldmVudDFUeXBlLCBDSEFOR0UpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudDEuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0MS5hZGROYW1lKCJqYW0iKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIEFERCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYW0iLCAoKENvbGxlY3Rpb25BZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXNQbHVzID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCW5hbWVzUGx1cy5hZGQoImphbSIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNQbHVzLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuZXZlbnQxVHlwZSA9IG51bGw7Ci0JCXRoaXMuYWExLmFkZEFsbChDb2xsZWN0aW9ucy5zaW5nbGV0b24oImpheiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIEFERCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXoiLCAoKENvbGxlY3Rpb25BZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQluYW1lc1BsdXMuYWRkKCJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzUGx1cywgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0MS5yZW1vdmVOYW1lKCJmb28iKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIFJFTU9WRSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKENvbGxlY3Rpb25SZW1vdmVFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXNNaW51cyA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc01pbnVzLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc01pbnVzLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuZXZlbnQxVHlwZSA9IG51bGw7Ci0JCXRoaXMuYWExLnJlbW92ZUFsbChDb2xsZWN0aW9ucy5zaW5nbGV0b24oImJhciIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIFJFTU9WRSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCAoKENvbGxlY3Rpb25SZW1vdmVFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQluYW1lc01pbnVzLnJlbW92ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc01pbnVzLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0MS5hZGRUd29OYW1lcygiamFtIiwgImpheiIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXZlbnQxVHlwZSwgQ0hBTkdFKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuZXZlbnQxLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXNQbHVzMiA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc1BsdXMyLmFkZCgiamFtIik7Ci0JCW5hbWVzUGx1czIuYWRkKCJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzUGx1czIsIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuc3ViamVjdDEubmFtZXMoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuc2l6ZSgpLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLnN1YmplY3QxLm5hbWVzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5hYTEuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTikpOwotCQl0aGlzLmFhMS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYWExLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IENoYW5nZUFkYXB0ZXIoKTsKLQkJdGhpcy5hYTEuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmFhMS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19DT0xMRUNUSU9OKSk7Ci0JCXRoaXMuYWExLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYWExLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQkKLQlwcml2YXRlIGNsYXNzIFRlc3RTdWJqZWN0IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU19DT0xMRUNUSU9OID0gIm5hbWVzIjsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gZGVzY3JpcHRpb25zOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTlNfQ09MTEVDVElPTiA9ICJkZXNjcmlwdGlvbnMiOwotCQotCQlwdWJsaWMgVGVzdFN1YmplY3QoKSB7Ci0JCQl0aGlzLm5hbWVzID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQkJdGhpcy5kZXNjcmlwdGlvbnMgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCX0KLQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gbmFtZXMoKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8U3RyaW5nPih0aGlzLm5hbWVzKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlpZiAodGhpcy5uYW1lcy5hZGQobmFtZSkpIHsKLQkJCQl0aGlzLmZpcmVJdGVtQWRkZWQoTkFNRVNfQ09MTEVDVElPTiwgbmFtZSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZXMoSXRlcmF0b3I8U3RyaW5nPiBuZXdOYW1lcykgewotCQkJd2hpbGUgKG5ld05hbWVzLmhhc05leHQoKSkgewotCQkJCXRoaXMuYWRkTmFtZShuZXdOYW1lcy5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBuZXdOYW1lcykgewotCQkJdGhpcy5hZGROYW1lcyhuZXdOYW1lcy5pdGVyYXRvcigpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRUd29OYW1lcyhTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQkJaWYgKHRoaXMubmFtZXMuYWRkKG5hbWUxKSB8IHRoaXMubmFtZXMuYWRkKG5hbWUyKSkgewotCQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKE5BTUVTX0NPTExFQ1RJT04sIHRoaXMubmFtZXMpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCWlmICh0aGlzLm5hbWVzLnJlbW92ZShuYW1lKSkgewotCQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKE5BTUVTX0NPTExFQ1RJT04sIG5hbWUpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGRlc2NyaXB0aW9ucygpIHsKLQkJCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxTdHJpbmc+KHRoaXMuZGVzY3JpcHRpb25zKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCWlmICh0aGlzLmRlc2NyaXB0aW9ucy5hZGQoZGVzY3JpcHRpb24pKSB7Ci0JCQkJdGhpcy5maXJlSXRlbUFkZGVkKERFU0NSSVBUSU9OU19DT0xMRUNUSU9OLCBkZXNjcmlwdGlvbik7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkRGVzY3JpcHRpb25zKEl0ZXJhdG9yPFN0cmluZz4gbmV3RGVzY3JpcHRpb25zKSB7Ci0JCQl3aGlsZSAobmV3RGVzY3JpcHRpb25zLmhhc05leHQoKSkgewotCQkJCXRoaXMuYWRkRGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb25zLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkRGVzY3JpcHRpb25zKENvbGxlY3Rpb248U3RyaW5nPiBuZXdEZXNjcmlwdGlvbnMpIHsKLQkJCXRoaXMuYWRkRGVzY3JpcHRpb25zKG5ld0Rlc2NyaXB0aW9ucy5pdGVyYXRvcigpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVEZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCWlmICh0aGlzLmRlc2NyaXB0aW9ucy5yZW1vdmUoZGVzY3JpcHRpb24pKSB7Ci0JCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoREVTQ1JJUFRJT05TX0NPTExFQ1RJT04sIGRlc2NyaXB0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIHRoaXMgaXMgbm90IGEgdHlwaWNhbCBhc3BlY3QgYWRhcHRlciAtIHRoZSB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhc3BlY3QgbmFtZQotCXByaXZhdGUgY2xhc3MgTG9jYWxDb2xsZWN0aW9uQXNwZWN0QWRhcHRlciBleHRlbmRzIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBTdHJpbmc+IHsKLQotCQlMb2NhbENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcikgewotCQkJc3VwZXIoc3ViamVjdEhvbGRlciwgVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3JfKCkgewotCQkJaWYgKHRoaXMuYXNwZWN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTikgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QubmFtZXMoKTsKLQkJCX0KLQkJCWlmICh0aGlzLmFzcGVjdE5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OU19DT0xMRUNUSU9OKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5kZXNjcmlwdGlvbnMoKTsKLQkJCX0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgYXNwZWN0IG5hbWU6ICIgKyB0aGlzLmFzcGVjdE5hbWVzWzBdKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZChTdHJpbmcgaXRlbSkgewotCQkJaWYgKHRoaXMuYXNwZWN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTikgewotCQkJCXRoaXMuc3ViamVjdC5hZGROYW1lKGl0ZW0pOwotCQkJfSBlbHNlIGlmICh0aGlzLmFzcGVjdE5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OU19DT0xMRUNUSU9OKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LmFkZERlc2NyaXB0aW9uKGl0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5hc3BlY3ROYW1lc1swXSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRBbGwoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gaXRlbXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoT2JqZWN0IGl0ZW0pIHsKLQkJCWlmICh0aGlzLmFzcGVjdE5hbWVzWzBdID09IFRlc3RTdWJqZWN0Lk5BTUVTX0NPTExFQ1RJT04pIHsKLQkJCQl0aGlzLnN1YmplY3QucmVtb3ZlTmFtZSgoU3RyaW5nKSBpdGVtKTsKLQkJCX0gZWxzZSBpZiAodGhpcy5hc3BlY3ROYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTlNfQ09MTEVDVElPTikgewotCQkJCXRoaXMuc3ViamVjdC5yZW1vdmVEZXNjcmlwdGlvbigoU3RyaW5nKSBpdGVtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMuYXNwZWN0TmFtZXNbMF0pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQWxsKENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGl0ZW1zLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXRoaXMucmVtb3ZlKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzBhMTU0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuSkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBhZGFwdGVyOwotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiB3cmFwcGVkQ29sbGVjdGlvbkhvbGRlcjsKLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiB3cmFwcGVkQ29sbGVjdGlvbjsKLQotCXB1YmxpYyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbiA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlciA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMud3JhcHBlZENvbGxlY3Rpb24pOwotCQl0aGlzLmFkYXB0ZXIgPSBuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSB0aGlzLmFkYXB0ZXJDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydEVxdWFscygzLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgYWRhcHRlckNvbGxlY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdGFsZVZhbHVlKCkgewotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQl9OwotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IHRoaXMuYWRhcHRlckNvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0KLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhZGFwdGVyQ29sbGVjdGlvbiA9IHRoaXMuYWRhcHRlckNvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSGFzaEJhZzxTdHJpbmc+KCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFkYXB0ZXJDb2xsZWN0aW9uID0gdGhpcy5hZGFwdGVyQ29sbGVjdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoMywgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCUJhZzxTdHJpbmc+IHN5bmNoQ29sbGVjdGlvbiA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiZm9vIikpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHRoaXMud3JhcHBlZENvbGxlY3Rpb24uc2l6ZSgpKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSB0aGlzLmFkYXB0ZXJDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgc3luY2hDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCUJhZzxTdHJpbmc+IHN5bmNoQ29sbGVjdGlvbiA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiam9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpheiIpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImpheiIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImpheiIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJqYXoiKSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy53cmFwcGVkQ29sbGVjdGlvbi5zaXplKCkpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IHRoaXMuYWRhcHRlckNvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHN5bmNoTGlzdC5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBzeW5jaENvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U3luY2goKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXoiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImpheiIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJqYXoiKSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy53cmFwcGVkQ29sbGVjdGlvbi5zaXplKCkpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IHRoaXMuYWRhcHRlckNvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBzeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGNsID0gbmV3IENoYW5nZUFkYXB0ZXIoKTsKLQkJdGhpcy5hZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIoY2wpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlZFRvRW1wdHkoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnNldFZhbHVlcyhuZXcgSGFzaEJhZzxTdHJpbmc+KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRGcm9tRW1wdHkoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCQotCQlIYXNoQmFnPFN0cmluZz4gYmFnID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQliYWcuYWRkKCJmb28iKTsKLQkJYmFnLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuc2V0VmFsdWVzKGJhZyk7Ci0JCWFzc2VydEVxdWFscygyLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlZEZyb21FbXB0eVRvRW1wdHkoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCQotCQlIYXNoQmFnPFN0cmluZz4gYmFnID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnNldFZhbHVlcyhiYWcpOwotCQlhc3NlcnRFcXVhbHMoMCwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQotCi0JY2xhc3MgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RDaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjkzNDNjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYWRhcHRlcjsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gd3JhcHBlZENvbGxlY3Rpb25Ib2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQotCXB1YmxpYyBDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQl0aGlzLmFkYXB0ZXIgPSBuZXcgTG9jYWxBZGFwdGVyKHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIsICI2NjYiKTsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBib29sZWFuVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmFkYXB0ZXIuZ2V0VmFsdWUoKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiB3cmFwcGVkQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCIxMTEiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoIjIyMiIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiNjY2Iik7Ci0JCWFzc2VydFRydWUodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoIjY2NiIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoIjY2NiIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuY2xlYXIoKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQotCQl0aGlzLmFkYXB0ZXIuc2V0VmFsdWUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQotCQl0aGlzLmFkYXB0ZXIuc2V0VmFsdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXZlbnRGaXJpbmcoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoIjExMSIpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCIyMjIiKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiNjY2Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoZmFsc2UsIHRydWUpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCI2NjYiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0cnVlLCBmYWxzZSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoIjY2NiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KGZhbHNlLCB0cnVlKTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmNsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodHJ1ZSwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFkYXB0ZXIsIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi52YWx1ZU9mKG9sZFZhbHVlKSwgdGhpcy5ldmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4udmFsdWVPZihuZXdWYWx1ZSksIHRoaXMuZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdGFsZVZhbHVlKCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX07Ci0JCXRoaXMuYWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiNjY2Iik7Ci0JCWFzc2VydFRydWUodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0KLQkJdGhpcy5hZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCi0JCXRoaXMuYWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfTsKLQkJdGhpcy5hZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJdGhpcy5hZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCXRoaXMuYWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3MgKioqKioqKioqKgotCi0JLyoqCi0JICogdGhlIHZhbHVlIGlzIHRydWUgaWYgdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBjb250YWlucyB0aGUgc3BlY2lmaWVkIGl0ZW0sCi0JICogb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyBmYWxzZQotCSAqLwotCXN0YXRpYyBjbGFzcyBMb2NhbEFkYXB0ZXIKLQkJZXh0ZW5kcyBDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuLCBTdHJpbmc+Ci0JCWltcGxlbWVudHMgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPgotCXsKLQkJcHJpdmF0ZSBTdHJpbmcgaXRlbTsKLQotCQlMb2NhbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBjb2xsZWN0aW9uSG9sZGVyLCBTdHJpbmcgaXRlbSkgewotCQkJc3VwZXIoY29sbGVjdGlvbkhvbGRlcik7Ci0JCQl0aGlzLml0ZW0gPSBpdGVtOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCS8qKgotCQkgKiBhbHdheXMgcmV0dXJuIGEgQm9vbGVhbgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBCb29sZWFuIGdldFZhbHVlKCkgewotCQkJQm9vbGVhbiByZXN1bHQgPSBzdXBlci5nZXRWYWx1ZSgpOwotCQkJcmV0dXJuIChyZXN1bHQgPT0gbnVsbCkgPyBCb29sZWFuLkZBTFNFIDogcmVzdWx0OwotCQl9Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCQlpZiAodGhpcy5ib29sZWFuVmFsdWUoKSkgewotCQkJCWlmICggISB0aGlzLmJvb2xlYW5WYWx1ZU9mKHZhbHVlKSkgewotCQkJCQkvLyB0aGUgdmFsdWUgaXMgY2hhbmdpbmcgZnJvbSB0cnVlIHRvIGZhbHNlCi0JCQkJCSgoU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPikgdGhpcy5jb2xsZWN0aW9uTW9kZWwpLnJlbW92ZSh0aGlzLml0ZW0pOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHRoaXMuYm9vbGVhblZhbHVlT2YodmFsdWUpKSB7Ci0JCQkJCS8vIHRoZSB2YWx1ZSBpcyBjaGFuZ2luZyBmcm9tIGZhbHNlIHRvIHRydWUKLQkJCQkJKChTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KSB0aGlzLmNvbGxlY3Rpb25Nb2RlbCkuYWRkKHRoaXMuaXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlKCkgewotCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5jb2xsZWN0aW9uTW9kZWwuaXRlcmF0b3IoKSwgdGhpcy5pdGVtKSk7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCQlwcml2YXRlIGJvb2xlYW4gYm9vbGVhblZhbHVlKCkgewotCQkJcmV0dXJuIHRoaXMuYm9vbGVhblZhbHVlT2YodGhpcy52YWx1ZSk7Ci0JCX0KLQkJcHJpdmF0ZSBib29sZWFuIGJvb2xlYW5WYWx1ZU9mKE9iamVjdCBiKSB7Ci0JCQlyZXR1cm4gKGIgPT0gbnVsbCkgPyBmYWxzZSA6ICgoQm9vbGVhbikgYikuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMjdiYWYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHB2bTE7Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHB2bTI7Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHB2bTM7Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHB2bTQ7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uPE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IGNvbGxlY3Rpb247Ci0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBjdm07Ci0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gY29tcG9zaXRlUFZNOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0KLQotCXB1YmxpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5wdm0xID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpOwotCQl0aGlzLnB2bTIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSk7Ci0JCXRoaXMucHZtMyA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKTsKLQkJdGhpcy5wdm00ID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpOwotCQl0aGlzLmNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+KCk7Ci0JCXRoaXMuY29sbGVjdGlvbi5hZGQodGhpcy5wdm0xKTsKLQkJdGhpcy5jb2xsZWN0aW9uLmFkZCh0aGlzLnB2bTIpOwotCQl0aGlzLmNvbGxlY3Rpb24uYWRkKHRoaXMucHZtMyk7Ci0JCXRoaXMuY29sbGVjdGlvbi5hZGQodGhpcy5wdm00KTsKLQkJdGhpcy5jdm0gPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8TW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4odGhpcy5jb2xsZWN0aW9uKTsKLQkJCi0JCXRoaXMuY29tcG9zaXRlUFZNID0gdGhpcy5idWlsZENvbXBvc2l0ZVBWTShjdm0pOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ29tcG9zaXRlUFZNKENvbGxlY3Rpb25WYWx1ZU1vZGVsPE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IHB2bXMpIHsKLQkJcmV0dXJuIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwuYW5kKHB2bXMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB7Ci0JCWFzc2VydE51bGwodGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVBbmRMaXN0ZW5lcnMxKCkgewotCQlhc3NlcnROdWxsKHRoaXMuY29tcG9zaXRlUFZNLmdldFZhbHVlKCkpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlQW5kTGlzdGVuZXJzMigpIHsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdGVuZXIoKTsKLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJdGhpcy5jb21wb3NpdGVQVk0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UxKCkgewotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UyKCkgewotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wdm0xLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRydWUsIGZhbHNlKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wdm0yLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOyAgLy8gbm8gY2hhbmdlCi0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMucHZtMi5zZXRWYWx1ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOyAgLy8gbm8gY2hhbmdlCi0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMucHZtMS5zZXRWYWx1ZShCb29sZWFuLlRSVUUpOwotCQl0aGlzLnZlcmlmeUV2ZW50KGZhbHNlLCB0cnVlKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wdm00LnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRydWUsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZTEoKSB7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UyKCkgewotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25DaGFuZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29sbGVjdGlvbkNoYW5nZSgpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gcHZtID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKTsKLQkJdGhpcy5jdm0uYWRkKHB2bSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodHJ1ZSwgZmFsc2UpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmN2bS5yZW1vdmUocHZtKTsKLQkJdGhpcy52ZXJpZnlFdmVudChmYWxzZSwgdHJ1ZSk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuY3ZtLmNsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQm9vbGVhbi5UUlVFLCBudWxsKTsKLQotCQlDb2xsZWN0aW9uPE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IGMyID0gbmV3IEFycmF5TGlzdDxNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PigpOwotCQljMi5hZGQodGhpcy5wdm0xKTsKLQkJYzIuYWRkKHRoaXMucHZtMik7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmN2bS5zZXRWYWx1ZXMoYzIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KG51bGwsIEJvb2xlYW4uVFJVRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcxKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnB2bTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0KLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMucHZtMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLmNvbXBvc2l0ZVBWTS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHZtMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcyKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnB2bTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0KLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnB2bTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy5jb21wb3NpdGVQVk0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wdm0xLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0JCi0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoYm9vbGVhbiBvbGRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotCQl0aGlzLnZlcmlmeUV2ZW50KEJvb2xlYW4udmFsdWVPZihvbGRWYWx1ZSksIEJvb2xlYW4udmFsdWVPZihuZXdWYWx1ZSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChCb29sZWFuIG9sZFZhbHVlLCBCb29sZWFuIG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmNvbXBvc2l0ZVBWTSwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIHRoaXMuZXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgdGhpcy5ldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZThlOTM0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBOZWlnaGJvcmhvb2QgbmVpZ2hib3Job29kOwotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOZWlnaGJvcmhvb2Q+IG5laWdoYm9yaG9vZEhvbGRlcjsKLQotCXB1YmxpYyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubmVpZ2hib3Job29kID0gbmV3IE5laWdoYm9yaG9vZCgiSGFubmEtQmFyYmVyYSIpOwotCQl0aGlzLm5laWdoYm9yaG9vZEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8TmVpZ2hib3Job29kPih0aGlzLm5laWdoYm9yaG9vZCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaDEoKSB7Ci0JCXRoaXMudmVyaWZ5U3luY2godGhpcy5idWlsZEFsbE1lbWJlcnNDb21wb3NpdGUodGhpcy5uZWlnaGJvcmhvb2RIb2xkZXIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2gyKCkgewotCQl0aGlzLnZlcmlmeVN5bmNoKHRoaXMuYnVpbGRBbGxNZW1iZXJzQ29tcG9zaXRlMih0aGlzLm5laWdoYm9yaG9vZEhvbGRlcikpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTeW5jaChDb2xsZWN0aW9uVmFsdWVNb2RlbDxNZW1iZXI+IGNvbXBvc2l0ZUNWTSkgewotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoY29tcG9zaXRlQ1ZNLml0ZXJhdG9yKCkpKTsKLQkJQmFnPEZhbWlseT4gZmFtaWxpZXNTeW5jaCA9IG5ldyBDb29yZGluYXRlZEJhZzxGYW1pbHk+KHRoaXMuYnVpbGRGYW1pbGllc0FzcGVjdEFkYXB0ZXIodGhpcy5uZWlnaGJvcmhvb2RIb2xkZXIpKTsKLQkJQmFnPE1lbWJlcj4gbWVtYmVyc1N5bmNoID0gbmV3IENvb3JkaW5hdGVkQmFnPE1lbWJlcj4oY29tcG9zaXRlQ1ZNKTsKLQkJdGhpcy5wb3B1bGF0ZU5laWdoYm9yaG9vZCh0aGlzLm5laWdoYm9yaG9vZCk7Ci0KLQkJRmFtaWx5IGpldHNvbnMgPSB0aGlzLm5laWdoYm9yaG9vZC5mYW1pbHlOYW1lZCgiSmV0c29uIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIGZhbWlsaWVzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEyLCBtZW1iZXJzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSwgbWVtYmVyc1N5bmNoKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbWJlcnNTeW5jaCwgQ29sbGVjdGlvblRvb2xzLmJhZyhjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCi0JCWpldHNvbnMucmVtb3ZlTWVtYmVyKGpldHNvbnMubWVtYmVyTmFtZWQoIkFzdHJvIikpOwotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTEsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMTEsIG1lbWJlcnNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpLCBtZW1iZXJzU3luY2gpOwotCQlhc3NlcnRFcXVhbHMobWVtYmVyc1N5bmNoLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGNvbXBvc2l0ZUNWTS5pdGVyYXRvcigpKSk7Ci0KLQkJamV0c29ucy5yZW1vdmVNZW1iZXIoamV0c29ucy5tZW1iZXJOYW1lZCgiSnVkeSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZhbWlsaWVzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBtZW1iZXJzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSwgbWVtYmVyc1N5bmNoKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbWJlcnNTeW5jaCwgQ29sbGVjdGlvblRvb2xzLmJhZyhjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCi0JCWpldHNvbnMuYWRkTWVtYmVyKCJGaWRvIik7Ci0JCWFzc2VydEVxdWFscygzLCBmYW1pbGllc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgbWVtYmVyc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSksIG1lbWJlcnNTeW5jaCk7Ci0JCWFzc2VydEVxdWFscyhtZW1iZXJzU3luY2gsIENvbGxlY3Rpb25Ub29scy5iYWcoY29tcG9zaXRlQ1ZNLml0ZXJhdG9yKCkpKTsKLQotCQl0aGlzLm5laWdoYm9yaG9vZC5yZW1vdmVGYW1pbHkoamV0c29ucyk7Ci0JCWFzc2VydEVxdWFscygyLCBmYW1pbGllc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg3LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIG1lbWJlcnNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpLCBtZW1iZXJzU3luY2gpOwotCQlhc3NlcnRFcXVhbHMobWVtYmVyc1N5bmNoLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGNvbXBvc2l0ZUNWTS5pdGVyYXRvcigpKSk7Ci0KLQkJRmFtaWx5IGJlYXJzID0gdGhpcy5uZWlnaGJvcmhvb2QuYWRkRmFtaWx5KCJCZWFyIik7Ci0JCQliZWFycy5hZGRNZW1iZXIoIllvZ2kiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZhbWlsaWVzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDgsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoOCwgbWVtYmVyc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSksIG1lbWJlcnNTeW5jaCk7Ci0JCWFzc2VydEVxdWFscyhtZW1iZXJzU3luY2gsIENvbGxlY3Rpb25Ub29scy5iYWcoY29tcG9zaXRlQ1ZNLml0ZXJhdG9yKCkpKTsKLQotCQliZWFycy5hZGRNZW1iZXIoIkJvby1Cb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZhbWlsaWVzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoOSwgbWVtYmVyc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSksIG1lbWJlcnNTeW5jaCk7Ci0JCWFzc2VydEVxdWFscyhtZW1iZXJzU3luY2gsIENvbGxlY3Rpb25Ub29scy5iYWcoY29tcG9zaXRlQ1ZNLml0ZXJhdG9yKCkpKTsKLQotCQlOZWlnaGJvcmhvb2QgbjIgPSBuZXcgTmVpZ2hib3Job29kKCJIYW5uYS1CYXJiZXJhIDIiKTsKLQkJdGhpcy5uZWlnaGJvcmhvb2RIb2xkZXIuc2V0VmFsdWUobjIpOwotCQl0aGlzLnBvcHVsYXRlTmVpZ2hib3Job29kKG4yKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZhbWlsaWVzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShuMi5hbGxNZW1iZXJzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEyLCBtZW1iZXJzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcobjIuYWxsTWVtYmVycygpKSwgbWVtYmVyc1N5bmNoKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbWJlcnNTeW5jaCwgQ29sbGVjdGlvblRvb2xzLmJhZyhjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1RyYW5zZm9ybWVyKCkgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IHN1YkNWTTEgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IHN1YkNWTTIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlDb2xsZWN0aW9uPENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4+IGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4+KCk7Ci0JCWNvbGxlY3Rpb24uYWRkKHN1YkNWTTEpOwotCQljb2xsZWN0aW9uLmFkZChzdWJDVk0yKTsKLQkJQmFnPFN0cmluZz4gc3luY2hCYWcgPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPihuZXcgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8Q29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiwgU3RyaW5nPihjb2xsZWN0aW9uKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIHN5bmNoQmFnLnNpemUoKSk7Ci0KLQkJc3ViQ1ZNMS5hZGQoImZvbyIpOwotCQlzdWJDVk0xLmFkZCgiYmFyIik7Ci0JCXN1YkNWTTEuYWRkKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHN5bmNoQmFnLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc3luY2hCYWcuY29udGFpbnMoImZvbyIpKTsKLQotCQlzdWJDVk0yLmFkZCgiam9vIik7Ci0JCXN1YkNWTTIuYWRkKCJqYXIiKTsKLQkJc3ViQ1ZNMi5hZGQoImpheiIpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hCYWcuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzeW5jaEJhZy5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRUcnVlKHN5bmNoQmFnLmNvbnRhaW5zKCJqYXoiKSk7Ci0KLQkJc3ViQ1ZNMS5yZW1vdmUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoNSwgc3luY2hCYWcuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3luY2hCYWcuY29udGFpbnMoImJheiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlSXRlbSgpIHsKLQkJQmFnPE1lbWJlcj4gc3luY2hCYWcgPSBuZXcgQ29vcmRpbmF0ZWRCYWc8TWVtYmVyPih0aGlzLmJ1aWxkQWxsTWVtYmVyc0NvbXBvc2l0ZSh0aGlzLm5laWdoYm9yaG9vZEhvbGRlcikpOwotCQl0aGlzLnBvcHVsYXRlTmVpZ2hib3Job29kKHRoaXMubmVpZ2hib3Job29kKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5uZWlnaGJvcmhvb2QuYWRkRmFtaWx5KHRoaXMubmVpZ2hib3Job29kLmZhbWlseU5hbWVkKCJKZXRzb24iKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5pbmRleE9mKCJkdXBsaWNhdGUgY29tcG9uZW50IikgIT0gLTEpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JCWFzc2VydEVxdWFscygxMiwgc3luY2hCYWcuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxGYW1pbHksIE1lbWJlcj4gY29tcG9zaXRlQ1ZNID0gdGhpcy5idWlsZEFsbE1lbWJlcnNDb21wb3NpdGUodGhpcy5uZWlnaGJvcmhvb2RIb2xkZXIpOwotCQlDb29yZGluYXRlZEJhZzxNZW1iZXI+IHN5bmNoQmFnID0gbmV3IENvb3JkaW5hdGVkQmFnPE1lbWJlcj4oY29tcG9zaXRlQ1ZNKTsKLQkJdGhpcy5wb3B1bGF0ZU5laWdoYm9yaG9vZCh0aGlzLm5laWdoYm9yaG9vZCk7Ci0JCUZhbWlseSBqZXRzb25zID0gdGhpcy5uZWlnaGJvcmhvb2QuZmFtaWx5TmFtZWQoIkpldHNvbiIpOwotCi0JCWFzc2VydFRydWUoY29tcG9zaXRlQ1ZNLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUoamV0c29ucy5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEZhbWlseS5NRU1CRVJTX0NPTExFQ1RJT04pKTsKLQotCQljb21wb3NpdGVDVk0ucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgc3luY2hCYWcpOwotCQlhc3NlcnRGYWxzZShjb21wb3NpdGVDVk0uaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UoamV0c29ucy5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEZhbWlseS5NRU1CRVJTX0NPTExFQ1RJT04pKTsKLQotCQljb21wb3NpdGVDVk0uYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgc3luY2hCYWcpOwotCQlhc3NlcnRUcnVlKGNvbXBvc2l0ZUNWTS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlhc3NlcnRUcnVlKGpldHNvbnMuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhGYW1pbHkuTUVNQkVSU19DT0xMRUNUSU9OKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTmVpZ2hib3Job29kKE5laWdoYm9yaG9vZCBuKSB7Ci0JCUZhbWlseSBmYW1pbHkxID0gbi5hZGRGYW1pbHkoIkZsaW50c3RvbmUiKTsKLQkJCWZhbWlseTEuYWRkTWVtYmVyKCJGcmVkIik7Ci0JCQlmYW1pbHkxLmFkZE1lbWJlcigiV2lsbWEiKTsKLQkJCWZhbWlseTEuYWRkTWVtYmVyKCJQZWJibGVzIik7Ci0JCQlmYW1pbHkxLmFkZE1lbWJlcigiRGlubyIpOwotCQlGYW1pbHkgZmFtaWx5MiA9IG4uYWRkRmFtaWx5KCJSdWJibGUiKTsKLQkJCWZhbWlseTIuYWRkTWVtYmVyKCJCYXJuZXkiKTsKLQkJCWZhbWlseTIuYWRkTWVtYmVyKCJCZXR0eSIpOwotCQkJZmFtaWx5Mi5hZGRNZW1iZXIoIkJhbW0tQmFtbSIpOwotCQlGYW1pbHkgZmFtaWx5MyA9IG4uYWRkRmFtaWx5KCJKZXRzb24iKTsKLQkJCWZhbWlseTMuYWRkTWVtYmVyKCJHZW9yZ2UiKTsKLQkJCWZhbWlseTMuYWRkTWVtYmVyKCJKYW5lIik7Ci0JCQlmYW1pbHkzLmFkZE1lbWJlcigiSnVkeSIpOwotCQkJZmFtaWx5My5hZGRNZW1iZXIoIkVscm95Iik7Ci0JCQlmYW1pbHkzLmFkZE1lbWJlcigiQXN0cm8iKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEZhbWlseT4gYnVpbGRGYW1pbGllc0FzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPE5laWdoYm9yaG9vZD4gY29tbXVuZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPE5laWdoYm9yaG9vZCwgRmFtaWx5Pihjb21tdW5lSG9sZGVyLCBOZWlnaGJvcmhvb2QuRkFNSUxJRVNfQ09MTEVDVElPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8RmFtaWx5PiBpdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5mYW1pbGllcygpOwotCQkJfQotCQl9OwotCX0KLQotCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPE1lbWJlcj4gYnVpbGRNZW1iZXJzQWRhcHRlcihGYW1pbHkgZmFtaWx5KSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8RmFtaWx5LCBNZW1iZXI+KEZhbWlseS5NRU1CRVJTX0NPTExFQ1RJT04sIGZhbWlseSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8TWVtYmVyPiBpdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5tZW1iZXJzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxGYW1pbHksIE1lbWJlcj4gYnVpbGRBbGxNZW1iZXJzQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDxOZWlnaGJvcmhvb2Q+IGNvbW11bmVIb2xkZXIpIHsKLQkJLy8gb3ZlcnJpZGUgI3RyYW5zZm9ybShPYmplY3QpCi0JCXJldHVybiBuZXcgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8RmFtaWx5LCBNZW1iZXI+KHRoaXMuYnVpbGRGYW1pbGllc0FzcGVjdEFkYXB0ZXIoY29tbXVuZUhvbGRlcikpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPE1lbWJlcj4gdHJhbnNmb3JtKEZhbWlseSBmYW1pbHkpIHsKLQkJCQlyZXR1cm4gQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJ1aWxkTWVtYmVyc0FkYXB0ZXIoZmFtaWx5KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPE1lbWJlcj4gYnVpbGRBbGxNZW1iZXJzQ29tcG9zaXRlMihQcm9wZXJ0eVZhbHVlTW9kZWw8TmVpZ2hib3Job29kPiBjb21tdW5lSG9sZGVyKSB7Ci0JCS8vIGJ1aWxkIGEgY3VzdG9tIFRyYW5zZm9ybWVyCi0JCXJldHVybiBuZXcgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8RmFtaWx5LCBNZW1iZXI+KHRoaXMuYnVpbGRGYW1pbGllc0FzcGVjdEFkYXB0ZXIoY29tbXVuZUhvbGRlciksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPEZhbWlseSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPj4gYnVpbGRUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxGYW1pbHksIENvbGxlY3Rpb25WYWx1ZU1vZGVsPE1lbWJlcj4+KCkgewotCQkJcHVibGljIENvbGxlY3Rpb25WYWx1ZU1vZGVsPE1lbWJlcj4gdHJhbnNmb3JtKEZhbWlseSBmYW1pbHkpIHsKLQkJCQlyZXR1cm4gQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJ1aWxkTWVtYmVyc0FkYXB0ZXIoZmFtaWx5KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkxvY2FsIFRyYW5zZm9ybWVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotLy8gKioqKioqKioqKiBpbm5lciBjbGFzc2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIGlubmVyIGNsYXNzCi0JICovCi0JcHVibGljIGNsYXNzIE5laWdoYm9yaG9vZCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPEZhbWlseT4gZmFtaWxpZXMgPSBuZXcgQXJyYXlMaXN0PEZhbWlseT4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTUlMSUVTX0NPTExFQ1RJT04gPSAiZmFtaWxpZXMiOwotCQotCQlwdWJsaWMgTmVpZ2hib3Job29kKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCi0JCXB1YmxpYyBJdGVyYXRvcjxGYW1pbHk+IGZhbWlsaWVzKCkgewotCQkJcmV0dXJuIHRoaXMuZmFtaWxpZXMuaXRlcmF0b3IoKTsKLQkJfQotCQotCQlwdWJsaWMgRmFtaWx5IGFkZEZhbWlseShTdHJpbmcgZmFtaWx5TmFtZSkgewotCQkJcmV0dXJuIHRoaXMuYWRkRmFtaWx5KG5ldyBGYW1pbHkoZmFtaWx5TmFtZSkpOwotCQl9Ci0KLQkJLy8gYmFja2Rvb3IgdG8gYWxsb3cgZHVwbGljYXRlcwotCQlwdWJsaWMgRmFtaWx5IGFkZEZhbWlseShGYW1pbHkgZmFtaWx5KSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oZmFtaWx5LCB0aGlzLmZhbWlsaWVzLCBGQU1JTElFU19DT0xMRUNUSU9OKTsKLQkJCXJldHVybiBmYW1pbHk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVGYW1pbHkoRmFtaWx5IGZhbWlseSkgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oZmFtaWx5LCB0aGlzLmZhbWlsaWVzLCBGQU1JTElFU19DT0xMRUNUSU9OKTsKLQkJfQotCQotCQlwdWJsaWMgRmFtaWx5IGZhbWlseU5hbWVkKFN0cmluZyBmYW1pbHlOYW1lKSB7Ci0JCQlmb3IgKEZhbWlseSBmYW1pbHkgOiB0aGlzLmZhbWlsaWVzKSB7Ci0JCQkJaWYgKGZhbWlseS5nZXROYW1lKCkuZXF1YWxzKGZhbWlseU5hbWUpKSB7Ci0JCQkJCXJldHVybiBmYW1pbHk7Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihmYW1pbHlOYW1lKTsKLQkJfQotCQotCQlwdWJsaWMgSXRlcmF0b3I8TWVtYmVyPiBhbGxNZW1iZXJzKCkgewotCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxNZW1iZXI+KHRoaXMubWVtYmVyc0l0ZXJhdG9ycygpKTsKLQkJfQotCQotCQlwcml2YXRlIEl0ZXJhdG9yPEl0ZXJhdG9yPE1lbWJlcj4+IG1lbWJlcnNJdGVyYXRvcnMoKSB7Ci0JCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RmFtaWx5LCBJdGVyYXRvcjxNZW1iZXI+Pih0aGlzLmZhbWlsaWVzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8TWVtYmVyPiB0cmFuc2Zvcm0oRmFtaWx5IGZhbWlseSkgewotCQkJCQlyZXR1cm4gZmFtaWx5Lm1lbWJlcnMoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXB1YmxpYyBNZW1iZXIgbWVtYmVyTmFtZWQoU3RyaW5nIGZhbWlseU5hbWUsIFN0cmluZyBtZW1iZXJOYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5mYW1pbHlOYW1lZChmYW1pbHlOYW1lKS5tZW1iZXJOYW1lZChtZW1iZXJOYW1lKTsKLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogaW5uZXIgY2xhc3MKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRmFtaWx5IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQlwcml2YXRlIENvbGxlY3Rpb248TWVtYmVyPiBtZW1iZXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXI+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1CRVJTX0NPTExFQ1RJT04gPSAibWVtYmVycyI7Ci0JCi0JCXB1YmxpYyBGYW1pbHkoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkKLQkJcHVibGljIEl0ZXJhdG9yPE1lbWJlcj4gbWVtYmVycygpIHsKLQkJCXJldHVybiB0aGlzLm1lbWJlcnMuaXRlcmF0b3IoKTsKLQkJfQotCQotCQlwdWJsaWMgTWVtYmVyIGFkZE1lbWJlcihTdHJpbmcgbWVtYmVyTmFtZSkgewotCQkJTWVtYmVyIG1lbWJlciA9IG5ldyBNZW1iZXIobWVtYmVyTmFtZSk7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24obWVtYmVyLCB0aGlzLm1lbWJlcnMsIE1FTUJFUlNfQ09MTEVDVElPTik7Ci0JCQlyZXR1cm4gbWVtYmVyOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVNZW1iZXIoTWVtYmVyIG1lbWJlcikgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24obWVtYmVyLCB0aGlzLm1lbWJlcnMsIE1FTUJFUlNfQ09MTEVDVElPTik7Ci0JCX0KLQkKLQkJcHVibGljIE1lbWJlciBtZW1iZXJOYW1lZChTdHJpbmcgbWVtYmVyTmFtZSkgewotCQkJZm9yIChNZW1iZXIgbWVtYmVyIDogdGhpcy5tZW1iZXJzKSB7Ci0JCQkJaWYgKG1lbWJlci5nZXROYW1lKCkuZXF1YWxzKG1lbWJlck5hbWUpKSB7Ci0JCQkJCXJldHVybiBtZW1iZXI7Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtZW1iZXJOYW1lKTsKLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JCX0KLQkKLQl9Ci0KLQotCS8qKgotCSAqIGlubmVyIGNsYXNzCi0JICovCi0JcHVibGljIGNsYXNzIE1lbWJlciBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQotCQlwdWJsaWMgTWVtYmVyKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJjZjUzMS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtMDsKLQlwcml2YXRlIExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm0xOwotCXByaXZhdGUgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTI7Ci0JcHJpdmF0ZSBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtMzsKLQlwcml2YXRlIExvY2FsTGlzdFZhbHVlTW9kZWw8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiB1YmVyTFZNOwotCXByaXZhdGUgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+IGNvbXBvc2l0ZUxWTTsKLQotCXB1YmxpYyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0KLQkJdGhpcy5sdm0wID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQl0aGlzLmx2bTAuYWRkKCJhYWEiKTsKLQkJdGhpcy5sdm0wLmFkZCgiYmJiIik7Ci0JCXRoaXMubHZtMC5hZGQoImNjYyIpOwotCi0JCXRoaXMubHZtMSA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJdGhpcy5sdm0xLmFkZCgiZGRkIik7Ci0JCXRoaXMubHZtMS5hZGQoImVlZSIpOwotCi0JCXRoaXMubHZtMiA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJdGhpcy5sdm0yLmFkZCgiZmZmIik7Ci0KLQkJdGhpcy5sdm0zID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQl0aGlzLmx2bTMuYWRkKCJnZ2ciKTsKLQkJdGhpcy5sdm0zLmFkZCgiaGhoIik7Ci0JCXRoaXMubHZtMy5hZGQoImlpaSIpOwotCQl0aGlzLmx2bTMuYWRkKCJqamoiKTsKLQkJdGhpcy5sdm0zLmFkZCgia2trIik7Ci0KLQkJdGhpcy51YmVyTFZNID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PigpOwotCQl0aGlzLnViZXJMVk0uYWRkKHRoaXMubHZtMCk7Ci0JCXRoaXMudWJlckxWTS5hZGQodGhpcy5sdm0xKTsKLQkJdGhpcy51YmVyTFZNLmFkZCh0aGlzLmx2bTIpOwotCQl0aGlzLnViZXJMVk0uYWRkKHRoaXMubHZtMyk7Ci0KLQkJdGhpcy5jb21wb3NpdGVMVk0gPSBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+KChMaXN0VmFsdWVNb2RlbDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KSB0aGlzLnViZXJMVk0pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW50KCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCQlhc3NlcnRFcXVhbHMoImFhYSIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiYWFhIiwgY29vcmRMaXN0LmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiYmJiIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYmIiLCBjb29yZExpc3QuZ2V0KDEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjY2MiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMikpOwotCQlhc3NlcnRFcXVhbHMoImNjYyIsIGNvb3JkTGlzdC5nZXQoMikpOwotCi0JCWFzc2VydEVxdWFscygiZGRkIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJkZGQiLCBjb29yZExpc3QuZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlZWUiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNCkpOwotCQlhc3NlcnRFcXVhbHMoImVlZSIsIGNvb3JkTGlzdC5nZXQoNCkpOwotCi0JCWFzc2VydEVxdWFscygiZmZmIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCBjb29yZExpc3QuZ2V0KDUpKTsKLQotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCQlhc3NlcnRFcXVhbHMoImFhYSIsIHRoaXMuY29tcG9zaXRlTFZNLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYWEiLCBjb29yZExpc3QuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbTEgPSBjb29yZExpc3QuaXRlcmF0b3IoKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbTIgPSB0aGlzLmNvbXBvc2l0ZUxWTS5pdGVyYXRvcigpOyBzdHJlYW0yLmhhc05leHQoKTsgKSB7Ci0JCQlhc3NlcnRFcXVhbHMoc3RyZWFtMS5uZXh0KCksIHN0cmVhbTIubmV4dCgpKTsKLQkJfQotCQlhc3NlcnRGYWxzZShzdHJlYW0xLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0JCWFzc2VydEVxdWFscygxMSwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBjb29yZExpc3Quc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheSgpIHsKLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuY29tcG9zaXRlTFZNLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmx2bTAuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMuY29tcG9zaXRlTFZNLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgY29vcmRMaXN0KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb21wb3NpdGVMVk0uaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmx2bTAuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgY29vcmRMaXN0KTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbXBvc2l0ZUxWTS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5sdm0wLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU291cmNlX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm0gPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bS5hZGQoInh4eCIpOwotCQlsdm0uYWRkKCJ5eXkiKTsKLQkJbHZtLmFkZCgienp6Iik7Ci0JCXRoaXMudWJlckxWTS5hZGQoMCwgbHZtKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIsICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU291cmNlX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm0uYWRkKCJ4eHgiKTsKLQkJbHZtLmFkZCgieXl5Iik7Ci0JCWx2bS5hZGQoInp6eiIpOwotCQl0aGlzLnViZXJMVk0uYWRkKDIsIGx2bSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJ4eHgiLCAieXl5IiwgInp6eiIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg5KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNvdXJjZV9FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bSA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtLmFkZCgieHh4Iik7Ci0JCWx2bS5hZGQoInl5eSIpOwotCQlsdm0uYWRkKCJ6enoiKTsKLQkJdGhpcy51YmVyTFZNLmFkZChsdm0pOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAieHh4IiwgInl5eSIsICJ6enoiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTb3VyY2VzKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm1BID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm1BLmFkZCgieHh4Iik7Ci0JCWx2bUEuYWRkKCJ5eXkiKTsKLQkJbHZtQS5hZGQoInp6eiIpOwotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtQiA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtQi5hZGQoInBwcCIpOwotCQlsdm1CLmFkZCgicXFxIik7Ci0JCWx2bUIuYWRkKCJycnIiKTsKLQkJQ29sbGVjdGlvbjxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGMgPSBuZXcgQXJyYXlMaXN0PExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJYy5hZGQobHZtQSk7Ci0JCWMuYWRkKGx2bUIpOwotCQl0aGlzLnViZXJMVk0uYWRkQWxsKDIsIGMpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAieHh4IiwgInl5eSIsICJ6enoiLCAicHBwIiwgInFxcSIsICJycnIiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMTIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNvdXJjZV9CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0ucmVtb3ZlKDApOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMykpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTb3VyY2VfTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5yZW1vdmUoMik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU291cmNlX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0ucmVtb3ZlKDMpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCBjb29yZExpc3QuZ2V0KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU291cmNlcygpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0ucmVtb3ZlKDIsIDIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlZWUiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNCkpOwotCQlhc3NlcnRFcXVhbHMoImVlZSIsIGNvb3JkTGlzdC5nZXQoNCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlU291cmNlcygpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtQSA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtQS5hZGQoInh4eCIpOwotCQlsdm1BLmFkZCgieXl5Iik7Ci0JCWx2bUEuYWRkKCJ6enoiKTsKLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bUIgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bUIuYWRkKCJwcHAiKTsKLQkJbHZtQi5hZGQoInFxcSIpOwotCQlsdm1CLmFkZCgicnJyIik7Ci0JCUxpc3Q8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKGx2bUEpOwotCQlsaXN0LmFkZChsdm1CKTsKLQkJdGhpcy51YmVyTFZNLnNldCgyLCBsaXN0KTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgInh4eCIsICJ5eXkiLCAienp6IiwgInBwcCIsICJxcXEiLCAicnJyIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygicXFxIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJxcXEiLCBjb29yZExpc3QuZ2V0KDkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNvdXJjZXNfQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLm1vdmUoMCwgMiwgMik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgxKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCgxKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTb3VyY2VzX01pZGRsZSgpIHsKLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTQgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTQuYWRkKCJsbGwiKTsKLQkJbHZtNC5hZGQoIm1tbSIpOwotCQl0aGlzLnViZXJMVk0uYWRkKGx2bTQpOwotCi0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm01ID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm01LmFkZCgibm5uIik7Ci0JCWx2bTUuYWRkKCJvb28iKTsKLQkJbHZtNS5hZGQoInBwcCIpOwotCQlsdm01LmFkZCgicXFxIik7Ci0JCXRoaXMudWJlckxWTS5hZGQobHZtNSk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0ubW92ZSgxLCAzLCAyKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiwgImxsbCIsICJtbW0iLCAiZGRkIiwgImVlZSIsICJmZmYiLCAibm5uIiwgIm9vbyIsICJwcHAiLCAicXFxIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNvdXJjZXNfRW5kKCkgewotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNCA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNC5hZGQoImxsbCIpOwotCQlsdm00LmFkZCgibW1tIik7Ci0JCXRoaXMudWJlckxWTS5hZGQobHZtNCk7Ci0KLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTUgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTUuYWRkKCJubm4iKTsKLQkJbHZtNS5hZGQoIm9vbyIpOwotCQlsdm01LmFkZCgicHBwIik7Ci0JCWx2bTUuYWRkKCJxcXEiKTsKLQkJdGhpcy51YmVyTFZNLmFkZChsdm01KTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5tb3ZlKDMsIDAsIDMpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAibGxsIiwgIm1tbSIsICJubm4iLCAib29vIiwgInBwcCIsICJxcXEiLCAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU291cmNlKCkgewotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNCA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNC5hZGQoImxsbCIpOwotCQlsdm00LmFkZCgibW1tIik7Ci0JCXRoaXMudWJlckxWTS5hZGQobHZtNCk7Ci0KLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTUgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTUuYWRkKCJubm4iKTsKLQkJbHZtNS5hZGQoIm9vbyIpOwotCQlsdm01LmFkZCgicHBwIik7Ci0JCWx2bTUuYWRkKCJxcXEiKTsKLQkJdGhpcy51YmVyTFZNLmFkZChsdm01KTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5tb3ZlKDMsIDEpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiwgImRkZCIsICJlZWUiLCAibGxsIiwgIm1tbSIsICJubm4iLCAib29vIiwgInBwcCIsICJxcXEiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvb28iLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMTQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvb28iLCBjb29yZExpc3QuZ2V0KDE0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsZWFyU291cmNlcygpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0uY2xlYXIoKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbMF07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlU291cmNlczEoKSB7Ci0JCUxpc3Q8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KCk7Ci0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm00ID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm00LmFkZCgibGxsIik7Ci0JCWx2bTQuYWRkKCJtbW0iKTsKLQkJbmV3TGlzdC5hZGQobHZtNCk7Ci0KLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTUgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTUuYWRkKCJubm4iKTsKLQkJbHZtNS5hZGQoIm9vbyIpOwotCQlsdm01LmFkZCgicHBwIik7Ci0JCWx2bTUuYWRkKCJxcXEiKTsKLQkJbmV3TGlzdC5hZGQobHZtNSk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0uc2V0TGlzdFZhbHVlcyhuZXdMaXN0KTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJsbGwiLCAibW1tIiwgIm5ubiIsICJvb28iLCAicHBwIiwgInFxcSIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoIm9vbyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygib29vIiwgY29vcmRMaXN0LmdldCgzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZVNvdXJjZXMyKCkgewotCQlMaXN0PExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gbmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PigpOwotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNCA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNC5hZGQoImxsbCIpOwotCQlsdm00LmFkZCgibW1tIik7Ci0JCW5ld0xpc3QuYWRkKGx2bTQpOwotCi0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm01ID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm01LmFkZCgibm5uIik7Ci0JCWx2bTUuYWRkKCJvb28iKTsKLQkJbHZtNS5hZGQoInBwcCIpOwotCQlsdm01LmFkZCgicXFxIik7Ci0JCW5ld0xpc3QuYWRkKGx2bTUpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLmNoYW5nZUxpc3RWYWx1ZXMobmV3TGlzdCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAibGxsIiwgIm1tbSIsICJubm4iLCAib29vIiwgInBwcCIsICJxcXEiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvb28iLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMykpOwotCQlhc3NlcnRFcXVhbHMoIm9vbyIsIGNvb3JkTGlzdC5nZXQoMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VTb3VyY2VzMygpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEVycm9yTGlzdGVuZXIoKTsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0KLQkJTGlzdDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0PExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0wKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0xKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0yKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0zKTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5jaGFuZ2VMaXN0VmFsdWVzKG5ld0xpc3QpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJkZGQiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMykpOwotCQlhc3NlcnRFcXVhbHMoImRkZCIsIGNvb3JkTGlzdC5nZXQoMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VTb3VyY2VzNCgpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEVycm9yTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7IC8qIE9LICovIH0KLQkJfTsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0KLQkJTGlzdDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0PExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0wKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0xKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0yKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0zKTsKLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTQgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTQuYWRkKCJsbGwiKTsKLQkJbHZtNC5hZGQoIm1tbSIpOwotCQluZXdMaXN0LmFkZChsdm00KTsKLQotCi0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLmNoYW5nZUxpc3RWYWx1ZXMobmV3TGlzdCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJsbGwiLCAibW1tIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZGRkIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJkZGQiLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlU291cmNlczUoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7IC8qIE9LICovIH0KLQkJfTsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0KLQkJTGlzdDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0PExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0wKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0xKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0yKTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5jaGFuZ2VMaXN0VmFsdWVzKG5ld0xpc3QpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZGRkIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJkZGQiLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlU291cmNlczYoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgeyAvKiBPSyAqLyB9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsgLyogT0sgKi8gfQotCQl9OwotCQl0aGlzLmNvbXBvc2l0ZUxWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQotCQlMaXN0PExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gbmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PigpOwotCQluZXdMaXN0LmFkZCh0aGlzLmx2bTApOwotCQluZXdMaXN0LmFkZCh0aGlzLmx2bTEpOwotCi0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm00ID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm00LmFkZCgibGxsIik7Ci0JCWx2bTQuYWRkKCJtbW0iKTsKLQkJbmV3TGlzdC5hZGQobHZtNCk7Ci0KLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0zKTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5jaGFuZ2VMaXN0VmFsdWVzKG5ld0xpc3QpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAibGxsIiwgIm1tbSIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZGRkIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJkZGQiLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbV9CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuYWRkKDAsICJ4eHgiKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJ4eHgiLCAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1fTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMi5hZGQoMSwgInh4eCIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgInh4eCIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbV9FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLmFkZCg1LCAieHh4Iik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJ4eHgiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc19CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuYWRkQWxsKDAsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAieHh4IiwgInl5eSIsICJ6enoiLCAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg5KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTIuYWRkQWxsKDEsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAieHh4IiwgInl5eSIsICJ6enoiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg5KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMuYWRkQWxsKDUsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJ4eHgiLCAieXl5IiwgInp6eiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1fQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLnJlbW92ZSgwKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTIucmVtb3ZlKDApOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1fRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5yZW1vdmUoNCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNfQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLnJlbW92ZSgwLCAzKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNfTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5yZW1vdmUoMSwgMyk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImtrayIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygia2trIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMucmVtb3ZlKDMsIDIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUl0ZW1fQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLnNldCgwLCAieHh4Iik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAieHh4IiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VJdGVtX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTIuc2V0KDAsICJ4eHgiKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgInh4eCIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUl0ZW1fRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5zZXQoNCwgInh4eCIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJ4eHgiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbXNfQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLnNldCgwLCBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgInh4eCIsICJ5eXkiLCAienp6IiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbXNfTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5zZXQoMSwgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAieHh4IiwgInl5eSIsICJ6enoiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAieHh4IiwgInl5eSIsICJ6enoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygia2trIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDEwKSk7Ci0JCWFzc2VydEVxdWFscygia2trIiwgY29vcmRMaXN0LmdldCgxMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbXNfRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5zZXQoMywgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAieHh4IiwgInl5eSIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgInh4eCIsICJ5eXkiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSXRlbV9CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAubW92ZSgyLCAwKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJiYmIiLCAiY2NjIiwgImFhYSIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUl0ZW1fTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMS5tb3ZlKDAsIDEpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImVlZSIsICJkZGQiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSXRlbV9FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLm1vdmUoMCwgNCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAia2trIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVJdGVtc19CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAubW92ZSgxLCAwLCAyKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJjY2MiLCAiYWFhIiwgImJiYiIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUl0ZW1zX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTEuYWRkKCJlZWUuMSIpOwotCQl0aGlzLmx2bTEuYWRkKCJlZWUuMiIpOwotCQl0aGlzLmx2bTEuYWRkKCJlZWUuMyIpOwotCQl0aGlzLmx2bTEubW92ZSgxLCAyLCAzKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlLjEiLCAiZWVlLjIiLCAiZWVlLjMiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUl0ZW1zX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMubW92ZSgwLCAyLCAzKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJpaWkiLCAiampqIiwgImtrayIsICJnZ2ciLCAiaGhoIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJJdGVtc19CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuY2xlYXIoKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJJdGVtc19NaWRkbGUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0xLmNsZWFyKCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNCkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhckl0ZW1zX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMuY2xlYXIoKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgY29vcmRMaXN0LmdldCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX0JlZ2luMSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuc2V0TGlzdFZhbHVlcyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgInh4eCIsICJ5eXkiLCAienp6IiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19NaWRkbGUxKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMS5zZXRMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAieHh4IiwgInl5eSIsICJ6enoiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNykpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19FbmQxKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5zZXRMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAieHh4IiwgInl5eSIsICJ6enoiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19CZWdpbjIoKSB7Ci0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IEVycm9yTGlzdGVuZXIoKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLmNoYW5nZUxpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiYWFhIiwgImJiYiIsICJjY2MiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlSXRlbXNfTWlkZGxlMigpIHsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgRXJyb3JMaXN0ZW5lcigpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTEuY2hhbmdlTGlzdFZhbHVlcyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJkZGQiLCAiZWVlIiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImhoaCIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygiaGhoIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX0VuZDIoKSB7Ci0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IEVycm9yTGlzdGVuZXIoKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLmNoYW5nZUxpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19CZWdpbjMoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsgLyogT0sgKi8gfQotCQl9OwotCQl0aGlzLmNvbXBvc2l0ZUxWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuY2hhbmdlTGlzdFZhbHVlcyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJhYWEiLCAiYmJiIiwgInh4eCIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAieHh4IiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19NaWRkbGUzKCkgewotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRXJyb3JMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7IC8qIE9LICovIH0KLQkJfTsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0xLmNoYW5nZUxpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiZGRkIiwgInh4eCIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJ4eHgiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJoaGgiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNykpOwotCQlhc3NlcnRFcXVhbHMoImhoaCIsIGNvb3JkTGlzdC5nZXQoNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19FbmQzKCkgewotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRXJyb3JMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7IC8qIE9LICovIH0KLQkJfTsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLmNoYW5nZUxpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiZ2dnIiwgImhoaCIsICJpaWkiLCAieHh4IiwgImtrayIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgInh4eCIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19CZWdpbjQoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgeyAvKiBPSyAqLyB9Ci0JCX07Ci0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMC5jaGFuZ2VMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgInh4eCIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgInh4eCIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlSXRlbXNfTWlkZGxlNCgpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEVycm9yTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7IC8qIE9LICovIH0KLQkJfTsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0xLmNoYW5nZUxpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiZGRkIiwgImVlZSIsICJ4eHgiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgInh4eCIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX0VuZDQoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgeyAvKiBPSyAqLyB9Ci0JCX07Ci0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5jaGFuZ2VMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAieHh4IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJ4eHgiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19CZWdpbjUoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7IC8qIE9LICovIH0KLQkJfTsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLmNoYW5nZUxpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiYWFhIiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpaWkiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImlpaSIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19NaWRkbGU1KCkgewotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRXJyb3JMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgeyAvKiBPSyAqLyB9Ci0JCX07Ci0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMS5jaGFuZ2VMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgImRkZCIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImlpaSIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygiaWlpIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX0VuZDUoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7IC8qIE9LICovIH0KLQkJfTsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLmNoYW5nZUxpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiZ2dnIiwgImhoaCIsICJpaWkiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgY29vcmRMaXN0LmdldCg1KSk7Ci0JfQotCi0JY2xhc3MgRXJyb3JMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RDaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJZmFpbCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJZmFpbCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJZmFpbCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBMb2NhbExpc3RWYWx1ZU1vZGVsPEU+IGV4dGVuZHMgU2ltcGxlTGlzdFZhbHVlTW9kZWw8RT4gewotCQlMb2NhbExpc3RWYWx1ZU1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQl2b2lkIGNoYW5nZUxpc3RWYWx1ZXMoSXRlcmFibGU8RT4gbGlzdFZhbHVlcykgewotCQkJaWYgKGxpc3RWYWx1ZXMgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMubGlzdCwgbGlzdFZhbHVlcyk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUywgdGhpcy5saXN0KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI5Y2JmZS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gcHZtMTsKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gcHZtMjsKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gcHZtMzsKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gcHZtNDsKLQlwcml2YXRlIENvbGxlY3Rpb248TW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPj4gY29sbGVjdGlvbjsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4+IGN2bTsKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBjb21wb3NpdGVQVk07Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQotCi0JcHVibGljIENvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMucHZtMSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4oSW50ZWdlci52YWx1ZU9mKDEpKTsKLQkJdGhpcy5wdm0yID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPihJbnRlZ2VyLnZhbHVlT2YoMikpOwotCQl0aGlzLnB2bTMgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+KEludGVnZXIudmFsdWVPZigzKSk7Ci0JCXRoaXMucHZtNCA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4oSW50ZWdlci52YWx1ZU9mKDQpKTsKLQkJdGhpcy5jb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+PigpOwotCQl0aGlzLmNvbGxlY3Rpb24uYWRkKHRoaXMucHZtMSk7Ci0JCXRoaXMuY29sbGVjdGlvbi5hZGQodGhpcy5wdm0yKTsKLQkJdGhpcy5jb2xsZWN0aW9uLmFkZCh0aGlzLnB2bTMpOwotCQl0aGlzLmNvbGxlY3Rpb24uYWRkKHRoaXMucHZtNCk7Ci0JCXRoaXMuY3ZtID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4+KHRoaXMuY29sbGVjdGlvbik7Ci0JCQotCQl0aGlzLmNvbXBvc2l0ZVBWTSA9IHRoaXMuYnVpbGRDb21wb3NpdGVQVk0oY3ZtKTsKLQl9Ci0KLQlwcml2YXRlIDxUIGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+PiBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRDb21wb3NpdGVQVk0oQ29sbGVjdGlvblZhbHVlTW9kZWw8VD4gcHZtcykgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyLCBJbnRlZ2VyPihwdm1zKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWUoKSB7Ci0JCQkJaW50IHN1bSA9IDA7Ci0JCQkJZm9yIChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEludGVnZXI+IGVhY2ggOiB0aGlzLmNvbGxlY3Rpb25Nb2RlbCkgewotCQkJCQlzdW0gKz0gZWFjaC5nZXRWYWx1ZSgpLmludFZhbHVlKCk7Ci0JCQkJfQotCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2Yoc3VtKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgewotCQlhc3NlcnROdWxsKHRoaXMuY29tcG9zaXRlUFZNLmdldFZhbHVlKCkpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscygxMCwgdGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVBbmRMaXN0ZW5lcnMxKCkgewotCQlhc3NlcnROdWxsKHRoaXMuY29tcG9zaXRlUFZNLmdldFZhbHVlKCkpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscygxMCwgdGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKS5pbnRWYWx1ZSgpKTsKLQkJdGhpcy5jb21wb3NpdGVQVk0ucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnROdWxsKHRoaXMuY29tcG9zaXRlUFZNLmdldFZhbHVlKCkpOwotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVBbmRMaXN0ZW5lcnMyKCkgewotCQlhc3NlcnROdWxsKHRoaXMuY29tcG9zaXRlUFZNLmdldFZhbHVlKCkpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHRoaXMuY29tcG9zaXRlUFZNLmdldFZhbHVlKCkuaW50VmFsdWUoKSk7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydE51bGwodGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMSgpIHsKLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMigpIHsKLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcm9wZXJ0eUNoYW5nZSgpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMucHZtMS5zZXRWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQl0aGlzLnZlcmlmeUV2ZW50KDEwLCAxNCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMucHZtNC5zZXRWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoMCkpOwotCQl0aGlzLnZlcmlmeUV2ZW50KDE0LCAxMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UxKCkgewotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkNoYW5nZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlMigpIHsKLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbGxlY3Rpb25DaGFuZ2UoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IHB2bSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4oSW50ZWdlci52YWx1ZU9mKDc3KSk7Ci0JCXRoaXMuY3ZtLmFkZChwdm0pOwotCQl0aGlzLnZlcmlmeUV2ZW50KDEwLCA4Nyk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuY3ZtLnJlbW92ZShwdm0pOwotCQl0aGlzLnZlcmlmeUV2ZW50KDg3LCAxMCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuY3ZtLmNsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoMTAsIDApOwotCi0JCUNvbGxlY3Rpb248TW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPj4gYzIgPSBuZXcgQXJyYXlMaXN0PE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4+KCk7Ci0JCWMyLmFkZCh0aGlzLnB2bTEpOwotCQljMi5hZGQodGhpcy5wdm0yKTsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuY3ZtLnNldFZhbHVlcyhjMik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoMCwgMyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcxKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnB2bTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0KLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMucHZtMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLmNvbXBvc2l0ZVBWTS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHZtMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcyKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnB2bTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0KLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnB2bTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy5jb21wb3NpdGVQVk0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wdm0xLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0JCi0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotCQlhc3NlcnRFcXVhbHModGhpcy5jb21wb3NpdGVQVk0sIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZihvbGRWYWx1ZSksIHRoaXMuZXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YobmV3VmFsdWUpLCB0aGlzLmV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db29yZGluYXRlZEJhZy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0Nvb3JkaW5hdGVkQmFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOGE0ZDYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0Nvb3JkaW5hdGVkQmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0aGF0IGtlZXBzIGFuIGludGVybmFsIGNvbGxlY3Rpb24gaW4gc3luY2ggd2l0aCB0aGUKLSAqIGNvbGxlY3Rpb24gaGVsZCBieSBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuCi0gKi8KLWNsYXNzIENvb3JkaW5hdGVkQmFnPEU+IGltcGxlbWVudHMgQmFnPEU+LCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBCYWc8RT4gYmFnID0gbmV3IEhhc2hCYWc8RT4oKTsKLQotCUNvb3JkaW5hdGVkQmFnKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGN2bSkgewotCQljdm0uYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbykgewotCQlyZXR1cm4gdGhpcy5iYWcuYWRkKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5hZGRBbGwoYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmNvbnRhaW5zKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5iYWcuY29udGFpbnNBbGwoYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5iYWcucmVtb3ZlKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnJlbW92ZUFsbChjKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5yZXRhaW5BbGwoYyk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5iYWcuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5iYWcudG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyA8VD4gVFtdIHRvQXJyYXkoVFtdIGEpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnRvQXJyYXkoYSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJhZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGNvdW50KE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5jb3VudChvKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvLCBpbnQgY291bnQpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmFkZChvLCBjb3VudCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvLCBpbnQgY291bnQpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnJlbW92ZShvLCBjb3VudCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IHVuaXF1ZUl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHVuaXF1ZUNvdW50KCkgewotCQlyZXR1cm4gdGhpcy5iYWcudW5pcXVlQ291bnQoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8QmFnLkVudHJ5PEU+PiBlbnRyaWVzKCkgewotCQlyZXR1cm4gdGhpcy5iYWcuZW50cmllcygpOwotCX0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoRSBpdGVtIDogKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpKSB7Ci0JCQl0aGlzLmJhZy5hZGQoaXRlbSk7Ci0JCX0KLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoRSBpdGVtIDogKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpKSB7Ci0JCQl0aGlzLmJhZy5yZW1vdmUoaXRlbSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmJhZy5jbGVhcigpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmJhZy5jbGVhcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMuYmFnLCAoKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+KSBldmVudC5nZXRTb3VyY2UoKSkuaXRlcmF0b3IoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5lcXVhbHMobyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmhhc2hDb2RlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29vcmRpbmF0ZWRMaXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29vcmRpbmF0ZWRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1Y2YwMjQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0Nvb3JkaW5hdGVkTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0RGF0YUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3REYXRhTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdGhhdCBrZWVwcyBhbiBpbnRlcm5hbCBsaXN0IGluIHN5bmNoIHdpdGggdGhlCi0gKiBsaXN0IGhlbGQgYnkgYSBsaXN0IHZhbHVlIG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgQ29vcmRpbmF0ZWRMaXN0PEU+IGltcGxlbWVudHMgTGlzdDxFPiwgTGlzdENoYW5nZUxpc3RlbmVyLCBMaXN0RGF0YUxpc3RlbmVyIHsKLQlwcml2YXRlIExpc3Q8RT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RT4oKTsKLQotCXB1YmxpYyBDb29yZGluYXRlZExpc3QoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdFZhbHVlTW9kZWwpIHsKLQkJbGlzdFZhbHVlTW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzKTsKLQkJZm9yIChJdGVyYXRvcjxFPiBzdHJlYW0gPSBsaXN0VmFsdWVNb2RlbC5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMuYWRkKHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIENvb3JkaW5hdGVkTGlzdChMaXN0TW9kZWwgbGlzdE1vZGVsKSB7Ci0JCWxpc3RNb2RlbC5hZGRMaXN0RGF0YUxpc3RlbmVyKHRoaXMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RNb2RlbC5nZXRTaXplKCk7IGkrKykgewotCQkJdGhpcy5hZGQoaSwgdGhpcy5nZXRFbGVtZW50QXQobGlzdE1vZGVsLCBpKSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKLQkJdGhpcy5saXN0LmFkZChpbmRleCwgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbykgewotCQlyZXR1cm4gdGhpcy5saXN0LmFkZChvKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQlyZXR1cm4gdGhpcy5saXN0LmFkZEFsbChjKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuYWRkQWxsKGluZGV4LCBjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5jb250YWlucyhvKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5jb250YWluc0FsbChjKTsKLQl9Ci0KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuZ2V0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5pbmRleE9mKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5sYXN0SW5kZXhPZihvKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5saXN0SXRlcmF0b3IoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBFIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5yZW1vdmUoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0LnJlbW92ZShvKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QucmVtb3ZlQWxsKGMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5yZXRhaW5BbGwoYyk7Ci0JfQotCi0JcHVibGljIEUgc2V0KGludCBpbmRleCwgRSBlbGVtZW50KSB7Ci0JCXJldHVybiB0aGlzLmxpc3Quc2V0KGluZGV4LCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3Quc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBMaXN0PEU+IHN1Ykxpc3QoaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5zdWJMaXN0KGZyb21JbmRleCwgdG9JbmRleCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QudG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyA8VD4gVFtdIHRvQXJyYXkoVFtdIGEpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC50b0FycmF5KGEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQlpbnQgaSA9IGUuZ2V0SW5kZXgoKTsKLQkJZm9yIChFIGl0ZW0gOiB0aGlzLmdldEl0ZW1zKGUpKSB7Ci0JCQl0aGlzLmxpc3QuYWRkKGkrKywgaXRlbSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJaW50IGJhc2UgPSBlLmdldEluZGV4KCk7Ci0JCWZvciAoaW50IGkgPSBlLmdldEl0ZW1zU2l6ZSgpOyBpLS0gPiAwOyApIHsKLQkJCXRoaXMubGlzdC5yZW1vdmUoYmFzZSArIGkpOyAgLy8gcmVtb3ZlIGZyb20gZW5kCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQlpbnQgaSA9IGUuZ2V0SW5kZXgoKTsKLQkJZm9yIChFIGl0ZW0gOiB0aGlzLmdldE5ld0l0ZW1zKGUpKSB7Ci0JCQl0aGlzLmxpc3Quc2V0KGkrKywgaXRlbSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLmxpc3QsIGUuZ2V0VGFyZ2V0SW5kZXgoKSwgZS5nZXRTb3VyY2VJbmRleCgpLCBlLmdldExlbmd0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCXRoaXMubGlzdC5jbGVhcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMubGlzdC5jbGVhcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMubGlzdCwgdGhpcy5nZXRTb3VyY2UoZSkuaXRlcmF0b3IoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3REYXRhTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgY29udGVudHNDaGFuZ2VkKExpc3REYXRhRXZlbnQgZSkgewotCQl0aGlzLmxpc3QuY2xlYXIoKTsKLQkJTGlzdE1vZGVsIGxtID0gKExpc3RNb2RlbCkgZS5nZXRTb3VyY2UoKTsKLQkJaW50IHNpemUgPSBsbS5nZXRTaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0aGlzLmxpc3QuYWRkKGksIHRoaXMuZ2V0RWxlbWVudEF0KGxtLCBpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnRlcnZhbEFkZGVkKExpc3REYXRhRXZlbnQgZSkgewotCQlMaXN0TW9kZWwgbG0gPSAoTGlzdE1vZGVsKSBlLmdldFNvdXJjZSgpOwotCQlpbnQgc3RhcnQgPSBNYXRoLm1pbihlLmdldEluZGV4MCgpLCBlLmdldEluZGV4MSgpKTsKLQkJaW50IGVuZCA9IE1hdGgubWF4KGUuZ2V0SW5kZXgwKCksIGUuZ2V0SW5kZXgxKCkpOwotCQlmb3IgKGludCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHsKLQkJCXRoaXMubGlzdC5hZGQoaSwgdGhpcy5nZXRFbGVtZW50QXQobG0sIGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGludGVydmFsUmVtb3ZlZChMaXN0RGF0YUV2ZW50IGUpIHsKLQkJaW50IHN0YXJ0ID0gTWF0aC5taW4oZS5nZXRJbmRleDAoKSwgZS5nZXRJbmRleDEoKSk7Ci0JCWludCBlbmQgPSBNYXRoLm1heChlLmdldEluZGV4MCgpLCBlLmdldEluZGV4MSgpKTsKLQkJaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0ICsgMTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbGVuZ3RoOyBpKyspIHsKLQkJCXRoaXMubGlzdC5yZW1vdmUoc3RhcnQpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuZXF1YWxzKG8pOwotCX0KLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuaGFzaENvZGUoKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogbWluaW1pemUgdGhlIHNjb3BlIG9mIHRoZSBzdXBwcmVzc2VkIHdhcm5pbmdzLj0KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEUgZ2V0RWxlbWVudEF0KExpc3RNb2RlbCBsaXN0TW9kZWwsIGludCBpbmRleCkgewotCQlyZXR1cm4gKEUpIGxpc3RNb2RlbC5nZXRFbGVtZW50QXQoaW5kZXgpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBJdGVyYWJsZTxFPiBnZXRJdGVtcyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgSXRlcmFibGU8RT4gZ2V0TmV3SXRlbXMoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXROZXdJdGVtcygpOwotCX0KLQotCS8qKgotCSAqIG1pbmltaXplIHRoZSBzY29wZSBvZiB0aGUgc3VwcHJlc3NlZCB3YXJuaW5ncy49Ci0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFPiBnZXRTb3VyY2UoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoTGlzdFZhbHVlTW9kZWw8RT4pIGV2ZW50LmdldFNvdXJjZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0RvdWJsZU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0RvdWJsZU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTJhYWU4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Eb3VibGVNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Eb3VibGVNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRG91YmxlTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzCi0JZXh0ZW5kcyBEb3VibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cwotewotCXB1YmxpYyBEb3VibGVNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRG91YmxlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgRG91YmxlTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuc3RyaW5nTW9kZWxNb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBnZXREb3VibGVNb2RlbCgpIHsKLQkJcmV0dXJuIChNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4pIHRoaXMuZG91YmxlTW9kZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuc3RyaW5nTW9kZWwuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN0cmluZ01vZGVsLCB0aGlzLnN0cmluZ01vZGVsTW9kZWwuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5kb3VibGVNb2RlbC5nZXRWYWx1ZSgpKTsKLQkJdGhpcy5kb3VibGVNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5kb3VibGVNb2RlbExpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmRvdWJsZU1vZGVsLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuZ2V0RG91YmxlTW9kZWwoKS5zZXRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5zdHJpbmdNb2RlbC5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmRvdWJsZU1vZGVsLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuc3RyaW5nTW9kZWxNb2RlbC5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmRvdWJsZU1vZGVsLmdldFZhbHVlKCkpOwotCQl0aGlzLmdldERvdWJsZU1vZGVsKCkuc2V0VmFsdWUoIlRUVCIpOyAgLy8gTk9QPwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuc3RyaW5nTW9kZWwuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5kb3VibGVNb2RlbC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UzKCkgewotCQl0aGlzLnN0cmluZ01vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuc3RyaW5nTW9kZWxMaXN0ZW5lcik7Ci0JCXRoaXMuc3RyaW5nTW9kZWxNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLnN0cmluZ01vZGVsTW9kZWxMaXN0ZW5lcik7Ci0JCXRoaXMuZG91YmxlTW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5kb3VibGVNb2RlbExpc3RlbmVyKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlNCgpIHsKLQkJdGhpcy5zdHJpbmdNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zdHJpbmdNb2RlbExpc3RlbmVyKTsKLQkJdGhpcy5zdHJpbmdNb2RlbE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN0cmluZ01vZGVsTW9kZWxMaXN0ZW5lcik7Ci0JCXRoaXMuZG91YmxlTW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZG91YmxlTW9kZWxMaXN0ZW5lcik7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzMigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlczIoKSB7Ci0JCXRoaXMuc3RyaW5nTW9kZWxFdmVudCA9IG51bGw7Ci0JCXRoaXMuc3RyaW5nTW9kZWxNb2RlbEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5kb3VibGVNb2RlbEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5nZXREb3VibGVNb2RlbCgpLnNldFZhbHVlKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnN0cmluZ01vZGVsRXZlbnQsIHRoaXMuc3RyaW5nTW9kZWwsICJmb28iLCAiYmFyIik7Ci0JCWFzc2VydE51bGwodGhpcy5zdHJpbmdNb2RlbE1vZGVsRXZlbnQpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZG91YmxlTW9kZWxFdmVudCwgdGhpcy5kb3VibGVNb2RlbCwgImZvbyIsICJiYXIiKTsKLQotCQl0aGlzLnN0cmluZ01vZGVsRXZlbnQgPSBudWxsOwotCQl0aGlzLnN0cmluZ01vZGVsTW9kZWxFdmVudCA9IG51bGw7Ci0JCXRoaXMuZG91YmxlTW9kZWxFdmVudCA9IG51bGw7Ci0JCXRoaXMuZ2V0RG91YmxlTW9kZWwoKS5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnN0cmluZ01vZGVsRXZlbnQsIHRoaXMuc3RyaW5nTW9kZWwsICJiYXIiLCBudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnN0cmluZ01vZGVsTW9kZWxFdmVudCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5kb3VibGVNb2RlbEV2ZW50LCB0aGlzLmRvdWJsZU1vZGVsLCAiYmFyIiwgbnVsbCk7Ci0KLQkJdGhpcy5zdHJpbmdNb2RlbEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zdHJpbmdNb2RlbE1vZGVsRXZlbnQgPSBudWxsOwotCQl0aGlzLmRvdWJsZU1vZGVsRXZlbnQgPSBudWxsOwotCQl0aGlzLmdldERvdWJsZU1vZGVsKCkuc2V0VmFsdWUoImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuc3RyaW5nTW9kZWxFdmVudCwgdGhpcy5zdHJpbmdNb2RlbCwgbnVsbCwgImZvbyIpOwotCQlhc3NlcnROdWxsKHRoaXMuc3RyaW5nTW9kZWxNb2RlbEV2ZW50KTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmRvdWJsZU1vZGVsRXZlbnQsIHRoaXMuZG91YmxlTW9kZWwsIG51bGwsICJmb28iKTsKLQotCQl0aGlzLnN0cmluZ01vZGVsRXZlbnQgPSBudWxsOwotCQl0aGlzLnN0cmluZ01vZGVsTW9kZWxFdmVudCA9IG51bGw7Ci0JCXRoaXMuZG91YmxlTW9kZWxFdmVudCA9IG51bGw7Ci0JCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBzdHJpbmdNb2RlbDIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oIlRUVCIpOwotCQl0aGlzLnN0cmluZ01vZGVsTW9kZWwuc2V0VmFsdWUoc3RyaW5nTW9kZWwyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnN0cmluZ01vZGVsRXZlbnQpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuc3RyaW5nTW9kZWxNb2RlbEV2ZW50LCB0aGlzLnN0cmluZ01vZGVsTW9kZWwsIHRoaXMuc3RyaW5nTW9kZWwsIHN0cmluZ01vZGVsMik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5kb3VibGVNb2RlbEV2ZW50LCB0aGlzLmRvdWJsZU1vZGVsLCAiZm9vIiwgIlRUVCIpOwotCi0JCXRoaXMuc3RyaW5nTW9kZWxFdmVudCA9IG51bGw7Ci0JCXRoaXMuc3RyaW5nTW9kZWxNb2RlbEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5kb3VibGVNb2RlbEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5nZXREb3VibGVNb2RlbCgpLnNldFZhbHVlKCJYWFgiKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnN0cmluZ01vZGVsRXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuc3RyaW5nTW9kZWxNb2RlbEV2ZW50KTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmRvdWJsZU1vZGVsRXZlbnQsIHRoaXMuZG91YmxlTW9kZWwsICJUVFQiLCAiWFhYIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5zdHJpbmdNb2RlbC5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJYWFgiLCBzdHJpbmdNb2RlbDIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5zdHJpbmdNb2RlbEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zdHJpbmdNb2RlbE1vZGVsRXZlbnQgPSBudWxsOwotCQl0aGlzLmRvdWJsZU1vZGVsRXZlbnQgPSBudWxsOwotCQl0aGlzLnN0cmluZ01vZGVsTW9kZWwuc2V0VmFsdWUodGhpcy5zdHJpbmdNb2RlbCk7Ci0JCWFzc2VydE51bGwodGhpcy5zdHJpbmdNb2RlbEV2ZW50KTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnN0cmluZ01vZGVsTW9kZWxFdmVudCwgdGhpcy5zdHJpbmdNb2RlbE1vZGVsLCBzdHJpbmdNb2RlbDIsIHRoaXMuc3RyaW5nTW9kZWwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZG91YmxlTW9kZWxFdmVudCwgdGhpcy5kb3VibGVNb2RlbCwgIlhYWCIsICJmb28iKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRG91YmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Eb3VibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWNmNmFlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Eb3VibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Eb3VibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBEb3VibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cwotCWV4dGVuZHMgVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ01vZGVsOwotCXByb3RlY3RlZCBDaGFuZ2VMaXN0ZW5lciBzdHJpbmdNb2RlbExpc3RlbmVyOwotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUV2ZW50IHN0cmluZ01vZGVsRXZlbnQ7Ci0KLQlwcm90ZWN0ZWQgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4+IHN0cmluZ01vZGVsTW9kZWw7Ci0JcHJvdGVjdGVkIENoYW5nZUxpc3RlbmVyIHN0cmluZ01vZGVsTW9kZWxMaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VFdmVudCBzdHJpbmdNb2RlbE1vZGVsRXZlbnQ7Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZG91YmxlTW9kZWw7Ci0JcHJvdGVjdGVkIENoYW5nZUxpc3RlbmVyIGRvdWJsZU1vZGVsTGlzdGVuZXI7Ci0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlRXZlbnQgZG91YmxlTW9kZWxFdmVudDsKLQotCXB1YmxpYyBEb3VibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnN0cmluZ01vZGVsID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCJmb28iKTsKLQkJdGhpcy5zdHJpbmdNb2RlbExpc3RlbmVyID0gbmV3IFN0cmluZ01vZGVsTGlzdGVuZXIoKTsKLQotCQl0aGlzLnN0cmluZ01vZGVsTW9kZWwgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPj4oc3RyaW5nTW9kZWwpOwotCQl0aGlzLnN0cmluZ01vZGVsTW9kZWxMaXN0ZW5lciA9IG5ldyBTdHJpbmdNb2RlbE1vZGVsTGlzdGVuZXIoKTsKLQotCQl0aGlzLmRvdWJsZU1vZGVsID0gdGhpcy5idWlsZERvdWJsZU1vZGVsKCk7Ci0JCXRoaXMuZG91YmxlTW9kZWxMaXN0ZW5lciA9IG5ldyBEb3VibGVNb2RlbExpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRG91YmxlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgRG91YmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5zdHJpbmdNb2RlbE1vZGVsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlMSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLnN0cmluZ01vZGVsLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdHJpbmdNb2RlbCwgdGhpcy5zdHJpbmdNb2RlbE1vZGVsLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZG91YmxlTW9kZWwuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMuZG91YmxlTW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZG91YmxlTW9kZWxMaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5kb3VibGVNb2RlbC5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLnN0cmluZ01vZGVsLnNldFZhbHVlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLnN0cmluZ01vZGVsLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuZG91YmxlTW9kZWwuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5zdHJpbmdNb2RlbC5zZXRWYWx1ZSgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5zdHJpbmdNb2RlbC5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLmRvdWJsZU1vZGVsLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuc3RyaW5nTW9kZWwuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5zdHJpbmdNb2RlbC5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmRvdWJsZU1vZGVsLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuc3RyaW5nTW9kZWwuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuc3RyaW5nTW9kZWwuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5kb3VibGVNb2RlbC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUyKCkgewotCQlhc3NlcnROdWxsKHRoaXMuZG91YmxlTW9kZWwuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMuZG91YmxlTW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZG91YmxlTW9kZWxMaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5kb3VibGVNb2RlbC5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLnN0cmluZ01vZGVsTW9kZWwuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5kb3VibGVNb2RlbC5nZXRWYWx1ZSgpKTsKLQotCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc3RyaW5nTW9kZWwyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCJUVFQiKTsKLQkJdGhpcy5zdHJpbmdNb2RlbE1vZGVsLnNldFZhbHVlKHN0cmluZ01vZGVsMik7Ci0JCWFzc2VydEVxdWFscygiVFRUIiwgdGhpcy5kb3VibGVNb2RlbC5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLnN0cmluZ01vZGVsTW9kZWwuc2V0VmFsdWUodGhpcy5zdHJpbmdNb2RlbCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5kb3VibGVNb2RlbC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuc3RyaW5nTW9kZWwpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLnN0cmluZ01vZGVsTW9kZWwpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMuZG91YmxlTW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5kb3VibGVNb2RlbExpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuc3RyaW5nTW9kZWwpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5zdHJpbmdNb2RlbE1vZGVsKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy5kb3VibGVNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmRvdWJsZU1vZGVsTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5zdHJpbmdNb2RlbCkuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuc3RyaW5nTW9kZWxNb2RlbCkuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLmRvdWJsZU1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmRvdWJsZU1vZGVsTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5zdHJpbmdNb2RlbCkuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMuZG91YmxlTW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZG91YmxlTW9kZWxMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLnN0cmluZ01vZGVsKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMuZG91YmxlTW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZG91YmxlTW9kZWxMaXN0ZW5lcik7Ci0JCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBzdHJpbmdNb2RlbDIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oIlRUVCIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5zdHJpbmdNb2RlbCkuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBzdHJpbmdNb2RlbDIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMuc3RyaW5nTW9kZWxNb2RlbC5zZXRWYWx1ZShzdHJpbmdNb2RlbDIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5zdHJpbmdNb2RlbCkuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHN0cmluZ01vZGVsMikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMuc3RyaW5nTW9kZWxNb2RlbC5zZXRWYWx1ZSh0aGlzLnN0cmluZ01vZGVsKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuc3RyaW5nTW9kZWwpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgc3RyaW5nTW9kZWwyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTEoKSB7Ci0JCXRoaXMuc3RyaW5nTW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5zdHJpbmdNb2RlbExpc3RlbmVyKTsKLQkJdGhpcy5zdHJpbmdNb2RlbE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuc3RyaW5nTW9kZWxNb2RlbExpc3RlbmVyKTsKLQkJdGhpcy5kb3VibGVNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmRvdWJsZU1vZGVsTGlzdGVuZXIpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlczEoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UyKCkgewotCQl0aGlzLnN0cmluZ01vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN0cmluZ01vZGVsTGlzdGVuZXIpOwotCQl0aGlzLnN0cmluZ01vZGVsTW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc3RyaW5nTW9kZWxNb2RlbExpc3RlbmVyKTsKLQkJdGhpcy5kb3VibGVNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5kb3VibGVNb2RlbExpc3RlbmVyKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMxKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2VzMSgpIHsKLQkJdGhpcy5zdHJpbmdNb2RlbEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zdHJpbmdNb2RlbE1vZGVsRXZlbnQgPSBudWxsOwotCQl0aGlzLmRvdWJsZU1vZGVsRXZlbnQgPSBudWxsOwotCQl0aGlzLnN0cmluZ01vZGVsLnNldFZhbHVlKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnN0cmluZ01vZGVsRXZlbnQsIHRoaXMuc3RyaW5nTW9kZWwsICJmb28iLCAiYmFyIik7Ci0JCWFzc2VydE51bGwodGhpcy5zdHJpbmdNb2RlbE1vZGVsRXZlbnQpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZG91YmxlTW9kZWxFdmVudCwgdGhpcy5kb3VibGVNb2RlbCwgImZvbyIsICJiYXIiKTsKLQotCQl0aGlzLnN0cmluZ01vZGVsRXZlbnQgPSBudWxsOwotCQl0aGlzLnN0cmluZ01vZGVsTW9kZWxFdmVudCA9IG51bGw7Ci0JCXRoaXMuZG91YmxlTW9kZWxFdmVudCA9IG51bGw7Ci0JCXRoaXMuc3RyaW5nTW9kZWwuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5zdHJpbmdNb2RlbEV2ZW50LCB0aGlzLnN0cmluZ01vZGVsLCAiYmFyIiwgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5zdHJpbmdNb2RlbE1vZGVsRXZlbnQpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZG91YmxlTW9kZWxFdmVudCwgdGhpcy5kb3VibGVNb2RlbCwgImJhciIsIG51bGwpOwotCi0JCXRoaXMuc3RyaW5nTW9kZWxFdmVudCA9IG51bGw7Ci0JCXRoaXMuc3RyaW5nTW9kZWxNb2RlbEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5kb3VibGVNb2RlbEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zdHJpbmdNb2RlbC5zZXRWYWx1ZSgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5zdHJpbmdNb2RlbEV2ZW50LCB0aGlzLnN0cmluZ01vZGVsLCBudWxsLCAiZm9vIik7Ci0JCWFzc2VydE51bGwodGhpcy5zdHJpbmdNb2RlbE1vZGVsRXZlbnQpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZG91YmxlTW9kZWxFdmVudCwgdGhpcy5kb3VibGVNb2RlbCwgbnVsbCwgImZvbyIpOwotCi0JCXRoaXMuc3RyaW5nTW9kZWxFdmVudCA9IG51bGw7Ci0JCXRoaXMuc3RyaW5nTW9kZWxNb2RlbEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5kb3VibGVNb2RlbEV2ZW50ID0gbnVsbDsKLQkJTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ01vZGVsMiA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigiVFRUIik7Ci0JCXRoaXMuc3RyaW5nTW9kZWxNb2RlbC5zZXRWYWx1ZShzdHJpbmdNb2RlbDIpOwotCQlhc3NlcnROdWxsKHRoaXMuc3RyaW5nTW9kZWxFdmVudCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5zdHJpbmdNb2RlbE1vZGVsRXZlbnQsIHRoaXMuc3RyaW5nTW9kZWxNb2RlbCwgdGhpcy5zdHJpbmdNb2RlbCwgc3RyaW5nTW9kZWwyKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmRvdWJsZU1vZGVsRXZlbnQsIHRoaXMuZG91YmxlTW9kZWwsICJmb28iLCAiVFRUIik7Ci0KLQkJdGhpcy5zdHJpbmdNb2RlbEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zdHJpbmdNb2RlbE1vZGVsRXZlbnQgPSBudWxsOwotCQl0aGlzLmRvdWJsZU1vZGVsRXZlbnQgPSBudWxsOwotCQl0aGlzLnN0cmluZ01vZGVsTW9kZWwuc2V0VmFsdWUodGhpcy5zdHJpbmdNb2RlbCk7Ci0JCWFzc2VydE51bGwodGhpcy5zdHJpbmdNb2RlbEV2ZW50KTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnN0cmluZ01vZGVsTW9kZWxFdmVudCwgdGhpcy5zdHJpbmdNb2RlbE1vZGVsLCBzdHJpbmdNb2RlbDIsIHRoaXMuc3RyaW5nTW9kZWwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZG91YmxlTW9kZWxFdmVudCwgdGhpcy5kb3VibGVNb2RlbCwgIlRUVCIsICJmb28iKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlFdmVudChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50LCBPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZFZhbHVlLCBldmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgU3RyaW5nTW9kZWxMaXN0ZW5lcgotCQlleHRlbmRzIENoYW5nZUFkYXB0ZXIKLQl7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJRG91YmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5zdHJpbmdNb2RlbEV2ZW50ID0gZXZlbnQ7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgU3RyaW5nTW9kZWxNb2RlbExpc3RlbmVyCi0JCWV4dGVuZHMgQ2hhbmdlQWRhcHRlcgotCXsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlEb3VibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLnN0cmluZ01vZGVsTW9kZWxFdmVudCA9IGV2ZW50OwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIERvdWJsZU1vZGVsTGlzdGVuZXIKLQkJZXh0ZW5kcyBDaGFuZ2VBZGFwdGVyCi0JewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCURvdWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZG91YmxlTW9kZWxFdmVudCA9IGV2ZW50OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0V4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9FeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZTFhMjUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0V4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlcjsKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gZXh0ZW5kZWRMaXN0SG9sZGVyOwotCUxpc3RFdmVudCBldmVudDsKLQlTdHJpbmcgZXZlbnRUeXBlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFERCA9ICJhZGQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkUgPSAicmVtb3ZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQTEFDRSA9ICJyZXBsYWNlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9WRSA9ICJtb3ZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVIgPSAiY2xlYXIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0UgPSAiY2hhbmdlIjsKLQotCXB1YmxpYyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubGlzdEhvbGRlciA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRMaXN0KCkpOwotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlciA9IHRoaXMuYnVpbGRFeHRlbmRlZExpc3RIb2xkZXIodGhpcy5saXN0SG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiQSIpOwotCQlyZXN1bHQuYWRkKCJCIik7Ci0JCXJlc3VsdC5hZGQoIkMiKTsKLQkJcmVzdWx0LmFkZCgiRCIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkRXh0ZW5kZWRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gZXh0ZW5kZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWV4dGVuZGVkTGlzdC5hZGRBbGwodGhpcy5idWlsZFByZWZpeCgpKTsKLQkJZXh0ZW5kZWRMaXN0LmFkZEFsbCh0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJZXh0ZW5kZWRMaXN0LmFkZEFsbCh0aGlzLmJ1aWxkU3VmZml4KCkpOwotCQlyZXR1cm4gZXh0ZW5kZWRMaXN0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkUHJlZml4KCkgewotCQlMaXN0PFN0cmluZz4gcHJlZml4ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXByZWZpeC5hZGQoIngiKTsKLQkJcHJlZml4LmFkZCgieSIpOwotCQlwcmVmaXguYWRkKCJ6Iik7Ci0JCXJldHVybiBwcmVmaXg7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRTdWZmaXgoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzdWZmaXggPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJc3VmZml4LmFkZCgiaSIpOwotCQlzdWZmaXguYWRkKCJqIik7Ci0JCXJldHVybiBzdWZmaXg7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRXh0ZW5kZWRMaXN0SG9sZGVyKExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtKSB7Ci0JCXJldHVybiBuZXcgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPih0aGlzLmJ1aWxkUHJlZml4KCksIGx2bSwgdGhpcy5idWlsZFN1ZmZpeCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRFeHRlbmRlZExpc3QoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5leHRlbmRlZExpc3RIb2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRFeHRlbmRlZExpc3QoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRFeHRlbmRlZExpc3QoKS5zaXplKCksIHRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLnNpemUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGV4dGVuZGVkTGlzdENvbnRhaW5zKE9iamVjdCBpdGVtKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5leHRlbmRlZExpc3RIb2xkZXIuaXRlcmF0b3IoKSwgaXRlbSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGV4dGVuZGVkTGlzdENvbnRhaW5zQWxsKENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW1zKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZXh0ZW5kZWRMaXN0Q29udGFpbnNBbnkoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCUxpc3Q8U3RyaW5nPiBleHRlbmRlZExpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5pdGVyYXRvcigpKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGl0ZW1zLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKGV4dGVuZGVkTGlzdC5jb250YWlucyhzdHJlYW0ubmV4dCgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbGlzdENvbnRhaW5zKE9iamVjdCBpdGVtKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBsaXN0Q29udGFpbnNBbGwoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW1zKTsKLQl9Ci0KLS8vCXByaXZhdGUgYm9vbGVhbiBsaXN0Q29udGFpbnNBbnkoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0vLwkJTGlzdDxTdHJpbmc+IGV4dGVuZGVkTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubGlzdEhvbGRlci5pdGVyYXRvcigpKTsKLS8vCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gaXRlbXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0vLwkJCWlmIChleHRlbmRlZExpc3QuY29udGFpbnMoc3RyZWFtLm5leHQoKSkpIHsKLS8vCQkJCXJldHVybiB0cnVlOwotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiBmYWxzZTsKLS8vCX0KLS8vCi0JcHVibGljIHZvaWQgdGVzdEFkZDEoKSB7Ci0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuZXh0ZW5kZWRMaXN0Q29udGFpbnMoIkUiKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoNCwgIkUiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV4dGVuZGVkTGlzdENvbnRhaW5zKCJFIikpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKCJFIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQyKCkgewotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmV4dGVuZGVkTGlzdENvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCg0LCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV4dGVuZGVkTGlzdENvbnRhaW5zKG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRBZGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gYWRkTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlhZGRMaXN0LmFkZCgiRSIpOwotCQlhZGRMaXN0LmFkZCgiRiIpOwotCQlyZXR1cm4gYWRkTGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsMSgpIHsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5leHRlbmRlZExpc3RDb250YWluc0FueSh0aGlzLmJ1aWxkQWRkTGlzdCgpKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRBbGwoNCwgdGhpcy5idWlsZEFkZExpc3QoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5leHRlbmRlZExpc3RDb250YWluc0FsbCh0aGlzLmJ1aWxkQWRkTGlzdCgpKSk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnNBbGwodGhpcy5idWlsZEFkZExpc3QoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUxKCkgewotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuZXh0ZW5kZWRMaXN0Q29udGFpbnMoIkIiKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUodGhpcy5idWlsZExpc3QoKS5pbmRleE9mKCJCIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmV4dGVuZGVkTGlzdENvbnRhaW5zKCJCIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucygiQiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZUdlbmVyaWMoKSB7Ci0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VOYW1lZCgpIHsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0Q2hhbmdlKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDQsICJFIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQURELCA3LCAiRSIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoNSwgbnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQURELCA4LCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDUpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFTU9WRSwgOCwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJdGhpcy52ZXJpZnlFdmVudChSRU1PVkUsIDcsICJFIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZEFsbCgwLCB0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJdGhpcy52ZXJpZnlFdmVudChBREQpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZExpc3QoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QoKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQpLmdldEl0ZW1zKCkpKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuc2V0KDAsICJBQSIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFUExBQ0UpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXROZXdJdGVtcygpLCAiQSIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXROZXdJdGVtcygpLCAiQUEiKSk7Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQUREOwotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudFR5cGUgPSBSRU1PVkU7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gUkVQTEFDRTsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudFR5cGUgPSBNT1ZFOwotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQ0xFQVI7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQ0hBTkdFOwotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFN0cmluZyB0eXBlKSB7Ci0JCWFzc2VydEVxdWFscyh0eXBlLCB0aGlzLmV2ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV4dGVuZGVkTGlzdEhvbGRlciwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudC5nZXRMaXN0TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoU3RyaW5nIHR5cGUsIGludCBpbmRleCwgT2JqZWN0IGl0ZW0pIHsKLQkJdGhpcy52ZXJpZnlFdmVudCh0eXBlKTsKLQkJaWYgKHR5cGUgPT0gQUREKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaW5kZXgsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyhpdGVtLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCX0gZWxzZSBpZiAodHlwZSA9PSBSRU1PVkUpIHsKLQkJCWFzc2VydEVxdWFscyhpbmRleCwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQpLmdldEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGl0ZW0sICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCS8qCi0JCSAqIGFkZGluZyBsaXN0ZW5lcnMgdG8gdGhlIGV4dGVuZGVkIGxpc3Qgd2lsbCBjYXVzZSBsaXN0ZW5lcnMKLQkJICogdG8gYmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgbGlzdDsKLQkJICogbGlrZXdpc2UsIHJlbW92aW5nIGxpc3RlbmVycyBmcm9tIHRoZSBleHRlbmRlZCBsaXN0IHdpbGwKLQkJICogY2F1c2UgbGlzdGVuZXJzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBsaXN0Ci0JCSAqLwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0KLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYwNzg3Zi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGNvbGxlY3Rpb25Ib2xkZXI7Ci0JQ29sbGVjdGlvbkFkZEV2ZW50IGFkZEV2ZW50OwotCUNvbGxlY3Rpb25SZW1vdmVFdmVudCByZW1vdmVFdmVudDsKLQlDb2xsZWN0aW9uQ2xlYXJFdmVudCBjb2xsZWN0aW9uQ2xlYXJlZEV2ZW50OwotCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBjb2xsZWN0aW9uQ2hhbmdlZEV2ZW50OwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlcjsKLQlDb2xsZWN0aW9uQWRkRXZlbnQgZmlsdGVyZWRBZGRFdmVudDsKLQlDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZmlsdGVyZWRSZW1vdmVFdmVudDsKLQlDb2xsZWN0aW9uQ2xlYXJFdmVudCBmaWx0ZXJlZENvbGxlY3Rpb25DbGVhcmVkRXZlbnQ7Ci0JQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGZpbHRlcmVkQ29sbGVjdGlvbkNoYW5nZWRFdmVudDsKLQotCXB1YmxpYyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlciA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KGJ1aWxkQ29sbGVjdGlvbigpKTsKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIgPSBuZXcgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsIHRoaXMuYnVpbGRGaWx0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQljb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCXJldHVybiBjb2xsZWN0aW9uOwotCX0KLQotCXByaXZhdGUgRmlsdGVyPFN0cmluZz4gYnVpbGRGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKCJiIik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJLy8gYWRkIGEgbGlzdGVuZXIgdG8gImFjdGl2YXRlIiB0aGUgd3JhcHBlcgotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmJ1aWxkRmlsdGVyZWRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBjb2xsZWN0aW9uSG9sZGVyVmFsdWUgPSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb2xsZWN0aW9uSG9sZGVyVmFsdWUubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb2xsZWN0aW9uSG9sZGVyVmFsdWUubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCS8vIGFkZCBhIGxpc3RlbmVyIHRvICJhY3RpdmF0ZSIgdGhlIHdyYXBwZXIKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKSk7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IG5ld0NvbGxlY3Rpb24gPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImZveCIpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiYmF6Iik7Ci0JCQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2V0VmFsdWVzKG5ld0NvbGxlY3Rpb24pOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gY29sbGVjdGlvblZhbHVlcyA9IHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZveCIsIGNvbGxlY3Rpb25WYWx1ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBjb2xsZWN0aW9uVmFsdWVzLm5leHQoKSk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gZmlsdGVyZWRDb2xsZWN0aW9uVmFsdWVzID0gdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBmaWx0ZXJlZENvbGxlY3Rpb25WYWx1ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoZmlsdGVyZWRDb2xsZWN0aW9uVmFsdWVzLmhhc05leHQoKSk7Ci0JfQkJCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRGaWx0ZXJlZENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKS5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZTEoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRGaWx0ZXJlZENoYW5nZUxpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25DaGFuZ2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UyKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmJ1aWxkRmlsdGVyZWRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckV2ZW50cygpIHsKLQkJdGhpcy5hZGRFdmVudCA9IG51bGw7Ci0JCXRoaXMucmVtb3ZlRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkQWRkRXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkUmVtb3ZlRXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkNsZWFyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uQ2hhbmdlZEV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29sbGVjdGlvbkNoYW5nZXMoKSB7Ci0JCWNsZWFyRXZlbnRzKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gdGVtcENvbGxlY3Rpb24gPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJdGVtcENvbGxlY3Rpb24uYWRkKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmFkZEV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsIHRlbXBDb2xsZWN0aW9uKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmZpbHRlcmVkQWRkRXZlbnQsIHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLCB0ZW1wQ29sbGVjdGlvbik7Ci0JCQotCQljbGVhckV2ZW50cygpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJdGVtcENvbGxlY3Rpb24ucmVtb3ZlKCJiYXIiKTsKLQkJdGVtcENvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnJlbW92ZUV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsIHRlbXBDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmZpbHRlcmVkUmVtb3ZlRXZlbnQpOwotCi0KLQkJY2xlYXJFdmVudHMoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiYmFyIik7Ci0JCXRlbXBDb2xsZWN0aW9uLmFkZCgiYmFyIik7Ci0JCXRlbXBDb2xsZWN0aW9uLnJlbW92ZSgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5yZW1vdmVFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLCB0ZW1wQ29sbGVjdGlvbik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5maWx0ZXJlZFJlbW92ZUV2ZW50LCB0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlciwgdGVtcENvbGxlY3Rpb24pOwotCi0KLQkJY2xlYXJFdmVudHMoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRlbXBDb2xsZWN0aW9uLnJlbW92ZSgiYmFyIik7Ci0JCXRlbXBDb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5hZGRFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLCB0ZW1wQ29sbGVjdGlvbik7Ci0JCWFzc2VydE51bGwodGhpcy5maWx0ZXJlZEFkZEV2ZW50KTsKLQotCi0JCWNsZWFyRXZlbnRzKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBuZXdDb2xsZWN0aW9uID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJmb3giKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImJheiIpOwotCQkKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNldFZhbHVlcyhuZXdDb2xsZWN0aW9uKTsKLQotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuY29sbGVjdGlvbkNoYW5nZWRFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKTsKLQkJCi0JCXRlbXBDb2xsZWN0aW9uLnJlbW92ZSgiZm9vIik7Ci0JCXRlbXBDb2xsZWN0aW9uLmFkZCgiYmF6Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5maWx0ZXJlZENvbGxlY3Rpb25DaGFuZ2VkRXZlbnQsIHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQkJCi0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmFkZEV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5yZW1vdmVFdmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmNvbGxlY3Rpb25DbGVhcmVkRXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuY29sbGVjdGlvbkNoYW5nZWRFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYWRkRXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMucmVtb3ZlRXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmNvbGxlY3Rpb25DbGVhcmVkRXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZEZpbHRlcmVkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5maWx0ZXJlZEFkZEV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5maWx0ZXJlZFJlbW92ZUV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uQ2xlYXJlZEV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkNoYW5nZWRFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZEZpbHRlcmVkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5maWx0ZXJlZEFkZEV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmZpbHRlcmVkUmVtb3ZlRXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkNsZWFyZWRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkNoYW5nZWRFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCwgT2JqZWN0IHNvdXJjZSkgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQsIE9iamVjdCBzb3VyY2UsIE9iamVjdCBpdGVtcykgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoaXRlbXMsIENvbGxlY3Rpb25Ub29scy52ZWN0b3IoZXZlbnQuZ2V0SXRlbXMoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQsIE9iamVjdCBzb3VyY2UsIE9iamVjdCBpdGVtcykgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoaXRlbXMsIENvbGxlY3Rpb25Ub29scy52ZWN0b3IoZXZlbnQuZ2V0SXRlbXMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGaWx0ZXJlZEl0ZW0oKSB7Ci0JCS8vIGJ1aWxkIGNvbGxlY3Rpb24gd2l0aCBUZXN0SXRlbXMKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8VGVzdEl0ZW0+IHRpSG9sZGVyID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFRlc3RJdGVtPih0aGlzLmJ1aWxkQ29sbGVjdGlvbjIoKSk7Ci0JCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFRlc3RJdGVtPiBmaWx0ZXJlZFRJSG9sZGVyID0gbmV3IEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFRlc3RJdGVtPih0aUhvbGRlciwgdGhpcy5idWlsZEZpbHRlcjIoKSk7Ci0JCS8vIGFkZCBhIGxpc3RlbmVyIHRvICJhY3RpdmF0ZSIgdGhlIHdyYXBwZXIKLQkJZmlsdGVyZWRUSUhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmJ1aWxkRmlsdGVyZWRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgZmlsdGVyZWRUSUhvbGRlci5zaXplKCkpOwotCi0JCXRpSG9sZGVyLmFkZChuZXcgVGVzdEl0ZW0oImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZpbHRlcmVkVElIb2xkZXIuc2l6ZSgpKTsKLQotCQlUZXN0SXRlbSBiYXogPSBuZXcgVGVzdEl0ZW0oImJheiIpOwotCQl0aUhvbGRlci5hZGQoYmF6KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZpbHRlcmVkVElIb2xkZXIuc2l6ZSgpKTsKLQkJLy8gYmVmb3JlIHJlbW92aW5nIGl0LCBjaGFuZ2UgdGhlIGl0ZW0gc28gdGhhdCBpdCBpcyBmaWx0ZXJlZAotCQliYXoubmFtZSA9ICJqYXoiOwotCQl0aUhvbGRlci5yZW1vdmUoYmF6KTsKLQkJLy8gdGhpcyB3b3VsZCBmYWlsIGJlY2F1c2UgdGhlIGl0ZW0gd2FzIG5vdCByZW1vdmVkIGZyb20KLQkJLy8gdGhlIGZpbHRlcmVkIGNvbGxlY3Rpb24gY2FjaGUuLi4gYnV0IHdlJ3ZlIGZpeGVkIGl0IG5vdwotCQlhc3NlcnRFcXVhbHMoMSwgZmlsdGVyZWRUSUhvbGRlci5zaXplKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxUZXN0SXRlbT4gYnVpbGRDb2xsZWN0aW9uMigpIHsKLQkJQ29sbGVjdGlvbjxUZXN0SXRlbT4gY29sbGVjdGlvbiA9IG5ldyBWZWN0b3I8VGVzdEl0ZW0+KCk7Ci0JCWNvbGxlY3Rpb24uYWRkKG5ldyBUZXN0SXRlbSgiZm9vIikpOwotCQlyZXR1cm4gY29sbGVjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxUZXN0SXRlbT4gYnVpbGRGaWx0ZXIyKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcjxUZXN0SXRlbT4oKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoVGVzdEl0ZW0gdGkpIHsKLQkJCQlyZXR1cm4gdGkubmFtZS5zdGFydHNXaXRoKCJiIik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRlc3RJdGVtIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgVGVzdEl0ZW0gewotCQlTdHJpbmcgbmFtZTsKLQkJVGVzdEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjJmNGYwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gb2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBmaWx0ZXJlZE9iamVjdEhvbGRlcjsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGZpbHRlcmVkRXZlbnQ7Ci0KLQlwdWJsaWMgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oImZvbyIpOwotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyID0gbmV3IEZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5vYmplY3RIb2xkZXIsIHRoaXMuYnVpbGRGaWx0ZXIoKSwgdGhpcy5idWlsZFNldEZpbHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIChzICE9IG51bGwpICYmIHMuc3RhcnRzV2l0aCgiYiIpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgRmlsdGVyPFN0cmluZz4gYnVpbGRTZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gKHMgIT0gbnVsbCkgJiYgcy5zdGFydHNXaXRoKCJiIik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHsKLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdGVuaW5nKCkgewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UxKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMigpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlcygpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImZvbyIsICJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmZpbHRlcmVkRXZlbnQsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIsIG51bGwsICJiYXIiKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJheiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiYmFyIiwgImJheiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZmlsdGVyZWRFdmVudCwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlciwgImJhciIsICJiYXoiKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiYmF6IiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZmlsdGVyZWRFdmVudCwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlciwgImJheiIsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiZm9wIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJmb28iLCAiZm9wIik7Ci0JCWFzc2VydE51bGwodGhpcy5maWx0ZXJlZEV2ZW50KTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJmb3AiLCBudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmZpbHRlcmVkRXZlbnQpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsIG51bGwsICJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmZpbHRlcmVkRXZlbnQsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIsIG51bGwsICJiYXIiKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmZpbHRlcmVkRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUsIE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZGU5ZmMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZy5EaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEp1bmsgZm9vOwotCXByaXZhdGUgSnVuayBiYXI7Ci0JcHJpdmF0ZSBKdW5rIGJhejsKLQlwcml2YXRlIEp1bmsgam9vOwotCXByaXZhdGUgSnVuayBqYXI7Ci0JcHJpdmF0ZSBKdW5rIGphejsKLQotCXByaXZhdGUgSnVuayB0b207Ci0JcHJpdmF0ZSBKdW5rIGRpY2s7Ci0JcHJpdmF0ZSBKdW5rIGhhcnJ5OwotCi0JcHVibGljIEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5mb28gPSBuZXcgSnVuaygiZm9vIik7Ci0JCXRoaXMuYmFyID0gbmV3IEp1bmsoImJhciIpOwotCQl0aGlzLmJheiA9IG5ldyBKdW5rKCJiYXoiKTsKLQkJdGhpcy5qb28gPSBuZXcgSnVuaygiam9vIik7Ci0JCXRoaXMuamFyID0gbmV3IEp1bmsoImphciIpOwotCQl0aGlzLmpheiA9IG5ldyBKdW5rKCJqYXoiKTsKLQotCQl0aGlzLnRvbSA9IG5ldyBKdW5rKCJ0b20iKTsKLQkJdGhpcy5kaWNrID0gbmV3IEp1bmsoImRpY2siKTsKLQkJdGhpcy5oYXJyeSA9IG5ldyBKdW5rKCJoYXJyeSIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvblN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gY29sbGVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGNvbGxlY3Rpb25Ib2xkZXIsIEp1bmsuU1RVRkZfQ09MTEVDVElPTik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy50b20pOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmRpY2spOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5mb28pOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmphcik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIEp1bmsuU1RVRkZfQ09MTEVDVElPTik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5hZGQoNiwgdGhpcy50b20pOwotCQlsaXN0SG9sZGVyLmFkZCg3LCB0aGlzLmRpY2spOwotCQlsaXN0SG9sZGVyLmFkZCg4LCB0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmUoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwsIExpc3Q8SnVuaz4gbGlzdCkgewotCQlhc3NlcnRFcXVhbHMobGlzdFZhbHVlTW9kZWwuc2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5nZXQoaSksIGxpc3QuZ2V0KGkpKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgSnVuay5TVFVGRl9DT0xMRUNUSU9OKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmZvby5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQlhc3NlcnRUcnVlKHRoaXMuamF6Lmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQotCQlsaXN0VmFsdWVNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgSnVuay5TVFVGRl9DT0xMRUNUSU9OKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0VmFsdWVNb2RlbC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEp1bms+KG5ldyBJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgbGlzdFZhbHVlTW9kZWwuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBzeW5jaExpc3QuZ2V0KDApKTsKLQkJdGhpcy5iYXIucmVtb3ZlU3R1ZmYoImJhciIpOwotCQl0aGlzLmJhci5hZGRTdHVmZigienp6Iik7Ci0JCXRoaXMuYmFyLmFkZFN0dWZmKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoNSkpOwotCQl0aGlzLmJhci5yZW1vdmVTdHVmZigienp6Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIGxpc3RWYWx1ZU1vZGVsKS5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIGxpc3RWYWx1ZU1vZGVsKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBidWlsZENvbGxlY3Rpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4odGhpcy5idWlsZENvbGxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPEp1bms+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQmFnPEp1bms+IGJhZyA9IG5ldyBIYXNoQmFnPEp1bms+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGJhZyk7Ci0JCXJldHVybiBiYWc7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4odGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PEp1bms+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxKdW5rPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxKdW5rPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uPEp1bms+IGMpIHsKLQkJYy5hZGQodGhpcy5mb28pOwotCQljLmFkZCh0aGlzLmJhcik7Ci0JCWMuYWRkKHRoaXMuYmF6KTsKLQkJYy5hZGQodGhpcy5qb28pOwotCQljLmFkZCh0aGlzLmphcik7Ci0JCWMuYWRkKHRoaXMuamF6KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSnVuayBjbGFzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIEp1bmsgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgRGlzcGxheWFibGUsIENvbXBhcmFibGU8SnVuaz4gewotCQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBzdHVmZjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUVUZGX0NPTExFQ1RJT04gPSAic3R1ZmYiOwotCQkJCi0JCi0JCXB1YmxpYyBKdW5rKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMuc3R1ZmYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXRoaXMuc3R1ZmYuYWRkKHN0dWZmSXRlbSk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgYWRkU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKHN0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfQ09MTEVDVElPTik7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVN0dWZmKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKHN0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfQ09MTEVDVElPTik7Ci0JCX0KLQkKLQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIHRvU3RyaW5nKCk7Ci0JCX0KLQkKLQkJcHVibGljIEljb24gaWNvbigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGludCBjb21wYXJlVG8oSnVuayBvKSB7Ci0JCQlyZXR1cm4gdGhpcy5kaXNwbGF5U3RyaW5nKCkuY29tcGFyZVRvKG8uZGlzcGxheVN0cmluZygpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLnN0dWZmICsgIikiOwotCQl9Ci0JCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU2NmVjZS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLkRpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgSnVuayBmb287Ci0JcHJpdmF0ZSBKdW5rIGJhcjsKLQlwcml2YXRlIEp1bmsgYmF6OwotCXByaXZhdGUgSnVuayBqb287Ci0JcHJpdmF0ZSBKdW5rIGphcjsKLQlwcml2YXRlIEp1bmsgamF6OwotCi0JcHJpdmF0ZSBKdW5rIHRvbTsKLQlwcml2YXRlIEp1bmsgZGljazsKLQlwcml2YXRlIEp1bmsgaGFycnk7Ci0KLQlwdWJsaWMgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmZvbyA9IG5ldyBKdW5rKCJmb28iKTsKLQkJdGhpcy5iYXIgPSBuZXcgSnVuaygiYmFyIik7Ci0JCXRoaXMuYmF6ID0gbmV3IEp1bmsoImJheiIpOwotCQl0aGlzLmpvbyA9IG5ldyBKdW5rKCJqb28iKTsKLQkJdGhpcy5qYXIgPSBuZXcgSnVuaygiamFyIik7Ci0JCXRoaXMuamF6ID0gbmV3IEp1bmsoImpheiIpOwotCi0JCXRoaXMudG9tID0gbmV3IEp1bmsoInRvbSIpOwotCQl0aGlzLmRpY2sgPSBuZXcgSnVuaygiZGljayIpOwotCQl0aGlzLmhhcnJ5ID0gbmV3IEp1bmsoImhhcnJ5Iik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBjb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4oY29sbGVjdGlvbkhvbGRlciwgSnVuay5TVFVGRl9MSVNUKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLnRvbSk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuZGljayk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmZvbyk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuamFyKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgSnVuay5TVFVGRl9MSVNUKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLmFkZCg2LCB0aGlzLnRvbSk7Ci0JCWxpc3RIb2xkZXIuYWRkKDcsIHRoaXMuZGljayk7Ci0JCWxpc3RIb2xkZXIuYWRkKDgsIHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLnJlbW92ZSg4KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZShMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCwgTGlzdDxKdW5rPiBsaXN0KSB7Ci0JCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5zaXplKCksIGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0VmFsdWVNb2RlbC5zaXplKCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKGxpc3RWYWx1ZU1vZGVsLmdldChpKSwgbGlzdC5nZXQoaSkpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBKdW5rLlNUVUZGX0xJU1QpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qYXouaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCi0JCWxpc3RWYWx1ZU1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgc3luY2hMaXN0KTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBKdW5rLlNUVUZGX0xJU1QpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3RWYWx1ZU1vZGVsLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8SnVuaz4obmV3IEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIEp1bmsuU1RVRkZfTElTVCkpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoMCkpOwotCQl0aGlzLmJhci5yZW1vdmVTdHVmZigiYmFyIik7Ci0JCXRoaXMuYmFyLmFkZFN0dWZmKCJ6enoiKTsKLQkJdGhpcy5iYXIuYWRkU3R1ZmYoImJhciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIGxpc3RWYWx1ZU1vZGVsLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgc3luY2hMaXN0LmdldCg1KSk7Ci0JCXRoaXMuYmFyLnJlbW92ZVN0dWZmKCJ6enoiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+IGJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248SnVuaz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlCYWc8SnVuaz4gYmFnID0gbmV3IEhhc2hCYWc8SnVuaz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24oYmFnKTsKLQkJcmV0dXJuIGJhZzsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8SnVuaz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PEp1bms+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEp1bms+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb248SnVuaz4gYykgewotCQljLmFkZCh0aGlzLmZvbyk7Ci0JCWMuYWRkKHRoaXMuYmFyKTsKLQkJYy5hZGQodGhpcy5iYXopOwotCQljLmFkZCh0aGlzLmpvbyk7Ci0JCWMuYWRkKHRoaXMuamFyKTsKLQkJYy5hZGQodGhpcy5qYXopOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKdW5rIGNsYXNzICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgSnVuayBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBEaXNwbGF5YWJsZSwgQ29tcGFyYWJsZTxKdW5rPiB7Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN0dWZmOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RVRkZfTElTVCA9ICJzdHVmZiI7Ci0JCQkKLQkKLQkJcHVibGljIEp1bmsoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5zdHVmZiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJdGhpcy5zdHVmZi5hZGQoc3R1ZmZJdGVtKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRTdHVmZihTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQl0aGlzLnN0dWZmLmFkZChzdHVmZkl0ZW0pOwotCQkJZmlyZUl0ZW1BZGRlZChTVFVGRl9MSVNULCB0aGlzLnN0dWZmLmluZGV4T2Yoc3R1ZmZJdGVtKSwgc3R1ZmZJdGVtKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJaW50IGluZGV4ID0gdGhpcy5zdHVmZi5pbmRleE9mKHN0dWZmSXRlbSk7Ci0JCQl0aGlzLnN0dWZmLnJlbW92ZShzdHVmZkl0ZW0pOwotCQkJZmlyZUl0ZW1SZW1vdmVkKFNUVUZGX0xJU1QsIGluZGV4LCBzdHVmZkl0ZW0pOwotCQl9Ci0JCi0JCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiB0b1N0cmluZygpOwotCQl9Ci0JCi0JCXB1YmxpYyBJY29uIGljb24oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKEp1bmsgbykgewotCQkJcmV0dXJuIHRoaXMuZGlzcGxheVN0cmluZygpLmNvbXBhcmVUbyhvLmRpc3BsYXlTdHJpbmcoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiSnVuaygiICsgdGhpcy5zdHVmZiArICIpIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVmY2UyYS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZy5EaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBKdW5rIGZvbzsKLQlwcml2YXRlIEp1bmsgYmFyOwotCXByaXZhdGUgSnVuayBiYXo7Ci0JcHJpdmF0ZSBKdW5rIGpvbzsKLQlwcml2YXRlIEp1bmsgamFyOwotCXByaXZhdGUgSnVuayBqYXo7Ci0KLQlwcml2YXRlIEp1bmsgdG9tOwotCXByaXZhdGUgSnVuayBkaWNrOwotCXByaXZhdGUgSnVuayBoYXJyeTsKLQotCXB1YmxpYyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmZvbyA9IG5ldyBKdW5rKCJ0aGlzLmZvbyIpOwotCQl0aGlzLmJhciA9IG5ldyBKdW5rKCJ0aGlzLmJhciIpOwotCQl0aGlzLmJheiA9IG5ldyBKdW5rKCJ0aGlzLmJheiIpOwotCQl0aGlzLmpvbyA9IG5ldyBKdW5rKCJ0aGlzLmpvbyIpOwotCQl0aGlzLmphciA9IG5ldyBKdW5rKCJ0aGlzLmphciIpOwotCQl0aGlzLmpheiA9IG5ldyBKdW5rKCJ0aGlzLmpheiIpOwotCi0JCXRoaXMudG9tID0gbmV3IEp1bmsoInRoaXMudG9tIik7Ci0JCXRoaXMuZGljayA9IG5ldyBKdW5rKCJ0aGlzLmRpY2siKTsKLQkJdGhpcy5oYXJyeSA9IG5ldyBKdW5rKCJ0aGlzLmhhcnJ5Iik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBjb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGNvbGxlY3Rpb25Ib2xkZXIsIERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLnRvbSk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuZGljayk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmZvbyk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuamFyKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuc2V0VmFsdWVzKHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5hZGQoNiwgdGhpcy50b20pOwotCQlsaXN0SG9sZGVyLmFkZCg3LCB0aGlzLmRpY2spOwotCQlsaXN0SG9sZGVyLmFkZCg4LCB0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJLy8gdGVzdCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBleGNlcHRpb24KLQkJbGlzdEhvbGRlci5zZXRMaXN0VmFsdWVzKHRoaXMuYnVpbGRMaXN0KCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZShMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCwgTGlzdDxKdW5rPiBsaXN0KSB7Ci0JCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5zaXplKCksIGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0VmFsdWVNb2RlbC5zaXplKCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKGxpc3RWYWx1ZU1vZGVsLmdldChpKSwgbGlzdC5nZXQoaSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25Tb3J0KCkgewotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25Tb3J0KG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U29ydCgpIHsKLQkJdGhpcy52ZXJpZnlMaXN0U29ydChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQ29sbGVjdGlvblNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvblNvcnQodGhpcy5idWlsZEN1c3RvbUNvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbUxpc3RTb3J0KCkgewotCQl0aGlzLnZlcmlmeUxpc3RTb3J0KHRoaXMuYnVpbGRDdXN0b21Db21wYXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxKdW5rPiBidWlsZEN1c3RvbUNvbXBhcmF0b3IoKSB7Ci0JCS8vIHNvcnQgd2l0aCByZXZlcnNlIG9yZGVyCi0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxKdW5rPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShKdW5rIG8xLCBKdW5rIG8yKSB7Ci0JCQkJcmV0dXJuIG8yLmRpc3BsYXlTdHJpbmcoKS5jb21wYXJlVG8obzEuZGlzcGxheVN0cmluZygpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29sbGVjdGlvblNvcnQoQ29tcGFyYXRvcjxKdW5rPiBjb21wYXJhdG9yKSB7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+IGNvbGxlY3Rpb25Ib2xkZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihjb2xsZWN0aW9uSG9sZGVyLCBjb21wYXJhdG9yKSwgRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLnRvbSk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuZGljayk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5mb28pOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmphcik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5zZXRWYWx1ZXModGhpcy5idWlsZENvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdFNvcnQoQ29tcGFyYXRvcjxKdW5rPiBjb21wYXJhdG9yKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxKdW5rPihsaXN0SG9sZGVyLCBjb21wYXJhdG9yKSwgRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQlsaXN0SG9sZGVyLmFkZCgwLCB0aGlzLnRvbSk7Ci0JCWxpc3RIb2xkZXIuYWRkKDAsIHRoaXMuZGljayk7Ci0JCWxpc3RIb2xkZXIuYWRkKDAsIHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSgwKTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoNSk7Ci0JCWFzc2VydEVxdWFscyg1LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQlsaXN0SG9sZGVyLnNldExpc3RWYWx1ZXModGhpcy5idWlsZExpc3QoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZVNvcnQoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwsIExpc3Q8SnVuaz4gbGlzdCwgQ29tcGFyYXRvcjxKdW5rPiBjb21wYXJhdG9yKSB7Ci0JCVNvcnRlZFNldDxKdW5rPiBzcyA9IG5ldyBUcmVlU2V0PEp1bms+KGNvbXBhcmF0b3IpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RWYWx1ZU1vZGVsLnNpemUoKTsgaSsrKSB7Ci0JCQlzcy5hZGQobGlzdFZhbHVlTW9kZWwuZ2V0KGkpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoc3Muc2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3I8SnVuaz4gc3RyZWFtMSA9IHNzLml0ZXJhdG9yKCksIHN0cmVhbTIgPSBsaXN0Lml0ZXJhdG9yKCk7IHN0cmVhbTEuaGFzTmV4dCgpOyApIHsKLQkJCWFzc2VydEVxdWFscyhzdHJlYW0xLm5leHQoKSwgc3RyZWFtMi5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEp1bms+KGxpc3RIb2xkZXIpLCBEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5mb28uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuamF6Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qYXouaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJbGlzdFZhbHVlTW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBzeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxKdW5rPihsaXN0SG9sZGVyKSwgRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3RWYWx1ZU1vZGVsLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8SnVuaz4obmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoMCkpOwotCQl0aGlzLmJhci5zZXROYW1lKCJ6enoiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoNSkpOwotCQl0aGlzLmJhci5zZXROYW1lKCJ0aGlzLmJhciIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBsaXN0VmFsdWVNb2RlbCkuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBsaXN0VmFsdWVNb2RlbCkuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+KHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxKdW5rPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUJhZzxKdW5rPiBiYWcgPSBuZXcgSGFzaEJhZzxKdW5rPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihiYWcpOwotCQlyZXR1cm4gYmFnOwotCX0KLQotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+KHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxKdW5rPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8SnVuaz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SnVuaz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24obGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxKdW5rPiBjKSB7Ci0JCWMuYWRkKHRoaXMuZm9vKTsKLQkJYy5hZGQodGhpcy5iYXIpOwotCQljLmFkZCh0aGlzLmJheik7Ci0JCWMuYWRkKHRoaXMuam9vKTsKLQkJYy5hZGQodGhpcy5qYXIpOwotCQljLmFkZCh0aGlzLmpheik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEp1bmsgY2xhc3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBKdW5rIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIERpc3BsYXlhYmxlLCBDb21wYXJhYmxlPEp1bms+IHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHVibGljIEp1bmsoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgSWNvbiBpY29uKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkJcHVibGljIGludCBjb21wYXJlVG8oSnVuayBvKSB7Ci0JCQlyZXR1cm4gdGhpcy5kaXNwbGF5U3RyaW5nKCkuY29tcGFyZVRvKG8uZGlzcGxheVN0cmluZygpKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiSnVuaygiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODczMDczLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBKdW5rIGZvbzsKLQlwcml2YXRlIEp1bmsgYmFyOwotCXByaXZhdGUgSnVuayBiYXo7Ci0JcHJpdmF0ZSBKdW5rIGpvbzsKLQlwcml2YXRlIEp1bmsgamFyOwotCXByaXZhdGUgSnVuayBqYXo7Ci0KLQlwcml2YXRlIEp1bmsgdG9tOwotCXByaXZhdGUgSnVuayBkaWNrOwotCXByaXZhdGUgSnVuayBoYXJyeTsKLQotCXB1YmxpYyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmZvbyA9IG5ldyBKdW5rKCJ0aGlzLmZvbyIpOwotCQl0aGlzLmJhciA9IG5ldyBKdW5rKCJ0aGlzLmJhciIpOwotCQl0aGlzLmJheiA9IG5ldyBKdW5rKCJ0aGlzLmJheiIpOwotCQl0aGlzLmpvbyA9IG5ldyBKdW5rKCJ0aGlzLmpvbyIpOwotCQl0aGlzLmphciA9IG5ldyBKdW5rKCJ0aGlzLmphciIpOwotCQl0aGlzLmpheiA9IG5ldyBKdW5rKCJ0aGlzLmpheiIpOwotCi0JCXRoaXMudG9tID0gbmV3IEp1bmsoInRoaXMudG9tIik7Ci0JCXRoaXMuZGljayA9IG5ldyBKdW5rKCJ0aGlzLmRpY2siKTsKLQkJdGhpcy5oYXJyeSA9IG5ldyBKdW5rKCJ0aGlzLmhhcnJ5Iik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBjb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGNvbGxlY3Rpb25Ib2xkZXIpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMudG9tKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5kaWNrKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuZm9vKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5qYXIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5hZGQoNiwgdGhpcy50b20pOwotCQlsaXN0SG9sZGVyLmFkZCg3LCB0aGlzLmRpY2spOwotCQlsaXN0SG9sZGVyLmFkZCg4LCB0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmUoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwsIExpc3Q8SnVuaz4gbGlzdCkgewotCQlhc3NlcnRFcXVhbHMobGlzdFZhbHVlTW9kZWwuc2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5nZXQoaSksIGxpc3QuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU29ydCgpIHsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uU29ydChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5TGlzdFNvcnQobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbUNvbGxlY3Rpb25Tb3J0KCkgewotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25Tb3J0KHRoaXMuYnVpbGRDdXN0b21Db21wYXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdXN0b21MaXN0U29ydCgpIHsKLQkJdGhpcy52ZXJpZnlMaXN0U29ydCh0aGlzLmJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8SnVuaz4gYnVpbGRDdXN0b21Db21wYXJhdG9yKCkgewotCQkvLyBzb3J0IHdpdGggcmV2ZXJzZSBvcmRlcgotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8SnVuaz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoSnVuayBvMSwgSnVuayBvMikgewotCQkJCXJldHVybiBvMi5jb21wYXJlVG8obzEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb2xsZWN0aW9uU29ydChDb21wYXJhdG9yPEp1bms+IGNvbXBhcmF0b3IpIHsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gY29sbGVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGNvbGxlY3Rpb25Ib2xkZXIsIGNvbXBhcmF0b3IpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy50b20pOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmRpY2spOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuZm9vKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5qYXIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0U29ydChDb21wYXJhdG9yPEp1bms+IGNvbXBhcmF0b3IpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEp1bms+KGxpc3RIb2xkZXIsIGNvbXBhcmF0b3IpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJbGlzdEhvbGRlci5hZGQoMCwgdGhpcy50b20pOwotCQlsaXN0SG9sZGVyLmFkZCgwLCB0aGlzLmRpY2spOwotCQlsaXN0SG9sZGVyLmFkZCgwLCB0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWxpc3RIb2xkZXIucmVtb3ZlKDgpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDUpOwotCQlhc3NlcnRFcXVhbHMoNSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmVTb3J0KExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsLCBMaXN0PEp1bms+IGxpc3QsIENvbXBhcmF0b3I8SnVuaz4gY29tcGFyYXRvcikgewotCQlTb3J0ZWRTZXQ8SnVuaz4gc3MgPSBuZXcgVHJlZVNldDxKdW5rPihjb21wYXJhdG9yKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0VmFsdWVNb2RlbC5zaXplKCk7IGkrKykgewotCQkJc3MuYWRkKGxpc3RWYWx1ZU1vZGVsLmdldChpKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHNzLnNpemUoKSwgbGlzdC5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yPEp1bms+IHN0cmVhbTEgPSBzcy5pdGVyYXRvcigpLCBzdHJlYW0yID0gbGlzdC5pdGVyYXRvcigpOyBzdHJlYW0xLmhhc05leHQoKTsgKSB7Ci0JCQlhc3NlcnRFcXVhbHMoc3RyZWFtMS5uZXh0KCksIHN0cmVhbTIubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxKdW5rPihsaXN0SG9sZGVyKSk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJbGlzdFZhbHVlTW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBzeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxKdW5rPihsaXN0SG9sZGVyKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxKdW5rPihuZXcgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgbGlzdFZhbHVlTW9kZWwuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBzeW5jaExpc3QuZ2V0KDApKTsKLQkJdGhpcy5iYXIuc2V0TmFtZSgienp6Iik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgbGlzdFZhbHVlTW9kZWwuZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBzeW5jaExpc3QuZ2V0KDUpKTsKLQkJdGhpcy5iYXIuc2V0TmFtZSgidGhpcy5iYXIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+IGJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248SnVuaz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlCYWc8SnVuaz4gYmFnID0gbmV3IEhhc2hCYWc8SnVuaz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24oYmFnKTsKLQkJcmV0dXJuIGJhZzsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8SnVuaz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PEp1bms+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEp1bms+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb248SnVuaz4gYykgewotCQljLmFkZCh0aGlzLmZvbyk7Ci0JCWMuYWRkKHRoaXMuYmFyKTsKLQkJYy5hZGQodGhpcy5iYXopOwotCQljLmFkZCh0aGlzLmpvbyk7Ci0JCWMuYWRkKHRoaXMuamFyKTsKLQkJYy5hZGQodGhpcy5qYXopOwotCX0KLQotCS8vICoqKioqKioqKiogSnVuayBjbGFzcyAqKioqKioqKioqCi0JcHJpdmF0ZSBjbGFzcyBKdW5rIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIENvbXBhcmFibGU8SnVuaz4gewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwdWJsaWMgSnVuayhTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQkJcHVibGljIGludCBjb21wYXJlVG8oSnVuayBqKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lLmNvbXBhcmVUbyhqLm5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLm5hbWUgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9KcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSnB0VXRpbGl0eU1vZGVsVmFsdWVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjI1NmI0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9KcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzLkpwdFV0aWxpdHlNb2RlbFZhbHVlUHJlZnNUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuSnB0VXRpbGl0eU1vZGVsVmFsdWVTd2luZ1Rlc3RzOwotCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eU1vZGVsVmFsdWVUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eU1vZGVsVmFsdWVUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlNb2RlbFZhbHVlUHJlZnNUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVdGlsaXR5TW9kZWxWYWx1ZVN3aW5nVGVzdHMuc3VpdGUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShEb3VibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShEb3VibGVNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMaXN0QXNwZWN0QWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMaXN0Q3VyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE51bGxDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE51bGxMaXN0VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE51bGxQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN0YXRpY0xpc3RWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RhdGljVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMuVHJhbnNmb3JtZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShWYWx1ZUxpc3RBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVmFsdWVQcm9wZXJ0eUFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShWYWx1ZVN0YXRlQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0VXRpbGl0eU1vZGVsVmFsdWVUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RBc3BlY3RBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0QXNwZWN0QWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNzg1MGQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RBc3BlY3RBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBMaXN0QXNwZWN0QWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDE7Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyMTsKLQlwcml2YXRlIExvY2FsTGlzdEFzcGVjdEFkYXB0ZXIgYWExOwotCXByaXZhdGUgTGlzdEV2ZW50IGV2ZW50MTsKLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjE7Ci0KLQlwcml2YXRlIFRlc3RTdWJqZWN0IHN1YmplY3QyOwotCi0JcHVibGljIExpc3RBc3BlY3RBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zdWJqZWN0MSA9IG5ldyBUZXN0U3ViamVjdCgpOwotCQl0aGlzLnN1YmplY3QxLmFkZE5hbWVzKHRoaXMuc3ViamVjdDFOYW1lcygpKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGREZXNjcmlwdGlvbnModGhpcy5zdWJqZWN0MURlc2NyaXB0aW9ucygpKTsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+KHRoaXMuc3ViamVjdDEpOwotCQl0aGlzLmFhMSA9IHRoaXMuYnVpbGRBc3BlY3RBZGFwdGVyKHRoaXMuc3ViamVjdEhvbGRlcjEpOwotCQl0aGlzLmxpc3RlbmVyMSA9IHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyMSgpOwotCQl0aGlzLmFhMS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdGVuZXIxKTsKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCi0JCXRoaXMuc3ViamVjdDIgPSBuZXcgVGVzdFN1YmplY3QoKTsKLQkJdGhpcy5zdWJqZWN0Mi5hZGROYW1lcyh0aGlzLnN1YmplY3QyTmFtZXMoKSk7Ci0JCXRoaXMuc3ViamVjdDIuYWRkRGVzY3JpcHRpb25zKHRoaXMuc3ViamVjdDJEZXNjcmlwdGlvbnMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3ViamVjdDFOYW1lcygpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmFyIik7Ci0JCXJlc3VsdC5hZGQoImJheiIpOwotCQlyZXN1bHQuYWRkKCJiYW0iKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdWJqZWN0MURlc2NyaXB0aW9ucygpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJ0aGlzLnN1YmplY3QxIGRlc2NyaXB0aW9uMSIpOwotCQlyZXN1bHQuYWRkKCJ0aGlzLnN1YmplY3QxIGRlc2NyaXB0aW9uMiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN1YmplY3QyTmFtZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiam9vIik7Ci0JCXJlc3VsdC5hZGQoImphciIpOwotCQlyZXN1bHQuYWRkKCJqYXoiKTsKLQkJcmVzdWx0LmFkZCgiamFtIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3ViamVjdDJEZXNjcmlwdGlvbnMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgidGhpcy5zdWJqZWN0MiBkZXNjcmlwdGlvbjEiKTsKLQkJcmVzdWx0LmFkZCgidGhpcy5zdWJqZWN0MiBkZXNjcmlwdGlvbjIiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExvY2FsTGlzdEFzcGVjdEFkYXB0ZXIgYnVpbGRBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IExvY2FsTGlzdEFzcGVjdEFkYXB0ZXIoc3ViamVjdEhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyMSgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQkJTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQkJTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHZhbHVlMUNoYW5nZWQoTGlzdEV2ZW50IGUpIHsKLQkJdGhpcy5ldmVudDEgPSBlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViamVjdEhvbGRlcigpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QyTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0MSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0MS5hZGROYW1lKCJqYW0iKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuc2l6ZSgpLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoImphbSIsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBuYW1lc1BsdXMgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNQbHVzLmFkZCgiamFtIik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc1BsdXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0KLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLmFhMS5hZGQoMiwgImpheiIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoImpheiIsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCW5hbWVzUGx1cy5hZGQoMiwgImpheiIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNQbHVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QWRkKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCUxpc3Q8U3RyaW5nPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlpdGVtcy5hZGQoImpvbyIpOwotCQlpdGVtcy5hZGQoImphciIpOwotCQlpdGVtcy5hZGQoImpheiIpOwotCQlpdGVtcy5hZGQoImphbSIpOwotCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5hYTEuYWRkQWxsKDIsIGl0ZW1zKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJbmRleCgpKTsJCS8vIG9ubHkgdGhlIGxhc3QgImFkZCIgZXZlbnQgd2lsbCBzdGlsbCBiZSB0aGVyZQotCQlhc3NlcnRFcXVhbHMoImphbSIsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBuYW1lc1BsdXMgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNQbHVzLmFkZEFsbCgyLCBpdGVtcyk7Ci0JCWFzc2VydEVxdWFscyhuYW1lc1BsdXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQlTdHJpbmcgcmVtb3ZlZE5hbWUgPSB0aGlzLnN1YmplY3QxLnJlbW92ZU5hbWUoMCk7CS8vIHNob3VsZCBiZSAiZm9vIgotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudDEpLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMocmVtb3ZlZE5hbWUsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBuYW1lc01pbnVzID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCW5hbWVzTWludXMucmVtb3ZlKDApOwotCQlhc3NlcnRFcXVhbHMobmFtZXNNaW51cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCU9iamVjdCByZW1vdmVkSXRlbSA9IHRoaXMuYWExLnJlbW92ZSgwKTsJCi0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhyZW1vdmVkSXRlbSwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJbmFtZXNNaW51cy5yZW1vdmUoMCk7Ci0JCWFzc2VydEVxdWFscyhuYW1lc01pbnVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TGVuZ3RoKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCUxpc3Q8U3RyaW5nPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlpdGVtcy5hZGQoImJhciIpOwotCQlpdGVtcy5hZGQoImJheiIpOwotCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5hYTEucmVtb3ZlKDEsIDIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudDEpLmdldEluZGV4KCkpOwkJLy8gb25seSB0aGUgbGFzdCAicmVtb3ZlIiBldmVudCB3aWxsIHN0aWxsIGJlIHRoZXJlCi0JCWFzc2VydEVxdWFscygiYmF6IiwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJTGlzdDxTdHJpbmc+IG5hbWVzUGx1cyA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc1BsdXMucmVtb3ZlKDEpOwotCQluYW1lc1BsdXMucmVtb3ZlKDEpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNQbHVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCVN0cmluZyByZXBsYWNlZE5hbWUgPSB0aGlzLnN1YmplY3QxLnNldE5hbWUoMCwgImplbGx5Iik7CS8vIHNob3VsZCBiZSAiZm9vIgotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCAoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqZWxseSIsICgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5ldmVudDEpLmdldE5ld0l0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocmVwbGFjZWROYW1lLCAoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRPbGRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJTGlzdDxTdHJpbmc+IG5hbWVzQ2hhbmdlZCA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc0NoYW5nZWQuc2V0KDAsICJqZWxseSIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNDaGFuZ2VkLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJcmVwbGFjZWROYW1lID0gdGhpcy5zdWJqZWN0MS5zZXROYW1lKDEsICJyb2xsIik7CS8vIHNob3VsZCBiZSAiYmFyIgotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCAoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJyb2xsIiwgKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0TmV3SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhyZXBsYWNlZE5hbWUsICgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5ldmVudDEpLmdldE9sZEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQluYW1lc0NoYW5nZWQgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNDaGFuZ2VkLnNldCgwLCAiamVsbHkiKTsKLQkJbmFtZXNDaGFuZ2VkLnNldCgxLCAicm9sbCIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNDaGFuZ2VkLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEuYWRkVHdvTmFtZXMoImphbSIsICJqYXoiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlMaXN0PFN0cmluZz4gbmFtZXNQbHVzMiA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc1BsdXMyLmFkZCgwLCAiamF6Iik7Ci0JCW5hbWVzUGx1czIuYWRkKDAsICJqYW0iKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzUGx1czIsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuc3ViamVjdDEubmFtZXMoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLmdldCgwKSwgdGhpcy5zdWJqZWN0MS5nZXROYW1lKDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLmdldCgwKSwgdGhpcy5hYTEuZ2V0KDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5zdWJqZWN0MS5uYW1lcygpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmFhMS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX0xJU1QpKTsKLQkJdGhpcy5hYTEucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19MSVNUKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYWExLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjIgPSBuZXcgQ2hhbmdlQWRhcHRlcigpOwotCQl0aGlzLmFhMS5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYWExLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfTElTVCkpOwotCQl0aGlzLmFhMS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfTElTVCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotCWNsYXNzIFRlc3RTdWJqZWN0IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IG5hbWVzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU19MSVNUID0gIm5hbWVzIjsKLQkJcHJpdmF0ZSBMaXN0PFN0cmluZz4gZGVzY3JpcHRpb25zOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTlNfTElTVCA9ICJkZXNjcmlwdGlvbnMiOwotCQotCQlwdWJsaWMgVGVzdFN1YmplY3QoKSB7Ci0JCQl0aGlzLm5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQl0aGlzLmRlc2NyaXB0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBuYW1lcygpIHsKLQkJCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLm5hbWVzKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lcy5nZXQoaW5kZXgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWUoaW50IGluZGV4LCBTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lcy5hZGQoaW5kZXgsIG5hbWUpOwotCQkJdGhpcy5maXJlSXRlbUFkZGVkKE5BTUVTX0xJU1QsIGluZGV4LCBuYW1lKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLmFkZE5hbWUodGhpcy5uYW1lcy5zaXplKCksIG5hbWUpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWVzKExpc3RJdGVyYXRvcjxTdHJpbmc+IG5ld05hbWVzKSB7Ci0JCQl3aGlsZSAobmV3TmFtZXMuaGFzTmV4dCgpKSB7Ci0JCQkJdGhpcy5hZGROYW1lKG5ld05hbWVzLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZXMoTGlzdDxTdHJpbmc+IG5ld05hbWVzKSB7Ci0JCQl0aGlzLmFkZE5hbWVzKG5ld05hbWVzLmxpc3RJdGVyYXRvcigpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRUd29OYW1lcyhTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQkJdGhpcy5uYW1lcy5hZGQoMCwgbmFtZTIpOwotCQkJdGhpcy5uYW1lcy5hZGQoMCwgbmFtZTEpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTkFNRVNfTElTVCwgdGhpcy5uYW1lcyk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyByZW1vdmVOYW1lKGludCBpbmRleCkgewotCQkJU3RyaW5nIHJlbW92ZWROYW1lID0gdGhpcy5uYW1lcy5yZW1vdmUoaW5kZXgpOwotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoTkFNRVNfTElTVCwgaW5kZXgsIHJlbW92ZWROYW1lKTsKLQkJCXJldHVybiByZW1vdmVkTmFtZTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHNldE5hbWUoaW50IGluZGV4LCBTdHJpbmcgbmFtZSkgewotCQkJU3RyaW5nIHJlcGxhY2VkTmFtZSA9IHRoaXMubmFtZXMuc2V0KGluZGV4LCBuYW1lKTsKLQkJCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZChOQU1FU19MSVNULCBpbmRleCwgbmFtZSwgcmVwbGFjZWROYW1lKTsKLQkJCXJldHVybiByZXBsYWNlZE5hbWU7Ci0JCX0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IGRlc2NyaXB0aW9ucygpIHsKLQkJCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLmRlc2NyaXB0aW9ucyk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihpbnQgaW5kZXgpIHsKLQkJCXJldHVybiB0aGlzLmRlc2NyaXB0aW9ucy5nZXQoaW5kZXgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0aW9uKGludCBpbmRleCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQl0aGlzLmRlc2NyaXB0aW9ucy5hZGQoaW5kZXgsIGRlc2NyaXB0aW9uKTsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChERVNDUklQVElPTlNfTElTVCwgaW5kZXgsIGRlc2NyaXB0aW9uKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCXRoaXMuYWRkRGVzY3JpcHRpb24odGhpcy5kZXNjcmlwdGlvbnMuc2l6ZSgpLCBkZXNjcmlwdGlvbik7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkRGVzY3JpcHRpb25zKExpc3RJdGVyYXRvcjxTdHJpbmc+IG5ld0Rlc2NyaXB0aW9ucykgewotCQkJd2hpbGUgKG5ld0Rlc2NyaXB0aW9ucy5oYXNOZXh0KCkpIHsKLQkJCQl0aGlzLmFkZERlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9ucy5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0aW9ucyhMaXN0PFN0cmluZz4gbmV3RGVzY3JpcHRpb25zKSB7Ci0JCQl0aGlzLmFkZERlc2NyaXB0aW9ucyhuZXdEZXNjcmlwdGlvbnMubGlzdEl0ZXJhdG9yKCkpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgcmVtb3ZlRGVzY3JpcHRpb24oaW50IGluZGV4KSB7Ci0JCQlTdHJpbmcgcmVtb3ZlZERlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbnMucmVtb3ZlKGluZGV4KTsKLQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKERFU0NSSVBUSU9OU19MSVNULCBpbmRleCwgcmVtb3ZlZERlc2NyaXB0aW9uKTsKLQkJCXJldHVybiByZW1vdmVkRGVzY3JpcHRpb247Ci0JCX0KLQkJcHVibGljIFN0cmluZyBzZXREZXNjcmlwdGlvbihpbnQgaW5kZXgsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJU3RyaW5nIHJlcGxhY2VkRGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9ucy5zZXQoaW5kZXgsIGRlc2NyaXB0aW9uKTsKLQkJCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZChERVNDUklQVElPTlNfTElTVCwgaW5kZXgsIGRlc2NyaXB0aW9uLCByZXBsYWNlZERlc2NyaXB0aW9uKTsKLQkJCXJldHVybiByZXBsYWNlZERlc2NyaXB0aW9uOwotCQl9Ci0JfQotCi0KLQkvLyB0aGlzIGlzIG5vdCBhIHR5cGljYWwgYXNwZWN0IGFkYXB0ZXIgLSB0aGUgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYXNwZWN0IG5hbWUKLQljbGFzcyBMb2NhbExpc3RBc3BlY3RBZGFwdGVyIGV4dGVuZHMgTGlzdEFzcGVjdEFkYXB0ZXI8VGVzdFN1YmplY3QsIFN0cmluZz4gewotCi0JCUxvY2FsTGlzdEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBUZXN0U3ViamVjdC5OQU1FU19MSVNUKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCWlmICh0aGlzLmFzcGVjdE5hbWVzWzBdID09IFRlc3RTdWJqZWN0Lk5BTUVTX0xJU1QpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWVzKCk7Ci0JCQl9IGVsc2UgaWYgKHRoaXMuYXNwZWN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05TX0xJU1QpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmRlc2NyaXB0aW9ucygpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5hc3BlY3ROYW1lc1swXSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQkJaWYgKHRoaXMuYXNwZWN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRVNfTElTVCkgewotCQkJCXRoaXMuc3ViamVjdC5hZGROYW1lKGluZGV4LCAoU3RyaW5nKSBpdGVtKTsKLQkJCX0gZWxzZSBpZiAodGhpcy5hc3BlY3ROYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTlNfTElTVCkgewotCQkJCXRoaXMuc3ViamVjdC5hZGREZXNjcmlwdGlvbihpbmRleCwgKFN0cmluZykgaXRlbSk7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgYXNwZWN0IG5hbWU6ICIgKyB0aGlzLmFzcGVjdE5hbWVzWzBdKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEFsbChpbnQgaW5kZXgsIExpc3Q8U3RyaW5nPiBpdGVtcykgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJCXRoaXMuYWRkKGluZGV4ICsgaSwgaXRlbXMuZ2V0KGkpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgcmVtb3ZlKGludCBpbmRleCkgewotCQkJaWYgKHRoaXMuYXNwZWN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRVNfTElTVCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QucmVtb3ZlTmFtZShpbmRleCk7Ci0JCQl9IGVsc2UgaWYgKHRoaXMuYXNwZWN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05TX0xJU1QpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnJlbW92ZURlc2NyaXB0aW9uKGluZGV4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMuYXNwZWN0TmFtZXNbMF0pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIExpc3Q8U3RyaW5nPiByZW1vdmUoaW50IGluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCQlMaXN0PFN0cmluZz4gcmVtb3ZlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJcmVtb3ZlZEl0ZW1zLmFkZCh0aGlzLnJlbW92ZShpbmRleCkpOwotCQkJfQotCQkJcmV0dXJuIHJlbW92ZWRJdGVtczsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgcmVwbGFjZShpbnQgaW5kZXgsIE9iamVjdCBpdGVtKSB7Ci0JCQlpZiAodGhpcy5hc3BlY3ROYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FU19MSVNUKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5zZXROYW1lKGluZGV4LCAoU3RyaW5nKSBpdGVtKTsKLQkJCX0gZWxzZSBpZiAodGhpcy5hc3BlY3ROYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTlNfTElTVCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3Quc2V0RGVzY3JpcHRpb24oaW5kZXgsIChTdHJpbmcpIGl0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5hc3BlY3ROYW1lc1swXSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0OTlhZDMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTGlzdE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGFkYXB0ZXI7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IHdyYXBwZWRMaXN0SG9sZGVyOwotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHdyYXBwZWRMaXN0OwotCi0JcHVibGljIExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLndyYXBwZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLndyYXBwZWRMaXN0KTsKLQkJdGhpcy5hZGFwdGVyID0gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPih0aGlzLndyYXBwZWRMaXN0SG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiB3cmFwcGVkQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMud3JhcHBlZExpc3QuaXRlcmF0b3IoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQkvLyBvdmVycmlkZSBmYWlsdXJlCi0JCQl9Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgwLCAiZm9vIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDEsICJiYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMiwgImJheiIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YWxlVmFsdWVzKCkgewotCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCX07Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDAsICJmb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMSwgImJhciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgyLCAiYmF6Iik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQlhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSGFzaEJhZzxTdHJpbmc+KCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQlhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMud3JhcHBlZExpc3RIb2xkZXIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgwLCAiZm9vIik7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkTGlzdC5jb250YWlucygiZm9vIikpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgxLCAiYmFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDIsICJiYXoiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMywgImpvbyIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCg0LCAiamFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDUsICJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHRoaXMud3JhcHBlZExpc3Quc2l6ZSgpKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc3luY2hMaXN0Lml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgc3luY2hDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMud3JhcHBlZExpc3RIb2xkZXIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgwLCAiZm9vIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDEsICJiYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMiwgImJheiIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgzLCAiam9vIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDQsICJqYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoNSwgImpheiIpOwotCQlhc3NlcnRFcXVhbHMoImpheiIsIHRoaXMud3JhcHBlZExpc3RIb2xkZXIucmVtb3ZlKDUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkTGlzdC5jb250YWlucygiamF6IikpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMud3JhcHBlZExpc3RIb2xkZXIucmVtb3ZlKDApKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkTGlzdC5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy53cmFwcGVkTGlzdC5zaXplKCkpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBzeW5jaENvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U3luY2goKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQkJLy8gb3ZlcnJpZGUgZmFpbHVyZQotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQkvLyBvdmVycmlkZSBmYWlsdXJlCi0JCQl9Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgwLCAiZm9vIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDEsICJiYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMiwgImJheiIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgzLCAiam9vIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDQsICJqYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoNSwgImpheiIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLnJlbW92ZSg1KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkTGlzdC5jb250YWlucygiamF6IikpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkTGlzdC5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy53cmFwcGVkTGlzdC5zaXplKCkpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCS8vIG92ZXJyaWRlIGZhaWx1cmUKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQkJLy8gb3ZlcnJpZGUgZmFpbHVyZQotCQkJfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMCwgImZvbyIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgxLCAiYmFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDIsICJiYXoiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJCWFzc2VydEVxdWFscygiZm9vIiwgZS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuYWRhcHRlci5pdGVyYXRvcigpLCAiam9vIikpOwotCQkJCWFzc2VydEVxdWFscygyLCBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5hZGFwdGVyLnNpemUoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImpvbyIsIGUuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMsIExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmFkYXB0ZXIuc2l6ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuc2V0KDAsICJqb28iKTsKLQkJYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCUNvb3JkaW5hdGVkQmFnPFN0cmluZz4gc3luY2hDb2xsZWN0aW9uID0gbmV3IENvb3JkaW5hdGVkQmFnPFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHN5bmNoQ29sbGVjdGlvbik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGNsID0gbmV3IENoYW5nZUFkYXB0ZXIoKTsKLQkJdGhpcy5hZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlZFRvRW1wdHkoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDAsICJmb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMSwgImJhciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgyLCAiYmF6Iik7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLnNldExpc3RWYWx1ZXMobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRGcm9tRW1wdHkoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCQotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCJmb28iKTsKLQkJbGlzdC5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLnNldExpc3RWYWx1ZXMobGlzdCk7Ci0JCWFzc2VydEVxdWFscygyLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlZEZyb21FbXB0eVRvRW1wdHkoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCQotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuc2V0TGlzdFZhbHVlcyhsaXN0KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JY2xhc3MgVGVzdExpc3RlbmVyIGltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEN1cmF0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDdXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRkYzVmNS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEN1cmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEN1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBMaXN0Q3VyYXRvclRlc3RzIAotCWV4dGVuZHMgVGVzdENhc2UgCi17Ci0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MTsKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIxOwotCQotCXByaXZhdGUgTGlzdEN1cmF0b3I8VGVzdFN1YmplY3QsIFN0cmluZz4gY3VyYXRvcjsKLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjE7Ci0JcHJpdmF0ZSBMaXN0RXZlbnQgZXZlbnQxOwotCQotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDI7Ci0KLQlwdWJsaWMgTGlzdEN1cmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnN1YmplY3QxID0gbmV3IFRlc3RTdWJqZWN0KHRoaXMuc3ViamVjdDFOYW1lcygpKTsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+KHRoaXMuc3ViamVjdDEpOwotCQl0aGlzLmN1cmF0b3IgPSB0aGlzLmJ1aWxkTGlzdEN1cmF0b3IodGhpcy5zdWJqZWN0SG9sZGVyMSk7Ci0JCXRoaXMubGlzdGVuZXIxID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcjEoKTsKLQkJdGhpcy5jdXJhdG9yLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0ZW5lcjEpOwotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCQotCQl0aGlzLnN1YmplY3QyID0gbmV3IFRlc3RTdWJqZWN0KHRoaXMuc3ViamVjdDJOYW1lcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3ViamVjdDFOYW1lcygpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiYWxwaGEiKTsKLQkJbGlzdC5hZGQoImJyYXZvIik7Ci0JCWxpc3QuYWRkKCJjaGFybGllIik7Ci0JCWxpc3QuYWRkKCJkZWx0YSIpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3ViamVjdDJOYW1lcygpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiZWNobyIpOwotCQlsaXN0LmFkZCgiZm94dHJvdCIpOwotCQlsaXN0LmFkZCgiZ2xvdmUiKTsKLQkJbGlzdC5hZGQoImhvdGVsIik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQlwcml2YXRlIExpc3RDdXJhdG9yPFRlc3RTdWJqZWN0LCBTdHJpbmc+IGJ1aWxkTGlzdEN1cmF0b3IoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgTGlzdEN1cmF0b3I8VGVzdFN1YmplY3QsIFN0cmluZz4oc3ViamVjdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvckZvclJlY29yZCgpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnN0cmluZ3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcjEoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCB2YWx1ZTFDaGFuZ2VkKExpc3RFdmVudCBlKSB7Ci0JCXRoaXMuZXZlbnQxID0gZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YmplY3RIb2xkZXIoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0Mik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jdXJhdG9yLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QyTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jdXJhdG9yLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY3VyYXRvci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0MSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jdXJhdG9yLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0MS5hZGRTdHJpbmcoImVjaG8iKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlY2hvIiwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJTGlzdDxTdHJpbmc+IHN0cmluZ3NQbHVzID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCXN0cmluZ3NQbHVzLmFkZCgiZWNobyIpOwotCQlhc3NlcnRFcXVhbHMoc3RyaW5nc1BsdXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0MS5hZGRTdHJpbmcoMCwgInp1bHUiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscygienVsdSIsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCXN0cmluZ3NQbHVzLmFkZCgwLCAienVsdSIpOwotCQlhc3NlcnRFcXVhbHMoc3RyaW5nc1BsdXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQlTdHJpbmcgcmVtb3ZlZFN0cmluZyA9IHRoaXMuc3ViamVjdDEucmVtb3ZlU3RyaW5nKDApOwkvLyBzaG91bGQgYmUgImFscGhhIgotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3VyYXRvciwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHJlbW92ZWRTdHJpbmcsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBzdHJpbmdzTWludXMgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJc3RyaW5nc01pbnVzLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKHN0cmluZ3NNaW51cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JCQotCQlyZW1vdmVkU3RyaW5nID0gdGhpcy5zdWJqZWN0MS5yZW1vdmVTdHJpbmcoMik7CS8vIHNob3VsZCBiZSAiZGVsdGEiCi0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jdXJhdG9yLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudDEpLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMocmVtb3ZlZFN0cmluZywgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJc3RyaW5nc01pbnVzLnJlbW92ZSgyKTsKLQkJYXNzZXJ0RXF1YWxzKHN0cmluZ3NNaW51cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0ZUxpc3RDaGFuZ2UoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCQkKLQkJdGhpcy5zdWJqZWN0MS5zZXRTdHJpbmdzKHRoaXMuc3ViamVjdDJOYW1lcygpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJTGlzdDxTdHJpbmc+IG5ld1N0cmluZ3MgPSB0aGlzLnN1YmplY3QyTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1N0cmluZ3MsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UGFydGlhbExpc3RDaGFuZ2UoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzdGFydGluZ0xpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIHN0YXJ0aW5nTGlzdCk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCQkKLQkJU3RyaW5nIGlkZW50aWNhbFN0cmluZyA9IHN0YXJ0aW5nTGlzdC5nZXQoMSk7ICAvLyBzaG91bGQgYmUgImJyYXZvIgotCQlTdHJpbmcgbm9uaWRlbnRpY2FsU3RyaW5nID0gc3RhcnRpbmdMaXN0LmdldCgwKTsgLy8gc2hvdWxkIGJlICJhbHBoYSIKLQkJTGlzdDxTdHJpbmc+IG5ld1N0cmluZ3MgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoImJyYXZvIiksIG5ldyBTdHJpbmcoImFscGhhIiksICJlY2hvIiwgImRlbHRhIiwgImZveHRyb3QifSk7Ci0JCXRoaXMuc3ViamVjdDEuc2V0U3RyaW5ncyhuZXdTdHJpbmdzKTsKLQkJCi0JCUxpc3Q8U3RyaW5nPiBmaW5hbExpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3VyYXRvciwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3U3RyaW5ncywgZmluYWxMaXN0KTsKLQkJYXNzZXJ0VHJ1ZShpZGVudGljYWxTdHJpbmcgPT0gZmluYWxMaXN0LmdldCgwKSk7Ci0JCWFzc2VydFRydWUobm9uaWRlbnRpY2FsU3RyaW5nICE9IGZpbmFsTGlzdC5nZXQoMSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5zdWJqZWN0MS5zdHJpbmdzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLmdldCgwKSwgdGhpcy5zdWJqZWN0MS5nZXRTdHJpbmcoMCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuZ2V0KDApLCB0aGlzLmN1cmF0b3IuZ2V0KDApKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuc3ViamVjdDEuc3RyaW5ncygpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuc2l6ZSgpLCB0aGlzLmN1cmF0b3Iuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmN1cmF0b3IuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMuY3VyYXRvci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdGVuZXIxKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdWJqZWN0MS5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jdXJhdG9yLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjIgPSB0aGlzLmJ1aWxkQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5jdXJhdG9yLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydFRydWUodGhpcy5jdXJhdG9yLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLmN1cmF0b3IucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdWJqZWN0MS5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jdXJhdG9yLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqKioqKioqIElubmVyIENsYXNzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQljbGFzcyBUZXN0U3ViamVjdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdHJpbmdzOwotCQkKLQkJcHVibGljIFRlc3RTdWJqZWN0KCkgewotCQkJdGhpcy5zdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBUZXN0U3ViamVjdChMaXN0PFN0cmluZz4gc3RyaW5ncykgewotCQkJdGhpcygpOwotCQkJdGhpcy5zZXRTdHJpbmdzKHN0cmluZ3MpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgaW5kZXgpIHsKLQkJCXJldHVybiB0aGlzLnN0cmluZ3MuZ2V0KGluZGV4KTsKLQkJfQotCQkKLQkJcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmluZ3MoKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5zdHJpbmdzKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgYWRkU3RyaW5nKGludCBpbmRleCwgU3RyaW5nIHN0cmluZykgewotCQkJdGhpcy5zdHJpbmdzLmFkZChpbmRleCwgc3RyaW5nKTsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGRTdHJpbmcoU3RyaW5nIHN0cmluZykgewotCQkJdGhpcy5hZGRTdHJpbmcodGhpcy5zdHJpbmdzLnNpemUoKSwgc3RyaW5nKTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyByZW1vdmVTdHJpbmcoaW50IGluZGV4KSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gdGhpcy5zdHJpbmdzLmdldChpbmRleCk7Ci0JCQl0aGlzLnJlbW92ZVN0cmluZyhzdHJpbmcpOwotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKLQkJCXRoaXMuc3RyaW5ncy5yZW1vdmUoc3RyaW5nKTsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRTdHJpbmdzKExpc3Q8U3RyaW5nPiBzdHJpbmdzKSB7Ci0JCQl0aGlzLnN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oc3RyaW5ncyk7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0U3RyaW5ncyhTdHJpbmdbXSBzdHJpbmdzKSB7Ci0JCQl0aGlzLnN0cmluZ3MgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChzdHJpbmdzKTsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2YmQ5My4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5OdWxsQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBOdWxsQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPE9iamVjdD4gY29sbGVjdGlvbkhvbGRlcjsKLQotCXB1YmxpYyBOdWxsQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIgPSBuZXcgTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsPE9iamVjdD4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbExpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2JhNGFjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLk51bGxMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotcHVibGljIGNsYXNzIE51bGxMaXN0VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T2JqZWN0PiBsaXN0SG9sZGVyOwotCi0JcHVibGljIE51bGxMaXN0VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubGlzdEhvbGRlciA9IG5ldyBOdWxsTGlzdFZhbHVlTW9kZWw8T2JqZWN0PigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLmxpc3RIb2xkZXIuZ2V0KDApOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdEhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZjY0MjIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLk51bGxQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgTnVsbFByb3BlcnR5VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0KLQlwdWJsaWMgTnVsbFByb3BlcnR5VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSBuZXcgTnVsbFByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJYXNzZXJ0TnVsbCh0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5QXNwZWN0QWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlBc3BlY3RBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY1ZWFjYS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlBc3BlY3RBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFRlc3RTdWJqZWN0IHN1YmplY3QxOwotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcjE7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdFN1YmplY3QsIFN0cmluZz4gYWExOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDE7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMTsKLQotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDI7Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgbXVsdGlwbGVWYWx1ZUV2ZW50OwotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGN1c3RvbVZhbHVlRXZlbnQ7Ci0KLQotCXB1YmxpYyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnN1YmplY3QxID0gbmV3IFRlc3RTdWJqZWN0KCJmb28iLCAidGVzdCBzdWJqZWN0IDEiKTsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+ICh0aGlzLnN1YmplY3QxKTsKLQkJdGhpcy5hYTEgPSB0aGlzLmJ1aWxkQXNwZWN0QWRhcHRlcih0aGlzLnN1YmplY3RIb2xkZXIxKTsKLQkJdGhpcy5saXN0ZW5lcjEgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKTsKLQkJdGhpcy5hYTEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIxKTsKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCi0JCXRoaXMuc3ViamVjdDIgPSBuZXcgVGVzdFN1YmplY3QoImJhciIsICJ0ZXN0IHN1YmplY3QgMiIpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBTdHJpbmc+IGJ1aWxkQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdFN1YmplY3QsIFN0cmluZz4oc3ViamVjdEhvbGRlciwgVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSkgewotCQkJLy8gdGhpcyBpcyBub3QgYSBhc3BlY3QgYWRhcHRlciAtIHRoZSB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhc3BlY3QgbmFtZQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLmFzcGVjdE5hbWVzWzBdID09IFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIGlmICh0aGlzLmFzcGVjdE5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OX1BST1BFUlRZKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5hc3BlY3ROYW1lc1swXSk7Ci0JCQkJfQotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHRoaXMuYXNwZWN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQkJfSBlbHNlIGlmICh0aGlzLmFzcGVjdE5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OX1BST1BFUlRZKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXREZXNjcmlwdGlvbih2YWx1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMuYXNwZWN0TmFtZXNbMF0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVByb3BlcnR5QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHZhbHVlMUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMuZXZlbnQxID0gZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YmplY3RIb2xkZXIoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0Mik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ldmVudDEuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuZXZlbnQxLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuZXZlbnQxLmdldE5ld1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQxLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmV2ZW50MS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MS5nZXROZXdWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QxKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50MS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmV2ZW50MS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmV2ZW50MS5nZXROZXdWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEuc2V0TmFtZSgiYmF6Iik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ldmVudDEuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuZXZlbnQxLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuZXZlbnQxLmdldE5ld1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3QxLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ldmVudDEuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuZXZlbnQxLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5ldmVudDEuZ2V0TmV3VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0MS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50MS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmV2ZW50MS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmV2ZW50MS5nZXROZXdWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5zdWJqZWN0MS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdGFsZVZhbHVlKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuc3ViamVjdDEuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmFhMS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcjEpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5hYTEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIxKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmFhMS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcjEpOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDIpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5hYTEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIxKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCXRoaXMuYWExLnNldFZhbHVlKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLnN1YmplY3QxLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmFhMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFkpKTsKLQkJdGhpcy5hYTEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIxKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdWJqZWN0MS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYWExLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMiA9IHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyMSgpOwotCQl0aGlzLmFhMS5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYWExLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSkpOwotCQl0aGlzLmFhMS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hYTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQXNwZWN0QWRhcHRlcigpIHsKLQkJVGVzdFN1YmplY3QgdGVzdFN1YmplY3QgPSBuZXcgVGVzdFN1YmplY3QoImZyZWQiLCAiaHVzYmFuZCIpOwotCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiB0ZXN0U3ViamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+KHRlc3RTdWJqZWN0KTsKLQkJTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRlc3RBQSA9IHRoaXMuYnVpbGRNdWx0aXBsZUFzcGVjdEFkYXB0ZXIodGVzdFN1YmplY3RIb2xkZXIpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHRlc3RMaXN0ZW5lciA9IHRoaXMuYnVpbGRNdWx0aXBsZVZhbHVlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGVzdEFBLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0ZXN0TGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQ6aHVzYmFuZCIsIHRlc3RBQS5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLm11bHRpcGxlVmFsdWVFdmVudCA9IG51bGw7Ci0JCXRlc3RTdWJqZWN0LnNldE5hbWUoIndpbG1hIik7Ci0JCWFzc2VydEVxdWFscygid2lsbWE6aHVzYmFuZCIsIHRlc3RBQS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkOmh1c2JhbmQiLCB0aGlzLm11bHRpcGxlVmFsdWVFdmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3aWxtYTpodXNiYW5kIiwgdGhpcy5tdWx0aXBsZVZhbHVlRXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0KLQkJdGhpcy5tdWx0aXBsZVZhbHVlRXZlbnQgPSBudWxsOwotCQl0ZXN0U3ViamVjdC5zZXREZXNjcmlwdGlvbigid2lmZSIpOwotCQlhc3NlcnRFcXVhbHMoIndpbG1hOndpZmUiLCB0ZXN0QUEuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygid2lsbWE6aHVzYmFuZCIsIHRoaXMubXVsdGlwbGVWYWx1ZUV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIndpbG1hOndpZmUiLCB0aGlzLm11bHRpcGxlVmFsdWVFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE11bHRpcGxlQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdFN1YmplY3QsIFN0cmluZz4oc3ViamVjdEhvbGRlciwgVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSwgVGVzdFN1YmplY3QuREVTQ1JJUFRJT05fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKSArICI6IiArIHRoaXMuc3ViamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE11bHRpcGxlVmFsdWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVByb3BlcnR5QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMubXVsdGlwbGVWYWx1ZUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCBtdWx0aXBsZVZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5tdWx0aXBsZVZhbHVlRXZlbnQgPSBlOwotCX0KLQotCS8qKgotCSAqIHRlc3QgYSBidWcgd2hlcmUgd2Ugd291bGQgY2FsbCAjYnVpbGRWYWx1ZSgpIGluCi0JICogI2VuZ2FnZU5vbk51bGxTdWJqZWN0KCksIHdoZW4gd2UgbmVlZGVkIHRvIGNhbGwKLQkgKiBpdCBpbiAjZW5nYWdlU3ViamVjdCgpLCBzbyB0aGUgY2FjaGVkIHZhbHVlIHdvdWxkCi0JICogYmUgcmVidWlsdCB3aGVuIHRoZSB0aGlzLnN1YmplY3Qgd2FzIHNldCB0byBudWxsCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbUJ1aWxkVmFsdWVXaXRoTnVsbFN1YmplY3QoKSB7Ci0JCVRlc3RTdWJqZWN0IGN1c3RvbVN1YmplY3QgPSBuZXcgVGVzdFN1YmplY3QoImZyZWQiLCAibGFib3JlciIpOwotCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBjdXN0b21TdWJqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4oY3VzdG9tU3ViamVjdCk7Ci0JCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBjdXN0b21BQSA9IHRoaXMuYnVpbGRDdXN0b21Bc3BlY3RBZGFwdGVyKGN1c3RvbVN1YmplY3RIb2xkZXIpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGN1c3RvbUxpc3RlbmVyID0gdGhpcy5idWlsZEN1c3RvbVZhbHVlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJY3VzdG9tQUEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGN1c3RvbUxpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkIiwgY3VzdG9tQUEuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5jdXN0b21WYWx1ZUV2ZW50ID0gbnVsbDsKLQkJY3VzdG9tU3ViamVjdC5zZXROYW1lKCJ3aWxtYSIpOwotCQlhc3NlcnRFcXVhbHMoIndpbG1hIiwgY3VzdG9tQUEuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIHRoaXMuY3VzdG9tVmFsdWVFdmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3aWxtYSIsIHRoaXMuY3VzdG9tVmFsdWVFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQotCQl0aGlzLmN1c3RvbVZhbHVlRXZlbnQgPSBudWxsOwotCQljdXN0b21TdWJqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkvLyB0aGlzIHdvdWxkIGZhaWwgLSB0aGUgdmFsdWUgd291bGQgYmUgbnVsbC4uLgotCQlhc3NlcnRFcXVhbHMoIjx1bm5hbWVkPiIsIGN1c3RvbUFBLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIndpbG1hIiwgdGhpcy5jdXN0b21WYWx1ZUV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIjx1bm5hbWVkPiIsIHRoaXMuY3VzdG9tVmFsdWVFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGEgYnVnOgotCSAqIElmIHR3byBsaXN0ZW5lcnMgd2VyZSBhZGRlZCB0byBhbiBhc3BlY3QgYWRhcHRlciwgb25lIHdpdGggYW4KLQkgKiBhc3BlY3QgbmFtZSBhbmQgb25lIHdpdGhvdXQsIHRoZSBhc3BlY3QgYWRhcHRlciB3b3VsZCBhZGQgaXRzCi0JICogJ3N1YmplY3RDaGFuZ2VMaXN0ZW5lcicgdG8gaXRzICdzdWJqZWN0SG9sZGVyJyB0d2ljZS4gQXMgYSByZXN1bHQsCi0JICogdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgdHJpZ2dlciBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiBpZiB0aGUgYnVnIGlzIHByZXNlbnQ7IG90aGVyd2lzZSwgaXQgY29tcGxldGVzIHNpbGVudGx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVMaXN0ZW5lcigpIHsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IENoYW5nZUFkYXB0ZXIoKTsKLQkJdGhpcy5hYTEuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEN1c3RvbUFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBTdHJpbmc+KHN1YmplY3RIb2xkZXIsIFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlKCkgewotCQkJCXJldHVybiAodGhpcy5zdWJqZWN0ID09IG51bGwpID8gIjx1bm5hbWVkPiIgOiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEN1c3RvbVZhbHVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLmN1c3RvbVZhbHVlQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIGN1c3RvbVZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5jdXN0b21WYWx1ZUV2ZW50ID0gZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGVzdCBtb2RlbCAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdFN1YmplY3QgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQkJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX1BST1BFUlRZID0gImRlc2NyaXB0aW9uIjsKLQkKLQkJcHVibGljIFRlc3RTdWJqZWN0KFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLmRlc2NyaXB0aW9uOwotCQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFU0NSSVBUSU9OX1BST1BFUlRZLCBvbGQsIGRlc2NyaXB0aW9uKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWNmYTc0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTGlzdE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGFkYXB0ZXI7Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gd3JhcHBlZFZhbHVlSG9sZGVyOwotCi0JcHVibGljIFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJdGhpcy5hZGFwdGVyID0gbmV3IFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy53cmFwcGVkVmFsdWVIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHdyYXBwZWRDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24obmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxTdHJpbmc+KHRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYWRhcHRlckNvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdGFsZVZhbHVlKCkgewotCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCX07Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFkYXB0ZXJDb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpKTsKLQotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQlhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSGFzaEJhZzxTdHJpbmc+KCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQlhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhZGFwdGVyQ29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCUNvb3JkaW5hdGVkQmFnPFN0cmluZz4gc3luY2hDb2xsZWN0aW9uID0gbmV3IENvb3JkaW5hdGVkQmFnPFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHN5bmNoQ29sbGVjdGlvbik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGNsID0gbmV3IENoYW5nZUFkYXB0ZXIoKTsKLQkJdGhpcy5hZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VkVG9FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRGcm9tRW1wdHkoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJCi0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkRnJvbUVtcHR5VG9FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSk7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQkKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygwLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzcyAqKioqKioqKioqCi0JCi0Jc3RhdGljIGNsYXNzIFRlc3RMaXN0ZW5lciBpbXBsZW1lbnRzIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzkwOTFjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuSkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYWRhcHRlcjsKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB3cmFwcGVkVmFsdWVIb2xkZXI7Ci0KLQlwdWJsaWMgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQl0aGlzLmFkYXB0ZXIgPSBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPih0aGlzLndyYXBwZWRWYWx1ZUhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gd3JhcHBlZExpc3QoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubGlzdChuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPFN0cmluZz4odGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7LyogT0sgKi99Ci0JCX0pOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCUxpc3Q8U3RyaW5nPiBhZGFwdGVyTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFkYXB0ZXJMaXN0LnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRMaXN0KCksIGFkYXB0ZXJMaXN0KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhZGFwdGVyTGlzdC5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEludCgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFkYXB0ZXIuZ2V0KDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheTEoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCU9iamVjdFtdIGFycmF5ID0gdGhpcy5hZGFwdGVyLnRvQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhcnJheVswXSk7Ci0JCWFzc2VydEVxdWFscygxLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb0FycmF5MigpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpKTsKLQkJT2JqZWN0W10gYXJyYXkgPSB0aGlzLmFkYXB0ZXIudG9BcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhbGVWYWx1ZSgpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsvKiBPSyAqL30KLQkJfTsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCUxpc3Q8U3RyaW5nPiBhZGFwdGVyTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFkYXB0ZXJMaXN0LnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRMaXN0KCksIGFkYXB0ZXJMaXN0KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhZGFwdGVyTGlzdC5pdGVyYXRvcigpLm5leHQoKSk7Ci0KLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhZGFwdGVyTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFkYXB0ZXJMaXN0LnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwgYWRhcHRlckxpc3QpOwotCi0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYWRhcHRlckxpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhZGFwdGVyTGlzdC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkTGlzdCgpLCBhZGFwdGVyTGlzdCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYWRhcHRlckxpc3QuaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgY2wgPSBuZXcgQ2hhbmdlQWRhcHRlcigpOwotCQl0aGlzLmFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIoY2wpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihjbCk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VkVG9FbXB0eSgpIHsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7LyogT0sgKi99Ci0JCX0pOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygwLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VkRnJvbUVtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgey8qIE9LICovfQotCQl9KTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCQotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygxLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlbUNoYW5nZWQoKSB7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7LyogT0sgKi99Ci0JCX0pOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqTGlzdC5nZXRNb2RlbCgpLmdldEVsZW1lbnRBdCgwKSk7Ci0JCQotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygxLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgakxpc3QuZ2V0TW9kZWwoKS5nZXRFbGVtZW50QXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZWRGcm9tRW1wdHlUb0VtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkpOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJCi0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMCwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3MgKioqKioqKioqKgotCQotCXN0YXRpYyBjbGFzcyBUZXN0TGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1JlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI1ZWRlOS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXJUZXN0cyAKLQlleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gb2JqZWN0SG9sZGVyOwotCQotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0JCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gd3JhcHBlck9iamVjdEhvbGRlcjsKLQkKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IHdyYXBwZXJFdmVudDsKLQkKLQkKLQlwdWJsaWMgUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oImZvbyIpOwotCQl0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIgPSBuZXcgUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPih0aGlzLm9iamVjdEhvbGRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMud3JhcHBlck9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCWJvb2xlYW4gZXhjZXB0aW9uT2NjdXJyZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMud3JhcHBlck9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHVvZSkgewotCQkJZXhjZXB0aW9uT2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKGV4Y2VwdGlvbk9jY3VycmVkKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdGVuaW5nKCkgewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gYnVpbGRXcmFwcGVyTGlzdGVuZXIoKTsKLQkJdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQkKLQkJdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMud3JhcHBlck9iamVjdEhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTEoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRXcmFwcGVyTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTIoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMud3JhcHBlck9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZFdyYXBwZXJMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlcygpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMud3JhcHBlckV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQl2ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImZvbyIsICJiYXIiKTsKLQkJdmVyaWZ5RXZlbnQodGhpcy53cmFwcGVyRXZlbnQsIHRoaXMud3JhcHBlck9iamVjdEhvbGRlciwgImZvbyIsICJiYXIiKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLndyYXBwZXJFdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQl2ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImJhciIsIG51bGwpOwotCQl2ZXJpZnlFdmVudCh0aGlzLndyYXBwZXJFdmVudCwgdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLCAiYmFyIiwgbnVsbCk7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy53cmFwcGVyRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCXZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCBudWxsLCAiZm9vIik7Ci0JCXZlcmlmeUV2ZW50KHRoaXMud3JhcHBlckV2ZW50LCB0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIsIG51bGwsICJmb28iKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZFdyYXBwZXJMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLndyYXBwZXJFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQgZSwgT2JqZWN0IHNvdXJjZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIGUuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgZS5nZXROZXdWYWx1ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RkZmI3ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2V0Q29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlcjsKLQlDb2xsZWN0aW9uQWRkRXZlbnQgYWRkRXZlbnQ7Ci0JQ29sbGVjdGlvblJlbW92ZUV2ZW50IHJlbW92ZUV2ZW50OwotCUNvbGxlY3Rpb25DbGVhckV2ZW50IGNvbGxlY3Rpb25DbGVhcmVkRXZlbnQ7Ci0JQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gc2V0SG9sZGVyOwotCUNvbGxlY3Rpb25BZGRFdmVudCBzZXRBZGRFdmVudDsKLQlDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgc2V0UmVtb3ZlRXZlbnQ7Ci0JQ29sbGVjdGlvbkNsZWFyRXZlbnQgc2V0Q2xlYXJlZEV2ZW50OwotCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBzZXRDaGFuZ2VkRXZlbnQ7Ci0KLQlwdWJsaWMgU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQkJdGhpcy5zZXRIb2xkZXIgPSBuZXcgU2V0Q29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJY29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQljb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCXJldHVybiBjb2xsZWN0aW9uOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCS8vIGFkZCBhIGxpc3RlbmVyIHRvICJhY3RpdmF0ZSIgdGhlIHdyYXBwZXIKLQkJdGhpcy5zZXRIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNldENoYW5nZUxpc3RlbmVyKCkpOwotCi0JCXRoaXMudmVyaWZ5KHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImZvbyIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5zZXRIb2xkZXIsICJmb28iKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5KHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImZvbyIsICJmb28iLCAiYmFyIiwgImJhciIpOwotCQl0aGlzLnZlcmlmeSh0aGlzLnNldEhvbGRlciwgImZvbyIsICJiYXIiKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5jb2xsZWN0aW9uSG9sZGVyLCAiZm9vIiwgImZvbyIsICJiYXIiKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5zZXRIb2xkZXIsICJmb28iLCAiYmFyIik7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5KHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImZvbyIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5zZXRIb2xkZXIsICJmb28iKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5jb2xsZWN0aW9uSG9sZGVyLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5KHRoaXMuc2V0SG9sZGVyLCAiZm9vIik7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJLy8gYWRkIGEgbGlzdGVuZXIgdG8gImFjdGl2YXRlIiB0aGUgd3JhcHBlcgotCQl0aGlzLnNldEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkU2V0Q2hhbmdlTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuY29sbGVjdGlvbkhvbGRlci5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5zZXRIb2xkZXIuc2l6ZSgpKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuc2V0SG9sZGVyLnNpemUoKSk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuc2V0SG9sZGVyLnNpemUoKSk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuc2V0SG9sZGVyLnNpemUoKSk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuc2V0SG9sZGVyLnNpemUoKSk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2V0SG9sZGVyLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1bGtDaGFuZ2UoKSB7Ci0JCS8vIGFkZCBhIGxpc3RlbmVyIHRvICJhY3RpdmF0ZSIgdGhlIHdyYXBwZXIKLQkJdGhpcy5zZXRIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNldENoYW5nZUxpc3RlbmVyKCkpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBuZXdDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJmb3giKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImZveCIpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiYmF0Iik7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNldFZhbHVlcyhuZXdDb2xsZWN0aW9uKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5jb2xsZWN0aW9uSG9sZGVyLCAiZm94IiwgImZveCIsICJiYXQiKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5zZXRIb2xkZXIsICJmb3giLCAiYmF0Iik7Ci0JfQkJCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRTZXRDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNldEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCXRoaXMuc2V0SG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5zZXRIb2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKS5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV2ZW50czEoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRTZXRDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlFdmVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXZlbnRzMigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRTZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnRzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRXZlbnRzKCkgewotCQl0aGlzLmFkZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5yZW1vdmVFdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0QWRkRXZlbnQgPSBudWxsOwotCQl0aGlzLnNldFJlbW92ZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRDbGVhcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLnNldENoYW5nZWRFdmVudCA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50cygpIHsKLQkJdGhpcy5jbGVhckV2ZW50cygpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmFkZEV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsICJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnNldEFkZEV2ZW50LCB0aGlzLnNldEhvbGRlciwgImJhciIpOwotCi0JCXRoaXMuY2xlYXJFdmVudHMoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5yZW1vdmVFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLCAiZm9vIik7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRSZW1vdmVFdmVudCk7Ci0KLQkJdGhpcy5jbGVhckV2ZW50cygpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmFkZEV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsICJiYXIiKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNldEFkZEV2ZW50KTsKLQotCQl0aGlzLmNsZWFyRXZlbnRzKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMucmVtb3ZlRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuc2V0UmVtb3ZlRXZlbnQsIHRoaXMuc2V0SG9sZGVyLCAiZm9vIik7Ci0KLQkJdGhpcy5jbGVhckV2ZW50cygpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmFkZEV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnNldEFkZEV2ZW50LCB0aGlzLnNldEhvbGRlciwgImZvbyIpOwotCi0JCXRoaXMuY2xlYXJFdmVudHMoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmNsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZEV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuc2V0Q2xlYXJlZEV2ZW50LCB0aGlzLnNldEhvbGRlcik7Ci0KLQkJdGhpcy5jbGVhckV2ZW50cygpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gbmV3Q29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiZm94Iik7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJmb3giKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImJhdCIpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiYmF0Iik7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJiYXQiKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNldFZhbHVlcyhuZXdDb2xsZWN0aW9uKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImZveCIsICJmb3giLCAiYmF0IiwgImJhdCIsICJiYXQiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnNldENoYW5nZWRFdmVudCwgdGhpcy5zZXRIb2xkZXIsICJmb3giLCAiYmF0Iik7Ci0JCQotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmFkZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnJlbW92ZUV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuY29sbGVjdGlvbkNoYW5nZWRFdmVudCA9IGV2ZW50OwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5hZGRFdmVudCA9IGV2ZW50OwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnJlbW92ZUV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmNvbGxlY3Rpb25DbGVhcmVkRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFNldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRBZGRFdmVudCA9IGV2ZW50OwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRSZW1vdmVFdmVudCA9IGV2ZW50OwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0Q2xlYXJlZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0Q2hhbmdlZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZFNldENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEFkZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0UmVtb3ZlRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0Q2xlYXJlZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRDaGFuZ2VkRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5KENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY3ZtLCBTdHJpbmcuLi4gZXhwZWN0ZWRJdGVtcykgewotCQlCYWc8U3RyaW5nPiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKGN2bSk7Ci0JCUJhZzxTdHJpbmc+IGV4cGVjdGVkID0gQ29sbGVjdGlvblRvb2xzLmJhZyhleHBlY3RlZEl0ZW1zKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQsIE9iamVjdCBzb3VyY2UsIE9iamVjdC4uLiBleHBlY3RlZEl0ZW1zKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKGV4cGVjdGVkSXRlbXMpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGV2ZW50LmdldEl0ZW1zKCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50LCBPYmplY3Qgc291cmNlLCBPYmplY3QuLi4gZXhwZWN0ZWRJdGVtcykgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyhleHBlY3RlZEl0ZW1zKSwgQ29sbGVjdGlvblRvb2xzLmJhZyhldmVudC5nZXRJdGVtcygpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50LCBPYmplY3Qgc291cmNlKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCwgT2JqZWN0IHNvdXJjZSwgT2JqZWN0Li4uIGV4cGVjdGVkSXRlbXMpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcoZXhwZWN0ZWRJdGVtcyksIENvbGxlY3Rpb25Ub29scy5iYWcoZXZlbnQuZ2V0Q29sbGVjdGlvbigpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNlNGE3MC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBiYWdIb2xkZXI7Ci0JQ29sbGVjdGlvbkV2ZW50IGJhZ0V2ZW50OwotCVN0cmluZyBiYWdFdmVudFR5cGU7Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gc2V0SG9sZGVyOwotCUNvbGxlY3Rpb25FdmVudCBzZXRFdmVudDsKLQlTdHJpbmcgc2V0RXZlbnRUeXBlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFERCA9ICJhZGQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkUgPSAicmVtb3ZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFID0gImNoYW5nZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSID0gImNsZWFyIjsKLQotCQotCXB1YmxpYyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuYmFnSG9sZGVyID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZEJhZygpKTsKLQkJdGhpcy5zZXRIb2xkZXIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkU2V0KCkpOwotCX0KLQotCXByaXZhdGUgQmFnPFN0cmluZz4gYnVpbGRCYWcoKSB7Ci0JCUJhZzxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJdGhpcy5hZGRJdGVtc1RvKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBTZXQ8U3RyaW5nPiBidWlsZFNldCgpIHsKLQkJU2V0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQl0aGlzLmFkZEl0ZW1zVG8ocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSXRlbXNUbyhDb2xsZWN0aW9uPFN0cmluZz4gYykgewotCQljLmFkZCgiZm9vIik7Ci0JCWMuYWRkKCJiYXIiKTsKLQkJYy5hZGQoImJheiIpOwotCX0KLQotCXByaXZhdGUgQmFnPFN0cmluZz4gYnVpbGRBZGRJdGVtcygpIHsKLQkJQmFnPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJqb28iKTsKLQkJcmVzdWx0LmFkZCgiamFyIik7Ci0JCXJlc3VsdC5hZGQoImpheiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgQmFnPFN0cmluZz4gYnVpbGRSZW1vdmVJdGVtcygpIHsKLQkJQmFnPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmF6Iik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRCYWcoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmJhZ0hvbGRlci5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU2V0KCksIENvbGxlY3Rpb25Ub29scy5zZXQodGhpcy5zZXRIb2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZEJhZygpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5iYWdIb2xkZXIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFNldCgpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5zZXRIb2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBiYWdIb2xkZXJDb250YWlucyhPYmplY3QgaXRlbSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuYmFnSG9sZGVyLml0ZXJhdG9yKCksIGl0ZW0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzZXRIb2xkZXJDb250YWlucyhPYmplY3QgaXRlbSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuc2V0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBiYWdIb2xkZXJDb250YWluc0FsbChDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJhZ0hvbGRlci5pdGVyYXRvcigpLCBpdGVtcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNldEhvbGRlckNvbnRhaW5zQWxsKENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuc2V0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW1zKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYmFnSG9sZGVyQ29udGFpbnNBbnkoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCUJhZzxTdHJpbmc+IGJhZyA9IENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5iYWdIb2xkZXIuaXRlcmF0b3IoKSk7Ci0JCWZvciAoU3RyaW5nIHN0cmluZyA6IGl0ZW1zKSB7Ci0JCQlpZiAoYmFnLmNvbnRhaW5zKHN0cmluZykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNldEhvbGRlckNvbnRhaW5zQW55KENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlTZXQ8U3RyaW5nPiBzZXQgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuc2V0SG9sZGVyLml0ZXJhdG9yKCkpOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiBpdGVtcykgewotCQkJaWYgKHNldC5jb250YWlucyhzdHJpbmcpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMoImpvbyIpKTsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkKCJqb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKCJqb28iKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWlucyhudWxsKSk7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKG51bGwpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJqb28iKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZCgiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWlucygiam9vIikpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMobnVsbCkpOwotCQl0aGlzLnNldEhvbGRlci5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWlucyhudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWluc0FueSh0aGlzLmJ1aWxkQWRkSXRlbXMoKSkpOwotCQl0aGlzLmJhZ0hvbGRlci5hZGRBbGwodGhpcy5idWlsZEFkZEl0ZW1zKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnNBbGwodGhpcy5idWlsZEFkZEl0ZW1zKCkpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zQW55KHRoaXMuYnVpbGRBZGRJdGVtcygpKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZEFsbCh0aGlzLmJ1aWxkQWRkSXRlbXMoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWluc0FsbCh0aGlzLmJ1aWxkQWRkSXRlbXMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWdIb2xkZXJDb250YWlucygiYmFyIikpOwotCQl0aGlzLmJhZ0hvbGRlci5yZW1vdmUoImJhciIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKCJiYXIiKSk7Ci0KLQkJdGhpcy5iYWdIb2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMobnVsbCkpOwotCQl0aGlzLmJhZ0hvbGRlci5yZW1vdmUobnVsbCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMobnVsbCkpOwotCi0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWlucygiYmFyIikpOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmUoImJhciIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJiYXIiKSk7Ci0KLQkJdGhpcy5zZXRIb2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMobnVsbCkpOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmUobnVsbCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGwoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWdIb2xkZXJDb250YWluc0FsbCh0aGlzLmJ1aWxkUmVtb3ZlSXRlbXMoKSkpOwotCQl0aGlzLmJhZ0hvbGRlci5yZW1vdmVBbGwodGhpcy5idWlsZFJlbW92ZUl0ZW1zKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zQW55KHRoaXMuYnVpbGRSZW1vdmVJdGVtcygpKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zQWxsKHRoaXMuYnVpbGRSZW1vdmVJdGVtcygpKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLnJlbW92ZUFsbCh0aGlzLmJ1aWxkUmVtb3ZlSXRlbXMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnNBbnkodGhpcy5idWlsZFJlbW92ZUl0ZW1zKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWlucygiamFyIikpOwotCQl0aGlzLmJhZ0hvbGRlci5zZXRWYWx1ZXModGhpcy5idWlsZEFkZEl0ZW1zKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWdIb2xkZXJDb250YWlucygiamFyIikpOwotCi0JCXRoaXMuYmFnSG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5iYWdIb2xkZXIucmVtb3ZlKG51bGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKG51bGwpKTsKLQotCQl0aGlzLmJhZ0hvbGRlci5zZXRWYWx1ZXMobmV3IEhhc2hCYWc8U3RyaW5nPigpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWlucygiamFyIikpOwotCi0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWlucygiYmFyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJqYXIiKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLnNldFZhbHVlcyh0aGlzLmJ1aWxkQWRkSXRlbXMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJqYXIiKSk7Ci0KLQkJdGhpcy5zZXRIb2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMobnVsbCkpOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmUobnVsbCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMobnVsbCkpOwotCi0JCXRoaXMuc2V0SG9sZGVyLnNldFZhbHVlcyhuZXcgSGFzaEJhZzxTdHJpbmc+KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJqYXIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UxKCkgewotCQl0aGlzLmJhZ0hvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkQmFnTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5QmFnQ2hhbmdlKCk7Ci0KLQkJdGhpcy5zZXRIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNldExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVNldENoYW5nZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlMigpIHsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5idWlsZEJhZ0xpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUJhZ0NoYW5nZSgpOwotCi0JCXRoaXMuc2V0SG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRTZXRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlTZXRDaGFuZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5QmFnQ2hhbmdlKCkgewotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KEFERCwgImZvbyIpOwotCi0JCXRoaXMuYmFnRXZlbnQgPSBudWxsOwotCQl0aGlzLmJhZ0V2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoQURELCAiZm9vIik7Ci0KLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy52ZXJpZnlCYWdFdmVudChBREQsICJqb28iKTsKLQotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5hZGQobnVsbCk7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoQURELCBudWxsKTsKLQotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5hZGQobnVsbCk7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoQURELCBudWxsKTsKLQotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5yZW1vdmUoImpvbyIpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KFJFTU9WRSwgImpvbyIpOwotCi0JCXRoaXMuYmFnRXZlbnQgPSBudWxsOwotCQl0aGlzLmJhZ0V2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuYmFnSG9sZGVyLnJlbW92ZShudWxsKTsKLQkJdGhpcy52ZXJpZnlCYWdFdmVudChSRU1PVkUsIG51bGwpOwotCi0JCXRoaXMuYmFnRXZlbnQgPSBudWxsOwotCQl0aGlzLmJhZ0V2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuYmFnSG9sZGVyLnNldFZhbHVlcyh0aGlzLmJ1aWxkQmFnKCkpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KENIQU5HRSk7Ci0KLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkQWxsKHRoaXMuYnVpbGRCYWcoKSk7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoQUREKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRCYWcoKSwgQ29sbGVjdGlvblRvb2xzLmJhZygoKENvbGxlY3Rpb25BZGRFdmVudCkgdGhpcy5iYWdFdmVudCkuZ2V0SXRlbXMoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTZXRDaGFuZ2UoKSB7Ci0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZCgiZm9vIik7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudFR5cGUpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZCgiam9vIik7Ci0JCXRoaXMudmVyaWZ5U2V0RXZlbnQoQURELCAiam9vIik7Ci0KLQkJdGhpcy5zZXRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0RXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5zZXRIb2xkZXIuYWRkKCJqb28iKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNldEV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNldEV2ZW50VHlwZSk7Ci0KLQkJdGhpcy5zZXRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0RXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5zZXRIb2xkZXIuYWRkKG51bGwpOwotCQl0aGlzLnZlcmlmeVNldEV2ZW50KEFERCwgbnVsbCk7Ci0KLQkJdGhpcy5zZXRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0RXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5zZXRIb2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnRUeXBlKTsKLQotCQl0aGlzLnNldEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmUoImpvbyIpOwotCQl0aGlzLnZlcmlmeVNldEV2ZW50KFJFTU9WRSwgImpvbyIpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLnJlbW92ZSgiam9vIik7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudFR5cGUpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLnJlbW92ZShudWxsKTsKLQkJdGhpcy52ZXJpZnlTZXRFdmVudChSRU1PVkUsIG51bGwpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLnNldFZhbHVlcyh0aGlzLmJ1aWxkU2V0KCkpOwotCQl0aGlzLnZlcmlmeVNldEV2ZW50KENIQU5HRSk7Ci0KLQkJdGhpcy5zZXRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0RXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5zZXRIb2xkZXIuYWRkQWxsKHRoaXMuYnVpbGRTZXQoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudFR5cGUpOwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRCYWdMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJhZ0V2ZW50VHlwZSA9IEFERDsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnRUeXBlID0gUkVNT1ZFOwotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5iYWdFdmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnRUeXBlID0gQ0xFQVI7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJhZ0V2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnRUeXBlID0gQ0hBTkdFOwotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5iYWdFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZFNldExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0RXZlbnRUeXBlID0gQUREOwotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRFdmVudFR5cGUgPSBSRU1PVkU7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgewotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRFdmVudFR5cGUgPSBDTEVBUjsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0RXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRFdmVudFR5cGUgPSBDSEFOR0U7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5QmFnRXZlbnQoU3RyaW5nIGV2ZW50VHlwZSkgewotCQlhc3NlcnRFcXVhbHMoZXZlbnRUeXBlLCB0aGlzLmJhZ0V2ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhZ0hvbGRlciwgdGhpcy5iYWdFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYmFnRXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUJhZ0V2ZW50KFN0cmluZyBldmVudFR5cGUsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoZXZlbnRUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW0sIHRoaXMuZ2V0QmFnRXZlbnRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPD8+IGdldEJhZ0V2ZW50SXRlbXMoKSB7Ci0JCWlmICh0aGlzLmJhZ0V2ZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvbkFkZEV2ZW50KSB7Ci0JCQlyZXR1cm4gKChDb2xsZWN0aW9uQWRkRXZlbnQpIHRoaXMuYmFnRXZlbnQpLmdldEl0ZW1zKCk7Ci0JCX0gZWxzZSBpZiAodGhpcy5iYWdFdmVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb25SZW1vdmVFdmVudCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvblJlbW92ZUV2ZW50KSB0aGlzLmJhZ0V2ZW50KS5nZXRJdGVtcygpOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2V0RXZlbnQoU3RyaW5nIGV2ZW50VHlwZSkgewotCQlhc3NlcnRFcXVhbHMoZXZlbnRUeXBlLCB0aGlzLnNldEV2ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnNldEhvbGRlciwgdGhpcy5zZXRFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuc2V0RXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNldEV2ZW50KFN0cmluZyBldmVudFR5cGUsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMudmVyaWZ5U2V0RXZlbnQoZXZlbnRUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW0sIHRoaXMuZ2V0U2V0RXZlbnRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPD8+IGdldFNldEV2ZW50SXRlbXMoKSB7Ci0JCWlmICh0aGlzLnNldEV2ZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvbkFkZEV2ZW50KSB7Ci0JCQlyZXR1cm4gKChDb2xsZWN0aW9uQWRkRXZlbnQpIHRoaXMuc2V0RXZlbnQpLmdldEl0ZW1zKCk7Ci0JCX0gZWxzZSBpZiAodGhpcy5zZXRFdmVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb25SZW1vdmVFdmVudCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvblJlbW92ZUV2ZW50KSB0aGlzLnNldEV2ZW50KS5nZXRJdGVtcygpOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGRiODExLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXI7Ci0JTGlzdEV2ZW50IGV2ZW50OwotCVN0cmluZyBldmVudFR5cGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREID0gImFkZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRSA9ICJyZW1vdmUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBMQUNFID0gInJlcGxhY2UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT1ZFID0gIm1vdmUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBUiA9ICJjbGVhciI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRSA9ICJjaGFuZ2UiOwotCi0JCi0JcHVibGljIFNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5saXN0SG9sZGVyID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImZvbyIpOwotCQlyZXN1bHQuYWRkKCJiYXIiKTsKLQkJcmVzdWx0LmFkZCgiYmF6Iik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRBZGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImpvbyIpOwotCQlyZXN1bHQuYWRkKCJqYXIiKTsKLQkJcmVzdWx0LmFkZCgiamF6Iik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0vLwlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFJlbW92ZUxpc3QoKSB7Ci0vLwkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotLy8JCXJlc3VsdC5hZGQoImZvbyIpOwotLy8JCXJlc3VsdC5hZGQoImJhciIpOwotLy8JCXJldHVybiByZXN1bHQ7Ci0vLwl9Ci0vLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkTGlzdCgpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkTGlzdCgpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9ySW50KCkgewotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5idWlsZExpc3QoKS5saXN0SXRlcmF0b3IoMSkpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKDEpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkTGlzdCgpLnNpemUoKSwgdGhpcy5saXN0SG9sZGVyLnNpemUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGxpc3RDb250YWlucyhPYmplY3QgaXRlbSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubGlzdEhvbGRlci5saXN0SXRlcmF0b3IoKSwgaXRlbSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGxpc3RDb250YWluc0FsbChDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKCksIGl0ZW1zKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbGlzdENvbnRhaW5zQW55KENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlTZXQ8U3RyaW5nPiBzZXQgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMubGlzdEhvbGRlci5pdGVyYXRvcigpKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGl0ZW1zLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKHNldC5jb250YWlucyhzdHJlYW0ubmV4dCgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkT2JqZWN0KCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucygiam9vIikpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKCJqb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucygiam9vIikpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEludE9iamVjdCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMoImpvbyIpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgyLCAiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMoImpvbyIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMCwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWluc0FueSh0aGlzLmJ1aWxkQWRkTGlzdCgpKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRBbGwodGhpcy5idWlsZEFkZExpc3QoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnNBbGwodGhpcy5idWlsZEFkZExpc3QoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxJbnRDb2xsZWN0aW9uKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWluc0FueSh0aGlzLmJ1aWxkQWRkTGlzdCgpKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRBbGwoMiwgdGhpcy5idWlsZEFkZExpc3QoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnNBbGwodGhpcy5idWlsZEFkZExpc3QoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0SG9sZGVyLmlzRW1wdHkoKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5jbGVhcigpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdEhvbGRlci5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc09iamVjdCgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RIb2xkZXIuY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0SG9sZGVyLmNvbnRhaW5zKCJqb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsQ29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoImZvbyIpOwotCQljLmFkZCgiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0SG9sZGVyLmNvbnRhaW5zQWxsKGMpKTsKLQotCQljLmFkZCgiam9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdEhvbGRlci5jb250YWluc0FsbChjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRMaXN0KCkpLCB0aGlzLmxpc3RIb2xkZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RIb2xkZXIuZXF1YWxzKG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRBZGRMaXN0KCkpKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdEhvbGRlci5lcXVhbHModGhpcy5idWlsZExpc3QoKSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RIb2xkZXIuZXF1YWxzKG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW50KCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMubGlzdEhvbGRlci5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMubGlzdEhvbGRlci5nZXQoMSkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMubGlzdEhvbGRlci5nZXQoMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRMaXN0KCkpLmhhc2hDb2RlKCksIHRoaXMubGlzdEhvbGRlci5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZk9iamVjdCgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMubGlzdEhvbGRlci5pbmRleE9mKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmxpc3RIb2xkZXIuaW5kZXhPZigiYmFyIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5saXN0SG9sZGVyLmluZGV4T2YoImJheiIpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCB0aGlzLmxpc3RIb2xkZXIuaW5kZXhPZigiam9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SW5kZXhPZk9iamVjdCgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMubGlzdEhvbGRlci5sYXN0SW5kZXhPZigiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5saXN0SG9sZGVyLmxhc3RJbmRleE9mKCJiYXIiKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLmxpc3RIb2xkZXIubGFzdEluZGV4T2YoImJheiIpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCB0aGlzLmxpc3RIb2xkZXIubGFzdEluZGV4T2YoImpvbyIpKTsKLQotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMubGlzdEhvbGRlci5sYXN0SW5kZXhPZigiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0VtcHR5KCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RIb2xkZXIuaXNFbXB0eSgpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmNsZWFyKCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0SG9sZGVyLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucygiYmFyIikpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKHRoaXMuYnVpbGRMaXN0KCkuaW5kZXhPZigiYmFyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucygiYmFyIikpOwotCi0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlcygpIHsKLQkJTGlzdDxTdHJpbmc+IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbmV3TGlzdC5hZGQoImpvbyIpOwotCQluZXdMaXN0LmFkZCgiamFyIik7Ci0JCW5ld0xpc3QuYWRkKCJqYXoiKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zKCJqYXIiKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5zZXRMaXN0VmFsdWVzKG5ld0xpc3QpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucygiYmFyIikpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKCJqYXIiKSk7Ci0KLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgxLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUoMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zKG51bGwpKTsKLQotCQl0aGlzLmxpc3RIb2xkZXIuc2V0TGlzdFZhbHVlcyhuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zKCJqYXIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2UxKCkgewotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZENoYW5nZUxpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZTIoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RDaGFuZ2UoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgImpvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCwgMSwgImpvbyIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgbnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQURELCAxLCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDEpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFTU9WRSwgMSwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSgxKTsKLQkJdGhpcy52ZXJpZnlFdmVudChSRU1PVkUsIDEsICJqb28iKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuc2V0TGlzdFZhbHVlcyh0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJdGhpcy52ZXJpZnlFdmVudChDSEFOR0UpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRBbGwoMCwgdGhpcy5idWlsZExpc3QoKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQUREKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KCgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtcygpKSk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnNldCgwLCAiam9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoUkVQTEFDRSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucygoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQpLmdldE5ld0l0ZW1zKCksICJmb28iKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKCgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5ldmVudCkuZ2V0TmV3SXRlbXMoKSwgImpvbyIpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQUREOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gUkVNT1ZFOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBSRVBMQUNFOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBNT1ZFOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IENMRUFSOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBDSEFOR0U7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBBREQ7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IFJFTU9WRTsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBSRVBMQUNFOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IE1PVkU7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBDTEVBUjsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBDSEFOR0U7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoU3RyaW5nIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKGUsIHRoaXMuZXZlbnRUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdEhvbGRlciwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudC5nZXRMaXN0TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoU3RyaW5nIGUsIGludCBpbmRleCwgT2JqZWN0IGl0ZW0pIHsKLQkJdGhpcy52ZXJpZnlFdmVudChlKTsKLQkJaWYgKGUgPT0gQUREKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaW5kZXgsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyhpdGVtLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCX0gZWxzZSBpZiAoZSA9PSBSRU1PVkUpIHsKLQkJCWFzc2VydEVxdWFscyhpbmRleCwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQpLmdldEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGl0ZW0sICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkYmViZS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBvYmplY3RIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQotCQotCXB1YmxpYyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9iamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigiZm9vIik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTEoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTIoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2UoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoImZvbyIsICJiYXIiKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoImJhciIsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmF6Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQobnVsbCwgImJheiIpOwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm9iamVjdEhvbGRlciwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIHRoaXMuZXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgdGhpcy5ldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NjA3ZTguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJldmVyc2VDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPiBhZGFwdGVyOwotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiB3cmFwcGVkQ29sbGVjdGlvbkhvbGRlcjsKLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiB3cmFwcGVkQ29sbGVjdGlvbjsKLQotCQotCXB1YmxpYyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy53cmFwcGVkQ29sbGVjdGlvbik7Ci0JCXRoaXMuYWRhcHRlciA9IG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3QoQ29sbGVjdGlvbjxTdHJpbmc+IGV4cGVjdGVkLCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGFjdHVhbCkgewotCQl0aGlzLnZlcmlmeUxpc3QoZXhwZWN0ZWQsIGFjdHVhbCwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3QoQ29sbGVjdGlvbjxTdHJpbmc+IGV4cGVjdGVkLCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGFjdHVhbCwgQ29tcGFyYXRvcjxTdHJpbmc+IGNvbXBhcmF0b3IpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHNvcnRlZFNldCA9IG5ldyBUcmVlU2V0PFN0cmluZz4oY29tcGFyYXRvcik7Ci0JCXNvcnRlZFNldC5hZGRBbGwoZXhwZWN0ZWQpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHNvcnRlZFNldCk7Ci0JCUxpc3Q8U3RyaW5nPiBhY3R1YWxMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoYWN0dWFsLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRMaXN0LCBhY3R1YWxMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuYWRhcHRlci5zaXplKCkpOwotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgdGhpcy5hZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbSgpIHsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImphciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCB0aGlzLndyYXBwZWRDb2xsZWN0aW9uLnNpemUoKSk7Ci0KLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgc3luY2hDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbSgpIHsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXoiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImpheiIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJqYXoiKSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy53cmFwcGVkQ29sbGVjdGlvbi5zaXplKCkpOwotCi0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCB0aGlzLmFkYXB0ZXIpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc3luY2hMaXN0Lml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHN5bmNoQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaCgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiam9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiamF6Iik7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImpheiIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLndyYXBwZWRDb2xsZWN0aW9uLnNpemUoKSk7Ci0KLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHRoaXMuYWRhcHRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbXBhcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJQmFnPFN0cmluZz4gc3luY2hDb2xsZWN0aW9uID0gbmV3IENvb3JkaW5hdGVkQmFnPFN0cmluZz4odGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlcik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJmb28iKSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiam9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpheiIpOwotCQlhc3NlcnRFcXVhbHMoNiwgdGhpcy53cmFwcGVkQ29sbGVjdGlvbi5zaXplKCkpOwotCi0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCB0aGlzLmFkYXB0ZXIpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc3luY2hMaXN0Lml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHN5bmNoQ29sbGVjdGlvbik7Ci0KLQkJdGhpcy5hZGFwdGVyLnNldENvbXBhcmF0b3IobmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCB0aGlzLmFkYXB0ZXIsIG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc3luY2hMaXN0Lml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHN5bmNoQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgc3luY2hMaXN0KTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBjbCA9IG5ldyBDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRoaXMuYWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihjbCk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZSgpIHsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZyZWQiKTsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuc2V0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsiZm9vIiwgImJhciIsICJiYXoifSkpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5hZGFwdGVyLnNpemUoKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCB0aGlzLmFkYXB0ZXIpOwotCX0KLQotCWNsYXNzIFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjRmOTQ1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmV2ZXJzZUNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBsaXN0OwotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0TW9kZWw7Ci0JcHJpdmF0ZSBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPiBzb3J0ZWRMaXN0TW9kZWw7Ci0KLQkKLQlwdWJsaWMgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5saXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMubGlzdE1vZGVsID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5saXN0KTsKLQkJdGhpcy5zb3J0ZWRMaXN0TW9kZWwgPSBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4odGhpcy5saXN0TW9kZWwpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdChDb2xsZWN0aW9uPFN0cmluZz4gZXhwZWN0ZWQsIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYWN0dWFsKSB7Ci0JCXRoaXMudmVyaWZ5TGlzdChleHBlY3RlZCwgYWN0dWFsLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdChDb2xsZWN0aW9uPFN0cmluZz4gZXhwZWN0ZWQsIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYWN0dWFsLCBDb21wYXJhdG9yPFN0cmluZz4gY29tcGFyYXRvcikgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gc29ydGVkU2V0ID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihjb21wYXJhdG9yKTsKLQkJc29ydGVkU2V0LmFkZEFsbChleHBlY3RlZCk7Ci0JCUxpc3Q8U3RyaW5nPiBleHBlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oc29ydGVkU2V0KTsKLQkJTGlzdDxTdHJpbmc+IGFjdHVhbExpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChhY3R1YWwpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRMaXN0LCBhY3R1YWxMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQl0aGlzLnNvcnRlZExpc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImZvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJhciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5zb3J0ZWRMaXN0TW9kZWwuc2l6ZSgpKTsKLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMubGlzdCwgdGhpcy5zb3J0ZWRMaXN0TW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtKCkgewotCQlMaXN0PFN0cmluZz4gc29ydGVkU3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuc29ydGVkTGlzdE1vZGVsKTsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmxpc3RNb2RlbCk7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiZm9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiYmFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiYmF6Iik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiam9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiamFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCB0aGlzLmxpc3Quc2l6ZSgpKTsKLQotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5saXN0LCB0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmxpc3QsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnNvcnRlZExpc3RNb2RlbCksIHNvcnRlZFN5bmNoTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW0oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzb3J0ZWRTeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5zb3J0ZWRMaXN0TW9kZWwpOwotCQlMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMubGlzdE1vZGVsKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJmb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJiYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJiYXoiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqYXoiKTsKLQkJdGhpcy5saXN0TW9kZWwucmVtb3ZlKCJqYXoiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0LmNvbnRhaW5zKCJqYXoiKSk7Ci0JCXRoaXMubGlzdE1vZGVsLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdC5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5saXN0LnNpemUoKSk7Ci0KLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMubGlzdCwgdGhpcy5zb3J0ZWRMaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHModGhpcy5saXN0LCBzeW5jaExpc3QpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5zb3J0ZWRMaXN0TW9kZWwpLCBzb3J0ZWRTeW5jaExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbSgpIHsKLQkJTGlzdDxTdHJpbmc+IHNvcnRlZFN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JCUxpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5saXN0TW9kZWwpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdC5jb250YWlucygiZm9vIikpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJhciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJheiIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImphciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImpheiIpOwotCQlhc3NlcnRFcXVhbHMoNiwgdGhpcy5saXN0LnNpemUoKSk7Ci0JCXRoaXMubGlzdE1vZGVsLnNldCgzLCAidHR0Iik7Ci0JCXRoaXMubGlzdE1vZGVsLnNldCg0LCAieHh4Iik7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0LmNvbnRhaW5zKCJ4eHgiKSk7Ci0KLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMubGlzdCwgdGhpcy5zb3J0ZWRMaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHModGhpcy5saXN0LCBzeW5jaExpc3QpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5zb3J0ZWRMaXN0TW9kZWwpLCBzb3J0ZWRTeW5jaExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U3luY2goKSB7Ci0JCXRoaXMuc29ydGVkTGlzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImZvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJhciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJheiIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImphciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImpheiIpOwotCQl0aGlzLmxpc3RNb2RlbC5yZW1vdmUoImpheiIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3QuY29udGFpbnMoImpheiIpKTsKLQkJdGhpcy5saXN0TW9kZWwucmVtb3ZlKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLmxpc3Quc2l6ZSgpKTsKLQotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5saXN0LCB0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbXBhcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzb3J0ZWRTeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5zb3J0ZWRMaXN0TW9kZWwpOwotCQlMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMubGlzdE1vZGVsKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJiYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJiYXoiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHRoaXMubGlzdC5zaXplKCkpOwotCi0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLmxpc3QsIHRoaXMuc29ydGVkTGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdCwgc3luY2hMaXN0KTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuc29ydGVkTGlzdE1vZGVsKSwgc29ydGVkU3luY2hMaXN0KTsKLQotCQl0aGlzLnNvcnRlZExpc3RNb2RlbC5zZXRDb21wYXJhdG9yKG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCkpOwotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5saXN0LCB0aGlzLnNvcnRlZExpc3RNb2RlbCwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmxpc3QsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLnNvcnRlZExpc3RNb2RlbCkuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzb3J0ZWRTeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5zb3J0ZWRMaXN0TW9kZWwpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5zb3J0ZWRMaXN0TW9kZWwpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5zb3J0ZWRMaXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBzb3J0ZWRTeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuc29ydGVkTGlzdE1vZGVsKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgY2wgPSBuZXcgQ2hhbmdlQWRhcHRlcigpOwotCQl0aGlzLnNvcnRlZExpc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcihjbCk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLnNvcnRlZExpc3RNb2RlbCkuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLnNvcnRlZExpc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihjbCk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5zb3J0ZWRMaXN0TW9kZWwpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZSgpIHsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJmcmVkIik7Ci0JCXRoaXMuc29ydGVkTGlzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLmxpc3RNb2RlbC5zZXRMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsiZm9vIiwgImJhciIsICJiYXoifSkpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5zb3J0ZWRMaXN0TW9kZWwuc2l6ZSgpKTsKLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMubGlzdCwgdGhpcy5zb3J0ZWRMaXN0TW9kZWwpOwotCX0KLQotCWNsYXNzIFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIwZjU3ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gQ09MTEVDVElPTiA9IGJ1aWxkQ29sbGVjdGlvbigpOwotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImZvbyIpOwotCQlyZXN1bHQuYWRkKCJiYXIiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlcjsKLQotCi0JcHVibGljIFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oQ09MTEVDVElPTik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKGJ1aWxkQ29sbGVjdGlvbigpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCWFzc2VydEVxdWFscyhidWlsZENvbGxlY3Rpb24oKS5zaXplKCksIHRoaXMuY29sbGVjdGlvbkhvbGRlci5zaXplKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0xpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMGE0YWIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0xpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFN0YXRpY0xpc3RWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gTElTVCA9IGJ1aWxkTGlzdCgpOwotCXByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiZm9vIik7Ci0JCXJlc3VsdC5hZGQoImJhciIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyOwotCi0KLQlwdWJsaWMgU3RhdGljTGlzdFZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmxpc3RIb2xkZXIgPSBuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8U3RyaW5nPihMSVNUKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldCgpIHsKLQkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gYnVpbGRMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5saXN0SG9sZGVyLnNpemUoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0KGkpLCB0aGlzLmxpc3RIb2xkZXIuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKGJ1aWxkTGlzdCgpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKGJ1aWxkTGlzdCgpLnNpemUoKSwgdGhpcy5saXN0SG9sZGVyLnNpemUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNWE3MDAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY1ZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFN0YXRpY1ZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG9iamVjdEhvbGRlcjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBPQkpFQ1RfSE9MREVSID0gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCJmb28iKTsKLQotCQotCXB1YmxpYyBTdGF0aWNWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIgPSBPQkpFQ1RfSE9MREVSOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKHRoaXMub2JqZWN0SG9sZGVyLnRvU3RyaW5nKCkuaW5kZXhPZigiZm9vIikgPj0gMCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OTYzYmMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IHRyYW5zZm9ybWVkTGlzdEhvbGRlcjsKLQlMaXN0RXZlbnQgZXZlbnQ7Ci0JU3RyaW5nIGV2ZW50VHlwZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREQgPSAiYWRkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFID0gInJlbW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0UgPSAicmVwbGFjZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PVkUgPSAibW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSID0gImNsZWFyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFID0gImNoYW5nZSI7Ci0KLQotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5saXN0SG9sZGVyID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZExpc3QoKSk7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyID0gdGhpcy5idWlsZFRyYW5zZm9ybWVkTGlzdEhvbGRlcih0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmFyIik7Ci0JCXJlc3VsdC5hZGQoImJheiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkVHJhbnNmb3JtZWRMaXN0KCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm0odGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gdHJhbnNmb3JtKExpc3Q8U3RyaW5nPiBsaXN0KSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4obGlzdC5zaXplKCkpOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiBsaXN0KSB7Ci0JCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCQlyZXN1bHQuYWRkKG51bGwpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQuYWRkKHN0cmluZy50b1VwcGVyQ2FzZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkQWRkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJqb28iKTsKLQkJcmVzdWx0LmFkZCgiamFyIik7Ci0JCXJlc3VsdC5hZGQoImpheiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkVHJhbnNmb3JtZWRBZGRMaXN0KCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm0odGhpcy5idWlsZEFkZExpc3QoKSk7Ci0JfQotCi0vLwlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFJlbW92ZUxpc3QoKSB7Ci0vLwkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotLy8JCXJlc3VsdC5hZGQoImZvbyIpOwotLy8JCXJlc3VsdC5hZGQoImJhciIpOwotLy8JCXJldHVybiByZXN1bHQ7Ci0vLwl9Ci0vLwotLy8JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRUcmFuc2Zvcm1lZFJlbW92ZUxpc3QoKSB7Ci0vLwkJcmV0dXJuIHRoaXMudHJhbnNmb3JtKHRoaXMuYnVpbGRSZW1vdmVMaXN0KCkpOwotLy8JfQotLy8KLQlMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVHJhbnNmb3JtZWRMaXN0SG9sZGVyKExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbDxTdHJpbmcsIFN0cmluZz4obHZtKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtSXRlbV8oU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy50b1VwcGVyQ2FzZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFRyYW5zZm9ybWVkTGlzdCgpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YWxlVmFsdWVzKCkgewotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdGVuZXIoKTsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVHJhbnNmb3JtZWRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVHJhbnNmb3JtZWRMaXN0KCkuc2l6ZSgpLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKE9iamVjdCBpdGVtKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuaXRlcmF0b3IoKSwgaXRlbSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHRyYW5zZm9ybWVkTGlzdENvbnRhaW5zQWxsKENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW1zKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdHJhbnNmb3JtZWRMaXN0Q29udGFpbnNBbnkoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCUxpc3Q8U3RyaW5nPiB0cmFuc2Zvcm1lZExpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5pdGVyYXRvcigpKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGl0ZW1zLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKHRyYW5zZm9ybWVkTGlzdC5jb250YWlucyhzdHJlYW0ubmV4dCgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKCJKT08iKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMiwgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnMoIkpPTyIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgwLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsKCkgewotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zQW55KHRoaXMuYnVpbGRUcmFuc2Zvcm1lZEFkZExpc3QoKSkpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQWxsKDIsIHRoaXMuYnVpbGRBZGRMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnNBbGwodGhpcy5idWlsZFRyYW5zZm9ybWVkQWRkTGlzdCgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKCJCQVIiKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUodGhpcy5idWlsZExpc3QoKS5pbmRleE9mKCJiYXIiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnMoIkJBUiIpKTsKLQotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDEsIG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnMobnVsbCkpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZUdlbmVyaWMoKSB7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VOYW1lZCgpIHsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0Q2hhbmdlKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDEsICJqb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudChBREQsIDEsICJKT08iKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDEsIG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCwgMSwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSgxKTsKLQkJdGhpcy52ZXJpZnlFdmVudChSRU1PVkUsIDEsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUoMSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoUkVNT1ZFLCAxLCAiSk9PIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZEFsbCgwLCB0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJdGhpcy52ZXJpZnlFdmVudChBREQpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFRyYW5zZm9ybWVkTGlzdCgpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCgoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXMoKSkpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5zZXQoMCwgImpvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFUExBQ0UpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXROZXdJdGVtcygpLCAiRk9PIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucygoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQpLmdldE5ld0l0ZW1zKCksICJKT08iKSk7Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBBREQ7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBSRU1PVkU7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IFJFUExBQ0U7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IE1PVkU7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQ0xFQVI7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IENIQU5HRTsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFN0cmluZyB0eXBlKSB7Ci0JCWFzc2VydEVxdWFscyh0eXBlLCB0aGlzLmV2ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlciwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudC5nZXRMaXN0TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoU3RyaW5nIHR5cGUsIGludCBpbmRleCwgT2JqZWN0IGl0ZW0pIHsKLQkJdGhpcy52ZXJpZnlFdmVudCh0eXBlKTsKLQkJaWYgKHR5cGUgPT0gQUREKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaW5kZXgsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyhpdGVtLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCX0gZWxzZSBpZiAodHlwZSA9PSBSRU1PVkUpIHsKLQkJCWFzc2VydEVxdWFscyhpbmRleCwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQpLmdldEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGl0ZW0sICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCS8qCi0JCSAqIGFkZGluZyBsaXN0ZW5lcnMgdG8gdGhlIHRyYW5zZm9ybWVkIGxpc3Qgd2lsbCBjYXVzZSBsaXN0ZW5lcnMKLQkJICogdG8gYmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgbGlzdDsKLQkJICogbGlrZXdpc2UsIHJlbW92aW5nIGxpc3RlbmVycyBmcm9tIHRoZSB0cmFuc2Zvcm1lZCBsaXN0IHdpbGwKLQkJICogY2F1c2UgbGlzdGVuZXJzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBsaXN0Ci0JCSAqLwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBleGVjdXRlIHRoZSBzYW1lIHNldCBvZiB0ZXN0cyBhZ2FpbiwgYnV0IGJ5IHBhc3NpbmcgYSBUcmFuc2Zvcm1lciB0byB0aGUgYWRhcHRlcgotCSAqIChhcyBvcHBvc2VkIHRvIG92ZXJyaWRpbmcgI3RyYW5zZm9ybUl0ZW0oT2JqZWN0KSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRyYW5zZm9ybWVyVGVzdHMgZXh0ZW5kcyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMgewotCQlwdWJsaWMgVHJhbnNmb3JtZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIobmFtZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUcmFuc2Zvcm1lZExpc3RIb2xkZXIoTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm0pIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbDxTdHJpbmcsIFN0cmluZz4obHZtLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JCX0KLQkJcHJpdmF0ZSBUcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4gYnVpbGRUcmFuc2Zvcm1lcigpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+KCkgewotCQkJCXB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBzKSB7Ci0JCQkJCXJldHVybiAocyA9PSBudWxsKSA/IG51bGwgOiBzLnRvVXBwZXJDYXNlKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzcyNjA4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cwotCWV4dGVuZHMgVGVzdENhc2UKLXsKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBvYmplY3RIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgdHJhbnNmb3JtYXRpb25FdmVudDsKLQotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCJmb28iKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciA9IG5ldyBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZywgU3RyaW5nPih0aGlzLm9iamVjdEhvbGRlciwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCksIHRoaXMuYnVpbGRSZXZlcnNlVHJhbnNmb3JtZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4gYnVpbGRUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShTdHJpbmcgcykgewotCQkJCXJldHVybiAocyA9PSBudWxsKSA/IG51bGwgOiBzLnRvVXBwZXJDYXNlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4gYnVpbGRSZXZlcnNlVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+KCkgewotCQkJcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gKHMgPT0gbnVsbCkgPyBudWxsIDogcy50b0xvd2VyQ2FzZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgewotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnNldFZhbHVlKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCS8vIE5COiBvZGQgYmVoYXZpb3IoISkKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5zZXRWYWx1ZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJLy8gTkI6IG9kZCBiZWhhdmlvcighKQotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMSgpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTIoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJmb28iLCAiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLCAiRk9PIiwgIkJBUiIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmF6Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJiYXIiLCAiYmF6Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLCAiQkFSIiwgIkJBWiIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiRm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJiYXoiLCAiRm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLCAiQkFaIiwgIkZPTyIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiRk9PIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJGb28iLCAiRk9PIik7Ci0JCWFzc2VydE51bGwodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50KTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJGT08iLCBudWxsKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsICJGT08iLCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCBudWxsLCAiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLCBudWxsLCAiQkFSIik7Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQgZSwgT2JqZWN0IHNvdXJjZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIGUuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgZS5nZXROZXdWYWx1ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDb2xsZWN0aW9uQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDb2xsZWN0aW9uQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNmMyYzQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQ29sbGVjdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlZhbHVlQ29sbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBKdW5rIGp1bms7Ci0JcHJpdmF0ZSBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SnVuaz4ganVua0hvbGRlcjsKLQlwcml2YXRlIFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXI8SnVuaz4ganVua0hvbGRlcjI7Ci0KLQotCXB1YmxpYyBWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5qdW5rID0gbmV3IEp1bmsoImZvbyIpOwotCQl0aGlzLmp1bmtIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+KHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIgPSBuZXcgVmFsdWVDb2xsZWN0aW9uQWRhcHRlcjxKdW5rPih0aGlzLmp1bmtIb2xkZXIsIEp1bmsuU1RVRkZfQ09MTEVDVElPTik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXcmFwcGVkUFZNKCkgewotCQlKdW5rIGp1bmsyID0gbmV3IEp1bmsoImJhciIpOwotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCB0aGlzLmp1bmssIGp1bmsyKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rSG9sZGVyLnNldFZhbHVlKGp1bmsyKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZENoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMuanVua0hvbGRlcjIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVuay5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkFkZCgpIHsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMik7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rLmFkZFN0dWZmKCJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25SZW1vdmUoKSB7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIpOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVuay5yZW1vdmVTdHVmZigiZm9vIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCi0JY2xhc3MgTG9jYWxMaXN0ZW5lciBleHRlbmRzIENoYW5nZUFkYXB0ZXIgewotCQlwcml2YXRlIGJvb2xlYW4gZXZlbnRSZWNlaXZlZCA9IGZhbHNlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBzb3VyY2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG9sZFZhbHVlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBuZXdWYWx1ZTsKLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlKSB7Ci0JCQl0aGlzKHNvdXJjZSwgbnVsbCwgbnVsbCk7Ci0JCX0KLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotCQkJdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCX0KLQkJYm9vbGVhbiBldmVudFJlY2VpdmVkKCkgewotCQkJcmV0dXJuIHRoaXMuZXZlbnRSZWNlaXZlZDsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBKdW5rIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHN0dWZmOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RVRkZfQ09MTEVDVElPTiA9ICJzdHVmZiI7Ci0KLQkJcHVibGljIEp1bmsoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5zdHVmZiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJdGhpcy5zdHVmZi5hZGQoc3R1ZmZJdGVtKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBhZGRTdHVmZihTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oc3R1ZmZJdGVtLCB0aGlzLnN0dWZmLCBTVFVGRl9DT0xMRUNUSU9OKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oc3R1ZmZJdGVtLCB0aGlzLnN0dWZmLCBTVFVGRl9DT0xMRUNUSU9OKTsKLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiSnVuaygiICsgdGhpcy5zdHVmZiArICIpIjsKLQkJfQotCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlTGlzdEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlTGlzdEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTQ0N2E0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUxpc3RBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5WYWx1ZUxpc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVmFsdWVMaXN0QWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgSnVuayBqdW5rOwotCXByaXZhdGUgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+IGp1bmtIb2xkZXI7Ci0JcHJpdmF0ZSBWYWx1ZUxpc3RBZGFwdGVyPEp1bms+IGp1bmtIb2xkZXIyOwotCi0JCi0JcHVibGljIFZhbHVlTGlzdEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmp1bmsgPSBuZXcgSnVuaygiZm9vIik7Ci0JCXRoaXMuanVua0hvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SnVuaz4odGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMiA9IG5ldyBWYWx1ZUxpc3RBZGFwdGVyPEp1bms+KHRoaXMuanVua0hvbGRlciwgSnVuay5TVFVGRl9MSVNUKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdyYXBwZWRQVk0oKSB7Ci0JCUp1bmsganVuazIgPSBuZXcgSnVuaygiYmFyIik7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIHRoaXMuanVuaywganVuazIpOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZENoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmtIb2xkZXIuc2V0VmFsdWUoanVuazIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQl0aGlzLmp1bmtIb2xkZXIyLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVuay5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0QWRkKCkgewotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVuay5hZGRTdHVmZigiYmFyIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0UmVtb3ZlKCkgewotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVuay5yZW1vdmVTdHVmZigiZm9vIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0UmVwbGFjZSgpIHsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmsucmVwbGFjZVN0dWZmKCJmb28iLCAiYmFyIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCi0JY2xhc3MgTG9jYWxMaXN0ZW5lciBleHRlbmRzIENoYW5nZUFkYXB0ZXIgewotCQlwcml2YXRlIGJvb2xlYW4gZXZlbnRSZWNlaXZlZCA9IGZhbHNlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBzb3VyY2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG9sZFZhbHVlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBuZXdWYWx1ZTsKLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlKSB7Ci0JCQl0aGlzKHNvdXJjZSwgbnVsbCwgbnVsbCk7Ci0JCX0KLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotCQkJdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCX0KLQkJYm9vbGVhbiBldmVudFJlY2VpdmVkKCkgewotCQkJcmV0dXJuIHRoaXMuZXZlbnRSZWNlaXZlZDsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgSnVuayBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdHVmZjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUVUZGX0xJU1QgPSAic3R1ZmYiOwotCi0JCXB1YmxpYyBKdW5rKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMuc3R1ZmYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXRoaXMuc3R1ZmYuYWRkKHN0dWZmSXRlbSk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgYWRkU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KHN0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfTElTVCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVN0dWZmKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KHN0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfTElTVCk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgcmVwbGFjZVN0dWZmKFN0cmluZyBvbGRTdHVmZkl0ZW0sIFN0cmluZyBuZXdTdHVmZkl0ZW0pIHsKLQkJCXRoaXMucmVwbGFjZUl0ZW1Jbkxpc3Qob2xkU3R1ZmZJdGVtLCBuZXdTdHVmZkl0ZW0sIHRoaXMuc3R1ZmYsIFNUVUZGX0xJU1QpOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLnN0dWZmICsgIikiOwotCQl9Ci0JCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVQcm9wZXJ0eUFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlUHJvcGVydHlBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNmNWJlNi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVQcm9wZXJ0eUFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVmFsdWVQcm9wZXJ0eUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBWYWx1ZVByb3BlcnR5QWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgSnVuayBqdW5rOwotCXByaXZhdGUgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+IGp1bmtIb2xkZXI7Ci0JcHJpdmF0ZSBWYWx1ZVByb3BlcnR5QWRhcHRlcjxKdW5rPiBqdW5rSG9sZGVyMjsKLQotCi0JcHVibGljIFZhbHVlUHJvcGVydHlBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5qdW5rID0gbmV3IEp1bmsoImZvbyIpOwotCQl0aGlzLmp1bmtIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+KHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIgPSBuZXcgVmFsdWVQcm9wZXJ0eUFkYXB0ZXI8SnVuaz4odGhpcy5qdW5rSG9sZGVyLCBKdW5rLk5BTUVfUFJPUEVSVFkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V3JhcHBlZFBWTSgpIHsKLQkJSnVuayBqdW5rMiA9IG5ldyBKdW5rKCJiYXIiKTsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgdGhpcy5qdW5rLCBqdW5rMik7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVua0hvbGRlci5zZXRWYWx1ZShqdW5rMik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLmp1bmtIb2xkZXIyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVuay5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhKdW5rLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEp1bmsuTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoSnVuay5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZVByb3BlcnR5KCkgewotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVuay5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0KLQljbGFzcyBMb2NhbExpc3RlbmVyIGV4dGVuZHMgQ2hhbmdlQWRhcHRlciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBldmVudFJlY2VpdmVkID0gZmFsc2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IHNvdXJjZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb2xkVmFsdWU7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG5ld1ZhbHVlOwotCQlMb2NhbExpc3RlbmVyKE9iamVjdCBzb3VyY2UpIHsKLQkJCXRoaXMoc291cmNlLCBudWxsLCBudWxsKTsKLQkJfQotCQlMb2NhbExpc3RlbmVyKE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCQl0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7Ci0JCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZXZlbnRSZWNlaXZlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMub2xkVmFsdWUsIGUuZ2V0T2xkVmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5uZXdWYWx1ZSwgZS5nZXROZXdWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJfQotCQlib29sZWFuIGV2ZW50UmVjZWl2ZWQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ldmVudFJlY2VpdmVkOwotCQl9Ci0JfQotCi0JY2xhc3MgSnVuayBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQotCQlwdWJsaWMgSnVuayhTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiSnVuaygiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVTdGF0ZUFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlU3RhdGVBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIzNTgxMi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVTdGF0ZUFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVmFsdWVTdGF0ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBWYWx1ZVN0YXRlQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgSnVuayBqdW5rOwotCXByaXZhdGUgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+IGp1bmtIb2xkZXI7Ci0JcHJpdmF0ZSBWYWx1ZVN0YXRlQWRhcHRlcjxKdW5rPiBqdW5rSG9sZGVyMjsKLQotCi0JcHVibGljIFZhbHVlU3RhdGVBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5qdW5rID0gbmV3IEp1bmsoImZvbyIpOwotCQl0aGlzLmp1bmtIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+KHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIgPSBuZXcgVmFsdWVTdGF0ZUFkYXB0ZXI8SnVuaz4odGhpcy5qdW5rSG9sZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdyYXBwZWRQVk0oKSB7Ci0JCUp1bmsganVuazIgPSBuZXcgSnVuaygiYmFyIik7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIHRoaXMuanVuaywganVuazIpOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZENoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmtIb2xkZXIuc2V0VmFsdWUoanVuazIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVuay5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCi0JCXRoaXMuanVua0hvbGRlcjIucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VTdGF0ZSgpIHsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmsuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCi0JY2xhc3MgTG9jYWxMaXN0ZW5lciBleHRlbmRzIENoYW5nZUFkYXB0ZXIgewotCQlwcml2YXRlIGJvb2xlYW4gZXZlbnRSZWNlaXZlZCA9IGZhbHNlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBzb3VyY2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG9sZFZhbHVlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBuZXdWYWx1ZTsKLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlKSB7Ci0JCQl0aGlzKHNvdXJjZSwgbnVsbCwgbnVsbCk7Ci0JCX0KLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotCQkJdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCX0KLQkJYm9vbGVhbiBldmVudFJlY2VpdmVkKCkgewotCQkJcmV0dXJuIHRoaXMuZXZlbnRSZWNlaXZlZDsKLQkJfQotCX0KLQotCWNsYXNzIEp1bmsgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQkJcHVibGljIEp1bmsoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiSnVuaygiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOTY2YTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL0pwdFV0aWxpdHlNb2RlbFZhbHVlUHJlZnNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcml2YXRlIEpwdFV0aWxpdHlNb2RlbFZhbHVlUHJlZnNUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzMyZmVkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmczsKLQotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5Ob2RlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLk5vZGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmcy5QcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgUHJlZmVyZW5jZXNUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFByZWZlcmVuY2VzPiBub2RlSG9sZGVyOwotCVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBwcmVmZXJlbmNlQWRhcHRlcjsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50OwotCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0JYm9vbGVhbiBsaXN0ZW5lclJlbW92ZWQgPSBmYWxzZTsKLQlQcmVmZXJlbmNlQ2hhbmdlRXZlbnQgcHJlZmVyZW5jZUV2ZW50OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkFNRSA9ICJmb28iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfVkFMVUUgPSAib3JpZ2luYWwgc3RyaW5nIHZhbHVlIjsKLQotCXB1YmxpYyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUUsIFNUUklOR19WQUxVRSk7Ci0KLQkJdGhpcy5ub2RlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4odGhpcy50ZXN0Tm9kZSk7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIgPSBuZXcgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMubm9kZUhvbGRlciwgS0VZX05BTUUpOwotCQl0aGlzLmxpc3RlbmVyID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCWlmIChQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCAhPSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVuZXhwZWN0ZWQgdGhpcy5ldmVudDogIiArIGUpOwotCQkJCX0KLQkJCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YmplY3RIb2xkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQlTdHJpbmcgQU5PVEhFUl9TVFJJTkdfVkFMVUUgPSAic29tZSBvdGhlciB2YWx1ZSI7Ci0JCVByZWZlcmVuY2VzIGFub3RoZXJOb2RlID0gdGhpcy5jbGFzc05vZGUubm9kZSgiYW5vdGhlciB0ZXN0IG5vZGUiKTsKLQkJYW5vdGhlck5vZGUucHV0KEtFWV9OQU1FLCBBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0KLQkJdGhpcy5ub2RlSG9sZGVyLnNldFZhbHVlKGFub3RoZXJOb2RlKTsKLQkJdGhpcy52ZXJpZnlFdmVudChTVFJJTkdfVkFMVUUsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKEFOT1RIRVJfU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy52ZXJpZnlFdmVudChBTk9USEVSX1NUUklOR19WQUxVRSwgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0Tm9kZSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQobnVsbCwgU1RSSU5HX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJlZmVyZW5jZUNoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FLCBTVFJJTkdfVkFMVUUgKyBTVFJJTkdfVkFMVUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFNUUklOR19WQUxVRSwgU1RSSU5HX1ZBTFVFICsgU1RSSU5HX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSArIFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRlc3ROb2RlLnJlbW92ZShLRVlfTkFNRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoU1RSSU5HX1ZBTFVFICsgU1RSSU5HX1ZBTFVFLCBudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FLCBTVFJJTkdfVkFMVUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeUV2ZW50KG51bGwsIFNUUklOR19WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMudGVzdE5vZGUuZ2V0KEtFWV9OQU1FLCAiPG1pc3NpbmcgcHJlZmVyZW5jZT4iKSk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBBTk9USEVSX1NUUklOR19WQUxVRSA9ICJzb21lIG90aGVyIHZhbHVlIjsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5zZXRWYWx1ZShBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhBTk9USEVSX1NUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFOT1RIRVJfU1RSSU5HX1ZBTFVFLCB0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgIjxtaXNzaW5nIHByZWZlcmVuY2U+IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHRoaXMubm9kZUhhc0FueVByZWZMaXN0ZW5lcnModGhpcy50ZXN0Tm9kZSkpOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlSGFzQW55UHJlZkxpc3RlbmVycyh0aGlzLnRlc3ROb2RlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gdGhpcy5idWlsZENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHRoaXMubm9kZUhhc0FueVByZWZMaXN0ZW5lcnModGhpcy50ZXN0Tm9kZSkpOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZUhhc0FueVByZWZMaXN0ZW5lcnModGhpcy50ZXN0Tm9kZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJaWYgKFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ICE9IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCB0aGlzLmV2ZW50OiAiICsgZSk7Ci0JCQkJfQotCQkJCVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5kUmVBZGRQcmVmZXJlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMudGVzdE5vZGUuZ2V0KEtFWV9OQU1FLCBudWxsKSk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJLy8gcmVtb3ZlIHRoZSBwcmVmZXJlbmNlIGVudGlyZWx5Li4uCi0JCXRoaXMudGVzdE5vZGUucmVtb3ZlKEtFWV9OQU1FKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgbnVsbCkpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFNUUklOR19WQUxVRSwgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQotCQkvLyAuLi50aGVuIHJlLWFkZCBpdCB3aXRoIHRoZSBzYW1lIGtleQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUUsIFNUUklOR19WQUxVRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMudGVzdE5vZGUuZ2V0KEtFWV9OQU1FLCBudWxsKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQobnVsbCwgU1RSSU5HX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHJlYnVpbGQgdGhlIGFkYXB0ZXIgd2l0aCBhIGRlZmF1bHQgdmFsdWUKLQkJU3RyaW5nIERFRkFVTFRfVkFMVUUgPSAiZGVmYXVsdCB2YWx1ZSI7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyID0gbmV3IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLm5vZGVIb2xkZXIsIEtFWV9OQU1FLCBERUZBVUxUX1ZBTFVFKTsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsIG51bGwpKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQkvLyByZW1vdmUgdGhlIHByZWZlcmVuY2UgZW50aXJlbHkuLi4KLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmUoS0VZX05BTUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQlhc3NlcnROdWxsKHRoaXMudGVzdE5vZGUuZ2V0KEtFWV9OQU1FLCBudWxsKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoU1RSSU5HX1ZBTFVFLCBERUZBVUxUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKERFRkFVTFRfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJLy8gLi4udGhlbiByZS1hZGQgaXQgd2l0aCB0aGUgc2FtZSBrZXkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FLCBTVFJJTkdfVkFMVUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgbnVsbCkpOwotCQl0aGlzLnZlcmlmeUV2ZW50KERFRkFVTFRfVkFMVUUsIFNUUklOR19WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3luY2hyb25pemVkVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQkvLyByZW1vdmUgdGhlIHRoaXMubGlzdGVuZXIgc28gdGhlIGFkYXB0ZXIgbm8gbG9uZ2VyIGxpc3RlbnMgdG8gdGhlIHByZWZlcmVuY2UKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0KLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUUsIFNUUklOR19WQUxVRSArIFNUUklOR19WQUxVRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCS8vIG5vIHRoaXMuZXZlbnQgc2hvdWxkIGhhdmUgYmVlbiBmaXJlZC4uLgotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCQkvLyAuLi5hbmQgdGhlIGFkYXB0ZXIncyB2YWx1ZSBzaG91bGQgYmUgbnVsbAotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLnRlc3ROb2RlLnJlbW92ZShLRVlfTkFNRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FLCBTVFJJTkdfVkFMVUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJLy8gYWRkIHRoZSB0aGlzLmxpc3RlbmVyIHNvIHRoZSBhZGFwdGVyIHN5bmNocwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlclByZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG5vZGUgYW5kIGNvbnZlcnQgaXQgdG8gYW4gaW50ZWdlcgotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQotCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGludGVnZXJQcmVmZXJlbmNlQWRhcHRlciA9IG5ldyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+KHRoaXMubm9kZUhvbGRlciwgS0VZX05BTUUpOwotCQl0aGlzLnRlc3ROb2RlLnB1dEludChLRVlfTkFNRSwgMTIzKTsKLQkJaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyID0gUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbC5mb3JJbnRlZ2VyKHRoaXMudGVzdE5vZGUsIEtFWV9OQU1FLCAwKTsKLQkJaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEyMyksIGludGVnZXJQcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQl0aGlzLnRlc3ROb2RlLnB1dEludChLRVlfTkFNRSwgMjQ2KTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlFdmVudChpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIsIG5ldyBJbnRlZ2VyKDEyMyksIG5ldyBJbnRlZ2VyKDI0NikpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMjQ2KSwgaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudGVzdE5vZGUucmVtb3ZlKEtFWV9OQU1FKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlFdmVudChpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIsIG5ldyBJbnRlZ2VyKDI0NiksIG5ldyBJbnRlZ2VyKDApKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDApLCBpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50ZXN0Tm9kZS5wdXRJbnQoS0VZX05BTUUsIDEyMyk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyLCBuZXcgSW50ZWdlcigwKSwgbmV3IEludGVnZXIoMTIzKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMjMpLCBpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBhIHNpdHVhdGlvbiB3aGVyZQotCSAqIC0gd2UgYXJlIGxpc3RlbmluZyB0byB0aGUgbm9kZSB3aGVuIGl0IGdldHMgcmVtb3ZlZCBmcm9tIHRoZSBwcmVmZXJlbmNlcyAicmVwb3NpdG9yeSIKLQkgKiAtIHdlIGdldCBub3RpZmljYXRpb24gdGhhdCBpdCBoYXMgYmVlbiByZW1vdmVkCi0JICogLSB3ZSB0cnkgdG8gcmVtb3ZlIG91ciB0aGlzLmxpc3RlbmVyCi0JICogLSB0aGUgbm9kZSB3aWxsIHRocm93IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiAtIHRoZSBhZGFwdGVyIHNob3VsZCBoYW5kbGUgaXQgT0suLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTm9kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJUHJlZmVyZW5jZXMgcGFyZW50ID0gdGhpcy50ZXN0Tm9kZS5wYXJlbnQoKTsKLQkJcGFyZW50LmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkUGFyZW50Tm9kZUNoYW5nZUxpc3RlbmVyKCkpOwotCQl0aGlzLnRlc3ROb2RlLnJlbW92ZU5vZGUoKTsKLQkJdGhpcy50ZXN0Tm9kZS5mbHVzaCgpOwkJLy8gdGhpcyBzZWVtcyB0byBiZSByZXF1aXJlZCBmb3IgdGhlIHRoaXMuZXZlbnQgdG8gdHJpZ2dlci4uLgotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCi0JCWFzc2VydFRydWUodGhpcy5saXN0ZW5lclJlbW92ZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQlwcml2YXRlIE5vZGVDaGFuZ2VMaXN0ZW5lciBidWlsZFBhcmVudE5vZGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBOb2RlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGlsZEFkZGVkKE5vZGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCB0aGlzLmV2ZW50OiAiICsgZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjaGlsZFJlbW92ZWQoTm9kZUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5nZXRDaGlsZCgpID09IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLnRlc3ROb2RlKSB7Ci0JCQkJCVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLnByZWZlcmVuY2VBZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5saXN0ZW5lcik7Ci0JCQkJCS8vIHRoaXMgbGluZSBvZiBjb2RlIHdpbGwgbm90IGV4ZWN1dGUgaWYgdGhlIGxpbmUgYWJvdmUgdHJpZ2dlcnMgYW4gZXhjZXB0aW9uCi0JCQkJCVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmxpc3RlbmVyUmVtb3ZlZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTYW1lVmFsdWUoKSB7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcmVmZXJlbmNlRXZlbnQpOwotCQl0aGlzLnRlc3ROb2RlLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkpOwotCi0JCVN0cmluZyBBTk9USEVSX1NUUklOR19WQUxVRSA9ICJzb21lIG90aGVyIHZhbHVlIjsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5zZXRWYWx1ZShBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0KLQkJdGhpcy52ZXJpZnlFdmVudChTVFJJTkdfVkFMVUUsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlQcmVmZXJlbmNlRXZlbnQoQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCi0JCS8vIG5vdyBzZXQgdG8gKnNhbWUqIHZhbHVlIC0gbm90aGluZyBzaG91bGQgaGFwcGVuLi4uCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnByZWZlcmVuY2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuc2V0VmFsdWUoQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCi0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcmVmZXJlbmNlRXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTYW1lVmFsdWVGb3JjZVBhc3NUaHJvdWdoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcmVmZXJlbmNlRXZlbnQpOwotCi0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyID0gbmV3IEFsd2F5c1VwZGF0ZVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLm5vZGVIb2xkZXIsIEtFWV9OQU1FKTsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0KLQkJdGhpcy50ZXN0Tm9kZS5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpKTsKLQotCQlTdHJpbmcgQU5PVEhFUl9TVFJJTkdfVkFMVUUgPSAic29tZSBvdGhlciB2YWx1ZSI7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuc2V0VmFsdWUoQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCi0JCXRoaXMudmVyaWZ5RXZlbnQoU1RSSU5HX1ZBTFVFLCBBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5UHJlZmVyZW5jZUV2ZW50KEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQotCQkvLyBub3cgc2V0IHRvICpzYW1lKiB2YWx1ZSAtIG9ubHkgb25lIHRoaXMuZXZlbnQgc2hvdWxkIGZpcmUKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMucHJlZmVyZW5jZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5zZXRWYWx1ZShBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlQcmVmZXJlbmNlRXZlbnQoQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCX0KLQotCXByaXZhdGUgUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByZWZlcmVuY2VDaGFuZ2UoUHJlZmVyZW5jZUNoYW5nZUV2ZW50IGV2dCkgewotCQkJCVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLnByZWZlcmVuY2VFdmVudCA9IGV2dDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoTW9kZWwgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnRFcXVhbHMoc291cmNlLCB0aGlzLmV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvbGRWYWx1ZSwgdGhpcy5ldmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCB0aGlzLmV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByZWZlcmVuY2VFdmVudChPYmplY3QgbmV3VmFsdWUpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnByZWZlcmVuY2VFdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3ROb2RlLCB0aGlzLnByZWZlcmVuY2VFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhLRVlfTkFNRSwgdGhpcy5wcmVmZXJlbmNlRXZlbnQuZ2V0S2V5KCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIHRoaXMucHJlZmVyZW5jZUV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIHRoaXMudGVzdE5vZGUuZ2V0KEtFWV9OQU1FLCAiPG1pc3NpbmcgcHJlZmVyZW5jZT4iKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKFByZWZlcmVuY2VzIG5vZGUpIHRocm93cyBFeGNlcHRpb24gewotCQlQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXJbXSBwcmVmTGlzdGVuZXJzID0gKFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcltdKSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShub2RlLCAicHJlZkxpc3RlbmVycyIpOwotCQlyZXR1cm4gcHJlZkxpc3RlbmVycy5sZW5ndGggPiAwOwotCX0KLQotCi0JLyoqCi0JICogVXNlIHRoaXMgYWRhcHRlciB0byB0ZXN0IG91dCBhbHdheXMgcGFzc2luZyB0aHJvdWdoIHRoZSBuZXcgdmFsdWUKLQkgKiB0byB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIEFsd2F5c1VwZGF0ZVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4gZXh0ZW5kcyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+IHsKLQotCQlBbHdheXNVcGRhdGVQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4gcHJlZmVyZW5jZXNIb2xkZXIsIFN0cmluZyBrZXkpIHsKLQkJCXN1cGVyKHByZWZlcmVuY2VzSG9sZGVyLCBrZXkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBib29sZWFuIHByZWZlcmVuY2VJc1RvQmVTZXQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU1MzQ5ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5Ob2RlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLk5vZGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnMuUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnMuUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgUHJlZmVyZW5jZXNUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGV4cGVjdGVkVmFsdWVzOwotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4gbm9kZUhvbGRlcjsKLQlQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gcHJlZmVyZW5jZXNBZGFwdGVyOwotCUNvbGxlY3Rpb25FdmVudCBldmVudDsKLQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGl0ZW1MaXN0ZW5lcjsKLQlib29sZWFuIGxpc3RlbmVyUmVtb3ZlZCA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkFNRV8xID0gImZvbyAxIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05BTUVfMiA9ICJmb28gMiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OQU1FXzMgPSAiZm9vIDMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfVkFMVUVfMSA9ICJvcmlnaW5hbCBzdHJpbmcgdmFsdWUgMSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19WQUxVRV8yID0gIm9yaWdpbmFsIHN0cmluZyB2YWx1ZSAyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX1ZBTFVFXzMgPSAib3JpZ2luYWwgc3RyaW5nIHZhbHVlIDMiOwotCi0JcHVibGljIFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmV4cGVjdGVkVmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FXzEsIFNUUklOR19WQUxVRV8xKTsJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoS0VZX05BTUVfMSwgU1RSSU5HX1ZBTFVFXzEpOwotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRV8yLCBTVFJJTkdfVkFMVUVfMik7CXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEtFWV9OQU1FXzIsIFNUUklOR19WQUxVRV8yKTsKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUVfMywgU1RSSU5HX1ZBTFVFXzMpOwl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChLRVlfTkFNRV8zLCBTVFJJTkdfVkFMVUVfMyk7Ci0KLQkJdGhpcy5ub2RlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4odGhpcy50ZXN0Tm9kZSk7Ci0JCXRoaXMucHJlZmVyZW5jZXNBZGFwdGVyID0gbmV3IFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLm5vZGVIb2xkZXIpOwotCQl0aGlzLmxpc3RlbmVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLml0ZW1MaXN0ZW5lciA9IHRoaXMuYnVpbGRJdGVtTGlzdGVuZXIoKTsKLQkJdGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5saXN0ZW5lcik7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJdGhpcy5sb2dFdmVudChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCQl0aGlzLmxvZ0V2ZW50KGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCXRoaXMubG9nRXZlbnQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQl0aGlzLmxvZ0V2ZW50KGUpOwotCQkJfQotCQkJcHJpdmF0ZSB2b2lkIGxvZ0V2ZW50KENvbGxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ICE9IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCB0aGlzLmV2ZW50OiAiICsgZSk7Ci0JCQkJfQotCQkJCVByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRJdGVtTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHRoaXMuZXZlbnQ6ICIgKyBlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViamVjdEhvbGRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkYXB0ZXIodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCVN0cmluZyBBTk9USEVSX0tFWV9OQU1FXzEgPSAiYW5vdGhlciBrZXkgMSI7Ci0JCVN0cmluZyBBTk9USEVSX0tFWV9OQU1FXzIgPSAiYW5vdGhlciBrZXkgMiI7Ci0JCVN0cmluZyBBTk9USEVSX0tFWV9OQU1FXzMgPSAiYW5vdGhlciBrZXkgMyI7Ci0JCVN0cmluZyBBTk9USEVSX1NUUklOR19WQUxVRV8xID0gImFub3RoZXIgc3RyaW5nIHZhbHVlIDEiOwotCQlTdHJpbmcgQU5PVEhFUl9TVFJJTkdfVkFMVUVfMiA9ICJhbm90aGVyIHN0cmluZyB2YWx1ZSAyIjsKLQkJU3RyaW5nIEFOT1RIRVJfU1RSSU5HX1ZBTFVFXzMgPSAiYW5vdGhlciBzdHJpbmcgdmFsdWUgMyI7Ci0JCVByZWZlcmVuY2VzIGFub3RoZXJOb2RlID0gdGhpcy5jbGFzc05vZGUubm9kZSgiYW5vdGhlciB0ZXN0IG5vZGUiKTsKLQkJdGhpcy5leHBlY3RlZFZhbHVlcy5jbGVhcigpOwotCQlhbm90aGVyTm9kZS5wdXQoQU5PVEhFUl9LRVlfTkFNRV8xLCBBTk9USEVSX1NUUklOR19WQUxVRV8xKTsJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoQU5PVEhFUl9LRVlfTkFNRV8xLCBBTk9USEVSX1NUUklOR19WQUxVRV8xKTsKLQkJYW5vdGhlck5vZGUucHV0KEFOT1RIRVJfS0VZX05BTUVfMiwgQU5PVEhFUl9TVFJJTkdfVkFMVUVfMik7CXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEFOT1RIRVJfS0VZX05BTUVfMiwgQU5PVEhFUl9TVFJJTkdfVkFMVUVfMik7Ci0JCWFub3RoZXJOb2RlLnB1dChBTk9USEVSX0tFWV9OQU1FXzMsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFXzMpOwl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChBTk9USEVSX0tFWV9OQU1FXzMsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFXzMpOwotCi0JCXRoaXMubm9kZUhvbGRlci5zZXRWYWx1ZShhbm90aGVyTm9kZSk7Ci0JCS8vIGNvbGxlY3Rpb25DaGFuZ2VkIGRvZXMgbm90IHBhc3MgYW55IGl0ZW1zIGluIHRoZSB0aGlzLmV2ZW50Ci0JCXRoaXMudmVyaWZ5RXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLmNsZWFyKCk7Ci0JCXRoaXMubm9kZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy52ZXJpZnlFdmVudCgpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE5vZGUpOwotCQl0aGlzLnZlcmlmeUV2ZW50KCk7Ci0JCXRoaXMuZXhwZWN0ZWRWYWx1ZXMuY2xlYXIoKTsKLQkJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoS0VZX05BTUVfMSwgU1RSSU5HX1ZBTFVFXzEpOwotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChLRVlfTkFNRV8yLCBTVFJJTkdfVkFMVUVfMik7Ci0JCXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEtFWV9OQU1FXzMsIFNUUklOR19WQUxVRV8zKTsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUHJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkYXB0ZXIodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCVN0cmluZyBBTk9USEVSX0tFWV9OQU1FID0gImFub3RoZXIga2V5IjsKLQkJU3RyaW5nIEFOT1RIRVJfU1RSSU5HX1ZBTFVFID0gImFub3RoZXIgc3RyaW5nIHZhbHVlIjsKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoQU5PVEhFUl9LRVlfTkFNRSwgQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGV4cGVjdGVkSXRlbXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJZXhwZWN0ZWRJdGVtcy5wdXQoQU5PVEhFUl9LRVlfTkFNRSwgQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCQl0aGlzLnZlcmlmeUV2ZW50KGV4cGVjdGVkSXRlbXMpOwotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChBTk9USEVSX0tFWV9OQU1FLCBBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVByZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQl0aGlzLnRlc3ROb2RlLnJlbW92ZShLRVlfTkFNRV8yKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIsIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgKChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQpLmdldEl0ZW1zU2l6ZSgpKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCVN0cmluZyBrZXkgPSAoKFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPikgKChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpLmdldEtleSgpOwotCQlhc3NlcnRFcXVhbHMoS0VZX05BTUVfMiwga2V5KTsKLQotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLnJlbW92ZShLRVlfTkFNRV8yKTsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlUHJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkYXB0ZXIodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCVN0cmluZyBESUZGRVJFTlQgPSAic29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50IjsKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUVfMiwgRElGRkVSRU5UKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEtFWV9OQU1FXzIsIERJRkZFUkVOVCk7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU5vZGUodGhpcy50ZXN0Tm9kZSk7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBhIHNpdHVhdGlvbiB3aGVyZQotCSAqIC0gd2UgYXJlIGxpc3RlbmluZyB0byB0aGUgbm9kZSB3aGVuIGl0IGdldHMgcmVtb3ZlZCBmcm9tIHRoZSBwcmVmZXJlbmNlcyAicmVwb3NpdG9yeSIKLQkgKiAtIHdlIGdldCBub3RpZmljYXRpb24gdGhhdCBpdCBoYXMgYmVlbiByZW1vdmVkCi0JICogLSB3ZSB0cnkgdG8gcmVtb3ZlIG91ciB0aGlzLmxpc3RlbmVyCi0JICogLSB0aGUgbm9kZSB3aWxsIHRocm93IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiAtIHRoZSBhZGFwdGVyIHNob3VsZCBoYW5kbGUgaXQgT0suLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTm9kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJUHJlZmVyZW5jZXMgcGFyZW50ID0gdGhpcy50ZXN0Tm9kZS5wYXJlbnQoKTsKLQkJcGFyZW50LmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkUGFyZW50Tm9kZUNoYW5nZUxpc3RlbmVyKCkpOwotCQl0aGlzLnRlc3ROb2RlLnJlbW92ZU5vZGUoKTsKLQkJdGhpcy50ZXN0Tm9kZS5mbHVzaCgpOwkJLy8gdGhpcyBzZWVtcyB0byBiZSByZXF1aXJlZCBmb3IgdGhlIHRoaXMuZXZlbnQgdG8gdHJpZ2dlci4uLgotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCi0JCWFzc2VydFRydWUodGhpcy5saXN0ZW5lclJlbW92ZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgTm9kZUNoYW5nZUxpc3RlbmVyIGJ1aWxkUGFyZW50Tm9kZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE5vZGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoaWxkQWRkZWQoTm9kZUNoYW5nZUV2ZW50IGUpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHRoaXMuZXZlbnQ6ICIgKyBlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoaWxkUmVtb3ZlZChOb2RlQ2hhbmdlRXZlbnQgZSkgewotCQkJCWlmIChlLmdldENoaWxkKCkgPT0gUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMudGVzdE5vZGUpIHsKLQkJCQkJUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmxpc3RlbmVyKTsKLQkJCQkJLy8gdGhpcyBsaW5lIG9mIGNvZGUgd2lsbCBub3QgZXhlY3V0ZSBpZiB0aGUgbGluZSBhYm92ZSB0cmlnZ2VycyBhbiBleGNlcHRpb24KLQkJCQkJUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMubGlzdGVuZXJSZW1vdmVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlSGFzQW55UHJlZkxpc3RlbmVycyh0aGlzLnRlc3ROb2RlKSk7Ci0JCXRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMubGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKHRoaXMudGVzdE5vZGUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjIgPSB0aGlzLmJ1aWxkQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMubm9kZUhhc0FueVByZWZMaXN0ZW5lcnModGhpcy50ZXN0Tm9kZSkpOwotCQl0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKHRoaXMudGVzdE5vZGUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQl0aGlzLmxvZ0V2ZW50KGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7Ci0JCQkJdGhpcy5sb2dFdmVudChlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCXRoaXMubG9nRXZlbnQoZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJCXRoaXMubG9nRXZlbnQoZSk7Ci0JCQl9Ci0JCQlwcml2YXRlIHZvaWQgbG9nRXZlbnQoQ29sbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgIT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHRoaXMuZXZlbnQ6ICIgKyBlKTsKLQkJCQl9Ci0JCQkJUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChNYXA8U3RyaW5nLCBTdHJpbmc+IGl0ZW1zKSB7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW1zLnNpemUoKSwgKChDb2xsZWN0aW9uQWRkRXZlbnQpIHRoaXMuZXZlbnQpLmdldEl0ZW1zU2l6ZSgpKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUl0ZXJhYmxlPFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPj4gZXZlbnRJdGVtcyA9IChJdGVyYWJsZTxQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4+KSAoKENvbGxlY3Rpb25BZGRFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXMoKTsKLQkJdGhpcy52ZXJpZnlJdGVtcyhpdGVtcywgZXZlbnRJdGVtcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIsIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlOb2RlKFByZWZlcmVuY2VzIG5vZGUpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmdbXSBrZXlzID0gbm9kZS5rZXlzKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV4cGVjdGVkVmFsdWVzLnNpemUoKSwga2V5cy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmV4cGVjdGVkVmFsdWVzLmdldChrZXlzW2ldKSwgbm9kZS5nZXQoa2V5c1tpXSwgIjxtaXNzaW5nIHByZWZlcmVuY2U+IikpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUFkYXB0ZXIoUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGN2bSkgewotCQlhc3NlcnRFcXVhbHModGhpcy5leHBlY3RlZFZhbHVlcy5zaXplKCksIGN2bS5zaXplKCkpOwotCQl0aGlzLnZlcmlmeUl0ZW1zKHRoaXMuZXhwZWN0ZWRWYWx1ZXMsIGN2bSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUl0ZW1zKE1hcDxTdHJpbmcsIFN0cmluZz4gZXhwZWN0ZWQsIEl0ZXJhYmxlPFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPj4gYWN0dWFsKSB7Ci0JCWZvciAoUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG1vZGVsIDogYWN0dWFsKSB7Ci0JCQltb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5pdGVtTGlzdGVuZXIpOwotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldChtb2RlbC5nZXRLZXkoKSksIG1vZGVsLmdldFZhbHVlKCkpOwotCQkJbW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuaXRlbUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBub2RlSGFzQW55UHJlZkxpc3RlbmVycyhQcmVmZXJlbmNlcyBub2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyW10gcHJlZkxpc3RlbmVycyA9IChQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXJbXSkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUobm9kZSwgInByZWZMaXN0ZW5lcnMiKTsKLQkJcmV0dXJuIHByZWZMaXN0ZW5lcnMubGVuZ3RoID4gMDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc1Rlc3RDYXNlLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZXNUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWUyYzc0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc1Rlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmczsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuQWJzdHJhY3RQcmVmZXJlbmNlczsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXM7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotLyoqCi0gKiBzZXQgdXAgYW5kIHRlYXIgZG93biBhIHRlc3Qgbm9kZSBmb3IgYW55IHN1YmNsYXNzIHRoYXQKLSAqIG5lZWRzIHRvIHRlc3QgcHJlZmVyZW5jZXMtcmVsYXRlZCBzdHVmZgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcmVmZXJlbmNlc1Rlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBjbGFzc05vZGU7Ci0JcHVibGljIFByZWZlcmVuY2VzIHRlc3ROb2RlOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTk9ERV9OQU1FID0gInRlc3Qgbm9kZSI7Ci0KLQlwdWJsaWMgUHJlZmVyZW5jZXNUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlQcmVmZXJlbmNlcyBwYWNrYWdlTm9kZSA9IFByZWZlcmVuY2VzLnVzZXJOb2RlRm9yUGFja2FnZSh0aGlzLmdldENsYXNzKCkpOwotCQl0aGlzLmNsYXNzTm9kZSA9IHBhY2thZ2VOb2RlLm5vZGUodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCS8vIGNsZWFuIG91dCBhbnkgbGVmdG92ZXIgY3JhcC4uLgotCQlpZiAoKHRoaXMuY2xhc3NOb2RlLmtleXMoKS5sZW5ndGggPiAwKSB8fCAodGhpcy5jbGFzc05vZGUuY2hpbGRyZW5OYW1lcygpLmxlbmd0aCA+IDApKSB7Ci0JCQl0aGlzLmNsYXNzTm9kZS5yZW1vdmVOb2RlKCk7Ci0JCQkvLyAuLi5hbmQgcmUtY3JlYXRlIHRoZSBub2RlCi0JCQl0aGlzLmNsYXNzTm9kZSA9IHBhY2thZ2VOb2RlLm5vZGUodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCX0KLQkJdGhpcy50ZXN0Tm9kZSA9IHRoaXMuY2xhc3NOb2RlLm5vZGUoVEVTVF9OT0RFX05BTUUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHdhaXQgZm9yIGFsbCB0aGUgZXZlbnRzIHRvIGJlIGRlbGl2ZXJlZCBiZWZvcmUgdGVhcmluZyBkb3duCi0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCVByZWZlcmVuY2VzIG5vZGUgPSB0aGlzLmNsYXNzTm9kZS5wYXJlbnQoKTsKLQkJdGhpcy5jbGFzc05vZGUucmVtb3ZlTm9kZSgpOwotCQl3aGlsZSAodGhpcy5ub2RlSXNWZXN0aWdpYWwobm9kZSkpIHsKLQkJCVByZWZlcmVuY2VzIHBhcmVudCA9IG5vZGUucGFyZW50KCk7Ci0JCQlub2RlLnJlbW92ZU5vZGUoKTsKLQkJCW5vZGUgPSBwYXJlbnQ7Ci0JCX0KLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBub2RlSXNWZXN0aWdpYWwoUHJlZmVyZW5jZXMgbm9kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiAobm9kZSAhPSBudWxsKQotCQkJJiYgKG5vZGUua2V5cygpLmxlbmd0aCA9PSAwKQotCQkJJiYgKG5vZGUuY2hpbGRyZW5OYW1lcygpLmxlbmd0aCA9PSAwKQotCQkJJiYgKG5vZGUgIT0gUHJlZmVyZW5jZXMudXNlclJvb3QoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgd2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCkgewotCQl3aGlsZSAoICEgdGhpcy5wcmVmZXJlbmNlc0V2ZW50UXVldWUoKS5pc0VtcHR5KCkpIHsKLQkJCVRlc3RUb29scy5zbGVlcCgxMDApOwotCQl9Ci0JCVRlc3RUb29scy5zbGVlcCgxMDApOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxFdmVudE9iamVjdD4gcHJlZmVyZW5jZXNFdmVudFF1ZXVlKCkgewotCQlyZXR1cm4gKExpc3Q8RXZlbnRPYmplY3Q+KSBSZWZsZWN0aW9uVG9vbHMuZ2V0U3RhdGljRmllbGRWYWx1ZShBYnN0cmFjdFByZWZlcmVuY2VzLmNsYXNzLCAiZXZlbnRRdWV1ZSIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NoZWNrQm94TW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZDlhMDMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NoZWNrQm94TW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkJ1dHRvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkV2ZW50TGlzdGVuZXJMaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkNoZWNrQm94TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2hlY2tCb3hNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlcjsKLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGJ1dHRvbk1vZGVsQWRhcHRlcjsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0KLQlwdWJsaWMgQ2hlY2tCb3hNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmJvb2xlYW5Ib2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSk7Ci0JCXRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyID0gbmV3IENoZWNrQm94TW9kZWxBZGFwdGVyKHRoaXMuYm9vbGVhbkhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNlbGVjdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLnNldFNlbGVjdGVkKGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdGhpcy5ib29sZWFuSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlDaGVja0JveE1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRUcnVlKHRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCXRoaXMuYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQl0aGlzLmJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5ib29sZWFuSG9sZGVyLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGxvY2FsQm9vbGVhbkhvbGRlciA9IChTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4pIHRoaXMuYm9vbGVhbkhvbGRlcjsKLQkJYXNzZXJ0RmFsc2UobG9jYWxCb29sZWFuSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxvY2FsQm9vbGVhbkhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIpOwotCi0JCXRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobG9jYWxCb29sZWFuSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoT2JqZWN0IG1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRXZlbnRMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0ID0gKEV2ZW50TGlzdGVuZXJMaXN0KSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShtb2RlbCwgImxpc3RlbmVyTGlzdCIpOwotCQlhc3NlcnRFcXVhbHMoMCwgbGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpLmxlbmd0aCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhPYmplY3QgbW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlFdmVudExpc3RlbmVyTGlzdCBsaXN0ZW5lckxpc3QgPSAoRXZlbnRMaXN0ZW5lckxpc3QpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKG1vZGVsLCAibGlzdGVuZXJMaXN0Iik7Ci0JCWFzc2VydEZhbHNlKGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckxpc3QoKS5sZW5ndGggPT0gMCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzcyAqKioqKioqKioqCi0JcHJpdmF0ZSBjbGFzcyBUZXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lciB7Ci0JCVRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmYWE0Mi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZExheW91dDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5JdGVtRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuSXRlbUxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkJ1dHRvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNoZWNrQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuV2luZG93Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuQ2hlY2tCb3hNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIGNoZWNrIGJveGVzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdCB7Ci0KLQlwcml2YXRlIFRlc3RNb2RlbCB0ZXN0TW9kZWw7Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdGVzdE1vZGVsSG9sZGVyOwotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnMUhvbGRlcjsKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZmxhZzJIb2xkZXI7Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IG5vdEZsYWcySG9sZGVyOwotCXByaXZhdGUgQnV0dG9uTW9kZWwgZmxhZzFCdXR0b25Nb2RlbDsKLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGZsYWcyQnV0dG9uTW9kZWw7Ci0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBub3RGbGFnMkJ1dHRvbk1vZGVsOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdCgpLmV4ZWMoKTsKLQl9Ci0KLQlwcml2YXRlIENoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCh0cnVlLCB0cnVlKTsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4odGhpcy50ZXN0TW9kZWwpOwotCQl0aGlzLmZsYWcxSG9sZGVyID0gdGhpcy5idWlsZEZsYWcxSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5mbGFnMUJ1dHRvbk1vZGVsID0gdGhpcy5idWlsZENoZWNrQm94TW9kZWxBZGFwdGVyKHRoaXMuZmxhZzFIb2xkZXIpOwotCQl0aGlzLmZsYWcySG9sZGVyID0gdGhpcy5idWlsZEZsYWcySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5mbGFnMkJ1dHRvbk1vZGVsID0gdGhpcy5idWlsZENoZWNrQm94TW9kZWxBZGFwdGVyKHRoaXMuZmxhZzJIb2xkZXIpOwotCQl0aGlzLm5vdEZsYWcySG9sZGVyID0gdGhpcy5idWlsZE5vdEZsYWcySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5ub3RGbGFnMkJ1dHRvbk1vZGVsID0gdGhpcy5idWlsZENoZWNrQm94TW9kZWxBZGFwdGVyKHRoaXMubm90RmxhZzJIb2xkZXIpOwotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRGbGFnMUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHZtLCBUZXN0TW9kZWwuRkxBRzFfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNGbGFnMSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzEodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEZsYWcySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHZtKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4odm0sIFRlc3RNb2RlbC5GTEFHMl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0ZsYWcyKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRGbGFnMih2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkTm90RmxhZzJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdm0pIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBCb29sZWFuPih2bSwgVGVzdE1vZGVsLk5PVF9GTEFHMl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc05vdEZsYWcyKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXROb3RGbGFnMih2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBidWlsZENoZWNrQm94TW9kZWxBZGFwdGVyKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlcikgewotCQlyZXR1cm4gbmV3IENoZWNrQm94TW9kZWxBZGFwdGVyKGJvb2xlYW5Ib2xkZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQlKRnJhbWUgd2luZG93ID0gbmV3IEpGcmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJd2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXdpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXdpbmRvdy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmJ1aWxkTWFpblBhbmVsKCksICJDZW50ZXIiKTsKLQkJd2luZG93LnNldFNpemUoNDAwLCAxMDApOwotCQl3aW5kb3cuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIGJ1aWxkV2luZG93TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2luZG93QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJZS5nZXRXaW5kb3coKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE1haW5QYW5lbCgpIHsKLQkJSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ2hlY2tCb3hQYW5lbCgpLCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDb250cm9sUGFuZWwoKSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENoZWNrQm94UGFuZWwoKSB7Ci0JCUpQYW5lbCB0YXNrTGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRGbGFnMUNoZWNrQm94KCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkRmxhZzJDaGVja0JveCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZE5vdEZsYWcyQ2hlY2tCb3goKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRVbmF0dGFjaGVkQ2hlY2tCb3goKSk7Ci0JCXJldHVybiB0YXNrTGlzdFBhbmVsOwotCX0KLQotCXByaXZhdGUgSkNoZWNrQm94IGJ1aWxkRmxhZzFDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgpOwotCQljaGVja0JveC5zZXRUZXh0KCJmbGFnIDEiKTsKLQkJY2hlY2tCb3guc2V0TW9kZWwodGhpcy5mbGFnMUJ1dHRvbk1vZGVsKTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgSkNoZWNrQm94IGJ1aWxkRmxhZzJDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgpOwotCQljaGVja0JveC5zZXRUZXh0KCJmbGFnIDIiKTsKLQkJY2hlY2tCb3guc2V0TW9kZWwodGhpcy5mbGFnMkJ1dHRvbk1vZGVsKTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgSkNoZWNrQm94IGJ1aWxkTm90RmxhZzJDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgpOwotCQljaGVja0JveC5zZXRUZXh0KCJub3QgZmxhZyAyIik7Ci0JCWNoZWNrQm94LnNldE1vZGVsKHRoaXMubm90RmxhZzJCdXR0b25Nb2RlbCk7Ci0JCXJldHVybiBjaGVja0JveDsKLQl9Ci0KLQlwcml2YXRlIEpDaGVja0JveCBidWlsZFVuYXR0YWNoZWRDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgidW5hdHRhY2hlZCIpOwotCQljaGVja0JveC5nZXRNb2RlbCgpLmFkZEl0ZW1MaXN0ZW5lcih0aGlzLmJ1aWxkVW5hdHRhY2hlZEl0ZW1MaXN0ZW5lcigpKTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgSXRlbUxpc3RlbmVyIGJ1aWxkVW5hdHRhY2hlZEl0ZW1MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJdGVtTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtU3RhdGVDaGFuZ2VkKEl0ZW1FdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmF0dGFjaGVkIHN0YXRlIGNoYW5nZWQ6ICIgKyBlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRGbGlwRmxhZzFCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc3RvcmVNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRGbGlwRmxhZzFCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkRmxpcEZsYWcxQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkRmxpcEZsYWcxQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJmbGlwIGZsYWcgMSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuZmxpcEZsYWcxKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgZmxpcEZsYWcxKCkgewotCQl0aGlzLnRlc3RNb2RlbC5zZXRGbGFnMSggISB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcxKCkpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZENsZWFyTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZENsZWFyTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImNsZWFyIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzdG9yZSBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRQcmludE1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUHJpbnRNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicHJpbnQgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBwcmludE1vZGVsKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImZsYWcgMTogIiArIHRoaXMudGVzdE1vZGVsLmlzRmxhZzEoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZmxhZyAyOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMigpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJub3QgZmxhZyAyOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNOb3RGbGFnMigpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioiKTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgYm9vbGVhbiBmbGFnMTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUcxX1BST1BFUlRZID0gImZsYWcxIjsKLQkJcHJpdmF0ZSBib29sZWFuIGZsYWcyOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBRzJfUFJPUEVSVFkgPSAiZmxhZzIiOwotCQlwcml2YXRlIGJvb2xlYW4gbm90RmxhZzI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRkxBRzJfUFJPUEVSVFkgPSAibm90RmxhZzIiOwotCQotCQlwdWJsaWMgVGVzdE1vZGVsKGJvb2xlYW4gZmxhZzEsIGJvb2xlYW4gZmxhZzIpIHsKLQkJCXRoaXMuZmxhZzEgPSBmbGFnMTsKLQkJCXRoaXMuZmxhZzIgPSBmbGFnMjsKLQkJCXRoaXMubm90RmxhZzIgPSAhIGZsYWcyOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRmxhZzEoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMShib29sZWFuIGZsYWcxKSB7Ci0JCQlib29sZWFuIG9sZCA9IHRoaXMuZmxhZzE7Ci0JCQl0aGlzLmZsYWcxID0gZmxhZzE7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzFfUFJPUEVSVFksIG9sZCwgZmxhZzEpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRmxhZzIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMihib29sZWFuIGZsYWcyKSB7Ci0JCQlib29sZWFuIG9sZCA9IHRoaXMuZmxhZzI7Ci0JCQl0aGlzLmZsYWcyID0gZmxhZzI7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzJfUFJPUEVSVFksIG9sZCwgZmxhZzIpOwotCQotCQkJb2xkID0gdGhpcy5ub3RGbGFnMjsKLQkJCXRoaXMubm90RmxhZzIgPSAhIGZsYWcyOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5PVF9GTEFHMl9QUk9QRVJUWSwgb2xkLCB0aGlzLm5vdEZsYWcyKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc05vdEZsYWcyKCkgewotCQkJcmV0dXJuIHRoaXMubm90RmxhZzI7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Tm90RmxhZzIoYm9vbGVhbiBub3RGbGFnMikgewotCQkJdGhpcy5zZXRGbGFnMiggISBub3RGbGFnMik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbCgiICsgdGhpcy5pc0ZsYWcxKCkgKyAiIC0gIiArIHRoaXMuaXNGbGFnMigpICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkxNjExNS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZheC5zd2luZy5Db21ib0JveE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuQ29tYm9Cb3hNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLkRpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZy5TaW1wbGVEaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29vcmRpbmF0ZWRMaXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb21ib0JveE1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIENvbWJvQm94TW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJLy8gbm90aGluZyB5ZXQuLi4KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBub3RoaW5nIHlldC4uLgotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8RGlzcGxheWFibGU+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0aW9uSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KGxpc3RIb2xkZXIuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShzZWxlY3Rpb25Ib2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJQ29tYm9Cb3hNb2RlbCBjb21ib0JveE1vZGVsID0gbmV3IENvbWJvQm94TW9kZWxBZGFwdGVyKGxpc3RIb2xkZXIsIHNlbGVjdGlvbkhvbGRlcik7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZShzZWxlY3Rpb25Ib2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMoY29tYm9Cb3hNb2RlbCk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PERpc3BsYXlhYmxlPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PERpc3BsYXlhYmxlPihjb21ib0JveE1vZGVsKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQlzZWxlY3Rpb25Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZShzZWxlY3Rpb25Ib2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGNvbWJvQm94TW9kZWwpOwotCi0JCWNvbWJvQm94TW9kZWwucmVtb3ZlTGlzdERhdGFMaXN0ZW5lcihzeW5jaExpc3QpOwotCQlzZWxlY3Rpb25Ib2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHNlbGVjdGlvbkhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhjb21ib0JveE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7Ci0JCQkJLy8gZG8gbm90aGluZy4uLgotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhMaXN0TW9kZWwgbGlzdE1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBoYXNOb0xpc3RlbmVycyA9ICgoQm9vbGVhbikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QobGlzdE1vZGVsLCAiaGFzTm9MaXN0RGF0YUxpc3RlbmVycyIpKS5ib29sZWFuVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShoYXNOb0xpc3RlbmVycyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhMaXN0TW9kZWwgbGlzdE1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBoYXNMaXN0ZW5lcnMgPSAoKEJvb2xlYW4pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKGxpc3RNb2RlbCwgImhhc0xpc3REYXRhTGlzdGVuZXJzIikpLmJvb2xlYW5WYWx1ZSgpOwotCQlhc3NlcnRUcnVlKGhhc0xpc3RlbmVycyk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxEaXNwbGF5YWJsZT4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPERpc3BsYXlhYmxlPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8RGlzcGxheWFibGU+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxEaXNwbGF5YWJsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RGlzcGxheWFibGU+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb248RGlzcGxheWFibGU+IGMpIHsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJmb28iKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiYmFyIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImJheiIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJqb28iKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiamFyIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImpheiIpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db21ib0JveE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMTJiMzguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkNvbWJvQm94TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tYm9Cb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLlVJTWFuYWdlcjsKLWltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkNvbWJvQm94TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZy5GaWx0ZXJpbmdMaXN0QnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuTGlzdENob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLlNpbXBsZUxpc3RDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIGNvbWJvLWJveGVzLgotICogCi0gKiBEZWZhdWx0TG9uZ0xpc3RCcm93c2VyRGlhbG9nVUlUZXN0IHN1YmNsYXNzZXMgdGhpcyBjbGFzczsgc28gYmUKLSAqIGNhcmVmdWwgd2hlbiBtYWtpbmcgY2hhbmdlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QgewotCi0JcHJvdGVjdGVkIEpGcmFtZSB3aW5kb3c7Ci0JcHJpdmF0ZSBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHRlc3RNb2RlbEhvbGRlcjsKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBjb2xvckhvbGRlcjsKLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gY29sb3JMaXN0SG9sZGVyOwotCXByb3RlY3RlZCBDb21ib0JveE1vZGVsIGNvbG9yQ29tYm9Cb3hNb2RlbDsKLQlwcml2YXRlIGludCBuZXh0Q29sb3JOdW1iZXIgPSAwOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdCgpLmV4ZWMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlYygpIHRocm93cyBFeGNlcHRpb24gewotCQlVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwoVUlNYW5hZ2VyLmdldFN5c3RlbUxvb2tBbmRGZWVsQ2xhc3NOYW1lKCkpOwotLy8JCVVJTWFuYWdlci5zZXRMb29rQW5kRmVlbChVSU1hbmFnZXIuZ2V0Q3Jvc3NQbGF0Zm9ybUxvb2tBbmRGZWVsQ2xhc3NOYW1lKCkpOwkvLyBNZXRhbCBMQUYKLS8vCQlVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwoY29tLnN1bi5qYXZhLnN3aW5nLnBsYWYud2luZG93cy5XaW5kb3dzTG9va0FuZEZlZWwuY2xhc3MuZ2V0TmFtZSgpKTsKLS8vCQlVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwoY29tLnN1bi5qYXZhLnN3aW5nLnBsYWYubW90aWYuTW90aWZMb29rQW5kRmVlbC5jbGFzcy5nZXROYW1lKCkpOwotLy8JCVVJTWFuYWdlci5zZXRMb29rQW5kRmVlbChvcmFjbGUuYmFsaS5ld3Qub2xhZi5PcmFjbGVMb29rQW5kRmVlbC5jbGFzcy5nZXROYW1lKCkpOwotCQl0aGlzLnRlc3RNb2RlbCA9IHRoaXMuYnVpbGRUZXN0TW9kZWwoKTsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4odGhpcy50ZXN0TW9kZWwpOwotCQl0aGlzLmNvbG9ySG9sZGVyID0gdGhpcy5idWlsZENvbG9ySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5jb2xvckxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkQ29sb3JMaXN0SG9sZGVyKCk7Ci0JCXRoaXMuY29sb3JDb21ib0JveE1vZGVsID0gdGhpcy5idWlsZENvbWJvQm94TW9kZWxBZGFwdGVyKHRoaXMuY29sb3JMaXN0SG9sZGVyLCB0aGlzLmNvbG9ySG9sZGVyKTsKLQkJdGhpcy5vcGVuV2luZG93KCk7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRDb2xvckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIE9iamVjdD4odm0sIFRlc3RNb2RlbC5DT0xPUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q29sb3IoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRDb2xvcigoU3RyaW5nKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFRlc3RNb2RlbCBidWlsZFRlc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0TW9kZWwoKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb2xvckxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPihUZXN0TW9kZWwudmFsaWRDb2xvcnMoKSk7Ci0vLwkJcmV0dXJuIG5ldyBBYnN0cmFjdFJlYWRPbmx5TGlzdFZhbHVlTW9kZWwoKSB7Ci0vLwkJCXB1YmxpYyBPYmplY3QgdmFsdWUoKSB7Ci0vLwkJCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yKFRlc3RNb2RlbC5WQUxJRF9DT0xPUlMpOwotLy8JCQl9Ci0vLwkJCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLS8vCQkJCXJldHVybiBUZXN0TW9kZWwuVkFMSURfQ09MT1JTLmxlbmd0aDsKLS8vCQkJfQotLy8JCX07Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gdWlDb2xvckxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbG9yTGlzdEhvbGRlcjsKLQl9Ci0KLQlwcml2YXRlIENvbWJvQm94TW9kZWwgYnVpbGRDb21ib0JveE1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIsIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBzZWxlY3Rpb25Ib2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBDb21ib0JveE1vZGVsQWRhcHRlcihsaXN0SG9sZGVyLCBzZWxlY3Rpb25Ib2xkZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQl0aGlzLndpbmRvdyA9IG5ldyBKRnJhbWUodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCXRoaXMud2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXRoaXMud2luZG93LmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMuYnVpbGRXaW5kb3dMaXN0ZW5lcigpKTsKLQkJdGhpcy53aW5kb3cuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5idWlsZE1haW5QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCXRoaXMud2luZG93LnNldExvY2F0aW9uKDMwMCwgMzAwKTsKLQkJdGhpcy53aW5kb3cuc2V0U2l6ZSg0MDAsIDE1MCk7Ci0JCXRoaXMud2luZG93LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciBidWlsZFdpbmRvd0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCWUuZ2V0V2luZG93KCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRNYWluUGFuZWwoKSB7Ci0JCUpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbWJvQm94UGFuZWwoKSwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKCksIEJvcmRlckxheW91dC5TT1VUSCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJvdGVjdGVkIEpQYW5lbCBidWlsZENvbWJvQm94UGFuZWwoKSB7Ci0JCUpQYW5lbCBwYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQlwYW5lbC5hZGQodGhpcy5idWlsZENvbWJvQm94KCkpOwotCQlwYW5lbC5hZGQodGhpcy5idWlsZENvbWJvQm94KCkpOwotCQlwYW5lbC5hZGQodGhpcy5idWlsZExpc3RDaG9vc2VyMSgpKTsKLQkJcGFuZWwuYWRkKHRoaXMuYnVpbGRMaXN0Q2hvb3NlcjIoKSk7Ci0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEpDb21ib0JveCBidWlsZENvbWJvQm94KCkgewotCQlKQ29tYm9Cb3ggY29tYm9Cb3ggPSBuZXcgSkNvbWJvQm94KHRoaXMuY29sb3JDb21ib0JveE1vZGVsKTsKLQkJY29tYm9Cb3guc2V0UmVuZGVyZXIodGhpcy5idWlsZENvbWJvQm94UmVuZGVyZXIoKSk7Ci0JCXJldHVybiBjb21ib0JveDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENlbGxSZW5kZXJlciBidWlsZENvbWJvQm94UmVuZGVyZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdENlbGxSZW5kZXJlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFRleHQoT2JqZWN0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmJ1aWxkVGV4dCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hvb3NlciBidWlsZExpc3RDaG9vc2VyMSgpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbExpc3RDaG9vc2VyMSh0aGlzLmNvbG9yQ29tYm9Cb3hNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hvb3NlciBidWlsZExpc3RDaG9vc2VyMigpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbExpc3RDaG9vc2VyMih0aGlzLmNvbG9yQ29tYm9Cb3hNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRDb250cm9sUGFuZWwoKSB7Ci0JCUpQYW5lbCBjb250cm9sUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDIsIDApKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzZXRDb2xvckJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRQcmludE1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRBZGRUZW5CdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlbW92ZVRlbkJ1dHRvbigpKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlc2V0IGNvbG9yIGJ1dHRvbiAqKioqKioqKioqCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzZXRDb2xvckJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXNldENvbG9yQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzZXRDb2xvckFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzZXQgY29sb3IiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc2V0Q29sb3IoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXNldENvbG9yKCkgewotCQl0aGlzLnRlc3RNb2RlbC5zZXRDb2xvcihUZXN0TW9kZWwuREVGQVVMVF9DT0xPUik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjbGVhciBtb2RlbCBidXR0b24gKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZENsZWFyTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZENsZWFyTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImNsZWFyIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiByZXN0b3JlIG1vZGVsIGJ1dHRvbiAqKioqKioqKioqCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzdG9yZSBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBwcmludCBtb2RlbCBidXR0b24gKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFByaW50TW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUHJpbnRNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFByaW50TW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInByaW50IG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5wcmludE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcHJpbnRNb2RlbCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGFkZCAyMCBidXR0b24gKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZEFkZFRlbkJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRBZGRUZW5BY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRBZGRUZW5BY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImFkZCAyMCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuYWRkVGVuKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgYWRkVGVuKCkgewotCQlmb3IgKGludCBpID0gdGhpcy5uZXh0Q29sb3JOdW1iZXI7IGkgPCB0aGlzLm5leHRDb2xvck51bWJlciArIDIwOyBpKyspIHsKLQkJCXRoaXMuY29sb3JMaXN0SG9sZGVyLmFkZCh0aGlzLmNvbG9yTGlzdEhvbGRlci5zaXplKCksICJjb2xvciIgKyBpKTsKLQkJfQotCQl0aGlzLm5leHRDb2xvck51bWJlciArPSAyMDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlbW92ZSAyMCBidXR0b24gKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlbW92ZVRlbkJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZW1vdmVUZW5BY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZW1vdmVUZW5BY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlbW92ZSAyMCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVtb3ZlVGVuKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVtb3ZlVGVuKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKLQkJCWlmICh0aGlzLmNvbG9yTGlzdEhvbGRlci5zaXplKCkgPiAwKSB7Ci0JCQkJdGhpcy5jb2xvckxpc3RIb2xkZXIucmVtb3ZlKHRoaXMuY29sb3JMaXN0SG9sZGVyLnNpemUoKSAtIDEpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBjb2xvcjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX1BST1BFUlRZID0gImNvbG9yIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRCA9ICJyZWQiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JBTkdFID0gIm9yYW5nZSI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBZRUxMT1cgPSAieWVsbG93IjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSRUVOID0gImdyZWVuIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJMVUUgPSAiYmx1ZSI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRJR08gPSAiaW5kaWdvIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJT0xFVCA9ICJ2aW9sZXQiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT0xPUiA9IFJFRDsKLQkJCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IHZhbGlkQ29sb3JzOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1ZBTElEX0NPTE9SUyA9IHsKLQkJCQlSRUQsCi0JCQkJT1JBTkdFLAotCQkJCVlFTExPVywKLQkJCQlHUkVFTiwKLQkJCQlCTFVFLAotCQkJCUlORElHTywKLQkJCQlWSU9MRVQKLQkJCX07Ci0JCi0JCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IHZhbGlkQ29sb3JzKCkgewotCQkJaWYgKHZhbGlkQ29sb3JzID09IG51bGwpIHsKLQkJCQl2YWxpZENvbG9ycyA9IGJ1aWxkRGVmYXVsdFZhbGlkQ29sb3JzKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsaWRDb2xvcnM7Ci0JCX0KLQkJcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gYnVpbGREZWZhdWx0VmFsaWRDb2xvcnMoKSB7Ci0JCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHJlc3VsdCwgREVGQVVMVF9WQUxJRF9DT0xPUlMpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQotCQlwdWJsaWMgVGVzdE1vZGVsKCkgewotCQkJdGhpcyhERUZBVUxUX0NPTE9SKTsKLQkJfQotCQlwdWJsaWMgVGVzdE1vZGVsKFN0cmluZyBjb2xvcikgewotCQkJdGhpcy5jb2xvciA9IGNvbG9yOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sb3IoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2xvcjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihTdHJpbmcgY29sb3IpIHsKLQkJCXRoaXMuY2hlY2tDb2xvcihjb2xvcik7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5jb2xvcjsKLQkJCXRoaXMuY29sb3IgPSBjb2xvcjsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT0xPUl9QUk9QRVJUWSwgb2xkLCBjb2xvcik7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2hlY2tDb2xvcihTdHJpbmcgYykgewotCQkJaWYgKCAhIHZhbGlkQ29sb3JzKCkuY29udGFpbnMoYykpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGMpOwotCQkJfQotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUZXN0TW9kZWwoIiArIHRoaXMuY29sb3IgKyAiKSI7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgTG9jYWxMaXN0Q2hvb3NlcjEgZXh0ZW5kcyBMaXN0Q2hvb3NlciB7Ci0JCXB1YmxpYyBMb2NhbExpc3RDaG9vc2VyMShDb21ib0JveE1vZGVsIG1vZGVsKSB7Ci0JCQlzdXBlcihtb2RlbCk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgTG9jYWxMaXN0Q2hvb3NlcjIgZXh0ZW5kcyBMaXN0Q2hvb3NlciB7Ci0JCXB1YmxpYyBMb2NhbExpc3RDaG9vc2VyMihDb21ib0JveE1vZGVsIG1vZGVsKSB7Ci0JCQlzdXBlcihtb2RlbCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0QnJvd3NlciBidWlsZEJyb3dzZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0xpc3RCcm93c2VyPFN0cmluZz4oKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0Mi5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDAwZjRjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db21ib0JveE1vZGVsQWRhcHRlclVJVGVzdDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuTGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLlNpbXBsZUxpc3RDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdDIgZXh0ZW5kcyBDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IENvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0MigpLmV4ZWMoKTsKLQl9Ci0KLQlwdWJsaWMgQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIHVzZSBhIGRpZmZlcmVudCBtb2RlbCB0aGF0IGFsbG93cyB0aGUgY29sb3IgdG8gYmUgc2V0IHRvIG51bGwKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGVzdE1vZGVsIGJ1aWxkVGVzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFRlc3RNb2RlbDIoKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYSBudWxsIHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IHVpQ29sb3JMaXN0SG9sZGVyKCkgewotCQkvLyB0aGUgZGVmYXVsdCBpcyB0byBwcmVwZW5kIHRoZSB3cmFwcGVkIGxpc3Qgd2l0aCBhIG51bGwgaXRlbQotCQlyZXR1cm4gbmV3IEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4oc3VwZXIudWlDb2xvckxpc3RIb2xkZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogY29udmVydCBudWxsIHRvIHNvbWUgdGV4dAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0Q2VsbFJlbmRlcmVyIGJ1aWxkQ29tYm9Cb3hSZW5kZXJlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0Q2VsbFJlbmRlcmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVGV4dChPYmplY3QgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gIjxub25lIHNlbGVjdGVkPiIgOiBzdXBlci5idWlsZFRleHQodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBUZXN0TW9kZWwyIGV4dGVuZHMgVGVzdE1vZGVsIHsKLQkJLyoqCi0JCSAqIG51bGwgaXMgT0sgaGVyZQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGNoZWNrQ29sb3IoU3RyaW5nIGNvbG9yKSB7Ci0JCQlpZiAoY29sb3IgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXN1cGVyLmNoZWNrQ29sb3IoY29sb3IpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEzNTUwYS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5EYXRlU3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgc3Bpbm5lck1vZGVsQWRhcHRlcjsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0KLQlwdWJsaWMgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KG5ldyBEYXRlKCkpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIgPSBuZXcgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy52YWx1ZUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZERhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZERhdGVDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlU3Bpbm5lck1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlEYXRlU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlEYXRlIG5ld0RhdGUgPSBuZXcgRGF0ZSgpOwotCQluZXdEYXRlLnNldFRpbWUoNzc3Nzc3KTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnNldFZhbHVlKG5ld0RhdGUpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyg3Nzc3NzcsICgoRGF0ZSkgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKS5nZXRUaW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVZhbHVlSG9sZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlEYXRlU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlEYXRlIG5ld0RhdGUgPSBuZXcgRGF0ZSgpOwotCQluZXdEYXRlLnNldFRpbWUoNzc3Nzc3KTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShuZXdEYXRlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoNzc3Nzc3LCAoKERhdGUpIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKS5nZXRUaW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRGF0ZSBuZXdEYXRlID0gbmV3IERhdGUoKTsKLQkJbmV3RGF0ZS5zZXRUaW1lKDc3Nzc3Nyk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUobmV3RGF0ZSk7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlEYXRlU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoNzc3Nzc3LCAoKERhdGUpIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKS5nZXRUaW1lKCkpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKCgoRGF0ZSkgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpLmdldFRpbWUoKSA9PSA3Nzc3NzcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gbG9jYWxWYWx1ZUhvbGRlciA9IChTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PikgdGhpcy52YWx1ZUhvbGRlcjsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhTcGlubmVyTW9kZWwgYWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCAoKERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoT2JqZWN0IGFkYXB0ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSgoKERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxJbml0aWFsVmFsdWUoKSB7Ci0JCURhdGUgdG9kYXkgPSBuZXcgRGF0ZSgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KCk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlciA9IG5ldyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLnZhbHVlSG9sZGVyLCB0b2RheSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZERhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZERhdGVDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKHRvZGF5LCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJRGF0ZSBuZXdEYXRlID0gbmV3IERhdGUoKTsKLQkJbmV3RGF0ZS5zZXRUaW1lKDc3Nzc3Nyk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUobmV3RGF0ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoNzc3Nzc3LCAoKERhdGUpIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKS5nZXRUaW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0JcHJpdmF0ZSBjbGFzcyBUZXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lciB7Ci0JCVRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RvY3VtZW50QWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEyNzFjMC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Eb2N1bWVudEV2ZW50LkV2ZW50VHlwZTsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkRvY3VtZW50OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkRvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIERvY3VtZW50QWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlcjsKLQlEb2N1bWVudCBkb2N1bWVudEFkYXB0ZXI7Ci0JYm9vbGVhbiBldmVudEZpcmVkOwotCi0JcHVibGljIERvY3VtZW50QWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3RyaW5nSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCIwMTIzNDU2Nzg5Iik7Ci0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyID0gbmV3IERvY3VtZW50QWRhcHRlcih0aGlzLnN0cmluZ0hvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN0cmluZ0xpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkU3RyaW5nTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyLmFkZERvY3VtZW50TGlzdGVuZXIobmV3IFRlc3REb2N1bWVudExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCQkJRG9jdW1lbnRBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCQlhc3NlcnRFcXVhbHMoRXZlbnRUeXBlLlJFTU9WRSwgZS5nZXRUeXBlKCkpOwotCQkJCWFzc2VydEVxdWFscyhEb2N1bWVudEFkYXB0ZXJUZXN0cy50aGlzLmRvY3VtZW50QWRhcHRlciwgZS5nZXREb2N1bWVudCgpKTsKLQkJCQkvLyB0aGlzIHdpbGwgYmUgdGhlIHJlbW92YWwgb2YgIjIzNDU2IgotCQkJCWFzc2VydEVxdWFscygyLCBlLmdldE9mZnNldCgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoNSwgZS5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmRvY3VtZW50QWRhcHRlci5yZW1vdmUoMiwgNSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMTc4OSIsIHRoaXMuc3RyaW5nSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnNlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyLmFkZERvY3VtZW50TGlzdGVuZXIobmV3IFRlc3REb2N1bWVudExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpbnNlcnRVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCQkJRG9jdW1lbnRBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCQlhc3NlcnRFcXVhbHMoRXZlbnRUeXBlLklOU0VSVCwgZS5nZXRUeXBlKCkpOwotCQkJCWFzc2VydEVxdWFscyhEb2N1bWVudEFkYXB0ZXJUZXN0cy50aGlzLmRvY3VtZW50QWRhcHRlciwgZS5nZXREb2N1bWVudCgpKTsKLQkJCQkvLyB0aGlzIHdpbGwgYmUgdGhlIGluc2VydCBvZiAieHh4eHh4IgotCQkJCWFzc2VydEVxdWFscygyLCBlLmdldE9mZnNldCgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoNSwgZS5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmRvY3VtZW50QWRhcHRlci5pbnNlcnRTdHJpbmcoMiwgInh4eHh4IiwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMXh4eHh4MjM0NTY3ODkiLCB0aGlzLnN0cmluZ0hvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyLmFkZERvY3VtZW50TGlzdGVuZXIobmV3IFRlc3REb2N1bWVudExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpbnNlcnRVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCQkJRG9jdW1lbnRBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCQlhc3NlcnRFcXVhbHMoRXZlbnRUeXBlLklOU0VSVCwgZS5nZXRUeXBlKCkpOwotCQkJCWFzc2VydEVxdWFscyhEb2N1bWVudEFkYXB0ZXJUZXN0cy50aGlzLmRvY3VtZW50QWRhcHRlciwgZS5nZXREb2N1bWVudCgpKTsKLQkJCQkvLyB0aGlzIHdpbGwgYmUgdGhlIGluc2VydCBvZiAiZm9vIgotCQkJCWFzc2VydEVxdWFscygwLCBlLmdldE9mZnNldCgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoMywgZS5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJCQlhc3NlcnRFcXVhbHMoRXZlbnRUeXBlLlJFTU9WRSwgZS5nZXRUeXBlKCkpOwotCQkJCWFzc2VydEVxdWFscyhEb2N1bWVudEFkYXB0ZXJUZXN0cy50aGlzLmRvY3VtZW50QWRhcHRlciwgZS5nZXREb2N1bWVudCgpKTsKLQkJCQkvLyB0aGlzIHdpbGwgYmUgdGhlIHJlbW92YWwgb2YgIjAxMjM0NTY3ODkiCi0JCQkJYXNzZXJ0RXF1YWxzKDAsIGUuZ2V0T2Zmc2V0KCkpOwotCQkJCWFzc2VydEVxdWFscygxMCwgZS5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkiLCB0aGlzLmRvY3VtZW50QWRhcHRlci5nZXRUZXh0KDAsIHRoaXMuZG9jdW1lbnRBZGFwdGVyLmdldExlbmd0aCgpKSk7Ci0JCXRoaXMuc3RyaW5nSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuZG9jdW1lbnRBZGFwdGVyLmdldFRleHQoMCwgdGhpcy5kb2N1bWVudEFkYXB0ZXIuZ2V0TGVuZ3RoKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGxvY2FsU3RyaW5nSG9sZGVyID0gKFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KSB0aGlzLnN0cmluZ0hvbGRlcjsKLQkJYXNzZXJ0RmFsc2UobG9jYWxTdHJpbmdIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5kb2N1bWVudEFkYXB0ZXIpOwotCi0JCURvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdERvY3VtZW50TGlzdGVuZXIoKTsKLQkJdGhpcy5kb2N1bWVudEFkYXB0ZXIuYWRkRG9jdW1lbnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUobG9jYWxTdHJpbmdIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuZG9jdW1lbnRBZGFwdGVyKTsKLQotCQl0aGlzLmRvY3VtZW50QWRhcHRlci5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobG9jYWxTdHJpbmdIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5kb2N1bWVudEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhPYmplY3QgZG9jdW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlPYmplY3QgZGVsZWdhdGUgPSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShkb2N1bWVudCwgImRlbGVnYXRlIik7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IChPYmplY3RbXSkgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QoZGVsZWdhdGUsICJnZXREb2N1bWVudExpc3RlbmVycyIpOwotCQlhc3NlcnRFcXVhbHMoMCwgbGlzdGVuZXJzLmxlbmd0aCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhPYmplY3QgZG9jdW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlPYmplY3QgZGVsZWdhdGUgPSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShkb2N1bWVudCwgImRlbGVnYXRlIik7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IChPYmplY3RbXSkgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QoZGVsZWdhdGUsICJnZXREb2N1bWVudExpc3RlbmVycyIpOwotCQlhc3NlcnRGYWxzZShsaXN0ZW5lcnMubGVuZ3RoID09IDApOwotCX0KLQotCi1wcml2YXRlIGNsYXNzIFRlc3REb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgRG9jdW1lbnRMaXN0ZW5lciB7Ci0JVGVzdERvY3VtZW50TGlzdGVuZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCXB1YmxpYyB2b2lkIGNoYW5nZWRVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQl9Ci0JcHVibGljIHZvaWQgaW5zZXJ0VXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JfQotCXB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCX0KLX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RvY3VtZW50QWRhcHRlclVJVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RvY3VtZW50QWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzQ3MTkxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZExheW91dDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKLWltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5BYnN0cmFjdERvY3VtZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuQXR0cmlidXRlU2V0OwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LlBsYWluRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5Eb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIGVudHJ5IGZpZWxkcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRBZGFwdGVyVUlUZXN0IHsKLQotCXByaXZhdGUgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTkFNRSA9ICJTY29vYnkgRG9vIjsKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbmFtZUhvbGRlcjsKLQlwcml2YXRlIERvY3VtZW50IG5hbWVEb2N1bWVudDsKLQlwcml2YXRlIERvY3VtZW50IHVwcGVyQ2FzZU5hbWVEb2N1bWVudDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgRG9jdW1lbnRBZGFwdGVyVUlUZXN0KCkuZXhlYygpOwotCX0KLQotCXByaXZhdGUgRG9jdW1lbnRBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbChERUZBVUxUX05BTUUpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMubmFtZUhvbGRlciA9IHRoaXMuYnVpbGROYW1lSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5uYW1lRG9jdW1lbnQgPSB0aGlzLmJ1aWxkTmFtZURvY3VtZW50KHRoaXMubmFtZUhvbGRlcik7Ci0JCXRoaXMudXBwZXJDYXNlTmFtZURvY3VtZW50ID0gdGhpcy5idWlsZFVwcGVyQ2FzZU5hbWVEb2N1bWVudCh0aGlzLm5hbWVIb2xkZXIpOwotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdm0pIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBTdHJpbmc+KHZtLCBUZXN0TW9kZWwuTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgRG9jdW1lbnQgYnVpbGROYW1lRG9jdW1lbnQoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlcikgewotCQlyZXR1cm4gbmV3IERvY3VtZW50QWRhcHRlcihzdHJpbmdIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgRG9jdW1lbnQgYnVpbGRVcHBlckNhc2VOYW1lRG9jdW1lbnQoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlcikgewotCQlyZXR1cm4gbmV3IERvY3VtZW50QWRhcHRlcihzdHJpbmdIb2xkZXIsIHRoaXMuYnVpbGRVcHBlckNhc2VOYW1lRG9jdW1lbnREZWxlZ2F0ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEFic3RyYWN0RG9jdW1lbnQgYnVpbGRVcHBlckNhc2VOYW1lRG9jdW1lbnREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIG5ldyBQbGFpbkRvY3VtZW50KCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpbnNlcnRTdHJpbmcoaW50IG9mZnNldCwgU3RyaW5nIHN0cmluZywgQXR0cmlidXRlU2V0IGEpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCQkJaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJY2hhcltdIHVwcGVyID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cHBlci5sZW5ndGg7IGkrKykgewotCQkJCQl1cHBlcltpXSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZSh1cHBlcltpXSk7Ci0JCQkJfQotCQkJCXN1cGVyLmluc2VydFN0cmluZyhvZmZzZXQsIG5ldyBTdHJpbmcodXBwZXIpLCBhKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbldpbmRvdygpIHsKLQkJSkZyYW1lIHdpbmRvdyA9IG5ldyBKRnJhbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCXdpbmRvdy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOwotCQl3aW5kb3cuYWRkV2luZG93TGlzdGVuZXIodGhpcy5idWlsZFdpbmRvd0xpc3RlbmVyKCkpOwotCQl3aW5kb3cuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5idWlsZE1haW5QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCXdpbmRvdy5zZXRTaXplKDQwMCwgMTAwKTsKLQkJd2luZG93LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciBidWlsZFdpbmRvd0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCWUuZ2V0V2luZG93KCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRNYWluUGFuZWwoKSB7Ci0JCUpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZFRleHRGaWVsZFBhbmVsKCksIEJvcmRlckxheW91dC5OT1JUSCk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbnRyb2xQYW5lbCgpLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkVGV4dEZpZWxkUGFuZWwoKSB7Ci0JCUpQYW5lbCB0YXNrTGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGROYW1lVGV4dEZpZWxkKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVhZE9ubHlOYW1lVGV4dEZpZWxkKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkVXBwZXJDYXNlTmFtZVRleHRGaWVsZCgpKTsKLQkJcmV0dXJuIHRhc2tMaXN0UGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKVGV4dEZpZWxkIGJ1aWxkTmFtZVRleHRGaWVsZCgpIHsKLQkJcmV0dXJuIG5ldyBKVGV4dEZpZWxkKHRoaXMubmFtZURvY3VtZW50LCBudWxsLCAwKTsKLQl9Ci0KLQlwcml2YXRlIEpUZXh0RmllbGQgYnVpbGRSZWFkT25seU5hbWVUZXh0RmllbGQoKSB7Ci0JCUpUZXh0RmllbGQgbmFtZVRleHRGaWVsZCA9IHRoaXMuYnVpbGROYW1lVGV4dEZpZWxkKCk7Ci0JCW5hbWVUZXh0RmllbGQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQlyZXR1cm4gbmFtZVRleHRGaWVsZDsKLQl9Ci0KLQlwcml2YXRlIEpUZXh0RmllbGQgYnVpbGRVcHBlckNhc2VOYW1lVGV4dEZpZWxkKCkgewotCQlyZXR1cm4gbmV3IEpUZXh0RmllbGQodGhpcy51cHBlckNhc2VOYW1lRG9jdW1lbnQsIG51bGwsIDApOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ29udHJvbFBhbmVsKCkgewotCQlKUGFuZWwgY29udHJvbFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc2V0TmFtZUJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRQcmludE1vZGVsQnV0dG9uKCkpOwotCQlyZXR1cm4gY29udHJvbFBhbmVsOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlc2V0TmFtZUJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXNldE5hbWVBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZXNldE5hbWVBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlc2V0IG5hbWUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXJVSVRlc3QudGhpcy5yZXNldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXNldE5hbWUoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLnNldE5hbWUoREVGQVVMVF9OQU1FKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZENsZWFyTW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRDbGVhck1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJjbGVhciBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCURvY3VtZW50QWRhcHRlclVJVGVzdC50aGlzLmNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXN0b3JlIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRG9jdW1lbnRBZGFwdGVyVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRQcmludE1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUHJpbnRNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicHJpbnQgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXJVSVRlc3QudGhpcy5wcmludE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcHJpbnRNb2RlbCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJuYW1lOiAiICsgdGhpcy50ZXN0TW9kZWwuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQotCQlwdWJsaWMgVGVzdE1vZGVsKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE1vZGVsKCIgKyB0aGlzLmdldE5hbWUoKSArICIpIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0pwdFV0aWxpdHlNb2RlbFZhbHVlU3dpbmdUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0pwdFV0aWxpdHlNb2RlbFZhbHVlU3dpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2M2YjQxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9KcHRVdGlsaXR5TW9kZWxWYWx1ZVN3aW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlNb2RlbFZhbHVlU3dpbmdUZXN0cyB7Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFV0aWxpdHlNb2RlbFZhbHVlU3dpbmdUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2hlY2tCb3hNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21ib0JveE1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRG9jdW1lbnRBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTGlzdE1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUYWJsZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyZWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcHRVdGlsaXR5TW9kZWxWYWx1ZVN3aW5nVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0TW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0TW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJlNDI2ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuTGlzdE1vZGVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29vcmRpbmF0ZWRMaXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBMaXN0TW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTGlzdE1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCS8vIG5vdGhpbmcgeWV0Li4uCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gbm90aGluZyB5ZXQuLi4KLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbEFkYXB0ZXIgYnVpbGRMaXN0TW9kZWwoTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgTGlzdE1vZGVsQWRhcHRlcihsaXN0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0TW9kZWwgYnVpbGRMaXN0TW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgTGlzdE1vZGVsQWRhcHRlcihjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25TeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JCUxpc3RNb2RlbCBsaXN0TW9kZWwgPSB0aGlzLmJ1aWxkTGlzdE1vZGVsKGNvbGxlY3Rpb25Ib2xkZXIpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4obGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdE1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJ0b20iKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQoImRpY2siKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQoImhhcnJ5Iik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdE1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImphciIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiaGFycnkiKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdE1vZGVsIGxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwobGlzdEhvbGRlcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPihsaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0TW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5hZGQoNiwgInRvbSIpOwotCQlsaXN0SG9sZGVyLmFkZCg3LCAiZGljayIpOwotCQlsaXN0SG9sZGVyLmFkZCg4LCAiaGFycnkiKTsKLQkJbGlzdEhvbGRlci5hZGQoOSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscygxMCwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0TW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOSk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDgpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TW9kZWwoKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlcjEgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0TW9kZWxBZGFwdGVyIGxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwobGlzdEhvbGRlcjEpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4obGlzdE1vZGVsKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyMS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIyID0gdGhpcy5idWlsZExpc3RIb2xkZXIyKCk7Ci0JCWxpc3RNb2RlbC5zZXRNb2RlbChsaXN0SG9sZGVyMik7Ci0JCWFzc2VydEVxdWFscygzLCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyMS5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyMi5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJbGlzdE1vZGVsLnNldE1vZGVsKG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0TW9kZWwsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlcjEuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlcjIuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmUoTGlzdE1vZGVsIGxpc3RNb2RlbCwgTGlzdDxTdHJpbmc+IGxpc3QpIHsKLQkJYXNzZXJ0RXF1YWxzKGxpc3RNb2RlbC5nZXRTaXplKCksIGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0TW9kZWwuZ2V0U2l6ZSgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhsaXN0TW9kZWwuZ2V0RWxlbWVudEF0KGkpLCBsaXN0LmdldChpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvblNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvblNvcnQobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTb3J0KCkgewotCQl0aGlzLnZlcmlmeUxpc3RTb3J0KG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdXN0b21Db2xsZWN0aW9uU29ydCgpIHsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uU29ydCh0aGlzLmJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tTGlzdFNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5TGlzdFNvcnQodGhpcy5idWlsZEN1c3RvbUNvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPFN0cmluZz4gYnVpbGRDdXN0b21Db21wYXJhdG9yKCkgewotCQkvLyBzb3J0IHdpdGggcmV2ZXJzZSBvcmRlcgotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQkJCXJldHVybiBzMi5jb21wYXJlVG8oczEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb2xsZWN0aW9uU29ydChDb21wYXJhdG9yPFN0cmluZz4gY29tcGFyYXRvcikgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGNvbGxlY3Rpb25Ib2xkZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpOwotCQlMaXN0TW9kZWwgbGlzdE1vZGVsID0gdGhpcy5idWlsZExpc3RNb2RlbChuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oY29sbGVjdGlvbkhvbGRlciwgY29tcGFyYXRvcikpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4obGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCgidG9tIik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJkaWNrIik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJoYXJyeSIpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdE1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImphciIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiaGFycnkiKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdFNvcnQoQ29tcGFyYXRvcjxTdHJpbmc+IGNvbXBhcmF0b3IpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdE1vZGVsIGxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwobmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KGxpc3RIb2xkZXIsIGNvbXBhcmF0b3IpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KGxpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0TW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJbGlzdEhvbGRlci5hZGQoMCwgInRvbSIpOwotCQlsaXN0SG9sZGVyLmFkZCgwLCAiZGljayIpOwotCQlsaXN0SG9sZGVyLmFkZCgwLCAiaGFycnkiKTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQlsaXN0SG9sZGVyLnJlbW92ZSg4KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoNCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg1KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZVNvcnQoTGlzdE1vZGVsIGxpc3RNb2RlbCwgTGlzdDxTdHJpbmc+IGxpc3QsIENvbXBhcmF0b3I8U3RyaW5nPiBjb21wYXJhdG9yKSB7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihjb21wYXJhdG9yKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0TW9kZWwuZ2V0U2l6ZSgpOyBpKyspIHsKLQkJCXNzLmFkZCgoU3RyaW5nKSBsaXN0TW9kZWwuZ2V0RWxlbWVudEF0KGkpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoc3Muc2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0xID0gc3MuaXRlcmF0b3IoKSwgc3RyZWFtMiA9IGxpc3QuaXRlcmF0b3IoKTsgc3RyZWFtMS5oYXNOZXh0KCk7ICkgewotCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbTEubmV4dCgpLCBzdHJlYW0yLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCUxpc3RNb2RlbCBsaXN0TW9kZWwgPSB0aGlzLmJ1aWxkTGlzdE1vZGVsKGxpc3RIb2xkZXIpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0TW9kZWwpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPihsaXN0TW9kZWwpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0TW9kZWwpOwotCi0JCWxpc3RNb2RlbC5yZW1vdmVMaXN0RGF0YUxpc3RlbmVyKHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RNb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdE1vZGVsIGxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwobGlzdEhvbGRlcik7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3RNb2RlbC5nZXRTaXplKCkpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPihsaXN0TW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdE1vZGVsLmdldFNpemUoKSk7Ci0KLQkJbGlzdE1vZGVsLnJlbW92ZUxpc3REYXRhTGlzdGVuZXIoc3luY2hMaXN0KTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdE1vZGVsLmdldFNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEVsZW1lbnRBdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0TW9kZWwgbGlzdE1vZGVsID0gdGhpcy5idWlsZExpc3RNb2RlbChuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4obGlzdEhvbGRlcikpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4obGlzdE1vZGVsKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBsaXN0TW9kZWwuZ2V0RWxlbWVudEF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBzeW5jaExpc3QuZ2V0KDApKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoTGlzdE1vZGVsIGxpc3RNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMgPSAoKEJvb2xlYW4pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKGxpc3RNb2RlbCwgImhhc05vTGlzdERhdGFMaXN0ZW5lcnMiKSkuYm9vbGVhblZhbHVlKCk7Ci0JCWFzc2VydFRydWUoaGFzTm9MaXN0ZW5lcnMpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoTGlzdE1vZGVsIGxpc3RNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gaGFzTGlzdGVuZXJzID0gKChCb29sZWFuKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChsaXN0TW9kZWwsICJoYXNMaXN0RGF0YUxpc3RlbmVycyIpKS5ib29sZWFuVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShoYXNMaXN0ZW5lcnMpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbGxlY3Rpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUJhZzxTdHJpbmc+IGJhZyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24oYmFnKTsKLQkJcmV0dXJuIGJhZzsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uPFN0cmluZz4gYykgewotCQljLmFkZCgiZm9vIik7Ci0JCWMuYWRkKCJiYXIiKTsKLQkJYy5hZGQoImJheiIpOwotCQljLmFkZCgiam9vIik7Ci0JCWMuYWRkKCJqYXIiKTsKLQkJYy5hZGQoImpheiIpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZExpc3RIb2xkZXIyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZExpc3QyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdDIoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uMihsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbjIoQ29sbGVjdGlvbjxTdHJpbmc+IGMpIHsKLQkJYy5hZGQoInRvbSIpOwotCQljLmFkZCgiZGljayIpOwotCQljLmFkZCgiaGFycnkiKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTUxNzcyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuVGV4dEZpZWxkOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuV2luZG93Q29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLkRpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBhbiBleGFtcGxlIFVJIGZvciB0ZXN0aW5nIHZhcmlvdXMgcGVybXV0YXRpb25zIG9mIHRoZSBMaXN0TW9kZWxBZGFwdGVyCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIExpc3RNb2RlbEFkYXB0ZXJVSVRlc3QgewotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRhc2tMaXN0PiB0YXNrTGlzdEhvbGRlcjsKLQlwcml2YXRlIFRleHRGaWVsZCB0YXNrVGV4dEZpZWxkOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBMaXN0TW9kZWxBZGFwdGVyVUlUZXN0KCkuZXhlYyhhcmdzKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbEFkYXB0ZXJVSVRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWMoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnRhc2tMaXN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrTGlzdD4obmV3IFRhc2tMaXN0KCkpOwotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbldpbmRvdygpIHsKLQkJSkZyYW1lIHdpbmRvdyA9IG5ldyBKRnJhbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCXdpbmRvdy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOwotCQl3aW5kb3cuYWRkV2luZG93TGlzdGVuZXIodGhpcy5idWlsZFdpbmRvd0xpc3RlbmVyKCkpOwotCQl3aW5kb3cuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5idWlsZE1haW5QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCXdpbmRvdy5zZXRTaXplKDgwMCwgNDAwKTsKLQkJd2luZG93LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciBidWlsZFdpbmRvd0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCWUuZ2V0V2luZG93KCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRNYWluUGFuZWwoKSB7Ci0JCUpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZFRhc2tMaXN0UGFuZWwoKSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbnRyb2xQYW5lbCgpLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkVGFza0xpc3RQYW5lbCgpIHsKLQkJSlBhbmVsIHRhc2tMaXN0UGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDAsIDEpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0UGFuZWwoKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGREaXNwbGF5YWJsZVRhc2tMaXN0UGFuZWwoKSk7Ci0JCXJldHVybiB0YXNrTGlzdFBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkUHJpbWl0aXZlVGFza0xpc3RQYW5lbCgpIHsKLQkJSlBhbmVsIHRhc2tMaXN0UGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoKSk7Ci0JCXJldHVybiB0YXNrTGlzdFBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkRGlzcGxheWFibGVUYXNrTGlzdFBhbmVsKCkgewotCQlKUGFuZWwgdGFza0xpc3RQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkVW5zb3J0ZWREaXNwbGF5YWJsZUxpc3RQYW5lbCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZFN0YW5kYXJkU29ydGVkRGlzcGxheWFibGVMaXN0UGFuZWwoKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRDdXN0b21Tb3J0ZWREaXNwbGF5YWJsZUxpc3RQYW5lbCgpKTsKLQkJcmV0dXJuIHRhc2tMaXN0UGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRVbnNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0UGFuZWwoInByaW1pdGl2ZSB1bnNvcnRlZCIsIHRoaXMuYnVpbGRVbnNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3RQYW5lbCgicHJpbWl0aXZlIHNvcnRlZCIsIHRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0UGFuZWwoInByaW1pdGl2ZSByZXZlcnNlIHNvcnRlZCIsIHRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRVbnNvcnRlZERpc3BsYXlhYmxlTGlzdFBhbmVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3RQYW5lbCgiZGlzcGxheWFibGUgdW5zb3J0ZWQiLCB0aGlzLmJ1aWxkVW5zb3J0ZWREaXNwbGF5YWJsZUxpc3RNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFN0YW5kYXJkU29ydGVkRGlzcGxheWFibGVMaXN0UGFuZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdFBhbmVsKCJkaXNwbGF5YWJsZSBzb3J0ZWQiLCB0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWREaXNwbGF5YWJsZUxpc3RNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZEN1c3RvbVNvcnRlZERpc3BsYXlhYmxlTGlzdFBhbmVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3RQYW5lbCgiZGlzcGxheWFibGUgcmV2ZXJzZSBzb3J0ZWQiLCB0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkRGlzcGxheWFibGVMaXN0TW9kZWwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0TW9kZWwgYnVpbGRVbnNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0TW9kZWwgYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TW9kZWxBZGFwdGVyKG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPih0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCkpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbCBidWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TW9kZWxBZGFwdGVyKG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPih0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCksIHRoaXMuYnVpbGRDdXN0b21TdHJpbmdDb21wYXJhdG9yKCkpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbCBidWlsZFVuc29ydGVkRGlzcGxheWFibGVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmJ1aWxkRGlzcGxheWFibGVUYXNrTGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0TW9kZWwgYnVpbGRTdGFuZGFyZFNvcnRlZERpc3BsYXlhYmxlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RNb2RlbEFkYXB0ZXIobmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxUYXNrPih0aGlzLmJ1aWxkRGlzcGxheWFibGVUYXNrTGlzdEFkYXB0ZXIoKSkpOwotCX0KLQotCXByaXZhdGUgTGlzdE1vZGVsIGJ1aWxkQ3VzdG9tU29ydGVkRGlzcGxheWFibGVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTGlzdE1vZGVsQWRhcHRlcihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFRhc2s+KHRoaXMuYnVpbGREaXNwbGF5YWJsZVRhc2tMaXN0QWRhcHRlcigpLCB0aGlzLmJ1aWxkQ3VzdG9tVGFza09iamVjdENvbXBhcmF0b3IoKSkpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTGlzdFBhbmVsKFN0cmluZyBsYWJlbCwgTGlzdE1vZGVsIGxpc3RNb2RlbCkgewotCQlKUGFuZWwgbGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQlKTGFiZWwgbGlzdExhYmVsID0gbmV3IEpMYWJlbCgiICAiICsgbGFiZWwpOwotCQlsaXN0UGFuZWwuYWRkKGxpc3RMYWJlbCwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLQotCQlKTGlzdCBsaXN0Qm94ID0gbmV3IEpMaXN0KCk7Ci0JCWxpc3RCb3guc2V0TW9kZWwobGlzdE1vZGVsKTsKLQkJbGlzdEJveC5zZXREb3VibGVCdWZmZXJlZCh0cnVlKTsKLQkJbGlzdExhYmVsLnNldExhYmVsRm9yKGxpc3RCb3gpOwotCQlsaXN0UGFuZWwuYWRkKG5ldyBKU2Nyb2xsUGFuZShsaXN0Qm94KSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0JCXJldHVybiBsaXN0UGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPFN0cmluZz4gYnVpbGRDdXN0b21TdHJpbmdDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQkJCXJldHVybiBzMi5jb21wYXJlVG8oczEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxUYXNrPiBidWlsZEN1c3RvbVRhc2tPYmplY3RDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8VGFzaz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVGFzayB0bzEsIFRhc2sgdG8yKSB7Ci0JCQkJcmV0dXJuIHRvMi5kaXNwbGF5U3RyaW5nKCkuY29tcGFyZVRvKHRvMS5kaXNwbGF5U3RyaW5nKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUYXNrTGlzdCwgU3RyaW5nPihUYXNrTGlzdC5UQVNLX05BTUVTX0xJU1QsIHRoaXMudGFza0xpc3QoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnRhc2tOYW1lcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGREaXNwbGF5YWJsZVRhc2tMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUYXNrTGlzdCwgVGFzaz4oVGFza0xpc3QuVEFTS1NfTElTVCwgdGhpcy50YXNrTGlzdCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8VGFzaz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnRhc2tzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRDb250cm9sUGFuZWwoKSB7Ci0JCUpQYW5lbCBjb250cm9sUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZEFkZFJlbW92ZVRhc2tQYW5lbCgpLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkQ2xlYXJCdXR0b24oKSwgQm9yZGVyTGF5b3V0LkVBU1QpOwotCQlyZXR1cm4gY29udHJvbFBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQWRkUmVtb3ZlVGFza1BhbmVsKCkgewotCQlKUGFuZWwgYWRkUmVtb3ZlVGFza1BhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQlhZGRSZW1vdmVUYXNrUGFuZWwuYWRkKHRoaXMuYnVpbGRBZGRCdXR0b24oKSwgQm9yZGVyTGF5b3V0LldFU1QpOwotCQlhZGRSZW1vdmVUYXNrUGFuZWwuYWRkKHRoaXMuYnVpbGRUYXNrVGV4dEZpZWxkKCksIEJvcmRlckxheW91dC5DRU5URVIpOwotCQlhZGRSZW1vdmVUYXNrUGFuZWwuYWRkKHRoaXMuYnVpbGRSZW1vdmVCdXR0b24oKSwgQm9yZGVyTGF5b3V0LkVBU1QpOwotCQlyZXR1cm4gYWRkUmVtb3ZlVGFza1BhbmVsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFRhc2soKSB7Ci0JCXJldHVybiB0aGlzLnRhc2tUZXh0RmllbGQuZ2V0VGV4dCgpOwotCX0KLQotCXByaXZhdGUgVGFza0xpc3QgdGFza0xpc3QoKSB7Ci0JCXJldHVybiB0aGlzLnRhc2tMaXN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0Jdm9pZCBhZGRUYXNrKCkgewotCQlTdHJpbmcgdGFzayA9IHRoaXMuZ2V0VGFzaygpOwotCQlpZiAodGFzay5sZW5ndGgoKSAhPSAwKSB7Ci0JCQl0aGlzLnRhc2tMaXN0KCkuYWRkVGFzayh0YXNrKTsKLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlVGFzaygpIHsKLQkJU3RyaW5nIHRhc2sgPSB0aGlzLmdldFRhc2soKTsKLQkJaWYgKHRhc2subGVuZ3RoKCkgIT0gMCkgewotCQkJdGhpcy50YXNrTGlzdCgpLnJlbW92ZVRhc2sodGFzayk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGNsZWFyVGFza3MoKSB7Ci0JCXRoaXMudGFza0xpc3QoKS5jbGVhclRhc2tzKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0RmllbGQgYnVpbGRUYXNrVGV4dEZpZWxkKCkgewotCQl0aGlzLnRhc2tUZXh0RmllbGQgPSBuZXcgVGV4dEZpZWxkKCk7Ci0JCXJldHVybiB0aGlzLnRhc2tUZXh0RmllbGQ7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQWRkQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZEFkZEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZEFkZEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiYWRkIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmFkZFRhc2soKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVtb3ZlQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlbW92ZUFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlbW92ZUFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVtb3ZlIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlbW92ZVRhc2soKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQ2xlYXJCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQ2xlYXJBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRDbGVhckFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiY2xlYXIiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuY2xlYXJUYXNrcygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgVGFza0xpc3QgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBMaXN0PFN0cmluZz4gdGFza05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXByaXZhdGUgTGlzdDxUYXNrPiB0YXNrT2JqZWN0cyA9IG5ldyBBcnJheUxpc3Q8VGFzaz4oKTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19OQU1FU19MSVNUID0gInRhc2tOYW1lcyI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tTX0xJU1QgPSAidGFza3MiOwotCQlUYXNrTGlzdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHRhc2tOYW1lcygpIHsKLQkJCXJldHVybiB0aGlzLnRhc2tOYW1lcy5saXN0SXRlcmF0b3IoKTsKLQkJfQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFRhc2s+IHRhc2tzKCkgewotCQkJcmV0dXJuIHRoaXMudGFza09iamVjdHMubGlzdEl0ZXJhdG9yKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkVGFzayhTdHJpbmcgdGFza05hbWUpIHsKLQkJCWludCBpbmRleCA9IHRoaXMudGFza05hbWVzLnNpemUoKTsKLQkJCXRoaXMudGFza05hbWVzLmFkZChpbmRleCwgdGFza05hbWUpOwotCQkJdGhpcy5maXJlSXRlbUFkZGVkKFRBU0tfTkFNRVNfTElTVCwgaW5kZXgsIHRhc2tOYW1lKTsKLQkKLQkJCVRhc2sgdGFza09iamVjdCA9IG5ldyBUYXNrKHRhc2tOYW1lKTsKLQkJCXRoaXMudGFza09iamVjdHMuYWRkKGluZGV4LCB0YXNrT2JqZWN0KTsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChUQVNLU19MSVNULCBpbmRleCwgdGFza09iamVjdCk7Ci0JCX0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVUYXNrKFN0cmluZyB0YXNrTmFtZSkgewotCQkJaW50IGluZGV4ID0gdGhpcy50YXNrTmFtZXMuaW5kZXhPZih0YXNrTmFtZSk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlPYmplY3QgcmVtb3ZlZFRhc2sgPSB0aGlzLnRhc2tOYW1lcy5yZW1vdmUoaW5kZXgpOwotCQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKFRBU0tfTkFNRVNfTElTVCwgaW5kZXgsIHJlbW92ZWRUYXNrKTsKLQkJCQkvLyBhc3N1bWUgdGhlIGluZGV4ZXMgbWF0Y2guLi4KLQkJCQlPYmplY3QgcmVtb3ZlZFRhc2tPYmplY3QgPSB0aGlzLnRhc2tPYmplY3RzLnJlbW92ZShpbmRleCk7Ci0JCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoVEFTS1NfTElTVCwgaW5kZXgsIHJlbW92ZWRUYXNrT2JqZWN0KTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBjbGVhclRhc2tzKCkgewotCQkJdGhpcy50YXNrTmFtZXMuY2xlYXIoKTsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKFRBU0tfTkFNRVNfTElTVCwgdGhpcy50YXNrTmFtZXMpOwotCQkJdGhpcy50YXNrT2JqZWN0cy5jbGVhcigpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoVEFTS1NfTElTVCwgdGhpcy50YXNrT2JqZWN0cyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgVGFzayBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBEaXNwbGF5YWJsZSB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgRGF0ZSBjcmVhdGlvblRpbWVTdGFtcDsKLQkJcHVibGljIFRhc2soU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmNyZWF0aW9uVGltZVN0YW1wID0gbmV3IERhdGUoKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lICsgIjogIiArIHRoaXMuY3JlYXRpb25UaW1lU3RhbXAuZ2V0VGltZSgpOwotCQl9Ci0JCXB1YmxpYyBJY29uIGljb24oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kaXNwbGF5U3RyaW5nKCkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBkNTAzMi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0U3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIExpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgc3Bpbm5lck1vZGVsQWRhcHRlcjsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMVUVfTElTVCA9IHsicmVkIiwgImdyZWVuIiwgImJsdWUifTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9WQUxVRSA9IFZBTFVFX0xJU1RbMF07Ci0KLQlwdWJsaWMgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KERFRkFVTFRfVkFMVUUpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIgPSBuZXcgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy52YWx1ZUhvbGRlciwgVkFMVUVfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVTcGlubmVyTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhERUZBVUxUX1ZBTFVFLCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuc2V0VmFsdWUoVkFMVUVfTElTVFsyXSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKFZBTFVFX0xJU1RbMl0sIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlVmFsdWVIb2xkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhERUZBVUxUX1ZBTFVFLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUoVkFMVUVfTElTVFsyXSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKFZBTFVFX0xJU1RbMl0sIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0U3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoREVGQVVMVF9WQUxVRSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUoVkFMVUVfTElTVFsyXSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKFZBTFVFX0xJU1RbMl0sIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoVkFMVUVfTElTVFswXSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gbG9jYWxWYWx1ZUhvbGRlciA9IChTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PikgdGhpcy52YWx1ZUhvbGRlcjsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhTcGlubmVyTW9kZWwgYWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCAoKExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoT2JqZWN0IGFkYXB0ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSgoKExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCk7Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyIHsKLQkJVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMGJjODUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL051bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IHZhbHVlSG9sZGVyOwotCXByaXZhdGUgU3Bpbm5lck1vZGVsIHNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci0JYm9vbGVhbiBldmVudEZpcmVkOwotCi0JcHVibGljIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+KG5ldyBJbnRlZ2VyKDApKTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyID0gbmV3IE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy52YWx1ZUhvbGRlciwgLTMzLCAzMywgMSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE51bWJlckNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkTnVtYmVyQ2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVNwaW5uZXJNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuc2V0VmFsdWUobmV3IEludGVnZXIoNSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1KSwgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVWYWx1ZUhvbGRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMCksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcig3KSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDcpLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMCksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoLTMzKSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gbG9jYWxWYWx1ZUhvbGRlciA9IChTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPikgdGhpcy52YWx1ZUhvbGRlcjsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhTcGlubmVyTW9kZWwgYWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCAoKE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIpIGFkYXB0ZXIpLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhPYmplY3QgYWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKCgoTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcikgYWRhcHRlcikuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsSW5pdGlhbFZhbHVlKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+KCk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlciA9IG5ldyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKHRoaXMudmFsdWVIb2xkZXIsIG5ldyBJbnRlZ2VyKC0zMyksIG5ldyBJbnRlZ2VyKDMzKSwgbmV3IEludGVnZXIoMSksIG5ldyBJbnRlZ2VyKDApKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTnVtYmVyQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGROdW1iZXJDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMCksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcig3KSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDcpLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQlwcml2YXRlIGNsYXNzIFRlc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyIHsKLQkJVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjU1ODY0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuRGVmYXVsdExpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3RTZWxlY3Rpb25MaXN0ZW5lcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBEZWZhdWx0TGlzdE1vZGVsIGxpc3RNb2RlbDsKLQlwcml2YXRlIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBzZWxlY3Rpb25Nb2RlbDsKLQotCXB1YmxpYyBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwoKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbCA9IHRoaXMuYnVpbGRTZWxlY3Rpb25Nb2RlbCh0aGlzLmxpc3RNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBEZWZhdWx0TGlzdE1vZGVsIGJ1aWxkTGlzdE1vZGVsKCkgewotCQlEZWZhdWx0TGlzdE1vZGVsIGxtID0gbmV3IERlZmF1bHRMaXN0TW9kZWwoKTsKLQkJbG0uYWRkRWxlbWVudCgiZm9vIik7Ci0JCWxtLmFkZEVsZW1lbnQoImJhciIpOwotCQlsbS5hZGRFbGVtZW50KCJiYXoiKTsKLQkJcmV0dXJuIGxtOwotCX0KLQotCXByaXZhdGUgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGJ1aWxkU2VsZWN0aW9uTW9kZWwoTGlzdE1vZGVsIGxtKSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsKGxtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3REYXRhTGlzdGVuZXIoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuYWRkTGlzdFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0aW9uSW50ZXJ2YWwoMCwgMCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCkpOwotCQl0aGlzLmxpc3RNb2RlbC5zZXQoMCwgImphciIpOwotCQlhc3NlcnRFcXVhbHMoImphciIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2VsZWN0ZWRWYWx1ZSgpIHsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3Rpb25JbnRlcnZhbCgwLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNlbGVjdGVkVmFsdWVzKCkgewotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGlvbkludGVydmFsKDAsIDApOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLmFkZFNlbGVjdGlvbkludGVydmFsKDIsIDIpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyh0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCksICJmb28iKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyh0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCksICJiYXoiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1pblNlbGVjdGlvbkluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNYXhTZWxlY3Rpb25JbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2VsZWN0ZWRWYWx1ZXMoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZXMobmV3IE9iamVjdFtdIHsiZm9vIiwgImJheiJ9KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1heFNlbGVjdGlvbkluZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTZWxlY3RlZFZhbHVlKCkgewotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpheiIpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoImZvbyIpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLmFkZFNlbGVjdGVkVmFsdWUoImpheiIpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNaW5TZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgxKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCg0KSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTZWxlY3RlZFZhbHVlcygpIHsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiam9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImphciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXoiKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKCJmb28iKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5hZGRTZWxlY3RlZFZhbHVlcyhuZXcgT2JqZWN0W10geyJiYXIiLCAiamFyIn0pOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNaW5TZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDEpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgzKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoNCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamF6Iik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZXMobmV3IE9iamVjdFtdIHsiZm9vIiwgImJheiIsICJqYXIifSk7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwucmVtb3ZlU2VsZWN0ZWRWYWx1ZSgiamFyIik7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1pblNlbGVjdGlvbkluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNYXhTZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgwKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDEpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgyKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoNCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNlbGVjdGVkVmFsdWVzKCkgewotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpheiIpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWVzKG5ldyBPYmplY3RbXSB7ImZvbyIsICJiYXoiLCAiam9vIiwgImphciJ9KTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5yZW1vdmVTZWxlY3RlZFZhbHVlcyhuZXcgT2JqZWN0W10geyJmb28iLCAiam9vIn0pOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNaW5TZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDApKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDQpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbmNob3JTZWxlY3RlZFZhbHVlKCkgewotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldEFuY2hvclNlbGVjdGlvbkluZGV4KDEpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0QW5jaG9yU2VsZWN0ZWRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TGVhZFNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRMZWFkU2VsZWN0ZWRWYWx1ZSgpKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlcyhuZXcgT2JqZWN0W10geyJmb28iLCAiYmF6In0pOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TGVhZFNlbGVjdGVkVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1pbk1heFNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamF6Iik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZSgiZm9vIik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuYWRkU2VsZWN0ZWRWYWx1ZXMobmV3IE9iamVjdFtdIHsiYmFyIiwgImphciJ9KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1pblNlbGVjdGVkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamFyIiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNYXhTZWxlY3RlZFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUlzU2VsZWN0ZWQoKSB7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamF6Iik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZSgiZm9vIik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuYWRkU2VsZWN0ZWRWYWx1ZXMobmV3IE9iamVjdFtdIHsiYmFyIiwgImphciJ9KTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLnZhbHVlSXNTZWxlY3RlZCgiZm9vIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwudmFsdWVJc1NlbGVjdGVkKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC52YWx1ZUlzU2VsZWN0ZWQoImphciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC52YWx1ZUlzU2VsZWN0ZWQoImJheiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3RTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMubGlzdE1vZGVsLmdldExpc3REYXRhTGlzdGVuZXJzKCkubGVuZ3RoKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5hZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5saXN0TW9kZWwuZ2V0TGlzdERhdGFMaXN0ZW5lcnMoKS5sZW5ndGgpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnJlbW92ZUxpc3RTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmxpc3RNb2RlbC5nZXRMaXN0RGF0YUxpc3RlbmVycygpLmxlbmd0aCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0U2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKExpc3RTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZyBmb3Igbm93Li4uCi0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYTFiZWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1ByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0TXV0YWJsZVRyZWVOb2RlOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZU1vZGVsOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuUHJpbWl0aXZlTGlzdFRyZWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVMaXN0VHJlZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlwcml2YXRlIFRyZWVNb2RlbCB0cmVlTW9kZWw7Ci0KLQlwdWJsaWMgUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudGVzdE1vZGVsID0gdGhpcy5idWlsZFRlc3RNb2RlbCgpOwotCQl0aGlzLnRyZWVNb2RlbCA9IHRoaXMuYnVpbGRUcmVlTW9kZWwoKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3RNb2RlbCBidWlsZFRlc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0TW9kZWwoKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVNb2RlbCBidWlsZFRyZWVNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcmltaXRpdmVMaXN0VHJlZU1vZGVsKHRoaXMuYnVpbGRMaXN0VmFsdWVNb2RlbCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHByaW1pdGl2ZUNoYW5nZWQoaW50IGluZGV4LCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJCQlpZiAoICEgbmV3VmFsdWUuZXF1YWxzKCIiKSkgewotCQkJCQlQcmltaXRpdmVMaXN0VHJlZU1vZGVsVGVzdHMudGhpcy50ZXN0TW9kZWwucmVwbGFjZU5hbWUoaW5kZXgsIChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDw/PiBidWlsZExpc3RWYWx1ZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgU3RyaW5nPihUZXN0TW9kZWwuTkFNRVNfTElTVCwgdGhpcy50ZXN0TW9kZWwpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5uYW1lcygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldChpbnQgaW5kZXgpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoaW5kZXgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5uYW1lc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFByaW1pdGl2ZSgpIHsKLQkJdGhpcy50cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzSW5zZXJ0ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cy50aGlzLnZlcmlmeVRyZWVNb2RlbEV2ZW50KGUsIG5ldyBpbnRbXSB7MH0sIG5ldyBTdHJpbmdbXSB7ImZvbyJ9KTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZE5hbWUoImZvbyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQcmltaXRpdmUoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZE5hbWUoImZvbyIpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGROYW1lKCJiYXIiKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTmFtZSgiYmF6Iik7Ci0JCXRoaXMudHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc1JlbW92ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cy50aGlzLnZlcmlmeVRyZWVNb2RlbEV2ZW50KGUsIG5ldyBpbnRbXSB7MX0sIG5ldyBTdHJpbmdbXSB7ImJhciJ9KTsKLQkJCX0KLQkJfSk7Ci0JCVN0cmluZyBuYW1lID0gdGhpcy50ZXN0TW9kZWwucmVtb3ZlTmFtZSgxKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVByaW1pdGl2ZSgpIHsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTmFtZSgiZm9vIik7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZE5hbWUoImJhciIpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGROYW1lKCJiYXoiKTsKLQkJdGhpcy50cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzQ2hhbmdlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzLnRoaXMudmVyaWZ5VHJlZU1vZGVsRXZlbnQoZSwgbmV3IGludFtdIHsxfSwgbmV3IFN0cmluZ1tdIHsiamFyIn0pOwotCQkJfQotCQl9KTsKLQkJU3RyaW5nIG5hbWUgPSB0aGlzLnRlc3RNb2RlbC5yZXBsYWNlTmFtZSgxLCAiamFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgbmFtZSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlUcmVlTW9kZWxFdmVudChUcmVlTW9kZWxFdmVudCBlLCBpbnRbXSBleHBlY3RlZENoaWxkSW5kaWNlcywgU3RyaW5nW10gZXhwZWN0ZWROYW1lcykgewotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWRDaGlsZEluZGljZXMsIGUuZ2V0Q2hpbGRJbmRpY2VzKCkpKTsKLQkJT2JqZWN0W10gYWN0dWFsQ2hpbGRyZW4gPSBlLmdldENoaWxkcmVuKCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZE5hbWVzLmxlbmd0aCwgYWN0dWFsQ2hpbGRyZW4ubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIG5vZGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSkgYWN0dWFsQ2hpbGRyZW5baV07Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWROYW1lc1tpXSwgbm9kZS5nZXRVc2VyT2JqZWN0KCkpOwotCQl9Ci0JCWFzc2VydEVxdWFscygxLCBlLmdldFBhdGgoKS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHModGhpcy50cmVlTW9kZWwuZ2V0Um9vdCgpLCBlLmdldFBhdGgoKVswXSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRyZWVNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JfQotCi0KLS8vICoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQljbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gbmFtZXM7Ci0JCQlzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTX0xJU1QgPSAibmFtZXMiOwotCQotCQlUZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5uYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl9Ci0JCi0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBuYW1lcygpIHsKLQkJCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLm5hbWVzKTsKLQkJfQotCQlwdWJsaWMgaW50IG5hbWVzU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWVzLnNpemUoKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lcy5nZXQoaW5kZXgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWUoaW50IGluZGV4LCBTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KGluZGV4LCBuYW1lLCB0aGlzLm5hbWVzLCBOQU1FU19MSVNUKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLmFkZE5hbWUodGhpcy5uYW1lc1NpemUoKSwgbmFtZSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZXMoaW50IGluZGV4LCBMaXN0PFN0cmluZz4gbGlzdCkgewotCQkJdGhpcy5hZGRJdGVtc1RvTGlzdChpbmRleCwgdGhpcy5uYW1lcywgbGlzdCwgTkFNRVNfTElTVCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZXMoTGlzdDxTdHJpbmc+IGxpc3QpIHsKLQkJCXRoaXMuYWRkTmFtZXModGhpcy5uYW1lc1NpemUoKSwgbGlzdCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyByZW1vdmVOYW1lKGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLm5hbWVzLCBOQU1FU19MSVNUKTsKLQkJfQotCQlwdWJsaWMgTGlzdDxTdHJpbmc+IHJlbW92ZU5hbWVzKGludCBpbmRleCwgaW50IGxlbmd0aCkgewotCQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdChpbmRleCwgbGVuZ3RoLCB0aGlzLm5hbWVzLCBOQU1FU19MSVNUKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHJlcGxhY2VOYW1lKGludCBpbmRleCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJCXJldHVybiB0aGlzLnNldEl0ZW1Jbkxpc3QoaW5kZXgsIG5ld05hbWUsIHRoaXMubmFtZXMsIE5BTUVTX0xJU1QpOwotCQl9Ci0JfQotCQotCQotCXB1YmxpYyBjbGFzcyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIgaW1wbGVtZW50cyBUcmVlTW9kZWxMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc0NoYW5nZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc0luc2VydGVkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNSZW1vdmVkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0cmVlU3RydWN0dXJlQ2hhbmdlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDk3NDliLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5CdXR0b25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5FdmVudExpc3RlbmVyTGlzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5SYWRpb0J1dHRvbk1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0KLQlwcml2YXRlIEJ1dHRvbk1vZGVsIHJlZEJ1dHRvbk1vZGVsQWRhcHRlcjsKLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIHJlZExpc3RlbmVyOwotCWJvb2xlYW4gcmVkRXZlbnRGaXJlZDsKLQotCXByaXZhdGUgQnV0dG9uTW9kZWwgZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXI7Ci0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBncmVlbkxpc3RlbmVyOwotCWJvb2xlYW4gZ3JlZW5FdmVudEZpcmVkOwotCi0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBibHVlQnV0dG9uTW9kZWxBZGFwdGVyOwotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYmx1ZUxpc3RlbmVyOwotCWJvb2xlYW4gYmx1ZUV2ZW50RmlyZWQ7Ci0KLS8vCXByaXZhdGUgQnV0dG9uR3JvdXAgYnV0dG9uR3JvdXA7CS8vIERPIE5PVCB1c2UgYSBCdXR0b25Hcm91cAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRCA9ICJyZWQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVFTiA9ICJncmVlbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJMVUUgPSAiYmx1ZSI7Ci0KLQlwdWJsaWMgUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KG51bGwpOwotLy8JCWJ1dHRvbkdyb3VwID0gbmV3IEJ1dHRvbkdyb3VwKCk7Ci0KLQkJdGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIgPSB0aGlzLmJ1aWxkQnV0dG9uTW9kZWwodGhpcy52YWx1ZUhvbGRlciwgUkVEKTsKLS8vCQl0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5zZXRHcm91cChidXR0b25Hcm91cCk7Ci0JCXRoaXMucmVkTGlzdGVuZXIgPSBuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCVJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5yZWRFdmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfTsKLQotCQl0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyID0gdGhpcy5idWlsZEJ1dHRvbk1vZGVsKHRoaXMudmFsdWVIb2xkZXIsIEdSRUVOKTsKLS8vCQl0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLnNldEdyb3VwKGJ1dHRvbkdyb3VwKTsKLQkJdGhpcy5ncmVlbkxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZ3JlZW5FdmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfTsKLQotCQl0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIgPSB0aGlzLmJ1aWxkQnV0dG9uTW9kZWwodGhpcy52YWx1ZUhvbGRlciwgQkxVRSk7Ci0vLwkJdGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyLnNldEdyb3VwKGJ1dHRvbkdyb3VwKTsKLQkJdGhpcy5ibHVlTGlzdGVuZXIgPSBuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCVJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ibHVlRXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX07Ci0JCQotCQl0aGlzLmNsZWFyRmxhZ3MoKTsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGJ1aWxkQnV0dG9uTW9kZWwoTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHB2bSwgT2JqZWN0IGJ1dHRvblZhbHVlKSB7Ci0JCXJldHVybiBuZXcgUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIocHZtLCBidXR0b25WYWx1ZSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGlzdGVuVG9Nb2RlbEFkYXB0ZXJzKCkgewotCQl0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLnJlZExpc3RlbmVyKTsKLQkJdGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmdyZWVuTGlzdGVuZXIpOwotCQl0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5ibHVlTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckZsYWdzKCkgewotCQl0aGlzLnJlZEV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5ncmVlbkV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5ibHVlRXZlbnRGaXJlZCA9IGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2VsZWN0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5saXN0ZW5Ub01vZGVsQWRhcHRlcnMoKTsKLQotCQl0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLnNldFNlbGVjdGVkKHRydWUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuZ3JlZW5FdmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ibHVlRXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhHUkVFTiwgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmNsZWFyRmxhZ3MoKTsKLQkJdGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyLnNldFNlbGVjdGVkKHRydWUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuZ3JlZW5FdmVudEZpcmVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJsdWVFdmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKEJMVUUsIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5jbGVhckZsYWdzKCk7Ci0JCXRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLnNldFNlbGVjdGVkKHRydWUpOwotCQlhc3NlcnRUcnVlKHRoaXMucmVkRXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZ3JlZW5FdmVudEZpcmVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJsdWVFdmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKFJFRCwgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5saXN0ZW5Ub01vZGVsQWRhcHRlcnMoKTsKLQotCQl0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLnNldFNlbGVjdGVkKHRydWUpOwotCi0JCXRoaXMuY2xlYXJGbGFncygpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKEJMVUUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuZ3JlZW5FdmVudEZpcmVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJsdWVFdmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCi0JCXRoaXMuY2xlYXJGbGFncygpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKFJFRCk7Ci0JCWFzc2VydFRydWUodGhpcy5yZWRFdmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmx1ZUV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmxpc3RlblRvTW9kZWxBZGFwdGVycygpOwotCi0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUoR1JFRU4pOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0KLQkJdGhpcy5jbGVhckZsYWdzKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJsdWVFdmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQotCQl0aGlzLmNsZWFyRmxhZ3MoKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShCTFVFKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5yZWRFdmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmx1ZUV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBsb2NhbFZhbHVlSG9sZGVyID0gKFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KSB0aGlzLnZhbHVlSG9sZGVyOwotCQlhc3NlcnRGYWxzZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0KLQkJdGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhPYmplY3QgbW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlFdmVudExpc3RlbmVyTGlzdCBsaXN0ZW5lckxpc3QgPSAoRXZlbnRMaXN0ZW5lckxpc3QpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKG1vZGVsLCAibGlzdGVuZXJMaXN0Iik7Ci0JCWFzc2VydEVxdWFscygwLCBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJMaXN0KCkubGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKE9iamVjdCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUV2ZW50TGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdCA9IChFdmVudExpc3RlbmVyTGlzdCkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUobW9kZWwsICJsaXN0ZW5lckxpc3QiKTsKLQkJYXNzZXJ0RmFsc2UobGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpLmxlbmd0aCA9PSAwKTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGVzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIgewotCQlUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYzE5NjMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dMaXN0ZW5lcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5CdXR0b25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlJhZGlvQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2YgcmFkaW8gYnV0dG9ucy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJVSVRlc3QgewotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHRlc3RNb2RlbEhvbGRlcjsKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBjb2xvckhvbGRlcjsKLQlwcml2YXRlIEJ1dHRvbk1vZGVsIHJlZEJ1dHRvbk1vZGVsOwotCXByaXZhdGUgQnV0dG9uTW9kZWwgZ3JlZW5CdXR0b25Nb2RlbDsKLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGJsdWVCdXR0b25Nb2RlbDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJVSVRlc3QoKS5leGVjKCk7Ci0JfQotCi0JcHJpdmF0ZSBSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlYygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4odGhpcy50ZXN0TW9kZWwpOwotCQl0aGlzLmNvbG9ySG9sZGVyID0gdGhpcy5idWlsZENvbG9ySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5yZWRCdXR0b25Nb2RlbCA9IHRoaXMuYnVpbGRSYWRpb0J1dHRvbk1vZGVsQWRhcHRlcih0aGlzLmNvbG9ySG9sZGVyLCBUZXN0TW9kZWwuUkVEKTsKLQkJdGhpcy5ncmVlbkJ1dHRvbk1vZGVsID0gdGhpcy5idWlsZFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKHRoaXMuY29sb3JIb2xkZXIsIFRlc3RNb2RlbC5HUkVFTik7Ci0JCXRoaXMuYmx1ZUJ1dHRvbk1vZGVsID0gdGhpcy5idWlsZFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKHRoaXMuY29sb3JIb2xkZXIsIFRlc3RNb2RlbC5CTFVFKTsKLQkJdGhpcy5vcGVuV2luZG93KCk7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRDb2xvckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgT2JqZWN0PihzdWJqZWN0SG9sZGVyLCBUZXN0TW9kZWwuQ09MT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9iamVjdCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbG9yKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0Q29sb3IoKFN0cmluZykgdmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQnV0dG9uTW9kZWwgYnVpbGRSYWRpb0J1dHRvbk1vZGVsQWRhcHRlcihNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gY29sb3JQVk0sIFN0cmluZyBjb2xvcikgewotCQlyZXR1cm4gbmV3IFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKGNvbG9yUFZNLCBjb2xvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5XaW5kb3coKSB7Ci0JCUpGcmFtZSB3aW5kb3cgPSBuZXcgSkZyYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQl3aW5kb3cuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5ET19OT1RISU5HX09OX0NMT1NFKTsKLQkJd2luZG93LmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMuYnVpbGRXaW5kb3dMaXN0ZW5lcigpKTsKLQkJd2luZG93LmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMuYnVpbGRNYWluUGFuZWwoKSwgIkNlbnRlciIpOwotCQl3aW5kb3cuc2V0U2l6ZSg0MDAsIDEwMCk7Ci0JCXdpbmRvdy5zZXRMb2NhdGlvbigyMDAsIDIwMCk7Ci0JCXdpbmRvdy5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCXByaXZhdGUgV2luZG93TGlzdGVuZXIgYnVpbGRXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaW5kb3dBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKLQkJCQllLmdldFdpbmRvdygpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCVN5c3RlbS5leGl0KDApOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTWFpblBhbmVsKCkgewotCQlKUGFuZWwgbWFpblBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRSYWRpb0J1dHRvblBhbmVsKCksIEJvcmRlckxheW91dC5OT1JUSCk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbnRyb2xQYW5lbCgpLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkUmFkaW9CdXR0b25QYW5lbCgpIHsKLQkJSlBhbmVsIHRhc2tMaXN0UGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZFJlZFJhZGlvQnV0dG9uKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkR3JlZW5SYWRpb0J1dHRvbigpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZEJsdWVSYWRpb0J1dHRvbigpKTsKLQkJcmV0dXJuIHRhc2tMaXN0UGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKUmFkaW9CdXR0b24gYnVpbGRSZWRSYWRpb0J1dHRvbigpIHsKLQkJSlJhZGlvQnV0dG9uIHJhZGlvQnV0dG9uID0gbmV3IEpSYWRpb0J1dHRvbigpOwotCQlyYWRpb0J1dHRvbi5zZXRUZXh0KCJyZWQiKTsKLQkJcmFkaW9CdXR0b24uc2V0TW9kZWwodGhpcy5yZWRCdXR0b25Nb2RlbCk7Ci0JCXJldHVybiByYWRpb0J1dHRvbjsKLQl9Ci0KLQlwcml2YXRlIEpSYWRpb0J1dHRvbiBidWlsZEdyZWVuUmFkaW9CdXR0b24oKSB7Ci0JCUpSYWRpb0J1dHRvbiByYWRpb0J1dHRvbiA9IG5ldyBKUmFkaW9CdXR0b24oKTsKLQkJcmFkaW9CdXR0b24uc2V0VGV4dCgiZ3JlZW4iKTsKLQkJcmFkaW9CdXR0b24uc2V0TW9kZWwodGhpcy5ncmVlbkJ1dHRvbk1vZGVsKTsKLQkJcmV0dXJuIHJhZGlvQnV0dG9uOwotCX0KLQotCXByaXZhdGUgSlJhZGlvQnV0dG9uIGJ1aWxkQmx1ZVJhZGlvQnV0dG9uKCkgewotCQlKUmFkaW9CdXR0b24gcmFkaW9CdXR0b24gPSBuZXcgSlJhZGlvQnV0dG9uKCk7Ci0JCXJhZGlvQnV0dG9uLnNldFRleHQoImJsdWUiKTsKLQkJcmFkaW9CdXR0b24uc2V0TW9kZWwodGhpcy5ibHVlQnV0dG9uTW9kZWwpOwotCQlyZXR1cm4gcmFkaW9CdXR0b247Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRDb250cm9sUGFuZWwoKSB7Ci0JCUpQYW5lbCBjb250cm9sUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzZXRDb2xvckJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRQcmludE1vZGVsQnV0dG9uKCkpOwotCQlyZXR1cm4gY29udHJvbFBhbmVsOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlc2V0Q29sb3JCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzZXRDb2xvckFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc2V0Q29sb3JBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlc2V0IGNvbG9yIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXNldENvbG9yKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzZXRDb2xvcigpIHsKLQkJdGhpcy50ZXN0TW9kZWwuc2V0Q29sb3IoVGVzdE1vZGVsLkRFRkFVTFRfQ09MT1IpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZENsZWFyTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZENsZWFyTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImNsZWFyIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzdG9yZSBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRQcmludE1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUHJpbnRNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicHJpbnQgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBwcmludE1vZGVsKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy50ZXN0TW9kZWwpOwotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIGNvbG9yOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfUFJPUEVSVFkgPSAiY29sb3IiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVEID0gInJlZCI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVFTiA9ICJncmVlbiI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTFVFID0gImJsdWUiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT0xPUiA9IFJFRDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMSURfQ09MT1JTID0gewotCQkJCVJFRCwKLQkJCQlHUkVFTiwKLQkJCQlCTFVFCi0JCQl9OwotCQotCQlwdWJsaWMgVGVzdE1vZGVsKCkgewotCQkJdGhpcyhERUZBVUxUX0NPTE9SKTsKLQkJfQotCQlwdWJsaWMgVGVzdE1vZGVsKFN0cmluZyBjb2xvcikgewotCQkJdGhpcy5jb2xvciA9IGNvbG9yOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sb3IoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2xvcjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihTdHJpbmcgY29sb3IpIHsKLQkJCWlmICggISBBcnJheVRvb2xzLmNvbnRhaW5zKFZBTElEX0NPTE9SUywgY29sb3IpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjb2xvcik7Ci0JCQl9Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5jb2xvcjsKLQkJCXRoaXMuY29sb3IgPSBjb2xvcjsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT0xPUl9QUk9QRVJUWSwgb2xkLCBjb2xvcik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbCgiICsgdGhpcy5jb2xvciArICIpIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JlYWRPbmx5VGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SZWFkT25seVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyY2IxZDIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JlYWRPbmx5VGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkNvbHVtbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRhYmxlTW9kZWxBZGFwdGVyVGVzdHMuUGVyc29uQ29sdW1uQWRhcHRlcjsKLQotLyoqCi0gKiBNYWtlIGl0IGVhc3kgdG8gdGVzdCB0aGUgdGFibGUgbW9kZWwgYWRhcHRlciBhbmQKLSAqIHJlbmRlcmVycyB3aXRob3V0IGFueSBlZGl0aW5nIGFsbG93ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkT25seVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0IGV4dGVuZHMgVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBSZWFkT25seVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0KCkuZXhlYyhhcmdzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVhZE9ubHlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29sdW1uQWRhcHRlciBidWlsZENvbHVtbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUGVyc29uQ29sdW1uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gY29sdW1uSXNFZGl0YWJsZShpbnQgaW5kZXgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZWIzZWEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1NwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0JU3Bpbm5lck1vZGVsIHNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci0JYm9vbGVhbiBldmVudEZpcmVkOwotCi0JcHVibGljIFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KG5ldyBJbnRlZ2VyKDApKTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyID0gbmV3IFNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy52YWx1ZUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRWYWx1ZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVTcGlubmVyTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJCWFzc2VydEVxdWFscyhTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLCBlLmdldFNvdXJjZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcig1KSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDUpLCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVZhbHVlSG9sZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCQlhc3NlcnRFcXVhbHMoU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlciwgZS5nZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMCksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcig3KSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDcpLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBsb2NhbFZhbHVlSG9sZGVyID0gKFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KSB0aGlzLnZhbHVlSG9sZGVyOwotCQlhc3NlcnRGYWxzZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyKTsKLQotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKE9iamVjdCBhZGFwdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT2JqZWN0IGRlbGVnYXRlID0gUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUoYWRhcHRlciwgImRlbGVnYXRlIik7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IChPYmplY3RbXSkgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QoZGVsZWdhdGUsICJnZXRDaGFuZ2VMaXN0ZW5lcnMiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3RlbmVycy5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoT2JqZWN0IGFkYXB0ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlPYmplY3QgZGVsZWdhdGUgPSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShhZGFwdGVyLCAiZGVsZWdhdGUiKTsKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gKE9iamVjdFtdKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChkZWxlZ2F0ZSwgImdldENoYW5nZUxpc3RlbmVycyIpOwotCQlhc3NlcnRGYWxzZShsaXN0ZW5lcnMubGVuZ3RoID09IDApOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lciB7Ci0JCVRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1NwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMThmOTIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1NwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZExheW91dDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlNwaW5uZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogUGxheSBhcm91bmQgd2l0aCBhIHNldCBvZiBzcGlubmVycy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3Bpbm5lck1vZGVsQWRhcHRlclVJVGVzdCB7Ci0KLQlwcml2YXRlIFRlc3RNb2RlbCB0ZXN0TW9kZWw7Ci0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdGVzdE1vZGVsSG9sZGVyOwotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYmlydGhEYXRlSG9sZGVyOwotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGJpcnRoRGF0ZVNwaW5uZXJNb2RlbDsKLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IGFnZUhvbGRlcjsKLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBhZ2VTcGlubmVyTW9kZWw7Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBleWVDb2xvckhvbGRlcjsKLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBleWVDb2xvclNwaW5uZXJNb2RlbDsKLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBTcGlubmVyTW9kZWxBZGFwdGVyVUlUZXN0KCkuZXhlYygpOwotCX0KLQotCXByaXZhdGUgU3Bpbm5lck1vZGVsQWRhcHRlclVJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlYygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4odGhpcy50ZXN0TW9kZWwpOwotCi0JCXRoaXMuYmlydGhEYXRlSG9sZGVyID0gdGhpcy5idWlsZEJpcnRoRGF0ZUhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMuYmlydGhEYXRlU3Bpbm5lck1vZGVsID0gdGhpcy5idWlsZEJpcnRoRGF0ZVNwaW5uZXJNb2RlbCh0aGlzLmJpcnRoRGF0ZUhvbGRlcik7Ci0KLQkJdGhpcy5hZ2VIb2xkZXIgPSB0aGlzLmJ1aWxkQWdlSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5hZ2VTcGlubmVyTW9kZWwgPSB0aGlzLmJ1aWxkQWdlU3Bpbm5lck1vZGVsKHRoaXMuYWdlSG9sZGVyKTsKLQotCQl0aGlzLmV5ZUNvbG9ySG9sZGVyID0gdGhpcy5idWlsZEV5ZUNvbG9ySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5leWVDb2xvclNwaW5uZXJNb2RlbCA9IHRoaXMuYnVpbGRFeWVDb2xvclNwaW5uZXJNb2RlbCh0aGlzLmV5ZUNvbG9ySG9sZGVyKTsKLQotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEJpcnRoRGF0ZUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIE9iamVjdD4odm0sIFRlc3RNb2RlbC5CSVJUSF9EQVRFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPYmplY3QgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRCaXJ0aERhdGUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRCaXJ0aERhdGUoKERhdGUpIHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBidWlsZEJpcnRoRGF0ZVNwaW5uZXJNb2RlbChNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcih2YWx1ZUhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gYnVpbGRBZ2VIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdm0pIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBOdW1iZXI+KHZtLCBUZXN0TW9kZWwuQUdFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBOdW1iZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHRoaXMuc3ViamVjdC5nZXRBZ2UoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhOdW1iZXIgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0QWdlKHZhbHVlLmludFZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGJ1aWxkQWdlU3Bpbm5lck1vZGVsKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiB2YWx1ZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIodmFsdWVIb2xkZXIsIHZhbHVlSG9sZGVyLmdldFZhbHVlKCkuaW50VmFsdWUoKSwgVGVzdE1vZGVsLk1JTl9BR0UsIFRlc3RNb2RlbC5NQVhfQUdFLCAxKTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEV5ZUNvbG9ySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHZtKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgT2JqZWN0Pih2bSwgVGVzdE1vZGVsLkVZRV9DT0xPUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT2JqZWN0IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RXllQ29sb3IoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRFeWVDb2xvcigoU3RyaW5nKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgYnVpbGRFeWVDb2xvclNwaW5uZXJNb2RlbChNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcih2YWx1ZUhvbGRlciwgVGVzdE1vZGVsLlZBTElEX0VZRV9DT0xPUlMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQlKRnJhbWUgd2luZG93ID0gbmV3IEpGcmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJd2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXdpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXdpbmRvdy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmJ1aWxkTWFpblBhbmVsKCksICJDZW50ZXIiKTsKLQkJd2luZG93LnNldFNpemUoNjAwLCAxMDApOwotCQl3aW5kb3cuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIGJ1aWxkV2luZG93TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2luZG93QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJZS5nZXRXaW5kb3coKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE1haW5QYW5lbCgpIHsKLQkJSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkU3Bpbm5lclBhbmVsKCksIEJvcmRlckxheW91dC5OT1JUSCk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbnRyb2xQYW5lbCgpLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkU3Bpbm5lclBhbmVsKCkgewotCQlKUGFuZWwgdGFza0xpc3RQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkQmlydGhEYXRlU3Bpbm5lcigpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZEFnZVNwaW5uZXIoKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRFeWVDb2xvclNwaW5uZXIoKSk7Ci0JCXJldHVybiB0YXNrTGlzdFBhbmVsOwotCX0KLQotCXByaXZhdGUgSlNwaW5uZXIgYnVpbGRCaXJ0aERhdGVTcGlubmVyKCkgewotCQlyZXR1cm4gbmV3IEpTcGlubmVyKHRoaXMuYmlydGhEYXRlU3Bpbm5lck1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIEpTcGlubmVyIGJ1aWxkQWdlU3Bpbm5lcigpIHsKLQkJcmV0dXJuIG5ldyBKU3Bpbm5lcih0aGlzLmFnZVNwaW5uZXJNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBKU3Bpbm5lciBidWlsZEV5ZUNvbG9yU3Bpbm5lcigpIHsKLQkJcmV0dXJuIG5ldyBKU3Bpbm5lcih0aGlzLmV5ZUNvbG9yU3Bpbm5lck1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXNldE1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24oKSk7Ci0JCXJldHVybiBjb250cm9sUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzZXRNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXNldE1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzZXRNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzZXQgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlTcGlubmVyTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzZXRNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlc2V0TW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLnNldEJpcnRoRGF0ZShUZXN0TW9kZWwuREVGQVVMVF9CSVJUSF9EQVRFKTsKLQkJdGhpcy50ZXN0TW9kZWwuc2V0RXllQ29sb3IoVGVzdE1vZGVsLkRFRkFVTFRfRVlFX0NPTE9SKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZENsZWFyTW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRDbGVhck1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJjbGVhciBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzdG9yZSBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRQcmludE1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFByaW50TW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRQcmludE1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJwcmludCBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5wcmludE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcHJpbnRNb2RlbCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiaXJ0aCBkYXRlOiAiICsgdGhpcy50ZXN0TW9kZWwuZ2V0QmlydGhEYXRlKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImFnZTogIiArIHRoaXMudGVzdE1vZGVsLmdldEFnZSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJleWVzOiAiICsgdGhpcy50ZXN0TW9kZWwuZ2V0RXllQ29sb3IoKSk7Ci0JfQotCi0KLQlzdGF0aWMgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgQ2FsZW5kYXIgYmlydGhDYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotCQkJLy8gInZpcnR1YWwiIHByb3BlcnRpZXMKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJUlRIX0RBVEVfUFJPUEVSVFkgPSAiYmlydGhEYXRlIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFHRV9QUk9QRVJUWSA9ICJhZ2UiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBEYXRlIERFRkFVTFRfQklSVEhfREFURSA9IG5ldyBEYXRlKCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0FHRSA9IDA7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fQUdFID0gMDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9BR0UgPSAxNTA7Ci0JCXByaXZhdGUgU3RyaW5nIGV5ZUNvbG9yOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVlFX0NPTE9SX1BST1BFUlRZID0gImV5ZUNvbG9yIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMSURfRVlFX0NPTE9SUyA9IHsiYmx1ZSIsICJicm93biIsICJncmVlbiIsICJoYXplbCIsICJwaW5rIn07Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VZRV9DT0xPUiA9IFZBTElEX0VZRV9DT0xPUlNbM107Ci0JCi0JCVRlc3RNb2RlbCgpIHsKLQkJCXRoaXMoREVGQVVMVF9CSVJUSF9EQVRFLCBERUZBVUxUX0VZRV9DT0xPUik7Ci0JCX0KLQkJcHVibGljIFRlc3RNb2RlbChEYXRlIGJpcnRoRGF0ZSwgU3RyaW5nIGV5ZUNvbG9yKSB7Ci0JCQl0aGlzLnNldEJpcnRoRGF0ZShiaXJ0aERhdGUpOwotCQkJdGhpcy5zZXRFeWVDb2xvcihleWVDb2xvcik7Ci0JCX0KLQkJcHVibGljIERhdGUgZ2V0QmlydGhEYXRlKCkgewotCQkJcmV0dXJuIChEYXRlKSB0aGlzLmJpcnRoQ2FsLmdldFRpbWUoKS5jbG9uZSgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEJpcnRoRGF0ZShEYXRlIGJpcnRoRGF0ZSkgewotCQkJRGF0ZSBvbGRCaXJ0aERhdGUgPSB0aGlzLmdldEJpcnRoRGF0ZSgpOwotCQkJaW50IG9sZEFnZSA9IHRoaXMuZ2V0QWdlKCk7Ci0JCQl0aGlzLmJpcnRoQ2FsLnNldFRpbWVJbk1pbGxpcyhiaXJ0aERhdGUuZ2V0VGltZSgpKTsKLQkJCWludCBuZXdBZ2UgPSB0aGlzLmdldEFnZSgpOwotCQkJaWYgKG5ld0FnZSA8IE1JTl9BR0UgfHwgbmV3QWdlID4gTUFYX0FHRSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oYmlydGhEYXRlLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEJJUlRIX0RBVEVfUFJPUEVSVFksIG9sZEJpcnRoRGF0ZSwgdGhpcy5nZXRCaXJ0aERhdGUoKSk7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQUdFX1BST1BFUlRZLCBvbGRBZ2UsIG5ld0FnZSk7Ci0JCX0KLQkJcHVibGljIGludCBnZXRBZ2UoKSB7Ci0JCQlDYWxlbmRhciBjdXJyZW50Q2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWludCBhZ2UgPSBjdXJyZW50Q2FsLmdldChDYWxlbmRhci5ZRUFSKSAtIHRoaXMuYmlydGhDYWwuZ2V0KENhbGVuZGFyLllFQVIpOwotCQkJaWYgKGN1cnJlbnRDYWwuZ2V0KENhbGVuZGFyLk1PTlRIKSA8IHRoaXMuYmlydGhDYWwuZ2V0KENhbGVuZGFyLk1PTlRIKSkgewotCQkJCWFnZS0tOwotCQkJfSBlbHNlIGlmIChjdXJyZW50Q2FsLmdldChDYWxlbmRhci5NT05USCkgPT0gdGhpcy5iaXJ0aENhbC5nZXQoQ2FsZW5kYXIuTU9OVEgpKSB7Ci0JCQkJaWYgKGN1cnJlbnRDYWwuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCkgPCB0aGlzLmJpcnRoQ2FsLmdldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpKSB7Ci0JCQkJCWFnZS0tOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBhZ2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0QWdlKGludCBuZXdBZ2UpIHsKLQkJCWlmIChuZXdBZ2UgPCBNSU5fQUdFIHx8IG5ld0FnZSA+IE1BWF9BR0UpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy52YWx1ZU9mKG5ld0FnZSkpOwotCQkJfQotCQotCQkJaW50IG9sZEFnZSA9IHRoaXMuZ2V0QWdlKCk7Ci0JCQlpbnQgZGVsdGEgPSBuZXdBZ2UgLSBvbGRBZ2U7Ci0JCi0JCQlDYWxlbmRhciBuZXdCaXJ0aENhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0JCQluZXdCaXJ0aENhbC5zZXRUaW1lSW5NaWxsaXModGhpcy5iaXJ0aENhbC5nZXRUaW1lKCkuZ2V0VGltZSgpKTsKLQkJCS8vIGlmIHRoZSBhZ2UgaW5jcmVhc2VkLCB0aGUgYmlydGggZGF0ZSBtdXN0IGJlICJkZWNyZWFzZWQiOyBhbmQgdmljZSB2ZXJzYQotCQkJbmV3QmlydGhDYWwuc2V0KENhbGVuZGFyLllFQVIsIG5ld0JpcnRoQ2FsLmdldChDYWxlbmRhci5ZRUFSKSAtIGRlbHRhKTsKLQkJCXRoaXMuc2V0QmlydGhEYXRlKG5ld0JpcnRoQ2FsLmdldFRpbWUoKSk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRFeWVDb2xvcigpIHsKLQkJCXJldHVybiB0aGlzLmV5ZUNvbG9yOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEV5ZUNvbG9yKFN0cmluZyBleWVDb2xvcikgewotCQkJaWYgKCAhIEFycmF5VG9vbHMuY29udGFpbnMoVkFMSURfRVlFX0NPTE9SUywgZXllQ29sb3IpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihleWVDb2xvcik7Ci0JCQl9Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5leWVDb2xvcjsKLQkJCXRoaXMuZXllQ29sb3IgPSBleWVDb2xvcjsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWUVfQ09MT1JfUFJPUEVSVFksIG9sZCwgZXllQ29sb3IpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUZXN0TW9kZWwoYmlydGg6ICIgKyB0aGlzLmdldEJpcnRoRGF0ZSgpICsgIiAtIGV5ZXM6ICIgKyB0aGlzLmV5ZUNvbG9yICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RhYmxlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlYjI4MS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRhYmxlTW9kZWxFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UYWJsZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuQ29sdW1uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVGFibGVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRhYmxlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBDcm93ZCBjcm93ZDsKLQlUYWJsZU1vZGVsRXZlbnQgZXZlbnQ7Ci0KLQlwdWJsaWMgVGFibGVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmNyb3dkID0gdGhpcy5idWlsZENyb3dkKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSb3dDb3VudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IHRhYmxlTW9kZWxBZGFwdGVyID0gIHRoaXMuYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGVNb2RlbEFkYXB0ZXIuZ2V0Um93Q291bnQoKSk7Ci0JCS8vIHdlIG5lZWQgdG8gYWRkIGEgbGlzdGVuZXIgdG8gd2FrZSB1cCB0aGUgYWRhcHRlcgotCQl0YWJsZU1vZGVsQWRhcHRlci5hZGRUYWJsZU1vZGVsTGlzdGVuZXIodGhpcy5idWlsZFRhYmxlTW9kZWxMaXN0ZW5lcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3Jvd2QucGVvcGxlU2l6ZSgpLCB0YWJsZU1vZGVsQWRhcHRlci5nZXRSb3dDb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29sdW1uQ291bnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPiB0YWJsZU1vZGVsQWRhcHRlciA9ICB0aGlzLmJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKFBlcnNvbkNvbHVtbkFkYXB0ZXIuQ09MVU1OX0NPVU5ULCB0YWJsZU1vZGVsQWRhcHRlci5nZXRDb2x1bW5Db3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVBdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IHRhYmxlTW9kZWxBZGFwdGVyID0gIHRoaXMuYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpOwotCQl0YWJsZU1vZGVsQWRhcHRlci5hZGRUYWJsZU1vZGVsTGlzdGVuZXIodGhpcy5idWlsZFRhYmxlTW9kZWxMaXN0ZW5lcigpKTsKLQotCQlMaXN0PFN0cmluZz4gc29ydGVkTmFtZXMgPSB0aGlzLnNvcnRlZE5hbWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5jcm93ZC5wZW9wbGVTaXplKCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKHNvcnRlZE5hbWVzLmdldChpKSwgdGFibGVNb2RlbEFkYXB0ZXIuZ2V0VmFsdWVBdChpLCBQZXJzb25Db2x1bW5BZGFwdGVyLk5BTUVfQ09MVU1OKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVBdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IHRhYmxlTW9kZWxBZGFwdGVyID0gIHRoaXMuYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGFibGVNb2RlbEFkYXB0ZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VGFibGVNb2RlbExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoVGFibGVNb2RlbEV2ZW50IGUpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9KTsKLQotCQlQZXJzb24gcGVyc29uID0gdGhpcy5jcm93ZC5wZXJzb25OYW1lZCgiR29sbHVtIik7Ci0JCWFzc2VydEVxdWFscyhQZXJzb24uRVlFX0NPTE9SX0JMVUUsIHBlcnNvbi5nZXRFeWVDb2xvcigpKTsKLQkJYXNzZXJ0RmFsc2UocGVyc29uLmlzRXZpbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBlcnNvbi5nZXRSYW5rKCkpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVNb2RlbEFkYXB0ZXIuZ2V0Um93Q291bnQoKTsgaSsrKSB7Ci0JCQlpZiAodGFibGVNb2RlbEFkYXB0ZXIuZ2V0VmFsdWVBdChpLCBQZXJzb25Db2x1bW5BZGFwdGVyLk5BTUVfQ09MVU1OKS5lcXVhbHMoIkdvbGx1bSIpKSB7Ci0JCQkJdGFibGVNb2RlbEFkYXB0ZXIuc2V0VmFsdWVBdChQZXJzb24uRVlFX0NPTE9SX0hBWkVMLCBpLCBQZXJzb25Db2x1bW5BZGFwdGVyLkVZRV9DT0xPUl9DT0xVTU4pOwotCQkJCXRhYmxlTW9kZWxBZGFwdGVyLnNldFZhbHVlQXQoQm9vbGVhbi5UUlVFLCBpLCBQZXJzb25Db2x1bW5BZGFwdGVyLkVWSUxfQ09MVU1OKTsKLQkJCQl0YWJsZU1vZGVsQWRhcHRlci5zZXRWYWx1ZUF0KG5ldyBJbnRlZ2VyKC0xKSwgaSwgUGVyc29uQ29sdW1uQWRhcHRlci5SQU5LX0NPTFVNTik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKFBlcnNvbi5FWUVfQ09MT1JfSEFaRUwsIHBlcnNvbi5nZXRFeWVDb2xvcigpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaXNFdmlsKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHBlcnNvbi5nZXRSYW5rKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPiB0YWJsZU1vZGVsQWRhcHRlciA9ICB0aGlzLmJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKTsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRhYmxlTW9kZWxBZGFwdGVyLmFkZFRhYmxlTW9kZWxMaXN0ZW5lcih0aGlzLmJ1aWxkU2luZ2xlRXZlbnRMaXN0ZW5lcigpKTsKLQkJLy8gYWRkIGEgcGVyc29uIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgc28gd2Ugb25seSB0cmlnZ2VyIG9uZSBldmVudAotCQl0aGlzLmNyb3dkLmFkZFBlcnNvbigiWnp6enoiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKFRhYmxlTW9kZWxFdmVudC5JTlNFUlQsIHRoaXMuZXZlbnQuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRhYmxlTW9kZWxFdmVudC5BTExfQ09MVU1OUywgdGhpcy5ldmVudC5nZXRDb2x1bW4oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVJvdygpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IHRhYmxlTW9kZWxBZGFwdGVyID0gIHRoaXMuYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGFibGVNb2RlbEFkYXB0ZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKHRoaXMuYnVpbGRTaW5nbGVFdmVudExpc3RlbmVyKCkpOwotCQkvLyByZW1vdmluZyBhIHBlcnNvbiBzaG91bGQgb25seSB0cmlnZ2VyIG9uZSBldmVudCwgc2luY2UgYSByZS1zb3J0IGlzIG5vdCBuZWVkZWQKLQkJdGhpcy5jcm93ZC5yZW1vdmVQZXJzb24odGhpcy5jcm93ZC5wZXJzb25OYW1lZCgiR29sbHVtIikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnRFcXVhbHMoVGFibGVNb2RlbEV2ZW50LkRFTEVURSwgdGhpcy5ldmVudC5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoVGFibGVNb2RlbEV2ZW50LkFMTF9DT0xVTU5TLCB0aGlzLmV2ZW50LmdldENvbHVtbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlQ2VsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IHRhYmxlTW9kZWxBZGFwdGVyID0gIHRoaXMuYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGFibGVNb2RlbEFkYXB0ZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKHRoaXMuYnVpbGRTaW5nbGVFdmVudExpc3RlbmVyKCkpOwotCQkvLyBhZGQgYSBwZXJzb24gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBzbyB3ZSBvbmx5IHRyaWdnZXIgb25lIGV2ZW50Ci0JCVBlcnNvbiBwZXJzb24gPSB0aGlzLmNyb3dkLnBlcnNvbk5hbWVkKCJHb2xsdW0iKTsKLQkJcGVyc29uLnNldEV2aWwodHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydEVxdWFscyhUYWJsZU1vZGVsRXZlbnQuVVBEQVRFLCB0aGlzLmV2ZW50LmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhQZXJzb25Db2x1bW5BZGFwdGVyLkVWSUxfQ09MVU1OLCB0aGlzLmV2ZW50LmdldENvbHVtbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IHRhYmxlTW9kZWxBZGFwdGVyID0gIHRoaXMuYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpOwotCQlUYWJsZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGFibGVNb2RlbExpc3RlbmVyKCk7Ci0JCWFzc2VydFRydWUodGhpcy5jcm93ZC5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ3Jvd2QuUEVPUExFX0NPTExFQ1RJT04pKTsKLQkJdGFibGVNb2RlbEFkYXB0ZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNyb3dkLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ3Jvd2QuUEVPUExFX0NPTExFQ1RJT04pKTsKLQkJdGFibGVNb2RlbEFkYXB0ZXIucmVtb3ZlVGFibGVNb2RlbExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNyb3dkLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDcm93ZC5QRU9QTEVfQ09MTEVDVElPTikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5Q2VsbExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCVRhYmxlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRUYWJsZU1vZGVsTGlzdGVuZXIoKTsKLQkJUGVyc29uIHBlcnNvbiA9IHRoaXMuY3Jvd2QucGVyc29uTmFtZWQoIkdvbGx1bSIpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLkJJUlRIX0RBVEVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uRVlFX0NPTE9SX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLkVWSUxfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uUkFOS19QUk9QRVJUWSkpOwotCi0JCXRhYmxlTW9kZWxBZGFwdGVyLmFkZFRhYmxlTW9kZWxMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5CSVJUSF9EQVRFX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5FWUVfQ09MT1JfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLkVWSUxfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLlJBTktfUFJPUEVSVFkpKTsKLQotCQl0YWJsZU1vZGVsQWRhcHRlci5yZW1vdmVUYWJsZU1vZGVsTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLkJJUlRIX0RBVEVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uRVlFX0NPTE9SX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLkVWSUxfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uUkFOS19QUk9QRVJUWSkpOwotCX0KLQotCXByaXZhdGUgVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPiBidWlsZFRhYmxlTW9kZWxBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4odGhpcy5idWlsZFNvcnRlZFBlb3BsZUFkYXB0ZXIoKSwgdGhpcy5idWlsZENvbHVtbkFkYXB0ZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZENlbGxMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZENlbGxMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFBlcnNvbj4gYnVpbGRTb3J0ZWRQZW9wbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxQZXJzb24+KHRoaXMuYnVpbGRQZW9wbGVBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8UGVyc29uPiBidWlsZFBlb3BsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8Q3Jvd2QsIFBlcnNvbj4oQ3Jvd2QuUEVPUExFX0NPTExFQ1RJT04sIHRoaXMuY3Jvd2QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFBlcnNvbj4gaXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QucGVvcGxlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5wZW9wbGVTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDcm93ZCBidWlsZENyb3dkKCkgewotCQlDcm93ZCByZXN1bHQgPSBuZXcgQ3Jvd2QoKTsKLQkJcmVzdWx0LmFkZFBlcnNvbigiQmlsYm8iKTsKLQkJcmVzdWx0LmFkZFBlcnNvbigiR29sbHVtIik7Ci0JCXJlc3VsdC5hZGRQZXJzb24oIkZyb2RvIik7Ci0JCXJlc3VsdC5hZGRQZXJzb24oIlNhbXdpc2UiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIENvbHVtbkFkYXB0ZXIgYnVpbGRDb2x1bW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFBlcnNvbkNvbHVtbkFkYXB0ZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlTW9kZWxMaXN0ZW5lciBidWlsZFRhYmxlTW9kZWxMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBUZXN0VGFibGVNb2RlbExpc3RlbmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gc29ydGVkTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldCh0aGlzLmNyb3dkLnBlb3BsZU5hbWVzKCkpKTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlTW9kZWxMaXN0ZW5lciBidWlsZFNpbmdsZUV2ZW50TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFRhYmxlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKFRhYmxlTW9kZWxFdmVudCBlKSB7Ci0JCQkJLy8gd2UgZXhwZWN0IG9ubHkgYSBzaW5nbGUgZXZlbnQKLQkJCQlpZiAoVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50ID09IG51bGwpIHsKLQkJCQkJVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCQl9IGVsc2UgewotCQkJCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbGFzc2VzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyc29uQ29sdW1uQWRhcHRlciBpbXBsZW1lbnRzIENvbHVtbkFkYXB0ZXIgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fQ09VTlQgPSA3OwotCQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FX0NPTFVNTiA9IDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJUlRIX0RBVEVfQ09MVU1OID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR09ORV9XRVNUX0RBVEVfQ09MVU1OID0gMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVlFX0NPTE9SX0NPTFVNTiA9IDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWSUxfQ09MVU1OID0gNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkFOS19DT0xVTU4gPSA1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRFZFTlRVUkVfQ09VTlRfQ09MVU1OID0gNjsKLQkKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09MVU1OX05BTUVTID0gbmV3IFN0cmluZ1tdIHsKLQkJCSJOYW1lIiwKLQkJCSJCaXJ0aCIsCi0JCQkiR29uZSBXZXN0IiwKLQkJCSJFeWVzIiwKLQkJCSJFdmlsIiwKLQkJCSJSYW5rIiwKLQkJCSJBZHZlbnR1cmVzIgotCQl9OwotCQotCQotCQlwdWJsaWMgaW50IGNvbHVtbkNvdW50KCkgewotCQkJcmV0dXJuIENPTFVNTl9DT1VOVDsKLQkJfQotCQotCQlwdWJsaWMgU3RyaW5nIGNvbHVtbk5hbWUoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gQ09MVU1OX05BTUVTW2luZGV4XTsKLQkJfQotCQotCQlwdWJsaWMgQ2xhc3M8Pz4gY29sdW1uQ2xhc3MoaW50IGluZGV4KSB7Ci0JCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQkJY2FzZSBOQU1FX0NPTFVNTjoJCQkJCXJldHVybiBPYmplY3QuY2xhc3M7Ci0JCQkJY2FzZSBCSVJUSF9EQVRFX0NPTFVNTjoJCQlyZXR1cm4gRGF0ZS5jbGFzczsKLQkJCQljYXNlIEdPTkVfV0VTVF9EQVRFX0NPTFVNTjoJcmV0dXJuIERhdGUuY2xhc3M7Ci0JCQkJY2FzZSBFWUVfQ09MT1JfQ09MVU1OOgkJCXJldHVybiBPYmplY3QuY2xhc3M7Ci0JCQkJY2FzZSBFVklMX0NPTFVNTjoJCQkJCXJldHVybiBCb29sZWFuLmNsYXNzOwotCQkJCWNhc2UgUkFOS19DT0xVTU46CQkJCQlyZXR1cm4gSW50ZWdlci5jbGFzczsKLQkJCQljYXNlIEFEVkVOVFVSRV9DT1VOVF9DT0xVTU46cmV0dXJuIEludGVnZXIuY2xhc3M7Ci0JCQkJZGVmYXVsdDogCQkJCQkJCQkJcmV0dXJuIE9iamVjdC5jbGFzczsKLQkJCX0KLQkJfQotCQotCQlwdWJsaWMgYm9vbGVhbiBjb2x1bW5Jc0VkaXRhYmxlKGludCBpbmRleCkgewotCQkJcmV0dXJuIGluZGV4ICE9IE5BTUVfQ09MVU1OOwotCQl9Ci0JCi0JCXB1YmxpYyBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSBjZWxsTW9kZWxzKE9iamVjdCBzdWJqZWN0KSB7Ci0JCQlQZXJzb24gcGVyc29uID0gKFBlcnNvbikgc3ViamVjdDsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcmVzdWx0ID0gbmV3IE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWxbQ09MVU1OX0NPVU5UXTsKLQkKLQkJCXJlc3VsdFtOQU1FX0NPTFVNTl0gPSB0aGlzLmJ1aWxkTmFtZUFkYXB0ZXIocGVyc29uKTsKLQkJCXJlc3VsdFtCSVJUSF9EQVRFX0NPTFVNTl0gPSB0aGlzLmJ1aWxkQmlydGhEYXRlQWRhcHRlcihwZXJzb24pOwotCQkJcmVzdWx0W0dPTkVfV0VTVF9EQVRFX0NPTFVNTl0gPSB0aGlzLmJ1aWxkR29uZVdlc3REYXRlQWRhcHRlcihwZXJzb24pOwotCQkJcmVzdWx0W0VZRV9DT0xPUl9DT0xVTU5dID0gdGhpcy5idWlsZEV5ZUNvbG9yQWRhcHRlcihwZXJzb24pOwotCQkJcmVzdWx0W0VWSUxfQ09MVU1OXSA9IHRoaXMuYnVpbGRFdmlsQWRhcHRlcihwZXJzb24pOwotCQkJcmVzdWx0W1JBTktfQ09MVU1OXSA9IHRoaXMuYnVpbGRSYW5rQWRhcHRlcihwZXJzb24pOwotCQkJcmVzdWx0W0FEVkVOVFVSRV9DT1VOVF9DT0xVTU5dID0gdGhpcy5idWlsZEFkdmVudHVyZUNvdW50QWRhcHRlcihwZXJzb24pOwotCQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQotCQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZE5hbWVBZGFwdGVyKFBlcnNvbiBwZXJzb24pIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0PihQZXJzb24uTkFNRV9QUk9QRVJUWSwgcGVyc29uKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUoKFN0cmluZykgdmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRCaXJ0aERhdGVBZGFwdGVyKFBlcnNvbiBwZXJzb24pIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0PihQZXJzb24uQklSVEhfREFURV9QUk9QRVJUWSwgcGVyc29uKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIERhdGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0QmlydGhEYXRlKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldEJpcnRoRGF0ZSgoRGF0ZSkgdmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRHb25lV2VzdERhdGVBZGFwdGVyKFBlcnNvbiBwZXJzb24pIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0PihQZXJzb24uR09ORV9XRVNUX0RBVEVfUFJPUEVSVFksIHBlcnNvbikgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBEYXRlIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEdvbmVXZXN0RGF0ZSgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRHb25lV2VzdERhdGUoKERhdGUpIHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkRXllQ29sb3JBZGFwdGVyKFBlcnNvbiBwZXJzb24pIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0PihQZXJzb24uRVlFX0NPTE9SX1BST1BFUlRZLCBwZXJzb24pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEV5ZUNvbG9yKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldEV5ZUNvbG9yKChTdHJpbmcpIHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkRXZpbEFkYXB0ZXIoUGVyc29uIHBlcnNvbikgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBPYmplY3Q+KFBlcnNvbi5FVklMX1BST1BFUlRZLCBwZXJzb24pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNFdmlsKCkpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRFdmlsKCgoQm9vbGVhbil2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRSYW5rQWRhcHRlcihQZXJzb24gcGVyc29uKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE9iamVjdD4oUGVyc29uLlJBTktfUFJPUEVSVFksIHBlcnNvbikgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gbmV3IEludGVnZXIodGhpcy5zdWJqZWN0LmdldFJhbmsoKSk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldFJhbmsoKChJbnRlZ2VyKSB2YWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQotCQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEFkdmVudHVyZUNvdW50QWRhcHRlcihQZXJzb24gcGVyc29uKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE9iamVjdD4oUGVyc29uLkFEVkVOVFVSRV9DT1VOVF9QUk9QRVJUWSwgcGVyc29uKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBuZXcgSW50ZWdlcih0aGlzLnN1YmplY3QuZ2V0QWR2ZW50dXJlQ291bnQoKSk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldEFkdmVudHVyZUNvdW50KCgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ3Jvd2QgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFBlcnNvbj4gcGVvcGxlOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVPUExFX0NPTExFQ1RJT04gPSAicGVvcGxlIjsKLQkKLQkJcHVibGljIENyb3dkKCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucGVvcGxlID0gbmV3IEFycmF5TGlzdDxQZXJzb24+KCk7Ci0JCX0KLQkKLQkKLQkJcHVibGljIEl0ZXJhdG9yPFBlcnNvbj4gcGVvcGxlKCkgewotCQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPFBlcnNvbj4odGhpcy5wZW9wbGUpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoUGVyc29uIHBlcnNvbikgewotCQkJCQlDcm93ZC50aGlzLnJlbW92ZVBlcnNvbihwZXJzb24pOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHVibGljIGludCBwZW9wbGVTaXplKCkgewotCQkJcmV0dXJuIHRoaXMucGVvcGxlLnNpemUoKTsKLQkJfQotCQotCQlwdWJsaWMgUGVyc29uIGFkZFBlcnNvbihTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5jaGVja1BlcnNvbk5hbWUobmFtZSk7Ci0JCQlyZXR1cm4gdGhpcy5hZGRQZXJzb24obmV3IFBlcnNvbih0aGlzLCBuYW1lKSk7Ci0JCX0KLQkKLQkJcHJpdmF0ZSBQZXJzb24gYWRkUGVyc29uKFBlcnNvbiBwZXJzb24pIHsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihwZXJzb24sIHRoaXMucGVvcGxlLCBQRU9QTEVfQ09MTEVDVElPTik7Ci0JCQlyZXR1cm4gcGVyc29uOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVBlcnNvbihQZXJzb24gcGVyc29uKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihwZXJzb24sIHRoaXMucGVvcGxlLCBQRU9QTEVfQ09MTEVDVElPTik7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlUGVvcGxlKENvbGxlY3Rpb248UGVyc29uPiBwZXJzb25zKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24ocGVyc29ucywgdGhpcy5wZW9wbGUsIFBFT1BMRV9DT0xMRUNUSU9OKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCByZW1vdmVQZW9wbGUoSXRlcmF0b3I8UGVyc29uPiBwZXJzb25zKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24ocGVyc29ucywgdGhpcy5wZW9wbGUsIFBFT1BMRV9DT0xMRUNUSU9OKTsKLQkJfQotCQotCQl2b2lkIGNoZWNrUGVyc29uTmFtZShTdHJpbmcgcGVyc29uTmFtZSkgewotCQkJaWYgKHBlcnNvbk5hbWUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLnBlb3BsZU5hbWVzKCksIHBlcnNvbk5hbWUpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihwZXJzb25OYW1lKTsKLQkJCX0KLQkJfQotCQotCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBwZW9wbGVOYW1lcygpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxQZXJzb24sIFN0cmluZz4odGhpcy5wZW9wbGUuaXRlcmF0b3IoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFBlcnNvbiBwZXJzb24pIHsKLQkJCQkJcmV0dXJuIHBlcnNvbi5nZXROYW1lKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQotCQlwdWJsaWMgUGVyc29uIHBlcnNvbk5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPFBlcnNvbj4gc3RyZWFtID0gdGhpcy5wZW9wbGUuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJUGVyc29uIHBlcnNvbiA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJaWYgKHBlcnNvbi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCXJldHVybiBwZXJzb247Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBTdHJpbmcudmFsdWVPZih0aGlzLnBlb3BsZS5zaXplKCkpICsgIiBwZW9wbGUiKTsKLQkJfQotCQotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFBlcnNvbiBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBDb21wYXJhYmxlPFBlcnNvbj4gewotCQlwcml2YXRlIENyb3dkIGNyb3dkOwotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWT0gIm5hbWUiOwotCQlwcml2YXRlIERhdGUgYmlydGhEYXRlOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklSVEhfREFURV9QUk9QRVJUWT0gImJpcnRoRGF0ZSI7Ci0JCXByaXZhdGUgRGF0ZSBnb25lV2VzdERhdGU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHT05FX1dFU1RfREFURV9QUk9QRVJUWT0gImdvbmVXZXN0RGF0ZSI7Ci0JCXByaXZhdGUgU3RyaW5nIGV5ZUNvbG9yOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVlFX0NPTE9SX1BST1BFUlRZPSAiZXllQ29sb3IiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVlFX0NPTE9SX0JMVUUgPSAiYmx1ZSI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWUVfQ09MT1JfR1JFRU4gPSAiZ3JlZW4iOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVlFX0NPTE9SX0JST1dOID0gImJyb3duIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVZRV9DT0xPUl9IQVpFTCA9ICJoYXplbCI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWUVfQ09MT1JfUElOSyA9ICJwaW5rIjsKLQkJCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248U3RyaW5nPiB2YWxpZEV5ZUNvbG9yczsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVlFX0NPTE9SID0gRVlFX0NPTE9SX0JMVUU7Ci0JCXByaXZhdGUgYm9vbGVhbiBldmlsOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZJTF9QUk9QRVJUWT0gImV2aWwiOwotCQlwcml2YXRlIGludCByYW5rOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOS19QUk9QRVJUWT0gInJhbmsiOwotCQlwcml2YXRlIGludCBhZHZlbnR1cmVDb3VudDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFEVkVOVFVSRV9DT1VOVF9QUk9QRVJUWT0gImFkdmVudHVyZUNvdW50IjsKLQkKLQkJUGVyc29uKENyb3dkIGNyb3dkLCBTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY3Jvd2QgPSBjcm93ZDsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmJpcnRoRGF0ZSA9IG5ldyBEYXRlKCk7Ci0JCQlDYWxlbmRhciBjID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWMuYWRkKENhbGVuZGFyLllFQVIsIDI1MCk7Ci0JCQl0aGlzLmdvbmVXZXN0RGF0ZSA9IG5ldyBEYXRlKGMuZ2V0VGltZUluTWlsbGlzKCkpOwotCQkJdGhpcy5leWVDb2xvciA9IERFRkFVTFRfRVlFX0NPTE9SOwotCQkJdGhpcy5ldmlsID0gZmFsc2U7Ci0JCQl0aGlzLnJhbmsgPSAwOwotCQkJdGhpcy5hZHZlbnR1cmVDb3VudCA9IDA7Ci0JCX0KLQkKLQkJcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0VmFsaWRFeWVDb2xvcnMoKSB7Ci0JCQlpZiAodmFsaWRFeWVDb2xvcnMgPT0gbnVsbCkgewotCQkJCXZhbGlkRXllQ29sb3JzID0gYnVpbGRWYWxpZEV5ZUNvbG9ycygpOwotCQkJfQotCQkJcmV0dXJuIHZhbGlkRXllQ29sb3JzOwotCQl9Ci0JCi0JCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZFZhbGlkRXllQ29sb3JzKCkgewotCQkJQ29sbGVjdGlvbjxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJcmVzdWx0LmFkZChFWUVfQ09MT1JfQkxVRSk7Ci0JCQlyZXN1bHQuYWRkKEVZRV9DT0xPUl9HUkVFTik7Ci0JCQlyZXN1bHQuYWRkKEVZRV9DT0xPUl9CUk9XTik7Ci0JCQlyZXN1bHQuYWRkKEVZRV9DT0xPUl9IQVpFTCk7Ci0JCQlyZXN1bHQuYWRkKEVZRV9DT0xPUl9QSU5LKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkKLQkJcHVibGljIENyb3dkIGdldENyb3dkKCkgewotCQkJcmV0dXJuIHRoaXMuY3Jvd2Q7Ci0JCX0KLQkKLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLmNyb3dkLmNoZWNrUGVyc29uTmFtZShuYW1lKTsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkKLQkJcHVibGljIERhdGUgZ2V0QmlydGhEYXRlKCkgewotCQkJcmV0dXJuIHRoaXMuYmlydGhEYXRlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEJpcnRoRGF0ZShEYXRlIGJpcnRoRGF0ZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMuYmlydGhEYXRlOwotCQkJdGhpcy5iaXJ0aERhdGUgPSBiaXJ0aERhdGU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQklSVEhfREFURV9QUk9QRVJUWSwgb2xkLCBiaXJ0aERhdGUpOwotCQl9Ci0JCi0JCXB1YmxpYyBEYXRlIGdldEdvbmVXZXN0RGF0ZSgpIHsKLQkJCXJldHVybiB0aGlzLmdvbmVXZXN0RGF0ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRHb25lV2VzdERhdGUoRGF0ZSBnb25lV2VzdERhdGUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLmdvbmVXZXN0RGF0ZTsKLQkJCXRoaXMuZ29uZVdlc3REYXRlID0gZ29uZVdlc3REYXRlOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEdPTkVfV0VTVF9EQVRFX1BST1BFUlRZLCBvbGQsIGdvbmVXZXN0RGF0ZSk7Ci0JCX0KLQkKLQkJcHVibGljIFN0cmluZyBnZXRFeWVDb2xvcigpIHsKLQkJCXJldHVybiB0aGlzLmV5ZUNvbG9yOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEV5ZUNvbG9yKFN0cmluZyBleWVDb2xvcikgewotCQkJaWYgKCEgZ2V0VmFsaWRFeWVDb2xvcnMoKS5jb250YWlucyhleWVDb2xvcikpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV5ZUNvbG9yKTsKLQkJCX0KLQkJCU9iamVjdCBvbGQgPSB0aGlzLmV5ZUNvbG9yOwotCQkJdGhpcy5leWVDb2xvciA9IGV5ZUNvbG9yOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVZRV9DT0xPUl9QUk9QRVJUWSwgb2xkLCBleWVDb2xvcik7Ci0JCX0KLQkKLQkJcHVibGljIGJvb2xlYW4gaXNFdmlsKCkgewotCQkJcmV0dXJuIHRoaXMuZXZpbDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRFdmlsKGJvb2xlYW4gZXZpbCkgewotCQkJYm9vbGVhbiBvbGQgPSB0aGlzLmV2aWw7Ci0JCQl0aGlzLmV2aWwgPSBldmlsOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVWSUxfUFJPUEVSVFksIG9sZCwgZXZpbCk7Ci0JCX0KLQkKLQkJcHVibGljIGludCBnZXRSYW5rKCkgewotCQkJcmV0dXJuIHRoaXMucmFuazsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRSYW5rKGludCByYW5rKSB7Ci0JCQlpbnQgb2xkID0gdGhpcy5yYW5rOwotCQkJdGhpcy5yYW5rID0gcmFuazsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSQU5LX1BST1BFUlRZLCBvbGQsIHJhbmspOwotCQl9Ci0JCi0JCXB1YmxpYyBpbnQgZ2V0QWR2ZW50dXJlQ291bnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZHZlbnR1cmVDb3VudDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRBZHZlbnR1cmVDb3VudChpbnQgYWR2ZW50dXJlQ291bnQpIHsKLQkJCWludCBvbGQgPSB0aGlzLmFkdmVudHVyZUNvdW50OwotCQkJdGhpcy5hZHZlbnR1cmVDb3VudCA9IGFkdmVudHVyZUNvdW50OwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEFEVkVOVFVSRV9DT1VOVF9QUk9QRVJUWSwgb2xkLCBhZHZlbnR1cmVDb3VudCk7Ci0JCX0KLQkKLQkJcHVibGljIGludCBjb21wYXJlVG8oUGVyc29uIHApIHsKLQkJCXJldHVybiB0aGlzLm5hbWUuY29tcGFyZVRvSWdub3JlQ2FzZShwLm5hbWUpOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZSArIAotCQkJCQkJIlx0Ym9ybjogIiArIERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCkuZm9ybWF0KHRoaXMuYmlydGhEYXRlKSArIAotCQkJCQkJIlx0Z29uZSB3ZXN0OiAiICsgRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKS5mb3JtYXQodGhpcy5nb25lV2VzdERhdGUpICsgCi0JCQkJCQkiXHRleWVzOiAiICsgdGhpcy5leWVDb2xvciArIAotCQkJCQkJIlx0ZXZpbDogIiArIHRoaXMuZXZpbCArIAotCQkJCQkJIlx0cmFuazogIiArIHRoaXMucmFuayArCi0JCQkJCQkiXHRhZHZlbnR1cmVzOiAiICsgdGhpcy5hZHZlbnR1cmVDb3VudAotCQkJOwotCQl9Ci0JCi0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RUYWJsZU1vZGVsTGlzdGVuZXIgaW1wbGVtZW50cyBUYWJsZU1vZGVsTGlzdGVuZXIgewotCQlUZXN0VGFibGVNb2RlbExpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoVGFibGVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZiYTFhNi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZExheW91dDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkJ1dHRvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkNvbWJvQm94TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuRGVmYXVsdExpc3RDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQ2hlY2tCb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKLWltcG9ydCBqYXZheC5zd2luZy5KT3B0aW9uUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlNwaW5uZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRhYmxlOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0RmllbGQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLlVJTWFuYWdlcjsKLWltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3RTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50YWJsZS5UYWJsZUNvbHVtbjsKLWltcG9ydCBqYXZheC5zd2luZy50YWJsZS5UYWJsZU1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuRG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uQXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuQ2hlY2tCb3hNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkNvbHVtbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkNvbWJvQm94TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5EYXRlU3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuRG9jdW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRhYmxlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZy5DaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZy5Db21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZy5TcGlubmVyVGFibGVDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLlRhYmxlQ2VsbEVkaXRvckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy5Dcm93ZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy5QZXJzb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRhYmxlTW9kZWxBZGFwdGVyVGVzdHMuUGVyc29uQ29sdW1uQWRhcHRlcjsKLQotLyoqCi0gKiBhbiBleGFtcGxlIFVJIGZvciB0ZXN0aW5nIHRoZSBUYWJsZU1vZGVsQWRhcHRlcgotICogCSJuYW1lIiBjb2x1bW4gaXMgcmVhZC1vbmx5IHRleHQgZmllbGQKLSAqIAkiYmlydGggZGF0ZSIgY29sdW1uIGlzIGRhdGUgdGV4dCBmaWVsZAotICogCSJnb25lIHdlc3QgZGF0ZSIgY29sdW1uIGlzIGRhdGUgc3Bpbm5lcgotICogCSJleWUgY29sb3IiIGNvbHVtbiBpcyBjb21iby1ib3gKLSAqIAkiZXZpbCIgY29sdW1uIGlzIGNoZWNrIGJveAotICogCSJyYW5rIiBjb2x1bW4gaXMgbnVtYmVyIHRleHQgZmllbGQKLSAqIAkiYWR2ZW50dXJlIGNvdW50IiBjb2x1bW4gaXMgbnVtYmVyIHNwaW5uZXIKLSAqIAotICogTm90ZSB0aGF0IHRoZSB0YWJsZSBtb2RlbCBhbmQgcm93IHNlbGVjdGlvbiBtb2RlbCBzaGFyZSB0aGUgc2FtZQotICogbGlzdCB2YWx1ZSBtb2RlbCAodGhlIHNvcnRlZCBwZW9wbGUgYWRhcHRlcikKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QgewotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8T2JqZWN0PiBleWVDb2xvcnNIb2xkZXI7ICAvLyBPYmplY3QgYmVjYXVzZSBpdCBhZGFwdHMgdG8gYSBjb21iby1ib3gKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q3Jvd2Q+IGNyb3dkSG9sZGVyOwotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzb24+IHNlbGVjdGVkUGVyc29uSG9sZGVyOwotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UGVyc29uPiBzb3J0ZWRQZW9wbGVBZGFwdGVyOwotCXByaXZhdGUgVGFibGVNb2RlbCB0YWJsZU1vZGVsOwotCXByaXZhdGUgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIHJvd1NlbGVjdGlvbk1vZGVsOwotCXByaXZhdGUgQWN0aW9uIHJlbW92ZUFjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiByZW5hbWVBY3Rpb247Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IFRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0KCkuZXhlYyhhcmdzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlYyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVVJTWFuYWdlci5zZXRMb29rQW5kRmVlbChVSU1hbmFnZXIuZ2V0U3lzdGVtTG9va0FuZEZlZWxDbGFzc05hbWUoKSk7Ci0JCXRoaXMuZXllQ29sb3JzSG9sZGVyID0gdGhpcy4gYnVpbGRFeWVDb2xvckNvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJdGhpcy5jcm93ZEhvbGRlciA9IHRoaXMuYnVpbGRDcm93ZEhvbGRlcigpOwotCQl0aGlzLnNlbGVjdGVkUGVyc29uSG9sZGVyID0gdGhpcy5idWlsZFNlbGVjdGVkUGVyc29uSG9sZGVyKCk7Ci0JCXRoaXMuc29ydGVkUGVvcGxlQWRhcHRlciA9IHRoaXMuYnVpbGRTb3J0ZWRQZW9wbGVBZGFwdGVyKCk7Ci0JCXRoaXMudGFibGVNb2RlbCA9IHRoaXMuYnVpbGRUYWJsZU1vZGVsKCk7Ci0JCXRoaXMucm93U2VsZWN0aW9uTW9kZWwgPSB0aGlzLmJ1aWxkUm93U2VsZWN0aW9uTW9kZWwoKTsKLQkJdGhpcy5vcGVuV2luZG93KCk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkRXllQ29sb3JDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPE9iamVjdD4obmV3IEFycmF5TGlzdDxPYmplY3Q+KFBlcnNvbi5nZXRWYWxpZEV5ZUNvbG9ycygpKSk7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENyb3dkPiBidWlsZENyb3dkSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxDcm93ZD4odGhpcy5idWlsZENyb3dkKCkpOwotCX0KLQotCXByaXZhdGUgQ3Jvd2QgYnVpbGRDcm93ZCgpIHsKLQkJQ3Jvd2QgY3Jvd2QgPSBuZXcgQ3Jvd2QoKTsKLQotCQlQZXJzb24gcCA9IGNyb3dkLmFkZFBlcnNvbigiQmlsYm8iKTsKLQkJcC5zZXRFeWVDb2xvcihQZXJzb24uRVlFX0NPTE9SX0JST1dOKTsKLQkJcC5zZXRSYW5rKDIyKTsKLQkJcC5zZXRBZHZlbnR1cmVDb3VudCgxKTsKLQotCQlwID0gY3Jvd2QuYWRkUGVyc29uKCJHb2xsdW0iKTsKLQkJcC5zZXRFeWVDb2xvcihQZXJzb24uRVlFX0NPTE9SX1BJTkspOwotCQlwLnNldEV2aWwodHJ1ZSk7Ci0JCXAuc2V0UmFuaygyKTsKLQkJcC5zZXRBZHZlbnR1cmVDb3VudCg1MCk7Ci0KLQkJcCA9IGNyb3dkLmFkZFBlcnNvbigiRnJvZG8iKTsKLQkJcC5zZXRFeWVDb2xvcihQZXJzb24uRVlFX0NPTE9SX0JMVUUpOwotCQlwLnNldFJhbmsoMzQpOwotCQlwLnNldEFkdmVudHVyZUNvdW50KDEpOwotCi0JCXAgPSBjcm93ZC5hZGRQZXJzb24oIlNhbXdpc2UiKTsKLQkJcC5zZXRFeWVDb2xvcihQZXJzb24uRVlFX0NPTE9SX0dSRUVOKTsKLQkJcC5zZXRSYW5rKDE5KTsKLQkJcC5zZXRBZHZlbnR1cmVDb3VudCgxKTsKLQotCQlyZXR1cm4gY3Jvd2Q7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbj4gYnVpbGRTZWxlY3RlZFBlcnNvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc29uPigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UGVyc29uPiBidWlsZFNvcnRlZFBlb3BsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFBlcnNvbj4odGhpcy5idWlsZFBlb3BsZU5hbWVBZGFwdGVyKCkpOwotCX0KLQotCS8vIHRoZSBsaXN0IHdpbGwgbmVlZCB0byBiZSByZS1zb3J0ZWQgaWYgYSBuYW1lIGNoYW5nZXMKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFBlcnNvbj4gYnVpbGRQZW9wbGVOYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UGVyc29uPih0aGlzLmJ1aWxkUGVvcGxlQWRhcHRlcigpLCBQZXJzb24uTkFNRV9QUk9QRVJUWSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxQZXJzb24+IGJ1aWxkUGVvcGxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxDcm93ZCwgUGVyc29uPih0aGlzLmNyb3dkSG9sZGVyLCBDcm93ZC5QRU9QTEVfQ09MTEVDVElPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8UGVyc29uPiBpdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5wZW9wbGUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnBlb3BsZVNpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlTW9kZWwgYnVpbGRUYWJsZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4odGhpcy5zb3J0ZWRQZW9wbGVBZGFwdGVyLCB0aGlzLmJ1aWxkQ29sdW1uQWRhcHRlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sdW1uQWRhcHRlciBidWlsZENvbHVtbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUGVyc29uQ29sdW1uQWRhcHRlcigpOwotCX0KLQotCXByaXZhdGUgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGJ1aWxkUm93U2VsZWN0aW9uTW9kZWwoKSB7Ci0JCU9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCByc20gPSBuZXcgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsKG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuc29ydGVkUGVvcGxlQWRhcHRlcikpOwotCQlyc20uYWRkTGlzdFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRSb3dTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJcnNtLnNldFNlbGVjdGlvbk1vZGUoTGlzdFNlbGVjdGlvbk1vZGVsLlNJTkdMRV9TRUxFQ1RJT04pOwotCQlyZXR1cm4gcnNtOwotCX0KLQotCXByaXZhdGUgTGlzdFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkUm93U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKExpc3RTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGUuZ2V0VmFsdWVJc0FkanVzdGluZygpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yb3dTZWxlY3Rpb25DaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgcm93U2VsZWN0aW9uQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCVBlcnNvbiBzZWxlY3Rpb24gPSAoUGVyc29uKSB0aGlzLnJvd1NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKTsKLQkJdGhpcy5zZWxlY3RlZFBlcnNvbkhvbGRlci5zZXRWYWx1ZShzZWxlY3Rpb24pOwotCQlib29sZWFuIHBlcnNvblNlbGVjdGVkID0gKHNlbGVjdGlvbiAhPSBudWxsKTsKLQkJdGhpcy5yZW1vdmVBY3Rpb24uc2V0RW5hYmxlZChwZXJzb25TZWxlY3RlZCk7Ci0JCXRoaXMucmVuYW1lQWN0aW9uLnNldEVuYWJsZWQocGVyc29uU2VsZWN0ZWQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQlKRnJhbWUgd2luZG93ID0gbmV3IEpGcmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJd2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXdpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXdpbmRvdy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmJ1aWxkTWFpblBhbmVsKCksICJDZW50ZXIiKTsKLQkJd2luZG93LnNldExvY2F0aW9uKDIwMCwgMjAwKTsKLQkJd2luZG93LnNldFNpemUoNjAwLCA0MDApOwotCQl3aW5kb3cuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIGJ1aWxkV2luZG93TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2luZG93QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJZS5nZXRXaW5kb3coKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE1haW5QYW5lbCgpIHsKLQkJSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkVGFibGVQYW5lKCksIEJvcmRlckxheW91dC5DRU5URVIpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDb250cm9sUGFuZWwoKSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFRhYmxlUGFuZSgpIHsKLQkJcmV0dXJuIG5ldyBKU2Nyb2xsUGFuZSh0aGlzLmJ1aWxkVGFibGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBKVGFibGUgYnVpbGRUYWJsZSgpIHsKLQkJSlRhYmxlIHRhYmxlID0gbmV3IEpUYWJsZSh0aGlzLnRhYmxlTW9kZWwpOwotCQl0YWJsZS5wdXRDbGllbnRQcm9wZXJ0eSgidGVybWluYXRlRWRpdE9uRm9jdXNMb3N0IiwgQm9vbGVhbi5UUlVFKTsJLy8gc2VlIEphdmEgYnVnIDUwMDc2NTIKLQkJdGFibGUuc2V0U2VsZWN0aW9uTW9kZWwodGhpcy5yb3dTZWxlY3Rpb25Nb2RlbCk7Ci0JCXRhYmxlLnNldERvdWJsZUJ1ZmZlcmVkKHRydWUpOwotCQl0YWJsZS5zZXRBdXRvUmVzaXplTW9kZShKVGFibGUuQVVUT19SRVNJWkVfTkVYVF9DT0xVTU4pOwotCQlpbnQgcm93SGVpZ2h0ID0gMjA7CS8vIHN0YXJ0IHdpdGggbWluaW11bSBvZiAyMAotCi0JCS8vIGdvbmUgd2VzdCBjb2x1bW4gKHNwaW5uZXIpCi0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IHRhYmxlLmdldENvbHVtbk1vZGVsKCkuZ2V0Q29sdW1uKFBlcnNvbkNvbHVtbkFkYXB0ZXIuR09ORV9XRVNUX0RBVEVfQ09MVU1OKTsKLQkJU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyIHNwaW5uZXJSZW5kZXJlciA9IHRoaXMuYnVpbGREYXRlU3Bpbm5lclJlbmRlcmVyKCk7Ci0JCWNvbHVtbi5zZXRDZWxsUmVuZGVyZXIoc3Bpbm5lclJlbmRlcmVyKTsKLQkJY29sdW1uLnNldENlbGxFZGl0b3IobmV3IFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIodGhpcy5idWlsZERhdGVTcGlubmVyUmVuZGVyZXIoKSkpOwotCQlyb3dIZWlnaHQgPSBNYXRoLm1heChyb3dIZWlnaHQsIHNwaW5uZXJSZW5kZXJlci5wcmVmZXJyZWRIZWlnaHQoKSk7Ci0KLQkJLy8gZXllIGNvbG9yIGNvbHVtbiAoY29tYm8tYm94KQotCQkvLyB0aGUgamRrIGNvbWJvLWJveCByZW5kZXJlciBsb29rcyBsaWtlIGEgdGV4dCBmaWVsZAotCQkvLyB1bnRpbCB0aGUgdXNlciBzdGFydHMgYW4gZWRpdCAtIHVzZSBhIGN1c3RvbSBvbmUKLQkJY29sdW1uID0gdGFibGUuZ2V0Q29sdW1uTW9kZWwoKS5nZXRDb2x1bW4oUGVyc29uQ29sdW1uQWRhcHRlci5FWUVfQ09MT1JfQ09MVU1OKTsKLQkJQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlciBleWVDb2xvclJlbmRlcmVyID0gdGhpcy5idWlsZEV5ZUNvbG9yQ29tYm9Cb3hSZW5kZXJlcigpOwotCQljb2x1bW4uc2V0Q2VsbFJlbmRlcmVyKGV5ZUNvbG9yUmVuZGVyZXIpOwotCQljb2x1bW4uc2V0Q2VsbEVkaXRvcihuZXcgVGFibGVDZWxsRWRpdG9yQWRhcHRlcih0aGlzLmJ1aWxkRXllQ29sb3JDb21ib0JveFJlbmRlcmVyKCkpKTsKLQkJcm93SGVpZ2h0ID0gTWF0aC5tYXgocm93SGVpZ2h0LCBleWVDb2xvclJlbmRlcmVyLnByZWZlcnJlZEhlaWdodCgpKTsKLQotCQkvLyBldmlsIChjaGVjayBib3gpCi0JCS8vIHRoZSBqZGsgY2hlY2sgYm94IHJlbmRlcmVyIGFuZCBlZGl0b3Igc3VjayAtIHVzZSBhIGN1c3RvbSBvbmVzCi0JCWNvbHVtbiA9IHRhYmxlLmdldENvbHVtbk1vZGVsKCkuZ2V0Q29sdW1uKFBlcnNvbkNvbHVtbkFkYXB0ZXIuRVZJTF9DT0xVTU4pOwotCQlDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyIGV2aWxSZW5kZXJlciA9IG5ldyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKCk7Ci0JCWNvbHVtbi5zZXRDZWxsUmVuZGVyZXIoZXZpbFJlbmRlcmVyKTsKLQkJY29sdW1uLnNldENlbGxFZGl0b3IobmV3IFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIobmV3IENoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIoKSkpOwotCQlyb3dIZWlnaHQgPSBNYXRoLm1heChyb3dIZWlnaHQsIGV2aWxSZW5kZXJlci5wcmVmZXJyZWRIZWlnaHQoKSk7Ci0KLQkJLy8gYWR2ZW50dXJlIGNvdW50IGNvbHVtbiAoc3Bpbm5lcikKLQkJY29sdW1uID0gdGFibGUuZ2V0Q29sdW1uTW9kZWwoKS5nZXRDb2x1bW4oUGVyc29uQ29sdW1uQWRhcHRlci5BRFZFTlRVUkVfQ09VTlRfQ09MVU1OKTsKLQkJc3Bpbm5lclJlbmRlcmVyID0gdGhpcy5idWlsZE51bWJlclNwaW5uZXJSZW5kZXJlcigpOwotCQljb2x1bW4uc2V0Q2VsbFJlbmRlcmVyKHNwaW5uZXJSZW5kZXJlcik7Ci0JCWNvbHVtbi5zZXRDZWxsRWRpdG9yKG5ldyBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyKHRoaXMuYnVpbGROdW1iZXJTcGlubmVyUmVuZGVyZXIoKSkpOwotCQlyb3dIZWlnaHQgPSBNYXRoLm1heChyb3dIZWlnaHQsIHNwaW5uZXJSZW5kZXJlci5wcmVmZXJyZWRIZWlnaHQoKSk7Ci0KLQkJdGFibGUuc2V0Um93SGVpZ2h0KHJvd0hlaWdodCk7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlciBidWlsZERhdGVTcGlubmVyUmVuZGVyZXIoKSB7Ci0JCXJldHVybiBuZXcgU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyKG5ldyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcihuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4oKSkpOwotCX0KLQotCXByaXZhdGUgU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyIGJ1aWxkTnVtYmVyU3Bpbm5lclJlbmRlcmVyKCkgewotCQlyZXR1cm4gbmV3IFNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlcihuZXcgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcihuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4oKSkpOwotCX0KLQotCXByaXZhdGUgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlciBidWlsZEV5ZUNvbG9yQ29tYm9Cb3hSZW5kZXJlcigpIHsKLQkJcmV0dXJuIG5ldyBDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyKHRoaXMuYnVpbGRSZWFkT25seUV5ZUNvbG9yQ29tYm9Cb3hNb2RlbCgpLCB0aGlzLmJ1aWxkRXllQ29sb3JSZW5kZXJlcigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbWJvQm94TW9kZWwgYnVpbGRSZWFkT25seUV5ZUNvbG9yQ29tYm9Cb3hNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBDb21ib0JveE1vZGVsQWRhcHRlcih0aGlzLmV5ZUNvbG9yc0hvbGRlciwgbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdENlbGxSZW5kZXJlciBidWlsZEV5ZUNvbG9yUmVuZGVyZXIoKSB7Ci0JCXJldHVybiBuZXcgRXllQ29sb3JSZW5kZXJlcigpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ29udHJvbFBhbmVsKCkgewotCQlKUGFuZWwgY29udHJvbFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgwLCAxKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZEJ1dHRvblBhbmVsKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRQZXJzb25QYW5lbCgpKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZEJ1dHRvblBhbmVsKCkgewotCQlKUGFuZWwgYnV0dG9uUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJYnV0dG9uUGFuZWwuYWRkKHRoaXMuYnVpbGRBZGRCdXR0b24oKSk7Ci0JCWJ1dHRvblBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVtb3ZlQnV0dG9uKCkpOwotCQlidXR0b25QYW5lbC5hZGQodGhpcy5idWlsZFJlbmFtZUJ1dHRvbigpKTsKLQkJYnV0dG9uUGFuZWwuYWRkKHRoaXMuYnVpbGRBZGRFeWVDb2xvckJ1dHRvbigpKTsKLQkJYnV0dG9uUGFuZWwuYWRkKHRoaXMuYnVpbGRQcmludEJ1dHRvbigpKTsKLQkJYnV0dG9uUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXNldEJ1dHRvbigpKTsKLQkJcmV0dXJuIGJ1dHRvblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkUGVyc29uUGFuZWwoKSB7Ci0JCUpQYW5lbCBwZXJzb25QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQlwZXJzb25QYW5lbC5hZGQodGhpcy5idWlsZE5hbWVUZXh0RmllbGQoKSk7Ci0JCXBlcnNvblBhbmVsLmFkZCh0aGlzLmJ1aWxkQmlydGhEYXRlU3Bpbm5lcigpKTsKLQkJcGVyc29uUGFuZWwuYWRkKHRoaXMuYnVpbGRHb25lV2VzdERhdGVTcGlubmVyKCkpOwotCQlwZXJzb25QYW5lbC5hZGQodGhpcy5idWlsZEV5ZUNvbG9yQ29tYm9Cb3goKSk7Ci0JCXBlcnNvblBhbmVsLmFkZCh0aGlzLmJ1aWxkRXZpbENoZWNrQm94KCkpOwotCQlwZXJzb25QYW5lbC5hZGQodGhpcy5idWlsZFJhbmtTcGlubmVyKCkpOwotCQlwZXJzb25QYW5lbC5hZGQodGhpcy5idWlsZEFkdmVudHVyZUNvdW50U3Bpbm5lcigpKTsKLQkJcmV0dXJuIHBlcnNvblBhbmVsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGQgYnV0dG9uICoqKioqKioqKioKLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZEFkZEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRBZGRBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRBZGRBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImFkZCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuYWRkUGVyc29uKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgYWRkUGVyc29uKCkgewotCQlTdHJpbmcgbmFtZSA9IHRoaXMuZ2V0TmFtZUZyb21Vc2VyKCk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXRoaXMuc2V0U2VsZWN0ZWRQZXJzb24odGhpcy5jcm93ZCgpLmFkZFBlcnNvbihuYW1lKSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGJ1dHRvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZW1vdmVCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVtb3ZlQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVtb3ZlQWN0aW9uKCkgewotCQl0aGlzLnJlbW92ZUFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVtb3ZlIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZW1vdmVQZXJzb24oKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5yZW1vdmVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlbW92ZVBlcnNvbigpIHsKLQkJUGVyc29uIHBlcnNvbiA9IHRoaXMuc2VsZWN0ZWRQZXJzb24oKTsKLQkJaWYgKHBlcnNvbiAhPSBudWxsKSB7Ci0JCQl0aGlzLmNyb3dkKCkucmVtb3ZlUGVyc29uKHBlcnNvbik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVuYW1lIGJ1dHRvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZW5hbWVCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVuYW1lQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVuYW1lQWN0aW9uKCkgewotCQl0aGlzLnJlbmFtZUFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVuYW1lIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZW5hbWVQZXJzb24oKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5yZW5hbWVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJldHVybiB0aGlzLnJlbmFtZUFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlbmFtZVBlcnNvbigpIHsKLQkJUGVyc29uIHBlcnNvbiA9IHRoaXMuc2VsZWN0ZWRQZXJzb24oKTsKLQkJaWYgKHBlcnNvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IHRoaXMucHJvbXB0VXNlckZvck5hbWUocGVyc29uLmdldE5hbWUoKSk7Ci0JCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJcGVyc29uLnNldE5hbWUobmFtZSk7Ci0JCQkJdGhpcy5zZXRTZWxlY3RlZFBlcnNvbihwZXJzb24pOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkZCBleWUgY29sb3IgYnV0dG9uICoqKioqKioqKioKLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZEFkZEV5ZUNvbG9yQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZEFkZEV5ZUNvbG9yQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQWRkRXllQ29sb3JBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImFkZCBleWUgY29sb3IiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmFkZEV5ZUNvbG9yKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgYWRkRXllQ29sb3IoKSB7Ci0JCVN0cmluZyBjb2xvciA9IHRoaXMucHJvbXB0VXNlckZvckV5ZUNvbG9yKCk7Ci0JCWlmIChjb2xvciAhPSBudWxsKSB7Ci0JCQl0aGlzLmV5ZUNvbG9yc0hvbGRlci5hZGQoY29sb3IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcHJvbXB0VXNlckZvckV5ZUNvbG9yKCkgewotCQl3aGlsZSAodHJ1ZSkgewotCQkJU3RyaW5nIGV5ZUNvbG9yID0gSk9wdGlvblBhbmUuc2hvd0lucHV0RGlhbG9nKCJFeWUgQ29sb3IiKTsKLQkJCWlmIChleWVDb2xvciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7CQkvLyB1c2VyIHByZXNzZWQgPENhbmNlbD4KLQkJCX0KLQkJCWlmICgoZXllQ29sb3IubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhudWxsLCAiVGhlIGV5ZSBjb2xvciBpcyByZXF1aXJlZC4iLCAiSW52YWxpZCBFeWUgQ29sb3IiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLQkJCX0gZWxzZSBpZiAoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZXllQ29sb3JzSG9sZGVyLml0ZXJhdG9yKCksIGV5ZUNvbG9yKSkgewotCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKG51bGwsICJUaGUgZXllIGNvbG9yIGFscmVhZHkgZXhpc3RzLiIsICJJbnZhbGlkIEV5ZSBDb2xvciIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZXllQ29sb3I7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJpbnQgYnV0dG9uICoqKioqKioqKioKLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFByaW50QnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFByaW50QWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUHJpbnRBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInByaW50IikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5wcmludENyb3dkKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcHJpbnRDcm93ZCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMuY3Jvd2QoKSk7Ci0JCWZvciAoSXRlcmF0b3I8UGVyc29uPiBzdHJlYW0gPSB0aGlzLmNyb3dkKCkucGVvcGxlKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdCIgKyBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXNldCBidXR0b24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzZXRCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzZXRBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZXNldEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzZXQiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc2V0KCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzZXQoKSB7Ci0JCXRoaXMuY3Jvd2RIb2xkZXIuc2V0VmFsdWUodGhpcy5idWlsZENyb3dkKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuZXcgbmFtZSBkaWFsb2cgKioqKioqKioqKgotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZUZyb21Vc2VyKCkgewotCQlyZXR1cm4gdGhpcy5wcm9tcHRVc2VyRm9yTmFtZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBwcm9tcHRVc2VyRm9yTmFtZShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nIG9yaWdpbmFsTmFtZSkgewotCQl3aGlsZSAodHJ1ZSkgewotCQkJU3RyaW5nIG5hbWUgPSBKT3B0aW9uUGFuZS5zaG93SW5wdXREaWFsb2coIlBlcnNvbiBOYW1lIik7Ci0JCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7CQkvLyB1c2VyIHByZXNzZWQgPENhbmNlbD4KLQkJCX0KLQkJCWlmICgobmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKG51bGwsICJUaGUgbmFtZSBpcyByZXF1aXJlZC4iLCAiSW52YWxpZCBOYW1lIiwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7Ci0JCQl9IGVsc2UgaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmNyb3dkKCkucGVvcGxlTmFtZXMoKSwgbmFtZSkpIHsKLQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhudWxsLCAiVGhlIG5hbWUgYWxyZWFkeSBleGlzdHMuIiwgIkludmFsaWQgTmFtZSIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lIHRleHQgZmllbGQgKioqKioqKioqKgotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGROYW1lVGV4dEZpZWxkKCkgewotCQlKVGV4dEZpZWxkIHRleHRGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKHRoaXMuYnVpbGROYW1lRG9jdW1lbnQoKSwgbnVsbCwgMCk7Ci0JCXRleHRGaWVsZC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCXJldHVybiB0ZXh0RmllbGQ7Ci0JfQotCi0JcHJpdmF0ZSBEb2N1bWVudCBidWlsZE5hbWVEb2N1bWVudCgpIHsKLQkJcmV0dXJuIG5ldyBEb2N1bWVudEFkYXB0ZXIodGhpcy5idWlsZE5hbWVBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgU3RyaW5nPih0aGlzLnNlbGVjdGVkUGVyc29uSG9sZGVyLCBQZXJzb24uTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiaXJ0aCBkYXRlIHNwaW5uZXIgKioqKioqKioqKgotCi0JcHJpdmF0ZSBKU3Bpbm5lciBidWlsZEJpcnRoRGF0ZVNwaW5uZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNwaW5uZXIodGhpcy5idWlsZEJpcnRoRGF0ZVNwaW5uZXJNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBidWlsZEJpcnRoRGF0ZVNwaW5uZXJNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLmJ1aWxkQmlydGhEYXRlQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEJpcnRoRGF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0Pih0aGlzLnNlbGVjdGVkUGVyc29uSG9sZGVyLCBQZXJzb24uQklSVEhfREFURV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGF0ZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEJpcnRoRGF0ZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEJpcnRoRGF0ZSgoRGF0ZSkgdmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBnb25lIHdlc3QgZGF0ZSBzcGlubmVyICoqKioqKioqKioKLQotCXByaXZhdGUgSlNwaW5uZXIgYnVpbGRHb25lV2VzdERhdGVTcGlubmVyKCkgewotCQlyZXR1cm4gbmV3IEpTcGlubmVyKHRoaXMuYnVpbGRHb25lV2VzdERhdGVTcGlubmVyTW9kZWwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgYnVpbGRHb25lV2VzdERhdGVTcGlubmVyTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy5idWlsZEdvbmVXZXN0RGF0ZUFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRHb25lV2VzdERhdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE9iamVjdD4odGhpcy5zZWxlY3RlZFBlcnNvbkhvbGRlciwgUGVyc29uLkdPTkVfV0VTVF9EQVRFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEYXRlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0R29uZVdlc3REYXRlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0R29uZVdlc3REYXRlKChEYXRlKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV5ZSBjb2xvciBjb21iby1ib3ggKioqKioqKioqKgotCi0JcHJpdmF0ZSBKQ29tYm9Cb3ggYnVpbGRFeWVDb2xvckNvbWJvQm94KCkgewotCQlyZXR1cm4gbmV3IEpDb21ib0JveCh0aGlzLmJ1aWxkRXllQ29sb3JDb21ib0JveE1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgQ29tYm9Cb3hNb2RlbCBidWlsZEV5ZUNvbG9yQ29tYm9Cb3hNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBDb21ib0JveE1vZGVsQWRhcHRlcih0aGlzLmV5ZUNvbG9yc0hvbGRlciwgdGhpcy5idWlsZEV5ZUNvbG9yQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEV5ZUNvbG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBPYmplY3Q+KHRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIsIFBlcnNvbi5FWUVfQ09MT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9iamVjdCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEV5ZUNvbG9yKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RXllQ29sb3IoKFN0cmluZykgdmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBldmlsIGNoZWNrIGJveCAqKioqKioqKioqCi0KLQlwcml2YXRlIEpDaGVja0JveCBidWlsZEV2aWxDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgpOwotCQljaGVja0JveC5zZXRUZXh0KCJldmlsIik7Ci0JCWNoZWNrQm94LnNldE1vZGVsKHRoaXMuYnVpbGRFdmlsQ2hlY2tCb3hNb2RlbCgpKTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgQnV0dG9uTW9kZWwgYnVpbGRFdmlsQ2hlY2tCb3hNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBDaGVja0JveE1vZGVsQWRhcHRlcih0aGlzLmJ1aWxkRXZpbEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRXZpbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgQm9vbGVhbj4odGhpcy5zZWxlY3RlZFBlcnNvbkhvbGRlciwgUGVyc29uLkVWSUxfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNFdmlsKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRFdmlsKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmFuayBzcGlubmVyICoqKioqKioqKioKLQotCXByaXZhdGUgSlNwaW5uZXIgYnVpbGRSYW5rU3Bpbm5lcigpIHsKLQkJcmV0dXJuIG5ldyBKU3Bpbm5lcih0aGlzLmJ1aWxkUmFua1NwaW5uZXJNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBidWlsZFJhbmtTcGlubmVyTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLmJ1aWxkUmFua0FkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gYnVpbGRSYW5rQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBOdW1iZXI+KHRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIsIFBlcnNvbi5SQU5LX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBOdW1iZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHRoaXMuc3ViamVjdC5nZXRSYW5rKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oTnVtYmVyIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFJhbmsodmFsdWUuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkdmVudHVyZSBjb3VudCBzcGlubmVyICoqKioqKioqKioKLQotCXByaXZhdGUgSlNwaW5uZXIgYnVpbGRBZHZlbnR1cmVDb3VudFNwaW5uZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNwaW5uZXIodGhpcy5idWlsZEFkdmVudHVyZUNvdW50U3Bpbm5lck1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGJ1aWxkQWR2ZW50dXJlQ291bnRTcGlubmVyTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLmJ1aWxkQWR2ZW50dXJlQ291bnRBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IGJ1aWxkQWR2ZW50dXJlQ291bnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE51bWJlcj4odGhpcy5zZWxlY3RlZFBlcnNvbkhvbGRlciwgUGVyc29uLkFEVkVOVFVSRV9DT1VOVF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTnVtYmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcih0aGlzLnN1YmplY3QuZ2V0QWR2ZW50dXJlQ291bnQoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhOdW1iZXIgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0QWR2ZW50dXJlQ291bnQodmFsdWUuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBDcm93ZCBjcm93ZCgpIHsKLQkJcmV0dXJuIHRoaXMuY3Jvd2RIb2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIFBlcnNvbiBzZWxlY3RlZFBlcnNvbigpIHsKLQkJaWYgKHRoaXMucm93U2VsZWN0aW9uTW9kZWwuaXNTZWxlY3Rpb25FbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKFBlcnNvbikgdGhpcy5yb3dTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkUGVyc29uKFBlcnNvbiBwZXJzb24pIHsKLQkJdGhpcy5yb3dTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKHBlcnNvbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGN1c3RvbSByZW5kZXJlciAqKioqKioqKioqCi0JCi0JLyoqCi0JICogVGhpcyBpcyBzaW1wbHkgYW4gZXhhbXBsZSBvZiBhIHJlbmRlcmVyIGZvciB0aGUgZW1iZWRkZWQgY29tYm8tYm94LgotCSAqIEl0IGRvZXMgbm90aGluZyBzcGVjaWFsIHVubGVzcyB5b3UgdW5jb21tZW50IHRoZSBjb2RlIGJlbG93Li4uLgotCSAqLwotCXByaXZhdGUgY2xhc3MgRXllQ29sb3JSZW5kZXJlciBleHRlbmRzIERlZmF1bHRMaXN0Q2VsbFJlbmRlcmVyIHsKLQkJRXllQ29sb3JSZW5kZXJlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBDb21wb25lbnQgZ2V0TGlzdENlbGxSZW5kZXJlckNvbXBvbmVudChKTGlzdCBsaXN0LCBPYmplY3QgdmFsdWUsIGludCBpbmRleCwgYm9vbGVhbiBpc1NlbGVjdGVkLCBib29sZWFuIGNlbGxIYXNGb2N1cykgewotCQkJLy8ganVzdCBkbyBzb21ldGhpbmcgdG8gc2hvdyB0aGUgcmVuZGVyZXIgaXMgd29ya2luZy4uLgotCS8vCQl2YWx1ZSA9ICI+IiArIHZhbHVlOwotCQkJcmV0dXJuIHN1cGVyLmdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQobGlzdCwgdmFsdWUsIGluZGV4LCBpc1NlbGVjdGVkLCBjZWxsSGFzRm9jdXMpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0N2MzYWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUcmVlOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZU1vZGVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkluZGVudGluZ1ByaW50V3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uQXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5OdWxsTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRyZWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLkRpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlTm9kZVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRyZWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0KLQlwdWJsaWMgVHJlZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSb290KCkgewotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFNvcnRlZFRyZWVNb2RlbCgpOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpKTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0JCVRlc3RNb2RlbCByb290ID0gcm9vdE5vZGUuZ2V0VGVzdE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygicm9vdCIsIHJvb3QuZ2V0TmFtZSgpKTsKLS8vCQlyb290LmR1bXAoKTsKLS8vCQlyb290Tm9kZS5kdW1wKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENoaWxkKCkgewotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFNvcnRlZFRyZWVNb2RlbCgpOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpKTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0KLQkJVGVzdE5vZGUgZXhwZWN0ZWQgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDEiKTsKLQkJVGVzdE5vZGUgYWN0dWFsID0gKFRlc3ROb2RlKSB0cmVlTW9kZWwuZ2V0Q2hpbGQocm9vdE5vZGUsIDEpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0KLQkJZXhwZWN0ZWQgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDIiKTsKLQkJYWN0dWFsID0gKFRlc3ROb2RlKSB0cmVlTW9kZWwuZ2V0Q2hpbGQocm9vdE5vZGUsIDIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENoaWxkQ291bnQoKSB7Ci0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkU29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkpOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQotCQlhc3NlcnRFcXVhbHMoNSwgdHJlZU1vZGVsLmdldENoaWxkQ291bnQocm9vdE5vZGUpKTsKLQotCQlUZXN0Tm9kZSBub2RlID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAxIik7Ci0JCWFzc2VydEVxdWFscygxLCB0cmVlTW9kZWwuZ2V0Q2hpbGRDb3VudChub2RlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEluZGV4T2ZDaGlsZCgpIHsKLQkJVHJlZU1vZGVsIHRyZWVNb2RlbCA9IHRoaXMuYnVpbGRTb3J0ZWRUcmVlTW9kZWwoKTsKLQkJdHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSk7Ci0JCVRlc3ROb2RlIHJvb3ROb2RlID0gKFRlc3ROb2RlKSB0cmVlTW9kZWwuZ2V0Um9vdCgpOwotCi0JCVRlc3ROb2RlIGNoaWxkID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAwIik7Ci0JCWFzc2VydEVxdWFscygwLCB0cmVlTW9kZWwuZ2V0SW5kZXhPZkNoaWxkKHJvb3ROb2RlLCBjaGlsZCkpOwotCi0JCWNoaWxkID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAxIik7Ci0JCWFzc2VydEVxdWFscygxLCB0cmVlTW9kZWwuZ2V0SW5kZXhPZkNoaWxkKHJvb3ROb2RlLCBjaGlsZCkpOwotCi0JCWNoaWxkID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAyIik7Ci0JCWFzc2VydEVxdWFscygyLCB0cmVlTW9kZWwuZ2V0SW5kZXhPZkNoaWxkKHJvb3ROb2RlLCBjaGlsZCkpOwotCQlUZXN0Tm9kZSBncmFuZGNoaWxkID0gY2hpbGQuY2hpbGROYW1lZCgibm9kZSAyLjIiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRyZWVNb2RlbC5nZXRJbmRleE9mQ2hpbGQoY2hpbGQsIGdyYW5kY2hpbGQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNMZWFmKCkgewotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFNvcnRlZFRyZWVNb2RlbCgpOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpKTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0JCWFzc2VydEZhbHNlKHRyZWVNb2RlbC5pc0xlYWYocm9vdE5vZGUpKTsKLQkJVGVzdE5vZGUgbm9kZSA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMSIpOwotCQlhc3NlcnRGYWxzZSh0cmVlTW9kZWwuaXNMZWFmKG5vZGUpKTsKLQkJbm9kZSA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMyIpOwotCQlhc3NlcnRUcnVlKHRyZWVNb2RlbC5pc0xlYWYobm9kZSkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVOb2Rlc0NoYW5nZWQoKSB7Ci0JCS8vIHRoZSBvbmx5IHdheSB0byB0cmlnZ2VyIGEgIm5vZGUgY2hhbmdlZCIgZXZlbnQgaXMgdG8gdXNlIGFuIHVuc29ydGVkIHRyZWU7Ci0JCS8vIGEgc29ydGVkIHRyZWUgd2lsbCB3aWxsIHRyaWdnZXIgb25seSAibm9kZSByZW1vdmVkIiBhbmQgIm5vZGUgaW5zZXJ0ZWQiIGV2ZW50cwotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFVuc29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzQ2hhbmdlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQkJVGVzdE5vZGUgbm9kZSA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMSIpOwotCQlUZXN0TW9kZWwgdG0gPSBub2RlLmdldFRlc3RNb2RlbCgpOwotCQl0bS5zZXROYW1lKCJub2RlIDErKyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0KLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCW5vZGUgPSBub2RlLmNoaWxkTmFtZWQoIm5vZGUgMS4xIik7Ci0JCXRtID0gbm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJdG0uc2V0TmFtZSgibm9kZSAxLjErKyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVOb2Rlc0luc2VydGVkKCkgewotCQkvLyB1c2UgYW4gdW5zb3J0ZWQgdHJlZSBzbyB0aGUgbm9kZXMgYXJlIG5vdCByZS1zaHVmZmxlZC4uLgotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFVuc29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzSW5zZXJ0ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0JCVRlc3ROb2RlIG5vZGUgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDEiKTsKLQkJVGVzdE1vZGVsIHRtID0gbm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJdG0uYWRkQ2hpbGQoIm5ldyBjaGlsZC4uLiIpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0KLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCW5vZGUgPSBub2RlLmNoaWxkTmFtZWQoIm5vZGUgMS4xIik7Ci0JCXRtID0gbm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJdG0uYWRkQ2hpbGQoImFub3RoZXIgbmV3IGNoaWxkLi4uIik7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJlZU5vZGVzUmVtb3ZlZCgpIHsKLQkJVHJlZU1vZGVsIHRyZWVNb2RlbCA9IHRoaXMuYnVpbGRVbnNvcnRlZFRyZWVNb2RlbCgpOwotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc1JlbW92ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0JCVRlc3RNb2RlbCByb290ID0gcm9vdE5vZGUuZ2V0VGVzdE1vZGVsKCk7Ci0JCXJvb3QucmVtb3ZlQ2hpbGQocm9vdC5jaGlsZE5hbWVkKCJub2RlIDMiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJVGVzdE5vZGUgbm9kZSA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMiIpOwotCQlUZXN0TW9kZWwgdG0gPSBub2RlLmdldFRlc3RNb2RlbCgpOwotCQl0bS5yZW1vdmVDaGlsZCh0bS5jaGlsZE5hbWVkKCJub2RlIDIuMiIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmVlU3RydWN0dXJlQ2hhbmdlZCgpIHsKLQkJTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gbm9kZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+KHRoaXMuYnVpbGRTb3J0ZWRSb290Tm9kZSgpKTsKLQkJVHJlZU1vZGVsIHRyZWVNb2RlbCA9IHRoaXMuYnVpbGRUcmVlTW9kZWwobm9kZUhvbGRlcik7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzSW5zZXJ0ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzUmVtb3ZlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0cmVlU3RydWN0dXJlQ2hhbmdlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlub2RlSG9sZGVyLnNldFZhbHVlKHRoaXMuYnVpbGRVbnNvcnRlZFJvb3ROb2RlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBhIHByb2JsZW0gd2UgaGFkIHdoZXJlIHJlbW92aW5nIGEgY2hpbGQgZnJvbSBhIHRyZWUgd291bGQgY2F1c2UKLQkgKiB0aGUgSlRyZWUgdG8gY2FsbCAjZXF1YWxzKE9iamVjdCkgb24gZWFjaCBub2RlIHJlbW92ZWQgKGFjdHVhbGx5LCBpdCB3YXMKLQkgKiBUcmVlUGF0aCwgYnV0IHRoYXQgd2FzIGJlY2F1c2UgaXRzIG93biAjZXF1YWxzKE9iamVjdCkgd2FzIGNhbGxlZCBieQotCSAqIEpUcmVlKTsgYW5kIHNpbmNlIHdlIGhhZCBhbHJlYWR5IHJlbW92ZWQgdGhlIGxhc3QgbGlzdGVuZXIgZnJvbSB0aGUKLQkgKiBhc3BlY3QgYWRhcHRlciwgdGhlIGFzcGVjdCBhZGFwdGVyIHdvdWxkIHNheSBpdHMgdmFsdWUgd2FzIG51bGw7IHRoaXMKLQkgKiB3b3VsZCBjYXVzZSBhIE5QRSB1bnRpbCB3ZSB0d2Vha2VkIFRyZWVNb2RlbEFkYXB0ZXIgdG8gcmVtb3ZlIGl0cwotCSAqIGxpc3RlbmVycyBmcm9tIGEgbm9kZSBvbmx5ICphZnRlciogdGhlIG5vZGUgaGFkIGJlZW4gY29tcGxldGVseQotCSAqIHJlbW92ZWQgZnJvbSB0aGUgSlRyZWUKLQkgKiBAc2VlIFRyZWVNb2RlbEFkYXB0ZXIjcmVtb3ZlTm9kZShPYmplY3RbXSwgaW50LCBUcmVlTm9kZVZhbHVlTW9kZWwpCi0JICogQHNlZSBUcmVlTW9kZWxBZGFwdGVyI2FkZE5vZGUoT2JqZWN0W10sIGludCwgVHJlZU5vZGVWYWx1ZU1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RMYXp5SW5pdGlhbGl6YXRpb24oKSB7Ci0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkU3BlY2lhbFRyZWVNb2RlbCgpOwotCQlKVHJlZSBqVHJlZSA9IG5ldyBKVHJlZSh0cmVlTW9kZWwpOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQkJVGVzdE1vZGVsIHJvb3QgPSByb290Tm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJLy8gdGhpcyB3b3VsZCBjYXVzZSBhIE5QRToKLQkJcm9vdC5yZW1vdmVDaGlsZChyb290LmNoaWxkTmFtZWQoIm5vZGUgMyIpKTsKLQkJYXNzZXJ0RXF1YWxzKHRyZWVNb2RlbCwgalRyZWUuZ2V0TW9kZWwoKSk7Ci0JfQotCi0KLQlwcml2YXRlIFRyZWVNb2RlbCBidWlsZFNvcnRlZFRyZWVNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmVlTW9kZWwodGhpcy5idWlsZFNvcnRlZFJvb3ROb2RlKCkpOwotCX0KLQotCXByaXZhdGUgVGVzdE5vZGUgYnVpbGRTb3J0ZWRSb290Tm9kZSgpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRUZXN0Tm9kZSh0aGlzLmJ1aWxkUm9vdCgpKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVNb2RlbCBidWlsZFVuc29ydGVkVHJlZU1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyZWVNb2RlbCh0aGlzLmJ1aWxkVW5zb3J0ZWRSb290Tm9kZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3ROb2RlIGJ1aWxkVW5zb3J0ZWRSb290Tm9kZSgpIHsKLQkJcmV0dXJuIG5ldyBVbnNvcnRlZFRlc3ROb2RlKHRoaXMuYnVpbGRSb290KCkpOwotCX0KLQotCXByaXZhdGUgVHJlZU1vZGVsIGJ1aWxkU3BlY2lhbFRyZWVNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmVlTW9kZWwodGhpcy5idWlsZFNwZWNpYWxSb290Tm9kZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3ROb2RlIGJ1aWxkU3BlY2lhbFJvb3ROb2RlKCkgewotCQlyZXR1cm4gbmV3IFNwZWNpYWxUZXN0Tm9kZSh0aGlzLmJ1aWxkUm9vdCgpKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3RNb2RlbCBidWlsZFJvb3QoKSB7Ci0JCVRlc3RNb2RlbCByb290ID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQkvKk5vZGUgbm9kZV8wID0gKi9yb290LmFkZENoaWxkKCJub2RlIDAiKTsKLQkJVGVzdE1vZGVsIG5vZGVfMSA9IHJvb3QuYWRkQ2hpbGQoIm5vZGUgMSIpOwotCQlUZXN0TW9kZWwgbm9kZV8xXzEgPSBub2RlXzEuYWRkQ2hpbGQoIm5vZGUgMS4xIik7Ci0JCS8qTm9kZSBub2RlXzFfMV8xID0gKi9ub2RlXzFfMS5hZGRDaGlsZCgibm9kZSAxLjEuMSIpOwotCQlUZXN0TW9kZWwgbm9kZV8yID0gcm9vdC5hZGRDaGlsZCgibm9kZSAyIik7Ci0JCS8qTm9kZSBub2RlXzJfMCA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuMCIpOwotCQkvKk5vZGUgbm9kZV8yXzEgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjEiKTsKLQkJLypOb2RlIG5vZGVfMl8yID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi4yIik7Ci0JCS8qTm9kZSBub2RlXzJfMyA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuMyIpOwotCQkvKk5vZGUgbm9kZV8yXzQgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjQiKTsKLQkJLypOb2RlIG5vZGVfMl81ID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi41Iik7Ci0JCS8qTm9kZSBub2RlXzMgPSAqL3Jvb3QuYWRkQ2hpbGQoIm5vZGUgMyIpOwotCQkvKk5vZGUgbm9kZV80ID0gKi9yb290LmFkZENoaWxkKCJub2RlIDQiKTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgaXMgYSB0eXBpY2FsIG1vZGVsIGNsYXNzIHdpdGggdGhlIHR5cGljYWwgY2hhbmdlIG5vdGlmaWNhdGlvbnMKLQkgKiBmb3IgI25hbWUgYW5kICNjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JCS8vIHRoZSAgcGFyZW50IGlzIGltbXV0YWJsZTsgdGhlIHJvb3QncyBwYXJlbnQgaXMgbnVsbAotCQlwcml2YXRlIGZpbmFsIFRlc3RNb2RlbCBwYXJlbnQ7Ci0KLQkJLy8gdGhlIG5hbWUgaXMgbXV0YWJsZTsgc28gSSBndWVzcyBpdCBpc24ndCB0aGUgInByaW1hcnkga2V5IiA6LSkKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFRlc3RNb2RlbD4gY2hpbGRyZW47Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSElMRFJFTl9DT0xMRUNUSU9OID0gImNoaWxkcmVuIjsKLQotCi0JCXB1YmxpYyBUZXN0TW9kZWwoU3RyaW5nIG5hbWUpIHsJLy8gcm9vdCBjdG9yCi0JCQl0aGlzKG51bGwsIG5hbWUpOwotCQl9Ci0JCXByaXZhdGUgVGVzdE1vZGVsKFRlc3RNb2RlbCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5jaGlsZHJlbiA9IG5ldyBIYXNoQmFnPFRlc3RNb2RlbD4oKTsKLQkJfQotCi0JCXB1YmxpYyBUZXN0TW9kZWwgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIHRoaXMucGFyZW50OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPFRlc3RNb2RlbD4gY2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8VGVzdE1vZGVsPih0aGlzLmNoaWxkcmVuKTsKLQkJfQotCQlwdWJsaWMgaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuLnNpemUoKTsKLQkJfQotCQlwdWJsaWMgVGVzdE1vZGVsIGFkZENoaWxkKFN0cmluZyBjaGlsZE5hbWUpIHsKLQkJCVRlc3RNb2RlbCBjaGlsZCA9IG5ldyBUZXN0TW9kZWwodGhpcywgY2hpbGROYW1lKTsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihjaGlsZCwgdGhpcy5jaGlsZHJlbiwgQ0hJTERSRU5fQ09MTEVDVElPTik7Ci0JCQlyZXR1cm4gY2hpbGQ7Ci0JCX0KLQkJcHVibGljIFRlc3RNb2RlbFtdIGFkZENoaWxkcmVuKFN0cmluZ1tdIGNoaWxkTmFtZXMpIHsKLQkJCVRlc3RNb2RlbFtdIG5ld0NoaWxkcmVuID0gbmV3IFRlc3RNb2RlbFtjaGlsZE5hbWVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQluZXdDaGlsZHJlbltpXSA9IG5ldyBUZXN0TW9kZWwodGhpcywgY2hpbGROYW1lc1tpXSk7Ci0JCQl9Ci0JCQl0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKG5ld0NoaWxkcmVuLCB0aGlzLmNoaWxkcmVuLCBDSElMRFJFTl9DT0xMRUNUSU9OKTsKLQkJCXJldHVybiBuZXdDaGlsZHJlbjsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZChUZXN0TW9kZWwgY2hpbGQpIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKGNoaWxkLCB0aGlzLmNoaWxkcmVuLCBDSElMRFJFTl9DT0xMRUNUSU9OKTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZHJlbihUZXN0TW9kZWxbXSB0ZXN0TW9kZWxzKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24odGVzdE1vZGVscywgdGhpcy5jaGlsZHJlbiwgQ0hJTERSRU5fQ09MTEVDVElPTik7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXJDaGlsZHJlbigpIHsKLQkJCXRoaXMuY2xlYXJDb2xsZWN0aW9uKHRoaXMuY2hpbGRyZW4sIENISUxEUkVOX0NPTExFQ1RJT04pOwotCQl9Ci0JCXB1YmxpYyBUZXN0TW9kZWwgY2hpbGROYW1lZChTdHJpbmcgY2hpbGROYW1lKSB7Ci0JCQlmb3IgKFRlc3RNb2RlbCBjaGlsZCA6IHRoaXMuY2hpbGRyZW4pIHsKLQkJCQlpZiAoY2hpbGQuZ2V0TmFtZSgpLmVxdWFscyhjaGlsZE5hbWUpKSB7Ci0JCQkJCXJldHVybiBjaGlsZDsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY2hpbGQgbm90IGZvdW5kOiAiICsgY2hpbGROYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZHVtcFN0cmluZygpIHsKLQkJCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCUluZGVudGluZ1ByaW50V3JpdGVyIGlwdyA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcihzdyk7Ci0JCQl0aGlzLmR1bXBPbihpcHcpOwotCQkJcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHVtcE9uKEluZGVudGluZ1ByaW50V3JpdGVyIHdyaXRlcikgewotCQkJd3JpdGVyLnByaW50bG4odGhpcyk7Ci0JCQl3cml0ZXIuaW5kZW50KCk7Ci0JCQlmb3IgKFRlc3RNb2RlbCBjaGlsZCA6IHRoaXMuY2hpbGRyZW4pIHsKLQkJCQljaGlsZC5kdW1wT24od3JpdGVyKTsKLQkJCX0KLQkJCXdyaXRlci51bmRlbnQoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkdW1wT24oT3V0cHV0U3RyZWFtIHN0cmVhbSkgewotCQkJSW5kZW50aW5nUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc3RyZWFtKSk7Ci0JCQl0aGlzLmR1bXBPbih3cml0ZXIpOwotCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHVtcCgpIHsKLQkJCXRoaXMuZHVtcE9uKFN5c3RlbS5vdXQpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm5hbWUpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgTm9kZSB3cmFwcyBhIFRlc3RNb2RlbCBhbmQgY29udmVydHMgaW50byBzb21ldGhpbmcgdGhhdCBjYW4KLQkgKiBiZSB1c2VkIGJ5IFRyZWVNb2RlbEFkYXB0ZXIuIEl0IGNvbnZlcnRzIGNoYW5nZXMgdG8gdGhlIFRlc3RNb2RlbCdzCi0JICogbmFtZSBpbnRvICJzdGF0ZSBjaGFuZ2VzIiB0byB0aGUgTm9kZTsgYW5kIGNvbnZlcnRzIHRoZQotCSAqIFRlc3RNb2RlbCdzIGNoaWxkcmVuIGludG8gYSBMaXN0VmFsdWVNb2RlbCBvZiBOb2RlcyB3aG9zZSBvcmRlciBpcwotCSAqIGRldGVybWluZWQgYnkgc3ViY2xhc3MgaW1wbGVtZW50YXRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgVGVzdE5vZGUgZXh0ZW5kcyBBYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+IGltcGxlbWVudHMgRGlzcGxheWFibGUsIENvbXBhcmFibGU8VGVzdE5vZGU+IHsKLQkJLyoqIHRoZSBtb2RlbCBvYmplY3Qgd3JhcHBlZCBieSB0aGlzIG5vZGUgKi8KLQkJcHJpdmF0ZSBmaW5hbCBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQkvKiogdGhpcyBub2RlJ3MgcGFyZW50IG5vZGU7IG51bGwgZm9yIHRoZSByb290IG5vZGUgKi8KLQkJcHJpdmF0ZSBmaW5hbCBUZXN0Tm9kZSBwYXJlbnQ7Ci0JCS8qKiB0aGlzIG5vZGUncyBjaGlsZCBub2RlcyAqLwotCQlwcml2YXRlIGZpbmFsIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBjaGlsZHJlbk1vZGVsOwotCQkvKiogYSBsaXN0ZW5lciB0aGF0IG5vdGlmaWVzIHVzIHdoZW4gdGhlIG1vZGVsIG9iamVjdCdzICJpbnRlcm5hbCBzdGF0ZSIgY2hhbmdlcyAqLwotCQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdGVzdE1vZGVsTGlzdGVuZXI7Ci0KLQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkJLyoqCi0JCSAqIHJvb3Qgbm9kZSBjb25zdHJ1Y3RvcgotCQkgKi8KLQkJcHVibGljIFRlc3ROb2RlKFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXRoaXMobnVsbCwgdGVzdE1vZGVsKTsKLQkJfQotCi0JCS8qKgotCQkgKiBicmFuY2ggb3IgbGVhZiBub2RlIGNvbnN0cnVjdG9yCi0JCSAqLwotCQlwdWJsaWMgVGVzdE5vZGUoVGVzdE5vZGUgcGFyZW50LCBUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJCXRoaXMuY2hpbGRyZW5Nb2RlbCA9IHRoaXMuYnVpbGRDaGlsZHJlbk1vZGVsKHRlc3RNb2RlbCk7Ci0JCQl0aGlzLnRlc3RNb2RlbExpc3RlbmVyID0gdGhpcy5idWlsZFRlc3RNb2RlbExpc3RlbmVyKCk7Ci0JCX0KLQotCQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRUZXN0TW9kZWxMaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJCVRlc3ROb2RlLnRoaXMudGVzdE1vZGVsQ2hhbmdlZChlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIHN1YmNsYXNzZXMgZGVjaWRlIHRoZSBvcmRlciBvZiB0aGUgY2hpbGQgbm9kZXMKLQkJICovCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gYnVpbGRDaGlsZHJlbk1vZGVsKFRlc3RNb2RlbCBtb2RlbCk7Ci0KLQkJLyoqCi0JCSAqIHVzZWQgYnkgc3ViY2xhc3NlczsKLQkJICogdHJhbnNmb3JtIHRoZSB0ZXN0IG1vZGVsIGNoaWxkcmVuIGludG8gbm9kZXMKLQkJICovCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gYnVpbGROb2RlQWRhcHRlcihUZXN0TW9kZWwgbW9kZWwpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbDxUZXN0TW9kZWwsIFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+Pih0aGlzLmJ1aWxkQ2hpbGRyZW5BZGFwdGVyKG1vZGVsKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBUZXN0Tm9kZSB0cmFuc2Zvcm1JdGVtKFRlc3RNb2RlbCBpdGVtKSB7Ci0JCQkJCXJldHVybiBUZXN0Tm9kZS50aGlzLmJ1aWxkQ2hpbGROb2RlKGl0ZW0pOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogc3ViY2xhc3NlcyBtdXN0IGJ1aWxkIGEgY29uY3JldGUgbm9kZSBmb3IgdGhlIHNwZWNpZmllZCB0ZXN0IG1vZGVsCi0JCSAqLwotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgVGVzdE5vZGUgYnVpbGRDaGlsZE5vZGUoVGVzdE1vZGVsIGNoaWxkVGVzdE1vZGVsKTsKLQotCQkvKioKLQkJICogcmV0dXJuIGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBvbiB0aGUgc3BlY2lmaWVkIG1vZGVsJ3MgY2hpbGRyZW4KLQkJICovCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxUZXN0TW9kZWw+IGJ1aWxkQ2hpbGRyZW5BZGFwdGVyKFRlc3RNb2RlbCBtb2RlbCkgewotCQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIFRlc3RNb2RlbD4oVGVzdE1vZGVsLkNISUxEUkVOX0NPTExFQ1RJT04sIG1vZGVsKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFRlc3RNb2RlbD4gaXRlcmF0b3JfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmNoaWxkcmVuKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuY2hpbGRyZW5TaXplKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBUcmVlTm9kZVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JCXB1YmxpYyBUZXN0TW9kZWwgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy50ZXN0TW9kZWw7Ci0JCX0KLQotCQlwdWJsaWMgVHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4gcGFyZW50KCkgewotCQkJcmV0dXJuIHRoaXMucGFyZW50OwotCQl9Ci0KLQkJcHVibGljIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBjaGlsZHJlbk1vZGVsKCkgewotCQkJcmV0dXJuIHRoaXMuY2hpbGRyZW5Nb2RlbDsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBBYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVZhbHVlKCkgewotCQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuTkFNRV9QUk9QRVJUWSwgdGhpcy50ZXN0TW9kZWxMaXN0ZW5lcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWUoKSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5OQU1FX1BST1BFUlRZLCB0aGlzLnRlc3RNb2RlbExpc3RlbmVyKTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBEaXNwbGF5YWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMudGVzdE1vZGVsLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBJY29uIGljb24oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBkZWJ1Z2dpbmcgc3VwcG9ydCAqKioqKioqKioqCi0KLQkJcHVibGljIFN0cmluZyBkdW1wU3RyaW5nKCkgewotCQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJSW5kZW50aW5nUHJpbnRXcml0ZXIgaXB3ID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKHN3KTsKLQkJCXRoaXMuZHVtcE9uKGlwdyk7Ci0JCQlyZXR1cm4gc3cudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGR1bXBPbihJbmRlbnRpbmdQcmludFdyaXRlciB3cml0ZXIpIHsKLQkJCXdyaXRlci5wcmludGxuKHRoaXMpOwotCQkJd3JpdGVyLmluZGVudCgpOwotCQkJZm9yIChJdGVyYXRvcjxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbk1vZGVsLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCS8vIGNhc3QgdG8gYSBUZXN0Tm9kZSAoaS5lLiB0aGlzIHdvbid0IHdvcmsgd2l0aCBhIE5hbWVUZXN0Tm9kZSBpbiB0aGUgdHJlZSkKLQkJCQkoKFRlc3ROb2RlKSBzdHJlYW0ubmV4dCgpKS5kdW1wT24od3JpdGVyKTsKLQkJCX0KLQkJCXdyaXRlci51bmRlbnQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGR1bXBPbihPdXRwdXRTdHJlYW0gc3RyZWFtKSB7Ci0JCQlJbmRlbnRpbmdQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihzdHJlYW0pKTsKLQkJCXRoaXMuZHVtcE9uKHdyaXRlcik7Ci0JCQl3cml0ZXIuZmx1c2goKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGR1bXAoKSB7Ci0JCQl0aGlzLmR1bXBPbihTeXN0ZW0ub3V0KTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkJLyoqCi0JCSAqIHRoZSBtb2RlbCdzIG5hbWUgaGFzIGNoYW5nZWQsIGZvcndhcmQgdGhlIGV2ZW50IHRvIG91ciBsaXN0ZW5lcnMKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHRlc3RNb2RlbENoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkvLyB3ZSBuZWVkIHRvIG5vdGlmeSBsaXN0ZW5lcnMgdGhhdCBvdXIgImludGVybmFsIHN0YXRlIiBoYXMgY2hhbmdlZAotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCQkvLyBvdXIgZGlzcGxheSBzdHJpbmcgc3RheXMgaW4gc3luY2ggd2l0aCB0aGUgbW9kZWwncyBuYW1lCi0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIGUuZ2V0T2xkVmFsdWUoKSwgZS5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCQlwdWJsaWMgVGVzdE1vZGVsIGdldFRlc3RNb2RlbCgpIHsKLQkJCXJldHVybiB0aGlzLnRlc3RNb2RlbDsKLQkJfQotCi0JCS8qKgotCQkgKiB0ZXN0aW5nIGNvbnZlbmllbmNlIG1ldGhvZAotCQkgKi8KLQkJcHVibGljIFRlc3ROb2RlIGNoaWxkTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJCWZvciAoSXRlcmF0b3I8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW5Nb2RlbC5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0PiBjaGlsZE5vZGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJCWlmIChjaGlsZE5vZGUgaW5zdGFuY2VvZiBUZXN0Tm9kZSkgewotCQkJCQlpZiAoKChUZXN0Tm9kZSkgY2hpbGROb2RlKS5nZXRUZXN0TW9kZWwoKS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCQlyZXR1cm4gKFRlc3ROb2RlKSBjaGlsZE5vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjaGlsZCBub3QgZm91bmQ6ICIgKyBuYW1lKTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhUZXN0Tm9kZSBvKSB7Ci0JCQlyZXR1cm4gdGhpcy5kaXNwbGF5U3RyaW5nKCkuY29tcGFyZVRvKG8uZGlzcGxheVN0cmluZygpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJOb2RlKCIgKyB0aGlzLnRlc3RNb2RlbCArICIpIjsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogY29uY3JldGUgaW1wbGVtZW50YXRpb24gdGhhdCBrZWVwcyBpdHMgY2hpbGRyZW4gc29ydGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTb3J0ZWRUZXN0Tm9kZSBleHRlbmRzIFRlc3ROb2RlIHsKLQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCXB1YmxpYyBTb3J0ZWRUZXN0Tm9kZShUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlzdXBlcih0ZXN0TW9kZWwpOwotCQl9Ci0JCXB1YmxpYyBTb3J0ZWRUZXN0Tm9kZShUZXN0Tm9kZSBwYXJlbnQsIFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXN1cGVyKHBhcmVudCwgdGVzdE1vZGVsKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCQkvKiogdGhlIGxpc3Qgc2hvdWxkIGJlIHNvcnRlZCAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBidWlsZENoaWxkcmVuTW9kZWwoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+KHRoaXMuYnVpbGREaXNwbGF5U3RyaW5nQWRhcHRlcih0ZXN0TW9kZWwpKTsKLQkJfQotCQkvKiogdGhlIGRpc3BsYXkgc3RyaW5nIChuYW1lKSBvZiBlYWNoIG5vZGUgY2FuIGNoYW5nZSAqLwotCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGJ1aWxkRGlzcGxheVN0cmluZ0FkYXB0ZXIoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+KHRoaXMuYnVpbGROb2RlQWRhcHRlcih0ZXN0TW9kZWwpLCBESVNQTEFZX1NUUklOR19QUk9QRVJUWSk7Ci0JCX0KLQkJLyoqIGNoaWxkcmVuIGFyZSBhbHNvIHNvcnRlZCBub2RlcyAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFRlc3ROb2RlIGJ1aWxkQ2hpbGROb2RlKFRlc3RNb2RlbCBjaGlsZE5vZGUpIHsKLQkJCXJldHVybiBuZXcgU29ydGVkVGVzdE5vZGUodGhpcywgY2hpbGROb2RlKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGxlYXZlcyBpdHMgY2hpbGRyZW4gdW5zb3J0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFVuc29ydGVkVGVzdE5vZGUgZXh0ZW5kcyBUZXN0Tm9kZSB7Ci0KLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQlwdWJsaWMgVW5zb3J0ZWRUZXN0Tm9kZShUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlzdXBlcih0ZXN0TW9kZWwpOwotCQl9Ci0JCXB1YmxpYyBVbnNvcnRlZFRlc3ROb2RlKFRlc3ROb2RlIHBhcmVudCwgVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJc3VwZXIocGFyZW50LCB0ZXN0TW9kZWwpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JCS8qKiB0aGUgbGlzdCBzaG91bGQgTk9UIGJlIHNvcnRlZCAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBidWlsZENoaWxkcmVuTW9kZWwoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJcmV0dXJuIHRoaXMuYnVpbGROb2RlQWRhcHRlcih0ZXN0TW9kZWwpOwotCQl9Ci0JCS8qKiBjaGlsZHJlbiBhcmUgYWxzbyB1bnNvcnRlZCBub2RlcyAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFRlc3ROb2RlIGJ1aWxkQ2hpbGROb2RlKFRlc3RNb2RlbCBjaGlsZE5vZGUpIHsKLQkJCXJldHVybiBuZXcgVW5zb3J0ZWRUZXN0Tm9kZSh0aGlzLCBjaGlsZE5vZGUpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIHRoYXQgbGVhdmVzIGl0cyBjaGlsZHJlbiB1bnNvcnRlZAotCSAqIGFuZCBoYXMgYSBzcGVjaWFsIHNldCBvZiBjaGlsZHJlbiBmb3IgIm5vZGUgMyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNwZWNpYWxUZXN0Tm9kZSBleHRlbmRzIFVuc29ydGVkVGVzdE5vZGUgewotCi0JCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkJcHVibGljIFNwZWNpYWxUZXN0Tm9kZShUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlzdXBlcih0ZXN0TW9kZWwpOwotCQl9Ci0JCXB1YmxpYyBTcGVjaWFsVGVzdE5vZGUoVGVzdE5vZGUgcGFyZW50LCBUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlzdXBlcihwYXJlbnQsIHRlc3RNb2RlbCk7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkJLyoqIHJldHVybiBhIGRpZmZlcmVudCBsaXN0IG9mIGNoaWxkcmVuIGZvciAibm9kZSAzIiAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBidWlsZENoaWxkcmVuTW9kZWwoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJaWYgKHRlc3RNb2RlbC5nZXROYW1lKCkuZXF1YWxzKCJub2RlIDMiKSkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkU3BlY2lhbENoaWxkcmVuTW9kZWwoKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5idWlsZENoaWxkcmVuTW9kZWwodGVzdE1vZGVsKTsKLQkJfQotCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGJ1aWxkU3BlY2lhbENoaWxkcmVuTW9kZWwoKSB7Ci0JCQlUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0PltdIGNoaWxkcmVuID0gbmV3IE5hbWVUZXN0Tm9kZVsxXTsKLQkJCWNoaWxkcmVuWzBdID0gbmV3IE5hbWVUZXN0Tm9kZSh0aGlzKTsKLQkJCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+KEFycmF5cy5hc0xpc3QoY2hpbGRyZW4pKTsKLQkJfQotCQkvKiogY2hpbGRyZW4gYXJlIGFsc28gc3BlY2lhbCBub2RlcyAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFRlc3ROb2RlIGJ1aWxkQ2hpbGROb2RlKFRlc3RNb2RlbCBjaGlsZE5vZGUpIHsKLQkJCXJldHVybiBuZXcgU3BlY2lhbFRlc3ROb2RlKHRoaXMsIGNoaWxkTm9kZSk7Ci0JCX0KLQotCX0KLQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBOYW1lVGVzdE5vZGUgZXh0ZW5kcyBBYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+IHsKLQkJcHJpdmF0ZSBmaW5hbCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbmFtZUFkYXB0ZXI7Ci0JCXByaXZhdGUgZmluYWwgU3BlY2lhbFRlc3ROb2RlIHNwZWNpYWxOb2RlOwkJLy8gcGFyZW50IG5vZGUKLQkJcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIG5hbWVMaXN0ZW5lcjsKLQkJcHJpdmF0ZSBmaW5hbCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gY2hpbGRyZW5Nb2RlbDsKLQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkJcHVibGljIE5hbWVUZXN0Tm9kZShTcGVjaWFsVGVzdE5vZGUgc3BlY2lhbE5vZGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWVMaXN0ZW5lciA9IHRoaXMuYnVpbGROYW1lTGlzdGVuZXIoKTsKLQkJCXRoaXMuc3BlY2lhbE5vZGUgPSBzcGVjaWFsTm9kZTsKLQkJCXRoaXMubmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZUFkYXB0ZXIoKTsKLQkJCXRoaXMuY2hpbGRyZW5Nb2RlbCA9IG5ldyBOdWxsTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+KCk7Ci0JCX0KLQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGROYW1lTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCQlOYW1lVGVzdE5vZGUudGhpcy5uYW1lQ2hhbmdlZChlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXByb3RlY3RlZCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lQWRhcHRlcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgU3RyaW5nPihUZXN0TW9kZWwuTkFNRV9QUk9QRVJUWSwgdGhpcy5nZXRUZXN0TW9kZWwoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHVibGljIFRlc3RNb2RlbCBnZXRUZXN0TW9kZWwoKSB7Ci0JCQlyZXR1cm4gdGhpcy5zcGVjaWFsTm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogVHJlZU5vZGVWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKChTdHJpbmcpIHZhbHVlKTsKLQkJfQotCQlwdWJsaWMgVHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4gcGFyZW50KCkgewotCQkJcmV0dXJuIHRoaXMuc3BlY2lhbE5vZGU7Ci0JCX0KLQkJcHVibGljIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBjaGlsZHJlbk1vZGVsKCkgewotCQkJcmV0dXJuIHRoaXMuY2hpbGRyZW5Nb2RlbDsKLQkJfQotCi0JCS8vICoqKioqKioqKiogQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZSgpIHsKLQkJCXRoaXMubmFtZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubmFtZUxpc3RlbmVyKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWUoKSB7Ci0JCQl0aGlzLm5hbWVBZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLm5hbWVMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCQlwcm90ZWN0ZWQgdm9pZCBuYW1lQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCS8vIHdlIG5lZWQgdG8gbm90aWZ5IGxpc3RlbmVycyB0aGF0IG91ciAidmFsdWUiIGhhcyBjaGFuZ2VkCi0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIGUuZ2V0T2xkVmFsdWUoKSwgZS5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgVHJlZU1vZGVsIGJ1aWxkVHJlZU1vZGVsKFRlc3ROb2RlIHJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmVlTW9kZWwobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4ocm9vdCkpOwotCX0KLQotCXByaXZhdGUgVHJlZU1vZGVsIGJ1aWxkVHJlZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gcm9vdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyZWVNb2RlbEFkYXB0ZXI8T2JqZWN0Pihyb290SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRDaGlsZHJlbkxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkQ2hpbGRyZW5MaXN0ZW5lcl8oKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGROb2RlU3RhdGVMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZE5vZGVTdGF0ZUxpc3RlbmVyXygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE5vZGVWYWx1ZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkTm9kZVZhbHVlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUm9vdExpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkUm9vdExpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCi0KLQkvKioKLQkgKiBsaXN0ZW5lciB0aGF0IHdpbGwgYmxvdyB1cCB3aXRoIGFueSBldmVudDsKLQkgKiBvdmVycmlkZSBhbmQgaW1wbGVtZW50IGV4cGVjdGVkIGV2ZW50IG1ldGhvZHMKLQkgKi8KLQlwdWJsaWMgY2xhc3MgVGVzdFRyZWVNb2RlbExpc3RlbmVyIGltcGxlbWVudHMgVHJlZU1vZGVsTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNDaGFuZ2VkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNJbnNlcnRlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZU5vZGVzUmVtb3ZlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZVN0cnVjdHVyZUNoYW5nZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFiNzU5Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmlkTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LlRleHRGaWVsZDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KVHJlZTsKLWltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZVNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRUcmVlU2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlUGF0aDsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW51bWVyYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UcmVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZy5EaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuVHJlZU5vZGVWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UcmVlTW9kZWxBZGFwdGVyVGVzdHMuU29ydGVkVGVzdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRyZWVNb2RlbEFkYXB0ZXJUZXN0cy5UZXN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRyZWVNb2RlbEFkYXB0ZXJUZXN0cy5UZXN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVHJlZU1vZGVsQWRhcHRlclRlc3RzLlVuc29ydGVkVGVzdE5vZGU7Ci0KLS8qKgotICogYW4gZXhhbXBsZSBVSSBmb3IgdGVzdGluZyB0aGUgVHJlZU1vZGVsQWRhcHRlcgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUcmVlTW9kZWxBZGFwdGVyVUlUZXN0IHsKLQotCS8vIGhvbGQgdGhlIHRyZWUgc28gd2UgY2FuIHJlc3RvcmUgaXRzIGV4cGFuc2lvbiBzdGF0ZQotCXByaXZhdGUgSlRyZWUgdHJlZTsKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IHJvb3ROb2RlSG9sZGVyOwotCXByaXZhdGUgYm9vbGVhbiBzb3J0ZWQ7Ci0JcHJpdmF0ZSBUcmVlTW9kZWwgdHJlZU1vZGVsOwotCXByaXZhdGUgVHJlZVNlbGVjdGlvbk1vZGVsIHRyZWVTZWxlY3Rpb25Nb2RlbDsKLQlwcml2YXRlIFRleHRGaWVsZCBuYW1lVGV4dEZpZWxkOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBUcmVlTW9kZWxBZGFwdGVyVUlUZXN0KCkuZXhlYygpOwotCX0KLQotCXByaXZhdGUgVHJlZU1vZGVsQWRhcHRlclVJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlYygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnJvb3ROb2RlSG9sZGVyID0gdGhpcy5idWlsZFJvb3ROb2RlSG9sZGVyKCk7Ci0JCXRoaXMuc29ydGVkID0gdGhpcy5yb290Tm9kZUhvbGRlci5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgU29ydGVkVGVzdE5vZGU7Ci0JCXRoaXMudHJlZU1vZGVsID0gdGhpcy5idWlsZFRyZWVNb2RlbCgpOwotCQl0aGlzLnRyZWVTZWxlY3Rpb25Nb2RlbCA9IHRoaXMuYnVpbGRUcmVlU2VsZWN0aW9uTW9kZWwoKTsKLQkJdGhpcy5uYW1lVGV4dEZpZWxkID0gbmV3IFRleHRGaWVsZCgpOwotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGJ1aWxkUm9vdE5vZGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+Pih0aGlzLmJ1aWxkU29ydGVkUm9vdE5vZGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0Tm9kZSBidWlsZFNvcnRlZFJvb3ROb2RlKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZFRlc3ROb2RlKHRoaXMuYnVpbGRSb290KCkpOwotCX0KLQotCXByaXZhdGUgVGVzdE5vZGUgYnVpbGRVbnNvcnRlZFJvb3ROb2RlKCkgewotCQlyZXR1cm4gbmV3IFVuc29ydGVkVGVzdE5vZGUodGhpcy5idWlsZFJvb3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgYnVpbGRSb290KCkgewotCQlUZXN0TW9kZWwgcm9vdCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQotCQlUZXN0TW9kZWwgbm9kZV8xID0gcm9vdC5hZGRDaGlsZCgibm9kZSAxIik7Ci0JCS8qTm9kZSBub2RlXzFfMSA9ICovbm9kZV8xLmFkZENoaWxkKCJub2RlIDEuMSIpOwotCi0JCVRlc3RNb2RlbCBub2RlXzIgPSByb290LmFkZENoaWxkKCJub2RlIDIiKTsKLQkJLypOb2RlIG5vZGVfMl8xID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi4xIik7Ci0JCVRlc3RNb2RlbCBub2RlXzJfMiA9IG5vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjIiKTsKLQkJLypOb2RlIG5vZGVfMl8yXzEgPSAqL25vZGVfMl8yLmFkZENoaWxkKCJub2RlIDIuMi4xIik7Ci0JCS8qTm9kZSBub2RlXzJfMl8yID0gKi9ub2RlXzJfMi5hZGRDaGlsZCgibm9kZSAyLjIuMiIpOwotCQkvKk5vZGUgbm9kZV8yXzMgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjMiKTsKLQkJLypOb2RlIG5vZGVfMl80ID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi40Iik7Ci0JCS8qTm9kZSBub2RlXzJfNSA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuNSIpOwotCi0JCVRlc3RNb2RlbCBub2RlXzMgPSByb290LmFkZENoaWxkKCJub2RlIDMiKTsKLQkJVGVzdE1vZGVsIG5vZGVfM18xID0gbm9kZV8zLmFkZENoaWxkKCJub2RlIDMuMSIpOwotCQlUZXN0TW9kZWwgbm9kZV8zXzFfMSA9IG5vZGVfM18xLmFkZENoaWxkKCJub2RlIDMuMS4xIik7Ci0JCS8qTm9kZSBub2RlXzNfMV8xXzEgPSAqL25vZGVfM18xXzEuYWRkQ2hpbGQoIm5vZGUgMy4xLjEuMSIpOwotCi0JCS8qTm9kZSBub2RlXzQgPSAqL3Jvb3QuYWRkQ2hpbGQoIm5vZGUgNCIpOwotCi0JCXJldHVybiByb290OwotCX0KLQotCXByaXZhdGUgVHJlZU1vZGVsIGJ1aWxkVHJlZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFRyZWVNb2RlbEFkYXB0ZXI8T2JqZWN0Pih0aGlzLnJvb3ROb2RlSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVTZWxlY3Rpb25Nb2RlbCBidWlsZFRyZWVTZWxlY3Rpb25Nb2RlbCgpIHsKLQkJVHJlZVNlbGVjdGlvbk1vZGVsIHRzbSA9IG5ldyBEZWZhdWx0VHJlZVNlbGVjdGlvbk1vZGVsKCk7Ci0JCXRzbS5hZGRUcmVlU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZFRyZWVTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJdHNtLnNldFNlbGVjdGlvbk1vZGUoVHJlZVNlbGVjdGlvbk1vZGVsLlNJTkdMRV9UUkVFX1NFTEVDVElPTik7Ci0JCXJldHVybiB0c207Ci0JfQotCi0JcHJpdmF0ZSBUcmVlU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRUcmVlU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJlZVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKFRyZWVTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnRyZWVTZWxlY3Rpb25DaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgdHJlZVNlbGVjdGlvbkNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFRyZWVTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCVRlc3RNb2RlbCBzZWxlY3RlZFRlc3RNb2RlbCA9IHRoaXMuc2VsZWN0ZWRUZXN0TW9kZWwoKTsKLQkJaWYgKHNlbGVjdGVkVGVzdE1vZGVsICE9IG51bGwpIHsKLQkJCXRoaXMubmFtZVRleHRGaWVsZC5zZXRUZXh0KHNlbGVjdGVkVGVzdE1vZGVsLmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbldpbmRvdygpIHsKLQkJSkZyYW1lIHdpbmRvdyA9IG5ldyBKRnJhbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCXdpbmRvdy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOwotCQl3aW5kb3cuYWRkV2luZG93TGlzdGVuZXIodGhpcy5idWlsZFdpbmRvd0xpc3RlbmVyKCkpOwotCQl3aW5kb3cuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5idWlsZE1haW5QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCXdpbmRvdy5zZXRMb2NhdGlvbigzMDAsIDMwMCk7Ci0JCXdpbmRvdy5zZXRTaXplKDQwMCwgNDAwKTsKLQkJd2luZG93LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciBidWlsZFdpbmRvd0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCWUuZ2V0V2luZG93KCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRNYWluUGFuZWwoKSB7Ci0JCUpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZFRyZWVQYW5lKCksIEJvcmRlckxheW91dC5DRU5URVIpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDb250cm9sUGFuZWwoKSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFRyZWVQYW5lKCkgewotCQlyZXR1cm4gbmV3IEpTY3JvbGxQYW5lKHRoaXMuYnVpbGRUcmVlKCkpOwotCX0KLQotCXByaXZhdGUgSlRyZWUgYnVpbGRUcmVlKCkgewotCQl0aGlzLnRyZWUgPSBuZXcgSlRyZWUodGhpcy50cmVlTW9kZWwpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VmFsdWVUb1RleHQoT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGV4cGFuZGVkLCBib29sZWFuIGxlYWYsIGludCByb3csIGJvb2xlYW4gaGFzRm9jdXMpIHsKLQkJCQlyZXR1cm4gKChEaXNwbGF5YWJsZSkgdmFsdWUpLmRpc3BsYXlTdHJpbmcoKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy50cmVlLnNldFNlbGVjdGlvbk1vZGVsKHRoaXMudHJlZVNlbGVjdGlvbk1vZGVsKTsKLQkJdGhpcy50cmVlLnNldFJvb3RWaXNpYmxlKHRydWUpOwotCQl0aGlzLnRyZWUuc2V0U2hvd3NSb290SGFuZGxlcyh0cnVlKTsKLQkJdGhpcy50cmVlLnNldFJvd0hlaWdodCgyMCk7Ci0JCXRoaXMudHJlZS5zZXREb3VibGVCdWZmZXJlZCh0cnVlKTsKLQkJcmV0dXJuIHRoaXMudHJlZTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMCwgMSkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRBZGRSZW5hbWVOb2RlUGFuZWwoKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZE1pc2NQYW5lbCgpKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZEFkZFJlbmFtZU5vZGVQYW5lbCgpIHsKLQkJSlBhbmVsIGFkZFJlbmFtZU5vZGVQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJYWRkUmVuYW1lTm9kZVBhbmVsLmFkZCh0aGlzLmJ1aWxkQWRkQnV0dG9uKCksIEJvcmRlckxheW91dC5XRVNUKTsKLQkJYWRkUmVuYW1lTm9kZVBhbmVsLmFkZCh0aGlzLm5hbWVUZXh0RmllbGQsIEJvcmRlckxheW91dC5DRU5URVIpOwotCQlhZGRSZW5hbWVOb2RlUGFuZWwuYWRkKHRoaXMuYnVpbGRSZW5hbWVCdXR0b24oKSwgQm9yZGVyTGF5b3V0LkVBU1QpOwotCQlyZXR1cm4gYWRkUmVuYW1lTm9kZVBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTWlzY1BhbmVsKCkgewotCQlKUGFuZWwgbWlzY1BhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCW1pc2NQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyQ2hpbGRyZW5CdXR0b24oKSk7Ci0JCW1pc2NQYW5lbC5hZGQodGhpcy5idWlsZFJlbW92ZUJ1dHRvbigpKTsKLQkJbWlzY1BhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzZXRCdXR0b24oKSk7Ci0JCXJldHVybiBtaXNjUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZVRleHRGaWVsZC5nZXRUZXh0KCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQlwcml2YXRlIFRlc3ROb2RlIHNlbGVjdGVkTm9kZSgpIHsKLQkJaWYgKHRoaXMudHJlZVNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0aW9uRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChUZXN0Tm9kZSkgdGhpcy50cmVlU2VsZWN0aW9uTW9kZWwuZ2V0U2VsZWN0aW9uUGF0aCgpLmdldExhc3RQYXRoQ29tcG9uZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgc2VsZWN0ZWRUZXN0TW9kZWwoKSB7Ci0JCWlmICh0aGlzLnRyZWVTZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGlvbkVtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLnNlbGVjdGVkTm9kZSgpLmdldFZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0Tm9kZSByb290Tm9kZSgpIHsKLQkJcmV0dXJuIChUZXN0Tm9kZSkgdGhpcy50cmVlTW9kZWwuZ2V0Um9vdCgpOwotCX0KLQotCXByaXZhdGUgVGVzdE1vZGVsIHJvb3QoKSB7Ci0JCXJldHVybiB0aGlzLnJvb3ROb2RlKCkuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248VHJlZVBhdGg+IGV4cGFuZGVkUGF0aHMoKSB7Ci0JCUVudW1lcmF0aW9uPFRyZWVQYXRoPiBzdHJlYW0gPSB0aGlzLnRyZWUuZ2V0RXhwYW5kZWREZXNjZW5kYW50cyhuZXcgVHJlZVBhdGgodGhpcy5yb290Tm9kZSgpKSk7Ci0JCWlmIChzdHJlYW0gPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubGlzdChuZXcgRW51bWVyYXRpb25JdGVyYXRvcjxUcmVlUGF0aD4oc3RyZWFtKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkTm9kZShUZXN0Tm9kZSBzZWxlY3RlZE5vZGUpIHsKLQkJdGhpcy50cmVlU2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0aW9uUGF0aChuZXcgVHJlZVBhdGgoc2VsZWN0ZWROb2RlLnBhdGgoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleHBhbmRQYXRocyhDb2xsZWN0aW9uPFRyZWVQYXRoPiBwYXRocykgewotCQlmb3IgKFRyZWVQYXRoIHBhdGggOiBwYXRocykgewotCQkJdGhpcy50cmVlLmV4cGFuZFBhdGgocGF0aCk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGFkZCAqKioqKioqKioqCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQWRkQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZEFkZEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZEFkZEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiYWRkIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmFkZE5vZGUoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JLyoqCi0JICogYWRkaW5nIGNhdXNlcyB0aGUgdHJlZSB0byBiZSBzb3J0ZWQgYW5kIG5vZGVzIHRvIGJlCi0JICogcmVtb3ZlZCBhbmQgcmUtYWRkZWQ7IHNvIHdlIGhhdmUgdG8gZmlkZGxlIHdpdGggdGhlIGV4cGFuc2lvbiBzdGF0ZQotCSAqLwotCXZvaWQgYWRkTm9kZSgpIHsKLQkJVGVzdE1vZGVsIHNlbGVjdGVkVGVzdE1vZGVsID0gdGhpcy5zZWxlY3RlZFRlc3RNb2RlbCgpOwotCQlpZiAoc2VsZWN0ZWRUZXN0TW9kZWwgIT0gbnVsbCkgewotCQkJU3RyaW5nIG5hbWUgPSB0aGlzLmdldE5hbWUoKTsKLQkJCS8vIHNhdmUgdGhlIGV4cGFuc2lvbiBzdGF0ZSBhbmQgcmVzdG9yZSBpdCBhZnRlciB0aGUgYWRkCi0JCQlDb2xsZWN0aW9uPFRyZWVQYXRoPiBwYXRocyA9IHRoaXMuZXhwYW5kZWRQYXRocygpOwotCi0JCQlzZWxlY3RlZFRlc3RNb2RlbC5hZGRDaGlsZChuYW1lKTsKLQotCQkJdGhpcy5leHBhbmRQYXRocyhwYXRocyk7Ci0JCQl0aGlzLnNldFNlbGVjdGVkTm9kZSh0aGlzLnNlbGVjdGVkTm9kZSgpLmNoaWxkTmFtZWQobmFtZSkpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlbW92ZUJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZW1vdmVBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZW1vdmVBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlbW92ZSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZW1vdmVOb2RlKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCS8qKgotCSAqIHdlIG5lZWQgdG8gZmlndXJlIG91dCB3aGljaCBub2RlIHRvIHNlbGVjdCBhZnRlcgotCSAqIHRoZSBzZWxlY3RlZCBub2RlIGlzIGRlbGV0ZWQKLQkgKi8KLQl2b2lkIHJlbW92ZU5vZGUoKSB7Ci0JCVRlc3RNb2RlbCBzZWxlY3RlZFRlc3RNb2RlbCA9IHRoaXMuc2VsZWN0ZWRUZXN0TW9kZWwoKTsKLQkJLy8gZG8gbm90IGFsbG93IHRoZSByb290IHRvIGJlIHJlbW92ZWQKLQkJaWYgKChzZWxlY3RlZFRlc3RNb2RlbCAhPSBudWxsKSAmJiAoc2VsZWN0ZWRUZXN0TW9kZWwgIT0gdGhpcy5yb290KCkpKSB7Ci0JCQkvLyBzYXZlIHRoZSBwYXJlbnQgYW5kIGluZGV4LCBzbyB3ZSBjYW4gc2VsZWN0IGFub3RoZXIsIG5lYXJieSwgbm9kZQotCQkJLy8gb25jZSB0aGUgc2VsZWN0ZWQgbm9kZSBpcyByZW1vdmVkCi0JCQlUZXN0Tm9kZSBwYXJlbnROb2RlID0gKFRlc3ROb2RlKSB0aGlzLnNlbGVjdGVkTm9kZSgpLnBhcmVudCgpOwotCQkJaW50IGNoaWxkSW5kZXggPSBwYXJlbnROb2RlLmluZGV4T2ZDaGlsZCh0aGlzLnNlbGVjdGVkTm9kZSgpKTsKLQotCQkJc2VsZWN0ZWRUZXN0TW9kZWwuZ2V0UGFyZW50KCkucmVtb3ZlQ2hpbGQoc2VsZWN0ZWRUZXN0TW9kZWwpOwotCi0JCQlpbnQgY2hpbGRyZW5TaXplID0gcGFyZW50Tm9kZS5jaGlsZHJlblNpemUoKTsKLQkJCWlmIChjaGlsZEluZGV4IDwgY2hpbGRyZW5TaXplKSB7Ci0JCQkJLy8gc2VsZWN0IHRoZSBjaGlsZCB0aGF0IG1vdmVkIHVwIGFuZCByZXBsYWNlZCB0aGUganVzdC1kZWxldGVkIGNoaWxkCi0JCQkJdGhpcy5zZXRTZWxlY3RlZE5vZGUoKFRlc3ROb2RlKSBwYXJlbnROb2RlLmNoaWxkKGNoaWxkSW5kZXgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGNoaWxkcmVuU2l6ZSA9PSAwKSB7Ci0JCQkJCS8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIGNoaWxkcmVuLCBzZWxlY3QgdGhlIHBhcmVudAotCQkJCQl0aGlzLnNldFNlbGVjdGVkTm9kZShwYXJlbnROb2RlKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBpZiB0aGUgY2hpbGQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgbGlzdCB3YXMgZGVsZXRlZCwgc2VsZWN0IHRoZSBuZXh0IGNoaWxkIHVwCi0JCQkJCXRoaXMuc2V0U2VsZWN0ZWROb2RlKChUZXN0Tm9kZSkgcGFyZW50Tm9kZS5jaGlsZChjaGlsZEluZGV4IC0gMSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogcmVuYW1lICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZW5hbWVCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVuYW1lQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVuYW1lQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZW5hbWUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVuYW1lTm9kZSgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiByZW5hbWluZyBjYXVzZXMgdGhlIHRyZWUgdG8gYmUgc29ydGVkIGFuZCBub2RlcyB0byBiZQotCSAqIHJlbW92ZWQgYW5kIHJlLWFkZGVkOyBzbyB3ZSBoYXZlIHRvIGZpZGRsZSB3aXRoIHRoZSBleHBhbnNpb24gc3RhdGUKLQkgKi8KLQl2b2lkIHJlbmFtZU5vZGUoKSB7Ci0JCVRlc3RNb2RlbCBzZWxlY3RlZFRlc3RNb2RlbCA9IHRoaXMuc2VsZWN0ZWRUZXN0TW9kZWwoKTsKLQkJaWYgKHNlbGVjdGVkVGVzdE1vZGVsICE9IG51bGwpIHsKLQkJCS8vIHNhdmUgdGhlIG5vZGUgYW5kIHJlLXNlbGVjdCBpdCBhZnRlciB0aGUgcmVuYW1lCi0JCQlUZXN0Tm9kZSBzZWxlY3RlZE5vZGUgPSB0aGlzLnNlbGVjdGVkTm9kZSgpOwotCQkJLy8gc2F2ZSB0aGUgZXhwYW5zaW9uIHN0YXRlIGFuZCByZXN0b3JlIGl0IGFmdGVyIHRoZSByZW5hbWUKLQkJCUNvbGxlY3Rpb248VHJlZVBhdGg+IHBhdGhzID0gdGhpcy5leHBhbmRlZFBhdGhzKCk7Ci0KLQkJCXNlbGVjdGVkVGVzdE1vZGVsLnNldE5hbWUodGhpcy5nZXROYW1lKCkpOwotCi0JCQl0aGlzLmV4cGFuZFBhdGhzKHBhdGhzKTsKLQkJCXRoaXMuc2V0U2VsZWN0ZWROb2RlKHNlbGVjdGVkTm9kZSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGNsZWFyIGNoaWxkcmVuICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRDbGVhckNoaWxkcmVuQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZENsZWFyQ2hpbGRyZW5BY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRDbGVhckNoaWxkcmVuQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJjbGVhciBjaGlsZHJlbiIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhckNoaWxkcmVuKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCS8qKgotCSAqIG5vdGhpbmcgc3BlY2lhbCwgd2UganVzdCB3YW50IHRvIHRlc3QgI2ZpcmVDb2xsZWN0aW9uQ2hhbmdlZChTdHJpbmcpCi0JICovCi0Jdm9pZCBjbGVhckNoaWxkcmVuKCkgewotCQlUZXN0TW9kZWwgc2VsZWN0ZWRUZXN0TW9kZWwgPSB0aGlzLnNlbGVjdGVkVGVzdE1vZGVsKCk7Ci0JCWlmIChzZWxlY3RlZFRlc3RNb2RlbCAhPSBudWxsKSB7Ci0JCQlzZWxlY3RlZFRlc3RNb2RlbC5jbGVhckNoaWxkcmVuKCk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlc2V0ICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXNldEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXNldEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc2V0QWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXNldCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXNldCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IHRoZSBhZGFwdGVyJ3Mgcm9vdCBub2RlIGhvbGRlcjsKLQkgKiB0b2dnbGUgYmV0d2VlbiBzb3J0ZWQgYW5kIHVuc29ydGVkIGxpc3RzCi0JICovCi0Jdm9pZCByZXNldCgpIHsKLQkJdGhpcy5zb3J0ZWQgPSAhIHRoaXMuc29ydGVkOwotCQlpZiAodGhpcy5zb3J0ZWQpIHsKLQkJCXRoaXMucm9vdE5vZGVIb2xkZXIuc2V0VmFsdWUodGhpcy5idWlsZFNvcnRlZFJvb3ROb2RlKCkpOwotCQl9IGVsc2UgewotCQkJdGhpcy5yb290Tm9kZUhvbGRlci5zZXRWYWx1ZSh0aGlzLmJ1aWxkVW5zb3J0ZWRSb290Tm9kZSgpKTsKLQkJfQotCQl0aGlzLnRyZWUuZXhwYW5kUGF0aChuZXcgVHJlZVBhdGgodGhpcy5yb290Tm9kZSgpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbm9kZS9BYnN0cmFjdE5vZGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL25vZGUvQWJzdHJhY3ROb2RlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRjZDYyOS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbm9kZS9BYnN0cmFjdE5vZGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm5vZGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZS5BYnN0cmFjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Qcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEFic3RyYWN0Tm9kZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgVGVzdFdvcmtiZW5jaE1vZGVsIHJvb3Q7Ci0KLQlwdWJsaWMgQWJzdHJhY3ROb2RlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5yb290ID0gdGhpcy5idWlsZFJvb3QoKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3RXb3JrYmVuY2hNb2RlbCBidWlsZFJvb3QoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCByID0gbmV3IFJvb3RUZXN0V29ya2JlbmNoTW9kZWwoInJvb3QiKTsKLQkJCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlMSA9IHIuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMSIpOwotCQkJCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlMV8xID0gbm9kZTEuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMS4xIik7Ci0JCQkJCW5vZGUxXzEuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMS4xLjEiKTsKLQkJCQkJbm9kZTFfMS5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAxLjEuMiIpOwotCQkJCQlub2RlMV8xLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCQkJbm9kZTEuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMS4yIik7Ci0JCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZTIgPSByLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDIiKTsKLQkJCQlub2RlMi5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAyLjEiKTsKLQkJCQlub2RlMi5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAyLjIiKTsKLQkJCXIuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMyIpOwotCQkJci5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSA0Iik7Ci0KLQkJLy8gbWFyayB0aGUgZW50aXJlIHRyZWUgY2xlYW4KLQkJci5tYXJrRW50aXJlQnJhbmNoQ2xlYW4oKTsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUZXN0V29ya2JlbmNoTW9kZWwoKSB7Ci0JCS8vIG1ha2Ugc3VyZSBvdXIgdGVzdCBjbGFzcyB3b3JrcyBPSy4uLgotCQlhc3NlcnROdWxsKHRoaXMucm9vdC50ZXN0Q2hpbGROYW1lZCgiIikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMucm9vdC50ZXN0Q2hpbGROYW1lZCgibm9kZSAxIikpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC50ZXN0Q2hpbGROYW1lZCgibm9kZSAxIikuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QudGVzdENoaWxkTmFtZWQoIm5vZGUgMSIpLmlzQ2xlYW5CcmFuY2goKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5yb290LnRlc3RDaGlsZE5hbWVkKCJub2RlIDIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LnRlc3RDaGlsZE5hbWVkKCJub2RlIDIiKS5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC50ZXN0Q2hpbGROYW1lZCgibm9kZSAyIikuaXNDbGVhbkJyYW5jaCgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnJvb3QudGVzdENoaWxkTmFtZWQoIm5vZGUgMi4xIikpOwotCi0JCWFzc2VydE51bGwodGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxIikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMi4xIikpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDIuMSIpLmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMi4xIikuaXNDbGVhbkJyYW5jaCgpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpLmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKS5pc0NsZWFuQnJhbmNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYXJlbnRBbmRDaGlsZHJlbigpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlhc3NlcnRFcXVhbHMoIm5vZGUgMS4xLjMiLCBub2RlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShub2RlLmNoaWxkcmVuKCkpKTsKLQotCQlub2RlID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJub2RlIDEuMSIsIG5vZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKG5vZGUuY2hpbGRyZW4oKSkpOwotCi0JCW5vZGUgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlhc3NlcnRFcXVhbHMoIm5vZGUgMSIsIG5vZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKG5vZGUuY2hpbGRyZW4oKSkpOwotCi0JCW5vZGUgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlhc3NlcnRFcXVhbHMoInJvb3QiLCBub2RlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShub2RlLmNoaWxkcmVuKCkpKTsKLQotCQlub2RlID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0TnVsbChub2RlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlydHkoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJbm9kZS5zZXRTaXplKDQyKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmlzRGlydHkoKSk7Ci0KLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW4oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcnR5VW5jaGFuZ2VkQXR0cmlidXRlKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0U2l6ZSg0Mik7Ci0JCWFzc2VydFRydWUobm9kZS5pc0RpcnR5KCkpOwotCi0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0NsZWFuKCkpOwotCi0JCXRoaXMucm9vdC5tYXJrRW50aXJlQnJhbmNoQ2xlYW4oKTsKLQkJLy8gc2V0IHNpemUgdG8gc2FtZSBudW1iZXIgLSBzaG91bGQgc3RheSBjbGVhbgotCQlub2RlLnNldFNpemUoNDIpOwotCQlhc3NlcnRUcnVlKG5vZGUuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNDbGVhbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlydHlCcmFuY2goKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJbm9kZS5zZXRTaXplKDQyKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmlzRGlydHlCcmFuY2goKSk7Ci0KLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzRGlydHlCcmFuY2goKSk7Ci0KLQkJcGFyZW50LnNldFNpemUoNzcpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5KCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5QnJhbmNoKCkpOwotCi0JCW5vZGUubWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHkoKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcnR5QnJhbmNoQ2xlYW5DaGlsZERpcnR5UGFyZW50KCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0U2l6ZSg0Mik7Ci0KLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCXBhcmVudC5zZXRTaXplKDc3KTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eUJyYW5jaCgpKTsKLQotCQkvLyBub3csIGNsZWFuIHRoZSBjaGlsZCwgYnV0IGxlYXZlIHRoZSBwYXJlbnQgZGlydHkKLQkJbm9kZS5tYXJrRW50aXJlQnJhbmNoQ2xlYW4oKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eUJyYW5jaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlydHlCcmFuY2hDbGVhbkNoaWxkRGlydHlDaGlsZCgpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUxID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjEiKTsKLQkJbm9kZTEuc2V0U2l6ZSg0MSk7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlMiA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4yIik7Ci0JCW5vZGUyLnNldFNpemUoNDIpOwotCi0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlMS5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eUJyYW5jaCgpKTsKLQotCQkvLyBub3csIGNsZWFuIHRoZSBmaXJzdCBjaGlsZCwgYnV0IGxlYXZlIHRoZSBzZWNvbmQgY2hpbGQgZGlydHkKLQkJbm9kZTEubWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcnR5QnJhbmNoRm9yY2VkKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCi0JCWFzc2VydFRydWUobm9kZS5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKG5vZGUuaXNDbGVhbkJyYW5jaCgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNDbGVhbkJyYW5jaCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNDbGVhbkJyYW5jaCgpKTsKLQotCQl0aGlzLnJvb3QubWFya0VudGlyZUJyYW5jaERpcnR5KCk7Ci0KLQkJYXNzZXJ0VHJ1ZShub2RlLmlzRGlydHkoKSk7Ci0JCWFzc2VydFRydWUobm9kZS5pc0RpcnR5QnJhbmNoKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5KCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5QnJhbmNoKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0RpcnR5KCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0RpcnR5QnJhbmNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJ0eVRyYW5zaWVudEF0dHJpYnV0ZSgpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlub2RlLnNldE5hbWUoIkJPR1VTIik7Ci0JCWFzc2VydFRydWUobm9kZS5pc0RpcnR5KCkpOwotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eUJyYW5jaCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNEaXJ0eUJyYW5jaCgpKTsKLQotCQl0aGlzLnJvb3QubWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0KLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QucHJvYmxlbXNTaXplKCkgPT0gMCk7Ci0JCWFzc2VydFRydWUobm9kZS5icmFuY2hQcm9ibGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LnByb2JsZW1zU2l6ZSgpID09IDApOwotCQlhc3NlcnRUcnVlKHBhcmVudC5icmFuY2hQcm9ibGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUobm9kZS5wcm9ibGVtc1NpemUoKSA+IDApOwotCi0JCS8vIHNpbmNlIHByb2JsZW1zIGFyZSB0cmFuc2llbnQsIGV2ZXJ5dGhpbmcgc2hvdWxkIHN0aWxsIGJlIGNsZWFuCi0JCWFzc2VydFRydWUobm9kZS5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKG5vZGUuaXNDbGVhbkJyYW5jaCgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNDbGVhbkJyYW5jaCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNDbGVhbkJyYW5jaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvYmxlbXMoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJbm9kZS5zZXROYW1lKCJCT0dVUyIpOwotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQotCQl0aGlzLnJvb3QudmFsaWRhdGVCcmFuY2goKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmJyYW5jaFByb2JsZW1zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBhcmVudC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmJyYW5jaFByb2JsZW1zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5vZGUucHJvYmxlbXNTaXplKCkpOwotCQlQcm9ibGVtIHByb2JsZW0xID0gbm9kZS5wcm9ibGVtcygpLm5leHQoKTsKLQotCQkvLyBub3cgY3JlYXRlIGFub3RoZXIgcHJvYmxlbSB0aGF0IHNob3VsZCByZW1vdmUgdGhlIG9sZCBwcm9ibGVtCi0JCW5vZGUuc2V0TmFtZSgiU1RJTEwgQk9HVVMiKTsKLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydFRydWUobm9kZS5icmFuY2hQcm9ibGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5icmFuY2hQcm9ibGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBub2RlLnByb2JsZW1zU2l6ZSgpKTsKLQkJUHJvYmxlbSBwcm9ibGVtMiA9IG5vZGUucHJvYmxlbXMoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHByb2JsZW0xID09IHByb2JsZW0yKTsKLQkJcHJvYmxlbTEgPSBwcm9ibGVtMjsKLQotCQkvLyBub3cgY3JlYXRlIGFub3RoZXIgcHJvYmxlbSB0aGF0IHNob3VsZCByZXBsYWNlIHRoZSBvbGQgcHJvYmxlbQotCQlub2RlLnNldE5hbWUoIlNUSUxMIEJPR1VTIik7Ci0JCXRoaXMucm9vdC52YWxpZGF0ZUJyYW5jaCgpOwotCi0JCWFzc2VydEVxdWFscygwLCB0aGlzLnJvb3QucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKG5vZGUuYnJhbmNoUHJvYmxlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuYnJhbmNoUHJvYmxlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbm9kZS5wcm9ibGVtc1NpemUoKSk7Ci0JCXByb2JsZW0yID0gbm9kZS5wcm9ibGVtcygpLm5leHQoKTsKLQkJLy8gdGhlIHNhbWUgcHJvYmxlbSBzaG91bGQgYmUgdGhlcmUKLQkJYXNzZXJ0VHJ1ZShwcm9ibGVtMS5lcXVhbHMocHJvYmxlbTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnJhbmNoUHJvYmxlbXMoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJbm9kZS5zZXROYW1lKCJCT0dVUyIpOwotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJcGFyZW50LnNldE5hbWUoIkJPR1VTIFRPTyIpOwotCQl0aGlzLnJvb3Quc2V0TmFtZSgiQk9HVVMgVE9PIFRPTyIpOwotCi0JCXRoaXMucm9vdC52YWxpZGF0ZUJyYW5jaCgpOwotCi0JCWFzc2VydEVxdWFscygxLCB0aGlzLnJvb3QucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5yb290LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHBhcmVudC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBwYXJlbnQuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbm9kZS5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBub2RlLmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQotCQlub2RlLnNldE5hbWUoIm9raWUtZG9raWUiKTsKLQotCQl0aGlzLnJvb3QudmFsaWRhdGVCcmFuY2goKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMucm9vdC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGFyZW50LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG5vZGUucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbm9kZS5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsZWFyQWxsQnJhbmNoUHJvYmxlbXMoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJbm9kZS5zZXROYW1lKCJCT0dVUyIpOwotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJcGFyZW50LnNldE5hbWUoIkJPR1VTIFRPTyIpOwotCQl0aGlzLnJvb3Quc2V0TmFtZSgiQk9HVVMgVE9PIFRPTyIpOwotCi0JCXRoaXMucm9vdC52YWxpZGF0ZUJyYW5jaCgpOwotCi0JCWFzc2VydEVxdWFscygxLCB0aGlzLnJvb3QucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5yb290LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHBhcmVudC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBwYXJlbnQuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbm9kZS5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBub2RlLmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQotCQlwYXJlbnQuY2xlYXJBbGxCcmFuY2hQcm9ibGVtcygpOwotCi0JCWFzc2VydEVxdWFscygxLCB0aGlzLnJvb3QucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5yb290LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBhcmVudC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwYXJlbnQuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbm9kZS5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShub2RlLmJyYW5jaFByb2JsZW1zKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlZEJyYW5jaFByb2JsZW1zKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0TmFtZSgiQk9HVVMiKTsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCXBhcmVudC5zZXROYW1lKCJCT0dVUyBUT08iKTsKLQkJdGhpcy5yb290LnNldE5hbWUoIkJPR1VTIFRPTyBUT08iKTsKLQotCQl0aGlzLnJvb3QudmFsaWRhdGVCcmFuY2goKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMucm9vdC5icmFuY2hQcm9ibGVtcygpKSk7Ci0JCWFzc2VydEVxdWFscygxLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcGFyZW50LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5vZGUucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUobm9kZS5icmFuY2hQcm9ibGVtcygpKSk7Ci0KLQkJLy8gY29tcGxldGVseSByZW1vdmUgYSBub2RlIHRoYXQgaGFzIHByb2JsZW1zIC0KLQkJLy8gdGhlIGVudGlyZSB0cmVlIHNob3VsZCByZWNhbGN1bGF0ZSBpdHMgImJyYW5jaCIgcHJvYmxlbXMKLQkJcGFyZW50LnJlbW92ZVRlc3RDaGlsZChub2RlKTsKLQotCQl0aGlzLnJvb3QudmFsaWRhdGVCcmFuY2goKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMucm9vdC5icmFuY2hQcm9ibGVtcygpKSk7Ci0JCWFzc2VydEVxdWFscygxLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGFyZW50LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgY2xhc3MgVGVzdFdvcmtiZW5jaE1vZGVsIGV4dGVuZHMgQWJzdHJhY3ROb2RlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0JCXByaXZhdGUgaW50IHNpemU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSVpFX1BST1BFUlRZID0gInNpemUiOwotCQlwcml2YXRlIENvbGxlY3Rpb248VGVzdFdvcmtiZW5jaE1vZGVsPiB0ZXN0Q2hpbGRyZW47Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NISUxEUkVOX0NPTExFQ1RJT04gPSAiY2hpbGRyZW4iOwotCQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JCXB1YmxpYyBUZXN0V29ya2JlbmNoTW9kZWwoVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKHBhcmVudCk7Ci0JCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQkJdGhpcy5zaXplID0gMDsKLQkJCXRoaXMudGVzdENoaWxkcmVuID0gbmV3IEhhc2hCYWc8VGVzdFdvcmtiZW5jaE1vZGVsPigpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgY2hlY2tQYXJlbnQoTm9kZSBwYXJlbnQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQotCQotCQkvLyAqKioqKioqKioqIGFjY2Vzc29ycyAqKioqKioqKioqCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQotCQlwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5zaXplOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFNpemUoaW50IHNpemUpIHsKLQkJCWludCBvbGQgPSB0aGlzLnNpemU7Ci0JCQl0aGlzLnNpemUgPSBzaXplOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNJWkVfUFJPUEVSVFksIG9sZCwgc2l6ZSk7Ci0JCX0KLQkKLQkJcHVibGljIEl0ZXJhdG9yPFRlc3RXb3JrYmVuY2hNb2RlbD4gdGVzdENoaWxkcmVuKCkgewotCQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPFRlc3RXb3JrYmVuY2hNb2RlbD4odGhpcy50ZXN0Q2hpbGRyZW4pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoVGVzdFdvcmtiZW5jaE1vZGVsIGN1cnJlbnQpIHsKLQkJCQkJVGVzdFdvcmtiZW5jaE1vZGVsLnRoaXMucmVtb3ZlVGVzdENoaWxkKGN1cnJlbnQpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcHVibGljIGludCB0ZXN0Q2hpbGRyZW5TaXplKCkgewotCQkJcmV0dXJuIHRoaXMudGVzdENoaWxkcmVuLnNpemUoKTsKLQkJfQotCQlwcml2YXRlIFRlc3RXb3JrYmVuY2hNb2RlbCBhZGRUZXN0Q2hpbGQoVGVzdFdvcmtiZW5jaE1vZGVsIHRlc3RDaGlsZCkgewotCQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKHRlc3RDaGlsZCwgdGhpcy50ZXN0Q2hpbGRyZW4sIFRFU1RfQ0hJTERSRU5fQ09MTEVDVElPTik7Ci0JCQlyZXR1cm4gdGVzdENoaWxkOwotCQl9Ci0JCXB1YmxpYyBUZXN0V29ya2JlbmNoTW9kZWwgYWRkVGVzdENoaWxkTmFtZWQoU3RyaW5nIGNoaWxkTmFtZSkgewotCQkJaWYgKHRoaXMudGVzdENoaWxkTmFtZWQoY2hpbGROYW1lKSAhPSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjaGlsZE5hbWUpOwotCQkJfQotCQkJcmV0dXJuIHRoaXMuYWRkVGVzdENoaWxkKG5ldyBUZXN0V29ya2JlbmNoTW9kZWwodGhpcywgY2hpbGROYW1lKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlVGVzdENoaWxkKFRlc3RXb3JrYmVuY2hNb2RlbCB0ZXN0Q2hpbGQpIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKHRlc3RDaGlsZCwgdGhpcy50ZXN0Q2hpbGRyZW4sIFRFU1RfQ0hJTERSRU5fQ09MTEVDVElPTik7Ci0JCX0KLQkKLQkJLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgVGVzdFdvcmtiZW5jaE1vZGVsIHRlc3RDaGlsZE5hbWVkKFN0cmluZyBjaGlsZE5hbWUpIHsKLQkJCWZvciAoVGVzdFdvcmtiZW5jaE1vZGVsIHRlc3RDaGlsZCA6IHRoaXMudGVzdENoaWxkcmVuKSB7Ci0JCQkJaWYgKHRlc3RDaGlsZC5nZXROYW1lKCkuZXF1YWxzKGNoaWxkTmFtZSkpIHsKLQkJCQkJcmV0dXJuIHRlc3RDaGlsZDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlwdWJsaWMgVGVzdFdvcmtiZW5jaE1vZGVsIHRlc3REZXNjZW5kYW50TmFtZWQoU3RyaW5nIGRlc2NlbmRhbnROYW1lKSB7Ci0JCQlmb3IgKFRlc3RXb3JrYmVuY2hNb2RlbCB0ZXN0RGVzY2VuZGFudCA6IHRoaXMudGVzdENoaWxkcmVuKSB7Ci0JCQkJaWYgKHRlc3REZXNjZW5kYW50LmdldE5hbWUoKS5lcXVhbHMoZGVzY2VuZGFudE5hbWUpKSB7Ci0JCQkJCXJldHVybiB0ZXN0RGVzY2VuZGFudDsKLQkJCQl9Ci0JCQkJLy8gcmVjdXJzZS4uLgotCQkJCXRlc3REZXNjZW5kYW50ID0gdGVzdERlc2NlbmRhbnQudGVzdERlc2NlbmRhbnROYW1lZChkZXNjZW5kYW50TmFtZSk7Ci0JCQkJaWYgKHRlc3REZXNjZW5kYW50ICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHRlc3REZXNjZW5kYW50OwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCi0JCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRyZW5UbyhMaXN0PE5vZGU+IGNoaWxkcmVuKSB7Ci0JCQlzdXBlci5hZGRDaGlsZHJlblRvKGNoaWxkcmVuKTsKLQkJCWNoaWxkcmVuLmFkZEFsbCh0aGlzLnRlc3RDaGlsZHJlbik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGFkZFByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpIHsKLQkJCXN1cGVyLmFkZFByb2JsZW1zVG8oY3VycmVudFByb2JsZW1zKTsKLQkJCS8vIG5hbWVzIG11c3QgYmUgYWxsIGxvd2VyY2FzZS4uLgotCQkJZm9yIChpbnQgaSA9IHRoaXMubmFtZS5sZW5ndGgoKTsgaS0tID4gMDsgKSB7Ci0JCQkJY2hhciBjID0gdGhpcy5uYW1lLmNoYXJBdChpKTsKLQkJCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGMpICYmICEgQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGMpKSB7Ci0JCQkJCWN1cnJlbnRQcm9ibGVtcy5hZGQodGhpcy5idWlsZFByb2JsZW0oIk5BTUVfTVVTVF9CRV9MT1dFUkNBU0UiLCAzICx0aGlzLm5hbWUpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgUm9vdFRlc3RXb3JrYmVuY2hNb2RlbCBleHRlbmRzIFRlc3RXb3JrYmVuY2hNb2RlbCB7Ci0JCXB1YmxpYyBSb290VGVzdFdvcmtiZW5jaE1vZGVsKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihudWxsLCBuYW1lKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCQlyZXR1cm4gTm9kZS5OVUxMX1ZBTElEQVRPUjsKLQkJfQotCX0KLQotfQotCmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbm9kZS9KcHRVdGlsaXR5Tm9kZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbm9kZS9KcHRVdGlsaXR5Tm9kZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZjZkY2UuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL25vZGUvSnB0VXRpbGl0eU5vZGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5Tm9kZVRlc3RzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eU5vZGVUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFic3RyYWN0Tm9kZVRlc3RzLmNsYXNzKTsKLQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcml2YXRlIEpwdFV0aWxpdHlOb2RlVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL3N5bmNocm9uaXplcnMvSnB0VXRpbGl0eVN5bmNocm9uaXplcnNUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL3N5bmNocm9uaXplcnMvSnB0VXRpbGl0eVN5bmNocm9uaXplcnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTdhZDZmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0pwdFV0aWxpdHlTeW5jaHJvbml6ZXJzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLnN5bmNocm9uaXplcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlTeW5jaHJvbml6ZXJzVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFV0aWxpdHlTeW5jaHJvbml6ZXJzVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN5bmNocm9uaXplclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN5bmNocm9ub3VzU3luY2hyb25pemVyVGVzdHMuY2xhc3MpOwotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdFV0aWxpdHlTeW5jaHJvbml6ZXJzVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL1N5bmNocm9uaXplclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvc3luY2hyb25pemVycy9TeW5jaHJvbml6ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjdjNjdiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL1N5bmNocm9uaXplclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5zeW5jaHJvbml6ZXJzLlN5bmNocm9uaXplcjsKLQotcHVibGljIGNsYXNzIFN5bmNocm9uaXplclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFN5bmNocm9uaXplclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsU3luY2hyb25pemVyU3RhcnQoKSB7Ci0JCVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIgPSBTeW5jaHJvbml6ZXIuTnVsbC5pbnN0YW5jZSgpOwotCQlzeW5jaHJvbml6ZXIuc3RhcnQoKTsgIC8vIGp1c3QgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgYmxvdyB1cD8KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFN5bmNocm9uaXplclN5bmNocm9uaXplKCkgewotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gU3luY2hyb25pemVyLk51bGwuaW5zdGFuY2UoKTsKLQkJc3luY2hyb25pemVyLnN5bmNocm9uaXplKCk7ICAvLyBqdXN0IG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGJsb3cgdXA/Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxTeW5jaHJvbml6ZXJTdG9wKCkgewotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gU3luY2hyb25pemVyLk51bGwuaW5zdGFuY2UoKTsKLQkJc3luY2hyb25pemVyLnN0b3AoKTsgIC8vIGp1c3QgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgYmxvdyB1cD8KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFN5bmNocm9uaXplclRvU3RyaW5nKCkgewotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gU3luY2hyb25pemVyLk51bGwuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChzeW5jaHJvbml6ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvc3luY2hyb25pemVycy9TeW5jaHJvbm91c1N5bmNocm9uaXplclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvc3luY2hyb25pemVycy9TeW5jaHJvbm91c1N5bmNocm9uaXplclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZWMxNWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL3N5bmNocm9uaXplcnMvU3luY2hyb25vdXNTeW5jaHJvbml6ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLnN5bmNocm9uaXplcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db21wb3NpdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZEJvb2xlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN5bmNocm9uaXplcnMuU3luY2hyb25vdXNTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnMuU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5NdWx0aVRocmVhZGVkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3luY2hyb25vdXNTeW5jaHJvbml6ZXJUZXN0cwotCWV4dGVuZHMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi17Ci0JUHJpbWFyeU1vZGVsMSBwcmltYXJ5TW9kZWwxOwotCVNlY29uZGFyeU1vZGVsMSBzZWNvbmRhcnlNb2RlbDE7Ci0JQ29tbWFuZCBjb21tYW5kMTsKLQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyMTsKLQotCVByaW1hcnlNb2RlbDIgcHJpbWFyeU1vZGVsMjsKLQlTZWNvbmRhcnlNb2RlbDIgc2Vjb25kYXJ5TW9kZWwyOwotCUNvbW1hbmQgY29tbWFuZDI7Ci0JU3luY2hyb25pemVyIHN5bmNocm9uaXplcjI7Ci0KLQlwdWJsaWMgU3luY2hyb25vdXNTeW5jaHJvbml6ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEgPSBuZXcgUHJpbWFyeU1vZGVsMSgpOwotCQl0aGlzLnNlY29uZGFyeU1vZGVsMSA9IG5ldyBTZWNvbmRhcnlNb2RlbDEodGhpcy5wcmltYXJ5TW9kZWwxKTsKLQkJdGhpcy5jb21tYW5kMSA9IG5ldyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDEodGhpcy5zZWNvbmRhcnlNb2RlbDEpOwotCQl0aGlzLnN5bmNocm9uaXplcjEgPSBuZXcgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIodGhpcy5jb21tYW5kMSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRTeW5jaHJvbml6ZXIodGhpcy5zeW5jaHJvbml6ZXIxKTsKLQotCQl0aGlzLnByaW1hcnlNb2RlbDIgPSBuZXcgUHJpbWFyeU1vZGVsMigpOwotCQl0aGlzLnNlY29uZGFyeU1vZGVsMiA9IG5ldyBTZWNvbmRhcnlNb2RlbDIodGhpcy5wcmltYXJ5TW9kZWwyKTsKLQkJdGhpcy5jb21tYW5kMiA9IG5ldyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDIodGhpcy5wcmltYXJ5TW9kZWwyLCB0aGlzLnNlY29uZGFyeU1vZGVsMik7Ci0JCXRoaXMuc3luY2hyb25pemVyMiA9IG5ldyBTeW5jaHJvbm91c1N5bmNocm9uaXplcih0aGlzLmNvbW1hbmQyKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwyLnNldFN5bmNocm9uaXplcih0aGlzLnN5bmNocm9uaXplcjIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXphdGlvbigpIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnN5bmNocm9uaXplcjEudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0Q291bnQoNyk7Ci0JCWFzc2VydEVxdWFscygxNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YXJ0KCkgewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRTeW5jaHJvbml6ZXIoU3luY2hyb25pemVyLk51bGwuaW5zdGFuY2UoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRDb3VudCg3KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0U3luY2hyb25pemVyKHRoaXMuc3luY2hyb25pemVyMSk7Ci0JCWFzc2VydEVxdWFscygxNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0b3AoKSB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLmRpc3Bvc2UoKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldENvdW50KDcpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERvdWJsZVN0YXJ0KCkgewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMucHJpbWFyeU1vZGVsMS5zdGFydFN5bmNocm9uaXplcigpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldENvdW50KDcpOwotCQlhc3NlcnRFcXVhbHMoMTQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REb3VibGVTdG9wKCkgewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5kaXNwb3NlKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMucHJpbWFyeU1vZGVsMS5kaXNwb3NlKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0Q291bnQoNyk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVjdXJzaXZlQ2hhbmdlKCkgewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDIuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMi5zZXRDb3VudCg3KTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCB0aGlzLnByaW1hcnlNb2RlbDIuZ2V0Q291bnRQbHVzMygpKTsKLQkJYXNzZXJ0RXF1YWxzKDE0LCB0aGlzLnNlY29uZGFyeU1vZGVsMi5nZXREb3VibGVDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIwLCB0aGlzLnNlY29uZGFyeU1vZGVsMi5nZXREb3VibGVDb3VudFBsdXMzKCkpOwotCX0KLQotCS8qKgotCSAqIENhbGwgI3N0b3AoKSBmcm9tIGFub3RoZXIgdGhyZWFkLgotCSAqIFZlcmlmeSB0aGF0IG5vIGZ1cnRoZXIgc3luY2hyb25pemF0aW9ucyBvY2N1ci4KLQkgKiBWZXJpZnkgdGhlIGNhbGwgdG8gI3N0b3AoKSBkb2VzIG5vdCByZXR1cm4gdW50aWwgdGhlIHBlbmRpbmcKLQkgKiBzeW5jaHJvbml6YXRpb24gaXMgY29tcGxldGUgKG11c3Qgc2V0IHtAbGluayAjREVCVUd9IHRvIHRydWUgYW5kCi0JICogbG9vayBhdCB0aGUgY29uc29sZSkuCi0JICogCi0JICogdGlja3M6Ci0JICogMCAtIHN0YXJ0ICJzeW5jIiB0aHJlYWQgKHdoaWNoIHdpbGwgc2xlZXAgZm9yIDEgdGljayk7Ci0JICogICAgICBzdGFydCAic3RvcCIgdGhyZWFkICh3aGljaCB3aWxsIHNsZWVwIGZvciAyIHRpY2tzKQotCSAqIDEgLSAic3luYyIgdGhyZWFkIHdha2VzIHVwIGFuZCBjYWxscyBQcmltYXJ5TW9kZWwxLnNldENvdW50KGludCkKLQkgKiAgICAgIHdoaWNoIHRyaWdnZXJzIGNhbGwgdG8gU3luY2hyb25pemVyLnN5bmNocm9uaXplKCkgdG8gYmVnaW4KLQkgKiAgICAgIHN5bmNocm9uaXphdGlvbiBvZiBTZWNvbmRhcnlNb2RlbCAod2hpY2ggd2lsbCBydW4gZm9yIDIgdGlja3M7Ci0JICogICAgICBpLmUuIGl0IHdpbGwgZmluaXNoIG9uIHRpY2sgMykKLQkgKiAyIC0gInN0b3AiIHRocmVhZCB3YWtlcyB1cCBhbmQgY2FsbHMgU3luY2hyb25pemVyLnN0b3AoKSBhbmQgc2hvdWxkCi0JICogICAgICB3YWl0IHVudGlsIHN5bmNocm9uaXphdGlvbiBpcyBjb21wbGV0ZQotCSAqIDMgLSBzeW5jaHJvbml6YXRpb24gY29tcGxldGVzIGZpcnN0IGV4ZWN1dGlvbiBhbmQgc2hvdWxkIHN0b3A7Ci0JICogICAgICAic3RvcCIgdGhyZWFkIHNob3VsZCBydW4gdG8gY29tcGxldGlvbiBvbmNlIHRoZSBzeW5jaHJvbml6YXRpb24gaGFzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FsbFN0b3BGcm9tQW5vdGhlclRocmVhZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlsb2coIj09PT09IiArIHRoaXMuZ2V0TmFtZSgpICsgIj09PT09Iik7Ci0JCVByaW1hcnlNb2RlbDIgcHJpbWFyeU1vZGVsMyA9IG5ldyBQcmltYXJ5TW9kZWwyKCk7Ci0JCS8vIGEgc3luY2hyb25pemUgd2lsbCBvY2N1ciBoZXJlOgotCQlTZWNvbmRhcnlNb2RlbDMgc2Vjb25kYXJ5TW9kZWwzID0gbmV3IFNlY29uZGFyeU1vZGVsMyhwcmltYXJ5TW9kZWwzKTsKLQkJQ29tbWFuZCBjb21tYW5kMyA9IG5ldyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDIocHJpbWFyeU1vZGVsMywgc2Vjb25kYXJ5TW9kZWwzKTsKLQkJU3luY2hyb25pemVyIHN5bmNocm9uaXplcjMgPSBuZXcgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIoY29tbWFuZDMpOwotCQkvLyBhbm90aGVyIHN5bmNocm9uaXplIHdpbGwgb2NjdXIgaGVyZToKLQkJcHJpbWFyeU1vZGVsMy5zZXRTeW5jaHJvbml6ZXIoc3luY2hyb25pemVyMyk7Ci0JCXNlY29uZGFyeU1vZGVsMy5zZXRUaWNrcygyKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgcHJpbWFyeU1vZGVsMy5nZXRDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHByaW1hcnlNb2RlbDMuZ2V0Q291bnRQbHVzMygpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHNlY29uZGFyeU1vZGVsMy5nZXREb3VibGVDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBzZWNvbmRhcnlNb2RlbDMuZ2V0RG91YmxlQ291bnRQbHVzMygpKTsKLQotCQlUaHJlYWQgc3luY1RocmVhZCA9IHRoaXMuYnVpbGRUcmlnZ2VyU3luY2hyb25pemVUaHJlYWQocHJpbWFyeU1vZGVsMywgMSk7Ci0JCVRocmVhZCBzdG9wVGhyZWFkID0gdGhpcy5idWlsZFN0b3BUaHJlYWQoc3luY2hyb25pemVyMywgMik7Ci0KLQkJbG9nKCJBTEwgdGhyZWFkcyBzdGFydCIpOwotCQlzdG9wVGhyZWFkLnN0YXJ0KCk7Ci0JCXN5bmNUaHJlYWQuc3RhcnQoKTsKLQotCQlzdG9wVGhyZWFkLmpvaW4oKTsKLQkJc3luY1RocmVhZC5qb2luKCk7Ci0KLQkJLy8gJ2RvdWJsZUNvdW50JyBpcyBzeW5jaHJvbml6ZWQ7IGJ1dCB0aGUgc3luY2hyb25pemF0aW9uIGlzIHN0b3BwZWQKLQkJLy8gd2hpbGUgdGhhdCBpcyBoYXBwZW5pbmcgKGJ5IHRoZSAnc3RvcFRocmVhZCcpLCBzbyAnZG91YmxlQ291bnRQbHVzMycKLQkJLy8gZG9lcyBub3QgZ2V0IHN5bmNocm9uaXplZAotCQlhc3NlcnRFcXVhbHMoNywgcHJpbWFyeU1vZGVsMy5nZXRDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBwcmltYXJ5TW9kZWwzLmdldENvdW50UGx1czMoKSk7Ci0JCWFzc2VydEVxdWFscygxNCwgc2Vjb25kYXJ5TW9kZWwzLmdldERvdWJsZUNvdW50KCkpOwotCi0JCS8vIHRoaXMgZG9lcyBub3QgZ2V0IHVwZGF0ZWQgYmVjYXVzZSBpdCB3b3VsZCd2ZSBiZWVuIHVwZGF0ZWQgYnkgdGhlCi0JCS8vIHJlY3Vyc2l2ZSBjYWxsIHRvICNzeW5jaHJvbml6ZSgpLCBidXQgYnkgdGhhdCB0aW1lICNzdG9wKCkgaGFkIGJlZW4gY2FsbGVkCi0JCWFzc2VydEVxdWFscygxMCwgc2Vjb25kYXJ5TW9kZWwzLmdldERvdWJsZUNvdW50UGx1czMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUaHJlYWQgYnVpbGRUcmlnZ2VyU3luY2hyb25pemVUaHJlYWQoUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWwsIGxvbmcgdGlja3MpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUaHJlYWQodGhpcy5idWlsZFRyaWdnZXJTeW5jaHJvbml6ZVJ1bm5hYmxlKHByaW1hcnlNb2RlbCwgdGlja3MpLCAidHJpZ2dlciBzeW5jIik7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFRyaWdnZXJTeW5jaHJvbml6ZVJ1bm5hYmxlKGZpbmFsIFByaW1hcnlNb2RlbDIgcHJpbWFyeU1vZGVsLCBmaW5hbCBsb25nIHRpY2tzKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGVzdFRvb2xzLnNsZWVwKHRpY2tzICogVElDSyk7Ci0JCQkJcHJpbWFyeU1vZGVsLnNldENvdW50KDcpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVGhyZWFkIGJ1aWxkU3RvcFRocmVhZChTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyLCBsb25nIHRpY2tzKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVGhyZWFkKHRoaXMuYnVpbGRTdG9wUnVubmFibGUoc3luY2hyb25pemVyLCB0aWNrcyksICJzdG9wIik7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFN0b3BSdW5uYWJsZShmaW5hbCBTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyLCBmaW5hbCBsb25nIHRpY2tzKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGVzdFRvb2xzLnNsZWVwKHRpY2tzICogVElDSyk7Ci0JCQkJbG9nKCJTVE9QIHRocmVhZCBTeW5jaHJvbml6ZXIuc3RvcCgpIik7Ci0JCQkJc3luY2hyb25pemVyLnN0b3AoKTsKLQkJCQlsb2coIlNUT1AgdGhyZWFkIHN0b3AiKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBDb2RlIGNsb25lZCBmcm9tIHtAbGluayAjdGVzdFN0b3BDYWxsZWRGcm9tQW5vdGhlclRocmVhZCgpfS4KLQkgKiAKLQkgKiBJbnRlcnJ1cHQgdGhlICJzdG9wIiB0aHJlYWQgd2hpbGUgaXQgaXMgd2FpdGluZyBmb3IgdGhlICJzeW5jaCIgdGhyZWFkIHRvIGZpbmlzaC4KLQkgKiBWZXJpZnkgdGhhdCBubyBmdXJ0aGVyIHN5bmNocm9uaXphdGlvbnMgb2NjdXIuCi0JICogVmVyaWZ5IHRoZSBjYWxsIHRvICNzdG9wKCkgcmV0dXJucyAqYmVmb3JlKgotCSAqIHN5bmNocm9uaXphdGlvbiBpcyBjb21wbGV0ZSAobXVzdCBzZXQge0BsaW5rICNERUJVR30gdG8gdHJ1ZSBhbmQKLQkgKiBsb29rIGF0IHRoZSBjb25zb2xlKS4KLQkgKiAKLQkgKiB0aWNrczoKLQkgKiAwIC0gc3RhcnQgInN5bmMiIHRocmVhZCAod2hpY2ggd2lsbCBzbGVlcCBmb3IgMSB0aWNrKTsKLQkgKiAgICAgIHN0YXJ0ICJzdG9wIiB0aHJlYWQgKHdoaWNoIHdpbGwgc2xlZXAgZm9yIDIgdGlja3MpOwotCSAqICAgICAgc3RhcnQgImludGVycnVwdCIgdGhyZWFkICh3aGljaCB3aWxsIHNsZWVwIGZvciAzIHRpY2tzKQotCSAqIDEgLSAic3luYyIgdGhyZWFkIHdha2VzIHVwIGFuZCBjYWxscyBQcmltYXJ5TW9kZWwxLnNldENvdW50KGludCkKLQkgKiAgICAgIHdoaWNoIHRyaWdnZXJzIGNhbGwgdG8gU3luY2hyb25pemVyLnN5bmNocm9uaXplKCkgdG8gYmVnaW4KLQkgKiAgICAgIHN5bmNocm9uaXphdGlvbiBvZiBTZWNvbmRhcnlNb2RlbCAod2hpY2ggd2lsbCBydW4gZm9yIDMgdGlja3M7Ci0JICogICAgICBpLmUuIGl0IHdpbGwgZmluaXNoIG9uIHRpY2sgNCkKLQkgKiAyIC0gInN0b3AiIHRocmVhZCB3YWtlcyB1cCBhbmQgY2FsbHMgU3luY2hyb25pemVyLnN0b3AoKSBhbmQgc2hvdWxkCi0JICogICAgICB3YWl0IHVudGlsIGl0IGlzIGludGVycnVwdGVkCi0JICogMyAtICJpbnRlcnJ1cHQiIHRocmVhZCB3YWtlcyB1cCBhbmQgaW50ZXJydXB0cyAic3RvcCIgdGhyZWFkOwotCSAqICAgICAgIGJvdGggd2lsbCBydW4gdG8gY29tcGxldGlvbiBhdCB0aGF0IHBvaW50Ci0JICogNCAtIHN5bmNocm9uaXphdGlvbiBjb21wbGV0ZXMgZmlyc3QgZXhlY3V0aW9uIGFuZCBzaG91bGQgc3RvcCBzaW5jZSB0aGUKLQkgKiAgICAgICJzdG9wIiB0aHJlYWQsIGJlZm9yZSBpdCB3YXMgaW50ZXJydXB0ZWQsIHRvbGQgdGhlICJzeW5jaCIgdGhyZWFkIHRvIHN0b3AKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW50ZXJydXB0U3RvcFRocmVhZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlsb2coIj09PT09IiArIHRoaXMuZ2V0TmFtZSgpICsgIj09PT09Iik7Ci0JCVByaW1hcnlNb2RlbDIgcHJpbWFyeU1vZGVsMyA9IG5ldyBQcmltYXJ5TW9kZWwyKCk7Ci0JCS8vIGEgc3luY2hyb25pemUgd2lsbCBvY2N1ciBoZXJlOgotCQlTZWNvbmRhcnlNb2RlbDMgc2Vjb25kYXJ5TW9kZWwzID0gbmV3IFNlY29uZGFyeU1vZGVsMyhwcmltYXJ5TW9kZWwzKTsKLQkJQ29tbWFuZCBjb21tYW5kMyA9IG5ldyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDIocHJpbWFyeU1vZGVsMywgc2Vjb25kYXJ5TW9kZWwzKTsKLQkJU3luY2hyb25pemVyIHN5bmNocm9uaXplcjMgPSBuZXcgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIoY29tbWFuZDMpOwotCQkvLyBhbm90aGVyIHN5bmNocm9uaXplIHdpbGwgb2NjdXIgaGVyZToKLQkJcHJpbWFyeU1vZGVsMy5zZXRTeW5jaHJvbml6ZXIoc3luY2hyb25pemVyMyk7Ci0JCXNlY29uZGFyeU1vZGVsMy5zZXRUaWNrcygzKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgcHJpbWFyeU1vZGVsMy5nZXRDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHByaW1hcnlNb2RlbDMuZ2V0Q291bnRQbHVzMygpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHNlY29uZGFyeU1vZGVsMy5nZXREb3VibGVDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBzZWNvbmRhcnlNb2RlbDMuZ2V0RG91YmxlQ291bnRQbHVzMygpKTsKLQotCQlUaHJlYWQgc3luY1RocmVhZCA9IHRoaXMuYnVpbGRUcmlnZ2VyU3luY2hyb25pemVUaHJlYWQocHJpbWFyeU1vZGVsMywgMSk7Ci0JCVRocmVhZCBzdG9wVGhyZWFkID0gdGhpcy5idWlsZFN0b3BUaHJlYWQoc3luY2hyb25pemVyMywgMik7Ci0JCVRocmVhZCBpbnRlcnJ1cHRUaHJlYWQgPSB0aGlzLmJ1aWxkSW50ZXJydXB0VGhyZWFkKHN0b3BUaHJlYWQsIDMpOwotCi0JCWxvZygiQUxMIHRocmVhZHMgc3RhcnQiKTsKLQkJc3RvcFRocmVhZC5zdGFydCgpOwotCQlzeW5jVGhyZWFkLnN0YXJ0KCk7Ci0JCWludGVycnVwdFRocmVhZC5zdGFydCgpOwotCi0JCXN0b3BUaHJlYWQuam9pbigpOwotCQlzeW5jVGhyZWFkLmpvaW4oKTsKLQkJaW50ZXJydXB0VGhyZWFkLmpvaW4oKTsKLQotCQkvLyAnZG91YmxlQ291bnQnIGlzIHN5bmNocm9uaXplZDsgYnV0IHRoZSBzeW5jaHJvbml6YXRpb24gaXMgc3RvcHBlZAotCQkvLyB3aGlsZSB0aGF0IGlzIGhhcHBlbmluZyAoYnkgdGhlICdzdG9wVGhyZWFkJyksIHNvICdkb3VibGVDb3VudFBsdXMzJwotCQkvLyBkb2VzIG5vdCBnZXQgc3luY2hyb25pemVkCi0JCWFzc2VydEVxdWFscyg3LCBwcmltYXJ5TW9kZWwzLmdldENvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHByaW1hcnlNb2RlbDMuZ2V0Q291bnRQbHVzMygpKTsKLQkJYXNzZXJ0RXF1YWxzKDE0LCBzZWNvbmRhcnlNb2RlbDMuZ2V0RG91YmxlQ291bnQoKSk7Ci0KLQkJLy8gdGhpcyBkb2VzIG5vdCBnZXQgdXBkYXRlZCBiZWNhdXNlIGl0IHdvdWxkJ3ZlIGJlZW4gdXBkYXRlZCBieSB0aGUKLQkJLy8gcmVjdXJzaXZlIGNhbGwgdG8gI3N5bmNocm9uaXplKCksIGJ1dCBieSB0aGF0IHRpbWUgI3N0b3AoKSBoYWQgYmVlbiBjYWxsZWQKLQkJYXNzZXJ0RXF1YWxzKDEwLCBzZWNvbmRhcnlNb2RlbDMuZ2V0RG91YmxlQ291bnRQbHVzMygpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb2RlIGNsb25lZCBmcm9tIHtAbGluayAjdGVzdFN0b3BDYWxsZWRGcm9tQW5vdGhlclRocmVhZCgpfS4KLQkgKiAKLQkgKiBJbnRlcnJ1cHQgdGhlICJzeW5jIiB0aHJlYWQgd2hpbGUgaXQgaXMgc3luY2hyb25pemluZywgY3V0dGluZyBzaG9ydCB0aGUgc3luY2hyb25pemF0aW9uLgotCSAqIFZlcmlmeSB0aGF0IG5vIGZ1cnRoZXIgc3luY2hyb25pemF0aW9ucyBvY2N1ci4KLQkgKiBWZXJpZnkgdGhlIGNhbGwgdG8gI3N0b3AoKSBkb2VzIG5vdCByZXR1cm4gdW50aWwgdGhlIHBlbmRpbmcKLQkgKiBzeW5jaHJvbml6YXRpb24gaXMgc3RvcHMgYWZ0ZXIgaXQgaXMgaW50ZXJydXB0ZWQgKG11c3Qgc2V0IHtAbGluayAjREVCVUd9IHRvIHRydWUgYW5kCi0JICogbG9vayBhdCB0aGUgY29uc29sZSkuCi0JICogCi0JICogdGlja3M6Ci0JICogMCAtIHN0YXJ0ICJzeW5jIiB0aHJlYWQgKHdoaWNoIHdpbGwgc2xlZXAgZm9yIDEgdGljaykKLQkgKiAgICAgIHN0YXJ0ICJzdG9wIiB0aHJlYWQgKHdoaWNoIHdpbGwgc2xlZXAgZm9yIDIgdGlja3MpCi0JICogICAgICBzdGFydCAiaW50ZXJydXB0IiB0aHJlYWQgKHdoaWNoIHdpbGwgc2xlZXAgZm9yIDMgdGlja3MpCi0JICogMSAtICJzeW5jIiB0aHJlYWQgd2FrZXMgdXAgYW5kIGNhbGxzIFByaW1hcnlNb2RlbDEuc2V0Q291bnQoaW50KQotCSAqICAgICAgd2hpY2ggdHJpZ2dlcnMgY2FsbCB0byBTeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKSB0byBiZWdpbgotCSAqICAgICAgc3luY2hyb25pemF0aW9uIG9mIFNlY29uZGFyeU1vZGVsICh3aGljaCB3aWxsIHJ1biBmb3IgNCB0aWNrczsKLQkgKiAgICAgIGkuZS4gaXQgd2lsbCBmaW5pc2ggb24gdGljayA1KQotCSAqIDIgLSAic3RvcCIgdGhyZWFkIHdha2VzIHVwIGFuZCBjYWxscyBTeW5jaHJvbml6ZXIuc3RvcCgpIGFuZCBzaG91bGQKLQkgKiAgICAgIHdhaXQgdW50aWwgdGhlIHN5bmNocm9uaXphdGlvbiBpcyBpbnRlcnJ1cHRlZAotCSAqIDMgLSAiaW50ZXJydXB0IiB0aHJlYWQgd2FrZXMgdXAgYW5kIGludGVycnVwdHMgInN5bmMiIHRocmVhZDsKLQkgKiAgICAgIHRoZSAiaW50ZXJydXB0IiB0aHJlYWQgcnVucyB0byBjb21wbGV0aW9uLCB3aGlsZSB0aGUgInN5bmMiIHRocmVhZCBrZWVwcwotCSAqICAgICAgZ29pbmcgZm9yIGFub3RoZXIgdGljayBiZWZvcmUgaXQgc3RvcHMgaW4gIm1pZC1zeW5jaHJvbml6ZSIKLQkgKiA0IC0gdGhlICJzeW5jIiB0aHJlYWQgYWNrbm93bGVkZ2VzIHRoZSBpbnRlcnJ1cHQgYW5kIHN0b3BzIGluCi0JICogICAgICAibWlkLXN5bmNocm9uaXplIjsgaXQgd2lsbCBzdG9wIHNpbmNlIHRoZSAic3RvcCIgdGhyZWFkIHRvbGQgaXQgdG8gYXQgdGljayAyOwotCSAqICAgICAgdGhlICJzeW5jIiBhbmQgInN0b3AiIHRocmVhZHMgcnVuIHRvIGNvbXBsZXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW50ZXJydXB0U3luY1RocmVhZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlsb2coIj09PT09IiArIHRoaXMuZ2V0TmFtZSgpICsgIj09PT09Iik7Ci0JCVByaW1hcnlNb2RlbDIgcHJpbWFyeU1vZGVsMyA9IG5ldyBQcmltYXJ5TW9kZWwyKCk7Ci0JCS8vIGEgc3luY2hyb25pemUgd2lsbCBvY2N1ciBoZXJlOgotCQlTZWNvbmRhcnlNb2RlbDMgc2Vjb25kYXJ5TW9kZWwzID0gbmV3IFNlY29uZGFyeU1vZGVsMyhwcmltYXJ5TW9kZWwzKTsKLQkJQ29tbWFuZCBjb21tYW5kMyA9IG5ldyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDIocHJpbWFyeU1vZGVsMywgc2Vjb25kYXJ5TW9kZWwzKTsKLQkJU3luY2hyb25pemVyIHN5bmNocm9uaXplcjMgPSBuZXcgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIoY29tbWFuZDMpOwotCQkvLyBhbm90aGVyIHN5bmNocm9uaXplIHdpbGwgb2NjdXIgaGVyZToKLQkJcHJpbWFyeU1vZGVsMy5zZXRTeW5jaHJvbml6ZXIoc3luY2hyb25pemVyMyk7Ci0JCXNlY29uZGFyeU1vZGVsMy5zZXRUaWNrcyg0KTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgcHJpbWFyeU1vZGVsMy5nZXRDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHByaW1hcnlNb2RlbDMuZ2V0Q291bnRQbHVzMygpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHNlY29uZGFyeU1vZGVsMy5nZXREb3VibGVDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBzZWNvbmRhcnlNb2RlbDMuZ2V0RG91YmxlQ291bnRQbHVzMygpKTsKLQotCQlUaHJlYWQgc3luY1RocmVhZCA9IHRoaXMuYnVpbGRUcmlnZ2VyU3luY2hyb25pemVUaHJlYWQocHJpbWFyeU1vZGVsMywgMSk7Ci0JCVRocmVhZCBzdG9wVGhyZWFkID0gdGhpcy5idWlsZFN0b3BUaHJlYWQoc3luY2hyb25pemVyMywgMik7Ci0JCVRocmVhZCBpbnRlcnJ1cHRUaHJlYWQgPSB0aGlzLmJ1aWxkSW50ZXJydXB0VGhyZWFkKHN5bmNUaHJlYWQsIDMpOwotCi0JCWxvZygiQUxMIHRocmVhZHMgc3RhcnQiKTsKLQkJc3RvcFRocmVhZC5zdGFydCgpOwotCQlzeW5jVGhyZWFkLnN0YXJ0KCk7Ci0JCWludGVycnVwdFRocmVhZC5zdGFydCgpOwotCi0JCXN0b3BUaHJlYWQuam9pbigpOwotCQlzeW5jVGhyZWFkLmpvaW4oKTsKLQkJaW50ZXJydXB0VGhyZWFkLmpvaW4oKTsKLQotCQlhc3NlcnRFcXVhbHMoNywgcHJpbWFyeU1vZGVsMy5nZXRDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBwcmltYXJ5TW9kZWwzLmdldENvdW50UGx1czMoKSk7Ci0KLQkJLy8gbm9uZSBvZiB0aGUgc2Vjb25kYXJ5IG1vZGVsIGlzIHN5bmNocm9uaXplZCBiZWNhdXNlIHRoZSBzeW5jaHJvbml6ZSgpCi0JCS8vIG1ldGhvZCB3YXMgaW50ZXJydXB0ZWQgYmVmb3JlIGFueSBzeW5jaHJvbml6YXRpb24gaGFkIG9jY3VycmVkCi0JCWFzc2VydEVxdWFscyg0LCBzZWNvbmRhcnlNb2RlbDMuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCWFzc2VydEVxdWFscygxMCwgc2Vjb25kYXJ5TW9kZWwzLmdldERvdWJsZUNvdW50UGx1czMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUaHJlYWQgYnVpbGRJbnRlcnJ1cHRUaHJlYWQoVGhyZWFkIHRocmVhZCwgbG9uZyB0aWNrcykgewotCQlyZXR1cm4gdGhpcy5idWlsZFRocmVhZCh0aGlzLmJ1aWxkSW50ZXJydXB0UnVubmFibGUodGhyZWFkLCB0aWNrcyksICJpbnRlcnJ1cHQiKTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSW50ZXJydXB0UnVubmFibGUoZmluYWwgVGhyZWFkIHRocmVhZCwgZmluYWwgbG9uZyB0aWNrcykgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRlc3RUb29scy5zbGVlcCh0aWNrcyAqIFRJQ0spOwotCQkJCWxvZygiSU5URVJSVVBUIHRocmVhZCBUaHJlYWQuaW50ZXJydXB0KCkiKTsKLQkJCQl0aHJlYWQuaW50ZXJydXB0KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ2FsbCAjc3RvcCgpIGR1cmluZyBhIGxvbmctcnVubmluZyAic3luY2hyb25pemUiOyB0aGVuIGNhbGwgI3N0YXJ0KCkKLQkgKiB3aGlsZSB0aGUgI3N0b3AoKSBpcyB3YWl0aW5nIGZvciB0aGUgInN5bmNocm9uaXplIiB0byBjb21wbGV0ZS4KLQkgKiAKLQkgKiB0aWNrczoKLQkgKiAwIC0gc3RhcnQgInN5bmMiIHRocmVhZCAod2hpY2ggd2lsbCBzbGVlcCBmb3IgMSB0aWNrKQotCSAqICAgICAgc3RhcnQgInN0b3AiIHRocmVhZCAod2hpY2ggd2lsbCBzbGVlcCBmb3IgMiB0aWNrcykKLQkgKiAgICAgIHN0YXJ0ICJzdGFydCIgdGhyZWFkICh3aGljaCB3aWxsIHNsZWVwIGZvciAzIHRpY2tzKQotCSAqIDEgLSAic3luYyIgdGhyZWFkIHdha2VzIHVwIGFuZCBjYWxscyBTeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKSB0byBiZWdpbgotCSAqICAgICAgc3luY2hyb25pemF0aW9uICh3aGljaCB3aWxsIHJ1biBmb3IgMyB0aWNrczsgaS5lLiBpdCB3aWxsIGZpbmlzaCBvbiB0aWNrIDQpCi0JICogMiAtICJzdG9wIiB0aHJlYWQgd2FrZXMgdXAgYW5kIGNhbGxzIFN5bmNocm9uaXplci5zdG9wKCkgYW5kIHNob3VsZAotCSAqICAgICAgd2FpdCB1bnRpbCB0aGUgc3luY2hyb25pemF0aW9uIGlzIGZpbmlzaGVkIChpLmUuIHRpY2sgNCkKLQkgKiAzIC0gInN0YXJ0IiB0aHJlYWQgd2FrZXMgdXAgYW5kIGNhbGxzIFN5bmNocm9uaXplci5zdGFydCgpCi0JICogICAgICB3aGljaCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbgotCSAqIDQgLSB0aGUgInN5bmMiIHRocmVhZCBmaW5pc2hlcyBleGVjdXRpb247Ci0JICogICAgICBpdCB3aWxsIHN0b3Agc2luY2UgdGhlICJzdG9wIiB0aHJlYWQgdG9sZCBpdCB0byBhdCB0aWNrIDI7Ci0JICogICAgICB0aGUgInN5bmMiIGFuZCAic3RvcCIgdGhyZWFkcyBydW4gdG8gY29tcGxldGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDYWxsU3RhcnREdXJpbmdTdG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWxvZygiPT09PT0iICsgdGhpcy5nZXROYW1lKCkgKyAiPT09PT0iKTsKLQkJRGVsYXlDb21tYW5kIGNvbW1hbmQgPSB0aGlzLmJ1aWxkRGVsYXlDb21tYW5kKDMpOwotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gbmV3IFN5bmNocm9ub3VzU3luY2hyb25pemVyKGNvbW1hbmQpOwotCQlzeW5jaHJvbml6ZXIuc3RhcnQoKTsKLQotCQlUaHJlYWQgc3luY1RocmVhZCA9IHRoaXMuYnVpbGRTeW5jaHJvbml6ZVRocmVhZChzeW5jaHJvbml6ZXIsIDEpOwotCQlUaHJlYWQgc3RvcFRocmVhZCA9IHRoaXMuYnVpbGRTdG9wVGhyZWFkKHN5bmNocm9uaXplciwgMik7Ci0JCVN5bmNocm9uaXplZEJvb2xlYW4gZXhDYXVnaHQgPSBuZXcgU3luY2hyb25pemVkQm9vbGVhbihmYWxzZSk7Ci0JCVRocmVhZCBzdGFydFRocmVhZCA9IHRoaXMuYnVpbGRTdGFydFRocmVhZChzeW5jaHJvbml6ZXIsIDMsIGV4Q2F1Z2h0KTsKLQotCQlsb2coIkFMTCB0aHJlYWRzIHN0YXJ0Iik7Ci0JCXN5bmNUaHJlYWQuc3RhcnQoKTsKLQkJc3RvcFRocmVhZC5zdGFydCgpOwotCQlzdGFydFRocmVhZC5zdGFydCgpOwotCi0JCXN5bmNUaHJlYWQuam9pbigpOwotCQlzdG9wVGhyZWFkLmpvaW4oKTsKLQkJc3RhcnRUaHJlYWQuam9pbigpOwotCi0JCWFzc2VydFRydWUoZXhDYXVnaHQuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjb21tYW5kLmNvdW50KTsKLQl9Ci0KLQlwcml2YXRlIERlbGF5Q29tbWFuZCBidWlsZERlbGF5Q29tbWFuZChpbnQgdGlja3MpIHsKLQkJcmV0dXJuIG5ldyBEZWxheUNvbW1hbmQodGlja3MpOwotCX0KLQotCWNsYXNzIERlbGF5Q29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgewotCQlmaW5hbCBsb25nIHRpY2tzOwotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJaW50IGNvdW50ID0gMDsKLQotCQlEZWxheUNvbW1hbmQoaW50IHRpY2tzKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy50aWNrcyA9IHRpY2tzOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRoaXMuY291bnQrKzsKLQkJCS8vIGRvIG5vdGhpbmcgZm9yIHRoZSBmaXJzdCBjYWxsIChmcm9tICNzdGFydCgpKQotCQkJaWYgKHRoaXMuZmlyc3QpIHsKLQkJCQlsb2coIkVYRUMgZmlyc3QiKTsKLQkJCQl0aGlzLmZpcnN0ID0gZmFsc2U7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJbG9nKCJFWEVDIHN0YXJ0ICIgKyB0aGlzLmNvdW50KTsKLQkJCVRlc3RUb29scy5zbGVlcCh0aGlzLnRpY2tzICogVElDSyk7Ci0JCQlsb2coIkVYRUMgc3RvcCAiICsgdGhpcy5jb3VudCk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgVGhyZWFkIGJ1aWxkU3RhcnRUaHJlYWQoU3luY2hyb25pemVyIHN5bmNocm9uaXplciwgbG9uZyB0aWNrcywgU3luY2hyb25pemVkQm9vbGVhbiBleENhdWdodCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRocmVhZCh0aGlzLmJ1aWxkU3RhcnRSdW5uYWJsZShzeW5jaHJvbml6ZXIsIHRpY2tzLCBleENhdWdodCksICJzdGFydCIpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRTdGFydFJ1bm5hYmxlKGZpbmFsIFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIsIGZpbmFsIGxvbmcgdGlja3MsIGZpbmFsIFN5bmNocm9uaXplZEJvb2xlYW4gZXhDYXVnaHQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUZXN0VG9vbHMuc2xlZXAodGlja3MgKiBUSUNLKTsKLQkJCQlsb2coIlNUQVJUIHRocmVhZCBTeW5jaHJvbml6ZXIuc3RhcnQoKSIpOwotCQkJCXRyeSB7Ci0JCQkJCXN5bmNocm9uaXplci5zdGFydCgpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodC5zZXRUcnVlKCk7Ci0JCQkJCWxvZygiU1RBUlQgdGhyZWFkIGV4Y2VwdGlvbiIpOwotCQkJCX0KLQkJCQlsb2coIlNUQVJUIHRocmVhZCBzdG9wIik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUaHJlYWQgYnVpbGRTeW5jaHJvbml6ZVRocmVhZChTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyLCBsb25nIHRpY2tzKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVGhyZWFkKHRoaXMuYnVpbGRTeW5jaHJvbml6ZVJ1bm5hYmxlKHN5bmNocm9uaXplciwgdGlja3MpLCAic3luY2hyb25pemUiKTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkU3luY2hyb25pemVSdW5uYWJsZShmaW5hbCBTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyLCBmaW5hbCBsb25nIHRpY2tzKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGVzdFRvb2xzLnNsZWVwKHRpY2tzICogVElDSyk7Ci0JCQkJbG9nKCJTWU5DIHRocmVhZCBTeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKSIpOwotCQkJCXN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpOwotCQkJCWxvZygiU1lOQyB0aHJlYWQgc3RvcCIpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQm9ndXNDb21tYW5kIGNvbW1hbmQgPSBuZXcgQm9ndXNDb21tYW5kKCk7Ci0JCVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIgPSBuZXcgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIoY29tbWFuZCk7Ci0JCXN5bmNocm9uaXplci5zdGFydCgpOwotCi0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJLy8gd2UgdXNlZCB0byBoYW5nIGhlcmUsIGJlZm9yZSB3ZSBiZWdhbiBoYW5kbGluZyBleGNlcHRpb25zCi0JCQlzeW5jaHJvbml6ZXIuc3RvcCgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChDb21wb3NpdGVFeGNlcHRpb24gZXgpIHsKLQkJCWFzc2VydEVxdWFscygxLCBleC5nZXRFeGNlcHRpb25zKCkubGVuZ3RoKTsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQkJLy8gc3RhcnQgKyBzeW5jaHJvbml6ZQotCQlhc3NlcnRFcXVhbHMoMiwgY29tbWFuZC5jb3VudCk7Ci0JfQotCi0JcHVibGljIGNsYXNzIEJvZ3VzQ29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgewotCQlpbnQgY291bnQgPSAwOwotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJdGhpcy5jb3VudCsrOwotCQkJaWYgKHRoaXMuY291bnQgPiAxKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUgY29tbWFuZHMgKioqKioqKioqKgotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQxIGltcGxlbWVudHMgQ29tbWFuZCB7Ci0JCXByaXZhdGUgZmluYWwgU2Vjb25kYXJ5TW9kZWwxIHNlY29uZGFyeU1vZGVsOwotCi0JCXB1YmxpYyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDEoU2Vjb25kYXJ5TW9kZWwxIHNlY29uZGFyeU1vZGVsKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zZWNvbmRhcnlNb2RlbCA9IHNlY29uZGFyeU1vZGVsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRoaXMuc2Vjb25kYXJ5TW9kZWwuc3luY2hyb25pemUoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogdGhlIHByaW1hcnkgbW9kZWwgKHN1YmNsYXNzKSBoYXMgdG8gc3luY2hyb25pemUgd2l0aCBpdHNlbGYgKHN1cGVyY2xhc3MpCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDIgZXh0ZW5kcyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDEgewotCQlwcml2YXRlIGZpbmFsIFByaW1hcnlNb2RlbDIgcHJpbWFyeU1vZGVsOwotCi0JCXB1YmxpYyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDIoUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWwsIFNlY29uZGFyeU1vZGVsMiBzZWNvbmRhcnlNb2RlbCkgewotCQkJc3VwZXIoc2Vjb25kYXJ5TW9kZWwpOwotCQkJdGhpcy5wcmltYXJ5TW9kZWwgPSBwcmltYXJ5TW9kZWw7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXN1cGVyLmV4ZWN1dGUoKTsKLQkJCXRoaXMucHJpbWFyeU1vZGVsLnN5bmNocm9uaXplKCk7Ci0JCX0KLQotCX0KLQotCS8vICoqKioqKioqKiogcHJpbWFyeSBtb2RlbHMgKioqKioqKioqKgotCS8qKgotCSAqIHRoaXMgb2JqZWN0IHdpbGwgY2FsbCB0aGUgc3luY2hyb25pemVyIHdoZW5ldmVyIGl0cyBjb3VudCBjaGFuZ2VzLAotCSAqIGFsbG93aW5nIGludGVyZXN0ZWQgcGFydGllcyB0byBzeW5jaHJvbml6ZSB3aXRoIHRoZSBjaGFuZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFByaW1hcnlNb2RlbDEgewotCQlwcm90ZWN0ZWQgU3luY2hyb25pemVyIHN5bmNocm9uaXplcjsKLQkJcHJvdGVjdGVkIGludCBjb3VudCA9IDI7Ci0KLQkJcHVibGljIFByaW1hcnlNb2RlbDEoKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zZXRTeW5jaHJvbml6ZXJfKFN5bmNocm9uaXplci5OdWxsLmluc3RhbmNlKCkpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb3VudCgpIHsKLQkJCXJldHVybiB0aGlzLmNvdW50OwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldENvdW50KGludCBjb3VudCkgewotCQkJaWYgKGNvdW50ICE9IHRoaXMuY291bnQpIHsKLQkJCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JCQkJdGhpcy5zdGF0ZUNoYW5nZWQoKTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHN0YXRlQ2hhbmdlZCgpIHsKLQkJCXRoaXMuc3luY2hyb25pemVyLnN5bmNocm9uaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRTeW5jaHJvbml6ZXIoU3luY2hyb25pemVyIHN5bmNocm9uaXplcikgewotCQkJaWYgKHN5bmNocm9uaXplciA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLnN5bmNocm9uaXplci5zdG9wKCk7Ci0JCQl0aGlzLnNldFN5bmNocm9uaXplcl8oc3luY2hyb25pemVyKTsKLQkJfQotCQkJCi0JCXByb3RlY3RlZCB2b2lkIHNldFN5bmNocm9uaXplcl8oU3luY2hyb25pemVyIHN5bmNocm9uaXplcikgewotCQkJdGhpcy5zeW5jaHJvbml6ZXIgPSBzeW5jaHJvbml6ZXI7Ci0JCQl0aGlzLnN5bmNocm9uaXplci5zdGFydCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhcnRTeW5jaHJvbml6ZXIoKSB7Ci0JCQl0aGlzLnN5bmNocm9uaXplci5zdGFydCgpOyAgLy8gdGhpcyBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uCi0JCX0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCXRoaXMuc3luY2hyb25pemVyLnN0b3AoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQlzYi5hcHBlbmQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCQlzYi5hcHBlbmQoJygnKTsKLQkJCXRoaXMudG9TdHJpbmcoc2IpOwotCQkJc2IuYXBwZW5kKCcpJyk7Ci0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQoImNvdW50PSIpOwotCQkJc2IuYXBwZW5kKHRoaXMuY291bnQpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1vZGVsIHN5bmNocm9uaXplcyB3aXRoIGl0c2VsZiwgdHJpZ2dlcmluZyBhIHJlY3Vyc2l2ZSBzeW5jaHJvbml6YXRpb24KLQkgKiB3aXRoIHRoZSBjaGFuZ2UuIFdoZW5ldmVyIHRoZSBbaW5oZXJpdGVkXSAnY291bnQnIGNoYW5nZXMsICdjb3VudFBsdXMzJwotCSAqIGlzIHVwZGF0ZWQgYXBwcm9wcmlhdGVseSBhbmQgYW5vdGhlciBzeW5jaHJvbml6ZSBpcyBpbml0aWF0ZWQgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQcmltYXJ5TW9kZWwyIGV4dGVuZHMgUHJpbWFyeU1vZGVsMSB7Ci0JCXByaXZhdGUgaW50IGNvdW50UGx1czMgPSAwOwotCi0JCXB1YmxpYyBQcmltYXJ5TW9kZWwyKCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY291bnRQbHVzMyA9IHRoaXMuY291bnQgKyAzOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb3VudFBsdXMzKCkgewotCQkJcmV0dXJuIHRoaXMuY291bnRQbHVzMzsKLQkJfQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRDb3VudFBsdXMzKGludCBjb3VudFBsdXMzKSB7Ci0JCQlpZiAoY291bnRQbHVzMyAhPSB0aGlzLmNvdW50UGx1czMpIHsKLQkJCQl0aGlzLmNvdW50UGx1czMgPSBjb3VudFBsdXMzOwotCQkJCXRoaXMuc3RhdGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzeW5jaHJvbml6ZSB3aXRoIGl0c2VsZiwgc28gdG8gc3BlYWsKLQkJcHVibGljIHZvaWQgc3luY2hyb25pemUoKSB7Ci0JCQl0aGlzLnNldENvdW50UGx1czModGhpcy5jb3VudCArIDMpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJCXNiLmFwcGVuZCgiLCBjb3VudFBsdXMzPSIpOwotCQkJc2IuYXBwZW5kKHRoaXMuY291bnRQbHVzMyk7Ci0JCX0KLQotCX0KLQotCS8vICoqKioqKioqKiogc2Vjb25kYXJ5IG1vZGVscyAqKioqKioqKioqCi0JLyoqCi0JICogVGhpcyBkZXBlbmRlbnQgb2JqZWN0IHVwZGF0ZXMgaXRzICdkb3VibGVDb3VudCcgd2hlbmV2ZXIgdGhlCi0JICogUHJpbWFyeU1vZGVsMSdzICdjb3VudCcgY2hhbmdlcywgdmlhIHRoZSAnc3luY2hyb25pemVyJy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNlY29uZGFyeU1vZGVsMSB7Ci0JCXByb3RlY3RlZCBmaW5hbCBQcmltYXJ5TW9kZWwxIHByaW1hcnlNb2RlbDsKLQkJcHJvdGVjdGVkIGludCBkb3VibGVDb3VudCA9IDA7Ci0KLQkJcHVibGljIFNlY29uZGFyeU1vZGVsMShQcmltYXJ5TW9kZWwxIHByaW1hcnlNb2RlbCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucHJpbWFyeU1vZGVsID0gcHJpbWFyeU1vZGVsOwotCQkJdGhpcy5zeW5jaHJvbml6ZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3luY2hyb25pemUoKSB7Ci0JCQl0aGlzLmRvdWJsZUNvdW50ID0gdGhpcy5wcmltYXJ5TW9kZWwuZ2V0Q291bnQoKSAqIDI7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldERvdWJsZUNvdW50KCkgewotCQkJcmV0dXJuIHRoaXMuZG91YmxlQ291bnQ7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkJc2IuYXBwZW5kKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQkJc2IuYXBwZW5kKCcoJyk7Ci0JCQl0aGlzLnRvU3RyaW5nKHNiKTsKLQkJCXNiLmFwcGVuZCgnKScpOwotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKCJkb3VibGVDb3VudD0iKTsKLQkJCXNiLmFwcGVuZCh0aGlzLmRvdWJsZUNvdW50KTsKLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTZWNvbmRhcnlNb2RlbDIgZXh0ZW5kcyBTZWNvbmRhcnlNb2RlbDEgewotCQlwcml2YXRlIGludCBkb3VibGVDb3VudFBsdXMzID0gMDsKLQotCQlwdWJsaWMgU2Vjb25kYXJ5TW9kZWwyKFByaW1hcnlNb2RlbDIgZXh0ZW5kZWRQcmltYXJ5TW9kZWwpIHsKLQkJCXN1cGVyKGV4dGVuZGVkUHJpbWFyeU1vZGVsKTsKLQkJfQotCi0JCXByb3RlY3RlZCBQcmltYXJ5TW9kZWwyIGdldEV4dGVuZGVkUHJpbWFyeU1vZGVsKCkgewotCQkJcmV0dXJuIChQcmltYXJ5TW9kZWwyKSB0aGlzLnByaW1hcnlNb2RlbDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZSgpIHsKLQkJCXN1cGVyLnN5bmNocm9uaXplKCk7Ci0JCQlpbnQgdGVtcCA9IHRoaXMuZ2V0RXh0ZW5kZWRQcmltYXJ5TW9kZWwoKS5nZXRDb3VudFBsdXMzKCkgKiAyOwotCQkJaWYgKHRoaXMuZG91YmxlQ291bnRQbHVzMyAhPSB0ZW1wKSB7Ci0JCQkJdGhpcy5kb3VibGVDb3VudFBsdXMzID0gdGVtcDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0RG91YmxlQ291bnRQbHVzMygpIHsKLQkJCXJldHVybiB0aGlzLmRvdWJsZUNvdW50UGx1czM7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQkJc2IuYXBwZW5kKCIsIGRvdWJsZUNvdW50UGx1czM9Iik7Ci0JCQlzYi5hcHBlbmQodGhpcy5kb3VibGVDb3VudFBsdXMzKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQWxsb3cgdGhlIHRpbWUgcmVxdWlyZWQgdG8gc3luY2hyb25pemUgdG8gYmUgc3BlY2lmaWVkLgotCSAqIEEgKG5vbi1kZWxheWVkKSBzeW5jaHJvbml6ZSB3aWxsIGV4ZWN1dGUgYmVmb3JlIHdlIGhhdmUgYSBjaGFuY2UgdG8KLQkgKiBjaGFuZ2UgdGhlIHRpY2sgY291bnQuIChJdCBpcyBjYWxsZWQgaW4gdGhlIFNlY29uZGFyeU1vZGVsMSBjb25zdHJ1Y3Rvci4pCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTZWNvbmRhcnlNb2RlbDMgZXh0ZW5kcyBTZWNvbmRhcnlNb2RlbDIgewotCQlwcml2YXRlIGxvbmcgZGVsYXkgPSAwOwotCQlwdWJsaWMgU2Vjb25kYXJ5TW9kZWwzKFByaW1hcnlNb2RlbDIgcHJpbWFyeU1vZGVsKSB7Ci0JCQlzdXBlcihwcmltYXJ5TW9kZWwpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VGlja3MobG9uZyB0aWNrcykgewotCQkJdGhpcy5kZWxheSA9IHRpY2tzICogVElDSzsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZSgpIHsKLQkJCS8vIGRvbid0IGxvZyBhbnl0aGluZyB1bnRpbCAndGlja3MnIGlzIHNldAotCQkJaWYgKHRoaXMuZGVsYXkgPT0gMCkgewotCQkJCXN1cGVyLnN5bmNocm9uaXplKCk7Ci0JCQl9IGVsc2UgewotCQkJCWxvZygiU1lOQyB0aHJlYWQgc3RhcnQgLSBzeW5jIGR1cmF0aW9uIHdpbGwgYmU6ICIgKyAodGhpcy5kZWxheSAvIFRJQ0spICsgIiB0aWNrcyIpOwotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCh0aGlzLmRlbGF5KTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCQlsb2coIlNZTkMgdGhyZWFkIGludGVycnVwdGVkIik7Ci0JCQkJCVRlc3RUb29scy5zbGVlcChUSUNLKTsKLQkJCQkJcmV0dXJuOyAgLy8gc3RvcCBzeW5jaHJvbml6ZSAoaS5lLiBkb24ndCBjYWxsIHN1cGVyLnN5bmNocm9uaXplKCkpCi0JCQkJfQotCQkJCXN1cGVyLnN5bmNocm9uaXplKCk7Ci0JCQkJbG9nKCJTWU5DIHRocmVhZCBzdG9wIik7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RERUJVRygpIHsKLQkJYXNzZXJ0RmFsc2UoREVCVUcpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlsb2dfKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dfKFN0cmluZyBtZXNzYWdlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnQodGltZXN0YW1wKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50KCcgJyk7Ci0JCVN5c3RlbS5vdXQucHJpbnQobWVzc2FnZSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRpbWVzdGFtcCgpIHsKLQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAlIDEwMDAwKSAvIDEwMDBmKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3Rlc3QueG1sIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ2MzVmMi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0IGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDY0Y2JiLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDcyMWE0Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjNWMxMS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIERCV1MgU3VwcG9ydAotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgREJXUyBTdXBwb3J0Ci0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDg1NWY4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4xLjEwMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZyIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUiIHZlcnNpb249IjEuMi4wIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImphdmF4LndzZGwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS42LjIucXVhbGlmaWVyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGJ3cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjQuMC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kYndzLmJ1aWxkZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi40LjAucXVhbGlmaWVyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGY5M2QwLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBEQldTIEVjbGlwc2VMaW5rIFN1cHBvcnQgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMTAsIDIwMTEuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzNlMmViLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvKiosXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZiBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDAwYmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci0KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCi0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDI5YTUzLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIERCV1MgRWNsaXBzZUxpbmsgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3ODM5Zi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjMThjZC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIERCV1MgRWNsaXBzZUxpbmsgU3VwcG9ydAotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIEVjbGlwc2VMaW5rIFN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjOWRhMy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gREJXUyBFY2xpcHNlTGluayBTdXBwb3J0IFNvdXJjZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDEwLCAyMDExLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjZmNkNi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyoqLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQwMGJhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotCi08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyOWE1My4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBEQldTIEVjbGlwc2VMaW5rIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMGUxMTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mZWF0dXJlLnRlbXAuZm9sZGVyCi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGJhOTcyLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMxOTQ1ZS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNTAzMzkuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIERCV1MgU3VwcG9ydCBTREsKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIGFyY2hpdmVzIGZvciBEYWxpIEphdmEgUGVyc2lzdGVuY2UgLSBFY2xpcHNlTGluayBEQldTIFN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzExZmQ4ZS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4xLjEwMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvLnByb2plY3QgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZjFkOWIuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOTkwNmQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjI3NTAyLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgSkFYQiBTdXBwb3J0Ci0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBKQVhCIFN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZDhiNTIuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjMuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZyIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlIiB2ZXJzaW9uPSIxLjIuMCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUiIHZlcnNpb249IjEuMi4wIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubW94eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjQuMC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaSBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIxZjE5NC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSkFYQiBFY2xpcHNlTGluayBTdXBwb3J0IFNvdXJjZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjZmNkNi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyoqLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQwMGJhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotCi08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdkYWViZi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIEVjbGlwc2VMaW5rIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NzgzOWYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNDQwMmIuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIEVjbGlwc2VMaW5rIFN1cHBvcnQKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBFY2xpcHNlTGluayBTdXBwb3J0Ci0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMWYxOTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgRWNsaXBzZUxpbmsgU3VwcG9ydCBTb3VyY2VcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkY2ZjZDYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLmdpZixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8qKixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkMDBiYS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLQotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZGFlYmYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSkFYQiBFY2xpcHNlTGluayBTdXBwb3J0Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0IGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmNjNjk0Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1Yjg0YS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMToxNyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTZkZTc0Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZTE1ZTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIEpBWEIgQ29yZSBKVW5pdCBUZXN0cwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotIyBUT1JFVklFVyAtIHVwZGF0ZVNpdGVOYW1lCi11cGRhdGVTaXRlTmFtZT1XZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgVXBkYXRlcwotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIEVjbGlwc2VMaW5rIEpBWEIgQ29yZSBKVW5pdCBUZXN0cwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxNjc1NC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBsaWNlbnNlLWZlYXR1cmU9Im9yZy5lY2xpcHNlLmxpY2Vuc2UiCi0gICAgICBsaWNlbnNlLWZlYXR1cmUtdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi50ZXN0cy5mZWF0dXJlIiB2ZXJzaW9uPSIxLjAuMCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDBlMTE0Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZmVhdHVyZS50ZW1wLmZvbGRlcgotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxZDQxOC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZGM4MjYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmYzMTBhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBKQVhCIFN1cHBvcnQgU0RLCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSBhcmNoaXZlcyBmb3IgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIC0gRWNsaXBzZUxpbmsgSkFYQiBTdXBwb3J0Ci0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMzYyNDYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMi4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBsaWNlbnNlLWZlYXR1cmU9Im9yZy5lY2xpcHNlLmxpY2Vuc2UiCi0gICAgICBsaWNlbnNlLWZlYXR1cmUtdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS8ucHJvamVjdCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3ZTE0NS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI5OTA2ZC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYWJlN2QuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIFN1cHBvcnQKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgU3VwcG9ydAotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEzMGJiOC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMi4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZSIgdmVyc2lvbj0iMS4yLjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaSBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjNGI2Ny4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFNvdXJjZSAtIEpBWEIgU3VwcG9ydFxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5NTI5Yi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgZWNsaXBzZTMyLmdpZiwgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZiBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDAwYmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci0KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCi0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmM0OTE2Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSkFYQiBTdXBwb3J0Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmEzZWYwLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTEyYmNlLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSkFYQiBTdXBwb3J0Ci0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYzMjA3My4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFNvdXJjZSAtIEpBWEIgU3VwcG9ydFxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA4LCAyMDEwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5NTI5Yi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgZWNsaXBzZTMyLmdpZiwgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZiBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDAwYmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci0KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCi0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmM0OTE2Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSkFYQiBTdXBwb3J0Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0IGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDhkZWU3Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTZkZTc0Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOGY3OWUuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgQ29yZSBKVW5pdCBUZXN0cwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotIyBUT1JFVklFVyAtIHVwZGF0ZVNpdGVOYW1lCi11cGRhdGVTaXRlTmFtZT1XZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgVXBkYXRlcwotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIEpBWEIgSlVuaXQgVGVzdHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMjZlNWYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjEuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udGVzdHMuZmVhdHVyZSIgdmVyc2lvbj0iMS4wLjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwZTExNC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZlYXR1cmUudGVtcC5mb2xkZXIKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZjYwYmUuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjk2NzJkLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJkMmI2Ni4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSkFYQiBTdXBwb3J0IFNESwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgYXJjaGl2ZXMgZm9yIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgU3VwcG9ydCAKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdiYTliMC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5jdnNpZ25vcmUgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5wcm9qZWN0IGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTczMWFiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzYwYjUwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4xMDAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5odG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjA2YjEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaW5pIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMxMDdkNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ0aXBzQW5kVHJpY2tzSHJlZiIgY29udGFpbnMgdGhlIEhlbHAgdG9waWMgaHJlZiB0byBhIHRpcHMgYW5kIHRyaWNrcyBwYWdlIAotIyBvcHRpb25hbAotdGlwc0FuZFRyaWNrc0hyZWY9L29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtCi0KLQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWQ5YmYyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBEQldTIFN1cHBvcnRcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IE9yYWNsZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDExLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMjBlM2IuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9jb21wb25lbnQueG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNGFlOTAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmciPgotPGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPgotPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA5YzJhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGY2NTdlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIERCV1MgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi8uY2xhc3NwYXRoIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YzVlMzEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuLy5jdnNpZ25vcmUgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuLy5wcm9qZWN0IGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzY1N2IxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmQ4OGIxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVHVlIE1hciAwOCAxMjowNzowMyBFU1QgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUxODJhYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW47c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRid3MuYnVpbGRlcjtidW5kbGUtdmVyc2lvbj0iWzIuMy4wLDMuMC4wKSIsCi0gamF2YXgud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuNi4yLDIuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbiwKLSBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2Uub3htCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vYWJvdXQuaHRtbCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzFmNTg2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDI+QWJvdXQgVGhpcyBDb250ZW50PC9IMj4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTxoMz5UaGlyZCBQYXJ0eSBDb250ZW50PC9oMz4KLTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFzIHNldCAKLSAgb3V0IGJlbG93LiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIAotICB0aGUgZm9sbG93aW5nIGlzIHByb3ZpZGVkIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgCi0gIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJiM4MjE3O3MgbGljZW5zZSBmb3IgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLjwvcD4KLQotPGg0PjxhIG5hbWU9IkpQQSIgaWQ9IkpQQSI+PC9hPkphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHYxLjA8L2g0PgotCi08YmxvY2txdW90ZT4KLSAgPHA+VGhlIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHdoaWNoIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIDxhIGhyZWY9Imh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETHYxLjAuaHRtbCI+Q0RETCAKLSAgICB2MS4wPC9hPiBpcyByZXF1aXJlZCBieSB0aGUgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFByb2plY3QgaW4gb3JkZXIgCi0gICAgdG8gc3VwcG9ydCB0aGlzIHN0YW5kYXJkLjwvcD4KLTwvYmxvY2txdW90ZT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhODM4YWIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vcGx1Z2luLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNTM3ZmMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gREJXUyBTdXBwb3J0IC0gV2ViIFNlcnZpY2VzIEdlbmVyYXRpb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL2NvcmUvZ2VuL01haW4uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvY29yZS9nZW4vTWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjZmNDQ1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvY29yZS9nZW4vTWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbjsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5JTkZPOwotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5TRVZFUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnRvb2xzLmRid3MuREJXU1BhY2thZ2VyLkFyY2hpdmVVc2UuaWdub3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4uaW50ZXJuYWwuSnB0RGJ3c0NvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5veG0uWE1MQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5veG0uWE1MVW5tYXJzaGFsbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnRvb2xzLmRid3MuREJXU0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UudG9vbHMuZGJ3cy5EQldTQnVpbGRlck1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnRvb2xzLmRid3MuREJXU0J1aWxkZXJNb2RlbFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UudG9vbHMuZGJ3cy5EQldTUGFja2FnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UudG9vbHMuZGJ3cy5FY2xpcHNlUGFja2FnZXI7Ci0KLS8qKgotICogIEdlbmVyYXRlIERCV1MgY29udGVudAotICogIAotICogQ3VycmVudCBjb21tYW5kLWxpbmUgYXJndW1lbnRzOgotICogICAgIFstYnVpbGRlckZpbGUgZGJ3cy1idWlsZGVyLnhtbF0gLSBzcGVjaWZpZXMgc291cmNlIGJ1aWxkZXIgZmlsZQotICogICAgIFstc3RhZ2VEaXIgLlxPdXRwdXRfRGlyXSAtIHNwZWNpZmllcyBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKLSAqICAgICBbLXBhY2thZ2VBcyBlY2xpcHNlXSAtIHNwZWNpZmllcyB0aGUgc291cmNlIHBhY2thZ2UKLSAqLwotcHVibGljIGNsYXNzIE1haW4KLXsKLQlwcml2YXRlIFN0cmluZyBidWlsZGVyRmlsZTsKLQlwcml2YXRlIFN0cmluZyBzdGFnZURpcjsKLQlwcml2YXRlIFN0cmluZyBwYWNrYWdlQXM7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVidWdNb2RlOwotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQluZXcgTWFpbigpLmV4ZWN1dGUoYXJncyk7Ci0JfQotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXByaXZhdGUgTWFpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKFN0cmluZ1tdIGFyZ3MpIHsKLQkJCi0JCXRoaXMuaW5pdGlhbGl6ZVdpdGgoYXJncyk7Ci0JCQotCQl0aGlzLmdlbmVyYXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlKCkgewotCi0JCURCV1NCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgREJXU0J1aWxkZXIoKTsKLQotICAgIAlEQldTQnVpbGRlck1vZGVsIG1vZGVsID0gdGhpcy5idWlsZEJ1aWxkZXJNb2RlbCh0aGlzLmJ1aWxkZXJGaWxlKTsKLQkJaWYobW9kZWwgPT0gbnVsbCkgewotCQkJdGhpcy5sb2dNZXNzYWdlKElORk8sIEpwdERid3NDb3JlTWVzc2FnZXMuTk9fR0VORVJBVElPTl9QRVJGT1JNRUQpOwotCSAgICAgICAgcmV0dXJuOwotCQl9Ci0KLSAgICAgICAgYnVpbGRlci5zZXRQcm9wZXJ0aWVzKG1vZGVsLnByb3BlcnRpZXMpOwotICAgICAgICBidWlsZGVyLnNldE9wZXJhdGlvbnMobW9kZWwub3BlcmF0aW9ucyk7Ci0KLSAgICAgICAgaWYoICEgdGhpcy5qZGJjRHJpdmVySXNPbkNsYXNzcGF0aChidWlsZGVyLmdldERyaXZlcigpKSkgewotICAgICAgICAJcmV0dXJuOwotICAgICAgICB9Ci0JCQotICAgICAgICBEQldTUGFja2FnZXIgcGFja2FnZXIgPSB0aGlzLmJ1aWxkRWNsaXBzZVBhY2thZ2VyKCk7Ci0gICAgICAgIAotICAgIAl0aGlzLmluaXRpYWxpemVQYWNrYWdlcihwYWNrYWdlciwgYnVpbGRlciwgdGhpcy5idWlsZFN0YWdlRGlyKHRoaXMuc3RhZ2VEaXIpKTsKLSAgICAJYnVpbGRlci5zZXRQYWNrYWdlcihwYWNrYWdlcik7Ci0gICAgCQotICAgICAgICB0cnkgewotCQkJYnVpbGRlci5zdGFydCgpOwotCQl9Ci0JCWNhdGNoKFdTRExFeGNlcHRpb24gZSkgewotCQkJdGhpcy5sb2dNZXNzYWdlKFNFVkVSRSwgSnB0RGJ3c0NvcmVNZXNzYWdlcy5XU0RMX0VYQ0VQVElPTiwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RPRE8gQ2xlYW4tdXAgU3RhZ2UgZGlyLiA/Ci0JCQl0aGlzLmxvZ01lc3NhZ2UoU0VWRVJFLCBKcHREYndzQ29yZU1lc3NhZ2VzLkdFTkVSQVRJT05fRkFJTEVELCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgcmV0dXJuOwotCQl9Ci0JCXRoaXMubG9nTWVzc2FnZShJTkZPLCBKcHREYndzQ29yZU1lc3NhZ2VzLkdFTkVSQVRJT05fQ09NUExFVEVEKTsKLSAgICAgICAgcmV0dXJuOwotCi0JfQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLSAgICAKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVdpdGgoU3RyaW5nW10gYXJncykgewotCQkKLSAgICAJdGhpcy5idWlsZGVyRmlsZSA9IHRoaXMuZ2V0QXJndW1lbnRCdWlsZGVyRmlsZShhcmdzKTsKLSAgICAJdGhpcy5zdGFnZURpciA9IHRoaXMuZ2V0QXJndW1lbnRTdGFnZURpcihhcmdzKTsKLSAgICAJdGhpcy5wYWNrYWdlQXMgPSB0aGlzLmdldEFyZ3VtZW50UGFja2FnZUFzKGFyZ3MpOwotCi0JCXRoaXMuaXNEZWJ1Z01vZGUgPSB0aGlzLmdldEFyZ3VtZW50RGVidWdNb2RlKGFyZ3MpOwotCX0KLQkgICAgCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVQYWNrYWdlcihEQldTUGFja2FnZXIgcGFja2FnZXIsIERCV1NCdWlsZGVyIGJ1aWxkZXIsIEZpbGUgc3RhZ2VEaXIpIHsKLQotICAgICAgICBwYWNrYWdlci5zZXREQldTQnVpbGRlcihidWlsZGVyKTsKLSAgICAgICAgcGFja2FnZXIuc2V0QXJjaGl2ZVVzZShpZ25vcmUpOwotICAgICAgICBwYWNrYWdlci5zZXRBZGRpdGlvbmFsQXJncyhudWxsKTsKLSAgICAgICAgcGFja2FnZXIuc2V0U3RhZ2VEaXIoc3RhZ2VEaXIpOwotICAgICAgICBwYWNrYWdlci5zZXRTZXNzaW9uc0ZpbGVOYW1lKGJ1aWxkZXIuZ2V0U2Vzc2lvbnNGaWxlTmFtZSgpKTsKLQl9Ci0gICAgCi0JcHJpdmF0ZSBEQldTQnVpbGRlck1vZGVsIGJ1aWxkQnVpbGRlck1vZGVsKFN0cmluZyBidWlsZGVyRmlsZU5hbWUpIHsKLQkJCi0gICAgCUZpbGUgYnVpbGRlckZpbGUgPSB0aGlzLmdldEJ1aWxkZXJGaWxlKGJ1aWxkZXJGaWxlTmFtZSk7Ci0JCXJldHVybiB0aGlzLnVubWFyc2hhbChidWlsZGVyRmlsZSk7Ci0JfQotCi0JcHJpdmF0ZSBEQldTQnVpbGRlck1vZGVsIHVubWFyc2hhbChGaWxlIGJ1aWxkZXJGaWxlKSB7Ci0gICAgICAgIGlmKChidWlsZGVyRmlsZSA9PSBudWxsKSB8fCAoICEgYnVpbGRlckZpbGUuZXhpc3RzKCkpKSB7Ci0gICAgICAgIAlyZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCQlYTUxDb250ZXh0IGNvbnRleHQgPSBuZXcgWE1MQ29udGV4dChuZXcgREJXU0J1aWxkZXJNb2RlbFByb2plY3QoKSk7Ci0gICAgICAgIFhNTFVubWFyc2hhbGxlciB1bm1hcnNoYWxsZXIgPSBjb250ZXh0LmNyZWF0ZVVubWFyc2hhbGxlcigpOwotICAgICAgICAKLSAgICAgICAgREJXU0J1aWxkZXJNb2RlbCBtb2RlbCA9IChEQldTQnVpbGRlck1vZGVsKXVubWFyc2hhbGxlci51bm1hcnNoYWwoYnVpbGRlckZpbGUpOwotICAgICAgICBpZihtb2RlbC5wcm9wZXJ0aWVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIAl0aGlzLmxvZ01lc3NhZ2UoU0VWRVJFLCBKcHREYndzQ29yZU1lc3NhZ2VzLk5PX09QRVJBVElPTlNfU1BFQ0lGSUVEKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtb2RlbDsKLQl9Ci0KLQlwcml2YXRlIEZpbGUgZ2V0QnVpbGRlckZpbGUoU3RyaW5nIGJ1aWxkZXJGaWxlTmFtZSkgewotCi0gICAgICAgIEZpbGUgYnVpbGRlckZpbGUgPSBuZXcgRmlsZShidWlsZGVyRmlsZU5hbWUpOwotICAgICAgICBpZiggISAoYnVpbGRlckZpbGUuZXhpc3RzKCkgJiYgYnVpbGRlckZpbGUuaXNGaWxlKCkpKSB7Ci0gICAgICAgIAl0aGlzLmxvZ01lc3NhZ2UoU0VWRVJFLCAKLSAgICAgICAgCQlKcHREYndzQ29yZU1lc3NhZ2VzLlVOQUJMRV9UT19MT0NBVEVfQlVJTERFUl9YTUwsIGJ1aWxkZXJGaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCXJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyRmlsZTsKLQl9Ci0JCi0JcHJpdmF0ZSBGaWxlIGJ1aWxkU3RhZ2VEaXIoU3RyaW5nIHN0YWdlRGlyTmFtZSkgewotICAgIAlGaWxlIGRpciA9IG5ldyBGaWxlKHN0YWdlRGlyTmFtZSk7Ci0gICAgICAgIGlmKCggISBkaXIuZXhpc3RzKCkpIHx8ICggISBkaXIuaXNEaXJlY3RvcnkoKSkpIHsKLSAgICAgICAgCWRpciA9IFRvb2xzLmJ1aWxkRGlyZWN0b3J5KHN0YWdlRGlyTmFtZSk7Ci0gICAgICAgIH0KLQkJcmV0dXJuIGRpcjsKLQl9Ci0JCi0JcHJpdmF0ZSBFY2xpcHNlUGFja2FnZXIgYnVpbGRFY2xpcHNlUGFja2FnZXIoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZVBhY2thZ2VyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJCQkgIC8vIG5vIG5lZWQgdG8gY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2Ygc3RhZ2VEaXIsIGV2ZXJ5dGhpbmcgaXMgaW4tbWVtb3J5Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGpkYmNEcml2ZXJJc09uQ2xhc3NwYXRoKFN0cmluZyBqZGJjRHJpdmVyTmFtZSkgewotCSAgICB0cnkgewotCQkJQ2xhc3MuZm9yTmFtZShqZGJjRHJpdmVyTmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgewotCQkJdGhpcy5sb2dNZXNzYWdlKFNFVkVSRSwgSnB0RGJ3c0NvcmVNZXNzYWdlcy5EUklWRVJfTk9UX09OX0NMQVNTUEFUSCwgamRiY0RyaXZlck5hbWUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9nTWVzc2FnZShMZXZlbCBsZXZlbCwgU3RyaW5nIGtleSwgT2JqZWN0IGFyZ3VtZW50KSB7Ci0JCVRvb2xzLmxvZ01lc3NhZ2UobGV2ZWwsIFRvb2xzLmJpbmQoa2V5LCBhcmd1bWVudCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9nTWVzc2FnZShMZXZlbCBsZXZlbCwgU3RyaW5nIGtleSkgewotCQlUb29scy5sb2dNZXNzYWdlKGxldmVsLCBUb29scy5nZXRTdHJpbmcoa2V5KSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBhcmd1bWVudCBxdWVyaWVzICoqKioqKioqKioKLQkKLQlwcml2YXRlIFN0cmluZyBnZXRBcmd1bWVudEJ1aWxkZXJGaWxlKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlyZXR1cm4gdGhpcy5nZXRBcmd1bWVudFZhbHVlKCItYnVpbGRlckZpbGUiLCBhcmdzKTsgICAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEFyZ3VtZW50U3RhZ2VEaXIoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmdldEFyZ3VtZW50VmFsdWUoIi1zdGFnZURpciIsIGFyZ3MpOyAgIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXJndW1lbnRQYWNrYWdlQXMoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmdldEFyZ3VtZW50VmFsdWUoIi1wYWNrYWdlQXMiLCBhcmdzKTsgICAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBnZXRBcmd1bWVudERlYnVnTW9kZShTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYXJndW1lbnRFeGlzdHMoIi1kZWJ1ZyIsIGFyZ3MpOyAgIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXJndW1lbnRWYWx1ZShTdHJpbmcgYXJnTmFtZSwgU3RyaW5nW10gYXJncykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhcmcgPSBhcmdzW2ldOwotCQkJaWYgKGFyZy5lcXVhbHMoYXJnTmFtZSkpIHsKLQkJCQlpbnQgaiA9IGkgKyAxOwotCQkJCWlmIChqIDwgYXJncy5sZW5ndGgpIHsKLQkJCQkJcmV0dXJuIGFyZ3Nbal07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gYXJndW1lbnRFeGlzdHMoU3RyaW5nIGFyZ05hbWUsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgYXJnID0gYXJnc1tpXTsKLQkJCWlmIChhcmcudG9Mb3dlckNhc2UoKS5lcXVhbHMoYXJnTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL2NvcmUvZ2VuL2ludGVybmFsL0pwdERid3NDb3JlTWVzc2FnZXMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvY29yZS9nZW4vaW50ZXJuYWwvSnB0RGJ3c0NvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjNmYTliLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvY29yZS9nZW4vaW50ZXJuYWwvSnB0RGJ3c0NvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogTG9jYWxpemVkIG1lc3NhZ2VzIHVzZWQgYnkgRGFsaSBEQldTIGdlbmVyYXRpb24gY29yZS4KLSAqLwotcHVibGljIGNsYXNzIEpwdERid3NDb3JlTWVzc2FnZXMKLXsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUSU9OX0NPTVBMRVRFRCA9ICJHRU5FUkFUSU9OX0NPTVBMRVRFRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVElPTl9GQUlMRUQgPSAiR0VORVJBVElPTl9GQUlMRUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0dFTkVSQVRJT05fUEVSRk9STUVEID0gIk5PX0dFTkVSQVRJT05fUEVSRk9STUVEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0VYQ0VQVElPTiA9ICJXU0RMX0VYQ0VQVElPTiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fT1BFUkFUSU9OU19TUEVDSUZJRUQgPSAiTk9fT1BFUkFUSU9OU19TUEVDSUZJRUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOQUJMRV9UT19MT0NBVEVfQlVJTERFUl9YTUwgPSAiVU5BQkxFX1RPX0xPQ0FURV9CVUlMREVSX1hNTCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX05PVF9PTl9DTEFTU1BBVEggPSAiRFJJVkVSX05PVF9PTl9DTEFTU1BBVEgiOwotCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4uaW50ZXJuYWwuanB0X2Rid3NfY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBKcHREYndzQ29yZU1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL2NvcmUvZ2VuL2ludGVybmFsL1Rvb2xzLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL2NvcmUvZ2VuL2ludGVybmFsL1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNDlkN2EuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay9jb3JlL2dlbi9pbnRlcm5hbC9Ub29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5TRVZFUkU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLS8qKgotICogIFRvb2xzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUb29scwotewotCS8qKiBlbXB0eSBzdHJpbmcgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfRElSRUNUT1JZID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOwkvLyROT04tTkxTLTEkCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgbnVsbCwgZW1wdHksIG9yIGNvbnRhaW5zCi0JICogb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRW1wdHkoU3RyaW5nIHN0cmluZykgewotCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ0lzRW1wdHlfKHN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4pOwotCX0JCi0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRW1wdHlfKGNoYXJbXSBzLCBpbnQgbGVuKSB7Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIENoYXJhY3Rlci5pc1doaXRlc3BhY2Uoc1tpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzaG9ydCBuYW1lIG1hbmlwdWxhdGlvbiAqKioqKioqKioqCi0KLQkKLQlwdWJsaWMgc3RhdGljIEZpbGUgYnVpbGREaXJlY3RvcnkoU3RyaW5nIGRpck5hbWUpIHsKLSAgICAJRmlsZSBjdXJyZW50RGlyID0gY3VycmVudFdvcmtpbmdEaXJlY3RvcnkoKTsKLSAgICAJRmlsZSBkaXIgPSBuZXcgRmlsZShjdXJyZW50RGlyLCBkaXJOYW1lKTsKLSAgICAJZGlyLm1rZGlyKCk7Ci0JCXJldHVybiBkaXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGZpbGUgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjdXJyZW50V29ya2luZ0RpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKFVTRVJfRElSRUNUT1JZKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBTdHJpcCB0aGUgZXh0ZW5zaW9uIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUKLQkgKiBhbmQgcmV0dXJuIHRoZSByZXN1bHQuIElmIHRoZSBmaWxlIG5hbWUgaGFzIG5vCi0JICogZXh0ZW5zaW9uLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQKLQkgKiBGaWxlI2Jhc2VQYXRoKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpcEV4dGVuc2lvbihTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaW50IGluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gZmlsZU5hbWU7Ci0JCX0KLQkJcmV0dXJuIGZpbGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0cmFjdERpcmVjdG9yeShTdHJpbmcgcGF0aCkgewotCQlpZiggISBwYXRoLmNvbnRhaW5zKEZpbGUuc2VwYXJhdG9yKSkgewotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsJCi0JCX0KLQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ01lc3NhZ2UoTGV2ZWwgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmKGxldmVsID09IFNFVkVSRSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCdcbicgKyBtZXNzYWdlKTsKLQkJfQotCQllbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbignXG4nICsgbWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLy8gKioqKioqKioqKiBOTFMgdXRpbGl0aWVzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBKcHREYndzQ29yZU1lc3NhZ2VzLmdldFN0cmluZyhrZXkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBrZXksIE9iamVjdCBhcmd1bWVudCkgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3VtZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL2NvcmUvZ2VuL2ludGVybmFsL2pwdF9kYndzX2NvcmUucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvY29yZS9nZW4vaW50ZXJuYWwvanB0X2Rid3NfY29yZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDlkNzBmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvY29yZS9nZW4vaW50ZXJuYWwvanB0X2Rid3NfY29yZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUdFTkVSQVRJT05fQ09NUExFVEVEID0gIERCV1NCdWlsZGVyIGdlbmVyYXRpb24gY29tcGxldGVkCi1HRU5FUkFUSU9OX0ZBSUxFRCA9ICBEQldTQnVpbGRlciBnZW5lcmF0aW9uIGZhaWxlZDogezB9Ci1OT19HRU5FUkFUSU9OX1BFUkZPUk1FRCA9ICBEQldTQnVpbGRlciBubyBnZW5lcmF0aW9uIHBlcmZvcm1lZAotV1NETF9FWENFUFRJT04gPSAgV1NETEV4Y2VwdGlvbjogezB9Ci1OT19PUEVSQVRJT05TX1NQRUNJRklFRCA9ICBObyBvcGVyYXRpb25zIHNwZWNpZmllZAotVU5BQkxFX1RPX0xPQ0FURV9CVUlMREVSX1hNTCA9ICBEQldTQnVpbGRlciB1bmFibGUgdG8gbG9jYXRlIGJ1aWxkZXIgWE1MIGZpbGU6ICB7MH0KLURSSVZFUl9OT1RfT05fQ0xBU1NQQVRIID0gIEpEQkMgZHJpdmVyIG5vdCBvbiBjbGFzc3BhdGg6IHswfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLy5jbGFzc3BhdGggYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZmNWRhOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanN0LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvLmN2c2lnbm9yZSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvLnByb2plY3QgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkM2I1N2YuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYTc1ZTIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNUdWUgTWFyIDA4IDEyOjA3OjA4IEVTVCAyMDExCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWZhOGVmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMjAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuSnB0RGJ3c1VpUGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4zLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kYndzLmJ1aWxkZXI7YnVuZGxlLXZlcnNpb249IlsyLjMuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWk7YnVuZGxlLXZlcnNpb249IlsxLjEuNTAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS40MDEsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNTAwLDIuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmdlbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLAotIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLndpemFyZHMuZ2VuO3gtaW50ZXJuYWw6PXRydWUKLUltcG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS50ZXh0O3ZlcnNpb249IjQuMC4xIgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2Fib3V0Lmh0bWwgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvYnVpbGQucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzdlYjVjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2NvbXBvbmVudC54bWwgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJmMmRiOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkiPjxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpIiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2NsaWVudF93ZWJzZXJ2X3dpei5naWYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2NsaWVudF93ZWJzZXJ2X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZTA1ZmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdjbGllbnRfd2Vic2Vydl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvb2JqMTYvWFNERmlsZS5naWYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC9vYmoxNi9YU0RGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwZWViNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC9vYmoxNi9YU0RGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL29iajE2L2R0ZGZpbGUuZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvb2JqMTYvZHRkZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMGFjYWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvb2JqMTYvZHRkZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC9vYmoxNi90ZXh0LmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL29iajE2L3RleHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmE3YTM4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL29iajE2L3RleHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL292cjE2L2Vycm9yX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOWRjY2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL3dpemJhbi93ZWJzZXJ2aWNlc2NsaWVudF93aXouZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3dlYnNlcnZpY2VzY2xpZW50X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YzE2YTAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3dlYnNlcnZpY2VzY2xpZW50X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYWIxYjIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1wbHVnaW5OYW1lPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBEQldTIFVJCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotZ2VuZXJhdGVEQldTID0gR2VuZXJhdGUgRGF0YWJhc2UgV2ViIFNlcnZpY2VzCi0KLWRid3NXaXphcmRDYXRlZ29yeU5hbWUgPSBEYXRhYmFzZSBXZWIgU2VydmljZXMKLQotZ2VuZXJhdGVEYndzRnJvbVhtbE5hbWUgPSBXZWIgU2VydmljZXMgZnJvbSBCdWlsZGVyIFhNTAotZ2VuZXJhdGVEYndzRnJvbVhtbERlc2MgPSBHZW5lcmF0ZSBXZWIgU2VydmljZXMgZnJvbSBCdWlsZGVyIFhNTAotCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnhtbCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzUyZDg2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTwhLS0KLSAgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICAgICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgIAotICAgICBDb250cmlidXRvcnM6IAotICAgICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci0KLTxwbHVnaW4+Ci0JCi0gCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KLQkJCi0JCTwhLS0gY29udHJpYnV0aW9ucyBmb3IgYW55IHBvcHVwIC0tPgotCQk8bWVudUNvbnRyaWJ1dGlvbgotCQkJbG9jYXRpb25VUkk9InBvcHVwOm9yZy5lY2xpcHNlLnVpLnBvcHVwLmFueSI+Ci0JCQkJCQkKLQkJCTxtZW51Ci0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYndzLnVpLm1lbnUuV2ViU2VydmljZXMiCi0JCQkJbGFiZWw9IiVkYndzV2l6YXJkQ2F0ZWdvcnlOYW1lIj4KLQkJCTwvbWVudT4KLQkJPC9tZW51Q29udHJpYnV0aW9uPgotCQkKLSAJPC9leHRlbnNpb24+Ci0KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotCi0JCTxjYXRlZ29yeQotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYndzIgotCQkJbmFtZT0iJWRid3NXaXphcmRDYXRlZ29yeU5hbWUiLz4KLQotIAkJPHdpemFyZAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYndzLnVpLndpemFyZC5nZW5lcmF0ZURid3MiCi0JCQluYW1lPSIlZ2VuZXJhdGVEYndzRnJvbVhtbE5hbWUiCi0gCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpwdC5kYndzIgotIAkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzLmdlbi5EYndzR2VuZXJhdG9yV2l6YXJkIgotCQkJaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L25ld2NsaWVudF93ZWJzZXJ2X3dpei5naWYiPgotCQkJCTxkZXNjcmlwdGlvbj4lZ2VuZXJhdGVEYndzRnJvbVhtbERlc2M8L2Rlc2NyaXB0aW9uPgotCQk8L3dpemFyZD4KLQotCTwvZXh0ZW5zaW9uPgotCQkJCi0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQotCQk8IS0tIGNvbnRyaWJ1dGlvbnMgdG8gdGhlICJHZW5lcmF0ZSIgc3VibWVudSAtLT4KLQkJPG9iamVjdENvbnRyaWJ1dGlvbgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS54c2RGaWxlQWN0aW9ucyIKLQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCW5hbWVGaWx0ZXI9IipidWlsZGVyLnhtbCI+Ci0JCQkKLQkJCTxmaWx0ZXIKLQkJCQluYW1lPSJwcm9qZWN0TmF0dXJlIgotCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIj4KLQkJCTwvZmlsdGVyPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgdmFsdWU9ImpzdC53ZWIiLz4KLQkJCTwvZW5hYmxlbWVudD4KLQkJCTxhY3Rpb24KLQkJCQlpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MudWkuZ2VuZXJhdGVEYndzIiAKLQkJCQlsYWJlbD0iJWdlbmVyYXRlREJXUyIKLQkJCQltZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanB0LmRid3MudWkubWVudS5XZWJTZXJ2aWNlcy9jb250ZW50IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5hY3Rpb25zLkdlbmVyYXRlRGJ3c0FjdGlvbiI+IAotCQkJPC9hY3Rpb24+IAotCQk8L29iamVjdENvbnRyaWJ1dGlvbj4KLQkJCi0JPC9leHRlbnNpb24+Ci0KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvcHJvcGVydHlfZmlsZXMvanB0X2Rid3NfdWkucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9wcm9wZXJ0eV9maWxlcy9qcHRfZGJ3c191aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDYyYzY3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9wcm9wZXJ0eV9maWxlcy9qcHRfZGJ3c191aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLQotIyBEYndzR2VuZXJhdG9yCi1EYndzR2VuZXJhdG9yV2l6YXJkX3RpdGxlID0gTmV3IERhdGFiYXNlIFdlYiBTZXJ2aWNlcyBmcm9tIEJ1aWxkZXIgWE1MCi1EYndzR2VuZXJhdG9yV2l6YXJkX2dlbmVyYXRpbmdEYndzID0gR2VuZXJhdGluZyBEYXRhYmFzZSBXZWIgU2VydmljZXMKLQotV2ViRHluYW1pY1Byb2plY3RXaXphcmRQYWdlX3RpdGxlID0gV2ViIER5bmFtaWMgUHJvamVjdAotV2ViRHluYW1pY1Byb2plY3RXaXphcmRQYWdlX2Rlc2MgPSBTcGVjaWZ5IHByb2plY3QgZm9yIERhdGFiYXNlIFdlYiBTZXJ2aWNlcwotV2ViRHluYW1pY1Byb2plY3RXaXphcmRQYWdlX2Rlc3RpbmF0aW9uUHJvamVjdCA9IFNlbGVjdCBkZXN0aW5hdGlvbiBwcm9qZWN0OgotCi1CdWlsZGVyWG1sV2l6YXJkUGFnZV90aXRsZSA9IFNlbGVjdCBCdWlsZGVyIFhNTCBGaWxlCi1CdWlsZGVyWG1sV2l6YXJkUGFnZV9kZXNjID0gU3BlY2lmeSBYTUwgZmlsZSB0byBnZW5lcmF0ZSBEYXRhYmFzZSBXZWIgU2VydmljZXMgZnJvbQotCi1CdWlsZGVyWG1sV2l6YXJkUGFnZV9lcnJvclVyaUNhbm5vdEJlTG9jYXRlZCA9IFRoZSBzZWxlY3RlZCBjYXRhbG9nIGVudHJ5IHNwZWNpZmllcyBhIFVSSSB0aGF0IGNhbiBub3QgYmUgbG9jYXRlZC4KLQotSmRiY0RyaXZlcldpemFyZFBhZ2VfdGl0bGUgPSBEcml2ZXIgZmlsZXMKLUpkYmNEcml2ZXJXaXphcmRQYWdlX2Rlc2MgPSBTcGVjaWZ5IGRyaXZlciBKQVIgZmlsZXMKLQotSmRiY0RyaXZlcldpemFyZFBhZ2VfZHJpdmVyRmlsZXMgPSBEcml2ZXIgZmlsZXM6Ci0KLUpkYmNEcml2ZXJXaXphcmRQYWdlX2FkZEJ1dHRvbiA9IEFkZC4uLgotSmRiY0RyaXZlcldpemFyZFBhZ2VfcmVtb3ZlQnV0dG9uID0gUmVtb3ZlCi0KLUpkYmNEcml2ZXJXaXphcmRQYWdlX2Nob29zZUFEcml2ZXJGaWxlID0gRHJpdmVyIEZpbGUgU2VsZWN0aW9uCi0KLURid3NHZW5lcmF0b3JVaV9ydW5uaW5nRGJ3c1dhcm5pbmdUaXRsZSA9IEdlbmVyYXRpbmcgRGF0YWJhc2UgV2ViIFNlcnZpY2VzCi1EYndzR2VuZXJhdG9yVWlfcnVubmluZ0Rid3NXYXJuaW5nTWVzc2FnZSA9IFwKLQkJV2FybmluZzogUnVubmluZyBEQldTIEJ1aWxkZXIgd2lsbCBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMgaW4geW91ciBwcm9qZWN0LlwKLQkJXG5cbkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjb250aW51ZT8KLQotRGJ3c0dlbmVyYXRvclVpX2Rid3NOb3RPbkNsYXNzcGF0aE1lc3NhZ2UgPSBcCi0JCVdhcm5pbmc6IERCV1MgQnVpbGRlciBpcyBub3Qgb24geW91ciBwcm9qZWN0IGNsYXNzcGF0aC5cCi0JCVxuXG5BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/Ci0KLURid3NHZW5lcmF0b3JVaV9ub3RKYXZhUHJvamVjdCA9IE5vdCBhIGphdmEgcHJvamVjdAotRGJ3c0dlbmVyYXRvclVpX25vdFdlYkR5bmFtaWNQcm9qZWN0ID0gTm90IGEgV2ViRHluYW1pYyBwcm9qZWN0Ci0KLUJ1aWxkZXJYbWxXaXphcmRQYWdlX3htbENhdGFsb2dUYWJsZVRpdGxlID0gWE1MIENhdGFsb2cKLUJ1aWxkZXJYbWxXaXphcmRQYWdlX3htbENhdGFsb2dLZXlDb2x1bW4gPSBLZXkKLUJ1aWxkZXJYbWxXaXphcmRQYWdlX3htbENhdGFsb2dVcmlDb2x1bW4gPSBVUkkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvZ2VuL0Rid3NHZW5lcmF0b3IuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9nZW4vRGJ3c0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzEzYWQ2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9nZW4vRGJ3c0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmdlbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwuZ2VuLkFic3RyYWN0SnB0R2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiAgRGJ3c0dlbmVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgRGJ3c0dlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0SnB0R2VuZXJhdG9yCi17Ci0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgTEFVTkNIX0NPTkZJR19OQU1FID0gIkRCV1MgR2VuIFJ1biBDb25maWciOyAgIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHVibGljIFN0cmluZyBEQldTX0dFTl9QQUNLQUdFX05BTUUgPSAib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4iOyAgIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHVibGljIFN0cmluZyBEQldTX0dFTl9DTEFTUyA9IERCV1NfR0VOX1BBQ0tBR0VfTkFNRSArICIuTWFpbiI7CSAgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgREJXU19HRU5fSkFSX1BSRUZJWCA9IERCV1NfR0VOX1BBQ0tBR0VfTkFNRSArICJfIjsJLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGJ1aWxkZXJGaWxlTmFtZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBzdGFnZURpck5hbWU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZHJpdmVySmFyTGlzdDsKLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZSgKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgCi0JCQlTdHJpbmcgYnVpbGRlckZpbGVOYW1lLCAKLQkJCVN0cmluZyBzdGFnZURpck5hbWUsIAotCQkJU3RyaW5nIGRyaXZlckphckxpc3QsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGphdmFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCW5ldyBEYndzR2VuZXJhdG9yKGphdmFQcm9qZWN0LCAKLQkJCWJ1aWxkZXJGaWxlTmFtZSwgCi0JCQlzdGFnZURpck5hbWUsIAotCQkJZHJpdmVySmFyTGlzdCkuZ2VuZXJhdGUobW9uaXRvcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBEYndzR2VuZXJhdG9yKAotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCAKLQkJCVN0cmluZyBidWlsZGVyRmlsZU5hbWUsIAotCQkJU3RyaW5nIHN0YWdlRGlyTmFtZSwgCi0JCQlTdHJpbmcgZHJpdmVySmFyTGlzdCkgewotCQlzdXBlcihqYXZhUHJvamVjdCk7Ci0JCXRoaXMuYnVpbGRlckZpbGVOYW1lID0gYnVpbGRlckZpbGVOYW1lOwotCQl0aGlzLnN0YWdlRGlyTmFtZSA9IHN0YWdlRGlyTmFtZTsKLQkJdGhpcy5kcml2ZXJKYXJMaXN0ID0gZHJpdmVySmFyTGlzdDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYWluVHlwZSgpIHsKLQkJcmV0dXJuIERCV1NfR0VOX0NMQVNTOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGF1bmNoQ29uZmlnTmFtZSgpIHsKLQkJcmV0dXJuIExBVU5DSF9DT05GSUdfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEJvb3RzdHJhcEphclByZWZpeCgpIHsKLQkJcmV0dXJuIERCV1NfR0VOX0pBUl9QUkVGSVg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcHJlR2VuZXJhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQkJCi0JfQotCi0JLy8gKioqKioqKioqKiBMYXVuY2ggQ29uZmlndXJhdGlvbiBTZXR1cCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGJ1aWxkQ2xhc3NwYXRoKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlMaXN0PFN0cmluZz4gY2xhc3NwYXRoID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCS8vIERCV1NfR2VuIGphcgotCQljbGFzc3BhdGguYWRkKHRoaXMuZ2V0Qm9vdHN0cmFwSmFyQ2xhc3NwYXRoRW50cnkoKS5nZXRNZW1lbnRvKCkpOwotCQkvLyBEZWZhdWx0IFByb2plY3QgY2xhc3NwYXRoCi0JCWNsYXNzcGF0aC5hZGQodGhpcy5nZXREZWZhdWx0UHJvamVjdENsYXNzcGF0aEVudHJ5KCkuZ2V0TWVtZW50bygpKTsKLQkJLy8gSkRCQyBqYXIKLQkJaWYoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmRyaXZlckphckxpc3QpKSB7Ci0JCQljbGFzc3BhdGguYWRkKHRoaXMuZ2V0SmRiY0phckNsYXNzcGF0aEVudHJ5KCkuZ2V0TWVtZW50bygpKTsKLQkJfQotCQkvLyBTeXN0ZW0gTGlicmFyeSAgCi0JCWNsYXNzcGF0aC5hZGQodGhpcy5nZXRTeXN0ZW1MaWJyYXJ5Q2xhc3NwYXRoRW50cnkoKS5nZXRNZW1lbnRvKCkpOwotCQlyZXR1cm4gY2xhc3NwYXRoOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzcGVjaWZ5UHJvZ3JhbUFyZ3VtZW50cygpIHsKLQotCQlTdHJpbmdCdWZmZXIgcHJvZ3JhbUFyZ3VtZW50cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQkvLyBidWlsZGVyRmlsZQotCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC1idWlsZGVyRmlsZSBcIiIpOwkgIC8vJE5PTi1OTFMtMSQKLQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQodGhpcy5idWlsZGVyRmlsZU5hbWUpOwotCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgnIicpOwotCi0JCS8vIHN0YWdlRGlyCi0JCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCIgLXN0YWdlRGlyIFwiIik7CSAgLy8kTk9OLU5MUy0xJAotCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCh0aGlzLnN0YWdlRGlyTmFtZSk7Ci0JCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCciJyk7Ci0KLQkJLy8gcGFja2FnZUFzCi0JCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCIgLXBhY2thZ2VBcyBlY2xpcHNlIik7CSAgLy8kTk9OLU5MUy0xJAotCi0JCXRoaXMubGF1bmNoQ29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9HUkFNX0FSR1VNRU5UUywgcHJvZ3JhbUFyZ3VtZW50cy50b1N0cmluZygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIElSdW50aW1lQ2xhc3NwYXRoRW50cnkgZ2V0SmRiY0phckNsYXNzcGF0aEVudHJ5KCkgewotCQlyZXR1cm4gZ2V0QXJjaGl2ZUNsYXNzcGF0aEVudHJ5KHRoaXMuYnVpbGRKZGJjSmFyUGF0aCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJUGF0aCBidWlsZEpkYmNKYXJQYXRoKCkgewotCQlyZXR1cm4gbmV3IFBhdGgodGhpcy5kcml2ZXJKYXJMaXN0KTsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL0pwdERid3NVaVBsdWdpbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9KcHREYndzVWlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjViMGY3NC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL0pwdERid3NVaVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKcHREYndzVWlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9DQVRBTE9HX0lEID0gWE1MQ29yZVBsdWdpbi5VU0VSX0NBVEFMT0dfSUQ7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NBVEFMT0dfSUQgPSBYTUxDb3JlUGx1Z2luLkRFRkFVTFRfQ0FUQUxPR19JRDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9DQVRBTE9HX0lEID0gWE1MQ29yZVBsdWdpbi5TWVNURU1fQ0FUQUxPR19JRDsgLy8kTk9OLU5MUy0xJAotCQotCS8vICoqKioqKioqKiogc2luZ2xldG9uICoqKioqKioqKioKLQlwcml2YXRlIHN0YXRpYyBKcHREYndzVWlQbHVnaW4gSU5TVEFOQ0U7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gUGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBKcHREYndzVWlQbHVnaW4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIElOU1RBTkNFLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgbnVsbCkpOwotICAgIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIHRocm93YWJsZSkpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIEltYWdlIEFQSSAqKioqKioqKioqCi0JLyoqCi0JICogVGhpcyBnZXRzIGEgLmdpZiBmcm9tIHRoZSBpY29ucyBmb2xkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJaWYgKCEga2V5LnN0YXJ0c1dpdGgoImljb25zLyIpKSB7Ci0JCQlrZXkgPSAiaWNvbnMvIiArIGtleTsKLQkJfQotCQlpZiAoISBrZXkuZW5kc1dpdGgoIi5naWYiKSkgewotCQkJa2V5ID0ga2V5ICsgIi5naWYiOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwga2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgYW4gaW1hZ2UgZm9yIGEgLmdpZiBmcm9tIHRoZSBpY29ucyBmb2xkZXIKLQkgKi8KLQkvL1RPRE8gd2UgYXJlIHVzaW5nIHRoZSBJbWFnZVJlZ2lzdHJ5IGhlcmUgYW5kIHN0b3JpbmcgYWxsIG91ciBpY29ucyBmb3IgdGhlIGxpZmUgb2YgdGhlIHBsdWdpbiwgCi0JLy93aGljaCBtZWFucyB1bnRpbCB0aGUgd29ya3NwYWNlIGlzIGNsb3NlZC4gIFRoaXMgaXMgYmV0dGVyIHRoYW4gYmVmb3JlIHdoZXJlIHdlIGNvbnN0YW50bHkgCi0JLy9jcmVhdGVkIG5ldyBpbWFnZXMuIEJ1ZyAzMDY0MzcgaXMgYWJvdXQgY2xlYW5pbmcgdGhpcyB1cCBhbmQgdXNpbmcgTG9jYWwgUmVzb3VyY2UgTWFuYWdlcnMgCi0JLy9vbiBvdXIgdmlld3Mgc28gdGhhdCBjbG9zaW5nIHRoZSBKUEEgcGVyc3BlY3RpdmUgd291bGQgbWVhbiBvdXIgaWNvbnMgYXJlIGRpc3Bvc2VkLgotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnkgPSBpbnN0YW5jZSgpLmdldEltYWdlUmVnaXN0cnkoKTsKLQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZVJlZ2lzdHJ5LmdldChrZXkpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJaW1hZ2VSZWdpc3RyeS5wdXQoa2V5LCBnZXRJbWFnZURlc2NyaXB0b3Ioa2V5KSk7Ci0JCQlpbWFnZSA9IGltYWdlUmVnaXN0cnkuZ2V0KGtleSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIFhNTENvcmVQbHVnaW4gQVBJICoqKioqKioqKioKLQkKLQlwdWJsaWMgSUNhdGFsb2cgZ2V0RGVmYXVsdFhNTENhdGFsb2coKSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBKcHREYndzVWlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmKElOU1RBTkNFICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9EYndzR2VuZXJhdG9yVWkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRGJ3c0dlbmVyYXRvclVpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMmU1ZTguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9EYndzR2VuZXJhdG9yVWkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuZ2VuLkRid3NHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5nZW4uRGJ3c0dlbmVyYXRvcldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2Uub3htLlhNTENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2Uub3htLlhNTFVubWFyc2hhbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS50b29scy5kYndzLkRCV1NCdWlsZGVyTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UudG9vbHMuZGJ3cy5EQldTQnVpbGRlck1vZGVsUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogIERid3NHZW5lcmF0b3JVaQotICovCi1wdWJsaWMgY2xhc3MgRGJ3c0dlbmVyYXRvclVpCi17Ci0JcHJpdmF0ZSBmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYnVpbGRlclhtbEZpbGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0ZBQ0VUX0lEID0gImpzdC53ZWIiOwkJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfUFJPUEVSVFkgPSAiZHJpdmVyIjsJCS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJXU19CVUlMREVSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UudG9vbHMuZGJ3cy5EQldTQnVpbGRlciI7CQkvLyROT04tTkxTLTEkCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZShJRmlsZSB4bWxGaWxlKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSB4bWxGaWxlLmdldFByb2plY3QoKTsKLQkJCi0JCWlmKCAhIHByb2plY3RJc1dlYkR5bmFtaWMocHJvamVjdCkpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKEpwdERid3NVaU1lc3NhZ2VzLkRid3NHZW5lcmF0b3JVaV9ub3RXZWJEeW5hbWljUHJvamVjdCk7Ci0JCX0KLQkJSVBhdGggeG1sUGF0aCA9IHhtbEZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQkKLQkJbmV3IERid3NHZW5lcmF0b3JVaShwcm9qZWN0LCB4bWxQYXRoLnRvT1NTdHJpbmcoKSkuZ2VuZXJhdGUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvamVjdElzV2ViRHluYW1pYyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0KLQkJIElQcm9qZWN0RmFjZXQgcHJvamVjdEZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KFdFQl9GQUNFVF9JRCk7Ci0gICAgICAgICBJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBudWxsOwotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLSAgICAgICAgIH0gCi0gICAgICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIChmYWNldGVkUHJvamVjdCA9PSBudWxsKSA/IGZhbHNlIDogZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KHByb2plY3RGYWNldCk7Ci0gICAgfQotICAgIAotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0V2ViQ29udGVudFBhdGgoSVByb2plY3QgcHJvamVjdCl7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlJUGF0aCBtb2R1bGVQYXRoID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCXJldHVybiBtb2R1bGVQYXRoOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkaXNwbGF5REJXU05vdE9uQ2xhc3NwYXRoV2FybmluZyhTaGVsbCBzaGVsbCkgewotCi0JCVN0cmluZyBtc2cgPSBKcHREYndzVWlNZXNzYWdlcy5EYndzR2VuZXJhdG9yVWlfZGJ3c05vdE9uQ2xhc3NwYXRoTWVzc2FnZTsKLQotCQlyZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oCi0JCQlzaGVsbCwKLQkJCUpwdERid3NVaU1lc3NhZ2VzLkRid3NHZW5lcmF0b3JVaV9ydW5uaW5nRGJ3c1dhcm5pbmdUaXRsZSwKLQkJCW1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRpc3BsYXlPdmVycmlkaW5nV2ViQ29udGVudFdhcm5pbmcoU2hlbGwgc2hlbGwpIHsKLQotCQlTdHJpbmcgbXNnID0gSnB0RGJ3c1VpTWVzc2FnZXMuRGJ3c0dlbmVyYXRvclVpX3J1bm5pbmdEYndzV2FybmluZ01lc3NhZ2U7Ci0KLQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKAotCQkJc2hlbGwsCi0JCQlKcHREYndzVWlNZXNzYWdlcy5EYndzR2VuZXJhdG9yVWlfcnVubmluZ0Rid3NXYXJuaW5nVGl0bGUsCi0JCQltc2cpOwotCX0KLSAgICAKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0gICAgCi0JcHJpdmF0ZSBEYndzR2VuZXJhdG9yVWkoSVByb2plY3Qgd2ViUHJvamVjdCwgU3RyaW5nIGJ1aWxkZXJYbWxGaWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmKHdlYlByb2plY3QgPT0gbnVsbCB8fCBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGJ1aWxkZXJYbWxGaWxlKSkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5qYXZhUHJvamVjdCA9IHRoaXMuZ2V0SmF2YVByb2plY3RGcm9tKHdlYlByb2plY3QpOwotCQlpZih0aGlzLmphdmFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKEpwdERid3NVaU1lc3NhZ2VzLkRid3NHZW5lcmF0b3JVaV9ub3RKYXZhUHJvamVjdCk7Ci0JCX0KLQkJdGhpcy5idWlsZGVyWG1sRmlsZSA9IGJ1aWxkZXJYbWxGaWxlOwotCX0KLQotCS8vICoqKioqKioqKiogZ2VuZXJhdGUgKioqKioqKioqKgotCS8qKgotCSAqIHByb21wdCB0aGUgdXNlciB3aXRoIGEgd2l6YXJkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGUoKSB7Ci0KLQkJaWYoICEgdGhpcy5kYndzSXNPbkNsYXNzcGF0aCgpKSB7Ci0JCQlpZiggISBkaXNwbGF5REJXU05vdE9uQ2xhc3NwYXRoV2FybmluZyh0aGlzLmdldEN1cnJlbnRTaGVsbCgpKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlpZih0aGlzLmNsYXNzSXNPblByb2plY3RzQ2xhc3NwYXRoKAotCQkJCQkJCXRoaXMuZ2V0RHJpdmVyTmFtZUZyb20odGhpcy5idWlsZGVyWG1sRmlsZSkpKSB7Ci0KLQkJCWlmKGRpc3BsYXlPdmVycmlkaW5nV2ViQ29udGVudFdhcm5pbmcodGhpcy5nZXRDdXJyZW50U2hlbGwoKSkpIHsKLQkJCQl0aGlzLnNjaGVkdWxlR2VuZXJhdGVEYndzSm9iKCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5vcGVuV2l6YXJkRGlhbG9nKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIG9wZW5XaXphcmREaWFsb2coKSB7Ci0KLQkJRGJ3c0dlbmVyYXRvcldpemFyZCB3aXphcmQgPSBuZXcgRGJ3c0dlbmVyYXRvcldpemFyZCh0aGlzLmphdmFQcm9qZWN0LCB0aGlzLmJ1aWxkZXJYbWxGaWxlKTsKLQkJd2l6YXJkLnNldFdpbmRvd1RpdGxlKEpwdERid3NVaU1lc3NhZ2VzLkRid3NHZW5lcmF0b3JXaXphcmRfdGl0bGUpOwotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyh0aGlzLmdldEN1cnJlbnRTaGVsbCgpLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWludCByZXR1cm5Db2RlID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYocmV0dXJuQ29kZSAhPSBXaW5kb3cuT0spIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXREcml2ZXJOYW1lRnJvbShTdHJpbmcgYnVpbGRlclhtbEZpbGUpIHsKLQkJdHJ5IHsKLQkJCURCV1NCdWlsZGVyTW9kZWwgbW9kZWwgPSB0aGlzLmJ1aWxkQnVpbGRlck1vZGVsKGJ1aWxkZXJYbWxGaWxlKTsKLQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcyA9IG1vZGVsLmdldFByb3BlcnRpZXMoKTsKLQkJCXJldHVybiBwcm9wZXJ0aWVzLmdldChEUklWRVJfUFJPUEVSVFkpOwotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgREJXU0J1aWxkZXJNb2RlbCBidWlsZEJ1aWxkZXJNb2RlbChTdHJpbmcgYnVpbGRlckZpbGVOYW1lKSB7Ci0JCVN0cmluZyBwcm9qZWN0RGlyTmFtZSA9IHRoaXMuamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotICAgIAlGaWxlIGJ1aWxkZXJGaWxlID0gdGhpcy5nZXRCdWlsZGVyRmlsZShwcm9qZWN0RGlyTmFtZSArIEZpbGUuc2VwYXJhdG9yICsgYnVpbGRlckZpbGVOYW1lKTsKLQkJcmV0dXJuIHRoaXMudW5tYXJzaGFsKGJ1aWxkZXJGaWxlKTsKLQl9Ci0KLQlwcml2YXRlIERCV1NCdWlsZGVyTW9kZWwgdW5tYXJzaGFsKEZpbGUgYnVpbGRlckZpbGUpIHsKLSAgICAgICAgaWYoKGJ1aWxkZXJGaWxlID09IG51bGwpIHx8ICggISBidWlsZGVyRmlsZS5leGlzdHMoKSkpIHsKLSAgICAgICAgCXJldHVybiBudWxsOwotICAgICAgICB9Ci0JCVhNTENvbnRleHQgY29udGV4dCA9IG5ldyBYTUxDb250ZXh0KG5ldyBEQldTQnVpbGRlck1vZGVsUHJvamVjdCgpKTsKLSAgICAgICAgWE1MVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlciA9IGNvbnRleHQuY3JlYXRlVW5tYXJzaGFsbGVyKCk7Ci0gICAgICAgIAotICAgICAgICBEQldTQnVpbGRlck1vZGVsIG1vZGVsID0gKERCV1NCdWlsZGVyTW9kZWwpdW5tYXJzaGFsbGVyLnVubWFyc2hhbChidWlsZGVyRmlsZSk7Ci0gICAgICAgIGlmKG1vZGVsID09IG51bGwgfHwgbW9kZWwucHJvcGVydGllcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1vZGVsOwotCX0KLQotCXByaXZhdGUgRmlsZSBnZXRCdWlsZGVyRmlsZShTdHJpbmcgYnVpbGRlckZpbGVOYW1lKSB7Ci0KLSAgICAgICAgRmlsZSBidWlsZGVyRmlsZSA9IG5ldyBGaWxlKGJ1aWxkZXJGaWxlTmFtZSk7Ci0gICAgICAgIGlmKCAhIChidWlsZGVyRmlsZS5leGlzdHMoKSAmJiBidWlsZGVyRmlsZS5pc0ZpbGUoKSkpIHsKLSAgICAgICAgCXJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGlmIHRoZSBnaXZlbiBjbGFzcyBpcyBvbiB0aGUgcHJvamVjdCdzIGNsYXNzcGF0aC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2xhc3NJc09uUHJvamVjdHNDbGFzc3BhdGgoU3RyaW5nIGRyaXZlck5hbWUpIHsKLQkJdHJ5IHsKLQkJCWlmKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZHJpdmVyTmFtZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlJVHlwZSBnZW5DbGFzcyA9IHRoaXMuamF2YVByb2plY3QuZmluZFR5cGUoZHJpdmVyTmFtZSk7Ci0JCQlyZXR1cm4gKGdlbkNsYXNzICE9IG51bGwpOwotCQl9IAotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgaWYgdGhlIERCV1MgYnVpbGRlciBpcyBvbiB0aGUgcHJvamVjdCdzIGNsYXNzcGF0aC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZGJ3c0lzT25DbGFzc3BhdGgoKSB7Ci0JCXRyeSB7Ci0JCQlJVHlwZSBnZW5DbGFzcyA9IHRoaXMuamF2YVByb2plY3QuZmluZFR5cGUoREJXU19CVUlMREVSX0NMQVNTX05BTUUpOwotCQkJcmV0dXJuIChnZW5DbGFzcyAhPSBudWxsKTsKLQkJfSAKLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3RGcm9tKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuICgoSUphdmFFbGVtZW50KSBwcm9qZWN0LmdldEFkYXB0ZXIoSUphdmFFbGVtZW50LmNsYXNzKSkuZ2V0SmF2YVByb2plY3QoKTsKLQl9Ci0KLQlwcml2YXRlIFNoZWxsIGdldEN1cnJlbnRTaGVsbCgpIHsKLQkgICAgcmV0dXJuIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNjaGVkdWxlR2VuZXJhdGVEYndzSm9iKCkgewotCi0JCVN0cmluZyBzdGFnZURpck5hbWUgPSB0aGlzLmphdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJCi0JCVdvcmtzcGFjZUpvYiBnZW5lcmF0ZUpvYiA9IG5ldyBHZW5lcmF0ZURid3NKb2IoCi0JCQl0aGlzLmphdmFQcm9qZWN0LAotCQkJdGhpcy5idWlsZGVyWG1sRmlsZSwKLQkJCXN0YWdlRGlyTmFtZSwKLQkJCW51bGwJCS8vIGRyaXZlckphckxpc3QKLQkJKTsKLQkJZ2VuZXJhdGVKb2Iuc2NoZWR1bGUoKTsJCi0JfQotCi0JLy8gKioqKioqKioqKiBnZW5lcmF0ZSBEQldTIGpvYiAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEdlbmVyYXRlRGJ3c0pvYiBleHRlbmRzIFdvcmtzcGFjZUpvYiB7Ci0JCXByaXZhdGUgZmluYWwgSUphdmFQcm9qZWN0IHByb2plY3Q7Ci0JCWZpbmFsIFN0cmluZyBidWlsZGVyRmlsZU5hbWU7Ci0JCWZpbmFsIFN0cmluZyBzdGFnZURpck5hbWU7Ci0JCWZpbmFsIFN0cmluZyBkcml2ZXJKYXJMaXN0OwotCi0JCXB1YmxpYyBHZW5lcmF0ZURid3NKb2IoSUphdmFQcm9qZWN0IHByb2plY3QsIFN0cmluZyBidWlsZGVyRmlsZU5hbWUsIFN0cmluZyBzdGFnZURpck5hbWUsIFN0cmluZyBkcml2ZXJKYXJMaXN0KSB7Ci0JCQlzdXBlcihKcHREYndzVWlNZXNzYWdlcy5EYndzR2VuZXJhdG9yV2l6YXJkX2dlbmVyYXRpbmdEYndzKTsKLQotCQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdCA7Ci0JCQl0aGlzLmJ1aWxkZXJGaWxlTmFtZSA9IGJ1aWxkZXJGaWxlTmFtZTsKLQkJCXRoaXMuc3RhZ2VEaXJOYW1lID0gc3RhZ2VEaXJOYW1lOwotCQkJdGhpcy5kcml2ZXJKYXJMaXN0ID0gZHJpdmVySmFyTGlzdDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSVN0YXR1cyBydW5JbldvcmtzcGFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCURid3NHZW5lcmF0b3IuZ2VuZXJhdGUodGhpcy5wcm9qZWN0LCB0aGlzLmJ1aWxkZXJGaWxlTmFtZSwgdGhpcy5zdGFnZURpck5hbWUsIHRoaXMuZHJpdmVySmFyTGlzdCwgbW9uaXRvcik7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0pwdERid3NVaUljb25zLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0pwdERid3NVaUljb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YmVkYTguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9KcHREYndzVWlJY29ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKcHREYndzVWlJY29ucwotewotCS8vICoqKioqKioqKioqKioqKiogV2l6YXJkIGljb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERCV1NfR0VOX1dJWl9CQU5ORVIgPSAiZnVsbC93aXpiYW4vd2Vic2VydmljZXNjbGllbnRfd2l6IjsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvSnB0RGJ3c1VpTWVzc2FnZXMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvSnB0RGJ3c1VpTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYxMGVhYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0pwdERid3NVaU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIExvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IERhbGkgREJXUyBVSS4KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqLwotcHVibGljIGNsYXNzIEpwdERid3NVaU1lc3NhZ2VzIHsKLQkKLQkvLyBEYndzR2VuZXJhdG9yCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGJ3c0dlbmVyYXRvcldpemFyZF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYndzR2VuZXJhdG9yV2l6YXJkX2dlbmVyYXRpbmdEYndzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2ViRHluYW1pY1Byb2plY3RXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYkR5bmFtaWNQcm9qZWN0V2l6YXJkUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYkR5bmFtaWNQcm9qZWN0V2l6YXJkUGFnZV9kZXN0aW5hdGlvblByb2plY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdWlsZGVyWG1sV2l6YXJkUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdWlsZGVyWG1sV2l6YXJkUGFnZV9kZXNjOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1aWxkZXJYbWxXaXphcmRQYWdlX2Vycm9yVXJpQ2Fubm90QmVMb2NhdGVkOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNEcml2ZXJXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNEcml2ZXJXaXphcmRQYWdlX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjRHJpdmVyV2l6YXJkUGFnZV9kcml2ZXJGaWxlczsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjRHJpdmVyV2l6YXJkUGFnZV9hZGRCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmRiY0RyaXZlcldpemFyZFBhZ2VfcmVtb3ZlQnV0dG9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNEcml2ZXJXaXphcmRQYWdlX2Nob29zZUFEcml2ZXJGaWxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERid3NHZW5lcmF0b3JVaV9ydW5uaW5nRGJ3c1dhcm5pbmdUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYndzR2VuZXJhdG9yVWlfcnVubmluZ0Rid3NXYXJuaW5nTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYndzR2VuZXJhdG9yVWlfZGJ3c05vdE9uQ2xhc3NwYXRoTWVzc2FnZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYndzR2VuZXJhdG9yVWlfbm90SmF2YVByb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGJ3c0dlbmVyYXRvclVpX25vdFdlYkR5bmFtaWNQcm9qZWN0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1aWxkZXJYbWxXaXphcmRQYWdlX3htbENhdGFsb2dUYWJsZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1aWxkZXJYbWxXaXphcmRQYWdlX3htbENhdGFsb2dLZXlDb2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVpbGRlclhtbFdpemFyZFBhZ2VfeG1sQ2F0YWxvZ1VyaUNvbHVtbjsKLQotCi0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF9kYndzX3VpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdERid3NVaU1lc3NhZ2VzLmNsYXNzOwotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7Ci0JfQotCi0JcHJpdmF0ZSBKcHREYndzVWlNZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVEYndzQWN0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVEYndzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZmVlNmIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9hY3Rpb25zL0dlbmVyYXRlRGJ3c0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5EYndzR2VuZXJhdG9yVWk7Ci0KLS8qKgotICogIEdlbmVyYXRlRGJ3c0FjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVEYndzQWN0aW9uIGV4dGVuZHMgT2JqZWN0QWN0aW9uCi17Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElGaWxlIHhtbEZpbGUpIHsKLQotCQlEYndzR2VuZXJhdG9yVWkuZ2VuZXJhdGUoeG1sRmlsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2FjdGlvbnMvT2JqZWN0QWN0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2FjdGlvbnMvT2JqZWN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOTBmMWUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9hY3Rpb25zL09iamVjdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiAgR2VuZXJhdGVFbnRpdGllc0FjdGlvbgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgT2JqZWN0QWN0aW9uIGV4dGVuZHMgQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgCi17Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb247Ci0KLQlwdWJsaWMgT2JqZWN0QWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKHRoaXMuY3VycmVudFNlbGVjdGlvbiBpbnN0YW5jZW9mIElUcmVlU2VsZWN0aW9uKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPD8+IHN0cmVhbSA9ICgoSVRyZWVTZWxlY3Rpb24pIHRoaXMuY3VycmVudFNlbGVjdGlvbikuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy5leGVjdXRlKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCQotCQlpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJdGhpcy5leGVjdXRlKChJRmlsZSlzZWxlY3Rpb24pOwotCQl9Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJRmlsZSBmaWxlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9CdWlsZGVyWG1sV2l6YXJkUGFnZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9CdWlsZGVyWG1sV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWIyM2ZjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vQnVpbGRlclhtbFdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpemFyZHMuSmF2YVByb2plY3RXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkpwdERid3NVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci0KLS8qKgotICogIEJ1aWxkZXJYbWxXaXphcmRQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWlsZGVyWG1sV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCQotCXByaXZhdGUgZmluYWwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbjsKLQlwcml2YXRlIElQcm9qZWN0IHRhcmdldFByb2plY3Q7Ci0JCi0JcHJvdGVjdGVkIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsIHNlbGVjdFNvdXJjZVBhbmVsOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBicm93c2VYTUxGaWx0ZXJFeHRlbnNpb25zID0geyIueG1sIn07IC8vJE5PTi1OTFMtMSQKLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZCAqKioqKioqKioqCi0JCi0gICAgcHVibGljIHN0YXRpYyBJRmlsZSBnZXRCdWlsZGVyWG1sRnJvbVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGZpcnN0RWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCVN0cmluZyBlbGVtZW50RXh0ZW5zaW9uID0gKChJRmlsZSlmaXJzdEVsZW1lbnQpLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCWlmKGVsZW1lbnRFeHRlbnNpb24gIT0gbnVsbCkgewotCQkJCWlmKGJyb3dzZVhNTEZpbHRlckV4dGVuc2lvbnNbMF0uZW5kc1dpdGgoZWxlbWVudEV4dGVuc2lvbikpIHsKLQkJCQkJcmV0dXJuICgoSUZpbGUpZmlyc3RFbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gICAgfQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0gICAgCi0JQnVpbGRlclhtbFdpemFyZFBhZ2UoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKCJCdWlsZGVyWG1sV2l6YXJkUGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQotCQl0aGlzLmluaXRpYWxTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCQotCS8vICoqKioqKioqKiogSURpYWxvZ1BhZ2UgaW1wbGVtZW50YXRpb24gICoqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0vLwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEhFTFBfQ09OVEVYVF9JRCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdGhpcy5zZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0KLQkJdGhpcy5zZWxlY3RTb3VyY2VQYW5lbCA9IG5ldyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbChjb21wb3NpdGUsIHRoaXMuaW5pdGlhbFNlbGVjdGlvbik7Ci0JCXRoaXMuc2VsZWN0U291cmNlUGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQlTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5QYW5lbExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLlBhbmVsTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0aW9uU3RhdGVDaGFuZ2VkKCkgewotCQkJCXNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsQ2hhbmdlZCgpOwotCQkJfQotCQl9OwotCQl0aGlzLnNlbGVjdFNvdXJjZVBhbmVsLnNldExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWlmKHZpc2libGUpIHsKLQotCSAgICAJaWYodGhpcy5nZXRCdWlsZGVyWG1sKCkgIT0gbnVsbCkgewotCSAgICAJCXRoaXMuc2VsZWN0U291cmNlUGFuZWwuc2V0U2luZ2xlRmlsZVZpZXdEZWZhdWx0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRoaXMuZ2V0QnVpbGRlclhtbCgpKSk7Ci0JICAgIAl9Ci0JICAgIAllbHNlIHsKLQkgICAgCQl0aGlzLnVwZGF0ZVRhcmdldFByb2plY3QoKTsKLQkJICAgIAlJRmlsZSBzY2hlbWEgPSBnZXRCdWlsZGVyWG1sRnJvbVNlbGVjdGlvbih0aGlzLmluaXRpYWxTZWxlY3Rpb24pOwotCQkgICAgCWlmKHNjaGVtYSAhPSBudWxsKSB7Ci0JCSAgICAJCXRoaXMuc2VsZWN0U291cmNlUGFuZWwuc2V0U2luZ2xlRmlsZVZpZXdEZWZhdWx0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNjaGVtYSkpOwotCQkgICAgCX0KLQkJICAgIAllbHNlIHsKLQkJICAgIAkJdGhpcy5zZWxlY3RTb3VyY2VQYW5lbC5zZXRTaW5nbGVGaWxlVmlld0RlZmF1bHRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGhpcy50YXJnZXRQcm9qZWN0KSk7Ci0JCSAgICAJfQotCSAgICAJfQotCSAgICAJdGhpcy5zZWxlY3RTb3VyY2VQYW5lbC51cGRhdGUoKTsKLQkJCQotCQkJdGhpcy5zZXRUaXRsZShKcHREYndzVWlNZXNzYWdlcy5CdWlsZGVyWG1sV2l6YXJkUGFnZV90aXRsZSk7Ci0JCQl0aGlzLnNldERlc2NyaXB0aW9uKEpwdERid3NVaU1lc3NhZ2VzLkJ1aWxkZXJYbWxXaXphcmRQYWdlX2Rlc2MpOwotCQkJdGhpcy5zZWxlY3RTb3VyY2VQYW5lbC5zZXRGaWx0ZXJFeHRlbnNpb25zKGJyb3dzZVhNTEZpbHRlckV4dGVuc2lvbnMpOwotCQl9Ci0JCXRoaXMuc2VsZWN0U291cmNlUGFuZWwuc2V0VmlzaWJsZUhlbHBlcih2aXNpYmxlKTsKLQl9Ci0gICAgCi0JLy8gKioqKioqKioqKiBJV2l6YXJkUGFnZSBpbXBsZW1lbnRhdGlvbiAgKioqKioqKioqKgotICAgIAotICAgIEBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCi0JCXJldHVybiB0aGlzLnNjaGVtYU9yVXJpU2VsZWN0ZWQoKSAmJiAodGhpcy5nZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludHJhLXdpemFyZCBtZXRob2RzICoqKioqKioqKioKLQkKLQlwdWJsaWMgSUZpbGUgZ2V0QnVpbGRlclhtbCgpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0U291cmNlUGFuZWwuZ2V0RmlsZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlVVJJKCkgewotCQlTdHJpbmcgdXJpID0gdGhpcy5zZWxlY3RTb3VyY2VQYW5lbC5nZXRYTUxDYXRhbG9nVVJJKCk7Ci0JCWlmKHVyaSA9PSBudWxsKSB7Ci0JCQlJRmlsZSBmaWxlID0gdGhpcy5zZWxlY3RTb3VyY2VQYW5lbC5nZXRGaWxlKCk7Ci0JCQlpZihmaWxlICE9IG51bGwpIHsKLQkJCQl1cmkgPSBVUklIZWxwZXIuZ2V0UGxhdGZvcm1VUkkoZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVRhcmdldFByb2plY3QoKSB7Ci0gICAgCUlXaXphcmRQYWdlIHByZXZpb3VzUGFnZSA9IHRoaXMuZ2V0UHJldmlvdXNQYWdlKCk7Ci0gICAgCQotCQlpZihwcmV2aW91c1BhZ2UgaW5zdGFuY2VvZiBKYXZhUHJvamVjdFdpemFyZFBhZ2UpIHsKLQkJCS8vIGdldCBwcm9qZWN0IGZyb20gcHJldmlvdXNQYWdlCi0JCQl0aGlzLnRhcmdldFByb2plY3QgPSAoKChKYXZhUHJvamVjdFdpemFyZFBhZ2UpcHJldmlvdXNQYWdlKS5nZXRKYXZhUHJvamVjdCgpKS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJZWxzZSBpZihpbml0aWFsU2VsZWN0aW9uICE9IG51bGwgJiYgISB0aGlzLmluaXRpYWxTZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkvLyBubyBwcmV2aW91c1BhZ2UgLSBnZXQgcHJvamVjdCBmcm9tIGluaXRpYWxTZWxlY3Rpb24KLQkJCXRoaXMudGFyZ2V0UHJvamVjdCA9IHRoaXMuZ2V0UHJvamVjdEZyb21Jbml0aWFsU2VsZWN0aW9uKCk7Ci0JCX0JCQotCX0KLQkKLSAgICBwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3RGcm9tSW5pdGlhbFNlbGVjdGlvbigpIHsKLQkJT2JqZWN0IGZpcnN0RWxlbWVudCA9IGluaXRpYWxTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQlyZXR1cm4gKElQcm9qZWN0KWZpcnN0RWxlbWVudDsKLQkJfQotCQllbHNlIGlmKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJcmV0dXJuICgoSVJlc291cmNlKSBmaXJzdEVsZW1lbnQpLmdldFByb2plY3QoKTsKLQkJfQotCQllbHNlIGlmKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkgewotCQkJcmV0dXJuICgoSUphdmFFbGVtZW50KWZpcnN0RWxlbWVudCkuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gICAgfQotCi0JcHJpdmF0ZSBib29sZWFuIHNjaGVtYU9yVXJpU2VsZWN0ZWQoKSB7Ci0JCXJldHVybiAoKHRoaXMuZ2V0QnVpbGRlclhtbCgpICE9IG51bGwpIHx8ICh0aGlzLmdldFNvdXJjZVVSSSgpICE9IG51bGwpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjb21wdXRlRXJyb3JNZXNzYWdlKCkgewotCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJU3RyaW5nIHVyaSA9IHRoaXMuZ2V0U291cmNlVVJJKCk7Ci0JCWlmKHVyaSAhPSBudWxsKSB7Ci0JCQlpZiggISBVUklIZWxwZXIuaXNSZWFkYWJsZVVSSSh1cmksIGZhbHNlKSkgewotCQkJCWVycm9yTWVzc2FnZSA9IEpwdERid3NVaU1lc3NhZ2VzLkJ1aWxkZXJYbWxXaXphcmRQYWdlX2Vycm9yVXJpQ2Fubm90QmVMb2NhdGVkOwotCQkJfQotCQl9Ci0JCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsQ2hhbmdlZCgpIHsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IHRoaXMuY29tcHV0ZUVycm9yTWVzc2FnZSgpOwotCQl0aGlzLnNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCQl0aGlzLnNldFBhZ2VDb21wbGV0ZSh0aGlzLmlzUGFnZUNvbXBsZXRlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vRGJ3c0dlbmVyYXRvcldpemFyZC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9EYndzR2VuZXJhdG9yV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOTFlMDAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9EYndzR2VuZXJhdG9yV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuSnB0RGJ3c1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkRid3NHZW5lcmF0b3JVaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5KcHREYndzVWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5KcHREYndzVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQ7Ci0KLS8qKgotICogIERid3NHZW5lcmF0b3JXaXphcmQKLSAqLwotcHVibGljIGNsYXNzIERid3NHZW5lcmF0b3JXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJV29ya2JlbmNoV2l6YXJkIHsKLQotCXByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotCXByaXZhdGUgU3RyaW5nIGJ1aWxkZXJYbWxGaWxlOwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCQotCXByaXZhdGUgV2ViRHluYW1pY1Byb2plY3RXaXphcmRQYWdlIHByb2plY3RXaXphcmRQYWdlOwotCXByaXZhdGUgQnVpbGRlclhtbFdpemFyZFBhZ2UgYnVpbGRlclhtbFdpemFyZFBhZ2U7Ci0KLQkvLyBEaWFsb2cgc3RvcmUgaWQgY29uc3RhbnQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX05BTUUgPSBEYndzR2VuZXJhdG9yV2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJXU19TRUNUSU9OX05BTUUgPSAiRGJ3c1NldHRpbmdzIjsJCS8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSmRiY0RyaXZlcldpemFyZFBhZ2UgamRiY0RyaXZlcnNQYWdlOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHVibGljIERid3NHZW5lcmF0b3JXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCQotCXB1YmxpYyBEYndzR2VuZXJhdG9yV2l6YXJkKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIGJ1aWxkZXJYbWxGaWxlKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5qYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotCQl0aGlzLmJ1aWxkZXJYbWxGaWxlID0gYnVpbGRlclhtbEZpbGU7Ci0KLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZih0aGlzLmdldERpYWxvZ1NldHRpbmdzKCkgPT0gbnVsbCkgewotCQkJSURpYWxvZ1NldHRpbmdzIGRid3NTZXR0aW5ncyA9IEpwdERid3NVaVBsdWdpbi5pbnN0YW5jZSgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCQlJRGlhbG9nU2V0dGluZ3Mgd2l6YXJkU2V0dGluZ3MgPSBkYndzU2V0dGluZ3MuZ2V0U2VjdGlvbihEQldTX1NFQ1RJT05fTkFNRSk7Ci0JCQlpZih3aXphcmRTZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQkJd2l6YXJkU2V0dGluZ3MgPSBkYndzU2V0dGluZ3MuYWRkTmV3U2VjdGlvbihEQldTX1NFQ1RJT05fTkFNRSk7Ci0JCQl9Ci0JCQl0aGlzLnNldERpYWxvZ1NldHRpbmdzKHdpemFyZFNldHRpbmdzKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogSVdvcmtiZW5jaFdpemFyZCBpbXBsZW1lbnRhdGlvbiAgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCi0JCXRoaXMuc2V0V2luZG93VGl0bGUoSnB0RGJ3c1VpTWVzc2FnZXMuRGJ3c0dlbmVyYXRvcldpemFyZF90aXRsZSk7Ci0KLQkJdGhpcy5zZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKcHREYndzVWlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKEpwdERid3NVaUljb25zLkRCV1NfR0VOX1dJWl9CQU5ORVIpKTsKLQkJdGhpcy5zZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIElXaXphcmQgaW1wbGVtZW50YXRpb24gICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc3VwZXIuYWRkUGFnZXMoKTsKLQotCQlpZih0aGlzLnNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQkvLyBXZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2UKLQkJCXRoaXMuamF2YVByb2plY3QgPSB0aGlzLmdldEphdmFQcm9qZWN0RnJvbVNlbGVjdGlvbih0aGlzLnNlbGVjdGlvbik7Ci0KLQkJCXRoaXMucHJvamVjdFdpemFyZFBhZ2UgPSB0aGlzLmJ1aWxkV2ViRHluYW1pY1Byb2plY3RQYWdlKHRoaXMuamF2YVByb2plY3QpOwotCQkJdGhpcy5hZGRQYWdlKHRoaXMucHJvamVjdFdpemFyZFBhZ2UpOwotCi0JCQkvLyBCdWlsZGVyWG1sV2l6YXJkUGFnZQotCQkJSUZpbGUgYnVpbGRlclhtbFNlbGVjdGVkID0gQnVpbGRlclhtbFdpemFyZFBhZ2UuZ2V0QnVpbGRlclhtbEZyb21TZWxlY3Rpb24odGhpcy5zZWxlY3Rpb24pOwotCQkJaWYoYnVpbGRlclhtbFNlbGVjdGVkID09IG51bGwpIHsKLQkJCQl0aGlzLmJ1aWxkZXJYbWxXaXphcmRQYWdlID0gdGhpcy5idWlsZEJ1aWxkZXJYbWxQYWdlKHRoaXMuc2VsZWN0aW9uKTsKLQkJCQl0aGlzLmFkZFBhZ2UodGhpcy5idWlsZGVyWG1sV2l6YXJkUGFnZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmJ1aWxkZXJYbWxGaWxlID0gdGhpcy5tYWtlUmVsYXRpdmVUb1Byb2plY3RQYXRoKGJ1aWxkZXJYbWxTZWxlY3RlZC5nZXRGdWxsUGF0aCgpKTsKLQkJCX0KLQkJfQotCQkvLyBKZGJjRHJpdmVyV2l6YXJkUGFnZQotCQl0aGlzLmpkYmNEcml2ZXJzUGFnZSA9IHRoaXMuYnVpbGRKZGJjRHJpdmVyc1BhZ2UoKTsKLQkJdGhpcy5hZGRQYWdlKHRoaXMuamRiY0RyaXZlcnNQYWdlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJCi0JCVdpemFyZFBhZ2UgY3VycmVudFBhZ2UgPSAoV2l6YXJkUGFnZSlnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpOwotCQlpZihjdXJyZW50UGFnZSAhPSBudWxsKSB7Ci0JCQlpZiggISBjdXJyZW50UGFnZS5pc1BhZ2VDb21wbGV0ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGRyaXZlckphckxpc3QgPSB0aGlzLmpkYmNEcml2ZXJzUGFnZS5nZXREcml2ZXJKYXJMaXN0KCk7Ci0JCXRoaXMuamRiY0RyaXZlcnNQYWdlLmZpbmlzaCgpOwkvLyBwZXJzaXN0IHNldHRpbmdzCi0KLQkJaWYoRGJ3c0dlbmVyYXRvclVpLmRpc3BsYXlPdmVycmlkaW5nV2ViQ29udGVudFdhcm5pbmcodGhpcy5nZXRTaGVsbCgpKSkgewotCQkJdGhpcy5nZW5lcmF0ZURid3MoZHJpdmVySmFyTGlzdCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotICAgIAotCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgotICAgIAotCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCWlmKHRoaXMucHJvamVjdFdpemFyZFBhZ2UgIT0gbnVsbCkgewotCQkJdGhpcy5qYXZhUHJvamVjdCA9IHRoaXMucHJvamVjdFdpemFyZFBhZ2UuZ2V0SmF2YVByb2plY3QoKTsKLQkJfQotICAgIAlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdDsKLSAgICB9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJ1aWxkZXJYbWxQYXRoT3JVcmkoKSB7Ci0JCWlmKHRoaXMuYnVpbGRlclhtbFdpemFyZFBhZ2UgIT0gbnVsbCkgewotCQkJSUZpbGUgeG1sRmlsZSA9IHRoaXMuYnVpbGRlclhtbFdpemFyZFBhZ2UuZ2V0QnVpbGRlclhtbCgpOwotCQkJaWYoeG1sRmlsZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoaXMubWFrZVJlbGF0aXZlVG9Qcm9qZWN0UGF0aCh4bWxGaWxlLmdldEZ1bGxQYXRoKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRlclhtbFdpemFyZFBhZ2UuZ2V0U291cmNlVVJJKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYnVpbGRlclhtbEZpbGU7Ci0JfQotCQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIFdlYkR5bmFtaWNQcm9qZWN0V2l6YXJkUGFnZSBidWlsZFdlYkR5bmFtaWNQcm9qZWN0UGFnZShJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJCi0JCVdlYkR5bmFtaWNQcm9qZWN0V2l6YXJkUGFnZSBwcm9qZWN0V2l6YXJkUGFnZSA9IG5ldyBXZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2UoamF2YVByb2plY3QpOwotCQlwcm9qZWN0V2l6YXJkUGFnZS5zZXRUaXRsZShKcHREYndzVWlNZXNzYWdlcy5XZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2VfdGl0bGUpOwotCQlwcm9qZWN0V2l6YXJkUGFnZS5zZXREZXNjcmlwdGlvbihKcHREYndzVWlNZXNzYWdlcy5XZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2VfZGVzYyk7Ci0JCXByb2plY3RXaXphcmRQYWdlLnNldERlc3RpbmF0aW9uTGFiZWwoSnB0RGJ3c1VpTWVzc2FnZXMuV2ViRHluYW1pY1Byb2plY3RXaXphcmRQYWdlX2Rlc3RpbmF0aW9uUHJvamVjdCk7Ci0KLQkJcmV0dXJuIHByb2plY3RXaXphcmRQYWdlOwotCX0KLQotCXByaXZhdGUgQnVpbGRlclhtbFdpemFyZFBhZ2UgYnVpbGRCdWlsZGVyWG1sUGFnZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBCdWlsZGVyWG1sV2l6YXJkUGFnZShzZWxlY3Rpb24pOwotCX0KLQkKLQlwcml2YXRlIEpkYmNEcml2ZXJXaXphcmRQYWdlIGJ1aWxkSmRiY0RyaXZlcnNQYWdlKCkgewotCQlyZXR1cm4gbmV3IEpkYmNEcml2ZXJXaXphcmRQYWdlKFdJWkFSRF9OQU1FKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBtYWtlUmVsYXRpdmVUb1Byb2plY3RQYXRoKElQYXRoIHBhdGgpIHsKLQkJSVBhdGggcmVsYXRpdmVQYXRoID0gcGF0aC5tYWtlUmVsYXRpdmVUbyh0aGlzLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkpOwotCQlyZXR1cm4gcmVsYXRpdmVQYXRoLnRvT1NTdHJpbmcoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlRGJ3cyhTdHJpbmcgZHJpdmVySmFyTGlzdCkgewotCi0JCVN0cmluZyBzdGFnZURpck5hbWUgPSB0aGlzLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCi0JCVdvcmtzcGFjZUpvYiBnZW5lcmF0ZUpvYiA9IG5ldyBEYndzR2VuZXJhdG9yVWkuR2VuZXJhdGVEYndzSm9iKAotCQkJdGhpcy5nZXRKYXZhUHJvamVjdCgpLAotCQkJdGhpcy5nZXRCdWlsZGVyWG1sUGF0aE9yVXJpKCksCi0JCQlzdGFnZURpck5hbWUsCi0JCQlkcml2ZXJKYXJMaXN0Ci0JCSk7Ci0JCWdlbmVyYXRlSm9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3RGcm9tU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgIAlpZihzZWxlY3Rpb24gPT0gbnVsbCkgewotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLQkJT2JqZWN0IGZpcnN0RWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7Ci0JCQlyZXR1cm4gKElKYXZhUHJvamVjdClmaXJzdEVsZW1lbnQ7Ci0JCX0KLQkJZWxzZSBpZihmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoKElSZXNvdXJjZSkgZmlyc3RFbGVtZW50KS5nZXRQcm9qZWN0KCk7Ci0JCQlyZXR1cm4gZ2V0SmF2YVByb2plY3RGcm9tKHByb2plY3QpOwotCQl9Ci0JCWVsc2UgaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChJSmF2YUVsZW1lbnQpZmlyc3RFbGVtZW50KS5nZXRKYXZhUHJvamVjdCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotICAgIH0KLSAgICAKLQlwcml2YXRlIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdEZyb20oSVByb2plY3QgcHJvamVjdCkgewotICAgIAlyZXR1cm4gKChJSmF2YUVsZW1lbnQpIHByb2plY3QuZ2V0QWRhcHRlcihJSmF2YUVsZW1lbnQuY2xhc3MpKS5nZXRKYXZhUHJvamVjdCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vSmRiY0RyaXZlcldpemFyZFBhZ2UuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vSmRiY0RyaXZlcldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY1YzlkMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0pkYmNEcml2ZXJXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlRhYmxlTGF5b3V0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLkpwdERid3NVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5KcHREYndzVWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5KcHREYndzVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci0KLS8qKgotICogIEpkYmNEcml2ZXJzV2l6YXJkUGFnZQotICovCi1wdWJsaWMgY2xhc3MgSmRiY0RyaXZlcldpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlCi17Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3RvcmVkRHJpdmVyQ2xhc3NwYXRoSWQ7Ci0JcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBqYXJQYXRoczsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCSU5ESU5HU19GSUxFX0ZJTFRFUiA9ICIqLmphcjsqLnppcCI7ICAgLy8kTk9OLU5MUy0xJAotCS8vIGRpYWxvZyBzdG9yZSBpZCBjb25zdGFudHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9JRCA9ICJEUklWRVJfQ0xBU1NQQVRIX0lEIjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1NFUEFSQVRPUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgicGF0aC5zZXBhcmF0b3IiKTsJLy8kTk9OLU5MUy0xJAotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgSmRiY0RyaXZlcldpemFyZFBhZ2UoU3RyaW5nIHdpemFyZE5hbWUpIHsKLQkJc3VwZXIoIkpkYmMgRHJpdmVyIik7IC8vJE5PTi1OTFMtMSQKLQotCQl0aGlzLmluaXRpYWxpemUoKTsKLQkJCi0JCXRoaXMuamFyUGF0aHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5zdG9yZWREcml2ZXJDbGFzc3BhdGhJZCA9IHdpemFyZE5hbWUgKyAiLiIgKyBQQUdFX0lEOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy5zZXRUaXRsZShKcHREYndzVWlNZXNzYWdlcy5KZGJjRHJpdmVyV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXRoaXMuc2V0RGVzY3JpcHRpb24oSnB0RGJ3c1VpTWVzc2FnZXMuSmRiY0RyaXZlcldpemFyZFBhZ2VfZGVzYyk7Ci0JCXRoaXMuc2V0SW1hZ2VEZXNjcmlwdG9yKEpwdERid3NVaVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoSnB0RGJ3c1VpSWNvbnMuREJXU19HRU5fV0laX0JBTk5FUikpOwotCX0KLQotCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgZmluaXNoKCkgewotCQl0aGlzLnNhdmVXaWRnZXRWYWx1ZXMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERyaXZlckphckxpc3QoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRHJpdmVySmFyTGlzdFN0cmluZygpOwotCX0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKglJbml0aWFsaXplcyB0aGUgSkFSIHBhY2thZ2UgZnJvbSBsYXN0IHVzZWQgd2l6YXJkIHBhZ2UgdmFsdWVzLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplSmFyUGF0aHMoKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncz0gdGhpcy5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlpZihzZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQkvLyBkZXN0aW5hdGlvbgotCQkJU3RyaW5nW10gZHJpdmVyUGF0aHMgPSBzZXR0aW5ncy5nZXRBcnJheSh0aGlzLnN0b3JlZERyaXZlckNsYXNzcGF0aElkKTsKLQkJCWlmKGRyaXZlclBhdGhzID09IG51bGwpIHsKLQkJCQlyZXR1cm47IC8vIGllLi0gbm8gc2V0dGluZ3Mgc3RvcmVkCi0JCQl9Ci0JCQl0aGlzLmphclBhdGhzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQkKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5qYXJQYXRocywgZHJpdmVyUGF0aHMpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzYXZlV2lkZ2V0VmFsdWVzKCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3M9IHRoaXMuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQotCQlpZihzZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBkcml2ZXJQYXRocyA9IHRoaXMuamFyUGF0aHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQkJCXNldHRpbmdzLnB1dCh0aGlzLnN0b3JlZERyaXZlckNsYXNzcGF0aElkLCBkcml2ZXJQYXRocyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERyaXZlckphckxpc3RTdHJpbmcoKSB7Ci0JCWlmKHRoaXMuamFyUGF0aHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuRU1QVFlfU1RSSU5HOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvcihTdHJpbmcgamFyIDogdGhpcy5qYXJQYXRocykgewotCQkJcmVzdWx0LmFwcGVuZChqYXIpLmFwcGVuZChQQVRIX1NFUEFSQVRPUik7Ci0JCX0KLQkJcmVzdWx0LmRlbGV0ZUNoYXJBdChyZXN1bHQubGVuZ3RoKCkgLSAxKTsJLy8gcmVtb3ZlIGxhc3Qgc2VwYXJhdG9yCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBVSSBjb21wb25lbnRzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmluaXRpYWxpemVKYXJQYXRocygpOwotCQl0aGlzLnNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQkJdGhpcy5zZXRDb250cm9sKHRoaXMuYnVpbGRUb3BMZXZlbENvbnRyb2wocGFyZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkVG9wTGV2ZWxDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJbmV3IEphcnNHcm91cChjb21wb3NpdGUpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlSmFyRmlsZShTdHJpbmcgZmlsZVBhdGgpIHsKLQkJdGhpcy5qYXJQYXRocy5yZW1vdmUoZmlsZVBhdGgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkSmFyRmlsZShTdHJpbmcgZmlsZVBhdGgpIHsKLQkJaWYoICEgdGhpcy5qYXJQYXRocy5jb250YWlucyhmaWxlUGF0aCkpIHsKLQkJCXRoaXMuamFyUGF0aHMuYWRkKGZpbGVQYXRoKTsKLQkJfQotCX0KLQkKLQkvLyAqKioqKioqKioqIEphcnNHcm91cCBjbGFzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIEphcnNHcm91cCB7Ci0KLQkJCi0JCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JCXByaXZhdGUgSmFyc0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOyAvL211c3QgYmUgNCBmb3IgdGhlIHBhY2thZ2UgY29udHJvbHMKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCS8vIFRPRE8gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLmdyb3VwLCBIRUxQX0NPTlRFWFRfSUQpOwotCi0JCQl0aGlzLmJ1aWxkTGFiZWwoY29tcG9zaXRlLCAyLCBKcHREYndzVWlNZXNzYWdlcy5KZGJjRHJpdmVyV2l6YXJkUGFnZV9kcml2ZXJGaWxlcyk7Ci0JCQkKLQkJCXRoaXMuYnVpbGREcml2ZXJGaWxlc1RhYmxlKGNvbXBvc2l0ZSk7Ci0JCX0KLQkgICAgCi0JCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgotCSAgICAKLQkJcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJCUlXaXphcmQgd2l6YXJkID0gZ2V0V2l6YXJkKCk7Ci0JICAgIAkKLQkJCWlmKCAhICh3aXphcmQgaW5zdGFuY2VvZiBEYndzR2VuZXJhdG9yV2l6YXJkKSkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJcmV0dXJuICgoRGJ3c0dlbmVyYXRvcldpemFyZCl3aXphcmQpLmdldEphdmFQcm9qZWN0KCk7Ci0JCX0KLQotCQlwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IGdldEphclBhdGhzKCkgewotCQkJcmV0dXJuIGphclBhdGhzOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBwcml2YXRlIG1ldGhvZHMgKioqKioqKioqKgotCi0JCXByaXZhdGUgVGFibGVWaWV3ZXIgYnVpbGREcml2ZXJGaWxlc1RhYmxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCQotCQkJVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXIgPSB0aGlzLmJ1aWxkVGFibGVWaWV3ZXIocGFyZW50LCB0aGlzLmdldEphclBhdGhzKCkpOwotCQkJCi0JCQl0aGlzLmJ1aWxkQWRkUmVtb3ZlQnV0dG9ucyhwYXJlbnQsIHRhYmxlVmlld2VyKTsKLQkJCXJldHVybiB0YWJsZVZpZXdlcjsKLQkJfQotCQkKLQkJcHJpdmF0ZSBUYWJsZVZpZXdlciBidWlsZFRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIEFycmF5TGlzdDxTdHJpbmc+IHRhYmxlRGF0YU1vZGVsKSB7CQotCQkJCi0JCQlUYWJsZUxheW91dENvbXBvc2l0ZSB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCXRoaXMuYWRkQ29sdW1uc0RhdGEodGFibGVMYXlvdXQpOwotCQkJCi0JCQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSh0YWJsZUxheW91dCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIpOwotCQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQkJCQotCQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgMCk7Ci0JCQljb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCQkJCi0JCQlHcmlkRGF0YSBncmlkRGF0YT0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50PSBTV1RVdGlsLmdldFRhYmxlSGVpZ2h0SGludCh0YWJsZSwgNyk7Ci0JCQl0YWJsZUxheW91dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCQotCQkJVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQkJdGFibGVWaWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQkJCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIodGhpcy5idWlsZExhYmVsUHJvdmlkZXIoKSk7Ci0JCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIodGhpcy5idWlsZENvbnRlbnRQcm92aWRlcigpKTsKLQkJCQotCQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQodGFibGVEYXRhTW9kZWwpOwotCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJcmV0dXJuIHRhYmxlVmlld2VyOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgYnVpbGRBZGRSZW1vdmVCdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyKSB7Ci0JCQkKLQkJCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQkJR3JpZExheW91dCBidXR0b25MYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGJ1dHRvbkxheW91dCk7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQkvLyBBZGQgYnV0dG9ucwotCQkJQnV0dG9uIGFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCQlhZGRCdXR0b24uc2V0VGV4dChKcHREYndzVWlNZXNzYWdlcy5KZGJjRHJpdmVyV2l6YXJkUGFnZV9hZGRCdXR0b24pOwotCQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLQkJCWFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCWFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0KLQkJCQkJQXJyYXlMaXN0PFN0cmluZz4gamFyRmlsZXMgPSBwcm9tcHRKYXJGaWxlcygpOwotCQkJCQlmb3IoU3RyaW5nIGphckZpbGUgOiBqYXJGaWxlcykgewotCQkJCQkJYWRkSmFyRmlsZShqYXJGaWxlKTsKLQkJCQkJfQotCQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQkvLyBSZW1vdmUgYnV0dG9ucwotCQkJQnV0dG9uIHJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCQlyZW1vdmVCdXR0b24uc2V0VGV4dChKcHREYndzVWlNZXNzYWdlcy5KZGJjRHJpdmVyV2l6YXJkUGFnZV9yZW1vdmVCdXR0b24pOwotCQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0JCQlyZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlyZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbil0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBqYXJGaWxlID0gKFN0cmluZylzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCXJlbW92ZUphckZpbGUoamFyRmlsZSk7Ci0JCQkJCQotCQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlhZGRCdXR0b24uc2V0Rm9jdXMoKTsKLQkJfQotCi0JCXByaXZhdGUgSUJhc2VMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKLQkJCXJldHVybiBuZXcgVGFibGVMYWJlbFByb3ZpZGVyKCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgSUNvbnRlbnRQcm92aWRlciBidWlsZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXJldHVybiBuZXcgVGFibGVDb250ZW50UHJvdmlkZXIoKTsKLQkJfQotCi0JCXByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gcHJvbXB0SmFyRmlsZXMoKSB7Ci0JCQlTdHJpbmcgcHJvamVjdFBhdGg9IHRoaXMuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCi0JCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGdldFNoZWxsKCksIFNXVC5NVUxUSSk7Ci0JCQlkaWFsb2cuc2V0VGV4dChKcHREYndzVWlNZXNzYWdlcy5KZGJjRHJpdmVyV2l6YXJkUGFnZV9jaG9vc2VBRHJpdmVyRmlsZSk7Ci0JCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChwcm9qZWN0UGF0aCk7Ci0JCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10ge0JJTkRJTkdTX0ZJTEVfRklMVEVSfSk7Ci0KLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQlTdHJpbmcgcGF0aCA9IGRpYWxvZy5nZXRGaWx0ZXJQYXRoKCk7Ci0JCQlTdHJpbmdbXSBmaWxlTmFtZXMgPSBkaWFsb2cuZ2V0RmlsZU5hbWVzKCk7Ci0JCQlBcnJheUxpc3Q8U3RyaW5nPiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGZpbGVOYW1lcy5sZW5ndGgpOwotCQkJZm9yKFN0cmluZyBmaWxlTmFtZSA6IGZpbGVOYW1lcykgewotCQkJCXJlc3VsdHMuYWRkKHBhdGggKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHRzOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGFkZENvbHVtbnNEYXRhKFRhYmxlTGF5b3V0Q29tcG9zaXRlIGxheW91dCkgewotCQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIHRydWUpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgbGFiZWwKLQkJICovCi0JCXByaXZhdGUgTGFiZWwgYnVpbGRMYWJlbChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3BhbiwgU3RyaW5nIHRleHQpIHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCXJldHVybiBsYWJlbDsKLQkJfQotCi0JCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCQkKLQkJcHJpdmF0ZSBjbGFzcyBUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJcmV0dXJuIChTdHJpbmcpZWxlbWVudDsKLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSBjbGFzcyBUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotCQkJVGFibGVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7fQotCQkJCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkge30KLQkJCQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChDb2xsZWN0aW9uPD8+KSBpbnB1dEVsZW1lbnQpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzNmNjMy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1NlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogQ29kZSBvcmlnaW5hdGUgZnJvbSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5KcHREYndzVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLQotCi1wdWJsaWMgY2xhc3MgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwgZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIFBhbmVsTGlzdGVuZXIgewotCQl2b2lkIGNvbXBsZXRpb25TdGF0ZUNoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGFuZWxMaXN0ZW5lciBsaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgUGFnZUJvb2sgcGFnZUJvb2s7Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0RmlsZVBhbmVsIHNlbGVjdEZpbGVQYW5lbDsKLQlwcm90ZWN0ZWQgU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwgc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWw7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXB1YmxpYyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbChDb21wb3NpdGUgcGFyZW50LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJLy8gY29udGFpbmVyIGdyb3VwCi0JCXNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDQwMDsKLQkJZ2Qud2lkdGhIaW50ID0gNDAwOwotCQlzZXRMYXlvdXREYXRhKGdkKTsKLQotCQlwYWdlQm9vayA9IG5ldyBQYWdlQm9vayh0aGlzLCBTV1QuTk9ORSk7Ci0JCXBhZ2VCb29rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCXNlbGVjdEZpbGVQYW5lbCA9IG5ldyBTZWxlY3RGaWxlUGFuZWwocGFnZUJvb2ssIHNlbGVjdGlvbik7Ci0JCXRoaXMuc2V0U2luZ2xlRmlsZVZpZXdEZWZhdWx0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQotCQkvLyBDYXRhbG9nCi0JCUlDYXRhbG9nIHhtbENhdGFsb2cgPSBKcHREYndzVWlQbHVnaW4uaW5zdGFuY2UoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotCQlzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbCA9IG5ldyBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbChwYWdlQm9vaywgeG1sQ2F0YWxvZyk7Ci0JCXNlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmdldFRhYmxlVmlld2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVDb21wbGV0aW9uU3RhdGVDaGFuZ2UoKTsKLQkJCX0KLQkJfSk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJcGFnZUJvb2suc2hvd1BhZ2Uoc2VsZWN0RmlsZVBhbmVsLmdldENvbnRyb2woKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNpbmdsZUZpbGVWaWV3RGVmYXVsdFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdEZpbGVQYW5lbC5zZXREZWZhdWx0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiBzZWxlY3RGaWxlUGFuZWwuZ2V0RmlsZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0WE1MQ2F0YWxvZ1VSSSgpIHsKLQkJcmV0dXJuIG51bGw7CQkvLyBYTUxDYXRhbG9nIG5vdCBzdXBwb3J0ZWQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nRW50cnlUeXBlKGludCBjYXRhbG9nRW50cnlUeXBlKSB7Ci0JCXNlbGVjdFhNTENhdGFsb2dJZFBhbmVsLnNldENhdGFsb2dFbnRyeVR5cGUoY2F0YWxvZ0VudHJ5VHlwZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zKSB7Ci0JCXNlbGVjdEZpbGVQYW5lbC5yZXNldEZpbHRlcnMoKTsKLQkJc2VsZWN0RmlsZVBhbmVsLmFkZEZpbHRlckV4dGVuc2lvbnMoZmlsdGVyRXh0ZW5zaW9ucyk7Ci0KLQkJc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuZ2V0VGFibGVWaWV3ZXIoKS5zZXRGaWx0ZXJFeHRlbnNpb25zKGZpbHRlckV4dGVuc2lvbnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpc3RlbmVyKFBhbmVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpc2libGVIZWxwZXIoYm9vbGVhbiBpc1Zpc2libGUpIHsKLQkJc2VsZWN0RmlsZVBhbmVsLnNldFZpc2libGVIZWxwZXIoaXNWaXNpYmxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVDb21wbGV0aW9uU3RhdGVDaGFuZ2UoKSB7Ci0JCWlmIChsaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlsaXN0ZW5lci5jb21wbGV0aW9uU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJcGFnZUJvb2suc2hvd1BhZ2Uoc2VsZWN0RmlsZVBhbmVsLmdldENvbnRyb2woKSk7Ci0KLQkJdXBkYXRlQ29tcGxldGlvblN0YXRlQ2hhbmdlKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFNlbGVjdEZpbGVQYW5lbCBleHRlbmRzIFNlbGVjdFNpbmdsZUZpbGVWaWV3RmFjYWRlIGltcGxlbWVudHMgU2VsZWN0U2luZ2xlRmlsZVZpZXdGYWNhZGUuTGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgQ29udHJvbCBjb250cm9sOwotCi0JCXB1YmxpYyBTZWxlY3RGaWxlUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlzdXBlcihzZWxlY3Rpb24sIHRydWUpOwotCQkJLy8gU3RyaW5nW10gZXh0ID0geyIuZHRkIn07Ci0JCQkvLyBhZGRGaWx0ZXJFeHRlbnNpb25zKGV4dCk7Ci0JCQljb250cm9sID0gY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQkJY29udHJvbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCVNlbGVjdEZpbGVQYW5lbC50aGlzLnNldExpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJCXJldHVybiBjb250cm9sOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0Q29udHJvbENvbXBsZXRlKGJvb2xlYW4gaXNDb21wbGV0ZSkgewotCQkJdXBkYXRlQ29tcGxldGlvblN0YXRlQ2hhbmdlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1NlbGVjdFNpbmdsZUZpbGVWaWV3RmFjYWRlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1NlbGVjdFNpbmdsZUZpbGVWaWV3RmFjYWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MzYzZDUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9TZWxlY3RTaW5nbGVGaWxlVmlld0ZhY2FkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBTZWxlY3RTaW5nbGVGaWxlVmlldwotICogIAotICogIEZh52FkZSBjbGFzcyB0byBjaGFuZ2UgYWNjZXNzaWJpbGl0eSBvZiBTZWxlY3RTaW5nbGVGaWxlVmlldy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBTZWxlY3RTaW5nbGVGaWxlVmlld0ZhY2FkZSBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vycy5TZWxlY3RTaW5nbGVGaWxlVmlldyB7Ci0KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBMaXN0ZW5lciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vycy5TZWxlY3RTaW5nbGVGaWxlVmlldy5MaXN0ZW5lcgotCXt9Ci0KLQlwdWJsaWMgU2VsZWN0U2luZ2xlRmlsZVZpZXdGYWNhZGUoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIGlzRmlsZU1hbmRhdG9yeSkgewotCQlzdXBlcihzZWxlY3Rpb24sIGlzRmlsZU1hbmRhdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zKSB7Ci0JCXN1cGVyLmFkZEZpbHRlckV4dGVuc2lvbnMoZmlsdGVyRXh0ZW5zaW9ucyk7Ci0JfQotCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldEZpbHRlcnMoKSB7Ci0JCXN1cGVyLnJlc2V0RmlsdGVycygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlSGVscGVyKGJvb2xlYW4gaXNWaXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGVIZWxwZXIoaXNWaXNpYmxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlci5zZXREZWZhdWx0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIuc2V0TGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxZWM0Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1NlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogQ29kZSBvcmlnaW5hdGUgZnJvbSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5KcHREYndzVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuSnB0RGJ3c1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci0KLQotcHVibGljIGNsYXNzIFNlbGVjdFhNTENhdGFsb2dJZFBhbmVsIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgaW50IGNhdGFsb2dFbnRyeVR5cGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZG9UYWJsZVNpemVIYWNrID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCXByb3RlY3RlZCBJQ2F0YWxvZyBmWG1sQ2F0YWxvZzsKLQotCXB1YmxpYyBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbChDb21wb3NpdGUgcGFyZW50LCBJQ2F0YWxvZyB4bWxDYXRhbG9nKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLmZYbWxDYXRhbG9nID0geG1sQ2F0YWxvZzsKLQotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQl0aGlzLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDIwMDsKLQkJZ2Qud2lkdGhIaW50ID0gNzAwOwotCQl0aGlzLnNldExheW91dERhdGEoZ2QpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChKcHREYndzVWlNZXNzYWdlcy5CdWlsZGVyWG1sV2l6YXJkUGFnZV94bWxDYXRhbG9nVGFibGVUaXRsZSk7Ci0KLQkJdGFibGVWaWV3ZXIgPSBjcmVhdGVUYWJsZVZpZXdlcih0aGlzKTsKLQkJdGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dCgiZHVtbXkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBYTUxDYXRhbG9nVGFibGVWaWV3ZXIgY3JlYXRlVGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTdHJpbmcgaGVhZGluZ3NbXSA9IG5ldyBTdHJpbmdbMl07Ci0JCWhlYWRpbmdzWzBdID0gSnB0RGJ3c1VpTWVzc2FnZXMuQnVpbGRlclhtbFdpemFyZFBhZ2VfeG1sQ2F0YWxvZ0tleUNvbHVtbjsKLQkJaGVhZGluZ3NbMV0gPSBKcHREYndzVWlNZXNzYWdlcy5CdWlsZGVyWG1sV2l6YXJkUGFnZV94bWxDYXRhbG9nVXJpQ29sdW1uOwotCi0JCVhNTENhdGFsb2dUYWJsZVZpZXdlciB0aGVUYWJsZVZpZXdlciA9IG5ldyBYTUxDYXRhbG9nVGFibGVWaWV3ZXIocGFyZW50LCBoZWFkaW5ncykgewotCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRYTUxDYXRhbG9nRW50cmllcyhMaXN0IGxpc3QsIElDYXRhbG9nRW50cnlbXSBlbnRyaWVzKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlDYXRhbG9nRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJCQlpZiAoY2F0YWxvZ0VudHJ5VHlwZSA9PSAwKSB7Ci0JCQkJCQlsaXN0LmFkZChlbnRyeSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY2F0YWxvZ0VudHJ5VHlwZSA9PSBlbnRyeS5nZXRFbnRyeVR5cGUoKSkgewotCQkJCQkJbGlzdC5hZGQoZW50cnkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRYTUxDYXRhbG9nRW50cmllcygpIHsKLQkJCQlMaXN0IHJlc3VsdCA9IG51bGw7Ci0KLQkJCQlpZiAoKGZYbWxDYXRhbG9nID09IG51bGwpIHx8IGRvVGFibGVTaXplSGFjaykgewotCQkJCQkvLyB0aGlzIGxldHMgdXMgY3JlYXRlIGEgdGFibGUgd2l0aCBhbiBpbml0aWFsIGhlaWdodCBvZgotCQkJCQkvLyAxMCByb3dzCi0JCQkJCS8vIG90aGVyd2lzZSB3ZSBnZXQgc3R1Y2sgd2l0aCAwIHJvdyBoZWlnaCB0YWJsZS4uLiB0aGF0J3MKLQkJCQkJLy8gdG9vIHNtYWxsCi0JCQkJCWRvVGFibGVTaXplSGFjayA9IGZhbHNlOwotCQkJCQlyZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0JCQkJCQlyZXN1bHQuYWRkKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0JCQkJCUlOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGZYbWxDYXRhbG9nLmdldE5leHRDYXRhbG9ncygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5leHRDYXRhbG9ncy5sZW5ndGg7IGkrKykgewotCQkJCQkJSU5leHRDYXRhbG9nIGNhdGFsb2cgPSBuZXh0Q2F0YWxvZ3NbaV07Ci0JCQkJCQlJQ2F0YWxvZyByZWZlcmVuY2VkQ2F0YWxvZyA9IGNhdGFsb2cuZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLQkJCQkJCWlmIChyZWZlcmVuY2VkQ2F0YWxvZyAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKEpwdERid3NVaVBsdWdpbi5TWVNURU1fQ0FUQUxPR19JRC5lcXVhbHMocmVmZXJlbmNlZENhdGFsb2cuZ2V0SWQoKSkpIHsKLQkJCQkJCQkJSUNhdGFsb2cgc3lzdGVtQ2F0YWxvZyA9IHJlZmVyZW5jZWRDYXRhbG9nOwotCQkJCQkJCQlhZGRYTUxDYXRhbG9nRW50cmllcyhyZXN1bHQsIHN5c3RlbUNhdGFsb2cuZ2V0Q2F0YWxvZ0VudHJpZXMoKSk7Ci0KLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAoSnB0RGJ3c1VpUGx1Z2luLlVTRVJfQ0FUQUxPR19JRC5lcXVhbHMocmVmZXJlbmNlZENhdGFsb2cuZ2V0SWQoKSkpIHsKLQkJCQkJCQkJSUNhdGFsb2cgdXNlckNhdGFsb2cgPSByZWZlcmVuY2VkQ2F0YWxvZzsKLQkJCQkJCQkJYWRkWE1MQ2F0YWxvZ0VudHJpZXMocmVzdWx0LCB1c2VyQ2F0YWxvZy5nZXRDYXRhbG9nRW50cmllcygpKTsKLQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9OwotCQlyZXR1cm4gdGhlVGFibGVWaWV3ZXI7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gZ2V0WE1MQ2F0YWxvZ0VudHJ5KCk7Ci0JCXJldHVybiBlbnRyeSAhPSBudWxsID8gZW50cnkuZ2V0S2V5KCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBYTUxDYXRhbG9nVGFibGVWaWV3ZXIgZ2V0VGFibGVWaWV3ZXIoKSB7Ci0JCXJldHVybiB0YWJsZVZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJSUNhdGFsb2dFbnRyeSBlbnRyeSA9IGdldFhNTENhdGFsb2dFbnRyeSgpOwotCQlyZXR1cm4gZW50cnkgIT0gbnVsbCA/IGVudHJ5LmdldFVSSSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNhdGFsb2dFbnRyeSBnZXRYTUxDYXRhbG9nRW50cnkoKSB7Ci0JCUlDYXRhbG9nRW50cnkgcmVzdWx0ID0gbnVsbDsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSA/ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkgOiBudWxsOwotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQlyZXN1bHQgPSAoSUNhdGFsb2dFbnRyeSkgc2VsZWN0ZWRPYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nRW50cnlUeXBlKGludCBjYXRhbG9nRW50cnlUeXBlKSB7Ci0JCXRoaXMuY2F0YWxvZ0VudHJ5VHlwZSA9IGNhdGFsb2dFbnRyeVR5cGU7Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1dlYkR5bmFtaWNQcm9qZWN0V2l6YXJkUGFnZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9XZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUzMmJmZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1dlYkR5bmFtaWNQcm9qZWN0V2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2l6YXJkcy5KYXZhUHJvamVjdFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkRid3NHZW5lcmF0b3JVaTsKLQotLyoqCi0gKiAgV2ViRHluYW1pY1Byb2plY3RXaXphcmRQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2UgZXh0ZW5kcyBKYXZhUHJvamVjdFdpemFyZFBhZ2UgewotCi0JcHVibGljIFdlYkR5bmFtaWNQcm9qZWN0V2l6YXJkUGFnZShJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJc3VwZXIoamF2YVByb2plY3QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTxJUHJvamVjdD4gZ2V0SmF2YVByb2plY3RzKCkgewotCSAgIHJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8SVByb2plY3Q+KENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuZ2V0UHJvamVjdHMoKSkpIHsKLQkgICAgICBAT3ZlcnJpZGUKLQkgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSVByb2plY3QgbmV4dCkgewotCQkJCXJldHVybiBEYndzR2VuZXJhdG9yVWkucHJvamVjdElzV2ViRHluYW1pYyhuZXh0KTsKLQkgICAgICB9Ci0JICAgfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vWE1MQ2F0YWxvZ1RhYmxlVmlld2VyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1hNTENhdGFsb2dUYWJsZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTU2NTYxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vWE1MQ2F0YWxvZ1RhYmxlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogQ29kZSBvcmlnaW5hdGUgZnJvbSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuSnB0RGJ3c1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyIGV4dGVuZHMgVGFibGVWaWV3ZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgRVJST1JfU1RBVEVfS0VZID0gImVycm9yc3RhdGVrZXkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGR0ZEZpbGVJbWFnZSA9IEpwdERid3NVaVBsdWdpbi5nZXRJbWFnZSgiaWNvbnMvZnVsbC9vYmoxNi9kdGRmaWxlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSB1bmtub3duRmlsZUltYWdlID0gSnB0RGJ3c1VpUGx1Z2luLmdldEltYWdlKCJpY29ucy9mdWxsL29iajE2L3RleHQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIHhzZEZpbGVJbWFnZSA9IEpwdERid3NVaVBsdWdpbi5nZXRJbWFnZSgiaWNvbnMvZnVsbC9vYmoxNi9YU0RGaWxlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBlcnJvckltYWdlID0gSnB0RGJ3c1VpUGx1Z2luLmdldEltYWdlKCJpY29ucy9mdWxsL292cjE2L2Vycm9yX292ci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXMpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCi0JCVRhYmxlIHRhYmxlID0gZ2V0VGFibGUoKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLQkJVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uUHJvcGVydGllcy5sZW5ndGg7IGkrKykgewotCQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBpKTsKLQkJCWNvbHVtbi5zZXRUZXh0KGNvbHVtblByb3BlcnRpZXNbaV0pOwotCQkJY29sdW1uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1MCwgdHJ1ZSkpOwotCQl9Ci0JCXRhYmxlLnNldExheW91dChsYXlvdXQpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUoZmFsc2UpOwotCi0JCXNldENvbHVtblByb3BlcnRpZXMoY29sdW1uUHJvcGVydGllcyk7Ci0KLQkJc2V0Q29udGVudFByb3ZpZGVyKG5ldyBDYXRhbG9nRW50cnlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXNldExhYmVsUHJvdmlkZXIobmV3IENhdGFsb2dFbnRyeUxhYmVsUHJvdmlkZXIoKSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0WE1MQ2F0YWxvZ0VudHJpZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImhlbGxvIikgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJydW4hIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQkJbWVudU1hbmFnZXIuYWRkKGFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBleHRlbnNpb25zKSB7Ci0JCXJlc2V0RmlsdGVycygpOwotCQlhZGRGaWx0ZXIobmV3IFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlcihleHRlbnNpb25zKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLQlwdWJsaWMgY2xhc3MgQ2F0YWxvZ0VudHJ5Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCU9iamVjdFtdIGFycmF5ID0gZ2V0WE1MQ2F0YWxvZ0VudHJpZXMoKS50b0FycmF5KCk7Ci0JCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCQkJaW50IHJlc3VsdCA9IDA7Ci0JCQkJCWlmICgobzEgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSAmJiAobzIgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSkgewotCQkJCQkJSUNhdGFsb2dFbnRyeSBtYXBwaW5nSW5mbzEgPSAoSUNhdGFsb2dFbnRyeSkgbzE7Ci0JCQkJCQlJQ2F0YWxvZ0VudHJ5IG1hcHBpbmdJbmZvMiA9IChJQ2F0YWxvZ0VudHJ5KSBvMjsKLQkJCQkJCXJlc3VsdCA9IENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShtYXBwaW5nSW5mbzEuZ2V0S2V5KCksIG1hcHBpbmdJbmZvMi5nZXRLZXkoKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9OwotCQkJQXJyYXlzLnNvcnQoYXJyYXksIGNvbXBhcmF0b3IpOwotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGQsIE9iamVjdCBuZXdvYmopIHsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQ2F0YWxvZ0VudHJ5TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlJbWFnZSByZXN1bHQgPSBudWxsOwotCQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCQlJbWFnZSBiYXNlID0gbnVsbDsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJCQlJQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeSA9IChJQ2F0YWxvZ0VudHJ5KSBvYmplY3Q7Ci0JCQkJCVN0cmluZyB1cmkgPSBjYXRhbG9nRW50cnkuZ2V0VVJJKCk7Ci0JCQkJCWlmICh1cmkuZW5kc1dpdGgoImR0ZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJhc2UgPSBkdGRGaWxlSW1hZ2U7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAodXJpLmVuZHNXaXRoKCJ4c2QiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQliYXNlID0geHNkRmlsZUltYWdlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYmFzZSA9IHVua25vd25GaWxlSW1hZ2U7Ci0JCQkJCX0KLQotCQkJCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoVVJJSGVscGVyLmlzUmVhZGFibGVVUkkodXJpLCBmYWxzZSkpIHsKLQkJCQkJCQlyZXN1bHQgPSBiYXNlOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gVE9ETy4uLiBTU0UgcG9ydAotCQkJCQkJCXJlc3VsdCA9IGJhc2U7Ly8gaW1hZ2VGYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZUltYWdlKGJhc2UsCi0JCQkJCQkJLy8gZXJyb3JJbWFnZSwKLQkJCQkJCQkvLyBJbWFnZUZhY3RvcnkuQk9UVE9NX0xFRlQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpIHsKLQkJCQlJQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeSA9IChJQ2F0YWxvZ0VudHJ5KSBvYmplY3Q7Ci0JCQkJcmVzdWx0ID0gY29sdW1uSW5kZXggPT0gMCA/IGNhdGFsb2dFbnRyeS5nZXRLZXkoKSA6IGNhdGFsb2dFbnRyeS5nZXRVUkkoKTsKLQkJCQlyZXN1bHQgPSBVUklIZWxwZXIucmVtb3ZlUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKHJlc3VsdCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JY2xhc3MgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQkJcHJvdGVjdGVkIFN0cmluZ1tdIGV4dGVuc2lvbnM7Ci0KLQkJcHVibGljIFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlcihTdHJpbmdbXSBleHRlbnNpb25zKSB7Ci0JCQl0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNGaWx0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgT2JqZWN0IHByb3BlcnR5KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpIHsKLQkJCQlJQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeSA9IChJQ2F0YWxvZ0VudHJ5KSBlbGVtZW50OwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoY2F0YWxvZ0VudHJ5LmdldFVSSSgpLmVuZHNXaXRoKGV4dGVuc2lvbnNbaV0pKSB7Ci0JCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nLy5jdnNpZ25vcmUgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nLy5wcm9qZWN0IGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODU2MDkyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmFkYjQ1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYWJvdXQuaHRtbCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTYwNmIxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2Fib3V0LmluaSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODhiOWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAidGlwc0FuZFRyaWNrc0hyZWYiIGNvbnRhaW5zIHRoZSBIZWxwIHRvcGljIGhyZWYgdG8gYSB0aXBzIGFuZCB0cmlja3MgcGFnZSAKLSMgb3B0aW9uYWwKLXRpcHNBbmRUcmlja3NIcmVmPS9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bQotCi0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9hYm91dC5tYXBwaW5ncyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYWFiNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkMjJjNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSkFYQiBTdXBwb3J0XG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBPcmFjbGUgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAxMCwgMjAxMS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWE0ZTQ0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGNvbXBvbmVudC54bWwKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9jb21wb25lbnQueG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMjc1YTcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmciPgotPGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPgotPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMDljMmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZTQ3N2YuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSkFYQiBTdXBwb3J0Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5jbGFzc3BhdGggYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZjMGUzZi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJub25hY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLmN2c2lnbm9yZSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLnByb2plY3QgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNWNiM2IuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW48L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MjY3MmYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNUdWUgTWFyIDA4IDEyOjA3OjI5IEVTVCAyMDExCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL01FVEEtSU5GL01BTklGRVNULk1GIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmI0ZDI1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMjAwLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUltcG9ydC1QYWNrYWdlOiBqYXZheC54bWwuYmluZAotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9hYm91dC5odG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MWY1ODYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMj5BYm91dCBUaGlzIENvbnRlbnQ8L0gyPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPGgzPlRoaXJkIFBhcnR5IENvbnRlbnQ8L2gzPgotPHA+VGhlIENvbnRlbnQgaW5jbHVkZXMgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYXMgc2V0IAotICBvdXQgYmVsb3cuIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgCi0gIHRoZSBmb2xsb3dpbmcgaXMgcHJvdmlkZWQgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSwgYW5kIHlvdSBzaG91bGQgbG9vayAKLSAgdG8gdGhlIFJlZGlzdHJpYnV0b3ImIzgyMTc7cyBsaWNlbnNlIGZvciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UuPC9wPgotCi08aDQ+PGEgbmFtZT0iSlBBIiBpZD0iSlBBIj48L2E+SmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgdjEuMDwvaDQ+Ci0KLTxibG9ja3F1b3RlPgotICA8cD5UaGUgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgd2hpY2ggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgPGEgaHJlZj0iaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMdjEuMC5odG1sIj5DRERMIAotICAgIHYxLjA8L2E+IGlzIHJlcXVpcmVkIGJ5IHRoZSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgUHJvamVjdCBpbiBvcmRlciAKLSAgICB0byBzdXBwb3J0IHRoaXMgc3RhbmRhcmQuPC9wPgotPC9ibG9ja3F1b3RlPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzNWM2MS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vcGx1Z2luLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlN2RmY2EuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSkFYQiBTdXBwb3J0IC0gU2NoZW1hIEdlbmVyYXRpb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvc2NoZW1hZ2VuL01haW4uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9zY2hlbWFnZW4vTWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjZhOTIyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9zY2hlbWFnZW4vTWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlNjaGVtYU91dHB1dFJlc29sdmVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLmludGVybmFsLkpwdEpheGJDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4uaW50ZXJuYWwuVG9vbHM7Ci0KLS8qKgotICogIEdlbmVyYXRlIGEgSkFYQiBTY2hlbWEKLSAqICAKLSAqIEN1cnJlbnQgY29tbWFuZC1saW5lIGFyZ3VtZW50czoKLSAqICAgICBbLXMgc2NoZW1hLnhzZF0gLSBzcGVjaWZpZXMgdGhlIHRhcmdldCBzY2hlbWEKLSAqICAgICBbLWMgY2xhc3NOYW1lXSAtIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAqICAgICAKLSAqICAgICBbLXAgcGFja2FnZU5hbWVdIC0gc3BlY2lmaWVzIHRoZSBzb3VyY2UgcGFja2FnZSAvLyBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWFpbgotewotCXByaXZhdGUgU3RyaW5nW10gc291cmNlQ2xhc3NOYW1lczsKLQlwcml2YXRlIFN0cmluZyB0YXJnZXRTY2hlbWFOYW1lOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCXByaXZhdGUgYm9vbGVhbiBpc0RlYnVnTW9kZTsKLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIE5PX0ZBQ1RPUllfQ0xBU1MgPSAiZG9lc250IGNvbnRhaW4gT2JqZWN0RmFjdG9yeS5jbGFzcyI7ICAgLy8kTk9OLU5MUy0xJAotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQluZXcgTWFpbigpLmV4ZWN1dGUoYXJncyk7Ci0JfQotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXByaXZhdGUgTWFpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKFN0cmluZ1tdIGFyZ3MpIHsKLQkJCi0JCXRoaXMuaW5pdGlhbGl6ZVdpdGgoYXJncyk7Ci0JCQotCQl0aGlzLmdlbmVyYXRlKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLSAgICAKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVdpdGgoU3RyaW5nW10gYXJncykgewotICAgIAl0aGlzLnNvdXJjZUNsYXNzTmFtZXMgPSB0aGlzLmdldFNvdXJjZUNsYXNzTmFtZXMoYXJncyk7Ci0gICAgCXRoaXMudGFyZ2V0U2NoZW1hTmFtZSA9IHRoaXMuZ2V0VGFyZ2V0U2NoZW1hTmFtZShhcmdzKTsKLQotCQl0aGlzLmlzRGVidWdNb2RlID0gdGhpcy5nZXREZWJ1Z01vZGUoYXJncyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlKCkgewotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWEJDb250ZXh0Ci0JCUpBWEJDb250ZXh0IGpheGJDb250ZXh0ID0gdGhpcy5idWlsZEpheGJDb250ZXh0KCk7Ci0JCQotICAgICAgICAvLyBHZW5lcmF0ZSBhbiBYTUwgU2NoZW1hCi0JCWlmKGpheGJDb250ZXh0ICE9IG51bGwpIHsKLQkJCXRoaXMuZ2VuZXJhdGVTY2hlbWEoamF4YkNvbnRleHQpOwotCQl9Ci0JCWVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFRvb2xzLmJpbmQoSnB0SmF4YkNvcmVNZXNzYWdlcy5TQ0hFTUFfTk9UX0NSRUFURUQsIHRoaXMudGFyZ2V0U2NoZW1hTmFtZSkpOwotCQl9Ci0gICAgfQotCQotCXByaXZhdGUgSkFYQkNvbnRleHQgYnVpbGRKYXhiQ29udGV4dCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKFRvb2xzLmdldFN0cmluZyhKcHRKYXhiQ29yZU1lc3NhZ2VzLkxPQURJTkdfQ0xBU1NFUykpOwotCQlKQVhCQ29udGV4dCBqYXhiQ29udGV4dCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCUNsYXNzTG9hZGVyIGxvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0JCQkJCi0JCQkJQ2xhc3NbXSBzb3VyY2VDbGFzc2VzID0gdGhpcy5idWlsZFNvdXJjZUNsYXNzZXModGhpcy5zb3VyY2VDbGFzc05hbWVzLCBsb2FkZXIpOwotCQkJCQotCQkJCWpheGJDb250ZXh0ID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2Uoc291cmNlQ2xhc3Nlcyk7Ci0JCQl9Ci0JCQljYXRjaChKQVhCRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhpcy5oYW5kbGVFeGNlcHRpb24oZXgpOwotCQkJfQotCQkJcmV0dXJuIGpheGJDb250ZXh0OwotCSB9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlU2NoZW1hKEpBWEJDb250ZXh0IGpheGJDb250ZXh0KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihUb29scy5nZXRTdHJpbmcoSnB0SmF4YkNvcmVNZXNzYWdlcy5HRU5FUkFUSU5HX1NDSEVNQSkpOwotCQlTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0JCQotCQlTY2hlbWFPdXRwdXRSZXNvbHZlciBzY2hlbWFPdXRwdXRSZXNvbHZlciA9IAotCQkJbmV3IEpwdFNjaGVtYU91dHB1dFJlc29sdmVyKHRoaXMudGFyZ2V0U2NoZW1hTmFtZSk7Ci0KLQkJdHJ5IHsKLQkJCWpheGJDb250ZXh0LmdlbmVyYXRlU2NoZW1hKHNjaGVtYU91dHB1dFJlc29sdmVyKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLSAgICAKLSAgICBwcml2YXRlIENsYXNzW10gYnVpbGRTb3VyY2VDbGFzc2VzKFN0cmluZ1tdIGNsYXNzTmFtZXMsIENsYXNzTG9hZGVyIGxvYWRlcikgewotCi0JCUFycmF5TGlzdDxDbGFzcz4gc291cmNlQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KGNsYXNzTmFtZXMubGVuZ3RoKTsKLQkJZm9yKFN0cmluZyBjbGFzc05hbWU6IGNsYXNzTmFtZXMpIHsKLQkJCXRyeSB7Ci0JCQkJc291cmNlQ2xhc3Nlcy5hZGQobG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGNsYXNzTmFtZSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKFRvb2xzLmJpbmQoSnB0SmF4YkNvcmVNZXNzYWdlcy5OT1RfRk9VTkQsIGNsYXNzTmFtZSkpOwotCQkJfQotCQl9Ci0JCVN5c3RlbS5vdXQuZmx1c2goKTsKLQkJcmV0dXJuIHNvdXJjZUNsYXNzZXMudG9BcnJheShuZXcgQ2xhc3NbMF0pOwotICAgIH0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlRXhjZXB0aW9uKEpBWEJFeGNlcHRpb24gZXgpIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBleC5nZXRNZXNzYWdlKCk7Ci0JCVRocm93YWJsZSBsaW5rZWRFeCA9IGV4LmdldExpbmtlZEV4Y2VwdGlvbigpOwotCQlpZihtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5pbmRleE9mKE5PX0ZBQ1RPUllfQ0xBU1MpID4gLTEpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKLQkJfQotCQllbHNlIGlmKGxpbmtlZEV4ICE9IG51bGwgJiYgbGlua2VkRXggaW5zdGFuY2VvZiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKSB7Ci0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gVG9vbHMuYmluZChKcHRKYXhiQ29yZU1lc3NhZ2VzLkNPTlRFWFRfRkFDVE9SWV9OT1RfRk9VTkQsIGxpbmtlZEV4LmdldE1lc3NhZ2UoKSk7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZXJyb3JNZXNzYWdlKTsKLQkJfQotCQllbHNlIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBhcmd1bWVudCBxdWVyaWVzICoqKioqKioqKioKLSAgICAKLQlwcml2YXRlIFN0cmluZ1tdIGdldFNvdXJjZUNsYXNzTmFtZXMoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmdldEFsbEFyZ3VtZW50VmFsdWUoIi1jIiwgYXJncyk7ICAgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRUYXJnZXRTY2hlbWFOYW1lKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlyZXR1cm4gdGhpcy5nZXRBcmd1bWVudFZhbHVlKCItcyIsIGFyZ3MpOyAgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZ2V0RGVidWdNb2RlKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlyZXR1cm4gdGhpcy5hcmd1bWVudEV4aXN0cygiLWRlYnVnIiwgYXJncyk7ICAgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vICoqKioqKioqKiogcHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgU3RyaW5nIGdldEFyZ3VtZW50VmFsdWUoU3RyaW5nIGFyZ05hbWUsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgYXJnID0gYXJnc1tpXTsKLQkJCWlmIChhcmcudG9Mb3dlckNhc2UoKS5lcXVhbHMoYXJnTmFtZSkpIHsKLQkJCQlpbnQgaiA9IGkgKyAxOwotCQkJCWlmIChqIDwgYXJncy5sZW5ndGgpIHsKLQkJCQkJcmV0dXJuIGFyZ3Nbal07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZ1tdIGdldEFsbEFyZ3VtZW50VmFsdWUoU3RyaW5nIGFyZ05hbWUsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJTGlzdDxTdHJpbmc+IGFyZ1ZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhcmcgPSBhcmdzW2ldOwotCQkJaWYgKGFyZy50b0xvd2VyQ2FzZSgpLmVxdWFscyhhcmdOYW1lKSkgewotCQkJCWludCBqID0gaSArIDE7Ci0JCQkJaWYgKGogPCBhcmdzLmxlbmd0aCkgewotCQkJCQlhcmdWYWx1ZXMuYWRkKGFyZ3Nbal0pOwotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhcmdWYWx1ZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFyZ3VtZW50RXhpc3RzKFN0cmluZyBhcmdOYW1lLCBTdHJpbmdbXSBhcmdzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbaV07Ci0JCQlpZiAoYXJnLnRvTG93ZXJDYXNlKCkuZXF1YWxzKGFyZ05hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQotCi0vLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotY2xhc3MgSnB0U2NoZW1hT3V0cHV0UmVzb2x2ZXIgZXh0ZW5kcyBTY2hlbWFPdXRwdXRSZXNvbHZlciB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVmYXVsdFNjaGVtYU5hbWU7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgSnB0U2NoZW1hT3V0cHV0UmVzb2x2ZXIoU3RyaW5nIGRlZmF1bHRTY2hlbWFOYW1lKSB7Ci0JCXRoaXMuZGVmYXVsdFNjaGVtYU5hbWUgPSBkZWZhdWx0U2NoZW1hTmFtZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0JCi0JIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZXN1bHQgY3JlYXRlT3V0cHV0KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBzdWdnZXN0ZWRGaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgZmlsZVBhdGggPSAoVG9vbHMuc3RyaW5nSXNFbXB0eShuYW1lc3BhY2VVUkkpKSA/IAotICAgICAgICAJCXRoaXMuYnVpbGRGaWxlTmFtZUZyb20odGhpcy5kZWZhdWx0U2NoZW1hTmFtZSwgc3VnZ2VzdGVkRmlsZU5hbWUpIDogCi0gICAgICAgIAkJdGhpcy5tb2RpZnlGaWxlTmFtZShuYW1lc3BhY2VVUkkpOwotCSAgICAgICAgCQotICAgICAgICBmaWxlUGF0aCA9IHRoaXMuY2Fub25pY2FsRmlsZU5hbWUoZmlsZVBhdGgpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlUGF0aCk7Ci0JCVN0cmVhbVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KGZpbGUpOwotCQlyZXN1bHQuc2V0U3lzdGVtSWQoZmlsZS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCi0JCVN5c3RlbS5vdXQucHJpbnQoVG9vbHMuYmluZChKcHRKYXhiQ29yZU1lc3NhZ2VzLlNDSEVNQV9HRU5FUkFURUQsIGZpbGUpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgbWV0aG9kcyAqKioqKioqKioqCi0KLQkgcHJpdmF0ZSBTdHJpbmcgYnVpbGRGaWxlTmFtZUZyb20oU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgc3VnZ2VzdGVkRmlsZU5hbWUpIHsKLQotCQkgZmlsZU5hbWUgPSBUb29scy5zdHJpcEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0KLQkJIGlmKFRvb2xzLnN0cmluZ0lzRW1wdHkoZmlsZU5hbWUpKSB7Ci0JCQkgcmV0dXJuIHN1Z2dlc3RlZEZpbGVOYW1lOwotCQkgfQotCQkgU3RyaW5nIG51bWJlciA9IFRvb2xzLmV4dHJhY3RGaWxlTnVtYmVyKHN1Z2dlc3RlZEZpbGVOYW1lKTsKLQotCQkgZmlsZU5hbWUgPSB0aGlzLmJ1aWxkRmlsZU5hbWUoZmlsZU5hbWUsIG51bWJlcik7Ci0JCSByZXR1cm4gVG9vbHMuYXBwZW5kWHNkRXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkgfQotCi0JIHByaXZhdGUgU3RyaW5nIGJ1aWxkRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgbnVtYmVyKSB7Ci0KLQkJIGlmKFRvb2xzLnN0cmluZ0lzRW1wdHkobnVtYmVyKSkgewotCQkJIHJldHVybiBmaWxlTmFtZTsKLQkJIH0KLQkJIHJldHVybiAobnVtYmVyLmVxdWFscygiMCIpKSA/IGZpbGVOYW1lIDogZmlsZU5hbWUgKyBudW1iZXI7ICAgLy8kTk9OLU5MUy0xJAotCSB9Ci0JIAotCSBwcml2YXRlIFN0cmluZyBtb2RpZnlGaWxlTmFtZShTdHJpbmcgbmFtZXNwYWNlVVJJKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCSBTdHJpbmcgZGlyID0gVG9vbHMuZXh0cmFjdERpcmVjdG9yeSh0aGlzLmRlZmF1bHRTY2hlbWFOYW1lKTsKLQotCQkgU3RyaW5nIGZpbGVOYW1lID0gVG9vbHMuc3RyaXBQcm90b2NvbChuYW1lc3BhY2VVUkkpOwotCQkgZmlsZU5hbWUgPSBmaWxlTmFtZS5yZXBsYWNlQWxsKCIvIiwgIl8iKTsJCS8vJE5PTi1OTFMtMSQKLQkJIGZpbGVOYW1lID0gVG9vbHMuYXBwZW5kWHNkRXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQotCQlTdHJpbmcgcmVzdWx0ID0gKFRvb2xzLnN0cmluZ0lzRW1wdHkoZGlyKSkgPyBmaWxlTmFtZSA6IGRpciArIEZpbGUuc2VwYXJhdG9yICsgZmlsZU5hbWU7Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCSB9Ci0KLQkgcHJpdmF0ZSBTdHJpbmcgY2Fub25pY2FsRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNhbm9uaWNhbEZpbGUobmV3IEZpbGUoZmlsZU5hbWUpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0JCi0JIHByaXZhdGUgRmlsZSBjYW5vbmljYWxGaWxlKEZpbGUgZmlsZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQl9IAotCQljYXRjaCAoSU9FeGNlcHRpb24gaW9leGNlcHRpb24pIHsKLQkJCXJldHVybiBmaWxlLmdldEFic29sdXRlRmlsZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL0pwdEpheGJDb3JlTWVzc2FnZXMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9zY2hlbWFnZW4vaW50ZXJuYWwvSnB0SmF4YkNvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTE3MDUzLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9zY2hlbWFnZW4vaW50ZXJuYWwvSnB0SmF4YkNvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogTG9jYWxpemVkIG1lc3NhZ2VzIHVzZWQgYnkgRGFsaSBKQVhCIGNvcmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRKYXhiQ29yZU1lc3NhZ2VzCi17Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FESU5HX0NMQVNTRVMgPSAiTE9BRElOR19DTEFTU0VTIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUSU5HX1NDSEVNQSA9ICJHRU5FUkFUSU5HX1NDSEVNQSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0dFTkVSQVRFRCA9ICJTQ0hFTUFfR0VORVJBVEVEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfTk9UX0NSRUFURUQgPSAiU0NIRU1BX05PVF9DUkVBVEVEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRk9VTkQgPSAiTk9UX0ZPVU5EIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX0ZBQ1RPUllfTk9UX0ZPVU5EID0gIkNPTlRFWFRfRkFDVE9SWV9OT1RfRk9VTkQiOwotCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLmludGVybmFsLmpwdF9qYXhiX2NvcmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCXByaXZhdGUgSnB0SmF4YkNvcmVNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfQotCQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9Ub29scy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9Ub29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDI3NjYxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9zY2hlbWFnZW4vaW50ZXJuYWwvVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLS8qKgotICogIFRvb2xzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUb29scwotewotCS8qKiBkZWZhdWx0IGZpbGUgbmFtZSB1c2VkIGJ5IHRoZSBzY2hlbWFnZW4gKi8KLQlzdGF0aWMgcHVibGljIFN0cmluZyBHRU5fREVGQVVMVF9OQU1FID0gInNjaGVtYSI7ICAgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBlbXB0eSBzdHJpbmcgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIG51bGwsIGVtcHR5LCBvciBjb250YWlucwotCSAqIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0VtcHR5KFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdHJpbmdJc0VtcHR5XyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuKTsKLQl9CQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0VtcHR5XyhjaGFyW10gcywgaW50IGxlbikgewotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHNbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vICoqKioqKioqKiogc2hvcnQgbmFtZSBtYW5pcHVsYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyaXAgdGhlIGV4dGVuc2lvbiBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lCi0JICogYW5kIHJldHVybiB0aGUgcmVzdWx0LiBJZiB0aGUgZmlsZSBuYW1lIGhhcyBubwotCSAqIGV4dGVuc2lvbiwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkCi0JICogRmlsZSNiYXNlUGF0aCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBFeHRlbnNpb24oU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIGZpbGVOYW1lOwotCQl9Ci0JCXJldHVybiBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwUHJvdG9jb2woU3RyaW5nIHVyaSkgewotCi0JCSByZXR1cm4gdXJpLnJlcGxhY2VGaXJzdCgiaHR0cDovLyIsIEVNUFRZX1NUUklORyk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBlbmRYc2RFeHRlbnNpb24oU3RyaW5nIG5hbWUpIHsKLQotCQkgcmV0dXJuIG5hbWUgKyAiLnhzZCI7CQkvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0cmFjdEZpbGVOdW1iZXIoU3RyaW5nIGZpbGVOYW1lKSB7Ci0KLQkJIFN0cmluZyByZXN1bHQgPSBzdHJpcEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0JCSBpZihUb29scy5zdHJpbmdJc0VtcHR5KHJlc3VsdCkpIHsKLQkJCSByZXR1cm4gRU1QVFlfU1RSSU5HOwotCQkgfQotCQkgcmV0dXJuIHJlc3VsdC5yZXBsYWNlRmlyc3QoR0VOX0RFRkFVTFRfTkFNRSwgRU1QVFlfU1RSSU5HKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRyYWN0RGlyZWN0b3J5KFN0cmluZyBwYXRoKSB7Ci0JCWlmKCAhIHBhdGguY29udGFpbnMoRmlsZS5zZXBhcmF0b3IpKSB7Ci0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwkKLQkJfQotCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcikpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIE5MUyB1dGlsaXRpZXMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIEpwdEpheGJDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGtleSwgT2JqZWN0IGFyZ3VtZW50KSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJndW1lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9zY2hlbWFnZW4vaW50ZXJuYWwvanB0X2pheGJfY29yZS5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9qcHRfamF4Yl9jb3JlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MTEyY2QuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9qcHRfamF4Yl9jb3JlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotTE9BRElOR19DTEFTU0VTID0gbG9hZGluZy4uLgotR0VORVJBVElOR19TQ0hFTUEgPSBcbmdlbmVyYXRpbmcgc2NoZW1hLi4uCi1TQ0hFTUFfR0VORVJBVEVEID0gIFxuU2NoZW1hIHswfSBnZW5lcmF0ZWQKLVNDSEVNQV9OT1RfQ1JFQVRFRCA9ICBcblNjaGVtYSB7MH0gbm90IGNyZWF0ZWQKLU5PVF9GT1VORCA9ICBcblx0Tm90IGZvdW5kOiB7MH0KLUNPTlRFWFRfRkFDVE9SWV9OT1RfRk9VTkQgPSAgXG5UaGUgSkFYQkNvbnRleHRGYWN0b3J5IHswfSBcblwKLXNwZWNpZmllZCBpbiB0aGUgamF4Yi5wcm9wZXJ0aWVzIGZpbGUgY291bGQgbm90IGJlIGxvY2F0ZWQgb24gdGhlIHByb2plY3QgY2xhc3NwYXRoLiBcblwKLVRoZSBKQVhCIHByb3ZpZGVyIHRoYXQgZGVmaW5lcyB0aGlzIGZhY3Rvcnkgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBwcm9qZWN0IGNsYXNzcGF0aCwgXG5cCi1vciB0aGUgamF4Yi5wcm9wZXJ0aWVzIGZpbGUgc2hvdWxkIGJlIHJlbW92ZWQgdG8gdXNlIHRoZSBkZWZhdWx0IHByb3ZpZGVyLgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvLmNsYXNzcGF0aCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZTViMGIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pzdC8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJub25hY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS8uY3ZzaWdub3JlIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS8ucHJvamVjdCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGVhOTI5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpheGIuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1Njk2NTcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDc6MTggRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2Y1MGU1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy40LjIwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNi4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS40LjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjQwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjIuMTAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS40LjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuNDAxLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjYwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS42MDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS54c2Q7YnVuZGxlLXZlcnNpb249IlsyLjYuMCwzLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5mYWNldDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuZ2VuO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5qYXhiMjE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmpheGIyMjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwubGlicHJvdjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwubGlidmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucHJlZnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmpheGJpbmRleDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF4YnByb3BzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5saWJwcm92LAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0sCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF4YmluZGV4LAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF4YnByb3BzLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9hYm91dC5odG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGFmZDRhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zcmMuaW5jbHVkZXMgPSBzY2hlbWEvCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9jb21wb25lbnQueG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJmM2RlNS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0KLSAgQ29udHJpYnV0b3JzOgotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIC0tPgotCi08Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIj4KLQk8ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+Ci0JPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZDY1ZmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIENvcmUKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLUpBWEJfUExBVEZPUk1TID0gSkFYQiBQbGF0Zm9ybXMKLQotSkFYQl9JTkRFWF9DT05URU5UID0gSkFYQiBJbmRleCBGaWxlCi1KQVhCX1BST1BFUlRJRVNfQ09OVEVOVCA9IEpBWEIgUHJvcGVydGllcyBGaWxlCi0KLUpBWEJfUFJPQkxFTV9NQVJLRVIgPSBKQVhCIFByb2JsZW0KLQotR0VORVJJQ19QTEFURk9STV9HUk9VUF9MQUJFTCA9IEdlbmVyaWMgSkFYQgotR0VORVJJQ18yXzJfUExBVEZPUk1fTEFCRUwgPSBHZW5lcmljIEpBWEIgMi4yCi1HRU5FUklDXzJfMV9QTEFURk9STV9MQUJFTCA9IEdlbmVyaWMgSkFYQiAyLjEKLQotSkFYQl9GQUNFVF9MQUJFTCA9IEpBWEIKLUpBWEJfRkFDRVRfREVTQ1JJUFRJT04gPSBBZGRzIHN1cHBvcnQgZm9yIGRhdGEgYmluZGluZyB1c2luZyB0aGUgSmF2YSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nIChKQVhCKS4KLUpBWEJfVEVNUExBVEVfTEFCRUwgPSBKQVhCIFByb2plY3QKLQotSkFYQl9OT19PUF9MSUJSQVJZX1BST1ZJREVSX01FU1NBR0UgPSBUaGUgSkFYQiBmYWNldCByZXF1aXJlcyBhIEpBWEIgaW1wbGVtZW50YXRpb24gbGlicmFyeSB0byBiZSBwcmVzZW50IG9uIHRoZSBwcm9qZWN0IGNsYXNzcGF0aC4gQnkgZGlzYWJsaW5nIGxpYnJhcnkgY29uZmlndXJhdGlvbiwgdGhlIHVzZXIgdGFrZXMgb24gdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGVuc3VyaW5nIHRoYXQgdGhlIGNsYXNzcGF0aCBpcyBjb25maWd1cmVkIGFwcHJvcHJpYXRlbHkgdmlhIGFsdGVybmF0ZSBtZWFucy4KLQotSkFYQl9KUkVfTElCUkFSWV9QUk9WSURFUl9MQUJFTCA9IEpSRQotSkFYQl9KUkVfTElCUkFSWV9QUk9WSURFUl9NRVNTQUdFID0gVGhlIHByb2plY3QgSlJFIHByb3ZpZGVzIHRoZSBhbm5vdGF0aW9ucyBhbmQgaW1wbGVtZW50YXRpb24gdG8gc3VwcG9ydCB0aGUgY2hvc2VuIEpBWEIgcGxhdGZvcm0uCi0KLUpBWEJfVkFMSURBVE9SID0gSkFYQiBWYWxpZGF0b3IKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3BsdWdpbi54bWwgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmUzN2Y1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjQiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0KLSAgQ29udHJpYnV0b3JzOiAKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAtLT4KLQotPHBsdWdpbj4KLQkKLQk8IS0tICoqKioqIGV4dGVuc2lvbiBwb2ludHMgKioqKiogLS0+Ci0JCi0JPGV4dGVuc2lvbi1wb2ludAotCQlpZD0iamF4YlBsYXRmb3JtcyIKLQkJbmFtZT0iJUpBWEJfUExBVEZPUk1TIgotCQlzY2hlbWE9InNjaGVtYS9qYXhiUGxhdGZvcm1zLmV4c2QiLz4KLQkKLQkKLQk8IS0tICoqKioqIGFkYXB0ZXJzICoqKioqIC0tPgotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLQotCQk8ZmFjdG9yeQotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuUmVzb3VyY2VBZGFwdGVyRmFjdG9yeSIKLQkJCWFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0JCQk8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIi8+Ci0JCTwvZmFjdG9yeT4KLQotCQk8ZmFjdG9yeQotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuSmF2YUVsZW1lbnRBZGFwdGVyRmFjdG9yeSIKLQkJCWFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCI+Ci0JCQk8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIi8+Ci0JCTwvZmFjdG9yeT4KLQkJCi0JCTwhLS0gSVBhY2thZ2VGcmFnbWVudCAtPiBKYXhiUGFja2FnZSAtLT4KLQkJPGZhY3RvcnkKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuSmF4YlBhY2thZ2VBZGFwdGVyRmFjdG9yeSIKLQkJCWFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQiPgotCQkJPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlIi8+Ci0JCTwvZmFjdG9yeT4KLQotCQk8ZmFjdG9yeQotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwubGlicHJvdi5KYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZ0FkYXB0ZXJGYWN0b3J5IgotCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5saWJwcm92LkpheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIj4KLQkJCTxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24iLz4KLQkJPC9mYWN0b3J5PgotCi0JPC9leHRlbnNpb24+Ci0KLQotCTwhLS0gKioqKiogY29udGVudCB0eXBlcyAqKioqKiAtLT4KLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlLmNvbnRlbnRUeXBlcyI+Ci0JCQotCQk8Y29udGVudC10eXBlCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZW50LmpheGJJbmRleCIKLQkJCW5hbWU9IiVKQVhCX0lOREVYX0NPTlRFTlQiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS50ZXh0IgotCQkJcHJpb3JpdHk9ImhpZ2giCi0JCQlmaWxlLW5hbWVzPSJqYXhiLmluZGV4Ii8+Ci0JCQotCQk8Y29udGVudC10eXBlCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZW50LmpheGJQcm9wZXJ0aWVzIgotCQkJbmFtZT0iJUpBWEJfUFJPUEVSVElFU19DT05URU5UIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhUHJvcGVydGllcyIKLQkJCXByaW9yaXR5PSJoaWdoIgotCQkJZmlsZS1uYW1lcz0iamF4Yi5wcm9wZXJ0aWVzIi8+Ci0JCQotCQk8ZmlsZS1hc3NvY2lhdGlvbgotCQkJY29udGVudC10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJZmlsZS1leHRlbnNpb25zPSJ4amIiLz4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0KLQk8IS0tICoqKioqIHByb3BlcnR5IHRlc3RlcnMgKioqKiogLS0+Ci0JCi0JPGV4dGVuc2lvbiAKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMucHJvcGVydHlUZXN0ZXJzIj4KLQotCQk8cHJvcGVydHlUZXN0ZXIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnByb3BlcnR5VGVzdGVyLmpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIgotCQkJdHlwZT0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiIKLQkJCW5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSIKLQkJCXByb3BlcnRpZXM9ImpheGJQbGF0Zm9ybSwgamF4YlBsYXRmb3JtR3JvdXAiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1UZXN0ZXIiLz4KLQkJCi0JCTxwcm9wZXJ0eVRlc3RlcgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucHJvcGVydHlUZXN0ZXIuamF4YlBhY2thZ2UiCi0JCQl0eXBlPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2UiCi0JCQluYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUiCi0JCQlwcm9wZXJ0aWVzPSJoYXNQYWNrYWdlSW5mbyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuSmF4YlBhY2thZ2VUZXN0ZXIiLz4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCQkKLQotCTwhLS0gKioqKiogbWFya2VycyAqKioqKiAtLT4KLQk8IS0tCi0JKioqCURvIE5PVCBxdWFsaWZ5IHRoZSBtYXJrZXIgaWQgd2l0aCAib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSIuCi0JKioqIFNlZSBidWcgMjUyODkxLgotCS0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiCi0JCWlkPSJqYXhiUHJvYmxlbU1hcmtlciIgCi0JCW5hbWU9IiVKQVhCX1BST0JMRU1fTUFSS0VSIj4KLQotCQk8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgotCQkKLQkJPCEtLSBDYW4ndCB1c2UgdGV4dCBtYXJrZXIgdW50aWwgd2UgaGF2ZSBzcGVjaWZpYyBtb2RlbHMgZm9yIGVhY2ggaW5wdXQgdHlwZSAoWE1MLCBqYXZhKQotCQk8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGV4dG1hcmtlciIvPgotCQktLT4KLQkJCi0JCTxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5wcm9ibGVtbWFya2VyMiIvPgotCQk8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUucHJvYmxlbSIvPgotCTwvZXh0ZW5zaW9uPgotCi0KLQk8IS0tICoqKioqIERhbGkgZXh0ZW5zaW9ucyAoZWF0IG91ciBvd24gZG9nZm9vZCkgKioqKiogLS0+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmpheGJQbGF0Zm9ybXMiPgotCQkKLQkJPGpheGJQbGF0Zm9ybUdyb3VwCi0gICAgICAgIAlpZD0iZ2VuZXJpYyIKLSAgICAgICAgCWxhYmVsPSIlR0VORVJJQ19QTEFURk9STV9HUk9VUF9MQUJFTCIvPgotCQkKLQkJPGpheGJQbGF0Zm9ybQotCQkJaWQ9ImdlbmVyaWNfMl8xIgotCQkJbGFiZWw9IiVHRU5FUklDXzJfMV9QTEFURk9STV9MQUJFTCIKLQkJCWZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5qYXhiMjEuR2VuZXJpY0pheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkiCi0JCQlncm91cD0iZ2VuZXJpYyIKLQkJCWpheGJGYWNldFZlcnNpb249IjIuMSIKLQkJCWRlZmF1bHQ9ImZhbHNlIi8+Ci0KLQkJPGpheGJQbGF0Zm9ybQotICAgICAgIAkgCWlkPSJnZW5lcmljXzJfMiIKLSAgICAgICAJIAlsYWJlbD0iJUdFTkVSSUNfMl8yX1BMQVRGT1JNX0xBQkVMIgotICAgICAgIAkgCWZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5qYXhiMjIuR2VuZXJpY0pheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkiCi0gICAgICAgIAlncm91cD0iZ2VuZXJpYyIKLSAgICAgICAgCWpheGJGYWNldFZlcnNpb249IjIuMiIKLSAgICAgICAgCWRlZmF1bHQ9ImZhbHNlIi8+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJyYXJ5VmFsaWRhdG9ycyI+Ci0JCQotCQk8bGlicmFyeVZhbGlkYXRvcgotCQkJaWQ9ImpheGJKcmVMaWJyYXJ5VmFsaWRhdG9yIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwubGlidmFsLkpheGJKcmVMaWJyYXJ5VmFsaWRhdG9yIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJsaWJyYXJ5UHJvdmlkZXIiPgotCQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmV4dGVuZHNJZCIKLQkJCQkJCXZhbHVlPSJqYXhiLWpyZS1saWJyYXJ5LXByb3ZpZGVyIi8+Ci0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2xpYnJhcnlWYWxpZGF0b3I+Ci0JCQotCQk8bGlicmFyeVZhbGlkYXRvcgotCQkJaWQ9ImdlbmVyaWNKYXhiVXNlckxpYnJhcnlWYWxpZGF0b3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5saWJ2YWwuR2VuZXJpY0pheGJVc2VyTGlicmFyeVZhbGlkYXRvciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0ibGlicmFyeVByb3ZpZGVyIj4KLQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5leHRlbmRzSWQiCi0JCQkJCQl2YWx1ZT0iamF4Yi11c2VyLWxpYnJhcnktcHJvdmlkZXIiLz4KLQkJCQk8L3dpdGg+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvbGlicmFyeVZhbGlkYXRvcj4KLQkJCi0JCTwhLS0KLQkJPGxpYnJhcnlWYWxpZGF0b3IKLQkJCWlkPSJnZW5lcmljRWNsaXBzZWxpbmtCdW5kbGVzTGlicmFyeVZhbGlkYXRvciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5saWJ2YWwuR2VuZXJpY0VjbGlwc2VMaW5rQnVuZGxlc0xpYnJhcnlWYWxpZGF0b3IiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImxpYnJhcnlQcm92aWRlciI+Ci0JCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5leHRlbmRzSWQiCi0JCQkJCQl2YWx1ZT0iZWNsaXBzZWxpbmstYnVuZGxlcy1saWJyYXJ5LXByb3ZpZGVyIi8+Ci0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2xpYnJhcnlWYWxpZGF0b3I+Ci0JCS0tPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uIAotCQlwb2ludD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicmFyeVByb3ZpZGVycyI+Ci0JCQotCQk8cHJvdmlkZXIKLQkJCWlkPSJqYXhiLW5vLW9wLWxpYnJhcnktcHJvdmlkZXIiCi0JCQlleHRlbmRzPSJqcHQtbm8tb3AtbGlicmFyeS1wcm92aWRlciI+Ci0JCQk8cGFyYW0gbmFtZT0ibWVzc2FnZSIgdmFsdWU9IiVKQVhCX05PX09QX0xJQlJBUllfUFJPVklERVJfTUVTU0FHRSIvPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHdpdGggdmFyaWFibGU9InJlcXVlc3RpbmdQcm9qZWN0RmFjZXQiPgotCQkJCQk8dGVzdCAKLQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIAotCQkJCQkJdmFsdWU9ImpwdC5qYXhiIiBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiLz4KLQkJCQk8L3dpdGg+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvcHJvdmlkZXI+Ci0JCQotCQk8cHJvdmlkZXIKLQkJCWlkPSJqYXhiLWpyZS1saWJyYXJ5LXByb3ZpZGVyIj4KLQkJCTxsYWJlbD4lSkFYQl9KUkVfTElCUkFSWV9QUk9WSURFUl9MQUJFTDwvbGFiZWw+Ci0JCQk8cHJpb3JpdHk+OTAwPC9wcmlvcml0eT4KLQkJCTxwYXJhbSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iJUpBWEJfSlJFX0xJQlJBUllfUFJPVklERVJfTUVTU0FHRSIvPgotICAgICAgCQk8ZW5hYmxlbWVudD4KLSAgICAgIAkJCTxhbmQ+Ci0JCQkJCTx3aXRoIHZhcmlhYmxlPSJyZXF1ZXN0aW5nUHJvamVjdEZhY2V0Ij4KLQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIAotCQkJCQkJCXZhbHVlPSJqcHQuamF4YiIgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIi8+Ci0JCQkJCTwvd2l0aD4KLQkJCQk8L2FuZD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJCTxhY3Rpb24gdHlwZT0iSU5TVEFMTCI+Ci0JCQkJPGNvbmZpZyBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5saWJwcm92LkpheGJKcmVMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIi8+Ci0JCQkJPG9wZXJhdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5Ob09wTGlicmFyeVByb3ZpZGVyT3BlcmF0aW9uIi8+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24gdHlwZT0iVU5JTlNUQUxMIj4KLQkJCQk8b3BlcmF0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92Lk5vT3BMaWJyYXJ5UHJvdmlkZXJPcGVyYXRpb24iLz4KLQkJCTwvYWN0aW9uPgotCQk8L3Byb3ZpZGVyPgotCQkKLQkJPHByb3ZpZGVyCi0JCQlpZD0iamF4Yi11c2VyLWxpYnJhcnktcHJvdmlkZXIiCi0JCQlleHRlbmRzPSJ3dHAtdXNlci1saWJyYXJ5LXByb3ZpZGVyIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJyZXF1ZXN0aW5nUHJvamVjdEZhY2V0Ij4KLQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgCi0JCQkJCQl2YWx1ZT0ianB0LmpheGIiIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIvPgotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJCTxhY3Rpb24gdHlwZT0iSU5TVEFMTCI+Ci0JCQkJPGNvbmZpZyBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5saWJwcm92LkpheGJVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyIvPgotCQkJCTxvcGVyYXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguV3RwVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb24iLz4KLQkJCTwvYWN0aW9uPgotCQk8L3Byb3ZpZGVyPgotCQkKLQkJPCEtLQotCQk8cHJvdmlkZXIgCi0JCQlpZD0iamF4Yi1vc2dpLWJ1bmRsZXMtbGlicmFyeS1wcm92aWRlciIKLQkJCWV4dGVuZHM9Ind0cC1vc2dpLWJ1bmRsZXMtbGlicmFyeS1wcm92aWRlciIKLQkJCWFic3RyYWN0PSJ0cnVlIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJyZXF1ZXN0aW5nUHJvamVjdEZhY2V0Ij4KLQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgCi0JCQkJCQl2YWx1ZT0ianB0LmpheGIiIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIvPgotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJCTxhY3Rpb24gdHlwZT0iSU5TVEFMTCI+Ci0JCQkJPGNvbmZpZyBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5saWJwcm92LkpheGJPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWciLz4KLQkJCQk8b3BlcmF0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLld0cE9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbiIvPgotCQkJPC9hY3Rpb24+Ci0JCTwvcHJvdmlkZXI+Ci0JCQotCQk8cHJvdmlkZXIKLQkJCWlkPSJqYXhiLWVjbGlwc2VsaW5rLWJ1bmRsZXMtbGlicmFyeS1wcm92aWRlciIKLQkJCWV4dGVuZHM9ImpheGItb3NnaS1idW5kbGVzLWxpYnJhcnktcHJvdmlkZXIiCi0JCQlhYnN0cmFjdD0idHJ1ZSIvPgotCQktLT4KLQkJCi0JPC9leHRlbnNpb24+Ci0KLQotCTwhLS0gKioqKiogV1RQIGZhY2V0IGZyYW1ld29yayAqKioqKiAtLT4KLQotCTxleHRlbnNpb24gCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0JCQotCQk8c3VwcG9ydGVkPgotCQkJPGZhY2V0IGlkPSJqcHQuamF4YiIvPgotCQkJPHJ1bnRpbWUtY29tcG9uZW50IGFueT0idHJ1ZSIvPgotCQk8L3N1cHBvcnRlZD4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIj4KLQkJCi0JCTxwcm9qZWN0LWZhY2V0IGlkPSJqcHQuamF4YiI+Ci0JCQk8bGFiZWw+JUpBWEJfRkFDRVRfTEFCRUw8L2xhYmVsPgotCQkJPGRlc2NyaXB0aW9uPiVKQVhCX0ZBQ0VUX0RFU0NSSVBUSU9OPC9kZXNjcmlwdGlvbj4KLQkJCTxkZWZhdWx0LXZlcnNpb24gdmVyc2lvbj0iMi4xIi8+Ci0JCTwvcHJvamVjdC1mYWNldD4KLQkJCi0JCTxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpwdC5qYXhiIiB2ZXJzaW9uPSIyLjEiPgotCQkJPGNvbnN0cmFpbnQ+Ci0JCQkJPHJlcXVpcmVzIGZhY2V0PSJqYXZhIiB2ZXJzaW9uPSJbNS4wIi8+Ci0JCQk8L2NvbnN0cmFpbnQ+Ci0JCTwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCQkKLQkJPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0ianB0LmpheGIiIHZlcnNpb249IjIuMiI+Ci0JCQk8Y29uc3RyYWludD4KLQkJCQk8cmVxdWlyZXMgZmFjZXQ9ImphdmEiIHZlcnNpb249Ils1LjAiLz4KLQkJCTwvY29uc3RyYWludD4KLQkJPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0JCQotCQk8dGVtcGxhdGUgaWQ9ImpwdC5qYXhiLnRlbXBsYXRlIj4KLQkJCTxsYWJlbD4lSkFYQl9URU1QTEFURV9MQUJFTDwvbGFiZWw+Ci0JCQk8Zml4ZWQgZmFjZXQ9ImpwdC5qYXhiIi8+Ci0JCQk8Zml4ZWQgZmFjZXQ9ImphdmEiLz4KLQkJPC90ZW1wbGF0ZT4KLQkJCi0JCTxhY3Rpb24gZmFjZXQ9ImpwdC5qYXhiIiB0eXBlPSJpbnN0YWxsIiBpZD0ianB0LmpheGIuaW5zdGFsbCI+Ci0JCQk8Y29uZmlnLWZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuZmFjZXQuSmF4YkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIi8+Ci0JCQk8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuZmFjZXQuSmF4YkZhY2V0SW5zdGFsbERlbGVnYXRlIi8+Ci0JCTwvYWN0aW9uPgotCQkKLQkJPGFjdGlvbiBmYWNldD0ianB0LmpheGIiIHR5cGU9InZlcnNpb24tY2hhbmdlIiBpZD0ianB0LmpheGIudmVyc2lvbi1jaGFuZ2UiPgotCQkJPGNvbmZpZy1mYWN0b3J5IGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmZhY2V0LkpheGJGYWNldFZlcnNpb25DaGFuZ2VEYXRhTW9kZWxQcm92aWRlciIvPgotCQkJPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmZhY2V0LkpheGJGYWNldFZlcnNpb25DaGFuZ2VEZWxlZ2F0ZSIvPgotCQk8L2FjdGlvbj4KLQkJCi0JCTxhY3Rpb24gZmFjZXQ9ImpwdC5qYXhiIiB0eXBlPSJ1bmluc3RhbGwiIGlkPSJqcHQuamF4Yi51bmluc3RhbGwiPgotCQkJPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmZhY2V0LkpheGJGYWNldFVuaW5zdGFsbERlbGVnYXRlIi8+Ci0JCTwvYWN0aW9uPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQotCTwhLS0gKioqKiogV1RQIHZhbGlkYXRpb24gZnJhbWV3b3JrICoqKioqIC0tPgotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yVjIiCi0JCWlkPSJqYXhiVmFsaWRhdG9yIgotCQluYW1lPSIlSkFYQl9WQUxJREFUT1IiPgotCQkKLQkJPHZhbGlkYXRvcgotICAgICAgICAJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KYXhiVmFsaWRhdG9yIgotICAgICAgICAJbWFya2VySWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuamF4YlByb2JsZW1NYXJrZXIiPgotCQkJPGluY2x1ZGU+Ci0JCQkJPHJ1bGVzPgotCQkJCQk8ZmFjZXQgaWQ9ImpwdC5qYXhiIi8+Ci0JCQkJPC9ydWxlcz4KLQkJCTwvaW5jbHVkZT4KLQkJCTxpbmNsdWRlPgotCQkJCTxydWxlcz4KLQkJCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhU291cmNlIiBleGFjdE1hdGNoPSJmYWxzZSIvPgotCQkJCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRlbnQuamF2YVBhY2thZ2VJbmZvIiBleGFjdE1hdGNoPSJmYWxzZSIvPgotCQkJCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGVudC5qYXhiUHJvcGVydGllcyIgZXhhY3RNYXRjaD0iZmFsc2UiLz4KLQkJCQk8L3J1bGVzPgotCQkJPC9pbmNsdWRlPgotCQk8L3ZhbGlkYXRvcj4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9wcm9wZXJ0eV9maWxlcy9qYXhiX3ZhbGlkYXRpb24ucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3Byb3BlcnR5X2ZpbGVzL2pheGJfdmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGZiOGQxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3Byb3BlcnR5X2ZpbGVzL2pheGJfdmFsaWRhdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLU5PX0pBWEJfUFJPSkVDVCA9IFRoaXMgcHJvamVjdCBoYXMgdGhlIEpBWEIgZmFjZXQsIGJ1dCBubyBKQVhCIGNvbnRlbnQgY291bGQgYmUgY3JlYXRlZC4gIFNlZSB0aGUgZXJyb3IgbG9nIGZvciBtb3JlIGRldGFpbHMuCi1QUk9KRUNUX0lOVkFMSURfTElCUkFSWV9QUk9WSURFUiA9IFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgSkFYQiBsaWJyYXJ5IHByb3ZpZGVyIGlzIGludmFsaWQuCi1QUk9KRUNUX19VTlJFU09MVkVEX1NDSEVNQSA9IENhbm5vdCByZXNvbHZlIHRoZSBzY2hlbWEgd2l0aCBsb2NhdGlvbiAnJ3swfScnLgotUFJPSkVDVF9fRFVQTElDQVRFX05BTUVTUEFDRSA9IER1cGxpY2F0ZSBzY2hlbWEgbGlicmFyeSBlbnRyaWVzIHdpdGggdGhlIG5hbWVzcGFjZSAnJ3swfScnLgotCi1QQUNLQUdFX05PX1NDSEVNQV9GT1JfTkFNRVNQQUNFID0gVGhlcmUgaXMgbm8gc2NoZW1hIHNwZWNpZmllZCBvbiB0aGUgcHJvamVjdCBmb3IgdGhlIG5hbWVzcGFjZSAnJ3swfScnIG9uIHRoZSBwYWNrYWdlICcnezF9JycuICBObyBzY2hlbWEtc3BlY2lmaWMgdmFsaWRhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZC4KLVBBQ0tBR0VfWE1MX0pBVkFfVFlQRV9BREFQVEVSX1RZUEVfTk9UX1NQRUNJRklFRCA9IFRoZSB0eXBlIG11c3QgYmUgc3BlY2lmaWVkIGZvciBhbiBYTUwgSmF2YSB0eXBlIGFkYXB0ZXIgb24gYSBwYWNrYWdlCi1YTUxfU0NIRU1BX19NSVNNQVRDSEVEX0FUVFJJQlVURV9GT1JNX0RFRkFVTFQgPSBUaGUgYXR0cmlidXRlIGZvcm0gZGVmYXVsdCBjb25mbGljdHMgd2l0aCB3aGF0IGlzIHNwZWNpZmllZCBvbiB0aGUgc2NoZW1hCi1YTUxfU0NIRU1BX19NSVNNQVRDSEVEX0VMRU1FTlRfRk9STV9ERUZBVUxUID0gVGhlIGVsZW1lbnQgZm9ybSBkZWZhdWx0IGNvbmZsaWN0cyB3aXRoIHdoYXQgaXMgc3BlY2lmaWVkIG9uIHRoZSBzY2hlbWEKLQotWE1MX0VOVU1fX05PTl9TSU1QTEVfU0NIRU1BX1RZUEUgPSBUaGUgdHlwZSAnJ3swfScnIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgc2ltcGxlIHNjaGVtYSB0eXBlLgotCi1YTUxfVFlQRV9fVU5NQVRDSElOR19OQU1FU1BBQ0VfRk9SX0FOT05ZTU9VU19UWVBFID0gVGhlIG5hbWVzcGFjZSBmb3IgYW4gYW5vbnltb3VzIHR5cGUgc2hvdWxkIG5vdCBiZSBkaWZmZXJlbnQgZnJvbSBpdHMgcGFja2FnZQotWE1MX1RZUEVfX1VOU1BFQ0lGSUVEX0ZBQ1RPUllfTUVUSE9EID0gSWYgYSBmYWN0b3J5IGNsYXNzIGlzIHNwZWNpZmllZCwgYSBmYWN0b3J5IG1ldGhvZCBtdXN0IGFsc28gYmUgc3BlY2lmaWVkLgotWE1MX1RZUEVfX05PX1BVQkxJQ19PUl9QUk9URUNURURfQ09OU1RSVUNUT1IgPSBBIGNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyBvciBwcm90ZWN0ZWQgbm8tYXJnIGNvbnN0cnVjdG9yLCB1bmxlc3MgYSBmYWN0b3J5IGNsYXNzL21ldGhvZCBpcyBwcm92aWRlZCBvciB0aGUgY2xhc3MgaXMgYWRhcHRlZCB3aXRoIGFuIFhtbEFkYXB0ZXIuCi1YTUxfVFlQRV9fRFVQTElDQVRFX1BST1AgPSBEdXBsaWNhdGUgcHJvcGVydHkgJyd7MH0nJy4KLVhNTF9UWVBFX19NSVNTSU5HX1BST1AgPSBNaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5ICcnezB9JycuCi1YTUxfVFlQRV9fTk9ORVhJU1RFTlRfUFJPUCA9IE5vbmV4aXN0ZW50IHByb3BlcnR5ICcnezB9JycuCi1YTUxfVFlQRV9fVFJBTlNJRU5UX1BST1AgPSBUaGUgcHJvcGVydHkgJyd7MH0nJyBpcyB0cmFuc2llbnQgYW5kIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIHByb3BlcnR5IG9yZGVyLgotWE1MX1RZUEVfX0ZBQ1RPUllfQ0xBU1NfSUdOT1JFRF9GT1JfRU5VTSA9IFRoZSBmYWN0b3J5IGNsYXNzIGVsZW1lbnQgaXMgaWdub3JlZCBmb3IgZW51bXMuCi1YTUxfVFlQRV9fRkFDVE9SWV9NRVRIT0RfSUdOT1JFRF9GT1JfRU5VTSA9IFRoZSBmYWN0b3J5IG1ldGhvZCBlbGVtZW50IGlzIGlnbm9yZWQgZm9yIGVudW1zLgotWE1MX1RZUEVfX1BST1BfT1JERVJfSUdOT1JFRF9GT1JfRU5VTSA9IFRoZSBwcm9wIG9yZGVyIGVsZW1lbnQgaXMgaWdub3JlZCBmb3IgZW51bXMuCi0KLVhNTF9ST09UX0VMRU1FTlRfVFlQRV9DT05GTElDVFNfV0lUSF9YTUxfVFlQRSA9IFRoZSB4bWwgdHlwZSBvZiB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiB3aXRoIG5hbWUgJyd7MH0nJyBhbmQgbmFtZXNwYWNlICcnezF9JycgY29uZmxpY3RzIHdpdGggdGhlIHhtbCB0eXBlIG9mIHRoZSBhc3NvY2lhdGVkIGNsYXNzCi0KLVhNTF9FTlVNX1ZBTFVFX19JTlZBTElEX0xFWElDQUxfVkFMVUUgPSBJbnZhbGlkIGxleGljYWwgdmFsdWUgXCJ7MH1cIiBmb3Igc2NoZW1hIHR5cGUgJyd7MX0nJy4KLQotQVRUUklCVVRFX01BUFBJTkdfX1VOU1VQUE9SVEVEX0FOTk9UQVRJT04gPSBUaGUgYW5ub3RhdGlvbiAnJ3swfScnIGlzIG5vdCBhbGxvd2VkIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAnJ3sxfScnLiAKLUFUVFJJQlVURV9NQVBQSU5HX1hNTF9KQVZBX1RZUEVfQURBUFRFUl9UWVBFX05PVF9ERUZJTkVEID0gVGhlIHR5cGUgZm9yIFhNTCBKYXZhIHR5cGUgYWRhcHRlciBpcyBub3QgZGVmaW5lZC4KLVhNTF9FTEVNRU5UX1dSQVBQRVJfREVGSU5FRF9PTl9OT05fQVJSQVlfTk9OX0NPTExFQ1RJT04gPSBBbiBYTUwgZWxlbWVudCB3cmFwcGVyIG1heSBvbmx5IGJlIGRlZmluZWQgb24gYSBjb2xsZWN0aW9uIG9yIGFycmF5IHByb3BlcnR5Ci0KLVhNTF9BTllfQVRUUklCVVRFX19NVUxUSVBMRV9NQVBQSU5HU19ERUZJTkVEID0gTXVsdGlwbGUgYXR0cmlidXRlcyBhcmUgYW5ub3RhdGVkIHdpdGggQFhtbEFueUF0dHJpYnV0ZS4gIEF0IG1vc3Qgb25lIGZpZWxkIG9yIHByb3BlcnR5IHBlciBjbGFzcyBpcyBhbGxvd2VkLgotWE1MX0FOWV9BVFRSSUJVVEVfX05PTl9NQVBfVFlQRSA9IFRoZSB0eXBlIG9mIGEgZmllbGQgb3IgcHJvcGVydHkgYW5ub3RhdGVkIHdpdGggQFhtbEFueUF0dHJpYnV0ZSBtdXN0IGJlIGFzc2lnbmFibGUgdG8gamF2YS51dGlsLk1hcC4KLQotWE1MX0FOWV9FTEVNRU5UX19NVUxUSVBMRV9NQVBQSU5HU19ERUZJTkVEID0gTXVsdGlwbGUgYXR0cmlidXRlcyBhcmUgYW5ub3RhdGVkIHdpdGggQFhtbEFueUVsZW1lbnQuICBBdCBtb3N0IG9uZSBmaWVsZCBvciBwcm9wZXJ0eSBwZXIgY2xhc3MgaXMgYWxsb3dlZC4KLQotWE1MX0FUVFJJQlVURV9fSU5WQUxJRF9TQ0hFTUFfVFlQRSA9IFRoZSBleHBlY3RlZCBYTUwgdHlwZSBhc3NvY2lhdGVkIHdpdGggJyd7MH0nJyBpcyBub3QgdmFsaWQgZm9yIFhNTCBhdHRyaWJ1dGUgJyd7MX0nJy4KLQotWE1MX0VMRU1FTlRfX1VOU1BFQ0lGSUVEX1RZUEUgPSBVbnNwZWNpZmllZCBYTUwgZWxlbWVudCB0eXBlLgotWE1MX0VMRU1FTlRfX0lMTEVHQUxfVFlQRSA9IFhNTCBlbGVtZW50IHR5cGUgbXVzdCBiZSBhIHN1Yi10eXBlIG9mICcnezB9JycuCi1YTUxfRUxFTUVOVF9fSU5WQUxJRF9TQ0hFTUFfVFlQRSA9IFRoZSBleHBlY3RlZCBYTUwgdHlwZSBhc3NvY2lhdGVkIHdpdGggJyd7MH0nJyBpcyBub3QgdmFsaWQgZm9yIFhNTCBlbGVtZW50ICcnezF9JycuCi0KLVhNTF9FTEVNRU5UX0RFQ0xfX0lOVkFMSURfTUVUSE9EX1NJR05BVFVSRV9SRVRVUk5fVFlQRSA9IEFuIGVsZW1lbnQgZmFjdG9yeSBtZXRob2QgbXVzdCBoYXZlIGEgcmV0dXJuIHR5cGUgb2YgJydqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudCcnLgotWE1MX0VMRU1FTlRfREVDTF9fSU5WQUxJRF9NRVRIT0RfU0lHTkFUVVJFX1BBUkFNID0gQW4gZWxlbWVudCBmYWN0b3J5IG1ldGhvZCBtdXN0IGhhdmUgYSBzaW5nbGUgcGFyYW1ldGVyIGFzc2lnbmFibGUgdG8gJydqYXZhLmxhbmcuT2JqZWN0JycuCi1YTUxfRUxFTUVOVF9ERUNMX19TVUJTVF9IRUFEX05BTUVfRVFVQUxTX05BTUUgPSBYTUwgZWxlbWVudCBkZWNsIHN1YnN0aXR1dGlvbiBoZWFkIG11c3Qgbm90IG1hdGNoIGl0cyBYTUwgZWxlbWVudC4KLVhNTF9FTEVNRU5UX0RFQ0xfX1NVQlNUX0hFQURfTk9fTUFUQ0hJTkdfRUxFTUVOVF9ERUNMID0gWE1MIGVsZW1lbnQgZGVjbCBzdWJzdGl0dXRpb24gaGVhZCBtdXN0IG1hdGNoIGFub3RoZXIgWE1MIGVsZW1lbnQgZGVjbC4KLQotWE1MX0VMRU1FTlRfUkVGX19VTlNQRUNJRklFRF9UWVBFID0gVW5zcGVjaWZpZWQgWE1MIGVsZW1lbnQgcmVmIHR5cGUuCi1YTUxfRUxFTUVOVF9SRUZfX0lMTEVHQUxfVFlQRSA9IFhNTCBlbGVtZW50IHJlZiB0eXBlIG11c3QgYmUgYSBzdWItdHlwZSBvZiAnJ3swfScnLgotWE1MX0VMRU1FTlRfUkVGX19OT19ST09UX0VMRU1FTlQgPSBObyByb290IGVsZW1lbnQgc3BlY2lmaWVkIG9uIHR5cGUgJyd7MH0nJyBvciBhbnkgb2YgaXRzIHN1Yi10eXBlcy4KLVhNTF9FTEVNRU5UX1JFRl9fTk9fUkVHSVNUUlkgPSBObyBYTUwgcmVnaXN0cnkgY29uZmlndXJlZCBmb3IgdGhpcyBwYWNrYWdlLgotWE1MX0VMRU1FTlRfUkVGX19OT19NQVRDSElOR19FTEVNRU5UX0RFQ0wgPSBObyBYTUwgZWxlbWVudCBkZWNsIGluIHRoZSBYTUwgcmVnaXN0cnkgbWF0Y2hpbmcgdGhlIG5hbWVzcGFjZSAnJ3swfScnIGFuZCBuYW1lICcnezF9JycuCi0KLVhNTF9FTEVNRU5UX1JFRlNfX0RVUExJQ0FURV9YTUxfRUxFTUVOVF9UWVBFID0gRHVwbGljYXRlIHR5cGUgJyd7MH0nJyBpbiBYTUwgZWxlbWVudCByZWZzLgotWE1MX0VMRU1FTlRfUkVGU19fRFVQTElDQVRFX1hNTF9FTEVNRU5UX1FOQU1FID0gRHVwbGljYXRlIGVsZW1lbnQgbmFtZSAnJ3swfScnIGluIFhNTCBlbGVtZW50IHJlZnMuCi0JCi1YTUxfRUxFTUVOVFNfX0RVUExJQ0FURV9YTUxfRUxFTUVOVF9UWVBFID0gRHVwbGljYXRlIHR5cGUgJyd7MH0nJyBpbiBYTUwgZWxlbWVudHMuCi1YTUxfRUxFTUVOVFNfX0RVUExJQ0FURV9YTUxfRUxFTUVOVF9RTkFNRSA9IER1cGxpY2F0ZSBlbGVtZW50IG5hbWUgJyd7MH0nJyBpbiBYTUwgZWxlbWVudHMuCi0KLVhNTF9JRF9fTVVMVElQTEVfTUFQUElOR1NfREVGSU5FRCA9IE11bHRpcGxlIGF0dHJpYnV0ZXMgYXJlIG1hcHBlZCBhcyBYbWxJRC4gIEF0IG1vc3Qgb25lIGZpZWxkIG9yIHByb3BlcnR5IHBlciBjbGFzcyBpcyBhbGxvd2VkLgotWE1MX0lEX19BVFRSSUJVVEVfVFlQRV9OT1RfU1RSSU5HID0gQW4gYXR0cmlidXRlIG1hcHBlZCBhcyBYbWxJRCBtdXN0IGhhdmUgdHlwZSAnJ2phdmEubGFuZy5TdHJpbmcnJy4KLVhNTF9JRF9fU0NIRU1BX1RZUEVfTk9UX0lEID0gSW4gb3JkZXIgdG8gYmUgbWFwcGVkIGFzIFhtbElELCB0aGUgdHlwZSBvZiB0aGUgc2NoZW1hIGNvbXBvbmVudCAnJ3swfScnIG11c3QgYmUgJydJRCcnLgotCi1YTUxfSURfUkVGX19UWVBFX0RPRVNfTk9UX0NPTlRBSU5fWE1MX0lEID0gIEluIG9yZGVyIHRvIGJlIHVzZWQgd2l0aCBYbWxJRFJFRiwgdHlwZSAnJ3swfScnIG11c3QgY29udGFpbiBhIHByb3BlcnR5IG9yIGZpZWxkIG1hcHBlZCBhcyBhbiBYbWxJRC4KLVhNTF9JRF9SRUZfX1NDSEVNQV9UWVBFX05PVF9JRFJFRiA9IEluIG9yZGVyIHRvIGJlIHVzZWQgd2l0aCBYbWxJRFJFRiwgdGhlIGl0ZW0gdHlwZSBvZiB0aGUgc2NoZW1hIGNvbXBvbmVudCAnJ3swfScnIG11c3QgYmUgJydJRFJFRicnLgotCi1YTUxfTElTVF9fQVRUUklCVVRFX05PVF9DT0xMRUNUSU9OX1RZUEUgPSBJbiBvcmRlciB0byBiZSBtYXBwZWQgYXMgWG1sTGlzdCwgYW4gYXR0cmlidXRlIG11c3QgaGF2ZSBhIGNvbGxlY3Rpb24gb3IgYXJyYXkgdHlwZS4KLVhNTF9MSVNUX19JVEVNX1RZUEVfTk9UX01BUFBFRF9UT19WQUxJRF9TQ0hFTUFfVFlQRSA9IEluIG9yZGVyIHRvIGJlIG1hcHBlZCBhcyBYbWxMaXN0LCB0aGUgdHlwZSAnJ3swfScnIG11c3QgYmUgbWFwcGVkIHRvIGEgbm9uLWxpc3Qgc2ltcGxlIHNjaGVtYSB0eXBlLgotCi1YTUxfUkVHSVNUUllfX01VTFRJUExFX1hNTF9SRUdJU1RSSUVTX0ZPUl9QQUNLQUdFID0gTXVsdGlwbGUgY2xhc3NlcyBpbiBwYWNrYWdlIGFubm90YXRlZCB3aXRoIFhtbFJlZ2lzdHJ5LgotWE1MX1JFR0lTVFJZX19EVVBMSUNBVEVfWE1MX0VMRU1FTlRfUU5BTUUgPSBEdXBsaWNhdGUgWG1sRWxlbWVudERlY2wgbmFtZSAnJ3swfScnIHsxfS4KLQotWE1MX1ZBTFVFX19NVUxUSVBMRV9NQVBQSU5HU19ERUZJTkVEID0gTXVsdGlwbGUgYXR0cmlidXRlcyBhcmUgbWFwcGVkIGFzIFhtbFZhbHVlLiAgQXQgbW9zdCBvbmUgZmllbGQgb3IgcHJvcGVydHkgcGVyIGNsYXNzIGlzIGFsbG93ZWQuCi1YTUxfVkFMVUVfX05PX1RFWFRfQ09OVEVOVCA9IFRoZXJlIGlzIG5vIHRleHQgY29udGVudCBmb3IgdGhlIFhNTCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNsYXNzLgotWE1MX1ZBTFVFX19JTlZBTElEX1NDSEVNQV9UWVBFID0gVGhlIGV4cGVjdGVkIFhNTCB0eXBlIGFzc29jaWF0ZWQgd2l0aCAnJ3swfScnIGlzIG5vdCB2YWxpZCBmb3IgdGV4dCBjb250ZW50IG9mIHRoZSBYTUwgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGFzcy4KLQotWE1MX1ZBTFVFX01BUFBJTkdfV0lUSF9OT05fWE1MX0FUVFJJQlVURV9NQVBQSU5HX0RFRklORUQgPSBBdHRyaWJ1dGUgJyd7MH0nJyBtdXN0IGJlIG1hcHBlZCBhcyBYbWxBdHRyaWJ1dGUgYmVjYXVzZSBhbm90aGVyIGF0dHJpYnV0ZSAnJ3sxfScnIGlzIG1hcHBlZCBhcyBYbWxWYWx1ZQotCi1YTUxfU0NIRU1BX1RZUEVfX05PTl9TSU1QTEVfVFlQRSA9IFRoZSBzY2hlbWEgdHlwZSAnJ3swfScnIGlzIG5vdCBhIHNpbXBsZSB0eXBlLgotWE1MX1NDSEVNQV9UWVBFX19UWVBFX05PVF9TUEVDSUZJRURfT05fUEFDS0FHRSA9IFRoZSAnJ3R5cGUnJyBlbGVtZW50IHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiBkZWZpbmluZyBhIHNjaGVtYSB0eXBlIG9uIGEgcGFja2FnZS4KLVhNTF9TQ0hFTUFfVFlQRV9fVFlQRV9TUEVDSUZJRURfT05fQVRUUklCVVRFID0gVGhlICcndHlwZScnIGVsZW1lbnQgc2hvdWxkIG5vdCBiZSBzcGVjaWZpZWQgd2hlbiBkZWZpbmluZyBhIHNjaGVtYSB0eXBlIG9uIGEgZmllbGQgb3IgcHJvcGVydHkuCi0KLVFOQU1FX19NSVNTSU5HX05BTUUgPSB7MH0gbmFtZSBub3Qgc3BlY2lmaWVkCi1RTkFNRV9fVU5SRVNPTFZFRF9DT01QT05FTlQgPSBDYW5ub3QgcmVzb2x2ZSB7MH0gd2l0aCBuYW1lc3BhY2UgJyd7MX0nJyBhbmQgbmFtZSAnJ3syfScnIGluIHRoaXMgY29udGV4dApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3Byb3BlcnR5X2ZpbGVzL2pwdF9qYXhiX2NvcmUucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3Byb3BlcnR5X2ZpbGVzL2pwdF9qYXhiX2NvcmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY3ZmNlYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9wcm9wZXJ0eV9maWxlcy9qcHRfamF4Yl9jb3JlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQ09OVEVYVF9NT0RFTF9TWU5DX0pPQl9OQU1FPVN5bmNocm9uaXplIEpBWEIgcHJvamVjdDogJyd7MH0nJwotVVBEQVRFX0pPQl9OQU1FPVVwZGF0ZSBKQVhCIHByb2plY3Q6ICcnezB9JycKLVBSRUZFUkVOQ0VTX0ZMVVNIX0pPQl9OQU1FPUZsdXNoIFByZWZlcmVuY2VzOiB7MH0KLQotQ2xhc3Nlc0dlbmVyYXRvcl9nZW5lcmF0aW5nQ2xhc3NlcyA9IEdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gU2NoZW1hCi1DbGFzc2VzR2VuZXJhdG9yX2dlbmVyYXRpbmdDbGFzc2VzVGFzayA9IEdlbmVyYXRpbmcgY2xhc3NlcwotCi1KYXhiRmFjZXRDb25maWdfdmFsaWRhdGVQbGF0Zm9ybU5vdFNwZWNpZmllZCA9IFBsYXRmb3JtIG11c3QgYmUgc3BlY2lmaWVkCi1KYXhiRmFjZXRDb25maWdfdmFsaWRhdGVQbGF0Zm9ybURvZXNOb3RTdXBwb3J0RmFjZXRWZXJzaW9uID0gUGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCB0aGUgY3VycmVudCBKQVhCIGZhY2V0IHZlcnNpb24KLQotSnJlTGlicmFyeVZhbGlkYXRvcl9pbnZhbGlkUGxhdGZvcm0gPSBUaGUgSlJFIG9ubHkgcHJvdmlkZXMgaW1wbGVtZW50YXRpb24gZm9yIGEgR2VuZXJpYyBKQVhCIHBsYXRmb3JtLgotSnJlTGlicmFyeVZhbGlkYXRvcl9pbnZhbGlkSmF2YUZhY2V0ID0gVGhlIHNwZWNpZmllZCBKYXZhIHZlcnNpb24gb2YgezB9IGlzIGluc3VmZmljaWVudCB0byBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIGZvciBKQVhCIHZlcnNpb24gezF9LiAgVGhlIEpBWEIgaW1wbGVtZW50YXRpb24gb2YgYSBKYXZhIHswfSBydW50aW1lIGVudmlyb25tZW50IG11c3QgYmUgbWFudWFsbHkgb3ZlcnJpZGRlbiBieSBhbiBlbmRvcnNlbWVudCBtZWNoYW5pc20gb2YgeW91ciBjaG9pY2UuCi1KcmVMaWJyYXJ5VmFsaWRhdG9yX2ludmFsaWRKYXZhTGlicmFyeSA9IFRoZSBjb25maWd1cmVkIHJ1bnRpbWUgaXMgaW5zdWZmaWNpZW50IHRvIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gZm9yIEpBWEIgezB9LgotCi1TY2hlbWFHZW5lcmF0b3JfY3JlYXRpbmdKQVhCUHJvcGVydGllc0ZpbGVUYXNrID0gQ3JlYXRpbmcgamF4Yi5wcm9wZXJ0aWVzIGZpbGUKLQotVXNlckxpYnJhcnlWYWxpZGF0b3JfaW5jb21wYXRpYmxlSmF2YUZhY2V0ID0gVGhlIHNwZWNpZmllZCBKYXZhIHZlcnNpb24gb2YgezB9IHByb3ZpZGVzIGEgSkFYQiBpbXBsZW1lbnRhdGlvbiB0aGF0IGNvbmZsaWN0cyB3aXRoIEpBWEIgdmVyc2lvbiB7MX0uICBUaGUgSkFYQiBpbXBsZW1lbnRhdGlvbiBvZiBhIEphdmEgezB9IHJ1bnRpbWUgZW52aXJvbm1lbnQgbXVzdCBiZSBtYW51YWxseSBvdmVycmlkZGVuIGJ5IGFuIGVuZG9yc2VtZW50IG1lY2hhbmlzbSBvZiB5b3VyIGNob2ljZS4KLVVzZXJMaWJyYXJ5VmFsaWRhdG9yX2luY29tcGF0aWJsZUphdmFMaWJyYXJ5ID0gVGhlIGNvbmZpZ3VyZWQgcnVudGltZSBjb25mbGljdHMgd2l0aCBKQVhCIHZlcnNpb24gezB9LgotCi1YTUxfQVRUUklCVVRFX0RFU0MgPSBYTUwgYXR0cmlidXRlIGRlY2xhcmF0aW9uCi1YTUxfRUxFTUVOVF9ERVNDID0gWE1MIGVsZW1lbnQgZGVjbGFyYXRpb24KLVhNTF9UWVBFX0RFU0MgPSBYTUwgdHlwZSBkZWZpbml0aW9uCi1TVUJTVElUVVRJT05fSEVBRF9ERVNDID0gWE1MIGVsZW1lbnQgc3Vic3RpdHV0aW9uIGhlYWQKLQotWE1MX0VMRU1FTlRfREVDTF9fU0NPUEUgPSBpbiB0aGUgc2NvcGUgb2YgJyd7MH0nJwpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc2NoZW1hL2pheGJQbGF0Zm9ybXMuZXhzZCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NjaGVtYS9qYXhiUGxhdGZvcm1zLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYjkxOTUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc2NoZW1hL2pheGJQbGF0Zm9ybXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUiIGlkPSJqYXhiUGxhdGZvcm1zIiBuYW1lPSJKQVhCIFBsYXRmb3JtcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGlzIHVzZWQgZm9yIGRlZmluaW5nIEpBWEIgcGxhdGZvcm1zIGFuZCBKQVhCIHBsYXRmb3JtIHZlcnNpb25zLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KLSAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImpheGJQbGF0Zm9ybUdyb3VwIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImpheGJQbGF0Zm9ybSIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iamF4YlBsYXRmb3JtR3JvdXAiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlY2xhcmVzIGEgSkFYQiBwbGF0Zm9ybSBncm91cC4gIEFjdHMgYXMgYSBzb3J0IG9mICZxdW90O3N1cGVyJnF1b3Q7IHBsYXRmb3JtLiAgTW9zdCB1c2VmdWwgZm9yIGVuYWJsaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIGEgc2V0IG9mIHBsYXRmb3JtcyB3aXRob3V0IGhhdmluZyB0byBlbmFibGUgdGhlIGZ1bmN0aW9uYWxpdHkgZm9yIGVhY2ggcGxhdGZvcm0gc2VwYXJhdGVseS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIEpBWEIgcGxhdGZvcm0gZ3JvdXAuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSB0cmFuc2xhdGFibGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBKQVhCIHBsYXRmb3JtIGdyb3VwLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImpheGJQbGF0Zm9ybSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVjbGFyZXMgYSBKQVhCIHBsYXRmb3JtLiAgT25lIEpBWEIgcGxhdGZvcm0gd2lsbCBiZSBzZWxlY3RlZCBwZXIgSkFYQi1mYWNldGVkIHByb2plY3QuIFNlZSAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQbGF0Zm9ybSZsdDsvc2FtcCZndDsgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gSkFYQiBwbGF0Zm9ybXMuICBBbHNvIHNlZSB0aGUgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuamF4YlBsYXRmb3JtVWlzIGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSB0cmFuc2xhdGFibGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwbGF0Zm9ybS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhY3RvcnlDbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YlBsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkmbHQ7L3NhbXAmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YlBsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJncm91cCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBEZWNsYXJlcyB3aGljaCBKQVhCIHBsYXRmb3JtIGdyb3VwIHRoaXMgcGxhdGZvcm0gYmVsb25ncyB0by4gIElmIG5vbmUgaXMgc3BlY2lmaWVkLCB0aGlzIHBsYXRmb3JtIHdpbGwgYmUgYXNzdW1lZCB0byBiZWxvbmcgdG8gaXRzIG93biBncm91cCB3aXRoIHRoZSBzYW1lIGlkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImpheGJGYWNldFZlcnNpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgRGVjbGFyZXMgdGhlIEpBWEIgZmFjZXQgdmVyc2lvbiBmb3Igd2hpY2ggdGhpcyBwbGF0Zm9ybSBtYXkgYmUgdXNlZC4gSWYgbm8gZmFjZXQgdmVyc2lvbiBpcyBzcGVjaWZpZWQsIHRoaXMgcGxhdGZvcm0gaXMgYXZhaWxhYmxlIGZvciBhbGwgSkFYQiBmYWNldCB2ZXJzaW9ucy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0IiB0eXBlPSJib29sZWFuIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJmYWxzZSI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgRGVjbGFyZXMgd2hldGhlciB0aGlzIHBsYXRmb3JtIHNob3VsZCBiZSB1c2VkIGFzIGEgZGVmYXVsdCBKQVhCIHBsYXRmb3JtIGZvciBuZXcgSkFYQiBwcm9qZWN0IGNvbnRlbnQuICBOb3RlIHRoYXQgaWYgYSB3b3Jrc3BhY2UgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBkZWZhdWx0IHBsYXRmb3JtIGZvciBhIEpBWEIgZmFjZXQgdmVyc2lvbiwgb25lIG9mIHRoZW0gd2lsbCBiZSBjaG9zZW4gYXQgcmFuZG9tLiAgQnkgZGVmYXVsdCwgYSBwbGF0Zm9ybSBpcyBub3QgYSBkZWZhdWx0IHBsYXRmb3JtLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBKUFQgMy4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDticiZndDsKLSZsdDtwJmd0OwotVGhlIGZvbGxvd2luZyBleGFtcGxlIGlzIHRoZSBpbmNsdWRlZCBnZW5lcmljIEpBWEIgMi4yIHBsYXRmb3JtIGFuZCBpdHMgcGxhdGZvcm0gZ3JvdXAgCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuamF4YlBsYXRmb3JtcyZxdW90OyZndDsKLQotICAgJmx0O2pheGJQbGF0Zm9ybUdyb3VwCi0gICAgICBpZD0mcXVvdDtnZW5lcmljJnF1b3Q7Ci0gICAgICBsYWJlbD0mcXVvdDslR0VORVJJQ19QTEFURk9STV9HUk9VUF9MQUJFTCZxdW90Oy8mZ3Q7Ci0KLSAgICZsdDtqYXhiUGxhdGZvcm0KLSAgICAgIGlkPSZxdW90O2dlbmVyaWNfMl8yJnF1b3Q7Ci0gICAgICBsYWJlbD0mcXVvdDslR0VORVJJQ18yXzJfUExBVEZPUk1fTEFCRUwmcXVvdDsKLSAgICAgIGZhY3RvcnlDbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmpheGIyMi5HZW5lcmljSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeSZxdW90OwotICAgICAgZ3JvdXA9JnF1b3Q7Z2VuZXJpYyZxdW90OwotICAgICAgamF4YkZhY2V0VmVyc2lvbj0mcXVvdDsyLjImcXVvdDsKLSAgICAgIGRlZmF1bHQ9JnF1b3Q7ZmFsc2UmcXVvdDsvJmd0OwotCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpaW5mbyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YnImZ3Q7Ci1Qcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLXBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLXdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2JyJmd0OwotJmx0O3AmZ3Q7VGhlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUgcGx1Zy1pbiBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGpheGIgcGxhdGZvcm1zOgotJmx0O3VsJmd0OwotJmx0O2xpJmd0O2dlbmVyaWNfMl8yJmx0Oy9saSZndDsKLSZsdDsvdWwmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDthbmQgdGhlIGZvbGxvd2luZyBqYXhiIHBsYXRmb3JtIGdyb3VwczoKLSZsdDt1bCZndDsKLSZsdDtsaSZndDtnZW5lcmljJmx0Oy9saSZndDsKLSZsdDsvdWwmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi10ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAKLUNvbnRyaWJ1dG9yczoKLU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL0dlbmVyaWNKYXhiUGxhdGZvcm0uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL0dlbmVyaWNKYXhiUGxhdGZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZjZGEzNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9HZW5lcmljSmF4YlBsYXRmb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbjsKLQotLyoqCi0gKiBDb25zdGFudHMgcGVydGFpbmluZyB0byB0aGUgR2VuZXJpYyBKQVhCIHBsYXRmb3JtcyBhbmQgdGhlaXIgZ3JvdXAuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKYXhiUGxhdGZvcm0gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbiBHUk9VUCAKLQkJCT0gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0SmF4YlBsYXRmb3JtTWFuYWdlcigpLmdldEpheGJQbGF0Zm9ybUdyb3VwKCJnZW5lcmljIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIFZFUlNJT05fMl8xIAotCQkJPSBKcHRKYXhiQ29yZVBsdWdpbi5nZXRKYXhiUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SmF4YlBsYXRmb3JtKCJnZW5lcmljXzJfMSIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBWRVJTSU9OXzJfMiAKLQkJCT0gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0SmF4YlBsYXRmb3JtTWFuYWdlcigpLmdldEpheGJQbGF0Zm9ybSgiZ2VuZXJpY18yXzIiKTsgLy8kTk9OLU5MUy0xJAotCQotCQotCS8qKgotCSAqIE5vdCBmb3IgaW5zdGFudGlhdGlvbgotCSAqLwotCXByaXZhdGUgR2VuZXJpY0pheGJQbGF0Zm9ybSgpIHt9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9HZW5lcmljSmF4YlByb2plY3RNYW5hZ2VyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9HZW5lcmljSmF4YlByb2plY3RNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZmJmMjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvR2VuZXJpY0pheGJQcm9qZWN0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklFbGVtZW50Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5KcHRDb21tb25Db3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuQ2FsbGJhY2tKb2JTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSm9iU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmNvbW1hbmQuSm9iQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRXhjZXB0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5jb21tYW5kLlN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkQm9vbGVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuY29tbWFuZC5Bc3luY2hyb25vdXNFeHRlbmRlZENvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuY29tbWFuZC5TaW1wbGVTdGF0ZWZ1bEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnMuQ2FsbGJhY2tTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnMuU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuSnB0SmF4YkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLlNpbXBsZUpheGJQcm9qZWN0Q29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklQcm9qZWN0RmFjZXRBY3Rpb25FdmVudDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgSkFYQiBwcm9qZWN0IG1hbmFnZXIgbWFpbnRhaW5zIGEgbGlzdCBvZiBhbGwgSkFYQiBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlLgotICogSXQga2VlcHMgdGhlIGxpc3QgKGFuZCB0aGUgc3RhdGUgb2YgdGhlIEpBWEIgcHJvamVjdHMgdGhlbXNlbHZlcykKLSAqIHN5bmNocm9uaXplZCB3aXRoIHRoZSB3b3Jrc3BhY2UgYnkgbGlzdGVuaW5nIGZvciB2YXJpb3VzCi0gKiBjaGFuZ2VzOjx1bD4KLSAqIDxsaT5SZXNvdXJjZQotICogPGxpPkphdmEKLSAqIDxsaT5GYWNldGVkIFByb2plY3QKLSAqIDwvdWw+Ci0gKiBXZSB1c2UgYW4gRWNsaXBzZSB7QGxpbmsgSUxvY2sgbG9ja30gdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIHRoZSBKQVhCCi0gKiBwcm9qZWN0cyB3aGVuIGRlYWxpbmcgd2l0aCB0aGVzZSBldmVudHMuIEluIGFuIGVmZm9ydCB0byByZWR1Y2UgZGVhZGxvY2tzLAotICogdGhlIHNpbXBsZSBSZXNvdXJjZSBhbmQgSmF2YSBjaGFuZ2UgZXZlbnRzIGFyZSBkaXNwYXRjaGVkIHRvIGEgYmFja2dyb3VuZAotICogdGhyZWFkLCBhbGxvd2luZyB1cyB0byBoYW5kbGUgdGhlIGV2ZW50cyBvdXRzaWRlIG9mIHRoZSB3b3Jrc3BhY2UgbG9jayBoZWxkCi0gKiBkdXJpbmcgcmVzb3VyY2UgYW5kIEphdmEgY2hhbmdlIG5vdGlmaWNhdGlvbnMuCi0gKiA8cD4KLSAqIEV2ZW50cyB0aGF0IHRyaWdnZXIgZWl0aGVyIHRoZSBhZGRpbmcgb3IgcmVtb3Zpbmcgb2YgYSBKQVhCIHByb2plY3QgKGUuZy4KLSAqIHtAbGluayBJUmVzb3VyY2VDaGFuZ2VFdmVudCNQT1NUX0NIQU5HRX0pIGFyZSBoYW5kbGVkICJzeW5jaHJvbm91c2x5IgotICogYnkgYWxsb3dpbmcgdGhlIGJhY2tncm91bmQgdGhyZWFkIHRvIGhhbmRsZSBhbnkgb3V0c3RhbmRpbmcgZXZlbnRzIGJlZm9yZQotICogdXBkYXRpbmcgdGhlIGxpc3Qgb2YgSkFYQiBwcm9qZWN0cyBhbmQgcmV0dXJuaW5nIGV4ZWN1dGlvbiB0byB0aGUgZXZlbnQKLSAqIHNvdXJjZS4KLSAqIDxwPgotICogVmFyaW91cyB0aGluZ3MgdGhhdCBjYXVzZSB1cyB0byBhZGQgb3IgcmVtb3ZlIGEgSkFYQiBwcm9qZWN0Ojx1bD4KLSAqIDxsaT5UaGUge0BsaW5rIEpwdEpheGJDb3JlUGx1Z2lufSB3aWxsICJsYXppbHkiIGluc3RhbnRpYXRlIGFuZCB7QGxpbmsgI3N0YXJ0KCkgc3RhcnR9Ci0gKiAgICAgYSBKQVhCIHByb2plY3QgbWFuYWdlciBhcyBhcHByb3ByaWF0ZS4gVGhpcyB3aWxsIHRyaWdnZXIgdGhlIG1hbmFnZXIKLSAqICAgICB0byBmaW5kIGFuZCBhZGQgYWxsIHByZS1leGlzdGluZyBKQVhCIHByb2plY3RzLgotICogCi0gKiA8bGk+UHJvamVjdCBjcmVhdGVkIGFuZCBmYWNldCBpbnN0YWxsZWQ8cD4KLSAqICAgICB7QGxpbmsgSVJlc291cmNlQ2hhbmdlRXZlbnQjUE9TVF9DSEFOR0V9Ci0gKiA8bGk+UHJvamVjdCBmYWNldCB1bmluc3RhbGxlZDxwPgotICogICAgIHtAbGluayBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlI1BSRV9VTklOU1RBTEx9Ci0gKiAKLSAqIDxsaT5Qcm9qZWN0IG9wZW5lZDxwPgotICogICAgIHtAbGluayBJUmVzb3VyY2VDaGFuZ2VFdmVudCNQT1NUX0NIQU5HRX0KLSAqICAgICAtPiB7QGxpbmsgSVJlc291cmNlI0ZJTEV9Ci0gKiAgICAgLT4ge0BsaW5rIElSZXNvdXJjZURlbHRhI0FEREVEfSBmYWNldCBzZXR0aW5ncyBmaWxlCi0gKiAgICAgKDxjb2RlPi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUueG1sPC9jb2RlPikKLSAqIDxsaT5Qcm9qZWN0IGNsb3NlZDxwPgotICogICAgIHtAbGluayBJUmVzb3VyY2VDaGFuZ2VFdmVudCNQT1NUX0NIQU5HRX0KLSAqICAgICAtPiB7QGxpbmsgSVJlc291cmNlI0ZJTEV9Ci0gKiAgICAgLT4ge0BsaW5rIElSZXNvdXJjZURlbHRhI1JFTU9WRUR9IGZhY2V0IHNldHRpbmdzIGZpbGUKLSAqIAotICogPGxpPlByZS1leGlzdGluZyBwcm9qZWN0IGltcG9ydGVkIGZyb20gZGlyZWN0b3J5IG9yIGFyY2hpdmUgKGNyZWF0ZWQgYW5kIG9wZW5lZCk8cD4KLSAqICAgICB7QGxpbmsgSVJlc291cmNlQ2hhbmdlRXZlbnQjUE9TVF9DSEFOR0V9Ci0gKiAgICAgLT4ge0BsaW5rIElSZXNvdXJjZSNGSUxFfQotICogICAgIC0+IHtAbGluayBJUmVzb3VyY2VEZWx0YSNBRERFRH0gZmFjZXQgc2V0dGluZ3MgZmlsZQotICogPGxpPlByb2plY3QgcmVuYW1lZDxwPgotICogICAgIHtAbGluayBJUmVzb3VyY2VDaGFuZ2VFdmVudCNQT1NUX0NIQU5HRX0KLSAqICAgICAtPiB7QGxpbmsgSVJlc291cmNlI0ZJTEV9Ci0gKiAgICAgLT4ge0BsaW5rIElSZXNvdXJjZURlbHRhI1JFTU9WRUR9IGZhY2V0IHNldHRpbmdzIGZpbGUgb2Ygb2xkIHByb2plY3QKLSAqICAgICAtPiB7QGxpbmsgSVJlc291cmNlRGVsdGEjQURERUR9IGZhY2V0IHNldHRpbmdzIGZpbGUgb2YgbmV3IHByb2plY3QKLSAqIDxsaT5Qcm9qZWN0IGRlbGV0ZWQ8cD4KLSAqICAgICB7QGxpbmsgSVJlc291cmNlQ2hhbmdlRXZlbnQjUE9TVF9DSEFOR0V9Ci0gKiAgICAgLT4ge0BsaW5rIElSZXNvdXJjZSNGSUxFfQotICogICAgIC0+IHtAbGluayBJUmVzb3VyY2VEZWx0YSNSRU1PVkVEfSBmYWNldCBzZXR0aW5ncyBmaWxlCi0gKiAKLSAqIDxsaT5Qcm9qZWN0IGZhY2V0IGluc3RhbGxlZCBieSBlZGl0aW5nIHRoZSBmYWNldHMgc2V0dGluZ3MgZmlsZSBkaXJlY3RseTxwPgotICogICAgIHtAbGluayBJUmVzb3VyY2VDaGFuZ2VFdmVudCNQT1NUX0NIQU5HRX0KLSAqICAgICAtPiB7QGxpbmsgSVJlc291cmNlI0ZJTEV9Ci0gKiAgICAgLT4ge0BsaW5rIElSZXNvdXJjZURlbHRhI0NIQU5HRUR9IGZhY2V0IHNldHRpbmdzIGZpbGUKLSAqIDxsaT5Qcm9qZWN0IGZhY2V0IHVuaW5zdGFsbGVkIGJ5IGVkaXRpbmcgdGhlIGZhY2V0cyBzZXR0aW5ncyBmaWxlIGRpcmVjdGx5PHA+Ci0gKiAgICAge0BsaW5rIElSZXNvdXJjZUNoYW5nZUV2ZW50I1BPU1RfQ0hBTkdFfQotICogICAgIC0+IHtAbGluayBJUmVzb3VyY2UjRklMRX0KLSAqICAgICAtPiB7QGxpbmsgSVJlc291cmNlRGVsdGEjQ0hBTkdFRH0gZmFjZXQgc2V0dGluZ3MgZmlsZQotICogPC91bD4KLSAqLwotLy9UT0RPIFN0aWxsIG5lZWQgdG8gbG9vayBhdCBmYWNldGVkIHByb2plY3QgbGlzdGVuZXIgZm9yIGZhY2V0IHVuaW5zdGFsbAotY2xhc3MgR2VuZXJpY0pheGJQcm9qZWN0TWFuYWdlcgotCQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQkJaW1wbGVtZW50cyBKYXhiUHJvamVjdE1hbmFnZXIgewotCQotCS8qKgotCSAqIEFsbCB0aGUgSkFYQiBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlLgotCSAqLwotCXByaXZhdGUgZmluYWwgVmVjdG9yPEpheGJQcm9qZWN0PiBqYXhiUHJvamVjdHMgPSBuZXcgVmVjdG9yPEpheGJQcm9qZWN0PigpOwotCi0JLyoqCi0JICogU3luY2hyb25pemUgYWNjZXNzIHRvIHRoZSBKQVhCIHByb2plY3RzLgotCSAqLwotCS8qIHByaXZhdGUgKi8gZmluYWwgSUxvY2sgbG9jayA9IHRoaXMuZ2V0Sm9iTWFuYWdlcigpLm5ld0xvY2soKTsKLQotCS8qKgotCSAqIERldGVybWluZSBob3cgUmVzb3VyY2UgYW5kIEphdmEgY2hhbmdlIGV2ZW50cyBhcmUKLQkgKiBoYW5kbGVkIChpLmUuIHN5bmNocm9ub3VzbHkgb3IgYXN5bmNocm9ub3VzbHkpLgotCSAqLwotCXByaXZhdGUgdm9sYXRpbGUgU3RhdGVmdWxDb21tYW5kRXhlY3V0b3IgZXZlbnRIYW5kbGVyID0KLQkJCW5ldyBBc3luY2hyb25vdXNFeHRlbmRlZENvbW1hbmRFeGVjdXRvcigKLQkJCQkJSnB0Q29tbW9uQ29yZU1lc3NhZ2VzLkRBTElfRVZFTlRfSEFORExFUl9USFJFQURfTkFNRSwKLQkJCQkJbmV3IExvY2FsRXhjZXB0aW9uSGFuZGxlcigpCi0JCQkJKTsKLQotCS8qIENVIHByaXZhdGUgKi8gY2xhc3MgTG9jYWxFeGNlcHRpb25IYW5kbGVyCi0JCWltcGxlbWVudHMgRXhjZXB0aW9uSGFuZGxlcgotCXsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSB0KSB7Ci0JCQlKcHRKYXhiQ29yZVBsdWdpbi5sb2codCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExpc3RlbiBmb3I8dWw+Ci0JICogPGxpPmNoYW5nZXMgdG8gcHJvamVjdHMgYW5kIGZpbGVzCi0JICogPGxpPmNsZWFuIGJ1aWxkcwotCSAqIDwvdWw+Ci0JICovCi0JcHJpdmF0ZSBmaW5hbCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gbmV3IFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQotCS8qKgotCSAqIFRoZSB0eXBlcyBvZiByZXNvdXJjZSBjaGFuZ2UgZXZlbnRzIHRoYXQgaW50ZXJlc3QKLQkgKiB7QGxpbmsgI3Jlc291cmNlQ2hhbmdlTGlzdGVuZXJ9LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRV9DSEFOR0VfRVZFTlRfVFlQRVMgPQotCQkJSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UgfAotCQkJSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9CVUlMRDsKLQotCS8qKgotCSAqIExpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGlzIGZpbGUgdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIEpBWEIgZmFjZXQgaXMKLQkgKiBhZGRlZCB0byBvciByZW1vdmVkIGZyb20gYSAiZmFjZXRlZCIgcHJvamVjdC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDRVRFRF9QUk9KRUNUX0ZSQU1FV09SS19TRVRUSU5HU19GSUxFX05BTUUgPSBGYWNldGVkUHJvamVjdEZyYW1ld29yay5QTFVHSU5fSUQgKyAiLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIExpc3RlbiBmb3IgdGhlIEpBWEIgZmFjZXQgYmVpbmcgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIGEgImZhY2V0ZWQiIHByb2plY3QuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciBmYWNldGVkUHJvamVjdExpc3RlbmVyID0gbmV3IEZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKTsKLQotCS8qKgotCSAqIFRoZSB0eXBlcyBvZiBmYWNldGVkIHByb2plY3QgZXZlbnRzIHRoYXQgaW50ZXJlc3QKLQkgKiB7QGxpbmsgI2ZhY2V0ZWRQcm9qZWN0TGlzdGVuZXJ9LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGVbXSBGQUNFVEVEX1BST0pFQ1RfRVZFTlRfVFlQRVMgPSBuZXcgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZVtdIHsKLQkJCUlGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJFX1VOSU5TVEFMTAotCQl9OwotCi0JLyoqCi0JICogTGlzdGVuIGZvciBKYXZhIGNoYW5nZXMgKHVubGVzcyB0aGUgRGFsaSBVSSBpcyBhY3RpdmUpLgotCSAqIEBzZWUgI2phdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXJJc0FjdGl2ZSgpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBKYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyIGphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIgPSBuZXcgSmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcigpOwotCi0JLyoqCi0JICogVGhlIHR5cGVzIG9mIHJlc291cmNlIGNoYW5nZSBldmVudHMgdGhhdCBpbnRlcmVzdAotCSAqIHtAbGluayAjamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcn0uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpBVkFfQ0hBTkdFX0VWRU5UX1RZUEVTID0KLQkJCUVsZW1lbnRDaGFuZ2VkRXZlbnQuUE9TVF9DSEFOR0UgfAotCQkJRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX1JFQ09OQ0lMRTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbnRlcm5hbDogY2FsbGVkIGJ5IHtAbGluayBKcHRKVWF4YkNvcmVQbHVnaW4gRGFsaSBwbHVnLWlufS4KLQkgKi8KLQlHZW5lcmljSmF4YlByb2plY3RNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwbHVnLWluIGNvbnRyb2xsZWQgbGlmZS1jeWNsZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbnRlcm5hbDogY2FsbGVkIGJ5IHtAbGluayBKcHRKYXhiQ29yZVBsdWdpbiBEYWxpIHBsdWctaW59LgotCSAqLwotCXZvaWQgc3RhcnQoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmxvY2suYWNxdWlyZSgpOwotCQkJdGhpcy5zdGFydF8oKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRoaXMubG9jay5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRfKCkgewotCQlkZWJ1ZygiKioqIEpBWEIgcHJvamVjdCBtYW5hZ2VyIFNUQVJUICoqKiIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQl0aGlzLmJ1aWxkSmF4YlByb2plY3RzKCk7Ci0JCQl0aGlzLmV2ZW50SGFuZGxlci5zdGFydCgpOwotCQkJdGhpcy5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMucmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgUkVTT1VSQ0VfQ0hBTkdFX0VWRU5UX1RZUEVTKTsKLQkJCUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmFkZExpc3RlbmVyKHRoaXMuZmFjZXRlZFByb2plY3RMaXN0ZW5lciwgRkFDRVRFRF9QUk9KRUNUX0VWRU5UX1RZUEVTKTsKLQkJCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcy5qYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyLCBKQVZBX0NIQU5HRV9FVkVOVF9UWVBFUyk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCUpwdEpheGJDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCQl0aGlzLnN0b3BfKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaWRlLWVmZmVjdDoge0BsaW5rICNqYXhiUHJvamVjdHN9IHBvcHVsYXRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYnVpbGRKYXhiUHJvamVjdHMoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmJ1aWxkSmF4YlByb2plY3RzXygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBpZiB3ZSBoYXZlIGEgcHJvYmxlbSwgbGVhdmUgdGhlIGN1cnJlbnRseSBidWlsdCBKQVhCIHByb2plY3RzIGluCi0JCQkvLyBwbGFjZSBhbmQga2VlcCBleGVjdXRpbmcgKHNob3VsZCBiZSBPSy4uLikKLQkJCUpwdEpheGJDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRKYXhiUHJvamVjdHNfKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5hY2NlcHQobmV3IFJlc291cmNlUHJveHlWaXNpdG9yKCksIElSZXNvdXJjZS5OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbDogY2FsbGVkIGJ5IHtAbGluayBKcHRKYXhiQ29yZVBsdWdpbiBEYWxpIHBsdWctaW59LgotCSAqLwotCXZvaWQgc3RvcCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJdGhpcy5sb2NrLmFjcXVpcmUoKTsKLQkJCXRoaXMuc3RvcF8oKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRoaXMubG9jay5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcF8oKSB7Ci0JCWRlYnVnKCIqKiogSkFYQiBwcm9qZWN0IG1hbmFnZXIgU1RPUCAqKioiKTsgLy8kTk9OLU5MUy0xJAotCQlKYXZhQ29yZS5yZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMuamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcik7Ci0JCUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLnJlbW92ZUxpc3RlbmVyKHRoaXMuZmFjZXRlZFByb2plY3RMaXN0ZW5lcik7Ci0JCXRoaXMuZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQl0cnkgewotCQkJdGhpcy5ldmVudEhhbmRsZXIuc3RvcCgpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKLQkJfQotCQl0aGlzLmNsZWFySmF4YlByb2plY3RzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFySmF4YlByb2plY3RzKCkgewotCQkvLyBjbG9uZSB0byBwcmV2ZW50IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGV4Y2VwdGlvbnMKLQkJZm9yIChKYXhiUHJvamVjdCBqYXhiUHJvamVjdCA6IHRoaXMuZ2V0SmF4YlByb2plY3RzXygpKSB7Ci0JCQl0aGlzLnJlbW92ZUpheGJQcm9qZWN0KGpheGJQcm9qZWN0KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXhiUHJvamVjdE1hbmFnZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEpheGJQcm9qZWN0PiBnZXRKYXhiUHJvamVjdHMoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmxvY2suYWNxdWlyZSgpOwotCQkJcmV0dXJuIHRoaXMuZ2V0SmF4YlByb2plY3RzXygpOwotCQl9IGZpbmFsbHkgewotCQkJdGhpcy5sb2NrLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8SmF4YlByb2plY3Q+IGdldEpheGJQcm9qZWN0c18oKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8SmF4YlByb2plY3Q+KHRoaXMuamF4YlByb2plY3RzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEpheGJQcm9qZWN0c1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmpheGJQcm9qZWN0cy5zaXplKCk7Ci0JfQotCi0JcHVibGljIEpheGJQcm9qZWN0IGdldEpheGJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCXRoaXMubG9jay5hY3F1aXJlKCk7Ci0JCQlyZXR1cm4gdGhpcy5nZXRKYXhiUHJvamVjdF8ocHJvamVjdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0aGlzLmxvY2sucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBKYXhiUHJvamVjdCBnZXRKYXhiUHJvamVjdF8oSVByb2plY3QgcHJvamVjdCkgewotCQlmb3IgKEpheGJQcm9qZWN0IGpheGJQcm9qZWN0IDogdGhpcy5qYXhiUHJvamVjdHMpIHsKLQkJCWlmIChqYXhiUHJvamVjdC5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKSB7Ci0JCQkJcmV0dXJuIGpheGJQcm9qZWN0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBKYXhiRmlsZSBnZXRKYXhiRmlsZShJRmlsZSBmaWxlKSB7Ci0JCUpheGJQcm9qZWN0IGpheGJQcm9qZWN0ID0gdGhpcy5nZXRKYXhiUHJvamVjdChmaWxlLmdldFByb2plY3QoKSk7Ci0JCXJldHVybiAoamF4YlByb2plY3QgPT0gbnVsbCkgPyBudWxsIDogamF4YlByb2plY3QuZ2V0SmF4YkZpbGUoZmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVidWlsZEpheGJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCXRoaXMubG9jay5hY3F1aXJlKCk7Ci0JCQl0aGlzLnJlYnVpbGRKYXhiUHJvamVjdF8ocHJvamVjdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0aGlzLmxvY2sucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogYXNzdW1wdGlvbjogdGhlIEpBWEIgcHJvamVjdCBob2xkZXIgZXhpc3RzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlYnVpbGRKYXhiUHJvamVjdF8oSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzLnJlbW92ZUpheGJQcm9qZWN0KHRoaXMuZ2V0SmF4YlByb2plY3RfKHByb2plY3QpKTsKLQkJdGhpcy5hZGRKYXhiUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBqYXZhRWxlbWVudENoYW5nZUxpc3RlbmVySXNBY3RpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIuaXNBY3RpdmUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRKYXZhRWxlbWVudENoYW5nZUxpc3RlbmVySXNBY3RpdmUoYm9vbGVhbiBqYXZhRWxlbWVudENoYW5nZUxpc3RlbmVySXNBY3RpdmUpIHsKLQkJdGhpcy5qYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyLnNldEFjdGl2ZShqYXZhRWxlbWVudENoYW5nZUxpc3RlbmVySXNBY3RpdmUpOwotCX0KLQotCXB1YmxpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSUpvYk1hbmFnZXIgZ2V0Sm9iTWFuYWdlcigpIHsKLQkJcmV0dXJuIEpvYi5nZXRKb2JNYW5hZ2VyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkZGluZy9yZW1vdmluZyBKQVhCIHByb2plY3RzICoqKioqKioqKioKLQotCS8qIHByaXZhdGUgKi8gdm9pZCBhZGRKYXhiUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMuYWRkSmF4YlByb2plY3QodGhpcy5idWlsZEpheGJQcm9qZWN0KHByb2plY3QpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSmF4YlByb2plY3QoSmF4YlByb2plY3QgamF4YlByb2plY3QpIHsKLQkJLy8gZmlndXJlIG91dCBleGFjdGx5IHdoZW4gSkFYQiBwcm9qZWN0cyBhcmUgYWRkZWQKLQkJZHVtcFN0YWNrVHJhY2UoImFkZDogIiwgamF4YlByb2plY3QpOyAvLyROT04tTkxTLTEkCi0JCS8vIHRoZSBKQVhCIHByb2plY3Qgd2lsbCBiZSBudWxsIGlmIHdlIGhhdmUgYW55IHByb2JsZW1zIGJ1aWxkaW5nIGl0Li4uCi0JCS8vIChlLmcuIGlmIHdlIGhhdmUgcHJvYmxlbXMgZ2V0dGluZyB0aGUgSkFYQiBwbGF0Zm9ybSkKLQkJaWYgKGpheGJQcm9qZWN0ICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihqYXhiUHJvamVjdCwgdGhpcy5qYXhiUHJvamVjdHMsIEpBWEJfUFJPSkVDVFNfQ09MTEVDVElPTik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gbnVsbCBpZiB3ZSBoYXZlIGFueSBwcm9ibGVtcy4uLgotCSAqLwotCXByaXZhdGUgSmF4YlByb2plY3QgYnVpbGRKYXhiUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSmF4YlByb2plY3QodGhpcy5idWlsZEpheGJQcm9qZWN0Q29uZmlnKHByb2plY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gbnVsbCBpZiB3ZSBoYXZlIGFueSBwcm9ibGVtcy4uLgotCSAqLwotCXByaXZhdGUgSmF4YlByb2plY3QgYnVpbGRKYXhiUHJvamVjdChKYXhiUHJvamVjdC5Db25maWcgY29uZmlnKSB7Ci0JCUpheGJQbGF0Zm9ybURlZmluaXRpb24gcGxhdGZvcm1EZWZpbml0aW9uID0gY29uZmlnLmdldFBsYXRmb3JtRGVmaW5pdGlvbigpOwotCQlpZiAocGxhdGZvcm1EZWZpbml0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUpheGJQcm9qZWN0IGpheGJQcm9qZWN0ID0gdGhpcy5idWlsZEpheGJQcm9qZWN0KHBsYXRmb3JtRGVmaW5pdGlvbiwgY29uZmlnKTsKLQkJaWYgKGpheGJQcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWpheGJQcm9qZWN0LnNldENvbnRleHRNb2RlbFN5bmNocm9uaXplcihidWlsZEpvYkNvbnRleHRNb2RlbFN5bmNocm9uaXplcihqYXhiUHJvamVjdCkpOwotCQlqYXhiUHJvamVjdC5zZXRVcGRhdGVTeW5jaHJvbml6ZXIoYnVpbGRKb2JVcGRhdGVTeW5jaHJvbml6ZXIoamF4YlByb2plY3QpKTsKLQkJcmV0dXJuIGpheGJQcm9qZWN0OwotCX0KLQkKLQkvKioKLQkgKiByZXR1cm4gbnVsbCBpZiB3ZSBoYXZlIGFueSBwcm9ibGVtcy4uLgotCSAqLwotCXByaXZhdGUgSmF4YlByb2plY3QgYnVpbGRKYXhiUHJvamVjdChKYXhiUGxhdGZvcm1EZWZpbml0aW9uIHBsYXRmb3JtRGVmaW5pdGlvbiwgSmF4YlByb2plY3QuQ29uZmlnIGNvbmZpZykgewotCQl0cnkgewotCQkJcmV0dXJuIHBsYXRmb3JtRGVmaW5pdGlvbi5nZXRGYWN0b3J5KCkuYnVpbGRKYXhiUHJvamVjdChjb25maWcpOwotCQl9Ci0JCWNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRKYXhiQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBKYXhiUHJvamVjdC5Db25maWcgYnVpbGRKYXhiUHJvamVjdENvbmZpZyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVNpbXBsZUpheGJQcm9qZWN0Q29uZmlnIGNvbmZpZyA9IG5ldyBTaW1wbGVKYXhiUHJvamVjdENvbmZpZygpOwotCQljb25maWcuc2V0UHJvamVjdChwcm9qZWN0KTsKLQkJY29uZmlnLnNldFBsYXRmb3JtRGVmaW5pdGlvbihKcHRKYXhiQ29yZVBsdWdpbi5nZXRKYXhiUGxhdGZvcm1NYW5hZ2VyKCkuYnVpbGRKYXhiUGxhdGZvcm1EZWZpbml0aW9uKHByb2plY3QpKTsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0JCi0JcHJpdmF0ZSBTeW5jaHJvbml6ZXIgYnVpbGRKb2JDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIoSmF4YlByb2plY3QgamF4YlByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBKb2JTeW5jaHJvbml6ZXIoCi0JCQkJYnVpbGRDb250ZXh0TW9kZWxKb2JOYW1lKGpheGJQcm9qZWN0KSwKLQkJCQlidWlsZENvbnRleHRNb2RlbEpvYkNvbW1hbmQoamF4YlByb2plY3QpLAotCQkJCWpheGJQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQ29udGV4dE1vZGVsSm9iTmFtZShKYXhiUHJvamVjdCBqYXhiUHJvamVjdCkgewotCQlyZXR1cm4gTkxTLmJpbmQoSnB0SmF4YkNvcmVNZXNzYWdlcy5DT05URVhUX01PREVMX1NZTkNfSk9CX05BTUUsIGpheGJQcm9qZWN0LmdldE5hbWUoKSk7Ci0JfQotCQotCXByaXZhdGUgSm9iQ29tbWFuZCBidWlsZENvbnRleHRNb2RlbEpvYkNvbW1hbmQoZmluYWwgSmF4YlByb2plY3QgamF4YlByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBKb2JDb21tYW5kKCkgewotCQkJcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlyZXR1cm4gamF4YlByb2plY3Quc3luY2hyb25pemVDb250ZXh0TW9kZWwobW9uaXRvcik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgQ2FsbGJhY2tTeW5jaHJvbml6ZXIgYnVpbGRKb2JVcGRhdGVTeW5jaHJvbml6ZXIoSmF4YlByb2plY3QgamF4YlByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBDYWxsYmFja0pvYlN5bmNocm9uaXplcigKLQkJCQlidWlsZFVwZGF0ZUpvYk5hbWUoamF4YlByb2plY3QpLAotCQkJCWJ1aWxkVXBkYXRlSm9iQ29tbWFuZChqYXhiUHJvamVjdCksCi0JCQkJamF4YlByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRVcGRhdGVKb2JOYW1lKEpheGJQcm9qZWN0IGpheGJQcm9qZWN0KSB7Ci0JCXJldHVybiBOTFMuYmluZChKcHRKYXhiQ29yZU1lc3NhZ2VzLlVQREFURV9KT0JfTkFNRSwgamF4YlByb2plY3QuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKb2JDb21tYW5kIGJ1aWxkVXBkYXRlSm9iQ29tbWFuZChmaW5hbCBKYXhiUHJvamVjdCBqYXhiUHJvamVjdCkgewotCQlyZXR1cm4gbmV3IEpvYkNvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCXJldHVybiBqYXhiUHJvamVjdC51cGRhdGUobW9uaXRvcik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qIHByaXZhdGUgKi8gdm9pZCByZW1vdmVKYXhiUHJvamVjdChKYXhiUHJvamVjdCBqYXhiUHJvamVjdCkgewotCQkvLyBmaWd1cmUgb3V0IGV4YWN0bHkgd2hlbiBKQVhCIHByb2plY3RzIGFyZSByZW1vdmVkCi0JCWR1bXBTdGFja1RyYWNlKCJyZW1vdmU6ICIsIGpheGJQcm9qZWN0KTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihqYXhiUHJvamVjdCwgdGhpcy5qYXhiUHJvamVjdHMsIEpBWEJfUFJPSkVDVFNfQ09MTEVDVElPTik7Ci0JCWpheGJQcm9qZWN0LmRpc3Bvc2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvamVjdCBQT1NUX0NIQU5HRSAqKioqKioqKioqCi0KLQkvKiBwcml2YXRlICovIHZvaWQgcHJvamVjdENoYW5nZWQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJdGhpcy5ldmVudEhhbmRsZXIuZXhlY3V0ZSh0aGlzLmJ1aWxkUHJvamVjdENoYW5nZWRDb21tYW5kKGRlbHRhKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkUHJvamVjdENoYW5nZWRDb21tYW5kKGZpbmFsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCXJldHVybiBuZXcgRXZlbnRIYW5kbGVyQ29tbWFuZCgiUHJvamVjdCBQT1NUX0NIQU5HRSBDb21tYW5kIikgeyAvLyROT04tTkxTLTEkCi0JCQlAT3ZlcnJpZGUKLQkJCXZvaWQgZXhlY3V0ZV8oKSB7Ci0JCQkJR2VuZXJpY0pheGJQcm9qZWN0TWFuYWdlci50aGlzLnByb2plY3RDaGFuZ2VkXyhkZWx0YSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogRm9yd2FyZCB0aGUgc3BlY2lmaWVkIHJlc291cmNlIGRlbHRhIHRvIGFsbCBvdXIgSkFYQiBwcm9qZWN0czsKLQkgKiB0aGV5IHdpbGwgZWFjaCBkZXRlcm1pbmUgd2hldGhlciB0aGUgZXZlbnQgaXMgc2lnbmlmaWNhbnQuCi0JICovCi0JLyogcHJpdmF0ZSAqLyB2b2lkIHByb2plY3RDaGFuZ2VkXyhJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlmb3IgKEpheGJQcm9qZWN0IGpheGJQcm9qZWN0IDogdGhpcy5qYXhiUHJvamVjdHMpIHsKLQkJCWpheGJQcm9qZWN0LnByb2plY3RDaGFuZ2VkKGRlbHRhKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9qZWN0IFBPU1RfQlVJTEQgKENMRUFOX0JVSUxEKSAqKioqKioqKioqCi0KLQkvKiBwcml2YXRlICovIHZvaWQgcHJvamVjdFBvc3RDbGVhbkJ1aWxkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5leGVjdXRlQWZ0ZXJFdmVudHNIYW5kbGVkKHRoaXMuYnVpbGRQcm9qZWN0UG9zdENsZWFuQnVpbGRDb21tYW5kKHByb2plY3QpKTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRQcm9qZWN0UG9zdENsZWFuQnVpbGRDb21tYW5kKGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBFdmVudEhhbmRsZXJDb21tYW5kKCJQcm9qZWN0IFBPU1RfQlVJTEQgKENMRUFOX0JVSUxEKSBDb21tYW5kIikgeyAvLyROT04tTkxTLTEkCi0JCQlAT3ZlcnJpZGUKLQkJCXZvaWQgZXhlY3V0ZV8oKSB7Ci0JCQkJR2VuZXJpY0pheGJQcm9qZWN0TWFuYWdlci50aGlzLnByb2plY3RQb3N0Q2xlYW5CdWlsZF8ocHJvamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyogcHJpdmF0ZSAqLyB2b2lkIHByb2plY3RQb3N0Q2xlYW5CdWlsZF8oSVByb2plY3QgcHJvamVjdCkgewotCQlKYXhiUHJvamVjdCBqYXhiUHJvamVjdCA9IHRoaXMuZ2V0SmF4YlByb2plY3RfKHByb2plY3QpOwotCQlpZiAoamF4YlByb2plY3QgIT0gbnVsbCkgewotCQkJdGhpcy5yZW1vdmVKYXhiUHJvamVjdChqYXhiUHJvamVjdCk7Ci0JCQl0aGlzLmFkZEpheGJQcm9qZWN0KHByb2plY3QpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEZpbGUgUE9TVF9DSEFOR0UgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIEZhY2V0ZWQgUHJvamVjdCBzZXR0aW5ncyBmaWxlIGhhcyBjaGFuZ2VkIGluIHNvbWUgZmFzaGlvbiwgY2hlY2sKLQkgKiB3aGV0aGVyIHRoZSBKQVhCIGZhY2V0IGhhcyBiZWVuIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGUgc3BlY2lmaWVkCi0JICogcHJvamVjdC4KLQkgKi8KLQkvKiBwcml2YXRlICovIHZvaWQgY2hlY2tGb3JKYXhiRmFjZXRUcmFuc2l0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSmF4YlByb2plY3QgamF4YlByb2plY3QgPSB0aGlzLmdldEpheGJQcm9qZWN0Xyhwcm9qZWN0KTsKLQotCQlpZiAoSmF4YkZhY2V0LmlzSW5zdGFsbGVkKHByb2plY3QpKSB7Ci0JCQlpZiAoamF4YlByb2plY3QgPT0gbnVsbCkgeyAgLy8gSkFYQiBmYWNldCBhZGRlZAotCQkJCXRoaXMuZXhlY3V0ZUFmdGVyRXZlbnRzSGFuZGxlZCh0aGlzLmJ1aWxkQWRkSmF4YlByb2plY3RDb21tYW5kKHByb2plY3QpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChqYXhiUHJvamVjdCAhPSBudWxsKSB7ICAvLyBKQVhCIGZhY2V0IHJlbW92ZWQKLQkJCQl0aGlzLmV4ZWN1dGVBZnRlckV2ZW50c0hhbmRsZWQodGhpcy5idWlsZFJlbW92ZUpheGJQcm9qZWN0Q29tbWFuZChqYXhiUHJvamVjdCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkQWRkSmF4YlByb2plY3RDb21tYW5kKGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBFdmVudEhhbmRsZXJDb21tYW5kKCJBZGQgSkFYQiBQcm9qZWN0IENvbW1hbmQiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUBPdmVycmlkZQotCQkJdm9pZCBleGVjdXRlXygpIHsKLQkJCQlHZW5lcmljSmF4YlByb2plY3RNYW5hZ2VyLnRoaXMuYWRkSmF4YlByb2plY3QocHJvamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkUmVtb3ZlSmF4YlByb2plY3RDb21tYW5kKGZpbmFsIEpheGJQcm9qZWN0IGpheGJQcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgRXZlbnRIYW5kbGVyQ29tbWFuZCgiUmVtb3ZlIEpBWEIgUHJvamVjdCBDb21tYW5kIikgeyAvLyROT04tTkxTLTEkCi0JCQlAT3ZlcnJpZGUKLQkJCXZvaWQgZXhlY3V0ZV8oKSB7Ci0JCQkJR2VuZXJpY0pheGJQcm9qZWN0TWFuYWdlci50aGlzLnJlbW92ZUpheGJQcm9qZWN0KGpheGJQcm9qZWN0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEZhY2V0ZWRQcm9qZWN0IFBSRV9VTklOU1RBTEwgKioqKioqKioqKgotCi0JLyogcHJpdmF0ZSAqLyB2b2lkIGpheGJGYWNldGVkUHJvamVjdFByZVVuaW5zdGFsbChJUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGV2ZW50LmdldFByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCXRoaXMuZXhlY3V0ZUFmdGVyRXZlbnRzSGFuZGxlZCh0aGlzLmJ1aWxkSmF4YkZhY2V0ZWRQcm9qZWN0UHJlVW5pbnN0YWxsQ29tbWFuZChwcm9qZWN0KSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkSmF4YkZhY2V0ZWRQcm9qZWN0UHJlVW5pbnN0YWxsQ29tbWFuZChmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgRXZlbnRIYW5kbGVyQ29tbWFuZCgiRmFjZXRlZCBQcm9qZWN0IFBSRV9VTklOU1RBTEwgQ29tbWFuZCIpIHsgLy8kTk9OLU5MUy0xJAotCQkJQE92ZXJyaWRlCi0JCQl2b2lkIGV4ZWN1dGVfKCkgewotCQkJCUdlbmVyaWNKYXhiUHJvamVjdE1hbmFnZXIudGhpcy5qYXhiRmFjZXRlZFByb2plY3RQcmVVbmluc3RhbGxfKHByb2plY3QpOwotCQkJfQotCQl9OwotCX0KLQotCS8qIHByaXZhdGUgKi8gdm9pZCBqYXhiRmFjZXRlZFByb2plY3RQcmVVbmluc3RhbGxfKElQcm9qZWN0IHByb2plY3QpIHsKLQkJLy8gYXNzdW1lKD8pIHRoaXMgaXMgdGhlIGZpcnN0IGV2ZW50IHRvIGluZGljYXRlIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBKQVhCIHByb2plY3QgZnJvbSB0aGUgSkFYQiBwcm9qZWN0IG1hbmFnZXIKLQkJdGhpcy5yZW1vdmVKYXhiUHJvamVjdCh0aGlzLmdldEpheGJQcm9qZWN0Xyhwcm9qZWN0KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgZWxlbWVudCBjaGFuZ2VkICoqKioqKioqKioKLQotCS8qIHByaXZhdGUgKi8gdm9pZCBqYXZhRWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQl0aGlzLmV2ZW50SGFuZGxlci5leGVjdXRlKHRoaXMuYnVpbGRKYXZhRWxlbWVudENoYW5nZWRDb21tYW5kKGV2ZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkSmF2YUVsZW1lbnRDaGFuZ2VkQ29tbWFuZChmaW5hbCBFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgRXZlbnRIYW5kbGVyQ29tbWFuZCgiSmF2YSBlbGVtZW50IGNoYW5nZWQgQ29tbWFuZCIpIHsgLy8kTk9OLU5MUy0xJAotCQkJQE92ZXJyaWRlCi0JCQl2b2lkIGV4ZWN1dGVfKCkgewotCQkJCUdlbmVyaWNKYXhiUHJvamVjdE1hbmFnZXIudGhpcy5qYXZhRWxlbWVudENoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBGb3J3YXJkIHRoZSBKYXZhIGVsZW1lbnQgY2hhbmdlZCBldmVudCB0byBhbGwgdGhlIEpBWEIgcHJvamVjdHMKLQkgKiBiZWNhdXNlIHRoZSBldmVudCBjb3VsZCBhZmZlY3QgbXVsdGlwbGUgcHJvamVjdHMuCi0JICovCi0JLyogcHJpdmF0ZSAqLyB2b2lkIGphdmFFbGVtZW50Q2hhbmdlZF8oRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQlmb3IgKEpheGJQcm9qZWN0IGpheGJQcm9qZWN0IDogdGhpcy5qYXhiUHJvamVjdHMpIHsKLQkJCWpheGJQcm9qZWN0LmphdmFFbGVtZW50Q2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzY2VsbGFuZW91cyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmpheGJQcm9qZWN0cyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV2ZW50IGhhbmRsZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgdGhlIGV2ZW50IGhhbmRsZXIgaXMgZXhlY3V0aW5nIGFzeW5jaHJvbm91c2x5Ojxicj4KLQkgKiBBbGxvdyBhbGwgdGhlIGNvbW1hbmRzIGN1cnJlbnRseSBvbiB0aGUgY29tbWFuZCBleGVjdXRvcidzIHF1ZXVlIHRvIGV4ZWN1dGUuCi0JICogT25jZSB0aGV5IGhhdmUgZXhlY3V0ZWQsIHN1c3BlbmQgdGhlIGNvbW1hbmQgZXhlY3V0b3IgYW5kIHByb2Nlc3MgdGhlCi0JICogc3BlY2lmaWVkIGNvbW1hbmQgKG9uIDxlbT50aGlzPC9lbT4gdGhyZWFkLCA8ZW0+bm90PC9lbT4gdGhlIGNvbW1hbmQKLQkgKiBleGVjdXRvciB0aHJlYWQpLiBPbmNlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBpcyBmaW5pc2hlZCwgYWxsb3cgdGhlCi0JICogY29tbWFuZCBleGVjdXRvciB0byByZXN1bWUgcHJvY2Vzc2luZyBpdHMgY29tbWFuZCBxdWV1ZS4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgZXZlbnQgaGFuZGxlciBpcyBleGVjdXRpbmcgc3luY2hyb25vdXNseTo8YnI+Ci0JICogQWxsIHRoZSBldmVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gaGFuZGxlZCBzeW5jaHJvbm91c2x5LCBzbyB3ZSBzaW1wbHkKLQkgKiBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBbc29ydGFdIGRpcmVjdGx5LgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlQWZ0ZXJFdmVudHNIYW5kbGVkKENvbW1hbmQgY29tbWFuZCkgewotCQlTeW5jaHJvbml6ZWRCb29sZWFuIGZsYWcgPSBuZXcgU3luY2hyb25pemVkQm9vbGVhbihmYWxzZSk7Ci0JCXRoaXMuZXZlbnRIYW5kbGVyLmV4ZWN1dGUobmV3IFBhdXNlQ29tbWFuZChmbGFnKSk7Ci0JCXRyeSB7Ci0JCQlmbGFnLndhaXRVbnRpbFRydWUoKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGlnbm9yZSAtIG5vdCBzdXJlIHdoeSB0aGlzIHRocmVhZCB3b3VsZCBiZSBpbnRlcnJ1cHRlZAotCQl9Ci0JCXRyeSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWZsYWcuc2V0RmFsc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIElmIHRoaXMgInBhdXNlIiBjb21tYW5kIGlzIGV4ZWN1dGluZyAoYXN5bmNocm9ub3VzbHkpIG9uIGEgZGlmZmVyZW50Ci0JICogdGhyZWFkIHRoYW4gdGhlIEpBWEIgcHJvamVjdCBtYW5hZ2VyOjxvbD4KLQkgKiA8bGk+aXQgd2lsbCBzZXQgdGhlIGZsYWcgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIGFsbG93aW5nIHRoZSBKQVhCIHByb2plY3QKLQkgKiBtYW5hZ2VyIHRvIHJlc3VtZSBleGVjdXRpbmcgb24gaXRzIG93biB0aHJlYWQKLQkgKiA8bGk+dGhlbiBpdCB3aWxsIHN1c3BlbmQgaXRzIGNvbW1hbmQgZXhlY3V0b3IgdW50aWwgdGhlIEpBWEIgcHJvamVjdAotCSAqIG1hbmFnZXIgc2V0cyB0aGUgZmxhZyBiYWNrIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiA8L29sPgotCSAqIElmIHRoaXMgInBhdXNlIiBjb21tYW5kIGlzIGV4ZWN1dGluZyAoc3luY2hyb25vdXNseSkgb24gdGhlIHNhbWUgdGhyZWFkCi0JICogYXMgdGhlIEpBWEIgcHJvamVjdCBtYW5hZ2VyLCBpdCB3aWxsIHNpbXBseSBzZXQgdGhlIGZsYWcgdG8KLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBhbmQgcmV0dXJuLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFBhdXNlQ29tbWFuZAotCQlpbXBsZW1lbnRzIENvbW1hbmQKLQl7Ci0JCXByaXZhdGUgZmluYWwgVGhyZWFkIHByb2R1Y2VyVGhyZWFkOwotCQlwcml2YXRlIGZpbmFsIFN5bmNocm9uaXplZEJvb2xlYW4gZmxhZzsKLQotCQlQYXVzZUNvbW1hbmQoU3luY2hyb25pemVkQm9vbGVhbiBmbGFnKSB7Ci0JCQl0aGlzKFRocmVhZC5jdXJyZW50VGhyZWFkKCksIGZsYWcpOwotCQl9Ci0KLQkJUGF1c2VDb21tYW5kKFRocmVhZCBwcm9kdWNlclRocmVhZCwgU3luY2hyb25pemVkQm9vbGVhbiBmbGFnKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wcm9kdWNlclRocmVhZCA9IHByb2R1Y2VyVGhyZWFkOwotCQkJdGhpcy5mbGFnID0gZmxhZzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0aGlzLmZsYWcuc2V0VHJ1ZSgpOwotCQkJaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgIT0gdGhpcy5wcm9kdWNlclRocmVhZCkgewotCQkJCXRyeSB7Ci0JCQkJCXRoaXMuZmxhZy53YWl0VW50aWxGYWxzZSgpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIGlnbm9yZSAtIHRoZSBjb21tYW5kIGV4ZWN1dG9yIHdpbGwgY2hlY2sgZm9yIGludGVycnVwdGlvbnMKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgKHZpYSByZWZsZWN0aW9uKSB3aGVuIHRoZSB0ZXN0IHBsdWctaW4gaXMgbG9hZGVkLgotCSAqIEBzZWUgSnB0SmF4YkNvcmVUZXN0c1BsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50c1N5bmNocm9ub3VzbHkoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0cnkgewotCQkJdGhpcy5sb2NrLmFjcXVpcmUoKTsKLQkJCXRoaXMuaGFuZGxlRXZlbnRzU3luY2hyb25vdXNseV8oKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRoaXMubG9jay5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRXZlbnRzU3luY2hyb25vdXNseV8oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50SGFuZGxlci5zdG9wKCk7Ci0JCXRoaXMuZXZlbnRIYW5kbGVyID0gbmV3IFNpbXBsZVN0YXRlZnVsRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IoKTsKLQkJdGhpcy5ldmVudEhhbmRsZXIuc3RhcnQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgcHJveHkgdmlzaXRvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBWaXNpdCB0aGUgd29ya3NwYWNlIHJlc291cmNlIHRyZWUsIGFkZGluZyBhIEpBWEIgcHJvamVjdCB0byB0aGUKLQkgKiBKQVhCIHByb2plY3QgbWFuYWdlciBmb3IgZWFjaCBvcGVuIEVjbGlwc2UgcHJvamVjdCB0aGF0IGhhcyBhIEpBWEIgZmFjZXQuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBSZXNvdXJjZVByb3h5VmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZVByb3h5VmlzaXRvciB7Ci0JCVJlc291cmNlUHJveHlWaXNpdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHJlc291cmNlUHJveHkpIHsKLQkJCXN3aXRjaCAocmVzb3VyY2VQcm94eS5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZS5ST09UIDoKLQkJCQkJcmV0dXJuIHRydWU7ICAvLyBhbGwgcHJvamVjdHMgYXJlIGluIHRoZSAicm9vdCIKLQkJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKLQkJCQkJdGhpcy5wcm9jZXNzUHJvamVjdChyZXNvdXJjZVByb3h5KTsKLQkJCQkJcmV0dXJuIGZhbHNlOyAgLy8gbm8gbmVzdGVkIHByb2plY3RzCi0JCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKLQkJCQkJcmV0dXJuIGZhbHNlOyAgLy8gaWdub3JlCi0JCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQkJCXJldHVybiBmYWxzZTsgIC8vIGlnbm9yZQotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1Byb2plY3QoSVJlc291cmNlUHJveHkgcmVzb3VyY2VQcm94eSkgewotCQkJaWYgKHJlc291cmNlUHJveHkuaXNBY2Nlc3NpYmxlKCkpIHsgIC8vIHRoZSBwcm9qZWN0IGV4aXN0cyBhbmQgaXMgb3BlbgotCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlUHJveHkucmVxdWVzdFJlc291cmNlKCk7Ci0JCQkJaWYgKEpheGJGYWNldC5pc0luc3RhbGxlZChwcm9qZWN0KSkgewotCQkJCQlHZW5lcmljSmF4YlByb2plY3RNYW5hZ2VyLnRoaXMuYWRkSmF4YlByb2plY3QocHJvamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGV2ZW50IGhhbmRsZXIgY29tbWFuZCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb21tYW5kIHRoYXQgaG9sZHMgdGhlIEpBWEIgcHJvamVjdCBtYW5hZ2VyIGxvY2sgd2hpbGUKLQkgKiBleGVjdXRpbmcuCi0JICovCi0JcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBFdmVudEhhbmRsZXJDb21tYW5kCi0JCWltcGxlbWVudHMgQ29tbWFuZAotCXsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCQlFdmVudEhhbmRsZXJDb21tYW5kKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBmaW5hbCB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0cnkgewotCQkJCUdlbmVyaWNKYXhiUHJvamVjdE1hbmFnZXIudGhpcy5sb2NrLmFjcXVpcmUoKTsKLQkJCQl0aGlzLmV4ZWN1dGVfKCk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQkJSnB0SmF4YkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJR2VuZXJpY0pheGJQcm9qZWN0TWFuYWdlci50aGlzLmxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJYWJzdHJhY3Qgdm9pZCBleGVjdXRlXygpOwotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSBjaGFuZ2UgbGlzdGVuZXIgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCi0JCVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFBSRV9VTklOU1RBTEwgaXMgdGhlIG9ubHkgZmFjZXQgZXZlbnQgd2UgdXNlIGZvciAKLQkJICogcmVtb3ZpbmcgSkFYQiBwcm9qZWN0cy4gVGhlc2UgYXJlIHRoZSBjYXNlcyB3aGVyZSB3ZSBsaXN0ZW4gZm9yIHJlc291cmNlIGV2ZW50cy4KLQkJICogPHA+Ci0JCSAqIENoZWNrIGZvcjo8dWw+Ci0JCSAqIDxsaT5mYWNldCBzZXR0aW5ncyBmaWxlIGFkZGVkL3JlbW92ZWQvY2hhbmdlZAotCQkgKiAoPGNvZGU+Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS54bWw8L2NvZGU+KQotCQkgKiA8bGk+ZmlsZSBhZGQvcmVtb3ZlIC0gZm9yd2FyZGVkIHRvIHRoZSBpbmRpdmlkdWFsIEpBWEIgcHJvamVjdHMKLQkJICogPGxpPnByb2plY3QgY2xlYW4KLQkJICogPC91bD4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFIDoKLQkJCQkJdGhpcy5wcm9jZXNzUG9zdENoYW5nZUV2ZW50KGV2ZW50KTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQkvLyB3b3Jrc3BhY2Ugb3IgcHJvamVjdCBldmVudHMKLQkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9SRUZSRVNIIDoKLQkJCQkJYnJlYWs7ICAvLyBpZ25vcmUKLQkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9CVUlMRCA6Ci0JCQkJCWJyZWFrOyAgLy8gaWdub3JlCi0JCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0JVSUxEIDoKLQkJCQkJdGhpcy5wcm9jZXNzUG9zdEJ1aWxkRXZlbnQoZXZlbnQpOwotCQkJCQlicmVhazsKLQotCQkJCS8vIHByb2plY3Qtb25seSBldmVudHMKLQkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSA6ICAKLQkJCQkJYnJlYWs7ICAvLyBpZ25vcmUKLQkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUgOgotCQkJCQlicmVhazsgIC8vIGlnbm9yZQotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwcm9jZXNzUG9zdENoYW5nZUV2ZW50KElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlkZWJ1ZygiUmVzb3VyY2UgUE9TVF9DSEFOR0UiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5wcm9jZXNzUG9zdENoYW5nZURlbHRhKGV2ZW50LmdldERlbHRhKCkpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NQb3N0Q2hhbmdlRGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlzd2l0Y2ggKHJlc291cmNlLmdldFR5cGUoKSkgewotCQkJCWNhc2UgSVJlc291cmNlLlJPT1QgOgotCQkJCQl0aGlzLnByb2Nlc3NQb3N0Q2hhbmdlUm9vdERlbHRhKGRlbHRhKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6Ci0JCQkJCXRoaXMucHJvY2Vzc1Bvc3RDaGFuZ2VQcm9qZWN0RGVsdGEoZGVsdGEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgotCQkJCQl0aGlzLnByb2Nlc3NQb3N0Q2hhbmdlRm9sZGVyRGVsdGEoKElGb2xkZXIpIHJlc291cmNlLCBkZWx0YSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJCQl0aGlzLnByb2Nlc3NQb3N0Q2hhbmdlRmlsZURlbHRhKChJRmlsZSkgcmVzb3VyY2UsIGRlbHRhKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLy8gKioqKiogUE9TVF9DSEFOR0UgUk9PVAotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1Bvc3RDaGFuZ2VSb290RGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCXRoaXMucHJvY2Vzc1Bvc3RDaGFuZ2VEZWx0YUNoaWxkcmVuKGRlbHRhKTsKLQkJfQotCi0JCS8vICoqKioqIFBPU1RfQ0hBTkdFIFBST0pFQ1QKLQkJLyoqCi0JCSAqIFByb2Nlc3MgdGhlIHByb2plY3QgZmlyc3QgZm9yIHRoZSBPcGVuaW5nIHByb2plY3QgY2FzZS4KLQkJICogVGhlIEpBWEIgcHJvamVjdCB3aWxsIG5vdCBiZSBidWlsdCB1bnRpbCB0aGUgY2hpbGRyZW4gYXJlIHByb2Nlc3NlZAotCQkgKiBhbmQgd2Ugc2VlIHRoYXQgdGhlIGZhY2V0IG1ldGFkYXRhIGZpbGUgaXMgYWRkZWQuCi0JCSAqIE90aGVyd2lzZSB0aGUgSkFYQiBwcm9qZWN0IHdvdWxkIGJlIGJ1aWx0IGFuZCB0aGVuIHdlIHdvdWxkIHByb2Nlc3MKLQkJICogdGhlIEFEREVEIGRlbHRhcyBmb3IgYWxsIHRoZSBmaWxlcyBpbiB0aGUgcHJvamVjdC4KLQkJICovCi0JCXByaXZhdGUgdm9pZCBwcm9jZXNzUG9zdENoYW5nZVByb2plY3REZWx0YShJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJR2VuZXJpY0pheGJQcm9qZWN0TWFuYWdlci50aGlzLnByb2plY3RDaGFuZ2VkKGRlbHRhKTsKLQkJCXRoaXMucHJvY2Vzc1Bvc3RDaGFuZ2VEZWx0YUNoaWxkcmVuKGRlbHRhKTsKLQkJfQotCi0JCS8vICoqKioqIFBPU1RfQ0hBTkdFIEZPTERFUgotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1Bvc3RDaGFuZ2VGb2xkZXJEZWx0YShJRm9sZGVyIGZvbGRlciwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCWlmIChmb2xkZXIuZ2V0TmFtZSgpLmVxdWFscygiLnNldHRpbmdzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXRoaXMucHJvY2Vzc1Bvc3RDaGFuZ2VEZWx0YUNoaWxkcmVuKGRlbHRhKTsKLQkJCX0KLQkJfQotCi0JCS8vICoqKioqIFBPU1RfQ0hBTkdFIEZJTEUKLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NQb3N0Q2hhbmdlRmlsZURlbHRhKElGaWxlIGZpbGUsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQlpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzKEZBQ0VURURfUFJPSkVDVF9GUkFNRVdPUktfU0VUVElOR1NfRklMRV9OQU1FKSkgewotCQkJCXRoaXMuY2hlY2tGb3JGYWNldEZpbGVDaGFuZ2VzKGZpbGUsIGRlbHRhKTsKLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGNoZWNrRm9yRmFjZXRGaWxlQ2hhbmdlcyhJRmlsZSBmaWxlLCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDoKLQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOgotCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6IAotCQkJCQlHZW5lcmljSmF4YlByb2plY3RNYW5hZ2VyLnRoaXMuY2hlY2tGb3JKYXhiRmFjZXRUcmFuc2l0aW9uKGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRF9QSEFOVE9NIDoKLQkJCQkJYnJlYWs7ICAvLyBpZ25vcmUKLQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRURfUEhBTlRPTSA6Ci0JCQkJCWJyZWFrOyAgLy8gaWdub3JlCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NQb3N0Q2hhbmdlRGVsdGFDaGlsZHJlbihJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJZm9yIChJUmVzb3VyY2VEZWx0YSBjaGlsZCA6IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkgewotCQkJCXRoaXMucHJvY2Vzc1Bvc3RDaGFuZ2VEZWx0YShjaGlsZCk7ICAvLyByZWN1cnNlCi0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQSBwb3N0IGJ1aWxkIGV2ZW50IGhhcyBvY2N1cnJlZC4KLQkJICogQ2hlY2sgZm9yIHdoZXRoZXIgdGhlIGJ1aWxkIHdhcyBhICJjbGVhbiIgYnVpbGQgYW5kIHRyaWdnZXIgcHJvamVjdCB1cGRhdGUuCi0JCSAqLwotCQkvLyAqKioqKiBQT1NUX0JVSUxECi0JCXByaXZhdGUgdm9pZCBwcm9jZXNzUG9zdEJ1aWxkRXZlbnQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWRlYnVnKCJSZXNvdXJjZSBQT1NUX0JVSUxEOiAiLCBldmVudC5nZXRSZXNvdXJjZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGV2ZW50LmdldEJ1aWxkS2luZCgpID09IEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQpIHsKLQkJCQl0aGlzLnByb2Nlc3NQb3N0Q2xlYW5CdWlsZERlbHRhKGV2ZW50LmdldERlbHRhKCkpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NQb3N0Q2xlYW5CdWlsZERlbHRhKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJc3dpdGNoIChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZS5ST09UIDoKLQkJCQkJdGhpcy5wcm9jZXNzUG9zdENsZWFuQnVpbGREZWx0YUNoaWxkcmVuKGRlbHRhKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6Ci0JCQkJCXRoaXMucHJvY2Vzc1Byb2plY3RQb3N0Q2xlYW5CdWlsZCgoSVByb2plY3QpIHJlc291cmNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKLQkJCQkJYnJlYWs7ICAvLyBpZ25vcmUKLQkJCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKLQkJCQkJYnJlYWs7ICAvLyBpZ25vcmUKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1Bvc3RDbGVhbkJ1aWxkRGVsdGFDaGlsZHJlbihJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJZm9yIChJUmVzb3VyY2VEZWx0YSBjaGlsZCA6IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkgewotCQkJCXRoaXMucHJvY2Vzc1Bvc3RDbGVhbkJ1aWxkRGVsdGEoY2hpbGQpOyAgLy8gcmVjdXJzZQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NQcm9qZWN0UG9zdENsZWFuQnVpbGQoSVByb2plY3QgcHJvamVjdCkgewotCQkJZGVidWcoIlx0UHJvamVjdCBDTEVBTjogIiwgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQlHZW5lcmljSmF4YlByb2plY3RNYW5hZ2VyLnRoaXMucHJvamVjdFBvc3RDbGVhbkJ1aWxkKHByb2plY3QpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY2V0ZWQgcHJvamVjdCBsaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBGb3J3YXJkIHRoZSBGYWNldGVkIHByb2plY3QgY2hhbmdlIGV2ZW50IGJhY2sgdG8gdGhlIEpBWEIgcHJvamVjdCBtYW5hZ2VyLgotCSAqLwotCXByaXZhdGUgY2xhc3MgRmFjZXRlZFByb2plY3RMaXN0ZW5lciBpbXBsZW1lbnRzIElGYWNldGVkUHJvamVjdExpc3RlbmVyIHsKLQotCQlGYWNldGVkUHJvamVjdExpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBDaGVjayBmb3I6PHVsPgotCQkgKiA8bGk+dW4taW5zdGFsbCBvZiBKQVhCIGZhY2V0Ci0JCSAqIDwvdWw+Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIFBSRV9VTklOU1RBTEwgOgotCQkJCQl0aGlzLnByb2Nlc3NQcmVVbmluc3RhbGxFdmVudCgoSVByb2plY3RGYWNldEFjdGlvbkV2ZW50KSBldmVudCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwcm9jZXNzUHJlVW5pbnN0YWxsRXZlbnQoSVByb2plY3RGYWNldEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlkZWJ1ZygiRmFjZXQgUFJFX1VOSU5TVEFMTDogIiwgZXZlbnQuZ2V0UHJvamVjdEZhY2V0KCkpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZXZlbnQuZ2V0UHJvamVjdEZhY2V0KCkuZXF1YWxzKEpheGJGYWNldC5GQUNFVCkpIHsKLQkJCQlHZW5lcmljSmF4YlByb2plY3RNYW5hZ2VyLnRoaXMuamF4YkZhY2V0ZWRQcm9qZWN0UHJlVW5pbnN0YWxsKGV2ZW50KTsKLQkJCX0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGVsZW1lbnQgY2hhbmdlIGxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIEZvcndhcmQgdGhlIEphdmEgZWxlbWVudCBjaGFuZ2UgZXZlbnQgYmFjayB0byB0aGUgSkFYQiBwcm9qZWN0IG1hbmFnZXIuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBKYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgewotCQkvKioKLQkJICogQSBmbGFnIHRvIGFjdGl2YXRlL2RlYWN0aXZhdGUgdGhlIGxpc3RlbmVyCi0JCSAqIHNvIHdlIGNhbiBpZ25vcmUgSmF2YSBldmVudHMgd2hlbmV2ZXIgRGFsaSBpcyBtYW5pcHVsYXRpbmcgdGhlIEphdmEKLQkJICogc291cmNlIGNvZGUgdmlhIHRoZSBEYWxpIG1vZGVsLiBXZSBkbyB0aGlzIGJlY2F1c2UgdGhlIDAuNSBzZWMgZGVsYXkKLQkJICogYmV0d2VlbiB0aGUgSmF2YSBzb3VyY2UgYmVpbmcgY2hhbmdlZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnQKLQkJICogYmVpbmcgZmlyZWQgY2F1c2VzIHVzIG5vIGVuZCBvZiBwYWluLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGFjdGl2ZSA9IHRydWU7Ci0KLQkJSmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAodGhpcy5hY3RpdmUpIHsKLQkJCQlHZW5lcmljSmF4YlByb2plY3RNYW5hZ2VyLnRoaXMuamF2YUVsZW1lbnRDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfQotCi0JCXZvaWQgc2V0QWN0aXZlKGJvb2xlYW4gYWN0aXZlKSB7Ci0JCQl0aGlzLmFjdGl2ZSA9IGFjdGl2ZTsKLQkJfQotCi0JCWJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5hY3RpdmU7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogREVCVUcgKioqKioqKioqKgotCi0JLy8gQHNlZSBKYXhiUHJvamVjdE1hbmFnZXJUZXN0cyN0ZXN0REVCVUcoKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotCS8qKgotCSAqIHRyaWdnZXIgI3RvU3RyaW5nKCkgY2FsbCBhbmQgc3RyaW5nIGNvbmNhdGVuYXRpb24gb25seSBpZiBERUJVRyBpcyB0cnVlCi0JICovCi0JLyogcHJpdmF0ZSAqLyBzdGF0aWMgdm9pZCBkZWJ1ZyhTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IG9iamVjdCkgewotCQlpZiAoREVCVUcpIHsKLQkJCWRlYnVnXyhtZXNzYWdlICsgb2JqZWN0KTsKLQkJfQotCX0KLQotCS8qIHByaXZhdGUgKi8gc3RhdGljIHZvaWQgZGVidWcoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlkZWJ1Z18obWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGRlYnVnXyhTdHJpbmcgbWVzc2FnZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKyAiOiAiICsgbWVzc2FnZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiBwcml2YXRlICovIHN0YXRpYyB2b2lkIGR1bXBTdGFja1RyYWNlKCkgewotCQlkdW1wU3RhY2tUcmFjZShudWxsKTsKLQl9Ci0KLQkvKiBwcml2YXRlICovIHN0YXRpYyB2b2lkIGR1bXBTdGFja1RyYWNlKFN0cmluZyBtZXNzYWdlLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChERUJVRykgewotCQkJZHVtcFN0YWNrVHJhY2VfKG1lc3NhZ2UgKyBvYmplY3QpOwotCQl9Ci0JfQotCi0JLyogcHJpdmF0ZSAqLyBzdGF0aWMgdm9pZCBkdW1wU3RhY2tUcmFjZShTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoREVCVUcpIHsKLQkJCWR1bXBTdGFja1RyYWNlXyhtZXNzYWdlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZHVtcFN0YWNrVHJhY2VfKFN0cmluZyBtZXNzYWdlKSB7Ci0JCS8vIGxvY2sgU3lzdGVtLm91dCBzbyB0aGUgc3RhY2sgZWxlbWVudHMgYXJlIHByaW50ZWQgb3V0IGNvbnRpZ3VvdXNseQotCQlzeW5jaHJvbml6ZWQgKFN5c3RlbS5vdXQpIHsKLQkJCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCQlkZWJ1Z18obWVzc2FnZSk7Ci0JCQl9Ci0JCQlTdGFja1RyYWNlRWxlbWVudFtdIHN0YWNrVHJhY2UgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldFN0YWNrVHJhY2UoKTsKLQkJCS8vIHNraXAgdGhlIGZpcnN0IDMgZWxlbWVudHMgLSB0aG9zZSBhcmUgdGhpcyBtZXRob2QgYW5kIDIgbWV0aG9kcyBpbiBUaHJlYWQKLQkJCWZvciAoaW50IGkgPSAzOyBpIDwgc3RhY2tUcmFjZS5sZW5ndGg7IGkrKykgewotCQkJCVN0YWNrVHJhY2VFbGVtZW50IGVsZW1lbnQgPSBzdGFja1RyYWNlW2ldOwotCQkJCWlmIChlbGVtZW50LmdldE1ldGhvZE5hbWUoKS5lcXVhbHMoImludm9rZTAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOyAgLy8gc2tpcCBhbGwgZWxlbWVudHMgb3V0c2lkZSBvZiB0aGUgSlVuaXQgdGVzdAotCQkJCX0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0IiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL0pheGJGYWNldC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvSmF4YkZhY2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNjQ3Y2EuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvSmF4YkZhY2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEpheGJGYWNldCB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAianB0LmpheGIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IEZBQ0VUID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElEKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIFZFUlNJT05fMl8xID0gRkFDRVQuZ2V0VmVyc2lvbigiMi4xIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIFZFUlNJT05fMl8yID0gRkFDRVQuZ2V0VmVyc2lvbigiMi4yIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnN0YWxsZWQoZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJcmV0dXJuIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmhhc1Byb2plY3RGYWNldChwcm9qZWN0LCBJRCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJSnB0SmF4YkNvcmVQbHVnaW4ubG9nKGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCQotCS8qKgotCSAqIE5vdCBmb3IgaW5zdGFudGlhdGlvbgotCSAqLwotCXByaXZhdGUgSmF4YkZhY2V0KCkge30KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL0pheGJGYWN0b3J5LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9KYXhiRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTc2MjM2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL0pheGJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRW51bUNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkFjY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ29udGV4dFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbGVtZW50RmFjdG9yeU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbnVtQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbnVtTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQW55QXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQW55RWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50UmVmTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFJlZnNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50c01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbE5zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sUm9vdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sVmFsdWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxOc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBVc2UgYSBKQVhCIGZhY3RvcnkgdG8gYnVpbGQgYW55IGNvcmUgKGUuZy4ge0BsaW5rIEpheGJQcm9qZWN0fSkKLSAqIG1vZGVsIG9iamVjdCBvciBhbnkgSmF2YSAoZS5nLiB7QGxpbmsgWG1sVHlwZX0pIGNvbnRleHQgbW9kZWwgb2JqZWN0cwotICogPHA+Ci0gKiBBc3N1bWVzIGEgYmFzZSBKQVhCIHByb2plY3QgY29udGV4dCBzdHJ1Y3R1cmUgCi0gKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBKQVhCIHNwZWM6Ci0gKiA8cHJlPgotICogICAgIFJvb3RDb250ZXh0Ci0gKiAgICAgIHwtIGpheGIgcGFja2FnZXMvdHlwZXMKLSAqICAgICAgICAgIHwtIGpheGIgYXR0cmlidXRlcy9tZXRob2RzCi0gKiA8L3ByZT4KLSAqICAgLi4uIGFuZCBhc3NvY2lhdGVkIG9iamVjdHMuCi0gKjxwPiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5qYXhiMjEuR2VuZXJpY0pheGJfMl8xX0ZhY3RvcnkKLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YkZhY3RvcnkgIHsKLQkKLQkvLyAqKioqKioqKioqIENvcmUgTW9kZWwgKioqKioqKioqKgotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIEpheGJQcm9qZWN0IGZvciB0aGUgc3BlY2lmaWVkIGNvbmZpZywgdG8gYmUKLQkgKiBhZGRlZCB0byB0aGUgc3BlY2lmaWVkIEpBWEIgcHJvamVjdC4gUmV0dXJuIG51bGwgaWYgdW5hYmxlIHRvIGNyZWF0ZQotCSAqIHRoZSBKQVhCIGZpbGUgKGUuZy4gdGhlIGNvbnRlbnQgdHlwZSBpcyB1bnJlY29nbml6ZWQpLgotCSAqLwotCUpheGJQcm9qZWN0IGJ1aWxkSmF4YlByb2plY3QoSmF4YlByb2plY3QuQ29uZmlnIGNvbmZpZyk7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgSkFYQiBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIEpBWEIgcHJvamVjdCwgZmlsZSwgY29udGVudCB0eXBlLAotCSAqIGFuZCByZXNvdXJjZSBtb2RlbC4KLQkgKi8KLQlKYXhiRmlsZSBidWlsZEpheGJGaWxlKEpheGJQcm9qZWN0IGpheGJQcm9qZWN0LCBJRmlsZSBmaWxlLCBJQ29udGVudFR5cGUgY29udGVudFR5cGUsIEpwdFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBOb24tcmVzb3VyY2Utc3BlY2lmaWMgY29udGV4dCBub2RlcyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogQnVpbGQgYSAoL2FuIHVwZGF0ZWQpIHJvb3QgY29udGV4dCBub2RlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gCi0JICogSkFYQiBwcm9qZWN0LgotCSAqIFRoZSByb290IGNvbnRleHQgbm9kZSB3aWxsIGJlIGJ1aWx0IG9uY2UsIGJ1dCB1cGRhdGVkIG1hbnkgdGltZXMuCi0JICogQHNlZSBKYXhiUHJvamVjdCN1cGRhdGUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JSmF4YkNvbnRleHRSb290IGJ1aWxkQ29udGV4dFJvb3QoSmF4YlByb2plY3QgamF4YlByb2plY3QpOwotCQotCUpheGJQYWNrYWdlIGJ1aWxkUGFja2FnZShKYXhiQ29udGV4dFJvb3QgcGFyZW50LCBTdHJpbmcgcGFja2FnZU5hbWUpOwotCQotCQotCS8vICoqKioqKioqKiogSmF2YSBjb250ZXh0IG5vZGVzICoqKioqKioqKioKLQkKLQlKYXhiUGFja2FnZUluZm8gYnVpbGRKYXZhUGFja2FnZUluZm8oSmF4YlBhY2thZ2UgcGFyZW50LCBKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSk7Ci0JCi0JWG1sU2NoZW1hIGJ1aWxkSmF2YVhtbFNjaGVtYShKYXhiUGFja2FnZUluZm8gcGFyZW50KTsKLQkKLQlYbWxOcyBidWlsZEphdmFYbWxOcyhYbWxTY2hlbWEgcGFyZW50LCBYbWxOc0Fubm90YXRpb24geG1sTnNBbm5vdGF0aW9uKTsKLQkKLQlKYXhiQ2xhc3MgYnVpbGRKYXhiQ2xhc3MoSmF4YkNvbnRleHRSb290IHBhcmVudCwgSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpOwotCQotCUpheGJFbnVtIGJ1aWxkSmF4YkVudW0oSmF4YkNvbnRleHRSb290IHBhcmVudCwgSmF2YVJlc291cmNlRW51bSByZXNvdXJjZUVudW0pOwotCQotCUpheGJDbGFzc01hcHBpbmcgYnVpbGRKYXhiQ2xhc3NNYXBwaW5nKEpheGJDbGFzcyBwYXJlbnQpOwotCQotCUpheGJFbnVtTWFwcGluZyBidWlsZEpheGJFbnVtTWFwcGluZyhKYXhiRW51bSBwYXJlbnQpOwotCQotCVhtbFJlZ2lzdHJ5IGJ1aWxkWG1sUmVnaXN0cnkoSmF4YkNsYXNzIHBhcmVudCk7Ci0JCi0JSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kIGJ1aWxkSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kKFhtbFJlZ2lzdHJ5IHBhcmVudCwgSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kKTsKLQkKLQlYbWxSb290RWxlbWVudCBidWlsZEphdmFYbWxSb290RWxlbWVudChKYXhiVHlwZU1hcHBpbmcgcGFyZW50LCBYbWxSb290RWxlbWVudEFubm90YXRpb24geG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKTsKLQkKLQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKEpheGJDbGFzc01hcHBpbmcgcGFyZW50LCBBY2Nlc3NvciBhY2Nlc3Nvcik7Ci0JCi0JSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRKYXZhUGVyc2lzdGVudEZpZWxkKEpheGJDbGFzc01hcHBpbmcgcGFyZW50LCBKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkKTsKLQkKLQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZEphdmFQZXJzaXN0ZW50UHJvcGVydHkoSmF4YkNsYXNzTWFwcGluZyBwYXJlbnQsIEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZUdldHRlciwgSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlU2V0dGVyKTsKLQkKLQlKYXhiQXR0cmlidXRlTWFwcGluZyBidWlsZEphdmFOdWxsQXR0cmlidXRlTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwotCQotCVhtbEFueUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwotCQotCVhtbEFueUVsZW1lbnRNYXBwaW5nIGJ1aWxkSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JWG1sQXR0cmlidXRlTWFwcGluZyBidWlsZEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JWG1sRWxlbWVudE1hcHBpbmcgYnVpbGRKYXZhWG1sRWxlbWVudE1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlYbWxFbGVtZW50UmVmTWFwcGluZyBidWlsZEphdmFYbWxFbGVtZW50UmVmTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwotCQotCVhtbEVsZW1lbnRSZWZzTWFwcGluZyBidWlsZEphdmFYbWxFbGVtZW50UmVmc01hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlYbWxFbGVtZW50c01hcHBpbmcgYnVpbGRKYXZhWG1sRWxlbWVudHNNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JSmF4YkF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRKYXZhWG1sVHJhbnNpZW50TWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwotCQotCVhtbFZhbHVlTWFwcGluZyBidWlsZEphdmFYbWxWYWx1ZU1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlKYXhiRW51bUNvbnN0YW50IGJ1aWxkSmF2YUVudW1Db25zdGFudChKYXhiRW51bU1hcHBpbmcgcGFyZW50LCBKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQgcmVzb3VyY2VFbnVtQ29uc3RhbnQpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvSmF4YkZpbGUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL0pheGJGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZTEzM2EuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvSmF4YkZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VNb2RlbDsKLQotLyoqCi0gKiBBIEpBWEIgUHJvamVjdCBjb250YWlucyBKQVhCIGZpbGVzIGZvciBhbGwgZmlsZXMgaW4gdGhlIHByb2plY3QgdGhhdAotICogYXJlIHJlbGV2YW50IHRvIHRoZSBKQVhCIHNwZWMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiRmlsZQotCWV4dGVuZHMgSmF4Yk5vZGUKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpBWEIgZmlsZSdzIEVjbGlwc2UgZmlsZS4KLQkgKi8KLQlJRmlsZSBnZXRGaWxlKCk7Ci0JCi0JLyoqSkFYQgotCSAqIFJldHVybiB0aGUgSlBBIGZpbGUncyBjb250ZW50IHR5cGUuCi0JICovCi0JSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBKUEEgZmlsZTsgdHlwaWNhbGx5IGEgSlBBCi0JICogY29tcGlsYXRpb24gdW5pdCwgYSBKUEEgWE1MIHJlc291cmNlLCBvciBhIEpQQSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgKEpBUikuCi0JICovCi0JSnB0UmVzb3VyY2VNb2RlbCBnZXRSZXNvdXJjZU1vZGVsKCk7Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLiBSZXR1cm4gdGhlIHJlc291cmNlIG1vZGVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEpQQQotCSAqIGZpbGUgaWYgdGhlIGZpbGUncyBjb250ZW50IGlzIGEgImtpbmQtb2YiIHRoZSBzcGVjaWZpZWQgY29udGVudCB0eXBlOwotCSAqIG90aGVyd2lzZSwgcmV0dXJuIG51bGwuIFRoaXMgaXMgdXNlZnVsIHdoZW4gYSBjbGllbnQgaGFzIGxvb2tlZCB1cCB0aGUKLQkgKiBKUEEgZmlsZSB2aWEgYSBmaWxlIG5hbWUgW2FuZCBhc3N1bWVkIGNvbnRlbnQgdHlwZV0uCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VNb2RlbCgpCi0JICovCi0JSnB0UmVzb3VyY2VNb2RlbCBnZXRSZXNvdXJjZU1vZGVsKElDb250ZW50VHlwZSBjb250ZW50VHlwZSk7Ci0JCi0JCi0JLy8gKioqKioqKioqKiByb290IHN0cnVjdHVyZSBub2RlcyAqKioqKioqKioqCi0KLS8vCS8qKgotLy8JICogUmV0dXJuIHRoZSBKUEEgZmlsZSdzIHJvb3Qgc3RydWN0dXJlIG5vZGVzLgotLy8JICovCi0vLwlJdGVyYXRvcjxKcGFTdHJ1Y3R1cmVOb2RlPiByb290U3RydWN0dXJlTm9kZXMoKTsKLS8vCQlTdHJpbmcgUk9PVF9TVFJVQ1RVUkVfTk9ERVNfQ09MTEVDVElPTiA9ICJyb290U3RydWN0dXJlTm9kZXMiOyAvLyROT04tTkxTLTEkCi0vLwotLy8JLyoqCi0vLwkgKiBSZXR1cm4gdGhlIGNvdW50IG9mIHRoZSBKUEEgZmlsZSdzIHJvb3QgY29udGV4dCBtb2RlbCBvYmplY3RzLgotLy8JICovCi0vLwlpbnQgcm9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpOwotLy8KLS8vCS8qKgotLy8JICogQWRkIGEgcm9vdCBzdHJ1Y3R1cmUgbm9kZS4KLS8vCSAqIFRoZXJlIGlzIHRoZSBwb3RlbnRpYWwgZm9yIG11bHRpcGxlIHJvb3Qgc3RydWN0dXJlIG5vZGVzIAotLy8JICogZm9yIGEgcGFydGljdWxhciBrZXkuIEZvciBleGFtcGxlLCBhIEphdmEgZmlsZSB0aGF0IGlzIGxpc3RlZAotLy8JICogYm90aCBhcyBhIDxjbGFzcz4gaW4gdGhlIHBlcnNpc3RlbmNlLnhtbCBhbmQgYXMgYW4gPGVudGl0eT4gaW4KLS8vCSAqIGFuIG9ybS54bWwgZmlsZS4gSW4gdGhpcyBjYXNlIHRoZSBvcm0ueG1sIGZpbGUgbmVlZHMgdG8gc2V0Ci0vLwkgKiB0aGUgcm9vdCBzdHJ1Y3R1cmUgbm9kZSBhZnRlciB0aGUgSmF2YSBjbGFzcyByZWZlcmVuY2UuCi0vLwkgKiBMYXN0IG9uZSBpbiBkdXJpbmcgcHJvamVjdCAidXBkYXRlIiB3aW5zLgotLy8JICovCi0vLwl2b2lkIGFkZFJvb3RTdHJ1Y3R1cmVOb2RlKE9iamVjdCBrZXksIEpwYVN0cnVjdHVyZU5vZGUgcm9vdFN0cnVjdHVyZU5vZGUpOwotLy8KLS8vCS8qKgotLy8JICogQHNlZSAjYWRkUm9vdFN0cnVjdHVyZU5vZGUoT2JqZWN0LCBKcGFTdHJ1Y3R1cmVOb2RlKQotLy8JICovCi0vLwl2b2lkIHJlbW92ZVJvb3RTdHJ1Y3R1cmVOb2RlKE9iamVjdCBrZXkpOwotLy8KLS8vCS8qKgotLy8JICogUmV0dXJuIHRoZSBzdHJ1Y3R1cmUgbm9kZSBiZXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBmaWxlLgotLy8JICovCi0vLwlKcGFTdHJ1Y3R1cmVOb2RlIGdldFN0cnVjdHVyZU5vZGUoaW50IHRleHRPZmZzZXQpOwotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9KYXhiTm9kZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvSmF4Yk5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU1OGMzZi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9KYXhiTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBKQVhCLXNwZWNpZmljIHByb3RvY29sLiBBbGwgSkFYQiBvYmplY3RzIGJlbG9uZyB0byBhIEpBWEIgcHJvamVjdCwgYXJlCi0gKiBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSwgYW5kIGhhdmUgYSBwYXJlbnQgKGV4Y2VwdGluZyB0aGUgSkFYQiBwcm9qZWN0KS4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpheGJOb2RlCi0JZXh0ZW5kcyBNb2RlbCwgSUFkYXB0YWJsZQotewotCS8qKgotCSAqIFJldHVybiB0aGUgSkFYQiBwcm9qZWN0IHRoZSBub2RlIGJlbG9uZ3MgdG8uCi0JICovCi0JSmF4YlByb2plY3QgZ2V0SmF4YlByb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkFYQiBub2RlJ3MgcGFyZW50LiBUaGUgSkFYQiBwcm9qZWN0IHdpbGwgbm90IGhhdmUgYSBwYXJlbnQuCi0JICovCi0JSmF4Yk5vZGUgZ2V0UGFyZW50KCk7Ci0KLQl2b2lkIHN0YXRlQ2hhbmdlZCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBub2RlJ3MgcmVzb3VyY2UsIHR5cGljYWxseSBmb3IgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLQkgKi8KLQlJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL0pheGJQcm9qZWN0LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9KYXhiUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjhhZmM0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL0pheGJQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5FeHRlbmRlZENvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycy5DYWxsYmFja1N5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycy5TeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDb250ZXh0Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF4YmluZGV4LkpheGJJbmRleFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF4YnByb3BzLkpheGJQcm9wZXJ0aWVzUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBBIEpBWEIgcHJvamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gRWNsaXBzZSBwcm9qZWN0IChhbmQgaXRzIGNvcnJlc3BvbmRpbmcKLSAqIEphdmEgcHJvamVjdCkuIEl0IGhvbGRzIHRoZSAicmVzb3VyY2UiIG1vZGVsIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHZhcmlvdXMKLSAqIEpQQS1yZWxhdGVkIHJlc291cmNlcyAodGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZSwgaXRzIG1hcHBpbmcgZmlsZXMKLSAqIFs8Y29kZT5vcm0ueG1sPC9jb2RlPl0sCi0gKiBhbmQgdGhlIEphdmEgc291cmNlIGZpbGVzKS4gSXQgYWxzbyBob2xkcyB0aGUgImNvbnRleHQiIG1vZGVsIHRoYXQgcmVwcmVzZW50cwotICogdGhlIEpQQSBtZXRhZGF0YSwgYXMgZGVyaXZlZCBmcm9tIHNwZWMtZGVmaW5lZCBkZWZhdWx0cywgSmF2YSBzb3VyY2UgY29kZQotICogYW5ub3RhdGlvbnMsIGFuZCBYTUwgZGVzY3JpcHRvcnMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiUHJvamVjdAotCWV4dGVuZHMgSmF4Yk5vZGUKLXsKLQotCS8vICoqKioqKioqKiogZ2VuZXJhbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpBWEIgcHJvamVjdCdzIG5hbWUsIHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSBhc3NvY2lhdGVkCi0JICogRWNsaXBzZSBwcm9qZWN0J3MgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBFY2xpcHNlIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBKQVhCIHByb2plY3QuCi0JICovCi0JSVByb2plY3QgZ2V0UHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBKQVhCIHByb2plY3QuCi0JICovCi0JSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZlbmRvci1zcGVjaWZpYyBKQVhCIHBsYXRmb3JtIHRoYXQgYnVpbGRzIHRoZSBKQVhCIHByb2plY3QKLQkgKiBhbmQgaXRzIGNvbnRlbnRzLgotCSAqLwotCUpheGJQbGF0Zm9ybSBnZXRQbGF0Zm9ybSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2NoZW1hIGxpYnJhcnkgdXNlZCBmb3IgdmFsaWRhdGluZyBhbmQgdXNlciBhc3Npc3QKLQkgKi8KLQlTY2hlbWFMaWJyYXJ5IGdldFNjaGVtYUxpYnJhcnkoKTsKLQkKLQkvKioKLQkgKiBUaGUgSkFYQiBwcm9qZWN0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgSkpBWEJQQSBtb2RlbC4gQ2xlYW4gdXAgYW55Ci0JICogaG9va3MgdG8gZXh0ZXJuYWwgcmVzb3VyY2VzIGV0Yy4KLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKTsKLQotCi0JLy8gKioqKioqKioqKiBKQVhCIGZpbGVzICoqKioqKioqKioKLQotCS8qKiAKLQkgKiBJRCBzdHJpbmcgdXNlZCB3aGVuIHRoZSBKQVhCIHByb2plY3QncyBjb2xsZWN0aW9uIG9mIEpBWEIgZmlsZXMgY2hhbmdlcy4KLQkgKiBAc2VlICNhZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKQotCSAqLwotCVN0cmluZyBKQVhCX0ZJTEVTX0NPTExFQ1RJT04gPSAiamF4YkZpbGVzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKQVhCIHByb2plY3QncyBKQVhCIGZpbGVzLgotCSAqLwotCUl0ZXJhYmxlPEpheGJGaWxlPiBnZXRKYXhiRmlsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgSkFYQiBwcm9qZWN0J3MgSkFYQiBmaWxlcy4KLQkgKi8KLQlpbnQgZ2V0SmF4YkZpbGVzU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKQVhCIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGZpbGUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gSkFYQiBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGZpbGUuCi0JICovCi0JSmF4YkZpbGUgZ2V0SmF4YkZpbGUoSUZpbGUgZmlsZSk7Ci0KLQotLy8JLy8gKioqKioqKioqKiBleHRlcm5hbCBKYXZhIHJlc291cmNlIGNvbXBpbGF0aW9uIHVuaXRzICoqKioqKioqKioKLS8vCi0vLwkvKiogCi0vLwkgKiBJRCBzdHJpbmcgdXNlZCB3aGVuIHRoZSBKUEEgcHJvamVjdCdzIGNvbGxlY3Rpb24gb2YgZXh0ZXJuYWwgSmF2YQotLy8JICogcmVzb3VyY2UgY29tcGlsYXRpb24gdW5pdHMgY2hhbmdlcy4KLS8vCSAqIEBzZWUgI2FkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTdHJpbmcsIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpCi0vLwkgKi8KLS8vCVN0cmluZyBFWFRFUk5BTF9KQVZBX1JFU09VUkNFX0NPTVBJTEFUSU9OX1VOSVRTX0NPTExFQ1RJT04gPSAiZXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzIjsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCS8qKgotLy8JICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCdzIGV4dGVybmFsIEphdmEgcmVzb3VyY2UgY29tcGlsYXRpb24gdW5pdHMuCi0vLwkgKi8KLS8vCUl0ZXJhdG9yPEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdD4gZXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCk7Ci0vLwotLy8JLyoqCi0vLwkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIEpQQSBwcm9qZWN0J3MgZXh0ZXJuYWwgSmF2YSByZXNvdXJjZSBjb21waWxhdGlvbiB1bml0cy4KLS8vCSAqLwotLy8JaW50IGV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0c1NpemUoKTsKLS8vCi0vLwotLy8JLy8gKioqKioqKioqKiBleHRlcm5hbCBKYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgdHlwZXMgKioqKioqKioqKgotLy8KLS8vCS8qKgotLy8JICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCdzIGV4dGVybmFsIEphdmEgcmVzb3VyY2UgcGVyc2lzdGVudCB0eXBlIGNhY2hlLgotLy8JICovCi0vLwlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlIGdldEV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVDYWNoZSgpOwotLy8KLQkKLQkvLyAqKioqKioqKioqIEphdmEgcmVzb3VyY2VzICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgcmVzb3VyY2UgcGFja2FnZXMgZm9yIHRoZSBwcm9qZWN0LgotCSAqIFJldHVybiBudWxsIGlmIGludmFsaWQgb3IgYWJzZW50LiBUaGVzZSBjb3JyZXNwb25kIHRvIHBhY2thZ2UtaW5mby5qYXZhIGZpbGVzCi0JICovCi0JSXRlcmFibGU8SmF2YVJlc291cmNlUGFja2FnZT4gZ2V0SmF2YVJlc291cmNlUGFja2FnZXMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgcmVzb3VyY2UgcGFja2FnZSBmb3IgdGhlIHNwZWNpZmllZCBwYWNrYWdlLgotCSAqIFJldHVybiBudWxsIGlmIGludmFsaWQgb3IgYWJzZW50LgotCSAqLwotCUphdmFSZXNvdXJjZVBhY2thZ2UgZ2V0SmF2YVJlc291cmNlUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgamF2YSByZXNvdXJjZSBwYWNrYWdlcyB0aGF0IGFyZSBhbm5vdGF0ZWQgd2l0aAotCSAqIDEgb3IgbW9yZSB2YWxpZCBKQVhCIHBhY2thZ2UgYW5ub3RhdGlvbnMKLQkgKi8KLQlJdGVyYWJsZTxKYXZhUmVzb3VyY2VQYWNrYWdlPiBnZXRBbm5vdGF0ZWRKYXZhUmVzb3VyY2VQYWNrYWdlcygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgamF2YSByZXNvdXJjZSBwYWNrYWdlIGZvciB0aGUgc3BlY2lmaWVkIHBhY2thZ2UgaWYgYW5kIG9ubHkgaWYgaXQgaGFzCi0JICogcmVjb2duaXplZCBhbm5vdGF0aW9ucy4KLQkgKiBSZXR1cm4gbnVsbCBvdGhlcndpc2UuCi0JICovCi0JSmF2YVJlc291cmNlUGFja2FnZSBnZXRBbm5vdGF0ZWRKYXZhUmVzb3VyY2VQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSk7Ci0JCi0vLwkvKioKLS8vCSAqIFJldHVybiB0aGUgSmF2YSByZXNvdXJjZSBwYWNrYWdlIGZyYWdlbWVudCByb290IGZvciB0aGUgc3BlY2lmaWVkIEpBUi4KLS8vCSAqIFJldHVybiBudWxsIGlmIGFic2VudC4KLS8vCSAqLwotLy8JSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCBnZXRKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290KFN0cmluZyBqYXJGaWxlTmFtZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCB7QGxpbmsgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlfXMgdGhhdCBhcmUgcmVwcmVzZW50ZWQgYnkgamF2YSBzb3VyY2Ugd2l0aGluIHRoaXMgcHJvamVjdAotCSAqLwotCUl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4gZ2V0SmF2YVNvdXJjZVJlc291cmNlVHlwZXMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIHtAbGluayBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGV9cyB0aGF0IGFyZSByZXByZXNlbnRlZCBieSBqYXZhIHNvdXJjZSB3aXRoaW4gdGhpcyBwcm9qZWN0LAotCSAqIHRoYXQgYXJlIGFsc28gYW5ub3RhdGVkIHdpdGggYSByZWNvZ25pemVkIGFubm90YXRpb24gKGFuZCBhcmUgcGVyc2lzdGFibGUpIAotCSAqLwotCUl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4gZ2V0QW5ub3RhdGVkSmF2YVNvdXJjZVJlc291cmNlVHlwZXMoKTsKLQkKLS8vCS8qKgotLy8JICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgSkFYQiBwcm9qZWN0J3MgYW5ub3RhdGVkIEphdmEgY2xhc3NlcwotLy8JICovCi0vLwlJdGVyYWJsZTxTdHJpbmc+IGdldEFubm90YXRlZEphdmFTb3VyY2VDbGFzc05hbWVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlfSB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZSBuYW1lLCByZWdhcmRsZXNzIG9mIAotCSAqIHdoYXQga2luZCBpdCBpcy4KLQkgKiBSZXR1cm4gbnVsbCBpZiBhYnNlbnQuCi0JICovCi0JSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGdldEphdmFSZXNvdXJjZVR5cGUoU3RyaW5nIHR5cGVOYW1lKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGV9IHdpdGggdGhlIHNwZWNpZmllZCB0eXBlIG5hbWUgYW5kIGtpbmQuCi0JICogUmV0dXJuIG51bGwgaWYgaW52YWxpZCBvciBhYnNlbnQgb3IgaWYgdGhlIGtpbmQgZG9lcyBub3QgbWF0Y2guCi0JICovCi0JSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGdldEphdmFSZXNvdXJjZVR5cGUoU3RyaW5nIHR5cGVOYW1lLCBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUuS2luZCBraW5kKTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGpheGIuaW5kZXggcmVzb3VyY2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIGpheGIuaW5kZXggcmVzb3VyY2UgbW9kZWxzIHdpdGhpbiB0aGUgcHJvamVjdAotCSAqLwotCUl0ZXJhYmxlPEpheGJJbmRleFJlc291cmNlPiBnZXRKYXhiSW5kZXhSZXNvdXJjZXMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGpheGIuaW5kZXggcmVzb3VyY2UgbW9kZWwgKGNvdWxkIGJlIG11bHRpcGxlIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBsb2NhdGlvbnMKLQkgKiBmb3IgYSBnaXZlbiBwYWNrYWdlKSB3aXRoIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUKLQkgKi8KLQlKYXhiSW5kZXhSZXNvdXJjZSBnZXRKYXhiSW5kZXhSZXNvdXJjZShTdHJpbmcgcGFja2FnZU5hbWUpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogamF4Yi5wcm9wZXJ0aWVzIHJlc291cmNlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIFJldHVybiBhbGwgamF4Yi5wcm9wZXJ0aWVzIHJlc291cmNlIG1vZGVscyB3aXRoaW4gdGhlIHByb2plY3QKLQkgKi8KLQlJdGVyYWJsZTxKYXhiUHJvcGVydGllc1Jlc291cmNlPiBnZXRKYXhiUHJvcGVydGllc1Jlc291cmNlcygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3QgamF4Yi5wcm9wZXJ0aWVzIHJlc291cmNlIG1vZGVsIChjb3VsZCBiZSBtdWx0aXBsZSBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgbG9jYXRpb25zCi0JICogZm9yIGEgZ2l2ZW4gcGFja2FnZSkgd2l0aCB0aGUgZ2l2ZW4gcGFja2FnZSBuYW1lCi0JICovCi0JSmF4YlByb3BlcnRpZXNSZXNvdXJjZSBnZXRKYXhiUHJvcGVydGllc1Jlc291cmNlKFN0cmluZyBwYWNrYWdlTmFtZSk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBjb250ZXh0IG1vZGVsICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSByb290IG9mIHRoZSBKQVhCIHByb2plY3QncyBjb250ZXh0IG1vZGVsLgotCSAqLwotCUpheGJDb250ZXh0Um9vdCBnZXRDb250ZXh0Um9vdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0eXBlcy9wYWNrYWdlIGluZm9zIHRoYXQgYXJlIHByaW1hcnkgY29udGV4dCBvYmplY3RzIGZvciB0aGUgCi0JICogZ2l2ZW4gY29tcGlsYXRpb24gdW5pdAotCSAqLwotCUl0ZXJhYmxlPD8gZXh0ZW5kcyBKYXZhQ29udGV4dE5vZGU+IGdldFByaW1hcnlKYXZhTm9kZXMoSUNvbXBpbGF0aW9uVW5pdCBjdSk7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBtb2RlbCBzeW5jaHJvbml6YXRpb24gKioqKioqKioqKgotCQotCS8qKgotCSAqIFN5bmNocm9uaXplIHRoZSBKUEEgcHJvamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvamVjdCByZXNvdXJjZQotCSAqIGRlbHRhLCB3YXRjaGluZyBmb3IgYWRkZWQgYW5kIHJlbW92ZWQgZmlsZXMgaW4gcGFydGljdWxhci4KLQkgKi8KLQl2b2lkIHByb2plY3RDaGFuZ2VkKElSZXNvdXJjZURlbHRhIGRlbHRhKTsKLQotCS8qKgotCSAqIFN5bmNocm9uaXplIHRoZSBKUEEgcHJvamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgSmF2YSBjaGFuZ2UuCi0JICovCi0Jdm9pZCBqYXZhRWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCk7Ci0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZSBjb250ZXh0IG1vZGVsIHdpdGggcmVzb3VyY2UgbW9kZWwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzeW5jaHJvbml6ZXIgdGhhdCB3aWxsIHN5bmNocm9uaXplIHRoZSBjb250ZXh0IG1vZGVsIHdpdGgKLQkgKiB0aGUgcmVzb3VyY2UgbW9kZWwgd2hlbmV2ZXIgdGhlIHJlc291cmNlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JU3luY2hyb25pemVyIGdldENvbnRleHRNb2RlbFN5bmNocm9uaXplcigpOwotCi0JLyoqCi0JICogU2V0IHRoZSBzeW5jaHJvbml6ZXIgdGhhdCB3aWxsIGtlZXAgdGhlIGNvbnRleHQgbW9kZWwgc3luY2hyb25pemVkIHdpdGgKLQkgKiB0aGUgcmVzb3VyY2UgbW9kZWwgd2hlbmV2ZXIgdGhlIHJlc291cmNlIG1vZGVsIGNoYW5nZXMuCi0JICogQmVmb3JlIHNldHRpbmcgdGhlIHN5bmNocm9uaXplciwgY2xpZW50cyBzaG91bGQgc2F2ZSB0aGUgY3VycmVudAotCSAqIHN5bmNocm9uaXplciBzbyBpdCBjYW4gYmUgcmVzdG9yZWQgbGF0ZXIuCi0JICogCi0JICogQHNlZSAjZ2V0Q29udGV4dE1vZGVsU3luY2hyb25pemVyKCkKLQkgKi8KLQl2b2lkIHNldENvbnRleHRNb2RlbFN5bmNocm9uaXplcihTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyKTsKLQotCS8qKgotCSAqIFRoZSBKQVhCIHByb2plY3QncyByZXNvdXJjZSBtb2RlbCBoYXMgY2hhbmdlZDsgc3luY2hyb25pemUgdGhlIEpQQQotCSAqIHByb2plY3QncyBjb250ZXh0IG1vZGVsIHdpdGggaXQuIFRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSBjYWxsZWQgd2hlbiB0aGUKLQkgKiByZXNvdXJjZSBtb2RlbCBzdGF0ZSBoYXMgY2hhbmdlZCB3aGVuIGl0IGlzIHN5bmNocm9uaXplZCB3aXRoIGl0cwotCSAqIHVuZGVybHlpbmcgRWNsaXBzZSByZXNvdXJjZSBhcyB0aGUgcmVzdWx0IG9mIGFuIEVjbGlwc2UgcmVzb3VyY2UgY2hhbmdlCi0JICogZXZlbnQuIFRoaXMgbWV0aG9kIGNhbiBhbHNvIGJlIGNhbGxlZCB3aGVuIGEgY2xpZW50IChlLmcuIGEgSlVuaXQgdGVzdAotCSAqIGNhc2UpIGhhcyBtYW5pcHVsYXRlZCB0aGUgcmVzb3VyY2UgbW9kZWwgdmlhIGl0cyBBUEkgKGFzIG9wcG9zZWQgdG8KLQkgKiBtb2RpZnlpbmcgdGhlIHVuZGVybHlpbmcgRWNsaXBzZSByZXNvdXJjZSBkaXJlY3RseSkgYW5kIG5lZWRzIHRoZSBjb250ZXh0Ci0JICogbW9kZWwgdG8gYmUgc3luY2hyb25pemVkIGFjY29yZGluZ2x5IChzaW5jZSBtYW5pcHVsYXRpbmcgdGhlIHJlc291cmNlCi0JICogbW9kZWwgdmlhIGl0cyBBUEkgd2lsbCBub3QgdHJpZ2dlciB0aGlzIG1ldGhvZCkuIFdoZXRoZXIgdGhlIGNvbnRleHQKLQkgKiBtb2RlbCBpcyBzeW5jaHJvbm91c2x5IChvciBhc3luY2hyb25vdXNseSkgZGVwZW5kcyBvbiB0aGUgY3VycmVudCBjb250ZXh0Ci0JICogbW9kZWwgc3luY2hyb25pemVyLgotCSAqIAotCSAqIEBzZWUgI3N5bmNocm9uaXplQ29udGV4dE1vZGVsQW5kV2FpdCgpCi0JICovCi0Jdm9pZCBzeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JLyoqCi0JICogRm9yY2UgdGhlIEpBWEIgcHJvamVjdCdzIGNvbnRleHQgbW9kZWwgdG8gc3luY2hyb25pemUgd2l0aCBpdCByZXNvdXJjZQotCSAqIG1vZGVsIDxlbT5zeW5jaHJvbm91c2x5PC9lbT4uCi0JICogCi0JICogQHNlZSAjc3luY2hyb25pemVDb250ZXh0TW9kZWwoKQotCSAqIEBzZWUgI3VwZGF0ZUFuZFdhaXQoKQotCSAqLwotCXZvaWQgc3luY2hyb25pemVDb250ZXh0TW9kZWxBbmRXYWl0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBjYWxsYmFjayB1c2VkIGJ5IHRoZSBjb250ZXh0IG1vZGVsIHN5bmNocm9uaXplciB0byBwZXJmb3JtCi0JICogdGhlIGFjdHVhbCAic3luY2hyb25pemUiLgotCSAqLwotCUlTdGF0dXMgc3luY2hyb25pemVDb250ZXh0TW9kZWwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCS8vICoqKioqKioqKiogcHJvamVjdCAidXBkYXRlIiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHN5bmNocm9uaXplciB0aGF0IHdpbGwgdXBkYXRlIHRoZSBjb250ZXh0IG1vZGVsIHdoZW5ldmVyCi0JICogaXQgaGFzIGFueSBjaGFuZ2VzLiBUaGlzIGFsbG93cyBhbnkgaW50cmEtSkFYQiBwcm9qZWN0IGRlcGVuZGVuY2llcyB0bwotCSAqIGJlIHVwZGF0ZWQuCi0JICovCi0JQ2FsbGJhY2tTeW5jaHJvbml6ZXIgZ2V0VXBkYXRlU3luY2hyb25pemVyKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHN5bmNocm9uaXplciB0aGF0IHdpbGwgdXBkYXRlIHRoZSBjb250ZXh0IG1vZGVsIHdoZW5ldmVyCi0JICogaXQgaGFzIGFueSBjaGFuZ2VzLiBUaGlzIGFsbG93cyBhbnkgaW50cmEtSkFYQiBwcm9qZWN0IGRlcGVuZGVuY2llcyB0bwotCSAqIGJlIHVwZGF0ZWQuCi0JICogQmVmb3JlIHNldHRpbmcgdGhlIHVwZGF0ZSBzeW5jaHJvbml6ZXIsIGNsaWVudHMgc2hvdWxkIHNhdmUgdGhlIGN1cnJlbnQKLQkgKiBzeW5jaHJvbml6ZXIgc28gaXQgY2FuIGJlIHJlc3RvcmVkIGxhdGVyLgotCSAqIAotCSAqIEBzZWUgI2dldFVwZGF0ZVN5bmNocm9uaXplcigpCi0JICovCi0Jdm9pZCBzZXRVcGRhdGVTeW5jaHJvbml6ZXIoQ2FsbGJhY2tTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyKTsKLQotCS8qKgotCSAqIEZvcmNlIHRoZSBKQVhCIHByb2plY3QgdG8gInVwZGF0ZSIgPGVtPnN5bmNocm9ub3VzbHk8L2VtPi4KLQkgKiAKLQkgKiBAc2VlICNzeW5jaHJvbml6ZUNvbnRleHRNb2RlbEFuZFdhaXQoKQotCSAqLwotCXZvaWQgdXBkYXRlQW5kV2FpdCgpOwotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgY2FsbGJhY2sgdXNlZCBieSB0aGUgdXBkYXRlIHN5bmNocm9uaXplciB0byBwZXJmb3JtIHRoZQotCSAqIGFjdHVhbCAidXBkYXRlIi4KLQkgKi8KLQlJU3RhdHVzIHVwZGF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0KLQotCi0vLwkvLyAqKioqKioqKioqIHV0aWxpdHkgKioqKioqKioqKgotLy8KLS8vCS8qKgotLy8JICogUmV0dXJuIGFuIHtAbGluayBJRmlsZX0gdGhhdCBiZXN0IHJlcHJlc2VudHMgdGhlIGdpdmVuIHJ1bnRpbWUgbG9jYXRpb24KLS8vCSAqLwotLy8JSUZpbGUgZ2V0UGxhdGZvcm1GaWxlKElQYXRoIHJ1bnRpbWVQYXRoKTsKLQkKLQkKLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCQotCS8qKgotCSAqIFJldHVybiBwcm9qZWN0J3MgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLQkgKi8KLQlJdGVyYWJsZTxJTWVzc2FnZT4gZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKElSZXBvcnRlciByZXBvcnRlcik7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBtb2RpZnlpbmcgc2hhcmVkIGRvY3VtZW50cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXQgYSB0aHJlYWQtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBFeHRlbmRlZENvbW1hbmRFeGVjdXRvcn0KLQkgKiBpbnRlcmZhY2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZXhlY3V0ZSBhIGNvbW1hbmQgdG8gbW9kaWZ5IGEgc2hhcmVkCi0JICogZG9jdW1lbnQuIElmIG5lY2Vzc2FyeSwgdGhlIGNvbW1hbmQgZXhlY3V0b3IgY2FuIGJlIGNsZWFyZWQgYnkKLQkgKiBzZXR0aW5nIGl0IHRvIG51bGwuCi0JICogVGhpcyBhbGxvd3MgYmFja2dyb3VuZCBjbGllbnRzIHRvIG1vZGlmeSBkb2N1bWVudHMgdGhhdCBhcmUKLQkgKiBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIFVJLiBTZWUgaW1wbGVtZW50YXRpb25zIG9mIHtAbGluayBFeHRlbmRlZENvbW1hbmRFeGVjdXRvcn0uCi0JICovCi0Jdm9pZCBzZXRUaHJlYWRMb2NhbE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2plY3Qtd2lkZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLQkgKiB7QGxpbmsgRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3J9IGludGVyZmFjZS4KLQkgKi8KLQlFeHRlbmRlZENvbW1hbmRFeGVjdXRvciBnZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiBjb25maWcgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHNldHRpbmdzIHVzZWQgdG8gY29uc3RydWN0IGEgSkFYQiBwcm9qZWN0LgotCSAqLwotCWludGVyZmFjZSBDb25maWcgewotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgRWNsaXBzZSBwcm9qZWN0IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IEpBWEIgcHJvamVjdC4KLQkJICovCi0JCUlQcm9qZWN0IGdldFByb2plY3QoKTsKLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIEpBWEIgcGxhdGZvcm0gZGVmaW5pdGlvbiB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyBKQVhCIHByb2plY3QuCi0JCSAqLwotCQlKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGdldFBsYXRmb3JtRGVmaW5pdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL0pheGJQcm9qZWN0TWFuYWdlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvSmF4YlByb2plY3RNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MjU4NTcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvSmF4YlByb2plY3RNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLQotLyoqCi0gKiBUaGUgSkFYQiBwcm9qZWN0IG1hbmFnZXIgaG9sZHMgYWxsIHRoZSBKQVhCIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiUHJvamVjdE1hbmFnZXIKLQkJZXh0ZW5kcyBNb2RlbCB7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKQVhCIG1vZGVsJ3MgSkFYQiBwcm9qZWN0cy4KLQkgKi8KLQlJdGVyYWJsZTxKYXhiUHJvamVjdD4gZ2V0SmF4YlByb2plY3RzKCk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWEJfUFJPSkVDVFNfQ09MTEVDVElPTiA9ICJqYXhiUHJvamVjdHMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIEpBWEIgbW9kZWwncyBsaXN0IG9mIEpBWEIgcHJvamVjdHMuCi0JICovCi0JaW50IGdldEpheGJQcm9qZWN0c1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkFYQiBwcm9qZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QuCi0JICogUmV0dXJuIG51bGwgaWYgdW5hYmxlIHRvIGFzc29jaWF0ZSB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdAotCSAqIHdpdGggYSBKQVhCIHByb2plY3QuCi0JICovCi0JSmF4YlByb2plY3QgZ2V0SmF4YlByb2plY3QoSVByb2plY3QgcHJvamVjdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpBWEIgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBmaWxlLAotCSAqIG9yIG51bGwgaWYgdW5hYmxlIHRvIGFzc29jaWF0ZSB0aGUgc3BlY2lmaWVkIGZpbGUgd2l0aCBhIEpBWEIgZmlsZS4KLQkgKi8KLQlKYXhiRmlsZSBnZXRKYXhiRmlsZShJRmlsZSBmaWxlKTsKLQotCS8qKgotCSAqIFRoZSBKQVhCIHNldHRpbmdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdAotCSAqIGhhdmUgY2hhbmdlZCBpbiBzdWNoIGEgd2F5IGFzIHRvIHJlcXVpcmUgdGhlIGFzc29jaWF0ZWQKLQkgKiBKUEEgcHJvamVjdCB0byBiZSBjb21wbGV0ZWx5IHJlYnVpbHQKLQkgKiAoZS5nLiB3aGVuIHRoZSB1c2VyIGNoYW5nZXMgYSBwcm9qZWN0J3MgSkFYQiBwbGF0Zm9ybSkuCi0JICovCi0Jdm9pZCByZWJ1aWxkSmF4YlByb2plY3QoSVByb2plY3QgcHJvamVjdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwncyBKYXZhIGNoYW5nZSBsaXN0ZW5lciBpcyBhY3RpdmUuCi0JICovCi0JYm9vbGVhbiBqYXZhRWxlbWVudENoYW5nZUxpc3RlbmVySXNBY3RpdmUoKTsKLQotCS8qKgotCSAqIFNldCB3aGV0aGVyIHRoZSBtb2RlbCdzIEphdmEgY2hhbmdlIGxpc3RlbmVyIGlzIGFjdGl2ZS4KLQkgKi8KLQl2b2lkIHNldEphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXJJc0FjdGl2ZShib29sZWFuIGphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXJJc0FjdGl2ZSk7Ci0JCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9KYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9KYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhN2M1ZWEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvSmF4YlJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZU1vZGVsOwotCi0vKioKLSAqIE1hcCBhIGNvbnRlbnQgdHlwZSB0byBhIEpBWEIgcmVzb3VyY2UgbW9kZWwuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyIAotewotCS8qKgotCSAqIFJldHVybiB0aGUgZmlsZSBjb250ZW50IHR5cGUgdGhlIHByb3ZpZGVyIGlzIGZvci4KLQkgKi8KLQlJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKTsKLQotCS8qKgotCSAqIEJ1aWxkIGEgSkFYQiByZXNvdXJjZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBKQVhCIHByb2plY3QgYW5kIGZpbGUuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgZmFjdG9yeSBmb3IgY3JlYXRpb24gc28gZXh0ZW5kZXJzIGNhbiBzaW1wbHkgb3ZlcnJpZGUKLQkgKiB0aGUgYXBwcm9wcmlhdGUgY3JlYXRpb24gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcgYSBwcm92aWRlciBmb3IgdGhlCi0JICogc2FtZSBjb250ZW50LgotCSAqLwotCUpwdFJlc291cmNlTW9kZWwgYnVpbGRSZXNvdXJjZU1vZGVsKEpheGJQcm9qZWN0IGpheGJQcm9qZWN0LCBJRmlsZSBmaWxlKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL0pwdEpheGJDb3JlUGx1Z2luLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9KcHRKYXhiQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjg0ZmVjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL0pwdEpheGJDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uSmF4YlBsYXRmb3JtTWFuYWdlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5wcmVmcy5KYXhiUHJlZmVyZW5jZXNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLS8qKgotICogVGhlIERhbGkgSkFYQiBjb3JlIHBsdWctaW4gbGlmZWN5Y2xlIGltcGxlbWVudGF0aW9uLgotICogQSBudW1iZXIgb2YgZ2xvYmFsbHktYXZhaWxhYmxlIGNvbnN0YW50cyBhbmQgbWV0aG9kcy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRKYXhiQ29yZVBsdWdpbgotCQlleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBjb25zdGFudHMgKioqKioqKioqKgotCQotCS8qKgotCSAqIFRoZSBwbHVnLWluIGlkZW50aWZpZXIgb2YgRGFsaSBKQVhCIGNvcmUKLQkgKiAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUiPC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUiOyAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRF8gPSBQTFVHSU5fSUQgKyAnLic7Ci0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIEpBWEIgdmFsaWRhdGlvbiBtYXJrZXIKLQkgKiAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuamF4YlByb2JsZW1NYXJrZXIiPC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfSUQgPSBQTFVHSU5fSUQgKyAiLmpheGJQcm9ibGVtTWFya2VyIjsgIC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjb250ZW50IHR5cGUgZm9yIGpheGIuaW5kZXggZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElDb250ZW50VHlwZSBKQVhCX0lOREVYX0NPTlRFTlRfVFlQRSA9IGdldEpheGJDb250ZW50VHlwZSgiamF4YkluZGV4Iik7Ci0JCi0JLyoqCi0JICogVGhlIHJlc291cmNlIHR5cGUgZm9yIGpheGIuaW5kZXggZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwdFJlc291cmNlVHlwZSBKQVhCX0lOREVYX1JFU09VUkNFX1RZUEUgPSBuZXcgSnB0UmVzb3VyY2VUeXBlKEpBWEJfSU5ERVhfQ09OVEVOVF9UWVBFKTsKLQkKLQkvKioKLQkgKiBUaGUgY29udGVudCB0eXBlIGZvciBqYXhiLnByb3BlcnRpZXMgZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElDb250ZW50VHlwZSBKQVhCX1BST1BFUlRJRVNfQ09OVEVOVF9UWVBFID0gZ2V0SmF4YkNvbnRlbnRUeXBlKCJqYXhiUHJvcGVydGllcyIpOwotCQotCS8qKgotCSAqIFRoZSByZXNvdXJjZSB0eXBlIGZvciBqYXhiLnByb3BlcnRpZXMgZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwdFJlc291cmNlVHlwZSBKQVhCX1BST1BFUlRJRVNfUkVTT1VSQ0VfVFlQRSA9IG5ldyBKcHRSZXNvdXJjZVR5cGUoSkFYQl9QUk9QRVJUSUVTX0NPTlRFTlRfVFlQRSk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbnRlbnRUeXBlIGdldEpheGJDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJcmV0dXJuIGdldENvbnRlbnRUeXBlKENPTlRFTlRfUFJFRklYXyArIGNvbnRlbnRUeXBlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9QUkVGSVggPSBQTFVHSU5fSURfICsgImNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9QUkVGSVhfID0gQ09OVEVOVF9QUkVGSVggKyAnLic7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGZpZWxkcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcml2YXRlIHZvbGF0aWxlIEdlbmVyaWNKYXhiUHJvamVjdE1hbmFnZXIgcHJvamVjdE1hbmFnZXI7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBzaW5nbGV0b24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBzdGF0aWMgSnB0SmF4YkNvcmVQbHVnaW4gSU5TVEFOQ0U7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24gcGx1Zy1pbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnB0SmF4YkNvcmVQbHVnaW4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBwdWJsaWMgc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5ndWxhciBKQVhCIHByb2plY3QgbWFuYWdlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IHdvcmtzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpheGJQcm9qZWN0TWFuYWdlciBnZXRQcm9qZWN0TWFuYWdlcigpIHsKLQkJcmV0dXJuIElOU1RBTkNFLmdldFByb2plY3RNYW5hZ2VyXygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkFYQiBwcm9qZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QsCi0JICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIGFzc29jaWF0ZSB0aGUgc3BlY2lmaWVkIHByb2plY3Qgd2l0aCBhCi0JICogSkFYQiBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF4YlByb2plY3QgZ2V0SmF4YlByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gZ2V0UHJvamVjdE1hbmFnZXIoKS5nZXRKYXhiUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBKYXhiUGxhdGZvcm1NYW5hZ2VyIGdldEpheGJQbGF0Zm9ybU1hbmFnZXIoKSB7Ci0JCXJldHVybiBKYXhiUGxhdGZvcm1NYW5hZ2VySW1wbC5pbnN0YW5jZSgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIGRlZmF1bHQge0BsaW5rIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9ufSBmb3IgbmV3IEpBWEIgcHJvamVjdHMgd2l0aCB0aGUgZ2l2ZW4KLQkgKiBKQVhCIGZhY2V0IHZlcnNpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRKYXhiUGxhdGZvcm0oSVByb2plY3RGYWNldFZlcnNpb24gamF4YkZhY2V0VmVyc2lvbiwgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gcGxhdGZvcm0pIHsKLQkJU3RyaW5nIHByZWZlcmVuY2VLZXkgPSBudWxsOwotCQlpZiAoSmF4YkZhY2V0LlZFUlNJT05fMl8xLmVxdWFscyhqYXhiRmFjZXRWZXJzaW9uKSkgewotCQkJcHJlZmVyZW5jZUtleSA9IEpheGJQcmVmZXJlbmNlc01hbmFnZXIuREVGQVVMVF9KQVhCX1BMQVRGT1JNXzJfMV9QUkVGX0tFWTsKLQkJfQotCQllbHNlIGlmIChKYXhiRmFjZXQuVkVSU0lPTl8yXzIuZXF1YWxzKGpheGJGYWNldFZlcnNpb24pKSB7Ci0JCQlwcmVmZXJlbmNlS2V5ID0gSmF4YlByZWZlcmVuY2VzTWFuYWdlci5ERUZBVUxUX0pBWEJfUExBVEZPUk1fMl8yX1BSRUZfS0VZOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBKQVhCIGZhY2V0IHZlcnNpb246ICIgKyBqYXhiRmFjZXRWZXJzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUpheGJQcmVmZXJlbmNlc01hbmFnZXIuc2V0V29ya3NwYWNlUHJlZmVyZW5jZShwcmVmZXJlbmNlS2V5LCBwbGF0Zm9ybS5nZXRJZCgpKTsKLQl9Ci0JCi0JLyoqIAotCSAqIFJldHVybiB0aGUgZGVmYXVsdCB7QGxpbmsgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb259IGZvciBuZXcgSkFYQiBwcm9qZWN0cyB3aXRoIHRoZSBnaXZlbiAKLQkgKiBKQVhCIGZhY2V0IHZlcnNpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXREZWZhdWx0UGxhdGZvcm0oSVByb2plY3RGYWNldFZlcnNpb24gamF4YkZhY2V0VmVyc2lvbikgewotCQkKLQkJSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZGVmYXVsdFBsYXRmb3JtID0gCi0JCQkJZ2V0RGVmYXVsdFBsYXRmb3JtKAotCQkJCQlqYXhiRmFjZXRWZXJzaW9uLCAKLQkJCQkJSmF4YlByZWZlcmVuY2VzTWFuYWdlci5nZXRXb3Jrc3BhY2VQcmVmZXJlbmNlcygpLCAKLQkJCQkJSmF4YlByZWZlcmVuY2VzTWFuYWdlci5nZXREZWZhdWx0UHJlZmVyZW5jZXMoKSk7Ci0JCWlmIChkZWZhdWx0UGxhdGZvcm0gPT0gbnVsbCkgewotCQkJLy8gaWYgdGhlIHBsYXRmb3JtIElEIHN0b3JlZCBpbiB0aGUgd29ya3NwYWNlIHByZWZzIGlzIGludmFsaWQgKGkuZS4gbnVsbCksIGxvb2sgaW4gdGhlIGRlZmF1bHQgcHJlZnMKLQkJCWRlZmF1bHRQbGF0Zm9ybSA9IGdldERlZmF1bHRQbGF0Zm9ybShqYXhiRmFjZXRWZXJzaW9uLCBKYXhiUHJlZmVyZW5jZXNNYW5hZ2VyLmdldERlZmF1bHRQcmVmZXJlbmNlcygpKTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFBsYXRmb3JtOwotCX0KLQkKLQkvLyAKLQlwcml2YXRlIHN0YXRpYyBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXREZWZhdWx0UGxhdGZvcm0oCi0JCQkJSVByb2plY3RGYWNldFZlcnNpb24gamF4YkZhY2V0VmVyc2lvbiwgUHJlZmVyZW5jZXMgLi4uIG5vZGVzKSB7Ci0JCQotCQlKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBkZWZhdWx0RGVmYXVsdFBsYXRmb3JtOwotCQlTdHJpbmcgcHJlZmVyZW5jZUtleTsKLQkJaWYgKGpheGJGYWNldFZlcnNpb24uZXF1YWxzKEpheGJGYWNldC5WRVJTSU9OXzJfMSkpIHsKLQkJCWRlZmF1bHREZWZhdWx0UGxhdGZvcm0gPSBHZW5lcmljSmF4YlBsYXRmb3JtLlZFUlNJT05fMl8xOwotCQkJcHJlZmVyZW5jZUtleSA9IEpheGJQcmVmZXJlbmNlc01hbmFnZXIuREVGQVVMVF9KQVhCX1BMQVRGT1JNXzJfMV9QUkVGX0tFWTsgCi0JCX0KLQkJZWxzZSBpZiAoamF4YkZhY2V0VmVyc2lvbi5lcXVhbHMoSmF4YkZhY2V0LlZFUlNJT05fMl8yKSkgewotCQkJZGVmYXVsdERlZmF1bHRQbGF0Zm9ybSA9IEdlbmVyaWNKYXhiUGxhdGZvcm0uVkVSU0lPTl8yXzI7Ci0JCQlwcmVmZXJlbmNlS2V5ID0gSmF4YlByZWZlcmVuY2VzTWFuYWdlci5ERUZBVUxUX0pBWEJfUExBVEZPUk1fMl8yX1BSRUZfS0VZOyAKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgSkFYQiBmYWNldCB2ZXJzaW9uOiAiICsgamF4YkZhY2V0VmVyc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0RGVmYXVsdFBsYXRmb3JtKGpheGJGYWNldFZlcnNpb24sIHByZWZlcmVuY2VLZXksIGRlZmF1bHREZWZhdWx0UGxhdGZvcm0sIG5vZGVzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0RGVmYXVsdFBsYXRmb3JtKAotCQkJSVByb2plY3RGYWNldFZlcnNpb24gamF4YkZhY2V0VmVyc2lvbiwgU3RyaW5nIHByZWZlcmVuY2VLZXksIAotCQkJSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZGVmYXVsdERlZmF1bHQsIFByZWZlcmVuY2VzIC4uLiBub2RlcykgewkKLQkJCi0JCVN0cmluZyBkZWZhdWx0RGVmYXVsdElkID0gKGRlZmF1bHREZWZhdWx0ID09IG51bGwpID8gbnVsbCA6IGRlZmF1bHREZWZhdWx0LmdldElkKCk7Ci0JCVN0cmluZyBkZWZhdWx0UGxhdGZvcm1JZCA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldChwcmVmZXJlbmNlS2V5LCBkZWZhdWx0RGVmYXVsdElkLCBub2Rlcyk7Ci0JCUpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGRlZmF1bHRQbGF0Zm9ybSA9IGdldEpheGJQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKYXhiUGxhdGZvcm0oZGVmYXVsdFBsYXRmb3JtSWQpOwotCQlpZiAoZGVmYXVsdFBsYXRmb3JtICE9IG51bGwgJiYgZGVmYXVsdFBsYXRmb3JtLnN1cHBvcnRzSmF4YkZhY2V0VmVyc2lvbihqYXhiRmFjZXRWZXJzaW9uKSkgewotCQkJcmV0dXJuIGRlZmF1bHRQbGF0Zm9ybTsKLQkJfQotCQllbHNlIGlmIChkZWZhdWx0RGVmYXVsdCAhPSBudWxsICYmIGRlZmF1bHREZWZhdWx0LnN1cHBvcnRzSmF4YkZhY2V0VmVyc2lvbihqYXhiRmFjZXRWZXJzaW9uKSkgewotCQkJcmV0dXJuIGRlZmF1bHREZWZhdWx0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkFYQiBwbGF0Zm9ybSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SmF4YlBsYXRmb3JtSWQoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gKG5ldyBKYXhiUHJlZmVyZW5jZXNNYW5hZ2VyKHByb2plY3QpKS5nZXRKYXhiUGxhdGZvcm1JZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9ufSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXRKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN0cmluZyBqcGFQbGF0Zm9ybUlkID0gZ2V0SmF4YlBsYXRmb3JtSWQocHJvamVjdCk7Ci0JCXJldHVybiBnZXRKYXhiUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SmF4YlBsYXRmb3JtKGpwYVBsYXRmb3JtSWQpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIHtAbGluayBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbn0gYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRKYXhiUGxhdGZvcm0oSVByb2plY3QgcHJvamVjdCwgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gcGxhdGZvcm0pIHsKLQkJKG5ldyBKYXhiUHJlZmVyZW5jZXNNYW5hZ2VyKHByb2plY3QpKS5zZXRKYXhiUGxhdGZvcm0ocGxhdGZvcm0pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRTY2hlbWFMb2NhdGlvbnMoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gKG5ldyBKYXhiUHJlZmVyZW5jZXNNYW5hZ2VyKHByb2plY3QpKS5nZXRTY2hlbWFMb2NhdGlvbnMoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNjaGVtYUxvY2F0aW9ucyhJUHJvamVjdCBwcm9qZWN0LCBMaXN0PFN0cmluZz4gc2NoZW1hTG9jYXRpb25zKSB7Ci0JCShuZXcgSmF4YlByZWZlcmVuY2VzTWFuYWdlcihwcm9qZWN0KSkuc2V0U2NoZW1hTG9jYXRpb25zKHNjaGVtYUxvY2F0aW9ucyk7Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIHN0YXR1cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIElOU1RBTkNFLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgbnVsbCkpOwotICAgIH0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBleGNlcHRpb24gb3IgZXJyb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgdGhyb3dhYmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgdGhyb3dhYmxlKSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogcGx1Zy1pbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JcHVibGljIEpwdEpheGJDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoSU5TVEFOQ0UgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIHRoaXMgY29udmVudGlvbiBpcyAqd2FjayouLi4gIH5ianYKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJLy8gbm90aGluZyB5ZXQuLi4KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJaWYgKHRoaXMucHJvamVjdE1hbmFnZXIgIT0gbnVsbCkgewotCQkJCXRoaXMucHJvamVjdE1hbmFnZXIuc3RvcCgpOwotCQkJCXRoaXMucHJvamVjdE1hbmFnZXIgPSBudWxsOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN5bmNocm9uaXplZCBHZW5lcmljSmF4YlByb2plY3RNYW5hZ2VyIGdldFByb2plY3RNYW5hZ2VyXygpIHsKLQkJaWYgKHRoaXMucHJvamVjdE1hbmFnZXIgPT0gbnVsbCkgewotCQkJdGhpcy5wcm9qZWN0TWFuYWdlciA9IHRoaXMuYnVpbGRQcm9qZWN0TWFuYWdlcigpOwotCQkJdGhpcy5wcm9qZWN0TWFuYWdlci5zdGFydCgpOwotCQl9Ci0JCXJldHVybiB0aGlzLnByb2plY3RNYW5hZ2VyOwotCX0KLQotCXByaXZhdGUgR2VuZXJpY0pheGJQcm9qZWN0TWFuYWdlciBidWlsZFByb2plY3RNYW5hZ2VyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXhiUHJvamVjdE1hbmFnZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9NYXBwaW5nS2V5cy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvTWFwcGluZ0tleXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBiYzcxMi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9NYXBwaW5nS2V5cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlOwotCi0vKioKLSAqIElkZW50aWZpZXJzIGZvciBKQVhCIGNsYXNzL2F0dHJpYnV0ZSBtYXBwaW5nIHR5cGVzCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgaW50ZXJmYWNlIE1hcHBpbmdLZXlzIHsKLQotCVN0cmluZyBYTUxfQU5ZX0FUVFJJQlVURV9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAieG1sLWFueS1hdHRyaWJ1dGUiOwotCVN0cmluZyBYTUxfQU5ZX0VMRU1FTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gInhtbC1hbnktZWxlbWVudCI7Ci0JU3RyaW5nIFhNTF9BVFRSSUJVVEVfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gInhtbC1hdHRyaWJ1dGUiOwotCVN0cmluZyBYTUxfRUxFTUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAieG1sLWVsZW1lbnQiOwotCVN0cmluZyBYTUxfRUxFTUVOVFNfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gInhtbC1lbGVtZW50cyI7Ci0JU3RyaW5nIFhNTF9FTEVNRU5UX1JFRl9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAieG1sLWVsZW1lbnQtcmVmIjsKLQlTdHJpbmcgWE1MX0VMRU1FTlRfUkVGU19BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAieG1sLWVsZW1lbnQtcmVmcyI7Ci0JU3RyaW5nIFhNTF9NSVhFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAieG1sLW1peGVkIjsKLQlTdHJpbmcgWE1MX1RSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAieG1sLXRyYW5zaWVudCI7Ci0JU3RyaW5nIFhNTF9WQUxVRV9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAieG1sLXZhbHVlIjsKLQkKLQkvKiogbWFwcGluZyBrZXkgZm9yIGF0dHJpYnV0ZSBtYXBwaW5ncyB0aGF0IGFyZSB1bnJlY29nbml6ZWQgKi8KLQlTdHJpbmcgTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvU2NoZW1hRW50cnkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL1NjaGVtYUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMjY4NmMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvU2NoZW1hRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFNjaGVtYTsKLQotLyoqCi0gKiBTY2hlbWEgY29uZmlndXJhdGlvbiBvYmplY3QgZm9yIHtAbGluayBTY2hlbWFMaWJyYXJ5fQotICogCi0gKiBAbm9pbXBsZW1lbnQKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMQotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hRW50cnkgewotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbG9jYXRpb24ga2V5IG9mIHRoZSBlbnRyeS4KLQkgKiBUaGlzIGNvdWxkIGJlOgotCSAqICAtIGEgd2ViIGxvY2F0aW9uICh0aGF0IHRoZW4gcmVkaXJlY3RzIHRvIGEgcGx1Z2luIHJlc291cmNlIGxvY2F0aW9uKQotCSAqICAtIGEgd29ya3NwYWNlIGxvY2F0aW9uCi0JICogIC0gYSBuYW1lc3BhY2UKLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYXRpb24oKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWVzcGFjZSBvZiB0aGUgc2NoZW1hIAotCSAqLwotCVN0cmluZyBnZXROYW1lc3BhY2UoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc2NoZW1hIHJlZmVycmVkIHRvIGJ5IHRoZSBlbnRyeSBpcyBsb2FkZWQKLQkgKi8KLQlib29sZWFuIGlzTG9hZGVkKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgWHNkU2NoZW1hfSBhc3NvY2lhdGVkIHdpdGggdGhlIGVudHJ5LgotCSAqIFRoZSBwcm92aWRlZCBuYW1lc3BhY2UgaXMgYSBsYXN0IGZhaWxzYWZlIGNoZWNrIHRoYXQgdGhlIGxvYWRlZCBzY2hlbWEgZG9lcyBpbiBmYWN0Ci0JICogaGF2ZSB0aGUgbmFtZXNwYWNlIGluIHF1ZXN0aW9uLgotCSAqIChTb21ldGltZXMgb24gYSByZWZyZXNoIHRoZSBzY2hlbWEgd2lsbCB0dXJuIG91dCB0byBoYXZlIGEgZGlmZmVyZW50IG5hbWVzcGFjZSB0aGFuIGV4cGVjdGVkKQotCSAqLwotCVhzZFNjaGVtYSBnZXRYc2RTY2hlbWEoU3RyaW5nIG5hbWVzcGFjZSk7Ci0JCi0JLyoqCi0JICogUmVmcmVzaCB0aGUgYXNzb2NpYXRlZCBzY2hlbWEKLQkgKi8KLQl2b2lkIHJlZnJlc2goKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL1NjaGVtYUxpYnJhcnkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL1NjaGVtYUxpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhYjBjMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9TY2hlbWFMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RTY2hlbWE7Ci0KLS8qKgotICogRW50cnkgcG9pbnQgZm9yIGFjY2Vzc2luZyBwcm9qZWN0IHNjaGVtYSByZXNvdXJjZXMKLSAqIAotICogQG5vaW1wbGVtZW50Ci0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjAKLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYUxpYnJhcnkgewotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2NoZW1hIGVudHJpZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIHByb2plY3Qgc2V0dGluZ3MgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMKLQkgKi8KLQlwdWJsaWMgTGlzdDxTY2hlbWFFbnRyeT4gZ2V0U2NoZW1hRW50cmllcygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbG9jYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NoZW1hIGVudHJpZXMKLQkgKi8KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFNjaGVtYUxvY2F0aW9ucygpOwotCQotCS8qKgotCSAqIFNldCB0aGUgc2NoZW1hIGxvY2F0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjaGVtYUxvY2F0aW9ucyhMaXN0PFN0cmluZz4gc2NoZW1hTG9jYXRpb25zKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIFhzZFNjaGVtYSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBuYW1lc3BhY2UsIGlmIGl0IGV4aXN0cyBhbmQgaXMgcmVzb2x2YWJsZS4KLQkgKiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgc2NoZW1hcyB3aXRoIHRoZSBnaXZlbiBuYW1lc3BhY2UsIHJldHVybiB0aGUgZmlyc3Qgb25lIGZvdW5kLgotCSAqIFJldHVybiBudWxsIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgWHNkU2NoZW1hIGdldFNjaGVtYShTdHJpbmcgbmFtZXNwYWNlKTsKLQkKLQkvKioKLQkgKiBSZWZyZXNoIHRoZSBzY2hlbWEgd2l0aCB0aGUgZ2l2ZW4gbmFtZXNwYWNlLCBpZiBpdCBleGlzdHMgYW5kIGlzIHJlc29sdmFibGUuCi0JICogUmVmcmVzaCB0aGUgZmlyc3Qgb25lIGZvdW5kIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBzY2hlbWFzIGZvciB0aGUgbmFtZXNwYWNlLgotCSAqIERvIG5vdGhpbmcgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hTY2hlbWEoU3RyaW5nIG5hbWVzcGFjZSk7Ci0JCi0JLyoqCi0JICogUmVmcmVzaCBhbGwgc2NoZW1hcyB3aXRoaW4gdGhlIGxpYnJhcnkuCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEFsbFNjaGVtYXMoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvQWNjZXNzb3IuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvQWNjZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FhODRkYi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0FjY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgSkFYQiBhY2Nlc3NvciAoZmllbGQvcHJvcGVydHkpLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWNjZXNzb3IKLQkJZXh0ZW5kcyBKYXZhQ29udGV4dE5vZGUgewotCi0JSmF2YVJlc291cmNlQXR0cmlidXRlIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JYm9vbGVhbiBpc0ZvcihKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkKTsKLQotCWJvb2xlYW4gaXNGb3IoSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlR2V0dGVyLCBKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VTZXR0ZXIpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIG5hbWUgb2YgdGhlIGphdmEgYXR0cmlidXRlLCBvciB0aGUgaXRlbSB0eXBlIG5hbWUgb2YgYSBjb2xsZWN0aW9uIG9yIGFycmF5LgotCSAqLwotCVN0cmluZyBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGVCYXNlVHlwZU5hbWUoKTsKLQkKLQkvKioKLQkgKiAoU2VlIEpBWEIgMi4yIFNwZWMsIHNlY3QuIDUuNS4yKQotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBqYXZhIGF0dHJpYnV0ZSB0eXBlIGlzIGFuIGV4dGVuc2lvbiBvZiBqYXZhLnV0aWwuQ29sbGVjdGlvbiBvciBhIHNpbmdsZSAKLQkgKiBkaW1lbnNpb25hbCBhcnJheSAoZXhjZXB0IGZvciBieXRlW10sIHdoaWNoIGlzIHRyZWF0ZWQgbGlrZSBhIG5vbi1hcnJheSkKLQkgKi8KLQlib29sZWFuIGlzSmF2YVJlc291cmNlQXR0cmlidXRlQ29sbGVjdGlvblR5cGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgamF2YSByZXNvdXJjZSBhdHRyaWJ1dGUgdHlwZSBpcyBhIHN1YnR5cGUgb2YgdGhlIGdpdmVuIHR5cGUKLQkgKiBUaGlzIG1pZ2h0IG5vdCByZXR1cm4gdGhlIHNhbWUgdGhpbmcgYXMgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkudHlwZUlzU3ViVHlwZU9mKFN0cmluZykuCi0JICovCi0JYm9vbGVhbiBpc0phdmFSZXNvdXJjZUF0dHJpYnV0ZVR5cGVTdWJUeXBlT2YoU3RyaW5nIHR5cGVOYW1lKTsKLQotCi0JLy8qKioqKioqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioqKioqKioqCi0KLQlmaW5hbCBjbGFzcyBBY2Nlc3NvclRvb2xzIHsKLQkJCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJZVEVfQVJSQVlfQ0xBU1NfTkFNRSA9ICJieXRlW10iOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xMRUNUSU9OX0NMQVNTX05BTUUgPSBDb2xsZWN0aW9uLmNsYXNzLmdldE5hbWUoKTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUX0NMQVNTX05BTUUgPSBPYmplY3QuY2xhc3MuZ2V0TmFtZSgpOwotCQkKLQkJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmFzZVR5cGVOYW1lKEphdmFSZXNvdXJjZUF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJCWlmIChhdHRyaWJ1dGUudHlwZUlzQXJyYXkoKSkgewotCQkJCWlmIChCWVRFX0FSUkFZX0NMQVNTX05BTUUuZXF1YWxzKGF0dHJpYnV0ZS5nZXRUeXBlTmFtZSgpKSkgewotCQkJCQlyZXR1cm4gQllURV9BUlJBWV9DTEFTU19OQU1FOwotCQkJCX0KLQkJCQllbHNlIGlmIChhdHRyaWJ1dGUuZ2V0VHlwZUFycmF5RGltZW5zaW9uYWxpdHkoKSA9PSAxKSB7Ci0JCQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0VHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyaWJ1dGUudHlwZUlzU3ViVHlwZU9mKENPTExFQ1RJT05fQ0xBU1NfTkFNRSkpIHsKLQkJCQlpZiAoYXR0cmlidXRlLmdldFR5cGVUeXBlQXJndW1lbnROYW1lc1NpemUoKSA9PSAxKSB7Ci0JCQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0VHlwZVR5cGVBcmd1bWVudE5hbWUoMCk7Ci0JCQkJfQotCQkJCXJldHVybiBPQkpFQ1RfQ0xBU1NfTkFNRTsKLQkJCX0KLQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0VHlwZU5hbWUoKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEBzZWUgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUjaXNKYXZhUmVzb3VyY2VBdHRyaWJ1dGVDb2xsZWN0aW9uVHlwZSgpCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb2xsZWN0aW9uVHlwZShKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCQlpZiAoYXR0cmlidXRlLnR5cGVJc0FycmF5KCkpIHsKLQkJCQlpZiAoYXR0cmlidXRlLmdldFR5cGVBcnJheURpbWVuc2lvbmFsaXR5KCkgPT0gMQotCQkJCQkJJiYgISBCWVRFX0FSUkFZX0NMQVNTX05BTUUuZXF1YWxzKGF0dHJpYnV0ZS5nZXRUeXBlTmFtZSgpKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSBpZiAoYXR0cmlidXRlLnR5cGVJc1N1YlR5cGVPZihDT0xMRUNUSU9OX0NMQVNTX05BTUUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YkF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YkF0dHJpYnV0ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjllODM0MC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJBdHRyaWJ1dGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RUeXBlRGVmaW5pdGlvbjsKLQotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBKQVhCIGF0dHJpYnV0ZSBtYXBwaW5nLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YkF0dHJpYnV0ZU1hcHBpbmcKLQkJZXh0ZW5kcyBKYXZhQ29udGV4dE5vZGUgewotCQotCVN0cmluZyBnZXRLZXkoKTsKLQkKLQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCi0JSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQotCUpheGJDbGFzc01hcHBpbmcgZ2V0Q2xhc3NNYXBwaW5nKCk7Ci0JCi0JCi0JLy8gKioqKiogZGVmYXVsdCAqKioqKgotCQotCVN0cmluZyBERUZBVUxUX1BST1BFUlRZID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1hcHBpbmcgaXMgaXRzIGF0dHJpYnV0ZSdzIDxlbT5kZWZhdWx0PC9lbT4gbWFwcGluZwotCSAqIChhcyBvcHBvc2VkIHRvIGl0cyA8ZW0+c3BlY2lmaWVkPC9lbT4gbWFwcGluZykuCi0JICovCi0JYm9vbGVhbiBpc0RlZmF1bHQoKTsKLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAoZnVsbHkgcXVhbGlmaWVkKSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUKLQkgKiAob3IgdGhlIGl0ZW0gdHlwZSBpZiBpbiBhIGNvbGxlY3Rpb24vYXJyYXkpCi0JICovCi0JU3RyaW5nIGdldEJvdW5kVHlwZU5hbWUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIChmdWxseSBxdWFsaWZpZWQpIHR5cGUgdXNlZCB0byBtYXAgdGhlIGJvdW5kIHR5cGUuIAotCSAqIChVc3VhbGx5IHRoZSBzYW1lIGFzIHRoZSB2YWx1ZSB0eXBlLCBleGNlcHQgd2hlbiBhbiBYbWxKYXZhVHlwZUFkYXB0ZXIgaXMgdXNlZC4pCi0JICovCi0JU3RyaW5nIGdldFZhbHVlVHlwZU5hbWUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIChmdWxseSBxdWFsaWZpZWQpIHR5cGUgb2YgdGhlIGRhdGEgYWN0dWFsbHkgd3JpdHRlbiB0byB4bWwuCi0JICogKFVzdWFsbHkgdGhlIHNhbWUgYXMgdGhlIHZhbHVlIHR5cGUsIGV4Y2VwdCB3aGVuIGFuIFhtbElEUkVGIGlzIHVzZWQuKQotCSAqLwotCVN0cmluZyBnZXREYXRhVHlwZU5hbWUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNjaGVtYSB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsdWUgdHlwZS4gIE1heSBiZSBudWxsLgotCSAqLwotCVhzZFR5cGVEZWZpbml0aW9uIGdldERhdGFUeXBlWHNkVHlwZURlZmluaXRpb24oKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIGRpcmVjdGx5IHJlZmVyZW5jZWQgdHlwZXMsIGZ1bGx5IHF1YWxpZmllZC4KLQkgKiAoVXNlZCBmb3IgY29uc3RydWN0aW5nIEpheGIgY29udGV4dCkKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYXR0cmlidXRlIGlzIG1hcHBlZCB0byBhIHBhcnRpY2xlCi0JICogKGUuZy4gWG1sRWxlbWVudCwgWG1sRWxlbWVudHMsIFhtbEVsZW1lbnRSZWYsIFhtbEVsZW1lbnRSZWZzKQotCSAqLwotCWJvb2xlYW4gaXNQYXJ0aWNsZU1hcHBpbmcoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYXR0cmlidXRlIGlzIHNwZWNpZmljYWxseSBleGNsdWRlZCBmcm9tIGJlaW5nIG1hcHBlZAotCSAqIChlLmcuIFhtbFRyYW5zaWVudCkKLQkgKi8KLQlib29sZWFuIGlzVHJhbnNpZW50KCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJBdHRyaWJ1dGVzQ29udGFpbmVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJBdHRyaWJ1dGVzQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmOWU3NTcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiQXR0cmlidXRlc0NvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBIb2xkcyB0aGUgYXR0cmlidXRlcyByZXByZXNlbnRlZCBieSBhIHBhcnRpY3VsYXIgSmF2YVJlc291cmNlVHlwZSBhbmQgWG1sQWNjZXNzVHlwZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpheGJBdHRyaWJ1dGVzQ29udGFpbmVyCi0JCWV4dGVuZHMgSmF2YUNvbnRleHROb2RlIHsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgSmF4YkF0cmlidXRlc0NvbnRhaW5lciBjb250YWlucyBhdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gSmF2YVJlc291cmNlVHlwZS4KLQkgKi8KLQlib29sZWFuIGlzRm9yKEphdmFSZXNvdXJjZVR5cGUgamF2YVJlc291cmNlVHlwZSk7Ci0KLQotCS8qKioqKioqKioqIGF0dHJpYnV0ZXMgKioqKioqKioqKi8KLQotCUl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzKCk7Ci0JCi0JaW50IGdldEF0dHJpYnV0ZXNTaXplKCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJDbGFzcy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE4NWJmMy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSA8aT5jbGFzczwvaT4gaW4gYSBKQVhCIGNvbnRleHQuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiQ2xhc3MKLQkJZXh0ZW5kcyBKYXhiVHlwZSB7Ci0JCi0JLy8gKioqKiogb3ZlcnJpZGVzICoqKioqCi0JCi0JSmF2YVJlc291cmNlVHlwZSBnZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCi0JcHVibGljIEpheGJDbGFzc01hcHBpbmcgZ2V0TWFwcGluZygpOwotCQotCQotCS8vICoqKioqIFhtbFJlZ2lzdHJ5ICoqKioqCi0JCi0JU3RyaW5nIFhNTF9SRUdJU1RSWV9QUk9QRVJUWSA9ICJ4bWxSZWdpc3RyeSI7ICAvLyROT04tTkxTLTEkCi0JCi0JWG1sUmVnaXN0cnkgZ2V0WG1sUmVnaXN0cnkoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YkNsYXNzTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiQ2xhc3NNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMjg2YTguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiQ2xhc3NNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEpheGJDbGFzc01hcHBpbmcKLQkJZXh0ZW5kcyBKYXhiVHlwZU1hcHBpbmcsIFhtbEFjY2Vzc1R5cGVIb2xkZXIsIFhtbEFjY2Vzc09yZGVySG9sZGVyIHsKLQkKLQkvLyAqKioqKiBvdmVycmlkZXMgKioqKioKLQkKLQlKYXhiQ2xhc3MgZ2V0SmF4YlR5cGUoKTsKLQkKLQkKLQkvLyAqKioqKiBYbWxUeXBlLmZhY3RvcnlDbGFzcyAqKioqKgotCQotCVN0cmluZyBnZXRGYWN0b3J5Q2xhc3MoKTsKLQkKLQlTdHJpbmcgU1BFQ0lGSUVEX0ZBQ1RPUllfQ0xBU1NfUFJPUEVSVFkgPSAic3BlY2lmaWVkRmFjdG9yeUNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIGZhY3RvcnkgY2xhc3MgY29ycmVzcG9uZHMgdG8gdGhlIFhtbFR5cGUgYW5ub3RhdGlvbiBmYWN0b3J5Q2xhc3MgZWxlbWVudAotCSAqLwotCVN0cmluZyBnZXRTcGVjaWZpZWRGYWN0b3J5Q2xhc3MoKTsKLQkKLQl2b2lkIHNldFNwZWNpZmllZEZhY3RvcnlDbGFzcyhTdHJpbmcgZmFjdG9yeUNsYXNzKTsKLQkKLQkKLQkvLyAqKioqKiBYbWxUeXBlLmZhY3RvcnlNZXRob2QgKioqKioKLQkKLQlTdHJpbmcgRkFDVE9SWV9NRVRIT0RfUFJPUEVSVFkgPSAiZmFjdG9yeU1ldGhvZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBmYWN0b3J5IG1ldGhvZCBjb3JyZXNwb25kcyB0byB0aGUgWG1sVHlwZSBhbm5vdGF0aW9uIGZhY3RvcnlNZXRob2QgZWxlbWVudAotCSAqLwotCVN0cmluZyBnZXRGYWN0b3J5TWV0aG9kKCk7Ci0JCi0Jdm9pZCBzZXRGYWN0b3J5TWV0aG9kKFN0cmluZyBmYWN0b3J5TWV0aG9kKTsKLQkKLQkKLQkvLyAqKioqKiBYbWxUeXBlLnByb3BPcmRlciAqKioqKgotCQotCVN0cmluZyBQUk9QX09SREVSX0xJU1QgPSAicHJvcE9yZGVyIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIHByb3BPcmRlciBjb3JyZXNwb25kcyB0byB0aGUgWG1sVHlwZSBhbm5vdGF0aW9uIHByb3BPcmRlciBlbGVtZW50Ci0JICovCi0JTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0UHJvcE9yZGVyKCk7Ci0JCi0JU3RyaW5nIGdldFByb3AoaW50IGluZGV4KTsKLQkKLQlpbnQgZ2V0UHJvcE9yZGVyU2l6ZSgpOwotCQotCXZvaWQgYWRkUHJvcChpbnQgaW5kZXgsIFN0cmluZyBwcm9wKTsKLQkKLQl2b2lkIHJlbW92ZVByb3AoaW50IGluZGV4KTsKLQkKLQl2b2lkIHJlbW92ZVByb3AoU3RyaW5nIHByb3ApOwotCQotCXZvaWQgbW92ZVByb3AoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCQotCQotCS8vICoqKioqIHN1cGVyY2xhc3MgKioqKioKLQkKLQlTdHJpbmcgU1VQRVJDTEFTU19QUk9QRVJUWSA9ICJzdXBlcmNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQotCUpheGJDbGFzc01hcHBpbmcgZ2V0U3VwZXJjbGFzcygpOwotCQotCQotCS8vICoqKioqIGF0dHJpYnV0ZXMgKioqKioKLQkKLQlTdHJpbmcgQVRUUklCVVRFU19DT0xMRUNUSU9OID0gImF0dHJpYnV0ZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JSXRlcmFibGU8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldEF0dHJpYnV0ZXMoKTsKLQkKLQlpbnQgZ2V0QXR0cmlidXRlc1NpemUoKTsKLQkKLQkKLQkvLyAqKioqKiBpbmNsdWRlZCBhdHRyaWJ1dGVzICoqKioqCi0JCi0JU3RyaW5nIElOQ0xVREVEX0FUVFJJQlVURVNfQ09MTEVDVElPTiA9ICJpbmNsdWRlZEF0dHJpYnV0ZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogPGk+SW5jbHVkZWQ8L2k+IGF0dHJpYnV0ZXMgY29tZSBmcm9tIGFueSBkaXJlY3Qgc3VwZXJjbGFzc2VzIHRoYXQgYXJlIG1hcHBlZCBhcyBAWG1sVHJhbnNpZW50LgotCSAqIChBcyBvcHBvc2VkIHRvIDxpPmluaGVyaXRlZDwvaT4gYXR0cmlidXRlcywgd2hpY2ggYSBjbGFzcyBoYXMgYnkgd2F5IG9mIDxpPmFueTwvaT4gbWFwcGVkIHN1cGVyY2xhc3Nlcy4pCi0JICogSWYgdGhlcmUgaXMgYW4gaW50ZXJ2ZW5pbmcgY2xhc3MgdGhhdCBpcyBub3QgdHJhbnNpZW50LCB0aGVuIHRoYXQgY2xhc3Mgd2lsbCBob2xkIGFueQotCSAqIGluY2x1ZGVkIGF0dHJpYnV0ZXMgZnJvbSBhbnkgZGlyZWN0IHN1cGVyY2xhc3MgdGhhdCBhcmUgbWFwcGVkIGFzIEBYbWxUcmFuc2llbnQuCi0JICogQHNlZSBKYXhiQ2xhc3NNYXBwaW5nI2dldFN1cGVyY2xhc3MoKQotCSAqLwotCUl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRJbmNsdWRlZEF0dHJpYnV0ZXMoKTsKLQkKLQlpbnQgZ2V0SW5jbHVkZWRBdHRyaWJ1dGVzU2l6ZSgpOwotCQotCQotCS8vICoqKioqICBtaXNjIGF0dHJpYnV0ZXMgKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIGF0dHJpYnV0ZXMgdGhhdCBhcmUgZGVmaW5lZCBieSB0aGlzIGNsYXNzLiAgCi0JICogVGhpcyBpcyB0aGUgY29tYmluZWQgc2V0IG9mICNnZXRBdHRyaWJ1dGVzKCkgYW5kICNnZXRJbmNsdWRlZEF0dHJpYnV0ZXMoKQotCSAqLwotCUl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRBbGxMb2NhbGx5RGVmaW5lZEF0dHJpYnV0ZXMoKTsKLQkKLQkvKioKLQkgKiA8aT5Jbmhlcml0ZWQ8L2k+IGF0dHJpYnV0ZXMgYXJlIGFueSBhdHRyaWJ1dGVzIHRoaXMgY2xhc3MgbWFwcGluZyBoYXMgd2hvc2Ugc291cmNlCi0JICogaXMgYSBzdXBlcmNsYXNzLgotCSAqIEluaGVyaXRlZCBhdHRyaWJ1dGVzIGluY2x1ZGUgPGk+aW5jbHVkZWQ8L2k+IGF0dHJpYnV0ZXMuCi0JICovCi0JSXRlcmFibGU8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldEluaGVyaXRlZEF0dHJpYnV0ZXMoKTsKLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpZCBhdHRyaWJ1dGUgbWFwcGluZyBmb3IgdGhpcyBjbGFzcyBtYXBwaW5nLCBpZiBpdCBoYXMgb25lLgotCSAqIChXaWxsIHJldHVybiB0aGUgZmlyc3Qgb25lIGl0IGZpbmRzLCBpZiB0aGlzIGNsYXNzIGhhcyBtb3JlIHRoYW4gb25lLikKLQkgKi8KLQlKYXhiQXR0cmlidXRlTWFwcGluZyBnZXRYbWxJZE1hcHBpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YkNvbnRleHROb2RlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJDb250ZXh0Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTE4ZjAyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YkNvbnRleHROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiTm9kZTsKLQotLyoqCi0gKiBDb21tb24gcHJvdG9jb2wgZm9yIEpBWEIgb2JqZWN0cyB0aGF0IGhhdmUgYSBjb250ZXh0LCBhcyBvcHBvc2VkIHRvCi0gKiByZXNvdXJjZSBvYmplY3RzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YkNvbnRleHROb2RlCi0JCWV4dGVuZHMgSmF4Yk5vZGUgewotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcm9vdCBvZiB0aGUgY29udGV4dCBtb2RlbAotCSAqLwotCUpheGJDb250ZXh0Um9vdCBnZXRDb250ZXh0Um9vdCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgdHlwZSBvZiB0aGUgY29udGV4dCBub2RlJ3MgcmVzb3VyY2UuCi0JICovCi0JSnB0UmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpOwotCi0KLQkvLyAqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioKLQotCXZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBjb250ZXh0IG1vZGVsIHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIEpBWEIgcmVzb3VyY2UgbW9kZWwuCi0JICovCi0Jdm9pZCB1cGRhdGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiQ29udGV4dFJvb3QuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YkNvbnRleHRSb290LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMDNhMDEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiQ29udGV4dFJvb3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogUm9vdCBvZiB0aGUgSkFYQiBjb250ZXh0IG1vZGVsLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YkNvbnRleHRSb290Ci0JCWV4dGVuZHMgSmF4YkNvbnRleHROb2RlIHsKLQkKLQkvLyAqKioqKiBwYWNrYWdlcyAqKioqKgotCQotCXN0YXRpYyBTdHJpbmcgUEFDS0FHRVNfQ09MTEVDVElPTiA9ICJwYWNrYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgc2V0IG9mIHBhY2thZ2VzLiAgSW5jbHVkZXMgYW55IHBhY2thZ2Ugd2l0aCBhbnkgaW50ZXJlc3RpbmcgSkFYQiBjb250ZW50LgotCSAqLwotCUl0ZXJhYmxlPEpheGJQYWNrYWdlPiBnZXRQYWNrYWdlcygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcGFja2FnZSB3aXRoIHRoZSBnaXZlbiBuYW1lCi0JICovCi0JSmF4YlBhY2thZ2UgZ2V0UGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpOwotCQotCWludCBnZXRQYWNrYWdlc1NpemUoKTsKLQkKLQkKLQkvLyAqKioqKiBqYXhiIHR5cGVzICoqKioqCi0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVFlQRVNfQ09MTEVDVElPTiA9ICJ0eXBlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNldCBvZiBhbGwgSkFYQiB0eXBlcyB3aXRoaW4gdGhpcyBjb250ZXh0IHJvb3QuCi0JICovCi0JSXRlcmFibGU8SmF4YlR5cGU+IGdldFR5cGVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIHdpdGggdGhlIGdpdmVuIChmdWxseSBxdWFsaWZpZWQpIHR5cGUgbmFtZQotCSAqLwotCUpheGJUeXBlIGdldFR5cGUoU3RyaW5nIHR5cGVOYW1lKTsKLQkKLQlpbnQgZ2V0VHlwZXNTaXplKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXQgb2YgdHlwZXMgdGhhdCBhcmUgaW4gdGhlIGdpdmVuIHBhY2thZ2UKLQkgKi8KLQlJdGVyYWJsZTxKYXhiVHlwZT4gZ2V0VHlwZXMoSmF4YlBhY2thZ2UgamF4YlBhY2thZ2UpOwotCQotCS8qKgotCSAqIFRoZSBzZXQgb2YgamF4YiBjbGFzc2VzLiAgVGhlc2UgbWF5IGJlIGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseSBpbmNsdWRlZC4KLQkgKi8KLQlJdGVyYWJsZTxKYXhiQ2xhc3M+IGdldENsYXNzZXMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNldCBvZiBqYXhiIGNsYXNzZXMgdGhhdCBhcmUgaW4gdGhlIGdpdmVuIHBhY2thZ2UKLQkgKi8KLQlJdGVyYWJsZTxKYXhiQ2xhc3M+IGdldENsYXNzZXMoSmF4YlBhY2thZ2UgamF4YlBhY2thZ2UpOwotCQotCS8qKgotCSAqIFRoZSBzZXQgb2YgamF4YiBlbnVtcy4gIFRoZXNlIG1heSBiZSBleHBsaWNpdGx5IG9yIGltcGxpY2l0bHkgaW5jbHVkZWQuCi0JICovCi0JSXRlcmFibGU8SmF4YkVudW0+IGdldEVudW1zKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXQgb2YgamF4YiBlbnVtcyB0aGF0IGFyZSBpbiB0aGUgZ2l2ZW4gcGFja2FnZQotCSAqLwotCUl0ZXJhYmxlPEpheGJFbnVtPiBnZXRFbnVtcyhKYXhiUGFja2FnZSBqYXhiUGFja2FnZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXQgb2Yge0BsaW5rIFhtbFJlZ2lzdHJ5fShpZSlzIHRoYXQgYXJlIGluIHRoZSBnaXZlbiBwYWNrYWdlCi0JICovCi0JSXRlcmFibGU8WG1sUmVnaXN0cnk+IGdldFhtbFJlZ2lzdHJpZXMoSmF4YlBhY2thZ2UgamF4YlBhY2thZ2UpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIEpheGJUeXBlTWFwcGluZ30gZm9yIHRoZSBnaXZlbiAoZnVsbHkgcXVhbGlmaWVkKSB0eXBlIG5hbWUKLQkgKi8KLQlKYXhiVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoU3RyaW5nIHR5cGVOYW1lKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBKYXhiQ2xhc3NNYXBwaW5nfSBmb3IgdGhlIGdpdmVuIChmdWxseSBxdWFsaWZpZWQpIHR5cGUgbmFtZQotCSAqLwotCUpheGJDbGFzc01hcHBpbmcgZ2V0Q2xhc3NNYXBwaW5nKFN0cmluZyB0eXBlTmFtZSk7Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQkvKioKLQkgKiBBZGQgdmFsaWRhdGlvbiBtZXNzYWdlcyB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcik7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJFbGVtZW50RmFjdG9yeU1ldGhvZC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiRWxlbWVudEZhY3RvcnlNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzOTA3Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJFbGVtZW50RmFjdG9yeU1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBKQVhCIGVsZW1lbnQgZmFjdG9yeSBtZXRob2QgIAotICogKEEgbWV0aG9kIGluc2lkZSBhbiBvYmplY3QgZmFjdG9yeSAoQFhtbFJlZ2lzdHJ5KSB3aXRoIGFuIGV4cGxpY2l0IEBYbWxFbGVtZW50RGVjbCBhbm5vdGF0aW9uKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kCi0JCWV4dGVuZHMgSmF2YUNvbnRleHROb2RlIHsKLQkKLQlKYXZhUmVzb3VyY2VNZXRob2QgZ2V0UmVzb3VyY2VNZXRob2QoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCBuYW1lCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQkKLQkKLQkvLyAqKioqKiBzY29wZSAqKioqKgotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYbWxFbGVtZW50RGVjbCBhbm5vdGF0aW9uICdzY29wZScgZWxlbWVudAotCSAqLwotCVN0cmluZyBTQ09QRV9QUk9QRVJUWSA9ICJzY29wZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgZ2V0U2NvcGUoKTsKLQkKLQl2b2lkIHNldFNjb3BlKFN0cmluZyBzY29wZSk7Ci0JCi0JU3RyaW5nIERFRkFVTFRfU0NPUEVfQ0xBU1NfTkFNRSA9ICJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnREZWNsLkdMT0JBTCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRTY29wZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBzY29wZSBpcyBkZWZhdWx0IG9yIGlzIHNwZWNpZmllZCB0byBiZSBYbWxFbGVtZW50RGVjbC5HTE9CQUwuCi0JICovCi0JYm9vbGVhbiBpc0dsb2JhbFNjb3BlKCk7Ci0JCi0JCi0JLy8gKioqKiogcU5hbWUgKioqKioKLQkKLQlKYXhiUU5hbWUgZ2V0UU5hbWUoKTsKLQkKLQkKLQkvLyAqKioqKiBzdWJzdGl0dXRpb24gaGVhZCBxTmFtZSAqKioqKgotCQotCUpheGJRTmFtZSBnZXRTdWJzdGl0dXRpb25IZWFkUU5hbWUoKTsKLQkKLQkKLQkvLyAqKioqKiBkZWZhdWx0IHZhbHVlICoqKioqCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIFhtbEVsZW1lbnREZWNsIGFubm90YXRpb24gJ2RlZmF1bHRWYWx1ZScgZWxlbWVudAotCSAqLwotCVN0cmluZyBERUZBVUxUX1ZBTFVFX1BST1BFUlRZID0gImRlZmF1bHRWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCi0Jdm9pZCBzZXREZWZhdWx0VmFsdWUoU3RyaW5nIGRlZmF1bHRWYWx1ZSk7Ci0JCi0JU3RyaW5nIERFRkFVTFRfREVGQVVMVF9WQUxVRSA9ICJcdTAwMDAiOyAvLyROT04tTkxTLTEkCQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiRW51bS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiRW51bS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTk4YTY4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YkVudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRW51bTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIDxpPmVudW08L2k+IGluIGEgSkFYQiBjb250ZXh0LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YkVudW0KLQkJZXh0ZW5kcyBKYXhiVHlwZSB7Ci0JCi0JLy8gKioqKiogY292YXJpYW50IG92ZXJyaWRlcyAqKioqKgotCQotCUphdmFSZXNvdXJjZUVudW0gZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQotCXB1YmxpYyBKYXhiRW51bU1hcHBpbmcgZ2V0TWFwcGluZygpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiRW51bUNvbnN0YW50LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJFbnVtQ29uc3RhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0NDM5Zi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJFbnVtQ29uc3RhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRW51bUNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgSkFYQiBlbnVtIGNvbnN0YW50LiAgCi0gKiAoQSBjb25zdGFudCBpbnNpZGUgYW4gZW51bSB3aXRoIGVpdGhlciBhbiBleHBsaWNpdCBvciBpbXBsaWNpdCBAWG1sRW51bVZhbHVlIGFubm90YXRpb24pCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiRW51bUNvbnN0YW50Ci0JCWV4dGVuZHMgSmF2YUNvbnRleHROb2RlIHsKLQotCUphdmFSZXNvdXJjZUVudW1Db25zdGFudCBnZXRSZXNvdXJjZUVudW1Db25zdGFudCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBlbnVtIGNvbnN0YW50LiBUaGlzIHdpbGwgbm90IGNoYW5nZSwgYQotCSAqIG5ldyBKYXhiRW51bUNvbnN0YW50IHdpbGwgYmUgYnVpbHQgaWYgdGhlIG5hbWUgY2hhbmdlcy4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVudW0gY29uc3RhbnQncyB2YWx1ZSwgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdC4KLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgdGhlIG5hbWUgb2YgdGhlIGVudW0gY29uc3RhbnQuCi0JICogSXQgd2lsbCBiZSB1c2VkIGlmIHRoZSBYbWxFbnVtVmFsdWUgYW5ub3RhdGlvbiBpcyBudWxsLgotCSAqIEBzZWUgZ2V0TmFtZSgpCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYbWxFbnVtVmFsdWUgYW5ub3RhdGlvbiAndmFsdWUnIGVsZW1lbnQKLQkgKi8KLQlTdHJpbmcgZ2V0U3BlY2lmaWVkVmFsdWUoKTsKLQl2b2lkIHNldFNwZWNpZmllZFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfVkFMVUVfUFJPUEVSVFkgPSAic3BlY2lmaWVkVmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YkVudW1NYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJFbnVtTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDNiMWRiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YkVudW1NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi0vKioKLSAqIFJlcHJlc2VudHMgbWFwcGluZyBtZXRhZGF0YSBvbiBhbiBlbnVtIChzcGVjaWZpZWQgb3IgaW1wbGllZCkuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiRW51bU1hcHBpbmcKLQkJZXh0ZW5kcyBKYXhiVHlwZU1hcHBpbmcgewotCQotCS8vICoqKioqIFhtbEVudW0udmFsdWUgKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUgc3BlY2lmaWVkIGZvciB0aGUgWG1sRW51bS52YWx1ZSwgb3IgImphdmEubGFuZy5TdHJpbmciIGlmIHVuc3BlY2lmaWVkCi0JICovCi0JU3RyaW5nIGdldFhtbEVudW1WYWx1ZSgpOwotCQotCVN0cmluZyBTUEVDSUZJRURfWE1MX0VOVU1fVkFMVUVfUFJPUEVSVFkgPSAic3BlY2lmaWVkWG1sRW51bSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBYbWxFbnVtLnZhbHVlIGVsZW1lbnQKLQkgKi8KLQlTdHJpbmcgZ2V0U3BlY2lmaWVkWG1sRW51bVZhbHVlKCk7Ci0JCi0Jdm9pZCBzZXRTcGVjaWZpZWRYbWxFbnVtVmFsdWUoU3RyaW5nIHhtbEVudW1WYWx1ZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgWG1sRW51bS52YWx1ZSBlbGVtZW50LCB0YWtpbmcgaW50byBjb25zaWRlcmF0aW9uIGltcG9ydHMKLQkgKi8KLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRYbWxFbnVtVmFsdWUoKTsKLQkKLQlTdHJpbmcgREVGQVVMVF9YTUxfRU5VTV9WQUxVRSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCS8vICoqKioqIGVudW0gY29uc3RhbnRzICoqKioqCi0JCi0JU3RyaW5nIEVOVU1fQ09OU1RBTlRTX0NPTExFQ1RJT04gPSAiZW51bUNvbnN0YW50cyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlJdGVyYWJsZTxKYXhiRW51bUNvbnN0YW50PiBnZXRFbnVtQ29uc3RhbnRzKCk7Ci0JCi0JaW50IGdldEVudW1Db25zdGFudHNTaXplKCk7Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCVhzZFNpbXBsZVR5cGVEZWZpbml0aW9uIGdldFZhbHVlWHNkVHlwZURlZmluaXRpb24oKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YlBhY2thZ2UuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YlBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM5Y2JlOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YlBhY2thZ2UKLQkJZXh0ZW5kcyBKYXhiQ29udGV4dE5vZGUgewotCQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogVGhpcyBpcyB1bmNoYW5naW5nIGluIHRoYXQsIGlmIGEgcGFja2FnZSBuYW1lIGNoYW5nZXMsIGEgbmV3IEpheGJQYWNrYWdlIGlzIGNyZWF0ZWQuCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQkKLQkvKioKLQkgKiBUaGUgb3B0aW9uYWwgcGFja2FnZS1pbmZvCi0JICovCi0JSmF4YlBhY2thZ2VJbmZvIGdldFBhY2thZ2VJbmZvKCk7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFDS0FHRV9JTkZPX1BST1BFUlRZID0gInBhY2thZ2UtaW5mbyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWVzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWNrYWdlLCBkZWZhdWx0IG9yIHNwZWNpZmllZAotCSAqLwotCVN0cmluZyBnZXROYW1lc3BhY2UoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBmb3JtIGRlZmF1bHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFja2FnZQotCSAqLwotCVhtbE5zRm9ybSBnZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudCBmb3JtIGRlZmF1bHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFja2FnZQotCSAqLwotCVhtbE5zRm9ybSBnZXRFbGVtZW50Rm9ybURlZmF1bHQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIHBhY2thZ2UgaGFzIG5vIHVzZWZ1bCBpbmZvcm1hdGlvbi4KLQkgKiBVc2VmdWwgaW5mb3JtYXRpb24gaW5jbHVkZXM6Ci0JICogCS0gYW5ub3RhdGVkIHBhY2thZ2UtaW5mby5qYXZhCi0JICogIC0gamF4Yi5pbmRleAotCSAqICAtIG9iamVjdCBmYWN0b3J5Ci0JICovCi0JYm9vbGVhbiBpc0VtcHR5KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgWG1sUmVnaXN0cnl9IGZvciB0aGlzIHBhY2thZ2UgaWYgdGhlcmUgaXMgb25lLgotCSAqIFJldHVybiAqb25lKiBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSAod2hpY2ggaXMgYW4gZXJyb3IgY2FzZSBhdCBhbnkgcmF0ZSkKLQkgKi8KLQlYbWxSZWdpc3RyeSBnZXRSZWdpc3RyeSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFhzZFNjaGVtYX0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFja2FnZSwgaWYgdGhlcmUgaXMgb25lLCBudWxsIG90aGVyd2lzZQotCSAqLwotCVhzZFNjaGVtYSBnZXRYc2RTY2hlbWEoKTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBBZGQgdmFsaWRhdGlvbiBtZXNzYWdlcyB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcik7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJQYWNrYWdlSW5mby5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiUGFja2FnZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYyYzk1NC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJQYWNrYWdlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YlBhY2thZ2VJbmZvCi0JCWV4dGVuZHMgSmF2YUNvbnRleHROb2RlLCBYbWxBY2Nlc3NUeXBlSG9sZGVyLCBYbWxBY2Nlc3NPcmRlckhvbGRlciB7Ci0JCi0JSmF2YVJlc291cmNlUGFja2FnZSBnZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQkKLQlKYXhiUGFja2FnZSBnZXRKYXhiUGFja2FnZSgpOwotCQotCQotCS8vICoqKioqIFhtbFNjaGVtYSAqKioqKgotCQotCS8qKgotCSAqIFJldHVybiB0aGUgWE1MIHNjaGVtYSBmb3IgdGhpcyBwYWNrYWdlIGluZm8sIHRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQlYbWxTY2hlbWEgZ2V0WG1sU2NoZW1hKCk7Ci0JCi0JCi0JLy8gKioqKiogWG1sU2NoZW1hVHlwZXMgKioqKioKLQkKLQlTdHJpbmcgWE1MX1NDSEVNQV9UWVBFU19MSVNUID0gInhtbFNjaGVtYVR5cGVzIjsgLy8kTk9OLU5MUy0xJAotCQotCUxpc3RJdGVyYWJsZTxYbWxTY2hlbWFUeXBlPiBnZXRYbWxTY2hlbWFUeXBlcygpOwotCQotCWludCBnZXRYbWxTY2hlbWFUeXBlc1NpemUoKTsKLQkKLQlYbWxTY2hlbWFUeXBlIGFkZFhtbFNjaGVtYVR5cGUoaW50IGluZGV4KTsKLQkKLQl2b2lkIHJlbW92ZVhtbFNjaGVtYVR5cGUoaW50IGluZGV4KTsKLQkKLQl2b2lkIHJlbW92ZVhtbFNjaGVtYVR5cGUoWG1sU2NoZW1hVHlwZSB4bWxTY2hlbWFUeXBlKTsKLQkKLQl2b2lkIG1vdmVYbWxTY2hlbWFUeXBlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkJCi0JCi0JLy8gKioqKiogWG1sSmF2YVR5cGVBZGFwdGVycyAqKioqKioKLQkKLQlTdHJpbmcgWE1MX0pBVkFfVFlQRV9BREFQVEVSU19MSVNUID0gInhtbEphdmFUeXBlQWRhcHRlcnMiOyAvLyROT04tTkxTLTEkCi0JCi0JTGlzdEl0ZXJhYmxlPFhtbEphdmFUeXBlQWRhcHRlcj4gZ2V0WG1sSmF2YVR5cGVBZGFwdGVycygpOwotCQotCWludCBnZXRYbWxKYXZhVHlwZUFkYXB0ZXJzU2l6ZSgpOwotCQotCVhtbEphdmFUeXBlQWRhcHRlciBhZGRYbWxKYXZhVHlwZUFkYXB0ZXIoaW50IGluZGV4KTsKLQkKLQl2b2lkIHJlbW92ZVhtbEphdmFUeXBlQWRhcHRlcihpbnQgaW5kZXgpOwotCQotCXZvaWQgcmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKFhtbEphdmFUeXBlQWRhcHRlciB4bWxKYXZhVHlwZUFkYXB0ZXIpOwotCQotCXZvaWQgbW92ZVhtbEphdmFUeXBlQWRhcHRlcihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCi0JLyoqCi0JICogcmV0dXJuIGFuIHtAbGluayBYbWxKYXZhVHlwZUFkYXB0ZXJ9IGZvciB0aGUgZ2l2ZW4gYm91bmQgdHlwZSBuYW1lLCBpZiBvbmUgZXhpc3RzCi0JICovCi0JWG1sSmF2YVR5cGVBZGFwdGVyIGdldFhtbEphdmFUeXBlQWRhcHRlcihTdHJpbmcgYm91bmRUeXBlTmFtZSk7Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCVN0cmluZyBnZXROYW1lc3BhY2VGb3JQcmVmaXgoU3RyaW5nIHByZWZpeCk7Ci0JCi0JU3RyaW5nIGdldFByZWZpeEZvck5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKTsKLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JLyoqCi0JICogQWRkIHZhbGlkYXRpb24gbWVzc2FnZXMgdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcik7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MzIxYTUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgSkFYQiBhdHRyaWJ1dGUgKGZpZWxkL3Byb3BlcnR5KS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpheGJQZXJzaXN0ZW50QXR0cmlidXRlCi0JCWV4dGVuZHMgSmF2YUNvbnRleHROb2RlIHsKLQkKLQlKYXhiQ2xhc3NNYXBwaW5nIGdldENsYXNzTWFwcGluZygpOwotCQotCQotCS8vICoqKioqIGRlY2xhcmluZyBjbGFzcy8gaW5oZXJpdGFuY2UgKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIHR5cGUgd2hlcmUgdGhlIHNvdXJjZSBvZiB0aGUgYXR0cmlidXRlIGlzIGRlY2xhcmVkLgotCSAqIFRoaXMgbWF5IG5vdCBiZSB3aGVyZSB0aGUgYXR0cmlidXRlIGlzIGZ1bGx5IGRlZmluZWQsIGFzIGl0IG1heSBiZSBpbmhlcml0ZWQKLQkgKi8KLQlKYXZhUmVzb3VyY2VUeXBlIGdldERlY2xhcmluZ0phdmFSZXNvdXJjZVR5cGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc291cmNlIG9mIHRoZSBhdHRyaWJ1dGUgaXMgZGVmaW5lZCBpbiBhIHN1cGVyY2xhc3MKLQkgKi8KLQlib29sZWFuIGlzSW5oZXJpdGVkKCk7Ci0JCi0JCi0JLy8gKioqKiogbmFtZSAqKioqKgotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiBUaGlzIHdpbGwgbm90IGNoYW5nZSwgYQotCSAqIG5ldyBKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSB3aWxsIGJlIGJ1aWx0IGlmIHRoZSBuYW1lIGNoYW5nZXMuCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQkKLQkKLQkvLyAqKioqKiByZXNvdXJjZSBhdHRyaWJ1dGUgKioqKioKLQkKLQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIG5hbWUgb2YgdGhlIGphdmEgYXR0cmlidXRlLCBvciB0aGUgaXRlbSB0eXBlIG5hbWUgb2YgYSBjb2xsZWN0aW9uIG9yIGFycmF5LgotCSAqLwotCVN0cmluZyBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGVCYXNlVHlwZU5hbWUoKTsKLQkKLQkvKioKLQkgKiAoU2VlIEpBWEIgMi4yIFNwZWMsIHNlY3QuIDUuNS4yKQotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBqYXZhIGF0dHJpYnV0ZSB0eXBlIGlzIGFuIGV4dGVuc2lvbiBvZiBqYXZhLnV0aWwuQ29sbGVjdGlvbiBvciBhIHNpbmdsZSAKLQkgKiBkaW1lbnNpb25hbCBhcnJheSAoZXhjZXB0IGZvciBieXRlW10sIHdoaWNoIGlzIHRyZWF0ZWQgbGlrZSBhIG5vbi1hcnJheSkKLQkgKi8KLQlib29sZWFuIGlzSmF2YVJlc291cmNlQXR0cmlidXRlQ29sbGVjdGlvblR5cGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgamF2YSByZXNvdXJjZSBhdHRyaWJ1dGUgdHlwZSBpcyBhIHN1YnR5cGUgb2YgdGhlIGdpdmVuIHR5cGUKLQkgKiBUaGlzIG1pZ2h0IG5vdCByZXR1cm4gdGhlIHNhbWUgdGhpbmcgYXMgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkudHlwZUlzU3ViVHlwZU9mKFN0cmluZykuCi0JICovCi0JYm9vbGVhbiBpc0phdmFSZXNvdXJjZUF0dHJpYnV0ZVR5cGVTdWJUeXBlT2YoU3RyaW5nIHR5cGVOYW1lKTsKLQkKLQlib29sZWFuIGlzRm9yKEphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQpOwotCQotCWJvb2xlYW4gaXNGb3IoSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlR2V0dGVyLCBKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VTZXR0ZXIpOwotCQotCQotCS8vICoqKioqKioqKiogbWFwcGluZyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhdHRyaWJ1dGUncyBtYXBwaW5nLiBUaGlzIGlzIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogKGFsdGhvdWdoLCBpdCBtYXkgYmUgYSA8ZW0+bnVsbDwvZW0+IG1hcHBpbmcpLgotCSAqIFNldCB0aGUgbWFwcGluZyB2aWEge0BsaW5rIFBlcnNpc3RlbnRBdHRyaWJ1dGUjc2V0TWFwcGluZ0tleShTdHJpbmcpfS4KLQkgKi8KLQlKYXhiQXR0cmlidXRlTWFwcGluZyBnZXRNYXBwaW5nKCk7Ci0JCVN0cmluZyBNQVBQSU5HX1BST1BFUlRZID0gIm1hcHBpbmciOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhdHRyaWJ1dGUncyBtYXBwaW5nIGtleS4KLQkgKi8KLQlTdHJpbmcgZ2V0TWFwcGluZ0tleSgpOwotCQotCS8qKgotCSAqIFNldCB0aGUgYXR0cmlidXRlJ3MgbWFwcGluZy4KLQkgKiBJZiB0aGUgc3BlY2lmaWVkIGtleSBpcyA8Y29kZT5udWxsPC9jb2RlPiwgY2xlYXIgdGhlIHNwZWNpZmllZCBtYXBwaW5nLAotCSAqIGFsbG93aW5nIHRoZSBhdHRyaWJ1dGUncyBtYXBwaW5nIHRvIGRlZmF1bHQgKGlmIGFwcHJvcHJpYXRlKS4KLQkgKiBSZXR1cm4gdGhlIG5ldyBtYXBwaW5nICh3aGljaCBtYXkgYmUgYSA8ZW0+bnVsbDwvZW0+IG1hcHBpbmcpLgotCSAqLwotCUpheGJBdHRyaWJ1dGVNYXBwaW5nIHNldE1hcHBpbmdLZXkoU3RyaW5nIGtleSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBrZXkgZm9yIHRoZSBhdHRyaWJ1dGUncyBkZWZhdWx0IG1hcHBpbmcuCi0JICogVGhpcyBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gKGUuZy4gZm9yIDxlbT5zcGVjaWZpZWQ8L2VtPgotCSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGF0dHJpYnV0ZXMpLgotCSAqIEBzZWUgSmF4YkF0dHJpYnV0ZU1hcHBpbmcjaXNEZWZhdWx0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKTsKLQkJU3RyaW5nIERFRkFVTFRfTUFQUElOR19LRVlfUFJPUEVSVFkgPSAiZGVmYXVsdE1hcHBpbmdLZXkiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJRTmFtZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiUU5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmNDE3OC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJRTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci0KLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgbmFtZXNwYWNlLCBuYW1lIHBhaXJpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuPwotICogQHNpbmNlIDMuPyAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiUU5hbWUKLQkJZXh0ZW5kcyBKYXZhQ29udGV4dE5vZGUgewotCQotCS8vICoqKioqIG5hbWVzcGFjZSAqKioqKgotCQotCXN0YXRpYyBTdHJpbmcgU1BFQ0lGSUVEX05BTUVTUEFDRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWROYW1lc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIGdldE5hbWVzcGFjZSgpOwotCQotCVN0cmluZyBnZXREZWZhdWx0TmFtZXNwYWNlKCk7Ci0JCi0JU3RyaW5nIGdldFNwZWNpZmllZE5hbWVzcGFjZSgpOwotCQotCXZvaWQgc2V0U3BlY2lmaWVkTmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpOwotCQotCQotCS8vICoqKioqIG5hbWUgKioqKioKLQkKLQlzdGF0aWMgU3RyaW5nIFNQRUNJRklFRF9OQU1FX1BST1BFUlRZID0gInNwZWNpZmllZE5hbWUiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIGdldE5hbWUoKTsKLQkKLQlTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKTsKLQkKLQlTdHJpbmcgZ2V0U3BlY2lmaWVkTmFtZSgpOwotCQotCXZvaWQgc2V0U3BlY2lmaWVkTmFtZShTdHJpbmcgbmFtZSk7Ci0JCi0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCQotCVRleHRSYW5nZSBnZXROYW1lc3BhY2VUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YlR5cGUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU2YmVmOS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGphdmEgY2xhc3MgKG9yIGVudW0gb3IgaW50ZXJmYWNlKSB3aXRoIEpBWEIgbWV0YWRhdGEgKHNwZWNpZmllZCBvciBpbXBsaWVkKS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpheGJUeXBlCi0JCWV4dGVuZHMgSmF2YUNvbnRleHROb2RlLCBYbWxBZGFwdGFibGUgewotCQotCS8vICoqKioqIGtpbmQgKioqKioKLQkKLQlLaW5kIGdldEtpbmQoKTsKLQkKLQkKLQkvLyAqKioqKiB0eXBlIG1hcHBpbmcgKioqKioKLQkKLQlmaW5hbCBTdHJpbmcgTUFQUElOR19QUk9QRVJUWSA9ICJtYXBwaW5nIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1hcHBpbmcgb2YgdGhpcyB0eXBlLiAgCi0JICogTWF5IGJlIG51bGwuCi0JICogV2lsbCA8Yj5ub3Q8L2I+IGJlIG51bGwgaWYgdGhpcyB0eXBlIGhhcyBhbiBYbWxUeXBlIGFubm90YXRpb24gKG9yIG90aGVyIG1hcHBpbmcgYW5ub3RhdGlvbikKLQkgKiBvciBpZiB0aGlzIHR5cGUgaXMgZGVmYXVsdCBtYXBwZWQuCi0JICovCi0JSmF4YlR5cGVNYXBwaW5nIGdldE1hcHBpbmcoKTsKLQkKLQkKLQkvLyAqKioqKiBkZWZhdWx0IG1hcHBlZCAqKioqKgotCQotCWZpbmFsIFN0cmluZyBERUZBVUxUX01BUFBFRF9QUk9QRVJUWSA9ICJkZWZhdWx0TWFwcGVkIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHR5cGUgaXMgbWFwcGVkIGJ5IHJlZmVyZW5jZS4KLQkgKiAoSWYgdGhpcyB0eXBlIGhhcyBhIGRlZmF1bHQgbWFwcGluZyBieSB2aXJ0dWUgb2YgaXQgYmVpbmcgcmVmZXJlbmNlZCBieSBhbm90aGVyIG1hcHBlZCB0eXBlLikKLQkgKi8KLQlib29sZWFuIGlzRGVmYXVsdE1hcHBlZCgpOwotCQotCS8qKgotCSAqIFNldCB0aGlzIHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgdHlwZSBpcyByZWZlcmVuY2VkIGJ5IGFub3RoZXIgbWFwcGVkIHR5cGUuCi0JICogKE5COiAgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHtAbGluayBKYXhiQ29udGV4dFJvb3R9IG9iamVjdC4pCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0TWFwcGVkKGJvb2xlYW4gbmV3VmFsdWUpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgYXNzb2NpYXRlZCBqYXZhIHJlc291cmNlIHR5cGUKLQkgKi8KLQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdHlwZSB3aXRob3V0IGFueSBwYWNrYWdlIG9yIHR5cGUgcXVhbGlmaWVycwotCSAqLwotCVN0cmluZyBnZXRTaW1wbGVOYW1lKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZS1xdWFsaWZpZWQgbmFtZSBvZiB0aGlzIHR5cGUsIGluY2x1ZGluZyBxdWFsaWZpY2F0aW9uIGZvciBhbnkgCi0JICogZW5jbG9zaW5nIHR5cGVzLCBidXQgbm90IGluY2x1ZGluZyBwYWNrYWdlIHF1YWxpZmljYXRpb24uCi0JICovCi0JU3RyaW5nIGdldFR5cGVRdWFsaWZpZWROYW1lKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhpcyB0eXBlLCBpbmNsdWRpbmcgcXVhbGlmaWNhdGlvbiBmb3IgYW55IAotCSAqIGVuY2xvc2luZyB0eXBlcyBhbmQgcGFja2FnZXMuCi0JICovCi0JU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdHlwZSdzIHBhY2thZ2UuICBFbXB0eSBzdHJpbmcgaWYgbm9uZS4KLQkgKi8KLQlTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBKYXhiUGFja2FnZX0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHlwZQotCSAqIChOQjogIG1heSBiZSBudWxsIGluIHNvbWUgcGFydGlhbGx5IGJ1aWx0IGNhc2VzKQotCSAqLwotCUpheGJQYWNrYWdlIGdldEpheGJQYWNrYWdlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgSmF4YlBhY2thZ2VJbmZvfSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0eXBlLCBpZiBpdCBleGlzdHMKLQkgKi8KLQlKYXhiUGFja2FnZUluZm8gZ2V0SmF4YlBhY2thZ2VJbmZvKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCBkaXJlY3RseSByZWZlcmVuY2VkIHR5cGVzLCBmdWxseSBxdWFsaWZpZWQuCi0JICogKFVzZWQgZm9yIGNvbnN0cnVjdGluZyBKYXhiIGNvbnRleHQpCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCk7Ci0JCi0JCi0JLy8gKioqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQkvKioKLQkgKiBBZGQgdG8gdGhlIGxpc3Qgb2YgY3VycmVudCB2YWxpZGF0aW9uIG1lc3NhZ2VzCi0JICovCi0Jdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKTsKLQkKLQkKLQlwdWJsaWMgZW51bSBLaW5kIHsKLQkJCi0JCS8qKgotCQkgKiB7QGxpbmsgSmF4YlR5cGV9cyBvZiB7QGxpbmsgS2luZH0gQ0xBU1MgbWF5IHNhZmVseSBiZSBjYXN0IGFzIHtAbGluayBKYXhiQ2xhc3N9Ci0JCSAqLwotCQlDTEFTUywKLQkJCi0JCS8qKgotCQkgKiB7QGxpbmsgSmF4YlR5cGV9cyBvZiB7QGxpbmsgS2luZH0gRU5VTSBtYXkgc2FmZWx5IGJlIGNhc3QgYXMge0BsaW5rIEpheGJFbnVtfQotCQkgKi8KLQkJRU5VTTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJUeXBlTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiVHlwZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFhNDExMC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJUeXBlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVHlwZURlZmluaXRpb247Ci0KLS8qKgotICogUmVwcmVzZW50cyBtYXBwaW5nIG1ldGFkYXRhIG9uIGEgSmF4YlR5cGUgKHNwZWNpZmllZCBvciBpbXBsaWVkKS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpheGJUeXBlTWFwcGluZyAKLQkJZXh0ZW5kcyBKYXZhQ29udGV4dE5vZGUgewotCQotCS8vICoqKioqIEpheGJUeXBlICoqKioqCi0JCi0JSmF4YlR5cGUgZ2V0SmF4YlR5cGUoKTsKLQkKLQkKLQkvLyAqKioqKiBYbWxUcmFuc2llbnQgKioqKioKLQkKLQlTdHJpbmcgWE1MX1RSQU5TSUVOVF9QUk9QRVJUWSA9ICJ4bWxUcmFuc2llbnQiOyAgLy8kTk9OLU5MUy0xJAotCQotCWJvb2xlYW4gaXNYbWxUcmFuc2llbnQoKTsKLQkKLQl2b2lkIHNldFhtbFRyYW5zaWVudChib29sZWFuIG5ld1ZhbHVlKTsKLQkKLQkKLQkvLyAqKioqKiBYbWxUeXBlLm5hbWUgYW5kIFhtbFR5cGUubmFtZXNwYWNlICoqKioqCi0JCi0JSmF4YlFOYW1lIGdldFFOYW1lKCk7Ci0JCi0JCi0JLy8gKioqKiogWG1sUm9vdEVsZW1lbnQgKioqKioKLQkKLQlTdHJpbmcgWE1MX1JPT1RfRUxFTUVOVF9QUk9QRVJUWSA9ICJ4bWxSb290RWxlbWVudCI7ICAvLyROT04tTkxTLTEkCi0JCi0JWG1sUm9vdEVsZW1lbnQgZ2V0WG1sUm9vdEVsZW1lbnQoKTsKLQkKLQlYbWxSb290RWxlbWVudCBhZGRYbWxSb290RWxlbWVudCgpOwotCQotCXZvaWQgcmVtb3ZlWG1sUm9vdEVsZW1lbnQoKTsKLQkKLQkKLQkvLyAqKioqKiBYbWxTZWVBbHNvICoqKioqCi0JCi0JU3RyaW5nIFhNTF9TRUVfQUxTT19QUk9QRVJUWSA9ICJ4bWxTZWVBbHNvIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlYbWxTZWVBbHNvIGdldFhtbFNlZUFsc28oKTsKLQkKLQlYbWxTZWVBbHNvIGFkZFhtbFNlZUFsc28oKTsKLQkKLQl2b2lkIHJlbW92ZVhtbFNlZUFsc28oKTsKLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCBkaXJlY3RseSByZWZlcmVuY2VkIHR5cGVzLCBmdWxseSBxdWFsaWZpZWQuCi0JICogKFVzZWQgZm9yIGNvbnN0cnVjdGluZyBKYXhiIGNvbnRleHQpCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCk7Ci0JCi0JWHNkVHlwZURlZmluaXRpb24gZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGNsYXNzIG9yIGEgc3ViY2xhc3MgKGlmIGl0IGNhbiBoYXZlIHN1YmNsYXNzZXMpIGhhcyBhIHJvb3QgZWxlbWVudCBkZWZpbmVkCi0JICovCi0JYm9vbGVhbiBoYXNSb290RWxlbWVudEluSGllcmFyY2h5KCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFjY2Vzc09yZGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFjY2Vzc09yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjM2E4ODcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBY2Nlc3NPcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogQWNjZXNzIE9yZGVyCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGVudW0gWG1sQWNjZXNzT3JkZXIgewotCi0JQUxQSEFCRVRJQ0FMKAotCQlvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzT3JkZXIuQUxQSEFCRVRJQ0FMCi0JCSksCi0JVU5ERUZJTkVEKAotCQlvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzT3JkZXIuVU5ERUZJTkVECi0JCSk7Ci0KLQotCXByaXZhdGUgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc09yZGVyIGphdmFBY2Nlc3NPcmRlcjsKLQotCVhtbEFjY2Vzc09yZGVyKG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NPcmRlciBqYXZhQWNjZXNzT3JkZXIpIHsKLQkJaWYgKGphdmFBY2Nlc3NPcmRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFBY2Nlc3NPcmRlciA9IGphdmFBY2Nlc3NPcmRlcjsKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc09yZGVyIGdldEphdmFBY2Nlc3NPcmRlcigpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUFjY2Vzc09yZGVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFhtbEFjY2Vzc09yZGVyIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzT3JkZXIgamF2YUFjY2Vzc09yZGVyKSB7Ci0JCXJldHVybiAoamF2YUFjY2Vzc09yZGVyID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhUmVzb3VyY2VNb2RlbF8oamF2YUFjY2Vzc09yZGVyKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBYbWxBY2Nlc3NPcmRlciBmcm9tSmF2YVJlc291cmNlTW9kZWxfKG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NPcmRlciBqYXZhQWNjZXNzT3JkZXIpIHsKLQkJZm9yIChYbWxBY2Nlc3NPcmRlciBhY2Nlc3NPcmRlciA6IFhtbEFjY2Vzc09yZGVyLnZhbHVlcygpKSB7Ci0JCQlpZiAoYWNjZXNzT3JkZXIuZ2V0SmF2YUFjY2Vzc09yZGVyKCkgPT0gamF2YUFjY2Vzc09yZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2Vzc09yZGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc09yZGVyIHRvSmF2YVJlc291cmNlTW9kZWwoWG1sQWNjZXNzT3JkZXIgYWNjZXNzT3JkZXIpIHsKLQkJcmV0dXJuIChhY2Nlc3NPcmRlciA9PSBudWxsKSA/IG51bGwgOiBhY2Nlc3NPcmRlci5nZXRKYXZhQWNjZXNzT3JkZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFjY2Vzc09yZGVySG9sZGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFjY2Vzc09yZGVySG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYTVlYWUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBY2Nlc3NPcmRlckhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQWNjZXNzT3JkZXJIb2xkZXIKLQkJZXh0ZW5kcyBKYXhiQ29udGV4dE5vZGUgewotCQotCS8qKgotCSAqIFJldHVybiB0aGUgYWNjZXNzIG9yZGVyLCB3aGV0aGVyIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQuCi0JICogVGhpcyBzaG91bGQgbmV2ZXIgcmV0dXJuIG51bGwgc2luY2UgYXQgbGVhc3QgdGhlIGRlZmF1bHQgd2lsbCBiZSBzZXQKLQkgKi8KLQlYbWxBY2Nlc3NPcmRlciBnZXRBY2Nlc3NPcmRlcigpOwotCQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgZGVmYXVsdCBhY2Nlc3Mgb3JkZXIKLQkgKi8KLQlTdHJpbmcgREVGQVVMVF9BQ0NFU1NfT1JERVJfUFJPUEVSVFkgPSAiZGVmYXVsdEFjY2Vzc09yZGVyIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBhY2Nlc3Mgb3JkZXIsIG5ldmVyIG51bGwKLQkgKi8KLQlYbWxBY2Nlc3NPcmRlciBnZXREZWZhdWx0QWNjZXNzT3JkZXIoKTsKLQkKLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHNwZWNpZmllZCBhY2Nlc3Mgb3JkZXIKLQkgKi8KLQlTdHJpbmcgU1BFQ0lGSUVEX0FDQ0VTU19PUkRFUl9QUk9QRVJUWSA9ICJzcGVjaWZpZWRBY2Nlc3NPcmRlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBhY2Nlc3Mgb3JkZXI7Ci0JICovCi0JWG1sQWNjZXNzT3JkZXIgZ2V0U3BlY2lmaWVkQWNjZXNzT3JkZXIoKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIHNwZWNpZmllZCBhY2Nlc3Mgb3JkZXIuCi0JICovCi0Jdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3NPcmRlcihYbWxBY2Nlc3NPcmRlciBuZXdTcGVjaWZpZWRBY2Nlc3NPcmRlcik7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFjY2Vzc1R5cGUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sQWNjZXNzVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmM4ZmQ2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sQWNjZXNzVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogQWNjZXNzIFR5cGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgZW51bSBYbWxBY2Nlc3NUeXBlIHsKLQotCUZJRUxEKAotCQlvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzVHlwZS5GSUVMRAotCQkpLAotCU5PTkUoCi0JCW9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NUeXBlLk5PTkUKLQkJKSwKLQlQUk9QRVJUWSgKLQkJb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkKLQkJKSwKLQlQVUJMSUNfTUVNQkVSKAotCQlvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSCi0JCSk7Ci0KLQotCXByaXZhdGUgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc1R5cGUgamF2YUFjY2Vzc1R5cGU7Ci0KLQlYbWxBY2Nlc3NUeXBlKG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NUeXBlIGphdmFBY2Nlc3NUeXBlKSB7Ci0JCWlmIChqYXZhQWNjZXNzVHlwZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFBY2Nlc3NUeXBlID0gamF2YUFjY2Vzc1R5cGU7Ci0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NUeXBlIGdldEphdmFBY2Nlc3NUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhQWNjZXNzVHlwZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBYbWxBY2Nlc3NUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzVHlwZSBqYXZhQWNjZXNzVHlwZSkgewotCQlyZXR1cm4gKGphdmFBY2Nlc3NUeXBlID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhUmVzb3VyY2VNb2RlbF8oamF2YUFjY2Vzc1R5cGUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFhtbEFjY2Vzc1R5cGUgZnJvbUphdmFSZXNvdXJjZU1vZGVsXyhvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzVHlwZSBqYXZhQWNjZXNzVHlwZSkgewotCQlmb3IgKFhtbEFjY2Vzc1R5cGUgYWNjZXNzVHlwZSA6IFhtbEFjY2Vzc1R5cGUudmFsdWVzKCkpIHsKLQkJCWlmIChhY2Nlc3NUeXBlLmdldEphdmFBY2Nlc3NUeXBlKCkgPT0gamF2YUFjY2Vzc1R5cGUpIHsKLQkJCQlyZXR1cm4gYWNjZXNzVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NUeXBlIHRvSmF2YVJlc291cmNlTW9kZWwoWG1sQWNjZXNzVHlwZSBhY2Nlc3NUeXBlKSB7Ci0JCXJldHVybiAoYWNjZXNzVHlwZSA9PSBudWxsKSA/IG51bGwgOiBhY2Nlc3NUeXBlLmdldEphdmFBY2Nlc3NUeXBlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBY2Nlc3NUeXBlSG9sZGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFjY2Vzc1R5cGVIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE1NjI2NS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFjY2Vzc1R5cGVIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEFjY2Vzc1R5cGVIb2xkZXIKLQkJZXh0ZW5kcyBKYXhiQ29udGV4dE5vZGUgewotCQotCS8qKgotCSAqIFJldHVybiB0aGUgYWNjZXNzIHR5cGUsIHdoZXRoZXIgc3BlY2lmaWVkIG9yIGRlZmF1bHRlZC4KLQkgKiBUaGlzIHNob3VsZCBuZXZlciByZXR1cm4gbnVsbCBzaW5jZSBhdCBsZWFzdCB0aGUgZGVmYXVsdCB3aWxsIGJlIHNldAotCSAqLwotCVhtbEFjY2Vzc1R5cGUgZ2V0QWNjZXNzVHlwZSgpOwotCQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgZGVmYXVsdCBhY2Nlc3MgdHlwZQotCSAqLwotCVN0cmluZyBERUZBVUxUX0FDQ0VTU19UWVBFX1BST1BFUlRZID0gImRlZmF1bHRBY2Nlc3NUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBhY2Nlc3MgdHlwZSwgbmV2ZXIgbnVsbAotCSAqLwotCVhtbEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdEFjY2Vzc1R5cGUoKTsKLQkKLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHNwZWNpZmllZCBhY2Nlc3MgdHlwZQotCSAqLwotCVN0cmluZyBTUEVDSUZJRURfQUNDRVNTX1RZUEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkQWNjZXNzVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBhY2Nlc3MgdHlwZTsKLQkgKi8KLQlYbWxBY2Nlc3NUeXBlIGdldFNwZWNpZmllZEFjY2Vzc1R5cGUoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgc3BlY2lmaWVkIGFjY2VzcyB0eXBlLgotCSAqLwotCXZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzVHlwZShYbWxBY2Nlc3NUeXBlIG5ld1NwZWNpZmllZEFjY2Vzc1R5cGUpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBZGFwdGFibGUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sQWRhcHRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1OTdiNDguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBZGFwdGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEFkYXB0YWJsZQotCQlleHRlbmRzIEphdmFDb250ZXh0Tm9kZSB7Ci0JCi0JLy8gKioqKiogWG1sSmF2YVR5cGVBZGFwdGVyICoqKioqCi0JCi0JU3RyaW5nIFhNTF9KQVZBX1RZUEVfQURBUFRFUl9QUk9QRVJUWSA9ICJ4bWxKYXZhVHlwZUFkYXB0ZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JWG1sSmF2YVR5cGVBZGFwdGVyIGdldFhtbEphdmFUeXBlQWRhcHRlcigpOwotCQotCVhtbEphdmFUeXBlQWRhcHRlciBhZGRYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkKLQl2b2lkIHJlbW92ZVhtbEphdmFUeXBlQWRhcHRlcigpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBZGFwdGFibGVNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFkYXB0YWJsZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JhODlkNi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFkYXB0YWJsZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gYXR0cmlidXRlIG1hcHBpbmcgdGhhdCBtYXkgYWxzbyBoYXZlIGFuIFhtbEphdmFUeXBlQWRhcHRlcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQWRhcHRhYmxlTWFwcGluZwotCQlleHRlbmRzIFhtbEFkYXB0YWJsZSB7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGVpdGhlciB0aGUge0BsaW5rIFhtbEFkYXB0ZXJ9IGRlZmluZWQgaGVyZSBvciBhbnkgWG1sQWRhcHRlciBkZWZpbmVkIGF0IGEgaGlnaGVyIGxldmVsCi0JICogdGhhdCBhbHNvIGFwcGxpZXMgaGVyZS4KLQkgKi8KLQlYbWxBZGFwdGVyIGdldFhtbEFkYXB0ZXIoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sQWRhcHRlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZmMxNDQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGphdmEgY2xhc3MgdXNlZCBhcyBhbiBYbWxBZGFwdGVyCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxBZGFwdGVyIAotCQlleHRlbmRzIEpheGJDb250ZXh0Tm9kZSB7Ci0JCi0Jc3RhdGljIFN0cmluZyBNQVJTSEFMX01FVEhPRF9OQU1FID0gIm1hcnNoYWwiOyAgLy8kTk9OLU5MUy0xJAotCQotCQotCS8vICoqKioqIGJvdW5kIHR5cGUgKioqKioKLQkKLQkvKioKLQkgKiBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlICJib3VuZFR5cGUiIHByb3BlcnR5Ci0JICovCi0Jc3RhdGljIFN0cmluZyBCT1VORF9UWVBFX1BST1BFUlRZID0gImJvdW5kVHlwZSI7ICAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxseSBxdWFsaWZpZWQgYm91bmQgdHlwZSBuYW1lICh0aGUgdHlwZSB1c2VkIGluIHRoZSBqYXZhIG1vZGVsKQotCSAqLwotCVN0cmluZyBnZXRCb3VuZFR5cGUoKTsKLQkKLQkKLQkvLyAqKioqKiB2YWx1ZSB0eXBlICoqKioqCi0JCi0JLyoqCi0JICogU3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSAidmFsdWVUeXBlIiBwcm9wZXJ0eQotCSAqLwotCXN0YXRpYyBTdHJpbmcgVkFMVUVfVFlQRV9QUk9QRVJUWSA9ICJ2YWx1ZVR5cGUiOyAgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIHZhbHVlIHR5cGUgbmFtZSAodGhlIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgeG1sIHNjaGVtYSkKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWVUeXBlKCk7Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCUphdmFSZXNvdXJjZVR5cGUgZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBbnlBdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFueUF0dHJpYnV0ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDExOGIwNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFueUF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgSkFYQiB4bWwgYW55IGF0dHJpYnV0ZSBtYXBwaW5nIChAWG1sQW55QXR0cmlidXRlKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQW55QXR0cmlidXRlTWFwcGluZwotCQlleHRlbmRzIEpheGJBdHRyaWJ1dGVNYXBwaW5nLCBYbWxBZGFwdGFibGVNYXBwaW5nIHsJCi0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sQW55RWxlbWVudE1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sQW55RWxlbWVudE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU2OTViMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFueUVsZW1lbnRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi0KLS8qKgotICogUmVwcmVzZW50cyBhIEpBWEIgeG1sIGFueSBlbGVtZW50IG1hcHBpbmcgKEBYbWxBbnlFbGVtZW50KQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQW55RWxlbWVudE1hcHBpbmcKLQkJZXh0ZW5kcyBKYXhiQXR0cmlidXRlTWFwcGluZywgWG1sQWRhcHRhYmxlTWFwcGluZyB7CQotCQotCS8vICoqKioqIGxheCAqKioqKgotCQotCWJvb2xlYW4gaXNMYXgoKTsKLQkKLQlTdHJpbmcgU1BFQ0lGSUVEX0xBWF9QUk9QRVJUWSA9ICJzcGVjaWZpZWRMYXgiOyAvLyROT04tTkxTLTEkCi0JCi0JQm9vbGVhbiBnZXRTcGVjaWZpZWRMYXgoKTsKLQkKLQl2b2lkIHNldFNwZWNpZmllZExheChCb29sZWFuIHNwZWNpZmllZExheCk7Ci0JCi0JYm9vbGVhbiBpc0RlZmF1bHRMYXgoKTsKLQkKLQlib29sZWFuIERFRkFVTFRfTEFYID0gZmFsc2U7Ci0JCi0JCi0JLy8gKioqKiogdmFsdWUgKioqKioKLQkKLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQkKLQlTdHJpbmcgU1BFQ0lGSUVEX1ZBTFVFX1BST1BFUlRZID0gInNwZWNpZmllZFZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBnZXRTcGVjaWZpZWRWYWx1ZSgpOwotCQotCXZvaWQgc2V0U3BlY2lmaWVkVmFsdWUoU3RyaW5nIHZhbHVlKTsKLQkKLQlTdHJpbmcgREVGQVVMVF9UWVBFX1BST1BFUlRZID0gImRlZmF1bHRWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCi0JU3RyaW5nIERFRkFVTFRfVkFMVUUgPSAiamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5XM0NEb21IYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnRSZWZzICoqKioqCi0JCi0JWG1sRWxlbWVudFJlZnMgZ2V0WG1sRWxlbWVudFJlZnMoKTsKLQkKLQkKLQkvLyAqKioqKiBYbWxFbGVtZW50V3JhcHBlciAqKioqKgotCQotCVN0cmluZyBYTUxfRUxFTUVOVF9XUkFQUEVSX1BST1BFUlRZID0gInhtbEVsZW1lbnRXcmFwcGVyIjsgLy8kTk9OLU5MUy0xJAotCQotCVhtbEVsZW1lbnRXcmFwcGVyIGdldFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCi0JWG1sRWxlbWVudFdyYXBwZXIgYWRkWG1sRWxlbWVudFdyYXBwZXIoKTsKLQkKLQl2b2lkIHJlbW92ZVhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCi0JCi0JLy8gKioqKiogWG1sTWl4ZWQgKioqKioKLQkKLQlTdHJpbmcgWE1MX01JWEVEX1BST1BFUlRZID0gInhtbE1peGVkIjsgLy8kTk9OLU5MUy0xJAotCQotCVhtbE1peGVkIGdldFhtbE1peGVkKCk7Ci0JCi0JWG1sTWl4ZWQgYWRkWG1sTWl4ZWQoKTsKLQkKLQl2b2lkIHJlbW92ZVhtbE1peGVkKCk7CQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBdHRhY2htZW50UmVmLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEF0dGFjaG1lbnRSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzZTNjMi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEF0dGFjaG1lbnRSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci0KLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgSkFYQiBYbWxBdHRhY2htZW50UmVmCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxBdHRhY2htZW50UmVmCi0JCWV4dGVuZHMgSmF2YUNvbnRleHROb2RlIHsKLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjNmNhOS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgSkFYQiB4bWwgYXR0cmlidXRlIG1hcHBpbmcgKEBYbWxBdHRyaWJ1dGUpCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxBdHRyaWJ1dGVNYXBwaW5nCi0JCWV4dGVuZHMgWG1sTmFtZWROb2RlTWFwcGluZyB7CQotCQotCS8vICoqKioqIHFuYW1lICoqKioqCi0JCi0JSmF4YlFOYW1lIGdldFFOYW1lKCk7Ci0JCi0JCi0JLy8gKioqKiogcmVxdWlyZWQgKioqKioKLQkKLQlib29sZWFuIGlzUmVxdWlyZWQoKTsKLQkKLQlzdGF0aWMgU3RyaW5nIFNQRUNJRklFRF9SRVFVSVJFRF9QUk9QRVJUWSA9ICJzcGVjaWZpZWRSZXF1aXJlZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlCb29sZWFuIGdldFNwZWNpZmllZFJlcXVpcmVkKCk7Ci0JCi0Jdm9pZCBzZXRTcGVjaWZpZWRSZXF1aXJlZChCb29sZWFuIHNwZWNpZmllZFJlcXVpcmVkKTsKLQkKLQlib29sZWFuIGlzRGVmYXVsdFJlcXVpcmVkKCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEVsZW1lbnQuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzNjYmNmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RFbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBAWG1sRWxlbWVudCwgd2hldGhlciBhdCB0b3AgbGV2ZWwgb3IgbmVzdGVkIGluIEBYbWxFbGVtZW50cwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRWxlbWVudAotCQlleHRlbmRzIEphdmFDb250ZXh0Tm9kZSB7Ci0JCi0JLy8gKioqKiogYW5ub3RhdGlvbiAqKioqKgotCQotCVhtbEVsZW1lbnRBbm5vdGF0aW9uIGdldEFubm90YXRpb24oYm9vbGVhbiBjcmVhdGVJZk51bGwpOwotCQotCQotCS8vICoqKioqIHFuYW1lICoqKioqCi0JCi0JSmF4YlFOYW1lIGdldFFOYW1lKCk7Ci0JCi0JCi0JLy8gKioqKiogbmlsbGFibGUgKioqKioKLQkKLQlib29sZWFuIGlzTmlsbGFibGUoKTsKLQkKLQlTdHJpbmcgU1BFQ0lGSUVEX05JTExBQkxFX1BST1BFUlRZID0gInNwZWNpZmllZE5pbGxhYmxlIjsgLy8kTk9OLU5MUy0xJAotCQotCUJvb2xlYW4gZ2V0U3BlY2lmaWVkTmlsbGFibGUoKTsKLQkKLQl2b2lkIHNldFNwZWNpZmllZE5pbGxhYmxlKEJvb2xlYW4gc3BlY2lmaWVkTmlsbGFibGUpOwotCQotCVN0cmluZyBERUZBVUxUX05JTExBQkxFX1BST1BFUlRZID0gImRlZmF1bHROaWxsYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlib29sZWFuIGlzRGVmYXVsdE5pbGxhYmxlKCk7Ci0JCi0JCi0JLy8gKioqKiogcmVxdWlyZWQgKioqKioKLQkKLQlib29sZWFuIGlzUmVxdWlyZWQoKTsKLQkKLQlzdGF0aWMgU3RyaW5nIFNQRUNJRklFRF9SRVFVSVJFRF9QUk9QRVJUWSA9ICJzcGVjaWZpZWRSZXF1aXJlZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlCb29sZWFuIGdldFNwZWNpZmllZFJlcXVpcmVkKCk7Ci0JCi0Jdm9pZCBzZXRTcGVjaWZpZWRSZXF1aXJlZChCb29sZWFuIHNwZWNpZmllZFJlcXVpcmVkKTsKLQkKLQlib29sZWFuIGlzRGVmYXVsdFJlcXVpcmVkKCk7Ci0JCi0JCi0JLy8gKioqKiogZGVmYXVsdCB2YWx1ZSAqKioqKgotCQotCVN0cmluZyBERUZBVUxUX1ZBTFVFX1BST1BFUlRZID0gImRlZmF1bHRWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCi0Jdm9pZCBzZXREZWZhdWx0VmFsdWUoU3RyaW5nIGRlZmF1bHRWYWx1ZSk7Ci0JCi0JCi0JLy8gKioqKiogdHlwZSAqKioqKgotCQotCVN0cmluZyBnZXRUeXBlKCk7Ci0JCi0JU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpOwotCQotCVN0cmluZyBTUEVDSUZJRURfVFlQRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBnZXRTcGVjaWZpZWRUeXBlKCk7Ci0JCi0Jdm9pZCBzZXRTcGVjaWZpZWRUeXBlKFN0cmluZyB0eXBlKTsKLQkKLQlTdHJpbmcgREVGQVVMVF9UWVBFX1BST1BFUlRZID0gImRlZmF1bHRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBnZXREZWZhdWx0VHlwZSgpOwotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIGRpcmVjdGx5IHJlZmVyZW5jZWQgeG1sIHR5cGVzLCBmdWxseSBxdWFsaWZpZWQuCi0JICogKFVzZWQgZm9yIGNvbnN0cnVjdGluZyBKYXhiIGNvbnRleHQpCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbiByZWZlcmVuY2VkLCBpZiBpdCBjYW4gYmUgcmVzb2x2ZWQuCi0JICovCi0JWHNkRWxlbWVudERlY2xhcmF0aW9uIGdldFhzZEVsZW1lbnQoKTsKLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JVGV4dFJhbmdlIGdldFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxFbGVtZW50TWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxFbGVtZW50TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2EyOTNmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sRWxlbWVudE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIEpBWEIgeG1sIGVsZW1lbnQgbWFwcGluZyAoQFhtbEVsZW1lbnQpCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbGVtZW50TWFwcGluZwotCQlleHRlbmRzIFhtbE5hbWVkTm9kZU1hcHBpbmcgewotCQotCVhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudCgpOwotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnRXcmFwcGVyICoqKioqCi0JCi0JU3RyaW5nIFhNTF9FTEVNRU5UX1dSQVBQRVJfUFJPUEVSVFkgPSAieG1sRWxlbWVudFdyYXBwZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JWG1sRWxlbWVudFdyYXBwZXIgZ2V0WG1sRWxlbWVudFdyYXBwZXIoKTsKLQkKLQlYbWxFbGVtZW50V3JhcHBlciBhZGRYbWxFbGVtZW50V3JhcHBlcigpOwotCQotCXZvaWQgcmVtb3ZlWG1sRWxlbWVudFdyYXBwZXIoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sRWxlbWVudFJlZi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxFbGVtZW50UmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNzEzYmIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxFbGVtZW50UmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFJlZkFubm90YXRpb247Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBAWG1sRWxlbWVudFJlZiwgd2hldGhlciBhdCB0b3AgbGV2ZWwgb3IgbmVzdGVkIGluIEBYbWxFbGVtZW50UmVmcwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRWxlbWVudFJlZgotCQlleHRlbmRzIEphdmFDb250ZXh0Tm9kZSB7Ci0JCi0JLy8gKioqKiogYW5ub3RhdGlvbiAqKioqKgotCQotCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKTsKLQkKLQkKLQkvLyAqKioqKiBxbmFtZSAqKioqKgotCQotCUpheGJRTmFtZSBnZXRRTmFtZSgpOwotCQotCQotCS8vICoqKioqIHJlcXVpcmVkICoqKioqCi0JCi0JYm9vbGVhbiBpc1JlcXVpcmVkKCk7Ci0JCi0Jc3RhdGljIFN0cmluZyBTUEVDSUZJRURfUkVRVUlSRURfUFJPUEVSVFkgPSAic3BlY2lmaWVkUmVxdWlyZWQiOyAvLyROT04tTkxTLTEkCi0JCi0JQm9vbGVhbiBnZXRTcGVjaWZpZWRSZXF1aXJlZCgpOwotCQotCXZvaWQgc2V0U3BlY2lmaWVkUmVxdWlyZWQoQm9vbGVhbiBzcGVjaWZpZWRSZXF1aXJlZCk7Ci0JCi0JYm9vbGVhbiBpc0RlZmF1bHRSZXF1aXJlZCgpOwotCQotCQotCS8vICoqKioqIHR5cGUgKioqKioKLQkKLQlTdHJpbmcgZ2V0VHlwZSgpOwotCQotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZFR5cGUoKTsKLQkKLQlTdHJpbmcgU1BFQ0lGSUVEX1RZUEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgZ2V0U3BlY2lmaWVkVHlwZSgpOwotCQotCXZvaWQgc2V0U3BlY2lmaWVkVHlwZShTdHJpbmcgdHlwZSk7Ci0JCi0JU3RyaW5nIERFRkFVTFRfVFlQRV9QUk9QRVJUWSA9ICJkZWZhdWx0VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgZ2V0RGVmYXVsdFR5cGUoKTsKLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCBkaXJlY3RseSByZWZlcmVuY2VkIHhtbCB0eXBlcywgZnVsbHkgcXVhbGlmaWVkLgotCSAqIChVc2VkIGZvciBjb25zdHJ1Y3RpbmcgSmF4YiBjb250ZXh0KQotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpOwotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlUZXh0UmFuZ2UgZ2V0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEVsZW1lbnRSZWZNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEVsZW1lbnRSZWZNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYzhjZDUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxFbGVtZW50UmVmTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIEpBWEIgeG1sIGVsZW1lbnQgcmVmIG1hcHBpbmcgKEBYbWxFbGVtZW50UmVmKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRWxlbWVudFJlZk1hcHBpbmcKLQkJZXh0ZW5kcyBKYXhiQXR0cmlidXRlTWFwcGluZywgWG1sQWRhcHRhYmxlTWFwcGluZyB7Ci0JCi0JLy8gKioqKiogWG1sRWxlbWVudFJlZiAqKioqKgotCQotCVhtbEVsZW1lbnRSZWYgZ2V0WG1sRWxlbWVudFJlZigpOwotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnRXcmFwcGVyICoqKioqCi0JCi0JU3RyaW5nIFhNTF9FTEVNRU5UX1dSQVBQRVJfUFJPUEVSVFkgPSAieG1sRWxlbWVudFdyYXBwZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JWG1sRWxlbWVudFdyYXBwZXIgZ2V0WG1sRWxlbWVudFdyYXBwZXIoKTsKLQkKLQlYbWxFbGVtZW50V3JhcHBlciBhZGRYbWxFbGVtZW50V3JhcHBlcigpOwotCQotCXZvaWQgcmVtb3ZlWG1sRWxlbWVudFdyYXBwZXIoKTsJCi0JCi0JCi0JLy8gKioqKiogWG1sTWl4ZWQgKioqKioKLQkKLQlTdHJpbmcgWE1MX01JWEVEX1BST1BFUlRZID0gInhtbE1peGVkIjsgLy8kTk9OLU5MUy0xJAotCQotCVhtbE1peGVkIGdldFhtbE1peGVkKCk7Ci0JCi0JWG1sTWl4ZWQgYWRkWG1sTWl4ZWQoKTsKLQkKLQl2b2lkIHJlbW92ZVhtbE1peGVkKCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEVsZW1lbnRSZWZzLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEVsZW1lbnRSZWZzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZDhmZGIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxFbGVtZW50UmVmcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBYbWxFbGVtZW50UmVmcwotCQlleHRlbmRzIEphdmFDb250ZXh0Tm9kZSB7Ci0JCi0JLy8gKioqKiogWG1sRWxlbWVudFJlZnMgKioqKioKLQkKLQlTdHJpbmcgWE1MX0VMRU1FTlRfUkVGU19MSVNUID0gInhtbEVsZW1lbnRSZWZzIjsgLy8kTk9OLU5MUy0xJAotCQotCUxpc3RJdGVyYWJsZTxYbWxFbGVtZW50UmVmPiBnZXRYbWxFbGVtZW50UmVmcygpOwotCQotCWludCBnZXRYbWxFbGVtZW50UmVmc1NpemUoKTsKLQkKLQlYbWxFbGVtZW50UmVmIGFkZFhtbEVsZW1lbnRSZWYoaW50IGluZGV4KTsKLQkKLQl2b2lkIHJlbW92ZVhtbEVsZW1lbnRSZWYoaW50IGluZGV4KTsKLQkKLQl2b2lkIHJlbW92ZVhtbEVsZW1lbnRSZWYoWG1sRWxlbWVudFJlZiB4bWxFbGVtZW50UmVmKTsKLQkKLQl2b2lkIG1vdmVYbWxFbGVtZW50UmVmKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCBkaXJlY3RseSByZWZlcmVuY2VkIHhtbCB0eXBlcywgZnVsbHkgcXVhbGlmaWVkLgotCSAqIChVc2VkIGZvciBjb25zdHJ1Y3RpbmcgSmF4YiBjb250ZXh0KQotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxFbGVtZW50UmVmc01hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sRWxlbWVudFJlZnNNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YTRhNTUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxFbGVtZW50UmVmc01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi0KLS8qKgotICogUmVwcmVzZW50cyBhIEpBWEIgeG1sIGVsZW1lbnQgcmVmcyBtYXBwaW5nIChAWG1sRWxlbWVudFJlZnMpCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbGVtZW50UmVmc01hcHBpbmcKLQkJZXh0ZW5kcyBKYXhiQXR0cmlidXRlTWFwcGluZywgWG1sQWRhcHRhYmxlTWFwcGluZyB7Ci0JCi0JLy8gKioqKiogWG1sRWxlbWVudFJlZnMgKioqKioKLQkKLQlYbWxFbGVtZW50UmVmcyBnZXRYbWxFbGVtZW50UmVmcygpOwotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnRXcmFwcGVyICoqKioqCi0JCi0JU3RyaW5nIFhNTF9FTEVNRU5UX1dSQVBQRVJfUFJPUEVSVFkgPSAieG1sRWxlbWVudFdyYXBwZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JWG1sRWxlbWVudFdyYXBwZXIgZ2V0WG1sRWxlbWVudFdyYXBwZXIoKTsKLQkKLQlYbWxFbGVtZW50V3JhcHBlciBhZGRYbWxFbGVtZW50V3JhcHBlcigpOwotCQotCXZvaWQgcmVtb3ZlWG1sRWxlbWVudFdyYXBwZXIoKTsKLQkKLQkKLQkvLyAqKioqKiBYbWxNaXhlZCAqKioqKgotCQotCVN0cmluZyBYTUxfTUlYRURfUFJPUEVSVFkgPSAieG1sTWl4ZWQiOyAvLyROT04tTkxTLTEkCi0JCi0JWG1sTWl4ZWQgZ2V0WG1sTWl4ZWQoKTsKLQkKLQlYbWxNaXhlZCBhZGRYbWxNaXhlZCgpOwotCQotCXZvaWQgcmVtb3ZlWG1sTWl4ZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sRWxlbWVudFdyYXBwZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sRWxlbWVudFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYyMjc3Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEVsZW1lbnRXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZEVsZW1lbnREZWNsYXJhdGlvbjsKLQotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBKQVhCIFhNTCBlbGVtZW50IHdyYXBwZXIKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVsZW1lbnRXcmFwcGVyCi0JCWV4dGVuZHMgSmF2YUNvbnRleHROb2RlIHsKLQkKLQkvLyAqKioqKiBxbmFtZSAqKioqKgotCQotCUpheGJRTmFtZSBnZXRRTmFtZSgpOwotCQotCQotCS8vICoqKioqIG5pbGxhYmxlICoqKioqCi0JCi0JYm9vbGVhbiBpc05pbGxhYmxlKCk7Ci0JCi0JU3RyaW5nIFNQRUNJRklFRF9OSUxMQUJMRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWROaWxsYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlCb29sZWFuIGdldFNwZWNpZmllZE5pbGxhYmxlKCk7Ci0JCi0Jdm9pZCBzZXRTcGVjaWZpZWROaWxsYWJsZShCb29sZWFuIHNwZWNpZmllZE5pbGxhYmxlKTsKLQkKLQlib29sZWFuIGlzRGVmYXVsdE5pbGxhYmxlKCk7Ci0JCi0JYm9vbGVhbiBERUZBVUxUX05JTExBQkxFID0gZmFsc2U7Ci0JCQotCQotCS8vICoqKioqIHJlcXVpcmVkICoqKioqCi0JCi0JYm9vbGVhbiBpc1JlcXVpcmVkKCk7Ci0JCi0JU3RyaW5nIFNQRUNJRklFRF9SRVFVSVJFRF9QUk9QRVJUWSA9ICJzcGVjaWZpZWRSZXF1aXJlZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlCb29sZWFuIGdldFNwZWNpZmllZFJlcXVpcmVkKCk7Ci0JCi0Jdm9pZCBzZXRTcGVjaWZpZWRSZXF1aXJlZChCb29sZWFuIHNwZWNpZmllZFJlcXVpcmVkKTsKLQkKLQlib29sZWFuIGlzRGVmYXVsdFJlcXVpcmVkKCk7Ci0JCi0JYm9vbGVhbiBERUZBVUxUX1JFUVVJUkVEID0gZmFsc2U7Ci0JCQotCQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JWHNkRWxlbWVudERlY2xhcmF0aW9uIGdldFhzZEVsZW1lbnREZWNsYXJhdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxFbGVtZW50c01hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sRWxlbWVudHNNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNGJkMjQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxFbGVtZW50c01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIEpBWEIgeG1sIGVsZW1lbnRzIG1hcHBpbmcgKEBYbWxFbGVtZW50cykKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVsZW1lbnRzTWFwcGluZwotCQlleHRlbmRzIEpheGJBdHRyaWJ1dGVNYXBwaW5nLCBYbWxBZGFwdGFibGVNYXBwaW5nIHsKLQkKLQkvLyAqKioqKiBYbWxFbGVtZW50cyAqKioqKgotCQotCVN0cmluZyBYTUxfRUxFTUVOVFNfTElTVCA9ICJ4bWxFbGVtZW50cyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlMaXN0SXRlcmFibGU8WG1sRWxlbWVudD4gZ2V0WG1sRWxlbWVudHMoKTsKLQkKLQlpbnQgZ2V0WG1sRWxlbWVudHNTaXplKCk7Ci0JCi0JWG1sRWxlbWVudCBhZGRYbWxFbGVtZW50KGludCBpbmRleCk7Ci0JCi0Jdm9pZCByZW1vdmVYbWxFbGVtZW50KGludCBpbmRleCk7Ci0JCi0Jdm9pZCByZW1vdmVYbWxFbGVtZW50KFhtbEVsZW1lbnQgeG1sRWxlbWVudCk7Ci0JCi0Jdm9pZCBtb3ZlWG1sRWxlbWVudChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCi0JCi0JLy8gKioqKiogWG1sRWxlbWVudFdyYXBwZXIgKioqKioKLQkKLQlTdHJpbmcgWE1MX0VMRU1FTlRfV1JBUFBFUl9QUk9QRVJUWSA9ICJ4bWxFbGVtZW50V3JhcHBlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQlYbWxFbGVtZW50V3JhcHBlciBnZXRYbWxFbGVtZW50V3JhcHBlcigpOwotCQotCVhtbEVsZW1lbnRXcmFwcGVyIGFkZFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCi0Jdm9pZCByZW1vdmVYbWxFbGVtZW50V3JhcHBlcigpOwotCQotCQotCS8vICoqKioqIFhtbElEUkVGICoqKioqCi0JCi0JU3RyaW5nIFhNTF9JRFJFRl9QUk9QRVJUWSA9ICJ4bWxJRFJFRiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlYbWxJRFJFRiBnZXRYbWxJRFJFRigpOwotCQotCVhtbElEUkVGIGFkZFhtbElEUkVGKCk7Ci0JCi0Jdm9pZCByZW1vdmVYbWxJRFJFRigpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxJRC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzE2OWY5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sSUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci0KLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgSkFYQiBYTUwgSUQgKEBYbWxJRCkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbElECi0JCWV4dGVuZHMgSmF2YUNvbnRleHROb2RlIHsKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbElEUkVGLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbElEUkVGLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYWVmZDMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxJRFJFRi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLQotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBKQVhCIFhNTCBJRCByZWYgKEBYbWxJRFJFRikKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbElEUkVGCi0JCWV4dGVuZHMgSmF2YUNvbnRleHROb2RlIHsKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEphdmFUeXBlQWRhcHRlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxKYXZhVHlwZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiMzQyYi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEphdmFUeXBlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb247Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxKYXZhVHlwZUFkYXB0ZXIKLQkJZXh0ZW5kcyBKYXZhQ29udGV4dE5vZGUgewotCQotCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpOwotCQotCQotCS8vICoqKioqIHZhbHVlICoqKioqCi0JCi0JU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBnZXRWYWx1ZSgpOwotCQotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQkKLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZSgpOwotCQotCQotCS8vICoqKioqIHhtbEFkYXB0ZXIgKioqKioKLQkKLQlTdHJpbmcgWE1MX0FEQVBURVJfUFJPUEVSVFkgPSAieG1sQWRhcHRlciI7ICAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogT2JqZWN0IGJhc2VkIG9uIHNwZWNpZmllZCAidmFsdWUiCi0JICovCi0JWG1sQWRhcHRlciBnZXRYbWxBZGFwdGVyKCk7Ci0JCi0JCi0JLy8gKioqKiogdHlwZSAqKioqKgotCQotCVN0cmluZyBnZXRUeXBlKCk7Ci0JCi0JU3RyaW5nIFNQRUNJRklFRF9UWVBFX1BST1BFUlRZID0gInNwZWNpZmllZFR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIGdldFNwZWNpZmllZFR5cGUoKTsKLQkKLQl2b2lkIHNldFNwZWNpZmllZFR5cGUoU3RyaW5nIHR5cGUpOwotCQotCVN0cmluZyBERUZBVUxUX1RZUEVfUFJPUEVSVFkgPSAiZGVmYXVsdFR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIGdldERlZmF1bHRUeXBlKCk7Ci0JCi0JU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpOwotCQotCVN0cmluZyBERUZBVUxUX1RZUEUgPSAiamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXIuREVGQVVMVCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sTWl4ZWQuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sTWl4ZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZjNmRmOS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbE1peGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRoZSBAWG1sTWl4ZWQgSkFYQiBhbm5vdGF0aW9uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNaXhlZAotCQlleHRlbmRzIEphdmFDb250ZXh0Tm9kZSB7Ci0JCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbE5hbWVkTm9kZU1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sTmFtZWROb2RlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWZjMzczLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sTmFtZWROb2RlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZEZlYXR1cmU7Ci0KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSBmb3IgWG1sRWxlbWVudE1hcHBpbmcgYW5kIFhtbEF0dHJpYnV0ZU1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE5hbWVkTm9kZU1hcHBpbmcKLQkJZXh0ZW5kcyBYbWxOb2RlTWFwcGluZyB7Ci0JCi0JLy8gKioqKiogWG1sSUQgKioqKioKLQkKLQlTdHJpbmcgWE1MX0lEX1BST1BFUlRZID0gInhtbElEIjsgLy8kTk9OLU5MUy0xJAotCQotCVhtbElEIGdldFhtbElEKCk7Ci0JCi0JWG1sSUQgYWRkWG1sSUQoKTsKLQkKLQl2b2lkIHJlbW92ZVhtbElEKCk7Ci0JCi0JCi0JLy8gKioqKiogWG1sSURSRUYgKioqKioKLQkKLQlTdHJpbmcgWE1MX0lEUkVGX1BST1BFUlRZID0gInhtbElEUkVGIjsgLy8kTk9OLU5MUy0xJAotCQotCVhtbElEUkVGIGdldFhtbElEUkVGKCk7Ci0JCi0JWG1sSURSRUYgYWRkWG1sSURSRUYoKTsKLQkKLQl2b2lkIHJlbW92ZVhtbElEUkVGKCk7Ci0JCi0JCi0JLy8gKioqKiogWG1sQXR0YWNobWVudFJlZiAqKioqKgotCQotCVN0cmluZyBYTUxfQVRUQUNITUVOVF9SRUZfUFJPUEVSVFkgPSAieG1sQXR0YWNobWVudFJlZiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlYbWxBdHRhY2htZW50UmVmIGdldFhtbEF0dGFjaG1lbnRSZWYoKTsKLQkKLQlYbWxBdHRhY2htZW50UmVmIGFkZFhtbEF0dGFjaG1lbnRSZWYoKTsKLQkKLQl2b2lkIHJlbW92ZVhtbEF0dGFjaG1lbnRSZWYoKTsKLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JWHNkRmVhdHVyZSBnZXRYc2RGZWF0dXJlKCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbE5vZGVNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbE5vZGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMjM0MTYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxOb2RlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSBmb3IgWG1sRWxlbWVudE1hcHBpbmcsIFhtbEF0dHJpYnV0ZU1hcHBpbmcsIGFuZCBYbWxWYWx1ZU1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE5vZGVNYXBwaW5nCi0JCWV4dGVuZHMgSmF4YkF0dHJpYnV0ZU1hcHBpbmcsIFhtbEFkYXB0YWJsZU1hcHBpbmcgewotCQotCS8vICoqKioqIHhtbCBzY2hlbWEgdHlwZSAqKioqKgotCQotCVN0cmluZyBYTUxfU0NIRU1BX1RZUEVfUFJPUEVSVFkgPSAieG1sU2NoZW1hVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlYbWxTY2hlbWFUeXBlIGdldFhtbFNjaGVtYVR5cGUoKTsKLQkKLQlYbWxTY2hlbWFUeXBlIGFkZFhtbFNjaGVtYVR5cGUoKTsKLQkKLQl2b2lkIHJlbW92ZVhtbFNjaGVtYVR5cGUoKTsKLQkKLQkKLQkvLyAqKioqKiBYbWxMaXN0ICoqKioqCi0JCi0JYm9vbGVhbiBpc1htbExpc3QoKTsKLQkKLQlTdHJpbmcgU1BFQ0lGSUVEX1hNTF9MSVNUX1BST1BFUlRZID0gInNwZWNpZmllZFhtbExpc3QiOyAvLyROT04tTkxTLTEkCi0JCi0JYm9vbGVhbiBpc1NwZWNpZmllZFhtbExpc3QoKTsKLQkKLQl2b2lkIHNldFNwZWNpZmllZFhtbExpc3QoYm9vbGVhbiBuZXdWYWx1ZSk7Ci0JCi0JU3RyaW5nIERFRkFVTFRfWE1MX0xJU1RfUFJPUEVSVFkgPSAiZGVmYXVsdFhtbExpc3QiOyAvLyROT04tTkxTLTEkCi0JCi0JYm9vbGVhbiBpc0RlZmF1bHRYbWxMaXN0KCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbE5zLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbE5zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NTdmNTcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxOcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE5zQW5ub3RhdGlvbjsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE5zCi0JCWV4dGVuZHMgSmF2YUNvbnRleHROb2RlIHsKLQkKLQkKLQlYbWxOc0Fubm90YXRpb24gZ2V0UmVzb3VyY2VYbWxOcygpOwotCQotCQotCS8vICoqKioqIG5hbWVzcGFjZVVSSSAqKioqKgotCQotCVN0cmluZyBOQU1FU1BBQ0VfVVJJX1BST1BFUlRZID0gIm5hbWVzcGFjZVVSSSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCi0Jdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5hbWVzcGFjZVVSSSk7Ci0JCi0JCi0JLy8gKioqKiogcHJlZml4ICoqKioqCi0JCi0JU3RyaW5nIFBSRUZJWF9QUk9QRVJUWSA9ICJwcmVmaXgiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIGdldFByZWZpeCgpOwotCQotCXZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxOc0Zvcm0uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sTnNGb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YjhlYmMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxOc0Zvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgZW51bSBYbWxOc0Zvcm0gewotCi0JUVVBTElGSUVEKAotCQlvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTnNGb3JtLlFVQUxJRklFRAotCQkpLAotCVVOUVVBTElGSUVEKAotCQlvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTnNGb3JtLlVOUVVBTElGSUVECi0JCSksCi0JVU5TRVQoCi0JCW9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxOc0Zvcm0uVU5TRVQKLQkJKTsKLQotCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTnNGb3JtIGphdmFOc0Zvcm07Ci0KLQlYbWxOc0Zvcm0ob3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE5zRm9ybSBqYXZhTnNGb3JtKSB7Ci0JCWlmIChqYXZhTnNGb3JtID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuamF2YU5zRm9ybSA9IGphdmFOc0Zvcm07Ci0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxOc0Zvcm0gZ2V0SmF2YU5zRm9ybSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YU5zRm9ybTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBYbWxOc0Zvcm0gZnJvbUphdmFSZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxOc0Zvcm0gamF2YU5zRm9ybSkgewotCQlyZXR1cm4gKGphdmFOc0Zvcm0gPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFSZXNvdXJjZU1vZGVsXyhqYXZhTnNGb3JtKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBYbWxOc0Zvcm0gZnJvbUphdmFSZXNvdXJjZU1vZGVsXyhvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTnNGb3JtIGphdmFOc0Zvcm0pIHsKLQkJZm9yIChYbWxOc0Zvcm0gbnNGb3JtIDogWG1sTnNGb3JtLnZhbHVlcygpKSB7Ci0JCQlpZiAobnNGb3JtLmdldEphdmFOc0Zvcm0oKSA9PSBqYXZhTnNGb3JtKSB7Ci0JCQkJcmV0dXJuIG5zRm9ybTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxOc0Zvcm0gdG9KYXZhUmVzb3VyY2VNb2RlbChYbWxOc0Zvcm0gbnNGb3JtKSB7Ci0JCXJldHVybiAobnNGb3JtID09IG51bGwpID8gbnVsbCA6IG5zRm9ybS5nZXRKYXZhTnNGb3JtKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxSZWdpc3RyeS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZThiZTU1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotCi0KLS8qKgotICogUmVwcmVzZW50cyBhIEpBWEIgcmVnaXN0cnkKLSAqIChBIGNsYXNzIHdpdGggYW4gZXhwbGljaXQgQFhtbFJlZ2lzdHJ5IGFubm90YXRpb24pCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxSZWdpc3RyeQotCQlleHRlbmRzIEphdmFDb250ZXh0Tm9kZSB7Ci0JCi0JLy8gKioqKiogZWxlbWVudCBmYWN0b3J5IG1ldGhvZHMgKioqKioqCi0JCi0JU3RyaW5nIEVMRU1FTlRfRkFDVE9SWV9NRVRIT0RTX0NPTExFQ1RJT04gPSAiZWxlbWVudEZhY3RvcnlNZXRob2RzIjsgLy8kTk9OLU5MUy0xJAotCQotCUl0ZXJhYmxlPEpheGJFbGVtZW50RmFjdG9yeU1ldGhvZD4gZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzKCk7Ci0JCi0JaW50IGdldEVsZW1lbnRGYWN0b3J5TWV0aG9kc1NpemUoKTsKLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JSmF4YkNsYXNzIGdldEpheGJDbGFzcygpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxSb290RWxlbWVudC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxSb290RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzU3OTY5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sUm9vdEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBKQVhCIHhtbCByb290IGVsZW1lbnQuICAKLSAqIChBIGNsYXNzIHdpdGggYW4gZXhwbGljaXQgQFhtbFJvb3RFbGVtZW50IGFubm90YXRpb24pCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxSb290RWxlbWVudAotCQlleHRlbmRzIEphdmFDb250ZXh0Tm9kZSB7Ci0JCi0JSmF4YlR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCk7Ci0JCi0JSmF4YlFOYW1lIGdldFFOYW1lKCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbFNjaGVtYS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxTY2hlbWEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJiZThkNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbFNjaGVtYS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotCi0vKioKLSAqIAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sU2NoZW1hCi0JCWV4dGVuZHMgSmF2YUNvbnRleHROb2RlIHsKLQkKLQlKYXhiUGFja2FnZUluZm8gZ2V0SmF4YlBhY2thZ2VJbmZvKCk7Ci0JCi0JCi0JLy8gKioqKiogbmFtZXNwYWNlICoqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlIG9yICIiIChkZWZhdWx0IHZhbHVlKQotCSAqLwotCVN0cmluZyBnZXROYW1lc3BhY2UoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UsIG51bGwgaWYgaXQgaXMgbm90IHNwZWNpZmllZAotCSAqLwotCVN0cmluZyBnZXRTcGVjaWZpZWROYW1lc3BhY2UoKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIG5hbWVzcGFjZSwgbnVsbCB0byB1bnNwZWNpZnkKLQkgKi8KLQl2b2lkIHNldFNwZWNpZmllZE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKTsKLQkKLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UKLQkgKi8KLQlTdHJpbmcgU1BFQ0lGSUVEX05BTUVTUEFDRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWROYW1lc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIFhtbFNjaGVtYSBhbm5vdGF0aW9uIGxvY2F0aW9uIGVsZW1lbnQKLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYXRpb24oKTsKLQl2b2lkIHNldExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbik7Ci0JCVN0cmluZyBMT0NBVElPTl9QUk9QRVJUWSA9ICJsb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIERFRkFVTFRfTE9DQVRJT04gPSAiIyNnZW5lcmF0ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGF0dHJpYnV0ZSBmb3JtIGRlZmF1bHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgZm9ybSBkZWZhdWx0IG9yIFhtbE5zRm9ybS5VTlNFVCAoZGVmYXVsdCB2YWx1ZSkKLQkgKi8KLQlYbWxOc0Zvcm0gZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgZm9ybSBkZWZhdWx0LCBudWxsIGlmIGl0IGlzIG5vdCBzcGVjaWZpZWQKLQkgKi8KLQlYbWxOc0Zvcm0gZ2V0U3BlY2lmaWVkQXR0cmlidXRlRm9ybURlZmF1bHQoKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIGF0dHJpYnV0ZSBmb3JtIGRlZmF1bHQsIG51bGwgdG8gdW5zcGVjaWZ5Ci0JICovCi0Jdm9pZCBzZXRTcGVjaWZpZWRBdHRyaWJ1dGVGb3JtRGVmYXVsdChYbWxOc0Zvcm0gYXR0cmlidXRlRm9ybURlZmF1bHQpOwotCQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBmb3JtIGRlZmF1bHQKLQkgKi8KLQlTdHJpbmcgU1BFQ0lGSUVEX0FUVFJJQlVURV9GT1JNX0RFRkFVTFRfUFJPUEVSVFkgPSAiYXR0cmlidXRlRm9ybURlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBlbGVtZW50IGZvcm0gZGVmYXVsdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgZm9ybSBkZWZhdWx0IG9yIFhtbE5zRm9ybS5VTlNFVCAoZGVmYXVsdCB2YWx1ZSkKLQkgKi8KLQlYbWxOc0Zvcm0gZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBmb3JtIGRlZmF1bHQsIG51bGwgaWYgaXQgaXMgbm90IHNwZWNpZmllZAotCSAqLwotCVhtbE5zRm9ybSBnZXRTcGVjaWZpZWRFbGVtZW50Rm9ybURlZmF1bHQoKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIGVsZW1lbnQgZm9ybSBkZWZhdWx0LCBudWxsIHRvIHVuc3BlY2lmeQotCSAqLwotCXZvaWQgc2V0U3BlY2lmaWVkRWxlbWVudEZvcm1EZWZhdWx0KFhtbE5zRm9ybSBlbGVtZW50Rm9ybURlZmF1bHQpOwotCQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBmb3JtIGRlZmF1bHQKLQkgKi8KLQlTdHJpbmcgU1BFQ0lGSUVEX0VMRU1FTlRfRk9STV9ERUZBVUxUX1BST1BFUlRZID0gImVsZW1lbnRGb3JtRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQkvLyAqKioqKioqKioqIHhtbCBuYW1lc3BhY2UgcHJlZml4ZXMgKioqKioqKioqKgotCi0JTGlzdEl0ZXJhYmxlPFhtbE5zPiBnZXRYbWxOc1ByZWZpeGVzKCk7Ci0JaW50IGdldFhtbE5zUHJlZml4ZXNTaXplKCk7Ci0JWG1sTnMgYWRkWG1sTnNQcmVmaXgoaW50IGluZGV4KTsKLQl2b2lkIHJlbW92ZVhtbE5zUHJlZml4KGludCBpbmRleCk7Ci0Jdm9pZCByZW1vdmVYbWxOc1ByZWZpeChYbWxOcyB4bWxOc1ByZWZpeCk7Ci0Jdm9pZCBtb3ZlWG1sTnNQcmVmaXgoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCQlTdHJpbmcgWE1MX05TX1BSRUZJWEVTX0xJU1QgPSAieG1sTnNQcmVmaXhlcyI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxTY2hlbWFUeXBlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbFNjaGVtYVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTViNWE2MC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbFNjaGVtYVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxTY2hlbWFUeXBlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RVdGlsOwotCi0vKioKLSAqIAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sU2NoZW1hVHlwZQotCQlleHRlbmRzIEphdmFDb250ZXh0Tm9kZSB7Ci0JCi0JU3RyaW5nIERFRkFVTFRfTkFNRVNQQUNFID0gWFNEVXRpbC5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMTsKLQkKLQlYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbiBnZXRYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbigpOwotCQotCUpheGJRTmFtZSBnZXRRTmFtZSgpOwotCQotCQotCS8vICoqKioqIHR5cGUgKioqKioKLQkKLQlTdHJpbmcgVFlQRV9QUk9QRVJUWSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYbWxTY2hlbWFUeXBlIGFubm90YXRpb24gJ3R5cGUnIGVsZW1lbnQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCQotCXZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSk7Ci0JCi0JU3RyaW5nIERFRkFVTFRfVFlQRSA9ICJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYVR5cGUuREVGQVVMVCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpOwotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQlwdWJsaWMgWHNkVHlwZURlZmluaXRpb24gZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sU2VlQWxzby5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxTZWVBbHNvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyOTE4OTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxTZWVBbHNvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBNYWludGFpbnMgYSBsaXN0IG9mIGNsYXNzZXMgKGNsYXNzIG5hbWVzIGhlcmUpIHRvIGJlIGFkZGVkIHRvIHRoZSBKQVhCIGNvbnRleHQuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFNlZUFsc28KLQkJZXh0ZW5kcyBKYXZhQ29udGV4dE5vZGUgewotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsdWUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTRVNfTElTVCA9ICJjbGFzc2VzIjsKLQkKLQlMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRDbGFzc2VzKCk7Ci0JCi0JaW50IGdldENsYXNzZXNTaXplKCk7Ci0JCi0Jdm9pZCBhZGRDbGFzcyhpbnQgaW5kZXgsIFN0cmluZyBjbGF6eik7Ci0JCi0Jdm9pZCByZW1vdmVDbGFzcyhpbnQgaW5kZXgpOwotCQotCXZvaWQgbW92ZUNsYXNzKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIG1pc2MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIGRpcmVjdGx5IHJlZmVyZW5jZWQgdHlwZXMsIGZ1bGx5IHF1YWxpZmllZC4KLQkgKiAoVXNlZCBmb3IgY29uc3RydWN0aW5nIEpheGIgY29udGV4dCkKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sVmFsdWVNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbFZhbHVlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDFjMThlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sVmFsdWVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi0KLS8qKgotICogUmVwcmVzZW50cyBhIEpBWEIgeG1sIHZhbHVlIG1hcHBpbmcgKEBYbWxWYWx1ZSkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFZhbHVlTWFwcGluZwotCQlleHRlbmRzIFhtbE5vZGVNYXBwaW5nIHsKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L2phdmEvRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9qYXZhL0RlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY2ZmRjNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L2phdmEvRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQotCi0KLS8qKgotICogTWFwIGEgc3RyaW5nIGtleSB0byBhbiBhdHRyaWJ1dGUgbWFwcGluZyBhbmQgaXRzIGNvcnJlc3BvbmRpbmcKLSAqIEphdmEgYW5ub3RhdGlvbi4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZXh0ZW5kcyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbWFwcGluZyBwcm92aWRlciBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGdpdmVuIHtAbGluayBKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZX0gCi0JICogaW4gdGhlIGRlZmF1bHQgKGlnbm9yaW5nIGFsbCBtYXBwaW5nIGFubm90YXRpb25zKSBjYXNlLgotCSAqLwotCWJvb2xlYW4gaXNEZWZhdWx0KEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9qYXZhL0phdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9qYXZhL0phdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDI3ZDhlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvamF2YS9KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLQotLyoqCi0gKiBNYXAgYSBzdHJpbmcga2V5IHRvIGFuIGF0dHJpYnV0ZSBtYXBwaW5nIGFuZCBpdHMgY29ycmVzcG9uZGluZwotICogSmF2YSBhbm5vdGF0aW9uLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIAotewotCS8qKgotCSAqIFJldHVybiB0aGUgYXR0cmlidXRlIG1hcHBpbmcncyBrZXkuCi0JICovCi0JU3RyaW5nIGdldEtleSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhdHRyaWJ1dGUgbWFwcGluZydzIEphdmEgYW5ub3RhdGlvbiBuYW1lLgotCSAqLwotCVN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogQnVpbGQgYSBKYXZhIGF0dHJpYnV0ZSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZS4gVXNlIHRoZSBzcGVjaWZpZWQKLQkgKiBmYWN0b3J5IGZvciBjcmVhdGlvbiBzbyBleHRlbmRlcnMgY2FuIHNpbXBseSBvdmVycmlkZSB0aGUgYXBwcm9wcmlhdGUKLQkgKiBjcmVhdGlvbiBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZyBhIHByb3ZpZGVyIGZvciB0aGUgc2FtZSBrZXkuCi0JICovCi0JSmF4YkF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSwgSmF4YkZhY3RvcnkgZmFjdG9yeSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIGZ1bGx5IHF1YWxpZmllZCBhbm5vdGF0aW9uIG5hbWVzIHRoYXQgYXJlIHN1cHBvcnRlZCB3aXRoIHRoaXMgbWFwcGluZyB0eXBlLgotCSAqIFRoaXMgaW5jbHVkZXMgYWxsIHBvc3NpYmxlIGFubm90YXRpb25zLCBub3QganVzdCB0aGUgb25lcyB0aGF0IGN1cnJlbnRseSBleGlzdCBvbiB0aGUgYXR0cmlidXRlLgotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtYXBwaW5nIHByb3ZpZGVyIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4ge0BsaW5rIFBlcnNpc3RlbnRBdHRyaWJ1dGV9IAotCSAqIGluIHRoZSBzcGVjaWZpZWQgKG9ic2VydmluZyBhbGwgbWFwcGluZyBhbm5vdGF0aW9ucykgY2FzZS4KLQkgKi8KLQlib29sZWFuIGlzU3BlY2lmaWVkKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9qYXZhL0phdmFDb250ZXh0Tm9kZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9qYXZhL0phdmFDb250ZXh0Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjg1OWYwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvamF2YS9KYXZhQ29udGV4dE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFDb250ZXh0Tm9kZQotCQlleHRlbmRzIEpheGJDb250ZXh0Tm9kZSB7Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIGNvZGUtY29tcGxldGlvbiBwcm9wb3NhbHMgZm9yIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhlIHNvdXJjZSBjb2RlLgotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogQWRkcyB0byB0aGUgbGlzdCBvZiBjdXJyZW50IHZhbGlkYXRpb24gbWVzc2FnZXMKLQkgKi8KLQl2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgcmFuZ2UgZm9yIGhpZ2hsaWdodGluZyBlcnJvcnMgZm9yIHRoaXMgb2JqZWN0Ci0JICovCi0JVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RKYXhiRmFjdG9yeS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RKYXhiRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmZkOWVkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL0Fic3RyYWN0SmF4YkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQcm9qZWN0LkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuQWNjZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDb250ZXh0Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVudW1Db25zdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVudW1NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBbnlBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBbnlFbGVtZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRSZWZNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50UmVmc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sTnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxSb290RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxWYWx1ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LkdlbmVyaWNDb250ZXh0Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuR2VuZXJpY1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUVudW1Db25zdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUVudW1NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhSmF4YkVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVBhY2thZ2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhWG1sTnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFYbWxSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVhtbFJvb3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhWG1sU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhWG1sVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVhtbFZhbHVlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTnNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxSb290RWxlbWVudEFubm90YXRpb247Ci0KLS8qKgotICogQ2VudHJhbCBjbGFzcyB0aGF0IGFsbG93cyBleHRlbmRlcnMgdG8gZWFzaWx5IHJlcGxhY2UgaW1wbGVtZW50YXRpb25zIG9mCi0gKiB2YXJpb3VzIERhbGkgaW50ZXJmYWNlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF4YkZhY3RvcnkKLQkJaW1wbGVtZW50cyBKYXhiRmFjdG9yeSB7Ci0JCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF4YkZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogQ29yZSBNb2RlbCAqKioqKioqKioqCi0JCi0JcHVibGljIEpheGJQcm9qZWN0IGJ1aWxkSmF4YlByb2plY3QoQ29uZmlnIGNvbmZpZykgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXhiUHJvamVjdChjb25maWcpOwotCX0KLQkKLQlwdWJsaWMgSmF4YkZpbGUgYnVpbGRKYXhiRmlsZShKYXhiUHJvamVjdCBqYXhiUHJvamVjdCwgSUZpbGUgZmlsZSwgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlLCBKcHRSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF4YkZpbGUoamF4YlByb2plY3QsIGZpbGUsIGNvbnRlbnRUeXBlLCByZXNvdXJjZU1vZGVsKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBOb24tcmVzb3VyY2Utc3BlY2lmaWMgY29udGV4dCBub2RlcyAqKioqKioqKioqCi0JCi0JcHVibGljIEpheGJDb250ZXh0Um9vdCBidWlsZENvbnRleHRSb290KEpheGJQcm9qZWN0IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNDb250ZXh0Um9vdChwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF4YlBhY2thZ2UgYnVpbGRQYWNrYWdlKEpheGJDb250ZXh0Um9vdCBwYXJlbnQsIFN0cmluZyBwYWNrYWdlTmFtZSkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNQYWNrYWdlKHBhcmVudCwgcGFja2FnZU5hbWUpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBKYXZhIGNvbnRleHQgbm9kZXMgKioqKioKLQkKLQlwdWJsaWMgSmF4YlBhY2thZ2VJbmZvIGJ1aWxkSmF2YVBhY2thZ2VJbmZvKEpheGJQYWNrYWdlIHBhcmVudCwgSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVBhY2thZ2VJbmZvKHBhcmVudCwgcmVzb3VyY2VQYWNrYWdlKTsKLQl9Ci0JCi0JcHVibGljIFhtbFNjaGVtYSBidWlsZEphdmFYbWxTY2hlbWEoSmF4YlBhY2thZ2VJbmZvIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sU2NoZW1hKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBYbWxOcyBidWlsZEphdmFYbWxOcyhYbWxTY2hlbWEgcGFyZW50LCBYbWxOc0Fubm90YXRpb24geG1sTnNBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxOcyhwYXJlbnQsIHhtbE5zQW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyBKYXhiQ2xhc3MgYnVpbGRKYXhiQ2xhc3MoSmF4YkNvbnRleHRSb290IHBhcmVudCwgSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUpheGJDbGFzcyhwYXJlbnQsIHJlc291cmNlVHlwZSk7Ci0JfQotCQotCXB1YmxpYyBKYXhiRW51bSBidWlsZEpheGJFbnVtKEpheGJDb250ZXh0Um9vdCBwYXJlbnQsIEphdmFSZXNvdXJjZUVudW0gcmVzb3VyY2VFbnVtKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFKYXhiRW51bShwYXJlbnQsIHJlc291cmNlRW51bSk7Ci0JfQotCQotCXB1YmxpYyBKYXhiQ2xhc3NNYXBwaW5nIGJ1aWxkSmF4YkNsYXNzTWFwcGluZyhKYXhiQ2xhc3MgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFDbGFzc01hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEpheGJFbnVtTWFwcGluZyBidWlsZEpheGJFbnVtTWFwcGluZyhKYXhiRW51bSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUVudW1NYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBYbWxSZWdpc3RyeSBidWlsZFhtbFJlZ2lzdHJ5KEpheGJDbGFzcyBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVhtbFJlZ2lzdHJ5KHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QgYnVpbGRKYXZhRWxlbWVudEZhY3RvcnlNZXRob2QoWG1sUmVnaXN0cnkgcGFyZW50LCBKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kKHBhcmVudCwgcmVzb3VyY2VNZXRob2QpOwotCX0KLQkKLQlwdWJsaWMgWG1sUm9vdEVsZW1lbnQgYnVpbGRKYXZhWG1sUm9vdEVsZW1lbnQoSmF4YlR5cGVNYXBwaW5nIHBhcmVudCwgWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uIHhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sUm9vdEVsZW1lbnQocGFyZW50LCB4bWxSb290RWxlbWVudEFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZShKYXhiQ2xhc3NNYXBwaW5nIHBhcmVudCwgQWNjZXNzb3IgYWNjZXNzb3IpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUocGFyZW50LCBhY2Nlc3Nvcik7Ci0JfQotCQotCXB1YmxpYyBKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZEphdmFQZXJzaXN0ZW50RmllbGQoSmF4YkNsYXNzTWFwcGluZyBwYXJlbnQsIEphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQpIHsKLQkJcmV0dXJuIEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5idWlsZFBlcnNpc3RlbnRGaWVsZChwYXJlbnQsIHJlc291cmNlRmllbGQpOwotCX0KLQkKLQlwdWJsaWMgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRKYXZhUGVyc2lzdGVudFByb3BlcnR5KEpheGJDbGFzc01hcHBpbmcgcGFyZW50LCBKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VHZXR0ZXIsIEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZVNldHRlcikgewotCQlyZXR1cm4gR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlLmJ1aWxkUGVyc2lzdGVudFByb3BlcnR5KHBhcmVudCwgcmVzb3VyY2VHZXR0ZXIsIHJlc291cmNlU2V0dGVyKTsKLQl9Ci0JCi0JcHVibGljIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkSmF2YVhtbFRyYW5zaWVudE1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxUcmFuc2llbnRNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBYbWxBbnlFbGVtZW50TWFwcGluZyBidWlsZEphdmFYbWxBbnlFbGVtZW50TWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBYbWxFbGVtZW50TWFwcGluZyBidWlsZEphdmFYbWxFbGVtZW50TWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBYbWxFbGVtZW50UmVmTWFwcGluZyBidWlsZEphdmFYbWxFbGVtZW50UmVmTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBYbWxFbGVtZW50UmVmc01hcHBpbmcgYnVpbGRKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBYbWxFbGVtZW50c01hcHBpbmcgYnVpbGRKYXZhWG1sRWxlbWVudHNNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBYbWxWYWx1ZU1hcHBpbmcgYnVpbGRKYXZhWG1sVmFsdWVNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sVmFsdWVNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXhiRW51bUNvbnN0YW50IGJ1aWxkSmF2YUVudW1Db25zdGFudChKYXhiRW51bU1hcHBpbmcgcGFyZW50LCBKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQgcmVzb3VyY2VFbnVtQ29uc3RhbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUVudW1Db25zdGFudChwYXJlbnQsIHJlc291cmNlRW51bUNvbnN0YW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9BYnN0cmFjdEpheGJOb2RlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9BYnN0cmFjdEpheGJOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNTdmNWYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RKYXhiTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlBsYXRmb3JtVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVE1vZGlmaWVkRGVjbGFyYXRpb24uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5Bc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybTsKLQotLyoqCi0gKiBTb21lIGNvbW1vbiBEYWxpIGJlaGF2aW9yOjx1bD4KLSAqIDxsaT5jb250YWlubWVudCBoaWVyYXJjaHkKLSAqIDxsaT5FY2xpcHNlIGFkYXB0YWJsZQotICogPGxpPnVwZGF0ZSB0cmlnZ2VycwotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF4Yk5vZGUKLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIEpheGJOb2RlCi17Ci0JcHJpdmF0ZSBmaW5hbCBKYXhiTm9kZSBwYXJlbnQ7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF4Yk5vZGUoSmF4Yk5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY2hlY2tQYXJlbnQocGFyZW50KTsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tQYXJlbnQoSmF4Yk5vZGUgcCkgewotCQlpZiAocCA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5yZXF1aXJlc1BhcmVudCgpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiJ3BhcmVudCcgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMuZm9yYmlkc1BhcmVudCgpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiJ3BhcmVudCcgbXVzdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVzUGFyZW50KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmb3JiaWRzUGFyZW50KCkgewotCQlyZXR1cm4gISB0aGlzLnJlcXVpcmVzUGFyZW50KCk7ICAvLyBhc3N1bWUgJ3BhcmVudCcgaXMgbm90IG9wdGlvbmFsCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IEFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgdGhpcy5idWlsZENoYW5nZVN1cHBvcnRMaXN0ZW5lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXNwZWN0Q2hhbmdlU3VwcG9ydC5MaXN0ZW5lciBidWlsZENoYW5nZVN1cHBvcnRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBc3BlY3RDaGFuZ2VTdXBwb3J0Lkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgYXNwZWN0Q2hhbmdlZChTdHJpbmcgYXNwZWN0TmFtZSkgewotCQkJCUFic3RyYWN0SmF4Yk5vZGUudGhpcy5hc3BlY3RDaGFuZ2VkKGFzcGVjdE5hbWUpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJQWRhcHRhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gUGxhdGZvcm1Ub29scy5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXhiTm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF4Yk5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50LmdldFJlc291cmNlKCk7Ci0JfQotCi0JcHVibGljIEpheGJQcm9qZWN0IGdldEpheGJQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0SmF4YlByb2plY3QoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgSmF4YlBsYXRmb3JtIGdldFBsYXRmb3JtKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXhiUHJvamVjdCgpLmdldFBsYXRmb3JtKCk7Ci0JfQotCi0vLwlwcm90ZWN0ZWQgSmF4YlBsYXRmb3JtLlZlcnNpb24gZ2V0SmF4YlBsYXRmb3JtVmVyc2lvbigpIHsKLS8vCQlyZXR1cm4gdGhpcy5nZXRKYXhiUGxhdGZvcm0oKS5nZXRKYXhiUGxhdGZvcm1WZXJzaW9uKCk7Ci0vLwl9Ci0KLQlwcm90ZWN0ZWQgSmF4YkZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGxhdGZvcm0oKS5nZXRGYWN0b3J5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEpheGJGaWxlIGdldEpheGJGaWxlKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SmF4YlByb2plY3QoKS5nZXRKYXhiRmlsZShmaWxlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ2FsbGJhY2tDaGFuZ2VTdXBwb3J0Lkxpc3RlbmVyIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgYXNwZWN0Q2hhbmdlZChTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlpZiAodGhpcy5hc3BlY3RUcmlnZ2Vyc1VwZGF0ZShhc3BlY3ROYW1lKSkgewotLy8JCQlTdHJpbmcgbXNnID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSArICIgYXNwZWN0IGNoYW5nZTogIiArIHRoaXMgKyAiOiAiICsgYXNwZWN0TmFtZTsKLS8vCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0vLwkJCW5ldyBFeGNlcHRpb24obXNnKS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JCQl0aGlzLnN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFzcGVjdFRyaWdnZXJzVXBkYXRlKFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiAhIHRoaXMuYXNwZWN0RG9lc05vdFRyaWdnZXJVcGRhdGUoYXNwZWN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXNwZWN0RG9lc05vdFRyaWdnZXJVcGRhdGUoU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJLy8gaWdub3JlIHN0YXRlIGNoYW5nZXMgc28gd2UgZG9uJ3QgZ2V0IGEgc3RhY2sgb3ZlcmZsb3cgOi0pCi0JCS8vIChhbmQgd2UgZG9uJ3QgdXNlIHN0YXRlIGNoYW5nZXMgZXhjZXB0IGhlcmUpCi0JCXJldHVybiAoYXNwZWN0TmFtZSA9PSBudWxsKSB8fAotCQkJCXRoaXMubm9uVXBkYXRlQXNwZWN0TmFtZXMoKS5jb250YWlucyhhc3BlY3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU2V0PFN0cmluZz4gbm9uVXBkYXRlQXNwZWN0TmFtZXMoKSB7Ci0JCXN5bmNocm9uaXplZCAobm9uVXBkYXRlQXNwZWN0TmFtZVNldHMpIHsKLQkJCUhhc2hTZXQ8U3RyaW5nPiBub25VcGRhdGVBc3BlY3ROYW1lcyA9IG5vblVwZGF0ZUFzcGVjdE5hbWVTZXRzLmdldCh0aGlzLmdldENsYXNzKCkpOwotCQkJaWYgKG5vblVwZGF0ZUFzcGVjdE5hbWVzID09IG51bGwpIHsKLQkJCQlub25VcGRhdGVBc3BlY3ROYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJCQl0aGlzLmFkZE5vblVwZGF0ZUFzcGVjdE5hbWVzVG8obm9uVXBkYXRlQXNwZWN0TmFtZXMpOwotCQkJCW5vblVwZGF0ZUFzcGVjdE5hbWVTZXRzLnB1dCh0aGlzLmdldENsYXNzKCksIG5vblVwZGF0ZUFzcGVjdE5hbWVzKTsKLQkJCX0KLQkJCXJldHVybiBub25VcGRhdGVBc3BlY3ROYW1lczsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIEFic3RyYWN0SmF4Yk5vZGU+LCBIYXNoU2V0PFN0cmluZz4+IG5vblVwZGF0ZUFzcGVjdE5hbWVTZXRzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIEFic3RyYWN0SmF4Yk5vZGU+LCBIYXNoU2V0PFN0cmluZz4+KCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb25VcGRhdGVBc3BlY3ROYW1lc1RvKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTZXQ8U3RyaW5nPiBub25VcGRhdGVBc3BlY3ROYW1lcykgewotCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5hZGROb25VcGRhdGVBc3BlY3ROYW1lc1RvKG5vblVwZGF0ZUFzcGVjdE5hbWVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoKSB7Ci0JCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQlpZiAodGhpcy5wYXJlbnQgIT0gbnVsbCkgewotCQkJdGhpcy5wYXJlbnQuc3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEFkYXB0ZXIgdXNlZCB0byBzeW5jaHJvbml6ZSBhIGNvbnRleHQgY29sbGVjdGlvbiBjb250YWluZXIgd2l0aCBpdHMgY29ycmVzcG9uZGluZwotCSAqIHJlc291cmNlIGNvbnRhaW5lci4KLQkgKiBAcGFyYW0gPEM+IHRoZSB0eXBlIG9mIGNvbnRleHQgZWxlbWVudHMKLQkgKiBAcGFyYW0gPFI+IHRoZSB0eXBlIG9mIHJlc291cmNlIGVsZW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25Db250YWluZXI8QywgUj4gewotCi0JCXByb3RlY3RlZCBmaW5hbCBWZWN0b3I8Qz4gY29udGV4dEVsZW1lbnRzID0gbmV3IFZlY3RvcjxDPigpOwotCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uQ29udGFpbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5lcidzIGN1cnJlbnQgc2V0IG9mIHJlc291cmNlIGVsZW1lbnRzLgotCQkgKiBUaGVzZSBhcmUgd2hhdCB0aGUgY29udGV4dCBlbGVtZW50cyB3aWxsIGJlIHN5bmNocm9uaXplZCB0by4KLQkJICovCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYWJsZTxSPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dAotCQkgKiBlbGVtZW50LgotCQkgKi8KLQkJcHJvdGVjdGVkIGFic3RyYWN0IFIgZ2V0UmVzb3VyY2VFbGVtZW50KEMgY29udGV4dEVsZW1lbnQpOwotCi0JCS8qKgotCQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgY29udGV4dCBlbGVtZW50IGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UgZWxlbWVudAotCQkgKi8KLQkJcHJvdGVjdGVkIGFic3RyYWN0IEMgYnVpbGRDb250ZXh0RWxlbWVudChSIHJlc291cmNlRWxlbWVudCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgcHJvcGVydHkgbmFtZSBmb3IgZXZlbnQgbm90aWZpY2F0aW9uIHdoZW4gdGhlIGNvbGxlY3Rpb24gaXMgY2hhbmdlZC4KLQkJICovCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIGNsaWVudHMgbmVlZHMgdG8gY2FsbCBpbml0aWFsaXplIGlmIG5lY2Vzc2FyeQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCWZvciAoUiByZXNvdXJjZUVsZW1lbnQgOiB0aGlzLmdldFJlc291cmNlRWxlbWVudHMoKSkgewotCQkJCXRoaXMuY29udGV4dEVsZW1lbnRzLmFkZCh0aGlzLmJ1aWxkQ29udGV4dEVsZW1lbnQocmVzb3VyY2VFbGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGFuIEl0ZXJhYmxlIG9mIHRoZSBjb250ZXh0IGVsZW1lbnRzCi0JCSAqLwotCQlwdWJsaWMgSXRlcmFibGU8Qz4gZ2V0Q29udGV4dEVsZW1lbnRzKCkgewotCQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxDPih0aGlzLmNvbnRleHRFbGVtZW50cyk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb250ZXh0IGVsZW1lbnRzIGNvbGxlY3Rpb24KLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLmNvbnRleHRFbGVtZW50cy5zaXplKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIGEgY29udGV4dCBlbGVtZW50IGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlIGVsZW1lbnQgYXQgdGhlCi0JCSAqIHNwZWNpZmllZCBpbmRleC4KLQkJICovCi0JCXB1YmxpYyBDIGFkZENvbnRleHRFbGVtZW50KGludCBpbmRleCwgUiByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiB0aGlzLmFkZENvbnRleHRFbGVtZW50XyhpbmRleCwgdGhpcy5idWlsZENvbnRleHRFbGVtZW50KHJlc291cmNlRWxlbWVudCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGNvbnRleHQgZWxlbWVudCB0byB0aGUgY29sbGVjdGlvbiBpZ25vcmluZwotCQkgKiB0aGUgc3BlY2lmaWVkIGluZGV4IGFzIHdlIG9ubHkgaGF2ZSBhIGNvbGxlY3Rpb24KLQkJICovCi0JCXByb3RlY3RlZCBDIGFkZENvbnRleHRFbGVtZW50XyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IGluZGV4LCBDIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlBYnN0cmFjdEpheGJOb2RlLnRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihjb250ZXh0RWxlbWVudCwgdGhpcy5jb250ZXh0RWxlbWVudHMsIHRoaXMuZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkpOwotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNvbnRleHQgZWxlbWVudCBmcm9tIHRoZSBjb250YWluZXIuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZW1vdmVDb250ZXh0RWxlbWVudChDIGVsZW1lbnQpIHsKLQkJCUFic3RyYWN0SmF4Yk5vZGUudGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oZWxlbWVudCwgdGhpcy5jb250ZXh0RWxlbWVudHMsIHRoaXMuZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkpOwotCQl9Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIAotCQlwcm90ZWN0ZWQgdm9pZCBtb3ZlQ29udGV4dEVsZW1lbnQoaW50IGluZGV4LCBDIGVsZW1lbnQpIHsKLQkJCS8vbm8tb3AsIG5vdCBhIGxpc3QKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkYXB0ZXIgdXNlZCB0byBzeW5jaHJvbml6ZSBhIGNvbnRleHQgY29sbGVjdGlvbiBjb250YWluZXIgd2l0aCBpdHMgY29ycmVzcG9uZGluZwotCSAqIHJlc291cmNlIGNvbnRhaW5lci4KLQkgKiBAcGFyYW0gPEM+IHRoZSB0eXBlIG9mIGNvbnRleHQgZWxlbWVudHMKLQkgKiBAcGFyYW0gPFI+IHRoZSB0eXBlIG9mIHJlc291cmNlIGVsZW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIENvbnRleHRDb2xsZWN0aW9uQ29udGFpbmVyPEMgZXh0ZW5kcyBKYXhiQ29udGV4dE5vZGUsIFI+IGV4dGVuZHMgQ29sbGVjdGlvbkNvbnRhaW5lcjxDLCBSPiB7Ci0KLQkJcHJvdGVjdGVkIENvbnRleHRDb2xsZWN0aW9uQ29udGFpbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBVc2luZyB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIsIHN5bmNocm9uaXplIGEgY29udGV4dCBjb250YWluZXIgd2l0aCBpdHMKLQkJICogY29ycmVzcG9uZGluZyByZXNvdXJjZSBjb250YWluZXI6IG1vdmluZywgcmVtb3ZpbmcsIGFuZCBhZGRpbmcgZWxlbWVudHMKLQkJICogYXMgbmVjZXNzYXJ5LgotCQkgKiA8cD4KLQkJICogV2UgY2FuIGRvIHRoaXMgYmVjYXVzZTo8dWw+Ci0JCSAqIDxsaT50aGUgWE1MIHRyYW5zbGF0b3JzIHdpbGwgPGVtPm1vdmU8L2VtPiB0aGUgRU1GIGVsZW1lbnRzIHdoZW4KLQkJICogYXBwcm9wcmlhdGUgKGFzIG9wcG9zZWQgdG8gc2ltcGx5IHJlYnVpbGRpbmcgdGhlbSBpbiBwbGFjZSkuCi0JCSAqIDxsaT50aGUgSmF2YSByZXNvdXJjZSBtb2RlbCB3aWxsIHJlLXVzZSBleGlzdGluZyBhbm5vdGF0aW9ucyB3aGVuCi0JCSAqIGFwcHJvcHJpYXRlIChhcyBvcHBvc2VkIHRvIHNpbXBseSByZWJ1aWxkaW5nIHRoZW0gaW4gcGxhY2UpLgotCQkgKiA8L3VsPgotCQkgKi8KLQkJcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJCXN5bmModHJ1ZSk7ICAvLyB0cnVlID0gc3luYwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgI3N5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoQWRhcHRlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJCXN5bmMoZmFsc2UpOyAgLy8gZmFsc2UgPSB1cGRhdGUKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgc3BlY2lmaWVkIDxjb2RlPnN5bmM8L2NvZGU+IGZsYWcgY29udHJvbHMgd2hldGhlciBhbnkgc3Vydml2aW5nCi0JCSAqIGNvbnRleHQgbm9kZXMgYXJlIGVpdGhlciA8ZW0+c3luY2hyb25pemVkPC9lbT4gKDxjb2RlPnRydWU8L2NvZGU+KSBvcgotCQkgKiA8ZW0+dXBkYXRlZDwvZW0+ICg8Y29kZT5mYWxzZTwvY29kZT4pLgotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc3luYyhib29sZWFuIHN5bmMpIHsKLQkJCUhhc2hTZXQ8Qz4gY29udGV4dEVsZW1lbnRzID0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmdldENvbnRleHRFbGVtZW50cygpKTsKLQkJCWludCByZXNvdXJjZUluZGV4ID0gMDsKLQotCQkJZm9yIChSIHJlc291cmNlRWxlbWVudCA6IHRoaXMuZ2V0UmVzb3VyY2VFbGVtZW50cygpKSB7Ci0JCQkJYm9vbGVhbiBtYXRjaCA9IGZhbHNlOwotCQkJCWZvciAoSXRlcmF0b3I8Qz4gc3RyZWFtID0gY29udGV4dEVsZW1lbnRzLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCQlDIGNvbnRleHRFbGVtZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJCQkJaWYgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMuZ2V0UmVzb3VyY2VFbGVtZW50KGNvbnRleHRFbGVtZW50KSwgcmVzb3VyY2VFbGVtZW50KSkgewotCQkJCQkJLy8gd2UgZG9uJ3Qga25vdyB0aGUgc291cmNlIGluZGV4IGJlY2F1c2UgdGhlIGVsZW1lbnQgaGFzIGJlZW4gbW92ZWQgYnkgcHJldmlvdXNseSBtb3ZlZCBlbGVtZW50cwotCQkJCQkJdGhpcy5tb3ZlQ29udGV4dEVsZW1lbnQocmVzb3VyY2VJbmRleCwgY29udGV4dEVsZW1lbnQpOwotCQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCQkJaWYgKHN5bmMpIHsKLQkJCQkJCQljb250ZXh0RWxlbWVudC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWNvbnRleHRFbGVtZW50LnVwZGF0ZSgpOwotCQkJCQkJfQotCQkJCQkJbWF0Y2ggPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCAhIG1hdGNoKSB7Ci0JCQkJCS8vIGFkZGVkIGVsZW1lbnRzIGFyZSBzeW5jJ2VkIGR1cmluZyBjb25zdHJ1Y3Rpb24gb3Igd2lsbCBiZQotCQkJCQkvLyB1cGRhdGVkIGR1cmluZyB0aGUgbmV4dCAidXBkYXRlIiAod2hpY2ggaXMgdHJpZ2dlcmVkIGJ5Ci0JCQkJCS8vIHRoZWlyIGFkZGl0aW9uIHRvIHRoZSBtb2RlbCkKLQkJCQkJdGhpcy5hZGRDb250ZXh0RWxlbWVudChyZXNvdXJjZUluZGV4LCByZXNvdXJjZUVsZW1lbnQpOwotCQkJCX0KLQkJCQlyZXNvdXJjZUluZGV4Kys7Ci0JCQl9Ci0JCQkvLyByZW1vdmUgYW55IGxlZnRvdmVyIGNvbnRleHQgZWxlbWVudHMKLQkJCWZvciAoQyBjb250ZXh0RWxlbWVudCA6IGNvbnRleHRFbGVtZW50cykgewotCQkJCXRoaXMucmVtb3ZlQ29udGV4dEVsZW1lbnQoY29udGV4dEVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRhcHRlciB1c2VkIHRvIHN5bmNocm9uaXplIGEgY29udGV4dCBsaXN0IGNvbnRhaW5lciB3aXRoIGl0cyBjb3JyZXNwb25kaW5nCi0JICogcmVzb3VyY2UgY29udGFpbmVyLgotCSAqIEBwYXJhbSA8Qz4gdGhlIHR5cGUgb2YgY29udGV4dCBlbGVtZW50cwotCSAqIEBwYXJhbSA8Uj4gdGhlIHR5cGUgb2YgcmVzb3VyY2UgZWxlbWVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgTGlzdENvbnRhaW5lcjxDLCBSPgotCQlleHRlbmRzIENvbGxlY3Rpb25Db250YWluZXI8QywgUj4gewotCi0JCXByb3RlY3RlZCBMaXN0Q29udGFpbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEM+IGdldENvbnRleHRFbGVtZW50cygpIHsKLQkJCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPEM+KHRoaXMuY29udGV4dEVsZW1lbnRzKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdEl0ZXJhYmxlPFI+IGdldFJlc291cmNlRWxlbWVudHMoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGNvbnRleHQgZWxlbWVudC4KLQkJICovCi0JCXB1YmxpYyBpbnQgaW5kZXhPZkNvbnRleHRFbGVtZW50KEMgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiB0aGlzLmNvbnRleHRFbGVtZW50cy5pbmRleE9mKGNvbnRleHRFbGVtZW50KTsKLQkJfQotCi0JCXB1YmxpYyBDIGdldENvbnRleHRFbGVtZW50KGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMuY29udGV4dEVsZW1lbnRzLmVsZW1lbnRBdChpbmRleCk7Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIGEgY29udGV4dCBlbGVtZW50IGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlIGVsZW1lbnQgYXQgdGhlCi0JCSAqIHNwZWNpZmllZCBpbmRleC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQyBhZGRDb250ZXh0RWxlbWVudF8oaW50IGluZGV4LCBDIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlBYnN0cmFjdEpheGJOb2RlLnRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgY29udGV4dEVsZW1lbnQsIHRoaXMuY29udGV4dEVsZW1lbnRzLCB0aGlzLmdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpKTsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBNb3ZlIHRoZSBjb250ZXh0IGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCB0YXJnZXQgaW5kZXggdG8gdGhlIAotCQkgKiBzcGVjaWZpZWQgc291cmNlIGluZGV4LgotCQkgKi8KLQkJcHVibGljIHZvaWQgbW92ZUNvbnRleHRFbGVtZW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCQl0aGlzLm1vdmVDb250ZXh0RWxlbWVudCh0YXJnZXRJbmRleCwgdGhpcy5jb250ZXh0RWxlbWVudHMuZ2V0KHNvdXJjZUluZGV4KSk7Ci0JCX0KLQotCQkvKioKLQkJICogTW92ZSB0aGUgc3BlY2lmaWVkIGNvbnRleHQgZWxlbWVudCB0byB0aGUgc3BlY2lmaWVkIGluZGV4LgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIG1vdmVDb250ZXh0RWxlbWVudChpbnQgaW5kZXgsIEMgZWxlbWVudCkgewotCQkJQWJzdHJhY3RKYXhiTm9kZS50aGlzLm1vdmVJdGVtSW5MaXN0KGluZGV4LCBlbGVtZW50LCB0aGlzLmNvbnRleHRFbGVtZW50cywgdGhpcy5nZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmVtb3ZlIHRoZSBjb250ZXh0IGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBmcm9tIHRoZSBjb250YWluZXIuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZW1vdmVDb250ZXh0RWxlbWVudChpbnQgaW5kZXgpIHsKLQkJCUFic3RyYWN0SmF4Yk5vZGUudGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMuY29udGV4dEVsZW1lbnRzLCB0aGlzLmdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCQlMaXN0SXRlcmFibGU8Uj4gcmVzb3VyY2VFbGVtZW50cyA9IGdldFJlc291cmNlRWxlbWVudHMoKTsKLQkJCQotCQkJaW50IGluZGV4ID0gMDsKLQkJCWZvciAoUiByZXNvdXJjZUVsZW1lbnQgOiByZXNvdXJjZUVsZW1lbnRzKSB7Ci0JCQkJaWYgKHRoaXMuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpID4gaW5kZXgpIHsKLQkJCQkJaWYgKHRoaXMuZ2V0Q29udGV4dEVsZW1lbnQoaW5kZXgpICE9IHJlc291cmNlRWxlbWVudCkgewotCQkJCQkJdGhpcy5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgcmVzb3VyY2VFbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGhpcy5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgcmVzb3VyY2VFbGVtZW50KTsJCQkKLQkJCQl9Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJCQotCQkJZm9yICggOyBpbmRleCA8IHRoaXMuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOyApIHsKLQkJCQl0aGlzLnJlbW92ZUNvbnRleHRFbGVtZW50KGluZGV4KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkYXB0ZXIgdXNlZCB0byBzeW5jaHJvbml6ZSBhIGNvbnRleHQgbGlzdCBjb250YWluZXIgd2l0aCBpdHMgY29ycmVzcG9uZGluZwotCSAqIHJlc291cmNlIGNvbnRhaW5lci4KLQkgKiBAcGFyYW0gPEM+IHRoZSB0eXBlIG9mIGNvbnRleHQgZWxlbWVudHMKLQkgKiBAcGFyYW0gPFI+IHRoZSB0eXBlIG9mIHJlc291cmNlIGVsZW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIENvbnRleHRMaXN0Q29udGFpbmVyPEMgZXh0ZW5kcyBKYXhiQ29udGV4dE5vZGUsIFI+Ci0JCWV4dGVuZHMgQ29udGV4dENvbGxlY3Rpb25Db250YWluZXI8QywgUj4gewotCi0JCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIExpc3RJdGVyYWJsZTxDPiBnZXRDb250ZXh0RWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxDPih0aGlzLmNvbnRleHRFbGVtZW50cyk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGFic3RyYWN0IExpc3RJdGVyYWJsZTxSPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBjb250ZXh0IGVsZW1lbnQuCi0JCSAqLwotCQlwdWJsaWMgaW50IGluZGV4T2ZDb250ZXh0RWxlbWVudChDIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gdGhpcy5jb250ZXh0RWxlbWVudHMuaW5kZXhPZihjb250ZXh0RWxlbWVudCk7Ci0JCX0KLQotCQlwdWJsaWMgQyBnZXRDb250ZXh0RWxlbWVudChpbnQgaW5kZXgpIHsKLQkJCXJldHVybiB0aGlzLmNvbnRleHRFbGVtZW50cy5lbGVtZW50QXQoaW5kZXgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCBhIGNvbnRleHQgZWxlbWVudCBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBlbGVtZW50IGF0IHRoZQotCQkgKiBzcGVjaWZpZWQgaW5kZXguCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEMgYWRkQ29udGV4dEVsZW1lbnRfKGludCBpbmRleCwgQyBjb250ZXh0RWxlbWVudCkgewotCQkJQWJzdHJhY3RKYXhiTm9kZS50aGlzLmFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGNvbnRleHRFbGVtZW50LCB0aGlzLmNvbnRleHRFbGVtZW50cywgdGhpcy5nZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSk7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogTW92ZSB0aGUgY29udGV4dCBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGluZGV4IHRvIHRoZSAKLQkJICogc3BlY2lmaWVkIHNvdXJjZSBpbmRleC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vdmVDb250ZXh0RWxlbWVudChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJdGhpcy5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHRoaXMuY29udGV4dEVsZW1lbnRzLmdldChzb3VyY2VJbmRleCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIE1vdmUgdGhlIHNwZWNpZmllZCBjb250ZXh0IGVsZW1lbnQgdG8gdGhlIHNwZWNpZmllZCBpbmRleC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBtb3ZlQ29udGV4dEVsZW1lbnQoaW50IGluZGV4LCBDIGVsZW1lbnQpIHsKLQkJCUFic3RyYWN0SmF4Yk5vZGUudGhpcy5tb3ZlSXRlbUluTGlzdChpbmRleCwgZWxlbWVudCwgdGhpcy5jb250ZXh0RWxlbWVudHMsIHRoaXMuZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgY29udGV4dCBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZnJvbSB0aGUgY29udGFpbmVyLgotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ29udGV4dEVsZW1lbnQoaW50IGluZGV4KSB7Ci0JCQlBYnN0cmFjdEpheGJOb2RlLnRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLmNvbnRleHRFbGVtZW50cywgdGhpcy5nZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcmVtb3ZlQ29udGV4dEVsZW1lbnQoQyBjb250ZXh0RWxlbWVudCkgewotCQkJQWJzdHJhY3RKYXhiTm9kZS50aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChjb250ZXh0RWxlbWVudCwgdGhpcy5jb250ZXh0RWxlbWVudHMsIHRoaXMuZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RKYXhiUGxhdGZvcm1EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9BYnN0cmFjdEpheGJQbGF0Zm9ybURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ3NWUzYS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9BYnN0cmFjdEpheGJQbGF0Zm9ybURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uOwotCi0vKioKLSAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIEpBWEIgcGxhdGZvcm0gZGVmaW5pdGlvbiBzaG91bGQgYmUgInN0YXRpYyIgCi0gKiAoaS5lLiB1bmNoYW5naW5nIG9uY2UgaXQgaXMgaW5pdGlhbGl6ZWQpLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXhiUGxhdGZvcm1EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiB7Ci0JCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGphdmFUb1NjaGVtYVR5cGVzOwotCQotCXByaXZhdGUgQW5ub3RhdGlvbkRlZmluaXRpb25bXSBhbm5vdGF0aW9uRGVmaW5pdGlvbnM7Ci0KLQlwcml2YXRlIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25bXSBuZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uczsKLQkKLQlwcml2YXRlIEpheGJSZXNvdXJjZU1vZGVsUHJvdmlkZXJbXSByZXNvdXJjZU1vZGVsUHJvdmlkZXJzOwotCi0JcHJpdmF0ZSBBcnJheUxpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnM7Ci0KLQlwcml2YXRlIEFycmF5TGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IHNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnM7Ci0KLS8vCXByaXZhdGUgUmVzb3VyY2VEZWZpbml0aW9uW10gcmVzb3VyY2VEZWZpbml0aW9uczsKLQotCi0JLyoqCi0JICogemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEpheGJQbGF0Zm9ybURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHBsYXRmb3JtLXkgdGhpbmdzICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWFUeXBlTWFwcGluZyhTdHJpbmcgamF2YVR5cGVOYW1lKSB7Ci0JCWlmICh0aGlzLmphdmFUb1NjaGVtYVR5cGVzID09IG51bGwpIHsKLQkJCSB0aGlzLmphdmFUb1NjaGVtYVR5cGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCQkgdGhpcy5qYXZhVG9TY2hlbWFUeXBlcy5wdXRBbGwoYnVpbGRKYXZhVG9TY2hlbWFUeXBlcygpKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhVG9TY2hlbWFUeXBlcy5nZXQoamF2YVR5cGVOYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFN0cmluZz4gYnVpbGRKYXZhVG9TY2hlbWFUeXBlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBhbm5vdGF0aW9uIGRlZmluaXRpb25zICoqKioqKioqKioKLQkKLQlwdWJsaWMgQW5ub3RhdGlvbkRlZmluaXRpb25bXSBnZXRBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSB7Ci0JCWlmICh0aGlzLmFubm90YXRpb25EZWZpbml0aW9ucyA9PSBudWxsKSB7Ci0JCQl0aGlzLmFubm90YXRpb25EZWZpbml0aW9ucyA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uRGVmaW5pdGlvbnM7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBBbm5vdGF0aW9uRGVmaW5pdGlvbltdIGJ1aWxkQW5ub3RhdGlvbkRlZmluaXRpb25zKCk7Ci0KLQotCS8vICoqKioqKioqKiogbmVzdGFibGUgYW5ub3RhdGlvbiBkZWZpbml0aW9ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbltdIGdldE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zKCkgewotCQlpZiAodGhpcy5uZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucyA9PSBudWxsKSB7Ci0JCQl0aGlzLm5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zID0gdGhpcy5idWlsZE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnM7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25bXSBidWlsZE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zKCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSBtb2RlbHMgKioqKioqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmFibGU8SmF4YlJlc291cmNlTW9kZWxQcm92aWRlcj4gZ2V0UmVzb3VyY2VNb2RlbFByb3ZpZGVycygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYWJsZTxKYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyPihnZXRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzXygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBKYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gZ2V0UmVzb3VyY2VNb2RlbFByb3ZpZGVyc18oKSB7Ci0JCWlmICh0aGlzLnJlc291cmNlTW9kZWxQcm92aWRlcnMgPT0gbnVsbCkgewotCQkJdGhpcy5yZXNvdXJjZU1vZGVsUHJvdmlkZXJzID0gdGhpcy5idWlsZFJlc291cmNlTW9kZWxQcm92aWRlcnMoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZU1vZGVsUHJvdmlkZXJzOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSmF4YlJlc291cmNlTW9kZWxQcm92aWRlcltdIGJ1aWxkUmVzb3VyY2VNb2RlbFByb3ZpZGVycygpOwotCi0KLQkvLyAqKioqKioqKioqIEphdmEgYXR0cmlidXRlIG1hcHBpbmdzICoqKioqKioqKioKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSXRlcmFibGU8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZ2V0RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0JCWlmICh0aGlzLmRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zID09IG51bGwpIHsKLQkJCXRoaXMuZGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMgPSB0aGlzLmJ1aWxkRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5kZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uczsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGJ1aWxkRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0JCUFycmF5TGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucyA9IG5ldyBBcnJheUxpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4oKTsKLQkJdGhpcy5hZGREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKGRlZmluaXRpb25zKTsKLQkJcmV0dXJuIGRlZmluaXRpb25zOwotCX0KLQotCS8qKgotCSAqIFRvIHRoZSBzcGVjaWZpZWQgbGlzdCwgYWRkIG1hcHBpbmcgZGVmaW5pdGlvbnMgdG8gdXNlIGZvciBhbmFseXppbmcgdGhlCi0JICogZGVmYXVsdCBtYXBwaW5nIG9mIGFuIGF0dHJpYnV0ZS4gVGhlIG9yZGVyIGlzIGltcG9ydGFudCwKLQkgKiBhcyBvbmNlIGEgbWFwcGluZyBkZWZpbml0aW9uIHRlc3RzIHBvc2l0aXZlIGZvciBhbiBhdHRyaWJ1dGUsCi0JICogYWxsIGZvbGxvd2luZyBtYXBwaW5nIGRlZmluaXRpb25zIGFyZSBpZ25vcmVkLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKTsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSXRlcmFibGU8SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBnZXRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQlpZiAodGhpcy5zcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zID09IG51bGwpIHsKLQkJCXRoaXMuc3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucyA9IHRoaXMuYnVpbGRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uczsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gYnVpbGRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQlBcnJheUxpc3Q8SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPigpOwotCQl0aGlzLmFkZFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhkZWZpbml0aW9ucyk7Ci0JCXJldHVybiBkZWZpbml0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBUbyB0aGUgc3BlY2lmaWVkIGxpc3QsIGFkZCBtYXBwaW5nIGRlZmluaXRpb25zIHRvIHVzZSBmb3IgYW5hbHl6aW5nIHRoZQotCSAqIHNwZWNpZmllZCBtYXBwaW5nIG9mIGFuIGF0dHJpYnV0ZSBnaXZlbiBhbGwgYW5ub3RhdGlvbnMgb24gaXQuIFRoZSBvcmRlcgotCSAqIGlzIGltcG9ydGFudCwgYXMgb25jZSBhIG1hcHBpbmcgZGVmaW5pdGlvbiB0ZXN0cyBwb3NpdGl2ZSBmb3IgYW4KLQkgKiBhdHRyaWJ1dGUsIGFsbCBmb2xsb3dpbmcgbWFwcGluZyBkZWZpbml0aW9ucyBhcmUgaWdub3JlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpOwotCi0KLS8vCS8vICoqKioqKioqKiogTWFwcGluZyBGaWxlcyAqKioqKioqKioqCi0vLwkKLS8vCXB1YmxpYyBMaXN0SXRlcmF0b3I8UmVzb3VyY2VEZWZpbml0aW9uPiByZXNvdXJjZURlZmluaXRpb25zKCkgewotLy8JCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8UmVzb3VyY2VEZWZpbml0aW9uPihnZXRSZXNvdXJjZURlZmluaXRpb25zKCkpOwotLy8JfQotLy8JCi0vLwlwcm90ZWN0ZWQgc3luY2hyb25pemVkIFJlc291cmNlRGVmaW5pdGlvbltdIGdldFJlc291cmNlRGVmaW5pdGlvbnMoKSB7Ci0vLwkJaWYgKHRoaXMucmVzb3VyY2VEZWZpbml0aW9ucyA9PSBudWxsKSB7Ci0vLwkJCXRoaXMucmVzb3VyY2VEZWZpbml0aW9ucyA9IHRoaXMuYnVpbGRSZXNvdXJjZURlZmluaXRpb25zKCk7Ci0vLwkJfQotLy8JCXJldHVybiB0aGlzLnJlc291cmNlRGVmaW5pdGlvbnM7Ci0vLwl9Ci0vLwkKLS8vCXByb3RlY3RlZCBhYnN0cmFjdCBSZXNvdXJjZURlZmluaXRpb25bXSBidWlsZFJlc291cmNlRGVmaW5pdGlvbnMoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL0Fic3RyYWN0SmF4YlByb2plY3QuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL0Fic3RyYWN0SmF4YlByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg2YmJiMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9BYnN0cmFjdEpheGJQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlBsYXRmb3JtVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLlByb2plY3RSZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZUluZm9Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuY29tbWFuZC5FeHRlbmRlZENvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQml0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLk5vdE51bGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLmNvbW1hbmQuVGhyZWFkTG9jYWxFeHRlbmRlZENvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU25hcHNob3RDbG9uZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVycy5DYWxsYmFja1N5bmNocm9ub3VzU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzLlN5bmNocm9ub3VzU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5zeW5jaHJvbml6ZXJzLkNhbGxiYWNrU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5zeW5jaHJvbml6ZXJzLlN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KcHRKYXhiQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLlNjaGVtYUxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDb250ZXh0Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uSmF4YlBsYXRmb3JtSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmxpYnByb3YuSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXhiaW5kZXguSmF4YkluZGV4UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXhicHJvcHMuSmF4YlByb3BlcnRpZXNSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LklMaWJyYXJ5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5MaWJyYXJ5SW5zdGFsbERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBKQVhCIHByb2plY3QuIEhvbGRzIGFsbCB0aGUgSkFYQiBzdHVmZi4KLSAqIAotICogVGhlIEpBWEIgcGxhdGZvcm0gcHJvdmlkZXMgdGhlIGhvb2tzIGZvciB2ZW5kb3Itc3BlY2lmaWMgc3R1ZmYuCi0gKiAKLSAqIFRoZSBKQVhCIGZpbGVzIGFyZSB0aGUgInJlc291cmNlIiBtb2RlbCAoaS5lLiBvYmplY3RzIHRoYXQgY29ycmVzcG9uZCBkaXJlY3RseQotICogdG8gRWNsaXBzZSByZXNvdXJjZXM7IGUuZy4gSmF2YSBzb3VyY2UgY29kZSBmaWxlcywgWE1MIGZpbGVzLCBKQVIgZmlsZXMpLgotICogCi0gKiBUaGUgcm9vdCBjb250ZXh0IG5vZGUgaXMgdGhlICJjb250ZXh0IiBtb2RlbCAoaS5lLiBvYmplY3RzIHRoYXQgYXR0ZW1wdCB0bwotICogbW9kZWwgdGhlIEpBWEIgc3BlYywgdXNpbmcgdGhlICJyZXNvdXJjZSIgbW9kZWwgYXMgYW4gYWRhcHRlciB0byB0aGUgRWNsaXBzZQotICogcmVzb3VyY2VzKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF4YlByb2plY3QKLQlleHRlbmRzIEFic3RyYWN0SmF4Yk5vZGUKLQlpbXBsZW1lbnRzIEpheGJQcm9qZWN0IHsKLQkKLQkvKioKLQkgKiBUaGUgRWNsaXBzZSBwcm9qZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIEpBWEIgcHJvamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSVByb2plY3QgcHJvamVjdDsKLQkKLQkvKioKLQkgKiBUaGUgdmVuZG9yLXNwZWNpZmljIEpBWEIgcGxhdGZvcm0gdGhhdCBidWlsZHMgdGhlIEpBWEIgcHJvamVjdAotCSAqIGFuZCBhbGwgaXRzIGNvbnRlbnRzLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBKYXhiUGxhdGZvcm0gamF4YlBsYXRmb3JtOwotCQotCS8qKgotCSAqIFRoZSBsaWJyYXJ5IG9mIHNjaGVtYXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTY2hlbWFMaWJyYXJ5SW1wbCBzY2hlbWFMaWJyYXJ5OwotCQotCS8qKgotCSAqIFRoZSBKQVhCIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSkFYQiBwcm9qZWN0OgotCSAqICAgICBqYXZhCi0JICogICAgIGpheGIuaW5kZXgKLQkgKiAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZmlsZXMKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPEpheGJGaWxlPiBqYXhiRmlsZXMgPSBuZXcgVmVjdG9yPEpheGJGaWxlPigpOwotCi0vLwkvKioKLS8vCSAqIFRoZSAiZXh0ZXJuYWwiIEphdmEgcmVzb3VyY2UgY29tcGlsYXRpb24gdW5pdHMgKHNvdXJjZSkuIFBvcHVsYXRlZCB1cG9uIGRlbWFuZC4KLS8vCSAqLwotLy8JcHJvdGVjdGVkIGZpbmFsIFZlY3RvcjxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ+IGV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cyA9IG5ldyBWZWN0b3I8SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0PigpOwotLy8KLS8vCS8qKgotLy8JICogVGhlICJleHRlcm5hbCIgSmF2YSByZXNvdXJjZSBwZXJzaXN0ZW50IHR5cGVzIChiaW5hcnkpLiBQb3B1bGF0ZWQgdXBvbiBkZW1hbmQuCi0vLwkgKi8KLS8vCXByb3RlY3RlZCBmaW5hbCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlIGV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVDYWNoZTsKLQotCS8qKgotCSAqIFJlc291cmNlIG1vZGVscyBub3RpZnkgdGhpcyBsaXN0ZW5lciB3aGVuIHRoZXkgY2hhbmdlLiBBIHByb2plY3QgdXBkYXRlCi0JICogc2hvdWxkIG9jY3VyIGFueSB0aW1lIGEgcmVzb3VyY2UgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyIHJlc291cmNlTW9kZWxMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFRoZSByb290IG9mIHRoZSBtb2RlbCByZXByZXNlbnRpbmcgdGhlIGNvbGxhdGVkIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggCi0JICogdGhlIEpBWEIgcHJvamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSmF4YkNvbnRleHRSb290IGNvbnRleHRSb290OwotCi0JLyoqCi0JICogQSBwbHVnZ2FibGUgc3luY2hyb25pemVyIHRoYXQga2VlcHMgdGhlIEpBWEIKLQkgKiBwcm9qZWN0J3MgY29udGV4dCBtb2RlbCBzeW5jaHJvbml6ZWQgd2l0aCBpdHMgcmVzb3VyY2UgbW9kZWwsIGVpdGhlcgotCSAqIHN5bmNocm9ub3VzbHkgb3IgYXN5bmNocm9ub3VzbHkgKG9yIG5vdCBhdCBhbGwpLiBBIHN5bmNocm9ub3VzIHN5bmNocm9uaXplcgotCSAqIGlzIHRoZSBkZWZhdWx0LiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgYSBVSSBzaG91bGQKLQkgKiBpbW1lZGlhdGVseSBjaGFuZ2UgdGhpcyB0byBhbiBhc3luY2hyb25vdXMgc3luY2hyb25pemVyLiBBIHN5bmNocm9ub3VzCi0JICogc3luY2hyb25pemVyIGNhbiBiZSB1c2VkIHdoZW4gdGhlIHByb2plY3QgaXMgYmVpbmcgbWFuaXB1bGF0ZWQgYnkgYSAiYmF0Y2giCi0JICogKG9yIG5vbi1VSSkgY2xpZW50IChlLmcuIHdoZW4gdGVzdGluZyAic3luY2hyb25pemF0aW9uIikuIEEgbnVsbCB1cGRhdGVyCi0JICogY2FuIHVzZWQgZHVyaW5nIHRlc3RzIHRoYXQgZG8gbm90IGNhcmUgd2hldGhlciAic3luY2hyb25pemF0aW9uIiBvY2N1ci4KLQkgKiBDbGllbnRzIHdpbGwgbmVlZCB0byBleHBsaWNpdGx5IGNvbmZpZ3VyZSB0aGUgc3luY2hyb25pemVyIGlmIHRoZXkgcmVxdWlyZQotCSAqIGFuIGFzeW5jaHJvbm91cyBzeW5jaHJvbml6ZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvbGF0aWxlIFN5bmNocm9uaXplciBjb250ZXh0TW9kZWxTeW5jaHJvbml6ZXI7Ci0JcHJvdGVjdGVkIHZvbGF0aWxlIGJvb2xlYW4gc3luY2hyb25pemluZ0NvbnRleHRNb2RlbCA9IGZhbHNlOwotCi0JLyoqCi0JICogQSBwbHVnZ2FibGUgc3luY2hyb25pemVyIHRoYXQgInVwZGF0ZXMiIHRoZSBKQVhCIHByb2plY3QsIGVpdGhlcgotCSAqIHN5bmNocm9ub3VzbHkgb3IgYXN5bmNocm9ub3VzbHkgKG9yIG5vdCBhdCBhbGwpLiBBIHN5bmNocm9ub3VzIHVwZGF0ZXIKLQkgKiBpcyB0aGUgZGVmYXVsdCwgYWxsb3dpbmcgYSBuZXdseS1jb25zdHJ1Y3RlZCBKQVhCIHByb2plY3QgdG8gYmUgInVwZGF0ZWQiCi0JICogdXBvbiByZXR1cm4gZnJvbSB0aGUgY29uc3RydWN0b3IuIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBhIFVJIHNob3VsZAotCSAqIGltbWVkaWF0ZWx5IGNoYW5nZSB0aGlzIHRvIGFuIGFzeW5jaHJvbm91cyB1cGRhdGVyLiBBIHN5bmNocm9ub3VzCi0JICogdXBkYXRlciBjYW4gYmUgdXNlZCB3aGVuIHRoZSBwcm9qZWN0IGlzIGJlaW5nIG1hbmlwdWxhdGVkIGJ5IGEgImJhdGNoIgotCSAqIChvciBub24tVUkpIGNsaWVudCAoZS5nLiB3aGVuIHRlc3RpbmcgdGhlICJ1cGRhdGUiIGJlaGF2aW9yKS4gQSBudWxsCi0JICogdXBkYXRlciBjYW4gdXNlZCBkdXJpbmcgdGVzdHMgdGhhdCBkbyBub3QgY2FyZSB3aGV0aGVyICJzeW5jaHJvbml6YXRpb24iCi0JICogb2NjdXIuCi0JICogQ2xpZW50cyB3aWxsIG5lZWQgdG8gZXhwbGljaXRseSBjb25maWd1cmUgdGhlIHVwZGF0ZXIgaWYgdGhleSByZXF1aXJlCi0JICogYW4gYXN5bmNocm9ub3VzIHVwZGF0ZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvbGF0aWxlIENhbGxiYWNrU3luY2hyb25pemVyIHVwZGF0ZVN5bmNocm9uaXplcjsKLQlwcm90ZWN0ZWQgZmluYWwgQ2FsbGJhY2tTeW5jaHJvbml6ZXIuTGlzdGVuZXIgdXBkYXRlU3luY2hyb25pemVyTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBTdXBwb3J0IGZvciBtb2RpZnlpbmcgZG9jdW1lbnRzIHNoYXJlZCB3aXRoIHRoZSBVSS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGhyZWFkTG9jYWxFeHRlbmRlZENvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXhiUHJvamVjdChKYXhiUHJvamVjdC5Db25maWcgY29uZmlnKSB7Ci0JCXN1cGVyKG51bGwpOyAgLy8gSlBBIHByb2plY3QgaXMgdGhlIHJvb3Qgb2YgdGhlIGNvbnRhaW5tZW50IHRyZWUKLQkJaWYgKChjb25maWcuZ2V0UHJvamVjdCgpID09IG51bGwpIHx8IChjb25maWcuZ2V0UGxhdGZvcm1EZWZpbml0aW9uKCkgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucHJvamVjdCA9IGNvbmZpZy5nZXRQcm9qZWN0KCk7Ci0JCXRoaXMuamF4YlBsYXRmb3JtID0gbmV3IEpheGJQbGF0Zm9ybUltcGwoY29uZmlnLmdldFBsYXRmb3JtRGVmaW5pdGlvbigpKTsKLQkJCi0JCXRoaXMuc2NoZW1hTGlicmFyeSA9IG5ldyBTY2hlbWFMaWJyYXJ5SW1wbCh0aGlzKTsKLQkJCi0JCXRoaXMubW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IgPSB0aGlzLmJ1aWxkTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKTsKLQotCQl0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lciA9IHRoaXMuYnVpbGRSZXNvdXJjZU1vZGVsTGlzdGVuZXIoKTsKLQkJLy8gYnVpbGQgdGhlIEpQQSBmaWxlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBFY2xpcHNlIHByb2plY3QncyBmaWxlcwotCQlJbml0aWFsUmVzb3VyY2VQcm94eVZpc2l0b3IgdmlzaXRvciA9IHRoaXMuYnVpbGRJbml0aWFsUmVzb3VyY2VQcm94eVZpc2l0b3IoKTsKLQkJdmlzaXRvci52aXNpdFByb2plY3QodGhpcy5wcm9qZWN0KTsKLQotLy8JCXRoaXMuZXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlID0gdGhpcy5idWlsZEV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVDYWNoZSgpOwotCi0JCXRoaXMuY29udGV4dFJvb3QgPSB0aGlzLmJ1aWxkQ29udGV4dFJvb3QoKTsKLQotCQkvLyB0aGVyZSAqc2hvdWxkbid0KiBiZSBhbnkgY2hhbmdlcyB0byB0aGUgcmVzb3VyY2UgbW9kZWwuLi4KLQkJdGhpcy5zZXRDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXJfKHRoaXMuYnVpbGRTeW5jaHJvbm91c0NvbnRleHRNb2RlbFN5bmNocm9uaXplcigpKTsKLQotCQl0aGlzLnVwZGF0ZVN5bmNocm9uaXplckxpc3RlbmVyID0gdGhpcy5idWlsZFVwZGF0ZVN5bmNocm9uaXplckxpc3RlbmVyKCk7Ci0JCS8vICJ1cGRhdGUiIHRoZSBwcm9qZWN0IGJlZm9yZSByZXR1cm5pbmcKLQkJdGhpcy5zZXRVcGRhdGVTeW5jaHJvbml6ZXJfKHRoaXMuYnVpbGRTeW5jaHJvbm91c1VwZGF0ZVN5bmNocm9uaXplcigpKTsKLQotLy8JCS8vIHN0YXJ0IGxpc3RlbmluZyB0byB0aGlzIGNhY2hlIG9uY2UgdGhlIGNvbnRleHQgbW9kZWwgaGFzIGJlZW4gYnVpbHQKLS8vCQkvLyBhbmQgYWxsIHRoZSBleHRlcm5hbCB0eXBlcyBhcmUgZmF1bHRlZCBpbgotLy8JCXRoaXMuZXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlLmFkZFJlc291cmNlTW9kZWxMaXN0ZW5lcih0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWlyZXNQYXJlbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJvamVjdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGhyZWFkTG9jYWxFeHRlbmRlZENvbW1hbmRFeGVjdXRvciBidWlsZE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCkgewotCQlyZXR1cm4gbmV3IFRocmVhZExvY2FsRXh0ZW5kZWRDb21tYW5kRXhlY3V0b3IoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW5pdGlhbFJlc291cmNlUHJveHlWaXNpdG9yIGJ1aWxkSW5pdGlhbFJlc291cmNlUHJveHlWaXNpdG9yKCkgewotCQlyZXR1cm4gbmV3IEluaXRpYWxSZXNvdXJjZVByb3h5VmlzaXRvcigpOwotCX0KLS8vCi0vLwlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVDYWNoZSBidWlsZEV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVDYWNoZSgpIHsKLS8vCQlyZXR1cm4gbmV3IEJpbmFyeVBlcnNpc3RlbnRUeXBlQ2FjaGUodGhpcy5qcGFQbGF0Zm9ybS5nZXRBbm5vdGF0aW9uUHJvdmlkZXIoKSk7Ci0vLwl9Ci0KLQlwcm90ZWN0ZWQgSmF4YkNvbnRleHRSb290IGJ1aWxkQ29udGV4dFJvb3QoKSB7Ci0JCXJldHVybiB0aGlzLmdldEZhY3RvcnkoKS5idWlsZENvbnRleHRSb290KHRoaXMpOwotCX0KLQotCS8vICoqKioqIGlubmVyIGNsYXNzCi0JcHJvdGVjdGVkIGNsYXNzIEluaXRpYWxSZXNvdXJjZVByb3h5VmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZVByb3h5VmlzaXRvciB7Ci0JCXByb3RlY3RlZCBJbml0aWFsUmVzb3VyY2VQcm94eVZpc2l0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXByb3RlY3RlZCB2b2lkIHZpc2l0UHJvamVjdChJUHJvamVjdCBwKSB7Ci0JCQl0cnkgewotCQkJCXAuYWNjZXB0KHRoaXMsIElSZXNvdXJjZS5OT05FKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBzaG91bGRuJ3QgaGFwcGVuIC0gd2UgZG9uJ3QgdGhyb3cgYW55IENvcmVFeGNlcHRpb25zCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQl9Ci0JCS8vIGFkZCBhIEpQQSBmaWxlIGZvciBldmVyeSBbYXBwcm9wcmlhdGVdIGZpbGUgZW5jb3VudGVyZWQgYnkgdGhlIHZpc2l0b3IKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcmVzb3VyY2UpIHsKLQkJCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuUk9PVCA6ICAvLyBzaG91bGRuJ3QgaGFwcGVuCi0JCQkJCXJldHVybiB0cnVlOyAgLy8gdmlzaXQgY2hpbGRyZW4KLQkJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKLQkJCQkJcmV0dXJuIHRydWU7ICAvLyB2aXNpdCBjaGlsZHJlbgotCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6Ci0JCQkJCXJldHVybiB0cnVlOyAgLy8gdmlzaXQgY2hpbGRyZW4KLQkJCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKLQkJCQkJQWJzdHJhY3RKYXhiUHJvamVjdC50aGlzLmFkZEpheGJGaWxlXygoSUZpbGUpIHJlc291cmNlLnJlcXVlc3RSZXNvdXJjZSgpKTsKLQkJCQkJcmV0dXJuIGZhbHNlOyAgLy8gbm8gY2hpbGRyZW4KLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGZhbHNlOyAgLy8gbm8gY2hpbGRyZW4KLQkJCX0KLQkJfQotCX0KLQotCi0vLwkvLyAqKioqKioqKioqIG1pc2NlbGxhbmVvdXMgKioqKioqKioqKgotLy8KLS8vCS8qKgotLy8JICogSWdub3JlIGNoYW5nZXMgdG8gdGhpcyBjb2xsZWN0aW9uLiBBZGRzIGNhbiBiZSBpZ25vcmVkIHNpbmNlIHRoZXkgYXJlIHRyaWdnZXJlZAotLy8JICogYnkgcmVxdWVzdHMgdGhhdCB3aWxsLCB0aGVtc2VsdmVzLCB0cmlnZ2VyIHVwZGF0ZXMgKHR5cGljYWxseSBkdXJpbmcgdGhlCi0vLwkgKiB1cGRhdGUgb2YgYW4gb2JqZWN0IHRoYXQgY2FsbHMgYSBzZXR0ZXIgd2l0aCB0aGUgbmV3bHktY3JlYXRlZCByZXNvdXJjZQotLy8JICogdHlwZSkuIERlbGV0ZXMgd2lsbCBiZSBhY2NvbXBhbmllZCBieSBtYW51YWwgdXBkYXRlcy4KLS8vCSAqLwotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgdm9pZCBhZGROb25VcGRhdGVBc3BlY3ROYW1lc1RvKFNldDxTdHJpbmc+IG5vblVwZGF0ZUFzcGVjdE5hbWVzKSB7Ci0vLwkJc3VwZXIuYWRkTm9uVXBkYXRlQXNwZWN0TmFtZXNUbyhub25VcGRhdGVBc3BlY3ROYW1lcyk7Ci0vLwkJbm9uVXBkYXRlQXNwZWN0TmFtZXMuYWRkKEVYVEVSTkFMX0pBVkFfUkVTT1VSQ0VfQ09NUElMQVRJT05fVU5JVFNfQ09MTEVDVElPTik7Ci0vLwl9Ci0KLQotCS8vICoqKioqKioqKiogZ2VuZXJhbCBxdWVyaWVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiUHJvamVjdCBnZXRKYXhiUHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5wcm9qZWN0LmdldE5hbWUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5wcm9qZWN0OwotCX0KLQotCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5jcmVhdGUodGhpcy5wcm9qZWN0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YlBsYXRmb3JtIGdldFBsYXRmb3JtKCkgewotCQlyZXR1cm4gdGhpcy5qYXhiUGxhdGZvcm07Ci0JfQotCQotCXB1YmxpYyBTY2hlbWFMaWJyYXJ5IGdldFNjaGVtYUxpYnJhcnkoKSB7Ci0JCXJldHVybiB0aGlzLnNjaGVtYUxpYnJhcnk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdD4gZ2V0Q29tYmluZWRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRJbnRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKTsKLS8vCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdD4oCi0vLwkJCQkJdGhpcy5nZXRJbnRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSwKLS8vCQkJCQl0aGlzLmdldEV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cygpCi0vLwkJCQkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIEpBWEIgZmlsZXMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEpheGJGaWxlPiBnZXRKYXhiRmlsZXMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8SmF4YkZpbGU+KHRoaXMuamF4YkZpbGVzKTsgIC8vIHJlYWQtb25seQotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SmF4YkZpbGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF4YkZpbGVzLnNpemUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF4YkZpbGU+IGdldEpheGJGaWxlcyhmaW5hbCBJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXhiRmlsZT4odGhpcy5nZXRKYXhiRmlsZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSmF4YkZpbGUgamF4YkZpbGUpIHsKLQkJCQlyZXR1cm4gamF4YkZpbGUuZ2V0Q29udGVudFR5cGUoKS5pc0tpbmRPZihjb250ZW50VHlwZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpheGJGaWxlIGdldEpheGJGaWxlKElGaWxlIGZpbGUpIHsKLQkJZm9yIChKYXhiRmlsZSBqYXhiRmlsZSA6IHRoaXMuZ2V0SmF4YkZpbGVzKCkpIHsKLQkJCWlmIChqYXhiRmlsZS5nZXRGaWxlKCkuZXF1YWxzKGZpbGUpKSB7Ci0JCQkJcmV0dXJuIGpheGJGaWxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIEpBWEIgZmlsZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlLCBpZiBhcHByb3ByaWF0ZS4KLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhIEpBWEIgRmlsZSB3YXMgY3JlYXRlZCBhbmQgYWRkZWQsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZEpheGJGaWxlKElGaWxlIGZpbGUpIHsKLQkJSmF4YkZpbGUgamF4YkZpbGUgPSB0aGlzLmFkZEpheGJGaWxlXyhmaWxlKTsKLQkJaWYgKGpheGJGaWxlICE9IG51bGwpIHsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChKQVhCX0ZJTEVTX0NPTExFQ1RJT04sIGpheGJGaWxlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIGEgSkFYQiBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUsIGlmIGFwcHJvcHJpYXRlLCB3aXRob3V0IGZpcmluZwotCSAqIGFuIGV2ZW50OyB1c2VmdWwgZHVyaW5nIGNvbnN0cnVjdGlvbi4KLQkgKiBSZXR1cm4gdGhlIG5ldyBKQVhCIGZpbGUsIG51bGwgaWYgaXQgd2FzIG5vdCBjcmVhdGVkLgotCSAqLwotCXByb3RlY3RlZCBKYXhiRmlsZSBhZGRKYXhiRmlsZV8oSUZpbGUgZmlsZSkgewotCQlpZiAoaXNKYXZhRmlsZShmaWxlKSkgewotCQkJaWYgKCEgZ2V0SmF2YVByb2plY3QoKS5pc09uQ2xhc3NwYXRoKGZpbGUpKSB7Ci0JCQkJLy8gYSBqYXZhICguamFyIG9yIC5qYXZhKSBmaWxlIG11c3QgYmUgb24gdGhlIEphdmEgY2xhc3NwYXRoCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoISBmaWxlUmVzb3VyY2VMb2NhdGlvbklzVmFsaWQoZmlsZSkpIHsKLQkJCXJldHVybiBudWxsOyAgCi0JCX0KLQotCQlKYXhiRmlsZSBqYXhiRmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlqYXhiRmlsZSA9IHRoaXMuZ2V0UGxhdGZvcm0oKS5idWlsZEpheGJGaWxlKHRoaXMsIGZpbGUpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy9sb2cgYW55IGRldmVsb3BlciBleGNlcHRpb25zIGFuZCBkb24ndCBidWlsZCBhIEpheGJGaWxlIHJhdGhlcgotCQkJLy90aGFuIGNvbXBsZXRlbHkgZmFpbGluZyB0byBidWlsZCB0aGUgSmF4YlByb2plY3QKLQkJCUpwdEpheGJDb3JlUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlpZiAoamF4YkZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJamF4YkZpbGUuZ2V0UmVzb3VyY2VNb2RlbCgpLmFkZFJlc291cmNlTW9kZWxMaXN0ZW5lcih0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lcik7Ci0JCXRoaXMuamF4YkZpbGVzLmFkZChqYXhiRmlsZSk7Ci0JCXJldHVybiBqYXhiRmlsZTsKLQl9Ci0JCi0JLyogZmlsZSBpcyAuamF2YSBvciAuamFyICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNKYXZhRmlsZShJRmlsZSBmaWxlKSB7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtVG9vbHMuZ2V0Q29udGVudFR5cGUoZmlsZSk7Ci0JCXJldHVybiBjb250ZW50VHlwZSAhPSBudWxsIAotCQkJCSYmIChjb250ZW50VHlwZS5pc0tpbmRPZihKcHRDb21tb25Db3JlUGx1Z2luLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSkKLQkJCQkJfHwgY29udGVudFR5cGUuaXNLaW5kT2YoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVJfQ09OVEVOVF9UWVBFKSk7Ci0JfQotCQotCS8qIChub24tamF2YSByZXNvdXJjZSkgZmlsZSBpcyBpbiBhY2NlcHRhYmxlIHJlc291cmNlIGxvY2F0aW9uICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmlsZVJlc291cmNlTG9jYXRpb25Jc1ZhbGlkKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvamVjdFJlc291cmNlTG9jYXRvcigpLnJlc291cmNlTG9jYXRpb25Jc1ZhbGlkKGZpbGUuZ2V0UGFyZW50KCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9qZWN0UmVzb3VyY2VMb2NhdG9yIGdldFByb2plY3RSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiAoUHJvamVjdFJlc291cmNlTG9jYXRvcikgdGhpcy5wcm9qZWN0LmdldEFkYXB0ZXIoUHJvamVjdFJlc291cmNlTG9jYXRvci5jbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgSkFYQiBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBJRmlsZSwgaWYgaXQgZXhpc3RzLgotCSAqIFJldHVybiB0cnVlIGlmIGEgSkFYQiBGaWxlIHdhcyByZW1vdmVkLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVKYXhiRmlsZShJRmlsZSBmaWxlKSB7Ci0JCUpheGJGaWxlIGpheGJGaWxlID0gdGhpcy5nZXRKYXhiRmlsZShmaWxlKTsKLQkJaWYgKGpheGJGaWxlICE9IG51bGwpIHsgIC8vIGEgSnBhRmlsZSBpcyBub3QgYWRkZWQgZm9yIGV2ZXJ5IElGaWxlCi0JCQl0aGlzLnJlbW92ZUpheGJGaWxlKGpheGJGaWxlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgSkFYQiBmaWxlIGFuZCByZW1vdmUgaXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSmF4YkZpbGUoSmF4YkZpbGUgamF4YkZpbGUpIHsKLQkJamF4YkZpbGUuZ2V0UmVzb3VyY2VNb2RlbCgpLnJlbW92ZVJlc291cmNlTW9kZWxMaXN0ZW5lcih0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lcik7Ci0JCWlmICggISB0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihqYXhiRmlsZSwgdGhpcy5qYXhiRmlsZXMsIEpBWEJfRklMRVNfQ09MTEVDVElPTikpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oamF4YkZpbGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQotLy8JLy8gKioqKioqKioqKiBleHRlcm5hbCBKYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgdHlwZXMgKHNvdXJjZSBvciBiaW5hcnkpICoqKioqKioqKioKLS8vCi0vLwlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgYnVpbGRQZXJzaXN0YWJsZUV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0vLwkJSVR5cGUgamR0VHlwZSA9IHRoaXMuZmluZFR5cGUodHlwZU5hbWUpOwotLy8JCXJldHVybiAoamR0VHlwZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkUGVyc2lzdGFibGVFeHRlcm5hbEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKGpkdFR5cGUpOwotLy8JfQotLy8KLS8vCXByb3RlY3RlZCBJVHlwZSBmaW5kVHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKLS8vCQl0cnkgewotLy8JCQlyZXR1cm4gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHR5cGVOYW1lKTsKLS8vCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLS8vCQkJcmV0dXJuIG51bGw7ICAvLyBpZ25vcmUgZXhjZXB0aW9uPwotLy8JCX0KLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgYnVpbGRQZXJzaXN0YWJsZUV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoSVR5cGUgamR0VHlwZSkgewotLy8JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQgPSB0aGlzLmJ1aWxkRXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShqZHRUeXBlKTsKLS8vCQlyZXR1cm4gKChqcnB0ICE9IG51bGwpICYmIGpycHQuaXNQZXJzaXN0YWJsZSgpKSA/IGpycHQgOiBudWxsOwotLy8JfQotLy8KLS8vCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBidWlsZEV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoSVR5cGUgamR0VHlwZSkgewotLy8JCXJldHVybiBqZHRUeXBlLmlzQmluYXJ5KCkgPwotLy8JCQkJdGhpcy5idWlsZEJpbmFyeUV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoamR0VHlwZSkgOgotLy8JCQkJdGhpcy5idWlsZFNvdXJjZUV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoamR0VHlwZSk7Ci0vLwl9Ci0vLwotLy8JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGJ1aWxkQmluYXJ5RXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShJVHlwZSBqZHRUeXBlKSB7Ci0vLwkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlLmFkZFBlcnNpc3RlbnRUeXBlKGpkdFR5cGUpOwotLy8JfQotLy8KLS8vCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBidWlsZFNvdXJjZUV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoSVR5cGUgamR0VHlwZSkgewotLy8JCUphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqcmN1ID0gdGhpcy5nZXRFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChqZHRUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpKTsKLS8vCQlTdHJpbmcgamR0VHlwZU5hbWUgPSBqZHRUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpOyAgLy8gSkRUIG1lbWJlciB0eXBlIG5hbWVzIHVzZSAnJCcKLS8vCQlmb3IgKEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPiBzdHJlYW0gPSBqcmN1LnBlcnNpc3RlbnRUeXBlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLS8vCQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCA9IHN0cmVhbS5uZXh0KCk7Ci0vLwkJCWlmIChqcnB0LmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoamR0VHlwZU5hbWUpKSB7Ci0vLwkJCQlyZXR1cm4ganJwdDsKLS8vCQkJfQotLy8JCX0KLS8vCQkvLyB3ZSBjYW4gZ2V0IGhlcmUgaWYgdGhlIHByb2plY3QgSlJFIGlzIHJlbW92ZWQ7Ci0vLwkJLy8gc2VlIFNvdXJjZUNvbXBpbGF0aW9uVW5pdCNnZXRQcmltYXJ5VHlwZShDb21waWxhdGlvblVuaXQpCi0vLwkJLy8gYnVnIDIyNTMzMgotLy8JCXJldHVybiBudWxsOwotLy8JfQotLy8KLS8vCi0vLwkvLyAqKioqKioqKioqIGV4dGVybmFsIEphdmEgcmVzb3VyY2UgcGVyc2lzdGVudCB0eXBlcyAoYmluYXJ5KSAqKioqKioqKioqCi0vLwotLy8JcHVibGljIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlQ2FjaGUgZ2V0RXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlKCkgewotLy8JCXJldHVybiB0aGlzLmV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVDYWNoZTsKLS8vCX0KLS8vCi0vLwotLy8JLy8gKioqKioqKioqKiBleHRlcm5hbCBKYXZhIHJlc291cmNlIGNvbXBpbGF0aW9uIHVuaXRzIChzb3VyY2UpICoqKioqKioqKioKLS8vCi0vLwlwdWJsaWMgSXRlcmF0b3I8SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0PiBleHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSB7Ci0vLwkJcmV0dXJuIHRoaXMuZ2V0RXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCkuaXRlcmF0b3IoKTsKLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0PiBnZXRFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSB7Ci0vLwkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ+KHRoaXMuZXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKTsgIC8vIHJlYWQtb25seQotLy8JfQotLy8KLS8vCXB1YmxpYyBpbnQgZXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzU2l6ZSgpIHsKLS8vCQlyZXR1cm4gdGhpcy5leHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMuc2l6ZSgpOwotLy8JfQotLy8KLS8vCS8qKgotLy8JICogUmV0dXJuIHRoZSByZXNvdXJjZSBtb2RlbCBjb21waWxhdGlvbiB1bml0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZAotLy8JICogSkRUIGNvbXBpbGF0aW9uIHVuaXQuIElmIGl0IGRvZXMgbm90IGV4aXN0LCBidWlsZCBpdC4KLS8vCSAqLwotLy8JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBnZXRFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGpkdENvbXBpbGF0aW9uVW5pdCkgewotLy8JCWZvciAoSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGpyY3UgOiB0aGlzLmdldEV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cygpKSB7Ci0vLwkJCWlmIChqcmN1LmdldENvbXBpbGF0aW9uVW5pdCgpLmVxdWFscyhqZHRDb21waWxhdGlvblVuaXQpKSB7Ci0vLwkJCQkvLyB3ZSB3aWxsIGdldCBoZXJlIGlmIHRoZSBKUkNVIGNvdWxkIG5vdCBidWlsZCBpdHMgcGVyc2lzdGVudCB0eXBlLi4uCi0vLwkJCQlyZXR1cm4ganJjdTsKLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gdGhpcy5hZGRFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChqZHRDb21waWxhdGlvblVuaXQpOwotLy8JfQotLy8KLS8vCS8qKgotLy8JICogQWRkIGFuIGV4dGVybmFsIEphdmEgcmVzb3VyY2UgY29tcGlsYXRpb24gdW5pdC4KLS8vCSAqLwotLy8JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBhZGRFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGpkdENvbXBpbGF0aW9uVW5pdCkgewotLy8JCUphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqcmN1ID0gdGhpcy5idWlsZEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChqZHRDb21waWxhdGlvblVuaXQpOwotLy8JCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihqcmN1LCB0aGlzLmV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cywgRVhURVJOQUxfSkFWQV9SRVNPVVJDRV9DT01QSUxBVElPTl9VTklUU19DT0xMRUNUSU9OKTsKLS8vCQlqcmN1LmFkZFJlc291cmNlTW9kZWxMaXN0ZW5lcih0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lcik7Ci0vLwkJcmV0dXJuIGpyY3U7Ci0vLwl9Ci0vLwotLy8JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBidWlsZEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGpkdENvbXBpbGF0aW9uVW5pdCkgewotLy8JCXJldHVybiBuZXcgU291cmNlVHlwZUNvbXBpbGF0aW9uVW5pdCgKLS8vCQkJCQlqZHRDb21waWxhdGlvblVuaXQsCi0vLwkJCQkJdGhpcy5qcGFQbGF0Zm9ybS5nZXRBbm5vdGF0aW9uUHJvdmlkZXIoKSwKLS8vCQkJCQl0aGlzLmpwYVBsYXRmb3JtLmdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCksCi0vLwkJCQkJdGhpcy5tb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcgotLy8JCQkJKTsKLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChJRmlsZSBmaWxlKSB7Ci0vLwkJZm9yIChKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQganJjdSA6IHRoaXMuZ2V0RXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCkpIHsKLS8vCQkJaWYgKGpyY3UuZ2V0RmlsZSgpLmVxdWFscyhmaWxlKSkgewotLy8JCQkJdGhpcy5yZW1vdmVFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChqcmN1KTsKLS8vCQkJCXJldHVybiB0cnVlOwotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiBmYWxzZTsKLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQganJjdSkgewotLy8JCWpyY3UucmVtb3ZlUmVzb3VyY2VNb2RlbExpc3RlbmVyKHRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyKTsKLS8vCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihqcmN1LCB0aGlzLmV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cywgRVhURVJOQUxfSkFWQV9SRVNPVVJDRV9DT01QSUxBVElPTl9VTklUU19DT0xMRUNUSU9OKTsKLS8vCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250ZXh0IG1vZGVsICoqKioqKioqKioKLQkKLQlwdWJsaWMgSmF4YkNvbnRleHRSb290IGdldENvbnRleHRSb290KCkgewotCQlyZXR1cm4gdGhpcy5jb250ZXh0Um9vdDsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPD8gZXh0ZW5kcyBKYXZhQ29udGV4dE5vZGU+IGdldFByaW1hcnlKYXZhTm9kZXMoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlJRmlsZSBmaWxlID0gZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKGN1KTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewkKLQkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCX0KLQkJCi0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtVG9vbHMuZ2V0Q29udGVudFR5cGUoZmlsZSk7Ci0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0JCQotCQlpZiAoY29udGVudFR5cGUuaXNLaW5kT2YoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9QQUNLQUdFX0lORk9fQ09OVEVOVF9UWVBFKSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEpheGJQYWNrYWdlSW5mbz4oCi0JCQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxJUGFja2FnZURlY2xhcmF0aW9uLCBKYXhiUGFja2FnZUluZm8+KAotCQkJCQkJCQluZXcgQXJyYXlJdGVyYWJsZTxJUGFja2FnZURlY2xhcmF0aW9uPihjdS5nZXRQYWNrYWdlRGVjbGFyYXRpb25zKCkpKSB7Ci0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIEpheGJQYWNrYWdlSW5mbyB0cmFuc2Zvcm0oSVBhY2thZ2VEZWNsYXJhdGlvbiBvKSB7Ci0JCQkJCQkJCUpheGJQYWNrYWdlIGpheGJQYWNrYWdlID0gZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlKG8uZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQkJCQkJCXJldHVybiAoamF4YlBhY2thZ2UgIT0gbnVsbCkgPyBqYXhiUGFja2FnZS5nZXRQYWNrYWdlSW5mbygpIDogbnVsbDsKLQkJCQkJCQl9Ci0JCQkJCQl9LAotCQkJCQkJTm90TnVsbEZpbHRlci48SmF4YlBhY2thZ2VJbmZvPmluc3RhbmNlKCkpOwotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmlzS2luZE9mKEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEpheGJUeXBlPigKLQkJCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPElUeXBlLCBKYXhiVHlwZT4oCi0JCQkJCQkJCW5ldyBBcnJheUl0ZXJhYmxlPElUeXBlPihjdS5nZXRBbGxUeXBlcygpKSkgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBKYXhiVHlwZSB0cmFuc2Zvcm0oSVR5cGUgbykgewotCQkJCQkJCQlKYXhiVHlwZSBqYXhiVHlwZSA9IGdldENvbnRleHRSb290KCkuZ2V0VHlwZShvLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKTsKLQkJCQkJCQkJcmV0dXJuIGpheGJUeXBlOwotCQkJCQkJCX0KLQkJCQkJCX0sCi0JCQkJCQlOb3ROdWxsRmlsdGVyLjxKYXhiVHlwZT5pbnN0YW5jZSgpKTsKLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCXByaXZhdGUgSUZpbGUgZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSUZpbGUpIGN1LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdEpheGJDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkKLS8vCS8vICoqKioqKioqKiogdXRpbGl0eSAqKioqKioqKioqCi0vLwotLy8JcHVibGljIElGaWxlIGdldFBsYXRmb3JtRmlsZShJUGF0aCBydW50aW1lUGF0aCkgewotLy8JCXJldHVybiBKcHRDb3JlUGx1Z2luLmdldFBsYXRmb3JtRmlsZSh0aGlzLnByb2plY3QsIHJ1bnRpbWVQYXRoKTsKLS8vCX0KLQotCi0vLwotLy8JLyoqCi0vLwkgKiBJZiB0aGUgc3BlY2lmaWVkIGZpbGUgZXhpc3RzLCBpcyBzaWduaWZpY2FudCB0byB0aGUgSlBBIHByb2plY3QsIGFuZCBpdHMKLS8vCSAqIGNvbnRlbnQgaXMgYSAia2luZCBvZiIgdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGUsIHJldHVybiB0aGUgSlBBCi0vLwkgKiByZXNvdXJjZSBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWxlOyBvdGhlcndpc2UsIHJldHVybiBudWxsLgotLy8JICovCi0vLwlwcm90ZWN0ZWQgSnBhUmVzb3VyY2VNb2RlbCBnZXRSZXNvdXJjZU1vZGVsKElQYXRoIHJ1bnRpbWVQYXRoLCBJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLS8vCQlJRmlsZSBmaWxlID0gdGhpcy5nZXRQbGF0Zm9ybUZpbGUocnVudGltZVBhdGgpOwotLy8JCXJldHVybiBmaWxlLmV4aXN0cygpID8gdGhpcy5nZXRSZXNvdXJjZU1vZGVsKGZpbGUsIGNvbnRlbnRUeXBlKSA6ICBudWxsOwotLy8JfQotLy8KLS8vCS8qKgotLy8JICogSWYgdGhlIHNwZWNpZmllZCBmaWxlIGlzIHNpZ25pZmljYW50IHRvIHRoZSBKUEEgcHJvamVjdCBhbmQgaXRzIGNvbnRlbnQKLS8vCSAqIGlzIGEgImtpbmQgb2YiIHRoZSBzcGVjaWZpZWQgY29udGVudCB0eXBlLCByZXR1cm4gdGhlIEpQQSByZXNvdXJjZSBtb2RlbAotLy8JICogY29ycmVzcG9uZGluZyB0byB0aGUgZmlsZTsgb3RoZXJ3aXNlLCByZXR1cm4gbnVsbC4KLS8vCSAqLwotLy8JcHJvdGVjdGVkIEpwYVJlc291cmNlTW9kZWwgZ2V0UmVzb3VyY2VNb2RlbChJRmlsZSBmaWxlLCBJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLS8vCQlKcGFGaWxlIGpwYUZpbGUgPSB0aGlzLmdldEpwYUZpbGUoZmlsZSk7Ci0vLwkJcmV0dXJuIChqcGFGaWxlID09IG51bGwpID8gbnVsbCA6IGpwYUZpbGUuZ2V0UmVzb3VyY2VNb2RlbChjb250ZW50VHlwZSk7Ci0vLwl9Ci0KLQotCS8vICoqKioqKioqKiogYW5ub3RhdGVkIEphdmEgc291cmNlIGNsYXNzZXMgKioqKioqKioqKgotCQotCXB1YmxpYyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+IGdldEphdmFTb3VyY2VSZXNvdXJjZVR5cGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4odGhpcy5nZXRJbnRlcm5hbEphdmFTb3VyY2VSZXNvdXJjZVR5cGVTZXRzKCkpOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPiBnZXRBbm5vdGF0ZWRKYXZhU291cmNlUmVzb3VyY2VUeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+KGdldEphdmFTb3VyY2VSZXNvdXJjZVR5cGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSB0eXBlKSB7Ci0JCQkJcmV0dXJuIHR5cGUuaXNBbm5vdGF0ZWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0vLwlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRBbm5vdGF0ZWRKYXZhU291cmNlQ2xhc3NOYW1lcygpIHsKLS8vCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF2YVJlc291cmNlVHlwZSwgU3RyaW5nPih0aGlzLmdldEludGVybmFsQW5ub3RhdGVkU291cmNlSmF2YVJlc291cmNlVHlwZXMoKSkgewotLy8JCQlAT3ZlcnJpZGUKLS8vCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSmF2YVJlc291cmNlVHlwZSB0eXBlKSB7Ci0vLwkJCQlyZXR1cm4gdHlwZS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0vLwkJCX0KLS8vCQl9OwotLy8JfQotCQotCS8qCi0JICogUmV0dXJuIHRoZSBzZXRzIG9mIHtAbGluayBKYXZhUmVzb3VyY2VUeXBlfXMgdGhhdCBhcmUgcmVwcmVzZW50ZWQgYnkgamF2YSBzb3VyY2Ugd2l0aGluIHRoaXMgcHJvamVjdAotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+PiBnZXRJbnRlcm5hbEphdmFTb3VyY2VSZXNvdXJjZVR5cGVTZXRzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+PigKLQkJCQl0aGlzLmdldEludGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+IHRyYW5zZm9ybShKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7Ci0JCQkJcmV0dXJuIGNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlcygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0PiBnZXRJbnRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxKYXhiRmlsZSwgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0Pih0aGlzLmdldEphdmFTb3VyY2VKYXhiRmlsZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IHRyYW5zZm9ybShKYXhiRmlsZSBqYXhiRmlsZSkgewotCQkJCXJldHVybiAoSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KSBqYXhiRmlsZS5nZXRSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIHJldHVybiBKQVhCIGZpbGVzIHdpdGggSmF2YSBzb3VyY2UgImNvbnRlbnQiCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEpheGJGaWxlPiBnZXRKYXZhU291cmNlSmF4YkZpbGVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXhiRmlsZXMoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIHJlc291cmNlIHBhY2thZ2UgbG9vay11cCAqKioqKioqKioqCi0JCi0JcHVibGljIEl0ZXJhYmxlPEphdmFSZXNvdXJjZVBhY2thZ2U+IGdldEphdmFSZXNvdXJjZVBhY2thZ2VzKCl7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8SmF2YVJlc291cmNlUGFja2FnZT4oIAotCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEpheGJGaWxlLCBKYXZhUmVzb3VyY2VQYWNrYWdlPih0aGlzLmdldFBhY2thZ2VJbmZvU291cmNlSmF4YkZpbGVzKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQYWNrYWdlIHRyYW5zZm9ybShKYXhiRmlsZSBqYXhiRmlsZSkgewotCQkJCQkJcmV0dXJuICgoSmF2YVJlc291cmNlUGFja2FnZUluZm9Db21waWxhdGlvblVuaXQpIGpheGJGaWxlLmdldFJlc291cmNlTW9kZWwoKSkuZ2V0UGFja2FnZSgpOwotCQkJCQl9Ci0JCQkJfSkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSkgewotCQkJCXJldHVybiByZXNvdXJjZVBhY2thZ2UgIT0gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIEphdmFSZXNvdXJjZVBhY2thZ2UgZ2V0SmF2YVJlc291cmNlUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VQYWNrYWdlIGpycCA6IHRoaXMuZ2V0SmF2YVJlc291cmNlUGFja2FnZXMoKSkgewotCQkJaWYgKGpycC5nZXROYW1lKCkuZXF1YWxzKHBhY2thZ2VOYW1lKSkgewotCQkJCXJldHVybiBqcnA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VQYWNrYWdlPiBnZXRBbm5vdGF0ZWRKYXZhUmVzb3VyY2VQYWNrYWdlcygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXZhUmVzb3VyY2VQYWNrYWdlPih0aGlzLmdldEphdmFSZXNvdXJjZVBhY2thZ2VzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlKSB7Ci0JCQkJcmV0dXJuIHJlc291cmNlUGFja2FnZS5pc0Fubm90YXRlZCgpOyAgLy8gaS5lLiB0aGUgcGFja2FnZSBoYXMgYSB2YWxpZCBwYWNrYWdlIGFubm90YXRpb24KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIEphdmFSZXNvdXJjZVBhY2thZ2UgZ2V0QW5ub3RhdGVkSmF2YVJlc291cmNlUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLQkJSmF2YVJlc291cmNlUGFja2FnZSBqcnAgPSBnZXRKYXZhUmVzb3VyY2VQYWNrYWdlKHBhY2thZ2VOYW1lKTsKLQkJcmV0dXJuIChqcnAgIT0gbnVsbCAmJiBqcnAuaXNBbm5vdGF0ZWQoKSkgPyBqcnAgOiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiByZXR1cm4gSlBBIGZpbGVzIHdpdGggcGFja2FnZS1pbmZvIHNvdXJjZSAiY29udGVudCIKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF4YkZpbGU+IGdldFBhY2thZ2VJbmZvU291cmNlSmF4YkZpbGVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXhiRmlsZXMoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9QQUNLQUdFX0lORk9fQ09OVEVOVF9UWVBFKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIEphdmEgcmVzb3VyY2UgdHlwZSBsb29rLXVwICoqKioqKioqKioKLQkKLQkKLQlwdWJsaWMgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGdldEphdmFSZXNvdXJjZVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCWZvciAoSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHR5cGUgOiB0aGlzLmdldEphdmFSZXNvdXJjZVR5cGVzKCkpIHsKLQkJCWlmICh0eXBlLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHModHlwZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIHR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0vLwkJLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhIHR5cGUgYWxyZWFkeSwgdHJ5IHRvIGJ1aWxkIG5ldyBvbmUgZnJvbSB0aGUgcHJvamVjdCBjbGFzc3BhdGgKLS8vCQlyZXR1cm4gdGhpcy5idWlsZFBlcnNpc3RhYmxlRXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSh0eXBlTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgZ2V0SmF2YVJlc291cmNlVHlwZShTdHJpbmcgdHlwZU5hbWUsIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZS5LaW5kIGtpbmQpIHsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGdldEphdmFSZXNvdXJjZVR5cGUodHlwZU5hbWUpOwotCQlpZiAocmVzb3VyY2VUeXBlID09IG51bGwgfHwgcmVzb3VyY2VUeXBlLmdldEtpbmQoKSAhPSBraW5kKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VUeXBlOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+IGdldEphdmFSZXNvdXJjZVR5cGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4odGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlU2V0cygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4+IGdldEphdmFSZXNvdXJjZVR5cGVTZXRzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF2YVJlc291cmNlTm9kZS5Sb290LCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+PigKLQkJCQl0aGlzLmdldEphdmFSZXNvdXJjZU5vZGVSb290cygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+IHRyYW5zZm9ybShKYXZhUmVzb3VyY2VOb2RlLlJvb3Qgcm9vdCkgewotCQkJCXJldHVybiByb290LmdldFR5cGVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VOb2RlLlJvb3Q+IGdldEphdmFSZXNvdXJjZU5vZGVSb290cygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxKYXZhUmVzb3VyY2VOb2RlLlJvb3Q+KAotCQkJCQl0aGlzLmdldEludGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cygpLyosCi0JCQkJCXRoaXMuZ2V0SW50ZXJuYWxKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290cygpLAotCQkJCQl0aGlzLmdldEV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cygpLAotCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24odGhpcy5leHRlcm5hbEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlQ2FjaGUpKi8KLQkJCQkpOwotCX0KLQotCQotLy8JLy8gKioqKioqKioqKiBKQVJzICoqKioqKioqKioKLS8vCi0vLwkvLyBUT0RPCi0vLwlwdWJsaWMgSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCBnZXRKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290KFN0cmluZyBqYXJGaWxlTmFtZSkgewotLy8vLwkJcmV0dXJuIHRoaXMuZ2V0SmFyUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290KHRoaXMuY29udmVydFRvUGxhdGZvcm1GaWxlKGphckZpbGVOYW1lKSk7Ci0vLwkJcmV0dXJuIHRoaXMuZ2V0SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCh0aGlzLmdldFByb2plY3QoKS5nZXRGaWxlKGphckZpbGVOYW1lKSk7Ci0vLwl9Ci0vLwotLy8JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdChJRmlsZSBqYXJGaWxlKSB7Ci0vLwkJZm9yIChKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290IHBmciA6IHRoaXMuZ2V0SW50ZXJuYWxKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290cygpKSB7Ci0vLwkJCWlmIChwZnIuZ2V0RmlsZSgpLmVxdWFscyhqYXJGaWxlKSkgewotLy8JCQkJcmV0dXJuIHBmcjsKLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gbnVsbDsKLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdD4gZ2V0SW50ZXJuYWxKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290cygpIHsKLS8vCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SnBhRmlsZSwgSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdD4odGhpcy5nZXRKYXJKcGFGaWxlcygpKSB7Ci0vLwkJCUBPdmVycmlkZQotLy8JCQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCB0cmFuc2Zvcm0oSnBhRmlsZSBqcGFGaWxlKSB7Ci0vLwkJCQlyZXR1cm4gKEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QpIGpwYUZpbGUuZ2V0UmVzb3VyY2VNb2RlbCgpOwotLy8JCQl9Ci0vLwkJfTsKLS8vCX0KLS8vCi0vLwkvKioKLS8vCSAqIHJldHVybiBKUEEgZmlsZXMgd2l0aCBKQVIgImNvbnRlbnQiCi0vLwkgKi8KLS8vCXByb3RlY3RlZCBJdGVyYWJsZTxKcGFGaWxlPiBnZXRKYXJKcGFGaWxlcygpIHsKLS8vCQlyZXR1cm4gdGhpcy5nZXRKcGFGaWxlcyhKcHRDb3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpOwotLy8JfQotCi0KLQotLy8KLS8vCS8vICoqKioqKioqKiogSmF2YSBzb3VyY2UgZm9sZGVyIG5hbWVzICoqKioqKioqKioKLS8vCi0vLwlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhU291cmNlRm9sZGVyTmFtZXMoKSB7Ci0vLwkJdHJ5IHsKLS8vCQkJcmV0dXJuIHRoaXMuZ2V0SmF2YVNvdXJjZUZvbGRlck5hbWVzXygpOwotLy8JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotLy8JCQlKcHRDb3JlUGx1Z2luLmxvZyhleCk7Ci0vLwkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0vLwkJfQotLy8JfQotLy8KLS8vCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFTb3VyY2VGb2xkZXJOYW1lc18oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLS8vCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SVBhY2thZ2VGcmFnbWVudFJvb3QsIFN0cmluZz4odGhpcy5nZXRKYXZhU291cmNlRm9sZGVycygpKSB7Ci0vLwkJCUBPdmVycmlkZQotLy8JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShJUGFja2FnZUZyYWdtZW50Um9vdCBwZnIpIHsKLS8vCQkJCXRyeSB7Ci0vLwkJCQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtXyhwZnIpOwotLy8JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCQkJcmV0dXJuICJFcnJvcjogIiArIHBmci5nZXRQYXRoKCk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQlwcml2YXRlIFN0cmluZyB0cmFuc2Zvcm1fKElQYWNrYWdlRnJhZ21lbnRSb290IHBmcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0vLwkJCQlyZXR1cm4gcGZyLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpOwotLy8JCQl9Ci0vLwkJfTsKLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgSXRlcmFibGU8SVBhY2thZ2VGcmFnbWVudFJvb3Q+IGdldEphdmFTb3VyY2VGb2xkZXJzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0vLwkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxJUGFja2FnZUZyYWdtZW50Um9vdD4oCi0vLwkJCQl0aGlzLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCksCi0vLwkJCQlTT1VSQ0VfUEFDS0FHRV9GUkFHTUVOVF9ST09UX0ZJTFRFUgotLy8JCQkpOwotLy8JfQotLy8KLS8vCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRmlsdGVyPElQYWNrYWdlRnJhZ21lbnRSb290PiBTT1VSQ0VfUEFDS0FHRV9GUkFHTUVOVF9ST09UX0ZJTFRFUiA9Ci0vLwkJbmV3IEZpbHRlcjxJUGFja2FnZUZyYWdtZW50Um9vdD4oKSB7Ci0vLwkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChJUGFja2FnZUZyYWdtZW50Um9vdCBwZnIpIHsKLS8vCQkJCXRyeSB7Ci0vLwkJCQkJcmV0dXJuIHRoaXMuYWNjZXB0XyhwZnIpOwotLy8JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCXByaXZhdGUgYm9vbGVhbiBhY2NlcHRfKElQYWNrYWdlRnJhZ21lbnRSb290IHBmcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0vLwkJCQlyZXR1cm4gcGZyLmV4aXN0cygpICYmIChwZnIuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKTsKLS8vCQkJfQotLy8JCX07Ci0vLwotLy8JcHJvdGVjdGVkIEl0ZXJhYmxlPElQYWNrYWdlRnJhZ21lbnRSb290PiBnZXRQYWNrYWdlRnJhZ21lbnRSb290cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotLy8JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxJUGFja2FnZUZyYWdtZW50Um9vdD4odGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCkpOwotLy8JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogamF4Yi5pbmRleCByZXNvdXJjZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBJdGVyYWJsZTxKYXhiSW5kZXhSZXNvdXJjZT4gZ2V0SmF4YkluZGV4UmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF4YkZpbGUsIEpheGJJbmRleFJlc291cmNlPihnZXRKYXhiRmlsZXMoSnB0SmF4YkNvcmVQbHVnaW4uSkFYQl9JTkRFWF9DT05URU5UX1RZUEUpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKYXhiSW5kZXhSZXNvdXJjZSB0cmFuc2Zvcm0oSmF4YkZpbGUgbykgewotCQkJCXJldHVybiAoSmF4YkluZGV4UmVzb3VyY2UpIG8uZ2V0UmVzb3VyY2VNb2RlbCgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwdWJsaWMgSmF4YkluZGV4UmVzb3VyY2UgZ2V0SmF4YkluZGV4UmVzb3VyY2UoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0JCWZvciAoSmF4YkluZGV4UmVzb3VyY2UgamlyIDogZ2V0SmF4YkluZGV4UmVzb3VyY2VzKCkpIHsKLQkJCWlmIChwYWNrYWdlTmFtZS5lcXVhbHMoamlyLmdldFBhY2thZ2VOYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIGppcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBqYXhiLnByb3BlcnRpZXMgcmVzb3VyY2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIEl0ZXJhYmxlPEpheGJQcm9wZXJ0aWVzUmVzb3VyY2U+IGdldEpheGJQcm9wZXJ0aWVzUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF4YkZpbGUsIEpheGJQcm9wZXJ0aWVzUmVzb3VyY2U+KGdldEpheGJGaWxlcyhKcHRKYXhiQ29yZVBsdWdpbi5KQVhCX1BST1BFUlRJRVNfQ09OVEVOVF9UWVBFKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSmF4YlByb3BlcnRpZXNSZXNvdXJjZSB0cmFuc2Zvcm0oSmF4YkZpbGUgbykgewotCQkJCXJldHVybiAoSmF4YlByb3BlcnRpZXNSZXNvdXJjZSkgby5nZXRSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXB1YmxpYyBKYXhiUHJvcGVydGllc1Jlc291cmNlIGdldEpheGJQcm9wZXJ0aWVzUmVzb3VyY2UoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0JCWZvciAoSmF4YlByb3BlcnRpZXNSZXNvdXJjZSBqcHIgOiBnZXRKYXhiUHJvcGVydGllc1Jlc291cmNlcygpKSB7Ci0JCQlpZiAocGFja2FnZU5hbWUuZXF1YWxzKGpwci5nZXRQYWNrYWdlTmFtZSgpKSkgewotCQkJCXJldHVybiBqcHI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogSmF2YSBldmVudHMgKioqKioqKioqKgotCi0JLy8gVE9ETyBoYW5kbGUgY2hhbmdlcyB0byBleHRlcm5hbCBwcm9qZWN0cwotCXB1YmxpYyB2b2lkIGphdmFFbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucHJvY2Vzc0phdmFEZWx0YShldmVudC5nZXREZWx0YSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBXZSByZWN1cnNlIGJhY2sgaGVyZSBmcm9tIHtAbGluayAjcHJvY2Vzc0phdmFEZWx0YUNoaWxkcmVuKElKYXZhRWxlbWVudERlbHRhKX0uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFEZWx0YShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlzd2l0Y2ggKGRlbHRhLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX01PREVMIDoKLQkJCQl0aGlzLnByb2Nlc3NKYXZhTW9kZWxEZWx0YShkZWx0YSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QgOgotCQkJCXRoaXMucHJvY2Vzc0phdmFQcm9qZWN0RGVsdGEoZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UIDoKLQkJCQl0aGlzLnByb2Nlc3NKYXZhUGFja2FnZUZyYWdtZW50Um9vdERlbHRhKGRlbHRhKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgotCQkJCXRoaXMucHJvY2Vzc0phdmFQYWNrYWdlRnJhZ21lbnREZWx0YShkZWx0YSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUIDoKLQkJCQl0aGlzLnByb2Nlc3NKYXZhQ29tcGlsYXRpb25Vbml0RGVsdGEoZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7IC8vIGlnbm9yZSB0aGUgZWxlbWVudHMgaW5zaWRlIGEgY29tcGlsYXRpb24gdW5pdAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFEZWx0YUNoaWxkcmVuKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWZvciAoSUphdmFFbGVtZW50RGVsdGEgY2hpbGQgOiBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpIHsKLQkJCXRoaXMucHJvY2Vzc0phdmFEZWx0YShjaGlsZCk7IC8vIHJlY3Vyc2UKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgSmF2YSBlbGVtZW50IGRlbHRhIGlzIGZvciBhCi0JICoge0BsaW5rIElKYXZhRWxlbWVudERlbHRhI0NIQU5HRUQgQ0hBTkdFRH0KLQkgKiAoYXMgb3Bwb3NlZCB0byB7QGxpbmsgSUphdmFFbGVtZW50RGVsdGEjQURERUQgQURERUR9IG9yCi0JICoge0BsaW5rIElKYXZhRWxlbWVudERlbHRhI1JFTU9WRUQgUkVNT1ZFRH0pIEphdmEgZWxlbWVudAotCSAqIGFuZCB0aGUgc3BlY2lmaWVkIGZsYWcgaXMgc2V0LgotCSAqIChUaGUgZGVsdGEgZmxhZ3MgYXJlIG9ubHkgc2lnbmlmaWNhbnQgaWYgdGhlIGRlbHRhCi0JICoge0BsaW5rIElKYXZhRWxlbWVudERlbHRhI2dldEtpbmQoKSBraW5kfSBpcwotCSAqIHtAbGluayBJSmF2YUVsZW1lbnREZWx0YSNDSEFOR0VEIENIQU5HRUR9LikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWx0YUZsYWdJc1NldChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSwgaW50IGZsYWcpIHsKLQkJcmV0dXJuIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCkgJiYKLQkJCQlCaXRUb29scy5mbGFnSXNTZXQoZGVsdGEuZ2V0RmxhZ3MoKSwgZmxhZyk7Ci0JfQotCi0JLy8gKioqKiogbW9kZWwKLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YU1vZGVsRGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJLy8gcHJvY2VzcyB0aGUgSmF2YSBtb2RlbCdzIHByb2plY3RzCi0JCXRoaXMucHJvY2Vzc0phdmFEZWx0YUNoaWxkcmVuKGRlbHRhKTsKLQl9Ci0KLQkvLyAqKioqKiBwcm9qZWN0Ci0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFQcm9qZWN0RGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJLy8gcHJvY2VzcyB0aGUgSmF2YSBwcm9qZWN0J3MgcGFja2FnZSBmcmFnbWVudCByb290cwotCQl0aGlzLnByb2Nlc3NKYXZhRGVsdGFDaGlsZHJlbihkZWx0YSk7Ci0KLQkJLy8gYSBjbGFzc3BhdGggY2hhbmdlIGNhbiBoYXZlIHByZXR0eSBmYXItcmVhY2hpbmcgZWZmZWN0cy4uLgotCQlpZiAodGhpcy5jbGFzc3BhdGhIYXNDaGFuZ2VkKGRlbHRhKSkgewotCQkJdGhpcy5yZWJ1aWxkKChJSmF2YVByb2plY3QpIGRlbHRhLmdldEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIEphdmEgcHJvamVjdCdzIGNsYXNzcGF0aCBjaGFuZ2VkLiBSZWJ1aWxkIHRoZSBKUEEgcHJvamVjdAotCSAqIGFzIGFwcHJvcHJpYXRlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYnVpbGQoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCS8vIGlmIHRoZSBjbGFzc3BhdGggaGFzIGNoYW5nZWQsIHdlIG5lZWQgdG8gdXBkYXRlIGV2ZXJ5dGhpbmcgc2luY2UKLQkJLy8gY2xhc3MgcmVmZXJlbmNlcyBjb3VsZCBub3cgYmUgcmVzb2x2ZWQgKG9yIG5vdCkgZXRjLgotCQlpZiAoamF2YVByb2plY3QuZXF1YWxzKHRoaXMuZ2V0SmF2YVByb2plY3QoKSkpIHsKLQkJCXRoaXMucmVtb3ZlRGVhZEpwYUZpbGVzKCk7Ci0JCQl0aGlzLnN5bmNocm9uaXplV2l0aEphdmFTb3VyY2UodGhpcy5nZXRJbnRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUT0RPIHNlZSBpZiBjaGFuZ2VkIHByb2plY3QgaXMgb24gb3VyIGNsYXNzcGF0aD8KLQkJCS8vdGhpcy5zeW5jaHJvbml6ZVdpdGhKYXZhU291cmNlKHRoaXMuZ2V0RXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9vcCB0aHJvdWdoIGFsbCBvdXIgSlBBIGZpbGVzLCByZW1vdmUgYW55IHRoYXQgYXJlIG5vIGxvbmdlciBvbiB0aGUKLQkgKiBjbGFzc3BhdGguCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRGVhZEpwYUZpbGVzKCkgewotCQlmb3IgKEpheGJGaWxlIGpheGJGaWxlIDogdGhpcy5nZXRKYXhiRmlsZXMoKSkgewotCQkJaWYgKHRoaXMuamF4YkZpbGVJc0RlYWQoamF4YkZpbGUpKSB7Ci0JCQkJdGhpcy5yZW1vdmVKYXhiRmlsZShqYXhiRmlsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBqYXhiRmlsZUlzRGVhZChKYXhiRmlsZSBqYXhiRmlsZSkgewotCQlyZXR1cm4gISB0aGlzLmpheGJGaWxlSXNBbGl2ZShqYXhiRmlsZSk7Ci0JfQotCi0JLyoqCi0JICogU29tZXRpbWVzIChlLmcuIGR1cmluZyB0ZXN0cyksIHdoZW4gYSBwcm9qZWN0IGhhcyBiZWVuIGRlbGV0ZWQsIHdlIGdldCBhCi0JICogSmF2YSBjaGFuZ2UgZXZlbnQgdGhhdCBpbmRpY2F0ZXMgdGhlIEphdmEgcHJvamVjdCBpcyBDSEFOR0VEIChhcwotCSAqIG9wcG9zZWQgdG8gUkVNT1ZFRCwgd2hpY2ggaXMgd2hhdCB0eXBpY2FsbHkgaGFwcGVucykuIFRoZSBldmVudCdzIGRlbHRhCi0JICogaW5kaWNhdGVzIHRoYXQgZXZlcnl0aGluZyBpbiB0aGUgSmF2YSBwcm9qZWN0IGhhcyBiZWVuIGRlbGV0ZWQgYW5kIHRoZQotCSAqIGNsYXNzcGF0aCBoYXMgY2hhbmdlZC4gQWxsIGVudHJpZXMgaW4gdGhlIGNsYXNzcGF0aCBoYXZlIGJlZW4gcmVtb3ZlZDsKLQkgKiBidXQgc2luZ2xlIGVudHJ5IGZvciB0aGUgSmF2YSBwcm9qZWN0J3Mgcm9vdCBmb2xkZXIgaGFzIGJlZW4gYWRkZWQuICghKQotCSAqIFRoaXMgbWVhbnMgYW55IGZpbGUgaW4gdGhlIHByb2plY3QgaXMgb24gdGhlIEphdmEgcHJvamVjdCdzIGNsYXNzcGF0aC4KLQkgKiBUaGlzIGNsYXNzcGF0aCBjaGFuZ2UgaXMgd2hhdCB0cmlnZ2VycyB1cyB0byByZWJ1aWxkIHRoZSBKUEEgcHJvamVjdDsgc28KLQkgKiB3ZSBwdXQgYW4gZXh0cmEgY2hlY2sgaGVyZSB0byBtYWtlIHN1cmUgdGhlIEpQQSBmaWxlJ3MgcmVzb3VyY2UgZmlsZSBpcwotCSAqIHN0aWxsIHByZXNlbnQuCi0JICogPHA+Ci0JICogVGhpcyB3b3VsZCBub3QgYmUgYSBwcm9ibGVtIGlmIERhbGkgcmVjZWl2ZWQgdGhlIHJlc291cmNlIGNoYW5nZSBldmVudAotCSAqIDxlbT5iZWZvcmU8L2VtPiBKRFQgYW5kIHNpbXBseSByZW1vdmVkIHRoZSBKUEEgcHJvamVjdDsgYnV0IEpEVCByZWNlaXZlcwotCSAqIHRoZSByZXNvdXJjZSBjaGFuZ2UgZXZlbnQgZmlyc3QgYW5kIGNvbnZlcnRzIGl0IGludG8gdGhlIHByb2JsZW1hdGljCi0JICogSmF2YSBjaGFuZ2UgZXZlbnQuLi4uIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGpheGJGaWxlSXNBbGl2ZShKYXhiRmlsZSBqYXhiRmlsZSkgewotCQlJRmlsZSBmaWxlID0gamF4YkZpbGUuZ2V0RmlsZSgpOwotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmlzT25DbGFzc3BhdGgoZmlsZSkgJiYKLQkJCQlmaWxlLmV4aXN0cygpOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246Ci0JICogZGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNsYXNzcGF0aEhhc0NoYW5nZWQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJcmV0dXJuIHRoaXMuZGVsdGFGbGFnSXNTZXQoZGVsdGEsIElKYXZhRWxlbWVudERlbHRhLkZfUkVTT0xWRURfQ0xBU1NQQVRIX0NIQU5HRUQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplV2l0aEphdmFTb3VyY2UoSXRlcmFibGU8SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0PiBqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKSB7Ci0JCWZvciAoSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCA6IGphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMpIHsKLQkJCWphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5zeW5jaHJvbml6ZVdpdGhKYXZhU291cmNlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqIHBhY2thZ2UgZnJhZ21lbnQgcm9vdAotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhUGFja2FnZUZyYWdtZW50Um9vdERlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCS8vIHByb2Nlc3MgdGhlIEphdmEgcGFja2FnZSBmcmFnbWVudCByb290J3MgcGFja2FnZSBmcmFnbWVudHMKLQkJdGhpcy5wcm9jZXNzSmF2YURlbHRhQ2hpbGRyZW4oZGVsdGEpOwotCi0JCWlmICh0aGlzLmNsYXNzcGF0aEVudHJ5SGFzQmVlbkFkZGVkKGRlbHRhKSkgewotCQkJLy8gVE9ETyBidWcgMjc3MjE4Ci0JCX0gZWxzZSBpZiAodGhpcy5jbGFzc3BhdGhFbnRyeUhhc0JlZW5SZW1vdmVkKGRlbHRhKSkgeyAgLy8gc2hvdWxkIGJlIG11dHVhbGx5LWV4Y2x1c2l2ZSB3L2FkZGVkICg/KQotCQkJLy8gVE9ETyBidWcgMjc3MjE4Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOgotCSAqIGRlbHRhLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbGFzc3BhdGhFbnRyeUhhc0JlZW5BZGRlZChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlyZXR1cm4gdGhpcy5kZWx0YUZsYWdJc1NldChkZWx0YSwgSUphdmFFbGVtZW50RGVsdGEuRl9BRERFRF9UT19DTEFTU1BBVEgpOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246Ci0JICogZGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNsYXNzcGF0aEVudHJ5SGFzQmVlblJlbW92ZWQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJcmV0dXJuIHRoaXMuZGVsdGFGbGFnSXNTZXQoZGVsdGEsIElKYXZhRWxlbWVudERlbHRhLkZfUkVNT1ZFRF9GUk9NX0NMQVNTUEFUSCk7Ci0JfQotCi0JLy8gKioqKiogcGFja2FnZSBmcmFnbWVudAotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhUGFja2FnZUZyYWdtZW50RGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJLy8gcHJvY2VzcyB0aGUgamF2YSBwYWNrYWdlIGZyYWdtZW50J3MgY29tcGlsYXRpb24gdW5pdHMKLQkJdGhpcy5wcm9jZXNzSmF2YURlbHRhQ2hpbGRyZW4oZGVsdGEpOwotCX0KLQotCS8vICoqKioqIGNvbXBpbGF0aW9uIHVuaXQKLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUNvbXBpbGF0aW9uVW5pdERlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmICh0aGlzLmphdmFDb21waWxhdGlvblVuaXREZWx0YUlzUmVsZXZhbnQoZGVsdGEpKSB7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBkZWx0YS5nZXRFbGVtZW50KCk7Ci0JCQlmb3IgKEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqcmN1IDogdGhpcy5nZXRDb21iaW5lZEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSkgewotCQkJCWlmIChqcmN1LmdldENvbXBpbGF0aW9uVW5pdCgpLmVxdWFscyhjb21waWxhdGlvblVuaXQpKSB7Ci0JCQkJCWpyY3Uuc3luY2hyb25pemVXaXRoSmF2YVNvdXJjZSgpOwotCQkJCQkvLyBUT0RPID8gdGhpcy5yZXNvbHZlSmF2YVR5cGVzKCk7ICAvLyBtaWdodCBoYXZlIG5ldyBtZW1iZXIgdHlwZXMgbm93Li4uCi0JCQkJCWJyZWFrOyAgLy8gdGhlcmUgKnNob3VsZG4ndCogYmUgYW55IG1vcmUuLi4KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gaWdub3JlIHRoZSBqYXZhIGNvbXBpbGF0aW9uIHVuaXQncyBjaGlsZHJlbgotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGphdmFDb21waWxhdGlvblVuaXREZWx0YUlzUmVsZXZhbnQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJLy8gaWdub3JlIGNoYW5nZXMgdG8vZnJvbSBwcmltYXJ5IHdvcmtpbmcgY29weSAtIG5vIGNvbnRlbnQgaGFzIGNoYW5nZWQ7Ci0JCS8vIGFuZCBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG90aGVyIGZsYWdzIHNldCB0aGF0IGluZGljYXRlICpib3RoKiBhCi0JCS8vIGNoYW5nZSB0by9mcm9tIHByaW1hcnkgd29ya2luZyBjb3B5ICphbmQqIGNvbnRlbnQgaGFzIGNoYW5nZWQKLQkJaWYgKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoZGVsdGEuZ2V0RmxhZ3MoKSwgSUphdmFFbGVtZW50RGVsdGEuRl9QUklNQVJZX1dPUktJTkdfQ09QWSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGlnbm9yZSBqYXZhIG5vdGlmaWNhdGlvbiBmb3IgQURERUQgb3IgUkVNT1ZFRDsKLQkJLy8gdGhlc2UgYXJlIGhhbmRsZWQgdmlhIHJlc291cmNlIG5vdGlmaWNhdGlvbgotCQlyZXR1cm4gZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLkNIQU5HRUQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCQotCXB1YmxpYyBJdGVyYWJsZTxJTWVzc2FnZT4gZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKElSZXBvcnRlciByZXBvcnRlcikgewotCQlMaXN0PElNZXNzYWdlPiBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3Q8SU1lc3NhZ2U+KCk7Ci0JCXRoaXMudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJcmV0dXJuIG5ldyBTbmFwc2hvdENsb25lSXRlcmFibGU8SU1lc3NhZ2U+KG1lc3NhZ2VzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAocmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24oKTsKLQkJfQotCQkKLQkJZ2V0U2NoZW1hTGlicmFyeSgpLnJlZnJlc2hBbGxTY2hlbWFzKCk7Ci0JCQotCQl2YWxpZGF0ZUxpYnJhcnlQcm92aWRlcihtZXNzYWdlcyk7Ci0JCXZhbGlkYXRlU2NoZW1hTGlicmFyeShtZXNzYWdlcyk7Ci0JCXRoaXMuY29udGV4dFJvb3QudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVMaWJyYXJ5UHJvdmlkZXIoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJdHJ5IHsKLQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShnZXRQcm9qZWN0KCkpOwotCQkJSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXRWZXJzaW9uID0gZmFjZXRlZFByb2plY3QuZ2V0SW5zdGFsbGVkVmVyc2lvbihKYXhiRmFjZXQuRkFDRVQpOwotCQkJTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSBsaWQgPSBuZXcgTGlicmFyeUluc3RhbGxEZWxlZ2F0ZShmYWNldGVkUHJvamVjdCwgZmFjZXRWZXJzaW9uKTsKLQkJCUlMaWJyYXJ5UHJvdmlkZXIgbHAgPSBsaWQuZ2V0TGlicmFyeVByb3ZpZGVyKCk7Ci0JCQlpZiAobGlkLmdldExpYnJhcnlQcm92aWRlck9wZXJhdGlvbkNvbmZpZygpIGluc3RhbmNlb2YgSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcpIHsKLQkJCQkoKEpheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnKSBsaWQuZ2V0TGlicmFyeVByb3ZpZGVyT3BlcmF0aW9uQ29uZmlnKCkpLnNldEpheGJQbGF0Zm9ybShnZXRQbGF0Zm9ybSgpLmdldERlc2NyaXB0aW9uKCkpOwotCQkJfQotCQkJaWYgKCEgbHAuaXNFbmFibGVkRm9yKGZhY2V0ZWRQcm9qZWN0LCBmYWNldFZlcnNpb24pIHx8ICEgbGlkLnZhbGlkYXRlKCkuaXNPSygpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlBST0pFQ1RfSU5WQUxJRF9MSUJSQVJZX1BST1ZJREVSLAotCQkJCQkJCXRoaXMpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy8gZmFsbCB0aHJvdWdoCi0JCQlKcHRKYXhiQ29yZVBsdWdpbi5sb2coY2UpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlU2NoZW1hTGlicmFyeShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQl0aGlzLnNjaGVtYUxpYnJhcnkudmFsaWRhdGUobWVzc2FnZXMpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGRpc3Bvc2UgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5jb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIuc3RvcCgpOwotCQl0aGlzLnVwZGF0ZVN5bmNocm9uaXplci5zdG9wKCk7Ci0JCXRoaXMudXBkYXRlU3luY2hyb25pemVyLnJlbW92ZUxpc3RlbmVyKHRoaXMudXBkYXRlU3luY2hyb25pemVyTGlzdGVuZXIpOwotCQl0aGlzLnNjaGVtYUxpYnJhcnkuZGlzcG9zZSgpOwotCQkvLyB0aGUgWE1MIHJlc291cmNlcyBhcmUgaGVsZCBpbmRlZmluaXRlbHkgYnkgdGhlIFdUUCB0cmFuc2xhdG9yIGZyYW1ld29yaywKLQkJLy8gc28gd2UgYmV0dGVyIHJlbW92ZSBvdXIgbGlzdGVuZXIgb3IgdGhlIEpBWEIgcHJvamVjdCB3aWxsIG5vdCBiZSBHQ2VkCi0JCWZvciAoSmF4YkZpbGUgamF4YkZpbGUgOiB0aGlzLmdldEpheGJGaWxlcygpKSB7Ci0JCQlqYXhiRmlsZS5nZXRSZXNvdXJjZU1vZGVsKCkucmVtb3ZlUmVzb3VyY2VNb2RlbExpc3RlbmVyKHRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyKTsKLQkJfQotCX0KLQotCQotCQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgbW9kZWwgbGlzdGVuZXIgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIgYnVpbGRSZXNvdXJjZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFJlc291cmNlTW9kZWxMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0UmVzb3VyY2VNb2RlbExpc3RlbmVyIAotCQlpbXBsZW1lbnRzIEpwdFJlc291cmNlTW9kZWxMaXN0ZW5lciAKLQl7Ci0JCXByb3RlY3RlZCBEZWZhdWx0UmVzb3VyY2VNb2RlbExpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVzb3VyY2VNb2RlbENoYW5nZWQoSnB0UmVzb3VyY2VNb2RlbCBqcGFSZXNvdXJjZU1vZGVsKSB7Ci0vLwkJCVN0cmluZyBtc2cgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiByZXNvdXJjZSBtb2RlbCBjaGFuZ2U6ICIgKyBqcGFSZXNvdXJjZU1vZGVsOwotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLS8vCQkJbmV3IEV4Y2VwdGlvbihtc2cpLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLQkJCUFic3RyYWN0SmF4YlByb2plY3QudGhpcy5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbChqcGFSZXNvdXJjZU1vZGVsKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVzb3VyY2VNb2RlbFJldmVydGVkKEpwdFJlc291cmNlTW9kZWwganBhUmVzb3VyY2VNb2RlbCkgewotLy8JCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoSnBhWG1sUmVzb3VyY2UpanBhUmVzb3VyY2VNb2RlbCk7Ci0vLwkJCUFic3RyYWN0SmF4YlByb2plY3QudGhpcy5yZW1vdmVKYXhiRmlsZShmaWxlKTsKLS8vCQkJQWJzdHJhY3RKYXhiUHJvamVjdC50aGlzLmFkZEpheGJGaWxlKGZpbGUpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZXNvdXJjZU1vZGVsVW5sb2FkZWQoSnB0UmVzb3VyY2VNb2RlbCBqcGFSZXNvdXJjZU1vZGVsKSB7Ci0vLwkJCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKChKcGFYbWxSZXNvdXJjZSlqcGFSZXNvdXJjZU1vZGVsKTsKLS8vCQkJQWJzdHJhY3RKYXhiUHJvamVjdC50aGlzLnJlbW92ZUpheGJGaWxlKGZpbGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVDb250ZXh0TW9kZWwoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEpwdFJlc291cmNlTW9kZWwganBhUmVzb3VyY2VNb2RlbCkgewotCQl0aGlzLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIGV2ZW50cyAqKioqKioqKioqCi0KLQkvLyBUT0RPIG5lZWQgdG8gZG8gdGhlIHNhbWUgdGhpbmcgZm9yIGV4dGVybmFsIHByb2plY3RzIGFuZCBjb21waWxhdGlvbiB1bml0cwotCXB1YmxpYyB2b2lkIHByb2plY3RDaGFuZ2VkKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCWlmIChkZWx0YS5nZXRSZXNvdXJjZSgpLmVxdWFscyh0aGlzLmdldFByb2plY3QoKSkpIHsKLQkJCXRoaXMuaW50ZXJuYWxQcm9qZWN0Q2hhbmdlZChkZWx0YSk7Ci0JCX0gZWxzZSB7Ci0vLwkJCXRoaXMuZXh0ZXJuYWxQcm9qZWN0Q2hhbmdlZChkZWx0YSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbFByb2plY3RDaGFuZ2VkKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCVJlc291cmNlRGVsdGFWaXNpdG9yIHJlc291cmNlRGVsdGFWaXNpdG9yID0gdGhpcy5idWlsZEludGVybmFsUmVzb3VyY2VEZWx0YVZpc2l0b3IoKTsKLQkJcmVzb3VyY2VEZWx0YVZpc2l0b3IudmlzaXREZWx0YShkZWx0YSk7Ci0JCS8vIGF0IHRoaXMgcG9pbnQsIGlmIHdlIGhhdmUgYWRkZWQgYW5kL29yIHJlbW92ZWQgSnBhRmlsZXMsIGFuICJ1cGRhdGUiIHdpbGwgaGF2ZSBiZWVuIHRyaWdnZXJlZDsKLQkJLy8gYW55IGNoYW5nZXMgdG8gdGhlIHJlc291cmNlIG1vZGVsIGR1cmluZyB0aGUgInJlc29sdmUiIHdpbGwgdHJpZ2dlciBmdXJ0aGVyICJ1cGRhdGVzIjsKLQkJLy8gdGhlcmUgc2hvdWxkIGJlIG5vIG5lZWQgdG8gInJlc29sdmUiIGV4dGVybmFsIEphdmEgdHlwZXMgKHRoZXkgY2FuJ3QgaGF2ZSByZWZlcmVuY2VzIHRvCi0JCS8vIHRoZSBpbnRlcm5hbCBKYXZhIHR5cGVzKQotCQlpZiAocmVzb3VyY2VEZWx0YVZpc2l0b3IuZW5jb3VudGVyZWRTaWduaWZpY2FudENoYW5nZSgpKSB7Ci0JCQl0aGlzLnJlc29sdmVJbnRlcm5hbEphdmFUeXBlcygpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlRGVsdGFWaXNpdG9yIGJ1aWxkSW50ZXJuYWxSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gZmlsZUNoYW5nZUlzU2lnbmlmaWNhbnQoSUZpbGUgZmlsZSwgaW50IGRlbHRhS2luZCkgewotCQkJCXJldHVybiBBYnN0cmFjdEpheGJQcm9qZWN0LnRoaXMuc3luY2hyb25pemVKYXhiRmlsZXMoZmlsZSwgZGVsdGFLaW5kKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCByZXNvdXJjZSBkZWx0YSB2aXNpdG9yIGNhbGxiYWNrLgotCSAqIFJldHVybiB0cnVlIGlmIGEgSmF4YkZpbGUgd2FzIGVpdGhlciBhZGRlZCBvciByZW1vdmVkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHN5bmNocm9uaXplSmF4YkZpbGVzKElGaWxlIGZpbGUsIGludCBkZWx0YUtpbmQpIHsKLQkJc3dpdGNoIChkZWx0YUtpbmQpIHsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQgOgotCQkJCXJldHVybiB0aGlzLmFkZEpheGJGaWxlKGZpbGUpOwotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIDoKLQkJCQlyZXR1cm4gdGhpcy5yZW1vdmVKYXhiRmlsZShmaWxlKTsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6Ci0JCQkJcmV0dXJuIHRoaXMuY2hlY2tGb3JDaGFuZ2VkRmlsZUNvbnRlbnQoZmlsZSk7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEX1BIQU5UT00gOgotCQkJCWJyZWFrOyAgLy8gaWdub3JlCi0JCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRURfUEhBTlRPTSA6Ci0JCQkJYnJlYWs7ICAvLyBpZ25vcmUKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOyAgLy8gb25seSB3b3JyaWVkIGFib3V0IGFkZGVkL3JlbW92ZWQvY2hhbmdlZCBmaWxlcwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrRm9yQ2hhbmdlZEZpbGVDb250ZW50KElGaWxlIGZpbGUpIHsKLQkJSmF4YkZpbGUgamF4YkZpbGUgPSB0aGlzLmdldEpheGJGaWxlKGZpbGUpOwotCQlpZiAoamF4YkZpbGUgPT0gbnVsbCkgewotCQkJLy8gdGhlIGZpbGUgbWlnaHQgaGF2ZSBjaGFuZ2VkIGl0cyBjb250ZW50IHRvIHNvbWV0aGluZyB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluCi0JCQlyZXR1cm4gdGhpcy5hZGRKYXhiRmlsZShmaWxlKTsKLQkJfQotCi0JCWlmIChqYXhiRmlsZS5nZXRDb250ZW50VHlwZSgpLmVxdWFscyhQbGF0Zm9ybVRvb2xzLmdldENvbnRlbnRUeXBlKGZpbGUpKSkgewotCQkJLy8gY29udGVudCBoYXMgbm90IGNoYW5nZWQgLSBpZ25vcmUKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIHRoZSBjb250ZW50IHR5cGUgY2hhbmdlZCwgd2UgbmVlZCB0byBidWlsZCBhIG5ldyBKUEEgZmlsZQotCQkvLyAoZS5nLiB0aGUgc2NoZW1hIG9mIGFuIG9ybS54bWwgZmlsZSBjaGFuZ2VkIGZyb20gSlBBIHRvIEVjbGlwc2VMaW5rKQotCQl0aGlzLnJlbW92ZUpheGJGaWxlKGpheGJGaWxlKTsKLQkJdGhpcy5hZGRKYXhiRmlsZShmaWxlKTsKLQkJcmV0dXJuIHRydWU7ICAvLyBhdCB0aGUgbGVhc3QsIHdlIGhhdmUgcmVtb3ZlZCBhIEpQQSBmaWxlCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZUludGVybmFsSmF2YVR5cGVzKCkgewotCQlmb3IgKEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqcmN1IDogdGhpcy5nZXRJbnRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSkgewotCQkJanJjdS5yZXNvbHZlVHlwZXMoKTsKLQkJfQotCX0KLQotLy8JcHJvdGVjdGVkIHZvaWQgZXh0ZXJuYWxQcm9qZWN0Q2hhbmdlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotLy8JCWlmICh0aGlzLmdldEphdmFQcm9qZWN0KCkuaXNPbkNsYXNzcGF0aChkZWx0YS5nZXRSZXNvdXJjZSgpKSkgewotLy8JCQlSZXNvdXJjZURlbHRhVmlzaXRvciByZXNvdXJjZURlbHRhVmlzaXRvciA9IHRoaXMuYnVpbGRFeHRlcm5hbFJlc291cmNlRGVsdGFWaXNpdG9yKCk7Ci0vLwkJCXJlc291cmNlRGVsdGFWaXNpdG9yLnZpc2l0RGVsdGEoZGVsdGEpOwotLy8JCQkvLyBmb3JjZSBhbiAidXBkYXRlIiBoZXJlIHNpbmNlIGFkZGluZyBhbmQvb3IgcmVtb3ZpbmcgYW4gZXh0ZXJuYWwgSmF2YSB0eXBlCi0vLwkJCS8vIHdpbGwgb25seSB0cmlnZ2VyIGFuICJ1cGRhdGUiIGlmIHRoZSAicmVzb2x2ZSIgY2F1c2VzIHNvbWV0aGluZyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwgdG8gY2hhbmdlCi0vLwkJCWlmIChyZXNvdXJjZURlbHRhVmlzaXRvci5lbmNvdW50ZXJlZFNpZ25pZmljYW50Q2hhbmdlKCkpIHsKLS8vCQkJCXRoaXMudXBkYXRlKCk7Ci0vLwkJCQl0aGlzLnJlc29sdmVFeHRlcm5hbEphdmFUeXBlcygpOwotLy8JCQkJdGhpcy5yZXNvbHZlSW50ZXJuYWxKYXZhVHlwZXMoKTsKLS8vCQkJfQotLy8JCX0KLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgUmVzb3VyY2VEZWx0YVZpc2l0b3IgYnVpbGRFeHRlcm5hbFJlc291cmNlRGVsdGFWaXNpdG9yKCkgewotLy8JCXJldHVybiBuZXcgUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7Ci0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgYm9vbGVhbiBmaWxlQ2hhbmdlSXNTaWduaWZpY2FudChJRmlsZSBmaWxlLCBpbnQgZGVsdGFLaW5kKSB7Ci0vLwkJCQlyZXR1cm4gQWJzdHJhY3RKYXhiUHJvamVjdC50aGlzLnN5bmNocm9uaXplRXh0ZXJuYWxGaWxlcyhmaWxlLCBkZWx0YUtpbmQpOwotLy8JCQl9Ci0vLwkJfTsKLS8vCX0KLS8vCi0vLwkvKioKLS8vCSAqIGV4dGVybmFsIHJlc291cmNlIGRlbHRhIHZpc2l0b3IgY2FsbGJhY2sKLS8vCSAqIFJldHVybiB0cnVlIGlmIGFuICJleHRlcm5hbCIgSmF2YSByZXNvdXJjZSBjb21waWxhdGlvbiB1bml0Ci0vLwkgKiB3YXMgYWRkZWQgb3IgcmVtb3ZlZC4KLS8vCSAqLwotLy8JcHJvdGVjdGVkIGJvb2xlYW4gc3luY2hyb25pemVFeHRlcm5hbEZpbGVzKElGaWxlIGZpbGUsIGludCBkZWx0YUtpbmQpIHsKLS8vCQlzd2l0Y2ggKGRlbHRhS2luZCkgewotLy8JCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDoKLS8vCQkJCXJldHVybiB0aGlzLmV4dGVybmFsRmlsZUFkZGVkKGZpbGUpOwotLy8JCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOgotLy8JCQkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxGaWxlUmVtb3ZlZChmaWxlKTsKLS8vCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDoKLS8vCQkJCWJyZWFrOyAgLy8gaWdub3JlCi0vLwkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERURfUEhBTlRPTSA6Ci0vLwkJCQlicmVhazsgIC8vIGlnbm9yZQotLy8JCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRURfUEhBTlRPTSA6Ci0vLwkJCQlicmVhazsgIC8vIGlnbm9yZQotLy8JCQlkZWZhdWx0IDoKLS8vCQkJCWJyZWFrOyAgLy8gb25seSB3b3JyaWVkIGFib3V0IGFkZGVkL3JlbW92ZWQvY2hhbmdlZCBmaWxlcwotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIGZhbHNlOwotLy8JfQotLy8KLS8vCXByb3RlY3RlZCBib29sZWFuIGV4dGVybmFsRmlsZUFkZGVkKElGaWxlIGZpbGUpIHsKLS8vCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybVRvb2xzLmdldENvbnRlbnRUeXBlKGZpbGUpOwotLy8JCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0vLwkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSkpIHsKLS8vCQkJcmV0dXJuIHRydWU7Ci0vLwkJfQotLy8JCWlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5KQVJfQ09OVEVOVF9UWVBFKSkgewotLy8JCQlyZXR1cm4gdHJ1ZTsKLS8vCQl9Ci0vLwkJcmV0dXJuIGZhbHNlOwotLy8JfQotLy8KLS8vCXByb3RlY3RlZCBib29sZWFuIGV4dGVybmFsRmlsZVJlbW92ZWQoSUZpbGUgZmlsZSkgewotLy8JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtVG9vbHMuZ2V0Q29udGVudFR5cGUoZmlsZSk7Ci0vLwkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCQlpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKSkgewotLy8JCQlyZXR1cm4gdGhpcy5yZW1vdmVFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChmaWxlKTsKLS8vCQl9Ci0vLwkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpKSB7Ci0vLwkJCXJldHVybiB0aGlzLmV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVDYWNoZS5yZW1vdmVQZXJzaXN0ZW50VHlwZXMoZmlsZSk7Ci0vLwkJfQotLy8JCXJldHVybiBmYWxzZTsKLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgdm9pZCByZXNvbHZlRXh0ZXJuYWxKYXZhVHlwZXMoKSB7Ci0vLwkJZm9yIChKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQganJjdSA6IHRoaXMuZ2V0RXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCkpIHsKLS8vCQkJanJjdS5yZXNvbHZlVHlwZXMoKTsKLS8vCQl9Ci0vLwl9Ci0KLQkvLyAqKioqKiByZXNvdXJjZSBkZWx0YSB2aXNpdG9ycwotCS8qKgotCSAqIGFkZCBvciByZW1vdmUgYSBKUEEgZmlsZSBmb3IgZXZlcnkgW2FwcHJvcHJpYXRlXSBmaWxlIGVuY291bnRlcmVkIGJ5IHRoZSB2aXNpdG9yCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIFJlc291cmNlRGVsdGFWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJcHJvdGVjdGVkIGJvb2xlYW4gZW5jb3VudGVyZWRTaWduaWZpY2FudENoYW5nZSA9IGZhbHNlOwotCQkKLQkJcHJvdGVjdGVkIFJlc291cmNlRGVsdGFWaXNpdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHZpc2l0RGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCXRyeSB7Ci0JCQkJZGVsdGEuYWNjZXB0KHRoaXMpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCS8vIHNob3VsZG4ndCBoYXBwZW4gLSB3ZSBkb24ndCB0aHJvdyBhbnkgQ29yZUV4Y2VwdGlvbnMKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJSVJlc291cmNlIHJlcyA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlzd2l0Y2ggKHJlcy5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZS5ST09UIDoKLQkJCQkJcmV0dXJuIHRydWU7ICAvLyB2aXNpdCBjaGlsZHJlbgotCQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCQlyZXR1cm4gdHJ1ZTsgIC8vIHZpc2l0IGNoaWxkcmVuCi0JCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKLQkJCQkJcmV0dXJuIHRydWU7ICAvLyB2aXNpdCBjaGlsZHJlbgotCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJCQl0aGlzLmZpbGVDaGFuZ2VkKChJRmlsZSkgcmVzLCBkZWx0YS5nZXRLaW5kKCkpOwotCQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBubyBjaGlsZHJlbgotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBubyBjaGlsZHJlbiAocHJvYmFibHkgc2hvdWxkbid0IGdldCBoZXJlLi4uKQotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgZmlsZUNoYW5nZWQoSUZpbGUgZmlsZSwgaW50IGRlbHRhS2luZCkgewotCQkJaWYgKHRoaXMuZmlsZUNoYW5nZUlzU2lnbmlmaWNhbnQoZmlsZSwgZGVsdGFLaW5kKSkgewotCQkJCXRoaXMuZW5jb3VudGVyZWRTaWduaWZpY2FudENoYW5nZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBmaWxlQ2hhbmdlSXNTaWduaWZpY2FudChJRmlsZSBmaWxlLCBpbnQgZGVsdGFLaW5kKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIHZpc2l0b3IgZW5jb3VudGVyZWQgc29tZSBzb3J0IG9mICJzaWduaWZpY2FudCIKLQkJICogY2hhbmdlIHdoaWxlIHRyYXZlcnNpbmcgdGhlIElSZXNvdXJjZURlbHRhCi0JCSAqIChlLmcuIGEgSlBBIGZpbGUgd2FzIGFkZGVkIG9yIHJlbW92ZWQpLgotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gZW5jb3VudGVyZWRTaWduaWZpY2FudENoYW5nZSgpIHsKLQkJCXJldHVybiB0aGlzLmVuY291bnRlcmVkU2lnbmlmaWNhbnRDaGFuZ2U7Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdXBwb3J0IGZvciBtb2RpZnlpbmcgZG9jdW1lbnRzIHNoYXJlZCB3aXRoIHRoZSBVSSAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRUaHJlYWRMb2NhbE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKEV4dGVuZGVkQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvcikgewotCQl0aGlzLm1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLnNldChjb21tYW5kRXhlY3V0b3IpOwotCX0KLQotCXB1YmxpYyBFeHRlbmRlZENvbW1hbmRFeGVjdXRvciBnZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3I7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplIGNvbnRleHQgbW9kZWwgd2l0aCByZXNvdXJjZSBtb2RlbCAqKioqKioqKioqCi0KLQlwdWJsaWMgU3luY2hyb25pemVyIGdldENvbnRleHRNb2RlbFN5bmNocm9uaXplcigpIHsKLQkJcmV0dXJuIHRoaXMuY29udGV4dE1vZGVsU3luY2hyb25pemVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRleHRNb2RlbFN5bmNocm9uaXplcihTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyKSB7Ci0JCWlmIChzeW5jaHJvbml6ZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIuc3RvcCgpOwotCQl0aGlzLnNldENvbnRleHRNb2RlbFN5bmNocm9uaXplcl8oc3luY2hyb25pemVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXJfKFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIpIHsKLQkJdGhpcy5jb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIgPSBzeW5jaHJvbml6ZXI7Ci0JCXRoaXMuY29udGV4dE1vZGVsU3luY2hyb25pemVyLnN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogRGVsZWdhdGUgdG8gdGhlIGNvbnRleHQgbW9kZWwgc3luY2hyb25pemVyIHNvIGNsaWVudHMgY2FuIGNvbmZpZ3VyZSBob3cKLQkgKiBzeW5jaHJvbml6YXRpb25zIG9jY3VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplQ29udGV4dE1vZGVsKCkgewotCQl0aGlzLnN5bmNocm9uaXppbmdDb250ZXh0TW9kZWwgPSB0cnVlOwotCQl0aGlzLmNvbnRleHRNb2RlbFN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpOwotCQl0aGlzLnN5bmNocm9uaXppbmdDb250ZXh0TW9kZWwgPSBmYWxzZTsKLQotCQkvLyBUaGVyZSBhcmUgc29tZSBjaGFuZ2VzIHRvIHRoZSByZXNvdXJjZSBtb2RlbCB0aGF0IHdpbGwgbm90IGNoYW5nZQotCQkvLyB0aGUgZXhpc3RpbmcgY29udGV4dCBtb2RlbCBhbmQgdHJpZ2dlciBhbiB1cGRhdGUgKGUuZy4gYWRkaW5nIGFuCi0JCS8vIEBFbnRpdHkgYW5ub3RhdGlvbiB3aGVuIHRoZSB0aGUgSlBBIHByb2plY3QgaXMgYXV0b21hdGljYWxseQotCQkvLyBkaXNjb3ZlcmluZyBhbm5vdGF0ZWQgY2xhc3Nlcyk7IHNvIHdlIGV4cGxpY2l0bHkgZXhlY3V0ZSBhbiB1cGRhdGUKLQkJLy8gaGVyZSB0byBkaXNjb3ZlciB0aG9zZSBjaGFuZ2VzLgotCQl0aGlzLnVwZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSB0aGUgY29udGV4dCBtb2RlbCBzeW5jaHJvbml6ZXIuCi0JICovCi0JcHVibGljIElTdGF0dXMgc3luY2hyb25pemVDb250ZXh0TW9kZWwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRoaXMuY29udGV4dFJvb3Quc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZUNvbnRleHRNb2RlbEFuZFdhaXQoKSB7Ci0JCVN5bmNocm9uaXplciB0ZW1wID0gdGhpcy5jb250ZXh0TW9kZWxTeW5jaHJvbml6ZXI7Ci0JCXRoaXMuc2V0Q29udGV4dE1vZGVsU3luY2hyb25pemVyKHRoaXMuYnVpbGRTeW5jaHJvbm91c0NvbnRleHRNb2RlbFN5bmNocm9uaXplcigpKTsKLQkJdGhpcy5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl0aGlzLnNldENvbnRleHRNb2RlbFN5bmNocm9uaXplcih0ZW1wKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCBjb250ZXh0IG1vZGVsIHN5bmNocm9uaXplciAoc3luY2hyb25vdXMpICoqKioqKioqKioKLQotCXByb3RlY3RlZCBTeW5jaHJvbml6ZXIgYnVpbGRTeW5jaHJvbm91c0NvbnRleHRNb2RlbFN5bmNocm9uaXplcigpIHsKLQkJcmV0dXJuIG5ldyBTeW5jaHJvbm91c1N5bmNocm9uaXplcih0aGlzLmJ1aWxkU3luY2hyb25vdXNDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXJDb21tYW5kKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGJ1aWxkU3luY2hyb25vdXNDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXJDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IFN5bmNocm9ub3VzQ29udGV4dE1vZGVsU3luY2hyb25pemVyQ29tbWFuZCgpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBTeW5jaHJvbm91c0NvbnRleHRNb2RlbFN5bmNocm9uaXplckNvbW1hbmQKLQkJaW1wbGVtZW50cyBDb21tYW5kCi0JewotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJQWJzdHJhY3RKYXhiUHJvamVjdC50aGlzLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByb2plY3QgInVwZGF0ZSIgKioqKioqKioqKgotCi0JcHVibGljIENhbGxiYWNrU3luY2hyb25pemVyIGdldFVwZGF0ZVN5bmNocm9uaXplcigpIHsKLQkJcmV0dXJuIHRoaXMudXBkYXRlU3luY2hyb25pemVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZVN5bmNocm9uaXplcihDYWxsYmFja1N5bmNocm9uaXplciBzeW5jaHJvbml6ZXIpIHsKLQkJaWYgKHN5bmNocm9uaXplciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnVwZGF0ZVN5bmNocm9uaXplci5zdG9wKCk7Ci0JCXRoaXMudXBkYXRlU3luY2hyb25pemVyLnJlbW92ZUxpc3RlbmVyKHRoaXMudXBkYXRlU3luY2hyb25pemVyTGlzdGVuZXIpOwotCQl0aGlzLnNldFVwZGF0ZVN5bmNocm9uaXplcl8oc3luY2hyb25pemVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcGRhdGVTeW5jaHJvbml6ZXJfKENhbGxiYWNrU3luY2hyb25pemVyIHN5bmNocm9uaXplcikgewotCQl0aGlzLnVwZGF0ZVN5bmNocm9uaXplciA9IHN5bmNocm9uaXplcjsKLQkJdGhpcy51cGRhdGVTeW5jaHJvbml6ZXIuYWRkTGlzdGVuZXIodGhpcy51cGRhdGVTeW5jaHJvbml6ZXJMaXN0ZW5lcik7Ci0JCXRoaXMudXBkYXRlU3luY2hyb25pemVyLnN0YXJ0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKCkgewotCQlzdXBlci5zdGF0ZUNoYW5nZWQoKTsKLQkJdGhpcy51cGRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgSkFYQiBwcm9qZWN0J3Mgc3RhdGUgaGFzIGNoYW5nZWQsICJ1cGRhdGUiIHRob3NlIHBhcnRzIG9mIHRoZQotCSAqIEpBWEIgcHJvamVjdCB0aGF0IGFyZSBkZXBlbmRlbnQgb24gb3RoZXIgcGFydHMgb2YgdGhlIEpBWEIgcHJvamVjdC4KLQkgKiA8cD4KLQkgKiBEZWxlZ2F0ZSB0byB0aGUgdXBkYXRlIHN5bmNocm9uaXplciBzbyBjbGllbnRzIGNhbiBjb25maWd1cmUgaG93Ci0JICogdXBkYXRlcyBvY2N1ci4KLQkgKiA8cD4KLQkgKiBJZ25vcmUgYW55IDxlbT51cGRhdGVzPC9lbT4gdGhhdCBvY2N1ciB3aGlsZSB3ZSBhcmUgc3luY2hyb25pemluZwotCSAqIHRoZSBjb250ZXh0IG1vZGVsIHdpdGggdGhlIHJlc291cmNlIG1vZGVsIGJlY2F1c2Ugd2Ugd2lsbCA8ZW0+dXBkYXRlPC9lbT4KLQkgKiB0aGUgY29udGV4dCBtb2RlbCBhdCB0aGUgY29tcGxldGlvbiBvZiB0aGUgPGVtPnN5bmM8L2VtPi4gVGhpcyBpcyByZWFsbHkKLQkgKiBvbmx5IHVzZWZ1bCBmb3Igc3luY2hyb25vdXMgPGVtPnN5bmNzPC9lbT4gYW5kIDxlbT51cGRhdGVzPC9lbT47IHNpbmNlCi0JICogdGhlIGpvYiBzY2hlZHVsaW5nIHJ1bGVzIHdpbGwgcHJldmVudCB0aGUgPGVtPnN5bmM8L2VtPiBhbmQKLQkgKiA8ZW0+dXBkYXRlPC9lbT4gam9icyBmcm9tIHJ1bm5pbmcgY29uY3VycmVudGx5LgotCSAqIAotCSAqIEBzZWUgI3VwZGF0ZUFuZFdhaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpIHsKLQkJaWYgKCAhIHRoaXMuc3luY2hyb25pemluZ0NvbnRleHRNb2RlbCkgewotCQkJdGhpcy51cGRhdGVTeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSB0aGUgdXBkYXRlIHN5bmNocm9uaXplci4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB1cGRhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRoaXMuY29udGV4dFJvb3QudXBkYXRlKCk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIHVzZWQgYnkgdGhlIHVwZGF0ZSBzeW5jaHJvbml6ZXIgdG8gbm90aWZ5IHRoZSBKQVhCCi0JICogcHJvamVjdCB0aGF0IHRoZSAidXBkYXRlIiBoYXMgcXVpZXNjZWQgKGkuZS4gdGhlICJ1cGRhdGUiIGhhcyBjb21wbGV0ZWQKLQkgKiBhbmQgdGhlcmUgYXJlIG5vIG91dHN0YW5kaW5nIHJlcXVlc3RzIGZvciBmdXJ0aGVyICJ1cGRhdGVzIikuCi0JICovCi0gCXB1YmxpYyB2b2lkIHVwZGF0ZVF1aWVzY2VkKCkgewotIAkJLy9ub3RoaW5nIHlldAotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUFuZFdhaXQoKSB7Ci0JCUNhbGxiYWNrU3luY2hyb25pemVyIHRlbXAgPSB0aGlzLnVwZGF0ZVN5bmNocm9uaXplcjsKLQkJdGhpcy5zZXRVcGRhdGVTeW5jaHJvbml6ZXIodGhpcy5idWlsZFN5bmNocm9ub3VzVXBkYXRlU3luY2hyb25pemVyKCkpOwotCQl0aGlzLnVwZGF0ZSgpOwotCQl0aGlzLnNldFVwZGF0ZVN5bmNocm9uaXplcih0ZW1wKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCB1cGRhdGUgc3luY2hyb25pemVyIChzeW5jaHJvbm91cykgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENhbGxiYWNrU3luY2hyb25pemVyIGJ1aWxkU3luY2hyb25vdXNVcGRhdGVTeW5jaHJvbml6ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2FsbGJhY2tTeW5jaHJvbm91c1N5bmNocm9uaXplcih0aGlzLmJ1aWxkU3luY2hyb25vdXNVcGRhdGVTeW5jaHJvbml6ZXJDb21tYW5kKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGJ1aWxkU3luY2hyb25vdXNVcGRhdGVTeW5jaHJvbml6ZXJDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IFN5bmNocm9ub3VzVXBkYXRlU3luY2hyb25pemVyQ29tbWFuZCgpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBTeW5jaHJvbm91c1VwZGF0ZVN5bmNocm9uaXplckNvbW1hbmQKLQkJaW1wbGVtZW50cyBDb21tYW5kCi0JewotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJQWJzdHJhY3RKYXhiUHJvamVjdC50aGlzLnVwZGF0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB1cGRhdGUgc3luY2hyb25pemVyIGxpc3RlbmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBDYWxsYmFja1N5bmNocm9uaXplci5MaXN0ZW5lciBidWlsZFVwZGF0ZVN5bmNocm9uaXplckxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFVwZGF0ZVN5bmNocm9uaXplckxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFVwZGF0ZVN5bmNocm9uaXplckxpc3RlbmVyCi0JCWltcGxlbWVudHMgQ2FsbGJhY2tTeW5jaHJvbml6ZXIuTGlzdGVuZXIKLQl7Ci0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXphdGlvblF1aWVzY2VkKENhbGxiYWNrU3luY2hyb25pemVyIHN5bmNocm9uaXplcikgewotCQkJQWJzdHJhY3RKYXhiUHJvamVjdC50aGlzLnVwZGF0ZVF1aWVzY2VkKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9HZW5lcmljSmF4YkZpbGUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL0dlbmVyaWNKYXhiRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzRhZDE0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL0dlbmVyaWNKYXhiRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YlByb2plY3Q7Ci0KLS8qKgotICogVGhlIHRyYW5zaXRpb24gYmV0d2VlbiBhIEpBWEIgcHJvamVjdCBhbmQgdGhlIHJlc291cmNlIG1vZGVsIGFzc29jaWF0ZWQKLSAqIHdpdGggYSBmaWxlLgotICogSG9sZCB0aGUgYXNzb2NpYXRlZCByb290IHN0cnVjdHVyZSBub2Rlcywgd2hpY2ggYXJlIGhvb2tzIHRvIHRoZQotICogY29udGV4dCBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKYXhiRmlsZQotCWV4dGVuZHMgQWJzdHJhY3RKYXhiTm9kZQotCWltcGxlbWVudHMgSmF4YkZpbGUKLXsKLQkvKioKLQkgKiB0eXBpY2FsbHkgYSAuamF2YSBvciAueG1sIGZpbGUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElGaWxlIGZpbGU7Ci0KLQkvKioKLQkgKiBjYWNoZSB0aGUgY29udGVudCB0eXBlIC0gaWYgdGhlIGNvbnRlbnQgdHlwZSBjaGFuZ2VzLCB0aGUgSkFYQiBwcm9qZWN0Ci0JICogd2lsbCB0aHJvdyBvdXQgdGhlIEpBWEIgZmlsZSBhbmQgYnVpbGQgYSBuZXcgb25lCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElDb250ZW50VHlwZSBjb250ZW50VHlwZTsKLQotCS8qKgotCSAqIHRoZSByZXNvdXJjZSBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWxlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEpwdFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbDsKLQotLy8JLyoqCi0vLwkgKiB0aGUgcm9vdCBzdHJ1Y3R1cmUgKGNvbnRleHQgbW9kZWwpIG5vZGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlc291cmNlCi0vLwkgKiBtb2RlbAotLy8JICovCi0vLwlwcm90ZWN0ZWQgZmluYWwgSGFzaHRhYmxlPE9iamVjdCwgSnBhU3RydWN0dXJlTm9kZT4gcm9vdFN0cnVjdHVyZU5vZGVzOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgR2VuZXJpY0pheGJGaWxlKEpheGJQcm9qZWN0IGpheGJQcm9qZWN0LCBJRmlsZSBmaWxlLCBJQ29udGVudFR5cGUgY29udGVudFR5cGUsIEpwdFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCkgewotCQlzdXBlcihqYXhiUHJvamVjdCk7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCXRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKLQkJdGhpcy5yZXNvdXJjZU1vZGVsID0gcmVzb3VyY2VNb2RlbDsKLS8vCQl0aGlzLnJvb3RTdHJ1Y3R1cmVOb2RlcyA9IG5ldyBIYXNodGFibGU8T2JqZWN0LCBKcGFTdHJ1Y3R1cmVOb2RlPigpOwotCX0KLS8vCi0vLwkvKioKLS8vCSAqIENoYW5nZXMgdG8gUk9PVF9TVFJVQ1RVUkVfTk9ERVNfQ09MTEVDVElPTiBkbyBub3QgbmVlZCB0byB0cmlnZ2VyIGEKLS8vCSAqIHByb2plY3QgdXBkYXRlLiBPbmx5IHRoZSBVSSBjYXJlcyBhYm91dCB0aGUgcm9vdCBzdHJ1Y3R1cmUgbm9kZXMuCi0vLwkgKiBJZiBhIHByb2plY3QgdXBkYXRlIGlzIGFsbG93ZWQgdG8gaGFwcGVuLCBhbiBpbmZpbml0ZSBsb29wIHdpbGwgcmVzdWx0Ci0vLwkgKiBpZiBhbnkgamF2YSBjbGFzcyBpcyBzcGVjaWZpZWQgaW4gbW9yZSB0aGFuIG9uZSBsb2NhdGlvbiBpbiB0aGUKLS8vCSAqIHBlcnNpc3RlbmNlIHVuaXQuCi0vLwkgKi8KLS8vCUBPdmVycmlkZQotLy8JcHJvdGVjdGVkIHZvaWQgYWRkTm9uVXBkYXRlQXNwZWN0TmFtZXNUbyhTZXQ8U3RyaW5nPiBub25VcGRhdGVBc3BlY3ROYW1lcykgewotLy8JCXN1cGVyLmFkZE5vblVwZGF0ZUFzcGVjdE5hbWVzVG8obm9uVXBkYXRlQXNwZWN0TmFtZXMpOwotLy8JCW5vblVwZGF0ZUFzcGVjdE5hbWVzLmFkZChST09UX1NUUlVDVFVSRV9OT0RFU19DT0xMRUNUSU9OKTsKLS8vCX0KLQotCi0JLy8gKioqKioqKioqKiBmaWxlICoqKioqKioqKioKLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gdGhpcy5maWxlOwotCX0KLQotCXB1YmxpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRlbnRUeXBlOwotCX0KLQotCXB1YmxpYyBKcHRSZXNvdXJjZU1vZGVsIGdldFJlc291cmNlTW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlTW9kZWw7Ci0JfQotCi0JcHVibGljIEpwdFJlc291cmNlTW9kZWwgZ2V0UmVzb3VyY2VNb2RlbChJQ29udGVudFR5cGUgY3QpIHsKLQkJcmV0dXJuIHRoaXMuY29udGVudFR5cGUuaXNLaW5kT2YoY3QpID8gdGhpcy5yZXNvdXJjZU1vZGVsIDogbnVsbDsKLQl9Ci0KLQotLy8JLy8gKioqKioqKioqKiByb290IHN0cnVjdHVyZSBub2RlcyAqKioqKioqKioqCi0vLwotLy8JcHVibGljIEl0ZXJhdG9yPEpwYVN0cnVjdHVyZU5vZGU+IHJvb3RTdHJ1Y3R1cmVOb2RlcygpIHsKLS8vCQlyZXR1cm4gdGhpcy5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpOwotLy8JfQotLy8KLS8vCXByb3RlY3RlZCBJdGVyYWJsZTxKcGFTdHJ1Y3R1cmVOb2RlPiBnZXRSb290U3RydWN0dXJlTm9kZXMoKSB7Ci0vLwkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxKcGFTdHJ1Y3R1cmVOb2RlPih0aGlzLnJvb3RTdHJ1Y3R1cmVOb2Rlcy52YWx1ZXMoKSk7Ci0vLwl9Ci0vLwotLy8JcHVibGljIGludCByb290U3RydWN0dXJlTm9kZXNTaXplKCkgewotLy8JCXJldHVybiB0aGlzLnJvb3RTdHJ1Y3R1cmVOb2Rlcy5zaXplKCk7Ci0vLwl9Ci0vLwotLy8JcHVibGljIHZvaWQgYWRkUm9vdFN0cnVjdHVyZU5vZGUoT2JqZWN0IGtleSwgSnBhU3RydWN0dXJlTm9kZSByb290U3RydWN0dXJlTm9kZSkgewotLy8JCUpwYVN0cnVjdHVyZU5vZGUgb2xkID0gdGhpcy5yb290U3RydWN0dXJlTm9kZXMucHV0KGtleSwgcm9vdFN0cnVjdHVyZU5vZGUpOwotLy8JCWlmIChyb290U3RydWN0dXJlTm9kZSAhPSBvbGQpIHsKLS8vCQkJaWYgKG9sZCAhPSBudWxsKSB7Ci0vLwkJCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChST09UX1NUUlVDVFVSRV9OT0RFU19DT0xMRUNUSU9OLCBvbGQpOwotLy8JCQl9Ci0vLwkJCXRoaXMuZmlyZUl0ZW1BZGRlZChST09UX1NUUlVDVFVSRV9OT0RFU19DT0xMRUNUSU9OLCByb290U3RydWN0dXJlTm9kZSk7Ci0vLwkJfQotLy8JfQotLy8KLS8vCXB1YmxpYyB2b2lkIHJlbW92ZVJvb3RTdHJ1Y3R1cmVOb2RlKE9iamVjdCBrZXkpIHsKLS8vCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChST09UX1NUUlVDVFVSRV9OT0RFU19DT0xMRUNUSU9OLCB0aGlzLnJvb3RTdHJ1Y3R1cmVOb2Rlcy5yZW1vdmUoa2V5KSk7Ci0vLwl9Ci0vLwotLy8JcHVibGljIEpwYVN0cnVjdHVyZU5vZGUgZ2V0U3RydWN0dXJlTm9kZShpbnQgdGV4dE9mZnNldCkgewotLy8JCWZvciAoSnBhU3RydWN0dXJlTm9kZSByb290Tm9kZSA6IHRoaXMuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkpIHsKLS8vCQkJSnBhU3RydWN0dXJlTm9kZSBub2RlID0gcm9vdE5vZGUuZ2V0U3RydWN0dXJlTm9kZSh0ZXh0T2Zmc2V0KTsKLS8vCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotLy8JCQkJcmV0dXJuIG5vZGU7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJcmV0dXJuIG51bGw7Ci0vLwl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmZpbGUpOwotCQlzYi5hcHBlbmQoJ1snKTsKLQkJc2IuYXBwZW5kKHRoaXMuY29udGVudFR5cGUuZ2V0TmFtZSgpKTsKLQkJc2IuYXBwZW5kKCddJyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9HZW5lcmljSmF4YlByb2plY3QuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL0dlbmVyaWNKYXhiUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjgxMDE3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL0dlbmVyaWNKYXhiUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdDsKLQotLyoqCi0gKiBOb3QgbXVjaCBkaWZmZXJlbnQgZnJvbSB0aGUgYWJzdHJhY3QgSkFYQiBwcm9qZWN0LgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pheGJQcm9qZWN0Ci0JZXh0ZW5kcyBBYnN0cmFjdEpheGJQcm9qZWN0Ci17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBHZW5lcmljSmF4YlByb2plY3QoSmF4YlByb2plY3QuQ29uZmlnIGNvbmZpZykgewotCQlzdXBlcihjb25maWcpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvSmF2YUVsZW1lbnRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvSmF2YUVsZW1lbnRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjc3NmNmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL0phdmFFbGVtZW50QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci0KLS8qKgotICogRmFjdG9yeSB0byBidWlsZCBEYWxpIGFkYXB0ZXJzIGZvciBhbiB7QGxpbmsgSUphdmFFbGVtZW50fTo8dWw+Ci0gKiA8bGk+e0BsaW5rIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9ufQotICogPC91bD4KLSAqIFNlZSA8Y29kZT5vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3BsdWdpbi54bWw8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUVsZW1lbnRBZGFwdGVyRmFjdG9yeQotCWltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz5bXSBBREFQVEVSX0xJU1QgPSBuZXcgQ2xhc3NbXSB7Ci0JCQlKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbi5jbGFzcwotCQl9OwotCi0JcHVibGljIENsYXNzPD8+W10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBBREFQVEVSX0xJU1Q7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJSmF2YUVsZW1lbnQpIHsKLQkJCXJldHVybiB0aGlzLmdldEFkYXB0ZXIoKElKYXZhRWxlbWVudCkgYWRhcHRhYmxlT2JqZWN0LCBhZGFwdGVyVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgT2JqZWN0IGdldEFkYXB0ZXIoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBDbGFzczw/PiBhZGFwdGVyVHlwZSkgewotCQlpZiAoYWRhcHRlclR5cGUgPT0gSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24uY2xhc3MpIHsKLQkJCXJldHVybiBqYXZhRWxlbWVudC5nZXRSZXNvdXJjZSgpLmdldEFkYXB0ZXIoSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24uY2xhc3MpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL0phdmFQYWNrYWdlSW5mb1Jlc291cmNlTW9kZWxQcm92aWRlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvSmF2YVBhY2thZ2VJbmZvUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyY2E1ZWEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvSmF2YVBhY2thZ2VJbmZvUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVBhY2thZ2VJbmZvQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YlJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luOwotCi0vKioKLSAqIEphdmEgcGFja2FnZS1pbmZvLmphdmEgc291cmNlIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEphdmFQYWNrYWdlSW5mb1Jlc291cmNlTW9kZWxQcm92aWRlcgotCWltcGxlbWVudHMgSmF4YlJlc291cmNlTW9kZWxQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpheGJSZXNvdXJjZU1vZGVsUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgSmF2YVBhY2thZ2VJbmZvUmVzb3VyY2VNb2RlbFByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpheGJSZXNvdXJjZU1vZGVsUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgSmF2YVBhY2thZ2VJbmZvUmVzb3VyY2VNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBKcHRDb21tb25Db3JlUGx1Z2luLkpBVkFfU09VUkNFX1BBQ0tBR0VfSU5GT19DT05URU5UX1RZUEU7Ci0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBidWlsZFJlc291cmNlTW9kZWwoSmF4YlByb2plY3QgamF4YlByb2plY3QsIElGaWxlIGZpbGUpIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGZpbGUpOwotCQl0cnkgewotCQkJaWYgKGNvbXBpbGF0aW9uVW5pdC5nZXRQYWNrYWdlRGVjbGFyYXRpb25zKCkubGVuZ3RoID4gMCl7Ci0JCQkJcmV0dXJuIG5ldyBTb3VyY2VQYWNrYWdlSW5mb0NvbXBpbGF0aW9uVW5pdCgKLQkJCQkJCWNvbXBpbGF0aW9uVW5pdCwKLQkJCQkJCWpheGJQcm9qZWN0LmdldFBsYXRmb3JtKCkuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCksCi0JCQkJCQlqYXhiUHJvamVjdC5nZXRQbGF0Zm9ybSgpLmdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCksCi0JCQkJCQlqYXhiUHJvamVjdC5nZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcigpKTsKLQkJCX0gCi0JCQkvL2lnbm9yZSBwYWNrYWdlLWluZm8gcGxhY2VkIGluIGRlZmF1bHQgcGFja2FnZSBhcwotCQkJLy9pdCBkb2Vzbid0IGhhdmUgcGFja2FnZSBkZWNsYXJhdGlvbiBhbmQgY2FuJ3QgaG9sZCBhbm5vdGF0aW9ucwotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRKYXhiQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQkvLyBJZ25vcmUgLS0gcHJvamVjdCBpcyBpbiBhIGJhZCBzdGF0ZS4gVGhpcyB3aWxsIGdldCByZWNhbGxlZCBpZiBuZWNlc3NhcnkKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL0phdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL0phdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA2NmYxMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9KYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVR5cGVDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotCi0vKioKLSAqIEphdmEgc291cmNlIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEpheGJSZXNvdXJjZU1vZGVsUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF4YlJlc291cmNlTW9kZWxQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBKYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBKcHRDb21tb25Db3JlUGx1Z2luLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGJ1aWxkUmVzb3VyY2VNb2RlbChKYXhiUHJvamVjdCBqYXhiUHJvamVjdCwgSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVR5cGVDb21waWxhdGlvblVuaXQoCi0JCQkJCUphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZmlsZSksCi0JCQkJCWpheGJQcm9qZWN0LmdldFBsYXRmb3JtKCkuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCksCi0JCQkJCWpheGJQcm9qZWN0LmdldFBsYXRmb3JtKCkuZ2V0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIoKSwKLQkJCQkJamF4YlByb2plY3QuZ2V0TW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKQotCQkJCSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9KcHRKYXhiQ29yZU1lc3NhZ2VzLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9KcHRKYXhiQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZGJjZGMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvSnB0SmF4YkNvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIExvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IERhbGkgSkFYQiBDb3JlLgotICovCi1wdWJsaWMgY2xhc3MgSnB0SmF4YkNvcmVNZXNzYWdlcyB7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09OVEVYVF9NT0RFTF9TWU5DX0pPQl9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVQREFURV9KT0JfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUkVGRVJFTkNFU19GTFVTSF9KT0JfTkFNRTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yX2dlbmVyYXRpbmdDbGFzc2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JfZ2VuZXJhdGluZ0NsYXNzZXNUYXNrOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpheGJGYWNldENvbmZpZ192YWxpZGF0ZVBsYXRmb3JtTm90U3BlY2lmaWVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpheGJGYWNldENvbmZpZ192YWxpZGF0ZVBsYXRmb3JtRG9lc05vdFN1cHBvcnRGYWNldFZlcnNpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnJlTGlicmFyeVZhbGlkYXRvcl9pbnZhbGlkUGxhdGZvcm07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnJlTGlicmFyeVZhbGlkYXRvcl9pbnZhbGlkSmF2YUZhY2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpyZUxpYnJhcnlWYWxpZGF0b3JfaW52YWxpZEphdmFMaWJyYXJ5OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJMaWJyYXJ5VmFsaWRhdG9yX2luY29tcGF0aWJsZUphdmFGYWNldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VyTGlicmFyeVZhbGlkYXRvcl9pbmNvbXBhdGlibGVKYXZhTGlicmFyeTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFHZW5lcmF0b3JfY3JlYXRpbmdKQVhCUHJvcGVydGllc0ZpbGVUYXNrOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9BVFRSSUJVVEVfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfRUxFTUVOVF9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9UWVBFX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU1VCU1RJVFVUSU9OX0hFQURfREVTQzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfRUxFTUVOVF9ERUNMX19TQ09QRTsKLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianB0X2pheGJfY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBKcHRKYXhiQ29yZU1lc3NhZ2VzLmNsYXNzOwotCQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7Ci0JfQotCQotCQotCXByaXZhdGUgSnB0SmF4YkNvcmVNZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvUmVzb3VyY2VBZGFwdGVyRmFjdG9yeS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvUmVzb3VyY2VBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTg1N2Y1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL1Jlc291cmNlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLQotLyoqCi0gKiBGYWN0b3J5IHRvIGJ1aWxkIERhbGkgYWRhcHRlcnMgZm9yIGFuIHtAbGluayBJUmVzb3VyY2V9Ojx1bD4KLSAqIDxsaT57QGxpbmsgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb259Ci0gKiA8L3VsPgotICogU2VlIDxjb2RlPm9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvcGx1Z2luLnhtbDwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUFkYXB0ZXJGYWN0b3J5Ci0JaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIEFEQVBURVJfTElTVCA9IG5ldyBDbGFzc1tdIHsKLQkJCUpheGJQbGF0Zm9ybURlc2NyaXB0aW9uLmNsYXNzCi0JCX07Ci0KLQlwdWJsaWMgQ2xhc3M8Pz5bXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIEFEQVBURVJfTElTVDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJcmV0dXJuIHRoaXMuZ2V0QWRhcHRlcigoSVJlc291cmNlKSBhZGFwdGFibGVPYmplY3QsIGFkYXB0ZXJUeXBlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3QgZ2V0QWRhcHRlcihJUmVzb3VyY2UgcmVzb3VyY2UsIENsYXNzPD8+IGFkYXB0ZXJUeXBlKSB7Ci0JCWlmIChhZGFwdGVyVHlwZSA9PSBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbi5jbGFzcykgewotCQkJcmV0dXJuIHRoaXMuZ2V0SmF4YlBsYXRmb3JtRGVzY3JpcHRpb24ocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGdldEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0SmF4YlBsYXRmb3JtTWFuYWdlcigpLmdldEpheGJQbGF0Zm9ybShKcHRKYXhiQ29yZVBsdWdpbi5nZXRKYXhiUGxhdGZvcm1JZChyZXNvdXJjZS5nZXRQcm9qZWN0KCkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9TY2hlbWFFbnRyeUltcGwuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL1NjaGVtYUVudHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjA4Mzk2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL1NjaGVtYUVudHJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5TY2hlbWFFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFJlc291cmNlSW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgU2NoZW1hRW50cnlJbXBsCi0JCWltcGxlbWVudHMgU2NoZW1hRW50cnkgewotCQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxvY2F0aW9uOwotCQotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQkKLQlwcml2YXRlIFhTRFJlc291cmNlSW1wbCBzY2hlbWFSZXNvdXJjZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gdW5sb2FkZWQgPSBmYWxzZTsKLQkKLQlwcml2YXRlIFNjaGVtYVJlc291cmNlQWRhcHRlciBzY2hlbWFSZXNvdXJjZUFkYXB0ZXI7Ci0JCi0JCi0JU2NoZW1hRW50cnlJbXBsKFN0cmluZyBsb2NhdGlvbikgewotCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JCXRoaXMuc2NoZW1hUmVzb3VyY2VBZGFwdGVyID0gbmV3IFNjaGVtYVJlc291cmNlQWRhcHRlcigpOwotCQlyZWZyZXNoKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmxvY2F0aW9uOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRlZCgpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hUmVzb3VyY2UgIT0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFhzZFNjaGVtYSBnZXRYc2RTY2hlbWEoU3RyaW5nIG5hbWVzcGFjZSkgewotCQlpZiAodGhpcy51bmxvYWRlZCkgewotCQkJcmVmcmVzaCgpOwotCQkJdGhpcy51bmxvYWRlZCA9IGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoISBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwodGhpcy5uYW1lc3BhY2UsIG5hbWVzcGFjZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlpZiAodGhpcy5zY2hlbWFSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gWHNkVXRpbC5nZXRTY2hlbWEodGhpcy5zY2hlbWFSZXNvdXJjZS5nZXRTY2hlbWEoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl1bmxvYWQoKTsKLQkJCi0JCVN0cmluZyByZXNvbHZlZFVyaSA9IFhzZFV0aWwuZ2V0UmVzb2x2ZWRVcmkodGhpcy5sb2NhdGlvbik7Ci0JCWlmIChyZXNvbHZlZFVyaSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVhTRFNjaGVtYSBzY2hlbWEgPSBYc2RVdGlsLmJ1aWxkWFNETW9kZWwocmVzb2x2ZWRVcmkpOwotCQlYU0RSZXNvdXJjZUltcGwgc2NoZW1hUmVzb3VyY2UgPSAoc2NoZW1hID09IG51bGwpID8gbnVsbCA6IChYU0RSZXNvdXJjZUltcGwpIHNjaGVtYS5lUmVzb3VyY2UoKTsKLQkJCi0JCWlmIChzY2hlbWFSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlzY2hlbWFSZXNvdXJjZS5lQWRhcHRlcnMoKS5hZGQodGhpcy5zY2hlbWFSZXNvdXJjZUFkYXB0ZXIpOwotCQkJdGhpcy5zY2hlbWFSZXNvdXJjZSA9IHNjaGVtYVJlc291cmNlOwotCQkJU3RyaW5nIG5hbWVzcGFjZSA9IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQkJCXRoaXMubmFtZXNwYWNlID0gKG5hbWVzcGFjZSA9PSBudWxsKSA/ICIiIDogbmFtZXNwYWNlOwotCQl9Ci0JfQotCQotCXZvaWQgdW5sb2FkKCkgewotCQlpZiAodGhpcy5zY2hlbWFSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnNjaGVtYVJlc291cmNlLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLnNjaGVtYVJlc291cmNlQWRhcHRlcik7Ci0JCX0KLQkJdGhpcy51bmxvYWRlZCA9IHRydWU7Ci0JCXRoaXMuc2NoZW1hUmVzb3VyY2UgPSBudWxsOwotCX0KLQkKLQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh0aGlzLnNjaGVtYVJlc291cmNlICE9IG51bGwpIHsKLQkJCXRoaXMuc2NoZW1hUmVzb3VyY2UuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMuc2NoZW1hUmVzb3VyY2VBZGFwdGVyKTsKLQkJfQotCX0KLQkKLQkKLQkKLQlwcml2YXRlIGNsYXNzIFNjaGVtYVJlc291cmNlQWRhcHRlcgotCQkJZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZiAobXNnLmdldEZlYXR1cmVJRChSZXNvdXJjZS5jbGFzcykgPT0gUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRAotCQkJCQkmJiBtc2cuZ2V0TmV3Qm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpIHsKLQkJCQlTY2hlbWFFbnRyeUltcGwudGhpcy51bmxvYWQoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL1NjaGVtYUxpYnJhcnlJbXBsLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9TY2hlbWFMaWJyYXJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmM4OGM3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL1NjaGVtYUxpYnJhcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5TY2hlbWFFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLlNjaGVtYUxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIFNjaGVtYUxpYnJhcnlJbXBsCi0JCWltcGxlbWVudHMgU2NoZW1hTGlicmFyeSB7Ci0JCi0JcHJpdmF0ZSBKYXhiUHJvamVjdCBwcm9qZWN0OwotCQotCXByaXZhdGUgZmluYWwgTGlzdDxTY2hlbWFFbnRyeUltcGw+IHNjaGVtYUVudHJpZXM7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTY2hlbWFFbnRyeUltcGw+IGltcGxpZWRFbnRyaWVzOwotCQotCQotCVNjaGVtYUxpYnJhcnlJbXBsKEpheGJQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJdGhpcy5zY2hlbWFFbnRyaWVzID0gbmV3IFZlY3RvcjxTY2hlbWFFbnRyeUltcGw+KCk7Ci0JCXRoaXMuaW1wbGllZEVudHJpZXMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU2NoZW1hRW50cnlJbXBsPigpOwotCQlyZWFkUHJvamVjdFByZWZlcmVuY2VzKCk7Ci0JfQotCQotCQotCXB1YmxpYyBMaXN0PFNjaGVtYUVudHJ5PiBnZXRTY2hlbWFFbnRyaWVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuPFNjaGVtYUVudHJ5PnVubW9kaWZpYWJsZUxpc3QodGhpcy5zY2hlbWFFbnRyaWVzKTsKLQl9Ci0JCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRTY2hlbWFMb2NhdGlvbnMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KAotCQkJCUNvbGxlY3Rpb25Ub29scy5saXN0KAotCQkJCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8U2NoZW1hRW50cnksIFN0cmluZz4odGhpcy5zY2hlbWFFbnRyaWVzKSB7Ci0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oU2NoZW1hRW50cnkgbykgewotCQkJCQkJCQlyZXR1cm4gby5nZXRMb2NhdGlvbigpOwotCQkJCQkJCX0KLQkJCQkJCX0pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2NoZW1hTG9jYXRpb25zKExpc3Q8U3RyaW5nPiBzY2hlbWFMb2NhdGlvbnMpIHsKLQkJZm9yIChTY2hlbWFFbnRyeUltcGwgZW50cnkgOiB0aGlzLnNjaGVtYUVudHJpZXMpIHsKLQkJCWVudHJ5LmRpc3Bvc2UoKTsKLQkJfQotCQl0aGlzLnNjaGVtYUVudHJpZXMuY2xlYXIoKTsKLQkJSnB0SmF4YkNvcmVQbHVnaW4uc2V0U2NoZW1hTG9jYXRpb25zKHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCksIHNjaGVtYUxvY2F0aW9ucyk7Ci0JCXJlYWRQcm9qZWN0UHJlZmVyZW5jZXMoKTsKLQl9Ci0JCi0JcHVibGljIFhzZFNjaGVtYSBnZXRTY2hlbWEoU3RyaW5nIG5hbWVzcGFjZSkgewotCQlmb3IgKFNjaGVtYUVudHJ5IGVudHJ5IDogdGhpcy5zY2hlbWFFbnRyaWVzKSB7Ci0JCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKG5hbWVzcGFjZSwgZW50cnkuZ2V0TmFtZXNwYWNlKCkpKSB7Ci0JCQkJcmV0dXJuIGVudHJ5LmdldFhzZFNjaGVtYShuYW1lc3BhY2UpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoISB0aGlzLmltcGxpZWRFbnRyaWVzLmNvbnRhaW5zS2V5KG5hbWVzcGFjZSkpIHsKLQkJCWlmICghIFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChYc2RVdGlsLmdldFJlc29sdmVkVXJpKG5hbWVzcGFjZSksIG5hbWVzcGFjZSkpIHsKLQkJCQkvLyB0aGUgbmFtZXNwYWNlIGl0c2VsZiByZXNvbHZlcyB0byBhIGxvY2F0aW9uLiAgYWRkIGl0IGFzIGFuIGltcGxpZWQgZW50cnkKLQkJCQl0aGlzLmltcGxpZWRFbnRyaWVzLnB1dChuYW1lc3BhY2UsIG5ldyBTY2hlbWFFbnRyeUltcGwobmFtZXNwYWNlKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHRoaXMuaW1wbGllZEVudHJpZXMuZ2V0KG5hbWVzcGFjZSkuZ2V0WHNkU2NoZW1hKG5hbWVzcGFjZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlYWRQcm9qZWN0UHJlZmVyZW5jZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzY2hlbWFzID0gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0U2NoZW1hTG9jYXRpb25zKHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlmb3IgKFN0cmluZyBzY2hlbWFMb2NhdGlvbiA6IHNjaGVtYXMpIHsKLQkJCVNjaGVtYUVudHJ5SW1wbCBlbnRyeSA9IG5ldyBTY2hlbWFFbnRyeUltcGwoc2NoZW1hTG9jYXRpb24pOwotCQkJdGhpcy5zY2hlbWFFbnRyaWVzLmFkZChlbnRyeSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaFNjaGVtYShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCWZvciAoU2NoZW1hRW50cnlJbXBsIGVudHJ5IDogdGhpcy5zY2hlbWFFbnRyaWVzKSB7Ci0JCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKG5hbWVzcGFjZSwgZW50cnkuZ2V0TmFtZXNwYWNlKCkpKSB7Ci0JCQkJZW50cnkucmVmcmVzaCgpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZnJlc2hBbGxTY2hlbWFzKCkgewotCQlmb3IgKFNjaGVtYUVudHJ5SW1wbCBlbnRyeSA6IHRoaXMuc2NoZW1hRW50cmllcykgewotCQkJZW50cnkucmVmcmVzaCgpOwotCQl9Ci0JfQotCQotCXZvaWQgZGlzcG9zZSgpIHsKLQkJZm9yIChTY2hlbWFFbnRyeUltcGwgZW50cnkgOiB0aGlzLnNjaGVtYUVudHJpZXMpIHsKLQkJCWVudHJ5LmRpc3Bvc2UoKTsKLQkJfQotCQlmb3IgKFNjaGVtYUVudHJ5SW1wbCBlbnRyeSA6IHRoaXMuaW1wbGllZEVudHJpZXMudmFsdWVzKCkpIHsKLQkJCWVudHJ5LmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJdGhpcy5zY2hlbWFFbnRyaWVzLmNsZWFyKCk7Ci0JCXRoaXMuaW1wbGllZEVudHJpZXMuY2xlYXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJQmFnPFN0cmluZz4gbmFtZXNwYWNlcyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJCi0JCWZvciAoU2NoZW1hRW50cnkgZW50cnkgOiB0aGlzLnNjaGVtYUVudHJpZXMpIHsKLQkJCW5hbWVzcGFjZXMuYWRkKGVudHJ5LmdldE5hbWVzcGFjZSgpKTsKLQkJCQotCQkJaWYgKCEgZW50cnkuaXNMb2FkZWQoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlBST0pFQ1RfX1VOUkVTT0xWRURfU0NIRU1BLAotCQkJCQkJCQluZXcgU3RyaW5nW10geyBlbnRyeS5nZXRMb2NhdGlvbigpIH0sCi0JCQkJCQkJCXRoaXMucHJvamVjdCkpOwotCQkJfQotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gbmFtZXNwYWNlcy51bmlxdWVJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBuYW1lc3BhY2UgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKG5hbWVzcGFjZXMuY291bnQobmFtZXNwYWNlKSA+IDEpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5QUk9KRUNUX19EVVBMSUNBVEVfTkFNRVNQQUNFLAotCQkJCQkJCQluZXcgU3RyaW5nW10geyBuYW1lc3BhY2UgfSwKLQkJCQkJCQkJdGhpcy5wcm9qZWN0KSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9TaW1wbGVKYXhiUHJvamVjdENvbmZpZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvU2ltcGxlSmF4YlByb2plY3RDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE1OWRlZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9TaW1wbGVKYXhiUHJvamVjdENvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uOwotCi0vKioKLSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSkFYQiBwcm9qZWN0IGNvbmZpZy4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUpheGJQcm9qZWN0Q29uZmlnCi0JCWltcGxlbWVudHMgSmF4YlByb2plY3QuQ29uZmlnIHsKLQkKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0JCi0JcHJpdmF0ZSBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIHBsYXRmb3JtRGVmaW5pdGlvbjsKLQkKLQkKLQlwdWJsaWMgU2ltcGxlSmF4YlByb2plY3RDb25maWcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5wcm9qZWN0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIEpheGJQbGF0Zm9ybURlZmluaXRpb24gZ2V0UGxhdGZvcm1EZWZpbml0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybURlZmluaXRpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFBsYXRmb3JtRGVmaW5pdGlvbihKYXhiUGxhdGZvcm1EZWZpbml0aW9uIHBsYXRmb3JtRGVmaW5pdGlvbikgewotCQl0aGlzLnBsYXRmb3JtRGVmaW5pdGlvbiA9IHBsYXRmb3JtRGVmaW5pdGlvbjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5wcm9qZWN0LmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9BYnN0cmFjdEpheGJDb250ZXh0Tm9kZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9BYnN0cmFjdEpheGJDb250ZXh0Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTI3MGIyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvQWJzdHJhY3RKYXhiQ29udGV4dE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDb250ZXh0Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLkFic3RyYWN0SmF4Yk5vZGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpheGJDb250ZXh0Tm9kZQotCWV4dGVuZHMgQWJzdHJhY3RKYXhiTm9kZQotCWltcGxlbWVudHMgSmF4YkNvbnRleHROb2RlCi17Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF4YkNvbnRleHROb2RlKEpheGJOb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCS8vIE5PUAotCX0KLQotCS8qKgotCSAqIGNvbnZlbmllbmNlIG1ldGhvZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplTm9kZXNXaXRoUmVzb3VyY2VNb2RlbChJdGVyYWJsZTw/IGV4dGVuZHMgSmF4YkNvbnRleHROb2RlPiBub2RlcykgewotCQlmb3IgKEpheGJDb250ZXh0Tm9kZSBub2RlIDogbm9kZXMpIHsKLQkJCW5vZGUuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQkvLyBOT1AKLQl9Ci0KLQkvKioKLQkgKiBjb252ZW5pZW5jZSBtZXRob2QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVOb2RlcyhJdGVyYWJsZTw/IGV4dGVuZHMgSmF4YkNvbnRleHROb2RlPiBub2RlcykgewotCQlmb3IgKEpheGJDb250ZXh0Tm9kZSBub2RlIDogbm9kZXMpIHsKLQkJCW5vZGUudXBkYXRlKCk7Ci0JCX0KLQl9Ci0JCi0JLy8gKioqKioqKioqKiBjb250YWlubWVudCBoaWVyYXJjaHkgKioqKioqKioqKgotCQotCS8qKgotCSAqIGNvdmFyaWFudCBvdmVycmlkZQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiQ29udGV4dE5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEpheGJDb250ZXh0Tm9kZSkgc3VwZXIuZ2V0UGFyZW50KCk7CQotCX0KLQkKLQkvKioKLQkgKiBPdmVycmlkZGVuIGluOjx1bD4KLQkgKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUNvbnRleHROb2RlI2dldFJlc291cmNlVHlwZSgpIEFic3RyYWN0SmF2YUNvbnRleHROb2RlfQotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnQoKS5nZXRSZXNvdXJjZVR5cGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGRlbiBpbjo8dWw+Ci0JICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuR2VuZXJpY0NvbnRleHRSb290I2dldENvbnRleHRSb290KCkgR2VuZXJpY0NvbnRleHRSb290fQotCSAqIHRvIHJldHVybiBpdHNlbGY+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgSmF4YkNvbnRleHRSb290IGdldENvbnRleHRSb290KCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0Q29udGV4dFJvb3QoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L0Fic3RyYWN0SmF4YkNvbnRleHRSb290LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L0Fic3RyYWN0SmF4YkNvbnRleHRSb290LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3M2Y2MDMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9BYnN0cmFjdEpheGJDb250ZXh0Um9vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLk5vdE51bGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU25hcHNob3RDbG9uZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3ViSXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDb250ZXh0Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmpheGJpbmRleC5KYXhiSW5kZXhSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIHRoZSBjb250ZXh0IG1vZGVsIHJvb3QKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF4YkNvbnRleHRSb290Ci0JCWV4dGVuZHMgQWJzdHJhY3RKYXhiQ29udGV4dE5vZGUKLQkJaW1wbGVtZW50cyBKYXhiQ29udGV4dFJvb3QgewotCQotCS8qIFRoaXMgb2JqZWN0IGhhcyBubyBwYXJlbnQsIHNvIGl0IG11c3QgcG9pbnQgdG8gdGhlIEpBWEIgcHJvamVjdCBleHBsaWNpdGx5LiAqLwotCXByb3RlY3RlZCBmaW5hbCBKYXhiUHJvamVjdCBqYXhiUHJvamVjdDsKLQkKLQkvKiBUaGUgbWFwIG9mIHBhY2thZ2UgbmFtZSB0byBKYXhiUGFja2FnZSBvYmplY3RzICovCi0JcHJvdGVjdGVkIGZpbmFsIE1hcDxTdHJpbmcsIEpheGJQYWNrYWdlPiBwYWNrYWdlczsKLQkKLQkvKiBUaGUgbWFwIG9mIGNsYXNzIG5hbWUgdG8gSmF4YlR5cGUgb2JqZWN0cyAqLwotCXByb3RlY3RlZCBmaW5hbCBNYXA8U3RyaW5nLCBKYXhiVHlwZT4gdHlwZXM7Ci0JCi0JCi0JcHVibGljIEFic3RyYWN0SmF4YkNvbnRleHRSb290KEpheGJQcm9qZWN0IGpheGJQcm9qZWN0KSB7Ci0JCXN1cGVyKG51bGwpOyAgLy8gdGhlIEpBWEIgcHJvamVjdCBpcyBub3QgcmVhbGx5IGEgInBhcmVudCIuLi4KLQkJaWYgKGpheGJQcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuamF4YlByb2plY3QgPSBqYXhiUHJvamVjdDsKLQkJdGhpcy5wYWNrYWdlcyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBKYXhiUGFja2FnZT4oKTsKLQkJdGhpcy50eXBlcyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBKYXhiVHlwZT4oKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YkNvbnRleHRSb290IGdldENvbnRleHRSb290KCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWlyZXNQYXJlbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCi0JCS8vIHByb2Nlc3MgcGFja2FnZXMgd2l0aCBhbm5vdGF0aW9ucyBmaXJzdAotCQlmb3IgKFN0cmluZyBwa2cgOiBjYWxjdWxhdGVJbml0aWFsUGFja2FnZU5hbWVzKCkpIHsKLQkJCXRoaXMucGFja2FnZXMucHV0KHBrZywgYnVpbGRQYWNrYWdlKHBrZykpOwotCQl9Ci0JCQotCQkvLyBrZWVwIHNldCBvZiB0b3RhbCB0eXBlcyBmb3IgcmVtYWluaW5nIHBhY2thZ2UgaW5pdGlhbGl6YXRpb24KLQkJU2V0PFN0cmluZz4gdG90YWxUeXBlTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCQotCQkvLyBwcm9jZXNzIHR5cGVzIHdpdGggYW5ub3RhdGlvbnMgYW5kIGluIGpheGIuaW5kZXggZmlsZXMKLQkJZm9yIChKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzb3VyY2VUeXBlIDogY2FsY3VsYXRlSW5pdGlhbFR5cGVzKCkpIHsKLQkJCXRvdGFsVHlwZU5hbWVzLmFkZChyZXNvdXJjZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJCWFkZFR5cGVfKGJ1aWxkVHlwZShyZXNvdXJjZVR5cGUpKTsKLQkJfQotCQkKLQkJLy8gb25jZSBhbGwgY2xhc3NlcyBoYXZlIGJlZW4gcHJvY2Vzc2VkLCBhZGQgcGFja2FnZXMKLQkJZm9yIChTdHJpbmcgcGtnIDogY2FsY3VsYXRlUGFja2FnZU5hbWVzKHRvdGFsVHlwZU5hbWVzKSkgewotCQkJaWYgKCEgdGhpcy5wYWNrYWdlcy5jb250YWluc0tleShwa2cpKSB7Ci0JCQkJdGhpcy5wYWNrYWdlcy5wdXQocGtnLCBidWlsZFBhY2thZ2UocGtnKSk7Ci0JCQl9Ci0JCX0KLQkJCi0vLwkJLy8ga2VlcCBhIG1hc3RlciBsaXN0IG9mIGFsbCB0eXBlcyB0aGF0IHdlJ3ZlIHByb2Nlc3NlZCBzbyB3ZSBkb24ndCBwcm9jZXNzIHRoZW0gYWdhaW4KLS8vCQlmaW5hbCBTZXQ8U3RyaW5nPiB0b3RhbFR5cGVzID0gQ29sbGVjdGlvblRvb2xzLjxTdHJpbmc+c2V0KCk7Ci0vLwkJCi0vLwkJLy8ga2VlcCBhbiBydW5uaW5nIGxpc3Qgb2YgdHlwZXMgdGhhdCB3ZSBuZWVkIHRvIHNjYW4gZm9yIGZ1cnRoZXIgcmVmZXJlbmNlZCB0eXBlcwotLy8JCWZpbmFsIFNldDxTdHJpbmc+IHR5cGVzVG9TY2FuID0gQ29sbGVjdGlvblRvb2xzLjxTdHJpbmc+c2V0KCk7Ci0vLwkJCi0vLwkJLy8gcHJvY2VzcyBwYWNrYWdlcyB3aXRoIGFubm90YXRpb25zIGZpcnN0Ci0vLwkJZm9yIChTdHJpbmcgcGtnIDogY2FsY3VsYXRlSW5pdGlhbFBhY2thZ2VOYW1lcygpKSB7Ci0vLwkJCXRoaXMucGFja2FnZXMucHV0KHBrZywgYnVpbGRQYWNrYWdlKHBrZykpOwotLy8JCX0KLS8vCQkKLS8vCQkvLyBjYWxjdWxhdGUgaW5pdGlhbCB0eXBlcyAoYW5ub3RhdGVkIG9yIGxpc3RlZCBpbiBqYXhiLmluZGV4IGZpbGVzKQotLy8JCWZpbmFsIFNldDxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+IHJlc291cmNlVHlwZXNUb1Byb2Nlc3MgPSBjYWxjdWxhdGVJbml0aWFsVHlwZXMoKTsKLS8vCQkKLS8vCQkvLyB3aGlsZSB0aGVyZSBhcmUgcmVzb3VyY2UgdHlwZXMgdG8gcHJvY2VzcyBvciB0eXBlcyB0byBzY2FuLCBjb250aW51ZSB0byBkbyBzbwotLy8JCXdoaWxlICghIHJlc291cmNlVHlwZXNUb1Byb2Nlc3MuaXNFbXB0eSgpIHx8ICEgdHlwZXNUb1NjYW4uaXNFbXB0eSgpKSB7Ci0vLwkJCWZvciAoSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA6IG5ldyBTbmFwc2hvdENsb25lSXRlcmFibGU8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPihyZXNvdXJjZVR5cGVzVG9Qcm9jZXNzKSkgewotLy8JCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHJlc291cmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0vLwkJCQl0b3RhbFR5cGVzLmFkZChjbGFzc05hbWUpOwotLy8JCQkJdHlwZXNUb1NjYW4uYWRkKGNsYXNzTmFtZSk7Ci0vLwkJCQlhZGRUeXBlXyhidWlsZFR5cGUocmVzb3VyY2VUeXBlKSk7Ci0vLwkJCQlyZXNvdXJjZVR5cGVzVG9Qcm9jZXNzLnJlbW92ZShyZXNvdXJjZVR5cGUpOwotLy8JCQl9Ci0vLwkJCQotLy8JCQlmb3IgKFN0cmluZyB0eXBlVG9TY2FuIDogbmV3IFNuYXBzaG90Q2xvbmVJdGVyYWJsZTxTdHJpbmc+KHR5cGVzVG9TY2FuKSkgewotLy8JCQkJSmF4YlR5cGUgamF4YlR5cGUgPSBnZXRUeXBlKHR5cGVUb1NjYW4pOwotLy8JCQkJaWYgKGpheGJUeXBlICE9IG51bGwpIHsKLS8vCQkJCQlmb3IgKFN0cmluZyByZWZlcmVuY2VkVHlwZU5hbWUgOiBqYXhiVHlwZS5nZXRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCkpIHsKLS8vCQkJCQkJaWYgKCEgdG90YWxUeXBlcy5jb250YWlucyhyZWZlcmVuY2VkVHlwZU5hbWUpKSB7Ci0vLwkJCQkJCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVmZXJlbmNlZFR5cGUgPSBnZXRKYXhiUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUocmVmZXJlbmNlZFR5cGVOYW1lKTsKLS8vCQkJCQkJCWlmIChyZWZlcmVuY2VkVHlwZSAhPSBudWxsKSB7Ci0vLwkJCQkJCQkJcmVzb3VyY2VUeXBlc1RvUHJvY2Vzcy5hZGQocmVmZXJlbmNlZFR5cGUpOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQkJdHlwZXNUb1NjYW4ucmVtb3ZlKHR5cGVUb1NjYW4pOwotLy8JCQl9Ci0vLwkJfQotLy8JCQotLy8JCS8vIG9uY2UgYWxsIGNsYXNzZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZCwgYWRkIHBhY2thZ2VzCi0vLwkJZm9yIChTdHJpbmcgcGtnIDogY2FsY3VsYXRlUGFja2FnZU5hbWVzKHRvdGFsVHlwZXMpKSB7Ci0vLwkJCWlmICghIHRoaXMucGFja2FnZXMuY29udGFpbnNLZXkocGtnKSkgewotLy8JCQkJdGhpcy5wYWNrYWdlcy5wdXQocGtnLCBidWlsZFBhY2thZ2UocGtnKSk7Ci0vLwkJCX0KLS8vCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJZm9yIChKYXhiUGFja2FnZSBlYWNoIDogZ2V0UGFja2FnZXMoKSkgewotCQkJZWFjaC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCX0KLQkJZm9yIChKYXhiVHlwZSBlYWNoIDogZ2V0VHlwZXMoKSkgewotCQkJZWFjaC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJCi0JCS8vIGtlZXAgYSBtYXN0ZXIgbGlzdCBvZiB0aGVzZSBzbyB0aGF0IG9iamVjdHMgYXJlIHVwZGF0ZWQgb25seSBvbmNlCi0JCWZpbmFsIFNldDxTdHJpbmc+IHBhY2thZ2VzVG9VcGRhdGUgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zZXQoKTsKLQkJZmluYWwgU2V0PFN0cmluZz4gdHlwZXNUb1VwZGF0ZSA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNldCgpOwotCQkKLQkJLy8ga2VlcCBhIChzaHJpbmtpbmcpIHJ1bm5pbmcgbGlzdCBvZiB0aGVzZSBzbyB0aGF0IHdlIGtub3cgd2hpY2ggb25lcyB3ZSBkbyBldmVudHVhbGx5IG5lZWQgdG8gcmVtb3ZlCi0JCWZpbmFsIFNldDxTdHJpbmc+IHBhY2thZ2VzVG9SZW1vdmUgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMucGFja2FnZXMua2V5U2V0KCkpOwotCQlmaW5hbCBTZXQ8U3RyaW5nPiB0eXBlc1RvUmVtb3ZlID0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLnR5cGVzLmtleVNldCgpKTsKLQkJCi0JCS8vIGtlZXAgYSBtYXN0ZXIgbGlzdCBvZiBhbGwgdHlwZXMgdGhhdCB3ZSd2ZSBwcm9jZXNzZWQgc28gd2UgZG9uJ3QgcHJvY2VzcyB0aGVtIGFnYWluCi0JCWZpbmFsIFNldDxTdHJpbmc+IHRvdGFsVHlwZXMgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zZXQoKTsKLQkJCi0JCS8vIGtlZXAgYW4gcnVubmluZyBsaXN0IG9mIHR5cGVzIHRoYXQgd2UgbmVlZCB0byBzY2FuIGZvciBmdXJ0aGVyIHJlZmVyZW5jZWQgdHlwZXMKLQkJZmluYWwgU2V0PFN0cmluZz4gdHlwZXNUb1NjYW4gPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zZXQoKTsKLQkJCi0JCS8vIHByb2Nlc3MgcGFja2FnZXMgd2l0aCBhbm5vdGF0aW9ucyBmaXJzdAotCQlmb3IgKFN0cmluZyBwa2cgOiBjYWxjdWxhdGVJbml0aWFsUGFja2FnZU5hbWVzKCkpIHsKLQkJCWlmICh0aGlzLnBhY2thZ2VzLmNvbnRhaW5zS2V5KHBrZykpIHsKLQkJCQlwYWNrYWdlc1RvVXBkYXRlLmFkZChwa2cpOwotCQkJCXBhY2thZ2VzVG9SZW1vdmUucmVtb3ZlKHBrZyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmFkZFBhY2thZ2UodGhpcy5idWlsZFBhY2thZ2UocGtnKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGNhbGN1bGF0ZSBpbml0aWFsIHR5cGVzIChhbm5vdGF0ZWQgb3IgbGlzdGVkIGluIGpheGIuaW5kZXggZmlsZXMpCi0JCWZpbmFsIFNldDxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+IHJlc291cmNlVHlwZXNUb1Byb2Nlc3MgPSBjYWxjdWxhdGVJbml0aWFsVHlwZXMoKTsKLQkJCi0JCS8vIHN0b3JlIHNldCBvZiB0eXBlcyB0aGF0IGFyZSByZWZlcmVuY2VkIChhbmQgc2hvdWxkIHRoZXJlZm9yZSBiZSBkZWZhdWx0IG1hcHBlZCkKLQkJZmluYWwgU2V0PEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4gcmVmZXJlbmNlZFR5cGVzID0gbmV3IEhhc2hTZXQ8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPigpOwotCQkKLQkJLy8gd2hpbGUgdGhlcmUgYXJlIHJlc291cmNlIHR5cGVzIHRvIHByb2Nlc3Mgb3IgdHlwZXMgdG8gc2NhbiwgY29udGludWUgdG8gZG8gc28KLQkJd2hpbGUgKCEgcmVzb3VyY2VUeXBlc1RvUHJvY2Vzcy5pc0VtcHR5KCkgfHwgISB0eXBlc1RvU2Nhbi5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA6IG5ldyBTbmFwc2hvdENsb25lSXRlcmFibGU8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPihyZXNvdXJjZVR5cGVzVG9Qcm9jZXNzKSkgewotCQkJCVN0cmluZyBjbGFzc05hbWUgPSByZXNvdXJjZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkJCXR5cGVzVG9SZW1vdmUucmVtb3ZlKGNsYXNzTmFtZSk7Ci0JCQkJdG90YWxUeXBlcy5hZGQoY2xhc3NOYW1lKTsKLQkJCQl0eXBlc1RvU2Nhbi5hZGQoY2xhc3NOYW1lKTsKLQkJCQlwcm9jZXNzVHlwZShyZXNvdXJjZVR5cGUsIHR5cGVzVG9VcGRhdGUsIHJlZmVyZW5jZWRUeXBlcy5jb250YWlucyhyZXNvdXJjZVR5cGUpKTsKLQkJCQlyZXNvdXJjZVR5cGVzVG9Qcm9jZXNzLnJlbW92ZShyZXNvdXJjZVR5cGUpOwotCQkJfQotCQkJCi0JCQlmb3IgKFN0cmluZyB0eXBlVG9TY2FuIDogbmV3IFNuYXBzaG90Q2xvbmVJdGVyYWJsZTxTdHJpbmc+KHR5cGVzVG9TY2FuKSkgewotCQkJCUpheGJUeXBlIGpheGJUeXBlID0gZ2V0VHlwZSh0eXBlVG9TY2FuKTsKLQkJCQlpZiAoamF4YlR5cGUgIT0gbnVsbCkgewotCQkJCQlmb3IgKFN0cmluZyByZWZlcmVuY2VkVHlwZU5hbWUgOiBqYXhiVHlwZS5nZXRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCkpIHsKLQkJCQkJCWlmICghIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkocmVmZXJlbmNlZFR5cGVOYW1lKSAmJiAhIHRvdGFsVHlwZXMuY29udGFpbnMocmVmZXJlbmNlZFR5cGVOYW1lKSkgewotCQkJCQkJCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZWZlcmVuY2VkVHlwZSA9IGdldEpheGJQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShyZWZlcmVuY2VkVHlwZU5hbWUpOwotCQkJCQkJCWlmIChyZWZlcmVuY2VkVHlwZSAhPSBudWxsKSB7Ci0JCQkJCQkJCXJlc291cmNlVHlwZXNUb1Byb2Nlc3MuYWRkKHJlZmVyZW5jZWRUeXBlKTsKLQkJCQkJCQkJcmVmZXJlbmNlZFR5cGVzLmFkZChyZWZlcmVuY2VkVHlwZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXR5cGVzVG9TY2FuLnJlbW92ZSh0eXBlVG9TY2FuKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gb25jZSBhbGwgY2xhc3NlcyBoYXZlIGJlZW4gcHJvY2Vzc2VkLCBhZGQgcGFja2FnZXMKLQkJZm9yIChTdHJpbmcgcGtnIDogY2FsY3VsYXRlUGFja2FnZU5hbWVzKHRvdGFsVHlwZXMpKSB7Ci0JCQlpZiAodGhpcy5wYWNrYWdlcy5jb250YWluc0tleShwa2cpKSB7Ci0JCQkJcGFja2FnZXNUb1VwZGF0ZS5hZGQocGtnKTsKLQkJCQlwYWNrYWdlc1RvUmVtb3ZlLnJlbW92ZShwa2cpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5hZGRQYWNrYWdlKHRoaXMuYnVpbGRQYWNrYWdlKHBrZykpOwotCQkJfQotCQl9Ci0JCQotCQlmb3IgKFN0cmluZyBwYWNrYWdlVG9VcGRhdGUgOiBwYWNrYWdlc1RvVXBkYXRlKSB7Ci0JCQl0aGlzLnBhY2thZ2VzLmdldChwYWNrYWdlVG9VcGRhdGUpLnVwZGF0ZSgpOwotCQl9Ci0JCQotCQlmb3IgKFN0cmluZyB0eXBlVG9VcGRhdGUgOiB0eXBlc1RvVXBkYXRlKSB7Ci0JCQl0aGlzLnR5cGVzLmdldCh0eXBlVG9VcGRhdGUpLnVwZGF0ZSgpOwotCQl9Ci0JCQotCQlmb3IgKFN0cmluZyBwYWNrYWdlVG9SZW1vdmUgOiBwYWNrYWdlc1RvUmVtb3ZlKSB7Ci0JCQlyZW1vdmVQYWNrYWdlKHBhY2thZ2VUb1JlbW92ZSk7Ci0JCX0KLQkJCi0JCWZvciAoU3RyaW5nIHR5cGVUb1JlbW92ZSA6IHR5cGVzVG9SZW1vdmUpIHsKLQkJCXJlbW92ZVR5cGUodHlwZVRvUmVtb3ZlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBjYWxjdWxhdGUgc2V0IG9mIHBhY2thZ2VzIHRoYXQgY2FuIGJlIGRldGVybWluZWQgcHVyZWx5IGJ5IHByZXNlbmNlIG9mIHBhY2thZ2UgYW5ub3RhdGlvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgU2V0PFN0cmluZz4gY2FsY3VsYXRlSW5pdGlhbFBhY2thZ2VOYW1lcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5zZXQoCi0JCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF2YVJlc291cmNlUGFja2FnZSwgU3RyaW5nPigKLQkJCQkJCWdldEpheGJQcm9qZWN0KCkuZ2V0QW5ub3RhdGVkSmF2YVJlc291cmNlUGFja2FnZXMoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSmF2YVJlc291cmNlUGFja2FnZSBvKSB7Ci0JCQkJCQlyZXR1cm4gby5nZXROYW1lKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogY2FsY3VsYXRlIHNldCBvZiBwYWNrYWdlcyB0aGF0IGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdHlwZSBuYW1lcwotCSAqLwotCXByb3RlY3RlZCBTZXQ8U3RyaW5nPiBjYWxjdWxhdGVQYWNrYWdlTmFtZXMoU2V0PFN0cmluZz4gdHlwZU5hbWVzKSB7Ci0JCVNldDxTdHJpbmc+IHBhY2thZ2VOYW1lcyA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNldCgpOwotCQlmb3IgKFN0cmluZyB0eXBlTmFtZSA6IHR5cGVOYW1lcykgewotCQkJSmF4YlR5cGUgamF4YlR5cGUgPSB0aGlzLnR5cGVzLmdldCh0eXBlTmFtZSk7Ci0JCQlpZiAoamF4YlR5cGUgIT0gbnVsbCkgewotCQkJCXBhY2thZ2VOYW1lcy5hZGQoamF4YlR5cGUuZ2V0UGFja2FnZU5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhY2thZ2VOYW1lczsKLQl9Ci0JCi0JLyoKLQkgKiBDYWxjdWxhdGUgc2V0IG9mIGluaXRpYWwgdHlwZXMKLQkgKiBUaGlzIHNob3VsZCBiZToKLQkgKiAtIGFsbCByZXNvdXJjZSB0eXBlcyB3aXRoIEBYbWxUeXBlLCBAWG1sUm9vdEVsZW1lbnQsIG9yIEBYbWxKYXZhVHlwZUFkYXB0ZXIKLQkgKiAtIGFsbCByZXNvdXJjZSBjbGFzc2VzIHdpdGggQFhtbFJlZ2lzdHJ5Ci0JICogLSBhbGwgcmVzb3VyY2UgZW51bXMgd2l0aCBAWG1sRW51bQotCSAqIC0gYWxsIHR5cGVzIGxpc3RlZCBpbiBqYXhiLmluZGV4IGZpbGVzLgotCSAqLwotCXByb3RlY3RlZCBTZXQ8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPiBjYWxjdWxhdGVJbml0aWFsVHlwZXMoKSB7Ci0JCVNldDxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+IHNldCA9IENvbGxlY3Rpb25Ub29scy5zZXQoCi0JCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4oCi0JCQkJCQlnZXRKYXhiUHJvamVjdCgpLmdldEphdmFTb3VyY2VSZXNvdXJjZVR5cGVzKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgbykgewotCQkJCQkJaWYgKG8uZ2V0S2luZCgpID09IEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZS5LaW5kLlRZUEUpIHsKLQkJCQkJCQlpZiAoby5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1JFR0lTVFJZKSAhPSBudWxsKSB7Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChvLmdldEtpbmQoKSA9PSBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUuS2luZC5FTlVNKSB7Ci0JCQkJCQkJaWYgKG8uZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTlVNKSAhPSBudWxsKSB7Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJldHVybiBvLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSkgIT0gbnVsbAotCQkJCQkJCQl8fCBvLmdldEFubm90YXRpb24oSkFYQi5YTUxfUk9PVF9FTEVNRU5UKSAhPSBudWxsCi0JCQkJCQkJCXx8IG8uZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSA+IDA7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCgKLQkJCQlzZXQsCi0JCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4oCi0JCQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxTdHJpbmcsIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4oCi0JCQkJCQkJCW5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQkJCQkJCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEpheGJJbmRleFJlc291cmNlLCBJdGVyYWJsZTxTdHJpbmc+PihnZXRKYXhiUHJvamVjdCgpLmdldEpheGJJbmRleFJlc291cmNlcygpKSB7Ci0JCQkJCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPnRyYW5zZm9ybShKYXhiSW5kZXhSZXNvdXJjZSBvKSB7Ci0JCQkJCQkJCQkJCQlyZXR1cm4gby5nZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZXMoKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0pKSB7Ci0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSB0cmFuc2Zvcm0oU3RyaW5nIG8pIHsKLQkJCQkJCQkJcmV0dXJuIGdldEpheGJQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShvKTsKLQkJCQkJCQl9Ci0JCQkJCQl9LAotCQkJCQkJTm90TnVsbEZpbHRlci48SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPmluc3RhbmNlKCkpKTsKLQkJcmV0dXJuIHNldDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1R5cGUoSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSwgU2V0PFN0cmluZz4gdHlwZXNUb1VwZGF0ZSwgYm9vbGVhbiBkZWZhdWx0TWFwcGVkKSB7Ci0JCUpheGJUeXBlLktpbmQgamF4YlR5cGVLaW5kID0gY2FsY3VsYXRlSmF4YlR5cGVLaW5kKHJlc291cmNlVHlwZSk7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSByZXNvdXJjZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkKLQkJaWYgKHRoaXMudHlwZXMuY29udGFpbnNLZXkoY2xhc3NOYW1lKSkgewotCQkJSmF4YlR5cGUgdHlwZSA9IHRoaXMudHlwZXMuZ2V0KGNsYXNzTmFtZSk7Ci0JCQlpZiAodHlwZS5nZXRLaW5kKCkgPT0gamF4YlR5cGVLaW5kKSB7Ci0JCQkJdHlwZXNUb1VwZGF0ZS5hZGQoY2xhc3NOYW1lKTsKLQkJCQl0eXBlLnNldERlZmF1bHRNYXBwZWQoZGVmYXVsdE1hcHBlZCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5yZW1vdmVUeXBlKGNsYXNzTmFtZSk7IC8vIHRoaXMgd2lsbCByZW1vdmUgYSB0eXBlIG9mIGFub3RoZXIga2luZAotCQkJfQotCQl9Ci0JCQotCQlKYXhiVHlwZSB0eXBlID0gYnVpbGRUeXBlKHJlc291cmNlVHlwZSk7Ci0JCXR5cGUuc2V0RGVmYXVsdE1hcHBlZChkZWZhdWx0TWFwcGVkKTsKLQkJdGhpcy5hZGRUeXBlKHR5cGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlR5cGUuS2luZCBjYWxjdWxhdGVKYXhiVHlwZUtpbmQoSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSkgewotCQlpZiAocmVzb3VyY2VUeXBlLmdldEtpbmQoKSA9PSBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUuS2luZC5FTlVNKSB7Ci0JCQlyZXR1cm4gSmF4YlR5cGUuS2luZC5FTlVNOwotCQl9Ci0JCS8vIGVsc2UgaXMgb2Yga2luZCBUWVBFCi0JCWVsc2UgewotCQkJcmV0dXJuIEpheGJUeXBlLktpbmQuQ0xBU1M7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJUeXBlIGJ1aWxkVHlwZShKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCUpheGJUeXBlLktpbmQga2luZCA9IGNhbGN1bGF0ZUpheGJUeXBlS2luZChyZXNvdXJjZVR5cGUpOwotCQlpZiAoa2luZCA9PSBKYXhiVHlwZS5LaW5kLkVOVU0pIHsKLQkJCXJldHVybiBidWlsZEpheGJFbnVtKChKYXZhUmVzb3VyY2VFbnVtKSByZXNvdXJjZVR5cGUpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGJ1aWxkSmF4YkNsYXNzKChKYXZhUmVzb3VyY2VUeXBlKSByZXNvdXJjZVR5cGUpOwotCQl9Ci0JfQotCQotCQotCS8vICoqKioqIEFic3RyYWN0SmF4Yk5vZGUgb3ZlcnJpZGVzICoqKioqIAotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiUHJvamVjdCBnZXRKYXhiUHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuamF4YlByb2plY3Q7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb2plY3QoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLmpheGJQcm9qZWN0LmdldFByb2plY3QoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogcGFja2FnZXMgKioqKioKLQkKLQlwdWJsaWMgSXRlcmFibGU8SmF4YlBhY2thZ2U+IGdldFBhY2thZ2VzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPEpheGJQYWNrYWdlPih0aGlzLnBhY2thZ2VzLnZhbHVlcygpKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRQYWNrYWdlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnBhY2thZ2VzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgSmF4YlBhY2thZ2UgZ2V0UGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLQkJZm9yIChKYXhiUGFja2FnZSBqYXhiUGFja2FnZSA6IHRoaXMuZ2V0UGFja2FnZXMoKSkgewotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChqYXhiUGFja2FnZS5nZXROYW1lKCksIHBhY2thZ2VOYW1lKSkgewotCQkJCXJldHVybiBqYXhiUGFja2FnZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJQYWNrYWdlIGFkZFBhY2thZ2UoSmF4YlBhY2thZ2UgY29udGV4dFBhY2thZ2UpIHsKLQkJaWYgKHRoaXMucGFja2FnZXMuY29udGFpbnNLZXkoY29udGV4dFBhY2thZ2UuZ2V0TmFtZSgpKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGFja2FnZSB3aXRoIHRoYXQgbmFtZSBhbHJlYWR5IGV4aXN0cy4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMucGFja2FnZXMucHV0KGNvbnRleHRQYWNrYWdlLmdldE5hbWUoKSwgY29udGV4dFBhY2thZ2UpOwotCQlmaXJlSXRlbUFkZGVkKFBBQ0tBR0VTX0NPTExFQ1RJT04sIGNvbnRleHRQYWNrYWdlKTsKLQkJcmV0dXJuIGNvbnRleHRQYWNrYWdlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVQYWNrYWdlKEpheGJQYWNrYWdlIGNvbnRleHRQYWNrYWdlKSB7Ci0JCXRoaXMucmVtb3ZlUGFja2FnZShjb250ZXh0UGFja2FnZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSkgewotCQlpZiAoISB0aGlzLnBhY2thZ2VzLmNvbnRhaW5zS2V5KHBhY2thZ2VOYW1lKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gcGFja2FnZSB3aXRoIHRoYXQgbmFtZSBleGlzdHMuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlKYXhiUGFja2FnZSByZW1vdmVkUGFja2FnZSA9IHRoaXMucGFja2FnZXMucmVtb3ZlKHBhY2thZ2VOYW1lKTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFBBQ0tBR0VTX0NPTExFQ1RJT04sIHJlbW92ZWRQYWNrYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJQYWNrYWdlIGJ1aWxkUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmJ1aWxkUGFja2FnZSh0aGlzLCBwYWNrYWdlTmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzRW1wdHkoSmF4YlBhY2thZ2UgamF4YlBhY2thZ2UpIHsKLQkJcmV0dXJuIGpheGJQYWNrYWdlLmlzRW1wdHkoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdHlwZXMgKioqKioKLQkKLQlwdWJsaWMgSXRlcmFibGU8SmF4YlR5cGU+IGdldFR5cGVzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPEpheGJUeXBlPih0aGlzLnR5cGVzLnZhbHVlcygpKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRUeXBlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIEpheGJUeXBlIGdldFR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiB0eXBlTmFtZSA9PSBudWxsID8gbnVsbCA6IHRoaXMudHlwZXMuZ2V0KHR5cGVOYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZV8oSmF4YlR5cGUgdHlwZSkgewotCQl0aGlzLnR5cGVzLnB1dCh0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCB0eXBlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZShKYXhiVHlwZSB0eXBlKSB7Ci0JCWlmICh0aGlzLnR5cGVzLmNvbnRhaW5zS2V5KHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUeXBlIHdpdGggdGhhdCBuYW1lIGFscmVhZHkgZXhpc3RzLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYWRkVHlwZV8odHlwZSk7Ci0JCWZpcmVJdGVtQWRkZWQoVFlQRVNfQ09MTEVDVElPTiwgdHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVR5cGUoSmF4YlR5cGUgdHlwZSkgewotCQlyZW1vdmVUeXBlKHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCQlpZiAoISB0aGlzLnR5cGVzLmNvbnRhaW5zS2V5KHR5cGVOYW1lKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gdHlwZSB3aXRoIHRoYXQgbmFtZSBleGlzdHMuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlKYXhiVHlwZSByZW1vdmVkVHlwZSA9IHRoaXMudHlwZXMucmVtb3ZlKHR5cGVOYW1lKTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFRZUEVTX0NPTExFQ1RJT04sIHJlbW92ZWRUeXBlKTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPEpheGJUeXBlPiBnZXRUeXBlcyhmaW5hbCBKYXhiUGFja2FnZSBqYXhiUGFja2FnZSkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEpheGJUeXBlPihnZXRUeXBlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKYXhiVHlwZSBvKSB7Ci0JCQkJcmV0dXJuIG8uZ2V0UGFja2FnZU5hbWUoKS5lcXVhbHMoamF4YlBhY2thZ2UuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPEpheGJDbGFzcz4gZ2V0Q2xhc3NlcygpIHsKLQkJcmV0dXJuIG5ldyBTdWJJdGVyYWJsZVdyYXBwZXI8SmF4YlR5cGUsIEpheGJDbGFzcz4oCi0JCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEpheGJUeXBlPihnZXRUeXBlcygpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSmF4YlR5cGUgbykgewotCQkJCQkJcmV0dXJuIG8uZ2V0S2luZCgpID09IEpheGJUeXBlLktpbmQuQ0xBU1M7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPEpheGJDbGFzcz4gZ2V0Q2xhc3NlcyhKYXhiUGFja2FnZSBqYXhiUGFja2FnZSkgewotCQlyZXR1cm4gbmV3IFN1Ykl0ZXJhYmxlV3JhcHBlcjxKYXhiVHlwZSwgSmF4YkNsYXNzPigKLQkJCQluZXcgRmlsdGVyaW5nSXRlcmFibGU8SmF4YlR5cGU+KGdldFR5cGVzKGpheGJQYWNrYWdlKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEpheGJUeXBlIG8pIHsKLQkJCQkJCXJldHVybiBvLmdldEtpbmQoKSA9PSBKYXhiVHlwZS5LaW5kLkNMQVNTOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxKYXhiRW51bT4gZ2V0RW51bXMoKSB7Ci0JCXJldHVybiBuZXcgU3ViSXRlcmFibGVXcmFwcGVyPEpheGJUeXBlLCBKYXhiRW51bT4oCi0JCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEpheGJUeXBlPihnZXRUeXBlcygpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSmF4YlR5cGUgbykgewotCQkJCQkJcmV0dXJuIG8uZ2V0S2luZCgpID09IEpheGJUeXBlLktpbmQuRU5VTTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8SmF4YkVudW0+IGdldEVudW1zKEpheGJQYWNrYWdlIGpheGJQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgU3ViSXRlcmFibGVXcmFwcGVyPEpheGJUeXBlLCBKYXhiRW51bT4oCi0JCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEpheGJUeXBlPihnZXRUeXBlcyhqYXhiUGFja2FnZSkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKYXhiVHlwZSBvKSB7Ci0JCQkJCQlyZXR1cm4gby5nZXRLaW5kKCkgPT0gSmF4YlR5cGUuS2luZC5FTlVNOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBKYXhiQ2xhc3MgYnVpbGRKYXhiQ2xhc3MoSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmJ1aWxkSmF4YkNsYXNzKHRoaXMsIHJlc291cmNlVHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXhiRW51bSBidWlsZEpheGJFbnVtKEphdmFSZXNvdXJjZUVudW0gcmVzb3VyY2VFbnVtKSB7Ci0JCXJldHVybiB0aGlzLmdldEZhY3RvcnkoKS5idWlsZEpheGJFbnVtKHRoaXMsIHJlc291cmNlRW51bSk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxYbWxSZWdpc3RyeT4gZ2V0WG1sUmVnaXN0cmllcyhKYXhiUGFja2FnZSBqYXhiUGFja2FnZSkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFhtbFJlZ2lzdHJ5PigKLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxKYXhiQ2xhc3MsIFhtbFJlZ2lzdHJ5PihnZXRDbGFzc2VzKGpheGJQYWNrYWdlKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFhtbFJlZ2lzdHJ5IHRyYW5zZm9ybShKYXhiQ2xhc3MgbykgewotCQkJCQkJcmV0dXJuIG8uZ2V0WG1sUmVnaXN0cnkoKTsKLQkJCQkJfQotCQkJCX0sCi0JCQkJTm90TnVsbEZpbHRlci5JTlNUQU5DRSk7Ci0JfQotCQotCXB1YmxpYyBKYXhiVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCUpheGJUeXBlIHR5cGUgPSBnZXRUeXBlKHR5cGVOYW1lKTsKLQkJcmV0dXJuICh0eXBlID09IG51bGwpID8gbnVsbCA6IHR5cGUuZ2V0TWFwcGluZygpOwotCX0KLQkKLQlwdWJsaWMgSmF4YkNsYXNzTWFwcGluZyBnZXRDbGFzc01hcHBpbmcoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCUpheGJUeXBlIHR5cGUgPSBnZXRUeXBlKHR5cGVOYW1lKTsKLQkJcmV0dXJuICh0eXBlID09IG51bGwgfHwgKHR5cGUuZ2V0S2luZCgpICE9IEpheGJUeXBlLktpbmQuQ0xBU1MpKSA/IAotCQkJCW51bGwgOiAoKEpheGJDbGFzcykgdHlwZSkuZ2V0TWFwcGluZygpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoKSB7Ci0JCXN1cGVyLnN0YXRlQ2hhbmdlZCgpOwotCQkvLyBmb3J3YXJkIHRvIEpBWEIgcHJvamVjdAotCQl0aGlzLmpheGJQcm9qZWN0LnN0YXRlQ2hhbmdlZCgpOwotICAgIH0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWZvciAoSmF4YlBhY2thZ2UgcGtnIDogdGhpcy5wYWNrYWdlcy52YWx1ZXMoKSkgewotCQkJcGtnLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQkJZm9yIChKYXhiVHlwZSB0eXBlIDogdGhpcy50eXBlcy52YWx1ZXMoKSkgewotCQkJdHlwZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9HZW5lcmljQ29udGV4dFJvb3QuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvR2VuZXJpY0NvbnRleHRSb290LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNTJmYzAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9HZW5lcmljQ29udGV4dFJvb3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdDsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0NvbnRleHRSb290Ci0JCWV4dGVuZHMgQWJzdHJhY3RKYXhiQ29udGV4dFJvb3QgewotCQotCXB1YmxpYyBHZW5lcmljQ29udGV4dFJvb3QoSmF4YlByb2plY3QgamF4YlByb2plY3QpIHsKLQkJc3VwZXIoamF4YlByb2plY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvR2VuZXJpY1BhY2thZ2UuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvR2VuZXJpY1BhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg2OWZlZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L0dlbmVyaWNQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNvbnRleHRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxOc0Zvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KYXhiVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNQYWNrYWdlCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXhiQ29udGV4dE5vZGUKLQkJaW1wbGVtZW50cyBKYXhiUGFja2FnZSB7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBuYW1lOwotCQotCXByb3RlY3RlZCBKYXhiUGFja2FnZUluZm8gcGFja2FnZUluZm87Ci0JCi0JCi0JcHVibGljIEdlbmVyaWNQYWNrYWdlKEpheGJDb250ZXh0Um9vdCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UganJwID0gZ2V0SmF4YlByb2plY3QoKS5nZXRBbm5vdGF0ZWRKYXZhUmVzb3VyY2VQYWNrYWdlKHRoaXMubmFtZSk7Ci0JCWlmIChqcnAgIT0gbnVsbCkgewotCQkJdGhpcy5wYWNrYWdlSW5mbyA9IGJ1aWxkUGFja2FnZUluZm8oanJwKTsKLQkJfQotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCWlmICh0aGlzLnBhY2thZ2VJbmZvICE9IG51bGwpIHsgCi0JCQl0aGlzLnBhY2thZ2VJbmZvLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJfQotCX0KLQotCS8vQnVpbGRpbmcvcmVtb3Zpbmcgb2YgdGhlIHBhY2thZ2VJbmZvIGlzIGluIHRoZSB1cGRhdGUgYmVjYXVzZSB0aGlzIGlzIGRlcGVuZGVudAotCS8vb24gYSBKYXhiRmlsZSBiZWluZyBhZGRlZC9yZW1vdmVkIHdoaWNoIG9ubHkgY2F1c2VzIGFuIHVwZGF0ZSBvZiB0aGUgbW9kZWwuCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSBqcnAgPSBnZXRKYXhiUHJvamVjdCgpLmdldEFubm90YXRlZEphdmFSZXNvdXJjZVBhY2thZ2UodGhpcy5uYW1lKTsKLQkJaWYgKGpycCA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldFBhY2thZ2VJbmZvXyhudWxsKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmICh0aGlzLnBhY2thZ2VJbmZvID09IG51bGwpIHsKLQkJCQl0aGlzLnNldFBhY2thZ2VJbmZvXyh0aGlzLmJ1aWxkUGFja2FnZUluZm8oanJwKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLnBhY2thZ2VJbmZvLnVwZGF0ZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogbmFtZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBwYWNrYWdlIGluZm8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgSmF4YlBhY2thZ2VJbmZvIGdldFBhY2thZ2VJbmZvKCkgewotCQlyZXR1cm4gdGhpcy5wYWNrYWdlSW5mbzsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0UGFja2FnZUluZm9fKEpheGJQYWNrYWdlSW5mbyBwYWNrYWdlSW5mbykgewotCQlKYXhiUGFja2FnZUluZm8gb2xkID0gdGhpcy5wYWNrYWdlSW5mbzsKLQkJdGhpcy5wYWNrYWdlSW5mbyA9IHBhY2thZ2VJbmZvOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBBQ0tBR0VfSU5GT19QUk9QRVJUWSwgb2xkLCB0aGlzLnBhY2thZ2VJbmZvKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJQYWNrYWdlSW5mbyBidWlsZFBhY2thZ2VJbmZvKEphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlKSB7Ci0JCXJldHVybiBnZXRGYWN0b3J5KCkuYnVpbGRKYXZhUGFja2FnZUluZm8odGhpcywgcmVzb3VyY2VQYWNrYWdlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIGdldFBhY2thZ2VJbmZvKCkgPT0gbnVsbCAmJiBnZXRSZWdpc3RyeSgpID09IG51bGw7Ci0JfQotCQotCXB1YmxpYyBYbWxSZWdpc3RyeSBnZXRSZWdpc3RyeSgpIHsKLQkJSXRlcmFibGU8WG1sUmVnaXN0cnk+IHJlZ2lzdHJpZXMgPSBnZXRDb250ZXh0Um9vdCgpLmdldFhtbFJlZ2lzdHJpZXModGhpcyk7Ci0JCWlmIChDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZWdpc3RyaWVzKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5nZXQocmVnaXN0cmllcywgMCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogbWlzYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gKGdldFBhY2thZ2VJbmZvKCkgPT0gbnVsbCkgPyAiIiA6IGdldFBhY2thZ2VJbmZvKCkuZ2V0WG1sU2NoZW1hKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JfQotCQotCXB1YmxpYyBYbWxOc0Zvcm0gZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKSB7Ci0JCXJldHVybiAoZ2V0UGFja2FnZUluZm8oKSA9PSBudWxsKSA/IFhtbE5zRm9ybS5VTlNFVCA6IGdldFBhY2thZ2VJbmZvKCkuZ2V0WG1sU2NoZW1hKCkuZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKTsKLQl9Ci0JCi0JcHVibGljIFhtbE5zRm9ybSBnZXRFbGVtZW50Rm9ybURlZmF1bHQoKSB7Ci0JCXJldHVybiAoZ2V0UGFja2FnZUluZm8oKSA9PSBudWxsKSA/IFhtbE5zRm9ybS5VTlNFVCA6IGdldFBhY2thZ2VJbmZvKCkuZ2V0WG1sU2NoZW1hKCkuZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCk7Ci0JfQotCQotCXB1YmxpYyBYc2RTY2hlbWEgZ2V0WHNkU2NoZW1hKCkgewotCQlyZXR1cm4gZ2V0SmF4YlByb2plY3QoKS5nZXRTY2hlbWFMaWJyYXJ5KCkuZ2V0U2NoZW1hKGdldE5hbWVzcGFjZSgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAocmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24oKTsKLQkJfQotCQkKLQkJaWYgKGdldEpheGJQcm9qZWN0KCkuZ2V0U2NoZW1hTGlicmFyeSgpLmdldFNjaGVtYShnZXROYW1lc3BhY2UoKSkgPT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKLQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuUEFDS0FHRV9OT19TQ0hFTUFfRk9SX05BTUVTUEFDRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TmFtZXNwYWNlKCksIHRoaXMubmFtZX0sCi0JCQkJCQl0aGlzKSk7Ci0JCX0KLQkJCi0JCWlmICh0aGlzLnBhY2thZ2VJbmZvICE9IG51bGwpIHsKLQkJCXRoaXMucGFja2FnZUluZm8udmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvSmF4YlBhY2thZ2VBZGFwdGVyRmFjdG9yeS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9KYXhiUGFja2FnZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MThhOWUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9KYXhiUGFja2FnZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBKYXhiUGFja2FnZUFkYXB0ZXJGYWN0b3J5Ci0JCWltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIEFEQVBURVJfTElTVCA9IG5ldyBDbGFzc1tdIHsgSmF4YlBhY2thZ2UuY2xhc3MgfTsKLQkKLQkKLQlwdWJsaWMgQ2xhc3M8Pz5bXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIEFEQVBURVJfTElTVDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0QWRhcHRlcigoSVBhY2thZ2VGcmFnbWVudCkgYWRhcHRhYmxlT2JqZWN0LCBhZGFwdGVyVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgT2JqZWN0IGdldEFkYXB0ZXIoSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQsIENsYXNzPD8+IGFkYXB0ZXJUeXBlKSB7Ci0JCWlmIChhZGFwdGVyVHlwZSA9PSBKYXhiUGFja2FnZS5jbGFzcykgewotCQkJcmV0dXJuIGdldEpheGJQYWNrYWdlKHBhY2thZ2VGcmFnbWVudCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQkJSmF4YlByb2plY3QgamF4YlByb2plY3QgPSBKcHRKYXhiQ29yZVBsdWdpbi5nZXRKYXhiUHJvamVjdChwYWNrYWdlRnJhZ21lbnQuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQlpZiAoamF4YlByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGpheGJQcm9qZWN0LmdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZShwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9KYXhiUGFja2FnZVRlc3Rlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9KYXhiUGFja2FnZVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDg1MTdiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvSmF4YlBhY2thZ2VUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBKYXhiUGFja2FnZVRlc3RlcgotCQlleHRlbmRzIFByb3BlcnR5VGVzdGVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQVNfUEFDS0FHRV9JTkZPID0gImhhc1BhY2thZ2VJbmZvIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBib29sZWFuIHRlc3QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgcHJvcGVydHksIE9iamVjdFtdIGFyZ3MsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB7Ci0JCWlmIChyZWNlaXZlciBpbnN0YW5jZW9mIEpheGJQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdGVzdCgoSmF4YlBhY2thZ2UpIHJlY2VpdmVyLCBwcm9wZXJ0eSwgZXhwZWN0ZWRWYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gdGVzdChKYXhiUGFja2FnZSBqYXhiUGFja2FnZSwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotCQlpZiAocHJvcGVydHkuZXF1YWxzKEhBU19QQUNLQUdFX0lORk8pKSB7Ci0JCQlib29sZWFuIGhhc1BhY2thZ2VJbmZvID0gamF4YlBhY2thZ2UuZ2V0SmF4YlByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQYWNrYWdlKGpheGJQYWNrYWdlLmdldE5hbWUoKSkgIT0gbnVsbDsKLQkJCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbChoYXNQYWNrYWdlSW5mbywgZXhwZWN0ZWRWYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFBZGFwdGFibGVBdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhQWRhcHRhYmxlQXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTBiZDYyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFBZGFwdGFibGVBdHRyaWJ1dGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQWRhcHRhYmxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YUFkYXB0YWJsZUF0dHJpYnV0ZU1hcHBpbmc8QSBleHRlbmRzIEFubm90YXRpb24+Ci0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzxBPgotCQlpbXBsZW1lbnRzIFhtbEFkYXB0YWJsZU1hcHBpbmcgewotCQotCXByb3RlY3RlZCBYbWxKYXZhVHlwZUFkYXB0ZXIgeG1sSmF2YVR5cGVBZGFwdGVyOwotCQotCQotCXB1YmxpYyBBYnN0cmFjdEphdmFBZGFwdGFibGVBdHRyaWJ1dGVNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQlpbml0aWFsaXplWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHN5bmMvdXBkYXRlICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlzeW5jWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXVwZGF0ZVhtbEphdmFUeXBlQWRhcHRlcigpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxKYXZhVHlwZUFkYXB0ZXIgKioqKioKLQkKLQlwdWJsaWMgWG1sSmF2YVR5cGVBZGFwdGVyIGdldFhtbEphdmFUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMueG1sSmF2YVR5cGVBZGFwdGVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFhtbEphdmFUeXBlQWRhcHRlcl8oWG1sSmF2YVR5cGVBZGFwdGVyIHhtbEphdmFUeXBlQWRhcHRlcikgewotCQlYbWxKYXZhVHlwZUFkYXB0ZXIgb2xkWG1sSmF2YVR5cGVBZGFwdGVyID0gdGhpcy54bWxKYXZhVHlwZUFkYXB0ZXI7Ci0JCXRoaXMueG1sSmF2YVR5cGVBZGFwdGVyID0geG1sSmF2YVR5cGVBZGFwdGVyOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9KQVZBX1RZUEVfQURBUFRFUl9QUk9QRVJUWSwgb2xkWG1sSmF2YVR5cGVBZGFwdGVyLCB4bWxKYXZhVHlwZUFkYXB0ZXIpOwotCX0KLQkKLQlwdWJsaWMgWG1sSmF2YVR5cGVBZGFwdGVyIGFkZFhtbEphdmFUeXBlQWRhcHRlcigpIHsKLQkJaWYgKHRoaXMueG1sSmF2YVR5cGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCVhtbEphdmFUeXBlQWRhcHRlciB4bWxKYXZhVHlwZUFkYXB0ZXIgPSBidWlsZFhtbEphdmFUeXBlQWRhcHRlcihhbm5vdGF0aW9uKTsKLQkJc2V0WG1sSmF2YVR5cGVBZGFwdGVyXyh4bWxKYXZhVHlwZUFkYXB0ZXIpOwotCQlyZXR1cm4geG1sSmF2YVR5cGVBZGFwdGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxKYXZhVHlwZUFkYXB0ZXIoKSB7Ci0JCWlmICh0aGlzLnhtbEphdmFUeXBlQWRhcHRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCXNldFhtbEphdmFUeXBlQWRhcHRlcl8obnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxKYXZhVHlwZUFkYXB0ZXIgYnVpbGRYbWxKYXZhVHlwZUFkYXB0ZXIoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiB4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFBdHRyaWJ1dGVYbWxKYXZhVHlwZUFkYXB0ZXIodGhpcywgeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGdldFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24oKSB7Ci0JCWlmIChnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uc1NpemUoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpID4gMCkgewotCQkJcmV0dXJuIChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVhtbEphdmFUeXBlQWRhcHRlcigpIHsKLQkJWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbEphdmFUeXBlQWRhcHRlciA9IGJ1aWxkWG1sSmF2YVR5cGVBZGFwdGVyKGFubm90YXRpb24pOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNYbWxKYXZhVHlwZUFkYXB0ZXIoKSB7Ci0JCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJaWYgKHRoaXMueG1sSmF2YVR5cGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQl0aGlzLnhtbEphdmFUeXBlQWRhcHRlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRYbWxKYXZhVHlwZUFkYXB0ZXJfKGJ1aWxkWG1sSmF2YVR5cGVBZGFwdGVyKGFubm90YXRpb24pKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXNldFhtbEphdmFUeXBlQWRhcHRlcl8obnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlWG1sSmF2YVR5cGVBZGFwdGVyKCkgewotCQlpZiAodGhpcy54bWxKYXZhVHlwZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJdGhpcy54bWxKYXZhVHlwZUFkYXB0ZXIudXBkYXRlKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sQWRhcHRlciAqKioqKgotCQotCXB1YmxpYyBYbWxBZGFwdGVyIGdldFhtbEFkYXB0ZXIoKSB7Ci0JCS8vIHNlZSBpZiB0aGVyZSBpcyBhbiB4bWwgYWRhcHRlciBzcGVjaWZpZWQgb24gdGhpcyBhdHRyaWJ1dGUKLQkJaWYgKHRoaXMueG1sSmF2YVR5cGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLnhtbEphdmFUeXBlQWRhcHRlci5nZXRYbWxBZGFwdGVyKCk7Ci0JCX0KLQkJCi0JCVN0cmluZyBib3VuZFR5cGVOYW1lID0gZ2V0Qm91bmRUeXBlTmFtZSgpOwotCQkKLQkJLy8gc2VlIGlmIHRoZXJlIGlzIGFuIHhtbCBhZGFwdGVyIHNwZWNpZmllZCBvbiB0aGUgdHlwZQotCQlKYXhiVHlwZSBib3VuZFR5cGUgPSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoYm91bmRUeXBlTmFtZSk7Ci0JCWlmIChib3VuZFR5cGUgIT0gbnVsbCkgewotCQkJWG1sSmF2YVR5cGVBZGFwdGVyIHhtbEphdmFUeXBlQWRhcHRlciA9IGJvdW5kVHlwZS5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJCWlmICh4bWxKYXZhVHlwZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCXJldHVybiB4bWxKYXZhVHlwZUFkYXB0ZXIuZ2V0WG1sQWRhcHRlcigpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBzZWUgaWYgdGhlcmUgaXMgYW4geG1sIGFkYXB0ZXIgb24gdGhlIHBhY2thZ2UKLQkJSmF4YlBhY2thZ2UgcGtnID0gZ2V0SmF4YkNsYXNzTWFwcGluZygpLmdldEpheGJUeXBlKCkuZ2V0SmF4YlBhY2thZ2UoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIHBrZ0luZm8gPSAocGtnID09IG51bGwpID8gbnVsbCA6IHBrZy5nZXRQYWNrYWdlSW5mbygpOwotCQlpZiAocGtnSW5mbyAhPSBudWxsKSB7Ci0JCQlYbWxKYXZhVHlwZUFkYXB0ZXIgeG1sSmF2YVR5cGVBZGFwdGVyID0gcGtnSW5mby5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoYm91bmRUeXBlTmFtZSk7Ci0JCQlpZiAoeG1sSmF2YVR5cGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4geG1sSmF2YVR5cGVBZGFwdGVyLmdldFhtbEFkYXB0ZXIoKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gc2VlIGlmIHRoZXJlIGlzIGFuIHhtbCBhZGFwdGVyIG9uIHRoZSAqdHlwZSdzKiBwYWNrYWdlCi0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgPSBnZXRKYXhiUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoYm91bmRUeXBlTmFtZSk7Ci0JCWlmIChyZXNvdXJjZVR5cGUgIT0gbnVsbCkgewotCQkJcGtnID0gZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlKHJlc291cmNlVHlwZS5nZXRQYWNrYWdlTmFtZSgpKTsKLQkJCXBrZ0luZm8gPSAocGtnID09IG51bGwpID8gbnVsbCA6IHBrZy5nZXRQYWNrYWdlSW5mbygpOwotCQkJaWYgKHBrZ0luZm8gIT0gbnVsbCkgewotCQkJCVhtbEphdmFUeXBlQWRhcHRlciB4bWxKYXZhVHlwZUFkYXB0ZXIgPSBwa2dJbmZvLmdldFhtbEphdmFUeXBlQWRhcHRlcihib3VuZFR5cGVOYW1lKTsKLQkJCQlpZiAoeG1sSmF2YVR5cGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHhtbEphdmFUeXBlQWRhcHRlci5nZXRYbWxBZGFwdGVyKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVUeXBlTmFtZSgpIHsKLQkJWG1sQWRhcHRlciB4bWxBZGFwdGVyID0gZ2V0WG1sQWRhcHRlcigpOwotCQlyZXR1cm4gKHhtbEFkYXB0ZXIgPT0gbnVsbCkgPyBzdXBlci5nZXRWYWx1ZVR5cGVOYW1lKCkgOiB4bWxBZGFwdGVyLmdldFZhbHVlVHlwZSgpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJaWYgKHRoaXMueG1sSmF2YVR5cGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCXRoaXMueG1sSmF2YVR5cGVBZGFwdGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUzOWFlYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVXRpbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc8QSBleHRlbmRzIEFubm90YXRpb24+Ci0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhQ29udGV4dE5vZGUKLQkJaW1wbGVtZW50cyBKYXhiQXR0cmlidXRlTWFwcGluZyB7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdF87Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5kZWZhdWx0XyA9IHRoaXMuYnVpbGREZWZhdWx0KCk7Ci0JfQotCQotCQotCXB1YmxpYyBKYXhiQ2xhc3NNYXBwaW5nIGdldENsYXNzTWFwcGluZygpIHsKLQkJcmV0dXJuIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRDbGFzc01hcHBpbmcoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnN5bmNEZWZhdWx0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFubm90YXRpb24gKioqKioqKioqKgotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBBIGdldEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoQSkgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOwotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGFuIGFubm90YXRpb24gKm11c3QqIGJlIHByZXNlbnQgKHN1Y2ggYXMgd2hlbiBzZXR0aW5nIGZpZWxkcyBvbiBpdCkuCi0JICogRm9yIG1vc3QgbWFwcGluZ3MsIHRoaXMgaXMgZXF1aXZhbGVudCB0byAjZ2V0QW5ub3RhdGlvbigpLCBidXQgZm9yIGRlZmF1bHQgbWFwcGluZ3MgKHN1Y2ggYXMgQFhtbEVsZW1lbnQpCi0JICogYW4gYW5ub3RhdGlvbiB3aWxsIGJlIGFkZGVkIGlmIG5vbmUgY3VycmVudGx5IGV4aXN0cy4KLQkgKi8KLQlwdWJsaWMgQSBnZXRPckNyZWF0ZUFubm90YXRpb24oKSB7Ci0JCUEgYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgewotCQkJZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLnNldE1hcHBpbmdLZXkoZ2V0S2V5KCkpOwotCQkJYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oKTsKLQkJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtaXNzaW5nIGFubm90YXRpb246ICIgKyB0aGlzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGRlZmF1bHQgKioqKioqKioqKgotCQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdF87Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdChib29sZWFuIGRlZmF1bHRfKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZWZhdWx0XzsKLQkJdGhpcy5kZWZhdWx0XyA9IGRlZmF1bHRfOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9QUk9QRVJUWSwgb2xkLCBkZWZhdWx0Xyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY0RlZmF1bHQoKSB7Ci0JCXRoaXMuc2V0RGVmYXVsdCh0aGlzLmJ1aWxkRGVmYXVsdCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERlZmF1bHQoKSB7Ci0JCXJldHVybiB0aGlzLmdldEFubm90YXRpb24oKSA9PSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb24oKSA9PSBudWxsID8gZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KSA6IGdldEFubm90YXRpb24oKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0JCi0JcHVibGljIEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiAoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YkNsYXNzTWFwcGluZyBnZXRKYXhiQ2xhc3NNYXBwaW5nKCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldENsYXNzTWFwcGluZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoKSB7Ci0JCXJldHVybiBnZXRKYXhiQ2xhc3NNYXBwaW5nKCkuZ2V0SmF4YlR5cGUoKS5nZXRKYXhiUGFja2FnZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Qm91bmRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGVCYXNlVHlwZU5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVR5cGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0Qm91bmRUeXBlTmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIGdldFZhbHVlVHlwZU5hbWUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBleHBlY3RlZCBzY2hlbWEgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEgdHlwZQotCSAqLwotCXB1YmxpYyBYc2RUeXBlRGVmaW5pdGlvbiBnZXREYXRhVHlwZVhzZFR5cGVEZWZpbml0aW9uKCkgewotCQlTdHJpbmcgZGF0YVR5cGUgPSBnZXREYXRhVHlwZU5hbWUoKTsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZGF0YVR5cGUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJSmF4YlBhY2thZ2UgcGtnID0gZ2V0SmF4YlBhY2thZ2UoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIHBrZ0luZm8gPSAocGtnID09IG51bGwpID8gbnVsbCA6IHBrZy5nZXRQYWNrYWdlSW5mbygpOwotCQlpZiAocGtnSW5mbyAhPSBudWxsKSB7Ci0JCQlmb3IgKFhtbFNjaGVtYVR5cGUgc2NoZW1hVHlwZSA6IHBrZ0luZm8uZ2V0WG1sU2NoZW1hVHlwZXMoKSkgewotCQkJCWlmIChkYXRhVHlwZS5lcXVhbHMoc2NoZW1hVHlwZS5nZXRGdWxseVF1YWxpZmllZFR5cGUoKSkpIHsKLQkJCQkJcmV0dXJuIHNjaGVtYVR5cGUuZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCUpheGJUeXBlTWFwcGluZyBqYXhiVHlwZU1hcHBpbmcgPSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVNYXBwaW5nKGRhdGFUeXBlKTsKLQkJaWYgKGpheGJUeXBlTWFwcGluZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gamF4YlR5cGVNYXBwaW5nLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCX0KLQkJCi0JCVN0cmluZyBidWlsdEluVHlwZSA9IGdldEpheGJQcm9qZWN0KCkuZ2V0UGxhdGZvcm0oKS5nZXREZWZpbml0aW9uKCkuZ2V0U2NoZW1hVHlwZU1hcHBpbmcoZGF0YVR5cGUpOwotCQlpZiAoYnVpbHRJblR5cGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIFhzZFV0aWwuZ2V0U2NoZW1hRm9yU2NoZW1hKCkuZ2V0VHlwZURlZmluaXRpb24oYnVpbHRJblR5cGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8U3RyaW5nPihnZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0KLQkKLQkvKiBkZWZhdWx0IGltcGwgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnRpY2xlTWFwcGluZygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKiBkZWZhdWx0IGltcGwgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zaWVudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNWQ3MWIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uLiAgT3ZlcnJpZGUgaWYgdGhlIG1hcHBpbmcgZGVmaW5pdGlvbiBuZWVkcyB0byBkbyBtb3JlIGFuYWx5c2lzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKSAKLQkJCSE9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUNvbnRleHROb2RlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhQ29udGV4dE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmODMyNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhQ29udGV4dE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4Yk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5BYnN0cmFjdEpheGJDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhQ29udGV4dE5vZGUKLQkJZXh0ZW5kcyBBYnN0cmFjdEpheGJDb250ZXh0Tm9kZQotCQlpbXBsZW1lbnRzIEphdmFDb250ZXh0Tm9kZSB7Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YUNvbnRleHROb2RlKEpheGJOb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfUkVTT1VSQ0VfVFlQRTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoCi0JCQlpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBhYnN0cmFjdCBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogQWxsIHN1YmNsYXNzIGltcGxlbWVudGF0aW9ucyB7QGxpbmsgI3ZhbGlkYXRlKExpc3QsIENvbXBpbGF0aW9uVW5pdCkpfSAKLQkgKiBzaG91bGQgYmUgcHJlY2VkZWQgYnkgYSAic3VwZXIiIGNhbGwgdG8gdGhpcyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAocmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24oKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFFbGVtZW50UU5hbWUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFFbGVtZW50UU5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlZGVmYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhRWxlbWVudFFOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbE5zRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5KcHRKYXhiQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZEVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhRWxlbWVudFFOYW1lCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhUU5hbWUgewotCQotCXB1YmxpYyBBYnN0cmFjdEphdmFFbGVtZW50UU5hbWUoSmF2YUNvbnRleHROb2RlIHBhcmVudCwgQWJzdHJhY3RKYXZhUU5hbWUuQW5ub3RhdGlvblByb3h5IHByb3h5KSB7Ci0JCXN1cGVyKHBhcmVudCwgcHJveHkpOwotCX0KLQkKLQkJCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29tcG9uZW50VHlwZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gSnB0SmF4YkNvcmVNZXNzYWdlcy5YTUxfRUxFTUVOVF9ERVNDOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQotCXByb3RlY3RlZCBKYXhiQ2xhc3NNYXBwaW5nIGdldEpheGJDbGFzc01hcHBpbmcoKSB7Ci0JCXJldHVybiBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0Q2xhc3NNYXBwaW5nKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXhiUGFja2FnZSBnZXRKYXhiUGFja2FnZSgpIHsKLQkJcmV0dXJuIGdldEpheGJDbGFzc01hcHBpbmcoKS5nZXRKYXhiVHlwZSgpLmdldEpheGJQYWNrYWdlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBYbWxFbGVtZW50V3JhcHBlciBnZXRFbGVtZW50V3JhcHBlcigpOwotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKSB7Ci0JCXJldHVybiBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXROYW1lUHJvcG9zYWxzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlYc2RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlID0gZ2V0SmF4YkNsYXNzTWFwcGluZygpLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCWlmICh4c2RUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCX0KLQkJCi0JCVhtbEVsZW1lbnRXcmFwcGVyIGVsZW1lbnRXcmFwcGVyID0gZ2V0RWxlbWVudFdyYXBwZXIoKTsKLQkJCi0JCWlmIChlbGVtZW50V3JhcHBlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4geHNkVHlwZS5nZXRFbGVtZW50TmFtZVByb3Bvc2FscyhnZXROYW1lc3BhY2UoKSwgZmlsdGVyKTsKLQkJfQotCQllbHNlIHsKLQkJCVhzZEVsZW1lbnREZWNsYXJhdGlvbiB4c2RXcmFwcGVyRWxlbWVudCA9IGVsZW1lbnRXcmFwcGVyLmdldFhzZEVsZW1lbnREZWNsYXJhdGlvbigpOwotCQkJaWYgKHhzZFdyYXBwZXJFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4geHNkV3JhcHBlckVsZW1lbnQuZ2V0RWxlbWVudE5hbWVQcm9wb3NhbHMoZ2V0TmFtZXNwYWNlKCksIGZpbHRlcik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWVzcGFjZSgpIHsKLQkJSmF4YlBhY2thZ2UgamF4YlBhY2thZ2UgPSB0aGlzLmdldEpheGJQYWNrYWdlKCk7Ci0JCXJldHVybiAoamF4YlBhY2thZ2UgIT0gbnVsbCAmJiBqYXhiUGFja2FnZS5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKSA9PSBYbWxOc0Zvcm0uUVVBTElGSUVEKSA/Ci0JCQkJZ2V0SmF4YkNsYXNzTWFwcGluZygpLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkgOiAiIjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0TmFtZXNwYWNlUHJvcG9zYWxzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlYc2RTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXRYc2RTY2hlbWEoKTsKLQkJcmV0dXJuIChzY2hlbWEgPT0gbnVsbCkgPyBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSA6IHNjaGVtYS5nZXROYW1lc3BhY2VQcm9wb3NhbHMoZmlsdGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVJlZmVyZW5jZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlYc2RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlID0gZ2V0SmF4YkNsYXNzTWFwcGluZygpLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCWlmICh4c2RUeXBlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJWHNkRWxlbWVudERlY2xhcmF0aW9uIHJlc29sdmVkWHNkRWxlbWVudCA9IG51bGw7Ci0JCQotCQlYbWxFbGVtZW50V3JhcHBlciBlbGVtZW50V3JhcHBlciA9IGdldEVsZW1lbnRXcmFwcGVyKCk7Ci0JCQotCQlpZiAoZWxlbWVudFdyYXBwZXIgPT0gbnVsbCkgewotCQkJcmVzb2x2ZWRYc2RFbGVtZW50ID0geHNkVHlwZS5nZXRFbGVtZW50KGdldE5hbWVzcGFjZSgpLCBnZXROYW1lKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJWHNkRWxlbWVudERlY2xhcmF0aW9uIHhzZFdyYXBwZXJFbGVtZW50ID0gZWxlbWVudFdyYXBwZXIuZ2V0WHNkRWxlbWVudERlY2xhcmF0aW9uKCk7Ci0JCQlpZiAoeHNkV3JhcHBlckVsZW1lbnQgPT0gbnVsbCkgewotCQkJCS8vIHRoZXJlIHdpbGwgYmUgYSBzZXBhcmF0ZSBtZXNzYWdlIGZvciB1bnJlc29sdmVkIHdyYXBwZXIgZWxlbWVudAotCQkJCS8vIG5vIG5lZWQgdG8gYWxzbyBoYXZlIGEgbWVzc2FnZSBmb3IgdGhlIG5lc3RlZCBlbGVtZW50Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJcmVzb2x2ZWRYc2RFbGVtZW50ID0geHNkV3JhcHBlckVsZW1lbnQuZ2V0RWxlbWVudChnZXROYW1lc3BhY2UoKSwgZ2V0TmFtZSgpKTsKLQkJfQotCQkKLQkJaWYgKHJlc29sdmVkWHNkRWxlbWVudCA9PSBudWxsKSB7Ci0JCQltZXNzYWdlcy5hZGQoZ2V0VW5yZXNvbHZlU2NoZW1hQ29tcG9uZW50TWVzc2FnZShhc3RSb290KSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhUU5hbWUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFRTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDEyYzk2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFRTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJRTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlFOYW1lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhUU5hbWUKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZSAKLQkJaW1wbGVtZW50cyBKYXhiUU5hbWUgewotCQotCXByb3RlY3RlZCBmaW5hbCBBbm5vdGF0aW9uUHJveHkgcHJveHk7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWROYW1lc3BhY2U7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWROYW1lOwotCQotCQotCXB1YmxpYyBBYnN0cmFjdEphdmFRTmFtZShKYXZhQ29udGV4dE5vZGUgcGFyZW50LCBBbm5vdGF0aW9uUHJveHkgcHJveHkpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5wcm94eSA9IHByb3h5OwotCQl0aGlzLnNwZWNpZmllZE5hbWVzcGFjZSA9IGdldEFubm90YXRpb25OYW1lc3BhY2UoKTsKLQkJdGhpcy5zcGVjaWZpZWROYW1lID0gZ2V0QW5ub3RhdGlvbk5hbWUoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YUNvbnRleHROb2RlKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlzZXRTcGVjaWZpZWROYW1lc3BhY2VfKGdldEFubm90YXRpb25OYW1lc3BhY2UoKSk7Ci0JCXNldFNwZWNpZmllZE5hbWVfKGdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoKTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgWHNkU2NoZW1hIGdldFhzZFNjaGVtYSgpIHsKLQkJSmF4YlBhY2thZ2UgamF4YlBhY2thZ2UgPSB0aGlzLmdldEpheGJQYWNrYWdlKCk7Ci0JCXJldHVybiAoamF4YlBhY2thZ2UgPT0gbnVsbCkgPyBudWxsIDogamF4YlBhY2thZ2UuZ2V0WHNkU2NoZW1hKCk7Ci0JfQotCQotCQotCS8vICoqKioqIG5hbWVzcGFjZSAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXRTcGVjaWZpZWROYW1lc3BhY2UoKSkgIC8vIG5hbWVzcGFjZT0iIiBpcyBhY3R1YWxseSBpbnRlcnByZXRlZCBhcyB1bnNwZWNpZmllZCBieSBKQVhCIHRvb2xzCi0JCQkJfHwgU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKGdldFNwZWNpZmllZE5hbWVzcGFjZSgpLCBKQVhCLkRFRkFVTFRfU1RSSU5HKSkgewotCQkJcmV0dXJuIGdldERlZmF1bHROYW1lc3BhY2UoKTsKLQkJfQotCQlyZXR1cm4gZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCk7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmYXVsdE5hbWVzcGFjZSgpOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWROYW1lc3BhY2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE5hbWVzcGFjZShTdHJpbmcgbmV3U3BlY2lmaWVkTmFtZXNwYWNlKSB7Ci0JCXNldEFubm90YXRpb25OYW1lc3BhY2UobmV3U3BlY2lmaWVkTmFtZXNwYWNlKTsKLQkJc2V0U3BlY2lmaWVkTmFtZXNwYWNlXyhuZXdTcGVjaWZpZWROYW1lc3BhY2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWROYW1lc3BhY2VfKFN0cmluZyBuZXdTcGVjaWZpZWROYW1lc3BhY2UpIHsKLQkJU3RyaW5nIG9sZE5hbWVzcGFjZSA9IHRoaXMuc3BlY2lmaWVkTmFtZXNwYWNlOwotCQl0aGlzLnNwZWNpZmllZE5hbWVzcGFjZSA9IG5ld1NwZWNpZmllZE5hbWVzcGFjZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTkFNRVNQQUNFX1BST1BFUlRZLCBvbGROYW1lc3BhY2UsIG5ld1NwZWNpZmllZE5hbWVzcGFjZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEFubm90YXRpb25OYW1lc3BhY2UoU3RyaW5nIG5ld05hbWVzcGFjZSkgewotCQl0aGlzLnByb3h5LnNldE5hbWVzcGFjZShuZXdOYW1lc3BhY2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lc3BhY2UoKSB7Ci0JCXJldHVybiB0aGlzLnByb3h5LmdldE5hbWVzcGFjZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBuYW1lICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAoZ2V0U3BlY2lmaWVkTmFtZSgpID09IG51bGwKLQkJCQl8fCBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoZ2V0U3BlY2lmaWVkTmFtZSgpLCBKQVhCLkRFRkFVTFRfU1RSSU5HKSkgewotCQkJcmV0dXJuIGdldERlZmF1bHROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGdldFNwZWNpZmllZE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREZWZhdWx0TmFtZSgpOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTmFtZShTdHJpbmcgbmV3U3BlY2lmaWVkTmFtZSkgewotCQlzZXRBbm5vdGF0aW9uTmFtZShuZXdTcGVjaWZpZWROYW1lKTsKLQkJc2V0U3BlY2lmaWVkTmFtZV8obmV3U3BlY2lmaWVkTmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCAgdm9pZCBzZXRTcGVjaWZpZWROYW1lXyhTdHJpbmcgbmV3U3BlY2lmaWVkTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWROYW1lOwotCQl0aGlzLnNwZWNpZmllZE5hbWUgPSBuZXdTcGVjaWZpZWROYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9OQU1FX1BST1BFUlRZLCBvbGQsIG5ld1NwZWNpZmllZE5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRBbm5vdGF0aW9uTmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQl0aGlzLnByb3h5LnNldE5hbWUobmV3TmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnByb3h5LmdldE5hbWUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogY29udGVudCBhc3Npc3QgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscygKLQkJCWludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCWlmICh0aGlzLnByb3h5Lm5hbWVzcGFjZVRvdWNoZXMocG9zLCBhc3RSb290KSkgewotCQkJcmV0dXJuIGdldE5hbWVzcGFjZVByb3Bvc2FscyhmaWx0ZXIpOwotCQl9Ci0JCQotCQlpZiAodGhpcy5wcm94eS5uYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpKSB7Ci0JCQlyZXR1cm4gZ2V0TmFtZVByb3Bvc2FscyhmaWx0ZXIpOwotCQl9Ci0JCQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmFibGU8U3RyaW5nPiBnZXROYW1lc3BhY2VQcm9wb3NhbHMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmFibGU8U3RyaW5nPiBnZXROYW1lUHJvcG9zYWxzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcik7Ci0JCi0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoVGV4dFJhbmdlIHRleHRSYW5nZSwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiBnZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVzcGFjZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0VGV4dFJhbmdlKHRoaXMucHJveHkuZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKGFzdFJvb3QpLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRUZXh0UmFuZ2UodGhpcy5wcm94eS5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpLCBhc3RSb290KTsKLQl9Ci0JCi0JLyoqCi0JICogZS5nLiAiWE1MIGVsZW1lbnQiCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29tcG9uZW50VHlwZURlc2NyaXB0aW9uKCkgewotCQkvLyBkZWZhdWx0IGltcGwKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQl2YWxpZGF0ZU5hbWUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCWlmICghIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZ2V0TmFtZSgpKSkgewotCQkJdmFsaWRhdGVSZWZlcmVuY2UobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU5hbWUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZ2V0TmFtZSgpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlFOQU1FX19NSVNTSU5HX05BTUUsCi0JCQkJCW5ldyBTdHJpbmdbXSB7IGdldFJlZmVyZW5jZWRDb21wb25lbnRUeXBlRGVzY3JpcHRpb24oKSB9LAotCQkJCQl0aGlzLAotCQkJCQlnZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmFsaWRhdGVSZWZlcmVuY2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCXByb3RlY3RlZCBJTWVzc2FnZSBnZXRVbnJlc29sdmVTY2hlbWFDb21wb25lbnRNZXNzYWdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuUU5BTUVfX1VOUkVTT0xWRURfQ09NUE9ORU5ULAotCQkJCW5ldyBTdHJpbmdbXSB7IGdldFJlZmVyZW5jZWRDb21wb25lbnRUeXBlRGVzY3JpcHRpb24oKSwgZ2V0TmFtZXNwYWNlKCksIGdldE5hbWUoKSB9LAotCQkJCXRoaXMsCi0JCQkJZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KSk7Ci0JfQotCQotCQotCXB1YmxpYyBpbnRlcmZhY2UgQW5ub3RhdGlvblByb3h5IHsKLQkJCi0JCVN0cmluZyBnZXROYW1lc3BhY2UoKTsKLQkJCi0JCXZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpOwotCQkKLQkJYm9vbGVhbiBuYW1lc3BhY2VUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkJCi0JCVRleHRSYW5nZSBnZXROYW1lc3BhY2VUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQkKLQkJU3RyaW5nIGdldE5hbWUoKTsKLQkJCi0JCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0JCQotCQlib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkJCi0JCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogcmVwcmVzZW50cyBhIHtAbGluayBRTmFtZUFubm90YXRpb259Ci0JICovCi0JcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFFOYW1lQW5ub3RhdGlvblByb3h5Ci0JCQlpbXBsZW1lbnRzIEFubm90YXRpb25Qcm94eSB7Ci0JCQotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgUU5hbWVBbm5vdGF0aW9uIGdldEFubm90YXRpb24oYm9vbGVhbiBjcmVhdGVJZk51bGwpOwotCQkKLQkJcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCQlRTmFtZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oZmFsc2UpOwotCQkJcmV0dXJuIGFubm90YXRpb24gPT0gbnVsbCA/IG51bGwgOiBhbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5ld1NwZWNpZmllZE5hbWVzcGFjZSkgewotCQkJZ2V0QW5ub3RhdGlvbih0cnVlKS5zZXROYW1lc3BhY2UobmV3U3BlY2lmaWVkTmFtZXNwYWNlKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gbmFtZXNwYWNlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJUU5hbWVBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKGZhbHNlKTsKLQkJCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IGZhbHNlIDogYW5ub3RhdGlvbi5uYW1lc3BhY2VUb3VjaGVzKHBvcywgYXN0Um9vdCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlRTmFtZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oZmFsc2UpOwotCQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGFubm90YXRpb24uZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKGFzdFJvb3QpOwotCQl9Ci0JCQkKLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJUU5hbWVBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKGZhbHNlKTsKLQkJCXJldHVybiBhbm5vdGF0aW9uID09IG51bGwgPyBudWxsIDogYW5ub3RhdGlvbi5nZXROYW1lKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld1NwZWNpZmllZE5hbWUpIHsKLQkJCWdldEFubm90YXRpb24odHJ1ZSkuc2V0TmFtZShuZXdTcGVjaWZpZWROYW1lKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCVFOYW1lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbihmYWxzZSk7Ci0JCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBmYWxzZSA6IGFubm90YXRpb24ubmFtZVRvdWNoZXMocG9zLCBhc3RSb290KTsKLQkJfQotCQkKLQkJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlRTmFtZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oZmFsc2UpOwotCQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGFubm90YXRpb24uZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFUeXBlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjcwMmVlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sVHJhbnNpZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sVHlwZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5WYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YVR5cGUKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZQotCQlpbXBsZW1lbnRzIEpheGJUeXBlIHsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZTsKLQkKLQlwcm90ZWN0ZWQgSmF4YlR5cGVNYXBwaW5nIG1hcHBpbmc7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdE1hcHBlZCA9IGZhbHNlOwotCQotCXByb3RlY3RlZCBYbWxKYXZhVHlwZUFkYXB0ZXIgeG1sSmF2YVR5cGVBZGFwdGVyOwotCQotCQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFUeXBlKEpheGJDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5yZXNvdXJjZVR5cGUgPSByZXNvdXJjZVR5cGU7Ci0JCWluaXRNYXBwaW5nKCk7Ci0JCWluaXRYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogb3ZlcnJpZGVzICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VUeXBlLmdldEZpbGUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3luYy91cGRhdGUgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXN5bmNNYXBwaW5nKCk7Ci0JCXN5bmNYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdXBkYXRlTWFwcGluZygpOwotCQl1cGRhdGVYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWFwcGluZyAqKioqKgotCQotCXB1YmxpYyBKYXhiVHlwZU1hcHBpbmcgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGluZzsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFwcGluZ18oSmF4YlR5cGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKLQkJSmF4YlR5cGVNYXBwaW5nIG9sZCA9IHRoaXMubWFwcGluZzsKLQkJdGhpcy5tYXBwaW5nID0gbmV3TWFwcGluZzsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBQSU5HX1BST1BFUlRZLCBvbGQsIG5ld01hcHBpbmcpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSmF4YlR5cGVNYXBwaW5nIGJ1aWxkTWFwcGluZygpOwotCQotCXByb3RlY3RlZCB2b2lkIGluaXRNYXBwaW5nKCkgewotCQlpZiAoaXNEZWZhdWx0TWFwcGVkKCkgfHwgaXNTcGVjaWZpZWRNYXBwZWQoKSkgewotCQkJdGhpcy5tYXBwaW5nID0gYnVpbGRNYXBwaW5nKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY01hcHBpbmcoKSB7Ci0JCWlmICh0aGlzLm1hcHBpbmcgIT0gbnVsbCkgewotCQkJdGhpcy5tYXBwaW5nLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNYXBwaW5nKCkgewotCQlib29sZWFuIGlzTWFwcGVkID0gaXNEZWZhdWx0TWFwcGVkKCkgfHwgaXNTcGVjaWZpZWRNYXBwZWQoKTsKLQkJaWYgKGlzTWFwcGVkKSB7Ci0JCQlpZiAodGhpcy5tYXBwaW5nICE9IG51bGwpIHsKLQkJCQl0aGlzLm1hcHBpbmcudXBkYXRlKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRNYXBwaW5nXyhidWlsZE1hcHBpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5tYXBwaW5nICE9IG51bGwpIHsKLQkJCXNldE1hcHBpbmdfKG51bGwpOwotCQl9Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGFubm90YXRpb25zIG9uIHRoaXMgdHlwZSBpbmRpY2F0ZSBpdCBzaG91bGQgaGF2ZSBhIG1hcHBpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NwZWNpZmllZE1hcHBlZCgpIHsKLQkJcmV0dXJuIGdldFhtbFR5cGVBbm5vdGF0aW9uKCkgIT0gbnVsbAotCQkJCXx8IGdldFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbigpICE9IG51bGwKLQkJCQl8fCBnZXRYbWxUcmFuc2llbnRBbm5vdGF0aW9uKCkgIT0gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbFR5cGVBbm5vdGF0aW9uIGdldFhtbFR5cGVBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbFR5cGVBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiBnZXRYbWxSb290RWxlbWVudEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sVHJhbnNpZW50QW5ub3RhdGlvbiBnZXRYbWxUcmFuc2llbnRBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbFRyYW5zaWVudEFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RSQU5TSUVOVCk7Ci0JfQotCQotCQotCS8vICoqKioqIGRlZmF1bHQgbWFwcGVkICoqKioqCi0JCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TWFwcGVkKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0TWFwcGVkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TWFwcGVkKGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRlZmF1bHRNYXBwZWQ7Ci0JCXRoaXMuZGVmYXVsdE1hcHBlZCA9IG5ld1ZhbHVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfTUFQUEVEX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sSmF2YVR5cGVBZGFwdGVyICoqKioqCi0JCi0JcHVibGljIFhtbEphdmFUeXBlQWRhcHRlciBnZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEphdmFUeXBlQWRhcHRlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sSmF2YVR5cGVBZGFwdGVyXyhYbWxKYXZhVHlwZUFkYXB0ZXIgeG1sSmF2YVR5cGVBZGFwdGVyKSB7Ci0JCVhtbEphdmFUeXBlQWRhcHRlciBvbGRYbWxKYXZhVHlwZUFkYXB0ZXIgPSB0aGlzLnhtbEphdmFUeXBlQWRhcHRlcjsKLQkJdGhpcy54bWxKYXZhVHlwZUFkYXB0ZXIgPSB4bWxKYXZhVHlwZUFkYXB0ZXI7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoWE1MX0pBVkFfVFlQRV9BREFQVEVSX1BST1BFUlRZLCBvbGRYbWxKYXZhVHlwZUFkYXB0ZXIsIHhtbEphdmFUeXBlQWRhcHRlcik7Ci0JfQotCQotCXB1YmxpYyBYbWxKYXZhVHlwZUFkYXB0ZXIgYWRkWG1sSmF2YVR5cGVBZGFwdGVyKCkgewotCQlpZiAodGhpcy54bWxKYXZhVHlwZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gYW5ub3RhdGlvbiAKLQkJCQk9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkuYWRkQW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCVhtbEphdmFUeXBlQWRhcHRlciB4bWxKYXZhVHlwZUFkYXB0ZXIgPSBidWlsZFhtbEphdmFUeXBlQWRhcHRlcihhbm5vdGF0aW9uKTsKLQkJc2V0WG1sSmF2YVR5cGVBZGFwdGVyXyh4bWxKYXZhVHlwZUFkYXB0ZXIpOwotCQlyZXR1cm4geG1sSmF2YVR5cGVBZGFwdGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxKYXZhVHlwZUFkYXB0ZXIoKSB7Ci0JCWlmICh0aGlzLnhtbEphdmFUeXBlQWRhcHRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZ2V0SmF2YVJlc291cmNlVHlwZSgpLnJlbW92ZUFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlzZXRYbWxKYXZhVHlwZUFkYXB0ZXJfKG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiBnZXRYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKCkgewotCQlpZiAoZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb25zU2l6ZShKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUikgPiAwKSB7Ci0JCQlyZXR1cm4gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEphdmFUeXBlQWRhcHRlciBidWlsZFhtbEphdmFUeXBlQWRhcHRlcihYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVR5cGVYbWxKYXZhVHlwZUFkYXB0ZXIodGhpcywgeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSB7Ci0JCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJdGhpcy54bWxKYXZhVHlwZUFkYXB0ZXIgPSBidWlsZFhtbEphdmFUeXBlQWRhcHRlcihhbm5vdGF0aW9uKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sSmF2YVR5cGVBZGFwdGVyKCkgewotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnhtbEphdmFUeXBlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJdGhpcy54bWxKYXZhVHlwZUFkYXB0ZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0WG1sSmF2YVR5cGVBZGFwdGVyXyhidWlsZFhtbEphdmFUeXBlQWRhcHRlcihhbm5vdGF0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRYbWxKYXZhVHlwZUFkYXB0ZXJfKG51bGwpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVhtbEphdmFUeXBlQWRhcHRlcigpIHsKLQkJaWYgKHRoaXMueG1sSmF2YVR5cGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCXRoaXMueG1sSmF2YVR5cGVBZGFwdGVyLnVwZGF0ZSgpOwotCQl9Ci0JfQotCQotCQotCS8vICoqKioqIEpheGJUeXBlIG1pc2MgKioqKioKLQkKLQlwdWJsaWMgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGdldEphdmFSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlVHlwZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTaW1wbGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVR5cGUuZ2V0TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVRdWFsaWZpZWROYW1lKCkgewotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZSgpOwotCQlyZXR1cm4gKHBhY2thZ2VOYW1lLmxlbmd0aCgpID09IDApID8gZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgOiBnZXRGdWxseVF1YWxpZmllZE5hbWUoKS5zdWJzdHJpbmcocGFja2FnZU5hbWUubGVuZ3RoKCkgKyAxKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlVHlwZS5nZXRQYWNrYWdlTmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoKSB7Ci0JCXJldHVybiBnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2UoZ2V0UGFja2FnZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBKYXhiUGFja2FnZUluZm8gZ2V0SmF4YlBhY2thZ2VJbmZvKCkgewotCQlKYXhiUGFja2FnZSBwa2cgPSBnZXRKYXhiUGFja2FnZSgpOwotCQlyZXR1cm4gKHBrZyA9PSBudWxsKSA/IG51bGwgOiBwa2cuZ2V0UGFja2FnZUluZm8oKTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpIHsKLQkJaWYgKHRoaXMubWFwcGluZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5tYXBwaW5nLmdldFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdCBidWlsZEFTVFJvb3QoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlVHlwZS5nZXRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoKS5idWlsZEFTVFJvb3QoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogY29udGVudCBhc3Npc3QgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscygKLQkJCWludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCi0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlpZiAodGhpcy5tYXBwaW5nICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHRoaXMubWFwcGluZy5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHRoaXMueG1sSmF2YVR5cGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHRoaXMueG1sSmF2YVR5cGVBZGFwdGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JLyoqCi0JICogT3ZlcnJpZGUgYXMgbmVlZGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAocmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24oKTsKLQkJfQotCQkvLyBUT0RPIHRlbXBvcmFyeSBoYWNrIHNpbmNlIHdlIGRvbid0IGtub3cgeWV0IHdoZXJlIHRvIHB1dAotCQkvLyBhbnkgbWVzc2FnZXMgZm9yIHR5cGVzIGluIGFub3RoZXIgcHJvamVjdAotCQlJRmlsZSBmaWxlID0gdGhpcy5yZXNvdXJjZVR5cGUuZ2V0RmlsZSgpOwotCQkvLyAnZmlsZScgd2lsbCBiZSBudWxsIGlmIHRoZSB0eXBlIGlzICJleHRlcm5hbCIgYW5kIGJpbmFyeTsKLQkJLy8gdGhlIGZpbGUgd2lsbCBiZSBpbiBhIGRpZmZlcmVudCBwcm9qZWN0IGlmIHRoZSB0eXBlIGlzICJleHRlcm5hbCIgYW5kIHNvdXJjZTsKLQkJLy8gdGhlIHR5cGUgd2lsbCBiZSBiaW5hcnkgaWYgaXQgaXMgaW4gYSBKQVIgaW4gdGhlIGN1cnJlbnQgcHJvamVjdAotCQlpZiAoKGZpbGUgIT0gbnVsbCkgCi0JCQkJJiYgZmlsZS5nZXRQcm9qZWN0KCkuZXF1YWxzKGdldEpheGJQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKSAKLQkJCQkmJiAodGhpcy5yZXNvdXJjZVR5cGUgaW5zdGFuY2VvZiBTb3VyY2VOb2RlKSkgewotCQkJLy8gYnVpbGQgdGhlIEFTVCByb290IGhlcmUgdG8gcGFzcyBkb3duCi0JCQl0aGlzLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgdGhpcy5idWlsZEFTVFJvb3QoKSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCWlmICh0aGlzLm1hcHBpbmcgIT0gbnVsbCkgewotCQkJdGhpcy5tYXBwaW5nLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQkJCi0JCWlmICh0aGlzLnhtbEphdmFUeXBlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbEphdmFUeXBlQWRhcHRlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVR5cGVNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdlMDNlMi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxSb290RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sU2VlQWxzbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5KcHRKYXhiQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KYXhiVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5RTmFtZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sU2VlQWxzb0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFRyYW5zaWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFR5cGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZEVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmcKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZQotCQlpbXBsZW1lbnRzIEpheGJUeXBlTWFwcGluZyB7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4geG1sVHJhbnNpZW50OwotCQotCXByb3RlY3RlZCBmaW5hbCBKYXhiUU5hbWUgcU5hbWU7Ci0JCi0JcHJvdGVjdGVkIFhtbFJvb3RFbGVtZW50IHhtbFJvb3RFbGVtZW50OwotCQotCXByb3RlY3RlZCBYbWxTZWVBbHNvIHhtbFNlZUFsc287Ci0JCi0JCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YVR5cGVNYXBwaW5nKEpheGJUeXBlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQlpbml0WG1sVHJhbnNpZW50KCk7Ci0JCXRoaXMucU5hbWUgPSBidWlsZFFOYW1lKCk7IAotCQlpbml0WG1sUm9vdEVsZW1lbnQoKTsKLQkJaW5pdGlhbGl6ZVhtbFNlZUFsc28oKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpheGJUeXBlIGdldEpheGJUeXBlKCkgewotCQlyZXR1cm4gKEpheGJUeXBlKSBnZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gZ2V0SmF4YlR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXhiUGFja2FnZSBnZXRKYXhiUGFja2FnZSgpIHsKLQkJcmV0dXJuIGdldEpheGJUeXBlKCkuZ2V0SmF4YlBhY2thZ2UoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3luYy91cGRhdGUgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXN5bmNYbWxUcmFuc2llbnQoKTsKLQkJdGhpcy5xTmFtZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXN5bmNYbWxSb290RWxlbWVudCgpOwotCQlzeW5jWG1sU2VlQWxzbygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnFOYW1lLnVwZGF0ZSgpOwotCQl1cGRhdGVYbWxSb290RWxlbWVudCgpOwotCQl1cGRhdGVYbWxTZWVBbHNvKCk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbFRyYW5zaWVudCAqKioqKgotCQotCXB1YmxpYyBib29sZWFuIGlzWG1sVHJhbnNpZW50KCkgewotCQlyZXR1cm4gdGhpcy54bWxUcmFuc2llbnQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFhtbFRyYW5zaWVudChib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCWdldEphdmFSZXNvdXJjZVR5cGUoKS5hZGRBbm5vdGF0aW9uKEpBWEIuWE1MX1RSQU5TSUVOVCk7Ci0JCXNldFhtbFRyYW5zaWVudF8obmV3VmFsdWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxUcmFuc2llbnRfKGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLnhtbFRyYW5zaWVudDsKLQkJdGhpcy54bWxUcmFuc2llbnQgPSBuZXdWYWx1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChYTUxfVFJBTlNJRU5UX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbFRyYW5zaWVudEFubm90YXRpb24gZ2V0WG1sVHJhbnNpZW50QW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxUcmFuc2llbnRBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UUkFOU0lFTlQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0WG1sVHJhbnNpZW50KCkgewotCQl0aGlzLnhtbFRyYW5zaWVudCA9IGdldFhtbFRyYW5zaWVudEFubm90YXRpb24oKSAhPSBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sVHJhbnNpZW50KCkgewotCQlzZXRYbWxUcmFuc2llbnRfKGdldFhtbFRyYW5zaWVudEFubm90YXRpb24oKSAhPSBudWxsKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sVHlwZS5uYW1lIGFuZCBuYW1lc3BhY2UgKioqKioKLQkKLQlwdWJsaWMgSmF4YlFOYW1lIGdldFFOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5xTmFtZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJRTmFtZSBidWlsZFFOYW1lKCkgewotCQlyZXR1cm4gbmV3IFhtbFR5cGVRTmFtZSh0aGlzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbFR5cGVBbm5vdGF0aW9uIGdldFhtbFR5cGVBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbFR5cGVBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0Tm9uTnVsbEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbFJvb3RFbGVtZW50ICoqKioqCi0JCi0JcHVibGljIFhtbFJvb3RFbGVtZW50IGdldFhtbFJvb3RFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy54bWxSb290RWxlbWVudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sUm9vdEVsZW1lbnRfKFhtbFJvb3RFbGVtZW50IHJvb3RFbGVtZW50KSB7Ci0JCVhtbFJvb3RFbGVtZW50IG9sZCA9IHRoaXMueG1sUm9vdEVsZW1lbnQ7Ci0JCXRoaXMueG1sUm9vdEVsZW1lbnQgPSByb290RWxlbWVudDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9ST09UX0VMRU1FTlRfUFJPUEVSVFksIG9sZCwgcm9vdEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgWG1sUm9vdEVsZW1lbnQgYWRkWG1sUm9vdEVsZW1lbnQoKSB7Ci0JCWlmICh0aGlzLnhtbFJvb3RFbGVtZW50ICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQkKLQkJWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uIGFubm90YXRpb24gCi0JCQkJPSAoWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkuYWRkQW5ub3RhdGlvbihKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCQkKLQkJWG1sUm9vdEVsZW1lbnQgeG1sUm9vdEVsZW1lbnQgPSBidWlsZFhtbFJvb3RFbGVtZW50KGFubm90YXRpb24pOwotCQlzZXRYbWxSb290RWxlbWVudF8oeG1sUm9vdEVsZW1lbnQpOwotCQlyZXR1cm4geG1sUm9vdEVsZW1lbnQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbFJvb3RFbGVtZW50KCkgewotCQlpZiAodGhpcy54bWxSb290RWxlbWVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJCi0JCWdldEphdmFSZXNvdXJjZVR5cGUoKS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX1JPT1RfRUxFTUVOVCk7Ci0JCXNldFhtbFJvb3RFbGVtZW50XyhudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiBnZXRYbWxSb290RWxlbWVudEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sUm9vdEVsZW1lbnQgYnVpbGRYbWxSb290RWxlbWVudCgpIHsKLQkJWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxSb290RWxlbWVudEFubm90YXRpb24oKTsKLQkJcmV0dXJuIGFubm90YXRpb24gPT0gbnVsbCA/IG51bGwgOiBidWlsZFhtbFJvb3RFbGVtZW50KGFubm90YXRpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sUm9vdEVsZW1lbnQgYnVpbGRYbWxSb290RWxlbWVudChYbWxSb290RWxlbWVudEFubm90YXRpb24gcmVzb3VyY2VSb290RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0RmFjdG9yeSgpLmJ1aWxkSmF2YVhtbFJvb3RFbGVtZW50KHRoaXMsIHJlc291cmNlUm9vdEVsZW1lbnQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0WG1sUm9vdEVsZW1lbnQoKSB7Ci0JCXRoaXMueG1sUm9vdEVsZW1lbnQgPSB0aGlzLmJ1aWxkWG1sUm9vdEVsZW1lbnQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1htbFJvb3RFbGVtZW50KCkgewotCQlYbWxSb290RWxlbWVudEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy54bWxSb290RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJdGhpcy54bWxSb290RWxlbWVudC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRYbWxSb290RWxlbWVudF8oYnVpbGRYbWxSb290RWxlbWVudChhbm5vdGF0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy54bWxSb290RWxlbWVudCAhPSBudWxsKSB7Ci0JCQlzZXRYbWxSb290RWxlbWVudF8obnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlWG1sUm9vdEVsZW1lbnQoKSB7Ci0JCWlmICh0aGlzLnhtbFJvb3RFbGVtZW50ICE9IG51bGwpIHsKLQkJCXRoaXMueG1sUm9vdEVsZW1lbnQudXBkYXRlKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sU2VlQWxzbyAqKioqKgotCQotCXB1YmxpYyBYbWxTZWVBbHNvIGdldFhtbFNlZUFsc28oKSB7Ci0JCXJldHVybiB0aGlzLnhtbFNlZUFsc287Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFhtbFNlZUFsc29fKFhtbFNlZUFsc28geG1sU2VlQWxzbykgewotCQlYbWxTZWVBbHNvIG9sZCA9IHRoaXMueG1sU2VlQWxzbzsKLQkJdGhpcy54bWxTZWVBbHNvID0geG1sU2VlQWxzbzsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChYTUxfU0VFX0FMU09fUFJPUEVSVFksIG9sZCwgeG1sU2VlQWxzbyk7Ci0JfQotCQotCXB1YmxpYyBYbWxTZWVBbHNvIGFkZFhtbFNlZUFsc28oKSB7Ci0JCWlmICh0aGlzLnhtbFNlZUFsc28gIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCVhtbFNlZUFsc29Bbm5vdGF0aW9uIGFubm90YXRpb24gCi0JCQkJPSAoWG1sU2VlQWxzb0Fubm90YXRpb24pIGdldEphdmFSZXNvdXJjZVR5cGUoKS5hZGRBbm5vdGF0aW9uKEpBWEIuWE1MX1NFRV9BTFNPKTsKLQkJCi0JCVhtbFNlZUFsc28geG1sU2VlQWxzbyA9IGJ1aWxkWG1sU2VlQWxzbyhhbm5vdGF0aW9uKTsKLQkJc2V0WG1sU2VlQWxzb18oeG1sU2VlQWxzbyk7Ci0JCXJldHVybiB4bWxTZWVBbHNvOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxTZWVBbHNvKCkgewotCQlpZiAodGhpcy54bWxTZWVBbHNvID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlnZXRKYXZhUmVzb3VyY2VUeXBlKCkucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9TRUVfQUxTTyk7Ci0JCXNldFhtbFNlZUFsc29fKG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sU2VlQWxzb0Fubm90YXRpb24gZ2V0WG1sU2VlQWxzb0Fubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sU2VlQWxzb0Fubm90YXRpb24pIGdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NFRV9BTFNPKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbFNlZUFsc28gYnVpbGRYbWxTZWVBbHNvKFhtbFNlZUFsc29Bbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVhtbFNlZUFsc28odGhpcywgYW5ub3RhdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVYbWxTZWVBbHNvKCkgewotCQlYbWxTZWVBbHNvQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sU2VlQWxzb0Fubm90YXRpb24oKTsKLQkJdGhpcy54bWxTZWVBbHNvID0gKGFubm90YXRpb24gPT0gbnVsbCkgPwotCQkJCW51bGwKLQkJCQk6IGJ1aWxkWG1sU2VlQWxzbyhhbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1htbFNlZUFsc28oKSB7Ci0JCVhtbFNlZUFsc29Bbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxTZWVBbHNvQW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy54bWxTZWVBbHNvICE9IG51bGwpIHsKLQkJCQl0aGlzLnhtbFNlZUFsc28uc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0WG1sU2VlQWxzb18oYnVpbGRYbWxTZWVBbHNvKGFubm90YXRpb24pKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXNldFhtbFNlZUFsc29fKG51bGwpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVhtbFNlZUFsc28oKSB7Ci0JCWlmICh0aGlzLnhtbFNlZUFsc28gIT0gbnVsbCkgewotCQkJdGhpcy54bWxTZWVBbHNvLnVwZGF0ZSgpOwotCQl9Ci0JfQotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQlwdWJsaWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBnZXRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCkgewotCQlyZXR1cm4gKHRoaXMueG1sVHJhbnNpZW50KSA/Ci0JCQkJZ2V0VHJhbnNpZW50UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpCi0JCQkJOiBnZXROb25UcmFuc2llbnRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCk7IAotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRUcmFuc2llbnRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXROb25UcmFuc2llbnRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCkgewotCQlpZiAodGhpcy54bWxTZWVBbHNvICE9IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLnhtbFNlZUFsc28uZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpOwotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoCi0JCQlpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQotCQlKYXhiUGFja2FnZSBqYXhiUGFja2FnZSA9IGdldEpheGJQYWNrYWdlKCk7Ci0JCWlmIChqYXhiUGFja2FnZSAhPSBudWxsKSB7Ci0JCQlnZXRKYXhiUHJvamVjdCgpLmdldFNjaGVtYUxpYnJhcnkoKS5yZWZyZXNoU2NoZW1hKGpheGJQYWNrYWdlLmdldE5hbWVzcGFjZSgpKTsKLQkJfQotCQkKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXJlc3VsdCA9IHRoaXMucU5hbWUuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlpZiAodGhpcy54bWxSb290RWxlbWVudCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSB0aGlzLnhtbFJvb3RFbGVtZW50LmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBnZXRYbWxUeXBlQW5ub3RhdGlvbigpLmdldFRleHRSYW5nZShhc3RSb290KTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiBnZXRKYXhiVHlwZSgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlpZiAoISB0aGlzLnhtbFRyYW5zaWVudCkgewotCQkJdGhpcy5xTmFtZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkJCi0JCQlpZiAodGhpcy54bWxSb290RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJdGhpcy54bWxSb290RWxlbWVudC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkJfQotCQl9Ci0JfQotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQlwdWJsaWMgWHNkVHlwZURlZmluaXRpb24gZ2V0WHNkVHlwZURlZmluaXRpb24oKSB7Ci0JCUpheGJQYWNrYWdlIGpheGJQYWNrYWdlID0gZ2V0SmF4YlBhY2thZ2UoKTsKLQkJWHNkU2NoZW1hIHhzZFNjaGVtYSA9IChqYXhiUGFja2FnZSA9PSBudWxsKSA/IG51bGwgOiBqYXhiUGFja2FnZS5nZXRYc2RTY2hlbWEoKTsKLQkJaWYgKHhzZFNjaGVtYSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJaWYgKCEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLnFOYW1lLmdldE5hbWUoKSkpIHsKLQkJCXJldHVybiB4c2RTY2hlbWEuZ2V0VHlwZURlZmluaXRpb24odGhpcy5xTmFtZS5nZXROYW1lc3BhY2UoKSwgdGhpcy5xTmFtZS5nZXROYW1lKCkpOwotCQl9Ci0JCQotCQlpZiAodGhpcy54bWxSb290RWxlbWVudCAhPSBudWxsKSB7Ci0JCQlYc2RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudCAKLQkJCQkJPSB4c2RTY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9uKAotCQkJCQkJCXRoaXMueG1sUm9vdEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSwgCi0JCQkJCQkJdGhpcy54bWxSb290RWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCQlpZiAoeHNkRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHhzZEVsZW1lbnQuZ2V0VHlwZSgpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzUm9vdEVsZW1lbnRJbkhpZXJhcmNoeSgpIHsKLQkJcmV0dXJuIHRoaXMueG1sUm9vdEVsZW1lbnQgIT0gbnVsbDsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFhtbFR5cGVRTmFtZQotCQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFRTmFtZSB7Ci0JCQotCQlwcm90ZWN0ZWQgWG1sVHlwZVFOYW1lKEphdmFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudCwgbmV3IFFOYW1lQW5ub3RhdGlvblByb3h5KCkpOwotCQl9Ci0JCQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXhiUGFja2FnZSBnZXRKYXhiUGFja2FnZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFUeXBlTWFwcGluZy50aGlzLmdldEpheGJUeXBlKCkuZ2V0SmF4YlBhY2thZ2UoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWVzcGFjZSgpIHsKLQkJCUpheGJQYWNrYWdlIGpheGJQYWNrYWdlID0gQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmcudGhpcy5nZXRKYXhiVHlwZSgpLmdldEpheGJQYWNrYWdlKCk7Ci0JCQlyZXR1cm4gKGpheGJQYWNrYWdlID09IG51bGwpID8gbnVsbCA6IGpheGJQYWNrYWdlLmdldE5hbWVzcGFjZSgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZSgpIHsKLQkJCXJldHVybiBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKEFic3RyYWN0SmF2YVR5cGVNYXBwaW5nLnRoaXMuZ2V0SmF4YlR5cGUoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0TmFtZXNwYWNlUHJvcG9zYWxzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJWHNkU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0WHNkU2NoZW1hKCk7Ci0JCQlpZiAoc2NoZW1hID09IG51bGwpIHsKLQkJCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQkJfQotCQkJcmV0dXJuIHNjaGVtYS5nZXROYW1lc3BhY2VQcm9wb3NhbHMoZmlsdGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldE5hbWVQcm9wb3NhbHMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQlYc2RTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXRYc2RTY2hlbWEoKTsKLQkJCWlmIChzY2hlbWEgPT0gbnVsbCkgewotCQkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc2NoZW1hLmdldFR5cGVOYW1lUHJvcG9zYWxzKGdldE5hbWVzcGFjZSgpLCBmaWx0ZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29tcG9uZW50VHlwZURlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIEpwdEpheGJDb3JlTWVzc2FnZXMuWE1MX1RZUEVfREVTQzsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTmFtZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJLy8gZG8gbm90IGNhbGwgc3VwZXIuLi4gLSBpdCBpcyBub3QgYW4gZXJyb3IgaWYgdGhlIG5hbWUgaXMgIiIKLQkJCS8vIGlmIG5hbWUgaXMgYWJzZW50ICgiIiksIG5hbWVzcGFjZSBjYW5ub3QgYmUgZGlmZmVyZW50IGZyb20gcGFja2FnZSBuYW1lc3BhY2UKLQkJCWlmICgiIi5lcXVhbHMoZ2V0TmFtZSgpKSAKLQkJCQkJJiYgISBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoCi0JCQkJCQkJZ2V0TmFtZXNwYWNlKCksCi0JCQkJCQkJZ2V0RGVmYXVsdE5hbWVzcGFjZSgpKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfVFlQRV9fVU5NQVRDSElOR19OQU1FU1BBQ0VfRk9SX0FOT05ZTU9VU19UWVBFLAotCQkJCQkJdGhpcywKLQkJCQkJCWdldFhtbFR5cGVBbm5vdGF0aW9uKCkuZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVJlZmVyZW5jZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJLy8gaWYgbmFtZSBpcyBub3QgYWJzZW50ICgiIiksIHR5cGUgbXVzdCBiZSBmcm9tIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWNrYWdlCi0JCQlTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJCVN0cmluZyBuYW1lc3BhY2UgPSBnZXROYW1lc3BhY2UoKTsKLQkJCQotCQkJaWYgKCEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShuYW1lKSkgewotCQkJCVhzZFNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldFhzZFNjaGVtYSgpOwotCQkJCWlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJCQlYc2RUeXBlRGVmaW5pdGlvbiBzY2hlbWFUeXBlID0gc2NoZW1hLmdldFR5cGVEZWZpbml0aW9uKG5hbWVzcGFjZSwgbmFtZSk7Ci0JCQkJCWlmIChzY2hlbWFUeXBlID09IG51bGwpIHsKLQkJCQkJCW1lc3NhZ2VzLmFkZChnZXRVbnJlc29sdmVTY2hlbWFDb21wb25lbnRNZXNzYWdlKGFzdFJvb3QpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgUU5hbWVBbm5vdGF0aW9uUHJveHkgCi0JCQlleHRlbmRzIEFic3RyYWN0SmF2YVFOYW1lLkFic3RyYWN0UU5hbWVBbm5vdGF0aW9uUHJveHkgewotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBRTmFtZUFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihib29sZWFuIGNyZWF0ZUlmTnVsbCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YVR5cGVNYXBwaW5nLnRoaXMuZ2V0WG1sVHlwZUFubm90YXRpb24oKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFYbWxKYXZhVHlwZUFkYXB0ZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFYbWxKYXZhVHlwZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJjOGJiOS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhWG1sSmF2YVR5cGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhWG1sSmF2YVR5cGVBZGFwdGVyCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhQ29udGV4dE5vZGUKLQkJaW1wbGVtZW50cyBYbWxKYXZhVHlwZUFkYXB0ZXIgewotCQotCXByb3RlY3RlZCBmaW5hbCBYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGFubm90YXRpb247Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZTsKLQkKLQlwcm90ZWN0ZWQgWG1sQWRhcHRlciB4bWxBZGFwdGVyOwotCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkVHlwZTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRUeXBlOwotCQotCQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFYbWxKYXZhVHlwZUFkYXB0ZXIoSmF4YkNvbnRleHROb2RlIHBhcmVudCwgWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuYW5ub3RhdGlvbiA9IGFubm90YXRpb247Ci0JCXRoaXMudmFsdWUgPSBnZXRSZXNvdXJjZVZhbHVlKCk7Ci0JCWluaXRpYWxpemVYbWxBZGFwdGVyKCk7Ci0JCXRoaXMuc3BlY2lmaWVkVHlwZSA9IGdldFJlc291cmNlVHlwZVN0cmluZygpOwotCQl0aGlzLmRlZmF1bHRUeXBlID0gYnVpbGREZWZhdWx0VHlwZSgpOwotCX0KLQkKLQkKLQlwdWJsaWMgWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXNldFZhbHVlXyhnZXRSZXNvdXJjZVZhbHVlKCkpOwotCQlzeW5jWG1sQWRhcHRlcigpOwotCQlzZXRTcGVjaWZpZWRUeXBlXyhnZXRSZXNvdXJjZVR5cGVTdHJpbmcoKSk7Ci0JCXNldERlZmF1bHRUeXBlKGJ1aWxkRGVmYXVsdFR5cGUoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXVwZGF0ZVhtbEFkYXB0ZXIoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsdWUgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuYW5ub3RhdGlvbi5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCXRoaXMuc2V0VmFsdWVfKHZhbHVlKTsJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZVZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uLmdldFZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFZhbHVlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHhtbEFkYXB0ZXIgKioqKioKLQkKLQlwdWJsaWMgWG1sQWRhcHRlciBnZXRYbWxBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy54bWxBZGFwdGVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxBZGFwdGVyXyhYbWxBZGFwdGVyIHhtbEFkYXB0ZXIpIHsKLQkJWG1sQWRhcHRlciBvbGQgPSB0aGlzLnhtbEFkYXB0ZXI7Ci0JCXRoaXMueG1sQWRhcHRlciA9IHhtbEFkYXB0ZXI7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoWE1MX0FEQVBURVJfUFJPUEVSVFksIG9sZCwgeG1sQWRhcHRlcik7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VUeXBlIGdldFhtbEFkYXB0ZXJSZXNvdXJjZVR5cGUoKSB7Ci0JCVN0cmluZyB4bWxBZGFwdGVyTmFtZSA9IGdldEZ1bGx5UXVhbGlmaWVkVmFsdWUoKTsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKYXhiUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoeG1sQWRhcHRlck5hbWUsIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZS5LaW5kLlRZUEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sQWRhcHRlciBidWlsZFhtbEFkYXB0ZXIoSmF2YVJlc291cmNlVHlwZSB4bWxBZGFwdGVyUmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxBZGFwdGVyKHRoaXMsIHhtbEFkYXB0ZXJSZXNvdXJjZVR5cGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplWG1sQWRhcHRlcigpIHsKLQkJSmF2YVJlc291cmNlVHlwZSB4bWxBZGFwdGVyUmVzb3VyY2VUeXBlID0gZ2V0WG1sQWRhcHRlclJlc291cmNlVHlwZSgpOwotCQlpZiAoeG1sQWRhcHRlclJlc291cmNlVHlwZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbEFkYXB0ZXIgPSBidWlsZFhtbEFkYXB0ZXIoeG1sQWRhcHRlclJlc291cmNlVHlwZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1htbEFkYXB0ZXIoKSB7Ci0JCWlmICh0aGlzLnhtbEFkYXB0ZXIgIT0gbnVsbCkgewotCQkJdGhpcy54bWxBZGFwdGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVYbWxBZGFwdGVyKCkgewotCQlKYXZhUmVzb3VyY2VUeXBlIG5ld1Jlc291cmNlVHlwZSA9IGdldFhtbEFkYXB0ZXJSZXNvdXJjZVR5cGUoKTsKLQkJaWYgKG5ld1Jlc291cmNlVHlwZSA9PSBudWxsKSB7Ci0JCQlzZXRYbWxBZGFwdGVyXyhudWxsKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmICh0aGlzLnhtbEFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCXNldFhtbEFkYXB0ZXJfKGJ1aWxkWG1sQWRhcHRlcihuZXdSZXNvdXJjZVR5cGUpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUphdmFSZXNvdXJjZVR5cGUgY3VycmVudFJlc291cmNlVHlwZSA9IHRoaXMueG1sQWRhcHRlci5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQkJaWYgKGN1cnJlbnRSZXNvdXJjZVR5cGUgPT0gbnVsbCB8fCAhIGN1cnJlbnRSZXNvdXJjZVR5cGUuZXF1YWxzKG5ld1Jlc291cmNlVHlwZSkpIHsKLQkJCQkJc2V0WG1sQWRhcHRlcl8oYnVpbGRYbWxBZGFwdGVyKG5ld1Jlc291cmNlVHlwZSkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGhpcy54bWxBZGFwdGVyLnVwZGF0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkKLQkvLyAqKioqKiB0eXBlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUeXBlTm90U2V0KCkgPyB0aGlzLmdldERlZmF1bHRUeXBlKCkgOiB0aGlzLmdldFNwZWNpZmllZFR5cGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlci5ERUZBVUxUCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3BlY2lmaWVkVHlwZU5vdFNldCgpIHsKLQkJcmV0dXJuIGdldFNwZWNpZmllZFR5cGUoKSA9PSBudWxsIHx8IHRoaXMuYW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFR5cGUoKS5lcXVhbHMoREVGQVVMVF9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFR5cGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRUeXBlKFN0cmluZyBkZWZhdWx0VHlwZSkgewotCQlTdHJpbmcgb2xkRGVmYXVsdFR5cGUgPSB0aGlzLmRlZmF1bHRUeXBlOwotCQl0aGlzLmRlZmF1bHRUeXBlID0gZGVmYXVsdFR5cGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9UWVBFX1BST1BFUlRZLCBvbGREZWZhdWx0VHlwZSwgZGVmYXVsdFR5cGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGJ1aWxkRGVmYXVsdFR5cGUoKTsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFR5cGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFR5cGUoU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCXRoaXMuYW5ub3RhdGlvbi5zZXRUeXBlKGxvY2F0aW9uKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRUeXBlXyhsb2NhdGlvbik7CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRUeXBlXyhTdHJpbmcgdHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRUeXBlOwotCQl0aGlzLnNwZWNpZmllZFR5cGUgPSB0eXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1RZUEVfUFJPUEVSVFksIG9sZCwgdHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VUeXBlU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uLmdldFR5cGUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFR5cGUoKSB7Ci0JCXJldHVybiBzcGVjaWZpZWRUeXBlTm90U2V0KCkgPyBnZXREZWZhdWx0VHlwZSgpIDogdGhpcy5hbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFYbWxOYW1lZE5vZGVNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhWG1sTmFtZWROb2RlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2M1MWFkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFYbWxOYW1lZE5vZGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBdHRhY2htZW50UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxJRDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sSURSRUY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbE5hbWVkTm9kZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpheGJCYXNpY1NjaGVtYUNvbXBvbmVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxJREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbElEUkVGQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhWG1sTmFtZWROb2RlTWFwcGluZzxBIGV4dGVuZHMgSmF4YkJhc2ljU2NoZW1hQ29tcG9uZW50QW5ub3RhdGlvbj4KLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFYbWxOb2RlTWFwcGluZzxBPgotCQlpbXBsZW1lbnRzIFhtbE5hbWVkTm9kZU1hcHBpbmcgewotCQotCXByb3RlY3RlZCBYbWxJRCB4bWxJRDsKLQkKLQlwcm90ZWN0ZWQgWG1sSURSRUYgeG1sSURSRUY7Ci0JCi0JcHJvdGVjdGVkIFhtbEF0dGFjaG1lbnRSZWYgeG1sQXR0YWNobWVudFJlZjsKLQkKLQkKLQlwdWJsaWMgQWJzdHJhY3RKYXZhWG1sTmFtZWROb2RlTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJaW5pdGlhbGl6ZVhtbElEKCk7Ci0JCWluaXRpYWxpemVYbWxJRFJFRigpOwotCQlpbml0aWFsaXplWG1sQXR0YWNobWVudFJlZigpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzeW5jL3VwZGF0ZSAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc3luY1htbElEKCk7Ci0JCXN5bmNYbWxJRFJFRigpOwotCQlzeW5jWG1sQXR0YWNobWVudFJlZigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl1cGRhdGVYbWxJRCgpOwotCQl1cGRhdGVYbWxJRFJFRigpOwotCQl1cGRhdGVYbWxBdHRhY2htZW50UmVmKCk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbElEICoqKioqCi0JCi0JcHVibGljIFhtbElEIGdldFhtbElEKCkgewotCQlyZXR1cm4gdGhpcy54bWxJRDsKLQl9Ci0JCi0JcHVibGljIFhtbElEIGFkZFhtbElEKCkgewotCQlpZiAodGhpcy54bWxJRCAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJWG1sSURBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoWG1sSURBbm5vdGF0aW9uKSB0aGlzLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oSkFYQi5YTUxfSUQpOwotCQkKLQkJWG1sSUQgeG1sSUQgPSB0aGlzLmJ1aWxkWG1sSUQoYW5ub3RhdGlvbik7Ci0JCXRoaXMuc2V0WG1sSURfKHhtbElEKTsKLQkJcmV0dXJuIHhtbElEOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sSUQgYnVpbGRYbWxJRChYbWxJREFubm90YXRpb24geG1sSURBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxJRCh0aGlzLCB4bWxJREFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxJRCgpIHsKLQkJaWYgKHRoaXMueG1sSUQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9JRCk7Ci0JCXRoaXMuc2V0WG1sSURfKG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplWG1sSUQoKSB7Ci0JCVhtbElEQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRYbWxJREFubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJdGhpcy54bWxJRCA9IHRoaXMuYnVpbGRYbWxJRChhbm5vdGF0aW9uKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sSURBbm5vdGF0aW9uIGdldFhtbElEQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxJREFubm90YXRpb24pIHRoaXMuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JRCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNYbWxJRCgpIHsKLQkJWG1sSURBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldFhtbElEQW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5nZXRYbWxJRCgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmdldFhtbElEKCkuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5zZXRYbWxJRF8odGhpcy5idWlsZFhtbElEKGFubm90YXRpb24pKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuc2V0WG1sSURfKG51bGwpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVhtbElEKCkgewotCQlpZiAodGhpcy5nZXRYbWxJRCgpICE9IG51bGwpIHsKLQkJCXRoaXMuZ2V0WG1sSUQoKS51cGRhdGUoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxJRF8oWG1sSUQgeG1sSUQpIHsKLQkJWG1sSUQgb2xkWG1sSUQgPSB0aGlzLnhtbElEOwotCQl0aGlzLnhtbElEID0geG1sSUQ7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoWE1MX0lEX1BST1BFUlRZLCBvbGRYbWxJRCwgeG1sSUQpOwotCX0KLQkKLQkKLQkvLyoqKioqKioqKioqKiAgWG1sSURSRUYgKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFhtbElEUkVGIGdldFhtbElEUkVGKCkgewotCQlyZXR1cm4gdGhpcy54bWxJRFJFRjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sSURSRUZfKFhtbElEUkVGIHhtbElEUkVGKSB7Ci0JCVhtbElEUkVGIG9sZFhtbElEUkVGID0gdGhpcy54bWxJRFJFRjsKLQkJdGhpcy54bWxJRFJFRiA9IHhtbElEUkVGOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9JRFJFRl9QUk9QRVJUWSwgb2xkWG1sSURSRUYsIHhtbElEUkVGKTsKLQl9Ci0JCi0JcHVibGljIFhtbElEUkVGIGFkZFhtbElEUkVGKCkgewotCQlpZiAodGhpcy54bWxJRFJFRiAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJCi0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oSkFYQi5YTUxfSURSRUYpOwotCQkKLQkJWG1sSURSRUYgeG1sSURSRUYgPSBidWlsZFhtbElEUkVGKCk7Ci0JCXNldFhtbElEUkVGXyh4bWxJRFJFRik7Ci0JCXJldHVybiB4bWxJRFJFRjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sSURSRUYoKSB7Ci0JCWlmICh0aGlzLnhtbElEUkVGID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX0lEUkVGKTsKLQkJc2V0WG1sSURSRUZfKG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplWG1sSURSRUYoKSB7Ci0JCWlmIChnZXRYbWxJRFJFRkFubm90YXRpb24oKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbElEUkVGID0gYnVpbGRYbWxJRFJFRigpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNYbWxJRFJFRigpIHsKLQkJaWYgKGdldFhtbElEUkVGQW5ub3RhdGlvbigpID09IG51bGwpIHsKLQkJCXNldFhtbElEUkVGXyhudWxsKTsKLQkJfQotCQllbHNlIGlmICh0aGlzLnhtbElEUkVGID09IG51bGwpIHsKLQkJCXNldFhtbElEUkVGXyhidWlsZFhtbElEUkVGKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy54bWxJRFJFRi5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlWG1sSURSRUYoKSB7Ci0JCWlmICh0aGlzLnhtbElEUkVGICE9IG51bGwpIHsKLQkJCXRoaXMueG1sSURSRUYudXBkYXRlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbElEUkVGQW5ub3RhdGlvbiBnZXRYbWxJRFJFRkFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sSURSRUZBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEUkVGKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbElEUkVGIGJ1aWxkWG1sSURSRUYoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxJRFJFRih0aGlzLCBidWlsZFhtbElEUkVGQ29udGV4dCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IEdlbmVyaWNKYXZhWG1sSURSRUYuQ29udGV4dCBidWlsZFhtbElEUkVGQ29udGV4dCgpOwotCQotCQotCS8vKioqKioqKioqKioqICBYbWxBdHRhY2htZW50UmVmICoqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBYbWxBdHRhY2htZW50UmVmIGdldFhtbEF0dGFjaG1lbnRSZWYoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEF0dGFjaG1lbnRSZWY7Ci0JfQotCQotCXB1YmxpYyBYbWxBdHRhY2htZW50UmVmIGFkZFhtbEF0dGFjaG1lbnRSZWYoKSB7Ci0JCWlmICh0aGlzLnhtbEF0dGFjaG1lbnRSZWYgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCVhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoWG1sQXR0YWNobWVudFJlZkFubm90YXRpb24pIHRoaXMuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCQotCQlYbWxBdHRhY2htZW50UmVmIHhtbEF0dGFjaG1lbnRSZWYgPSB0aGlzLmJ1aWxkWG1sQXR0YWNobWVudFJlZihhbm5vdGF0aW9uKTsKLQkJdGhpcy5zZXRYbWxBdHRhY2htZW50UmVmXyh4bWxBdHRhY2htZW50UmVmKTsKLQkJcmV0dXJuIHhtbEF0dGFjaG1lbnRSZWY7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxBdHRhY2htZW50UmVmIGJ1aWxkWG1sQXR0YWNobWVudFJlZihYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiB4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sQXR0YWNobWVudFJlZih0aGlzLCB4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbEF0dGFjaG1lbnRSZWYoKSB7Ci0JCWlmICh0aGlzLnhtbEF0dGFjaG1lbnRSZWYgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCXRoaXMuc2V0WG1sQXR0YWNobWVudFJlZl8obnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVYbWxBdHRhY2htZW50UmVmKCkgewotCQlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbEF0dGFjaG1lbnRSZWYgPSB0aGlzLmJ1aWxkWG1sQXR0YWNobWVudFJlZihhbm5vdGF0aW9uKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sQXR0YWNobWVudFJlZkFubm90YXRpb24gZ2V0WG1sQXR0YWNobWVudFJlZkFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sQXR0YWNobWVudFJlZkFubm90YXRpb24pIHRoaXMuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNYbWxBdHRhY2htZW50UmVmKCkgewotCQlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5nZXRYbWxBdHRhY2htZW50UmVmKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0WG1sQXR0YWNobWVudFJlZigpLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMuc2V0WG1sQXR0YWNobWVudFJlZl8odGhpcy5idWlsZFhtbEF0dGFjaG1lbnRSZWYoYW5ub3RhdGlvbikpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zZXRYbWxBdHRhY2htZW50UmVmXyhudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVYbWxBdHRhY2htZW50UmVmKCkgewotCQlpZiAodGhpcy5nZXRYbWxBdHRhY2htZW50UmVmKCkgIT0gbnVsbCkgewotCQkJdGhpcy5nZXRYbWxBdHRhY2htZW50UmVmKCkudXBkYXRlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sQXR0YWNobWVudFJlZl8oWG1sQXR0YWNobWVudFJlZiB4bWxBdHRhY2htZW50UmVmKSB7Ci0JCVhtbEF0dGFjaG1lbnRSZWYgb2xkWG1sQXR0YWNobWVudFJlZiA9IHRoaXMueG1sQXR0YWNobWVudFJlZjsKLQkJdGhpcy54bWxBdHRhY2htZW50UmVmID0geG1sQXR0YWNobWVudFJlZjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChYTUxfQVRUQUNITUVOVF9SRUZfUFJPUEVSVFksIG9sZFhtbEF0dGFjaG1lbnRSZWYsIHhtbEF0dGFjaG1lbnRSZWYpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKSB7Ci0JCWlmICh0aGlzLnhtbElEUkVGICE9IG51bGwpIHsKLQkJCUpheGJDbGFzc01hcHBpbmcgcmVmZXJlbmNlTWFwcGluZyA9IGdldENvbnRleHRSb290KCkuZ2V0Q2xhc3NNYXBwaW5nKGdldFZhbHVlVHlwZU5hbWUoKSk7Ci0JCQlpZiAocmVmZXJlbmNlTWFwcGluZyAhPSBudWxsKSB7Ci0JCQkJSmF4YkF0dHJpYnV0ZU1hcHBpbmcgaWRNYXBwaW5nID0gcmVmZXJlbmNlTWFwcGluZy5nZXRYbWxJZE1hcHBpbmcoKTsKLQkJCQlpZiAoaWRNYXBwaW5nICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGlkTWFwcGluZy5nZXRWYWx1ZVR5cGVOYW1lKCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIFN0cmluZy5jbGFzcy5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGdldFZhbHVlVHlwZU5hbWUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCWlmICh0aGlzLnhtbElEICE9IG51bGwpIHsKLQkJCXRoaXMueG1sSUQudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCQkKLQkJaWYgKHRoaXMueG1sSURSRUYgIT0gbnVsbCkgewotCQkJdGhpcy54bWxJRFJFRi52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JCQotCQlpZiAodGhpcy54bWxBdHRhY2htZW50UmVmICE9IG51bGwpIHsKLQkJCXRoaXMueG1sQXR0YWNobWVudFJlZi52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBYbWxJRFJFRkNvbnRleHQKLQkJCWltcGxlbWVudHMgR2VuZXJpY0phdmFYbWxJRFJFRi5Db250ZXh0IHsKLQkJCi0JCXB1YmxpYyBYbWxJRFJFRkFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFYbWxOYW1lZE5vZGVNYXBwaW5nLnRoaXMuZ2V0WG1sSURSRUZBbm5vdGF0aW9uKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzTGlzdCgpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFYbWxOYW1lZE5vZGVNYXBwaW5nLnRoaXMuaXNYbWxMaXN0KCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhWG1sTm9kZU1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFYbWxOb2RlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjVmMGNhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFYbWxOb2RlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxOb2RlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTGlzdEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFZhcmlldHk7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YVhtbE5vZGVNYXBwaW5nPEEgZXh0ZW5kcyBBbm5vdGF0aW9uPgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUFkYXB0YWJsZUF0dHJpYnV0ZU1hcHBpbmc8QT4KLQkJaW1wbGVtZW50cyBYbWxOb2RlTWFwcGluZyB7Ci0JCi0JcHJvdGVjdGVkIFhtbFNjaGVtYVR5cGUgeG1sU2NoZW1hVHlwZTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcGVjaWZpZWRYbWxMaXN0OwotCQotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRYbWxMaXN0OwotCQotCQotCXB1YmxpYyBBYnN0cmFjdEphdmFYbWxOb2RlTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJaW5pdGlhbGl6ZVhtbFNjaGVtYVR5cGUoKTsKLQkJaW5pdGlhbGl6ZVhtbExpc3QoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3luYy91cGRhdGUgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXN5bmNYbWxTY2hlbWFUeXBlKCk7Ci0JCXN5bmNYbWxMaXN0KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXVwZGF0ZVhtbFNjaGVtYVR5cGUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sU2NoZW1hVHlwZSAqKioqKgotCQotCXB1YmxpYyBYbWxTY2hlbWFUeXBlIGdldFhtbFNjaGVtYVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFNjaGVtYVR5cGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFhtbFNjaGVtYVR5cGVfKFhtbFNjaGVtYVR5cGUgeG1sU2NoZW1hVHlwZSkgewotCQlYbWxTY2hlbWFUeXBlIG9sZFhtbFNjaGVtYVR5cGUgPSB0aGlzLnhtbFNjaGVtYVR5cGU7Ci0JCXRoaXMueG1sU2NoZW1hVHlwZSA9IHhtbFNjaGVtYVR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChYTUxfU0NIRU1BX1RZUEVfUFJPUEVSVFksIG9sZFhtbFNjaGVtYVR5cGUsIHhtbFNjaGVtYVR5cGUpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNYbWxTY2hlbWFUeXBlKCkgewotCQlyZXR1cm4gdGhpcy54bWxTY2hlbWFUeXBlICE9IG51bGw7Ci0JfQotCQotCXB1YmxpYyBYbWxTY2hlbWFUeXBlIGFkZFhtbFNjaGVtYVR5cGUoKSB7Ci0JCWlmICh0aGlzLnhtbFNjaGVtYVR5cGUgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHRoaXMuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbigwLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCQotCQlYbWxTY2hlbWFUeXBlIHhtbEphdmFUeXBlQWRhcHRlciA9IHRoaXMuYnVpbGRYbWxTY2hlbWFUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLnNldFhtbFNjaGVtYVR5cGVfKHhtbEphdmFUeXBlQWRhcHRlcik7Ci0JCXJldHVybiB4bWxKYXZhVHlwZUFkYXB0ZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbFNjaGVtYVR5cGUoKSB7Ci0JCWlmICh0aGlzLnhtbFNjaGVtYVR5cGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbigwLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCXRoaXMuc2V0WG1sU2NoZW1hVHlwZV8obnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxTY2hlbWFUeXBlIGJ1aWxkWG1sU2NoZW1hVHlwZShYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFBdHRyaWJ1dGVNYXBwaW5nWG1sU2NoZW1hVHlwZSh0aGlzLCBhbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIGdldFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKCkgewotCQlpZiAoZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX1NDSEVNQV9UWVBFKSA+IDApIHsKLQkJCXJldHVybiAoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplWG1sU2NoZW1hVHlwZSgpIHsKLQkJWG1sU2NoZW1hVHlwZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0WG1sU2NoZW1hVHlwZUFubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJdGhpcy54bWxTY2hlbWFUeXBlID0gdGhpcy5idWlsZFhtbFNjaGVtYVR5cGUoYW5ub3RhdGlvbik7Ci0JCX0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVYbWxTY2hlbWFUeXBlKCkgewotCQlpZiAodGhpcy54bWxTY2hlbWFUeXBlICE9IG51bGwpIHsKLQkJCXRoaXMueG1sU2NoZW1hVHlwZS51cGRhdGUoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sU2NoZW1hVHlwZSgpIHsKLQkJWG1sU2NoZW1hVHlwZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0WG1sU2NoZW1hVHlwZUFubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZ2V0WG1sU2NoZW1hVHlwZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmdldFhtbFNjaGVtYVR5cGUoKS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLnNldFhtbFNjaGVtYVR5cGVfKHRoaXMuYnVpbGRYbWxTY2hlbWFUeXBlKGFubm90YXRpb24pKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuc2V0WG1sU2NoZW1hVHlwZV8obnVsbCk7Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sTGlzdCAqKioqKgotCQotCXB1YmxpYyBib29sZWFuIGlzWG1sTGlzdCgpIHsKLQkJcmV0dXJuIGlzU3BlY2lmaWVkWG1sTGlzdCgpIHx8IGlzRGVmYXVsdFhtbExpc3QoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpZWRYbWxMaXN0KCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRYbWxMaXN0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRYbWxMaXN0KGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJaWYgKHRoaXMuc3BlY2lmaWVkWG1sTGlzdCA9PSBuZXdWYWx1ZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCQotCQlpZiAobmV3VmFsdWUpIHsKLQkJCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oSkFYQi5YTUxfTElTVCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpOwotCQl9Ci0JCQotCQlzZXRTcGVjaWZpZWRYbWxMaXN0XyhuZXdWYWx1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFhtbExpc3RfKGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJYm9vbGVhbiBvbGRWYWx1ZSA9IHRoaXMuc3BlY2lmaWVkWG1sTGlzdDsKLQkJdGhpcy5zcGVjaWZpZWRYbWxMaXN0ID0gbmV3VmFsdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1hNTF9MSVNUX1BST1BFUlRZLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRYbWxMaXN0KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0WG1sTGlzdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFhtbExpc3RfKGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJYm9vbGVhbiBvbGRWYWx1ZSA9IHRoaXMuZGVmYXVsdFhtbExpc3Q7Ci0JCXRoaXMuZGVmYXVsdFhtbExpc3QgPSBuZXdWYWx1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1hNTF9MSVNUX1BST1BFUlRZLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplWG1sTGlzdCgpIHsKLQkJdGhpcy5zcGVjaWZpZWRYbWxMaXN0ID0gZ2V0WG1sTGlzdEFubm90YXRpb24oKSAhPSBudWxsOwotCQl0aGlzLmRlZmF1bHRYbWxMaXN0ID0gY2FsY3VsYXRlRGVmYXVsdFhtbExpc3QoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1htbExpc3QoKSB7Ci0JCXNldFNwZWNpZmllZFhtbExpc3RfKGdldFhtbExpc3RBbm5vdGF0aW9uKCkgIT0gbnVsbCk7Ci0JCXNldERlZmF1bHRYbWxMaXN0XyhjYWxjdWxhdGVEZWZhdWx0WG1sTGlzdCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbExpc3RBbm5vdGF0aW9uIGdldFhtbExpc3RBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbExpc3RBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0WG1sTGlzdCgpOwotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWHNkVHlwZURlZmluaXRpb24gZ2V0RGF0YVR5cGVYc2RUeXBlRGVmaW5pdGlvbigpIHsKLQkJaWYgKHRoaXMueG1sU2NoZW1hVHlwZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy54bWxTY2hlbWFUeXBlLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERhdGFUeXBlWHNkVHlwZURlZmluaXRpb24oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogY29udGVudCBhc3Npc3QgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlpZiAodGhpcy54bWxTY2hlbWFUeXBlICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHRoaXMueG1sU2NoZW1hVHlwZS5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlpZiAodGhpcy54bWxTY2hlbWFUeXBlICE9IG51bGwpIHsKLQkJCXRoaXMueG1sU2NoZW1hVHlwZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JCQotCQlpZiAoaXNYbWxMaXN0KCkpIHsKLQkJCXZhbGlkYXRlWG1sTGlzdChtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlWG1sTGlzdChMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAoISBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNKYXZhUmVzb3VyY2VBdHRyaWJ1dGVDb2xsZWN0aW9uVHlwZSgpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0xJU1RfX0FUVFJJQlVURV9OT1RfQ09MTEVDVElPTl9UWVBFLAotCQkJCQl0aGlzLAotCQkJCQlnZXRYbWxMaXN0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JCWVsc2UgewotCQkJWHNkVHlwZURlZmluaXRpb24geHNkVHlwZSA9IGdldERhdGFUeXBlWHNkVHlwZURlZmluaXRpb24oKTsKLQkJCWlmICh4c2RUeXBlICE9IG51bGwKLQkJCQkJJiYgKHhzZFR5cGUuZ2V0S2luZCgpICE9IFhzZFR5cGVEZWZpbml0aW9uLktpbmQuU0lNUExFCi0JCQkJCQkJfHwgKChYc2RTaW1wbGVUeXBlRGVmaW5pdGlvbikgeHNkVHlwZSkuZ2V0WFNEQ29tcG9uZW50KCkuZ2V0VmFyaWV0eSgpID09IFhTRFZhcmlldHkuTElTVF9MSVRFUkFMKSkgewotCQkJCQotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9MSVNUX19JVEVNX1RZUEVfTk9UX01BUFBFRF9UT19WQUxJRF9TQ0hFTUFfVFlQRSwKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgZ2V0VmFsdWVUeXBlTmFtZSgpIH0sCi0JCQkJCQkJCXRoaXMsCi0JCQkJCQkJCWdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFhtbExpc3RWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVhtbExpc3RBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxMaXN0QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpIDogYW5ub3RhdGlvbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0ZpZWxkQWNjZXNzb3IuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9GaWVsZEFjY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNTE4MzQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0ZpZWxkQWNjZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkFjY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgRmllbGRBY2Nlc3NvcgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgQWNjZXNzb3IgewotCQotCXByb3RlY3RlZCBmaW5hbCBKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkOwotCQotCQotCXB1YmxpYyBGaWVsZEFjY2Vzc29yKEpheGJDbGFzc01hcHBpbmcgcGFyZW50LCBKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucmVzb3VyY2VGaWVsZCA9IHJlc291cmNlRmllbGQ7Ci0JfQotCQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZXNvdXJjZUZpZWxkKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlQmFzZVR5cGVOYW1lKCkgewotCQlyZXR1cm4gQWNjZXNzb3JUb29scy5nZXRCYXNlVHlwZU5hbWUodGhpcy5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzSmF2YVJlc291cmNlQXR0cmlidXRlQ29sbGVjdGlvblR5cGUoKSB7Ci0JCXJldHVybiBBY2Nlc3NvclRvb2xzLmlzQ29sbGVjdGlvblR5cGUoZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0phdmFSZXNvdXJjZUF0dHJpYnV0ZVR5cGVTdWJUeXBlT2YoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLnR5cGVJc1N1YlR5cGVPZih0eXBlTmFtZSk7Ci0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZUZpZWxkIGdldFJlc291cmNlRmllbGQoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlRmllbGQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUZpZWxkID09IHJlc291cmNlRmllbGQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSmF2YVJlc291cmNlTWV0aG9kIGdldHRlck1ldGhvZCwgSmF2YVJlc291cmNlTWV0aG9kIHNldHRlck1ldGhvZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXR0cmlidXRlTWFwcGluZ1htbFNjaGVtYVR5cGUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUF0dHJpYnV0ZU1hcHBpbmdYbWxTY2hlbWFUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOThmZmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXR0cmlidXRlTWFwcGluZ1htbFNjaGVtYVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUF0dHJpYnV0ZU1hcHBpbmdYbWxTY2hlbWFUeXBlCi0JCWV4dGVuZHMgR2VuZXJpY0phdmFYbWxTY2hlbWFUeXBlIHsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFBdHRyaWJ1dGVNYXBwaW5nWG1sU2NoZW1hVHlwZShKYXhiQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIHhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sU2NoZW1hVHlwZUFubm90YXRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF4YkF0dHJpYnV0ZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXhiQXR0cmlidXRlTWFwcGluZyBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBKYXhiQ2xhc3NNYXBwaW5nIGdldEpheGJDbGFzc01hcHBpbmcoKSB7Ci0JCXJldHVybiBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0Q2xhc3NNYXBwaW5nKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpheGJQYWNrYWdlIGdldEpheGJQYWNrYWdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXhiQ2xhc3NNYXBwaW5nKCkuZ2V0SmF4YlR5cGUoKS5nZXRKYXhiUGFja2FnZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCVN0cmluZyBmcVR5cGUgPSBnZXRGdWxseVF1YWxpZmllZFR5cGUoKTsKLQkJaWYgKGZxVHlwZSAhPSBudWxsICYmICEgWG1sU2NoZW1hVHlwZUFubm90YXRpb24uREVGQVVMVF9UWVBFLmVxdWFscyhmcVR5cGUpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfU0NIRU1BX1RZUEVfX1RZUEVfU1BFQ0lGSUVEX09OX0FUVFJJQlVURSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCWdldFR5cGVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUF0dHJpYnV0ZVhtbEphdmFUeXBlQWRhcHRlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXR0cmlidXRlWG1sSmF2YVR5cGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMWRkN2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXR0cmlidXRlWG1sSmF2YVR5cGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFBdHRyaWJ1dGVYbWxKYXZhVHlwZUFkYXB0ZXIKLQlleHRlbmRzIEFic3RyYWN0SmF2YVhtbEphdmFUeXBlQWRhcHRlcgotewotCi0JcHVibGljIEdlbmVyaWNKYXZhQXR0cmlidXRlWG1sSmF2YVR5cGVBZGFwdGVyKEpheGJBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiByZXNvdXJjZSkgewotCQlzdXBlcihwYXJlbnQsIHJlc291cmNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEpheGJBdHRyaWJ1dGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGdldFBhcmVudCgpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHR5cGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlQmFzZVR5cGVOYW1lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJaWYgKGdldFR5cGUoKSA9PSBudWxsIHx8IGdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpLmVxdWFscyhYbWxKYXZhVHlwZUFkYXB0ZXIuREVGQVVMVF9UWVBFKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLkFUVFJJQlVURV9NQVBQSU5HX1hNTF9KQVZBX1RZUEVfQURBUFRFUl9UWVBFX05PVF9ERUZJTkVELAotCQkJCQl0aGlzLAotCQkJCQlnZXRBbm5vdGF0aW9uKCkuZ2V0VHlwZVRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXR0cmlidXRlc0NvbnRhaW5lci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXR0cmlidXRlc0NvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDk3MGFkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUF0dHJpYnV0ZXNDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJBdHRyaWJ1dGVzQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFBdHRyaWJ1dGVzQ29udGFpbmVyCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhQ29udGV4dE5vZGUKLQkJaW1wbGVtZW50cyBKYXhiQXR0cmlidXRlc0NvbnRhaW5lciB7Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlVHlwZSBqYXZhUmVzb3VyY2VUeXBlOwotCi0JcHJvdGVjdGVkIE93bmVyIG93bmVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIFZlY3RvcjxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IG5ldyBWZWN0b3I8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFBdHRyaWJ1dGVzQ29udGFpbmVyKEpheGJDbGFzc01hcHBpbmcgcGFyZW50LCBPd25lciBvd25lciwgSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5qYXZhUmVzb3VyY2VUeXBlID0gcmVzb3VyY2VUeXBlOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCXRoaXMuaW5pdGlhbGl6ZUF0dHJpYnV0ZXMoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpheGJDbGFzc01hcHBpbmcgZ2V0SmF4YkNsYXNzTWFwcGluZygpIHsKLQkJcmV0dXJuIChKYXhiQ2xhc3NNYXBwaW5nKSBnZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSmF2YVJlc291cmNlVHlwZSBqYXZhUmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiB0aGlzLmphdmFSZXNvdXJjZVR5cGUgPT0gamF2YVJlc291cmNlVHlwZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zeW5jaHJvbml6ZU5vZGVzV2l0aFJlc291cmNlTW9kZWwodGhpcy5nZXRBdHRyaWJ1dGVzKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlQXR0cmlidXRlcygpOwotCX0KLQotCS8vICoqKioqKioqKiogYWNjZXNzIHR5cGUgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc1R5cGUgZ2V0QWNjZXNzVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0QWNjZXNzVHlwZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhdHRyaWJ1dGVzICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4odGhpcy5hdHRyaWJ1dGVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJpYnV0ZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzLnNpemUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGUoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZSkpIHsKLQkJCXRoaXMub3duZXIuZmlyZUF0dHJpYnV0ZUFkZGVkKGF0dHJpYnV0ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBdHRyaWJ1dGUoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZXMucmVtb3ZlKGF0dHJpYnV0ZSkpIHsKLQkJCXRoaXMub3duZXIuZmlyZUF0dHJpYnV0ZVJlbW92ZWQoYXR0cmlidXRlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZEZpZWxkKEphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQpIHsKLQkJcmV0dXJuIGdldEZhY3RvcnkoKS5idWlsZEphdmFQZXJzaXN0ZW50RmllbGQoZ2V0SmF4YkNsYXNzTWFwcGluZygpLCByZXNvdXJjZUZpZWxkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRQcm9wZXJ0eShKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VHZXR0ZXIsIEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZVNldHRlcikgewotCQlyZXR1cm4gZ2V0RmFjdG9yeSgpLmJ1aWxkSmF2YVBlcnNpc3RlbnRQcm9wZXJ0eShnZXRKYXhiQ2xhc3NNYXBwaW5nKCksIHJlc291cmNlR2V0dGVyLCByZXNvdXJjZVNldHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChnZXRKYXhiQ2xhc3NNYXBwaW5nKCkuaXNYbWxUcmFuc2llbnQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChnZXRBY2Nlc3NUeXBlKCkgPT0gWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSKSB7Ci0JCQl0aGlzLmluaXRpYWxpemVQdWJsaWNNZW1iZXJBY2Nlc3NBdHRyaWJ1dGVzKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0QWNjZXNzVHlwZSgpID09IFhtbEFjY2Vzc1R5cGUuRklFTEQpIHsKLQkJCXRoaXMuaW50aWFsaXplRmllbGRBY2Nlc3NBdHRyaWJ1dGVzKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0QWNjZXNzVHlwZSgpID09IFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkpIHsKLQkJCXRoaXMuaW50aWFsaXplUHJvcGVydHlBY2Nlc3NBdHRyaWJ1dGVzKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0QWNjZXNzVHlwZSgpID09IFhtbEFjY2Vzc1R5cGUuTk9ORSkgewotCQkJdGhpcy5pbnRpYWxpemVOb25lQWNjZXNzQXR0cmlidXRlcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgYXR0cmlidXRlcyBmb3IgWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSCi0JICogMS4gYWxsIHB1YmxpYywgbm9uLXN0YXRpYywgbm9uLXRyYW5zaWVudCBmaWVsZHMgKHRyYW5zaWVudCBtb2RpZmllciwgQFhtbFRyYW5zaWVudCBpcyBicm91Z2h0IHRvIHRoZSBjb250ZXh0IG1vZGVsKQotCSAqIDIuIGFsbCBhbm5vdGF0ZWQgZmllbGRzIHRoYXQgYXJlbid0IHB1YmxpYwotCSAqIDMuIGFsbCBwdWJsaWMgZ2V0dGVyL3NldHRlciBqYXZhYmVhbnMgcGFpcnMKLQkgKiA0LiBhbGwgYW5ub3RhdGVkIG1ldGhvZHMgKHNvbWUgd2lsbCBoYXZlIGEgbWF0Y2hpbmcgZ2V0dGVyL3NldHRlciwgc29tZSB3aWxsIGJlIHN0YW5kYWxvbmUpCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVQdWJsaWNNZW1iZXJBY2Nlc3NBdHRyaWJ1dGVzKCkgewotCQl0aGlzLmluaXRpYWxpemVGaWVsZEF0dHJpYnV0ZXMoUFVCTElDX01FTUJFUl9BQ0NFU1NfVFlQRV9SRVNPVVJDRV9GSUVMRFNfRklMVEVSKTsKLQkJQ29sbGVjdGlvbjxKYXZhUmVzb3VyY2VNZXRob2Q+IHJlc291cmNlTWV0aG9kcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuZ2V0UmVzb3VyY2VNZXRob2RzKCkpOwotCQkvL2l0ZXJhdGUgdGhyb3VnaCBhbGwgcGVyc2lzdGFibGUgcmVzb3VyY2UgbWV0aG9kIGdldHRlcnMKLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgZ2V0dGVyTWV0aG9kIDogdGhpcy5nZXRSZXNvdXJjZU1ldGhvZHModGhpcy5idWlsZFBlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXJNZXRob2RzRmlsdGVyKCkpKSB7Ci0JCQlKYXZhUmVzb3VyY2VNZXRob2Qgc2V0dGVyTWV0aG9kID0gZ2V0VmFsaWRTaWJsaW5nU2V0TWV0aG9kKGdldHRlck1ldGhvZCwgcmVzb3VyY2VNZXRob2RzKTsKLQkJCWlmIChtZXRob2RzQXJlUGVyc2lzdGFibGVQdWJsaWNNZW1iZXJBY2Nlc3MoZ2V0dGVyTWV0aG9kLCBzZXR0ZXJNZXRob2QpKSB7Ci0JCQkJdGhpcy5hdHRyaWJ1dGVzLmFkZCh0aGlzLmJ1aWxkUHJvcGVydHkoZ2V0dGVyTWV0aG9kLCBzZXR0ZXJNZXRob2QpKTsKLQkJCX0KLQkJCXJlc291cmNlTWV0aG9kcy5yZW1vdmUoZ2V0dGVyTWV0aG9kKTsKLQkJCXJlc291cmNlTWV0aG9kcy5yZW1vdmUoc2V0dGVyTWV0aG9kKTsKLQkJfQotCQl0aGlzLmluaXRpYWxpemVSZW1haW5pbmdSZXNvdXJjZU1ldGhvZEF0dHJpYnV0ZXMocmVzb3VyY2VNZXRob2RzKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBhdHRyaWJ1dGVzIGZvciBYbWxBY2Nlc3NUeXBlLkZJRUxECi0JICogMS4gYWxsIG5vbi10cmFuc2llbnQgZmllbGRzCi0JICogMi4gYWxsIGFubm90YXRlZCBtZXRob2RzIGdldHRlcnMvc2V0dGVycwotCSAqLwotCXByaXZhdGUgdm9pZCBpbnRpYWxpemVGaWVsZEFjY2Vzc0F0dHJpYnV0ZXMoKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUZpZWxkQXR0cmlidXRlcyh0aGlzLmJ1aWxkTm9uVHJhbnNpZW50Tm9uU3RhdGljUmVzb3VyY2VGaWVsZHNGaWx0ZXIoKSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUFubm90YXRlZFByb3BlcnR5QXR0cmlidXRlcygpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGF0dHJpYnV0ZXMgZm9yIFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkKLQkgKiAxLiBhbGwgZ2V0dGVyL3NldHRlciBqYXZhYmVhbnMgcGFpcnMKLQkgKiAyLiBhbGwgYW5ub3RhdGVkIGZpZWxkcwotCSAqIDMuIGFsbCBhbm5vdGF0ZWQgbWV0aG9kcyBnZXR0ZXJzL3NldHRlcnMgdGhhdCBkb24ndCBoYXZlIGEgbWF0Y2hpbmcgcGFpcgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnRpYWxpemVQcm9wZXJ0eUFjY2Vzc0F0dHJpYnV0ZXMoKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUZpZWxkQXR0cmlidXRlcyhBTk5PVEFURURfUkVTT1VSQ0VfRklFTERTX0ZJTFRFUik7Ci0KLQkJQ29sbGVjdGlvbjxKYXZhUmVzb3VyY2VNZXRob2Q+IHJlc291cmNlTWV0aG9kcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuZ2V0UmVzb3VyY2VNZXRob2RzKCkpOwotCQkvL2l0ZXJhdGUgdGhyb3VnaCBhbGwgcmVzb3VyY2UgbWV0aG9kcyBzZWFyY2hpbmcgZm9yIHBlcnNpc3RhYmxlIGdldHRlcnMKLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgZ2V0dGVyTWV0aG9kIDogdGhpcy5nZXRSZXNvdXJjZU1ldGhvZHModGhpcy5idWlsZFBlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXJNZXRob2RzRmlsdGVyKCkpKSB7Ci0JCQlKYXZhUmVzb3VyY2VNZXRob2Qgc2V0dGVyTWV0aG9kID0gZ2V0VmFsaWRTaWJsaW5nU2V0TWV0aG9kKGdldHRlck1ldGhvZCwgcmVzb3VyY2VNZXRob2RzKTsKLQkJCWlmIChtZXRob2RzQXJlUGVyc2lzdGFibGVQcm9wZXJ0aWVzKGdldHRlck1ldGhvZCwgc2V0dGVyTWV0aG9kKSkgewotCQkJCXRoaXMuYXR0cmlidXRlcy5hZGQodGhpcy5idWlsZFByb3BlcnR5KGdldHRlck1ldGhvZCwgc2V0dGVyTWV0aG9kKSk7Ci0JCQl9Ci0JCQlyZXNvdXJjZU1ldGhvZHMucmVtb3ZlKGdldHRlck1ldGhvZCk7Ci0JCQlyZXNvdXJjZU1ldGhvZHMucmVtb3ZlKHNldHRlck1ldGhvZCk7Ci0JCX0KLQkJdGhpcy5pbml0aWFsaXplUmVtYWluaW5nUmVzb3VyY2VNZXRob2RBdHRyaWJ1dGVzKHJlc291cmNlTWV0aG9kcyk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgYXR0cmlidXRlcyBmb3IgWG1sQWNjZXNzVHlwZS5OT05FCi0JICogMS4gYWxsIGFubm90YXRlZCBmaWVsZHMKLQkgKiAyLiBhbGwgYW5ub3RhdGVkIG1ldGhvZHMgZ2V0dGVycy9zZXR0ZXJzIChzb21lIHdpbGwgaGF2ZSBhIG1hdGNoaW5nIGdldHRlci9zZXR0ZXIsIHNvbWUgd2lsbCBiZSBzdGFuZGFsb25lKQotCSAqLwotCXByaXZhdGUgdm9pZCBpbnRpYWxpemVOb25lQWNjZXNzQXR0cmlidXRlcygpIHsKLQkJdGhpcy5pbml0aWFsaXplRmllbGRBdHRyaWJ1dGVzKEFOTk9UQVRFRF9SRVNPVVJDRV9GSUVMRFNfRklMVEVSKTsKLQkJdGhpcy5pbml0aWFsaXplQW5ub3RhdGVkUHJvcGVydHlBdHRyaWJ1dGVzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVGaWVsZEF0dHJpYnV0ZXMoRmlsdGVyPEphdmFSZXNvdXJjZUZpZWxkPiBmaWx0ZXIpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkIDogdGhpcy5nZXRSZXNvdXJjZUZpZWxkcyhmaWx0ZXIpKSB7Ci0JCQl0aGlzLmF0dHJpYnV0ZXMuYWRkKHRoaXMuYnVpbGRGaWVsZChyZXNvdXJjZUZpZWxkKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVJlbWFpbmluZ1Jlc291cmNlTWV0aG9kQXR0cmlidXRlcyhDb2xsZWN0aW9uPEphdmFSZXNvdXJjZU1ldGhvZD4gcmVzb3VyY2VNZXRob2RzKSB7Ci0JCS8vaXRlcmF0ZSB0aHJvdWdoIHJlbWFpbmluZyByZXNvdXJjZSBtZXRob2RzIGFuZCBzZWFyY2ggZm9yIHRob3NlIHRoYXQgYXJlIGFubm90YXRlZC4KLQkJLy9hbGwgZ2V0dGVyIG1ldGhvZHMgd2lsbCBhbHJlYWR5IGJlIHVzZWQuCi0JCWZvciAoSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kIDogcmVzb3VyY2VNZXRob2RzKSB7Ci0JCQlpZiAocmVzb3VyY2VNZXRob2QuaXNBbm5vdGF0ZWQoKSkgewotCQkJCS8vYW5ub3RhdGVkIHNldHRlcihvciBvdGhlciByYW5kb20gbWV0aG9kKSB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgZ2V0dGVyLCBicmluZyBpbnRvIGNvbnRleHQgbW9kZWwgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMKLQkJCQl0aGlzLmF0dHJpYnV0ZXMuYWRkKHRoaXMuYnVpbGRQcm9wZXJ0eShudWxsLCByZXNvdXJjZU1ldGhvZCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtZXRob2RzQXJlUGVyc2lzdGFibGVQcm9wZXJ0aWVzKEphdmFSZXNvdXJjZU1ldGhvZCBnZXR0ZXJNZXRob2QsIEphdmFSZXNvdXJjZU1ldGhvZCBzZXR0ZXJNZXRob2QpIHsKLQkJaWYgKHNldHRlck1ldGhvZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvL0xpc3RzIGRvIG5vdCBoYXZlIHRvIGhhdmUgYSBjb3JyZXNwb25kaW5nIHNldHRlciBtZXRob2QKLQkJZWxzZSBpZiAoZ2V0dGVyTWV0aG9kLmdldFR5cGVOYW1lKCkuZXF1YWxzKCJqYXZhLnV0aWwuTGlzdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKGdldHRlck1ldGhvZC5pc0Fubm90YXRlZCgpKSB7Ci0JCQkvL2Fubm90YXRlZCBnZXR0ZXIgd2l0aCBubyBjb3JyZXNwb25kaW5nIHNldHRlciwgYnJpbmcgaW50byBjb250ZXh0IG1vZGVsIGZvciB2YWxpZGF0aW9uIHB1cnBvc2VzCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtZXRob2RzQXJlUGVyc2lzdGFibGVQdWJsaWNNZW1iZXJBY2Nlc3MoSmF2YVJlc291cmNlTWV0aG9kIGdldHRlck1ldGhvZCwgSmF2YVJlc291cmNlTWV0aG9kIHNldHRlck1ldGhvZCkgewotCQlpZiAoZ2V0dGVyTWV0aG9kLmlzUHVibGljKCkpIHsKLQkJCWlmIChzZXR0ZXJNZXRob2QgIT0gbnVsbCkgewotCQkJCWlmIChzZXR0ZXJNZXRob2QuaXNQdWJsaWMoKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkvL0xpc3RzIGRvIG5vdCBoYXZlIHRvIGhhdmUgYSBjb3JyZXNwb25kaW5nIHNldHRlciBtZXRob2QKLQkJCWVsc2UgaWYgKGdldHRlck1ldGhvZC5nZXRUeXBlTmFtZSgpLmVxdWFscygiamF2YS51dGlsLkxpc3QiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChnZXR0ZXJNZXRob2QuaXNBbm5vdGF0ZWQoKSkgewotCQkJCS8vYW5ub3RhdGVkIGdldHRlciB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgc2V0dGVyLCBicmluZyBpbnRvIGNvbnRleHQgbW9kZWwgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChnZXR0ZXJNZXRob2QuaXNBbm5vdGF0ZWQoKSB8fCAoc2V0dGVyTWV0aG9kICE9IG51bGwgJiYgc2V0dGVyTWV0aG9kLmlzQW5ub3RhdGVkKCkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVBbm5vdGF0ZWRQcm9wZXJ0eUF0dHJpYnV0ZXMoKSB7Ci0JCUNvbGxlY3Rpb248SmF2YVJlc291cmNlTWV0aG9kPiByZXNvdXJjZU1ldGhvZHMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmdldFJlc291cmNlTWV0aG9kcygpKTsKLQkJLy9pdGVyYXRlIHRocm91Z2ggYWxsIHJlc291cmNlIG1ldGhvZHMgc2VhcmNoaW5nIGZvciBwZXJzaXN0YWJsZSBnZXR0ZXJzCi0JCWZvciAoSmF2YVJlc291cmNlTWV0aG9kIGdldHRlck1ldGhvZCA6IHRoaXMuZ2V0UmVzb3VyY2VNZXRob2RzKGJ1aWxkUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlck1ldGhvZHNGaWx0ZXIoKSkpIHsKLQkJCUphdmFSZXNvdXJjZU1ldGhvZCBzZXR0ZXJNZXRob2QgPSBnZXRWYWxpZFNpYmxpbmdTZXRNZXRob2QoZ2V0dGVyTWV0aG9kLCByZXNvdXJjZU1ldGhvZHMpOwotCQkJaWYgKGdldHRlck1ldGhvZC5pc0Fubm90YXRlZCgpIHx8IChzZXR0ZXJNZXRob2QgIT0gbnVsbCAmJiBzZXR0ZXJNZXRob2QuaXNBbm5vdGF0ZWQoKSkpIHsKLQkJCQl0aGlzLmF0dHJpYnV0ZXMuYWRkKHRoaXMuYnVpbGRQcm9wZXJ0eShnZXR0ZXJNZXRob2QsIHNldHRlck1ldGhvZCkpOwotCQkJfQotCQkJcmVzb3VyY2VNZXRob2RzLnJlbW92ZShnZXR0ZXJNZXRob2QpOwotCQkJcmVzb3VyY2VNZXRob2RzLnJlbW92ZShzZXR0ZXJNZXRob2QpOwotCQl9Ci0JCXRoaXMuaW5pdGlhbGl6ZVJlbWFpbmluZ1Jlc291cmNlTWV0aG9kQXR0cmlidXRlcyhyZXNvdXJjZU1ldGhvZHMpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VGaWVsZD4gZ2V0UmVzb3VyY2VGaWVsZHMoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFSZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZU1ldGhvZD4gZ2V0UmVzb3VyY2VNZXRob2RzKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhUmVzb3VyY2VUeXBlLmdldE1ldGhvZHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlRmllbGQ+IGdldFJlc291cmNlRmllbGRzKEZpbHRlcjxKYXZhUmVzb3VyY2VGaWVsZD4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8SmF2YVJlc291cmNlRmllbGQ+KGdldFJlc291cmNlRmllbGRzKCksIGZpbHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZU1ldGhvZD4gZ2V0UmVzb3VyY2VNZXRob2RzKEZpbHRlcjxKYXZhUmVzb3VyY2VNZXRob2Q+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEphdmFSZXNvdXJjZU1ldGhvZD4oZ2V0UmVzb3VyY2VNZXRob2RzKCksIGZpbHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbHRlcjxKYXZhUmVzb3VyY2VGaWVsZD4gYnVpbGROb25UcmFuc2llbnROb25TdGF0aWNSZXNvdXJjZUZpZWxkc0ZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXI8SmF2YVJlc291cmNlRmllbGQ+KCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQpIHsKLQkJCQlyZXR1cm4gbWVtYmVySXNOb25UcmFuc2llbnROb25TdGF0aWMocmVzb3VyY2VGaWVsZCkgfHwgcmVzb3VyY2VGaWVsZC5pc0Fubm90YXRlZCgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgRmlsdGVyPEphdmFSZXNvdXJjZUZpZWxkPiBQVUJMSUNfTUVNQkVSX0FDQ0VTU19UWVBFX1JFU09VUkNFX0ZJRUxEU19GSUxURVIgPSBuZXcgRmlsdGVyPEphdmFSZXNvdXJjZUZpZWxkPigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQpIHsKLQkJCXJldHVybiBtZW1iZXJJc1B1YmxpY05vblRyYW5zaWVudE5vblN0YXRpYyhyZXNvdXJjZUZpZWxkKSB8fCByZXNvdXJjZUZpZWxkLmlzQW5ub3RhdGVkKCk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIEZpbHRlcjxKYXZhUmVzb3VyY2VNZXRob2Q+IGJ1aWxkUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlck1ldGhvZHNGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyPEphdmFSZXNvdXJjZU1ldGhvZD4oKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kKSB7Ci0JCQkJcmV0dXJuIG1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihyZXNvdXJjZU1ldGhvZCwgZ2V0UmVzb3VyY2VNZXRob2RzKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBtZW1iZXJJc1B1YmxpY05vblRyYW5zaWVudE5vblN0YXRpYyhKYXZhUmVzb3VyY2VNZW1iZXIgcmVzb3VyY2VNZW1iZXIpIHsKLQkJcmV0dXJuIHJlc291cmNlTWVtYmVyLmlzUHVibGljKCkgJiYgbWVtYmVySXNOb25UcmFuc2llbnROb25TdGF0aWMocmVzb3VyY2VNZW1iZXIpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBtZW1iZXJJc05vblRyYW5zaWVudE5vblN0YXRpYyhKYXZhUmVzb3VyY2VNZW1iZXIgcmVzb3VyY2VNZW1iZXIpIHsKLQkJcmV0dXJuICFyZXNvdXJjZU1lbWJlci5pc1RyYW5zaWVudCgpICYmICFyZXNvdXJjZU1lbWJlci5pc1N0YXRpYygpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgRmlsdGVyPEphdmFSZXNvdXJjZUZpZWxkPiBBTk5PVEFURURfUkVTT1VSQ0VfRklFTERTX0ZJTFRFUiA9IAotCQluZXcgRmlsdGVyPEphdmFSZXNvdXJjZUZpZWxkPigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkKSB7Ci0JCQkJcmV0dXJuIHJlc291cmNlRmllbGQuaXNBbm5vdGF0ZWQoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIFRoZSBhdHRyaWJ1dGVzIGFyZSBzeW5jaHJvbml6ZWQgZHVyaW5nIHRoZSA8ZW0+dXBkYXRlPC9lbT4gYmVjYXVzZQotCSAqIHRoZSBsaXN0IG9mIHJlc291cmNlIGF0dHJpYnV0ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWNjZXNzIHR5cGUKLQkgKiB3aGljaCBjYW4gYmUgY29udHJvbGxlZCBpbiBhIG51bWJlciBvZiBkaWZmZXJlbnQgcGxhY2VzLi4uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChnZXRKYXhiQ2xhc3NNYXBwaW5nKCkuaXNYbWxUcmFuc2llbnQoKSkgewotCQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlIDogZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQkJdGhpcy5yZW1vdmVBdHRyaWJ1dGUoY29udGV4dEF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGdldEFjY2Vzc1R5cGUoKSA9PSBYbWxBY2Nlc3NUeXBlLlBVQkxJQ19NRU1CRVIpIHsKLQkJCXRoaXMuc3luY1B1YmxpY01lbWJlckFjY2Vzc0F0dHJpYnV0ZXMoKTsKLQkJfQotCQllbHNlIGlmIChnZXRBY2Nlc3NUeXBlKCkgPT0gWG1sQWNjZXNzVHlwZS5GSUVMRCkgewotCQkJdGhpcy5zeW5jRmllbGRBY2Nlc3NBdHRyaWJ1dGVzKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0QWNjZXNzVHlwZSgpID09IFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkpIHsKLQkJCXRoaXMuc3luY1Byb3BlcnR5QWNjZXNzQXR0cmlidXRlcygpOwotCQl9Ci0JCWVsc2UgaWYgKGdldEFjY2Vzc1R5cGUoKSA9PSBYbWxBY2Nlc3NUeXBlLk5PTkUpIHsKLQkJCXRoaXMuc3luY05vbmVBY2Nlc3NBdHRyaWJ1dGVzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTeW5jIHRoZSBhdHRyaWJ1dGVzIGZvciBYbWxBY2Nlc3NUeXBlLlBVQkxJQ19NRU1CRVIKLQkgKiAxLiBhbGwgcHVibGljLCBub24tc3RhdGljLCBub24tdHJhbnNpZW50IGZpZWxkcyAodHJhbnNpZW50IG1vZGlmaWVyLCBAWG1sVHJhbnNpZW50IGlzIGJyb3VnaHQgdG8gdGhlIGNvbnRleHQgbW9kZWwpCi0JICogMi4gYWxsIGFubm90YXRlZCBmaWVsZHMgdGhhdCBhcmVuJ3QgcHVibGljCi0JICogMy4gYWxsIHB1YmxpYyBnZXR0ZXIvc2V0dGVyIGphdmFiZWFucyBwYWlycwotCSAqIDQuIGFsbCBhbm5vdGF0ZWQgbWV0aG9kcyAoc29tZSB3aWxsIGhhdmUgYSBtYXRjaGluZyBnZXR0ZXIvc2V0dGVyLCBzb21lIHdpbGwgYmUgc3RhbmRhbG9uZSkKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3luY1B1YmxpY01lbWJlckFjY2Vzc0F0dHJpYnV0ZXMoKSB7Ci0JCUhhc2hTZXQ8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGNvbnRleHRBdHRyaWJ1dGVzID0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmdldEF0dHJpYnV0ZXMoKSk7Ci0KLQkJdGhpcy5zeW5jRmllbGRBdHRyaWJ1dGVzKGNvbnRleHRBdHRyaWJ1dGVzLCBQVUJMSUNfTUVNQkVSX0FDQ0VTU19UWVBFX1JFU09VUkNFX0ZJRUxEU19GSUxURVIpOwotCi0JCUNvbGxlY3Rpb248SmF2YVJlc291cmNlTWV0aG9kPiByZXNvdXJjZU1ldGhvZHMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmdldFJlc291cmNlTWV0aG9kcygpKTsKLQkJLy9pdGVyYXRlIHRocm91Z2ggYWxsIHBlcnNpc3RhYmxlIHJlc291cmNlIG1ldGhvZCBnZXR0ZXJzCi0JCWZvciAoSmF2YVJlc291cmNlTWV0aG9kIGdldHRlck1ldGhvZCA6IHRoaXMuZ2V0UmVzb3VyY2VNZXRob2RzKHRoaXMuYnVpbGRQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyTWV0aG9kc0ZpbHRlcigpKSkgewotCQkJSmF2YVJlc291cmNlTWV0aG9kIHNldHRlck1ldGhvZCA9IGdldFZhbGlkU2libGluZ1NldE1ldGhvZChnZXR0ZXJNZXRob2QsIHJlc291cmNlTWV0aG9kcyk7Ci0JCQlpZiAobWV0aG9kc0FyZVBlcnNpc3RhYmxlUHVibGljTWVtYmVyQWNjZXNzKGdldHRlck1ldGhvZCwgc2V0dGVyTWV0aG9kKSkgewotCQkJCWJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLQkJCQlmb3IgKEl0ZXJhdG9yPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSBjb250ZXh0QXR0cmlidXRlcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gc3RyZWFtLm5leHQoKTsKLQkJCQkJaWYgKGNvbnRleHRBdHRyaWJ1dGUuaXNGb3IoZ2V0dGVyTWV0aG9kLCBzZXR0ZXJNZXRob2QpKSB7Ci0JCQkJCQltYXRjaCA9IHRydWU7Ci0JCQkJCQljb250ZXh0QXR0cmlidXRlLnVwZGF0ZSgpOwotCQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFtYXRjaCkgewotCQkJCQl0aGlzLmFkZEF0dHJpYnV0ZSh0aGlzLmJ1aWxkUHJvcGVydHkoZ2V0dGVyTWV0aG9kLCBzZXR0ZXJNZXRob2QpKTsKLQkJCQl9Ci0JCQkJcmVzb3VyY2VNZXRob2RzLnJlbW92ZShnZXR0ZXJNZXRob2QpOwotCQkJCXJlc291cmNlTWV0aG9kcy5yZW1vdmUoc2V0dGVyTWV0aG9kKTsKLQkJCX0KLQkJfQotCQl0aGlzLnN5bmNSZW1haW5pbmdSZXNvdXJjZU1ldGhvZHMoY29udGV4dEF0dHJpYnV0ZXMsIHJlc291cmNlTWV0aG9kcyk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgYXR0cmlidXRlcyBmb3IgWG1sQWNjZXNzVHlwZS5GSUVMRAotCSAqIDEuIGFsbCBub24tdHJhbnNpZW50IGZpZWxkcwotCSAqIDIuIGFsbCBhbm5vdGF0ZWQgbWV0aG9kcyBnZXR0ZXJzL3NldHRlcnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3luY0ZpZWxkQWNjZXNzQXR0cmlidXRlcygpIHsKLQkJSGFzaFNldDxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gY29udGV4dEF0dHJpYnV0ZXMgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuZ2V0QXR0cmlidXRlcygpKTsKLQotCQl0aGlzLnN5bmNGaWVsZEF0dHJpYnV0ZXMoY29udGV4dEF0dHJpYnV0ZXMsIHRoaXMuYnVpbGROb25UcmFuc2llbnROb25TdGF0aWNSZXNvdXJjZUZpZWxkc0ZpbHRlcigpKTsKLQkJdGhpcy5zeW5jQW5ub3RhdGVkUHJvcGVydHlBdHRyaWJ1dGVzKGNvbnRleHRBdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBhdHRyaWJ1dGVzIGZvciBYbWxBY2Nlc3NUeXBlLlBST1BFUlRZCi0JICogMS4gYWxsIGdldHRlci9zZXR0ZXIgamF2YWJlYW5zIHBhaXJzCi0JICogMi4gYWxsIGFubm90YXRlZCBmaWVsZHMKLQkgKiAzLiBhbGwgYW5ub3RhdGVkIG1ldGhvZHMgZ2V0dGVycy9zZXR0ZXJzIHRoYXQgZG9uJ3QgaGF2ZSBhIG1hdGNoaW5nIHBhaXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3luY1Byb3BlcnR5QWNjZXNzQXR0cmlidXRlcygpIHsKLQkJSGFzaFNldDxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gY29udGV4dEF0dHJpYnV0ZXMgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuZ2V0QXR0cmlidXRlcygpKTsKLQotCQl0aGlzLnN5bmNGaWVsZEF0dHJpYnV0ZXMoY29udGV4dEF0dHJpYnV0ZXMsIEFOTk9UQVRFRF9SRVNPVVJDRV9GSUVMRFNfRklMVEVSKTsKLQotCQlDb2xsZWN0aW9uPEphdmFSZXNvdXJjZU1ldGhvZD4gcmVzb3VyY2VNZXRob2RzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5nZXRSZXNvdXJjZU1ldGhvZHMoKSk7Ci0JCS8vaXRlcmF0ZSB0aHJvdWdoIGFsbCByZXNvdXJjZSBtZXRob2RzIHNlYXJjaGluZyBmb3IgcGVyc2lzdGFibGUgZ2V0dGVycwotCQlmb3IgKEphdmFSZXNvdXJjZU1ldGhvZCBnZXR0ZXJNZXRob2QgOiB0aGlzLmdldFJlc291cmNlTWV0aG9kcyh0aGlzLmJ1aWxkUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlck1ldGhvZHNGaWx0ZXIoKSkpIHsKLQkJCUphdmFSZXNvdXJjZU1ldGhvZCBzZXR0ZXJNZXRob2QgPSBnZXRWYWxpZFNpYmxpbmdTZXRNZXRob2QoZ2V0dGVyTWV0aG9kLCByZXNvdXJjZU1ldGhvZHMpOwotCQkJaWYgKG1ldGhvZHNBcmVQZXJzaXN0YWJsZVByb3BlcnRpZXMoZ2V0dGVyTWV0aG9kLCBzZXR0ZXJNZXRob2QpKSB7Ci0JCQkJYm9vbGVhbiBtYXRjaCA9IGZhbHNlOwotCQkJCWZvciAoSXRlcmF0b3I8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IGNvbnRleHRBdHRyaWJ1dGVzLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJCQlpZiAoY29udGV4dEF0dHJpYnV0ZS5pc0ZvcihnZXR0ZXJNZXRob2QsIHNldHRlck1ldGhvZCkpIHsKLQkJCQkJCW1hdGNoID0gdHJ1ZTsKLQkJCQkJCWNvbnRleHRBdHRyaWJ1dGUudXBkYXRlKCk7Ci0JCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIW1hdGNoKSB7Ci0JCQkJCXRoaXMuYWRkQXR0cmlidXRlKHRoaXMuYnVpbGRQcm9wZXJ0eShnZXR0ZXJNZXRob2QsIHNldHRlck1ldGhvZCkpOwotCQkJCX0KLQkJCX0KLQkJCXJlc291cmNlTWV0aG9kcy5yZW1vdmUoZ2V0dGVyTWV0aG9kKTsKLQkJCXJlc291cmNlTWV0aG9kcy5yZW1vdmUoc2V0dGVyTWV0aG9kKTsKLQkJfQotCQl0aGlzLnN5bmNSZW1haW5pbmdSZXNvdXJjZU1ldGhvZHMoY29udGV4dEF0dHJpYnV0ZXMsIHJlc291cmNlTWV0aG9kcyk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgYXR0cmlidXRlcyBmb3IgWG1sQWNjZXNzVHlwZS5OT05FCi0JICogMS4gYWxsIGFubm90YXRlZCBmaWVsZHMKLQkgKiAyLiBhbGwgYW5ub3RhdGVkIG1ldGhvZHMgZ2V0dGVycy9zZXR0ZXJzIChzb21lIHdpbGwgaGF2ZSBhIG1hdGNoaW5nIGdldHRlci9zZXR0ZXIsIHNvbWUgd2lsbCBiZSBzdGFuZGFsb25lKQotCSAqLwotCXByaXZhdGUgdm9pZCBzeW5jTm9uZUFjY2Vzc0F0dHJpYnV0ZXMoKSB7Ci0JCUhhc2hTZXQ8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGNvbnRleHRBdHRyaWJ1dGVzID0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmdldEF0dHJpYnV0ZXMoKSk7Ci0KLQkJdGhpcy5zeW5jRmllbGRBdHRyaWJ1dGVzKGNvbnRleHRBdHRyaWJ1dGVzLCBBTk5PVEFURURfUkVTT1VSQ0VfRklFTERTX0ZJTFRFUik7Ci0JCXRoaXMuc3luY0Fubm90YXRlZFByb3BlcnR5QXR0cmlidXRlcyhjb250ZXh0QXR0cmlidXRlcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNBbm5vdGF0ZWRQcm9wZXJ0eUF0dHJpYnV0ZXMoSGFzaFNldDxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gY29udGV4dEF0dHJpYnV0ZXMpIHsKLQkJQ29sbGVjdGlvbjxKYXZhUmVzb3VyY2VNZXRob2Q+IHJlc291cmNlTWV0aG9kcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuZ2V0UmVzb3VyY2VNZXRob2RzKCkpOwotCQkvL2l0ZXJhdGUgdGhyb3VnaCBhbGwgcmVzb3VyY2UgbWV0aG9kcyBzZWFyY2hpbmcgZm9yIHBlcnNpc3RhYmxlIGdldHRlcnMKLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgZ2V0dGVyTWV0aG9kIDogdGhpcy5nZXRSZXNvdXJjZU1ldGhvZHMoYnVpbGRQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyTWV0aG9kc0ZpbHRlcigpKSkgewotCQkJSmF2YVJlc291cmNlTWV0aG9kIHNldHRlck1ldGhvZCA9IGdldFZhbGlkU2libGluZ1NldE1ldGhvZChnZXR0ZXJNZXRob2QsIHJlc291cmNlTWV0aG9kcyk7Ci0JCQlpZiAoZ2V0dGVyTWV0aG9kLmlzQW5ub3RhdGVkKCkgfHwgKHNldHRlck1ldGhvZCAhPSBudWxsICYmIHNldHRlck1ldGhvZC5pc0Fubm90YXRlZCgpKSkgewotCQkJCWJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLQkJCQlmb3IgKEl0ZXJhdG9yPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSBjb250ZXh0QXR0cmlidXRlcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gc3RyZWFtLm5leHQoKTsKLQkJCQkJaWYgKGNvbnRleHRBdHRyaWJ1dGUuaXNGb3IoZ2V0dGVyTWV0aG9kLCBzZXR0ZXJNZXRob2QpKSB7Ci0JCQkJCQltYXRjaCA9IHRydWU7Ci0JCQkJCQljb250ZXh0QXR0cmlidXRlLnVwZGF0ZSgpOwotCQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFtYXRjaCkgewotCQkJCQl0aGlzLmFkZEF0dHJpYnV0ZSh0aGlzLmJ1aWxkUHJvcGVydHkoZ2V0dGVyTWV0aG9kLCBzZXR0ZXJNZXRob2QpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXNvdXJjZU1ldGhvZHMucmVtb3ZlKGdldHRlck1ldGhvZCk7Ci0JCQlyZXNvdXJjZU1ldGhvZHMucmVtb3ZlKHNldHRlck1ldGhvZCk7Ci0JCX0KLQkJdGhpcy5zeW5jUmVtYWluaW5nUmVzb3VyY2VNZXRob2RzKGNvbnRleHRBdHRyaWJ1dGVzLCByZXNvdXJjZU1ldGhvZHMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jRmllbGRBdHRyaWJ1dGVzKEhhc2hTZXQ8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGNvbnRleHRBdHRyaWJ1dGVzLCBGaWx0ZXI8SmF2YVJlc291cmNlRmllbGQ+IGZpbHRlcikgewotCQlmb3IgKEphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgOiB0aGlzLmdldFJlc291cmNlRmllbGRzKGZpbHRlcikpIHsKLQkJCWJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLQkJCWZvciAoSXRlcmF0b3I8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IGNvbnRleHRBdHRyaWJ1dGVzLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJCWlmIChjb250ZXh0QXR0cmlidXRlLmlzRm9yKHJlc291cmNlRmllbGQpKSB7Ci0JCQkJCW1hdGNoID0gdHJ1ZTsKLQkJCQkJY29udGV4dEF0dHJpYnV0ZS51cGRhdGUoKTsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIW1hdGNoKSB7Ci0JCQkJLy8gYWRkZWQgZWxlbWVudHMgYXJlIHN5bmMnZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiBvciB3aWxsIGJlCi0JCQkJLy8gdXBkYXRlZCBkdXJpbmcgdGhlIG5leHQgInVwZGF0ZSIgKHdoaWNoIGlzIHRyaWdnZXJlZCBieQotCQkJCS8vIHRoZWlyIGFkZGl0aW9uIHRvIHRoZSBtb2RlbCkKLQkJCQl0aGlzLmFkZEF0dHJpYnV0ZSh0aGlzLmJ1aWxkRmllbGQocmVzb3VyY2VGaWVsZCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNSZW1haW5pbmdSZXNvdXJjZU1ldGhvZHMoSGFzaFNldDxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gY29udGV4dEF0dHJpYnV0ZXMsIENvbGxlY3Rpb248SmF2YVJlc291cmNlTWV0aG9kPiByZXNvdXJjZU1ldGhvZHMpIHsKLQkJLy9pdGVyYXRlIHRocm91Z2ggcmVtYWluaW5nIHJlc291cmNlIG1ldGhvZHMgYW5kIHNlYXJjaCBmb3IgdGhvc2UgdGhhdCBhcmUgYW5ub3RhdGVkLgotCQkvL2FsbCBnZXR0ZXIgbWV0aG9kcyB3aWxsIGFscmVhZHkgYmUgdXNlZC4KLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgOiByZXNvdXJjZU1ldGhvZHMpIHsKLQkJCWlmIChyZXNvdXJjZU1ldGhvZC5pc0Fubm90YXRlZCgpKSB7Ci0JCQkJYm9vbGVhbiBtYXRjaCA9IGZhbHNlOwotCQkJCS8vYW5ub3RhdGVkIHNldHRlcihvciBvdGhlciByYW5kb20gbWV0aG9kKSB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgZ2V0dGVyLCBicmluZyBpbnRvIGNvbnRleHQgbW9kZWwgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMKLQkJCQlmb3IgKEl0ZXJhdG9yPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSBjb250ZXh0QXR0cmlidXRlcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gc3RyZWFtLm5leHQoKTsKLQkJCQkJaWYgKGNvbnRleHRBdHRyaWJ1dGUuaXNGb3IobnVsbCwgcmVzb3VyY2VNZXRob2QpKSB7Ci0JCQkJCQltYXRjaCA9IHRydWU7Ci0JCQkJCQljb250ZXh0QXR0cmlidXRlLnVwZGF0ZSgpOwotCQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFtYXRjaCkgewotCQkJCQl0aGlzLmFkZEF0dHJpYnV0ZSh0aGlzLmJ1aWxkUHJvcGVydHkobnVsbCwgcmVzb3VyY2VNZXRob2QpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyByZW1vdmUgYW55IGxlZnRvdmVyIGNvbnRleHQgYXR0cmlidXRlcwotCQlmb3IgKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgOiBjb250ZXh0QXR0cmlidXRlcykgewotCQkJdGhpcy5yZW1vdmVBdHRyaWJ1dGUoY29udGV4dEF0dHJpYnV0ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIG1ldGhvZCBpcyBhICJnZXR0ZXIiIG1ldGhvZCB0aGF0Ci0JICogcmVwcmVzZW50cyBhIHByb3BlcnR5IHRoYXQgbWF5IGJlICJwZXJzaXN0ZWQiLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBtZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIoSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kLCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VNZXRob2Q+IGFsbE1ldGhvZHMpIHsKLQkJaWYgKG1ldGhvZEhhc0ludmFsaWRNb2RpZmllcnMocmVzb3VyY2VNZXRob2QpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHJlc291cmNlTWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIHJldHVyblR5cGVOYW1lID0gcmVzb3VyY2VNZXRob2QuZ2V0VHlwZU5hbWUoKTsKLQkJaWYgKHJldHVyblR5cGVOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIERPTSBtZXRob2QgYmluZGluZ3MgY2FuIGhhdmUgYSBudWxsIG5hbWUKLQkJfQotCQlpZiAocmV0dXJuVHlwZU5hbWUuZXF1YWxzKCJ2b2lkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChtZXRob2RIYXNQYXJhbWV0ZXJzKHJlc291cmNlTWV0aG9kKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJYm9vbGVhbiBib29sZWFuR2V0dGVyID0gbWV0aG9kSXNCb29sZWFuR2V0dGVyKHJlc291cmNlTWV0aG9kKTsKLQotCQkvLyBpZiB0aGUgdHlwZSBoYXMgYm90aCBtZXRob2RzOgotCQkvLyAgICAgYm9vbGVhbiBpc1Byb3BlcnR5KCkKLQkJLy8gICAgIGJvb2xlYW4gZ2V0UHJvcGVydHkoKQotCQkvLyB0aGVuICNpc1Byb3BlcnR5KCkgdGFrZXMgcHJlY2VkZW5jZSBhbmQgd2UgaWdub3JlICNnZXRQcm9wZXJ0eSgpOwotCQkvLyBidXQgb25seSBoYXZpbmcgI2dldFByb3BlcnR5KCkgaXMgT0sgdG9vCi0JCS8vIChzZWUgdGhlIEphdmFCZWFucyBzcGVjIDEuMDEpCi0JCWlmIChib29sZWFuR2V0dGVyICYmIG1ldGhvZEhhc1ZhbGlkU2libGluZ0lzTWV0aG9kKHJlc291cmNlTWV0aG9kLCBhbGxNZXRob2RzKSkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gc2luY2UgdGhlIHR5cGUgYWxzbyBkZWZpbmVzICNpc1Byb3BlcnR5KCksIGlnbm9yZSAjZ2V0UHJvcGVydHkoKQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWV0aG9kSXNCb29sZWFuR2V0dGVyKEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCkgewotCQlTdHJpbmcgcmV0dXJuVHlwZU5hbWUgPSByZXNvdXJjZU1ldGhvZC5nZXRUeXBlTmFtZSgpOwotCQlTdHJpbmcgbmFtZSA9IHJlc291cmNlTWV0aG9kLmdldE1ldGhvZE5hbWUoKTsKLQkJYm9vbGVhbiBib29sZWFuR2V0dGVyID0gZmFsc2U7Ci0JCWlmIChuYW1lLnN0YXJ0c1dpdGgoImlzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHJldHVyblR5cGVOYW1lLmVxdWFscygiYm9vbGVhbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCgiZ2V0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHJldHVyblR5cGVOYW1lLmVxdWFscygiYm9vbGVhbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlib29sZWFuR2V0dGVyID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gYm9vbGVhbkdldHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWV0aG9kJ3MgbW9kaWZpZXJzIHByZXZlbnQgaXQKLQkgKiBmcm9tIGJlaW5nIGEgZ2V0dGVyIG9yIHNldHRlciBmb3IgYSAicGVyc2lzdGVudCIgcHJvcGVydHkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtZXRob2RIYXNJbnZhbGlkTW9kaWZpZXJzKEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCkgewotCQlpbnQgbW9kaWZpZXJzID0gcmVzb3VyY2VNZXRob2QuZ2V0TW9kaWZpZXJzKCk7Ci0JCWlmIChNb2RpZmllci5pc1N0YXRpYyhtb2RpZmllcnMpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtZXRob2RIYXNQYXJhbWV0ZXJzKEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCkgewotCQlyZXR1cm4gcmVzb3VyY2VNZXRob2QuZ2V0UGFyYW1ldGVyc1NpemUoKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtZXRob2QgaGFzIGEgc2libGluZyAiaXMiIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZAotCSAqIHByb3BlcnR5IGFuZCB0aGF0IG1ldGhvZCBpcyB2YWxpZCBmb3IgYSAicGVyc2lzdGFibGUiIHByb3BlcnR5LgotCSAqIFByZS1jb25kaXRpb246IHRoZSBtZXRob2QgaXMgYSAiYm9vbGVhbiBnZXR0ZXIiIChlLmcuICdwdWJsaWMgYm9vbGVhbiBnZXRQcm9wZXJ0eSgpJyk7Ci0JICogdGhpcyBwcmV2ZW50cyB1cyBmcm9tIHJldHVybmluZyB0cnVlIHdoZW4gdGhlIG1ldGhvZCBpdHNlbGYgaXMgYW4KLQkgKiAiaXMiIG1ldGhvZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG1ldGhvZEhhc1ZhbGlkU2libGluZ0lzTWV0aG9kKEphdmFSZXNvdXJjZU1ldGhvZCBnZXRNZXRob2QsIEl0ZXJhYmxlPEphdmFSZXNvdXJjZU1ldGhvZD4gcmVzb3VyY2VNZXRob2RzKSB7Ci0JCVN0cmluZyBjYXBpdGFsaXplZEF0dHJpYnV0ZU5hbWUgPSBTdHJpbmdUb29scy5jYXBpdGFsaXplKGdldE1ldGhvZC5nZXROYW1lKCkpOwotCQlmb3IgKEphdmFSZXNvdXJjZU1ldGhvZCBzaWJsaW5nIDogcmVzb3VyY2VNZXRob2RzKSB7Ci0JCQlpZiAoKHNpYmxpbmcuZ2V0UGFyYW1ldGVyc1NpemUoKSA9PSAwKQotCQkJCQkmJiBzaWJsaW5nLmdldE1ldGhvZE5hbWUoKS5lcXVhbHMoImlzIiArIGNhcGl0YWxpemVkQXR0cmlidXRlTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBtZXRob2RJc1ZhbGlkU2libGluZyhzaWJsaW5nLCAiYm9vbGVhbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtZXRob2QgaGFzIGEgc2libGluZyAic2V0IiBtZXRob2QKLQkgKiBhbmQgdGhhdCBtZXRob2QgaXMgdmFsaWQgZm9yIGEgInBlcnNpc3RhYmxlIiBwcm9wZXJ0eS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBKYXZhUmVzb3VyY2VNZXRob2QgZ2V0VmFsaWRTaWJsaW5nU2V0TWV0aG9kKEphdmFSZXNvdXJjZU1ldGhvZCBnZXRNZXRob2QsIENvbGxlY3Rpb248SmF2YVJlc291cmNlTWV0aG9kPiByZXNvdXJjZU1ldGhvZHMpIHsKLQkJU3RyaW5nIGNhcGl0YWxpemVkU2V0QXR0cmlidXRlTmFtZSA9ICJzZXQiICsgU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZShnZXRNZXRob2QuZ2V0TmFtZSgpKTsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBwYXJhbWV0ZXJUeXBlRXJhc3VyZU5hbWUgPSBnZXRNZXRob2QuZ2V0VHlwZU5hbWUoKTsKLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2Qgc2libGluZyA6IHJlc291cmNlTWV0aG9kcykgewotCQkJaWYgKChzaWJsaW5nLmdldFBhcmFtZXRlcnNTaXplKCkgPT0gMSkKLQkJCQkmJiBzaWJsaW5nLmdldE1ldGhvZE5hbWUoKS5lcXVhbHMoY2FwaXRhbGl6ZWRTZXRBdHRyaWJ1dGVOYW1lKQotCQkJCSYmIHNpYmxpbmcuZ2V0UGFyYW1ldGVyVHlwZU5hbWUoMCkuZXF1YWxzKHBhcmFtZXRlclR5cGVFcmFzdXJlTmFtZSkpIHsKLQkJCQlyZXR1cm4gbWV0aG9kSXNWYWxpZFNpYmxpbmcoc2libGluZywgInZvaWQiKSA/IHNpYmxpbmcgOiBudWxsOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBtZXRob2QgaXMgYSB2YWxpZCBzaWJsaW5nIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIHJldHVybiB0eXBlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWV0aG9kSXNWYWxpZFNpYmxpbmcoSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kLCBTdHJpbmcgcmV0dXJuVHlwZU5hbWUpIHsKLQkJaWYgKHJlc291cmNlTWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAobWV0aG9kSGFzSW52YWxpZE1vZGlmaWVycyhyZXNvdXJjZU1ldGhvZCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAocmVzb3VyY2VNZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHJ0TmFtZSA9IHJlc291cmNlTWV0aG9kLmdldFR5cGVOYW1lKCk7Ci0JCWlmIChydE5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gRE9NIG1ldGhvZCBiaW5kaW5ncyBjYW4gaGF2ZSBhIG51bGwgbmFtZQotCQl9Ci0JCXJldHVybiBydE5hbWUuZXF1YWxzKHJldHVyblR5cGVOYW1lKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBnZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCWF0dHJpYnV0ZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRKYXhiQ2xhc3NNYXBwaW5nKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JCi0JaW50ZXJmYWNlIE93bmVyIHsKLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGFjY2VzcyB0eXBlIG9mIHRoZSBvd25lciwgdG8gYmUgdXNlZCBpbiBkZXRlcm1pbmluZyB3aGljaCBhdHRyaWJ1dGVzIHRvIGJ1aWxkCi0JCSAqLwotCQlYbWxBY2Nlc3NUeXBlIGdldEFjY2Vzc1R5cGUoKTsKLQotCQkvKioKLQkJICogZmlyZSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgZm9yIHRoZSBhZGRlZCBhdHRyaWJ1dGUKLQkJICovCi0JCXZvaWQgZmlyZUF0dHJpYnV0ZUFkZGVkKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSk7Ci0JCQotCQkvKioKLQkJICogZmlyZSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgZm9yIHRoZSByZW1vdmVkIGF0dHJpYnV0ZQotCQkgKi8KLQkJdm9pZCBmaXJlQXR0cmlidXRlUmVtb3ZlZChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUNsYXNzTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NDZlNGQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5DaGFpbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3ViSXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZXNDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBY2Nlc3NPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sTmFtZWROb2RlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc29yVHlwZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcub21nLkNPUkJBLlBVQkxJQ19NRU1CRVI7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmcKLQkJaW1wbGVtZW50cyBKYXhiQ2xhc3NNYXBwaW5nIHsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZEZhY3RvcnlDbGFzczsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGZhY3RvcnlNZXRob2Q7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BPcmRlckNvbnRhaW5lciBwcm9wT3JkZXJDb250YWluZXI7Ci0JCi0JcHJvdGVjdGVkIEpheGJDbGFzc01hcHBpbmcgc3VwZXJjbGFzczsKLQkKLQlwcm90ZWN0ZWQgWG1sQWNjZXNzVHlwZSBkZWZhdWx0QWNjZXNzVHlwZTsKLQlwcm90ZWN0ZWQgWG1sQWNjZXNzVHlwZSBzcGVjaWZpZWRBY2Nlc3NUeXBlOwotCQotCXByb3RlY3RlZCBYbWxBY2Nlc3NPcmRlciBkZWZhdWx0QWNjZXNzT3JkZXI7Ci0JcHJvdGVjdGVkIFhtbEFjY2Vzc09yZGVyIHNwZWNpZmllZEFjY2Vzc09yZGVyOwotCQotCXByb3RlY3RlZCBib29sZWFuIGhhc1Jvb3RFbGVtZW50SW5IaWVyYXJjaHlfbG9hZGVkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUm9vdEVsZW1lbnRJbkhpZXJhcmNoeSA9IGZhbHNlOwotCQotCXByb3RlY3RlZCBmaW5hbCBKYXhiQXR0cmlidXRlc0NvbnRhaW5lciBhdHRyaWJ1dGVzQ29udGFpbmVyOwotCQotCXByb3RlY3RlZCBmaW5hbCBNYXA8SmF4YkNsYXNzTWFwcGluZywgSmF4YkF0dHJpYnV0ZXNDb250YWluZXI+IGluY2x1ZGVkQXR0cmlidXRlc0NvbnRhaW5lcnM7Ci0JCi0JcHVibGljIEdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nKEpheGJDbGFzcyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5pbmNsdWRlZEF0dHJpYnV0ZXNDb250YWluZXJzID0gbmV3IEhhc2h0YWJsZTxKYXhiQ2xhc3NNYXBwaW5nLCBKYXhiQXR0cmlidXRlc0NvbnRhaW5lcj4oKTsKLQkJdGhpcy5wcm9wT3JkZXJDb250YWluZXIgPSBuZXcgUHJvcE9yZGVyQ29udGFpbmVyKCk7Ci0JCQotCQlpbml0RmFjdG9yeUNsYXNzKCk7Ci0JCWluaXRGYWN0b3J5TWV0aG9kKCk7Ci0JCWluaXRQcm9wT3JkZXIoKTsKLQkJaW5pdFNwZWNpZmllZEFjY2Vzc1R5cGUoKTsKLQkJaW5pdERlZmF1bHRBY2Nlc3NUeXBlKCk7Ci0JCWluaXRTcGVjaWZpZWRBY2Nlc3NPcmRlcigpOwotCQlpbml0RGVmYXVsdEFjY2Vzc09yZGVyKCk7Ci0JCXRoaXMuYXR0cmlidXRlc0NvbnRhaW5lciA9IG5ldyBHZW5lcmljSmF2YUF0dHJpYnV0ZXNDb250YWluZXIodGhpcywgYnVpbGRBdHRyaWJ1dGVzQ29udGFpbmVyT3duZXIoKSwgZ2V0SmF2YVJlc291cmNlVHlwZSgpKTsKLQkJaW5pdEluY2x1ZGVkQXR0cmlidXRlcygpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVJlc291cmNlVHlwZSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gKEphdmFSZXNvdXJjZVR5cGUpIHN1cGVyLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpheGJDbGFzcyBnZXRKYXhiVHlwZSgpIHsKLQkJcmV0dXJuIChKYXhiQ2xhc3MpIHN1cGVyLmdldEpheGJUeXBlKCk7Ci0JfQotCQotCXB1YmxpYyBKYXhiUGFja2FnZUluZm8gZ2V0UGFja2FnZUluZm8oKSB7Ci0JCUpheGJQYWNrYWdlIGpheGJQYWNrYWdlID0gZ2V0SmF4YlBhY2thZ2UoKTsKLQkJLy8gamF4YiBwYWNrYWdlIG1heSBiZSBudWxsIGR1cmluZyBpbml0aWFsaXphdGlvbi91cGRhdGUKLQkJcmV0dXJuIChqYXhiUGFja2FnZSA9PSBudWxsKSA/IG51bGwgOiBqYXhiUGFja2FnZS5nZXRQYWNrYWdlSW5mbygpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzeW5jL3VwZGF0ZSAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc3luY0ZhY3RvcnlDbGFzcygpOwotCQlzeW5jRmFjdG9yeU1ldGhvZCgpOwotCQlzeW5jUHJvcE9yZGVyKCk7Ci0JCXN5bmNTcGVjaWZpZWRBY2Nlc3NUeXBlKCk7Ci0JCXN5bmNTcGVjaWZpZWRBY2Nlc3NPcmRlcigpOwotCQl0aGlzLmF0dHJpYnV0ZXNDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlzeW5jSW5jbHVkZWRBdHRyaWJ1dGVzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXVwZGF0ZVN1cGVyY2xhc3MoKTsKLQkJdXBkYXRlRGVmYXVsdEFjY2Vzc1R5cGUoKTsKLQkJdXBkYXRlRGVmYXVsdEFjY2Vzc09yZGVyKCk7Ci0JCXRoaXMuaGFzUm9vdEVsZW1lbnRJbkhpZXJhcmNoeV9sb2FkZWQgPSBmYWxzZTsgLy8gdHJpZ2dlcnMgdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSByZWNhbGN1bGF0ZWQgb24gbmV4dCByZXF1ZXN0Ci0JCXRoaXMuYXR0cmlidXRlc0NvbnRhaW5lci51cGRhdGUoKTsKLQkJdXBkYXRlSW5jbHVkZWRBdHRyaWJ1dGVzKCk7Ci0JfQotCQotCQotCS8vICoqKioqIGZhY3RvcnkgY2xhc3MgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlDbGFzcygpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEZhY3RvcnlDbGFzcyAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkRmFjdG9yeUNsYXNzIDogSkFYQi5YTUxfVFlQRV9fREVGQVVMVF9GQUNUT1JZX0NMQVNTOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZEZhY3RvcnlDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRmFjdG9yeUNsYXNzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRGYWN0b3J5Q2xhc3MoU3RyaW5nIGZhY3RvcnlDbGFzcykgewotCQlnZXRYbWxUeXBlQW5ub3RhdGlvbigpLnNldEZhY3RvcnlDbGFzcyhmYWN0b3J5Q2xhc3MpOwotCQlzZXRTcGVjaWZpZWRGYWN0b3J5Q2xhc3NfKGZhY3RvcnlDbGFzcyk7CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRGYWN0b3J5Q2xhc3NfKFN0cmluZyBmYWN0b3J5Q2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkRmFjdG9yeUNsYXNzOwotCQl0aGlzLnNwZWNpZmllZEZhY3RvcnlDbGFzcyA9IGZhY3RvcnlDbGFzczsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfRkFDVE9SWV9DTEFTU19QUk9QRVJUWSwgb2xkLCBmYWN0b3J5Q2xhc3MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlRmFjdG9yeUNsYXNzKCkgewotCQlyZXR1cm4gZ2V0WG1sVHlwZUFubm90YXRpb24oKS5nZXRGYWN0b3J5Q2xhc3MoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEZhY3RvcnlDbGFzcygpIHsKLQkJdGhpcy5zcGVjaWZpZWRGYWN0b3J5Q2xhc3MgPSBnZXRSZXNvdXJjZUZhY3RvcnlDbGFzcygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jRmFjdG9yeUNsYXNzKCkgewotCQlzZXRTcGVjaWZpZWRGYWN0b3J5Q2xhc3NfKGdldFJlc291cmNlRmFjdG9yeUNsYXNzKCkpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBmYWN0b3J5IG1ldGhvZCAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeU1ldGhvZCgpIHsKLQkJcmV0dXJuIHRoaXMuZmFjdG9yeU1ldGhvZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RmFjdG9yeU1ldGhvZChTdHJpbmcgZmFjdG9yeU1ldGhvZCkgewotCQlnZXRYbWxUeXBlQW5ub3RhdGlvbigpLnNldEZhY3RvcnlNZXRob2QoZmFjdG9yeU1ldGhvZCk7Ci0JCXNldEZhY3RvcnlNZXRob2RfKGZhY3RvcnlNZXRob2QpOwkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RmFjdG9yeU1ldGhvZF8oU3RyaW5nIGZhY3RvcnlNZXRob2QpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZmFjdG9yeU1ldGhvZDsKLQkJdGhpcy5mYWN0b3J5TWV0aG9kID0gZmFjdG9yeU1ldGhvZDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChGQUNUT1JZX01FVEhPRF9QUk9QRVJUWSwgb2xkLCBmYWN0b3J5TWV0aG9kKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUZhY3RvcnlNZXRob2QoKSB7Ci0JCXJldHVybiBnZXRYbWxUeXBlQW5ub3RhdGlvbigpLmdldEZhY3RvcnlNZXRob2QoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEZhY3RvcnlNZXRob2QoKSB7Ci0JCXRoaXMuZmFjdG9yeU1ldGhvZCA9IGdldFJlc291cmNlRmFjdG9yeU1ldGhvZCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jRmFjdG9yeU1ldGhvZCgpIHsKLQkJc2V0RmFjdG9yeU1ldGhvZF8oZ2V0UmVzb3VyY2VGYWN0b3J5TWV0aG9kKCkpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBwcm9wIG9yZGVyICoqKioqCi0JCi0JcHVibGljIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldFByb3BPcmRlcigpIHsKLQkJcmV0dXJuIHRoaXMucHJvcE9yZGVyQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByb3AoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnByb3BPcmRlckNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0UHJvcE9yZGVyU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJvcE9yZGVyQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkUHJvcChpbnQgaW5kZXgsIFN0cmluZyBwcm9wKSB7Ci0JCWdldFhtbFR5cGVBbm5vdGF0aW9uKCkuYWRkUHJvcChpbmRleCwgcHJvcCk7Ci0JCXRoaXMucHJvcE9yZGVyQ29udGFpbmVyLmFkZENvbnRleHRFbGVtZW50KGluZGV4LCBwcm9wKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcChTdHJpbmcgcHJvcCkgewotCQl0aGlzLnJlbW92ZVByb3AodGhpcy5wcm9wT3JkZXJDb250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KHByb3ApKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcChpbnQgaW5kZXgpIHsKLQkJdGhpcy5nZXRYbWxUeXBlQW5ub3RhdGlvbigpLnJlbW92ZVByb3AoaW5kZXgpOwotCQl0aGlzLnByb3BPcmRlckNvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVQcm9wKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuZ2V0WG1sVHlwZUFubm90YXRpb24oKS5tb3ZlUHJvcCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLnByb3BPcmRlckNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFByb3BPcmRlcigpIHsKLQkJdGhpcy5wcm9wT3JkZXJDb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jUHJvcE9yZGVyKCkgewotCQl0aGlzLnByb3BPcmRlckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRSZXNvdXJjZVByb3BPcmRlcigpIHsKLQkJTGlzdEl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gZ2V0WG1sVHlwZUFubm90YXRpb24oKS5nZXRQcm9wT3JkZXIoKTsKLQkJaWYgKENvbGxlY3Rpb25Ub29scy5zaXplKHJlc3VsdCkgPT0gMSAmJiBTdHJpbmdUb29scy5FTVBUWV9TVFJJTkcuZXF1YWxzKENvbGxlY3Rpb25Ub29scy5nZXQocmVzdWx0LCAwKSkpIHsKLQkJCXJldHVybiBFbXB0eUxpc3RJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbEFjY2Vzc29yVHlwZSAqKioqKgotCQotCXB1YmxpYyBYbWxBY2Nlc3NUeXBlIGdldEFjY2Vzc1R5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRBY2Nlc3NUeXBlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRBY2Nlc3NUeXBlIDogdGhpcy5kZWZhdWx0QWNjZXNzVHlwZTsKLQl9Ci0JCi0JcHVibGljIFhtbEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdEFjY2Vzc1R5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRBY2Nlc3NUeXBlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0QWNjZXNzVHlwZV8oWG1sQWNjZXNzVHlwZSBhY2Nlc3MpIHsKLQkJWG1sQWNjZXNzVHlwZSBvbGQgPSB0aGlzLmRlZmF1bHRBY2Nlc3NUeXBlOwotCQl0aGlzLmRlZmF1bHRBY2Nlc3NUeXBlID0gYWNjZXNzOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQUNDRVNTX1RZUEVfUFJPUEVSVFksIG9sZCwgYWNjZXNzKTsKLQl9Ci0JCi0JcHVibGljIFhtbEFjY2Vzc1R5cGUgZ2V0U3BlY2lmaWVkQWNjZXNzVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQWNjZXNzVHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzVHlwZShYbWxBY2Nlc3NUeXBlIGFjY2VzcykgewotCQlnZXRYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKCkuc2V0VmFsdWUoWG1sQWNjZXNzVHlwZS50b0phdmFSZXNvdXJjZU1vZGVsKGFjY2VzcykpOwotCQlzZXRTcGVjaWZpZWRBY2Nlc3NUeXBlXyhhY2Nlc3MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3NUeXBlXyhYbWxBY2Nlc3NUeXBlIGFjY2VzcykgewotCQlYbWxBY2Nlc3NUeXBlIG9sZCA9IHRoaXMuc3BlY2lmaWVkQWNjZXNzVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWRBY2Nlc3NUeXBlID0gYWNjZXNzOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9BQ0NFU1NfVFlQRV9QUk9QRVJUWSwgb2xkLCBhY2Nlc3MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0RGVmYXVsdEFjY2Vzc1R5cGUoKSB7Ci0JCXRoaXMuZGVmYXVsdEFjY2Vzc1R5cGUgPSBidWlsZERlZmF1bHRBY2Nlc3NUeXBlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRBY2Nlc3NUeXBlKCkgewotCQlzZXREZWZhdWx0QWNjZXNzVHlwZV8oYnVpbGREZWZhdWx0QWNjZXNzVHlwZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVmYXVsdCBhY2Nlc3MgdHlwZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBmb2xsb3dpbmcsIGluIG9yZGVyIG9mIHByZWNlZGVuY2U6Ci0JICogLSBAWG1sQWNjZXNzb3JUeXBlIGFubm90YXRpb24gb24gYSBtYXBwZWQgc3VwZXIgY2xhc3MKLQkgKiAtIEBYbWxBY2Nlc3NvclR5cGUgYW5ub3RhdGlvbiBvbiB0aGUgcGFja2FnZQotCSAqIC0gZGVmYXVsdCBhY2Nlc3MgdHlwZSBvZiB7QGxpbmsgUFVCTElDX01FTUJFUn0KLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzVHlwZSBidWlsZERlZmF1bHRBY2Nlc3NUeXBlKCkgewotCQlYbWxBY2Nlc3NUeXBlIGFjY2Vzc1R5cGUgPSBnZXRTdXBlcmNsYXNzQWNjZXNzVHlwZSgpOwotCQlpZiAoYWNjZXNzVHlwZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWNjZXNzVHlwZTsKLQkJfQotCQlhY2Nlc3NUeXBlID0gZ2V0UGFja2FnZUFjY2Vzc1R5cGUoKTsKLQkJaWYgKGFjY2Vzc1R5cGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFjY2Vzc1R5cGU7Ci0JCX0KLQkJcmV0dXJuIFhtbEFjY2Vzc1R5cGUuUFVCTElDX01FTUJFUjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc1R5cGUgZ2V0U3VwZXJjbGFzc0FjY2Vzc1R5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnN1cGVyY2xhc3MgPT0gbnVsbCA/IG51bGwgOiB0aGlzLnN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkQWNjZXNzVHlwZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sQWNjZXNzVHlwZSBnZXRQYWNrYWdlQWNjZXNzVHlwZSgpIHsKLQkJSmF4YlBhY2thZ2VJbmZvIHBhY2thZ2VJbmZvID0gZ2V0UGFja2FnZUluZm8oKTsKLQkJcmV0dXJuIChwYWNrYWdlSW5mbyA9PSBudWxsKSA/IG51bGwgOiBwYWNrYWdlSW5mby5nZXRBY2Nlc3NUeXBlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uIGdldFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldE5vbk51bGxBbm5vdGF0aW9uKEpBWEIuWE1MX0FDQ0VTU09SX1RZUEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sQWNjZXNzVHlwZSBnZXRSZXNvdXJjZUFjY2Vzc1R5cGUoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbChnZXRYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRTcGVjaWZpZWRBY2Nlc3NUeXBlKCkgewotCQl0aGlzLnNwZWNpZmllZEFjY2Vzc1R5cGUgPSBnZXRSZXNvdXJjZUFjY2Vzc1R5cGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1NwZWNpZmllZEFjY2Vzc1R5cGUoKSB7Ci0JCXNldFNwZWNpZmllZEFjY2Vzc1R5cGVfKGdldFJlc291cmNlQWNjZXNzVHlwZSgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sQWNjZXNzb3JPcmRlciAqKioqKgotCQotCXB1YmxpYyBYbWxBY2Nlc3NPcmRlciBnZXRBY2Nlc3NPcmRlcigpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEFjY2Vzc09yZGVyICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRBY2Nlc3NPcmRlciA6IHRoaXMuZGVmYXVsdEFjY2Vzc09yZGVyOwotCX0KLQkKLQlwdWJsaWMgWG1sQWNjZXNzT3JkZXIgZ2V0RGVmYXVsdEFjY2Vzc09yZGVyKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0QWNjZXNzT3JkZXI7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRBY2Nlc3NPcmRlcl8oWG1sQWNjZXNzT3JkZXIgYWNjZXNzT3JkZXIpIHsKLQkJWG1sQWNjZXNzT3JkZXIgb2xkID0gdGhpcy5kZWZhdWx0QWNjZXNzT3JkZXI7Ci0JCXRoaXMuZGVmYXVsdEFjY2Vzc09yZGVyID0gYWNjZXNzT3JkZXI7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9BQ0NFU1NfT1JERVJfUFJPUEVSVFksIG9sZCwgYWNjZXNzT3JkZXIpOwotCX0KLQkKLQlwdWJsaWMgWG1sQWNjZXNzT3JkZXIgZ2V0U3BlY2lmaWVkQWNjZXNzT3JkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEFjY2Vzc09yZGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3NPcmRlcihYbWxBY2Nlc3NPcmRlciBhY2Nlc3NPcmRlcikgewotCQlnZXRYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbigpLnNldFZhbHVlKFhtbEFjY2Vzc09yZGVyLnRvSmF2YVJlc291cmNlTW9kZWwoYWNjZXNzT3JkZXIpKTsKLQkJc2V0U3BlY2lmaWVkQWNjZXNzT3JkZXJfKGFjY2Vzc09yZGVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzT3JkZXJfKFhtbEFjY2Vzc09yZGVyIGFjY2Vzc09yZGVyKSB7Ci0JCVhtbEFjY2Vzc09yZGVyIG9sZCA9IHRoaXMuc3BlY2lmaWVkQWNjZXNzT3JkZXI7Ci0JCXRoaXMuc3BlY2lmaWVkQWNjZXNzT3JkZXIgPSBhY2Nlc3NPcmRlcjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQUNDRVNTX09SREVSX1BST1BFUlRZLCBvbGQsIGFjY2Vzc09yZGVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlZmF1bHRBY2Nlc3NPcmRlcigpIHsKLQkJdGhpcy5kZWZhdWx0QWNjZXNzT3JkZXIgPSBidWlsZERlZmF1bHRBY2Nlc3NPcmRlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0QWNjZXNzT3JkZXIoKSB7Ci0JCXNldERlZmF1bHRBY2Nlc3NPcmRlcl8oYnVpbGREZWZhdWx0QWNjZXNzT3JkZXIoKSk7Ci0JfQotCQotCS8qKgotCSAqIERlZmF1bHQgYWNjZXNzIG9yZGVyIGlzIGRldGVybWluZWQgYnkgdGhlIGZvbGxvd2luZywgaW4gb3JkZXIgb2YgcHJlY2VkZW5jZToKLQkgKiAtIEBYbWxBY2Nlc3Nvck9yZGVyIGFubm90YXRpb24gb24gYSBtYXBwZWQgc3VwZXIgY2xhc3MKLQkgKiAtIEBYbWxBY2Nlc3Nvck9yZGVyIGFubm90YXRpb24gb24gdGhlIHBhY2thZ2UKLQkgKiAtIGRlZmF1bHQgYWNjZXNzIG9yZGVyIG9mIHtAbGluayBVTkRFRklORUR9Ci0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc09yZGVyIGJ1aWxkRGVmYXVsdEFjY2Vzc09yZGVyKCkgewotCQlYbWxBY2Nlc3NPcmRlciBhY2Nlc3NPcmRlciA9IGdldFN1cGVyY2xhc3NBY2Nlc3NPcmRlcigpOwotCQlpZiAoYWNjZXNzT3JkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFjY2Vzc09yZGVyOwotCQl9Ci0JCWFjY2Vzc09yZGVyID0gZ2V0UGFja2FnZUFjY2Vzc09yZGVyKCk7Ci0JCWlmIChhY2Nlc3NPcmRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWNjZXNzT3JkZXI7Ci0JCX0KLQkJcmV0dXJuIFhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc09yZGVyIGdldFN1cGVyY2xhc3NBY2Nlc3NPcmRlcigpIHsKLQkJSmF4YkNsYXNzTWFwcGluZyBzdXBlcmNsYXNzID0gdGhpcy5zdXBlcmNsYXNzOwotCQl3aGlsZSAoc3VwZXJjbGFzcyAhPSBudWxsKSB7Ci0JCQlYbWxBY2Nlc3NPcmRlciBhY2Nlc3NPcmRlciA9IHN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkQWNjZXNzT3JkZXIoKTsKLQkJCWlmIChhY2Nlc3NPcmRlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGFjY2Vzc09yZGVyOwotCQkJfQotCQkJc3VwZXJjbGFzcyA9IHN1cGVyY2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sQWNjZXNzT3JkZXIgZ2V0UGFja2FnZUFjY2Vzc09yZGVyKCkgewotCQlKYXhiUGFja2FnZUluZm8gcGFja2FnZUluZm8gPSBnZXRQYWNrYWdlSW5mbygpOwotCQlyZXR1cm4gcGFja2FnZUluZm8gPT0gbnVsbCA/IG51bGwgOiBwYWNrYWdlSW5mby5nZXRBY2Nlc3NPcmRlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24gZ2V0WG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXROb25OdWxsQW5ub3RhdGlvbihKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUik7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxBY2Nlc3NPcmRlciBnZXRSZXNvdXJjZUFjY2Vzc09yZGVyKCkgewotCQlyZXR1cm4gWG1sQWNjZXNzT3JkZXIuZnJvbUphdmFSZXNvdXJjZU1vZGVsKGdldFhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRTcGVjaWZpZWRBY2Nlc3NPcmRlcigpIHsKLQkJdGhpcy5zcGVjaWZpZWRBY2Nlc3NPcmRlciA9IGdldFJlc291cmNlQWNjZXNzT3JkZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1NwZWNpZmllZEFjY2Vzc09yZGVyKCkgewotCQlzZXRTcGVjaWZpZWRBY2Nlc3NPcmRlcl8oZ2V0UmVzb3VyY2VBY2Nlc3NPcmRlcigpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBzdXBlciBjbGFzcyAqKioqKioqKioqCi0JCi0JcHVibGljIEpheGJDbGFzc01hcHBpbmcgZ2V0U3VwZXJjbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuc3VwZXJjbGFzczsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3VwZXJjbGFzc18oSmF4YkNsYXNzTWFwcGluZyBzdXBlcmNsYXNzKSB7Ci0JCUpheGJDbGFzc01hcHBpbmcgb2xkID0gdGhpcy5zdXBlcmNsYXNzOwotCQl0aGlzLnN1cGVyY2xhc3MgPSBzdXBlcmNsYXNzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1VQRVJDTEFTU19QUk9QRVJUWSwgb2xkLCBzdXBlcmNsYXNzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3VwZXJjbGFzcygpIHsKLQkJc2V0U3VwZXJjbGFzc18oZmluZFN1cGVyY2xhc3MoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXhiQ2xhc3NNYXBwaW5nIGZpbmRTdXBlcmNsYXNzKCkgewotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGdldFN1cGVyY2xhc3MoZ2V0SmF2YVJlc291cmNlVHlwZSgpKTsKLQkJd2hpbGUgKHJlc291cmNlVHlwZSAhPSBudWxsICYmIHJlc291cmNlVHlwZSAhPSB0aGlzKSB7Ci0JCQlKYXhiVHlwZSBqYXhiVHlwZSA9IGdldEpheGJQcm9qZWN0KCkuZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKHJlc291cmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQkJCi0JCQkvLyBpZiB0aGUgc3VwZXJjbGFzcyBpcyBub3QgYSBjbGFzcywgcmV0dXJuIG51bGwKLQkJCWlmIChqYXhiVHlwZSA9PSBudWxsIHx8IGpheGJUeXBlLmdldEtpbmQoKSAhPSBKYXhiVHlwZS5LaW5kLkNMQVNTKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCUpheGJDbGFzc01hcHBpbmcgamF4YkNsYXNzTWFwcGluZyA9ICgoSmF4YkNsYXNzKSBqYXhiVHlwZSkuZ2V0TWFwcGluZygpOwotCQkJLy8gcmFyZSBmb3IgYSBub24tbnVsbCBzdXBlcmNsYXNzIHRvIG5vdCBiZSBtYXBwZWQsIGJ1dCBwb3RlbnRpYWxseSBwb3NzaWJsZSBtaWQtdXBkYXRlCi0JCQlpZiAoamF4YkNsYXNzTWFwcGluZyAhPSBudWxsKSB7ICAKLQkJCQlyZXR1cm4gamF4YkNsYXNzTWFwcGluZzsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc291cmNlVHlwZSA9IGdldFN1cGVyY2xhc3MocmVzb3VyY2VUeXBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVR5cGUgZ2V0U3VwZXJjbGFzcyhKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlTdHJpbmcgc3VwZXJjbGFzc05hbWUgPSByZXNvdXJjZVR5cGUuZ2V0U3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoKTsKLQkJaWYgKHN1cGVyY2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpheGJQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZSgKLQkJCQlzdXBlcmNsYXNzTmFtZSwgSmF2YVJlc291cmNlVHlwZS5LaW5kLlRZUEUpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBhdHRyaWJ1dGVzICoqKioqCi0JCi0JcHVibGljIEl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzQ29udGFpbmVyLmdldEF0dHJpYnV0ZXMoKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRBdHRyaWJ1dGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlc0NvbnRhaW5lci5nZXRBdHRyaWJ1dGVzU2l6ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgR2VuZXJpY0phdmFBdHRyaWJ1dGVzQ29udGFpbmVyLk93bmVyIGJ1aWxkQXR0cmlidXRlc0NvbnRhaW5lck93bmVyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhQXR0cmlidXRlc0NvbnRhaW5lci5Pd25lcigpIHsKLQkJCXB1YmxpYyBYbWxBY2Nlc3NUeXBlIGdldEFjY2Vzc1R5cGUoKSB7Ci0JCQkJcmV0dXJuIEdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nLnRoaXMuZ2V0QWNjZXNzVHlwZSgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBmaXJlQXR0cmlidXRlQWRkZWQoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmcudGhpcy5maXJlSXRlbUFkZGVkKEFUVFJJQlVURVNfQ09MTEVDVElPTiwgYXR0cmlidXRlKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgZmlyZUF0dHJpYnV0ZVJlbW92ZWQoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmcudGhpcy5maXJlSXRlbVJlbW92ZWQoQVRUUklCVVRFU19DT0xMRUNUSU9OLCBhdHRyaWJ1dGUpOwotCQkJfQotCQl9OwotCX0KLQkKLQkKLQkvLyAqKioqKiBpbmNsdWRlZCBhdHRyaWJ1dGVzICoqKioqCi0JCi0JcHVibGljIEl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRJbmNsdWRlZEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+KGdldEluY2x1ZGVkQXR0cmlidXRlU2V0cygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPj4gZ2V0SW5jbHVkZWRBdHRyaWJ1dGVTZXRzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF4YkF0dHJpYnV0ZXNDb250YWluZXIsIEl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPj4oCi0JCQkJZ2V0SW5jbHVkZWRBdHRyaWJ1dGVzQ29udGFpbmVycygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYWJsZTxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gdHJhbnNmb3JtKEpheGJBdHRyaWJ1dGVzQ29udGFpbmVyIGF0dHJpYnV0ZXNDb250YWluZXIpIHsKLQkJCQlyZXR1cm4gYXR0cmlidXRlc0NvbnRhaW5lci5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXhiQXR0cmlidXRlc0NvbnRhaW5lcj4gZ2V0SW5jbHVkZWRBdHRyaWJ1dGVzQ29udGFpbmVycygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxKYXhiQXR0cmlidXRlc0NvbnRhaW5lcj4odGhpcy5pbmNsdWRlZEF0dHJpYnV0ZXNDb250YWluZXJzLnZhbHVlcygpKTsgIC8vIHJlYWQtb25seQotCX0KLQkKLQlwdWJsaWMgaW50IGdldEluY2x1ZGVkQXR0cmlidXRlc1NpemUoKSB7Ci0JCWludCBzaXplID0gMDsKLQkJZm9yIChKYXhiQXR0cmlidXRlc0NvbnRhaW5lciBhdHRyaWJ1dGVzQ29udGFpbmVyIDogZ2V0SW5jbHVkZWRBdHRyaWJ1dGVzQ29udGFpbmVycygpKSB7Ci0JCQlzaXplICs9IGF0dHJpYnV0ZXNDb250YWluZXIuZ2V0QXR0cmlidXRlc1NpemUoKTsKLQkJfQotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEluY2x1ZGVkQXR0cmlidXRlcygpIHsKLQkJLy8geG1sIHRyYW5zaWVudCBjbGFzc2VzIGhhdmUgbm8gaW5jbHVkZWQgYXR0cmlidXRlcwotCQlpZiAoaXNYbWxUcmFuc2llbnQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUpheGJDbGFzc01hcHBpbmcgc3VwZXJjbGFzcyA9IHRoaXMuc3VwZXJjbGFzczsKLQkJLy8gb25seSBhZGQgaW5oZXJpdGVkIGF0dHJpYnV0ZXMgZm9yIHN1cGVyY2xhc3NlcyB1cCB1bnRpbCBhIG1hcHBlZCBjbGFzcyBpcyBlbmNvdW50ZXJlZAotCQl3aGlsZSAoc3VwZXJjbGFzcyAhPSBudWxsICYmIHN1cGVyY2xhc3MuaXNYbWxUcmFuc2llbnQoKSkgewotCQkJdGhpcy5pbmNsdWRlZEF0dHJpYnV0ZXNDb250YWluZXJzLnB1dChzdXBlcmNsYXNzLCBidWlsZEluY2x1ZGVkQXR0cmlidXRlc0NvbnRhaW5lcihzdXBlcmNsYXNzKSk7Ci0JCQlzdXBlcmNsYXNzID0gc3VwZXJjbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY0luY2x1ZGVkQXR0cmlidXRlcygpIHsKLQkJZm9yIChKYXhiQXR0cmlidXRlc0NvbnRhaW5lciBhdHRyaWJ1dGVzQ29udGFpbmVyIDogdGhpcy5pbmNsdWRlZEF0dHJpYnV0ZXNDb250YWluZXJzLnZhbHVlcygpKSB7Ci0JCQlhdHRyaWJ1dGVzQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVJbmNsdWRlZEF0dHJpYnV0ZXMoKSB7Ci0JCUhhc2hTZXQ8SmF4YkNsYXNzTWFwcGluZz4gb2xkU3VwZXJjbGFzc2VzIAotCQkJCT0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmluY2x1ZGVkQXR0cmlidXRlc0NvbnRhaW5lcnMua2V5U2V0KCkpOwotCQlTZXQ8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IG9sZEF0dHJpYnV0ZXMgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KGdldEluY2x1ZGVkQXR0cmlidXRlcygpKTsKLQkJCi0JCWlmICghIGlzWG1sVHJhbnNpZW50KCkpIHsKLQkJCUpheGJDbGFzc01hcHBpbmcgc3VwZXJjbGFzcyA9IHRoaXMuc3VwZXJjbGFzczsKLQkJCS8vIG9ubHkgYWRkIGluaGVyaXRlZCBhdHRyaWJ1dGVzIGZvciBzdXBlcmNsYXNzZXMgdXAgdW50aWwgYSBtYXBwZWQgY2xhc3MgaXMgZW5jb3VudGVyZWQKLQkJCXdoaWxlIChzdXBlcmNsYXNzICE9IG51bGwgJiYgc3VwZXJjbGFzcy5pc1htbFRyYW5zaWVudCgpKSB7Ci0JCQkJaWYgKHRoaXMuaW5jbHVkZWRBdHRyaWJ1dGVzQ29udGFpbmVycy5jb250YWluc0tleShzdXBlcmNsYXNzKSkgewotCQkJCQl0aGlzLmluY2x1ZGVkQXR0cmlidXRlc0NvbnRhaW5lcnMuZ2V0KHN1cGVyY2xhc3MpLnVwZGF0ZSgpOwotCQkJCQlvbGRTdXBlcmNsYXNzZXMucmVtb3ZlKHN1cGVyY2xhc3MpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGhpcy5pbmNsdWRlZEF0dHJpYnV0ZXNDb250YWluZXJzLnB1dChzdXBlcmNsYXNzLCBidWlsZEluY2x1ZGVkQXR0cmlidXRlc0NvbnRhaW5lcihzdXBlcmNsYXNzKSk7Ci0JCQkJfQotCQkJCXN1cGVyY2xhc3MgPSBzdXBlcmNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQkJCX0KLQkJfQotCQkKLQkJZm9yIChKYXhiQ2xhc3NNYXBwaW5nIG9sZFN1cGVyY2xhc3MgOiBvbGRTdXBlcmNsYXNzZXMpIHsKLQkJCXRoaXMuaW5jbHVkZWRBdHRyaWJ1dGVzQ29udGFpbmVycy5yZW1vdmUob2xkU3VwZXJjbGFzcyk7Ci0JCX0KLQkJCi0JCVNldDxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gbmV3QXR0cmlidXRlcyA9IENvbGxlY3Rpb25Ub29scy5zZXQoZ2V0SW5jbHVkZWRBdHRyaWJ1dGVzKCkpOwotCQlpZiAoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRGlmZmVyZW50KG9sZEF0dHJpYnV0ZXMsIG5ld0F0dHJpYnV0ZXMpKSB7Ci0JCQlmaXJlQ29sbGVjdGlvbkNoYW5nZWQoSU5DTFVERURfQVRUUklCVVRFU19DT0xMRUNUSU9OLCBuZXdBdHRyaWJ1dGVzKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YkF0dHJpYnV0ZXNDb250YWluZXIgYnVpbGRJbmNsdWRlZEF0dHJpYnV0ZXNDb250YWluZXIoSmF4YkNsYXNzTWFwcGluZyBqYXhiQ2xhc3NNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFBdHRyaWJ1dGVzQ29udGFpbmVyKHRoaXMsIGJ1aWxkSW5jbHVkZWRBdHRyaWJ1dGVzQ29udGFpbmVyT3duZXIoKSwgamF4YkNsYXNzTWFwcGluZy5nZXRKYXhiVHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBHZW5lcmljSmF2YUF0dHJpYnV0ZXNDb250YWluZXIuT3duZXIgYnVpbGRJbmNsdWRlZEF0dHJpYnV0ZXNDb250YWluZXJPd25lcigpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUF0dHJpYnV0ZXNDb250YWluZXIuT3duZXIoKSB7Ci0JCQlwdWJsaWMgWG1sQWNjZXNzVHlwZSBnZXRBY2Nlc3NUeXBlKCkgewotCQkJCXJldHVybiBHZW5lcmljSmF2YUNsYXNzTWFwcGluZy50aGlzLmdldEFjY2Vzc1R5cGUoKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgZmlyZUF0dHJpYnV0ZUFkZGVkKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nLnRoaXMuZmlyZUl0ZW1BZGRlZChJTkNMVURFRF9BVFRSSUJVVEVTX0NPTExFQ1RJT04sIGF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGZpcmVBdHRyaWJ1dGVSZW1vdmVkKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nLnRoaXMuZmlyZUl0ZW1SZW1vdmVkKElOQ0xVREVEX0FUVFJJQlVURVNfQ09MTEVDVElPTiwgYXR0cmlidXRlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWlzYyBhdHRyaWJ1dGVzICoqKioqCi0JCi0JcHVibGljIEl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRBbGxMb2NhbGx5RGVmaW5lZEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+KAotCQkJCWdldEF0dHJpYnV0ZXMoKSwKLQkJCQlnZXRJbmNsdWRlZEF0dHJpYnV0ZXMoKSk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gZ2V0SW5oZXJpdGVkQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4oCi0JCQkJZ2V0SW5jbHVkZWRBdHRyaWJ1dGVzKCksCi0JCQkJZ2V0T3RoZXJJbmhlcml0ZWRBdHRyaWJ1dGVzKCkpOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldEFsbEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+KAotCQkJCWdldEF0dHJpYnV0ZXMoKSwKLQkJCQlnZXRJbmNsdWRlZEF0dHJpYnV0ZXMoKSwKLQkJCQlnZXRPdGhlckluaGVyaXRlZEF0dHJpYnV0ZXMoKSk7Ci0JfQotCQotCS8qKgotCSAqIHJldHVybiB0aG9zZSBpbmhlcml0ZWQgYXR0cmlidXRlcyB0aGF0IGFyZSBub3QgaW5jbHVkZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldE90aGVySW5oZXJpdGVkQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4oCi0JCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF4YkNsYXNzTWFwcGluZywgSXRlcmFibGU8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+PigKLQkJCQkJCW5ldyBDaGFpbkl0ZXJhYmxlPEpheGJDbGFzc01hcHBpbmc+KGdldFN1cGVyY2xhc3MoKSkgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBKYXhiQ2xhc3NNYXBwaW5nIG5leHRMaW5rKEpheGJDbGFzc01hcHBpbmcgY3VycmVudExpbmspIHsKLQkJCQkJCQkJcmV0dXJuIGN1cnJlbnRMaW5rLmdldFN1cGVyY2xhc3MoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IHRyYW5zZm9ybShKYXhiQ2xhc3NNYXBwaW5nIG8pIHsKLQkJCQkJCXJldHVybiBvLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzdWJDbGFzc2VzICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaGFzUm9vdEVsZW1lbnRJbkhpZXJhcmNoeSgpIHsKLQkJaWYgKCEgdGhpcy5oYXNSb290RWxlbWVudEluSGllcmFyY2h5X2xvYWRlZCkgewotCQkJdGhpcy5oYXNSb290RWxlbWVudEluSGllcmFyY2h5ID0gY2FsY3VsYXRlSGFzUm9vdEVsZW1lbnRJbkhpZXJhcmNoeSgpOwotCQkJdGhpcy5oYXNSb290RWxlbWVudEluSGllcmFyY2h5X2xvYWRlZCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuaGFzUm9vdEVsZW1lbnRJbkhpZXJhcmNoeTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlSGFzUm9vdEVsZW1lbnRJbkhpZXJhcmNoeSgpIHsKLQkJaWYgKHRoaXMuZ2V0WG1sUm9vdEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJZm9yIChKYXhiVHlwZSBqYXhiVHlwZSA6IGdldEpheGJQcm9qZWN0KCkuZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSB7Ci0JCQlpZiAoamF4YlR5cGUuZ2V0TWFwcGluZygpICE9IG51bGwgCi0JCQkJCSYmICEgamF4YlR5cGUuZ2V0TWFwcGluZygpLmlzWG1sVHJhbnNpZW50KCkgCi0JCQkJCSYmIGpheGJUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxSb290RWxlbWVudCgpICE9IG51bGwKLQkJCQkJJiYgSkRUVG9vbHMudHlwZUlzU3ViVHlwZSgKLQkJCQkJCQlnZXRKYXhiUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCksCi0JCQkJCQkJamF4YlR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksIGdldEpheGJUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldFRyYW5zaWVudFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJCQlzdXBlci5nZXRUcmFuc2llbnRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCksCi0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZShnZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0U3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoKSkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXROb25UcmFuc2llbnRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCQkJc3VwZXIuZ2V0Tm9uVHJhbnNpZW50UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpLAotCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGUoZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldFN1cGVyY2xhc3NRdWFsaWZpZWROYW1lKCkpLAotCQkJCW5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQkJCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUsIEl0ZXJhYmxlPFN0cmluZz4+KGdldEF0dHJpYnV0ZXMoKSkgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IHRyYW5zZm9ybShKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBvKSB7Ci0JCQkJCQkJCXJldHVybiBvLmdldE1hcHBpbmcoKS5nZXRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCk7Ci0JCQkJCQkJfQotCQkJCQkJfSkpOwotCX0KLQkKLQlwdWJsaWMgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgZ2V0WG1sSWRNYXBwaW5nKCkgewotCQlJdGVyYXRvcjxYbWxOYW1lZE5vZGVNYXBwaW5nPiBhbGxYbWxJZE1hcHBpbmdzID0gCi0JCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFhtbE5hbWVkTm9kZU1hcHBpbmc+KAotCQkJCQkJbmV3IFN1Ykl0ZXJhYmxlV3JhcHBlcjxKYXhiQXR0cmlidXRlTWFwcGluZywgWG1sTmFtZWROb2RlTWFwcGluZz4oCi0JCQkJCQkJCW5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXhiQXR0cmlidXRlTWFwcGluZz4oCi0JCQkJCQkJCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUsIEpheGJBdHRyaWJ1dGVNYXBwaW5nPihnZXRBbGxBdHRyaWJ1dGVzKCkpIHsKLQkJCQkJCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJCQkJCXByb3RlY3RlZCBKYXhiQXR0cmlidXRlTWFwcGluZyB0cmFuc2Zvcm0oSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgbykgewotCQkJCQkJCQkJCQkJcmV0dXJuIG8uZ2V0TWFwcGluZygpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfSkgewotCQkJCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSmF4YkF0dHJpYnV0ZU1hcHBpbmcgbykgewotCQkJCQkJCQkJCXJldHVybiAoby5nZXRLZXkoKSA9PSBNYXBwaW5nS2V5cy5YTUxfRUxFTUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkKLQkJCQkJCQkJCQkJCXx8IG8uZ2V0S2V5KCkgPT0gTWFwcGluZ0tleXMuWE1MX0FUVFJJQlVURV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFhtbE5hbWVkTm9kZU1hcHBpbmcgbykgewotCQkJCQkJcmV0dXJuIG8uZ2V0WG1sSUQoKSAhPSBudWxsOwotCQkJCQl9Ci0JCQkJfS5pdGVyYXRvcigpOwotCQlyZXR1cm4gKGFsbFhtbElkTWFwcGluZ3MuaGFzTmV4dCgpKSA/IGFsbFhtbElkTWFwcGluZ3MubmV4dCgpIDogbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPD8gZXh0ZW5kcyBKYXhiQXR0cmlidXRlTWFwcGluZz4gZ2V0QXR0cmlidXRlTWFwcGluZ3MoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF4YkF0dHJpYnV0ZU1hcHBpbmc+KGdldEF0dHJpYnV0ZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgdHJhbnNmb3JtKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkJfQotCQl9OwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKAotCQkJaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCWlmIChwcm9wVG91Y2hlcyhwb3MsIGFzdFJvb3QpKSB7Ci0JCQlyZXR1cm4gZ2V0UHJvcFByb3Bvc2FscyhmaWx0ZXIpOwotCQl9Ci0JCQotCQkvLyBUT0RPIC0gZmFjdG9yeSBtZXRob2RzPwotCQkKLQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiB0aGlzLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJcmVzdWx0ID0gYXR0cmlidXRlLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmICghQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldFByb3BQcm9wb3NhbHMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHMoCi0JCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4oCi0JCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlLCBTdHJpbmc+KGdldEFsbExvY2FsbHlEZWZpbmVkQXR0cmlidXRlcygpKSB7Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIG8pIHsKLQkJCQkJCQlyZXR1cm4gby5nZXROYW1lKCk7Ci0JCQkJCQl9Ci0JCQkJCX0sCi0JCQkJCWZpbHRlcikpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCXZhbGlkYXRlQ29uc3RydWN0b3IobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdmFsaWRhdGVQcm9wT3JkZXIobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdmFsaWRhdGVYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJdmFsaWRhdGVYbWxBbnlFbGVtZW50TWFwcGluZyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCXZhbGlkYXRlWG1sVmFsdWVNYXBwaW5nKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJdmFsaWRhdGVYbWxJRHMobWVzc2FnZXMsIGFzdFJvb3QpOwotCQkKLQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBnZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCWF0dHJpYnV0ZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ29uc3RydWN0b3IoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gVE9ETyAtIGZhY3RvcnkgY2xhc3MvbWV0aG9kCi0JCQotCQlpZiAoISBKQVhCLlhNTF9UWVBFX19ERUZBVUxUX0ZBQ1RPUllfQ0xBU1MuZXF1YWxzKGdldEZhY3RvcnlDbGFzcygpKSkgewotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZ2V0RmFjdG9yeU1ldGhvZCgpKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9UWVBFX19VTlNQRUNJRklFRF9GQUNUT1JZX01FVEhPRCwKLQkJCQkJCQkJdGhpcywKLQkJCQkJCQkJZ2V0RmFjdG9yeUNsYXNzVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZ2V0RmFjdG9yeU1ldGhvZCgpID09IG51bGwKLQkJCQkJJiYgZ2V0SmF4YlR5cGUoKS5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSA9PSBudWxsCi0JCQkJCSYmICEgZ2V0SmF2YVJlc291cmNlVHlwZSgpLmhhc1B1YmxpY09yUHJvdGVjdGVkTm9BcmdDb25zdHJ1Y3RvcigpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1RZUEVfX05PX1BVQkxJQ19PUl9QUk9URUNURURfQ09OU1RSVUNUT1IsCi0JCQkJCQkJCXRoaXMsCi0JCQkJCQkJCWdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQcm9wT3JkZXIoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KGdldFByb3BPcmRlcigpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBubyBkdXBsaWNhdGVzCi0JCS8vIGFsbCBhdHRyaWJ1dGVzL2luY2x1ZGVkIGF0dHJpYnV0ZXMgd2l0aCBYbWxFbGVtZW50L3MvUmVmL3MgbXVzdCBiZSBsaXN0ZWQKLQkJLy8gbm8gbm9uZXhpc3RlbnQgYXR0cmlidXRlcyAoYXR0cmlidXRlcyBtYXBwZWQgb3RoZXJ3aXNlIGFsbG93ZWQpIC4uLgotCQkvLyAqZXhjZXB0KiBubyB0cmFuc2llbnQgYXR0cmlidXRlcyBhbGxvd2VkCi0JCQotCQlCYWc8U3RyaW5nPiBwcm9wcyA9IENvbGxlY3Rpb25Ub29scy5iYWcoZ2V0UHJvcE9yZGVyKCkpOwotCQlTZXQ8U3RyaW5nPiBhbGxBdHRyaWJ1dGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlTZXQ8U3RyaW5nPiByZXF1aXJlZEF0dHJpYnV0ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCVNldDxTdHJpbmc+IHRyYW5zaWVudEF0dHJpYnV0ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCQotCQlmb3IgKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA6IGdldEFsbExvY2FsbHlEZWZpbmVkQXR0cmlidXRlcygpKSB7Ci0JCQlhbGxBdHRyaWJ1dGVzLmFkZChhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCXRyYW5zaWVudEF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQl9Ci0JCQotCQlmb3IgKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA6IGdldEFsbExvY2FsbHlEZWZpbmVkQXR0cmlidXRlcygpKSB7Ci0JCQlpZiAoYXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc1BhcnRpY2xlTWFwcGluZygpKSB7Ci0JCQkJcmVxdWlyZWRBdHRyaWJ1dGVzLmFkZChhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCQotCQkJaWYgKCEgYXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc1RyYW5zaWVudCgpKSB7Ci0JCQkJLy8gcmVtb3ZlIHRyYW5zaWVudHMgKHJhdGhlciB0aGFuIHByZXZpb3VzIGFsZ29yaXRobSBvZiBhZGRpbmcgdGhlbSkKLQkJCQkvLyB0aGVyZSBtYXkgYmUgdHdvIGF0dHJpYnV0ZXMgb2YgdGhlIHNhbWUgbmFtZSAob25lIGZpZWxkLCBvbmUgcHJvcGVydHkpIGluIAotCQkJCS8vIGEgY2xhc3MsIHdoaWNoIGlzIGEgY29ycmVjdCBjb25maWd1cmF0aW9uLiAgd2Ugd2FudCB0byBrbm93IGlmICpldmVyeSogYXR0cmlidXRlIAotCQkJCS8vIG9mIGEgZ2l2ZW4gbmFtZSBpcyB0cmFuc2llbnQgKG9yIGlmIHRoZXJlJ3MgYSBzaW5nbGUgbm9uLXRyYW5zaWVudCBhdHRyaWJ1dGUpCi0JCQkJdHJhbnNpZW50QXR0cmlidXRlcy5yZW1vdmUoYXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCVNldDxJbnRlZ2VyPiBkdXBsaWNhdGVQcm9wcyA9IG5ldyBIYXNoU2V0PEludGVnZXI+KCk7Ci0JCVNldDxTdHJpbmc+IG1pc3NpbmdQcm9wcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4ocmVxdWlyZWRBdHRyaWJ1dGVzKTsKLQkJU2V0PEludGVnZXI+IG5vbmV4aXN0ZW50UHJvcHMgPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOwotCQlTZXQ8SW50ZWdlcj4gdHJhbnNpZW50UHJvcHMgPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRQcm9wT3JkZXJTaXplKCk7IGkgKysgKSB7Ci0JCQlTdHJpbmcgcHJvcCA9IGdldFByb3AoaSk7Ci0JCQkKLQkJCWlmIChwcm9wcy5jb3VudChwcm9wKSA+IDEpIHsKLQkJCQlkdXBsaWNhdGVQcm9wcy5hZGQoaSk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChtaXNzaW5nUHJvcHMuY29udGFpbnMocHJvcCkpIHsKLQkJCQltaXNzaW5nUHJvcHMucmVtb3ZlKHByb3ApOwotCQkJfQotCQkJCi0JCQlpZiAoISBhbGxBdHRyaWJ1dGVzLmNvbnRhaW5zKHByb3ApKSB7Ci0JCQkJbm9uZXhpc3RlbnRQcm9wcy5hZGQoaSk7Ci0JCQl9Ci0JCQkKLQkJCWlmICh0cmFuc2llbnRBdHRyaWJ1dGVzLmNvbnRhaW5zKHByb3ApKSB7Ci0JCQkJdHJhbnNpZW50UHJvcHMuYWRkKGkpOwotCQkJfQotCQl9Ci0JCQotCQlmb3IgKGludCBpIDogZHVwbGljYXRlUHJvcHMpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9UWVBFX19EVVBMSUNBVEVfUFJPUCwKLQkJCQkJCQluZXcgU3RyaW5nW10geyBnZXRQcm9wKGkpIH0sCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlnZXRQcm9wVGV4dFJhbmdlKGksIGFzdFJvb3QpKSk7Ci0JCX0KLQkJCi0JCWZvciAoU3RyaW5nIG1pc3NpbmdQcm9wIDogbWlzc2luZ1Byb3BzKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfVFlQRV9fTUlTU0lOR19QUk9QLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IG1pc3NpbmdQcm9wIH0sCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlnZXRQcm9wT3JkZXJUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCQkKLQkJZm9yIChpbnQgaSA6IG5vbmV4aXN0ZW50UHJvcHMpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9UWVBFX19OT05FWElTVEVOVF9QUk9QLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IGdldFByb3AoaSkgfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCWdldFByb3BUZXh0UmFuZ2UoaSwgYXN0Um9vdCkpKTsKLQkJfQotCQkKLQkJZm9yIChpbnQgaSA6IHRyYW5zaWVudFByb3BzKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfVFlQRV9fVFJBTlNJRU5UX1BST1AsCi0JCQkJCQkJbmV3IFN0cmluZyBbXSB7IGdldFByb3AoaSkgfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCWdldFByb3BUZXh0UmFuZ2UoaSwgYXN0Um9vdCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVhtbEFueUF0dHJpYnV0ZU1hcHBpbmcoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVNldDxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gbG9jYWxBdHRyaWJ1dGVzID0gbmV3IEhhc2hTZXQ8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCVNldDxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gYWxsQXR0cmlidXRlcyA9IG5ldyBIYXNoU2V0PEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPigpOwotCQkJCi0JCWZvciAoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlIDogZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQlpZiAoYXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5YTUxfQU5ZX0FUVFJJQlVURV9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCQlsb2NhbEF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZSk7Ci0JCQkJYWxsQXR0cmlidXRlcy5hZGQoYXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCQkKLQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBnZXRJbmhlcml0ZWRBdHRyaWJ1dGVzKCkpIHsKLQkJCWlmIChhdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpID09IE1hcHBpbmdLZXlzLlhNTF9BTllfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJCWFsbEF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChhbGxBdHRyaWJ1dGVzLnNpemUoKSA+IDEpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9BTllfQVRUUklCVVRFX19NVUxUSVBMRV9NQVBQSU5HU19ERUZJTkVELAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQkJCQotCQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhbnlBdHRyaWJ1dGUgOiBsb2NhbEF0dHJpYnV0ZXMpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0FOWV9BVFRSSUJVVEVfX01VTFRJUExFX01BUFBJTkdTX0RFRklORUQsCi0JCQkJCQlhbnlBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLAotCQkJCQkJYW55QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVYbWxBbnlFbGVtZW50TWFwcGluZyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJU2V0PEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBsb2NhbEF0dHJpYnV0ZXMgPSBuZXcgSGFzaFNldDxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJU2V0PEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBhbGxBdHRyaWJ1dGVzID0gbmV3IEhhc2hTZXQ8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCQkKLQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBnZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCWlmIChhdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpID09IE1hcHBpbmdLZXlzLlhNTF9BTllfRUxFTUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCQlsb2NhbEF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZSk7Ci0JCQkJYWxsQXR0cmlidXRlcy5hZGQoYXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCQkKLQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBnZXRJbmhlcml0ZWRBdHRyaWJ1dGVzKCkpIHsKLQkJCWlmIChhdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpID09IE1hcHBpbmdLZXlzLlhNTF9BTllfRUxFTUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCQlhbGxBdHRyaWJ1dGVzLmFkZChhdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoYWxsQXR0cmlidXRlcy5zaXplKCkgPiAxKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfQU5ZX0VMRU1FTlRfX01VTFRJUExFX01BUFBJTkdTX0RFRklORUQsCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQkJCi0JCQlmb3IgKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGFueUF0dHJpYnV0ZSA6IGxvY2FsQXR0cmlidXRlcykgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfQU5ZX0VMRU1FTlRfX01VTFRJUExFX01BUFBJTkdTX0RFRklORUQsCi0JCQkJCQlhbnlBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLAotCQkJCQkJYW55QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVYbWxWYWx1ZU1hcHBpbmcoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVNldDxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gbG9jYWxBdHRyaWJ1dGVzID0gbmV3IEhhc2hTZXQ8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCVNldDxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gYWxsQXR0cmlidXRlcyA9IG5ldyBIYXNoU2V0PEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPigpOwotCQkJCi0JCWZvciAoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlIDogZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQlpZiAoYXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5YTUxfVkFMVUVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQkJbG9jYWxBdHRyaWJ1dGVzLmFkZChhdHRyaWJ1dGUpOwotCQkJCWFsbEF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlIDogZ2V0SW5oZXJpdGVkQXR0cmlidXRlcygpKSB7Ci0JCQlpZiAoYXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5YTUxfVkFMVUVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQkJYWxsQXR0cmlidXRlcy5hZGQoYXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGFsbEF0dHJpYnV0ZXMuc2l6ZSgpID4gMSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1ZBTFVFX19NVUxUSVBMRV9NQVBQSU5HU19ERUZJTkVELAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQkJCQotCQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhbnlBdHRyaWJ1dGUgOiBsb2NhbEF0dHJpYnV0ZXMpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1ZBTFVFX19NVUxUSVBMRV9NQVBQSU5HU19ERUZJTkVELAotCQkJCQkJYW55QXR0cmlidXRlLmdldE1hcHBpbmcoKSwKLQkJCQkJCWFueUF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlWG1sSURzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkKLQkJU2V0PEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBsb2NhbEF0dHJpYnV0ZXMgPSBuZXcgSGFzaFNldDxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJU2V0PEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBhbGxBdHRyaWJ1dGVzID0gbmV3IEhhc2hTZXQ8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCQkKLQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBnZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCWlmICgoYXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5YTUxfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWQotCQkJCQl8fCBhdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpID09IE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkKLQkJCQkJJiYgKChYbWxOYW1lZE5vZGVNYXBwaW5nKSBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRYbWxJRCgpICE9IG51bGwpIHsKLQkJCQlsb2NhbEF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZSk7Ci0JCQkJYWxsQXR0cmlidXRlcy5hZGQoYXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCQkKLQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBnZXRJbmhlcml0ZWRBdHRyaWJ1dGVzKCkpIHsKLQkJCWlmICgoYXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5YTUxfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWQotCQkJCQl8fCBhdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpID09IE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkKLQkJCQkJJiYgKChYbWxOYW1lZE5vZGVNYXBwaW5nKSBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRYbWxJRCgpICE9IG51bGwpIHsKLQkJCQlhbGxBdHRyaWJ1dGVzLmFkZChhdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoYWxsQXR0cmlidXRlcy5zaXplKCkgPiAxKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfSURfX01VTFRJUExFX01BUFBJTkdTX0RFRklORUQsCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQkJCi0JCQlmb3IgKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGFueUF0dHJpYnV0ZSA6IGxvY2FsQXR0cmlidXRlcykgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfSURfX01VTFRJUExFX01BUFBJTkdTX0RFRklORUQsCi0JCQkJCQlhbnlBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLAotCQkJCQkJYW55QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRGYWN0b3J5Q2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHJlc3VsdCA9IGdldFhtbFR5cGVBbm5vdGF0aW9uKCkuZ2V0RmFjdG9yeUNsYXNzVGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHJlc3VsdCAhPSBudWxsKSA/IHJlc3VsdCA6IGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0RmFjdG9yeU1ldGhvZFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgcmVzdWx0ID0gZ2V0WG1sVHlwZUFubm90YXRpb24oKS5nZXRGYWN0b3J5TWV0aG9kVGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHJlc3VsdCAhPSBudWxsKSA/IHJlc3VsdCA6IGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0UHJvcE9yZGVyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSByZXN1bHQgPSBnZXRYbWxUeXBlQW5ub3RhdGlvbigpLmdldFByb3BPcmRlclRleHRSYW5nZShhc3RSb290KTsKLQkJcmV0dXJuIChyZXN1bHQgIT0gbnVsbCkgPyByZXN1bHQgOiBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFByb3BUZXh0UmFuZ2UoaW50IGluZGV4LCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0WG1sVHlwZUFubm90YXRpb24oKS5nZXRQcm9wVGV4dFJhbmdlKGluZGV4LCBhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvcFRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKGdldFhtbFR5cGVBbm5vdGF0aW9uKCkucHJvcE9yZGVyVG91Y2hlcyhwb3MsIGFzdFJvb3QpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGdldFhtbFR5cGVBbm5vdGF0aW9uKCkuZ2V0UHJvcE9yZGVyU2l6ZSgpOyBpICsrICkgewotCQkJCWlmIChnZXRYbWxUeXBlQW5ub3RhdGlvbigpLnByb3BUb3VjaGVzKGksIHBvcywgYXN0Um9vdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogeG1sIHByb3Agb3JkZXIgY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFByb3BPcmRlckNvbnRhaW5lcgotCQkJZXh0ZW5kcyBMaXN0Q29udGFpbmVyPFN0cmluZywgU3RyaW5nPiB7Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gUFJPUF9PUkRFUl9MSVNUOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZENvbnRleHRFbGVtZW50KFN0cmluZyByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiByZXNvdXJjZUVsZW1lbnQ7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUNsYXNzTWFwcGluZy50aGlzLmdldFJlc291cmNlUHJvcE9yZGVyKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlRWxlbWVudChTdHJpbmcgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWUxYzc1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLkpwdEpheGJDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlFOYW1lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZAotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kIHsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2Q7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzY29wZTsKLQkKLQlwcm90ZWN0ZWQgSmF4YlFOYW1lIHFOYW1lOwotCQotCXByb3RlY3RlZCBKYXhiUU5hbWUgc3Vic3RpdHV0aW9uSGVhZFFOYW1lOwotCQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFZhbHVlOwotCQotCQotCXB1YmxpYyBHZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kKFhtbFJlZ2lzdHJ5IHBhcmVudCwgSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucmVzb3VyY2VNZXRob2QgPSByZXNvdXJjZU1ldGhvZDsKLQkJdGhpcy5zY29wZSA9IGdldFJlc291cmNlU2NvcGUoKTsKLQkJdGhpcy5xTmFtZSA9IGJ1aWxkUU5hbWUoKTsKLQkJdGhpcy5zdWJzdGl0dXRpb25IZWFkUU5hbWUgPSBidWlsZFN1YnN0aXR1dGlvbkhlYWRRTmFtZSgpOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IHRoaXMuZ2V0UmVzb3VyY2VEZWZhdWx0VmFsdWUoKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIEpheGJRTmFtZSBidWlsZFFOYW1lKCkgewotCQlyZXR1cm4gbmV3IFhtbEVsZW1lbnREZWNsUU5hbWUodGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXhiUU5hbWUgYnVpbGRTdWJzdGl0dXRpb25IZWFkUU5hbWUoKSB7Ci0JCXJldHVybiBuZXcgWG1sRWxlbWVudERlY2xTdWJzdGl0dXRpb25IZWFkUU5hbWUodGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxSZWdpc3RyeSBnZXRSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIChYbWxSZWdpc3RyeSkgZ2V0UGFyZW50KCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhUmVzb3VyY2VNZXRob2QgZ2V0UmVzb3VyY2VNZXRob2QoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlTWV0aG9kOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uIGdldFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxFbGVtZW50RGVjbEFubm90YXRpb24pIGdldFJlc291cmNlTWV0aG9kKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXNldFNjb3BlXyhnZXRSZXNvdXJjZVNjb3BlKCkpOwotCQl0aGlzLnFOYW1lLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zdWJzdGl0dXRpb25IZWFkUU5hbWUuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlzZXREZWZhdWx0VmFsdWVfKGdldFJlc291cmNlRGVmYXVsdFZhbHVlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnFOYW1lLnVwZGF0ZSgpOwotCQl0aGlzLnN1YnN0aXR1dGlvbkhlYWRRTmFtZS51cGRhdGUoKTsKLQl9Ci0JCi0KLQkvLyAqKioqKiBKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QgaW1wbCAqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZU1ldGhvZC5nZXROYW1lKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHNjb3BlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRTY29wZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2NvcGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNjb3BlXyhTdHJpbmcgc2NvcGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc2NvcGU7Ci0JCXRoaXMuc2NvcGUgPSBzY29wZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTQ09QRV9QUk9QRVJUWSwgb2xkLCBzY29wZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNjb3BlKFN0cmluZyBzY29wZSkgewotCQlnZXRYbWxFbGVtZW50RGVjbEFubm90YXRpb24oKS5zZXRTY29wZShzY29wZSk7Ci0JCXNldFNjb3BlXyhzY29wZSk7CQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlU2NvcGUoKSB7Ci0JCXJldHVybiBnZXRYbWxFbGVtZW50RGVjbEFubm90YXRpb24oKS5nZXRTY29wZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkU2NvcGUoKSB7Ci0JCXJldHVybiAodGhpcy5zY29wZSA9PSBudWxsKSA/IERFRkFVTFRfU0NPUEVfQ0xBU1NfTkFNRSA6IGdldFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbigpLmdldEZ1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWUoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNHbG9iYWxTY29wZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0NPUEVfQ0xBU1NfTkFNRS5lcXVhbHMoZ2V0RnVsbHlRdWFsaWZpZWRTY29wZSgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogcW5hbWUgKioqKioKLQkKLQlwdWJsaWMgSmF4YlFOYW1lIGdldFFOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5xTmFtZTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3Vic3RpdHV0aW9uIGhlYWQgcW5hbWUgKioqKioKLQkKLQlwdWJsaWMgSmF4YlFOYW1lIGdldFN1YnN0aXR1dGlvbkhlYWRRTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3Vic3RpdHV0aW9uSGVhZFFOYW1lOwotCX0KLQkKLQkKLQkvLyAqKioqKiBkZWZhdWx0IHZhbHVlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFZhbHVlXyhTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRWYWx1ZTsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9WQUxVRV9QUk9QRVJUWSwgb2xkLCBkZWZhdWx0VmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQlnZXRYbWxFbGVtZW50RGVjbEFubm90YXRpb24oKS5zZXREZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlKTsKLQkJc2V0RGVmYXVsdFZhbHVlXyhkZWZhdWx0VmFsdWUpOwkKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZURlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbigpLmdldERlZmF1bHRWYWx1ZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXJlc3VsdCA9IHRoaXMucU5hbWUuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlyZXN1bHQgPSB0aGlzLnN1YnN0aXR1dGlvbkhlYWRRTmFtZS5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbigpLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5xTmFtZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnN1YnN0aXR1dGlvbkhlYWRRTmFtZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gZ2V0UmVzb3VyY2VNZXRob2QoKTsKLQkJdmFsaWRhdGVNZXRob2RSZXR1cm5UeXBlKHJlc291cmNlTWV0aG9kLCBtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCQotCQlpZiAocmVzb3VyY2VNZXRob2QuZ2V0UGFyYW1ldGVyc1NpemUoKSAhPSAxKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfRUxFTUVOVF9ERUNMX19JTlZBTElEX01FVEhPRF9TSUdOQVRVUkVfUEFSQU0sCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVNZXRob2RSZXR1cm5UeXBlKAotCQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCi0JCWlmICghIEpBWEIuSkFYQl9FTEVNRU5ULmVxdWFscyhyZXNvdXJjZU1ldGhvZC5nZXRUeXBlTmFtZSgpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0VMRU1FTlRfREVDTF9fSU5WQUxJRF9NRVRIT0RfU0lHTkFUVVJFX1JFVFVSTl9UWVBFLAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxFbGVtZW50RGVjbFFOYW1lCi0JCQlleHRlbmRzIEFic3RyYWN0SmF2YVFOYW1lIHsKLQkJCi0JCXByb3RlY3RlZCBYbWxFbGVtZW50RGVjbFFOYW1lKEphdmFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudCwgbmV3IFFOYW1lQW5ub3RhdGlvblByb3h5KCkpOwotCQl9Ci0JCQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXhiUGFja2FnZSBnZXRKYXhiUGFja2FnZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kLnRoaXMuZ2V0UmVnaXN0cnkoKS5nZXRKYXhiQ2xhc3MoKS5nZXRKYXhiUGFja2FnZSgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZXNwYWNlKCkgewotCQkJSmF4YlBhY2thZ2UgamF4YlBhY2thZ2UgPSB0aGlzLmdldEpheGJQYWNrYWdlKCk7Ci0JCQlyZXR1cm4gKGpheGJQYWNrYWdlID09IG51bGwpID8gbnVsbCA6IGpheGJQYWNrYWdlLmdldE5hbWVzcGFjZSgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0TmFtZVByb3Bvc2FscyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCWlmICghIEdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2QudGhpcy5pc0dsb2JhbFNjb3BlKCkpIHsKLQkJCQlTdHJpbmcgZnFTY29wZSA9IEdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2QudGhpcy5nZXRGdWxseVF1YWxpZmllZFNjb3BlKCk7Ci0JCQkJSmF4YlR5cGVNYXBwaW5nIHNjb3BlVHlwZU1hcHBpbmcgPSAKLQkJCQkJCUdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2QudGhpcy5nZXRKYXhiUHJvamVjdCgpLmdldENvbnRleHRSb290KCkuZ2V0VHlwZU1hcHBpbmcoZnFTY29wZSk7Ci0JCQkJaWYgKHNjb3BlVHlwZU1hcHBpbmcgIT0gbnVsbCkgewotCQkJCQlYc2RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlID0gc2NvcGVUeXBlTWFwcGluZy5nZXRYc2RUeXBlRGVmaW5pdGlvbigpOwotCQkJCQlpZiAoeHNkVHlwZSAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4geHNkVHlwZS5nZXRFbGVtZW50TmFtZVByb3Bvc2FscyhnZXROYW1lc3BhY2UoKSwgZmlsdGVyLCB0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJWHNkU2NoZW1hIHhzZFNjaGVtYSA9IHRoaXMuZ2V0WHNkU2NoZW1hKCk7Ci0JCQlpZiAoeHNkU2NoZW1hICE9IG51bGwpIHsKLQkJCQlyZXR1cm4geHNkU2NoZW1hLmdldEVsZW1lbnROYW1lUHJvcG9zYWxzKGdldE5hbWVzcGFjZSgpLCBmaWx0ZXIpOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOyAKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldE5hbWVzcGFjZVByb3Bvc2FscyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCVhzZFNjaGVtYSB4c2RTY2hlbWEgPSB0aGlzLmdldFhzZFNjaGVtYSgpOwotCQkJcmV0dXJuICh4c2RTY2hlbWEgPT0gbnVsbCkgPyBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSA6IHhzZFNjaGVtYS5nZXROYW1lc3BhY2VQcm9wb3NhbHMoZmlsdGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbXBvbmVudFR5cGVEZXNjcmlwdGlvbigpIHsKLQkJCXJldHVybiBKcHRKYXhiQ29yZU1lc3NhZ2VzLlhNTF9FTEVNRU5UX0RFU0M7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVJlZmVyZW5jZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJaWYgKCEgR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZC50aGlzLmlzR2xvYmFsU2NvcGUoKSkgewotCQkJCVN0cmluZyBmcVNjb3BlID0gR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZC50aGlzLmdldEZ1bGx5UXVhbGlmaWVkU2NvcGUoKTsKLQkJCQlKYXhiVHlwZU1hcHBpbmcgc2NvcGVUeXBlTWFwcGluZyA9IAotCQkJCQkJR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZC50aGlzLmdldEpheGJQcm9qZWN0KCkuZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlTWFwcGluZyhmcVNjb3BlKTsKLQkJCQlpZiAoc2NvcGVUeXBlTWFwcGluZyAhPSBudWxsKSB7Ci0JCQkJCVhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUgPSBzY29wZVR5cGVNYXBwaW5nLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCQkJCWlmICh4c2RUeXBlID09IG51bGwpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKHhzZFR5cGUuZ2V0RWxlbWVudChnZXROYW1lc3BhY2UoKSwgZ2V0TmFtZSgpLCB0cnVlKSA9PSBudWxsKSB7Ci0JCQkJCQltZXNzYWdlcy5hZGQoZ2V0VW5yZXNvbHZlU2NoZW1hQ29tcG9uZW50TWVzc2FnZShhc3RSb290KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlYc2RTY2hlbWEgeHNkU2NoZW1hID0gdGhpcy5nZXRYc2RTY2hlbWEoKTsKLQkJCQlpZiAoeHNkU2NoZW1hICE9IG51bGwpIHsKLQkJCQkJaWYgKHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb24oZ2V0TmFtZXNwYWNlKCksIGdldE5hbWUoKSkgPT0gbnVsbCkgewotCQkJCQkJbWVzc2FnZXMuYWRkKGdldFVucmVzb2x2ZVNjaGVtYUNvbXBvbmVudE1lc3NhZ2UoYXN0Um9vdCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBRTmFtZUFubm90YXRpb25Qcm94eSAKLQkJCWV4dGVuZHMgQWJzdHJhY3RKYXZhUU5hbWUuQWJzdHJhY3RRTmFtZUFubm90YXRpb25Qcm94eSB7Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFFOYW1lQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKGJvb2xlYW4gY3JlYXRlSWZOdWxsKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZC50aGlzLmdldFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbigpOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxFbGVtZW50RGVjbFN1YnN0aXR1dGlvbkhlYWRRTmFtZQotCQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFRTmFtZSB7Ci0JCQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudERlY2xTdWJzdGl0dXRpb25IZWFkUU5hbWUoSmF2YUNvbnRleHROb2RlIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50LCBuZXcgU3Vic3RpdHV0aW9uSGVhZFFOYW1lQW5ub3RhdGlvblByb3h5KCkpOwotCQl9Ci0JCQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXhiUGFja2FnZSBnZXRKYXhiUGFja2FnZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kLnRoaXMuZ2V0UmVnaXN0cnkoKS5nZXRKYXhiQ2xhc3MoKS5nZXRKYXhiUGFja2FnZSgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZXNwYWNlKCkgewotCQkJSmF4YlBhY2thZ2UgamF4YlBhY2thZ2UgPSB0aGlzLmdldEpheGJQYWNrYWdlKCk7Ci0JCQlyZXR1cm4gKGpheGJQYWNrYWdlID09IG51bGwpID8gbnVsbCA6IGpheGJQYWNrYWdlLmdldE5hbWVzcGFjZSgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0TmFtZVByb3Bvc2FscyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCVN0cmluZyBmcVNjb3BlID0gR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZC50aGlzLmdldEZ1bGx5UXVhbGlmaWVkU2NvcGUoKTsKLQkJCUpheGJUeXBlTWFwcGluZyBzY29wZVR5cGVNYXBwaW5nID0gCi0JCQkJCUdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2QudGhpcy5nZXRKYXhiUHJvamVjdCgpLmdldENvbnRleHRSb290KCkuZ2V0VHlwZU1hcHBpbmcoZnFTY29wZSk7Ci0JCQlpZiAoc2NvcGVUeXBlTWFwcGluZyAhPSBudWxsKSB7Ci0JCQkJWHNkVHlwZURlZmluaXRpb24geHNkVHlwZSA9IHNjb3BlVHlwZU1hcHBpbmcuZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQkJCQlpZiAoeHNkVHlwZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiB4c2RUeXBlLmdldEVsZW1lbnROYW1lUHJvcG9zYWxzKGdldE5hbWVzcGFjZSgpLCBmaWx0ZXIpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJWHNkU2NoZW1hIHhzZFNjaGVtYSA9IHRoaXMuZ2V0WHNkU2NoZW1hKCk7Ci0JCQlpZiAoeHNkU2NoZW1hICE9IG51bGwpIHsKLQkJCQlyZXR1cm4geHNkU2NoZW1hLmdldEVsZW1lbnROYW1lUHJvcG9zYWxzKGdldE5hbWVzcGFjZSgpLCBmaWx0ZXIpOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOyAKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldE5hbWVzcGFjZVByb3Bvc2FscyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCVhzZFNjaGVtYSB4c2RTY2hlbWEgPSB0aGlzLmdldFhzZFNjaGVtYSgpOwotCQkJcmV0dXJuICh4c2RTY2hlbWEgPT0gbnVsbCkgPyBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSA6IHhzZFNjaGVtYS5nZXROYW1lc3BhY2VQcm9wb3NhbHMoZmlsdGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbXBvbmVudFR5cGVEZXNjcmlwdGlvbigpIHsKLQkJCXJldHVybiBKcHRKYXhiQ29yZU1lc3NhZ2VzLlNVQlNUSVRVVElPTl9IRUFEX0RFU0M7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU5hbWUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCS8vIG5lZWQgdG8gaWdub3JlIHRoZSB1bnNwZWNpZmllZCAobnVsbCkgY2FzZQotCQkJaWYgKCIiLmVxdWFscyhnZXROYW1lKCkpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuUU5BTUVfX01JU1NJTkdfTkFNRSwKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgZ2V0UmVmZXJlbmNlZENvbXBvbmVudFR5cGVEZXNjcmlwdGlvbigpIH0sCi0JCQkJCQkJCXRoaXMsCi0JCQkJCQkJCWdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXROYW1lKCkpKSB7Ci0JCQkJaWYgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKGdldE5hbWUoKSwgR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZC50aGlzLmdldFFOYW1lKCkuZ2V0TmFtZSgpKSkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfRUxFTUVOVF9ERUNMX19TVUJTVF9IRUFEX05BTUVfRVFVQUxTX05BTUUsCi0JCQkJCQkJCQl0aGlzLAotCQkJCQkJCQkJZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVSZWZlcmVuY2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCVhzZFNjaGVtYSB4c2RTY2hlbWEgPSB0aGlzLmdldFhzZFNjaGVtYSgpOwotCQkJaWYgKHhzZFNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJaWYgKHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb24oZ2V0TmFtZXNwYWNlKCksIGdldE5hbWUoKSkgPT0gbnVsbCkgewotCQkJCQltZXNzYWdlcy5hZGQoZ2V0VW5yZXNvbHZlU2NoZW1hQ29tcG9uZW50TWVzc2FnZShhc3RSb290KSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlmb3IgKEpheGJFbGVtZW50RmFjdG9yeU1ldGhvZCBlbGVtZW50RGVjbCA6IEdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2QudGhpcy5nZXRSZWdpc3RyeSgpLmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kcygpKSB7Ci0JCQkJaWYgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKGdldE5hbWUoKSwgZWxlbWVudERlY2wuZ2V0U3Vic3RpdHV0aW9uSGVhZFFOYW1lKCkuZ2V0TmFtZSgpKQotCQkJCQkJJiYgVG9vbHMudmFsdWVzQXJlRXF1YWwoZ2V0TmFtZXNwYWNlKCksIGVsZW1lbnREZWNsLmdldFN1YnN0aXR1dGlvbkhlYWRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0VMRU1FTlRfREVDTF9fU1VCU1RfSEVBRF9OT19NQVRDSElOR19FTEVNRU5UX0RFQ0wsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHsgZ2V0TmFtZXNwYWNlKCksIGdldE5hbWUoKSB9LAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBTdWJzdGl0dXRpb25IZWFkUU5hbWVBbm5vdGF0aW9uUHJveHkgCi0JCQlpbXBsZW1lbnRzIEFic3RyYWN0SmF2YVFOYW1lLkFubm90YXRpb25Qcm94eSB7Ci0JCQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCQlyZXR1cm4gCUdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2QudGhpcy5nZXRYbWxFbGVtZW50RGVjbEFubm90YXRpb24oKTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCQlYbWxFbGVtZW50RGVjbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oKTsKLQkJCXJldHVybiBhbm5vdGF0aW9uID09IG51bGwgPyBudWxsIDogYW5ub3RhdGlvbi5nZXRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmV3U3BlY2lmaWVkTmFtZXNwYWNlKSB7Ci0JCQlnZXRBbm5vdGF0aW9uKCkuc2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZShuZXdTcGVjaWZpZWROYW1lc3BhY2UpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBuYW1lc3BhY2VUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlYbWxFbGVtZW50RGVjbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oKTsKLQkJCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IGZhbHNlIDogYW5ub3RhdGlvbi5zdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCQl9Ci0JCQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVzcGFjZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKCk7Ci0JCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogYW5ub3RhdGlvbi5nZXRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlVGV4dFJhbmdlKGFzdFJvb3QpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlYbWxFbGVtZW50RGVjbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oKTsKLQkJCXJldHVybiBhbm5vdGF0aW9uID09IG51bGwgPyBudWxsIDogYW5ub3RhdGlvbi5nZXRTdWJzdGl0dXRpb25IZWFkTmFtZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdTcGVjaWZpZWROYW1lKSB7Ci0JCQlnZXRBbm5vdGF0aW9uKCkuc2V0U3Vic3RpdHV0aW9uSGVhZE5hbWUobmV3U3BlY2lmaWVkTmFtZSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlYbWxFbGVtZW50RGVjbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oKTsKLQkJCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IGZhbHNlIDogYW5ub3RhdGlvbi5zdWJzdGl0dXRpb25IZWFkTmFtZVRvdWNoZXMocG9zLCBhc3RSb290KTsKLQkJfQotCQkKLQkJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlYbWxFbGVtZW50RGVjbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oKTsKLQkJCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBhbm5vdGF0aW9uLmdldFN1YnN0aXR1dGlvbkhlYWROYW1lVGV4dFJhbmdlKGFzdFJvb3QpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW51bUNvbnN0YW50LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnVtQ29uc3RhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc5ZWU0NS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnVtQ29uc3RhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUVudW1Db25zdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVudW1Db25zdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVudW1NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KYXhiVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbnVtVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUVudW1Db25zdGFudAotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgSmF4YkVudW1Db25zdGFudCB7Ci0KLQlmaW5hbCBwcm90ZWN0ZWQgSmF2YVJlc291cmNlRW51bUNvbnN0YW50IHJlc291cmNlRW51bUNvbnN0YW50OwotCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkVmFsdWU7Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFFbnVtQ29uc3RhbnQoSmF4YkVudW1NYXBwaW5nIHBhcmVudCwgSmF2YVJlc291cmNlRW51bUNvbnN0YW50IHJlc291cmNlRW51bUNvbnN0YW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucmVzb3VyY2VFbnVtQ29uc3RhbnQgPSByZXNvdXJjZUVudW1Db25zdGFudDsKLQkJdGhpcy5zcGVjaWZpZWRWYWx1ZSA9IHRoaXMuZ2V0UmVzb3VyY2VFbnVtVmFsdWUoKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIEpheGJFbnVtTWFwcGluZyBnZXRFbnVtTWFwcGluZygpIHsKLQkJcmV0dXJuIChKYXhiRW51bU1hcHBpbmcpIGdldFBhcmVudCgpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVJlc291cmNlRW51bUNvbnN0YW50IGdldFJlc291cmNlRW51bUNvbnN0YW50KCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUVudW1Db25zdGFudDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRWYWx1ZV8odGhpcy5nZXRSZXNvdXJjZUVudW1WYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogeG1sIGVudW0gdmFsdWUgYW5ub3RhdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgWG1sRW51bVZhbHVlQW5ub3RhdGlvbiBnZXRYbWxFbnVtVmFsdWVBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbEVudW1WYWx1ZUFubm90YXRpb24pIHRoaXMuZ2V0UmVzb3VyY2VFbnVtQ29uc3RhbnQoKS5nZXROb25OdWxsQW5ub3RhdGlvbihKQVhCLlhNTF9FTlVNX1ZBTFVFKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbmFtZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlRW51bUNvbnN0YW50LmdldE5hbWUoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHZhbHVlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFNwZWNpZmllZFZhbHVlKCkgIT0gbnVsbCA/IHRoaXMuZ2V0U3BlY2lmaWVkVmFsdWUoKSA6IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5nZXRYbWxFbnVtVmFsdWVBbm5vdGF0aW9uKCkuc2V0VmFsdWUodmFsdWUpOwotCQl0aGlzLnNldFNwZWNpZmllZFZhbHVlXyh2YWx1ZSk7CQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkVmFsdWU7Ci0JCXRoaXMuc3BlY2lmaWVkVmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9WQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUVudW1WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sRW51bVZhbHVlQW5ub3RhdGlvbigpLmdldFZhbHVlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJaWYgKHZhbHVlVG91Y2hlcyhwb3MsIGFzdFJvb3QpKSB7Ci0JCQlYc2RUeXBlRGVmaW5pdGlvbjw/PiB4c2RUeXBlID0gZ2V0RW51bU1hcHBpbmcoKS5nZXRYc2RUeXBlRGVmaW5pdGlvbigpOwotCQkJaWYgKHhzZFR5cGUgIT0gbnVsbCAmJiB4c2RUeXBlLmdldEtpbmQoKSA9PSBYc2RUeXBlRGVmaW5pdGlvbi5LaW5kLlNJTVBMRSkgewotCQkJCVhzZFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGUgPSAoWHNkU2ltcGxlVHlwZURlZmluaXRpb24pIHhzZFR5cGU7Ci0JCQkJcmV0dXJuIHhzZFNpbXBsZVR5cGUuZ2V0RW51bVZhbHVlUHJvcG9zYWxzKGZpbHRlcik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHZhbHVlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0WG1sRW51bVZhbHVlQW5ub3RhdGlvbigpLnZhbHVlVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCVN0cmluZyB2YWx1ZSA9IGdldFZhbHVlKCk7Ci0JCVhzZFR5cGVEZWZpbml0aW9uPD8+IHhzZFR5cGUgPSBnZXRFbnVtTWFwcGluZygpLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCQotCQlpZiAoeHNkVHlwZSA9PSBudWxsIHx8IHhzZFR5cGUuZ2V0S2luZCgpICE9IFhzZFR5cGVEZWZpbml0aW9uLktpbmQuU0lNUExFKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICghICgoWHNkU2ltcGxlVHlwZURlZmluaXRpb24pIHhzZFR5cGUpLmdldFhTRENvbXBvbmVudCgpLmlzVmFsaWRMaXRlcmFsKHZhbHVlKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0VOVU1fVkFMVUVfX0lOVkFMSURfTEVYSUNBTF9WQUxVRSwKLQkJCQkJCQluZXcgU3RyaW5nW10geyB2YWx1ZSwgeHNkVHlwZS5nZXROYW1lKCkgfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCWdldFZhbHVlVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUVudW1Db25zdGFudCgpLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgZW51bVZhbHVlVGV4dFJhbmdlID0gZ2V0WG1sRW51bVZhbHVlQW5ub3RhdGlvbigpLmdldFZhbHVlVGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gZW51bVZhbHVlVGV4dFJhbmdlICE9IG51bGwgPyBlbnVtVmFsdWVUZXh0UmFuZ2UgOiBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVudW1NYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnVtTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjY0ZTUzLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVudW1NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbnVtQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbnVtTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRW51bUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFR5cGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhRW51bU1hcHBpbmcKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFUeXBlTWFwcGluZwotCQlpbXBsZW1lbnRzIEpheGJFbnVtTWFwcGluZyB7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRYbWxFbnVtVmFsdWU7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgRW51bUNvbnN0YW50Q29udGFpbmVyIGVudW1Db25zdGFudENvbnRhaW5lcjsKLQotCQotCXB1YmxpYyBHZW5lcmljSmF2YUVudW1NYXBwaW5nKEpheGJFbnVtIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmVudW1Db25zdGFudENvbnRhaW5lciA9IG5ldyBFbnVtQ29uc3RhbnRDb250YWluZXIoKTsKLQkJCi0JCWluaXRYbWxFbnVtVmFsdWUoKTsKLQkJaW5pdEVudW1Db25zdGFudHMoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFSZXNvdXJjZUVudW0gZ2V0SmF2YVJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VFbnVtKSBzdXBlci5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogc3luYy91cGRhdGUgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc3luY1htbEVudW1WYWx1ZSgpOwotCQlzeW5jRW51bUNvbnN0YW50cygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl1cGRhdGVFbnVtQ29uc3RhbnRzKCk7Ci0JfQotCQotCi0JLy8gKioqKiogWG1sRW51bS52YWx1ZSAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0WG1sRW51bVZhbHVlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkWG1sRW51bVZhbHVlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRYbWxFbnVtVmFsdWUgOiBERUZBVUxUX1hNTF9FTlVNX1ZBTFVFOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFhtbEVudW1WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkWG1sRW51bVZhbHVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRYbWxFbnVtVmFsdWUoU3RyaW5nIHhtbEVudW1WYWx1ZSkgewotCQlnZXRYbWxFbnVtQW5ub3RhdGlvbigpLnNldFZhbHVlKHhtbEVudW1WYWx1ZSk7Ci0JCXNldFNwZWNpZmllZFhtbEVudW1WYWx1ZV8oeG1sRW51bVZhbHVlKTsJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFhtbEVudW1WYWx1ZV8oU3RyaW5nIHhtbEVudW1WYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRYbWxFbnVtVmFsdWU7Ci0JCXRoaXMuc3BlY2lmaWVkWG1sRW51bVZhbHVlID0geG1sRW51bVZhbHVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9YTUxfRU5VTV9WQUxVRV9QUk9QRVJUWSwgb2xkLCB4bWxFbnVtVmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkWG1sRW51bVZhbHVlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkWG1sRW51bVZhbHVlICE9IG51bGwpID8gCi0JCQkJZ2V0WG1sRW51bUFubm90YXRpb24oKS5nZXRGdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lKCkKLQkJCQk6IERFRkFVTFRfWE1MX0VOVU1fVkFMVUU7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxFbnVtQW5ub3RhdGlvbiBnZXRYbWxFbnVtQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxFbnVtQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldE5vbk51bGxBbm5vdGF0aW9uKEpBWEIuWE1MX0VOVU0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlWG1sRW51bVZhbHVlKCkgewotCQlyZXR1cm4gZ2V0WG1sRW51bUFubm90YXRpb24oKS5nZXRWYWx1ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0WG1sRW51bVZhbHVlKCkgewotCQl0aGlzLnNwZWNpZmllZFhtbEVudW1WYWx1ZSA9IGdldFJlc291cmNlWG1sRW51bVZhbHVlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNYbWxFbnVtVmFsdWUoKSB7Ci0JCXNldFNwZWNpZmllZFhtbEVudW1WYWx1ZV8oZ2V0UmVzb3VyY2VYbWxFbnVtVmFsdWUoKSk7Ci0JfQotCQotCQotCS8vICoqKioqIGVudW0gY29uc3RhbnRzICoqKioqCi0JCi0JcHVibGljIEl0ZXJhYmxlPEpheGJFbnVtQ29uc3RhbnQ+IGdldEVudW1Db25zdGFudHMoKSB7Ci0JCXJldHVybiB0aGlzLmVudW1Db25zdGFudENvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRFbnVtQ29uc3RhbnRzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW51bUNvbnN0YW50Q29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVudW1Db25zdGFudHMoKSB7Ci0JCXRoaXMuZW51bUNvbnN0YW50Q29udGFpbmVyLmluaXRpYWxpemUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY0VudW1Db25zdGFudHMoKSB7Ci0JCXRoaXMuZW51bUNvbnN0YW50Q29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRW51bUNvbnN0YW50cygpIHsKLQkJdGhpcy5lbnVtQ29uc3RhbnRDb250YWluZXIudXBkYXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQ+IGdldFJlc291cmNlRW51bUNvbnN0YW50cygpIHsKLQkJcmV0dXJuIGdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRFbnVtQ29uc3RhbnRzKCk7Ci0JfQotCQotCXByaXZhdGUgSmF4YkVudW1Db25zdGFudCBidWlsZEVudW1Db25zdGFudChKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQgcmVzb3VyY2VFbnVtQ29uc3RhbnQpIHsKLQkJcmV0dXJuIGdldEZhY3RvcnkoKS5idWlsZEphdmFFbnVtQ29uc3RhbnQodGhpcywgcmVzb3VyY2VFbnVtQ29uc3RhbnQpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Tm9uVHJhbnNpZW50UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpIHsKLQkJaWYgKHRoaXMuc3BlY2lmaWVkWG1sRW51bVZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJCQkJc3VwZXIuZ2V0Tm9uVHJhbnNpZW50UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpLAotCQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlKGdldEZ1bGx5UXVhbGlmaWVkWG1sRW51bVZhbHVlKCkpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Tm9uVHJhbnNpZW50UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpOwotCX0KLQkKLQlwdWJsaWMgWHNkU2ltcGxlVHlwZURlZmluaXRpb24gZ2V0VmFsdWVYc2RUeXBlRGVmaW5pdGlvbigpIHsKLQkJWHNkVHlwZURlZmluaXRpb24geHNkVHlwZSA9IGdldFZhbHVlWHNkVHlwZURlZmluaXRpb25fKCk7Ci0JCWlmICh4c2RUeXBlID09IG51bGwgfHwgeHNkVHlwZS5nZXRLaW5kKCkgIT0gWHNkVHlwZURlZmluaXRpb24uS2luZC5TSU1QTEUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoWHNkU2ltcGxlVHlwZURlZmluaXRpb24pIHhzZFR5cGU7Ci0JfQotCQotCXByb3RlY3RlZCBYc2RUeXBlRGVmaW5pdGlvbiBnZXRWYWx1ZVhzZFR5cGVEZWZpbml0aW9uXygpIHsKLQkJU3RyaW5nIGZxWG1sRW51bVZhbHVlID0gZ2V0RnVsbHlRdWFsaWZpZWRYbWxFbnVtVmFsdWUoKTsKLQkJCi0JCUpheGJUeXBlIGpheGJUeXBlID0gZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKGZxWG1sRW51bVZhbHVlKTsKLQkJaWYgKGpheGJUeXBlICE9IG51bGwpIHsKLQkJCUpheGJUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IGpheGJUeXBlLmdldE1hcHBpbmcoKTsKLQkJCWlmICh0eXBlTWFwcGluZyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHR5cGVNYXBwaW5nLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgdHlwZU1hcHBpbmcgPSBnZXRKYXhiUHJvamVjdCgpLmdldFBsYXRmb3JtKCkuZ2V0RGVmaW5pdGlvbigpLmdldFNjaGVtYVR5cGVNYXBwaW5nKGZxWG1sRW51bVZhbHVlKTsKLQkJCWlmICh0eXBlTWFwcGluZyAhPSBudWxsKSB7Ci0JCQkJWHNkU2NoZW1hIHhzZFNjaGVtYSA9IFhzZFV0aWwuZ2V0U2NoZW1hRm9yU2NoZW1hKCk7Ci0JCQkJcmV0dXJuIHhzZFNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbih0eXBlTWFwcGluZyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCWZvciAoSmF4YkVudW1Db25zdGFudCBjb25zdGFudCA6IGdldEVudW1Db25zdGFudHMoKSkgewotCQkJcmVzdWx0ID0gY29uc3RhbnQuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJdmFsaWRhdGVYbWxUeXBlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXZhbGlkYXRlWG1sRW51bShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJZm9yIChKYXhiRW51bUNvbnN0YW50IGNvbnN0YW50IDogZ2V0RW51bUNvbnN0YW50cygpKSB7Ci0JCQljb25zdGFudC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlWG1sVHlwZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlYbWxUeXBlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sVHlwZUFubm90YXRpb24oKTsKLQkJCi0JCWlmIChhbm5vdGF0aW9uLmdldEZhY3RvcnlDbGFzcygpICE9IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1RZUEVfX0ZBQ1RPUllfQ0xBU1NfSUdOT1JFRF9GT1JfRU5VTSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCWFubm90YXRpb24uZ2V0RmFjdG9yeUNsYXNzVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCX0KLQkJCi0JCWlmIChhbm5vdGF0aW9uLmdldEZhY3RvcnlNZXRob2QoKSAhPSBudWxsKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9UWVBFX19GQUNUT1JZX01FVEhPRF9JR05PUkVEX0ZPUl9FTlVNLAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJYW5ub3RhdGlvbi5nZXRGYWN0b3J5TWV0aG9kVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCX0KLQkJCi0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KGFubm90YXRpb24uZ2V0UHJvcE9yZGVyKCkpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9UWVBFX19QUk9QX09SREVSX0lHTk9SRURfRk9SX0VOVU0sCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlhbm5vdGF0aW9uLmdldFByb3BPcmRlclRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlWG1sRW51bShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlYc2RTY2hlbWEgeHNkU2NoZW1hID0gZ2V0SmF4YlBhY2thZ2UoKS5nZXRYc2RTY2hlbWEoKTsKLQkJWHNkVHlwZURlZmluaXRpb24geHNkVHlwZSA9IGdldFZhbHVlWHNkVHlwZURlZmluaXRpb25fKCk7Ci0JCQotCQlpZiAoKHhzZFNjaGVtYSAhPSBudWxsICYmIHhzZFR5cGUgPT0gbnVsbCkKLQkJCQl8fCAoeHNkVHlwZSAhPSBudWxsICYmIHhzZFR5cGUuZ2V0S2luZCgpICE9IFhzZFR5cGVEZWZpbml0aW9uLktpbmQuU0lNUExFKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0VOVU1fX05PTl9TSU1QTEVfU0NIRU1BX1RZUEUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHsgZ2V0RnVsbHlRdWFsaWZpZWRYbWxFbnVtVmFsdWUoKSB9LAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJZ2V0WG1sRW51bVZhbHVlVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRYbWxFbnVtVmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldFhtbEVudW1Bbm5vdGF0aW9uKCkuZ2V0VmFsdWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCQotCS8qKgotCSAqIGVudW0gY29uc3RhbnQgY29udGFpbmVyIGFkYXB0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgRW51bUNvbnN0YW50Q29udGFpbmVyCi0JCQlleHRlbmRzIENvbnRleHRDb2xsZWN0aW9uQ29udGFpbmVyPEpheGJFbnVtQ29uc3RhbnQsIEphdmFSZXNvdXJjZUVudW1Db25zdGFudD4gewotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIEVOVU1fQ09OU1RBTlRTX0NPTExFQ1RJT047Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSmF4YkVudW1Db25zdGFudCBidWlsZENvbnRleHRFbGVtZW50KEphdmFSZXNvdXJjZUVudW1Db25zdGFudCByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUVudW1NYXBwaW5nLnRoaXMuYnVpbGRFbnVtQ29uc3RhbnQocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQ+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFFbnVtTWFwcGluZy50aGlzLmdldFJlc291cmNlRW51bUNvbnN0YW50cygpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEphdmFSZXNvdXJjZUVudW1Db25zdGFudCBnZXRSZXNvdXJjZUVsZW1lbnQoSmF4YkVudW1Db25zdGFudCBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldFJlc291cmNlRW51bUNvbnN0YW50KCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKYXhiQ2xhc3MuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUpheGJDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWEwYTlkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUpheGJDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFJlZ2lzdHJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFKYXhiQ2xhc3MKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFUeXBlIAotCQlpbXBsZW1lbnRzIEpheGJDbGFzcyB7Ci0JCi0JcHJvdGVjdGVkIFhtbFJlZ2lzdHJ5IHhtbFJlZ2lzdHJ5OwotCQotCQotCXB1YmxpYyBHZW5lcmljSmF2YUpheGJDbGFzcyhKYXhiQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlzdXBlcihwYXJlbnQsIHJlc291cmNlVHlwZSk7Ci0JCWluaXRYbWxSZWdpc3RyeSgpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVJlc291cmNlVHlwZSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gKEphdmFSZXNvdXJjZVR5cGUpIHN1cGVyLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQl9Ci0JCi0JcHVibGljIEtpbmQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIEpheGJUeXBlLktpbmQuQ0xBU1M7Ci0JfQotCQotCQotCS8vICoqKioqIHN5bmMvdXBkYXRlICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlzeW5jWG1sUmVnaXN0cnkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdXBkYXRlWG1sUmVnaXN0cnkoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWFwcGluZyAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiQ2xhc3NNYXBwaW5nIGdldE1hcHBpbmcoKSB7Ci0JCXJldHVybiAoSmF4YkNsYXNzTWFwcGluZykgc3VwZXIuZ2V0TWFwcGluZygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF4YkNsYXNzTWFwcGluZyBidWlsZE1hcHBpbmcoKSB7Ci0JCXJldHVybiBnZXRGYWN0b3J5KCkuYnVpbGRKYXhiQ2xhc3NNYXBwaW5nKHRoaXMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NwZWNpZmllZE1hcHBlZCgpIHsKLQkJcmV0dXJuIGdldFhtbFR5cGVBbm5vdGF0aW9uKCkgIT0gbnVsbAotCQkJCXx8IGdldFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbigpICE9IG51bGwKLQkJCQl8fCBnZXRYbWxUcmFuc2llbnRBbm5vdGF0aW9uKCkgIT0gbnVsbDsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sUmVnaXN0cnkgKioqKioKLQkKLQlwdWJsaWMgWG1sUmVnaXN0cnkgZ2V0WG1sUmVnaXN0cnkoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFJlZ2lzdHJ5OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxSZWdpc3RyeV8oWG1sUmVnaXN0cnkgeG1sUmVnaXN0cnkpIHsKLQkJWG1sUmVnaXN0cnkgb2xkID0gdGhpcy54bWxSZWdpc3RyeTsKLQkJdGhpcy54bWxSZWdpc3RyeSA9IHhtbFJlZ2lzdHJ5OwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9SRUdJU1RSWV9QUk9QRVJUWSwgb2xkLCB4bWxSZWdpc3RyeSk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxSZWdpc3RyeUFubm90YXRpb24gZ2V0WG1sUmVnaXN0cnlBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbFJlZ2lzdHJ5QW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oSkFYQi5YTUxfUkVHSVNUUlkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sUmVnaXN0cnkgYnVpbGRYbWxSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGdldEZhY3RvcnkoKS5idWlsZFhtbFJlZ2lzdHJ5KHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0WG1sUmVnaXN0cnkoKSB7Ci0JCWlmIChnZXRYbWxSZWdpc3RyeUFubm90YXRpb24oKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbFJlZ2lzdHJ5ID0gYnVpbGRYbWxSZWdpc3RyeSgpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNYbWxSZWdpc3RyeSgpIHsKLQkJWG1sUmVnaXN0cnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxSZWdpc3RyeUFubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJaWYgKHRoaXMueG1sUmVnaXN0cnkgIT0gbnVsbCkgewotCQkJCXRoaXMueG1sUmVnaXN0cnkuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0WG1sUmVnaXN0cnlfKGJ1aWxkWG1sUmVnaXN0cnkoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy54bWxSZWdpc3RyeSAhPSBudWxsKSB7Ci0JCQlzZXRYbWxSZWdpc3RyeV8obnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlWG1sUmVnaXN0cnkoKSB7Ci0JCWlmICh0aGlzLnhtbFJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCXRoaXMueG1sUmVnaXN0cnkudXBkYXRlKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlpZiAodGhpcy54bWxSZWdpc3RyeSAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbFJlZ2lzdHJ5LnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKYXhiRW51bS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSmF4YkVudW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmNTM4Ny4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKYXhiRW51bS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbnVtTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVudW1Bbm5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUpheGJFbnVtCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhVHlwZQotCQlpbXBsZW1lbnRzIEpheGJFbnVtIHsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFKYXhiRW51bShKYXhiQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhUmVzb3VyY2VFbnVtIHJlc291cmNlVHlwZSkgewotCQlzdXBlcihwYXJlbnQsIHJlc291cmNlVHlwZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUmVzb3VyY2VFbnVtIGdldEphdmFSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiAoSmF2YVJlc291cmNlRW51bSkgc3VwZXIuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCX0KLQkKLQlwdWJsaWMgS2luZCBnZXRLaW5kKCkgewotCQlyZXR1cm4gSmF4YlR5cGUuS2luZC5FTlVNOwotCX0KLQkKLQkKLQkvLyAqKioqKiBtYXBwaW5nICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpheGJFbnVtTWFwcGluZyBnZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gKEpheGJFbnVtTWFwcGluZykgc3VwZXIuZ2V0TWFwcGluZygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF4YkVudW1NYXBwaW5nIGJ1aWxkTWFwcGluZygpIHsKLQkJcmV0dXJuIGdldEZhY3RvcnkoKS5idWlsZEpheGJFbnVtTWFwcGluZyh0aGlzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTcGVjaWZpZWRNYXBwZWQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1NwZWNpZmllZE1hcHBlZCgpIAotCQkJCXx8IGdldFhtbEVudW1Bbm5vdGF0aW9uKCkgIT0gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEVudW1Bbm5vdGF0aW9uIGdldFhtbEVudW1Bbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbEVudW1Bbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTlVNKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyNzgxOS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPEFubm90YXRpb24+IHsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBhY2thZ2VJbmZvLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQYWNrYWdlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjIxYWEyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBhY2thZ2VJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3ViTGlzdEl0ZXJhYmxlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQWNjZXNzT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sTnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc29yVHlwZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFQYWNrYWdlSW5mbwotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgSmF4YlBhY2thZ2VJbmZvIHsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZTsKLQotCXByb3RlY3RlZCBmaW5hbCBYbWxTY2hlbWEgeG1sU2NoZW1hOwotCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc1R5cGUgc3BlY2lmaWVkQWNjZXNzVHlwZTsKLQotCXByb3RlY3RlZCBYbWxBY2Nlc3NPcmRlciBzcGVjaWZpZWRBY2Nlc3NPcmRlcjsKLQotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0TGlzdENvbnRhaW5lcjxYbWxTY2hlbWFUeXBlLCBYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbj4geG1sU2NoZW1hVHlwZUNvbnRhaW5lcjsKLQotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0TGlzdENvbnRhaW5lcjxYbWxKYXZhVHlwZUFkYXB0ZXIsIFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24+IHhtbEphdmFUeXBlQWRhcHRlckNvbnRhaW5lcjsKLQotCXB1YmxpYyBHZW5lcmljSmF2YVBhY2thZ2VJbmZvKEpheGJQYWNrYWdlIHBhcmVudCwgSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5yZXNvdXJjZVBhY2thZ2UgPSByZXNvdXJjZVBhY2thZ2U7Ci0JCXRoaXMueG1sU2NoZW1hID0gZ2V0RmFjdG9yeSgpLmJ1aWxkSmF2YVhtbFNjaGVtYSh0aGlzKTsKLQkJdGhpcy5zcGVjaWZpZWRBY2Nlc3NUeXBlID0gZ2V0UmVzb3VyY2VBY2Nlc3NUeXBlKCk7Ci0JCXRoaXMuc3BlY2lmaWVkQWNjZXNzT3JkZXIgPSBnZXRSZXNvdXJjZUFjY2Vzc09yZGVyKCk7Ci0JCXRoaXMueG1sU2NoZW1hVHlwZUNvbnRhaW5lciA9IHRoaXMuYnVpbGRYbWxTY2hlbWFUeXBlQ29udGFpbmVyKCk7Ci0JCXRoaXMueG1sSmF2YVR5cGVBZGFwdGVyQ29udGFpbmVyID0gdGhpcy5idWlsZFhtbEphdmFUeXBlQWRhcHRlckNvbnRhaW5lcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoKSB7Ci0JCXJldHVybiAoSmF4YlBhY2thZ2UpIGdldFBhcmVudCgpOwotCX0KLQkKLQotCS8vICoqKioqKioqKioqKioqKiogQWJzdHJhY3RKYXhiTm9kZSBpbXBsICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlUGFja2FnZS5nZXRGaWxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMueG1sU2NoZW1hLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRBY2Nlc3NUeXBlXyh0aGlzLmdldFJlc291cmNlQWNjZXNzVHlwZSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRBY2Nlc3NPcmRlcl8odGhpcy5nZXRSZXNvdXJjZUFjY2Vzc09yZGVyKCkpOwotCQl0aGlzLnN5bmNYbWxTY2hlbWFUeXBlcygpOwotCQl0aGlzLnN5bmNYbWxKYXZhVHlwZUFkYXB0ZXJzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy54bWxTY2hlbWEudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlWG1sU2NoZW1hVHlwZXMoKTsKLQkJdGhpcy51cGRhdGVYbWxKYXZhVHlwZUFkYXB0ZXJzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEpheGJQYWNrYWdlSW5mbyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YVJlc291cmNlUGFja2FnZSBnZXRSZXNvdXJjZVBhY2thZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlUGFja2FnZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHhtbCBzY2hlbWEgKioqKioqKioqKgotCi0JcHVibGljIFhtbFNjaGVtYSBnZXRYbWxTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFNjaGVtYTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGFjY2VzcyB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBYbWxBY2Nlc3NUeXBlIGdldEFjY2Vzc1R5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRBY2Nlc3NUeXBlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRBY2Nlc3NUeXBlIDogdGhpcy5nZXREZWZhdWx0QWNjZXNzVHlwZSgpOwotCX0KLQotCXB1YmxpYyBYbWxBY2Nlc3NUeXBlIGdldFNwZWNpZmllZEFjY2Vzc1R5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEFjY2Vzc1R5cGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEFjY2Vzc1R5cGUoWG1sQWNjZXNzVHlwZSBhY2Nlc3MpIHsKLQkJdGhpcy5nZXRBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKCkuc2V0VmFsdWUoWG1sQWNjZXNzVHlwZS50b0phdmFSZXNvdXJjZU1vZGVsKGFjY2VzcykpOwotCQl0aGlzLnNldFNwZWNpZmllZEFjY2Vzc1R5cGVfKGFjY2Vzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzVHlwZV8oWG1sQWNjZXNzVHlwZSBhY2Nlc3MpIHsKLQkJWG1sQWNjZXNzVHlwZSBvbGQgPSB0aGlzLnNwZWNpZmllZEFjY2Vzc1R5cGU7Ci0JCXRoaXMuc3BlY2lmaWVkQWNjZXNzVHlwZSA9IGFjY2VzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9BQ0NFU1NfVFlQRV9QUk9QRVJUWSwgb2xkLCBhY2Nlc3MpOwotCX0KLQotCXB1YmxpYyBYbWxBY2Nlc3NUeXBlIGdldERlZmF1bHRBY2Nlc3NUeXBlKCkgewotCQlyZXR1cm4gWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sQWNjZXNzVHlwZSBnZXRSZXNvdXJjZUFjY2Vzc1R5cGUoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbCh0aGlzLmdldEFjY2Vzc29yVHlwZUFubm90YXRpb24oKS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbiBnZXRBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24pIHRoaXMucmVzb3VyY2VQYWNrYWdlLmdldE5vbk51bGxBbm5vdGF0aW9uKEpBWEIuWE1MX0FDQ0VTU09SX1RZUEUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3Mgb3JkZXIgKioqKioqKioqKgotCi0JcHVibGljIFhtbEFjY2Vzc09yZGVyIGdldEFjY2Vzc09yZGVyKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkQWNjZXNzT3JkZXIgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZEFjY2Vzc09yZGVyIDogdGhpcy5nZXREZWZhdWx0QWNjZXNzT3JkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgWG1sQWNjZXNzT3JkZXIgZ2V0U3BlY2lmaWVkQWNjZXNzT3JkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEFjY2Vzc09yZGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3NPcmRlcihYbWxBY2Nlc3NPcmRlciBhY2Nlc3NPcmRlcikgewotCQl0aGlzLmdldEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uKCkuc2V0VmFsdWUoWG1sQWNjZXNzT3JkZXIudG9KYXZhUmVzb3VyY2VNb2RlbChhY2Nlc3NPcmRlcikpOwotCQl0aGlzLnNldFNwZWNpZmllZEFjY2Vzc09yZGVyXyhhY2Nlc3NPcmRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzT3JkZXJfKFhtbEFjY2Vzc09yZGVyIGFjY2Vzc09yZGVyKSB7Ci0JCVhtbEFjY2Vzc09yZGVyIG9sZCA9IHRoaXMuc3BlY2lmaWVkQWNjZXNzT3JkZXI7Ci0JCXRoaXMuc3BlY2lmaWVkQWNjZXNzT3JkZXIgPSBhY2Nlc3NPcmRlcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9BQ0NFU1NfT1JERVJfUFJPUEVSVFksIG9sZCwgYWNjZXNzT3JkZXIpOwotCX0KLQotCXB1YmxpYyBYbWxBY2Nlc3NPcmRlciBnZXREZWZhdWx0QWNjZXNzT3JkZXIoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NPcmRlci5VTkRFRklORUQ7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxBY2Nlc3NPcmRlciBnZXRSZXNvdXJjZUFjY2Vzc09yZGVyKCkgewotCQlyZXR1cm4gWG1sQWNjZXNzT3JkZXIuZnJvbUphdmFSZXNvdXJjZU1vZGVsKHRoaXMuZ2V0QWNjZXNzb3JPcmRlckFubm90YXRpb24oKS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24gZ2V0QWNjZXNzb3JPcmRlckFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24pIHRoaXMucmVzb3VyY2VQYWNrYWdlLmdldE5vbk51bGxBbm5vdGF0aW9uKEpBWEIuWE1MX0FDQ0VTU09SX09SREVSKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogeG1sIHNjaGVtYSB0eXBlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFhtbFNjaGVtYVR5cGU+IGdldFhtbFNjaGVtYVR5cGVzKCkgewotCQlyZXR1cm4gdGhpcy54bWxTY2hlbWFUeXBlQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sU2NoZW1hVHlwZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy54bWxTY2hlbWFUeXBlQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgWG1sU2NoZW1hVHlwZSBhZGRYbWxTY2hlbWFUeXBlKGludCBpbmRleCkgewotCQlYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKSB0aGlzLnJlc291cmNlUGFja2FnZS5hZGRBbm5vdGF0aW9uKGluZGV4LCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCXJldHVybiB0aGlzLnhtbFNjaGVtYVR5cGVDb250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbFNjaGVtYVR5cGUoWG1sU2NoZW1hVHlwZSB4bWxTY2hlbWFUeXBlKSB7Ci0JCXRoaXMucmVtb3ZlWG1sU2NoZW1hVHlwZSh0aGlzLnhtbFNjaGVtYVR5cGVDb250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KHhtbFNjaGVtYVR5cGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxTY2hlbWFUeXBlKGludCBpbmRleCkgewotCQl0aGlzLnJlc291cmNlUGFja2FnZS5yZW1vdmVBbm5vdGF0aW9uKGluZGV4LCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCXRoaXMueG1sU2NoZW1hVHlwZUNvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVhtbFNjaGVtYVR5cGUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5yZXNvdXJjZVBhY2thZ2UubW92ZUFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCXRoaXMueG1sU2NoZW1hVHlwZUNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sU2NoZW1hVHlwZSBidWlsZFhtbFNjaGVtYVR5cGUoWG1sU2NoZW1hVHlwZUFubm90YXRpb24geG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVBhY2thZ2VYbWxTY2hlbWFUeXBlKHRoaXMsIHhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sU2NoZW1hVHlwZXMoKSB7Ci0JCXRoaXMueG1sU2NoZW1hVHlwZUNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlWG1sU2NoZW1hVHlwZXMoKSB7Ci0JCXRoaXMueG1sU2NoZW1hVHlwZUNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uPiBnZXRYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgU3ViTGlzdEl0ZXJhYmxlV3JhcHBlcjxOZXN0YWJsZUFubm90YXRpb24sIFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uPigKLQkJCQl0aGlzLnJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9ucyhKQVhCLlhNTF9TQ0hFTUFfVFlQRSkpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxYbWxTY2hlbWFUeXBlLCBYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbj4gYnVpbGRYbWxTY2hlbWFUeXBlQ29udGFpbmVyKCkgewotCQlYbWxTY2hlbWFUeXBlQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBYbWxTY2hlbWFUeXBlQ29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHhtbCBqYXZhIHR5cGUgYWRhcHRlcnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxYbWxKYXZhVHlwZUFkYXB0ZXI+IGdldFhtbEphdmFUeXBlQWRhcHRlcnMoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEphdmFUeXBlQWRhcHRlckNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFhtbEphdmFUeXBlQWRhcHRlcnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy54bWxKYXZhVHlwZUFkYXB0ZXJDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBYbWxKYXZhVHlwZUFkYXB0ZXIgYWRkWG1sSmF2YVR5cGVBZGFwdGVyKGludCBpbmRleCkgewotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgdGhpcy5yZXNvdXJjZVBhY2thZ2UuYWRkQW5ub3RhdGlvbihpbmRleCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlyZXR1cm4gdGhpcy54bWxKYXZhVHlwZUFkYXB0ZXJDb250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbEphdmFUeXBlQWRhcHRlcihYbWxKYXZhVHlwZUFkYXB0ZXIgeG1sU2NoZW1hVHlwZSkgewotCQl0aGlzLnJlbW92ZVhtbEphdmFUeXBlQWRhcHRlcih0aGlzLnhtbEphdmFUeXBlQWRhcHRlckNvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoeG1sU2NoZW1hVHlwZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbEphdmFUeXBlQWRhcHRlcihpbnQgaW5kZXgpIHsKLQkJdGhpcy5yZXNvdXJjZVBhY2thZ2UucmVtb3ZlQW5ub3RhdGlvbihpbmRleCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQl0aGlzLnhtbEphdmFUeXBlQWRhcHRlckNvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVhtbEphdmFUeXBlQWRhcHRlcihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLnJlc291cmNlUGFja2FnZS5tb3ZlQW5ub3RhdGlvbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJdGhpcy54bWxKYXZhVHlwZUFkYXB0ZXJDb250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbEphdmFUeXBlQWRhcHRlciBidWlsZFhtbEphdmFUeXBlQWRhcHRlcihYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVBhY2thZ2VYbWxKYXZhVHlwZUFkYXB0ZXIodGhpcywgeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlWG1sSmF2YVR5cGVBZGFwdGVycygpIHsKLQkJdGhpcy54bWxKYXZhVHlwZUFkYXB0ZXJDb250YWluZXIudXBkYXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY1htbEphdmFUeXBlQWRhcHRlcnMoKSB7Ci0JCXRoaXMueG1sSmF2YVR5cGVBZGFwdGVyQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24+IGdldFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IFN1Ykxpc3RJdGVyYWJsZVdyYXBwZXI8TmVzdGFibGVBbm5vdGF0aW9uLCBYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uPigKLQkJCQl0aGlzLnJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9ucyhKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUikpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxYbWxKYXZhVHlwZUFkYXB0ZXIsIFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24+IGJ1aWxkWG1sSmF2YVR5cGVBZGFwdGVyQ29udGFpbmVyKCkgewotCQlYbWxKYXZhVHlwZUFkYXB0ZXJDb250YWluZXIgY29udGFpbmVyID0gbmV3IFhtbEphdmFUeXBlQWRhcHRlckNvbnRhaW5lcigpOwotCQljb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQkKLQlwdWJsaWMgWG1sSmF2YVR5cGVBZGFwdGVyIGdldFhtbEphdmFUeXBlQWRhcHRlcihTdHJpbmcgYm91bmRUeXBlTmFtZSkgewotCQlmb3IgKFhtbEphdmFUeXBlQWRhcHRlciBhZGFwdGVyIDogZ2V0WG1sSmF2YVR5cGVBZGFwdGVycygpKSB7Ci0JCQlpZiAoYm91bmRUeXBlTmFtZS5lcXVhbHMoYWRhcHRlci5nZXRGdWxseVF1YWxpZmllZFR5cGUoKSkpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQlwcm90ZWN0ZWQgQ29tcGlsYXRpb25Vbml0IGJ1aWxkQVNUUm9vdCgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VQYWNrYWdlLmdldEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCgpLmJ1aWxkQVNUUm9vdCgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZUZvclByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0JCWlmICh0aGlzLnhtbFNjaGVtYSAhPSBudWxsKSB7Ci0JCQlmb3IgKFhtbE5zIHhtbG5zIDogdGhpcy54bWxTY2hlbWEuZ2V0WG1sTnNQcmVmaXhlcygpKSB7Ci0JCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCh4bWxucy5nZXRQcmVmaXgoKSwgcHJlZml4KSkgewotCQkJCQlyZXR1cm4geG1sbnMuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeEZvck5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCWlmICh0aGlzLnhtbFNjaGVtYSAhPSBudWxsKSB7Ci0JCQlmb3IgKFhtbE5zIHhtbG5zIDogdGhpcy54bWxTY2hlbWEuZ2V0WG1sTnNQcmVmaXhlcygpKSB7Ci0JCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCh4bWxucy5nZXROYW1lc3BhY2VVUkkoKSwgbmFtZXNwYWNlKSkgewotCQkJCQlyZXR1cm4geG1sbnMuZ2V0UHJlZml4KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKioKLQkKLQkvL1RoaXMgZG9lc24ndCBhY3R1YWxseSB3b3JrIHlldCBiZWNhdXNlIG9mIEpEVCBidWcgKGJ1Z3MuZWNsaXBzZS5vcmcvMzI2NjEwKQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCi0JCWdldEpheGJQcm9qZWN0KCkuZ2V0U2NoZW1hTGlicmFyeSgpLnJlZnJlc2hTY2hlbWEoZ2V0SmF4YlBhY2thZ2UoKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJcmVzdWx0ID0gdGhpcy54bWxTY2hlbWEuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9CQkKLQkJZm9yIChYbWxTY2hlbWFUeXBlIHhtbFNjaGVtYVR5cGUgOiB0aGlzLmdldFhtbFNjaGVtYVR5cGVzKCkpIHsKLQkJCXJlc3VsdCA9IHhtbFNjaGVtYVR5cGUuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKCFDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlUGFja2FnZS5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWlmIChyZXBvcnRlci5pc0NhbmNlbGxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCUlGaWxlIGZpbGUgPSB0aGlzLnJlc291cmNlUGFja2FnZS5nZXRGaWxlKCk7Ci0JCS8vICdmaWxlJyB3aWxsIGJlIG51bGwgaWYgdGhlIHR5cGUgaXMgImV4dGVybmFsIiBhbmQgYmluYXJ5OwotCQkvLyB0aGUgZmlsZSB3aWxsIGJlIGluIGEgZGlmZmVyZW50IHByb2plY3QgaWYgdGhlIHR5cGUgaXMgImV4dGVybmFsIiBhbmQgc291cmNlOwotCQkvLyB0aGUgdHlwZSB3aWxsIGJlIGJpbmFyeSBpZiBpdCBpcyBpbiBhIEpBUiBpbiB0aGUgY3VycmVudCBwcm9qZWN0Ci0JCWlmICgoZmlsZSAhPSBudWxsKSAKLQkJCQkmJiBmaWxlLmdldFByb2plY3QoKS5lcXVhbHMoZ2V0SmF4YlByb2plY3QoKS5nZXRQcm9qZWN0KCkpIAotCQkJCSYmICh0aGlzLnJlc291cmNlUGFja2FnZSBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpKSB7Ci0JCQkvLyBidWlsZCB0aGUgQVNUIHJvb3QgaGVyZSB0byBwYXNzIGRvd24KLQkJCXRoaXMudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCB0aGlzLmJ1aWxkQVNUUm9vdCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQl0aGlzLnhtbFNjaGVtYS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJZm9yIChYbWxTY2hlbWFUeXBlIHNjaGVtYVR5cGUgOiBnZXRYbWxTY2hlbWFUeXBlcygpKSB7Ci0JCQlzY2hlbWFUeXBlLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQkJCi0JCWZvciAoWG1sSmF2YVR5cGVBZGFwdGVyIGFkYXB0ZXIgOiBnZXRYbWxKYXZhVHlwZUFkYXB0ZXJzKCkpIHsKLQkJCWFkYXB0ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogeG1sIHNjaGVtYSB0eXBlIGNvbnRhaW5lcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBYbWxTY2hlbWFUeXBlQ29udGFpbmVyCi0JCWV4dGVuZHMgQ29udGV4dExpc3RDb250YWluZXI8WG1sU2NoZW1hVHlwZSwgWG1sU2NoZW1hVHlwZUFubm90YXRpb24+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gWE1MX1NDSEVNQV9UWVBFU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sU2NoZW1hVHlwZSBidWlsZENvbnRleHRFbGVtZW50KFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhUGFja2FnZUluZm8udGhpcy5idWlsZFhtbFNjaGVtYVR5cGUocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVBhY2thZ2VJbmZvLnRoaXMuZ2V0WG1sU2NoZW1hVHlwZUFubm90YXRpb25zKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbiBnZXRSZXNvdXJjZUVsZW1lbnQoWG1sU2NoZW1hVHlwZSBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB4bWwgamF2YSB0eXBlIGFkYXB0ZXIgY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFhtbEphdmFUeXBlQWRhcHRlckNvbnRhaW5lcgotCQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxYbWxKYXZhVHlwZUFkYXB0ZXIsIFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24+IHsKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBYTUxfSkFWQV9UWVBFX0FEQVBURVJTX0xJU1Q7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sSmF2YVR5cGVBZGFwdGVyIGJ1aWxkQ29udGV4dEVsZW1lbnQoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVBhY2thZ2VJbmZvLnRoaXMuYnVpbGRYbWxKYXZhVHlwZUFkYXB0ZXIocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVBhY2thZ2VJbmZvLnRoaXMuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbnMoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGdldFJlc291cmNlRWxlbWVudChYbWxKYXZhVHlwZUFkYXB0ZXIgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRBbm5vdGF0aW9uKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQYWNrYWdlWG1sSmF2YVR5cGVBZGFwdGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQYWNrYWdlWG1sSmF2YVR5cGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZjUzOTYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGFja2FnZVhtbEphdmFUeXBlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhUGFja2FnZVhtbEphdmFUeXBlQWRhcHRlcgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhWG1sSmF2YVR5cGVBZGFwdGVyCi17Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFQYWNrYWdlWG1sSmF2YVR5cGVBZGFwdGVyKEpheGJQYWNrYWdlSW5mbyBwYXJlbnQsIFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gcmVzb3VyY2UpIHsKLQkJc3VwZXIocGFyZW50LCByZXNvdXJjZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRUeXBlKCkgewotCQkvL3RoZXJlIGlzIG5vIGRlZmF1bHQgdHlwZSBvbiBhIHBhY2thZ2UgbGV2ZWwgWG1sSmF2YVR5cGVBZGFwdGVyLCBpdCBtdXN0IGJlIHNwZWNpZmllZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQlpZiAoZ2V0U3BlY2lmaWVkVHlwZSgpID09IG51bGwgfHwgZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCkuZXF1YWxzKFhtbEphdmFUeXBlQWRhcHRlci5ERUZBVUxUX1RZUEUpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuUEFDS0FHRV9YTUxfSkFWQV9UWVBFX0FEQVBURVJfVFlQRV9OT1RfU1BFQ0lGSUVELAotCQkJCQl0aGlzLAotCQkJCQlnZXRBbm5vdGF0aW9uKCkuZ2V0VHlwZVRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQYWNrYWdlWG1sU2NoZW1hVHlwZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGFja2FnZVhtbFNjaGVtYVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ0ODAxMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQYWNrYWdlWG1sU2NoZW1hVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sU2NoZW1hVHlwZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhUGFja2FnZVhtbFNjaGVtYVR5cGUKLQlleHRlbmRzIEdlbmVyaWNKYXZhWG1sU2NoZW1hVHlwZQotewotCi0JcHVibGljIEdlbmVyaWNKYXZhUGFja2FnZVhtbFNjaGVtYVR5cGUoSmF4YlBhY2thZ2VJbmZvIHBhcmVudCwgWG1sU2NoZW1hVHlwZUFubm90YXRpb24geG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCB4bWxTY2hlbWFUeXBlQW5ub3RhdGlvbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpheGJQYWNrYWdlSW5mbyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF4YlBhY2thZ2VJbmZvKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF4YlBhY2thZ2VJbmZvIGdldEpheGJQYWNrYWdlSW5mbygpIHsKLQkJcmV0dXJuIGdldFBhcmVudCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXhiUGFja2FnZSBnZXRKYXhiUGFja2FnZSgpIHsKLQkJcmV0dXJuIGdldEpheGJQYWNrYWdlSW5mbygpLmdldEpheGJQYWNrYWdlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJU3RyaW5nIGZxVHlwZSA9IGdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpOwotCQlpZiAoZnFUeXBlID09IG51bGwgfHwgWG1sU2NoZW1hVHlwZUFubm90YXRpb24uREVGQVVMVF9UWVBFLmVxdWFscyhmcVR5cGUpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfU0NIRU1BX1RZUEVfX1RZUEVfTk9UX1NQRUNJRklFRF9PTl9QQUNLQUdFLAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWVkY2I1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuQWNjZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhQ29udGV4dE5vZGUKLQkJaW1wbGVtZW50cyBKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSB7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEFjY2Vzc29yIGFjY2Vzc29yOwotCQotCXByb3RlY3RlZCBKYXhiQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nOyAgLy8gbmV2ZXIgbnVsbAotCQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdE1hcHBpbmdLZXk7Ci0JCi0JCi0JCi0JcHVibGljIHN0YXRpYyBKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZFBlcnNpc3RlbnRQcm9wZXJ0eSgKLQkJSmF4YkNsYXNzTWFwcGluZyBwYXJlbnQsCi0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZUdldHRlciwKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlU2V0dGVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlKAotCQkJCXBhcmVudCwgbmV3IFByb3BlcnR5QWNjZXNzb3IocGFyZW50LCByZXNvdXJjZUdldHRlciwgcmVzb3VyY2VTZXR0ZXIpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkUGVyc2lzdGVudEZpZWxkKAotCQlKYXhiQ2xhc3NNYXBwaW5nIHBhcmVudCwKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgKLQkJCQlwYXJlbnQsIG5ldyBGaWVsZEFjY2Vzc29yKHBhcmVudCwgcmVzb3VyY2VGaWVsZCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlKEpheGJDbGFzc01hcHBpbmcgcGFyZW50LCBBY2Nlc3NvciBhY2Nlc3NvcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmFjY2Vzc29yID0gYWNjZXNzb3I7Ci0JCS8vIGtlZXAgbm9uLW51bGwgYXQgYWxsIHRpbWVzCi0JCXRoaXMubWFwcGluZyA9IHRoaXMuYnVpbGRNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIEpheGJDbGFzc01hcHBpbmcgZ2V0Q2xhc3NNYXBwaW5nKCkgewotCQlyZXR1cm4gKEpheGJDbGFzc01hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY01hcHBpbmcoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVNYXBwaW5nKCk7Ci0JfQotCQotCQotCS8vICoqKioqIGRlY2xhcmluZyBjbGFzcy8gaW5oZXJpdGFuY2UgKioqKioKLQkKLQlwdWJsaWMgSmF2YVJlc291cmNlVHlwZSBnZXREZWNsYXJpbmdKYXZhUmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5hY2Nlc3Nvci5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZVR5cGUoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNJbmhlcml0ZWQoKSB7Ci0JCXJldHVybiBnZXREZWNsYXJpbmdKYXZhUmVzb3VyY2VUeXBlKCkgIT0gZ2V0Q2xhc3NNYXBwaW5nKCkuZ2V0SmF4YlR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIG5hbWUgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldE5hbWUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogYWNjZXNzb3IgKioqKioKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkKSB7Ci0JCXJldHVybiB0aGlzLmFjY2Vzc29yLmlzRm9yKHJlc291cmNlRmllbGQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRm9yKEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZUdldHRlciwgSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlU2V0dGVyKSB7Ci0JCXJldHVybiB0aGlzLmFjY2Vzc29yLmlzRm9yKHJlc291cmNlR2V0dGVyLCByZXNvdXJjZVNldHRlcik7Ci0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZUF0dHJpYnV0ZSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmFjY2Vzc29yLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZUJhc2VUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuYWNjZXNzb3IuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlQmFzZVR5cGVOYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzSmF2YVJlc291cmNlQXR0cmlidXRlQ29sbGVjdGlvblR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmFjY2Vzc29yLmlzSmF2YVJlc291cmNlQXR0cmlidXRlQ29sbGVjdGlvblR5cGUoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNKYXZhUmVzb3VyY2VBdHRyaWJ1dGVUeXBlU3ViVHlwZU9mKFN0cmluZyB0eXBlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5hY2Nlc3Nvci5pc0phdmFSZXNvdXJjZUF0dHJpYnV0ZVR5cGVTdWJUeXBlT2YodHlwZU5hbWUpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIG1hcHBpbmcgKioqKioqKioqKgotCi0JcHVibGljIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGdldE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogQ2xpZW50cyBkbyBub3Qgc2V0IHRoZSBtYXBwaW5nIGRpcmVjdGx5LgotCSAqIEBzZWUgI3NldE1hcHBpbmdLZXkoU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hcHBpbmcoSmF4YkF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZykgewotCQlKYXhiQXR0cmlidXRlTWFwcGluZyBvbGQgPSB0aGlzLm1hcHBpbmc7Ci0JCXRoaXMubWFwcGluZyA9IG1hcHBpbmc7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBQSU5HX1BST1BFUlRZLCBvbGQsIG1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGluZy5nZXRLZXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBQb3NzaWJsZSB0cmFuc2l0aW9uczoKLQkgKiA8dGFibGUgYm9yZGVyPgotCSAqIDx0aD4KLQkgKiA8dGg+bnVsbCBtYXBwaW5nL2RlZmF1bHQ8YnI+Ci0JICogICAgIDxjb2RlPmtleSA9IG51bGw8L2NvZGU+Ci0JICogPHRoPnNwZWNpZmllZCBtYXBwaW5nIEE8YnI+Ci0JICogICAgIDxjb2RlPmtleSA9ICJBIjwvY29kZT4KLQkgKiA8dGg+c3BlY2lmaWVkIG1hcHBpbmcgQjxicj4KLQkgKiAgICAgPGNvZGU+a2V5ID0gIkIiPC9jb2RlPgotCSAqIDx0cj4KLQkgKiA8dGg+W2RlZmF1bHRdIG51bGwgbWFwcGluZwotCSAqICAgPHRkPmRvIG5vdGhpbmcKLQkgKiAgIDx0ZD5hZGQgYW5ub3RhdGlvbiBBPGJyPgotCSAqICAgICAgIHNldCBuZXcgbWFwcGluZyBBCi0JICogICA8dGQ+YWRkIGFubm90YXRpb24gQjxicj4KLQkgKiAgICAgICBzZXQgbmV3IG1hcHBpbmcgQgotCSAqIDx0cj4KLQkgKiA8dGg+ZGVmYXVsdCBtYXBwaW5nIEEKLQkgKiAgIDx0ZD5kbyBub3RoaW5nCi0JICogICA8dGQ+YWRkIGFubm90YXRpb24gQTxicj4KLQkgKiAgICAgICA8ZW0+cmUtdXNlPC9lbT4gZGVmYXVsdCBtYXBwaW5nIEEKLQkgKiAgIDx0ZD5hZGQgYW5ub3RhdGlvbiBCPGJyPgotCSAqICAgICAgIHNldCBuZXcgbWFwcGluZyBCCi0JICogPHRyPgotCSAqIDx0aD5zcGVjaWZpZWQgbWFwcGluZyBBCi0JICogICA8dGQ+cmVtb3ZlIGFubm90YXRpb24gQTxicj4KLQkgKiAgICAgICBzZXQgbmV3IGRlZmF1bHQgb3IgbnVsbCBtYXBwaW5nCi0JICogICA8dGQ+ZG8gbm90aGluZwotCSAqICAgPHRkPnJlbW92ZSBhbm5vdGF0aW9uIEE8YnI+Ci0JICogICAgICAgYWRkIGFubm90YXRpb24gQjxicj4KLQkgKiAgICAgICBzZXQgbmV3IG1hcHBpbmcgQgotCSAqIDwvdGFibGU+Ci0JICogVGhlICJkbyBub3RoaW5nIiB0cmFuc2l0aW9ucyBhcmUgaGFuZGxlZCBpbiB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgc2V0TWFwcGluZ0tleShTdHJpbmcga2V5KSB7Ci0JCWlmICh0aGlzLm1hcHBpbmcuaXNEZWZhdWx0KCkpIHsKLQkJCWlmIChrZXkgPT0gbnVsbCkgewotCQkJCS8vIGxlYXZlIHRoZSBkZWZhdWx0IG1hcHBpbmcgdW5jaGFuZ2VkCi0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0TWFwcGluZ0tleV8oa2V5KTsgIC8vIHJlcGxhY2UgdGhlIGRlZmF1bHQgbWFwcGluZwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwoa2V5LCB0aGlzLm1hcHBpbmcuZ2V0S2V5KCkpKSB7Ci0JCQkJLy8gbGVhdmUgdGhlIHNwZWNpZmllZCBtYXBwaW5nIHVuY2hhbmdlZAotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNldE1hcHBpbmdLZXlfKGtleSk7ICAvLyByZXBsYWNlIHRoZSBzcGVjaWZpZWQgbWFwcGluZwotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzLm1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogV2UgaGF2ZSBlaXRoZXI6PHVsPgotCSAqIDxsaT5hIDxlbT5kZWZhdWx0PC9lbT4gbWFwcGluZyBhbmQgYSBub24tPGNvZGU+bnVsbDwvY29kZT4ga2V5Ci0JICogPC91bD5vcjx1bD4KLQkgKiA8bGk+YSA8ZW0+c3BlY2lmaWVkPC9lbT4gbWFwcGluZyBhbmQgYSBkaWZmZXJlbnQgKHBvc3NpYmx5Ci0JICogICAgIDxjb2RlPm51bGw8L2NvZGU+KSBrZXkKLQkgKiA8L3VsPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hcHBpbmdLZXlfKFN0cmluZyBrZXkpIHsKLQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGRlZmluaXRpb24gPSB0aGlzLmdldFNwZWNpZmllZE1hcHBpbmdEZWZpbml0aW9uKGtleSk7Ci0JCWlmIChkZWZpbml0aW9uID09IG51bGwpIHsKLQkJCS8vIG91ciBtYXBwaW5nIGlzICJzcGVjaWZpZWQiIGFuZCB0aGUga2V5IGlzIG51bGw7Ci0JCQkvLyBjaGVjayBmb3IgYSBkZWZhdWx0IGRlZmluaXRpb24KLQkJCWRlZmluaXRpb24gPSB0aGlzLmdldERlZmF1bHRNYXBwaW5nRGVmaW5pdGlvbigpOwotCQkJSXRlcmFibGU8U3RyaW5nPiBzdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzID0gKGRlZmluaXRpb24gIT0gbnVsbCkgPyBkZWZpbml0aW9uLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpOwotCQkJLy8gY2xlYXIgYW55IG1hcHBpbmcgYW5ub3RhdGlvbihzKTsKLQkJCS8vIGxlYXZlIHRoZSAiZGVmYXVsdCIgbWFwcGluZydzIHN1cHBvcnRpbmcgYW5ub3RhdGlvbnM7Ci0JCQkvLyBpZiB0aGVyZSBpcyBubyAiZGVmYXVsdCIgbWFwcGluZywgY2xlYXIgYWxsIHN1cHBvcnRpbmcgYW5ub3RhdGlvbnMgdG9vKD8pCi0JCQl0aGlzLnNldE1hcHBpbmdBbm5vdGF0aW9uKG51bGwsIHN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMpOwotCQl9IGVsc2UgewotCQkJdGhpcy5zZXRNYXBwaW5nQW5ub3RhdGlvbihkZWZpbml0aW9uKTsKLQkJfQotCQkvLyBub3RlOiAnZGVmaW5pdGlvbicgY2FuIHN0aWxsIGJlIG51bGwgKGlmIHRoZSBrZXkgaXMgbnVsbCBhbmQgdGhlcmUgaXMgbm8gImRlZmF1bHQiIG1hcHBpbmcpCi0JCXRoaXMuc2V0TWFwcGluZyh0aGlzLmJ1aWxkTWFwcGluZyhkZWZpbml0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogZGVmaW5pdGlvbiBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBwaW5nQW5ub3RhdGlvbihKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZGVmaW5pdGlvbikgewotCQl0aGlzLnNldE1hcHBpbmdBbm5vdGF0aW9uKGRlZmluaXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSwgZGVmaW5pdGlvbi5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE1hcHBpbmdBbm5vdGF0aW9uKFN0cmluZyBwcmltYXJ5QW5ub3RhdGlvbk5hbWUsIEl0ZXJhYmxlPFN0cmluZz4gc3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcykgewotCQl0aGlzLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLnNldFByaW1hcnlBbm5vdGF0aW9uKHByaW1hcnlBbm5vdGF0aW9uTmFtZSwgc3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcyk7Ci0JfQotCi0JcHJvdGVjdGVkIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZGVmaW5pdGlvbikgewotCQlyZXR1cm4gKGRlZmluaXRpb24gPT0gbnVsbCkgPyB0aGlzLmJ1aWxkTnVsbE1hcHBpbmcoKSA6IHRoaXMuYnVpbGRNYXBwaW5nXyhkZWZpbml0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgYnVpbGROdWxsTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmJ1aWxkSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IGRlZmluaXRpb24gaXMgbm90IG51bGwKLQkgKiA8cD4KLQkgKiBJZiB3ZSBhcmUgY29udmVydGluZyBhIDxlbT5kZWZhdWx0PC9lbT4gbWFwcGluZyB0byBpdHMgPGVtPnNwZWNpZmllZDwvZW0+Ci0JICogbWFuaWZlc3RhdGlvbiwgd2UganVzdCBrZWVwIHRoZSBzYW1lIG1hcHBpbmcgYW5kIGNyZWF0ZSBpdHMgYW5ub3RhdGlvbi4KLQkgKiBXZSBkbyA8ZW0+bm90PC9lbT4gZG8gdGhlIHNhbWUgdGhpbmcgd2hlbiBjb252ZXJ0aW5nIGEgPGVtPnNwZWNpZmllZDwvZW0+Ci0JICogbWFwcGluZyB0byBpdHMgPGVtPmRlZmF1bHQ8L2VtPiBtYW5pZmVzdGF0aW9uLiBXZSByZWJ1aWxkIHRoZQotCSAqIGVudGlyZSBtYXBwaW5nLCBzaW1wbGlmeWluZyB0aGUgY2xlYXJpbmcgb2YgYWxsIGl0cyBzdGF0ZS4gV2UgZG8gdGhpcwotCSAqIGJlY2F1c2Ugd2UgYWxsb3cgY2xpZW50cyB0byBtb2RpZnkgYSA8ZW0+ZGVmYXVsdDwvZW0+IG1hcHBpbmcgKG9yIGFueSBvZgotCSAqIGl0cyBjb21wb25lbnRzKSBkaXJlY3RseSwKLQkgKiBtb2RpZnlpbmcgaXRzIHN0YXRlIGFuZCB0cmlnZ2VyaW5nIGEgY29udmVyc2lvbiB0byBhIDxlbT5zcGVjaWZpZWQ8L2VtPgotCSAqIG1hcHBpbmcuIFRoZSBvbmx5IHdheSB0byBjb252ZXJ0IGEgPGVtPnNwZWNpZmllZDwvZW0+IG1hcHBpbmcgdG8gYQotCSAqIDxlbT5kZWZhdWx0PC9lbT4gbWFwcGluZyBpcyBieSB7QGxpbmsgI3NldE1hcHBpbmdLZXkoU3RyaW5nKSBzZXR0aW5nIHRoZQotCSAqIG1hcHBpbmcga2V5fSB0byA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nXyhKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZGVmaW5pdGlvbikgewotCQkvLyAnbWFwcGluZycgaXMgbnVsbCBkdXJpbmcgY29uc3RydWN0aW9uCi0JCWlmICgodGhpcy5tYXBwaW5nICE9IG51bGwpICYmIHRoaXMubWFwcGluZy5pc0RlZmF1bHQoKSAmJiBUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLm1hcHBpbmcuZ2V0S2V5KCksIGRlZmluaXRpb24uZ2V0S2V5KCkpKSB7Ci0JCQl0aGlzLm1hcHBpbmcuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOyAgLy8gdGhlIG1hcHBpbmcgaW5zdGFuY2UgaGFzbid0IGNoYW5nZWQsIGJ1dCBzb21lIHJlc291cmNlIGRpZmZlcmVuY2VzIG1heSBoYXZlIHJlc3VsdGVkCi0JCQlyZXR1cm4gdGhpcy5tYXBwaW5nOwotCQl9Ci0JCXJldHVybiBkZWZpbml0aW9uLmJ1aWxkTWFwcGluZyh0aGlzLCB0aGlzLmdldEZhY3RvcnkoKSk7Ci0JfQotCi0JLyoqCi0JICogV2Ugb25seSBsb29rIGZvciBhIDxlbT5zcGVjaWZpZWQ8L2VtPiBtYXBwaW5nIGhlcmUuCi0JICogV2UgbG9vayBmb3IgYSBkZWZhdWx0IG1hcHBpbmcgZHVyaW5nIDxlbT51cGRhdGU8L2VtPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZE1hcHBpbmcodGhpcy5nZXRTcGVjaWZpZWRNYXBwaW5nRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBMb29rIGZvciBhIDxlbT5zcGVjaWZpZWQ8L2VtPiBtYXBwaW5nIGFuZCBzeW5jIG91ciBtYXBwaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNNYXBwaW5nKCkgewotCQlKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZGVmaW5pdGlvbiA9IHRoaXMuZ2V0U3BlY2lmaWVkTWFwcGluZ0RlZmluaXRpb24oKTsKLQkJaWYgKGRlZmluaXRpb24gPT0gbnVsbCkgewotCQkJaWYgKHRoaXMubWFwcGluZy5pc0RlZmF1bHQoKSkgewotCQkJCS8vIG51bGwvZGVmYXVsdCA9PiBudWxsL2RlZmF1bHQKLQkJCQl0aGlzLm1hcHBpbmcuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBzcGVjaWZpZWQgPT4gbnVsbC9kZWZhdWx0Ci0JCQkJZGVmaW5pdGlvbiA9IHRoaXMuZ2V0RGVmYXVsdE1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCQkJdGhpcy5zZXRNYXBwaW5nKHRoaXMuYnVpbGRNYXBwaW5nKGRlZmluaXRpb24pKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLm1hcHBpbmcuaXNEZWZhdWx0KCkpIHsKLQkJCQkvLyBudWxsL2RlZmF1bHQgPT4gc3BlY2lmaWVkCi0JCQkJLy8gKHdpbGwgbm90IGNoYW5nZSBtYXBwaW5nIGluc3RhbmNlIGlmIGtleXMgYXJlIHRoZSBzYW1lLCBidXQgd2lsbCBzeW5jIHRoZSBtYXBwaW5nKQotCQkJCXRoaXMuc2V0TWFwcGluZyh0aGlzLmJ1aWxkTWFwcGluZyhkZWZpbml0aW9uKSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHNwZWNpZmllZCA9PiBzcGVjaWZpZWQKLQkJCQlpZiAodGhpcy52YWx1ZXNBcmVFcXVhbChkZWZpbml0aW9uLmdldEtleSgpLCB0aGlzLm1hcHBpbmcuZ2V0S2V5KCkpKSB7Ci0JCQkJCXRoaXMubWFwcGluZy5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhpcy5zZXRNYXBwaW5nKHRoaXMuYnVpbGRNYXBwaW5nKGRlZmluaXRpb24pKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJzcGVjaWZpZWQiIG1hcHBpbmcgZGVmaW5pdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBrZXkuCi0JICovCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXRTcGVjaWZpZWRNYXBwaW5nRGVmaW5pdGlvbihTdHJpbmcga2V5KSB7Ci0JCWlmIChrZXkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZm9yIChKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZGVmaW5pdGlvbiA6IHRoaXMuZ2V0U3BlY2lmaWVkTWFwcGluZ0RlZmluaXRpb25zKCkpIHsKLQkJCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbChkZWZpbml0aW9uLmdldEtleSgpLCBrZXkpKSB7Ci0JCQkJcmV0dXJuIGRlZmluaXRpb247Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBtYXBwaW5nIGtleTogIiArIGtleSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1hcHBpbmcgZGVmaW5pdGlvbiBmb3IgdGhlIG1hcHBpbmcgY3VycmVudGx5IHNwZWNpZmllZCBpbiB0aGUKLQkgKiBzb3VyY2UgY29kZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldFNwZWNpZmllZE1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlmb3IgKEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBkZWZpbml0aW9uIDogdGhpcy5nZXRTcGVjaWZpZWRNYXBwaW5nRGVmaW5pdGlvbnMoKSkgewotCQkJaWYgKGRlZmluaXRpb24uaXNTcGVjaWZpZWQodGhpcykpIHsKLQkJCQlyZXR1cm4gZGVmaW5pdGlvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBnZXRTcGVjaWZpZWRNYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBsYXRmb3JtKCkuZ2V0U3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0IG1hcHBpbmcgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE1hcHBpbmdLZXk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE1hcHBpbmdLZXkoU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdE1hcHBpbmdLZXk7Ci0JCXRoaXMuZGVmYXVsdE1hcHBpbmdLZXkgPSBtYXBwaW5nS2V5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9NQVBQSU5HX0tFWV9QUk9QRVJUWSwgb2xkLCBtYXBwaW5nS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBJZiBhIG1hcHBpbmcgYW5ub3RhdGlvbiBpcyBzcGVjaWZpZWQsIHdlIHdvdWxkIGhhdmUgYWxyZWFkeSBzZXQgYQotCSAqIDxlbT5zcGVjaWZpZWQ8L2VtPiBtYXBwaW5nIGluIHtAbGluayAjc3luY01hcHBpbmcoKX0uIFdlIG5lZWQgb25seSBjaGVjawotCSAqIGZvciBjaGFuZ2VzIHRvIHRoZSA8ZW0+ZGVmYXVsdDwvZW0+IG1hcHBpbmcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTWFwcGluZygpIHsKLQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGRlZmluaXRpb24gPSB0aGlzLmdldERlZmF1bHRNYXBwaW5nRGVmaW5pdGlvbigpOwotCQlTdHJpbmcgbmV3RGVmYXVsdEtleSA9IChkZWZpbml0aW9uID09IG51bGwpID8gbnVsbCA6IGRlZmluaXRpb24uZ2V0S2V5KCk7Ci0JCWlmICh0aGlzLm1hcHBpbmcuaXNEZWZhdWx0KCkgJiYgVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMubWFwcGluZy5nZXRLZXkoKSwgbmV3RGVmYXVsdEtleSkpIHsKLQkJCXRoaXMuc2V0TWFwcGluZyh0aGlzLmJ1aWxkTWFwcGluZyhkZWZpbml0aW9uKSk7ICAvLyB0aGUgZGVmYXVsdCBtYXBwaW5nIGhhcyBjaGFuZ2VkCi0JCX0gZWxzZSB7Ci0JCQl0aGlzLm1hcHBpbmcudXBkYXRlKCk7Ci0JCX0KLQkJdGhpcy5zZXREZWZhdWx0TWFwcGluZ0tleShuZXdEZWZhdWx0S2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldERlZmF1bHRNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJZm9yIChEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGRlZmluaXRpb24gOiB0aGlzLmdldERlZmF1bHRNYXBwaW5nRGVmaW5pdGlvbnMoKSkgewotCQkJaWYgKGRlZmluaXRpb24uaXNEZWZhdWx0KHRoaXMpKSB7Ci0JCQkJcmV0dXJuIGRlZmluaXRpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGdldERlZmF1bHRNYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBsYXRmb3JtKCkuZ2V0RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldE5hbWUoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKioqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlyZXN1bHQgPSB0aGlzLm1hcHBpbmcuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQkvLyB2YWxpZGF0ZSB0aGF0IHVuc3VwcG9ydGVkIGFubm90YXRpb25zIGFyZSBub3QgcHJlc2VudAotCQlKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gY3VycmVudE1hcHBpbmdEZWZpbml0aW9uID0gZ2V0Q3VycmVudE1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gc3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcyA9IGN1cnJlbnRNYXBwaW5nRGVmaW5pdGlvbi5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCk7Ci0JCQotCQlmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldFRvcExldmVsQW5ub3RhdGlvbnMoKSkgewotCQkJaWYgKFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudChjdXJyZW50TWFwcGluZ0RlZmluaXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSwgYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKQotCQkJCQkmJiAhIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhzdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzLCBhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuQVRUUklCVVRFX01BUFBJTkdfX1VOU1VQUE9SVEVEX0FOTk9UQVRJT04sCi0JCQkJCQkJCW5ldyBTdHJpbmdbXSB7IGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSwgY3VycmVudE1hcHBpbmdEZWZpbml0aW9uLmdldEFubm90YXRpb25OYW1lKCkgfSwKLQkJCQkJCQkJdGhpcywKLQkJCQkJCQkJYW5ub3RhdGlvbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJCX0KLQkJfQotCQkKLQkJdGhpcy5nZXRNYXBwaW5nKCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXRDdXJyZW50TWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCUl0ZXJhYmxlPD8gZXh0ZW5kcyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IG1hcHBpbmdEZWZpbml0aW9ucyA9IAotCQkJCSh0aGlzLm1hcHBpbmcuaXNEZWZhdWx0KCkpID8gCi0JCQkJCQlnZXREZWZhdWx0TWFwcGluZ0RlZmluaXRpb25zKCkKLQkJCQkJCTogZ2V0U3BlY2lmaWVkTWFwcGluZ0RlZmluaXRpb25zKCk7Ci0JCQotCQlmb3IgKEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBtYXBwaW5nRGVmaW5pdGlvbiA6IG1hcHBpbmdEZWZpbml0aW9ucykgewotCQkJaWYgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKG1hcHBpbmdEZWZpbml0aW9uLmdldEtleSgpLCB0aGlzLm1hcHBpbmcuZ2V0S2V5KCkpKSB7Ci0JCQkJcmV0dXJuIG1hcHBpbmdEZWZpbml0aW9uOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUeXBlWG1sSmF2YVR5cGVBZGFwdGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUeXBlWG1sSmF2YVR5cGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYTg3NDYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVHlwZVhtbEphdmFUeXBlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFUeXBlWG1sSmF2YVR5cGVBZGFwdGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFYbWxKYXZhVHlwZUFkYXB0ZXIKLXsKLQotCXB1YmxpYyBHZW5lcmljSmF2YVR5cGVYbWxKYXZhVHlwZUFkYXB0ZXIoSmF4YlR5cGUgcGFyZW50LCBYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIHJlc291cmNlKSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2UpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiVHlwZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF4YlR5cGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCS8vICoqKioqKioqKiogdHlwZSAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRUeXBlKCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEFkYXB0ZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcxZGIzMC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxBZGFwdGVyCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhQ29udGV4dE5vZGUKLQkJaW1wbGVtZW50cyBYbWxBZGFwdGVyIHsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGU7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBib3VuZFR5cGU7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZVR5cGU7Ci0JCi0JCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sQWRhcHRlcihKYXZhQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnJlc291cmNlVHlwZSA9IHJlc291cmNlVHlwZTsKLQkJaW5pdEJvdW5kQW5kVmFsdWVUeXBlcygpOwotCX0KLQkKLQkKLQlwdWJsaWMgSmF2YVJlc291cmNlVHlwZSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVR5cGU7Ci0JfQotCQotCQotCS8vICoqKioqIG92ZXJyaWRlcyAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlVHlwZS5nZXRGaWxlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHN5bmMvdXBkYXRlICoqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEJvdW5kQW5kVmFsdWVUeXBlcygpIHsKLQkJU3RyaW5nW10gdHlwZXMgPSBmaW5kQm91bmRBbmRWYWx1ZVR5cGVzKGdldEphdmFSZXNvdXJjZVR5cGUoKSk7Ci0JCXRoaXMuYm91bmRUeXBlID0gdHlwZXNbMF07Ci0JCXRoaXMudmFsdWVUeXBlID0gdHlwZXNbMV07Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCS8vIHRoZXNlIGFyZSBpbiB1cGRhdGUsIHNpbmNlIHRoZWlyIHZhbHVlcyBtYXkgZGVwZW5kIG9uIG90aGVyIGNsYXNzZXMKLQkJdXBkYXRlQm91bmRBbmRWYWx1ZVR5cGVzKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJvdW5kQW5kVmFsdWVUeXBlcygpIHsKLQkJU3RyaW5nW10gdHlwZXMgPSBmaW5kQm91bmRBbmRWYWx1ZVR5cGVzKGdldEphdmFSZXNvdXJjZVR5cGUoKSk7Ci0JCXNldEJvdW5kVHlwZV8odHlwZXNbMF0pOwotCQlzZXRWYWx1ZVR5cGVfKHR5cGVzWzFdKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGZpbmRCb3VuZEFuZFZhbHVlVHlwZXMoSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgOiByZXNvdXJjZVR5cGUuZ2V0TWV0aG9kcygpKSB7Ci0JCQlpZiAoTUFSU0hBTF9NRVRIT0RfTkFNRS5lcXVhbHMocmVzb3VyY2VNZXRob2QuZ2V0TmFtZSgpKSAmJiByZXNvdXJjZU1ldGhvZC5nZXRQYXJhbWV0ZXJzU2l6ZSgpID09IDEpIHsKLQkJCQlTdHJpbmcgdmFsdWVUeXBlID0gcmVzb3VyY2VNZXRob2QuZ2V0VHlwZU5hbWUoKTsKLQkJCQlTdHJpbmcgYm91bmRUeXBlID0gcmVzb3VyY2VNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZU5hbWUoMCk7Ci0JCQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IGJvdW5kVHlwZSwgdmFsdWVUeXBlIH07Ci0JCQl9Ci0JCX0KLQkJCi0JCVN0cmluZyBzdXBlclJlc291cmNlVHlwZU5hbWUgPSByZXNvdXJjZVR5cGUuZ2V0U3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoKTsKLQkJaWYgKCEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShzdXBlclJlc291cmNlVHlwZU5hbWUpKSB7Ci0JCQlKYXZhUmVzb3VyY2VUeXBlIHN1cGVyUmVzb3VyY2VUeXBlIAotCQkJCQk9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKYXhiUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoc3VwZXJSZXNvdXJjZVR5cGVOYW1lLCBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUuS2luZC5UWVBFKTsKLQkJCWlmIChzdXBlclJlc291cmNlVHlwZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZpbmRCb3VuZEFuZFZhbHVlVHlwZXMoc3VwZXJSZXNvdXJjZVR5cGUpOwotCQkJfQotCQl9Ci0JCQotCQlTdHJpbmcgb2JqZWN0VHlwZU5hbWUgPSBPYmplY3QuY2xhc3MuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgb2JqZWN0VHlwZU5hbWUsIG9iamVjdFR5cGVOYW1lIH07Ci0JfQotCQotCQotCS8vICoqKioqIGJvdW5kIHR5cGUgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEJvdW5kVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuYm91bmRUeXBlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRCb3VuZFR5cGVfKFN0cmluZyBuZXdUeXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gdGhpcy5ib3VuZFR5cGU7Ci0JCXRoaXMuYm91bmRUeXBlID0gbmV3VHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChCT1VORF9UWVBFX1BST1BFUlRZLCBvbGRUeXBlLCBuZXdUeXBlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsdWUgdHlwZSAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVUeXBlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZVR5cGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlVHlwZV8oU3RyaW5nIG5ld1R5cGUpIHsKLQkJU3RyaW5nIG9sZFR5cGUgPSB0aGlzLnZhbHVlVHlwZTsKLQkJdGhpcy52YWx1ZVR5cGUgPSBuZXdUeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1RZUEVfUFJPUEVSVFksIG9sZFR5cGUsIG5ld1R5cGUpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOTRiNDIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBbnlBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KYXhiVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmcKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFBZGFwdGFibGVBdHRyaWJ1dGVNYXBwaW5nPFhtbEFueUF0dHJpYnV0ZUFubm90YXRpb24+Ci0JCWltcGxlbWVudHMgWG1sQW55QXR0cmlidXRlTWFwcGluZyB7Ci0JCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJaW5pdGlhbGl6ZVhtbEphdmFUeXBlQWRhcHRlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlhNTF9BTllfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0FOWV9BVFRSSUJVVEU7Ci0JfQotCQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCWlmICghIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc0phdmFSZXNvdXJjZUF0dHJpYnV0ZVR5cGVTdWJUeXBlT2YoTWFwLmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfQU5ZX0FUVFJJQlVURV9fTk9OX01BUF9UWVBFLAotCQkJCQl0aGlzLAotCQkJCQlnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVkOWY5Mi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBbnlFbGVtZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFJlZnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxNaXhlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFueUVsZW1lbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50UmVmQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50V3JhcHBlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE1peGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZwotCQlleHRlbmRzIEFic3RyYWN0SmF2YUFkYXB0YWJsZUF0dHJpYnV0ZU1hcHBpbmc8WG1sQW55RWxlbWVudEFubm90YXRpb24+Ci0JCWltcGxlbWVudHMgWG1sQW55RWxlbWVudE1hcHBpbmcgewotCQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZExheDsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFZhbHVlOwotCQotCXByb3RlY3RlZCBmaW5hbCBYbWxFbGVtZW50UmVmcyB4bWxFbGVtZW50UmVmczsKLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudFdyYXBwZXIgeG1sRWxlbWVudFdyYXBwZXI7Ci0JCi0JcHJvdGVjdGVkIFhtbE1peGVkIHhtbE1peGVkOwotCQotCQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnNwZWNpZmllZExheCA9IGJ1aWxkU3BlY2lmaWVkTGF4KCk7Ci0JCXRoaXMuc3BlY2lmaWVkVmFsdWUgPSBnZXRSZXNvdXJjZVZhbHVlU3RyaW5nKCk7Ci0JCXRoaXMueG1sRWxlbWVudFJlZnMgPSBidWlsZFhtbEVsZW1lbnRSZWZzKCk7Ci0JCWluaXRpYWxpemVYbWxFbGVtZW50V3JhcHBlcigpOwotCQlpbml0aWFsaXplWG1sTWl4ZWQoKTsJCQkKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5YTUxfQU5ZX0VMRU1FTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfQU5ZX0VMRU1FTlQ7Ci0JfQotCQotCQotCS8vICoqKioqIHN5bmMvdXBkYXRlICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlzZXRTcGVjaWZpZWRMYXhfKGJ1aWxkU3BlY2lmaWVkTGF4KCkpOwotCQlzZXRTcGVjaWZpZWRWYWx1ZV8oZ2V0UmVzb3VyY2VWYWx1ZVN0cmluZygpKTsKLQkJdGhpcy54bWxFbGVtZW50UmVmcy5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXN5bmNYbWxFbGVtZW50V3JhcHBlcigpOwotCQlzeW5jWG1sTWl4ZWQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy54bWxFbGVtZW50UmVmcy51cGRhdGUoKTsKLQkJdXBkYXRlWG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJdXBkYXRlWG1sTWl4ZWQoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbGF4ICoqKioqCi0JCi0JcHVibGljIGJvb2xlYW4gaXNMYXgoKSB7Ci0JCXJldHVybiAoZ2V0U3BlY2lmaWVkTGF4KCkgPT0gbnVsbCkgPyBpc0RlZmF1bHRMYXgoKSA6IGdldFNwZWNpZmllZExheCgpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRMYXgoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZExheDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTGF4KEJvb2xlYW4gbmV3U3BlY2lmaWVkTGF4KSB7Ci0JCWdldE9yQ3JlYXRlQW5ub3RhdGlvbigpLnNldExheChuZXdTcGVjaWZpZWRMYXgpOwotCQlzZXRTcGVjaWZpZWRMYXhfKG5ld1NwZWNpZmllZExheCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZExheF8oQm9vbGVhbiBuZXdTcGVjaWZpZWRMYXgpIHsKLQkJQm9vbGVhbiBvbGRMYXggPSB0aGlzLnNwZWNpZmllZExheDsKLQkJdGhpcy5zcGVjaWZpZWRMYXggPSBuZXdTcGVjaWZpZWRMYXg7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0xBWF9QUk9QRVJUWSwgb2xkTGF4LCBuZXdTcGVjaWZpZWRMYXgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZExheCgpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb24oKS5nZXRMYXgoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TGF4KCkgewotCQlyZXR1cm4gREVGQVVMVF9MQVg7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbHVlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldFNwZWNpZmllZFZhbHVlKCkgPT0gbnVsbCA/IGdldERlZmF1bHRWYWx1ZSgpIDogZ2V0U3BlY2lmaWVkVmFsdWUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVmFsdWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFZhbHVlKFN0cmluZyBsb2NhdGlvbikgewotCQlnZXRPckNyZWF0ZUFubm90YXRpb24oKS5zZXRWYWx1ZShsb2NhdGlvbik7Ci0JCXNldFNwZWNpZmllZFZhbHVlXyhsb2NhdGlvbik7CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRWYWx1ZV8oU3RyaW5nIHR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkVmFsdWU7Ci0JCXRoaXMuc3BlY2lmaWVkVmFsdWUgPSB0eXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9WQUxVRV9QUk9QRVJUWSwgb2xkLCB0eXBlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZVZhbHVlU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbigpLmdldFZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gREVGQVVMVF9WQUxVRTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sRWxlbWVudFJlZnMgKioqKioKLQkKLQlwdWJsaWMgWG1sRWxlbWVudFJlZnMgZ2V0WG1sRWxlbWVudFJlZnMoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEVsZW1lbnRSZWZzOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudFJlZnMgYnVpbGRYbWxFbGVtZW50UmVmcygpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzKHRoaXMsIG5ldyBYbWxFbGVtZW50UmVmc0NvbnRleHQoKSk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnRXcmFwcGVyICoqKioqCi0JCi0JcHVibGljIFhtbEVsZW1lbnRXcmFwcGVyIGdldFhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlyZXR1cm4gdGhpcy54bWxFbGVtZW50V3JhcHBlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sRWxlbWVudFdyYXBwZXJfKFhtbEVsZW1lbnRXcmFwcGVyIHhtbEVsZW1lbnRXcmFwcGVyKSB7Ci0JCVhtbEVsZW1lbnRXcmFwcGVyIG9sZFhtbEVsZW1lbnRXcmFwcGVyID0gdGhpcy54bWxFbGVtZW50V3JhcHBlcjsKLQkJdGhpcy54bWxFbGVtZW50V3JhcHBlciA9IHhtbEVsZW1lbnRXcmFwcGVyOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9FTEVNRU5UX1dSQVBQRVJfUFJPUEVSVFksIG9sZFhtbEVsZW1lbnRXcmFwcGVyLCB4bWxFbGVtZW50V3JhcHBlcik7Ci0JfQotCQotCXB1YmxpYyBYbWxFbGVtZW50V3JhcHBlciBhZGRYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJWG1sRWxlbWVudFdyYXBwZXIgeG1sRWxlbWVudFdyYXBwZXIgPSBidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCXNldFhtbEVsZW1lbnRXcmFwcGVyXyh4bWxFbGVtZW50V3JhcHBlcik7Ci0JCXJldHVybiB4bWxFbGVtZW50V3JhcHBlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCWlmICh0aGlzLnhtbEVsZW1lbnRXcmFwcGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCXNldFhtbEVsZW1lbnRXcmFwcGVyXyhudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiBnZXRYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxFbGVtZW50V3JhcHBlciBidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sRWxlbWVudFdyYXBwZXIodGhpcywgbmV3IEdlbmVyaWNKYXZhWG1sRWxlbWVudFdyYXBwZXIuU2ltcGxlQ29udGV4dChnZXRYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24oKSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplWG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCWlmIChnZXRYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24oKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbEVsZW1lbnRXcmFwcGVyID0gYnVpbGRYbWxFbGVtZW50V3JhcHBlcigpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJaWYgKGdldFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbigpICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnhtbEVsZW1lbnRXcmFwcGVyICE9IG51bGwpIHsKLQkJCQl0aGlzLnhtbEVsZW1lbnRXcmFwcGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldFhtbEVsZW1lbnRXcmFwcGVyXyhidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJc2V0WG1sRWxlbWVudFdyYXBwZXJfKG51bGwpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlpZiAodGhpcy54bWxFbGVtZW50V3JhcHBlciAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbEVsZW1lbnRXcmFwcGVyLnVwZGF0ZSgpOwotCQl9Ci0JfQotCQotCQotCS8vICoqKioqIFhtbE1peGVkICoqKioqCi0JCi0JcHVibGljIFhtbE1peGVkIGdldFhtbE1peGVkKCkgewotCQlyZXR1cm4gdGhpcy54bWxNaXhlZDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sTWl4ZWRfKFhtbE1peGVkIHhtbE1peGVkKSB7Ci0JCVhtbE1peGVkIG9sZFhtbE1peGVkID0gdGhpcy54bWxNaXhlZDsKLQkJdGhpcy54bWxNaXhlZCA9IHhtbE1peGVkOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9NSVhFRF9QUk9QRVJUWSwgb2xkWG1sTWl4ZWQsIHhtbE1peGVkKTsKLQl9Ci0JCi0JcHVibGljIFhtbE1peGVkIGFkZFhtbE1peGVkKCkgewotCQlpZiAodGhpcy54bWxNaXhlZCAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJWG1sTWl4ZWRBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoWG1sTWl4ZWRBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKEpBWEIuWE1MX01JWEVEKTsKLQkJCi0JCVhtbE1peGVkIHhtbE1peGVkID0gYnVpbGRYbWxNaXhlZChhbm5vdGF0aW9uKTsKLQkJc2V0WG1sTWl4ZWRfKHhtbE1peGVkKTsKLQkJcmV0dXJuIHhtbE1peGVkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxNaXhlZCgpIHsKLQkJaWYgKHRoaXMueG1sTWl4ZWQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oSkFYQi5YTUxfTUlYRUQpOwotCQlzZXRYbWxNaXhlZF8obnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxNaXhlZEFubm90YXRpb24gZ2V0WG1sTWl4ZWRBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbE1peGVkQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9NSVhFRCk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxNaXhlZCBidWlsZFhtbE1peGVkKFhtbE1peGVkQW5ub3RhdGlvbiB4bWxNaXhlZEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVhtbE1peGVkKHRoaXMsIHhtbE1peGVkQW5ub3RhdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVYbWxNaXhlZCgpIHsKLQkJWG1sTWl4ZWRBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxNaXhlZEFubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJdGhpcy54bWxNaXhlZCA9IGJ1aWxkWG1sTWl4ZWQoYW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1htbE1peGVkKCkgewotCQlYbWxNaXhlZEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbE1peGVkQW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy54bWxNaXhlZCAhPSBudWxsKSB7Ci0JCQkJdGhpcy54bWxNaXhlZC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRYbWxNaXhlZF8oYnVpbGRYbWxNaXhlZChhbm5vdGF0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRYbWxNaXhlZF8obnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlWG1sTWl4ZWQoKSB7Ci0JCWlmICh0aGlzLnhtbE1peGVkICE9IG51bGwpIHsKLQkJCXRoaXMueG1sTWl4ZWQudXBkYXRlKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEVsZW1lbnRSZWZzLmdldFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogY29udGVudCBhc3Npc3QgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlyZXN1bHQgPSB0aGlzLnhtbEVsZW1lbnRSZWZzLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gdGhpcy54bWxFbGVtZW50V3JhcHBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQl0aGlzLnhtbEVsZW1lbnRSZWZzLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlpZiAoZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRlMpICE9IG51bGwpIHsKLQkJCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gCi0JCQkJCShYbWxFbGVtZW50UmVmQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCQlpZiAoeG1sRWxlbWVudFJlZkFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLkFUVFJJQlVURV9NQVBQSU5HX19VTlNVUFBPUlRFRF9BTk5PVEFUSU9OLAotCQkJCQkJCQluZXcgU3RyaW5nW10geyBKQVhCLlhNTF9FTEVNRU5UX1JFRiwgSkFYQi5YTUxfRUxFTUVOVF9SRUZTIH0sCi0JCQkJCQkJCWdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwKLQkJCQkJCQkJeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmICh0aGlzLnhtbEVsZW1lbnRXcmFwcGVyICE9IG51bGwpIHsKLQkJCXRoaXMueG1sRWxlbWVudFdyYXBwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCQkKLQkJaWYgKHRoaXMueG1sTWl4ZWQgIT0gbnVsbCkgewotCQkJdGhpcy54bWxNaXhlZC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxFbGVtZW50UmVmc0NvbnRleHQKLQkJCWltcGxlbWVudHMgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmcy5Db250ZXh0IHsKLQkJCi0JCXByb3RlY3RlZCBYbWxFbGVtZW50UmVmc0Fubm90YXRpb24gZ2V0WG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKCkgewotCQkJcmV0dXJuIChYbWxFbGVtZW50UmVmc0Fubm90YXRpb24pIEdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcudGhpcy5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGUyk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBYbWxFbGVtZW50UmVmc0Fubm90YXRpb24gYWRkWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKCkgewotCQkJcmV0dXJuIChYbWxFbGVtZW50UmVmc0Fubm90YXRpb24pIEdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcudGhpcy5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGUyk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbigpIHsKLQkJCUdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcudGhpcy5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGUyk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiBnZXRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbigpIHsKLQkJCXJldHVybiAoWG1sRWxlbWVudFJlZkFubm90YXRpb24pIEdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcudGhpcy5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGKTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIGFkZFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKCkgewotCQkJcmV0dXJuIChYbWxFbGVtZW50UmVmQW5ub3RhdGlvbikgR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZy50aGlzLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxFbGVtZW50UmVmQW5ub3RhdGlvbigpIHsKLQkJCUdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcudGhpcy5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGKTsKLQkJfQotCQkKLQkJcHVibGljIExpc3RJdGVyYWJsZTxYbWxFbGVtZW50UmVmQW5ub3RhdGlvbj4gZ2V0WG1sRWxlbWVudFJlZkFubm90YXRpb25zKCkgewotCQkJWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiA9IGdldFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbigpOwotCQkJaWYgKHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5nZXRYbWxFbGVtZW50UmVmcygpOwotCQkJfQotCQkJCi0JCQlYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IGdldFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKCk7Ci0JCQlpZiAoeG1sRWxlbWVudFJlZkFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZSh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbik7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBFbXB0eUxpc3RJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgWG1sRWxlbWVudFJlZkFubm90YXRpb24gYWRkWG1sRWxlbWVudFJlZkFubm90YXRpb24oaW50IGluZGV4KSB7Ci0JCQlYbWxFbGVtZW50UmVmc0Fubm90YXRpb24geG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uID0gZ2V0WG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKCk7Ci0JCQlpZiAoeG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQlyZXR1cm4geG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uLmFkZFhtbEVsZW1lbnRSZWYoaW5kZXgpOwotCQkJfQotCQkJCi0JCQlYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IGdldFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKCk7Ci0JCQlpZiAoeG1sRWxlbWVudFJlZkFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCWlmIChpbmRleCA+IDEpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcudmFsdWVPZihpbmRleCkpOwotCQkJCX0KLQkJCQl4bWxFbGVtZW50UmVmc0Fubm90YXRpb24gPSBhZGRYbWxFbGVtZW50UmVmc0Fubm90YXRpb24oKTsKLQkJCQlYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbkNvcHkgPSB4bWxFbGVtZW50UmVmc0Fubm90YXRpb24uYWRkWG1sRWxlbWVudFJlZigwKTsKLQkJCQl4bWxFbGVtZW50UmVmQW5ub3RhdGlvbkNvcHkuc2V0TmFtZSh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQkJCXhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uQ29weS5zZXROYW1lc3BhY2UoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQkJCXhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uQ29weS5zZXRSZXF1aXJlZCh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpKTsKLQkJCQl4bWxFbGVtZW50UmVmQW5ub3RhdGlvbkNvcHkuc2V0VHlwZSh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQkJCQotCQkJCXJlbW92ZVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKCk7Ci0JCQkJCi0JCQkJcmV0dXJuIHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5hZGRYbWxFbGVtZW50UmVmKGluZGV4KTsKLQkJCX0KLQkJCQotCQkJaWYgKGluZGV4ID4gMCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLnZhbHVlT2YoaW5kZXgpKTsKLQkJCX0KLQkJCXJldHVybiBhZGRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbigpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihpbnQgaW5kZXgpIHsKLQkJCVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmc0Fubm90YXRpb24gPSBnZXRYbWxFbGVtZW50UmVmc0Fubm90YXRpb24oKTsKLQkJCWlmICh4bWxFbGVtZW50UmVmc0Fubm90YXRpb24gIT0gbnVsbCkgewotCQkJCXhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5yZW1vdmVYbWxFbGVtZW50UmVmKGluZGV4KTsKLQkJCQlpZiAoeG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uLmdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpID09IDApIHsKLQkJCQkJcmVtb3ZlWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5nZXRYbWxFbGVtZW50UmVmc1NpemUoKSA9PSAxKSB7Ci0JCQkJCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gQ29sbGVjdGlvblRvb2xzLmdldCh4bWxFbGVtZW50UmVmc0Fubm90YXRpb24uZ2V0WG1sRWxlbWVudFJlZnMoKSwgMCk7Ci0JCQkJCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uQ29weSA9IGFkZFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKCk7Ci0JCQkJCXhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uQ29weS5zZXROYW1lKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCQkJCXhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uQ29weS5zZXROYW1lc3BhY2UoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQkJCQl4bWxFbGVtZW50UmVmQW5ub3RhdGlvbkNvcHkuc2V0UmVxdWlyZWQoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0UmVxdWlyZWQoKSk7Ci0JCQkJCXhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uQ29weS5zZXRUeXBlKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCQkJCXJlbW92ZVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbigpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gZ2V0WG1sRWxlbWVudFJlZkFubm90YXRpb24oKTsKLQkJCWlmICh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKGluZGV4ICE9IDApIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcudmFsdWVPZihpbmRleCkpOwotCQkJCX0KLQkJCQlyZW1vdmVYbWxFbGVtZW50UmVmQW5ub3RhdGlvbigpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcudmFsdWVPZihpbmRleCkpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBtb3ZlWG1sRWxlbWVudFJlZkFubm90YXRpb24oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCWlmICh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiA9IGdldFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbigpOwotCQkJaWYgKHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcudmFsdWVPZih0YXJnZXRJbmRleCkgKyAiLCAiICsgU3RyaW5nLnZhbHVlT2Yoc291cmNlSW5kZXgpKTsKLQkJCX0KLQkJCXhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5tb3ZlWG1sRWxlbWVudFJlZih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl9Ci0JCQotCQlwdWJsaWMgWG1sRWxlbWVudFJlZiBidWlsZFhtbEVsZW1lbnRSZWYoSmF2YUNvbnRleHROb2RlIHBhcmVudCwgWG1sRWxlbWVudFJlZkFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWYocGFyZW50LCBuZXcgWG1sRWxlbWVudFJlZkNvbnRleHQoYW5ub3RhdGlvbikpOwotCQl9Ci0JCQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmc0Fubm90YXRpb24gPSBnZXRYbWxFbGVtZW50UmVmc0Fubm90YXRpb24oKTsKLQkJCWlmICh4bWxFbGVtZW50UmVmc0Fubm90YXRpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiB4bWxFbGVtZW50UmVmc0Fubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCQkJfQotCQkJCi0JCQlYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IGdldFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKCk7Ci0JCQlpZiAoeG1sRWxlbWVudFJlZkFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nLnRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sRWxlbWVudFJlZkNvbnRleHQKLQkJCWltcGxlbWVudHMgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmLkNvbnRleHQgewotCQkKLQkJcHJvdGVjdGVkIFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIGFubm90YXRpb247Ci0JCQotCQlwdWJsaWMgWG1sRWxlbWVudFJlZkNvbnRleHQoWG1sRWxlbWVudFJlZkFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQkJdGhpcy5hbm5vdGF0aW9uID0gYW5ub3RhdGlvbjsKLQkJfQotCQkKLQkJcHVibGljIFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uOwotCQl9Ci0JCQotCQlwdWJsaWMgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgZ2V0QXR0cmlidXRlTWFwcGluZygpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nLnRoaXM7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFR5cGUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIFhtbEVsZW1lbnRXcmFwcGVyIGdldEVsZW1lbnRXcmFwcGVyKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcudGhpcy5nZXRYbWxFbGVtZW50V3JhcHBlcigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sQXR0YWNobWVudFJlZi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sQXR0YWNobWVudFJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2NhMmZjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEF0dGFjaG1lbnRSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEF0dGFjaG1lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxBdHRhY2htZW50UmVmCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhQ29udGV4dE5vZGUKLQkJaW1wbGVtZW50cyBYbWxBdHRhY2htZW50UmVmIHsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgWG1sQXR0YWNobWVudFJlZkFubm90YXRpb24gcmVzb3VyY2VYbWxBdHRhY2htZW50UmVmOwotCQotCQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbEF0dGFjaG1lbnRSZWYoSmF4YkF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiByZXNvdXJjZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnJlc291cmNlWG1sQXR0YWNobWVudFJlZiA9IHJlc291cmNlOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEpheGJBdHRyaWJ1dGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGdldFBhcmVudCgpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VYbWxBdHRhY2htZW50UmVmLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkOTQyOGMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbE5zRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5KcHRKYXhiQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhWG1sSURSRUYuVmFsaWRhdGFibGVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlFOYW1lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQXR0cmlidXRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhWG1sTmFtZWROb2RlTWFwcGluZzxYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uPgotCQlpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcgewotCQotCXByb3RlY3RlZCBmaW5hbCBKYXhiUU5hbWUgcU5hbWU7Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkUmVxdWlyZWQ7Ci0JCi0JCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5xTmFtZSA9IGJ1aWxkUU5hbWUoKTsKLQkJdGhpcy5zcGVjaWZpZWRSZXF1aXJlZCA9IGJ1aWxkU3BlY2lmaWVkUmVxdWlyZWQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnFOYW1lLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc2V0U3BlY2lmaWVkUmVxdWlyZWRfKGJ1aWxkU3BlY2lmaWVkUmVxdWlyZWQoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMucU5hbWUudXBkYXRlKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuWE1MX0FUVFJJQlVURV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0FUVFJJQlVURTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc2NoZW1hIGNvbXBvbmVudCByZWYgKioqKioKLQkKLQlwdWJsaWMgSmF4YlFOYW1lIGdldFFOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5xTmFtZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJRTmFtZSBidWlsZFFOYW1lKCkgewotCQlyZXR1cm4gbmV3IFhtbEF0dHJpYnV0ZVFOYW1lKHRoaXMpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxBdHRyaWJ1dGUucmVxdWlyZWQgKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRSZXF1aXJlZCA9PSBudWxsKSA/IGlzRGVmYXVsdFJlcXVpcmVkKCkgOiB0aGlzLnNwZWNpZmllZFJlcXVpcmVkLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUmVxdWlyZWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFJlcXVpcmVkKEJvb2xlYW4gbmV3U3BlY2lmaWVkUmVxdWlyZWQpIHsKLQkJZ2V0T3JDcmVhdGVBbm5vdGF0aW9uKCkuc2V0UmVxdWlyZWQobmV3U3BlY2lmaWVkUmVxdWlyZWQpOwotCQlzZXRTcGVjaWZpZWRSZXF1aXJlZF8obmV3U3BlY2lmaWVkUmVxdWlyZWQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRSZXF1aXJlZF8oQm9vbGVhbiBuZXdTcGVjaWZpZWRSZXF1aXJlZCkgewotCQlCb29sZWFuIG9sZFJlcXVpcmVkID0gdGhpcy5zcGVjaWZpZWRSZXF1aXJlZDsKLQkJdGhpcy5zcGVjaWZpZWRSZXF1aXJlZCA9IG5ld1NwZWNpZmllZFJlcXVpcmVkOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9SRVFVSVJFRF9QUk9QRVJUWSwgb2xkUmVxdWlyZWQsIG5ld1NwZWNpZmllZFJlcXVpcmVkKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRTcGVjaWZpZWRSZXF1aXJlZCgpIHsKLQkJWG1sQXR0cmlidXRlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogYW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxMaXN0ICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRGVmYXVsdFhtbExpc3QoKSB7Ci0JCXJldHVybiBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNKYXZhUmVzb3VyY2VBdHRyaWJ1dGVDb2xsZWN0aW9uVHlwZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxJRFJFRiAqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBHZW5lcmljSmF2YVhtbElEUkVGLkNvbnRleHQgYnVpbGRYbWxJRFJFRkNvbnRleHQoKSB7Ci0JCXJldHVybiBuZXcgWG1sSURSRUZDb250ZXh0KCk7Ci0JfQotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQlwdWJsaWMgWHNkRmVhdHVyZSBnZXRYc2RGZWF0dXJlKCkgewotCQlYc2RUeXBlRGVmaW5pdGlvbiB0eXBlID0gZ2V0SmF4YkNsYXNzTWFwcGluZygpLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCVhzZEF0dHJpYnV0ZVVzZSBhdHRyaWJ1dGVVc2UgPSB0eXBlLmdldEF0dHJpYnV0ZSh0aGlzLnFOYW1lLmdldE5hbWVzcGFjZSgpLCB0aGlzLnFOYW1lLmdldE5hbWUoKSk7Ci0JCQlyZXR1cm4gKGF0dHJpYnV0ZVVzZSA9PSBudWxsKSA/IG51bGwgOiBhdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWHNkVHlwZURlZmluaXRpb24gZ2V0RGF0YVR5cGVYc2RUeXBlRGVmaW5pdGlvbigpIHsKLQkJWHNkVHlwZURlZmluaXRpb24geHNkVHlwZSA9IHN1cGVyLmdldERhdGFUeXBlWHNkVHlwZURlZmluaXRpb24oKTsKLQkJaWYgKHhzZFR5cGUgIT0gbnVsbCAKLQkJCQkmJiBpc1htbExpc3QoKSAKLQkJCQkmJiB4c2RUeXBlLmdldEtpbmQoKSA9PSBYc2RUeXBlRGVmaW5pdGlvbi5LaW5kLlNJTVBMRSAKLQkJCQkmJiAoKFhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKSB4c2RUeXBlKS5nZXRJdGVtVHlwZSgpICE9IG51bGwpIHsKLQkJCXhzZFR5cGUgPSAoKFhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKSB4c2RUeXBlKS5nZXRJdGVtVHlwZSgpOwotCQl9Ci0JCXJldHVybiB4c2RUeXBlOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXJlc3VsdCA9IHRoaXMucU5hbWUuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCXZhbGlkYXRlUU5hbWUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdmFsaWRhdGVTY2hlbWFUeXBlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUU5hbWUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5xTmFtZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVNjaGVtYVR5cGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJWHNkRmVhdHVyZSB4c2RGZWF0dXJlID0gZ2V0WHNkRmVhdHVyZSgpOwotCQlpZiAoeHNkRmVhdHVyZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVhzZFR5cGVEZWZpbml0aW9uIGV4cGVjdGVkU2NoZW1hVHlwZSA9IG51bGw7Ci0JCWlmICh0aGlzLnhtbElEICE9IG51bGwpIHsKLQkJCWV4cGVjdGVkU2NoZW1hVHlwZSA9IFhzZFV0aWwuZ2V0U2NoZW1hRm9yU2NoZW1hKCkuZ2V0VHlwZURlZmluaXRpb24oIklEIik7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy54bWxJRFJFRiAhPSBudWxsKSB7Ci0JCQlleHBlY3RlZFNjaGVtYVR5cGUgPSBYc2RVdGlsLmdldFNjaGVtYUZvclNjaGVtYSgpLmdldFR5cGVEZWZpbml0aW9uKCJJRFJFRiIpOwotCQl9Ci0JCWVsc2UgewotCQkJZXhwZWN0ZWRTY2hlbWFUeXBlID0gZ2V0RGF0YVR5cGVYc2RUeXBlRGVmaW5pdGlvbigpOwotCQl9Ci0JCQotCQlpZiAoZXhwZWN0ZWRTY2hlbWFUeXBlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJYm9vbGVhbiBpc0l0ZW1UeXBlID0gaXNYbWxMaXN0KCkgJiYgdGhpcy54bWxTY2hlbWFUeXBlID09IG51bGw7Ci0JCWlmICghIHhzZEZlYXR1cmUudHlwZUlzVmFsaWQoZXhwZWN0ZWRTY2hlbWFUeXBlLCBpc0l0ZW1UeXBlKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0FUVFJJQlVURV9fSU5WQUxJRF9TQ0hFTUFfVFlQRSwKLQkJCQkJCQluZXcgU3RyaW5nW10geyBnZXRWYWx1ZVR5cGVOYW1lKCksIHhzZEZlYXR1cmUuZ2V0TmFtZSgpIH0sCi0JCQkJCQkJdGhpcywKLQkJCQkJCQl0aGlzLnFOYW1lLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sQXR0cmlidXRlUU5hbWUKLQkJCWV4dGVuZHMgQWJzdHJhY3RKYXZhUU5hbWUgewotCQkKLQkJcHJvdGVjdGVkIFhtbEF0dHJpYnV0ZVFOYW1lKEphdmFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudCwgbmV3IFFOYW1lQW5ub3RhdGlvblByb3h5KCkpOwotCQl9Ci0JCQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXhiUGFja2FnZSBnZXRKYXhiUGFja2FnZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcudGhpcy5nZXRKYXhiUGFja2FnZSgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29tcG9uZW50VHlwZURlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIEpwdEpheGJDb3JlTWVzc2FnZXMuWE1MX0FUVFJJQlVURV9ERVNDOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcudGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0TmFtZSgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0TmFtZVByb3Bvc2FscyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCVhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUgPSBHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcudGhpcy5nZXRKYXhiQ2xhc3NNYXBwaW5nKCkuZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQkJCXJldHVybiAoeHNkVHlwZSA9PSBudWxsKSA/IEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKSA6IHhzZFR5cGUuZ2V0QXR0cmlidXRlTmFtZVByb3Bvc2FscyhnZXROYW1lc3BhY2UoKSwgZmlsdGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWVzcGFjZSgpIHsKLQkJCUpheGJQYWNrYWdlIGpheGJQYWNrYWdlID0gdGhpcy5nZXRKYXhiUGFja2FnZSgpOwotCQkJcmV0dXJuIChqYXhiUGFja2FnZSAhPSBudWxsICYmIGpheGJQYWNrYWdlLmdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkgPT0gWG1sTnNGb3JtLlFVQUxJRklFRCkgPwotCQkJCQlHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcudGhpcy5nZXRKYXhiQ2xhc3NNYXBwaW5nKCkuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSA6ICIiOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0TmFtZXNwYWNlUHJvcG9zYWxzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJWHNkU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0WHNkU2NoZW1hKCk7Ci0JCQlyZXR1cm4gKHNjaGVtYSA9PSBudWxsKSA/IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpIDogc2NoZW1hLmdldE5hbWVzcGFjZVByb3Bvc2FscyhmaWx0ZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVSZWZlcmVuY2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCVhzZFR5cGVEZWZpbml0aW9uIHR5cGUgPSBnZXRKYXhiQ2xhc3NNYXBwaW5nKCkuZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQlpZiAodHlwZS5nZXRBdHRyaWJ1dGUoZ2V0TmFtZXNwYWNlKCksIGdldE5hbWUoKSkgPT0gbnVsbCkgewotCQkJCQltZXNzYWdlcy5hZGQoZ2V0VW5yZXNvbHZlU2NoZW1hQ29tcG9uZW50TWVzc2FnZShhc3RSb290KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBRTmFtZUFubm90YXRpb25Qcm94eSAKLQkJCWV4dGVuZHMgQWJzdHJhY3RKYXZhUU5hbWUuQWJzdHJhY3RRTmFtZUFubm90YXRpb25Qcm94eSB7Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFFOYW1lQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKGJvb2xlYW4gY3JlYXRlSWZOdWxsKSB7Ci0JCQlpZiAoY3JlYXRlSWZOdWxsKSB7Ci0JCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZy50aGlzLmdldE9yQ3JlYXRlQW5ub3RhdGlvbigpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZy50aGlzLmdldEFubm90YXRpb24oKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sSURSRUZDb250ZXh0Ci0JCQlleHRlbmRzIEFic3RyYWN0SmF2YVhtbE5hbWVkTm9kZU1hcHBpbmcuWG1sSURSRUZDb250ZXh0IHsKLQkJCi0JCXB1YmxpYyBJdGVyYWJsZTxWYWxpZGF0YWJsZVJlZmVyZW5jZT4gZ2V0UmVmZXJlbmNlcygpIHsKLQkJCQotCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8VmFsaWRhdGFibGVSZWZlcmVuY2U+KAotCQkJCQkKLQkJCQkJbmV3IFZhbGlkYXRhYmxlUmVmZXJlbmNlKCkgewotCQkJCQkJCi0JCQkJCQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpIHsKLQkJCQkJCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nLnRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZUJhc2VUeXBlTmFtZSgpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlwdWJsaWMgVGV4dFJhbmdlIGdldFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCQkJCQkvLyAxKSBpZiB3ZSdyZSBnZXR0aW5nIGhlcmUsIFhtbElEUkVGIHdpbGwgbm90IGJlIG51bGwKLQkJCQkJCQkvLyAyKSB1c2UgdGhlIEBYbWxJRFJFRiB0ZXh0IHJhbmdlLCBzaW5jZSB0aGVyZSBpcyBubyBzcGVjaWZpYyBwbGFjZSB3aGVyZSB0aGUgdHlwZSBpcyBzcGVjaWZpZWQKLQkJCQkJCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nLnRoaXMuZ2V0WG1sSURSRUYoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlwdWJsaWMgWHNkRmVhdHVyZSBnZXRYc2RGZWF0dXJlKCkgewotCQkJCQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcudGhpcy5nZXRYc2RGZWF0dXJlKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0WHNkRmVhdHVyZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJCQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcudGhpcy5nZXRRTmFtZSgpLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaXNMaXN0KCkgewotCQkJcmV0dXJuIHN1cGVyLmlzTGlzdCgpIAotCQkJCXx8IEdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZy50aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc0phdmFSZXNvdXJjZUF0dHJpYnV0ZUNvbGxlY3Rpb25UeXBlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMDdiN2YuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KYXhiVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5RTmFtZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZEVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sRWxlbWVudAotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgWG1sRWxlbWVudCB7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHQgY29udGV4dDsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF4YlFOYW1lIHFOYW1lOwotCQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZE5pbGxhYmxlOwotCQotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHROaWxsYWJsZTsKLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRSZXF1aXJlZDsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFR5cGU7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VHlwZTsKLQkKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxFbGVtZW50KEphdmFDb250ZXh0Tm9kZSBwYXJlbnQsIENvbnRleHQgY29udGV4dCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCQl0aGlzLnFOYW1lID0gYnVpbGRRTmFtZSgpOwotCQl0aGlzLnNwZWNpZmllZE5pbGxhYmxlID0gYnVpbGRTcGVjaWZpZWROaWxsYWJsZSgpOwotCQl0aGlzLmRlZmF1bHROaWxsYWJsZSA9IGJ1aWxkRGVmYXVsdE5pbGxhYmxlKCk7Ci0JCXRoaXMuc3BlY2lmaWVkUmVxdWlyZWQgPSBidWlsZFNwZWNpZmllZFJlcXVpcmVkKCk7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gYnVpbGREZWZhdWx0VmFsdWUoKTsKLQkJdGhpcy5zcGVjaWZpZWRUeXBlID0gYnVpbGRTcGVjaWZpZWRUeXBlKCk7Ci0JCXRoaXMuZGVmYXVsdFR5cGUgPSBidWlsZERlZmF1bHRUeXBlKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5xTmFtZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXNldFNwZWNpZmllZE5pbGxhYmxlXyhidWlsZFNwZWNpZmllZE5pbGxhYmxlKCkpOwotCQlzZXREZWZhdWx0TmlsbGFibGVfKGJ1aWxkRGVmYXVsdE5pbGxhYmxlKCkpOwotCQlzZXRTcGVjaWZpZWRSZXF1aXJlZF8oYnVpbGRTcGVjaWZpZWRSZXF1aXJlZCgpKTsKLQkJc2V0RGVmYXVsdFZhbHVlXyhidWlsZERlZmF1bHRWYWx1ZSgpKTsKLQkJc2V0U3BlY2lmaWVkVHlwZV8oYnVpbGRTcGVjaWZpZWRUeXBlKCkpOwotCQlzZXREZWZhdWx0VHlwZV8oYnVpbGREZWZhdWx0VHlwZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5xTmFtZS51cGRhdGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YUNvbnRleHROb2RlKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuY29udGV4dDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGdldEF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiBnZXRDb250ZXh0KCkuZ2V0QXR0cmlidXRlTWFwcGluZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGdldENvbnRleHQoKS5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YkNsYXNzTWFwcGluZyBnZXRKYXhiQ2xhc3NNYXBwaW5nKCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldENsYXNzTWFwcGluZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoKSB7Ci0JCXJldHVybiBnZXRKYXhiQ2xhc3NNYXBwaW5nKCkuZ2V0SmF4YlR5cGUoKS5nZXRKYXhiUGFja2FnZSgpOwotCX0KLQkKLQlwdWJsaWMgWG1sRWxlbWVudEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihib29sZWFuIGNyZWF0ZUlmTnVsbCkgewotCQlyZXR1cm4gdGhpcy5jb250ZXh0LmdldEFubm90YXRpb24oY3JlYXRlSWZOdWxsKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc2NoZW1hIGNvbXBvbmVudCByZWYgKioqKioKLQkKLQlwdWJsaWMgSmF4YlFOYW1lIGdldFFOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5xTmFtZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJRTmFtZSBidWlsZFFOYW1lKCkgewotCQlyZXR1cm4gbmV3IFhtbEVsZW1lbnRRTmFtZSh0aGlzKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sRWxlbWVudC5uaWxsYWJsZSAqKioqKgotCQotCXB1YmxpYyBib29sZWFuIGlzTmlsbGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWROaWxsYWJsZSA9PSBudWxsKSA/IGlzRGVmYXVsdE5pbGxhYmxlKCkgOiBnZXRTcGVjaWZpZWROaWxsYWJsZSgpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWROaWxsYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTmlsbGFibGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE5pbGxhYmxlKEJvb2xlYW4gbmV3U3BlY2lmaWVkTmlsbGFibGUpIHsKLQkJZ2V0QW5ub3RhdGlvbih0cnVlKS5zZXROaWxsYWJsZShuZXdTcGVjaWZpZWROaWxsYWJsZSk7Ci0JCXNldFNwZWNpZmllZE5pbGxhYmxlXyhuZXdTcGVjaWZpZWROaWxsYWJsZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE5pbGxhYmxlXyhCb29sZWFuIG5ld1NwZWNpZmllZE5pbGxhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkTmlsbGFibGUgPSB0aGlzLnNwZWNpZmllZE5pbGxhYmxlOwotCQl0aGlzLnNwZWNpZmllZE5pbGxhYmxlID0gbmV3U3BlY2lmaWVkTmlsbGFibGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX05JTExBQkxFX1BST1BFUlRZLCBvbGROaWxsYWJsZSwgbmV3U3BlY2lmaWVkTmlsbGFibGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZE5pbGxhYmxlKCkgewotCQlYbWxFbGVtZW50QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbihmYWxzZSk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBhbm5vdGF0aW9uLmdldE5pbGxhYmxlKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE5pbGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0TmlsbGFibGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHROaWxsYWJsZV8oYm9vbGVhbiBuZXdOaWxsYWJsZSkgewotCQlib29sZWFuIG9sZE5pbGxhYmxlID0gdGhpcy5kZWZhdWx0TmlsbGFibGU7Ci0JCXRoaXMuZGVmYXVsdE5pbGxhYmxlID0gbmV3TmlsbGFibGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9OSUxMQUJMRV9QUk9QRVJUWSwgb2xkTmlsbGFibGUsIG5ld05pbGxhYmxlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGREZWZhdWx0TmlsbGFibGUoKSB7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKGZhbHNlKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzSmF2YVJlc291cmNlQXR0cmlidXRlQ29sbGVjdGlvblR5cGUoKSA6IGZhbHNlOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxFbGVtZW50LnJlcXVpcmVkICoqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkUmVxdWlyZWQgPT0gbnVsbCkgPyBpc0RlZmF1bHRSZXF1aXJlZCgpIDogdGhpcy5zcGVjaWZpZWRSZXF1aXJlZC5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkUmVxdWlyZWQoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFJlcXVpcmVkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRSZXF1aXJlZChCb29sZWFuIG5ld1NwZWNpZmllZFJlcXVpcmVkKSB7Ci0JCWdldEFubm90YXRpb24odHJ1ZSkuc2V0UmVxdWlyZWQobmV3U3BlY2lmaWVkUmVxdWlyZWQpOwotCQlzZXRTcGVjaWZpZWRSZXF1aXJlZF8obmV3U3BlY2lmaWVkUmVxdWlyZWQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRSZXF1aXJlZF8oQm9vbGVhbiBuZXdTcGVjaWZpZWRSZXF1aXJlZCkgewotCQlCb29sZWFuIG9sZFJlcXVpcmVkID0gdGhpcy5zcGVjaWZpZWRSZXF1aXJlZDsKLQkJdGhpcy5zcGVjaWZpZWRSZXF1aXJlZCA9IG5ld1NwZWNpZmllZFJlcXVpcmVkOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9SRVFVSVJFRF9QUk9QRVJUWSwgb2xkUmVxdWlyZWQsIG5ld1NwZWNpZmllZFJlcXVpcmVkKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRTcGVjaWZpZWRSZXF1aXJlZCgpIHsKLQkJWG1sRWxlbWVudEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oZmFsc2UpOwotCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogYW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxFbGVtZW50LmRlZmF1bHRWYWx1ZSAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZShTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCWdldEFubm90YXRpb24odHJ1ZSkuc2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZSk7Ci0JCXNldERlZmF1bHRWYWx1ZV8oZGVmYXVsdFZhbHVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFZhbHVlXyhTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0VmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZTsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9WQUxVRV9QUk9QRVJUWSwgb2xkRGVmYXVsdFZhbHVlLCBkZWZhdWx0VmFsdWUpOwkJCi0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0VmFsdWUoKSB7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKGZhbHNlKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGFubm90YXRpb24uZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnQudHlwZSAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFR5cGUgPT0gbnVsbCkgPyBnZXREZWZhdWx0VHlwZSgpIDogdGhpcy5zcGVjaWZpZWRUeXBlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFR5cGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFR5cGUoU3RyaW5nIG5ld1NwZWNpZmllZFR5cGUpIHsKLQkJZ2V0QW5ub3RhdGlvbih0cnVlKS5zZXRUeXBlKG5ld1NwZWNpZmllZFR5cGUpOwotCQlzZXRTcGVjaWZpZWRUeXBlXyhuZXdTcGVjaWZpZWRUeXBlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVHlwZV8oU3RyaW5nIG5ld1NwZWNpZmllZFR5cGUpIHsKLQkJU3RyaW5nIG9sZFR5cGUgPSB0aGlzLnNwZWNpZmllZFR5cGU7Ci0JCXRoaXMuc3BlY2lmaWVkVHlwZSA9IG5ld1NwZWNpZmllZFR5cGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1RZUEVfUFJPUEVSVFksIG9sZFR5cGUsIG5ld1NwZWNpZmllZFR5cGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkVHlwZSgpIHsKLQkJWG1sRWxlbWVudEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oZmFsc2UpOwotCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogYW5ub3RhdGlvbi5nZXRUeXBlKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRUeXBlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VHlwZV8oU3RyaW5nIG5ld1R5cGUpIHsKLQkJU3RyaW5nIG9sZFR5cGUgPSB0aGlzLmRlZmF1bHRUeXBlOwotCQl0aGlzLmRlZmF1bHRUeXBlID0gbmV3VHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1RZUEVfUFJPUEVSVFksIG9sZFR5cGUsIG5ld1R5cGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRleHQuZ2V0RGVmYXVsdFR5cGUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFR5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRUeXBlID09IG51bGwpID8gZ2V0RGVmYXVsdFR5cGUoKSA6IGdldEFubm90YXRpb24oZmFsc2UpLmdldEZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKSB7Ci0JCS8vIG9ubHkgcmV0dXJuIHRoZSBzcGVjaWZpZWQgdHlwZSAtIHRoZSBkZWZhdWx0IHR5cGUgc2hvdWxkIGFscmVhZHkgYmUgaW5jbHVkZWQKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFR5cGUgPT0gbnVsbCkgPyAKLQkJCQlFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSAKLQkJCQk6IG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGUoZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgWHNkRWxlbWVudERlY2xhcmF0aW9uIGdldFhzZEVsZW1lbnQoKSB7Ci0JCVhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUgPSBnZXRKYXhiQ2xhc3NNYXBwaW5nKCkuZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQkJcmV0dXJuICh4c2RUeXBlID09IG51bGwpID8gbnVsbCA6IHhzZFR5cGUuZ2V0RWxlbWVudCh0aGlzLnFOYW1lLmdldE5hbWVzcGFjZSgpLCB0aGlzLnFOYW1lLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZXhwZWN0ZWQgc2NoZW1hIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBkYXRhIHR5cGUKLQkgKi8KLQlwdWJsaWMgWHNkVHlwZURlZmluaXRpb24gZ2V0VHlwZVhzZFR5cGVEZWZpbml0aW9uKCkgewotCQlTdHJpbmcgdHlwZSA9IGdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0eXBlKSB8fCBYbWxFbGVtZW50LkRFRkFVTFRfVFlQRV9QUk9QRVJUWS5lcXVhbHModHlwZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlKYXhiUGFja2FnZSBwa2cgPSBnZXRKYXhiUGFja2FnZSgpOwotCQlKYXhiUGFja2FnZUluZm8gcGtnSW5mbyA9IChwa2cgPT0gbnVsbCkgPyBudWxsIDogcGtnLmdldFBhY2thZ2VJbmZvKCk7Ci0JCWlmIChwa2dJbmZvICE9IG51bGwpIHsKLQkJCWZvciAoWG1sU2NoZW1hVHlwZSBzY2hlbWFUeXBlIDogcGtnSW5mby5nZXRYbWxTY2hlbWFUeXBlcygpKSB7Ci0JCQkJaWYgKHR5cGUuZXF1YWxzKHNjaGVtYVR5cGUuZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCkpKSB7Ci0JCQkJCXJldHVybiBzY2hlbWFUeXBlLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlKYXhiVHlwZU1hcHBpbmcgamF4YlR5cGVNYXBwaW5nID0gZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlTWFwcGluZyh0eXBlKTsKLQkJaWYgKGpheGJUeXBlTWFwcGluZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gamF4YlR5cGVNYXBwaW5nLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCX0KLQkJCi0JCVN0cmluZyBidWlsdEluVHlwZSA9IGdldEpheGJQcm9qZWN0KCkuZ2V0UGxhdGZvcm0oKS5nZXREZWZpbml0aW9uKCkuZ2V0U2NoZW1hVHlwZU1hcHBpbmcodHlwZSk7Ci0JCWlmIChidWlsdEluVHlwZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gWHNkVXRpbC5nZXRTY2hlbWFGb3JTY2hlbWEoKS5nZXRUeXBlRGVmaW5pdGlvbihidWlsdEluVHlwZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXJlc3VsdCA9IHRoaXMucU5hbWUuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKGZhbHNlKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSA6IGFubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJWG1sRWxlbWVudEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oZmFsc2UpOwotCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBnZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpIDogYW5ub3RhdGlvbi5nZXRUeXBlVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl2YWxpZGF0ZVFOYW1lKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXZhbGlkYXRlVHlwZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl2YWxpZGF0ZVNjaGVtYVR5cGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVRTmFtZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnFOYW1lLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVHlwZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlTdHJpbmcgZnFUeXBlID0gZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCk7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGZxVHlwZSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9FTEVNRU5UX19VTlNQRUNJRklFRF9UWVBFLAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJZ2V0VHlwZVRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JCWVsc2UgaWYgKCEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLnNwZWNpZmllZFR5cGUpCi0JCQkJLy8gdmVyaWZ5IHRoYXQgdHlwZSBhY3R1YWxseSBleGlzdHMgYmVmb3JlIHZhbGlkYXRpbmcKLQkJCQkmJiBKRFRUb29scy5maW5kVHlwZShnZXRKYXhiUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCksIGZxVHlwZSkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGF0dHJpYnV0ZUJhc2VUeXBlID0gZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldFZhbHVlVHlwZU5hbWUoKTsKLQkJCWlmICghIEpEVFRvb2xzLnR5cGVJc1N1YlR5cGUoZ2V0SmF4YlByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLCBmcVR5cGUsIGF0dHJpYnV0ZUJhc2VUeXBlKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9FTEVNRU5UX19JTExFR0FMX1RZUEUsCi0JCQkJCQkJCW5ldyBTdHJpbmdbXSB7IGF0dHJpYnV0ZUJhc2VUeXBlIH0sCi0JCQkJCQkJCXRoaXMsCi0JCQkJCQkJCWdldFR5cGVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJCQkJCQkJCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVTY2hlbWFUeXBlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVhzZEVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50ID0gZ2V0WHNkRWxlbWVudCgpOwotCQlpZiAoeHNkRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVhzZFR5cGVEZWZpbml0aW9uIGV4cGVjdGVkU2NoZW1hVHlwZSA9IG51bGw7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IHRoaXMuY29udGV4dC5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0RGF0YVR5cGVOYW1lKCk7Ci0JCWlmICghIFhtbEVsZW1lbnQuREVGQVVMVF9UWVBFX1BST1BFUlRZLmVxdWFscyhnZXRGdWxseVF1YWxpZmllZFR5cGUoKSkpIHsKLQkJCXR5cGVOYW1lID0gZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCk7Ci0JCX0KLQkJCi0JCWlmICh0aGlzLmNvbnRleHQuaGFzWG1sSUQoKSkgewotCQkJZXhwZWN0ZWRTY2hlbWFUeXBlID0gWHNkVXRpbC5nZXRTY2hlbWFGb3JTY2hlbWEoKS5nZXRUeXBlRGVmaW5pdGlvbigiSUQiKTsKLQkJfQotCQllbHNlIGlmICh0aGlzLmNvbnRleHQuaGFzWG1sSURSRUYoKSkgewotCQkJZXhwZWN0ZWRTY2hlbWFUeXBlID0gWHNkVXRpbC5nZXRTY2hlbWFGb3JTY2hlbWEoKS5nZXRUeXBlRGVmaW5pdGlvbigiSURSRUYiKTsKLQkJfQotCQllbHNlIGlmICh0aGlzLmNvbnRleHQuaGFzWG1sU2NoZW1hVHlwZSgpKSB7Ci0JCQlleHBlY3RlZFNjaGVtYVR5cGUgPSB0aGlzLmNvbnRleHQuZ2V0WG1sU2NoZW1hVHlwZSgpLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCX0KLQkJZWxzZSBpZiAoISBYbWxFbGVtZW50LkRFRkFVTFRfVFlQRV9QUk9QRVJUWS5lcXVhbHMoZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCkpKSB7Ci0JCQlleHBlY3RlZFNjaGVtYVR5cGUgPSBnZXRUeXBlWHNkVHlwZURlZmluaXRpb24oKTsKLQkJfQotCQllbHNlIHsKLQkJCWV4cGVjdGVkU2NoZW1hVHlwZSA9IHRoaXMuY29udGV4dC5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0RGF0YVR5cGVYc2RUeXBlRGVmaW5pdGlvbigpOwotCQl9Ci0JCQotCQlpZiAoZXhwZWN0ZWRTY2hlbWFUeXBlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKCEgeHNkRWxlbWVudC50eXBlSXNWYWxpZChleHBlY3RlZFNjaGVtYVR5cGUsIHRoaXMuY29udGV4dC5oYXNYbWxMaXN0KCkpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfRUxFTUVOVF9fSU5WQUxJRF9TQ0hFTUFfVFlQRSwKLQkJCQkJCQluZXcgU3RyaW5nW10geyB0eXBlTmFtZSwgeHNkRWxlbWVudC5nZXROYW1lKCkgfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCXRoaXMucU5hbWUuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxFbGVtZW50UU5hbWUKLQkJCWV4dGVuZHMgQWJzdHJhY3RKYXZhRWxlbWVudFFOYW1lIHsKLQkJCi0JCXByb3RlY3RlZCBYbWxFbGVtZW50UU5hbWUoSmF2YUNvbnRleHROb2RlIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50LCBuZXcgUU5hbWVBbm5vdGF0aW9uUHJveHkoKSk7Ci0JCX0KLQkJCi0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxFbGVtZW50LnRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFhtbEVsZW1lbnRXcmFwcGVyIGdldEVsZW1lbnRXcmFwcGVyKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudC50aGlzLmNvbnRleHQuZ2V0RWxlbWVudFdyYXBwZXIoKTsKLQkJfQkKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFFOYW1lQW5ub3RhdGlvblByb3h5IAotCQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFRTmFtZS5BYnN0cmFjdFFOYW1lQW5ub3RhdGlvblByb3h5IHsKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgUU5hbWVBbm5vdGF0aW9uIGdldEFubm90YXRpb24oYm9vbGVhbiBjcmVhdGVJZk51bGwpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEVsZW1lbnQudGhpcy5nZXRBbm5vdGF0aW9uKGNyZWF0ZUlmTnVsbCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIGludGVyZmFjZSBDb250ZXh0IHsKLQkJCi0JCUpheGJBdHRyaWJ1dGVNYXBwaW5nIGdldEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQkJCi0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIGdldEFubm90YXRpb24oYm9vbGVhbiBjcmVhdGVJZk51bGwpOwotCQkKLQkJU3RyaW5nIGdldERlZmF1bHRUeXBlKCk7Ci0JCQotCQlYbWxFbGVtZW50V3JhcHBlciBnZXRFbGVtZW50V3JhcHBlcigpOwotCQkKLQkJYm9vbGVhbiBoYXNYbWxJRCgpOwotCQkKLQkJYm9vbGVhbiBoYXNYbWxJRFJFRigpOwotCQkKLQkJYm9vbGVhbiBoYXNYbWxMaXN0KCk7Ci0JCQotCQlib29sZWFuIGhhc1htbFNjaGVtYVR5cGUoKTsKLQkJCi0JCVhtbFNjaGVtYVR5cGUgZ2V0WG1sU2NoZW1hVHlwZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWFhZTI1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxTY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhWG1sSURSRUYuVmFsaWRhdGFibGVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50V3JhcHBlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmcKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFYbWxOYW1lZE5vZGVNYXBwaW5nPFhtbEVsZW1lbnRBbm5vdGF0aW9uPgotCQlpbXBsZW1lbnRzIFhtbEVsZW1lbnRNYXBwaW5nIHsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgWG1sRWxlbWVudCB4bWxFbGVtZW50OwotCQotCXByb3RlY3RlZCBYbWxFbGVtZW50V3JhcHBlciB4bWxFbGVtZW50V3JhcHBlcjsKLQkKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy54bWxFbGVtZW50ID0gYnVpbGRYbWxFbGVtZW50KCk7Ci0JCWluaXRpYWxpemVYbWxFbGVtZW50V3JhcHBlcigpOwkJCQotCX0KLQkKLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0VMRU1FTlQ7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy54bWxFbGVtZW50LnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc3luY1htbEVsZW1lbnRXcmFwcGVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMueG1sRWxlbWVudC51cGRhdGUoKTsKLQkJdXBkYXRlWG1sRWxlbWVudFdyYXBwZXIoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sRWxlbWVudCAqKioqKgotCQotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEVsZW1lbnQ7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxFbGVtZW50IGJ1aWxkWG1sRWxlbWVudCgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVhtbEVsZW1lbnQodGhpcywgbmV3IFhtbEVsZW1lbnRDb250ZXh0KCkpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxFbGVtZW50V3JhcHBlciAqKioqKgotCQotCXB1YmxpYyBYbWxFbGVtZW50V3JhcHBlciBnZXRYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJcmV0dXJuIHRoaXMueG1sRWxlbWVudFdyYXBwZXI7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxFbGVtZW50V3JhcHBlciBidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sRWxlbWVudFdyYXBwZXIodGhpcywgbmV3IEdlbmVyaWNKYXZhWG1sRWxlbWVudFdyYXBwZXIuU2ltcGxlQ29udGV4dChnZXRYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24oKSkpOwotCX0KLQkKLQlwdWJsaWMgWG1sRWxlbWVudFdyYXBwZXIgYWRkWG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCWlmICh0aGlzLnhtbEVsZW1lbnRXcmFwcGVyICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCVhtbEVsZW1lbnRXcmFwcGVyIHhtbEVsZW1lbnRXcmFwcGVyID0gYnVpbGRYbWxFbGVtZW50V3JhcHBlcigpOwotCQlzZXRYbWxFbGVtZW50V3JhcHBlcl8oeG1sRWxlbWVudFdyYXBwZXIpOwotCQlyZXR1cm4geG1sRWxlbWVudFdyYXBwZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlpZiAodGhpcy54bWxFbGVtZW50V3JhcHBlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQlzZXRYbWxFbGVtZW50V3JhcHBlcl8obnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJaWYgKGdldFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbigpICE9IG51bGwpIHsKLQkJCXRoaXMueG1sRWxlbWVudFdyYXBwZXIgPSBidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiBnZXRYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJaWYgKGdldFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbigpICE9IG51bGwpIHsKLQkJCWlmIChnZXRYbWxFbGVtZW50V3JhcHBlcigpICE9IG51bGwpIHsKLQkJCQlnZXRYbWxFbGVtZW50V3JhcHBlcigpLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldFhtbEVsZW1lbnRXcmFwcGVyXyhidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJc2V0WG1sRWxlbWVudFdyYXBwZXJfKG51bGwpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlpZiAoZ2V0WG1sRWxlbWVudFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0JCQlnZXRYbWxFbGVtZW50V3JhcHBlcigpLnVwZGF0ZSgpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFhtbEVsZW1lbnRXcmFwcGVyXyhYbWxFbGVtZW50V3JhcHBlciB4bWxFbGVtZW50V3JhcHBlcikgewotCQlYbWxFbGVtZW50V3JhcHBlciBvbGRYbWxFbGVtZW50V3JhcHBlciA9IHRoaXMueG1sRWxlbWVudFdyYXBwZXI7Ci0JCXRoaXMueG1sRWxlbWVudFdyYXBwZXIgPSB4bWxFbGVtZW50V3JhcHBlcjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChYTUxfRUxFTUVOVF9XUkFQUEVSX1BST1BFUlRZLCBvbGRYbWxFbGVtZW50V3JhcHBlciwgeG1sRWxlbWVudFdyYXBwZXIpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxMaXN0ICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRGVmYXVsdFhtbExpc3QoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sSURSRUYgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgR2VuZXJpY0phdmFYbWxJRFJFRi5Db250ZXh0IGJ1aWxkWG1sSURSRUZDb250ZXh0KCkgewotCQlyZXR1cm4gbmV3IFhtbElEUkVGQ29udGV4dCgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQkJCXN1cGVyLmdldFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKSwKLQkJCQl0aGlzLnhtbEVsZW1lbnQuZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNQYXJ0aWNsZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgWHNkRmVhdHVyZSBnZXRYc2RGZWF0dXJlKCkgewotCQlYc2RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlID0gZ2V0SmF4YkNsYXNzTWFwcGluZygpLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCWlmICh4c2RUeXBlICE9IG51bGwpIHsKLQkJCVhtbEVsZW1lbnRXcmFwcGVyIGVsZW1lbnRXcmFwcGVyID0gdGhpcy54bWxFbGVtZW50V3JhcHBlcjsKLQkJCQotCQkJaWYgKGVsZW1lbnRXcmFwcGVyID09IG51bGwpIHsKLQkJCQlyZXR1cm4geHNkVHlwZS5nZXRFbGVtZW50KHRoaXMueG1sRWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpLCB0aGlzLnhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJWHNkRWxlbWVudERlY2xhcmF0aW9uIHhzZFdyYXBwZXJFbGVtZW50ID0gZWxlbWVudFdyYXBwZXIuZ2V0WHNkRWxlbWVudERlY2xhcmF0aW9uKCk7Ci0JCQkJaWYgKHhzZFdyYXBwZXJFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHhzZFdyYXBwZXJFbGVtZW50LmdldEVsZW1lbnQodGhpcy54bWxFbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCksIHRoaXMueG1sRWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9CQkKLQkJcmV0dXJuIG51bGw7CQotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXJlc3VsdCA9IHRoaXMueG1sRWxlbWVudC5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCWlmICh0aGlzLnhtbEVsZW1lbnRXcmFwcGVyICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHRoaXMueG1sRWxlbWVudFdyYXBwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJdGhpcy54bWxFbGVtZW50LnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlpZiAodGhpcy54bWxFbGVtZW50V3JhcHBlciAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbEVsZW1lbnRXcmFwcGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFhtbEVsZW1lbnRDb250ZXh0Ci0JCQlpbXBsZW1lbnRzIEdlbmVyaWNKYXZhWG1sRWxlbWVudC5Db250ZXh0IHsKLQkJCi0JCXB1YmxpYyBYbWxFbGVtZW50QW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKGJvb2xlYW4gY3JlYXRlSWZOdWxsKSB7Ci0JCQlyZXR1cm4gKGNyZWF0ZUlmTnVsbCkgPyAKLQkJCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZy50aGlzLmdldE9yQ3JlYXRlQW5ub3RhdGlvbigpIAotCQkJCQk6IEdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmcudGhpcy5nZXRBbm5vdGF0aW9uKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmcudGhpczsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VHlwZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nLnRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZUJhc2VUeXBlTmFtZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgWG1sRWxlbWVudFdyYXBwZXIgZ2V0RWxlbWVudFdyYXBwZXIoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZy50aGlzLmdldFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGhhc1htbElEKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmcudGhpcy5nZXRYbWxJRCgpICE9IG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGhhc1htbElEUkVGKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmcudGhpcy5nZXRYbWxJRFJFRigpICE9IG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGhhc1htbExpc3QoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZy50aGlzLmlzWG1sTGlzdCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBoYXNYbWxTY2hlbWFUeXBlKCkgewotCQkJcmV0dXJuIGdldFhtbFNjaGVtYVR5cGUoKSAhPSBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgWG1sU2NoZW1hVHlwZSBnZXRYbWxTY2hlbWFUeXBlKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmcudGhpcy5nZXRYbWxTY2hlbWFUeXBlKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFhtbElEUkVGQ29udGV4dAotCQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFYbWxOYW1lZE5vZGVNYXBwaW5nLlhtbElEUkVGQ29udGV4dCB7Ci0JCQotCQlwdWJsaWMgSXRlcmFibGU8VmFsaWRhdGFibGVSZWZlcmVuY2U+IGdldFJlZmVyZW5jZXMoKSB7Ci0JCQkKLQkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFZhbGlkYXRhYmxlUmVmZXJlbmNlPigKLQkJCQkJCi0JCQkJCW5ldyBWYWxpZGF0YWJsZVJlZmVyZW5jZSgpIHsKLQkJCQkJCQotCQkJCQkJcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFR5cGUoKSB7Ci0JCQkJCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmcudGhpcy54bWxFbGVtZW50LmdldFR5cGUoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHVibGljIFRleHRSYW5nZSBnZXRUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQkJCQkJLy8gMSkgaWYgd2UncmUgZ2V0dGluZyBoZXJlLCBYbWxJRFJFRiB3aWxsIG5vdCBiZSBudWxsCi0JCQkJCQkJLy8gMikgaWYgdGhlcmUgaXMgYW4gQFhtbEVsZW1lbnQgYW5ub3RhdGlvbiwgdXNlIHRoYXQsIG90aGVyd2lzZSB1c2UgdGhlIEBYbWxJRFJFRgotCQkJCQkJCXJldHVybiAoR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZy50aGlzLmdldEFubm90YXRpb24oKSA9PSBudWxsKSA/Ci0JCQkJCQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nLnRoaXMuZ2V0WG1sSURSRUYoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJCQkJCQk6IEdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmcudGhpcy54bWxFbGVtZW50LmdldFR5cGVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyBYc2RGZWF0dXJlIGdldFhzZEZlYXR1cmUoKSB7Ci0JCQkJCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmcudGhpcy5nZXRYc2RGZWF0dXJlKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0WHNkRmVhdHVyZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJCQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nLnRoaXMueG1sRWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sRWxlbWVudFJlZi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sRWxlbWVudFJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTQxZTQwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnRSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJRTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFJvb3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuUU5hbWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50UmVmQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWYKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZSAKLQkJaW1wbGVtZW50cyBYbWxFbGVtZW50UmVmIHsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dCBjb250ZXh0OwotCQotCXByb3RlY3RlZCBmaW5hbCBKYXhiUU5hbWUgcU5hbWU7Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkUmVxdWlyZWQ7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRUeXBlOwotCQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFR5cGU7Ci0JCi0JCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZihKYXZhQ29udGV4dE5vZGUgcGFyZW50LCBDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQkJdGhpcy5xTmFtZSA9IGJ1aWxkUU5hbWUoKTsKLQkJdGhpcy5zcGVjaWZpZWRSZXF1aXJlZCA9IGJ1aWxkU3BlY2lmaWVkUmVxdWlyZWQoKTsKLQkJdGhpcy5zcGVjaWZpZWRUeXBlID0gYnVpbGRTcGVjaWZpZWRUeXBlKCk7Ci0JCXRoaXMuZGVmYXVsdFR5cGUgPSBidWlsZERlZmF1bHRUeXBlKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5xTmFtZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXNldFNwZWNpZmllZFJlcXVpcmVkXyhidWlsZFNwZWNpZmllZFJlcXVpcmVkKCkpOwotCQlzZXRTcGVjaWZpZWRUeXBlXyhidWlsZFNwZWNpZmllZFR5cGUoKSk7Ci0JCXNldERlZmF1bHRUeXBlXyhidWlsZERlZmF1bHRUeXBlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnFOYW1lLnVwZGF0ZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUNvbnRleHROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29udGV4dCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gdGhpcy5jb250ZXh0OwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGdldENvbnRleHQoKS5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YkNsYXNzTWFwcGluZyBnZXRKYXhiQ2xhc3NNYXBwaW5nKCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldENsYXNzTWFwcGluZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoKSB7Ci0JCXJldHVybiBnZXRKYXhiQ2xhc3NNYXBwaW5nKCkuZ2V0SmF4YlR5cGUoKS5nZXRKYXhiUGFja2FnZSgpOwotCX0KLQkKLQlwdWJsaWMgWG1sRWxlbWVudFJlZkFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuY29udGV4dC5nZXRBbm5vdGF0aW9uKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHNjaGVtYSBjb21wb25lbnQgcmVmICoqKioqCi0JCi0JcHVibGljIEpheGJRTmFtZSBnZXRRTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucU5hbWU7Ci0JfQotCQotCXByb3RlY3RlZCBKYXhiUU5hbWUgYnVpbGRRTmFtZSgpIHsKLQkJcmV0dXJuIG5ldyBYbWxFbGVtZW50UmVmUU5hbWUodGhpcyk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnRSZWYucmVxdWlyZWQgKioqKioKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkUmVxdWlyZWQgPT0gbnVsbCkgPyBpc0RlZmF1bHRSZXF1aXJlZCgpIDogdGhpcy5zcGVjaWZpZWRSZXF1aXJlZC5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkUmVxdWlyZWQoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFJlcXVpcmVkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRSZXF1aXJlZChCb29sZWFuIG5ld1NwZWNpZmllZFJlcXVpcmVkKSB7Ci0JCWdldEFubm90YXRpb24oKS5zZXRSZXF1aXJlZChuZXdTcGVjaWZpZWRSZXF1aXJlZCk7Ci0JCXNldFNwZWNpZmllZFJlcXVpcmVkXyhuZXdTcGVjaWZpZWRSZXF1aXJlZCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFJlcXVpcmVkXyhCb29sZWFuIG5ld1NwZWNpZmllZFJlcXVpcmVkKSB7Ci0JCUJvb2xlYW4gb2xkUmVxdWlyZWQgPSB0aGlzLnNwZWNpZmllZFJlcXVpcmVkOwotCQl0aGlzLnNwZWNpZmllZFJlcXVpcmVkID0gbmV3U3BlY2lmaWVkUmVxdWlyZWQ7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1JFUVVJUkVEX1BST1BFUlRZLCBvbGRSZXF1aXJlZCwgbmV3U3BlY2lmaWVkUmVxdWlyZWQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZFJlcXVpcmVkKCkgewotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbigpLmdldFJlcXVpcmVkKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJlcXVpcmVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnRSZWYudHlwZSAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFR5cGUgPT0gbnVsbCkgPyBnZXREZWZhdWx0VHlwZSgpIDogdGhpcy5zcGVjaWZpZWRUeXBlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFR5cGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFR5cGUoU3RyaW5nIG5ld1NwZWNpZmllZFR5cGUpIHsKLQkJZ2V0QW5ub3RhdGlvbigpLnNldFR5cGUobmV3U3BlY2lmaWVkVHlwZSk7Ci0JCXNldFNwZWNpZmllZFR5cGVfKG5ld1NwZWNpZmllZFR5cGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRUeXBlXyhTdHJpbmcgbmV3U3BlY2lmaWVkVHlwZSkgewotCQlTdHJpbmcgb2xkVHlwZSA9IHRoaXMuc3BlY2lmaWVkVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWRUeXBlID0gbmV3U3BlY2lmaWVkVHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVFlQRV9QUk9QRVJUWSwgb2xkVHlwZSwgbmV3U3BlY2lmaWVkVHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRUeXBlKCkgewotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbigpLmdldFR5cGUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFR5cGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRUeXBlXyhTdHJpbmcgbmV3VHlwZSkgewotCQlTdHJpbmcgb2xkVHlwZSA9IHRoaXMuZGVmYXVsdFR5cGU7Ci0JCXRoaXMuZGVmYXVsdFR5cGUgPSBuZXdUeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVFlQRV9QUk9QRVJUWSwgb2xkVHlwZSwgbmV3VHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29udGV4dC5nZXREZWZhdWx0VHlwZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFR5cGUgPT0gbnVsbCkgPyBnZXREZWZhdWx0VHlwZSgpIDogZ2V0QW5ub3RhdGlvbigpLmdldEZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKSB7Ci0JCS8vIG9ubHkgcmV0dXJuIHRoZSBzcGVjaWZpZWQgdHlwZSAtIHRoZSBkZWZhdWx0IHR5cGUgc2hvdWxkIGFscmVhZHkgYmUgaW5jbHVkZWQKLQkJaWYgKHRoaXMuc3BlY2lmaWVkVHlwZSAhPSBudWxsCi0JCQkJJiYgISBpc1R5cGVKQVhCRWxlbWVudCgpKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZShnZXRGdWxseVF1YWxpZmllZFR5cGUoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzVHlwZUpBWEJFbGVtZW50KCkgewotCQlyZXR1cm4gKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChKQVhCLkpBWEJfRUxFTUVOVCwgZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCkpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogY29udGVudCBhc3Npc3QgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlyZXN1bHQgPSB0aGlzLnFOYW1lLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbigpLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uKCkuZ2V0VHlwZVRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5xTmFtZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl2YWxpZGF0ZVR5cGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVUeXBlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQotCQlTdHJpbmcgZnFUeXBlID0gZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCk7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGZxVHlwZSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9FTEVNRU5UX1JFRl9fVU5TUEVDSUZJRURfVFlQRSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCWdldFR5cGVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCQllbHNlIGlmICghIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5zcGVjaWZpZWRUeXBlKQotCQkJCS8vIHZlcmlmeSB0aGF0IHR5cGUgYWN0dWFsbHkgZXhpc3RzIGJlZm9yZSB2YWxpZGF0aW5nCi0JCQkJJiYgSkRUVG9vbHMuZmluZFR5cGUoZ2V0SmF4YlByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLCBmcVR5cGUpICE9IG51bGwpIHsKLQkJCVN0cmluZyBhdHRyaWJ1dGVWYWx1ZVR5cGUgPSBnZXRDb250ZXh0KCkuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldFZhbHVlVHlwZU5hbWUoKTsKLQkJCWlmICghIEpEVFRvb2xzLnR5cGVJc1N1YlR5cGUoZ2V0SmF4YlByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLCBmcVR5cGUsIGF0dHJpYnV0ZVZhbHVlVHlwZSkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfRUxFTUVOVF9SRUZfX0lMTEVHQUxfVFlQRSwKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgYXR0cmlidXRlVmFsdWVUeXBlIH0sCi0JCQkJCQkJCXRoaXMsCi0JCQkJCQkJCWdldFR5cGVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJCQkJCQkJCi0JCQl9Ci0JCQkKLQkJCS8vIGlmIHR5cGUgaXMgYSBwZXJzaXN0ZW50IGNsYXNzLCBjaGVjayB0aGF0IGl0IG9yIGEgc3ViY2xhc3MgaGFzIGEgcm9vdCBlbGVtZW50IHNwZWNpZmllZAotCQkJSmF4YlR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nID0gZ2V0SmF4YlByb2plY3QoKS5nZXRDb250ZXh0Um9vdCgpLmdldFR5cGVNYXBwaW5nKGZxVHlwZSk7Ci0JCQlpZiAodHlwZU1hcHBpbmcgIT0gbnVsbCAmJiAhIHR5cGVNYXBwaW5nLmhhc1Jvb3RFbGVtZW50SW5IaWVyYXJjaHkoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9FTEVNRU5UX1JFRl9fTk9fUk9PVF9FTEVNRU5ULAotCQkJCQkJCQluZXcgU3RyaW5nW10geyBhdHRyaWJ1dGVWYWx1ZVR5cGUgfSwKLQkJCQkJCQkJdGhpcywKLQkJCQkJCQkJZ2V0VHlwZVRleHRSYW5nZShhc3RSb290KSkpOwotCQkJfQotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxFbGVtZW50UmVmUU5hbWUKLQkJCWV4dGVuZHMgQWJzdHJhY3RKYXZhRWxlbWVudFFOYW1lIHsKLQkJCi0JCXByb3RlY3RlZCBYbWxFbGVtZW50UmVmUU5hbWUoSmF2YUNvbnRleHROb2RlIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50LCBuZXcgUU5hbWVBbm5vdGF0aW9uUHJveHkoKSk7Ci0JCX0KLQkJCi0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmLnRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1R5cGVKQVhCRWxlbWVudCgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWYudGhpcy5pc1R5cGVKQVhCRWxlbWVudCgpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgSmF4YlR5cGVNYXBwaW5nIGdldFJlZmVyZW5jZWRUeXBlTWFwcGluZygpIHsKLQkJCVN0cmluZyBmcVR5cGVOYW1lID0gR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmLnRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCk7Ci0JCQlyZXR1cm4gZ2V0SmF4YlByb2plY3QoKS5nZXRDb250ZXh0Um9vdCgpLmdldFR5cGVNYXBwaW5nKGZxVHlwZU5hbWUpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFhtbEVsZW1lbnRXcmFwcGVyIGdldEVsZW1lbnRXcmFwcGVyKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZi50aGlzLmNvbnRleHQuZ2V0RWxlbWVudFdyYXBwZXIoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKSB7Ci0JCQlpZiAoaXNUeXBlSkFYQkVsZW1lbnQoKSkgewotCQkJCXJldHVybiBzdXBlci5nZXREZWZhdWx0TmFtZSgpOwotCQkJfQotCQkJCi0JCQlKYXhiVHlwZU1hcHBpbmcgcmVmZXJlbmNlZFR5cGVNYXBwaW5nID0gZ2V0UmVmZXJlbmNlZFR5cGVNYXBwaW5nKCk7Ci0JCQlpZiAocmVmZXJlbmNlZFR5cGVNYXBwaW5nICE9IG51bGwpIHsKLQkJCQlYbWxSb290RWxlbWVudCByb290RWxlbWVudCA9IHJlZmVyZW5jZWRUeXBlTWFwcGluZy5nZXRYbWxSb290RWxlbWVudCgpOwotCQkJCWlmIChyb290RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiByb290RWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiAiIjsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWVzcGFjZSgpIHsKLQkJCUpheGJUeXBlTWFwcGluZyByZWZlcmVuY2VkVHlwZU1hcHBpbmcgPSBnZXRSZWZlcmVuY2VkVHlwZU1hcHBpbmcoKTsKLQkJCWlmIChyZWZlcmVuY2VkVHlwZU1hcHBpbmcgIT0gbnVsbCkgewotCQkJCVhtbFJvb3RFbGVtZW50IHJvb3RFbGVtZW50ID0gcmVmZXJlbmNlZFR5cGVNYXBwaW5nLmdldFhtbFJvb3RFbGVtZW50KCk7Ci0JCQkJaWYgKHJvb3RFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHJvb3RFbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdE5hbWVzcGFjZSgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVOYW1lKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQkvLyBvbmx5IHZhbGlkYXRlIGlmIHR5cGUgaXMgSkFYQkVsZW1lbnQKLQkJCWlmIChpc1R5cGVKQVhCRWxlbWVudCgpKSB7Ci0JCQkJc3VwZXIudmFsaWRhdGVOYW1lKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVJlZmVyZW5jZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJc3VwZXIudmFsaWRhdGVSZWZlcmVuY2UobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCQotCQkJLy8gaWYgdHlwZSBpcyBKQVhCRWxlbWVudCwgdGhlbiBuYW1lL25hbWVzcGFjZSBtdXN0IGFsc28gcG9pbnQgYXQgYSB2YWxpZCBYbWxFbGVtZW50RGVjbAotCQkJaWYgKCEgaXNUeXBlSkFYQkVsZW1lbnQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJWG1sUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRKYXhiUGFja2FnZSgpLmdldFJlZ2lzdHJ5KCk7Ci0JCQkKLQkJCWlmIChyZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0VMRU1FTlRfUkVGX19OT19SRUdJU1RSWSwKLQkJCQkJCQkJdGhpcywKLQkJCQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJZm9yIChKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QgZWxlbWVudERlY2wgOiByZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHMoKSkgewotCQkJCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbChnZXROYW1lKCksIGVsZW1lbnREZWNsLmdldFFOYW1lKCkuZ2V0TmFtZSgpKQotCQkJCQkJJiYgVG9vbHMudmFsdWVzQXJlRXF1YWwoZ2V0TmFtZXNwYWNlKCksIGVsZW1lbnREZWNsLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfRUxFTUVOVF9SRUZfX05PX01BVENISU5HX0VMRU1FTlRfREVDTCwKLQkJCQkJCQluZXcgU3RyaW5nW10geyBnZXROYW1lc3BhY2UoKSwgZ2V0TmFtZSgpIH0sCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQkJCQkJCi0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFFOYW1lQW5ub3RhdGlvblByb3h5IAotCQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFRTmFtZS5BYnN0cmFjdFFOYW1lQW5ub3RhdGlvblByb3h5IHsKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgUU5hbWVBbm5vdGF0aW9uIGdldEFubm90YXRpb24oYm9vbGVhbiBjcmVhdGVJZk51bGwpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWYudGhpcy5nZXRBbm5vdGF0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIGludGVyZmFjZSBDb250ZXh0IHsKLQkJCi0JCUpheGJBdHRyaWJ1dGVNYXBwaW5nIGdldEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQkJCi0JCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKTsKLQkJCi0JCVN0cmluZyBnZXREZWZhdWx0VHlwZSgpOwotCQkKLQkJWG1sRWxlbWVudFdyYXBwZXIgZ2V0RWxlbWVudFdyYXBwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM2MjE1OC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50UmVmTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbE1peGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50UmVmQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxNaXhlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZwotCQlleHRlbmRzIEFic3RyYWN0SmF2YUFkYXB0YWJsZUF0dHJpYnV0ZU1hcHBpbmc8WG1sRWxlbWVudFJlZkFubm90YXRpb24+Ci0JCWltcGxlbWVudHMgWG1sRWxlbWVudFJlZk1hcHBpbmcgewotCQotCXByb3RlY3RlZCBmaW5hbCBYbWxFbGVtZW50UmVmIHhtbEVsZW1lbnRSZWY7Ci0JCi0JcHJvdGVjdGVkIFhtbEVsZW1lbnRXcmFwcGVyIHhtbEVsZW1lbnRXcmFwcGVyOwotCQotCXByb3RlY3RlZCBYbWxNaXhlZCB4bWxNaXhlZDsKLQkKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy54bWxFbGVtZW50UmVmID0gYnVpbGRYbWxFbGVtZW50UmVmKCk7Ci0JCWluaXRpYWxpemVYbWxFbGVtZW50V3JhcHBlcigpOwkJCQotCQlpbml0aWFsaXplWG1sTWl4ZWQoKTsJCQkKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5YTUxfRUxFTUVOVF9SRUZfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVF9SRUY7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy54bWxFbGVtZW50UmVmLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc3luY1htbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCXN5bmNYbWxNaXhlZCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnhtbEVsZW1lbnRSZWYudXBkYXRlKCk7Ci0JCXVwZGF0ZVhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCXVwZGF0ZVhtbE1peGVkKCk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnRSZWYgKioqKioKLQkKLQlwdWJsaWMgWG1sRWxlbWVudFJlZiBnZXRYbWxFbGVtZW50UmVmKCkgewotCQlyZXR1cm4gdGhpcy54bWxFbGVtZW50UmVmOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudFJlZiBidWlsZFhtbEVsZW1lbnRSZWYoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmKHRoaXMsIG5ldyBYbWxFbGVtZW50UmVmQ29udGV4dCgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sRWxlbWVudFdyYXBwZXIgKioqKioKLQkKLQlwdWJsaWMgWG1sRWxlbWVudFdyYXBwZXIgZ2V0WG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEVsZW1lbnRXcmFwcGVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxFbGVtZW50V3JhcHBlcl8oWG1sRWxlbWVudFdyYXBwZXIgeG1sRWxlbWVudFdyYXBwZXIpIHsKLQkJWG1sRWxlbWVudFdyYXBwZXIgb2xkWG1sRWxlbWVudFdyYXBwZXIgPSB0aGlzLnhtbEVsZW1lbnRXcmFwcGVyOwotCQl0aGlzLnhtbEVsZW1lbnRXcmFwcGVyID0geG1sRWxlbWVudFdyYXBwZXI7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoWE1MX0VMRU1FTlRfV1JBUFBFUl9QUk9QRVJUWSwgb2xkWG1sRWxlbWVudFdyYXBwZXIsIHhtbEVsZW1lbnRXcmFwcGVyKTsKLQl9Ci0JCi0JcHVibGljIFhtbEVsZW1lbnRXcmFwcGVyIGFkZFhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlpZiAodGhpcy54bWxFbGVtZW50V3JhcHBlciAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQlYbWxFbGVtZW50V3JhcHBlciB4bWxFbGVtZW50V3JhcHBlciA9IGJ1aWxkWG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJc2V0WG1sRWxlbWVudFdyYXBwZXJfKHhtbEVsZW1lbnRXcmFwcGVyKTsKLQkJcmV0dXJuIHhtbEVsZW1lbnRXcmFwcGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJc2V0WG1sRWxlbWVudFdyYXBwZXJfKG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIGdldFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEVsZW1lbnRXcmFwcGVyIGJ1aWxkWG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxFbGVtZW50V3JhcHBlcih0aGlzLCBuZXcgR2VuZXJpY0phdmFYbWxFbGVtZW50V3JhcHBlci5TaW1wbGVDb250ZXh0KGdldFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbigpKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJaWYgKGdldFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbigpICE9IG51bGwpIHsKLQkJCXRoaXMueG1sRWxlbWVudFdyYXBwZXIgPSBidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1htbEVsZW1lbnRXcmFwcGVyKCkgewotCQlpZiAoZ2V0WG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKCkgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgIT0gbnVsbCkgewotCQkJCXRoaXMueG1sRWxlbWVudFdyYXBwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0WG1sRWxlbWVudFdyYXBwZXJfKGJ1aWxkWG1sRWxlbWVudFdyYXBwZXIoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRYbWxFbGVtZW50V3JhcHBlcl8obnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlWG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCWlmICh0aGlzLnhtbEVsZW1lbnRXcmFwcGVyICE9IG51bGwpIHsKLQkJCXRoaXMueG1sRWxlbWVudFdyYXBwZXIudXBkYXRlKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sTWl4ZWQgKioqKioKLQkKLQlwdWJsaWMgWG1sTWl4ZWQgZ2V0WG1sTWl4ZWQoKSB7Ci0JCXJldHVybiB0aGlzLnhtbE1peGVkOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxNaXhlZF8oWG1sTWl4ZWQgeG1sTWl4ZWQpIHsKLQkJWG1sTWl4ZWQgb2xkWG1sTWl4ZWQgPSB0aGlzLnhtbE1peGVkOwotCQl0aGlzLnhtbE1peGVkID0geG1sTWl4ZWQ7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoWE1MX01JWEVEX1BST1BFUlRZLCBvbGRYbWxNaXhlZCwgeG1sTWl4ZWQpOwotCX0KLQkKLQlwdWJsaWMgWG1sTWl4ZWQgYWRkWG1sTWl4ZWQoKSB7Ci0JCWlmICh0aGlzLnhtbE1peGVkICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlYbWxNaXhlZEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChYbWxNaXhlZEFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oSkFYQi5YTUxfTUlYRUQpOwotCQkKLQkJWG1sTWl4ZWQgeG1sTWl4ZWQgPSBidWlsZFhtbE1peGVkKGFubm90YXRpb24pOwotCQlzZXRYbWxNaXhlZF8oeG1sTWl4ZWQpOwotCQlyZXR1cm4geG1sTWl4ZWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbE1peGVkKCkgewotCQlpZiAodGhpcy54bWxNaXhlZCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9NSVhFRCk7Ci0JCXNldFhtbE1peGVkXyhudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbE1peGVkQW5ub3RhdGlvbiBnZXRYbWxNaXhlZEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sTWl4ZWRBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX01JWEVEKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbE1peGVkIGJ1aWxkWG1sTWl4ZWQoWG1sTWl4ZWRBbm5vdGF0aW9uIHhtbE1peGVkQW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sTWl4ZWQodGhpcywgeG1sTWl4ZWRBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVhtbE1peGVkKCkgewotCQlYbWxNaXhlZEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbE1peGVkQW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbE1peGVkID0gYnVpbGRYbWxNaXhlZChhbm5vdGF0aW9uKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sTWl4ZWQoKSB7Ci0JCVhtbE1peGVkQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sTWl4ZWRBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnhtbE1peGVkICE9IG51bGwpIHsKLQkJCQl0aGlzLnhtbE1peGVkLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldFhtbE1peGVkXyhidWlsZFhtbE1peGVkKGFubm90YXRpb24pKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXNldFhtbE1peGVkXyhudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVhtbE1peGVkKCkgewotCQlpZiAodGhpcy54bWxNaXhlZCAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbE1peGVkLnVwZGF0ZSgpOwotCQl9Ci0JfQotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy54bWxFbGVtZW50UmVmLmdldFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNQYXJ0aWNsZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXJlc3VsdCA9IHRoaXMueG1sRWxlbWVudFJlZi5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCWlmICh0aGlzLnhtbEVsZW1lbnRXcmFwcGVyICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHRoaXMueG1sRWxlbWVudFdyYXBwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJdGhpcy54bWxFbGVtZW50UmVmLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlpZiAodGhpcy54bWxFbGVtZW50V3JhcHBlciAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbEVsZW1lbnRXcmFwcGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIGNsYXNzIFhtbEVsZW1lbnRSZWZDb250ZXh0Ci0JCQlpbXBsZW1lbnRzIEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZi5Db250ZXh0IHsKLQkJCi0JCXB1YmxpYyBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmcudGhpcy5nZXRBbm5vdGF0aW9uKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmcudGhpczsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VHlwZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nLnRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZUJhc2VUeXBlTmFtZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgWG1sRWxlbWVudFdyYXBwZXIgZ2V0RWxlbWVudFdyYXBwZXIoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZy50aGlzLmdldFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmcy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sRWxlbWVudFJlZnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdlMGY0OC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRSZWZzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFJlZkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmcwotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlIAotCQlpbXBsZW1lbnRzIFhtbEVsZW1lbnRSZWZzIHsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dCBjb250ZXh0OwotCQotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0TGlzdENvbnRhaW5lcjxYbWxFbGVtZW50UmVmLCBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbj4geG1sRWxlbWVudFJlZkNvbnRhaW5lcjsKLQkKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmcyhKYXZhQ29udGV4dE5vZGUgcGFyZW50LCBDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQkJdGhpcy54bWxFbGVtZW50UmVmQ29udGFpbmVyID0gdGhpcy5idWlsZFhtbEVsZW1lbnRSZWZDb250YWluZXIoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3luYy91cGRhdGUgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMueG1sRWxlbWVudFJlZkNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMueG1sRWxlbWVudFJlZkNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogeG1sIGVsZW1lbnQgcmVmcyAqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmFibGU8WG1sRWxlbWVudFJlZj4gZ2V0WG1sRWxlbWVudFJlZnMoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEVsZW1lbnRSZWZDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0WG1sRWxlbWVudFJlZnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy54bWxFbGVtZW50UmVmQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0JCi0JcHVibGljIFhtbEVsZW1lbnRSZWYgYWRkWG1sRWxlbWVudFJlZihpbnQgaW5kZXgpIHsKLQkJWG1sRWxlbWVudFJlZkFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuY29udGV4dC5hZGRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihpbmRleCk7Ci0JCXJldHVybiB0aGlzLnhtbEVsZW1lbnRSZWZDb250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIGFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxFbGVtZW50UmVmKGludCBpbmRleCkgewotCQl0aGlzLmNvbnRleHQucmVtb3ZlWG1sRWxlbWVudFJlZkFubm90YXRpb24oaW5kZXgpOwotCQl0aGlzLnhtbEVsZW1lbnRSZWZDb250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxFbGVtZW50UmVmKFhtbEVsZW1lbnRSZWYgeG1sRWxlbWVudFJlZikgewotCQlyZW1vdmVYbWxFbGVtZW50UmVmKHRoaXMueG1sRWxlbWVudFJlZkNvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoeG1sRWxlbWVudFJlZikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlWG1sRWxlbWVudFJlZihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLmNvbnRleHQubW92ZVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMueG1sRWxlbWVudFJlZkNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEVsZW1lbnRSZWYgYnVpbGRYbWxFbGVtZW50UmVmKFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRleHQuYnVpbGRYbWxFbGVtZW50UmVmKHRoaXMsIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxFbGVtZW50UmVmQW5ub3RhdGlvbj4gZ2V0WG1sRWxlbWVudFJlZkFubm90YXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5jb250ZXh0LmdldFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9ucygpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxYbWxFbGVtZW50UmVmLCBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbj4gYnVpbGRYbWxFbGVtZW50UmVmQ29udGFpbmVyKCkgewotCQlYbWxFbGVtZW50UmVmQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBYbWxFbGVtZW50UmVmQ29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCQotCQotCS8vICoqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJZm9yIChYbWxFbGVtZW50UmVmIGVsZW1lbnRSZWYgOiBnZXRYbWxFbGVtZW50UmVmcygpKSB7Ci0JCQlyZXN1bHQgPSBlbGVtZW50UmVmLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmNvbnRleHQuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCXZhbGlkYXRlRHVwbGljYXRlVHlwZXNBbmRRTmFtZXMobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCWZvciAoWG1sRWxlbWVudFJlZiBlbGVtZW50UmVmIDogZ2V0WG1sRWxlbWVudFJlZnMoKSkgewotCQkJZWxlbWVudFJlZi52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRHVwbGljYXRlVHlwZXNBbmRRTmFtZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCi0JCUJhZzxTdHJpbmc+IHhtbEVsZW1lbnRSZWZUeXBlcyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJQmFnPFFOYW1lPiB4bWxFbGVtZW50UmVmUW5hbWVzID0gbmV3IEhhc2hCYWc8UU5hbWU+KCk7Ci0JCQotCQlmb3IgKFhtbEVsZW1lbnRSZWYgeG1sRWxlbWVudFJlZiA6IGdldFhtbEVsZW1lbnRSZWZzKCkpIHsKLQkJCVN0cmluZyB0eXBlTmFtZSA9IHhtbEVsZW1lbnRSZWYuZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCk7Ci0JCQlib29sZWFuIGlzSmF4YkVsZW1lbnQgPSBKQVhCLkpBWEJfRUxFTUVOVC5lcXVhbHModHlwZU5hbWUpOwotCQkJaWYgKCEgaXNKYXhiRWxlbWVudCAmJiAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodHlwZU5hbWUpKSB7Ci0JCQkJeG1sRWxlbWVudFJlZlR5cGVzLmFkZCh0eXBlTmFtZSk7Ci0JCQl9Ci0JCQlTdHJpbmcgZWxlbWVudFJlZk5hbWUgPSB4bWxFbGVtZW50UmVmLmdldFFOYW1lKCkuZ2V0TmFtZSgpOwotCQkJaWYgKGlzSmF4YkVsZW1lbnQgJiYgISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGVsZW1lbnRSZWZOYW1lKSkgewotCQkJCXhtbEVsZW1lbnRSZWZRbmFtZXMuYWRkKG5ldyBRTmFtZSh4bWxFbGVtZW50UmVmLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCksIGVsZW1lbnRSZWZOYW1lKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoWG1sRWxlbWVudFJlZiB4bWxFbGVtZW50UmVmIDogZ2V0WG1sRWxlbWVudFJlZnMoKSkgewotCQkJU3RyaW5nIHR5cGVOYW1lID0geG1sRWxlbWVudFJlZi5nZXRGdWxseVF1YWxpZmllZFR5cGUoKTsKLQkJCWJvb2xlYW4gaXNKYXhiRWxlbWVudCA9IEpBWEIuSkFYQl9FTEVNRU5ULmVxdWFscyh0eXBlTmFtZSk7Ci0JCQlpZiAoISBpc0pheGJFbGVtZW50ICYmIHhtbEVsZW1lbnRSZWZUeXBlcy5jb3VudCh0eXBlTmFtZSkgPiAxKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0VMRU1FTlRfUkVGU19fRFVQTElDQVRFX1hNTF9FTEVNRU5UX1RZUEUsCi0JCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHR5cGVOYW1lIH0sCi0JCQkJCQkJCXhtbEVsZW1lbnRSZWYsCi0JCQkJCQkJCXhtbEVsZW1lbnRSZWYuZ2V0VHlwZVRleHRSYW5nZShhc3RSb290KSkpOwotCQkJfQotCQkJCi0JCQlTdHJpbmcgeG1sRWxlbWVudE5hbWVzcGFjZSA9IHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKTsKLQkJCVN0cmluZyB4bWxFbGVtZW50TmFtZSA9IHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXROYW1lKCk7Ci0JCQlpZiAoaXNKYXhiRWxlbWVudCAmJiB4bWxFbGVtZW50UmVmUW5hbWVzLmNvdW50KG5ldyBRTmFtZSh4bWxFbGVtZW50TmFtZXNwYWNlLCB4bWxFbGVtZW50TmFtZSkpID4gMSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9FTEVNRU5UX1JFRlNfX0RVUExJQ0FURV9YTUxfRUxFTUVOVF9RTkFNRSwKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgeG1sRWxlbWVudE5hbWUgfSwKLQkJCQkJCQkJeG1sRWxlbWVudFJlZiwKLQkJCQkJCQkJeG1sRWxlbWVudFJlZi5nZXRRTmFtZSgpLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFhtbEVsZW1lbnRSZWYsIEl0ZXJhYmxlPFN0cmluZz4+KGdldFhtbEVsZW1lbnRSZWZzKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IHRyYW5zZm9ybShYbWxFbGVtZW50UmVmIHhtbEVsZW1lbnRSZWYpIHsKLQkJCQkJCXJldHVybiB4bWxFbGVtZW50UmVmLmdldFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQkKLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sRWxlbWVudFJlZkNvbnRhaW5lcgotCQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxYbWxFbGVtZW50UmVmLCBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbj4gewotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFhtbEVsZW1lbnRSZWZzLlhNTF9FTEVNRU5UX1JFRlNfTElTVDsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxFbGVtZW50UmVmIGJ1aWxkQ29udGV4dEVsZW1lbnQoWG1sRWxlbWVudFJlZkFubm90YXRpb24gcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmcy50aGlzLmJ1aWxkWG1sRWxlbWVudFJlZihyZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxFbGVtZW50UmVmQW5ub3RhdGlvbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzLnRoaXMuZ2V0WG1sRWxlbWVudFJlZkFubm90YXRpb25zKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudFJlZkFubm90YXRpb24gZ2V0UmVzb3VyY2VFbGVtZW50KFhtbEVsZW1lbnRSZWYgY29udGV4dEVsZW1lbnQpIHsKLQkJCS8vIGluIHRoaXMgY29udGV4dCwgdGhlcmUgd2lsbCBuZXZlciBiZSBhbiBYbWxFbGVtZW50UmVmIHdpdGhvdXQgYW4gYW5ub3RhdGlvbgotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldEFubm90YXRpb24oKTsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgaW50ZXJmYWNlIENvbnRleHQgewotCQkKLQkJTGlzdEl0ZXJhYmxlPFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uPiBnZXRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbnMoKTsKLQkJCi0JCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIGFkZFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKGludCBpbmRleCk7Ci0JCQotCQl2b2lkIHJlbW92ZVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKGludCBpbmRleCk7Ci0JCQotCQl2b2lkIG1vdmVYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCQotCQlYbWxFbGVtZW50UmVmIGJ1aWxkWG1sRWxlbWVudFJlZihKYXZhQ29udGV4dE5vZGUgcGFyZW50LCBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiBhbm5vdGF0aW9uKTsKLQkJCi0JCVRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGJiZjIwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFJlZnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRSZWZzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbE1peGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFJlZkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxNaXhlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmcKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFBZGFwdGFibGVBdHRyaWJ1dGVNYXBwaW5nPFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbj4KLQkJaW1wbGVtZW50cyBYbWxFbGVtZW50UmVmc01hcHBpbmcgewotCQotCXByb3RlY3RlZCBmaW5hbCBYbWxFbGVtZW50UmVmcyB4bWxFbGVtZW50UmVmczsKLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudFdyYXBwZXIgeG1sRWxlbWVudFdyYXBwZXI7Ci0JCi0JcHJvdGVjdGVkIFhtbE1peGVkIHhtbE1peGVkOwotCQotCQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy54bWxFbGVtZW50UmVmcyA9IGJ1aWxkWG1sRWxlbWVudFJlZnMoKTsKLQkJaW5pdGlhbGl6ZVhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCWluaXRpYWxpemVYbWxNaXhlZCgpOwkJCQotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UX1JFRlNfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVF9SRUZTOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzeW5jL3VwZGF0ZSAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy54bWxFbGVtZW50UmVmcy5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXN5bmNYbWxFbGVtZW50V3JhcHBlcigpOwotCQlzeW5jWG1sTWl4ZWQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy54bWxFbGVtZW50UmVmcy51cGRhdGUoKTsKLQkJdXBkYXRlWG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJdXBkYXRlWG1sTWl4ZWQoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sRWxlbWVudFJlZnMgKioqKioKLQkKLQlwdWJsaWMgWG1sRWxlbWVudFJlZnMgZ2V0WG1sRWxlbWVudFJlZnMoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEVsZW1lbnRSZWZzOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudFJlZnMgYnVpbGRYbWxFbGVtZW50UmVmcygpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzKHRoaXMsIG5ldyBYbWxFbGVtZW50UmVmc0NvbnRleHQoKSk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnRXcmFwcGVyICoqKioqCi0JCi0JcHVibGljIFhtbEVsZW1lbnRXcmFwcGVyIGdldFhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlyZXR1cm4gdGhpcy54bWxFbGVtZW50V3JhcHBlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sRWxlbWVudFdyYXBwZXJfKFhtbEVsZW1lbnRXcmFwcGVyIHhtbEVsZW1lbnRXcmFwcGVyKSB7Ci0JCVhtbEVsZW1lbnRXcmFwcGVyIG9sZFhtbEVsZW1lbnRXcmFwcGVyID0gdGhpcy54bWxFbGVtZW50V3JhcHBlcjsKLQkJdGhpcy54bWxFbGVtZW50V3JhcHBlciA9IHhtbEVsZW1lbnRXcmFwcGVyOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9FTEVNRU5UX1dSQVBQRVJfUFJPUEVSVFksIG9sZFhtbEVsZW1lbnRXcmFwcGVyLCB4bWxFbGVtZW50V3JhcHBlcik7Ci0JfQotCQotCXB1YmxpYyBYbWxFbGVtZW50V3JhcHBlciBhZGRYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJWG1sRWxlbWVudFdyYXBwZXIgeG1sRWxlbWVudFdyYXBwZXIgPSBidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCXNldFhtbEVsZW1lbnRXcmFwcGVyXyh4bWxFbGVtZW50V3JhcHBlcik7Ci0JCXJldHVybiB4bWxFbGVtZW50V3JhcHBlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCWlmICh0aGlzLnhtbEVsZW1lbnRXcmFwcGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCXNldFhtbEVsZW1lbnRXcmFwcGVyXyhudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiBnZXRYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxFbGVtZW50V3JhcHBlciBidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sRWxlbWVudFdyYXBwZXIodGhpcywgbmV3IEdlbmVyaWNKYXZhWG1sRWxlbWVudFdyYXBwZXIuU2ltcGxlQ29udGV4dChnZXRYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24oKSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplWG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCWlmIChnZXRYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24oKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbEVsZW1lbnRXcmFwcGVyID0gYnVpbGRYbWxFbGVtZW50V3JhcHBlcigpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJaWYgKGdldFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbigpICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnhtbEVsZW1lbnRXcmFwcGVyICE9IG51bGwpIHsKLQkJCQl0aGlzLnhtbEVsZW1lbnRXcmFwcGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldFhtbEVsZW1lbnRXcmFwcGVyXyhidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJc2V0WG1sRWxlbWVudFdyYXBwZXJfKG51bGwpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlpZiAodGhpcy54bWxFbGVtZW50V3JhcHBlciAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbEVsZW1lbnRXcmFwcGVyLnVwZGF0ZSgpOwotCQl9Ci0JfQotCQotCQotCS8vICoqKioqIFhtbE1peGVkICoqKioqCi0JCi0JcHVibGljIFhtbE1peGVkIGdldFhtbE1peGVkKCkgewotCQlyZXR1cm4gdGhpcy54bWxNaXhlZDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sTWl4ZWRfKFhtbE1peGVkIHhtbE1peGVkKSB7Ci0JCVhtbE1peGVkIG9sZFhtbE1peGVkID0gdGhpcy54bWxNaXhlZDsKLQkJdGhpcy54bWxNaXhlZCA9IHhtbE1peGVkOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9NSVhFRF9QUk9QRVJUWSwgb2xkWG1sTWl4ZWQsIHhtbE1peGVkKTsKLQl9Ci0JCi0JcHVibGljIFhtbE1peGVkIGFkZFhtbE1peGVkKCkgewotCQlpZiAodGhpcy54bWxNaXhlZCAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJWG1sTWl4ZWRBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoWG1sTWl4ZWRBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKEpBWEIuWE1MX01JWEVEKTsKLQkJCi0JCVhtbE1peGVkIHhtbE1peGVkID0gYnVpbGRYbWxNaXhlZChhbm5vdGF0aW9uKTsKLQkJc2V0WG1sTWl4ZWRfKHhtbE1peGVkKTsKLQkJcmV0dXJuIHhtbE1peGVkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxNaXhlZCgpIHsKLQkJaWYgKHRoaXMueG1sTWl4ZWQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oSkFYQi5YTUxfTUlYRUQpOwotCQlzZXRYbWxNaXhlZF8obnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxNaXhlZEFubm90YXRpb24gZ2V0WG1sTWl4ZWRBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbE1peGVkQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9NSVhFRCk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxNaXhlZCBidWlsZFhtbE1peGVkKFhtbE1peGVkQW5ub3RhdGlvbiB4bWxNaXhlZEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVhtbE1peGVkKHRoaXMsIHhtbE1peGVkQW5ub3RhdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVYbWxNaXhlZCgpIHsKLQkJWG1sTWl4ZWRBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxNaXhlZEFubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJdGhpcy54bWxNaXhlZCA9IGJ1aWxkWG1sTWl4ZWQoYW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1htbE1peGVkKCkgewotCQlYbWxNaXhlZEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbE1peGVkQW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy54bWxNaXhlZCAhPSBudWxsKSB7Ci0JCQkJdGhpcy54bWxNaXhlZC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRYbWxNaXhlZF8oYnVpbGRYbWxNaXhlZChhbm5vdGF0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRYbWxNaXhlZF8obnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVYbWxNaXhlZCgpIHsKLQkJaWYgKHRoaXMueG1sTWl4ZWQgIT0gbnVsbCkgewotCQkJdGhpcy54bWxNaXhlZC51cGRhdGUoKTsKLQkJfQotCX0KLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMueG1sRWxlbWVudFJlZnMuZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnRpY2xlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCQotCS8vICoqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJcmVzdWx0ID0gdGhpcy54bWxFbGVtZW50UmVmcy5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCWlmICh0aGlzLnhtbEVsZW1lbnRXcmFwcGVyICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHRoaXMueG1sRWxlbWVudFdyYXBwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJdGhpcy54bWxFbGVtZW50UmVmcy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgIT0gbnVsbCkgewotCQkJdGhpcy54bWxFbGVtZW50V3JhcHBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JCQotCQlpZiAodGhpcy54bWxNaXhlZCAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbE1peGVkLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFhtbEVsZW1lbnRSZWZzQ29udGV4dAotCQkJaW1wbGVtZW50cyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzLkNvbnRleHQgewotCQkKLQkJcHJvdGVjdGVkIFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiBnZXRYbWxFbGVtZW50UmVmc0Fubm90YXRpb24oKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmcudGhpcy5nZXRBbm5vdGF0aW9uKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBMaXN0SXRlcmFibGU8WG1sRWxlbWVudFJlZkFubm90YXRpb24+IGdldFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9ucygpIHsKLQkJCXJldHVybiBnZXRYbWxFbGVtZW50UmVmc0Fubm90YXRpb24oKS5nZXRYbWxFbGVtZW50UmVmcygpOwotCQl9Ci0JCQotCQlwdWJsaWMgWG1sRWxlbWVudFJlZkFubm90YXRpb24gYWRkWG1sRWxlbWVudFJlZkFubm90YXRpb24oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gZ2V0WG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKCkuYWRkWG1sRWxlbWVudFJlZihpbmRleCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKGludCBpbmRleCkgewotCQkJZ2V0WG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKCkucmVtb3ZlWG1sRWxlbWVudFJlZihpbmRleCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIG1vdmVYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJZ2V0WG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKCkubW92ZVhtbEVsZW1lbnRSZWYodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCQkKLQkJcHVibGljIFhtbEVsZW1lbnRSZWYgYnVpbGRYbWxFbGVtZW50UmVmKEphdmFDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmKHBhcmVudCwgbmV3IFhtbEVsZW1lbnRSZWZDb250ZXh0KGFubm90YXRpb24pKTsKLQkJfQotCQkKLQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlyZXR1cm4gZ2V0WG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxFbGVtZW50UmVmQ29udGV4dAotCQkJaW1wbGVtZW50cyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWYuQ29udGV4dCB7Ci0JCQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudFJlZkFubm90YXRpb24gYW5ub3RhdGlvbjsKLQkJCi0JCXB1YmxpYyBYbWxFbGVtZW50UmVmQ29udGV4dChYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCQl0aGlzLmFubm90YXRpb24gPSBhbm5vdGF0aW9uOwotCQl9Ci0JCQotCQlwdWJsaWMgWG1sRWxlbWVudFJlZkFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmFubm90YXRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nLnRoaXM7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFR5cGUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIFhtbEVsZW1lbnRXcmFwcGVyIGdldEVsZW1lbnRXcmFwcGVyKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nLnRoaXMuZ2V0WG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnRXcmFwcGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2Y3YzVhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnRXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sTnNGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLkpwdEpheGJDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlFOYW1lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZEVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sRWxlbWVudFdyYXBwZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZQotCQlpbXBsZW1lbnRzIFhtbEVsZW1lbnRXcmFwcGVyIHsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dCBjb250ZXh0OwotCQotCXByb3RlY3RlZCBKYXhiUU5hbWUgcU5hbWU7Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkUmVxdWlyZWQ7Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkTmlsbGFibGU7Ci0JCi0JCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sRWxlbWVudFdyYXBwZXIoSmF4YkF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQkJdGhpcy5xTmFtZSA9IGJ1aWxkUU5hbWUoKTsKLQkJdGhpcy5zcGVjaWZpZWRSZXF1aXJlZCA9IGJ1aWxkU3BlY2lmaWVkUmVxdWlyZWQoKTsKLQkJdGhpcy5zcGVjaWZpZWROaWxsYWJsZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWROaWxsYWJsZSgpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgSmF4YlFOYW1lIGJ1aWxkUU5hbWUoKSB7Ci0JCXJldHVybiBuZXcgWG1sRWxlbWVudFFOYW1lKHRoaXMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEpheGJBdHRyaWJ1dGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGdldEF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YkNsYXNzTWFwcGluZyBnZXRKYXhiQ2xhc3NNYXBwaW5nKCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldENsYXNzTWFwcGluZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoKSB7Ci0JCXJldHVybiBnZXRKYXhiQ2xhc3NNYXBwaW5nKCkuZ2V0SmF4YlR5cGUoKS5nZXRKYXhiUGFja2FnZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRleHQuZ2V0QW5ub3RhdGlvbigpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnFOYW1lLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc2V0U3BlY2lmaWVkUmVxdWlyZWRfKGJ1aWxkU3BlY2lmaWVkUmVxdWlyZWQoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkTmlsbGFibGVfKHRoaXMuYnVpbGRTcGVjaWZpZWROaWxsYWJsZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5xTmFtZS51cGRhdGUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc2NoZW1hIGNvbXBvbmVudCByZWYgKioqKioKLQkKLQlwdWJsaWMgSmF4YlFOYW1lIGdldFFOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5xTmFtZTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKiogWG1sRWxlbWVudFdyYXBwZXIucmVxdWlyZWQgKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFJlcXVpcmVkKCkgPT0gbnVsbCkgPyB0aGlzLmlzRGVmYXVsdFJlcXVpcmVkKCkgOiB0aGlzLmdldFNwZWNpZmllZFJlcXVpcmVkKCkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJlcXVpcmVkKCkgewotCQlyZXR1cm4gREVGQVVMVF9SRVFVSVJFRDsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkUmVxdWlyZWQoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFJlcXVpcmVkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRSZXF1aXJlZChCb29sZWFuIG5ld1NwZWNpZmllZFJlcXVpcmVkKSB7Ci0JCWdldEFubm90YXRpb24oKS5zZXRSZXF1aXJlZChuZXdTcGVjaWZpZWRSZXF1aXJlZCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkUmVxdWlyZWRfKG5ld1NwZWNpZmllZFJlcXVpcmVkKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUmVxdWlyZWRfKEJvb2xlYW4gbmV3U3BlY2lmaWVkUmVxdWlyZWQpIHsKLQkJQm9vbGVhbiBvbGRSZXF1aXJlZCA9IHRoaXMuc3BlY2lmaWVkUmVxdWlyZWQ7Ci0JCXRoaXMuc3BlY2lmaWVkUmVxdWlyZWQgPSBuZXdTcGVjaWZpZWRSZXF1aXJlZDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUkVRVUlSRURfUFJPUEVSVFksIG9sZFJlcXVpcmVkLCBuZXdTcGVjaWZpZWRSZXF1aXJlZCk7Ci0JfQotCQotCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkU3BlY2lmaWVkUmVxdWlyZWQoKSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uKCkuZ2V0UmVxdWlyZWQoKTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKiogIFhtbEVsZW1lbnRXcmFwcGVyLm5pbGxhYmxlICoqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBib29sZWFuIGlzTmlsbGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWROaWxsYWJsZSgpID09IG51bGwpID8gdGhpcy5pc0RlZmF1bHROaWxsYWJsZSgpIDogdGhpcy5nZXRTcGVjaWZpZWROaWxsYWJsZSgpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHROaWxsYWJsZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfTklMTEFCTEU7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZE5pbGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWROaWxsYWJsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTmlsbGFibGUoQm9vbGVhbiBuZXdTcGVjaWZpZWROaWxsYWJsZSkgewotCQlnZXRBbm5vdGF0aW9uKCkuc2V0TmlsbGFibGUobmV3U3BlY2lmaWVkTmlsbGFibGUpOwotCQl0aGlzLnNldFNwZWNpZmllZE5pbGxhYmxlXyhuZXdTcGVjaWZpZWROaWxsYWJsZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE5pbGxhYmxlXyhCb29sZWFuIG5ld1NwZWNpZmllZE5pbGxhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkTmlsbGFibGUgPSB0aGlzLnNwZWNpZmllZE5pbGxhYmxlOwotCQl0aGlzLnNwZWNpZmllZE5pbGxhYmxlID0gbmV3U3BlY2lmaWVkTmlsbGFibGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX05JTExBQkxFX1BST1BFUlRZLCBvbGROaWxsYWJsZSwgbmV3U3BlY2lmaWVkTmlsbGFibGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZE5pbGxhYmxlKCkgewotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbigpLmdldE5pbGxhYmxlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogbWlzYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBYc2RFbGVtZW50RGVjbGFyYXRpb24gZ2V0WHNkRWxlbWVudERlY2xhcmF0aW9uKCkgewotCQlYc2RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlID0gZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldENsYXNzTWFwcGluZygpLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCXJldHVybiAoeHNkVHlwZSA9PSBudWxsKSA/IG51bGwgOiB4c2RUeXBlLmdldEVsZW1lbnQodGhpcy5xTmFtZS5nZXROYW1lc3BhY2UoKSwgdGhpcy5xTmFtZS5nZXROYW1lKCkpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlyZXN1bHQgPSB0aGlzLnFOYW1lLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlpZiAoISBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNKYXZhUmVzb3VyY2VBdHRyaWJ1dGVDb2xsZWN0aW9uVHlwZSgpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0VMRU1FTlRfV1JBUFBFUl9ERUZJTkVEX09OX05PTl9BUlJBWV9OT05fQ09MTEVDVElPTiwKLQkJCQkJdGhpcywKLQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JCQotCQl2YWxpZGF0ZVFOYW1lKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUU5hbWUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5xTmFtZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb24oKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCQotCXB1YmxpYyBpbnRlcmZhY2UgQ29udGV4dCB7Ci0JCQotCQkvKioKLQkJICogVGhpcyBzaG91bGQgbmV2ZXIgYmUgbnVsbAotCQkgKi8KLQkJWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKTsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTaW1wbGVDb250ZXh0Ci0JCQlpbXBsZW1lbnRzIENvbnRleHQgewotCQkKLQkJcHJvdGVjdGVkIFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uOwotCQkKLQkJcHVibGljIFNpbXBsZUNvbnRleHQoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJCXRoaXMuYW5ub3RhdGlvbiA9IGFubm90YXRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmFubm90YXRpb247Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFhtbEVsZW1lbnRRTmFtZQotCQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFRTmFtZSB7Ci0JCQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudFFOYW1lKEphdmFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudCwgbmV3IFFOYW1lQW5ub3RhdGlvblByb3h5KCkpOwotCQl9Ci0JCQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXhiUGFja2FnZSBnZXRKYXhiUGFja2FnZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEVsZW1lbnRXcmFwcGVyLnRoaXMuZ2V0SmF4YlBhY2thZ2UoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lc3BhY2UoKSB7Ci0JCQlKYXhiUGFja2FnZSBqYXhiUGFja2FnZSA9IHRoaXMuZ2V0SmF4YlBhY2thZ2UoKTsKLQkJCXJldHVybiAoamF4YlBhY2thZ2UgIT0gbnVsbCAmJiBqYXhiUGFja2FnZS5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKSA9PSBYbWxOc0Zvcm0uUVVBTElGSUVEKSA/Ci0JCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudFdyYXBwZXIudGhpcy5nZXRKYXhiQ2xhc3NNYXBwaW5nKCkuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSA6ICIiOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0TmFtZVByb3Bvc2FscyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCVhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUgPSBHZW5lcmljSmF2YVhtbEVsZW1lbnRXcmFwcGVyLnRoaXMuZ2V0SmF4YkNsYXNzTWFwcGluZygpLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCQlyZXR1cm4gKHhzZFR5cGUgPT0gbnVsbCkgPyBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCkgOiB4c2RUeXBlLmdldEVsZW1lbnROYW1lUHJvcG9zYWxzKGdldE5hbWVzcGFjZSgpLCBmaWx0ZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0TmFtZXNwYWNlUHJvcG9zYWxzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJWHNkU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0WHNkU2NoZW1hKCk7Ci0JCQlyZXR1cm4gKHNjaGVtYSA9PSBudWxsKSA/IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpIDogc2NoZW1hLmdldE5hbWVzcGFjZVByb3Bvc2FscyhmaWx0ZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29tcG9uZW50VHlwZURlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIEpwdEpheGJDb3JlTWVzc2FnZXMuWE1MX0VMRU1FTlRfREVTQzsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUmVmZXJlbmNlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlYc2RUeXBlRGVmaW5pdGlvbiB0eXBlID0gZ2V0SmF4YkNsYXNzTWFwcGluZygpLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlpZiAodHlwZS5nZXRFbGVtZW50KGdldE5hbWVzcGFjZSgpLCBnZXROYW1lKCkpID09IG51bGwpIHsKLQkJCQltZXNzYWdlcy5hZGQoZ2V0VW5yZXNvbHZlU2NoZW1hQ29tcG9uZW50TWVzc2FnZShhc3RSb290KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFFOYW1lQW5ub3RhdGlvblByb3h5IAotCQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFRTmFtZS5BYnN0cmFjdFFOYW1lQW5ub3RhdGlvblByb3h5IHsKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgUU5hbWVBbm5vdGF0aW9uIGdldEFubm90YXRpb24oYm9vbGVhbiBjcmVhdGVJZk51bGwpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEVsZW1lbnRXcmFwcGVyLnRoaXMuZ2V0QW5ub3RhdGlvbigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50c01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkzYjQ4ZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50c01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sSURSRUY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFYbWxJRFJFRi5WYWxpZGF0YWJsZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudHNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxJRFJFRkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVhtbEVsZW1lbnRzTWFwcGluZwotCQlleHRlbmRzIEFic3RyYWN0SmF2YUFkYXB0YWJsZUF0dHJpYnV0ZU1hcHBpbmc8WG1sRWxlbWVudHNBbm5vdGF0aW9uPiAKLQkJaW1wbGVtZW50cyBYbWxFbGVtZW50c01hcHBpbmcgewotCQotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0TGlzdENvbnRhaW5lcjxYbWxFbGVtZW50LCBYbWxFbGVtZW50QW5ub3RhdGlvbj4geG1sRWxlbWVudENvbnRhaW5lcjsKLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudFdyYXBwZXIgeG1sRWxlbWVudFdyYXBwZXI7Ci0JCi0JcHJvdGVjdGVkIFhtbElEUkVGIHhtbElEUkVGOwotCQotCQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbEVsZW1lbnRzTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy54bWxFbGVtZW50Q29udGFpbmVyID0gYnVpbGRYbWxFbGVtZW50Q29udGFpbmVyKCk7Ci0JCWluaXRpYWxpemVYbWxFbGVtZW50V3JhcHBlcigpOwotCQlpbml0aWFsaXplWG1sSURSRUYoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5YTUxfRUxFTUVOVFNfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVFM7Ci0JfQotCQotCQotCS8vICoqKioqIHN5bmMvdXBkYXRlICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnhtbEVsZW1lbnRDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlzeW5jWG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJc3luY1htbElEUkVGKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMueG1sRWxlbWVudENvbnRhaW5lci51cGRhdGUoKTsKLQkJdXBkYXRlWG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJdXBkYXRlWG1sSURSRUYoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogeG1sIGVsZW1lbnRzICoqKioqCi0JCi0JcHVibGljIExpc3RJdGVyYWJsZTxYbWxFbGVtZW50PiBnZXRYbWxFbGVtZW50cygpIHsKLQkJcmV0dXJuIHRoaXMueG1sRWxlbWVudENvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRYbWxFbGVtZW50c1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEVsZW1lbnRDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgWG1sRWxlbWVudCBhZGRYbWxFbGVtZW50KGludCBpbmRleCkgewotCQlYbWxFbGVtZW50QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbigpLmFkZFhtbEVsZW1lbnQoaW5kZXgpOwotCQlyZXR1cm4gdGhpcy54bWxFbGVtZW50Q29udGFpbmVyLmFkZENvbnRleHRFbGVtZW50KGluZGV4LCBhbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sRWxlbWVudChpbnQgaW5kZXgpIHsKLQkJZ2V0QW5ub3RhdGlvbigpLnJlbW92ZVhtbEVsZW1lbnQoaW5kZXgpOwotCQl0aGlzLnhtbEVsZW1lbnRDb250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxFbGVtZW50KFhtbEVsZW1lbnQgeG1sRWxlbWVudCkgewotCQlyZW1vdmVYbWxFbGVtZW50KHRoaXMueG1sRWxlbWVudENvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoeG1sRWxlbWVudCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlWG1sRWxlbWVudChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlnZXRBbm5vdGF0aW9uKCkubW92ZVhtbEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy54bWxFbGVtZW50Q29udGFpbmVyLm1vdmVDb250ZXh0RWxlbWVudCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudCBidWlsZFhtbEVsZW1lbnQoWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVhtbEVsZW1lbnQodGhpcywgbmV3IFhtbEVsZW1lbnRDb250ZXh0KHhtbEVsZW1lbnRBbm5vdGF0aW9uKSk7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sRWxlbWVudEFubm90YXRpb24+IGdldFhtbEVsZW1lbnRBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb24oKS5nZXRYbWxFbGVtZW50cygpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxFbGVtZW50V3JhcHBlciAqKioqKgotCQotCXB1YmxpYyBYbWxFbGVtZW50V3JhcHBlciBnZXRYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJcmV0dXJuIHRoaXMueG1sRWxlbWVudFdyYXBwZXI7Ci0JfQotCQotCXB1YmxpYyBYbWxFbGVtZW50V3JhcHBlciBhZGRYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJWG1sRWxlbWVudFdyYXBwZXIgeG1sRWxlbWVudFdyYXBwZXIgPSBidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCXNldFhtbEVsZW1lbnRXcmFwcGVyXyh4bWxFbGVtZW50V3JhcHBlcik7Ci0JCXJldHVybiB4bWxFbGVtZW50V3JhcHBlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCWlmICh0aGlzLnhtbEVsZW1lbnRXcmFwcGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCXNldFhtbEVsZW1lbnRXcmFwcGVyXyhudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sRWxlbWVudFdyYXBwZXJfKFhtbEVsZW1lbnRXcmFwcGVyIHhtbEVsZW1lbnRXcmFwcGVyKSB7Ci0JCVhtbEVsZW1lbnRXcmFwcGVyIG9sZFhtbEVsZW1lbnRXcmFwcGVyID0gdGhpcy54bWxFbGVtZW50V3JhcHBlcjsKLQkJdGhpcy54bWxFbGVtZW50V3JhcHBlciA9IHhtbEVsZW1lbnRXcmFwcGVyOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9FTEVNRU5UX1dSQVBQRVJfUFJPUEVSVFksIG9sZFhtbEVsZW1lbnRXcmFwcGVyLCB4bWxFbGVtZW50V3JhcHBlcik7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxFbGVtZW50V3JhcHBlciBidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sRWxlbWVudFdyYXBwZXIodGhpcywgbmV3IEdlbmVyaWNKYXZhWG1sRWxlbWVudFdyYXBwZXIuU2ltcGxlQ29udGV4dChnZXRYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24oKSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIGdldFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlpZiAoZ2V0WG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKCkgIT0gbnVsbCkgewotCQkJdGhpcy54bWxFbGVtZW50V3JhcHBlciA9IGJ1aWxkWG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCWlmIChnZXRYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24oKSAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy54bWxFbGVtZW50V3JhcHBlciAhPSBudWxsKSB7Ci0JCQkJdGhpcy54bWxFbGVtZW50V3JhcHBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRYbWxFbGVtZW50V3JhcHBlcl8oYnVpbGRYbWxFbGVtZW50V3JhcHBlcigpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXNldFhtbEVsZW1lbnRXcmFwcGVyXyhudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgIT0gbnVsbCkgewotCQkJdGhpcy54bWxFbGVtZW50V3JhcHBlci51cGRhdGUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxYbWxFbGVtZW50LCBYbWxFbGVtZW50QW5ub3RhdGlvbj4gYnVpbGRYbWxFbGVtZW50Q29udGFpbmVyKCkgewotCQlYbWxFbGVtZW50Q29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBYbWxFbGVtZW50Q29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbElEUkVGICoqKioqCi0JCi0JcHVibGljIFhtbElEUkVGIGdldFhtbElEUkVGKCkgewotCQlyZXR1cm4gdGhpcy54bWxJRFJFRjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sSURSRUZfKFhtbElEUkVGIHhtbElEUkVGKSB7Ci0JCVhtbElEUkVGIG9sZFhtbElEUkVGID0gdGhpcy54bWxJRFJFRjsKLQkJdGhpcy54bWxJRFJFRiA9IHhtbElEUkVGOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9JRFJFRl9QUk9QRVJUWSwgb2xkWG1sSURSRUYsIHhtbElEUkVGKTsKLQl9Ci0JCi0JcHVibGljIFhtbElEUkVGIGFkZFhtbElEUkVGKCkgewotCQlpZiAodGhpcy54bWxJRFJFRiAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihKQVhCLlhNTF9JRFJFRik7Ci0JCVhtbElEUkVGIHhtbElEUkVGID0gYnVpbGRYbWxJRFJFRigpOwotCQlzZXRYbWxJRFJFRl8oeG1sSURSRUYpOwotCQlyZXR1cm4geG1sSURSRUY7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbElEUkVGKCkgewotCQlpZiAodGhpcy54bWxJRFJFRiA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9JRFJFRik7Ci0JCXNldFhtbElEUkVGXyhudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVhtbElEUkVGKCkgewotCQlpZiAoZ2V0WG1sSURSRUZBbm5vdGF0aW9uKCkgIT0gbnVsbCkgewotCQkJdGhpcy54bWxJRFJFRiA9IGJ1aWxkWG1sSURSRUYoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sSURSRUYoKSB7Ci0JCWlmIChnZXRYbWxJRFJFRkFubm90YXRpb24oKSA9PSBudWxsKSB7Ci0JCQlzZXRYbWxJRFJFRl8obnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy54bWxJRFJFRiA9PSBudWxsKSB7Ci0JCQlzZXRYbWxJRFJFRl8oYnVpbGRYbWxJRFJFRigpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMueG1sSURSRUYuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVhtbElEUkVGKCkgewotCQlpZiAodGhpcy54bWxJRFJFRiAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbElEUkVGLnVwZGF0ZSgpOwotCQl9Ci0JfQotCXByb3RlY3RlZCBYbWxJRFJFRkFubm90YXRpb24gZ2V0WG1sSURSRUZBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbElEUkVGQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JRFJFRik7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxJRFJFRiBidWlsZFhtbElEUkVGKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sSURSRUYodGhpcywgYnVpbGRYbWxJRFJFRkNvbnRleHQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxJRFJFRkNvbnRleHQgYnVpbGRYbWxJRFJFRkNvbnRleHQoKSB7Ci0JCXJldHVybiBuZXcgWG1sSURSRUZDb250ZXh0KCk7Ci0JfQotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCQkJc3VwZXIuZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpLAotCQkJCW5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQkJCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8WG1sRWxlbWVudCwgSXRlcmFibGU8U3RyaW5nPj4oZ2V0WG1sRWxlbWVudHMoKSkgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IHRyYW5zZm9ybShYbWxFbGVtZW50IG8pIHsKLQkJCQkJCQkJcmV0dXJuIG8uZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpOwotCQkJCQkJCX0KLQkJCQkJCX0pKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNQYXJ0aWNsZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCWZvciAoWG1sRWxlbWVudCB4bWxFbGVtZW50IDogZ2V0WG1sRWxlbWVudHMoKSkgewotCQkJcmVzdWx0ID0geG1sRWxlbWVudC5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gdGhpcy54bWxFbGVtZW50V3JhcHBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQl2YWxpZGF0ZUR1cGxpY2F0ZVR5cGVzQW5kUU5hbWVzKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlmb3IgKFhtbEVsZW1lbnQgeG1sRWxlbWVudCA6IGdldFhtbEVsZW1lbnRzKCkpIHsKLQkJCXhtbEVsZW1lbnQudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCQkKLQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgIT0gbnVsbCkgewotCQkJdGhpcy54bWxFbGVtZW50V3JhcHBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JCQotCQlpZiAodGhpcy54bWxJRFJFRiAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbElEUkVGLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVEdXBsaWNhdGVUeXBlc0FuZFFOYW1lcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlCYWc8U3RyaW5nPiB4bWxFbGVtZW50VHlwZXMgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCUJhZzxRTmFtZT4geG1sRWxlbWVudFFOYW1lcyA9IG5ldyBIYXNoQmFnPFFOYW1lPigpOwotCQkKLQkJZm9yIChYbWxFbGVtZW50IHhtbEVsZW1lbnQgOiBnZXRYbWxFbGVtZW50cygpKSB7Ci0JCQlTdHJpbmcgdHlwZU5hbWUgPSB4bWxFbGVtZW50LmdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpOwotCQkJaWYgKCEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0eXBlTmFtZSkpIHsKLQkJCQl4bWxFbGVtZW50VHlwZXMuYWRkKHR5cGVOYW1lKTsKLQkJCX0KLQkJCVN0cmluZyBlbGVtZW50TmFtZSA9IHhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXROYW1lKCk7Ci0JCQlpZiAoISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGVsZW1lbnROYW1lKSkgewotCQkJCXhtbEVsZW1lbnRRTmFtZXMuYWRkKG5ldyBRTmFtZSh4bWxFbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCksIGVsZW1lbnROYW1lKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoWG1sRWxlbWVudCB4bWxFbGVtZW50IDogZ2V0WG1sRWxlbWVudHMoKSkgewotCQkJdmFsaWRhdGVEdXBsaWNhdGVUeXBlKHhtbEVsZW1lbnQsIHhtbEVsZW1lbnRUeXBlcywgbWVzc2FnZXMsIGFzdFJvb3QpOwotCQkJdmFsaWRhdGVEdXBsaWNhdGVRTmFtZSh4bWxFbGVtZW50LCB4bWxFbGVtZW50UU5hbWVzLCBtZXNzYWdlcywgYXN0Um9vdCk7CQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRHVwbGljYXRlVHlwZShYbWxFbGVtZW50IHhtbEVsZW1lbnQsIEJhZzxTdHJpbmc+IHhtbEVsZW1lbnRUeXBlcywKLQkJCQlMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJU3RyaW5nIHhtbEVsZW1lbnRUeXBlID0geG1sRWxlbWVudC5nZXRGdWxseVF1YWxpZmllZFR5cGUoKTsKLQkJaWYgKHhtbEVsZW1lbnRUeXBlcy5jb3VudCh4bWxFbGVtZW50VHlwZSkgPiAxKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfRUxFTUVOVFNfX0RVUExJQ0FURV9YTUxfRUxFTUVOVF9UWVBFLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHhtbEVsZW1lbnRUeXBlIH0sCi0JCQkJCQkJeG1sRWxlbWVudCwKLQkJCQkJCQl4bWxFbGVtZW50LmdldFR5cGVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUR1cGxpY2F0ZVFOYW1lKFhtbEVsZW1lbnQgeG1sRWxlbWVudCwgQmFnPFFOYW1lPiB4bWxFbGVtZW50UU5hbWVzLAotCQkJCUxpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlTdHJpbmcgeG1sRWxlbWVudE5hbWVzcGFjZSA9IHhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKTsKLQkJU3RyaW5nIHhtbEVsZW1lbnROYW1lID0geG1sRWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWUoKTsKLQkJaWYgKHhtbEVsZW1lbnRRTmFtZXMuY291bnQobmV3IFFOYW1lKHhtbEVsZW1lbnROYW1lc3BhY2UsIHhtbEVsZW1lbnROYW1lKSkgPiAxKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfRUxFTUVOVFNfX0RVUExJQ0FURV9YTUxfRUxFTUVOVF9RTkFNRSwKLQkJCQkJCQluZXcgU3RyaW5nW10geyB4bWxFbGVtZW50TmFtZSB9LAotCQkJCQkJCXhtbEVsZW1lbnQsCi0JCQkJCQkJeG1sRWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQkKLQl9Ci0JCi0JcHJvdGVjdGVkIGNsYXNzIFhtbEVsZW1lbnRDb250YWluZXIKLQkJCWV4dGVuZHMgQ29udGV4dExpc3RDb250YWluZXI8WG1sRWxlbWVudCwgWG1sRWxlbWVudEFubm90YXRpb24+IHsKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBYbWxFbGVtZW50c01hcHBpbmcuWE1MX0VMRU1FTlRTX0xJU1Q7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudCBidWlsZENvbnRleHRFbGVtZW50KFhtbEVsZW1lbnRBbm5vdGF0aW9uIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nLnRoaXMuYnVpbGRYbWxFbGVtZW50KHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFhtbEVsZW1lbnRBbm5vdGF0aW9uPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nLnRoaXMuZ2V0WG1sRWxlbWVudEFubm90YXRpb25zKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudEFubm90YXRpb24gZ2V0UmVzb3VyY2VFbGVtZW50KFhtbEVsZW1lbnQgY29udGV4dEVsZW1lbnQpIHsKLQkJCS8vIGluIHRoZSBjb250ZXh0IG9mIHRoaXMgbWFwcGluZywgdGhlcmUgd2lsbCBuZXZlciBiZSBhbiBYbWxFbGVtZW50IHdpdGhvdXQgYW4gYW5ub3RhdGlvbgotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldEFubm90YXRpb24oZmFsc2UpOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxFbGVtZW50Q29udGV4dAotCQkJaW1wbGVtZW50cyBHZW5lcmljSmF2YVhtbEVsZW1lbnQuQ29udGV4dCB7Ci0JCQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudEFubm90YXRpb24gYW5ub3RhdGlvbjsKLQkJCi0JCXByb3RlY3RlZCBYbWxFbGVtZW50Q29udGV4dChYbWxFbGVtZW50QW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCQl0aGlzLmFubm90YXRpb24gPSBhbm5vdGF0aW9uOwotCQl9Ci0JCQotCQlwdWJsaWMgWG1sRWxlbWVudEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihib29sZWFuIGNyZWF0ZUlmTnVsbCkgewotCQkJLy8gd2lsbCBuZXZlciBiZSBudWxsIGluIHRoaXMgY29udGV4dAotCQkJcmV0dXJuIGFubm90YXRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nLnRoaXM7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFR5cGUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIFhtbEVsZW1lbnRXcmFwcGVyIGdldEVsZW1lbnRXcmFwcGVyKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nLnRoaXMuZ2V0WG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaGFzWG1sSUQoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGhhc1htbElEUkVGKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nLnRoaXMuZ2V0WG1sSURSRUYoKSAhPSBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBoYXNYbWxMaXN0KCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBoYXNYbWxTY2hlbWFUeXBlKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlwdWJsaWMgWG1sU2NoZW1hVHlwZSBnZXRYbWxTY2hlbWFUeXBlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFhtbElEUkVGQ29udGV4dAotCQkJaW1wbGVtZW50cyBHZW5lcmljSmF2YVhtbElEUkVGLkNvbnRleHQgewotCQkKLQkJcHVibGljIFhtbElEUkVGQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nLnRoaXMuZ2V0WG1sSURSRUZBbm5vdGF0aW9uKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJdGVyYWJsZTxWYWxpZGF0YWJsZVJlZmVyZW5jZT4gZ2V0UmVmZXJlbmNlcygpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxYbWxFbGVtZW50LCBWYWxpZGF0YWJsZVJlZmVyZW5jZT4oCi0JCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nLnRoaXMuZ2V0WG1sRWxlbWVudHMoKSkgewotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBWYWxpZGF0YWJsZVJlZmVyZW5jZSB0cmFuc2Zvcm0oZmluYWwgWG1sRWxlbWVudCBvKSB7Ci0JCQkJCQotCQkJCQlyZXR1cm4gbmV3IFZhbGlkYXRhYmxlUmVmZXJlbmNlKCkgewotCQkJCQkJCi0JCQkJCQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpIHsKLQkJCQkJCQlyZXR1cm4gby5nZXRGdWxseVF1YWxpZmllZFR5cGUoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHVibGljIFRleHRSYW5nZSBnZXRUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQkJCQkJcmV0dXJuIG8uZ2V0VHlwZVRleHRSYW5nZShhc3RSb290KTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHVibGljIFhzZEZlYXR1cmUgZ2V0WHNkRmVhdHVyZSgpIHsKLQkJCQkJCQlyZXR1cm4gby5nZXRYc2RFbGVtZW50KCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0WHNkRmVhdHVyZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJCQkJCXJldHVybiBvLmdldFFOYW1lKCkuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc0xpc3QoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxJRC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sSUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzliMDM5YS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxJRDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sTmFtZWROb2RlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSURBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxJRAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIFhtbElECi17Ci0KLQlwcm90ZWN0ZWQgZmluYWwgWG1sSURBbm5vdGF0aW9uIHJlc291cmNlWG1sSUQ7Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxJRChYbWxOYW1lZE5vZGVNYXBwaW5nIHBhcmVudCwgWG1sSURBbm5vdGF0aW9uIHJlc291cmNlKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucmVzb3VyY2VYbWxJRCA9IHJlc291cmNlOwotCX0KLQkKLQkKLQlwdWJsaWMgWG1sTmFtZWROb2RlTWFwcGluZyBnZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gKFhtbE5hbWVkTm9kZU1hcHBpbmcpIGdldFBhcmVudCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGdldE1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJdmFsaWRhdGVBdHRyaWJ1dGVUeXBlKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJCi0JCVhzZEZlYXR1cmUgeHNkRmVhdHVyZSA9IGdldE1hcHBpbmcoKS5nZXRYc2RGZWF0dXJlKCk7Ci0JCWlmICh4c2RGZWF0dXJlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJWHNkVHlwZURlZmluaXRpb24gaWRyZWZUeXBlID0gWHNkVXRpbC5nZXRTY2hlbWFGb3JTY2hlbWEoKS5nZXRUeXBlRGVmaW5pdGlvbigiSUQiKTsKLQkJaWYgKCEgeHNkRmVhdHVyZS50eXBlSXNWYWxpZChpZHJlZlR5cGUsIGZhbHNlKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9JRF9fU0NIRU1BX1RZUEVfTk9UX0lELAotCQkJCQkJbmV3IFN0cmluZyBbXSB7IHhzZEZlYXR1cmUuZ2V0TmFtZSgpIH0sCi0JCQkJCQl0aGlzLAotCQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXR0cmlidXRlVHlwZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKCEgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzSmF2YVJlc291cmNlQXR0cmlidXRlVHlwZVN1YlR5cGVPZihTdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9JRF9fQVRUUklCVVRFX1RZUEVfTk9UX1NUUklORywKLQkJCQkJdGhpcywKLQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlWG1sSUQuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbElEUkVGLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxJRFJFRi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDNhOGVhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbElEUkVGLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxJRFJFRjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSURSRUZBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxJRFJFRgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgWG1sSURSRUYgewotCQotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0IGNvbnRleHQ7Ci0JCi0JCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sSURSRUYoSmF4YkF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXhiQXR0cmlidXRlTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnQoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmNvbnRleHQuZ2V0QW5ub3RhdGlvbigpLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCWZvciAoVmFsaWRhdGFibGVSZWZlcmVuY2UgcmVmIDogdGhpcy5jb250ZXh0LmdldFJlZmVyZW5jZXMoKSkgewotCQkJU3RyaW5nIHR5cGVOYW1lID0gcmVmLmdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpOwotCQkJCi0JCQkvLyBPYmplY3QgbWF5IGJlIHVzZWQgaW4gc29tZSBjYXNlcyBvZiBhICpzaW5nbGUqIHR5cGUsIGJ1dCBjYW4ndCBiZSB2YWxpZGF0ZWQKLQkJCWlmICghIChPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyh0eXBlTmFtZSkgJiYgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5jb250ZXh0LmdldFJlZmVyZW5jZXMoKSkgPT0gMSkpIHsKLQkJCQkJCi0JCQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBnZXRDb250ZXh0Um9vdCgpLmdldENsYXNzTWFwcGluZyh0eXBlTmFtZSk7Ci0JCQkJaWYgKGNsYXNzTWFwcGluZyA9PSBudWxsIHx8IGNsYXNzTWFwcGluZy5nZXRYbWxJZE1hcHBpbmcoKSA9PSBudWxsKSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfSURfUkVGX19UWVBFX0RPRVNfTk9UX0NPTlRBSU5fWE1MX0lELAotCQkJCQkJbmV3IFN0cmluZ1tdIHsgdHlwZU5hbWUgfSwKLQkJCQkJCXRoaXMsCi0JCQkJCQlyZWYuZ2V0VHlwZVRleHRSYW5nZShhc3RSb290KSkpOwkJCQkKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCVhzZEZlYXR1cmUgeHNkRmVhdHVyZSA9IHJlZi5nZXRYc2RGZWF0dXJlKCk7Ci0JCQlpZiAoeHNkRmVhdHVyZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKHhzZEZlYXR1cmUgIT0gbnVsbCAKLQkJCQkJJiYgISB4c2RGZWF0dXJlLnR5cGVJc1ZhbGlkKFhzZFV0aWwuZ2V0U2NoZW1hRm9yU2NoZW1hKCkuZ2V0VHlwZURlZmluaXRpb24oIklEUkVGIiksIHRoaXMuY29udGV4dC5pc0xpc3QoKSkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0lEX1JFRl9fU0NIRU1BX1RZUEVfTk9UX0lEUkVGLAotCQkJCQkJCW5ldyBTdHJpbmcgW10geyB4c2RGZWF0dXJlLmdldE5hbWUoKSB9LAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJcmVmLmdldFhzZEZlYXR1cmVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgaW50ZXJmYWNlIENvbnRleHQgewotCQkKLQkJWG1sSURSRUZBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKTsKLQkJCi0JCUl0ZXJhYmxlPFZhbGlkYXRhYmxlUmVmZXJlbmNlPiBnZXRSZWZlcmVuY2VzKCk7Ci0JCQotCQlib29sZWFuIGlzTGlzdCgpOwotCX0KLQkKLQkKLQlwdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRhYmxlUmVmZXJlbmNlIHsKLQkJCi0JCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZFR5cGUoKTsKLQkJCi0JCVRleHRSYW5nZSBnZXRUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkJCi0JCVhzZEZlYXR1cmUgZ2V0WHNkRmVhdHVyZSgpOwotCQkKLQkJVGV4dFJhbmdlIGdldFhzZEZlYXR1cmVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbE1peGVkLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxNaXhlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODk4ZWJkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbE1peGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxNaXhlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTWl4ZWRBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxNaXhlZAotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgWG1sTWl4ZWQgewotCQotCXByb3RlY3RlZCBmaW5hbCBYbWxNaXhlZEFubm90YXRpb24gcmVzb3VyY2VYbWxNaXhlZDsKLQkKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxNaXhlZChKYXhiQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIFhtbE1peGVkQW5ub3RhdGlvbiByZXNvdXJjZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnJlc291cmNlWG1sTWl4ZWQgPSByZXNvdXJjZTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXhiQXR0cmlidXRlTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnQoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VYbWxNaXhlZC5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sTnMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbE5zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMTdkZmYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sTnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sTnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTnNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sTnMKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZQotCQlpbXBsZW1lbnRzIFhtbE5zIHsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgWG1sTnNBbm5vdGF0aW9uIHJlc291cmNlWG1sTnM7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2VVUkk7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVmaXg7Ci0JCi0JCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sTnMoWG1sU2NoZW1hIHBhcmVudCwgWG1sTnNBbm5vdGF0aW9uIHhtbE5zQW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnJlc291cmNlWG1sTnMgPSB4bWxOc0Fubm90YXRpb247Ci0JCXRoaXMubmFtZXNwYWNlVVJJID0gdGhpcy5nZXRSZXNvdXJjZU5hbWVzcGFjZVVSSSgpOwotCQl0aGlzLnByZWZpeCA9IHRoaXMuZ2V0UmVzb3VyY2VQcmVmaXgoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFhtbE5zQW5ub3RhdGlvbiBnZXRSZXNvdXJjZVhtbE5zKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVhtbE5zOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0TmFtZXNwYWNlVVJJXyh0aGlzLmdldFJlc291cmNlTmFtZXNwYWNlVVJJKCkpOwotCQl0aGlzLnNldFByZWZpeF8odGhpcy5nZXRSZXNvdXJjZVByZWZpeCgpKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIEpheGJQYWNrYWdlSW5mbyBnZXRKYXhiUGFja2FnZUluZm8oKSB7Ci0JCXJldHVybiBnZXRYbWxTY2hlbWEoKS5nZXRKYXhiUGFja2FnZUluZm8oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbFNjaGVtYSBnZXRYbWxTY2hlbWEoKSB7Ci0JCXJldHVybiAoWG1sU2NoZW1hKSBnZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBhY2thZ2UgZ2V0UmVzb3VyY2VQYWNrYWdlKCkgewotCQlyZXR1cm4gZ2V0SmF4YlBhY2thZ2VJbmZvKCkuZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIG5hbWVzcGFjZVVSSSAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2VVUkk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCXRoaXMucmVzb3VyY2VYbWxOcy5zZXROYW1lc3BhY2VVUkkobmFtZXNwYWNlKTsKLQkJdGhpcy5zZXROYW1lc3BhY2VVUklfKG5hbWVzcGFjZSk7CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lc3BhY2VVUklfKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZXNwYWNlVVJJOwotCQl0aGlzLm5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVTUEFDRV9VUklfUFJPUEVSVFksIG9sZCwgbmFtZXNwYWNlVVJJKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZU5hbWVzcGFjZVVSSSgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VYbWxOcy5nZXROYW1lc3BhY2VVUkkoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogcHJlZml4ICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiB0aGlzLnByZWZpeDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHsKLQkJdGhpcy5yZXNvdXJjZVhtbE5zLnNldFByZWZpeChwcmVmaXgpOwotCQl0aGlzLnNldFByZWZpeF8ocHJlZml4KTsJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFByZWZpeF8oU3RyaW5nIHByZWZpeCkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5wcmVmaXg7Ci0JCXRoaXMucHJlZml4ID0gcHJlZml4OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJFRklYX1BST1BFUlRZLCBvbGQsIHByZWZpeCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VQcmVmaXgoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlWG1sTnMuZ2V0UHJlZml4KCk7Ci0JfQotCQotCQotCS8vICoqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoCi0JCQlpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQotCQlpZiAoZ2V0UmVzb3VyY2VYbWxOcygpLm5hbWVzcGFjZVVSSVRvdWNoZXMocG9zLCBhc3RSb290KSkgewotCQkJcmV0dXJuIGdldE5hbWVzcGFjZVVSSUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldE5hbWVzcGFjZVVSSUNvbXBsZXRpb25Qcm9wb3NhbHMoCi0JCQlpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQotCQlTdHJpbmcgcGFja2FnZU5hbWVzcGFjZSA9IGdldEpheGJQYWNrYWdlSW5mbygpLmdldEpheGJQYWNrYWdlKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkocGFja2FnZU5hbWVzcGFjZSkpID8KLQkJCQlFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCkgOiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlKFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKHBhY2thZ2VOYW1lc3BhY2UpKTsKLQkJWHNkU2NoZW1hIHNjaGVtYSA9IGdldEpheGJQYWNrYWdlSW5mbygpLmdldEpheGJQYWNrYWdlKCkuZ2V0WHNkU2NoZW1hKCk7Ci0JCWlmIChzY2hlbWEgIT0gbnVsbCkgeyAKLQkJCXJlc3VsdCA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KHJlc3VsdCwgc2NoZW1hLmdldE5hbWVzcGFjZVByb3Bvc2FscyhmaWx0ZXIpKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNldChyZXN1bHQpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZVhtbE5zKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBtaXNjZWxsYW5lb3VzICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWVzcGFjZVVSSSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sUmVnaXN0cnkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNjkzNjguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbGVtZW50RmFjdG9yeU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuSnB0SmF4YkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sUmVnaXN0cnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxSZWdpc3RyeQotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgWG1sUmVnaXN0cnkgewotCi0JcHJvdGVjdGVkIGZpbmFsIEVsZW1lbnRGYWN0b3J5TWV0aG9kQ29udGFpbmVyIGVsZW1lbnRGYWN0b3J5TWV0aG9kQ29udGFpbmVyOwotCQotCQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbFJlZ2lzdHJ5KEpheGJDbGFzcyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5lbGVtZW50RmFjdG9yeU1ldGhvZENvbnRhaW5lciA9IG5ldyBFbGVtZW50RmFjdG9yeU1ldGhvZENvbnRhaW5lcigpOwotCQkKLQkJaW5pdEVsZW1lbnRGYWN0b3J5TWV0aG9kcygpOwotCX0KLQkKLQkKLQlwdWJsaWMgSmF4YkNsYXNzIGdldEpheGJDbGFzcygpIHsKLQkJcmV0dXJuIChKYXhiQ2xhc3MpIGdldFBhcmVudCgpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVJlc291cmNlVHlwZSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gZ2V0SmF4YkNsYXNzKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sUmVnaXN0cnlBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sUmVnaXN0cnlBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9SRUdJU1RSWSk7Ci0JfQotCQotCXB1YmxpYyBKYXhiUGFja2FnZSBnZXRKYXhiUGFja2FnZSgpIHsKLQkJcmV0dXJuIGdldEpheGJDbGFzcygpLmdldEpheGJQYWNrYWdlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc3luY0VsZW1lbnRGYWN0b3J5TWV0aG9kcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl1cGRhdGVFbGVtZW50RmFjdG9yeU1ldGhvZHMoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogZWxlbWVudCBmYWN0b3J5IG1ldGhvZHMgKioqKioKLQkKLQlwdWJsaWMgSXRlcmFibGU8SmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kPiBnZXRFbGVtZW50RmFjdG9yeU1ldGhvZHMoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRGYWN0b3J5TWV0aG9kQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldEVsZW1lbnRGYWN0b3J5TWV0aG9kc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRGYWN0b3J5TWV0aG9kQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVsZW1lbnRGYWN0b3J5TWV0aG9kcygpIHsKLQkJdGhpcy5lbGVtZW50RmFjdG9yeU1ldGhvZENvbnRhaW5lci5pbml0aWFsaXplKCk7CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jRWxlbWVudEZhY3RvcnlNZXRob2RzKCkgewotCQl0aGlzLmVsZW1lbnRGYWN0b3J5TWV0aG9kQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRWxlbWVudEZhY3RvcnlNZXRob2RzKCkgewotCQl0aGlzLmVsZW1lbnRGYWN0b3J5TWV0aG9kQ29udGFpbmVyLnVwZGF0ZSgpOwkKLQl9Ci0JCi0JcHJpdmF0ZSBKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QgYnVpbGRFbGVtZW50RmFjdG9yeU1ldGhvZChKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QpIHsKLQkJcmV0dXJuIGdldEZhY3RvcnkoKS5idWlsZEphdmFFbGVtZW50RmFjdG9yeU1ldGhvZCh0aGlzLCByZXNvdXJjZU1ldGhvZCk7Ci0JfQotCQotCXByaXZhdGUgSXRlcmFibGU8SmF2YVJlc291cmNlTWV0aG9kPiBnZXRSZXNvdXJjZUVsZW1lbnRGYWN0b3J5TWV0aG9kcygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXZhUmVzb3VyY2VNZXRob2Q+KGdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRNZXRob2RzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEphdmFSZXNvdXJjZU1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gbWV0aG9kSXNFbGVtZW50RmFjdG9yeU1ldGhvZChtZXRob2QpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvLyBSZXR1cm4gbWV0aG9kcyB3aXRoIFhtbEVsZW1lbnREZWNsIGFubm90YXRpb24KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbWV0aG9kSXNFbGVtZW50RmFjdG9yeU1ldGhvZChKYXZhUmVzb3VyY2VNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiBtZXRob2RIYXNYbWxFbGVtZW50RGVjbEFubm90YXRpb24obWV0aG9kKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIG1ldGhvZEhhc1htbEVsZW1lbnREZWNsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiBtZXRob2QuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpICE9IG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBtZXRob2RSZXR1cm5UeXBlSXNKQVhCRWxlbWVudChKYXZhUmVzb3VyY2VNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiBtZXRob2QudHlwZUlzU3ViVHlwZU9mKEpBWEIuWE1MX0VMRU1FTlQpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCSBAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlmb3IgKEpheGJFbGVtZW50RmFjdG9yeU1ldGhvZCBlZm0gOiBnZXRFbGVtZW50RmFjdG9yeU1ldGhvZHMoKSkgewotCQkJcmVzdWx0ID0gZWZtLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBnZXRBbm5vdGF0aW9uKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IGdldEpheGJDbGFzcygpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlJdGVyYWJsZTxYbWxSZWdpc3RyeT4gcmVnaXN0cmllcyA9IGdldENvbnRleHRSb290KCkuZ2V0WG1sUmVnaXN0cmllcyhnZXRKYXhiUGFja2FnZSgpKTsKLQkJaWYgKENvbGxlY3Rpb25Ub29scy5zaXplKHJlZ2lzdHJpZXMpID4gMSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9SRUdJU1RSWV9fTVVMVElQTEVfWE1MX1JFR0lTVFJJRVNfRk9SX1BBQ0tBR0UsCi0JCQkJCQl0aGlzLAotCQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JCQotCQl2YWxpZGF0ZUR1cGxpY2F0ZVFOYW1lcyhtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJZm9yIChKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QgZWZtIDogZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzKCkpIHsKLQkJCWVmbS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRHVwbGljYXRlUU5hbWVzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQotCQlNYXA8U3RyaW5nLCBCYWc8UU5hbWU+PiB4bWxFbGVtZW50RGVjbFFuYW1lcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQmFnPFFOYW1lPj4oKTsKLQkJCi0JCWZvciAoSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kIHhtbEVsZW1lbnREZWNsIDogZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzKCkpIHsKLQkJCVN0cmluZyBlbGVtZW50RGVjbE5hbWUgPSB4bWxFbGVtZW50RGVjbC5nZXRRTmFtZSgpLmdldE5hbWUoKTsKLQkJCWlmICghIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZWxlbWVudERlY2xOYW1lKSkgewotCQkJCVN0cmluZyBmcVNjb3BlID0geG1sRWxlbWVudERlY2wuZ2V0RnVsbHlRdWFsaWZpZWRTY29wZSgpOwotCQkJCWlmICh4bWxFbGVtZW50RGVjbFFuYW1lcy5nZXQoZnFTY29wZSkgPT0gbnVsbCkgewotCQkJCQl4bWxFbGVtZW50RGVjbFFuYW1lcy5wdXQoZnFTY29wZSwgbmV3IEhhc2hCYWc8UU5hbWU+KCkpOwotCQkJCX0KLQkJCQl4bWxFbGVtZW50RGVjbFFuYW1lcy5nZXQoZnFTY29wZSkuYWRkKG5ldyBRTmFtZSh4bWxFbGVtZW50RGVjbC5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpLCBlbGVtZW50RGVjbE5hbWUpKTsKLQkJCX0KLQkJfQotCQkKLQkJZm9yIChKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QgeG1sRWxlbWVudERlY2wgOiBnZXRFbGVtZW50RmFjdG9yeU1ldGhvZHMoKSkgewotCQkJU3RyaW5nIGZxU2NvcGUgPSB4bWxFbGVtZW50RGVjbC5nZXRGdWxseVF1YWxpZmllZFNjb3BlKCk7Ci0JCQlTdHJpbmcgeG1sRWxlbWVudE5hbWVzcGFjZSA9IHhtbEVsZW1lbnREZWNsLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCQlTdHJpbmcgeG1sRWxlbWVudE5hbWUgPSB4bWxFbGVtZW50RGVjbC5nZXRRTmFtZSgpLmdldE5hbWUoKTsKLQkJCWlmICh4bWxFbGVtZW50RGVjbFFuYW1lcy5nZXQoZnFTY29wZSkuY291bnQobmV3IFFOYW1lKHhtbEVsZW1lbnROYW1lc3BhY2UsIHhtbEVsZW1lbnROYW1lKSkgPiAxKSB7Ci0JCQkJU3RyaW5nIHNjb3BlRGVzYyA9ICIiOwotCQkJCWlmICghIEpheGJFbGVtZW50RmFjdG9yeU1ldGhvZC5ERUZBVUxUX1NDT1BFX0NMQVNTX05BTUUuZXF1YWxzKGZxU2NvcGUpKSB7Ci0JCQkJCXNjb3BlRGVzYyA9IE5MUy5iaW5kKEpwdEpheGJDb3JlTWVzc2FnZXMuWE1MX0VMRU1FTlRfREVDTF9fU0NPUEUsIGZxU2NvcGUpOwotCQkJCX0KLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfUkVHSVNUUllfX0RVUExJQ0FURV9YTUxfRUxFTUVOVF9RTkFNRSwKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgeG1sRWxlbWVudE5hbWUsIHNjb3BlRGVzYyB9LAotCQkJCQkJCQl4bWxFbGVtZW50RGVjbCwKLQkJCQkJCQkJeG1sRWxlbWVudERlY2wuZ2V0UU5hbWUoKS5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogZWxlbWVudCBmYWN0b3J5IG1ldGhvZCBjb250YWluZXIgYWRhcHRlcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBFbGVtZW50RmFjdG9yeU1ldGhvZENvbnRhaW5lcgotCQkJZXh0ZW5kcyBDb250ZXh0Q29sbGVjdGlvbkNvbnRhaW5lcjxKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QsIEphdmFSZXNvdXJjZU1ldGhvZD4gewotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFhtbFJlZ2lzdHJ5LkVMRU1FTlRfRkFDVE9SWV9NRVRIT0RTX0NPTExFQ1RJT047Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kIGJ1aWxkQ29udGV4dEVsZW1lbnQoSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sUmVnaXN0cnkudGhpcy5idWlsZEVsZW1lbnRGYWN0b3J5TWV0aG9kKHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlTWV0aG9kPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sUmVnaXN0cnkudGhpcy5nZXRSZXNvdXJjZUVsZW1lbnRGYWN0b3J5TWV0aG9kcygpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEphdmFSZXNvdXJjZU1ldGhvZCBnZXRSZXNvdXJjZUVsZW1lbnQoSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0UmVzb3VyY2VNZXRob2QoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFJvb3RFbGVtZW50LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxSb290RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTQ3NjM5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFJvb3RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJRTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sUm9vdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuSnB0SmF4YkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuUU5hbWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxSb290RWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxSb290RWxlbWVudAotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgWG1sUm9vdEVsZW1lbnQgewotCQotCXByb3RlY3RlZCBmaW5hbCBYbWxSb290RWxlbWVudEFubm90YXRpb24gYW5ub3RhdGlvbjsKLQkKLQlwcm90ZWN0ZWQgSmF4YlFOYW1lIHFOYW1lOwotCQotCQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbFJvb3RFbGVtZW50KEpheGJUeXBlTWFwcGluZyBwYXJlbnQsIFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiByZXNvdXJjZVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmFubm90YXRpb24gPSByZXNvdXJjZVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbjsKLQkJdGhpcy5xTmFtZSA9IGJ1aWxkUU5hbWUoKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIEpheGJRTmFtZSBidWlsZFFOYW1lKCkgewotCQlyZXR1cm4gbmV3IFhtbFJvb3RFbGVtZW50UU5hbWUodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBKYXhiVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiAoSmF4YlR5cGVNYXBwaW5nKSBnZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJUeXBlIGdldEpheGJUeXBlKCkgewotCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXRKYXhiVHlwZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoKSB7Ci0JCXJldHVybiBnZXRKYXhiVHlwZSgpLmdldEpheGJQYWNrYWdlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5xTmFtZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMucU5hbWUudXBkYXRlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHNjaGVtYSBlbGVtZW50IHJlZiAqKioqKgotCQotCXB1YmxpYyBKYXhiUU5hbWUgZ2V0UU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnFOYW1lOwotCX0KLQkJCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJcmVzdWx0ID0gdGhpcy5xTmFtZS5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCXRoaXMucU5hbWUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKioqKioqKiogbWlzY2VsbGFuZW91cyAqKioqKioqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCh0aGlzLnFOYW1lLnRvU3RyaW5nKCkpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sUm9vdEVsZW1lbnRRTmFtZQotCQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFRTmFtZSB7Ci0JCQotCQlwcm90ZWN0ZWQgWG1sUm9vdEVsZW1lbnRRTmFtZShKYXZhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQsIG5ldyBRTmFtZUFubm90YXRpb25Qcm94eSgpKTsKLQkJfQotCQkKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxSb290RWxlbWVudC50aGlzLmdldEpheGJQYWNrYWdlKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lc3BhY2UoKSB7Ci0JCQlKYXhiUGFja2FnZSBqYXhiUGFja2FnZSA9IHRoaXMuZ2V0SmF4YlBhY2thZ2UoKTsKLQkJCXJldHVybiAoamF4YlBhY2thZ2UgPT0gbnVsbCkgPyBudWxsIDogamF4YlBhY2thZ2UuZ2V0TmFtZXNwYWNlKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lKCkgewotCQkJcmV0dXJuIEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUoR2VuZXJpY0phdmFYbWxSb290RWxlbWVudC50aGlzLmdldEpheGJUeXBlKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldE5hbWVzcGFjZVByb3Bvc2FscyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCVhzZFNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldFhzZFNjaGVtYSgpOwotCQkJaWYgKHNjaGVtYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJCX0KLQkJCXJldHVybiBzY2hlbWEuZ2V0TmFtZXNwYWNlUHJvcG9zYWxzKGZpbHRlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXROYW1lUHJvcG9zYWxzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJWHNkU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0WHNkU2NoZW1hKCk7Ci0JCQlpZiAoc2NoZW1hID09IG51bGwpIHsKLQkJCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQkJfQotCQkJcmV0dXJuIHNjaGVtYS5nZXRFbGVtZW50TmFtZVByb3Bvc2FscyhnZXROYW1lc3BhY2UoKSwgZmlsdGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbXBvbmVudFR5cGVEZXNjcmlwdGlvbigpIHsKLQkJCXJldHVybiBKcHRKYXhiQ29yZU1lc3NhZ2VzLlhNTF9FTEVNRU5UX0RFU0M7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVJlZmVyZW5jZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JCQlTdHJpbmcgbmFtZXNwYWNlID0gZ2V0TmFtZXNwYWNlKCk7Ci0JCQlYc2RTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXRYc2RTY2hlbWEoKTsKLQkJCQotCQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJLy8gZWxlbWVudCBtdXN0IHJlc29sdmUKLQkJCQlYc2RFbGVtZW50RGVjbGFyYXRpb24gc2NoZW1hRWxlbWVudCA9IHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb24obmFtZXNwYWNlLCBuYW1lKTsKLQkJCQlpZiAoc2NoZW1hRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZChnZXRVbnJlc29sdmVTY2hlbWFDb21wb25lbnRNZXNzYWdlKGFzdFJvb3QpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGVsZW1lbnQgdHlwZSBtdXN0IGFncmVlIHdpdGggcGFyZW50J3Mgc2NoZW1hIHR5cGUKLQkJCQkJWHNkVHlwZURlZmluaXRpb24gc2NoZW1hVHlwZSA9IEdlbmVyaWNKYXZhWG1sUm9vdEVsZW1lbnQudGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCQkJCWlmIChzY2hlbWFUeXBlICE9IG51bGwpIHsKLQkJCQkJCWlmICghIHNjaGVtYVR5cGUuZXF1YWxzKHNjaGVtYUVsZW1lbnQuZ2V0VHlwZSgpKSkgewotCQkJCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfUk9PVF9FTEVNRU5UX1RZUEVfQ09ORkxJQ1RTX1dJVEhfWE1MX1RZUEUsCi0JCQkJCQkJCQkJbmV3IFN0cmluZ1tdIHtuYW1lLCBuYW1lc3BhY2V9LAotCQkJCQkJCQkJCXRoaXMsCi0JCQkJCQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBRTmFtZUFubm90YXRpb25Qcm94eSAKLQkJCWV4dGVuZHMgQWJzdHJhY3RKYXZhUU5hbWUuQWJzdHJhY3RRTmFtZUFubm90YXRpb25Qcm94eSB7Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFFOYW1lQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKGJvb2xlYW4gY3JlYXRlSWZOdWxsKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxSb290RWxlbWVudC50aGlzLmFubm90YXRpb247Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxTY2hlbWEuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFNjaGVtYS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzc2MDM1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFNjaGVtYS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5TY2hlbWFFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sTnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbE5zRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxOc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFNjaGVtYUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERm9ybTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sU2NoZW1hCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhQ29udGV4dE5vZGUKLQkJaW1wbGVtZW50cyBYbWxTY2hlbWEgewotCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkTmFtZXNwYWNlOwotCQotCXByb3RlY3RlZCBTdHJpbmcgbG9jYXRpb247Ci0JCi0JcHJvdGVjdGVkIFhtbE5zRm9ybSBzcGVjaWZpZWRBdHRyaWJ1dGVGb3JtRGVmYXVsdDsKLQkKLQlwcm90ZWN0ZWQgWG1sTnNGb3JtIHNwZWNpZmllZEVsZW1lbnRGb3JtRGVmYXVsdDsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8WG1sTnMsIFhtbE5zQW5ub3RhdGlvbj4geG1sTnNQcmVmaXhDb250YWluZXI7Ci0JCi0JCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sU2NoZW1hKEpheGJQYWNrYWdlSW5mbyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWROYW1lc3BhY2UgPSB0aGlzLmdldFJlc291cmNlTmFtZXNwYWNlKCk7Ci0JCXRoaXMubG9jYXRpb24gPSB0aGlzLmdldFJlc291cmNlTG9jYXRpb24oKTsKLQkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVGb3JtRGVmYXVsdCA9IGdldFJlc291cmNlQXR0cmlidXRlRm9ybURlZmF1bHQoKTsKLQkJdGhpcy5zcGVjaWZpZWRFbGVtZW50Rm9ybURlZmF1bHQgPSBnZXRSZXNvdXJjZUVsZW1lbnRGb3JtRGVmYXVsdCgpOwotCQl0aGlzLnhtbE5zUHJlZml4Q29udGFpbmVyID0gdGhpcy5idWlsZFhtbE5zUHJlZml4Q29udGFpbmVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkTmFtZXNwYWNlXyh0aGlzLmdldFJlc291cmNlTmFtZXNwYWNlKCkpOwotCQl0aGlzLnNldExvY2F0aW9uXyh0aGlzLmdldFJlc291cmNlTG9jYXRpb24oKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQXR0cmlidXRlRm9ybURlZmF1bHRfKGdldFJlc291cmNlQXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkRWxlbWVudEZvcm1EZWZhdWx0XyhnZXRSZXNvdXJjZUVsZW1lbnRGb3JtRGVmYXVsdCgpKTsKLQkJdGhpcy5zeW5jWG1sTnNQcmVmaXhlcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZVhtbE5zUHJlZml4ZXMoKTsKLQl9Ci0JCi0JcHVibGljIEpheGJQYWNrYWdlSW5mbyBnZXRKYXhiUGFja2FnZUluZm8oKSB7Ci0JCXJldHVybiAoSmF4YlBhY2thZ2VJbmZvKSBnZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHVibGljIEpheGJQYWNrYWdlIGdldEpheGJQYWNrYWdlKCkgewotCQlyZXR1cm4gZ2V0SmF4YlBhY2thZ2VJbmZvKCkuZ2V0SmF4YlBhY2thZ2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBhY2thZ2UgZ2V0UmVzb3VyY2VQYWNrYWdlKCkgewotCQlyZXR1cm4gZ2V0SmF4YlBhY2thZ2VJbmZvKCkuZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogeG1sIHNjaGVtYSBhbm5vdGF0aW9uICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgWG1sU2NoZW1hQW5ub3RhdGlvbiBnZXRYbWxTY2hlbWFBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbFNjaGVtYUFubm90YXRpb24pIHRoaXMuZ2V0UmVzb3VyY2VQYWNrYWdlKCkuZ2V0Tm9uTnVsbEFubm90YXRpb24oSkFYQi5YTUxfU0NIRU1BKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBuYW1lc3BhY2UgKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkTmFtZXNwYWNlID09IG51bGwpID8gIiIgOiB0aGlzLnNwZWNpZmllZE5hbWVzcGFjZTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCXRoaXMuZ2V0WG1sU2NoZW1hQW5ub3RhdGlvbigpLnNldE5hbWVzcGFjZShuYW1lc3BhY2UpOwotCQl0aGlzLnNldFNwZWNpZmllZE5hbWVzcGFjZV8obmFtZXNwYWNlKTsJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE5hbWVzcGFjZV8oU3RyaW5nIG5hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWROYW1lc3BhY2U7Ci0JCXRoaXMuc3BlY2lmaWVkTmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX05BTUVTUEFDRV9QUk9QRVJUWSwgb2xkLCBuYW1lc3BhY2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlTmFtZXNwYWNlKCkgewotCQlyZXR1cm4gZ2V0WG1sU2NoZW1hQW5ub3RhdGlvbigpLmdldE5hbWVzcGFjZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGxvY2F0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5sb2NhdGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCXRoaXMuZ2V0WG1sU2NoZW1hQW5ub3RhdGlvbigpLnNldExvY2F0aW9uKGxvY2F0aW9uKTsKLQkJdGhpcy5zZXRMb2NhdGlvbl8obG9jYXRpb24pOwkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0TG9jYXRpb25fKFN0cmluZyBsb2NhdGlvbikgewotCQlTdHJpbmcgb2xkID0gdGhpcy5sb2NhdGlvbjsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTE9DQVRJT05fUFJPUEVSVFksIG9sZCwgbG9jYXRpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBnZXRYbWxTY2hlbWFBbm5vdGF0aW9uKCkuZ2V0TG9jYXRpb24oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBhdHRyaWJ1dGUgZm9ybSBkZWZhdWx0ICoqKioqKioqKioKLQkKLQlwdWJsaWMgWG1sTnNGb3JtIGdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlRm9ybURlZmF1bHQgPT0gbnVsbCkgPyBYbWxOc0Zvcm0uVU5TRVQgOiB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZUZvcm1EZWZhdWx0OwotCX0KLQkKLQlwdWJsaWMgWG1sTnNGb3JtIGdldFNwZWNpZmllZEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVGb3JtRGVmYXVsdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQXR0cmlidXRlRm9ybURlZmF1bHQoWG1sTnNGb3JtIGF0dHJpYnV0ZUZvcm1EZWZhdWx0KSB7Ci0JCWdldFhtbFNjaGVtYUFubm90YXRpb24oKS5zZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdChYbWxOc0Zvcm0udG9KYXZhUmVzb3VyY2VNb2RlbChhdHRyaWJ1dGVGb3JtRGVmYXVsdCkpOwotCQlzZXRTcGVjaWZpZWRBdHRyaWJ1dGVGb3JtRGVmYXVsdF8oYXR0cmlidXRlRm9ybURlZmF1bHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRBdHRyaWJ1dGVGb3JtRGVmYXVsdF8oWG1sTnNGb3JtIGF0dHJpYnV0ZUZvcm1EZWZhdWx0KSB7Ci0JCVhtbE5zRm9ybSBvbGQgPSB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZUZvcm1EZWZhdWx0OwotCQl0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZUZvcm1EZWZhdWx0ID0gYXR0cmlidXRlRm9ybURlZmF1bHQ7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0FUVFJJQlVURV9GT1JNX0RFRkFVTFRfUFJPUEVSVFksIG9sZCwgYXR0cmlidXRlRm9ybURlZmF1bHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sTnNGb3JtIGdldFJlc291cmNlQXR0cmlidXRlRm9ybURlZmF1bHQoKSB7Ci0JCXJldHVybiBYbWxOc0Zvcm0uZnJvbUphdmFSZXNvdXJjZU1vZGVsKGdldFhtbFNjaGVtYUFubm90YXRpb24oKS5nZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBlbGVtZW50IGZvcm0gZGVmYXVsdCAqKioqKioqKioqCi0JCi0JcHVibGljIFhtbE5zRm9ybSBnZXRFbGVtZW50Rm9ybURlZmF1bHQoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRFbGVtZW50Rm9ybURlZmF1bHQgPT0gbnVsbCkgPyBYbWxOc0Zvcm0uVU5TRVQgOiB0aGlzLnNwZWNpZmllZEVsZW1lbnRGb3JtRGVmYXVsdDsKLQl9Ci0JCi0JcHVibGljIFhtbE5zRm9ybSBnZXRTcGVjaWZpZWRFbGVtZW50Rm9ybURlZmF1bHQoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEVsZW1lbnRGb3JtRGVmYXVsdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkRWxlbWVudEZvcm1EZWZhdWx0KFhtbE5zRm9ybSBlbGVtZW50Rm9ybURlZmF1bHQpIHsKLQkJZ2V0WG1sU2NoZW1hQW5ub3RhdGlvbigpLnNldEVsZW1lbnRGb3JtRGVmYXVsdChYbWxOc0Zvcm0udG9KYXZhUmVzb3VyY2VNb2RlbChlbGVtZW50Rm9ybURlZmF1bHQpKTsKLQkJc2V0U3BlY2lmaWVkRWxlbWVudEZvcm1EZWZhdWx0XyhlbGVtZW50Rm9ybURlZmF1bHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRFbGVtZW50Rm9ybURlZmF1bHRfKFhtbE5zRm9ybSBlbGVtZW50Rm9ybURlZmF1bHQpIHsKLQkJWG1sTnNGb3JtIG9sZCA9IHRoaXMuc3BlY2lmaWVkRWxlbWVudEZvcm1EZWZhdWx0OwotCQl0aGlzLnNwZWNpZmllZEVsZW1lbnRGb3JtRGVmYXVsdCA9IGVsZW1lbnRGb3JtRGVmYXVsdDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfRUxFTUVOVF9GT1JNX0RFRkFVTFRfUFJPUEVSVFksIG9sZCwgZWxlbWVudEZvcm1EZWZhdWx0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbE5zRm9ybSBnZXRSZXNvdXJjZUVsZW1lbnRGb3JtRGVmYXVsdCgpIHsKLQkJcmV0dXJuIFhtbE5zRm9ybS5mcm9tSmF2YVJlc291cmNlTW9kZWwoZ2V0WG1sU2NoZW1hQW5ub3RhdGlvbigpLmdldEVsZW1lbnRGb3JtRGVmYXVsdCgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB4bWwgbmFtZXNwYWNlIHByZWZpeGVzICoqKioqKioqKioKLQkKLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFhtbE5zPiBnZXRYbWxOc1ByZWZpeGVzKCkgewotCQlyZXR1cm4gdGhpcy54bWxOc1ByZWZpeENvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRYbWxOc1ByZWZpeGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMueG1sTnNQcmVmaXhDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgWG1sTnMgYWRkWG1sTnNQcmVmaXgoaW50IGluZGV4KSB7Ci0JCVhtbE5zQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRYbWxTY2hlbWFBbm5vdGF0aW9uKCkuYWRkWG1sbnMoaW5kZXgpOwotCQlyZXR1cm4gdGhpcy54bWxOc1ByZWZpeENvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgYW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbE5zUHJlZml4KFhtbE5zIHhtbE5zUHJlZml4KSB7Ci0JCXRoaXMucmVtb3ZlWG1sTnNQcmVmaXgodGhpcy54bWxOc1ByZWZpeENvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoeG1sTnNQcmVmaXgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sTnNQcmVmaXgoaW50IGluZGV4KSB7Ci0JCXRoaXMuZ2V0WG1sU2NoZW1hQW5ub3RhdGlvbigpLnJlbW92ZVhtbG5zKGluZGV4KTsKLQkJdGhpcy54bWxOc1ByZWZpeENvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVYbWxOc1ByZWZpeChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLmdldFhtbFNjaGVtYUFubm90YXRpb24oKS5tb3ZlWG1sbnModGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy54bWxOc1ByZWZpeENvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbE5zIGJ1aWxkWG1sTnMoWG1sTnNBbm5vdGF0aW9uIHhtbE5zQW5ub3RhdGlvbikgewotCQlyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuYnVpbGRKYXZhWG1sTnModGhpcywgeG1sTnNBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1htbE5zUHJlZml4ZXMoKSB7Ci0JCXRoaXMueG1sTnNQcmVmaXhDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVYbWxOc1ByZWZpeGVzKCkgewotCQl0aGlzLnhtbE5zUHJlZml4Q29udGFpbmVyLnVwZGF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sTnNBbm5vdGF0aW9uPiBnZXRYbWxOc0Fubm90YXRpb25zKCkgewotCQlyZXR1cm4gZ2V0WG1sU2NoZW1hQW5ub3RhdGlvbigpLmdldFhtbG5zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyPFhtbE5zLCBYbWxOc0Fubm90YXRpb24+IGJ1aWxkWG1sTnNQcmVmaXhDb250YWluZXIoKSB7Ci0JCVhtbE5zUHJlZml4Q29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBYbWxOc1ByZWZpeENvbnRhaW5lcigpOwotCQljb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscygKLQkJCWludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCWlmIChuYW1lc3BhY2VUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJldHVybiBnZXROYW1lc3BhY2VQcm9wb3NhbHMoZmlsdGVyKTsKLQkJfQotCQkKLQkJZm9yIChYbWxOcyB4bWxucyA6IGdldFhtbE5zUHJlZml4ZXMoKSkgewotCQkJcmVzdWx0ID0geG1sbnMuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIG5hbWVzcGFjZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldFhtbFNjaGVtYUFubm90YXRpb24oKS5uYW1lc3BhY2VUb3VjaGVzKHBvcywgYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldE5hbWVzcGFjZVByb3Bvc2FscyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscygKLQkJCQluZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPigKLQkJCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFNjaGVtYUVudHJ5LCBTdHJpbmc+KAotCQkJCQkJCQlnZXRKYXhiUHJvamVjdCgpLmdldFNjaGVtYUxpYnJhcnkoKS5nZXRTY2hlbWFFbnRyaWVzKCkpIHsKLQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShTY2hlbWFFbnRyeSBvKSB7Ci0JCQkJCQkJCXJldHVybiBvLmdldE5hbWVzcGFjZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0sIAotCQkJCQkJZmlsdGVyKSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0WG1sU2NoZW1hQW5ub3RhdGlvbigpLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCS8vIHJlbW92aW5nIHRoaXMgdmFsaWRhdGlvbiBtZXNzYWdlIGZvciBub3c6ICBzZWUgamF4YiBidWcgODIzIChodHRwOi8vamF2YS5uZXQvamlyYS9icm93c2UvSkFYQi04MjMpCi0vLwkJWHNkU2NoZW1hIHNjaGVtYSA9IGdldEpheGJQYWNrYWdlKCkuZ2V0WHNkU2NoZW1hKCk7Ci0vLwkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0vLwkJCWlmIChmb3JtQ29uZmxpY3RzKGdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCksIHNjaGVtYS5nZXRYU0RDb21wb25lbnQoKS5nZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpKSkgewotLy8JCQkJbWVzc2FnZXMuYWRkKAotLy8JCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0vLwkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLS8vCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9TQ0hFTUFfX01JU01BVENIRURfQVRUUklCVVRFX0ZPUk1fREVGQVVMVCwKLS8vCQkJCQl0aGlzLAotLy8JCQkJCWdldFhtbFNjaGVtYUFubm90YXRpb24oKS5nZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdFRleHRSYW5nZShhc3RSb290KSkpOwotLy8JCQl9Ci0vLwkJCQotLy8JCQlpZiAoZm9ybUNvbmZsaWN0cyhnZXRFbGVtZW50Rm9ybURlZmF1bHQoKSwgc2NoZW1hLmdldFhTRENvbXBvbmVudCgpLmdldEVsZW1lbnRGb3JtRGVmYXVsdCgpKSkgewotLy8JCQkJbWVzc2FnZXMuYWRkKAotLy8JCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0vLwkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLS8vCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9TQ0hFTUFfX01JU01BVENIRURfRUxFTUVOVF9GT1JNX0RFRkFVTFQsCi0vLwkJCQkJdGhpcywKLS8vCQkJCQlnZXRYbWxTY2hlbWFBbm5vdGF0aW9uKCkuZ2V0RWxlbWVudEZvcm1EZWZhdWx0VGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0vLwkJCX0KLS8vCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGZvcm1Db25mbGljdHMoWG1sTnNGb3JtIGZvcm0sIFhTREZvcm0geHNkRm9ybSkgewotCQlyZXR1cm4gKGZvcm0gPT0gWG1sTnNGb3JtLlFVQUxJRklFRCkgXiAoeHNkRm9ybSA9PSBYU0RGb3JtLlFVQUxJRklFRF9MSVRFUkFMKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogeG1sIG5zIHByZWZpeCBjb250YWluZXIgYWRhcHRlcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBYbWxOc1ByZWZpeENvbnRhaW5lcgotCQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxYbWxOcywgWG1sTnNBbm5vdGF0aW9uPiB7Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gWE1MX05TX1BSRUZJWEVTX0xJU1Q7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sTnMgYnVpbGRDb250ZXh0RWxlbWVudChYbWxOc0Fubm90YXRpb24gcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxTY2hlbWEudGhpcy5idWlsZFhtbE5zKHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFhtbE5zQW5ub3RhdGlvbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbFNjaGVtYS50aGlzLmdldFhtbE5zQW5ub3RhdGlvbnMoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxOc0Fubm90YXRpb24gZ2V0UmVzb3VyY2VFbGVtZW50KFhtbE5zIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0UmVzb3VyY2VYbWxOcygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sU2NoZW1hVHlwZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sU2NoZW1hVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2IxZDRlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFNjaGVtYVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxTY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLkpwdEpheGJDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlFOYW1lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sU2NoZW1hVHlwZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHZW5lcmljSmF2YVhtbFNjaGVtYVR5cGUKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZQotCQlpbXBsZW1lbnRzIFhtbFNjaGVtYVR5cGUgewotCQotCXByb3RlY3RlZCBmaW5hbCBYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbiBhbm5vdGF0aW9uOwotCQotCXByb3RlY3RlZCBKYXhiUU5hbWUgcU5hbWU7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlOwotCQotCQotCXByb3RlY3RlZCBHZW5lcmljSmF2YVhtbFNjaGVtYVR5cGUoSmF4YkNvbnRleHROb2RlIHBhcmVudCwgWG1sU2NoZW1hVHlwZUFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmFubm90YXRpb24gPSBhbm5vdGF0aW9uOwotCQl0aGlzLnFOYW1lID0gYnVpbGRRTmFtZSgpOwotCQl0aGlzLnR5cGUgPSB0aGlzLmdldFJlc291cmNlVHlwZVN0cmluZygpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgSmF4YlFOYW1lIGJ1aWxkUU5hbWUoKSB7Ci0JCXJldHVybiBuZXcgWG1sU2NoZW1hVHlwZVFOYW1lKHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgSmF4YlFOYW1lIGdldFFOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5xTmFtZTsKLQl9Ci0JCi0JcHVibGljIFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIGdldFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBKYXhiUGFja2FnZSBnZXRKYXhiUGFja2FnZSgpOwotCQotCQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMucU5hbWUuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFR5cGVfKHRoaXMuZ2V0UmVzb3VyY2VUeXBlU3RyaW5nKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnFOYW1lLnVwZGF0ZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHR5cGUgKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgbG9jYXRpb24pIHsKLQkJdGhpcy5hbm5vdGF0aW9uLnNldFR5cGUobG9jYXRpb24pOwotCQl0aGlzLnNldFR5cGVfKGxvY2F0aW9uKTsJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFR5cGVfKFN0cmluZyB0eXBlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnR5cGU7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX1BST1BFUlRZLCBvbGQsIHR5cGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlVHlwZVN0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbi5nZXRUeXBlKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCkgewotCQlyZXR1cm4gZ2V0WG1sU2NoZW1hVHlwZUFubm90YXRpb24oKS5nZXRGdWxseVF1YWxpZmllZFR5cGUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCXB1YmxpYyBYc2RUeXBlRGVmaW5pdGlvbiBnZXRYc2RUeXBlRGVmaW5pdGlvbigpIHsKLQkJSmF4YlBhY2thZ2UgcGtnID0gZ2V0SmF4YlBhY2thZ2UoKTsKLQkJWHNkU2NoZW1hIHhzZFNjaGVtYSA9IChwa2cgPT0gbnVsbCkgPyBudWxsIDogcGtnLmdldFhzZFNjaGVtYSgpOwotCQlpZiAoeHNkU2NoZW1hID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlpZiAoISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMucU5hbWUuZ2V0TmFtZSgpKSkgewotCQkJcmV0dXJuIHhzZFNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbih0aGlzLnFOYW1lLmdldE5hbWVzcGFjZSgpLCB0aGlzLnFOYW1lLmdldE5hbWUoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXJlc3VsdCA9IHRoaXMucU5hbWUuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJdGhpcy5xTmFtZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJWHNkVHlwZURlZmluaXRpb24geHNkVHlwZSA9IGdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCWlmICh4c2RUeXBlICE9IG51bGwgJiYgeHNkVHlwZS5nZXRLaW5kKCkgIT0gWHNkVHlwZURlZmluaXRpb24uS2luZC5TSU1QTEUpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9TQ0hFTUFfVFlQRV9fTk9OX1NJTVBMRV9UWVBFLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHFOYW1lLmdldE5hbWUoKSB9LAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0WG1sU2NoZW1hVHlwZUFubm90YXRpb24oKS5nZXRUeXBlVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sU2NoZW1hVHlwZVFOYW1lCi0JCQlleHRlbmRzIEFic3RyYWN0SmF2YVFOYW1lIHsKLQkJCi0JCXByb3RlY3RlZCBYbWxTY2hlbWFUeXBlUU5hbWUoSmF2YUNvbnRleHROb2RlIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50LCBuZXcgUU5hbWVBbm5vdGF0aW9uUHJveHkoKSk7Ci0JCX0KLQkJCi0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEpheGJQYWNrYWdlIGdldEpheGJQYWNrYWdlKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sU2NoZW1hVHlwZS50aGlzLmdldEpheGJQYWNrYWdlKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlZmVyZW5jZWRDb21wb25lbnRUeXBlRGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gSnB0SmF4YkNvcmVNZXNzYWdlcy5YTUxfVFlQRV9ERVNDOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZXNwYWNlKCkgewotCQkJcmV0dXJuIFhtbFNjaGVtYVR5cGUuREVGQVVMVF9OQU1FU1BBQ0U7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXROYW1lc3BhY2VQcm9wb3NhbHMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQlYc2RTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXRYc2RTY2hlbWEoKTsKLQkJCWlmIChzY2hlbWEgPT0gbnVsbCkgewotCQkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc2NoZW1hLmdldE5hbWVzcGFjZVByb3Bvc2FscyhmaWx0ZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0TmFtZVByb3Bvc2FscyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCVhzZFNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldFhzZFNjaGVtYSgpOwotCQkJaWYgKHNjaGVtYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJCX0KLQkJCXJldHVybiBzY2hlbWEuZ2V0U2ltcGxlVHlwZU5hbWVQcm9wb3NhbHMoZ2V0TmFtZXNwYWNlKCksIGZpbHRlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVJlZmVyZW5jZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JCQlTdHJpbmcgbmFtZXNwYWNlID0gZ2V0TmFtZXNwYWNlKCk7Ci0JCQkKLQkJCWlmICghIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkobmFtZSkpIHsKLQkJCQlYc2RTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXRYc2RTY2hlbWEoKTsKLQkJCQkKLQkJCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCQkJWHNkVHlwZURlZmluaXRpb24gc2NoZW1hVHlwZSA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbihuYW1lc3BhY2UsIG5hbWUpOwotCQkJCQlpZiAoc2NoZW1hVHlwZSA9PSBudWxsKSB7Ci0JCQkJCQltZXNzYWdlcy5hZGQoZ2V0VW5yZXNvbHZlU2NoZW1hQ29tcG9uZW50TWVzc2FnZShhc3RSb290KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFFOYW1lQW5ub3RhdGlvblByb3h5IAotCQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFRTmFtZS5BYnN0cmFjdFFOYW1lQW5ub3RhdGlvblByb3h5IHsKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgUU5hbWVBbm5vdGF0aW9uIGdldEFubm90YXRpb24oYm9vbGVhbiBjcmVhdGVJZk51bGwpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbFNjaGVtYVR5cGUudGhpcy5hbm5vdGF0aW9uOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sU2VlQWxzby5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sU2VlQWxzby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDIxNmFhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFNlZUFsc28uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sU2VlQWxzbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sU2VlQWxzb0Fubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVhtbFNlZUFsc28KLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZQotCQlpbXBsZW1lbnRzIFhtbFNlZUFsc28gewotCQotCXByb3RlY3RlZCBmaW5hbCBYbWxTZWVBbHNvQW5ub3RhdGlvbiBhbm5vdGF0aW9uOwotCQotCXByb3RlY3RlZCBmaW5hbCBMaXN0Q29udGFpbmVyPFN0cmluZywgU3RyaW5nPiB2YWx1ZUNvbnRhaW5lcjsKLQkKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxTZWVBbHNvKEpheGJUeXBlTWFwcGluZyBwYXJlbnQsIFhtbFNlZUFsc29Bbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5hbm5vdGF0aW9uID0gYW5ub3RhdGlvbjsKLQkJdGhpcy52YWx1ZUNvbnRhaW5lciA9IHRoaXMuYnVpbGRWYWx1ZUNvbnRhaW5lcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMudmFsdWVDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2xhc3NlcygpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0Q2xhc3Nlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkQ2xhc3MoaW50IGluZGV4LCBTdHJpbmcgY2xhenopIHsKLQkJdGhpcy5hbm5vdGF0aW9uLmFkZENsYXNzKGluZGV4LCBjbGF6eik7Ci0JCXRoaXMudmFsdWVDb250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIGNsYXp6KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2xhc3MoaW50IGluZGV4KSB7Ci0JCXRoaXMuYW5ub3RhdGlvbi5yZW1vdmVDbGFzcyhpbmRleCk7Ci0JCXRoaXMudmFsdWVDb250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlQ2xhc3MoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5hbm5vdGF0aW9uLm1vdmVDbGFzcyh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLnZhbHVlQ29udGFpbmVyLm1vdmVDb250ZXh0RWxlbWVudCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NlcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0Q29udGFpbmVyPFN0cmluZywgU3RyaW5nPiBidWlsZFZhbHVlQ29udGFpbmVyKCkgewotCQlWYWx1ZUNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgVmFsdWVDb250YWluZXIoKTsKLQkJY29udGFpbmVyLmluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFZhbHVlQ29udGFpbmVyCi0JCQlleHRlbmRzIExpc3RDb250YWluZXI8U3RyaW5nLCBTdHJpbmc+IHsKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBDTEFTU0VTX0xJU1Q7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkQ29udGV4dEVsZW1lbnQoU3RyaW5nIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIHJlc291cmNlRWxlbWVudDsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sU2VlQWxzby50aGlzLmFubm90YXRpb24uZ2V0Q2xhc3NlcygpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUVsZW1lbnQoU3RyaW5nIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxUcmFuc2llbnRNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxUcmFuc2llbnRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMjNmNGUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sVHJhbnNpZW50TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxUcmFuc2llbnRBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxUcmFuc2llbnRNYXBwaW5nCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzxYbWxUcmFuc2llbnRBbm5vdGF0aW9uPiB7Ci0JCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sVHJhbnNpZW50TWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlhNTF9UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9UUkFOU0lFTlQ7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVHJhbnNpZW50KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxWYWx1ZU1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFZhbHVlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTM1MmY0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFZhbHVlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sVmFsdWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KYXhiVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxWYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sVmFsdWVNYXBwaW5nCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhWG1sTm9kZU1hcHBpbmc8WG1sVmFsdWVBbm5vdGF0aW9uPgotCQlpbXBsZW1lbnRzIFhtbFZhbHVlTWFwcGluZyB7Ci0JCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sVmFsdWVNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlhNTF9WQUxVRV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9WQUxVRTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sTGlzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGNhbGN1bGF0ZURlZmF1bHRYbWxMaXN0KCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzSmF2YVJlc291cmNlQXR0cmlidXRlQ29sbGVjdGlvblR5cGUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQl2YWxpZGF0ZVNjaGVtYVR5cGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVTY2hlbWFUeXBlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVhzZFR5cGVEZWZpbml0aW9uIHhzZENsYXNzVHlwZSA9IGdldENsYXNzTWFwcGluZygpLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCQotCQlpZiAoeHNkQ2xhc3NUeXBlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKCEgeHNkQ2xhc3NUeXBlLmhhc1RleHRDb250ZW50KCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9WQUxVRV9fTk9fVEVYVF9DT05URU5ULAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlYc2RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlID0geHNkQ2xhc3NUeXBlLmdldEJhc2VUeXBlKCk7Ci0JCVhzZFR5cGVEZWZpbml0aW9uIGV4cGVjdGVkU2NoZW1hVHlwZSA9IGdldERhdGFUeXBlWHNkVHlwZURlZmluaXRpb24oKTsKLQkJCi0JCWlmICh4c2RUeXBlID09IG51bGwgfHwgZXhwZWN0ZWRTY2hlbWFUeXBlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKCEgeHNkVHlwZS50eXBlSXNWYWxpZChleHBlY3RlZFNjaGVtYVR5cGUsIGlzWG1sTGlzdCgpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1ZBTFVFX19JTlZBTElEX1NDSEVNQV9UWVBFLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IGdldFZhbHVlVHlwZU5hbWUoKSB9LAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGIzYzRlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotCi1wdWJsaWMgY2xhc3MgSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQluZXcgSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0geyAKLQkJCUpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSIH07Ci0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByb3RlY3RlZCBKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlhNTF9BTllfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfQU5ZX0FUVFJJQlVURTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhYmxlPFN0cmluZz4oU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTKTsKLQl9Ci0KLQlwdWJsaWMgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSmF4YkZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxBbnlFbGVtZW50TWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhWG1sQW55RWxlbWVudE1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZGI1MGMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxBbnlFbGVtZW50TWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotCi1wdWJsaWMgY2xhc3MgSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCW5ldyBKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gewotCQlKQVhCLlhNTF9FTEVNRU5UX1JFRiwKLQkJSkFYQi5YTUxfRUxFTUVOVF9SRUZTLAotCQlKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIsCi0JCUpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSLAotCQlKQVhCLlhNTF9NSVhFRCB9OwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJvdGVjdGVkIEphdmFYbWxBbnlFbGVtZW50TWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuWE1MX0FOWV9FTEVNRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0FOWV9FTEVNRU5UOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhYmxlPFN0cmluZz4oU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTKTsKLQl9Ci0JCi0JcHVibGljIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEpheGJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZTIxYmYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0KLXB1YmxpYyBjbGFzcyBKYXZhWG1sQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCW5ldyBKYXZhWG1sQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24oKTsKLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSB7Ci0JCQlKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRiwKLQkJCUpBWEIuWE1MX0lELAotCQkJSkFYQi5YTUxfSURSRUYsCi0JCQlKQVhCLlhNTF9JTkxJTkVfQklOQVJZX0RBVEEsCi0JCQlKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUiwKLQkJCUpBWEIuWE1MX0xJU1QsCi0JCQlKQVhCLlhNTF9NSU1FX1RZUEUsCi0JCQlKQVhCLlhNTF9TQ0hFTUFfVFlQRSB9OwotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5YTUxfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfQVRUUklCVVRFOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmFibGU8U3RyaW5nPihTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMpOwotCX0KLQotCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKYXhiRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVhtbEVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxFbGVtZW50TWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ3YjJjOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVhtbEVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotCi1wdWJsaWMgY2xhc3MgSmF2YVhtbEVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi0JCWltcGxlbWVudHMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVhtbEVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEphdmFYbWxFbGVtZW50TWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSAKLQkJCXsKLQkJCQlKQVhCLlhNTF9JRCwKLQkJCQlKQVhCLlhNTF9JRFJFRiwKLQkJCQlKQVhCLlhNTF9MSVNULAotCQkJCUpBWEIuWE1MX1NDSEVNQV9UWVBFLAotCQkJCUpBWEIuWE1MX0FUVEFDSE1FTlRfUkVGLAotCQkJCUpBWEIuWE1MX01JTUVfVFlQRSwKLQkJCQlKQVhCLlhNTF9JTkxJTkVfQklOQVJZX0RBVEEsCi0JCQkJSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSLAotCQkJCUpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSIH07Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJvdGVjdGVkIEphdmFYbWxFbGVtZW50TWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuWE1MX0VMRU1FTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVDsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYWJsZTxTdHJpbmc+KFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyk7Ci0JfQotCQotCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKYXhiRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YVhtbEVsZW1lbnRNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCS8qKgotCSAqIEZyb20gdGhlIEpBWEIgc3BlYyBzZWN0aW9uIDguMTIuNS4xIERlZmF1bHQgTWFwcGluZzoKLQkgKiA8cD4KLQkgKiBBIHNpbmdsZSB2YWx1ZWQgcHJvcGVydHkgb3IgZmllbGQgbXVzdCBiZSBtYXBwZWQgYnkgd2l0aCB0aGUgZm9sbG93aW5nIGRlZmF1bHQgbWFwcGluZyBhbm5vdGF0aW9uOjx1bD4KLQkgKiA8bGk+IEBYbWxFbGVtZW50Ci0JICogPC91bD4KLQkgKiA8cD4KLQkgKiBBIHByb3BlcnR5IG9yIGZpZWxkIHdpdGggYSBjb2xsZWN0aW9uIHR5cGUgbXVzdCBiZSBtYXBwZWQgYnkgd2l0aCB0aGUgZm9sbG93aW5nIGRlZmF1bHQgbWFwcGluZyBhbm5vdGF0aW9uOjx1bD4KLQkgKiA8bGk+IGlmIHRoZSBwcm9wZXJ0eSBvciBmaWVsZCBpcyBhbm5vdGF0ZWQgd2l0aCBAWG1sTGlzdCwgdGhlbiB0aGUgZGVmYXVsdCBtYXBwaW5nIGFubm90YXRpb24gaXM6PHVsPgotCSAqIDxsaT4gQFhtbEVsZW1lbnQKLQkgKiA8L3VsPgotCSAqIDxsaT4gb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IG1hcHBpbmcgYW5ub3RhdGlvbiBpczo8dWw+Ci0JICogPGxpPiBAWG1sRWxlbWVudHMoeyBAWG1sRWxlbWVudChuaWxsYWJsZT10cnVlKX0pICAKLQkgKiAJCQkoTkI6ICB0aGlzIGFjdHVhbGx5IG1lYW5zIHRoZSBzYW1lIGFzCi0JICogICAgICAJCUBYbWxFbGVtZW50KG5pbGxhYmxlPXRydWUpCi0JICogICAgICAJKQotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhWG1sRWxlbWVudFJlZk1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMzlmNWYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotCi1wdWJsaWMgY2xhc3MgSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nRGVmaW5pdGlvbgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJvdGVjdGVkIEphdmFYbWxFbGVtZW50UmVmTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuWE1MX0VMRU1FTlRfUkVGX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0VMRU1FTlRfUkVGOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhYmxlPFN0cmluZz4oIG5ldyBTdHJpbmdbXSB7Ci0JCQkJSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSLAotCQkJCUpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSLAotCQkJCUpBWEIuWE1MX01JWEVEIH0pOwotCX0KLQkKLQlwdWJsaWMgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSmF4YkZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFYbWxFbGVtZW50UmVmTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOWJiZTMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLQotcHVibGljIGNsYXNzIEphdmFYbWxFbGVtZW50UmVmc01hcHBpbmdEZWZpbml0aW9uCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJvdGVjdGVkIEphdmFYbWxFbGVtZW50UmVmc01hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UX1JFRlNfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVF9SRUZTOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhYmxlPFN0cmluZz4oIG5ldyBTdHJpbmdbXSB7Ci0JCQkJSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSLAotCQkJCUpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSLAotCQkJCUpBWEIuWE1MX01JWEVEIH0pOwotCX0KLQkKLQlwdWJsaWMgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSmF4YkZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFYbWxFbGVtZW50UmVmc01hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVhtbEVsZW1lbnRzTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhWG1sRWxlbWVudHNNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGE4NmQ3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhWG1sRWxlbWVudHNNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0KLXB1YmxpYyBjbGFzcyBKYXZhWG1sRWxlbWVudHNNYXBwaW5nRGVmaW5pdGlvbgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgCi0JCQk9IG5ldyBKYXZhWG1sRWxlbWVudHNNYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJvdGVjdGVkIEphdmFYbWxFbGVtZW50c01hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UU19BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9FTEVNRU5UUzsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYWJsZTxTdHJpbmc+KCBuZXcgU3RyaW5nW10gewotCQkJCUpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUiwKLQkJCQlKQVhCLlhNTF9JRFJFRiwKLQkJCQlKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUiB9KTsKLQl9Ci0JCi0JcHVibGljIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEpheGJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhWG1sRWxlbWVudHNNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzgyN2VmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhWG1sVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0KLXB1YmxpYyBjbGFzcyBKYXZhWG1sVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24KLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVhtbFRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCW5ldyBKYXZhWG1sVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByb3RlY3RlZCBKYXZhWG1sVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuWE1MX1RSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9UUkFOU0lFTlQ7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKYXhiRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YVhtbFRyYW5zaWVudE1hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVhtbFZhbHVlTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhWG1sVmFsdWVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDI2YWU0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhWG1sVmFsdWVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0KLXB1YmxpYyBjbGFzcyBKYXZhWG1sVmFsdWVNYXBwaW5nRGVmaW5pdGlvbgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhWG1sVmFsdWVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQluZXcgSmF2YVhtbFZhbHVlTWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSAKLQkJCXsKLQkJCQlKQVhCLlhNTF9MSVNULAotCQkJCUpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSLAotCQkJCUpBWEIuWE1MX1NDSEVNQV9UWVBFIH07Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVhtbFZhbHVlTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuWE1MX1ZBTFVFX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX1ZBTFVFOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhYmxlPFN0cmluZz4oU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTKTsKLQl9Ci0JCi0JcHVibGljIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEpheGJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhWG1sVmFsdWVNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL1Byb3BlcnR5QWNjZXNzb3IuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9Qcm9wZXJ0eUFjY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNTk1MDYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL1Byb3BlcnR5QWNjZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5BY2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLQotcHVibGljIGNsYXNzIFByb3BlcnR5QWNjZXNzb3IKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZQotCQlpbXBsZW1lbnRzIEFjY2Vzc29yIHsKLQotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZUdldHRlcjsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VTZXR0ZXI7Ci0KLQlwdWJsaWMgUHJvcGVydHlBY2Nlc3NvcihKYXhiQ2xhc3NNYXBwaW5nIHBhcmVudCwgSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlR2V0dGVyLCBKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VTZXR0ZXIpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5yZXNvdXJjZUdldHRlciA9IHJlc291cmNlR2V0dGVyOwotCQl0aGlzLnJlc291cmNlU2V0dGVyID0gcmVzb3VyY2VTZXR0ZXI7Ci0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZUF0dHJpYnV0ZSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmNhbGN1bGF0ZVJlc291cmNlTWV0aG9kVG9Bbm5vdGF0ZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZUJhc2VUeXBlTmFtZSgpIHsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIGdldHRlck1ldGhvZCA9IGdldFJlc291cmNlR2V0dGVyTWV0aG9kKCk7Ci0JCS8vaXQncyBpbnZhbGlkIHRvIGhhdmUgYSBzZXR0ZXIgd2l0aG91dCBhIGdldHRlciwgc28ganVzdCByZXR1cm4gbnVsbCBpbiB0aGlzIGNhc2UKLQkJLy9yYXRoZXIgdGhhbiBhdHRlbXB0aW5nIHRvIGRlZmluZSB0aGUgdHlwZSBmcm9tIHRoZSBzZXR0ZXIncyBwYXJhbWV0ZXJzCi0JCXJldHVybiBnZXR0ZXJNZXRob2QgPT0gbnVsbCA/IG51bGwgOiBBY2Nlc3NvclRvb2xzLmdldEJhc2VUeXBlTmFtZShnZXR0ZXJNZXRob2QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0phdmFSZXNvdXJjZUF0dHJpYnV0ZUNvbGxlY3Rpb25UeXBlKCkgewotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgZ2V0dGVyTWV0aG9kID0gZ2V0UmVzb3VyY2VHZXR0ZXJNZXRob2QoKTsKLQkJLy9pdCdzIGludmFsaWQgdG8gaGF2ZSBhIHNldHRlciB3aXRob3V0IGEgZ2V0dGVyLCBzbyBqdXN0IHJldHVybiBmYWxzZSBpbiB0aGlzIGNhc2UKLQkJLy9yYXRoZXIgdGhhbiBhdHRlbXB0aW5nIHRvIHVzZSB0aGUgc2V0dGVyJ3MgcGFyYW1ldGVycwotCQlyZXR1cm4gZ2V0dGVyTWV0aG9kID09IG51bGwgPyBmYWxzZSA6IEFjY2Vzc29yVG9vbHMuaXNDb2xsZWN0aW9uVHlwZShnZXR0ZXJNZXRob2QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSmF2YVJlc291cmNlQXR0cmlidXRlVHlwZVN1YlR5cGVPZihTdHJpbmcgdHlwZU5hbWUpIHsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIGdldHRlck1ldGhvZCA9IGdldFJlc291cmNlR2V0dGVyTWV0aG9kKCk7Ci0JCS8vaXQncyBpbnZhbGlkIHRvIGhhdmUgYSBzZXR0ZXIgd2l0aG91dCBhIGdldHRlciwgc28ganVzdCByZXR1cm4gZmFsc2UgaW4gdGhpcyBjYXNlCi0JCS8vcmF0aGVyIHRoYW4gYXR0ZW1wdGluZyB0byB1c2UgdGhlIHNldHRlcidzIHBhcmFtZXRlcnMKLQkJcmV0dXJuIGdldHRlck1ldGhvZCA9PSBudWxsID8gZmFsc2UgOiBnZXR0ZXJNZXRob2QudHlwZUlzU3ViVHlwZU9mKHR5cGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlTWV0aG9kIGdldFJlc291cmNlR2V0dGVyTWV0aG9kKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUdldHRlcjsKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlTWV0aG9kIGdldFJlc291cmNlU2V0dGVyTWV0aG9kKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVNldHRlcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihKYXZhUmVzb3VyY2VNZXRob2QgZ2V0dGVyTWV0aG9kLCBKYXZhUmVzb3VyY2VNZXRob2Qgc2V0dGVyTWV0aG9kKSB7Ci0JCXJldHVybiAodGhpcy5yZXNvdXJjZUdldHRlciA9PSBnZXR0ZXJNZXRob2QpICYmICh0aGlzLnJlc291cmNlU2V0dGVyID09IHNldHRlck1ldGhvZCk7Ci0JfQotCi0JLy9zaW5jZSB0aGlzIGlzIGJhc2VkIG9uIGEgcHJlZmVyZW5jZSBhcyB3ZWxsIGFzIGFubm90YXRpb24gbG9jYXRpb24KLQkvL3dlIHdpbGwganVzdCBjYWxjdWxhdGUgaXQgaW5zdGVhZCBvZiBoYW5kbGluZyBpdCBpbiBzeW5jIGFuZCBzdG9yaW5nIGl0LgotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VNZXRob2QgY2FsY3VsYXRlUmVzb3VyY2VNZXRob2RUb0Fubm90YXRlKCkgewotCQlpZiAoZ2V0dGVySXNBbm5vdGF0ZWQoKSkgewotCQkJaWYgKHNldHRlcklzQW5ub3RhdGVkKCkpIHsKLQkJCQkvL3VzZSBwcmVmZXJlbmNlIGZvciB3aGljaCBvbmUgdG8gc2V0IHRoZSBwcmltYXJ5IGFubm90YXRpb24gb24uCi0JCQkJcmV0dXJuIGdldEFubm90YXRlR2V0dGVyUHJlZmVyZW5jZSgpID8gdGhpcy5yZXNvdXJjZUdldHRlciA6IHRoaXMucmVzb3VyY2VTZXR0ZXI7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUdldHRlcjsKLQkJfQotCQllbHNlIGlmIChzZXR0ZXJJc0Fubm90YXRlZCgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVNldHRlcjsKLQkJfQotCQllbHNlIGlmIChnZXRBbm5vdGF0ZUdldHRlclByZWZlcmVuY2UoKSYmIHRoaXMucmVzb3VyY2VHZXR0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMucmVzb3VyY2VHZXR0ZXI7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VTZXR0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0dGVySXNBbm5vdGF0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlR2V0dGVyID09IG51bGwgPyBmYWxzZSA6IHRoaXMucmVzb3VyY2VHZXR0ZXIuaXNBbm5vdGF0ZWQoKTsgCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZXR0ZXJJc0Fubm90YXRlZCgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VTZXR0ZXIgPT0gbnVsbCA/IGZhbHNlIDogdGhpcy5yZXNvdXJjZVNldHRlci5pc0Fubm90YXRlZCgpOyAKLQl9Ci0KLQkvL1RPRE8gYnVnIDMzMzQ4MyAtIG1ha2UgdGhpcyBhIHByZWZlcmVuY2UgZm9yIHRoZSB1c2VyIHRvIHNlbGVjdCB3aGV0aGVyIHRoZSBnZXR0ZXIgb3Igc2V0dGVyIHNob3VsZCBiZSBhbm5vdGF0ZWQuCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0QW5ub3RhdGVHZXR0ZXJQcmVmZXJlbmNlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvL1RPRE8gdmFsaWRhdGlvbiAtIGJ1ZyAzMzM0ODQKLQkvL2lmIChnZXR0ZXJJc0Fubm90YXRlZCgpICYmIHNldHRlcklzQW5ub3RhdGVkKCkpIGVycm9yIHRvIHVzZXIKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWQyYTVmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2ZhY2V0L0pheGJGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3BlcnRpZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YkZhY2V0RGF0YU1vZGVsUHJvcGVydGllcwotCQlleHRlbmRzIElEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQkKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF8gCi0JCQk9IEpheGJGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi4iOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk0KLQkJCT0gUFJFRklYXyArICJQTEFURk9STSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJSQVJZX0lOU1RBTExfREVMRUdBVEUKLQkJCT0gUFJFRklYXyArICJMSUJSQVJZX0lOU1RBTExfREVMRUdBVEUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9mYWNldC9KYXhiRmFjZXREYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFhMmI2Yi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9mYWNldC9KYXhiRmFjZXREYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5mYWNldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5KcHRKYXhiQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUubGlicHJvdi5KYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuSUxpYnJhcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTGlicmFyeUluc3RhbGxEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LkxpYnJhcnlQcm92aWRlck9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXhiRmFjZXREYXRhTW9kZWxQcm92aWRlcgotCQlleHRlbmRzIEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIAotCQlpbXBsZW1lbnRzIEpheGJGYWNldERhdGFNb2RlbFByb3BlcnRpZXMgewotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gRU1QVFlfRE1QRF9BUlJBWSA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbMF07Ci0JCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcj4gRE1QRF9DT01QQVJBVE9SID0KLQkJCW5ldyBDb21wYXJhdG9yPERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcj4oKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBkbXBkMSwgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGRtcGQyKSB7Ci0JCQkJCXJldHVybiBkbXBkMS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkuY29tcGFyZVRvKGRtcGQyLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKSk7Ci0JCQkJfQotCQkJfTsKLQkKLQkKLQkKLQkvLyBsaXN0ZW5zIHRvIHByaW1hcnkgcnVudGltZSBjaGFuZ2luZwotCXByaXZhdGUgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgZnByb2pMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIExpYnJhcnlJbnN0YWxsRGVsZWdhdGUgZGVmYXVsdExpYnJhcnlJbnN0YWxsRGVsZWdhdGU7Ci0JCi0JCi0JcHJvdGVjdGVkIEpheGJGYWNldERhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmZwcm9qTGlzdGVuZXIgPSBidWlsZEZwcm9qTGlzdGVuZXIoKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGJ1aWxkRnByb2pMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJRmFjZXRlZFByb2plY3RMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkJZ2V0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpLnJlZnJlc2goKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgbmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCW5hbWVzLmFkZChQTEFURk9STSk7Ci0JCW5hbWVzLmFkZChMSUJSQVJZX0lOU1RBTExfREVMRUdBVEUpOwotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRkFDRVRfSUQpKSB7Ci0JCQlyZXR1cm4gSmF4YkZhY2V0LklEOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUExBVEZPUk0pKSB7Ci0JCQlyZXR1cm4gZ2V0RGVmYXVsdFBsYXRmb3JtKCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMSUJSQVJZX0lOU1RBTExfREVMRUdBVEUpKSB7Ci0JCQlyZXR1cm4gZ2V0RGVmYXVsdExpYnJhcnlJbnN0YWxsRGVsZWdhdGUoKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0RGVmYXVsdFBsYXRmb3JtKCkgewotCQlyZXR1cm4gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0RGVmYXVsdFBsYXRmb3JtKGdldFByb2plY3RGYWNldFZlcnNpb24oKSk7Ci0JfQotCQotCXByb3RlY3RlZCBMaWJyYXJ5SW5zdGFsbERlbGVnYXRlIGdldERlZmF1bHRMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKCkgewotCQkvLyBkZWxlZ2F0ZSBpdHNlbGYgY2hhbmdlcyBvbmx5IHdoZW4gZmFjZXQgdmVyc2lvbiBjaGFuZ2VzCi0JCWlmICh0aGlzLmRlZmF1bHRMaWJyYXJ5SW5zdGFsbERlbGVnYXRlID09IG51bGwpIHsKLQkJCXRoaXMuZGVmYXVsdExpYnJhcnlJbnN0YWxsRGVsZWdhdGUgPSBidWlsZERlZmF1bHRMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKCk7Ci0JCX0KLQkJZWxzZSBpZiAoISB0aGlzLmRlZmF1bHRMaWJyYXJ5SW5zdGFsbERlbGVnYXRlLmdldFByb2plY3RGYWNldFZlcnNpb24oKS5lcXVhbHMoZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpKSkgewotCQkJdGhpcy5kZWZhdWx0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZS5kaXNwb3NlKCk7Ci0JCQl0aGlzLmRlZmF1bHRMaWJyYXJ5SW5zdGFsbERlbGVnYXRlID0gYnVpbGREZWZhdWx0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpYnJhcnlJbnN0YWxsRGVsZWdhdGUgYnVpbGREZWZhdWx0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpIHsKLQkJSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MgPSBnZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCk7Ci0JCUlQcm9qZWN0RmFjZXRWZXJzaW9uIHBmdiA9IGdldFByb2plY3RGYWNldFZlcnNpb24oKTsKLQkJaWYgKGZwandjID09IG51bGwgfHwgcGZ2ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUxpYnJhcnlJbnN0YWxsRGVsZWdhdGUgbGlkID0gbmV3IExpYnJhcnlJbnN0YWxsRGVsZWdhdGUoZnBqd2MsIHBmdik7Ci0JCWxpZC5hZGRMaXN0ZW5lcihidWlsZExpYnJhcnlJbnN0YWxsRGVsZWdhdGVMaXN0ZW5lcigpKTsKLQkJcmV0dXJuIGxpZDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTGlicmFyeUluc3RhbGxEZWxlZ2F0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHksIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlICkgewotCQkJCQlpZiAoTGlicmFyeUluc3RhbGxEZWxlZ2F0ZS5QUk9QX0FWQUlMQUJMRV9QUk9WSURFUlMuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJCQkJYWRqdXN0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpOwotCQkJCQl9Ci0JCQkJCWdldERhdGFNb2RlbCgpLm5vdGlmeVByb3BlcnR5Q2hhbmdlKExJQlJBUllfSU5TVEFMTF9ERUxFR0FURSwgSURhdGFNb2RlbC5WQUxVRV9DSEcpOwotCQkJCX0KLQkJCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkanVzdExpYnJhcnlJbnN0YWxsRGVsZWdhdGUoKSB7Ci0JCUxpYnJhcnlJbnN0YWxsRGVsZWdhdGUgbGlkID0gdGhpcy5nZXRMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKCk7Ci0JCWlmIChsaWQgIT0gbnVsbCkgewotCQkJTGlzdDxKYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZz4gamF4YkNvbmZpZ3MgCi0JCQkJCT0gbmV3IEFycmF5TGlzdDxKYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZz4oKTsKLQkJCS8vIGFkZCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9uZSBmaXJzdAotCQkJSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY3VycmVudEpheGJDb25maWcgPSBudWxsOwotCQkJTGlicmFyeVByb3ZpZGVyT3BlcmF0aW9uQ29uZmlnIGNvbmZpZyA9IGxpZC5nZXRMaWJyYXJ5UHJvdmlkZXJPcGVyYXRpb25Db25maWcoKTsKLQkJCWlmIChjb25maWcgaW5zdGFuY2VvZiBKYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZykgewotCQkJCWN1cnJlbnRKYXhiQ29uZmlnID0gKEpheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnKSBjb25maWc7Ci0JCQkJamF4YkNvbmZpZ3MuYWRkKGN1cnJlbnRKYXhiQ29uZmlnKTsKLQkJCX0KLQkJCWZvciAoSUxpYnJhcnlQcm92aWRlciBscCA6IGxpZC5nZXRMaWJyYXJ5UHJvdmlkZXJzKCkpIHsKLQkJCQljb25maWcgPSBsaWQuZ2V0TGlicmFyeVByb3ZpZGVyT3BlcmF0aW9uQ29uZmlnKGxwKTsKLQkJCQlpZiAoY29uZmlnIGluc3RhbmNlb2YgSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcKLQkJCQkJCSYmICEgY29uZmlnLmVxdWFscyhjdXJyZW50SmF4YkNvbmZpZykpIHsKLQkJCQkJamF4YkNvbmZpZ3MuYWRkKChKYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZykgY29uZmlnKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKEpheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGpheGJDb25maWcgOiBqYXhiQ29uZmlncykgewotCQkJCWpheGJDb25maWcuc2V0SmF4YlBsYXRmb3JtKGdldFBsYXRmb3JtKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWJvb2xlYW4gb2sgPSBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQkKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSkpIHsKLQkJCS8vIHNob3VsZCBvbmx5IGJlIGRvbmUgb25jZQotCQkJSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnByb2ogPSAoSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkpIHByb3BlcnR5VmFsdWU7Ci0JCQlmcHJvai5hZGRMaXN0ZW5lcih0aGlzLmZwcm9qTGlzdGVuZXIsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJJTUFSWV9SVU5USU1FX0NIQU5HRUQpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRkFDRVRfVkVSU0lPTikpIHsKLQkJCWFkanVzdExpYnJhcnlJbnN0YWxsRGVsZWdhdGUoKTsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoUExBVEZPUk0sIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShMSUJSQVJZX0lOU1RBTExfREVMRUdBVEUsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUExBVEZPUk0pKSB7Ci0JCQlhZGp1c3RMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBvazsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBMQVRGT1JNKSkgewotCQkJcmV0dXJuIHRoaXMuYnVpbGRWYWxpZFBsYXRmb3JtRGVzY3JpcHRvcnMoKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gYnVpbGRWYWxpZFBsYXRmb3JtRGVzY3JpcHRvcnMoKSB7Ci0JCUl0ZXJhYmxlPEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uPiB2YWxpZFBsYXRmb3JtRGVzY3JpcHRpb25zID0gYnVpbGRWYWxpZFBsYXRmb3JtRGVzY3JpcHRpb25zKCk7Ci0JCUl0ZXJhYmxlPERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcj4gdmFsaWRQbGF0Zm9ybURlc2NyaXB0b3JzID0KLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiwgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yPih2YWxpZFBsYXRmb3JtRGVzY3JpcHRpb25zKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIHRyYW5zZm9ybShKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQkJCQkJcmV0dXJuIGJ1aWxkUGxhdGZvcm1EZXNjcmlwdG9yKGRlc2NyaXB0aW9uKTsKLQkJCQkJfQotCQkJCX07Ci0JCXJldHVybiBBcnJheVRvb2xzLnNvcnQoQXJyYXlUb29scy5hcnJheSh2YWxpZFBsYXRmb3JtRGVzY3JpcHRvcnMsIEVNUFRZX0RNUERfQVJSQVkpLCBETVBEX0NPTVBBUkFUT1IpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF4YlBsYXRmb3JtRGVzY3JpcHRpb24+IGJ1aWxkVmFsaWRQbGF0Zm9ybURlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbj4oCi0JCQkJSnB0SmF4YkNvcmVQbHVnaW4uZ2V0SmF4YlBsYXRmb3JtTWFuYWdlcigpLmdldEpheGJQbGF0Zm9ybXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gbykgewotCQkJCXJldHVybiBvLnN1cHBvcnRzSmF4YkZhY2V0VmVyc2lvbihnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBMQVRGT1JNKSkgewotCQkJcmV0dXJuIGJ1aWxkUGxhdGZvcm1EZXNjcmlwdG9yKGdldFBsYXRmb3JtKCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgYnVpbGRQbGF0Zm9ybURlc2NyaXB0b3IoSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZGVzYykgewotCQlyZXR1cm4gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihkZXNjLCBkZXNjLmdldExhYmVsKCkpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCQotCXByb3RlY3RlZCBzdGF0aWMgSVN0YXR1cyBPS19TVEFUVVMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQotCXByb3RlY3RlZCBzdGF0aWMgSVN0YXR1cyBidWlsZEVycm9yU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBidWlsZFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBtZXNzYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBJU3RhdHVzIGJ1aWxkU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksIEpwdEpheGJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUExBVEZPUk0pKSB7Ci0JCQlyZXR1cm4gdGhpcy52YWxpZGF0ZVBsYXRmb3JtKCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMSUJSQVJZX0lOU1RBTExfREVMRUdBVEUpKSB7Ci0JCQlyZXR1cm4gZ2V0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpLnZhbGlkYXRlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVBsYXRmb3JtKCkgewotCQlyZXR1cm4gKGdldFBsYXRmb3JtKCkgPT0gbnVsbCkgPyAKLQkJCQlidWlsZEVycm9yU3RhdHVzKEpwdEpheGJDb3JlTWVzc2FnZXMuSmF4YkZhY2V0Q29uZmlnX3ZhbGlkYXRlUGxhdGZvcm1Ob3RTcGVjaWZpZWQpIAotCQkJCTogT0tfU1RBVFVTOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZ2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgpIHsKLQkJcmV0dXJuIChJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSkgZ2V0UHJvcGVydHkoRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSk7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gKElQcm9qZWN0RmFjZXRWZXJzaW9uKSBnZXRQcm9wZXJ0eShGQUNFVF9WRVJTSU9OKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGdldFBsYXRmb3JtKCkgewotCQlyZXR1cm4gKEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uKSBnZXRQcm9wZXJ0eShQTEFURk9STSk7Ci0JfQotCQotCXByb3RlY3RlZCBMaWJyYXJ5SW5zdGFsbERlbGVnYXRlIGdldExpYnJhcnlJbnN0YWxsRGVsZWdhdGUoKSB7Ci0JCXJldHVybiAoTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSkgZ2V0UHJvcGVydHkoTElCUkFSWV9JTlNUQUxMX0RFTEVHQVRFKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlnZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCkucmVtb3ZlTGlzdGVuZXIodGhpcy5mcHJvakxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9mYWNldC9KYXhiRmFjZXREZWxlZ2F0ZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0RGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE1YTUxNi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9mYWNldC9KYXhiRmFjZXREZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KcHRKYXhiQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTGlicmFyeUluc3RhbGxEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXhiRmFjZXREZWxlZ2F0ZQotCQlpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgZXhlY3V0ZSgKLQkJCUlQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCAKLQkJCU9iamVjdCBjb25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJdGhpcy5leGVjdXRlXyhwcm9qZWN0LCBmdiwgY29uZmlnLCBtb25pdG9yKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZV8oCi0JCQlJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgCi0JCQlPYmplY3QgY29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCVN1Yk1vbml0b3Igc3ViTW9uaXRvciA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCA3KTsKLQkJCi0JCUlEYXRhTW9kZWwgamF4YkNvbmZpZyA9IChJRGF0YU1vZGVsKSBjb25maWc7Ci0JCQotCQkvLyBwcm9qZWN0IHNldHRpbmdzCi0JCUpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIHBsYXRmb3JtID0KLQkJCQkoSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24pIGpheGJDb25maWcuZ2V0UHJvcGVydHkoSmF4YkZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5QTEFURk9STSk7Ci0JCUpwdEpheGJDb3JlUGx1Z2luLnNldEpheGJQbGF0Zm9ybShwcm9qZWN0LCBwbGF0Zm9ybSk7Ci0JCXN1Yk1vbml0b3Iud29ya2VkKDEpOwotCQkKLQkJLy8gZGVmYXVsdHMgc2V0dGluZ3MKLQkJSnB0SmF4YkNvcmVQbHVnaW4uc2V0RGVmYXVsdEpheGJQbGF0Zm9ybShmdiwgcGxhdGZvcm0pOwotCQlzdWJNb25pdG9yLndvcmtlZCgxKTsKLQkJCi0JCS8vRGVsZWdhdGUgdG8gTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSB0byBjb25maWd1cmUgdGhlIHByb2plY3QgY2xhc3NwYXRoCi0JCUxpYnJhcnlJbnN0YWxsRGVsZWdhdGUgbGlkID0gCi0JCQkJKExpYnJhcnlJbnN0YWxsRGVsZWdhdGUpIGpheGJDb25maWcuZ2V0UHJvcGVydHkoSmF4YkZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5MSUJSQVJZX0lOU1RBTExfREVMRUdBVEUpOwotCQlsaWQuZXhlY3V0ZShzdWJNb25pdG9yLm5ld0NoaWxkKDEpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9mYWNldC9KYXhiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFjNDI2Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9mYWNldC9KYXhiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmZhY2V0OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgCi0JCWV4dGVuZHMgSmF4YkZhY2V0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9mYWNldC9KYXhiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2ZhY2V0L0pheGJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjVkOTgyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2ZhY2V0L0pheGJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmZhY2V0OwotCi0KLXB1YmxpYyBjbGFzcyBKYXhiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIKLQkJZXh0ZW5kcyBKYXhiRmFjZXREYXRhTW9kZWxQcm92aWRlciAKLQkJaW1wbGVtZW50cyBKYXhiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JCi0JcHVibGljIEpheGJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJYm9vbGVhbiBvayA9IHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhGQUNFVF9WRVJTSU9OKSkgewotCQkJaWYgKCEgZ2V0UGxhdGZvcm0oKS5zdXBwb3J0c0pheGJGYWNldFZlcnNpb24oZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpKSkgewotCQkJCWdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KFBMQVRGT1JNLCBudWxsKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG9rOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2ZhY2V0L0pheGJGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MjQ4MzIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcms7Ci0KLQotcHVibGljIGNsYXNzIEpheGJGYWNldEluc3RhbGxEZWxlZ2F0ZQotCQlleHRlbmRzIEpheGJGYWNldERlbGVnYXRlIHsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVfKAotCQkJSVByb2plY3QgcHJvamVjdCwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIAotCQkJT2JqZWN0IGNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5hZGRWYWxpZGF0aW9uQnVpbGRlcihwcm9qZWN0KTsKLQkJc3VwZXIuZXhlY3V0ZV8ocHJvamVjdCwgZnYsIGNvbmZpZywgbW9uaXRvcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0VW5pbnN0YWxsRGVsZWdhdGUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2ZhY2V0L0pheGJGYWNldFVuaW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZTFkOWEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0VW5pbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgSmF4YkZhY2V0VW5pbnN0YWxsRGVsZWdhdGUKLQkJaW1wbGVtZW50cyBJRGVsZWdhdGUgewotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2plY3QgcHJvamVjdCwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0JCQlPYmplY3QgY29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0VmVyc2lvbkNoYW5nZURhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2ZhY2V0L0pheGJGYWNldFZlcnNpb25DaGFuZ2VEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YzViMmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0VmVyc2lvbkNoYW5nZURhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5mYWNldDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEpheGJGYWNldFZlcnNpb25DaGFuZ2VEYXRhTW9kZWxQcm9wZXJ0aWVzCi0JCWV4dGVuZHMgSmF4YkZhY2V0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9mYWNldC9KYXhiRmFjZXRWZXJzaW9uQ2hhbmdlRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2ZhY2V0L0pheGJGYWNldFZlcnNpb25DaGFuZ2VEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTc3MmI1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2ZhY2V0L0pheGJGYWNldFZlcnNpb25DaGFuZ2VEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuSnB0SmF4YkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF4YkZhY2V0VmVyc2lvbkNoYW5nZURhdGFNb2RlbFByb3ZpZGVyCi0JCWV4dGVuZHMgSmF4YkZhY2V0RGF0YU1vZGVsUHJvdmlkZXIgCi0JCWltcGxlbWVudHMgSmF4YkZhY2V0VmVyc2lvbkNoYW5nZURhdGFNb2RlbFByb3BlcnRpZXMgewotCQotCXB1YmxpYyBKYXhiRmFjZXRWZXJzaW9uQ2hhbmdlRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbj4gYnVpbGRWYWxpZFBsYXRmb3JtRGVzY3JpcHRpb25zKCkgewotCQkvLyBhZGQgZXhpc3RpbmcgcGxhdGZvcm0gdG8gbGlzdCBvZiBjaG9pY2VzCi0JCUl0ZXJhYmxlPEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uPiB2YWxpZFBsYXRmb3JtRGVzY3MgPSBzdXBlci5idWlsZFZhbGlkUGxhdGZvcm1EZXNjcmlwdGlvbnMoKTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHZhbGlkUGxhdGZvcm1EZXNjcywgZ2V0UGxhdGZvcm0oKSkpIHsKLQkJCXZhbGlkUGxhdGZvcm1EZXNjcyA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZShnZXRQbGF0Zm9ybSgpLCB2YWxpZFBsYXRmb3JtRGVzY3MpOwotCQl9Ci0JCXJldHVybiB2YWxpZFBsYXRmb3JtRGVzY3M7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlUGxhdGZvcm0oKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gc3VwZXIudmFsaWRhdGVQbGF0Zm9ybSgpOwotCQkKLQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCWlmICghIGdldFBsYXRmb3JtKCkuc3VwcG9ydHNKYXhiRmFjZXRWZXJzaW9uKGdldFByb2plY3RGYWNldFZlcnNpb24oKSkpIHsKLQkJCQlzdGF0dXMgPSBidWlsZEVycm9yU3RhdHVzKEpwdEpheGJDb3JlTWVzc2FnZXMuSmF4YkZhY2V0Q29uZmlnX3ZhbGlkYXRlUGxhdGZvcm1Eb2VzTm90U3VwcG9ydEZhY2V0VmVyc2lvbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0VmVyc2lvbkNoYW5nZURlbGVnYXRlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9mYWNldC9KYXhiRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3YTRiYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9mYWNldC9KYXhiRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLQotcHVibGljIGNsYXNzIEpheGJGYWNldFZlcnNpb25DaGFuZ2VEZWxlZ2F0ZQotCQlleHRlbmRzIEpheGJGYWNldERlbGVnYXRlIHsKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlXygKLQkJCUlQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBPYmplY3QgY29uZmlnLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlTdWJNb25pdG9yIHNtID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIDIpOwotCQlzdXBlci5leGVjdXRlXyhwcm9qZWN0LCBmdiwgY29uZmlnLCBzbS5uZXdDaGlsZCgxKSk7Ci0JCQotCQlKcHRKYXhiQ29yZVBsdWdpbi5nZXRQcm9qZWN0TWFuYWdlcigpLnJlYnVpbGRKYXhiUHJvamVjdChwcm9qZWN0KTsKLQkJc20ud29ya2VkKDEpOwotCQkvLyBub3RoaW5nIGZ1cnRoZXIgdG8gZG8gaGVyZSAqanVzdCogeWV0Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZ2VuL0NsYXNzZXNHZW5lcmF0b3IuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2dlbi9DbGFzc2VzR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NjIzMjAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZ2VuL0NsYXNzZXNHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5nZW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwuZ2VuLkFic3RyYWN0SnB0R2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiAgQ2xhc3Nlc0dlbmVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3Nlc0dlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0SnB0R2VuZXJhdG9yCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFVTkNIX0NPTkZJR19OQU1FID0gIkpBWEIgUnVuIENvbmZpZyI7ICAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWEJfR0VORVJJQ19HRU5fQ0xBU1MgPSAiY29tLnN1bi50b29scy54amMuWEpDRmFjYWRlIjsgICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYQl9HRU5FUklDX0dFTl9KREtfQ0xBU1MgPSAiY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuWEpDRmFjYWRlIjsgICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYQl9FQ0xJUFNFTElOS19HRU5fQ0xBU1MgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi54amMuTU9YeVhKQyI7ICAgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHNjaGVtYVBhdGhPclVyaTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBvdXRwdXREaXI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGFyZ2V0UGFja2FnZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBjYXRhbG9nOwotCXByaXZhdGUgZmluYWwgU3RyaW5nW10gYmluZGluZ3NGaWxlTmFtZXM7Ci0JcHJpdmF0ZSBmaW5hbCBDbGFzc2VzR2VuZXJhdG9yT3B0aW9ucyBnZW5lcmF0b3JPcHRpb25zOwotCXByaXZhdGUgZmluYWwgQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMgZ2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9uczsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBtYWluVHlwZTsKLQlwcml2YXRlIFN0cmluZyB0b29sc0phclBhdGg7Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2VuZXJhdGUoCi0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QsIAotCQkJU3RyaW5nIHNjaGVtYVBhdGhPclVyaSwgCi0JCQlTdHJpbmcgb3V0cHV0RGlyLCAKLQkJCVN0cmluZyB0YXJnZXRQYWNrYWdlLCAKLQkJCVN0cmluZyBjYXRhbG9nLCAKLQkJCWJvb2xlYW4gdXNlc01veHlHZW5lcmF0b3IsCi0JCQlTdHJpbmdbXSBiaW5kaW5nc0ZpbGVOYW1lcywKLQkJCUNsYXNzZXNHZW5lcmF0b3JPcHRpb25zIGdlbmVyYXRvck9wdGlvbnMsCi0JCQlDbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucyBnZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJbmV3IENsYXNzZXNHZW5lcmF0b3IoamF2YVByb2plY3QsIAotCQkJc2NoZW1hUGF0aE9yVXJpLCAKLQkJCW91dHB1dERpciwgCi0JCQl0YXJnZXRQYWNrYWdlLCAKLQkJCWNhdGFsb2csIAotCQkJdXNlc01veHlHZW5lcmF0b3IsIAotCQkJYmluZGluZ3NGaWxlTmFtZXMsCi0JCQlnZW5lcmF0b3JPcHRpb25zLCAKLQkJCWdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMpLmdlbmVyYXRlKG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgaWYgdGhlIEpESyBKYXhiIGNvbXBpbGVyIGlzIG9uIHRoZSBjbGFzc3BhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdlbmVyaWNKYXhiSmRrSXNPbkNsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCUlUeXBlIGdlbkNsYXNzID0gamF2YVByb2plY3QuZmluZFR5cGUoSkFYQl9HRU5FUklDX0dFTl9KREtfQ0xBU1MpOwotCQkJcmV0dXJuIChnZW5DbGFzcyAhPSBudWxsKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVzdCBpZiB0aGUgbm9uLUpESyBKYXhiIGNvbXBpbGVyIGlzIG9uIHRoZSBjbGFzc3BhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdlbmVyaWNKYXhiTm9uSmRrSXNPbkNsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCUlUeXBlIGdlbkNsYXNzID0gamF2YVByb2plY3QuZmluZFR5cGUoSkFYQl9HRU5FUklDX0dFTl9DTEFTUyk7Ci0JCQlyZXR1cm4gKGdlbkNsYXNzICE9IG51bGwpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJVk1JbnN0YWxsIGdldFZNSW5zdGFsbChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEphdmFSdW50aW1lLmdldFZNSW5zdGFsbChqYXZhUHJvamVjdCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZNSW5zdGFsbExvY2F0aW9uKElWTUluc3RhbGwgdm0pIHsKLQkJCXJldHVybiB2bS5nZXRJbnN0YWxsTG9jYXRpb24oKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Vk1JbnN0YWxsVG9vbHNKYXJBYnNvbHV0ZVBhdGgoSVZNSW5zdGFsbCB2bSkgewotCQlTdHJpbmcgdm1JbnN0YWxsTG9jYXRpb24gPSBnZXRWTUluc3RhbGxMb2NhdGlvbih2bSk7Ci0JCXJldHVybiB2bUluc3RhbGxMb2NhdGlvbiArIEZpbGUuc2VwYXJhdG9yICsgImxpYiIgKyBGaWxlLnNlcGFyYXRvciArICJ0b29scy5qYXIiOyAgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFRvb2xzSmFyUGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCUlWTUluc3RhbGwgdm0gPSBnZXRWTUluc3RhbGwoamF2YVByb2plY3QpOwotCQkJcmV0dXJuIGdldFZNSW5zdGFsbFRvb2xzSmFyQWJzb2x1dGVQYXRoKHZtKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbmRUb29sc0phclBhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCQlTdHJpbmcgdG9vbHNBYnNvbHV0ZVBhdGggPSBidWlsZFRvb2xzSmFyUGF0aChqYXZhUHJvamVjdCk7Ci0JCQlyZXR1cm4gKChuZXcgRmlsZSh0b29sc0Fic29sdXRlUGF0aCkpLmV4aXN0cygpKSA/IHRvb2xzQWJzb2x1dGVQYXRoIDogbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRvb2xzSmFyRXhpc3RzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlyZXR1cm4gKGZpbmRUb29sc0phclBhdGgoamF2YVByb2plY3QpICE9IG51bGwpOwotCX0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgQ2xhc3Nlc0dlbmVyYXRvcigKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgCi0JCQlTdHJpbmcgc2NoZW1hUGF0aE9yVXJpLCAKLQkJCVN0cmluZyBvdXRwdXREaXIsIAotCQkJU3RyaW5nIHRhcmdldFBhY2thZ2UsIAotCQkJU3RyaW5nIGNhdGFsb2csIAotCQkJYm9vbGVhbiB1c2VzTW94eUdlbmVyYXRvciwgCi0JCQlTdHJpbmdbXSBiaW5kaW5nc0ZpbGVOYW1lcywKLQkJCUNsYXNzZXNHZW5lcmF0b3JPcHRpb25zIGdlbmVyYXRvck9wdGlvbnMsCi0JCQlDbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucyBnZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zKSB7Ci0JCXN1cGVyKGphdmFQcm9qZWN0KTsKLQkJdGhpcy5zY2hlbWFQYXRoT3JVcmkgPSBzY2hlbWFQYXRoT3JVcmk7Ci0JCXRoaXMub3V0cHV0RGlyID0gb3V0cHV0RGlyOwotCQl0aGlzLnRhcmdldFBhY2thZ2UgPSB0YXJnZXRQYWNrYWdlOwotCQl0aGlzLmNhdGFsb2cgPSBjYXRhbG9nOwotCQl0aGlzLmJpbmRpbmdzRmlsZU5hbWVzID0gYmluZGluZ3NGaWxlTmFtZXM7Ci0JCXRoaXMuZ2VuZXJhdG9yT3B0aW9ucyA9IGdlbmVyYXRvck9wdGlvbnM7Ci0JCXRoaXMuZ2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucyA9IGdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnM7Ci0JCQotCQl0aGlzLm1haW5UeXBlID0gdGhpcy5idWlsZE1haW5UeXBlKGphdmFQcm9qZWN0LCB1c2VzTW94eUdlbmVyYXRvcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWFpblR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm1haW5UeXBlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGF1bmNoQ29uZmlnTmFtZSgpIHsKLQkJcmV0dXJuIExBVU5DSF9DT05GSUdfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzcGVjaWZ5SlJFKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwcmVHZW5lcmF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gbm90aGluZyB0byBkbyB5ZXQuLi4KLQl9Ci0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZE1haW5UeXBlKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgYm9vbGVhbiB1c2VzTW94eUdlbmVyYXRvcikgewotCQlpZih1c2VzTW94eUdlbmVyYXRvcikgewotCQkJcmV0dXJuIEpBWEJfRUNMSVBTRUxJTktfR0VOX0NMQVNTOwotCQl9Ci0JCWVsc2UgaWYoZ2VuZXJpY0pheGJOb25KZGtJc09uQ2xhc3NwYXRoKGphdmFQcm9qZWN0KSkgewotCQkJcmV0dXJuIEpBWEJfR0VORVJJQ19HRU5fQ0xBU1M7Ci0JCX0KLQkJZWxzZSBpZihnZW5lcmljSmF4Ykpka0lzT25DbGFzc3BhdGgoamF2YVByb2plY3QpKSB7Ci0JCQlyZXR1cm4gSkFYQl9HRU5FUklDX0dFTl9KREtfQ0xBU1M7Ci0JCX0KLQkJdGhpcy50b29sc0phclBhdGggPSBmaW5kVG9vbHNKYXJQYXRoKGphdmFQcm9qZWN0KTsKLQkJcmV0dXJuIEpBWEJfR0VORVJJQ19HRU5fSkRLX0NMQVNTOwotCX0KLQotCXByaXZhdGUgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBnZXRUb29sc0NsYXNzcGF0aEVudHJ5KCkgewotCQlyZXR1cm4gKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy50b29sc0phclBhdGgpKSA/Ci0JCQludWxsIDoKLQkJCWdldEFyY2hpdmVDbGFzc3BhdGhFbnRyeShuZXcgUGF0aCh0aGlzLnRvb2xzSmFyUGF0aCkpOwotCX0KLQotCS8vICoqKioqKioqKiogTGF1bmNoIENvbmZpZ3VyYXRpb24gU2V0dXAgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBidWlsZENsYXNzcGF0aCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTGlzdDxTdHJpbmc+IGNsYXNzcGF0aCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkvLyBEZWZhdWx0IFByb2plY3QgY2xhc3NwYXRoCi0JCWNsYXNzcGF0aC5hZGQodGhpcy5nZXREZWZhdWx0UHJvamVjdENsYXNzcGF0aEVudHJ5KCkuZ2V0TWVtZW50bygpKTsKLQkJLy8gU3lzdGVtIExpYnJhcnkgIAotCQljbGFzc3BhdGguYWRkKHRoaXMuZ2V0U3lzdGVtTGlicmFyeUNsYXNzcGF0aEVudHJ5KCkuZ2V0TWVtZW50bygpKTsKLQkJLy8gQ29udGFpbmVycyBjbGFzc3BhdGgKLQkJZm9yKElSdW50aW1lQ2xhc3NwYXRoRW50cnkgY29udGFpbmVyQ2xhc3NwYXRoRW50cnk6IHRoaXMuZ2V0Q29udGFpbmVyc0NsYXNzcGF0aEVudHJpZXMoKSkgewotCQkJY2xhc3NwYXRoLmFkZChjb250YWluZXJDbGFzc3BhdGhFbnRyeS5nZXRNZW1lbnRvKCkpOwotCQl9Ci0JCS8vIFRvb2xzIGNsYXNzcGF0aAotCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IHRvb2xzQ2xhc3NwYXRoRW50cnkgPSB0aGlzLmdldFRvb2xzQ2xhc3NwYXRoRW50cnkoKTsKLQkJaWYodG9vbHNDbGFzc3BhdGhFbnRyeSAhPSBudWxsKSB7Ci0JCQljbGFzc3BhdGguYWRkKHRvb2xzQ2xhc3NwYXRoRW50cnkuZ2V0TWVtZW50bygpKTsKLQkJfQotCQlyZXR1cm4gY2xhc3NwYXRoOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNwZWNpZnlQcm9ncmFtQXJndW1lbnRzKCkgewotCQlTdHJpbmdCdWZmZXIgcHJvZ3JhbUFyZ3VtZW50cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCi0JCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCItZCAiKTsJICAvLyROT04tTkxTLTEkCi0JCWlmKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5vdXRwdXREaXIpKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiT3V0cHV0IGRpcmVjdG9yeSBjYW5ub3QgYmUgZW1wdHkiKTsJICAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoU3RyaW5nVG9vbHMucXVvdGUodGhpcy5vdXRwdXREaXIpKTsKLQkJaWYoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLnRhcmdldFBhY2thZ2UpKSB7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC1wICIpOwkgIC8vJE5PTi1OTFMtMSQKLQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKHRoaXMudGFyZ2V0UGFja2FnZSk7Ci0JCX0KLQkJaWYoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmNhdGFsb2cpKSB7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC1jYXRhbG9nICIpOwkgIC8vJE5PTi1OTFMtMSQKLQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKFN0cmluZ1Rvb2xzLnF1b3RlKHRoaXMuY2F0YWxvZykpOwotCQl9Ci0KLQkJLy8gT3B0aW9ucwotCQlpZiggISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5nZXRQcm94eSgpKSkgewotCQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoIiAtaHR0cHByb3h5ICIpOwkgIC8vJE5PTi1OTFMtMSQKLQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKHRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5nZXRQcm94eSgpKTsKLQkJfQotCQlpZiggISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5nZXRQcm94eUZpbGUoKSkpIHsKLQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCIgLWh0dHBwcm94eWZpbGUgIik7CSAgLy8kTk9OLU5MUy0xJAotCQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoU3RyaW5nVG9vbHMucXVvdGUodGhpcy5nZW5lcmF0b3JPcHRpb25zLmdldFByb3h5RmlsZSgpKSk7Ci0JCX0KLQkJCi0JCWlmKCAhIHRoaXMuZ2VuZXJhdG9yT3B0aW9ucy51c2VzU3RyaWN0VmFsaWRhdGlvbigpKSB7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC1udiIpOwkgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0aGlzLmdlbmVyYXRvck9wdGlvbnMubWFrZXNSZWFkT25seSgpKSB7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC1yZWFkT25seSIpOwkgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0aGlzLmdlbmVyYXRvck9wdGlvbnMuc3VwcHJlc3Nlc1BhY2thZ2VJbmZvR2VuKCkpIHsKLQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCIgLW5wYSIpOwkgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0aGlzLmdlbmVyYXRvck9wdGlvbnMuc3VwcHJlc3Nlc0hlYWRlckdlbigpKSB7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC1uby1oZWFkZXIiKTsJICAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodGhpcy5nZW5lcmF0b3JPcHRpb25zLmlzVmVyYm9zZSgpKSB7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC12ZXJib3NlIik7CSAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5pc1F1aWV0KCkpIHsKLQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCIgLXF1aWV0Iik7CSAgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYodGhpcy5nZW5lcmF0b3JPcHRpb25zLnRyZWF0c0FzWG1sU2NoZW1hKCkpIHsKLQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCIgLXhtbHNjaGVtYSIpOwkgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0aGlzLmdlbmVyYXRvck9wdGlvbnMudHJlYXRzQXNSZWxheE5nKCkpIHsKLQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCIgLXJlbGF4bmciKTsJICAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodGhpcy5nZW5lcmF0b3JPcHRpb25zLnRyZWF0c0FzUmVsYXhOZ0NvbXBhY3QoKSkgewotCQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoIiAtcmVsYXhuZy1jb21wYWN0Iik7CSAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRoaXMuZ2VuZXJhdG9yT3B0aW9ucy50cmVhdHNBc0R0ZCgpKSB7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC1kdGQiKTsJICAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodGhpcy5nZW5lcmF0b3JPcHRpb25zLnRyZWF0c0FzV3NkbCgpKSB7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC13c2RsIik7CSAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5zaG93c1ZlcnNpb24oKSkgewotCQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoIiAtdmVyc2lvbiIpOwkgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0aGlzLmdlbmVyYXRvck9wdGlvbnMuc2hvd3NIZWxwKCkpIHsKLQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCIgLWhlbHAiKTsJICAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBFeHRlbnNpb24gT3B0aW9ucwotCQlpZih0aGlzLmdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMuYWxsb3dzRXh0ZW5zaW9ucygpKSB7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC1leHRlbnNpb24iKTsJICAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMuZ2V0Q2xhc3NwYXRoKCkpKSB7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC1jbGFzc3BhdGggIik7CSAgLy8kTk9OLU5MUy0xJAotCQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoU3RyaW5nVG9vbHMucXVvdGUodGhpcy5nZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zLmdldENsYXNzcGF0aCgpKSk7Ci0JCX0KLQkJaWYoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMuZ2V0QWRkaXRpb25hbEFyZ3MoKSkpIHsKLQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCcgJyk7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCh0aGlzLmdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMuZ2V0QWRkaXRpb25hbEFyZ3MoKSk7Ci0JCX0KLQotCQkvLyBzY2hlbWEKLQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoJyAnKTsKLQkJaWYoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLnNjaGVtYVBhdGhPclVyaSkpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTY2hlbWEgY2Fubm90IGJlIGVtcHR5Iik7CSAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKFN0cmluZ1Rvb2xzLnF1b3RlKHRoaXMuc2NoZW1hUGF0aE9yVXJpKSk7Ci0JCQotCQkvLyBiaW5kaW5ncwotCQlpZiAodGhpcy5iaW5kaW5nc0ZpbGVOYW1lcy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKFN0cmluZyBiaW5kaW5nc0ZpbGVOYW1lIDogdGhpcy5iaW5kaW5nc0ZpbGVOYW1lcykgewotCQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCIgLWIgIik7CSAgLy8kTk9OLU5MUy0xJAotCQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKFN0cmluZ1Rvb2xzLnF1b3RlKGJpbmRpbmdzRmlsZU5hbWUpKTsKLQkJCX0KLQkJfQotCQl0aGlzLmxhdW5jaENvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPR1JBTV9BUkdVTUVOVFMsIHByb2dyYW1Bcmd1bWVudHMudG9TdHJpbmcoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBMaXN0PElSdW50aW1lQ2xhc3NwYXRoRW50cnk+IGdldENvbnRhaW5lcnNDbGFzc3BhdGhFbnRyaWVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlBcnJheUxpc3Q8SVJ1bnRpbWVDbGFzc3BhdGhFbnRyeT4gY2xhc3NwYXRoRW50cmllcyA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWVDbGFzc3BhdGhFbnRyeT4oKTsKLQkJZm9yKElDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeTogdGhpcy5qYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSkgewotCQkJaWYoY2xhc3NwYXRoRW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIpIHsKLQkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcihjbGFzc3BhdGhFbnRyeS5nZXRQYXRoKCksIHRoaXMuamF2YVByb2plY3QpOwotCQkJCWlmKGNvbnRhaW5lciAhPSBudWxsICYmIGNvbnRhaW5lci5nZXRLaW5kKCkgPT0gSUNsYXNzcGF0aENvbnRhaW5lci5LX1NZU1RFTSkgewotCQkJCQljbGFzc3BhdGhFbnRyaWVzLmFkZCggCi0JCQkJCQlKYXZhUnVudGltZS5uZXdSdW50aW1lQ29udGFpbmVyQ2xhc3NwYXRoRW50cnkoCi0JCQkJCQkJY29udGFpbmVyLmdldFBhdGgoKSwgCi0JCQkJCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeS5CT09UU1RSQVBfQ0xBU1NFUywgCi0JCQkJCQkJdGhpcy5qYXZhUHJvamVjdCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2xhc3NwYXRoRW50cmllczsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9nZW4vQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2dlbi9DbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzY5NDVmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2dlbi9DbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuZ2VuOwotCi0vKioKLSAqICBDbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucwotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMKLXsKLQlwcml2YXRlIFN0cmluZyBjbGFzc3BhdGg7Ci0JcHJpdmF0ZSBib29sZWFuIGFsbG93c0V4dGVuc2lvbnM7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYWRkaXRpb25hbEFyZ3M7Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0JCi0JcHVibGljIENsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8vICoqKioqKioqKiogZ2V0dGVycy9zZXR0ZXJzICoqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gYWxsb3dzRXh0ZW5zaW9ucygpIHsKLQkJcmV0dXJuIHRoaXMuYWxsb3dzRXh0ZW5zaW9uczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd3NFeHRlbnNpb25zKGJvb2xlYW4gYWxsb3dzRXh0ZW5zaW9ucykgewotCQl0aGlzLmFsbG93c0V4dGVuc2lvbnMgPSBhbGxvd3NFeHRlbnNpb25zOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzcGF0aCgpIHsKLQkJcmV0dXJuIHRoaXMuY2xhc3NwYXRoOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoU3RyaW5nIGNsYXNzcGF0aCl7Ci0JCXRoaXMuY2xhc3NwYXRoID0gY2xhc3NwYXRoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbEFyZ3MoKSB7Ci0JCXJldHVybiB0aGlzLmFkZGl0aW9uYWxBcmdzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsQXJncyhTdHJpbmcgYWRkaXRpb25hbEFyZ3MpewotCQl0aGlzLmFkZGl0aW9uYWxBcmdzID0gYWRkaXRpb25hbEFyZ3M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9nZW4vQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2dlbi9DbGFzc2VzR2VuZXJhdG9yT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTJjZjc5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2dlbi9DbGFzc2VzR2VuZXJhdG9yT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmdlbjsKLQotCi0vKioKLSAqICBDbGFzc2VzR2VuZXJhdG9yT3B0aW9ucwotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnMKLXsKLQlwcml2YXRlIFN0cmluZyBwcm94eTsKLQlwcml2YXRlIFN0cmluZyBwcm94eUZpbGU7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHVzZXNTdHJpY3RWYWxpZGF0aW9uOwotCXByaXZhdGUgYm9vbGVhbiBtYWtlc1JlYWRPbmx5OwotCXByaXZhdGUgYm9vbGVhbiBzdXBwcmVzc2VzUGFja2FnZUluZm9HZW47Ci0JcHJpdmF0ZSBib29sZWFuIHN1cHByZXNzZXNIZWFkZXJHZW47Ci0JcHJpdmF0ZSBib29sZWFuIGlzVmVyYm9zZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNRdWlldDsKLQotCXByaXZhdGUgYm9vbGVhbiB0cmVhdHNBc1htbFNjaGVtYTsKLQlwcml2YXRlIGJvb2xlYW4gdHJlYXRzQXNSZWxheE5nOwotCXByaXZhdGUgYm9vbGVhbiB0cmVhdHNBc1JlbGF4TmdDb21wYWN0OwotCXByaXZhdGUgYm9vbGVhbiB0cmVhdHNBc0R0ZDsKLQlwcml2YXRlIGJvb2xlYW4gdHJlYXRzQXNXc2RsOwotCXByaXZhdGUgYm9vbGVhbiBzaG93c1ZlcnNpb247Ci0JcHJpdmF0ZSBib29sZWFuIHNob3dzSGVscDsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCQotCXB1YmxpYyBDbGFzc2VzR2VuZXJhdG9yT3B0aW9ucygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldHRlcnMvc2V0dGVycyAqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJveHkoKSB7Ci0JCXJldHVybiB0aGlzLnByb3h5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm94eShTdHJpbmcgcHJveHkpewotCQl0aGlzLnByb3h5ID0gcHJveHk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm94eUZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLnByb3h5RmlsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJveHlGaWxlKFN0cmluZyBwcm94eUZpbGUpewotCQl0aGlzLnByb3h5RmlsZSA9IHByb3h5RmlsZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwcmVzc2VzUGFja2FnZUluZm9HZW4oKSB7Ci0JCXJldHVybiB0aGlzLnN1cHByZXNzZXNQYWNrYWdlSW5mb0dlbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdXBwcmVzc2VzUGFja2FnZUluZm9HZW4oYm9vbGVhbiBzdXBwcmVzc2VzUGFja2FnZUluZm9HZW4pIHsKLQkJdGhpcy5zdXBwcmVzc2VzUGFja2FnZUluZm9HZW4gPSBzdXBwcmVzc2VzUGFja2FnZUluZm9HZW47Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdXNlc1N0cmljdFZhbGlkYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLnVzZXNTdHJpY3RWYWxpZGF0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVzZXNTdHJpY3RWYWxpZGF0aW9uKGJvb2xlYW4gdXNlc1N0cmljdFZhbGlkYXRpb24pIHsKLQkJdGhpcy51c2VzU3RyaWN0VmFsaWRhdGlvbiA9IHVzZXNTdHJpY3RWYWxpZGF0aW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1ha2VzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiB0aGlzLm1ha2VzUmVhZE9ubHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFrZXNSZWFkT25seShib29sZWFuIG1ha2VzUmVhZE9ubHkpIHsKLQkJdGhpcy5tYWtlc1JlYWRPbmx5ID0gbWFrZXNSZWFkT25seTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gc3VwcHJlc3Nlc0hlYWRlckdlbigpIHsKLQkJcmV0dXJuIHRoaXMuc3VwcHJlc3Nlc0hlYWRlckdlbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3VwcHJlc3Nlc0hlYWRlckdlbihib29sZWFuIHN1cHByZXNzZXNIZWFkZXJHZW4pewotCQl0aGlzLnN1cHByZXNzZXNIZWFkZXJHZW4gPSBzdXBwcmVzc2VzSGVhZGVyR2VuOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmVyYm9zZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNWZXJib3NlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJc1ZlcmJvc2UoYm9vbGVhbiBpc1ZlcmJvc2UpewotCQl0aGlzLmlzVmVyYm9zZSA9IGlzVmVyYm9zZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNRdWlldCgpIHsKLQkJcmV0dXJuIHRoaXMuaXNRdWlldDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SXNRdWlldChib29sZWFuIGlzUXVpZXQpewotCQl0aGlzLmlzUXVpZXQgPSBpc1F1aWV0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRyZWF0c0FzWG1sU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy50cmVhdHNBc1htbFNjaGVtYTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VHJlYXRzQXNYbWxTY2hlbWEoYm9vbGVhbiB0cmVhdHNBc1htbFNjaGVtYSl7Ci0JCXRoaXMudHJlYXRzQXNYbWxTY2hlbWEgPSB0cmVhdHNBc1htbFNjaGVtYTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdHJlYXRzQXNSZWxheE5nKCkgewotCQlyZXR1cm4gdGhpcy50cmVhdHNBc1JlbGF4Tmc7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRyZWF0c0FzUmVsYXhOZyhib29sZWFuIHRyZWF0c0FzUmVsYXhOZyl7Ci0JCXRoaXMudHJlYXRzQXNSZWxheE5nID0gdHJlYXRzQXNSZWxheE5nOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB0cmVhdHNBc1JlbGF4TmdDb21wYWN0KCkgewotCQlyZXR1cm4gdGhpcy50cmVhdHNBc1JlbGF4TmdDb21wYWN0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUcmVhdHNBc1JlbGF4TmdDb21wYWN0KGJvb2xlYW4gdHJlYXRzQXNSZWxheE5nQ29tcGFjdCl7Ci0JCXRoaXMudHJlYXRzQXNSZWxheE5nQ29tcGFjdCA9IHRyZWF0c0FzUmVsYXhOZ0NvbXBhY3Q7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHRyZWF0c0FzRHRkKCkgewotCQlyZXR1cm4gdGhpcy50cmVhdHNBc0R0ZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VHJlYXRzQXNEdGQoYm9vbGVhbiB0cmVhdHNBc0R0ZCl7Ci0JCXRoaXMudHJlYXRzQXNEdGQgPSB0cmVhdHNBc0R0ZDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdHJlYXRzQXNXc2RsKCkgewotCQlyZXR1cm4gdGhpcy50cmVhdHNBc1dzZGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRyZWF0c0FzV3NkbChib29sZWFuIHRyZWF0c0FzV3NkbCl7Ci0JCXRoaXMudHJlYXRzQXNXc2RsID0gdHJlYXRzQXNXc2RsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBzaG93c1ZlcnNpb24oKSB7Ci0JCXJldHVybiB0aGlzLnNob3dzVmVyc2lvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2hvd3NWZXJzaW9uKGJvb2xlYW4gc2hvd3NWZXJzaW9uKXsKLQkJdGhpcy5zaG93c1ZlcnNpb24gPSBzaG93c1ZlcnNpb247Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHNob3dzSGVscCgpIHsKLQkJcmV0dXJuIHRoaXMuc2hvd3NIZWxwOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTaG93c0hlbHAoYm9vbGVhbiBzaG93c0hlbHApewotCQl0aGlzLnNob3dzSGVscCA9IHNob3dzSGVscDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2dlbi9HZW5lcmF0ZUpheGJDbGFzc2VzSm9iLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9nZW4vR2VuZXJhdGVKYXhiQ2xhc3Nlc0pvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGIyYTllLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2dlbi9HZW5lcmF0ZUpheGJDbGFzc2VzSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuSnB0SmF4YkNvcmVNZXNzYWdlczsKLQotLyoqCi0gKiAgR2VuZXJhdGVKYXhiQ2xhc3Nlc0pvYgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVKYXhiQ2xhc3Nlc0pvYiBleHRlbmRzIFdvcmtzcGFjZUpvYiB7Ci0JcHJpdmF0ZSBmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYWJzb2x1dGVMb2NhbFhzZFVyaTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBvdXRwdXREaXI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGFyZ2V0UGFja2FnZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBjYXRhbG9nOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiB1c2VzTW94eUdlbmVyYXRvcjsKLQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGJpbmRpbmdzRmlsZU5hbWVzOwotCXByaXZhdGUgZmluYWwgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnMgZ2VuZXJhdG9yT3B0aW9uczsKLQlwcml2YXRlIGZpbmFsIENsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zIGdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnM7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIEdlbmVyYXRlSmF4YkNsYXNzZXNKb2IoCi0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgCi0JCVN0cmluZyBhYnNvbHV0ZUxvY2FsWHNkVXJpLCAKLQkJU3RyaW5nIG91dHB1dERpciwKLQkJU3RyaW5nIHRhcmdldFBhY2thZ2UsIAotCQlTdHJpbmcgY2F0YWxvZywgCi0JCWJvb2xlYW4gdXNlc01veHlHZW5lcmF0b3IsCi0JCVN0cmluZ1tdIGJpbmRpbmdzRmlsZU5hbWVzLAotCQlDbGFzc2VzR2VuZXJhdG9yT3B0aW9ucyBnZW5lcmF0b3JPcHRpb25zLAotCQlDbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucyBnZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zKSB7Ci0JCQotCQlzdXBlcihKcHRKYXhiQ29yZU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JfZ2VuZXJhdGluZ0NsYXNzZXMpOwotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb2plY3QgaXMgbnVsbCIpOwkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoYWJzb2x1dGVMb2NhbFhzZFVyaSkpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTY2hlbWEgY2Fubm90IGJlIGVtcHR5Iik7CS8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkob3V0cHV0RGlyKSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJPdXRwdXQgZGlyZWN0b3J5IGNhbm5vdCBiZSBlbXB0eSIpOwkvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5qYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotCQl0aGlzLmFic29sdXRlTG9jYWxYc2RVcmkgPSBhYnNvbHV0ZUxvY2FsWHNkVXJpOwotCQl0aGlzLm91dHB1dERpciA9IG91dHB1dERpcjsKLQkJdGhpcy50YXJnZXRQYWNrYWdlID0gdGFyZ2V0UGFja2FnZTsKLQkJdGhpcy5jYXRhbG9nID0gY2F0YWxvZzsKLQkJdGhpcy51c2VzTW94eUdlbmVyYXRvciA9IHVzZXNNb3h5R2VuZXJhdG9yOwotCQl0aGlzLmJpbmRpbmdzRmlsZU5hbWVzID0gYmluZGluZ3NGaWxlTmFtZXM7Ci0JCXRoaXMuZ2VuZXJhdG9yT3B0aW9ucyA9IGdlbmVyYXRvck9wdGlvbnM7Ci0JCXRoaXMuZ2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucyA9IGdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnM7Ci0JCXRoaXMuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKS5tb2RpZnlSdWxlKHRoaXMuamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgSnB0SmF4YkNvcmVNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yX2dlbmVyYXRpbmdDbGFzc2VzVGFzaywgMSk7Ci0JCXRyeSB7Ci0JCQl0aGlzLmNsYXNzZXNHZW5lcmF0b3JHZW5lcmF0ZSh0aGlzLmphdmFQcm9qZWN0LCAKLQkJCQl0aGlzLmFic29sdXRlTG9jYWxYc2RVcmksIAotCQkJCXRoaXMub3V0cHV0RGlyLCAKLQkJCQl0aGlzLnRhcmdldFBhY2thZ2UsIAotCQkJCXRoaXMuY2F0YWxvZywgCi0JCQkJdGhpcy51c2VzTW94eUdlbmVyYXRvciwKLQkJCQl0aGlzLmJpbmRpbmdzRmlsZU5hbWVzLAotCQkJCXRoaXMuZ2VuZXJhdG9yT3B0aW9ucywKLQkJCQl0aGlzLmdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMsIAotCQkJCXNtLm5ld0NoaWxkKDEpKTsKLQkJfSAKLQkJY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCS8vIGZhbGwgdGhyb3VnaCBhbmQgdGVsbCBtb25pdG9yIHdlIGFyZSBkb25lCi0JCX0KLQkJY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHJlKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLX0KLQotCXByaXZhdGUgdm9pZCBjbGFzc2VzR2VuZXJhdG9yR2VuZXJhdGUoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCAKLQkJU3RyaW5nIGFic29sdXRlTG9jYWxYc2RVcmksIAotCQlTdHJpbmcgb3V0cHV0RGlyLCAKLQkJU3RyaW5nIHRhcmdldFBhY2thZ2UsIAotCQlTdHJpbmcgY2F0YWxvZywgCi0JCWJvb2xlYW4gdXNlc01veHlHZW5lcmF0b3IsCi0JCVN0cmluZ1tdIGJpbmRpbmdzRmlsZU5hbWVzLCAKLQkJQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnMgZ2VuZXJhdG9yT3B0aW9ucywKLQkJQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMgZ2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucywKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJQ2xhc3Nlc0dlbmVyYXRvci5nZW5lcmF0ZShqYXZhUHJvamVjdCwgCi0JCQlhYnNvbHV0ZUxvY2FsWHNkVXJpLCAKLQkJCW91dHB1dERpciwgCi0JCQl0YXJnZXRQYWNrYWdlLCAKLQkJCWNhdGFsb2csIAotCQkJdXNlc01veHlHZW5lcmF0b3IsIAotCQkJYmluZGluZ3NGaWxlTmFtZXMsIAotCQkJZ2VuZXJhdG9yT3B0aW9ucywgCi0JCQlnZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zLAotCQkJbW9uaXRvcik7Ci0JCXJldHVybjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZ2VuL1NjaGVtYUdlbmVyYXRvci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZ2VuL1NjaGVtYUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDgyMWE5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2dlbi9TY2hlbWFHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuZ2VuOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5nZW4uQWJzdHJhY3RKcHRHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5KcHRKYXhiQ29yZU1lc3NhZ2VzOwotCi0vKioKLSAqICBTY2hlbWFHZW5lcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFNjaGVtYUdlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0SnB0R2VuZXJhdG9yCi17Ci0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgTEFVTkNIX0NPTkZJR19OQU1FID0gIkpBWEIgU2NoZW1hIEdlbiBSdW4gQ29uZmlnIjsgICAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgSkFYQl9TQ0hFTUFfR0VOX1BBQ0tBR0VfTkFNRSA9ICJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbiI7ICAgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIEpBWEJfU0NIRU1BX0dFTl9DTEFTUyA9IEpBWEJfU0NIRU1BX0dFTl9QQUNLQUdFX05BTUUgKyAiLk1haW4iOwkgIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHVibGljIFN0cmluZyBFQ0xJUFNFTElOS19KQVhCX1NDSEVNQV9HRU5fUEFDS0FHRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuIjsgICAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgRUNMSVBTRUxJTktfSkFYQl9TQ0hFTUFfR0VOX0NMQVNTID0gRUNMSVBTRUxJTktfSkFYQl9TQ0hFTUFfR0VOX1BBQ0tBR0VfTkFNRSArICIuTWFpbiI7CSAgLy8kTk9OLU5MUy0xJAotCQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIEVDTElQU0VMSU5LX0pBWEJfQ09OVEVYVF9GQUNUT1JZID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuSkFYQkNvbnRleHRGYWN0b3J5IjsgIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHVibGljIFN0cmluZyBFQ0xJUFNFTElOS19KQVhCX1BST1BFUlRJRVNfRklMRV9DT05URU5UUyA9ICJqYXZheC54bWwuYmluZC5jb250ZXh0LmZhY3Rvcnk9IiArIEVDTElQU0VMSU5LX0pBWEJfQ09OVEVYVF9GQUNUT1JZOyAgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIEpBWEJfUFJPUEVSVElFU19GSUxFX05BTUUgPSAiamF4Yi5wcm9wZXJ0aWVzIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlzdGF0aWMgcHVibGljIFN0cmluZyBKQVhCX1NDSEVNQV9HRU5fSkFSX1BSRUZJWCA9IEpBWEJfU0NIRU1BX0dFTl9QQUNLQUdFX05BTUUgKyAiXyI7CS8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHVibGljIFN0cmluZyBFQ0xJUFNFTElOS19KQVhCX1NDSEVNQV9HRU5fSkFSX1BSRUZJWCA9IEVDTElQU0VMSU5LX0pBWEJfU0NIRU1BX0dFTl9QQUNLQUdFX05BTUUgKyAiXyI7CS8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIEpBWEJfR0VORVJJQ19TQ0hFTUFfR0VOX0NMQVNTID0gImphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0IjsJLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIEpBWEJfRUNMSVBTRUxJTktfU0NIRU1BX0dFTl9DTEFTUyA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLkpBWEJDb250ZXh0IjsJLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHRhcmdldFNjaGVtYU5hbWU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBzb3VyY2VDbGFzc05hbWVzOwotCXByaXZhdGUgIFN0cmluZyBtYWluVHlwZTsKLQlwcml2YXRlICBib29sZWFuIHVzZU1veHk7Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2VuZXJhdGUoCi0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QsIAotCQkJU3RyaW5nIHRhcmdldFNjaGVtYU5hbWUsIAotCQkJU3RyaW5nW10gc291cmNlQ2xhc3NOYW1lcywKLQkJCWJvb2xlYW4gdXNlTW94eSwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJbmV3IFNjaGVtYUdlbmVyYXRvcihqYXZhUHJvamVjdCwgCi0JCQl0YXJnZXRTY2hlbWFOYW1lLCAKLQkJCXNvdXJjZUNsYXNzTmFtZXMsCi0JCQl1c2VNb3h5KS5nZW5lcmF0ZShtb25pdG9yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIFNjaGVtYUdlbmVyYXRvcigKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgCi0JCQlTdHJpbmcgdGFyZ2V0U2NoZW1hTmFtZSwgCi0JCQlTdHJpbmdbXSBzb3VyY2VDbGFzc05hbWVzLAotCQkJYm9vbGVhbiB1c2VNb3h5KSB7Ci0JCXN1cGVyKGphdmFQcm9qZWN0KTsKLQkJdGhpcy50YXJnZXRTY2hlbWFOYW1lID0gdGFyZ2V0U2NoZW1hTmFtZTsKLQkJdGhpcy5zb3VyY2VDbGFzc05hbWVzID0gc291cmNlQ2xhc3NOYW1lczsKLQkJdGhpcy51c2VNb3h5ID0gdXNlTW94eTsKLQkJdGhpcy5tYWluVHlwZSA9ICh0aGlzLnVzZU1veHkpID8gCi0JCQkJRUNMSVBTRUxJTktfSkFYQl9TQ0hFTUFfR0VOX0NMQVNTIDoKLQkJCQlKQVhCX1NDSEVNQV9HRU5fQ0xBU1M7Ci0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWFpblR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm1haW5UeXBlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGF1bmNoQ29uZmlnTmFtZSgpIHsKLQkJcmV0dXJuIExBVU5DSF9DT05GSUdfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEJvb3RzdHJhcEphclByZWZpeCgpIHsKLQkJcmV0dXJuICh0aGlzLnVzZU1veHkpID8gCi0JCQkJCQlFQ0xJUFNFTElOS19KQVhCX1NDSEVNQV9HRU5fSkFSX1BSRUZJWCA6Ci0JCQkJCQlKQVhCX1NDSEVNQV9HRU5fSkFSX1BSRUZJWDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwcmVHZW5lcmF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZ2VuZXJhdGUgamF4Yi5wcm9wZXJ0aWVzIGZpbGUgaWYgbmVjZXNzYXJ5Ci0JCWlmKHRoaXMudXNlTW94eSkgewotCQkJaWYoICEgdGhpcy5qYXhiUHJvcGVydGllc0ZpbGVJc1ByZXNlbnQoKSkgewotCQkJCXRoaXMuZ2VuZXJhdGVKYXhiUHJvcGVydGllc0ZpbGUobW9uaXRvcik7Ci0JCQl9Ci0JCQllbHNlIGlmKCAhIHRoaXMuamF4YkNvbnRleHRVc2VzTW94eSgpKSB7Ci0JCQkJLy9wcm9wZXJ0aWVzIGZpbGUgYWN0dWFsbHkgc3BlY2lmaWVzIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uCi0JCQkJLy9vdmVycmlkZSB3aXphcmQgc2V0dGluZyBhbmQgZmFsbCBiYWNrIHRvIGdlbmVyaWMgZ2VuZXJhdGlvbgotCQkJCXRoaXMudXNlTW94eSA9IGZhbHNlOwotCQkJCXRoaXMubWFpblR5cGUgPSBKQVhCX1NDSEVNQV9HRU5fQ0xBU1M7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIExhdW5jaCBDb25maWd1cmF0aW9uIFNldHVwICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gYnVpbGRDbGFzc3BhdGgoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUxpc3Q8U3RyaW5nPiBjbGFzc3BhdGggPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJLy8gU2NoZW1hX0dlbiBqYXIKLQkJY2xhc3NwYXRoLmFkZCh0aGlzLmdldEJvb3RzdHJhcEphckNsYXNzcGF0aEVudHJ5KCkuZ2V0TWVtZW50bygpKTsKLQkJLy8gRGVmYXVsdCBQcm9qZWN0IGNsYXNzcGF0aAotCQljbGFzc3BhdGguYWRkKHRoaXMuZ2V0RGVmYXVsdFByb2plY3RDbGFzc3BhdGhFbnRyeSgpLmdldE1lbWVudG8oKSk7Ci0JCS8vIFN5c3RlbSBMaWJyYXJ5ICAKLQkJY2xhc3NwYXRoLmFkZCh0aGlzLmdldFN5c3RlbUxpYnJhcnlDbGFzc3BhdGhFbnRyeSgpLmdldE1lbWVudG8oKSk7Ci0JCXJldHVybiBjbGFzc3BhdGg7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNwZWNpZnlQcm9ncmFtQXJndW1lbnRzKCkgewotCi0JCVN0cmluZ0J1ZmZlciBwcm9ncmFtQXJndW1lbnRzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkvLyBzb3VyY2VDbGFzc05hbWVzCi0JCXRoaXMuYXBwZW5kQ2xhc3NOYW1lQXJndW1lbnRzKHByb2dyYW1Bcmd1bWVudHMpOwotCi0JCS8vIHNjaGVtYQotCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC1zIFwiIik7CSAgLy8kTk9OLU5MUy0xJAotCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCh0aGlzLnRhcmdldFNjaGVtYU5hbWUpOwotCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgnIicpOwotCi0JCXRoaXMubGF1bmNoQ29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9HUkFNX0FSR1VNRU5UUywgcHJvZ3JhbUFyZ3VtZW50cy50b1N0cmluZygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZENsYXNzTmFtZUFyZ3VtZW50cyhTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdGhpcy5zb3VyY2VDbGFzc05hbWVzKSB7Ci0JCQlzYi5hcHBlbmQoIiAtYyAiKTsJICAvLyROT04tTkxTLTEkCi0JCQlzYi5hcHBlbmQoY2xhc3NOYW1lKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCAiamF4Yi5wcm9wZXJ0aWVzIiBmaWxlIHRoYXQgaXMgZm91bmQgaW4gYSB2YWxpZCBzb3VyY2UKLQkgKiBmb2xkZXIgaW4gdGhlIHByb2plY3QuCi0JICogCi0JICogUmV0dXJucyBudWxsIGlmIG5vICJqYXhiLnByb3BlcnRpZXMiIGZpbGUgaXMgZm91bmQuCi0JICovCi0JcHJpdmF0ZSBJRmlsZSBnZXRKYXhiUHJvcGVydGllc0ZpbGUoKSB7Ci0JCXJldHVybiBnZXRKYXhiUHJvcGVydGllc0ZpbGVGcm9tUGFja2FnZVJvb3RzKEpEVFRvb2xzLmdldEphdmFTb3VyY2VGb2xkZXJzKHRoaXMuamF2YVByb2plY3QpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJRmlsZSBnZXRKYXhiUHJvcGVydGllc0ZpbGVGcm9tUGFja2FnZVJvb3RzKEl0ZXJhYmxlPElQYWNrYWdlRnJhZ21lbnRSb290PiBwYWNrYWdlRnJhZ21lbnRSb290cyl7Ci0JCUlKYXZhRWxlbWVudFtdIGphdmFFbGVtZW50czsKLQkJSUZpbGUgamF4YlByb3BlcnRpZXNGaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3QgcGZyIDogcGFja2FnZUZyYWdtZW50Um9vdHMpIHsKLQkJCQlqYXhiUHJvcGVydGllc0ZpbGUgPSB0aGlzLmZpbmRKYXhiUHJvcGVydGllc0ZpbGUocGZyLmdldE5vbkphdmFSZXNvdXJjZXMoKSk7Ci0JCQkJaWYoamF4YlByb3BlcnRpZXNGaWxlICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGpheGJQcm9wZXJ0aWVzRmlsZTsKLQkJCQl9Ci0JCQkJamF2YUVsZW1lbnRzID0gcGZyLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yKElKYXZhRWxlbWVudCBqZSA6IGphdmFFbGVtZW50cykgewotCQkJCQlqYXhiUHJvcGVydGllc0ZpbGUgPSB0aGlzLmZpbmRKYXhiUHJvcGVydGllc0ZpbGUoKChJUGFja2FnZUZyYWdtZW50KWplKS5nZXROb25KYXZhUmVzb3VyY2VzKCkpOwotCQkJCQlpZihqYXhiUHJvcGVydGllc0ZpbGUgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGpheGJQcm9wZXJ0aWVzRmlsZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oam1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBJRmlsZSBmaW5kSmF4YlByb3BlcnRpZXNGaWxlKE9iamVjdFtdIG9iamVjdHMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlmb3IoT2JqZWN0IG9iamVjdCA6IG9iamVjdHMpIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIG9iamVjdDsKLQkJCWlmKHJlc291cmNlLmdldE5hbWUoKS5lcXVhbHMoSkFYQl9QUk9QRVJUSUVTX0ZJTEVfTkFNRSkpIHsKLQkJCQkvLyBqYXhiLnByb3BlcnRpZXMgaGFzIGJlZW4gZm91bmQKLQkJCQlyZXR1cm4gKElGaWxlKXJlc291cmNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0JCi0KLQlwcml2YXRlIGJvb2xlYW4gamF4YlByb3BlcnRpZXNGaWxlSXNQcmVzZW50KCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXhiUHJvcGVydGllc0ZpbGUoKSAhPSBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBqYXhiQ29udGV4dFVzZXNNb3h5KCkgewkKLQotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbiA9IHRoaXMuZ2V0SmF4YlByb3BlcnRpZXNGaWxlKCkuZ2V0Q29udGVudHMoKTsKLQkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLQkJCVN0cmluZyBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkvL2pheGIucHJvcGVydGllcyB3aWxsIG9ubHkgY29udGFpbiBvbmUgcHJvcGVydHkgZW50cnksIHRoZSBKQVhCQ29udGV4dEZhY3RvcnkKLQkJCVN0cmluZyBwcm9wZXJ0eVZhbHVlID0gbGluZS5zdWJzdHJpbmcobGluZS5pbmRleE9mKCI9IikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHByb3BlcnR5VmFsdWUuZXF1YWxzKEVDTElQU0VMSU5LX0pBWEJfQ09OVEVYVF9GQUNUT1JZKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihjZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaW9lKTsKLQkJfSBmaW5hbGx5IHsKLQkJICAgIGlmIChpbiAhPSBudWxsKSB7Ci0JCSAgICAJdHJ5IHsKLQkJICAgIAkJaW4uY2xvc2UoKTsKLQkJICAgIAl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJICAgIAkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaW9lKTsKLQkJCQl9Ci0JCSAgICB9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVKYXhiUHJvcGVydGllc0ZpbGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgMSk7Ci0JCXNtLnN1YlRhc2soSnB0SmF4YkNvcmVNZXNzYWdlcy5TY2hlbWFHZW5lcmF0b3JfY3JlYXRpbmdKQVhCUHJvcGVydGllc0ZpbGVUYXNrKTsKLQotCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IHRoaXMuZmluZFBhY2thZ2VGcmFnZW1lbnRGb3JTb3VyY2VDbGFzc05hbWUodGhpcy5zb3VyY2VDbGFzc05hbWVzWzBdKTsKLQotCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKXBhY2thZ2VGcmFnbWVudC5nZXRSZXNvdXJjZSgpOwotCQlJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoSkFYQl9QUk9QRVJUSUVTX0ZJTEVfTkFNRSk7Ci0JCQkKLQkJYnl0ZVtdIGJ5dGVzOwotCQl0cnkgewotCQkJYnl0ZXMgPSBFQ0xJUFNFTElOS19KQVhCX1BST1BFUlRJRVNfRklMRV9DT05URU5UUy5nZXRCeXRlcygiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9ICAgIAotCQkKLQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotCQkKLQkJdHJ5IHsKLQkJCS8vdGhlIGlucHV0IHN0cmVhbSB3aWxsIGJlIGNsb3NlZCBhcyBhIHJlc3VsdCBvZiBjYWxsaW5nIGNyZWF0ZQotCQkgICAgZmlsZS5jcmVhdGUoY29udGVudHMsIElSZXNvdXJjZS5OT05FLCBzbS5uZXdDaGlsZCgxKSk7CQkKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oY2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IGZpbmRQYWNrYWdlRnJhZ2VtZW50Rm9yU291cmNlQ2xhc3NOYW1lKFN0cmluZyBzb3VyY2VDbGFzc05hbWUpIHsKLQotCQlpZih0aGlzLmNsYXNzSXNJbkRlZmF1bHRQYWNrYWdlKHNvdXJjZUNsYXNzTmFtZSkpIHsKLQkJCXJldHVybiB0aGlzLmVtcHR5UGFja2FnZUZyYWdtZW50KCk7Ci0JCX0KLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gc291cmNlQ2xhc3NOYW1lLnN1YnN0cmluZygwLCBzb3VyY2VDbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKSk7Ci0JCQotCQkvL0ZpbmQgdGhlIGV4aXN0aW5nIHBhY2thZ2UgZnJhZ21lbnQgd2hlcmUgd2Ugd2FudCB0byBnZW5lcmF0ZQotCQlmb3IgKElQYWNrYWdlRnJhZ21lbnRSb290IHBmciA6IEpEVFRvb2xzLmdldEphdmFTb3VyY2VGb2xkZXJzKHRoaXMuamF2YVByb2plY3QpKSB7Ci0JCQkvL3VzZSB0aGUgcGFja2FnZSBvZiB0aGUgZmlyc3Qgc291cmNlIGNsYXNzIGFzIHRoZSBwYWNrYWdlIGZvciBnZW5lcmF0aW9uCi0JCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IHBmci5nZXRQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUpOwotCQkJaWYgKHBhY2thZ2VGcmFnbWVudC5leGlzdHMoKSl7Ci0JCQkJcmV0dXJuIHBhY2thZ2VGcmFnbWVudDsKLQkJCX0KLQkJfQotCQkvL3RoZSBleGlzdGluZyBwYWNrYWdlIGZyYWdtZW50IHdhcyBub3QgZm91bmQKLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSmF2YSBwYWNrYWdlIG11c3QgZXhpc3QgZm9yIHNvdXJjZSBjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudCBlbXB0eVBhY2thZ2VGcmFnbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Rmlyc3RKYXZhU291cmNlRm9sZGVyKCkuZ2V0UGFja2FnZUZyYWdtZW50KCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IGdldEZpcnN0SmF2YVNvdXJjZUZvbGRlcigpIHsKLQkJSXRlcmF0b3I8SVBhY2thZ2VGcmFnbWVudFJvb3Q+IGkgPSBKRFRUb29scy5nZXRKYXZhU291cmNlRm9sZGVycyh0aGlzLmphdmFQcm9qZWN0KS5pdGVyYXRvcigpOwotCQlyZXR1cm4gaS5oYXNOZXh0KCkgPyBpLm5leHQoKSA6IG51bGw7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjbGFzc0lzSW5EZWZhdWx0UGFja2FnZShTdHJpbmcgc291cmNlQ2xhc3NOYW1lKSB7Ci0JCXJldHVybiAhIHNvdXJjZUNsYXNzTmFtZS5jb250YWlucygiLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9qYXhiMjEvR2VuZXJpY0pheGJfMl8xX0ZhY3RvcnkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2pheGIyMS9HZW5lcmljSmF4Yl8yXzFfRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzU5NGJkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2pheGIyMS9HZW5lcmljSmF4Yl8yXzFfRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmpheGIyMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpheGJGYWN0b3J5OwotCi0vKioKLSAqIEdlbmVyaWMgSkFYQiB2ZXJzaW9uIDIuMQotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pheGJfMl8xX0ZhY3RvcnkKLQkJZXh0ZW5kcyBBYnN0cmFjdEpheGJGYWN0b3J5IHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXhiRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBHZW5lcmljSmF4Yl8yXzFfRmFjdG9yeSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhiRmFjdG9yeSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBHZW5lcmljSmF4Yl8yXzFfRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9qYXhiMjEvR2VuZXJpY0pheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvamF4YjIxL0dlbmVyaWNKYXhiXzJfMV9QbGF0Zm9ybURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiMGY0YS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9qYXhiMjEvR2VuZXJpY0pheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5qYXhiMjE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkdlbmVyaWNKYXhiUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpheGJQbGF0Zm9ybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5KYXZhUGFja2FnZUluZm9SZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5KYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhWG1sQW55RWxlbWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhWG1sRWxlbWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFYbWxFbGVtZW50UmVmTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVhtbEVsZW1lbnRzTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVhtbFRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFYbWxWYWx1ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc29yVHlwZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5YbWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sQW55RWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5YbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbEF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sRWxlbWVudHNBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sRW51bUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5YbWxFbnVtVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sSURBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sSURSRUZBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5YbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sSmF2YVR5cGVBZGFwdGVyc0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5YbWxMaXN0QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbE1pbWVUeXBlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbE1peGVkQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbFJlZ2lzdHJ5QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbFNjaGVtYUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5YbWxTY2hlbWFUeXBlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbFNjaGVtYVR5cGVzQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbFNlZUFsc29Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sVHJhbnNpZW50QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbFR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmpheGJpbmRleC5KYXhiSW5kZXhSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXhicHJvcHMuSmF4YlByb3BlcnRpZXNSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uCi0JCWV4dGVuZHMgIEFic3RyYWN0SmF4YlBsYXRmb3JtRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBHZW5lcmljSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCXByb3RlY3RlZCBHZW5lcmljSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBHZW5lcmljSmF4YlBsYXRmb3JtLlZFUlNJT05fMl8xOwotCX0KLQkKLQlwdWJsaWMgSmF4YkZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIEdlbmVyaWNKYXhiXzJfMV9GYWN0b3J5Lmluc3RhbmNlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBTdHJpbmc+IGJ1aWxkSmF2YVRvU2NoZW1hVHlwZXMoKSB7Ci0JCU1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCW1hcC5wdXQoImJvb2xlYW4iLCAiYm9vbGVhbiIpOwotCQltYXAucHV0KCJqYXZhLmxhbmcuQm9vbGVhbiIsICJib29sZWFuIik7Ci0JCW1hcC5wdXQoImJ5dGUiLCAiYnl0ZSIpOwotCQltYXAucHV0KCJqYXZhLmxhbmcuQnl0ZSIsICJieXRlIik7Ci0JCW1hcC5wdXQoInNob3J0IiwgInNob3J0Iik7Ci0JCW1hcC5wdXQoImphdmEubGFuZy5TaG9ydCIsICJzaG9ydCIpOwotCQltYXAucHV0KCJpbnQiLCAiaW50Iik7Ci0JCW1hcC5wdXQoImphdmEubGFuZy5JbnRlZ2VyIiwgImludCIpOwotCQltYXAucHV0KCJsb25nIiwgImxvbmciKTsKLQkJbWFwLnB1dCgiamF2YS5sYW5nLkxvbmciLCAibG9uZyIpOwotCQltYXAucHV0KCJmbG9hdCIsICJmbG9hdCIpOwotCQltYXAucHV0KCJqYXZhLmxhbmcuRmxvYXQiLCAiZmxvYXQiKTsKLQkJbWFwLnB1dCgiZG91YmxlIiwgImRvdWJsZSIpOwotCQltYXAucHV0KCJqYXZhLmxhbmcuRG91YmxlIiwgImRvdWJsZSIpOwotCQltYXAucHV0KCJqYXZhLmxhbmcuU3RyaW5nIiwgInN0cmluZyIpOwotCQltYXAucHV0KCJqYXZhLm1hdGguQmlnSW50ZWdlciIsICJpbnRlZ2VyIik7Ci0JCW1hcC5wdXQoImphdmEubWF0aC5CaWdEZWNpbWFsIiwgImRlY2ltYWwiKTsKLQkJbWFwLnB1dCgiamF2YS51dGlsLkNhbGVuZGFyIiwgImRhdGVUaW1lIik7Ci0JCW1hcC5wdXQoImphdmEudXRpbC5EYXRlIiwgImRhdGVUaW1lIik7Ci0JCW1hcC5wdXQoImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUiLCAiUU5hbWUiKTsKLQkJbWFwLnB1dCgiamF2YS5uZXQuVVJJIiwgInN0cmluZyIpOwotCQltYXAucHV0KCJqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXIiLCAiYW55U2ltcGxlVHlwZSIpOwotCQltYXAucHV0KCJqYXZheC54bWwuZGF0YXR5cGUuRHVyYXRpb24iLCAiZHVyYXRpb24iKTsKLQkJbWFwLnB1dCgiamF2YS5sYW5nLk9iamVjdCIsICJhbnlUeXBlIik7Ci0JCW1hcC5wdXQoImphdmEuYXd0LkltYWdlIiwgImJhc2U2NEJpbmFyeSIpOwotCQltYXAucHV0KCJqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyIiwgImJhc2U2NEJpbmFyeSIpOwotCQltYXAucHV0KCJqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSIsICJiYXNlNjRCaW5hcnkiKTsKLQkJbWFwLnB1dCgiamF2YS51dGlsLlVVSUQiLCAic3RyaW5nIik7Ci0JCXJldHVybiBtYXA7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gYnVpbGRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzKCkgewotCQkvLyBvcmRlciBzaG91bGQgbm90IGJlIGltcG9ydGFudCBoZXJlCi0JCXJldHVybiBuZXcgSmF4YlJlc291cmNlTW9kZWxQcm92aWRlcltdIHsKLQkJCUphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCUphdmFQYWNrYWdlSW5mb1Jlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJSmF4YkluZGV4UmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlKYXhiUHJvcGVydGllc1Jlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpfTsKLQl9Ci0JCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRNb3N0UmVjZW50U3VwcG9ydGVkUmVzb3VyY2VUeXBlKElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9QQUNLQUdFX0lORk9fQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfUEFDS0FHRV9JTkZPX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjb250ZW50VHlwZS50b1N0cmluZygpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb25EZWZpbml0aW9uW10gYnVpbGRBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGlvbkRlZmluaXRpb25bXSB7Ci0JCQkJWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQkJWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJCVhtbEFueUVsZW1lbnRBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJCVhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJCVhtbEF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQkJWG1sRWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQkJWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJCVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxFbGVtZW50c0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQkJWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJCVhtbEVudW1Bbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJCVhtbEVudW1WYWx1ZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQkJWG1sSURBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJCVhtbElEUkVGQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxKYXZhVHlwZUFkYXB0ZXJzQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxMaXN0QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxNaW1lVHlwZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQkJWG1sTWl4ZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJCVhtbFJlZ2lzdHJ5QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxSb290RWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQkJWG1sU2NoZW1hQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxTY2hlbWFUeXBlc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQkJWG1sU2VlQWxzb0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQkJWG1sVHJhbnNpZW50QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbltdIGJ1aWxkTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbltdIHsKLQkJCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVhtbEVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVhtbEVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFYbWxFbGVtZW50UmVmTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFYbWxFbGVtZW50c01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVhtbFRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVhtbFZhbHVlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvamF4YjIxL0dlbmVyaWNKYXhiXzJfMV9QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9qYXhiMjEvR2VuZXJpY0pheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThhMjM1Yi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9qYXhiMjEvR2VuZXJpY0pheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5qYXhiMjE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkKLQkJaW1wbGVtZW50cyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeSB7Ci0KLQlwdWJsaWMgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBidWlsZEpheGJQbGF0Zm9ybURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBHZW5lcmljSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvamF4YjIyL0dlbmVyaWNKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2pheGIyMi9HZW5lcmljSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZGY5ZTIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvamF4YjIyL0dlbmVyaWNKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5qYXhiMjI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkdlbmVyaWNKYXhiUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmpheGIyMS5HZW5lcmljSmF4Yl8yXzFfRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmpheGIyMS5HZW5lcmljSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uCi0JCWV4dGVuZHMgR2VuZXJpY0pheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBHZW5lcmljSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCXByb3RlY3RlZCBHZW5lcmljSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBHZW5lcmljSmF4YlBsYXRmb3JtLlZFUlNJT05fMl8yOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YkZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIEdlbmVyaWNKYXhiXzJfMV9GYWN0b3J5Lmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvamF4YjIyL0dlbmVyaWNKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9qYXhiMjIvR2VuZXJpY0pheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ5NDRlNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9qYXhiMjIvR2VuZXJpY0pheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5qYXhiMjI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkKLQkJaW1wbGVtZW50cyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeSB7Ci0KLQlwdWJsaWMgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBidWlsZEpheGJQbGF0Zm9ybURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBHZW5lcmljSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9saWJwcm92L0pheGJKcmVMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9saWJwcm92L0pheGJKcmVMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZDA4ZjguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvbGlicHJvdi9KYXhiSnJlTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmxpYnByb3Y7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJ2YWwuTGlicmFyeVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmxpYnByb3YuSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci0KLQotcHVibGljIGNsYXNzIEpheGJKcmVMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnCi0JCWV4dGVuZHMgTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZwotCQlpbXBsZW1lbnRzIEpheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIHsKLQkKLQlwcml2YXRlIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGpheGJQbGF0Zm9ybTsKLQkKLQkKLQlwdWJsaWMgSmF4YkpyZUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXRKYXhiUGxhdGZvcm0oKSB7Ci0JCXJldHVybiB0aGlzLmpheGJQbGF0Zm9ybTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SmF4YlBsYXRmb3JtKEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGpheGJQbGF0Zm9ybSkgewotCQlKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBvbGQgPSB0aGlzLmpheGJQbGF0Zm9ybTsKLQkJdGhpcy5qYXhiUGxhdGZvcm0gPSBqYXhiUGxhdGZvcm07Ci0JCWlmIChvbGQgIT0gamF4YlBsYXRmb3JtKSB7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoUFJPUF9KQVhCX1BMQVRGT1JNLCBvbGQsIGpheGJQbGF0Zm9ybSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RhdHVzIHZhbGlkYXRlKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnZhbGlkYXRlKCk7Ci0JCWlmICghIHN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJCi0JCWZvciAoTGlicmFyeVZhbGlkYXRvciBsaWJyYXJ5VmFsaWRhdG9yIDogSnB0Q29tbW9uQ29yZVBsdWdpbi5nZXRMaWJyYXJ5VmFsaWRhdG9ycyh0aGlzKSkgewotCQkJc3RhdHVzID0gbGlicmFyeVZhbGlkYXRvci52YWxpZGF0ZSh0aGlzKTsKLQkJCWlmICghIHN0YXR1cy5pc09LKCkpIHsKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9saWJwcm92L0pheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnQWRhcHRlckZhY3RvcnkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2xpYnByb3YvSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWdBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmVkZTcyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2xpYnByb3YvSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWdBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmxpYnByb3Y7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUubGlicHJvdi5KYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotCi0vKioKLSAqIEZhY3RvcnkgdG8gYnVpbGQgRGFsaSBhZGFwdGVycyBmb3IgYW4ge0BsaW5rIEpheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnfTo8dWw+Ci0gKiA8bGk+e0BsaW5rIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9ufQotICogPC91bD4KLSAqIFNlZSA8Y29kZT5vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3BsdWdpbi54bWw8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWdBZGFwdGVyRmFjdG9yeQotCWltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz5bXSBBREFQVEVSX0xJU1QgPSBuZXcgQ2xhc3NbXSB7Ci0JCQlKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbi5jbGFzcwotCQl9OwotCi0JcHVibGljIENsYXNzPD8+W10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBBREFQVEVSX0xJU1Q7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBKYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZykgewotCQkJcmV0dXJuIHRoaXMuZ2V0QWRhcHRlcigoSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcpIGFkYXB0YWJsZU9iamVjdCwgYWRhcHRlclR5cGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIE9iamVjdCBnZXRBZGFwdGVyKEpheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGNvbmZpZywgQ2xhc3M8Pz4gYWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0ZXJUeXBlID09IEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uLmNsYXNzKSB7Ci0JCQlyZXR1cm4gY29uZmlnLmdldEpheGJQbGF0Zm9ybSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2xpYnByb3YvSmF4Yk9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvbGlicHJvdi9KYXhiT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNjc2OTkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvbGlicHJvdi9KYXhiT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwubGlicHJvdjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5saWJwcm92LkpwdE9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmxpYnByb3YuSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgSmF4Yk9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZwotCQlleHRlbmRzIEpwdE9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZwotCQlpbXBsZW1lbnRzIEpheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIHsKLQkKLQlwcml2YXRlIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGpheGJQbGF0Zm9ybTsKLQkKLQkKLQlwdWJsaWMgSmF4Yk9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGdldEpheGJQbGF0Zm9ybSgpIHsKLQkJcmV0dXJuIHRoaXMuamF4YlBsYXRmb3JtOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRKYXhiUGxhdGZvcm0oSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gamF4YlBsYXRmb3JtKSB7Ci0JCUpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIG9sZCA9IHRoaXMuamF4YlBsYXRmb3JtOwotCQl0aGlzLmpheGJQbGF0Zm9ybSA9IGpheGJQbGF0Zm9ybTsKLQkJbm90aWZ5TGlzdGVuZXJzKFBST1BfSkFYQl9QTEFURk9STSwgb2xkLCBqYXhiUGxhdGZvcm0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2xpYnByb3YvSmF4YlVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9saWJwcm92L0pheGJVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTM0OWNhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2xpYnByb3YvSmF4YlVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwubGlicHJvdjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5saWJwcm92LkpwdFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUubGlicHJvdi5KYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF4YlVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnCi0JCWV4dGVuZHMgSnB0VXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcKLQkJaW1wbGVtZW50cyBKYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyB7Ci0JCi0JcHJpdmF0ZSBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBqYXhiUGxhdGZvcm07Ci0JCi0JCi0JcHVibGljIEpheGJVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGdldEpheGJQbGF0Zm9ybSgpIHsKLQkJcmV0dXJuIHRoaXMuamF4YlBsYXRmb3JtOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRKYXhiUGxhdGZvcm0oSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gamF4YlBsYXRmb3JtKSB7Ci0JCUpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIG9sZCA9IHRoaXMuamF4YlBsYXRmb3JtOwotCQl0aGlzLmpheGJQbGF0Zm9ybSA9IGpheGJQbGF0Zm9ybTsKLQkJbm90aWZ5TGlzdGVuZXJzKFBST1BfSkFYQl9QTEFURk9STSwgb2xkLCBqYXhiUGxhdGZvcm0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2xpYnZhbC9HZW5lcmljRWNsaXBzZUxpbmtCdW5kbGVzTGlicmFyeVZhbGlkYXRvci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvbGlidmFsL0dlbmVyaWNFY2xpcHNlTGlua0J1bmRsZXNMaWJyYXJ5VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzBmYzMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvbGlidmFsL0dlbmVyaWNFY2xpcHNlTGlua0J1bmRsZXNMaWJyYXJ5VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwubGlidmFsOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljRWNsaXBzZUxpbmtCdW5kbGVzTGlicmFyeVZhbGlkYXRvciAKLS8vCQlleHRlbmRzIEFic3RyYWN0T3NnaUJ1bmRsZXNMaWJyYXJ5VmFsaWRhdG9yIAotCQl7Ci0JCi0vLwlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShKcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGNvbmZpZykgewotLy8JCUpwYU9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBqcGFDb25maWcgCi0vLwkJCQk9IChKcGFPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcpIGNvbmZpZzsKLS8vCQlNYXA8U3RyaW5nLCBWZXJzaW9uUmFuZ2VbXT4gYnVuZGxlVmVyc2lvblJhbmdlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVmVyc2lvblJhbmdlW10+KCk7Ci0vLwkJU3RyaW5nIGJ1bmRsZU5hbWUgPSAiamF2YXgucGVyc2lzdGVuY2UiOyAvLyROT04tTkxTLTEkCi0vLwkJVmVyc2lvblJhbmdlW10gdmVyc2lvblJhbmdlcyA9IG5ldyBWZXJzaW9uUmFuZ2VbMF07Ci0vLwkJaWYgKGNvbmZpZy5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkuZXF1YWxzKEpwYUZhY2V0LlZFUlNJT05fMV8wKSkgewotLy8JCQl2ZXJzaW9uUmFuZ2VzID0gbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMS4wLCAzLjApIil9OyAvLyROT04tTkxTLTEkCi0vLwkJfQotLy8JCWVsc2UgaWYgKGNvbmZpZy5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkuZXF1YWxzKEpwYUZhY2V0LlZFUlNJT05fMl8wKSkgewotLy8JCQl2ZXJzaW9uUmFuZ2VzID0gbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMi4wLCAzLjApIil9OyAvLyROT04tTkxTLTEkCi0vLwkJfQotLy8JCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KGJ1bmRsZU5hbWUsIHZlcnNpb25SYW5nZXMpOwotLy8JCXJldHVybiB2YWxpZGF0ZShqcGFDb25maWcsIGJ1bmRsZVZlcnNpb25SYW5nZXMpOwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvbGlidmFsL0dlbmVyaWNKYXhiVXNlckxpYnJhcnlWYWxpZGF0b3IuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2xpYnZhbC9HZW5lcmljSmF4YlVzZXJMaWJyYXJ5VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YWJlMTEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvbGlidmFsL0dlbmVyaWNKYXhiVXNlckxpYnJhcnlWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmxpYnZhbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5saWJ2YWwuTGliVmFsVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlicHJvdi5KcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJ2YWwuTGlicmFyeVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KcHRKYXhiQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLkpwdEpheGJDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5saWJwcm92LkpheGJVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pheGJVc2VyTGlicmFyeVZhbGlkYXRvcgotCQlpbXBsZW1lbnRzIExpYnJhcnlWYWxpZGF0b3IgewotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0YXR1cyB2YWxpZGF0ZShKcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGNvbmZpZykgewotCQkKLQkJSmF4YlVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGpheGJDb25maWcgCi0JCQkJPSAoSmF4YlVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnKSBjb25maWc7Ci0JCQotCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBqYXhiVmVyc2lvbiA9IGNvbmZpZy5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCk7Ci0JCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGphdmFWZXJzaW9uID0gSmF4YkxpYlZhbFV0aWwuZ2V0SmF2YVZlcnNpb24oamF4YkNvbmZpZyk7Ci0JCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGphdmFKYXhiVmVyc2lvbiA9IEpheGJMaWJWYWxVdGlsLmZpbmRKYXZhSmF4YlZlcnNpb24oamF4YkNvbmZpZyk7Ci0JCQotCQlJdGVyYWJsZTxJUGF0aD4gbGlicmFyeVBhdGhzID0gCi0JCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SUNsYXNzcGF0aEVudHJ5LCBJUGF0aD4oamF4YkNvbmZpZy5yZXNvbHZlKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJUGF0aCB0cmFuc2Zvcm0oSUNsYXNzcGF0aEVudHJ5IG8pIHsKLQkJCQkJCXJldHVybiBvLmdldFBhdGgoKTsKLQkJCQkJfQotCQkJCX07Ci0JCQotCQkvLyBkZXYtdGltZSBwb3J0aW9uIG9mIHZhbGlkYXRpb24gLSBlcnJvciBpZiBhY3R1YWwgamF2YSBsaWJyYXJ5ICpjb25mbGljdHMgd2l0aCogamF4YiBmYWNldAotCQkvLyBvciBpZiBsaWJyYXJ5IGRvZXMgbm90IHByb3ZpZGUgc3VwcGxlbWVudGFsIGNsYXNzZXMKLQkJCi0JCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGpyZUpheGJWZXJzaW9uID0gSmF4YkxpYlZhbFV0aWwuZmluZEpyZUpheGJWZXJzaW9uKGpheGJDb25maWcpOwotCQkKLQkJLy8gbnVsbCBoZXJlIGltcGxpZXMgc29tZXRoaW5nIHByaW9yIHRvIGpheGIgMi4xCi0JCWlmIChqcmVKYXhiVmVyc2lvbiAhPSBudWxsKSB7Ci0JCQlpZiAoanJlSmF4YlZlcnNpb24uY29tcGFyZVRvKGpheGJWZXJzaW9uKSA8IDApIHsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkJSnB0SmF4YkNvcmVNZXNzYWdlcy5Vc2VyTGlicmFyeVZhbGlkYXRvcl9pbmNvbXBhdGlibGVKYXZhTGlicmFyeSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7amF4YlZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpfSk7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0SmF4YkNvcmVQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKLQkJCX0KLQkJfQotCQkvLyBpZiBqcmUgaXMgZW5vdWdoIGZvciBqYXhiIHZlcnNpb24sIHdlIGRvbid0IGxvb2sgZm9yIGNsYXNzZXMgaW4gdGhlIGxpYnJhcnkKLQkJZWxzZSB7Ci0JCQlTZXQ8U3RyaW5nPiBjbGFzc05hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQotCQkJY2xhc3NOYW1lcy5hZGQoImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2VlQWxzbyIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoamF4YlZlcnNpb24uY29tcGFyZVRvKEpheGJGYWNldC5WRVJTSU9OXzJfMikgPj0gMCkgewotCQkJCWNsYXNzTmFtZXMuYWRkKCJqYXZheC54bWwuYmluZC5KQVhCUGVybWlzc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCUlTdGF0dXMgc3RhdHVzID0gTGliVmFsVXRpbC52YWxpZGF0ZShsaWJyYXJ5UGF0aHMsIGNsYXNzTmFtZXMpOwotCQkJCi0JCQlpZiAoISBzdGF0dXMuaXNPSygpKSB7Ci0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0KLQkJfQotCQkKLQkJLy8gcnVudGltZSBwb3J0aW9uIG9mIHZhbGlkYXRpb24gLSB3YXJuIGlmIGphdmEgZmFjZXQgaXMgaW5zdWZmaWNpZW50IHRvIHByb3ZpZGUgamF4YiBhcGkuCi0JCS8vIHVzZXIgbWF5IG92ZXJyaWRlIGltcGxlbWVudGF0aW9uIG1hbnVhbGx5LCBob3dldmVyCi0JCS8vIGFzc3VtZSAxLjYgcnVudGltZSBlbnZpcm9ucyBhcmUgbGF0ZXN0ICh3aXRoIGpheGIgMi4xLCBub3QgMi4wKQotCQkKLQkJLy8gbnVsbCBoZXJlIGltcGxpZXMgc29tZXRoaW5nIHByaW9yIHRvIGpheGIgMi4xCi0JCWlmIChqYXZhSmF4YlZlcnNpb24gIT0gbnVsbCAmJiBqYXZhSmF4YlZlcnNpb24uY29tcGFyZVRvKGpheGJWZXJzaW9uKSA8IDApIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoCi0JCQkJCUpwdEpheGJDb3JlTWVzc2FnZXMuVXNlckxpYnJhcnlWYWxpZGF0b3JfaW5jb21wYXRpYmxlSmF2YUZhY2V0LAotCQkJCQluZXcgU3RyaW5nW10ge2phdmFWZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKSwgamF4YlZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpfSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEpwdEpheGJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2xpYnZhbC9KYXhiSnJlTGlicmFyeVZhbGlkYXRvci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvbGlidmFsL0pheGJKcmVMaWJyYXJ5VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MDFkYTMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvbGlidmFsL0pheGJKcmVMaWJyYXJ5VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwubGlidmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlicHJvdi5KcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJ2YWwuTGlicmFyeVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkdlbmVyaWNKYXhiUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KcHRKYXhiQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLkpwdEpheGJDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5saWJwcm92LkpheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLQotcHVibGljIGNsYXNzIEpheGJKcmVMaWJyYXJ5VmFsaWRhdG9yCi0JCWltcGxlbWVudHMgTGlicmFyeVZhbGlkYXRvciB7Ci0JCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBjb25maWcpIHsKLQkJCi0JCUpheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGpheGJDb25maWcgCi0JCQkJPSAoSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcpIGNvbmZpZzsKLQkJCi0JCWlmICghIGpheGJDb25maWcuZ2V0SmF4YlBsYXRmb3JtKCkuZ2V0R3JvdXAoKS5lcXVhbHMoR2VuZXJpY0pheGJQbGF0Zm9ybS5HUk9VUCkpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdEpheGJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgSnB0SmF4YkNvcmVNZXNzYWdlcy5KcmVMaWJyYXJ5VmFsaWRhdG9yX2ludmFsaWRQbGF0Zm9ybSk7Ci0JCX0KLQkJCi0JCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGpheGJWZXJzaW9uID0gY29uZmlnLmdldFByb2plY3RGYWNldFZlcnNpb24oKTsKLQkJSVByb2plY3RGYWNldFZlcnNpb24gamF2YVZlcnNpb24gPSBKYXhiTGliVmFsVXRpbC5nZXRKYXZhVmVyc2lvbihqYXhiQ29uZmlnKTsKLQkJSVByb2plY3RGYWNldFZlcnNpb24gamF2YUpheGJWZXJzaW9uID0gSmF4YkxpYlZhbFV0aWwuZmluZEphdmFKYXhiVmVyc2lvbihqYXhiQ29uZmlnKTsKLQkJCi0JCS8vIGRldi10aW1lIHBvcnRpb24gb2YgdmFsaWRhdGlvbiAtIGVycm9yIGlmIGFjdHVhbCBqYXZhIGxpYnJhcnkgZG9lcyBub3Qgc3VwcG9ydCBqYXhiIGZhY2V0Ci0JCQotCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBqcmVKYXhiVmVyc2lvbiA9IEpheGJMaWJWYWxVdGlsLmZpbmRKcmVKYXhiVmVyc2lvbihqYXhiQ29uZmlnKTsKLQkJCi0JCS8vIG51bGwgaGVyZSBpbXBsaWVzIHNvbWV0aGluZyBwcmlvciB0byBqYXhiIDIuMQotCQlpZiAoanJlSmF4YlZlcnNpb24gPT0gbnVsbCB8fCBqcmVKYXhiVmVyc2lvbi5jb21wYXJlVG8oamF4YlZlcnNpb24pIDwgMCkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZCgKLQkJCQkJSnB0SmF4YkNvcmVNZXNzYWdlcy5KcmVMaWJyYXJ5VmFsaWRhdG9yX2ludmFsaWRKYXZhTGlicmFyeSwKLQkJCQkJbmV3IFN0cmluZ1tdIHtqYXhiVmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCl9KTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdEpheGJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JCX0KLQkJCi0JCS8vIHJ1bnRpbWUgcG9ydGlvbiBvZiB2YWxpZGF0aW9uIC0gd2FybiBpZiBqYXZhIGZhY2V0IGlzIGluc3VmZmljaWVudCB0byBwcm92aWRlIGpheGIgYXBpLgotCQkvLyB1c2VyIG1heSBvdmVycmlkZSBpbXBsZW1lbnRhdGlvbiBtYW51YWxseSwgaG93ZXZlcgotCQkvLyBhc3N1bWUgMS42IHJ1bnRpbWUgZW52aXJvbnMgYXJlIGxhdGVzdCAod2l0aCBqYXhiIDIuMSwgbm90IDIuMCkKLQkJCi0JCS8vIG51bGwgaGVyZSBpbXBsaWVzIHNvbWV0aGluZyBwcmlvciB0byBqYXhiIDIuMQotCQlpZiAoamF2YUpheGJWZXJzaW9uID09IG51bGwgfHwgamF2YUpheGJWZXJzaW9uLmNvbXBhcmVUbyhqYXhiVmVyc2lvbikgPCAwKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQlKcHRKYXhiQ29yZU1lc3NhZ2VzLkpyZUxpYnJhcnlWYWxpZGF0b3JfaW52YWxpZEphdmFGYWNldCwKLQkJCQkJbmV3IFN0cmluZ1tdIHtqYXZhVmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCksIGpheGJWZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKX0pOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBKcHRKYXhiQ29yZVBsdWdpbi5QTFVHSU5fSUQsIG1lc3NhZ2UpOwotCQl9Ci0JCQotCQkvLyBUT0RPIC0gY2hlY2sgZm9yIHhqYyBjbGFzc2VzIHdoZW4gd2Ugc3VwcG9ydCBqZGsgdmVyc2lvbiBvZiB4amMKLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2xpYnZhbC9KYXhiTGliVmFsVXRpbC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvbGlidmFsL0pheGJMaWJWYWxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNWQwYWIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvbGlidmFsL0pheGJMaWJWYWxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmxpYnZhbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGwyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkxpYnJhcnlMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUubGlicHJvdi5KYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5KYXZhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuU3RhbmRhcmRKcmVSdW50aW1lQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudDsKLQotCi1wdWJsaWMgY2xhc3MgSmF4YkxpYlZhbFV0aWwgewotCQotCXN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRKYXZhVmVyc2lvbihKYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBjb25maWcpIHsKLQkJcmV0dXJuIGNvbmZpZy5nZXRGYWNldGVkUHJvamVjdCgpLmdldFByb2plY3RGYWNldFZlcnNpb24oSmF2YUZhY2V0LkZBQ0VUKTsKLQl9Ci0JCi0JLyoqIAotCSAqIFJldHVybiBqYXhiIHZlcnNpb24gZGV0ZXJtaW5lZCBieSBqYXZhIGZhY2V0IHZlcnNpb24uCi0JICogQXNzdW1lIGhpZ2hlc3QgdXBkYXRlIG9mIGphdmEgKGkuZS4gamF2YSAxLjYgbWFwcyB0byBqYXhiIDIuMSkKLQkgKi8KLQlzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZmluZEphdmFKYXhiVmVyc2lvbihKYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBjb25maWcpIHsKLQkJSVByb2plY3RGYWNldFZlcnNpb24gamF2YVZlcnNpb24gPSBnZXRKYXZhVmVyc2lvbihjb25maWcpOwotCQkKLQkJaWYgKGphdmFWZXJzaW9uID09IEphdmFGYWNldC5WRVJTSU9OXzFfNikgewotCQkJcmV0dXJuIEpheGJGYWNldC5WRVJTSU9OXzJfMTsKLQkJfQotCQllbHNlIGlmIChqYXZhVmVyc2lvbiA9PSBKYXZhRmFjZXQuVkVSU0lPTl8xXzcpIHsKLQkJCXJldHVybiBKYXhiRmFjZXQuVkVSU0lPTl8yXzI7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZmluZEpyZUpheGJWZXJzaW9uKEpheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGNvbmZpZykgewotCQlJUnVudGltZSBydW50aW1lID0gY29uZmlnLmdldEZhY2V0ZWRQcm9qZWN0KCkuZ2V0UHJpbWFyeVJ1bnRpbWUoKTsKLQkJCi0JCWlmIChydW50aW1lICE9IG51bGwpIHsKLQkJCWZvciAoSVJ1bnRpbWVDb21wb25lbnQgcmMgOiBydW50aW1lLmdldFJ1bnRpbWVDb21wb25lbnRzKCkpIHsKLQkJCQlJVk1JbnN0YWxsIHZtID0gZmluZFZNSW5zdGFsbChyYyk7Ci0JCQkJaWYgKHZtICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZpbmRKcmVKYXhiVmVyc2lvbih2bSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlJVk1JbnN0YWxsIHZtID0gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdFZNSW5zdGFsbCgpOwotCQkKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGNvbmZpZy5nZXRGYWNldGVkUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7CQotCQkJdHJ5IHsKLQkJCQl2bSA9IEphdmFSdW50aW1lLmdldFZNSW5zdGFsbChqYXZhUHJvamVjdCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCS8vIGRvIG5vdGhpbmcsIGp1c3QgdXNlIHRoZSBkZWZhdWx0IGluc3RhbGwKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHZtICE9IG51bGwpIHsKLQkJCXJldHVybiBmaW5kSnJlSmF4YlZlcnNpb24odm0pOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSVZNSW5zdGFsbCBmaW5kVk1JbnN0YWxsKElSdW50aW1lQ29tcG9uZW50IHJjKSB7Ci0JCVN0cmluZyB2bUluc3RhbGxUeXBlSWQgCi0JCQk9IHJjLmdldFByb3BlcnR5KFN0YW5kYXJkSnJlUnVudGltZUNvbXBvbmVudC5QUk9QX1ZNX0lOU1RBTExfVFlQRSk7Ci0JCVN0cmluZyB2bUluc3RhbGxJZAotCQkJPSByYy5nZXRQcm9wZXJ0eShTdGFuZGFyZEpyZVJ1bnRpbWVDb21wb25lbnQuUFJPUF9WTV9JTlNUQUxMX0lEKTsKLQkJCi0JCWlmICh2bUluc3RhbGxUeXBlSWQgPT0gbnVsbCB8fCB2bUluc3RhbGxJZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJSVZNSW5zdGFsbFR5cGUgdm1JbnN0YWxsVHlwZSA9IEphdmFSdW50aW1lLmdldFZNSW5zdGFsbFR5cGUodm1JbnN0YWxsVHlwZUlkKTsKLQkJCi0JCWlmKCB2bUluc3RhbGxUeXBlID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuIHZtSW5zdGFsbFR5cGUuZmluZFZNSW5zdGFsbCh2bUluc3RhbGxJZCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZpbmRKcmVKYXhiVmVyc2lvbihJVk1JbnN0YWxsIHZtKSB7Ci0JCWlmICh2bSBpbnN0YW5jZW9mIElWTUluc3RhbGwyKSB7Ci0JCQlTdHJpbmcgamF2YVZlcnNpb24gPSAoKElWTUluc3RhbGwyKSB2bSkuZ2V0SmF2YVZlcnNpb24oKTsKLQkJCWlmIChqYXZhVmVyc2lvbiAhPSBudWxsKSB7Ci0JCQkJLy8gYWxsIG90aGVyIHZlcnNpb25zIGV4Y2VwdCAxLjcgYW5kIDEuNiBoYXZlIG5vIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiAoYXMgb2YgeWV0KQotCQkJCWlmIChqYXZhVmVyc2lvbi5zdGFydHNXaXRoKEphdmFDb3JlLlZFUlNJT05fMV83KSkgewotCQkJCQlyZXR1cm4gSmF4YkZhY2V0LlZFUlNJT05fMl8yOwotCQkJCX0KLQkJCQkvLyAxLjYgbXVzdCBiZSBmdXJ0aGVyIGFuYWx5emVkCi0JCQkJaWYgKCEgamF2YVZlcnNpb24uc3RhcnRzV2l0aChKYXZhQ29yZS5WRVJTSU9OXzFfNikpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlJdGVyYWJsZTxJUGF0aD4gdm1MaWJQYXRocyAKLQkJCT0gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8TGlicmFyeUxvY2F0aW9uLCBJUGF0aD4oCi0JCQkJCW5ldyBBcnJheUl0ZXJhYmxlPExpYnJhcnlMb2NhdGlvbj4oSmF2YVJ1bnRpbWUuZ2V0TGlicmFyeUxvY2F0aW9ucyh2bSkpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIElQYXRoIHRyYW5zZm9ybShMaWJyYXJ5TG9jYXRpb24gbykgewotCQkJCQlyZXR1cm4gby5nZXRTeXN0ZW1MaWJyYXJ5UGF0aCgpOwotCQkJCX0KLQkJCX07Ci0JCQotCQlib29sZWFuIGZvdW5kWG1sU2VlQWxzbyA9IGZhbHNlOyAgLy8gbWFya2VyIGZvciBqYXhiIDIuMSArCi0JCWJvb2xlYW4gZm91bmRKQVhCUGVybWlzc2lvbiA9IGZhbHNlOyAgLy8gbWFya2VyIGZvciBqYXhiIDIuMiArCi0JCQotCQlmb3IgKElQYXRoIHZtTGliUGF0aCA6IHZtTGliUGF0aHMpIHsKLQkJCUZpbGUgZmlsZSA9IHZtTGliUGF0aC50b0ZpbGUoKTsKLQkJCQotCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQlaaXBGaWxlIHppcCA9IG51bGw7Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJemlwID0gbmV3IFppcEZpbGUoZmlsZSk7Ci0JCQkJCQotCQkJCQlmb3VuZFhtbFNlZUFsc28gfD0gemlwLmdldEVudHJ5KCJqYXZheC94bWwvYmluZC9hbm5vdGF0aW9uL1htbFNlZUFsc28uY2xhc3MiKSAhPSBudWxsOwotCQkJCQlmb3VuZEpBWEJQZXJtaXNzaW9uIHw9IHppcC5nZXRFbnRyeSgiamF2YXgveG1sL2JpbmQvSkFYQlBlcm1pc3Npb24uY2xhc3MiKSAhPSBudWxsOwotCQkJCQkKLQkJCQkJLy8gc2hvcnQgY2lyY3VpdCBmb3IgSkFYQiAyLjIKLQkJCQkJaWYgKGZvdW5kSkFYQlBlcm1pc3Npb24pIHsKLQkJCQkJCXJldHVybiBKYXhiRmFjZXQuVkVSU0lPTl8yXzI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmICh6aXAgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl6aXAuY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAoZm91bmRYbWxTZWVBbHNvKSB7Ci0JCQlyZXR1cm4gSmF4YkZhY2V0LlZFUlNJT05fMl8xOwotCQl9Ci0JCQkJCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL1NjaGVtYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL1NjaGVtYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NWJhNDYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9TY2hlbWFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuQWJzdHJhY3RKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLQotLyoqCi0gKiAgU2NoZW1hRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIFNjaGVtYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcgotewotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmlsZU5hbWUoKSB7Ci0JCWlmKHRoaXMuZ2V0UHJvamVjdCgpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmVzdCBndWVzcyBzb3VyY2UgbG9jYXRpb24gZm9yIHRoZSBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElDb250YWluZXIgZ2V0RGVmYXVsdENvbnRhaW5lcigpIHsKLQkJSUNvbnRhaW5lciBkZWZhdWx0Q29udGFpbmVyID0gc3VwZXIuZ2V0RGVmYXVsdENvbnRhaW5lcigpOwotCQlpZihkZWZhdWx0Q29udGFpbmVyICE9IG51bGwpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHRoaXMubW9kZWwuZ2V0UHJvcGVydHkoUFJPSkVDVCk7Ci0JCQlyZXR1cm4gZGVmYXVsdENvbnRhaW5lci5nZXRGb2xkZXIocHJvamVjdC5nZXRMb2NhdGlvbigpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbkltcGwuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0pheGJQbGF0Zm9ybURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2E2MDQ4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0pheGJQbGF0Zm9ybURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlhQb2ludFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb25JbXBsCi0JCWltcGxlbWVudHMgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gewotCQotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCXByaXZhdGUgU3RyaW5nIGZhY3RvcnlDbGFzc05hbWU7Ci0JcHJpdmF0ZSBJUHJvamVjdEZhY2V0VmVyc2lvbiBqYXhiRmFjZXRWZXJzaW9uOwotCXByaXZhdGUgYm9vbGVhbiBkZWZhdWx0XyA9IGZhbHNlOwotCXByaXZhdGUgSmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbkltcGwgZ3JvdXA7Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIHRoaXMuaWQ7Ci0JfQotCQotCXZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsKLQkJcmV0dXJuIHRoaXMucGx1Z2luSWQ7Ci0JfQotCQotCXZvaWQgc2V0UGx1Z2luSWQoU3RyaW5nIHBsdWdpbklkKSB7Ci0JCXRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIHRoaXMubGFiZWw7Ci0JfQotCQotCXZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGYWN0b3J5Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5mYWN0b3J5Q2xhc3NOYW1lOwotCX0KLQkKLQl2b2lkIHNldEZhY3RvcnlDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQl0aGlzLmZhY3RvcnlDbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JfQotCQotCXB1YmxpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRKYXhiRmFjZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5qYXhiRmFjZXRWZXJzaW9uOwotCX0KLQkKLQl2b2lkIHNldEpheGJGYWNldFZlcnNpb24oSVByb2plY3RGYWNldFZlcnNpb24gamF4YkZhY2V0VmVyc2lvbikgewotCQlpZiAoISBqYXhiRmFjZXRWZXJzaW9uLmdldFByb2plY3RGYWNldCgpLmVxdWFscyhKYXhiRmFjZXQuRkFDRVQpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGpheGJGYWNldFZlcnNpb24udG9TdHJpbmcoKSk7Ci0JCX0KLQkJdGhpcy5qYXhiRmFjZXRWZXJzaW9uID0gamF4YkZhY2V0VmVyc2lvbjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNKYXhiRmFjZXRWZXJzaW9uKElQcm9qZWN0RmFjZXRWZXJzaW9uIGpheGJGYWNldFZlcnNpb24pIHsKLQkJaWYgKCEgamF4YkZhY2V0VmVyc2lvbi5nZXRQcm9qZWN0RmFjZXQoKS5lcXVhbHMoSmF4YkZhY2V0LkZBQ0VUKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihqYXhiRmFjZXRWZXJzaW9uLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiAodGhpcy5qYXhiRmFjZXRWZXJzaW9uICE9IG51bGwpID8gdGhpcy5qYXhiRmFjZXRWZXJzaW9uLmVxdWFscyhqYXhiRmFjZXRWZXJzaW9uKSA6IHRydWU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdF87Ci0JfQotCQotCXZvaWQgc2V0RGVmYXVsdChib29sZWFuIGRlZmF1bHRfKSB7Ci0JCXRoaXMuZGVmYXVsdF8gPSBkZWZhdWx0XzsKLQl9Ci0JCi0JcHVibGljIEpheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb24gZ2V0R3JvdXAoKSB7Ci0JCXJldHVybiB0aGlzLmdyb3VwOwotCX0KLQkKLQl2b2lkIHNldEdyb3VwKEpheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb25JbXBsIGdyb3VwKSB7Ci0JCXRoaXMuZ3JvdXAgPSBncm91cDsKLQl9Ci0JCi0JcHVibGljIEpheGJQbGF0Zm9ybURlZmluaXRpb24gYnVpbGRKYXhiUGxhdGZvcm1EZWZpbml0aW9uKCkgewotCQlKYXhiUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeSBmYWN0b3J5ID0gWFBvaW50VG9vbHMuaW5zdGFudGlhdGUoCi0JCQkJdGhpcy5wbHVnaW5JZCwgSmF4YlBsYXRmb3JtTWFuYWdlckltcGwuUVVBTElGSUVEX0VYVEVOU0lPTl9QT0lOVF9JRCwgCi0JCQkJdGhpcy5mYWN0b3J5Q2xhc3NOYW1lLCBKYXhiUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeS5jbGFzcyk7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF4YlBsYXRmb3JtRGVmaW5pdGlvbigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5sYWJlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uSW1wbC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vSmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNlODNhZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnBsYXRmb3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJJdGVyYWJsZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb247Ci0KLQotcHVibGljIGNsYXNzIEpheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb25JbXBsCi0JCWltcGxlbWVudHMgSmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbiB7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbkltcGw+IHBsYXRmb3JtczsKLQkKLQkKLQlKYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uSW1wbCgpIHsKLQkJdGhpcy5wbGF0Zm9ybXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uSW1wbD4oKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIHRoaXMuaWQ7Ci0JfQotCQotCXZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsKLQkJcmV0dXJuIHRoaXMucGx1Z2luSWQ7Ci0JfQotCQotCXZvaWQgc2V0UGx1Z2luSWQoU3RyaW5nIHBsdWdpbklkKSB7Ci0JCXRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIHRoaXMubGFiZWw7Ci0JfQotCQotCXZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0JCi0Jdm9pZCBhZGRQbGF0Zm9ybShKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbkltcGwgcGxhdGZvcm0pIHsKLQkJdGhpcy5wbGF0Zm9ybXMucHV0KHBsYXRmb3JtLmdldElkKCksIHBsYXRmb3JtKTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uPiBnZXRQbGF0Zm9ybXMoKSB7Ci0JCXJldHVybiBuZXcgU3VwZXJJdGVyYWJsZVdyYXBwZXI8SmF4YlBsYXRmb3JtRGVzY3JpcHRpb24+KENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMucGxhdGZvcm1zLnZhbHVlcygpKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmxhYmVsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0pheGJQbGF0Zm9ybUltcGwuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0pheGJQbGF0Zm9ybUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4YTIxYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuR2VuZXJpY0Fubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5QbGF0Zm9ybVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5EZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF4YlBsYXRmb3JtSW1wbAotCQlpbXBsZW1lbnRzIEpheGJQbGF0Zm9ybSB7Ci0JCi0JcHJpdmF0ZSBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIHBsYXRmb3JtRGVmaW5pdGlvbjsKLQkKLQlwcml2YXRlIEFubm90YXRpb25Qcm92aWRlciBhbm5vdGF0aW9uUHJvdmlkZXI7Ci0JCi0JCi0JcHVibGljIEpheGJQbGF0Zm9ybUltcGwoSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBqYXhiUGxhdGZvcm1EZWZpbml0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucGxhdGZvcm1EZWZpbml0aW9uID0gamF4YlBsYXRmb3JtRGVmaW5pdGlvbjsKLQkJdGhpcy5hbm5vdGF0aW9uUHJvdmlkZXIgPSBuZXcgR2VuZXJpY0Fubm90YXRpb25Qcm92aWRlcih0aGlzLnBsYXRmb3JtRGVmaW5pdGlvbi5nZXRBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSwgdGhpcy5wbGF0Zm9ybURlZmluaXRpb24uZ2V0TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSk7Ci0JfQotCQotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMucGxhdGZvcm1EZWZpbml0aW9uLmdldERlc2NyaXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGdldERlZmluaXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLnBsYXRmb3JtRGVmaW5pdGlvbjsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBmYWN0b3J5ICoqKioqKioqKioKLQotCXB1YmxpYyBKYXhiRmFjdG9yeSBnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybURlZmluaXRpb24uZ2V0RmFjdG9yeSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIEpBWEIgZmlsZS9yZXNvdXJjZSBtb2RlbHMgKioqKioqKioqKgotCi0JcHVibGljIEpheGJGaWxlIGJ1aWxkSmF4YkZpbGUoSmF4YlByb2plY3QgamF4YlByb2plY3QsIElGaWxlIGZpbGUpIHsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm1Ub29scy5nZXRDb250ZW50VHlwZShmaWxlKTsKLQkJcmV0dXJuIChjb250ZW50VHlwZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkSmF4YkZpbGUoamF4YlByb2plY3QsIGZpbGUsIGNvbnRlbnRUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF4YkZpbGUgYnVpbGRKYXhiRmlsZShKYXhiUHJvamVjdCBqYXhiUHJvamVjdCwgSUZpbGUgZmlsZSwgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCUpwdFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCA9IHRoaXMuYnVpbGRSZXNvdXJjZU1vZGVsKGpheGJQcm9qZWN0LCBmaWxlLCBjb250ZW50VHlwZSk7Ci0JCXJldHVybiAocmVzb3VyY2VNb2RlbCA9PSBudWxsKSA/IG51bGwgOiBnZXRGYWN0b3J5KCkuYnVpbGRKYXhiRmlsZShqYXhiUHJvamVjdCwgZmlsZSwgY29udGVudFR5cGUsIHJlc291cmNlTW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCBKcHRSZXNvdXJjZU1vZGVsIGJ1aWxkUmVzb3VyY2VNb2RlbChKYXhiUHJvamVjdCBqYXhiUHJvamVjdCwgSUZpbGUgZmlsZSwgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCUpheGJSZXNvdXJjZU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSB0aGlzLmdldFJlc291cmNlTW9kZWxQcm92aWRlcihjb250ZW50VHlwZSk7Ci0JCXJldHVybiAocHJvdmlkZXIgPT0gbnVsbCkgPyBudWxsIDogcHJvdmlkZXIuYnVpbGRSZXNvdXJjZU1vZGVsKGpheGJQcm9qZWN0LCBmaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gbnVsbCBpZiB3ZSBkb24ndCBoYXZlIGEgcHJvdmlkZXIgZm9yIHRoZSBzcGVjaWZpZWQgY29udGVudCB0eXBlCi0JICogKHNpbmNlIHdlIGRvbid0IGhhdmUgY29udHJvbCBvdmVyIHRoZSBwb3NzaWJsZSBjb250ZW50IHR5cGVzKS4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF4YlJlc291cmNlTW9kZWxQcm92aWRlciBnZXRSZXNvdXJjZU1vZGVsUHJvdmlkZXIoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCWZvciAoSmF4YlJlc291cmNlTW9kZWxQcm92aWRlciBwcm92aWRlciA6IGdldFJlc291cmNlTW9kZWxQcm92aWRlcnMoKSkgewotCQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhwcm92aWRlci5nZXRDb250ZW50VHlwZSgpKSkgewotCQkJCXJldHVybiBwcm92aWRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEpheGJSZXNvdXJjZU1vZGVsUHJvdmlkZXI+IGdldFJlc291cmNlTW9kZWxQcm92aWRlcnMoKSB7Ci0JCXJldHVybiB0aGlzLnBsYXRmb3JtRGVmaW5pdGlvbi5nZXRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogSmF2YSBhbm5vdGF0aW9ucyAqKioqKioqKioqCi0JCi0JcHVibGljIEFubm90YXRpb25Qcm92aWRlciBnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRpb25Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgZ2V0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIoKSB7Ci0JCXJldHVybiBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBhdHRyaWJ1dGUgbWFwcGluZ3MgKioqKioqKioqKgotCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24oCi0JCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJZm9yIChKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZGVmaW5pdGlvbiA6IGdldFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSkgewotCQkJaWYgKGRlZmluaXRpb24uaXNTcGVjaWZpZWQoYXR0cmlidXRlKSkgewotCQkJCXJldHVybiBkZWZpbml0aW9uOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZXJlIG11c3QgYmUgYSBtYXBwaW5nIGRlZmluaXRpb24gZm9yIGFsbCBhdHRyaWJ1dGVzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBnZXRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybURlZmluaXRpb24uZ2V0U3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZ2V0U3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCWZvciAoSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGRlZmluaXRpb24gOiBnZXRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkpIHsKLQkJCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbChkZWZpbml0aW9uLmdldEtleSgpLCBtYXBwaW5nS2V5KSkgewotCQkJCXJldHVybiBkZWZpbml0aW9uOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgYXR0cmlidXRlIG1hcHBpbmcga2V5OiAiICsgbWFwcGluZ0tleSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZ2V0RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLnBsYXRmb3JtRGVmaW5pdGlvbi5nZXREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0pheGJQbGF0Zm9ybU1hbmFnZXJJbXBsLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1NYW5hZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjE5ZmM0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0pheGJQbGF0Zm9ybU1hbmFnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnBsYXRmb3JtOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlhQb2ludFRvb2xzLio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuWFBvaW50VG9vbHMuWFBvaW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5LZXllZFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlN1cGVySXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgSmF4YlBsYXRmb3JtTWFuYWdlckltcGwKLQkJaW1wbGVtZW50cyBKYXhiUGxhdGZvcm1NYW5hZ2VyIHsKLQkKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJqYXhiUGxhdGZvcm1zIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX0VYVEVOU0lPTl9QT0lOVF9JRCA9IEpwdEpheGJDb3JlUGx1Z2luLlBMVUdJTl9JRF8gKyBFWFRFTlNJT05fUE9JTlRfSUQ7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9HUk9VUF9FTEVNRU5UID0gImpheGJQbGF0Zm9ybUdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fRUxFTUVOVCA9ICJqYXhiUGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BVFRSSUJVVEUgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9BVFRSSUJVVEUgPSAibGFiZWwiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBGQUNUT1JZX0NMQVNTX0FUVFJJQlVURSA9ICJmYWN0b3J5Q2xhc3MiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBKQVhCX0ZBQ0VUX1ZFUlNJT05fQVRUUklCVVRFID0gImpheGJGYWNldFZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0FUVFJJQlVURSA9ICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfRUxFTUVOVCA9ICJncm91cCI7ICAvLyROT04tTkxTLTEkCi0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF4YlBsYXRmb3JtTWFuYWdlckltcGwgSU5TVEFOQ0UgPSBuZXcgSmF4YlBsYXRmb3JtTWFuYWdlckltcGwoKTsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIEpheGJQbGF0Zm9ybU1hbmFnZXJJbXBsIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCXByaXZhdGUgS2V5ZWRTZXQ8U3RyaW5nLCBKYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uSW1wbD4gcGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uczsKLQlwcml2YXRlIEtleWVkU2V0PFN0cmluZywgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb25JbXBsPiBwbGF0Zm9ybURlc2NyaXB0aW9uczsKLQkKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkKLQlwcml2YXRlIEpheGJQbGF0Zm9ybU1hbmFnZXJJbXBsKCkgewotCQlzdXBlcigpOwotCQl0aGlzLnBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbnMgPSBuZXcgS2V5ZWRTZXQ8U3RyaW5nLCBKYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uSW1wbD4oKTsKLQkJdGhpcy5wbGF0Zm9ybURlc2NyaXB0aW9ucyA9IG5ldyBLZXllZFNldDxTdHJpbmcsIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uSW1wbD4oKTsKLQkJcmVhZEV4dGVuc2lvbnMoKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIHJlYWRFeHRlbnNpb25zKCkgewotCQlmaW5hbCBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkKLQkJZmluYWwgSUV4dGVuc2lvblBvaW50IHhwb2ludCAKLQkJCQk9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KEpwdEpheGJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJCi0JCWlmICh4cG9pbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCQotCQlMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4gcGxhdGZvcm1Hcm91cENvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKLQkJTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IHBsYXRmb3JtQ29uZmlncyA9IG5ldyBBcnJheUxpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PigpOwotCQkKLQkJZm9yIChJRXh0ZW5zaW9uIGV4dGVuc2lvbiA6IHhwb2ludC5nZXRFeHRlbnNpb25zKCkpIHsKLQkJCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgOiBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkpIHsKLQkJCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFBMQVRGT1JNX0dST1VQX0VMRU1FTlQpKSB7Ci0JCQkJCXBsYXRmb3JtR3JvdXBDb25maWdzLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFBMQVRGT1JNX0VMRU1FTlQpKSB7Ci0JCQkJCXBsYXRmb3JtQ29uZmlncy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IDogcGxhdGZvcm1Hcm91cENvbmZpZ3MpIHsKLQkJCXJlYWRQbGF0Zm9ybUdyb3VwRXh0ZW5zaW9uKGVsZW1lbnQpOwotCQl9Ci0JCQotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IDogcGxhdGZvcm1Db25maWdzKSB7Ci0JCQlyZWFkUGxhdGZvcm1FeHRlbnNpb24oZWxlbWVudCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlYWRQbGF0Zm9ybUdyb3VwRXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQlmaW5hbCBKYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uSW1wbCBkZXNjID0gbmV3IEpheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb25JbXBsKCk7Ci0JCQkKLQkJCS8vIHBsdWctaW4gaWQKLQkJCWRlc2Muc2V0UGx1Z2luSWQoZWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSk7Ci0JCQkKLQkJCS8vIGlkCi0JCQlkZXNjLnNldElkKGZpbmRSZXF1aXJlZEF0dHJpYnV0ZShlbGVtZW50LCBJRF9BVFRSSUJVVEUpKTsKLQkJCQotCQkJaWYgKHRoaXMucGxhdGZvcm1Hcm91cERlc2NyaXB0aW9ucy5jb250YWluc0tleShkZXNjLmdldElkKCkpKSB7Ci0JCQkJbG9nRHVwbGljYXRlRXh0ZW5zaW9uKFFVQUxJRklFRF9FWFRFTlNJT05fUE9JTlRfSUQsIElEX0FUVFJJQlVURSwgZGVzYy5nZXRJZCgpKTsKLQkJCQl0aHJvdyBuZXcgWFBvaW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQkJCS8vIGxhYmVsCi0JCQlkZXNjLnNldExhYmVsKGZpbmRSZXF1aXJlZEF0dHJpYnV0ZShlbGVtZW50LCBMQUJFTF9BVFRSSUJVVEUpKTsKLQkJCQotCQkJdGhpcy5wbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb25zLmFkZEl0ZW0oZGVzYy5nZXRJZCgpLCBkZXNjKTsKLQkJfQotCQljYXRjaCAoWFBvaW50RXhjZXB0aW9uIGUpIHsKLQkJCS8vIElnbm9yZSBhbmQgY29udGludWUuIFRoZSBwcm9ibGVtIGhhcyBhbHJlYWR5IGJlZW4gcmVwb3J0ZWQgdG8gdGhlIHVzZXIKLQkJCS8vIGluIHRoZSBsb2cuCi0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlYWRQbGF0Zm9ybUV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQl0cnkgewotCQkJZmluYWwgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb25JbXBsIGRlc2MgPSBuZXcgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb25JbXBsKCk7Ci0JCQkKLQkJCS8vIHBsdWctaW4gaWQKLQkJCWRlc2Muc2V0UGx1Z2luSWQoZWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSk7Ci0JCQkKLQkJCS8vIGlkCi0JCQlkZXNjLnNldElkKGZpbmRSZXF1aXJlZEF0dHJpYnV0ZShlbGVtZW50LCBJRF9BVFRSSUJVVEUpKTsKLQkJCQotCQkJaWYgKHRoaXMucGxhdGZvcm1EZXNjcmlwdGlvbnMuY29udGFpbnNLZXkoZGVzYy5nZXRJZCgpKSkgewotCQkJCWxvZ0R1cGxpY2F0ZUV4dGVuc2lvbihRVUFMSUZJRURfRVhURU5TSU9OX1BPSU5UX0lELCBJRF9BVFRSSUJVVEUsIGRlc2MuZ2V0SWQoKSk7Ci0JCQkJdGhyb3cgbmV3IFhQb2ludEV4Y2VwdGlvbigpOwotCQkJfQotCQkJCi0JCQkvLyBsYWJlbAotCQkJZGVzYy5zZXRMYWJlbChmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoZWxlbWVudCwgTEFCRUxfQVRUUklCVVRFKSk7Ci0JCQkKLQkJCS8vIGZhY3RvcnkgY2xhc3MgCi0JCQlkZXNjLnNldEZhY3RvcnlDbGFzc05hbWUoZmluZFJlcXVpcmVkQXR0cmlidXRlKGVsZW1lbnQsIEZBQ1RPUllfQ0xBU1NfQVRUUklCVVRFKSk7Ci0JCQkKLQkJCS8vIEpBWEIgZmFjZXQgdmVyc2lvbgotCQkJU3RyaW5nIGpheGJGYWNldFZlcnNpb25TdHJpbmcgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShKQVhCX0ZBQ0VUX1ZFUlNJT05fQVRUUklCVVRFKTsKLQkJCWlmIChqYXhiRmFjZXRWZXJzaW9uU3RyaW5nICE9IG51bGwpIHsKLQkJCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBqcGFGYWNldFZlcnNpb24gPSBKYXhiRmFjZXQuRkFDRVQuZ2V0VmVyc2lvbihqYXhiRmFjZXRWZXJzaW9uU3RyaW5nKTsKLQkJCQlpZiAoanBhRmFjZXRWZXJzaW9uICE9IG51bGwpIHsKLQkJCQkJZGVzYy5zZXRKYXhiRmFjZXRWZXJzaW9uKGpwYUZhY2V0VmVyc2lvbik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlsb2dJbnZhbGlkVmFsdWUoZWxlbWVudCwgSkFYQl9GQUNFVF9WRVJTSU9OX0FUVFJJQlVURSwgamF4YkZhY2V0VmVyc2lvblN0cmluZyk7Ci0JCQkJCXRocm93IG5ldyBYUG9pbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGRlZmF1bHQKLQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoREVGQVVMVF9BVFRSSUJVVEUpOwotCQkJaWYgKGRlZmF1bHRTdHJpbmcgIT0gbnVsbCkgewotCQkJCWlmIChkZWZhdWx0U3RyaW5nLmVxdWFscygidHJ1ZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZGVzYy5zZXREZWZhdWx0KHRydWUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChkZWZhdWx0U3RyaW5nLmVxdWFscygiZmFsc2UiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWRlc2Muc2V0RGVmYXVsdChmYWxzZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlsb2dJbnZhbGlkVmFsdWUoZWxlbWVudCwgREVGQVVMVF9BVFRSSUJVVEUsIGRlZmF1bHRTdHJpbmcpOwotCQkJCQl0aHJvdyBuZXcgWFBvaW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBncm91cAotCQkJU3RyaW5nIGdyb3VwSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShHUk9VUF9FTEVNRU5UKTsKLQkJCWlmIChncm91cElkICE9IG51bGwpIHsKLQkJCQlKYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uSW1wbCBncm91cCA9IHRoaXMucGxhdGZvcm1Hcm91cERlc2NyaXB0aW9ucy5nZXRJdGVtKGdyb3VwSWQpOwotCQkJCWlmIChncm91cCAhPSBudWxsKSB7Ci0JCQkJCWRlc2Muc2V0R3JvdXAoZ3JvdXApOwotCQkJCQlncm91cC5hZGRQbGF0Zm9ybShkZXNjKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWxvZ0ludmFsaWRWYWx1ZShlbGVtZW50LCBHUk9VUF9FTEVNRU5ULCBncm91cElkKTsKLQkJCQkJdGhyb3cgbmV3IFhQb2ludEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUpheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb25JbXBsIGdyb3VwID0gbmV3IEpheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb25JbXBsKCk7Ci0JCQkJZ3JvdXAuc2V0UGx1Z2luSWQoZGVzYy5nZXRQbHVnaW5JZCgpKTsKLQkJCQlncm91cC5zZXRJZChkZXNjLmdldElkKCkpOwotCQkJCWdyb3VwLnNldExhYmVsKGRlc2MuZ2V0TGFiZWwoKSk7Ci0JCQkJZ3JvdXAuYWRkUGxhdGZvcm0oZGVzYyk7Ci0JCQkJCi0JCQkJaWYgKHRoaXMucGxhdGZvcm1Hcm91cERlc2NyaXB0aW9ucy5jb250YWluc0tleShncm91cC5nZXRJZCgpKSkgewotCQkJCQlsb2dJbnZhbGlkVmFsdWUoZWxlbWVudCwgR1JPVVBfRUxFTUVOVCwgZ3JvdXBJZCk7Ci0JCQkJCXRocm93IG5ldyBYUG9pbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJCi0JCQkJdGhpcy5wbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb25zLmFkZEl0ZW0oZ3JvdXAuZ2V0SWQoKSwgZ3JvdXApOwotCQkJfQotCQkJCi0JCQl0aGlzLnBsYXRmb3JtRGVzY3JpcHRpb25zLmFkZEl0ZW0oZGVzYy5nZXRJZCgpLCBkZXNjKTsKLQkJfQotCQljYXRjaCAoWFBvaW50RXhjZXB0aW9uIGUpIHsKLQkJCS8vIElnbm9yZSBhbmQgY29udGludWUuIFRoZSBwcm9ibGVtIGhhcyBhbHJlYWR5IGJlZW4gcmVwb3J0ZWQgdG8gdGhlIHVzZXIKLQkJCS8vIGluIHRoZSBsb2cuCi0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIG1ldGhvZHMgKioqKioqKioqKgotCQotCXB1YmxpYyBJdGVyYWJsZTxKYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uPiBnZXRKYXhiUGxhdGZvcm1Hcm91cHMoKSB7Ci0JCXJldHVybiBuZXcgU3VwZXJJdGVyYWJsZVdyYXBwZXI8SmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbj4odGhpcy5wbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb25zLmdldEl0ZW1TZXQoKSk7Ci0JfQotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uIGdldEpheGJQbGF0Zm9ybUdyb3VwKFN0cmluZyBncm91cElkKSB7Ci0JCXJldHVybiB0aGlzLnBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbnMuZ2V0SXRlbShncm91cElkKTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uPiBnZXRKYXhiUGxhdGZvcm1zKCkgewotCQlyZXR1cm4gbmV3IFN1cGVySXRlcmFibGVXcmFwcGVyPEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uPih0aGlzLnBsYXRmb3JtRGVzY3JpcHRpb25zLmdldEl0ZW1TZXQoKSk7Ci0JfQotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXRKYXhiUGxhdGZvcm0oU3RyaW5nIHBsYXRmb3JtSWQpIHsKLQkJcmV0dXJuIHRoaXMucGxhdGZvcm1EZXNjcmlwdGlvbnMuZ2V0SXRlbShwbGF0Zm9ybUlkKTsKLQl9Ci0JCi0JcHVibGljIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGdldERlZmF1bHRKYXhiUGxhdGZvcm0oSVByb2plY3RGYWNldFZlcnNpb24gamF4YkZhY2V0VmVyc2lvbikgewotCQlpZiAoISBqYXhiRmFjZXRWZXJzaW9uLmdldFByb2plY3RGYWNldCgpLmVxdWFscyhKYXhiRmFjZXQuRkFDRVQpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGpheGJGYWNldFZlcnNpb24udG9TdHJpbmcoKSk7Ci0JCX0KLQkJZm9yIChKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBwbGF0Zm9ybSA6IGdldEpheGJQbGF0Zm9ybXMoKSkgewotCQkJaWYgKHBsYXRmb3JtLmlzRGVmYXVsdCgpICYmIHBsYXRmb3JtLnN1cHBvcnRzSmF4YkZhY2V0VmVyc2lvbihqYXhiRmFjZXRWZXJzaW9uKSkgewotCQkJCXJldHVybiBwbGF0Zm9ybTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIEpheGJQbGF0Zm9ybURlZmluaXRpb24gYnVpbGRKYXhiUGxhdGZvcm1EZWZpbml0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJU3RyaW5nIGpheGJQbGF0Zm9ybUlkID0gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0SmF4YlBsYXRmb3JtSWQocHJvamVjdCk7Ci0JCUpheGJQbGF0Zm9ybURlc2NyaXB0aW9uSW1wbCBwbGF0Zm9ybURlc2MgPSB0aGlzLnBsYXRmb3JtRGVzY3JpcHRpb25zLmdldEl0ZW0oamF4YlBsYXRmb3JtSWQpOwotCQlpZiAocGxhdGZvcm1EZXNjID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb2plY3QgZG9lcyBub3QgaGF2ZSBhIHJlY29nbml6ZWQgSkFYQiBwbGF0Zm9ybS4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBwbGF0Zm9ybURlc2MuYnVpbGRKYXhiUGxhdGZvcm1EZWZpbml0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vSmF4YlBsYXRmb3JtVGVzdGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1UZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk5ZGM0ZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1UZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb247Ci0KLS8qKgotICogUHJvcGVydHkgdGVzdGVyIGZvciB7QGxpbmsgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb259LgotICogU2VlIDxjb2RlPm9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvcGx1Z2luLnhtbDwvY29kZT4KLSAqLwotcHVibGljIGNsYXNzIEpheGJQbGF0Zm9ybVRlc3RlcgotCWV4dGVuZHMgUHJvcGVydHlUZXN0ZXIKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhCX1BMQVRGT1JNID0gImpheGJQbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhCX1BMQVRGT1JNX0dST1VQID0gImpheGJQbGF0Zm9ybUdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0W10gYXJncywgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKLQkJaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24pIHsKLQkJCXJldHVybiB0aGlzLnRlc3QoKEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uKSByZWNlaXZlciwgcHJvcGVydHksIGV4cGVjdGVkVmFsdWUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHRlc3QoSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gcGxhdGZvcm0sIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKLQkJaWYgKHByb3BlcnR5LmVxdWFscyhKQVhCX1BMQVRGT1JNKSkgewotCQkJSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZXhwZWN0ZWQgPSB0aGlzLmdldEpheGJQbGF0Zm9ybShleHBlY3RlZFZhbHVlKTsKLQkJCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbChwbGF0Zm9ybSwgZXhwZWN0ZWQpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eS5lcXVhbHMoSkFYQl9QTEFURk9STV9HUk9VUCkpIHsKLQkJCUpheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb24gZXhwZWN0ZWQgPSB0aGlzLmdldEpheGJQbGF0Zm9ybUdyb3VwKGV4cGVjdGVkVmFsdWUpOwotCQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHBsYXRmb3JtLmdldEdyb3VwKCksIGV4cGVjdGVkKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXRKYXhiUGxhdGZvcm0oT2JqZWN0IGlkKSB7Ci0JCXJldHVybiBKcHRKYXhiQ29yZVBsdWdpbi5nZXRKYXhiUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SmF4YlBsYXRmb3JtKChTdHJpbmcpIGlkKTsKLQl9Ci0KLQlwcml2YXRlIEpheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb24gZ2V0SmF4YlBsYXRmb3JtR3JvdXAoT2JqZWN0IGlkKSB7Ci0JCXJldHVybiBKcHRKYXhiQ29yZVBsdWdpbi5nZXRKYXhiUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SmF4YlBsYXRmb3JtR3JvdXAoKFN0cmluZykgaWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3ByZWZzL0pheGJQcmVmZXJlbmNlc01hbmFnZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3ByZWZzL0pheGJQcmVmZXJlbmNlc01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiYzcxYi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9wcmVmcy9KYXhiUHJlZmVyZW5jZXNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucHJlZnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkdlbmVyaWNKYXhiUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KcHRKYXhiQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLkpwdEpheGJDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOwotCi0vKioKLSAqICBKYXhiUHJlZmVyZW5jZXNNYW5hZ2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXhiUHJlZmVyZW5jZXNNYW5hZ2VyCi17Ci0JcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBwcm9qZWN0OwotCi0JcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBmbHVzaFByZWZlcmVuY2VzID0gdHJ1ZTsKLQotCS8vICoqKioqKioqKiogcHVibGljIGNvbnN0YW50cyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogVGhlIG5vZGUgZm9yIHN0b3JpbmcgYSBKQVhCIHByb2plY3QncyBwbGF0Zm9ybSBpbiB0aGUgcHJvamVjdCdzIHByZWZlcmVuY2VzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1BSRUZfTk9ERSA9ICJwbGF0Zm9ybSI7ICAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGtleSBmb3Igc3RvcmluZyB0aGUgcGxhdGZvcm0gaWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9JRF9QUkVGX0tFWSA9ICJwbGF0Zm9ybS1pZCI7ICAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUga2V5IGZvciBzdG9yaW5nIHRoZSBkZWZhdWx0IEpBWEIgcGxhdGZvcm0gSUQgZm9yIEpBWEIgMi4xIGluIHRoZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9KQVhCX1BMQVRGT1JNXzJfMV9QUkVGX0tFWSA9IAotCQkJImRlZmF1bHRKYXhiUGxhdGZvcm1fIiArIEpheGJGYWNldC5WRVJTSU9OXzJfMS5nZXRWZXJzaW9uU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBrZXkgZm9yIHN0b3JpbmcgdGhlIGRlZmF1bHQgSkFYQiBwbGF0Zm9ybSBJRCBmb3IgSkFYQiAyLjIgaW4gdGhlIHdvcmtzcGFjZSBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0pBWEJfUExBVEZPUk1fMl8yX1BSRUZfS0VZID0gCi0JCQkiZGVmYXVsdEpheGJQbGF0Zm9ybV8iICsgSmF4YkZhY2V0LlZFUlNJT05fMl8yLmdldFZlcnNpb25TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBub2RlIGZvciBzdG9yaW5nIGEgSkFYQiBwcm9qZWN0J3Mgc2NoZW1hcyBpbiB0aGUgcHJvamVjdCdzIHByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQVNfUFJFRl9OT0RFID0gInNjaGVtYXMiOyAgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBub2RlIHByZWZpeCBmb3Igc3RvcmluZyBhIHBhcnRpY3VsYXIgSkFYQiBwcm9qZWN0IHNjaGVtYSBpbiB0aGUgcHJvamVjdCdzIHByZWZlcmVuY2VzLgotCSAqIFNwZWNpZmljIHNjaGVtYSBub2RlcyBhcmUgZm9sbG93ZWQgYnkgaW50ZWdlcnMgKCJzY2hlbWEtMSIsICJzY2hlbWEtMiIsIGV0Yy4pCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX1BSRUZfTk9ERV9QUkVGSVggPSAic2NoZW1hLSI7ICAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGtleSBmb3Igc3RvcmluZyBhIHNjaGVtYSBsb2NhdGlvbiAoc3VjaCBhcyBhIHVyaSBvciBjYXRhbG9nIGtleSkgaW4gdGhlIHByb2plY3QncyBwcmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9MT0NBVElPTl9QUkVGX0tFWSA9ICJsb2NhdGlvbiI7ICAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogcHJlZmVyZW5jZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBEYWxpIHByZWZlcmVuY2VzIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRleHQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSUVjbGlwc2VQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcyhJU2NvcGVDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGNvbnRleHQuZ2V0Tm9kZShKcHRKYXhiQ29yZVBsdWdpbi5QTFVHSU5fSUQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgRGFsaSBwcmVmZXJlbmNlcyBmb3IgdGhlIGN1cnJlbnQgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUVjbGlwc2VQcmVmZXJlbmNlcyBnZXRXb3Jrc3BhY2VQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKEluc3RhbmNlU2NvcGUuSU5TVEFOQ0UpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgRGFsaSBwcmVmZXJlbmNlcwotCSAqIEBzZWUgSnBhUHJlZmVyZW5jZUluaXRpYWxpemVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJRWNsaXBzZVByZWZlcmVuY2VzIGdldERlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKERlZmF1bHRTY29wZS5JTlNUQU5DRSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB3b3Jrc3BhY2UgcHJlZmVyZW5jZSAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V29ya3NwYWNlUHJlZmVyZW5jZShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyB3a3NwUHJlZnMgPSBnZXRXb3Jrc3BhY2VQcmVmZXJlbmNlcygpOwotCQlpZih2YWx1ZSA9PSBudWxsKSB7Ci0JCQl3a3NwUHJlZnMucmVtb3ZlKGtleSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl3a3NwUHJlZnMucHV0KGtleSwgdmFsdWUpOwotCQl9Ci0JCWZsdXNoKHdrc3BQcmVmcyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBwcml2YXRlIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCAodmlhIHJlZmxlY3Rpb24pIHdoZW4gdGhlIHRlc3QgcGx1Zy1pbiBpcyBsb2FkZWQuCi0JICogVGhlIHByZWZlcmVuY2VzIGVuZCB1cCBnZXR0aW5nIGZsdXNoZWQgYWZ0ZXIgdGhlIHRlc3QgY2FzZSBoYXMgZGVsZXRlZAotCSAqIGl0cyBwcm9qZWN0LCByZXN1bHRpbmcgaW4gcmVzb3VyY2UgZXhjZXB0aW9ucyBpbiB0aGUgbG9nLCBlLmcuCi0JICogPHByZT4KLQkgKiAgICAgUmVzb3VyY2UgJy9KcGFQcm9qZWN0TWFuYWdlclRlc3RzJyBpcyBub3Qgb3Blbi4KLQkgKiA8L3ByZT4KLQkgKiBTZWUgPGNvZGU+SnB0SmF4YkNvcmVUZXN0c1BsdWdpbi5zdGFydChCdW5kbGVDb250ZXh0KTwvY29kZT4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGRvTm90Rmx1c2hQcmVmZXJlbmNlcygpIHsKLQkJZmx1c2hQcmVmZXJlbmNlcyA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEZsdXNoIHByZWZlcmVuY2VzIGluIGFuIGFzeW5jaHJvbm91cyBKb2IgYmVjYXVzZSB0aGUgZmx1c2ggcmVxdWVzdCB3aWxsCi0JICogdHJpZ2dlciBhIGxvY2sgb24gdGhlIHByb2plY3QsIHdoaWNoIGNhbiBjYXVzZSB1cyBzb21lIGRlYWRsb2NrcyAoZS5nLgotCSAqIHdoZW4gZGVsZXRpbmcgdGhlIG1ldGFtb2RlbCBzb3VyY2UgZm9sZGVyKS4KLQkgKiBOb3RlOiB0aGUgZmx1c2ggd2lsbCBhbHNvIHJlbW92ZSB0aGUgcHJlZnMgbm9kZSBpZiBpdCBpcyBlbXB0eQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmx1c2goSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmcykgewotCQlpZiAoZmx1c2hQcmVmZXJlbmNlcykgewotCQkJbmV3IFByZWZlcmVuY2VzRmx1c2hKb2IocHJlZnMpLnNjaGVkdWxlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQcmVmZXJlbmNlc0ZsdXNoSm9iIGV4dGVuZHMgSm9iIHsKLQkJcHJpdmF0ZSBmaW5hbCBJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzOwotCQlQcmVmZXJlbmNlc0ZsdXNoSm9iKElFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZnMpIHsKLQkJCXN1cGVyKE5MUy5iaW5kKEpwdEpheGJDb3JlTWVzc2FnZXMuUFJFRkVSRU5DRVNfRkxVU0hfSk9CX05BTUUsIHByZWZzLmFic29sdXRlUGF0aCgpKSk7Ci0JCQl0aGlzLnByZWZzID0gcHJlZnM7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXRyeSB7Ci0JCQkJcHJlZnMuZmx1c2goKTsKLQkJCX0gCi0JCQljYXRjaChCYWNraW5nU3RvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQlKcHRKYXhiQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgSmF4YlByZWZlcmVuY2VzTWFuYWdlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmKHByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb2plY3QgaXMgbnVsbCIpOyAJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi0JLy8gKioqKioqKioqKiBwcmVmZXJlbmNlcyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldFByb2plY3RQcmVmZXJlbmNlcygpIHsKLQkJdHJ5IHsKLQkJCUlGYWNldGVkUHJvamVjdCBmcHJvaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSh0aGlzLnByb2plY3QpOwotCQkJcmV0dXJuIGZwcm9qLmdldFByZWZlcmVuY2VzKEpheGJGYWNldC5GQUNFVCk7Ci0JCX0KLQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBic2UpIHsKLQkJCUpwdEpheGJDb3JlUGx1Z2luLmxvZyhic2UpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlKcHRKYXhiQ29yZVBsdWdpbi5sb2coY2UpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vICoqKioqKioqKiogZ2V0dGVycy9zZXR0ZXJzICoqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKQVhCIHBsYXRmb3JtIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpheGJQbGF0Zm9ybUlkKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IHRoaXMuZ2V0UHJvamVjdFByZWZlcmVuY2VzKCk7Ci0JCVByZWZlcmVuY2VzIHBsYXRmb3JtUHJlZnMgPSBwcmVmcy5ub2RlKFBMQVRGT1JNX1BSRUZfTk9ERSk7Ci0JCXJldHVybiBwbGF0Zm9ybVByZWZzLmdldChQTEFURk9STV9JRF9QUkVGX0tFWSwgR2VuZXJpY0pheGJQbGF0Zm9ybS5WRVJTSU9OXzJfMS5nZXRJZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHtAbGluayBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbn0gYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEpheGJQbGF0Zm9ybShKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBwbGF0Zm9ybSkgewotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IHRoaXMuZ2V0UHJvamVjdFByZWZlcmVuY2VzKCk7Ci0JCVByZWZlcmVuY2VzIHBsYXRmb3JtUHJlZnMgPSBwcmVmcy5ub2RlKFBMQVRGT1JNX1BSRUZfTk9ERSk7Ci0JCXBsYXRmb3JtUHJlZnMucHV0KFBMQVRGT1JNX0lEX1BSRUZfS0VZLCBwbGF0Zm9ybS5nZXRJZCgpKTsKLQkJdHJ5IHsKLQkJCXBsYXRmb3JtUHJlZnMuZmx1c2goKTsKLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGJzZSkgewotCQkJSnB0SmF4YkNvcmVQbHVnaW4ubG9nKGJzZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFNjaGVtYUxvY2F0aW9ucygpIHsKLQkJTGlzdDxTdHJpbmc+IHNjaGVtYUxvY2F0aW9ucyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IHRoaXMuZ2V0UHJvamVjdFByZWZlcmVuY2VzKCk7Ci0JCVByZWZlcmVuY2VzIHNjaGVtYXNQcmVmcyA9IHByZWZzLm5vZGUoU0NIRU1BU19QUkVGX05PREUpOwotCQl0cnkgewotCQkJYm9vbGVhbiBjaGVja0Fub3RoZXJOb2RlID0gdHJ1ZTsKLQkJCWZvciAoaW50IGkgPSAxOyBjaGVja0Fub3RoZXJOb2RlOyBpKysgKSB7Ci0JCQkJU3RyaW5nIG5vZGVOYW1lID0gU0NIRU1BX1BSRUZfTk9ERV9QUkVGSVggKyBTdHJpbmcudmFsdWVPZihpKTsKLQkJCQlpZiAoc2NoZW1hc1ByZWZzLm5vZGVFeGlzdHMobm9kZU5hbWUpKSB7Ci0JCQkJCVByZWZlcmVuY2VzIHNjaGVtYVByZWZzID0gc2NoZW1hc1ByZWZzLm5vZGUobm9kZU5hbWUpOwotCQkJCQlTdHJpbmcgbG9jYXRpb24gPSBzY2hlbWFQcmVmcy5nZXQoU0NIRU1BX0xPQ0FUSU9OX1BSRUZfS0VZLCBudWxsKTsKLQkJCQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJCXNjaGVtYUxvY2F0aW9ucy5hZGQobG9jYXRpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljaGVja0Fub3RoZXJOb2RlID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gYnNlKSB7Ci0JCQkvLyB0aGlzIG1lYW5zIHRoYXQgdGhlIHByZWZzIGFyZSBjb3JydXB0ZWQsIGluIHdoaWNoIGNhc2UgcmVhZGluZyBhbnl0aGluZyBpcyB1bmxpa2VseQotCQkJSnB0SmF4YkNvcmVQbHVnaW4ubG9nKGJzZSk7Ci0JCX0KLQkJcmV0dXJuIHNjaGVtYUxvY2F0aW9uczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTY2hlbWFMb2NhdGlvbnMoTGlzdDxTdHJpbmc+IHNjaGVtYUxvY2F0aW9ucykgewotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IHRoaXMuZ2V0UHJvamVjdFByZWZlcmVuY2VzKCk7Ci0JCVByZWZlcmVuY2VzIHNjaGVtYXNQcmVmcyA9IHByZWZzLm5vZGUoU0NIRU1BU19QUkVGX05PREUpOwotCQl0cnkgewotCQkJaW50IGkgPSAxOwotCQkJZm9yIChTdHJpbmcgbG9jYXRpb24gOiBzY2hlbWFMb2NhdGlvbnMpIHsKLQkJCQlTdHJpbmcgbm9kZU5hbWUgPSBTQ0hFTUFfUFJFRl9OT0RFX1BSRUZJWCArIFN0cmluZy52YWx1ZU9mKGkpOwotCQkJCVByZWZlcmVuY2VzIHNjaGVtYVByZWYgPSBzY2hlbWFzUHJlZnMubm9kZShub2RlTmFtZSk7Ci0JCQkJc2NoZW1hUHJlZi5wdXQoU0NIRU1BX0xPQ0FUSU9OX1BSRUZfS0VZLCBsb2NhdGlvbik7Ci0JCQkJaSArKzsKLQkJCX0KLQkJCWJvb2xlYW4gY2hlY2tBbm90aGVyTm9kZSA9IHRydWU7Ci0JCQlmb3IgKCA7IGNoZWNrQW5vdGhlck5vZGU7IGkrKyApIHsKLQkJCQlTdHJpbmcgbm9kZU5hbWUgPSBTQ0hFTUFfUFJFRl9OT0RFX1BSRUZJWCArIFN0cmluZy52YWx1ZU9mKGkpOwotCQkJCWlmIChzY2hlbWFzUHJlZnMubm9kZUV4aXN0cyhub2RlTmFtZSkpIHsKLQkJCQkJc2NoZW1hc1ByZWZzLm5vZGUobm9kZU5hbWUpLnJlbW92ZU5vZGUoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNoZWNrQW5vdGhlck5vZGUgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlzY2hlbWFzUHJlZnMuZmx1c2goKTsKLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGJzZSkgewotCQkJLy8gdGhpcyBtZWFucyB0aGF0IHRoZSBwcmVmcyBhcmUgY29ycnVwdGVkLCBpbiB3aGljaCBjYXNlIHJlYWRpbmcgYW55dGhpbmcgaXMgdW5saWtlbHkKLQkJCUpwdEpheGJDb3JlUGx1Z2luLmxvZyhic2UpOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvQWJzdHJhY3RKYXhiRmlsZVJlc291cmNlTW9kZWwuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL0Fic3RyYWN0SmF4YkZpbGVSZXNvdXJjZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZjU3NjcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvQWJzdHJhY3RKYXhiRmlsZVJlc291cmNlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5DbG9zZWFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KcHRKYXhiQ29yZVBsdWdpbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF4YkZpbGVSZXNvdXJjZU1vZGVsPFM+Ci0JaW1wbGVtZW50cyBKcHRSZXNvdXJjZU1vZGVsCi17Ci0JcHJvdGVjdGVkIGZpbmFsIElGaWxlIGZpbGU7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHBhY2thZ2UgbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lOwotCi0JcHJvdGVjdGVkIGZpbmFsIFMgc3RhdGU7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdGVuZXJMaXN0PEpwdFJlc291cmNlTW9kZWxMaXN0ZW5lcj4gcmVzb3VyY2VNb2RlbExpc3RlbmVyTGlzdCA9Ci0JCQluZXcgTGlzdGVuZXJMaXN0PEpwdFJlc291cmNlTW9kZWxMaXN0ZW5lcj4oSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyLmNsYXNzKTsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF4YkZpbGVSZXNvdXJjZU1vZGVsKElGaWxlIGZpbGUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5maWxlID0gZmlsZTsKLQkJdGhpcy5wYWNrYWdlTmFtZSA9IHRoaXMuYnVpbGRQYWNrYWdlTmFtZSgpOwotCQl0aGlzLnN0YXRlID0gdGhpcy5idWlsZFN0YXRlKCk7Ci0JCXRoaXMubG9hZCgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRQYWNrYWdlTmFtZSgpIHsKLQkJU3RyaW5nIHBrZyA9IHRoaXMuYnVpbGRQYWNrYWdlTmFtZV8oKTsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkocGtnKSA/IG51bGwgOiBwa2c7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFBhY2thZ2VOYW1lXygpIHsKLQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gSmF2YUNvcmUuY3JlYXRlKHRoaXMuZmlsZS5nZXRQYXJlbnQoKSk7Ci0JCWlmICgoamF2YUVsZW1lbnQgIT0gbnVsbCkgJiYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpKSB7Ci0JCQlyZXR1cm4gKChJUGFja2FnZUZyYWdtZW50KSBqYXZhRWxlbWVudCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgUyBidWlsZFN0YXRlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5wYWNrYWdlTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWxvYWQoKSB7Ci0JCXRoaXMubG9hZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWQoKSB7Ci0JCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0gPSB0aGlzLmZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCWlmIChzdHJlYW0gIT0gbnVsbCkgewotCQkJCXRoaXMubG9hZChuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzdHJlYW0pKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy8gd29ya3NwYWNlIG91dCBvZiBzeW5jIC0gbm8gdW5kZXJseWluZyBmaWxlIC0gc2ltcGx5IGRvbid0IGxvYWQKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRKYXhiQ29yZVBsdWdpbi5sb2coZXgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdGhpcy5jbG9zZVN0cmVhbShzdHJlYW0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBzdHJlYW0gaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGxvYWQoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbG9zZVN0cmVhbShDbG9zZWFibGUgc3RyZWFtKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKLQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCUpwdEpheGJDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXRoaXMucmVsb2FkKCk7Ci0JCXRoaXMucmVzb3VyY2VNb2RlbENoYW5nZWQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSnB0UmVzb3VyY2VNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZmlsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZU1vZGVsTGlzdGVuZXIoSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlTW9kZWxMaXN0ZW5lcihKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzb3VyY2VNb2RlbENoYW5nZWQoKSB7Ci0JCWZvciAoSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQlsaXN0ZW5lci5yZXNvdXJjZU1vZGVsQ2hhbmdlZCh0aGlzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGQyNDAyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yT3JkZXIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbgotCWV4dGVuZHMgTnVsbEFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uCi17Ci0JcHJvdGVjdGVkIE51bGxYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24gYWRkQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbikgc3VwZXIuYWRkQW5ub3RhdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYbWxBY2Nlc3NvclRPcmRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgWG1sQWNjZXNzT3JkZXIgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFhtbEFjY2Vzc09yZGVyIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODI0OGEwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24KLQlleHRlbmRzIE51bGxBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uCi17Ci0JcHJvdGVjdGVkIE51bGxYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0FDQ0VTU09SX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24gYWRkQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKSBzdXBlci5hZGRBbm5vdGF0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgWG1sQWNjZXNzVHlwZSBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoWG1sQWNjZXNzVHlwZSB2YWx1ZSkgewotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFhtbEVudW1Bbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxYbWxFbnVtQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjIyZmFlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFhtbEVudW1Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVudW1Bbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRW51bQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbFhtbEVudW1Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBOdWxsQW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sRW51bUFubm90YXRpb24KLXsKLQlwcm90ZWN0ZWQgTnVsbFhtbEVudW1Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0VOVU07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbEVudW1Bbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sRW51bUFubm90YXRpb24pIHN1cGVyLmFkZEFubm90YXRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogWG1sRW51bUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVmFsdWVDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxYbWxFbnVtVmFsdWVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxYbWxFbnVtVmFsdWVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMTc4YjQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsWG1sRW51bVZhbHVlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbnVtVmFsdWVBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRW51bVZhbHVlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsWG1sRW51bVZhbHVlQW5ub3RhdGlvbgotCWV4dGVuZHMgTnVsbEFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEVudW1WYWx1ZUFubm90YXRpb24KLXsKLQlwcm90ZWN0ZWQgTnVsbFhtbEVudW1WYWx1ZUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRU5VTV9WQUxVRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sRW51bVZhbHVlQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbEVudW1WYWx1ZUFubm90YXRpb24pIHN1cGVyLmFkZEFubm90YXRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogWG1sRW51bVZhbHVlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdmFsdWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxYbWxTY2hlbWFBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxYbWxTY2hlbWFBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMmNjM2IuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsWG1sU2NoZW1hQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxOc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE5zRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sU2NoZW1hQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbFhtbFNjaGVtYUFubm90YXRpb24KLQlleHRlbmRzIE51bGxBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxTY2hlbWFBbm5vdGF0aW9uCi17Ci0JcHJvdGVjdGVkIE51bGxYbWxTY2hlbWFBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX1NDSEVNQTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sU2NoZW1hQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbFNjaGVtYUFubm90YXRpb24pIHN1cGVyLmFkZEFubm90YXRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogWG1sU2NoZW1hQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBuYW1lc3BhY2UKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJaWYgKG5hbWVzcGFjZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXROYW1lc3BhY2UobmFtZXNwYWNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lc3BhY2VUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbG9jYXRpb24KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldExvY2F0aW9uKGxvY2F0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TG9jYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgWG1sTnNGb3JtIGdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdChYbWxOc0Zvcm0gYXR0cmlidXRlRm9ybURlZmF1bHQpIHsKLQkJaWYgKGF0dHJpYnV0ZUZvcm1EZWZhdWx0ICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KGF0dHJpYnV0ZUZvcm1EZWZhdWx0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0QXR0cmlidXRlRm9ybURlZmF1bHRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFhtbE5zRm9ybSBnZXRFbGVtZW50Rm9ybURlZmF1bHQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRGb3JtRGVmYXVsdChYbWxOc0Zvcm0gZWxlbWVudEZvcm1EZWZhdWx0KSB7Ci0JCWlmIChlbGVtZW50Rm9ybURlZmF1bHQgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0RWxlbWVudEZvcm1EZWZhdWx0KGVsZW1lbnRGb3JtRGVmYXVsdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEVsZW1lbnRGb3JtRGVmYXVsdFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFhtbE5zQW5ub3RhdGlvbj4gZ2V0WG1sbnMoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sbnNTaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgWG1sTnNBbm5vdGF0aW9uIHhtbG5zQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBYbWxOc0Fubm90YXRpb24gYWRkWG1sbnMoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmFkZEFubm90YXRpb24oKS5hZGRYbWxucyhpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVhtbG5zKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbG5zKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFhtbFR5cGVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxYbWxUeXBlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDhiNTRkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFhtbFR5cGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFR5cGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbFhtbFR5cGVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBOdWxsQW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sVHlwZUFubm90YXRpb24KLXsKLQlwcm90ZWN0ZWQgTnVsbFhtbFR5cGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbFR5cGVBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sVHlwZUFubm90YXRpb24pIHN1cGVyLmFkZEFubm90YXRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogWG1sVHlwZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogZmFjdG9yeSBjbGFzcwotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUNsYXNzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkRmFjdG9yeUNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmFjdG9yeUNsYXNzKFN0cmluZyBmYWN0b3J5Q2xhc3MpIHsKLQkJaWYgKGZhY3RvcnlDbGFzcyAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRGYWN0b3J5Q2xhc3MoZmFjdG9yeUNsYXNzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RmFjdG9yeUNsYXNzVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vICoqKioqIGZhY3RvcnkgbWV0aG9kCi0JcHVibGljIFN0cmluZyBnZXRGYWN0b3J5TWV0aG9kKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGYWN0b3J5TWV0aG9kKFN0cmluZyBmYWN0b3J5TWV0aG9kKSB7Ci0JCWlmIChmYWN0b3J5TWV0aG9kICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldEZhY3RvcnlNZXRob2QoZmFjdG9yeU1ldGhvZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEZhY3RvcnlNZXRob2RUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKiogbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXROYW1lKG5hbWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkKLQkvLyAqKioqKiBuYW1lc3BhY2UKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJaWYgKG5hbWVzcGFjZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXROYW1lc3BhY2UobmFtZXNwYWNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lc3BhY2VUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JcHVibGljIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldFByb3BPcmRlcigpIHsKLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRQcm9wT3JkZXJTaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQcm9wKGludCBpbmRleCwgU3RyaW5nIHByb3ApIHsKLQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuYWRkUHJvcChpbmRleCwgcHJvcCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUHJvcChTdHJpbmcgcHJvcCkgewotCQl0aGlzLmFkZEFubm90YXRpb24oKS5hZGRQcm9wKHByb3ApOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVQcm9wKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3AoaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3AoU3RyaW5nIHByb3ApIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UHJvcE9yZGVyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwcm9wT3JkZXJUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRQcm9wVGV4dFJhbmdlKGludCBpbmRleCwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHByb3BUb3VjaGVzKGludCBpbmRleCwgaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzZlODY2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3Nvck9yZGVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbkRlZmluaXRpb24KLQkJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfQUNDRVNTT1JfT1JERVI7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IE51bGxYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYzYmVhNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEFjY2Vzc29yVHlwZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbEFjY2Vzc29yVHlwZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfQUNDRVNTT1JfVFlQRTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBOdWxsWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTU2MTM3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5WG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVhtbEFueUF0dHJpYnV0ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlBdHRyaWJ1dGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbEFueUF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbEFueUF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9BTllfQVRUUklCVVRFOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbEFueUF0dHJpYnV0ZUFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5WG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQW55RWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEFueUVsZW1lbnRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWZlNmRmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQW55RWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5WG1sQW55RWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxBbnlFbGVtZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUVsZW1lbnQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbEFueUVsZW1lbnRBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxBbnlFbGVtZW50QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxBbnlFbGVtZW50QW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9BTllfRUxFTUVOVDsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxBbnlFbGVtZW50QW5ub3RhdGlvbihwYXJlbnQsIChBdHRyaWJ1dGUpIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxBbnlFbGVtZW50QW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQXR0YWNobWVudFJlZkFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDU3OTE5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQXR0YWNobWVudFJlZkFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5WG1sQXR0YWNobWVudFJlZkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dGFjaG1lbnRSZWYKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRjsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbihwYXJlbnQsIChBdHRyaWJ1dGUpIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MDIwZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbEF0dHJpYnV0ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFhtbEF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfQVRUUklCVVRFOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbEF0dHJpYnV0ZUFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5WG1sQXR0cmlidXRlQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzkyOGE1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbEVsZW1lbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlWG1sRWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxFbGVtZW50QW5ub3RhdGlvbkRlZmluaXRpb24KLQkJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgWG1sRWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sRWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVDsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIFNvdXJjZVhtbEVsZW1lbnRBbm5vdGF0aW9uLmJ1aWxkU291cmNlWG1sRWxlbWVudEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5WG1sRWxlbWVudEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnREZWNsQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmFiZDBjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlYbWxFbGVtZW50RGVjbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxFbGVtZW50RGVjbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50RGVjbAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxFbGVtZW50RGVjbEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0VMRU1FTlRfREVDTDsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxFbGVtZW50RGVjbEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5WG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50UmVmQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudFJlZkFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MmFhN2QuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50UmVmQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5WG1sRWxlbWVudFJlZkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxFbGVtZW50UmVmQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRSZWYKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9FTEVNRU5UX1JFRjsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIFNvdXJjZVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmJ1aWxkU291cmNlWG1sRWxlbWVudFJlZkFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5WG1sRWxlbWVudFJlZkFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRSZWZzQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzYwMThiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlYbWxFbGVtZW50UmVmc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxFbGVtZW50UmVmc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLQotcHVibGljIGNsYXNzIFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbkRlZmluaXRpb24KLQkJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9FTEVNRU5UX1JFRlM7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50V3JhcHBlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNmFiZTYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50V3JhcHBlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRXcmFwcGVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRzQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudHNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjA3MGE1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudHNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlYbWxFbGVtZW50c0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxFbGVtZW50c0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxFbGVtZW50c0Fubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbEVsZW1lbnRzQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxFbGVtZW50c0Fubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVFM7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlWG1sRWxlbWVudHNBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbEVsZW1lbnRzQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRW51bUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVudW1Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzgwYTRjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRW51bUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbEVudW1Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlWG1sRW51bUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbnVtCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxFbnVtQW5ub3RhdGlvbkRlZmluaXRpb24KLQkJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgWG1sRW51bUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sRW51bUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRU5VTTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxFbnVtQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgTnVsbFhtbEVudW1Bbm5vdGF0aW9uKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbEVudW1Bbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbnVtVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbnVtVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWE3NjVmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRW51bVZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5WG1sRW51bVZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVhtbEVudW1WYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbnVtVmFsdWUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbEVudW1WYWx1ZUFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbEVudW1WYWx1ZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sRW51bVZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9FTlVNX1ZBTFVFOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbEVudW1WYWx1ZUFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IE51bGxYbWxFbnVtVmFsdWVBbm5vdGF0aW9uKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbEVudW1WYWx1ZUFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbElEQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSURBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjdiNTk1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSURBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlYbWxJREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxJREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWG1sSURBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxJREFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sSURBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0lEOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbElEQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxJREFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbElEUkVGQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSURSRUZBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTUxMmFiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSURSRUZBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlYbWxJRFJFRkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxJRFJFRkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRFJFRgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWG1sSURSRUZBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxJRFJFRkFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sSURSRUZBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0lEUkVGOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbElEUkVGQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxJRFJFRkFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjZWUwNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlYbWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSW5saW5lQmluYXJ5RGF0YQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0lOTElORV9CSU5BUllfREFUQTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU3NzUxZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEphdmFUeXBlQWRhcHRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJTOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJTX19WQUxVRTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBTb3VyY2VYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmJ1aWxkU291cmNlWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGluZGV4KTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEphdmFUeXBlQWRhcHRlcnNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxKYXZhVHlwZUFkYXB0ZXJzQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRlZjcyNi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEphdmFUeXBlQWRhcHRlcnNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5TmFtZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VOYW1lZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyc0Fubm90YXRpb24KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbEphdmFUeXBlQWRhcHRlcnNBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxKYXZhVHlwZUFkYXB0ZXJzQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sSmF2YVR5cGVBZGFwdGVyc0Fubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlTmFtZWRBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlOYW1lZEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uLCBnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJTOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxMaXN0QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sTGlzdEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZmRiYTUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxMaXN0QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5WG1sTGlzdEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxMaXN0QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbExpc3QKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbExpc3RBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxMaXN0QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxMaXN0QW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9MSVNUOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbExpc3RBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbExpc3RBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxNaW1lVHlwZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbE1pbWVUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzOTVmOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbE1pbWVUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5WG1sTWltZVR5cGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlWG1sTWltZVR5cGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTWltZVR5cGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbE1pbWVUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24KLQkJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgWG1sTWltZVR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFhtbE1pbWVUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9NSU1FX1RZUEU7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlWG1sTWltZVR5cGVBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbE1pbWVUeXBlQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sTWl4ZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxNaXhlZEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNWJkNjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxNaXhlZEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbE1peGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVhtbE1peGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbE1peGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxNaXhlZEFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbE1peGVkQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxNaXhlZEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfTUlYRUQ7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlWG1sTWl4ZWRBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbE1peGVkQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sUmVnaXN0cnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxSZWdpc3RyeUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYjNmYmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxSZWdpc3RyeUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbFJlZ2lzdHJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVhtbFJlZ2lzdHJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxSZWdpc3RyeUFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbFJlZ2lzdHJ5QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxSZWdpc3RyeUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfUkVHSVNUUlk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlWG1sUmVnaXN0cnlBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbFJlZ2lzdHJ5QW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxSb290RWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MzcwYzUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxSb290RWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxSb290RWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxSb290RWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfUk9PVF9FTEVNRU5UOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxSb290RWxlbWVudEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFNjaGVtYUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFNjaGVtYUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ODhjMGQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxTY2hlbWFBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxTY2hlbWFBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxTY2hlbWFBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxTY2hlbWFBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFhtbFNjaGVtYUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfU0NIRU1BOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbFNjaGVtYUFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IE51bGxYbWxTY2hlbWFBbm5vdGF0aW9uKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQkvLyBUT0RPCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sU2NoZW1hVHlwZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFNjaGVtYVR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmI5Zjk4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sU2NoZW1hVHlwZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sU2NoZW1hVHlwZUFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX1NDSEVNQV9UWVBFOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfU0NIRU1BX1RZUEVTOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfU0NIRU1BX1RZUEVTX19WQUxVRTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBTb3VyY2VYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbi5idWlsZFNvdXJjZVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sU2NoZW1hVHlwZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxTY2hlbWFUeXBlc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYzE5NWUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxTY2hlbWFUeXBlc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlOYW1lZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU5hbWVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXJzQW5ub3RhdGlvbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWG1sU2NoZW1hVHlwZXNBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxTY2hlbWFUeXBlc0Fubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sU2NoZW1hVHlwZXNBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VOYW1lZEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5TmFtZWRBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbiwgZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9TQ0hFTUFfVFlQRVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxTZWVBbHNvQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sU2VlQWxzb0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZTlkNmIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxTZWVBbHNvQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5WG1sU2VlQWxzb0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxTZWVBbHNvQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNlZUFsc28KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbFNlZUFsc29Bbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxTZWVBbHNvQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxTZWVBbHNvQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9TRUVfQUxTTzsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxTZWVBbHNvQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxTZWVBbHNvQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sVHJhbnNpZW50QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sVHJhbnNpZW50QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI3MzAxOS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFRyYW5zaWVudEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbFRyYW5zaWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxUcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHJhbnNpZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxUcmFuc2llbnRBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxUcmFuc2llbnRBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFhtbFRyYW5zaWVudEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfVFJBTlNJRU5UOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbFRyYW5zaWVudEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5WG1sVHJhbnNpZW50QW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sVHlwZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjBlN2I1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sVHlwZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbFR5cGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlWG1sVHlwZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24KLQkJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgWG1sVHlwZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sVHlwZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfVFlQRTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxUeXBlQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgTnVsbFhtbFR5cGVBbm5vdGF0aW9uKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbFR5cGVBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzOWE5MC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5WG1sVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlWG1sVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVmFsdWUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbFZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24KLQkJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgWG1sVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFhtbFZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9WQUxVRTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxWYWx1ZUFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5WG1sVmFsdWVBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ODZkOTAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yT3JkZXIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbgotewotCXByaXZhdGUgWG1sQWNjZXNzT3JkZXIgdmFsdWU7Ci0KLQotCXB1YmxpYyBCaW5hcnlYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0FDQ0VTU09SX09SREVSOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0VmFsdWVfKHRoaXMuYnVpbGRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKioqKioqIFhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFhtbEFjY2Vzc09yZGVyIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShYbWxBY2Nlc3NPcmRlciB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKFhtbEFjY2Vzc09yZGVyIHZhbHVlKSB7Ci0JCVhtbEFjY2Vzc09yZGVyIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFhtbEFjY2Vzc09yZGVyIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NPcmRlci5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX0FDQ0VTU09SX09SREVSX19WQUxVRSkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2M2I0YTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5WG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbgotewotCXByaXZhdGUgWG1sQWNjZXNzVHlwZSB2YWx1ZTsKLQotCi0JcHVibGljIEJpbmFyeVhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0VmFsdWVfKHRoaXMuYnVpbGRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKioqKioqIFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgWG1sQWNjZXNzVHlwZSBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoWG1sQWNjZXNzVHlwZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKFhtbEFjY2Vzc1R5cGUgdmFsdWUpIHsKLQkJWG1sQWNjZXNzVHlwZSBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBYbWxBY2Nlc3NUeXBlIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfQUNDRVNTT1JfVFlQRV9fVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmE3OTYxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEFueUF0dHJpYnV0ZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFueUF0dHJpYnV0ZUFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlBdHRyaWJ1dGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbEFueUF0dHJpYnV0ZUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEFueUF0dHJpYnV0ZUFubm90YXRpb24KLXsKLQotCXB1YmxpYyBCaW5hcnlYbWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0FOWV9BVFRSSUJVVEU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sQW55RWxlbWVudEFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEFueUVsZW1lbnRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MTBhZmIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sQW55RWxlbWVudEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBbnlFbGVtZW50QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUVsZW1lbnQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbEFueUVsZW1lbnRBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxBbnlFbGVtZW50QW5ub3RhdGlvbgotewotCXByaXZhdGUgQm9vbGVhbiBsYXg7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQotCXB1YmxpYyBCaW5hcnlYbWxBbnlFbGVtZW50QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLmxheCA9IHRoaXMuYnVpbGRMYXgoKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9BTllfRUxFTUVOVDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldExheF8odGhpcy5idWlsZExheCgpKTsKLQkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYbWxBbnlFbGVtZW50QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBsYXgKLQlwdWJsaWMgQm9vbGVhbiBnZXRMYXgoKSB7Ci0JCXJldHVybiB0aGlzLmxheDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYXgoQm9vbGVhbiBsYXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldExheF8oQm9vbGVhbiBsYXgpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmxheDsKLQkJdGhpcy5sYXggPSBsYXg7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMQVhfUFJPUEVSVFksIG9sZCwgbGF4KTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGRMYXgoKSB7Ci0JCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9BTllfRUxFTUVOVF9fTEFYKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldExheFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRlVMTFlfUVVBTElGSUVEX1ZBTFVFX0NMQVNTX05BTUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX0FOWV9FTEVNRU5UX19WQUxVRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBmdWxseS1xdWFsaWZpZWQgdmFsdWUgY2xhc3MgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZUNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sQXR0YWNobWVudFJlZkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEwZGNlOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQXR0YWNobWVudFJlZkFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRhY2htZW50UmVmCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sQXR0YWNobWVudFJlZkFubm90YXRpb24KLXsKLQotCXB1YmxpYyBCaW5hcnlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMGVmYzcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sQXR0cmlidXRlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEF0dHJpYnV0ZUFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbEF0dHJpYnV0ZUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZUFubm90YXRpb24KLXsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQlwcml2YXRlIEJvb2xlYW4gcmVxdWlyZWQ7Ci0KLQotCXB1YmxpYyBCaW5hcnlYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKCk7Ci0JCXRoaXMubmFtZXNwYWNlID0gdGhpcy5idWlsZE5hbWVzcGFjZSgpOwotCQl0aGlzLnJlcXVpcmVkID0gdGhpcy5idWlsZFJlcXVpcmVkKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0FUVFJJQlVURTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldE5hbWVfKHRoaXMuYnVpbGROYW1lKCkpOwotCQl0aGlzLnNldE5hbWVzcGFjZV8odGhpcy5idWlsZE5hbWVzcGFjZSgpKTsKLQkJdGhpcy5zZXRSZXF1aXJlZF8odGhpcy5idWlsZFJlcXVpcmVkKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhtbEF0dHJpYnV0ZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9BVFRSSUJVVEVfX05BTUUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCQotCS8vICoqKioqIG5hbWVzcGFjZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE5hbWVzcGFjZV8oU3RyaW5nIG5hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lc3BhY2U7Ci0JCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRVNQQUNFX1BST1BFUlRZLCBvbGQsIG5hbWVzcGFjZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX0FUVFJJQlVURV9fTkFNRVNQQUNFKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVzcGFjZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZXNwYWNlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogcmVxdWlyZWQKLQlwdWJsaWMgQm9vbGVhbiBnZXRSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMucmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoQm9vbGVhbiByZXF1aXJlZCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVxdWlyZWRfKEJvb2xlYW4gcmVxdWlyZWQpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnJlcXVpcmVkOwotCQl0aGlzLnJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRVFVSVJFRF9QUk9QRVJUWSwgb2xkLCByZXF1aXJlZCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkUmVxdWlyZWQoKSB7Ci0JCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9BVFRSSUJVVEVfX1JFUVVJUkVEKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlcXVpcmVkVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVsZW1lbnRBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxFbGVtZW50QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjcyMWI3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVsZW1lbnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlYbWxFbGVtZW50QW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sRWxlbWVudEFubm90YXRpb24KLXsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VmFsdWU7Ci0JcHJpdmF0ZSBCb29sZWFuIG5pbGxhYmxlOwotCXByaXZhdGUgQm9vbGVhbiByZXF1aXJlZDsKLQlwcml2YXRlIFN0cmluZyB0eXBlOwotCi0KLQlwdWJsaWMgQmluYXJ5WG1sRWxlbWVudEFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoKTsKLQkJdGhpcy5uYW1lc3BhY2UgPSB0aGlzLmJ1aWxkTmFtZXNwYWNlKCk7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gdGhpcy5idWlsZERlZmF1bHRWYWx1ZSgpOwotCQl0aGlzLm5pbGxhYmxlID0gdGhpcy5idWlsZE5pbGxhYmxlKCk7Ci0JCXRoaXMucmVxdWlyZWQgPSB0aGlzLmJ1aWxkUmVxdWlyZWQoKTsKLQkJdGhpcy50eXBlID0gdGhpcy5idWlsZFR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldE5hbWVfKHRoaXMuYnVpbGROYW1lKCkpOwotCQl0aGlzLnNldE5hbWVzcGFjZV8odGhpcy5idWlsZE5hbWVzcGFjZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0VmFsdWVfKHRoaXMuYnVpbGREZWZhdWx0VmFsdWUoKSk7Ci0JCXRoaXMuc2V0TmlsbGFibGVfKHRoaXMuYnVpbGROaWxsYWJsZSgpKTsKLQkJdGhpcy5zZXRSZXF1aXJlZF8odGhpcy5idWlsZFJlcXVpcmVkKCkpOwotCQl0aGlzLnNldFR5cGVfKHRoaXMuYnVpbGRUeXBlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhtbEVsZW1lbnRBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkvLyAqKioqKiBuYW1lCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE5hbWVfKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfRUxFTUVOVF9fTkFNRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbmFtZXNwYWNlCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TmFtZXNwYWNlXyhTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWVzcGFjZTsKLQkJdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FU1BBQ0VfUFJPUEVSVFksIG9sZCwgbmFtZXNwYWNlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfRUxFTUVOVF9fTkFNRVNQQUNFKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVzcGFjZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZXNwYWNlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogZGVmYXVsdCB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRWYWx1ZV8oU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0VmFsdWU7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9WQUxVRV9QUk9QRVJUWSwgb2xkLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9FTEVNRU5UX19ERUZBVUxUX1ZBTFVFKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldERlZmF1bHRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBuaWxsYWJsZQotCXB1YmxpYyBCb29sZWFuIGdldE5pbGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5uaWxsYWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROaWxsYWJsZShCb29sZWFuIG5pbGxhYmxlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXROaWxsYWJsZV8oQm9vbGVhbiBuaWxsYWJsZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMubmlsbGFibGU7Ci0JCXRoaXMubmlsbGFibGUgPSBuaWxsYWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5JTExBQkxFX1BST1BFUlRZLCBvbGQsIG5pbGxhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGROaWxsYWJsZSgpIHsKLQkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX0VMRU1FTlRfX05JTExBQkxFKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5pbGxhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIHJlcXVpcmVkCi0JcHVibGljIEJvb2xlYW4gZ2V0UmVxdWlyZWQoKSB7Ci0JCXJldHVybiB0aGlzLnJlcXVpcmVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKEJvb2xlYW4gcmVxdWlyZWQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFJlcXVpcmVkXyhCb29sZWFuIHJlcXVpcmVkKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5yZXF1aXJlZDsKLQkJdGhpcy5yZXF1aXJlZCA9IHJlcXVpcmVkOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVRVUlSRURfUFJPUEVSVFksIG9sZCwgcmVxdWlyZWQpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZFJlcXVpcmVkKCkgewotCQlyZXR1cm4gKEJvb2xlYW4pIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfRUxFTUVOVF9fUkVRVUlSRUQpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVxdWlyZWRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogdHlwZQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUeXBlXyhTdHJpbmcgdHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy50eXBlOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9QUk9QRVJUWSwgb2xkLCB0eXBlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUVfUFJPUEVSVFksIG9sZCwgdHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUeXBlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9FTEVNRU5UX19UWVBFKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIHR5cGUgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMWJlMjguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudERlY2wKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbgotCQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQkJaW1wbGVtZW50cyBYbWxFbGVtZW50RGVjbEFubm90YXRpb24gewotCQotCXByaXZhdGUgU3RyaW5nIHNjb3BlOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIHN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2U7Ci0JcHJpdmF0ZSBTdHJpbmcgc3Vic3RpdHV0aW9uSGVhZE5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlOwotCQotCQotCXB1YmxpYyBCaW5hcnlYbWxFbGVtZW50RGVjbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5zY29wZSA9IGJ1aWxkU2NvcGUoKTsKLQkJdGhpcy5uYW1lc3BhY2UgPSBidWlsZE5hbWVzcGFjZSgpOwotCQl0aGlzLm5hbWUgPSBidWlsZE5hbWUoKTsKLQkJdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlID0gYnVpbGRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKCk7Ci0JCXRoaXMuc3Vic3RpdHV0aW9uSGVhZE5hbWUgPSBidWlsZFN1YnN0aXR1dGlvbkhlYWROYW1lKCk7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gYnVpbGREZWZhdWx0VmFsdWUoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0VMRU1FTlRfREVDTDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJc2V0U2NvcGVfKGJ1aWxkU2NvcGUoKSk7Ci0JCXNldE5hbWVzcGFjZV8oYnVpbGROYW1lc3BhY2UoKSk7Ci0JCXNldE5hbWVfKGJ1aWxkTmFtZSgpKTsKLQkJc2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZV8oYnVpbGRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKCkpOwotCQlzZXRTdWJzdGl0dXRpb25IZWFkTmFtZV8oYnVpbGRTdWJzdGl0dXRpb25IZWFkTmFtZSgpKTsKLQkJc2V0RGVmYXVsdFZhbHVlXyhidWlsZERlZmF1bHRWYWx1ZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbmFtZXNwYWNlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzcGFjZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXROYW1lc3BhY2VfKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZXNwYWNlOwotCQl0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FU1BBQ0VfUFJPUEVSVFksIG9sZCwgbmFtZXNwYWNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9FTEVNRU5UX0RFQ0xfX05BTUVTUEFDRSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lc3BhY2VUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBuYW1lICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9FTEVNRU5UX0RFQ0xfX05BTUUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzY29wZSAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NvcGUoKSB7Ci0JCXJldHVybiB0aGlzLnNjb3BlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTY29wZShTdHJpbmcgc2NvcGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRTY29wZV8oU3RyaW5nIHNjb3BlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNjb3BlOwotCQl0aGlzLnNjb3BlID0gc2NvcGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0NPUEVfUFJPUEVSVFksIG9sZCwgc2NvcGUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9TQ09QRV9DTEFTU19OQU1FX1BST1BFUlRZLCBvbGQsIHNjb3BlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRTY29wZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX0VMRU1FTlRfREVDTF9fU0NPUEUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNjb3BlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNjb3BlOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKFN0cmluZyBzdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZV8oU3RyaW5nIHN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZTsKLQkJdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlID0gc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTVUJTVElUVVRJT05fSEVBRF9OQU1FU1BBQ0VfUFJPUEVSVFksIG9sZCwgc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkU3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX0VMRU1FTlRfREVDTF9fU1VCU1RJVFVUSU9OX0hFQURfTkFNRVNQQUNFKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBzdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3Vic3RpdHV0aW9uSGVhZE5hbWUgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFN1YnN0aXR1dGlvbkhlYWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3Vic3RpdHV0aW9uSGVhZE5hbWUoU3RyaW5nIHN1YnN0aXR1dGlvbkhlYWROYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVfKFN0cmluZyBzdWJzdGl0dXRpb25IZWFkTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZTsKLQkJdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZSA9IHN1YnN0aXR1dGlvbkhlYWROYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNVQlNUSVRVVElPTl9IRUFEX05BTUVfUFJPUEVSVFksIG9sZCwgc3Vic3RpdHV0aW9uSGVhZE5hbWUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZFN1YnN0aXR1dGlvbkhlYWROYW1lKCkgewotCQlyZXR1cm4gKFN0cmluZykgZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfRUxFTUVOVF9ERUNMX19TVUJTVElUVVRJT05fSEVBRF9OQU1FKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRTdWJzdGl0dXRpb25IZWFkTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gc3Vic3RpdHV0aW9uSGVhZE5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBkZWZhdWx0IHZhbHVlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0VmFsdWVfKFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFZhbHVlOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1ZBTFVFX1BST1BFUlRZLCBvbGQsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gKFN0cmluZykgZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfRUxFTUVOVF9ERUNMX19ERUZBVUxUX1ZBTFVFKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXREZWZhdWx0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sRWxlbWVudFJlZkFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMDdmOGMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sRWxlbWVudFJlZkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50UmVmQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRSZWYKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbgotewotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCXByaXZhdGUgQm9vbGVhbiByZXF1aXJlZDsKLQlwcml2YXRlIFN0cmluZyB0eXBlOwotCi0KLQlwdWJsaWMgQmluYXJ5WG1sRWxlbWVudFJlZkFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoKTsKLQkJdGhpcy5uYW1lc3BhY2UgPSB0aGlzLmJ1aWxkTmFtZXNwYWNlKCk7Ci0JCXRoaXMucmVxdWlyZWQgPSB0aGlzLmJ1aWxkUmVxdWlyZWQoKTsKLQkJdGhpcy50eXBlID0gdGhpcy5idWlsZFR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVF9SRUY7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXROYW1lXyh0aGlzLmJ1aWxkTmFtZSgpKTsKLQkJdGhpcy5zZXROYW1lc3BhY2VfKHRoaXMuYnVpbGROYW1lc3BhY2UoKSk7Ci0JCXRoaXMuc2V0UmVxdWlyZWRfKHRoaXMuYnVpbGRSZXF1aXJlZCgpKTsKLQkJdGhpcy5zZXRUeXBlXyh0aGlzLmJ1aWxkVHlwZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JLy8gKioqKiogbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX0VMRU1FTlRfUkVGX19OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIG5hbWVzcGFjZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE5hbWVzcGFjZV8oU3RyaW5nIG5hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lc3BhY2U7Ci0JCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRVNQQUNFX1BST1BFUlRZLCBvbGQsIG5hbWVzcGFjZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX0VMRU1FTlRfUkVGX19OQU1FU1BBQ0UpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lc3BhY2VUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIHJlcXVpcmVkCi0JcHVibGljIEJvb2xlYW4gZ2V0UmVxdWlyZWQoKSB7Ci0JCXJldHVybiB0aGlzLnJlcXVpcmVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKEJvb2xlYW4gcmVxdWlyZWQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFJlcXVpcmVkXyhCb29sZWFuIHJlcXVpcmVkKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5yZXF1aXJlZDsKLQkJdGhpcy5yZXF1aXJlZCA9IHJlcXVpcmVkOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVRVUlSRURfUFJPUEVSVFksIG9sZCwgcmVxdWlyZWQpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZFJlcXVpcmVkKCkgewotCQlyZXR1cm4gKEJvb2xlYW4pIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfRUxFTUVOVF9fUkVRVUlSRUQpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVxdWlyZWRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogdHlwZQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUeXBlXyhTdHJpbmcgdHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy50eXBlOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9QUk9QRVJUWSwgb2xkLCB0eXBlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUVfUFJPUEVSVFksIG9sZCwgdHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUeXBlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9FTEVNRU5UX1JFRl9fVFlQRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGZ1bGx5LXF1YWxpZmllZCB0eXBlIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxFbGVtZW50UmVmc0Fubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjZhYjRiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50UmVmQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBCaW5hcnlYbWxFbGVtZW50UmVmc0Fubm90YXRpb24KLQkJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JCWltcGxlbWVudHMgWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uIHsKLQkKLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxYbWxFbGVtZW50UmVmQW5ub3RhdGlvbj4geG1sRWxlbWVudFJlZnM7Ci0JCi0JCi0JcHVibGljIEJpbmFyeVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnhtbEVsZW1lbnRSZWZzID0gdGhpcy5idWlsZFhtbEVsZW1lbnRSZWZzKCk7Ci0JfQotCQotCQotCXByaXZhdGUgVmVjdG9yPFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uPiBidWlsZFhtbEVsZW1lbnRSZWZzKCkgewotCQlPYmplY3RbXSBqZHRYbWxFbGVtZW50UmVmcyA9IHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWVzKEpBWEIuWE1MX0VMRU1FTlRfUkVGU19fVkFMVUUpOwotCQlWZWN0b3I8WG1sRWxlbWVudFJlZkFubm90YXRpb24+IHJlc3VsdCA9IG5ldyBWZWN0b3I8WG1sRWxlbWVudFJlZkFubm90YXRpb24+KGpkdFhtbEVsZW1lbnRSZWZzLmxlbmd0aCk7Ci0JCWZvciAoT2JqZWN0IGpkdFhtbEVsZW1lbnRSZWYgOiBqZHRYbWxFbGVtZW50UmVmcykgewotCQkJcmVzdWx0LmFkZChuZXcgQmluYXJ5WG1sRWxlbWVudFJlZkFubm90YXRpb24odGhpcywgKElBbm5vdGF0aW9uKSBqZHRYbWxFbGVtZW50UmVmKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVF9SRUZTOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8WG1sRWxlbWVudFJlZkFubm90YXRpb24+IGdldFhtbEVsZW1lbnRSZWZzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxYbWxFbGVtZW50UmVmQW5ub3RhdGlvbj4odGhpcy54bWxFbGVtZW50UmVmcyk7Ci0JfQotCi0JcHVibGljIGludCBnZXRYbWxFbGVtZW50UmVmc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEVsZW1lbnRSZWZzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy54bWxFbGVtZW50UmVmcy5lbGVtZW50QXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiBhZGRYbWxFbGVtZW50UmVmKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlWG1sRWxlbWVudFJlZihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxFbGVtZW50UmVmKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDQ3MzQ0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRXcmFwcGVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbgotewotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCXByaXZhdGUgQm9vbGVhbiBuaWxsYWJsZTsKLQlwcml2YXRlIEJvb2xlYW4gcmVxdWlyZWQ7Ci0KLQotCXB1YmxpYyBCaW5hcnlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoKTsKLQkJdGhpcy5uYW1lc3BhY2UgPSB0aGlzLmJ1aWxkTmFtZXNwYWNlKCk7Ci0JCXRoaXMubmlsbGFibGUgPSB0aGlzLmJ1aWxkTmlsbGFibGUoKTsKLQkJdGhpcy5yZXF1aXJlZCA9IHRoaXMuYnVpbGRSZXF1aXJlZCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXROYW1lXyh0aGlzLmJ1aWxkTmFtZSgpKTsKLQkJdGhpcy5zZXROYW1lc3BhY2VfKHRoaXMuYnVpbGROYW1lc3BhY2UoKSk7Ci0JCXRoaXMuc2V0TmlsbGFibGVfKHRoaXMuYnVpbGROaWxsYWJsZSgpKTsKLQkJdGhpcy5zZXRSZXF1aXJlZF8odGhpcy5idWlsZFJlcXVpcmVkKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JLy8gKioqKiogbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUl9fTkFNRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbmFtZXNwYWNlCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TmFtZXNwYWNlXyhTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWVzcGFjZTsKLQkJdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FU1BBQ0VfUFJPUEVSVFksIG9sZCwgbmFtZXNwYWNlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSX19OQU1FU1BBQ0UpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lc3BhY2VUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBuaWxsYWJsZQotCXB1YmxpYyBCb29sZWFuIGdldE5pbGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5uaWxsYWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROaWxsYWJsZShCb29sZWFuIG5pbGxhYmxlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXROaWxsYWJsZV8oQm9vbGVhbiBuaWxsYWJsZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMubmlsbGFibGU7Ci0JCXRoaXMubmlsbGFibGUgPSBuaWxsYWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5JTExBQkxFX1BST1BFUlRZLCBvbGQsIG5pbGxhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGROaWxsYWJsZSgpIHsKLQkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUl9fTklMTEFCTEUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmlsbGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogcmVxdWlyZWQKLQlwdWJsaWMgQm9vbGVhbiBnZXRSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMucmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoQm9vbGVhbiByZXF1aXJlZCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVxdWlyZWRfKEJvb2xlYW4gcmVxdWlyZWQpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnJlcXVpcmVkOwotCQl0aGlzLnJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRVFVSVJFRF9QUk9QRVJUWSwgb2xkLCByZXF1aXJlZCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkUmVxdWlyZWQoKSB7Ci0JCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVJfX1JFUVVJUkVEKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlcXVpcmVkVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVsZW1lbnRzQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sRWxlbWVudHNBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZDZmMWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sRWxlbWVudHNBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50c0Fubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50cwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5WG1sRWxlbWVudHNBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxFbGVtZW50c0Fubm90YXRpb24KLXsKLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxYbWxFbGVtZW50QW5ub3RhdGlvbj4geG1sRWxlbWVudHM7Ci0KLQotCXB1YmxpYyBCaW5hcnlYbWxFbGVtZW50c0Fubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy54bWxFbGVtZW50cyA9IHRoaXMuYnVpbGRYbWxFbGVtZW50cygpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFhtbEVsZW1lbnRBbm5vdGF0aW9uPiBidWlsZFhtbEVsZW1lbnRzKCkgewotCQlPYmplY3RbXSBqZHRYbWxFbGVtZW50cyA9IHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWVzKEpBWEIuWE1MX0VMRU1FTlRTX19WQUxVRSk7Ci0JCVZlY3RvcjxYbWxFbGVtZW50QW5ub3RhdGlvbj4gcmVzdWx0ID0gbmV3IFZlY3RvcjxYbWxFbGVtZW50QW5ub3RhdGlvbj4oamR0WG1sRWxlbWVudHMubGVuZ3RoKTsKLQkJZm9yIChPYmplY3QgamR0WG1sRWxlbWVudCA6IGpkdFhtbEVsZW1lbnRzKSB7Ci0JCQlyZXN1bHQuYWRkKG5ldyBCaW5hcnlYbWxFbGVtZW50QW5ub3RhdGlvbih0aGlzLCAoSUFubm90YXRpb24pIGpkdFhtbEVsZW1lbnQpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9FTEVNRU5UUzsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFhtbEVsZW1lbnRBbm5vdGF0aW9uPiBnZXRYbWxFbGVtZW50cygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8WG1sRWxlbWVudEFubm90YXRpb24+KHRoaXMueG1sRWxlbWVudHMpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sRWxlbWVudHNTaXplKCkgewotCQlyZXR1cm4gdGhpcy54bWxFbGVtZW50cy5zaXplKCk7Ci0JfQotCi0JcHVibGljIFhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMueG1sRWxlbWVudHMuZWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgWG1sRWxlbWVudEFubm90YXRpb24gYWRkWG1sRWxlbWVudChpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVhtbEVsZW1lbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sRWxlbWVudChpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sRW51bUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVudW1Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYWZmM2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sRW51bUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVudW1Bbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRW51bQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5WG1sRW51bUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEVudW1Bbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQotCXB1YmxpYyBCaW5hcnlYbWxFbnVtQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0VOVU07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYbWxFbnVtIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfVkFMVUVfQ0xBU1NfTkFNRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfRU5VTV9fVkFMVUUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIHZhbHVlIGNsYXNzIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVmFsdWVDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVudW1WYWx1ZUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVudW1WYWx1ZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNjYzQ4MC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxFbnVtVmFsdWVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbnVtVmFsdWVBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRW51bVZhbHVlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlYbWxFbnVtVmFsdWVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxFbnVtVmFsdWVBbm5vdGF0aW9uCi17Ci0KLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotCXB1YmxpYyBCaW5hcnlYbWxFbnVtVmFsdWVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRU5VTV9WQUxVRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhtbEVudW1WYWx1ZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfRU5VTV9WQUxVRV9fVkFMVUUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHZhbHVlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxJREFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbElEQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDBkZmExLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbElEQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSURBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbElEQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sSURBbm5vdGF0aW9uCi17Ci0KLQlwdWJsaWMgQmluYXJ5WG1sSURBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0lEOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbElEUkVGQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sSURSRUZBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ODM2MTEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sSURSRUZBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxJRFJFRkFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRFJFRgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5WG1sSURSRUZBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxJRFJFRkFubm90YXRpb24KLXsKLQotCXB1YmxpYyBCaW5hcnlYbWxJRFJFRkFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfSURSRUY7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYTU0ODYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb24KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uIHsKLQkKLQlwdWJsaWMgQmluYXJ5WG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0lOTElORV9CSU5BUllfREFUQTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYmRkNmIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24KLQkJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JCWltcGxlbWVudHMgWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiB7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLQkKLQkKLQlwdWJsaWMgQmluYXJ5WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnZhbHVlID0gYnVpbGRWYWx1ZSgpOwotCQl0aGlzLnR5cGUgPSBidWlsZFR5cGUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQlzZXRWYWx1ZV8oYnVpbGRWYWx1ZSgpKTsKLQkJc2V0VHlwZV8oYnVpbGRUeXBlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUl9fVkFMVUUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQkKLQkvLyAqKioqKiB0eXBlCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy50eXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VHlwZV8oU3RyaW5nIHR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudHlwZTsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRZUEVfUFJPUEVSVFksIG9sZCwgdHlwZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfVFlQRV9QUk9QRVJUWSwgb2xkLCB0eXBlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUeXBlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUl9fVFlQRSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sTGlzdEFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbExpc3RBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiM2Y5NTIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sTGlzdEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbExpc3RBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTGlzdAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5WG1sTGlzdEFubm90YXRpb24KLQkJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JCWltcGxlbWVudHMgWG1sTGlzdEFubm90YXRpb24gewotCQotCXB1YmxpYyBCaW5hcnlYbWxMaXN0QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfTElTVDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxNaW1lVHlwZUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbE1pbWVUeXBlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTI1ZjJkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbE1pbWVUeXBlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTWltZVR5cGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTWltZVR5cGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbE1pbWVUeXBlQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sTWltZVR5cGVBbm5vdGF0aW9uCi17Ci0KLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotCXB1YmxpYyBCaW5hcnlYbWxNaW1lVHlwZUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9NSU1FX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYbWxNaW1lVHlwZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfTUlNRV9UWVBFX19WQUxVRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbE1peGVkQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sTWl4ZWRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOGQ1NjMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sTWl4ZWRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxNaXhlZEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxNaXhlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5WG1sTWl4ZWRBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbE1peGVkQW5ub3RhdGlvbiB7Ci0JCi0JcHVibGljIEJpbmFyeVhtbE1peGVkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfTUlYRUQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sUmVnaXN0cnlBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxSZWdpc3RyeUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBjOTYzZi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxSZWdpc3RyeUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFJlZ2lzdHJ5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlYbWxSZWdpc3RyeUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbFJlZ2lzdHJ5QW5ub3RhdGlvbgotewotCi0JcHVibGljIEJpbmFyeVhtbFJlZ2lzdHJ5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9SRUdJU1RSWTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxSb290RWxlbWVudEFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzJlNjE1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlYbWxSb290RWxlbWVudEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbgotewotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCi0KLQlwdWJsaWMgQmluYXJ5WG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKCk7Ci0JCXRoaXMubmFtZXNwYWNlID0gdGhpcy5idWlsZE5hbWVzcGFjZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9ST09UX0VMRU1FTlQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXROYW1lXyh0aGlzLmJ1aWxkTmFtZSgpKTsKLQkJdGhpcy5zZXROYW1lc3BhY2VfKHRoaXMuYnVpbGROYW1lc3BhY2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9ST09UX0VMRU1FTlRfX05BTUUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCQotCS8vICoqKioqIG5hbWVzcGFjZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE5hbWVzcGFjZV8oU3RyaW5nIG5hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lc3BhY2U7Ci0JCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRVNQQUNFX1BST1BFUlRZLCBvbGQsIG5hbWVzcGFjZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX1JPT1RfRUxFTUVOVF9fTkFNRVNQQUNFKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVzcGFjZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZXNwYWNlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxTZWVBbHNvQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sU2VlQWxzb0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UwYjA5MS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxTZWVBbHNvQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sU2VlQWxzb0Fubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTZWVBbHNvCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlYbWxTZWVBbHNvQW5ub3RhdGlvbgotCQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQkJaW1wbGVtZW50cyBYbWxTZWVBbHNvQW5ub3RhdGlvbiB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8U3RyaW5nPiBjbGFzc2VzOwotCi0KLQlwdWJsaWMgQmluYXJ5WG1sU2VlQWxzb0Fubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5jbGFzc2VzID0gdGhpcy5idWlsZENsYXNzZXMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfU0VFX0FMU087Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVDbGFzc2VzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5jbGFzc2VzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogWG1sU2VlQWxzb0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2xhc3NlcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLmNsYXNzZXMpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q2xhc3Nlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNsYXNzZXMuc2l6ZSgpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRDbGFzc2VzKCkgewotCQlPYmplY3RbXSBqZHRDbGFzc2VzID0gdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZXMoSkFYQi5YTUxfU0VFX0FMU09fX1ZBTFVFKTsKLQkJVmVjdG9yPFN0cmluZz4gcmVzdWx0ID0gbmV3IFZlY3RvcjxTdHJpbmc+KGpkdENsYXNzZXMubGVuZ3RoKTsKLQkJZm9yIChPYmplY3QgamR0Q2xhc3MgOiBqZHRDbGFzc2VzKSB7Ci0JCQlyZXN1bHQuYWRkKChTdHJpbmcpIGpkdENsYXNzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENsYXNzKFN0cmluZyBjbGF6eikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDbGFzcyhpbnQgaW5kZXgsIFN0cmluZyBjbGF6eikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlQ2xhc3MoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2xhc3MoU3RyaW5nIGNsYXp6KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNsYXNzKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NlcygpIHsKLQkJcmV0dXJuIGdldENsYXNzZXMoKTsKLQl9Ci0KLQkvLyBUT0RPCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNsYXNzZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sVHJhbnNpZW50QW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sVHJhbnNpZW50QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM3MWRkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbFRyYW5zaWVudEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFRyYW5zaWVudEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUcmFuc2llbnQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbFRyYW5zaWVudEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbFRyYW5zaWVudEFubm90YXRpb24KLXsKLQotCXB1YmxpYyBCaW5hcnlYbWxUcmFuc2llbnRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX1RSQU5TSUVOVDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxUeXBlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sVHlwZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkMDhmNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxUeXBlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sVHlwZUFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlYbWxUeXBlQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sVHlwZUFubm90YXRpb24KLXsKLQlwcml2YXRlIFN0cmluZyBmYWN0b3J5Q2xhc3M7Ci0JcHJpdmF0ZSBTdHJpbmcgZmFjdG9yeU1ldGhvZDsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxTdHJpbmc+IHByb3BPcmRlcjsKLQotCi0JcHVibGljIEJpbmFyeVhtbFR5cGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMuZmFjdG9yeUNsYXNzID0gdGhpcy5idWlsZEZhY3RvcnlDbGFzcygpOwotCQl0aGlzLmZhY3RvcnlNZXRob2QgPSB0aGlzLmJ1aWxkRmFjdG9yeU1ldGhvZCgpOwotCQl0aGlzLm5hbWUgPSB0aGlzLmJ1aWxkTmFtZSgpOwotCQl0aGlzLm5hbWVzcGFjZSA9IHRoaXMuYnVpbGROYW1lc3BhY2UoKTsKLQkJdGhpcy5wcm9wT3JkZXIgPSB0aGlzLmJ1aWxkUHJvcE9yZGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRGYWN0b3J5Q2xhc3NfKHRoaXMuYnVpbGRGYWN0b3J5Q2xhc3MoKSk7Ci0JCXRoaXMuc2V0RmFjdG9yeU1ldGhvZF8odGhpcy5idWlsZEZhY3RvcnlNZXRob2QoKSk7Ci0JCXRoaXMuc2V0TmFtZV8odGhpcy5idWlsZE5hbWUoKSk7Ci0JCXRoaXMuc2V0TmFtZXNwYWNlXyh0aGlzLmJ1aWxkTmFtZXNwYWNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhtbFR5cGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIGZhY3RvcnlDbGFzcwotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5mYWN0b3J5Q2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmFjdG9yeUNsYXNzKFN0cmluZyBmYWN0b3J5Q2xhc3MpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEZhY3RvcnlDbGFzc18oU3RyaW5nIGZhY3RvcnlDbGFzcykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mYWN0b3J5Q2xhc3M7Ci0JCXRoaXMuZmFjdG9yeUNsYXNzID0gZmFjdG9yeUNsYXNzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkFDVE9SWV9DTEFTU19QUk9QRVJUWSwgb2xkLCBmYWN0b3J5Q2xhc3MpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRlVMTFlfUVVBTElGSUVEX0ZBQ1RPUllfQ0xBU1NfTkFNRV9QUk9QRVJUWSwgb2xkLCBmYWN0b3J5Q2xhc3MpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRmFjdG9yeUNsYXNzKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9UWVBFX19GQUNUT1JZX0NMQVNTKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEZhY3RvcnlDbGFzc1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBmdWxseS1xdWFsaWZpZWQgZmFjdG9yeSBjbGFzcyBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZEZhY3RvcnlDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmZhY3RvcnlDbGFzczsKLQl9Ci0KLQkvLyAqKioqKiBmYWN0b3J5TWV0aG9kCi0JcHVibGljIFN0cmluZyBnZXRGYWN0b3J5TWV0aG9kKCkgewotCQlyZXR1cm4gdGhpcy5mYWN0b3J5TWV0aG9kOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZhY3RvcnlNZXRob2QoU3RyaW5nIGZhY3RvcnlNZXRob2QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEZhY3RvcnlNZXRob2RfKFN0cmluZyBmYWN0b3J5TWV0aG9kKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmZhY3RvcnlNZXRob2Q7Ci0JCXRoaXMuZmFjdG9yeU1ldGhvZCA9IGZhY3RvcnlNZXRob2Q7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGQUNUT1JZX01FVEhPRF9QUk9QRVJUWSwgb2xkLCBmYWN0b3J5TWV0aG9kKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZhY3RvcnlNZXRob2QoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX1RZUEVfX0ZBQ1RPUllfTUVUSE9EKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEZhY3RvcnlNZXRob2RUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX1RZUEVfX05BTUUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBuYW1lc3BhY2UKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXROYW1lc3BhY2VfKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZXNwYWNlOwotCQl0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVTUEFDRV9QUk9QRVJUWSwgb2xkLCBuYW1lc3BhY2UpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZXNwYWNlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9UWVBFX19OQU1FU1BBQ0UpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lc3BhY2VUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBwcm9wIG9yZGVyCi0JcHVibGljIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldFByb3BPcmRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLnByb3BPcmRlcik7Ci0JfQotCi0JcHVibGljIGludCBnZXRQcm9wT3JkZXJTaXplKCkgewotCQlyZXR1cm4gdGhpcy5wcm9wT3JkZXIuc2l6ZSgpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRQcm9wT3JkZXIoKSB7Ci0JCU9iamVjdFtdIGpkdFByb3BPcmRlciA9IHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWVzKEpBWEIuWE1MX1RZUEVfX1BST1BfT1JERVIpOwotCQlWZWN0b3I8U3RyaW5nPiByZXN1bHQgPSBuZXcgVmVjdG9yPFN0cmluZz4oamR0UHJvcE9yZGVyLmxlbmd0aCk7Ci0JCWZvciAoT2JqZWN0IGpkdFByb3AgOiBqZHRQcm9wT3JkZXIpIHsKLQkJCXJlc3VsdC5hZGQoKFN0cmluZykgamR0UHJvcCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQcm9wKFN0cmluZyBwcm9wT3JkZXIpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUHJvcChpbnQgaW5kZXgsIFN0cmluZyBwcm9wT3JkZXIpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVByb3AoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcChTdHJpbmcgcHJvcE9yZGVyKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3AoaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFByb3BPcmRlclRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcHJvcE9yZGVyVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRQcm9wVGV4dFJhbmdlKGludCBpbmRleCwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHByb3BUb3VjaGVzKGludCBpbmRleCwgaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sVmFsdWVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxWYWx1ZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYxOWYzOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxWYWx1ZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFZhbHVlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFZhbHVlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlYbWxWYWx1ZUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbFZhbHVlQW5ub3RhdGlvbgotewotCi0JcHVibGljIEJpbmFyeVhtbFZhbHVlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9WQUxVRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFlMzExOS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JPcmRlcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUik7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFZBTFVFX0FEQVBURVIgPSBidWlsZFZhbHVlQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVBZGFwdGVyOwotCXByaXZhdGUgWG1sQWNjZXNzT3JkZXIgdmFsdWU7Ci0KLQotCXB1YmxpYyBTb3VyY2VYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRlZEVsZW1lbnQsIFZBTFVFX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKioqKiBYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBYbWxBY2Nlc3NPcmRlciBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoWG1sQWNjZXNzT3JkZXIgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUoWG1sQWNjZXNzT3JkZXIudG9KYXZhQW5ub3RhdGlvblZhbHVlKHZhbHVlKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1ZhbHVlKFhtbEFjY2Vzc09yZGVyIGFzdFZhbHVlKSB7Ci0JCVhtbEFjY2Vzc09yZGVyIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFhtbEFjY2Vzc09yZGVyIGJ1aWxkVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIFhtbEFjY2Vzc09yZGVyLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMudmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRWYWx1ZUFkYXB0ZXIoKSB7Ci0JCS8vcmVtb3ZlIHRoZSBYbWxBY2Nlc3Nvck9yZGVyIGFubm90YXRpb24gd2hlbiB0aGUgdmFsdWUgZWxlbWVudCBpcyByZW1vdmVkLgotCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpBWEIuWE1MX0FDQ0VTU09SX09SREVSX19WQUxVRSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjM2IwYmIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfQUNDRVNTT1JfVFlQRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFZBTFVFX0FEQVBURVIgPSBidWlsZFZhbHVlQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVBZGFwdGVyOwotCXByaXZhdGUgWG1sQWNjZXNzVHlwZSB2YWx1ZTsKLQotCi0JcHVibGljIFNvdXJjZVhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0ZWRFbGVtZW50LCBWQUxVRV9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfQUNDRVNTT1JfVFlQRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKioqKiBYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFhtbEFjY2Vzc1R5cGUgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFhtbEFjY2Vzc1R5cGUgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUoWG1sQWNjZXNzVHlwZS50b0phdmFBbm5vdGF0aW9uVmFsdWUodmFsdWUpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVmFsdWUoWG1sQWNjZXNzVHlwZSBhc3RWYWx1ZSkgewotCQlYbWxBY2Nlc3NUeXBlIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFhtbEFjY2Vzc1R5cGUgYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gWG1sQWNjZXNzVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgewotCQkvL3JlbW92ZSB0aGUgWG1sQWNjZXNzb3JUeXBlIGFubm90YXRpb24gd2hlbiB0aGUgdmFsdWUgZWxlbWVudCBpcyByZW1vdmVkLgotCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpBWEIuWE1MX0FDQ0VTU09SX1RZUEVfX1ZBTFVFKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEFueUF0dHJpYnV0ZUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEFueUF0dHJpYnV0ZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE3MGZhOS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFueUF0dHJpYnV0ZUFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlBdHRyaWJ1dGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVhtbEFueUF0dHJpYnV0ZUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEFueUF0dHJpYnV0ZUFubm90YXRpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfQU5ZX0FUVFJJQlVURSk7Ci0KLQlwdWJsaWMgU291cmNlWG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfQU5ZX0FUVFJJQlVURTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm8tb3AKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9uby1vcAotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEFueUVsZW1lbnRBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxBbnlFbGVtZW50QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2UxM2JjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEFueUVsZW1lbnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFueUVsZW1lbnRBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQW55RWxlbWVudAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlWG1sQW55RWxlbWVudEFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEFueUVsZW1lbnRBbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpBWEIuWE1MX0FOWV9FTEVNRU5UKTsKLQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gbGF4RGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGxheEFkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIGxheDsKLQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIFNvdXJjZVhtbEFueUVsZW1lbnRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJdGhpcyhwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcihhbm5vdGF0ZWRFbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpKTsKLQl9Ci0KLQlwdWJsaWMgU291cmNlWG1sQW55RWxlbWVudEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMubGF4RGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZExheEFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5sYXhBZGFwdGVyID0gdGhpcy5idWlsZFNob3J0Q2lyY3VpdEJvb2xlYW5FbGVtZW50QWRhcHRlcih0aGlzLmxheERlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMudmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkVmFsdWVBZGFwdGVyKGRhYSk7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLnZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkTGF4QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckJvb2xlYW5zKGRhYSwgSkFYQi5YTUxfQU5ZX0VMRU1FTlRfX0xBWCk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsIEpBWEIuWE1MX0FOWV9FTEVNRU5UX19WQUxVRSwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGNvbnZlcnRlcikgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgY29udmVydGVyKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSkgewotCQlyZXR1cm4gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIGRhZWEpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkU2hvcnRDaXJjdWl0Qm9vbGVhbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgZGFlYSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0FOWV9FTEVNRU5UOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5sYXggPSB0aGlzLmJ1aWxkTGF4KGFzdFJvb3QpOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkVmFsdWVDbGFzc05hbWUgPSB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRWYWx1ZUNsYXNzTmFtZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jTGF4KHRoaXMuYnVpbGRMYXgoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNGdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lKHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogWG1sQW55RWxlbWVudEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogbGF4Ci0JcHVibGljIEJvb2xlYW4gZ2V0TGF4KCkgewotCQlyZXR1cm4gdGhpcy5sYXg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGF4KEJvb2xlYW4gbGF4KSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmxheCwgbGF4KSkgewotCQkJdGhpcy5sYXggPSBsYXg7Ci0JCQl0aGlzLmxheEFkYXB0ZXIuc2V0VmFsdWUobGF4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jTGF4KEJvb2xlYW4gYXN0TGF4KSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5sYXg7Ci0JCXRoaXMubGF4ID0gYXN0TGF4OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTEFYX1BST1BFUlRZLCBvbGQsIGFzdExheCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkTGF4KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmxheEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRMYXhUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmxheERlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZShTdHJpbmcgYXN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy52YWx1ZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCS8vICoqKioqIGZ1bGx5LXF1YWxpZmllZCB2YWx1ZSBjbGFzcyBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5mdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jRnVsbHlRdWFsaWZpZWRWYWx1ZUNsYXNzTmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkVmFsdWVDbGFzc05hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRlVMTFlfUVVBTElGSUVEX1ZBTFVFX0NMQVNTX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSBudWxsKSA/IG51bGwgOiBBU1RUb29scy5yZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKHRoaXMudmFsdWVBZGFwdGVyLmdldEV4cHJlc3Npb24oYXN0Um9vdCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWFkZGQ5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0YWNobWVudFJlZgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlWG1sQXR0YWNobWVudFJlZkFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpBWEIuWE1MX0FUVEFDSE1FTlRfUkVGKTsKLQotCXB1YmxpYyBTb3VyY2VYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfQVRUQUNITUVOVF9SRUY7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vLW9wCi0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm8tb3AKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZDk0MmUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sQXR0cmlidXRlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQXR0cmlidXRlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlWG1sQXR0cmlidXRlQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sQXR0cmlidXRlQW5ub3RhdGlvbgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKQVhCLlhNTF9BVFRSSUJVVEUpOwotCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVzcGFjZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiByZXF1aXJlZERlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiByZXF1aXJlZEFkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIHJlcXVpcmVkOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIFNvdXJjZVhtbEF0dHJpYnV0ZUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQl0aGlzKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUikpOwotCX0KLQotCXB1YmxpYyBTb3VyY2VYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZUFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5uYW1lQWRhcHRlciA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5uYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZXNwYWNlQWRhcHRlcihkYWEpOwotCQl0aGlzLm5hbWVzcGFjZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5yZXF1aXJlZERlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRSZXF1aXJlZEFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5yZXF1aXJlZEFkYXB0ZXIgPSB0aGlzLmJ1aWxkU2hvcnRDaXJjdWl0Qm9vbGVhbkVsZW1lbnRBZGFwdGVyKHRoaXMucmVxdWlyZWREZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE5hbWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsIEpBWEIuWE1MX0FUVFJJQlVURV9fTkFNRSk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTmFtZXNwYWNlQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCBKQVhCLlhNTF9BVFRSSUJVVEVfX05BTUVTUEFDRSk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFJlcXVpcmVkQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckJvb2xlYW5zKGRhYSwgSkFYQi5YTUxfQVRUUklCVVRFX19SRVFVSVJFRCk7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFNob3J0Q2lyY3VpdEJvb2xlYW5FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIGRhZWEpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9BVFRSSUJVVEU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLm5hbWUgPSB0aGlzLmJ1aWxkTmFtZShhc3RSb290KTsKLQkJdGhpcy5uYW1lc3BhY2UgPSB0aGlzLmJ1aWxkTmFtZXNwYWNlKGFzdFJvb3QpOwotCQl0aGlzLnJlcXVpcmVkID0gdGhpcy5idWlsZFJlcXVpcmVkKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNOYW1lKHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jTmFtZXNwYWNlKHRoaXMuYnVpbGROYW1lc3BhY2UoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNSZXF1aXJlZCh0aGlzLmJ1aWxkUmVxdWlyZWQoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhtbEF0dHJpYnV0ZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLm5hbWUsIG5hbWUpKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5uYW1lQWRhcHRlci5zZXRWYWx1ZShuYW1lKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jTmFtZShTdHJpbmcgYXN0TmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBhc3ROYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBhc3ROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbmFtZXNwYWNlCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lc3BhY2UsIG5hbWVzcGFjZSkpIHsKLQkJCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQkJdGhpcy5uYW1lc3BhY2VBZGFwdGVyLnNldFZhbHVlKG5hbWVzcGFjZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY05hbWVzcGFjZShTdHJpbmcgYXN0TmFtZXNwYWNlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWVzcGFjZTsKLQkJdGhpcy5uYW1lc3BhY2UgPSBhc3ROYW1lc3BhY2U7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FU1BBQ0VfUFJPUEVSVFksIG9sZCwgYXN0TmFtZXNwYWNlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWVzcGFjZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2VBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5uYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lc3BhY2VUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBlbGVtZW50VG91Y2hlcyh0aGlzLm5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogcmVxdWlyZWQKLQlwdWJsaWMgQm9vbGVhbiBnZXRSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMucmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoQm9vbGVhbiByZXF1aXJlZCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5yZXF1aXJlZCwgcmVxdWlyZWQpKSB7Ci0JCQl0aGlzLnJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0JCQl0aGlzLnJlcXVpcmVkQWRhcHRlci5zZXRWYWx1ZShyZXF1aXJlZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1JlcXVpcmVkKEJvb2xlYW4gYXN0UmVxdWlyZWQpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnJlcXVpcmVkOwotCQl0aGlzLnJlcXVpcmVkID0gYXN0UmVxdWlyZWQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRVFVSVJFRF9QUk9QRVJUWSwgb2xkLCBhc3RSZXF1aXJlZCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkUmVxdWlyZWQoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucmVxdWlyZWRBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVxdWlyZWRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnJlcXVpcmVkRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxFbGVtZW50QW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sRWxlbWVudEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNiN2Y2MC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxFbGVtZW50QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlWG1sRWxlbWVudEFubm90YXRpb24KLQkJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JCWltcGxlbWVudHMgWG1sRWxlbWVudEFubm90YXRpb24gewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCi0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lc3BhY2VBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQkKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IG5pbGxhYmxlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IG5pbGxhYmxlQWRhcHRlcjsKLQlwcml2YXRlIEJvb2xlYW4gbmlsbGFibGU7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiByZXF1aXJlZERlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiByZXF1aXJlZEFkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIHJlcXVpcmVkOwotCQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkZWZhdWx0VmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkZWZhdWx0VmFsdWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZTsKLQkKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdHlwZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHR5cGVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHR5cGU7Ci0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZTsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIFNvdXJjZVhtbEVsZW1lbnRBbm5vdGF0aW9uIGJ1aWxkU291cmNlWG1sRWxlbWVudEFubm90YXRpb24oCi0JCQlKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJCi0JCXJldHVybiBuZXcgU291cmNlWG1sRWxlbWVudEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFNvdXJjZVhtbEVsZW1lbnRBbm5vdGF0aW9uIGJ1aWxkTmVzdGVkU291cmNlWG1sRWxlbWVudEFubm90YXRpb24oCi0JCQlKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIAotCQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSkgewotCQkKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxFbGVtZW50QW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGlkYWEpOwotCX0KLQkKLQkKLQlwcml2YXRlIFNvdXJjZVhtbEVsZW1lbnRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXRoaXMocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBkYWEsIG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIoYW5ub3RhdGVkRWxlbWVudCwgZGFhKSk7Ci0JfQotCQotCXByaXZhdGUgU291cmNlWG1sRWxlbWVudEFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSkgewotCQl0aGlzKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgaWRhYSwgbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoYW5ub3RhdGVkRWxlbWVudCwgaWRhYSkpOwotCX0KLQkKLQlwcml2YXRlIFNvdXJjZVhtbEVsZW1lbnRBbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIAotCQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCAKLQkJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCAKLQkJCUFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCQotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZUFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5uYW1lQWRhcHRlciA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5uYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZXNwYWNlQWRhcHRlcihkYWEpOwotCQl0aGlzLm5hbWVzcGFjZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5uaWxsYWJsZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGROaWxsYWJsZUFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5uaWxsYWJsZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkU2hvcnRDaXJjdWl0Qm9vbGVhbkVsZW1lbnRBZGFwdGVyKHRoaXMubmlsbGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLnJlcXVpcmVkRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZFJlcXVpcmVkQWRhcHRlcihkYWEpOwotCQl0aGlzLnJlcXVpcmVkQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRCb29sZWFuRWxlbWVudEFkYXB0ZXIodGhpcy5yZXF1aXJlZERlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZERlZmF1bHRWYWx1ZUFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5kZWZhdWx0VmFsdWVBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLmRlZmF1bHRWYWx1ZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMudHlwZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRUeXBlQWRhcHRlcihkYWEpOwotCQl0aGlzLnR5cGVBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLnR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQkKLQkKLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCBKQVhCLlhNTF9FTEVNRU5UX19OQU1FKTsKLQl9Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lc3BhY2VBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsIEpBWEIuWE1MX0VMRU1FTlRfX05BTUVTUEFDRSk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZE5pbGxhYmxlQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckJvb2xlYW5zKGRhYSwgSkFYQi5YTUxfRUxFTUVOVF9fTklMTEFCTEUpOwotCX0KLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRSZXF1aXJlZEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JCb29sZWFucyhkYWEsIEpBWEIuWE1MX0VMRU1FTlRfX1JFUVVJUkVEKTsKLQl9Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGREZWZhdWx0VmFsdWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsIEpBWEIuWE1MX0VMRU1FTlRfX0RFRkFVTFRfVkFMVUUpOwotCX0KLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFR5cGVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsIEpBWEIuWE1MX0VMRU1FTlRfX1RZUEUsIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gY29udmVydGVyKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBjb252ZXJ0ZXIpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgZGFlYSk7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRTaG9ydENpcmN1aXRCb29sZWFuRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSkgewotCQlyZXR1cm4gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpOwotCQl0aGlzLm5hbWVzcGFjZSA9IHRoaXMuYnVpbGROYW1lc3BhY2UoYXN0Um9vdCk7Ci0JCXRoaXMubmlsbGFibGUgPSB0aGlzLmJ1aWxkTmlsbGFibGUoYXN0Um9vdCk7Ci0JCXRoaXMucmVxdWlyZWQgPSB0aGlzLmJ1aWxkUmVxdWlyZWQoYXN0Um9vdCk7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gdGhpcy5idWlsZERlZmF1bHRWYWx1ZShhc3RSb290KTsKLQkJdGhpcy50eXBlID0gdGhpcy5idWlsZFR5cGUoYXN0Um9vdCk7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSA9IHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZFR5cGVOYW1lKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNOYW1lKHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jTmFtZXNwYWNlKHRoaXMuYnVpbGROYW1lc3BhY2UoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNOaWxsYWJsZSh0aGlzLmJ1aWxkTmlsbGFibGUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNSZXF1aXJlZCh0aGlzLmJ1aWxkUmVxdWlyZWQoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNEZWZhdWx0VmFsdWUodGhpcy5idWlsZERlZmF1bHRWYWx1ZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY1R5cGUodGhpcy5idWlsZFR5cGUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNGdWxseVF1YWxpZmllZFR5cGVOYW1lKHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZFR5cGVOYW1lKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYbWxFbGVtZW50QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBuYW1lCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMubmFtZSwgbmFtZSkpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKG5hbWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNOYW1lKFN0cmluZyBhc3ROYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IGFzdE5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIGFzdE5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZWxlbWVudFRvdWNoZXModGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBuYW1lc3BhY2UKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLm5hbWVzcGFjZSwgbmFtZXNwYWNlKSkgewotCQkJdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JCQl0aGlzLm5hbWVzcGFjZUFkYXB0ZXIuc2V0VmFsdWUobmFtZXNwYWNlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jTmFtZXNwYWNlKFN0cmluZyBhc3ROYW1lc3BhY2UpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZXNwYWNlOwotCQl0aGlzLm5hbWVzcGFjZSA9IGFzdE5hbWVzcGFjZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVTUEFDRV9QUk9QRVJUWSwgb2xkLCBhc3ROYW1lc3BhY2UpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZXNwYWNlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzcGFjZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lc3BhY2VUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG5hbWVzcGFjZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKHRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBuaWxsYWJsZQotCXB1YmxpYyBCb29sZWFuIGdldE5pbGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5uaWxsYWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROaWxsYWJsZShCb29sZWFuIG5pbGxhYmxlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLm5pbGxhYmxlLCBuaWxsYWJsZSkpIHsKLQkJCXRoaXMubmlsbGFibGUgPSBuaWxsYWJsZTsKLQkJCXRoaXMubmlsbGFibGVBZGFwdGVyLnNldFZhbHVlKG5pbGxhYmxlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jTmlsbGFibGUoQm9vbGVhbiBhc3ROaWxsYWJsZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMubmlsbGFibGU7Ci0JCXRoaXMubmlsbGFibGUgPSBhc3ROaWxsYWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5JTExBQkxFX1BST1BFUlRZLCBvbGQsIGFzdE5pbGxhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGROaWxsYWJsZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uaWxsYWJsZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmlsbGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm5pbGxhYmxlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiByZXF1aXJlZAotCXB1YmxpYyBCb29sZWFuIGdldFJlcXVpcmVkKCkgewotCQlyZXR1cm4gdGhpcy5yZXF1aXJlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZChCb29sZWFuIHJlcXVpcmVkKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnJlcXVpcmVkLCByZXF1aXJlZCkpIHsKLQkJCXRoaXMucmVxdWlyZWQgPSByZXF1aXJlZDsKLQkJCXRoaXMucmVxdWlyZWRBZGFwdGVyLnNldFZhbHVlKHJlcXVpcmVkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jUmVxdWlyZWQoQm9vbGVhbiBhc3RSZXF1aXJlZCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMucmVxdWlyZWQ7Ci0JCXRoaXMucmVxdWlyZWQgPSBhc3RSZXF1aXJlZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFUVVJUkVEX1BST1BFUlRZLCBvbGQsIGFzdFJlcXVpcmVkKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGRSZXF1aXJlZChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5yZXF1aXJlZEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVxdWlyZWRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnJlcXVpcmVkRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBkZWZhdWx0VmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZShTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmRlZmF1bHRWYWx1ZSwgZGVmYXVsdFZhbHVlKSkgewotCQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JCQl0aGlzLmRlZmF1bHRWYWx1ZUFkYXB0ZXIuc2V0VmFsdWUoZGVmYXVsdFZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jRGVmYXVsdFZhbHVlKFN0cmluZyBhc3REZWZhdWx0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFZhbHVlOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGFzdERlZmF1bHRWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVkFMVUVfUFJPUEVSVFksIG9sZCwgYXN0RGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERlZmF1bHRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RGVmYXVsdFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5kZWZhdWx0VmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIHR5cGUKLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy50eXBlLCB0eXBlKSkgewotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMudHlwZUFkYXB0ZXIuc2V0VmFsdWUodHlwZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1R5cGUoU3RyaW5nIGFzdFR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudHlwZTsKLQkJdGhpcy50eXBlID0gYXN0VHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRZUEVfUFJPUEVSVFksIG9sZCwgYXN0VHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUeXBlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnR5cGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMudHlwZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCS8vICoqKioqIGZ1bGx5LXF1YWxpZmllZCB0eXBlIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkVHlwZU5hbWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNGdWxseVF1YWxpZmllZFR5cGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmZ1bGx5UXVhbGlmaWVkVHlwZU5hbWU7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRUeXBlTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gKHRoaXMudHlwZSA9PSBudWxsKSA/IG51bGwgOiBBU1RUb29scy5yZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKHRoaXMudHlwZUFkYXB0ZXIuZ2V0RXhwcmVzc2lvbihhc3RSb290KSk7Ci0JfQotCi0JCi0JLy8qKioqKioqKioqKiBOZXN0YWJsZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKgotCi0JLyoqCi0JICogY29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kIGZyb20gTmVzdGFibGVBbm5vdGF0aW9uIGludGVyZmFjZQotCSAqIGZvciBzdWJjbGFzc2VzCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4KSB7Ci0JCXRoaXMuZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkubW92ZUFubm90YXRpb24obmV3SW5kZXgpOwotCX0KLQotCXByaXZhdGUgSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIChJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIpIHRoaXMuYW5ub3RhdGlvbkFkYXB0ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxFbGVtZW50RGVjbEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI3NDVjYi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxFbGVtZW50RGVjbEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5BU1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50RGVjbEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50RGVjbAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uCi0JCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHNjb3BlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gc2NvcGVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHNjb3BlOwotCXByaXZhdGUgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWU7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVzcGFjZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2VBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2U7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHN1YnN0aXR1dGlvbkhlYWROYW1lRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gc3Vic3RpdHV0aW9uSGVhZE5hbWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHN1YnN0aXR1dGlvbkhlYWROYW1lOwotCQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkZWZhdWx0VmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkZWZhdWx0VmFsdWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZTsKLQkKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgU291cmNlWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIoYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKSk7Ci0JCXRoaXMuc2NvcGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZFNjb3BlRGVjbGFyYXRpb25BZGFwdGVyKCk7Ci0JCXRoaXMuc2NvcGVBZGFwdGVyID0gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5zY29wZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGROYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5uYW1lc3BhY2VBZGFwdGVyID0gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5uYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZE5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5uYW1lQWRhcHRlciA9IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMuc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlciA9IGJ1aWxkU3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlcigpOwotCQl0aGlzLnN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2VBZGFwdGVyID0gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZURlY2xhcmF0aW9uQWRhcHRlciA9IGJ1aWxkU3Vic3RpdHV0aW9uSGVhZE5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZUFkYXB0ZXIgPSBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLnN1YnN0aXR1dGlvbkhlYWROYW1lRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5kZWZhdWx0VmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZERlZmF1bHRWYWx1ZURlY2xhcmF0aW9uQWRhcHRlcigpOwotCQl0aGlzLmRlZmF1bHRWYWx1ZUFkYXB0ZXIgPSBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLmRlZmF1bHRWYWx1ZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCQotCQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgZGFlYSk7Ci0JfQotCQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFNjb3BlRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKQVhCLlhNTF9FTEVNRU5UX0RFQ0xfX1NDT1BFLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gY29udmVydGVyKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBjb252ZXJ0ZXIpOwotCX0KLQkKLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpBWEIuWE1MX0VMRU1FTlRfREVDTF9fTkFNRVNQQUNFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTmFtZURlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSkFYQi5YTUxfRUxFTUVOVF9ERUNMX19OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkU3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSkFYQi5YTUxfRUxFTUVOVF9ERUNMX19TVUJTVElUVVRJT05fSEVBRF9OQU1FU1BBQ0UpOwotCX0KLQkKLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRTdWJzdGl0dXRpb25IZWFkTmFtZURlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSkFYQi5YTUxfRUxFTUVOVF9ERUNMX19TVUJTVElUVVRJT05fSEVBRF9OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkRGVmYXVsdFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKQVhCLlhNTF9FTEVNRU5UX0RFQ0xfX0RFRkFVTFRfVkFMVUUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVF9ERUNMOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc2NvcGUgPSBidWlsZFNjb3BlKGFzdFJvb3QpOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWUgPSBidWlsZEZ1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWUoYXN0Um9vdCk7Ci0JCXRoaXMubmFtZXNwYWNlID0gYnVpbGROYW1lc3BhY2UoYXN0Um9vdCk7Ci0JCXRoaXMubmFtZSA9IGJ1aWxkTmFtZShhc3RSb290KTsKLQkJdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlID0gYnVpbGRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKGFzdFJvb3QpOwotCQl0aGlzLnN1YnN0aXR1dGlvbkhlYWROYW1lID0gYnVpbGRTdWJzdGl0dXRpb25IZWFkTmFtZShhc3RSb290KTsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBidWlsZERlZmF1bHRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN5bmNTY29wZShidWlsZFNjb3BlKGFzdFJvb3QpKTsKLQkJc3luY0Z1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWUoYnVpbGRGdWxseVF1YWxpZmllZFNjb3BlQ2xhc3NOYW1lKGFzdFJvb3QpKTsKLQkJc3luY05hbWVzcGFjZShidWlsZE5hbWVzcGFjZShhc3RSb290KSk7Ci0JCXN5bmNOYW1lKGJ1aWxkTmFtZShhc3RSb290KSk7Ci0JCXN5bmNTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKGJ1aWxkU3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZShhc3RSb290KSk7Ci0JCXN5bmNTdWJzdGl0dXRpb25IZWFkTmFtZShidWlsZFN1YnN0aXR1dGlvbkhlYWROYW1lKGFzdFJvb3QpKTsKLQkJc3luY0RlZmF1bHRWYWx1ZShidWlsZERlZmF1bHRWYWx1ZShhc3RSb290KSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCQotCQotCS8vICoqKioqIHNjb3BlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRTY29wZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2NvcGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNjb3BlKFN0cmluZyBzY29wZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuc2NvcGUsIHNjb3BlKSkgewotCQkJdGhpcy5zY29wZSA9IHNjb3BlOwotCQkJdGhpcy5zY29wZUFkYXB0ZXIuc2V0VmFsdWUoc2NvcGUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jU2NvcGUoU3RyaW5nIGFzdFNjb3BlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNjb3BlOwotCQl0aGlzLnNjb3BlID0gYXN0U2NvcGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0NPUEVfUFJPUEVSVFksIG9sZCwgYXN0U2NvcGUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZFNjb3BlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnNjb3BlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRTY29wZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnNjb3BlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIHNjb3BlIGNsYXNzIG5hbWUgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jRnVsbHlRdWFsaWZpZWRTY29wZUNsYXNzTmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZFNjb3BlQ2xhc3NOYW1lOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWUgPSBuYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9TQ09QRV9DTEFTU19OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuICh0aGlzLnNjb3BlID09IG51bGwpID8gbnVsbCA6IEFTVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUodGhpcy5zY29wZUFkYXB0ZXIuZ2V0RXhwcmVzc2lvbihhc3RSb290KSk7Ci0JfQotCQotCQotCS8vICoqKioqIG5hbWVzcGFjZSAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lc3BhY2UsIG5hbWVzcGFjZSkpIHsKLQkJCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQkJdGhpcy5uYW1lc3BhY2VBZGFwdGVyLnNldFZhbHVlKG5hbWVzcGFjZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNOYW1lc3BhY2UoU3RyaW5nIGFzdE5hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lc3BhY2U7Ci0JCXRoaXMubmFtZXNwYWNlID0gYXN0TmFtZXNwYWNlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVTUEFDRV9QUk9QRVJUWSwgb2xkLCBhc3ROYW1lc3BhY2UpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWVzcGFjZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2VBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVzcGFjZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG5hbWVzcGFjZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKHRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBuYW1lICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lLCBuYW1lKSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmFtZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNOYW1lKFN0cmluZyBhc3ROYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IGFzdE5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBhc3ROYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZShTdHJpbmcgc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSwgc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSkpIHsKLQkJCXRoaXMuc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSA9IHN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2U7Ci0JCQl0aGlzLnN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2VBZGFwdGVyLnNldFZhbHVlKHN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jU3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZShTdHJpbmcgYXN0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlOwotCQl0aGlzLnN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UgPSBhc3RTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNVQlNUSVRVVElPTl9IRUFEX05BTUVTUEFDRV9QUk9QRVJUWSwgb2xkLCBhc3RTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2VBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2VUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKHRoaXMuc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3Vic3RpdHV0aW9uSGVhZE5hbWUgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFN1YnN0aXR1dGlvbkhlYWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3Vic3RpdHV0aW9uSGVhZE5hbWUoU3RyaW5nIHN1YnN0aXR1dGlvbkhlYWROYW1lKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZSwgc3Vic3RpdHV0aW9uSGVhZE5hbWUpKSB7Ci0JCQl0aGlzLnN1YnN0aXR1dGlvbkhlYWROYW1lID0gc3Vic3RpdHV0aW9uSGVhZE5hbWU7Ci0JCQl0aGlzLnN1YnN0aXR1dGlvbkhlYWROYW1lQWRhcHRlci5zZXRWYWx1ZShzdWJzdGl0dXRpb25IZWFkTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNTdWJzdGl0dXRpb25IZWFkTmFtZShTdHJpbmcgYXN0U3Vic3RpdHV0aW9uSGVhZE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3Vic3RpdHV0aW9uSGVhZE5hbWU7Ci0JCXRoaXMuc3Vic3RpdHV0aW9uSGVhZE5hbWUgPSBhc3RTdWJzdGl0dXRpb25IZWFkTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTVUJTVElUVVRJT05fSEVBRF9OQU1FX1BST1BFUlRZLCBvbGQsIGFzdFN1YnN0aXR1dGlvbkhlYWROYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRTdWJzdGl0dXRpb25IZWFkTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHN1YnN0aXR1dGlvbkhlYWROYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZWxlbWVudFRvdWNoZXModGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogZGVmYXVsdFZhbHVlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmRlZmF1bHRWYWx1ZSwgZGVmYXVsdFZhbHVlKSkgewotCQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JCQl0aGlzLmRlZmF1bHRWYWx1ZUFkYXB0ZXIuc2V0VmFsdWUoZGVmYXVsdFZhbHVlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3luY0RlZmF1bHRWYWx1ZShTdHJpbmcgYXN0RGVmYXVsdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRWYWx1ZTsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBhc3REZWZhdWx0VmFsdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9WQUxVRV9QUk9QRVJUWSwgb2xkLCBhc3REZWZhdWx0VmFsdWUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZERlZmF1bHRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldERlZmF1bHRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmRlZmF1bHRWYWx1ZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sRWxlbWVudFJlZkFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMTA4ZDQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sRWxlbWVudFJlZkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5BU1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50UmVmQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRSZWYKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uCi0JCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQotCQotCXByaXZhdGUgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWU7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lc3BhY2VBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQkKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHJlcXVpcmVkRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHJlcXVpcmVkQWRhcHRlcjsKLQlwcml2YXRlIEJvb2xlYW4gcmVxdWlyZWQ7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHR5cGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB0eXBlQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyB0eXBlOwotCQotCQotCXB1YmxpYyBzdGF0aWMgU291cmNlWG1sRWxlbWVudFJlZkFubm90YXRpb24gYnVpbGRTb3VyY2VYbWxFbGVtZW50UmVmQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCAKLQkJCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQkKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU291cmNlWG1sRWxlbWVudFJlZkFubm90YXRpb24gYnVpbGROZXN0ZWRTb3VyY2VYbWxFbGVtZW50UmVmQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCAKLQkJCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgCi0JCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7Ci0JCQotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgaWRhYSk7Ci0JfQotCQotCQotCXByaXZhdGUgU291cmNlWG1sRWxlbWVudFJlZkFubm90YXRpb24oCi0JCQlKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIAotCQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJCi0JCXRoaXMocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBkYWEsIG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIoYW5ub3RhdGVkRWxlbWVudCwgZGFhKSk7Ci0JfQotCQotCXByaXZhdGUgU291cmNlWG1sRWxlbWVudFJlZkFubm90YXRpb24oCi0JCQlKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIAotCQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSkgewotCQkKLQkJdGhpcyhwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGlkYWEsIG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIGlkYWEpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTb3VyY2VYbWxFbGVtZW50UmVmQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZU5vZGUgcGFyZW50LAotCQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCAKLQkJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLAotCQkJQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJCi0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGROYW1lRGVjbGFyYXRpb25BZGFwdGVyKCk7Ci0JCXRoaXMubmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZE5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlcigpOwotCQl0aGlzLm5hbWVzcGFjZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5yZXF1aXJlZERlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRSZXF1aXJlZEFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5yZXF1aXJlZEFkYXB0ZXIgPSB0aGlzLmJ1aWxkU2hvcnRDaXJjdWl0Qm9vbGVhbkVsZW1lbnRBZGFwdGVyKHRoaXMucmVxdWlyZWREZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLnR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkVHlwZURlY2xhcmF0aW9uQWRhcHRlcigpOwotCQl0aGlzLnR5cGVBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLnR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQkKLQkKLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3ModGhpcy5kYWEsIEpBWEIuWE1MX0VMRU1FTlRfUkVGX19OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3ModGhpcy5kYWEsIEpBWEIuWE1MX0VMRU1FTlRfUkVGX19OQU1FU1BBQ0UpOwotCX0KLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRSZXF1aXJlZEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JCb29sZWFucyhkYWEsIEpBWEIuWE1MX0VMRU1FTlRfUkVGX19SRVFVSVJFRCk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVHlwZURlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMuZGFhLCBKQVhCLlhNTF9FTEVNRU5UX1JFRl9fVFlQRSwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBjb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGNvbnZlcnRlcik7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFNob3J0Q2lyY3VpdEJvb2xlYW5FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIGRhZWEpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9FTEVNRU5UX1JFRjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpOwotCQl0aGlzLm5hbWVzcGFjZSA9IHRoaXMuYnVpbGROYW1lc3BhY2UoYXN0Um9vdCk7Ci0JCXRoaXMucmVxdWlyZWQgPSB0aGlzLmJ1aWxkUmVxdWlyZWQoYXN0Um9vdCk7Ci0JCXRoaXMudHlwZSA9IHRoaXMuYnVpbGRUeXBlKGFzdFJvb3QpOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUgPSB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRUeXBlTmFtZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jTmFtZSh0aGlzLmJ1aWxkTmFtZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY05hbWVzcGFjZSh0aGlzLmJ1aWxkTmFtZXNwYWNlKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jUmVxdWlyZWQodGhpcy5idWlsZFJlcXVpcmVkKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jVHlwZSh0aGlzLmJ1aWxkVHlwZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY0Z1bGx5UXVhbGlmaWVkVHlwZU5hbWUodGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lLCBuYW1lKSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY05hbWUoU3RyaW5nIGFzdE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gYXN0TmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgYXN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBlbGVtZW50VG91Y2hlcyh0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCQotCQotCS8vICoqKioqIG5hbWVzcGFjZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMubmFtZXNwYWNlLCBuYW1lc3BhY2UpKSB7Ci0JCQl0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLQkJCXRoaXMubmFtZXNwYWNlQWRhcHRlci5zZXRWYWx1ZShuYW1lc3BhY2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNOYW1lc3BhY2UoU3RyaW5nIGFzdE5hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lc3BhY2U7Ci0JCXRoaXMubmFtZXNwYWNlID0gYXN0TmFtZXNwYWNlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRVNQQUNFX1BST1BFUlRZLCBvbGQsIGFzdE5hbWVzcGFjZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lc3BhY2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVzcGFjZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZXNwYWNlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZWxlbWVudFRvdWNoZXModGhpcy5uYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCQotCi0JLy8gKioqKiogcmVxdWlyZWQKLQlwdWJsaWMgQm9vbGVhbiBnZXRSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMucmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoQm9vbGVhbiByZXF1aXJlZCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5yZXF1aXJlZCwgcmVxdWlyZWQpKSB7Ci0JCQl0aGlzLnJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0JCQl0aGlzLnJlcXVpcmVkQWRhcHRlci5zZXRWYWx1ZShyZXF1aXJlZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1JlcXVpcmVkKEJvb2xlYW4gYXN0UmVxdWlyZWQpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnJlcXVpcmVkOwotCQl0aGlzLnJlcXVpcmVkID0gYXN0UmVxdWlyZWQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRVFVSVJFRF9QUk9QRVJUWSwgb2xkLCBhc3RSZXF1aXJlZCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkUmVxdWlyZWQoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucmVxdWlyZWRBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlcXVpcmVkVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5yZXF1aXJlZERlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKiogdHlwZQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnR5cGUsIHR5cGUpKSB7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQkJdGhpcy50eXBlQWRhcHRlci5zZXRWYWx1ZSh0eXBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVHlwZShTdHJpbmcgYXN0VHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy50eXBlOwotCQl0aGlzLnR5cGUgPSBhc3RUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9QUk9QRVJUWSwgb2xkLCBhc3RUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFR5cGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudHlwZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy50eXBlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIHR5cGUgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRUeXBlTmFtZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0Z1bGx5UXVhbGlmaWVkVHlwZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZnVsbHlRdWFsaWZpZWRUeXBlTmFtZTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZFR5cGVOYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZFR5cGVOYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiAodGhpcy50eXBlID09IG51bGwpID8gbnVsbCA6IEFTVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUodGhpcy50eXBlQWRhcHRlci5nZXRFeHByZXNzaW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQkKLQkvLyoqKioqKioqKioqIE5lc3RhYmxlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCi0KLQkvKioKLQkgKiBjb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZnJvbSBOZXN0YWJsZUFubm90YXRpb24gaW50ZXJmYWNlCi0JICogZm9yIHN1YmNsYXNzZXMKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgpIHsKLQkJdGhpcy5nZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKS5tb3ZlQW5ub3RhdGlvbihuZXdJbmRleCk7Ci0JfQotCi0JcHJpdmF0ZSBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gKEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcikgdGhpcy5hbm5vdGF0aW9uQWRhcHRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxFbGVtZW50UmVmc0Fubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTdiNTdmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50UmVmQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudFJlZnMKLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbgotCQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQkJaW1wbGVtZW50cyBYbWxFbGVtZW50UmVmc0Fubm90YXRpb24gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgCi0JCQk9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpBWEIuWE1MX0VMRU1FTlRfUkVGUyk7Ci0JCi0JCi0JcHJpdmF0ZSBmaW5hbCBYbWxFbGVtZW50UmVmc0Fubm90YXRpb25Db250YWluZXIgeG1sRWxlbWVudFJlZnNDb250YWluZXIgCi0JCQk9IG5ldyBYbWxFbGVtZW50UmVmc0Fubm90YXRpb25Db250YWluZXIoKTsKLQkKLQkKLQlwdWJsaWMgU291cmNlWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJdGhpcyhwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyBTb3VyY2VYbWxFbGVtZW50UmVmc0Fubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJc3VwZXIocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBkYWEpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVF9SRUZTOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMueG1sRWxlbWVudFJlZnNDb250YWluZXIuaW5pdGlhbGl6ZUZyb21Db250YWluZXJBbm5vdGF0aW9uKHRoaXMuZ2V0QXN0QW5ub3RhdGlvbihhc3RSb290KSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnhtbEVsZW1lbnRSZWZzQ29udGFpbmVyLnN5bmNocm9uaXplKHRoaXMuZ2V0QXN0QW5ub3RhdGlvbihhc3RSb290KSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogeG1sIGVsZW1lbnQgcmVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmFibGU8WG1sRWxlbWVudFJlZkFubm90YXRpb24+IGdldFhtbEVsZW1lbnRSZWZzKCkgewotCQlyZXR1cm4gdGhpcy54bWxFbGVtZW50UmVmc0NvbnRhaW5lci5nZXROZXN0ZWRBbm5vdGF0aW9ucygpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMueG1sRWxlbWVudFJlZnNDb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbnNTaXplKCk7Ci0JfQotCQotCXB1YmxpYyBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnhtbEVsZW1lbnRSZWZzQ29udGFpbmVyLmdldE5lc3RlZEFubm90YXRpb24oaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgWG1sRWxlbWVudFJlZkFubm90YXRpb24gYWRkWG1sRWxlbWVudFJlZihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMueG1sRWxlbWVudFJlZnNDb250YWluZXIuYWRkTmVzdGVkQW5ub3RhdGlvbihpbmRleCk7Ci0JfQotCQotCXByaXZhdGUgWG1sRWxlbWVudFJlZkFubm90YXRpb24gYnVpbGRYbWxFbGVtZW50UmVmKGludCBpbmRleCkgewotCQlyZXR1cm4gU291cmNlWG1sRWxlbWVudFJlZkFubm90YXRpb24uYnVpbGROZXN0ZWRTb3VyY2VYbWxFbGVtZW50UmVmQW5ub3RhdGlvbigKLQkJCQl0aGlzLCB0aGlzLmFubm90YXRlZEVsZW1lbnQsIGJ1aWxkWG1sRWxlbWVudFJlZkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4KSk7Ci0JfQotCQotCXByaXZhdGUgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRYbWxFbGVtZW50UmVmSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJdGhpcy5kYWEsIEpBWEIuWE1MX0VMRU1FTlRfUkVGU19fVkFMVUUsIGluZGV4LCBKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVYbWxFbGVtZW50UmVmKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMueG1sRWxlbWVudFJlZnNDb250YWluZXIubW92ZU5lc3RlZEFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sRWxlbWVudFJlZihpbnQgaW5kZXgpIHsKLQkJdGhpcy54bWxFbGVtZW50UmVmc0NvbnRhaW5lci5yZW1vdmVOZXN0ZWRBbm5vdGF0aW9uKGluZGV4KTsKLQl9Ci0JCi0JCi0JY2xhc3MgWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uQ29udGFpbmVyIAotCQkJZXh0ZW5kcyBBbm5vdGF0aW9uQ29udGFpbmVyPFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uPiB7Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXROZXN0ZWRBbm5vdGF0aW9uc0xpc3ROYW1lKCkgewotCQkJcmV0dXJuIFhNTF9FTEVNRU5UX1JFRlNfTElTVDsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVF9SRUZTX19WQUxVRTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmVzdGVkQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVF9SRUY7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudFJlZkFubm90YXRpb24gYnVpbGROZXN0ZWRBbm5vdGF0aW9uKGludCBpbmRleCkgewotCQkJcmV0dXJuIFNvdXJjZVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi50aGlzLmJ1aWxkWG1sRWxlbWVudFJlZihpbmRleCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjAyMTc4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudFdyYXBwZXIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0KLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZXNwYWNlQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBuYW1lc3BhY2U7Ci0KLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IG5pbGxhYmxlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IG5pbGxhYmxlQWRhcHRlcjsKLQlwcml2YXRlIEJvb2xlYW4gbmlsbGFibGU7Ci0KLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHJlcXVpcmVkRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHJlcXVpcmVkQWRhcHRlcjsKLQlwcml2YXRlIEJvb2xlYW4gcmVxdWlyZWQ7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgU291cmNlWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJdGhpcyhwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcihhbm5vdGF0ZWRFbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpKTsKLQl9Ci0KLQlwdWJsaWMgU291cmNlWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZUFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5uYW1lQWRhcHRlciA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5uYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZXNwYWNlQWRhcHRlcihkYWEpOwotCQl0aGlzLm5hbWVzcGFjZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5uaWxsYWJsZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGROaWxsYWJsZUFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5uaWxsYWJsZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkU2hvcnRDaXJjdWl0Qm9vbGVhbkVsZW1lbnRBZGFwdGVyKHRoaXMubmlsbGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLnJlcXVpcmVkRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZFJlcXVpcmVkQWRhcHRlcihkYWEpOwotCQl0aGlzLnJlcXVpcmVkQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRCb29sZWFuRWxlbWVudEFkYXB0ZXIodGhpcy5yZXF1aXJlZERlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTmFtZUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSX19OQU1FKTsKLQl9Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lc3BhY2VBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsIEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUl9fTkFNRVNQQUNFKTsKLQl9Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkTmlsbGFibGVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yQm9vbGVhbnMoZGFhLCBKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVJfX05JTExBQkxFKTsKLQl9Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkUmVxdWlyZWRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yQm9vbGVhbnMoZGFhLCBKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVJfX1JFUVVJUkVEKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSkgewotCQlyZXR1cm4gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIGRhZWEpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkU2hvcnRDaXJjdWl0Qm9vbGVhbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgZGFlYSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpOwotCQl0aGlzLm5hbWVzcGFjZSA9IHRoaXMuYnVpbGROYW1lc3BhY2UoYXN0Um9vdCk7Ci0JCXRoaXMubmlsbGFibGUgPSB0aGlzLmJ1aWxkTmlsbGFibGUoYXN0Um9vdCk7Ci0JCXRoaXMucmVxdWlyZWQgPSB0aGlzLmJ1aWxkUmVxdWlyZWQoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY05hbWUodGhpcy5idWlsZE5hbWUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNOYW1lc3BhY2UodGhpcy5idWlsZE5hbWVzcGFjZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY05pbGxhYmxlKHRoaXMuYnVpbGROaWxsYWJsZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY1JlcXVpcmVkKHRoaXMuYnVpbGRSZXF1aXJlZChhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lLCBuYW1lKSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY05hbWUoU3RyaW5nIGFzdE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gYXN0TmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgYXN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBlbGVtZW50VG91Y2hlcyh0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCQotCQotCS8vICoqKioqIG5hbWVzcGFjZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMubmFtZXNwYWNlLCBuYW1lc3BhY2UpKSB7Ci0JCQl0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLQkJCXRoaXMubmFtZXNwYWNlQWRhcHRlci5zZXRWYWx1ZShuYW1lc3BhY2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNOYW1lc3BhY2UoU3RyaW5nIGFzdE5hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lc3BhY2U7Ci0JCXRoaXMubmFtZXNwYWNlID0gYXN0TmFtZXNwYWNlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRVNQQUNFX1BST1BFUlRZLCBvbGQsIGFzdE5hbWVzcGFjZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lc3BhY2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVzcGFjZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZXNwYWNlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZWxlbWVudFRvdWNoZXModGhpcy5uYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCQotCQotCS8vICoqKioqIG5pbGxhYmxlCi0JcHVibGljIEJvb2xlYW4gZ2V0TmlsbGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm5pbGxhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5pbGxhYmxlKEJvb2xlYW4gbmlsbGFibGUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMubmlsbGFibGUsIG5pbGxhYmxlKSkgewotCQkJdGhpcy5uaWxsYWJsZSA9IG5pbGxhYmxlOwotCQkJdGhpcy5uaWxsYWJsZUFkYXB0ZXIuc2V0VmFsdWUobmlsbGFibGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNOaWxsYWJsZShCb29sZWFuIGFzdE5pbGxhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5uaWxsYWJsZTsKLQkJdGhpcy5uaWxsYWJsZSA9IGFzdE5pbGxhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTklMTEFCTEVfUFJPUEVSVFksIG9sZCwgYXN0TmlsbGFibGUpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZE5pbGxhYmxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5pbGxhYmxlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5pbGxhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5uaWxsYWJsZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKiogcmVxdWlyZWQKLQlwdWJsaWMgQm9vbGVhbiBnZXRSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMucmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoQm9vbGVhbiByZXF1aXJlZCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5yZXF1aXJlZCwgcmVxdWlyZWQpKSB7Ci0JCQl0aGlzLnJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0JCQl0aGlzLnJlcXVpcmVkQWRhcHRlci5zZXRWYWx1ZShyZXF1aXJlZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1JlcXVpcmVkKEJvb2xlYW4gYXN0UmVxdWlyZWQpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnJlcXVpcmVkOwotCQl0aGlzLnJlcXVpcmVkID0gYXN0UmVxdWlyZWQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRVFVSVJFRF9QUk9QRVJUWSwgb2xkLCBhc3RSZXF1aXJlZCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkUmVxdWlyZWQoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucmVxdWlyZWRBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVxdWlyZWRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnJlcXVpcmVkRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxFbGVtZW50c0Fubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEVsZW1lbnRzQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTIwNTkyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEVsZW1lbnRzQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudHNBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZVhtbEVsZW1lbnRzQW5ub3RhdGlvbgotCQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQkJaW1wbGVtZW50cyBYbWxFbGVtZW50c0Fubm90YXRpb24gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgCi0JPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKQVhCLlhNTF9FTEVNRU5UUyk7Ci0KLQkKLQlwcml2YXRlIGZpbmFsIFhtbEVsZW1lbnRzQW5ub3RhdGlvbkNvbnRhaW5lciB4bWxFbGVtZW50c0NvbnRhaW5lciA9IG5ldyBYbWxFbGVtZW50c0Fubm90YXRpb25Db250YWluZXIoKTsKLQkKLQlwdWJsaWMgU291cmNlWG1sRWxlbWVudHNBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJdGhpcyhwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyBTb3VyY2VYbWxFbGVtZW50c0Fubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJc3VwZXIocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBkYWEpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVFM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy54bWxFbGVtZW50c0NvbnRhaW5lci5pbml0aWFsaXplRnJvbUNvbnRhaW5lckFubm90YXRpb24odGhpcy5nZXRBc3RBbm5vdGF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMueG1sRWxlbWVudHNDb250YWluZXIuc3luY2hyb25pemUodGhpcy5nZXRBc3RBbm5vdGF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB4bWxucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIExpc3RJdGVyYWJsZTxYbWxFbGVtZW50QW5ub3RhdGlvbj4gZ2V0WG1sRWxlbWVudHMoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEVsZW1lbnRzQ29udGFpbmVyLmdldE5lc3RlZEFubm90YXRpb25zKCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0WG1sRWxlbWVudHNTaXplKCkgewotCQlyZXR1cm4gdGhpcy54bWxFbGVtZW50c0NvbnRhaW5lci5nZXROZXN0ZWRBbm5vdGF0aW9uc1NpemUoKTsKLQl9Ci0JCi0JcHVibGljIFhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMueG1sRWxlbWVudHNDb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbihpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBYbWxFbGVtZW50QW5ub3RhdGlvbiBhZGRYbWxFbGVtZW50KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy54bWxFbGVtZW50c0NvbnRhaW5lci5hZGROZXN0ZWRBbm5vdGF0aW9uKGluZGV4KTsKLQl9Ci0JCi0JcHJpdmF0ZSBYbWxFbGVtZW50QW5ub3RhdGlvbiBidWlsZFhtbEVsZW1lbnQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBTb3VyY2VYbWxFbGVtZW50QW5ub3RhdGlvbi5idWlsZE5lc3RlZFNvdXJjZVhtbEVsZW1lbnRBbm5vdGF0aW9uKHRoaXMsIHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgYnVpbGRYbWxFbGVtZW50SW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW5kZXgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZFhtbEVsZW1lbnRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCXRoaXMuZGFhLCBKQVhCLlhNTF9FTEVNRU5UU19fVkFMVUUsIGluZGV4LCBKQVhCLlhNTF9FTEVNRU5UKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZVhtbEVsZW1lbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy54bWxFbGVtZW50c0NvbnRhaW5lci5tb3ZlTmVzdGVkQW5ub3RhdGlvbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxFbGVtZW50KGludCBpbmRleCkgewotCQl0aGlzLnhtbEVsZW1lbnRzQ29udGFpbmVyLnJlbW92ZU5lc3RlZEFubm90YXRpb24oaW5kZXgpOwotCX0KLQkKLQkvKioKLQkqIGFkYXB0IHRoZSBBbm5vdGF0aW9uQ29udGFpbmVyIGludGVyZmFjZSB0byB0aGUgeG1sIHNjaGVtYSdzIHhtbG5zCi0JKi8KLQljbGFzcyBYbWxFbGVtZW50c0Fubm90YXRpb25Db250YWluZXIgCi0JCWV4dGVuZHMgQW5ub3RhdGlvbkNvbnRhaW5lcjxYbWxFbGVtZW50QW5ub3RhdGlvbj4KLQkJewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXROZXN0ZWRBbm5vdGF0aW9uc0xpc3ROYW1lKCkgewotCQkJcmV0dXJuIFhNTF9FTEVNRU5UU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQkJcmV0dXJuIEpBWEIuWE1MX0VMRU1FTlRTX19WQUxVRTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXROZXN0ZWRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBKQVhCLlhNTF9FTEVNRU5UOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudEFubm90YXRpb24gYnVpbGROZXN0ZWRBbm5vdGF0aW9uKGludCBpbmRleCkgewotCQkJcmV0dXJuIFNvdXJjZVhtbEVsZW1lbnRzQW5ub3RhdGlvbi50aGlzLmJ1aWxkWG1sRWxlbWVudChpbmRleCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxFbnVtQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sRW51bUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJkY2JhZi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxFbnVtQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbnVtQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVudW0KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVhtbEVudW1Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxFbnVtQW5ub3RhdGlvbgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKQVhCLlhNTF9FTlVNKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWRWYWx1ZUNsYXNzTmFtZTsKLQotCXB1YmxpYyBTb3VyY2VYbWxFbnVtQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKFZBTFVFX0FEQVBURVIpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRU5VTTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRWYWx1ZUNsYXNzTmFtZSA9IHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNGdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lKHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogWG1sRW51bUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZShTdHJpbmcgYXN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIHZhbHVlIGNsYXNzIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVmFsdWVDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkVmFsdWVDbGFzc05hbWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNGdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmZ1bGx5UXVhbGlmaWVkVmFsdWVDbGFzc05hbWU7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRWYWx1ZUNsYXNzTmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfVkFMVUVfQ0xBU1NfTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkVmFsdWVDbGFzc05hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IG51bGwpID8gbnVsbCA6IEFTVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUodGhpcy52YWx1ZUFkYXB0ZXIuZ2V0RXhwcmVzc2lvbihhc3RSb290KSk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRWYWx1ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpBWEIuWE1MX0VOVU1fX1ZBTFVFLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBjb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGNvbnZlcnRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sRW51bVZhbHVlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sRW51bVZhbHVlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2I0NDIxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEVudW1WYWx1ZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVudW1WYWx1ZUFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbnVtVmFsdWUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVhtbEVudW1WYWx1ZUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEVudW1WYWx1ZUFubm90YXRpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfRU5VTV9WQUxVRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFZBTFVFX0FEQVBURVIgPSBidWlsZFZhbHVlQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0JcHVibGljIFNvdXJjZVhtbEVudW1WYWx1ZUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihWQUxVRV9BREFQVEVSKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgZGFlYSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0VOVU1fVkFMVUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYbWxFbnVtVmFsdWVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy52YWx1ZSwgdmFsdWUpKSB7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCQl0aGlzLnZhbHVlQWRhcHRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1ZhbHVlKFN0cmluZyBhc3RWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IGFzdFZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgYXN0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShWQUxVRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdmFsdWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBlbGVtZW50VG91Y2hlcyhWQUxVRV9BREFQVEVSLCBwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQkKLQkvLyoqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRWYWx1ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpBWEIuWE1MX0VOVU1fVkFMVUVfX1ZBTFVFKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbElEQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sSURBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNTRiN2QuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sSURBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbElEQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElECi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VYbWxJREFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbElEQW5ub3RhdGlvbgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKQVhCLlhNTF9JRCk7Ci0KLQlwdWJsaWMgU291cmNlWG1sSURBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9JRDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm8tb3AKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9uby1vcAotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbElEUkVGQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sSURSRUZBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNjMyYWEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sSURSRUZBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbElEUkVGQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEUkVGCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VYbWxJRFJFRkFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbElEUkVGQW5ub3RhdGlvbgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKQVhCLlhNTF9JRFJFRik7Ci0KLQlwdWJsaWMgU291cmNlWG1sSURSRUZBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9JRFJFRjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm8tb3AKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9uby1vcAotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzlmNmI5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb24KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uCi0JCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfSU5MSU5FX0JJTkFSWV9EQVRBKTsKLQkKLQkKLQlwdWJsaWMgU291cmNlWG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9JTkxJTkVfQklOQVJZX0RBVEE7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9uby1vcAotCX0KLQkKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9uby1vcAotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE3MjNjNi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgQ09OVEFJTkVSX0RFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSUyk7Ci0KLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWRWYWx1ZTsKLQkKLQkvKgotCSAqIFdlIHdhbnQgdGhpcyBldmVudCBmaXJlZCB3aGVuIHRoZSBmcSBjbGFzcyBjaGFuZ2VzIGJ5IGl0c2VsZiwgbm90IGFzIGEgcmVzdWx0Ci0JICogb2YgdGhlIG5vbi1mcSBjbGFzcyBjaGFuZ2luZy4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc3VwcHJlc3NGUVZhbHVlRXZlbnROb3RpZmljYXRpb24gPSBmYWxzZTsKLQkKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdHlwZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHR5cGVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHR5cGU7Ci0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlOwotCQotCS8qCi0JICogV2Ugd2FudCB0aGlzIGV2ZW50IGZpcmVkIHdoZW4gdGhlIGZxIGNsYXNzIGNoYW5nZXMgYnkgaXRzZWxmLCBub3QgYXMgYSByZXN1bHQKLQkgKiBvZiB0aGUgbm9uLWZxIGNsYXNzIGNoYW5naW5nLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzdXBwcmVzc0ZRVHlwZUV2ZW50Tm90aWZpY2F0aW9uID0gZmFsc2U7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBzdGF0aWMgU291cmNlWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiBidWlsZFNvdXJjZVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBidWlsZFhtbEphdmFUeXBlQWRhcHRlckRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW5kZXgpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gYnVpbGRYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uQWRhcHRlcihhbm5vdGF0ZWRFbGVtZW50LCBpZGFhKTsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKAotCQkJcGFyZW50LAotCQkJYW5ub3RhdGVkRWxlbWVudCwKLQkJCWlkYWEsCi0JCQlpYWEpOwotCX0KLQotCXByaXZhdGUgU291cmNlWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LAotCQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LAotCQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLAotCQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMudmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZFZhbHVlQWRhcHRlcihkYWEpOwotCQl0aGlzLnZhbHVlQWRhcHRlciA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy52YWx1ZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMudHlwZURlY2xhcmF0aW9uQWRhcHRlciA9IGJ1aWxkVHlwZUFkYXB0ZXIoZGFhKTsKLQkJdGhpcy50eXBlQWRhcHRlciA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy50eXBlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSX19WQUxVRSwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFR5cGVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSX19UWVBFLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0Jc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gY29udmVydGVyKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBjb252ZXJ0ZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgZGFlYSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbHVlID0gYnVpbGRWYWx1ZShhc3RSb290KTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZFZhbHVlID0gYnVpbGRGdWxseVF1YWxpZmllZFZhbHVlKGFzdFJvb3QpOwotCQl0aGlzLnR5cGUgPSBidWlsZFR5cGUoYXN0Um9vdCk7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRUeXBlID0gYnVpbGRGdWxseVF1YWxpZmllZFR5cGUoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzeW5jVmFsdWUoYnVpbGRWYWx1ZShhc3RSb290KSk7Ci0JCXN5bmNUeXBlKGJ1aWxkVHlwZShhc3RSb290KSk7Ci0JCXN5bmNGdWxseVF1YWxpZmllZFZhbHVlKGJ1aWxkRnVsbHlRdWFsaWZpZWRWYWx1ZShhc3RSb290KSk7Ci0JCXN5bmNGdWxseVF1YWxpZmllZFR5cGUoYnVpbGRGdWxseVF1YWxpZmllZFR5cGUoYXN0Um9vdCkpOwotCQkKLQkJdGhpcy5zdXBwcmVzc0ZRVmFsdWVFdmVudE5vdGlmaWNhdGlvbiA9IGZhbHNlOwotCQl0aGlzLnN1cHByZXNzRlFUeXBlRXZlbnROb3RpZmljYXRpb24gPSBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMuc3VwcHJlc3NGUVZhbHVlRXZlbnROb3RpZmljYXRpb24gPSB0cnVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jVmFsdWUoU3RyaW5nIGFzdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gYXN0VmFsdWU7Ci0JCXRoaXMuc3VwcHJlc3NGUVZhbHVlRXZlbnROb3RpZmljYXRpb24gfD0gU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKG9sZCwgYXN0VmFsdWUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgYXN0VmFsdWUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMudmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkVmFsdWU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jRnVsbHlRdWFsaWZpZWRWYWx1ZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZFZhbHVlOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkVmFsdWUgPSBuYW1lOwotCQlpZiAoISB0aGlzLnN1cHByZXNzRlFWYWx1ZUV2ZW50Tm90aWZpY2F0aW9uKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRlVMTFlfUVVBTElGSUVEX1ZBTFVFX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gbnVsbCkgPyBudWxsIDogQVNUVG9vbHMucmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZSh0aGlzLnZhbHVlQWRhcHRlci5nZXRFeHByZXNzaW9uKGFzdFJvb3QpKTsKLQl9Ci0JCi0JLy8gKioqKiogdHlwZQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy50eXBlLCB0eXBlKSkgewotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMuc3VwcHJlc3NGUVR5cGVFdmVudE5vdGlmaWNhdGlvbiA9IHRydWU7Ci0JCQl0aGlzLnR5cGVBZGFwdGVyLnNldFZhbHVlKHR5cGUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jVHlwZShTdHJpbmcgYXN0VHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy50eXBlOwotCQl0aGlzLnR5cGUgPSBhc3RUeXBlOwotCQl0aGlzLnN1cHByZXNzRlFUeXBlRXZlbnROb3RpZmljYXRpb24gfD0gU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKG9sZCwgYXN0VHlwZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX1BST1BFUlRZLCBvbGQsIGFzdFR5cGUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZFR5cGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudHlwZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMudHlwZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5mdWxseVF1YWxpZmllZFR5cGU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jRnVsbHlRdWFsaWZpZWRUeXBlKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmZ1bGx5UXVhbGlmaWVkVHlwZTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZFR5cGUgPSBuYW1lOwotCQlpZiAoISB0aGlzLnN1cHByZXNzRlFUeXBlRXZlbnROb3RpZmljYXRpb24pIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfVFlQRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkVHlwZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gKHRoaXMudHlwZSA9PSBudWxsKSA/IG51bGwgOiBBU1RUb29scy5yZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKHRoaXMudHlwZUFkYXB0ZXIuZ2V0RXhwcmVzc2lvbihhc3RSb290KSk7Ci0JfQotCQotCQotCS8vKioqKioqKioqKiogTmVzdGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBjb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZnJvbSBOZXN0YWJsZUFubm90YXRpb24gaW50ZXJmYWNlCi0JICogZm9yIHN1YmNsYXNzZXMKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgpIHsKLQkJdGhpcy5nZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKS5tb3ZlQW5ub3RhdGlvbihuZXdJbmRleCk7Ci0JfQotCQotCXByaXZhdGUgSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIChJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIpIHRoaXMuYW5ub3RhdGlvbkFkYXB0ZXI7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGJ1aWxkWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbkFkYXB0ZXIoQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7Ci0JCXJldHVybiBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihhbm5vdGF0ZWRFbGVtZW50LCBpZGFhKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZFhtbEphdmFUeXBlQWRhcHRlckRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4KSB7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSAKLQkJCW5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCURFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwKLQkJCQlDT05UQUlORVJfREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLAotCQkJCWluZGV4LAotCQkJCUpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJcmV0dXJuIGlkYWE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sTGlzdEFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbExpc3RBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNDQ3MzMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sTGlzdEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTGlzdEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxMaXN0Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VYbWxMaXN0QW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sTGlzdEFubm90YXRpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfTElTVCk7Ci0KLQlwdWJsaWMgU291cmNlWG1sTGlzdEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0xJU1Q7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vLW9wCi0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm8tb3AKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxNaW1lVHlwZUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbE1pbWVUeXBlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmNkYmE3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbE1pbWVUeXBlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxNaW1lVHlwZUFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxNaW1lVHlwZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlWG1sTWltZVR5cGVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxNaW1lVHlwZUFubm90YXRpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfTUlNRV9UWVBFKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQlwdWJsaWMgU291cmNlWG1sTWltZVR5cGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnZhbHVlQWRhcHRlciA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoVkFMVUVfQURBUFRFUik7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSkgewotCQlyZXR1cm4gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIGRhZWEpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9NSU1FX1RZUEU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYbWxNaW1lVHlwZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVmFsdWUoU3RyaW5nIGFzdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gYXN0VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCBhc3RWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCi0JLy8qKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKQVhCLlhNTF9NSU1FX1RZUEVfX1ZBTFVFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxNaXhlZEFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbE1peGVkQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDQ2OWIyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbE1peGVkQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxNaXhlZEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxNaXhlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlWG1sTWl4ZWRBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxNaXhlZEFubm90YXRpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfTUlYRUQpOwotCi0JcHVibGljIFNvdXJjZVhtbE1peGVkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfTUlYRUQ7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vLW9wCi0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm8tb3AKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxOc0Fubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbE5zQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTBmMmZiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbE5zQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTnNBbm5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBTb3VyY2VYbWxOc0Fubm90YXRpb24KLQkJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JCWltcGxlbWVudHMgWG1sTnNBbm5vdGF0aW9uIHsKLQkKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZXNwYWNlVVJJRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZXNwYWNlVVJJQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VVUkk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHByZWZpeERlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHByZWZpeEFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJlZml4OwotCQotCQotCXB1YmxpYyBTb3VyY2VYbWxOc0Fubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSkgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGlkYWEsIG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIGlkYWEpKTsKLQkJdGhpcy5uYW1lc3BhY2VVUklEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZXNwYWNlVVJJRGVjbGFyYXRpb25BZGFwdGVyKGlkYWEpOwotCQl0aGlzLm5hbWVzcGFjZVVSSUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQWRhcHRlcih0aGlzLm5hbWVzcGFjZVVSSURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMucHJlZml4RGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZFByZWZpeERlY2xhcmF0aW9uQWRhcHRlcihpZGFhKTsKLQkJdGhpcy5wcmVmaXhBZGFwdGVyID0gYnVpbGRBZGFwdGVyKHRoaXMucHJlZml4RGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lc3BhY2VVUklEZWNsYXJhdGlvbkFkYXB0ZXIoCi0JCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQkKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgSkFYQi5YTUxfTlNfX05BTUVTUEFDRV9VUkkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFByZWZpeERlY2xhcmF0aW9uQWRhcHRlcigKLQkJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCQotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCBKQVhCLlhNTF9OU19fUFJFRklYKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgZGFlYSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9OUzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLm5hbWVzcGFjZVVSSSA9IGJ1aWxkTmFtZXNwYWNlVVJJKGFzdFJvb3QpOwotCQl0aGlzLnByZWZpeCA9IGJ1aWxkUHJlZml4KGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzeW5jTmFtZXNwYWNlVVJJKGJ1aWxkTmFtZXNwYWNlVVJJKGFzdFJvb3QpKTsKLQkJc3luY1ByZWZpeChidWlsZFByZWZpeChhc3RSb290KSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZXNwYWNlVVJJKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbmFtZXNwYWNlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzcGFjZVVSSTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLm5hbWVzcGFjZVVSSSwgbmFtZXNwYWNlVVJJKSkgewotCQkJdGhpcy5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0JCQl0aGlzLm5hbWVzcGFjZVVSSUFkYXB0ZXIuc2V0VmFsdWUobmFtZXNwYWNlVVJJKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWVzcGFjZVVSSShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2VVUklBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3luY05hbWVzcGFjZVVSSShTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWVzcGFjZVVSSTsKLQkJdGhpcy5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRVNQQUNFX1VSSV9QUk9QRVJUWSwgb2xkLCBuYW1lc3BhY2VVUkkpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVzcGFjZVVSSVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm5hbWVzcGFjZVVSSURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG5hbWVzcGFjZVVSSVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKHRoaXMubmFtZXNwYWNlVVJJRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBwcmVmaXggKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIHRoaXMucHJlZml4OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMucHJlZml4LCBwcmVmaXgpKSB7Ci0JCQl0aGlzLnByZWZpeCA9IHByZWZpeDsKLQkJCXRoaXMucHJlZml4QWRhcHRlci5zZXRWYWx1ZShwcmVmaXgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkUHJlZml4KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnByZWZpeEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jUHJlZml4KFN0cmluZyBwcmVmaXgpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucHJlZml4OwotCQl0aGlzLnByZWZpeCA9IHByZWZpeDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQUkVGSVhfUFJPUEVSVFksIG9sZCwgcHJlZml4KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRQcmVmaXhUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5wcmVmaXhEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwcmVmaXhUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBlbGVtZW50VG91Y2hlcyh0aGlzLnByZWZpeERlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogTmVzdGFibGVBbm5vdGF0aW9uIGltcGwgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgpIHsKLQkJdGhpcy5nZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKS5tb3ZlQW5ub3RhdGlvbihuZXdJbmRleCk7Ci0JfQotCQotCXByaXZhdGUgSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIChJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIpIHRoaXMuYW5ub3RhdGlvbkFkYXB0ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sUmVnaXN0cnlBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxSZWdpc3RyeUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ1MGJiYS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxSZWdpc3RyeUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sUmVnaXN0cnlBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUmVnaXN0cnkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVhtbFJlZ2lzdHJ5QW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sUmVnaXN0cnlBbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpBWEIuWE1MX1JFR0lTVFJZKTsKLQotCXB1YmxpYyBTb3VyY2VYbWxSZWdpc3RyeUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX1JFR0lTVFJZOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9uby1vcAotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vLW9wCi0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxSb290RWxlbWVudEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkZDY5Ny4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxSb290RWxlbWVudEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VYbWxSb290RWxlbWVudEFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBOQU1FX0FEQVBURVIgPSBidWlsZE5hbWVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBOQU1FU1BBQ0VfQURBUFRFUiA9IGJ1aWxkTmFtZXNwYWNlQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZXNwYWNlQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBuYW1lc3BhY2U7Ci0KLQlwdWJsaWMgU291cmNlWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLm5hbWVBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihOQU1FX0FEQVBURVIpOwotCQl0aGlzLm5hbWVzcGFjZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKE5BTUVTUEFDRV9BREFQVEVSKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgZGFlYSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX1JPT1RfRUxFTUVOVDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpOwotCQl0aGlzLm5hbWVzcGFjZSA9IHRoaXMuYnVpbGROYW1lc3BhY2UoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY05hbWUodGhpcy5idWlsZE5hbWUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNOYW1lc3BhY2UodGhpcy5idWlsZE5hbWVzcGFjZShhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lLCBuYW1lKSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY05hbWUoU3RyaW5nIGFzdE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gYXN0TmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgYXN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKE5BTUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBlbGVtZW50VG91Y2hlcyhOQU1FX0FEQVBURVIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCQotCQotCS8vICoqKioqIG5hbWVzcGFjZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMubmFtZXNwYWNlLCBuYW1lc3BhY2UpKSB7Ci0JCQl0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLQkJCXRoaXMubmFtZXNwYWNlQWRhcHRlci5zZXRWYWx1ZShuYW1lc3BhY2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNOYW1lc3BhY2UoU3RyaW5nIGFzdE5hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lc3BhY2U7Ci0JCXRoaXMubmFtZXNwYWNlID0gYXN0TmFtZXNwYWNlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRVNQQUNFX1BST1BFUlRZLCBvbGQsIGFzdE5hbWVzcGFjZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lc3BhY2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVzcGFjZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKE5BTUVTUEFDRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZXNwYWNlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZWxlbWVudFRvdWNoZXMoTkFNRVNQQUNFX0FEQVBURVIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCQotCQotCS8vKioqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKQVhCLlhNTF9ST09UX0VMRU1FTlRfX05BTUUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lc3BhY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKQVhCLlhNTF9ST09UX0VMRU1FTlRfX05BTUVTUEFDRSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxTY2hlbWFBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxTY2hlbWFBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MmJkOWMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sU2NoZW1hQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE5zQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTnNGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxTY2hlbWFBbm5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBTb3VyY2VYbWxTY2hlbWFBbm5vdGF0aW9uCi0JCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbFNjaGVtYUFubm90YXRpb24gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgCi0JCQk9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpBWEIuWE1MX1NDSEVNQSk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBBVFRSSUJVVEVfRk9STV9ERUZBVUxUX0FEQVBURVIgPSAKLQkJCWJ1aWxkQXR0cmlidXRlRm9ybURlZmF1bHRBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhdHRyaWJ1dGVGb3JtRGVmYXVsdEFkYXB0ZXI7Ci0JcHJpdmF0ZSBYbWxOc0Zvcm0gYXR0cmlidXRlRm9ybURlZmF1bHQ7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBFTEVNRU5UX0ZPUk1fREVGQVVMVF9BREFQVEVSID0gCi0JCQlidWlsZEVsZW1lbnRGb3JtRGVmYXVsdEFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGVsZW1lbnRGb3JtRGVmYXVsdEFkYXB0ZXI7Ci0JcHJpdmF0ZSBYbWxOc0Zvcm0gZWxlbWVudEZvcm1EZWZhdWx0OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gTE9DQVRJT05fQURBUFRFUiA9IAotCQkJYnVpbGRMb2NhdGlvbkFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGxvY2F0aW9uQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBsb2NhdGlvbjsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IE5BTUVTUEFDRV9BREFQVEVSID0gCi0JCQlidWlsZE5hbWVzcGFjZUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVzcGFjZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCQotCXByaXZhdGUgZmluYWwgWG1sbnNBbm5vdGF0aW9uQ29udGFpbmVyIHhtbG5zQ29udGFpbmVyID0gbmV3IFhtbG5zQW5ub3RhdGlvbkNvbnRhaW5lcigpOwotCQotCQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBdHRyaWJ1dGVGb3JtRGVmYXVsdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKAotCQkJCURFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSkFYQi5YTUxfU0NIRU1BX19BVFRSSUJVVEVfRk9STV9ERUZBVUxUKTsgLy9yZW1vdmUgYW5ub3RhdGlvbiB3aGVuIGVtcHR5Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRFbGVtZW50Rm9ybURlZmF1bHRBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcigKLQkJCQlERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpBWEIuWE1MX1NDSEVNQV9fRUxFTUVOVF9GT1JNX0RFRkFVTFQpOyAvLyByZW1vdmUgYW5ub3RhdGlvbiB3aGVuIGVtcHR5Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRMb2NhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncygKLQkJCQlERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpBWEIuWE1MX1NDSEVNQV9fTE9DQVRJT04pOyAvLyByZW1vdmUgYW5ub3RhdGlvbiB3aGVuIGVtcHR5Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lc3BhY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoCi0JCQkJREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKQVhCLlhNTF9TQ0hFTUFfX05BTUVTUEFDRSk7IC8vIHJlbW92ZSBhbm5vdGF0aW9uIHdoZW4gZW1wdHkKLQl9Ci0JCi0JCi0JcHVibGljIFNvdXJjZVhtbFNjaGVtYUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQl0aGlzKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0JCi0JcHVibGljIFNvdXJjZVhtbFNjaGVtYUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJc3VwZXIocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBkYWEpOwotCQl0aGlzLmF0dHJpYnV0ZUZvcm1EZWZhdWx0QWRhcHRlciA9IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKEFUVFJJQlVURV9GT1JNX0RFRkFVTFRfQURBUFRFUik7Ci0JCXRoaXMuZWxlbWVudEZvcm1EZWZhdWx0QWRhcHRlciA9IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKEVMRU1FTlRfRk9STV9ERUZBVUxUX0FEQVBURVIpOwotCQl0aGlzLmxvY2F0aW9uQWRhcHRlciA9IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKExPQ0FUSU9OX0FEQVBURVIpOwotCQl0aGlzLm5hbWVzcGFjZUFkYXB0ZXIgPSBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihOQU1FU1BBQ0VfQURBUFRFUik7Ci0JfQotCQotCQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcigKLQkJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSkgewotCQkKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX1NDSEVNQTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLmF0dHJpYnV0ZUZvcm1EZWZhdWx0ID0gYnVpbGRBdHRyaWJ1dGVGb3JtRGVmYXVsdChhc3RSb290KTsKLQkJdGhpcy5lbGVtZW50Rm9ybURlZmF1bHQgPSBidWlsZEVsZW1lbnRGb3JtRGVmYXVsdChhc3RSb290KTsKLQkJdGhpcy5sb2NhdGlvbiA9IGJ1aWxkTG9jYXRpb24oYXN0Um9vdCk7Ci0JCXRoaXMubmFtZXNwYWNlID0gYnVpbGROYW1lc3BhY2UoYXN0Um9vdCk7Ci0JCXRoaXMueG1sbnNDb250YWluZXIuaW5pdGlhbGl6ZUZyb21Db250YWluZXJBbm5vdGF0aW9uKHRoaXMuZ2V0QXN0QW5ub3RhdGlvbihhc3RSb290KSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzeW5jQXR0cmlidXRlRm9ybURlZmF1bHQoYnVpbGRBdHRyaWJ1dGVGb3JtRGVmYXVsdChhc3RSb290KSk7Ci0JCXN5bmNFbGVtZW50Rm9ybURlZmF1bHQoYnVpbGRFbGVtZW50Rm9ybURlZmF1bHQoYXN0Um9vdCkpOwotCQlzeW5jTG9jYXRpb24oYnVpbGRMb2NhdGlvbihhc3RSb290KSk7Ci0JCXN5bmNOYW1lc3BhY2UoYnVpbGROYW1lc3BhY2UoYXN0Um9vdCkpOwotCQl0aGlzLnhtbG5zQ29udGFpbmVyLnN5bmNocm9uaXplKHRoaXMuZ2V0QXN0QW5ub3RhdGlvbihhc3RSb290KSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZXNwYWNlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBhdHRyaWJ1dGUgZm9ybSBkZWZhdWx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFhtbE5zRm9ybSBnZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlRm9ybURlZmF1bHQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KFhtbE5zRm9ybSBhdHRyaWJ1dGVGb3JtRGVmYXVsdCkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuYXR0cmlidXRlRm9ybURlZmF1bHQsIGF0dHJpYnV0ZUZvcm1EZWZhdWx0KSkgewotCQkJdGhpcy5hdHRyaWJ1dGVGb3JtRGVmYXVsdCA9IGF0dHJpYnV0ZUZvcm1EZWZhdWx0OwotCQkJdGhpcy5hdHRyaWJ1dGVGb3JtRGVmYXVsdEFkYXB0ZXIuc2V0VmFsdWUoWG1sTnNGb3JtLnRvSmF2YUFubm90YXRpb25WYWx1ZShhdHRyaWJ1dGVGb3JtRGVmYXVsdCkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgWG1sTnNGb3JtIGJ1aWxkQXR0cmlidXRlRm9ybURlZmF1bHQoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIFhtbE5zRm9ybS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmF0dHJpYnV0ZUZvcm1EZWZhdWx0QWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jQXR0cmlidXRlRm9ybURlZmF1bHQoWG1sTnNGb3JtIGF0dHJpYnV0ZUZvcm1EZWZhdWx0KSB7Ci0JCVhtbE5zRm9ybSBvbGQgPSB0aGlzLmF0dHJpYnV0ZUZvcm1EZWZhdWx0OwotCQl0aGlzLmF0dHJpYnV0ZUZvcm1EZWZhdWx0ID0gYXR0cmlidXRlRm9ybURlZmF1bHQ7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQVRUUklCVVRFX0ZPUk1fREVGQVVMVF9QUk9QRVJUWSwgb2xkLCBhdHRyaWJ1dGVGb3JtRGVmYXVsdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0QXR0cmlidXRlRm9ybURlZmF1bHRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShBVFRSSUJVVEVfRk9STV9ERUZBVUxUX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGVsZW1lbnQgZm9ybSBkZWZhdWx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFhtbE5zRm9ybSBnZXRFbGVtZW50Rm9ybURlZmF1bHQoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRGb3JtRGVmYXVsdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudEZvcm1EZWZhdWx0KFhtbE5zRm9ybSBlbGVtZW50Rm9ybURlZmF1bHQpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmVsZW1lbnRGb3JtRGVmYXVsdCwgZWxlbWVudEZvcm1EZWZhdWx0KSkgewotCQkJdGhpcy5lbGVtZW50Rm9ybURlZmF1bHQgPSBlbGVtZW50Rm9ybURlZmF1bHQ7Ci0JCQl0aGlzLmVsZW1lbnRGb3JtRGVmYXVsdEFkYXB0ZXIuc2V0VmFsdWUoWG1sTnNGb3JtLnRvSmF2YUFubm90YXRpb25WYWx1ZShlbGVtZW50Rm9ybURlZmF1bHQpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFhtbE5zRm9ybSBidWlsZEVsZW1lbnRGb3JtRGVmYXVsdChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gWG1sTnNGb3JtLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuZWxlbWVudEZvcm1EZWZhdWx0QWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jRWxlbWVudEZvcm1EZWZhdWx0KFhtbE5zRm9ybSBlbGVtZW50Rm9ybURlZmF1bHQpIHsKLQkJWG1sTnNGb3JtIG9sZCA9IHRoaXMuZWxlbWVudEZvcm1EZWZhdWx0OwotCQl0aGlzLmVsZW1lbnRGb3JtRGVmYXVsdCA9IGVsZW1lbnRGb3JtRGVmYXVsdDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChFTEVNRU5UX0ZPUk1fREVGQVVMVF9QUk9QRVJUWSwgb2xkLCBlbGVtZW50Rm9ybURlZmF1bHQpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEVsZW1lbnRGb3JtRGVmYXVsdFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKEVMRU1FTlRfRk9STV9ERUZBVUxUX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGxvY2F0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5sb2NhdGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5sb2NhdGlvbiwgbG9jYXRpb24pKSB7Ci0JCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JCQl0aGlzLmxvY2F0aW9uQWRhcHRlci5zZXRWYWx1ZShsb2NhdGlvbik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRMb2NhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5sb2NhdGlvbkFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmxvY2F0aW9uOwotCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTE9DQVRJT05fUFJPUEVSVFksIG9sZCwgbG9jYXRpb24pOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldExvY2F0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoTE9DQVRJT05fQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogbmFtZXNwYWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lc3BhY2UsIG5hbWVzcGFjZSkpIHsKLQkJCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQkJdGhpcy5uYW1lc3BhY2VBZGFwdGVyLnNldFZhbHVlKG5hbWVzcGFjZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lc3BhY2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNOYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lc3BhY2U7Ci0JCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVTUEFDRV9QUk9QRVJUWSwgb2xkLCBuYW1lc3BhY2UpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVzcGFjZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKE5BTUVTUEFDRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZXNwYWNlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZWxlbWVudFRvdWNoZXMoTkFNRVNQQUNFX0FEQVBURVIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogeG1sbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmFibGU8WG1sTnNBbm5vdGF0aW9uPiBnZXRYbWxucygpIHsKLQkJcmV0dXJuIHRoaXMueG1sbnNDb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbnMoKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRYbWxuc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbG5zQ29udGFpbmVyLmdldE5lc3RlZEFubm90YXRpb25zU2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgWG1sTnNBbm5vdGF0aW9uIHhtbG5zQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnhtbG5zQ29udGFpbmVyLmdldE5lc3RlZEFubm90YXRpb24oaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgWG1sTnNBbm5vdGF0aW9uIGFkZFhtbG5zKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy54bWxuc0NvbnRhaW5lci5hZGROZXN0ZWRBbm5vdGF0aW9uKGluZGV4KTsKLQl9Ci0JCi0JcHJpdmF0ZSBYbWxOc0Fubm90YXRpb24gYnVpbGRYbWxucyhpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxOc0Fubm90YXRpb24oCi0JCQkJdGhpcywgdGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBidWlsZFhtbG5zSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW5kZXgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZFhtbG5zSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJdGhpcy5kYWEsIEpBWEIuWE1MX1NDSEVNQV9fWE1MTlMsIGluZGV4LCBKQVhCLlhNTF9OUyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVYbWxucyhpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLnhtbG5zQ29udGFpbmVyLm1vdmVOZXN0ZWRBbm5vdGF0aW9uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbG5zKGludCBpbmRleCkgewotCQl0aGlzLnhtbG5zQ29udGFpbmVyLnJlbW92ZU5lc3RlZEFubm90YXRpb24oaW5kZXgpOwotCX0KLQkKLQkvKioKLQkgKiBhZGFwdCB0aGUgQW5ub3RhdGlvbkNvbnRhaW5lciBpbnRlcmZhY2UgdG8gdGhlIHhtbCBzY2hlbWEncyB4bWxucwotCSAqLwotCWNsYXNzIFhtbG5zQW5ub3RhdGlvbkNvbnRhaW5lciAKLQkJZXh0ZW5kcyBBbm5vdGF0aW9uQ29udGFpbmVyPFhtbE5zQW5ub3RhdGlvbj4KLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5lc3RlZEFubm90YXRpb25zTGlzdE5hbWUoKSB7Ci0JCQlyZXR1cm4gWE1MTlNfTElTVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJCXJldHVybiBKQVhCLlhNTF9TQ0hFTUFfX1hNTE5TOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5lc3RlZEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEpBWEIuWE1MX05TOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sTnNBbm5vdGF0aW9uIGJ1aWxkTmVzdGVkQW5ub3RhdGlvbihpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBTb3VyY2VYbWxTY2hlbWFBbm5vdGF0aW9uLnRoaXMuYnVpbGRYbWxucyhpbmRleCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sU2NoZW1hVHlwZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFkNmE3Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxTY2hlbWFUeXBlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYVR5cGUKLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uCi0JCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBDT05UQUlORVJfREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfU0NIRU1BX1RZUEVTKTsKLQkKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVzcGFjZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB0eXBlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdHlwZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGU7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgU291cmNlWG1sU2NoZW1hVHlwZUFubm90YXRpb24gYnVpbGRTb3VyY2VYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCAKLQkJCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgCi0JCQlpbnQgaW5kZXgpIHsKLQkJCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBidWlsZFhtbFNjaGVtYVR5cGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4KTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IGJ1aWxkWG1sU2NoZW1hVHlwZUFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIGlkYWEpOwotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKAotCQkJcGFyZW50LAotCQkJYW5ub3RhdGVkRWxlbWVudCwKLQkJCWlkYWEsCi0JCQlpYWEpOwotCX0KLQkKLQlwcml2YXRlIFNvdXJjZVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIAotCQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLAotCQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCQotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZE5hbWVBZGFwdGVyKGRhYSk7Ci0JCXRoaXMubmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGROYW1lc3BhY2VBZGFwdGVyKGRhYSk7Ci0JCXRoaXMubmFtZXNwYWNlQWRhcHRlciA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5uYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLnR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZFR5cGVBZGFwdGVyKGRhYSk7Ci0JCXRoaXMudHlwZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMudHlwZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCQotCQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE5hbWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsIEpBWEIuWE1MX1NDSEVNQV9UWVBFX19OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTmFtZXNwYWNlQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRV9fTkFNRVNQQUNFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVHlwZUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgSkFYQi5YTUxfU0NIRU1BX1RZUEVfX1RZUEUsIAotCQkJCVNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQlzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcigKLQkJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgCi0JCQlFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gY29udmVydGVyKSB7Ci0JCQotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KAotCQkJCWFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgY29udmVydGVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKAotCQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7Ci0JCQotCQlyZXR1cm4gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIGRhZWEpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfU0NIRU1BX1RZUEU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5uYW1lID0gYnVpbGROYW1lKGFzdFJvb3QpOwotCQl0aGlzLm5hbWVzcGFjZSA9IGJ1aWxkTmFtZXNwYWNlKGFzdFJvb3QpOwotCQl0aGlzLnR5cGUgPSBidWlsZFR5cGUoYXN0Um9vdCk7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRUeXBlID0gYnVpbGRGdWxseVF1YWxpZmllZFR5cGUoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzeW5jTmFtZShidWlsZE5hbWUoYXN0Um9vdCkpOwotCQlzeW5jTmFtZXNwYWNlKGJ1aWxkTmFtZXNwYWNlKGFzdFJvb3QpKTsKLQkJc3luY1R5cGUoYnVpbGRUeXBlKGFzdFJvb3QpKTsKLQkJc3luY0Z1bGx5UXVhbGlmaWVkVHlwZShidWlsZEZ1bGx5UXVhbGlmaWVkVHlwZShhc3RSb290KSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogWG1sU2NoZW1hVHlwZUFubm90YXRpb24gaW1wbCAqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMubmFtZSwgbmFtZSkpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKG5hbWUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jTmFtZShTdHJpbmcgYXN0TmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBhc3ROYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBhc3ROYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZWxlbWVudFRvdWNoZXModGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQkvLyAqKioqKiBuYW1lc3BhY2UKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lc3BhY2UsIG5hbWVzcGFjZSkpIHsKLQkJCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQkJdGhpcy5uYW1lc3BhY2VBZGFwdGVyLnNldFZhbHVlKG5hbWVzcGFjZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNOYW1lc3BhY2UoU3RyaW5nIGFzdE5hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lc3BhY2U7Ci0JCXRoaXMubmFtZXNwYWNlID0gYXN0TmFtZXNwYWNlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRVNQQUNFX1BST1BFUlRZLCBvbGQsIGFzdE5hbWVzcGFjZSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZXNwYWNlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzcGFjZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5uYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG5hbWVzcGFjZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKHRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIHR5cGUKLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudHlwZSwgdHlwZSkpIHsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQl0aGlzLnR5cGVBZGFwdGVyLnNldFZhbHVlKHR5cGUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jVHlwZShTdHJpbmcgYXN0VHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy50eXBlOwotCQl0aGlzLnR5cGUgPSBhc3RUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9QUk9QRVJUWSwgb2xkLCBhc3RUeXBlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUeXBlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnR5cGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRUeXBlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3luY0Z1bGx5UXVhbGlmaWVkVHlwZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZFR5cGU7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRUeXBlID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9UWVBFX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkVHlwZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gKHRoaXMudHlwZSA9PSBudWxsKSA/IG51bGwgOiBBU1RUb29scy5yZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKHRoaXMudHlwZUFkYXB0ZXIuZ2V0RXhwcmVzc2lvbihhc3RSb290KSk7Ci0JfQotCQotCQotCS8vKioqKioqKioqKiogTmVzdGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBjb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZnJvbSBOZXN0YWJsZUFubm90YXRpb24gaW50ZXJmYWNlCi0JICogZm9yIHN1YmNsYXNzZXMKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgpIHsKLQkJdGhpcy5nZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKS5tb3ZlQW5ub3RhdGlvbihuZXdJbmRleCk7Ci0JfQotCQotCXByaXZhdGUgSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIChJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIpIHRoaXMuYW5ub3RhdGlvbkFkYXB0ZXI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBidWlsZFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uQWRhcHRlcihBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJcmV0dXJuIG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIGlkYWEpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkWG1sU2NoZW1hVHlwZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4KSB7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSAKLQkJCW5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCURFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwKLQkJCQlDT05UQUlORVJfREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLAotCQkJCWluZGV4LAotCQkJCUpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQkJcmV0dXJuIGlkYWE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sU2VlQWxzb0Fubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbFNlZUFsc29Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OGU1MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sU2VlQWxzb0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxTZWVBbHNvQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNlZUFsc28KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVhtbFNlZUFsc29Bbm5vdGF0aW9uCi0JCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbFNlZUFsc29Bbm5vdGF0aW9uIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfU0VFX0FMU08pOwotCQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IHZhbHVlRGVjbGFyYXRpb25BZGFwdGVyOwotCQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiB2YWx1ZUFkYXB0ZXI7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8U3RyaW5nPiBjbGFzc2VzOwotCQotCS8qCi0JICogV2Ugd2FudCB0aGlzIGV2ZW50IGZpcmVkIHdoZW4gdGhlIGZxIGNsYXNzZXMgY2hhbmdlIGJ5IHRoZW1zZWx2ZXMsIG5vdCBhcyBhIHJlc3VsdAotCSAqIG9mIHRoZSB2YWx1ZSBjaGFuZ2luZy4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc3VwcHJlc3NGUUNsYXNzZXNFdmVudE5vdGlmaWNhdGlvbiA9IGZhbHNlOwotCQotCXByaXZhdGUgZmluYWwgVmVjdG9yPFN0cmluZz4gZnVsbHlRdWFsaWZpZWRDbGFzc2VzOwotCQotCQotCXB1YmxpYyBTb3VyY2VYbWxTZWVBbHNvQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZURlY2xhcmF0aW9uQWRhcHRlciA9IGJ1aWxkQXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKQVhCLlhNTF9TRUVfQUxTT19fVkFMVUUpOwotCQl0aGlzLnZhbHVlQWRhcHRlciA9IHRoaXMuYnVpbGRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLnZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5jbGFzc2VzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRDbGFzc2VzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JfQotCQotCQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBidWlsZEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX1NFRV9BTFNPOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWZvciAoU3RyaW5nIGFzdENsYXNzIDogdGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpIHsKLQkJCXRoaXMuY2xhc3Nlcy5hZGQoYXN0Q2xhc3MpOwotCQl9Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5mdWxseVF1YWxpZmllZENsYXNzZXMsIGJ1aWxkRnVsbHlRdWFsaWZpZWRDbGFzc2VzKGFzdFJvb3QpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVN0cmluZ1tdIGFzdENsYXNzZXMgPSB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQkJc3luY2hyb25pemVMaXN0KEFycmF5cy5hc0xpc3QoYXN0Q2xhc3NlcyksIHRoaXMuY2xhc3NlcywgQ0xBU1NFU19MSVNUKTsKLQkJCi0JCWlmICh0aGlzLnN1cHByZXNzRlFDbGFzc2VzRXZlbnROb3RpZmljYXRpb24pIHsKLQkJCXRoaXMuZnVsbHlRdWFsaWZpZWRDbGFzc2VzLmNsZWFyKCk7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMuZnVsbHlRdWFsaWZpZWRDbGFzc2VzLCBidWlsZEZ1bGx5UXVhbGlmaWVkQ2xhc3Nlcyhhc3RSb290KSk7Ci0JCQl0aGlzLnN1cHByZXNzRlFDbGFzc2VzRXZlbnROb3RpZmljYXRpb24gPSBmYWxzZTsKLQkJfQotCQllbHNlIHsKLQkJCXN5bmNocm9uaXplTGlzdChidWlsZEZ1bGx5UXVhbGlmaWVkQ2xhc3Nlcyhhc3RSb290KSwgdGhpcy5mdWxseVF1YWxpZmllZENsYXNzZXMsIEZVTExZX1FVQUxJRklFRF9DTEFTU0VTX0xJU1QpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkRnVsbHlRdWFsaWZpZWRDbGFzc2VzKGZpbmFsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHRoaXMudmFsdWVBZGFwdGVyLmdldEV4cHJlc3Npb24oYXN0Um9vdCk7Ci0JCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKTsKLQkJfQotCQlpZiAoZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuVFlQRV9MSVRFUkFMKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxTdHJpbmc+KEFTVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUoZXhwcmVzc2lvbikpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIEFTVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWVzKGV4cHJlc3Npb24pOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuY2xhc3Nlcyk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogWG1sU2VlQWxzb0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCQotCS8vICoqKioqIGNsYXNzZXMKLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2xhc3NlcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLmNsYXNzZXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldENsYXNzZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jbGFzc2VzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkQ2xhc3MoU3RyaW5nIGNsYXp6KSB7Ci0JCXRoaXMuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNpemUoKSwgY2xhenopOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRDbGFzcyhpbnQgaW5kZXgsIFN0cmluZyBjbGF6eikgewotCQl0aGlzLmNsYXNzZXMuYWRkKGluZGV4LCBjbGF6eik7Ci0JCXRoaXMuc3VwcHJlc3NGUUNsYXNzZXNFdmVudE5vdGlmaWNhdGlvbiA9IHRydWU7Ci0JCXRoaXMud3JpdGVDbGFzc2VzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVDbGFzcyhpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLmNsYXNzZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuc3VwcHJlc3NGUUNsYXNzZXNFdmVudE5vdGlmaWNhdGlvbiA9IHRydWU7Ci0JCXRoaXMud3JpdGVDbGFzc2VzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUNsYXNzKGludCBpbmRleCkgewotCQl0aGlzLmNsYXNzZXMucmVtb3ZlKGluZGV4KTsKLQkJdGhpcy5zdXBwcmVzc0ZRQ2xhc3Nlc0V2ZW50Tm90aWZpY2F0aW9uID0gdHJ1ZTsKLQkJdGhpcy53cml0ZUNsYXNzZXMoKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NlcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLmZ1bGx5UXVhbGlmaWVkQ2xhc3Nlcyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB3cml0ZUNsYXNzZXMoKSB7Ci0JCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKHRoaXMuY2xhc3Nlcy50b0FycmF5KG5ldyBTdHJpbmdbdGhpcy5jbGFzc2VzLnNpemUoKV0pKTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGJ1aWxkQXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBidWlsZEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JUeXBlcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGJ1aWxkQXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZ1tdPiBjb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgY29udmVydGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxUcmFuc2llbnRBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxUcmFuc2llbnRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMTdiODMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sVHJhbnNpZW50QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxUcmFuc2llbnRBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHJhbnNpZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VYbWxUcmFuc2llbnRBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxUcmFuc2llbnRBbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpBWEIuWE1MX1RSQU5TSUVOVCk7Ci0KLQlwdWJsaWMgU291cmNlWG1sVHJhbnNpZW50QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfVFJBTlNJRU5UOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9uby1vcAotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vLW9wCi0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sVHlwZUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbFR5cGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMDMxNTIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sVHlwZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSW5kZXhlZENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sVHlwZUFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VYbWxUeXBlQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sVHlwZUFubm90YXRpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfVFlQRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IEZBQ1RPUllfQ0xBU1NfQURBUFRFUiA9IGJ1aWxkRmFjdG9yeUNsYXNzQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZmFjdG9yeUNsYXNzQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBmYWN0b3J5Q2xhc3M7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWRGYWN0b3J5Q2xhc3NOYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBGQUNUT1JZX01FVEhPRF9BREFQVEVSID0gYnVpbGRGYWN0b3J5TWV0aG9kQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZmFjdG9yeU1ldGhvZEFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgZmFjdG9yeU1ldGhvZDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gTkFNRV9BREFQVEVSID0gYnVpbGROYW1lQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gTkFNRVNQQUNFX0FEQVBURVIgPSBidWlsZE5hbWVzcGFjZUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVzcGFjZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCi0JcHJpdmF0ZSBmaW5hbCBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBwcm9wT3JkZXJEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IHByb3BPcmRlckFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8U3RyaW5nPiBwcm9wT3JkZXIgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQotCXB1YmxpYyBTb3VyY2VYbWxUeXBlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5mYWN0b3J5Q2xhc3NBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihGQUNUT1JZX0NMQVNTX0FEQVBURVIpOwotCQl0aGlzLmZhY3RvcnlNZXRob2RBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihGQUNUT1JZX01FVEhPRF9BREFQVEVSKTsKLQkJdGhpcy5uYW1lQWRhcHRlciA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoTkFNRV9BREFQVEVSKTsKLQkJdGhpcy5uYW1lc3BhY2VBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihOQU1FU1BBQ0VfQURBUFRFUik7Ci0JCXRoaXMucHJvcE9yZGVyRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpBWEIuWE1MX1RZUEVfX1BST1BfT1JERVIpOwotCQl0aGlzLnByb3BPcmRlckFkYXB0ZXIgPSB0aGlzLmJ1aWxkQXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5wcm9wT3JkZXJEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gYnVpbGRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgSW5kZXhlZEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBjb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIG5ldyBJbmRleGVkQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBjb252ZXJ0ZXIpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBidWlsZEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfVFlQRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuZmFjdG9yeUNsYXNzID0gdGhpcy5idWlsZEZhY3RvcnlDbGFzcyhhc3RSb290KTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZEZhY3RvcnlDbGFzc05hbWUgPSB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRGYWN0b3J5Q2xhc3NOYW1lKGFzdFJvb3QpOwotCQl0aGlzLmZhY3RvcnlNZXRob2QgPSB0aGlzLmJ1aWxkRmFjdG9yeU1ldGhvZChhc3RSb290KTsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoYXN0Um9vdCk7Ci0JCXRoaXMubmFtZXNwYWNlID0gdGhpcy5idWlsZE5hbWVzcGFjZShhc3RSb290KTsKLQkJdGhpcy5pbml0aWFsaXplUHJvcE9yZGVyKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNGYWN0b3J5Q2xhc3ModGhpcy5idWlsZEZhY3RvcnlDbGFzcyhhc3RSb290KSk7Ci0JCXRoaXMuc3luY0Z1bGx5UXVhbGlmaWVkRmFjdG9yeUNsYXNzTmFtZSh0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRGYWN0b3J5Q2xhc3NOYW1lKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jRmFjdG9yeU1ldGhvZCh0aGlzLmJ1aWxkRmFjdG9yeU1ldGhvZChhc3RSb290KSk7Ci0JCXRoaXMuc3luY05hbWUodGhpcy5idWlsZE5hbWUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNOYW1lc3BhY2UodGhpcy5idWlsZE5hbWVzcGFjZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY1Byb3BPcmRlcihhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYbWxUeXBlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBmYWN0b3J5Q2xhc3MKLQlwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuZmFjdG9yeUNsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZhY3RvcnlDbGFzcyhTdHJpbmcgZmFjdG9yeUNsYXNzKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmZhY3RvcnlDbGFzcywgZmFjdG9yeUNsYXNzKSkgewotCQkJdGhpcy5mYWN0b3J5Q2xhc3MgPSBmYWN0b3J5Q2xhc3M7Ci0JCQl0aGlzLmZhY3RvcnlDbGFzc0FkYXB0ZXIuc2V0VmFsdWUoZmFjdG9yeUNsYXNzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jRmFjdG9yeUNsYXNzKFN0cmluZyBhc3RGYWN0b3J5Q2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZmFjdG9yeUNsYXNzOwotCQl0aGlzLmZhY3RvcnlDbGFzcyA9IGFzdEZhY3RvcnlDbGFzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZBQ1RPUllfQ0xBU1NfUFJPUEVSVFksIG9sZCwgYXN0RmFjdG9yeUNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZhY3RvcnlDbGFzcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5mYWN0b3J5Q2xhc3NBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RmFjdG9yeUNsYXNzVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoRkFDVE9SWV9DTEFTU19BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0JCi0JLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIGZhY3RvcnkgY2xhc3MgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRGYWN0b3J5Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5mdWxseVF1YWxpZmllZEZhY3RvcnlDbGFzc05hbWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNGdWxseVF1YWxpZmllZEZhY3RvcnlDbGFzc05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZnVsbHlRdWFsaWZpZWRGYWN0b3J5Q2xhc3NOYW1lOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkRmFjdG9yeUNsYXNzTmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfRkFDVE9SWV9DTEFTU19OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRGYWN0b3J5Q2xhc3NOYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiAodGhpcy5mYWN0b3J5Q2xhc3MgPT0gbnVsbCkgPyBudWxsIDogQVNUVG9vbHMucmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZSh0aGlzLmZhY3RvcnlDbGFzc0FkYXB0ZXIuZ2V0RXhwcmVzc2lvbihhc3RSb290KSk7Ci0JfQotCi0JLy8gKioqKiogZmFjdG9yeU1ldGhvZAotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeU1ldGhvZCgpIHsKLQkJcmV0dXJuIHRoaXMuZmFjdG9yeU1ldGhvZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGYWN0b3J5TWV0aG9kKFN0cmluZyBmYWN0b3J5TWV0aG9kKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmZhY3RvcnlNZXRob2QsIGZhY3RvcnlNZXRob2QpKSB7Ci0JCQl0aGlzLmZhY3RvcnlNZXRob2QgPSBmYWN0b3J5TWV0aG9kOwotCQkJdGhpcy5mYWN0b3J5TWV0aG9kQWRhcHRlci5zZXRWYWx1ZShmYWN0b3J5TWV0aG9kKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jRmFjdG9yeU1ldGhvZChTdHJpbmcgYXN0RmFjdG9yeU1ldGhvZCkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mYWN0b3J5TWV0aG9kOwotCQl0aGlzLmZhY3RvcnlNZXRob2QgPSBhc3RGYWN0b3J5TWV0aG9kOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkFDVE9SWV9NRVRIT0RfUFJPUEVSVFksIG9sZCwgYXN0RmFjdG9yeU1ldGhvZCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGYWN0b3J5TWV0aG9kKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmZhY3RvcnlNZXRob2RBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RmFjdG9yeU1ldGhvZFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKEZBQ1RPUllfTUVUSE9EX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lLCBuYW1lKSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY05hbWUoU3RyaW5nIGFzdE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gYXN0TmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgYXN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UoTkFNRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKE5BTUVfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbmFtZXNwYWNlCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lc3BhY2UsIG5hbWVzcGFjZSkpIHsKLQkJCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQkJdGhpcy5uYW1lc3BhY2VBZGFwdGVyLnNldFZhbHVlKG5hbWVzcGFjZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY05hbWVzcGFjZShTdHJpbmcgYXN0TmFtZXNwYWNlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWVzcGFjZTsKLQkJdGhpcy5uYW1lc3BhY2UgPSBhc3ROYW1lc3BhY2U7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FU1BBQ0VfUFJPUEVSVFksIG9sZCwgYXN0TmFtZXNwYWNlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWVzcGFjZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2VBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoTkFNRVNQQUNFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lc3BhY2VUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBlbGVtZW50VG91Y2hlcyhOQU1FU1BBQ0VfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogcHJvcCBvcmRlciAqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRQcm9wT3JkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFN0cmluZz4odGhpcy5wcm9wT3JkZXIpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFByb3BPcmRlclNpemUoKSB7Ci0JCXJldHVybiB0aGlzLnByb3BPcmRlci5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFByb3AoU3RyaW5nIHByb3ApIHsKLQkJdGhpcy5hZGRQcm9wKHRoaXMucHJvcE9yZGVyLnNpemUoKSwgcHJvcCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFByb3AoaW50IGluZGV4LCBTdHJpbmcgcHJvcCkgewotCQl0aGlzLnByb3BPcmRlci5hZGQoaW5kZXgsIHByb3ApOwotCQl0aGlzLndyaXRlUHJvcE9yZGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVByb3AoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5wcm9wT3JkZXIsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMud3JpdGVQcm9wT3JkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wKFN0cmluZyBwcm9wKSB7Ci0JCXRoaXMucHJvcE9yZGVyLnJlbW92ZShwcm9wKTsKLQkJdGhpcy53cml0ZVByb3BPcmRlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3AoaW50IGluZGV4KSB7Ci0JCXRoaXMucHJvcE9yZGVyLnJlbW92ZShpbmRleCk7Ci0JCXRoaXMud3JpdGVQcm9wT3JkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVQcm9wT3JkZXIoKSB7Ci0JCXRoaXMucHJvcE9yZGVyQWRhcHRlci5zZXRWYWx1ZSh0aGlzLnByb3BPcmRlci50b0FycmF5KG5ldyBTdHJpbmdbdGhpcy5wcm9wT3JkZXIuc2l6ZSgpXSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplUHJvcE9yZGVyKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVN0cmluZ1tdIGFzdFByb3BPcmRlciA9IHRoaXMucHJvcE9yZGVyQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhc3RQcm9wT3JkZXIubGVuZ3RoOyBpKyspIHsKLQkJCXRoaXMucHJvcE9yZGVyLmFkZChhc3RQcm9wT3JkZXJbaV0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNQcm9wT3JkZXIoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJU3RyaW5nW10gYXN0UHJvcE9yZGVyID0gdGhpcy5wcm9wT3JkZXJBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNocm9uaXplTGlzdChBcnJheXMuYXNMaXN0KGFzdFByb3BPcmRlciksIHRoaXMucHJvcE9yZGVyLCBQUk9QX09SREVSX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFByb3BPcmRlclRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnByb3BPcmRlckRlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHByb3BPcmRlclRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKHRoaXMucHJvcE9yZGVyRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFByb3BUZXh0UmFuZ2UoaW50IGluZGV4LCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnNlbGVjdEFubm90YXRpb25FbGVtZW50VGV4dFJhbmdlKHRoaXMucHJvcE9yZGVyRGVjbGFyYXRpb25BZGFwdGVyLCBpbmRleCwgYXN0Um9vdCksIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwcm9wVG91Y2hlcyhpbnQgaW5kZXgsIGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0ZXh0UmFuZ2VUb3VjaGVzKHRoaXMuc2VsZWN0QW5ub3RhdGlvbkVsZW1lbnRUZXh0UmFuZ2UodGhpcy5wcm9wT3JkZXJEZWNsYXJhdGlvbkFkYXB0ZXIsIGluZGV4LCBhc3RSb290KSwgcG9zKTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkRmFjdG9yeUNsYXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSkFYQi5YTUxfVFlQRV9fRkFDVE9SWV9DTEFTUywgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0Jc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gY29udmVydGVyKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBjb252ZXJ0ZXIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRGYWN0b3J5TWV0aG9kQWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSkFYQi5YTUxfVFlQRV9fRkFDVE9SWV9NRVRIT0QpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSkFYQi5YTUxfVFlQRV9fTkFNRSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE5hbWVzcGFjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpBWEIuWE1MX1RZUEVfX05BTUVTUEFDRSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sVmFsdWVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxWYWx1ZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZmNWQ0NS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxWYWx1ZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sVmFsdWVBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVmFsdWUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVhtbFZhbHVlQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sVmFsdWVBbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpBWEIuWE1MX1ZBTFVFKTsKLQotCXB1YmxpYyBTb3VyY2VYbWxWYWx1ZUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX1ZBTFVFOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9uby1vcAotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vLW9wCi0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF4YmluZGV4L0pheGJJbmRleFJlc291cmNlSW1wbC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF4YmluZGV4L0pheGJJbmRleFJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTE3ZmIxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2pheGJpbmRleC9KYXhiSW5kZXhSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXhiaW5kZXg7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TbmFwc2hvdENsb25lSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5BYnN0cmFjdEpheGJGaWxlUmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmpheGJpbmRleC5KYXhiSW5kZXhSZXNvdXJjZTsKLQotLyoqCi0gKiBKQVhCIGluZGV4Ci0gKi8KLXB1YmxpYyBjbGFzcyBKYXhiSW5kZXhSZXNvdXJjZUltcGwKLQlleHRlbmRzIEFic3RyYWN0SmF4YkZpbGVSZXNvdXJjZU1vZGVsPFZlY3RvcjxTdHJpbmc+PgotCWltcGxlbWVudHMgSmF4YkluZGV4UmVzb3VyY2UKLXsKLQlwdWJsaWMgSmF4YkluZGV4UmVzb3VyY2VJbXBsKElGaWxlIGZpbGUpIHsKLQkJc3VwZXIoZmlsZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFZlY3RvcjxTdHJpbmc+IGJ1aWxkU3RhdGUoKSB7Ci0JCXJldHVybiBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWxvYWQoKSB7Ci0JCXRoaXMuc3RhdGUuY2xlYXIoKTsKLQkJc3VwZXIucmVsb2FkKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbG9hZChJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtKSk7Ci0JCVN0cmluZyBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCXdoaWxlIChsaW5lICE9IG51bGwpIHsKLQkJCXRoaXMuc3RhdGUuYWRkKGxpbmUudHJpbSgpKTsKLQkJCWxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lcygpIHsKLQkJcmV0dXJuICh0aGlzLnBhY2thZ2VOYW1lID09IG51bGwpID8KLQkJCQl0aGlzLmdldFNpbXBsZUNsYXNzTmFtZXMoKSA6Ci0JCQkJdGhpcy5nZXRQcmVmaXhlZENsYXNzTmFtZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRTaW1wbGVDbGFzc05hbWVzKCkgewotCQlyZXR1cm4gbmV3IFNuYXBzaG90Q2xvbmVJdGVyYWJsZTxTdHJpbmc+KHRoaXMuc3RhdGUpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldFByZWZpeGVkQ2xhc3NOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFN0cmluZywgU3RyaW5nPigKLQkJCQkJdGhpcy5nZXRTaW1wbGVDbGFzc05hbWVzKCksCi0JCQkJCW5ldyBQcmVmaXhUcmFuc2Zvcm1lcih0aGlzLnBhY2thZ2VOYW1lICsgJy4nKQotCQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFByZWZpeFRyYW5zZm9ybWVyCi0JCWltcGxlbWVudHMgVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+Ci0JewotCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHByZWZpeDsKLQkJcHJvdGVjdGVkIFByZWZpeFRyYW5zZm9ybWVyKFN0cmluZyBwcmVmaXgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnByZWZpeCA9IHByZWZpeDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShTdHJpbmcgc3RyaW5nKSB7Ci0JCQlyZXR1cm4gdGhpcy5wcmVmaXggKyBzdHJpbmc7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIEpwdEpheGJDb3JlUGx1Z2luLkpBWEJfSU5ERVhfUkVTT1VSQ0VfVFlQRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXhiaW5kZXgvSmF4YkluZGV4UmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXhiaW5kZXgvSmF4YkluZGV4UmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNjAwNzQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF4YmluZGV4L0pheGJJbmRleFJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXhiaW5kZXg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNuYXBzaG90Q2xvbmVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YlJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF4YmluZGV4LkpheGJJbmRleFJlc291cmNlOwotCi0KLXB1YmxpYyBjbGFzcyBKYXhiSW5kZXhSZXNvdXJjZU1vZGVsUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBKYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXhiSW5kZXhSZXNvdXJjZU1vZGVsUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgSmF4YkluZGV4UmVzb3VyY2VNb2RlbFByb3ZpZGVyKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhiSW5kZXhSZXNvdXJjZU1vZGVsUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBmaW5hbCBNYXA8SUZpbGUsIEpheGJJbmRleFJlc291cmNlSW1wbD4gbW9kZWxzID0gbmV3IEhhc2hNYXA8SUZpbGUsIEpheGJJbmRleFJlc291cmNlSW1wbD4oKTsKLQkKLQlwcml2YXRlIGZpbmFsIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEpheGJJbmRleFJlc291cmNlTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gYnVpbGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMucmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCQotCQotCXByb3RlY3RlZCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBidWlsZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7CQotCQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlUmVzb3VyY2VDaGFuZ2VFdmVudChldmVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXB1YmxpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBKcHRKYXhiQ29yZVBsdWdpbi5KQVhCX0lOREVYX0NPTlRFTlRfVFlQRTsKLQl9Ci0JCi0JcHVibGljIEpwdFJlc291cmNlTW9kZWwgYnVpbGRSZXNvdXJjZU1vZGVsKEpheGJQcm9qZWN0IGpheGJQcm9qZWN0LCBJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBidWlsZFJlc291cmNlTW9kZWwoZmlsZSk7Ci0JfQotCQotCXB1YmxpYyBKYXhiSW5kZXhSZXNvdXJjZSBidWlsZFJlc291cmNlTW9kZWwoSUZpbGUgZmlsZSkgewotCQlKYXhiSW5kZXhSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSB0aGlzLm1vZGVscy5nZXQoZmlsZSk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCX0KLQkJcmVzb3VyY2UgPSBuZXcgSmF4YkluZGV4UmVzb3VyY2VJbXBsKGZpbGUpOwotCQl0aGlzLm1vZGVscy5wdXQoZmlsZSwgcmVzb3VyY2UpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVJlc291cmNlQ2hhbmdlRXZlbnQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFIDoKLQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSA6Ci0JCQkJcmVtb3ZlUHJvamVjdFJlc291cmNlcygoSVByb2plY3QpIGV2ZW50LmdldFJlc291cmNlKCkpOwotCQkJCXJldHVybjsKLQkJCQotCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSA6Ci0JCQkJdXBkYXRlUmVzb3VyY2VzKGV2ZW50LmdldERlbHRhKCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVByb2plY3RSZXNvdXJjZXMoSVByb2plY3QgcmVtb3ZlZFByb2plY3QpIHsKLQkJZm9yIChJRmlsZSBmaWxlIDogbmV3IFNuYXBzaG90Q2xvbmVJdGVyYWJsZTxJRmlsZT4odGhpcy5tb2RlbHMua2V5U2V0KCkpKSB7Ci0JCQlpZiAoZmlsZS5nZXRQcm9qZWN0KCkuZXF1YWxzKHJlbW92ZWRQcm9qZWN0KSkgewotCQkJCXJlbW92ZVJlc291cmNlKGZpbGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVJlc291cmNlcyhJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQl0cnkgewotCQkJZGVsdGEuYWNjZXB0KG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy8gc2hvdWxkbid0IGhhcHBlbgotCQkJSnB0SmF4YkNvcmVQbHVnaW4ubG9nKGNlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZXNvdXJjZShJRmlsZSBmaWxlKSB7Ci0JCXRoaXMubW9kZWxzLnJlbW92ZShmaWxlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVzb3VyY2UoSUZpbGUgZmlsZSkgewotCQlKYXhiSW5kZXhSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSB0aGlzLm1vZGVscy5nZXQoZmlsZSk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZS51cGRhdGUoKTsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgUmVzb3VyY2VEZWx0YVZpc2l0b3IKLQkJCWltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQlJUmVzb3VyY2UgcmVzID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCXN3aXRjaCAocmVzLmdldFR5cGUoKSkgewotCQkJCWNhc2UgSVJlc291cmNlLlJPT1QgOgotCQkJCQlyZXR1cm4gdHJ1ZTsgIC8vIHZpc2l0IGNoaWxkcmVuCi0JCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6Ci0JCQkJCXJldHVybiB0cnVlOyAgLy8gdmlzaXQgY2hpbGRyZW4KLQkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgotCQkJCQlyZXR1cm4gdHJ1ZTsgIC8vIHZpc2l0IGNoaWxkcmVuCi0JCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQkJCWZpbGVDaGFuZ2VkKChJRmlsZSkgcmVzLCBkZWx0YS5nZXRLaW5kKCkpOwotCQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBubyBjaGlsZHJlbgotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBubyBjaGlsZHJlbiAocHJvYmFibHkgc2hvdWxkbid0IGdldCBoZXJlLi4uKQotCQkJfQotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCBmaWxlQ2hhbmdlZChJRmlsZSBmaWxlLCBpbnQgZGVsdGFLaW5kKSB7Ci0JCQlpZiAoZGVsdGFLaW5kID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCQlKYXhiSW5kZXhSZXNvdXJjZU1vZGVsUHJvdmlkZXIudGhpcy5yZW1vdmVSZXNvdXJjZShmaWxlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGRlbHRhS2luZCA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSB7Ci0JCQkJSmF4YkluZGV4UmVzb3VyY2VNb2RlbFByb3ZpZGVyLnRoaXMudXBkYXRlUmVzb3VyY2UoZmlsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXhicHJvcHMvSmF4YlByb3BlcnRpZXNSZXNvdXJjZUltcGwuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2pheGJwcm9wcy9KYXhiUHJvcGVydGllc1Jlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTY4NDJjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2pheGJwcm9wcy9KYXhiUHJvcGVydGllc1Jlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmpheGJwcm9wczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5BYnN0cmFjdEpheGJGaWxlUmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmpheGJwcm9wcy5KYXhiUHJvcGVydGllc1Jlc291cmNlOwotCi0vKioKLSAqIEpBWEIgaW5kZXgKLSAqLwotcHVibGljIGNsYXNzIEpheGJQcm9wZXJ0aWVzUmVzb3VyY2VJbXBsCi0JZXh0ZW5kcyBBYnN0cmFjdEpheGJGaWxlUmVzb3VyY2VNb2RlbDxQcm9wZXJ0aWVzPgotCWltcGxlbWVudHMgSmF4YlByb3BlcnRpZXNSZXNvdXJjZQotewotCXB1YmxpYyBKYXhiUHJvcGVydGllc1Jlc291cmNlSW1wbChJRmlsZSBmaWxlKSB7Ci0JCXN1cGVyKGZpbGUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0aWVzIGJ1aWxkU3RhdGUoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydGllcygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlbG9hZCgpIHsKLQkJdGhpcy5zdGF0ZS5jbGVhcigpOwotCQlzdXBlci5yZWxvYWQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsb2FkKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5zdGF0ZS5sb2FkKHN0cmVhbSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiB0aGlzLnN0YXRlLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiBKcHRKYXhiQ29yZVBsdWdpbi5KQVhCX1BST1BFUlRJRVNfUkVTT1VSQ0VfVFlQRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXhicHJvcHMvSmF4YlByb3BlcnRpZXNSZXNvdXJjZU1vZGVsUHJvdmlkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2pheGJwcm9wcy9KYXhiUHJvcGVydGllc1Jlc291cmNlTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmIyZTcyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2pheGJwcm9wcy9KYXhiUHJvcGVydGllc1Jlc291cmNlTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXhicHJvcHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNuYXBzaG90Q2xvbmVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YlJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF4YnByb3BzLkpheGJQcm9wZXJ0aWVzUmVzb3VyY2U7Ci0KLQotcHVibGljIGNsYXNzIEpheGJQcm9wZXJ0aWVzUmVzb3VyY2VNb2RlbFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSmF4YlJlc291cmNlTW9kZWxQcm92aWRlciB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF4YlByb3BlcnRpZXNSZXNvdXJjZU1vZGVsUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgSmF4YlByb3BlcnRpZXNSZXNvdXJjZU1vZGVsUHJvdmlkZXIoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpheGJQcm9wZXJ0aWVzUmVzb3VyY2VNb2RlbFByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCXByaXZhdGUgZmluYWwgTWFwPElGaWxlLCBKYXhiUHJvcGVydGllc1Jlc291cmNlSW1wbD4gbW9kZWxzID0gbmV3IEhhc2hNYXA8SUZpbGUsIEpheGJQcm9wZXJ0aWVzUmVzb3VyY2VJbXBsPigpOwotCQotCXByaXZhdGUgZmluYWwgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF4YlByb3BlcnRpZXNSZXNvdXJjZU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IGJ1aWxkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgYnVpbGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgewkKLQkJCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWhhbmRsZVJlc291cmNlQ2hhbmdlRXZlbnQoZXZlbnQpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwdWJsaWMgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gSnB0SmF4YkNvcmVQbHVnaW4uSkFYQl9QUk9QRVJUSUVTX0NPTlRFTlRfVFlQRTsKLQl9Ci0JCi0JcHVibGljIEpwdFJlc291cmNlTW9kZWwgYnVpbGRSZXNvdXJjZU1vZGVsKEpheGJQcm9qZWN0IGpheGJQcm9qZWN0LCBJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBidWlsZFJlc291cmNlTW9kZWwoZmlsZSk7Ci0JfQotCQotCXB1YmxpYyBKYXhiUHJvcGVydGllc1Jlc291cmNlIGJ1aWxkUmVzb3VyY2VNb2RlbChJRmlsZSBmaWxlKSB7Ci0JCUpheGJQcm9wZXJ0aWVzUmVzb3VyY2VJbXBsIHJlc291cmNlID0gdGhpcy5tb2RlbHMuZ2V0KGZpbGUpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc291cmNlOwotCQl9Ci0JCXJlc291cmNlID0gbmV3IEpheGJQcm9wZXJ0aWVzUmVzb3VyY2VJbXBsKGZpbGUpOwotCQl0aGlzLm1vZGVscy5wdXQoZmlsZSwgcmVzb3VyY2UpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVJlc291cmNlQ2hhbmdlRXZlbnQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFIDoKLQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSA6Ci0JCQkJcmVtb3ZlUHJvamVjdFJlc291cmNlcygoSVByb2plY3QpIGV2ZW50LmdldFJlc291cmNlKCkpOwotCQkJCXJldHVybjsKLQkJCQotCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSA6Ci0JCQkJdXBkYXRlUmVzb3VyY2VzKGV2ZW50LmdldERlbHRhKCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVByb2plY3RSZXNvdXJjZXMoSVByb2plY3QgcmVtb3ZlZFByb2plY3QpIHsKLQkJZm9yIChJRmlsZSBmaWxlIDogbmV3IFNuYXBzaG90Q2xvbmVJdGVyYWJsZTxJRmlsZT4odGhpcy5tb2RlbHMua2V5U2V0KCkpKSB7Ci0JCQlpZiAoZmlsZS5nZXRQcm9qZWN0KCkuZXF1YWxzKHJlbW92ZWRQcm9qZWN0KSkgewotCQkJCXJlbW92ZVJlc291cmNlKGZpbGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVJlc291cmNlcyhJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQl0cnkgewotCQkJZGVsdGEuYWNjZXB0KG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy8gc2hvdWxkbid0IGhhcHBlbgotCQkJSnB0SmF4YkNvcmVQbHVnaW4ubG9nKGNlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZXNvdXJjZShJRmlsZSBmaWxlKSB7Ci0JCXRoaXMubW9kZWxzLnJlbW92ZShmaWxlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVzb3VyY2UoSUZpbGUgZmlsZSkgewotCQlKYXhiUHJvcGVydGllc1Jlc291cmNlSW1wbCByZXNvdXJjZSA9IHRoaXMubW9kZWxzLmdldChmaWxlKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJlc291cmNlLnVwZGF0ZSgpOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBSZXNvdXJjZURlbHRhVmlzaXRvcgotCQkJaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCQkKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCUlSZXNvdXJjZSByZXMgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJc3dpdGNoIChyZXMuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuUk9PVCA6Ci0JCQkJCXJldHVybiB0cnVlOyAgLy8gdmlzaXQgY2hpbGRyZW4KLQkJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKLQkJCQkJcmV0dXJuIHRydWU7ICAvLyB2aXNpdCBjaGlsZHJlbgotCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6Ci0JCQkJCXJldHVybiB0cnVlOyAgLy8gdmlzaXQgY2hpbGRyZW4KLQkJCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKLQkJCQkJZmlsZUNoYW5nZWQoKElGaWxlKSByZXMsIGRlbHRhLmdldEtpbmQoKSk7Ci0JCQkJCXJldHVybiBmYWxzZTsgIC8vIG5vIGNoaWxkcmVuCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBmYWxzZTsgIC8vIG5vIGNoaWxkcmVuIChwcm9iYWJseSBzaG91bGRuJ3QgZ2V0IGhlcmUuLi4pCi0JCQl9Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIGZpbGVDaGFuZ2VkKElGaWxlIGZpbGUsIGludCBkZWx0YUtpbmQpIHsKLQkJCWlmIChkZWx0YUtpbmQgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCUpheGJQcm9wZXJ0aWVzUmVzb3VyY2VNb2RlbFByb3ZpZGVyLnRoaXMucmVtb3ZlUmVzb3VyY2UoZmlsZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChkZWx0YUtpbmQgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgewotCQkJCUpheGJQcm9wZXJ0aWVzUmVzb3VyY2VNb2RlbFByb3ZpZGVyLnRoaXMudXBkYXRlUmVzb3VyY2UoZmlsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzlkMDQwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIERFRkFVTFRfUEFSTVMgPSBuZXcgU3RyaW5nWzBdOwotCXByaXZhdGUgc3RhdGljIFRleHRSYW5nZSBERUZBVUxUX1RFWFRfUkFOR0UgPSBUZXh0UmFuZ2UuRW1wdHkuaW5zdGFuY2UoKTsKLQotCi0JcHVibGljIHN0YXRpYyBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoaW50IGRlZmF1bHRTZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgSmF4Yk5vZGUgdGFyZ2V0T2JqZWN0KSB7Ci0JCXJldHVybiBidWlsZE1lc3NhZ2UoZGVmYXVsdFNldmVyaXR5LCBtZXNzYWdlSWQsIHRhcmdldE9iamVjdC5nZXRSZXNvdXJjZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElNZXNzYWdlIGJ1aWxkTWVzc2FnZShpbnQgZGVmYXVsdFNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBJUmVzb3VyY2UgdGFyZ2V0T2JqZWN0KSB7Ci0JCXJldHVybiBidWlsZE1lc3NhZ2UoZGVmYXVsdFNldmVyaXR5LCBtZXNzYWdlSWQsIERFRkFVTFRfUEFSTVMsIHRhcmdldE9iamVjdCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoaW50IGRlZmF1bHRTZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMsIEpheGJOb2RlIHRhcmdldE9iamVjdCkgewotCQlyZXR1cm4gYnVpbGRNZXNzYWdlKGRlZmF1bHRTZXZlcml0eSwgbWVzc2FnZUlkLCBwYXJtcywgdGFyZ2V0T2JqZWN0LmdldFJlc291cmNlKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSU1lc3NhZ2UgYnVpbGRNZXNzYWdlKGludCBkZWZhdWx0U2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBJUmVzb3VyY2UgdGFyZ2V0T2JqZWN0KSB7Ci0JCXJldHVybiBidWlsZE1lc3NhZ2UoZGVmYXVsdFNldmVyaXR5LCBtZXNzYWdlSWQsIHBhcm1zLCB0YXJnZXRPYmplY3QsIERFRkFVTFRfVEVYVF9SQU5HRSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoaW50IGRlZmF1bHRTZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgSmF4Yk5vZGUgdGFyZ2V0T2JqZWN0LCBUZXh0UmFuZ2UgdGV4dFJhbmdlKSB7Ci0JCXJldHVybiBidWlsZE1lc3NhZ2UoZGVmYXVsdFNldmVyaXR5LCBtZXNzYWdlSWQsIHRhcmdldE9iamVjdC5nZXRSZXNvdXJjZSgpLCB0ZXh0UmFuZ2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSU1lc3NhZ2UgYnVpbGRNZXNzYWdlKGludCBkZWZhdWx0U2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIElSZXNvdXJjZSB0YXJnZXRPYmplY3QsIFRleHRSYW5nZSB0ZXh0UmFuZ2UpIHsKLQkJcmV0dXJuIGJ1aWxkTWVzc2FnZShkZWZhdWx0U2V2ZXJpdHksIG1lc3NhZ2VJZCwgREVGQVVMVF9QQVJNUywgdGFyZ2V0T2JqZWN0LCB0ZXh0UmFuZ2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSU1lc3NhZ2UgYnVpbGRNZXNzYWdlKGludCBkZWZhdWx0U2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBKYXhiTm9kZSB0YXJnZXRPYmplY3QsIFRleHRSYW5nZSB0ZXh0UmFuZ2UpIHsKLQkJcmV0dXJuIGJ1aWxkTWVzc2FnZShkZWZhdWx0U2V2ZXJpdHksIG1lc3NhZ2VJZCwgcGFybXMsIHRhcmdldE9iamVjdC5nZXRSZXNvdXJjZSgpLCB0ZXh0UmFuZ2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSU1lc3NhZ2UgYnVpbGRNZXNzYWdlKGludCBkZWZhdWx0U2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBJUmVzb3VyY2UgdGFyZ2V0T2JqZWN0LCBUZXh0UmFuZ2UgdGV4dFJhbmdlKSB7Ci0JCXJldHVybiBidWlsZE1lc3NhZ2UoZGVmYXVsdFNldmVyaXR5LCBtZXNzYWdlSWQsIHBhcm1zLCB0YXJnZXRPYmplY3QsIHRleHRSYW5nZSwgTUVTU0FHRV9GQUNUT1JZKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElNZXNzYWdlIGJ1aWxkTWVzc2FnZShpbnQgZGVmYXVsdFNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcywgSVJlc291cmNlIHRhcmdldE9iamVjdCwgVGV4dFJhbmdlIHRleHRSYW5nZSwgTWVzc2FnZUZhY3RvcnkgbWVzc2FnZUZhY3RvcnkpIHsKLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG1lc3NhZ2VGYWN0b3J5LmJ1aWxkTWVzc2FnZShkZWZhdWx0U2V2ZXJpdHksIG1lc3NhZ2VJZCwgcGFybXMsIHRhcmdldE9iamVjdCk7Ci0JCW1lc3NhZ2Uuc2V0TWFya2VySWQoSnB0SmF4YkNvcmVQbHVnaW4uVkFMSURBVElPTl9NQVJLRVJfSUQpOwotCQlpZiAodGV4dFJhbmdlID09IG51bGwpIHsKLQkJCXRleHRSYW5nZSA9IERFRkFVTFRfVEVYVF9SQU5HRTsKLQkJCS8vIGxvZyB0aGUgZXhjZXB0aW9uIGJ1dCBhbGxvdyB0aGUgbWVzc2FnZSB0byBzdGlsbCBiZSB1c2VkCi0JCQlKcHRKYXhiQ29yZVBsdWdpbi5sb2cobmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJOdWxsIHRleHQgcmFuZ2UgZm9yIG1lc3NhZ2UgSUQ6ICIgKyBtZXNzYWdlSWQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWludCBsaW5lTnVtYmVyID0gdGV4dFJhbmdlLmdldExpbmVOdW1iZXIoKTsKLQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU51bWJlcik7Ci0JCWlmIChsaW5lTnVtYmVyID09IElNZXNzYWdlLkxJTkVOT19VTlNFVCkgewotCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MT0NBVElPTiwgIiAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCW1lc3NhZ2Uuc2V0T2Zmc2V0KHRleHRSYW5nZS5nZXRPZmZzZXQoKSk7Ci0JCW1lc3NhZ2Uuc2V0TGVuZ3RoKHRleHRSYW5nZS5nZXRMZW5ndGgoKSk7Ci0JCXJldHVybiBtZXNzYWdlOwotCX0KLQotCi0JcHJpdmF0ZSBEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVzc2FnZSBmYWN0b3J5ICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsbG93IGNsaWVudHMgdG8gc3BlY2lmeSBhIG1lc3NhZ2UgZmFjdG9yeSBzbyB0aGUgbWVzc2FnZSBjYW4gbG9hZCB0aGUKLQkgKiBhcHByb3ByaWF0ZSByZXNvdXJjZSBidW5kbGUuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBNZXNzYWdlRmFjdG9yeSB7Ci0JCUlNZXNzYWdlIGJ1aWxkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBJUmVzb3VyY2UgdGFyZ2V0T2JqZWN0KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXNzYWdlRmFjdG9yeSBNRVNTQUdFX0ZBQ1RPUlkgPSBuZXcgR2VuZXJpY01lc3NhZ2VGYWN0b3J5KCk7Ci0KLQkvKiBDVSBwcml2YXRlICovIHN0YXRpYyBjbGFzcyBHZW5lcmljTWVzc2FnZUZhY3RvcnkKLQkJaW1wbGVtZW50cyBNZXNzYWdlRmFjdG9yeQotCXsKLQkJcHVibGljIElNZXNzYWdlIGJ1aWxkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBJUmVzb3VyY2UgdGFyZ2V0T2JqZWN0KSB7Ci0JCQkvLyBUT0RPIGNoZWNrIGZvciBwcmVmZXJlbmNlIG92ZXJyaWRlCi0vLwkJCWludCBwcmVmU2V2ZXJpdHkgPSBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuZ2V0UHJvYmxlbVNldmVyaXR5UHJlZmVyZW5jZSh0YXJnZXRPYmplY3QsIG1lc3NhZ2VJZCk7Ci0vLwkJCWlmIChwcmVmU2V2ZXJpdHkgIT0gSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLk5PX1NFVkVSSVRZX1BSRUZFUkVOQ0UpewotLy8JCQkJc2V2ZXJpdHkgPSBwcmVmU2V2ZXJpdHk7Ci0vLwkJCX0KLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZShKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLkJVTkRMRV9OQU1FLCBzZXZlcml0eSwgbWVzc2FnZUlkLCBwYXJtcywgdGFyZ2V0T2JqZWN0KTsKLQkJCW1lc3NhZ2Uuc2V0TWFya2VySWQoSnB0SmF4YkNvcmVQbHVnaW4uVkFMSURBVElPTl9NQVJLRVJfSUQpOwotCQkJcmV0dXJuIG1lc3NhZ2U7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YTA4MTYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzIHsKLQkKLQkvLyBidW5kbGUgbmFtZQotCVN0cmluZyBCVU5ETEVfTkFNRSA9ICJqYXhiX3ZhbGlkYXRpb24iOwotCQotCS8vIHZhbGlkYXRpb24gb24gcHJvamVjdAotCQotCVN0cmluZyBOT19KQVhCX1BST0pFQ1QgPSAiTk9fSkFYQl9QUk9KRUNUIjsgCi0JU3RyaW5nIFBST0pFQ1RfSU5WQUxJRF9MSUJSQVJZX1BST1ZJREVSID0gIlBST0pFQ1RfSU5WQUxJRF9MSUJSQVJZX1BST1ZJREVSIjsKLQlTdHJpbmcgUFJPSkVDVF9fVU5SRVNPTFZFRF9TQ0hFTUEgPSAiUFJPSkVDVF9fVU5SRVNPTFZFRF9TQ0hFTUEiOwotCVN0cmluZyBQUk9KRUNUX19EVVBMSUNBVEVfTkFNRVNQQUNFID0gIlBST0pFQ1RfX0RVUExJQ0FURV9OQU1FU1BBQ0UiOwotCQotCQotCS8vIHZhbGlkYXRpb24gb24gcGFja2FnZQotCQotCVN0cmluZyBQQUNLQUdFX05PX1NDSEVNQV9GT1JfTkFNRVNQQUNFID0gIlBBQ0tBR0VfTk9fU0NIRU1BX0ZPUl9OQU1FU1BBQ0UiOwotCVN0cmluZyBQQUNLQUdFX1hNTF9KQVZBX1RZUEVfQURBUFRFUl9UWVBFX05PVF9TUEVDSUZJRUQgPSAiUEFDS0FHRV9YTUxfSkFWQV9UWVBFX0FEQVBURVJfVFlQRV9OT1RfU1BFQ0lGSUVEIjsKLQkKLQlTdHJpbmcgWE1MX1NDSEVNQV9fTUlTTUFUQ0hFRF9BVFRSSUJVVEVfRk9STV9ERUZBVUxUID0gIlhNTF9TQ0hFTUFfX01JU01BVENIRURfQVRUUklCVVRFX0ZPUk1fREVGQVVMVCI7Ci0JU3RyaW5nIFhNTF9TQ0hFTUFfX01JU01BVENIRURfRUxFTUVOVF9GT1JNX0RFRkFVTFQgPSAiWE1MX1NDSEVNQV9fTUlTTUFUQ0hFRF9FTEVNRU5UX0ZPUk1fREVGQVVMVCI7Ci0JCi0JCi0JLy8gdmFsaWRhdGlvbiBvbiB0eXBlCi0JCi0JU3RyaW5nIFhNTF9FTlVNX19OT05fU0lNUExFX1NDSEVNQV9UWVBFID0gIlhNTF9FTlVNX19OT05fU0lNUExFX1NDSEVNQV9UWVBFIjsKLQkKLQlTdHJpbmcgWE1MX1RZUEVfX1VOTUFUQ0hJTkdfTkFNRVNQQUNFX0ZPUl9BTk9OWU1PVVNfVFlQRSA9ICJYTUxfVFlQRV9fVU5NQVRDSElOR19OQU1FU1BBQ0VfRk9SX0FOT05ZTU9VU19UWVBFIjsKLQlTdHJpbmcgWE1MX1RZUEVfX1VOU1BFQ0lGSUVEX0ZBQ1RPUllfTUVUSE9EID0gIlhNTF9UWVBFX19VTlNQRUNJRklFRF9GQUNUT1JZX01FVEhPRCI7Ci0JU3RyaW5nIFhNTF9UWVBFX19OT19QVUJMSUNfT1JfUFJPVEVDVEVEX0NPTlNUUlVDVE9SID0gIlhNTF9UWVBFX19OT19QVUJMSUNfT1JfUFJPVEVDVEVEX0NPTlNUUlVDVE9SIjsKLQlTdHJpbmcgWE1MX1RZUEVfX0RVUExJQ0FURV9QUk9QID0gIlhNTF9UWVBFX19EVVBMSUNBVEVfUFJPUCI7Ci0JU3RyaW5nIFhNTF9UWVBFX19NSVNTSU5HX1BST1AgPSAiWE1MX1RZUEVfX01JU1NJTkdfUFJPUCI7Ci0JU3RyaW5nIFhNTF9UWVBFX19OT05FWElTVEVOVF9QUk9QID0gIlhNTF9UWVBFX19OT05FWElTVEVOVF9QUk9QIjsKLQlTdHJpbmcgWE1MX1RZUEVfX1RSQU5TSUVOVF9QUk9QID0gIlhNTF9UWVBFX19UUkFOU0lFTlRfUFJPUCI7Ci0JU3RyaW5nIFhNTF9UWVBFX19GQUNUT1JZX0NMQVNTX0lHTk9SRURfRk9SX0VOVU0gPSAiWE1MX1RZUEVfX0ZBQ1RPUllfQ0xBU1NfSUdOT1JFRF9GT1JfRU5VTSI7Ci0JU3RyaW5nIFhNTF9UWVBFX19GQUNUT1JZX01FVEhPRF9JR05PUkVEX0ZPUl9FTlVNID0gIlhNTF9UWVBFX19GQUNUT1JZX01FVEhPRF9JR05PUkVEX0ZPUl9FTlVNIjsKLQlTdHJpbmcgWE1MX1RZUEVfX1BST1BfT1JERVJfSUdOT1JFRF9GT1JfRU5VTSA9ICJYTUxfVFlQRV9fUFJPUF9PUkRFUl9JR05PUkVEX0ZPUl9FTlVNIjsKLQkKLQlTdHJpbmcgWE1MX1JPT1RfRUxFTUVOVF9UWVBFX0NPTkZMSUNUU19XSVRIX1hNTF9UWVBFID0gIlhNTF9ST09UX0VMRU1FTlRfVFlQRV9DT05GTElDVFNfV0lUSF9YTUxfVFlQRSI7Ci0JCi0JCi0JLy8gdmFsaWRhdGlvbiBvbiBlbnVtIGNvbnN0YW50IAotCQotCVN0cmluZyBYTUxfRU5VTV9WQUxVRV9fSU5WQUxJRF9MRVhJQ0FMX1ZBTFVFID0gIlhNTF9FTlVNX1ZBTFVFX19JTlZBTElEX0xFWElDQUxfVkFMVUUiOwotCQotCQotCS8vIHZhbGlkYXRpb24gb24gYXR0cmlidXRlCi0JCi0JU3RyaW5nIEFUVFJJQlVURV9NQVBQSU5HX19VTlNVUFBPUlRFRF9BTk5PVEFUSU9OID0gIkFUVFJJQlVURV9NQVBQSU5HX19VTlNVUFBPUlRFRF9BTk5PVEFUSU9OIjsKLQlTdHJpbmcgQVRUUklCVVRFX01BUFBJTkdfWE1MX0pBVkFfVFlQRV9BREFQVEVSX1RZUEVfTk9UX0RFRklORUQgPSAiQVRUUklCVVRFX01BUFBJTkdfWE1MX0pBVkFfVFlQRV9BREFQVEVSX1RZUEVfTk9UX0RFRklORUQiOwotCVN0cmluZyBYTUxfRUxFTUVOVF9XUkFQUEVSX0RFRklORURfT05fTk9OX0FSUkFZX05PTl9DT0xMRUNUSU9OID0gIlhNTF9FTEVNRU5UX1dSQVBQRVJfREVGSU5FRF9PTl9OT05fQVJSQVlfTk9OX0NPTExFQ1RJT04iOwotCQotCVN0cmluZyBYTUxfQU5ZX0FUVFJJQlVURV9fTVVMVElQTEVfTUFQUElOR1NfREVGSU5FRCA9ICJYTUxfQU5ZX0FUVFJJQlVURV9fTVVMVElQTEVfTUFQUElOR1NfREVGSU5FRCI7Ci0JU3RyaW5nIFhNTF9BTllfQVRUUklCVVRFX19OT05fTUFQX1RZUEUgPSAiWE1MX0FOWV9BVFRSSUJVVEVfX05PTl9NQVBfVFlQRSI7Ci0JCi0JU3RyaW5nIFhNTF9BTllfRUxFTUVOVF9fTVVMVElQTEVfTUFQUElOR1NfREVGSU5FRCA9ICJYTUxfQU5ZX0VMRU1FTlRfX01VTFRJUExFX01BUFBJTkdTX0RFRklORUQiOwotCQotCVN0cmluZyBYTUxfQVRUUklCVVRFX19JTlZBTElEX1NDSEVNQV9UWVBFID0gIlhNTF9BVFRSSUJVVEVfX0lOVkFMSURfU0NIRU1BX1RZUEUiOwotCQotCVN0cmluZyBYTUxfRUxFTUVOVF9fVU5TUEVDSUZJRURfVFlQRSA9ICJYTUxfRUxFTUVOVF9fVU5TUEVDSUZJRURfVFlQRSI7Ci0JU3RyaW5nIFhNTF9FTEVNRU5UX19JTExFR0FMX1RZUEUgPSAiWE1MX0VMRU1FTlRfX0lMTEVHQUxfVFlQRSI7Ci0JU3RyaW5nIFhNTF9FTEVNRU5UX19JTlZBTElEX1NDSEVNQV9UWVBFID0gIlhNTF9FTEVNRU5UX19JTlZBTElEX1NDSEVNQV9UWVBFIjsKLQkKLQlTdHJpbmcgWE1MX0VMRU1FTlRfREVDTF9fSU5WQUxJRF9NRVRIT0RfU0lHTkFUVVJFX1JFVFVSTl9UWVBFID0gIlhNTF9FTEVNRU5UX0RFQ0xfX0lOVkFMSURfTUVUSE9EX1NJR05BVFVSRV9SRVRVUk5fVFlQRSI7Ci0JU3RyaW5nIFhNTF9FTEVNRU5UX0RFQ0xfX0lOVkFMSURfTUVUSE9EX1NJR05BVFVSRV9QQVJBTSA9ICJYTUxfRUxFTUVOVF9ERUNMX19JTlZBTElEX01FVEhPRF9TSUdOQVRVUkVfUEFSQU0iOwotCVN0cmluZyBYTUxfRUxFTUVOVF9ERUNMX19TVUJTVF9IRUFEX05BTUVfRVFVQUxTX05BTUUgPSAiWE1MX0VMRU1FTlRfREVDTF9fU1VCU1RfSEVBRF9OQU1FX0VRVUFMU19OQU1FIjsKLQlTdHJpbmcgWE1MX0VMRU1FTlRfREVDTF9fU1VCU1RfSEVBRF9OT19NQVRDSElOR19FTEVNRU5UX0RFQ0wgPSAiWE1MX0VMRU1FTlRfREVDTF9fU1VCU1RfSEVBRF9OT19NQVRDSElOR19FTEVNRU5UX0RFQ0wiOwotCQotCVN0cmluZyBYTUxfRUxFTUVOVF9SRUZfX1VOU1BFQ0lGSUVEX1RZUEUgPSAiWE1MX0VMRU1FTlRfUkVGX19VTlNQRUNJRklFRF9UWVBFIjsKLQlTdHJpbmcgWE1MX0VMRU1FTlRfUkVGX19JTExFR0FMX1RZUEUgPSAiWE1MX0VMRU1FTlRfUkVGX19JTExFR0FMX1RZUEUiOwotCVN0cmluZyBYTUxfRUxFTUVOVF9SRUZfX05PX1JPT1RfRUxFTUVOVCA9ICJYTUxfRUxFTUVOVF9SRUZfX05PX1JPT1RfRUxFTUVOVCI7Ci0JU3RyaW5nIFhNTF9FTEVNRU5UX1JFRl9fTk9fUkVHSVNUUlkgPSAiWE1MX0VMRU1FTlRfUkVGX19OT19SRUdJU1RSWSI7Ci0JU3RyaW5nIFhNTF9FTEVNRU5UX1JFRl9fTk9fTUFUQ0hJTkdfRUxFTUVOVF9ERUNMID0gIlhNTF9FTEVNRU5UX1JFRl9fTk9fTUFUQ0hJTkdfRUxFTUVOVF9ERUNMIjsKLQkKLQlTdHJpbmcgWE1MX0VMRU1FTlRfUkVGU19fRFVQTElDQVRFX1hNTF9FTEVNRU5UX1RZUEUgPSAiWE1MX0VMRU1FTlRfUkVGU19fRFVQTElDQVRFX1hNTF9FTEVNRU5UX1RZUEUiOwotCVN0cmluZyBYTUxfRUxFTUVOVF9SRUZTX19EVVBMSUNBVEVfWE1MX0VMRU1FTlRfUU5BTUUgPSAiWE1MX0VMRU1FTlRfUkVGU19fRFVQTElDQVRFX1hNTF9FTEVNRU5UX1FOQU1FIjsKLQkKLQlTdHJpbmcgWE1MX0VMRU1FTlRTX19EVVBMSUNBVEVfWE1MX0VMRU1FTlRfVFlQRSA9ICJYTUxfRUxFTUVOVFNfX0RVUExJQ0FURV9YTUxfRUxFTUVOVF9UWVBFIjsKLQlTdHJpbmcgWE1MX0VMRU1FTlRTX19EVVBMSUNBVEVfWE1MX0VMRU1FTlRfUU5BTUUgPSAiWE1MX0VMRU1FTlRTX19EVVBMSUNBVEVfWE1MX0VMRU1FTlRfUU5BTUUiOwotCQotCVN0cmluZyBYTUxfSURfX01VTFRJUExFX01BUFBJTkdTX0RFRklORUQgPSAiWE1MX0lEX19NVUxUSVBMRV9NQVBQSU5HU19ERUZJTkVEIjsKLQlTdHJpbmcgWE1MX0lEX19BVFRSSUJVVEVfVFlQRV9OT1RfU1RSSU5HID0gIlhNTF9JRF9fQVRUUklCVVRFX1RZUEVfTk9UX1NUUklORyI7Ci0JU3RyaW5nIFhNTF9JRF9fU0NIRU1BX1RZUEVfTk9UX0lEID0gIlhNTF9JRF9fU0NIRU1BX1RZUEVfTk9UX0lEIjsKLQkKLQlTdHJpbmcgWE1MX0lEX1JFRl9fVFlQRV9ET0VTX05PVF9DT05UQUlOX1hNTF9JRCA9ICJYTUxfSURfUkVGX19UWVBFX0RPRVNfTk9UX0NPTlRBSU5fWE1MX0lEIjsKLQlTdHJpbmcgWE1MX0lEX1JFRl9fU0NIRU1BX1RZUEVfTk9UX0lEUkVGID0gIlhNTF9JRF9SRUZfX1NDSEVNQV9UWVBFX05PVF9JRFJFRiI7Ci0JCi0JU3RyaW5nIFhNTF9MSVNUX19BVFRSSUJVVEVfTk9UX0NPTExFQ1RJT05fVFlQRSA9ICJYTUxfTElTVF9fQVRUUklCVVRFX05PVF9DT0xMRUNUSU9OX1RZUEUiOwotCVN0cmluZyBYTUxfTElTVF9fSVRFTV9UWVBFX05PVF9NQVBQRURfVE9fVkFMSURfU0NIRU1BX1RZUEUgPSAiWE1MX0xJU1RfX0lURU1fVFlQRV9OT1RfTUFQUEVEX1RPX1ZBTElEX1NDSEVNQV9UWVBFIjsKLQkKLQlTdHJpbmcgWE1MX1JFR0lTVFJZX19NVUxUSVBMRV9YTUxfUkVHSVNUUklFU19GT1JfUEFDS0FHRSA9ICJYTUxfUkVHSVNUUllfX01VTFRJUExFX1hNTF9SRUdJU1RSSUVTX0ZPUl9QQUNLQUdFIjsKLQlTdHJpbmcgWE1MX1JFR0lTVFJZX19EVVBMSUNBVEVfWE1MX0VMRU1FTlRfUU5BTUUgPSAiWE1MX1JFR0lTVFJZX19EVVBMSUNBVEVfWE1MX0VMRU1FTlRfUU5BTUUiOwotCQotCVN0cmluZyBYTUxfVkFMVUVfX01VTFRJUExFX01BUFBJTkdTX0RFRklORUQgPSAiWE1MX1ZBTFVFX19NVUxUSVBMRV9NQVBQSU5HU19ERUZJTkVEIjsKLQlTdHJpbmcgWE1MX1ZBTFVFX19OT19URVhUX0NPTlRFTlQgPSAiWE1MX1ZBTFVFX19OT19URVhUX0NPTlRFTlQiOwotCVN0cmluZyBYTUxfVkFMVUVfX0lOVkFMSURfU0NIRU1BX1RZUEUgPSAiWE1MX1ZBTFVFX19JTlZBTElEX1NDSEVNQV9UWVBFIjsKLQkKLQlTdHJpbmcgWE1MX1ZBTFVFX01BUFBJTkdfV0lUSF9OT05fWE1MX0FUVFJJQlVURV9NQVBQSU5HX0RFRklORUQgPSAiWE1MX1ZBTFVFX01BUFBJTkdfV0lUSF9OT05fWE1MX0FUVFJJQlVURV9NQVBQSU5HX0RFRklORUQiOwotCQotCQotCS8vIGdlbmVyYWwgdmFsaWRhdGlvbgotCQotCVN0cmluZyBYTUxfU0NIRU1BX1RZUEVfX05PTl9TSU1QTEVfVFlQRSA9ICJYTUxfU0NIRU1BX1RZUEVfX05PTl9TSU1QTEVfVFlQRSI7Ci0JU3RyaW5nIFhNTF9TQ0hFTUFfVFlQRV9fVFlQRV9OT1RfU1BFQ0lGSUVEX09OX1BBQ0tBR0UgPSAiWE1MX1NDSEVNQV9UWVBFX19UWVBFX05PVF9TUEVDSUZJRURfT05fUEFDS0FHRSI7Ci0JU3RyaW5nIFhNTF9TQ0hFTUFfVFlQRV9fVFlQRV9TUEVDSUZJRURfT05fQVRUUklCVVRFID0gIlhNTF9TQ0hFTUFfVFlQRV9fVFlQRV9TUEVDSUZJRURfT05fQVRUUklCVVRFIjsKLQkKLQlTdHJpbmcgUU5BTUVfX01JU1NJTkdfTkFNRSA9ICJRTkFNRV9fTUlTU0lOR19OQU1FIjsKLQlTdHJpbmcgUU5BTUVfX1VOUkVTT0xWRURfQ09NUE9ORU5UID0gIlFOQU1FX19VTlJFU09MVkVEX0NPTVBPTkVOVCI7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pheGJWYWxpZGF0b3IuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSmF4YlZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWU2NWQzLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSmF4YlZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHJlZmVyZW5jZWQgaW4gdGhlIEpBWEIgZXh0ZW5zaW9uIGZvciB0aGUKLSAqIFdUUCB2YWxpZGF0b3IgZXh0ZW5zaW9uIHBvaW50LgotICovCi1wdWJsaWMgY2xhc3MgSmF4YlZhbGlkYXRvcgotCQlleHRlbmRzIEFic3RyYWN0VmFsaWRhdG9yCi0JCWltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0KLQlwdWJsaWMgSmF4YlZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSVZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXRoaXMudmFsaWRhdGUocmVwb3J0ZXIsICgoSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dCkgY29udGV4dCkuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0KLQkvLyAqKioqKioqKioqIEFic3RyYWN0VmFsaWRhdG9yIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVZhbGlkYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25SZXN1bHQoKTsKLQkJSVJlcG9ydGVyIHJlcG9ydGVyID0gcmVzdWx0LmdldFJlcG9ydGVyKG1vbml0b3IpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQl0aGlzLmNsZWFyTWFya2Vycyhwcm9qZWN0KTsKLQkJcmVzdWx0LnNldFN1c3BlbmRWYWxpZGF0aW9uKHByb2plY3QpOwotCQl0aGlzLnZhbGlkYXRlKHJlcG9ydGVyLCBwcm9qZWN0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyTWFya2VycyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmNsZWFyTWFya2Vyc18ocHJvamVjdCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCUpwdEpheGJDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJNYXJrZXJzXyhJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlNYXJrZXJbXSBtYXJrZXJzID0gcHJvamVjdC5maW5kTWFya2VycyhKcHRKYXhiQ29yZVBsdWdpbi5WQUxJREFUSU9OX01BUktFUl9JRCwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJZm9yIChJTWFya2VyIG1hcmtlciA6IG1hcmtlcnMpIHsKLQkJCW1hcmtlci5kZWxldGUoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZShJUmVwb3J0ZXIgcmVwb3J0ZXIsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJZm9yIChJTWVzc2FnZSBtZXNzYWdlIDogdGhpcy5idWlsZFZhbGlkYXRpb25NZXNzYWdlcyhyZXBvcnRlciwgcHJvamVjdCkpIHsKLQkJCS8vIFRPRE8gY2hlY2sgcHJlZmVyZW5jZXMgZm9yIElHTk9SRQotLy8JCQlpZiAoSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLnByb2JsZW1Jc05vdElnbm9yZWQocHJvamVjdCwgbWVzc2FnZS5nZXRJZCgpKSkgewotCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0vLwkJCX0KLQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxJTWVzc2FnZT4gYnVpbGRWYWxpZGF0aW9uTWVzc2FnZXMoSVJlcG9ydGVyIHJlcG9ydGVyLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUpheGJQcm9qZWN0IGpheGJQcm9qZWN0ID0gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0SmF4YlByb2plY3QocHJvamVjdCk7Ci0JCWlmIChqYXhiUHJvamVjdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gamF4YlByb2plY3QuZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKHJlcG9ydGVyKTsKLQkJfQotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxJTWVzc2FnZT4oCi0JCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5OT19KQVhCX1BST0pFQ1QsCi0JCQkJCQlwcm9qZWN0KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvbGlicHJvdi9KYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvbGlicHJvdi9KYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzkwZmNhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2xpYnByb3YvSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5saWJwcm92OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnByb3YuSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgCi0JCWV4dGVuZHMgSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9KQVhCX1BMQVRGT1JNID0gIkpBWEJfUExBVEZPUk0iOyAvLyROT04tTkxTLTEkCi0JCi0JSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0SmF4YlBsYXRmb3JtKCk7Ci0JCi0Jdm9pZCBzZXRKYXhiUGxhdGZvcm0oSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gamF4YlBsYXRmb3JtKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3BsYXRmb3JtL0pheGJQbGF0Zm9ybS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcGxhdGZvcm0vSmF4YlBsYXRmb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZDg4NWEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcGxhdGZvcm0vSmF4YlBsYXRmb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YlBsYXRmb3JtIHsKLQkKLQlKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXREZXNjcmlwdGlvbigpOwotCQotCUpheGJQbGF0Zm9ybURlZmluaXRpb24gZ2V0RGVmaW5pdGlvbigpOwotCQotCQotCS8vICoqKioqKioqKiogZmFjdG9yeSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBmYWN0b3J5IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBjb3JlIChlLmcuIEpheGJQcm9qZWN0KSwgcmVzb3VyY2UKLQkgKiAoZS5nLiBQZXJzaXN0ZW5jZVJlc291cmNlKSwgYW5kIGNvbnRleHQgKGUuZy4gUGVyc2lzdGVuY2VVbml0KSBtb2RlbAotCSAqIG9iamVjdHMKLQkgKi8KLQlKYXhiRmFjdG9yeSBnZXRGYWN0b3J5KCk7Ci0KLQotCS8vICoqKioqKioqKiogSkFYQiBmaWxlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBKQVhCIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgZmlsZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZmlsZSdzIGNvbnRlbnQgaXMgdW5zdXBwb3J0ZWQuCi0JICovCi0JSmF4YkZpbGUgYnVpbGRKYXhiRmlsZShKYXhiUHJvamVjdCBqYXhiUHJvamVjdCwgSUZpbGUgZmlsZSk7Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBhbm5vdGF0aW9ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYW5ub3RhdGlvbiBwcm92aWRlciByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgd2hhdCBKYXZhCi0JICogYW5ub3RhdGlvbnMgYXJlIHN1cHBvcnRlZCBhbmQgY29uc3RydWN0aW5nIGphdmEgcmVzb3VyY2UgbW9kZWwgb2JqZWN0cy4KLQkgKi8KLQlBbm5vdGF0aW9uUHJvdmlkZXIgZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmb3JtYXR0ZXIgdGhhdCBjYW4gY2xlYW4gdXAgdGhlIEphdmEgYW5ub3RhdGlvbnMgYWRkZWQgdG8gc291cmNlCi0JICogY29kZS4KLQkgKi8KLQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBnZXRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpOwotCi0KLQkvLyAqKioqKioqKioqIEphdmEgYXR0cmlidXRlIG1hcHBpbmdzICoqKioqKioqKioKLQotCUl0ZXJhYmxlPEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZ2V0U3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpOwotCi0JSXRlcmFibGU8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZ2V0RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIHtAbGluayBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb259IHRoYXQgZGVzY3JpYmVzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgYXR0cmlidXRlCi0JICogYXMgaXQgZXhpc3RzLCBjb21wbGV0ZSB3aXRoIGFubm90YXRpb25zLiAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBhdHRyaWJ1dGUncyBkZWZhdWx0IG1hcHBpbmcKLQkgKiBoYXMgYWxyZWFkeSBiZWVuIGRldGVybWluZWQuCi0JICogVGhpcyBtYXkgbm90IGJlIG51bGwgKEBzZWUge0BsaW5rIE51bGxTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb259LCkgZWxzZQotCSAqIGFuIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IGlzIHRocm93bi4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0cmlidXRlIFRoZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSB0byBhbmFseXplCi0JICogQHJldHVybiBUaGUgbWFwcGluZyBkZWZpbml0aW9uIGRlc2NyaWJpbmcgdGhlIGFubm90YXRlZCBzdGF0ZSBvZiB0aGUgYXR0cmlidXRlCi0JICovCi0JSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbihKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUpOwotCi0JLyoqCi0JICogUmV0dXJuIGEge0BsaW5rIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbn0gZm9yIHRoZSBnaXZlbiBtYXBwaW5nIGtleS4KLQkgKiBUaHJvdyBhbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBpZiB0aGUga2V5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtLgotCSAqLwotCUphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24oU3RyaW5nIG1hcHBpbmdLZXkpOwotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYWU3ZGMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcGxhdGZvcm0vSmF4YlBsYXRmb3JtRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YlJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIHsKLQkKLQlKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXREZXNjcmlwdGlvbigpOwotCQotCS8vICoqKioqIHBsYXRmb3JtLXkgcXVlc3Rpb25zICoqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBidWlsdCBpbiBzY2hlbWEgdHlwZSBuYW1lIG1hcHBlZCBieSB0aGUgZ2l2ZW4gKGZ1bGx5IHF1YWxpZmllZCkgamF2YSB0eXBlIG5hbWUKLQkgKi8KLQlTdHJpbmcgZ2V0U2NoZW1hVHlwZU1hcHBpbmcoU3RyaW5nIGphdmFUeXBlTmFtZSk7Ci0JCi0JCi0JSmF4YkZhY3RvcnkgZ2V0RmFjdG9yeSgpOwotCQotCUFubm90YXRpb25EZWZpbml0aW9uW10gZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25zKCk7Ci0KLQlOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uW10gZ2V0TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIG1vZGVsIHByb3ZpZGVycyB0aGF0IGFwcGx5IHRvIHRoaXMgcGxhdGZvcm0uCi0JICovCi0JTGlzdEl0ZXJhYmxlPEpheGJSZXNvdXJjZU1vZGVsUHJvdmlkZXI+IGdldFJlc291cmNlTW9kZWxQcm92aWRlcnMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1vc3QgcmVjZW50IHJlc291cmNlIHR5cGUgZm9yIHRoZSBnaXZlbiBjb250ZW50IHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgcGxhdGZvcm0KLQkgKi8KLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKTsKLQkKLS8vCS8qKgotLy8JICogUmV0dXJuIHRoZSByZXNvdXJjZSBkZWZpbml0aW9ucyBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybS4KLS8vCSAqLwotLy8JTGlzdEl0ZXJhdG9yPFJlc291cmNlRGVmaW5pdGlvbj4gcmVzb3VyY2VEZWZpbml0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXBwaW5nIGRlZmluaXRpb25zIHRvIHVzZSBmb3IgZGVmYXVsdCBqYXZhIGF0dHJpYnV0ZSBtYXBwaW5ncyBmb3IgdGhpcyBwbGF0Zm9ybS4KLQkgKi8KLQlJdGVyYWJsZTxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBnZXREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXBwaW5nIGRlZmluaXRpb25zIHRvIHVzZSBmb3Igc3BlY2lmaWVkIGphdmEgYXR0cmlidXRlIG1hcHBpbmdzIGZvciB0aGlzIHBsYXRmb3JtLgotCSAqLwotCUl0ZXJhYmxlPEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZ2V0U3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcGxhdGZvcm0vSmF4YlBsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3BsYXRmb3JtL0pheGJQbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNzE2MWEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcGxhdGZvcm0vSmF4YlBsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB0byBiZSBpbXBsZW1lbnRlZCBieSBhIEpBWEIgdmVuZG9yIHRvIGJ1aWxkIGEKLSAqIHtAbGluayBKYXhiUGxhdGZvcm1EZWZpbml0aW9ufS4KLSAqIDxwPgotICogU2VlIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmpheGJQbGF0Zm9ybXM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpheGJQbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5IHsKLQkKLQlKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGJ1aWxkSmF4YlBsYXRmb3JtRGVmaW5pdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcGxhdGZvcm0vSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3BsYXRmb3JtL0pheGJQbGF0Zm9ybURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZmM1ZTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcGxhdGZvcm0vSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIENvbnRhaW5zIG1ldGFkYXRhIHRoYXQgZGVzY3JpYmVzIGEgSkFYQiBwbGF0Zm9ybS4gIE5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gewotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCk7Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUNsYXNzTmFtZSgpOwotCQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzSmF4YkZhY2V0VmVyc2lvbihJUHJvamVjdEZhY2V0VmVyc2lvbiBqcGFGYWNldFZlcnNpb24pOwotCQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpOwotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uIGdldEdyb3VwKCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwN2MxMjAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcGxhdGZvcm0vSmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtOwotCi0vKioKLSAqIENvbnRhaW5zIG1ldGFkYXRhIHRoYXQgZGVzY3JpYmVzIGEgSkFYQiBwbGF0Zm9ybSBncm91cC4gIE5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbiB7Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKTsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCk7Ci0JCi0JcHVibGljIEl0ZXJhYmxlPEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uPiBnZXRQbGF0Zm9ybXMoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3BsYXRmb3JtL0pheGJQbGF0Zm9ybU1hbmFnZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3BsYXRmb3JtL0pheGJQbGF0Zm9ybU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRjYTMwNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBFbnRyeSBwb2ludCB0byB0aGUgImpheGJQbGF0Zm9ybXMiIGV4dGVuc2lvbiBwb2ludAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YlBsYXRmb3JtTWFuYWdlciB7Ci0JCi0JSXRlcmFibGU8SmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbj4gZ2V0SmF4YlBsYXRmb3JtR3JvdXBzKCk7Ci0JCi0JSmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbiBnZXRKYXhiUGxhdGZvcm1Hcm91cChTdHJpbmcgZ3JvdXBJZCk7Ci0JCi0JSXRlcmFibGU8SmF4YlBsYXRmb3JtRGVzY3JpcHRpb24+IGdldEpheGJQbGF0Zm9ybXMoKTsKLQkKLQlKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXRKYXhiUGxhdGZvcm0oU3RyaW5nIHBsYXRmb3JtSWQpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IEpBWEIgcGxhdGZvcm0gcmVnaXN0ZXJlZCBhcyBhIGRlZmF1bHQgcGxhdGZvcm0gYW5kIHdoaWNoIHN1cHBvcnRzIHRoZSBnaXZlbiAKLQkgKiBKQVhCIGZhY2V0IHZlcnNpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZXJlIGFyZSBubyBzdWNoIHJlZ2lzdGVyZWQgcGxhdGZvcm1zLgotCSAqLwotCUpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGdldERlZmF1bHRKYXhiUGxhdGZvcm0oSVByb2plY3RGYWNldFZlcnNpb24gamF4YkZhY2V0VmVyc2lvbik7Ci0JCi0JSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBidWlsZEpheGJQbGF0Zm9ybURlZmluaXRpb24oSVByb2plY3QgcHJvamVjdCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL0pBWEIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvSkFYQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGI5MTUwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvSkFYQi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIEpBWEIgSmF2YS1yZWxhdGVkIHN0dWZmIChhbm5vdGF0aW9ucyBldGMuKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBKQVhCIHsKLQotCS8vIEpBWEIgcGFja2FnZXMKLQkKLQlTdHJpbmcgSkFYQl9QQUNLQUdFID0gImphdmF4LnhtbC5iaW5kIjsKLQlTdHJpbmcgSkFYQl9QQUNLQUdFXyA9IEpBWEJfUEFDS0FHRSArICcuJzsKLQkKLQlTdHJpbmcgSkFYQl9BTk5PVEFUSU9OX1BBQ0tBR0UgPSAiamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbiI7Ci0JU3RyaW5nIEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFICsgJy4nOwotCQotCVN0cmluZyBKQVhCX0FEQVBURVJTX1BBQ0tBR0UgPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiYWRhcHRlcnMiOwotCVN0cmluZyBKQVhCX0FEQVBURVJTX1BBQ0tBR0VfID0gSkFYQl9BREFQVEVSU19QQUNLQUdFICsgJy4nOwotCQotCQotCS8vIEpBWEIgYW5ub3RhdGlvbnMKLQkKLQlTdHJpbmcgREVGQVVMVF9TVFJJTkcgPSAiIyNkZWZhdWx0IjsKLQkKLQlTdHJpbmcgWE1MX0FUVEFDSE1FTlRfUkVGID0gSkFYQl9BTk5PVEFUSU9OX1BBQ0tBR0VfICsgIlhtbEF0dGFjaG1lbnRSZWYiOwotCQotCVN0cmluZyBYTUxfQUNDRVNTT1JfT1JERVIgPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sQWNjZXNzb3JPcmRlciI7Ci0JCVN0cmluZyBYTUxfQUNDRVNTT1JfT1JERVJfX1ZBTFVFID0gInZhbHVlIjsKLQkKLQlTdHJpbmcgWE1MX0FDQ0VTU09SX1RZUEUgPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sQWNjZXNzb3JUeXBlIjsKLQkJU3RyaW5nIFhNTF9BQ0NFU1NPUl9UWVBFX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JCi0JU3RyaW5nIFhNTF9BTllfQVRUUklCVVRFID0gSkFYQl9BTk5PVEFUSU9OX1BBQ0tBR0VfICsgIlhtbEFueUF0dHJpYnV0ZSI7Ci0JCi0JU3RyaW5nIFhNTF9BTllfRUxFTUVOVCA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxBbnlFbGVtZW50IjsKLQkJU3RyaW5nIFhNTF9BTllfRUxFTUVOVF9fTEFYID0gImxheCI7Ci0JCVN0cmluZyBYTUxfQU5ZX0VMRU1FTlRfX1ZBTFVFID0gInZhbHVlIjsKLQkKLQlTdHJpbmcgWE1MX0FUVFJJQlVURSA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxBdHRyaWJ1dGUiOwotCQlTdHJpbmcgWE1MX0FUVFJJQlVURV9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIFhNTF9BVFRSSUJVVEVfX05BTUVTUEFDRSA9ICJuYW1lc3BhY2UiOwotCQlTdHJpbmcgWE1MX0FUVFJJQlVURV9fUkVRVUlSRUQgPSAicmVxdWlyZWQiOwotCQotCVN0cmluZyBYTUxfRUxFTUVOVCA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxFbGVtZW50IjsKLQkJU3RyaW5nIFhNTF9FTEVNRU5UX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgWE1MX0VMRU1FTlRfX05BTUVTUEFDRSA9ICJuYW1lc3BhY2UiOwotCQlTdHJpbmcgWE1MX0VMRU1FTlRfX0RFRkFVTFRfVkFMVUUgPSAiZGVmYXVsdFZhbHVlIjsKLQkJU3RyaW5nIFhNTF9FTEVNRU5UX19OSUxMQUJMRSA9ICJuaWxsYWJsZSI7Ci0JCVN0cmluZyBYTUxfRUxFTUVOVF9fUkVRVUlSRUQgPSAicmVxdWlyZWQiOwotCQlTdHJpbmcgWE1MX0VMRU1FTlRfX1RZUEUgPSAidHlwZSI7Ci0JCi0JU3RyaW5nIFhNTF9FTEVNRU5UX0RFQ0wgPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sRWxlbWVudERlY2wiOwotCQlTdHJpbmcgWE1MX0VMRU1FTlRfREVDTF9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIFhNTF9FTEVNRU5UX0RFQ0xfX05BTUVTUEFDRSA9ICJuYW1lc3BhY2UiOwotCQlTdHJpbmcgWE1MX0VMRU1FTlRfREVDTF9fREVGQVVMVF9WQUxVRSA9ICJkZWZhdWx0VmFsdWUiOwotCQlTdHJpbmcgWE1MX0VMRU1FTlRfREVDTF9fU0NPUEUgPSAic2NvcGUiOwotCQlTdHJpbmcgWE1MX0VMRU1FTlRfREVDTF9fU1VCU1RJVFVUSU9OX0hFQURfTkFNRSA9ICJzdWJzdGl0dXRpb25IZWFkTmFtZSI7Ci0JCVN0cmluZyBYTUxfRUxFTUVOVF9ERUNMX19TVUJTVElUVVRJT05fSEVBRF9OQU1FU1BBQ0UgPSAic3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSI7Ci0JCi0JU3RyaW5nIFhNTF9FTEVNRU5UUyA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxFbGVtZW50cyI7Ci0JCVN0cmluZyBYTUxfRUxFTUVOVFNfX1ZBTFVFID0gInZhbHVlIjsKLQkKLQlTdHJpbmcgWE1MX0VMRU1FTlRfUkVGID0gSkFYQl9BTk5PVEFUSU9OX1BBQ0tBR0VfICsgIlhtbEVsZW1lbnRSZWYiOwotCQlTdHJpbmcgWE1MX0VMRU1FTlRfUkVGX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgWE1MX0VMRU1FTlRfUkVGX19OQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsKLQkJU3RyaW5nIFhNTF9FTEVNRU5UX1JFRl9fUkVRVUlSRUQgPSAicmVxdWlyZWQiOwotCQlTdHJpbmcgWE1MX0VMRU1FTlRfUkVGX19UWVBFID0gInR5cGUiOwotCQotCVN0cmluZyBYTUxfRUxFTUVOVF9SRUZTID0gSkFYQl9BTk5PVEFUSU9OX1BBQ0tBR0VfICsgIlhtbEVsZW1lbnRSZWZzIjsKLQkJU3RyaW5nIFhNTF9FTEVNRU5UX1JFRlNfX1ZBTFVFID0gInZhbHVlIjsKLQkKLQlTdHJpbmcgWE1MX0VMRU1FTlRfV1JBUFBFUiA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxFbGVtZW50V3JhcHBlciI7Ci0JCVN0cmluZyBYTUxfRUxFTUVOVF9XUkFQUEVSX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgWE1MX0VMRU1FTlRfV1JBUFBFUl9fTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0JCVN0cmluZyBYTUxfRUxFTUVOVF9XUkFQUEVSX19OSUxMQUJMRSA9ICJuaWxsYWJsZSI7Ci0JCVN0cmluZyBYTUxfRUxFTUVOVF9XUkFQUEVSX19SRVFVSVJFRCA9ICJyZXF1aXJlZCI7Ci0JCi0JU3RyaW5nIFhNTF9FTlVNID0gSkFYQl9BTk5PVEFUSU9OX1BBQ0tBR0VfICsgIlhtbEVudW0iOwotCQlTdHJpbmcgWE1MX0VOVU1fX1ZBTFVFID0gInZhbHVlIjsKLQkKLQlTdHJpbmcgWE1MX0VOVU1fVkFMVUUgPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sRW51bVZhbHVlIjsKLQkJU3RyaW5nIFhNTF9FTlVNX1ZBTFVFX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JCi0JU3RyaW5nIFhNTF9JTkxJTkVfQklOQVJZX0RBVEEgPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sSW5saW5lQmluYXJ5RGF0YSI7Ci0JCi0JU3RyaW5nIFhNTF9JRCA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxJRCI7Ci0JCi0JU3RyaW5nIFhNTF9JRFJFRiA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxJRFJFRiI7Ci0JCi0JU3RyaW5nIFhNTF9KQVZBX1RZUEVfQURBUFRFUiA9IEpBWEJfQURBUFRFUlNfUEFDS0FHRV8gKyAiWG1sSmF2YVR5cGVBZGFwdGVyIjsKLQkJU3RyaW5nIFhNTF9KQVZBX1RZUEVfQURBUFRFUl9fVFlQRSA9ICJ0eXBlIjsKLQkJU3RyaW5nIFhNTF9KQVZBX1RZUEVfQURBUFRFUl9fVkFMVUUgPSAidmFsdWUiOwotCQotCVN0cmluZyBYTUxfSkFWQV9UWVBFX0FEQVBURVJTID0gSkFYQl9BREFQVEVSU19QQUNLQUdFXyArICJYbWxKYXZhVHlwZUFkYXB0ZXJzIjsKLQkJU3RyaW5nIFhNTF9KQVZBX1RZUEVfQURBUFRFUlNfX1ZBTFVFID0gInZhbHVlIjsKLQkKLQlTdHJpbmcgWE1MX0xJU1QgPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sTGlzdCI7Ci0JCi0JU3RyaW5nIFhNTF9NSU1FX1RZUEUgPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sTWltZVR5cGUiOwotCQlTdHJpbmcgWE1MX01JTUVfVFlQRV9fVkFMVUUgPSAidmFsdWUiOwotCQotCVN0cmluZyBYTUxfTUlYRUQgPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sTWl4ZWQiOwotCQotCVN0cmluZyBYTUxfTlMgPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sTnMiOwotCQlTdHJpbmcgWE1MX05TX19OQU1FU1BBQ0VfVVJJID0gIm5hbWVzcGFjZVVSSSI7Ci0JCVN0cmluZyBYTUxfTlNfX1BSRUZJWCA9ICJwcmVmaXgiOwotCQotCVN0cmluZyBYTUxfUkVHSVNUUlkgPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sUmVnaXN0cnkiOwotCQotCVN0cmluZyBYTUxfUk9PVF9FTEVNRU5UID0gSkFYQl9BTk5PVEFUSU9OX1BBQ0tBR0VfICsgIlhtbFJvb3RFbGVtZW50IjsKLQkJU3RyaW5nIFhNTF9ST09UX0VMRU1FTlRfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBYTUxfUk9PVF9FTEVNRU5UX19OQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsKLQkKLQlTdHJpbmcgWE1MX1NDSEVNQSA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxTY2hlbWEiOwotCQlTdHJpbmcgWE1MX1NDSEVNQV9fQVRUUklCVVRFX0ZPUk1fREVGQVVMVCA9ICJhdHRyaWJ1dGVGb3JtRGVmYXVsdCI7Ci0JCVN0cmluZyBYTUxfU0NIRU1BX19FTEVNRU5UX0ZPUk1fREVGQVVMVCA9ICJlbGVtZW50Rm9ybURlZmF1bHQiOwotCQlTdHJpbmcgWE1MX1NDSEVNQV9fTE9DQVRJT04gPSAibG9jYXRpb24iOwotCQlTdHJpbmcgWE1MX1NDSEVNQV9fTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0JCVN0cmluZyBYTUxfU0NIRU1BX19YTUxOUyA9ICJ4bWxucyI7Ci0JCi0JU3RyaW5nIFhNTF9TQ0hFTUFfVFlQRSA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxTY2hlbWFUeXBlIjsKLQkJU3RyaW5nIFhNTF9TQ0hFTUFfVFlQRV9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIFhNTF9TQ0hFTUFfVFlQRV9fTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0JCVN0cmluZyBYTUxfU0NIRU1BX1RZUEVfX1RZUEUgPSAidHlwZSI7Ci0JCi0JU3RyaW5nIFhNTF9TQ0hFTUFfVFlQRVMgPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sU2NoZW1hVHlwZXMiOwotCQlTdHJpbmcgWE1MX1NDSEVNQV9UWVBFU19fVkFMVUUgPSAidmFsdWUiOwotCQotCVN0cmluZyBYTUxfU0VFX0FMU08gPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sU2VlQWxzbyI7Ci0JCVN0cmluZyBYTUxfU0VFX0FMU09fX1ZBTFVFID0gInZhbHVlIjsKLQkKLQlTdHJpbmcgWE1MX1RZUEUgPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sVHlwZSI7Ci0JCVN0cmluZyBYTUxfVFlQRV9fRkFDVE9SWV9DTEFTUyA9ICJmYWN0b3J5Q2xhc3MiOwotCQlTdHJpbmcgWE1MX1RZUEVfX0ZBQ1RPUllfTUVUSE9EID0gImZhY3RvcnlNZXRob2QiOwotCQlTdHJpbmcgWE1MX1RZUEVfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBYTUxfVFlQRV9fTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0JCVN0cmluZyBYTUxfVFlQRV9fUFJPUF9PUkRFUiA9ICJwcm9wT3JkZXIiOwotCQlTdHJpbmcgWE1MX1RZUEVfX0RFRkFVTFRfRkFDVE9SWV9DTEFTUyA9IFhNTF9UWVBFICsgIi5ERUZBVUxUIjsKLQkJCi0JU3RyaW5nIFhNTF9UUkFOU0lFTlQgPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sVHJhbnNpZW50IjsKLQkKLQlTdHJpbmcgWE1MX1ZBTFVFID0gSkFYQl9BTk5PVEFUSU9OX1BBQ0tBR0VfICsgIlhtbFZhbHVlIjsKLQkKLQkKLQkvLyBKQVhCIGVudW1zCi0JCi0JU3RyaW5nIFhNTF9BQ0NFU1NfT1JERVIgPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sQWNjZXNzT3JkZXIiOwotCQlTdHJpbmcgWE1MX0FDQ0VTU19PUkRFUl8gPSBYTUxfQUNDRVNTX09SREVSICsgJy4nOwotCQlTdHJpbmcgWE1MX0FDQ0VTU19PUkRFUl9fQUxQSEFCRVRJQ0FMID0gWE1MX0FDQ0VTU19PUkRFUl8gKyAiQUxQSEFCRVRJQ0FMIjsKLQkJU3RyaW5nIFhNTF9BQ0NFU1NfT1JERVJfX1VOREVGSU5FRCA9IFhNTF9BQ0NFU1NfT1JERVJfICsgIlVOREVGSU5FRCI7Ci0JCi0JU3RyaW5nIFhNTF9BQ0NFU1NfVFlQRSA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxBY2Nlc3NUeXBlIjsKLQkJU3RyaW5nIFhNTF9BQ0NFU1NfVFlQRV8gPSBYTUxfQUNDRVNTX1RZUEUgKyAnLic7Ci0JCVN0cmluZyBYTUxfQUNDRVNTX1RZUEVfX0ZJRUxEID0gWE1MX0FDQ0VTU19UWVBFXyArICJGSUVMRCI7Ci0JCVN0cmluZyBYTUxfQUNDRVNTX1RZUEVfX05PTkUgPSBYTUxfQUNDRVNTX1RZUEVfICsgIk5PTkUiOwotCQlTdHJpbmcgWE1MX0FDQ0VTU19UWVBFX19QUk9QRVJUWSA9IFhNTF9BQ0NFU1NfVFlQRV8gKyAiUFJPUEVSVFkiOwotCQlTdHJpbmcgWE1MX0FDQ0VTU19UWVBFX19QVUJMSUNfTUVNQkVSID0gWE1MX0FDQ0VTU19UWVBFXyArICJQVUJMSUNfTUVNQkVSIjsKLQkKLQlTdHJpbmcgWE1MX05TX0ZPUk0gPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sTnNGb3JtIjsKLQlTdHJpbmcgWE1MX05TX0ZPUk1fID0gWE1MX05TX0ZPUk0gKyAiLiI7Ci0JCVN0cmluZyBYTUxfTlNfRk9STV9fUVVBTElGSUVEID0gWE1MX05TX0ZPUk1fICsgIlFVQUxJRklFRCI7Ci0JCVN0cmluZyBYTUxfTlNfRk9STV9fVU5RVUFMSUZJRUQgPSBYTUxfTlNfRk9STV8gKyAiVU5RVUFMSUZJRUQiOwotCQlTdHJpbmcgWE1MX05TX0ZPUk1fX1VOU0VUID0gWE1MX05TX0ZPUk1fICsgIlVOU0VUIjsKLQkKLQkKLQkvLyBPdGhlciBKQVhCIHR5cGVzCi0JCi0JU3RyaW5nIEpBWEJfRUxFTUVOVCA9IEpBWEJfUEFDS0FHRV8gKyAiSkFYQkVsZW1lbnQiOwotCQotCVN0cmluZyBYTUxfQURBUFRFUiA9IEpBWEJfQURBUFRFUlNfUEFDS0FHRV8gKyAiWG1sQWRhcHRlciI7Ci0JCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL0pheGJCYXNpY1NjaGVtYUNvbXBvbmVudEFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvSmF4YkJhc2ljU2NoZW1hQ29tcG9uZW50QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGQzYjBkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvSmF4YkJhc2ljU2NoZW1hQ29tcG9uZW50QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBTdXBlci1pbnRlcmZhY2UgZm9yIHtAbGluayBYbWxBdHRyaWJ1dGVBbm5vdGF0aW9ufSBhbmQge0BsaW5rIFhtbEVsZW1lbnRBbm5vdGF0aW9ufQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YkJhc2ljU2NoZW1hQ29tcG9uZW50QW5ub3RhdGlvbgotCQlleHRlbmRzIFFOYW1lQW5ub3RhdGlvbiB7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdyZXF1aXJlZCcgZWxlbWVudCBvZiB0aGUgWG1sQXR0cmlidXRlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlCb29sZWFuIGdldFJlcXVpcmVkKCk7Ci0JCVN0cmluZyBSRVFVSVJFRF9QUk9QRVJUWSA9ICJyZXF1aXJlZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncmVxdWlyZWQnIGVsZW1lbnQgb2YgdGhlIFhtbEF0dHJpYnV0ZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFJlcXVpcmVkKEJvb2xlYW4gcmVxdWlyZWQpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdyZXF1aXJlZCcgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgWG1sQXR0cmlidXRlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFJlcXVpcmVkVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvUU5hbWVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1FOYW1lQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODdkYTc0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvUU5hbWVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gSkFYQiBhbm5vdGF0aW9ucyB3aXRoIG5hbWVzcGFjZSBhbmQgbmFtZSBmaWVsZHMKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuPwotICogQHNpbmNlIDMuPwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFFOYW1lQW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCQotCS8qKgotCSAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSAnbmFtZXNwYWNlJyBwcm9wZXJ0eQotCSAqLwotCVN0cmluZyBOQU1FU1BBQ0VfUFJPUEVSVFkgPSAibmFtZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbmFtZXNwYWNlJyBlbGVtZW50IG9mIHRoZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldE5hbWVzcGFjZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbmFtZXNwYWNlJyBlbGVtZW50IG9mIHRoZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ25hbWVzcGFjZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIGFubm90YXRpb24gaXRzZWxmLgotCSAqLwotCVRleHRSYW5nZSBnZXROYW1lc3BhY2VUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ25hbWVzcGFjZScgZWxlbWVudC4KLQkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JYm9vbGVhbiBuYW1lc3BhY2VUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgJ25hbWUnIHByb3BlcnR5Ci0JICovCi0JU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25hbWUnIGVsZW1lbnQgb2YgdGhlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbmFtZScgZWxlbWVudCBvZiB0aGUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ25hbWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBhbm5vdGF0aW9uIGl0c2VsZi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSAnbmFtZScgZWxlbWVudC4KLQkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEFjY2Vzc09yZGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEFjY2Vzc09yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3Y2JhYzcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxBY2Nlc3NPcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpBWEIgZW51bQotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NPcmRlcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBlbnVtIFhtbEFjY2Vzc09yZGVyIHsKLQotCUFMUEhBQkVUSUNBTChKQVhCLlhNTF9BQ0NFU1NfT1JERVJfX0FMUEhBQkVUSUNBTCksCi0JVU5ERUZJTkVEIChKQVhCLlhNTF9BQ0NFU1NfT1JERVJfX1VOREVGSU5FRCk7Ci0KLQotCXByaXZhdGUgU3RyaW5nIGphdmFBbm5vdGF0aW9uVmFsdWU7Ci0KLQlYbWxBY2Nlc3NPcmRlcihTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWUgPSBqYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBYbWxBY2Nlc3NPcmRlciBmcm9tSmF2YUFubm90YXRpb25WYWx1ZShPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlyZXR1cm4gKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKGphdmFBbm5vdGF0aW9uVmFsdWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFhtbEFjY2Vzc09yZGVyIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlmb3IgKFhtbEFjY2Vzc09yZGVyIGFjY2Vzc1R5cGUgOiBYbWxBY2Nlc3NPcmRlci52YWx1ZXMoKSkgewotCQkJaWYgKGFjY2Vzc1R5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpLmVxdWFscyhqYXZhQW5ub3RhdGlvblZhbHVlKSkgewotCQkJCXJldHVybiBhY2Nlc3NUeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmF2YUFubm90YXRpb25WYWx1ZShYbWxBY2Nlc3NPcmRlciBhY2Nlc3NUeXBlKSB7Ci0JCXJldHVybiAoYWNjZXNzVHlwZSA9PSBudWxsKSA/IG51bGwgOiBhY2Nlc3NUeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzVHlwZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxBY2Nlc3NUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYjNiZDAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxBY2Nlc3NUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBlbnVtCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGUKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgZW51bSBYbWxBY2Nlc3NUeXBlIHsKLQotCUZJRUxEKEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCksCi0JTk9ORShKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fTk9ORSksCi0JUFJPUEVSVFkoSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BST1BFUlRZKSwKLQlQVUJMSUNfTUVNQkVSKEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QVUJMSUNfTUVNQkVSKTsKLQotCi0JcHJpdmF0ZSBTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZTsKLQotCVhtbEFjY2Vzc1R5cGUoU3RyaW5nIGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlID0gamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFBbm5vdGF0aW9uVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgWG1sQWNjZXNzVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZShPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlyZXR1cm4gKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKGphdmFBbm5vdGF0aW9uVmFsdWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFhtbEFjY2Vzc1R5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWZvciAoWG1sQWNjZXNzVHlwZSBhY2Nlc3NUeXBlIDogWG1sQWNjZXNzVHlwZS52YWx1ZXMoKSkgewotCQkJaWYgKGFjY2Vzc1R5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpLmVxdWFscyhqYXZhQW5ub3RhdGlvblZhbHVlKSkgewotCQkJCXJldHVybiBhY2Nlc3NUeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmF2YUFubm90YXRpb25WYWx1ZShYbWxBY2Nlc3NUeXBlIGFjY2Vzc1R5cGUpIHsKLQkJcmV0dXJuIChhY2Nlc3NUeXBlID09IG51bGwpID8gbnVsbCA6IGFjY2Vzc1R5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWIyMTNjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yT3JkZXIKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQW5ub3RhdGlvbiB7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sQWNjZXNzb3JPcmRlciBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JWG1sQWNjZXNzT3JkZXIgZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sQWNjZXNzb3JPcmRlciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKFhtbEFjY2Vzc09yZGVyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBYbWxBY2Nlc3Nvck9yZGVyIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEFjY2Vzc29yVHlwZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEwZGJhYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEFjY2Vzc29yVHlwZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbEFjY2Vzc29yVHlwZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JWG1sQWNjZXNzVHlwZSBnZXRWYWx1ZSgpOwotCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxBY2Nlc3NvclR5cGUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShYbWxBY2Nlc3NUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBYbWxBY2Nlc3NvclR5cGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEFueUF0dHJpYnV0ZUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjczNTZiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpBWEIgYW5ub3RhdGlvbgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlBdHRyaWJ1dGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEFueUF0dHJpYnV0ZUFubm90YXRpb24KLQkJZXh0ZW5kcyBBbm5vdGF0aW9uIHsKLQkKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sQW55RWxlbWVudEFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sQW55RWxlbWVudEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FmNjc5Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEFueUVsZW1lbnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpBWEIgYW5ub3RhdGlvbgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlFbGVtZW50Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxBbnlFbGVtZW50QW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbGF4JyBlbGVtZW50IG9mIHRoZSBYbWxBbnlFbGVtZW50IGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlCb29sZWFuIGdldExheCgpOwotCQlTdHJpbmcgTEFYX1BST1BFUlRZID0gImxheCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbGF4JyBlbGVtZW50IG9mIHRoZSBYbWxBbnlFbGVtZW50IGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0TGF4KEJvb2xlYW4gbGF4KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbGF4JyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBYbWxBbnlFbGVtZW50IGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldExheFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxBbnlFbGVtZW50IGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKiBSZXR1cm4gdGhlIHBvcnRpb24gb2YgdGhlIHZhbHVlIHByZWNlZGluZyAiLmNsYXNzIi4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O1htbEFueUVsZW1lbnQodmFsdWU9Rm9vLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuICJGb28iCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbEFueUVsZW1lbnQgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFhtbEFueUVsZW1lbnQgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxseS1xdWFsaWZpZWQgdmFsdWUgY2xhc3MgbmFtZSBhcyByZXNvbHZlZCBieSB0aGUgQVNUJ3MgYmluZGluZ3MuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtYbWxBbnlFbGVtZW50KHZhbHVlPUZvby5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiAibW9kZWwuRm9vIiBpZiB0aGVyZSBpcyBhbiBpbXBvcnQgZm9yIG1vZGVsLkZvby4KLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVmFsdWVDbGFzc05hbWUoKTsKLQkJU3RyaW5nIEZVTExZX1FVQUxJRklFRF9WQUxVRV9DTEFTU19OQU1FX1BST1BFUlRZID0gImZ1bGx5UXVhbGlmaWVkVmFsdWVDbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NmM3NzEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpBWEIgYW5ub3RhdGlvbgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRhY2htZW50UmVmCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxBdHRyaWJ1dGVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEF0dHJpYnV0ZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZkODY1NS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEF0dHJpYnV0ZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpBWEIgYW5ub3RhdGlvbgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEF0dHJpYnV0ZUFubm90YXRpb24KLQkJZXh0ZW5kcyBKYXhiQmFzaWNTY2hlbWFDb21wb25lbnRBbm5vdGF0aW9uIHsKLQkKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudEFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU3YjQ1OC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpBWEIgYW5ub3RhdGlvbgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbGVtZW50QW5ub3RhdGlvbgotCQlleHRlbmRzIEpheGJCYXNpY1NjaGVtYUNvbXBvbmVudEFubm90YXRpb24sIE5lc3RhYmxlQW5ub3RhdGlvbiB7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdkZWZhdWx0VmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnQgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0VmFsdWUoKTsKLQkJU3RyaW5nIERFRkFVTFRfVkFMVUVfUFJPUEVSVFkgPSAiZGVmYXVsdFZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdkZWZhdWx0VmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnQgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0VmFsdWUoU3RyaW5nIGRlZmF1bHRWYWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2RlZmF1bHRWYWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFhtbEVsZW1lbnQgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0RGVmYXVsdFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbmlsbGFibGUnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnQgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUJvb2xlYW4gZ2V0TmlsbGFibGUoKTsKLQkJU3RyaW5nIE5JTExBQkxFX1BST1BFUlRZID0gIm5pbGxhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICduaWxsYWJsZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudCBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldE5pbGxhYmxlKEJvb2xlYW4gbmlsbGFibGUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICduaWxsYWJsZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgWG1sRWxlbWVudCBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXROaWxsYWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3R5cGUnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnQgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqIFJldHVybiB0aGUgcG9ydGlvbiBvZiB0aGUgdmFsdWUgcHJlY2VkaW5nICIuY2xhc3MiLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7WG1sRWxlbWVudCh0eXBlPUZvby5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiAiRm9vIgotCSAqLwotCVN0cmluZyBnZXRUeXBlKCk7Ci0JCVN0cmluZyBUWVBFX1BST1BFUlRZID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3R5cGUnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnQgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKTsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3R5cGUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBYbWxFbGVtZW50IGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxseS1xdWFsaWZpZWQgdHlwZSBuYW1lIGFzIHJlc29sdmVkIGJ5IHRoZSBBU1QncyBiaW5kaW5ncy4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O1htbEVsZW1lbnQodHlwZT1Gb28uY2xhc3MpCi0JICogPC9wcmU+Ci0JICogd2lsbCByZXR1cm4gIm1vZGVsLkZvbyIgaWYgdGhlcmUgaXMgYW4gaW1wb3J0IGZvciBtb2RlbC5Gb28uCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZFR5cGVOYW1lKCk7Ci0JCVN0cmluZyBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FX1BST1BFUlRZID0gImZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50RGVjbEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzYTgzZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpBWEIgYW5ub3RhdGlvbgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50RGVjbAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uCi0JCWV4dGVuZHMgUU5hbWVBbm5vdGF0aW9uIHsKLQkKLQkvLyAqKioqKiBzY29wZSAqKioqKgotCQotCS8qKgotCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggInNjb3BlIiBwcm9wZXJ0eSBjaGFuZ2VzLgotCSAqLwotCVN0cmluZyBTQ09QRV9QUk9QRVJUWSA9ICJzY29wZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3Njb3BlJyBlbGVtZW50IG9mIHRoZSBYbWxFbGVtZW50RGVjbCBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICogUmV0dXJuIHRoZSBwb3J0aW9uIG9mIHRoZSB2YWx1ZSBwcmVjZWRpbmcgIi5jbGFzcyIuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtYbWxFbGVtZW50RGVjbCh0eXBlPVhtbEVsZW1lbnREZWNsLkdMT0JBTC5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiAiWG1sRWxlbWVudERlY2wuR0xPQkFMIgotCSAqLwotCVN0cmluZyBnZXRTY29wZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnc2NvcGUnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnREZWNsIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3Njb3BlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgWG1sRWxlbWVudERlY2wgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0U2NvcGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggImZ1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWUiIHByb3BlcnR5IGNoYW5nZXMuCi0JICovCi0JU3RyaW5nIEZVTExZX1FVQUxJRklFRF9TQ09QRV9DTEFTU19OQU1FX1BST1BFUlRZID0gImZ1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxseS1xdWFsaWZpZWQgc2NvcGUgY2xhc3MgbmFtZSBhcyByZXNvbHZlZCBieSB0aGUgQVNUJ3MgYmluZGluZ3MuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtYbWxFbGVtZW50RGVjbCh0eXBlPVhtbEVsZW1lbnREZWNsLkdMT0JBTC5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiAiamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50RGVjbC5HTE9CQUwiCi0JICovCi0JU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWUoKTsKLQkKLQkKLQkvLyAqKioqKiBzdWJzdGl0dXRpb24gaGVhZCBuYW1lc3BhY2UgKioqKioKLQkKLQkvKioKLQkgKiBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoICJzdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlIiBwcm9wZXJ0eSBjaGFuZ2VzLgotCSAqLwotCVN0cmluZyBTVUJTVElUVVRJT05fSEVBRF9OQU1FU1BBQ0VfUFJPUEVSVFkgPSAic3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3N1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnREZWNsIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudERlY2wgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKFN0cmluZyBzdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3N1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBYbWxFbGVtZW50RGVjbCBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlICdzdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlJyBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIHN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2VUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkKLQkvLyAqKioqKiBzdWJzdGl0dXRpb24gaGVhZCBuYW1lICoqKioqCi0JCi0JLyoqCi0JICogU3RyaW5nIGFzc29jaWF0ZWQgd2l0aCAic3Vic3RpdHV0aW9uSGVhZE5hbWUiIHByb3BlcnR5IGNoYW5nZXMuCi0JICovCi0JU3RyaW5nIFNVQlNUSVRVVElPTl9IRUFEX05BTUVfUFJPUEVSVFkgPSAic3Vic3RpdHV0aW9uSGVhZE5hbWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdzdWJzdGl0dXRpb25IZWFkTmFtZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudERlY2wgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRTdWJzdGl0dXRpb25IZWFkTmFtZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnc3Vic3RpdHV0aW9uSGVhZE5hbWUnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnREZWNsIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0U3Vic3RpdHV0aW9uSGVhZE5hbWUoU3RyaW5nIHN1YnN0aXR1dGlvbkhlYWROYW1lKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3N1YnN0aXR1dGlvbkhlYWROYW1lJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgWG1sRWxlbWVudERlY2wgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ3N1YnN0aXR1dGlvbkhlYWROYW1lJyBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIHN1YnN0aXR1dGlvbkhlYWROYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JCi0JLy8gKioqKiogZGVmYXVsdCB2YWx1ZSAqKioqKgotCQotCS8qKgotCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggImRlZmF1bHRWYWx1ZSIgcHJvcGVydHkgY2hhbmdlcy4KLQkgKi8KLQlTdHJpbmcgREVGQVVMVF9WQUxVRV9QUk9QRVJUWSA9ICJkZWZhdWx0VmFsdWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdkZWZhdWx0VmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnREZWNsIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdkZWZhdWx0VmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnREZWNsIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0RGVmYXVsdFZhbHVlKFN0cmluZyBkZWZhdWx0VmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnZGVmYXVsdFZhbHVlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgWG1sRWxlbWVudERlY2wgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0RGVmYXVsdFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudFJlZkFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudFJlZkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2ZDliOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpBWEIgYW5ub3RhdGlvbgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50UmVmCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbgotCQlleHRlbmRzIFFOYW1lQW5ub3RhdGlvbiwgTmVzdGFibGVBbm5vdGF0aW9uIHsKLQkKLQkvLyAqKioqKiByZXF1aXJlZCAqKioqKgotCQotCS8qKgotCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgJ3JlcXVpcmVkJyBwcm9wZXJ0eSBvZiB0aGlzIGFubm90YXRpb24uCi0JICovCi0JU3RyaW5nIFJFUVVJUkVEX1BST1BFUlRZID0gInJlcXVpcmVkIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncmVxdWlyZWQnIGVsZW1lbnQgb2YgdGhpcyBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JQm9vbGVhbiBnZXRSZXF1aXJlZCgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncmVxdWlyZWQnIGVsZW1lbnQgb2YgdGhpcyBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFJlcXVpcmVkKEJvb2xlYW4gcmVxdWlyZWQpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAncmVxdWlyZWQnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50Ci0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIGFubm90YXRpb24gaXRzZWxmLgotCSAqLwotCVRleHRSYW5nZSBnZXRSZXF1aXJlZFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JCi0JLy8gKioqKiogdHlwZSAqKioqKgotCQotCS8qKgotCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgJ3R5cGUnIHByb3BlcnR5IG9mIHRoaXMgYW5ub3RhdGlvbi4KLQkgKi8KLQlTdHJpbmcgVFlQRV9QUk9QRVJUWSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndHlwZScgZWxlbWVudCBvZiB0aGlzIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKiBSZXR1cm4gdGhlIHBvcnRpb24gb2YgdGhlIHZhbHVlIHByZWNlZGluZyAiLmNsYXNzIi4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O1htbEVsZW1lbnRSZWYodHlwZT1Gb28uY2xhc3MpCi0JICogPC9wcmU+Ci0JICogd2lsbCByZXR1cm4gIkZvbyIKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndHlwZScgZWxlbWVudCBvZiB0aGlzIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd0eXBlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgYW5ub3RhdGlvbiBpdHNlbGYuCi0JICovCi0JVGV4dFJhbmdlIGdldFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgJ2Z1bGx5UXVhbGlmaWVkTmFtZScgcHJvcGVydHkgb2YgdGhpcyBhbm5vdGF0aW9uLgotCSAqLwotCVN0cmluZyBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FX1BST1BFUlRZID0gImZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxseS1xdWFsaWZpZWQgdHlwZSBuYW1lIGFzIHJlc29sdmVkIGJ5IHRoZSBBU1QncyBiaW5kaW5ncy4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O1htbEVsZW1lbnRSZWYodHlwZT1Gb28uY2xhc3MpCi0JICogPC9wcmU+Ci0JICogd2lsbCByZXR1cm4gIm1vZGVsLkZvbyIgaWYgdGhlcmUgaXMgYW4gaW1wb3J0IGZvciBtb2RlbC5Gb28uCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZFR5cGVOYW1lKCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50UmVmc0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IxMGYyNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGFubm90YXRpb24KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudFJlZnMKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnRSZWZzIGFubm90YXRpb24uCi0JICogUmV0dXJuIGFuIGVtcHR5IGl0ZXJhdG9yIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JTGlzdEl0ZXJhYmxlPFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uPiBnZXRYbWxFbGVtZW50UmVmcygpOwotCQlTdHJpbmcgWE1MX0VMRU1FTlRfUkVGU19MSVNUID0gInhtbEVsZW1lbnRSZWZzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnRSZWZzIGFubm90YXRpb24uCi0JICovCi0JaW50IGdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnRSZWZzIGFubm90YXRpb24uCi0JICovCi0JWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkF0KGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudFJlZnMgYW5ub3RhdGlvbi4KLQkgKi8KLQlYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiBhZGRYbWxFbGVtZW50UmVmKGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudFJlZnMgYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIG1vdmVYbWxFbGVtZW50UmVmKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxFbGVtZW50UmVmcyBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgcmVtb3ZlWG1sRWxlbWVudFJlZihpbnQgaW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYWNkMDguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpBWEIgYW5ub3RhdGlvbgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50V3JhcHBlcgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uCi0JCWV4dGVuZHMgUU5hbWVBbm5vdGF0aW9uIHsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25pbGxhYmxlJyBlbGVtZW50IG9mIHRoZSBYbWxFbGVtZW50V3JhcHBlciBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JQm9vbGVhbiBnZXROaWxsYWJsZSgpOwotCVN0cmluZyBOSUxMQUJMRV9QUk9QRVJUWSA9ICJuaWxsYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25pbGxhYmxlJyBlbGVtZW50IG9mIHRoZSBYbWxFbGVtZW50V3JhcHBlciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldE5pbGxhYmxlKEJvb2xlYW4gbmlsbGFibGUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbmlsbGFibGUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50Ci0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFhtbEVsZW1lbnRXcmFwcGVyIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE5pbGxhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3JlcXVpcmVkJyBlbGVtZW50IG9mIHRoZSBYbWxFbGVtZW50V3JhcHBlciBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JQm9vbGVhbiBnZXRSZXF1aXJlZCgpOwotCVN0cmluZyBSRVFVSVJFRF9QUk9QRVJUWSA9ICJyZXF1aXJlZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3JlcXVpcmVkJyBlbGVtZW50IG9mIHRoZSBYbWxFbGVtZW50V3JhcHBlciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFJlcXVpcmVkKEJvb2xlYW4gcmVxdWlyZWQpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAncmVxdWlyZWQnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50Ci0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFhtbEVsZW1lbnRXcmFwcGVyIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFJlcXVpcmVkVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudHNBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRzQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTZkMTgwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudHNBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpBWEIgYW5ub3RhdGlvbgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbGVtZW50c0Fubm90YXRpb24KLQkJZXh0ZW5kcyBBbm5vdGF0aW9uIHsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxFbGVtZW50cyBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBhbiBlbXB0eSBpdGVyYXRvciBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUxpc3RJdGVyYWJsZTxYbWxFbGVtZW50QW5ub3RhdGlvbj4gZ2V0WG1sRWxlbWVudHMoKTsKLQkJU3RyaW5nIFhNTF9FTEVNRU5UU19MSVNUID0gInhtbEVsZW1lbnRzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnRzIGFubm90YXRpb24uCi0JICovCi0JaW50IGdldFhtbEVsZW1lbnRzU2l6ZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnRzIGFubm90YXRpb24uCi0JICovCi0JWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEF0KGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudHMgYW5ub3RhdGlvbi4KLQkgKi8KLQlYbWxFbGVtZW50QW5ub3RhdGlvbiBhZGRYbWxFbGVtZW50KGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudHMgYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIG1vdmVYbWxFbGVtZW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxFbGVtZW50cyBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgcmVtb3ZlWG1sRWxlbWVudChpbnQgaW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxFbnVtQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxFbnVtQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWZjOGNhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sRW51bUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVudW0KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVudW1Bbm5vdGF0aW9uCi0JCWV4dGVuZHMgQW5ub3RhdGlvbiB7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sRW51bSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICogUmV0dXJuIHRoZSBwb3J0aW9uIG9mIHRoZSB2YWx1ZSBwcmVjZWRpbmcgIi5jbGFzcyIuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtYbWxFbnVtKHZhbHVlPUVudW1DbGFzcy5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiAiRW51bUNsYXNzIgotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxFbnVtIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3ZhbHVlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgWG1sRW51bSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5LXF1YWxpZmllZCB2YWx1ZSBjbGFzcyBuYW1lIGFzIHJlc29sdmVkIGJ5IHRoZSBBU1QncyBiaW5kaW5ncy4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O1htbEVudW0odmFsdWU9RW51bUNsYXNzLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuICJtb2RlbC5FbnVtQ2xhc3MiIGlmIHRoZXJlIGlzIGFuIGltcG9ydCBmb3IgbW9kZWwuRW51bUNsYXNzLgotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZUNsYXNzTmFtZSgpOwotCQlTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1ZBTFVFX0NMQVNTX05BTUVfUFJPUEVSVFkgPSAiZnVsbHlRdWFsaWZpZWRWYWx1ZUNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxFbnVtVmFsdWVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEVudW1WYWx1ZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ3MGEyOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEVudW1WYWx1ZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVudW1WYWx1ZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRW51bVZhbHVlQW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCQotCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxFbnVtVmFsdWUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxFbnVtVmFsdWUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBYbWxFbnVtVmFsdWUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBwb3NpdGlvbiB0b3VjaGVzIHRoZSAndmFsdWUnIGVsZW1lbnQgdmFsdWUuCi0JICovCi0JYm9vbGVhbiB2YWx1ZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxJREFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sSURBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODNiZDEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxJREFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGFubm90YXRpb24KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbElEQW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxJRFJFRkFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sSURSRUZBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2Y2ZhZDIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxJRFJFRkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGFubm90YXRpb24KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSURSRUYKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbElEUkVGQW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjk5OTE5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGFubm90YXRpb24KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSW5saW5lQmluYXJ5RGF0YQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb24KLQkJZXh0ZW5kcyBBbm5vdGF0aW9uIHsKLQkKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYmMyY2QuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbgotCQlleHRlbmRzIE5lc3RhYmxlQW5ub3RhdGlvbiB7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sSmF2YVR5cGVBZGFwdGVyIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKiBSZXR1cm4gdGhlIHBvcnRpb24gb2YgdGhlIHZhbHVlIHByZWNlZGluZyAiLmNsYXNzIi4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O1htbEphdmFUeXBlQWRhcHRlcih2YWx1ZT1Gb29BZGFwdGVyLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuICJGb29BZGFwdGVyIgotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sSmF2YVR5cGVBZGFwdGVyIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3ZhbHVlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgWG1sSmF2YVR5cGVBZGFwdGVyIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlJ3MgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgYXMgcmVzb2x2ZWQgYnkgdGhlIEFTVCdzIGJpbmRpbmdzLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7WG1sSmF2YVR5cGVBZGFwdGVyKEZvb0FkYXB0ZXIuY2xhc3MpCi0JICogPC9wcmU+Ci0JICogd2lsbCByZXR1cm4gImV4YW1wbGUuRm9vQWRhcHRlciIgaWYgdGhlcmUgaXMgYW4gaW1wb3J0IGZvciBleGFtcGxlLkZvb0FkYXB0ZXIuCi0JICovCi0JU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVmFsdWUoKTsKLQkJU3RyaW5nIEZVTExZX1FVQUxJRklFRF9WQUxVRV9QUk9QRVJUWSA9ICJmdWxseVF1YWxpZmllZFZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndHlwZScgZWxlbWVudCBvZiB0aGUgWG1sSmF2YVR5cGVBZGFwdGVyIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKiBSZXR1cm4gdGhlIHBvcnRpb24gb2YgdGhlIHZhbHVlIHByZWNlZGluZyAiLmNsYXNzIi4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O1htbEphdmFUeXBlQWRhcHRlcih0eXBlPUZvby5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiAiRm9vIgotCSAqLwotCVN0cmluZyBnZXRUeXBlKCk7Ci0JCVN0cmluZyBUWVBFX1BST1BFUlRZID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd0eXBlJyBlbGVtZW50IG9mIHRoZSBYbWxKYXZhVHlwZUFkYXB0ZXIgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3R5cGUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBYbWxKYXZhVHlwZUFkYXB0ZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlJ3MgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgYXMgcmVzb2x2ZWQgYnkgdGhlIEFTVCdzIGJpbmRpbmdzLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7WG1sSmF2YVR5cGVBZGFwdGVyKHR5cGU9Rm9vLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuICJleGFtcGxlLkZvbyIgaWYgdGhlcmUgaXMgYW4gaW1wb3J0IGZvciBleGFtcGxlLkZvby4KLQkgKi8KLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCk7Ci0JCVN0cmluZyBGVUxMWV9RVUFMSUZJRURfVFlQRV9QUk9QRVJUWSA9ICJmdWxseVF1YWxpZmllZFR5cGUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbExpc3RBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbExpc3RBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDZlNDYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxMaXN0QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpBWEIgYW5ub3RhdGlvbgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxMaXN0Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxMaXN0QW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxNaW1lVHlwZUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sTWltZVR5cGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3M2FkZTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxNaW1lVHlwZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbE1pbWVUeXBlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNaW1lVHlwZUFubm90YXRpb24KLQkJZXh0ZW5kcyBBbm5vdGF0aW9uIHsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxNaW1lVHlwZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbE1pbWVUeXBlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBYbWxNaW1lVHlwZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sTWl4ZWRBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbE1peGVkQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzkyYzQyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sTWl4ZWRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbE1peGVkCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNaXhlZEFubm90YXRpb24KLQkJZXh0ZW5kcyBBbm5vdGF0aW9uIHsKLQkKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sTnNBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbE5zQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzlhOWQ4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sTnNBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbE5zCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxOc0Fubm90YXRpb24KLQkJZXh0ZW5kcyBOZXN0YWJsZUFubm90YXRpb24gewotCQotCS8vICoqKioqIG5hbWVzcGFjZVVSSSAqKioqKgotCQotCVN0cmluZyBOQU1FU1BBQ0VfVVJJX1BST1BFUlRZID0gIm5hbWVzcGFjZVVSSSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25hbWVzcGFjZVVSSScgZWxlbWVudCBvZiB0aGUgWG1sTnMgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXROYW1lc3BhY2VVUkkoKTsKLQkJCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICduYW1lc3BhY2VVUkknIGVsZW1lbnQgb2YgdGhlIFhtbE5zIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuYW1lc3BhY2VVUkkpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbmFtZXNwYWNlVVJJJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgWG1sTnMgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVVJJVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlICduYW1lc3BhY2VVUkknIGVsZW1lbnQuCi0JICogUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCWJvb2xlYW4gbmFtZXNwYWNlVVJJVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JCi0JLy8gKioqKiogcHJlZml4ICoqKioqCi0JCi0JU3RyaW5nIFBSRUZJWF9QUk9QRVJUWSA9ICJwcmVmaXgiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdwcmVmaXgnIGVsZW1lbnQgb2YgdGhlIFhtbE5zIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0UHJlZml4KCk7Ci0JCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncHJlZml4JyBlbGVtZW50IG9mIHRoZSBYbWxOcyBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3ByZWZpeCcgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFhtbE5zIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFByZWZpeFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSAncHJlZml4JyBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIHByZWZpeFRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxOc0Zvcm0uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sTnNGb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNzM1NDEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxOc0Zvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGVudW0KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTnNGb3JtCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGVudW0gWG1sTnNGb3JtIHsKLQkKLQlRVUFMSUZJRUQoSkFYQi5YTUxfTlNfRk9STV9fUVVBTElGSUVEKSwKLQlVTlFVQUxJRklFRChKQVhCLlhNTF9OU19GT1JNX19VTlFVQUxJRklFRCksCi0JVU5TRVQoSkFYQi5YTUxfTlNfRk9STV9fVU5TRVQpOwotCQotCi0JcHJpdmF0ZSBTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZTsKLQotCVhtbE5zRm9ybShTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWUgPSBqYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBYbWxOc0Zvcm0gZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJcmV0dXJuIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhqYXZhQW5ub3RhdGlvblZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBYbWxOc0Zvcm0gZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWZvciAoWG1sTnNGb3JtIG5zRm9ybSA6IFhtbE5zRm9ybS52YWx1ZXMoKSkgewotCQkJaWYgKG5zRm9ybS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkuZXF1YWxzKGphdmFBbm5vdGF0aW9uVmFsdWUpKSB7Ci0JCQkJcmV0dXJuIG5zRm9ybTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0phdmFBbm5vdGF0aW9uVmFsdWUoWG1sTnNGb3JtIG5zRm9ybSkgewotCQlyZXR1cm4gKG5zRm9ybSA9PSBudWxsKSA/IG51bGwgOiBuc0Zvcm0uZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sUmVnaXN0cnlBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbFJlZ2lzdHJ5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2U2YWVmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sUmVnaXN0cnlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxSZWdpc3RyeUFubm90YXRpb24KLQkJZXh0ZW5kcyBBbm5vdGF0aW9uIHsKLQkKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbFJvb3RFbGVtZW50QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMThmYzk2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGFubm90YXRpb24KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbgotCQlleHRlbmRzIFFOYW1lQW5ub3RhdGlvbiB7Ci0JCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbFNjaGVtYUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sU2NoZW1hQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTA4NTA2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sU2NoZW1hQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sU2NoZW1hQW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnYXR0cmlidXRlRm9ybURlZmF1bHQnIGVsZW1lbnQgb2YgdGhlIFhtbFNjaGVtYSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JWG1sTnNGb3JtIGdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCk7Ci0JCVN0cmluZyBBVFRSSUJVVEVfRk9STV9ERUZBVUxUX1BST1BFUlRZID0gImF0dHJpYnV0ZUZvcm1EZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnYXR0cmlidXRlRm9ybURlZmF1bHQnIGVsZW1lbnQgb2YgdGhlIFhtbFNjaGVtYSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KFhtbE5zRm9ybSBhdHRyaWJ1dGVGb3JtRGVmYXVsdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdhdHRyaWJ1dGVGb3JtRGVmYXVsdCcgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFhtbFNjaGVtYSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdlbGVtZW50Rm9ybURlZmF1bHQnIGVsZW1lbnQgb2YgdGhlIFhtbFNjaGVtYSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JWG1sTnNGb3JtIGdldEVsZW1lbnRGb3JtRGVmYXVsdCgpOwotCQlTdHJpbmcgRUxFTUVOVF9GT1JNX0RFRkFVTFRfUFJPUEVSVFkgPSAiZWxlbWVudEZvcm1EZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZWxlbWVudEZvcm1EZWZhdWx0JyBlbGVtZW50IG9mIHRoZSBYbWxTY2hlbWEgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRFbGVtZW50Rm9ybURlZmF1bHQoWG1sTnNGb3JtIGVsZW1lbnRGb3JtRGVmYXVsdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdlbGVtZW50Rm9ybURlZmF1bHQnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBYbWxTY2hlbWEgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0RWxlbWVudEZvcm1EZWZhdWx0VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2xvY2F0aW9uJyBlbGVtZW50IG9mIHRoZSBYbWxTY2hlbWEgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRMb2NhdGlvbigpOwotCQlTdHJpbmcgTE9DQVRJT05fUFJPUEVSVFkgPSAibG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdsb2NhdGlvbicgZWxlbWVudCBvZiB0aGUgWG1sU2NoZW1hIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2xvY2F0aW9uJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgWG1sU2NoZW1hIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldExvY2F0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25hbWVzcGFjZScgZWxlbWVudCBvZiB0aGUgWG1sU2NoZW1hIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZXNwYWNlKCk7Ci0JCVN0cmluZyBOQU1FU1BBQ0VfUFJPUEVSVFkgPSAibmFtZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICduYW1lc3BhY2UnIGVsZW1lbnQgb2YgdGhlIFhtbFNjaGVtYSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbmFtZXNwYWNlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgWG1sU2NoZW1hIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE5hbWVzcGFjZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSAnbmFtZXNwYWNlJyBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIG5hbWVzcGFjZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAneG1sbnMnIGVsZW1lbnQgb2YgdGhlIFhtbFNjaGVtYSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBhbiBlbXB0eSBpdGVyYXRvciBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUxpc3RJdGVyYWJsZTxYbWxOc0Fubm90YXRpb24+IGdldFhtbG5zKCk7Ci0JCVN0cmluZyBYTUxOU19MSVNUID0gInhtbG5zIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAneG1sbnMnIGVsZW1lbnQgb2YgdGhlIFhtbFNjaGVtYSBhbm5vdGF0aW9uLgotCSAqLwotCWludCBnZXRYbWxuc1NpemUoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3htbG5zJyBlbGVtZW50IG9mIHRoZSBYbWxTY2hlbWEgYW5ubm90YXRpb24uCi0JICovCi0JWG1sTnNBbm5vdGF0aW9uIHhtbG5zQXQoaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3htbG5zJyBlbGVtZW50IG9mIHRoZSBYbWxTY2hlbWEgYW5ub3RhdGlvbi4KLQkgKi8KLQlYbWxOc0Fubm90YXRpb24gYWRkWG1sbnMoaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3htbG5zJyBlbGVtZW50IG9mIHRoZSBYbWxTY2hlbWEgYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIG1vdmVYbWxucyhpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd4bWxucycgZWxlbWVudCBvZiB0aGUgWG1sU2NoZW1hIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCByZW1vdmVYbWxucyhpbnQgaW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxTY2hlbWFUeXBlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxTY2hlbWFUeXBlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmEyNTVlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sU2NoZW1hVHlwZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGFubm90YXRpb24KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hVHlwZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sU2NoZW1hVHlwZUFubm90YXRpb24KLQkJZXh0ZW5kcyBRTmFtZUFubm90YXRpb24sIE5lc3RhYmxlQW5ub3RhdGlvbiB7Ci0JCi0JU3RyaW5nIFRZUEVfUFJPUEVSVFkgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3R5cGUnIGVsZW1lbnQgb2YgdGhlIFhtbFNjaGVtYVR5cGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqIFJldHVybiB0aGUgcG9ydGlvbiBvZiB0aGUgdmFsdWUgcHJlY2VkaW5nICIuY2xhc3MiLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7WG1sU2NoZW1hVHlwZShuYW1lPSJkYXRlIiwgdHlwZT1YTUxHcmVnb3JpYW5DYWxlbmRhci5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiAiWE1MR3JlZ29yaWFuQ2FsZW5kYXIiCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQkJCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd0eXBlJyBlbGVtZW50IG9mIHRoZSBYbWxTY2hlbWFUeXBlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd0eXBlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgWG1sU2NoZW1hVHlwZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQlTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1RZUEVfUFJPUEVSVFkgPSAiZnVsbHlRdWFsaWZpZWRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIHR5cGUgbmFtZSBhcyByZXNvbHZlZCBieSB0aGUgQVNUJ3MgYmluZGluZ3MuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtYbWxTY2hlbWFUeXBlKG5hbWU9ImRhdGUiLCB0eXBlPVhNTEdyZWdvcmlhbkNhbGVuZGFyLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuICJqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXIiIGlmIHRoZXJlIGlzIGFuIGltcG9ydCBmb3IgCi0JICogamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyLgotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCk7Ci0JCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdHlwZSB3aGVuIG5vbmUgaXMgc3BlY2lmaWVkCi0JICovCi0JU3RyaW5nIERFRkFVTFRfVFlQRSA9ICJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYVR5cGUuREVGQVVMVCI7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbFNlZUFsc29Bbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbFNlZUFsc29Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMmY4NjQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxTZWVBbHNvQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGFubm90YXRpb24KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2VlQWxzbwotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sU2VlQWxzb0Fubm90YXRpb24KLQkJZXh0ZW5kcyBBbm5vdGF0aW9uIHsKLQkKLQkvKioKLQkgKiBDaGFuZ2Ugbm90aWZpY2F0aW9uIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsdWUgZWxlbWVudAotCSAqLwotCVN0cmluZyBDTEFTU0VTX0xJU1QgPSAiY2xhc3NlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxTZWVBbHNvIGFubm90YXRpb24uCi0JICogUmV0dXJuIGFuIGVtcHR5IGl0ZXJhdG9yIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICogUmV0dXJuIHRoZSBwb3J0aW9uIG9mIHRoZSB2YWx1ZSBwcmVjZWRpbmcgIi5jbGFzcyIuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtYbWxTZWVBbHNvKHtGb28uY2xhc3MsIEJhci5jbGFzc30pCi0JICogPC9wcmU+Ci0JICogd2lsbCByZXR1cm4gYW5kIGl0ZXJhYmxlIGNvbnRhaW5pbmc6ICJGb28iLCAiQmFyIgotCSAqLwotCUxpc3RJdGVyYWJsZTxTdHJpbmc+IGdldENsYXNzZXMoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxTZWVBbHNvIGFubm90YXRpb24uCi0JICovCi0JaW50IGdldENsYXNzZXNTaXplKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sU2VlQWxzbyBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgYWRkQ2xhc3MoU3RyaW5nIGNsYXp6KTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxTZWVBbHNvIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCBhZGRDbGFzcyhpbnQgaW5kZXgsIFN0cmluZyBjbGF6eik7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sU2VlQWxzbyBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgbW92ZUNsYXNzKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxTZWVBbHNvIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCByZW1vdmVDbGFzcyhpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIENoYW5nZSBub3RpZmljYXRpb24gY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3Nlcy4KLQkgKiBDaGFuZ2VzIHNob3VsZCBvY2N1ciB3aGVuZXZlciBjaGFuZ2VzIG9jY3VyIHRvIHRoZSAiY2xhc3NlcyIgbGlzdCwgYnV0IAotCSAqIG1heSBhbHNvIG9jY3VyIHdpdGggY2hhbmdlcyB0byB0aGUgY2xhc3NlcyByZXNvbHV0aW9uIHN0YXRlIChpbXBvcnQgY2hhbmdlcywgZS5nLikKLQkgKi8KLQlTdHJpbmcgRlVMTFlfUVVBTElGSUVEX0NMQVNTRVNfTElTVCA9ICJmdWxseVF1YWxpZmllZENsYXNzZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBlbGVtZW50cyByZXNvbHZlZCB0byBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZXMKLQkgKi8KLQlMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRGdWxseVF1YWxpZmllZENsYXNzZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sVHJhbnNpZW50QW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxUcmFuc2llbnRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZDY3MjAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxUcmFuc2llbnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFRyYW5zaWVudAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sVHJhbnNpZW50QW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxUeXBlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxUeXBlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODFjZGU5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sVHlwZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGFubm90YXRpb24KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4/Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sVHlwZUFubm90YXRpb24KLQkJZXh0ZW5kcyBRTmFtZUFubm90YXRpb24gewotCQotCS8vICoqKioqIGZhY3RvcnkgY2xhc3MgKioqKioKLQkKLQlTdHJpbmcgRkFDVE9SWV9DTEFTU19QUk9QRVJUWSA9ICJmYWN0b3J5Q2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIERFRkFVTFRfRkFDVE9SWV9DTEFTUyA9IEpBWEIuWE1MX1RZUEVfX0RFRkFVTFRfRkFDVE9SWV9DTEFTUzsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2ZhY3RvcnlDbGFzcycgZWxlbWVudCBvZiB0aGUgWG1sVHlwZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICogUmV0dXJuIHRoZSBwb3J0aW9uIG9mIHRoZSB2YWx1ZSBwcmVjZWRpbmcgIi5jbGFzcyIuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtYbWxUeXBlKG5hbWU9IlVTQWRkcmVzc1R5cGUiLCBmYWN0b3J5Q2xhc3M9VVNBZGRyZXNzRmFjdG9yeS5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiAiVVNBZGRyZXNzRmFjdG9yeSIKLQkgKi8KLQlTdHJpbmcgZ2V0RmFjdG9yeUNsYXNzKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdmYWN0b3J5Q2xhc3MnIGVsZW1lbnQgb2YgdGhlIFhtbFR5cGUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRGYWN0b3J5Q2xhc3MoU3RyaW5nIGZhY3RvcnlDbGFzcyk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdmYWN0b3J5Q2xhc3MnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBYbWxUeXBlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldEZhY3RvcnlDbGFzc1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JU3RyaW5nIEZVTExZX1FVQUxJRklFRF9GQUNUT1JZX0NMQVNTX05BTUVfUFJPUEVSVFkgPSAiZnVsbHlRdWFsaWZpZWRGYWN0b3J5Q2xhc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIGZhY3RvcnkgY2xhc3MgbmFtZSBhcyByZXNvbHZlZCBieSB0aGUgQVNUJ3MgYmluZGluZ3MuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtYbWxUeXBlKG5hbWU9IlVTQWRkcmVzc1R5cGUiLCBmYWN0b3J5Q2xhc3M9VVNBZGRyZXNzRmFjdG9yeS5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiAibW9kZWwuVVNBZGRyZXNzRmFjdG9yeSIgaWYgdGhlcmUgaXMgYW4gaW1wb3J0IGZvciBtb2RlbC5VU0FkZHJlc3NGYWN0b3J5LgotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRGYWN0b3J5Q2xhc3NOYW1lKCk7Ci0JCi0JCi0JLy8gKioqKiogZmFjdG9yeSBtZXRob2QgKioqKioKLQkKLQlTdHJpbmcgRkFDVE9SWV9NRVRIT0RfUFJPUEVSVFkgPSAiZmFjdG9yeU1ldGhvZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2ZhY3RvcnlNZXRob2QnIGVsZW1lbnQgb2YgdGhlIFhtbFR5cGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRGYWN0b3J5TWV0aG9kKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdmYWN0b3J5TWV0aG9kJyBlbGVtZW50IG9mIHRoZSBYbWxUeXBlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0RmFjdG9yeU1ldGhvZChTdHJpbmcgZmFjdG9yeU1ldGhvZCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdmYWN0b3J5TWV0aG9kJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgWG1sVHlwZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRGYWN0b3J5TWV0aG9kVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkKLQkvLyAqKioqKiBwcm9wIG9yZGVyICoqKioqCi0JCi0JU3RyaW5nIFBST1BfT1JERVJfTElTVCA9ICJwcm9wT3JkZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQSBzaW5nbGUgZWxlbWVudCBlbXB0eSBzdHJpbmcgYXJyYXkgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIHVuc3BlY2lmaWVkCi0JICovCi0JU3RyaW5nW10gREVGQVVMVF9QUk9QX09SREVSID0gbmV3IFN0cmluZ1tdIHsgIiIgfTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3Byb3BPcmRlcicgZWxlbWVudCBvZiB0aGUgWG1sVHlwZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBhbiBlbXB0eSBpdGVyYXRvciBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUxpc3RJdGVyYWJsZTxTdHJpbmc+IGdldFByb3BPcmRlcigpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncHJvcE9yZGVyJyBlbGVtZW50IG9mIHRoZSBYbWxUeXBlIGFubm90YXRpb24uCi0JICovCi0JaW50IGdldFByb3BPcmRlclNpemUoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3Byb3BPcmRlcicgZWxlbWVudCBvZiB0aGUgWG1sVHlwZSBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgYWRkUHJvcChTdHJpbmcgcHJvcCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdwcm9wT3JkZXInIGVsZW1lbnQgb2YgdGhlIFhtbFR5cGUgYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIGFkZFByb3AoaW50IGluZGV4LCBTdHJpbmcgcHJvcCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdwcm9wT3JkZXInIGVsZW1lbnQgb2YgdGhlIFhtbFR5cGUgYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIG1vdmVQcm9wKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3Byb3BPcmRlcicgZWxlbWVudCBvZiB0aGUgWG1sVHlwZSBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgcmVtb3ZlUHJvcChTdHJpbmcgcHJvcCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdwcm9wT3JkZXInIGVsZW1lbnQgb2YgdGhlIFhtbFR5cGUgYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIHJlbW92ZVByb3AoaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgcmFuZ2Ugb2YgdGhlICdwcm9wT3JkZXInIGVsZW1lbnQgb2YgdGhlIFhtbFR5cGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0UHJvcE9yZGVyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlICdwcm9wT3JkZXInIGVsZW1lbnQuCi0JICogUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCWJvb2xlYW4gcHJvcE9yZGVyVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIG9mIHRoZSBwcm9wIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgKLQkgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlCi0JICovCi0JVGV4dFJhbmdlIGdldFByb3BUZXh0UmFuZ2UoaW50IGluZGV4LCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSBwcm9wIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZQotCSAqLwotCWJvb2xlYW4gcHJvcFRvdWNoZXMoaW50IGluZGV4LCBpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbFZhbHVlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxWYWx1ZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE5MzY1NS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbFZhbHVlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpBWEIgYW5ub3RhdGlvbgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxWYWx1ZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sVmFsdWVBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQW5ub3RhdGlvbiB7Ci0JCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXhiaW5kZXgvSmF4YkluZGV4UmVzb3VyY2UuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2pheGJpbmRleC9KYXhiSW5kZXhSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjI3NTMzLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2pheGJpbmRleC9KYXhiSW5kZXhSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmpheGJpbmRleDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZU1vZGVsOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YkluZGV4UmVzb3VyY2UKLQkJZXh0ZW5kcyBKcHRSZXNvdXJjZU1vZGVsIHsKLQkKLQlTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKTsKLQkKLQlJdGVyYWJsZTxTdHJpbmc+IGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lcygpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF4YnByb3BzL0pheGJQcm9wZXJ0aWVzUmVzb3VyY2UuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2pheGJwcm9wcy9KYXhiUHJvcGVydGllc1Jlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMDkzMWEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF4YnByb3BzL0pheGJQcm9wZXJ0aWVzUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXhicHJvcHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VNb2RlbDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEpheGJQcm9wZXJ0aWVzUmVzb3VyY2UKLQkJZXh0ZW5kcyBKcHRSZXNvdXJjZU1vZGVsIHsKLQkKLQlTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKTsKLQkKLQlTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWFNETm9kZVZpc2l0b3IuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9YU0ROb2RlVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWM3YTQyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9YU0ROb2RlVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2g7Ci0KLQotcHVibGljIGNsYXNzIFhTRE5vZGVWaXNpdG9yIHsKLQkKLQlwcml2YXRlIFN0YWNrPFhTRENvbXBvbmVudD4gdmlzaXRlZE5vZGVTdGFjayA9IG5ldyBTdGFjazxYU0RDb21wb25lbnQ+KCk7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHRydWU7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmlzaXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIHRoaXMudmlzaXRDaGlsZHJlbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmlzaXROb2RlKFhTRENvbXBvbmVudCBub2RlKSB7Ci0JCWlmIChub2RlICE9IG51bGwgJiYgISB2aXNpdGVkTm9kZVN0YWNrLmNvbnRhaW5zKG5vZGUpKSB7Ci0JCQl2aXNpdGVkTm9kZVN0YWNrLnB1c2gobm9kZSk7Ci0JCQlYU0RTd2l0Y2ggeHNkU3dpdGNoID0gbmV3IFhTRFN3aXRjaCgpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgT2JqZWN0IGNhc2VYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbihYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBvYmplY3QpIHsKLQkJCQkJdmlzaXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbihvYmplY3QpOwotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIE9iamVjdCBjYXNlWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJCQkJdmlzaXRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24ob2JqZWN0KTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZVVzZShYU0RBdHRyaWJ1dGVVc2Ugb2JqZWN0KSB7Ci0JCQkJCXZpc2l0WFNEQXR0cmlidXRlVXNlKG9iamVjdCk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgT2JqZWN0IGNhc2VYU0RDb21wbGV4VHlwZURlZmluaXRpb24oWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIG9iamVjdCkgewotCQkJCQl2aXNpdFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbihvYmplY3QpOwotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIE9iamVjdCBjYXNlWFNERWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBvYmplY3QpIHsKLQkJCQkJdmlzaXRYU0RFbGVtZW50RGVjbGFyYXRpb24ob2JqZWN0KTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTRE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBvYmplY3QpIHsKLQkJCQkJdmlzaXRYU0RNb2RlbEdyb3VwKG9iamVjdCk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgT2JqZWN0IGNhc2VYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJCQkJdmlzaXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihvYmplY3QpOwotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIE9iamVjdCBjYXNlWFNEUGFydGljbGUoWFNEUGFydGljbGUgb2JqZWN0KSB7Ci0JCQkJCXZpc2l0WFNEUGFydGljbGUob2JqZWN0KTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIG9iamVjdCkgewotCQkJCQl2aXNpdFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKG9iamVjdCk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX07Ci0JCQl4c2RTd2l0Y2guZG9Td2l0Y2gobm9kZSk7Ci0JCQl2aXNpdGVkTm9kZVN0YWNrLnBvcCgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZpc2l0WFNEQXR0cmlidXRlRGVjbGFyYXRpb24oWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gbm9kZSkge30KLQkKLQlwdWJsaWMgdm9pZCB2aXNpdFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gbm9kZSkgewotCQlpZiAodmlzaXRDaGlsZHJlbigpKSB7Ci0JCQlmb3IgKFhTREF0dHJpYnV0ZVVzZSBhdHRyVXNlIDogbm9kZS5nZXRBdHRyaWJ1dGVVc2VzKCkpIHsKLQkJCQl2aXNpdE5vZGUoYXR0clVzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmlzaXRYU0RBdHRyaWJ1dGVVc2UoWFNEQXR0cmlidXRlVXNlIG5vZGUpIHt9Ci0JCi0JcHVibGljIHZvaWQgdmlzaXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0QmFzZVR5cGUoKSAhPSBudWxsKSB7Ci0JCQl2aXNpdE5vZGUobm9kZS5nZXRCYXNlVHlwZSgpKTsKLQkJfQotCQkKLQkJaWYgKHZpc2l0Q2hpbGRyZW4oKSkgewotCQkJZm9yIChYU0RBdHRyaWJ1dGVVc2UgYXR0clVzZSA6IG5vZGUuZ2V0QXR0cmlidXRlVXNlcygpKSB7Ci0JCQkJdmlzaXROb2RlKGF0dHJVc2UpOwotCQkJfQotCQkJCi0JCQlpZiAobm9kZS5nZXRDb250ZW50KCkgIT0gbnVsbCkgewotCQkJCXZpc2l0Tm9kZShub2RlLmdldENvbnRlbnQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmlzaXRYU0RFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJZm9yIChYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA6IG5vZGUuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKSkgewotCQkJdmlzaXROb2RlKGVsZW1lbnQpOwotCQl9Ci0JCQotCQlpZiAodmlzaXRDaGlsZHJlbigpKSB7Ci0JCQlpZiAobm9kZS5nZXRUeXBlRGVmaW5pdGlvbigpICE9IG51bGwpIHsKLQkJCQl2aXNpdE5vZGUobm9kZS5nZXRUeXBlRGVmaW5pdGlvbigpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2aXNpdFhTRE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBub2RlKSB7Ci0JCWlmICh2aXNpdENoaWxkcmVuKCkpIHsKLQkJCWZvciAoWFNEUGFydGljbGUgcGFydGljbGUgOiBub2RlLmdldFBhcnRpY2xlcygpKSB7Ci0JCQkJdmlzaXROb2RlKHBhcnRpY2xlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2aXNpdFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0TW9kZWxHcm91cCgpICE9IG51bGwpIHsKLQkJCXZpc2l0Tm9kZShub2RlLmdldE1vZGVsR3JvdXAoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmlzaXRYU0RQYXJ0aWNsZShYU0RQYXJ0aWNsZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldFRlcm0oKSAhPSBudWxsKSB7Ci0JCQl2aXNpdE5vZGUobm9kZS5nZXRUZXJtKCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZpc2l0WFNEU2ltcGxlVHlwZURlZmluaXRpb24oWFNEU2ltcGxlVHlwZURlZmluaXRpb24gbm9kZSkgewotCQlpZiAobm9kZS5nZXRCYXNlVHlwZSgpICE9IG51bGwpIHsKLQkJCXZpc2l0Tm9kZShub2RlLmdldEJhc2VUeXBlKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZEF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY1NGFhMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBYc2RBdHRyaWJ1dGVEZWNsYXJhdGlvbgotCQlleHRlbmRzIFhzZEZlYXR1cmU8WFNEQXR0cmlidXRlRGVjbGFyYXRpb24+IHsKLQkKLQlYc2RBdHRyaWJ1dGVEZWNsYXJhdGlvbihYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgewotCQlzdXBlcih4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbik7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYc2RUeXBlRGVmaW5pdGlvbiBnZXRUeXBlKCkgewotCQlYU0RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlID0gZ2V0WFNEQ29tcG9uZW50KCkuZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHhzZFR5cGUgPT0gbnVsbCkgPyBudWxsIDogKFhzZFR5cGVEZWZpbml0aW9uKSBYc2RVdGlsLmdldEFkYXB0ZXIoeHNkVHlwZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHR5cGVJc1ZhbGlkKFhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUsIGJvb2xlYW4gaXNJdGVtVHlwZSkgewotCQlyZXR1cm4gZ2V0VHlwZSgpLnR5cGVJc1ZhbGlkKHhzZFR5cGUsIGlzSXRlbVR5cGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZlYjFiMy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgWHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uCi0JCWV4dGVuZHMgWHNkQ29tcG9uZW50PFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbj4gewotCQotCVhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24geHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSB7Ci0JCXN1cGVyKHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZEF0dHJpYnV0ZVVzZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZEF0dHJpYnV0ZVVzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTljZmQzLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RBdHRyaWJ1dGVVc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLQotCi1wdWJsaWMgY2xhc3MgWHNkQXR0cmlidXRlVXNlCi0JCWV4dGVuZHMgWHNkQ29tcG9uZW50PFhTREF0dHJpYnV0ZVVzZT4gewotCQotCQotCVhzZEF0dHJpYnV0ZVVzZShYU0RBdHRyaWJ1dGVVc2UgeHNkQXR0cmlidXRlVXNlKSB7Ci0JCXN1cGVyKHhzZEF0dHJpYnV0ZVVzZSk7Ci0JfQotCQotCQotCXB1YmxpYyBYc2RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpIHsKLQkJWFNEQXR0cmlidXRlRGVjbGFyYXRpb24geHNkQXR0cmlidXRlID0gZ2V0WFNEQ29tcG9uZW50KCkuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLQkJcmV0dXJuICh4c2RBdHRyaWJ1dGUgPT0gbnVsbCkgPyBudWxsIDogKFhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uKSBYc2RVdGlsLmdldEFkYXB0ZXIoeHNkQXR0cmlidXRlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMDI5MDcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29udGVudFR5cGVDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBYc2RDb21wbGV4VHlwZURlZmluaXRpb24KLQkJZXh0ZW5kcyBYc2RUeXBlRGVmaW5pdGlvbjxYU0RDb21wbGV4VHlwZURlZmluaXRpb24+IHsKLQkKLQlYc2RDb21wbGV4VHlwZURlZmluaXRpb24oWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbikgewotCQlzdXBlcih4c2RDb21wbGV4VHlwZURlZmluaXRpb24pOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVHlwZURlZmluaXRpb24uS2luZCBnZXRLaW5kKCkgewotCQlyZXR1cm4gS2luZC5DT01QTEVYOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBoYXNUZXh0Q29udGVudCgpIHsKLQkJcmV0dXJuIGdldFhTRENvbXBvbmVudCgpLmdldENvbnRlbnRUeXBlQ2F0ZWdvcnkoKSA9PSBYU0RDb250ZW50VHlwZUNhdGVnb3J5LlNJTVBMRV9MSVRFUkFMOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWHNkQXR0cmlidXRlVXNlIGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkgewotCQlmb3IgKFhzZEF0dHJpYnV0ZVVzZSBhdHRyVXNlIDogZ2V0QXR0cmlidXRlVXNlcyhuYW1lc3BhY2UpKSB7Ci0JCQlpZiAoYXR0clVzZS5nZXRYU0RDb21wb25lbnQoKS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gYXR0clVzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QXR0cmlidXRlTmFtZXMoU3RyaW5nIG5hbWVzcGFjZSkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8WHNkQXR0cmlidXRlVXNlLCBTdHJpbmc+KGdldEF0dHJpYnV0ZVVzZXMobmFtZXNwYWNlKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFhzZEF0dHJpYnV0ZVVzZSBhdHRyVXNlKSB7Ci0JCQkJCXJldHVybiBhdHRyVXNlLmdldFhTRENvbXBvbmVudCgpLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX07Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxYc2RBdHRyaWJ1dGVVc2U+IGdldEF0dHJpYnV0ZVVzZXMoZmluYWwgU3RyaW5nIG5hbWVzcGFjZSkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8WFNEQXR0cmlidXRlVXNlLCBYc2RBdHRyaWJ1dGVVc2U+KAotCQkJCW5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxYU0RBdHRyaWJ1dGVVc2U+KGdldFhTRENvbXBvbmVudCgpLmdldEF0dHJpYnV0ZVVzZXMoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFhTREF0dHJpYnV0ZVVzZSBhdHRyVXNlKSB7Ci0JCQkJCQlyZXR1cm4gWHNkVXRpbC5uYW1lc3BhY2VFcXVhbHMoYXR0clVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLCBuYW1lc3BhY2UpOwotCQkJCQl9Ci0JCQkJfSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgWHNkQXR0cmlidXRlVXNlIHRyYW5zZm9ybShYU0RBdHRyaWJ1dGVVc2UgYXR0clVzZSkgewotCQkJCXJldHVybiAoWHNkQXR0cmlidXRlVXNlKSBYc2RVdGlsLmdldEFkYXB0ZXIoYXR0clVzZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYc2RFbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiByZWN1cnNlQ2hpbGRyZW4pIHsKLQkJZm9yIChYc2RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA6IGdldEVsZW1lbnREZWNsYXJhdGlvbnMobmFtZXNwYWNlLCByZWN1cnNlQ2hpbGRyZW4pKSB7Ci0JCQlpZiAoZWxlbWVudC5nZXRYU0RDb21wb25lbnQoKS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEVsZW1lbnROYW1lcyhTdHJpbmcgbmFtZXNwYWNlLCBib29sZWFuIHJlY3Vyc2VDaGlsZHJlbikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8WHNkRWxlbWVudERlY2xhcmF0aW9uLCBTdHJpbmc+KGdldEVsZW1lbnREZWNsYXJhdGlvbnMobmFtZXNwYWNlLCByZWN1cnNlQ2hpbGRyZW4pKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oWHNkRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQuZ2V0WFNEQ29tcG9uZW50KCkuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX07Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxYc2RFbGVtZW50RGVjbGFyYXRpb24+IGdldEVsZW1lbnREZWNsYXJhdGlvbnMoZmluYWwgU3RyaW5nIG5hbWVzcGFjZSwgYm9vbGVhbiByZWN1cnNlQ2hpbGRyZW4pIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFhTREVsZW1lbnREZWNsYXJhdGlvbiwgWHNkRWxlbWVudERlY2xhcmF0aW9uPigKLQkJCQluZXcgRmlsdGVyaW5nSXRlcmFibGU8WFNERWxlbWVudERlY2xhcmF0aW9uPihnZXRYU0RFbGVtZW50RGVjbGFyYXRpb25zKHJlY3Vyc2VDaGlsZHJlbikpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkgewotCQkJCQkJcmV0dXJuIFhzZFV0aWwubmFtZXNwYWNlRXF1YWxzKGVsZW1lbnQsIG5hbWVzcGFjZSk7Ci0JCQkJCX0KLQkJCQl9KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBYc2RFbGVtZW50RGVjbGFyYXRpb24gdHJhbnNmb3JtKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIChYc2RFbGVtZW50RGVjbGFyYXRpb24pIFhzZFV0aWwuZ2V0QWRhcHRlcihlbGVtZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFhTREVsZW1lbnREZWNsYXJhdGlvbj4gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9ucyhib29sZWFuIHJlY3Vyc2VDaGlsZHJlbikgewotCQlFbGVtZW50RmluZGVyIGVsZW1lbnRGaW5kZXIgPSBuZXcgRWxlbWVudEZpbmRlcihyZWN1cnNlQ2hpbGRyZW4pOwotCQllbGVtZW50RmluZGVyLnZpc2l0Tm9kZShnZXRYU0RDb21wb25lbnQoKSk7Ci0JCXJldHVybiBlbGVtZW50RmluZGVyLmdldEVsZW1lbnRzKCk7Ci0JfQotCQotCQotCXByaXZhdGUgY2xhc3MgRWxlbWVudEZpbmRlcgotCQkJZXh0ZW5kcyBYU0ROb2RlVmlzaXRvciB7Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gcmVjdXJzZUNoaWxkcmVuOwotCQkKLQkJcHJpdmF0ZSBMaXN0PFhTREVsZW1lbnREZWNsYXJhdGlvbj4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PFhTREVsZW1lbnREZWNsYXJhdGlvbj4oKTsKLQkJCi0JCQotCQlwcml2YXRlIEVsZW1lbnRGaW5kZXIoYm9vbGVhbiByZWN1cnNlQ2hpbGRyZW4pIHsKLQkJCXRoaXMucmVjdXJzZUNoaWxkcmVuID0gcmVjdXJzZUNoaWxkcmVuOwotCQl9Ci0JCQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBib29sZWFuIHZpc2l0Q2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gc3VwZXIudmlzaXRDaGlsZHJlbigpIHx8IHRoaXMucmVjdXJzZUNoaWxkcmVuOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdmlzaXRYU0RFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJCWJvb2xlYW4gY2FjaGVkVmlzaXRDaGlsZHJlbiA9IHRoaXMudmlzaXRDaGlsZHJlbjsKLQkJCXRoaXMudmlzaXRDaGlsZHJlbiA9IGZhbHNlOwotCQkJc3VwZXIudmlzaXRYU0RFbGVtZW50RGVjbGFyYXRpb24obm9kZSk7Ci0JCQlpZiAoISB0aGlzLmVsZW1lbnRzLmNvbnRhaW5zKG5vZGUpKSB7Ci0JCQkJZWxlbWVudHMuYWRkKG5vZGUpOwotCQkJfQotCQkJdGhpcy52aXNpdENoaWxkcmVuID0gY2FjaGVkVmlzaXRDaGlsZHJlbjsKLQkJfQotCQkKLQkJcHVibGljIEl0ZXJhYmxlPFhTREVsZW1lbnREZWNsYXJhdGlvbj4gZ2V0RWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbGVtZW50czsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RDb21wb25lbnQuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RDb21wb25lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI3ZmVjNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFhzZENvbXBvbmVudDxBIGV4dGVuZHMgWFNEQ29uY3JldGVDb21wb25lbnQ+Ci0JCWV4dGVuZHMgQWRhcHRlckltcGwgewotCQotCXByb3RlY3RlZCBmaW5hbCBBIHhzZENvbXBvbmVudDsKLQkKLQkKLQlwcm90ZWN0ZWQgWHNkQ29tcG9uZW50KEEgeHNkQ29tcG9uZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMueHNkQ29tcG9uZW50ID0geHNkQ29tcG9uZW50OwotCX0KLQkKLQkKLQlwdWJsaWMgQSBnZXRYU0RDb21wb25lbnQoKSB7Ci0JCXJldHVybiB0aGlzLnhzZENvbXBvbmVudDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSBYc2RVdGlsLmFkYXB0ZXJGYWN0b3J5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RFbGVtZW50RGVjbGFyYXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RFbGVtZW50RGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY5NTcyZi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkRWxlbWVudERlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBBZGRzIEFQSSB0byB7QGxpbmsgWFNERWxlbWVudERlY2xhcmF0aW9ufS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgWHNkRWxlbWVudERlY2xhcmF0aW9uCi0JCWV4dGVuZHMgWHNkRmVhdHVyZTxYU0RFbGVtZW50RGVjbGFyYXRpb24+IHsKLQkKLQlYc2RFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbikgewotCQlzdXBlcih4c2RFbGVtZW50RGVjbGFyYXRpb24pOwotCX0KLQkKLQkKLQlwdWJsaWMgWFNERWxlbWVudERlY2xhcmF0aW9uIGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIGdldFhTREZlYXR1cmUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhzZFR5cGVEZWZpbml0aW9uIGdldFR5cGUoKSB7Ci0JCVhTRFR5cGVEZWZpbml0aW9uIHhzZFR5cGUgPSBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotCQlyZXR1cm4gKHhzZFR5cGUgPT0gbnVsbCkgPyBudWxsIDogKFhzZFR5cGVEZWZpbml0aW9uKSBYc2RVdGlsLmdldEFkYXB0ZXIoeHNkVHlwZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHR5cGVJc1ZhbGlkKFhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUsIGJvb2xlYW4gaXNJdGVtVHlwZSkgewotCQlYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudCA9IGdldFhTRENvbXBvbmVudCgpOwotCQlib29sZWFuIGFsbG93RXh0ZW5zaW9uID0gdHJ1ZTsKLQkJYm9vbGVhbiBhbGxvd1Jlc3RyaWN0aW9uID0gdHJ1ZTsKLQkJWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZFN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24gPSB4c2RFbGVtZW50LmdldFN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24oKTsKLQkJaWYgKHhzZFN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24gIT0gbnVsbCkgewotCQkJRUxpc3Q8WFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zPiB4c2RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMgCi0JCQkJCT0geHNkU3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbi5nZXRTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMoKTsKLQkJCWFsbG93RXh0ZW5zaW9uID0gISB4c2RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMuY29udGFpbnMoWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zLkVYVEVOU0lPTl9MSVRFUkFMKTsKLQkJCWFsbG93UmVzdHJpY3Rpb24gPSAhIHhzZFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucy5jb250YWlucyhYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMuUkVTVFJJQ1RJT05fTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGdldFR5cGUoKS50eXBlSXNWYWxpZCh4c2RUeXBlLCBpc0l0ZW1UeXBlLCBhbGxvd0V4dGVuc2lvbiwgYWxsb3dSZXN0cmljdGlvbik7Ci0JfQotCQotCXB1YmxpYyBYc2RFbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkgewotCQlYc2RUeXBlRGVmaW5pdGlvbiB0eXBlID0gZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gbnVsbCkgPyBudWxsIDogdHlwZS5nZXRFbGVtZW50KG5hbWVzcGFjZSwgbmFtZSk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEVsZW1lbnROYW1lUHJvcG9zYWxzKFN0cmluZyBuYW1lc3BhY2UsIEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gZ2V0VHlwZSgpLmdldEVsZW1lbnROYW1lUHJvcG9zYWxzKG5hbWVzcGFjZSwgZmlsdGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkRmVhdHVyZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZEZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwZjY5ZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGZWF0dXJlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYc2RGZWF0dXJlPEEgZXh0ZW5kcyBYU0RGZWF0dXJlPgotCQlleHRlbmRzIFhzZENvbXBvbmVudDxBPiB7Ci0JCi0JcHJvdGVjdGVkIFhzZEZlYXR1cmUoQSB4c2RGZWF0dXJlKSB7Ci0JCXN1cGVyKHhzZEZlYXR1cmUpOwotCX0KLQkKLQkKLQlwdWJsaWMgQSBnZXRYU0RGZWF0dXJlKCkgewotCQlyZXR1cm4gZ2V0WFNEQ29tcG9uZW50KCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldFhTREZlYXR1cmUoKS5nZXROYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBYc2RUeXBlRGVmaW5pdGlvbiBnZXRUeXBlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIHNjaGVtYSB0eXBlIGlzIHZhbGlkIHdpdGhpbiB0aGUgZmVhdHVyZQotCSAqIEBwYXJhbSBpc0l0ZW1UeXBlIGRldGVybWluZXMgd2hldGhlciB0aGUgeHNkVHlwZSBzaG91bGQgaW5zdGVhZCBiZSB0cmVhdGVkIGFzIGFuIGl0ZW0gdHlwZQotCSAqICAgd2l0aGluIGEgbGlzdAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHR5cGVJc1ZhbGlkKFhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUsIGJvb2xlYW4gaXNJdGVtVHlwZSk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkTW9kZWxHcm91cC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZE1vZGVsR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNkYTA3Yi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkTW9kZWxHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotCi0KLXB1YmxpYyBjbGFzcyBYc2RNb2RlbEdyb3VwCi0JCWV4dGVuZHMgWHNkQ29tcG9uZW50PFhTRE1vZGVsR3JvdXA+IHsKLQkKLQlYc2RNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCkgewotCQlzdXBlcih4c2RNb2RlbEdyb3VwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkTW9kZWxHcm91cERlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTljMmE3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgWHNkTW9kZWxHcm91cERlZmluaXRpb24KLQkJZXh0ZW5kcyBYc2RDb21wb25lbnQ8WFNETW9kZWxHcm91cERlZmluaXRpb24+IHsKLQkKLQlYc2RNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbikgewotCQlzdXBlcih4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbik7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RQYXJ0aWNsZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZFBhcnRpY2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYmJmOWMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZFBhcnRpY2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotCi0KLXB1YmxpYyBjbGFzcyBYc2RQYXJ0aWNsZQotCQlleHRlbmRzIFhzZENvbXBvbmVudDxYU0RQYXJ0aWNsZT4gewotCi0JWHNkUGFydGljbGUoWFNEUGFydGljbGUgeHNkUGFydGljbGUpIHsKLQkJc3VwZXIoeHNkUGFydGljbGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RTY2hlbWEuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RTY2hlbWEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZjMzFkMC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkU2NoZW1hLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNuYXBzaG90Q2xvbmVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEVXRpbDsKLQotcHVibGljIGNsYXNzIFhzZFNjaGVtYQotCQlleHRlbmRzIFhzZENvbXBvbmVudDxYU0RTY2hlbWE+IHsKLQkKLQlYc2RTY2hlbWEoWFNEU2NoZW1hIHhzZFNjaGVtYSkgewotCQlzdXBlcih4c2RTY2hlbWEpOwotCX0KLQkKLQkKLQlwdWJsaWMgWFNEU2NoZW1hIGdldFhTRFNjaGVtYSgpIHsKLQkJcmV0dXJuIGdldFhTRENvbXBvbmVudCgpOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXROYW1lc3BhY2VzKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IG5ldyBTbmFwc2hvdENsb25lSXRlcmFibGUoZ2V0WFNEU2NoZW1hKCkuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpLnZhbHVlcygpKTsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZ2V0WFNEU2NoZW1hKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0JCQlyZXN1bHQgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigiIiwgcmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8WHNkVHlwZURlZmluaXRpb24+IGdldEFsbFR5cGVEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFhTRFR5cGVEZWZpbml0aW9uLCBYc2RUeXBlRGVmaW5pdGlvbj4oZ2V0QWxsWFNEVHlwZURlZmluaXRpb25zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFhzZFR5cGVEZWZpbml0aW9uIHRyYW5zZm9ybShYU0RUeXBlRGVmaW5pdGlvbiBvKSB7Ci0JCQkJcmV0dXJuIChYc2RUeXBlRGVmaW5pdGlvbikgWHNkVXRpbC5nZXRBZGFwdGVyKG8pOwotCQkJfQotCQl9OwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8WHNkVHlwZURlZmluaXRpb24+IGdldERlY2xhcmVkVHlwZURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8WFNEVHlwZURlZmluaXRpb24sIFhzZFR5cGVEZWZpbml0aW9uPihnZXREZWNsYXJlZFhTRFR5cGVEZWZpbml0aW9ucygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBYc2RUeXBlRGVmaW5pdGlvbiB0cmFuc2Zvcm0oWFNEVHlwZURlZmluaXRpb24gbykgewotCQkJCXJldHVybiAoWHNkVHlwZURlZmluaXRpb24pIFhzZFV0aWwuZ2V0QWRhcHRlcihvKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPFhzZFR5cGVEZWZpbml0aW9uPiBnZXRCdWlsdEluVHlwZURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8WFNEVHlwZURlZmluaXRpb24sIFhzZFR5cGVEZWZpbml0aW9uPihnZXRCdWlsdEluWFNEVHlwZURlZmluaXRpb25zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFhzZFR5cGVEZWZpbml0aW9uIHRyYW5zZm9ybShYU0RUeXBlRGVmaW5pdGlvbiBvKSB7Ci0JCQkJcmV0dXJuIChYc2RUeXBlRGVmaW5pdGlvbikgWHNkVXRpbC5nZXRBZGFwdGVyKG8pOwotCQkJfQotCQl9OwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8WHNkVHlwZURlZmluaXRpb24+IGdldFR5cGVEZWZpbml0aW9ucyhmaW5hbCBTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxYU0RUeXBlRGVmaW5pdGlvbiwgWHNkVHlwZURlZmluaXRpb24+KGdldFhTRFR5cGVEZWZpbml0aW9ucyhuYW1lc3BhY2UpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBYc2RUeXBlRGVmaW5pdGlvbiB0cmFuc2Zvcm0oWFNEVHlwZURlZmluaXRpb24gbykgewotCQkJCXJldHVybiAoWHNkVHlwZURlZmluaXRpb24pIFhzZFV0aWwuZ2V0QWRhcHRlcihvKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPFhzZFNpbXBsZVR5cGVEZWZpbml0aW9uPiBnZXRTaW1wbGVUeXBlRGVmaW5pdGlvbnMoZmluYWwgU3RyaW5nIG5hbWVzcGFjZSkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8WFNEU2ltcGxlVHlwZURlZmluaXRpb24sIFhzZFNpbXBsZVR5cGVEZWZpbml0aW9uPigKLQkJCQlnZXRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbnMobmFtZXNwYWNlKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgWHNkU2ltcGxlVHlwZURlZmluaXRpb24gdHJhbnNmb3JtKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIG8pIHsKLQkJCQlyZXR1cm4gKFhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKSBYc2RVdGlsLmdldEFkYXB0ZXIobyk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIGJ5IGRlZmF1bHQsIHJldHVybiBhIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdGhlIHNjaGVtYSdzIHRhcmdldCBuYW1lc3BhY2UKLQkgKi8KLQlwdWJsaWMgWHNkVHlwZURlZmluaXRpb24gZ2V0VHlwZURlZmluaXRpb24oU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdldFR5cGVEZWZpbml0aW9uKGdldFhTRENvbXBvbmVudCgpLmdldFRhcmdldE5hbWVzcGFjZSgpLCBuYW1lKTsKLQl9Ci0JCi0JcHVibGljIFhzZFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoWFNEVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24gOiBnZXRYU0RUeXBlRGVmaW5pdGlvbnMobmFtZXNwYWNlKSkgewotCQkJaWYgKFhzZFV0aWwubmFtZXNwYWNlRXF1YWxzKHR5cGVEZWZpbml0aW9uLCBuYW1lc3BhY2UpICYmIHR5cGVEZWZpbml0aW9uLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gKFhzZFR5cGVEZWZpbml0aW9uKSBYc2RVdGlsLmdldEFkYXB0ZXIodHlwZURlZmluaXRpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmFibGU8WFNEVHlwZURlZmluaXRpb24+IGdldEFsbFhTRFR5cGVEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxYU0RUeXBlRGVmaW5pdGlvbj4oCi0JCQkJZ2V0RGVjbGFyZWRYU0RUeXBlRGVmaW5pdGlvbnMoKSwgZ2V0QnVpbHRJblhTRFR5cGVEZWZpbml0aW9ucygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFhTRFR5cGVEZWZpbml0aW9uPiBnZXREZWNsYXJlZFhTRFR5cGVEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBTbmFwc2hvdENsb25lSXRlcmFibGUoZ2V0WFNEU2NoZW1hKCkuZ2V0VHlwZURlZmluaXRpb25zKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmFibGU8WFNEVHlwZURlZmluaXRpb24+IGdldEJ1aWx0SW5YU0RUeXBlRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgU25hcHNob3RDbG9uZUl0ZXJhYmxlKGdldFhTRFNjaGVtYSgpLmdldFNjaGVtYUZvclNjaGVtYSgpLmdldFR5cGVEZWZpbml0aW9ucygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFhTRFR5cGVEZWZpbml0aW9uPiBnZXRYU0RUeXBlRGVmaW5pdGlvbnMoZmluYWwgU3RyaW5nIG5hbWVzcGFjZSkgewotCQlpZiAoWFNEVXRpbC5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMS5lcXVhbHMobmFtZXNwYWNlKSkgewotCQkJcmV0dXJuIGdldEJ1aWx0SW5YU0RUeXBlRGVmaW5pdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFhTRFR5cGVEZWZpbml0aW9uPihnZXREZWNsYXJlZFhTRFR5cGVEZWZpbml0aW9ucygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChYU0RUeXBlRGVmaW5pdGlvbiBvKSB7Ci0JCQkJcmV0dXJuIFhzZFV0aWwubmFtZXNwYWNlRXF1YWxzKG8sIG5hbWVzcGFjZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbj4gZ2V0WFNEU2ltcGxlVHlwZURlZmluaXRpb25zKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFhTRFR5cGVEZWZpbml0aW9uLCBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbj4oCi0JCQluZXcgRmlsdGVyaW5nSXRlcmFibGU8WFNEVHlwZURlZmluaXRpb24+KGdldFhTRFR5cGVEZWZpbml0aW9ucyhuYW1lc3BhY2UpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFhTRFR5cGVEZWZpbml0aW9uIG8pIHsKLQkJCQkJcmV0dXJuIG8gaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLQkJCQl9Ci0JCQl9KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0cmFuc2Zvcm0oWFNEVHlwZURlZmluaXRpb24gbykgewotCQkJCXJldHVybiAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIG87Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxYc2RFbGVtZW50RGVjbGFyYXRpb24+IGdldEVsZW1lbnREZWNsYXJhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxYU0RFbGVtZW50RGVjbGFyYXRpb24sIFhzZEVsZW1lbnREZWNsYXJhdGlvbj4oZ2V0WFNERWxlbWVudERlY2xhcmF0aW9ucygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBYc2RFbGVtZW50RGVjbGFyYXRpb24gdHJhbnNmb3JtKFhTREVsZW1lbnREZWNsYXJhdGlvbiBvKSB7Ci0JCQkJcmV0dXJuIChYc2RFbGVtZW50RGVjbGFyYXRpb24pIFhzZFV0aWwuZ2V0QWRhcHRlcihvKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPFhzZEVsZW1lbnREZWNsYXJhdGlvbj4gZ2V0RWxlbWVudERlY2xhcmF0aW9ucyhmaW5hbCBTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxYU0RFbGVtZW50RGVjbGFyYXRpb24sIFhzZEVsZW1lbnREZWNsYXJhdGlvbj4oCi0JCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFhTREVsZW1lbnREZWNsYXJhdGlvbj4oZ2V0WFNERWxlbWVudERlY2xhcmF0aW9ucygpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoWFNERWxlbWVudERlY2xhcmF0aW9uIG8pIHsKLQkJCQkJCXJldHVybiBYc2RVdGlsLm5hbWVzcGFjZUVxdWFscyhvLCBuYW1lc3BhY2UpOwotCQkJCQl9Ci0JCQkJfSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgWHNkRWxlbWVudERlY2xhcmF0aW9uIHRyYW5zZm9ybShYU0RFbGVtZW50RGVjbGFyYXRpb24gbykgewotCQkJCXJldHVybiAoWHNkRWxlbWVudERlY2xhcmF0aW9uKSBYc2RVdGlsLmdldEFkYXB0ZXIobyk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXB1YmxpYyBYc2RFbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudERlY2xhcmF0aW9uKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA6IGdldFhTREVsZW1lbnREZWNsYXJhdGlvbnMoKSkgewotCQkJaWYgKFhzZFV0aWwubmFtZXNwYWNlRXF1YWxzKGVsZW1lbnREZWNsYXJhdGlvbiwgbmFtZXNwYWNlKSAmJiBlbGVtZW50RGVjbGFyYXRpb24uZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiAoWHNkRWxlbWVudERlY2xhcmF0aW9uKSBYc2RVdGlsLmdldEFkYXB0ZXIoZWxlbWVudERlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFhTREVsZW1lbnREZWNsYXJhdGlvbj4gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBTbmFwc2hvdENsb25lSXRlcmFibGUoZ2V0WFNEU2NoZW1hKCkuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXROYW1lc3BhY2VQcm9wb3NhbHMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHMoCi0JCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4oZ2V0TmFtZXNwYWNlcygpLCBmaWx0ZXIpKTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0VHlwZU5hbWVQcm9wb3NhbHMoU3RyaW5nIG5hbWVzcGFjZSwgRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHMoCi0JCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4oCi0JCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFhzZFR5cGVEZWZpbml0aW9uLCBTdHJpbmc+KHRoaXMuZ2V0VHlwZURlZmluaXRpb25zKG5hbWVzcGFjZSkpIHsKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oWHNkVHlwZURlZmluaXRpb24gbykgewotCQkJCQkJCXJldHVybiBvLmdldE5hbWUoKTsKLQkJCQkJCX0KLQkJCQkJfSwKLQkJCQkJZmlsdGVyKSk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFNpbXBsZVR5cGVOYW1lUHJvcG9zYWxzKFN0cmluZyBuYW1lc3BhY2UsIEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxzKAotCQkJCW5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxTdHJpbmc+KAotCQkJCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8WHNkU2ltcGxlVHlwZURlZmluaXRpb24sIFN0cmluZz4odGhpcy5nZXRTaW1wbGVUeXBlRGVmaW5pdGlvbnMobmFtZXNwYWNlKSkgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFhzZFNpbXBsZVR5cGVEZWZpbml0aW9uIG8pIHsKLQkJCQkJCQkJcmV0dXJuIG8uZ2V0TmFtZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0sCi0JCQkJCQlmaWx0ZXIpKTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0RWxlbWVudE5hbWVQcm9wb3NhbHMoU3RyaW5nIG5hbWVzcGFjZSwgRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHMoCi0JCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4oCi0JCQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxYc2RFbGVtZW50RGVjbGFyYXRpb24sIFN0cmluZz4odGhpcy5nZXRFbGVtZW50RGVjbGFyYXRpb25zKG5hbWVzcGFjZSkpIHsKLQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShYc2RFbGVtZW50RGVjbGFyYXRpb24gbykgewotCQkJCQkJCQlyZXR1cm4gby5nZXROYW1lKCk7Ci0JCQkJCQkJfQotCQkJCQkJfSwKLQkJCQkJCWZpbHRlcikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNDY3YmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERW51bWVyYXRpb25GYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFZhcmlldHk7Ci0KLQotcHVibGljIGNsYXNzIFhzZFNpbXBsZVR5cGVEZWZpbml0aW9uCi0JCWV4dGVuZHMgWHNkVHlwZURlZmluaXRpb248WFNEU2ltcGxlVHlwZURlZmluaXRpb24+IHsKLQkKLQlYc2RTaW1wbGVUeXBlRGVmaW5pdGlvbihYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbikgewotCQlzdXBlcih4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbik7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RUeXBlRGVmaW5pdGlvbi5LaW5kIGdldEtpbmQoKSB7Ci0JCXJldHVybiBLaW5kLlNJTVBMRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaGFzVGV4dENvbnRlbnQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB0eXBlSXNWYWxpZChYc2RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlLCBib29sZWFuIGlzSXRlbVR5cGUsIGJvb2xlYW4gYWxsb3dFeHRlbnNpb24sIGJvb2xlYW4gYWxsb3dSZXN0cmljdGlvbikgewotCQlpZiAoaXNJdGVtVHlwZSkgewotCQkJWHNkU2ltcGxlVHlwZURlZmluaXRpb24gaXRlbVR5cGUgPSBnZXRJdGVtVHlwZSgpOwotCQkJcmV0dXJuIChpdGVtVHlwZSA9PSBudWxsKSA/IGZhbHNlIDogaXRlbVR5cGUudHlwZUlzVmFsaWQoeHNkVHlwZSwgZmFsc2UsIGFsbG93RXh0ZW5zaW9uLCBhbGxvd1Jlc3RyaWN0aW9uKTsKLQkJfQotCQlpZiAoZ2V0WFNEQ29tcG9uZW50KCkuZ2V0VmFyaWV0eSgpID09IFhTRFZhcmlldHkuVU5JT05fTElURVJBTCkgewotCQkJaWYgKFhzZFV0aWwuZ2V0U2NoZW1hRm9yU2NoZW1hKCkuZ2V0VHlwZURlZmluaXRpb24oInN0cmluZyIpLnR5cGVJc1ZhbGlkKHhzZFR5cGUsIGlzSXRlbVR5cGUsIGFsbG93RXh0ZW5zaW9uLCBhbGxvd1Jlc3RyaWN0aW9uKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci50eXBlSXNWYWxpZCh4c2RUeXBlLCBpc0l0ZW1UeXBlLCBhbGxvd0V4dGVuc2lvbiwgYWxsb3dSZXN0cmljdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZSB0eXBlIGlzIG9mIHZhcmlldHkgTElTVCwgdGhpcyB3aWxsIHJldHVybiB0aGUgaXRlbSB0eXBlIG9mIHRoZSBsaXN0Ci0JICovCi0JcHVibGljIFhzZFNpbXBsZVR5cGVEZWZpbml0aW9uIGdldEl0ZW1UeXBlKCkgewotCQlYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RJdGVtVHlwZSA9IGdldFhTRENvbXBvbmVudCgpLmdldEl0ZW1UeXBlRGVmaW5pdGlvbigpOwotCQlyZXR1cm4gKHhzZEl0ZW1UeXBlID09IG51bGwpID8gbnVsbCA6IChYc2RTaW1wbGVUeXBlRGVmaW5pdGlvbikgWHNkVXRpbC5nZXRBZGFwdGVyKHhzZEl0ZW1UeXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIHR5cGUgaXMgb2YgdmFyaWV0eSBVTklPTiwgdGhpcyB3aWxsIHJldHVybiB0aGUgbWVtYmVyIHR5cGVzIG9mIHRoZSB1bmlvbgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTxYc2RTaW1wbGVUeXBlRGVmaW5pdGlvbj4gZ2V0TWVtYmVyVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiwgWHNkU2ltcGxlVHlwZURlZmluaXRpb24+KAotCQkJCWdldFhTRENvbXBvbmVudCgpLmdldE1lbWJlclR5cGVEZWZpbml0aW9ucygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBYc2RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0cmFuc2Zvcm0oWFNEU2ltcGxlVHlwZURlZmluaXRpb24gbykgewotCQkJCXJldHVybiAoWHNkU2ltcGxlVHlwZURlZmluaXRpb24pIFhzZFV0aWwuZ2V0QWRhcHRlcihvKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhzZEF0dHJpYnV0ZVVzZSBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpIHsKLQkJLy8gc2ltcGxlIHR5cGVzIGhhdmUgbm8gYXR0cmlidXRlcwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QXR0cmlidXRlTmFtZXMoU3RyaW5nIG5hbWVzcGFjZSkgewotCQkvLyBzaW1wbGUgdHlwZXMgaGF2ZSBubyBhdHRyaWJ1dGVzCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYc2RFbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiByZWN1cnNlQ2hpbGRyZW4pIHsKLQkJLy8gc2ltcGxlIHR5cGVzIGhhdmUgbm8gZWxlbWVudHMKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEVsZW1lbnROYW1lcyhTdHJpbmcgbmFtZXNwYWNlLCBib29sZWFuIHJlY3Vyc2VDaGlsZHJlbikgewotCQkvLyBzaW1wbGUgdHlwZXMgaGF2ZSBubyBlbGVtZW50cwotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRFbnVtVmFsdWVQcm9wb3NhbHMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHMoCi0JCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4oCi0JCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFhTREVudW1lcmF0aW9uRmFjZXQsIFN0cmluZz4oZ2V0WFNEQ29tcG9uZW50KCkuZ2V0RW51bWVyYXRpb25GYWNldHMoKSkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCkgewotCQkJCQkJCXJldHVybiBlbnVtRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0sCi0JCQkJCWZpbHRlcikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RUeXBlRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZFR5cGVEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMDFhNDcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZFR5cGVEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi0vKioKLSAqIEFkZHMgQVBJIHRvIHtAbGluayBYU0RUeXBlRGVmaW5pdGlvbn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFhzZFR5cGVEZWZpbml0aW9uPEEgZXh0ZW5kcyBYU0RUeXBlRGVmaW5pdGlvbj4KLQkJZXh0ZW5kcyBYc2RDb21wb25lbnQ8QT4gewotCQotCXByb3RlY3RlZCBYc2RUeXBlRGVmaW5pdGlvbihBIHhzZFR5cGVEZWZpbml0aW9uKSB7Ci0JCXN1cGVyKHhzZFR5cGVEZWZpbml0aW9uKTsKLQl9Ci0JCi0JCi0JLy8gZm9yIHNvbWUgcmVhc29uLCB0aGUgY29tcGlsZXIgaXMgbm90IHJlY29nbml6aW5nIHRoZSBYU0QgY29tcG9uZW50IG9mIHRoaXMgdHlwZSBhcyBleHRlbmRpbmcKLQkvLyBYU0RUeXBlRGVmaW5pdGlvbiB3aXRob3V0IGltcGxlbWVudGluZyB0aGlzIG1ldGhvZC4KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQSBnZXRYU0RDb21wb25lbnQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRYU0RDb21wb25lbnQoKTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IEtpbmQgZ2V0S2luZCgpOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldFhTRENvbXBvbmVudCgpLmdldE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzVGV4dENvbnRlbnQoKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBYc2RVdGlsLm5hbWVzcGFjZUVxdWFscyhnZXRYU0RDb21wb25lbnQoKSwgbmFtZXNwYWNlKSAmJiBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoZ2V0TmFtZSgpLCBuYW1lKTsgCi0JfQotCQotCXB1YmxpYyBib29sZWFuIHR5cGVJc1ZhbGlkKFhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUsIGJvb2xlYW4gaXNJdGVtVHlwZSkgewotCQlyZXR1cm4gdHlwZUlzVmFsaWQoeHNkVHlwZSwgaXNJdGVtVHlwZSwgdHJ1ZSwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHR5cGVJc1ZhbGlkKFhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUsIGJvb2xlYW4gaXNJdGVtVHlwZSwgYm9vbGVhbiBhbGxvd0V4dGVuc2lvbiwgYm9vbGVhbiBhbGxvd1Jlc3RyaWN0aW9uKSB7Ci0JCXJldHVybiBnZXRYU0RDb21wb25lbnQoKS5nZXRCYWRUeXBlRGVyaXZhdGlvbih4c2RUeXBlLmdldFhTRENvbXBvbmVudCgpLCBhbGxvd0V4dGVuc2lvbiwgYWxsb3dSZXN0cmljdGlvbikgPT0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFhzZFR5cGVEZWZpbml0aW9uIGdldEJhc2VUeXBlKCkgewotCQlYU0RUeXBlRGVmaW5pdGlvbiB4c2RCYXNlVHlwZSA9IGdldFhTRENvbXBvbmVudCgpLmdldEJhc2VUeXBlKCk7Ci0JCXJldHVybiAoeHNkQmFzZVR5cGUgPT0gbnVsbCkgPyBudWxsIDogKFhzZFR5cGVEZWZpbml0aW9uKSBYc2RVdGlsLmdldEFkYXB0ZXIoeHNkQmFzZVR5cGUpOwotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3QgWHNkQXR0cmlidXRlVXNlIGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSk7Ci0JCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QXR0cmlidXRlTmFtZVByb3Bvc2FscyhTdHJpbmcgbmFtZXNwYWNlLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscygKLQkJCQluZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPihnZXRBdHRyaWJ1dGVOYW1lcyhuYW1lc3BhY2UpLCBmaWx0ZXIpKTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IEl0ZXJhYmxlPFN0cmluZz4gZ2V0QXR0cmlidXRlTmFtZXMoU3RyaW5nIG5hbWVzcGFjZSk7Ci0JCi0JcHVibGljIFhzZEVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50KG5hbWVzcGFjZSwgbmFtZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3QgWHNkRWxlbWVudERlY2xhcmF0aW9uIGdldEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gcmVjdXJzZUNoaWxkcmVuKTsKLQkKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRFbGVtZW50TmFtZVByb3Bvc2FscyhTdHJpbmcgbmFtZXNwYWNlLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnROYW1lUHJvcG9zYWxzKG5hbWVzcGFjZSwgZmlsdGVyLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZSBnZXRFbGVtZW50TmFtZVByb3Bvc2FscyhTdHJpbmcgbmFtZXNwYWNlLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIGJvb2xlYW4gcmVjdXJzZUNoaWxkcmVuKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHMoCi0JCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4oZ2V0RWxlbWVudE5hbWVzKG5hbWVzcGFjZSwgcmVjdXJzZUNoaWxkcmVuKSwgZmlsdGVyKSk7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBJdGVyYWJsZTxTdHJpbmc+IGdldEVsZW1lbnROYW1lcyhTdHJpbmcgbmFtZXNwYWNlLCBib29sZWFuIHJlY3Vyc2VDaGlsZHJlbik7Ci0JCi0JcHVibGljIGVudW0gS2luZCB7Ci0JCQotCQkvKioKLQkJICogQW4ge0BsaW5rIFhzZFR5cGVEZWZpbml0aW9ufSBvZiBTSU1QTEUge0BsaW5rIEtpbmR9IG1heSBzYWZlbHkgYmUgY2FzdCB0byBhbiB7QGxpbmsgWHNkU2ltcGxlVHlwZURlZmluaXRpb259Ci0JCSAqLwotCQlTSU1QTEUsCi0JCQotCQkvKioKLQkJICogQW4ge0BsaW5rIFhzZFR5cGVEZWZpbml0aW9ufSBvZiBDT01QTEVYIHtAbGluayBLaW5kfSBtYXkgc2FmZWx5IGJlIGNhc3QgdG8gYW4ge0BsaW5rIFhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbn0KLQkJICovCi0JCUNPTVBMRVg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZFV0aWwuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNTE5MWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczoKLSAqICAJSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgCQkoY29waWVkIG1haW5seSBmcm9tIG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsLlhTREltcGwpCi0gKiAgCU9yYWNsZSAtIGV4dGVuc2lvbnMgYW5kIG1vZGlmaWNhdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsLlhTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RJbXBvcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2g7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgYnVpbGRpbmcgWFNEIG1vZGVsIGFuZCBpdHMgZXh0ZW5zaW9ucyBmb3IgSkFYQgotICovCi1wdWJsaWMgY2xhc3MgWHNkVXRpbCB7Ci0JCi0Jc3RhdGljIGZpbmFsIFhzZEFkYXB0ZXJGYWN0b3J5SW1wbCBhZGFwdGVyRmFjdG9yeSA9IG5ldyBYc2RBZGFwdGVyRmFjdG9yeUltcGwoKTsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbmFtZXNwYWNlRXF1YWxzKFhTRE5hbWVkQ29tcG9uZW50IGNvbXAsIFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJU3RyaW5nIHhzZE5hbWVzcGFjZSA9IGNvbXAuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0JCXJldHVybiAoeHNkTmFtZXNwYWNlID09IG51bGwpID8gU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShuYW1lc3BhY2UpIDogeHNkTmFtZXNwYWNlLmVxdWFscyhuYW1lc3BhY2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvbHZlZFVyaShTdHJpbmcgbG9jYXRpb24pIHsKLQkJU3RyaW5nIHJlc29sdmVkVXJpID0gbnVsbDsKLQkJCi0JCUlDYXRhbG9nIGNhdGFsb2cgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotCQkKLQkJaWYgKCEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShsb2NhdGlvbikpIHsKLQkJCXRyeSB7Ci0JCQkJcmVzb2x2ZWRVcmkgPSBjYXRhbG9nLnJlc29sdmVTeXN0ZW0obG9jYXRpb24pOwotCQkJCWlmIChyZXNvbHZlZFVyaSA9PSBudWxsKSB7Ci0JCQkJCXJlc29sdmVkVXJpID0gY2F0YWxvZy5yZXNvbHZlVVJJKGxvY2F0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKHJlc29sdmVkVXJpID09IG51bGwpIHsKLQkJCQkJcmVzb2x2ZWRVcmkgPSBjYXRhbG9nLnJlc29sdmVQdWJsaWMobG9jYXRpb24sIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWUpIHsKLQkJCQlKcHRKYXhiQ29yZVBsdWdpbi5sb2cobWUpOwotCQkJCXJlc29sdmVkVXJpID0gbnVsbDsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpZSkgewotCQkJCUpwdEpheGJDb3JlUGx1Z2luLmxvZyhpZSk7Ci0JCQkJcmVzb2x2ZWRVcmkgPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQkvLyBpZiByZXNvbHZlZFVyaSBpcyBudWxsLCBhc3N1bWUgdGhlIGxvY2F0aW9uIGlzIHJlc29sdmVkCi0JCXJldHVybiAocmVzb2x2ZWRVcmkgIT0gbnVsbCkgPyByZXNvbHZlZFVyaSA6IGxvY2F0aW9uOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIFhzZFNjaGVtYSBnZXRTY2hlbWEoWFNEU2NoZW1hIHhzZFNjaGVtYSkgewotCQlyZXR1cm4gKHhzZFNjaGVtYSA9PSBudWxsKSA/IG51bGwgOiAoWHNkU2NoZW1hKSBYc2RVdGlsLmdldEFkYXB0ZXIoeHNkU2NoZW1hKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBYc2RTY2hlbWEgZ2V0U2NoZW1hRm9yU2NoZW1hKCkgewotCQlyZXR1cm4gZ2V0U2NoZW1hKFhTRFNjaGVtYUltcGwuZ2V0U2NoZW1hRm9yU2NoZW1hKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSkpOwotCX0KLQkKLQkvKioKLQkgKiBHaXZlbiB1cmkgZm9yIGFuIFhNTCBTY2hlbWEgZG9jdW1lbnQsIHBhcnNlIHRoZSBkb2N1bWVudCBhbmQgYnVpbGQKLQkgKiBjb3JyZXNwb25kaW5nIEVNRiBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBYU0RTY2hlbWEgYnVpbGRYU0RNb2RlbChTdHJpbmcgdXJpU3RyaW5nKSB7Ci0JCVhTRFNjaGVtYSB4c2RTY2hlbWEgPSBudWxsOwotCQkKLQkJLy8gaWYgWE1MIFNjaGVtYSBmb3IgU2NoZW1hIGlzIHJlcXVlc3RlZCwgZ2V0IGl0IHRocm91Z2ggc2NoZW1hIG1vZGVsIAotCQlpZiAodXJpU3RyaW5nLmVuZHNXaXRoKCIyMDAxL1hNTFNjaGVtYS54c2QiKSkgewotCQkJeHNkU2NoZW1hID0gWFNEU2NoZW1hSW1wbC5nZXRTY2hlbWFGb3JTY2hlbWEoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKTsJCQkKLQkJfQotCQllbHNlIHsgCQotCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCQlyZXNvdXJjZVNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKG5ldyBYU0RTY2hlbWFMb2NhdG9yQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkKLQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaVN0cmluZyk7ICAgCi0JCQkKLQkJCS8vIENTIDogYnVnIDExMzUzNyBlbnN1cmUgd2UgcGVyZm9ybSBwaHlzaWNhbCByZXNvbHV0aW9uIGJlZm9yZSBvcGVuaW5nIGEgc3RyZWFtIGZvciB0aGUgcmVzb3VyY2UKLQkJCVN0cmluZyBwaHlzaWNhbExvY2F0aW9uID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlUGh5c2ljYWxMb2NhdGlvbigiIiwgIiIsIHVyaVN0cmluZyk7Ci0JCQlYU0RSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKFVSSS5jcmVhdGVVUkkocGh5c2ljYWxMb2NhdGlvbikpOwotCQkJCXJlc291cmNlID0gKFhTRFJlc291cmNlSW1wbCkgcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiKi54c2QiKSk7Ci0JCQkJcmVzb3VyY2Uuc2V0VVJJKHVyaSk7Ci0JCQkJcmVzb3VyY2UubG9hZChpbnB1dFN0cmVhbSwgbnVsbCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIHNjaGVtYSBkb2VzIG5vdCBleGlzdCBvciBjYW5ub3QgYmUgcmVhZAotCQkJCS8vIHN3YWxsb3cgdGhlIGV4Y2VwdGlvbiwgYW5kIHJldHVybiBudWxsCi0JCQkJLy8gdGhlcmUgd2lsbCBiZSBwcm9qZWN0IHZhbGlkYXRpb24gdG8gY2FwdHVyZSB0aGlzIGVycm9yCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQl4c2RTY2hlbWEgPSByZXNvdXJjZS5nZXRTY2hlbWEoKTsgICAgICAKLQkJfQotCQloYW5kbGVJbXBvcnRzKHhzZFNjaGVtYSk7Ci0JCXJldHVybiB4c2RTY2hlbWE7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlSW1wb3J0cyhYU0RTY2hlbWEgeHNkU2NoZW1hKSB7Ci0JCWlmICh4c2RTY2hlbWEgIT0gbnVsbCkgewotCQkJZm9yIChYU0RTY2hlbWFDb250ZW50IGNvbnRlbnQgOiB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKSkgewotCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgWFNESW1wb3J0SW1wbCkgewotCQkJCQlYU0RJbXBvcnRJbXBsIGFuSW1wb3J0ID0gKFhTREltcG9ydEltcGwpIGNvbnRlbnQ7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoYW5JbXBvcnQuZ2V0U2NoZW1hTG9jYXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQkJYW5JbXBvcnQuaW1wb3J0U2NoZW1hKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlKcHRKYXhiQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QWRhcHRlcihOb3RpZmllciBub3RpZmllcikgewotCQlyZXR1cm4gYWRhcHRlckZhY3RvcnkuYWRhcHQobm90aWZpZXIpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBUaGUgRmFjdG9yeSBmb3IgdGhlIFhTRCBhZGFwdGVyIG1vZGVsLiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2gKLQkgKiBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgWHNkQWRhcHRlckZhY3RvcnlJbXBsCi0JCQlleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJCVhTRFN3aXRjaCB4c2RTd2l0Y2ggPSBuZXcgWFNEU3dpdGNoKCkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTRFNjaGVtYShYU0RTY2hlbWEgb2JqZWN0KSB7Ci0JCQkJCXJldHVybiBuZXcgWHNkU2NoZW1hKG9iamVjdCk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIG9iamVjdCkgewotCQkJCQlyZXR1cm4gbmV3IFhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uKG9iamVjdCk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gb2JqZWN0KSB7Ci0JCQkJCXJldHVybiBuZXcgWHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKG9iamVjdCk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZVVzZShYU0RBdHRyaWJ1dGVVc2Ugb2JqZWN0KSB7Ci0JCQkJCXJldHVybiBuZXcgWHNkQXR0cmlidXRlVXNlKG9iamVjdCk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gb2JqZWN0KSB7Ci0JCQkJCXJldHVybiBuZXcgWHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKG9iamVjdCk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTREVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gb2JqZWN0KSB7Ci0JCQkJCXJldHVybiBuZXcgWHNkRWxlbWVudERlY2xhcmF0aW9uKG9iamVjdCk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTRE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBvYmplY3QpIHsKLQkJCQkJcmV0dXJuIG5ldyBYc2RNb2RlbEdyb3VwKG9iamVjdCk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG9iamVjdCkgewotCQkJCQlyZXR1cm4gbmV3IFhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKG9iamVjdCk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTRFBhcnRpY2xlKFhTRFBhcnRpY2xlIG9iamVjdCkgewotCQkJCQlyZXR1cm4gbmV3IFhzZFBhcnRpY2xlKG9iamVjdCk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIG9iamVjdCkgewotCQkJCQlyZXR1cm4gbmV3IFhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKG9iamVjdCk7Ci0JCQkJfQotCQkJfTsKLQkJCQotCQkJT2JqZWN0IG8gPSB4c2RTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpIHRhcmdldCk7Ci0JCQlBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIEFkYXB0ZXIpIHsKLQkJCQlyZXN1bHQgPSAoQWRhcHRlcikgbzsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIHRhcmdldCkgewotCQkJcmV0dXJuIGFkYXB0KHRhcmdldCwgdGhpcyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLmN2c2lnbm9yZSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnByb2plY3QgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMjNmYjguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmc8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YmU0NTYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmc7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5odG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjA2YjEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaW5pIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4OGI5ZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ0aXBzQW5kVHJpY2tzSHJlZiIgY29udGFpbnMgdGhlIEhlbHAgdG9waWMgaHJlZiB0byBhIHRpcHMgYW5kIHRyaWNrcyBwYWdlIAotIyBvcHRpb25hbAotdGlwc0FuZFRyaWNrc0hyZWY9L29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtCi0KLQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzhjN2MwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBKQVhCIFN1cHBvcnRcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IE9yYWNsZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDEwLCAyMDExLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YmQwM2EuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9jb21wb25lbnQueG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZGIyZDEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmciPgotPGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPgotPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA5YzJhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2ZhZDhhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIE1PWHkgKEpBWEIpIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vLmNsYXNzcGF0aCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRlODYxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi8uY3ZzaWdub3JlIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi8ucHJvamVjdCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ4MmMzNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIwNDQ0NS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDc6NTMgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwOTRlMTcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUltcG9ydC1QYWNrYWdlOiBqYXZheC54bWwuYmluZCwKLSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4sCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4uaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL2Fib3V0Lmh0bWwgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxZjU4Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgyPkFib3V0IFRoaXMgQ29udGVudDwvSDI+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgCi0gIG91dCBiZWxvdy4gSWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCAKLSAgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIAotICB0byB0aGUgUmVkaXN0cmlidXRvciYjODIxNztzIGxpY2Vuc2UgZm9yIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLTxoND48YSBuYW1lPSJKUEEiIGlkPSJKUEEiPjwvYT5KYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSB2MS4wPC9oND4KLQotPGJsb2NrcXVvdGU+Ci0gIDxwPlRoZSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSB3aGljaCBpcyBkaXN0cmlidXRlZCB1bmRlciA8YSBocmVmPSJodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWwiPkNEREwgCi0gICAgdjEuMDwvYT4gaXMgcmVxdWlyZWQgYnkgdGhlIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBQcm9qZWN0IGluIG9yZGVyIAotICAgIHRvIHN1cHBvcnQgdGhpcyBzdGFuZGFyZC48L3A+Ci08L2Jsb2NrcXVvdGU+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vYnVpbGQucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTM1YzYxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA1NzQxMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBKQVhCIFN1cHBvcnQgLSBTY2hlbWEgR2VuZXJhdGlvbgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9zY2hlbWFnZW4vTWFpbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3NjaGVtYWdlbi9NYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZTA1ZjEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3NjaGVtYWdlbi9NYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlNjaGVtYU91dHB1dFJlc29sdmVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLmludGVybmFsLkpwdEVjbGlwc2VMaW5rSmF4YkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLkpBWEJDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuSkFYQkNvbnRleHRGYWN0b3J5OwotCi0vKioKLSAqICBHZW5lcmF0ZSBhIEVjbGlwc2VMaW5rIEpBWEIgU2NoZW1hCi0gKiAgCi0gKiBDdXJyZW50IGNvbW1hbmQtbGluZSBhcmd1bWVudHM6Ci0gKiAgICAgWy1zIHNjaGVtYS54c2RdIC0gc3BlY2lmaWVzIHRoZSB0YXJnZXQgc2NoZW1hCi0gKiAgICAgWy1jIGNsYXNzTmFtZV0gLSBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWluCi17Ci0JcHJpdmF0ZSBTdHJpbmdbXSBzb3VyY2VDbGFzc05hbWVzOwotCXByaXZhdGUgU3RyaW5nIHRhcmdldFNjaGVtYU5hbWU7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVidWdNb2RlOwotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgTk9fRkFDVE9SWV9DTEFTUyA9ICJkb2VzbnQgY29udGFpbiBPYmplY3RGYWN0b3J5LmNsYXNzIjsgICAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgQ0FOTk9UX0JFX0NBU1RfVE9fSkFYQkNPTlRFWFQgPSAiY2Fubm90IGJlIGNhc3QgdG8gb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi5KQVhCQ29udGV4dCI7ICAgLy8kTk9OLU5MUy0xJAotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQluZXcgTWFpbigpLmV4ZWN1dGUoYXJncyk7Ci0JfQotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXByaXZhdGUgTWFpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKFN0cmluZ1tdIGFyZ3MpIHsKLQkJCi0JCXRoaXMuaW5pdGlhbGl6ZVdpdGgoYXJncyk7Ci0JCQotCQl0aGlzLmdlbmVyYXRlKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLSAgICAKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVdpdGgoU3RyaW5nW10gYXJncykgewotICAgIAl0aGlzLnNvdXJjZUNsYXNzTmFtZXMgPSB0aGlzLmdldFNvdXJjZUNsYXNzTmFtZXMoYXJncyk7Ci0gICAgCXRoaXMudGFyZ2V0U2NoZW1hTmFtZSA9IHRoaXMuZ2V0VGFyZ2V0U2NoZW1hTmFtZShhcmdzKTsKLQotCQl0aGlzLmlzRGVidWdNb2RlID0gdGhpcy5nZXREZWJ1Z01vZGUoYXJncyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlKCkgewotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWEJDb250ZXh0Ci0gICAgICAgIEpBWEJDb250ZXh0IGpheGJDb250ZXh0ID0gdGhpcy5idWlsZEpheGJDb250ZXh0KCk7Ci0KLSAgICAgICAgLy8gR2VuZXJhdGUgYW4gWE1MIFNjaGVtYQotICAgICAgICBpZihqYXhiQ29udGV4dCAhPSBudWxsKSB7Ci0JCQl0aGlzLmdlbmVyYXRlU2NoZW1hKGpheGJDb250ZXh0KTsKLQkJfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgCVRvb2xzLmJpbmQoSnB0RWNsaXBzZUxpbmtKYXhiQ29yZU1lc3NhZ2VzLlNDSEVNQV9OT1RfQ1JFQVRFRCwgdGhpcy50YXJnZXRTY2hlbWFOYW1lKTsKLSAgICAgICAgfQotCX0KLQkKLQlwcml2YXRlIEpBWEJDb250ZXh0IGJ1aWxkSmF4YkNvbnRleHQoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihUb29scy5nZXRTdHJpbmcoSnB0RWNsaXBzZUxpbmtKYXhiQ29yZU1lc3NhZ2VzLkxPQURJTkdfQ0xBU1NFUykpOwotICAgICAgICBKQVhCQ29udGV4dCBqYXhiQ29udGV4dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlDbGFzc0xvYWRlciBsb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCQkJCi0JCQlDbGFzc1tdIHNvdXJjZUNsYXNzZXMgPSB0aGlzLmJ1aWxkU291cmNlQ2xhc3Nlcyh0aGlzLnNvdXJjZUNsYXNzTmFtZXMsIGxvYWRlcik7Ci0JCQkKLQkJCS8vY2FsbCBNT1h5IEpBWEJDb250ZXh0RmFjdG9yeSBkaXJlY3RseS4gIFRoaXMgZWxpbWluYXRlcyB0aGUgbmVlZCB0byBoYXZlIHRoZSBKQVhCIHByb3BlcnRpZXMgZmlsZSBpbiBwbGFjZQotCQkJLy9pbiB0aW1lIGZvciB0aGUgZ2VuZXJhdGlvbi4KLQkJCWpheGJDb250ZXh0ID0gKEpBWEJDb250ZXh0KUpBWEJDb250ZXh0RmFjdG9yeS5jcmVhdGVDb250ZXh0KHNvdXJjZUNsYXNzZXMsIENvbGxlY3Rpb25zLjxTdHJpbmcsT2JqZWN0PmVtcHR5TWFwKCkpOwotCQl9Ci0JCWNhdGNoIChKQVhCRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aGlzLmhhbmRsZUpheGJFeGNlcHRpb24oZXgpOwotCQl9Ci0JCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXgpIHsKLQkJCXRoaXMuaGFuZGxlQ2xhc3NDYXN0RXhjZXB0aW9uKGV4KTsKLQkJfQotCQlyZXR1cm4gamF4YkNvbnRleHQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVNjaGVtYShKQVhCQ29udGV4dCBqYXhiQ29udGV4dCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oVG9vbHMuZ2V0U3RyaW5nKEpwdEVjbGlwc2VMaW5rSmF4YkNvcmVNZXNzYWdlcy5HRU5FUkFUSU5HX1NDSEVNQSkpOwotCQlTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0KLSAgICAJU2NoZW1hT3V0cHV0UmVzb2x2ZXIgc2NoZW1hT3V0cHV0UmVzb2x2ZXIgPSAKLSAgICAJCW5ldyBKcHRTY2hlbWFPdXRwdXRSZXNvbHZlcih0aGlzLnRhcmdldFNjaGVtYU5hbWUpOwotCi0JCXRyeSB7Ci0JCQlqYXhiQ29udGV4dC5nZW5lcmF0ZVNjaGVtYShzY2hlbWFPdXRwdXRSZXNvbHZlcik7Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0gICAgCi0gICAgcHJpdmF0ZSBDbGFzc1tdIGJ1aWxkU291cmNlQ2xhc3NlcyhTdHJpbmdbXSBjbGFzc05hbWVzLCBDbGFzc0xvYWRlciBsb2FkZXIpIHsKLQotCQlBcnJheUxpc3Q8Q2xhc3M+IHNvdXJjZUNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPihjbGFzc05hbWVzLmxlbmd0aCk7Ci0JCWZvcihTdHJpbmcgY2xhc3NOYW1lOiBjbGFzc05hbWVzKSB7Ci0JCQl0cnkgewotCQkJCXNvdXJjZUNsYXNzZXMuYWRkKGxvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihjbGFzc05hbWUpOwotCQkJfQotCQkJY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbihUb29scy5iaW5kKEpwdEVjbGlwc2VMaW5rSmF4YkNvcmVNZXNzYWdlcy5OT1RfRk9VTkQsIGNsYXNzTmFtZSkpOwotCQkJfQotCQl9Ci0JCVN5c3RlbS5vdXQuZmx1c2goKTsKLQkJcmV0dXJuIHNvdXJjZUNsYXNzZXMudG9BcnJheShuZXcgQ2xhc3NbMF0pOwotICAgIH0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlSmF4YkV4Y2VwdGlvbihKQVhCRXhjZXB0aW9uIGV4KSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gZXguZ2V0TWVzc2FnZSgpOwotCQlUaHJvd2FibGUgbGlua2VkRXggPSBleC5nZXRMaW5rZWRFeGNlcHRpb24oKTsKLQkJaWYobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UuaW5kZXhPZihOT19GQUNUT1JZX0NMQVNTKSA+IC0xKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4obWVzc2FnZSk7Ci0JCX0KLQkJZWxzZSBpZihsaW5rZWRFeCAhPSBudWxsICYmIGxpbmtlZEV4IGluc3RhbmNlb2YgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbikgewotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IFRvb2xzLmJpbmQoCi0JCQkJSnB0RWNsaXBzZUxpbmtKYXhiQ29yZU1lc3NhZ2VzLkNPTlRFWFRfRkFDVE9SWV9OT1RfRk9VTkQsIGxpbmtlZEV4LmdldE1lc3NhZ2UoKSk7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZXJyb3JNZXNzYWdlKTsKLQkJfQotCQllbHNlIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVDbGFzc0Nhc3RFeGNlcHRpb24oQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gZXguZ2V0TWVzc2FnZSgpOwotCQlpZihtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5pbmRleE9mKENBTk5PVF9CRV9DQVNUX1RPX0pBWEJDT05URVhUKSA+IC0xKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oVG9vbHMuZ2V0U3RyaW5nKEpwdEVjbGlwc2VMaW5rSmF4YkNvcmVNZXNzYWdlcy5QUk9QRVJUSUVTX0ZJTEVfTk9UX0ZPVU5EKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogYXJndW1lbnQgcXVlcmllcyAqKioqKioqKioqCi0gICAgCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRTb3VyY2VDbGFzc05hbWVzKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlyZXR1cm4gdGhpcy5nZXRBbGxBcmd1bWVudFZhbHVlcygiLWMiLCBhcmdzKTsgICAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFRhcmdldFNjaGVtYU5hbWUoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmdldEFyZ3VtZW50VmFsdWUoIi1zIiwgYXJncyk7ICAgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBnZXREZWJ1Z01vZGUoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmFyZ3VtZW50RXhpc3RzKCItZGVidWciLCBhcmdzKTsgICAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gKioqKioqKioqKiBwcml2YXRlIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXJndW1lbnRWYWx1ZShTdHJpbmcgYXJnTmFtZSwgU3RyaW5nW10gYXJncykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhcmcgPSBhcmdzW2ldOwotCQkJaWYgKGFyZy50b0xvd2VyQ2FzZSgpLmVxdWFscyhhcmdOYW1lKSkgewotCQkJCWludCBqID0gaSArIDE7Ci0JCQkJaWYgKGogPCBhcmdzLmxlbmd0aCkgewotCQkJCQlyZXR1cm4gYXJnc1tqXTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nW10gZ2V0QWxsQXJndW1lbnRWYWx1ZXMoU3RyaW5nIGFyZ05hbWUsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJTGlzdDxTdHJpbmc+IGFyZ1ZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhcmcgPSBhcmdzW2ldOwotCQkJaWYgKGFyZy50b0xvd2VyQ2FzZSgpLmVxdWFscyhhcmdOYW1lKSkgewotCQkJCWludCBqID0gaSArIDE7Ci0JCQkJaWYgKGogPCBhcmdzLmxlbmd0aCkgewotCQkJCQlhcmdWYWx1ZXMuYWRkKGFyZ3Nbal0pOwotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhcmdWYWx1ZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFyZ3VtZW50RXhpc3RzKFN0cmluZyBhcmdOYW1lLCBTdHJpbmdbXSBhcmdzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbaV07Ci0JCQlpZiAoYXJnLnRvTG93ZXJDYXNlKCkuZXF1YWxzKGFyZ05hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQotCi0vLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotY2xhc3MgSnB0U2NoZW1hT3V0cHV0UmVzb2x2ZXIgZXh0ZW5kcyBTY2hlbWFPdXRwdXRSZXNvbHZlciB7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFNjaGVtYU5hbWU7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgSnB0U2NoZW1hT3V0cHV0UmVzb2x2ZXIoU3RyaW5nIGRlZmF1bHRTY2hlbWFOYW1lKSB7Ci0JCXRoaXMuZGVmYXVsdFNjaGVtYU5hbWUgPSBkZWZhdWx0U2NoZW1hTmFtZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQkgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlc3VsdCBjcmVhdGVPdXRwdXQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHN1Z2dlc3RlZEZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IChUb29scy5zdHJpbmdJc0VtcHR5KG5hbWVzcGFjZVVSSSkpID8gCi0gICAgICAgIAkJdGhpcy5idWlsZEZpbGVOYW1lRnJvbSh0aGlzLmRlZmF1bHRTY2hlbWFOYW1lLCBzdWdnZXN0ZWRGaWxlTmFtZSkgOiAKLSAgICAgICAgCQl0aGlzLm1vZGlmeUZpbGVOYW1lKG5hbWVzcGFjZVVSSSk7Ci0KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZVBhdGgpOwotICAgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChmaWxlKTsKLSAgICAgICAgcmVzdWx0LnNldFN5c3RlbUlkKGZpbGUudG9VUkkoKS50b1VSTCgpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoVG9vbHMuYmluZChKcHRFY2xpcHNlTGlua0pheGJDb3JlTWVzc2FnZXMuU0NIRU1BX0dFTkVSQVRFRCwgZmlsZSkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotCQkvLyAqKioqKioqKioqIHByaXZhdGUgbWV0aG9kcyAqKioqKioqKioqCi0KLQkgcHJpdmF0ZSBTdHJpbmcgYnVpbGRGaWxlTmFtZUZyb20oU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgc3VnZ2VzdGVkRmlsZU5hbWUpIHsKLQotCQkgZmlsZU5hbWUgPSBUb29scy5zdHJpcEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0KLQkJIGlmKFRvb2xzLnN0cmluZ0lzRW1wdHkoZmlsZU5hbWUpKSB7Ci0JCQkgcmV0dXJuIHN1Z2dlc3RlZEZpbGVOYW1lOwotCQkgfQotCQkgU3RyaW5nIG51bWJlciA9IFRvb2xzLmV4dHJhY3RGaWxlTnVtYmVyKHN1Z2dlc3RlZEZpbGVOYW1lKTsKLQotCQkgZmlsZU5hbWUgPSB0aGlzLmJ1aWxkRmlsZU5hbWUoZmlsZU5hbWUsIG51bWJlcik7Ci0JCSByZXR1cm4gVG9vbHMuYXBwZW5kWHNkRXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkgfQotCi0JIHByaXZhdGUgU3RyaW5nIGJ1aWxkRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgbnVtYmVyKSB7Ci0KLQkJIGlmKFRvb2xzLnN0cmluZ0lzRW1wdHkobnVtYmVyKSkgewotCQkJIHJldHVybiBmaWxlTmFtZTsKLQkJIH0KLQkJIHJldHVybiAobnVtYmVyLmVxdWFscygiMCIpKSA/IGZpbGVOYW1lIDogZmlsZU5hbWUgKyBudW1iZXI7ICAgLy8kTk9OLU5MUy0xJAotCSB9Ci0KLQkgcHJpdmF0ZSBTdHJpbmcgbW9kaWZ5RmlsZU5hbWUoU3RyaW5nIG5hbWVzcGFjZVVSSSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQkgU3RyaW5nIGRpciA9IFRvb2xzLmV4dHJhY3REaXJlY3RvcnkodGhpcy5kZWZhdWx0U2NoZW1hTmFtZSk7Ci0KLQkJIFN0cmluZyBmaWxlTmFtZSA9IFRvb2xzLnN0cmlwUHJvdG9jb2wobmFtZXNwYWNlVVJJKTsKLQkJIGZpbGVOYW1lID0gZmlsZU5hbWUucmVwbGFjZUFsbCgiLyIsICJfIik7CQkvLyROT04tTkxTLTEkCi0JCSBmaWxlTmFtZSA9IFRvb2xzLmFwcGVuZFhzZEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0KLQkJU3RyaW5nIHJlc3VsdCA9IChUb29scy5zdHJpbmdJc0VtcHR5KGRpcikpID8gZmlsZU5hbWUgOiBkaXIgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lOwotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQkgfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL0pwdEVjbGlwc2VMaW5rSmF4YkNvcmVNZXNzYWdlcy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9KcHRFY2xpcHNlTGlua0pheGJDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhOWUyZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL0pwdEVjbGlwc2VMaW5rSmF4YkNvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogTG9jYWxpemVkIG1lc3NhZ2VzIHVzZWQgYnkgRGFsaSBFY2xpcHNlTGluayBKQVhCIGNvcmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGlua0pheGJDb3JlTWVzc2FnZXMKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FESU5HX0NMQVNTRVMgPSAiTE9BRElOR19DTEFTU0VTIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUSU5HX1NDSEVNQSA9ICJHRU5FUkFUSU5HX1NDSEVNQSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0dFTkVSQVRFRCA9ICJTQ0hFTUFfR0VORVJBVEVEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfTk9UX0NSRUFURUQgPSAiU0NIRU1BX05PVF9DUkVBVEVEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRk9VTkQgPSAiTk9UX0ZPVU5EIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX0ZBQ1RPUllfTk9UX0ZPVU5EID0gIkNPTlRFWFRfRkFDVE9SWV9OT1RfRk9VTkQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfRklMRV9OT1RfRk9VTkQgPSAiUFJPUEVSVElFU19GSUxFX05PVF9GT1VORCI7Ci0JCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4uaW50ZXJuYWwuanB0X2VjbGlwc2VsaW5rX2pheGJfY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBKcHRFY2xpcHNlTGlua0pheGJDb3JlTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9zY2hlbWFnZW4vaW50ZXJuYWwvVG9vbHMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9zY2hlbWFnZW4vaW50ZXJuYWwvVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEzMmU0Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL1Rvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi0vKioKLSAqICBUb29scwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVG9vbHMKLXsKLQkvKiogZGVmYXVsdCBmaWxlIG5hbWUgdXNlZCBieSB0aGUgc2NoZW1hZ2VuICovCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgR0VOX0RFRkFVTFRfTkFNRSA9ICJzY2hlbWEiOyAgIC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogZW1wdHkgc3RyaW5nICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBudWxsLCBlbXB0eSwgb3IgY29udGFpbnMKLQkgKiBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNFbXB0eShTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nSXNFbXB0eV8oc3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbik7Ci0JfQkKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNFbXB0eV8oY2hhcltdIHMsIGludCBsZW4pIHsKLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHNob3J0IG5hbWUgbWFuaXB1bGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0cmlwIHRoZSBleHRlbnNpb24gZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZQotCSAqIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gSWYgdGhlIGZpbGUgbmFtZSBoYXMgbm8KLQkgKiBleHRlbnNpb24sIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZAotCSAqIEZpbGUjYmFzZVBhdGgoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwRXh0ZW5zaW9uKFN0cmluZyBmaWxlTmFtZSkgewotCQlpbnQgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBmaWxlTmFtZTsKLQkJfQotCQlyZXR1cm4gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpcFByb3RvY29sKFN0cmluZyB1cmkpIHsKLQotCQkgcmV0dXJuIHVyaS5yZXBsYWNlRmlyc3QoImh0dHA6Ly8iLCBFTVBUWV9TVFJJTkcpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwZW5kWHNkRXh0ZW5zaW9uKFN0cmluZyBuYW1lKSB7Ci0KLQkJIHJldHVybiBuYW1lICsgIi54c2QiOwkJLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dHJhY3RGaWxlTnVtYmVyKFN0cmluZyBmaWxlTmFtZSkgewotCi0JCSBTdHJpbmcgcmVzdWx0ID0gc3RyaXBFeHRlbnNpb24oZmlsZU5hbWUpOwotCQkgaWYoVG9vbHMuc3RyaW5nSXNFbXB0eShyZXN1bHQpKSB7Ci0JCQkgcmV0dXJuIEVNUFRZX1NUUklORzsKLQkJIH0KLQkJIHJldHVybiByZXN1bHQucmVwbGFjZUZpcnN0KEdFTl9ERUZBVUxUX05BTUUsIEVNUFRZX1NUUklORyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0cmFjdERpcmVjdG9yeShTdHJpbmcgcGF0aCkgewotCQlpZiggISBwYXRoLmNvbnRhaW5zKEZpbGUuc2VwYXJhdG9yKSkgewotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsJCi0JCX0KLQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBOTFMgdXRpbGl0aWVzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBKcHRFY2xpcHNlTGlua0pheGJDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGtleSwgT2JqZWN0IGFyZ3VtZW50KSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJndW1lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9zY2hlbWFnZW4vaW50ZXJuYWwvanB0X2VjbGlwc2VsaW5rX2pheGJfY29yZS5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9qcHRfZWNsaXBzZWxpbmtfamF4Yl9jb3JlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5Zjc2NjEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9qcHRfZWNsaXBzZWxpbmtfamF4Yl9jb3JlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotTE9BRElOR19DTEFTU0VTID0gbG9hZGluZy4uLgotR0VORVJBVElOR19TQ0hFTUEgPSBcbk1PWHkgZ2VuZXJhdGluZyBzY2hlbWEuLi4KLVNDSEVNQV9HRU5FUkFURUQgPSAgXG5TY2hlbWEgezB9IGdlbmVyYXRlZAotU0NIRU1BX05PVF9DUkVBVEVEID0gIFxuU2NoZW1hIHswfSBub3QgY3JlYXRlZAotTk9UX0ZPVU5EID0gIFxuXHROb3QgZm91bmQ6IHswfQotUFJPUEVSVElFU19GSUxFX05PVF9GT1VORCA9ICBcbkVjbGlwc2VMaW5rIEpBWEJDb250ZXh0RmFjdG9yeSBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUgamF4Yi5wcm9wZXJ0aWVzIGZpbGUgdG8gdXNlIEVjbGlwc2VMaW5rIE1PWHkgZm9yIHNjaGVtYSBnZW5lcmF0aW9uLlxuXAotamF2YXgueG1sLmJpbmQuY29udGV4dC5mYWN0b3J5PW9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuSkFYQkNvbnRleHRGYWN0b3J5Ci1DT05URVhUX0ZBQ1RPUllfTk9UX0ZPVU5EID0gIFxuVGhlIEpBWEJDb250ZXh0RmFjdG9yeSB7MH0gXG5cCi1zcGVjaWZpZWQgaW4gdGhlIGpheGIucHJvcGVydGllcyBmaWxlIGNvdWxkIG5vdCBiZSBsb2NhdGVkIG9uIHRoZSBwcm9qZWN0IGNsYXNzcGF0aC4gXG5cCi1UaGUgSkFYQiBwcm92aWRlciB0aGF0IGRlZmluZXMgdGhpcyBmYWN0b3J5IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgcHJvamVjdCBjbGFzc3BhdGgsIFxuXAotb3IgdGhlIGpheGIucHJvcGVydGllcyBmaWxlIHNob3VsZCBiZSByZW1vdmVkIHRvIHVzZSB0aGUgZGVmYXVsdCBwcm92aWRlci4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLy5jbGFzc3BhdGggYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTI5ZWU0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJub25hY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9Im5vbmFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9Im5vbmFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0ibm9uYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvLmN2c2lnbm9yZSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvLnByb2plY3QgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg5OWEzNi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGViMGZjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNUdWUgTWFyIDA4IDEyOjA3OjQ1IEVTVCAyMDExCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdjNzI1Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5KcHRKYXhiRWNsaXBzZUxpbmtDb3JlUGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy40LjMwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy43LjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjcuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS40LjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjUwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS40LjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjMwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnhzZDtidW5kbGUtdmVyc2lvbj0iWzIuOC4wLDMuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC54cGF0aC5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5saWJ2YWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfNDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvYWJvdXQuaHRtbCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdmZTEyMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJhZDYwYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgSkFYQiBTdXBwb3J0IC0gQ29yZQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotRUNMSVBTRUxJTktfUExBVEZPUk1fR1JPVVBfTEFCRUwgPSBFY2xpcHNlTGluawotRUNMSVBTRUxJTktfMl8xX1BMQVRGT1JNX0xBQkVMID0gRWNsaXBzZUxpbmsgMi4xLngKLUVDTElQU0VMSU5LXzJfMl9QTEFURk9STV9MQUJFTCA9IEVjbGlwc2VMaW5rIDIuMi54Ci1FQ0xJUFNFTElOS18yXzNfUExBVEZPUk1fTEFCRUwgPSBFY2xpcHNlTGluayAyLjMueAotRUNMSVBTRUxJTktfMl80X1BMQVRGT1JNX0xBQkVMID0gRWNsaXBzZUxpbmsgMi40LngKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi54bWwgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGVmYzJmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPCEtLQotICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLQotICBDb250cmlidXRvcnM6Ci0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci0KLTxwbHVnaW4+Ci0JCi0JPGV4dGVuc2lvbiAKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMucHJvcGVydHlUZXN0ZXJzIj4KLQkJCi0JCTxwcm9wZXJ0eVRlc3RlcgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucHJvcGVydHlUZXN0ZXIuamF4YlBhY2thZ2UiCi0JCQl0eXBlPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2UiCi0JCQluYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUiCi0JCQlwcm9wZXJ0aWVzPSJoYXNFY2xpcHNlTGlua0pheGJQcm9wZXJ0eSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuSmF4YlBhY2thZ2VUZXN0ZXIiLz4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5qYXhiUGxhdGZvcm1zIj4KLQkJCi0JCTxqYXhiUGxhdGZvcm1Hcm91cAotICAgICAgICAJaWQ9ImVjbGlwc2VsaW5rIgotICAgICAgICAJbGFiZWw9IiVFQ0xJUFNFTElOS19QTEFURk9STV9HUk9VUF9MQUJFTCIvPgotCQkKLQkJPGpheGJQbGF0Zm9ybQotCQkJaWQ9ImVjbGlwc2VsaW5rXzJfMSIKLQkJCWxhYmVsPSIlRUNMSVBTRUxJTktfMl8xX1BMQVRGT1JNX0xBQkVMIgotCQkJZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzEuRUxKYXhiXzJfMV9QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5IgotCQkJZ3JvdXA9ImVjbGlwc2VsaW5rIgotCQkJamF4YkZhY2V0VmVyc2lvbj0iMi4xIgotCQkJZGVmYXVsdD0iZmFsc2UiLz4KLQkJCi0JCTxqYXhiUGxhdGZvcm0KLQkJCWlkPSJlY2xpcHNlbGlua18yXzIiCi0JCQlsYWJlbD0iJUVDTElQU0VMSU5LXzJfMl9QTEFURk9STV9MQUJFTCIKLQkJCWZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8yLkVMSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeSIKLQkJCWdyb3VwPSJlY2xpcHNlbGluayIKLQkJCWpheGJGYWNldFZlcnNpb249IjIuMiIKLQkJCWRlZmF1bHQ9ImZhbHNlIi8+Ci0JCQotCQk8amF4YlBsYXRmb3JtCi0JCQlpZD0iZWNsaXBzZWxpbmtfMl8zIgotCQkJbGFiZWw9IiVFQ0xJUFNFTElOS18yXzNfUExBVEZPUk1fTEFCRUwiCi0JCQlmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMy5FTEpheGJfMl8zX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkiCi0JCQlncm91cD0iZWNsaXBzZWxpbmsiCi0JCQlqYXhiRmFjZXRWZXJzaW9uPSIyLjIiCi0JCQlkZWZhdWx0PSJmYWxzZSIvPgotCQkKLQkJPGpheGJQbGF0Zm9ybQotCQkJaWQ9ImVjbGlwc2VsaW5rXzJfNCIKLQkJCWxhYmVsPSIlRUNMSVBTRUxJTktfMl80X1BMQVRGT1JNX0xBQkVMIgotCQkJZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzQuRUxKYXhiXzJfNF9QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5IgotCQkJZ3JvdXA9ImVjbGlwc2VsaW5rIgotCQkJamF4YkZhY2V0VmVyc2lvbj0iMi4yIgotCQkJZGVmYXVsdD0iZmFsc2UiLz4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnJhcnlWYWxpZGF0b3JzIj4KLQkJCi0JCTxsaWJyYXJ5VmFsaWRhdG9yCi0JCQlpZD0iZWNsaXBzZWxpbmtVc2VyTGlicmFyeVZhbGlkYXRvciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmxpYnZhbC5FTEpheGJVc2VyTGlicmFyeVZhbGlkYXRvciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8YW5kPgotCQkJCQk8d2l0aCB2YXJpYWJsZT0ibGlicmFyeVByb3ZpZGVyIj4KLQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuZXh0ZW5kc0lkIgotCQkJCQkJCXZhbHVlPSJqYXhiLXVzZXItbGlicmFyeS1wcm92aWRlciIvPgotCQkJCQk8L3dpdGg+Ci0JCQkJCTx3aXRoIHZhcmlhYmxlPSJjb25maWciPgotCQkJCQkJPGFkYXB0IHR5cGUgPSAib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiI+Ci0JCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuamF4YlBsYXRmb3JtR3JvdXAiCi0JCQkJCQkJCXZhbHVlPSJlY2xpcHNlbGluayIvPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC93aXRoPgotCQkJCTwvYW5kPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2xpYnJhcnlWYWxpZGF0b3I+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9wcm9wZXJ0eV9maWxlcy9lbF9qYXhiX3ZhbGlkYXRpb24ucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3Byb3BlcnR5X2ZpbGVzL2VsX2pheGJfdmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWY4ZjM4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3Byb3BlcnR5X2ZpbGVzL2VsX2pheGJfdmFsaWRhdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jICAKLSMgIENvbnRyaWJ1dG9yczogCi0jICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVBST0pFQ1RfTUlTU0lOR19FQ0xJUFNFTElOS19KQVhCX0NPTlRFWFRfRkFDVE9SWSA9IFByb2plY3QgaXMgbWlzc2luZyBhIGpheGIucHJvcGVydGllcyBmaWxlIHNwZWNpZnlpbmcgdGhlIEVjbGlwc2VMaW5rIEpBWEIgY29udGV4dCBmYWN0b3J5Ci0KLVhNTF9ESVNDUklNSU5BVE9SX05PREVfX05PVF9TUEVDSUZJRUQgPSBYbWxEaXNjcmltaW5hdG9yTm9kZSBub3Qgc3BlY2lmaWVkLgotCi1YTUxfRElTQ1JJTUlOQVRPUl9WQUxVRV9fTk9UX1NQRUNJRklFRCA9IFhtbERpc2NyaW1pbmF0b3JWYWx1ZSBub3Qgc3BlY2lmaWVkLgotCi1YTUxfRUxFTUVOVF9ERUNMX19JTlZBTElEX01FVEhPRF9TSUdOQVRVUkVfUkVUVVJOX1RZUEUgPSBBbiBlbGVtZW50IGZhY3RvcnkgbWV0aG9kIG11c3QgaGF2ZSBhIHJldHVybiB0eXBlIGNvbnNpc3RlbnQgd2l0aCAnJ2phdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50JycuCi0KLVhNTF9KT0lOX05PREVfX1hNTF9QQVRIX05PVF9TUEVDSUZJRUQgPSBYbWxKb2luTm9kZSB4bWxQYXRoIG5vdCBzcGVjaWZpZWQuCi1YTUxfSk9JTl9OT0RFX19SRUZFUkVOQ0VEX1hNTF9QQVRIX05PVF9TUEVDSUZJRUQgPSBYbWxKb2luTm9kZSByZWZlcmVuY2VkWG1sUGF0aCBub3Qgc3BlY2lmaWVkLgotWE1MX0pPSU5fTk9ERV9fUkVGRVJFTkNFRF9YTUxfUEFUSF9OT1RfSU5fUkVGRVJFTkNFRF9DTEFTU19LRVlTID0gVGhlcmUgaXMgbm8gWG1sS2V5IG9yIFhtbElEIG9uIHRoZSB0YXJnZXQgY2xhc3MgJyd7MH0nJyB3aXRoIFhQYXRoIFwiezF9XCIuCi0KLVhNTF9KT0lOX05PREVTX19JTlZBTElEX1JFRkVSRU5DRURfQ0xBU1MgPSBUaGUgcmVmZXJlbmNlZCBjbGFzcyAnJ3swfScnIGlzIGludmFsaWQgZm9yIHVzZSB3aXRoIFhtbEpvaW5Ob2Rlcy4KLVhNTF9KT0lOX05PREVTX19EVVBMSUNBVEVfWE1MX1BBVEggPSBEdXBsaWNhdGUgeG1sUGF0aCAnJ3swfScnIGluIFhtbEpvaW5Ob2Rlcy4KLVhNTF9KT0lOX05PREVTX19EVVBMSUNBVEVfUkVGRVJFTkNFRF9YTUxfUEFUSCA9IER1cGxpY2F0ZSByZWZlcmVuY2VkWG1scGF0aCAnJ3swfScnIGluIFhtbEpvaW5Ob2Rlcy4KLQotWE1MX1BBVEhfX05PVF9TUEVDSUZJRUQgPSBYbWxQYXRoIG5vdCBzcGVjaWZpZWQuCi0KLVhNTF9QQVRIX19JTlNVRkZJQ0lFTlRfWE1MX1BBVEhTX0ZPUl9YTUxfRUxFTUVOVFMgPSBJbnN1ZmZpY2llbnQgWG1sUGF0aHMgc3BlY2lmaWVkLiAgVGhlcmUgbXVzdCBiZSBhbiBYbWxQYXRoIGZvciBlYWNoIFhtbEVsZW1lbnQuCi1YTUxfUEFUSF9fSU5TVUZGSUNJRU5UX1hNTF9FTEVNRU5UU19GT1JfWE1MX1BBVEhTID0gVGhlcmUgaXMgbm8gWG1sRWxlbWVudCB0byBtYXRjaCB0aGlzIFhtbFBhdGguICBUaGVyZSBtdXN0IGJlIGFuIFhtbEVsZW1lbnQgZm9yIGVhY2ggWG1scGF0aC4KLQotWE1MX0lOVkVSU0VfUkVGRVJFTkNFX19NQVBQRURfQllfTk9UX1NQRUNJRklFRCA9IFRoZSAnbWFwcGVkQnknIHByb3BlcnR5IG11c3QgYmUgc3BlY2lmaWVkIG9uIGFuIFhtbEludmVyc2VSZWZlcmVuY2UuCi1YTUxfSU5WRVJTRV9SRUZFUkVOQ0VfX01BUFBFRF9CWV9OT1RfUkVTT0xWRUQgPSBDYW5ub3QgcmVzb2x2ZSB0aGUgYXR0cmlidXRlICcnezB9Jycgb24gdGhlIGNsYXNzICcnezF9JycuCi1YTUxfSU5WRVJTRV9SRUZFUkVOQ0VfX01BUFBFRF9CWV9JTExFR0FMX01BUFBJTkdfVFlQRSA9IFRoZSBhdHRyaWJ1dGUgJyd7MH0nJyBvbiB0aGUgY2xhc3MgJyd7MX0nJyBtdXN0IGJlIG1hcHBlZCBhcyBYbWxFbGVtZW50LCBYbWxFbGVtZW50cywgWG1sQXR0cmlidXRlLCBvciBYbWxWYWx1ZS5qCi0KLVhQQVRIX19JTlZBTElEX0ZPUk1fSUxMRUdBTF9TRUdNRU5UID0gSWxsZWdhbCBYUGF0aCBzdGVwIFwiezB9XCIuCi1YUEFUSF9fUk9PVF9OT1RfU1VQUE9SVEVEID0gUm9vdCBYUGF0aCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgY29udGV4dC4KLVhQQVRIX19TRUxGX1NFR01FTlRfTVVTVF9CRV9GSVJTVF9TRUdNRU5UID0gU2VsZiBYUGF0aCBzdGVwIG11c3QgYmUgZmlyc3Qgc3RlcC4KLVhQQVRIX19URVhUX1NFR01FTlRfTVVTVF9CRV9MQVNUX1NFR01FTlQgPSBUZXh0IFhQYXRoIHN0ZXAgbXVzdCBiZSBsYXN0IHN0ZXAuCi1YUEFUSF9fQVRUUklCVVRFX1NFR01FTlRfTVVTVF9CRV9MQVNUX1NFR01FTlQgPSBBbiBhdHRyaWJ1dGUgWFBhdGggc3RlcCBtdXN0IGJlIHRoZSBsYXN0IHN0ZXAuCi1YUEFUSF9fSU5WQUxJRF9OU19QUkVGSVggPSBDYW5ub3QgcmVzb2x2ZSBhIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeCBcInswfVwiLgotWFBBVEhfX1VOUkVTT0xWRURfRUxFTUVOVCA9IENhbm5vdCByZXNvbHZlIGVsZW1lbnQgd2l0aCBuYW1lc3BhY2UgXCJ7MH1cIiBhbmQgbG9jYWwgbmFtZSBcInsxfVwiIGluIHRoaXMgY29udGV4dC4KLVhQQVRIX19VTlJFU09MVkVEX0FUVFJJQlVURSA9IENhbm5vdCByZXNvbHZlIGF0dHJpYnV0ZSB3aXRoIG5hbWVzcGFjZSBcInswfVwiIGFuZCBsb2NhbCBuYW1lIFwiezF9XCIgaW4gdGhpcyBjb250ZXh0LgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvRUxKYXhiTWFwcGluZ0tleXMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL0VMSmF4Yk1hcHBpbmdLZXlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MjIyNzguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvRUxKYXhiTWFwcGluZ0tleXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZTsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRUxKYXhiTWFwcGluZ0tleXMgewotCQotCVN0cmluZyBYTUxfSU5WRVJTRV9SRUZFUkVOQ0VfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gInhtbC1pbnZlcnNlLXJlZmVyZW5jZSI7Ci0JU3RyaW5nIFhNTF9KT0lOX05PREVTX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9ICJ4bWwtam9pbi1ub2RlcyI7Ci0JU3RyaW5nIFhNTF9UUkFOU0ZPUk1BVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAieG1sLXRyYW5zZm9ybWF0aW9uIjsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL0VMSmF4YlBsYXRmb3JtLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9FTEpheGJQbGF0Zm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjI5YmRhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL0VMSmF4YlBsYXRmb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBFTEpheGJQbGF0Zm9ybSB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uIEdST1VQIAotCQkJPSBKcHRKYXhiQ29yZVBsdWdpbi5nZXRKYXhiUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SmF4YlBsYXRmb3JtR3JvdXAoImVjbGlwc2VsaW5rIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIFZFUlNJT05fMl8xCi0JCQk9IEpwdEpheGJDb3JlUGx1Z2luLmdldEpheGJQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKYXhiUGxhdGZvcm0oImVjbGlwc2VsaW5rXzJfMSIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBWRVJTSU9OXzJfMgotCQkJPSBKcHRKYXhiQ29yZVBsdWdpbi5nZXRKYXhiUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SmF4YlBsYXRmb3JtKCJlY2xpcHNlbGlua18yXzIiKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gVkVSU0lPTl8yXzMKLQkJCT0gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0SmF4YlBsYXRmb3JtTWFuYWdlcigpLmdldEpheGJQbGF0Zm9ybSgiZWNsaXBzZWxpbmtfMl8zIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIFZFUlNJT05fMl80Ci0JCQk9IEpwdEpheGJDb3JlUGx1Z2luLmdldEpheGJQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKYXhiUGxhdGZvcm0oImVjbGlwc2VsaW5rXzJfNCIpOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JcHVibGljIHN0YXRpYyBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXREZWZhdWx0UGxhdGZvcm0oSVByb2plY3RGYWNldFZlcnNpb24gamF4YlZlcnNpb24pIHsKLQkJaWYgKGpheGJWZXJzaW9uLmVxdWFscyhKYXhiRmFjZXQuVkVSU0lPTl8yXzEpKSB7Ci0JCQlyZXR1cm4gVkVSU0lPTl8yXzE7Ci0JCX0KLQkJcmV0dXJuIFZFUlNJT05fMl80OwotCX0KLQkKLQkKLQkvKioKLQkgKiBOb3QgZm9yIGluc3RhbnRpYXRpb24KLQkgKi8KLQlwcml2YXRlIEVMSmF4YlBsYXRmb3JtKCkge30KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL0pwdEpheGJFY2xpcHNlTGlua0NvcmVQbHVnaW4uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL0pwdEpheGJFY2xpcHNlTGlua0NvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5NjgxODAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvSnB0SmF4YkVjbGlwc2VMaW5rQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEpwdEpheGJFY2xpcHNlTGlua0NvcmVQbHVnaW4KLQkJZXh0ZW5kcyBQbHVnaW4gewotCQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JLy8gKioqKioqKioqKiBzaW5nbGV0b24gKioqKioqKioqKgotCXByaXZhdGUgc3RhdGljIEpwdEpheGJFY2xpcHNlTGlua0NvcmVQbHVnaW4gSU5TVEFOQ0U7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24gSlBUIEVjbGlwc2VMaW5rIHBsdWctaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcHRKYXhiRWNsaXBzZUxpbmtDb3JlUGx1Z2luIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQkKLQkKLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBzdGF0dXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotCQlJTlNUQU5DRS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLSAgICAgICAgbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIG51bGwpKTsKLSAgICB9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIG9yIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIHRocm93YWJsZSkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHBsdWctaW4gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgkKLQkKLQlwdWJsaWMgSnB0SmF4YkVjbGlwc2VMaW5rQ29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlJTlNUQU5DRSA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMQ2xhc3NNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxDbGFzc01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzNDcyNS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxDbGFzc01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBleHRlbnNpb25zIHRvIEpheGJDbGFzc01hcHBpbmcKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVMQ2xhc3NNYXBwaW5nCi0JCWV4dGVuZHMgSmF4YkNsYXNzTWFwcGluZyB7Ci0JCi0JLy8gKioqKiogWG1sRGlzY3JpbWluYXRvck5vZGUgKioqKioKLQkKLQlTdHJpbmcgWE1MX0RJU0NSSU1JTkFUT1JfTk9ERV9QUk9QRVJUWSA9ICJ4bWxEaXNjcmltaW5hdG9yTm9kZSI7ICAvLyROT04tTkxTLTEkCi0JCi0JRUxYbWxEaXNjcmltaW5hdG9yTm9kZSBnZXRYbWxEaXNjcmltaW5hdG9yTm9kZSgpOwotCQotCUVMWG1sRGlzY3JpbWluYXRvck5vZGUgYWRkWG1sRGlzY3JpbWluYXRvck5vZGUoKTsKLQkKLQl2b2lkIHJlbW92ZVhtbERpc2NyaW1pbmF0b3JOb2RlKCk7Ci0JCi0JCi0JLy8gKioqKiogWG1sRGlzY3JpbWluYXRvclZhbHVlICoqKioqCi0JCi0JU3RyaW5nIFhNTF9ESVNDUklNSU5BVE9SX1ZBTFVFX1BST1BFUlRZID0gInhtbERpc2NyaW1pbmF0b3JWYWx1ZSI7ICAvLyROT04tTkxTLTEkCi0JCi0JRUxYbWxEaXNjcmltaW5hdG9yVmFsdWUgZ2V0WG1sRGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JCi0JRUxYbWxEaXNjcmltaW5hdG9yVmFsdWUgYWRkWG1sRGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JCi0Jdm9pZCByZW1vdmVYbWxEaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIGFuIHtAbGluayBJdGVyYWJsZX0gb2YgWFBhdGhzIHRoYXQgcmVwcmVzZW50IHRoZSBhdHRyaWJ1dGVzIGFubm90YXRlZCB3aXRoIFhtbElEIG9yCi0JICogWG1sS2V5LiAgKEluY2x1ZGVzIHRob3NlIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbm90IGFubm90YXRlZCB3aXRoIFhtbFBhdGggLSB0aG9zZSBYUGF0aHMKLQkgKiB3aWxsIGJlIGNhbGN1bGF0ZWQuKQotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0S2V5WFBhdGhzKCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMzcxYTcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sQW55QXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBbnlBdHRyaWJ1dGVNYXBwaW5nOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIGV4dGVuc2lvbnMgdG8gWG1sQW55QXR0cmlidXRlTWFwcGluZwotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRUxYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nCi0JCWV4dGVuZHMgWG1sQW55QXR0cmlidXRlTWFwcGluZywgRUxYbWxQYXRoTWFwcGluZyB7Ci0JCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxBbnlFbGVtZW50TWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sQW55RWxlbWVudE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmMDJjZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxBbnlFbGVtZW50TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBbnlFbGVtZW50TWFwcGluZzsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBleHRlbnNpb25zIHRvIFhtbEFueUVsZW1lbnRNYXBwaW5nCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBFTFhtbEFueUVsZW1lbnRNYXBwaW5nCi0JCWV4dGVuZHMgWG1sQW55RWxlbWVudE1hcHBpbmcsIEVMWG1sUGF0aE1hcHBpbmcgewotCQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sQXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2QxZWI0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQXR0cmlidXRlTWFwcGluZzsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBleHRlbnNpb25zIHRvIFhtbEF0dHJpYnV0ZU1hcHBpbmcKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVMWG1sQXR0cmlidXRlTWFwcGluZwotCQlleHRlbmRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcsIEVMWG1sTmFtZWROb2RlTWFwcGluZyB7Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbENEQVRBLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxDREFUQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDNiZmYyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbENEQVRBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgWG1sQ0RBVEEgYW5ub3RhdGlvbgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRUxYbWxDREFUQQotCQlleHRlbmRzIEpheGJDb250ZXh0Tm9kZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbENEQVRBTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sQ0RBVEFNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MWM3ZmUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sQ0RBVEFNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIG1hcHBpbmdzIHRoYXQgaGF2ZSBhbiBYbWxDREFUQQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRUxYbWxDREFUQU1hcHBpbmcgewotCQotCS8vICoqKioqIHhtbENEQVRBICoqKioqCi0JCi0JLyoqCi0JICogU3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSB4bWxDREFUQSBwcm9wZXJ0eQotCSAqLwotCVN0cmluZyBYTUxfQ0RBVEFfUFJPUEVSVFkgPSAieG1sQ0RBVEEiOyAgLy8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHhtbENEQVRBIHByb3BlcnR5IHZhbHVlLgotCSAqIEEgbnVsbCBpbmRpY2F0ZXMgaXQgaXMgbm90IHNwZWNpZmllZC4KLQkgKi8KLQlFTFhtbENEQVRBIGdldFhtbENEQVRBKCk7Ci0JCi0JLyoqCi0JICogQWRkIChhbmQgcmV0dXJuKSBhbiB4bWxDREFUQSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiAoU3BlY2lmaWVzIHRoZSBwcm9wZXJ0eSkKLQkgKi8KLQlFTFhtbENEQVRBIGFkZFhtbENEQVRBKCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSB4bWxDREFUQSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiAoVW5zcGVjaWZpZXMgdGhlIHByb3BlcnR5KQotCSAqLwotCXZvaWQgcmVtb3ZlWG1sQ0RBVEEoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbERpc2NyaW1pbmF0b3JOb2RlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxEaXNjcmltaW5hdG9yTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGQyMTFkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbERpc2NyaW1pbmF0b3JOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byBYbWxEaXNjcmltaW5hdG9yTm9kZSBhbm5vdGF0aW9uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBFTFhtbERpc2NyaW1pbmF0b3JOb2RlCi0JCWV4dGVuZHMgSmF4YkNvbnRleHROb2RlIHsKLQkKLQkvLyAqKioqKiB2YWx1ZSAqKioqKgotCQotCS8qKgotCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgdmFsdWUgcHJvcGVydHkKLQkgKi8KLQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAgLy8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIHByb3BlcnR5IHZhbHVlLgotCSAqIEEgbnVsbCBpbmRpY2F0ZXMgaXQgaXMgbm90IHNwZWNpZmllZC4KLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIHByb3BlcnR5IHZhbHVlLgotCSAqIE51bGwgdW5zcGVjaWZpZXMgdGhlIHZhbHVlLgotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbERpc2NyaW1pbmF0b3JWYWx1ZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sRGlzY3JpbWluYXRvclZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNzRkMGEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sRGlzY3JpbWluYXRvclZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIFhtbERpc2NyaW1pbmF0b3JWYWx1ZSBhbm5vdGF0aW9uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBFTFhtbERpc2NyaW1pbmF0b3JWYWx1ZSB7Ci0JCi0JLy8gKioqKiogdmFsdWUgKioqKioKLQkKLQkvKioKLQkgKiBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHZhbHVlIHByb3BlcnR5Ci0JICovCi0JU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgIC8vLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiBBIG51bGwgaW5kaWNhdGVzIGl0IGlzIG5vdCBzcGVjaWZpZWQuCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiBOdWxsIHVuc3BlY2lmaWVzIHRoZSB2YWx1ZS4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxFbGVtZW50TWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sRWxlbWVudE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMwZGYwNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxFbGVtZW50TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50TWFwcGluZzsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBleHRlbnNpb25zIHRvIFhtbEVsZW1lbnRNYXBwaW5nCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBFTFhtbEVsZW1lbnRNYXBwaW5nCi0JCWV4dGVuZHMgWG1sRWxlbWVudE1hcHBpbmcsIEVMWG1sTmFtZWROb2RlTWFwcGluZywgRUxYbWxDREFUQU1hcHBpbmcgewotCQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sRWxlbWVudHNNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxFbGVtZW50c01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNmYzNmMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxFbGVtZW50c01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudHNNYXBwaW5nOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIGV4dGVuc2lvbnMgdG8gWG1sRWxlbWVudHNNYXBwaW5nCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBFTFhtbEVsZW1lbnRzTWFwcGluZwotCQlleHRlbmRzIFhtbEVsZW1lbnRzTWFwcGluZyB7Ci0JCi0JLy8gKioqKiogeG1sUGF0aHMgKioqKioKLQkKLQkvKioKLQkgKiBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHhtbFBhdGhzIGxpc3QKLQkgKi8KLQlTdHJpbmcgWE1MX1BBVEhTX0xJU1QgPSAieG1sUGF0aHMiOyAgLy8vJE5PTi1OTFMtMSQKLQkKLQlMaXN0SXRlcmFibGU8RUxYbWxQYXRoPiBnZXRYbWxQYXRocygpOwotCQotCWludCBnZXRYbWxQYXRoc1NpemUoKTsKLQkKLQlFTFhtbFBhdGggYWRkWG1sUGF0aChpbnQgaW5kZXgpOwotCQotCXZvaWQgcmVtb3ZlWG1sUGF0aChpbnQgaW5kZXgpOwotCQotCXZvaWQgbW92ZVhtbFBhdGgoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZWE2MDkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBFY2xpcHNlTGluayBYbWxJbnZlcnNlUmVmZXJlbmNlIGF0dHJpYnV0ZSBtYXBwaW5nIGluIGVpdGhlcgotICogamF2YSBhbm5vdGF0aW9ucyBvciBveG0gZmlsZS4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVMWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmcKLQkJZXh0ZW5kcyBKYXhiQXR0cmlidXRlTWFwcGluZyB7Ci0JCi0JLy8gKioqKiogbWFwcGVkQnkgKioqKioKLQkKLQkvKioKLQkgKiBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIG1hcHBlZEJ5IHByb3BlcnR5Ci0JICovCi0JU3RyaW5nIE1BUFBFRF9CWV9QUk9QRVJUWSA9ICJtYXBwZWRCeSI7ICAvLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbWFwcGVkQnkgcHJvcGVydHkgdmFsdWUuCi0JICogQSBudWxsIGluZGljYXRlcyBpdCBpcyBub3Qgc3BlY2lmaWVkLgotCSAqLwotCVN0cmluZyBnZXRNYXBwZWRCeSgpOwotCQotCS8qKgotCSAqIFNldCB0aGUgbWFwcGVkQnkgcHJvcGVydHkgdmFsdWUuCi0JICogU2V0dGluZyB0byBudWxsIHdpbGwgdW5zcGVjaWZ5IGl0LgotCSAqLwotCXZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG1hcHBlZEJ5KTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbEpvaW5Ob2RlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxKb2luTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTY2ZjA1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbEpvaW5Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gQFhtbEpvaW5Ob2RlLCB3aGV0aGVyIGF0IHRvcCBsZXZlbCBvciBuZXN0ZWQgaW4gQFhtbEpvaW5Ob2RlcwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRUxYbWxKb2luTm9kZQotCQlleHRlbmRzIEphdmFDb250ZXh0Tm9kZSB7Ci0JCi0JLy8gKioqKiogeG1sUGF0aCAqKioqKgotCQotCS8qKgotCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgeG1sUGF0aCBwcm9wZXJ0eQotCSAqLwotCVN0cmluZyBYTUxfUEFUSF9QUk9QRVJUWSA9ICJ4bWxQYXRoIjsgIC8vLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB4bWxQYXRoIHByb3BlcnR5IHZhbHVlLgotCSAqIEEgbnVsbCBpbmRpY2F0ZXMgaXQgaXMgbm90IHNwZWNpZmllZC4KLQkgKi8KLQlTdHJpbmcgZ2V0WG1sUGF0aCgpOwotCQotCS8qKgotCSAqIFNldCB0aGUgeG1sUGF0aCBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiBOdWxsIHVuc3BlY2lmaWVzIHRoZSB2YWx1ZS4KLQkgKi8KLQl2b2lkIHNldFhtbFBhdGgoU3RyaW5nIHZhbHVlKTsKLQkKLQkKLQkvLyAqKioqKiByZWZlcmVuY2VkWG1sUGF0aCAqKioqKgotCQotCS8qKgotCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcmVmZXJlbmNlZFhtbFBhdGggcHJvcGVydHkKLQkgKi8KLQlTdHJpbmcgUkVGRVJFTkNFRF9YTUxfUEFUSF9QUk9QRVJUWSA9ICJyZWZlcmVuY2VkWG1sUGF0aCI7ICAvLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVmZXJlbmNlZFhtbFBhdGggcHJvcGVydHkgdmFsdWUuCi0JICogQSBudWxsIGluZGljYXRlcyBpdCBpcyBub3Qgc3BlY2lmaWVkLgotCSAqLwotCVN0cmluZyBnZXRSZWZlcmVuY2VkWG1sUGF0aCgpOwotCQotCS8qKgotCSAqIFNldCB0aGUgcmVmZXJlbmNlZFhtbFBhdGggcHJvcGVydHkgdmFsdWUuCi0JICogTnVsbCB1bnNwZWNpZmllcyB0aGUgdmFsdWUuCi0JICovCi0Jdm9pZCBzZXRSZWZlcmVuY2VkWG1sUGF0aChTdHJpbmcgdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sSm9pbk5vZGVzTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sSm9pbk5vZGVzTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODIxZmExLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbEpvaW5Ob2Rlc01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVHlwZURlZmluaXRpb247Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBFY2xpcHNlTGluayBYbWxKb2luTm9kZXMgYXR0cmlidXRlIG1hcHBpbmcgaW4gZWl0aGVyCi0gKiBqYXZhIGFubm90YXRpb25zIG9yIG94bSBmaWxlLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRUxYbWxKb2luTm9kZXNNYXBwaW5nCi0JCWV4dGVuZHMgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgewotCQotCQotCS8vICoqKioqIFhtbEpvaW5Ob2RlcyAqKioqKgotCQotCVN0cmluZyBYTUxfSk9JTl9OT0RFU19MSVNUID0gInhtbEpvaW5Ob2RlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlMaXN0SXRlcmFibGU8RUxYbWxKb2luTm9kZT4gZ2V0WG1sSm9pbk5vZGVzKCk7Ci0JCi0JaW50IGdldFhtbEpvaW5Ob2Rlc1NpemUoKTsKLQkKLQlFTFhtbEpvaW5Ob2RlIGFkZFhtbEpvaW5Ob2RlKGludCBpbmRleCk7Ci0JCi0Jdm9pZCByZW1vdmVYbWxKb2luTm9kZShpbnQgaW5kZXgpOwotCQotCXZvaWQgbW92ZVhtbEpvaW5Ob2RlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JRUxDbGFzc01hcHBpbmcgZ2V0UmVmZXJlbmNlZENsYXNzTWFwcGluZygpOwotCQotCVhzZFR5cGVEZWZpbml0aW9uIGdldFJlZmVyZW5jZWRYc2RUeXBlRGVmaW5pdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sS2V5LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYzYzc5OS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNvbnRleHROb2RlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYbWxLZXkgYW5ub3RhdGlvbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRUxYbWxLZXkKLQkJZXh0ZW5kcyBKYXhiQ29udGV4dE5vZGUgewotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxOYW1lZE5vZGVNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxOYW1lZE5vZGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYTU5YjYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sTmFtZWROb2RlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxOYW1lZE5vZGVNYXBwaW5nOwotCi0KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSBmb3IgRUxYbWxFbGVtZW50TWFwcGluZyBhbmQgRUxYbWxBdHRyaWJ1dGVNYXBwaW5nCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBFTFhtbE5hbWVkTm9kZU1hcHBpbmcKLQkJZXh0ZW5kcyBYbWxOYW1lZE5vZGVNYXBwaW5nLCBFTFhtbFBhdGhNYXBwaW5nIHsKLQkKLQkvLyAqKioqKiBYbWxLZXkgKioqKioKLQkKLQkvKioKLQkgKiBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHhtbEtleSBwcm9wZXJ0eQotCSAqLwotCVN0cmluZyBYTUxfS0VZX1BST1BFUlRZID0gInhtbEtleSI7ICAvLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgeG1sS2V5IHByb3BlcnR5IHZhbHVlLgotCSAqIEEgbnVsbCBpbmRpY2F0ZXMgaXQgaXMgbm90IHNwZWNpZmllZC4KLQkgKi8KLQlFTFhtbEtleSBnZXRYbWxLZXkoKTsKLQkKLQkvKioKLQkgKiBBZGQgKGFuZCByZXR1cm4pIGFuIHhtbEtleSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiAoU3BlY2lmaWVzIHRoZSBwcm9wZXJ0eSkKLQkgKi8KLQlFTFhtbEtleSBhZGRYbWxLZXkoKTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIHhtbEtleSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiAoVW5zcGVjaWZpZXMgdGhlIHByb3BlcnR5KQotCSAqLwotCXZvaWQgcmVtb3ZlWG1sS2V5KCk7Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCS8qKgotCSAqIFJldHVybiBhbiBYUGF0aCB0byByZXByZXNlbnQgdGhpcyBhdHRyaWJ1dGUgbWFwcGluZy4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gdmFsaWQgWFBhdGggY2FuIGJlIGNvbnN0cnVjdGVkLgotCSAqIChUcml2aWFsIGlmIHRoaXMgbWFwcGluZyBoYXMgYW4gWG1sUGF0aCBhbm5vdGF0aW9uKQotCSAqLwotCVN0cmluZyBnZXRYUGF0aCgpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sUGF0aC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sUGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDk5MDVjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbFBhdGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNvbnRleHROb2RlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYbWxQYXRoIGFubm90YXRpb24KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVMWG1sUGF0aAotCQlleHRlbmRzIEpheGJDb250ZXh0Tm9kZSB7Ci0JCi0JLy8gKioqKiogdmFsdWUgKioqKioKLQkKLQkvKioKLQkgKiBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHZhbHVlIHByb3BlcnR5Ci0JICovCi0JU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgIC8vLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiBBIG51bGwgaW5kaWNhdGVzIGl0IGlzIG5vdCBzcGVjaWZpZWQuCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiBOdWxsIHVuc3BlY2lmaWVzIHRoZSB2YWx1ZS4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxQYXRoTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sUGF0aE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ1MjZmYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxQYXRoTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YTsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBtYXBwaW5ncyB0aGF0IGhhdmUgYW4gWG1sUGF0aAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRUxYbWxQYXRoTWFwcGluZyB7Ci0JCi0JLy8gKioqKiogeG1sUGF0aCAqKioqKgotCQotCS8qKgotCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgeG1sUGF0aCBwcm9wZXJ0eQotCSAqLwotCVN0cmluZyBYTUxfUEFUSF9QUk9QRVJUWSA9ICJ4bWxQYXRoIjsgIC8vLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB4bWxQYXRoIHByb3BlcnR5IHZhbHVlLgotCSAqIEEgbnVsbCBpbmRpY2F0ZXMgaXQgaXMgbm90IHNwZWNpZmllZC4KLQkgKi8KLQlFTFhtbFBhdGggZ2V0WG1sUGF0aCgpOwotCQotCS8qKgotCSAqIEFkZCAoYW5kIHJldHVybikgYW4geG1sUGF0aCBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiAoU3BlY2lmaWVzIHRoZSBwcm9wZXJ0eSkKLQkgKi8KLQlFTFhtbFBhdGggYWRkWG1sUGF0aCgpOwotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgeG1sUGF0aCBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiAoVW5zcGVjaWZpZXMgdGhlIHByb3BlcnR5KQotCSAqLwotCXZvaWQgcmVtb3ZlWG1sUGF0aCgpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sVmFsdWVNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxWYWx1ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlhNmY3MS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxWYWx1ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sVmFsdWVNYXBwaW5nOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgRUxYbWxWYWx1ZU1hcHBpbmcKLQkJZXh0ZW5kcyBYbWxWYWx1ZU1hcHBpbmcsIEVMWG1sQ0RBVEFNYXBwaW5nIHsKLQkKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0Fic3RyYWN0RUxKYXhiUGxhdGZvcm1EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9BYnN0cmFjdEVMSmF4YlBsYXRmb3JtRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTQzNjVjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0Fic3RyYWN0RUxKYXhiUGxhdGZvcm1EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuQWJzdHJhY3RKYXhiUGxhdGZvcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFTEpheGJQbGF0Zm9ybURlZmluaXRpb24KLQkJZXh0ZW5kcyBBYnN0cmFjdEpheGJQbGF0Zm9ybURlZmluaXRpb24gewotCQotCXByb3RlY3RlZCBBYnN0cmFjdEVMSmF4YlBsYXRmb3JtRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IEpheGJQbGF0Zm9ybURlZmluaXRpb24gZ2V0R2VuZXJpY0pheGJQbGF0Zm9ybURlZmluaXRpb24oKTsKLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYVR5cGVNYXBwaW5nKFN0cmluZyBqYXZhVHlwZU5hbWUpIHsKLQkJU3RyaW5nIG1hcHBpbmcgPSBnZXRHZW5lcmljSmF4YlBsYXRmb3JtRGVmaW5pdGlvbigpLmdldFNjaGVtYVR5cGVNYXBwaW5nKGphdmFUeXBlTmFtZSk7Ci0JCXJldHVybiAobWFwcGluZyAhPSBudWxsKSA/IG1hcHBpbmcgOiBzdXBlci5nZXRTY2hlbWFUeXBlTWFwcGluZyhqYXZhVHlwZU5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgU3RyaW5nPiBidWlsZEphdmFUb1NjaGVtYVR5cGVzKCkgewotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQltYXAucHV0KCJqYXZhLnNxbC5EYXRlIiwgImRhdGUiKTsKLQkJbWFwLnB1dCgiamF2YS5zcWwuVGltZSIsICJ0aW1lIik7Ci0JCW1hcC5wdXQoImphdmEuc3FsLlRpbWVzdGFtcCIsICJkYXRlVGltZSIpOwotCQlyZXR1cm4gbWFwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvRUxKYXhiQ29udGV4dFJvb3QuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvRUxKYXhiQ29udGV4dFJvb3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE2MjM4Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VMSmF4YkNvbnRleHRSb290LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuQWJzdHJhY3RKYXhiQ29udGV4dFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXhicHJvcHMuSmF4YlByb3BlcnRpZXNSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5FTEpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXhiQ29udGV4dFJvb3QKLQkJZXh0ZW5kcyBBYnN0cmFjdEpheGJDb250ZXh0Um9vdCB7Ci0JCi0JCi0JcHVibGljIEVMSmF4YkNvbnRleHRSb290KEpheGJQcm9qZWN0IGpheGJQcm9qZWN0KSB7Ci0JCXN1cGVyKGpheGJQcm9qZWN0KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQkKLQkJdmFsaWRhdGVKYXhiUHJvcGVydGllcyhtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUpheGJQcm9wZXJ0aWVzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJU3RyaW5nIGZhY3RvcnlQcm9wID0gImphdmF4LnhtbC5iaW5kLmNvbnRleHQuZmFjdG9yeSI7Ci0JCVN0cmluZyBmYWN0b3J5UHJvcFZhbHVlID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuSkFYQkNvbnRleHRGYWN0b3J5IjsKLQkJCQotCQlmb3IgKEpheGJQYWNrYWdlIGpwIDogZ2V0UGFja2FnZXMoKSkgewotCQkJU3RyaW5nIHBuID0ganAuZ2V0TmFtZSgpOwotCQkJSmF4YlByb3BlcnRpZXNSZXNvdXJjZSBqcHIgPSBnZXRKYXhiUHJvamVjdCgpLmdldEpheGJQcm9wZXJ0aWVzUmVzb3VyY2UocG4pOwotCQkJaWYgKGpwciAhPSBudWxsICYmIFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChqcHIuZ2V0UHJvcGVydHkoZmFjdG9yeVByb3ApLCBmYWN0b3J5UHJvcFZhbHVlKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJbWVzc2FnZXMuYWRkKAotCQkJCUVMSmF4YlZhbGlkYXRpb25NZXNzYWdlQnVpbGRlci5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlBST0pFQ1RfTUlTU0lOR19FQ0xJUFNFTElOS19KQVhCX0NPTlRFWFRfRkFDVE9SWSwKLQkJCQkJCWdldEpheGJQcm9qZWN0KCkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0pheGJQYWNrYWdlVGVzdGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0pheGJQYWNrYWdlVGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYzEwNjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9KYXhiUGFja2FnZVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLlByb3BlcnR5VGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXhicHJvcHMuSmF4YlByb3BlcnRpZXNSZXNvdXJjZTsKLQotCi1wdWJsaWMgY2xhc3MgSmF4YlBhY2thZ2VUZXN0ZXIKLQkJZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFTX0VDTElQU0VMSU5LX0pBWEJfUFJPUEVSVFkgPSAiaGFzRWNsaXBzZUxpbmtKYXhiUHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0W10gYXJncywgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKLQkJaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgSmF4YlBhY2thZ2UpIHsKLQkJCXJldHVybiB0ZXN0KChKYXhiUGFja2FnZSkgcmVjZWl2ZXIsIHByb3BlcnR5LCBleHBlY3RlZFZhbHVlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiB0ZXN0KEpheGJQYWNrYWdlIGpheGJQYWNrYWdlLCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCBleHBlY3RlZFZhbHVlKSB7Ci0JCWlmIChwcm9wZXJ0eS5lcXVhbHMoSEFTX0VDTElQU0VMSU5LX0pBWEJfUFJPUEVSVFkpKSB7Ci0JCQlKYXhiUHJvcGVydGllc1Jlc291cmNlIGpwciA9IAotCQkJCWpheGJQYWNrYWdlLmdldEpheGJQcm9qZWN0KCkuZ2V0SmF4YlByb3BlcnRpZXNSZXNvdXJjZShqYXhiUGFja2FnZS5nZXROYW1lKCkpOwotCQkJCi0JCQlib29sZWFuIHZhbHVlID0ganByICE9IG51bGw7Ci0JCQkKLQkJCWlmICh2YWx1ZSkgewotCQkJCVN0cmluZyBmYWN0b3J5UHJvcCA9ICJqYXZheC54bWwuYmluZC5jb250ZXh0LmZhY3RvcnkiOwotCQkJCVN0cmluZyBmYWN0b3J5UHJvcFZhbHVlID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuSkFYQkNvbnRleHRGYWN0b3J5IjsKLQkJCQl2YWx1ZSA9IFRvb2xzLnZhbHVlc0FyZUVxdWFsKGpwci5nZXRQcm9wZXJ0eShmYWN0b3J5UHJvcCksIGZhY3RvcnlQcm9wVmFsdWUpOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwodmFsdWUsIGV4cGVjdGVkVmFsdWUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhQ2xhc3NNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhQ2xhc3NNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNjVmNGYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YUNsYXNzTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTm90TnVsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlN1Ykl0ZXJhYmxlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxEaXNjcmltaW5hdG9yTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FTFhtbERpc2NyaW1pbmF0b3JWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FTFhtbE5hbWVkTm9kZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuWG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF2YUNsYXNzTWFwcGluZwotCQlleHRlbmRzIEdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nCi0JCWltcGxlbWVudHMgRUxDbGFzc01hcHBpbmcgewotCQotCXByb3RlY3RlZCBFTEphdmFYbWxEaXNjcmltaW5hdG9yTm9kZSB4bWxEaXNjcmltaW5hdG9yTm9kZTsKLQkKLQlwcm90ZWN0ZWQgRUxKYXZhWG1sRGlzY3JpbWluYXRvclZhbHVlIHhtbERpc2NyaW1pbmF0b3JWYWx1ZTsKLQkKLQkKLQlwdWJsaWMgRUxKYXZhQ2xhc3NNYXBwaW5nKEpheGJDbGFzcyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJaW5pdFhtbERpc2NyaW1pbmF0b3JOb2RlKCk7Ci0JCWluaXRYbWxEaXNjcmltaW5hdG9yVmFsdWUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3luYy91cGRhdGUgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXN5bmNYbWxEaXNjcmltaW5hdG9yTm9kZSgpOwotCQlzeW5jWG1sRGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXVwZGF0ZVhtbERpc2NyaW1pbmF0b3JOb2RlKCk7Ci0JCXVwZGF0ZVhtbERpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB4bWxEaXNjcmltaW5hdG9yTm9kZSAqKioqKgotCQotCXB1YmxpYyBFTFhtbERpc2NyaW1pbmF0b3JOb2RlIGdldFhtbERpc2NyaW1pbmF0b3JOb2RlKCkgewotCQlyZXR1cm4gdGhpcy54bWxEaXNjcmltaW5hdG9yTm9kZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sRGlzY3JpbWluYXRvck5vZGVfKEVMSmF2YVhtbERpc2NyaW1pbmF0b3JOb2RlIHhtbERpc2NyaW1pbmF0b3JOb2RlKSB7Ci0JCUVMWG1sRGlzY3JpbWluYXRvck5vZGUgb2xkID0gdGhpcy54bWxEaXNjcmltaW5hdG9yTm9kZTsKLQkJdGhpcy54bWxEaXNjcmltaW5hdG9yTm9kZSA9IHhtbERpc2NyaW1pbmF0b3JOb2RlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9ESVNDUklNSU5BVE9SX05PREVfUFJPUEVSVFksIG9sZCwgeG1sRGlzY3JpbWluYXRvck5vZGUpOwotCX0KLQkKLQlwdWJsaWMgRUxYbWxEaXNjcmltaW5hdG9yTm9kZSBhZGRYbWxEaXNjcmltaW5hdG9yTm9kZSgpIHsKLQkJaWYgKHRoaXMueG1sRGlzY3JpbWluYXRvck5vZGUgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZVR5cGUoKS5hZGRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfRElTQ1JJTUlOQVRPUl9OT0RFKTsKLQkJRUxKYXZhWG1sRGlzY3JpbWluYXRvck5vZGUgeG1sRGlzY3JpbWluYXRvck5vZGUgPSBidWlsZFhtbERpc2NyaW1pbmF0b3JOb2RlKCk7Ci0JCXNldFhtbERpc2NyaW1pbmF0b3JOb2RlXyh4bWxEaXNjcmltaW5hdG9yTm9kZSk7Ci0JCXJldHVybiB4bWxEaXNjcmltaW5hdG9yTm9kZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sRGlzY3JpbWluYXRvck5vZGUoKSB7Ci0JCWlmICh0aGlzLnhtbERpc2NyaW1pbmF0b3JOb2RlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlnZXRKYXZhUmVzb3VyY2VUeXBlKCkucmVtb3ZlQW5ub3RhdGlvbihFTEpheGIuWE1MX0RJU0NSSU1JTkFUT1JfTk9ERSk7Ci0JCXNldFhtbERpc2NyaW1pbmF0b3JOb2RlXyhudWxsKTsKLQl9Ci0JCi0JcHVibGljIFhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbiBnZXRYbWxEaXNjcmltaW5hdG9yTm9kZUFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihFTEpheGIuWE1MX0RJU0NSSU1JTkFUT1JfTk9ERSk7Ci0JfQotCQotCXByb3RlY3RlZCBFTEphdmFYbWxEaXNjcmltaW5hdG9yTm9kZSBidWlsZFhtbERpc2NyaW1pbmF0b3JOb2RlKCkgewotCQlyZXR1cm4gbmV3IEVMSmF2YVhtbERpc2NyaW1pbmF0b3JOb2RlKHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0WG1sRGlzY3JpbWluYXRvck5vZGUoKSB7Ci0JCVhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMueG1sRGlzY3JpbWluYXRvck5vZGUgPSAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBidWlsZFhtbERpc2NyaW1pbmF0b3JOb2RlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNYbWxEaXNjcmltaW5hdG9yTm9kZSgpIHsKLQkJWG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxEaXNjcmltaW5hdG9yTm9kZUFubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJaWYgKHRoaXMueG1sRGlzY3JpbWluYXRvck5vZGUgIT0gbnVsbCkgewotCQkJCXRoaXMueG1sRGlzY3JpbWluYXRvck5vZGUuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0WG1sRGlzY3JpbWluYXRvck5vZGVfKGJ1aWxkWG1sRGlzY3JpbWluYXRvck5vZGUoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRYbWxEaXNjcmltaW5hdG9yTm9kZV8obnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlWG1sRGlzY3JpbWluYXRvck5vZGUoKSB7Ci0JCWlmICh0aGlzLnhtbERpc2NyaW1pbmF0b3JOb2RlICE9IG51bGwpIHsKLQkJCXRoaXMueG1sRGlzY3JpbWluYXRvck5vZGUudXBkYXRlKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKiogeG1sRGlzY3JpbWluYXRvclZhbHVlICoqKioqCi0JCi0JcHVibGljIEVMWG1sRGlzY3JpbWluYXRvclZhbHVlIGdldFhtbERpc2NyaW1pbmF0b3JWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMueG1sRGlzY3JpbWluYXRvclZhbHVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxEaXNjcmltaW5hdG9yVmFsdWVfKEVMSmF2YVhtbERpc2NyaW1pbmF0b3JWYWx1ZSB4bWxEaXNjcmltaW5hdG9yVmFsdWUpIHsKLQkJRUxYbWxEaXNjcmltaW5hdG9yVmFsdWUgb2xkID0gdGhpcy54bWxEaXNjcmltaW5hdG9yVmFsdWU7Ci0JCXRoaXMueG1sRGlzY3JpbWluYXRvclZhbHVlID0geG1sRGlzY3JpbWluYXRvclZhbHVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9ESVNDUklNSU5BVE9SX1ZBTFVFX1BST1BFUlRZLCBvbGQsIHhtbERpc2NyaW1pbmF0b3JWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBFTFhtbERpc2NyaW1pbmF0b3JWYWx1ZSBhZGRYbWxEaXNjcmltaW5hdG9yVmFsdWUoKSB7Ci0JCWlmICh0aGlzLnhtbERpc2NyaW1pbmF0b3JWYWx1ZSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZ2V0SmF2YVJlc291cmNlVHlwZSgpLmFkZEFubm90YXRpb24oRUxKYXhiLlhNTF9ESVNDUklNSU5BVE9SX1ZBTFVFKTsKLQkJRUxKYXZhWG1sRGlzY3JpbWluYXRvclZhbHVlIHhtbERpc2NyaW1pbmF0b3JWYWx1ZSA9IGJ1aWxkWG1sRGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JCXNldFhtbERpc2NyaW1pbmF0b3JWYWx1ZV8oeG1sRGlzY3JpbWluYXRvclZhbHVlKTsKLQkJcmV0dXJuIHhtbERpc2NyaW1pbmF0b3JWYWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sRGlzY3JpbWluYXRvclZhbHVlKCkgewotCQlpZiAodGhpcy54bWxEaXNjcmltaW5hdG9yVmFsdWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZVR5cGUoKS5yZW1vdmVBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfRElTQ1JJTUlOQVRPUl9WQUxVRSk7Ci0JCXNldFhtbERpc2NyaW1pbmF0b3JWYWx1ZV8obnVsbCk7Ci0JfQotCQotCXB1YmxpYyBYbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIGdldFhtbERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oRUxKYXhiLlhNTF9ESVNDUklNSU5BVE9SX1ZBTFVFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVMSmF2YVhtbERpc2NyaW1pbmF0b3JWYWx1ZSBidWlsZFhtbERpc2NyaW1pbmF0b3JWYWx1ZSgpIHsKLQkJcmV0dXJuIG5ldyBFTEphdmFYbWxEaXNjcmltaW5hdG9yVmFsdWUodGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRYbWxEaXNjcmltaW5hdG9yVmFsdWUoKSB7Ci0JCVhtbERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24oKTsKLQkJdGhpcy54bWxEaXNjcmltaW5hdG9yVmFsdWUgPSAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBidWlsZFhtbERpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sRGlzY3JpbWluYXRvclZhbHVlKCkgewotCQlYbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnhtbERpc2NyaW1pbmF0b3JWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJdGhpcy54bWxEaXNjcmltaW5hdG9yVmFsdWUuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0WG1sRGlzY3JpbWluYXRvclZhbHVlXyhidWlsZFhtbERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXNldFhtbERpc2NyaW1pbmF0b3JWYWx1ZV8obnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlWG1sRGlzY3JpbWluYXRvclZhbHVlKCkgewotCQlpZiAodGhpcy54bWxEaXNjcmltaW5hdG9yVmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy54bWxEaXNjcmltaW5hdG9yVmFsdWUudXBkYXRlKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEtleVhQYXRocygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZSgKLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxFTFhtbE5hbWVkTm9kZU1hcHBpbmcsIFN0cmluZz4oZ2V0QWxsS2V5TWFwcGluZ3MoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oRUxYbWxOYW1lZE5vZGVNYXBwaW5nIG8pIHsKLQkJCQkJCXJldHVybiBvLmdldFhQYXRoKCk7Ci0JCQkJCX0KLQkJCQl9LAotCQkJCU5vdE51bGxGaWx0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxFTFhtbE5hbWVkTm9kZU1hcHBpbmc+IGdldEFsbEtleU1hcHBpbmdzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEVMWG1sTmFtZWROb2RlTWFwcGluZz4oCi0JCQkJbmV3IFN1Ykl0ZXJhYmxlV3JhcHBlcjxKYXhiQXR0cmlidXRlTWFwcGluZywgRUxYbWxOYW1lZE5vZGVNYXBwaW5nPigKLQkJCQkJCW5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXhiQXR0cmlidXRlTWFwcGluZz4oCi0JCQkJCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlLCBKYXhiQXR0cmlidXRlTWFwcGluZz4oZ2V0QWxsQXR0cmlidXRlcygpKSB7Ci0JCQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQkJCXByb3RlY3RlZCBKYXhiQXR0cmlidXRlTWFwcGluZyB0cmFuc2Zvcm0oSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgbykgewotCQkJCQkJCQkJCXJldHVybiBvLmdldE1hcHBpbmcoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSkgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKYXhiQXR0cmlidXRlTWFwcGluZyBvKSB7Ci0JCQkJCQkJCXJldHVybiAoby5nZXRLZXkoKSA9PSBNYXBwaW5nS2V5cy5YTUxfRUxFTUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkKLQkJCQkJCQkJCQl8fCBvLmdldEtleSgpID09IE1hcHBpbmdLZXlzLlhNTF9BVFRSSUJVVEVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoRUxYbWxOYW1lZE5vZGVNYXBwaW5nIG8pIHsKLQkJCQlyZXR1cm4gby5nZXRYbWxJRCgpICE9IG51bGwgfHwgby5nZXRYbWxLZXkoKSAhPSBudWxsOwotCQkJfQotCQl9OwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKAotCQkJaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCWlmICh0aGlzLnhtbERpc2NyaW1pbmF0b3JOb2RlICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHRoaXMueG1sRGlzY3JpbWluYXRvck5vZGUuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJaWYgKHRoaXMueG1sRGlzY3JpbWluYXRvck5vZGUgIT0gbnVsbCkgewotCQkJdGhpcy54bWxEaXNjcmltaW5hdG9yTm9kZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JCQotCQlpZiAodGhpcy54bWxEaXNjcmltaW5hdG9yVmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy54bWxEaXNjcmltaW5hdG9yVmFsdWUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFFbGVtZW50RmFjdG9yeU1ldGhvZC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMjJjNTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkVMSmF4YlZhbGlkYXRpb25NZXNzYWdlQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kCi0JCWV4dGVuZHMgR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZCB7Ci0JCi0JcHVibGljIEVMSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kKFhtbFJlZ2lzdHJ5IHBhcmVudCwgSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kKSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNZXRob2QpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1ldGhvZFJldHVyblR5cGUoCi0JCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QsIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkKLQkJaWYgKCEgcmVzb3VyY2VNZXRob2QudHlwZUlzU3ViVHlwZU9mKEpBWEIuSkFYQl9FTEVNRU5UKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXIuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9FTEVNRU5UX0RFQ0xfX0lOVkFMSURfTUVUSE9EX1NJR05BVFVSRV9SRVRVUk5fVFlQRSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCWdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzVmYzVkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FTFhtbEFueUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFBhdGhBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmcKLQkJZXh0ZW5kcyBHZW5lcmljSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmcgCi0JCWltcGxlbWVudHMgRUxYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nIHsKLQkKLQlwcm90ZWN0ZWQgRUxKYXZhWG1sUGF0aCB4bWxQYXRoOwotCQotCQotCXB1YmxpYyBFTEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQlpbml0WG1sUGF0aCgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzeW5jL3VwZGF0ZSAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc3luY1htbFBhdGgoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sUGF0aCAqKioqKgotCQotCXB1YmxpYyBFTFhtbFBhdGggZ2V0WG1sUGF0aCgpIHsKLQkJcmV0dXJuIHRoaXMueG1sUGF0aDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sUGF0aF8oRUxKYXZhWG1sUGF0aCB4bWxQYXRoKSB7Ci0JCUVMSmF2YVhtbFBhdGggb2xkID0gdGhpcy54bWxQYXRoOwotCQl0aGlzLnhtbFBhdGggPSB4bWxQYXRoOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9QQVRIX1BST1BFUlRZLCBvbGQsIHRoaXMueG1sUGF0aCk7Ci0JfQotCQotCXB1YmxpYyBFTFhtbFBhdGggYWRkWG1sUGF0aCgpIHsKLQkJaWYgKHRoaXMueG1sUGF0aCAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbigwLCBFTEpheGIuWE1MX1BBVEgpOwotCQlFTEphdmFYbWxQYXRoIHhtbFBhdGggPSBidWlsZFhtbFBhdGgoKTsKLQkJc2V0WG1sUGF0aF8oeG1sUGF0aCk7Ci0JCXJldHVybiB4bWxQYXRoOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxQYXRoKCkgewotCQlpZiAodGhpcy54bWxQYXRoID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQl3aGlsZSAoZ2V0WG1sUGF0aEFubm90YXRpb24oKSAhPSBudWxsKSB7Ci0JCQlnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKDAsIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCX0KLQkJc2V0WG1sUGF0aF8obnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRYbWxQYXRoKCkgewotCQlYbWxQYXRoQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sUGF0aEFubm90YXRpb24oKTsKLQkJdGhpcy54bWxQYXRoID0gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogYnVpbGRYbWxQYXRoKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNYbWxQYXRoKCkgewotCQlYbWxQYXRoQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sUGF0aEFubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJaWYgKHRoaXMueG1sUGF0aCA9PSBudWxsKSB7Ci0JCQkJc2V0WG1sUGF0aF8oYnVpbGRYbWxQYXRoKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy54bWxQYXRoLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXNldFhtbFBhdGhfKG51bGwpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBFTEphdmFYbWxQYXRoIGJ1aWxkWG1sUGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBFTEphdmFYbWxQYXRoKHRoaXMsIG5ldyBYbWxQYXRoQ29udGV4dCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbFBhdGhBbm5vdGF0aW9uIGdldFhtbFBhdGhBbm5vdGF0aW9uKCkgewotCQlpZiAoZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbnNTaXplKEVMSmF4Yi5YTUxfUEFUSCkgPiAwKSB7Ci0JCQlyZXR1cm4gKFhtbFBhdGhBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKDAsIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCS8vICoqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJaWYgKHRoaXMueG1sUGF0aCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSB0aGlzLnhtbFBhdGguZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJaWYgKHRoaXMueG1sUGF0aCAhPSBudWxsKSB7Ci0JCQl2YWxpZGF0ZVhtbFBhdGgobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVhtbFBhdGgoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy54bWxQYXRoLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxQYXRoQ29udGV4dAotCQkJaW1wbGVtZW50cyBFTEphdmFYbWxQYXRoLkNvbnRleHQgewotCQkKLQkJcHVibGljIFhtbFBhdGhBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCQlyZXR1cm4gRUxKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZy50aGlzLmdldFhtbFBhdGhBbm5vdGF0aW9uKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEVMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmcudGhpczsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MzVhNWUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi0JCWV4dGVuZHMgSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFTEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEVMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gCi0JCQl7Ci0JCQkJRUxKYXhiLlhNTF9QQVRIIH07Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBFTEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByb3RlY3RlZCBFTEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQkJCXN1cGVyLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJCQluZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUykpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlOGIxMjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50UmVmczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFJlZkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FTFhtbEFueUVsZW1lbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVMWG1sUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxQYXRoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZwotCQlleHRlbmRzIEdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcgCi0JCWltcGxlbWVudHMgRUxYbWxBbnlFbGVtZW50TWFwcGluZyB7Ci0JCi0JcHJvdGVjdGVkIEVMSmF2YVhtbFBhdGggeG1sUGF0aDsKLQkKLQkKLQlwdWJsaWMgRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCWluaXRYbWxQYXRoKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHN5bmMvdXBkYXRlICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlzeW5jWG1sUGF0aCgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxQYXRoICoqKioqCi0JCi0JcHVibGljIEVMWG1sUGF0aCBnZXRYbWxQYXRoKCkgewotCQlyZXR1cm4gdGhpcy54bWxQYXRoOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxQYXRoXyhFTEphdmFYbWxQYXRoIHhtbFBhdGgpIHsKLQkJRUxKYXZhWG1sUGF0aCBvbGQgPSB0aGlzLnhtbFBhdGg7Ci0JCXRoaXMueG1sUGF0aCA9IHhtbFBhdGg7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoWE1MX1BBVEhfUFJPUEVSVFksIG9sZCwgdGhpcy54bWxQYXRoKTsKLQl9Ci0JCi0JcHVibGljIEVMWG1sUGF0aCBhZGRYbWxQYXRoKCkgewotCQlpZiAodGhpcy54bWxQYXRoICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKDAsIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCUVMSmF2YVhtbFBhdGggeG1sUGF0aCA9IGJ1aWxkWG1sUGF0aCgpOwotCQlzZXRYbWxQYXRoXyh4bWxQYXRoKTsKLQkJcmV0dXJuIHhtbFBhdGg7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbFBhdGgoKSB7Ci0JCWlmICh0aGlzLnhtbFBhdGggPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXdoaWxlIChnZXRYbWxQYXRoQW5ub3RhdGlvbigpICE9IG51bGwpIHsKLQkJCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oMCwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJfQotCQlzZXRYbWxQYXRoXyhudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFhtbFBhdGgoKSB7Ci0JCVhtbFBhdGhBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxQYXRoQW5ub3RhdGlvbigpOwotCQl0aGlzLnhtbFBhdGggPSAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBidWlsZFhtbFBhdGgoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1htbFBhdGgoKSB7Ci0JCVhtbFBhdGhBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxQYXRoQW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy54bWxQYXRoID09IG51bGwpIHsKLQkJCQlzZXRYbWxQYXRoXyhidWlsZFhtbFBhdGgoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLnhtbFBhdGguc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJc2V0WG1sUGF0aF8obnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEVMSmF2YVhtbFBhdGggYnVpbGRYbWxQYXRoKCkgewotCQlyZXR1cm4gbmV3IEVMSmF2YVhtbFBhdGgodGhpcywgbmV3IFhtbFBhdGhDb250ZXh0KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sUGF0aEFubm90YXRpb24gZ2V0WG1sUGF0aEFubm90YXRpb24oKSB7Ci0JCWlmIChnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uc1NpemUoRUxKYXhiLlhNTF9QQVRIKSA+IDApIHsKLQkJCXJldHVybiAoWG1sUGF0aEFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oMCwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxFbGVtZW50V3JhcHBlciBidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlyZXR1cm4gbmV3IEVMSmF2YVhtbEVsZW1lbnRXcmFwcGVyKHRoaXMsIG5ldyBYbWxFbGVtZW50V3JhcHBlckNvbnRleHQoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxFbGVtZW50UmVmcyBidWlsZFhtbEVsZW1lbnRSZWZzKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZnModGhpcywgbmV3IFhtbEVsZW1lbnRSZWZzQ29udGV4dCgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogY29udGVudCBhc3Npc3QgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlpZiAodGhpcy54bWxQYXRoICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHRoaXMueG1sUGF0aC5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlpZiAodGhpcy54bWxQYXRoICE9IG51bGwpIHsKLQkJCXZhbGlkYXRlWG1sUGF0aChtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlWG1sUGF0aChMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnhtbFBhdGgudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFhtbFBhdGhDb250ZXh0Ci0JCQlpbXBsZW1lbnRzIEVMSmF2YVhtbFBhdGguQ29udGV4dCB7Ci0JCQotCQlwdWJsaWMgWG1sUGF0aEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLQkJCXJldHVybiBFTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZy50aGlzLmdldFhtbFBhdGhBbm5vdGF0aW9uKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEVMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nLnRoaXM7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFhtbEVsZW1lbnRXcmFwcGVyQ29udGV4dAotCQkJaW1wbGVtZW50cyBFTEphdmFYbWxFbGVtZW50V3JhcHBlci5Db250ZXh0IHsKLQkJCi0JCXB1YmxpYyBYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLQkJCXJldHVybiBFTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZy50aGlzLmdldFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbigpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBoYXNYbWxQYXRoKCkgewotCQkJcmV0dXJuIEVMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nLnRoaXMueG1sUGF0aCAhPSBudWxsOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxFbGVtZW50UmVmc0NvbnRleHQKLQkJCWV4dGVuZHMgR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZy5YbWxFbGVtZW50UmVmc0NvbnRleHQgewotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBYbWxFbGVtZW50UmVmIGJ1aWxkWG1sRWxlbWVudFJlZihKYXZhQ29udGV4dE5vZGUgcGFyZW50LCBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCQlyZXR1cm4gbmV3IEVMSmF2YVhtbEVsZW1lbnRSZWYocGFyZW50LCBuZXcgR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZy5YbWxFbGVtZW50UmVmQ29udGV4dChhbm5vdGF0aW9uKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YTVjZDkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFYbWxBbnlFbGVtZW50TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdEZWZpbml0aW9uCi0JCWV4dGVuZHMgSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gCi0JCQl7Ci0JCQkJRUxKYXhiLlhNTF9QQVRIIH07Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBFTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCQkJc3VwZXIuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQkJCW5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MTg0NDQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxJRDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbElEQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FTFhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC54cGF0aC5qYXZhLlhQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEtleUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFBhdGhBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcKLQkJZXh0ZW5kcyBHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcKLQkJaW1wbGVtZW50cyBFTFhtbEF0dHJpYnV0ZU1hcHBpbmcgewotCQotCXByb3RlY3RlZCBFTEphdmFYbWxQYXRoIHhtbFBhdGg7Ci0JCi0JcHJvdGVjdGVkIEVMSmF2YVhtbEtleSB4bWxLZXk7Ci0JCi0JCi0JcHVibGljIEVMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCWluaXRYbWxQYXRoKCk7Ci0JCWluaXRYbWxLZXkoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbElEIGJ1aWxkWG1sSUQoWG1sSURBbm5vdGF0aW9uIHhtbElEQW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEVMSmF2YVhtbElEKHRoaXMsIHhtbElEQW5ub3RhdGlvbik7Ci0JfQotCQotCQotCS8vICoqKioqIHN5bmMvdXBkYXRlICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlzeW5jWG1sUGF0aCgpOwotCQlzeW5jWG1sS2V5KCk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbFBhdGggKioqKioKLQkKLQlwdWJsaWMgRUxYbWxQYXRoIGdldFhtbFBhdGgoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFBhdGg7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFhtbFBhdGhfKEVMSmF2YVhtbFBhdGggeG1sUGF0aCkgewotCQlFTEphdmFYbWxQYXRoIG9sZCA9IHRoaXMueG1sUGF0aDsKLQkJdGhpcy54bWxQYXRoID0geG1sUGF0aDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChYTUxfUEFUSF9QUk9QRVJUWSwgb2xkLCB0aGlzLnhtbFBhdGgpOwotCX0KLQkKLQlwdWJsaWMgRUxYbWxQYXRoIGFkZFhtbFBhdGgoKSB7Ci0JCWlmICh0aGlzLnhtbFBhdGggIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oMCwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJRUxKYXZhWG1sUGF0aCB4bWxQYXRoID0gYnVpbGRYbWxQYXRoKCk7Ci0JCXNldFhtbFBhdGhfKHhtbFBhdGgpOwotCQlyZXR1cm4geG1sUGF0aDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sUGF0aCgpIHsKLQkJaWYgKHRoaXMueG1sUGF0aCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJd2hpbGUgKGdldFhtbFBhdGhBbm5vdGF0aW9uKCkgIT0gbnVsbCkgewotCQkJZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbigwLCBFTEpheGIuWE1MX1BBVEgpOwotCQl9Ci0JCXNldFhtbFBhdGhfKG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0WG1sUGF0aCgpIHsKLQkJWG1sUGF0aEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbFBhdGhBbm5vdGF0aW9uKCk7Ci0JCXRoaXMueG1sUGF0aCA9IChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGJ1aWxkWG1sUGF0aCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sUGF0aCgpIHsKLQkJWG1sUGF0aEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbFBhdGhBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnhtbFBhdGggPT0gbnVsbCkgewotCQkJCXNldFhtbFBhdGhfKGJ1aWxkWG1sUGF0aCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMueG1sUGF0aC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRYbWxQYXRoXyhudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgRUxKYXZhWG1sUGF0aCBidWlsZFhtbFBhdGgoKSB7Ci0JCXJldHVybiBuZXcgRUxKYXZhWG1sUGF0aCh0aGlzLCBuZXcgWG1sUGF0aENvbnRleHQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxQYXRoQW5ub3RhdGlvbiBnZXRYbWxQYXRoQW5ub3RhdGlvbigpIHsKLQkJaWYgKGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb25zU2l6ZShFTEpheGIuWE1MX1BBVEgpID4gMCkgewotCQkJcmV0dXJuIChYbWxQYXRoQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbigwLCBFTEpheGIuWE1MX1BBVEgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxLZXkgKioqKioKLQkKLQlwdWJsaWMgRUxYbWxLZXkgZ2V0WG1sS2V5KCkgewotCQlyZXR1cm4gdGhpcy54bWxLZXk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFhtbEtleV8oRUxKYXZhWG1sS2V5IHhtbEtleSkgewotCQlFTEphdmFYbWxLZXkgb2xkID0gdGhpcy54bWxLZXk7Ci0JCXRoaXMueG1sS2V5ID0geG1sS2V5OwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9LRVlfUFJPUEVSVFksIG9sZCwgdGhpcy54bWxLZXkpOwotCX0KLQkKLQlwdWJsaWMgRUxYbWxLZXkgYWRkWG1sS2V5KCkgewotCQlpZiAodGhpcy54bWxLZXkgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oRUxKYXhiLlhNTF9LRVkpOwotCQlFTEphdmFYbWxLZXkgeG1sS2V5ID0gYnVpbGRYbWxLZXkoKTsKLQkJc2V0WG1sS2V5Xyh4bWxLZXkpOwotCQlyZXR1cm4geG1sS2V5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxLZXkoKSB7Ci0JCWlmICh0aGlzLnhtbEtleSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihFTEpheGIuWE1MX0tFWSk7Ci0JCXNldFhtbEtleV8obnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRYbWxLZXkoKSB7Ci0JCVhtbEtleUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbEtleUFubm90YXRpb24oKTsKLQkJdGhpcy54bWxLZXkgPSAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBidWlsZFhtbEtleSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sS2V5KCkgewotCQlYbWxLZXlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxLZXlBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnhtbEtleSA9PSBudWxsKSB7Ci0JCQkJc2V0WG1sS2V5XyhidWlsZFhtbEtleSgpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXNldFhtbEtleV8obnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEVMSmF2YVhtbEtleSBidWlsZFhtbEtleSgpIHsKLQkJcmV0dXJuIG5ldyBFTEphdmFYbWxLZXkodGhpcywgbmV3IFhtbEtleUNvbnRleHQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxLZXlBbm5vdGF0aW9uIGdldFhtbEtleUFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sS2V5QW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihFTEpheGIuWE1MX0tFWSk7Ci0JfQotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFhQYXRoKCkgewotCQlpZiAodGhpcy54bWxQYXRoICE9IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLnhtbFBhdGguZ2V0VmFsdWUoKTsKLQkJfQotCQkKLQkJU3RyaW5nIG5hbWUgPSB0aGlzLnFOYW1lLmdldE5hbWUoKTsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkobmFtZSkpIHsKLQkJCS8vIG5vIG5hbWUgaXMgaW52YWxpZAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZyBuYW1lc3BhY2UgPSB0aGlzLnFOYW1lLmdldE5hbWVzcGFjZSgpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShuYW1lc3BhY2UpKSB7Ci0JCQkvLyBlbXB0eSBuYW1lc3BhY2UgbWVhbnMgIm5vIiBuYW1lc3BhY2UKLQkJCXJldHVybiBYUGF0aC5hdHRyaWJ1dGVYUGF0aChudWxsLCBuYW1lKTsKLQkJfQotCQkKLQkJU3RyaW5nIHByZWZpeCA9IGdldEpheGJQYWNrYWdlKCkuZ2V0UGFja2FnZUluZm8oKS5nZXRQcmVmaXhGb3JOYW1lc3BhY2UobmFtZXNwYWNlKTsKLQkJaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0JCQkvLyBubyBwcmVmaXggZm9yIG5vbi1udWxsIG5hbWVzcGFjZSBpcyBpbnZhbGlkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuIFhQYXRoLmF0dHJpYnV0ZVhQYXRoKHByZWZpeCwgdGhpcy5xTmFtZS5nZXROYW1lKCkpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCWlmICh0aGlzLnhtbFBhdGggIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gdGhpcy54bWxQYXRoLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVRTmFtZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAodGhpcy54bWxQYXRoID09IG51bGwpIHsKLQkJCXN1cGVyLnZhbGlkYXRlUU5hbWUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCQllbHNlIHsKLQkJCXZhbGlkYXRlWG1sUGF0aChtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlWG1sUGF0aChMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnhtbFBhdGgudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFhtbFBhdGhDb250ZXh0Ci0JCQlpbXBsZW1lbnRzIEVMSmF2YVhtbFBhdGguQ29udGV4dCB7Ci0JCQotCQlwdWJsaWMgWG1sUGF0aEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLQkJCXJldHVybiBFTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nLnRoaXMuZ2V0WG1sUGF0aEFubm90YXRpb24oKTsKLQkJfQotCQkKLQkJcHVibGljIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGdldEF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZy50aGlzOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxLZXlDb250ZXh0Ci0JCQlpbXBsZW1lbnRzIEVMSmF2YVhtbEtleS5Db250ZXh0IHsKLQkJCi0JCXB1YmxpYyBYbWxLZXlBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCQlyZXR1cm4gRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZy50aGlzLmdldFhtbEtleUFubm90YXRpb24oKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNzc1YTkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhWG1sQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuWG1sUGF0aEFubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIEVMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi0JCWV4dGVuZHMgSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi0JCWltcGxlbWVudHMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBFTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IAotCQkJewotCQkJCUVMSmF4Yi5YTUxfS0VZLAotCQkJCUVMSmF4Yi5YTUxfUEFUSCB9OwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByb3RlY3RlZCBFTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQkJCXN1cGVyLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJCQluZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUykpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQkvLyB0ZXN0IHdoZXRoZXIgYW5ub3RhdGVkIHdpdGggQFhtbFBhdGgsIGFuZCBpZiBzbywgaWYgbGFzdCBzZWdtZW50IHN0YXJ0cyB3aXRoICJAIgotCQkvLyAocHJlc2VuY2Ugb2YgIkAiIGVsc2V3aGVyZSBtYXkgYmUgYSBub2RlIHNlbGVjdCBjbGF1c2UpCi0JCVhtbFBhdGhBbm5vdGF0aW9uIHhtbFBhdGhBbm5vdGF0aW9uID0gbnVsbDsKLQkJaWYgKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbnNTaXplKEVMSmF4Yi5YTUxfUEFUSCkgPiAwKSB7Ci0JCQl4bWxQYXRoQW5ub3RhdGlvbiA9IChYbWxQYXRoQW5ub3RhdGlvbikgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKDAsIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCX0KLQkJaWYgKHhtbFBhdGhBbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdmFsdWUgPSB4bWxQYXRoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiLyIpOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJaWYgKCEgdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCXJldHVybiB0b2tlbi5zdGFydHNXaXRoKCJAIik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxDREFUQS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbENEQVRBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Njc5ZDMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbENEQVRBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVMWG1sQ0RBVEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbENEQVRBQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sQ0RBVEEKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZQotCQlpbXBsZW1lbnRzIEVMWG1sQ0RBVEEgewotCQotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0IGNvbnRleHQ7Ci0JCi0JCi0JcHVibGljIEVMSmF2YVhtbENEQVRBKEphdmFDb250ZXh0Tm9kZSBwYXJlbnQsIENvbnRleHQgY29udGV4dCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuY29udGV4dC5nZXRBbm5vdGF0aW9uKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQkKLQlwdWJsaWMgaW50ZXJmYWNlIENvbnRleHQgewotCQkKLQkJWG1sQ0RBVEFBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRGlzY3JpbWluYXRvck5vZGUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxEaXNjcmltaW5hdG9yTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTU3MTA5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxEaXNjcmltaW5hdG9yTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxEaXNjcmltaW5hdG9yTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQueHBhdGguamF2YS5YUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQueHBhdGguamF2YS5YUGF0aEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkVMSmF4YlZhbGlkYXRpb25NZXNzYWdlQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxEaXNjcmltaW5hdG9yTm9kZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sRGlzY3JpbWluYXRvck5vZGUKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZQotCQlpbXBsZW1lbnRzIEVMWG1sRGlzY3JpbWluYXRvck5vZGUgewotCQotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0JCi0JCi0JcHVibGljIEVMSmF2YVhtbERpc2NyaW1pbmF0b3JOb2RlKEVMSmF2YUNsYXNzTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJaW5pdFZhbHVlKCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBFTEphdmFDbGFzc01hcHBpbmcgZ2V0Q2xhc3NNYXBwaW5nKCkgewotCQlyZXR1cm4gKEVMSmF2YUNsYXNzTWFwcGluZykgZ2V0UGFyZW50KCk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXhiUGFja2FnZSBnZXRKYXhiUGFja2FnZSgpIHsKLQkJcmV0dXJuIGdldENsYXNzTWFwcGluZygpLmdldEpheGJUeXBlKCkuZ2V0SmF4YlBhY2thZ2UoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3luYy91cGRhdGUgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXN5bmNWYWx1ZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWx1ZSAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJZ2V0QW5ub3RhdGlvbigpLnNldFZhbHVlKHZhbHVlKTsKLQkJc2V0VmFsdWVfKHZhbHVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHRoaXMudmFsdWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0VmFsdWUoKSB7Ci0JCXRoaXMudmFsdWUgPSBnZXRBbm5vdGF0aW9uKCkuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1ZhbHVlKCkgewotCQlzZXRWYWx1ZV8oZ2V0QW5ub3RhdGlvbigpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCXJldHVybiBnZXRDbGFzc01hcHBpbmcoKS5nZXRYbWxEaXNjcmltaW5hdG9yTm9kZUFubm90YXRpb24oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogY29udGVudCBhc3Npc3QgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscygKLQkJCWludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCi0JCWlmIChnZXRBbm5vdGF0aW9uKCkudmFsdWVUb3VjaGVzKHBvcywgYXN0Um9vdCkgJiYgdGhpcy52YWx1ZSAhPSBudWxsKSB7Ci0JCQlYc2RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlID0gZ2V0Q2xhc3NNYXBwaW5nKCkuZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQkJCVhQYXRoIHhwYXRoID0gWFBhdGhGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0WHBhdGgodGhpcy52YWx1ZSk7Ci0JCQlyZXR1cm4geHBhdGguZ2V0Q29tcGxldGlvblByb3Bvc2FscyhuZXcgWFBhdGhDb250ZXh0KGFzdFJvb3QpLCB4c2RUeXBlLCBwb3MsIGZpbHRlcik7Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb24oKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLnZhbHVlKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXIuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0RJU0NSSU1JTkFUT1JfTk9ERV9fTk9UX1NQRUNJRklFRCwKLQkJCQkJCQkJRUxKYXZhWG1sRGlzY3JpbWluYXRvck5vZGUudGhpcywKLQkJCQkJCQkJZ2V0VmFsdWVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKHRoaXMudmFsdWUuc3RhcnRzV2l0aChYUGF0aC5ERUxJTSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VCdWlsZGVyLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhQQVRIX19ST09UX05PVF9TVVBQT1JURUQsCi0JCQkJCQkJCUVMSmF2YVhtbERpc2NyaW1pbmF0b3JOb2RlLnRoaXMsCi0JCQkJCQkJCWdldFZhbHVlVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUgPSBnZXRDbGFzc01hcHBpbmcoKS5nZXRYc2RUeXBlRGVmaW5pdGlvbigpOwotCQlYUGF0aCB4cGF0aCA9IFhQYXRoRmFjdG9yeS5pbnN0YW5jZSgpLmdldFhwYXRoKHRoaXMudmFsdWUpOwotCQl4cGF0aC52YWxpZGF0ZShuZXcgWFBhdGhDb250ZXh0KGFzdFJvb3QpLCB4c2RUeXBlLCBtZXNzYWdlcyk7Ci0JfQotCQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gc2hvdWxkIG5ldmVyIGJlIG51bGwKLQkJcmV0dXJuIGdldEFubm90YXRpb24oKS5nZXRWYWx1ZVRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFhQYXRoQ29udGV4dAotCQlpbXBsZW1lbnRzIFhQYXRoLkNvbnRleHQgewotCQkKLQkJcHJpdmF0ZSBDb21waWxhdGlvblVuaXQgYXN0Um9vdDsKLQkJCi0JCXByb3RlY3RlZCBYUGF0aENvbnRleHQoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCXRoaXMuYXN0Um9vdCA9IGFzdFJvb3Q7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgSmF4Yk5vZGUgZ2V0Q29udGV4dE9iamVjdCgpIHsKLQkJCXJldHVybiBFTEphdmFYbWxEaXNjcmltaW5hdG9yTm9kZS50aGlzOwotCQl9Ci0JCQotCQlwdWJsaWMgSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoKSB7Ci0JCQlyZXR1cm4gRUxKYXZhWG1sRGlzY3JpbWluYXRvck5vZGUudGhpcy5nZXRKYXhiUGFja2FnZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZSgpIHsKLQkJCXJldHVybiBFTEphdmFYbWxEaXNjcmltaW5hdG9yTm9kZS50aGlzLmdldFZhbHVlVGV4dFJhbmdlKHRoaXMuYXN0Um9vdCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRGlzY3JpbWluYXRvclZhbHVlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRGlzY3JpbWluYXRvclZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNTQ3OTAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbERpc2NyaW1pbmF0b3JWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxEaXNjcmltaW5hdG9yVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkVMSmF4YlZhbGlkYXRpb25NZXNzYWdlQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF2YVhtbERpc2NyaW1pbmF0b3JWYWx1ZQotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgRUxYbWxEaXNjcmltaW5hdG9yVmFsdWUgewotCQotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0JCi0JCi0JcHVibGljIEVMSmF2YVhtbERpc2NyaW1pbmF0b3JWYWx1ZShFTEphdmFDbGFzc01hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCWluaXRWYWx1ZSgpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgRUxKYXZhQ2xhc3NNYXBwaW5nIGdldENsYXNzTWFwcGluZygpIHsKLQkJcmV0dXJuIChFTEphdmFDbGFzc01hcHBpbmcpIGdldFBhcmVudCgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzeW5jL3VwZGF0ZSAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc3luY1ZhbHVlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbHVlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQlnZXRBbm5vdGF0aW9uKCkuc2V0VmFsdWUodmFsdWUpOwotCQlzZXRWYWx1ZV8odmFsdWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdGhpcy52YWx1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRWYWx1ZSgpIHsKLQkJdGhpcy52YWx1ZSA9IGdldEFubm90YXRpb24oKS5nZXRWYWx1ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jVmFsdWUoKSB7Ci0JCXNldFZhbHVlXyhnZXRBbm5vdGF0aW9uKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCXJldHVybiBnZXRDbGFzc01hcHBpbmcoKS5nZXRYbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb24oKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLnZhbHVlKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXIuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0RJU0NSSU1JTkFUT1JfVkFMVUVfX05PVF9TUEVDSUZJRUQsCi0JCQkJCQkJCUVMSmF2YVhtbERpc2NyaW1pbmF0b3JWYWx1ZS50aGlzLAotCQkJCQkJCQlnZXRWYWx1ZVRleHRSYW5nZShhc3RSb290KSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gc2hvdWxkIG5ldmVyIGJlIG51bGwKLQkJcmV0dXJuIGdldEFubm90YXRpb24oKS5nZXRWYWx1ZVRleHRSYW5nZShhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRWxlbWVudC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQxNDI5OS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxFbGVtZW50Ci0JCWV4dGVuZHMgR2VuZXJpY0phdmFYbWxFbGVtZW50IHsKLQkKLQlwdWJsaWMgRUxKYXZhWG1sRWxlbWVudChKYXZhQ29udGV4dE5vZGUgcGFyZW50LCBDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIocGFyZW50LCBjb250ZXh0KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIChDb250ZXh0KSBzdXBlci5nZXRDb250ZXh0KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUU5hbWUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKCEgZ2V0Q29udGV4dCgpLmhhc1htbFBhdGgoKSkgewotCQkJc3VwZXIudmFsaWRhdGVRTmFtZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCQotCXB1YmxpYyBpbnRlcmZhY2UgQ29udGV4dAotCQkJZXh0ZW5kcyBHZW5lcmljSmF2YVhtbEVsZW1lbnQuQ29udGV4dCB7Ci0JCQotCQlib29sZWFuIGhhc1htbFBhdGgoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRWxlbWVudE1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxFbGVtZW50TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTY3NDcwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxFbGVtZW50TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxJRDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50V3JhcHBlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbElEQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FTFhtbENEQVRBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVMWG1sRWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC54cGF0aC5qYXZhLlhQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbENEQVRBQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuWG1sS2V5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuWG1sUGF0aEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sRWxlbWVudE1hcHBpbmcKLQkJZXh0ZW5kcyBHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nCi0JCWltcGxlbWVudHMgRUxYbWxFbGVtZW50TWFwcGluZyB7Ci0JCi0JcHJvdGVjdGVkIEVMSmF2YVhtbFBhdGggeG1sUGF0aDsKLQkKLQlwcm90ZWN0ZWQgRUxKYXZhWG1sS2V5IHhtbEtleTsKLQkKLQlwcm90ZWN0ZWQgRUxKYXZhWG1sQ0RBVEEgeG1sQ0RBVEE7Ci0JCi0JCi0JcHVibGljIEVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQlpbml0WG1sUGF0aCgpOwotCQlpbml0WG1sS2V5KCk7Ci0JCWluaXRYbWxDREFUQSgpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sSUQgYnVpbGRYbWxJRChYbWxJREFubm90YXRpb24geG1sSURBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgRUxKYXZhWG1sSUQodGhpcywgeG1sSURBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3luYy91cGRhdGUgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXN5bmNYbWxQYXRoKCk7Ci0JCXN5bmNYbWxLZXkoKTsKLQkJc3luY1htbENEQVRBKCk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbFBhdGggKioqKioKLQkKLQlwdWJsaWMgRUxYbWxQYXRoIGdldFhtbFBhdGgoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFBhdGg7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFhtbFBhdGhfKEVMSmF2YVhtbFBhdGggeG1sUGF0aCkgewotCQlFTEphdmFYbWxQYXRoIG9sZCA9IHRoaXMueG1sUGF0aDsKLQkJdGhpcy54bWxQYXRoID0geG1sUGF0aDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChYTUxfUEFUSF9QUk9QRVJUWSwgb2xkLCB0aGlzLnhtbFBhdGgpOwotCX0KLQkKLQlwdWJsaWMgRUxYbWxQYXRoIGFkZFhtbFBhdGgoKSB7Ci0JCWlmICh0aGlzLnhtbFBhdGggIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oMCwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJRUxKYXZhWG1sUGF0aCB4bWxQYXRoID0gYnVpbGRYbWxQYXRoKCk7Ci0JCXNldFhtbFBhdGhfKHhtbFBhdGgpOwotCQlyZXR1cm4geG1sUGF0aDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sUGF0aCgpIHsKLQkJaWYgKHRoaXMueG1sUGF0aCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJd2hpbGUgKGdldFhtbFBhdGhBbm5vdGF0aW9uKCkgIT0gbnVsbCkgewotCQkJZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbigwLCBFTEpheGIuWE1MX1BBVEgpOwotCQl9Ci0JCXNldFhtbFBhdGhfKG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0WG1sUGF0aCgpIHsKLQkJWG1sUGF0aEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbFBhdGhBbm5vdGF0aW9uKCk7Ci0JCXRoaXMueG1sUGF0aCA9IChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGJ1aWxkWG1sUGF0aCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sUGF0aCgpIHsKLQkJWG1sUGF0aEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbFBhdGhBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnhtbFBhdGggPT0gbnVsbCkgewotCQkJCXNldFhtbFBhdGhfKGJ1aWxkWG1sUGF0aCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMueG1sUGF0aC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRYbWxQYXRoXyhudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgRUxKYXZhWG1sUGF0aCBidWlsZFhtbFBhdGgoKSB7Ci0JCXJldHVybiBuZXcgRUxKYXZhWG1sUGF0aCh0aGlzLCBuZXcgWG1sUGF0aENvbnRleHQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxQYXRoQW5ub3RhdGlvbiBnZXRYbWxQYXRoQW5ub3RhdGlvbigpIHsKLQkJaWYgKGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb25zU2l6ZShFTEpheGIuWE1MX1BBVEgpID4gMCkgewotCQkJcmV0dXJuIChYbWxQYXRoQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbigwLCBFTEpheGIuWE1MX1BBVEgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxLZXkgKioqKioKLQkKLQlwdWJsaWMgRUxYbWxLZXkgZ2V0WG1sS2V5KCkgewotCQlyZXR1cm4gdGhpcy54bWxLZXk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFhtbEtleV8oRUxKYXZhWG1sS2V5IHhtbEtleSkgewotCQlFTEphdmFYbWxLZXkgb2xkID0gdGhpcy54bWxLZXk7Ci0JCXRoaXMueG1sS2V5ID0geG1sS2V5OwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9LRVlfUFJPUEVSVFksIG9sZCwgdGhpcy54bWxLZXkpOwotCX0KLQkKLQlwdWJsaWMgRUxYbWxLZXkgYWRkWG1sS2V5KCkgewotCQlpZiAodGhpcy54bWxLZXkgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oRUxKYXhiLlhNTF9LRVkpOwotCQlFTEphdmFYbWxLZXkgeG1sS2V5ID0gYnVpbGRYbWxLZXkoKTsKLQkJc2V0WG1sS2V5Xyh4bWxLZXkpOwotCQlyZXR1cm4geG1sS2V5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxLZXkoKSB7Ci0JCWlmICh0aGlzLnhtbEtleSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihFTEpheGIuWE1MX0tFWSk7Ci0JCXNldFhtbEtleV8obnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRYbWxLZXkoKSB7Ci0JCVhtbEtleUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbEtleUFubm90YXRpb24oKTsKLQkJdGhpcy54bWxLZXkgPSAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBidWlsZFhtbEtleSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sS2V5KCkgewotCQlYbWxLZXlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxLZXlBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnhtbEtleSA9PSBudWxsKSB7Ci0JCQkJc2V0WG1sS2V5XyhidWlsZFhtbEtleSgpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXNldFhtbEtleV8obnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEVMSmF2YVhtbEtleSBidWlsZFhtbEtleSgpIHsKLQkJcmV0dXJuIG5ldyBFTEphdmFYbWxLZXkodGhpcywgbmV3IFhtbEtleUNvbnRleHQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxLZXlBbm5vdGF0aW9uIGdldFhtbEtleUFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sS2V5QW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihFTEpheGIuWE1MX0tFWSk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbENEQVRBICoqKioqCi0JCi0JcHVibGljIEVMWG1sQ0RBVEEgZ2V0WG1sQ0RBVEEoKSB7Ci0JCXJldHVybiB0aGlzLnhtbENEQVRBOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxDREFUQV8oRUxKYXZhWG1sQ0RBVEEgeG1sQ0RBVEEpIHsKLQkJRUxKYXZhWG1sQ0RBVEEgb2xkID0gdGhpcy54bWxDREFUQTsKLQkJdGhpcy54bWxDREFUQSA9IHhtbENEQVRBOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9DREFUQV9QUk9QRVJUWSwgb2xkLCB0aGlzLnhtbENEQVRBKTsKLQl9Ci0JCi0JcHVibGljIEVMWG1sQ0RBVEEgYWRkWG1sQ0RBVEEoKSB7Ci0JCWlmICh0aGlzLnhtbENEQVRBICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfQ0RBVEEpOwotCQlFTEphdmFYbWxDREFUQSB4bWxDREFUQSA9IGJ1aWxkWG1sQ0RBVEEoKTsKLQkJc2V0WG1sQ0RBVEFfKHhtbENEQVRBKTsKLQkJcmV0dXJuIHhtbENEQVRBOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxDREFUQSgpIHsKLQkJaWYgKHRoaXMueG1sQ0RBVEEgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oRUxKYXhiLlhNTF9DREFUQSk7Ci0JCXNldFhtbENEQVRBXyhudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFhtbENEQVRBKCkgewotCQlYbWxDREFUQUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbENEQVRBQW5ub3RhdGlvbigpOwotCQl0aGlzLnhtbENEQVRBID0gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogYnVpbGRYbWxDREFUQSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sQ0RBVEEoKSB7Ci0JCVhtbENEQVRBQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sQ0RBVEFBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnhtbENEQVRBID09IG51bGwpIHsKLQkJCQlzZXRYbWxDREFUQV8oYnVpbGRYbWxDREFUQSgpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXNldFhtbENEQVRBXyhudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgRUxKYXZhWG1sQ0RBVEEgYnVpbGRYbWxDREFUQSgpIHsKLQkJcmV0dXJuIG5ldyBFTEphdmFYbWxDREFUQSh0aGlzLCBuZXcgWG1sQ0RBVEFDb250ZXh0KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sQ0RBVEFBbm5vdGF0aW9uIGdldFhtbENEQVRBQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxDREFUQUFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oRUxKYXhiLlhNTF9DREFUQSk7Ci0JfQotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudCBidWlsZFhtbEVsZW1lbnQoKSB7Ci0JCXJldHVybiBuZXcgRUxKYXZhWG1sRWxlbWVudCh0aGlzLCBuZXcgWG1sRWxlbWVudENvbnRleHQoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxFbGVtZW50V3JhcHBlciBidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlyZXR1cm4gbmV3IEVMSmF2YVhtbEVsZW1lbnRXcmFwcGVyKHRoaXMsIG5ldyBYbWxFbGVtZW50V3JhcHBlckNvbnRleHQoKSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0WFBhdGgoKSB7Ci0JCWlmICh0aGlzLnhtbFBhdGggIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMueG1sUGF0aC5nZXRWYWx1ZSgpOwotCQl9Ci0JCQotCQlTdHJpbmcgbmFtZSA9IHRoaXMueG1sRWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWUoKTsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkobmFtZSkpIHsKLQkJCS8vIG5vIG5hbWUgaXMgaW52YWxpZAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZyBuYW1lc3BhY2UgPSB0aGlzLnhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKTsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkobmFtZXNwYWNlKSkgewotCQkJLy8gZW1wdHkgbmFtZXNwYWNlIG1lYW5zICJubyIgbmFtZXNwYWNlCi0JCQlyZXR1cm4gWFBhdGguZWxlbWVudFhQYXRoKG51bGwsIG5hbWUpOwotCQl9Ci0JCQotCQlTdHJpbmcgcHJlZml4ID0gZ2V0SmF4YlBhY2thZ2UoKS5nZXRQYWNrYWdlSW5mbygpLmdldFByZWZpeEZvck5hbWVzcGFjZShuYW1lc3BhY2UpOwotCQlpZiAocHJlZml4ID09IG51bGwpIHsKLQkJCS8vIG5vIHByZWZpeCBmb3Igbm9uLW51bGwgbmFtZXNwYWNlIGlzIGludmFsaWQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gWFBhdGguZWxlbWVudFhQYXRoKHByZWZpeCwgbmFtZSk7Ci0JfQotCQotCQotCS8vICoqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJaWYgKHRoaXMueG1sUGF0aCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSB0aGlzLnhtbFBhdGguZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJaWYgKHRoaXMueG1sUGF0aCAhPSBudWxsKSB7Ci0JCQl2YWxpZGF0ZVhtbFBhdGgobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVhtbFBhdGgoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy54bWxQYXRoLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxQYXRoQ29udGV4dAotCQkJaW1wbGVtZW50cyBFTEphdmFYbWxQYXRoLkNvbnRleHQgewotCQkKLQkJcHVibGljIFhtbFBhdGhBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCQlyZXR1cm4gRUxKYXZhWG1sRWxlbWVudE1hcHBpbmcudGhpcy5nZXRYbWxQYXRoQW5ub3RhdGlvbigpOwotCQl9Ci0JCQotCQlwdWJsaWMgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgZ2V0QXR0cmlidXRlTWFwcGluZygpIHsKLQkJCXJldHVybiBFTEphdmFYbWxFbGVtZW50TWFwcGluZy50aGlzOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxLZXlDb250ZXh0Ci0JCQlpbXBsZW1lbnRzIEVMSmF2YVhtbEtleS5Db250ZXh0IHsKLQkJCi0JCXB1YmxpYyBYbWxLZXlBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCQlyZXR1cm4gRUxKYXZhWG1sRWxlbWVudE1hcHBpbmcudGhpcy5nZXRYbWxLZXlBbm5vdGF0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFhtbENEQVRBQ29udGV4dAotCQkJaW1wbGVtZW50cyBFTEphdmFYbWxDREFUQS5Db250ZXh0IHsKLQkJCi0JCXB1YmxpYyBYbWxDREFUQUFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLQkJCXJldHVybiBFTEphdmFYbWxFbGVtZW50TWFwcGluZy50aGlzLmdldFhtbENEQVRBQW5ub3RhdGlvbigpOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxFbGVtZW50Q29udGV4dAotCQkJZXh0ZW5kcyBHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nLlhtbEVsZW1lbnRDb250ZXh0Ci0JCQlpbXBsZW1lbnRzIEVMSmF2YVhtbEVsZW1lbnQuQ29udGV4dCB7Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBoYXNYbWxQYXRoKCkgewotCQkJcmV0dXJuIEVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nLnRoaXMueG1sUGF0aCAhPSBudWxsOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxFbGVtZW50V3JhcHBlckNvbnRleHQKLQkJCWltcGxlbWVudHMgRUxKYXZhWG1sRWxlbWVudFdyYXBwZXIuQ29udGV4dCB7Ci0JCQotCQlwdWJsaWMgWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCQlyZXR1cm4gRUxKYXZhWG1sRWxlbWVudE1hcHBpbmcudGhpcy5nZXRYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24oKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaGFzWG1sUGF0aCgpIHsKLQkJCXJldHVybiBFTEphdmFYbWxFbGVtZW50TWFwcGluZy50aGlzLnhtbFBhdGggIT0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxFbGVtZW50TWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxFbGVtZW50TWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQzZWQ0OS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRWxlbWVudE1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhWG1sRWxlbWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbgotCQlleHRlbmRzIEphdmFYbWxFbGVtZW50TWFwcGluZ0RlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IAotCQkJewotCQkJCUVMSmF4Yi5YTUxfQ0RBVEEsCi0JCQkJRUxKYXhiLlhNTF9LRVksCi0JCQkJRUxKYXhiLlhNTF9QQVRIIH07Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJvdGVjdGVkIEVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQkJCXN1cGVyLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJCQluZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUykpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxFbGVtZW50UmVmLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRWxlbWVudFJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODlmNjMxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxFbGVtZW50UmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sRWxlbWVudFJlZgotCQlleHRlbmRzIEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZiB7Ci0JCi0JcHVibGljIEVMSmF2YVhtbEVsZW1lbnRSZWYoSmF2YUNvbnRleHROb2RlIHBhcmVudCwgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmLkNvbnRleHQgY29udGV4dCkgewotCQlzdXBlcihwYXJlbnQsIGNvbnRleHQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1R5cGVKQVhCRWxlbWVudCgpIHsKLQkJU3RyaW5nIGZxVHlwZSA9IGdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpOwotCQlyZXR1cm4gZnFUeXBlICE9IG51bGwgJiYgSkRUVG9vbHMudHlwZUlzU3ViVHlwZShnZXRKYXhiUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCksIGdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpLCBKQVhCLkpBWEJfRUxFTUVOVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmY2ExNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZzsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmcKLQkJZXh0ZW5kcyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nIHsKLQkKLQlwdWJsaWMgRUxKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxFbGVtZW50UmVmIGJ1aWxkWG1sRWxlbWVudFJlZigpIHsKLQkJcmV0dXJuIG5ldyBFTEphdmFYbWxFbGVtZW50UmVmKHRoaXMsIG5ldyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nLlhtbEVsZW1lbnRSZWZDb250ZXh0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxFbGVtZW50UmVmc01hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxFbGVtZW50UmVmc01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU2Njk2YS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50UmVmczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFJlZkFubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIEVMSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZwotCQlleHRlbmRzIEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nIHsKLQkKLQlwdWJsaWMgRUxKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudFJlZnMgYnVpbGRYbWxFbGVtZW50UmVmcygpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzKHRoaXMsIG5ldyBYbWxFbGVtZW50UmVmc0NvbnRleHQoKSk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxFbGVtZW50UmVmc0NvbnRleHQKLQkJCWV4dGVuZHMgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmcuWG1sRWxlbWVudFJlZnNDb250ZXh0IHsKLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgWG1sRWxlbWVudFJlZiBidWlsZFhtbEVsZW1lbnRSZWYoSmF2YUNvbnRleHROb2RlIHBhcmVudCwgWG1sRWxlbWVudFJlZkFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQkJcmV0dXJuIG5ldyBFTEphdmFYbWxFbGVtZW50UmVmKHBhcmVudCwgbmV3IEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nLlhtbEVsZW1lbnRSZWZDb250ZXh0KGFubm90YXRpb24pKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxFbGVtZW50V3JhcHBlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEVsZW1lbnRXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MjkyOGEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEVsZW1lbnRXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFYbWxFbGVtZW50V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxFbGVtZW50V3JhcHBlcgotCQlleHRlbmRzIEdlbmVyaWNKYXZhWG1sRWxlbWVudFdyYXBwZXIgewotCQotCXB1YmxpYyBFTEphdmFYbWxFbGVtZW50V3JhcHBlcihKYXhiQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIENvbnRleHQgY29udGV4dCkgewotCQlzdXBlcihwYXJlbnQsIGNvbnRleHQpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgQ29udGV4dCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gKENvbnRleHQpIHRoaXMuY29udGV4dDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVRTmFtZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAoISBnZXRDb250ZXh0KCkuaGFzWG1sUGF0aCgpKSB7Ci0JCQlzdXBlci52YWxpZGF0ZVFOYW1lKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGludGVyZmFjZSBDb250ZXh0Ci0JCQlleHRlbmRzIEdlbmVyaWNKYXZhWG1sRWxlbWVudFdyYXBwZXIuQ29udGV4dCB7Ci0JCQotCQlib29sZWFuIGhhc1htbFBhdGgoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmODA4OTIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEVsZW1lbnRzTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdWJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVMWG1sRWxlbWVudHNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVMWG1sUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5FTEpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuWG1sUGF0aEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nCi0JCWV4dGVuZHMgR2VuZXJpY0phdmFYbWxFbGVtZW50c01hcHBpbmcKLQkJaW1wbGVtZW50cyBFTFhtbEVsZW1lbnRzTWFwcGluZyB7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPEVMSmF2YVhtbFBhdGgsIFhtbFBhdGhBbm5vdGF0aW9uPiB4bWxQYXRoQ29udGFpbmVyOwotCQotCQotCXB1YmxpYyBFTEphdmFYbWxFbGVtZW50c01hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMueG1sUGF0aENvbnRhaW5lciA9IGJ1aWxkWG1sUGF0aENvbnRhaW5lcigpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzeW5jL3VwZGF0ZSAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy54bWxQYXRoQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy54bWxQYXRoQ29udGFpbmVyLnVwZGF0ZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB4bWxQYXRocyAqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmFibGU8RUxYbWxQYXRoPiBnZXRYbWxQYXRocygpIHsKLQkJcmV0dXJuIG5ldyBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI8RUxYbWxQYXRoPih0aGlzLnhtbFBhdGhDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCkpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFhtbFBhdGhzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMueG1sUGF0aENvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHNTaXplKCk7Ci0JfQotCQotCXB1YmxpYyBFTFhtbFBhdGggYWRkWG1sUGF0aChpbnQgaW5kZXgpIHsKLQkJWG1sUGF0aEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChYbWxQYXRoQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihpbmRleCwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJcmV0dXJuIHRoaXMueG1sUGF0aENvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgYW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbFBhdGgoaW50IGluZGV4KSB7Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oaW5kZXgsIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCXRoaXMueG1sUGF0aENvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVYbWxQYXRoKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLm1vdmVBbm5vdGF0aW9uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJdGhpcy54bWxQYXRoQ29udGFpbmVyLm1vdmVDb250ZXh0RWxlbWVudCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRUxKYXZhWG1sUGF0aCBidWlsZFhtbFBhdGgoWG1sUGF0aEFubm90YXRpb24geG1sUGF0aEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBFTEphdmFYbWxQYXRoKHRoaXMsIG5ldyBYbWxQYXRoQ29udGV4dCh4bWxQYXRoQW5ub3RhdGlvbikpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8RUxKYXZhWG1sUGF0aCwgWG1sUGF0aEFubm90YXRpb24+IGJ1aWxkWG1sUGF0aENvbnRhaW5lcigpIHsKLQkJWG1sUGF0aENvbnRhaW5lciBjb250YWluZXIgPSBuZXcgWG1sUGF0aENvbnRhaW5lcigpOwotCQljb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFhtbFBhdGhBbm5vdGF0aW9uPiBnZXRYbWxQYXRoQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgU3ViTGlzdEl0ZXJhYmxlV3JhcHBlcjxOZXN0YWJsZUFubm90YXRpb24sIFhtbFBhdGhBbm5vdGF0aW9uPigKLQkJCQlnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9ucyhFTEpheGIuWE1MX1BBVEgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxFbGVtZW50IGJ1aWxkWG1sRWxlbWVudChYbWxFbGVtZW50QW5ub3RhdGlvbiB4bWxFbGVtZW50QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEVMSmF2YVhtbEVsZW1lbnQodGhpcywgbmV3IFhtbEVsZW1lbnRDb250ZXh0KHhtbEVsZW1lbnRBbm5vdGF0aW9uKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxFbGVtZW50V3JhcHBlciBidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlyZXR1cm4gbmV3IEVMSmF2YVhtbEVsZW1lbnRXcmFwcGVyKHRoaXMsIG5ldyBYbWxFbGVtZW50V3JhcHBlckNvbnRleHQoKSk7Ci0JfQotCQotCQotCS8vICoqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJZm9yIChFTEphdmFYbWxQYXRoIHhtbFBhdGggOiB0aGlzLnhtbFBhdGhDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCkpIHsKLQkJCXJlc3VsdCA9IHhtbFBhdGguZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJaWYgKGdldFhtbFBhdGhzU2l6ZSgpID4gMCApIHsKLQkJCXZhbGlkYXRlWG1sUGF0aHMobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVhtbFBhdGhzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhdG9yPFhtbEVsZW1lbnQ+IHhtbEVsZW1lbnRzID0gZ2V0WG1sRWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQlJdGVyYXRvcjxFTEphdmFYbWxQYXRoPiB4bWxQYXRocyA9IHRoaXMueG1sUGF0aENvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQkKLQkJd2hpbGUgKHhtbEVsZW1lbnRzLmhhc05leHQoKSAmJiB4bWxQYXRocy5oYXNOZXh0KCkpIHsKLQkJCXhtbEVsZW1lbnRzLm5leHQoKTsKLQkJCXhtbFBhdGhzLm5leHQoKTsKLQkJfQotCQkKLQkJaWYgKHhtbEVsZW1lbnRzLmhhc05leHQoKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXIuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9QQVRIX19JTlNVRkZJQ0lFTlRfWE1MX1BBVEhTX0ZPUl9YTUxfRUxFTUVOVFMsCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlnZXRYbWxQYXRoc1RleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JCQotCQl3aGlsZSAoeG1sUGF0aHMuaGFzTmV4dCgpKSB7Ci0JCQlFTEphdmFYbWxQYXRoIHhtbFBhdGggPSB4bWxQYXRocy5uZXh0KCk7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCUVMSmF4YlZhbGlkYXRpb25NZXNzYWdlQnVpbGRlci5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1BBVEhfX0lOU1VGRklDSUVOVF9YTUxfRUxFTUVOVFNfRk9SX1hNTF9QQVRIUywKLQkJCQkJCQl0aGlzLAotCQkJCQkJCXhtbFBhdGguZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JCQotCQlmb3IgKEVMSmF2YVhtbFBhdGggeG1sUGF0aCA6IHRoaXMueG1sUGF0aENvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKSkgewotCQkJeG1sUGF0aC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRHVwbGljYXRlUU5hbWUoWG1sRWxlbWVudCB4bWxFbGVtZW50LCBCYWc8UU5hbWU+IHhtbEVsZW1lbnRRTmFtZXMsIAotCQkJCUxpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkKLQkJaWYgKGdldFhtbFBhdGhzU2l6ZSgpID09IDApIHsgCi0JCQlzdXBlci52YWxpZGF0ZUR1cGxpY2F0ZVFOYW1lKHhtbEVsZW1lbnQsIHhtbEVsZW1lbnRRTmFtZXMsIG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFhtbFBhdGhzVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oRUxKYXhiLlhNTF9QQVRIUyk7Ci0JCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCWFubm90YXRpb24gPSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKDAsIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCX0KLQkJcmV0dXJuIGFubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sUGF0aENvbnRhaW5lcgotCQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxFTEphdmFYbWxQYXRoLCBYbWxQYXRoQW5ub3RhdGlvbj4gewotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIEVMWG1sRWxlbWVudHNNYXBwaW5nLlhNTF9QQVRIU19MSVNUOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEVMSmF2YVhtbFBhdGggYnVpbGRDb250ZXh0RWxlbWVudChYbWxQYXRoQW5ub3RhdGlvbiByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBFTEphdmFYbWxFbGVtZW50c01hcHBpbmcudGhpcy5idWlsZFhtbFBhdGgocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sUGF0aEFubm90YXRpb24+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nLnRoaXMuZ2V0WG1sUGF0aEFubm90YXRpb25zKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sUGF0aEFubm90YXRpb24gZ2V0UmVzb3VyY2VFbGVtZW50KEVMSmF2YVhtbFBhdGggY29udGV4dEVsZW1lbnQpIHsKLQkJCS8vIGluIHRoZSBjb250ZXh0IG9mIHRoaXMgbWFwcGluZywgdGhlcmUgd2lsbCBuZXZlciBiZSBhbiBFTFhtbFBhdGggd2l0aG91dCBhbiBhbm5vdGF0aW9uCi0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0QW5ub3RhdGlvbigpOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxQYXRoQ29udGV4dAotCQkJaW1wbGVtZW50cyBFTEphdmFYbWxQYXRoLkNvbnRleHQgewotCQkKLQkJcHJvdGVjdGVkIFhtbFBhdGhBbm5vdGF0aW9uIGFubm90YXRpb247Ci0JCQotCQkKLQkJcHJvdGVjdGVkIFhtbFBhdGhDb250ZXh0KFhtbFBhdGhBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJCXRoaXMuYW5ub3RhdGlvbiA9IGFubm90YXRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBYbWxQYXRoQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbjsKLQkJfQotCQkKLQkJcHVibGljIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGdldEF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nLnRoaXM7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFhtbEVsZW1lbnRDb250ZXh0Ci0JCQlleHRlbmRzIEdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nLlhtbEVsZW1lbnRDb250ZXh0Ci0JCQlpbXBsZW1lbnRzIEVMSmF2YVhtbEVsZW1lbnQuQ29udGV4dCB7Ci0JCQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudENvbnRleHQoWG1sRWxlbWVudEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQkJc3VwZXIoYW5ub3RhdGlvbik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGhhc1htbFBhdGgoKSB7Ci0JCQlyZXR1cm4gRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nLnRoaXMuZ2V0WG1sUGF0aHNTaXplKCkgPiAwOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxFbGVtZW50V3JhcHBlckNvbnRleHQKLQkJCWltcGxlbWVudHMgRUxKYXZhWG1sRWxlbWVudFdyYXBwZXIuQ29udGV4dCB7Ci0JCQotCQlwdWJsaWMgWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCQlyZXR1cm4gRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nLnRoaXMuZ2V0WG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGhhc1htbFBhdGgoKSB7Ci0JCQlyZXR1cm4gRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nLnRoaXMuZ2V0WG1sUGF0aHNTaXplKCkgPiAwOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEVsZW1lbnRzTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxFbGVtZW50c01hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMmNjYjEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEVsZW1lbnRzTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhWG1sRWxlbWVudHNNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxFbGVtZW50c01hcHBpbmdEZWZpbml0aW9uCi0JCWV4dGVuZHMgSmF2YVhtbEVsZW1lbnRzTWFwcGluZ0RlZmluaXRpb24gewotCQotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVMSmF2YVhtbEVsZW1lbnRzTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBFTEphdmFYbWxFbGVtZW50c01hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gCi0JCQl7Ci0JCQkJRUxKYXhiLlhNTF9QQVRILAotCQkJCUVMSmF4Yi5YTUxfUEFUSFMgfTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVMSmF2YVhtbEVsZW1lbnRzTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQkJCXN1cGVyLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJCQluZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUykpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxJRC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMTU4OTEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbElELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sTmFtZWROb2RlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVhtbElEOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxJREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sSUQKLQkJZXh0ZW5kcyBHZW5lcmljSmF2YVhtbElEIHsKLQkKLQlwdWJsaWMgRUxKYXZhWG1sSUQoWG1sTmFtZWROb2RlTWFwcGluZyBwYXJlbnQsIFhtbElEQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGlvbik7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXR0cmlidXRlVHlwZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gbm8gb3AgLSBNT1h5IGRvZXMgbm90IHJlcXVpcmUgU3RyaW5nIGF0dHJpYnV0ZSB0eXBlcwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxJbnZlcnNlUmVmZXJlbmNlTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YmY2M2QuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuRUxKYXhiTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxJbnZlcnNlUmVmZXJlbmNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5FTEpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmcKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPFhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uPgotCQlpbXBsZW1lbnRzIEVMWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmcgewotCQotCXByb3RlY3RlZCBTdHJpbmcgbWFwcGVkQnk7Ci0JCi0JCi0JcHVibGljIEVMSmF2YVhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm1hcHBlZEJ5ID0gZ2V0UmVzb3VyY2VNYXBwZWRCeSgpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVMSmF4Yk1hcHBpbmdLZXlzLlhNTF9JTlZFUlNFX1JFRkVSRU5DRV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFTEpheGIuWE1MX0lOVkVSU0VfUkVGRVJFTkNFOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzeW5jL3VwZGF0ZSAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCi0JCXNldE1hcHBlZEJ5XyhnZXRSZXNvdXJjZU1hcHBlZEJ5KCkpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBtYXBwZWRCeSAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7Ci0JCXJldHVybiBtYXBwZWRCeTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG1hcHBlZEJ5KSB7Ci0JCWdldFhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uKCkuc2V0TWFwcGVkQnkobWFwcGVkQnkpOwotCQlzZXRNYXBwZWRCeV8obWFwcGVkQnkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBwZWRCeV8oU3RyaW5nIG1hcHBlZEJ5KSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm1hcHBlZEJ5OwotCQl0aGlzLm1hcHBlZEJ5ID0gbWFwcGVkQnk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUEVEX0JZX1BST1BFUlRZLCBvbGQsIG1hcHBlZEJ5KTsKLQl9Ci0JCi0JcHVibGljIFhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uIGdldFhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfSU5WRVJTRV9SRUZFUkVOQ0UpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlTWFwcGVkQnkoKSB7Ci0JCXJldHVybiBnZXRYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbigpLmdldE1hcHBlZEJ5KCk7Ci0JfQotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQlwcm90ZWN0ZWQgSmF4YkNsYXNzTWFwcGluZyBnZXRSZWZlcmVuY2VkQ2xhc3NNYXBwaW5nKCkgewotCQlTdHJpbmcgcmVmZXJlbmNlZENsYXNzTmFtZSA9IGdldFZhbHVlVHlwZU5hbWUoKTsKLQkJcmV0dXJuIChyZWZlcmVuY2VkQ2xhc3NOYW1lID09IG51bGwpID8gbnVsbCA6IGdldENvbnRleHRSb290KCkuZ2V0Q2xhc3NNYXBwaW5nKHJlZmVyZW5jZWRDbGFzc05hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UmVmZXJlbmNlZEF0dHJpYnV0ZSgpIHsKLQkJU3RyaW5nIG1hcHBlZEJ5ID0gZ2V0TWFwcGVkQnkoKTsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkobWFwcGVkQnkpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlKYXhiQ2xhc3NNYXBwaW5nIHJlZmVyZW5jZWRDbGFzc01hcHBpbmcgPSBnZXRSZWZlcmVuY2VkQ2xhc3NNYXBwaW5nKCk7Ci0JCWlmIChyZWZlcmVuY2VkQ2xhc3NNYXBwaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHRlbXBSZXN1bHQgPSBudWxsOwotCQlmb3IgKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA6IHJlZmVyZW5jZWRDbGFzc01hcHBpbmcuZ2V0QWxsTG9jYWxseURlZmluZWRBdHRyaWJ1dGVzKCkpIHsKLQkJCWlmIChhdHRyaWJ1dGUuZ2V0TmFtZSgpLmVxdWFscyhtYXBwZWRCeSkpIHsKLQkJCQlpZiAoYXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5YTUxfVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJCQl0ZW1wUmVzdWx0ID0gYXR0cmlidXRlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIGF0dHJpYnV0ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRlbXBSZXN1bHQ7Ci0JfQotCQotCQotCS8vICoqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJaWYgKGdldFhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uKCkubWFwcGVkQnlUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJlc3VsdCA9IGdldE1hcHBlZEJ5UHJvcG9zYWxzKGZpbHRlciwgYXN0Um9vdCk7Ci0JCX0KLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0TWFwcGVkQnlQcm9wb3NhbHMoRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlKYXhiQ2xhc3NNYXBwaW5nIHJlZmVyZW5jZWRDbGFzc01hcHBpbmcgPSBnZXRSZWZlcmVuY2VkQ2xhc3NNYXBwaW5nKCk7Ci0JCQotCQlpZiAocmVmZXJlbmNlZENsYXNzTWFwcGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxzKAotCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlLCBTdHJpbmc+KHJlZmVyZW5jZWRDbGFzc01hcHBpbmcuZ2V0QWxsTG9jYWxseURlZmluZWRBdHRyaWJ1dGVzKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIG8pIHsKLQkJCQkJCXJldHVybiBvLmdldE5hbWUoKTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCXZhbGlkYXRlTWFwcGVkQnkobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVNYXBwZWRCeShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShtYXBwZWRCeSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VCdWlsZGVyLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUVMSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfSU5WRVJTRV9SRUZFUkVOQ0VfX01BUFBFRF9CWV9OT1RfU1BFQ0lGSUVELAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSmF4YkNsYXNzTWFwcGluZyByZWZlcmVuY2VkQ2xhc3NNYXBwaW5nID0gZ2V0UmVmZXJlbmNlZENsYXNzTWFwcGluZygpOwotCQlpZiAocmVmZXJlbmNlZENsYXNzTWFwcGluZyA9PSBudWxsKSB7Ci0JCQkvLyBUT0RPIHZhbGlkYXRlPwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSByZWZlcmVuY2VkQXR0cmlidXRlID0gZ2V0UmVmZXJlbmNlZEF0dHJpYnV0ZSgpOwotCQlpZiAocmVmZXJlbmNlZEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCUVMSmF4YlZhbGlkYXRpb25NZXNzYWdlQnVpbGRlci5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0lOVkVSU0VfUkVGRVJFTkNFX19NQVBQRURfQllfTk9UX1JFU09MVkVELAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IG1hcHBlZEJ5LCByZWZlcmVuY2VkQ2xhc3NNYXBwaW5nLmdldEpheGJUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCWdldE1hcHBlZEJ5VGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCX0KLQkJZWxzZSBpZiAoCi0JCQkJISBBcnJheVRvb2xzLmNvbnRhaW5zKAotCQkJCQkJZ2V0VmFsaWRSZWZlcmVuY2VkQXR0cmlidXRlTWFwcGluZ0tleXMoKSwKLQkJCQkJCXJlZmVyZW5jZWRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXIuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9JTlZFUlNFX1JFRkVSRU5DRV9fTUFQUEVEX0JZX0lMTEVHQUxfTUFQUElOR19UWVBFLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IG1hcHBlZEJ5LCByZWZlcmVuY2VkQ2xhc3NNYXBwaW5nLmdldEpheGJUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCWdldE1hcHBlZEJ5VGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRSZWZlcmVuY2VkQXR0cmlidXRlTWFwcGluZ0tleXMoKSB7Ci0JCXJldHVybiBWQUxJRF9SRUZFUkVOQ0VEX0FUVFJJQlVURV9NQVBQSU5HX0tFWVM7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWQUxJRF9SRUZFUkVOQ0VEX0FUVFJJQlVURV9NQVBQSU5HX0tFWVMgPSBuZXcgU3RyaW5nW10gewotCQlNYXBwaW5nS2V5cy5YTUxfRUxFTUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksCi0JCU1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UU19BVFRSSUJVVEVfTUFQUElOR19LRVksCi0JCU1hcHBpbmdLZXlzLlhNTF9BVFRSSUJVVEVfQVRUUklCVVRFX01BUFBJTkdfS0VZLAotCQlNYXBwaW5nS2V5cy5YTUxfVkFMVUVfQVRUUklCVVRFX01BUFBJTkdfS0VZCi0JfTsKLQkKLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBnZXRYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbigpLmdldE1hcHBlZEJ5VGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2IxY2YyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxJbnZlcnNlUmVmZXJlbmNlTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLkVMSmF4Yk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF2YVhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nRGVmaW5pdGlvbgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVMSmF4Yk1hcHBpbmdLZXlzLlhNTF9JTlZFUlNFX1JFRkVSRU5DRV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFTEpheGIuWE1MX0lOVkVSU0VfUkVGRVJFTkNFOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQlwdWJsaWMgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSmF4YkZhY3RvcnkgZmFjdG9yeSkgewotCQkvLyBUT0RPOiBtb3ZlIHRvIGZhY3Rvcnkgb25jZSBBUEkgb3BlbnMgdXAgYWdhaW4KLQkJcmV0dXJuIG5ldyBFTEphdmFYbWxJbnZlcnNlUmVmZXJlbmNlTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxKb2luTm9kZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEpvaW5Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjN2E5ODkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEpvaW5Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVMQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVMWG1sSm9pbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxKb2luTm9kZXNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC54cGF0aC5qYXZhLlhQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC54cGF0aC5qYXZhLlhQYXRoRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5FTEpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEpvaW5Ob2RlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxKb2luTm9kZSAKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZQotCQlpbXBsZW1lbnRzIEVMWG1sSm9pbk5vZGUgewotCQotCXByb3RlY3RlZCBTdHJpbmcgeG1sUGF0aDsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlZmVyZW5jZWRYbWxQYXRoOwotCQotCXByb3RlY3RlZCBDb250ZXh0IGNvbnRleHQ7Ci0JCi0JCi0JcHVibGljIEVMSmF2YVhtbEpvaW5Ob2RlKEphdmFDb250ZXh0Tm9kZSBwYXJlbnQsIENvbnRleHQgY29udGV4dCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCQlpbml0WG1sUGF0aCgpOwotCQlpbml0UmVmZXJlbmNlZFhtbFBhdGgoKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIEpheGJQYWNrYWdlIGdldEpheGJQYWNrYWdlKCkgewotCQlyZXR1cm4gZ2V0Q2xhc3NNYXBwaW5nKCkuZ2V0SmF4YlR5cGUoKS5nZXRKYXhiUGFja2FnZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzeW5jL3VwZGF0ZSAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc3luY1htbFBhdGgoKTsKLQkJc3luY1JlZmVyZW5jZWRYbWxQYXRoKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHhtbFBhdGggKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFhtbFBhdGgoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFBhdGg7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFhtbFBhdGgoU3RyaW5nIHhtbFBhdGgpIHsKLQkJZ2V0QW5ub3RhdGlvbigpLnNldFhtbFBhdGgoeG1sUGF0aCk7Ci0JCXNldFhtbFBhdGhfKHhtbFBhdGgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxQYXRoXyhTdHJpbmcgeG1sUGF0aCkgewotCQlTdHJpbmcgb2xkID0gdGhpcy54bWxQYXRoOwotCQl0aGlzLnhtbFBhdGggPSB4bWxQYXRoOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9QQVRIX1BST1BFUlRZLCBvbGQsIHRoaXMueG1sUGF0aCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRYbWxQYXRoKCkgewotCQl0aGlzLnhtbFBhdGggPSBnZXRBbm5vdGF0aW9uKCkuZ2V0WG1sUGF0aCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sUGF0aCgpIHsKLQkJc2V0WG1sUGF0aF8oZ2V0QW5ub3RhdGlvbigpLmdldFhtbFBhdGgoKSk7Ci0JfQotCQotCQotCS8vICoqKioqIHJlZmVyZW5jZWRYbWxQYXRoICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkWG1sUGF0aCgpIHsKLQkJcmV0dXJuIHRoaXMucmVmZXJlbmNlZFhtbFBhdGg7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRYbWxQYXRoKFN0cmluZyByZWZlcmVuY2VkWG1sUGF0aCkgewotCQlnZXRBbm5vdGF0aW9uKCkuc2V0UmVmZXJlbmNlZFhtbFBhdGgocmVmZXJlbmNlZFhtbFBhdGgpOwotCQlzZXRSZWZlcmVuY2VkWG1sUGF0aF8ocmVmZXJlbmNlZFhtbFBhdGgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZWZlcmVuY2VkWG1sUGF0aF8oU3RyaW5nIHJlZmVyZW5jZWRYbWxQYXRoKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnJlZmVyZW5jZWRYbWxQYXRoOwotCQl0aGlzLnJlZmVyZW5jZWRYbWxQYXRoID0gcmVmZXJlbmNlZFhtbFBhdGg7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVGRVJFTkNFRF9YTUxfUEFUSF9QUk9QRVJUWSwgb2xkLCB0aGlzLnJlZmVyZW5jZWRYbWxQYXRoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFJlZmVyZW5jZWRYbWxQYXRoKCkgewotCQl0aGlzLnJlZmVyZW5jZWRYbWxQYXRoID0gZ2V0QW5ub3RhdGlvbigpLmdldFJlZmVyZW5jZWRYbWxQYXRoKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNSZWZlcmVuY2VkWG1sUGF0aCgpIHsKLQkJc2V0UmVmZXJlbmNlZFhtbFBhdGhfKGdldEFubm90YXRpb24oKS5nZXRSZWZlcmVuY2VkWG1sUGF0aCgpKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIFhtbEpvaW5Ob2RlQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5jb250ZXh0LmdldEFubm90YXRpb24oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVMWG1sSm9pbk5vZGVzTWFwcGluZyBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5jb250ZXh0LmdldEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJDbGFzc01hcHBpbmcgZ2V0Q2xhc3NNYXBwaW5nKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldENsYXNzTWFwcGluZygpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKAotCQkJaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkKLQkJaWYgKGdldEFubm90YXRpb24oKS54bWxQYXRoVG91Y2hlcyhwb3MsIGFzdFJvb3QpICYmIHRoaXMueG1sUGF0aCAhPSBudWxsKSB7Ci0JCQlYc2RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlID0gZ2V0Q2xhc3NNYXBwaW5nKCkuZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQkJCVhQYXRoIHhwYXRoID0gWFBhdGhGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0WHBhdGgodGhpcy54bWxQYXRoKTsKLQkJCXJldHVybiB4cGF0aC5nZXRDb21wbGV0aW9uUHJvcG9zYWxzKG5ldyBYbWxQYXRoQ29udGV4dChhc3RSb290KSwgeHNkVHlwZSwgcG9zLCBmaWx0ZXIpOwotCQl9Ci0JCQotCQlpZiAoZ2V0QW5ub3RhdGlvbigpLnJlZmVyZW5jZWRYbWxQYXRoVG91Y2hlcyhwb3MsIGFzdFJvb3QpICYmIHRoaXMucmVmZXJlbmNlZFhtbFBhdGggIT0gbnVsbCkgewotCQkJCi0JCQkKLQkJCVhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUgPSBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0UmVmZXJlbmNlZFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCQlYUGF0aCB4cGF0aCA9IFhQYXRoRmFjdG9yeS5pbnN0YW5jZSgpLmdldFhwYXRoKHRoaXMucmVmZXJlbmNlZFhtbFBhdGgpOwotCQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSB4cGF0aC5nZXRDb21wbGV0aW9uUHJvcG9zYWxzKG5ldyBSZWZlcmVuY2VkWG1sUGF0aENvbnRleHQoYXN0Um9vdCksIHhzZFR5cGUsIHBvcywgZmlsdGVyKTsKLQkJCQotCQkJRUxDbGFzc01hcHBpbmcgcmVmZXJlbmNlZENsYXNzTWFwcGluZyA9IHRoaXMuY29udGV4dC5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0UmVmZXJlbmNlZENsYXNzTWFwcGluZygpOwotCQkJaWYgKHJlZmVyZW5jZWRDbGFzc01hcHBpbmcgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQkJCQkJCQlyZXN1bHQsIAotCQkJCQkJCQlTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHMocmVmZXJlbmNlZENsYXNzTWFwcGluZy5nZXRLZXlYUGF0aHMoKSkpOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldChyZXN1bHQpOwotCQl9Ci0JCQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJdmFsaWRhdGVYbWxQYXRoKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJdmFsaWRhdGVSZWZlcmVuY2VkWG1sUGF0aChtZXNzYWdlcywgYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlWG1sUGF0aChMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy54bWxQYXRoKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXIuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0pPSU5fTk9ERV9fWE1MX1BBVEhfTk9UX1NQRUNJRklFRCwKLQkJCQkJCQkJRUxKYXZhWG1sSm9pbk5vZGUudGhpcywKLQkJCQkJCQkJZ2V0WG1sUGF0aFRleHRSYW5nZShhc3RSb290KSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAodGhpcy54bWxQYXRoLnN0YXJ0c1dpdGgoWFBhdGguREVMSU0pKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCUVMSmF4YlZhbGlkYXRpb25NZXNzYWdlQnVpbGRlci5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCUVMSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YUEFUSF9fUk9PVF9OT1RfU1VQUE9SVEVELAotCQkJCQkJCQlFTEphdmFYbWxKb2luTm9kZS50aGlzLAotCQkJCQkJCQlnZXRYbWxQYXRoVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUgPSBnZXRDbGFzc01hcHBpbmcoKS5nZXRYc2RUeXBlRGVmaW5pdGlvbigpOwotCQlYUGF0aCB4cGF0aCA9IFhQYXRoRmFjdG9yeS5pbnN0YW5jZSgpLmdldFhwYXRoKHRoaXMueG1sUGF0aCk7Ci0JCXhwYXRoLnZhbGlkYXRlKG5ldyBYbWxQYXRoQ29udGV4dChhc3RSb290KSwgeHNkVHlwZSwgbWVzc2FnZXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVJlZmVyZW5jZWRYbWxQYXRoKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLnJlZmVyZW5jZWRYbWxQYXRoKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXIuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9KT0lOX05PREVfX1JFRkVSRU5DRURfWE1MX1BBVEhfTk9UX1NQRUNJRklFRCwKLQkJCQkJCQlFTEphdmFYbWxKb2luTm9kZS50aGlzLAotCQkJCQkJCWdldFJlZmVyZW5jZWRYbWxQYXRoVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICh0aGlzLnJlZmVyZW5jZWRYbWxQYXRoLnN0YXJ0c1dpdGgoWFBhdGguREVMSU0pKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCUVMSmF4YlZhbGlkYXRpb25NZXNzYWdlQnVpbGRlci5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWFBBVEhfX1JPT1RfTk9UX1NVUFBPUlRFRCwKLQkJCQkJCQlFTEphdmFYbWxKb2luTm9kZS50aGlzLAotCQkJCQkJCWdldFJlZmVyZW5jZWRYbWxQYXRoVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUVMQ2xhc3NNYXBwaW5nIHJlZmVyZW5jZWRDbGFzc01hcHBpbmcgPSB0aGlzLmNvbnRleHQuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldFJlZmVyZW5jZWRDbGFzc01hcHBpbmcoKTsKLQkJaWYgKHJlZmVyZW5jZWRDbGFzc01hcHBpbmcgIT0gbnVsbCAmJiAKLQkJCQkhIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhyZWZlcmVuY2VkQ2xhc3NNYXBwaW5nLmdldEtleVhQYXRocygpLCB0aGlzLnJlZmVyZW5jZWRYbWxQYXRoKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXIuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9KT0lOX05PREVfX1JFRkVSRU5DRURfWE1MX1BBVEhfTk9UX0lOX1JFRkVSRU5DRURfQ0xBU1NfS0VZUywKLQkJCQkJCQluZXcgU3RyaW5nW10geyByZWZlcmVuY2VkQ2xhc3NNYXBwaW5nLmdldEpheGJUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksIHRoaXMucmVmZXJlbmNlZFhtbFBhdGggfSwKLQkJCQkJCQlFTEphdmFYbWxKb2luTm9kZS50aGlzLAotCQkJCQkJCWdldFJlZmVyZW5jZWRYbWxQYXRoVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCX0KLQkJCi0JCVhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUgPSBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0UmVmZXJlbmNlZFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCVhQYXRoIHhwYXRoID0gWFBhdGhGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0WHBhdGgodGhpcy5yZWZlcmVuY2VkWG1sUGF0aCk7Ci0JCXhwYXRoLnZhbGlkYXRlKG5ldyBSZWZlcmVuY2VkWG1sUGF0aENvbnRleHQoYXN0Um9vdCksIHhzZFR5cGUsIG1lc3NhZ2VzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRYbWxQYXRoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIHNob3VsZCBuZXZlciBiZSBudWxsCi0JCXJldHVybiBnZXRBbm5vdGF0aW9uKCkuZ2V0WG1sUGF0aFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkWG1sUGF0aFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBzaG91bGQgbmV2ZXIgYmUgbnVsbAotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbigpLmdldFJlZmVyZW5jZWRYbWxQYXRoVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQkKLQlwdWJsaWMgaW50ZXJmYWNlIENvbnRleHQgewotCQkKLQkJWG1sSm9pbk5vZGVBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKTsKLQkJCi0JCUVMWG1sSm9pbk5vZGVzTWFwcGluZyBnZXRBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBYUGF0aENvbnRleHQKLQkJCWltcGxlbWVudHMgWFBhdGguQ29udGV4dCB7Ci0JCQotCQlwcm90ZWN0ZWQgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3Q7Ci0JCQotCQlwcm90ZWN0ZWQgWFBhdGhDb250ZXh0KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQl0aGlzLmFzdFJvb3QgPSBhc3RSb290OwotCQl9Ci0JCQotCQkKLQkJcHVibGljIEpheGJOb2RlIGdldENvbnRleHRPYmplY3QoKSB7Ci0JCQlyZXR1cm4gRUxKYXZhWG1sSm9pbk5vZGUudGhpczsKLQkJfQotCQkKLQkJcHVibGljIEpheGJQYWNrYWdlIGdldEpheGJQYWNrYWdlKCkgewotCQkJcmV0dXJuIEVMSmF2YVhtbEpvaW5Ob2RlLnRoaXMuZ2V0SmF4YlBhY2thZ2UoKTsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sUGF0aENvbnRleHQKLQkJCWV4dGVuZHMgWFBhdGhDb250ZXh0IHsKLQkJCi0JCXByb3RlY3RlZCBYbWxQYXRoQ29udGV4dChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJc3VwZXIoYXN0Um9vdCk7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZSgpIHsKLQkJCXJldHVybiBFTEphdmFYbWxKb2luTm9kZS50aGlzLmdldFhtbFBhdGhUZXh0UmFuZ2UodGhpcy5hc3RSb290KTsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgUmVmZXJlbmNlZFhtbFBhdGhDb250ZXh0Ci0JCQlleHRlbmRzIFhQYXRoQ29udGV4dCB7Ci0JCQotCQlwcm90ZWN0ZWQgUmVmZXJlbmNlZFhtbFBhdGhDb250ZXh0KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlzdXBlcihhc3RSb290KTsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKCkgewotCQkJcmV0dXJuIEVMSmF2YVhtbEpvaW5Ob2RlLnRoaXMuZ2V0UmVmZXJlbmNlZFhtbFBhdGhUZXh0UmFuZ2UodGhpcy5hc3RSb290KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxKb2luTm9kZXNNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sSm9pbk5vZGVzTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzUyMDM2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxKb2luTm9kZXNNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdWJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuRUxKYXhiTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxFbGVtZW50c01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxKb2luTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FTFhtbEpvaW5Ob2Rlc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkVMSmF4YlZhbGlkYXRpb25NZXNzYWdlQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEpvaW5Ob2RlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxKb2luTm9kZXNNYXBwaW5nCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZwotCQlpbXBsZW1lbnRzIEVMWG1sSm9pbk5vZGVzTWFwcGluZyB7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPEVMSmF2YVhtbEpvaW5Ob2RlLCBYbWxKb2luTm9kZUFubm90YXRpb24+IHhtbEpvaW5Ob2RlQ29udGFpbmVyOwotCQotCQotCXB1YmxpYyBFTEphdmFYbWxKb2luTm9kZXNNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnhtbEpvaW5Ob2RlQ29udGFpbmVyID0gYnVpbGRYbWxKb2luTm9kZUNvbnRhaW5lcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVMSmF4Yk1hcHBpbmdLZXlzLlhNTF9KT0lOX05PREVTX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVMSmF4Yi5YTUxfSk9JTl9OT0RFUzsKLQl9Ci0JCi0JCi0JLy8gKioqKiogb3ZlcnJpZGVzICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGREZWZhdWx0KCkgewotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbigpID09IG51bGwgCi0JCQkJJiYgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfSk9JTl9OT0RFKSk7Ci0JfQotCQotCQotCS8vICoqKioqIHN5bmMvdXBkYXRlICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnhtbEpvaW5Ob2RlQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy54bWxKb2luTm9kZUNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogeG1sSm9pbk5vZGVzICoqKioqCi0JCi0JcHVibGljIExpc3RJdGVyYWJsZTxFTFhtbEpvaW5Ob2RlPiBnZXRYbWxKb2luTm9kZXMoKSB7Ci0JCXJldHVybiBuZXcgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyPEVMWG1sSm9pbk5vZGU+KHRoaXMueG1sSm9pbk5vZGVDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCkpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFhtbEpvaW5Ob2Rlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEpvaW5Ob2RlQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0JCi0JcHVibGljIEVMWG1sSm9pbk5vZGUgYWRkWG1sSm9pbk5vZGUoaW50IGluZGV4KSB7Ci0JCVhtbEpvaW5Ob2RlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKFhtbEpvaW5Ob2RlQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihpbmRleCwgRUxKYXhiLlhNTF9KT0lOX05PREUpOwotCQlyZXR1cm4gdGhpcy54bWxKb2luTm9kZUNvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgYW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbEpvaW5Ob2RlKGludCBpbmRleCkgewotCQlnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKGluZGV4LCBFTEpheGIuWE1MX0pPSU5fTk9ERSk7Ci0JCXRoaXMueG1sSm9pbk5vZGVDb250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlWG1sSm9pbk5vZGUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkubW92ZUFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBFTEpheGIuWE1MX0pPSU5fTk9ERSk7Ci0JCXRoaXMueG1sSm9pbk5vZGVDb250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCQotCXByb3RlY3RlZCBFTEphdmFYbWxKb2luTm9kZSBidWlsZFhtbEpvaW5Ob2RlKFhtbEpvaW5Ob2RlQW5ub3RhdGlvbiB4bWxKb2luTm9kZUFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBFTEphdmFYbWxKb2luTm9kZSh0aGlzLCBuZXcgWG1sSm9pbk5vZGVDb250ZXh0KHhtbEpvaW5Ob2RlQW5ub3RhdGlvbikpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8RUxKYXZhWG1sSm9pbk5vZGUsIFhtbEpvaW5Ob2RlQW5ub3RhdGlvbj4gYnVpbGRYbWxKb2luTm9kZUNvbnRhaW5lcigpIHsKLQkJWG1sSm9pbk5vZGVDb250YWluZXIgY29udGFpbmVyID0gbmV3IFhtbEpvaW5Ob2RlQ29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sSm9pbk5vZGVBbm5vdGF0aW9uPiBnZXRYbWxKb2luTm9kZUFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IFN1Ykxpc3RJdGVyYWJsZVdyYXBwZXI8TmVzdGFibGVBbm5vdGF0aW9uLCBYbWxKb2luTm9kZUFubm90YXRpb24+KAotCQkJCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfSk9JTl9OT0RFKSk7Ci0JfQotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQlwdWJsaWMgRUxDbGFzc01hcHBpbmcgZ2V0UmVmZXJlbmNlZENsYXNzTWFwcGluZygpIHsKLQkJU3RyaW5nIHZhbHVlVHlwZSA9IGdldFZhbHVlVHlwZU5hbWUoKTsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodmFsdWVUeXBlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiAoRUxDbGFzc01hcHBpbmcpIGdldENvbnRleHRSb290KCkuZ2V0Q2xhc3NNYXBwaW5nKHZhbHVlVHlwZSk7Ci0JfQotCQotCXB1YmxpYyBYc2RUeXBlRGVmaW5pdGlvbiBnZXRSZWZlcmVuY2VkWHNkVHlwZURlZmluaXRpb24oKSB7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gZ2V0UmVmZXJlbmNlZENsYXNzTWFwcGluZygpOwotCQlyZXR1cm4gKGNsYXNzTWFwcGluZyA9PSBudWxsKSA/IG51bGwgOiBjbGFzc01hcHBpbmcuZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogY29udGVudCBhc3Npc3QgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscygKLQkJCWludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCi0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlmb3IgKEVMSmF2YVhtbEpvaW5Ob2RlIHhtbEpvaW5Ob2RlIDogdGhpcy54bWxKb2luTm9kZUNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKSkgewotCQkJcmVzdWx0ID0geG1sSm9pbk5vZGUuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJSmF4YkNsYXNzTWFwcGluZyByZWZlcmVuY2VkQ2xhc3MgPSBnZXRSZWZlcmVuY2VkQ2xhc3NNYXBwaW5nKCk7Ci0JCQotCQlpZiAocmVmZXJlbmNlZENsYXNzID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VCdWlsZGVyLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9KT0lOX05PREVTX19JTlZBTElEX1JFRkVSRU5DRURfQ0xBU1MsCi0JCQkJCQkJCW5ldyBTdHJpbmdbXSB7IGdldFZhbHVlVHlwZU5hbWUoKSB9LAotCQkJCQkJCQlFTEphdmFYbWxKb2luTm9kZXNNYXBwaW5nLnRoaXMsCi0JCQkJCQkJCWdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCQkKLQkJdmFsaWRhdGVEdXBsaWNhdGVYbWxQYXRocyhtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJZm9yIChFTEphdmFYbWxKb2luTm9kZSB4bWxKb2luTm9kZSA6IHRoaXMueG1sSm9pbk5vZGVDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCkpIHsKLQkJCXhtbEpvaW5Ob2RlLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVEdXBsaWNhdGVYbWxQYXRocyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlCYWc8U3RyaW5nPiB4bWxQYXRocyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJQmFnPFN0cmluZz4gcmVmZXJlbmNlZFhtbFBhdGhzID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQkKLQkJZm9yIChFTEphdmFYbWxKb2luTm9kZSBqb2luTm9kZSA6IHRoaXMueG1sSm9pbk5vZGVDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCkpIHsKLQkJCVN0cmluZyB4bWxQYXRoID0gam9pbk5vZGUuZ2V0WG1sUGF0aCgpOwotCQkJaWYgKCEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh4bWxQYXRoKSkgewotCQkJCXhtbFBhdGhzLmFkZCh4bWxQYXRoKTsKLQkJCX0KLQkJCVN0cmluZyByZWZlcmVuY2VkWG1sUGF0aCA9IGpvaW5Ob2RlLmdldFJlZmVyZW5jZWRYbWxQYXRoKCk7Ci0JCQlpZiAoISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHJlZmVyZW5jZWRYbWxQYXRoKSkgewotCQkJCXJlZmVyZW5jZWRYbWxQYXRocy5hZGQocmVmZXJlbmNlZFhtbFBhdGgpOwotCQkJfQotCQl9Ci0JCQotCQlmb3IgKEVMSmF2YVhtbEpvaW5Ob2RlIGpvaW5Ob2RlIDogdGhpcy54bWxKb2luTm9kZUNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKSkgewotCQkJdmFsaWRhdGVEdXBsaWNhdGVYbWxQYXRoKGpvaW5Ob2RlLCB4bWxQYXRocywgbWVzc2FnZXMsIGFzdFJvb3QpOwotCQkJdmFsaWRhdGVEdXBsaWNhdGVSZWZlcmVuY2VkWG1sUGF0aChqb2luTm9kZSwgcmVmZXJlbmNlZFhtbFBhdGhzLCBtZXNzYWdlcywgYXN0Um9vdCk7CQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRHVwbGljYXRlWG1sUGF0aChFTEphdmFYbWxKb2luTm9kZSBqb2luTm9kZSwgQmFnPFN0cmluZz4geG1sUGF0aHMsCi0JCQkJTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVN0cmluZyB4bWxQYXRoID0gam9pbk5vZGUuZ2V0WG1sUGF0aCgpOwotCQlpZiAoeG1sUGF0aHMuY291bnQoeG1sUGF0aCkgPiAxKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCUVMSmF4YlZhbGlkYXRpb25NZXNzYWdlQnVpbGRlci5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0pPSU5fTk9ERVNfX0RVUExJQ0FURV9YTUxfUEFUSCwKLQkJCQkJCQluZXcgU3RyaW5nW10geyB4bWxQYXRoIH0sCi0JCQkJCQkJam9pbk5vZGUsCi0JCQkJCQkJam9pbk5vZGUuZ2V0WG1sUGF0aFRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRHVwbGljYXRlUmVmZXJlbmNlZFhtbFBhdGgoRUxKYXZhWG1sSm9pbk5vZGUgam9pbk5vZGUsIEJhZzxTdHJpbmc+IHJlZmVyZW5jZWRYbWxQYXRocywKLQkJCQlMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJU3RyaW5nIHJlZmVyZW5jZWRYbWxQYXRoID0gam9pbk5vZGUuZ2V0UmVmZXJlbmNlZFhtbFBhdGgoKTsKLQkJaWYgKHJlZmVyZW5jZWRYbWxQYXRocy5jb3VudChyZWZlcmVuY2VkWG1sUGF0aCkgPiAxKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCUVMSmF4YlZhbGlkYXRpb25NZXNzYWdlQnVpbGRlci5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0pPSU5fTk9ERVNfX0RVUExJQ0FURV9SRUZFUkVOQ0VEX1hNTF9QQVRILAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHJlZmVyZW5jZWRYbWxQYXRoIH0sCi0JCQkJCQkJam9pbk5vZGUsCi0JCQkJCQkJam9pbk5vZGUuZ2V0UmVmZXJlbmNlZFhtbFBhdGhUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQlhbm5vdGF0aW9uID0gZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbigwLCBFTEpheGIuWE1MX0pPSU5fTk9ERSk7Ci0JCX0KLQkJcmV0dXJuIGFubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sSm9pbk5vZGVDb250YWluZXIKLQkJCWV4dGVuZHMgQ29udGV4dExpc3RDb250YWluZXI8RUxKYXZhWG1sSm9pbk5vZGUsIFhtbEpvaW5Ob2RlQW5ub3RhdGlvbj4gewotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIEVMWG1sRWxlbWVudHNNYXBwaW5nLlhNTF9QQVRIU19MSVNUOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEVMSmF2YVhtbEpvaW5Ob2RlIGJ1aWxkQ29udGV4dEVsZW1lbnQoWG1sSm9pbk5vZGVBbm5vdGF0aW9uIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEVMSmF2YVhtbEpvaW5Ob2Rlc01hcHBpbmcudGhpcy5idWlsZFhtbEpvaW5Ob2RlKHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFhtbEpvaW5Ob2RlQW5ub3RhdGlvbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBFTEphdmFYbWxKb2luTm9kZXNNYXBwaW5nLnRoaXMuZ2V0WG1sSm9pbk5vZGVBbm5vdGF0aW9ucygpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFhtbEpvaW5Ob2RlQW5ub3RhdGlvbiBnZXRSZXNvdXJjZUVsZW1lbnQoRUxKYXZhWG1sSm9pbk5vZGUgY29udGV4dEVsZW1lbnQpIHsKLQkJCS8vIGluIHRoZSBjb250ZXh0IG9mIHRoaXMgbWFwcGluZywgdGhlcmUgd2lsbCBuZXZlciBiZSBhbiBFTFhtbEpvaW5Ob2RlIHdpdGhvdXQgYW4gYW5ub3RhdGlvbgotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldEFubm90YXRpb24oKTsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sSm9pbk5vZGVDb250ZXh0Ci0JCQlpbXBsZW1lbnRzIEVMSmF2YVhtbEpvaW5Ob2RlLkNvbnRleHQgewotCQkKLQkJcHJvdGVjdGVkIFhtbEpvaW5Ob2RlQW5ub3RhdGlvbiBhbm5vdGF0aW9uOwotCQkKLQkJCi0JCXByb3RlY3RlZCBYbWxKb2luTm9kZUNvbnRleHQoWG1sSm9pbk5vZGVBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJCXRoaXMuYW5ub3RhdGlvbiA9IGFubm90YXRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBYbWxKb2luTm9kZUFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmFubm90YXRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBFTFhtbEpvaW5Ob2Rlc01hcHBpbmcgZ2V0QXR0cmlidXRlTWFwcGluZygpIHsKLQkJCXJldHVybiBFTEphdmFYbWxKb2luTm9kZXNNYXBwaW5nLnRoaXM7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sSm9pbk5vZGVzTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxKb2luTm9kZXNNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWVlNTgwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxKb2luTm9kZXNNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuRUxKYXhiTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sSm9pbk5vZGVzTWFwcGluZ0RlZmluaXRpb24KLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRUxKYXZhWG1sSm9pbk5vZGVzTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBFTEphdmFYbWxKb2luTm9kZXNNYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IHsgRUxKYXhiLlhNTF9KT0lOX05PREUgfTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByb3RlY3RlZCBFTEphdmFYbWxKb2luTm9kZXNNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRUxKYXhiTWFwcGluZ0tleXMuWE1MX0pPSU5fTk9ERVNfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFTEpheGIuWE1MX0pPSU5fTk9ERVM7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIHN1cGVyLmlzU3BlY2lmaWVkKHBlcnNpc3RlbnRBdHRyaWJ1dGUpIAotCQkJCXx8ICEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9ucyhFTEpheGIuWE1MX0pPSU5fTk9ERSkpOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhYmxlPFN0cmluZz4oU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTKTsKLQl9Ci0JCi0JcHVibGljIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEpheGJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBFTEphdmFYbWxKb2luTm9kZXNNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEtleS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjAxMjJhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEtleUFubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIEVMSmF2YVhtbEtleQotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgRUxYbWxLZXkgewotCQotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0IGNvbnRleHQ7Ci0JCi0JCi0JcHVibGljIEVMSmF2YVhtbEtleShKYXZhQ29udGV4dE5vZGUgcGFyZW50LCBDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmNvbnRleHQuZ2V0QW5ub3RhdGlvbigpLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JCi0JcHVibGljIGludGVyZmFjZSBDb250ZXh0IHsKLQkJCi0JCVhtbEtleUFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxQYXRoLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sUGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2I3MTZlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxQYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVMWG1sUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQueHBhdGguamF2YS5YUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQueHBhdGguamF2YS5YUGF0aEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkVMSmF4YlZhbGlkYXRpb25NZXNzYWdlQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxQYXRoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxQYXRoCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhQ29udGV4dE5vZGUKLQkJaW1wbGVtZW50cyBFTFhtbFBhdGggewotCQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlOwotCQotCXByb3RlY3RlZCBDb250ZXh0IGNvbnRleHQ7Ci0JCi0JCi0JcHVibGljIEVMSmF2YVhtbFBhdGgoSmF2YUNvbnRleHROb2RlIHBhcmVudCwgQ29udGV4dCBjb250ZXh0KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JCWluaXRWYWx1ZSgpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoKSB7Ci0JCXJldHVybiBnZXRDbGFzc01hcHBpbmcoKS5nZXRKYXhiVHlwZSgpLmdldEpheGJQYWNrYWdlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHN5bmMvdXBkYXRlICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlzeW5jVmFsdWUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsdWUgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWdldEFubm90YXRpb24oKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCXNldFZhbHVlXyh2YWx1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB0aGlzLnZhbHVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFZhbHVlKCkgewotCQl0aGlzLnZhbHVlID0gZ2V0QW5ub3RhdGlvbigpLmdldFZhbHVlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNWYWx1ZSgpIHsKLQkJc2V0VmFsdWVfKGdldEFubm90YXRpb24oKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbFBhdGhBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRleHQuZ2V0QW5ub3RhdGlvbigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgZ2V0QXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuY29udGV4dC5nZXRBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXhiQ2xhc3NNYXBwaW5nIGdldENsYXNzTWFwcGluZygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRDbGFzc01hcHBpbmcoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogY29udGVudCBhc3Npc3QgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscygKLQkJCWludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCi0JCWlmIChnZXRBbm5vdGF0aW9uKCkudmFsdWVUb3VjaGVzKHBvcywgYXN0Um9vdCkgJiYgdGhpcy52YWx1ZSAhPSBudWxsKSB7Ci0JCQlYc2RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlID0gZ2V0Q2xhc3NNYXBwaW5nKCkuZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQkJCVhQYXRoIHhwYXRoID0gWFBhdGhGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0WHBhdGgodGhpcy52YWx1ZSk7Ci0JCQlyZXR1cm4geHBhdGguZ2V0Q29tcGxldGlvblByb3Bvc2FscyhuZXcgWFBhdGhDb250ZXh0KGFzdFJvb3QpLCB4c2RUeXBlLCBwb3MsIGZpbHRlcik7Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb24oKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLnZhbHVlKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXIuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1BBVEhfX05PVF9TUEVDSUZJRUQsCi0JCQkJCQkJCUVMSmF2YVhtbFBhdGgudGhpcywKLQkJCQkJCQkJZ2V0VmFsdWVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKHRoaXMudmFsdWUuc3RhcnRzV2l0aChYUGF0aC5ERUxJTSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VCdWlsZGVyLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhQQVRIX19ST09UX05PVF9TVVBQT1JURUQsCi0JCQkJCQkJCUVMSmF2YVhtbFBhdGgudGhpcywKLQkJCQkJCQkJZ2V0VmFsdWVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJWHNkVHlwZURlZmluaXRpb24geHNkVHlwZSA9IGdldENsYXNzTWFwcGluZygpLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCVhQYXRoIHhwYXRoID0gWFBhdGhGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0WHBhdGgodGhpcy52YWx1ZSk7Ci0JCXhwYXRoLnZhbGlkYXRlKG5ldyBYUGF0aENvbnRleHQoYXN0Um9vdCksIHhzZFR5cGUsIG1lc3NhZ2VzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBzaG91bGQgbmV2ZXIgYmUgbnVsbAotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbigpLmdldFZhbHVlVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQkKLQlwdWJsaWMgaW50ZXJmYWNlIENvbnRleHQgewotCQkKLQkJWG1sUGF0aEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpOwotCQkKLQkJSmF4YkF0dHJpYnV0ZU1hcHBpbmcgZ2V0QXR0cmlidXRlTWFwcGluZygpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWFBhdGhDb250ZXh0Ci0JCWltcGxlbWVudHMgWFBhdGguQ29udGV4dCB7Ci0JCQotCQlwcml2YXRlIENvbXBpbGF0aW9uVW5pdCBhc3RSb290OwotCQkKLQkJcHJvdGVjdGVkIFhQYXRoQ29udGV4dChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJdGhpcy5hc3RSb290ID0gYXN0Um9vdDsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyBKYXhiTm9kZSBnZXRDb250ZXh0T2JqZWN0KCkgewotCQkJcmV0dXJuIEVMSmF2YVhtbFBhdGgudGhpczsKLQkJfQotCQkKLQkJcHVibGljIEpheGJQYWNrYWdlIGdldEpheGJQYWNrYWdlKCkgewotCQkJcmV0dXJuIEVMSmF2YVhtbFBhdGgudGhpcy5nZXRKYXhiUGFja2FnZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZSgpIHsKLQkJCXJldHVybiBFTEphdmFYbWxQYXRoLnRoaXMuZ2V0VmFsdWVUZXh0UmFuZ2UodGhpcy5hc3RSb290KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxUcmFuc2Zvcm1hdGlvbk1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxUcmFuc2Zvcm1hdGlvbk1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM2OTA4Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sVHJhbnNmb3JtYXRpb25NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5FTEpheGJNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIEVMSmF2YVhtbFRyYW5zZm9ybWF0aW9uTWFwcGluZwotCQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc8WG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uPiB7Ci0JCi0JcHVibGljIEVMSmF2YVhtbFRyYW5zZm9ybWF0aW9uTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBFTEpheGJNYXBwaW5nS2V5cy5YTUxfVFJBTlNGT1JNQVRJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9UUkFOU0ZPUk1BVElPTjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbFRyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZkMDVmNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuRUxKYXhiTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRUxKYXZhWG1sVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJvdGVjdGVkIEVMSmF2YVhtbFRyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRUxKYXhiTWFwcGluZ0tleXMuWE1MX1RSQU5TRk9STUFUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVMSmF4Yi5YTUxfVFJBTlNGT1JNQVRJT047Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKYXhiRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCS8vIFRPRE86IG1vdmUgdG8gZmFjdG9yeSBvbmNlIEFQSSBvcGVucyB1cCBhZ2FpbgotCQlyZXR1cm4gbmV3IEVMSmF2YVhtbFRyYW5zZm9ybWF0aW9uTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxWYWx1ZU1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxWYWx1ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM1MjFiZi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sVmFsdWVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVhtbFZhbHVlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FTFhtbENEQVRBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVMWG1sVmFsdWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbENEQVRBQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sVmFsdWVNYXBwaW5nCi0JCWV4dGVuZHMgR2VuZXJpY0phdmFYbWxWYWx1ZU1hcHBpbmcKLQkJaW1wbGVtZW50cyBFTFhtbFZhbHVlTWFwcGluZyB7Ci0JCi0JcHJvdGVjdGVkIEVMSmF2YVhtbENEQVRBIHhtbENEQVRBOwotCQotCQotCXB1YmxpYyBFTEphdmFYbWxWYWx1ZU1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCWluaXRYbWxDREFUQSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzeW5jL3VwZGF0ZSAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc3luY1htbENEQVRBKCk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbENEQVRBICoqKioqCi0JCi0JcHVibGljIEVMWG1sQ0RBVEEgZ2V0WG1sQ0RBVEEoKSB7Ci0JCXJldHVybiB0aGlzLnhtbENEQVRBOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxDREFUQV8oRUxKYXZhWG1sQ0RBVEEgeG1sQ0RBVEEpIHsKLQkJRUxKYXZhWG1sQ0RBVEEgb2xkID0gdGhpcy54bWxDREFUQTsKLQkJdGhpcy54bWxDREFUQSA9IHhtbENEQVRBOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9DREFUQV9QUk9QRVJUWSwgb2xkLCB0aGlzLnhtbENEQVRBKTsKLQl9Ci0JCi0JcHVibGljIEVMWG1sQ0RBVEEgYWRkWG1sQ0RBVEEoKSB7Ci0JCWlmICh0aGlzLnhtbENEQVRBICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfQ0RBVEEpOwotCQlFTEphdmFYbWxDREFUQSB4bWxDREFUQSA9IGJ1aWxkWG1sQ0RBVEEoKTsKLQkJc2V0WG1sQ0RBVEFfKHhtbENEQVRBKTsKLQkJcmV0dXJuIHhtbENEQVRBOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxDREFUQSgpIHsKLQkJaWYgKHRoaXMueG1sQ0RBVEEgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oRUxKYXhiLlhNTF9DREFUQSk7Ci0JCXNldFhtbENEQVRBXyhudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFhtbENEQVRBKCkgewotCQlYbWxDREFUQUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbENEQVRBQW5ub3RhdGlvbigpOwotCQl0aGlzLnhtbENEQVRBID0gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogYnVpbGRYbWxDREFUQSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sQ0RBVEEoKSB7Ci0JCVhtbENEQVRBQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sQ0RBVEFBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnhtbENEQVRBID09IG51bGwpIHsKLQkJCQlzZXRYbWxDREFUQV8oYnVpbGRYbWxDREFUQSgpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXNldFhtbENEQVRBXyhudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgRUxKYXZhWG1sQ0RBVEEgYnVpbGRYbWxDREFUQSgpIHsKLQkJcmV0dXJuIG5ldyBFTEphdmFYbWxDREFUQSh0aGlzLCBuZXcgWG1sQ0RBVEFDb250ZXh0KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sQ0RBVEFBbm5vdGF0aW9uIGdldFhtbENEQVRBQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxDREFUQUFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oRUxKYXhiLlhNTF9DREFUQSk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxDREFUQUNvbnRleHQKLQkJCWltcGxlbWVudHMgRUxKYXZhWG1sQ0RBVEEuQ29udGV4dCB7Ci0JCQotCQlwdWJsaWMgWG1sQ0RBVEFBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCQlyZXR1cm4gRUxKYXZhWG1sVmFsdWVNYXBwaW5nLnRoaXMuZ2V0WG1sQ0RBVEFBbm5vdGF0aW9uKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sVmFsdWVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbFZhbHVlTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYyMDlkMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sVmFsdWVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhWG1sVmFsdWVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxWYWx1ZU1hcHBpbmdEZWZpbml0aW9uCi0JCWV4dGVuZHMgSmF2YVhtbFZhbHVlTWFwcGluZ0RlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVMSmF2YVhtbFZhbHVlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBFTEphdmFYbWxWYWx1ZU1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gCi0JCQl7Ci0JCQkJRUxKYXhiLlhNTF9DREFUQSB9OwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJvdGVjdGVkIEVMSmF2YVhtbFZhbHVlTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJCQlzdXBlci5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCi0JCQkJbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3hwYXRoL2phdmEvWFBhdGguamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQveHBhdGgvamF2YS9YUGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDE1ZGJiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQveHBhdGgvamF2YS9YUGF0aC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnhwYXRoLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlNpbXBsZVRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxOczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZEF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkVMSmF4YlZhbGlkYXRpb25NZXNzYWdlQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGNsYXNzIFhQYXRoIHsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERUxJTSA9ICIvIjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBVFRfUFJFRklYID0gIkAiOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRFWFQgPSAidGV4dCgpIjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTRUxGID0gIi4iOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTE9OID0gIjoiOwotCQotCXB1YmxpYyBzdGF0aWMgY2hhciBPUEVOX0JSQUNLRVQgPSAnWyc7Ci0JCi0JcHVibGljIHN0YXRpYyBjaGFyIENMT1NFX0JSQUNLRVQgPSAnXSc7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXR0cmlidXRlWFBhdGgoU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSkgewotCQlpZiAocHJlZml4ID09IG51bGwpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5jb25jYXRlbmF0ZShBVFRfUFJFRklYLCBsb2NhbE5hbWUpOwotCQl9Ci0JCXJldHVybiBTdHJpbmdUb29scy5jb25jYXRlbmF0ZShBVFRfUFJFRklYLCBwcmVmaXgsIENPTE9OLCBsb2NhbE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50WFBhdGgoU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSkgewotCQlpZiAocHJlZml4ID09IG51bGwpIHsKLQkJCXJldHVybiBsb2NhbE5hbWU7Ci0JCX0KLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbmNhdGVuYXRlKHByZWZpeCwgQ09MT04sIGxvY2FsTmFtZSk7Ci0JfQotCQotCQotCUxpc3Q8U3RlcD4gc3RlcHM7Ci0JCi0JCi0JWFBhdGgoU3RyaW5nIHhwYXRoU3RyaW5nKSB7Ci0JCXRoaXMuc3RlcHMgPSBuZXcgVmVjdG9yPFN0ZXA+KCk7Ci0JCXBhcnNlKHhwYXRoU3RyaW5nKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGludCBnZXRJbmRleChTdGVwIHN0ZXApIHsKLQkJcmV0dXJuIHRoaXMuc3RlcHMuaW5kZXhPZihzdGVwKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0ZXAgZ2V0Rmlyc3RTdGVwKCkgewotCQlpZiAodGhpcy5zdGVwcy5zaXplKCkgPiAwKSB7Ci0JCQlyZXR1cm4gdGhpcy5zdGVwcy5nZXQoMCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBTdGVwIGdldE5leHRTdGVwKFN0ZXAgc3RlcCkgewotCQlpbnQgbmV4dEluZGV4ID0gZ2V0SW5kZXgoc3RlcCkgKyAxOwotCQlpZiAodGhpcy5zdGVwcy5zaXplKCkgPiBuZXh0SW5kZXgpIHsKLQkJCXJldHVybiB0aGlzLnN0ZXBzLmdldChuZXh0SW5kZXgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZShTdHJpbmcgeHBhdGgpIHsKLQkJZm9yIChTdHJpbmcgc2VnbWVudCA6IHhwYXRoLnNwbGl0KERFTElNLCAtMSkpIHsKLQkJCXRoaXMuc3RlcHMuYWRkKGNyZWF0ZVN0ZXAoc2VnbWVudCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBTdGVwIGNyZWF0ZVN0ZXAoU3RyaW5nIHN0ZXBWYWx1ZSkgewotCQlpZiAoVEVYVC5lcXVhbHMoc3RlcFZhbHVlKSkgewotCQkJcmV0dXJuIG5ldyBUZXh0U3RlcCgpOwotCQl9Ci0JCWVsc2UgaWYgKFNFTEYuZXF1YWxzKHN0ZXBWYWx1ZSkpIHsKLQkJCXJldHVybiBuZXcgU2VsZlN0ZXAoKTsKLQkJfQotCQllbHNlIGlmIChzdGVwVmFsdWUuc3RhcnRzV2l0aChBVFRfUFJFRklYKSkgewotCQkJcmV0dXJuIHRyeUNyZWF0ZUF0dHJpYnV0ZVN0ZXAoc3RlcFZhbHVlKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiB0cnlDcmVhdGVFbGVtZW50U3RlcChzdGVwVmFsdWUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBTdGVwIHRyeUNyZWF0ZUF0dHJpYnV0ZVN0ZXAoU3RyaW5nIHN0ZXBWYWx1ZSkgewotCQkvLyBtdXN0IHN0YXJ0IHdpdGggIkAiIC0gYWxyZWFkeSB0ZXN0ZWQgdGhhdAotCQl0cnkgewotCQkJU3RyaW5nIGF0dHJpYnV0ZVN0ZXBWYWx1ZSA9IHN0ZXBWYWx1ZS5zdWJzdHJpbmcoMSk7Ci0JCQlTdHJpbmdbXSBzdGVwUGFydHMgPSBwYXJzZVN0ZXBQYXJ0cyhhdHRyaWJ1dGVTdGVwVmFsdWUpOwotCQkJcmV0dXJuIG5ldyBBdHRyaWJ1dGVTdGVwKHN0ZXBQYXJ0c1swXSwgc3RlcFBhcnRzWzFdLCBBcnJheVRvb2xzLnN1YkFycmF5KHN0ZXBQYXJ0cywgMiwgc3RlcFBhcnRzLmxlbmd0aCkpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWZlKSB7Ci0JCQlyZXR1cm4gbmV3IEludmFsaWRTdGVwKHN0ZXBWYWx1ZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFN0ZXAgdHJ5Q3JlYXRlRWxlbWVudFN0ZXAoU3RyaW5nIHN0ZXBWYWx1ZSkgewotCQl0cnkgewotCQkJU3RyaW5nW10gc3RlcFBhcnRzID0gcGFyc2VTdGVwUGFydHMoc3RlcFZhbHVlKTsKLQkJCXJldHVybiBuZXcgRWxlbWVudFN0ZXAoc3RlcFBhcnRzWzBdLCBzdGVwUGFydHNbMV0sIEFycmF5VG9vbHMuc3ViQXJyYXkoc3RlcFBhcnRzLCAyLCBzdGVwUGFydHMubGVuZ3RoKSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZmUpIHsKLQkJCXJldHVybiBuZXcgSW52YWxpZFN0ZXAoc3RlcFZhbHVlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nW10gcGFyc2VTdGVwUGFydHMoU3RyaW5nIHN0ZXBWYWx1ZSkgewotCQlTdHJpbmdbXSBwcmVkaWNhdGUgPSBuZXcgU3RyaW5nWzBdOwotCQlpbnQgcHJlZGljYXRlU3RhcnQgPSBzdGVwVmFsdWUubGFzdEluZGV4T2YoT1BFTl9CUkFDS0VUKTsKLQkJd2hpbGUgKHByZWRpY2F0ZVN0YXJ0ID49IDApIHsKLQkJCWludCBwcmVkaWNhdGVFbmQgPSBzdGVwVmFsdWUubGFzdEluZGV4T2YoQ0xPU0VfQlJBQ0tFVCk7Ci0JCQlpZiAocHJlZGljYXRlRW5kIDw9IHByZWRpY2F0ZVN0YXJ0IHx8IHByZWRpY2F0ZUVuZCAhPSBzdGVwVmFsdWUubGVuZ3RoKCkgLSAxKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJcHJlZGljYXRlID0gQXJyYXlUb29scy5hZGQocHJlZGljYXRlLCAwLCBzdGVwVmFsdWUuc3Vic3RyaW5nKHByZWRpY2F0ZVN0YXJ0ICsxLCBwcmVkaWNhdGVFbmQpKTsKLQkJCXN0ZXBWYWx1ZSA9IHN0ZXBWYWx1ZS5zdWJzdHJpbmcoMCwgcHJlZGljYXRlU3RhcnQpOwotCQkJcHJlZGljYXRlU3RhcnQgPSBzdGVwVmFsdWUubGFzdEluZGV4T2YoT1BFTl9CUkFDS0VUKTsKLQkJfQotCQkKLQkJU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLQkJaW50IGNvbG9uID0gc3RlcFZhbHVlLmluZGV4T2YoQ09MT04pOwotCQlpZiAoY29sb24gPiAwKSB7Ci0JCQlpZiAoc3RlcFZhbHVlLmluZGV4T2YoQ09MT04sIGNvbG9uICsgMSkgIT0gLTEpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQluc1ByZWZpeCA9IHN0ZXBWYWx1ZS5zdWJzdHJpbmcoMCwgY29sb24pOwotCQkJc3RlcFZhbHVlID0gc3RlcFZhbHVlLnN1YnN0cmluZyhjb2xvbiArMSk7Ci0JCX0KLQkJCi0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHN0ZXBWYWx1ZSkKLQkJCQl8fCBzdGVwVmFsdWUuaW5kZXhPZihDT0xPTikgPj0gMCAKLQkJCQl8fCBzdGVwVmFsdWUuaW5kZXhPZihPUEVOX0JSQUNLRVQpID49IDAgCi0JCQkJfHwgc3RlcFZhbHVlLmluZGV4T2YoQ0xPU0VfQlJBQ0tFVCkgPj0gMAotCQkJCXx8IHN0ZXBWYWx1ZS5pbmRleE9mKCcgJykgPj0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCQotCQlTdHJpbmdbXSByZXN1bHQgPSBBcnJheVRvb2xzLmFkZChuZXcgU3RyaW5nWzBdLCBuc1ByZWZpeCk7Ci0JCXJlc3VsdCA9IEFycmF5VG9vbHMuYWRkKHJlc3VsdCwgc3RlcFZhbHVlKTsKLQkJcmVzdWx0ID0gQXJyYXlUb29scy5hZGRBbGwocmVzdWx0LCBwcmVkaWNhdGUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENvbXBsZXRpb25Qcm9wb3NhbHMoCi0JCQlDb250ZXh0IGNvbnRleHQsIFhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUsIGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkKLQkJcmV0dXJuIGdldEZpcnN0U3RlcCgpLmdldENvbXBsZXRpb25Qcm9wb3NhbHMoY29udGV4dCwgeHNkVHlwZSwgU3RyaW5nVG9vbHMuRU1QVFlfU1RSSU5HLCBwb3MsIGZpbHRlcik7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShDb250ZXh0IGNvbnRleHQsIFhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUsIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWdldEZpcnN0U3RlcCgpLnZhbGlkYXRlKGNvbnRleHQsIHhzZFR5cGUsIG1lc3NhZ2VzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBidWlsZFRleHRSYW5nZShDb250ZXh0IGNvbnRleHQsIFN0ZXAgc3RlcCkgewotCQlUZXh0UmFuZ2UgZW50aXJlVGV4dFJhbmdlID0gY29udGV4dC5nZXRUZXh0UmFuZ2UoKTsKLQkJaW50IHN0YXJ0ID0gMDsKLQkJZm9yIChTdGVwIGVhY2ggOiB0aGlzLnN0ZXBzKSB7Ci0JCQlpbnQgbGVuZ3RoID0gZWFjaC5nZXRWYWx1ZSgpLmxlbmd0aCgpICsgMjsgIC8vIGluY2x1ZGUgbGVhZGluZy90cmFpbGluZyAiIG9yIC8KLQkJCWlmIChlYWNoID09IHN0ZXApIHsKLQkJCQlyZXR1cm4gbmV3IFNpbXBsZVRleHRSYW5nZShlbnRpcmVUZXh0UmFuZ2UuZ2V0T2Zmc2V0KCkgKyBzdGFydCwgbGVuZ3RoLCBlbnRpcmVUZXh0UmFuZ2UuZ2V0TGluZU51bWJlcigpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0YXJ0ICs9IGxlbmd0aCAtIDE7IC8vIG9ubHkgaW5jbHVkZSBsZWFkaW5nICIgb3IgLwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0ZXAgbXVzdCBiZSBpbiBsaXN0IG9mIHRoaXMgWFBhdGgncyBzdGVwcy4iKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIEF0dHJpYnV0ZVN0ZXAKLQkJCWV4dGVuZHMgTmFtZWRDb21wb25lbnRTdGVwIHsKLQkJCi0JCXByb3RlY3RlZCBBdHRyaWJ1dGVTdGVwKFN0cmluZyBuc1ByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nW10gcHJlZGljYXRlcykgewotCQkJc3VwZXIobnNQcmVmaXgsIGxvY2FsTmFtZSwgcHJlZGljYXRlcyk7Ci0JCX0KLQkJCi0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCXJldHVybiBBVFRfUFJFRklYICsgc3VwZXIuZ2V0VmFsdWUoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYc2RUeXBlRGVmaW5pdGlvbiByZXNvbHZlTmV4dFR5cGUoQ29udGV4dCBjb250ZXh0LCBYc2RUeXBlRGVmaW5pdGlvbiBwcmV2aW91c1R5cGUpIHsKLQkJCVN0cmluZyBuYW1lc3BhY2UgPSByZXNvbHZlTmFtZXNwYWNlKGNvbnRleHQpOwotCQkJaWYgKG5hbWVzcGFjZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCVhzZEF0dHJpYnV0ZVVzZSB4c2RBdHRyaWJ1dGUgPSBwcmV2aW91c1R5cGUuZ2V0QXR0cmlidXRlKG5hbWVzcGFjZSwgdGhpcy5sb2NhbE5hbWUpOwotCQkJcmV0dXJuICh4c2RBdHRyaWJ1dGUgPT0gbnVsbCkgPyBudWxsIDogeHNkQXR0cmlidXRlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0VHlwZSgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoCi0JCQkJQ29udGV4dCBjb250ZXh0LCBYc2RUeXBlRGVmaW5pdGlvbiBwcmV2aW91c1R5cGUsIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCQkKLQkJCWlmIChnZXROZXh0U3RlcCgpICE9IG51bGwpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXIuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWFBBVEhfX0FUVFJJQlVURV9TRUdNRU5UX01VU1RfQkVfTEFTVF9TRUdNRU5ULAotCQkJCQkJCQljb250ZXh0LmdldENvbnRleHRPYmplY3QoKSwKLQkJCQkJCQkJZ2V0VGV4dFJhbmdlKGNvbnRleHQpKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlzdXBlci52YWxpZGF0ZShjb250ZXh0LCBwcmV2aW91c1R5cGUsIG1lc3NhZ2VzKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYc2RUeXBlRGVmaW5pdGlvbiB2YWxpZGF0ZUxvY2FsTmFtZSgKLQkJCQlDb250ZXh0IGNvbnRleHQsIFhzZFR5cGVEZWZpbml0aW9uIHByZXZpb3VzVHlwZSwgU3RyaW5nIG5hbWVzcGFjZSwgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJCQotCQkJWHNkQXR0cmlidXRlVXNlIHhzZEF0dHJpYnV0ZT0gcHJldmlvdXNUeXBlLmdldEF0dHJpYnV0ZShuYW1lc3BhY2UsIHRoaXMubG9jYWxOYW1lKTsKLQkJCWlmICh4c2RBdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCUVMSmF4YlZhbGlkYXRpb25NZXNzYWdlQnVpbGRlci5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCUVMSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YUEFUSF9fVU5SRVNPTFZFRF9BVFRSSUJVVEUsCi0JCQkJCQkJCW5ldyBTdHJpbmdbXSB7IG5hbWVzcGFjZSwgdGhpcy5sb2NhbE5hbWUgfSwKLQkJCQkJCQkJY29udGV4dC5nZXRDb250ZXh0T2JqZWN0KCksCi0JCQkJCQkJCWdldFRleHRSYW5nZShjb250ZXh0KSkpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIHhzZEF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFR5cGUoKTsKLQkJCX0KLQkJfQotCQkKLS8vCQlAT3ZlcnJpZGUKLS8vCQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGJ1aWxkTmFtZXNwYWNlUHJlZml4VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0vLwkJCS8vIGFzc3VtZSBuc1ByZWZpeCAhPSBudWxsCi0vLwkJCVRleHRSYW5nZSBzdGVwVGV4dFJhbmdlID0gRUxKYXZhWG1sUGF0aC50aGlzLmJ1aWxkVGV4dFJhbmdlKHRoaXMsIGFzdFJvb3QpOwotLy8JCQlyZXR1cm4gbmV3IFNpbXBsZVRleHRSYW5nZShzdGVwVGV4dFJhbmdlLmdldE9mZnNldCgpICsgMSwgdGhpcy5uc1ByZWZpeC5sZW5ndGgoKSwgc3RlcFRleHRSYW5nZS5nZXRMaW5lTnVtYmVyKCkpOwotLy8JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRWxlbWVudFN0ZXAKLQkJCWV4dGVuZHMgTmFtZWRDb21wb25lbnRTdGVwIHsKLQkJCi0JCXByb3RlY3RlZCBFbGVtZW50U3RlcChTdHJpbmcgbnNQcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZ1tdIHByZWRpY2F0ZXMpIHsKLQkJCXN1cGVyKG5zUHJlZml4LCBsb2NhbE5hbWUsIHByZWRpY2F0ZXMpOwotCQl9Ci0JCQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYc2RUeXBlRGVmaW5pdGlvbgotCQkJCXJlc29sdmVOZXh0VHlwZShDb250ZXh0IGNvbnRleHQsIFhzZFR5cGVEZWZpbml0aW9uIHByZXZpb3VzVHlwZSkgewotCQkKLQkJCVN0cmluZyBuYW1lc3BhY2UgPSByZXNvbHZlTmFtZXNwYWNlKGNvbnRleHQpOwotCQkJaWYgKG5hbWVzcGFjZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCVhzZEVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50ID0gcHJldmlvdXNUeXBlLmdldEVsZW1lbnQobmFtZXNwYWNlLCB0aGlzLmxvY2FsTmFtZSk7Ci0JCQlyZXR1cm4gKHhzZEVsZW1lbnQgPT0gbnVsbCkgPyBudWxsIDogeHNkRWxlbWVudC5nZXRUeXBlKCk7Ci0JCX0KLQkJCi0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFhzZFR5cGVEZWZpbml0aW9uIHZhbGlkYXRlTG9jYWxOYW1lKAotCQkJCUNvbnRleHQgY29udGV4dCwgWHNkVHlwZURlZmluaXRpb24gcHJldmlvdXNUeXBlLCBTdHJpbmcgbmFtZXNwYWNlLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQkJCi0JCQlYc2RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudCA9IHByZXZpb3VzVHlwZS5nZXRFbGVtZW50KG5hbWVzcGFjZSwgdGhpcy5sb2NhbE5hbWUpOwotCQkJaWYgKHhzZEVsZW1lbnQgPT0gbnVsbCkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCUVMSmF4YlZhbGlkYXRpb25NZXNzYWdlQnVpbGRlci5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCUVMSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YUEFUSF9fVU5SRVNPTFZFRF9FTEVNRU5ULAotCQkJCQkJCQluZXcgU3RyaW5nW10geyBuYW1lc3BhY2UsIHRoaXMubG9jYWxOYW1lIH0sCi0JCQkJCQkJCWNvbnRleHQuZ2V0Q29udGV4dE9iamVjdCgpLAotCQkJCQkJCQlnZXRUZXh0UmFuZ2UoY29udGV4dCkpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiB4c2RFbGVtZW50LmdldFR5cGUoKTsKLQkJCX0KLQkJfQotCQkKLS8vCQlAT3ZlcnJpZGUKLS8vCQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGJ1aWxkTmFtZXNwYWNlUHJlZml4VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0vLwkJCS8vIGFzc3VtZSBuc1ByZWZpeCAhPSBudWxsCi0vLwkJCVRleHRSYW5nZSBzdGVwVGV4dFJhbmdlID0gRUxKYXZhWG1sUGF0aC50aGlzLmJ1aWxkVGV4dFJhbmdlKHRoaXMsIGFzdFJvb3QpOwotLy8JCQlyZXR1cm4gbmV3IFNpbXBsZVRleHRSYW5nZShzdGVwVGV4dFJhbmdlLmdldE9mZnNldCgpLCB0aGlzLm5zUHJlZml4Lmxlbmd0aCgpLCBzdGVwVGV4dFJhbmdlLmdldExpbmVOdW1iZXIoKSk7Ci0vLwkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBJbnZhbGlkU3RlcAotCQkJZXh0ZW5kcyBTdGVwIHsKLQkJCi0JCXByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0JCQotCQlwcm90ZWN0ZWQgSW52YWxpZFN0ZXAoU3RyaW5nIHZhbHVlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFhzZFR5cGVEZWZpbml0aW9uCi0JCQkJcmVzb2x2ZU5leHRUeXBlKENvbnRleHQgY29udGV4dCwgWHNkVHlwZURlZmluaXRpb24gcHJldmlvdXNUeXBlKSB7Ci0JCQkKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoCi0JCQkJQ29udGV4dCBjb250ZXh0LCBYc2RUeXBlRGVmaW5pdGlvbiBwcmV2aW91c1R5cGUsIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCQkKLQkJCW1lc3NhZ2VzLiBhZGQoRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VCdWlsZGVyLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUVMSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YUEFUSF9fSU5WQUxJRF9GT1JNX0lMTEVHQUxfU0VHTUVOVCwKLQkJCQkJCQluZXcgU3RyaW5nW10geyBnZXRWYWx1ZSgpIH0sCi0JCQkJCQkJY29udGV4dC5nZXRDb250ZXh0T2JqZWN0KCksCi0JCQkJCQkJZ2V0VGV4dFJhbmdlKGNvbnRleHQpKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgTmFtZWRDb21wb25lbnRTdGVwCi0JCQlleHRlbmRzIFN0ZXAgewotCQkKLQkJcHJvdGVjdGVkIFN0cmluZyBuc1ByZWZpeDsKLQkJCi0JCXByb3RlY3RlZCBTdHJpbmcgbG9jYWxOYW1lOwotCQkKLQkJcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBwcmVkaWNhdGVzOwotCQkKLQkJCi0JCXByb3RlY3RlZCBOYW1lZENvbXBvbmVudFN0ZXAoU3RyaW5nIG5zUHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmdbXSBwcmVkaWNhdGVzKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5uc1ByZWZpeCA9IG5zUHJlZml4OwotCQkJdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0JCQl0aGlzLnByZWRpY2F0ZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5wcmVkaWNhdGVzLCBwcmVkaWNhdGVzKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpZiAodGhpcy5uc1ByZWZpeCAhPSBudWxsKSB7Ci0JCQkJc2IuYXBwZW5kKG5zUHJlZml4KTsKLQkJCQlzYi5hcHBlbmQoQ09MT04pOwotCQkJfQotCQkJc2IuYXBwZW5kKHRoaXMubG9jYWxOYW1lKTsKLQkJCWZvciAoU3RyaW5nIHByZWRpY2F0ZSA6IHRoaXMucHJlZGljYXRlcykgewotCQkJCXNiLmFwcGVuZChPUEVOX0JSQUNLRVQpOwotCQkJCXNiLmFwcGVuZChwcmVkaWNhdGUpOwotCQkJCXNiLmFwcGVuZChDTE9TRV9CUkFDS0VUKTsKLQkJCX0KLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVOYW1lc3BhY2UoQ29udGV4dCBjb250ZXh0KSB7Ci0JCQlKYXhiUGFja2FnZSBwa2cgPSBjb250ZXh0LmdldEpheGJQYWNrYWdlKCk7Ci0JCQlpZiAodGhpcy5uc1ByZWZpeCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuICIiOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSmF4YlBhY2thZ2VJbmZvIHBrZ0luZm8gPSBwa2cuZ2V0UGFja2FnZUluZm8oKTsKLQkJCQlyZXR1cm4gKHBrZ0luZm8gPT0gbnVsbCkgPyBudWxsIDogcGtnSW5mby5nZXROYW1lc3BhY2VGb3JQcmVmaXgodGhpcy5uc1ByZWZpeCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgKLQkJCQlDb250ZXh0IGNvbnRleHQsIFhzZFR5cGVEZWZpbml0aW9uIHByZXZpb3VzVHlwZSwgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJCQotCQkJU3RyaW5nIG5hbWVzcGFjZSA9IHJlc29sdmVOYW1lc3BhY2UoY29udGV4dCk7Ci0JCQkKLQkJCWlmIChuYW1lc3BhY2UgPT0gbnVsbCkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCUVMSmF4YlZhbGlkYXRpb25NZXNzYWdlQnVpbGRlci5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCUVMSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YUEFUSF9fSU5WQUxJRF9OU19QUkVGSVgsCi0JCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHRoaXMubnNQcmVmaXggfSwKLQkJCQkJCQkJY29udGV4dC5nZXRDb250ZXh0T2JqZWN0KCksCi0JCQkJCQkJCWdldFRleHRSYW5nZShjb250ZXh0KSkpOwotCQkJfQotCQkJCi0JCQlYc2RUeXBlRGVmaW5pdGlvbiBuZXh0VHlwZSA9IChwcmV2aW91c1R5cGUgPT0gbnVsbCkgPyBudWxsIDogdmFsaWRhdGVMb2NhbE5hbWUoY29udGV4dCwgcHJldmlvdXNUeXBlLCBuYW1lc3BhY2UsIG1lc3NhZ2VzKTsKLQkJCWlmIChuZXh0VHlwZSAhPSBudWxsKSB7Ci0JCQkJU3RlcCBuZXh0U3RlcCA9IGdldE5leHRTdGVwKCk7Ci0JCQkJaWYgKG5leHRTdGVwICE9IG51bGwpIHsKLQkJCQkJbmV4dFN0ZXAudmFsaWRhdGUoY29udGV4dCwgbmV4dFR5cGUsIG1lc3NhZ2VzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBYc2RUeXBlRGVmaW5pdGlvbiB2YWxpZGF0ZUxvY2FsTmFtZSgKLQkJCQlDb250ZXh0IGNvbnRleHQsIFhzZFR5cGVEZWZpbml0aW9uIHByZXZpb3VzVHlwZSwgU3RyaW5nIG5hbWVzcGFjZSwgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpOwotCQkKLS8vCQlwcm90ZWN0ZWQgYWJzdHJhY3QgVGV4dFJhbmdlIGJ1aWxkTmFtZXNwYWNlUHJlZml4VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgU2VsZlN0ZXAKLQkJCWV4dGVuZHMgU3RlcCB7Ci0JCQotCQlwcm90ZWN0ZWQgU2VsZlN0ZXAoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gU0VMRjsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYc2RUeXBlRGVmaW5pdGlvbgotCQkJCXJlc29sdmVOZXh0VHlwZShDb250ZXh0IGNvbnRleHQsIFhzZFR5cGVEZWZpbml0aW9uIHByZXZpb3VzVHlwZSkgewotCQkJCi0JCQlyZXR1cm4gcHJldmlvdXNUeXBlOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoCi0JCQkJQ29udGV4dCBjb250ZXh0LCBYc2RUeXBlRGVmaW5pdGlvbiBwcmV2aW91c1R5cGUsIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCQkKLQkJCWlmIChnZXRJbmRleCgpICE9IDApIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXIuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWFBBVEhfX1NFTEZfU0VHTUVOVF9NVVNUX0JFX0ZJUlNUX1NFR01FTlQsCi0JCQkJCQkJCWNvbnRleHQuZ2V0Q29udGV4dE9iamVjdCgpLAotCQkJCQkJCQlnZXRUZXh0UmFuZ2UoY29udGV4dCkpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWlmIChnZXROZXh0U3RlcCgpICE9IG51bGwpIHsKLQkJCQlnZXROZXh0U3RlcCgpLnZhbGlkYXRlKGNvbnRleHQsIHByZXZpb3VzVHlwZSwgbWVzc2FnZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIFN0ZXAgewotCQkKLQkJcHJvdGVjdGVkIGludCBnZXRJbmRleCgpIHsKLQkJCXJldHVybiBYUGF0aC50aGlzLmdldEluZGV4KHRoaXMpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgU3RlcCBnZXROZXh0U3RlcCgpIHsKLQkJCXJldHVybiBYUGF0aC50aGlzLmdldE5leHRTdGVwKHRoaXMpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZhbHVlKCk7Ci0JCQotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgWHNkVHlwZURlZmluaXRpb24gcmVzb2x2ZU5leHRUeXBlKENvbnRleHQgY29udGV4dCwgWHNkVHlwZURlZmluaXRpb24gcHJldmlvdXNUeXBlKTsKLQkJCi0JCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENvbXBsZXRpb25Qcm9wb3NhbHMoCi0JCQkJQ29udGV4dCBjb250ZXh0LCBYc2RUeXBlRGVmaW5pdGlvbiBwcmV2aW91c1R5cGUsIAotCQkJCWZpbmFsIFN0cmluZyBwcmVmaXgsIGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJCi0JCQlpZiAoZ2V0VGV4dFJhbmdlKGNvbnRleHQpLmluY2x1ZGVzKHBvcykgfHwgZ2V0TmV4dFN0ZXAoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscygKLQkJCQkJCW5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxTdHJpbmc+KAotCQkJCQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxTdHJpbmcsIFN0cmluZz4oCi0JCQkJCQkJCQkJbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCQkJCQkJCQkJCQlnZXRUZXh0UHJvcG9zYWxzKGNvbnRleHQsIHByZXZpb3VzVHlwZSksCi0JCQkJCQkJCQkJCQlnZXRBdHRyaWJ1dGVQcm9wb3NhbHMoY29udGV4dCwgcHJldmlvdXNUeXBlKSwKLQkJCQkJCQkJCQkJCWdldEVsZW1lbnRQcm9wb3NhbHMoY29udGV4dCwgcHJldmlvdXNUeXBlKSkpIHsKLQkJCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIG8pIHsKLQkJCQkJCQkJCQlyZXR1cm4gU3RyaW5nVG9vbHMuY29uY2F0ZW5hdGUocHJlZml4LCBvKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSwKLQkJCQkJCQkJZmlsdGVyKSk7Ci0JCQl9Ci0JCQkKLQkJCVN0ZXAgbmV4dFN0ZXAgPSBnZXROZXh0U3RlcCgpOwotCQkJWHNkVHlwZURlZmluaXRpb24gbmV4dFR5cGUgPSByZXNvbHZlTmV4dFR5cGUoY29udGV4dCwgcHJldmlvdXNUeXBlKTsKLQkJCWlmIChuZXh0U3RlcCAhPSBudWxsICYmIG5leHRUeXBlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV4dFN0ZXAuZ2V0Q29tcGxldGlvblByb3Bvc2Fscyhjb250ZXh0LCBuZXh0VHlwZSwgcHJlZml4ICsgZ2V0VmFsdWUoKSArIERFTElNLCBwb3MsIGZpbHRlcik7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlKFRFWFQpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRUZXh0UHJvcG9zYWxzKENvbnRleHQgY29udGV4dCwgZmluYWwgWHNkVHlwZURlZmluaXRpb24geHNkVHlwZSkgewotCQkJcmV0dXJuICh4c2RUeXBlLmhhc1RleHRDb250ZW50KCkpID8gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZShURVhUKSA6IEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsJCQkJCQkKLQkJfQotCQkKLQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QXR0cmlidXRlUHJvcG9zYWxzKENvbnRleHQgY29udGV4dCwgZmluYWwgWHNkVHlwZURlZmluaXRpb24geHNkVHlwZSkgewotCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQkJCQluZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJCQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxYbWxOcywgSXRlcmFibGU8U3RyaW5nPj4oZ2V0WG1sTnNJbmZvcyhjb250ZXh0KSkgewotCQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gdHJhbnNmb3JtKGZpbmFsIFhtbE5zIHhtbG5zKSB7Ci0JCQkJCQkJCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8U3RyaW5nLCBTdHJpbmc+KHhzZFR5cGUuZ2V0QXR0cmlidXRlTmFtZXMoeG1sbnMuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0JCQkJCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIG8pIHsKLQkJCQkJCQkJCQkJcmV0dXJuIFhQYXRoLmF0dHJpYnV0ZVhQYXRoKHhtbG5zLmdldFByZWZpeCgpLCBvKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9OwotCQkJCQkJCQl9Ci0JCQkJCQkJfSksCi0JCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFN0cmluZywgU3RyaW5nPih4c2RUeXBlLmdldEF0dHJpYnV0ZU5hbWVzKCIiKSkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShTdHJpbmcgbykgewotCQkJCQkJCXJldHVybiBYUGF0aC5hdHRyaWJ1dGVYUGF0aChudWxsLCBvKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEVsZW1lbnRQcm9wb3NhbHMoQ29udGV4dCBjb250ZXh0LCBmaW5hbCBYc2RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlKSB7Ci0JCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCQkJCW5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQkJCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFhtbE5zLCBJdGVyYWJsZTxTdHJpbmc+PihnZXRYbWxOc0luZm9zKGNvbnRleHQpKSB7Ci0JCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiB0cmFuc2Zvcm0oZmluYWwgWG1sTnMgeG1sbnMpIHsKLQkJCQkJCQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxTdHJpbmcsIFN0cmluZz4oeHNkVHlwZS5nZXRFbGVtZW50TmFtZXMoeG1sbnMuZ2V0TmFtZXNwYWNlVVJJKCksIGZhbHNlKSkgewotCQkJCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBvKSB7Ci0JCQkJCQkJCQkJCXJldHVybiBYUGF0aC5lbGVtZW50WFBhdGgoeG1sbnMuZ2V0UHJlZml4KCksIG8pOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX07Ci0JCQkJCQkJCX0KLQkJCQkJCQl9KSwKLQkJCQkJeHNkVHlwZS5nZXRFbGVtZW50TmFtZXMoIiIsIGZhbHNlKSk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBJdGVyYWJsZTxYbWxOcz4gZ2V0WG1sTnNJbmZvcyhDb250ZXh0IGNvbnRleHQpIHsKLQkJCUpheGJQYWNrYWdlSW5mbyBwa2dJbmZvID0gY29udGV4dC5nZXRKYXhiUGFja2FnZSgpLmdldFBhY2thZ2VJbmZvKCk7Ci0JCQlYbWxTY2hlbWEgeG1sU2NoZW1hID0gKHBrZ0luZm8gPT0gbnVsbCkgPyBudWxsIDogcGtnSW5mby5nZXRYbWxTY2hlbWEoKTsKLQkJCXJldHVybiAoeG1sU2NoZW1hID09IG51bGwpID8gRW1wdHlJdGVyYWJsZS48WG1sTnM+aW5zdGFuY2UoKSA6IHhtbFNjaGVtYS5nZXRYbWxOc1ByZWZpeGVzKCk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKENvbnRleHQgY29udGV4dCwgWHNkVHlwZURlZmluaXRpb24gcHJldmlvdXNUeXBlLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQkJLy8gbm8gb3AKLQkJfQotCQkKLQkJcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQ29udGV4dCBjb250ZXh0KSB7Ci0JCQlyZXR1cm4gWFBhdGgudGhpcy5idWlsZFRleHRSYW5nZShjb250ZXh0LCB0aGlzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBUZXh0U3RlcAotCQkJZXh0ZW5kcyBTdGVwIHsKLQkJCi0JCXByb3RlY3RlZCBUZXh0U3RlcCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJcmV0dXJuIFRFWFQ7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWHNkVHlwZURlZmluaXRpb24KLQkJCQlyZXNvbHZlTmV4dFR5cGUoQ29udGV4dCBjb250ZXh0LCBYc2RUeXBlRGVmaW5pdGlvbiBwcmV2aW91c1R5cGUpIHsKLQkJCQotCQkJcmV0dXJuIHByZXZpb3VzVHlwZTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKAotCQkJCUNvbnRleHQgY29udGV4dCwgWHNkVHlwZURlZmluaXRpb24gcHJldmlvdXNUeXBlLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQkJCi0JCQlpZiAoZ2V0TmV4dFN0ZXAoKSAhPSBudWxsKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VCdWlsZGVyLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhQQVRIX19URVhUX1NFR01FTlRfTVVTVF9CRV9MQVNUX1NFR01FTlQsCi0JCQkJCQkJCWNvbnRleHQuZ2V0Q29udGV4dE9iamVjdCgpLAotCQkJCQkJCQlnZXRUZXh0UmFuZ2UoY29udGV4dCkpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgaW50ZXJmYWNlIENvbnRleHQgewotCQkKLQkJSmF4Yk5vZGUgZ2V0Q29udGV4dE9iamVjdCgpOwotCQkKLQkJSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoKTsKLQkJCi0JCVRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3hwYXRoL2phdmEvWFBhdGhGYWN0b3J5LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3hwYXRoL2phdmEvWFBhdGhGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Mjk3ZmQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC94cGF0aC9qYXZhL1hQYXRoRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQueHBhdGguamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBYUGF0aEZhY3RvcnkgewotCQotCXByaXZhdGUgc3RhdGljIFhQYXRoRmFjdG9yeSBJTlNUQU5DRTsKLQkKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFhQYXRoPiB4cGF0aHM7Ci0JCi0JCi0JcHJpdmF0ZSBYUGF0aEZhY3RvcnkoKSB7Ci0JCXRoaXMueHBhdGhzID0gbmV3IFdlYWtIYXNoTWFwPFN0cmluZywgWFBhdGg+KCk7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgWFBhdGhGYWN0b3J5IGluc3RhbmNlKCkgewotCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJSU5TVEFOQ0UgPSBuZXcgWFBhdGhGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQlwdWJsaWMgWFBhdGggZ2V0WHBhdGgoU3RyaW5nIHhwYXRoU3RyaW5nKSB7Ci0JCVhQYXRoIHhwYXRoID0gdGhpcy54cGF0aHMuZ2V0KHhwYXRoU3RyaW5nKTsKLQkJaWYgKHhwYXRoID09IG51bGwpIHsKLQkJCXhwYXRoID0gYnVpbGRYcGF0aCh4cGF0aFN0cmluZyk7Ci0JCQl0aGlzLnhwYXRocy5wdXQoeHBhdGhTdHJpbmcsIHhwYXRoKTsKLQkJfQotCQlyZXR1cm4geHBhdGg7Ci0JfQotCQotCXByaXZhdGUgWFBhdGggYnVpbGRYcGF0aChTdHJpbmcgeHBhdGhTdHJpbmcpIHsKLQkJcmV0dXJuIG5ldyBYUGF0aCh4cGF0aFN0cmluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvbGlidmFsL0VMSmF4YlVzZXJMaWJyYXJ5VmFsaWRhdG9yLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9saWJ2YWwvRUxKYXhiVXNlckxpYnJhcnlWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU2YzM2ZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9saWJ2YWwvRUxKYXhiVXNlckxpYnJhcnlWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5saWJ2YWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwubGlidmFsLkxpYlZhbFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnByb3YuSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlidmFsLkxpYnJhcnlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdENvbW1vbkVjbGlwc2VMaW5rQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5saWJ2YWwuRWNsaXBzZUxpbmtMaWJWYWxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwubGlicHJvdi5KYXhiVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLkVMSmF4YlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci0KLQotLyoqCi0gKiBMaWJyYXJ5IHZhbGlkYXRvciBmb3IgRWNsaXBzZUxpbmsgSkFYQiB1c2VyIGxpYnJhcmllcy4KLSAqIAotICogSW4gb3JkZXIgdG8gdmFsaWRhdGUgdGhhdCB0aGUgY29ycmVjdCBlY2xpcHNlbGluay5qYXIgaXMgcHJlc2VudCBpbiB0aGUgdXNlciBsaWJyYXJ5LCB0aGUgdmVyc2lvbgotICogY2xhc3Mgd2hpY2ggYXBwZWFycyBpbiBzdGFuZGFyZCBFY2xpcHNlTGluayBsaWJyYXJpZXMgd2lsbCBiZSBleGFtaW5lZCBhbmQgY29tcGFyZWQgYWdhaW5zdCB0aGUKLSAqIHVuaW9uIG9mIGNhbGN1bGF0ZWQgdmVyc2lvbiByYW5nZXMsIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0gc3BlY2lmaWVkIGluIHRoZSBjb25maWcuCi0gKi8KLXB1YmxpYyBjbGFzcyBFTEpheGJVc2VyTGlicmFyeVZhbGlkYXRvcgotCQlpbXBsZW1lbnRzIExpYnJhcnlWYWxpZGF0b3IgewotCQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKEpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY29uZmlnKSB7Ci0JCUpheGJVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBqYXhiQ29uZmlnIAotCQkJCT0gKEpheGJVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZykgY29uZmlnOwotCQlKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBwbGF0Zm9ybSA9IGpheGJDb25maWcuZ2V0SmF4YlBsYXRmb3JtKCk7Ci0JCVNldDxWZXJzaW9uUmFuZ2U+IHZlcnNpb25SYW5nZXMgPSBuZXcgSGFzaFNldDxWZXJzaW9uUmFuZ2U+KCk7Ci0JCQotCQlpZiAoRUxKYXhiUGxhdGZvcm0uVkVSU0lPTl8yXzEuZXF1YWxzKHBsYXRmb3JtKSkgewotCQkJdmVyc2lvblJhbmdlcy5hZGQobmV3IFZlcnNpb25SYW5nZSgiWzIuMSwgMy4wKSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKEVMSmF4YlBsYXRmb3JtLlZFUlNJT05fMl8yLmVxdWFscyhwbGF0Zm9ybSkpIHsKLQkJCXZlcnNpb25SYW5nZXMuYWRkKG5ldyBWZXJzaW9uUmFuZ2UoIlsyLjIsIDMuMCkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChFTEpheGJQbGF0Zm9ybS5WRVJTSU9OXzJfMy5lcXVhbHMocGxhdGZvcm0pKSB7Ci0JCQl2ZXJzaW9uUmFuZ2VzLmFkZChuZXcgVmVyc2lvblJhbmdlKCJbMi4zLCAzLjApIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoRUxKYXhiUGxhdGZvcm0uVkVSU0lPTl8yXzQuZXF1YWxzKHBsYXRmb3JtKSkgewotCQkJdmVyc2lvblJhbmdlcy5hZGQobmV3IFZlcnNpb25SYW5nZSgiWzIuNCwgMy4wKSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlJU3RhdHVzIHN0YXR1cyA9IEVjbGlwc2VMaW5rTGliVmFsVXRpbC52YWxpZGF0ZShqYXhiQ29uZmlnLnJlc29sdmUoKSwgdmVyc2lvblJhbmdlcyk7Ci0JCQotCQlpZiAoISBzdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCQotCQkvLyBmaW5hbGx5IGxvb2sgZm9yIHhqYyBjbGFzc2VzCi0JCQotCQlTZXQ8U3RyaW5nPiBjbGFzc05hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQkKLQkJY2xhc3NOYW1lcy5hZGQoImNvbS5zdW4udG9vbHMueGpjLlhKQ0ZhY2FkZSIpOyAvLyROT04tTkxTLTEkCi0JCWNsYXNzTmFtZXMuYWRkKCJjb20uc3VuLnhtbC5iaW5kLlV0aWwiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSXRlcmFibGU8SVBhdGg+IGxpYnJhcnlQYXRocyA9IAotCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPElDbGFzc3BhdGhFbnRyeSwgSVBhdGg+KGpheGJDb25maWcucmVzb2x2ZSgpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSVBhdGggdHJhbnNmb3JtKElDbGFzc3BhdGhFbnRyeSBvKSB7Ci0JCQkJCQlyZXR1cm4gby5nZXRQYXRoKCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkKLQkJc3RhdHVzID0gTGliVmFsVXRpbC52YWxpZGF0ZShsaWJyYXJ5UGF0aHMsIGNsYXNzTmFtZXMpOwotCQkKLQkJaWYgKCEgc3RhdHVzLmlzT0soKSkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBKcHRKYXhiQ29yZVBsdWdpbi5QTFVHSU5fSUQsIEpwdENvbW1vbkVjbGlwc2VMaW5rQ29yZU1lc3NhZ2VzLkVMSmF4YlVzZXJMaWJyYXJ5VmFsaWRhdG9yX25vWGpjQ2xhc3Nlcyk7Ci0JCX0KLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQ0RBVEFBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxDREFUQUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YzgyN2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxDREFUQUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbENEQVRBQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVhtbENEQVRBQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxDREFUQUFubm90YXRpb25EZWZpbml0aW9uIAotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxDREFUQUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sQ0RBVEFBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVMSmF4Yi5YTUxfQ0RBVEE7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlWG1sQ0RBVEFBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbENEQVRBQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxEaXNjcmltaW5hdG9yTm9kZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMWQwNjYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxEaXNjcmltaW5hdG9yTm9kZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxEaXNjcmltaW5hdG9yTm9kZUFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxEaXNjcmltaW5hdG9yTm9kZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9ESVNDUklNSU5BVE9SX05PREU7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlWG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyYjIyMy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci0KLQotcHVibGljIGNsYXNzIFhtbERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFTEpheGIuWE1MX0RJU0NSSU1JTkFUT1JfVkFMVUU7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNWQxOWUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5WG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbkRlZmluaXRpb24KLQkJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9JTlZFUlNFX1JFRkVSRU5DRTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSm9pbk5vZGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxKb2luTm9kZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NjRkYjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxKb2luTm9kZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlYbWxKb2luTm9kZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxKb2luTm9kZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sSm9pbk5vZGVBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgWG1sSm9pbk5vZGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQlwcml2YXRlIFhtbEpvaW5Ob2RlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVMSmF4Yi5YTUxfSk9JTl9OT0RFOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9KT0lOX05PREVTOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9KT0lOX05PREVTX19WQUxVRTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBTb3VyY2VYbWxKb2luTm9kZUFubm90YXRpb24uYnVpbGRTb3VyY2VYbWxKb2luTm9kZUFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZUFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxKb2luTm9kZUFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEpvaW5Ob2Rlc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEpvaW5Ob2Rlc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNjMzNDMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxKb2luTm9kZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5TmFtZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VOYW1lZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci0KLQotcHVibGljIGNsYXNzIFhtbEpvaW5Ob2Rlc0Fubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbEpvaW5Ob2Rlc0Fubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sSm9pbk5vZGVzQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFTEpheGIuWE1MX0pPSU5fTk9ERVM7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlTmFtZWRBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeU5hbWVkQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24sIGdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sS2V5QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sS2V5QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY2ZmI3MS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEtleUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbEtleUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxLZXlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci0KLQotcHVibGljIGNsYXNzIFhtbEtleUFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbEtleUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sS2V5QW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFTEpheGIuWE1MX0tFWTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxLZXlBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbEtleUFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFBhdGhBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxQYXRoQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM2NTkzYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFBhdGhBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5WG1sUGF0aEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxQYXRoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxQYXRoQW5ub3RhdGlvbkRlZmluaXRpb24KLQkJaW1wbGVtZW50cyBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbFBhdGhBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQlwcml2YXRlIFhtbFBhdGhBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9QQVRIOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9QQVRIUzsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVMSmF4Yi5YTUxfUEFUSF9fVkFMVUU7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZUFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIGludCBpbmRleCkgewotCQlyZXR1cm4gU291cmNlWG1sUGF0aEFubm90YXRpb24uYnVpbGRTb3VyY2VYbWxQYXRoQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGluZGV4KTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbFBhdGhBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFBhdGhzQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sUGF0aHNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWVkNzRkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sUGF0aHNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5TmFtZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VOYW1lZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci0KLQotcHVibGljIGNsYXNzIFhtbFBhdGhzQW5ub3RhdGlvbkRlZmluaXRpb24KLQkJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgWG1sUGF0aHNBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFhtbFBhdGhzQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFTEpheGIuWE1MX1BBVEhTOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZU5hbWVkQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlOYW1lZEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uLCBnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGUyMTlmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlYbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVMSmF4Yi5YTUxfVFJBTlNGT1JNQVRJT047Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbENEQVRBQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sQ0RBVEFBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NjU1YzUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sQ0RBVEFBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbENEQVRBQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQmluYXJ5WG1sQ0RBVEFBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbENEQVRBQW5ub3RhdGlvbiB7Ci0JCi0JcHVibGljIEJpbmFyeVhtbENEQVRBQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9DREFUQTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikge30KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZTU3NmYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQmluYXJ5WG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbiB7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0JCi0JCi0JcHVibGljIEJpbmFyeVhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnZhbHVlID0gYnVpbGRWYWx1ZSgpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9ESVNDUklNSU5BVE9SX05PREU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXNldFZhbHVlXyhidWlsZFZhbHVlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsdWUgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFTEpheGIuWE1MX0RJU0NSSU1JTkFUT1JfTk9ERV9fVkFMVUUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjQ0YWYyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQmluYXJ5WG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbgotCQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQkJaW1wbGVtZW50cyBYbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIHsKLQkKLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQkKLQkKLQlwdWJsaWMgQmluYXJ5WG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnZhbHVlID0gYnVpbGRWYWx1ZSgpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9ESVNDUklNSU5BVE9SX1ZBTFVFOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQlzZXRWYWx1ZV8oYnVpbGRWYWx1ZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbHVlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRUxKYXhiLlhNTF9ESVNDUklNSU5BVE9SX1ZBTFVFX19WQUxVRSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHZhbHVlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJhNjAwYi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQmluYXJ5WG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24KLQkJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JCWltcGxlbWVudHMgWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24gewotCQotCXByaXZhdGUgU3RyaW5nIG1hcHBlZEJ5OwotCQotCQotCXB1YmxpYyBCaW5hcnlYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLm1hcHBlZEJ5ID0gYnVpbGRNYXBwZWRCeSgpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9JTlZFUlNFX1JFRkVSRU5DRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJc2V0TWFwcGVkQnlfKGJ1aWxkTWFwcGVkQnkoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubWFwcGVkQnkpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBtYXBwZWRCeSAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgbWFwcGVkQnkpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRNYXBwZWRCeV8oU3RyaW5nIG1hcHBlZEJ5KSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm1hcHBlZEJ5OwotCQl0aGlzLm1hcHBlZEJ5ID0gbWFwcGVkQnk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBQRURfQllfUFJPUEVSVFksIG9sZCwgbWFwcGVkQnkpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFTEpheGIuWE1MX0lOVkVSU0VfUkVGRVJFTkNFX19NQVBQRURfQlkpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBtYXBwZWRCeVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sSm9pbk5vZGVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxKb2luTm9kZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI1NDk3Yi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxKb2luTm9kZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEpvaW5Ob2RlQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQmluYXJ5WG1sSm9pbk5vZGVBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbEpvaW5Ob2RlQW5ub3RhdGlvbiB7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgeG1sUGF0aDsKLQkKLQlwcml2YXRlIFN0cmluZyByZWZlcmVuY2VkWG1sUGF0aDsKLQkKLQkKLQlwdWJsaWMgQmluYXJ5WG1sSm9pbk5vZGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMueG1sUGF0aCA9IGJ1aWxkWG1sUGF0aCgpOwotCQl0aGlzLnJlZmVyZW5jZWRYbWxQYXRoID0gYnVpbGRSZWZlcmVuY2VkWG1sUGF0aCgpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9KT0lOX05PREU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXNldFhtbFBhdGhfKGJ1aWxkWG1sUGF0aCgpKTsKLQkJc2V0UmVmZXJlbmNlZFhtbFBhdGhfKGJ1aWxkUmVmZXJlbmNlZFhtbFBhdGgoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMueG1sUGF0aCArICIgLT4gIiArIHRoaXMucmVmZXJlbmNlZFhtbFBhdGgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB4bWxQYXRoICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRYbWxQYXRoKCkgewotCQlyZXR1cm4gdGhpcy54bWxQYXRoOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRYbWxQYXRoKFN0cmluZyB4bWxQYXRoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0WG1sUGF0aF8oU3RyaW5nIHhtbFBhdGgpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMueG1sUGF0aDsKLQkJdGhpcy54bWxQYXRoID0geG1sUGF0aDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9QQVRIX1BST1BFUlRZLCBvbGQsIHhtbFBhdGgpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZFhtbFBhdGgoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVMSmF4Yi5YTUxfSk9JTl9OT0RFX19YTUxfUEFUSCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0WG1sUGF0aFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4geG1sUGF0aFRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHhtbFBhdGggKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRYbWxQYXRoKCkgewotCQlyZXR1cm4gdGhpcy5yZWZlcmVuY2VkWG1sUGF0aDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZFhtbFBhdGgoU3RyaW5nIHJlZmVyZW5jZWRYbWxQYXRoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0UmVmZXJlbmNlZFhtbFBhdGhfKFN0cmluZyByZWZlcmVuY2VkWG1sUGF0aCkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5yZWZlcmVuY2VkWG1sUGF0aDsKLQkJdGhpcy5yZWZlcmVuY2VkWG1sUGF0aCA9IHJlZmVyZW5jZWRYbWxQYXRoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVGRVJFTkNFRF9YTUxfUEFUSF9QUk9QRVJUWSwgb2xkLCByZWZlcmVuY2VkWG1sUGF0aCk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkUmVmZXJlbmNlZFhtbFBhdGgoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVMSmF4Yi5YTUxfSk9JTl9OT0RFX19SRUZFUkVOQ0VEX1hNTF9QQVRIKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkWG1sUGF0aFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVmZXJlbmNlZFhtbFBhdGhUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEtleUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEtleUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiOTg5Ny4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxLZXlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEtleUFubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIEJpbmFyeVhtbEtleUFubm90YXRpb24KLQkJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JCWltcGxlbWVudHMgWG1sS2V5QW5ub3RhdGlvbiB7Ci0KLQlwdWJsaWMgQmluYXJ5WG1sS2V5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9LRVk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHt9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxQYXRoQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sUGF0aEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFlNWY4NS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxQYXRoQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxQYXRoQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQmluYXJ5WG1sUGF0aEFubm90YXRpb24KLQkJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JCWltcGxlbWVudHMgWG1sUGF0aEFubm90YXRpb24gewotCQotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCQotCQotCXB1YmxpYyBCaW5hcnlYbWxQYXRoQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnZhbHVlID0gYnVpbGRWYWx1ZSgpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9QQVRIOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQlzZXRWYWx1ZV8oYnVpbGRWYWx1ZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbHVlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRUxKYXhiLlhNTF9QQVRIX19WQUxVRSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHZhbHVlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjlkMGU2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIEJpbmFyeVhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbgotCQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQkJaW1wbGVtZW50cyBYbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24gewotCQotCXByaXZhdGUgQm9vbGVhbiBvcHRpb25hbDsKLQkKLQkKLQlwdWJsaWMgQmluYXJ5WG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMub3B0aW9uYWwgPSBidWlsZE9wdGlvbmFsKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFTEpheGIuWE1MX1RSQU5TRk9STUFUSU9OOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQlzZXRPcHRpb25hbF8oYnVpbGRPcHRpb25hbCgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5vcHRpb25hbCk7Ci0JfQotCQotCQotCS8vICoqKioqIG9wdGlvbmFsIAotCQotCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25hbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBvcHRpb25hbCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldE9wdGlvbmFsXyhCb29sZWFuIG9wdGlvbmFsKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5vcHRpb25hbDsKLQkJdGhpcy5vcHRpb25hbCA9IG9wdGlvbmFsOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT1BUSU9OQUxfUFJPUEVSVFksIG9sZCwgb3B0aW9uYWwpOwotCX0KLQkKLQlwcml2YXRlIEJvb2xlYW4gYnVpbGRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVMSmF4Yi5YTUxfVFJBTlNGT1JNQVRJT05fX09QVElPTkFMKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRPcHRpb25hbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxDREFUQUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbENEQVRBQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDhlMWVkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbENEQVRBQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbENEQVRBQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgU291cmNlWG1sQ0RBVEFBbm5vdGF0aW9uCi0JCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbENEQVRBQW5ub3RhdGlvbiB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEVMSmF4Yi5YTUxfQ0RBVEEpOwotCQotCQotCXB1YmxpYyBTb3VyY2VYbWxDREFUQUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUikpOwotCX0KLQkKLQlwdWJsaWMgU291cmNlWG1sQ0RBVEFBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9DREFUQTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkge30KLQkKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHt9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikge30KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4N2UzOTIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgU291cmNlWG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uCi0JCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbiB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IAotCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRUxKYXhiLlhNTF9ESVNDUklNSU5BVE9SX05PREUpOwotCQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQkKLQkKLQlwdWJsaWMgU291cmNlWG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcyhwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcihlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpKTsKLQl9Ci0KLQlwdWJsaWMgU291cmNlWG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLnZhbHVlRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGRWYWx1ZUFkYXB0ZXIoZGFhKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLnZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsIEVMSmF4Yi5YTUxfRElTQ1JJTUlOQVRPUl9OT0RFX19WQUxVRSwgU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKAotCQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gY29udmVydGVyKSB7Ci0JCQotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgY29udmVydGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcigKLQkJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSkgewotCQkKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVMSmF4Yi5YTUxfRElTQ1JJTUlOQVRPUl9OT0RFOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSBidWlsZFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3luY1ZhbHVlKGJ1aWxkVmFsdWUoYXN0Um9vdCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsdWUgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3luY1ZhbHVlKFN0cmluZyBhc3RWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IGFzdFZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgYXN0VmFsdWUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMudmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKHRoaXMudmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yjc1ZDNjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgU291cmNlWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbgotCQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQkJaW1wbGVtZW50cyBYbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gCi0JCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihFTEpheGIuWE1MX0RJU0NSSU1JTkFUT1JfVkFMVUUpOwotCQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQkKLQkKLQlwdWJsaWMgU291cmNlWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMocGFyZW50LCBlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIoZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKSk7Ci0JfQotCi0JcHVibGljIFNvdXJjZVhtbERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMudmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZFZhbHVlQWRhcHRlcihkYWEpOwotCQl0aGlzLnZhbHVlQWRhcHRlciA9IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMudmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQkKLQkKLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRWYWx1ZUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgRUxKYXhiLlhNTF9ESVNDUklNSU5BVE9SX1ZBTFVFX19WQUxVRSwgU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKAotCQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gY29udmVydGVyKSB7Ci0JCQotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgY29udmVydGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcigKLQkJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSkgewotCQkKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVMSmF4Yi5YTUxfRElTQ1JJTUlOQVRPUl9WQUxVRTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbHVlID0gYnVpbGRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN5bmNWYWx1ZShidWlsZFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbHVlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy52YWx1ZSwgdmFsdWUpKSB7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCQl0aGlzLnZhbHVlQWRhcHRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZShTdHJpbmcgYXN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnZhbHVlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdmFsdWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBlbGVtZW50VG91Y2hlcyh0aGlzLnZhbHVlRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDVlYjRlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBTb3VyY2VYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbgotCQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQkJaW1wbGVtZW50cyBYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbiB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEVMSmF4Yi5YTUxfSU5WRVJTRV9SRUZFUkVOQ0UpOwotCQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBtYXBwZWRCeURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG1hcHBlZEJ5QWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBtYXBwZWRCeTsKLQkKLQkKLQlwdWJsaWMgU291cmNlWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUikpOwotCX0KLQotCXB1YmxpYyBTb3VyY2VYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSwgQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQkJdGhpcy5tYXBwZWRCeURlY2xhcmF0aW9uQWRhcHRlciA9IGJ1aWxkTWFwcGVkQnlEZWNsYXJhdGlvbkFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5tYXBwZWRCeUFkYXB0ZXIgPSBidWlsZE1hcHBlZEJ5QWRhcHRlcih0aGlzLm1hcHBlZEJ5RGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTWFwcGVkQnlEZWNsYXJhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsIEVMSmF4Yi5YTUxfSU5WRVJTRV9SRUZFUkVOQ0VfX01BUFBFRF9CWSwgU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE1hcHBlZEJ5QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVMSmF4Yi5YTUxfSU5WRVJTRV9SRUZFUkVOQ0U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5tYXBwZWRCeSA9IGJ1aWxkTWFwcGVkQnkoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNNYXBwZWRCeShidWlsZE1hcHBlZEJ5KGFzdFJvb3QpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5tYXBwZWRCeSk7Ci0JfQotCQotCQotCS8vICoqKioqIG1hcHBlZEJ5ICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGVkQnk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBtYXBwZWRCeSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMubWFwcGVkQnksIG1hcHBlZEJ5KSkgewotCQkJdGhpcy5tYXBwZWRCeSA9IG1hcHBlZEJ5OwotCQkJdGhpcy5tYXBwZWRCeUFkYXB0ZXIuc2V0VmFsdWUobWFwcGVkQnkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jTWFwcGVkQnkoU3RyaW5nIGFzdE1hcHBlZEJ5KSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm1hcHBlZEJ5OwotCQl0aGlzLm1hcHBlZEJ5ID0gYXN0TWFwcGVkQnk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBQRURfQllfUFJPUEVSVFksIG9sZCwgdGhpcy5tYXBwZWRCeSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTWFwcGVkQnkoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGVkQnlBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5tYXBwZWRCeURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG1hcHBlZEJ5VG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZWxlbWVudFRvdWNoZXModGhpcy5tYXBwZWRCeURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxKb2luTm9kZUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEpvaW5Ob2RlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDEyNjhhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEpvaW5Ob2RlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxKb2luTm9kZUFubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIFNvdXJjZVhtbEpvaW5Ob2RlQW5ub3RhdGlvbgotCQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQkJaW1wbGVtZW50cyBYbWxKb2luTm9kZUFubm90YXRpb24gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSAKLQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEVMSmF4Yi5YTUxfSk9JTl9OT0RFKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgQ09OVEFJTkVSX0RFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IAotCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRUxKYXhiLlhNTF9KT0lOX05PREVTKTsKLQkKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4geG1sUGF0aERlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHhtbFBhdGhBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHhtbFBhdGg7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHJlZmVyZW5jZWRYbWxQYXRoRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gcmVmZXJlbmNlZFhtbFBhdGhBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHJlZmVyZW5jZWRYbWxQYXRoOwotCQotCQotCXB1YmxpYyBzdGF0aWMgU291cmNlWG1sSm9pbk5vZGVBbm5vdGF0aW9uIGJ1aWxkU291cmNlWG1sSm9pbk5vZGVBbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gYnVpbGRYbWxKb2luTm9kZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW5kZXgpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gYnVpbGRYbWxKb2luTm9kZUFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIGlkYWEpOwotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbEpvaW5Ob2RlQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGlkYWEsIGlhYSk7Ci0JfQotCQotCQotCXByaXZhdGUgU291cmNlWG1sSm9pbk5vZGVBbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsCi0JCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsCi0JCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJCi0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMueG1sUGF0aERlY2xhcmF0aW9uQWRhcHRlciA9IGJ1aWxkWG1sUGF0aEFkYXB0ZXIoZGFhKTsKLQkJdGhpcy54bWxQYXRoQWRhcHRlciA9IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMueG1sUGF0aERlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMucmVmZXJlbmNlZFhtbFBhdGhEZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZFJlZmVyZW5jZWRYbWxQYXRoQWRhcHRlcihkYWEpOwotCQl0aGlzLnJlZmVyZW5jZWRYbWxQYXRoQWRhcHRlciA9IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMucmVmZXJlbmNlZFhtbFBhdGhEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQkKLQkKLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRYbWxQYXRoQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCBFTEpheGIuWE1MX0pPSU5fTk9ERV9fWE1MX1BBVEgsIFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFJlZmVyZW5jZWRYbWxQYXRoQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCBFTEpheGIuWE1MX0pPSU5fTk9ERV9fUkVGRVJFTkNFRF9YTUxfUEFUSCwgU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKAotCQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gY29udmVydGVyKSB7Ci0JCQotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgY29udmVydGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcigKLQkJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSkgewotCQkKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVMSmF4Yi5YTUxfSk9JTl9OT0RFOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMueG1sUGF0aCA9IGJ1aWxkWG1sUGF0aChhc3RSb290KTsKLQkJdGhpcy5yZWZlcmVuY2VkWG1sUGF0aCA9IGJ1aWxkUmVmZXJlbmNlZFhtbFBhdGgoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzeW5jWG1sUGF0aChidWlsZFhtbFBhdGgoYXN0Um9vdCkpOwotCQlzeW5jUmVmZXJlbmNlZFhtbFBhdGgoYnVpbGRSZWZlcmVuY2VkWG1sUGF0aChhc3RSb290KSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMueG1sUGF0aCArICIgLT4gIiArIHRoaXMucmVmZXJlbmNlZFhtbFBhdGgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB4bWxQYXRoICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRYbWxQYXRoKCkgewotCQlyZXR1cm4gdGhpcy54bWxQYXRoOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRYbWxQYXRoKFN0cmluZyB4bWxQYXRoKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnhtbFBhdGgsIHhtbFBhdGgpKSB7Ci0JCQl0aGlzLnhtbFBhdGggPSB4bWxQYXRoOwotCQkJdGhpcy54bWxQYXRoQWRhcHRlci5zZXRWYWx1ZSh4bWxQYXRoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3luY1htbFBhdGgoU3RyaW5nIGFzdFhtbFBhdGgpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMueG1sUGF0aDsKLQkJdGhpcy54bWxQYXRoID0gYXN0WG1sUGF0aDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9QQVRIX1BST1BFUlRZLCBvbGQsIGFzdFhtbFBhdGgpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZFhtbFBhdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMueG1sUGF0aEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0WG1sUGF0aFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMueG1sUGF0aERlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHhtbFBhdGhUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBlbGVtZW50VG91Y2hlcyh0aGlzLnhtbFBhdGhEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCQotCQotCS8vICoqKioqIHJlZmVyZW5jZWRYbWxQYXRoICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkWG1sUGF0aCgpIHsKLQkJcmV0dXJuIHRoaXMucmVmZXJlbmNlZFhtbFBhdGg7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRYbWxQYXRoKFN0cmluZyByZWZlcmVuY2VkWG1sUGF0aCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5yZWZlcmVuY2VkWG1sUGF0aCwgcmVmZXJlbmNlZFhtbFBhdGgpKSB7Ci0JCQl0aGlzLnJlZmVyZW5jZWRYbWxQYXRoID0gcmVmZXJlbmNlZFhtbFBhdGg7Ci0JCQl0aGlzLnJlZmVyZW5jZWRYbWxQYXRoQWRhcHRlci5zZXRWYWx1ZShyZWZlcmVuY2VkWG1sUGF0aCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNSZWZlcmVuY2VkWG1sUGF0aChTdHJpbmcgYXN0UmVmZXJlbmNlZFhtbFBhdGgpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucmVmZXJlbmNlZFhtbFBhdGg7Ci0JCXRoaXMucmVmZXJlbmNlZFhtbFBhdGggPSBhc3RSZWZlcmVuY2VkWG1sUGF0aDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFRkVSRU5DRURfWE1MX1BBVEhfUFJPUEVSVFksIG9sZCwgYXN0UmVmZXJlbmNlZFhtbFBhdGgpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZFJlZmVyZW5jZWRYbWxQYXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnJlZmVyZW5jZWRYbWxQYXRoQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkWG1sUGF0aFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMucmVmZXJlbmNlZFhtbFBhdGhEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiByZWZlcmVuY2VkWG1sUGF0aFRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKHRoaXMucmVmZXJlbmNlZFhtbFBhdGhEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCQotCQotCS8vICoqKioqIE5lc3RhYmxlQW5ub3RhdGlvbiBpbXBsICoqKioqCi0JCi0JLyoqCi0JICogY29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kIGZyb20gTmVzdGFibGVBbm5vdGF0aW9uIGludGVyZmFjZQotCSAqIGZvciBzdWJjbGFzc2VzCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4KSB7Ci0JCXRoaXMuZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkubW92ZUFubm90YXRpb24obmV3SW5kZXgpOwotCX0KLQkKLQlwcml2YXRlIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBnZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiAoSW5kZXhlZEFubm90YXRpb25BZGFwdGVyKSB0aGlzLmFubm90YXRpb25BZGFwdGVyOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBidWlsZFhtbEpvaW5Ob2RlQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJCi0JCXJldHVybiBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihhbm5vdGF0ZWRFbGVtZW50LCBpZGFhKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRYbWxKb2luTm9kZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4KSB7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSAKLQkJCQluZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkJREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLAotCQkJCQlDT05UQUlORVJfREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLAotCQkJCQlpbmRleCwKLQkJCQkJRUxKYXhiLlhNTF9KT0lOX05PREUpOwotCQlyZXR1cm4gaWRhYTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxLZXlBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxLZXlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YWUwYWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sS2V5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEtleUFubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIFNvdXJjZVhtbEtleUFubm90YXRpb24KLQkJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JCWltcGxlbWVudHMgWG1sS2V5QW5ub3RhdGlvbiB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRUxKYXhiLlhNTF9LRVkpOwotCQotCQotCXB1YmxpYyBTb3VyY2VYbWxLZXlBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcyhwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcihlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpKTsKLQl9Ci0JCi0JcHVibGljIFNvdXJjZVhtbEtleUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFTEpheGIuWE1MX0tFWTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkge30KLQkKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHt9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikge30KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbFBhdGhBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxQYXRoQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzY5MGJkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbFBhdGhBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFBhdGhBbm5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBTb3VyY2VYbWxQYXRoQW5ub3RhdGlvbgotCQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQkJaW1wbGVtZW50cyBYbWxQYXRoQW5ub3RhdGlvbiB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IAotCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRUxKYXhiLlhNTF9QQVRIKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgQ09OVEFJTkVSX0RFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IAotCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRUxKYXhiLlhNTF9QQVRIUyk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCQotCQotCXB1YmxpYyBzdGF0aWMgU291cmNlWG1sUGF0aEFubm90YXRpb24gYnVpbGRTb3VyY2VYbWxQYXRoQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIGludCBpbmRleCkgewotCQkKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IGJ1aWxkWG1sUGF0aERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW5kZXgpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gYnVpbGRYbWxQYXRoQW5ub3RhdGlvbkFkYXB0ZXIoYW5ub3RhdGVkRWxlbWVudCwgaWRhYSk7Ci0JCXJldHVybiBuZXcgU291cmNlWG1sUGF0aEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBpZGFhLCBpYWEpOwotCX0KLQkKLQkKLQlwcml2YXRlIFNvdXJjZVhtbFBhdGhBbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsCi0JCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsCi0JCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJCi0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMudmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZFZhbHVlQWRhcHRlcihkYWEpOwotCQl0aGlzLnZhbHVlQWRhcHRlciA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy52YWx1ZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCQotCQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFZhbHVlQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCBFTEpheGIuWE1MX1BBVEhfX1ZBTFVFLCBTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoCi0JCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBjb252ZXJ0ZXIpIHsKLQkJCi0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBjb252ZXJ0ZXIpOwotCX0KLQkKLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKAotCQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7Ci0JCQotCQlyZXR1cm4gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIGRhZWEpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9QQVRIOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSBidWlsZFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3luY1ZhbHVlKGJ1aWxkVmFsdWUoYXN0Um9vdCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsdWUgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3luY1ZhbHVlKFN0cmluZyBhc3RWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IGFzdFZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgYXN0VmFsdWUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMudmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKHRoaXMudmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCQotCQotCS8vICoqKioqIE5lc3RhYmxlQW5ub3RhdGlvbiBpbXBsICoqKioqCi0JCi0JLyoqCi0JICogY29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kIGZyb20gTmVzdGFibGVBbm5vdGF0aW9uIGludGVyZmFjZQotCSAqIGZvciBzdWJjbGFzc2VzCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4KSB7Ci0JCXRoaXMuZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkubW92ZUFubm90YXRpb24obmV3SW5kZXgpOwotCX0KLQkKLQlwcml2YXRlIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBnZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiAoSW5kZXhlZEFubm90YXRpb25BZGFwdGVyKSB0aGlzLmFubm90YXRpb25BZGFwdGVyOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBidWlsZFhtbFBhdGhBbm5vdGF0aW9uQWRhcHRlcigKLQkJCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSkgewotCQkKLQkJcmV0dXJuIG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIGlkYWEpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZFhtbFBhdGhEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGludCBpbmRleCkgewotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gCi0JCQkJbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJCURFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwKLQkJCQkJQ09OVEFJTkVSX0RFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwKLQkJCQkJaW5kZXgsCi0JCQkJCUVMSmF4Yi5YTUxfUEFUSCk7Ci0JCXJldHVybiBpZGFhOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZGI3OTEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgU291cmNlWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uCi0JCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbiB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEVMSmF4Yi5YTUxfVFJBTlNGT1JNQVRJT04pOwotCQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gb3B0aW9uYWxEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gb3B0aW9uYWxBZGFwdGVyOwotCXByaXZhdGUgQm9vbGVhbiBvcHRpb25hbDsKLQkKLQkKLQlwdWJsaWMgU291cmNlWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcyhwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcihlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpKTsKLQl9Ci0KLQlwdWJsaWMgU291cmNlWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLm9wdGlvbmFsRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGRPcHRpb25hbERlY2xhcmF0aW9uQWRhcHRlcihkYWEpOwotCQl0aGlzLm9wdGlvbmFsQWRhcHRlciA9IGJ1aWxkU2hvcnRDaXJjdWl0Qm9vbGVhbkVsZW1lbnRBZGFwdGVyKHRoaXMub3B0aW9uYWxEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQkKLQkKLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkT3B0aW9uYWxEZWNsYXJhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JCb29sZWFucyhkYWEsIEVMSmF4Yi5YTUxfVFJBTlNGT1JNQVRJT05fX09QVElPTkFMKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRTaG9ydENpcmN1aXRCb29sZWFuRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSkgewotCQlyZXR1cm4gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVMSmF4Yi5YTUxfVFJBTlNGT1JNQVRJT047Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5vcHRpb25hbCA9IGJ1aWxkT3B0aW9uYWwoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNPcHRpb25hbChidWlsZE9wdGlvbmFsKGFzdFJvb3QpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5vcHRpb25hbCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogb3B0aW9uYWwKLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uYWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLm9wdGlvbmFsLCBvcHRpb25hbCkpIHsKLQkJCXRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDsKLQkJCXRoaXMub3B0aW9uYWxBZGFwdGVyLnNldFZhbHVlKG9wdGlvbmFsKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3luY09wdGlvbmFsKEJvb2xlYW4gYXN0T3B0aW9uYWwpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLm9wdGlvbmFsOwotCQl0aGlzLm9wdGlvbmFsID0gYXN0T3B0aW9uYWw7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPUFRJT05BTF9QUk9QRVJUWSwgb2xkLCB0aGlzLm9wdGlvbmFsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkT3B0aW9uYWwoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uYWxBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE9wdGlvbmFsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5vcHRpb25hbERlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9FTEpheGJfMl8xX0ZhY3RvcnkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvRUxKYXhiXzJfMV9GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZGFhODUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9FTEpheGJfMl8xX0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNvbnRleHRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiRWxlbWVudEZhY3RvcnlNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBbnlBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBbnlFbGVtZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRSZWZNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50UmVmc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFZhbHVlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLkFic3RyYWN0SmF4YkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVMSmF4YkNvbnRleHRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVMSmF2YUNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FTEphdmFFbGVtZW50RmFjdG9yeU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FTEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRUxKYXZhWG1sRWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRUxKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRUxKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVMSmF2YVhtbEVsZW1lbnRzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FTEphdmFYbWxWYWx1ZU1hcHBpbmc7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF4Yl8yXzFfRmFjdG9yeQotCQlleHRlbmRzIEFic3RyYWN0SmF4YkZhY3RvcnkgewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpheGJGYWN0b3J5IElOU1RBTkNFID0gbmV3IEVMSmF4Yl8yXzFfRmFjdG9yeSgpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF4YkZhY3RvcnkgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVMSmF4Yl8yXzFfRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpheGJDb250ZXh0Um9vdCBidWlsZENvbnRleHRSb290KEpheGJQcm9qZWN0IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEVMSmF4YkNvbnRleHRSb290KHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QgYnVpbGRKYXZhRWxlbWVudEZhY3RvcnlNZXRob2QoCi0JCQlYbWxSZWdpc3RyeSBwYXJlbnQsIEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCkgewotCQlyZXR1cm4gbmV3IEVMSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kKHBhcmVudCwgcmVzb3VyY2VNZXRob2QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YkNsYXNzTWFwcGluZyBidWlsZEpheGJDbGFzc01hcHBpbmcoSmF4YkNsYXNzIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEVMSmF2YUNsYXNzTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQW55QXR0cmlidXRlTWFwcGluZyBidWlsZEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEVMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEFueUVsZW1lbnRNYXBwaW5nIGJ1aWxkSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEVMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sRWxlbWVudE1hcHBpbmcgYnVpbGRKYXZhWG1sRWxlbWVudE1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgRUxKYXZhWG1sRWxlbWVudE1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEVsZW1lbnRSZWZNYXBwaW5nIGJ1aWxkSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEVMSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxFbGVtZW50UmVmc01hcHBpbmcgYnVpbGRKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEVMSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sRWxlbWVudHNNYXBwaW5nIGJ1aWxkSmF2YVhtbEVsZW1lbnRzTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBFTEphdmFYbWxFbGVtZW50c01hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbFZhbHVlTWFwcGluZyBidWlsZEphdmFYbWxWYWx1ZU1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgRUxKYXZhWG1sVmFsdWVNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9FTEpheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9FTEpheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzk1MDgyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvRUxKYXhiXzJfMV9QbGF0Zm9ybURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuamF4YjIxLkdlbmVyaWNKYXhiXzJfMV9QbGF0Zm9ybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5FTEpheGJQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkFic3RyYWN0RUxKYXhiUGxhdGZvcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FTEphdmFYbWxFbGVtZW50TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FTEphdmFYbWxJbnZlcnNlUmVmZXJlbmNlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRUxKYXZhWG1sVmFsdWVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5YbWxQYXRoQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbFBhdGhzQW5ub3RhdGlvbkRlZmluaXRpb247Ci0KLQotcHVibGljIGNsYXNzIEVMSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uCi0JCWV4dGVuZHMgIEFic3RyYWN0RUxKYXhiUGxhdGZvcm1EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVMSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCXByb3RlY3RlZCBFTEpheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpheGJQbGF0Zm9ybURlZmluaXRpb24gZ2V0R2VuZXJpY0pheGJQbGF0Zm9ybURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBHZW5lcmljSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0JfQotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEVMSmF4YlBsYXRmb3JtLlZFUlNJT05fMl8xOwotCX0KLQkKLQlwdWJsaWMgSmF4YkZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIEVMSmF4Yl8yXzFfRmFjdG9yeS5pbnN0YW5jZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF4YlJlc291cmNlTW9kZWxQcm92aWRlcltdIGJ1aWxkUmVzb3VyY2VNb2RlbFByb3ZpZGVycygpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuYXJyYXkoCi0JCQkJZ2V0R2VuZXJpY0pheGJQbGF0Zm9ybURlZmluaXRpb24oKS5nZXRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzKCksIAotCQkJCW5ldyBKYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyWzBdKTsKLQkJCQotCX0KLQkKLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCXJldHVybiBnZXRHZW5lcmljSmF4YlBsYXRmb3JtRGVmaW5pdGlvbigpLmdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoY29udGVudFR5cGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkRlZmluaXRpb25bXSBidWlsZEFubm90YXRpb25EZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuYWRkQWxsKAotCQkJCWdldEdlbmVyaWNKYXhiUGxhdGZvcm1EZWZpbml0aW9uKCkuZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25zKCksCi0JCQkJWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQkJWG1sUGF0aHNBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25bXSBidWlsZE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zKCkgewotCQlyZXR1cm4gQXJyYXlUb29scy5hZGRBbGwoCi0JCQkJZ2V0R2VuZXJpY0pheGJQbGF0Zm9ybURlZmluaXRpb24oKS5nZXROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucygpLAotCQkJCVhtbFBhdGhBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnNUbygKLQkJCUFycmF5TGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFTEphdmFYbWxFbGVtZW50TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIGdldEdlbmVyaWNKYXhiUGxhdGZvcm1EZWZpbml0aW9uKCkuZ2V0RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnNUbygKLQkJCUFycmF5TGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChFTEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRUxKYXZhWG1sRWxlbWVudE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVMSmF2YVhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVMSmF2YVhtbFZhbHVlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIGdldEdlbmVyaWNKYXhiUGxhdGZvcm1EZWZpbml0aW9uKCkuZ2V0U3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL0VMSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9FTEpheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFiYzUwNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL0VMSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXhiXzJfMV9QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5Ci0JCWltcGxlbWVudHMgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkgewotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGJ1aWxkSmF4YlBsYXRmb3JtRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIEVMSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMi9FTEpheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMi9FTEpheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWUyMTQyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzIvRUxKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmpheGIyMi5HZW5lcmljSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuRUxKYXhiUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRUxKYXZhWG1sSm9pbk5vZGVzTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRUxKYXZhWG1sVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sQ0RBVEFBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbEpvaW5Ob2RlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbEpvaW5Ob2Rlc0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5YbWxLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzEuRUxKYXhiXzJfMV9QbGF0Zm9ybURlZmluaXRpb247Ci0KLQotcHVibGljIGNsYXNzIEVMSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uCi0JCWV4dGVuZHMgIEVMSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVMSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCXByb3RlY3RlZCBFTEpheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gRUxKYXhiUGxhdGZvcm0uVkVSU0lPTl8yXzI7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGdldEdlbmVyaWNKYXhiUGxhdGZvcm1EZWZpbml0aW9uKCkgewotCQlyZXR1cm4gR2VuZXJpY0pheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbi5pbnN0YW5jZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkRlZmluaXRpb25bXSBidWlsZEFubm90YXRpb25EZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuYWRkQWxsKAotCQkJCXN1cGVyLmJ1aWxkQW5ub3RhdGlvbkRlZmluaXRpb25zKCksCi0JCQkJWG1sQ0RBVEFBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJCVhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJCVhtbEpvaW5Ob2Rlc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQkJWG1sS2V5QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbltdIGJ1aWxkTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmFkZEFsbCgKLQkJCQlzdXBlci5idWlsZE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zKCksCi0JCQkJWG1sSm9pbk5vZGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKAotCQkJQXJyYXlMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJc3VwZXIuYWRkU3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKGRlZmluaXRpb25zKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVMSmF2YVhtbEpvaW5Ob2Rlc01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRUxKYXZhWG1sVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8yL0VMSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMi9FTEpheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE4NDRkNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8yL0VMSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5Ci0JCWltcGxlbWVudHMgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkgewotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGJ1aWxkSmF4YlBsYXRmb3JtRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIEVMSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMy9FTEpheGJfMl8zX1BsYXRmb3JtRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMy9FTEpheGJfMl8zX1BsYXRmb3JtRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGZmMDA1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzMvRUxKYXhiXzJfM19QbGF0Zm9ybURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5FTEpheGJQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzIuRUxKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb247Ci0KLQotcHVibGljIGNsYXNzIEVMSmF4Yl8yXzNfUGxhdGZvcm1EZWZpbml0aW9uCi0JCWV4dGVuZHMgIEVMSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVMSmF4Yl8yXzNfUGxhdGZvcm1EZWZpbml0aW9uKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCXByb3RlY3RlZCBFTEpheGJfMl8zX1BsYXRmb3JtRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gRUxKYXhiUGxhdGZvcm0uVkVSU0lPTl8yXzM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMy9FTEpheGJfMl8zX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzMvRUxKYXhiXzJfM19QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZmM2NGMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMy9FTEpheGJfMl8zX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbkZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF4Yl8yXzNfUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeQotCQlpbXBsZW1lbnRzIEpheGJQbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5IHsKLQkKLQlwdWJsaWMgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBidWlsZEpheGJQbGF0Zm9ybURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBFTEpheGJfMl8zX1BsYXRmb3JtRGVmaW5pdGlvbi5pbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzQvRUxKYXhiXzJfNF9QbGF0Zm9ybURlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzQvRUxKYXhiXzJfNF9QbGF0Zm9ybURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA2NDhiMi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml80L0VMSmF4Yl8yXzRfUGxhdGZvcm1EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfNDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuRUxKYXhiUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8zLkVMSmF4Yl8yXzNfUGxhdGZvcm1EZWZpbml0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBFTEpheGJfMl80X1BsYXRmb3JtRGVmaW5pdGlvbgotCQlleHRlbmRzICBFTEpheGJfMl8zX1BsYXRmb3JtRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFTEpheGJfMl80X1BsYXRmb3JtRGVmaW5pdGlvbigpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgRUxKYXhiXzJfNF9QbGF0Zm9ybURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEVMSmF4YlBsYXRmb3JtLlZFUlNJT05fMl80OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzQvRUxKYXhiXzJfNF9QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml80L0VMSmF4Yl8yXzRfUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGZiMmE4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzQvRUxKYXhiXzJfNF9QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfNDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBFTEpheGJfMl80X1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkKLQlpbXBsZW1lbnRzIEpheGJQbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5IHsKLQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGJ1aWxkSmF4YlBsYXRmb3JtRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIEVMSmF4Yl8yXzRfUGxhdGZvcm1EZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9FTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYTg1OTMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9FTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VCdWlsZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIERFRkFVTFRfUEFSTVMgPSBuZXcgU3RyaW5nWzBdOwotCXByaXZhdGUgc3RhdGljIFRleHRSYW5nZSBERUZBVUxUX1RFWFRfUkFOR0UgPSBUZXh0UmFuZ2UuRW1wdHkuaW5zdGFuY2UoKTsKLQotCXB1YmxpYyBzdGF0aWMgSU1lc3NhZ2UgYnVpbGRNZXNzYWdlKGludCBkZWZhdWx0U2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIEpheGJOb2RlIHRhcmdldE9iamVjdCkgewotCQlyZXR1cm4gYnVpbGRNZXNzYWdlKGRlZmF1bHRTZXZlcml0eSwgbWVzc2FnZUlkLCB0YXJnZXRPYmplY3QuZ2V0UmVzb3VyY2UoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoaW50IGRlZmF1bHRTZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgSVJlc291cmNlIHRhcmdldE9iamVjdCkgewotCQlyZXR1cm4gYnVpbGRNZXNzYWdlKGRlZmF1bHRTZXZlcml0eSwgbWVzc2FnZUlkLCBERUZBVUxUX1BBUk1TLCB0YXJnZXRPYmplY3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSU1lc3NhZ2UgYnVpbGRNZXNzYWdlKGludCBkZWZhdWx0U2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBKYXhiTm9kZSB0YXJnZXRPYmplY3QpIHsKLQkJcmV0dXJuIGJ1aWxkTWVzc2FnZShkZWZhdWx0U2V2ZXJpdHksIG1lc3NhZ2VJZCwgcGFybXMsIHRhcmdldE9iamVjdC5nZXRSZXNvdXJjZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElNZXNzYWdlIGJ1aWxkTWVzc2FnZShpbnQgZGVmYXVsdFNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcywgSVJlc291cmNlIHRhcmdldE9iamVjdCkgewotCQlyZXR1cm4gYnVpbGRNZXNzYWdlKGRlZmF1bHRTZXZlcml0eSwgbWVzc2FnZUlkLCBwYXJtcywgdGFyZ2V0T2JqZWN0LCBERUZBVUxUX1RFWFRfUkFOR0UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSU1lc3NhZ2UgYnVpbGRNZXNzYWdlKGludCBkZWZhdWx0U2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIEpheGJOb2RlIHRhcmdldE9iamVjdCwgVGV4dFJhbmdlIHRleHRSYW5nZSkgewotCQlyZXR1cm4gYnVpbGRNZXNzYWdlKGRlZmF1bHRTZXZlcml0eSwgbWVzc2FnZUlkLCB0YXJnZXRPYmplY3QuZ2V0UmVzb3VyY2UoKSwgdGV4dFJhbmdlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElNZXNzYWdlIGJ1aWxkTWVzc2FnZShpbnQgZGVmYXVsdFNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBJUmVzb3VyY2UgdGFyZ2V0T2JqZWN0LCBUZXh0UmFuZ2UgdGV4dFJhbmdlKSB7Ci0JCXJldHVybiBidWlsZE1lc3NhZ2UoZGVmYXVsdFNldmVyaXR5LCBtZXNzYWdlSWQsIERFRkFVTFRfUEFSTVMsIHRhcmdldE9iamVjdCwgdGV4dFJhbmdlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElNZXNzYWdlIGJ1aWxkTWVzc2FnZShpbnQgZGVmYXVsdFNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcywgSmF4Yk5vZGUgdGFyZ2V0T2JqZWN0LCBUZXh0UmFuZ2UgdGV4dFJhbmdlKSB7Ci0JCXJldHVybiBidWlsZE1lc3NhZ2UoZGVmYXVsdFNldmVyaXR5LCBtZXNzYWdlSWQsIHBhcm1zLCB0YXJnZXRPYmplY3QuZ2V0UmVzb3VyY2UoKSwgdGV4dFJhbmdlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElNZXNzYWdlIGJ1aWxkTWVzc2FnZShpbnQgZGVmYXVsdFNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcywgSVJlc291cmNlIHRhcmdldE9iamVjdCwgVGV4dFJhbmdlIHRleHRSYW5nZSkgewotCQlyZXR1cm4gRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoZGVmYXVsdFNldmVyaXR5LCBtZXNzYWdlSWQsIHBhcm1zLCB0YXJnZXRPYmplY3QsIHRleHRSYW5nZSwgTUVTU0FHRV9GQUNUT1JZKTsKLQl9Ci0KLQotCXByaXZhdGUgRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VCdWlsZGVyKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuTWVzc2FnZUZhY3RvcnkgTUVTU0FHRV9GQUNUT1JZID0gbmV3IEVjbGlwc2VMaW5rTWVzc2FnZUZhY3RvcnkoKTsKLQotCS8qIENVIHByaXZhdGUgKi8gc3RhdGljIGNsYXNzIEVjbGlwc2VMaW5rTWVzc2FnZUZhY3RvcnkKLQkJaW1wbGVtZW50cyBEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLk1lc3NhZ2VGYWN0b3J5Ci0JewotCQlwdWJsaWMgSU1lc3NhZ2UgYnVpbGRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMsIElSZXNvdXJjZSB0YXJnZXRPYmplY3QpIHsKLQkJCS8vIFRPRE8gY2hlY2sgZm9yIHByZWZlcmVuY2Ugb3ZlcnJpZGUKLS8vCQkJaW50IHByZWZTZXZlcml0eSA9IEpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5nZXRQcm9ibGVtU2V2ZXJpdHlQcmVmZXJlbmNlKHRhcmdldE9iamVjdCwgbWVzc2FnZUlkKTsKLS8vCQkJaWYgKHByZWZTZXZlcml0eSAhPSBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTk9fU0VWRVJJVFlfUFJFRkVSRU5DRSl7Ci0vLwkJCQlzZXZlcml0eSA9IHByZWZTZXZlcml0eTsKLS8vCQkJfQotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBFY2xpcHNlTGlua01lc3NhZ2UoRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLkJVTkRMRV9OQU1FLCBzZXZlcml0eSwgbWVzc2FnZUlkLCBwYXJtcywgdGFyZ2V0T2JqZWN0KTsKLQkJCS8vIFRPRE8gIkVjbGlwc2VMaW5rIEpBWEIiIHZhbGlkYXRpb24gbWFya2VyPwotCQkJbWVzc2FnZS5zZXRNYXJrZXJJZChKcHRKYXhiQ29yZVBsdWdpbi5WQUxJREFUSU9OX01BUktFUl9JRCk7Ci0JCQlyZXR1cm4gbWVzc2FnZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogV2UgaGF2ZSB0byBidWlsZCB0aGlzIG1lc3NhZ2Ugc28ge0BsaW5rIE1lc3NhZ2V9IHVzZXMgdGhlIHJpZ2h0IGNsYXNzCi0JICogbG9hZGVyIHRvIHJldHJpZXZlIHRoZSBtZXNzYWdlIGJ1bmRsZXMuCi0JICogPHA+Ci0JICogQW5vdGhlciB3YXkgd2UgY291bGQgcG90ZW50aWFsbHkgc29sdmUgdGhpcyBpcyB0byBoYXZlIGEgc2VwYXJhdGUKLQkgKiBFY2xpc3BlTGluayBKUEEgdmFsaWRhdG9yIGFuZCBzZXQgdXAgdGhlIGV4dGVuc2lvbiBwb2ludHMgc28gdGhhdAotCSAqIGl0IG9ubHkgcnVucyBhZ2FpbnN0IEpQQSBwcm9qZWN0cyB3aXRoIHRoZSBFY2xpc3BlTGluayBwbGF0Zm9ybS4uLi4KLQkgKi8KLQkvKiBDVSBwcml2YXRlICovIHN0YXRpYyBjbGFzcyBFY2xpcHNlTGlua01lc3NhZ2UKLQkJZXh0ZW5kcyBNZXNzYWdlCi0JewotCQlFY2xpcHNlTGlua01lc3NhZ2UoU3RyaW5nIGJ1bmRsZU5hbWUsIGludCBzZXZlcml0eSwgU3RyaW5nIGlkLCBTdHJpbmdbXSBwYXJhbXMsIE9iamVjdCB0YXJnZXQpIHsKLQkJCXN1cGVyKGJ1bmRsZU5hbWUsIHNldmVyaXR5LCBpZCwgcGFyYW1zLCB0YXJnZXQpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoTG9jYWxlIGxvY2FsZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEJ1bmRsZShsb2NhbGUsIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybiBzdXBlci5nZXRCdW5kbGUobG9jYWxlLCBjbGFzc0xvYWRlcik7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0VMSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9FTEpheGJWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JmNmU1Ny4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0VMSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBFTEpheGJWYWxpZGF0aW9uTWVzc2FnZXMgewotCQotCS8vIGJ1bmRsZSBuYW1lCi0JU3RyaW5nIEJVTkRMRV9OQU1FID0gImVsX2pheGJfdmFsaWRhdGlvbiI7Ci0JCi0JCi0JLy8gdmFsaWRhdGlvbiBvbiBwcm9qZWN0Ci0JU3RyaW5nIFBST0pFQ1RfTUlTU0lOR19FQ0xJUFNFTElOS19KQVhCX0NPTlRFWFRfRkFDVE9SWSA9ICJQUk9KRUNUX01JU1NJTkdfRUNMSVBTRUxJTktfSkFYQl9DT05URVhUX0ZBQ1RPUlkiOwotCQotCVN0cmluZyBYTUxfRElTQ1JJTUlOQVRPUl9OT0RFX19OT1RfU1BFQ0lGSUVEID0gIlhNTF9ESVNDUklNSU5BVE9SX05PREVfX05PVF9TUEVDSUZJRUQiOwotCQotCVN0cmluZyBYTUxfRElTQ1JJTUlOQVRPUl9WQUxVRV9fTk9UX1NQRUNJRklFRCA9ICJYTUxfRElTQ1JJTUlOQVRPUl9WQUxVRV9fTk9UX1NQRUNJRklFRCI7Ci0JCi0JU3RyaW5nIFhNTF9FTEVNRU5UX0RFQ0xfX0lOVkFMSURfTUVUSE9EX1NJR05BVFVSRV9SRVRVUk5fVFlQRSA9ICJYTUxfRUxFTUVOVF9ERUNMX19JTlZBTElEX01FVEhPRF9TSUdOQVRVUkVfUkVUVVJOX1RZUEUiOwotCQotCVN0cmluZyBYTUxfSk9JTl9OT0RFX19YTUxfUEFUSF9OT1RfU1BFQ0lGSUVEID0gIlhNTF9KT0lOX05PREVfX1hNTF9QQVRIX05PVF9TUEVDSUZJRUQiOwotCVN0cmluZyBYTUxfSk9JTl9OT0RFX19SRUZFUkVOQ0VEX1hNTF9QQVRIX05PVF9TUEVDSUZJRUQgPSAiWE1MX0pPSU5fTk9ERV9fUkVGRVJFTkNFRF9YTUxfUEFUSF9OT1RfU1BFQ0lGSUVEIjsKLQlTdHJpbmcgWE1MX0pPSU5fTk9ERV9fUkVGRVJFTkNFRF9YTUxfUEFUSF9OT1RfSU5fUkVGRVJFTkNFRF9DTEFTU19LRVlTID0gIlhNTF9KT0lOX05PREVfX1JFRkVSRU5DRURfWE1MX1BBVEhfTk9UX0lOX1JFRkVSRU5DRURfQ0xBU1NfS0VZUyI7Ci0JCi0JU3RyaW5nIFhNTF9KT0lOX05PREVTX19JTlZBTElEX1JFRkVSRU5DRURfQ0xBU1MgPSAiWE1MX0pPSU5fTk9ERVNfX0lOVkFMSURfUkVGRVJFTkNFRF9DTEFTUyI7Ci0JU3RyaW5nIFhNTF9KT0lOX05PREVTX19EVVBMSUNBVEVfWE1MX1BBVEggPSAiWE1MX0pPSU5fTk9ERVNfX0RVUExJQ0FURV9YTUxfUEFUSCI7Ci0JU3RyaW5nIFhNTF9KT0lOX05PREVTX19EVVBMSUNBVEVfUkVGRVJFTkNFRF9YTUxfUEFUSCA9ICJYTUxfSk9JTl9OT0RFU19fRFVQTElDQVRFX1JFRkVSRU5DRURfWE1MX1BBVEgiOwotCQotCVN0cmluZyBYTUxfUEFUSF9fTk9UX1NQRUNJRklFRCA9ICJYTUxfUEFUSF9fTk9UX1NQRUNJRklFRCI7Ci0JCi0JLy8gdXNlZCBvbiBYbWxFbGVtZW50cyBtYXBwaW5nCi0JU3RyaW5nIFhNTF9QQVRIX19JTlNVRkZJQ0lFTlRfWE1MX1BBVEhTX0ZPUl9YTUxfRUxFTUVOVFMgPSAiWE1MX1BBVEhfX0lOU1VGRklDSUVOVF9YTUxfUEFUSFNfRk9SX1hNTF9FTEVNRU5UUyI7Ci0JU3RyaW5nIFhNTF9QQVRIX19JTlNVRkZJQ0lFTlRfWE1MX0VMRU1FTlRTX0ZPUl9YTUxfUEFUSFMgPSAiWE1MX1BBVEhfX0lOU1VGRklDSUVOVF9YTUxfRUxFTUVOVFNfRk9SX1hNTF9QQVRIUyI7Ci0JCi0JU3RyaW5nIFhNTF9JTlZFUlNFX1JFRkVSRU5DRV9fTUFQUEVEX0JZX05PVF9TUEVDSUZJRUQgPSAiWE1MX0lOVkVSU0VfUkVGRVJFTkNFX19NQVBQRURfQllfTk9UX1NQRUNJRklFRCI7Ci0JU3RyaW5nIFhNTF9JTlZFUlNFX1JFRkVSRU5DRV9fTUFQUEVEX0JZX05PVF9SRVNPTFZFRCA9ICJYTUxfSU5WRVJTRV9SRUZFUkVOQ0VfX01BUFBFRF9CWV9OT1RfUkVTT0xWRUQiOwotCVN0cmluZyBYTUxfSU5WRVJTRV9SRUZFUkVOQ0VfX01BUFBFRF9CWV9JTExFR0FMX01BUFBJTkdfVFlQRSA9ICJYTUxfSU5WRVJTRV9SRUZFUkVOQ0VfX01BUFBFRF9CWV9JTExFR0FMX01BUFBJTkdfVFlQRSI7Ci0JCi0JLy8gZm9yIGFsbCBYUGF0aCB1c2FnZQotCVN0cmluZyBYUEFUSF9fSU5WQUxJRF9GT1JNX0lMTEVHQUxfU0VHTUVOVCA9ICJYUEFUSF9fSU5WQUxJRF9GT1JNX0lMTEVHQUxfU0VHTUVOVCI7Ci0JU3RyaW5nIFhQQVRIX19ST09UX05PVF9TVVBQT1JURUQgPSAiWFBBVEhfX1JPT1RfTk9UX1NVUFBPUlRFRCI7Ci0JU3RyaW5nIFhQQVRIX19TRUxGX1NFR01FTlRfTVVTVF9CRV9GSVJTVF9TRUdNRU5UID0gIlhQQVRIX19TRUxGX1NFR01FTlRfTVVTVF9CRV9GSVJTVF9TRUdNRU5UIjsKLQlTdHJpbmcgWFBBVEhfX1RFWFRfU0VHTUVOVF9NVVNUX0JFX0xBU1RfU0VHTUVOVCA9ICJYUEFUSF9fVEVYVF9TRUdNRU5UX01VU1RfQkVfTEFTVF9TRUdNRU5UIjsKLQlTdHJpbmcgWFBBVEhfX0FUVFJJQlVURV9TRUdNRU5UX01VU1RfQkVfTEFTVF9TRUdNRU5UID0gIlhQQVRIX19BVFRSSUJVVEVfU0VHTUVOVF9NVVNUX0JFX0xBU1RfU0VHTUVOVCI7Ci0JU3RyaW5nIFhQQVRIX19JTlZBTElEX05TX1BSRUZJWCA9ICJYUEFUSF9fSU5WQUxJRF9OU19QUkVGSVgiOwotCVN0cmluZyBYUEFUSF9fVU5SRVNPTFZFRF9FTEVNRU5UID0gIlhQQVRIX19VTlJFU09MVkVEX0VMRU1FTlQiOwotCVN0cmluZyBYUEFUSF9fVU5SRVNPTFZFRF9BVFRSSUJVVEUgPSAiWFBBVEhfX1VOUkVTT0xWRURfQVRUUklCVVRFIjsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRUxKYXhiLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VMSmF4Yi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTU4NTNkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRUxKYXhiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBKQVhCIEphdmEtcmVsYXRlZCBzdHVmZiAoYW5ub3RhdGlvbnMgZXRjLikKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgRUxKYXhiIHsKLQkKLQkvLyBFY2xpcHNlTGluayBhbm5vdGF0aW9ucyBwYWNrYWdlCi0JCi0JU3RyaW5nIFBBQ0tBR0UgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2Uub3htLmFubm90YXRpb25zIjsKLQlTdHJpbmcgUEFDS0FHRV8gPSBQQUNLQUdFICsgJy4nOwotCQotCQotCS8vIEFubm90YXRpb25zCi0JCi0JU3RyaW5nIFhNTF9DREFUQSA9IFBBQ0tBR0VfICsgIlhtbENEQVRBIjsKLQkKLQlTdHJpbmcgWE1MX0RJU0NSSU1JTkFUT1JfTk9ERSA9IFBBQ0tBR0VfICsgIlhtbERpc2NyaW1pbmF0b3JOb2RlIjsKLQkJU3RyaW5nIFhNTF9ESVNDUklNSU5BVE9SX05PREVfX1ZBTFVFID0gInZhbHVlIjsKLQkKLQlTdHJpbmcgWE1MX0RJU0NSSU1JTkFUT1JfVkFMVUUgPSBQQUNLQUdFXyArICJYbWxEaXNjcmltaW5hdG9yVmFsdWUiOwotCQlTdHJpbmcgWE1MX0RJU0NSSU1JTkFUT1JfVkFMVUVfX1ZBTFVFID0gInZhbHVlIjsKLQkKLQlTdHJpbmcgWE1MX0lOVkVSU0VfUkVGRVJFTkNFID0gUEFDS0FHRV8gKyAiWG1sSW52ZXJzZVJlZmVyZW5jZSI7Ci0JCVN0cmluZyBYTUxfSU5WRVJTRV9SRUZFUkVOQ0VfX01BUFBFRF9CWSA9ICJtYXBwZWRCeSI7Ci0JCi0JU3RyaW5nIFhNTF9KT0lOX05PREUgPSBQQUNLQUdFXyArICJYbWxKb2luTm9kZSI7Ci0JCVN0cmluZyBYTUxfSk9JTl9OT0RFX19YTUxfUEFUSCA9ICJ4bWxQYXRoIjsKLQkJU3RyaW5nIFhNTF9KT0lOX05PREVfX1JFRkVSRU5DRURfWE1MX1BBVEggPSAicmVmZXJlbmNlZFhtbFBhdGgiOwotCQotCVN0cmluZyBYTUxfSk9JTl9OT0RFUyA9IFBBQ0tBR0VfICsgIlhtbEpvaW5Ob2RlcyI7Ci0JCVN0cmluZyBYTUxfSk9JTl9OT0RFU19fVkFMVUUgPSAidmFsdWUiOwotCQotCVN0cmluZyBYTUxfS0VZID0gUEFDS0FHRV8gKyAiWG1sS2V5IjsKLQkKLQlTdHJpbmcgWE1MX1BBVEggPSBQQUNLQUdFXyArICJYbWxQYXRoIjsKLQkJU3RyaW5nIFhNTF9QQVRIX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JCi0JU3RyaW5nIFhNTF9QQVRIUyA9IFBBQ0tBR0VfICsgIlhtbFBhdGhzIjsKLQkKLQlTdHJpbmcgWE1MX1RSQU5TRk9STUFUSU9OID0gUEFDS0FHRV8gKyAiWG1sVHJhbnNmb3JtYXRpb24iOwotCQlTdHJpbmcgWE1MX1RSQU5TRk9STUFUSU9OX19PUFRJT05BTCA9ICJvcHRpb25hbCI7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL1htbENEQVRBQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxDREFUQUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc2NzUwNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL1htbENEQVRBQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5veG0uYW5ub3RhdGlvbnMuWG1sQ0RBVEEKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbENEQVRBQW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL1htbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxEaXNjcmltaW5hdG9yTm9kZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNlZmZmOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL1htbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5veG0uYW5ub3RhdGlvbnMuWG1sRGlzY3JpbWluYXRvck5vZGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCQotCS8qKgotCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggY2hhbmdlIGV2ZW50cyB0byB0aGUgJ3ZhbHVlJyBwcm9wZXJ0eQotCSAqLwotCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxEaXNjcmltaW5hdG9yTm9kZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sRGlzY3JpbWluYXRvck5vZGUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSBhc3NvY2lhdGVkIHdpdGggdGhlICd2YWx1ZScgZWxlbWVudC4KLQkgKiBSZXR1cm4gdGhlIHRleHQgcmFuZ2Ugb2YgdGhpcyBhbm5vdGF0aW9uIGlmIHRoZSBlbGVtZW50IGlzIGFic2VudC4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdGV4dCBwb3NpdGlvbiBpcyB3aXRoaW4gdGhlICd2YWx1ZScgZWxlbWVudC4KLQkgKi8KLQlib29sZWFuIHZhbHVlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL1htbERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTMxMmFmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5veG0uYW5ub3RhdGlvbnMuWG1sRGlzY3JpbWluYXRvclZhbHVlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQW5ub3RhdGlvbiB7Ci0JCi0JLyoqCi0JICogU3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2UgZXZlbnRzIHRvIHRoZSAndmFsdWUnIHByb3BlcnR5Ci0JICovCi0JU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbERpc2NyaW1pbmF0b3JWYWx1ZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sRGlzY3JpbWluYXRvclZhbHVlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgcmFuZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSAndmFsdWUnIGVsZW1lbnQuCi0JICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIG9mIHRoaXMgYW5ub3RhdGlvbiBpZiB0aGUgZWxlbWVudCBpcyBhYnNlbnQuCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdiN2EwNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL1htbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm94bS5hbm5vdGF0aW9ucy5YbWxJbnZlcnNlUmVmZXJlbmNlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCQotCS8qKgotCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggY2hhbmdlIGV2ZW50cyB0byB0aGUgJ21hcHBlZEJ5JyBwcm9wZXJ0eQotCSAqLwotCVN0cmluZyBNQVBQRURfQllfUFJPUEVSVFkgPSAibWFwcGVkQnkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdtYXBwZWRCeScgZWxlbWVudCBvZiB0aGUgWG1sSW52ZXJzZVJlZmVyZW5jZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldE1hcHBlZEJ5KCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdtYXBwZWRCeScgZWxlbWVudCBvZiB0aGUgWG1sSW52ZXJzZVJlZmVyZW5jZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBtYXBwZWRCeSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgJ21hcHBlZEJ5JyBlbGVtZW50LgotCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSBvZiB0aGlzIGFubm90YXRpb24gaWYgdGhlIGVsZW1lbnQgaXMgYWJzZW50LgotCSAqLwotCVRleHRSYW5nZSBnZXRNYXBwZWRCeVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB0ZXh0IHBvc2l0aW9uIGlzIHdpdGhpbiB0aGUgJ21hcHBlZEJ5JyBlbGVtZW50LgotCSAqLwotCWJvb2xlYW4gbWFwcGVkQnlUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvWG1sSm9pbk5vZGVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL1htbEpvaW5Ob2RlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZThmZjEyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvWG1sSm9pbk5vZGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2Uub3htLmFubm90YXRpb25zLlhtbEpvaW5Ob2RlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxKb2luTm9kZUFubm90YXRpb24KLQkJZXh0ZW5kcyBOZXN0YWJsZUFubm90YXRpb24gewotCQotCS8qKgotCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggY2hhbmdlIGV2ZW50cyB0byB0aGUgJ3htbFBhdGgnIHByb3BlcnR5Ci0JICovCi0JU3RyaW5nIFhNTF9QQVRIX1BST1BFUlRZID0gInhtbFBhdGgiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd4bWxQYXRoJyBlbGVtZW50IG9mIHRoZSBYbWxKb2luTm9kZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldFhtbFBhdGgoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3htbFBhdGgnIGVsZW1lbnQgb2YgdGhlIFhtbEpvaW5Ob2RlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0WG1sUGF0aChTdHJpbmcgeG1sUGF0aCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgJ3htbFBhdGgnIGVsZW1lbnQuCi0JICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIG9mIHRoaXMgYW5ub3RhdGlvbiBpZiB0aGUgZWxlbWVudCBpcyBhYnNlbnQuCi0JICovCi0JVGV4dFJhbmdlIGdldFhtbFBhdGhUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdGV4dCBwb3NpdGlvbiBpcyB3aXRoaW4gdGhlICd4bWxQYXRoJyBlbGVtZW50LgotCSAqLwotCWJvb2xlYW4geG1sUGF0aFRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCQotCS8qKgotCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggY2hhbmdlIGV2ZW50cyB0byB0aGUgJ3JlZmVyZW5jZWRYbWxQYXRoJyBwcm9wZXJ0eQotCSAqLwotCVN0cmluZyBSRUZFUkVOQ0VEX1hNTF9QQVRIX1BST1BFUlRZID0gInJlZmVyZW5jZWRYbWxQYXRoIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncmVmZXJlbmNlZFhtbFBhdGgnIGVsZW1lbnQgb2YgdGhlIFhtbEpvaW5Ob2RlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0UmVmZXJlbmNlZFhtbFBhdGgoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3JlZmVyZW5jZWRYbWxQYXRoJyBlbGVtZW50IG9mIHRoZSBYbWxKb2luTm9kZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFJlZmVyZW5jZWRYbWxQYXRoKFN0cmluZyByZWZlcmVuY2VkWG1sUGF0aCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgJ3JlZmVyZW5jZWRYbWxQYXRoJyBlbGVtZW50LgotCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSBvZiB0aGlzIGFubm90YXRpb24gaWYgdGhlIGVsZW1lbnQgaXMgYWJzZW50LgotCSAqLwotCVRleHRSYW5nZSBnZXRSZWZlcmVuY2VkWG1sUGF0aFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB0ZXh0IHBvc2l0aW9uIGlzIHdpdGhpbiB0aGUgJ3JlZmVyZW5jZWRYbWxQYXRoJyBlbGVtZW50LgotCSAqLwotCWJvb2xlYW4gcmVmZXJlbmNlZFhtbFBhdGhUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvWG1sS2V5QW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxLZXlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOTZjZDkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxLZXlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm94bS5hbm5vdGF0aW9ucy5YbWxLZXkKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEtleUFubm90YXRpb24KLQkJZXh0ZW5kcyBBbm5vdGF0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxQYXRoQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxQYXRoQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTY5MDhhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvWG1sUGF0aEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5veG0uYW5ub3RhdGlvbnMuWG1sUGF0aAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sUGF0aEFubm90YXRpb24KLQkJZXh0ZW5kcyBOZXN0YWJsZUFubm90YXRpb24gewotCQotCS8qKgotCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggY2hhbmdlIGV2ZW50cyB0byB0aGUgJ3ZhbHVlJyBwcm9wZXJ0eQotCSAqLwotCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEgKHRoZSBhbm5vdGF0aW9uIGlzIGEgbWFya2VyIGFubm90YXRpb24uKQotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50ICh0byBtYWtlIGl0IGEgbWFya2VyIGFubm90YXRpb24uKQotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgcmFuZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSAndmFsdWUnIGVsZW1lbnQuCi0JICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIG9mIHRoaXMgYW5ub3RhdGlvbiBpZiB0aGUgZWxlbWVudCBpcyBhYnNlbnQuCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHRleHQgcG9zaXRpb24gaXMgd2l0aGluIHRoZSAndmFsdWUnIGVsZW1lbnQuCi0JICovCi0JYm9vbGVhbiB2YWx1ZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNzA3MTcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2Uub3htLmFubm90YXRpb25zLlhtbFRyYW5zZm9ybWF0aW9uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24KLQkJZXh0ZW5kcyBBbm5vdGF0aW9uIHsKLQkKLQkvKioKLQkgKiBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZSBldmVudHMgdG8gdGhlICdvcHRpb25hbCcgcHJvcGVydHkKLQkgKi8KLQlTdHJpbmcgT1BUSU9OQUxfUFJPUEVSVFkgPSAib3B0aW9uYWwiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdvcHRpb25hbCcgZWxlbWVudCBvZiB0aGUgWG1sVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUJvb2xlYW4gZ2V0T3B0aW9uYWwoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ29wdGlvbmFsJyBlbGVtZW50IG9mIHRoZSBYbWxUcmFuc2Zvcm1hdGlvbiBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSBhc3NvY2lhdGVkIHdpdGggdGhlICdvcHRpb25hbCcgZWxlbWVudC4KLQkgKiBSZXR1cm4gdGhlIHRleHQgcmFuZ2Ugb2YgdGhpcyBhbm5vdGF0aW9uIGlmIHRoZSBlbGVtZW50IGlzIGFic2VudC4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0T3B0aW9uYWxUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLy5jbGFzc3BhdGggYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgzZWUxZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvamF4Yi91aS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLy5jdnNpZ25vcmUgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLy5wcm9qZWN0IGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWEyNGQ2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTM4ZmE5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVHVlIE1hciAwOCAxMjowODowNCBFU1QgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU2Njk0NC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4zLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS5KcHRKYXhiRWNsaXBzZUxpbmtVaVBsdWdpbgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjUuMiw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjguMSw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlO2J1bmRsZS12ZXJzaW9uPSJbMy43LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnN3dDtidW5kbGUtdmVyc2lvbj0iWzMuNy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy44LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IlszLjcuMCw0LjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWksCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8xO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml80O3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9hYm91dC5odG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhiYzAzOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL29iajE2L3htbC1pbnZlcnNlLXJlZmVyZW5jZS5naWYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC9vYmoxNi94bWwtaW52ZXJzZS1yZWZlcmVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTU1Yjg0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL29iajE2L3htbC1pbnZlcnNlLXJlZmVyZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC9vYmoxNi94bWwtam9pbi1ub2Rlcy5naWYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC9vYmoxNi94bWwtam9pbi1ub2Rlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OGVjMzYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvb2JqMTYveG1sLWpvaW4tbm9kZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvb2JqMTYveG1sLXRyYW5zZm9ybWF0aW9uLmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL29iajE2L3htbC10cmFuc2Zvcm1hdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlY2Y5ZTUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvb2JqMTYveG1sLXRyYW5zZm9ybWF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZmZWJiYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXBsdWdpbk5hbWU9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIE1PWHkgU3VwcG9ydCAtIFVJCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotYWRkRWNsaXBzZUxpbmtKYXhiUHJvcGVydHlDb21tYW5kPUFkZCBFY2xpcHNlTGluayBKQVhCIHByb3BlcnR5CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnhtbCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzhmOGE5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08IS0tCi0gIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotCi0gIENvbnRyaWJ1dG9yczoKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAtLT4KLQotPHBsdWdpbj4KLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5qYXhiUGxhdGZvcm1VaXMiPgotCQkKLQkJPGpheGJQbGF0Zm9ybVVpCi0JCQlpZD0iZWNsaXBzZWxpbmtfMl8xLnVpIgotCQkJamF4YlBsYXRmb3JtPSJlY2xpcHNlbGlua18yXzEiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMS5FTEpheGJfMl8xX1BsYXRmb3JtVWkiLz4KLQkJCi0JCTxqYXhiUGxhdGZvcm1VaQotCQkJaWQ9ImVjbGlwc2VsaW5rXzJfMi51aSIKLQkJCWpheGJQbGF0Zm9ybT0iZWNsaXBzZWxpbmtfMl8yIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzIuRUxKYXhiXzJfMl9QbGF0Zm9ybVVpIi8+Ci0JCQotCQk8amF4YlBsYXRmb3JtVWkKLQkJCWlkPSJlY2xpcHNlbGlua18yXzMudWkiCi0JCQlqYXhiUGxhdGZvcm09ImVjbGlwc2VsaW5rXzJfMyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8zLkVMSmF4Yl8yXzNfUGxhdGZvcm1VaSIvPgotCQkKLQkJPGpheGJQbGF0Zm9ybVVpCi0JCQlpZD0iZWNsaXBzZWxpbmtfMl80LnVpIgotCQkJamF4YlBsYXRmb3JtPSJlY2xpcHNlbGlua18yXzQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfNC5FTEpheGJfMl80X1BsYXRmb3JtVWkiLz4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotCQkKLQkJPGNvbW1hbmQKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS5jb21tYW5kLmFkZEVjbGlwc2VMaW5rSmF4YlByb3BlcnR5IgotCQkJbmFtZT0iJWFkZEVjbGlwc2VMaW5rSmF4YlByb3BlcnR5Q29tbWFuZCIvPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+Ci0JCQotCQk8aGFuZGxlcgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS5jb21tYW5kLmFkZEVjbGlwc2VMaW5rSmF4YlByb3BlcnR5IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZEVjbGlwc2VMaW5rSmF4YlByb3BlcnR5Q29tbWFuZEhhbmRsZXIiPgotCQkJPGVuYWJsZWRXaGVuPgotCQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZSI+Ci0JCQkJCQk8dGVzdCAKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5oYXNFY2xpcHNlTGlua0pheGJQcm9wZXJ0eSIgCi0JCQkJCQkJdmFsdWU9ImZhbHNlIi8+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJPC9pdGVyYXRlPgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9oYW5kbGVyPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+Ci0JCQotCQk8IS0tIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIEpBWEIgbWVudSAtLT4KLQkJPG1lbnVDb250cmlidXRpb24KLQkJCWxvY2F0aW9uVVJJPSJwb3B1cDpvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5tZW51LmpheGIiPgotCQkJCi0JCQk8IS0tIAotCQkJCSJBZGQgRWNsaXBzZUxpbmsgSkFYQiBwcm9wZXJ0eSIgbWVudSBpdGVtIGZvciBhbnkgSmF4YlBhY2thZ2UKLQkJCQl0aGF0IGRvZXMgbm90IGFscmVhZHkgaGF2ZSBvbmUKLQkJCS0tPgotCQkJPGNvbW1hbmQKLQkJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLmNvbW1hbmQuYWRkRWNsaXBzZUxpbmtKYXhiUHJvcGVydHkiPgotCQkJCTx2aXNpYmxlV2hlbj4KLQkJCQkJPHdpdGgKLQkJCQkJCXZhcmlhYmxlPSJzZWxlY3Rpb24iPgotCQkJCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiPgotCQkJCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2UiPgotCQkJCQkJCQk8dGVzdCAKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmhhc0VjbGlwc2VMaW5rSmF4YlByb3BlcnR5IiAKLQkJCQkJCQkJCXZhbHVlPSJmYWxzZSIvPgotCQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCQk8L2l0ZXJhdGU+Ci0JCQkJCTwvd2l0aD4KLQkJCQk8L3Zpc2libGVXaGVuPgotCQkJPC9jb21tYW5kPgotCQkJCi0JCTwvbWVudUNvbnRyaWJ1dGlvbj4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvQWN0aXZhdG9yLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWU4MTU4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0KLQlzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWN0aXZhdG9yLmNvbnRleHQgPSBidW5kbGVDb250ZXh0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWN0aXZhdG9yLmNvbnRleHQgPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9KcHRKYXhiRWNsaXBzZUxpbmtVaVBsdWdpbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9KcHRKYXhiRWNsaXBzZUxpbmtVaVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2I1ZDc2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvSnB0SmF4YkVjbGlwc2VMaW5rVWlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKcHRKYXhiRWNsaXBzZUxpbmtVaVBsdWdpbgotCQlleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpIjsKLQkKLQkKLQkvLyAqKioqKioqKioqIHNpbmdsZXRvbiAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBzdGF0aWMgSnB0SmF4YkVjbGlwc2VMaW5rVWlQbHVnaW4gSU5TVEFOQ0U7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIFBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnB0SmF4YkVjbGlwc2VMaW5rVWlQbHVnaW4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBlcnJvciBsb2dnaW5nICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIElOU1RBTkNFLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLSAgICAgICAgbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIG51bGwpKTsKLSAgICB9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgdGhyb3dhYmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgdGhyb3dhYmxlKSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogSW1hZ2UgQVBJICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkgewotCQlpZiAoISBrZXkuc3RhcnRzV2l0aCgiaWNvbnMvIikpIHsKLQkJCWtleSA9ICJpY29ucy8iICsga2V5OwotCQl9Ci0JCWlmICghIGtleS5lbmRzV2l0aCgiLmdpZiIpKSB7Ci0JCQlrZXkgPSBrZXkgKyAiLmdpZiI7Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBrZXkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBhbiBpbWFnZSBmb3IgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlcgotCSAqLwotCS8vVE9ETyB3ZSBhcmUgdXNpbmcgdGhlIEltYWdlUmVnaXN0cnkgaGVyZSBhbmQgc3RvcmluZyBhbGwgb3VyIGljb25zIGZvciB0aGUgbGlmZSBvZiB0aGUgcGx1Z2luLCAKLQkvL3doaWNoIG1lYW5zIHVudGlsIHRoZSB3b3Jrc3BhY2UgaXMgY2xvc2VkLiAgVGhpcyBpcyBiZXR0ZXIgdGhhbiBiZWZvcmUgd2hlcmUgd2UgY29uc3RhbnRseSAKLQkvL2NyZWF0ZWQgbmV3IGltYWdlcy4gQnVnIDMwNjQzNyBpcyBhYm91dCBjbGVhbmluZyB0aGlzIHVwIGFuZCB1c2luZyBMb2NhbCBSZXNvdXJjZSBNYW5hZ2VycyAKLQkvL29uIG91ciB2aWV3cyBzbyB0aGF0IGNsb3NpbmcgdGhlIEpQQSBwZXJzcGVjdGl2ZSB3b3VsZCBtZWFuIG91ciBpY29ucyBhcmUgZGlzcG9zZWQuCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IGluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCQlJbWFnZSBpbWFnZSA9IGltYWdlUmVnaXN0cnkuZ2V0KGtleSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlpbWFnZVJlZ2lzdHJ5LnB1dChrZXksIGdldEltYWdlRGVzY3JpcHRvcihrZXkpKTsKLQkJCWltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgSnB0SmF4YkVjbGlwc2VMaW5rVWlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChJTlNUQU5DRSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRUxKYXhiTWFwcGluZ0ltYWdlSGVscGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0VMSmF4Yk1hcHBpbmdJbWFnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzQwZGRjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRUxKYXhiTWFwcGluZ0ltYWdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5FTEpheGJNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS5KcHRKYXhiRWNsaXBzZUxpbmtVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5KYXhiTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXhiTWFwcGluZ0ltYWdlSGVscGVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIEltYWdlIGltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhTdHJpbmcgbWFwcGluZ0tleSkgewotCQlTdHJpbmcgaWNvbktleSA9IGljb25LZXlGb3JBdHRyaWJ1dGVNYXBwaW5nKG1hcHBpbmdLZXkpOwotCQlyZXR1cm4gKGljb25LZXkgPT0gbnVsbCkgPyAKLQkJCQlKYXhiTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhtYXBwaW5nS2V5KSAKLQkJCQk6IEpwdEpheGJFY2xpcHNlTGlua1VpUGx1Z2luLmdldEltYWdlKGljb25LZXkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpY29uS2V5Rm9yQXR0cmlidXRlTWFwcGluZyhTdHJpbmcgbWFwcGluZ0tleSkgewotCQlpZiAoRUxKYXhiTWFwcGluZ0tleXMuWE1MX0lOVkVSU0VfUkVGRVJFTkNFX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9PSBtYXBwaW5nS2V5KSB7Ci0JCQlyZXR1cm4gSnB0SmF4YkVjbGlwc2VMaW5rVWlJY29ucy5YTUxfSU5WRVJTRV9SRUZFUkVOQ0U7Ci0JCX0KLQkJZWxzZSBpZiAoRUxKYXhiTWFwcGluZ0tleXMuWE1MX0pPSU5fTk9ERVNfQVRUUklCVVRFX01BUFBJTkdfS0VZID09IG1hcHBpbmdLZXkpIHsKLQkJCXJldHVybiBKcHRKYXhiRWNsaXBzZUxpbmtVaUljb25zLlhNTF9KT0lOX05PREVTOwotCQl9Ci0JCWVsc2UgaWYgKEVMSmF4Yk1hcHBpbmdLZXlzLlhNTF9UUkFOU0ZPUk1BVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkuZXF1YWxzKG1hcHBpbmdLZXkpKSB7Ci0JCQlyZXR1cm4gSnB0SmF4YkVjbGlwc2VMaW5rVWlJY29ucy5YTUxfVFJBTlNGT1JNQVRJT047Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRUxKYXhiTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0VMSmF4Yk5hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmQ5NTAwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRUxKYXhiTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5qYXhiMjEuR2VuZXJpY0pheGJfMl8xX05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXhiTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci0JCWV4dGVuZHMgR2VuZXJpY0pheGJfMl8xX05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRUxKYXhiTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5IElOU1RBTkNFID0gbmV3IEVMSmF4Yk5hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpOwotCQotCQotCXB1YmxpYyBzdGF0aWMgR2VuZXJpY0pheGJfMl8xX05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQlwcml2YXRlIEVMSmF4Yk5hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZW1FeHRlbmRlZExhYmVsUHJvdmlkZXIgYnVpbGRQcm92aWRlcihPYmplY3QgaXRlbSwgSXRlbUV4dGVuZGVkTGFiZWxQcm92aWRlci5NYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCi0JCWlmIChpdGVtIGluc3RhbmNlb2YgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJCXJldHVybiBuZXcgRUxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyKChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSkgaXRlbSwgbWFuYWdlcik7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5idWlsZFByb3ZpZGVyKGl0ZW0sIG1hbmFnZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRUxKYXhiTmF2aWdhdG9yVWkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRUxKYXhiTmF2aWdhdG9yVWkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhOWNmYS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0VMSmF4Yk5hdmlnYXRvclVpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5qYXhiMjEuR2VuZXJpY0pheGJfMl8xX05hdmlnYXRvclVpOwotCi0KLXB1YmxpYyBjbGFzcyBFTEpheGJOYXZpZ2F0b3JVaQotCQlleHRlbmRzIEdlbmVyaWNKYXhiXzJfMV9OYXZpZ2F0b3JVaSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRUxKYXhiTmF2aWdhdG9yVWkgSU5TVEFOQ0UgPSBuZXcgRUxKYXhiTmF2aWdhdG9yVWkoKTsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIEVMSmF4Yk5hdmlnYXRvclVpIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCXByaXZhdGUgRUxKYXhiTmF2aWdhdG9yVWkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVtRXh0ZW5kZWRMYWJlbFByb3ZpZGVyRmFjdG9yeSBnZXRJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBFTEpheGJOYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuaW5zdGFuY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0VMSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9FTEpheGJQZXJzaXN0ZW50QXR0cmlidXRlSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEzYjQ3Yi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0VMSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmpheGIyMS5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyCi0JZXh0ZW5kcyBKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JcHVibGljIEVMSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtTGFiZWxQcm92aWRlcihKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIEl0ZW1MYWJlbFByb3ZpZGVyLk1hbmFnZXIgbWFuYWdlcikgewotCQlzdXBlcihhdHRyaWJ1dGUsIG1hbmFnZXIpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSW1hZ2UgYnVpbGRJbWFnZShTdHJpbmcgbWFwcGluZ0tleSkgewotCQlyZXR1cm4gRUxKYXhiTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhtYXBwaW5nS2V5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0pwdEpheGJFY2xpcHNlTGlua1VpSWNvbnMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvSnB0SmF4YkVjbGlwc2VMaW5rVWlJY29ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWU0ZmFhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvSnB0SmF4YkVjbGlwc2VMaW5rVWlJY29ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS5pbnRlcm5hbDsKLQotCi1wdWJsaWMgY2xhc3MgSnB0SmF4YkVjbGlwc2VMaW5rVWlJY29ucyB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0lOVkVSU0VfUkVGRVJFTkNFID0gImZ1bGwvb2JqMTYveG1sLWludmVyc2UtcmVmZXJlbmNlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfSk9JTl9OT0RFUyA9ICJmdWxsL29iajE2L3htbC1qb2luLW5vZGVzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVFJBTlNGT1JNQVRJT04gPSAiZnVsbC9vYmoxNi94bWwtdHJhbnNmb3JtYXRpb24iOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRFY2xpcHNlTGlua0pheGJQcm9wZXJ0eUNvbW1hbmRIYW5kbGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEVjbGlwc2VMaW5rSmF4YlByb3BlcnR5Q29tbWFuZEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiZDYwMC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEVjbGlwc2VMaW5rSmF4YlByb3BlcnR5Q29tbWFuZEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF4YnByb3BzLkpheGJQcm9wZXJ0aWVzUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkuSnB0SmF4YkVjbGlwc2VMaW5rVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuSnB0SmF4YlVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5VSUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ld3Jlc291cmNlLkJhc2ljTmV3UmVzb3VyY2VXaXphcmQ7Ci0KLQotcHVibGljIGNsYXNzIEFkZEVjbGlwc2VMaW5rSmF4YlByb3BlcnR5Q29tbWFuZEhhbmRsZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IAotCQkJKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uQ2hlY2tlZChldmVudCk7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgYWN0aXZlV2luZG93ID0gSGFuZGxlclV0aWwuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KGV2ZW50KTsKLQkJCi0JCWZvciAoSXRlcmF0b3Igc3RyZWFtID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJYWRkRWNsaXBzZUxpbmtKYXhiUHJvcGVydHkoc3RyZWFtLm5leHQoKSwgYWN0aXZlV2luZG93KTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEVjbGlwc2VMaW5rSmF4YlByb3BlcnR5KE9iamVjdCBzZWxlY3RlZE9iamVjdCwgSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXaW5kb3cpIHsKLQkJSmF4YlBhY2thZ2UgamF4YlBhY2thZ2UgPSAKLQkJCQkoSmF4YlBhY2thZ2UpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcihzZWxlY3RlZE9iamVjdCwgSmF4YlBhY2thZ2UuY2xhc3MpOwotCQkKLQkJSmF4YlByb3BlcnRpZXNSZXNvdXJjZSBqYXhiUHJvcGVydGllcyA9IGpheGJQYWNrYWdlLmdldEpheGJQcm9qZWN0KCkuZ2V0SmF4YlByb3BlcnRpZXNSZXNvdXJjZShqYXhiUGFja2FnZS5nZXROYW1lKCkpOwotCQkKLQkJaWYgKGpheGJQcm9wZXJ0aWVzID09IG51bGwpIHsKLQkJCWNyZWF0ZUpheGJQcm9wZXJ0aWVzV2l0aFByb3BlcnR5KGpheGJQYWNrYWdlLCBhY3RpdmVXaW5kb3cpOwotCQl9Ci0JCWVsc2UgewotCQkJYWRkUHJvcGVydHlUb0V4aXN0aW5nUHJvcGVydGllcyhqYXhiUGFja2FnZSwgYWN0aXZlV2luZG93KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVKYXhiUHJvcGVydGllc1dpdGhQcm9wZXJ0eSgKLQkJCWZpbmFsIEpheGJQYWNrYWdlIGpheGJQYWNrYWdlLCBmaW5hbCBJV29ya2JlbmNoV2luZG93IGFjdGl2ZVdpbmRvdykgewotCQlmaW5hbCBJRm9sZGVyIGZvbGRlcjsKLQkJdHJ5IHsKLQkJCWZvbGRlciA9IGdldEZvbGRlcihqYXhiUGFja2FnZSk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCUpwdEpheGJFY2xpcHNlTGlua1VpUGx1Z2luLmxvZyhqbWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUpvYiBqb2IgPSBuZXcgSm9iKCJDcmVhdGluZyBqYXhiLnByb3BlcnRpZXMiKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQlJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoImpheGIucHJvcGVydGllcyIpOwotCQkJCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBjcmVhdGVJbnB1dFN0cmVhbShjcmVhdGVOZXdQcm9wZXJ0aWVzKCkpOwotCQkJCQl0cnkgewotCQkJCQkJZmlsZS5jcmVhdGUoc3RyZWFtLCB0cnVlLCBudWxsKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQkJSnB0SmF4YkVjbGlwc2VMaW5rVWlQbHVnaW4ubG9nKGNlKTsKLQkJCQkJCXJldHVybiBuZXcgU3RhdHVzKFN0YXR1cy5FUlJPUiwgSnB0SmF4YkVjbGlwc2VMaW5rVWlQbHVnaW4uUExVR0lOX0lELCAiQ291bGQgbm90IGNyZWF0ZSBqYXhiLnByb3BlcnRpZXMuIik7Ci0JCQkJCX0KLQkJCQkJQWRkRWNsaXBzZUxpbmtKYXhiUHJvcGVydHlDb21tYW5kSGFuZGxlci50aGlzLnJldmVhbEFuZE9wZW5GaWxlKGZpbGUsIGFjdGl2ZVdpbmRvdyk7Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KLQkJCX07Ci0JCWpvYi5zZXRSdWxlKGZvbGRlcik7Ci0JCWpvYi5zY2hlZHVsZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eVRvRXhpc3RpbmdQcm9wZXJ0aWVzKAotCQkJZmluYWwgSmF4YlBhY2thZ2UgamF4YlBhY2thZ2UsIGZpbmFsIElXb3JrYmVuY2hXaW5kb3cgYWN0aXZlV2luZG93KSB7Ci0JCWZpbmFsIElGb2xkZXIgZm9sZGVyOwotCQl0cnkgewotCQkJZm9sZGVyID0gZ2V0Rm9sZGVyKGpheGJQYWNrYWdlKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJSnB0SmF4YkVjbGlwc2VMaW5rVWlQbHVnaW4ubG9nKGptZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSm9iIGpvYiA9IG5ldyBKb2IoIkFkZGluZyBwcm9wZXJ0eSB0byBqYXhiLnByb3BlcnRpZXMuIikgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJqYXhiLnByb3BlcnRpZXMiKTsKLQkJCQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbG9hZFByb3BlcnRpZXMoZmlsZSk7Ci0JCQkJCWlmIChwcm9wZXJ0aWVzID09IG51bGwpIHsKLQkJCQkJCXJldHVybiBuZXcgU3RhdHVzKFN0YXR1cy5FUlJPUiwgSnB0SmF4YkVjbGlwc2VMaW5rVWlQbHVnaW4uUExVR0lOX0lELCAiQ291bGQgbm90IGxvYWQgamF4Yi5wcm9wZXJ0aWVzLiIpOwotCQkJCQl9Ci0JCQkJCWFkanVzdFByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0JCQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IGNyZWF0ZUlucHV0U3RyZWFtKHByb3BlcnRpZXMpOwotCQkJCQl0cnkgewotCQkJCQkJZmlsZS5zZXRDb250ZW50cyhzdHJlYW0sIHRydWUsIHRydWUsIG51bGwpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCQlKcHRKYXhiRWNsaXBzZUxpbmtVaVBsdWdpbi5sb2coY2UpOwotCQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoU3RhdHVzLkVSUk9SLCBKcHRKYXhiRWNsaXBzZUxpbmtVaVBsdWdpbi5QTFVHSU5fSUQsICJDb3VsZCBub3Qgd3JpdGUgdG8gamF4Yi5wcm9wZXJ0aWVzLiIpOwotCQkJCQl9Ci0JCQkJCUFkZEVjbGlwc2VMaW5rSmF4YlByb3BlcnR5Q29tbWFuZEhhbmRsZXIudGhpcy5yZXZlYWxBbmRPcGVuRmlsZShmaWxlLCBhY3RpdmVXaW5kb3cpOwotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQl9Ci0JCQl9OwotCQlqb2Iuc2V0UnVsZShmb2xkZXIpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElGb2xkZXIgZ2V0Rm9sZGVyKEpheGJQYWNrYWdlIGpheGJQYWNrYWdlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhY2thZ2VGcmFnbWVudCBqZHRQYWNrYWdlID0gCi0JCQkoSVBhY2thZ2VGcmFnbWVudCkgQ29sbGVjdGlvblRvb2xzLmdldCgKLQkJCQkJamF4YlBhY2thZ2UuZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcyhqYXhiUGFja2FnZSksIDApLgotCQkJCQkJCWdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoKS5nZXRDb21waWxhdGlvblVuaXQoKS5nZXRQYXJlbnQoKTsKLQkJcmV0dXJuIChJRm9sZGVyKSBqZHRQYWNrYWdlLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydGllcyBjcmVhdGVOZXdQcm9wZXJ0aWVzKCkgewotCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQlhZGp1c3RQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnRpZXMgbG9hZFByb3BlcnRpZXMoSUZpbGUgZmlsZSkgewotCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJcHJvcGVydGllcy5sb2FkKGZpbGUuZ2V0Q29udGVudHMoKSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJSnB0SmF4YkVjbGlwc2VMaW5rVWlQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJY2xvc2VTdHJlYW0oc3RyZWFtKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRqdXN0UHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJU3RyaW5nIGZhY3RvcnlQcm9wID0gImphdmF4LnhtbC5iaW5kLmNvbnRleHQuZmFjdG9yeSI7Ci0JCVN0cmluZyBmYWN0b3J5UHJvcFZhbHVlID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuSkFYQkNvbnRleHRGYWN0b3J5IjsKLQkJcHJvcGVydGllcy5zZXRQcm9wZXJ0eShmYWN0b3J5UHJvcCwgZmFjdG9yeVByb3BWYWx1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBjcmVhdGVJbnB1dFN0cmVhbShQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJdHJ5IHsKLQkJCXByb3BlcnRpZXMuc3RvcmUob3V0U3RyZWFtLCBudWxsKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUpwdEpheGJDb3JlUGx1Z2luLmxvZyhlKTsKLQkJCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJY2xvc2VTdHJlYW0ob3V0U3RyZWFtKTsKLQkJfQotCQkKLQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXRTdHJlYW0udG9CeXRlQXJyYXkoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNsb3NlU3RyZWFtKENsb3NlYWJsZSBzdHJlYW0pIHsKLQkJdHJ5IHsKLQkJCWlmIChzdHJlYW0gIT0gbnVsbCkgewotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJSnB0SmF4YkVjbGlwc2VMaW5rVWlQbHVnaW4ubG9nKGV4KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZXZlYWxBbmRPcGVuRmlsZSgKLQkJCWZpbmFsIElGaWxlIGZpbGUsIGZpbmFsIElXb3JrYmVuY2hXaW5kb3cgYWN0aXZlV2luZG93KSB7Ci0JCUpvYiBqb2IgPSBuZXcgVUlKb2IoIk9wZW5pbmcgamF4Yi5wcm9wZXJ0aWVzLiIpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQlCYXNpY05ld1Jlc291cmNlV2l6YXJkLnNlbGVjdEFuZFJldmVhbChmaWxlLCBhY3RpdmVXaW5kb3cpOwotCQkJCQl0cnkgewotCQkJCQkJSURFLm9wZW5FZGl0b3IoYWN0aXZlV2luZG93LmdldEFjdGl2ZVBhZ2UoKSwgZmlsZSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkgewotCQkJCQkJSnB0SmF4YlVpUGx1Z2luLmxvZyhwaWUpOwotCQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoU3RhdHVzLkVSUk9SLCBKcHRKYXhiRWNsaXBzZUxpbmtVaVBsdWdpbi5QTFVHSU5fSUQsICJDb3VsZCBub3Qgb3BlbiBqYXhiLnByb3BlcnRpZXMgaW4gZWRpdG9yLiIpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KLQkJCX07Ci0JCWpvYi5zZXRSdWxlKGZpbGUuZ2V0UGFyZW50KCkpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzEvRUxKYXhiXzJfMV9QbGF0Zm9ybVVpLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzEvRUxKYXhiXzJfMV9QbGF0Zm9ybVVpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYWEzMGMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8xL0VMSmF4Yl8yXzFfUGxhdGZvcm1VaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuamF4YjIxLkdlbmVyaWNKYXhiXzJfMV9OYXZpZ2F0b3JVaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5uYXZpZ2F0b3IuSmF4Yk5hdmlnYXRvclVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLnBsYXRmb3JtLkpheGJQbGF0Zm9ybVVpOwotCi0KLXB1YmxpYyBjbGFzcyBFTEpheGJfMl8xX1BsYXRmb3JtVWkKLQkJaW1wbGVtZW50cyBKYXhiUGxhdGZvcm1VaSB7Ci0JCi0JcHVibGljIEpheGJOYXZpZ2F0b3JVaSBnZXROYXZpZ2F0b3JVaSgpIHsKLQkJcmV0dXJuIEdlbmVyaWNKYXhiXzJfMV9OYXZpZ2F0b3JVaS5pbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMi9FTEpheGJfMl8yX1BsYXRmb3JtVWkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMi9FTEpheGJfMl8yX1BsYXRmb3JtVWkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjczNzk4Mi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzIvRUxKYXhiXzJfMl9QbGF0Zm9ybVVpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FTEpheGJOYXZpZ2F0b3JVaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5uYXZpZ2F0b3IuSmF4Yk5hdmlnYXRvclVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLnBsYXRmb3JtLkpheGJQbGF0Zm9ybVVpOwotCi0KLXB1YmxpYyBjbGFzcyBFTEpheGJfMl8yX1BsYXRmb3JtVWkKLQkJaW1wbGVtZW50cyBKYXhiUGxhdGZvcm1VaSB7Ci0JCi0JcHVibGljIEpheGJOYXZpZ2F0b3JVaSBnZXROYXZpZ2F0b3JVaSgpIHsKLQkJcmV0dXJuIEVMSmF4Yk5hdmlnYXRvclVpLmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8zL0VMSmF4Yl8yXzNfUGxhdGZvcm1VaS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8zL0VMSmF4Yl8yXzNfUGxhdGZvcm1VaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmM5YzRmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMy9FTEpheGJfMl8zX1BsYXRmb3JtVWkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVMSmF4Yk5hdmlnYXRvclVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLm5hdmlnYXRvci5KYXhiTmF2aWdhdG9yVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkucGxhdGZvcm0uSmF4YlBsYXRmb3JtVWk7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF4Yl8yXzNfUGxhdGZvcm1VaQotCQlpbXBsZW1lbnRzIEpheGJQbGF0Zm9ybVVpIHsKLQkKLQlwdWJsaWMgSmF4Yk5hdmlnYXRvclVpIGdldE5hdmlnYXRvclVpKCkgewotCQlyZXR1cm4gRUxKYXhiTmF2aWdhdG9yVWkuaW5zdGFuY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzQvRUxKYXhiXzJfNF9QbGF0Zm9ybVVpLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzQvRUxKYXhiXzJfNF9QbGF0Zm9ybVVpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyY2I3ZmYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml80L0VMSmF4Yl8yXzRfUGxhdGZvcm1VaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml80OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRUxKYXhiTmF2aWdhdG9yVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkubmF2aWdhdG9yLkpheGJOYXZpZ2F0b3JVaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1VaTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXhiXzJfNF9QbGF0Zm9ybVVpCi0JCWltcGxlbWVudHMgSmF4YlBsYXRmb3JtVWkgewotCQotCXB1YmxpYyBKYXhiTmF2aWdhdG9yVWkgZ2V0TmF2aWdhdG9yVWkoKSB7Ci0JCXJldHVybiBFTEpheGJOYXZpZ2F0b3JVaS5pbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy8uY2xhc3NwYXRoIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MTMxY2EuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvLmN2c2lnbm9yZSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvLnByb2plY3QgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYmVkN2YuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI4NGI1Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDc6MzYgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZWNkMGQuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLURhbGktQ29tbWVudDogamRrIDEuNiBoYXMgdGhlIGphdmF4LnhtbC5iaW5kIGFubm90YXRpb25zCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuNgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5KcHRKYXhiQ29yZVRlc3RzUGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy42LjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNi4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHM7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjQuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjIuMTAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjQuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UueHNkO2J1bmRsZS12ZXJzaW9uPSJbMi42LjAsMy4wLjApIiwKLSBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249Ils0LjAuMCw1LjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9hYm91dC5odG1sIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkMjliYy4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFhMGI2My4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIENvcmUgVGVzdHMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL0pwdEpheGJDb3JlVGVzdHNQbHVnaW4uamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9KcHRKYXhiQ29yZVRlc3RzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYjMzOWMuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL0pwdEpheGJDb3JlVGVzdHNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQcm9qZWN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucHJlZnMuSmF4YlByZWZlcmVuY2VzTWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBjb25maWd1cmUgdGhlIGNvcmUgdG8gaGFuZGxlIGV2ZW50cyBzeW5jaHJvbm91c2x5IHdoZW4gd2UgYXJlCi0gKiBydW5uaW5nIHRlc3RzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpwdEpheGJDb3JlVGVzdHNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JcHJpdmF0ZSBzdGF0aWMgSnB0SmF4YkNvcmVUZXN0c1BsdWdpbiBJTlNUQU5DRTsKLQotCXB1YmxpYyBzdGF0aWMgSnB0SmF4YkNvcmVUZXN0c1BsdWdpbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwbHVnLWluIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBKcHRKYXhiQ29yZVRlc3RzUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoSU5TVEFOQ0UgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIHRoaXMgY29udmVudGlvbiBpcyAqd2FjayouLi4gIH5ianYKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCUpheGJQcm9qZWN0TWFuYWdlciBqYXhiUHJvamVjdE1hbmFnZXIgPSBKcHRKYXhiQ29yZVBsdWdpbi5nZXRQcm9qZWN0TWFuYWdlcigpOwotCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChqYXhiUHJvamVjdE1hbmFnZXIsICJoYW5kbGVFdmVudHNTeW5jaHJvbm91c2x5Iik7Ci0JCVJlZmxlY3Rpb25Ub29scy5leGVjdXRlU3RhdGljTWV0aG9kKEpheGJQcmVmZXJlbmNlc01hbmFnZXIuY2xhc3MsICJkb05vdEZsdXNoUHJlZmVyZW5jZXMiKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvSmF4YkNvcmVUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL0pheGJDb3JlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyZGY0MC4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvSmF4YkNvcmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpheGJDb3JlQ29udGV4dE1vZGVsVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF4YlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5KYXhiQ29yZVJlc291cmNlTW9kZWxUZXN0czsKLQotcHVibGljIGNsYXNzIEpheGJDb3JlVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpheGJDb3JlVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTY2hlbWFMaWJyYXJ5VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0KEpheGJDb3JlUmVzb3VyY2VNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpheGJDb3JlQ29udGV4dE1vZGVsVGVzdHMuc3VpdGUoKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlcXVpcmVkSmFyc0V4aXN0cygpIHsKLQkJcmV0dXJuIGpheGJKYXJQcm9wZXJ0eUV4aXN0cygpICYmIGpheGJKYXJGaWxlRXhpc3RzKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBqYXhiSmFyUHJvcGVydHlFeGlzdHMoKSB7Ci0JCXJldHVybiBnZXRTeXN0ZW1Qcm9wZXJ0eShUZXN0SmF4YlByb2plY3QuSkFYQl9KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkpICE9IG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBqYXhiSmFyRmlsZUV4aXN0cygpIHsKLQkJcmV0dXJuIChuZXcgRmlsZShnZXRTeXN0ZW1Qcm9wZXJ0eShUZXN0SmF4YlByb2plY3QuSkFYQl9KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkpKSkuZXhpc3RzKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkTWlzc2luZ0phckVycm9yTWVzc2FnZSgpIHsKLQkJaWYoICEgamF4YkphclByb3BlcnR5RXhpc3RzKCkpIHsKLQkJCXJldHVybiBlcnJvck1pc3NpbmdQcm9wZXJ0eShUZXN0SmF4YlByb2plY3QuSkFYQl9KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkpOwotCQl9Ci0JCXJldHVybiBlcnJvckphckZpbGVEb2VzTm90RXhpc3QoZ2V0U3lzdGVtUHJvcGVydHkoVGVzdEpheGJQcm9qZWN0LkpBWEJfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZKSk7Ci0JfQotCQotCS8qKioqKioqKioqKiBwcml2YXRlICoqKioqKioqKiovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVycm9yTWlzc2luZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuICJtaXNzaW5nIEphdmEgc3lzdGVtIHByb3BlcnR5OiBcIiIgKyBwcm9wZXJ0eU5hbWUgKyAiXCIiOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXJyb3JKYXJGaWxlRG9lc05vdEV4aXN0KFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0JCXJldHVybiAiSkFSIGZpbGUgZG9lc24ndCBleGlzdDogXCIiICsgcHJvcGVydHlWYWx1ZSArICJcIiI7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTeXN0ZW1Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBKYXhiQ29yZVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvSmF4YlRlc3RDYXNlLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvSmF4YlRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMjExN2YuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL0pheGJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGlvblRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KcHRKYXhiQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmZhY2V0LkpheGJGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5mYWNldC5KYXhiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXhiUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBKYXhiVGVzdENhc2UKLQkJZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfUFJPSkVDVF9OQU1FID0gIkpheGJUZXN0UHJvamVjdCI7Ci0JCi0JcHJvdGVjdGVkIEpheGJUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRlc3RKYXZhUHJvamVjdCBidWlsZEphdmFQcm9qZWN0KGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGJ1aWxkSmF4YlByb2plY3QoQkFTRV9QUk9KRUNUX05BTUUsIGF1dG9CdWlsZCwgYnVpbGRKYXhiRmFjZXRJbnN0YWxsQ29uZmlnKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGVzdEpheGJQcm9qZWN0IGJ1aWxkSmF4YlByb2plY3QoCi0JCQlTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkLCBJRGF0YU1vZGVsIGpheGJDb25maWcpIAotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBUZXN0SmF4YlByb2plY3QuYnVpbGRKYXhiUHJvamVjdChwcm9qZWN0TmFtZSwgYXV0b0J1aWxkLCBqYXhiQ29uZmlnKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgYnVpbGRKYXhiRmFjZXRJbnN0YWxsQ29uZmlnKCkgewotCQlJRGF0YU1vZGVsIGNvbmZpZyA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBKYXhiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIoKSk7CQkKLQkJY29uZmlnLnNldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTiwgZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KEpheGJGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuUExBVEZPUk0sIGdldFBsYXRmb3JtKCkpOwotCQlyZXR1cm4gY29uZmlnOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0UGxhdGZvcm0oKSB7Ci0JCXJldHVybiBKcHRKYXhiQ29yZVBsdWdpbi5nZXREZWZhdWx0UGxhdGZvcm0oZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElQcm9qZWN0RmFjZXRWZXJzaW9uIGdldFByb2plY3RGYWNldFZlcnNpb24oKSB7Ci0JCXJldHVybiBKYXhiRmFjZXQuVkVSU0lPTl8yXzE7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUZXN0SmF4YlByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiAoVGVzdEpheGJQcm9qZWN0KSBzdXBlci5nZXRKYXZhUHJvamVjdCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlByb2plY3QgZ2V0SmF4YlByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLmdldEphdmFQcm9qZWN0KCkuZ2V0SmF4YlByb2plY3QoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUF0dHJpYnV0ZSBnZXRGaWVsZE5hbWVkKEphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlLCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlmb3IgKEphdmFSZXNvdXJjZUF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkpIHsKLQkJCWlmIChhdHRyaWJ1dGUuZ2V0TmFtZSgpLmVxdWFscyhhdHRyaWJ1dGVOYW1lKSkgewotCQkJCXJldHVybiBhdHRyaWJ1dGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL1NjaGVtYUxpYnJhcnlUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL1NjaGVtYUxpYnJhcnlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWNmM2VlLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9TY2hlbWFMaWJyYXJ5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkU2NoZW1hOwotCi0KLQotcHVibGljIGNsYXNzIFNjaGVtYUxpYnJhcnlUZXN0cwotCQlleHRlbmRzIEpheGJUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFNjaGVtYUxpYnJhcnlUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JLy8gdGVzdHMgc2NoZW1hIGZvciBuYW1lc3BhY2UgdGhhdCBpcyBzZXQgaW4gY2F0YWxvZywgYnV0IG5vdCBpbiBwcm9qZWN0IHByb3BlcnRpZXMKLQlwdWJsaWMgdm9pZCB0ZXN0VW5zZXROYW1lc3BhY2UoKSB7Ci0JCVN0cmluZyBuYW1lc3BhY2UgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI7Ci0JCQotCQkvLyB0ZXN0IGluaXRpYWwgbG9hZAotCQlYc2RTY2hlbWEgc2NoZW1hID0gZ2V0SmF4YlByb2plY3QoKS5nZXRTY2hlbWFMaWJyYXJ5KCkuZ2V0U2NoZW1hKG5hbWVzcGFjZSk7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hKTsKLQkJCi0JCS8vIHRlc3QgY2FjaGVkIGxvYWQKLQkJc2NoZW1hID0gZ2V0SmF4YlByb2plY3QoKS5nZXRTY2hlbWFMaWJyYXJ5KCkuZ2V0U2NoZW1hKG5hbWVzcGFjZSk7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hKTsKLQkJCi0JCS8vIHRlc3QgdW5sb2FkL3JlbG9hZAotCQlzY2hlbWEuZ2V0WFNEQ29tcG9uZW50KCkuZVJlc291cmNlKCkudW5sb2FkKCk7Ci0JCXNjaGVtYSA9IGdldEpheGJQcm9qZWN0KCkuZ2V0U2NoZW1hTGlicmFyeSgpLmdldFNjaGVtYShuYW1lc3BhY2UpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYSk7Ci0JfQotCQotCS8vIHRlc3RzIHNjaGVtYSBmb3IgcmVnaXN0ZXJlZCB1cmkgdGhhdCBpcyBzZXQgaW4gcHJvamVjdCBwcm9wZXJ0aWVzIChuYW1lc3BhY2Ugbm90IHJlZ2lzdGVyZWQgaW4gY2F0YWxvZykKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVnaXN0ZXJlZFVyaVVucmVnaXN0ZXJlZE5hbWVzcGFjZSgpIHsKLQkJU3RyaW5nIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm0iOwotCQkKLQkJLy8gc2V0IG5hbWVzcGFjZSBpbiBwcm9qZWN0IHByb3BlcnRpZXNcCi0JCUxpc3Q8U3RyaW5nPiBzY2hlbWFMb2NhdGlvbnMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJc2NoZW1hTG9jYXRpb25zLmFkZCgiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtXzJfMC54c2QiKTsKLQkJZ2V0SmF4YlByb2plY3QoKS5nZXRTY2hlbWFMaWJyYXJ5KCkuc2V0U2NoZW1hTG9jYXRpb25zKHNjaGVtYUxvY2F0aW9ucyk7Ci0JCQotCQkvLyB0ZXN0IGluaXRpYWwgbG9hZAotCQlYc2RTY2hlbWEgc2NoZW1hID0gZ2V0SmF4YlByb2plY3QoKS5nZXRTY2hlbWFMaWJyYXJ5KCkuZ2V0U2NoZW1hKG5hbWVzcGFjZSk7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hKTsKLQkJCi0JCS8vIHRlc3QgY2FjaGVkIGxvYWQKLQkJc2NoZW1hID0gZ2V0SmF4YlByb2plY3QoKS5nZXRTY2hlbWFMaWJyYXJ5KCkuZ2V0U2NoZW1hKG5hbWVzcGFjZSk7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hKTsKLQkJCi0JCS8vIHRlc3QgdW5sb2FkL3JlbG9hZAotCQlzY2hlbWEuZ2V0WFNEQ29tcG9uZW50KCkuZVJlc291cmNlKCkudW5sb2FkKCk7Ci0JCXNjaGVtYSA9IGdldEpheGJQcm9qZWN0KCkuZ2V0U2NoZW1hTGlicmFyeSgpLmdldFNjaGVtYShuYW1lc3BhY2UpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYSk7Ci0JfQotCQotCS8vIHRlc3RzIHNjaGVtYSBmb3IgcmVnaXN0ZXJkIHVyaSB0aGF0IGlzIHNldCBpbiBwcm9qZWN0IHByb3BlcnRpZXMgKG5hbWVzcGFjZSBhbHJlYWR5IHJlZ2lzdGVyZWQgaW4gY2F0YWxvZykKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVnaXN0ZXJlZFVyaVJlZ2lzdGVyZWROYW1lc3BhY2UoKSB7Ci0JCVN0cmluZyBuYW1lc3BhY2UgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSI7Ci0JCQotCQkvLyBzZXQgbmFtZXNwYWNlIGluIHByb2plY3QgcHJvcGVydGllc1wKLQkJTGlzdDxTdHJpbmc+IHNjaGVtYUxvY2F0aW9ucyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQlzY2hlbWFMb2NhdGlvbnMuYWRkKCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfb3JtXzFfMC54c2QiKTsKLQkJZ2V0SmF4YlByb2plY3QoKS5nZXRTY2hlbWFMaWJyYXJ5KCkuc2V0U2NoZW1hTG9jYXRpb25zKHNjaGVtYUxvY2F0aW9ucyk7Ci0JCQotCQkvLyB0ZXN0IGluaXRpYWwgbG9hZAotCQlYc2RTY2hlbWEgc2NoZW1hID0gZ2V0SmF4YlByb2plY3QoKS5nZXRTY2hlbWFMaWJyYXJ5KCkuZ2V0U2NoZW1hKG5hbWVzcGFjZSk7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hKTsKLQkJCi0JCS8vIHRlc3QgY2FjaGVkIGxvYWQKLQkJc2NoZW1hID0gZ2V0SmF4YlByb2plY3QoKS5nZXRTY2hlbWFMaWJyYXJ5KCkuZ2V0U2NoZW1hKG5hbWVzcGFjZSk7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hKTsKLQkJCi0JCS8vIHRlc3QgdW5sb2FkL3JlbG9hZAotCQlzY2hlbWEuZ2V0WFNEQ29tcG9uZW50KCkuZVJlc291cmNlKCkudW5sb2FkKCk7Ci0JCXNjaGVtYSA9IGdldEpheGJQcm9qZWN0KCkuZ2V0U2NoZW1hTGlicmFyeSgpLmdldFNjaGVtYShuYW1lc3BhY2UpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYSk7Ci0JfQotCQotCS8vIHRlc3RzIHNjaGVtYSBmb3IgdW5yZWdpc3RlcmVkIHVyaSB0aGF0IGlzIHNldCBpbiBwcm9qZWN0IHByb3BlcnRpZXMgKGxvY2FsIGZpbGUpCi0JcHVibGljIHZvaWQgdGVzdFNldFVucmVnaXN0ZXJkVXJpKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlGaWxlIHNjaGVtYUZpbGUgPSBnZXRKYXhiUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGaWxlKG5ldyBQYXRoKCJjdXN0b21lci54c2QiKSk7Ci0JCVN0cmluZyBjb250ZW50cyA9IAotCQkJCSI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iCi0JCQkJKyAiPHhzOnNjaGVtYSB4bWxuczp4cz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCIiCi0JCQkJKyAiIHRhcmdldE5hbWVzcGFjZT1cImh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvY3VzdG9tZXItZXhhbXBsZVwiPiIKLQkJCQkrICI8L3hzOnNjaGVtYT4iOwotCQlzY2hlbWFGaWxlLmNyZWF0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29udGVudHMuZ2V0Qnl0ZXMoKSksIHRydWUsIG51bGwpOwotCQkKLQkJU3RyaW5nIG5hbWVzcGFjZSA9ICJodHRwOi8vd3d3LmV4YW1wbGUub3JnL2N1c3RvbWVyLWV4YW1wbGUiOwotCQkKLQkJLy8gc2V0IG5hbWVzcGFjZSBpbiBwcm9qZWN0IHByb3BlcnRpZXNcCi0JCUxpc3Q8U3RyaW5nPiBzY2hlbWFMb2NhdGlvbnMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJc2NoZW1hTG9jYXRpb25zLmFkZCgicGxhdGZvcm06L3Jlc291cmNlLyIgKyBCQVNFX1BST0pFQ1RfTkFNRSArICIvY3VzdG9tZXIueHNkIik7Ci0JCWdldEpheGJQcm9qZWN0KCkuZ2V0U2NoZW1hTGlicmFyeSgpLnNldFNjaGVtYUxvY2F0aW9ucyhzY2hlbWFMb2NhdGlvbnMpOwotCQkKLQkJLy8gdGVzdCBpbml0aWFsIGxvYWQKLQkJWHNkU2NoZW1hIHNjaGVtYSA9IGdldEpheGJQcm9qZWN0KCkuZ2V0U2NoZW1hTGlicmFyeSgpLmdldFNjaGVtYShuYW1lc3BhY2UpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYSk7Ci0JCQotCQkvLyB0ZXN0IGNhY2hlZCBsb2FkCi0JCXNjaGVtYSA9IGdldEpheGJQcm9qZWN0KCkuZ2V0U2NoZW1hTGlicmFyeSgpLmdldFNjaGVtYShuYW1lc3BhY2UpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYSk7Ci0JCQotCQkvLyB0ZXN0IHVubG9hZC9yZWxvYWQKLQkJc2NoZW1hLmdldFhTRENvbXBvbmVudCgpLmVSZXNvdXJjZSgpLnVubG9hZCgpOwotCQlzY2hlbWEgPSBnZXRKYXhiUHJvamVjdCgpLmdldFNjaGVtYUxpYnJhcnkoKS5nZXRTY2hlbWEobmFtZXNwYWNlKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0dlbmVyaWNDb250ZXh0Um9vdFRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9HZW5lcmljQ29udGV4dFJvb3RUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTVhNWVmLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0dlbmVyaWNDb250ZXh0Um9vdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0NvbnRleHRSb290VGVzdHMKLQkJZXh0ZW5kcyBKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBHZW5lcmljQ29udGV4dFJvb3RUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yT3JkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0UGFja2FnZUluZm8oCi0JCQkJIkBYbWxBY2Nlc3Nvck9yZGVyKHZhbHVlID0gWG1sQWNjZXNzT3JkZXIuQUxQSEFCRVRJQ0FMKSIsCi0JCQkJSkFYQi5YTUxfQUNDRVNTX09SREVSLCBKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUik7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDbGFzc1dpdGhYbWxUeXBlQW5kU3VwZXJjbGFzc05hbWVkKGZpbmFsIFN0cmluZyBzdXBlcmNsYXNzTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIHN1cGVyY2xhc3NOYW1lKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDbGFzc1dpdGhYbWxUeXBlQW5kQXR0cmlidXRlKAotCQkJZmluYWwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGZpbmFsIFN0cmluZyB0eXBlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmROYW1lRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgicHVibGljICIgKyB0eXBlTmFtZSArICIgIiArIGF0dHJpYnV0ZU5hbWUgKyAiOyIgKyBDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDbGFzc1dpdGhYbWxUeXBlQW5kTGlzdEF0dHJpYnV0ZSgKLQkJCWZpbmFsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBmaW5hbCBTdHJpbmcgdHlwZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oImphdmEudXRpbC5MaXN0IiwgSkFYQi5YTUxfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kTmFtZUZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBMaXN0PCIgKyB0eXBlTmFtZSArICI+ICIgKyBhdHRyaWJ1dGVOYW1lICsgIjsiICsgQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UGFja2FnZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhBY2Nlc3Nvck9yZGVyKCk7Ci0JCUl0ZXJhdG9yPEpheGJQYWNrYWdlPiBwYWNrYWdlcyA9IHRoaXMuZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FLCBwYWNrYWdlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocGFja2FnZXMuaGFzTmV4dCgpKTsKLQotCQkvL2FkZCBhbiB1bmFubm90YXRlZCBwYWNrYWdlLWluZm8uamF2YSBhbmQgbWFrZSBzdXJlIGl0J3Mgbm90IGFkZGVkIHRvIHRoZSByb290IGNvbnRleHQgbm9kZQotCQl0aGlzLmNyZWF0ZVVuYW5ub3RhdGVkUGFja2FnZUluZm8oImZvbyIpOwotCQlwYWNrYWdlcyA9IHRoaXMuZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FLCBwYWNrYWdlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocGFja2FnZXMuaGFzTmV4dCgpKTsKLQotCQkvL2Fubm90YXRlIHRoZSBwYWNrYWdlLWluZm8uamF2YSBhbmQgdGVzdCBpdCdzIGFkZGVkIHRvIHRoZSByb290IGNvbnRleHQgbm9kZQotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIGZvb1Jlc291cmNlUGFja2FnZSA9IGdldEpheGJQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGFja2FnZSgiZm9vIik7Ci0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChmb29SZXNvdXJjZVBhY2thZ2UpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljQ29udGV4dFJvb3RUZXN0cy50aGlzLmFkZFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QUk9QRVJUWSk7Ci0JCQl9Ci0JCX0pOwotCi0JCUl0ZXJhYmxlPFN0cmluZz4gcGFja2FnZU5hbWVzID0gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF4YlBhY2thZ2UsIFN0cmluZz4odGhpcy5nZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSmF4YlBhY2thZ2UgbykgewotCQkJCXJldHVybiBvLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlc1NpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHBhY2thZ2VOYW1lcywgUEFDS0FHRV9OQU1FKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHBhY2thZ2VOYW1lcywgImZvbyIpKTsKLQotCQkvL3JlbW92ZSB0aGUgYW5ub3RhdGlvbiBmcm9tIHRoZSBwYWNrYWdlLWluZm8uamF2YSBhbmQgdGVzdCBpdCdzIHJlbW92ZWQgZnJvbSB0aGUgcm9vdCBjb250ZXh0IG5vZGUKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0NvbnRleHRSb290VGVzdHMudGhpcy5yZW1vdmVYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcGFja2FnZXMgPSB0aGlzLmdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5nZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSwgcGFja2FnZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHBhY2thZ2VzLmhhc05leHQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIGFjY2Vzc1R5cGUpIHsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5hZGROb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0FDQ0VTU09SX1RZUEUpOwotCQlhZGRFbnVtTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sIEpBWEIuWE1MX0FDQ0VTU09SX1RZUEVfX1ZBTFVFLCBhY2Nlc3NUeXBlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FDQ0VTU09SX1RZUEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxTZWVBbHNvQW5ub3RhdGlvbihmaW5hbCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcuLi4gdHlwZU5hbWVzKSB7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChKQVhCLlhNTF9TRUVfQUxTTyk7Ci0JCU5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiA9IG51bGw7Ci0JCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCW5vcm1hbEFubm90YXRpb24gPSBhZGROb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX1NFRV9BTFNPKTsKLQkJfQotCQllbHNlIGlmIChhbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKSB7Ci0JCQlub3JtYWxBbm5vdGF0aW9uID0gcmVwbGFjZU1hcmtlckFubm90YXRpb24oKE1hcmtlckFubm90YXRpb24pIGFubm90YXRpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJbm9ybWFsQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uOwotCQl9Ci0JCQotCQlFeHByZXNzaW9uIGFycmF5SW5pdGlhbGl6ZXIgPSBuZXdBcnJheUluaXRpYWxpemVyKAotCQkJCWRlY2xhcmF0aW9uLmdldEFzdCgpLAotCQkJCUFycmF5VG9vbHMuYXJyYXkoCi0JCQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxTdHJpbmcsIFR5cGVMaXRlcmFsPihuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KHR5cGVOYW1lcykpIHsKLQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQlwcm90ZWN0ZWQgVHlwZUxpdGVyYWwgdHJhbnNmb3JtKFN0cmluZyBvKSB7Ci0JCQkJCQkJCXJldHVybiBuZXdUeXBlTGl0ZXJhbChkZWNsYXJhdGlvbi5nZXRBc3QoKSwgbyk7Ci0JCQkJCQkJfQotCQkJCQkJfSwKLQkJCQkJCW5ldyBFeHByZXNzaW9uWzBdKSk7Ci0JCWFkZE1lbWJlclZhbHVlUGFpcihub3JtYWxBbm5vdGF0aW9uLCBKQVhCLlhNTF9TRUVfQUxTT19fVkFMVUUsIGFycmF5SW5pdGlhbGl6ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWdpc3RyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFJlZ2lzdHJ5KCk7Ci0JCUl0ZXJhYmxlPEpheGJUeXBlPiB0eXBlcyA9IGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHR5cGVzKSk7Ci0JCWFzc2VydE5vdE51bGwoKChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSkuZ2V0WG1sUmVnaXN0cnkoKSk7Ci0JCQotCQkvL2FkZCBhbiB1bmFubm90YXRlZCBjbGFzcyBhbmQgbWFrZSBzdXJlIGl0J3Mgbm90IGFkZGVkIHRvIHRoZSBjb250ZXh0IHJvb3QKLQkJY3JlYXRlVW5hbm5vdGF0ZWRDbGFzc05hbWVkKCJGb28iKTsKLQkJdHlwZXMgPSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0eXBlcykpOwotCQlhc3NlcnROb3ROdWxsKCgoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpLmdldFhtbFJlZ2lzdHJ5KCkpOwotCQkKLQkJLy9hbm5vdGF0ZSB0aGUgY2xhc3Mgd2l0aCBAWG1sUmVnaXN0cnkgYW5kIHRlc3QgaXQncyBhZGRlZCB0byB0aGUgcm9vdCBjb250ZXh0IG5vZGUKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGZvb1Jlc291cmNlVHlwZSA9IGdldEpheGJQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZSgidGVzdC5Gb28iKTsKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gYW5ub3RhdGVkRWxlbWVudChmb29SZXNvdXJjZVR5cGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9SRUdJU1RSWSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCXR5cGVzID0gZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUodHlwZXMpKTsKLQkJYXNzZXJ0Tm90TnVsbCgoKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKCJ0ZXN0LkZvbyIpKS5nZXRYbWxSZWdpc3RyeSgpKTsKLQkJYXNzZXJ0Tm90TnVsbCgoKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKS5nZXRYbWxSZWdpc3RyeSgpKTsKLQkJCi0JCS8vcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGZyb20gdGhlIGNsYXNzIGFuZCB0ZXN0IGl0J3MgcmVtb3ZlZCBmcm9tIHRoZSBjb250ZXh0IHJvb3QKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCXJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX1JFR0lTVFJZKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJdHlwZXMgPSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0eXBlcykpOwotCQlhc3NlcnROb3ROdWxsKCgoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpLmdldFhtbFJlZ2lzdHJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCWFzc2VydE5vdE51bGwoKChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSkpOwotCQkKLQkJLy9hZGQgYW4gdW5hbm5vdGF0ZWQgY2xhc3MgYW5kIG1ha2Ugc3VyZSBpdCdzIG5vdCBhZGRlZCB0byB0aGUgY29udGV4dCByb290Ci0JCWNyZWF0ZVVuYW5ub3RhdGVkQ2xhc3NOYW1lZCgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbCgoKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKSk7Ci0JCQotCQkvL2Fubm90YXRlIHRoZSBjbGFzcyB3aXRoIEBYbWxUeXBlIGFuZCB0ZXN0IGl0J3MgYWRkZWQgdG8gdGhlIGNvbnRleHQgcm9vdAotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgZm9vUmVzb3VyY2VUeXBlID0gZ2V0SmF4YlByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCJ0ZXN0LkZvbyIpOwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSBhbm5vdGF0ZWRFbGVtZW50KGZvb1Jlc291cmNlVHlwZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlhZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX1RZUEUpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCWFzc2VydE5vdE51bGwoKChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSkpOwotCQlhc3NlcnROb3ROdWxsKCgoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoInRlc3QuRm9vIikpKTsKLQkJCi0JCS8vcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGZyb20gdGhlIGNsYXNzIGFuZCB0ZXN0IGl0J3MgcmVtb3ZlZCBmcm9tIHRoZSByb290IGNvbnRleHQgbm9kZQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJcmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfVFlQRSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbCgoKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKSk7Ci0JCWFzc2VydE51bGwoKChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZSgidGVzdC5Gb28iKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudW1XaXRoWG1sVHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCWFzc2VydE5vdE51bGwoKChKYXhiRW51bSkgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKSk7Ci0JCQotCQkvL2FkZCBhbiB1bmFubm90YXRlZCBjbGFzcyBhbmQgbWFrZSBzdXJlIGl0J3Mgbm90IGFkZGVkIHRvIHRoZSBjb250ZXh0IHJvb3QKLQkJY3JlYXRlVW5hbm5vdGF0ZWRFbnVtTmFtZWQoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCWFzc2VydE5vdE51bGwoKChKYXhiRW51bSkgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKSk7Ci0JCWFzc2VydE51bGwoKChKYXhiRW51bSkgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKCJ0ZXN0LkZvbyIpKSk7Ci0JCQotCQkvL2Fubm90YXRlIHRoZSBjbGFzcyB3aXRoIEBYbWxFbnVtIGFuZCB0ZXN0IGl0J3MgYWRkZWQgdG8gdGhlIGNvbnRleHQgcm9vdAotCQlKYXZhUmVzb3VyY2VFbnVtIGZvb1Jlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VFbnVtKSBnZXRKYXhiUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoInRlc3QuRm9vIiwgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlLktpbmQuRU5VTSk7Ci0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IGFubm90YXRlZEVsZW1lbnQoZm9vUmVzb3VyY2VUeXBlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCWFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfVFlQRSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbCgoKEpheGJFbnVtKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpKTsKLQkJYXNzZXJ0Tm90TnVsbCgoKEpheGJFbnVtKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoInRlc3QuRm9vIikpKTsKLQkJCi0JCS8vcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGZyb20gdGhlIGNsYXNzIGFuZCB0ZXN0IGl0J3MgcmVtb3ZlZCBmcm9tIHRoZSByb290IGNvbnRleHQgbm9kZQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJcmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfVFlQRSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbCgoKEpheGJFbnVtKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpKTsKLQkJYXNzZXJ0TnVsbCgoKEpheGJFbnVtKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoInRlc3QuRm9vIikpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERpcmVjdFJlZmVyZW5jZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzdXBlcmNsYXNzTmFtZSA9ICJTdXBlciIgKyBUWVBFX05BTUU7Ci0JCVN0cmluZyBmcVN1cGVyY2xhc3NOYW1lID0gUEFDS0FHRV9OQU1FXyArIHN1cGVyY2xhc3NOYW1lOwotCQljcmVhdGVVbmFubm90YXRlZENsYXNzTmFtZWQoc3VwZXJjbGFzc05hbWUpOwotCQkKLQkJLy8gbWFrZSBzdXJlIHVuYW5ub3RhdGVkIHN1cGVyY2xhc3MgaXMgbm90IGluIGNvbnRleHQKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCkpKTsKLQkJCi0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGVBbmRTdXBlcmNsYXNzTmFtZWQoc3VwZXJjbGFzc05hbWUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSkpOwotCQlhc3NlcnROb3ROdWxsKCgoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpKTsKLQkJYXNzZXJ0Tm90TnVsbCgoKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKGZxU3VwZXJjbGFzc05hbWUpKSk7Ci0JCQotCQkvLyByZW1vdmUgYW5ub3RhdGVkIGNsYXNzIC0gYm90aCBjbGFzc2VzIHJlbW92ZWQgZnJvbSBjb250ZXh0Ci0JCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKS5nZXRSZXNvdXJjZSgpOwotCQlmaWxlLmRlbGV0ZSh0cnVlLCBudWxsKTsKLQkJCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCWFzc2VydE51bGwoKChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSkpOwotCQlhc3NlcnROdWxsKCgoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoZnFTdXBlcmNsYXNzTmFtZSkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERpcmVjdFJlZmVyZW5jZWRBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG90aGVyQ2xhc3NOYW1lID0gIk90aGVyIiArIFRZUEVfTkFNRTsKLQkJU3RyaW5nIGZxT3RoZXJDbGFzc05hbWUgPSBQQUNLQUdFX05BTUVfICsgb3RoZXJDbGFzc05hbWU7Ci0JCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gIm90aGVyIjsKLQkJY3JlYXRlVW5hbm5vdGF0ZWRDbGFzc05hbWVkKG90aGVyQ2xhc3NOYW1lKTsKLQkJCi0JCS8vIG1ha2Ugc3VyZSB1bmFubm90YXRlZCBvdGhlciBjbGFzcyBpcyBub3QgaW4gY29udGV4dAotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSkpOwotCQkKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZUFuZEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBvdGhlckNsYXNzTmFtZSk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdGhpc1R5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SmF4YlByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0RmllbGROYW1lZCh0aGlzVHlwZSwgYXR0cmlidXRlTmFtZSk7Ci0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkQXR0cmlidXRlID0gYW5ub3RhdGVkRWxlbWVudChhdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSkpOwotCQlhc3NlcnROb3ROdWxsKGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKGZxT3RoZXJDbGFzc05hbWUpKTsKLQkJCi0JCS8vIGFkZCBhbiBAWG1sRWxlbWVudAotCQlhbm5vdGF0ZWRBdHRyaWJ1dGUuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlhZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0VMRU1FTlQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoZnFPdGhlckNsYXNzTmFtZSkpOwotCQkKLQkJLy8gY2hhbmdlIHRvIEBYbWxUcmFuc2llbnQKLQkJYW5ub3RhdGVkQXR0cmlidXRlLmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJcmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQkJCQlhZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX1RSQU5TSUVOVCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwotCQlhc3NlcnROdWxsKGdldENvbnRleHRSb290KCkuZ2V0VHlwZShmcU90aGVyQ2xhc3NOYW1lKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REaXJlY3RSZWZlcmVuY2VkTGlzdEF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgb3RoZXJDbGFzc05hbWUgPSAiT3RoZXIiICsgVFlQRV9OQU1FOwotCQlTdHJpbmcgZnFPdGhlckNsYXNzTmFtZSA9IFBBQ0tBR0VfTkFNRV8gKyBvdGhlckNsYXNzTmFtZTsKLQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSAib3RoZXIiOwotCQljcmVhdGVVbmFubm90YXRlZENsYXNzTmFtZWQob3RoZXJDbGFzc05hbWUpOwotCQkKLQkJLy8gbWFrZSBzdXJlIHVuYW5ub3RhdGVkIG90aGVyIGNsYXNzIGlzIG5vdCBpbiBjb250ZXh0Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCQotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlQW5kTGlzdEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBvdGhlckNsYXNzTmFtZSk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdGhpc1R5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SmF4YlByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0RmllbGROYW1lZCh0aGlzVHlwZSwgYXR0cmlidXRlTmFtZSk7Ci0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkQXR0cmlidXRlID0gYW5ub3RhdGVkRWxlbWVudChhdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSkpOwotCQlhc3NlcnROb3ROdWxsKGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKGZxT3RoZXJDbGFzc05hbWUpKTsKLQkJCi0JCS8vIGFkZCBhbiBAWG1sRWxlbWVudAotCQlhbm5vdGF0ZWRBdHRyaWJ1dGUuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlhZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0VMRU1FTlQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoZnFPdGhlckNsYXNzTmFtZSkpOwotCQkKLQkJLy8gY2hhbmdlIHRvIEBYbWxUcmFuc2llbnQKLQkJYW5ub3RhdGVkQXR0cmlidXRlLmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJcmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQkJCQlhZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX1RSQU5TSUVOVCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwotCQlhc3NlcnROdWxsKGdldENvbnRleHRSb290KCkuZ2V0VHlwZShmcU90aGVyQ2xhc3NOYW1lKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REaXJlY3RSZWZlcmVuY2VkU2VlQWxzbygpIHRocm93cyBFeGNlcHRpb24gewotCQlmaW5hbCBTdHJpbmcgb3RoZXJDbGFzc05hbWUgPSAiT3RoZXIiICsgVFlQRV9OQU1FOwotCQlmaW5hbCBTdHJpbmcgZnFPdGhlckNsYXNzTmFtZSA9IFBBQ0tBR0VfTkFNRV8gKyBvdGhlckNsYXNzTmFtZTsKLQkJZmluYWwgU3RyaW5nIG90aGVyQ2xhc3NOYW1lMiA9ICJPdGhlciIgKyBUWVBFX05BTUUgKyAiMiI7Ci0JCWZpbmFsIFN0cmluZyBmcU90aGVyQ2xhc3NOYW1lMiA9IFBBQ0tBR0VfTkFNRV8gKyBvdGhlckNsYXNzTmFtZTI7Ci0JCWNyZWF0ZVVuYW5ub3RhdGVkQ2xhc3NOYW1lZChvdGhlckNsYXNzTmFtZSk7Ci0JCWNyZWF0ZVVuYW5ub3RhdGVkQ2xhc3NOYW1lZChvdGhlckNsYXNzTmFtZTIpOwotCQkKLQkJLy8gbWFrZSBzdXJlIHVuYW5ub3RhdGVkIG90aGVyIGNsYXNzZXMgYXJlIG5vdCBpbiBjb250ZXh0Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCQotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdGhpc1R5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SmF4YlByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZFR5cGUgPSBhbm5vdGF0ZWRFbGVtZW50KHRoaXNUeXBlKTsKLQkJCi0JCS8vIG1ha2Ugc3VyZSB1bmFubm90YXRlZCBvdGhlciBjbGFzc2VzIGFyZSBub3QgaW4gY29udGV4dAotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKLQkJCi0JCS8vIGFkZCBhbiBAWG1sU2VlQWxzbyB3aXRoIG9uZSBjbGFzcwotCQlhbm5vdGF0ZWRUeXBlLmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJYWRkWG1sU2VlQWxzb0Fubm90YXRpb24oZGVjbGFyYXRpb24sIG90aGVyQ2xhc3NOYW1lKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSkpOwotCQlhc3NlcnROb3ROdWxsKGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKGZxT3RoZXJDbGFzc05hbWUpKTsKLQkJCi0JCS8vIGNoYW5nZSB0byBAWG1sU2VlQWxzbyB3aXRoIHR3byBjbGFzc2VzCi0JCWFubm90YXRlZFR5cGUuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlyZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9TRUVfQUxTTyk7Ci0JCQkJCQlhZGRYbWxTZWVBbHNvQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgb3RoZXJDbGFzc05hbWUsIG90aGVyQ2xhc3NOYW1lMik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGdldENvbnRleHRSb290KCkuZ2V0VHlwZShmcU90aGVyQ2xhc3NOYW1lKSk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKGZxT3RoZXJDbGFzc05hbWUyKSk7Ci0JCQotCQkvLyByZW1vdmUgdGhlIEBYbWxTZWVBbHNvIGFubm90YXRpb24KLQkJYW5ub3RhdGVkVHlwZS5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCXJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX1NFRV9BTFNPKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSkpOwotCQlhc3NlcnROb3ROdWxsKGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKYXhiSW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nIG90aGVyQ2xhc3NOYW1lID0gIk90aGVyIiArIFRZUEVfTkFNRTsKLQkJZmluYWwgU3RyaW5nIGZxT3RoZXJDbGFzc05hbWUgPSBQQUNLQUdFX05BTUVfICsgb3RoZXJDbGFzc05hbWU7Ci0JCWZpbmFsIFN0cmluZyBvdGhlckNsYXNzTmFtZTIgPSAiT3RoZXIiICsgVFlQRV9OQU1FICsgIjIiOwotCQlmaW5hbCBTdHJpbmcgZnFPdGhlckNsYXNzTmFtZTIgPSBQQUNLQUdFX05BTUVfICsgb3RoZXJDbGFzc05hbWUyOwotCQljcmVhdGVVbmFubm90YXRlZENsYXNzTmFtZWQob3RoZXJDbGFzc05hbWUpOwotCQljcmVhdGVVbmFubm90YXRlZENsYXNzTmFtZWQob3RoZXJDbGFzc05hbWUyKTsKLQkJCi0JCS8vIG1ha2Ugc3VyZSB1bmFubm90YXRlZCBvdGhlciBjbGFzc2VzIGFyZSBub3QgaW4gY29udGV4dAotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSkpOwotCQkKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQkKLQkJLy8gbWFrZSBzdXJlIHVuYW5ub3RhdGVkIG90aGVyIGNsYXNzZXMgYXJlIG5vdCBpbiBjb250ZXh0Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwotCQkKLQkJLy8gYWRkIGEgamF4Yi5pbmRleCB3aXRoIG9uZSBjbGFzcwotCQlJRmlsZSBqYXhiSW5kZXggPSBnZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGaWxlKG5ldyBQYXRoKCJzcmMvdGVzdC9qYXhiLmluZGV4IikpOwotCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3RoZXJDbGFzc05hbWUuZ2V0Qnl0ZXMoKSk7Ci0JCWpheGJJbmRleC5jcmVhdGUoc3RyZWFtLCB0cnVlLCBudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGdldENvbnRleHRSb290KCkuZ2V0VHlwZShmcU90aGVyQ2xhc3NOYW1lKSk7Ci0JCQotCQkvLyBjaGFuZ2UgdG8gamF4Yi5pbmRleCB3aXRoIHR3byBjbGFzc2VzCi0JCWpheGJJbmRleC5zZXRDb250ZW50cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oKG90aGVyQ2xhc3NOYW1lICsgQ1IgKyBvdGhlckNsYXNzTmFtZTIpLmdldEJ5dGVzKCkpLCB0cnVlLCBmYWxzZSwgbnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoZnFPdGhlckNsYXNzTmFtZSkpOwotCQlhc3NlcnROb3ROdWxsKGdldENvbnRleHRSb290KCkuZ2V0VHlwZShmcU90aGVyQ2xhc3NOYW1lMikpOwotCQkKLQkJLy8gY2xlYXIgdGhlIGpheGIuaW5kZXgKLQkJamF4YkluZGV4LnNldENvbnRlbnRzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSksIHRydWUsIGZhbHNlLCBudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pheGJDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZWIzOTIuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNvbnRleHRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuSmF4YlRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UKLQkJZXh0ZW5kcyBKYXhiVGVzdENhc2UgewotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfUFJPSkVDVF9OQU1FID0gIkpheGJDb250ZXh0TW9kZWxUZXN0UHJvamVjdCI7Ci0JCi0JCi0JcHJvdGVjdGVkIEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRlc3RKYXZhUHJvamVjdCBidWlsZEphdmFQcm9qZWN0KGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGJ1aWxkSmF4YlByb2plY3QoQkFTRV9QUk9KRUNUX05BTUUsIGF1dG9CdWlsZCwgYnVpbGRKYXhiRmFjZXRJbnN0YWxsQ29uZmlnKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YkNvbnRleHRSb290IGdldENvbnRleHRSb290KCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXhiUHJvamVjdCgpLmdldENvbnRleHRSb290KCk7Ci0JfQotCQotCXByb3RlY3RlZCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQoSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCByZXNvdXJjZSkgewotCQlyZXR1cm4gKEFubm90YXRlZEVsZW1lbnQpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHJlc291cmNlLCAiYW5ub3RhdGVkRWxlbWVudCIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVVbmFubm90YXRlZFBhY2thZ2VJbmZvKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFBhY2thZ2VJbmZvKHBhY2thZ2VOYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNsYXNzV2l0aFhtbFJlZ2lzdHJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9SRUdJU1RSWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFJlZ2lzdHJ5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVVbmFubm90YXRlZENsYXNzTmFtZWQoU3RyaW5nIHR5cGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUoUEFDS0FHRV9OQU1FLCB0eXBlTmFtZSArICIuamF2YSIsIHR5cGVOYW1lLCBuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUVudW1XaXRoWG1sVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0RW51bShuZXcgRGVmYXVsdEVudW1Bbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRFbnVtQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVVbmFubm90YXRlZEVudW1OYW1lZChTdHJpbmcgZW51bU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0RW51bShQQUNLQUdFX05BTUUsIGVudW1OYW1lICsgIi5qYXZhIiwgZW51bU5hbWUsIG5ldyBEZWZhdWx0RW51bUFubm90YXRpb25Xcml0ZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvSmF4YkNvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvSmF4YkNvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDcyMzQ5Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pheGJDb3JlQ29udGV4dE1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5KYXhiQ29yZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhLkpheGJDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzOwotCi1wdWJsaWMgY2xhc3MgSmF4YkNvcmVDb250ZXh0TW9kZWxUZXN0cwotCQlleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSmF4YkNvcmVDb250ZXh0TW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQkKLQkJaWYgKEpheGJDb3JlVGVzdHMucmVxdWlyZWRKYXJzRXhpc3RzKCkpIHsKLQkJCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljQ29udGV4dFJvb3RUZXN0cy5jbGFzcyk7Ci0JCQlzdWl0ZS5hZGRUZXN0KEpheGJDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJc3VpdGUuYWRkVGVzdChUZXN0U3VpdGUud2FybmluZyhKYXhiQ29yZVRlc3RzLmJ1aWxkTWlzc2luZ0phckVycm9yTWVzc2FnZSgpKSk7Ci0JCX0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQkKLQlwcml2YXRlIEpheGJDb3JlQ29udGV4dE1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFBdHRyaWJ1dGVYbWxKYXZhVHlwZUFkYXB0ZXJUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUF0dHJpYnV0ZVhtbEphdmFUeXBlQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMmE5ODAuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUF0dHJpYnV0ZVhtbEphdmFUeXBlQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhQXR0cmlidXRlWG1sSmF2YVR5cGVBZGFwdGVyVGVzdHMgZXh0ZW5kcyBKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXB1YmxpYyBHZW5lcmljSmF2YUF0dHJpYnV0ZVhtbEphdmFUeXBlQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDbGFzc1dpdGhYbWxUeXBlQW5kQXR0cmlidXRlWG1sSmF2YVR5cGVBZGFwdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFLCBKQVhCLlhNTF9BVFRSSUJVVEUsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEF0dHJpYnV0ZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sSmF2YVR5cGVBZGFwdGVyIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlQW5kQXR0cmlidXRlWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApLmdldE1hcHBpbmcoKTsKLQkJWG1sSmF2YVR5cGVBZGFwdGVyIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCWNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuc2V0VmFsdWUoImZvbyIpOwotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCSAvL3ZlcmlmeSB0aGUgeG1sIHNjaGVtYSB0eXBlIGFubm90YXRpb24gaXMgbm90IHJlbW92ZWQgd2hlbiB0aGUgdmFsdWUgaXMgc2V0IHRvIG51bGwKLQkJY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5zZXRWYWx1ZShudWxsKTsKLQkJamF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0TnVsbChqYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGVBbmRBdHRyaWJ1dGVYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCkuZ2V0TWFwcGluZygpOwotCQlYbWxKYXZhVHlwZUFkYXB0ZXIgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlciA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJLy9hZGQgYSB2YWx1ZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUF0dHJpYnV0ZVhtbEphdmFUeXBlQWRhcHRlclRlc3RzLnRoaXMuYWRkWG1sSmF2YVR5cGVBZGFwdGVyVHlwZU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJfX1ZBTFVFLCAiU3RyaW5nIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFBdHRyaWJ1dGVYbWxKYXZhVHlwZUFkYXB0ZXJUZXN0cy50aGlzLnJlbW92ZVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZUFuZEF0dHJpYnV0ZVhtbEphdmFUeXBlQWRhcHRlcigpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQXR0cmlidXRlTWFwcGluZykgQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEphdmFUeXBlQWRhcHRlciBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyID0gYXR0cmlidXRlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gYXR0cmlidXRlTWFwcGluZy5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaW50IiwgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldERlZmF1bHRUeXBlKCkpOwotCi0JCWNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuc2V0U3BlY2lmaWVkVHlwZSgiZm9vIik7Ci0JCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gamF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0KLQkJY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQlqYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnROdWxsKGphdmFUeXBlQWRhcHRlckFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZUFuZEF0dHJpYnV0ZVhtbEphdmFUeXBlQWRhcHRlcigpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQXR0cmlidXRlTWFwcGluZykgQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEphdmFUeXBlQWRhcHRlciBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyID0gYXR0cmlidXRlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gYXR0cmlidXRlTWFwcGluZy5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaW50IiwgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldERlZmF1bHRUeXBlKCkpOwotCi0JCS8vYWRkIGEgdHlwZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUF0dHJpYnV0ZVhtbEphdmFUeXBlQWRhcHRlclRlc3RzLnRoaXMuYWRkWG1sSmF2YVR5cGVBZGFwdGVyVHlwZU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJfX1RZUEUsICJTdHJpbmciKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldERlZmF1bHRUeXBlKCkpOwotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQXR0cmlidXRlWG1sSmF2YVR5cGVBZGFwdGVyVGVzdHMudGhpcy5yZW1vdmVYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sSmF2YVR5cGVBZGFwdGVyVHlwZU1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKAotCQkJKE1hcmtlckFubm90YXRpb24pIHRoaXMuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIAotCQkJbmFtZSwgCi0JCQl0aGlzLm5ld1R5cGVMaXRlcmFsKGRlY2xhcmF0aW9uLmdldEFzdCgpLCB0eXBlTmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEphdmFUeXBlQWRhcHRlck1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKChNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24oZGVjbGFyYXRpb24pLCBuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwkJCi0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZjQzNWUuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb2R5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklFeHRlbmRlZE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Nb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTW9kaWZpZXIuTW9kaWZpZXJLZXl3b3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEFjY2Vzc09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLlByb3BlcnR5QWNjZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxSb290RWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFNlZUFsc29Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxUeXBlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMKLQkJZXh0ZW5kcyBKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKQVhCLlhNTF9UWVBFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVYbWxUeXBlV2l0aEFjY2Vzc29yVHlwZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RZUEUsIEpBWEIuWE1MX0FDQ0VTU19UWVBFLCBKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sQWNjZXNzb3JUeXBlKHZhbHVlID0gWG1sQWNjZXNzVHlwZS5QUk9QRVJUWSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVYbWxUeXBlV2l0aEFjY2Vzc29yT3JkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFLCBKQVhCLlhNTF9BQ0NFU1NfT1JERVIsIEpBWEIuWE1MX0FDQ0VTU09SX09SREVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sQWNjZXNzb3JPcmRlcih2YWx1ZSA9IFhtbEFjY2Vzc09yZGVyLkFMUEhBQkVUSUNBTCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yVHlwZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RQYWNrYWdlSW5mbygKLQkJCQkiQFhtbEFjY2Vzc29yVHlwZSh2YWx1ZSA9IFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkpIiwKLQkJCQlKQVhCLlhNTF9BQ0NFU1NfVFlQRSwgSkFYQi5YTUxfQUNDRVNTT1JfVFlQRSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RYbWxUeXBlV2l0aEZpZWxkQW5kUHVibGljTWVtYmVyQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSkFYQi5YTUxfVFlQRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpBWEIuWE1MX1RSQU5TSUVOVCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCBqYXZhLnV0aWwuTGlzdDsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoVFlQRV9OQU1FKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBpbnQgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKS5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RYbWxUeXBlV2l0aFByb3BlcnR5QW5kUHVibGljTWVtYmVyQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSkFYQi5YTUxfVFlQRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpBWEIuWE1MX1RSQU5TSUVOVCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCBqYXZhLnV0aWwuTGlzdDsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoVFlQRV9OQU1FKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBpbnQgZ2V0Rm9vKCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHJldHVybiAxOyIpLmFwcGVuZChDUikuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIHZvaWQgc2V0Rm9vKGludCBmb28pIHt9IikuYXBwZW5kKENSKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUikuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0WG1sVHlwZVdpdGhQcm9wZXJ0eUdldHRlckFuZFB1YmxpY01lbWJlckFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpBWEIuWE1MX1RZUEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKQVhCLlhNTF9UUkFOU0lFTlQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgamF2YS51dGlsLkxpc3Q7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKFRZUEVfTkFNRSkuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgaW50IGdldEZvbygpIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICAgICByZXR1cm4gMTsiKS5hcHBlbmQoQ1IpLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUikuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0WG1sVHlwZVdpdGhQcm9wZXJ0eUdldHRlckxpc3RBbmRQdWJsaWNNZW1iZXJBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKQVhCLlhNTF9UWVBFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSkFYQi5YTUxfVFJBTlNJRU5UKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0IGphdmEudXRpbC5MaXN0OyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZChUWVBFX05BTUUpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIExpc3Q8Pz4gZ2V0Rm9vKCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHJldHVybiAxOyIpLmFwcGVuZChDUikuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKS5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RYbWxUeXBlV2l0aFByb3BlcnR5U2V0dGVyQW5kUHVibGljTWVtYmVyQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSkFYQi5YTUxfVFlQRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpBWEIuWE1MX1RSQU5TSUVOVCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCBqYXZhLnV0aWwuTGlzdDsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoVFlQRV9OQU1FKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyB2b2lkIHNldEZvbyhpbnQgZm9vKSB7fSIpLmFwcGVuZChDUikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGlmeUZhY3RvcnlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChjbGFzc01hcHBpbmcuZ2V0U3BlY2lmaWVkRmFjdG9yeUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoSkFYQi5YTUxfVFlQRV9fREVGQVVMVF9GQUNUT1JZX0NMQVNTLCBjbGFzc01hcHBpbmcuZ2V0RmFjdG9yeUNsYXNzKCkpOwotCQkKLQkJY2xhc3NNYXBwaW5nLnNldFNwZWNpZmllZEZhY3RvcnlDbGFzcygiZm9vIik7Ci0JCVhtbFR5cGVBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxUeXBlQW5ub3RhdGlvbi5nZXRGYWN0b3J5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY2xhc3NNYXBwaW5nLmdldEZhY3RvcnlDbGFzcygpKTsKLQkJCi0JCWNsYXNzTWFwcGluZy5zZXRTcGVjaWZpZWRGYWN0b3J5Q2xhc3MobnVsbCk7Ci0JCXhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0TnVsbCh4bWxUeXBlQW5ub3RhdGlvbi5nZXRGYWN0b3J5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldFNwZWNpZmllZEZhY3RvcnlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEpBWEIuWE1MX1RZUEVfX0RFRkFVTFRfRkFDVE9SWV9DTEFTUywgY2xhc3NNYXBwaW5nLmdldEZhY3RvcnlDbGFzcygpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgYW5ub3RhdGlvbiBzbyB0aGF0IHRoZSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGdldCBibG93biBhd2F5Ci0JCWNsYXNzTWFwcGluZy5zZXRTcGVjaWZpZWRBY2Nlc3NUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpOwotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJCi0JCS8vc2V0IGZhY3RvcnlDbGFzcyBhZ2FpbiwgdGhpcyB0aW1lIHN0YXJ0aW5nIHdpdGggbm8gWG1sVHlwZSBhbm5vdGF0aW9uCi0JCWNsYXNzTWFwcGluZy5zZXRTcGVjaWZpZWRGYWN0b3J5Q2xhc3MoImZvbyIpOwotCQl4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sVHlwZUFubm90YXRpb24uZ2V0RmFjdG9yeUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNsYXNzTWFwcGluZy5nZXRGYWN0b3J5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVGYWN0b3J5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldFNwZWNpZmllZEZhY3RvcnlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEpBWEIuWE1MX1RZUEVfX0RFRkFVTFRfRkFDVE9SWV9DTEFTUywgY2xhc3NNYXBwaW5nLmdldEZhY3RvcnlDbGFzcygpKTsKLQkJCi0JCS8vYWRkIGEgZmFjdG9yeUNsYXNzIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVR5cGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sVHlwZVR5cGVNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX1RZUEVfX0ZBQ1RPUllfQ0xBU1MsICJGb28iKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY2xhc3NNYXBwaW5nLmdldEZhY3RvcnlDbGFzcygpKTsKLQotCQkvL3JlbW92ZSB0aGUgZmFjdG9yeUNsYXNzIG1lbWJlciB2YWx1ZSBwYWlyCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24geG1sVHlwZUFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLmdldFhtbFR5cGVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMudmFsdWVzKHhtbFR5cGVBbm5vdGF0aW9uKS5yZW1vdmUoMCk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRTcGVjaWZpZWRGYWN0b3J5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhKQVhCLlhNTF9UWVBFX19ERUZBVUxUX0ZBQ1RPUllfQ0xBU1MsIGNsYXNzTWFwcGluZy5nZXRGYWN0b3J5Q2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUZhY3RvcnlNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldEZhY3RvcnlNZXRob2QoKSk7Ci0JCQotCQljbGFzc01hcHBpbmcuc2V0RmFjdG9yeU1ldGhvZCgiZm9vIik7Ci0JCVhtbFR5cGVBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxUeXBlQW5ub3RhdGlvbi5nZXRGYWN0b3J5TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNsYXNzTWFwcGluZy5nZXRGYWN0b3J5TWV0aG9kKCkpOwotCQkKLQkJY2xhc3NNYXBwaW5nLnNldEZhY3RvcnlNZXRob2QobnVsbCk7Ci0JCXhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0TnVsbCh4bWxUeXBlQW5ub3RhdGlvbi5nZXRGYWN0b3J5TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRGYWN0b3J5TWV0aG9kKCkpOwotCQotCQkvL2FkZCBhbm90aGVyIGFubm90YXRpb24gc28gdGhhdCB0aGUgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBnZXQgYmxvd24gYXdheQotCQljbGFzc01hcHBpbmcuc2V0U3BlY2lmaWVkQWNjZXNzVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCQotCQkvL3NldCBmYWN0b3J5TWV0aG9kIGFnYWluLCB0aGlzIHRpbWUgc3RhcnRpbmcgd2l0aCBubyBYbWxUeXBlIGFubm90YXRpb24KLQkJY2xhc3NNYXBwaW5nLnNldEZhY3RvcnlNZXRob2QoImZvbyIpOwotCQl4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sVHlwZUFubm90YXRpb24uZ2V0RmFjdG9yeU1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjbGFzc01hcHBpbmcuZ2V0RmFjdG9yeU1ldGhvZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUZhY3RvcnlNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldEZhY3RvcnlNZXRob2QoKSk7Ci0JCQotCQkvL2FkZCBhIGZhY3RvcnlNZXRob2QgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlVHlwZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5hZGRYbWxUeXBlTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9UWVBFX19GQUNUT1JZX01FVEhPRCwgImZvbyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjbGFzc01hcHBpbmcuZ2V0RmFjdG9yeU1ldGhvZCgpKTsKLQotCQkvL3JlbW92ZSB0aGUgZmFjdG9yeU1ldGhvZCBtZW1iZXIgdmFsdWUgcGFpcgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOb3JtYWxBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5nZXRYbWxUeXBlQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnZhbHVlcyh4bWxUeXBlQW5ub3RhdGlvbikucmVtb3ZlKDApOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbChjbGFzc01hcHBpbmcuZ2V0RmFjdG9yeU1ldGhvZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U2NoZW1hVHlwZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJU3RyaW5nIGRlZmF1bHRYbWxUeXBlTmFtZSA9IEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUoVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGRlZmF1bHRYbWxUeXBlTmFtZSwgY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhkZWZhdWx0WG1sVHlwZU5hbWUsIGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCQotCQljbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJWG1sVHlwZUFubm90YXRpb24geG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFR5cGVBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJeG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlhc3NlcnROdWxsKHhtbFR5cGVBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGRlZmF1bHRYbWxUeXBlTmFtZSwgY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsJCi0JCQotCQkvL2FkZCBhbm90aGVyIGFubm90YXRpb24gc28gdGhhdCB0aGUgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBnZXQgYmxvd24gYXdheQotCQljbGFzc01hcHBpbmcuc2V0U3BlY2lmaWVkQWNjZXNzVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCQotCQkvL3NldCBuYW1lIGFnYWluLCB0aGlzIHRpbWUgc3RhcnRpbmcgd2l0aCBubyBYbWxUeXBlIGFubm90YXRpb24KLQkJY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCXhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxUeXBlQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNjaGVtYVR5cGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCVN0cmluZyBkZWZhdWx0WG1sVHlwZU5hbWUgPSBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKFRZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhkZWZhdWx0WG1sVHlwZU5hbWUsIGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZGVmYXVsdFhtbFR5cGVOYW1lLCBjbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy9hZGQgYSBuYW1lc3BhY2UgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlVHlwZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5hZGRYbWxUeXBlTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9UWVBFX19OQU1FLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vcmVtb3ZlIHRoZSBuYW1lc3BhY2UgbWVtYmVyIHZhbHVlIHBhaXIKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTm9ybWFsQW5ub3RhdGlvbiB4bWxUeXBlQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuZ2V0WG1sVHlwZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy52YWx1ZXMoeG1sVHlwZUFubm90YXRpb24pLnJlbW92ZSgwKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGRlZmF1bHRYbWxUeXBlTmFtZSwgY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBjbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5nZXREZWZhdWx0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCWNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWVzcGFjZSgiZm9vIik7Ci0JCVhtbFR5cGVBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxUeXBlQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCWNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWVzcGFjZShudWxsKTsKLQkJeG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlhc3NlcnROdWxsKHhtbFR5cGVBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0TnVsbChjbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBhbm5vdGF0aW9uIHNvIHRoYXQgdGhlIGNvbnRleHQgbW9kZWwgZG9lcyBub3QgZ2V0IGJsb3duIGF3YXkKLQkJY2xhc3NNYXBwaW5nLnNldFNwZWNpZmllZEFjY2Vzc1R5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQkKLQkJLy9zZXQgbmFtZXNwYWNlIGFnYWluLCB0aGlzIHRpbWUgc3RhcnRpbmcgd2l0aCBubyBYbWxUeXBlIGFubm90YXRpb24KLQkJY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZXNwYWNlKCJmb28iKTsKLQkJeG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFR5cGVBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBjbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5nZXREZWZhdWx0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCS8vYWRkIGEgbmFtZXNwYWNlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVR5cGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sVHlwZU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfVFlQRV9fTkFNRVNQQUNFLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQkvL3JlbW92ZSB0aGUgbmFtZXNwYWNlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24geG1sVHlwZUFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLmdldFhtbFR5cGVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMudmFsdWVzKHhtbFR5cGVBbm5vdGF0aW9uKS5yZW1vdmUoMCk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBjbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUFjY2Vzc1R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlWG1sVHlwZVdpdGhBY2Nlc3NvclR5cGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QUk9QRVJUWSwgY2xhc3NNYXBwaW5nLmdldFNwZWNpZmllZEFjY2Vzc1R5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBST1BFUlRZLCBjbGFzc01hcHBpbmcuZ2V0QWNjZXNzVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuUFVCTElDX01FTUJFUiwgY2xhc3NNYXBwaW5nLmdldERlZmF1bHRBY2Nlc3NUeXBlKCkpOwotCQkKLQkJY2xhc3NNYXBwaW5nLnNldFNwZWNpZmllZEFjY2Vzc1R5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCVhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24gYWNjZXNzb3JUeXBlQW5ub3RhdGlvbiA9IChYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NUeXBlLkZJRUxELCBhY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5GSUVMRCwgY2xhc3NNYXBwaW5nLmdldEFjY2Vzc1R5cGUoKSk7Ci0KLQkJY2xhc3NNYXBwaW5nLnNldFNwZWNpZmllZEFjY2Vzc1R5cGUoWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NUeXBlLlBVQkxJQ19NRU1CRVIsIGFjY2Vzc29yVHlwZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBVQkxJQ19NRU1CRVIsIGNsYXNzTWFwcGluZy5nZXRBY2Nlc3NUeXBlKCkpOwotCi0JCWNsYXNzTWFwcGluZy5zZXRTcGVjaWZpZWRBY2Nlc3NUeXBlKFhtbEFjY2Vzc1R5cGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzVHlwZS5OT05FLCBhY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5OT05FLCBjbGFzc01hcHBpbmcuZ2V0QWNjZXNzVHlwZSgpKTsKLQkJCi0JCWNsYXNzTWFwcGluZy5zZXRTcGVjaWZpZWRBY2Nlc3NUeXBlKG51bGwpOwotCQlhY2Nlc3NvclR5cGVBbm5vdGF0aW9uID0gKFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FDQ0VTU09SX1RZUEUpOwotCQlhc3NlcnROdWxsKGFjY2Vzc29yVHlwZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldFNwZWNpZmllZEFjY2Vzc1R5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBVQkxJQ19NRU1CRVIsIGNsYXNzTWFwcGluZy5nZXRBY2Nlc3NUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSLCBjbGFzc01hcHBpbmcuZ2V0RGVmYXVsdEFjY2Vzc1R5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBY2Nlc3NUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVhtbFR5cGVXaXRoQWNjZXNzb3JUeXBlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFksIGNsYXNzTWFwcGluZy5nZXRTcGVjaWZpZWRBY2Nlc3NUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QUk9QRVJUWSwgY2xhc3NNYXBwaW5nLmdldEFjY2Vzc1R5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBVQkxJQ19NRU1CRVIsIGNsYXNzTWFwcGluZy5nZXREZWZhdWx0QWNjZXNzVHlwZSgpKTsKLQkJCi0JCS8vc2V0IHRoZSBhY2Nlc3NlciB0eXBlIHZhbHVlIHRvIEZJRUxECi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVR5cGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuc2V0RW51bU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfQUNDRVNTT1JfVFlQRSwgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLkZJRUxELCBjbGFzc01hcHBpbmcuZ2V0QWNjZXNzVHlwZSgpKTsKLQotCQkvL3NldCB0aGUgYWNjZXNzZXIgdHlwZSB2YWx1ZSB0byBQVUJMSUNfTUVNQkVSCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5zZXRFbnVtTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFVCTElDX01FTUJFUik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSLCBjbGFzc01hcHBpbmcuZ2V0QWNjZXNzVHlwZSgpKTsKLQotCQkvL3NldCB0aGUgYWNjZXNzZXIgdHlwZSB2YWx1ZSB0byBOT05FCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5zZXRFbnVtTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fTk9ORSk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5OT05FLCBjbGFzc01hcHBpbmcuZ2V0QWNjZXNzVHlwZSgpKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldFNwZWNpZmllZEFjY2Vzc1R5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBVQkxJQ19NRU1CRVIsIGNsYXNzTWFwcGluZy5nZXRBY2Nlc3NUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSLCBjbGFzc01hcHBpbmcuZ2V0RGVmYXVsdEFjY2Vzc1R5cGUoKSk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlcmUgaXMgYSBAWG1sQWNjZXNzb3JUeXBlIG9uIGEgY2xhc3MsIHRoZW4gaXQgaXMgdXNlZC4KLQkgKiBPdGhlcndpc2UsIGlmIGEgQFhtbEFjY2Vzc29yVHlwZSBleGlzdHMgb24gb25lIG9mIGl0cyBzdXBlciBjbGFzc2VzLCB0aGVuIGl0IGlzIGluaGVyaXRlZC4KLQkgKiBPdGhlcndpc2UsIHRoZSBAWG1sQWNjZXNzb3JUeXBlIG9uIGEgcGFja2FnZSBpcyBpbmhlcml0ZWQuIAkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEFjY2Vzc1R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiQ2xhc3MgY2hpbGRKYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjaGlsZENsYXNzTWFwcGluZyA9IGNoaWxkSmF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBVQkxJQ19NRU1CRVIsIGNoaWxkQ2xhc3NNYXBwaW5nLmdldERlZmF1bHRBY2Nlc3NUeXBlKCkpOwotCi0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoQWNjZXNzb3JUeXBlKCk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBST1BFUlRZLCBjaGlsZENsYXNzTWFwcGluZy5nZXREZWZhdWx0QWNjZXNzVHlwZSgpKTsKLQotCQljbGFzc01hcHBpbmcuc2V0U3BlY2lmaWVkQWNjZXNzVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuRklFTEQsIGNoaWxkQ2xhc3NNYXBwaW5nLmdldERlZmF1bHRBY2Nlc3NUeXBlKCkpOwotCi0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJY2xhc3NNYXBwaW5nLnNldFNwZWNpZmllZEFjY2Vzc1R5cGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBST1BFUlRZLCBjaGlsZENsYXNzTWFwcGluZy5nZXREZWZhdWx0QWNjZXNzVHlwZSgpKTsKLQkJY29udGV4dFBhY2thZ2VJbmZvLnNldFNwZWNpZmllZEFjY2Vzc1R5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLkZJRUxELCBjaGlsZENsYXNzTWFwcGluZy5nZXREZWZhdWx0QWNjZXNzVHlwZSgpKTsKLQotCQljb250ZXh0UGFja2FnZUluZm8uc2V0U3BlY2lmaWVkQWNjZXNzVHlwZShYbWxBY2Nlc3NUeXBlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5OT05FLCBjaGlsZENsYXNzTWFwcGluZy5nZXREZWZhdWx0QWNjZXNzVHlwZSgpKTsKLQotCQljb250ZXh0UGFja2FnZUluZm8uc2V0U3BlY2lmaWVkQWNjZXNzVHlwZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuUFVCTElDX01FTUJFUiwgY2hpbGRDbGFzc01hcHBpbmcuZ2V0RGVmYXVsdEFjY2Vzc1R5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFN1cGVyUGVyc2lzdGVudENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YkNsYXNzIGNoaWxkSmF4YkNsYXNzID0gKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKCJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2hpbGRDbGFzc01hcHBpbmcgPSBjaGlsZEpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoY2xhc3NNYXBwaW5nLCBjaGlsZENsYXNzTWFwcGluZy5nZXRTdXBlcmNsYXNzKCkpOwotCi0JCS8vdGVzdCB0aGF0IHRoZSBzdXBlckNsYXNzIGlzIG5vdCBudWxsIGV2ZW4gd2hlbiBpdCBpcyB1bmFubm90YXRlZAotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQoamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9UWVBFKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhjbGFzc01hcHBpbmcsIGNoaWxkQ2xhc3NNYXBwaW5nLmdldFN1cGVyY2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUFjY2Vzc09yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVhtbFR5cGVXaXRoQWNjZXNzb3JPcmRlcigpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NPcmRlci5BTFBIQUJFVElDQUwsIGNsYXNzTWFwcGluZy5nZXRTcGVjaWZpZWRBY2Nlc3NPcmRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc09yZGVyLkFMUEhBQkVUSUNBTCwgY2xhc3NNYXBwaW5nLmdldEFjY2Vzc09yZGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuVU5ERUZJTkVELCBjbGFzc01hcHBpbmcuZ2V0RGVmYXVsdEFjY2Vzc09yZGVyKCkpOwotCi0JCWNsYXNzTWFwcGluZy5zZXRTcGVjaWZpZWRBY2Nlc3NPcmRlcihYbWxBY2Nlc3NPcmRlci5VTkRFRklORUQpOwotCQlYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbiBhY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbiA9IChYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQUNDRVNTT1JfT1JERVIpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRCwgYWNjZXNzb3JPcmRlckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NPcmRlci5VTkRFRklORUQsIGNsYXNzTWFwcGluZy5nZXRBY2Nlc3NPcmRlcigpKTsKLQotCQljbGFzc01hcHBpbmcuc2V0U3BlY2lmaWVkQWNjZXNzT3JkZXIobnVsbCk7Ci0JCWFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uID0gKFhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUik7Ci0JCWFzc2VydE51bGwoYWNjZXNzb3JPcmRlckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldFNwZWNpZmllZEFjY2Vzc09yZGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuVU5ERUZJTkVELCBjbGFzc01hcHBpbmcuZ2V0QWNjZXNzT3JkZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NPcmRlci5VTkRFRklORUQsIGNsYXNzTWFwcGluZy5nZXREZWZhdWx0QWNjZXNzT3JkZXIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFjY2Vzc09yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVhtbFR5cGVXaXRoQWNjZXNzb3JPcmRlcigpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NPcmRlci5BTFBIQUJFVElDQUwsIGNsYXNzTWFwcGluZy5nZXRTcGVjaWZpZWRBY2Nlc3NPcmRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc09yZGVyLkFMUEhBQkVUSUNBTCwgY2xhc3NNYXBwaW5nLmdldEFjY2Vzc09yZGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuVU5ERUZJTkVELCBjbGFzc01hcHBpbmcuZ2V0RGVmYXVsdEFjY2Vzc09yZGVyKCkpOwotCi0JCS8vc2V0IHRoZSBhY2Nlc3Mgb3JkZXIgdmFsdWUgdG8gVU5ERUZJTkVECi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVR5cGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuc2V0RW51bU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfQUNDRVNTT1JfT1JERVIsIEpBWEIuWE1MX0FDQ0VTU19PUkRFUl9fVU5ERUZJTkVEKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NPcmRlci5VTkRFRklORUQsIGNsYXNzTWFwcGluZy5nZXRBY2Nlc3NPcmRlcigpKTsKLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfQUNDRVNTT1JfT1JERVIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbChjbGFzc01hcHBpbmcuZ2V0U3BlY2lmaWVkQWNjZXNzT3JkZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NPcmRlci5VTkRFRklORUQsIGNsYXNzTWFwcGluZy5nZXRBY2Nlc3NPcmRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRCwgY2xhc3NNYXBwaW5nLmdldERlZmF1bHRBY2Nlc3NPcmRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvcE9yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHByb3BzID0gY2xhc3NNYXBwaW5nLmdldFByb3BPcmRlcigpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHByb3BzLmhhc05leHQoKSk7Ci0KLQkJLy9hZGQgMiBwcm9wIG9yZGVycwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VUeXBlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLmFkZFByb3AoZGVjbGFyYXRpb24sIDAsICJiYXIiKTsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkUHJvcChkZWNsYXJhdGlvbiwgMSwgImZvbyIpOwotCQkJfQotCQl9KTsKLQotCQlwcm9wcyA9IGNsYXNzTWFwcGluZy5nZXRQcm9wT3JkZXIoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHByb3BzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcHJvcHMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UocHJvcHMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIGludCBpbmRleCwgU3RyaW5nIHByb3ApIHsKLQkJdGhpcy5hZGRBcnJheUVsZW1lbnQoZGVjbGFyYXRpb24sIEpBWEIuWE1MX1RZUEUsIGluZGV4LCBKQVhCLlhNTF9UWVBFX19QUk9QX09SREVSLCB0aGlzLm5ld1N0cmluZ0xpdGVyYWwoZGVjbGFyYXRpb24uZ2V0QXN0KCksIHByb3ApKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcm9wT3JkZXJTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0UHJvcE9yZGVyU2l6ZSgpKTsKLQotCQkvL2FkZCAyIHByb3Agb3JkZXJzCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVR5cGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkUHJvcChkZWNsYXJhdGlvbiwgMCwgImJhciIpOwotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5hZGRQcm9wKGRlY2xhcmF0aW9uLCAxLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoMiwgY2xhc3NNYXBwaW5nLmdldFByb3BPcmRlclNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFByb3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJY2xhc3NNYXBwaW5nLmFkZFByb3AoMCwgImJhciIpOwotCQljbGFzc01hcHBpbmcuYWRkUHJvcCgwLCAiZm9vIik7Ci0JCWNsYXNzTWFwcGluZy5hZGRQcm9wKDAsICJiYXoiKTsKLQotCQlYbWxUeXBlQW5ub3RhdGlvbiB4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHByb3BzID0geG1sVHlwZUFubm90YXRpb24uZ2V0UHJvcE9yZGVyKCkuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRFcXVhbHMoImJheiIsIHByb3BzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcHJvcHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBwcm9wcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShwcm9wcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRQcm9wMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJY2xhc3NNYXBwaW5nLmFkZFByb3AoMCwgImJhciIpOwotCQljbGFzc01hcHBpbmcuYWRkUHJvcCgxLCAiZm9vIik7Ci0JCWNsYXNzTWFwcGluZy5hZGRQcm9wKDAsICJiYXoiKTsKLQotCQlYbWxUeXBlQW5ub3RhdGlvbiB4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHByb3BzID0geG1sVHlwZUFubm90YXRpb24uZ2V0UHJvcE9yZGVyKCkuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRFcXVhbHMoImJheiIsIHByb3BzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcHJvcHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBwcm9wcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShwcm9wcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQcm9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQljbGFzc01hcHBpbmcuYWRkUHJvcCgwLCAiYmFyIik7Ci0JCWNsYXNzTWFwcGluZy5hZGRQcm9wKDEsICJmb28iKTsKLQkJY2xhc3NNYXBwaW5nLmFkZFByb3AoMiwgImJheiIpOwotCi0JCVhtbFR5cGVBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQotCQljbGFzc01hcHBpbmcucmVtb3ZlUHJvcCgxKTsKLQotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiByZXNvdXJjZVByb3BzID0geG1sVHlwZUFubm90YXRpb24uZ2V0UHJvcE9yZGVyKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCByZXNvdXJjZVByb3BzLm5leHQoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCByZXNvdXJjZVByb3BzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlUHJvcHMuaGFzTmV4dCgpKTsKLQotCQljbGFzc01hcHBpbmcucmVtb3ZlUHJvcCgxKTsKLQkJcmVzb3VyY2VQcm9wcyA9IHhtbFR5cGVBbm5vdGF0aW9uLmdldFByb3BPcmRlcigpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcmVzb3VyY2VQcm9wcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZVByb3BzLmhhc05leHQoKSk7Ci0KLQkJY2xhc3NNYXBwaW5nLnJlbW92ZVByb3AoMCk7Ci0JCXJlc291cmNlUHJvcHMgPSB4bWxUeXBlQW5ub3RhdGlvbi5nZXRQcm9wT3JkZXIoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZVByb3BzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVQcm9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQljbGFzc01hcHBpbmcuYWRkUHJvcCgwLCAiYmFyIik7Ci0JCWNsYXNzTWFwcGluZy5hZGRQcm9wKDEsICJmb28iKTsKLQkJY2xhc3NNYXBwaW5nLmFkZFByb3AoMiwgImJheiIpOwotCi0JCVhtbFR5cGVBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgeG1sVHlwZUFubm90YXRpb24uZ2V0UHJvcE9yZGVyU2l6ZSgpKTsJCQotCi0JCWNsYXNzTWFwcGluZy5tb3ZlUHJvcCgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gcHJvcHMgPSBjbGFzc01hcHBpbmcuZ2V0UHJvcE9yZGVyKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBwcm9wcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHByb3BzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcHJvcHMubmV4dCgpKTsJCQotCQlhc3NlcnRGYWxzZShwcm9wcy5oYXNOZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHJlc291cmNlUHJvcHMgPSB4bWxUeXBlQW5ub3RhdGlvbi5nZXRQcm9wT3JkZXIoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlUHJvcHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCByZXNvdXJjZVByb3BzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcmVzb3VyY2VQcm9wcy5uZXh0KCkpOwotCQkKLQkJY2xhc3NNYXBwaW5nLm1vdmVQcm9wKDAsIDEpOwotCQlwcm9wcyA9IGNsYXNzTWFwcGluZy5nZXRQcm9wT3JkZXIoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHByb3BzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcHJvcHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBwcm9wcy5uZXh0KCkpOwkJCi0JCWFzc2VydEZhbHNlKHByb3BzLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VQcm9wcyA9IHhtbFR5cGVBbm5vdGF0aW9uLmdldFByb3BPcmRlcigpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgcmVzb3VyY2VQcm9wcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlUHJvcHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCByZXNvdXJjZVByb3BzLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNQcm9wcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gcHJvcHMgPSBjbGFzc01hcHBpbmcuZ2V0UHJvcE9yZGVyKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UocHJvcHMuaGFzTmV4dCgpKTsKLQotCQkvL2FkZCAzIHByb3Agb3JkZXJzCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVR5cGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkUHJvcChkZWNsYXJhdGlvbiwgMCwgImJhciIpOwotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5hZGRQcm9wKGRlY2xhcmF0aW9uLCAxLCAiZm9vIik7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLmFkZFByb3AoZGVjbGFyYXRpb24sIDIsICJiYXoiKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcHJvcHMgPSBjbGFzc01hcHBpbmcuZ2V0UHJvcE9yZGVyKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShwcm9wcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHByb3BzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcHJvcHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBwcm9wcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShwcm9wcy5oYXNOZXh0KCkpOwotCi0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLm1vdmVQcm9wKGRlY2xhcmF0aW9uLCAyLCAwKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcHJvcHMgPSBjbGFzc01hcHBpbmcuZ2V0UHJvcE9yZGVyKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShwcm9wcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHByb3BzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgcHJvcHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBwcm9wcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShwcm9wcy5oYXNOZXh0KCkpOwotCi0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLm1vdmVQcm9wKGRlY2xhcmF0aW9uLCAwLCAxKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcHJvcHMgPSBjbGFzc01hcHBpbmcuZ2V0UHJvcE9yZGVyKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShwcm9wcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHByb3BzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcHJvcHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBwcm9wcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShwcm9wcy5oYXNOZXh0KCkpOwotCi0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZVByb3AoZGVjbGFyYXRpb24sIDEpOwotCQkJfQotCQl9KTsKLQotCQlwcm9wcyA9IGNsYXNzTWFwcGluZy5nZXRQcm9wT3JkZXIoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHByb3BzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgcHJvcHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBwcm9wcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShwcm9wcy5oYXNOZXh0KCkpOwotCi0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZVByb3AoZGVjbGFyYXRpb24sIDEpOwotCQkJfQotCQl9KTsKLQotCQlwcm9wcyA9IGNsYXNzTWFwcGluZy5nZXRQcm9wT3JkZXIoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHByb3BzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgcHJvcHMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UocHJvcHMuaGFzTmV4dCgpKTsKLQotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVQcm9wKGRlY2xhcmF0aW9uLCAwKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcHJvcHMgPSBjbGFzc01hcHBpbmcuZ2V0UHJvcE9yZGVyKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UocHJvcHMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxUeXBlTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoKE1hcmtlckFubm90YXRpb24pIHRoaXMuZ2V0WG1sVHlwZUFubm90YXRpb24oZGVjbGFyYXRpb24pLCBuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sVHlwZVR5cGVNZW1iZXJWYWx1ZVBhaXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlTmFtZSkgewotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcigKLQkJCShNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbFR5cGVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgCi0JCQluYW1lLCAKLQkJCXRoaXMubmV3VHlwZUxpdGVyYWwoZGVjbGFyYXRpb24uZ2V0QXN0KCksIHR5cGVOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0WG1sVHlwZUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKEpBWEIuWE1MX1RZUEUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1vdmVQcm9wKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMubW92ZUFycmF5RWxlbWVudCgoTm9ybWFsQW5ub3RhdGlvbikgZ2V0WG1sVHlwZUFubm90YXRpb24oZGVjbGFyYXRpb24pLCBKQVhCLlhNTF9UWVBFX19QUk9QX09SREVSLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVByb3AoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXRoaXMucmVtb3ZlQXJyYXlFbGVtZW50KChOb3JtYWxBbm5vdGF0aW9uKSBnZXRYbWxUeXBlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIEpBWEIuWE1MX1RZUEVfX1BST1BfT1JERVIsIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sUm9vdEVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldFhtbFJvb3RFbGVtZW50KCkpOwotCQkKLQkJY2xhc3NNYXBwaW5nLmFkZFhtbFJvb3RFbGVtZW50KCkuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uIHhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxSb290RWxlbWVudEFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1JPT1RfRUxFTUVOVCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY2xhc3NNYXBwaW5nLmdldFhtbFJvb3RFbGVtZW50KCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJY2xhc3NNYXBwaW5nLnJlbW92ZVhtbFJvb3RFbGVtZW50KCk7Ci0JCXhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxSb290RWxlbWVudEFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1JPT1RfRUxFTUVOVCk7Ci0JCWFzc2VydE51bGwoeG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0TnVsbChjbGFzc01hcHBpbmcuZ2V0WG1sUm9vdEVsZW1lbnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbFJvb3RFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRYbWxSb290RWxlbWVudCgpKTsKLQkJCi0JCS8vYWRkIGEgWG1sUm9vdEVsZW1lbnQgYW5ub3RhdGlvbgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VUeXBlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLmFkZE5vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfUk9PVF9FTEVNRU5UKTsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sIEpBWEIuWE1MX1JPT1RfRUxFTUVOVF9fTkFNRSwgImZvbyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjbGFzc01hcHBpbmcuZ2V0WG1sUm9vdEVsZW1lbnQoKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvL3JlbW92ZSB0aGUgWG1sUm9vdEVsZW1lbnQgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfUk9PVF9FTEVNRU5UKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldFhtbFJvb3RFbGVtZW50KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRmllbGRBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdFhtbFR5cGVXaXRoRmllbGRBbmRQdWJsaWNNZW1iZXJBY2Nlc3MoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJCi0JCS8vcHVibGljIGludCBmb287Ci0JCXB1YmxpY0ZpZWxkVGVzdChjbGFzc01hcHBpbmcpOwotCQkKLQkJLy9wdWJsaWMgdHJhbnNpZW50IGludCBmb287Ci0JCXB1YmxpY1RyYW5zaWVudEZpZWxkVGVzdChjbGFzc01hcHBpbmcpOwotCQkKLQkJLy9wdWJsaWMgc3RhdGljIGludCBmb287Ci0JCXB1YmxpY1N0YXRpY0ZpZWxkVGVzdChjbGFzc01hcHBpbmcpOwotCQkKLQkJLy9wdWJsaWMgZmluYWwgaW50IGZvbzsKLQkJcHVibGljRmluYWxGaWVsZFRlc3QoY2xhc3NNYXBwaW5nKTsKLQkJCi0JCS8vcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZm9vOwotCQlwdWJsaWNTdGF0aWNGaW5hbEZpZWxkVGVzdChjbGFzc01hcHBpbmcpOwotCQkKLQkJLy9wcml2YXRlIGludCBmb287Ci0JCXByaXZhdGVGaWVsZFRlc3QoY2xhc3NNYXBwaW5nKTsKLQkJCi0JCS8vICBwcml2YXRlIHRyYW5zaWVudCBpbnQgZm9vOwotCQlwcml2YXRlVHJhbnNpZW50RmllbGRUZXN0KGNsYXNzTWFwcGluZyk7Ci0JCQotCQkvLyAgQFhtbEF0dHJpYnV0ZQotCQkvLyAgcHJpdmF0ZSBzdGF0aWMgaW50IGZvbzsgLy9wZXJzaXN0ZW50Ci0JCXByaXZhdGVTdGF0aWNGaWVsZFRlc3QoY2xhc3NNYXBwaW5nKTsKLQkJCi0JCS8vICBAWG1sQXR0cmlidXRlCi0JCS8vICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZm9vOyAvL3BlcnNpc3RlbnQKLQkJcHJpdmF0ZVN0YXRpY0ZpbmFsRmllbGRUZXN0KGNsYXNzTWFwcGluZyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHB1YmxpY0ZpZWxkVGVzdChKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZykgewotCQkvL3B1YmxpYyBpbnQgZm9vOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJSXRlcmF0b3I8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJLy9wdWJsaWMgaW50IGZvbzsgLy9QUk9QRVJUWSBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQlzZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCS8vcHVibGljIGludCBmb287IC8vRklFTEQgYWNjZXNzIC0gcGVyc2lzdGVudAotCQlzZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQkvL3B1YmxpYyBpbnQgZm9vOyAvL05PTkUgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCS8vcHVibGljIGludCBmb287IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gcGVyc2lzdGVudAotCQlzZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BVQkxJQ19NRU1CRVIpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCS8vYWRkIEBYbWxUcmFuc2llbnQgYW5ub3RhdGlvbiBhbmQgdGVzdCBlYWNoIGFjY2VzcyB0eXBlCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSAoSmF2YVJlc291cmNlRmllbGQpIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUZpZWxkKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfVFJBTlNJRU5UKTsKLQkJCX0KLQkJfSk7Ci0JCS8vQFhtbFRyYW5zaWVudAotCQkvL3B1YmxpYyBpbnQgZm9vOyAvL1BST1BFUlRZIGFjY2VzcyAtIG5vdCAicGVyc2lzdGVudCIsIGJ1dCBjb21lcyBpbiB0byBvdXIgY29udGV4dCBtb2RlbCBiZWNhdXNlIGl0IGlzICJtYXBwZWQiCi0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCS8vQFhtbFRyYW5zaWVudAotCQkvL3B1YmxpYyBpbnQgZm9vOyAvL0ZJRUxEIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sVHJhbnNpZW50Ci0JCS8vcHVibGljIGludCBmb287IC8vTk9ORSBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sVHJhbnNpZW50Ci0JCS8vcHVibGljIGludCBmb287IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFVCTElDX01FTUJFUik7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfVFJBTlNJRU5UKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVibGljVHJhbnNpZW50RmllbGRUZXN0KEpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nKSB7Ci0JCUl0ZXJhdG9yPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gKEphdmFSZXNvdXJjZUZpZWxkKSBhdHRyaWJ1dGVzLm5leHQoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQkvL3B1YmxpYyB0cmFuc2llbnQgaW50IGZvbzsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLmFkZE1vZGlmaWVycyhyZXNvdXJjZUZpZWxkLCBNb2RpZmllcktleXdvcmQuVFJBTlNJRU5UX0tFWVdPUkQpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCS8vcHVibGljIHRyYW5zaWVudCBpbnQgZm9vOyAvL1BST1BFUlRZIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wdWJsaWMgdHJhbnNpZW50IGludCBmb287IC8vRklFTEQgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3B1YmxpYyB0cmFuc2llbnQgaW50IGZvbzsgLy9OT05FIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3B1YmxpYyB0cmFuc2llbnQgaW50IGZvbzsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFVCTElDX01FTUJFUik7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJdGhpcy5yZW1vdmVNb2RpZmllcnMocmVzb3VyY2VGaWVsZCwgTW9kaWZpZXJLZXl3b3JkLlRSQU5TSUVOVF9LRVlXT1JEKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaWNTdGF0aWNGaWVsZFRlc3QoSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcpIHsKLQkJSXRlcmF0b3I8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSAoSmF2YVJlc291cmNlRmllbGQpIGF0dHJpYnV0ZXMubmV4dCgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCS8vcHVibGljIHN0YXRpYyBpbnQgZm9vOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuYWRkTW9kaWZpZXJzKHJlc291cmNlRmllbGQsIE1vZGlmaWVyS2V5d29yZC5TVEFUSUNfS0VZV09SRCk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wdWJsaWMgc3RhdGljIGludCBmb287IC8vUFJPUEVSVFkgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3B1YmxpYyBzdGF0aWMgaW50IGZvbzsgLy9GSUVMRCBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCS8vcHVibGljIHN0YXRpYyBpbnQgZm9vOyAvL05PTkUgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX05PTkUpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCS8vcHVibGljIHN0YXRpYyBpbnQgZm9vOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QVUJMSUNfTUVNQkVSKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQl0aGlzLnJlbW92ZU1vZGlmaWVycyhyZXNvdXJjZUZpZWxkLCBNb2RpZmllcktleXdvcmQuU1RBVElDX0tFWVdPUkQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1YmxpY0ZpbmFsRmllbGRUZXN0KEpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nKSB7Ci0JCUl0ZXJhdG9yPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gKEphdmFSZXNvdXJjZUZpZWxkKSBhdHRyaWJ1dGVzLm5leHQoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQkvL3B1YmxpYyBmaW5hbCBpbnQgZm9vOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5hZGRNb2RpZmllcnMocmVzb3VyY2VGaWVsZCwgTW9kaWZpZXJLZXl3b3JkLkZJTkFMX0tFWVdPUkQpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL3B1YmxpYyBmaW5hbCBpbnQgZm9vOyAvL1BST1BFUlRZIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wdWJsaWMgZmluYWwgaW50IGZvbzsgLy9GSUVMRCBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCS8vcHVibGljIGZpbmFsIGludCBmb287IC8vTk9ORSBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fTk9ORSk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wdWJsaWMgZmluYWwgaW50IGZvbzsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QVUJMSUNfTUVNQkVSKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJdGhpcy5yZW1vdmVNb2RpZmllcnMocmVzb3VyY2VGaWVsZCwgTW9kaWZpZXJLZXl3b3JkLkZJTkFMX0tFWVdPUkQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1YmxpY1N0YXRpY0ZpbmFsRmllbGRUZXN0KEpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nKSB7Ci0JCUl0ZXJhdG9yPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gKEphdmFSZXNvdXJjZUZpZWxkKSBhdHRyaWJ1dGVzLm5leHQoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZvbzsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLmFkZE1vZGlmaWVycyhyZXNvdXJjZUZpZWxkLCBNb2RpZmllcktleXdvcmQuU1RBVElDX0tFWVdPUkQsIE1vZGlmaWVyS2V5d29yZC5GSU5BTF9LRVlXT1JEKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZvbzsgLy9QUk9QRVJUWSBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCS8vcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZm9vOyAvL0ZJRUxEIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmb287IC8vTk9ORSBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fTk9ORSk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmb287IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BVQkxJQ19NRU1CRVIpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCXRoaXMucmVtb3ZlTW9kaWZpZXJzKHJlc291cmNlRmllbGQsIE1vZGlmaWVyS2V5d29yZC5TVEFUSUNfS0VZV09SRCwgTW9kaWZpZXJLZXl3b3JkLkZJTkFMX0tFWVdPUkQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaXZhdGVGaWVsZFRlc3QoSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcpIHsKLQkJSXRlcmF0b3I8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSAoSmF2YVJlc291cmNlRmllbGQpIGF0dHJpYnV0ZXMubmV4dCgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlyZW1vdmVNb2RpZmllcnMocmVzb3VyY2VGaWVsZCwgTW9kaWZpZXJLZXl3b3JkLlBVQkxJQ19LRVlXT1JEKTsKLQkJYWRkTW9kaWZpZXJzKHJlc291cmNlRmllbGQsIE1vZGlmaWVyS2V5d29yZC5QUklWQVRFX0tFWVdPUkQpOwotCi0JCS8vcHJpdmF0ZSBpbnQgZm9vOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wcml2YXRlIGludCBmb287IC8vUFJPUEVSVFkgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3ByaXZhdGUgaW50IGZvbzsgLy9GSUVMRCBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCS8vcHJpdmF0ZSBpbnQgZm9vOyAvL05PTkUgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX05PTkUpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCS8vcHJpdmF0ZSBpbnQgZm9vOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QVUJMSUNfTUVNQkVSKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCi0JCS8vYWRkIEBYbWxBdHRyaWJ1dGUgYW5ub3RhdGlvbiBhbmQgdGVzdCBlYWNoIGFjY2VzcyB0eXBlCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUZpZWxkKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJCX0KLQkJfSk7Ci0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3ByaXZhdGUgaW50IGZvbzsgLy9QUk9QRVJUWSBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3ByaXZhdGUgaW50IGZvbzsgLy9GSUVMRCBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3ByaXZhdGUgaW50IGZvbzsgLy9OT05FIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX05PTkUpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wcml2YXRlIGludCBmb287IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFVCTElDX01FTUJFUik7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJCX0KLQkJfSk7Ci0JCXJlbW92ZU1vZGlmaWVycyhyZXNvdXJjZUZpZWxkLCBNb2RpZmllcktleXdvcmQuUFJJVkFURV9LRVlXT1JEKTsKLQkJYWRkTW9kaWZpZXJzKHJlc291cmNlRmllbGQsIE1vZGlmaWVyS2V5d29yZC5QVUJMSUNfS0VZV09SRCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpdmF0ZVRyYW5zaWVudEZpZWxkVGVzdChKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZykgewotCQlJdGVyYXRvcjxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IChKYXZhUmVzb3VyY2VGaWVsZCkgYXR0cmlidXRlcy5uZXh0KCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCXJlbW92ZU1vZGlmaWVycyhyZXNvdXJjZUZpZWxkLCBNb2RpZmllcktleXdvcmQuUFVCTElDX0tFWVdPUkQpOwotCQlhZGRNb2RpZmllcnMocmVzb3VyY2VGaWVsZCwgTW9kaWZpZXJLZXl3b3JkLlBSSVZBVEVfS0VZV09SRCwgTW9kaWZpZXJLZXl3b3JkLlRSQU5TSUVOVF9LRVlXT1JEKTsKLQotCQkvL3ByaXZhdGUgdHJhbnNpZW50IGludCBmb287IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3ByaXZhdGUgdHJhbnNpZW50IGludCBmb287IC8vUFJPUEVSVFkgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3ByaXZhdGUgdHJhbnNpZW50IGludCBmb287IC8vRklFTEQgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3ByaXZhdGUgdHJhbnNpZW50IGludCBmb287IC8vTk9ORSBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fTk9ORSk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wcml2YXRlIHRyYW5zaWVudCBpbnQgZm9vOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QVUJMSUNfTUVNQkVSKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCi0JCS8vYWRkIEBYbWxBdHRyaWJ1dGUgYW5ub3RhdGlvbiBhbmQgdGVzdCBlYWNoIGFjY2VzcyB0eXBlCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUZpZWxkKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJCX0KLQkJfSk7Ci0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3ByaXZhdGUgdHJhbnNpZW50IGludCBmb287IC8vUFJPUEVSVFkgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wcml2YXRlIHRyYW5zaWVudCBpbnQgZm9vOyAvL0ZJRUxEIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHJpdmF0ZSB0cmFuc2llbnQgaW50IGZvbzsgLy9OT05FIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX05PTkUpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wcml2YXRlIHRyYW5zaWVudCBpbnQgZm9vOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BVQkxJQ19NRU1CRVIpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCX0pOwotCQlyZW1vdmVNb2RpZmllcnMocmVzb3VyY2VGaWVsZCwgTW9kaWZpZXJLZXl3b3JkLlBSSVZBVEVfS0VZV09SRCwgTW9kaWZpZXJLZXl3b3JkLlRSQU5TSUVOVF9LRVlXT1JEKTsKLQkJYWRkTW9kaWZpZXJzKHJlc291cmNlRmllbGQsIE1vZGlmaWVyS2V5d29yZC5QVUJMSUNfS0VZV09SRCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpdmF0ZVN0YXRpY0ZpZWxkVGVzdChKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZykgewotCQlJdGVyYXRvcjxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IChKYXZhUmVzb3VyY2VGaWVsZCkgYXR0cmlidXRlcy5uZXh0KCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCXJlbW92ZU1vZGlmaWVycyhyZXNvdXJjZUZpZWxkLCBNb2RpZmllcktleXdvcmQuUFVCTElDX0tFWVdPUkQpOwotCQlhZGRNb2RpZmllcnMocmVzb3VyY2VGaWVsZCwgTW9kaWZpZXJLZXl3b3JkLlBSSVZBVEVfS0VZV09SRCwgTW9kaWZpZXJLZXl3b3JkLlNUQVRJQ19LRVlXT1JEKTsKLQotCQkvL3ByaXZhdGUgc3RhdGljIGludCBmb287IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3ByaXZhdGUgc3RhdGljIGludCBmb287IC8vUFJPUEVSVFkgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3ByaXZhdGUgc3RhdGljIGludCBmb287IC8vRklFTEQgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3ByaXZhdGUgc3RhdGljIGludCBmb287IC8vTk9ORSBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fTk9ORSk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wcml2YXRlIHN0YXRpYyBpbnQgZm9vOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QVUJMSUNfTUVNQkVSKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCi0JCS8vYWRkIEBYbWxBdHRyaWJ1dGUgYW5ub3RhdGlvbiBhbmQgdGVzdCBlYWNoIGFjY2VzcyB0eXBlCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUZpZWxkKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJCX0KLQkJfSk7Ci0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3ByaXZhdGUgc3RhdGljIGludCBmb287IC8vUFJPUEVSVFkgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wcml2YXRlIHN0YXRpYyBpbnQgZm9vOyAvL0ZJRUxEIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHJpdmF0ZSBzdGF0aWMgaW50IGZvbzsgLy9OT05FIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX05PTkUpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wcml2YXRlIHN0YXRpYyBpbnQgZm9vOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BVQkxJQ19NRU1CRVIpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCX0pOwotCQlyZW1vdmVNb2RpZmllcnMocmVzb3VyY2VGaWVsZCwgTW9kaWZpZXJLZXl3b3JkLlBSSVZBVEVfS0VZV09SRCwgTW9kaWZpZXJLZXl3b3JkLlNUQVRJQ19LRVlXT1JEKTsKLQkJYWRkTW9kaWZpZXJzKHJlc291cmNlRmllbGQsIE1vZGlmaWVyS2V5d29yZC5QVUJMSUNfS0VZV09SRCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpdmF0ZVN0YXRpY0ZpbmFsRmllbGRUZXN0KEpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nKSB7Ci0JCUl0ZXJhdG9yPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gKEphdmFSZXNvdXJjZUZpZWxkKSBhdHRyaWJ1dGVzLm5leHQoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJcmVtb3ZlTW9kaWZpZXJzKHJlc291cmNlRmllbGQsIE1vZGlmaWVyS2V5d29yZC5QVUJMSUNfS0VZV09SRCk7Ci0JCWFkZE1vZGlmaWVycyhyZXNvdXJjZUZpZWxkLCBNb2RpZmllcktleXdvcmQuUFJJVkFURV9LRVlXT1JELCBNb2RpZmllcktleXdvcmQuU1RBVElDX0tFWVdPUkQsIE1vZGlmaWVyS2V5d29yZC5GSU5BTF9LRVlXT1JEKTsKLQotCQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIGludCBmb287IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIGludCBmb287IC8vUFJPUEVSVFkgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIGludCBmb287IC8vRklFTEQgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIGludCBmb287IC8vTk9ORSBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fTk9ORSk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZm9vOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QVUJMSUNfTUVNQkVSKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCi0JCS8vYWRkIEBYbWxBdHRyaWJ1dGUgYW5ub3RhdGlvbiBhbmQgdGVzdCBlYWNoIGFjY2VzcyB0eXBlCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUZpZWxkKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJCX0KLQkJfSk7Ci0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIGludCBmb287IC8vUFJPUEVSVFkgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZm9vOyAvL0ZJRUxEIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGZvbzsgLy9OT05FIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX05PTkUpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZm9vOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BVQkxJQ19NRU1CRVIpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcm9wZXJ0eUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFhtbFR5cGVXaXRoUHJvcGVydHlBbmRQdWJsaWNNZW1iZXJBY2Nlc3MoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJCi0JCS8vcHVibGljIGludCBnZXRGb28oKTssIHB1YmxpYyB2b2lkIHNldEZvbyhpbnQpOwotCQlwdWJsaWNHZXR0ZXJTZXR0ZXJUZXN0KGNsYXNzTWFwcGluZyk7Ci0JCQotCQkvL3B1YmxpYyBzdGF0aWMgaW50IGdldEZvbygpOywgcHVibGljIHN0YXRpYyB2b2lkIHNldEZvbyhpbnQpOwotCQlwdWJsaWNTdGF0aWNHZXR0ZXJTZXR0ZXJUZXN0KGNsYXNzTWFwcGluZyk7Ci0JCQotCQkvL3ByaXZhdGUgaW50IGdldEZvbygpOywgcHJpdmF0ZSB2b2lkIHNldEZvbyhpbnQpOwotCQlwcml2YXRlR2V0dGVyU2V0dGVyVGVzdChjbGFzc01hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlR2V0dGVyUHJvcGVydHlBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RYbWxUeXBlV2l0aFByb3BlcnR5R2V0dGVyQW5kUHVibGljTWVtYmVyQWNjZXNzKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCQotCQkvL3B1YmxpYyBpbnQgZ2V0Rm9vKCk7IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCS8vcHVibGljIGludCBnZXRGb28oKTsgUFJPUEVSVFkgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQkvL3B1YmxpYyBpbnQgZ2V0Rm9vKCk7IEZJRUxEIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJLy9wdWJsaWMgaW50IGdldEZvbygpOyBOT05FIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fTk9ORSk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQkvL3B1YmxpYyBpbnQgZ2V0Rm9vKCk7IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QVUJMSUNfTUVNQkVSKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCS8vYWRkIEBYbWxBdHRyaWJ1dGUgYW5ub3RhdGlvbiBhbmQgdGVzdCBlYWNoIGFjY2VzcyB0eXBlCi0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGNsYXNzTWFwcGluZy5nZXRKYXhiVHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRNZXRob2RzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZU1ldGhvZCk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCX0pOwotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wdWJsaWMgaW50IGdldEZvbygpOyBQUk9QRVJUWSBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFJPUEVSVFkpOwotCQlJdGVyYXRvcjxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHVibGljIGludCBnZXRGb28oKTsgRklFTEQgYWNjZXNzIC0gcGVyc2lzdGVudAotCQlzZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wdWJsaWMgaW50IGdldEZvbygpOyBOT05FIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX05PTkUpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3B1YmxpYyBpbnQgZ2V0Rm9vKCk7IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFVCTElDX01FTUJFUik7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU2V0dGVyUHJvcGVydHlBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RYbWxUeXBlV2l0aFByb3BlcnR5U2V0dGVyQW5kUHVibGljTWVtYmVyQWNjZXNzKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCQotCQkvL3B1YmxpYyB2b2lkIHNldEZvbyhpbnQgZm9vKTsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJLy9wdWJsaWMgdm9pZCBzZXRGb28oaW50IGZvbyk7IFBST1BFUlRZIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQkvL3B1YmxpYyB2b2lkIHNldEZvbyhpbnQgZm9vKTsgRklFTEQgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQkvL3B1YmxpYyB2b2lkIHNldEZvbyhpbnQgZm9vKTsgTk9ORSBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQlzZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX05PTkUpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJLy9wdWJsaWMgdm9pZCBzZXRGb28oaW50IGZvbyk7IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gcGVyc2lzdGVudAotCQlzZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BVQkxJQ19NRU1CRVIpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJLy9hZGQgQFhtbEF0dHJpYnV0ZSBhbm5vdGF0aW9uIGFuZCB0ZXN0IGVhY2ggYWNjZXNzIHR5cGUKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gY2xhc3NNYXBwaW5nLmdldEpheGJUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldE1ldGhvZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlTWV0aG9kKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJCX0KLQkJfSk7Ci0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3B1YmxpYyB2b2lkIHNldEZvbyhpbnQgZm9vKTs7IFBST1BFUlRZIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QUk9QRVJUWSk7Ci0JCUl0ZXJhdG9yPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3B1YmxpYyB2b2lkIHNldEZvbyhpbnQgZm9vKTsgRklFTEQgYWNjZXNzIC0gcGVyc2lzdGVudAotCQlzZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHVibGljIHZvaWQgc2V0Rm9vKGludCBmb28pOyBOT05FIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wdWJsaWMgdm9pZCBzZXRGb28oaW50IGZvbyk7IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gcGVyc2lzdGVudAotCQlzZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BVQkxJQ19NRU1CRVIpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUdldHRlckxpc3RQcm9wZXJ0eUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0WG1sVHlwZVdpdGhQcm9wZXJ0eUdldHRlckxpc3RBbmRQdWJsaWNNZW1iZXJBY2Nlc3MoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJCi0JCS8vcHVibGljIExpc3Q8Pz4gZ2V0Rm9vKCk7IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gcGVyc2lzdGVudAotCQlJdGVyYXRvcjxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9wdWJsaWMgTGlzdDw/PiBnZXRGb28oKTsgUFJPUEVSVFkgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFJPUEVSVFkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL3B1YmxpYyBMaXN0PD8+IGdldEZvbygpOyBGSUVMRCBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCS8vcHVibGljIExpc3Q8Pz4gZ2V0Rm9vKCk7IE5PTkUgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX05PTkUpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCS8vcHVibGljIExpc3Q8Pz4gZ2V0Rm9vKCk7IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFVCTElDX01FTUJFUik7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCS8vYWRkIEBYbWxBdHRyaWJ1dGUgYW5ub3RhdGlvbiBhbmQgdGVzdCBlYWNoIGFjY2VzcyB0eXBlCi0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGNsYXNzTWFwcGluZy5nZXRKYXhiVHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRNZXRob2RzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZU1ldGhvZCk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCX0pOwotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wdWJsaWMgTGlzdDw/PiBnZXRGb28oKTsgUFJPUEVSVFkgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFJPUEVSVFkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wdWJsaWMgTGlzdDw/PiBnZXRGb28oKTsgRklFTEQgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wdWJsaWMgTGlzdDw/PiBnZXRGb28oKTsgTk9ORSBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHVibGljIExpc3Q8Pz4gZ2V0Rm9vKCk7IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFVCTElDX01FTUJFUik7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVibGljR2V0dGVyU2V0dGVyVGVzdChKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZykgewotCQkvL3B1YmxpYyBpbnQgZ2V0Rm9vKCk7LCBwdWJsaWMgdm9pZCBzZXRGb28oaW50KTsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCUl0ZXJhdG9yPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL3B1YmxpYyBpbnQgZ2V0Rm9vKCk7LCBwdWJsaWMgdm9pZCBzZXRGb28oaW50KTsgUFJPUEVSVFkgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL3B1YmxpYyBpbnQgZ2V0Rm9vKCk7LCBwdWJsaWMgdm9pZCBzZXRGb28oaW50KTsgRklFTEQgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3B1YmxpYyBpbnQgZ2V0Rm9vKCk7LCBwdWJsaWMgdm9pZCBzZXRGb28oaW50KTsgTk9ORSBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fTk9ORSk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wdWJsaWMgaW50IGdldEZvbygpOywgcHVibGljIHZvaWQgc2V0Rm9vKGludCk7IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFVCTElDX01FTUJFUik7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0KLQkJLy9hZGQgQFhtbEF0dHJpYnV0ZSBhbm5vdGF0aW9uIGFuZCB0ZXN0IGVhY2ggYWNjZXNzIHR5cGUKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gKEphdmFSZXNvdXJjZU1ldGhvZCkgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlTWV0aG9kKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJCX0KLQkJfSk7Ci0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3B1YmxpYyBpbnQgZ2V0Rm9vKCk7LCBwdWJsaWMgdm9pZCBzZXRGb28oaW50KTsgUFJPUEVSVFkgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wdWJsaWMgaW50IGdldEZvbygpOywgcHVibGljIHZvaWQgc2V0Rm9vKGludCk7IEZJRUxEIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHVibGljIGludCBnZXRGb28oKTssIHB1YmxpYyB2b2lkIHNldEZvbyhpbnQpOyBOT05FIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX05PTkUpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wdWJsaWMgaW50IGdldEZvbygpOywgcHVibGljIHZvaWQgc2V0Rm9vKGludCk7IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFVCTElDX01FTUJFUik7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVibGljU3RhdGljR2V0dGVyU2V0dGVyVGVzdChKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZykgewotCQlJdGVyYXRvcjxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJUHJvcGVydHlBY2Nlc3NvciBwcm9wZXJ0eUFjY2Vzc29yID0gKFByb3BlcnR5QWNjZXNzb3IpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKGF0dHJpYnV0ZXMubmV4dCgpLCAiYWNjZXNzb3IiKTsKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlR2V0dGVyID0gcHJvcGVydHlBY2Nlc3Nvci5nZXRSZXNvdXJjZUdldHRlck1ldGhvZCgpOwotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VTZXR0ZXIgPSBwcm9wZXJ0eUFjY2Vzc29yLmdldFJlc291cmNlU2V0dGVyTWV0aG9kKCk7Ci0KLQkJLy9wdWJsaWMgc3RhdGljIGludCBnZXRGb28oKTssIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb28oaW50KTsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLmFkZE1vZGlmaWVycyhyZXNvdXJjZUdldHRlciwgTW9kaWZpZXJLZXl3b3JkLlNUQVRJQ19LRVlXT1JEKTsKLQkJdGhpcy5hZGRNb2RpZmllcnMocmVzb3VyY2VTZXR0ZXIsIE1vZGlmaWVyS2V5d29yZC5TVEFUSUNfS0VZV09SRCk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQotCQkvL3B1YmxpYyBzdGF0aWMgaW50IGdldEZvbygpOywgcHVibGljIHN0YXRpYyB2b2lkIHNldEZvbyhpbnQpOyBQUk9QRVJUWSBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCS8vcHVibGljIHN0YXRpYyBpbnQgZ2V0Rm9vKCk7LCBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9vKGludCk7IEZJRUxEIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wdWJsaWMgc3RhdGljIGludCBnZXRGb28oKTssIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb28oaW50KTsgTk9ORSBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fTk9ORSk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wdWJsaWMgc3RhdGljIGludCBnZXRGb28oKTssIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb28oaW50KTsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFVCTElDX01FTUJFUik7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQotCQkvL2FkZCBAWG1sQXR0cmlidXRlIGFubm90YXRpb24gYW5kIHRlc3QgZWFjaCBhY2Nlc3MgdHlwZQotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VHZXR0ZXIpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQkJfQotCQl9KTsKLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHVibGljIHN0YXRpYyBpbnQgZ2V0Rm9vKCk7LCBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9vKGludCk7IFBST1BFUlRZIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHVibGljIHN0YXRpYyBpbnQgZ2V0Rm9vKCk7LCBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9vKGludCk7IEZJRUxEIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHVibGljIHN0YXRpYyBpbnQgZ2V0Rm9vKCk7LCBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9vKGludCk7IE5PTkUgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fTk9ORSk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3B1YmxpYyBzdGF0aWMgaW50IGdldEZvbygpOywgcHVibGljIHN0YXRpYyB2b2lkIHNldEZvbyhpbnQpOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BVQkxJQ19NRU1CRVIpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLnJlbW92ZU1vZGlmaWVycyhyZXNvdXJjZUdldHRlciwgTW9kaWZpZXJLZXl3b3JkLlNUQVRJQ19LRVlXT1JEKTsKLQkJdGhpcy5yZW1vdmVNb2RpZmllcnMocmVzb3VyY2VTZXR0ZXIsIE1vZGlmaWVyS2V5d29yZC5TVEFUSUNfS0VZV09SRCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpdmF0ZUdldHRlclNldHRlclRlc3QoSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcpIHsKLQkJSXRlcmF0b3I8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCVByb3BlcnR5QWNjZXNzb3IgcHJvcGVydHlBY2Nlc3NvciA9IChQcm9wZXJ0eUFjY2Vzc29yKSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShhdHRyaWJ1dGVzLm5leHQoKSwgImFjY2Vzc29yIik7Ci0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZUdldHRlciA9IHByb3BlcnR5QWNjZXNzb3IuZ2V0UmVzb3VyY2VHZXR0ZXJNZXRob2QoKTsKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlU2V0dGVyID0gcHJvcGVydHlBY2Nlc3Nvci5nZXRSZXNvdXJjZVNldHRlck1ldGhvZCgpOwotCi0JCS8vcHJpdmF0ZSBpbnQgZ2V0Rm9vKCk7LCBwcml2YXRlIHZvaWQgc2V0Rm9vKGludCk7IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5yZW1vdmVNb2RpZmllcnMocmVzb3VyY2VHZXR0ZXIsIE1vZGlmaWVyS2V5d29yZC5QVUJMSUNfS0VZV09SRCk7Ci0JCXRoaXMucmVtb3ZlTW9kaWZpZXJzKHJlc291cmNlU2V0dGVyLCBNb2RpZmllcktleXdvcmQuUFVCTElDX0tFWVdPUkQpOwotCQl0aGlzLmFkZE1vZGlmaWVycyhyZXNvdXJjZUdldHRlciwgTW9kaWZpZXJLZXl3b3JkLlBSSVZBVEVfS0VZV09SRCk7Ci0JCXRoaXMuYWRkTW9kaWZpZXJzKHJlc291cmNlU2V0dGVyLCBNb2RpZmllcktleXdvcmQuUFJJVkFURV9LRVlXT1JEKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCi0JCS8vcHJpdmF0ZSBpbnQgZ2V0Rm9vKCk7LCBwcml2YXRlIHZvaWQgc2V0Rm9vKGludCk7IFBST1BFUlRZIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9wcml2YXRlIGludCBnZXRGb28oKTssIHByaXZhdGUgdm9pZCBzZXRGb28oaW50KTsgRklFTEQgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3ByaXZhdGUgaW50IGdldEZvbygpOywgcHJpdmF0ZSB2b2lkIHNldEZvbyhpbnQpOyBOT05FIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3ByaXZhdGUgaW50IGdldEZvbygpOywgcHJpdmF0ZSB2b2lkIHNldEZvbyhpbnQpOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QVUJMSUNfTUVNQkVSKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCi0JCS8vYWRkIEBYbWxBdHRyaWJ1dGUgYW5ub3RhdGlvbiBhbmQgdGVzdCBlYWNoIGFjY2VzcyB0eXBlCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUdldHRlcik7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCX0pOwotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wcml2YXRlIGludCBnZXRGb28oKTssIHByaXZhdGUgdm9pZCBzZXRGb28oaW50KTsgUFJPUEVSVFkgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wcml2YXRlIGludCBnZXRGb28oKTssIHByaXZhdGUgdm9pZCBzZXRGb28oaW50KTsgRklFTEQgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wcml2YXRlIGludCBnZXRGb28oKTssIHByaXZhdGUgdm9pZCBzZXRGb28oaW50KTsgTk9ORSBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHJpdmF0ZSBpbnQgZ2V0Rm9vKCk7LCBwcml2YXRlIHZvaWQgc2V0Rm9vKGludCk7IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFVCTElDX01FTUJFUik7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMucmVtb3ZlTW9kaWZpZXJzKHJlc291cmNlR2V0dGVyLCBNb2RpZmllcktleXdvcmQuUFJJVkFURV9LRVlXT1JEKTsKLQkJdGhpcy5yZW1vdmVNb2RpZmllcnMocmVzb3VyY2VTZXR0ZXIsIE1vZGlmaWVyS2V5d29yZC5QUklWQVRFX0tFWVdPUkQpOwotCQl0aGlzLmFkZE1vZGlmaWVycyhyZXNvdXJjZUdldHRlciwgTW9kaWZpZXJLZXl3b3JkLlBVQkxJQ19LRVlXT1JEKTsKLQkJdGhpcy5hZGRNb2RpZmllcnMocmVzb3VyY2VTZXR0ZXIsIE1vZGlmaWVyS2V5d29yZC5QVUJMSUNfS0VZV09SRCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxTZWVBbHNvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJWG1sU2VlQWxzb0Fubm90YXRpb24gYW5ub3RhdGlvbiA9IChYbWxTZWVBbHNvQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0VFX0FMU08pOwotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRYbWxTZWVBbHNvKCkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQkKLQkJY2xhc3NNYXBwaW5nLmFkZFhtbFNlZUFsc28oKTsKLQkJYW5ub3RhdGlvbiA9IChYbWxTZWVBbHNvQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0VFX0FMU08pOwotCQlhc3NlcnROb3ROdWxsKGNsYXNzTWFwcGluZy5nZXRYbWxTZWVBbHNvKCkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQkKLQkJY2xhc3NNYXBwaW5nLnJlbW92ZVhtbFNlZUFsc28oKTsKLQkJYW5ub3RhdGlvbiA9IChYbWxTZWVBbHNvQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0VFX0FMU08pOwotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRYbWxTZWVBbHNvKCkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sU2VlQWxzbygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCVhtbFNlZUFsc29Bbm5vdGF0aW9uIGFubm90YXRpb24gPSAoWG1sU2VlQWxzb0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NFRV9BTFNPKTsKLQkJYXNzZXJ0TnVsbChjbGFzc01hcHBpbmcuZ2V0WG1sU2VlQWxzbygpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVR5cGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfU0VFX0FMU08pOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCWFubm90YXRpb24gPSAoWG1sU2VlQWxzb0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NFRV9BTFNPKTsKLQkJYXNzZXJ0Tm90TnVsbChjbGFzc01hcHBpbmcuZ2V0WG1sU2VlQWxzbygpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdCgKLQkJCQkJCU1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfU0VFX0FMU08pOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJYW5ub3RhdGlvbiA9IChYbWxTZWVBbHNvQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0VFX0FMU08pOwotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRYbWxTZWVBbHNvKCkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNb2RpZmllcnMoSmF2YVJlc291cmNlTWVtYmVyIHJlc291cmNlTWVtYmVyLCBmaW5hbCBNb2RpZmllcktleXdvcmQuLi4gbW9kaWZpZXJzKSB7Ci0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZU1lbWJlcik7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5hZGRNb2RpZmllcnMoKEJvZHlEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgbW9kaWZpZXJzKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTW9kaWZpZXJzKEphdmFSZXNvdXJjZU1lbWJlciByZXNvdXJjZU1lbWJlciwgZmluYWwgTW9kaWZpZXJLZXl3b3JkLi4uIG1vZGlmaWVycykgewotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VNZW1iZXIpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlTW9kaWZpZXJzKChCb2R5RGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIG1vZGlmaWVycyk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE1vZGlmaWVycyhCb2R5RGVjbGFyYXRpb24gYm9keURlY2xhcmF0aW9uLCBNb2RpZmllcktleXdvcmQuLi4gbW9kaWZpZXJzKSB7Ci0JCWZvciAoTW9kaWZpZXJLZXl3b3JkIG1vZGlmaWVyIDogbW9kaWZpZXJzKSB7Ci0JCQl0aGlzLm1vZGlmaWVycyhib2R5RGVjbGFyYXRpb24pLmFkZChib2R5RGVjbGFyYXRpb24uZ2V0QVNUKCkubmV3TW9kaWZpZXIobW9kaWZpZXIpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1vZGlmaWVycyhCb2R5RGVjbGFyYXRpb24gYm9keURlY2xhcmF0aW9uLCBNb2RpZmllcktleXdvcmQuLi4gbW9kaWZpZXJLZXl3b3JkcykgewotCQlmb3IgKE1vZGlmaWVyS2V5d29yZCBtb2RpZmllcktleVdvcmQgOiBtb2RpZmllcktleXdvcmRzKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPElFeHRlbmRlZE1vZGlmaWVyPiBzdHJlYW0gPSB0aGlzLm1vZGlmaWVycyhib2R5RGVjbGFyYXRpb24pLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQkJSUV4dGVuZGVkTW9kaWZpZXIgbW9kaWZpZXIgPSBzdHJlYW0ubmV4dCgpOwotCQkJCWlmIChtb2RpZmllci5pc01vZGlmaWVyKCkpIHsKLQkJCQkJaWYgKCgoTW9kaWZpZXIpIG1vZGlmaWVyKS5nZXRLZXl3b3JkKCkgPT0gbW9kaWZpZXJLZXlXb3JkKSB7Ci0JCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBtb2RpZmllcnMoQm9keURlY2xhcmF0aW9uIGJvZHlEZWNsYXJhdGlvbikgewotCQlyZXR1cm4gYm9keURlY2xhcmF0aW9uLm1vZGlmaWVycygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcsIGZpbmFsIFN0cmluZyBhY2Nlc3NUeXBlKSB7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VDbGFzcyA9IGNsYXNzTWFwcGluZy5nZXRKYXhiVHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQ2xhc3MpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuc2V0RW51bU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfQUNDRVNTT1JfVFlQRSwgYWNjZXNzVHlwZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZFRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2RUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmU4Zjc2Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiRWxlbWVudEZhY3RvcnlNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50RGVjbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kVGVzdHMKLQkJZXh0ZW5kcyBKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBHZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ2xhc3NXaXRoWG1sUmVnaXN0cnlBbmRDcmVhdGVNZXRob2RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKFBBQ0tBR0VfTkFNRSwgIk9iamVjdEZhY3RvcnkuamF2YSIsICJPYmplY3RGYWN0b3J5IiwgbmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1JFR0lTVFJZLCBKQVhCLlhNTF9FTEVNRU5UX0RFQ0wsICJqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudCIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxSZWdpc3RyeSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldE5hbWVNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEVsZW1lbnREZWNsIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBKQVhCRWxlbWVudDxBbm5vdGF0aW9uVGVzdFR5cGU+IGNyZWF0ZUZvbyhBbm5vdGF0aW9uVGVzdFR5cGUgdmFsdWUpIHtyZXR1cm4gbnVsbH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFhtbEVsZW1lbnREZWNsKG5hbWU9XCJiYXJcIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEpBWEJFbGVtZW50IGNyZWF0ZUJhcihPYmplY3QgdmFsdWUpIHtyZXR1cm4gbnVsbH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlFbGVtZW50TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFJlZ2lzdHJ5QW5kQ3JlYXRlTWV0aG9kcygpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZSgidGVzdC5PYmplY3RGYWN0b3J5Iik7Ci0JCVhtbFJlZ2lzdHJ5IHhtbFJlZ2lzdHJ5ID0gamF4YkNsYXNzLmdldFhtbFJlZ2lzdHJ5KCk7Ci0JCQotCQlJdGVyYXRvcjxKYXhiRWxlbWVudEZhY3RvcnlNZXRob2Q+IGVsZW1lbnRGYWN0b3J5TWV0aG9kcyA9IHhtbFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCUpheGJFbGVtZW50RmFjdG9yeU1ldGhvZCBlbGVtZW50RmFjdG9yeU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kcy5uZXh0KCk7Ci0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFJlc291cmNlTWV0aG9kKCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCi0JCWVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiYmFyIik7Ci0JCVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiBlbGVtZW50RGVjbEFubm90YXRpb24gPSAoWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgZWxlbWVudERlY2xBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCi0JCSAvL3ZlcmlmeSB0aGUgeG1sIGVsZW1lbnQgZGVjbCBhbm5vdGF0aW9uIGlzIG5vdCByZW1vdmVkIHdoZW4gdGhlIGVsZW1lbnQgbmFtZSBpcyBzZXQgdG8gbnVsbAotCQllbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWVsZW1lbnREZWNsQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50RGVjbEFubm90YXRpb24pIHJlc291cmNlTWV0aG9kLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50RGVjbEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVFbGVtZW50TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFJlZ2lzdHJ5QW5kQ3JlYXRlTWV0aG9kcygpOwotCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoInRlc3QuT2JqZWN0RmFjdG9yeSIpOwotCQlYbWxSZWdpc3RyeSB4bWxSZWdpc3RyeSA9IGpheGJDbGFzcy5nZXRYbWxSZWdpc3RyeSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHhtbFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kc1NpemUoKSk7Ci0JCUl0ZXJhdG9yPEpheGJFbGVtZW50RmFjdG9yeU1ldGhvZD4gZWxlbWVudEZhY3RvcnlNZXRob2RzID0geG1sUmVnaXN0cnkuZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzKCkuaXRlcmF0b3IoKTsKLQkJSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kIGVsZW1lbnRGYWN0b3J5TWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2RzLm5leHQoKTsKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UmVzb3VyY2VNZXRob2QoKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvL2FkZCBhIG5hbWUgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlTWV0aG9kKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZFRlc3RzLnRoaXMuYWRkWG1sRWxlbWVudERlY2xNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0VMRU1FTlRfREVDTF9fTkFNRSwgImZvbyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZFRlc3RzLnRoaXMucmVtb3ZlWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygxLCB4bWxSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sUmVnaXN0cnlBbmRDcmVhdGVNZXRob2RzKCk7Ci0KLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZSgidGVzdC5PYmplY3RGYWN0b3J5Iik7Ci0JCVhtbFJlZ2lzdHJ5IHhtbFJlZ2lzdHJ5ID0gamF4YkNsYXNzLmdldFhtbFJlZ2lzdHJ5KCk7Ci0JCQotCQlJdGVyYXRvcjxKYXhiRWxlbWVudEZhY3RvcnlNZXRob2Q+IGVsZW1lbnRGYWN0b3J5TWV0aG9kcyA9IHhtbFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCUpheGJFbGVtZW50RmFjdG9yeU1ldGhvZCBlbGVtZW50RmFjdG9yeU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kcy5uZXh0KCk7Ci0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFJlc291cmNlTWV0aG9kKCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCi0JCWVsZW1lbnRGYWN0b3J5TWV0aG9kLnNldERlZmF1bHRWYWx1ZSgiYmFyIik7Ci0JCVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiBlbGVtZW50RGVjbEFubm90YXRpb24gPSAoWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgZWxlbWVudERlY2xBbm5vdGF0aW9uLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXREZWZhdWx0VmFsdWUoKSk7Ci0KLQkJIC8vdmVyaWZ5IHRoZSB4bWwgZWxlbWVudCBkZWNsIGFubm90YXRpb24gaXMgbm90IHJlbW92ZWQgd2hlbiB0aGUgZWxlbWVudCBuYW1lIGlzIHNldCB0byBudWxsCi0JCWVsZW1lbnRGYWN0b3J5TWV0aG9kLnNldERlZmF1bHRWYWx1ZShudWxsKTsKLQkJZWxlbWVudERlY2xBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbikgcmVzb3VyY2VNZXRob2QuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCQlhc3NlcnROdWxsKGVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sUmVnaXN0cnlBbmRDcmVhdGVNZXRob2RzKCk7Ci0KLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZSgidGVzdC5PYmplY3RGYWN0b3J5Iik7Ci0JCVhtbFJlZ2lzdHJ5IHhtbFJlZ2lzdHJ5ID0gamF4YkNsYXNzLmdldFhtbFJlZ2lzdHJ5KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgeG1sUmVnaXN0cnkuZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzU2l6ZSgpKTsKLQkJSXRlcmF0b3I8SmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kPiBlbGVtZW50RmFjdG9yeU1ldGhvZHMgPSB4bWxSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHMoKS5pdGVyYXRvcigpOwotCQlKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QgZWxlbWVudEZhY3RvcnlNZXRob2QgPSBlbGVtZW50RmFjdG9yeU1ldGhvZHMubmV4dCgpOwotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRSZXNvdXJjZU1ldGhvZCgpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJCi0JCS8vYWRkIGEgbmFtZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VNZXRob2QpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kVGVzdHMudGhpcy5hZGRYbWxFbGVtZW50RGVjbE1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9ERUNMX19ERUZBVUxUX1ZBTFVFLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldERlZmF1bHRWYWx1ZSgpKTsKLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kVGVzdHMudGhpcy5yZW1vdmVYbWxFbGVtZW50RGVjbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHhtbFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNjb3BlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sUmVnaXN0cnlBbmRDcmVhdGVNZXRob2RzKCk7Ci0KLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZSgidGVzdC5PYmplY3RGYWN0b3J5Iik7Ci0JCVhtbFJlZ2lzdHJ5IHhtbFJlZ2lzdHJ5ID0gamF4YkNsYXNzLmdldFhtbFJlZ2lzdHJ5KCk7Ci0JCQotCQlJdGVyYXRvcjxKYXhiRWxlbWVudEZhY3RvcnlNZXRob2Q+IGVsZW1lbnRGYWN0b3J5TWV0aG9kcyA9IHhtbFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCUpheGJFbGVtZW50RmFjdG9yeU1ldGhvZCBlbGVtZW50RmFjdG9yeU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kcy5uZXh0KCk7Ci0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFJlc291cmNlTWV0aG9kKCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0U2NvcGUoKSk7Ci0JCWFzc2VydFRydWUoZWxlbWVudEZhY3RvcnlNZXRob2QuaXNHbG9iYWxTY29wZSgpKTsKLQkJCi0JCWVsZW1lbnRGYWN0b3J5TWV0aG9kLnNldFNjb3BlKCJCYXIiKTsKLQkJWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uIGVsZW1lbnREZWNsQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50RGVjbEFubm90YXRpb24pIHJlc291cmNlTWV0aG9kLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBlbGVtZW50RGVjbEFubm90YXRpb24uZ2V0U2NvcGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0U2NvcGUoKSk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRGYWN0b3J5TWV0aG9kLmlzR2xvYmFsU2NvcGUoKSk7Ci0JCQotCQllbGVtZW50RmFjdG9yeU1ldGhvZC5zZXRTY29wZShKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QuREVGQVVMVF9TQ09QRV9DTEFTU19OQU1FKTsKLQkJZWxlbWVudERlY2xBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbikgcmVzb3VyY2VNZXRob2QuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCQlhc3NlcnRFcXVhbHMoSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kLkRFRkFVTFRfU0NPUEVfQ0xBU1NfTkFNRSwgZWxlbWVudERlY2xBbm5vdGF0aW9uLmdldFNjb3BlKCkpOwotCQlhc3NlcnRFcXVhbHMoSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kLkRFRkFVTFRfU0NPUEVfQ0xBU1NfTkFNRSwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0U2NvcGUoKSk7Ci0JCWFzc2VydFRydWUoZWxlbWVudEZhY3RvcnlNZXRob2QuaXNHbG9iYWxTY29wZSgpKTsKLQkJCi0JCSAvL3ZlcmlmeSB0aGUgeG1sIGVsZW1lbnQgZGVjbCBhbm5vdGF0aW9uIGlzIG5vdCByZW1vdmVkIHdoZW4gdGhlIGVsZW1lbnQgbmFtZSBpcyBzZXQgdG8gbnVsbAotCQllbGVtZW50RmFjdG9yeU1ldGhvZC5zZXRTY29wZShudWxsKTsKLQkJZWxlbWVudERlY2xBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbikgcmVzb3VyY2VNZXRob2QuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCQlhc3NlcnROdWxsKGVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXRTY29wZSgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRTY29wZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNjb3BlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sUmVnaXN0cnlBbmRDcmVhdGVNZXRob2RzKCk7Ci0KLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZSgidGVzdC5PYmplY3RGYWN0b3J5Iik7Ci0JCVhtbFJlZ2lzdHJ5IHhtbFJlZ2lzdHJ5ID0gamF4YkNsYXNzLmdldFhtbFJlZ2lzdHJ5KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgeG1sUmVnaXN0cnkuZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzU2l6ZSgpKTsKLQkJSXRlcmF0b3I8SmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kPiBlbGVtZW50RmFjdG9yeU1ldGhvZHMgPSB4bWxSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHMoKS5pdGVyYXRvcigpOwotCQlKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QgZWxlbWVudEZhY3RvcnlNZXRob2QgPSBlbGVtZW50RmFjdG9yeU1ldGhvZHMubmV4dCgpOwotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRSZXNvdXJjZU1ldGhvZCgpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFNjb3BlKCkpOwotCQlhc3NlcnRUcnVlKGVsZW1lbnRGYWN0b3J5TWV0aG9kLmlzR2xvYmFsU2NvcGUoKSk7Ci0JCQotCQkvL2FkZCBhIG5hbWUgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlTWV0aG9kKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZFRlc3RzLnRoaXMuYWRkWG1sRWxlbWVudERlY2xUeXBlTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9FTEVNRU5UX0RFQ0xfX1NDT1BFLCAiRm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFNjb3BlKCkpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50RmFjdG9yeU1ldGhvZC5pc0dsb2JhbFNjb3BlKCkpOwotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2RUZXN0cy50aGlzLnJlbW92ZVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoMSwgeG1sUmVnaXN0cnkuZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3Vic3RpdHV0aW9uSGVhZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQljcmVhdGVDbGFzc1dpdGhYbWxSZWdpc3RyeUFuZENyZWF0ZU1ldGhvZHMoKTsKLQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKCJ0ZXN0Lk9iamVjdEZhY3RvcnkiKTsKLQkJWG1sUmVnaXN0cnkgeG1sUmVnaXN0cnkgPSBqYXhiQ2xhc3MuZ2V0WG1sUmVnaXN0cnkoKTsKLQkJCi0JCUl0ZXJhdG9yPEpheGJFbGVtZW50RmFjdG9yeU1ldGhvZD4gZWxlbWVudEZhY3RvcnlNZXRob2RzID0geG1sUmVnaXN0cnkuZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzKCkuaXRlcmF0b3IoKTsKLQkJSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kIGVsZW1lbnRGYWN0b3J5TWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2RzLm5leHQoKTsKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UmVzb3VyY2VNZXRob2QoKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRTdWJzdGl0dXRpb25IZWFkUU5hbWUoKS5nZXROYW1lKCkpOwotCi0JCWVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFN1YnN0aXR1dGlvbkhlYWRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUoImJhciIpOwotCQlYbWxFbGVtZW50RGVjbEFubm90YXRpb24gZWxlbWVudERlY2xBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbikgcmVzb3VyY2VNZXRob2QuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXRTdWJzdGl0dXRpb25IZWFkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRTdWJzdGl0dXRpb25IZWFkUU5hbWUoKS5nZXROYW1lKCkpOwotCi0JCSAvL3ZlcmlmeSB0aGUgeG1sIGVsZW1lbnQgZGVjbCBhbm5vdGF0aW9uIGlzIG5vdCByZW1vdmVkIHdoZW4gdGhlIGVsZW1lbnQgbmFtZSBpcyBzZXQgdG8gbnVsbAotCQllbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRTdWJzdGl0dXRpb25IZWFkUU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQllbGVtZW50RGVjbEFubm90YXRpb24gPSAoWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudERlY2xBbm5vdGF0aW9uLmdldFN1YnN0aXR1dGlvbkhlYWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFN1YnN0aXR1dGlvbkhlYWRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTdWJzdGl0dXRpb25IZWFkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFJlZ2lzdHJ5QW5kQ3JlYXRlTWV0aG9kcygpOwotCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoInRlc3QuT2JqZWN0RmFjdG9yeSIpOwotCQlYbWxSZWdpc3RyeSB4bWxSZWdpc3RyeSA9IGpheGJDbGFzcy5nZXRYbWxSZWdpc3RyeSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHhtbFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kc1NpemUoKSk7Ci0JCUl0ZXJhdG9yPEpheGJFbGVtZW50RmFjdG9yeU1ldGhvZD4gZWxlbWVudEZhY3RvcnlNZXRob2RzID0geG1sUmVnaXN0cnkuZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzKCkuaXRlcmF0b3IoKTsKLQkJSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kIGVsZW1lbnRGYWN0b3J5TWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2RzLm5leHQoKTsKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UmVzb3VyY2VNZXRob2QoKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRTdWJzdGl0dXRpb25IZWFkUU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy9hZGQgYSBuYW1lIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZU1ldGhvZCk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2RUZXN0cy50aGlzLmFkZFhtbEVsZW1lbnREZWNsTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9FTEVNRU5UX0RFQ0xfX1NVQlNUSVRVVElPTl9IRUFEX05BTUUsICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0U3Vic3RpdHV0aW9uSGVhZFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kVGVzdHMudGhpcy5yZW1vdmVYbWxFbGVtZW50RGVjbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHhtbFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQljcmVhdGVDbGFzc1dpdGhYbWxSZWdpc3RyeUFuZENyZWF0ZU1ldGhvZHMoKTsKLQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKCJ0ZXN0Lk9iamVjdEZhY3RvcnkiKTsKLQkJWG1sUmVnaXN0cnkgeG1sUmVnaXN0cnkgPSBqYXhiQ2xhc3MuZ2V0WG1sUmVnaXN0cnkoKTsKLQkJCi0JCUl0ZXJhdG9yPEpheGJFbGVtZW50RmFjdG9yeU1ldGhvZD4gZWxlbWVudEZhY3RvcnlNZXRob2RzID0geG1sUmVnaXN0cnkuZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzKCkuaXRlcmF0b3IoKTsKLQkJSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kIGVsZW1lbnRGYWN0b3J5TWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2RzLm5leHQoKTsKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UmVzb3VyY2VNZXRob2QoKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRTdWJzdGl0dXRpb25IZWFkUU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0KLQkJZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0U3Vic3RpdHV0aW9uSGVhZFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZXNwYWNlKCJiYXIiKTsKLQkJWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uIGVsZW1lbnREZWNsQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50RGVjbEFubm90YXRpb24pIHJlc291cmNlTWV0aG9kLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBlbGVtZW50RGVjbEFubm90YXRpb24uZ2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRTdWJzdGl0dXRpb25IZWFkUU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0KLQkJIC8vdmVyaWZ5IHRoZSB4bWwgZWxlbWVudCBkZWNsIGFubm90YXRpb24gaXMgbm90IHJlbW92ZWQgd2hlbiB0aGUgZWxlbWVudCBuYW1lIGlzIHNldCB0byBudWxsCi0JCWVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFN1YnN0aXR1dGlvbkhlYWRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWVzcGFjZShudWxsKTsKLQkJZWxlbWVudERlY2xBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbikgcmVzb3VyY2VNZXRob2QuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCQlhc3NlcnROdWxsKGVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFN1YnN0aXR1dGlvbkhlYWRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQljcmVhdGVDbGFzc1dpdGhYbWxSZWdpc3RyeUFuZENyZWF0ZU1ldGhvZHMoKTsKLQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKCJ0ZXN0Lk9iamVjdEZhY3RvcnkiKTsKLQkJWG1sUmVnaXN0cnkgeG1sUmVnaXN0cnkgPSBqYXhiQ2xhc3MuZ2V0WG1sUmVnaXN0cnkoKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB4bWxSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHNTaXplKCkpOwotCQlJdGVyYXRvcjxKYXhiRWxlbWVudEZhY3RvcnlNZXRob2Q+IGVsZW1lbnRGYWN0b3J5TWV0aG9kcyA9IHhtbFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCUpheGJFbGVtZW50RmFjdG9yeU1ldGhvZCBlbGVtZW50RmFjdG9yeU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kcy5uZXh0KCk7Ci0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFJlc291cmNlTWV0aG9kKCk7Ci0JCWFzc2VydEVxdWFscygiIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0U3Vic3RpdHV0aW9uSGVhZFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCQkKLQkJLy9hZGQgYSBuYW1lIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZU1ldGhvZCk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2RUZXN0cy50aGlzLmFkZFhtbEVsZW1lbnREZWNsTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9FTEVNRU5UX0RFQ0xfX1NVQlNUSVRVVElPTl9IRUFEX05BTUVTUEFDRSwgImZvbyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRTdWJzdGl0dXRpb25IZWFkUU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZFRlc3RzLnRoaXMucmVtb3ZlWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygxLCB4bWxSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQljcmVhdGVDbGFzc1dpdGhYbWxSZWdpc3RyeUFuZENyZWF0ZU1ldGhvZHMoKTsKLQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKCJ0ZXN0Lk9iamVjdEZhY3RvcnkiKTsKLQkJWG1sUmVnaXN0cnkgeG1sUmVnaXN0cnkgPSBqYXhiQ2xhc3MuZ2V0WG1sUmVnaXN0cnkoKTsKLQkJCi0JCUl0ZXJhdG9yPEpheGJFbGVtZW50RmFjdG9yeU1ldGhvZD4gZWxlbWVudEZhY3RvcnlNZXRob2RzID0geG1sUmVnaXN0cnkuZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzKCkuaXRlcmF0b3IoKTsKLQkJSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kIGVsZW1lbnRGYWN0b3J5TWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2RzLm5leHQoKTsKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UmVzb3VyY2VNZXRob2QoKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQotCQllbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWVzcGFjZSgiYmFyIik7Ci0JCVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiBlbGVtZW50RGVjbEFubm90YXRpb24gPSAoWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgZWxlbWVudERlY2xBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQotCQkgLy92ZXJpZnkgdGhlIHhtbCBlbGVtZW50IGRlY2wgYW5ub3RhdGlvbiBpcyBub3QgcmVtb3ZlZCB3aGVuIHRoZSBlbGVtZW50IG5hbWUgaXMgc2V0IHRvIG51bGwKLQkJZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lc3BhY2UobnVsbCk7Ci0JCWVsZW1lbnREZWNsQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50RGVjbEFubm90YXRpb24pIHJlc291cmNlTWV0aG9kLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50RGVjbEFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sUmVnaXN0cnlBbmRDcmVhdGVNZXRob2RzKCk7Ci0KLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZSgidGVzdC5PYmplY3RGYWN0b3J5Iik7Ci0JCVhtbFJlZ2lzdHJ5IHhtbFJlZ2lzdHJ5ID0gamF4YkNsYXNzLmdldFhtbFJlZ2lzdHJ5KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgeG1sUmVnaXN0cnkuZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzU2l6ZSgpKTsKLQkJSXRlcmF0b3I8SmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kPiBlbGVtZW50RmFjdG9yeU1ldGhvZHMgPSB4bWxSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHMoKS5pdGVyYXRvcigpOwotCQlKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QgZWxlbWVudEZhY3RvcnlNZXRob2QgPSBlbGVtZW50RmFjdG9yeU1ldGhvZHMubmV4dCgpOwotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRSZXNvdXJjZU1ldGhvZCgpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCQkKLQkJLy9hZGQgYSBuYW1lIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZU1ldGhvZCk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2RUZXN0cy50aGlzLmFkZFhtbEVsZW1lbnREZWNsTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9FTEVNRU5UX0RFQ0xfX05BTUVTUEFDRSwgImZvbyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kVGVzdHMudGhpcy5yZW1vdmVYbWxFbGVtZW50RGVjbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHhtbFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kc1NpemUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sRWxlbWVudERlY2xNZW1iZXJWYWx1ZVBhaXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcigoTWFya2VyQW5ub3RhdGlvbikgdGhpcy5nZXRYbWxFbGVtZW50RGVjbEFubm90YXRpb24oZGVjbGFyYXRpb24pLCBuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0WG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsJCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEVsZW1lbnREZWNsVHlwZU1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKAotCQkJKE1hcmtlckFubm90YXRpb24pIHRoaXMuZ2V0WG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgCi0JCQluYW1lLCAKLQkJCXRoaXMubmV3VHlwZUxpdGVyYWwoZGVjbGFyYXRpb24uZ2V0QXN0KCksIHR5cGVOYW1lKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVudW1Db25zdGFudFRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW51bUNvbnN0YW50VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliOTc1ZS4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW51bUNvbnN0YW50VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVudW1EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUVudW1Db25zdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVudW1Db25zdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVudW1NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbnVtVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5KYXhiQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFFbnVtQ29uc3RhbnRUZXN0cyBleHRlbmRzIEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXB1YmxpYyBHZW5lcmljSmF2YUVudW1Db25zdGFudFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVFbnVtV2l0aFhtbEVudW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RFbnVtKG5ldyBEZWZhdWx0RW51bUFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEVudW1Bbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW51bVdpdGhYbWxFbnVtKCk7Ci0JCQotCQlKYXhiRW51bSBqYXhiRW51bSA9IChKYXhiRW51bSkgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiRW51bU1hcHBpbmcgZW51bU1hcHBpbmcgPSBqYXhiRW51bS5nZXRNYXBwaW5nKCk7Ci0JCUpheGJFbnVtQ29uc3RhbnQgY29udGV4dEVudW1Db25zdGFudCA9IENvbGxlY3Rpb25Ub29scy5nZXQoZW51bU1hcHBpbmcuZ2V0RW51bUNvbnN0YW50cygpLCAxKTsKLQkJSmF2YVJlc291cmNlRW51bSByZXNvdXJjZUVudW0gPSBqYXhiRW51bS5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIk1PTkRBWSIsIGNvbnRleHRFbnVtQ29uc3RhbnQuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQkvL2FkZCBhIGZhY3RvcnlDbGFzcyBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VFbnVtKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFFbnVtQ29uc3RhbnRUZXN0cy50aGlzLmNoYW5nZUVudW1Db25zdGFudE5hbWUoKEVudW1EZWNsYXJhdGlvbikgZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgIk1PTkRBWSIsICJNT05EQVkyIik7Ci0JCQl9Ci0JCX0pOwotCQljb250ZXh0RW51bUNvbnN0YW50ID0gQ29sbGVjdGlvblRvb2xzLmdldChlbnVtTWFwcGluZy5nZXRFbnVtQ29uc3RhbnRzKCksIDEpOwotCQlhc3NlcnRFcXVhbHMoMiwgZW51bU1hcHBpbmcuZ2V0RW51bUNvbnN0YW50c1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiTU9OREFZMiIsIGNvbnRleHRFbnVtQ29uc3RhbnQuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW51bVdpdGhYbWxFbnVtKCk7Ci0JCQotCQlKYXhiRW51bSBqYXhiRW51bSA9IChKYXhiRW51bSkgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiRW51bU1hcHBpbmcgZW51bU1hcHBpbmcgPSBqYXhiRW51bS5nZXRNYXBwaW5nKCk7Ci0JCUpheGJFbnVtQ29uc3RhbnQgY29udGV4dEVudW1Db25zdGFudCA9IENvbGxlY3Rpb25Ub29scy5nZXQoZW51bU1hcHBpbmcuZ2V0RW51bUNvbnN0YW50cygpLCAxKTsKLQkJSmF2YVJlc291cmNlRW51bUNvbnN0YW50IHJlc291cmNlRW51bUNvbnN0YW50ID0gY29udGV4dEVudW1Db25zdGFudC5nZXRSZXNvdXJjZUVudW1Db25zdGFudCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJNT05EQVkiLCBjb250ZXh0RW51bUNvbnN0YW50LmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNT05EQVkiLCBjb250ZXh0RW51bUNvbnN0YW50LmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRFbnVtQ29uc3RhbnQuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JCQotCQljb250ZXh0RW51bUNvbnN0YW50LnNldFNwZWNpZmllZFZhbHVlKCJmb28iKTsKLQkJWG1sRW51bVZhbHVlQW5ub3RhdGlvbiBlbnVtVmFsdWVBbm5vdGF0aW9uID0gKFhtbEVudW1WYWx1ZUFubm90YXRpb24pIHJlc291cmNlRW51bUNvbnN0YW50LmdldEFubm90YXRpb24oSkFYQi5YTUxfRU5VTV9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW51bVZhbHVlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNT05EQVkiLCBjb250ZXh0RW51bUNvbnN0YW50LmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0RW51bUNvbnN0YW50LmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRFbnVtQ29uc3RhbnQuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JCQotCQljb250ZXh0RW51bUNvbnN0YW50LnNldFNwZWNpZmllZFZhbHVlKG51bGwpOwotCQllbnVtVmFsdWVBbm5vdGF0aW9uID0gKFhtbEVudW1WYWx1ZUFubm90YXRpb24pIHJlc291cmNlRW51bUNvbnN0YW50LmdldEFubm90YXRpb24oSkFYQi5YTUxfRU5VTV9WQUxVRSk7Ci0JCWFzc2VydE51bGwoZW51bVZhbHVlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNT05EQVkiLCBjb250ZXh0RW51bUNvbnN0YW50LmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNT05EQVkiLCBjb250ZXh0RW51bUNvbnN0YW50LmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRFbnVtQ29uc3RhbnQuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnVtV2l0aFhtbEVudW0oKTsKLQkJCi0JCUpheGJFbnVtIGpheGJFbnVtID0gKEpheGJFbnVtKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJFbnVtTWFwcGluZyBlbnVtTWFwcGluZyA9IGpheGJFbnVtLmdldE1hcHBpbmcoKTsKLQkJSmF4YkVudW1Db25zdGFudCBjb250ZXh0RW51bUNvbnN0YW50ID0gQ29sbGVjdGlvblRvb2xzLmdldChlbnVtTWFwcGluZy5nZXRFbnVtQ29uc3RhbnRzKCksIDEpOwotCQlKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQgcmVzb3VyY2VFbnVtQ29uc3RhbnQgPSBjb250ZXh0RW51bUNvbnN0YW50LmdldFJlc291cmNlRW51bUNvbnN0YW50KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIk1PTkRBWSIsIGNvbnRleHRFbnVtQ29uc3RhbnQuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1PTkRBWSIsIGNvbnRleHRFbnVtQ29uc3RhbnQuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEVudW1Db25zdGFudC5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCS8vYWRkIGFuIFhtbEVudW1WYWx1ZSBhbm5vdGF0aW9uCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUVudW1Db25zdGFudCk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24gZW51bVZhbHVlQW5ub3RhdGlvbiA9IEdlbmVyaWNKYXZhRW51bUNvbnN0YW50VGVzdHMudGhpcy5hZGROb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0VOVU1fVkFMVUUpOwotCQkJCUdlbmVyaWNKYXZhRW51bUNvbnN0YW50VGVzdHMudGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoZW51bVZhbHVlQW5ub3RhdGlvbiwgSkFYQi5YTUxfRU5VTV9WQUxVRV9fVkFMVUUsICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJNT05EQVkiLCBjb250ZXh0RW51bUNvbnN0YW50LmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0RW51bUNvbnN0YW50LmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRFbnVtQ29uc3RhbnQuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFFbnVtQ29uc3RhbnRUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0VOVU1fVkFMVUUpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCJNT05EQVkiLCBjb250ZXh0RW51bUNvbnN0YW50LmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNT05EQVkiLCBjb250ZXh0RW51bUNvbnN0YW50LmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRFbnVtQ29uc3RhbnQuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVudW1NYXBwaW5nVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnVtTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMzljYTQuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVudW1NYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiRW51bUNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiRW51bU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVudW1Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxSb290RWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFR5cGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5KYXhiQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFFbnVtTWFwcGluZ1Rlc3RzCi0JCWV4dGVuZHMgSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFFbnVtTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxUeXBlTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoKE1hcmtlckFubm90YXRpb24pIHRoaXMuZ2V0WG1sVHlwZUFubm90YXRpb24oZGVjbGFyYXRpb24pLCBuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sVHlwZVR5cGVNZW1iZXJWYWx1ZVBhaXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlTmFtZSkgewotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcigKLQkJCShNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbFR5cGVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgCi0JCQluYW1lLCAKLQkJCXRoaXMubmV3VHlwZUxpdGVyYWwoZGVjbGFyYXRpb24uZ2V0QXN0KCksIHR5cGVOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sRW51bVR5cGVNZW1iZXJWYWx1ZVBhaXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlTmFtZSkgewotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcigKLQkJCShNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbEVudW1Bbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgCi0JCQluYW1lLCAKLQkJCXRoaXMubmV3VHlwZUxpdGVyYWwoZGVjbGFyYXRpb24uZ2V0QXN0KCksIHR5cGVOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0WG1sVHlwZUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKEpBWEIuWE1MX1RZUEUpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGdldFhtbEVudW1Bbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChKQVhCLlhNTF9FTlVNKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U2NoZW1hVHlwZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW51bVdpdGhYbWxUeXBlKCk7Ci0JCQotCQlKYXhiRW51bSBqYXhiRW51bSA9IChKYXhiRW51bSkgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiRW51bU1hcHBpbmcgZW51bU1hcHBpbmcgPSBqYXhiRW51bS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUVudW0gcmVzb3VyY2VFbnVtID0gamF4YkVudW0uZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQlTdHJpbmcgZGVmYXVsdFhtbFR5cGVOYW1lID0gSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShUWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhkZWZhdWx0WG1sVHlwZU5hbWUsIGVudW1NYXBwaW5nLmdldFFOYW1lKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhkZWZhdWx0WG1sVHlwZU5hbWUsIGVudW1NYXBwaW5nLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWVudW1NYXBwaW5nLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCVhtbFR5cGVBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZUVudW0uZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxUeXBlQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudW1NYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCQotCQllbnVtTWFwcGluZy5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCXhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZUVudW0uZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0TnVsbCh4bWxUeXBlQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudW1NYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGRlZmF1bHRYbWxUeXBlTmFtZSwgZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VFbnVtLnJlbW92ZUFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCQotCQkvL3NldCBuYW1lIGFnYWluLCB0aGlzIHRpbWUgc3RhcnRpbmcgd2l0aCBubyBYbWxUeXBlIGFubm90YXRpb24KLQkJZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJeG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlRW51bS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFR5cGVBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudW1NYXBwaW5nLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNjaGVtYVR5cGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudW1XaXRoWG1sVHlwZSgpOwotCQkKLQkJSmF4YkVudW0gamF4YkVudW0gPSAoSmF4YkVudW0pIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkVudW1NYXBwaW5nIGVudW1NYXBwaW5nID0gamF4YkVudW0uZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VFbnVtIHJlc291cmNlRW51bSA9IGpheGJFbnVtLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJU3RyaW5nIGRlZmF1bHRYbWxUeXBlTmFtZSA9IEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUoVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZGVmYXVsdFhtbFR5cGVOYW1lLCBlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZGVmYXVsdFhtbFR5cGVOYW1lLCBlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvL2FkZCBhIG5hbWVzcGFjZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VFbnVtKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFFbnVtTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9UWVBFKTsKLQkJCQlHZW5lcmljSmF2YUVudW1NYXBwaW5nVGVzdHMudGhpcy5hZGRYbWxUeXBlTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9UWVBFX19OQU1FLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudW1NYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvL3JlbW92ZSB0aGUgbmFtZXNwYWNlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24geG1sVHlwZUFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgR2VuZXJpY0phdmFFbnVtTWFwcGluZ1Rlc3RzLnRoaXMuZ2V0WG1sVHlwZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCUdlbmVyaWNKYXZhRW51bU1hcHBpbmdUZXN0cy50aGlzLnZhbHVlcyh4bWxUeXBlQW5ub3RhdGlvbikucmVtb3ZlKDApOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbChlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhkZWZhdWx0WG1sVHlwZU5hbWUsIGVudW1NYXBwaW5nLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudW1XaXRoWG1sVHlwZSgpOwotCQkKLQkJSmF4YkVudW0gamF4YkVudW0gPSAoSmF4YkVudW0pIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkVudW1NYXBwaW5nIGVudW1NYXBwaW5nID0gamF4YkVudW0uZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VFbnVtIHJlc291cmNlRW51bSA9IGpheGJFbnVtLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCWFzc2VydE51bGwoZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXREZWZhdWx0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGVudW1NYXBwaW5nLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCQkKLQkJZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lc3BhY2UoImZvbyIpOwotCQlYbWxUeXBlQW5ub3RhdGlvbiB4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VFbnVtLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sVHlwZUFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudW1NYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudW1NYXBwaW5nLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCQkKLQkJZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lc3BhY2UobnVsbCk7Ci0JCXhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZUVudW0uZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0TnVsbCh4bWxUeXBlQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydE51bGwoZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQlyZXNvdXJjZUVudW0ucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJCi0JCS8vc2V0IG5hbWVzcGFjZSBhZ2FpbiwgdGhpcyB0aW1lIHN0YXJ0aW5nIHdpdGggbm8gWG1sVHlwZSBhbm5vdGF0aW9uCi0JCWVudW1NYXBwaW5nLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZXNwYWNlKCJmb28iKTsKLQkJeG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlRW51bS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFR5cGVBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnVtV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJFbnVtIGpheGJFbnVtID0gKEpheGJFbnVtKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJFbnVtTWFwcGluZyBlbnVtTWFwcGluZyA9IGpheGJFbnVtLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlRW51bSByZXNvdXJjZUVudW0gPSBqYXhiRW51bS5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnROdWxsKGVudW1NYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGVudW1NYXBwaW5nLmdldFFOYW1lKCkuZ2V0RGVmYXVsdE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCS8vYWRkIGEgbmFtZXNwYWNlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUVudW0pOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUVudW1NYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX1RZUEUpOwotCQkJCUdlbmVyaWNKYXZhRW51bU1hcHBpbmdUZXN0cy50aGlzLmFkZFhtbFR5cGVNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX1RZUEVfX05BTUVTUEFDRSwgImZvbyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCS8vcmVtb3ZlIHRoZSBuYW1lc3BhY2UgbWVtYmVyIHZhbHVlIHBhaXIKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTm9ybWFsQW5ub3RhdGlvbiB4bWxUeXBlQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBHZW5lcmljSmF2YUVudW1NYXBwaW5nVGVzdHMudGhpcy5nZXRYbWxUeXBlQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQkJR2VuZXJpY0phdmFFbnVtTWFwcGluZ1Rlc3RzLnRoaXMudmFsdWVzKHhtbFR5cGVBbm5vdGF0aW9uKS5yZW1vdmUoMCk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKGVudW1NYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGVudW1NYXBwaW5nLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sUm9vdEVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW51bVdpdGhYbWxUeXBlKCk7Ci0JCQotCQlKYXhiRW51bSBqYXhiRW51bSA9IChKYXhiRW51bSkgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiRW51bU1hcHBpbmcgZW51bU1hcHBpbmcgPSBqYXhiRW51bS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUVudW0gcmVzb3VyY2VFbnVtID0gamF4YkVudW0uZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChlbnVtTWFwcGluZy5nZXRYbWxSb290RWxlbWVudCgpKTsKLQkJCi0JCWVudW1NYXBwaW5nLmFkZFhtbFJvb3RFbGVtZW50KCkuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uIHhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxSb290RWxlbWVudEFubm90YXRpb24pIHJlc291cmNlRW51bS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1JPT1RfRUxFTUVOVCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW51bU1hcHBpbmcuZ2V0WG1sUm9vdEVsZW1lbnQoKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCQotCQllbnVtTWFwcGluZy5yZW1vdmVYbWxSb290RWxlbWVudCgpOwotCQl4bWxSb290RWxlbWVudEFubm90YXRpb24gPSAoWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUVudW0uZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCQlhc3NlcnROdWxsKHhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbik7Ci0JCWFzc2VydE51bGwoZW51bU1hcHBpbmcuZ2V0WG1sUm9vdEVsZW1lbnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbFJvb3RFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudW1XaXRoWG1sVHlwZSgpOwotCQkKLQkJSmF4YkVudW0gamF4YkVudW0gPSAoSmF4YkVudW0pIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkVudW1NYXBwaW5nIGVudW1NYXBwaW5nID0gamF4YkVudW0uZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VFbnVtIHJlc291cmNlRW51bSA9IGpheGJFbnVtLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCWFzc2VydE51bGwoZW51bU1hcHBpbmcuZ2V0WG1sUm9vdEVsZW1lbnQoKSk7Ci0JCQotCQkvL2FkZCBhIFhtbFJvb3RFbGVtZW50IGFubm90YXRpb24KLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlRW51bSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IEdlbmVyaWNKYXZhRW51bU1hcHBpbmdUZXN0cy50aGlzLmFkZE5vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfUk9PVF9FTEVNRU5UKTsKLQkJCQlHZW5lcmljSmF2YUVudW1NYXBwaW5nVGVzdHMudGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgSkFYQi5YTUxfUk9PVF9FTEVNRU5UX19OQU1FLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudW1NYXBwaW5nLmdldFhtbFJvb3RFbGVtZW50KCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy9yZW1vdmUgdGhlIFhtbFJvb3RFbGVtZW50IGFubm90YXRpb24KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFFbnVtTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfUk9PVF9FTEVNRU5UKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoZW51bU1hcHBpbmcuZ2V0WG1sUm9vdEVsZW1lbnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbEVudW1WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnVtV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJFbnVtIGpheGJFbnVtID0gKEpheGJFbnVtKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJFbnVtTWFwcGluZyBlbnVtTWFwcGluZyA9IGpheGJFbnVtLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlRW51bSByZXNvdXJjZUVudW0gPSBqYXhiRW51bS5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnROdWxsKGVudW1NYXBwaW5nLmdldFNwZWNpZmllZFhtbEVudW1WYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEpheGJFbnVtTWFwcGluZy5ERUZBVUxUX1hNTF9FTlVNX1ZBTFVFLCBlbnVtTWFwcGluZy5nZXRYbWxFbnVtVmFsdWUoKSk7Ci0JCQotCQllbnVtTWFwcGluZy5zZXRTcGVjaWZpZWRYbWxFbnVtVmFsdWUoIkludGVnZXIiKTsKLQkJWG1sRW51bUFubm90YXRpb24geG1sRW51bUFubm90YXRpb24gPSAoWG1sRW51bUFubm90YXRpb24pIHJlc291cmNlRW51bS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VOVU0pOwotCQlhc3NlcnRFcXVhbHMoIkludGVnZXIiLCB4bWxFbnVtQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbnRlZ2VyIiwgZW51bU1hcHBpbmcuZ2V0U3BlY2lmaWVkWG1sRW51bVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkludGVnZXIiLCBlbnVtTWFwcGluZy5nZXRYbWxFbnVtVmFsdWUoKSk7Ci0JCQotCQllbnVtTWFwcGluZy5zZXRTcGVjaWZpZWRYbWxFbnVtVmFsdWUobnVsbCk7Ci0JCXhtbEVudW1Bbm5vdGF0aW9uID0gKFhtbEVudW1Bbm5vdGF0aW9uKSByZXNvdXJjZUVudW0uZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTlVNKTsKLQkJYXNzZXJ0TnVsbChlbnVtTWFwcGluZy5nZXRTcGVjaWZpZWRYbWxFbnVtVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhKYXhiRW51bU1hcHBpbmcuREVGQVVMVF9YTUxfRU5VTV9WQUxVRSwgZW51bU1hcHBpbmcuZ2V0WG1sRW51bVZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VFbnVtLmFkZEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCXJlc291cmNlRW51bS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX0VOVU0pOwotCQllbnVtTWFwcGluZyA9ICgoSmF4YkVudW0pIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKSkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKGVudW1NYXBwaW5nLmdldFNwZWNpZmllZFhtbEVudW1WYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEpheGJFbnVtTWFwcGluZy5ERUZBVUxUX1hNTF9FTlVNX1ZBTFVFLCBlbnVtTWFwcGluZy5nZXRYbWxFbnVtVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxFbnVtVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW51bVdpdGhYbWxUeXBlKCk7Ci0JCQotCQlKYXhiRW51bSBqYXhiRW51bSA9IChKYXhiRW51bSkgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiRW51bU1hcHBpbmcgZW51bU1hcHBpbmcgPSBqYXhiRW51bS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUVudW0gcmVzb3VyY2VFbnVtID0gamF4YkVudW0uZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChlbnVtTWFwcGluZy5nZXRTcGVjaWZpZWRYbWxFbnVtVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhKYXhiRW51bU1hcHBpbmcuREVGQVVMVF9YTUxfRU5VTV9WQUxVRSwgZW51bU1hcHBpbmcuZ2V0WG1sRW51bVZhbHVlKCkpOwotCQkKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlRW51bSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlHZW5lcmljSmF2YUVudW1NYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0VOVU0pOwotCQkJCQkJR2VuZXJpY0phdmFFbnVtTWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sRW51bVR5cGVNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0VOVU1fX1ZBTFVFLCAiU3RyaW5nIik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBlbnVtTWFwcGluZy5nZXRTcGVjaWZpZWRYbWxFbnVtVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgZW51bU1hcHBpbmcuZ2V0WG1sRW51bVZhbHVlKCkpOwotCQkKLQkJLy9yZW1vdmUgdGhlIGZhY3RvcnlDbGFzcyBtZW1iZXIgdmFsdWUgcGFpcgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOb3JtYWxBbm5vdGF0aW9uIHhtbEVudW1Bbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEdlbmVyaWNKYXZhRW51bU1hcHBpbmdUZXN0cy50aGlzLmdldFhtbEVudW1Bbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCQlHZW5lcmljSmF2YUVudW1NYXBwaW5nVGVzdHMudGhpcy52YWx1ZXMoeG1sRW51bUFubm90YXRpb24pLnJlbW92ZSgwKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoZW51bU1hcHBpbmcuZ2V0U3BlY2lmaWVkWG1sRW51bVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSmF4YkVudW1NYXBwaW5nLkRFRkFVTFRfWE1MX0VOVU1fVkFMVUUsIGVudW1NYXBwaW5nLmdldFhtbEVudW1WYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRW51bUNvbnN0YW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnVtV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJFbnVtIGpheGJFbnVtID0gKEpheGJFbnVtKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJFbnVtTWFwcGluZyBlbnVtTWFwcGluZyA9IGpheGJFbnVtLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlRW51bSByZXNvdXJjZUVudW0gPSBqYXhiRW51bS5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgZW51bU1hcHBpbmcuZ2V0RW51bUNvbnN0YW50c1NpemUoKSk7Ci0JCUl0ZXJhdG9yPEpheGJFbnVtQ29uc3RhbnQ+IGVudW1Db25zdGFudHMgPSBlbnVtTWFwcGluZy5nZXRFbnVtQ29uc3RhbnRzKCkuaXRlcmF0b3IoKTsKLQkJSmF4YkVudW1Db25zdGFudCBlbnVtQ29uc3RhbnQgPSBlbnVtQ29uc3RhbnRzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJTVU5EQVkiLCBlbnVtQ29uc3RhbnQuZ2V0TmFtZSgpKTsKLQkJZW51bUNvbnN0YW50ID0gZW51bUNvbnN0YW50cy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTU9OREFZIiwgZW51bUNvbnN0YW50LmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGVudW1Db25zdGFudHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlRW51bSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhRW51bU1hcHBpbmdUZXN0cy50aGlzLmFkZEVudW1Db25zdGFudCgoRW51bURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCAiVFVFU0RBWSIpOwotCQkJCUdlbmVyaWNKYXZhRW51bU1hcHBpbmdUZXN0cy50aGlzLmFkZEVudW1Db25zdGFudCgoRW51bURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCAiV0VETkVTREFZIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoNCwgZW51bU1hcHBpbmcuZ2V0RW51bUNvbnN0YW50c1NpemUoKSk7Ci0JCWVudW1Db25zdGFudHMgPSBlbnVtTWFwcGluZy5nZXRFbnVtQ29uc3RhbnRzKCkuaXRlcmF0b3IoKTsKLQkJZW51bUNvbnN0YW50ID0gZW51bUNvbnN0YW50cy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiU1VOREFZIiwgZW51bUNvbnN0YW50LmdldE5hbWUoKSk7Ci0JCWVudW1Db25zdGFudCA9IGVudW1Db25zdGFudHMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk1PTkRBWSIsIGVudW1Db25zdGFudC5nZXROYW1lKCkpOwotCQllbnVtQ29uc3RhbnQgPSBlbnVtQ29uc3RhbnRzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUVUVTREFZIiwgZW51bUNvbnN0YW50LmdldE5hbWUoKSk7Ci0JCWVudW1Db25zdGFudCA9IGVudW1Db25zdGFudHMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIldFRE5FU0RBWSIsIGVudW1Db25zdGFudC5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShlbnVtQ29uc3RhbnRzLmhhc05leHQoKSk7Ci0KLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUVudW1NYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVFbnVtQ29uc3RhbnQoKEVudW1EZWNsYXJhdGlvbikgZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgIlNVTkRBWSIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudW1NYXBwaW5nLmdldEVudW1Db25zdGFudHNTaXplKCkpOwotCQllbnVtQ29uc3RhbnRzID0gZW51bU1hcHBpbmcuZ2V0RW51bUNvbnN0YW50cygpLml0ZXJhdG9yKCk7Ci0JCWVudW1Db25zdGFudCA9IGVudW1Db25zdGFudHMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk1PTkRBWSIsIGVudW1Db25zdGFudC5nZXROYW1lKCkpOwotCQllbnVtQ29uc3RhbnQgPSBlbnVtQ29uc3RhbnRzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUVUVTREFZIiwgZW51bUNvbnN0YW50LmdldE5hbWUoKSk7Ci0JCWVudW1Db25zdGFudCA9IGVudW1Db25zdGFudHMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIldFRE5FU0RBWSIsIGVudW1Db25zdGFudC5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShlbnVtQ29uc3RhbnRzLmhhc05leHQoKSk7Ci0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFFbnVtTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlRW51bUNvbnN0YW50KChFbnVtRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksICJUVUVTREFZIik7Ci0JCQkJR2VuZXJpY0phdmFFbnVtTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlRW51bUNvbnN0YW50KChFbnVtRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksICJNT05EQVkiKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygxLCBlbnVtTWFwcGluZy5nZXRFbnVtQ29uc3RhbnRzU2l6ZSgpKTsKLQkJZW51bUNvbnN0YW50cyA9IGVudW1NYXBwaW5nLmdldEVudW1Db25zdGFudHMoKS5pdGVyYXRvcigpOwotCQllbnVtQ29uc3RhbnQgPSBlbnVtQ29uc3RhbnRzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXRURORVNEQVkiLCBlbnVtQ29uc3RhbnQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZW51bUNvbnN0YW50cy5oYXNOZXh0KCkpOwotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhRW51bU1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUVudW1Db25zdGFudCgoRW51bURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCAiV0VETkVTREFZIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoMCwgZW51bU1hcHBpbmcuZ2V0RW51bUNvbnN0YW50c1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGVudW1NYXBwaW5nLmdldEVudW1Db25zdGFudHMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTAxMjVjLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdWJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEFjY2Vzc09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxTY2hlbWFUeXBlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cyBleHRlbmRzIEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXB1YmxpYyBHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVQYWNrYWdlSW5mb1dpdGhBY2Nlc3NvclR5cGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0UGFja2FnZUluZm8oCi0JCQkJIkBYbWxBY2Nlc3NvclR5cGUodmFsdWUgPSBYbWxBY2Nlc3NUeXBlLlBST1BFUlRZKSIsCi0JCQkJSkFYQi5YTUxfQUNDRVNTX1RZUEUsIEpBWEIuWE1MX0FDQ0VTU09SX1RZUEUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlUGFja2FnZUluZm9XaXRoQWNjZXNzb3JPcmRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RQYWNrYWdlSW5mbygKLQkJCQkiQFhtbEFjY2Vzc29yT3JkZXIodmFsdWUgPSBYbWxBY2Nlc3NPcmRlci5BTFBIQUJFVElDQUwpIiwKLQkJCQlKQVhCLlhNTF9BQ0NFU1NfT1JERVIsIEpBWEIuWE1MX0FDQ0VTU09SX09SREVSKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUFjY2Vzc1R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlUGFja2FnZUluZm9XaXRoQWNjZXNzb3JUeXBlKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0JCi0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBST1BFUlRZLCBjb250ZXh0UGFja2FnZUluZm8uZ2V0U3BlY2lmaWVkQWNjZXNzVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFksIGNvbnRleHRQYWNrYWdlSW5mby5nZXRBY2Nlc3NUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSLCBjb250ZXh0UGFja2FnZUluZm8uZ2V0RGVmYXVsdEFjY2Vzc1R5cGUoKSk7Ci0JCQotCQljb250ZXh0UGFja2FnZUluZm8uc2V0U3BlY2lmaWVkQWNjZXNzVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbiBhY2Nlc3NvclR5cGVBbm5vdGF0aW9uID0gKFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FDQ0VTU09SX1RZUEUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc1R5cGUuRklFTEQsIGFjY2Vzc29yVHlwZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLkZJRUxELCBjb250ZXh0UGFja2FnZUluZm8uZ2V0QWNjZXNzVHlwZSgpKTsKLQotCQljb250ZXh0UGFja2FnZUluZm8uc2V0U3BlY2lmaWVkQWNjZXNzVHlwZShYbWxBY2Nlc3NUeXBlLlBVQkxJQ19NRU1CRVIpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc1R5cGUuUFVCTElDX01FTUJFUiwgYWNjZXNzb3JUeXBlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuUFVCTElDX01FTUJFUiwgY29udGV4dFBhY2thZ2VJbmZvLmdldEFjY2Vzc1R5cGUoKSk7Ci0KLQkJY29udGV4dFBhY2thZ2VJbmZvLnNldFNwZWNpZmllZEFjY2Vzc1R5cGUoWG1sQWNjZXNzVHlwZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NUeXBlLk5PTkUsIGFjY2Vzc29yVHlwZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLk5PTkUsIGNvbnRleHRQYWNrYWdlSW5mby5nZXRBY2Nlc3NUeXBlKCkpOwotCQkKLQkJY29udGV4dFBhY2thZ2VJbmZvLnNldFNwZWNpZmllZEFjY2Vzc1R5cGUobnVsbCk7Ci0JCWFjY2Vzc29yVHlwZUFubm90YXRpb24gPSAoWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQUNDRVNTT1JfVFlQRSk7Ci0JCWFzc2VydE51bGwoYWNjZXNzb3JUeXBlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0UGFja2FnZUluZm8uZ2V0U3BlY2lmaWVkQWNjZXNzVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuUFVCTElDX01FTUJFUiwgY29udGV4dFBhY2thZ2VJbmZvLmdldEFjY2Vzc1R5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBVQkxJQ19NRU1CRVIsIGNvbnRleHRQYWNrYWdlSW5mby5nZXREZWZhdWx0QWNjZXNzVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFjY2Vzc1R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlUGFja2FnZUluZm9XaXRoQWNjZXNzb3JUeXBlKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0JCi0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBST1BFUlRZLCBjb250ZXh0UGFja2FnZUluZm8uZ2V0U3BlY2lmaWVkQWNjZXNzVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFksIGNvbnRleHRQYWNrYWdlSW5mby5nZXRBY2Nlc3NUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSLCBjb250ZXh0UGFja2FnZUluZm8uZ2V0RGVmYXVsdEFjY2Vzc1R5cGUoKSk7Ci0JCQotCQkvL3NldCB0aGUgYWNjZXNzZXIgdHlwZSB2YWx1ZSB0byBGSUVMRAotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VQYWNrYWdlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLnRoaXMuc2V0RW51bU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfQUNDRVNTT1JfVFlQRSwgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLkZJRUxELCBjb250ZXh0UGFja2FnZUluZm8uZ2V0QWNjZXNzVHlwZSgpKTsKLQotCQkvL3NldCB0aGUgYWNjZXNzZXIgdHlwZSB2YWx1ZSB0byBQVUJMSUNfTUVNQkVSCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLnNldEVudW1NZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FDQ0VTU09SX1RZUEUsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QVUJMSUNfTUVNQkVSKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBVQkxJQ19NRU1CRVIsIGNvbnRleHRQYWNrYWdlSW5mby5nZXRBY2Nlc3NUeXBlKCkpOwotCi0JCS8vc2V0IHRoZSBhY2Nlc3NlciB0eXBlIHZhbHVlIHRvIE5PTkUKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLnRoaXMuc2V0RW51bU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfQUNDRVNTT1JfVFlQRSwgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX05PTkUpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuTk9ORSwgY29udGV4dFBhY2thZ2VJbmZvLmdldEFjY2Vzc1R5cGUoKSk7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5yZW1vdmVYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFBhY2thZ2VJbmZvLmdldFNwZWNpZmllZEFjY2Vzc1R5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBVQkxJQ19NRU1CRVIsIGNvbnRleHRQYWNrYWdlSW5mby5nZXRBY2Nlc3NUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSLCBjb250ZXh0UGFja2FnZUluZm8uZ2V0RGVmYXVsdEFjY2Vzc1R5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlBY2Nlc3NPcmRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVQYWNrYWdlSW5mb1dpdGhBY2Nlc3Nvck9yZGVyKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0JCi0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NPcmRlci5BTFBIQUJFVElDQUwsIGNvbnRleHRQYWNrYWdlSW5mby5nZXRTcGVjaWZpZWRBY2Nlc3NPcmRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc09yZGVyLkFMUEhBQkVUSUNBTCwgY29udGV4dFBhY2thZ2VJbmZvLmdldEFjY2Vzc09yZGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuVU5ERUZJTkVELCBjb250ZXh0UGFja2FnZUluZm8uZ2V0RGVmYXVsdEFjY2Vzc09yZGVyKCkpOwotCQkKLQkJY29udGV4dFBhY2thZ2VJbmZvLnNldFNwZWNpZmllZEFjY2Vzc09yZGVyKFhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRCk7Ci0JCVhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uIGFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uID0gKFhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUik7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzT3JkZXIuVU5ERUZJTkVELCBhY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRCwgY29udGV4dFBhY2thZ2VJbmZvLmdldEFjY2Vzc09yZGVyKCkpOwotCQkKLQkJY29udGV4dFBhY2thZ2VJbmZvLnNldFNwZWNpZmllZEFjY2Vzc09yZGVyKG51bGwpOwotCQlhY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbiA9IChYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQUNDRVNTT1JfT1JERVIpOwotCQlhc3NlcnROdWxsKGFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRQYWNrYWdlSW5mby5nZXRTcGVjaWZpZWRBY2Nlc3NPcmRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRCwgY29udGV4dFBhY2thZ2VJbmZvLmdldEFjY2Vzc09yZGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuVU5ERUZJTkVELCBjb250ZXh0UGFja2FnZUluZm8uZ2V0RGVmYXVsdEFjY2Vzc09yZGVyKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQWNjZXNzT3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlUGFja2FnZUluZm9XaXRoQWNjZXNzb3JPcmRlcigpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCQotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuQUxQSEFCRVRJQ0FMLCBjb250ZXh0UGFja2FnZUluZm8uZ2V0U3BlY2lmaWVkQWNjZXNzT3JkZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NPcmRlci5BTFBIQUJFVElDQUwsIGNvbnRleHRQYWNrYWdlSW5mby5nZXRBY2Nlc3NPcmRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRCwgY29udGV4dFBhY2thZ2VJbmZvLmdldERlZmF1bHRBY2Nlc3NPcmRlcigpKTsKLQkJCi0JCS8vc2V0IHRoZSBhY2Nlc3Mgb3JkZXIgdmFsdWUgdG8gVU5ERUZJTkVECi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVBhY2thZ2UpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5zZXRFbnVtTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUiwgSkFYQi5YTUxfQUNDRVNTX09SREVSX19VTkRFRklORUQpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRCwgY29udGV4dFBhY2thZ2VJbmZvLmdldEFjY2Vzc09yZGVyKCkpOwotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLnJlbW92ZVhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFBhY2thZ2VJbmZvLmdldFNwZWNpZmllZEFjY2Vzc09yZGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuVU5ERUZJTkVELCBjb250ZXh0UGFja2FnZUluZm8uZ2V0QWNjZXNzT3JkZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NPcmRlci5VTkRFRklORUQsIGNvbnRleHRQYWNrYWdlSW5mby5nZXREZWZhdWx0QWNjZXNzT3JkZXIoKSk7Ci0JfQotCi0JLy9hZGQgYW5vdGhlciBwYWNrYWdlIGFubm90YXRpb24gc28gdGhhdCB0aGUgY29udGV4dCBtb2RlbCBvYmplY3QgZG9lc24ndCBnZXQgcmVtb3ZlZCB3aGVuIAotCS8vcmVtb3ZpbmcgdGhlIFhtbEFjY2Vzc29yVHlwZSBhbm5vdGF0aW9uLiBPbmx5ICJhbm5vdGF0ZWQiIHBhY2thZ2VzIGFyZSBhZGRlZCB0byB0aGUgY29udGV4dCBtb2RlbAotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfU0NIRU1BKTsKLQkJdGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFKTsJCQotCX0KLQotCS8vYWRkIGFub3RoZXIgcGFja2FnZSBhbm5vdGF0aW9uIHNvIHRoYXQgdGhlIGNvbnRleHQgbW9kZWwgb2JqZWN0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQgd2hlbiAKLQkvL3JlbW92aW5nIHRoZSBYbWxBY2Nlc3Nvck9yZGVyIGFubm90YXRpb24uIE9ubHkgImFubm90YXRlZCIgcGFja2FnZXMgYXJlIGFkZGVkIHRvIHRoZSBjb250ZXh0IG1vZGVsCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfU0NIRU1BKTsKLQkJdGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUik7CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0WG1sU2NoZW1hVHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhBY2Nlc3Nvck9yZGVyKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0KLQkJTGlzdEl0ZXJhYmxlPFhtbFNjaGVtYVR5cGU+IHhtbFNjaGVtYVR5cGVzID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYVR5cGVzKCk7Ci0JCWFzc2VydEZhbHNlKHhtbFNjaGVtYVR5cGVzLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQotCQkvL2FkZCAyIFhtbFNjaGVtYVR5cGVzCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVBhY2thZ2UpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5hZGRYbWxTY2hlbWFUeXBlKGRlY2xhcmF0aW9uLCAwLCAiYmFyIik7Ci0JCQkJR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLnRoaXMuYWRkWG1sU2NoZW1hVHlwZShkZWNsYXJhdGlvbiwgMSwgImZvbyIpOwotCQkJfQotCQl9KTsKLQotCQl4bWxTY2hlbWFUeXBlcyA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWFUeXBlcygpOwotCQlMaXN0SXRlcmF0b3I8WG1sU2NoZW1hVHlwZT4geG1sU2NoZW1hVHlwZXNJdGVyYXRvciA9IHhtbFNjaGVtYVR5cGVzLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUoeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IubmV4dCgpLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLm5leHQoKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sU2NoZW1hVHlwZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgaW5kZXgsIFN0cmluZyBuYW1lKSB7Ci0JCU5vcm1hbEFubm90YXRpb24gYXJyYXlFbGVtZW50ID0gdGhpcy5uZXdYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXRBc3QoKSwgbmFtZSk7Ci0JCXRoaXMuYWRkQXJyYXlFbGVtZW50KGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRVMsIGluZGV4LCBKQVhCLlhNTF9TQ0hFTUFfVFlQRVNfX1ZBTFVFLCBhcnJheUVsZW1lbnQpOwkJCi0JfQotCi0JcHJvdGVjdGVkIE5vcm1hbEFubm90YXRpb24gbmV3WG1sU2NoZW1hVHlwZUFubm90YXRpb24oQVNUIGFzdCwgU3RyaW5nIG5hbWUpIHsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5uZXdOb3JtYWxBbm5vdGF0aW9uKGFzdCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRV9fTkFNRSwgbmFtZSk7Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRYbWxTY2hlbWFUeXBlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhBY2Nlc3Nvck9yZGVyKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWFUeXBlc1NpemUoKSk7Ci0KLQkJLy9hZGQgMiBYbWxTY2hlbWFUeXBlcwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VQYWNrYWdlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLnRoaXMuYWRkWG1sU2NoZW1hVHlwZShkZWNsYXJhdGlvbiwgMCwgImJhciIpOwotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLmFkZFhtbFNjaGVtYVR5cGUoZGVjbGFyYXRpb24sIDEsICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygyLCBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hVHlwZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRYbWxTY2hlbWFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vY3JlYXRlIGEgcGFja2FnZSBpbmZvIHdpdGggYW4gYW5ub3RhdGlvbiBvdGhlciB0aGFuIFhtbFNjaGVtYSB0byB0ZXN0Ci0JCS8vYWRkaW5nIHRoaW5ncyB0byB0aGUgbnVsbCBzY2hlbWEgYW5ub3RhdGlvbgotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yVHlwZSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCQkKLQkJY29udGV4dFBhY2thZ2VJbmZvLmFkZFhtbFNjaGVtYVR5cGUoMCkuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJiYXIiKTsKLQkJY29udGV4dFBhY2thZ2VJbmZvLmFkZFhtbFNjaGVtYVR5cGUoMCkuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJY29udGV4dFBhY2thZ2VJbmZvLmFkZFhtbFNjaGVtYVR5cGUoMCkuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJiYXoiKTsKLQotCQlJdGVyYXRvcjxYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbj4geG1sU2NoZW1hVHlwZXMgPSB0aGlzLmdldFNjaGVtYVR5cGVBbm5vdGF0aW9ucyhyZXNvdXJjZVBhY2thZ2UpOwotCi0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sU2NoZW1hVHlwZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sU2NoZW1hVHlwZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sU2NoZW1hVHlwZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbFNjaGVtYVR5cGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uPiBnZXRTY2hlbWFUeXBlQW5ub3RhdGlvbnMoSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBTdWJMaXN0SXRlcmFibGVXcmFwcGVyPE5lc3RhYmxlQW5ub3RhdGlvbiwgWG1sU2NoZW1hVHlwZUFubm90YXRpb24+KHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9ucyhKQVhCLlhNTF9TQ0hFTUFfVFlQRSkpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFhtbFNjaGVtYVR5cGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vY3JlYXRlIGEgcGFja2FnZSBpbmZvIHdpdGggYW4gYW5ub3RhdGlvbiBvdGhlciB0aGFuIFhtbFNjaGVtYSB0byB0ZXN0Ci0JCS8vYWRkaW5nIHRoaW5ncyB0byB0aGUgbnVsbCBzY2hlbWEgYW5ub3RhdGlvbgotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yVHlwZSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCWNvbnRleHRQYWNrYWdlSW5mby5hZGRYbWxTY2hlbWFUeXBlKDApLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiYmFyIik7Ci0JCWNvbnRleHRQYWNrYWdlSW5mby5hZGRYbWxTY2hlbWFUeXBlKDEpLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWNvbnRleHRQYWNrYWdlSW5mby5hZGRYbWxTY2hlbWFUeXBlKDApLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiYmF6Iik7Ci0KLQkJSXRlcmF0b3I8WG1sU2NoZW1hVHlwZUFubm90YXRpb24+IHhtbFNjaGVtYVR5cGVzID0gdGhpcy5nZXRTY2hlbWFUeXBlQW5ub3RhdGlvbnMocmVzb3VyY2VQYWNrYWdlKTsKLQotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbFNjaGVtYVR5cGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbFNjaGVtYVR5cGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFNjaGVtYVR5cGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh4bWxTY2hlbWFUeXBlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVYbWxTY2hlbWFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoQWNjZXNzb3JUeXBlKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0KLQkJY29udGV4dFBhY2thZ2VJbmZvLmFkZFhtbFNjaGVtYVR5cGUoMCkuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJiYXIiKTsKLQkJY29udGV4dFBhY2thZ2VJbmZvLmFkZFhtbFNjaGVtYVR5cGUoMSkuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJY29udGV4dFBhY2thZ2VJbmZvLmFkZFhtbFNjaGVtYVR5cGUoMikuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJiYXoiKTsKLQotCQlJdGVyYXRvcjxYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbj4geG1sU2NoZW1hVHlwZXMgPSB0aGlzLmdldFNjaGVtYVR5cGVBbm5vdGF0aW9ucyhyZXNvdXJjZVBhY2thZ2UpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbFNjaGVtYVR5cGVzLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sU2NoZW1hVHlwZXMubmV4dCgpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxTY2hlbWFUeXBlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sU2NoZW1hVHlwZXMuaGFzTmV4dCgpKTsKLQotCQljb250ZXh0UGFja2FnZUluZm8ucmVtb3ZlWG1sU2NoZW1hVHlwZSgxKTsKLQotCQl4bWxTY2hlbWFUeXBlcyA9IHRoaXMuZ2V0U2NoZW1hVHlwZUFubm90YXRpb25zKHJlc291cmNlUGFja2FnZSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sU2NoZW1hVHlwZXMubmV4dCgpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxTY2hlbWFUeXBlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sU2NoZW1hVHlwZXMuaGFzTmV4dCgpKTsKLQotCQljb250ZXh0UGFja2FnZUluZm8ucmVtb3ZlWG1sU2NoZW1hVHlwZSgxKTsKLQkJeG1sU2NoZW1hVHlwZXMgPSB0aGlzLmdldFNjaGVtYVR5cGVBbm5vdGF0aW9ucyhyZXNvdXJjZVBhY2thZ2UpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbFNjaGVtYVR5cGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh4bWxTY2hlbWFUeXBlcy5oYXNOZXh0KCkpOwotCi0JCWNvbnRleHRQYWNrYWdlSW5mby5yZW1vdmVYbWxTY2hlbWFUeXBlKDApOwotCQl4bWxTY2hlbWFUeXBlcyA9IHRoaXMuZ2V0U2NoZW1hVHlwZUFubm90YXRpb25zKHJlc291cmNlUGFja2FnZSk7Ci0JCWFzc2VydEZhbHNlKHhtbFNjaGVtYVR5cGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVYbWxTY2hlbWFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoQWNjZXNzb3JUeXBlKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0KLQkJY29udGV4dFBhY2thZ2VJbmZvLmFkZFhtbFNjaGVtYVR5cGUoMCkuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJiYXIiKTsKLQkJY29udGV4dFBhY2thZ2VJbmZvLmFkZFhtbFNjaGVtYVR5cGUoMSkuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJY29udGV4dFBhY2thZ2VJbmZvLmFkZFhtbFNjaGVtYVR5cGUoMikuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJiYXoiKTsKLQotCQlJdGVyYXRvcjxYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbj4geG1sU2NoZW1hVHlwZXMgPSB0aGlzLmdldFNjaGVtYVR5cGVBbm5vdGF0aW9ucyhyZXNvdXJjZVBhY2thZ2UpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbFNjaGVtYVR5cGVzLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sU2NoZW1hVHlwZXMubmV4dCgpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxTY2hlbWFUeXBlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sU2NoZW1hVHlwZXMuaGFzTmV4dCgpKTsKLQotCQljb250ZXh0UGFja2FnZUluZm8ubW92ZVhtbFNjaGVtYVR5cGUoMiwgMCk7Ci0JCXhtbFNjaGVtYVR5cGVzID0gdGhpcy5nZXRTY2hlbWFUeXBlQW5ub3RhdGlvbnMocmVzb3VyY2VQYWNrYWdlKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxTY2hlbWFUeXBlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxTY2hlbWFUeXBlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxTY2hlbWFUeXBlcy5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRGYWxzZSh4bWxTY2hlbWFUeXBlcy5oYXNOZXh0KCkpOwotCi0JCWNvbnRleHRQYWNrYWdlSW5mby5tb3ZlWG1sU2NoZW1hVHlwZSgwLCAxKTsKLQkJeG1sU2NoZW1hVHlwZXMgPSB0aGlzLmdldFNjaGVtYVR5cGVBbm5vdGF0aW9ucyhyZXNvdXJjZVBhY2thZ2UpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbFNjaGVtYVR5cGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFNjaGVtYVR5cGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbFNjaGVtYVR5cGVzLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEZhbHNlKHhtbFNjaGVtYVR5cGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNYbWxTY2hlbWFUeXBlcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yVHlwZSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCUxpc3RJdGVyYWJsZTxYbWxTY2hlbWFUeXBlPiB4bWxTY2hlbWFUeXBlcyA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWFUeXBlcygpOwotCQlhc3NlcnRGYWxzZSh4bWxTY2hlbWFUeXBlcy5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0KLQkJLy9hZGQgMyBYbWxTY2hlbWFUeXBlcwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VQYWNrYWdlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLnRoaXMuYWRkWG1sU2NoZW1hVHlwZShkZWNsYXJhdGlvbiwgMCwgImJhciIpOwotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLmFkZFhtbFNjaGVtYVR5cGUoZGVjbGFyYXRpb24sIDEsICJmb28iKTsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5hZGRYbWxTY2hlbWFUeXBlKGRlY2xhcmF0aW9uLCAyLCAiYmF6Iik7Ci0JCQl9Ci0JCX0pOwotCi0JCXhtbFNjaGVtYVR5cGVzID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYVR5cGVzKCk7Ci0JCUxpc3RJdGVyYXRvcjxYbWxTY2hlbWFUeXBlPiB4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yID0geG1sU2NoZW1hVHlwZXMuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5uZXh0KCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IubmV4dCgpLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLm5leHQoKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLm1vdmVYbWxTY2hlbWFUeXBlKGRlY2xhcmF0aW9uLCAyLCAwKTsKLQkJCX0KLQkJfSk7Ci0KLQkJeG1sU2NoZW1hVHlwZXNJdGVyYXRvciA9IHhtbFNjaGVtYVR5cGVzLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUoeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IubmV4dCgpLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLm5leHQoKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5uZXh0KCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5tb3ZlWG1sU2NoZW1hVHlwZShkZWNsYXJhdGlvbiwgMCwgMSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXhtbFNjaGVtYVR5cGVzSXRlcmF0b3IgPSB4bWxTY2hlbWFUeXBlcy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLm5leHQoKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5uZXh0KCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IubmV4dCgpLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLnRoaXMucmVtb3ZlWG1sU2NoZW1hVHlwZShkZWNsYXJhdGlvbiwgMSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXhtbFNjaGVtYVR5cGVzSXRlcmF0b3IgPSB4bWxTY2hlbWFUeXBlcy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLm5leHQoKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5uZXh0KCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5yZW1vdmVYbWxTY2hlbWFUeXBlKGRlY2xhcmF0aW9uLCAxKTsKLQkJCX0KLQkJfSk7Ci0KLQkJeG1sU2NoZW1hVHlwZXNJdGVyYXRvciA9IHhtbFNjaGVtYVR5cGVzLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUoeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IubmV4dCgpLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLnRoaXMucmVtb3ZlWG1sU2NoZW1hVHlwZShkZWNsYXJhdGlvbiwgMCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXhtbFNjaGVtYVR5cGVzSXRlcmF0b3IgPSB4bWxTY2hlbWFUeXBlcy5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNBZGRYbWxTY2hlbWFUeXBlcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yVHlwZSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCUxpc3RJdGVyYWJsZTxYbWxTY2hlbWFUeXBlPiB4bWxTY2hlbWFUeXBlcyA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWFUeXBlcygpOwotCQlhc3NlcnRGYWxzZSh4bWxTY2hlbWFUeXBlcy5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0KLQkJLy9hZGQgMSBYbWxTY2hlbWFUeXBlIHdoZW4gbm9uZSBleGlzdAotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VQYWNrYWdlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLnRoaXMuYWRkWG1sU2NoZW1hVHlwZShkZWNsYXJhdGlvbiwgMCwgImJhciIpOwotCQkJfQotCQl9KTsKLQotCQl4bWxTY2hlbWFUeXBlcyA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWFUeXBlcygpOwotCQlMaXN0SXRlcmF0b3I8WG1sU2NoZW1hVHlwZT4geG1sU2NoZW1hVHlwZXNJdGVyYXRvciA9IHhtbFNjaGVtYVR5cGVzLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUoeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IubmV4dCgpLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0KLQkJLy9hZGQgMSBYbWxTY2hlbWFUeXBlIHdoZW4gMSBzdGFuZGFsb25lIGV4aXN0cwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5hZGRYbWxTY2hlbWFUeXBlKGRlY2xhcmF0aW9uLCAxLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCi0JCXhtbFNjaGVtYVR5cGVzID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYVR5cGVzKCk7Ci0JCXhtbFNjaGVtYVR5cGVzSXRlcmF0b3IgPSB4bWxTY2hlbWFUeXBlcy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLm5leHQoKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5uZXh0KCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJLy9hZGQgMSBYbWxTY2hlbWFUeXBlIHdoZW4gYSBjb250YWluZXIgYW5ub3RhdGlvbnMgZXhpc3RzCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLmFkZFhtbFNjaGVtYVR5cGUoZGVjbGFyYXRpb24sIDIsICJiYXoiKTsKLQkJCX0KLQkJfSk7Ci0KLQkJeG1sU2NoZW1hVHlwZXMgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hVHlwZXMoKTsKLQkJeG1sU2NoZW1hVHlwZXNJdGVyYXRvciA9IHhtbFNjaGVtYVR5cGVzLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUoeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IubmV4dCgpLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLm5leHQoKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5uZXh0KCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJLy9hZGQgMSBYbWxTY2hlbWFUeXBlIHRvIGJlZ2lubmluZyBvZiBsaXN0IHdoZW4gYSBjb250YWluZXIgYW5ub3RhdGlvbnMgZXhpc3RzCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLmFkZFhtbFNjaGVtYVR5cGUoZGVjbGFyYXRpb24sIDAsICJmb29iYXoiKTsKLQkJCX0KLQkJfSk7Ci0KLQkJeG1sU2NoZW1hVHlwZXMgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hVHlwZXMoKTsKLQkJeG1sU2NoZW1hVHlwZXNJdGVyYXRvciA9IHhtbFNjaGVtYVR5cGVzLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUoeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvb2JheiIsIHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IubmV4dCgpLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLm5leHQoKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5uZXh0KCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IubmV4dCgpLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1vdmVYbWxTY2hlbWFUeXBlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMubW92ZUFycmF5RWxlbWVudCgoTm9ybWFsQW5ub3RhdGlvbikgZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKEpBWEIuWE1MX1NDSEVNQV9UWVBFUyksIEpBWEIuWE1MX1NDSEVNQV9UWVBFU19fVkFMVUUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sU2NoZW1hVHlwZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgaW5kZXgpIHsKLQkJdGhpcy5yZW1vdmVBcnJheUVsZW1lbnQoKE5vcm1hbEFubm90YXRpb24pIGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChKQVhCLlhNTF9TQ0hFTUFfVFlQRVMpLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRVNfX1ZBTFVFLCBpbmRleCk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRYbWxKYXZhVHlwZUFkYXB0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoQWNjZXNzb3JPcmRlcigpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCUxpc3RJdGVyYWJsZTxYbWxKYXZhVHlwZUFkYXB0ZXI+IHhtbEphdmFUeXBlQWRhcHRlcnMgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sSmF2YVR5cGVBZGFwdGVycygpOwotCQlhc3NlcnRGYWxzZSh4bWxKYXZhVHlwZUFkYXB0ZXJzLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQotCQkvL2FkZCAyIFhtbEphdmFUeXBlQWRhcHRlcnMKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlUGFja2FnZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLmFkZFhtbEphdmFUeXBlQWRhcHRlcihkZWNsYXJhdGlvbiwgMCwgIlN0cmluZyIpOwotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLmFkZFhtbEphdmFUeXBlQWRhcHRlcihkZWNsYXJhdGlvbiwgMSwgIkludGVnZXIiKTsKLQkJCX0KLQkJfSk7Ci0KLQkJeG1sSmF2YVR5cGVBZGFwdGVycyA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxKYXZhVHlwZUFkYXB0ZXJzKCk7Ci0JCUxpc3RJdGVyYXRvcjxYbWxKYXZhVHlwZUFkYXB0ZXI+IHhtbEphdmFUeXBlQWRhcHRlcnNJdGVyYXRvciA9IHhtbEphdmFUeXBlQWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCB4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IubmV4dCgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkludGVnZXIiLCB4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IubmV4dCgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sSmF2YVR5cGVBZGFwdGVyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIGludCBpbmRleCwgU3RyaW5nIG5hbWUpIHsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhcnJheUVsZW1lbnQgPSB0aGlzLm5ld1htbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0QXN0KCksIG5hbWUpOwotCQl0aGlzLmFkZEFycmF5RWxlbWVudChkZWNsYXJhdGlvbiwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJTLCBpbmRleCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJTX19WQUxVRSwgYXJyYXlFbGVtZW50KTsJCQotCX0KLQotCXByb3RlY3RlZCBOb3JtYWxBbm5vdGF0aW9uIG5ld1htbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24oQVNUIGFzdCwgU3RyaW5nIHZhbHVlVHlwZU5hbWUpIHsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5uZXdOb3JtYWxBbm5vdGF0aW9uKGFzdCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcigKLQkJCWFubm90YXRpb24sCi0JCQlKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUl9fVkFMVUUsIAotCQkJdGhpcy5uZXdUeXBlTGl0ZXJhbChhc3QsIHZhbHVlVHlwZU5hbWUpKTsKLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFhtbEphdmFUeXBlQWRhcHRlcnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoQWNjZXNzb3JPcmRlcigpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCWFzc2VydEVxdWFscygwLCBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sSmF2YVR5cGVBZGFwdGVyc1NpemUoKSk7Ci0KLQkJLy9hZGQgMiBYbWxKYXZhVHlwZUFkYXB0ZXJzCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVBhY2thZ2UpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5hZGRYbWxKYXZhVHlwZUFkYXB0ZXIoZGVjbGFyYXRpb24sIDAsICJTdHJpbmciKTsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5hZGRYbWxKYXZhVHlwZUFkYXB0ZXIoZGVjbGFyYXRpb24sIDEsICJJbnRlZ2VyIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoMiwgY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbEphdmFUeXBlQWRhcHRlcnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRYbWxKYXZhVHlwZUFkYXB0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy9jcmVhdGUgYSBwYWNrYWdlIGluZm8gd2l0aCBhbiBhbm5vdGF0aW9uIG90aGVyIHRoYW4gWG1sU2NoZW1hIHRvIHRlc3QKLQkJLy9hZGRpbmcgdGhpbmdzIHRvIHRoZSBudWxsIHNjaGVtYSBhbm5vdGF0aW9uCi0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoQWNjZXNzb3JUeXBlKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0KLQkJY29udGV4dFBhY2thZ2VJbmZvLmFkZFhtbEphdmFUeXBlQWRhcHRlcigwKS5zZXRWYWx1ZSgiYmFyIik7Ci0JCWNvbnRleHRQYWNrYWdlSW5mby5hZGRYbWxKYXZhVHlwZUFkYXB0ZXIoMCkuc2V0VmFsdWUoImZvbyIpOwotCQljb250ZXh0UGFja2FnZUluZm8uYWRkWG1sSmF2YVR5cGVBZGFwdGVyKDApLnNldFZhbHVlKCJiYXoiKTsKLQotCQlJdGVyYXRvcjxYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uPiB4bWxKYXZhVHlwZUFkYXB0ZXJzID0gdGhpcy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9ucyhyZXNvdXJjZVBhY2thZ2UpOwotCi0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sSmF2YVR5cGVBZGFwdGVycy5uZXh0KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sSmF2YVR5cGVBZGFwdGVycy5uZXh0KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sSmF2YVR5cGVBZGFwdGVycy5uZXh0KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEphdmFUeXBlQWRhcHRlcnMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbj4gZ2V0WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbnMoSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBTdWJMaXN0SXRlcmFibGVXcmFwcGVyPE5lc3RhYmxlQW5ub3RhdGlvbiwgWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbj4ocmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb25zKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkWG1sSmF2YVR5cGVBZGFwdGVyMigpIHRocm93cyBFeGNlcHRpb24gewotCQkvL2NyZWF0ZSBhIHBhY2thZ2UgaW5mbyB3aXRoIGFuIGFubm90YXRpb24gb3RoZXIgdGhhbiBYbWxTY2hlbWEgdG8gdGVzdAotCQkvL2FkZGluZyB0aGluZ3MgdG8gdGhlIG51bGwgc2NoZW1hIGFubm90YXRpb24KLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhBY2Nlc3NvclR5cGUoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQljb250ZXh0UGFja2FnZUluZm8uYWRkWG1sSmF2YVR5cGVBZGFwdGVyKDApLnNldFZhbHVlKCJiYXIiKTsKLQkJY29udGV4dFBhY2thZ2VJbmZvLmFkZFhtbEphdmFUeXBlQWRhcHRlcigxKS5zZXRWYWx1ZSgiZm9vIik7Ci0JCWNvbnRleHRQYWNrYWdlSW5mby5hZGRYbWxKYXZhVHlwZUFkYXB0ZXIoMCkuc2V0VmFsdWUoImJheiIpOwotCi0JCUl0ZXJhdG9yPFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24+IHhtbEphdmFUeXBlQWRhcHRlcnMgPSB0aGlzLmdldFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb25zKHJlc291cmNlUGFja2FnZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxKYXZhVHlwZUFkYXB0ZXJzLm5leHQoKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxKYXZhVHlwZUFkYXB0ZXJzLm5leHQoKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxKYXZhVHlwZUFkYXB0ZXJzLm5leHQoKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sSmF2YVR5cGVBZGFwdGVycy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVYbWxKYXZhVHlwZUFkYXB0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhBY2Nlc3NvclR5cGUoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQljb250ZXh0UGFja2FnZUluZm8uYWRkWG1sSmF2YVR5cGVBZGFwdGVyKDApLnNldFZhbHVlKCJTdHJpbmciKTsKLQkJY29udGV4dFBhY2thZ2VJbmZvLmFkZFhtbEphdmFUeXBlQWRhcHRlcigxKS5zZXRWYWx1ZSgiZm9vIik7Ci0JCWNvbnRleHRQYWNrYWdlSW5mby5hZGRYbWxKYXZhVHlwZUFkYXB0ZXIoMikuc2V0VmFsdWUoImJheiIpOwotCi0JCUl0ZXJhdG9yPFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24+IHhtbEphdmFUeXBlQWRhcHRlcnMgPSB0aGlzLmdldFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb25zKHJlc291cmNlUGFja2FnZSk7Ci0JCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gYWRhcHRlckFubm90YXRpb24gPSB4bWxKYXZhVHlwZUFkYXB0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBhZGFwdGVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBhZGFwdGVyQW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFZhbHVlKCkpOwkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sSmF2YVR5cGVBZGFwdGVycy5uZXh0KCkuZ2V0VmFsdWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxKYXZhVHlwZUFkYXB0ZXJzLm5leHQoKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sSmF2YVR5cGVBZGFwdGVycy5oYXNOZXh0KCkpOwotCi0JCWNvbnRleHRQYWNrYWdlSW5mby5yZW1vdmVYbWxKYXZhVHlwZUFkYXB0ZXIoMSk7Ci0KLQkJeG1sSmF2YVR5cGVBZGFwdGVycyA9IHRoaXMuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbnMocmVzb3VyY2VQYWNrYWdlKTsKLQkJYWRhcHRlckFubm90YXRpb24gPSB4bWxKYXZhVHlwZUFkYXB0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBhZGFwdGVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBhZGFwdGVyQW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFZhbHVlKCkpOwkJCi0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sSmF2YVR5cGVBZGFwdGVycy5uZXh0KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEphdmFUeXBlQWRhcHRlcnMuaGFzTmV4dCgpKTsKLQotCQljb250ZXh0UGFja2FnZUluZm8ucmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKDEpOwotCQl4bWxKYXZhVHlwZUFkYXB0ZXJzID0gdGhpcy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9ucyhyZXNvdXJjZVBhY2thZ2UpOwotCQlhZGFwdGVyQW5ub3RhdGlvbiA9IHhtbEphdmFUeXBlQWRhcHRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIGFkYXB0ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwkJCi0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIGFkYXB0ZXJBbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVmFsdWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2UoeG1sSmF2YVR5cGVBZGFwdGVycy5oYXNOZXh0KCkpOwotCi0JCWNvbnRleHRQYWNrYWdlSW5mby5yZW1vdmVYbWxKYXZhVHlwZUFkYXB0ZXIoMCk7Ci0JCXhtbEphdmFUeXBlQWRhcHRlcnMgPSB0aGlzLmdldFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb25zKHJlc291cmNlUGFja2FnZSk7Ci0JCWFzc2VydEZhbHNlKHhtbEphdmFUeXBlQWRhcHRlcnMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVhtbEphdmFUeXBlQWRhcHRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yVHlwZSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCWNvbnRleHRQYWNrYWdlSW5mby5hZGRYbWxKYXZhVHlwZUFkYXB0ZXIoMCkuc2V0VmFsdWUoImJhciIpOwotCQljb250ZXh0UGFja2FnZUluZm8uYWRkWG1sSmF2YVR5cGVBZGFwdGVyKDEpLnNldFZhbHVlKCJmb28iKTsKLQkJY29udGV4dFBhY2thZ2VJbmZvLmFkZFhtbEphdmFUeXBlQWRhcHRlcigyKS5zZXRWYWx1ZSgiYmF6Iik7Ci0KLQkJSXRlcmF0b3I8WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbj4geG1sSmF2YVR5cGVBZGFwdGVycyA9IHRoaXMuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbnMocmVzb3VyY2VQYWNrYWdlKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxKYXZhVHlwZUFkYXB0ZXJzLm5leHQoKS5nZXRWYWx1ZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEphdmFUeXBlQWRhcHRlcnMubmV4dCgpLmdldFZhbHVlKCkpOwkJCi0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sSmF2YVR5cGVBZGFwdGVycy5uZXh0KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEphdmFUeXBlQWRhcHRlcnMuaGFzTmV4dCgpKTsKLQotCQljb250ZXh0UGFja2FnZUluZm8ubW92ZVhtbEphdmFUeXBlQWRhcHRlcigyLCAwKTsKLQkJeG1sSmF2YVR5cGVBZGFwdGVycyA9IHRoaXMuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbnMocmVzb3VyY2VQYWNrYWdlKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxKYXZhVHlwZUFkYXB0ZXJzLm5leHQoKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxKYXZhVHlwZUFkYXB0ZXJzLm5leHQoKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxKYXZhVHlwZUFkYXB0ZXJzLm5leHQoKS5nZXRWYWx1ZSgpKTsJCQotCQlhc3NlcnRGYWxzZSh4bWxKYXZhVHlwZUFkYXB0ZXJzLmhhc05leHQoKSk7Ci0KLQkJY29udGV4dFBhY2thZ2VJbmZvLm1vdmVYbWxKYXZhVHlwZUFkYXB0ZXIoMCwgMSk7Ci0JCXhtbEphdmFUeXBlQWRhcHRlcnMgPSB0aGlzLmdldFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb25zKHJlc291cmNlUGFja2FnZSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sSmF2YVR5cGVBZGFwdGVycy5uZXh0KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sSmF2YVR5cGVBZGFwdGVycy5uZXh0KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sSmF2YVR5cGVBZGFwdGVycy5uZXh0KCkuZ2V0VmFsdWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2UoeG1sSmF2YVR5cGVBZGFwdGVycy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jWG1sSmF2YVR5cGVBZGFwdGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yVHlwZSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCUxpc3RJdGVyYWJsZTxYbWxKYXZhVHlwZUFkYXB0ZXI+IHhtbEphdmFUeXBlQWRhcHRlcnMgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sSmF2YVR5cGVBZGFwdGVycygpOwotCQlhc3NlcnRGYWxzZSh4bWxKYXZhVHlwZUFkYXB0ZXJzLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQotCQkvL2FkZCAzIFhtbEphdmFUeXBlQWRhcHRlcnMKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlUGFja2FnZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLmFkZFhtbEphdmFUeXBlQWRhcHRlcihkZWNsYXJhdGlvbiwgMCwgImJhciIpOwotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLmFkZFhtbEphdmFUeXBlQWRhcHRlcihkZWNsYXJhdGlvbiwgMSwgImZvbyIpOwotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLmFkZFhtbEphdmFUeXBlQWRhcHRlcihkZWNsYXJhdGlvbiwgMiwgImJheiIpOwotCQkJfQotCQl9KTsKLQotCQl4bWxKYXZhVHlwZUFkYXB0ZXJzID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbEphdmFUeXBlQWRhcHRlcnMoKTsKLQkJTGlzdEl0ZXJhdG9yPFhtbEphdmFUeXBlQWRhcHRlcj4geG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yID0geG1sSmF2YVR5cGVBZGFwdGVycy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHhtbEphdmFUeXBlQWRhcHRlcnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbEphdmFUeXBlQWRhcHRlcnNJdGVyYXRvci5uZXh0KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yLm5leHQoKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IubmV4dCgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLm1vdmVYbWxKYXZhVHlwZUFkYXB0ZXIoZGVjbGFyYXRpb24sIDIsIDApOwotCQkJfQotCQl9KTsKLQotCQl4bWxKYXZhVHlwZUFkYXB0ZXJzID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbEphdmFUeXBlQWRhcHRlcnMoKTsKLQkJeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yID0geG1sSmF2YVR5cGVBZGFwdGVycy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHhtbEphdmFUeXBlQWRhcHRlcnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEphdmFUeXBlQWRhcHRlcnNJdGVyYXRvci5uZXh0KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yLm5leHQoKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IubmV4dCgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLm1vdmVYbWxKYXZhVHlwZUFkYXB0ZXIoZGVjbGFyYXRpb24sIDAsIDEpOwotCQkJfQotCQl9KTsKLQotCQl4bWxKYXZhVHlwZUFkYXB0ZXJzID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbEphdmFUeXBlQWRhcHRlcnMoKTsKLQkJeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yID0geG1sSmF2YVR5cGVBZGFwdGVycy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHhtbEphdmFUeXBlQWRhcHRlcnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbEphdmFUeXBlQWRhcHRlcnNJdGVyYXRvci5uZXh0KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yLm5leHQoKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IubmV4dCgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLnJlbW92ZVhtbEphdmFUeXBlQWRhcHRlcihkZWNsYXJhdGlvbiwgMSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXhtbEphdmFUeXBlQWRhcHRlcnMgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sSmF2YVR5cGVBZGFwdGVycygpOwotCQl4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IgPSB4bWxKYXZhVHlwZUFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUoeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yLm5leHQoKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IubmV4dCgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLnJlbW92ZVhtbEphdmFUeXBlQWRhcHRlcihkZWNsYXJhdGlvbiwgMSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXhtbEphdmFUeXBlQWRhcHRlcnMgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sSmF2YVR5cGVBZGFwdGVycygpOwotCQl4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IgPSB4bWxKYXZhVHlwZUFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUoeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yLm5leHQoKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5yZW1vdmVYbWxKYXZhVHlwZUFkYXB0ZXIoZGVjbGFyYXRpb24sIDApOwotCQkJfQotCQl9KTsKLQotCQl4bWxKYXZhVHlwZUFkYXB0ZXJzID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbEphdmFUeXBlQWRhcHRlcnMoKTsKLQkJeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yID0geG1sSmF2YVR5cGVBZGFwdGVycy5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIG1vdmVYbWxKYXZhVHlwZUFkYXB0ZXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5tb3ZlQXJyYXlFbGVtZW50KChOb3JtYWxBbm5vdGF0aW9uKSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJTKSwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJTX19WQUxVRSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxKYXZhVHlwZUFkYXB0ZXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXRoaXMucmVtb3ZlQXJyYXlFbGVtZW50KChOb3JtYWxBbm5vdGF0aW9uKSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJTKSwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJTX19WQUxVRSwgaW5kZXgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQYWNrYWdlWG1sSmF2YVR5cGVBZGFwdGVyVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQYWNrYWdlWG1sSmF2YVR5cGVBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ0NTExNi4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGFja2FnZVhtbEphdmFUeXBlQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5KYXhiQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFQYWNrYWdlWG1sSmF2YVR5cGVBZGFwdGVyVGVzdHMgZXh0ZW5kcyBKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXB1YmxpYyBHZW5lcmljSmF2YVBhY2thZ2VYbWxKYXZhVHlwZUFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlUGFja2FnZUluZm9XaXRoWG1sSmF2YVR5cGVBZGFwdGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFBhY2thZ2VJbmZvKAotCQkJCSJAWG1sSmF2YVR5cGVBZGFwdGVyIiwKLQkJCQlKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlYbWxKYXZhVHlwZUFkYXB0ZXIgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlciA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxKYXZhVHlwZUFkYXB0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCWFzc2VydE51bGwoY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQotCQljb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLnNldFZhbHVlKCJmb28iKTsKLQkJWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiBqYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJIC8vdmVyaWZ5IHRoZSB4bWwgc2NoZW1hIHR5cGUgYW5ub3RhdGlvbiBpcyBub3QgcmVtb3ZlZCB3aGVuIHRoZSB2YWx1ZSBpcyBzZXQgdG8gbnVsbAotCQljb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLnNldFZhbHVlKG51bGwpOwotCQlqYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0TnVsbChqYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJWG1sSmF2YVR5cGVBZGFwdGVyIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sSmF2YVR5cGVBZGFwdGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJLy9hZGQgYSB2YWx1ZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VQYWNrYWdlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFQYWNrYWdlWG1sSmF2YVR5cGVBZGFwdGVyVGVzdHMudGhpcy5hZGRYbWxKYXZhVHlwZUFkYXB0ZXJUeXBlTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUl9fVkFMVUUsICJTdHJpbmciKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VYbWxKYXZhVHlwZUFkYXB0ZXJUZXN0cy50aGlzLnJlbW92ZVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbEphdmFUeXBlQWRhcHRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlYbWxKYXZhVHlwZUFkYXB0ZXIgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlciA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxKYXZhVHlwZUFkYXB0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCWFzc2VydE51bGwoY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldERlZmF1bHRUeXBlKCkpOwotCi0JCWNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuc2V0U3BlY2lmaWVkVHlwZSgiZm9vIik7Ci0JCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gamF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VHlwZSgpKTsKLQotCQkgLy92ZXJpZnkgdGhlIHhtbCBzY2hlbWEgdHlwZSBhbm5vdGF0aW9uIGlzIG5vdCByZW1vdmVkIHdoZW4gdGhlIHR5cGUgaXMgc2V0IHRvIG51bGwKLQkJY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQlqYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0TnVsbChqYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldERlZmF1bHRUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJWG1sSmF2YVR5cGVBZGFwdGVyIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sSmF2YVR5cGVBZGFwdGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXREZWZhdWx0VHlwZSgpKTsKLQotCQkvL2FkZCBhIHR5cGUgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlUGFja2FnZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUGFja2FnZVhtbEphdmFUeXBlQWRhcHRlclRlc3RzLnRoaXMuYWRkWG1sSmF2YVR5cGVBZGFwdGVyVHlwZU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJfX1RZUEUsICJTdHJpbmciKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRUeXBlKCkpOwotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUGFja2FnZVhtbEphdmFUeXBlQWRhcHRlclRlc3RzLnRoaXMucmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRGYWxzZShjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sSmF2YVR5cGVBZGFwdGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxKYXZhVHlwZUFkYXB0ZXJUeXBlTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkoTWFya2VyQW5ub3RhdGlvbikgdGhpcy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgCi0JCQluYW1lLCAKLQkJCXRoaXMubmV3VHlwZUxpdGVyYWwoZGVjbGFyYXRpb24uZ2V0QXN0KCksIHR5cGVOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sSmF2YVR5cGVBZGFwdGVyTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoKE1hcmtlckFubm90YXRpb24pIHRoaXMuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvL2FkZCBhbm90aGVyIHBhY2thZ2UgYW5ub3RhdGlvbiBzbyB0aGF0IHRoZSBjb250ZXh0IG1vZGVsIG9iamVjdCBkb2Vzbid0IGdldCByZW1vdmVkIHdoZW4gCi0JLy9yZW1vdmluZyB0aGUgWG1sSmF2YVR5cGVBZGFwdGVyIGFubm90YXRpb24uIE9ubHkgImFubm90YXRlZCIgcGFja2FnZXMgYXJlIGFkZGVkIHRvIHRoZSBjb250ZXh0IG1vZGVsCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUik7Ci0JCXRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwkJCi0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNiZjRiMC4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMKLQkJZXh0ZW5kcyBKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBURVNUX0NMQVNTX05BTUUgPSAiVGVzdENsYXNzIjsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVYbWxUeXBlV2l0aFZhcmlvdXNBdHRyaWJ1dGVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKQVhCLlhNTF9UWVBFKS5hcHBlbmQoIjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiaW1wb3J0IGphdmEudXRpbC5MaXN0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoVEVTVF9DTEFTU19OQU1FKS5hcHBlbmQoIjxUIGV4dGVuZHMgTnVtYmVyPiAiKS5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBTdHJpbmcgc3RyaW5nOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIExpc3Q8U3RyaW5nPiBzdHJpbmdMaXN0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIFN0cmluZ1tdIHN0cmluZ0FycmF5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIFN0cmluZ1tdW10gc3RyaW5nRG91YmxlQXJyYXk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgVCBnZW5lcmljOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIExpc3Q8VD4gZ2VuZXJpY0xpc3Q7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgVFtdIGdlbmVyaWNBcnJheTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBMaXN0PD8+IHdpbGRjYXJkTGlzdDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBieXRlW10gYnl0ZUFycmF5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIExpc3QgbGlzdDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgVEVTVF9DTEFTU19OQU1FICsgIi5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEphdmFSZXNvdXJjZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlWG1sVHlwZVdpdGhWYXJpb3VzQXR0cmlidXRlcygpOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9ICgoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoUEFDS0FHRV9OQU1FXyArIFRFU1RfQ0xBU1NfTkFNRSkpLmdldE1hcHBpbmcoKTsKLQkJCi0JCS8vIFN0cmluZyBzdHJpbmcKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0ID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgYXR0LmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZUJhc2VUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHQuaXNKYXZhUmVzb3VyY2VBdHRyaWJ1dGVDb2xsZWN0aW9uVHlwZSgpKTsKLQkJCi0JCS8vIExpc3Q8U3RyaW5nPiBzdHJpbmdMaXN0Ci0JCWF0dCA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIGF0dC5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGVCYXNlVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhdHQuaXNKYXZhUmVzb3VyY2VBdHRyaWJ1dGVDb2xsZWN0aW9uVHlwZSgpKTsKLQkJCi0JCS8vIFN0cmluZ1tdIHN0cmluZ0FycmF5Ci0JCWF0dCA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMik7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIGF0dC5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGVCYXNlVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhdHQuaXNKYXZhUmVzb3VyY2VBdHRyaWJ1dGVDb2xsZWN0aW9uVHlwZSgpKTsKLQkJCi0JCS8vIFN0cmluZ1tdW10gc3RyaW5nRG91YmxlQXJyYXkKLQkJYXR0ID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nW11bXSIsIGF0dC5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGVCYXNlVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgYXR0LmlzSmF2YVJlc291cmNlQXR0cmlidXRlQ29sbGVjdGlvblR5cGUoKSk7Ci0JCQotCQkvLyBUIGdlbmVyaWMKLQkJYXR0ID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCA0KTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTnVtYmVyIiwgYXR0LmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZUJhc2VUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHQuaXNKYXZhUmVzb3VyY2VBdHRyaWJ1dGVDb2xsZWN0aW9uVHlwZSgpKTsKLQkJCi0JCS8vIExpc3Q8VD4gZ2VuZXJpY0xpc3QKLQkJYXR0ID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCA1KTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTnVtYmVyIiwgYXR0LmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZUJhc2VUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dC5pc0phdmFSZXNvdXJjZUF0dHJpYnV0ZUNvbGxlY3Rpb25UeXBlKCkpOwotCQkKLQkJLy8gVFtdIGdlbmVyaWNBcnJheQotCQlhdHQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDYpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdW1iZXIiLCBhdHQuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlQmFzZVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYXR0LmlzSmF2YVJlc291cmNlQXR0cmlidXRlQ29sbGVjdGlvblR5cGUoKSk7Ci0JCQotCQkvLyBMaXN0PD8+IHdpbGRjYXJkTGlzdAotCQlhdHQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDcpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBhdHQuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlQmFzZVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYXR0LmlzSmF2YVJlc291cmNlQXR0cmlidXRlQ29sbGVjdGlvblR5cGUoKSk7Ci0JCQotCQkvLyBieXRlW10gYnl0ZUFycmF5Ci0JCWF0dCA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgOCk7Ci0JCWFzc2VydEVxdWFscygiYnl0ZVtdIiwgYXR0LmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZUJhc2VUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHQuaXNKYXZhUmVzb3VyY2VBdHRyaWJ1dGVDb2xsZWN0aW9uVHlwZSgpKTsKLQkJCi0JCS8vIExpc3QgbGlzdAotCQlhdHQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBhdHQuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlQmFzZVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYXR0LmlzSmF2YVJlc291cmNlQXR0cmlidXRlQ29sbGVjdGlvblR5cGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVJlZ2lzdHJ5VGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFSZWdpc3RyeVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMWJhMDkuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVJlZ2lzdHJ5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvZHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUV4dGVuZGVkTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiRWxlbWVudEZhY3RvcnlNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5KYXhiQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFSZWdpc3RyeVRlc3RzIGV4dGVuZHMgSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCi0JcHVibGljIEdlbmVyaWNKYXZhUmVnaXN0cnlUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ2xhc3NXaXRoWG1sUmVnaXN0cnlBbmRDcmVhdGVNZXRob2RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKFBBQ0tBR0VfTkFNRSwgIk9iamVjdEZhY3RvcnkuamF2YSIsICJPYmplY3RGYWN0b3J5IiwgbmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1JFR0lTVFJZLCBKQVhCLlhNTF9FTEVNRU5UX0RFQ0wsICJqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudCIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxSZWdpc3RyeSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldE5hbWVNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEVsZW1lbnREZWNsKG5hbWU9XCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEpBWEJFbGVtZW50PEFubm90YXRpb25UZXN0VHlwZT4gY3JlYXRlRm9vKEFubm90YXRpb25UZXN0VHlwZSB2YWx1ZSkge3JldHVybiBudWxsfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAWG1sRWxlbWVudERlY2wobmFtZT1cImJhclwiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgSkFYQkVsZW1lbnQgY3JlYXRlQmFyKE9iamVjdCB2YWx1ZSkge3JldHVybiBudWxsfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEVsZW1lbnRGYWN0b3J5TWV0aG9kKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCUFTVCBhc3QgPSB0eXBlRGVjbGFyYXRpb24uZ2V0QVNUKCk7Ci0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gdGhpcy5uZXdNZXRob2REZWNsYXJhdGlvbihhc3QsIG1ldGhvZE5hbWUpOwotCQlCbG9jayBib2R5ID0gYXN0Lm5ld0Jsb2NrKCk7Ci0JCW1ldGhvZERlY2xhcmF0aW9uLnNldEJvZHkoYm9keSk7Ci0JCW1ldGhvZERlY2xhcmF0aW9uLnNldFJldHVyblR5cGUyKGFzdC5uZXdTaW1wbGVUeXBlKGFzdC5uZXdOYW1lKCJKQVhCRWxlbWVudCIpKSk7Ci0JCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyID0gYXN0Lm5ld1NpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24oKTsKLQkJcGFyYW1ldGVyLnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUoInZhbHVlIikpOwotCQlwYXJhbWV0ZXIuc2V0VHlwZShhc3QubmV3U2ltcGxlVHlwZShhc3QubmV3TmFtZSgiT2JqZWN0IikpKTsKLQkJcGFyYW1ldGVycyhtZXRob2REZWNsYXJhdGlvbikuYWRkKHBhcmFtZXRlcik7Ci0JCU5vcm1hbEFubm90YXRpb24gZWxlbWVudERlY2xBbm5vdGF0aW9uID0gdGhpcy5uZXdOb3JtYWxBbm5vdGF0aW9uKGFzdCwgIlhtbEVsZW1lbnREZWNsIik7Ci0JCW1vZGlmaWVycyhtZXRob2REZWNsYXJhdGlvbikuYWRkKGVsZW1lbnREZWNsQW5ub3RhdGlvbik7Ci0JCXRoaXMuYm9keURlY2xhcmF0aW9ucyh0eXBlRGVjbGFyYXRpb24pLmFkZChtZXRob2REZWNsYXJhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZERlY2xhcmF0aW9uIG5ld01ldGhvZERlY2xhcmF0aW9uKEFTVCBhc3QsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gYXN0Lm5ld01ldGhvZERlY2xhcmF0aW9uKCk7Ci0JCW1ldGhvZERlY2xhcmF0aW9uLnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUobWV0aG9kTmFtZSkpOwotCQlyZXR1cm4gbWV0aG9kRGVjbGFyYXRpb247Ci0JfQotCi0JLyoqCi0JICogbWluaW1pemUgdGhlIHNjb3BlIG9mIHRoZSBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3Q8Qm9keURlY2xhcmF0aW9uPiBib2R5RGVjbGFyYXRpb25zKFR5cGVEZWNsYXJhdGlvbiB0ZCkgewotCQlyZXR1cm4gdGQuYm9keURlY2xhcmF0aW9ucygpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMoTWV0aG9kRGVjbGFyYXRpb24gbWQpIHsKLQkJcmV0dXJuIG1kLnBhcmFtZXRlcnMoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gbW9kaWZpZXJzKE1ldGhvZERlY2xhcmF0aW9uIG1kKSB7Ci0JCXJldHVybiBtZC5tb2RpZmllcnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNZXRob2REZWNsYXJhdGlvbihUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1kIDogdHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKSkgewotCQkJaWYgKG1kLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMobWV0aG9kTmFtZSkpIHsKLQkJCQl0aGlzLmJvZHlEZWNsYXJhdGlvbnModHlwZURlY2xhcmF0aW9uKS5yZW1vdmUobWQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUVsZW1lbnRGYWN0b3J5TWV0aG9kcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFJlZ2lzdHJ5QW5kQ3JlYXRlTWV0aG9kcygpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZSgidGVzdC5PYmplY3RGYWN0b3J5Iik7Ci0JCVhtbFJlZ2lzdHJ5IGNvbnRleHRSZWdpc3RyeSA9IGpheGJDbGFzcy5nZXRYbWxSZWdpc3RyeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgY29udGV4dFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kc1NpemUoKSk7Ci0JCUl0ZXJhdG9yPEpheGJFbGVtZW50RmFjdG9yeU1ldGhvZD4gZWxlbWVudEZhY3RvcnlNZXRob2RzID0gY29udGV4dFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCUpheGJFbGVtZW50RmFjdG9yeU1ldGhvZCBlbGVtZW50RmFjdG9yeU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY3JlYXRlRm9vIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWVsZW1lbnRGYWN0b3J5TWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2RzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjcmVhdGVCYXIiLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudEZhY3RvcnlNZXRob2RzLmhhc05leHQoKSk7Ci0KLQkJCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVR5cGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVJlZ2lzdHJ5VGVzdHMudGhpcy5hZGRFbGVtZW50RmFjdG9yeU1ldGhvZCgoVHlwZURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCAiY3JlYXRlRm9vMiIpOwotCQkJCUdlbmVyaWNKYXZhUmVnaXN0cnlUZXN0cy50aGlzLmFkZEVsZW1lbnRGYWN0b3J5TWV0aG9kKChUeXBlRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksICJjcmVhdGVCYXIyIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoNCwgY29udGV4dFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kc1NpemUoKSk7Ci0JCWVsZW1lbnRGYWN0b3J5TWV0aG9kcyA9IGNvbnRleHRSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHMoKS5pdGVyYXRvcigpOwotCQllbGVtZW50RmFjdG9yeU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY3JlYXRlRm9vIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWVsZW1lbnRGYWN0b3J5TWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2RzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjcmVhdGVCYXIiLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJZWxlbWVudEZhY3RvcnlNZXRob2QgPSBlbGVtZW50RmFjdG9yeU1ldGhvZHMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNyZWF0ZUZvbzIiLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQllbGVtZW50RmFjdG9yeU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY3JlYXRlQmFyMiIsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRGYWN0b3J5TWV0aG9kcy5oYXNOZXh0KCkpOwotCi0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFSZWdpc3RyeVRlc3RzLnRoaXMucmVtb3ZlTWV0aG9kRGVjbGFyYXRpb24oKFR5cGVEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgImNyZWF0ZUZvbyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGNvbnRleHRSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHNTaXplKCkpOwotCQllbGVtZW50RmFjdG9yeU1ldGhvZHMgPSBjb250ZXh0UmVnaXN0cnkuZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzKCkuaXRlcmF0b3IoKTsKLQkJZWxlbWVudEZhY3RvcnlNZXRob2QgPSBlbGVtZW50RmFjdG9yeU1ldGhvZHMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNyZWF0ZUJhciIsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQllbGVtZW50RmFjdG9yeU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY3JlYXRlRm9vMiIsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWVsZW1lbnRGYWN0b3J5TWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2RzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjcmVhdGVCYXIyIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudEZhY3RvcnlNZXRob2RzLmhhc05leHQoKSk7Ci0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFSZWdpc3RyeVRlc3RzLnRoaXMucmVtb3ZlTWV0aG9kRGVjbGFyYXRpb24oKFR5cGVEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgImNyZWF0ZUZvbzIiKTsKLQkJCQlHZW5lcmljSmF2YVJlZ2lzdHJ5VGVzdHMudGhpcy5yZW1vdmVNZXRob2REZWNsYXJhdGlvbigoVHlwZURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCAiY3JlYXRlQmFyMiIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNvbnRleHRSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHNTaXplKCkpOwotCQllbGVtZW50RmFjdG9yeU1ldGhvZHMgPSBjb250ZXh0UmVnaXN0cnkuZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzKCkuaXRlcmF0b3IoKTsKLQkJZWxlbWVudEZhY3RvcnlNZXRob2QgPSBlbGVtZW50RmFjdG9yeU1ldGhvZHMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNyZWF0ZUJhciIsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50RmFjdG9yeU1ldGhvZHMuaGFzTmV4dCgpKTsKLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVJlZ2lzdHJ5VGVzdHMudGhpcy5yZW1vdmVNZXRob2REZWNsYXJhdGlvbigoVHlwZURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCAiY3JlYXRlQmFyIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoMCwgY29udGV4dFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVR5cGVYbWxKYXZhVHlwZUFkYXB0ZXJUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVR5cGVYbWxKYXZhVHlwZUFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGY1ZjdkLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUeXBlWG1sSmF2YVR5cGVBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhVHlwZVhtbEphdmFUeXBlQWRhcHRlclRlc3RzIGV4dGVuZHMgSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFUeXBlWG1sSmF2YVR5cGVBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVR5cGVXaXRoWG1sSmF2YVR5cGVBZGFwdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEphdmFUeXBlQWRhcHRlciIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCVhtbEphdmFUeXBlQWRhcHRlciBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyID0gamF4YkNsYXNzLmdldFhtbEphdmFUeXBlQWRhcHRlcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0KLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCWNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuc2V0VmFsdWUoImZvbyIpOwotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFUeXBlQWRhcHRlckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQotCQkgLy92ZXJpZnkgdGhlIHhtbCBzY2hlbWEgdHlwZSBhbm5vdGF0aW9uIGlzIG5vdCByZW1vdmVkIHdoZW4gdGhlIHZhbHVlIGlzIHNldCB0byBudWxsCi0JCWNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnROdWxsKGphdmFUeXBlQWRhcHRlckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCVhtbEphdmFUeXBlQWRhcHRlciBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyID0gamF4YkNsYXNzLmdldFhtbEphdmFUeXBlQWRhcHRlcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJLy9hZGQgYSB2YWx1ZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VUeXBlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFUeXBlWG1sSmF2YVR5cGVBZGFwdGVyVGVzdHMudGhpcy5hZGRYbWxKYXZhVHlwZUFkYXB0ZXJUeXBlTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUl9fVkFMVUUsICJTdHJpbmciKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVR5cGVYbWxKYXZhVHlwZUFkYXB0ZXJUZXN0cy50aGlzLnJlbW92ZVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbChqYXhiQ2xhc3MuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEphdmFUeXBlQWRhcHRlcigpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJWG1sSmF2YVR5cGVBZGFwdGVyIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIgPSBqYXhiQ2xhc3MuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0KLQkJY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5zZXRTcGVjaWZpZWRUeXBlKCJmb28iKTsKLQkJWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiBqYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXREZWZhdWx0VHlwZSgpKTsKLQotCQljb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLnNldFNwZWNpZmllZFR5cGUobnVsbCk7Ci0JCWphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnROdWxsKGphdmFUeXBlQWRhcHRlckFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldERlZmF1bHRUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlYbWxKYXZhVHlwZUFkYXB0ZXIgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlciA9IGpheGJDbGFzcy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCi0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXREZWZhdWx0VHlwZSgpKTsKLQotCQkvL2FkZCBhIHR5cGUgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlVHlwZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhVHlwZVhtbEphdmFUeXBlQWRhcHRlclRlc3RzLnRoaXMuYWRkWG1sSmF2YVR5cGVBZGFwdGVyVHlwZU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJfX1RZUEUsICJTdHJpbmciKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFUeXBlWG1sSmF2YVR5cGVBZGFwdGVyVGVzdHMudGhpcy5yZW1vdmVYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoamF4YkNsYXNzLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxKYXZhVHlwZUFkYXB0ZXJUeXBlTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkoTWFya2VyQW5ub3RhdGlvbikgdGhpcy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgCi0JCQluYW1lLCAKLQkJCXRoaXMubmV3VHlwZUxpdGVyYWwoZGVjbGFyYXRpb24uZ2V0QXN0KCksIHR5cGVOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sSmF2YVR5cGVBZGFwdGVyTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoKE1hcmtlckFubm90YXRpb24pIHRoaXMuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvL2FkZCBhbm90aGVyIHBhY2thZ2UgYW5ub3RhdGlvbiBzbyB0aGF0IHRoZSBjb250ZXh0IG1vZGVsIG9iamVjdCBkb2Vzbid0IGdldCByZW1vdmVkIHdoZW4gCi0JLy9yZW1vdmluZyB0aGUgWG1sSmF2YVR5cGVBZGFwdGVyIGFubm90YXRpb24uIE9ubHkgImFubm90YXRlZCIgcGFja2FnZXMgYXJlIGFkZGVkIHRvIHRoZSBjb250ZXh0IG1vZGVsCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUik7Ci0JCXRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwkJCi0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxBZGFwdGVyVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3OWUxMC4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5KYXhiQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sQWRhcHRlclRlc3RzCi0JCWV4dGVuZHMgSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVhtbFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUoCi0JCQkJbmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RZUEUpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU9iak9ialhtbEFkYXB0ZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJpbXBvcnQgIiArIEpBWEIuWE1MX0FEQVBURVIgKyAiOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyBPYmpPYmpBZGFwdGVyIGV4dGVuZHMgWG1sQWRhcHRlcjxPYmplY3QsIE9iamVjdD4geyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIE9iamVjdCBtYXJzaGFsKE9iamVjdCBvYmopIHsgcmV0dXJuIG51bGw7IH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBPYmplY3QgdW5tYXJzaGFsKE9iamVjdCBvYmopIHsgcmV0dXJuIG51bGw7IH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIk9iak9iakFkYXB0ZXIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVNYXBDYWxlbmRhclhtbEFkYXB0ZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJpbXBvcnQgIiArIEpBWEIuWE1MX0FEQVBURVIgKyAiOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJpbXBvcnQgamF2YS51dGlsLk1hcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTWFwQ2FsZW5kYXJBZGFwdGVyIGV4dGVuZHMgWG1sQWRhcHRlcjxHcmVnb3JpYW5DYWxlbmRhciwgTWFwPFN0cmluZywgU3RyaW5nPj4geyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIEdyZWdvcmlhbkNhbGVuZGFyIG1hcnNoYWwoTWFwPFN0cmluZywgU3RyaW5nPiBvYmopIHsgcmV0dXJuIG51bGw7IH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBHcmVnb3JpYW5DYWxlbmRhciBtYXJzaGFsKE9iamVjdCBvYmopIHsgcmV0dXJuIG51bGw7IH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHVubWFyc2hhbChHcmVnb3JpYW4gQ2FsZW5kYXIgb2JqKSB7IHJldHVybiBudWxsOyB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJNYXBDYWxlbmRhckFkYXB0ZXIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RCb3VuZEFuZFZhbHVlVHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlWG1sVHlwZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudE1hcHBpbmcgYXR0cmlidXRlTWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlYbWxKYXZhVHlwZUFkYXB0ZXIgeG1sSmF2YVR5cGVBZGFwdGVyID0gYXR0cmlidXRlTWFwcGluZy5hZGRYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJeG1sSmF2YVR5cGVBZGFwdGVyLnNldFZhbHVlKCJ0ZXN0Lk9iak9iakFkYXB0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygidGVzdC5PYmpPYmpBZGFwdGVyIiwgeG1sSmF2YVR5cGVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QuT2JqT2JqQWRhcHRlciIsIHhtbEphdmFUeXBlQWRhcHRlci5nZXRGdWxseVF1YWxpZmllZFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHhtbEphdmFUeXBlQWRhcHRlci5nZXRYbWxBZGFwdGVyKCkpOwotCQkKLQkJY3JlYXRlT2JqT2JqWG1sQWRhcHRlcigpOwotCQlYbWxBZGFwdGVyIHhtbEFkYXB0ZXIgPSB4bWxKYXZhVHlwZUFkYXB0ZXIuZ2V0WG1sQWRhcHRlcigpOwotCQlhc3NlcnROb3ROdWxsKHhtbEFkYXB0ZXIpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCB4bWxBZGFwdGVyLmdldEJvdW5kVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgeG1sQWRhcHRlci5nZXRWYWx1ZVR5cGUoKSk7Ci0JCQotCQljcmVhdGVNYXBDYWxlbmRhclhtbEFkYXB0ZXIoKTsKLQkJeG1sSmF2YVR5cGVBZGFwdGVyLnNldFZhbHVlKCJ0ZXN0Lk1hcENhbGVuZGFyQWRhcHRlciIpOwotCQl4bWxBZGFwdGVyID0geG1sSmF2YVR5cGVBZGFwdGVyLmdldFhtbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxBZGFwdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTWFwIiwgeG1sQWRhcHRlci5nZXRCb3VuZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyIiwgeG1sQWRhcHRlci5nZXRWYWx1ZVR5cGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmY3MDhkLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQW55QXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdUZXN0cyBleHRlbmRzIEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aFhtbEFueUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSwgSkFYQi5YTUxfQU5ZX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sQW55QXR0cmlidXRlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VNYXBwaW5nVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEFueUF0dHJpYnV0ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQW55QXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEFueUF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZU1hcHBpbmcpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQU5ZX0FUVFJJQlVURSkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5YTUxfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sQXR0cmlidXRlTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FOWV9BVFRSSUJVVEUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVFJJQlVURSkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5YTUxfQU5ZX0FUVFJJQlVURV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEFueUF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZU1hcHBpbmcpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQU5ZX0FUVFJJQlVURSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUUklCVVRFKSk7Ci0KLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuWE1MX0VMRU1FTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJWG1sRWxlbWVudE1hcHBpbmcgeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRNYXBwaW5nKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FOWV9BVFRSSUJVVEUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuWE1MX0FOWV9BVFRSSUJVVEVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXR0cmlidXRlTWFwcGluZyA9IChYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVNYXBwaW5nKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FOWV9BVFRSSUJVVEUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sSmF2YVR5cGVBZGFwdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQW55QXR0cmlidXRlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQW55QXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCWFzc2VydE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpKTsKLQkJCi0JCWF0dHJpYnV0ZU1hcHBpbmcuYWRkWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpKTsKLQotCQlhdHRyaWJ1dGVNYXBwaW5nLnJlbW92ZVhtbEphdmFUeXBlQWRhcHRlcigpOwotCQkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZShKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxKYXZhVHlwZUFkYXB0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBbnlBdHRyaWJ1dGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEFueUF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZyA9IChYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gYXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSk7Ci0JCQotCQkvL2FkZCBhbiBYbWxKYXZhVHlwZUFkYXB0ZXIgYW5ub3RhdGlvbgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUikpOwotCi0JCS8vcmVtb3ZlIHRoZSBYbWxKYXZhVHlwZUFkYXB0ZXIgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZjA4ZGQuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQW55RWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBbnlFbGVtZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFJlZkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTWl4ZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5KYXhiQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzIGV4dGVuZHMgSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aFhtbEFueUVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RZUEUsIEpBWEIuWE1MX0FOWV9FTEVNRU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxBbnlFbGVtZW50Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VNYXBwaW5nVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEFueUVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEFueUVsZW1lbnRNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQW55RWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZU1hcHBpbmcpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQU5ZX0VMRU1FTlQpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuWE1MX0FUVFJJQlVURV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbEF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoeG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BTllfRUxFTUVOVCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUUklCVVRFKSk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlhNTF9BTllfRUxFTUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEFueUVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVNYXBwaW5nKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FOWV9FTEVNRU5UKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRSSUJVVEUpKTsKLQotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5YTUxfRUxFTUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlYbWxFbGVtZW50TWFwcGluZyB4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudE1hcHBpbmcpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQU5ZX0VMRU1FTlQpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuWE1MX0FOWV9FTEVNRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQW55RWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZU1hcHBpbmcpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQU5ZX0VMRU1FTlQpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sSmF2YVR5cGVBZGFwdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQW55RWxlbWVudCgpOwotCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEFueUVsZW1lbnRNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQW55RWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSk7Ci0JCQotCQlhdHRyaWJ1dGVNYXBwaW5nLmFkZFhtbEphdmFUeXBlQWRhcHRlcigpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSk7Ci0KLQkJYXR0cmlidXRlTWFwcGluZy5yZW1vdmVYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sSmF2YVR5cGVBZGFwdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQW55RWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQW55RWxlbWVudE1hcHBpbmcgYXR0cmlidXRlTWFwcGluZyA9IChYbWxBbnlFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCWFzc2VydE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpKTsKLQotCQkvL2FkZCBhbiBYbWxKYXZhVHlwZUFkYXB0ZXIgYW5ub3RhdGlvbgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpKTsKLQkJCi0JCS8vcmVtb3ZlIHRoZSBYbWxKYXZhVHlwZUFkYXB0ZXIgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZShKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlMYXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBbnlFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxBbnlFbGVtZW50TWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEFueUVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gYXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFNwZWNpZmllZExheCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdExheCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVNYXBwaW5nLmlzTGF4KCkpOwotCi0JCWF0dHJpYnV0ZU1hcHBpbmcuc2V0U3BlY2lmaWVkTGF4KEJvb2xlYW4uVFJVRSk7Ci0JCVhtbEFueUVsZW1lbnRBbm5vdGF0aW9uIHhtbEFueUVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbEFueUVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FOWV9FTEVNRU5UKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sQW55RWxlbWVudEFubm90YXRpb24uZ2V0TGF4KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBhdHRyaWJ1dGVNYXBwaW5nLmdldFNwZWNpZmllZExheCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdExheCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dHJpYnV0ZU1hcHBpbmcuaXNMYXgoKSk7Ci0KLQkJYXR0cmlidXRlTWFwcGluZy5zZXRTcGVjaWZpZWRMYXgobnVsbCk7Ci0JCXhtbEFueUVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbEFueUVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FOWV9FTEVNRU5UKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFNwZWNpZmllZExheCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdExheCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVNYXBwaW5nLmlzTGF4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVMYXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBbnlFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxBbnlFbGVtZW50TWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEFueUVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gYXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFNwZWNpZmllZExheCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdExheCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVNYXBwaW5nLmlzTGF4KCkpOwotCi0KLQkJLy9hZGQgYSBuaWxsYWJsZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRYbWxBbnlFbGVtZW50TWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9BTllfRUxFTUVOVF9fTEFYLCB0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGF0dHJpYnV0ZU1hcHBpbmcuZ2V0U3BlY2lmaWVkTGF4KCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0TGF4KCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYXR0cmlidXRlTWFwcGluZy5pc0xheCgpKTsKLQotCQkvL3JlbW92ZSB0aGUgbGF4IG1lbWJlciB2YWx1ZSBwYWlyCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuZ2V0WG1sQW55RWxlbWVudEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCUdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLnZhbHVlcyh4bWxFbGVtZW50QW5ub3RhdGlvbikucmVtb3ZlKDApOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFNwZWNpZmllZExheCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdExheCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVNYXBwaW5nLmlzTGF4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEFueUVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEFueUVsZW1lbnRNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQW55RWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0KLQkJYXR0cmlidXRlTWFwcGluZy5zZXRTcGVjaWZpZWRWYWx1ZSgiRm9vIik7Ci0JCVhtbEFueUVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbEFueUVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FOWV9FTEVNRU5UKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBhdHRyaWJ1dGVNYXBwaW5nLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGF0dHJpYnV0ZU1hcHBpbmcuZ2V0VmFsdWUoKSk7Ci0KLQkJYXR0cmlidXRlTWFwcGluZy5zZXRTcGVjaWZpZWRWYWx1ZShudWxsKTsKLQkJeG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sQW55RWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQU5ZX0VMRU1FTlQpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQW55RWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQW55RWxlbWVudE1hcHBpbmcgYXR0cmlidXRlTWFwcGluZyA9IChYbWxBbnlFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCWFzc2VydE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQotCi0JCS8vYWRkIGEgVmFsdWUgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sQW55RWxlbWVudFR5cGVNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FOWV9FTEVNRU5UX19WQUxVRSwgIkZvbyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBhdHRyaWJ1dGVNYXBwaW5nLmdldFZhbHVlKCkpOwotCi0JCS8vcmVtb3ZlIHRoZSBWYWx1ZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOb3JtYWxBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmdldFhtbEFueUVsZW1lbnRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCQlHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy52YWx1ZXMoeG1sRWxlbWVudEFubm90YXRpb24pLnJlbW92ZSgwKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRYbWxBbnlFbGVtZW50QW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoSkFYQi5YTUxfQU5ZX0VMRU1FTlQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxBbnlFbGVtZW50TWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKChNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbEFueUVsZW1lbnRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgbmFtZSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEFueUVsZW1lbnRUeXBlTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkoTWFya2VyQW5ub3RhdGlvbikgdGhpcy5nZXRYbWxBbnlFbGVtZW50QW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIAotCQkJbmFtZSwgCi0JCQl0aGlzLm5ld1R5cGVMaXRlcmFsKGRlY2xhcmF0aW9uLmdldEFzdCgpLCB0eXBlTmFtZSkpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxFbGVtZW50UmVmcyAqKioqKgotCQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jWG1sRWxlbWVudFJlZnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBbnlFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxBbnlFbGVtZW50TWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEFueUVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gYXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlJdGVyYWJsZTxYbWxFbGVtZW50UmVmPiB4bWxFbGVtZW50UmVmcyA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmcygpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHhtbEVsZW1lbnRSZWZzKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnNTaXplKCkpOwotCQkKLQkJLy9hZGQgWG1sRWxlbWVudFJlZiBhbm5vdGF0aW9uCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IGFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKAotCQkJCQkJCQlHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0VMRU1FTlRfUkVGKSwKLQkJCQkJCQkJSkFYQi5YTUxfRUxFTUVOVF9SRUZfX05BTUUsICJmb28iKTsKLQkJCQkJfQotCQkJCX0pOwotCQl4bWxFbGVtZW50UmVmcyA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmcygpOwotCQkKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxFbGVtZW50UmVmcywgMCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy8gYWRkIFhtbEVsZW1lbnRSZWZzIGFubm90YXRpb24gd2l0aCBuZXN0ZWQgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbigKLQkJCQkJCQkJZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfRUxFTUVOVF9SRUZTKTsKLQkJCQkJCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCQkJCQlHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldEFzdCgpLCBKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkJCQkJCWFubm90YXRpb24sIEpBWEIuWE1MX0VMRU1FTlRfUkVGX19OQU1FLCAiYmFyIik7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRBcnJheUVsZW1lbnQoCi0JCQkJCQkJCWRlY2xhcmF0aW9uLCBKQVhCLlhNTF9FTEVNRU5UX1JFRlMsIDAsIEpBWEIuWE1MX0VMRU1FTlRfUkVGU19fVkFMVUUsIGFubm90YXRpb24pOwkJCi0JCQkJCX0KLQkJCQl9KTsKLQkJeG1sRWxlbWVudFJlZnMgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnMoKTsKLQkJCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmcygpKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sRWxlbWVudFJlZnMsIDApLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy8gYWRkIHNlY29uZCBuZXN0ZWQgWG1sRWxlbWVudFJlZiBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkJCQkJR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXRBc3QoKSwgSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQkJCQkJR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKAotCQkJCQkJCQlhbm5vdGF0aW9uLCBKQVhCLlhNTF9FTEVNRU5UX1JFRl9fTkFNRSwgImJheiIpOwotCQkJCQkJR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuYWRkQXJyYXlFbGVtZW50KAotCQkJCQkJCQlkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9SRUZTLCAxLCBKQVhCLlhNTF9FTEVNRU5UX1JFRlNfX1ZBTFVFLCBhbm5vdGF0aW9uKTsJCQotCQkJCQl9Ci0JCQkJfSk7Ci0JCXhtbEVsZW1lbnRSZWZzID0gYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEVsZW1lbnRSZWZzLCAwKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxFbGVtZW50UmVmcywgMSkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy8gc3dpdGNoIG5lc3RlZCBYbWxFbGVtZW50UmVmIGFubm90YXRpb25zCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5tb3ZlQXJyYXlFbGVtZW50KAotCQkJCQkJCQkoTm9ybWFsQW5ub3RhdGlvbikgZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKEpBWEIuWE1MX0VMRU1FTlRfUkVGUyksIAotCQkJCQkJCQlKQVhCLlhNTF9FTEVNRU5UX1JFRlNfX1ZBTFVFLCAwLCAxKTsKLQkJCQkJfQotCQkJCX0pOwotCQl4bWxFbGVtZW50UmVmcyA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmcygpOwotCQkKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxFbGVtZW50UmVmcywgMCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sRWxlbWVudFJlZnMsIDEpLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBYbWxFbGVtZW50UmVmcyBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBcnJheUVsZW1lbnQoCi0JCQkJCQkJCShOb3JtYWxBbm5vdGF0aW9uKSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoSkFYQi5YTUxfRUxFTUVOVF9SRUZTKSwgCi0JCQkJCQkJCUpBWEIuWE1MX0VMRU1FTlRfUkVGU19fVkFMVUUsIDEpOwotCQkJCQkJR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQXJyYXlFbGVtZW50KAotCQkJCQkJCQkoTm9ybWFsQW5ub3RhdGlvbikgZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKEpBWEIuWE1MX0VMRU1FTlRfUkVGUyksIAotCQkJCQkJCQlKQVhCLlhNTF9FTEVNRU5UX1JFRlNfX1ZBTFVFLCAwKTsKLQkJCQkJCUdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oCi0JCQkJCQkJCWRlY2xhcmF0aW9uLCBKQVhCLlhNTF9FTEVNRU5UX1JFRlMpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCXhtbEVsZW1lbnRSZWZzID0gYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEVsZW1lbnRSZWZzLCAwKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvLyByZW1vdmUgWG1sRWxlbWVudFJlZiBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKAotCQkJCQkJCQlkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCXhtbEVsZW1lbnRSZWZzID0gYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzKCk7Ci0JCQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmcygpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxFbGVtZW50UmVmcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEFueUVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEFueUVsZW1lbnRNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQW55RWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbjsKLQkJWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb247Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUZTKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRikpOwotCQlhc3NlcnRFcXVhbHMoMCwgYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5hZGRYbWxFbGVtZW50UmVmKDApLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCXhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50UmVmc0Fubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUZTKTsKLQkJeG1sRWxlbWVudFJlZkFubm90YXRpb24gPSAoWG1sRWxlbWVudFJlZkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmc0Fubm90YXRpb24pOwotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQkKLQkJYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmFkZFhtbEVsZW1lbnRSZWYoMSkuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJiYXIiKTsKLQkJeG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRlMpOwotCQl4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZkFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5nZXRYbWxFbGVtZW50UmVmcygpLCAwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uLmdldFhtbEVsZW1lbnRSZWZzKCksIDEpLmdldE5hbWUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkubW92ZVhtbEVsZW1lbnRSZWYoMCwgMSk7Ci0JCXhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50UmVmc0Fubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUZTKTsKLQkJeG1sRWxlbWVudFJlZkFubm90YXRpb24gPSAoWG1sRWxlbWVudFJlZkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50UmVmc0Fubm90YXRpb24pOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxFbGVtZW50UmVmc0Fubm90YXRpb24uZ2V0WG1sRWxlbWVudFJlZnMoKSwgMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5nZXRYbWxFbGVtZW50UmVmcygpLCAxKS5nZXROYW1lKCkpOwotCQkKLQkJYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLnJlbW92ZVhtbEVsZW1lbnRSZWYoMCk7Ci0JCXhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50UmVmc0Fubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUZTKTsKLQkJeG1sRWxlbWVudFJlZkFubm90YXRpb24gPSAoWG1sRWxlbWVudFJlZkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmc0Fubm90YXRpb24pOwotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5yZW1vdmVYbWxFbGVtZW50UmVmKDApOwotCQl4bWxFbGVtZW50UmVmc0Fubm90YXRpb24gPSAoWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGUyk7Ci0JCXhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRlMpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxNaXhlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEFueUVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEFueUVsZW1lbnRNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQW55RWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlYbWxNaXhlZEFubm90YXRpb24geG1sTGlzdEFubm90YXRpb24gPSAoWG1sTWl4ZWRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX01JWEVEKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbE1peGVkKCkpOwotCQlhc3NlcnROdWxsKHhtbExpc3RBbm5vdGF0aW9uKTsKLQotCQlhdHRyaWJ1dGVNYXBwaW5nLmFkZFhtbE1peGVkKCk7Ci0JCXhtbExpc3RBbm5vdGF0aW9uID0gKFhtbE1peGVkQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9NSVhFRCk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxNaXhlZCgpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxMaXN0QW5ub3RhdGlvbik7Ci0KLQkJYXR0cmlidXRlTWFwcGluZy5yZW1vdmVYbWxNaXhlZCgpOwotCQl4bWxMaXN0QW5ub3RhdGlvbiA9IChYbWxNaXhlZEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTUlYRUQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxNaXhlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEFueUVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEFueUVsZW1lbnRNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQW55RWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlYbWxNaXhlZEFubm90YXRpb24geG1sTGlzdEFubm90YXRpb24gPSAoWG1sTWl4ZWRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX01JWEVEKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbE1peGVkKCkpOwotCQlhc3NlcnROdWxsKHhtbExpc3RBbm5vdGF0aW9uKTsKLQotCi0JCS8vYWRkIGFuIFhtbE1peGVkIGFubm90YXRpb24KLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9NSVhFRCk7Ci0JCQl9Ci0JCX0pOwotCQl4bWxMaXN0QW5ub3RhdGlvbiA9IChYbWxNaXhlZEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTUlYRUQpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sTWl4ZWQoKSk7Ci0JCWFzc2VydE5vdE51bGwoeG1sTGlzdEFubm90YXRpb24pOwotCi0JCS8vcmVtb3ZlIHRoZSBYbWxNaXhlZCBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX01JWEVEKTsKLQkJCX0KLQkJfSk7Ci0JCXhtbExpc3RBbm5vdGF0aW9uID0gKFhtbE1peGVkQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9NSVhFRCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxNaXhlZCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxMaXN0QW5ub3RhdGlvbik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzhhYTVkLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBdHRyaWJ1dGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxJREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbElEUkVGQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzIGV4dGVuZHMgSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVR5cGVXaXRoWG1sQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFLCBKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEF0dHJpYnV0ZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVR5cGVXaXRoQ29sbGVjdGlvblhtbEF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiaW1wb3J0IGphdmEudXRpbC5MaXN0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoImltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZChUWVBFX05BTUUpLmFwcGVuZCgiIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBYbWxBdHRyaWJ1dGUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gbGlzdDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIFRZUEVfTkFNRSArICIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQXR0cmlidXRlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbEF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFFOYW1lKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQotCQl4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCVhtbEF0dHJpYnV0ZUFubm90YXRpb24geG1sQXR0cmlidXRlQW5ub3RhdGlvbiA9IChYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sQXR0cmlidXRlQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgeG1sQXR0cmlidXRlTWFwcGluZy5nZXRRTmFtZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCi0JCXhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQl4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uID0gKFhtbEF0dHJpYnV0ZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBdHRyaWJ1dGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sQXR0cmlidXRlTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCi0JCS8vYWRkIGEgTmFtZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLmFkZFhtbEF0dHJpYnV0ZU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfQVRUUklCVVRFX19OQU1FLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCi0JCS8vcmVtb3ZlIHRoZSBOYW1lIG1lbWJlciB2YWx1ZSBwYWlyCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24geG1sQXR0cmlidXRlQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLmdldFhtbEF0dHJpYnV0ZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCUdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMudmFsdWVzKHhtbEF0dHJpYnV0ZUFubm90YXRpb24pLnJlbW92ZSgwKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEF0dHJpYnV0ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyB4bWxBdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0KLQkJeG1sQXR0cmlidXRlTWFwcGluZy5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWVzcGFjZSgiZm9vIik7Ci0JCVhtbEF0dHJpYnV0ZUFubm90YXRpb24geG1sQXR0cmlidXRlQW5ub3RhdGlvbiA9IChYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sQXR0cmlidXRlQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sQXR0cmlidXRlTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQotCQl4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZXNwYWNlKG51bGwpOwotCQl4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uID0gKFhtbEF0dHJpYnV0ZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBdHRyaWJ1dGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sQXR0cmlidXRlTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCi0KLQkJLy9hZGQgYSBuYW1lc3BhY2UgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMudGhpcy5hZGRYbWxBdHRyaWJ1dGVNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FUVFJJQlVURV9fTkFNRVNQQUNFLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQkvL3JlbW92ZSB0aGUgbmFtZXNwYWNlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24geG1sQXR0cmlidXRlQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLmdldFhtbEF0dHJpYnV0ZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCUdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMudmFsdWVzKHhtbEF0dHJpYnV0ZUFubm90YXRpb24pLnJlbW92ZSgwKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UmVxdWlyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBdHRyaWJ1dGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sQXR0cmlidXRlTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFNwZWNpZmllZFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0UmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sQXR0cmlidXRlTWFwcGluZy5pc1JlcXVpcmVkKCkpOwotCi0JCXhtbEF0dHJpYnV0ZU1hcHBpbmcuc2V0U3BlY2lmaWVkUmVxdWlyZWQoQm9vbGVhbi5UUlVFKTsKLQkJWG1sQXR0cmlidXRlQW5ub3RhdGlvbiB4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uID0gKFhtbEF0dHJpYnV0ZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sQXR0cmlidXRlQW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sQXR0cmlidXRlTWFwcGluZy5nZXRTcGVjaWZpZWRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgeG1sQXR0cmlidXRlTWFwcGluZy5pc1JlcXVpcmVkKCkpOwotCi0JCXhtbEF0dHJpYnV0ZU1hcHBpbmcuc2V0U3BlY2lmaWVkUmVxdWlyZWQobnVsbCk7Ci0JCXhtbEF0dHJpYnV0ZUFubm90YXRpb24gPSAoWG1sQXR0cmlidXRlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQlhc3NlcnROdWxsKHhtbEF0dHJpYnV0ZUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFNwZWNpZmllZFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0UmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sQXR0cmlidXRlTWFwcGluZy5pc1JlcXVpcmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZXF1aXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEF0dHJpYnV0ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyB4bWxBdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0U3BlY2lmaWVkUmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sQXR0cmlidXRlTWFwcGluZy5pc0RlZmF1bHRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzUmVxdWlyZWQoKSk7Ci0KLQotCQkvL2FkZCBhIHJlcXVpcmVkIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sQXR0cmlidXRlTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9BVFRSSUJVVEVfX1JFUVVJUkVELCB0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0U3BlY2lmaWVkUmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sQXR0cmlidXRlTWFwcGluZy5pc0RlZmF1bHRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNSZXF1aXJlZCgpKTsKLQotCQkvL3JlbW92ZSB0aGUgcmVxdWlyZWQgbWVtYmVyIHZhbHVlIHBhaXIKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTm9ybWFsQW5ub3RhdGlvbiB4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMuZ2V0WG1sQXR0cmlidXRlQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQkJR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMudGhpcy52YWx1ZXMoeG1sQXR0cmlidXRlQW5ub3RhdGlvbikucmVtb3ZlKDApOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFNwZWNpZmllZFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0UmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sQXR0cmlidXRlTWFwcGluZy5pc1JlcXVpcmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VNYXBwaW5nVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEF0dHJpYnV0ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyB4bWxBdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROb3ROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUUklCVVRFKSk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50TWFwcGluZyk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRSSUJVVEUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpKTsKLQotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5YTUxfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCXhtbEF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoeG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRSSUJVVEUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sSmF2YVR5cGVBZGFwdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQXR0cmlidXRlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCWFzc2VydE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpKTsKLQotCQlhdHRyaWJ1dGVNYXBwaW5nLmFkZFhtbEphdmFUeXBlQWRhcHRlcigpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSk7Ci0KLQkJYXR0cmlidXRlTWFwcGluZy5yZW1vdmVYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sSmF2YVR5cGVBZGFwdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQXR0cmlidXRlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbEF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpKTsKLQkJCi0JCS8vYWRkIGFuIFhtbEphdmFUeXBlQWRhcHRlciBhbm5vdGF0aW9uCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSk7Ci0KLQkJLy9yZW1vdmUgdGhlIFhtbEphdmFUeXBlQWRhcHRlciBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sU2NoZW1hVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEF0dHJpYnV0ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyB4bWxBdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRYbWxTY2hlbWFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX1NDSEVNQV9UWVBFKSk7Ci0JCQotCQl4bWxBdHRyaWJ1dGVNYXBwaW5nLmFkZFhtbFNjaGVtYVR5cGUoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRYbWxTY2hlbWFUeXBlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpKTsKLQkJCi0JCXhtbEF0dHJpYnV0ZU1hcHBpbmcucmVtb3ZlWG1sU2NoZW1hVHlwZSgpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFhtbFNjaGVtYVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoSkFYQi5YTUxfU0NIRU1BX1RZUEUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sU2NoZW1hVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEF0dHJpYnV0ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyB4bWxBdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRYbWxTY2hlbWFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX1NDSEVNQV9UWVBFKSk7Ci0JCQotCQkvL2FkZCBhbiBYbWxTY2hlbWFUeXBlIGFubm90YXRpb24KLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sU2NoZW1hVHlwZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX1NDSEVNQV9UWVBFKSk7Ci0JCQotCQkvL3JlbW92ZSB0aGUgWG1sU2NoZW1hVHlwZSBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRYbWxTY2hlbWFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX1NDSEVNQV9UWVBFKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sQXR0cmlidXRlTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoKE1hcmtlckFubm90YXRpb24pIHRoaXMuZ2V0WG1sQXR0cmlidXRlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxBdHRyaWJ1dGVNZW1iZXJWYWx1ZVBhaXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoKE1hcmtlckFubm90YXRpb24pIHRoaXMuZ2V0WG1sQXR0cmlidXRlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxBdHRyaWJ1dGVUeXBlTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkoTWFya2VyQW5ub3RhdGlvbikgdGhpcy5nZXRYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgCi0JCQluYW1lLCAKLQkJCXRoaXMubmV3VHlwZUxpdGVyYWwoZGVjbGFyYXRpb24uZ2V0QXN0KCksIHR5cGVOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0WG1sQXR0cmlidXRlQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoSkFYQi5YTUxfQVRUUklCVVRFKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sTGlzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBdHRyaWJ1dGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sQXR0cmlidXRlTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0RmFsc2UoeG1sQXR0cmlidXRlTWFwcGluZy5pc1htbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sQXR0cmlidXRlTWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JCQotCQl4bWxBdHRyaWJ1dGVNYXBwaW5nLnNldFNwZWNpZmllZFhtbExpc3QodHJ1ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydFRydWUoeG1sQXR0cmlidXRlTWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JCQotCQl4bWxBdHRyaWJ1dGVNYXBwaW5nLnNldFNwZWNpZmllZFhtbExpc3QoZmFsc2UpOwotCQkKLQkJYXNzZXJ0RmFsc2UoeG1sQXR0cmlidXRlTWFwcGluZy5pc1htbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sQXR0cmlidXRlTWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxMaXN0MigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aENvbGxlY3Rpb25YbWxBdHRyaWJ1dGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sQXR0cmlidXRlTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCQkKLQkJeG1sQXR0cmlidXRlTWFwcGluZy5zZXRTcGVjaWZpZWRYbWxMaXN0KHRydWUpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydFRydWUoeG1sQXR0cmlidXRlTWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JCQotCQl4bWxBdHRyaWJ1dGVNYXBwaW5nLnNldFNwZWNpZmllZFhtbExpc3QoZmFsc2UpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sTGlzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBdHRyaWJ1dGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sQXR0cmlidXRlTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sQXR0cmlidXRlTWFwcGluZy5pc0RlZmF1bHRYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzU3BlY2lmaWVkWG1sTGlzdCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpKTsKLQkJCi0JCS8vYWRkIGFuIFhtbExpc3QgYW5ub3RhdGlvbgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfTElTVCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sQXR0cmlidXRlTWFwcGluZy5pc0RlZmF1bHRYbWxMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCQkKLQkJLy9yZW1vdmUgdGhlIFhtbExpc3QgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0xJU1QpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydEZhbHNlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sTGlzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhDb2xsZWN0aW9uWG1sQXR0cmlidXRlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbEF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCQkKLQkJLy9hZGQgYW4gWG1sTGlzdCBhbm5vdGF0aW9uCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9MSVNUKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNYbWxMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzU3BlY2lmaWVkWG1sTGlzdCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpKTsKLQkJCi0JCS8vcmVtb3ZlIHRoZSBYbWxMaXN0IGFubm90YXRpb24KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9MSVNUKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNYbWxMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sQXR0cmlidXRlTWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxJRCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEF0dHJpYnV0ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyB4bWxBdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlYbWxJREFubm90YXRpb24geG1sSURBbm5vdGF0aW9uID0gKFhtbElEQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JRCk7Ci0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRYbWxJRCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxJREFubm90YXRpb24pOwotCi0JCXhtbEF0dHJpYnV0ZU1hcHBpbmcuYWRkWG1sSUQoKTsKLQkJeG1sSURBbm5vdGF0aW9uID0gKFhtbElEQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JRCk7Ci0JCWFzc2VydE5vdE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRYbWxJRCgpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxJREFubm90YXRpb24pOwotCi0JCXhtbEF0dHJpYnV0ZU1hcHBpbmcucmVtb3ZlWG1sSUQoKTsKLQkJeG1sSURBbm5vdGF0aW9uID0gKFhtbElEQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JRCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbElEKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQXR0cmlidXRlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbEF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCVhtbElEQW5ub3RhdGlvbiB4bWxJREFubm90YXRpb24gPSAoWG1sSURBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFhtbElEKCkpOwotCQlhc3NlcnROdWxsKHhtbElEQW5ub3RhdGlvbik7Ci0KLQotCQkvL2FkZCBhbiBYbWxJRCBhbm5vdGF0aW9uCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9JRCk7Ci0JCQl9Ci0JCX0pOwotCQl4bWxJREFubm90YXRpb24gPSAoWG1sSURBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFhtbElEKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbElEQW5ub3RhdGlvbik7Ci0KLQkJLy9yZW1vdmUgdGhlIFhtbElEIGFubm90YXRpb24KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9JRCk7Ci0JCQl9Ci0JCX0pOwotCQl4bWxJREFubm90YXRpb24gPSAoWG1sSURBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFhtbElEKCkpOwotCQlhc3NlcnROdWxsKHhtbElEQW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbElEUkVGKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQXR0cmlidXRlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbEF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCVhtbElEUkVGQW5ub3RhdGlvbiB4bWxJRFJFRkFubm90YXRpb24gPSAoWG1sSURSRUZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEUkVGKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFhtbElEUkVGKCkpOwotCQlhc3NlcnROdWxsKHhtbElEUkVGQW5ub3RhdGlvbik7Ci0KLQkJeG1sQXR0cmlidXRlTWFwcGluZy5hZGRYbWxJRFJFRigpOwotCQl4bWxJRFJFRkFubm90YXRpb24gPSAoWG1sSURSRUZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEUkVGKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFhtbElEUkVGKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbElEUkVGQW5ub3RhdGlvbik7Ci0KLQkJeG1sQXR0cmlidXRlTWFwcGluZy5yZW1vdmVYbWxJRFJFRigpOwotCQl4bWxJRFJFRkFubm90YXRpb24gPSAoWG1sSURSRUZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEUkVGKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sSURSRUYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBdHRyaWJ1dGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sQXR0cmlidXRlTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJWG1sSURSRUZBbm5vdGF0aW9uIHhtbElEUkVGQW5ub3RhdGlvbiA9IChYbWxJRFJFRkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSURSRUYpOwotCQlhc3NlcnROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sSURSRUYoKSk7Ci0JCWFzc2VydE51bGwoeG1sSURSRUZBbm5vdGF0aW9uKTsKLQotCi0JCS8vYWRkIGFuIFhtbElEUkVGIGFubm90YXRpb24KLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0lEUkVGKTsKLQkJCX0KLQkJfSk7Ci0JCXhtbElEUkVGQW5ub3RhdGlvbiA9IChYbWxJRFJFRkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSURSRUYpOwotCQlhc3NlcnROb3ROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sSURSRUYoKSk7Ci0JCWFzc2VydE5vdE51bGwoeG1sSURSRUZBbm5vdGF0aW9uKTsKLQotCQkvL3JlbW92ZSB0aGUgWG1sSURSRUYgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0lEUkVGKTsKLQkJCX0KLQkJfSk7Ci0JCXhtbElEUkVGQW5ub3RhdGlvbiA9IChYbWxJRFJFRkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSURSRUYpOwotCQlhc3NlcnROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sSURSRUYoKSk7Ci0JCWFzc2VydE51bGwoeG1sSURSRUZBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sQXR0YWNobWVudFJlZigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEF0dHJpYnV0ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyB4bWxBdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiB4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiA9IChYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRYbWxBdHRhY2htZW50UmVmKCkpOwotCQlhc3NlcnROdWxsKHhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uKTsKLQotCQl4bWxBdHRyaWJ1dGVNYXBwaW5nLmFkZFhtbEF0dGFjaG1lbnRSZWYoKTsKLQkJeG1sQXR0YWNobWVudFJlZkFubm90YXRpb24gPSAoWG1sQXR0YWNobWVudFJlZkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUQUNITUVOVF9SRUYpOwotCQlhc3NlcnROb3ROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sQXR0YWNobWVudFJlZigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbik7Ci0KLQkJeG1sQXR0cmlidXRlTWFwcGluZy5yZW1vdmVYbWxBdHRhY2htZW50UmVmKCk7Ci0JCXhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uID0gKFhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVEFDSE1FTlRfUkVGKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sQXR0YWNobWVudFJlZigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEF0dHJpYnV0ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyB4bWxBdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiB4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiA9IChYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRYbWxBdHRhY2htZW50UmVmKCkpOwotCQlhc3NlcnROdWxsKHhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uKTsKLQotCi0JCS8vYWRkIGFuIFhtbEF0dGFjaG1lbnRSZWYgYW5ub3RhdGlvbgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfQVRUQUNITUVOVF9SRUYpOwotCQkJfQotCQl9KTsKLQkJeG1sQXR0YWNobWVudFJlZkFubm90YXRpb24gPSAoWG1sQXR0YWNobWVudFJlZkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUQUNITUVOVF9SRUYpOwotCQlhc3NlcnROb3ROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sQXR0YWNobWVudFJlZigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbik7Ci0KLQkJLy9yZW1vdmUgdGhlIFhtbEF0dGFjaG1lbnRSZWYgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FUVEFDSE1FTlRfUkVGKTsKLQkJCX0KLQkJfSk7Ci0JCXhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uID0gKFhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVEFDSE1FTlRfUkVGKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEF0dGFjaG1lbnRSZWYoKSk7Ci0JCWFzc2VydE51bGwoeG1sQXR0YWNobWVudFJlZkFubm90YXRpb24pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY5NzZlZi4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxJREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbElEUkVGQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cyBleHRlbmRzIEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSwgSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRWxlbWVudCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVR5cGVXaXRoQ29sbGVjdGlvblhtbEVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoImltcG9ydCBqYXZhLnV0aWwuTGlzdDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKFRZUEVfTkFNRSkuYXBwZW5kKCIgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFhtbEVsZW1lbnQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gbGlzdDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIFRZUEVfTkFNRSArICIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVYbWxUeXBlV2l0aFZhcmlvdXNBdHRyaWJ1dGVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKQVhCLlhNTF9UWVBFKS5hcHBlbmQoIjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiaW1wb3J0IGphdmEudXRpbC5MaXN0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoVFlQRV9OQU1FKS5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBTdHJpbmcgc3RyaW5nOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIExpc3Q8U3RyaW5nPiBzdHJpbmdMaXN0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIFN0cmluZ1tdIHN0cmluZ0FycmF5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCBUWVBFX05BTUUgKyAiLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudCB4bWxFbGVtZW50ID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sRWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgeG1sRWxlbWVudC5nZXRRTmFtZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgeG1sRWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0KLQkJeG1sRWxlbWVudC5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlYbWxFbGVtZW50QW5ub3RhdGlvbiB4bWxFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgeG1sRWxlbWVudC5nZXRRTmFtZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCi0JCXhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQl4bWxFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudE1hcHBpbmcgeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50IHhtbEVsZW1lbnQgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRYbWxFbGVtZW50KCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudC5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQotCQkvL2FkZCBhIE5hbWUgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sRWxlbWVudE1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9fTkFNRSwgImZvbyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxFbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQotCQkvL3JlbW92ZSB0aGUgTmFtZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOb3JtYWxBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmdldFhtbEVsZW1lbnRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy52YWx1ZXMoeG1sRWxlbWVudEFubm90YXRpb24pLnJlbW92ZSgwKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudC5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudCB4bWxFbGVtZW50ID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sRWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50LmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCi0JCXhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lc3BhY2UoImZvbyIpOwotCQlYbWxFbGVtZW50QW5ub3RhdGlvbiB4bWxFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sRWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQotCQl4bWxFbGVtZW50LmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZXNwYWNlKG51bGwpOwotCQl4bWxFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudC5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudE1hcHBpbmcgeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50IHhtbEVsZW1lbnQgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRYbWxFbGVtZW50KCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0KLQotCQkvL2FkZCBhIG5hbWVzcGFjZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRYbWxFbGVtZW50TWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9FTEVNRU5UX19OQU1FU1BBQ0UsICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sRWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQotCQkvL3JlbW92ZSB0aGUgbmFtZXNwYWNlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuZ2V0WG1sRWxlbWVudEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLnZhbHVlcyh4bWxFbGVtZW50QW5ub3RhdGlvbikucmVtb3ZlKDApOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50LmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlSZXF1aXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudCB4bWxFbGVtZW50ID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sRWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50LmdldFNwZWNpZmllZFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNEZWZhdWx0UmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sRWxlbWVudC5pc1JlcXVpcmVkKCkpOwotCi0JCXhtbEVsZW1lbnQuc2V0U3BlY2lmaWVkUmVxdWlyZWQoQm9vbGVhbi5UUlVFKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sRWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxFbGVtZW50LmdldFNwZWNpZmllZFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNEZWZhdWx0UmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB4bWxFbGVtZW50LmlzUmVxdWlyZWQoKSk7Ci0KLQkJeG1sRWxlbWVudC5zZXRTcGVjaWZpZWRSZXF1aXJlZChudWxsKTsKLQkJeG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sRWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50LmdldFNwZWNpZmllZFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNEZWZhdWx0UmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sRWxlbWVudC5pc1JlcXVpcmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZXF1aXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudCB4bWxFbGVtZW50ID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sRWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50LmdldFNwZWNpZmllZFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNEZWZhdWx0UmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sRWxlbWVudC5pc1JlcXVpcmVkKCkpOwotCi0KLQkJLy9hZGQgYSByZXF1aXJlZCBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRYbWxFbGVtZW50TWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9FTEVNRU5UX19SRVFVSVJFRCwgdHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxFbGVtZW50LmdldFNwZWNpZmllZFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNEZWZhdWx0UmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB4bWxFbGVtZW50LmlzUmVxdWlyZWQoKSk7Ci0KLQkJLy9yZW1vdmUgdGhlIHJlcXVpcmVkIG1lbWJlciB2YWx1ZSBwYWlyCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuZ2V0WG1sRWxlbWVudEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLnZhbHVlcyh4bWxFbGVtZW50QW5ub3RhdGlvbikucmVtb3ZlKDApOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50LmdldFNwZWNpZmllZFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNEZWZhdWx0UmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sRWxlbWVudC5pc1JlcXVpcmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOaWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudCB4bWxFbGVtZW50ID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sRWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50LmdldFNwZWNpZmllZE5pbGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNEZWZhdWx0TmlsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sRWxlbWVudC5pc05pbGxhYmxlKCkpOwotCi0JCXhtbEVsZW1lbnQuc2V0U3BlY2lmaWVkTmlsbGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sRWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5pbGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxFbGVtZW50LmdldFNwZWNpZmllZE5pbGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNEZWZhdWx0TmlsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB4bWxFbGVtZW50LmlzTmlsbGFibGUoKSk7Ci0KLQkJeG1sRWxlbWVudC5zZXRTcGVjaWZpZWROaWxsYWJsZShudWxsKTsKLQkJeG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sRWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50LmdldFNwZWNpZmllZE5pbGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNEZWZhdWx0TmlsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sRWxlbWVudC5pc05pbGxhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOaWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudCB4bWxFbGVtZW50ID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sRWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50LmdldFNwZWNpZmllZE5pbGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNEZWZhdWx0TmlsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sRWxlbWVudC5pc05pbGxhYmxlKCkpOwotCi0KLQkJLy9hZGQgYSBuaWxsYWJsZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRYbWxFbGVtZW50TWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9FTEVNRU5UX19OSUxMQUJMRSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxFbGVtZW50LmdldFNwZWNpZmllZE5pbGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNEZWZhdWx0TmlsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB4bWxFbGVtZW50LmlzTmlsbGFibGUoKSk7Ci0KLQkJLy9yZW1vdmUgdGhlIG5pbGxhYmxlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuZ2V0WG1sRWxlbWVudEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLnZhbHVlcyh4bWxFbGVtZW50QW5ub3RhdGlvbikucmVtb3ZlKDApOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50LmdldFNwZWNpZmllZE5pbGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNEZWZhdWx0TmlsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sRWxlbWVudC5pc05pbGxhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE5pbGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVhtbFR5cGVXaXRoVmFyaW91c0F0dHJpYnV0ZXMoKTsKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQkKLQkJLy8gc3RyaW5nCi0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50TWFwcGluZyB4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnQgeG1sRWxlbWVudCA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sRWxlbWVudC5pc0RlZmF1bHROaWxsYWJsZSgpKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpLmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9FTEVNRU5UKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50LmlzRGVmYXVsdE5pbGxhYmxlKCkpOwotCQkKLQkJLy8gc3RyaW5nIGxpc3QKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMSk7Ci0JCXhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJeG1sRWxlbWVudCA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbEVsZW1lbnQoKTsKLQkJcmVzb3VyY2VBdHRyaWJ1dGUgPSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHhtbEVsZW1lbnQuaXNEZWZhdWx0TmlsbGFibGUoKSk7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKS5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sRWxlbWVudC5pc0RlZmF1bHROaWxsYWJsZSgpKTsKLQkJCi0JCS8vIHN0cmluZyBhcnJheQotCQlwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAyKTsKLQkJeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQl4bWxFbGVtZW50ID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sRWxlbWVudCgpOwotCQlyZXNvdXJjZUF0dHJpYnV0ZSA9IHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHModHJ1ZSwgeG1sRWxlbWVudC5pc0RlZmF1bHROaWxsYWJsZSgpKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpLmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9FTEVNRU5UKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50LmlzRGVmYXVsdE5pbGxhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlEZWZhdWx0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50TWFwcGluZyB4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnQgeG1sRWxlbWVudCA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudC5nZXREZWZhdWx0VmFsdWUoKSk7Ci0KLQkJeG1sRWxlbWVudC5zZXREZWZhdWx0VmFsdWUoImZvbyIpOwotCQlYbWxFbGVtZW50QW5ub3RhdGlvbiB4bWxFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sRWxlbWVudC5nZXREZWZhdWx0VmFsdWUoKSk7Ci0KLQkJeG1sRWxlbWVudC5zZXREZWZhdWx0VmFsdWUobnVsbCk7Ci0JCXhtbEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50LmdldERlZmF1bHRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudCgpOwotCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudCB4bWxFbGVtZW50ID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sRWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50LmdldERlZmF1bHRWYWx1ZSgpKTsKLQotCi0JCS8vYWRkIGEgRGVmYXVsdFZhbHVlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmFkZFhtbEVsZW1lbnRNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0VMRU1FTlRfX0RFRkFVTFRfVkFMVUUsICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sRWxlbWVudC5nZXREZWZhdWx0VmFsdWUoKSk7Ci0KLQkJLy9yZW1vdmUgdGhlIERlZmF1bHRWYWx1ZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOb3JtYWxBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmdldFhtbEVsZW1lbnRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy52YWx1ZXMoeG1sRWxlbWVudEFubm90YXRpb24pLnJlbW92ZSgwKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudC5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudCB4bWxFbGVtZW50ID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sRWxlbWVudCgpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50LmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgeG1sRWxlbWVudC5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHhtbEVsZW1lbnQuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCQotCQl4bWxFbGVtZW50LnNldFNwZWNpZmllZFR5cGUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHhtbEVsZW1lbnQuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB4bWxFbGVtZW50LmdldFR5cGUoKSk7Ci0JCQotCQl4bWxFbGVtZW50LnNldFNwZWNpZmllZFR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudC5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHhtbEVsZW1lbnQuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudCB4bWxFbGVtZW50ID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sRWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnQuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCB4bWxFbGVtZW50LmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHhtbEVsZW1lbnQuZ2V0VHlwZSgpKTsKLQkJCi0JCS8vYWRkIGEgVHlwZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRYbWxFbGVtZW50VHlwZU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9fVFlQRSwgIkZvbyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB4bWxFbGVtZW50LmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgeG1sRWxlbWVudC5nZXRUeXBlKCkpOwotCQkKLQkJLy9yZW1vdmUgdGhlIFR5cGUgbWVtYmVyIHZhbHVlIHBhaXIKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTm9ybWFsQW5ub3RhdGlvbiB4bWxFbGVtZW50QW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5nZXRYbWxFbGVtZW50QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMudmFsdWVzKHhtbEVsZW1lbnRBbm5vdGF0aW9uKS5yZW1vdmUoMCk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnQuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCB4bWxFbGVtZW50LmdldFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZU1hcHBpbmdUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudE1hcHBpbmcgeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50TWFwcGluZyk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UKSk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlhNTF9BVFRSSUJVVEVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyB4bWxBdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROb3ROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUUklCVVRFKSk7Ci0KLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuWE1MX0VMRU1FTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRNYXBwaW5nKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVFJJQlVURSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxKYXZhVHlwZUFkYXB0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0KLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudE1hcHBpbmcgeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZShKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUikpOwotCQkKLQkJeG1sRWxlbWVudE1hcHBpbmcuYWRkWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSk7Ci0JCQotCQl4bWxFbGVtZW50TWFwcGluZy5yZW1vdmVYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbEphdmFUeXBlQWRhcHRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSk7Ci0JCQotCQkvL2FkZCBhbiBYbWxKYXZhVHlwZUFkYXB0ZXIgYW5ub3RhdGlvbgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSk7Ci0JCQotCQkvL3JlbW92ZSB0aGUgWG1sSmF2YVR5cGVBZGFwdGVyIGFubm90YXRpb24KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbFNjaGVtYVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50TWFwcGluZyB4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sU2NoZW1hVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZShKQVhCLlhNTF9TQ0hFTUFfVFlQRSkpOwotCQkKLQkJeG1sRWxlbWVudE1hcHBpbmcuYWRkWG1sU2NoZW1hVHlwZSgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50TWFwcGluZy5nZXRYbWxTY2hlbWFUeXBlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpKTsKLQkJCi0JCXhtbEVsZW1lbnRNYXBwaW5nLnJlbW92ZVhtbFNjaGVtYVR5cGUoKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sU2NoZW1hVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZShKQVhCLlhNTF9TQ0hFTUFfVFlQRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxTY2hlbWFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudE1hcHBpbmcgeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50TWFwcGluZy5nZXRYbWxTY2hlbWFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX1NDSEVNQV9UWVBFKSk7Ci0JCQotCQkvL2FkZCBhbiBYbWxTY2hlbWFUeXBlIGFubm90YXRpb24KLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50TWFwcGluZy5nZXRYbWxTY2hlbWFUeXBlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpKTsKLQkJCi0JCS8vcmVtb3ZlIHRoZSBYbWxTY2hlbWFUeXBlIGFubm90YXRpb24KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sU2NoZW1hVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZShKQVhCLlhNTF9TQ0hFTUFfVFlQRSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEVsZW1lbnRNZW1iZXJWYWx1ZVBhaXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcigoTWFya2VyQW5ub3RhdGlvbikgdGhpcy5nZXRYbWxFbGVtZW50QW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxFbGVtZW50TWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKChNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbEVsZW1lbnRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgbmFtZSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEVsZW1lbnRUeXBlTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkoTWFya2VyQW5ub3RhdGlvbikgdGhpcy5nZXRYbWxFbGVtZW50QW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIAotCQkJbmFtZSwgCi0JCQl0aGlzLm5ld1R5cGVMaXRlcmFsKGRlY2xhcmF0aW9uLmdldEFzdCgpLCB0eXBlTmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGdldFhtbEVsZW1lbnRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChKQVhCLlhNTF9FTEVNRU5UKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxFbGVtZW50V3JhcHBlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiB4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gPSAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sRWxlbWVudFdyYXBwZXIoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKTsKLQotCQl4bWxFbGVtZW50TWFwcGluZy5hZGRYbWxFbGVtZW50V3JhcHBlcigpOwotCQl4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gPSAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sRWxlbWVudFdyYXBwZXIoKSk7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKTsKLQotCQl4bWxFbGVtZW50TWFwcGluZy5yZW1vdmVYbWxFbGVtZW50V3JhcHBlcigpOwotCQl4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gPSAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbEVsZW1lbnRXcmFwcGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudE1hcHBpbmcgeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50TWFwcGluZy5nZXRYbWxFbGVtZW50V3JhcHBlcigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pOwotCi0KLQkJLy9hZGQgYW4gWG1sRWxlbWVudFdyYXBwZXIgYW5ub3RhdGlvbgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCQl9Ci0JCX0pOwotCQl4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gPSAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sRWxlbWVudFdyYXBwZXIoKSk7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKTsKLQotCQkvL3JlbW92ZSB0aGUgWG1sRWxlbWVudFdyYXBwZXIgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQkJfQotCQl9KTsKLQkJeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbEVsZW1lbnRXcmFwcGVyKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbExpc3QxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudE1hcHBpbmcgeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZSh4bWxFbGVtZW50TWFwcGluZy5pc1htbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzU3BlY2lmaWVkWG1sTGlzdCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpKTsKLQkJCi0JCXhtbEVsZW1lbnRNYXBwaW5nLnNldFNwZWNpZmllZFhtbExpc3QodHJ1ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50TWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JCQotCQl4bWxFbGVtZW50TWFwcGluZy5zZXRTcGVjaWZpZWRYbWxMaXN0KGZhbHNlKTsKLQkJCi0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sTGlzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhDb2xsZWN0aW9uWG1sRWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudE1hcHBpbmcgeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZSh4bWxFbGVtZW50TWFwcGluZy5pc1htbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzU3BlY2lmaWVkWG1sTGlzdCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpKTsKLQkJCi0JCXhtbEVsZW1lbnRNYXBwaW5nLnNldFNwZWNpZmllZFhtbExpc3QodHJ1ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50TWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JCQotCQl4bWxFbGVtZW50TWFwcGluZy5zZXRTcGVjaWZpZWRYbWxMaXN0KGZhbHNlKTsKLQkJCi0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sTGlzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50TWFwcGluZyB4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCQkKLQkJLy9hZGQgYW4gWG1sTGlzdCBhbm5vdGF0aW9uCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfTElTVCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50TWFwcGluZy5pc1htbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydFRydWUoeG1sRWxlbWVudE1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCQkKLQkJLy9yZW1vdmUgdGhlIFhtbExpc3QgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9MSVNUKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRGYWxzZSh4bWxFbGVtZW50TWFwcGluZy5pc1htbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzU3BlY2lmaWVkWG1sTGlzdCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbExpc3QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoQ29sbGVjdGlvblhtbEVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxFbGVtZW50TWFwcGluZy5pc0RlZmF1bHRYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxFbGVtZW50TWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JCQotCQkvL2FkZCBhbiBYbWxMaXN0IGFubm90YXRpb24KLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9MSVNUKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50TWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JCQotCQkvL3JlbW92ZSB0aGUgWG1sTGlzdCBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0xJU1QpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxJRCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCVhtbElEQW5ub3RhdGlvbiB4bWxJREFubm90YXRpb24gPSAoWG1sSURBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50TWFwcGluZy5nZXRYbWxJRCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxJREFubm90YXRpb24pOwotCi0JCXhtbEVsZW1lbnRNYXBwaW5nLmFkZFhtbElEKCk7Ci0JCXhtbElEQW5ub3RhdGlvbiA9IChYbWxJREFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSUQpOwotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbElEKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbElEQW5ub3RhdGlvbik7Ci0KLQkJeG1sRWxlbWVudE1hcHBpbmcucmVtb3ZlWG1sSUQoKTsKLQkJeG1sSURBbm5vdGF0aW9uID0gKFhtbElEQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JRCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbElEKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudE1hcHBpbmcgeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJWG1sSURBbm5vdGF0aW9uIHhtbElEQW5ub3RhdGlvbiA9IChYbWxJREFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSUQpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbElEKCkpOwotCQlhc3NlcnROdWxsKHhtbElEQW5ub3RhdGlvbik7Ci0KLQotCQkvL2FkZCBhbiBYbWxJRCBhbm5vdGF0aW9uCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfSUQpOwotCQkJfQotCQl9KTsKLQkJeG1sSURBbm5vdGF0aW9uID0gKFhtbElEQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JRCk7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sSUQoKSk7Ci0JCWFzc2VydE5vdE51bGwoeG1sSURBbm5vdGF0aW9uKTsKLQotCQkvL3JlbW92ZSB0aGUgWG1sSUQgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9JRCk7Ci0JCQl9Ci0JCX0pOwotCQl4bWxJREFubm90YXRpb24gPSAoWG1sSURBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50TWFwcGluZy5nZXRYbWxJRCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxJREFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxJRFJFRigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCVhtbElEUkVGQW5ub3RhdGlvbiB4bWxJRFJFRkFubm90YXRpb24gPSAoWG1sSURSRUZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEUkVGKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50TWFwcGluZy5nZXRYbWxJRFJFRigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxJRFJFRkFubm90YXRpb24pOwotCi0JCXhtbEVsZW1lbnRNYXBwaW5nLmFkZFhtbElEUkVGKCk7Ci0JCXhtbElEUkVGQW5ub3RhdGlvbiA9IChYbWxJRFJFRkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSURSRUYpOwotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbElEUkVGKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbElEUkVGQW5ub3RhdGlvbik7Ci0KLQkJeG1sRWxlbWVudE1hcHBpbmcucmVtb3ZlWG1sSURSRUYoKTsKLQkJeG1sSURSRUZBbm5vdGF0aW9uID0gKFhtbElEUkVGQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JRFJFRik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sSURSRUYoKSk7Ci0JCWFzc2VydE51bGwoeG1sSURSRUZBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sSURSRUYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50TWFwcGluZyB4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlYbWxJRFJFRkFubm90YXRpb24geG1sSURSRUZBbm5vdGF0aW9uID0gKFhtbElEUkVGQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JRFJFRik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sSURSRUYoKSk7Ci0JCWFzc2VydE51bGwoeG1sSURSRUZBbm5vdGF0aW9uKTsKLQotCi0JCS8vYWRkIGFuIFhtbElEUkVGIGFubm90YXRpb24KLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9JRFJFRik7Ci0JCQl9Ci0JCX0pOwotCQl4bWxJRFJFRkFubm90YXRpb24gPSAoWG1sSURSRUZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEUkVGKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50TWFwcGluZy5nZXRYbWxJRFJFRigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxJRFJFRkFubm90YXRpb24pOwotCi0JCS8vcmVtb3ZlIHRoZSBYbWxJRFJFRiBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0lEUkVGKTsKLQkJCX0KLQkJfSk7Ci0JCXhtbElEUkVGQW5ub3RhdGlvbiA9IChYbWxJRFJFRkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSURSRUYpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbElEUkVGKCkpOwotCQlhc3NlcnROdWxsKHhtbElEUkVGQW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbEF0dGFjaG1lbnRSZWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50TWFwcGluZyB4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiB4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiA9IChYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sQXR0YWNobWVudFJlZigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbik7Ci0KLQkJeG1sRWxlbWVudE1hcHBpbmcuYWRkWG1sQXR0YWNobWVudFJlZigpOwotCQl4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiA9IChYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sQXR0YWNobWVudFJlZigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbik7Ci0KLQkJeG1sRWxlbWVudE1hcHBpbmcucmVtb3ZlWG1sQXR0YWNobWVudFJlZigpOwotCQl4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiA9IChYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbEF0dGFjaG1lbnRSZWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50TWFwcGluZyB4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiB4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiA9IChYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sQXR0YWNobWVudFJlZigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbik7Ci0KLQotCQkvL2FkZCBhbiBYbWxBdHRhY2htZW50UmVmIGFubm90YXRpb24KLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCQl9Ci0JCX0pOwotCQl4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiA9IChYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sQXR0YWNobWVudFJlZigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbik7Ci0KLQkJLy9yZW1vdmUgdGhlIFhtbEF0dGFjaG1lbnRSZWYgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCQl9Ci0JCX0pOwotCQl4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiA9IChYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sQXR0YWNobWVudFJlZigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MWJiMTEuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFJlZk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50V3JhcHBlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE1peGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nVGVzdHMKLQkJZXh0ZW5kcyBKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnRSZWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSwgSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50UmVmIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVHlwZVdpdGhKQVhCRWxlbWVudFhtbEVsZW1lbnRSZWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUoVFlQRV9OQU1FICsgIjIiLCBuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFLCBKQVhCLlhNTF9FTEVNRU5UX1JFRiwgSkFYQi5KQVhCX0VMRU1FTlQpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50UmVmIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInByaXZhdGUgSkFYQkVsZW1lbnQgZm9vOyIpLmFwcGVuZChDUikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aFJvb3RFbGVtZW50WG1sRWxlbWVudFJlZigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShUWVBFX05BTUUgKyAiMyIsIG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RZUEUsIEpBWEIuWE1MX0VMRU1FTlRfUkVGLCBKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFhtbFJvb3RFbGVtZW50KG5hbWU9XCJmb29cIikiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50UmVmIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInByaXZhdGUgIiArIFRZUEVfTkFNRSArICIzIGZvbzsiKS5hcHBlbmQoQ1IpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmKCk7Ci0JCWNyZWF0ZVR5cGVXaXRoSkFYQkVsZW1lbnRYbWxFbGVtZW50UmVmKCk7IC8vIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUgKyAiMiIKLQkJY3JlYXRlVHlwZVdpdGhSb290RWxlbWVudFhtbEVsZW1lbnRSZWYoKTsgLy8gRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSArICIzIgotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudFJlZk1hcHBpbmcgeG1sRWxlbWVudFJlZk1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50UmVmIHhtbEVsZW1lbnRSZWYgPSB4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmKCk7Ci0JCQotCQkvLyBYbWxFbGVtZW50UmVmIHR5cGUgaXMgamF2YS5sYW5nLlN0cmluZyAtPiBubyBkZWZhdWx0IG5hbWUgb3IgbmFtZXNwYWNlCi0JCWFzc2VydEVxdWFscygiIiwgeG1sRWxlbWVudFJlZi5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgeG1sRWxlbWVudFJlZi5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCWNsYXNzTWFwcGluZyA9ICgoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSArICIyIikpLmdldE1hcHBpbmcoKTsKLQkJeG1sRWxlbWVudFJlZk1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZk1hcHBpbmcpIENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCkuZ2V0TWFwcGluZygpOwotCQl4bWxFbGVtZW50UmVmID0geG1sRWxlbWVudFJlZk1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZigpOwotCQkKLQkJLy8gWG1sRWxlbWVudFJlZiB0eXBlIGlzIEpBWEJFbGVtZW50IC0+IGRlZmF1bHQgbmFtZSBpcyBuYW1lIG9mIGF0dHJpYnV0ZQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQljbGFzc01hcHBpbmcgPSAoKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUgKyAiMyIpKS5nZXRNYXBwaW5nKCk7Ci0JCXhtbEVsZW1lbnRSZWZNYXBwaW5nID0gKFhtbEVsZW1lbnRSZWZNYXBwaW5nKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApLmdldE1hcHBpbmcoKTsKLQkJeG1sRWxlbWVudFJlZiA9IHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWYoKTsKLQkJCi0JCS8vIFhtbEVsZW1lbnRSZWYgdHlwZSBpcyB0eXBlIHdpdGggcm9vdCBlbGVtZW50IC0+IGRlZmF1bHQgbmFtZSBpcyByb290IGVsZW1lbnQgbmFtZQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudFJlZigpOwotCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudFJlZk1hcHBpbmcgeG1sRWxlbWVudFJlZk1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZk1hcHBpbmcpIENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCkuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50UmVmIHhtbEVsZW1lbnRSZWYgPSB4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZi5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgeG1sRWxlbWVudFJlZi5nZXRRTmFtZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCi0JCXhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb24gPSAoWG1sRWxlbWVudFJlZkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sRWxlbWVudFJlZi5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sRWxlbWVudFJlZi5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0KLQkJeG1sRWxlbWVudFJlZi5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCXhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudFJlZigpOwotCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudFJlZk1hcHBpbmcgeG1sRWxlbWVudFJlZk1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZk1hcHBpbmcpIENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCkuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50UmVmIHhtbEVsZW1lbnRSZWYgPSB4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0KLQkJLy9hZGQgYSBOYW1lIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmdUZXN0cy50aGlzLmFkZFhtbEVsZW1lbnRSZWZNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0VMRU1FTlRfUkVGX19OQU1FLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCi0JCS8vcmVtb3ZlIHRoZSBOYW1lIG1lbWJlciB2YWx1ZSBwYWlyCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ1Rlc3RzLnRoaXMuZ2V0WG1sRWxlbWVudFJlZkFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmdUZXN0cy50aGlzLnZhbHVlcyh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbikucmVtb3ZlKDApOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudFJlZigpOwotCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudFJlZk1hcHBpbmcgeG1sRWxlbWVudFJlZk1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZk1hcHBpbmcpIENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCkuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50UmVmIHhtbEVsZW1lbnRSZWYgPSB4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0KLQkJeG1sRWxlbWVudFJlZi5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWVzcGFjZSgiZm9vIik7Ci0JCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sRWxlbWVudFJlZi5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQotCQl4bWxFbGVtZW50UmVmLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZXNwYWNlKG51bGwpOwotCQl4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnRSZWYoKTsKLQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRSZWZNYXBwaW5nIHhtbEVsZW1lbnRSZWZNYXBwaW5nID0gKFhtbEVsZW1lbnRSZWZNYXBwaW5nKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudFJlZiB4bWxFbGVtZW50UmVmID0geG1sRWxlbWVudFJlZk1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZigpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCi0KLQkJLy9hZGQgYSBuYW1lc3BhY2UgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sRWxlbWVudFJlZk1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9SRUZfX05BTUVTUEFDRSwgImZvbyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxFbGVtZW50UmVmLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCi0JCS8vcmVtb3ZlIHRoZSBuYW1lc3BhY2UgbWVtYmVyIHZhbHVlIHBhaXIKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTm9ybWFsQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nVGVzdHMudGhpcy5nZXRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ1Rlc3RzLnRoaXMudmFsdWVzKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKS5yZW1vdmUoMCk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVJlcXVpcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudFJlZigpOwotCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudFJlZk1hcHBpbmcgeG1sRWxlbWVudFJlZk1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZk1hcHBpbmcpIENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCkuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50UmVmIHhtbEVsZW1lbnRSZWYgPSB4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWYuZ2V0U3BlY2lmaWVkUmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sRWxlbWVudFJlZi5pc0RlZmF1bHRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50UmVmLmlzUmVxdWlyZWQoKSk7Ci0KLQkJeG1sRWxlbWVudFJlZi5zZXRTcGVjaWZpZWRSZXF1aXJlZChCb29sZWFuLlRSVUUpOwotCQlYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxFbGVtZW50UmVmLmdldFNwZWNpZmllZFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnRSZWYuaXNEZWZhdWx0UmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB4bWxFbGVtZW50UmVmLmlzUmVxdWlyZWQoKSk7Ci0KLQkJeG1sRWxlbWVudFJlZi5zZXRTcGVjaWZpZWRSZXF1aXJlZChudWxsKTsKLQkJeG1sRWxlbWVudFJlZkFubm90YXRpb24gPSAoWG1sRWxlbWVudFJlZkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZi5nZXRTcGVjaWZpZWRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50UmVmLmlzRGVmYXVsdFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnRSZWYuaXNSZXF1aXJlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUmVxdWlyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmKCk7Ci0KLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50UmVmTWFwcGluZyB4bWxFbGVtZW50UmVmTWFwcGluZyA9IChYbWxFbGVtZW50UmVmTWFwcGluZykgQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRSZWYgeG1sRWxlbWVudFJlZiA9IHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWYoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudFJlZk1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZi5nZXRTcGVjaWZpZWRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50UmVmLmlzRGVmYXVsdFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnRSZWYuaXNSZXF1aXJlZCgpKTsKLQotCi0JCS8vYWRkIGEgcmVxdWlyZWQgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sRWxlbWVudFJlZk1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9SRUZfX1JFUVVJUkVELCB0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHhtbEVsZW1lbnRSZWYuZ2V0U3BlY2lmaWVkUmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sRWxlbWVudFJlZi5pc0RlZmF1bHRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHhtbEVsZW1lbnRSZWYuaXNSZXF1aXJlZCgpKTsKLQotCQkvL3JlbW92ZSB0aGUgcmVxdWlyZWQgbWVtYmVyIHZhbHVlIHBhaXIKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTm9ybWFsQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nVGVzdHMudGhpcy5nZXRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ1Rlc3RzLnRoaXMudmFsdWVzKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKS5yZW1vdmUoMCk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWYuZ2V0U3BlY2lmaWVkUmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sRWxlbWVudFJlZi5pc0RlZmF1bHRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50UmVmLmlzUmVxdWlyZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRSZWZNYXBwaW5nIHhtbEVsZW1lbnRSZWZNYXBwaW5nID0gKFhtbEVsZW1lbnRSZWZNYXBwaW5nKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudFJlZiB4bWxFbGVtZW50UmVmID0geG1sRWxlbWVudFJlZk1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZigpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgeG1sRWxlbWVudFJlZi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHhtbEVsZW1lbnRSZWYuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCQotCQl4bWxFbGVtZW50UmVmLnNldFNwZWNpZmllZFR5cGUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHhtbEVsZW1lbnRSZWYuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB4bWxFbGVtZW50UmVmLmdldFR5cGUoKSk7Ci0JCQotCQl4bWxFbGVtZW50UmVmLnNldFNwZWNpZmllZFR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZi5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHhtbEVsZW1lbnRSZWYuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRSZWZNYXBwaW5nIHhtbEVsZW1lbnRSZWZNYXBwaW5nID0gKFhtbEVsZW1lbnRSZWZNYXBwaW5nKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudFJlZiB4bWxFbGVtZW50UmVmID0geG1sRWxlbWVudFJlZk1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZigpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWYuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCB4bWxFbGVtZW50UmVmLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHhtbEVsZW1lbnRSZWYuZ2V0VHlwZSgpKTsKLQkJCi0JCS8vYWRkIGEgVHlwZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nVGVzdHMudGhpcy5hZGRYbWxFbGVtZW50UmVmVHlwZU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9SRUZfX1RZUEUsICJGb28iKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgeG1sRWxlbWVudFJlZi5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHhtbEVsZW1lbnRSZWYuZ2V0VHlwZSgpKTsKLQkJCi0JCS8vcmVtb3ZlIHRoZSBUeXBlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ1Rlc3RzLnRoaXMuZ2V0WG1sRWxlbWVudFJlZkFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmdUZXN0cy50aGlzLnZhbHVlcyh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbikucmVtb3ZlKDApOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgeG1sRWxlbWVudFJlZi5nZXRUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VNYXBwaW5nVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnRSZWYoKTsKLQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50UmVmTWFwcGluZyB4bWxFbGVtZW50UmVmTWFwcGluZyA9IChYbWxFbGVtZW50UmVmTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRSZWZNYXBwaW5nKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGKSk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlhNTF9BVFRSSUJVVEVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyB4bWxBdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROb3ROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVFJJQlVURSkpOwotCi0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UX1JFRl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQl4bWxFbGVtZW50UmVmTWFwcGluZyA9IChYbWxFbGVtZW50UmVmTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudFJlZk1hcHBpbmcpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVFJJQlVURSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxKYXZhVHlwZUFkYXB0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmKCk7Ci0KLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudFJlZk1hcHBpbmcgeG1sRWxlbWVudFJlZk1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZShKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUikpOwotCQkKLQkJeG1sRWxlbWVudFJlZk1hcHBpbmcuYWRkWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSk7Ci0KLQkJeG1sRWxlbWVudFJlZk1hcHBpbmcucmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZShKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxKYXZhVHlwZUFkYXB0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmKCk7Ci0KLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudFJlZk1hcHBpbmcgeG1sRWxlbWVudFJlZk1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZShKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUikpOwotCQkKLQkJLy9hZGQgYW4gWG1sSmF2YVR5cGVBZGFwdGVyIGFubm90YXRpb24KLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUikpOwotCQkKLQkJLy9yZW1vdmUgdGhlIFhtbEphdmFUeXBlQWRhcHRlciBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZShKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUikpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEVsZW1lbnRSZWZNZW1iZXJWYWx1ZVBhaXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcigoTWFya2VyQW5ub3RhdGlvbikgdGhpcy5nZXRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxFbGVtZW50UmVmTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKChNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgbmFtZSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEVsZW1lbnRSZWZUeXBlTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkoTWFya2VyQW5ub3RhdGlvbikgdGhpcy5nZXRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIAotCQkJbmFtZSwgCi0JCQl0aGlzLm5ld1R5cGVMaXRlcmFsKGRlY2xhcmF0aW9uLmdldEFzdCgpLCB0eXBlTmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGdldFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sRWxlbWVudFdyYXBwZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50UmVmTWFwcGluZyB4bWxFbGVtZW50UmVmTWFwcGluZyA9IChYbWxFbGVtZW50UmVmTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24geG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFhtbEVsZW1lbnRXcmFwcGVyKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbik7Ci0JCQotCQl4bWxFbGVtZW50UmVmTWFwcGluZy5hZGRYbWxFbGVtZW50V3JhcHBlcigpOwotCQl4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gPSAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudFJlZk1hcHBpbmcuZ2V0WG1sRWxlbWVudFdyYXBwZXIoKSk7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKTsKLQkJCi0JCXhtbEVsZW1lbnRSZWZNYXBwaW5nLnJlbW92ZVhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCXhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbEVsZW1lbnRSZWZXcmFwcGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudFJlZigpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudFJlZk1hcHBpbmcgeG1sRWxlbWVudFJlZk1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24geG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFhtbEVsZW1lbnRXcmFwcGVyKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbik7Ci0JCQotCQkvL2FkZCBhbiBYbWxFbGVtZW50V3JhcHBlciBhbm5vdGF0aW9uCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJCX0KLQkJfSk7Ci0JCXhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRYbWxFbGVtZW50V3JhcHBlcigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pOwotCQkKLQkJLy9yZW1vdmUgdGhlIFhtbEVsZW1lbnRXcmFwcGVyIGFubm90YXRpb24KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJCX0KLQkJfSk7Ci0JCXhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRYbWxFbGVtZW50V3JhcHBlcigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sTWl4ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50UmVmTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEVsZW1lbnRSZWZNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gYXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlYbWxNaXhlZEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChYbWxNaXhlZEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTUlYRUQpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sTWl4ZWQoKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCQotCQlhdHRyaWJ1dGVNYXBwaW5nLmFkZFhtbE1peGVkKCk7Ci0JCWFubm90YXRpb24gPSAoWG1sTWl4ZWRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX01JWEVEKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbE1peGVkKCkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQkKLQkJYXR0cmlidXRlTWFwcGluZy5yZW1vdmVYbWxNaXhlZCgpOwotCQlhbm5vdGF0aW9uID0gKFhtbE1peGVkQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9NSVhFRCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxNaXhlZCgpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbE1peGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudFJlZigpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudFJlZk1hcHBpbmcgYXR0cmlidXRlTWFwcGluZyA9IChYbWxFbGVtZW50UmVmTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJWG1sTWl4ZWRBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoWG1sTWl4ZWRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX01JWEVEKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbE1peGVkKCkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQkKLQkJLy9hZGQgYW4gWG1sTWl4ZWQgYW5ub3RhdGlvbgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSBhbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfTUlYRUQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCWFubm90YXRpb24gPSAoWG1sTWl4ZWRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX01JWEVEKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbE1peGVkKCkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQkKLQkJLy9yZW1vdmUgdGhlIFhtbE1peGVkIGFubm90YXRpb24KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX01JWEVEKTsKLQkJCQkJfQotCQkJCX0pOwotCQlhbm5vdGF0aW9uID0gKFhtbE1peGVkQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9NSVhFRCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxNaXhlZCgpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTQ2OGQyLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRSZWZzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFJlZkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxNaXhlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmdUZXN0cwotCQlleHRlbmRzIEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnRSZWZzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RZUEUsIEpBWEIuWE1MX0VMRU1FTlRfUkVGUyk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEVsZW1lbnRSZWZzIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRYbWxFbGVtZW50UmVmc0Fubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKEpBWEIuWE1MX0VMRU1FTlRfUkVGUyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEVsZW1lbnRSZWZzTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJYWRkTWVtYmVyVmFsdWVQYWlyKChNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxFbGVtZW50UmVmc01lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotCQlhZGRNZW1iZXJWYWx1ZVBhaXIoKE1hcmtlckFubm90YXRpb24pIGdldFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxFbGVtZW50UmVmc1R5cGVNZW1iZXJWYWx1ZVBhaXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlTmFtZSkgewotCQlhZGRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkJKE1hcmtlckFubm90YXRpb24pIGdldFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIAotCQkJCW5hbWUsIAotCQkJCW5ld1R5cGVMaXRlcmFsKGRlY2xhcmF0aW9uLmdldEFzdCgpLCB0eXBlTmFtZSkpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxFbGVtZW50UmVmcyAqKioqKgotCQotCXByb3RlY3RlZCBOb3JtYWxBbm5vdGF0aW9uIG5ld1htbEVsZW1lbnRSZWZBbm5vdGF0aW9uKEFTVCBhc3QsIFN0cmluZyBuYW1lKSB7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IG5ld05vcm1hbEFubm90YXRpb24oYXN0LCBKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCWFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCBKQVhCLlhNTF9FTEVNRU5UX1JFRl9fTkFNRSwgbmFtZSk7Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxFbGVtZW50UmVmKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIGludCBpbmRleCwgU3RyaW5nIG5hbWUpIHsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhcnJheUVsZW1lbnQgPSBuZXdYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXRBc3QoKSwgbmFtZSk7Ci0JCWFkZEFycmF5RWxlbWVudChkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9SRUZTLCBpbmRleCwgSkFYQi5YTUxfRUxFTUVOVF9SRUZTX19WQUxVRSwgYXJyYXlFbGVtZW50KTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlWG1sRWxlbWVudFJlZihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQltb3ZlQXJyYXlFbGVtZW50KChOb3JtYWxBbm5vdGF0aW9uKSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoSkFYQi5YTUxfRUxFTUVOVF9SRUZTKSwgSkFYQi5YTUxfRUxFTUVOVF9SRUZTX19WQUxVRSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sRWxlbWVudFJlZihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmVtb3ZlQXJyYXlFbGVtZW50KChOb3JtYWxBbm5vdGF0aW9uKSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoSkFYQi5YTUxfRUxFTUVOVF9SRUZTKSwgSkFYQi5YTUxfRUxFTUVOVF9SRUZTX19WQUxVRSwgaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3luY1htbEVsZW1lbnRSZWZzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudFJlZnMoKTsKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50UmVmc01hcHBpbmcgbWFwcGluZyA9IChYbWxFbGVtZW50UmVmc01hcHBpbmcpIENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCkuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCUl0ZXJhYmxlPFhtbEVsZW1lbnRSZWY+IHhtbEVsZW1lbnRSZWZzID0gbWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoeG1sRWxlbWVudFJlZnMpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmc1NpemUoKSk7Ci0JCQotCQkvL2FkZCAyIFhtbEVsZW1lbnRSZWYgYW5ub3RhdGlvbnMKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJCi0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmdUZXN0cy50aGlzLmFkZFhtbEVsZW1lbnRSZWYoZGVjbGFyYXRpb24sIDAsICJmb28iKTsKLQkJCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nVGVzdHMudGhpcy5hZGRYbWxFbGVtZW50UmVmKGRlY2xhcmF0aW9uLCAxLCAiYmFyIik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCXhtbEVsZW1lbnRSZWZzID0gbWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShtYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgbWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEVsZW1lbnRSZWZzLCAwKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxFbGVtZW50UmVmcywgMSkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy8gc3dpdGNoIFhtbEVsZW1lbnRSZWYgYW5ub3RhdGlvbnMKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQkKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZ1Rlc3RzLnRoaXMubW92ZVhtbEVsZW1lbnRSZWYoZGVjbGFyYXRpb24sIDAsIDEpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQl4bWxFbGVtZW50UmVmcyA9IG1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmcygpOwotCQkKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkobWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxFbGVtZW50UmVmcywgMCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sRWxlbWVudFJlZnMsIDEpLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBYbWxFbGVtZW50UmVmIGFubm90YXRpb25zCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJCi0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZVhtbEVsZW1lbnRSZWYoZGVjbGFyYXRpb24sIDEpOwotCQkJCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZVhtbEVsZW1lbnRSZWYoZGVjbGFyYXRpb24sIDApOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQl4bWxFbGVtZW50UmVmcyA9IG1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmcygpOwotCQkKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eSh4bWxFbGVtZW50UmVmcykpOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sRWxlbWVudFJlZnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmcygpOwotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRSZWZzTWFwcGluZyBtYXBwaW5nID0gKFhtbEVsZW1lbnRSZWZzTWFwcGluZykgQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlYbWxFbGVtZW50UmVmc0Fubm90YXRpb24gYW5ub3RhdGlvbiA9IChYbWxFbGVtZW50UmVmc0Fubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUZTKTsKLQkJCi0JCUl0ZXJhYmxlPFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IGFubm90YXRpb24uZ2V0WG1sRWxlbWVudFJlZnMoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBhbm5vdGF0aW9uLmdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmc1NpemUoKSk7Ci0JCQotCQltYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuYWRkWG1sRWxlbWVudFJlZigwKS5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQltYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuYWRkWG1sRWxlbWVudFJlZigxKS5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUoImJheiIpOwotCQltYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuYWRkWG1sRWxlbWVudFJlZigxKS5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUoImJhciIpOwotCQkKLQkJYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uLmdldFhtbEVsZW1lbnRSZWZzKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgYW5ub3RhdGlvbi5nZXRYbWxFbGVtZW50UmVmc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBtYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIENvbGxlY3Rpb25Ub29scy5nZXQoYW5ub3RhdGlvbnMsIDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgQ29sbGVjdGlvblRvb2xzLmdldChhbm5vdGF0aW9ucywgMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KGFubm90YXRpb25zLCAyKS5nZXROYW1lKCkpOwotCQkKLQkJbWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLm1vdmVYbWxFbGVtZW50UmVmKDEsIDIpOwotCQkKLQkJYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uLmdldFhtbEVsZW1lbnRSZWZzKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgYW5ub3RhdGlvbi5nZXRYbWxFbGVtZW50UmVmc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBtYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIENvbGxlY3Rpb25Ub29scy5nZXQoYW5ub3RhdGlvbnMsIDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgQ29sbGVjdGlvblRvb2xzLmdldChhbm5vdGF0aW9ucywgMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KGFubm90YXRpb25zLCAyKS5nZXROYW1lKCkpOwotCQkKLQkJbWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLnJlbW92ZVhtbEVsZW1lbnRSZWYoMik7Ci0JCW1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5yZW1vdmVYbWxFbGVtZW50UmVmKDApOwotCQltYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkucmVtb3ZlWG1sRWxlbWVudFJlZigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBhbm5vdGF0aW9uLmdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZU1hcHBpbmdUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudFJlZnMoKTsKLQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50UmVmc01hcHBpbmcgbWFwcGluZyA9IChYbWxFbGVtZW50UmVmc01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwobWFwcGluZyk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRlMpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5YTUxfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sQXR0cmlidXRlTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGUykpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUUklCVVRFKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuWE1MX0VMRU1FTlRfUkVGU19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQltYXBwaW5nID0gKFhtbEVsZW1lbnRSZWZzTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwobWFwcGluZyk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRlMpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVFJJQlVURSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sSmF2YVR5cGVBZGFwdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudFJlZnMoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRSZWZzTWFwcGluZyBtYXBwaW5nID0gKFhtbEVsZW1lbnRSZWZzTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZShKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUikpOwotCQkKLQkJbWFwcGluZy5hZGRYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwobWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUikpOwotCQkKLQkJbWFwcGluZy5yZW1vdmVYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJCi0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sSmF2YVR5cGVBZGFwdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudFJlZnMoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRSZWZzTWFwcGluZyBtYXBwaW5nID0gKFhtbEVsZW1lbnRSZWZzTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZShKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUikpOwotCQkKLQkJLy9hZGQgYW4gWG1sSmF2YVR5cGVBZGFwdGVyIGFubm90YXRpb24KLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydE5vdE51bGwobWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUikpOwotCQkKLQkJLy9yZW1vdmUgdGhlIFhtbEphdmFUeXBlQWRhcHRlciBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZShKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sRWxlbWVudFdyYXBwZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmcygpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudFJlZnNNYXBwaW5nIG1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZnNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24geG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sRWxlbWVudFdyYXBwZXIoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKTsKLQkJCi0JCW1hcHBpbmcuYWRkWG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQlhc3NlcnROb3ROdWxsKG1hcHBpbmcuZ2V0WG1sRWxlbWVudFdyYXBwZXIoKSk7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKTsKLQkJCi0JCW1hcHBpbmcucmVtb3ZlWG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sRWxlbWVudFdyYXBwZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmcygpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudFJlZnNNYXBwaW5nIG1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZnNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24geG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sRWxlbWVudFdyYXBwZXIoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKTsKLQkJCi0JCS8vYWRkIGFuIFhtbEVsZW1lbnRXcmFwcGVyIGFubm90YXRpb24KLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJCX0KLQkJfSk7Ci0JCXhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBwaW5nLmdldFhtbEVsZW1lbnRXcmFwcGVyKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbik7Ci0JCQotCQkvL3JlbW92ZSB0aGUgWG1sRWxlbWVudFdyYXBwZXIgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJCX0KLQkJfSk7Ci0JCXhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbEVsZW1lbnRXcmFwcGVyKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxNaXhlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnRSZWZzKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50UmVmc01hcHBpbmcgbWFwcGluZyA9IChYbWxFbGVtZW50UmVmc01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCVhtbE1peGVkQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFhtbE1peGVkQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9NSVhFRCk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxNaXhlZCgpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJCi0JCW1hcHBpbmcuYWRkWG1sTWl4ZWQoKTsKLQkJYW5ub3RhdGlvbiA9IChYbWxNaXhlZEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTUlYRUQpOwotCQlhc3NlcnROb3ROdWxsKG1hcHBpbmcuZ2V0WG1sTWl4ZWQoKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCQotCQltYXBwaW5nLnJlbW92ZVhtbE1peGVkKCk7Ci0JCWFubm90YXRpb24gPSAoWG1sTWl4ZWRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX01JWEVEKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbE1peGVkKCkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxNaXhlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnRSZWZzKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50UmVmc01hcHBpbmcgbWFwcGluZyA9IChYbWxFbGVtZW50UmVmc01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCVhtbE1peGVkQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFhtbE1peGVkQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9NSVhFRCk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxNaXhlZCgpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJCi0JCS8vYWRkIGFuIFhtbE1peGVkIGFubm90YXRpb24KLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9NSVhFRCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJYW5ub3RhdGlvbiA9IChYbWxNaXhlZEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTUlYRUQpOwotCQlhc3NlcnROb3ROdWxsKG1hcHBpbmcuZ2V0WG1sTWl4ZWQoKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCQotCQkvL3JlbW92ZSB0aGUgWG1sTWl4ZWQgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX01JWEVEKTsKLQkJCQkJfQotCQkJCX0pOwotCQlhbm5vdGF0aW9uID0gKFhtbE1peGVkQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9NSVhFRCk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxNaXhlZCgpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50c01hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGUyYTIyLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50c01hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudHNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxJRFJFRkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxFbGVtZW50c01hcHBpbmdUZXN0cwotCQlleHRlbmRzIEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKAotCQkJCW5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQkJCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSwgSkFYQi5YTUxfRUxFTUVOVFMpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJCXNiLmFwcGVuZCgiQFhtbEVsZW1lbnRzIik7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sRWxlbWVudHMgKioqKioKLQkKLQlwcm90ZWN0ZWQgTm9ybWFsQW5ub3RhdGlvbiBuZXdYbWxFbGVtZW50QW5ub3RhdGlvbihBU1QgYXN0LCBTdHJpbmcgbmFtZSkgewotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSBuZXdOb3JtYWxBbm5vdGF0aW9uKGFzdCwgSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCWFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCBKQVhCLlhNTF9FTEVNRU5UX19OQU1FLCBuYW1lKTsKLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEVsZW1lbnQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgaW50IGluZGV4LCBTdHJpbmcgbmFtZSkgewotCQlOb3JtYWxBbm5vdGF0aW9uIGFycmF5RWxlbWVudCA9IG5ld1htbEVsZW1lbnRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldEFzdCgpLCBuYW1lKTsKLQkJYWRkQXJyYXlFbGVtZW50KGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9FTEVNRU5UUywgaW5kZXgsIEpBWEIuWE1MX0VMRU1FTlRTX19WQUxVRSwgYXJyYXlFbGVtZW50KTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlWG1sRWxlbWVudChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQltb3ZlQXJyYXlFbGVtZW50KChOb3JtYWxBbm5vdGF0aW9uKSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoSkFYQi5YTUxfRUxFTUVOVFMpLCBKQVhCLlhNTF9FTEVNRU5UU19fVkFMVUUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbEVsZW1lbnQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJlbW92ZUFycmF5RWxlbWVudCgoTm9ybWFsQW5ub3RhdGlvbikgZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKEpBWEIuWE1MX0VMRU1FTlRTKSwgSkFYQi5YTUxfRUxFTUVOVFNfX1ZBTFVFLCBpbmRleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jWG1sRWxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50cygpOwotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRzTWFwcGluZyBtYXBwaW5nID0gKFhtbEVsZW1lbnRzTWFwcGluZykgQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJSXRlcmFibGU8WG1sRWxlbWVudD4geG1sRWxlbWVudHMgPSBtYXBwaW5nLmdldFhtbEVsZW1lbnRzKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoeG1sRWxlbWVudHMpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcHBpbmcuZ2V0WG1sRWxlbWVudHNTaXplKCkpOwotCQkKLQkJLy9hZGQgMiBYbWxFbGVtZW50IGFubm90YXRpb25zCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IGFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCQotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nVGVzdHMudGhpcy5hZGRYbWxFbGVtZW50KGRlY2xhcmF0aW9uLCAwLCAiZm9vIik7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sRWxlbWVudChkZWNsYXJhdGlvbiwgMSwgImJhciIpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQl4bWxFbGVtZW50cyA9IG1hcHBpbmcuZ2V0WG1sRWxlbWVudHMoKTsKLQkJCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KG1hcHBpbmcuZ2V0WG1sRWxlbWVudHMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgbWFwcGluZy5nZXRYbWxFbGVtZW50c1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxFbGVtZW50cywgMCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sRWxlbWVudHMsIDEpLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIHN3aXRjaCBYbWxFbGVtZW50IGFubm90YXRpb25zCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJCi0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50c01hcHBpbmdUZXN0cy50aGlzLm1vdmVYbWxFbGVtZW50KGRlY2xhcmF0aW9uLCAwLCAxKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJeG1sRWxlbWVudHMgPSBtYXBwaW5nLmdldFhtbEVsZW1lbnRzKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShtYXBwaW5nLmdldFhtbEVsZW1lbnRzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG1hcHBpbmcuZ2V0WG1sRWxlbWVudHNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sRWxlbWVudHMsIDApLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEVsZW1lbnRzLCAxKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvLyByZW1vdmUgWG1sRWxlbWVudCBhbm5vdGF0aW9ucwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCQotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVYbWxFbGVtZW50KGRlY2xhcmF0aW9uLCAxKTsKLQkJCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVYbWxFbGVtZW50KGRlY2xhcmF0aW9uLCAwKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJeG1sRWxlbWVudHMgPSBtYXBwaW5nLmdldFhtbEVsZW1lbnRzKCk7Ci0JCQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHhtbEVsZW1lbnRzKSk7Ci0JCWFzc2VydEVxdWFscygwLCBtYXBwaW5nLmdldFhtbEVsZW1lbnRzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sRWxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50cygpOwotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRzTWFwcGluZyBtYXBwaW5nID0gKFhtbEVsZW1lbnRzTWFwcGluZykgQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlYbWxFbGVtZW50c0Fubm90YXRpb24geG1sRWxlbWVudHNBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRzQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UUyk7Ci0JCQotCQlJdGVyYWJsZTxYbWxFbGVtZW50QW5ub3RhdGlvbj4geG1sRWxlbWVudEFubm90YXRpb25zID0geG1sRWxlbWVudHNBbm5vdGF0aW9uLmdldFhtbEVsZW1lbnRzKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgeG1sRWxlbWVudHNBbm5vdGF0aW9uLmdldFhtbEVsZW1lbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcHBpbmcuZ2V0WG1sRWxlbWVudHNTaXplKCkpOwotCQkKLQkJbWFwcGluZy5hZGRYbWxFbGVtZW50KDApLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCW1hcHBpbmcuYWRkWG1sRWxlbWVudCgxKS5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUoImJheiIpOwotCQltYXBwaW5nLmFkZFhtbEVsZW1lbnQoMSkuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJiYXIiKTsKLQkJCi0JCXhtbEVsZW1lbnRBbm5vdGF0aW9ucyA9IHhtbEVsZW1lbnRzQW5ub3RhdGlvbi5nZXRYbWxFbGVtZW50cygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHhtbEVsZW1lbnRzQW5ub3RhdGlvbi5nZXRYbWxFbGVtZW50c1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBtYXBwaW5nLmdldFhtbEVsZW1lbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEVsZW1lbnRBbm5vdGF0aW9ucywgMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEVsZW1lbnRBbm5vdGF0aW9ucywgMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEVsZW1lbnRBbm5vdGF0aW9ucywgMikuZ2V0TmFtZSgpKTsKLQkJCi0JCW1hcHBpbmcubW92ZVhtbEVsZW1lbnQoMSwgMik7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbnMgPSB4bWxFbGVtZW50c0Fubm90YXRpb24uZ2V0WG1sRWxlbWVudHMoKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCB4bWxFbGVtZW50c0Fubm90YXRpb24uZ2V0WG1sRWxlbWVudHNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbWFwcGluZy5nZXRYbWxFbGVtZW50c1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxFbGVtZW50QW5ub3RhdGlvbnMsIDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxFbGVtZW50QW5ub3RhdGlvbnMsIDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxFbGVtZW50QW5ub3RhdGlvbnMsIDIpLmdldE5hbWUoKSk7Ci0JCQotCQltYXBwaW5nLnJlbW92ZVhtbEVsZW1lbnQoMik7Ci0JCW1hcHBpbmcucmVtb3ZlWG1sRWxlbWVudCgwKTsKLQkJbWFwcGluZy5yZW1vdmVYbWxFbGVtZW50KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHhtbEVsZW1lbnRzQW5ub3RhdGlvbi5nZXRYbWxFbGVtZW50c1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBtYXBwaW5nLmdldFhtbEVsZW1lbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbEphdmFUeXBlQWRhcHRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnRzKCk7Ci0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudHNNYXBwaW5nIG1hcHBpbmcgPSAoWG1sRWxlbWVudHNNYXBwaW5nKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSk7Ci0JCQotCQltYXBwaW5nLmFkZFhtbEphdmFUeXBlQWRhcHRlcigpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChtYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSk7Ci0JCQotCQltYXBwaW5nLnJlbW92ZVhtbEphdmFUeXBlQWRhcHRlcigpOwotCQkKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZShKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sSmF2YVR5cGVBZGFwdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudHMoKTsKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50c01hcHBpbmcgbWFwcGluZyA9IChYbWxFbGVtZW50c01hcHBpbmcpIENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCkuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpKTsKLQkJCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IGFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50c01hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKG1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxFbGVtZW50V3JhcHBlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnRzKCk7Ci0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudHNNYXBwaW5nIG1hcHBpbmcgPSAoWG1sRWxlbWVudHNNYXBwaW5nKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24geG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQkKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbEVsZW1lbnRXcmFwcGVyKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbik7Ci0JCQotCQltYXBwaW5nLmFkZFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCXhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJCi0JCWFzc2VydE5vdE51bGwobWFwcGluZy5nZXRYbWxFbGVtZW50V3JhcHBlcigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pOwotCQkKLQkJbWFwcGluZy5yZW1vdmVYbWxFbGVtZW50V3JhcHBlcigpOwotCQl4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gPSAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCQotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sRWxlbWVudFdyYXBwZXIoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sRWxlbWVudFdyYXBwZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50cygpOwotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRzTWFwcGluZyBtYXBwaW5nID0gKFhtbEVsZW1lbnRzTWFwcGluZykgQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJCi0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxFbGVtZW50V3JhcHBlcigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pOwotCQkKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCXhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJCi0JCWFzc2VydE5vdE51bGwobWFwcGluZy5nZXRYbWxFbGVtZW50V3JhcHBlcigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdCgKLQkJCQkJTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50c01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQkKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbEVsZW1lbnRXcmFwcGVyKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbElEUkVGKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudHMoKTsKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50c01hcHBpbmcgbWFwcGluZyA9IChYbWxFbGVtZW50c01hcHBpbmcpIENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCkuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCVhtbElEUkVGQW5ub3RhdGlvbiB4bWxJRFJFRkFubm90YXRpb24gPSAoWG1sSURSRUZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEUkVGKTsKLQkJCi0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxJRFJFRigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxJRFJFRkFubm90YXRpb24pOwotCQkKLQkJbWFwcGluZy5hZGRYbWxJRFJFRigpOwotCQl4bWxJRFJFRkFubm90YXRpb24gPSAoWG1sSURSRUZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEUkVGKTsKLQkJCi0JCWFzc2VydE5vdE51bGwobWFwcGluZy5nZXRYbWxJRFJFRigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxJRFJFRkFubm90YXRpb24pOwotCQkKLQkJbWFwcGluZy5yZW1vdmVYbWxJRFJFRigpOwotCQl4bWxJRFJFRkFubm90YXRpb24gPSAoWG1sSURSRUZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEUkVGKTsKLQkJCi0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxJRFJFRigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxJRFJFRkFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sSURSRUYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50cygpOwotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRzTWFwcGluZyBtYXBwaW5nID0gKFhtbEVsZW1lbnRzTWFwcGluZykgQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJWG1sSURSRUZBbm5vdGF0aW9uIHhtbElEUkVGQW5ub3RhdGlvbiA9IChYbWxJRFJFRkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSURSRUYpOwotCQkKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbElEUkVGKCkpOwotCQlhc3NlcnROdWxsKHhtbElEUkVGQW5ub3RhdGlvbik7Ci0JCQotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSBhbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0lEUkVGKTsKLQkJCQkJfQotCQkJCX0pOwotCQl4bWxJRFJFRkFubm90YXRpb24gPSAoWG1sSURSRUZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEUkVGKTsKLQkJCi0JCWFzc2VydE5vdE51bGwobWFwcGluZy5nZXRYbWxJRFJFRigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxJRFJFRkFubm90YXRpb24pOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9JRFJFRik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJeG1sSURSRUZBbm5vdGF0aW9uID0gKFhtbElEUkVGQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JRFJFRik7Ci0JCQotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sSURSRUYoKSk7Ci0JCWFzc2VydE51bGwoeG1sSURSRUZBbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sUm9vdEVsZW1lbnRUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFJvb3RFbGVtZW50VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzODI0MC4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sUm9vdEVsZW1lbnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxSb290RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5KYXhiQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxSb290RWxlbWVudFRlc3RzCi0JCWV4dGVuZHMgSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxSb290RWxlbWVudFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aFhtbFR5cGVXaXRoWG1sUm9vdEVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RZUEUsIEpBWEIuWE1MX1JPT1RfRUxFTUVOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFhtbFJvb3RFbGVtZW50IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbFR5cGVXaXRoWG1sUm9vdEVsZW1lbnQoKTsKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlYbWxSb290RWxlbWVudCBjb250ZXh0Um9vdEVsZW1lbnQgPSBjbGFzc01hcHBpbmcuZ2V0WG1sUm9vdEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbnRleHRSb290RWxlbWVudC5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBjb250ZXh0Um9vdEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXREZWZhdWx0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGNvbnRleHRSb290RWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCWNvbnRleHRSb290RWxlbWVudC5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWVzcGFjZSgiZm9vIik7Ci0JCVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiByb290RWxlbWVudEFubm90YXRpb24gPSAoWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJvb3RFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFJvb3RFbGVtZW50LmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRSb290RWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCWNvbnRleHRSb290RWxlbWVudC5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWVzcGFjZShudWxsKTsKLQkJcm9vdEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfUk9PVF9FTEVNRU5UKTsKLQkJYXNzZXJ0TnVsbChyb290RWxlbWVudEFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRSb290RWxlbWVudC5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBjb250ZXh0Um9vdEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxUeXBlV2l0aFhtbFJvb3RFbGVtZW50KCk7Ci0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sUm9vdEVsZW1lbnQgY29udGV4dFJvb3RFbGVtZW50ID0gY2xhc3NNYXBwaW5nLmdldFhtbFJvb3RFbGVtZW50KCk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChjb250ZXh0Um9vdEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgY29udGV4dFJvb3RFbGVtZW50LmdldFFOYW1lKCkuZ2V0RGVmYXVsdE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBjb250ZXh0Um9vdEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQkvL2FkZCBhIG5hbWVzcGFjZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VUeXBlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxSb290RWxlbWVudFRlc3RzLnRoaXMuYWRkWG1sUm9vdEVsZW1lbnRNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX1JPT1RfRUxFTUVOVF9fTkFNRVNQQUNFLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRSb290RWxlbWVudC5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0Um9vdEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFJvb3RFbGVtZW50VGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbChjbGFzc01hcHBpbmcuZ2V0WG1sUm9vdEVsZW1lbnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxUeXBlV2l0aFhtbFJvb3RFbGVtZW50KCk7Ci0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sUm9vdEVsZW1lbnQgY29udGV4dFJvb3RFbGVtZW50ID0gY2xhc3NNYXBwaW5nLmdldFhtbFJvb3RFbGVtZW50KCk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQlTdHJpbmcgZGVmYXVsdE5hbWUgPSBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKFRZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbnRleHRSb290RWxlbWVudC5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhkZWZhdWx0TmFtZSwgY29udGV4dFJvb3RFbGVtZW50LmdldFFOYW1lKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhkZWZhdWx0TmFtZSwgY29udGV4dFJvb3RFbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbnRleHRSb290RWxlbWVudC5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlYbWxSb290RWxlbWVudEFubm90YXRpb24gcm9vdEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfUk9PVF9FTEVNRU5UKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByb290RWxlbWVudEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0Um9vdEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRSb290RWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCQotCQljb250ZXh0Um9vdEVsZW1lbnQuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlyb290RWxlbWVudEFubm90YXRpb24gPSAoWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCQlhc3NlcnROdWxsKHJvb3RFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRSb290RWxlbWVudC5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhkZWZhdWx0TmFtZSwgY29udGV4dFJvb3RFbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxUeXBlV2l0aFhtbFJvb3RFbGVtZW50KCk7Ci0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sUm9vdEVsZW1lbnQgY29udGV4dFJvb3RFbGVtZW50ID0gY2xhc3NNYXBwaW5nLmdldFhtbFJvb3RFbGVtZW50KCk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQlTdHJpbmcgZGVmYXVsdE5hbWUgPSBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKFRZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbnRleHRSb290RWxlbWVudC5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhkZWZhdWx0TmFtZSwgY29udGV4dFJvb3RFbGVtZW50LmdldFFOYW1lKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhkZWZhdWx0TmFtZSwgY29udGV4dFJvb3RFbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vYWRkIGEgbmFtZXNwYWNlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVR5cGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFJvb3RFbGVtZW50VGVzdHMudGhpcy5hZGRYbWxSb290RWxlbWVudE1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfUk9PVF9FTEVNRU5UX19OQU1FLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRSb290RWxlbWVudC5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFJvb3RFbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sUm9vdEVsZW1lbnRUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX1JPT1RfRUxFTUVOVCk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRYbWxSb290RWxlbWVudCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxSb290RWxlbWVudE1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKChNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRYbWxSb290RWxlbWVudEFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKEpBWEIuWE1MX1JPT1RfRUxFTUVOVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFNjaGVtYVRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sU2NoZW1hVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmMGE0Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sU2NoZW1hVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sTnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbE5zRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxOc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFNjaGVtYUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVhtbFNjaGVtYVRlc3RzIGV4dGVuZHMgSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sU2NoZW1hVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVQYWNrYWdlSW5mb1dpdGhYbWxTY2hlbWEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0UGFja2FnZUluZm8oCi0JCQkJIkBYbWxTY2hlbWEiLAotCQkJCUpBWEIuWE1MX1NDSEVNQSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVQYWNrYWdlSW5mb1dpdGhBY2Nlc3NvclR5cGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0UGFja2FnZUluZm8oCi0JCQkJIkBYbWxBY2Nlc3NvclR5cGUodmFsdWUgPSBYbWxBY2Nlc3NUeXBlLlBST1BFUlRZKSIsCi0JCQkJSkFYQi5YTUxfQUNDRVNTX1RZUEUsIEpBWEIuWE1MX0FDQ0VTU09SX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVBhY2thZ2VJbmZvV2l0aFhtbFNjaGVtYSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCVhtbFNjaGVtYSBjb250ZXh0WG1sU2NoZW1hID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiIiwgY29udGV4dFhtbFNjaGVtYS5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JCQotCQljb250ZXh0WG1sU2NoZW1hLnNldFNwZWNpZmllZE5hbWVzcGFjZSgiZm9vIik7Ci0JCVhtbFNjaGVtYUFubm90YXRpb24gc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNjaGVtYUFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRYbWxTY2hlbWEuZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRYbWxTY2hlbWEuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCQkKLQkJIC8vc2V0IGFub3RoZXIgYW5ub3RhdGlvbiBzbyB0aGUgY29udGV4dCBtb2RlbCBpcyBub3QgYmxvd24gYXdheSBieSByZW1vdmluZyB0aGUgWG1sU2NoZW1hIGFubm90YXRpb24KLQkJY29udGV4dFBhY2thZ2VJbmZvLnNldFNwZWNpZmllZEFjY2Vzc1R5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWNvbnRleHRYbWxTY2hlbWEuc2V0U3BlY2lmaWVkTmFtZXNwYWNlKG51bGwpOwotCQlzY2hlbWFBbm5vdGF0aW9uID0gKFhtbFNjaGVtYUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NDSEVNQSk7Ci0JCWFzc2VydE51bGwoc2NoZW1hQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgY29udGV4dFhtbFNjaGVtYS5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JCQotCQkvL3NldCBuYW1lc3BhY2UgYWdhaW4sIHRoaXMgdGltZSBzdGFydGluZyB3aXRoIG5vIFhtbFNjaGVtYSBhbm5vdGF0aW9uCi0JCWNvbnRleHRYbWxTY2hlbWEuc2V0U3BlY2lmaWVkTmFtZXNwYWNlKCJmb28iKTsKLQkJc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNjaGVtYUFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRYbWxTY2hlbWEuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRYbWxTY2hlbWEuZ2V0TmFtZXNwYWNlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoWG1sU2NoZW1hKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJWG1sU2NoZW1hIGNvbnRleHRYbWxTY2hlbWEgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCIiLCBjb250ZXh0WG1sU2NoZW1hLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sU2NoZW1hLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQkJCi0JCS8vYWRkIGEgbmFtZXNwYWNlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVBhY2thZ2UpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVRlc3RzLnRoaXMuYWRkWG1sU2NoZW1hTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9TQ0hFTUFfX05BTUVTUEFDRSwgImZvbyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0WG1sU2NoZW1hLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0WG1sU2NoZW1hLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sU2NoZW1hVGVzdHMudGhpcy5yZW1vdmVYbWxTY2hlbWFBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnRleHRYbWxTY2hlbWEgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hKCk7Ci0JCWFzc2VydEVxdWFscygiIiwgY29udGV4dFhtbFNjaGVtYS5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlMb2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVQYWNrYWdlSW5mb1dpdGhYbWxTY2hlbWEoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlYbWxTY2hlbWEgY29udGV4dFhtbFNjaGVtYSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0JCi0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYS5nZXRMb2NhdGlvbigpKTsKLQkJCi0JCWNvbnRleHRYbWxTY2hlbWEuc2V0TG9jYXRpb24oImZvbyIpOwotCQlYbWxTY2hlbWFBbm5vdGF0aW9uIHNjaGVtYUFubm90YXRpb24gPSAoWG1sU2NoZW1hQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0NIRU1BKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzY2hlbWFBbm5vdGF0aW9uLmdldExvY2F0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRYbWxTY2hlbWEuZ2V0TG9jYXRpb24oKSk7Ci0JCQotCQkgLy9zZXQgYW5vdGhlciBhbm5vdGF0aW9uIHNvIHRoZSBjb250ZXh0IG1vZGVsIGlzIG5vdCBibG93biBhd2F5IGJ5IHJlbW92aW5nIHRoZSBYbWxTY2hlbWEgYW5ub3RhdGlvbgotCQljb250ZXh0UGFja2FnZUluZm8uc2V0U3BlY2lmaWVkQWNjZXNzVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJY29udGV4dFhtbFNjaGVtYS5zZXRMb2NhdGlvbihudWxsKTsKLQkJc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlhc3NlcnROdWxsKHNjaGVtYUFubm90YXRpb24uZ2V0TG9jYXRpb24oKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYS5nZXRMb2NhdGlvbigpKTsKLQotCQkvL3NldCBsb2NhdGlvbiBhZ2FpbiwgdGhpcyB0aW1lIHN0YXJ0aW5nIHdpdGggbm8gWG1sU2NoZW1hIGFubm90YXRpb24KLQkJY29udGV4dFhtbFNjaGVtYS5zZXRMb2NhdGlvbigiZm9vIik7Ci0JCXNjaGVtYUFubm90YXRpb24gPSAoWG1sU2NoZW1hQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0NIRU1BKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzY2hlbWFBbm5vdGF0aW9uLmdldExvY2F0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRYbWxTY2hlbWEuZ2V0TG9jYXRpb24oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVMb2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aFhtbFNjaGVtYSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCVhtbFNjaGVtYSBjb250ZXh0WG1sU2NoZW1hID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxTY2hlbWEuZ2V0TG9jYXRpb24oKSk7Ci0JCQotCQkvL2FkZCBhIGxvY2F0aW9uIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVBhY2thZ2UpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVRlc3RzLnRoaXMuYWRkWG1sU2NoZW1hTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9TQ0hFTUFfX0xPQ0FUSU9OLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCi0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFhtbFNjaGVtYS5nZXRMb2NhdGlvbigpKTsKLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVRlc3RzLnRoaXMucmVtb3ZlWG1sU2NoZW1hQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQljb250ZXh0WG1sU2NoZW1hID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYSgpOwotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxTY2hlbWEuZ2V0TG9jYXRpb24oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVQYWNrYWdlSW5mb1dpdGhYbWxTY2hlbWEoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlYbWxTY2hlbWEgY29udGV4dFhtbFNjaGVtYSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxTY2hlbWEuZ2V0U3BlY2lmaWVkQXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uVU5TRVQsIGNvbnRleHRYbWxTY2hlbWEuZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JCQotCQljb250ZXh0WG1sU2NoZW1hLnNldFNwZWNpZmllZEF0dHJpYnV0ZUZvcm1EZWZhdWx0KFhtbE5zRm9ybS5RVUFMSUZJRUQpOwotCQlYbWxTY2hlbWFBbm5vdGF0aW9uIHNjaGVtYUFubm90YXRpb24gPSAoWG1sU2NoZW1hQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0NIRU1BKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxOc0Zvcm0uUVVBTElGSUVELCBzY2hlbWFBbm5vdGF0aW9uLmdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sTnNGb3JtLlFVQUxJRklFRCwgY29udGV4dFhtbFNjaGVtYS5nZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpKTsKLQkJCi0JCWNvbnRleHRYbWxTY2hlbWEuc2V0U3BlY2lmaWVkQXR0cmlidXRlRm9ybURlZmF1bHQoWG1sTnNGb3JtLlVOUVVBTElGSUVEKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxOc0Zvcm0uVU5RVUFMSUZJRUQsIHNjaGVtYUFubm90YXRpb24uZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uVU5RVUFMSUZJRUQsIGNvbnRleHRYbWxTY2hlbWEuZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JCQotCQkgLy9zZXQgYW5vdGhlciBhbm5vdGF0aW9uIHNvIHRoZSBjb250ZXh0IG1vZGVsIGlzIG5vdCBibG93biBhd2F5IGJ5IHJlbW92aW5nIHRoZSBYbWxTY2hlbWEgYW5ub3RhdGlvbgotCQljb250ZXh0UGFja2FnZUluZm8uc2V0U3BlY2lmaWVkQWNjZXNzVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJY29udGV4dFhtbFNjaGVtYS5zZXRTcGVjaWZpZWRBdHRyaWJ1dGVGb3JtRGVmYXVsdChudWxsKTsKLQkJc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlhc3NlcnROdWxsKHNjaGVtYUFubm90YXRpb24uZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpKTsKLQkJCi0JCS8vc2V0IGF0dHJpYnV0ZSBmb3JtIGRlZmF1bHQgYWdhaW4sIHRoaXMgdGltZSBzdGFydGluZyB3aXRoIG5vIFhtbFNjaGVtYSBhbm5vdGF0aW9uCi0JCWNvbnRleHRYbWxTY2hlbWEuc2V0U3BlY2lmaWVkQXR0cmlidXRlRm9ybURlZmF1bHQoWG1sTnNGb3JtLlFVQUxJRklFRCk7Ci0JCXNjaGVtYUFubm90YXRpb24gPSAoWG1sU2NoZW1hQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0NIRU1BKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxOc0Zvcm0uUVVBTElGSUVELCBzY2hlbWFBbm5vdGF0aW9uLmdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sTnNGb3JtLlFVQUxJRklFRCwgY29udGV4dFhtbFNjaGVtYS5nZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoWG1sU2NoZW1hKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJWG1sU2NoZW1hIGNvbnRleHRYbWxTY2hlbWEgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sU2NoZW1hLmdldFNwZWNpZmllZEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sTnNGb3JtLlVOU0VULCBjb250ZXh0WG1sU2NoZW1hLmdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkpOwotCQkKLQkJLy9zZXQgdGhlIGF0dHJpYnV0ZSBmb3JtIGRlZmF1bHQgdmFsdWUgdG8gUVVBTElGSUVECi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVBhY2thZ2UpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVRlc3RzLnRoaXMuYWRkWG1sU2NoZW1hRW51bU1lbWJlclZhbHVlUGFpcigKLQkJCQkJZGVjbGFyYXRpb24sCi0JCQkJCUpBWEIuWE1MX1NDSEVNQV9fQVRUUklCVVRFX0ZPUk1fREVGQVVMVCwgCi0JCQkJCUpBWEIuWE1MX05TX0ZPUk1fX1FVQUxJRklFRCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbE5zRm9ybS5RVUFMSUZJRUQsIGNvbnRleHRYbWxTY2hlbWEuZ2V0U3BlY2lmaWVkQXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uUVVBTElGSUVELCBjb250ZXh0WG1sU2NoZW1hLmdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkpOwotCQkKLQkJLy9zZXQgdGhlIGF0dHJpYnV0ZSBmb3JtIGRlZmF1bHQgdmFsdWUgdG8gVU5RVUFMSUZJRUQKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxTY2hlbWFUZXN0cy50aGlzLnNldFhtbFNjaGVtYUVudW1NZW1iZXJWYWx1ZVBhaXIoCi0JCQkJCWRlY2xhcmF0aW9uLAotCQkJCQlKQVhCLlhNTF9TQ0hFTUFfX0FUVFJJQlVURV9GT1JNX0RFRkFVTFQsIAotCQkJCQlKQVhCLlhNTF9OU19GT1JNX19VTlFVQUxJRklFRCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uVU5RVUFMSUZJRUQsIGNvbnRleHRYbWxTY2hlbWEuZ2V0U3BlY2lmaWVkQXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uVU5RVUFMSUZJRUQsIGNvbnRleHRYbWxTY2hlbWEuZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVRlc3RzLnRoaXMucmVtb3ZlWG1sU2NoZW1hQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJY29udGV4dFhtbFNjaGVtYSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWEoKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sU2NoZW1hLmdldFNwZWNpZmllZEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sTnNGb3JtLlVOU0VULCBjb250ZXh0WG1sU2NoZW1hLmdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RWxlbWVudEZvcm1EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVBhY2thZ2VJbmZvV2l0aFhtbFNjaGVtYSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCVhtbFNjaGVtYSBjb250ZXh0WG1sU2NoZW1hID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQkJCi0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYS5nZXRTcGVjaWZpZWRFbGVtZW50Rm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uVU5TRVQsIGNvbnRleHRYbWxTY2hlbWEuZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkpOwotCQkKLQkJY29udGV4dFhtbFNjaGVtYS5zZXRTcGVjaWZpZWRFbGVtZW50Rm9ybURlZmF1bHQoWG1sTnNGb3JtLlFVQUxJRklFRCk7Ci0JCVhtbFNjaGVtYUFubm90YXRpb24gc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE5zRm9ybS5RVUFMSUZJRUQsIHNjaGVtYUFubm90YXRpb24uZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sTnNGb3JtLlFVQUxJRklFRCwgY29udGV4dFhtbFNjaGVtYS5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKSk7Ci0JCQotCQljb250ZXh0WG1sU2NoZW1hLnNldFNwZWNpZmllZEVsZW1lbnRGb3JtRGVmYXVsdChYbWxOc0Zvcm0uVU5RVUFMSUZJRUQpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE5zRm9ybS5VTlFVQUxJRklFRCwgc2NoZW1hQW5ub3RhdGlvbi5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uVU5RVUFMSUZJRUQsIGNvbnRleHRYbWxTY2hlbWEuZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkpOwotCQkKLQkJIC8vc2V0IGFub3RoZXIgYW5ub3RhdGlvbiBzbyB0aGUgY29udGV4dCBtb2RlbCBpcyBub3QgYmxvd24gYXdheSBieSByZW1vdmluZyB0aGUgWG1sU2NoZW1hIGFubm90YXRpb24KLQkJY29udGV4dFBhY2thZ2VJbmZvLnNldFNwZWNpZmllZEFjY2Vzc1R5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWNvbnRleHRYbWxTY2hlbWEuc2V0U3BlY2lmaWVkRWxlbWVudEZvcm1EZWZhdWx0KG51bGwpOwotCQlzY2hlbWFBbm5vdGF0aW9uID0gKFhtbFNjaGVtYUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NDSEVNQSk7Ci0JCWFzc2VydE51bGwoc2NoZW1hQW5ub3RhdGlvbi5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYS5nZXRTcGVjaWZpZWRFbGVtZW50Rm9ybURlZmF1bHQoKSk7Ci0JCQotCQkvL3NldCBlbGVtZW50IGZvcm0gZGVmYXVsdCBhZ2FpbiwgdGhpcyB0aW1lIHN0YXJ0aW5nIHdpdGggbm8gWG1sU2NoZW1hIGFubm90YXRpb24KLQkJY29udGV4dFhtbFNjaGVtYS5zZXRTcGVjaWZpZWRFbGVtZW50Rm9ybURlZmF1bHQoWG1sTnNGb3JtLlFVQUxJRklFRCk7Ci0JCXNjaGVtYUFubm90YXRpb24gPSAoWG1sU2NoZW1hQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0NIRU1BKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxOc0Zvcm0uUVVBTElGSUVELCBzY2hlbWFBbm5vdGF0aW9uLmdldEVsZW1lbnRGb3JtRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbE5zRm9ybS5RVUFMSUZJRUQsIGNvbnRleHRYbWxTY2hlbWEuZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRWxlbWVudEZvcm1EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoWG1sU2NoZW1hKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJWG1sU2NoZW1hIGNvbnRleHRYbWxTY2hlbWEgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYS5nZXRTcGVjaWZpZWRFbGVtZW50Rm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uVU5TRVQsIGNvbnRleHRYbWxTY2hlbWEuZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkpOwotCQkKLQkJLy9zZXQgdGhlIGVsZW1lbnQgZm9ybSBkZWZhdWx0IHZhbHVlIHRvIFFVQUxJRklFRAotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VQYWNrYWdlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxTY2hlbWFUZXN0cy50aGlzLmFkZFhtbFNjaGVtYUVudW1NZW1iZXJWYWx1ZVBhaXIoCi0JCQkJCWRlY2xhcmF0aW9uLAotCQkJCQlKQVhCLlhNTF9TQ0hFTUFfX0VMRU1FTlRfRk9STV9ERUZBVUxULCAKLQkJCQkJSkFYQi5YTUxfTlNfRk9STV9fUVVBTElGSUVEKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sTnNGb3JtLlFVQUxJRklFRCwgY29udGV4dFhtbFNjaGVtYS5nZXRTcGVjaWZpZWRFbGVtZW50Rm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uUVVBTElGSUVELCBjb250ZXh0WG1sU2NoZW1hLmdldEVsZW1lbnRGb3JtRGVmYXVsdCgpKTsKLQkJCi0JCS8vc2V0IHRoZSBlbGVtZW50IGZvcm0gZGVmYXVsdCB2YWx1ZSB0byBVTlFVQUxJRklFRAotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVRlc3RzLnRoaXMuc2V0WG1sU2NoZW1hRW51bU1lbWJlclZhbHVlUGFpcigKLQkJCQkJZGVjbGFyYXRpb24sCi0JCQkJCUpBWEIuWE1MX1NDSEVNQV9fRUxFTUVOVF9GT1JNX0RFRkFVTFQsIAotCQkJCQlKQVhCLlhNTF9OU19GT1JNX19VTlFVQUxJRklFRCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbE5zRm9ybS5VTlFVQUxJRklFRCwgY29udGV4dFhtbFNjaGVtYS5nZXRTcGVjaWZpZWRFbGVtZW50Rm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uVU5RVUFMSUZJRUQsIGNvbnRleHRYbWxTY2hlbWEuZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkpOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxTY2hlbWFUZXN0cy50aGlzLnJlbW92ZVhtbFNjaGVtYUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJCi0JCWNvbnRleHRYbWxTY2hlbWEgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hKCk7Ci0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYS5nZXRTcGVjaWZpZWRFbGVtZW50Rm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uVU5TRVQsIGNvbnRleHRYbWxTY2hlbWEuZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0WG1sTnNQcmVmaXhlcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aFhtbFNjaGVtYSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCVhtbFNjaGVtYSBjb250ZXh0WG1sU2NoZW1hID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQlMaXN0SXRlcmFibGU8WG1sTnM+IHhtbE5zUHJlZml4ZXMgPSBjb250ZXh0WG1sU2NoZW1hLmdldFhtbE5zUHJlZml4ZXMoKTsKLQkJYXNzZXJ0RmFsc2UoeG1sTnNQcmVmaXhlcy5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0KLQkJLy9hZGQgMiBYbWxOcyBwcmVmaXhlcwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VQYWNrYWdlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxTY2hlbWFUZXN0cy50aGlzLmFkZFhtbE5zKGRlY2xhcmF0aW9uLCAwLCAiYmFyIiwgImJhclByZWZpeCIpOwotCQkJCUdlbmVyaWNKYXZhWG1sU2NoZW1hVGVzdHMudGhpcy5hZGRYbWxOcyhkZWNsYXJhdGlvbiwgMSwgImZvbyIsICJmb29QcmVmaXgiKTsKLQkJCX0KLQkJfSk7Ci0KLQkJeG1sTnNQcmVmaXhlcyA9IGNvbnRleHRYbWxTY2hlbWEuZ2V0WG1sTnNQcmVmaXhlcygpOwotCQlMaXN0SXRlcmF0b3I8WG1sTnM+IHhtbE5zUHJlZml4ZXNJdGVyYXRvciA9IHhtbE5zUHJlZml4ZXMuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxOc1ByZWZpeGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJWG1sTnMgeG1sTnNQcmVmID0geG1sTnNQcmVmaXhlc0l0ZXJhdG9yLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxOc1ByZWYuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhclByZWZpeCIsIHhtbE5zUHJlZi5nZXRQcmVmaXgoKSk7Ci0JCXhtbE5zUHJlZiA9IHhtbE5zUHJlZml4ZXNJdGVyYXRvci5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sTnNQcmVmLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29QcmVmaXgiLCB4bWxOc1ByZWYuZ2V0UHJlZml4KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxOc1ByZWZpeGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sTnMoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgaW50IGluZGV4LCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcHJlZml4KSB7Ci0JCU5vcm1hbEFubm90YXRpb24gYXJyYXlFbGVtZW50ID0gdGhpcy5uZXdYbWxOc0Fubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0QXN0KCksIG5hbWVzcGFjZVVSSSwgcHJlZml4KTsKLQkJdGhpcy5hZGRBcnJheUVsZW1lbnQoZGVjbGFyYXRpb24sIEpBWEIuWE1MX1NDSEVNQSwgaW5kZXgsIEpBWEIuWE1MX1NDSEVNQV9fWE1MTlMsIGFycmF5RWxlbWVudCk7CQkKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9ybWFsQW5ub3RhdGlvbiBuZXdYbWxOc0Fubm90YXRpb24oQVNUIGFzdCwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHByZWZpeCkgewotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLm5ld05vcm1hbEFubm90YXRpb24oYXN0LCBKQVhCLlhNTF9OUyk7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sIEpBWEIuWE1MX05TX19OQU1FU1BBQ0VfVVJJLCBuYW1lc3BhY2VVUkkpOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCBKQVhCLlhNTF9OU19fUFJFRklYLCBwcmVmaXgpOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0WG1sTnNQcmV4aWVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aFhtbFNjaGVtYSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCVhtbFNjaGVtYSBjb250ZXh0WG1sU2NoZW1hID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgY29udGV4dFhtbFNjaGVtYS5nZXRYbWxOc1ByZWZpeGVzU2l6ZSgpKTsKLQotCQkvL2FkZCAyIFhtbE5zIHByZWZpeGVzCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVBhY2thZ2UpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVRlc3RzLnRoaXMuYWRkWG1sTnMoZGVjbGFyYXRpb24sIDAsICJiYXIiLCAiYmFyUHJlZml4Iik7Ci0JCQkJR2VuZXJpY0phdmFYbWxTY2hlbWFUZXN0cy50aGlzLmFkZFhtbE5zKGRlY2xhcmF0aW9uLCAxLCAiZm9vIiwgImZvb1ByZWZpeCIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGNvbnRleHRYbWxTY2hlbWEuZ2V0WG1sTnNQcmVmaXhlc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFhtbE5zUHJlZml4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vY3JlYXRlIGEgcGFja2FnZSBpbmZvIHdpdGggYW4gYW5ub3RhdGlvbiBvdGhlciB0aGFuIFhtbFNjaGVtYSB0byB0ZXN0Ci0JCS8vYWRkaW5nIHRoaW5ncyB0byB0aGUgbnVsbCBzY2hlbWEgYW5ub3RhdGlvbgotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yVHlwZSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCVhtbFNjaGVtYSBjb250ZXh0WG1sU2NoZW1hID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQlYbWxOcyB4bWxOc1ByZWZpeCA9IGNvbnRleHRYbWxTY2hlbWEuYWRkWG1sTnNQcmVmaXgoMCk7Ci0JCXhtbE5zUHJlZml4LnNldE5hbWVzcGFjZVVSSSgiYmFyIik7Ci0JCXhtbE5zUHJlZml4LnNldFByZWZpeCgiYmFyUHJlZml4Iik7Ci0JCXhtbE5zUHJlZml4ID0gY29udGV4dFhtbFNjaGVtYS5hZGRYbWxOc1ByZWZpeCgwKTsKLQkJeG1sTnNQcmVmaXguc2V0TmFtZXNwYWNlVVJJKCJmb28iKTsKLQkJeG1sTnNQcmVmaXguc2V0UHJlZml4KCJmb29QcmVmaXgiKTsKLQkJeG1sTnNQcmVmaXggPSBjb250ZXh0WG1sU2NoZW1hLmFkZFhtbE5zUHJlZml4KDApOwotCQl4bWxOc1ByZWZpeC5zZXROYW1lc3BhY2VVUkkoImJheiIpOwotCQl4bWxOc1ByZWZpeC5zZXRQcmVmaXgoImJhelByZWZpeCIpOwotCi0JCVhtbFNjaGVtYUFubm90YXRpb24gc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlMaXN0SXRlcmF0b3I8WG1sTnNBbm5vdGF0aW9uPiB4bWxOc1ByZWZpeGVzID0gc2NoZW1hQW5ub3RhdGlvbi5nZXRYbWxucygpLml0ZXJhdG9yKCk7Ci0KLQkJWG1sTnNBbm5vdGF0aW9uIHhtbE5zQW5ub3RhdGlvbiA9IHhtbE5zUHJlZml4ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbE5zQW5ub3RhdGlvbi5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6UHJlZml4IiwgeG1sTnNBbm5vdGF0aW9uLmdldFByZWZpeCgpKTsKLQkJeG1sTnNBbm5vdGF0aW9uID0geG1sTnNQcmVmaXhlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sTnNBbm5vdGF0aW9uLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29QcmVmaXgiLCB4bWxOc0Fubm90YXRpb24uZ2V0UHJlZml4KCkpOwotCQl4bWxOc0Fubm90YXRpb24gPSB4bWxOc1ByZWZpeGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxOc0Fubm90YXRpb24uZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhclByZWZpeCIsIHhtbE5zQW5ub3RhdGlvbi5nZXRQcmVmaXgoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbE5zUHJlZml4ZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkWG1sTnNQcmVmaXgyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoWG1sU2NoZW1hKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJWG1sU2NoZW1hIGNvbnRleHRYbWxTY2hlbWEgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCVhtbE5zIHhtbE5zUHJlZml4ID0gY29udGV4dFhtbFNjaGVtYS5hZGRYbWxOc1ByZWZpeCgwKTsKLQkJeG1sTnNQcmVmaXguc2V0TmFtZXNwYWNlVVJJKCJiYXIiKTsKLQkJeG1sTnNQcmVmaXguc2V0UHJlZml4KCJiYXJQcmVmaXgiKTsKLQkJeG1sTnNQcmVmaXggPSBjb250ZXh0WG1sU2NoZW1hLmFkZFhtbE5zUHJlZml4KDEpOwotCQl4bWxOc1ByZWZpeC5zZXROYW1lc3BhY2VVUkkoImZvbyIpOwotCQl4bWxOc1ByZWZpeC5zZXRQcmVmaXgoImZvb1ByZWZpeCIpOwotCQl4bWxOc1ByZWZpeCA9IGNvbnRleHRYbWxTY2hlbWEuYWRkWG1sTnNQcmVmaXgoMCk7Ci0JCXhtbE5zUHJlZml4LnNldE5hbWVzcGFjZVVSSSgiYmF6Iik7Ci0JCXhtbE5zUHJlZml4LnNldFByZWZpeCgiYmF6UHJlZml4Iik7Ci0KLQkJWG1sU2NoZW1hQW5ub3RhdGlvbiBzY2hlbWFBbm5vdGF0aW9uID0gKFhtbFNjaGVtYUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NDSEVNQSk7Ci0JCUxpc3RJdGVyYXRvcjxYbWxOc0Fubm90YXRpb24+IHhtbE5zUHJlZml4ZXMgPSBzY2hlbWFBbm5vdGF0aW9uLmdldFhtbG5zKCkuaXRlcmF0b3IoKTsKLQotCQlYbWxOc0Fubm90YXRpb24geG1sTnNBbm5vdGF0aW9uID0geG1sTnNQcmVmaXhlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sTnNBbm5vdGF0aW9uLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXpQcmVmaXgiLCB4bWxOc0Fubm90YXRpb24uZ2V0UHJlZml4KCkpOwotCQl4bWxOc0Fubm90YXRpb24gPSB4bWxOc1ByZWZpeGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxOc0Fubm90YXRpb24uZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhclByZWZpeCIsIHhtbE5zQW5ub3RhdGlvbi5nZXRQcmVmaXgoKSk7Ci0JCXhtbE5zQW5ub3RhdGlvbiA9IHhtbE5zUHJlZml4ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbE5zQW5ub3RhdGlvbi5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vUHJlZml4IiwgeG1sTnNBbm5vdGF0aW9uLmdldFByZWZpeCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sTnNQcmVmaXhlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVYbWxOc1ByZWZpeCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aFhtbFNjaGVtYSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCVhtbFNjaGVtYSBjb250ZXh0WG1sU2NoZW1hID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQljb250ZXh0WG1sU2NoZW1hLmFkZFhtbE5zUHJlZml4KDApLnNldE5hbWVzcGFjZVVSSSgiYmFyIik7Ci0JCWNvbnRleHRYbWxTY2hlbWEuYWRkWG1sTnNQcmVmaXgoMSkuc2V0TmFtZXNwYWNlVVJJKCJmb28iKTsKLQkJY29udGV4dFhtbFNjaGVtYS5hZGRYbWxOc1ByZWZpeCgyKS5zZXROYW1lc3BhY2VVUkkoImJheiIpOwotCi0JCVhtbFNjaGVtYUFubm90YXRpb24gc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlhc3NlcnRFcXVhbHMoMywgc2NoZW1hQW5ub3RhdGlvbi5nZXRYbWxuc1NpemUoKSk7Ci0KLQkJY29udGV4dFhtbFNjaGVtYS5yZW1vdmVYbWxOc1ByZWZpeCgxKTsKLQotCQlMaXN0SXRlcmF0b3I8WG1sTnNBbm5vdGF0aW9uPiB4bWxOc1ByZWZpeGVzID0gc2NoZW1hQW5ub3RhdGlvbi5nZXRYbWxucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sTnNQcmVmaXhlcy5uZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwkJCi0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sTnNQcmVmaXhlcy5uZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRGYWxzZSh4bWxOc1ByZWZpeGVzLmhhc05leHQoKSk7Ci0KLQkJY29udGV4dFhtbFNjaGVtYS5yZW1vdmVYbWxOc1ByZWZpeCgxKTsKLQkJeG1sTnNQcmVmaXhlcyA9IHNjaGVtYUFubm90YXRpb24uZ2V0WG1sbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbE5zUHJlZml4ZXMubmV4dCgpLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sTnNQcmVmaXhlcy5oYXNOZXh0KCkpOwotCi0JCWNvbnRleHRYbWxTY2hlbWEucmVtb3ZlWG1sTnNQcmVmaXgoMCk7Ci0JCXhtbE5zUHJlZml4ZXMgPSBzY2hlbWFBbm5vdGF0aW9uLmdldFhtbG5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoeG1sTnNQcmVmaXhlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlWG1sTnNQcmVmaXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhYbWxTY2hlbWEoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlYbWxTY2hlbWEgY29udGV4dFhtbFNjaGVtYSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0KLQkJY29udGV4dFhtbFNjaGVtYS5hZGRYbWxOc1ByZWZpeCgwKS5zZXROYW1lc3BhY2VVUkkoImJhciIpOwotCQljb250ZXh0WG1sU2NoZW1hLmFkZFhtbE5zUHJlZml4KDEpLnNldE5hbWVzcGFjZVVSSSgiZm9vIik7Ci0JCWNvbnRleHRYbWxTY2hlbWEuYWRkWG1sTnNQcmVmaXgoMikuc2V0TmFtZXNwYWNlVVJJKCJiYXoiKTsKLQotCi0JCVhtbFNjaGVtYUFubm90YXRpb24gc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCi0JCWFzc2VydEVxdWFscygzLCBzY2hlbWFBbm5vdGF0aW9uLmdldFhtbG5zU2l6ZSgpKTsJCQotCi0JCWNvbnRleHRYbWxTY2hlbWEubW92ZVhtbE5zUHJlZml4KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8WG1sTnM+IHhtbE5zUHJlZml4ZXMgPSBjb250ZXh0WG1sU2NoZW1hLmdldFhtbE5zUHJlZml4ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbE5zUHJlZml4ZXMubmV4dCgpLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxOc1ByZWZpeGVzLm5leHQoKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sTnNQcmVmaXhlcy5uZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwkJCi0JCWFzc2VydEZhbHNlKHhtbE5zUHJlZml4ZXMuaGFzTmV4dCgpKTsKLQotCQlMaXN0SXRlcmF0b3I8WG1sTnNBbm5vdGF0aW9uPiB4bWxOc0Fubm90YXRpb25zID0gc2NoZW1hQW5ub3RhdGlvbi5nZXRYbWxucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sTnNBbm5vdGF0aW9ucy5uZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbE5zQW5ub3RhdGlvbnMubmV4dCgpLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxOc0Fubm90YXRpb25zLm5leHQoKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0KLQotCQljb250ZXh0WG1sU2NoZW1hLm1vdmVYbWxOc1ByZWZpeCgwLCAxKTsKLQkJeG1sTnNQcmVmaXhlcyA9IGNvbnRleHRYbWxTY2hlbWEuZ2V0WG1sTnNQcmVmaXhlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sTnNQcmVmaXhlcy5uZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbE5zUHJlZml4ZXMubmV4dCgpLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxOc1ByZWZpeGVzLm5leHQoKS5nZXROYW1lc3BhY2VVUkkoKSk7CQkKLQkJYXNzZXJ0RmFsc2UoeG1sTnNQcmVmaXhlcy5oYXNOZXh0KCkpOwotCi0JCXhtbE5zQW5ub3RhdGlvbnMgPSBzY2hlbWFBbm5vdGF0aW9uLmdldFhtbG5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxOc0Fubm90YXRpb25zLm5leHQoKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sTnNBbm5vdGF0aW9ucy5uZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbE5zQW5ub3RhdGlvbnMubmV4dCgpLmdldE5hbWVzcGFjZVVSSSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY1htbE5zUHJlZml4ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhYbWxTY2hlbWEoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlYbWxTY2hlbWEgY29udGV4dFhtbFNjaGVtYSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0KLQkJTGlzdEl0ZXJhYmxlPFhtbE5zPiB4bWxOc1ByZWZpeGVzID0gY29udGV4dFhtbFNjaGVtYS5nZXRYbWxOc1ByZWZpeGVzKCk7Ci0JCWFzc2VydEZhbHNlKHhtbE5zUHJlZml4ZXMuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCi0JCS8vYWRkIDMgWG1sTnMgcHJlZml4ZXMKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlUGFja2FnZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sU2NoZW1hVGVzdHMudGhpcy5hZGRYbWxOcyhkZWNsYXJhdGlvbiwgMCwgImJhciIsICJiYXJQcmVmaXgiKTsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVRlc3RzLnRoaXMuYWRkWG1sTnMoZGVjbGFyYXRpb24sIDEsICJmb28iLCAiZm9vUHJlZml4Iik7Ci0JCQkJR2VuZXJpY0phdmFYbWxTY2hlbWFUZXN0cy50aGlzLmFkZFhtbE5zKGRlY2xhcmF0aW9uLCAyLCAiYmF6IiwgImJhelByZWZpeCIpOwotCQkJfQotCQl9KTsKLQotCQl4bWxOc1ByZWZpeGVzID0gY29udGV4dFhtbFNjaGVtYS5nZXRYbWxOc1ByZWZpeGVzKCk7Ci0JCUxpc3RJdGVyYXRvcjxYbWxOcz4geG1sTnNQcmVmaXhlc0l0ZXJhdG9yID0geG1sTnNQcmVmaXhlcy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHhtbE5zUHJlZml4ZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQlYbWxOcyB4bWxOc1ByZWYgPSB4bWxOc1ByZWZpeGVzSXRlcmF0b3IubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbE5zUHJlZi5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyUHJlZml4IiwgeG1sTnNQcmVmLmdldFByZWZpeCgpKTsKLQkJeG1sTnNQcmVmID0geG1sTnNQcmVmaXhlc0l0ZXJhdG9yLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxOc1ByZWYuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvb1ByZWZpeCIsIHhtbE5zUHJlZi5nZXRQcmVmaXgoKSk7Ci0JCXhtbE5zUHJlZiA9IHhtbE5zUHJlZml4ZXNJdGVyYXRvci5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sTnNQcmVmLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXpQcmVmaXgiLCB4bWxOc1ByZWYuZ2V0UHJlZml4KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxOc1ByZWZpeGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sU2NoZW1hVGVzdHMudGhpcy5tb3ZlWG1sTnNQcmVmaXgoZGVjbGFyYXRpb24sIDIsIDApOwotCQkJfQotCQl9KTsKLQotCQl4bWxOc1ByZWZpeGVzSXRlcmF0b3IgPSB4bWxOc1ByZWZpeGVzLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUoeG1sTnNQcmVmaXhlc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCXhtbE5zUHJlZiA9IHhtbE5zUHJlZml4ZXNJdGVyYXRvci5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sTnNQcmVmLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29QcmVmaXgiLCB4bWxOc1ByZWYuZ2V0UHJlZml4KCkpOwotCQl4bWxOc1ByZWYgPSB4bWxOc1ByZWZpeGVzSXRlcmF0b3IubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbE5zUHJlZi5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6UHJlZml4IiwgeG1sTnNQcmVmLmdldFByZWZpeCgpKTsKLQkJeG1sTnNQcmVmID0geG1sTnNQcmVmaXhlc0l0ZXJhdG9yLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxOc1ByZWYuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhclByZWZpeCIsIHhtbE5zUHJlZi5nZXRQcmVmaXgoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbE5zUHJlZml4ZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxTY2hlbWFUZXN0cy50aGlzLm1vdmVYbWxOc1ByZWZpeChkZWNsYXJhdGlvbiwgMCwgMSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXhtbE5zUHJlZml4ZXNJdGVyYXRvciA9IHhtbE5zUHJlZml4ZXMuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxOc1ByZWZpeGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJeG1sTnNQcmVmID0geG1sTnNQcmVmaXhlc0l0ZXJhdG9yLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxOc1ByZWYuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhelByZWZpeCIsIHhtbE5zUHJlZi5nZXRQcmVmaXgoKSk7Ci0JCXhtbE5zUHJlZiA9IHhtbE5zUHJlZml4ZXNJdGVyYXRvci5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sTnNQcmVmLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29QcmVmaXgiLCB4bWxOc1ByZWYuZ2V0UHJlZml4KCkpOwotCQl4bWxOc1ByZWYgPSB4bWxOc1ByZWZpeGVzSXRlcmF0b3IubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbE5zUHJlZi5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyUHJlZml4IiwgeG1sTnNQcmVmLmdldFByZWZpeCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sTnNQcmVmaXhlc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVRlc3RzLnRoaXMucmVtb3ZlWG1sTnNQcmVmaXgoZGVjbGFyYXRpb24sIDEpOwotCQkJfQotCQl9KTsKLQotCQl4bWxOc1ByZWZpeGVzSXRlcmF0b3IgPSB4bWxOc1ByZWZpeGVzLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUoeG1sTnNQcmVmaXhlc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCXhtbE5zUHJlZiA9IHhtbE5zUHJlZml4ZXNJdGVyYXRvci5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sTnNQcmVmLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXpQcmVmaXgiLCB4bWxOc1ByZWYuZ2V0UHJlZml4KCkpOwotCQl4bWxOc1ByZWYgPSB4bWxOc1ByZWZpeGVzSXRlcmF0b3IubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbE5zUHJlZi5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyUHJlZml4IiwgeG1sTnNQcmVmLmdldFByZWZpeCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sTnNQcmVmaXhlc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVRlc3RzLnRoaXMucmVtb3ZlWG1sTnNQcmVmaXgoZGVjbGFyYXRpb24sIDEpOwotCQkJfQotCQl9KTsKLQotCQl4bWxOc1ByZWZpeGVzSXRlcmF0b3IgPSB4bWxOc1ByZWZpeGVzLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUoeG1sTnNQcmVmaXhlc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCXhtbE5zUHJlZiA9IHhtbE5zUHJlZml4ZXNJdGVyYXRvci5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sTnNQcmVmLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXpQcmVmaXgiLCB4bWxOc1ByZWYuZ2V0UHJlZml4KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxOc1ByZWZpeGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sU2NoZW1hVGVzdHMudGhpcy5yZW1vdmVYbWxOc1ByZWZpeChkZWNsYXJhdGlvbiwgMCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXhtbE5zUHJlZml4ZXNJdGVyYXRvciA9IHhtbE5zUHJlZml4ZXMuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoeG1sTnNQcmVmaXhlc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sU2NoZW1hRW51bU1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLmFkZEVudW1NZW1iZXJWYWx1ZVBhaXIoKE1hcmtlckFubm90YXRpb24pIHRoaXMuZ2V0WG1sU2NoZW1hQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIGVsZW1lbnROYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sU2NoZW1hRW51bU1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBlbnVtVmFsdWUpIHsKLQkJdGhpcy5zZXRFbnVtTWVtYmVyVmFsdWVQYWlyKChOb3JtYWxBbm5vdGF0aW9uKSB0aGlzLmdldFhtbFNjaGVtYUFubm90YXRpb24oZGVjbGFyYXRpb24pLCBlbGVtZW50TmFtZSwgZW51bVZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxTY2hlbWFNZW1iZXJWYWx1ZVBhaXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcigoTWFya2VyQW5ub3RhdGlvbikgdGhpcy5nZXRYbWxTY2hlbWFBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgbmFtZSwgdmFsdWUpOwotCX0KLQotCS8vYWRkIGFub3RoZXIgcGFja2FnZSBhbm5vdGF0aW9uIHNvIHRoYXQgdGhlIGNvbnRleHQgbW9kZWwgb2JqZWN0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQgd2hlbiAKLQkvL3JlbW92aW5nIHRoZSBYbWxTY2hlbWEgYW5ub3RhdGlvbi4gT25seSAiYW5ub3RhdGVkIiBwYWNrYWdlcyBhcmUgYWRkZWQgdG8gdGhlIGNvbnRleHQgbW9kZWwKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxTY2hlbWFBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJdGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0FDQ0VTU09SX09SREVSKTsKLQkJdGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9TQ0hFTUEpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGdldFhtbFNjaGVtYUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKEpBWEIuWE1MX1NDSEVNQSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbW92ZVhtbE5zUHJlZml4KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMubW92ZUFycmF5RWxlbWVudCgoTm9ybWFsQW5ub3RhdGlvbikgZ2V0WG1sU2NoZW1hQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIEpBWEIuWE1MX1NDSEVNQV9fWE1MTlMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sTnNQcmVmaXgoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXRoaXMucmVtb3ZlQXJyYXlFbGVtZW50KChOb3JtYWxBbm5vdGF0aW9uKSBnZXRYbWxTY2hlbWFBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgSkFYQi5YTUxfU0NIRU1BX19YTUxOUywgaW5kZXgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxTY2hlbWFUeXBlVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxTY2hlbWFUeXBlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEyNDgyYy4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sU2NoZW1hVHlwZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sU2NoZW1hVHlwZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RVdGlsOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sU2NoZW1hVHlwZVRlc3RzIGV4dGVuZHMgSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sU2NoZW1hVHlwZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlUGFja2FnZUluZm9XaXRoWG1sU2NoZW1hVHlwZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RQYWNrYWdlSW5mbygKLQkJCQkiQFhtbFNjaGVtYVR5cGUiLAotCQkJCUpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhYbWxTY2hlbWFUeXBlKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJWG1sU2NoZW1hVHlwZSBjb250ZXh0WG1sU2NoZW1hVHlwZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWFUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxTY2hlbWFUeXBlLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbnRleHRYbWxTY2hlbWFUeXBlLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIHNjaGVtYVR5cGVBbm5vdGF0aW9uID0gKFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc2NoZW1hVHlwZUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0WG1sU2NoZW1hVHlwZS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCQotCQkgLy92ZXJpZnkgdGhlIHhtbCBzY2hlbWEgdHlwZSBhbm5vdGF0aW9uIGlzIG5vdCByZW1vdmVkIHdoZW4gdGhlIG5hbWUgaXMgc2V0IHRvIG51bGwKLQkJY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlzY2hlbWFUeXBlQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQlhc3NlcnROdWxsKHNjaGVtYVR5cGVBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aFhtbFNjaGVtYVR5cGUoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlYbWxTY2hlbWFUeXBlIGNvbnRleHRYbWxTY2hlbWFUeXBlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYVR5cGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy9hZGQgYSBuYW1lIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVBhY2thZ2UpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVR5cGVUZXN0cy50aGlzLmFkZFhtbFNjaGVtYVR5cGVNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX1NDSEVNQV9UWVBFX19OQU1FLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRYbWxTY2hlbWFUeXBlLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVR5cGVUZXN0cy50aGlzLnJlbW92ZVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWFUeXBlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aFhtbFNjaGVtYVR5cGUoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlYbWxTY2hlbWFUeXBlIGNvbnRleHRYbWxTY2hlbWFUeXBlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYVR5cGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCQotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxTY2hlbWFUeXBlLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoWFNEVXRpbC5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0UU5hbWUoKS5nZXREZWZhdWx0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoWFNEVXRpbC5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQljb250ZXh0WG1sU2NoZW1hVHlwZS5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWVzcGFjZSgiZm9vIik7Ci0JCVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIHNjaGVtYVR5cGVBbm5vdGF0aW9uID0gKFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc2NoZW1hVHlwZUFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRYbWxTY2hlbWFUeXBlLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRYbWxTY2hlbWFUeXBlLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCQkKLQkJIC8vdmVyaWZ5IHRoZSB4bWwgc2NoZW1hIHR5cGUgYW5ub3RhdGlvbiBpcyBub3QgcmVtb3ZlZCB3aGVuIHRoZSBuYW1lc3BhY2UgaXMgc2V0IHRvIG51bGwKLQkJY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lc3BhY2UobnVsbCk7Ci0JCXNjaGVtYVR5cGVBbm5vdGF0aW9uID0gKFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCWFzc2VydE51bGwoc2NoZW1hVHlwZUFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxTY2hlbWFUeXBlLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoWFNEVXRpbC5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhYbWxTY2hlbWFUeXBlKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJWG1sU2NoZW1hVHlwZSBjb250ZXh0WG1sU2NoZW1hVHlwZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWFUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxTY2hlbWFUeXBlLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoWFNEVXRpbC5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0UU5hbWUoKS5nZXREZWZhdWx0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoWFNEVXRpbC5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQkvL2FkZCBhIG5hbWVzcGFjZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VQYWNrYWdlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxTY2hlbWFUeXBlVGVzdHMudGhpcy5hZGRYbWxTY2hlbWFUeXBlTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRV9fTkFNRVNQQUNFLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRYbWxTY2hlbWFUeXBlLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRYbWxTY2hlbWFUeXBlLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxTY2hlbWFUeXBlVGVzdHMudGhpcy5yZW1vdmVYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRGYWxzZShjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hVHlwZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoWG1sU2NoZW1hVHlwZSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCVhtbFNjaGVtYVR5cGUgY29udGV4dFhtbFNjaGVtYVR5cGUgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hVHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0JCi0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0VHlwZSgpKTsKLQkJCi0JCWNvbnRleHRYbWxTY2hlbWFUeXBlLnNldFR5cGUoImZvbyIpOwotCQlYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbiBzY2hlbWFUeXBlQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNjaGVtYVR5cGVBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0VHlwZSgpKTsKLQkJCi0JCSAvL3ZlcmlmeSB0aGUgeG1sIHNjaGVtYSB0eXBlIGFubm90YXRpb24gaXMgbm90IHJlbW92ZWQgd2hlbiB0aGUgdHlwZSBpcyBzZXQgdG8gbnVsbAotCQljb250ZXh0WG1sU2NoZW1hVHlwZS5zZXRUeXBlKG51bGwpOwotCQlzY2hlbWFUeXBlQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQlhc3NlcnROdWxsKHNjaGVtYVR5cGVBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhYbWxTY2hlbWFUeXBlKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJWG1sU2NoZW1hVHlwZSBjb250ZXh0WG1sU2NoZW1hVHlwZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWFUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxTY2hlbWFUeXBlLmdldFR5cGUoKSk7Ci0JCQotCQkvL2FkZCBhIHR5cGUgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlUGFja2FnZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sU2NoZW1hVHlwZVRlc3RzLnRoaXMuYWRkWG1sU2NoZW1hVHlwZVR5cGVNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX1NDSEVNQV9UWVBFX19UWVBFLCAiU3RyaW5nIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIGNvbnRleHRYbWxTY2hlbWFUeXBlLmdldFR5cGUoKSk7Ci0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxTY2hlbWFUeXBlVGVzdHMudGhpcy5yZW1vdmVYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRGYWxzZShjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hVHlwZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sU2NoZW1hVHlwZVR5cGVNZW1iZXJWYWx1ZVBhaXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlTmFtZSkgewotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcigKLQkJCShNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgCi0JCQluYW1lLCAKLQkJCXRoaXMubmV3VHlwZUxpdGVyYWwoZGVjbGFyYXRpb24uZ2V0QXN0KCksIHR5cGVOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sU2NoZW1hVHlwZU1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKChNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgbmFtZSwgdmFsdWUpOwotCX0KLQotCS8vYWRkIGFub3RoZXIgcGFja2FnZSBhbm5vdGF0aW9uIHNvIHRoYXQgdGhlIGNvbnRleHQgbW9kZWwgb2JqZWN0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQgd2hlbiAKLQkvL3JlbW92aW5nIHRoZSBYbWxTY2hlbWFUeXBlIGFubm90YXRpb24uIE9ubHkgImFubm90YXRlZCIgcGFja2FnZXMgYXJlIGFkZGVkIHRvIHRoZSBjb250ZXh0IG1vZGVsCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sU2NoZW1hVHlwZUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfQUNDRVNTT1JfT1JERVIpOwotCQl0aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsJCQotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGdldFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFNlZUFsc29UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFNlZUFsc29UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWRlOGE5Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxTZWVBbHNvVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFNlZUFsc287Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFNlZUFsc29Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5KYXhiQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sU2VlQWxzb1Rlc3RzCi0JCWV4dGVuZHMgSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxTZWVBbHNvVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVBbm5vdGF0ZWRQZXJzaXN0ZW50Q2xhc3NXaXRoWG1sU2VlQWxzbygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSwgSkFYQi5YTUxfU0VFX0FMU08pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIiArIENSKTsKLQkJCQlzYi5hcHBlbmQoIkBYbWxTZWVBbHNvIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2xhc3NlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVBbm5vdGF0ZWRQZXJzaXN0ZW50Q2xhc3NXaXRoWG1sU2VlQWxzbygpOwotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCVhtbFNlZUFsc28gY29udGV4dFhtbFNlZUFsc28gPSBjbGFzc01hcHBpbmcuZ2V0WG1sU2VlQWxzbygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgY29udGV4dFhtbFNlZUFsc28uZ2V0Q2xhc3Nlc1NpemUoKSk7Ci0JCQotCQkvLyBhZGQgYSBjbGFzcwotCQljb250ZXh0WG1sU2VlQWxzby5hZGRDbGFzcygwLCAiZm9vIik7Ci0JCVhtbFNlZUFsc29Bbm5vdGF0aW9uIGFubm90YXRpb24gPSAoWG1sU2VlQWxzb0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NFRV9BTFNPKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFubm90YXRpb24uZ2V0Q2xhc3Nlc1NpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGFubm90YXRpb24uZ2V0Q2xhc3NlcygpLCAiZm9vIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYW5ub3RhdGlvbi5nZXRDbGFzc2VzKCksICJiYXIiKSk7Ci0JCQotCQkvLyBhZGQgYW5vdGhlcgotCQljb250ZXh0WG1sU2VlQWxzby5hZGRDbGFzcygwLCAiYmFyIik7Ci0JCWFubm90YXRpb24gPSAoWG1sU2VlQWxzb0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NFRV9BTFNPKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGFubm90YXRpb24uZ2V0Q2xhc3Nlc1NpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGFubm90YXRpb24uZ2V0Q2xhc3NlcygpLCAiZm9vIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhbm5vdGF0aW9uLmdldENsYXNzZXMoKSwgImJhciIpKTsKLQkJCi0JCSAvLyByZW1vdmUgb25lCi0JCWNvbnRleHRYbWxTZWVBbHNvLnJlbW92ZUNsYXNzKDEpOwotCQlhbm5vdGF0aW9uID0gKFhtbFNlZUFsc29Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TRUVfQUxTTyk7Ci0JCWFzc2VydEVxdWFscygxLCBhbm5vdGF0aW9uLmdldENsYXNzZXNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYW5ub3RhdGlvbi5nZXRDbGFzc2VzKCksICJmb28iKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGFubm90YXRpb24uZ2V0Q2xhc3NlcygpLCAiYmFyIikpOwotCQkKLQkJLy8gcmVtb3ZlIHRoZSBvdGhlcgotCQljb250ZXh0WG1sU2VlQWxzby5yZW1vdmVDbGFzcygwKTsKLQkJYW5ub3RhdGlvbiA9IChYbWxTZWVBbHNvQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0VFX0FMU08pOwotCQlhc3NlcnRFcXVhbHMoMCwgYW5ub3RhdGlvbi5nZXRDbGFzc2VzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGFubm90YXRpb24uZ2V0Q2xhc3NlcygpLCAiYmFyIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYW5ub3RhdGlvbi5nZXRDbGFzc2VzKCksICJmb28iKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDbGFzc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUFubm90YXRlZFBlcnNpc3RlbnRDbGFzc1dpdGhYbWxTZWVBbHNvKCk7Ci0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sU2VlQWxzbyBjb250ZXh0WG1sU2VlQWxzbyA9IGNsYXNzTWFwcGluZy5nZXRYbWxTZWVBbHNvKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVR5cGUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGNvbnRleHRYbWxTZWVBbHNvLmdldENsYXNzZXNTaXplKCkpOwotCQkKLQkJLy8gYWRkIGEgY2xhc3MKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxTZWVBbHNvVGVzdHMudGhpcy5hZGRDbGFzcyhkZWNsYXJhdGlvbiwgMCwgImZvbyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNvbnRleHRYbWxTZWVBbHNvLmdldENsYXNzZXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjb250ZXh0WG1sU2VlQWxzby5nZXRDbGFzc2VzKCksICJmb28iKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjb250ZXh0WG1sU2VlQWxzby5nZXRDbGFzc2VzKCksICJiYXIiKSk7Ci0JCQotCQkvLyBhZGQgYW5vdGhlcgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNlZUFsc29UZXN0cy50aGlzLmFkZENsYXNzKGRlY2xhcmF0aW9uLCAwLCAiYmFyIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoMiwgY29udGV4dFhtbFNlZUFsc28uZ2V0Q2xhc3Nlc1NpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGNvbnRleHRYbWxTZWVBbHNvLmdldENsYXNzZXMoKSwgImZvbyIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoY29udGV4dFhtbFNlZUFsc28uZ2V0Q2xhc3NlcygpLCAiYmFyIikpOwotCQkKLQkJIC8vIHJlbW92ZSBvbmUKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxTZWVBbHNvVGVzdHMudGhpcy5yZW1vdmVDbGFzcyhkZWNsYXJhdGlvbiwgMSk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoMSwgY29udGV4dFhtbFNlZUFsc28uZ2V0Q2xhc3Nlc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjb250ZXh0WG1sU2VlQWxzby5nZXRDbGFzc2VzKCksICJmb28iKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGNvbnRleHRYbWxTZWVBbHNvLmdldENsYXNzZXMoKSwgImJhciIpKTsKLQkJCi0JCS8vIHJlbW92ZSB0aGUgb3RoZXIKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxTZWVBbHNvVGVzdHMudGhpcy5yZW1vdmVDbGFzcyhkZWNsYXJhdGlvbiwgMCk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoMCwgY29udGV4dFhtbFNlZUFsc28uZ2V0Q2xhc3Nlc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjb250ZXh0WG1sU2VlQWxzby5nZXRDbGFzc2VzKCksICJiYXIiKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjb250ZXh0WG1sU2VlQWxzby5nZXRDbGFzc2VzKCksICJmb28iKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZENsYXNzKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIGludCBpbmRleCwgU3RyaW5nIGNsYXp6KSB7Ci0JCWFkZEFycmF5RWxlbWVudChkZWNsYXJhdGlvbiwgSkFYQi5YTUxfU0VFX0FMU08sIGluZGV4LCBKQVhCLlhNTF9TRUVfQUxTT19fVkFMVUUsIG5ld1R5cGVMaXRlcmFsKGRlY2xhcmF0aW9uLmdldEFzdCgpLCBjbGF6eikpOwkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNsYXNzKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIGludCBpbmRleCkgewotCQlyZW1vdmVBcnJheUVsZW1lbnQoKE5vcm1hbEFubm90YXRpb24pIGdldFhtbFNlZUFsc29Bbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgSkFYQi5YTUxfU0VFX0FMU09fX1ZBTFVFLCBpbmRleCk7Ci0JfQotCQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGdldFhtbFNlZUFsc29Bbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChKQVhCLlhNTF9TRUVfQUxTTyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFZhbHVlTWFwcGluZ1Rlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sVmFsdWVNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDllMDQ3Zi4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sVmFsdWVNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFZhbHVlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sVmFsdWVNYXBwaW5nVGVzdHMgZXh0ZW5kcyBKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbFZhbHVlTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aFhtbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFLCBKQVhCLlhNTF9WQUxVRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVmFsdWUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aENvbGxlY3Rpb25YbWxWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiaW1wb3J0IGphdmEudXRpbC5MaXN0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxWYWx1ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKFRZUEVfTkFNRSkuYXBwZW5kKCIgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFhtbFZhbHVlIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGxpc3Q7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCBUWVBFX05BTUUgKyAiLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VNYXBwaW5nVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbFZhbHVlKCk7Ci0KLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSAoKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApKS5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxWYWx1ZU1hcHBpbmcgeG1sVmFsdWVNYXBwaW5nID0gKFhtbFZhbHVlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbFZhbHVlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCh4bWxWYWx1ZU1hcHBpbmcpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVkFMVUUpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuWE1MX0FUVFJJQlVURV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbEF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoeG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9WQUxVRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUUklCVVRFKSk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlhNTF9WQUxVRV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQl4bWxWYWx1ZU1hcHBpbmcgPSAoWG1sVmFsdWVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxWYWx1ZU1hcHBpbmcpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVkFMVUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVFJJQlVURSkpOwotCi0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50TWFwcGluZyk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9WQUxVRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5YTUxfVkFMVUVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJeG1sVmFsdWVNYXBwaW5nID0gKFhtbFZhbHVlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoeG1sVmFsdWVNYXBwaW5nKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1ZBTFVFKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbEphdmFUeXBlQWRhcHRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbFZhbHVlKCk7Ci0KLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSAoKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApKS5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxWYWx1ZU1hcHBpbmcgbWFwcGluZyA9IChYbWxWYWx1ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpKTsKLQkJCi0JCW1hcHBpbmcuYWRkWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKG1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpKTsKLQkJCi0JCW1hcHBpbmcucmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbEphdmFUeXBlQWRhcHRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbFZhbHVlKCk7Ci0KLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSAoKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApKS5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxWYWx1ZU1hcHBpbmcgeG1sVmFsdWVNYXBwaW5nID0gKFhtbFZhbHVlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbFZhbHVlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbFZhbHVlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpKTsKLQkJCi0JCS8vYWRkIGFuIFhtbEphdmFUeXBlQWRhcHRlciBhbm5vdGF0aW9uCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sVmFsdWVNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHhtbFZhbHVlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUikpOwotCQkKLQkJLy9yZW1vdmUgdGhlIFhtbEphdmFUeXBlQWRhcHRlciBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sVmFsdWVNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxWYWx1ZU1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxMaXN0MSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbFZhbHVlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxWYWx1ZU1hcHBpbmcgeG1sTWFwcGluZyA9IChYbWxWYWx1ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHhtbE1hcHBpbmcuaXNYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbE1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCQkKLQkJeG1sTWFwcGluZy5zZXRTcGVjaWZpZWRYbWxMaXN0KHRydWUpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sTWFwcGluZy5pc0RlZmF1bHRYbWxMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHhtbE1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCQkKLQkJeG1sTWFwcGluZy5zZXRTcGVjaWZpZWRYbWxMaXN0KGZhbHNlKTsKLQkJCi0JCWFzc2VydEZhbHNlKHhtbE1hcHBpbmcuaXNYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbE1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sTGlzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhDb2xsZWN0aW9uWG1sVmFsdWUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbFZhbHVlTWFwcGluZyB4bWxNYXBwaW5nID0gKFhtbFZhbHVlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbE1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCQkKLQkJeG1sTWFwcGluZy5zZXRTcGVjaWZpZWRYbWxMaXN0KHRydWUpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydFRydWUoeG1sTWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JCQotCQl4bWxNYXBwaW5nLnNldFNwZWNpZmllZFhtbExpc3QoZmFsc2UpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbE1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sTGlzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxWYWx1ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sVmFsdWVNYXBwaW5nIHhtbE1hcHBpbmcgPSAoWG1sVmFsdWVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZSh4bWxNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sTWFwcGluZy5pc0RlZmF1bHRYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxNYXBwaW5nLmlzU3BlY2lmaWVkWG1sTGlzdCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpKTsKLQkJCi0JCS8vYWRkIGFuIFhtbExpc3QgYW5ub3RhdGlvbgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFZhbHVlTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9MSVNUKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbE1hcHBpbmcuaXNYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydFRydWUoeG1sTWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JCQotCQkvL3JlbW92ZSB0aGUgWG1sTGlzdCBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sVmFsdWVNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9MSVNUKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRGYWxzZSh4bWxNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sTWFwcGluZy5pc0RlZmF1bHRYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxNYXBwaW5nLmlzU3BlY2lmaWVkWG1sTGlzdCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbExpc3QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoQ29sbGVjdGlvblhtbFZhbHVlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxWYWx1ZU1hcHBpbmcgeG1sTWFwcGluZyA9IChYbWxWYWx1ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydFRydWUoeG1sTWFwcGluZy5pc1htbExpc3QoKSk7Ci0JCWFzc2VydFRydWUoeG1sTWFwcGluZy5pc0RlZmF1bHRYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxNYXBwaW5nLmlzU3BlY2lmaWVkWG1sTGlzdCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpKTsKLQkJCi0JCS8vYWRkIGFuIFhtbExpc3QgYW5ub3RhdGlvbgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFZhbHVlTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9MSVNUKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbE1hcHBpbmcuaXNYbWxMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHhtbE1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxNYXBwaW5nLmlzU3BlY2lmaWVkWG1sTGlzdCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpKTsKLQkJCi0JCS8vcmVtb3ZlIHRoZSBYbWxMaXN0IGFubm90YXRpb24KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxWYWx1ZU1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0xJU1QpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydFRydWUoeG1sTWFwcGluZy5pc1htbExpc3QoKSk7Ci0JCWFzc2VydFRydWUoeG1sTWFwcGluZy5pc0RlZmF1bHRYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxNYXBwaW5nLmlzU3BlY2lmaWVkWG1sTGlzdCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXhiQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXhiQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmYxOTJlLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF4YkNvcmVKYXZhQ29udGV4dE1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpheGJDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzCi0JCWV4dGVuZHMgVGVzdENhc2UgewotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKYXhiQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhRW51bUNvbnN0YW50VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFFbnVtTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhUmVnaXN0cnlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YVhtbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFQYWNrYWdlWG1sSmF2YVR5cGVBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFUeXBlWG1sSmF2YVR5cGVBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFBdHRyaWJ1dGVYbWxKYXZhVHlwZUFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YVhtbFJvb3RFbGVtZW50VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFYbWxTY2hlbWFUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YVhtbFNjaGVtYVR5cGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YVhtbFNlZUFsc29UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YVhtbFZhbHVlTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQkKLQlwcml2YXRlIEpheGJDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEpheGJQcm9qZWN0LmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEpheGJQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYTMyOWMuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RKYXhiUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVycy5DYWxsYmFja1N5bmNocm9ub3VzU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzLlN5bmNocm9ub3VzU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5zeW5jaHJvbml6ZXJzLkNhbGxiYWNrU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5zeW5jaHJvbml6ZXJzLlN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIFRoaXMgYnVpbGRzIGFuZCBob2xkcyBhICJKQVhCIiBwcm9qZWN0LgotICogU3VwcG9ydCBmb3IgYWRkaW5nIHBhY2thZ2VzIGFuZCB0eXBlcy4KLSAqIAotICogVGhlIEpQQSBwcm9qZWN0J3Mgc2V0dGluZ3MgKHBsYXRmb3JtLCBkYXRhYmFzZSBjb25uZWN0aW9uLCBldGMuKSBjYW4gYmUKLSAqIGNvbnRyb2xsZWQgYnkgYnVpbGRpbmcgYSBkYXRhIG1vZGVsIGFuZCBwYXNzaW5nIGl0IGludG8gdGhlIGNvbnN0cnVjdG9yLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdEpheGJQcm9qZWN0Ci0JCWV4dGVuZHMgVGVzdEphdmFQcm9qZWN0IHsKLQkKLQlwcml2YXRlIGZpbmFsIEpheGJQcm9qZWN0IGpheGJQcm9qZWN0OwotCQotCQotCS8vICoqKioqIHN0YXRpYyBtZXRob2RzICoqKioqCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYQl9KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkgPSAib3JnLmVjbGlwc2UuanB0LmpheGIuamFyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkgPSAib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmphciI7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgamF4Ykphck5hbWUoKSB7Ci0JCXJldHVybiBnZXRTeXN0ZW1Qcm9wZXJ0eShKQVhCX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVjbGlwc2VsaW5rSmFyTmFtZSgpIHsKLQkJcmV0dXJuIGdldFN5c3RlbVByb3BlcnR5KEVDTElQU0VMSU5LX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTeXN0ZW1Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBidWlsZGVycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUZXN0SmF4YlByb2plY3QgYnVpbGRKYXhiUHJvamVjdCgKLQkJCVN0cmluZyBiYXNlUHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkLCBJRGF0YU1vZGVsIGNvbmZpZykKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBUZXN0SmF4YlByb2plY3QoYmFzZVByb2plY3ROYW1lLCBhdXRvQnVpbGQsIGNvbmZpZyk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgVGVzdEpheGJQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzKHByb2plY3ROYW1lLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBUZXN0SmF4YlByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzKHByb2plY3ROYW1lLCBhdXRvQnVpbGQsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgVGVzdEpheGJQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQsIElEYXRhTW9kZWwgY29uZmlnKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKHByb2plY3ROYW1lLCBhdXRvQnVpbGQpOwotCQlTdHJpbmcgamF4YkZhY2V0VmVyc2lvbiA9IAotCQkJCSgoSVByb2plY3RGYWNldFZlcnNpb24pIGNvbmZpZy5nZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT04pKS5nZXRWZXJzaW9uU3RyaW5nKCk7Ci0JCXRoaXMuaW5zdGFsbEZhY2V0KEpheGJGYWNldC5JRCwgamF4YkZhY2V0VmVyc2lvbiwgY29uZmlnKTsKLQkJdGhpcy5hZGRKYXIoamF4Ykphck5hbWUoKSk7Ci0JCWlmIChlY2xpcHNlbGlua0phck5hbWUoKSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEphcihlY2xpcHNlbGlua0phck5hbWUoKSk7Ci0JCX0KLQkJdGhpcy5qYXhiUHJvamVjdCA9IEpwdEpheGJDb3JlUGx1Z2luLmdldEpheGJQcm9qZWN0KHRoaXMuZ2V0UHJvamVjdCgpKTsKLQkJdGhpcy5qYXhiUHJvamVjdC5zZXRDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIodGhpcy5idWlsZFN5bmNocm9ub3VzQ29udGV4dE1vZGVsU3luY2hyb25pemVyKCkpOwotCQl0aGlzLmpheGJQcm9qZWN0LnNldFVwZGF0ZVN5bmNocm9uaXplcih0aGlzLmJ1aWxkU3luY2hyb25vdXNVcGRhdGVTeW5jaHJvbml6ZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBTeW5jaHJvbml6ZXIgYnVpbGRTeW5jaHJvbm91c0NvbnRleHRNb2RlbFN5bmNocm9uaXplcigpIHsKLQkJcmV0dXJuIG5ldyBTeW5jaHJvbm91c1N5bmNocm9uaXplcih0aGlzLmJ1aWxkU3luY2hyb25vdXNDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXJDb21tYW5kKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGJ1aWxkU3luY2hyb25vdXNDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXJDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IFN5bmNocm9ub3VzQ29udGV4dE1vZGVsU3luY2hyb25pemVyQ29tbWFuZCgpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBTeW5jaHJvbm91c0NvbnRleHRNb2RlbFN5bmNocm9uaXplckNvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCVRlc3RKYXhiUHJvamVjdC50aGlzLmpheGJQcm9qZWN0LnN5bmNocm9uaXplQ29udGV4dE1vZGVsKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBDYWxsYmFja1N5bmNocm9uaXplciBidWlsZFN5bmNocm9ub3VzVXBkYXRlU3luY2hyb25pemVyKCkgewotCQlyZXR1cm4gbmV3IENhbGxiYWNrU3luY2hyb25vdXNTeW5jaHJvbml6ZXIodGhpcy5idWlsZFN5bmNocm9ub3VzVXBkYXRlU3luY2hyb25pemVyQ29tbWFuZCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBidWlsZFN5bmNocm9ub3VzVXBkYXRlU3luY2hyb25pemVyQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBTeW5jaHJvbm91c1VwZGF0ZVN5bmNocm9uaXplckNvbW1hbmQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgU3luY2hyb25vdXNVcGRhdGVTeW5jaHJvbml6ZXJDb21tYW5kIGltcGxlbWVudHMgQ29tbWFuZCB7Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlUZXN0SmF4YlByb2plY3QudGhpcy5qYXhiUHJvamVjdC51cGRhdGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBwdWJsaWMgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHVibGljIEpheGJQcm9qZWN0IGdldEpheGJQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5qYXhiUHJvamVjdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvSmF4YkNvcmVSZXNvdXJjZU1vZGVsVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9KYXhiQ29yZVJlc291cmNlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmZhYThkLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9KYXhiQ29yZVJlc291cmNlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLkpheGJDb3JlVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RzOwotCi0KLXB1YmxpYyBjbGFzcyBKYXhiQ29yZVJlc291cmNlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpheGJDb3JlUmVzb3VyY2VNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0KLQkJaWYgKEpheGJDb3JlVGVzdHMucmVxdWlyZWRKYXJzRXhpc3RzKCkpIHsKLQkJCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXhiSW5kZXhSZXNvdXJjZVRlc3RzLmNsYXNzKTsKLQkJCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXhiUHJvcGVydGllc1Jlc291cmNlVGVzdHMuY2xhc3MpOwotCQkJc3VpdGUuYWRkVGVzdChKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXN1aXRlLmFkZFRlc3QoVGVzdFN1aXRlLndhcm5pbmcoSmF4YkNvcmVUZXN0cy5idWlsZE1pc3NpbmdKYXJFcnJvck1lc3NhZ2UoKSkpOwotCQl9Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpheGJDb3JlUmVzb3VyY2VNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvSmF4YkluZGV4UmVzb3VyY2VUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL0pheGJJbmRleFJlc291cmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA2NjExMy4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvSmF4YkluZGV4UmVzb3VyY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXhiaW5kZXguSmF4YkluZGV4UmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF4YmluZGV4LkpheGJJbmRleFJlc291cmNlOwotCi0KLXB1YmxpYyBjbGFzcyBKYXhiSW5kZXhSZXNvdXJjZVRlc3RzCi0JCWV4dGVuZHMgQW5ub3RhdGlvblRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSkFYQl9JTkRFWCA9ICJqYXhiLmluZGV4IjsKLQkKLQkKLQlwdWJsaWMgSmF4YkluZGV4UmVzb3VyY2VUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJRmlsZSBjcmVhdGVKYXhiSW5kZXgoSVBhdGggcHJvamVjdFJlbGF0aXZlUGF0aCwgU3RyaW5nLi4uIGNsYXNzTmFtZXMpIHRocm93cyBFeGNlcHRpb24gewotCQlJRm9sZGVyIGZvbGRlciA9IGdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldEZvbGRlcihwcm9qZWN0UmVsYXRpdmVQYXRoKTsKLQkJaWYgKCEgZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQlmb2xkZXIuY3JlYXRlKHRydWUsIGZhbHNlLCBudWxsKTsKLQkJfQotCQlJRmlsZSBqYXhiSW5kZXggPSBnZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGaWxlKHByb2plY3RSZWxhdGl2ZVBhdGguYXBwZW5kKG5ldyBQYXRoKEpBWEJfSU5ERVgpKSk7Ci0JCUlucHV0U3RyZWFtIHN0cmVhbSA9IGlucHV0U3RyZWFtKGNsYXNzTmFtZXMpOwotCQlqYXhiSW5kZXguY3JlYXRlKHN0cmVhbSwgdHJ1ZSwgbnVsbCk7Ci0JCXJldHVybiBqYXhiSW5kZXg7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRDbGFzc05hbWVzKElGaWxlIGpheGJJbmRleCwgU3RyaW5nLi4uIGNsYXNzTmFtZXMpIHRocm93cyBFeGNlcHRpb24gewotCQlqYXhiSW5kZXguc2V0Q29udGVudHMoaW5wdXRTdHJlYW0oY2xhc3NOYW1lcyksIHRydWUsIGZhbHNlLCBudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbShTdHJpbmcuLi4gY2xhc3NOYW1lcykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IGNsYXNzTmFtZXMpIHsKLQkJCXNiLmFwcGVuZChjbGFzc05hbWUgKyBDUik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzYi50b1N0cmluZygpLmdldEJ5dGVzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2xhc3NlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJRmlsZSBqYXhiSW5kZXggPSBjcmVhdGVKYXhiSW5kZXgobmV3IFBhdGgoInNyYy90ZXN0IiksICJmb28iLCAiYmFyIik7Ci0JCUpheGJJbmRleFJlc291cmNlIHJlc291cmNlID0gSmF4YkluZGV4UmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCkuYnVpbGRSZXNvdXJjZU1vZGVsKGpheGJJbmRleCk7Ci0JCQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKAotCQkJCXJlc291cmNlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lcygpLCAKLQkJCQluZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KG5ldyBTdHJpbmdbXSB7InRlc3QuZm9vIiwgInRlc3QuYmFyIn0pKSk7Ci0JCQotCQlzZXRDbGFzc05hbWVzKGpheGJJbmRleCwgImZvbyIsICJiYXIiLCAiYmF6Iik7Ci0JCQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKAotCQkJCXJlc291cmNlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lcygpLCAKLQkJCQluZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KG5ldyBTdHJpbmdbXSB7InRlc3QuZm9vIiwgInRlc3QuYmFyIiwgInRlc3QuYmF6In0pKSk7Ci0JCQotCQlzZXRDbGFzc05hbWVzKGpheGJJbmRleCk7Ci0JCQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc291cmNlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lcygpKSk7Ci0JCQotCQlqYXhiSW5kZXggPSBjcmVhdGVKYXhiSW5kZXgobmV3IFBhdGgoInNyYyIpLCAiZm9vIiwgImJhciIpOwotCQlyZXNvdXJjZSA9IEpheGJJbmRleFJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLmJ1aWxkUmVzb3VyY2VNb2RlbChqYXhiSW5kZXgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbCgKLQkJCQlyZXNvdXJjZS5nZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZXMoKSwgCi0JCQkJbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihuZXcgU3RyaW5nW10geyJmb28iLCAiYmFyIn0pKSk7Ci0JCQotCQlzZXRDbGFzc05hbWVzKGpheGJJbmRleCwgImZvbyIsICJiYXIiLCAiYmF6Iik7Ci0JCQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKAotCQkJCXJlc291cmNlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lcygpLCAKLQkJCQluZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KG5ldyBTdHJpbmdbXSB7ImZvbyIsICJiYXIiLCAiYmF6In0pKSk7Ci0JCQotCQlzZXRDbGFzc05hbWVzKGpheGJJbmRleCk7Ci0JCQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc291cmNlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lcygpKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL0pheGJQcm9wZXJ0aWVzUmVzb3VyY2VUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL0pheGJQcm9wZXJ0aWVzUmVzb3VyY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzA2ODRmLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9KYXhiUHJvcGVydGllc1Jlc291cmNlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGlvblRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF4YnByb3BzLkpheGJQcm9wZXJ0aWVzUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF4YnByb3BzLkpheGJQcm9wZXJ0aWVzUmVzb3VyY2U7Ci0KLQotcHVibGljIGNsYXNzIEpheGJQcm9wZXJ0aWVzUmVzb3VyY2VUZXN0cwotCQlleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEpBWEJfUFJPUEVSVElFUyA9ICJqYXhiLnByb3BlcnRpZXMiOwotCQotCQotCXB1YmxpYyBKYXhiUHJvcGVydGllc1Jlc291cmNlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUZpbGUgY3JlYXRlSmF4YlByb3BlcnRpZXMoSVBhdGggcHJvamVjdFJlbGF0aXZlUGF0aCwgU3RyaW5nW10gLi4uIHByb3BlcnR5VmFsdWVQYWlycykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlGb2xkZXIgZm9sZGVyID0gZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKHByb2plY3RSZWxhdGl2ZVBhdGgpOwotCQlpZiAoISBmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCWZvbGRlci5jcmVhdGUodHJ1ZSwgZmFsc2UsIG51bGwpOwotCQl9Ci0JCUlGaWxlIGpheGJQcm9wZXJ0aWVzID0gZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0RmlsZShwcm9qZWN0UmVsYXRpdmVQYXRoLmFwcGVuZChuZXcgUGF0aChKQVhCX1BST1BFUlRJRVMpKSk7Ci0JCUlucHV0U3RyZWFtIHN0cmVhbSA9IGlucHV0U3RyZWFtKHByb3BlcnR5VmFsdWVQYWlycyk7Ci0JCWpheGJQcm9wZXJ0aWVzLmNyZWF0ZShzdHJlYW0sIHRydWUsIG51bGwpOwotCQlyZXR1cm4gamF4YlByb3BlcnRpZXM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRQcm9wZXJ0aWVzKElGaWxlIGpheGJQcm9wZXJ0aWVzLCBTdHJpbmdbXSAuLi4gcHJvcGVydHlWYWx1ZVBhaXJzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJamF4YlByb3BlcnRpZXMuc2V0Q29udGVudHMoaW5wdXRTdHJlYW0ocHJvcGVydHlWYWx1ZVBhaXJzKSwgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCX0KLQkKLQlwcml2YXRlIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKFN0cmluZ1tdIC4uLiBwcm9wZXJ0eVZhbHVlUGFpcnMpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKFN0cmluZ1tdIHByb3BlcnR5VmFsdWVQYWlyIDogcHJvcGVydHlWYWx1ZVBhaXJzKSB7Ci0JCQlzYi5hcHBlbmQocHJvcGVydHlWYWx1ZVBhaXJbMF0gKyAiPSIgKyBwcm9wZXJ0eVZhbHVlUGFpclsxXSArIENSKTsKLQkJfQotCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlGaWxlIGpheGJQcm9wZXJ0aWVzID0gY3JlYXRlSmF4YlByb3BlcnRpZXMobmV3IFBhdGgoInNyYy90ZXN0IiksIG5ldyBTdHJpbmdbXSB7ImZvbyIsICJmb29Qcm9wIn0sIG5ldyBTdHJpbmdbXSB7ImJhciIsICJiYXJQcm9wIn0pOwotCQlKYXhiUHJvcGVydGllc1Jlc291cmNlIHJlc291cmNlID0gSmF4YlByb3BlcnRpZXNSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKS5idWlsZFJlc291cmNlTW9kZWwoamF4YlByb3BlcnRpZXMpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHJlc291cmNlLmdldFByb3BlcnR5KCJmb28iKSwgImZvb1Byb3AiKTsKLQkJYXNzZXJ0RXF1YWxzKHJlc291cmNlLmdldFByb3BlcnR5KCJiYXIiKSwgImJhclByb3AiKTsKLQkJCi0JCXNldFByb3BlcnRpZXMoamF4YlByb3BlcnRpZXMsIG5ldyBTdHJpbmdbXSB7ImZvbyIsICJmb29Qcm9wMiJ9LCBuZXcgU3RyaW5nW10geyJiYXoiLCAiYmF6UHJvcCJ9KTsKLQkJCi0JCWFzc2VydEVxdWFscyhyZXNvdXJjZS5nZXRQcm9wZXJ0eSgiZm9vIiksICJmb29Qcm9wMiIpOwotCQlhc3NlcnROdWxsKHJlc291cmNlLmdldFByb3BlcnR5KCJiYXIiKSk7Ci0JCWFzc2VydEVxdWFscyhyZXNvdXJjZS5nZXRQcm9wZXJ0eSgiYmF6IiksICJiYXpQcm9wIik7Ci0JCQotCQlzZXRQcm9wZXJ0aWVzKGpheGJQcm9wZXJ0aWVzKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2UuZ2V0UHJvcGVydHkoImZvbyIpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZS5nZXRQcm9wZXJ0eSgiYmFyIikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlLmdldFByb3BlcnR5KCJiYXoiKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNDI3MjEuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuamF4YjIxLkdlbmVyaWNKYXhiXzJfMV9QbGF0Zm9ybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF4YlByb2plY3Q7Ci0KLXB1YmxpYyBjbGFzcyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZQotCQlleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewkKLQotCXB1YmxpYyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5qYXZhUHJvamVjdC5hZGRKYXIoVGVzdEpheGJQcm9qZWN0LmpheGJKYXJOYW1lKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkRlZmluaXRpb25bXSBhbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBHZW5lcmljSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uLmluc3RhbmNlKCkuZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25zKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uW10gbmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBHZW5lcmljSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uLmluc3RhbmNlKCkuZ2V0TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM4NjRmMi4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxBY2Nlc3Nvck9yZGVyUGFja2FnZUFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxBY2Nlc3Nvck9yZGVyVHlwZUFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxBY2Nlc3NvclR5cGVQYWNrYWdlQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbEFjY2Vzc29yVHlwZVR5cGVBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sQW55QXR0cmlidXRlQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbEFueUVsZW1lbnRBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sQXR0YWNobWVudFJlZkFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sRWxlbWVudEFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxFbGVtZW50RGVjbEFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxFbGVtZW50UmVmQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbEVsZW1lbnRzQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbEVudW1Bbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sRW51bVZhbHVlQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbElEQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbElEUkVGQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbElubGluZUJpbmFyeURhdGFBdHRyaWJ1dGVBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sSW5saW5lQmluYXJ5RGF0YVR5cGVBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sSmF2YVR5cGVBZGFwdGVyUGFja2FnZUFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxKYXZhVHlwZUFkYXB0ZXJUeXBlQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbExpc3RBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sTWltZVR5cGVBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sTWl4ZWRBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sUmVnaXN0cnlBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sU2NoZW1hQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbFNjaGVtYVR5cGVBdHRyaWJ1dGVBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sU2NoZW1hVHlwZVBhY2thZ2VBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sU2VlQWxzb0Fubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxUcmFuc2llbnRBdHRyaWJ1dGVBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sVHJhbnNpZW50VHlwZUFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxUeXBlQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbFZhbHVlQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxBY2Nlc3Nvck9yZGVyUGFja2FnZUFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzb3JPcmRlclBhY2thZ2VBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJjYjczYy4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxBY2Nlc3Nvck9yZGVyUGFja2FnZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sQWNjZXNzb3JPcmRlclBhY2thZ2VBbm5vdGF0aW9uVGVzdHMKLQkJZXh0ZW5kcyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFhtbEFjY2Vzc29yT3JkZXJQYWNrYWdlQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlUGFja2FnZUluZm9XaXRoQWNjZXNzb3JPcmRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RQYWNrYWdlSW5mbygKLQkJCQkiQFhtbEFjY2Vzc29yT3JkZXIoWG1sQWNjZXNzT3JkZXIuVU5ERUZJTkVEKSIsCi0JCQkJSkFYQi5YTUxfQUNDRVNTX09SREVSLCBKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIAotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlUGFja2FnZUluZm9XaXRoQWNjZXNzb3JPcmRlcigpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGJ1aWxkSmF2YVJlc291cmNlUGFja2FnZShjdSk7IAotCQkKLQkJWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQUNDRVNTT1JfT1JERVIpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuVU5ERUZJTkVELCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShYbWxBY2Nlc3NPcmRlci5BTFBIQUJFVElDQUwpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuQUxQSEFCRVRJQ0FMLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEFjY2Vzc29yT3JkZXIoQUxQSEFCRVRJQ0FMKSIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWFubm90YXRpb24gPSAoWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FDQ0VTU09SX09SREVSKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbEFjY2Vzc29yT3JkZXIoIiwgY3UpOwotCQkKLS8vCQlUT0RPIHVuY29tbWVudCB3aGVuIGJ1ZyAzMjg0MDAgaXMgYWRkcmVzc2VkCi0vLwkJYW5ub3RhdGlvbiA9IChYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbikgcGFja2FnZVJlc291cmNlLmFkZEFubm90YXRpb24oSkFYQi5YTUxfQUNDRVNTT1JfT1JERVIpOwotLy8JCWFubm90YXRpb24uc2V0VmFsdWUoWG1sQWNjZXNzT3JkZXIuVU5ERUZJTkVEKTsKLS8vCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuVU5ERUZJTkVELCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotLy8JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sQWNjZXNzb3JPcmRlcihVTkRFRklORUQpIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEFjY2Vzc29yT3JkZXJUeXBlQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxBY2Nlc3Nvck9yZGVyVHlwZUFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTE4YzkxLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEFjY2Vzc29yT3JkZXJUeXBlQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbEFjY2Vzc29yT3JkZXJUeXBlQW5ub3RhdGlvblRlc3RzCi0JCWV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBYbWxBY2Nlc3Nvck9yZGVyVHlwZUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEFjY2Vzc29yT3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0FDQ0VTU09SX09SREVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sQWNjZXNzb3JPcmRlciIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEFjY2Vzc29yT3JkZXJXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0FDQ0VTU09SX09SREVSLCBKQVhCLlhNTF9BQ0NFU1NfT1JERVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxBY2Nlc3Nvck9yZGVyKHZhbHVlID0gWG1sQWNjZXNzT3JkZXIuQUxQSEFCRVRJQ0FMKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sQWNjZXNzb3JPcmRlcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uIHhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uID0gKFhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUik7Ci0JCWFzc2VydFRydWUoeG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxBY2Nlc3Nvck9yZGVyV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQotCQlYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbiB4bWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbiA9IChYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQUNDRVNTT1JfT1JERVIpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuQUxQSEFCRVRJQ0FMLCB4bWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEFjY2Vzc29yT3JkZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCi0JCVhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uIHhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uID0gKFhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUik7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB4bWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQl4bWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbi5zZXRWYWx1ZShYbWxBY2Nlc3NPcmRlci5VTkRFRklORUQpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuVU5ERUZJTkVELCB4bWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEFjY2Vzc29yT3JkZXIoVU5ERUZJTkVEKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxBY2Nlc3Nvck9yZGVyV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQotCQlYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbiB4bWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbiA9IChYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQUNDRVNTT1JfT1JERVIpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuQUxQSEFCRVRJQ0FMLCB4bWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQl4bWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxBY2Nlc3NvclR5cGVQYWNrYWdlQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxBY2Nlc3NvclR5cGVQYWNrYWdlQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjM2U3MzcuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzb3JUeXBlUGFja2FnZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc29yVHlwZUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbEFjY2Vzc29yVHlwZVBhY2thZ2VBbm5vdGF0aW9uVGVzdHMKLQkJZXh0ZW5kcyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFhtbEFjY2Vzc29yVHlwZVBhY2thZ2VBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVQYWNrYWdlSW5mb1dpdGhBY2Nlc3NvclR5cGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0UGFja2FnZUluZm8oCi0JCQkJIkBYbWxBY2Nlc3NvclR5cGUodmFsdWUgPSBYbWxBY2Nlc3NUeXBlLlBST1BFUlRZKSIsCi0JCQkJSkFYQi5YTUxfQUNDRVNTX1RZUEUsIEpBWEIuWE1MX0FDQ0VTU09SX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSAKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGJ1aWxkSmF2YVJlc291cmNlUGFja2FnZShjdSk7IAotCQkKLQkJWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FDQ0VTU09SX1RZUEUpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBST1BFUlRZLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShYbWxBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuRklFTEQsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sQWNjZXNzb3JUeXBlKHZhbHVlID0gRklFTEQpIiwgY3UpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShYbWxBY2Nlc3NUeXBlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5OT05FLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEFjY2Vzc29yVHlwZSh2YWx1ZSA9IE5PTkUpIiwgY3UpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShYbWxBY2Nlc3NUeXBlLlBVQkxJQ19NRU1CRVIpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEFjY2Vzc29yVHlwZSh2YWx1ZSA9IFBVQkxJQ19NRU1CRVIpIiwgY3UpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxBY2Nlc3NvclR5cGUoIiwgY3UpOwotCQkKLS8vCQlUT0RPIHVuY29tbWVudCB3aGVuIGJ1ZyAzMjg0MDAgaXMgYWRkcmVzc2VkCi0vLwkJYW5ub3RhdGlvbiA9IChYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKSBwYWNrYWdlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFKTsKLS8vCQlhbm5vdGF0aW9uLnNldFZhbHVlKFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotLy8JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBST1BFUlRZLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotLy8JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sQWNjZXNzb3JUeXBlKFBST1BFUlRZKSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxBY2Nlc3NvclR5cGVUeXBlQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxBY2Nlc3NvclR5cGVUeXBlQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjN2M0ZjMuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzb3JUeXBlVHlwZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc29yVHlwZUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbEFjY2Vzc29yVHlwZVR5cGVBbm5vdGF0aW9uVGVzdHMKLQkJZXh0ZW5kcyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFhtbEFjY2Vzc29yVHlwZVR5cGVBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxBY2Nlc3NvclR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0FDQ0VTU09SX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxBY2Nlc3NvclR5cGUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxBY2Nlc3NvclR5cGVXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0FDQ0VTU09SX1RZUEUsIEpBWEIuWE1MX0FDQ0VTU19UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sQWNjZXNzb3JUeXBlKHZhbHVlID0gWG1sQWNjZXNzVHlwZS5GSUVMRCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEFjY2Vzc29yVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24geG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbiA9IChYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxBY2Nlc3NvclR5cGVXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCi0JCVhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24geG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbiA9IChYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuRklFTEQsIHhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxBY2Nlc3NvclR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCi0JCVhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24geG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbiA9IChYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJeG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbi5zZXRWYWx1ZShYbWxBY2Nlc3NUeXBlLlBVQkxJQ19NRU1CRVIpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSLCB4bWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sQWNjZXNzb3JUeXBlKFBVQkxJQ19NRU1CRVIpIiwgY3UpOwotCi0JCXhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24uc2V0VmFsdWUoWG1sQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBST1BFUlRZLCB4bWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sQWNjZXNzb3JUeXBlKFBST1BFUlRZKSIsIGN1KTsKLQotCQl4bWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uLnNldFZhbHVlKFhtbEFjY2Vzc1R5cGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLk5PTkUsIHhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxBY2Nlc3NvclR5cGUoTk9ORSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sQWNjZXNzb3JUeXBlV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQotCQlYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uIHhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24gPSAoWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQUNDRVNTT1JfVFlQRSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLkZJRUxELCB4bWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCi0JCXhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbEFjY2Vzc29yVHlwZSgiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQW55QXR0cmlidXRlQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1OGUxOS4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFueUF0dHJpYnV0ZUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbEFueUF0dHJpYnV0ZUFubm90YXRpb25UZXN0cyBleHRlbmRzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBYbWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxBbnlBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0FOWV9BVFRSSUJVVEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxBbnlBdHRyaWJ1dGUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFhtbEFueUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sQW55QXR0cmlidXRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uIHhtbEFueUF0dHJpYnV0ZUFubm90YXRpb24gPSAoWG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BTllfQVRUUklCVVRFKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uICE9IG51bGwpOwotCi0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oSkFYQi5YTUxfQU5ZX0FUVFJJQlVURSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sQW55QXR0cmlidXRlIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEFueUVsZW1lbnRBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEFueUVsZW1lbnRBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FlODcxMy4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxBbnlFbGVtZW50QW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQW55RWxlbWVudEFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbEFueUVsZW1lbnRBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0FOWV9FTEVNRU5UX1ZBTFVFID0gIlN0cmluZyI7Ci0KLQlwdWJsaWMgWG1sQW55RWxlbWVudEFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEFueUVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0FOWV9FTEVNRU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sQW55RWxlbWVudCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEFueUVsZW1lbnRXaXRoQm9vbGVhbkVsZW1lbnQoZmluYWwgU3RyaW5nIGJvb2xlYW5FbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0FOWV9FTEVNRU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sQW55RWxlbWVudCgiICsgYm9vbGVhbkVsZW1lbnQgKyAiID0gdHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxBbnlFbGVtZW50V2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9BTllfRUxFTUVOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEFueUVsZW1lbnQodmFsdWUgPSAiICsgWE1MX0FOWV9FTEVNRU5UX1ZBTFVFICArICIuY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxBbnlFbGVtZW50KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxBbnlFbGVtZW50QW5ub3RhdGlvbiB4bWxBbnlFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxBbnlFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BTllfRUxFTUVOVCk7Ci0JCWFzc2VydFRydWUoeG1sQW55RWxlbWVudEFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sQW55RWxlbWVudEFubm90YXRpb24uZ2V0TGF4KCkpOwotCQlhc3NlcnROdWxsKHhtbEFueUVsZW1lbnRBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRMYXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEFueUVsZW1lbnRXaXRoQm9vbGVhbkVsZW1lbnQoImxheCIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEFueUVsZW1lbnRBbm5vdGF0aW9uIHhtbEFueUVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbEFueUVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FOWV9FTEVNRU5UKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxBbnlFbGVtZW50QW5ub3RhdGlvbi5nZXRMYXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldExheCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sQW55RWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEFueUVsZW1lbnRBbm5vdGF0aW9uIHhtbEFueUVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbEFueUVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FOWV9FTEVNRU5UKTsKLQotCQlhc3NlcnROb3ROdWxsKHhtbEFueUVsZW1lbnRBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0TnVsbCh4bWxBbnlFbGVtZW50QW5ub3RhdGlvbi5nZXRMYXgoKSk7Ci0KLQkJeG1sQW55RWxlbWVudEFubm90YXRpb24uc2V0TGF4KEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgeG1sQW55RWxlbWVudEFubm90YXRpb24uZ2V0TGF4KCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sQW55RWxlbWVudChsYXggPSBmYWxzZSkiLCBjdSk7Ci0KLQkJeG1sQW55RWxlbWVudEFubm90YXRpb24uc2V0TGF4KG51bGwpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEFueUVsZW1lbnQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJsYXgiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxBbnlFbGVtZW50V2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxBbnlFbGVtZW50QW5ub3RhdGlvbiB4bWxBbnlFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxBbnlFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BTllfRUxFTUVOVCk7Ci0JCWFzc2VydFRydWUoeG1sQW55RWxlbWVudEFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfQU5ZX0VMRU1FTlRfVkFMVUUsIHhtbEFueUVsZW1lbnRBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy4iICsgWE1MX0FOWV9FTEVNRU5UX1ZBTFVFLCB4bWxBbnlFbGVtZW50QW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sQW55RWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sQW55RWxlbWVudEFubm90YXRpb24geG1sQW55RWxlbWVudEFubm90YXRpb24gPSAoWG1sQW55RWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQU5ZX0VMRU1FTlQpOwotCQlhc3NlcnROdWxsKHhtbEFueUVsZW1lbnRBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQl4bWxBbnlFbGVtZW50QW5ub3RhdGlvbi5zZXRWYWx1ZShYTUxfQU5ZX0VMRU1FTlRfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0FOWV9FTEVNRU5UX1ZBTFVFLCB4bWxBbnlFbGVtZW50QW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEFueUVsZW1lbnQoIiArIFhNTF9BTllfRUxFTUVOVF9WQUxVRSAgKyAiLmNsYXNzKSIsIGN1KTsKLQotCQl4bWxBbnlFbGVtZW50QW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxBbnlFbGVtZW50QW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEFueUVsZW1lbnQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sQW55RWxlbWVudCh2YWx1ZSA9ICIgKyBYTUxfQU5ZX0VMRU1FTlRfVkFMVUUgICsgIi5jbGFzcykiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQXR0YWNobWVudFJlZkFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQXR0YWNobWVudFJlZkFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjEwZDA3Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIFhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxBdHRhY2htZW50UmVmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEF0dGFjaG1lbnRSZWYiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFhtbEF0dGFjaG1lbnRSZWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEF0dGFjaG1lbnRSZWYoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCi0JCVhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uIHhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uID0gKFhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVEFDSE1FTlRfUkVGKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiAhPSBudWxsKTsKLQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVEFDSE1FTlRfUkVGKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxBdHRhY2htZW50UmVmIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEF0dHJpYnV0ZUFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQXR0cmlidXRlQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNTI3MjkuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQXR0cmlidXRlQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQXR0cmlidXRlQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sQXR0cmlidXRlQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9BVFRSSUJVVEVfTkFNRSA9ICJlbGVtZW50TmFtZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9BVFRSSUJVVEVfTkFNRVNQQUNFID0gIlhtbEF0dHJpYnV0ZU5hbWVzcGFjZSI7Ci0KLQlwdWJsaWMgWG1sQXR0cmlidXRlQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxBdHRyaWJ1dGUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxBdHRyaWJ1dGVXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0WG1sQXR0cmlidXRlV2l0aFN0cmluZ0VsZW1lbnQoIm5hbWUiLCBYTUxfQVRUUklCVVRFX05BTUUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sQXR0cmlidXRlV2l0aE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0WG1sQXR0cmlidXRlV2l0aFN0cmluZ0VsZW1lbnQoIm5hbWVzcGFjZSIsIFhNTF9BVFRSSUJVVEVfTkFNRVNQQUNFKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEF0dHJpYnV0ZVdpdGhTdHJpbmdFbGVtZW50KGZpbmFsIFN0cmluZyBlbGVtZW50LCBmaW5hbCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sQXR0cmlidXRlKCIgKyBlbGVtZW50ICsgIiA9IFwiIiArIHZhbHVlICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEF0dHJpYnV0ZVdpdGhCb29sZWFuRWxlbWVudChmaW5hbCBTdHJpbmcgYm9vbGVhbkVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sQXR0cmlidXRlKCIgKyBib29sZWFuRWxlbWVudCArICIgPSB0cnVlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sQXR0cmlidXRlV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCi0JCVhtbEF0dHJpYnV0ZUFubm90YXRpb24geG1sQXR0cmlidXRlQW5ub3RhdGlvbiA9IChYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCWFzc2VydFRydWUoeG1sQXR0cmlidXRlQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9BVFRSSUJVVEVfTkFNRSwgeG1sQXR0cmlidXRlQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxBdHRyaWJ1dGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCi0JCVhtbEF0dHJpYnV0ZUFubm90YXRpb24geG1sQXR0cmlidXRlQW5ub3RhdGlvbiA9IChYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCWFzc2VydFRydWUoeG1sQXR0cmlidXRlQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlQW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sQXR0cmlidXRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uIHhtbEF0dHJpYnV0ZUFubm90YXRpb24gPSAoWG1sQXR0cmlidXRlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQlhc3NlcnROdWxsKHhtbEF0dHJpYnV0ZUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJeG1sQXR0cmlidXRlQW5ub3RhdGlvbi5zZXROYW1lKFhNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhYTUxfQVRUUklCVVRFX05BTUUsIHhtbEF0dHJpYnV0ZUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEF0dHJpYnV0ZShuYW1lID0gXCIiICsgWE1MX0FUVFJJQlVURV9OQU1FICsgIlwiKSIsIGN1KTsKLQotCQl4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sQXR0cmlidXRlIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbEF0dHJpYnV0ZShuYW1lID0gXCIiICsgWE1MX0FUVFJJQlVURV9OQU1FICsgIlwiKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxBdHRyaWJ1dGVXaXRoTmFtZXNwYWNlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uIHhtbEF0dHJpYnV0ZUFubm90YXRpb24gPSAoWG1sQXR0cmlidXRlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQlhc3NlcnRUcnVlKHhtbEF0dHJpYnV0ZUFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfQVRUUklCVVRFX05BTUVTUEFDRSwgeG1sQXR0cmlidXRlQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sQXR0cmlidXRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uIHhtbEF0dHJpYnV0ZUFubm90YXRpb24gPSAoWG1sQXR0cmlidXRlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQlhc3NlcnROdWxsKHhtbEF0dHJpYnV0ZUFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQl4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uLnNldE5hbWVzcGFjZShYTUxfQVRUUklCVVRFX05BTUVTUEFDRSk7Ci0JCWFzc2VydEVxdWFscyhYTUxfQVRUUklCVVRFX05BTUVTUEFDRSwgeG1sQXR0cmlidXRlQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxBdHRyaWJ1dGUobmFtZXNwYWNlID0gXCIiICsgWE1MX0FUVFJJQlVURV9OQU1FU1BBQ0UgKyAiXCIpIiwgY3UpOwotCi0JCXhtbEF0dHJpYnV0ZUFubm90YXRpb24uc2V0TmFtZXNwYWNlKG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEF0dHJpYnV0ZUFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sQXR0cmlidXRlIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbEF0dHJpYnV0ZShuYW1lc3BhY2UgPSBcIiIgKyBYTUxfQVRUUklCVVRFX05BTUVTUEFDRSArICJcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFJlcXVpcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxBdHRyaWJ1dGVXaXRoQm9vbGVhbkVsZW1lbnQoInJlcXVpcmVkIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sQXR0cmlidXRlQW5ub3RhdGlvbiB4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uID0gKFhtbEF0dHJpYnV0ZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUUklCVVRFKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uLmdldFJlcXVpcmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZXF1aXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sQXR0cmlidXRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sQXR0cmlidXRlQW5ub3RhdGlvbiB4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uID0gKFhtbEF0dHJpYnV0ZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUUklCVVRFKTsKLQotCQlhc3NlcnROb3ROdWxsKHhtbEF0dHJpYnV0ZUFubm90YXRpb24pOwotCQlhc3NlcnROdWxsKHhtbEF0dHJpYnV0ZUFubm90YXRpb24uZ2V0UmVxdWlyZWQoKSk7Ci0KLQkJeG1sQXR0cmlidXRlQW5ub3RhdGlvbi5zZXRSZXF1aXJlZChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbEF0dHJpYnV0ZUFubm90YXRpb24uZ2V0UmVxdWlyZWQoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxBdHRyaWJ1dGUocmVxdWlyZWQgPSBmYWxzZSkiLCBjdSk7Ci0KLQkJeG1sQXR0cmlidXRlQW5ub3RhdGlvbi5zZXRSZXF1aXJlZChudWxsKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxBdHRyaWJ1dGUiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJyZXF1aXJlZCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50QW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50QW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNTg5MzguLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudEFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBYbWxFbGVtZW50QW5ub3RhdGlvblRlc3RzCi0JCWV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9OQU1FID0gImVsZW1lbnROYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfTkFNRVNQQUNFID0gIlhtbEVsZW1lbnROYW1lc3BhY2UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9ERUZBVUxUX1ZBTFVFID0gIm15RGVmYXVsdFZhbHVlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfVFlQRSA9ICJTdHJpbmciOwotCQotCQotCXB1YmxpYyBYbWxFbGVtZW50QW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0VMRU1FTlQpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEVsZW1lbnQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRWxlbWVudFdpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50V2l0aFN0cmluZ0VsZW1lbnQoIm5hbWUiLCBYTUxfRUxFTUVOVF9OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50V2l0aE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFdpdGhTdHJpbmdFbGVtZW50KCJuYW1lc3BhY2UiLCBYTUxfRUxFTUVOVF9OQU1FU1BBQ0UpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoRGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50V2l0aFN0cmluZ0VsZW1lbnQoImRlZmF1bHRWYWx1ZSIsIFhNTF9FTEVNRU5UX0RFRkFVTFRfVkFMVUUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoU3RyaW5nRWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudCwgZmluYWwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0VMRU1FTlQpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEVsZW1lbnQoIiArIGVsZW1lbnQgKyAiID0gXCIiICsgdmFsdWUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoQm9vbGVhbkVsZW1lbnQoZmluYWwgU3RyaW5nIGJvb2xlYW5FbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0VMRU1FTlQpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEVsZW1lbnQoIiArIGJvb2xlYW5FbGVtZW50ICsgIiA9IHRydWUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRWxlbWVudCh0eXBlID0gIiArIFhNTF9FTEVNRU5UX1RZUEUgICsgIi5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sRWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROaWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sRWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfTkFNRSwgeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50QW5ub3RhdGlvbiB4bWxFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJCi0JCXhtbEVsZW1lbnRBbm5vdGF0aW9uLnNldE5hbWUoWE1MX0VMRU1FTlRfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfTkFNRSwgeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50KG5hbWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9OQU1FICsgIlwiKSIsIGN1KTsKLQkJCi0JCXhtbEVsZW1lbnRBbm5vdGF0aW9uLnNldE5hbWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxFbGVtZW50KG5hbWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9OQU1FICsgIlwiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFdpdGhOYW1lc3BhY2UoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50QW5ub3RhdGlvbiB4bWxFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UKTsKLQkJCi0JCWFzc2VydFRydWUoeG1sRWxlbWVudEFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9OQU1FU1BBQ0UsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbi5zZXROYW1lc3BhY2UoWE1MX0VMRU1FTlRfTkFNRVNQQUNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9OQU1FU1BBQ0UsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50KG5hbWVzcGFjZSA9IFwiIiArIFhNTF9FTEVNRU5UX05BTUVTUEFDRSArICJcIikiLCBjdSk7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbi5zZXROYW1lc3BhY2UobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gXCIiICsgWE1MX0VMRU1FTlRfTkFNRVNQQUNFICsgIlwiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFdpdGhEZWZhdWx0VmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50QW5ub3RhdGlvbiB4bWxFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UKTsKLQkJCi0JCWFzc2VydFRydWUoeG1sRWxlbWVudEFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9ERUZBVUxUX1ZBTFVFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXREZWZhdWx0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50QW5ub3RhdGlvbiB4bWxFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQkKLQkJeG1sRWxlbWVudEFubm90YXRpb24uc2V0RGVmYXVsdFZhbHVlKFhNTF9FTEVNRU5UX0RFRkFVTFRfVkFMVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX0RFRkFVTFRfVkFMVUUsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50KGRlZmF1bHRWYWx1ZSA9IFwiIiArIFhNTF9FTEVNRU5UX0RFRkFVTFRfVkFMVUUgKyAiXCIpIiwgY3UpOwotCQkKLQkJeG1sRWxlbWVudEFubm90YXRpb24uc2V0RGVmYXVsdFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxFbGVtZW50KGRlZmF1bHRWYWx1ZSA9IFwiIiArIFhNTF9FTEVNRU5UX0RFRkFVTFRfVkFMVUUgKyAiXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmlsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoQm9vbGVhbkVsZW1lbnQoIm5pbGxhYmxlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sRWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROaWxsYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5pbGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sRWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROaWxsYWJsZSgpKTsKLQkJCi0JCXhtbEVsZW1lbnRBbm5vdGF0aW9uLnNldE5pbGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5pbGxhYmxlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnQobmlsbGFibGUgPSBmYWxzZSkiLCBjdSk7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbi5zZXROaWxsYWJsZShudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm5pbGxhYmxlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVxdWlyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoQm9vbGVhbkVsZW1lbnQoInJlcXVpcmVkIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sRWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFJlcXVpcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sRWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpKTsKLQkJCi0JCXhtbEVsZW1lbnRBbm5vdGF0aW9uLnNldFJlcXVpcmVkKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldFJlcXVpcmVkKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnQocmVxdWlyZWQgPSBmYWxzZSkiLCBjdSk7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbi5zZXRSZXF1aXJlZChudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInJlcXVpcmVkIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFdpdGhUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sRWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfVFlQRSwgeG1sRWxlbWVudEFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuIiArIFhNTF9FTEVNRU5UX1RZUEUsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sRWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbi5zZXRUeXBlKFhNTF9FTEVNRU5UX1RZUEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX1RZUEUsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudCh0eXBlID0gIiArIFhNTF9FTEVNRU5UX1RZUEUgICsgIi5jbGFzcyIsIGN1KTsKLQkJCi0JCXhtbEVsZW1lbnRBbm5vdGF0aW9uLnNldFR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxFbGVtZW50KHR5cGUgPSAiICsgWE1MX0VMRU1FTlRfVFlQRSAgKyAiLmNsYXNzIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnREZWNsQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50RGVjbEFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzgyYTBiLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnREZWNsQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfREVDTF9OQU1FID0gImVsZW1lbnROYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfREVDTF9OQU1FU1BBQ0UgPSAiWG1sRWxlbWVudERlY2xOYW1lc3BhY2UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9ERUNMX0RFRkFVTFRfVkFMVUUgPSAibXlEZWZhdWx0VmFsdWUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9ERUNMX1NDT1BFID0gIlhtbEVsZW1lbnREZWNsLkdMT0JBTCI7Ci0KLQlwdWJsaWMgWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50RGVjbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEVsZW1lbnREZWNsIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRWxlbWVudERlY2xXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudERlY2xXaXRoU3RyaW5nRWxlbWVudERlY2woIm5hbWUiLCBYTUxfRUxFTUVOVF9ERUNMX05BTUUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRWxlbWVudERlY2xXaXRoTmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50RGVjbFdpdGhTdHJpbmdFbGVtZW50RGVjbCgibmFtZXNwYWNlIiwgWE1MX0VMRU1FTlRfREVDTF9OQU1FU1BBQ0UpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRWxlbWVudERlY2xXaXRoRGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50RGVjbFdpdGhTdHJpbmdFbGVtZW50RGVjbCgiZGVmYXVsdFZhbHVlIiwgWE1MX0VMRU1FTlRfREVDTF9ERUZBVUxUX1ZBTFVFKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnREZWNsV2l0aFN1YnN0aXR1dGlvbkhlYWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50RGVjbFdpdGhTdHJpbmdFbGVtZW50RGVjbCgic3Vic3RpdHV0aW9uSGVhZE5hbWUiLCBYTUxfRUxFTUVOVF9ERUNMX05BTUUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRWxlbWVudERlY2xXaXRoU3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudERlY2xXaXRoU3RyaW5nRWxlbWVudERlY2woInN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UiLCBYTUxfRUxFTUVOVF9ERUNMX05BTUUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRWxlbWVudERlY2xXaXRoU3RyaW5nRWxlbWVudERlY2woZmluYWwgU3RyaW5nIGVsZW1lbnQsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRWxlbWVudERlY2woIiArIGVsZW1lbnQgKyAiID0gXCIiICsgdmFsdWUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRWxlbWVudERlY2xXaXRoU2NvcGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50RGVjbChzY29wZSA9ICIgKyBYTUxfRUxFTUVOVF9ERUNMX1NDT1BFICArICIuY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50RGVjbFdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGdldE1ldGhvZChyZXNvdXJjZVR5cGUsIDApOwotCi0JCVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiB4bWxFbGVtZW50RGVjbEFubm90YXRpb24gPSAoWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7Ci0JCWFzc2VydFRydWUoeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfREVDTF9OQU1FLCB4bWxFbGVtZW50RGVjbEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudERlY2woKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gZ2V0TWV0aG9kKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uIHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50RGVjbEFubm90YXRpb24pIHJlc291cmNlTWV0aG9kLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50RGVjbEFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50RGVjbEFubm90YXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXRTY29wZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50RGVjbEFubm90YXRpb24uZ2V0U3Vic3RpdHV0aW9uSGVhZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmdldFN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnREZWNsKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGdldE1ldGhvZChyZXNvdXJjZVR5cGUsIDApOwotCi0JCVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiB4bWxFbGVtZW50RGVjbEFubm90YXRpb24gPSAoWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCXhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5zZXROYW1lKFhNTF9FTEVNRU5UX0RFQ0xfTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9ERUNMX05BTUUsIHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudERlY2wobmFtZSA9IFwiIiArIFhNTF9FTEVNRU5UX0RFQ0xfTkFNRSArICJcIikiLCBjdSk7Ci0KLQkJeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50RGVjbCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxFbGVtZW50RGVjbChuYW1lID0gXCIiICsgWE1MX0VMRU1FTlRfREVDTF9OQU1FICsgIlwiKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50RGVjbFdpdGhOYW1lc3BhY2UoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gZ2V0TWV0aG9kKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uIHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50RGVjbEFubm90YXRpb24pIHJlc291cmNlTWV0aG9kLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50RGVjbEFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9ERUNMX05BTUVTUEFDRSwgeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50RGVjbCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSBnZXRNZXRob2QocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxFbGVtZW50RGVjbEFubm90YXRpb24geG1sRWxlbWVudERlY2xBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbikgcmVzb3VyY2VNZXRob2QuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCXhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5zZXROYW1lc3BhY2UoWE1MX0VMRU1FTlRfREVDTF9OQU1FU1BBQ0UpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfREVDTF9OQU1FU1BBQ0UsIHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSBcIiIgKyBYTUxfRUxFTUVOVF9ERUNMX05BTUVTUEFDRSArICJcIikiLCBjdSk7Ci0KLQkJeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLnNldE5hbWVzcGFjZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50RGVjbEFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudERlY2wiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gXCIiICsgWE1MX0VMRU1FTlRfREVDTF9OQU1FU1BBQ0UgKyAiXCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnREZWNsV2l0aERlZmF1bHRWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSBnZXRNZXRob2QocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxFbGVtZW50RGVjbEFubm90YXRpb24geG1sRWxlbWVudERlY2xBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbikgcmVzb3VyY2VNZXRob2QuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX0RFQ0xfREVGQVVMVF9WQUxVRSwgeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmdldERlZmF1bHRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50RGVjbCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSBnZXRNZXRob2QocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxFbGVtZW50RGVjbEFubm90YXRpb24geG1sRWxlbWVudERlY2xBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbikgcmVzb3VyY2VNZXRob2QuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCXhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5zZXREZWZhdWx0VmFsdWUoWE1MX0VMRU1FTlRfREVDTF9ERUZBVUxUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX0RFQ0xfREVGQVVMVF9WQUxVRSwgeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmdldERlZmF1bHRWYWx1ZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnREZWNsKGRlZmF1bHRWYWx1ZSA9IFwiIiArIFhNTF9FTEVNRU5UX0RFQ0xfREVGQVVMVF9WQUxVRSArICJcIikiLCBjdSk7Ci0KLQkJeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLnNldERlZmF1bHRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50RGVjbEFubm90YXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudERlY2wiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sRWxlbWVudERlY2woZGVmYXVsdFZhbHVlID0gXCIiICsgWE1MX0VMRU1FTlRfREVDTF9ERUZBVUxUX1ZBTFVFICsgIlwiKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2NvcGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnREZWNsV2l0aFNjb3BlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGdldE1ldGhvZChyZXNvdXJjZVR5cGUsIDApOwotCi0JCVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiB4bWxFbGVtZW50RGVjbEFubm90YXRpb24gPSAoWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7Ci0JCWFzc2VydFRydWUoeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfREVDTF9TQ09QRSwgeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmdldFNjb3BlKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uIiArIFhNTF9FTEVNRU5UX0RFQ0xfU0NPUEUsIHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFNjb3BlQ2xhc3NOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTY29wZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudERlY2woKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gZ2V0TWV0aG9kKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uIHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50RGVjbEFubm90YXRpb24pIHJlc291cmNlTWV0aG9kLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50RGVjbEFubm90YXRpb24uZ2V0U2NvcGUoKSk7Ci0JCXhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5zZXRTY29wZShYTUxfRUxFTUVOVF9ERUNMX1NDT1BFKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX0RFQ0xfU0NPUEUsIHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXRTY29wZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnREZWNsKHNjb3BlID0gIiArIFhNTF9FTEVNRU5UX0RFQ0xfU0NPUEUgICsgIi5jbGFzcyIsIGN1KTsKLQotCQl4bWxFbGVtZW50RGVjbEFubm90YXRpb24uc2V0U2NvcGUobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmdldFNjb3BlKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudERlY2wiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sRWxlbWVudERlY2woc2NvcGUgPSAiICsgWE1MX0VMRU1FTlRfREVDTF9TQ09QRSAgKyAiLmNsYXNzIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTdWJzdGl0dXRpb25IZWFkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudERlY2xXaXRoU3Vic3RpdHV0aW9uSGVhZE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gZ2V0TWV0aG9kKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uIHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50RGVjbEFubm90YXRpb24pIHJlc291cmNlTWV0aG9kLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50RGVjbEFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9ERUNMX05BTUUsIHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXRTdWJzdGl0dXRpb25IZWFkTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3Vic3RpdHV0aW9uSGVhZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnREZWNsKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGdldE1ldGhvZChyZXNvdXJjZVR5cGUsIDApOwotCi0JCVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiB4bWxFbGVtZW50RGVjbEFubm90YXRpb24gPSAoWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmdldFN1YnN0aXR1dGlvbkhlYWROYW1lKCkpOwotCQl4bWxFbGVtZW50RGVjbEFubm90YXRpb24uc2V0U3Vic3RpdHV0aW9uSGVhZE5hbWUoWE1MX0VMRU1FTlRfREVDTF9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX0RFQ0xfTkFNRSwgeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmdldFN1YnN0aXR1dGlvbkhlYWROYW1lKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudERlY2woc3Vic3RpdHV0aW9uSGVhZE5hbWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9ERUNMX05BTUUgKyAiXCIpIiwgY3UpOwotCi0JCXhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5zZXRTdWJzdGl0dXRpb25IZWFkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50RGVjbEFubm90YXRpb24uZ2V0U3Vic3RpdHV0aW9uSGVhZE5hbWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50RGVjbCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxFbGVtZW50RGVjbChzdWJzdGl0dXRpb25IZWFkTmFtZSA9IFwiIiArIFhNTF9FTEVNRU5UX0RFQ0xfTkFNRSArICJcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnREZWNsV2l0aFN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gZ2V0TWV0aG9kKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uIHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50RGVjbEFubm90YXRpb24pIHJlc291cmNlTWV0aG9kLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50RGVjbEFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9ERUNMX05BTUUsIHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50RGVjbCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSBnZXRNZXRob2QocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxFbGVtZW50RGVjbEFubm90YXRpb24geG1sRWxlbWVudERlY2xBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbikgcmVzb3VyY2VNZXRob2QuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKCkpOwotCQl4bWxFbGVtZW50RGVjbEFubm90YXRpb24uc2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZShYTUxfRUxFTUVOVF9ERUNMX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfREVDTF9OQU1FLCB4bWxFbGVtZW50RGVjbEFubm90YXRpb24uZ2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnREZWNsKHN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UgPSBcIiIgKyBYTUxfRUxFTUVOVF9ERUNMX05BTUUgKyAiXCIpIiwgY3UpOwotCi0JCXhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5zZXRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudERlY2wiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sRWxlbWVudERlY2woc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSA9IFwiIiArIFhNTF9FTEVNRU5UX0RFQ0xfTkFNRSArICJcIikiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudFJlZkFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudFJlZkFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGViNGRhLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRSZWZBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50UmVmQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sRWxlbWVudFJlZkFubm90YXRpb25UZXN0cwotCQlleHRlbmRzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfUkVGX05BTUUgPSAiZWxlbWVudE5hbWUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9SRUZfTkFNRVNQQUNFID0gIlhtbEVsZW1lbnRSZWZOYW1lc3BhY2UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9SRUZfVFlQRSA9ICJTdHJpbmciOwotCQotCQotCXB1YmxpYyBYbWxFbGVtZW50UmVmQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0VMRU1FTlRfUkVGKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50UmVmIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWZXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFJlZldpdGhTdHJpbmdFbGVtZW50KCJuYW1lIiwgWE1MX0VMRU1FTlRfUkVGX05BTUUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWZXaXRoTmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmV2l0aFN0cmluZ0VsZW1lbnQoIm5hbWVzcGFjZSIsIFhNTF9FTEVNRU5UX1JFRl9OQU1FU1BBQ0UpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWZXaXRoU3RyaW5nRWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudCwgZmluYWwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0VMRU1FTlRfUkVGKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50UmVmKCIgKyBlbGVtZW50ICsgIiA9IFwiIiArIHZhbHVlICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmV2l0aEJvb2xlYW5FbGVtZW50KGZpbmFsIFN0cmluZyBib29sZWFuRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRWxlbWVudFJlZigiICsgYm9vbGVhbkVsZW1lbnQgKyAiID0gdHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRWxlbWVudFJlZldpdGhUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRWxlbWVudFJlZih0eXBlID0gIiArIFhNTF9FTEVNRU5UX1JFRl9UWVBFICArICIuY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFJlZigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGKTsKLQkJCi0JCWFzc2VydFRydWUoeG1sRWxlbWVudFJlZkFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWZXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGKTsKLQkJCi0JCWFzc2VydFRydWUoeG1sRWxlbWVudFJlZkFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9SRUZfTkFNRSwgeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWYoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCQotCQl4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5zZXROYW1lKFhNTF9FTEVNRU5UX1JFRl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9SRUZfTkFNRSwgeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50UmVmKG5hbWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9SRUZfTkFNRSArICJcIikiLCBjdSk7Ci0JCQotCQl4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5zZXROYW1lKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnRSZWYiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sRWxlbWVudFJlZihuYW1lID0gXCIiICsgWE1MX0VMRU1FTlRfUkVGX05BTUUgKyAiXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmV2l0aE5hbWVzcGFjZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGKTsKLQkJCi0JCWFzc2VydFRydWUoeG1sRWxlbWVudFJlZkFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9SRUZfTkFNRVNQQUNFLCB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWYoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCXhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLnNldE5hbWVzcGFjZShYTUxfRUxFTUVOVF9SRUZfTkFNRVNQQUNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9SRUZfTkFNRVNQQUNFLCB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudFJlZihuYW1lc3BhY2UgPSBcIiIgKyBYTUxfRUxFTUVOVF9SRUZfTkFNRVNQQUNFICsgIlwiKSIsIGN1KTsKLQkJCi0JCXhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLnNldE5hbWVzcGFjZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnRSZWYiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sRWxlbWVudFJlZihuYW1lc3BhY2UgPSBcIiIgKyBYTUxfRUxFTUVOVF9SRUZfTkFNRVNQQUNFICsgIlwiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFJlcXVpcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmV2l0aEJvb2xlYW5FbGVtZW50KCJyZXF1aXJlZCIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldFJlcXVpcmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVxdWlyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWYoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpKTsKLQkJCi0JCXhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLnNldFJlcXVpcmVkKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldFJlcXVpcmVkKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnRSZWYocmVxdWlyZWQgPSBmYWxzZSkiLCBjdSk7Ci0JCQotCQl4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5zZXRSZXF1aXJlZChudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudFJlZiIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInJlcXVpcmVkIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFJlZldpdGhUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb24gPSAoWG1sRWxlbWVudFJlZkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX1JFRl9UWVBFLCB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy4iICsgWE1MX0VMRU1FTlRfUkVGX1RZUEUsIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb24gPSAoWG1sRWxlbWVudFJlZkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQkKLQkJeG1sRWxlbWVudFJlZkFubm90YXRpb24uc2V0VHlwZShYTUxfRUxFTUVOVF9SRUZfVFlQRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfUkVGX1RZUEUsIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudFJlZih0eXBlID0gIiArIFhNTF9FTEVNRU5UX1JFRl9UWVBFICArICIuY2xhc3MiLCBjdSk7Ci0JCQotCQl4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5zZXRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnRSZWYiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sRWxlbWVudFJlZih0eXBlID0gIiArIFhNTF9FTEVNRU5UX1JFRl9UWVBFICArICIuY2xhc3MiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRSZWZzQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNWMzMDYuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFJlZkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uVGVzdHMKLQkJZXh0ZW5kcyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX1JFRl9OQU1FID0gImVsZW1lbnROYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfUkVGX05BTUVTUEFDRSA9ICJYbWxFbGVtZW50UmVmTmFtZXNwYWNlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfUkVGX1RZUEUgPSAiU3RyaW5nIjsKLQkKLQkKLQlwdWJsaWMgWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRWxlbWVudFJlZigpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfRUxFTUVOVF9SRUYsIEpBWEIuWE1MX0VMRU1FTlRfUkVGUyk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRWxlbWVudFJlZnMoQFhtbEVsZW1lbnRSZWYpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWZXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFJlZldpdGhTdHJpbmdFbGVtZW50KCJuYW1lIiwgWE1MX0VMRU1FTlRfUkVGX05BTUUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWZXaXRoTmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmV2l0aFN0cmluZ0VsZW1lbnQoIm5hbWVzcGFjZSIsIFhNTF9FTEVNRU5UX1JFRl9OQU1FU1BBQ0UpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWZXaXRoU3RyaW5nRWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudCwgZmluYWwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0VMRU1FTlRfUkVGLCBKQVhCLlhNTF9FTEVNRU5UX1JFRlMpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEVsZW1lbnRSZWZzKEBYbWxFbGVtZW50UmVmKCIgKyBlbGVtZW50ICsgIiA9IFwiIiArIHZhbHVlICsgIlwiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRWxlbWVudFJlZldpdGhUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9FTEVNRU5UX1JFRiwgSkFYQi5YTUxfRUxFTUVOVF9SRUZTKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50UmVmcyhAWG1sRWxlbWVudFJlZih0eXBlID0gIiArIFhNTF9FTEVNRU5UX1JFRl9UWVBFICArICIuY2xhc3MpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmV2l0aEFsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfRUxFTUVOVF9SRUYsIEpBWEIuWE1MX0VMRU1FTlRfUkVGUyk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRWxlbWVudFJlZnMoQFhtbEVsZW1lbnRSZWYobmFtZSA9IFwiIiArIFhNTF9FTEVNRU5UX1JFRl9OQU1FICsgIlwiLCBuYW1lc3BhY2UgPSBcIiIgKyBYTUxfRUxFTUVOVF9SRUZfTkFNRVNQQUNFICsgIlwiLCB0eXBlID0gIiArIFhNTF9FTEVNRU5UX1JFRl9UWVBFICArICIuY2xhc3MpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiBnZXRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUpIHsKLQkJWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uIHJlZnNBbm5vdGF0aW9uIAotCQkJCT0gKFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRlMpOwotCQlyZXR1cm4gcmVmc0Fubm90YXRpb24ueG1sRWxlbWVudFJlZkF0KDApOwotCX0KLQkKLQlwcml2YXRlIFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIGFkZFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKGludCBpbmRleCwgSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlKSB7Ci0JCVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiByZWZzQW5ub3RhdGlvbiAKLQkJCQk9IChYbWxFbGVtZW50UmVmc0Fubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUZTKTsKLQkJcmV0dXJuIHJlZnNBbm5vdGF0aW9uLmFkZFhtbEVsZW1lbnRSZWYoaW5kZXgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlWG1sRWxlbWVudFJlZkFubm90YXRpb24oaW50IGluZGV4LCBKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUpIHsKLQkJWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uIHJlZnNBbm5vdGF0aW9uIAotCQkJCT0gKFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRlMpOwotCQlyZWZzQW5ub3RhdGlvbi5yZW1vdmVYbWxFbGVtZW50UmVmKGluZGV4KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWYoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IGdldFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydFRydWUoeG1sRWxlbWVudFJlZkFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFJlZldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb24gPSBnZXRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfUkVGX05BTUUsIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWYoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IGdldFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJCi0JCXhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLnNldE5hbWUoWE1MX0VMRU1FTlRfUkVGX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfUkVGX05BTUUsIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50UmVmcyhAWG1sRWxlbWVudFJlZihuYW1lID0gXCIiICsgWE1MX0VMRU1FTlRfUkVGX05BTUUgKyAiXCIpKSIsIGN1KTsKLQotCQl4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50UmVmcyhAWG1sRWxlbWVudFJlZikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWZXaXRoTmFtZXNwYWNlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb24gPSBnZXRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfUkVGX05BTUVTUEFDRSwgeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb24gPSBnZXRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCXhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLnNldE5hbWVzcGFjZShYTUxfRUxFTUVOVF9SRUZfTkFNRVNQQUNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9SRUZfTkFNRVNQQUNFLCB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudFJlZnMoQFhtbEVsZW1lbnRSZWYobmFtZXNwYWNlID0gXCIiICsgWE1MX0VMRU1FTlRfUkVGX05BTUVTUEFDRSArICJcIikpIiwgY3UpOwotCQkKLQkJeG1sRWxlbWVudFJlZkFubm90YXRpb24uc2V0TmFtZXNwYWNlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudFJlZnMoQFhtbEVsZW1lbnRSZWYpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFJlZldpdGhUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb24gPSBnZXRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfUkVGX1RZUEUsIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLiIgKyBYTUxfRUxFTUVOVF9SRUZfVFlQRSwgeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRUeXBlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWYoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IGdldFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJCi0JCXhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLnNldFR5cGUoWE1MX0VMRU1FTlRfUkVGX1RZUEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX1JFRl9UWVBFLCB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnRSZWZzKEBYbWxFbGVtZW50UmVmKHR5cGUgPSAiICsgWE1MX0VMRU1FTlRfUkVGX1RZUEUgICsgIi5jbGFzcykpIiwgY3UpOwotCQkKLQkJeG1sRWxlbWVudFJlZkFubm90YXRpb24uc2V0VHlwZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50UmVmcyhAWG1sRWxlbWVudFJlZikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRYbWxFbGVtZW50UmVmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmV2l0aEFsbCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCWFkZFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKDEsIHJlc291cmNlQXR0cmlidXRlKTsKLQkJWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uIHJlZnNBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRlMpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxFbGVtZW50UmVmcyh7QFhtbEVsZW1lbnRSZWYobmFtZSA9IFwiIiArIFhNTF9FTEVNRU5UX1JFRl9OQU1FIAotCQkJCQkJKyAiXCIsIG5hbWVzcGFjZSA9IFwiIiArIFhNTF9FTEVNRU5UX1JFRl9OQU1FU1BBQ0UKLQkJCQkJCSsgIlwiLCB0eXBlID0gIiArIFhNTF9FTEVNRU5UX1JFRl9UWVBFIAotCQkJCQkJKyAiLmNsYXNzKSxAWG1sRWxlbWVudFJlZn0pIiwgY3UpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWZzQW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygyLCByZWZzQW5ub3RhdGlvbi5nZXRYbWxFbGVtZW50UmVmc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRYbWxFbGVtZW50UmVmVG9CZWdpbm5pbmdPZkxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWZXaXRoQWxsKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJYWRkWG1sRWxlbWVudFJlZkFubm90YXRpb24oMSwgcmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlYbWxFbGVtZW50UmVmc0Fubm90YXRpb24gcmVmc0Fubm90YXRpb24gPSAoWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGUyk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygKLQkJCQkiQFhtbEVsZW1lbnRSZWZzKHtAWG1sRWxlbWVudFJlZihuYW1lID0gXCIiICsgWE1MX0VMRU1FTlRfUkVGX05BTUUgCi0JCQkJCQkrICJcIiwgbmFtZXNwYWNlID0gXCIiICsgWE1MX0VMRU1FTlRfUkVGX05BTUVTUEFDRQotCQkJCQkJKyAiXCIsIHR5cGUgPSAiICsgWE1MX0VMRU1FTlRfUkVGX1RZUEUgCi0JCQkJCQkrICIuY2xhc3MpLEBYbWxFbGVtZW50UmVmfSkiLCBjdSk7Ci0JCQkJCi0JCWFkZFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKDAsIHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sRWxlbWVudFJlZnMoe0BYbWxFbGVtZW50UmVmLEBYbWxFbGVtZW50UmVmKG5hbWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9SRUZfTkFNRSAKLQkJCQkJCSsgIlwiLCBuYW1lc3BhY2UgPSBcIiIgKyBYTUxfRUxFTUVOVF9SRUZfTkFNRVNQQUNFCi0JCQkJCQkrICJcIiwgdHlwZSA9ICIgKyBYTUxfRUxFTUVOVF9SRUZfVFlQRSAKLQkJCQkJCSsgIi5jbGFzcyksIEBYbWxFbGVtZW50UmVmfSkiLCBjdSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWZzQW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygzLCByZWZzQW5ub3RhdGlvbi5nZXRYbWxFbGVtZW50UmVmc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVYbWxFbGVtZW50UmVmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmV2l0aEFsbCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCWFkZFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKDEsIHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sRWxlbWVudFJlZnMoe0BYbWxFbGVtZW50UmVmKG5hbWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9SRUZfTkFNRSAKLQkJCQkJCSsgIlwiLCBuYW1lc3BhY2UgPSBcIiIgKyBYTUxfRUxFTUVOVF9SRUZfTkFNRVNQQUNFCi0JCQkJCQkrICJcIiwgdHlwZSA9ICIgKyBYTUxfRUxFTUVOVF9SRUZfVFlQRSAKLQkJCQkJCSsgIi5jbGFzcyksQFhtbEVsZW1lbnRSZWZ9KSIsIGN1KTsKLQkJCi0JCXJlbW92ZVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKDEsIHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sRWxlbWVudFJlZihuYW1lID0gXCIiICsgWE1MX0VMRU1FTlRfUkVGX05BTUUgCi0JCQkJCQkrICJcIiwgbmFtZXNwYWNlID0gXCIiICsgWE1MX0VMRU1FTlRfUkVGX05BTUVTUEFDRQotCQkJCQkJKyAiXCIsIHR5cGUgPSAiICsgWE1MX0VMRU1FTlRfUkVGX1RZUEUgCi0JCQkJCQkrICIuY2xhc3MpIiwgY3UpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50V3JhcHBlckFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4YzM3NS4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50V3JhcHBlckFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfV1JBUFBFUl9OQU1FID0gImVsZW1lbnROYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfV1JBUFBFUl9OQU1FU1BBQ0UgPSAiWG1sRWxlbWVudFdyYXBwZXJOYW1lc3BhY2UiOwotCi0JcHVibGljIFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRWxlbWVudFdyYXBwZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEVsZW1lbnRXcmFwcGVyIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRWxlbWVudFdyYXBwZXJXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFdyYXBwZXJXaXRoU3RyaW5nRWxlbWVudCgibmFtZSIsIFhNTF9FTEVNRU5UX1dSQVBQRVJfTkFNRSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50V3JhcHBlcldpdGhOYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXcmFwcGVyV2l0aFN0cmluZ0VsZW1lbnQoIm5hbWVzcGFjZSIsIFhNTF9FTEVNRU5UX1dSQVBQRVJfTkFNRVNQQUNFKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRXcmFwcGVyV2l0aFN0cmluZ0VsZW1lbnQoZmluYWwgU3RyaW5nIGVsZW1lbnQsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50V3JhcHBlcigiICsgZWxlbWVudCArICIgPSBcIiIgKyB2YWx1ZSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50V3JhcHBlcldpdGhCb29sZWFuRWxlbWVudChmaW5hbCBTdHJpbmcgYm9vbGVhbkVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRWxlbWVudFdyYXBwZXIoIiArIGJvb2xlYW5FbGVtZW50ICsgIiA9IHRydWUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50V3JhcHBlcldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24geG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX1dSQVBQRVJfTkFNRSwgeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24geG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5nZXROaWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uZ2V0UmVxdWlyZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24geG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQl4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uc2V0TmFtZShYTUxfRUxFTUVOVF9XUkFQUEVSX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfV1JBUFBFUl9OQU1FLCB4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnRXcmFwcGVyKG5hbWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9XUkFQUEVSX05BTUUgKyAiXCIpIiwgY3UpOwotCi0JCXhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudFdyYXBwZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sRWxlbWVudFdyYXBwZXIobmFtZSA9IFwiIiArIFhNTF9FTEVNRU5UX1dSQVBQRVJfTkFNRSArICJcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFdyYXBwZXJXaXRoTmFtZXNwYWNlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24geG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX1dSQVBQRVJfTkFNRVNQQUNFLCB4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24geG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCXhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5zZXROYW1lc3BhY2UoWE1MX0VMRU1FTlRfV1JBUFBFUl9OQU1FU1BBQ0UpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfV1JBUFBFUl9OQU1FU1BBQ0UsIHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50V3JhcHBlcihuYW1lc3BhY2UgPSBcIiIgKyBYTUxfRUxFTUVOVF9XUkFQUEVSX05BTUVTUEFDRSArICJcIikiLCBjdSk7Ci0KLQkJeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uLnNldE5hbWVzcGFjZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudFdyYXBwZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sRWxlbWVudFdyYXBwZXIobmFtZXNwYWNlID0gXCIiICsgWE1MX0VMRU1FTlRfV1JBUFBFUl9OQU1FU1BBQ0UgKyAiXCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROaWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFdyYXBwZXJXaXRoQm9vbGVhbkVsZW1lbnQoIm5pbGxhYmxlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uZ2V0TmlsbGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5pbGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50V3JhcHBlcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiB4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gPSAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0KLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5nZXROaWxsYWJsZSgpKTsKLQotCQl4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uc2V0TmlsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uZ2V0TmlsbGFibGUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50V3JhcHBlcihuaWxsYWJsZSA9IGZhbHNlKSIsIGN1KTsKLQotCQl4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uc2V0TmlsbGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudFdyYXBwZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJuaWxsYWJsZSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVxdWlyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXcmFwcGVyV2l0aEJvb2xlYW5FbGVtZW50KCJyZXF1aXJlZCIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiB4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gPSAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uLmdldFJlcXVpcmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZXF1aXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24geG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCi0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uZ2V0UmVxdWlyZWQoKSk7Ci0KLQkJeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uLnNldFJlcXVpcmVkKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uLmdldFJlcXVpcmVkKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudFdyYXBwZXIocmVxdWlyZWQgPSBmYWxzZSkiLCBjdSk7Ci0KLQkJeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uLnNldFJlcXVpcmVkKG51bGwpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnRXcmFwcGVyIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigicmVxdWlyZWQiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudHNBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRzQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiODVhMGMuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudHNBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRzQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sRWxlbWVudHNBbm5vdGF0aW9uVGVzdHMKLQkJZXh0ZW5kcyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX05BTUUgPSAiZWxlbWVudE5hbWUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9OQU1FU1BBQ0UgPSAiWG1sRWxlbWVudE5hbWVzcGFjZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX0RFRkFVTFRfVkFMVUUgPSAibXlEZWZhdWx0VmFsdWUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9UWVBFID0gIlN0cmluZyI7Ci0JCi0JCi0JcHVibGljIFhtbEVsZW1lbnRzQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0VMRU1FTlRTLCBKQVhCLlhNTF9FTEVNRU5UKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50cyhAWG1sRWxlbWVudCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRWxlbWVudFdpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50V2l0aFN0cmluZ0VsZW1lbnQoIm5hbWUiLCBYTUxfRUxFTUVOVF9OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50V2l0aE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFdpdGhTdHJpbmdFbGVtZW50KCJuYW1lc3BhY2UiLCBYTUxfRUxFTUVOVF9OQU1FU1BBQ0UpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoRGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50V2l0aFN0cmluZ0VsZW1lbnQoImRlZmF1bHRWYWx1ZSIsIFhNTF9FTEVNRU5UX0RFRkFVTFRfVkFMVUUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoU3RyaW5nRWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudCwgZmluYWwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0VMRU1FTlRTLCBKQVhCLlhNTF9FTEVNRU5UKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50cyhAWG1sRWxlbWVudCgiICsgZWxlbWVudCArICIgPSBcIiIgKyB2YWx1ZSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoQm9vbGVhbkVsZW1lbnQoZmluYWwgU3RyaW5nIGJvb2xlYW5FbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0VMRU1FTlRTLCBKQVhCLlhNTF9FTEVNRU5UKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50cyhAWG1sRWxlbWVudCgiICsgYm9vbGVhbkVsZW1lbnQgKyAiID0gdHJ1ZSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfRUxFTUVOVFMsIEpBWEIuWE1MX0VMRU1FTlQpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEVsZW1lbnRzKEBYbWxFbGVtZW50KHR5cGUgPSAiICsgWE1MX0VMRU1FTlRfVFlQRSAgKyAiLmNsYXNzKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCQotCXByaXZhdGUgWG1sRWxlbWVudEFubm90YXRpb24gZ2V0WG1sRWxlbWVudEFubm90YXRpb24oSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlKSB7Ci0JCVhtbEVsZW1lbnRzQW5ub3RhdGlvbiBhbm5vdGF0aW9uIAotCQkJCT0gKFhtbEVsZW1lbnRzQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UUyk7Ci0JCXJldHVybiBhbm5vdGF0aW9uLnhtbEVsZW1lbnRBdCgwKTsKLQl9Ci0JCi0JcHJpdmF0ZSBYbWxFbGVtZW50QW5ub3RhdGlvbiBhZGRYbWxFbGVtZW50QW5ub3RhdGlvbihpbnQgaW5kZXgsIEphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSkgewotCQlYbWxFbGVtZW50c0Fubm90YXRpb24gYW5ub3RhdGlvbiAKLQkJCQk9IChYbWxFbGVtZW50c0Fubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVFMpOwotCQlyZXR1cm4gYW5ub3RhdGlvbi5hZGRYbWxFbGVtZW50KGluZGV4KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVhtbEVsZW1lbnRBbm5vdGF0aW9uKGludCBpbmRleCwgSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlKSB7Ci0JCVhtbEVsZW1lbnRzQW5ub3RhdGlvbiBhbm5vdGF0aW9uIAotCQkJCT0gKFhtbEVsZW1lbnRzQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UUyk7Ci0JCWFubm90YXRpb24ucmVtb3ZlWG1sRWxlbWVudChpbmRleCk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSBnZXRYbWxFbGVtZW50QW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROaWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSBnZXRYbWxFbGVtZW50QW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfTkFNRSwgeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50QW5ub3RhdGlvbiB4bWxFbGVtZW50QW5ub3RhdGlvbiA9IGdldFhtbEVsZW1lbnRBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJCi0JCXhtbEVsZW1lbnRBbm5vdGF0aW9uLnNldE5hbWUoWE1MX0VMRU1FTlRfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfTkFNRSwgeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50KG5hbWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9OQU1FICsgIlwiKSIsIGN1KTsKLQkJCi0JCXhtbEVsZW1lbnRBbm5vdGF0aW9uLnNldE5hbWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxFbGVtZW50KG5hbWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9OQU1FICsgIlwiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFdpdGhOYW1lc3BhY2UoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50QW5ub3RhdGlvbiB4bWxFbGVtZW50QW5ub3RhdGlvbiA9IGdldFhtbEVsZW1lbnRBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydFRydWUoeG1sRWxlbWVudEFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9OQU1FU1BBQ0UsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gZ2V0WG1sRWxlbWVudEFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbi5zZXROYW1lc3BhY2UoWE1MX0VMRU1FTlRfTkFNRVNQQUNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9OQU1FU1BBQ0UsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50KG5hbWVzcGFjZSA9IFwiIiArIFhNTF9FTEVNRU5UX05BTUVTUEFDRSArICJcIikiLCBjdSk7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbi5zZXROYW1lc3BhY2UobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gXCIiICsgWE1MX0VMRU1FTlRfTkFNRVNQQUNFICsgIlwiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFdpdGhEZWZhdWx0VmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50QW5ub3RhdGlvbiB4bWxFbGVtZW50QW5ub3RhdGlvbiA9IGdldFhtbEVsZW1lbnRBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydFRydWUoeG1sRWxlbWVudEFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9ERUZBVUxUX1ZBTFVFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXREZWZhdWx0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50QW5ub3RhdGlvbiB4bWxFbGVtZW50QW5ub3RhdGlvbiA9IGdldFhtbEVsZW1lbnRBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQkKLQkJeG1sRWxlbWVudEFubm90YXRpb24uc2V0RGVmYXVsdFZhbHVlKFhNTF9FTEVNRU5UX0RFRkFVTFRfVkFMVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX0RFRkFVTFRfVkFMVUUsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50KGRlZmF1bHRWYWx1ZSA9IFwiIiArIFhNTF9FTEVNRU5UX0RFRkFVTFRfVkFMVUUgKyAiXCIpIiwgY3UpOwotCQkKLQkJeG1sRWxlbWVudEFubm90YXRpb24uc2V0RGVmYXVsdFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxFbGVtZW50KGRlZmF1bHRWYWx1ZSA9IFwiIiArIFhNTF9FTEVNRU5UX0RFRkFVTFRfVkFMVUUgKyAiXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmlsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoQm9vbGVhbkVsZW1lbnQoIm5pbGxhYmxlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSBnZXRYbWxFbGVtZW50QW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROaWxsYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5pbGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSBnZXRYbWxFbGVtZW50QW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROaWxsYWJsZSgpKTsKLQkJCi0JCXhtbEVsZW1lbnRBbm5vdGF0aW9uLnNldE5pbGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5pbGxhYmxlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnQobmlsbGFibGUgPSBmYWxzZSkiLCBjdSk7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbi5zZXROaWxsYWJsZShudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm5pbGxhYmxlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVxdWlyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoQm9vbGVhbkVsZW1lbnQoInJlcXVpcmVkIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSBnZXRYbWxFbGVtZW50QW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFJlcXVpcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSBnZXRYbWxFbGVtZW50QW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpKTsKLQkJCi0JCXhtbEVsZW1lbnRBbm5vdGF0aW9uLnNldFJlcXVpcmVkKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldFJlcXVpcmVkKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnQocmVxdWlyZWQgPSBmYWxzZSkiLCBjdSk7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbi5zZXRSZXF1aXJlZChudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInJlcXVpcmVkIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFdpdGhUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSBnZXRYbWxFbGVtZW50QW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfVFlQRSwgeG1sRWxlbWVudEFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuIiArIFhNTF9FTEVNRU5UX1RZUEUsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSBnZXRYbWxFbGVtZW50QW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbi5zZXRUeXBlKFhNTF9FTEVNRU5UX1RZUEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX1RZUEUsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudCh0eXBlID0gIiArIFhNTF9FTEVNRU5UX1RZUEUgICsgIi5jbGFzcyIsIGN1KTsKLQkJCi0JCXhtbEVsZW1lbnRBbm5vdGF0aW9uLnNldFR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxFbGVtZW50KHR5cGUgPSAiICsgWE1MX0VMRU1FTlRfVFlQRSAgKyAiLmNsYXNzIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkWG1sRWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCWFkZFhtbEVsZW1lbnRBbm5vdGF0aW9uKDEsIHJlc291cmNlQXR0cmlidXRlKTsKLQkJWG1sRWxlbWVudHNBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoWG1sRWxlbWVudHNBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRTKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sRWxlbWVudHMoe0BYbWxFbGVtZW50KG5hbWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9OQU1FICsgIlwiKSxAWG1sRWxlbWVudH0pIiwgCi0JCQkJY3UpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoMiwgYW5ub3RhdGlvbi5nZXRYbWxFbGVtZW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRYbWxFbGVtZW50VG9CZWdpbm5pbmdPZkxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RYbWxFbGVtZW50V2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlhZGRYbWxFbGVtZW50QW5ub3RhdGlvbigxLCByZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCVhtbEVsZW1lbnRzQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRzQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UUyk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygKLQkJCQkiQFhtbEVsZW1lbnRzKHtAWG1sRWxlbWVudChuYW1lID0gXCIiICsgWE1MX0VMRU1FTlRfTkFNRSArICJcIiksQFhtbEVsZW1lbnR9KSIsIAotCQkJCWN1KTsKLQkJCQkKLQkJYWRkWG1sRWxlbWVudEFubm90YXRpb24oMCwgcmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxFbGVtZW50cyh7QFhtbEVsZW1lbnQsQFhtbEVsZW1lbnQobmFtZSA9IFwiIiArIFhNTF9FTEVNRU5UX05BTUUgKyAiXCIpLCBAWG1sRWxlbWVudH0pIiwgCi0JCQkJY3UpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFubm90YXRpb24uZ2V0WG1sRWxlbWVudHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlWG1sRWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCWFkZFhtbEVsZW1lbnRBbm5vdGF0aW9uKDEsIHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sRWxlbWVudHMoe0BYbWxFbGVtZW50KG5hbWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9OQU1FICsgIlwiKSxAWG1sRWxlbWVudH0pIiwgCi0JCQkJY3UpOwotCQkKLQkJcmVtb3ZlWG1sRWxlbWVudEFubm90YXRpb24oMSwgcmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxFbGVtZW50KG5hbWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9OQU1FICsgIlwiKSIsIAotCQkJCWN1KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRW51bUFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRW51bUFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmQwZDYyLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVudW1Bbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVudW1Bbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBYbWxFbnVtQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTlVNX0pBVkFfVFlQRSA9ICJTdHJpbmciOwotCi0JcHVibGljIFhtbEVudW1Bbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbnVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RFbnVtKG5ldyBEZWZhdWx0RW51bUFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfRU5VTSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEVudW1Bbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEVudW0iKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbnVtV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RFbnVtKG5ldyBEZWZhdWx0RW51bUFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfRU5VTSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEVudW1Bbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEVudW0odmFsdWUgPSAiICsgWE1MX0VOVU1fSkFWQV9UWVBFICArICIuY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbnVtKCk7Ci0JCUphdmFSZXNvdXJjZUVudW0gcmVzb3VyY2VFbnVtID0gdGhpcy5idWlsZEphdmFSZXNvdXJjZUVudW0oY3UpOyAKLQotCQlYbWxFbnVtQW5ub3RhdGlvbiB4bWxFbnVtQW5ub3RhdGlvbiA9IChYbWxFbnVtQW5ub3RhdGlvbikgcmVzb3VyY2VFbnVtLmdldEFubm90YXRpb24oSkFYQi5YTUxfRU5VTSk7Ci0JCWFzc2VydFRydWUoeG1sRW51bUFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sRW51bUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbnVtV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZUVudW0gcmVzb3VyY2VFbnVtID0gdGhpcy5idWlsZEphdmFSZXNvdXJjZUVudW0oY3UpOyAKLQotCQlYbWxFbnVtQW5ub3RhdGlvbiB4bWxFbnVtQW5ub3RhdGlvbiA9IChYbWxFbnVtQW5ub3RhdGlvbikgcmVzb3VyY2VFbnVtLmdldEFubm90YXRpb24oSkFYQi5YTUxfRU5VTSk7Ci0JCWFzc2VydFRydWUoeG1sRW51bUFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfRU5VTV9KQVZBX1RZUEUsIHhtbEVudW1Bbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy4iICsgWE1MX0VOVU1fSkFWQV9UWVBFLCB4bWxFbnVtQW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRW51bSgpOwotCQlKYXZhUmVzb3VyY2VFbnVtIHJlc291cmNlRW51bSA9IHRoaXMuYnVpbGRKYXZhUmVzb3VyY2VFbnVtKGN1KTsgCi0KLQkJWG1sRW51bUFubm90YXRpb24geG1sRW51bUFubm90YXRpb24gPSAoWG1sRW51bUFubm90YXRpb24pIHJlc291cmNlRW51bS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VOVU0pOwotCQlhc3NlcnROdWxsKHhtbEVudW1Bbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQl4bWxFbnVtQW5ub3RhdGlvbi5zZXRWYWx1ZShYTUxfRU5VTV9KQVZBX1RZUEUpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VOVU1fSkFWQV9UWVBFLCB4bWxFbnVtQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVudW0oIiArIFhNTF9FTlVNX0pBVkFfVFlQRSAgKyAiLmNsYXNzKSIsIGN1KTsKLQotCQl4bWxFbnVtQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbnVtQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVudW0iLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRW51bVZhbHVlQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbnVtVmFsdWVBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYyOWUzNy4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbnVtVmFsdWVBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRW51bUNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRW51bVZhbHVlQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sRW51bVZhbHVlQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRU5VTV9WQUxVRV9WQUxVRSA9ICJteUVudW1WYWx1ZSI7Ci0KLQlwdWJsaWMgWG1sRW51bVZhbHVlQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRW51bVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RFbnVtKG5ldyBEZWZhdWx0RW51bUFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfRU5VTV9WQUxVRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFN1bmRheUVudW1Db25zdGFudEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRW51bVZhbHVlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRW51bVZhbHVlV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RYbWxFbnVtVmFsdWVXaXRoU3RyaW5nRWxlbWVudCgidmFsdWUiLCBYTUxfRU5VTV9WQUxVRV9WQUxVRSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbnVtVmFsdWVXaXRoU3RyaW5nRWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudCwgZmluYWwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdEVudW0obmV3IERlZmF1bHRFbnVtQW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9FTlVNX1ZBTFVFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kU3VuZGF5RW51bUNvbnN0YW50QW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbnVtVmFsdWUoIiArIGVsZW1lbnQgKyAiID0gXCIiICsgdmFsdWUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRYbWxFbnVtVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVudW1WYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VFbnVtIHJlc291cmNlRW51bSA9IGJ1aWxkSmF2YVJlc291cmNlRW51bShjdSk7IAotCQlKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQgZW51bUNvbnN0YW50ID0gZ2V0RW51bUNvbnN0YW50KHJlc291cmNlRW51bSwgMCk7Ci0KLQkJWG1sRW51bVZhbHVlQW5ub3RhdGlvbiB4bWxFbnVtVmFsdWVBbm5vdGF0aW9uID0gKFhtbEVudW1WYWx1ZUFubm90YXRpb24pIGVudW1Db25zdGFudC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VOVU1fVkFMVUUpOwotCQlhc3NlcnRUcnVlKHhtbEVudW1WYWx1ZUFubm90YXRpb24gIT0gbnVsbCk7Ci0KLQkJZW51bUNvbnN0YW50LnJlbW92ZUFubm90YXRpb24oSkFYQi5YTUxfRU5VTV9WQUxVRSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sRW51bVZhbHVlIiwgY3UpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbnVtVmFsdWVXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlRW51bSByZXNvdXJjZUVudW0gPSBidWlsZEphdmFSZXNvdXJjZUVudW0oY3UpOyAKLQkJSmF2YVJlc291cmNlRW51bUNvbnN0YW50IGVudW1Db25zdGFudCA9IGdldEVudW1Db25zdGFudChyZXNvdXJjZUVudW0sIDApOwotCi0JCVhtbEVudW1WYWx1ZUFubm90YXRpb24geG1sRW51bVZhbHVlQW5ub3RhdGlvbiA9IChYbWxFbnVtVmFsdWVBbm5vdGF0aW9uKSBlbnVtQ29uc3RhbnQuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTlVNX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxFbnVtVmFsdWVBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VOVU1fVkFMVUVfVkFMVUUsIHhtbEVudW1WYWx1ZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVudW1WYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VFbnVtIHJlc291cmNlRW51bSA9IGJ1aWxkSmF2YVJlc291cmNlRW51bShjdSk7IAotCQlKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQgZW51bUNvbnN0YW50ID0gZ2V0RW51bUNvbnN0YW50KHJlc291cmNlRW51bSwgMCk7Ci0KLQkJWG1sRW51bVZhbHVlQW5ub3RhdGlvbiB4bWxFbnVtVmFsdWVBbm5vdGF0aW9uID0gKFhtbEVudW1WYWx1ZUFubm90YXRpb24pIGVudW1Db25zdGFudC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VOVU1fVkFMVUUpOwotCQlhc3NlcnRUcnVlKHhtbEVudW1WYWx1ZUFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sRW51bVZhbHVlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVudW1WYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VFbnVtIHJlc291cmNlRW51bSA9IGJ1aWxkSmF2YVJlc291cmNlRW51bShjdSk7IAotCQlKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQgZW51bUNvbnN0YW50ID0gZ2V0RW51bUNvbnN0YW50KHJlc291cmNlRW51bSwgMCk7Ci0KLQkJWG1sRW51bVZhbHVlQW5ub3RhdGlvbiB4bWxFbnVtVmFsdWVBbm5vdGF0aW9uID0gKFhtbEVudW1WYWx1ZUFubm90YXRpb24pIGVudW1Db25zdGFudC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VOVU1fVkFMVUUpOwotCQlhc3NlcnROdWxsKHhtbEVudW1WYWx1ZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCXhtbEVudW1WYWx1ZUFubm90YXRpb24uc2V0VmFsdWUoWE1MX0VOVU1fVkFMVUVfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VOVU1fVkFMVUVfVkFMVUUsIHhtbEVudW1WYWx1ZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbnVtVmFsdWUoXCIiICsgWE1MX0VOVU1fVkFMVUVfVkFMVUUgKyAiXCIpIiwgY3UpOwotCi0JCXhtbEVudW1WYWx1ZUFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sRW51bVZhbHVlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbEVudW1WYWx1ZSgiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSURBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbElEQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMTNjNmUuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSURBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbElEQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sSURBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgWG1sSURBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxJRCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxJRCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0WG1sSUQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbElEKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxJREFubm90YXRpb24geG1sSURBbm5vdGF0aW9uID0gKFhtbElEQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JRCk7Ci0JCWFzc2VydFRydWUoeG1sSURBbm5vdGF0aW9uICE9IG51bGwpOwotCi0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oSkFYQi5YTUxfSUQpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbElEIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbElEUkVGQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxJRFJFRkFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGFhY2I0Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbElEUkVGQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxJRFJFRkFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbElEUkVGQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIFhtbElEUkVGQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sSURSRUYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0lEUkVGKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sSURSRUYiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFhtbElEUkVGKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxJRFJFRigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sSURSRUZBbm5vdGF0aW9uIHhtbElEUkVGQW5ub3RhdGlvbiA9IChYbWxJRFJFRkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSURSRUYpOwotCQlhc3NlcnRUcnVlKHhtbElEUkVGQW5ub3RhdGlvbiAhPSBudWxsKTsKLQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX0lEUkVGKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxJRFJFRiIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxJbmxpbmVCaW5hcnlEYXRhQXR0cmlidXRlQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxJbmxpbmVCaW5hcnlEYXRhQXR0cmlidXRlQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YWQyODIuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSW5saW5lQmluYXJ5RGF0YUF0dHJpYnV0ZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBYbWxJbmxpbmVCaW5hcnlEYXRhQXR0cmlidXRlQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIFhtbElubGluZUJpbmFyeURhdGFBdHRyaWJ1dGVBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxJbmxpbmVCaW5hcnlEYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9JTkxJTkVfQklOQVJZX0RBVEEpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sSW5saW5lQmluYXJ5RGF0YSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0WG1sSW5saW5lQmluYXJ5RGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sSW5saW5lQmluYXJ5RGF0YSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IHRoaXMuYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IHRoaXMuZ2V0TWV0aG9kKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb24geG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb24gPSAoWG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb24pIHJlc291cmNlTWV0aG9kLmdldEFubm90YXRpb24oSkFYQi5YTUxfSU5MSU5FX0JJTkFSWV9EQVRBKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbiAhPSBudWxsKTsKLQotCQlyZXNvdXJjZU1ldGhvZC5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX0lOTElORV9CSU5BUllfREFUQSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sSW5saW5lQmluYXJ5RGF0YSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxJbmxpbmVCaW5hcnlEYXRhVHlwZUFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSW5saW5lQmluYXJ5RGF0YVR5cGVBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkOTRjYi4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxJbmxpbmVCaW5hcnlEYXRhVHlwZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbElubGluZUJpbmFyeURhdGFUeXBlQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIFhtbElubGluZUJpbmFyeURhdGFUeXBlQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sSW5saW5lQmluYXJ5RGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfSU5MSU5FX0JJTkFSWV9EQVRBKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sSW5saW5lQmluYXJ5RGF0YSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0WG1sSW5saW5lQmluYXJ5RGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sSW5saW5lQmluYXJ5RGF0YSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uIHhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uID0gKFhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JTkxJTkVfQklOQVJZX0RBVEEpOwotCQlhc3NlcnRUcnVlKHhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uICE9IG51bGwpOwotCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX0lOTElORV9CSU5BUllfREFUQSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sSW5saW5lQmluYXJ5RGF0YSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxKYXZhVHlwZUFkYXB0ZXJQYWNrYWdlQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxKYXZhVHlwZUFkYXB0ZXJQYWNrYWdlQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZWFiNDAuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSmF2YVR5cGVBZGFwdGVyUGFja2FnZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBYbWxKYXZhVHlwZUFkYXB0ZXJQYWNrYWdlQW5ub3RhdGlvblRlc3RzCi0JCWV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NMQVNTID0gIlRlc3RDbGFzcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ0xBU1NfMiA9ICJUZXN0Q2xhc3MyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlFfVEVTVF9DTEFTUyA9IFBBQ0tBR0VfTkFNRSArICIuIiArIFRFU1RfQ0xBU1M7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZRX1RFU1RfQ0xBU1NfMiA9IFBBQ0tBR0VfTkFNRSArICIuIiArIFRFU1RfQ0xBU1NfMjsKLQkKLQkKLQlwdWJsaWMgWG1sSmF2YVR5cGVBZGFwdGVyUGFja2FnZUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RDbGFzcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoVEVTVF9DTEFTUykuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgVEVTVF9DTEFTUyArICIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0Q2xhc3MyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZChURVNUX0NMQVNTXzIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIFRFU1RfQ0xBU1NfMiArICIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVQYWNrYWdlSW5mb1dpdGhKYXZhVHlwZUFkYXB0ZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0UGFja2FnZUluZm8oCi0JCQkJIkBYbWxKYXZhVHlwZUFkYXB0ZXIiLAotCQkJCUpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aEphdmFUeXBlQWRhcHRlckFuZFZhbHVlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQljcmVhdGVUZXN0Q2xhc3MoKTsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RQYWNrYWdlSW5mbygKLQkJCQkiQFhtbEphdmFUeXBlQWRhcHRlcigiICsgVEVTVF9DTEFTUyArICIuY2xhc3MpIiwKLQkJCQlKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUiwgRlFfVEVTVF9DTEFTUyk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVQYWNrYWdlSW5mb1dpdGhKYXZhVHlwZUFkYXB0ZXJBbmRUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQljcmVhdGVUZXN0Q2xhc3MoKTsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RQYWNrYWdlSW5mbygKLQkJCQkiQFhtbEphdmFUeXBlQWRhcHRlcih0eXBlID0gIiArIFRFU1RfQ0xBU1MgKyAiLmNsYXNzKSIsCi0JCQkJSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIsIEZRX1RFU1RfQ0xBU1MpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlUGFja2FnZUluZm9XaXRoSmF2YVR5cGVBZGFwdGVycygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RQYWNrYWdlSW5mbygKLQkJCQkiQFhtbEphdmFUeXBlQWRhcHRlcnMoe0BYbWxKYXZhVHlwZUFkYXB0ZXIsQFhtbEphdmFUeXBlQWRhcHRlcn0pIiwKLQkJCQlKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUlMsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVQYWNrYWdlSW5mb1dpdGhKYXZhVHlwZUFkYXB0ZXJBbmRWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGJ1aWxkSmF2YVJlc291cmNlUGFja2FnZShjdSk7IAotCQljcmVhdGVUZXN0Q2xhc3MyKCk7Ci0JCQotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhURVNUX0NMQVNTLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRlFfVEVTVF9DTEFTUywgYW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEphdmFUeXBlQWRhcHRlcigiICsgVEVTVF9DTEFTUyArICIuY2xhc3MpIiwgY3UpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShURVNUX0NMQVNTXzIpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9DTEFTU18yLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRlFfVEVTVF9DTEFTU18yLCBhbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sSmF2YVR5cGVBZGFwdGVyKCIgKyBURVNUX0NMQVNTXzIgKyAiLmNsYXNzKSIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEphdmFUeXBlQWRhcHRlciIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0VmFsdWUoVEVTVF9DTEFTUyk7Ci0JCWFzc2VydEVxdWFscyhURVNUX0NMQVNTLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRlFfVEVTVF9DTEFTUywgYW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEphdmFUeXBlQWRhcHRlcigiICsgVEVTVF9DTEFTUyArICIuY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZSgpIAotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlUGFja2FnZUluZm9XaXRoSmF2YVR5cGVBZGFwdGVyQW5kVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGJ1aWxkSmF2YVJlc291cmNlUGFja2FnZShjdSk7IAotCQljcmVhdGVUZXN0Q2xhc3MyKCk7Ci0JCQotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhURVNUX0NMQVNTLCBhbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhGUV9URVNUX0NMQVNTLCBhbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxKYXZhVHlwZUFkYXB0ZXIodHlwZSA9ICIgKyBURVNUX0NMQVNTICsgIi5jbGFzcykiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFR5cGUoVEVTVF9DTEFTU18yKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfQ0xBU1NfMiwgYW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRlFfVEVTVF9DTEFTU18yLCBhbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxKYXZhVHlwZUFkYXB0ZXIodHlwZSA9ICIgKyBURVNUX0NMQVNTXzIgKyAiLmNsYXNzKSIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0VHlwZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEphdmFUeXBlQWRhcHRlciIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0VHlwZShURVNUX0NMQVNTKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfQ0xBU1MsIGFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZRX1RFU1RfQ0xBU1MsIGFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEphdmFUeXBlQWRhcHRlcih0eXBlID0gIiArIFRFU1RfQ0xBU1MgKyAiLmNsYXNzKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFR5cGVXaXRoVmFsdWUoKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlUGFja2FnZUluZm9XaXRoSmF2YVR5cGVBZGFwdGVyQW5kVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBidWlsZEphdmFSZXNvdXJjZVBhY2thZ2UoY3UpOyAKLQkJY3JlYXRlVGVzdENsYXNzMigpOwotCQkKLQkJWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9DTEFTUywgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxKYXZhVHlwZUFkYXB0ZXIoIiArIFRFU1RfQ0xBU1MgKyAiLmNsYXNzKSIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0VHlwZShURVNUX0NMQVNTXzIpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9DTEFTUywgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfQ0xBU1NfMiwgYW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEphdmFUeXBlQWRhcHRlcih2YWx1ZSA9ICIgKyBURVNUX0NMQVNTICsgIi5jbGFzcywgdHlwZSA9ICIgKyBURVNUX0NMQVNTXzIgKyAiLmNsYXNzKSIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9DTEFTU18yLCBhbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sSmF2YVR5cGVBZGFwdGVyKHR5cGUgPSAiICsgVEVTVF9DTEFTU18yICsgIi5jbGFzcykiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFZhbHVlKFRFU1RfQ0xBU1MpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9DTEFTUywgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfQ0xBU1NfMiwgYW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEphdmFUeXBlQWRhcHRlcih0eXBlID0gIiArIFRFU1RfQ0xBU1NfMiArICIuY2xhc3MsIHZhbHVlID0gIiArIFRFU1RfQ0xBU1MgKyAiLmNsYXNzKSIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0VHlwZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfQ0xBU1MsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sSmF2YVR5cGVBZGFwdGVyKCIgKyBURVNUX0NMQVNTICsgIi5jbGFzcykiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluZWRXaXRoVmFsdWUoKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHRlc3QgY29udGFpbmVkIGFubm90YXRpb24gdmFsdWUgc2V0dGluZy91cGRhdGluZwotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aEphdmFUeXBlQWRhcHRlcnMoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBidWlsZEphdmFSZXNvdXJjZVBhY2thZ2UoY3UpOwotCQljcmVhdGVUZXN0Q2xhc3MoKTsKLQkJCi0JCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gYWRhcHRlckFubm90YXRpb24gPSAKLQkJCShYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCQotCQlhZGFwdGVyQW5ub3RhdGlvbi5zZXRWYWx1ZShURVNUX0NMQVNTKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfQ0xBU1MsIGFkYXB0ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRlFfVEVTVF9DTEFTUywgYWRhcHRlckFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxKYXZhVHlwZUFkYXB0ZXJzKHtAWG1sSmF2YVR5cGVBZGFwdGVyKCIgKyBURVNUX0NMQVNTICsgIi5jbGFzcyksQFhtbEphdmFUeXBlQWRhcHRlcn0pIiwgY3UpOwotCQkKLQkJYWRhcHRlckFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoYWRhcHRlckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoRlFfVEVTVF9DTEFTUywgYWRhcHRlckFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxKYXZhVHlwZUFkYXB0ZXJzKHtAWG1sSmF2YVR5cGVBZGFwdGVyLEBYbWxKYXZhVHlwZUFkYXB0ZXJ9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5lZFdpdGhUeXBlKCkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkvLyB0ZXN0IGNvbnRhaW5lZCBhbm5vdGF0aW9uIHR5cGUgc2V0dGluZy91cGRhdGluZwotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aEphdmFUeXBlQWRhcHRlcnMoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBidWlsZEphdmFSZXNvdXJjZVBhY2thZ2UoY3UpOwotCQljcmVhdGVUZXN0Q2xhc3MoKTsKLQkJCi0JCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gYWRhcHRlckFubm90YXRpb24gPSAKLQkJCShYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbigxLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCQotCQlhZGFwdGVyQW5ub3RhdGlvbi5zZXRUeXBlKFRFU1RfQ0xBU1MpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9DTEFTUywgYWRhcHRlckFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZRX1RFU1RfQ0xBU1MsIGFkYXB0ZXJBbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxKYXZhVHlwZUFkYXB0ZXJzKHtAWG1sSmF2YVR5cGVBZGFwdGVyLEBYbWxKYXZhVHlwZUFkYXB0ZXIodHlwZSA9ICIgKyBURVNUX0NMQVNTICsgIi5jbGFzcyl9KSIsIGN1KTsKLQkJCi0JCXJlc291cmNlUGFja2FnZS5tb3ZlQW5ub3RhdGlvbigwLCAxLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfQ0xBU1MsIGFkYXB0ZXJBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhGUV9URVNUX0NMQVNTLCBhZGFwdGVyQW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sSmF2YVR5cGVBZGFwdGVycyh7QFhtbEphdmFUeXBlQWRhcHRlcih0eXBlID0gIiArIFRFU1RfQ0xBU1MgKyAiLmNsYXNzKSxAWG1sSmF2YVR5cGVBZGFwdGVyfSkiLCBjdSk7Ci0JCQotCQlhZGFwdGVyQW5ub3RhdGlvbi5zZXRUeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKGFkYXB0ZXJBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoRlFfVEVTVF9DTEFTUywgYWRhcHRlckFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygKLQkJCQkiQFhtbEphdmFUeXBlQWRhcHRlcnMoe0BYbWxKYXZhVHlwZUFkYXB0ZXIsQFhtbEphdmFUeXBlQWRhcHRlcn0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbmVkKCkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkvLyB0ZXN0IGFkZGluZy9yZW1vdmluZy9tb3ZpbmcKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVQYWNrYWdlSW5mb1dpdGhKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBidWlsZEphdmFSZXNvdXJjZVBhY2thZ2UoY3UpOwotCQljcmVhdGVUZXN0Q2xhc3MoKTsKLQkJY3JlYXRlVGVzdENsYXNzMigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uc1NpemUoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpKTsKLQkJCi0JCXJlc291cmNlUGFja2FnZS5hZGRBbm5vdGF0aW9uKDEsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uc1NpemUoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxKYXZhVHlwZUFkYXB0ZXJzKHsgQFhtbEphdmFUeXBlQWRhcHRlciwgQFhtbEphdmFUeXBlQWRhcHRlciB9KSIsIGN1KTsKLQkJCi0JCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gYWRhcHRlckFubm90YXRpb24xID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYWRhcHRlckFubm90YXRpb24xLnNldFZhbHVlKFRFU1RfQ0xBU1MpOwotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGFkYXB0ZXJBbm5vdGF0aW9uMiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbigxLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFkYXB0ZXJBbm5vdGF0aW9uMi5zZXRWYWx1ZShURVNUX0NMQVNTXzIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygKLQkJCQkiQFhtbEphdmFUeXBlQWRhcHRlcnMoeyBAWG1sSmF2YVR5cGVBZGFwdGVyKCIgKyBURVNUX0NMQVNTCi0JCQkJCSsgIi5jbGFzcyksIEBYbWxKYXZhVHlwZUFkYXB0ZXIoIiArIFRFU1RfQ0xBU1NfMgotCQkJCQkrICIuY2xhc3MpIH0pIiwgY3UpOwotCQkKLQkJcmVzb3VyY2VQYWNrYWdlLm1vdmVBbm5vdGF0aW9uKDAsIDEsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxKYXZhVHlwZUFkYXB0ZXJzKHsgQFhtbEphdmFUeXBlQWRhcHRlcigiICsgVEVTVF9DTEFTU18yCi0JCQkJCSsgIi5jbGFzcyksIEBYbWxKYXZhVHlwZUFkYXB0ZXIoIiArIFRFU1RfQ0xBU1MKLQkJCQkJKyAiLmNsYXNzKSB9KSIsIGN1KTsKLQkJCi0JCXJlc291cmNlUGFja2FnZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uc1NpemUoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxKYXZhVHlwZUFkYXB0ZXIoIiArIFRFU1RfQ0xBU1MgKyAiLmNsYXNzKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxKYXZhVHlwZUFkYXB0ZXJzIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEphdmFUeXBlQWRhcHRlclR5cGVBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEphdmFUeXBlQWRhcHRlclR5cGVBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYwZmViMC4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxKYXZhVHlwZUFkYXB0ZXJUeXBlQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sSmF2YVR5cGVBZGFwdGVyVHlwZUFubm90YXRpb25UZXN0cyBleHRlbmRzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfSkFWQV9UWVBFX0FEQVBURVJfQ0xBU1MgPSAiTXlBZGFwdGVyQ2xhc3MiOwotCi0JcHVibGljIFhtbEphdmFUeXBlQWRhcHRlclR5cGVBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxKYXZhVHlwZUFkYXB0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sSmF2YVR5cGVBZGFwdGVyIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sSmF2YVR5cGVBZGFwdGVyV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEFkYXB0ZXJDbGFzcygpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxKYXZhVHlwZUFkYXB0ZXIodmFsdWUgPSAiICsgWE1MX0pBVkFfVFlQRV9BREFQVEVSX0NMQVNTICArICIuY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0QWRhcHRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKFhNTF9KQVZBX1RZUEVfQURBUFRFUl9DTEFTUykuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIk15QWRhcHRlckNsYXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnRUcnVlKHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEphdmFUeXBlQWRhcHRlcldpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24geG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydFRydWUoeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9KQVZBX1RZUEVfQURBUFRFUl9DTEFTUywgeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LiIgKyBYTUxfSkFWQV9UWVBFX0FEQVBURVJfQ0xBU1MsIHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEphdmFUeXBlQWRhcHRlcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24geG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydE51bGwoeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbi5zZXRWYWx1ZShYTUxfSkFWQV9UWVBFX0FEQVBURVJfQ0xBU1MpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0pBVkFfVFlQRV9BREFQVEVSX0NMQVNTLCB4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sSmF2YVR5cGVBZGFwdGVyKCIgKyBYTUxfSkFWQV9UWVBFX0FEQVBURVJfQ0xBU1MgKyAiLmNsYXNzKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxKYXZhVHlwZUFkYXB0ZXJXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0pBVkFfVFlQRV9BREFQVEVSX0NMQVNTLCB4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCi0JCXhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEphdmFUeXBlQWRhcHRlciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxKYXZhVHlwZUFkYXB0ZXIoIiArIFhNTF9KQVZBX1RZUEVfQURBUFRFUl9DTEFTUyArICIuY2xhc3MpIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbExpc3RBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbExpc3RBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIxYTkwNC4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxMaXN0QW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxMaXN0QW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sTGlzdEFubm90YXRpb25UZXN0cyBleHRlbmRzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBYbWxMaXN0QW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfTElTVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbExpc3QiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFhtbExpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbExpc3QoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCi0JCVhtbExpc3RBbm5vdGF0aW9uIHhtbExpc3RBbm5vdGF0aW9uID0gKFhtbExpc3RBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpOwotCQlhc3NlcnRUcnVlKHhtbExpc3RBbm5vdGF0aW9uICE9IG51bGwpOwotCi0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oSkFYQi5YTUxfTElTVCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sTGlzdCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxNaW1lVHlwZUFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sTWltZVR5cGVBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEwODc4Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxNaW1lVHlwZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE1pbWVUeXBlQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sTWltZVR5cGVBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX01JTUVfVFlQRV9WQUxVRSA9ICJteU1pbWVUeXBlIjsKLQotCXB1YmxpYyBYbWxNaW1lVHlwZUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbE1pbWVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9NSU1FX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxNaW1lVHlwZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbE1pbWVUeXBlV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RYbWxNaW1lVHlwZVdpdGhTdHJpbmdFbGVtZW50KCJ2YWx1ZSIsIFhNTF9NSU1FX1RZUEVfVkFMVUUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sTWltZVR5cGVXaXRoU3RyaW5nRWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudCwgZmluYWwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX01JTUVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbE1pbWVUeXBlKCIgKyBlbGVtZW50ICsgIiA9IFwiIiArIHZhbHVlICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0WG1sTWltZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbE1pbWVUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxNaW1lVHlwZUFubm90YXRpb24geG1sTWltZVR5cGVBbm5vdGF0aW9uID0gKFhtbE1pbWVUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9NSU1FX1RZUEUpOwotCQlhc3NlcnRUcnVlKHhtbE1pbWVUeXBlQW5ub3RhdGlvbiAhPSBudWxsKTsKLQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX01JTUVfVFlQRSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sTWltZVR5cGUiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxNaW1lVHlwZVdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sTWltZVR5cGVBbm5vdGF0aW9uIHhtbE1pbWVUeXBlQW5ub3RhdGlvbiA9IChYbWxNaW1lVHlwZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTUlNRV9UWVBFKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxNaW1lVHlwZUFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfTUlNRV9UWVBFX1ZBTFVFLCB4bWxNaW1lVHlwZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbE1pbWVUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxNaW1lVHlwZUFubm90YXRpb24geG1sTWltZVR5cGVBbm5vdGF0aW9uID0gKFhtbE1pbWVUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9NSU1FX1RZUEUpOwotCQlhc3NlcnRUcnVlKHhtbE1pbWVUeXBlQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxNaW1lVHlwZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxNaW1lVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sTWltZVR5cGVBbm5vdGF0aW9uIHhtbE1pbWVUeXBlQW5ub3RhdGlvbiA9IChYbWxNaW1lVHlwZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTUlNRV9UWVBFKTsKLQkJYXNzZXJ0TnVsbCh4bWxNaW1lVHlwZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCXhtbE1pbWVUeXBlQW5ub3RhdGlvbi5zZXRWYWx1ZShYTUxfTUlNRV9UWVBFX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9NSU1FX1RZUEVfVkFMVUUsIHhtbE1pbWVUeXBlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbE1pbWVUeXBlKFwiIiArIFhNTF9NSU1FX1RZUEVfVkFMVUUgKyAiXCIpIiwgY3UpOwotCi0JCXhtbE1pbWVUeXBlQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxNaW1lVHlwZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxNaW1lVHlwZSgiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sTWl4ZWRBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbE1peGVkQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOWU4NjguLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sTWl4ZWRBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE1peGVkQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sTWl4ZWRBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgWG1sTWl4ZWRBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxNaXhlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfTUlYRUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxNaXhlZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0WG1sTWl4ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbE1peGVkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxNaXhlZEFubm90YXRpb24geG1sTWl4ZWRBbm5vdGF0aW9uID0gKFhtbE1peGVkQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9NSVhFRCk7Ci0JCWFzc2VydFRydWUoeG1sTWl4ZWRBbm5vdGF0aW9uICE9IG51bGwpOwotCi0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oSkFYQi5YTUxfTUlYRUQpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbE1peGVkIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFJlZ2lzdHJ5QW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxSZWdpc3RyeUFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTdiMzZiLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFJlZ2lzdHJ5QW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxSZWdpc3RyeUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbFJlZ2lzdHJ5QW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIFhtbFJlZ2lzdHJ5QW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sUmVnaXN0cnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1JFR0lTVFJZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sUmVnaXN0cnkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFhtbFJlZ2lzdHJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxSZWdpc3RyeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFJlZ2lzdHJ5QW5ub3RhdGlvbiB4bWxSZWdpc3RyeUFubm90YXRpb24gPSAoWG1sUmVnaXN0cnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9SRUdJU1RSWSk7Ci0JCWFzc2VydFRydWUoeG1sUmVnaXN0cnlBbm5vdGF0aW9uICE9IG51bGwpOwotCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX1JFR0lTVFJZKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxSZWdpc3RyeSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxSb290RWxlbWVudEFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRiNjM2MC4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxSb290RWxlbWVudEFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1JPT1RfRUxFTUVOVF9OQU1FID0gIlhtbFJvb3RFbGVtZW50TmFtZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ST09UX0VMRU1FTlRfTkFNRVNQQUNFID0gIlhtbFJvb3RFbGVtZW50TmFtZXNwYWNlIjsKLQotCXB1YmxpYyBYbWxSb290RWxlbWVudEFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbFJvb3RFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxSb290RWxlbWVudCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbFJvb3RFbGVtZW50V2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1JPT1RfRUxFTUVOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFJvb3RFbGVtZW50KG5hbWUgPSBcIiIgKyBYTUxfUk9PVF9FTEVNRU5UX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sUm9vdEVsZW1lbnRXaXRoTmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxSb290RWxlbWVudChuYW1lc3BhY2UgPSBcIiIgKyBYTUxfUk9PVF9FTEVNRU5UX05BTUVTUEFDRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbFJvb3RFbGVtZW50V2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxSb290RWxlbWVudEFubm90YXRpb24geG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfUk9PVF9FTEVNRU5UKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxSb290RWxlbWVudEFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfUk9PVF9FTEVNRU5UX05BTUUsIHhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxSb290RWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiB4bWxSb290RWxlbWVudEFubm90YXRpb24gPSAoWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCQlhc3NlcnRUcnVlKHhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxSb290RWxlbWVudEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxSb290RWxlbWVudEFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxSb290RWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiB4bWxSb290RWxlbWVudEFubm90YXRpb24gPSAoWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCQlhc3NlcnROdWxsKHhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQl4bWxSb290RWxlbWVudEFubm90YXRpb24uc2V0TmFtZShYTUxfUk9PVF9FTEVNRU5UX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoWE1MX1JPT1RfRUxFTUVOVF9OQU1FLCB4bWxSb290RWxlbWVudEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFJvb3RFbGVtZW50KG5hbWUgPSBcIiIgKyBYTUxfUk9PVF9FTEVNRU5UX05BTUUgKyAiXCIpIiwgY3UpOwotCi0JCXhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sUm9vdEVsZW1lbnQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sUm9vdEVsZW1lbnQobmFtZSA9IFwiIiArIFhNTF9ST09UX0VMRU1FTlRfTkFNRSArICJcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sUm9vdEVsZW1lbnRXaXRoTmFtZXNwYWNlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uIHhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxSb290RWxlbWVudEFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1JPT1RfRUxFTUVOVCk7Ci0JCWFzc2VydFRydWUoeG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX1JPT1RfRUxFTUVOVF9OQU1FU1BBQ0UsIHhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sUm9vdEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxSb290RWxlbWVudEFubm90YXRpb24geG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfUk9PVF9FTEVNRU5UKTsKLQkJYXNzZXJ0TnVsbCh4bWxSb290RWxlbWVudEFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQl4bWxSb290RWxlbWVudEFubm90YXRpb24uc2V0TmFtZXNwYWNlKFhNTF9ST09UX0VMRU1FTlRfTkFNRVNQQUNFKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9ST09UX0VMRU1FTlRfTkFNRVNQQUNFLCB4bWxSb290RWxlbWVudEFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sUm9vdEVsZW1lbnQobmFtZXNwYWNlID0gXCIiICsgWE1MX1JPT1RfRUxFTUVOVF9OQU1FU1BBQ0UgKyAiXCIpIiwgY3UpOwotCi0JCXhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbi5zZXROYW1lc3BhY2UobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFJvb3RFbGVtZW50IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbFJvb3RFbGVtZW50KG5hbWVzcGFjZSA9IFwiIiArIFhNTF9ST09UX0VMRU1FTlRfTkFNRVNQQUNFICsgIlwiKSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxTY2hlbWFBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFNjaGVtYUFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTRiYmQyLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFNjaGVtYUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE5zQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTnNGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxTY2hlbWFBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBYbWxTY2hlbWFBbm5vdGF0aW9uVGVzdHMKLQkJZXh0ZW5kcyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTE9DQVRJT04gPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy90ZXN0L3NjaGVtYS54c2QiOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX05BTUVTUEFDRSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3Rlc3Qvc2NoZW1hIjsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QUkVGSVggPSAidHMiOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX05BTUVTUEFDRV8yID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdGVzdC9zY2hlbWEyIjsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QUkVGSVhfMiA9ICJ0czIiOwotCQotCQotCXB1YmxpYyBYbWxTY2hlbWFBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVQYWNrYWdlSW5mb1dpdGhTY2hlbWFBbmRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RQYWNrYWdlSW5mbygKLQkJCQkiQFhtbFNjaGVtYShhdHRyaWJ1dGVGb3JtRGVmYXVsdCA9IFhtbE5zRm9ybS5RVUFMSUZJRUQpIiwKLQkJCQlKQVhCLlhNTF9TQ0hFTUEsIEpBWEIuWE1MX05TX0ZPUk0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlUGFja2FnZUluZm9XaXRoU2NoZW1hQW5kRWxlbWVudEZvcm1EZWZhdWx0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFBhY2thZ2VJbmZvKAotCQkJCSJAWG1sU2NoZW1hKGVsZW1lbnRGb3JtRGVmYXVsdCA9IFhtbE5zRm9ybS5RVUFMSUZJRUQpIiwKLQkJCQlKQVhCLlhNTF9TQ0hFTUEsIEpBWEIuWE1MX05TX0ZPUk0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlUGFja2FnZUluZm9XaXRoU2NoZW1hQW5kTG9jYXRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0UGFja2FnZUluZm8oCi0JCQkJIkBYbWxTY2hlbWEobG9jYXRpb24gPSBcIiIgKyBURVNUX0xPQ0FUSU9OICsgIlwiKSIsCi0JCQkJSkFYQi5YTUxfU0NIRU1BKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aFNjaGVtYUFuZE5hbWVzcGFjZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RQYWNrYWdlSW5mbygKLQkJCQkiQFhtbFNjaGVtYShuYW1lc3BhY2UgPSBcIiIgKyBURVNUX05BTUVTUEFDRSArICJcIikiLAotCQkJCUpBWEIuWE1MX1NDSEVNQSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVQYWNrYWdlSW5mb1dpdGhTY2hlbWFBbmRYbWxucygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RQYWNrYWdlSW5mbygKLQkJCQkiQFhtbFNjaGVtYSh4bWxucyA9IEBYbWxOcykiLAotCQkJCUpBWEIuWE1MX1NDSEVNQSwgSkFYQi5YTUxfTlMpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlUGFja2FnZUluZm9XaXRoU2NoZW1hQW5kWG1sbnNXaXRoTmFtZXNwYWNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFBhY2thZ2VJbmZvKAotCQkJCSJAWG1sU2NoZW1hKHhtbG5zID0gQFhtbE5zKG5hbWVzcGFjZVVSSSA9IFwiIiArIFRFU1RfTkFNRVNQQUNFICsgIlwiKSkiLAotCQkJCUpBWEIuWE1MX1NDSEVNQSwgSkFYQi5YTUxfTlMpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlUGFja2FnZUluZm9XaXRoU2NoZW1hQW5kWG1sbnNXaXRoUHJlZml4KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFBhY2thZ2VJbmZvKAotCQkJCSJAWG1sU2NoZW1hKHhtbG5zID0gQFhtbE5zKHByZWZpeCA9IFwiIiArIFRFU1RfUFJFRklYICsgIlwiKSkiLAotCQkJCUpBWEIuWE1MX1NDSEVNQSwgSkFYQi5YTUxfTlMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlRm9ybURlZmF1bHQoKSAKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aFNjaGVtYUFuZEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcGFja2FnZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VQYWNrYWdlKGN1KTsgCi0JCQotCQlYbWxTY2hlbWFBbm5vdGF0aW9uIHNjaGVtYUFubm90YXRpb24gPSAoWG1sU2NoZW1hQW5ub3RhdGlvbikgcGFja2FnZVJlc291cmNlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0NIRU1BKTsKLQkJYXNzZXJ0VHJ1ZShzY2hlbWFBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWG1sTnNGb3JtLlFVQUxJRklFRCwgc2NoZW1hQW5ub3RhdGlvbi5nZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWEoYXR0cmlidXRlRm9ybURlZmF1bHQgPSBYbWxOc0Zvcm0uUVVBTElGSUVEKSIsIGN1KTsKLQkJCi0JCXNjaGVtYUFubm90YXRpb24uc2V0QXR0cmlidXRlRm9ybURlZmF1bHQoWG1sTnNGb3JtLlVOUVVBTElGSUVEKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbE5zRm9ybS5VTlFVQUxJRklFRCwgc2NoZW1hQW5ub3RhdGlvbi5nZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWEoYXR0cmlidXRlRm9ybURlZmF1bHQgPSBVTlFVQUxJRklFRCkiLCBjdSk7Ci0JCQotCQlzY2hlbWFBbm5vdGF0aW9uLnNldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KFhtbE5zRm9ybS5VTlNFVCk7Ci0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uVU5TRVQsIHNjaGVtYUFubm90YXRpb24uZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hKGF0dHJpYnV0ZUZvcm1EZWZhdWx0ID0gVU5TRVQpIiwgY3UpOwotCQkKLQkJc2NoZW1hQW5ub3RhdGlvbi5zZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdChudWxsKTsKLQkJc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSBwYWNrYWdlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlhc3NlcnROdWxsKHNjaGVtYUFubm90YXRpb24uZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sU2NoZW1hKCIsIGN1KTsKLQkJCi0JCXNjaGVtYUFubm90YXRpb24gPSAoWG1sU2NoZW1hQW5ub3RhdGlvbikgcGFja2FnZVJlc291cmNlLmFkZEFubm90YXRpb24oSkFYQi5YTUxfU0NIRU1BKTsKLQkJc2NoZW1hQW5ub3RhdGlvbi5zZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdChYbWxOc0Zvcm0uUVVBTElGSUVEKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbE5zRm9ybS5RVUFMSUZJRUQsIHNjaGVtYUFubm90YXRpb24uZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hKGF0dHJpYnV0ZUZvcm1EZWZhdWx0ID0gUVVBTElGSUVEKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRGb3JtRGVmYXVsdCgpIAotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlUGFja2FnZUluZm9XaXRoU2NoZW1hQW5kRWxlbWVudEZvcm1EZWZhdWx0KCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcGFja2FnZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VQYWNrYWdlKGN1KTsgCi0JCQotCQlYbWxTY2hlbWFBbm5vdGF0aW9uIHNjaGVtYUFubm90YXRpb24gPSAoWG1sU2NoZW1hQW5ub3RhdGlvbikgcGFja2FnZVJlc291cmNlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0NIRU1BKTsKLQkJYXNzZXJ0VHJ1ZShzY2hlbWFBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWG1sTnNGb3JtLlFVQUxJRklFRCwgc2NoZW1hQW5ub3RhdGlvbi5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hKGVsZW1lbnRGb3JtRGVmYXVsdCA9IFhtbE5zRm9ybS5RVUFMSUZJRUQpIiwgY3UpOwotCQkKLQkJc2NoZW1hQW5ub3RhdGlvbi5zZXRFbGVtZW50Rm9ybURlZmF1bHQoWG1sTnNGb3JtLlVOUVVBTElGSUVEKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbE5zRm9ybS5VTlFVQUxJRklFRCwgc2NoZW1hQW5ub3RhdGlvbi5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hKGVsZW1lbnRGb3JtRGVmYXVsdCA9IFVOUVVBTElGSUVEKSIsIGN1KTsKLQkJCi0JCXNjaGVtYUFubm90YXRpb24uc2V0RWxlbWVudEZvcm1EZWZhdWx0KFhtbE5zRm9ybS5VTlNFVCk7Ci0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uVU5TRVQsIHNjaGVtYUFubm90YXRpb24uZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYShlbGVtZW50Rm9ybURlZmF1bHQgPSBVTlNFVCkiLCBjdSk7Ci0JCQotCQlzY2hlbWFBbm5vdGF0aW9uLnNldEVsZW1lbnRGb3JtRGVmYXVsdChudWxsKTsKLQkJc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSBwYWNrYWdlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlhc3NlcnROdWxsKHNjaGVtYUFubm90YXRpb24uZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbFNjaGVtYSgiLCBjdSk7Ci0JCQotCQlzY2hlbWFBbm5vdGF0aW9uID0gKFhtbFNjaGVtYUFubm90YXRpb24pIHBhY2thZ2VSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpBWEIuWE1MX1NDSEVNQSk7Ci0JCXNjaGVtYUFubm90YXRpb24uc2V0RWxlbWVudEZvcm1EZWZhdWx0KFhtbE5zRm9ybS5RVUFMSUZJRUQpOwotCQlhc3NlcnRFcXVhbHMoWG1sTnNGb3JtLlFVQUxJRklFRCwgc2NoZW1hQW5ub3RhdGlvbi5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hKGVsZW1lbnRGb3JtRGVmYXVsdCA9IFFVQUxJRklFRCkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMb2NhdGlvbigpIAotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlUGFja2FnZUluZm9XaXRoU2NoZW1hQW5kTG9jYXRpb24oKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSBwYWNrYWdlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVBhY2thZ2UoY3UpOyAKLQkJCi0JCVhtbFNjaGVtYUFubm90YXRpb24gc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSBwYWNrYWdlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYUFubm90YXRpb24uZ2V0TG9jYXRpb24oKSk7Ci0JCQotCQlzY2hlbWFBbm5vdGF0aW9uLnNldExvY2F0aW9uKG51bGwpOwotCQlzY2hlbWFBbm5vdGF0aW9uID0gKFhtbFNjaGVtYUFubm90YXRpb24pIHBhY2thZ2VSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NDSEVNQSk7Ci0JCWFzc2VydE51bGwoc2NoZW1hQW5ub3RhdGlvbi5nZXRMb2NhdGlvbigpKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxTY2hlbWEoIiwgY3UpOwotCQkKLQkJc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSBwYWNrYWdlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlzY2hlbWFBbm5vdGF0aW9uLnNldExvY2F0aW9uKFRFU1RfTE9DQVRJT04pOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9MT0NBVElPTiwgc2NoZW1hQW5ub3RhdGlvbi5nZXRMb2NhdGlvbigpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWEobG9jYXRpb24gPSBcIiIgKyBURVNUX0xPQ0FUSU9OICsgIlwiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5hbWVzcGFjZSgpIAotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlUGFja2FnZUluZm9XaXRoU2NoZW1hQW5kTmFtZXNwYWNlKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcGFja2FnZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VQYWNrYWdlKGN1KTsgCi0JCQotCQlYbWxTY2hlbWFBbm5vdGF0aW9uIHNjaGVtYUFubm90YXRpb24gPSAoWG1sU2NoZW1hQW5ub3RhdGlvbikgcGFja2FnZVJlc291cmNlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0NIRU1BKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWFBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCXNjaGVtYUFubm90YXRpb24uc2V0TmFtZXNwYWNlKG51bGwpOwotCQlzY2hlbWFBbm5vdGF0aW9uID0gKFhtbFNjaGVtYUFubm90YXRpb24pIHBhY2thZ2VSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NDSEVNQSk7Ci0JCWFzc2VydE51bGwoc2NoZW1hQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sU2NoZW1hKCIsIGN1KTsKLQkJCi0JCXNjaGVtYUFubm90YXRpb24gPSAoWG1sU2NoZW1hQW5ub3RhdGlvbikgcGFja2FnZVJlc291cmNlLmFkZEFubm90YXRpb24oSkFYQi5YTUxfU0NIRU1BKTsKLQkJc2NoZW1hQW5ub3RhdGlvbi5zZXROYW1lc3BhY2UoVEVTVF9OQU1FU1BBQ0UpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9OQU1FU1BBQ0UsIHNjaGVtYUFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYShuYW1lc3BhY2UgPSBcIiIgKyBURVNUX05BTUVTUEFDRSArICJcIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RYbWxuc05hbWVzcGFjZSgpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVQYWNrYWdlSW5mb1dpdGhTY2hlbWFBbmRYbWxuc1dpdGhOYW1lc3BhY2UoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSBwYWNrYWdlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVBhY2thZ2UoY3UpOyAKLQkJCi0JCVhtbFNjaGVtYUFubm90YXRpb24gc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSBwYWNrYWdlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlYbWxOc0Fubm90YXRpb24geG1sbnNBbm5vdGF0aW9uID0gc2NoZW1hQW5ub3RhdGlvbi54bWxuc0F0KDApOwotCQlhc3NlcnROb3ROdWxsKHhtbG5zQW5ub3RhdGlvbi5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCQotCQl4bWxuc0Fubm90YXRpb24uc2V0TmFtZXNwYWNlVVJJKG51bGwpOwotCQlhc3NlcnROdWxsKHhtbG5zQW5ub3RhdGlvbi5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hKHhtbG5zID0gQFhtbE5zKSIsIGN1KTsKLQkJCi0JCXhtbG5zQW5ub3RhdGlvbi5zZXROYW1lc3BhY2VVUkkoVEVTVF9OQU1FU1BBQ0VfMik7Ci0JCWFzc2VydEVxdWFscyhURVNUX05BTUVTUEFDRV8yLCB4bWxuc0Fubm90YXRpb24uZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYSh4bWxucyA9IEBYbWxOcyhuYW1lc3BhY2VVUkkgPSBcIiIgKyBURVNUX05BTUVTUEFDRV8yICsgIlwiKSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RYbWxuc1ByZWZpeCgpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVQYWNrYWdlSW5mb1dpdGhTY2hlbWFBbmRYbWxuc1dpdGhQcmVmaXgoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSBwYWNrYWdlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVBhY2thZ2UoY3UpOyAKLQkJCi0JCVhtbFNjaGVtYUFubm90YXRpb24gc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSBwYWNrYWdlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlYbWxOc0Fubm90YXRpb24geG1sbnNBbm5vdGF0aW9uID0gc2NoZW1hQW5ub3RhdGlvbi54bWxuc0F0KDApOwotCQlhc3NlcnROb3ROdWxsKHhtbG5zQW5ub3RhdGlvbi5nZXRQcmVmaXgoKSk7Ci0JCQotCQl4bWxuc0Fubm90YXRpb24uc2V0UHJlZml4KG51bGwpOwotCQlhc3NlcnROdWxsKHhtbG5zQW5ub3RhdGlvbi5nZXRQcmVmaXgoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hKHhtbG5zID0gQFhtbE5zKSIsIGN1KTsKLQkJCi0JCXhtbG5zQW5ub3RhdGlvbi5zZXRQcmVmaXgoVEVTVF9QUkVGSVhfMik7Ci0JCWFzc2VydEVxdWFscyhURVNUX1BSRUZJWF8yLCB4bWxuc0Fubm90YXRpb24uZ2V0UHJlZml4KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYSh4bWxucyA9IEBYbWxOcyhwcmVmaXggPSBcIiIgKyBURVNUX1BSRUZJWF8yICsgIlwiKSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RYbWxucygpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVQYWNrYWdlSW5mb1dpdGhTY2hlbWFBbmRYbWxucygpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHBhY2thZ2VSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlUGFja2FnZShjdSk7IAotCQkKLQkJWG1sU2NoZW1hQW5ub3RhdGlvbiBzY2hlbWFBbm5vdGF0aW9uID0gKFhtbFNjaGVtYUFubm90YXRpb24pIHBhY2thZ2VSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NDSEVNQSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHNjaGVtYUFubm90YXRpb24uZ2V0WG1sbnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMSwgc2NoZW1hQW5ub3RhdGlvbi5nZXRYbWxuc1NpemUoKSk7Ci0JCQotCQlzY2hlbWFBbm5vdGF0aW9uLmFkZFhtbG5zKDEpOwotCQlhc3NlcnRFcXVhbHMoMiwgc2NoZW1hQW5ub3RhdGlvbi5nZXRYbWxuc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hKHhtbG5zID0ge0BYbWxOcyxAWG1sTnN9KSIsIGN1KTsKLQkJCi0JCVhtbE5zQW5ub3RhdGlvbiB4bWxuc0Fubm90YXRpb24xID0gc2NoZW1hQW5ub3RhdGlvbi54bWxuc0F0KDApOwotCQl4bWxuc0Fubm90YXRpb24xLnNldE5hbWVzcGFjZVVSSShURVNUX05BTUVTUEFDRSk7Ci0JCXhtbG5zQW5ub3RhdGlvbjEuc2V0UHJlZml4KFRFU1RfUFJFRklYKTsKLQkJWG1sTnNBbm5vdGF0aW9uIHhtbG5zQW5ub3RhdGlvbjIgPSBzY2hlbWFBbm5vdGF0aW9uLnhtbG5zQXQoMSk7Ci0JCXhtbG5zQW5ub3RhdGlvbjIuc2V0TmFtZXNwYWNlVVJJKFRFU1RfTkFNRVNQQUNFXzIpOwotCQl4bWxuc0Fubm90YXRpb24yLnNldFByZWZpeChURVNUX1BSRUZJWF8yKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxTY2hlbWEoeG1sbnMgPSB7QFhtbE5zKG5hbWVzcGFjZVVSSSA9IFwiIiArIFRFU1RfTkFNRVNQQUNFIAotCQkJCQkrICJcIiwgcHJlZml4ID0gXCIiICsgVEVTVF9QUkVGSVggCi0JCQkJCSsgIlwiKSxAWG1sTnMobmFtZXNwYWNlVVJJID0gXCIiICsgVEVTVF9OQU1FU1BBQ0VfMgotCQkJCQkrICJcIiwgcHJlZml4ID0gXCIiICsgVEVTVF9QUkVGSVhfMgotCQkJCQkrICJcIil9KSIsIGN1KTsKLQkJCi0JCXNjaGVtYUFubm90YXRpb24ubW92ZVhtbG5zKDAsIDEpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygKLQkJCQkiQFhtbFNjaGVtYSh4bWxucyA9IHtAWG1sTnMobmFtZXNwYWNlVVJJID0gXCIiICsgVEVTVF9OQU1FU1BBQ0VfMgotCQkJCQkrICJcIiwgcHJlZml4ID0gXCIiICsgVEVTVF9QUkVGSVhfMgotCQkJCQkrICJcIiksQFhtbE5zKG5hbWVzcGFjZVVSSSA9IFwiIiArIFRFU1RfTkFNRVNQQUNFCi0JCQkJCSsgIlwiLCBwcmVmaXggPSBcIiIgKyBURVNUX1BSRUZJWAotCQkJCQkrICJcIil9KSIsIGN1KTsKLQkJCi0JCXNjaGVtYUFubm90YXRpb24ucmVtb3ZlWG1sbnMoMSk7Ci0JCWFzc2VydEVxdWFscygxLCBzY2hlbWFBbm5vdGF0aW9uLmdldFhtbG5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxTY2hlbWEoeG1sbnMgPSBAWG1sTnMobmFtZXNwYWNlVVJJID0gXCIiICsgVEVTVF9OQU1FU1BBQ0VfMgotCQkJCQkrICJcIiwgcHJlZml4ID0gXCIiICsgVEVTVF9QUkVGSVhfMgotCQkJCQkrICJcIikpIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFNjaGVtYVR5cGVBdHRyaWJ1dGVBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFNjaGVtYVR5cGVBdHRyaWJ1dGVBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRlYmFhOS4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxTY2hlbWFUeXBlQXR0cmlidXRlQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBYbWxTY2hlbWFUeXBlQXR0cmlidXRlQW5ub3RhdGlvblRlc3RzCi0JCWV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTkFNRSA9ICJmb28iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX05BTUVfMiA9ICJiYXIiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTkFNRVNQQUNFID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdGVzdC9zY2hlbWEiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX05BTUVTUEFDRV8yID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdGVzdC9zY2hlbWEyIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NMQVNTID0gR3JlZ29yaWFuQ2FsZW5kYXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NMQVNTXzIgPSBEYXRlLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlFfVEVTVF9DTEFTUyA9IEdyZWdvcmlhbkNhbGVuZGFyLmNsYXNzLmdldE5hbWUoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlFfVEVTVF9DTEFTU18yID0gRGF0ZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQotCXB1YmxpYyBYbWxTY2hlbWFUeXBlQXR0cmlidXRlQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sQXR0cmlidXRlV2l0aFNjaGVtYVR5cGVBbmROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFNjaGVtYVR5cGUobmFtZSA9IFwiIiArIFRFU1RfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxBdHRyaWJ1dGVXaXRoU2NoZW1hVHlwZUFuZE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxTY2hlbWFUeXBlKG5hbWVzcGFjZSA9IFwiIiArIFRFU1RfTkFNRVNQQUNFICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEF0dHJpYnV0ZVdpdGhTY2hlbWFUeXBlQW5kVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfU0NIRU1BX1RZUEUsIEZRX1RFU1RfQ0xBU1MsIEZRX1RFU1RfQ0xBU1NfMik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFNjaGVtYVR5cGUodHlwZSA9ICIgKyBURVNUX0NMQVNTICsgIi5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEF0dHJpYnV0ZVdpdGhTY2hlbWFUeXBlQW5kTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IHRoaXMuYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gdGhpcy5nZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCi0JCVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhURVNUX05BTUUsIGFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWFUeXBlKG5hbWUgPSBcIiIgKyBURVNUX05BTUUgKyAiXCIpIiwgY3UpOwotCi0JCWFubm90YXRpb24uc2V0TmFtZShURVNUX05BTUVfMik7Ci0JCWFzc2VydEVxdWFscyhURVNUX05BTUVfMiwgYW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYVR5cGUobmFtZSA9IFwiIiArIFRFU1RfTkFNRV8yICsgIlwiKSIsIGN1KTsKLQotCQlhbm5vdGF0aW9uLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hVHlwZSIsIGN1KTsKLQotCQlhbm5vdGF0aW9uLnNldE5hbWUoVEVTVF9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfTkFNRSwgYW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYVR5cGUobmFtZSA9IFwiIiArIFRFU1RfTkFNRSArICJcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sQXR0cmlidXRlV2l0aFNjaGVtYVR5cGVBbmROYW1lc3BhY2UoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSB0aGlzLmJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IHRoaXMuZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9OQU1FU1BBQ0UsIGFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYVR5cGUobmFtZXNwYWNlID0gXCIiICsgVEVTVF9OQU1FU1BBQ0UgKyAiXCIpIiwgY3UpOwotCi0JCWFubm90YXRpb24uc2V0TmFtZXNwYWNlKFRFU1RfTkFNRVNQQUNFXzIpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9OQU1FU1BBQ0VfMiwgYW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hVHlwZShuYW1lc3BhY2UgPSBcIiIgKyBURVNUX05BTUVTUEFDRV8yICsgIlwiKSIsIGN1KTsKLQotCQlhbm5vdGF0aW9uLnNldE5hbWVzcGFjZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYVR5cGUiLCBjdSk7Ci0KLQkJYW5ub3RhdGlvbi5zZXROYW1lc3BhY2UoVEVTVF9OQU1FU1BBQ0UpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9OQU1FU1BBQ0UsIGFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYVR5cGUobmFtZXNwYWNlID0gXCIiICsgVEVTVF9OQU1FU1BBQ0UgKyAiXCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxBdHRyaWJ1dGVXaXRoU2NoZW1hVHlwZUFuZFR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSB0aGlzLmJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IHRoaXMuZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9DTEFTUywgYW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRlFfVEVTVF9DTEFTUywgYW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hVHlwZSh0eXBlID0gIiArIFRFU1RfQ0xBU1MgKyAiLmNsYXNzKSIsIGN1KTsKLQotCQlhbm5vdGF0aW9uLnNldFR5cGUoVEVTVF9DTEFTU18yKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfQ0xBU1NfMiwgYW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRlFfVEVTVF9DTEFTU18yLCBhbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWFUeXBlKHR5cGUgPSAiICsgVEVTVF9DTEFTU18yICsgIi5jbGFzcykiLCBjdSk7Ci0KLQkJYW5ub3RhdGlvbi5zZXRUeXBlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hVHlwZSIsIGN1KTsKLQotCQlhbm5vdGF0aW9uLnNldFR5cGUoVEVTVF9DTEFTUyk7Ci0JCWFzc2VydEVxdWFscyhURVNUX0NMQVNTLCBhbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhGUV9URVNUX0NMQVNTLCBhbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWFUeXBlKHR5cGUgPSAiICsgVEVTVF9DTEFTUyArICIuY2xhc3MpIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFNjaGVtYVR5cGVQYWNrYWdlQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxTY2hlbWFUeXBlUGFja2FnZUFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTM1ODUxLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFNjaGVtYVR5cGVQYWNrYWdlQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxTY2hlbWFUeXBlQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sU2NoZW1hVHlwZVBhY2thZ2VBbm5vdGF0aW9uVGVzdHMKLQkJZXh0ZW5kcyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9OQU1FID0gImZvbyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTkFNRV8yID0gImJhciI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy90ZXN0L3NjaGVtYSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTkFNRVNQQUNFXzIgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy90ZXN0L3NjaGVtYTIiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ0xBU1MgPSBHcmVnb3JpYW5DYWxlbmRhci5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ0xBU1NfMiA9IERhdGUuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGUV9URVNUX0NMQVNTID0gR3JlZ29yaWFuQ2FsZW5kYXIuY2xhc3MuZ2V0TmFtZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGUV9URVNUX0NMQVNTXzIgPSBEYXRlLmNsYXNzLmdldE5hbWUoKTsKLQotCi0JcHVibGljIFhtbFNjaGVtYVR5cGVQYWNrYWdlQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aFNjaGVtYVR5cGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0UGFja2FnZUluZm8oCi0JCQkJIkBYbWxTY2hlbWFUeXBlIiwKLQkJCQlKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aFNjaGVtYVR5cGVBbmROYW1lKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFBhY2thZ2VJbmZvKAotCQkJCSJAWG1sU2NoZW1hVHlwZShuYW1lID0gXCIiICsgVEVTVF9OQU1FICsgIlwiKSIsCi0JCQkJSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVQYWNrYWdlSW5mb1dpdGhTY2hlbWFUeXBlQW5kTmFtZXNwYWNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFBhY2thZ2VJbmZvKAotCQkJCSJAWG1sU2NoZW1hVHlwZShuYW1lc3BhY2UgPSBcIiIgKyBURVNUX05BTUVTUEFDRSArICJcIikiLAotCQkJCUpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlUGFja2FnZUluZm9XaXRoU2NoZW1hVHlwZUFuZFR5cGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0UGFja2FnZUluZm8oCi0JCQkJIkBYbWxTY2hlbWFUeXBlKHR5cGUgPSAiICsgVEVTVF9DTEFTUyArICIuY2xhc3MpIiwKLQkJCQlKQVhCLlhNTF9TQ0hFTUFfVFlQRSwgRlFfVEVTVF9DTEFTUywgRlFfVEVTVF9DTEFTU18yKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlUGFja2FnZUluZm9XaXRoU2NoZW1hVHlwZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0UGFja2FnZUluZm8oCi0JCQkJIkBYbWxTY2hlbWFUeXBlcyh7QFhtbFNjaGVtYVR5cGUsQFhtbFNjaGVtYVR5cGV9KSIsCi0JCQkJSkFYQi5YTUxfU0NIRU1BX1RZUEVTLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSwgRlFfVEVTVF9DTEFTUywgRlFfVEVTVF9DTEFTU18yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlUGFja2FnZUluZm9XaXRoU2NoZW1hVHlwZUFuZE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBidWlsZEphdmFSZXNvdXJjZVBhY2thZ2UoY3UpOyAKLQotCQlYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfTkFNRSwgYW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYVR5cGUobmFtZSA9IFwiIiArIFRFU1RfTkFNRSArICJcIikiLCBjdSk7Ci0KLQkJYW5ub3RhdGlvbi5zZXROYW1lKFRFU1RfTkFNRV8yKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfTkFNRV8yLCBhbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hVHlwZShuYW1lID0gXCIiICsgVEVTVF9OQU1FXzIgKyAiXCIpIiwgY3UpOwotCi0JCWFubm90YXRpb24uc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWFUeXBlIiwgY3UpOwotCi0JCWFubm90YXRpb24uc2V0TmFtZShURVNUX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9OQU1FLCBhbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hVHlwZShuYW1lID0gXCIiICsgVEVTVF9OQU1FICsgIlwiKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVQYWNrYWdlSW5mb1dpdGhTY2hlbWFUeXBlQW5kTmFtZXNwYWNlKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gYnVpbGRKYXZhUmVzb3VyY2VQYWNrYWdlKGN1KTsgCi0KLQkJWG1sU2NoZW1hVHlwZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhURVNUX05BTUVTUEFDRSwgYW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hVHlwZShuYW1lc3BhY2UgPSBcIiIgKyBURVNUX05BTUVTUEFDRSArICJcIikiLCBjdSk7Ci0KLQkJYW5ub3RhdGlvbi5zZXROYW1lc3BhY2UoVEVTVF9OQU1FU1BBQ0VfMik7Ci0JCWFzc2VydEVxdWFscyhURVNUX05BTUVTUEFDRV8yLCBhbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWFUeXBlKG5hbWVzcGFjZSA9IFwiIiArIFRFU1RfTkFNRVNQQUNFXzIgKyAiXCIpIiwgY3UpOwotCi0JCWFubm90YXRpb24uc2V0TmFtZXNwYWNlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hVHlwZSIsIGN1KTsKLQotCQlhbm5vdGF0aW9uLnNldE5hbWVzcGFjZShURVNUX05BTUVTUEFDRSk7Ci0JCWFzc2VydEVxdWFscyhURVNUX05BTUVTUEFDRSwgYW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hVHlwZShuYW1lc3BhY2UgPSBcIiIgKyBURVNUX05BTUVTUEFDRSArICJcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aFNjaGVtYVR5cGVBbmRUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gYnVpbGRKYXZhUmVzb3VyY2VQYWNrYWdlKGN1KTsgCi0KLQkJWG1sU2NoZW1hVHlwZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhURVNUX0NMQVNTLCBhbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhGUV9URVNUX0NMQVNTLCBhbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWFUeXBlKHR5cGUgPSAiICsgVEVTVF9DTEFTUyArICIuY2xhc3MpIiwgY3UpOwotCi0JCWFubm90YXRpb24uc2V0VHlwZShURVNUX0NMQVNTXzIpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9DTEFTU18yLCBhbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhGUV9URVNUX0NMQVNTXzIsIGFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYVR5cGUodHlwZSA9ICIgKyBURVNUX0NMQVNTXzIgKyAiLmNsYXNzKSIsIGN1KTsKLQotCQlhbm5vdGF0aW9uLnNldFR5cGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWFUeXBlIiwgY3UpOwotCi0JCWFubm90YXRpb24uc2V0VHlwZShURVNUX0NMQVNTKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfQ0xBU1MsIGFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZRX1RFU1RfQ0xBU1MsIGFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYVR5cGUodHlwZSA9ICIgKyBURVNUX0NMQVNTICsgIi5jbGFzcykiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5lZFdpdGhOYW1lKCkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHRlc3QgY29udGFpbmVkIGFubm90YXRpb24gdmFsdWUgc2V0dGluZy91cGRhdGluZwotCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVQYWNrYWdlSW5mb1dpdGhTY2hlbWFUeXBlcygpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGJ1aWxkSmF2YVJlc291cmNlUGFja2FnZShjdSk7Ci0KLQkJWG1sU2NoZW1hVHlwZUFubm90YXRpb24gY29udGFpbmVkQW5ub3RhdGlvbiA9IAotCQkJCShYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCi0JCWNvbnRhaW5lZEFubm90YXRpb24uc2V0TmFtZShURVNUX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9OQU1FLCBjb250YWluZWRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sU2NoZW1hVHlwZXMoe0BYbWxTY2hlbWFUeXBlKG5hbWUgPSBcIiIgKyBURVNUX05BTUUgKyAiXCIpLEBYbWxTY2hlbWFUeXBlfSkiLCBjdSk7Ci0KLQkJY29udGFpbmVkQW5ub3RhdGlvbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbnRhaW5lZEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxTY2hlbWFUeXBlcyh7QFhtbFNjaGVtYVR5cGUsQFhtbFNjaGVtYVR5cGV9KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbmVkV2l0aE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyB0ZXN0IGNvbnRhaW5lZCBhbm5vdGF0aW9uIHZhbHVlIHNldHRpbmcvdXBkYXRpbmcKLQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlUGFja2FnZUluZm9XaXRoU2NoZW1hVHlwZXMoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBidWlsZEphdmFSZXNvdXJjZVBhY2thZ2UoY3UpOwotCi0JCVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIGNvbnRhaW5lZEFubm90YXRpb24gPSAKLQkJCShYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCi0JCWNvbnRhaW5lZEFubm90YXRpb24uc2V0TmFtZXNwYWNlKFRFU1RfTkFNRVNQQUNFKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfTkFNRVNQQUNFLCBjb250YWluZWRBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxTY2hlbWFUeXBlcyh7QFhtbFNjaGVtYVR5cGUobmFtZXNwYWNlID0gXCIiICsgVEVTVF9OQU1FU1BBQ0UgKyAiXCIpLEBYbWxTY2hlbWFUeXBlfSkiLCBjdSk7Ci0KLQkJY29udGFpbmVkQW5ub3RhdGlvbi5zZXROYW1lc3BhY2UobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udGFpbmVkQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sU2NoZW1hVHlwZXMoe0BYbWxTY2hlbWFUeXBlLEBYbWxTY2hlbWFUeXBlfSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5lZFdpdGhUeXBlKCl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gdGVzdCBjb250YWluZWQgYW5ub3RhdGlvbiB0eXBlIHNldHRpbmcvdXBkYXRpbmcKLQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlUGFja2FnZUluZm9XaXRoU2NoZW1hVHlwZXMoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBidWlsZEphdmFSZXNvdXJjZVBhY2thZ2UoY3UpOwotCi0JCVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIGNvbnRhaW5lZEFubm90YXRpb24gPSAKLQkJCShYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oMSwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCi0JCWNvbnRhaW5lZEFubm90YXRpb24uc2V0VHlwZShURVNUX0NMQVNTKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfQ0xBU1MsIGNvbnRhaW5lZEFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZRX1RFU1RfQ0xBU1MsIGNvbnRhaW5lZEFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygKLQkJCQkiQFhtbFNjaGVtYVR5cGVzKHtAWG1sU2NoZW1hVHlwZSxAWG1sU2NoZW1hVHlwZSh0eXBlID0gIiArIFRFU1RfQ0xBU1MgKyAiLmNsYXNzKX0pIiwgY3UpOwotCi0JCWNvbnRhaW5lZEFubm90YXRpb24uc2V0VHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb250YWluZWRBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoRlFfVEVTVF9DTEFTUywgY29udGFpbmVkQW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sU2NoZW1hVHlwZXMoe0BYbWxTY2hlbWFUeXBlLEBYbWxTY2hlbWFUeXBlfSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5lZCgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyB0ZXN0IGFkZGluZy9yZW1vdmluZy9tb3ZpbmcKLQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlUGFja2FnZUluZm9XaXRoU2NoZW1hVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGJ1aWxkSmF2YVJlc291cmNlUGFja2FnZShjdSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uc1NpemUoSkFYQi5YTUxfU0NIRU1BX1RZUEUpKTsKLQotCQlyZXNvdXJjZVBhY2thZ2UuYWRkQW5ub3RhdGlvbigxLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uc1NpemUoSkFYQi5YTUxfU0NIRU1BX1RZUEUpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWFUeXBlcyh7IEBYbWxTY2hlbWFUeXBlLCBAWG1sU2NoZW1hVHlwZSB9KSIsIGN1KTsKLQotCQlYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbiBjb250YWluZWRBbm5vdGF0aW9uMSA9IChYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQljb250YWluZWRBbm5vdGF0aW9uMS5zZXROYW1lKFRFU1RfTkFNRSk7Ci0JCVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIGNvbnRhaW5lZEFubm90YXRpb24yID0gKFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbigxLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCWNvbnRhaW5lZEFubm90YXRpb24yLnNldE5hbWUoVEVTVF9OQU1FXzIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygKLQkJCQkiQFhtbFNjaGVtYVR5cGVzKHsgQFhtbFNjaGVtYVR5cGUobmFtZSA9IFwiIiArIFRFU1RfTkFNRQotCQkJCQkrICJcIiksIEBYbWxTY2hlbWFUeXBlKG5hbWUgPSBcIiIgKyBURVNUX05BTUVfMgotCQkJCQkrICJcIikgfSkiLCBjdSk7Ci0KLQkJcmVzb3VyY2VQYWNrYWdlLm1vdmVBbm5vdGF0aW9uKDAsIDEsIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxTY2hlbWFUeXBlcyh7IEBYbWxTY2hlbWFUeXBlKG5hbWUgPSBcIiIgKyBURVNUX05BTUVfMgotCQkJCQkrICJcIiksIEBYbWxTY2hlbWFUeXBlKG5hbWUgPSBcIiIgKyBURVNUX05BTUUKLQkJCQkJKyAiXCIpIH0pIiwgY3UpOwotCi0JCXJlc291cmNlUGFja2FnZS5yZW1vdmVBbm5vdGF0aW9uKDEsIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uc1NpemUoSkFYQi5YTUxfU0NIRU1BX1RZUEUpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxTY2hlbWFUeXBlKG5hbWUgPSBcIiIgKyBURVNUX05BTUVfMiArICJcIikiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sU2NoZW1hVHlwZXMiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sU2VlQWxzb0Fubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sU2VlQWxzb0Fubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDBiN2I2Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFNlZUFsc29Bbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFNlZUFsc29Bbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBYbWxTZWVBbHNvQW5ub3RhdGlvblRlc3RzCi0JCWV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIFhtbFNlZUFsc29Bbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxTZWVBbHNvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9TRUVfQUxTTyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFNlZUFsc28iKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxTZWVBbHNvV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9TRUVfQUxTTyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFNlZUFsc28odmFsdWUgPSB7Rm9vLmNsYXNzLCBCYXIuY2xhc3N9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxTZWVBbHNvKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sU2VlQWxzb0Fubm90YXRpb24geG1sU2VlQWxzb0Fubm90YXRpb24gPSAoWG1sU2VlQWxzb0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NFRV9BTFNPKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxTZWVBbHNvQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHhtbFNlZUFsc29Bbm5vdGF0aW9uLmdldENsYXNzZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDbGFzc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxTZWVBbHNvV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sU2VlQWxzb0Fubm90YXRpb24geG1sU2VlQWxzb0Fubm90YXRpb24gPSAoWG1sU2VlQWxzb0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NFRV9BTFNPKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxTZWVBbHNvQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NlcyA9IHhtbFNlZUFsc29Bbm5vdGF0aW9uLmdldENsYXNzZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNsYXNzZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjbGFzc2VzLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENsYXNzZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxTZWVBbHNvV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sU2VlQWxzb0Fubm90YXRpb24geG1sU2VlQWxzb0Fubm90YXRpb24gPSAoWG1sU2VlQWxzb0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NFRV9BTFNPKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxTZWVBbHNvQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHhtbFNlZUFsc29Bbm5vdGF0aW9uLmdldENsYXNzZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sU2VlQWxzbygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFNlZUFsc29Bbm5vdGF0aW9uIHhtbFNlZUFsc29Bbm5vdGF0aW9uID0gKFhtbFNlZUFsc29Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TRUVfQUxTTyk7Ci0JCWFzc2VydFRydWUoeG1sU2VlQWxzb0Fubm90YXRpb24gIT0gbnVsbCk7Ci0KLQkJeG1sU2VlQWxzb0Fubm90YXRpb24uYWRkQ2xhc3MoIkZvb28iKTsKLQkJeG1sU2VlQWxzb0Fubm90YXRpb24uYWRkQ2xhc3MoIkJhcnJyIik7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTZWVBbHNvKHsgRm9vby5jbGFzcywgQmFycnIuY2xhc3MgfSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZENsYXNzSW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbFNlZUFsc28oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxTZWVBbHNvQW5ub3RhdGlvbiB4bWxTZWVBbHNvQW5ub3RhdGlvbiA9IChYbWxTZWVBbHNvQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0VFX0FMU08pOwotCQlhc3NlcnRUcnVlKHhtbFNlZUFsc29Bbm5vdGF0aW9uICE9IG51bGwpOwotCi0JCXhtbFNlZUFsc29Bbm5vdGF0aW9uLmFkZENsYXNzKDAsICJGb29vIik7Ci0JCXhtbFNlZUFsc29Bbm5vdGF0aW9uLmFkZENsYXNzKDAsICJCYXJyIik7Ci0JCXhtbFNlZUFsc29Bbm5vdGF0aW9uLmFkZENsYXNzKDEsICJCbGFoIik7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTZWVBbHNvKHsgQmFyci5jbGFzcywgQmxhaC5jbGFzcywgRm9vby5jbGFzcyB9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxTZWVBbHNvV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sU2VlQWxzb0Fubm90YXRpb24geG1sU2VlQWxzb0Fubm90YXRpb24gPSAoWG1sU2VlQWxzb0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NFRV9BTFNPKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxTZWVBbHNvQW5ub3RhdGlvbiAhPSBudWxsKTsKLQotCQl4bWxTZWVBbHNvQW5ub3RhdGlvbi5yZW1vdmVDbGFzcygwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTZWVBbHNvKHZhbHVlID0gQmFyLmNsYXNzKSIsIGN1KTsKLQotCQl4bWxTZWVBbHNvQW5ub3RhdGlvbi5yZW1vdmVDbGFzcygwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTZWVBbHNvIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigidmFsdWUiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sU2VlQWxzbygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFNlZUFsc29Bbm5vdGF0aW9uIHhtbFNlZUFsc29Bbm5vdGF0aW9uID0gKFhtbFNlZUFsc29Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TRUVfQUxTTyk7Ci0JCWFzc2VydFRydWUoeG1sU2VlQWxzb0Fubm90YXRpb24gIT0gbnVsbCk7Ci0KLQkJeG1sU2VlQWxzb0Fubm90YXRpb24uYWRkQ2xhc3MoIkZvb28iKTsKLQkJeG1sU2VlQWxzb0Fubm90YXRpb24uYWRkQ2xhc3MoIkJhcnIiKTsKLQkJeG1sU2VlQWxzb0Fubm90YXRpb24uYWRkQ2xhc3MoIkJsYWgiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTZWVBbHNvKHsgRm9vby5jbGFzcywgQmFyci5jbGFzcywgQmxhaC5jbGFzcyB9KSIsIGN1KTsKLQotCQl4bWxTZWVBbHNvQW5ub3RhdGlvbi5tb3ZlQ2xhc3MoMCwgMSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2VlQWxzbyh7IEJhcnIuY2xhc3MsIEZvb28uY2xhc3MsIEJsYWguY2xhc3MgfSkiLCBjdSk7Ci0KLQkJeG1sU2VlQWxzb0Fubm90YXRpb24ubW92ZUNsYXNzKDIsIDEpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNlZUFsc28oeyBCYXJyLmNsYXNzLCBCbGFoLmNsYXNzLCBGb29vLmNsYXNzIH0pIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFRyYW5zaWVudEF0dHJpYnV0ZUFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sVHJhbnNpZW50QXR0cmlidXRlQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NmE1OTQuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sVHJhbnNpZW50QXR0cmlidXRlQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sVHJhbnNpZW50QW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sVHJhbnNpZW50QXR0cmlidXRlQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIFhtbFRyYW5zaWVudEF0dHJpYnV0ZUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbFRyYW5zaWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFJBTlNJRU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFRyYW5zaWVudCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0WG1sVHJhbnNpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxUcmFuc2llbnQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSB0aGlzLmJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSB0aGlzLmdldE1ldGhvZChyZXNvdXJjZVR5cGUsIDApOwotCi0JCVhtbFRyYW5zaWVudEFubm90YXRpb24geG1sVHJhbnNpZW50QW5ub3RhdGlvbiA9IChYbWxUcmFuc2llbnRBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RSQU5TSUVOVCk7Ci0JCWFzc2VydFRydWUoeG1sVHJhbnNpZW50QW5ub3RhdGlvbiAhPSBudWxsKTsKLQotCQlyZXNvdXJjZU1ldGhvZC5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX1RSQU5TSUVOVCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sVHJhbnNpZW50IiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFRyYW5zaWVudFR5cGVBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFRyYW5zaWVudFR5cGVBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE3Njg2NS4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxUcmFuc2llbnRUeXBlQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxUcmFuc2llbnRBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBYbWxUcmFuc2llbnRUeXBlQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIFhtbFRyYW5zaWVudFR5cGVBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxUcmFuc2llbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RSQU5TSUVOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFRyYW5zaWVudCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0WG1sVHJhbnNpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxUcmFuc2llbnQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxUcmFuc2llbnRBbm5vdGF0aW9uIHhtbFRyYW5zaWVudEFubm90YXRpb24gPSAoWG1sVHJhbnNpZW50QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFJBTlNJRU5UKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxUcmFuc2llbnRBbm5vdGF0aW9uICE9IG51bGwpOwotCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX1RSQU5TSUVOVCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sVHJhbnNpZW50IiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFR5cGVBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFR5cGVBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk5NWVkNC4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxUeXBlQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxUeXBlQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sVHlwZUFubm90YXRpb25UZXN0cyBleHRlbmRzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVFlQRV9OQU1FID0gIlhtbFR5cGVOYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RZUEVfTkFNRVNQQUNFID0gIlhtbFR5cGVOYW1lc3BhY2UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVFlQRV9GQUNUT1JZX01FVEhPRCA9ICJteUZhY3RvcnlNZXRob2QiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVFlQRV9GQUNUT1JZX0NMQVNTID0gIk15RmFjdG9yeUNsYXNzIjsKLQotCXB1YmxpYyBYbWxUeXBlQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxUeXBlV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlKG5hbWUgPSBcIiIgKyBYTUxfVFlQRV9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbFR5cGVXaXRoTmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZShuYW1lc3BhY2UgPSBcIiIgKyBYTUxfVFlQRV9OQU1FU1BBQ0UgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sVHlwZVdpdGhGYWN0b3J5TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZShmYWN0b3J5TWV0aG9kID0gXCIiICsgWE1MX1RZUEVfRkFDVE9SWV9NRVRIT0QgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sVHlwZVdpdGhGYWN0b3J5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RmFjdG9yeUNsYXNzKCk7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZShmYWN0b3J5Q2xhc3MgPSAiICsgWE1MX1RZUEVfRkFDVE9SWV9DTEFTUyAgKyAiLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEZhY3RvcnlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZChYTUxfVFlQRV9GQUNUT1JZX0NMQVNTKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiTXlGYWN0b3J5Q2xhc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxUeXBlV2l0aFByb3BPcmRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUocHJvcE9yZGVyID0ge1wiZm9vXCIsIFwiYmFyXCJ9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sVHlwZVdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sVHlwZUFubm90YXRpb24geG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlhc3NlcnRUcnVlKHhtbFR5cGVBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX1RZUEVfTkFNRSwgeG1sVHlwZUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFR5cGVBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxUeXBlQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxUeXBlQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHhtbFR5cGVBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxUeXBlQW5ub3RhdGlvbi5nZXRGYWN0b3J5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoeG1sVHlwZUFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRGYWN0b3J5Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKHhtbFR5cGVBbm5vdGF0aW9uLmdldEZhY3RvcnlNZXRob2QoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbFR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxUeXBlQW5ub3RhdGlvbiB4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCWFzc2VydE51bGwoeG1sVHlwZUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJeG1sVHlwZUFubm90YXRpb24uc2V0TmFtZShYTUxfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9UWVBFX05BTUUsIHhtbFR5cGVBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxUeXBlKG5hbWUgPSBcIiIgKyBYTUxfVFlQRV9OQU1FICsgIlwiKSIsIGN1KTsKLQotCQl4bWxUeXBlQW5ub3RhdGlvbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHhtbFR5cGVBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxUeXBlIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbFR5cGUobmFtZSA9IFwiIiArIFhNTF9UWVBFX05BTUUgKyAiXCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbFR5cGVXaXRoTmFtZXNwYWNlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sVHlwZUFubm90YXRpb24geG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlhc3NlcnRUcnVlKHhtbFR5cGVBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX1RZUEVfTkFNRVNQQUNFLCB4bWxUeXBlQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFR5cGVBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0TnVsbCh4bWxUeXBlQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCXhtbFR5cGVBbm5vdGF0aW9uLnNldE5hbWVzcGFjZShYTUxfVFlQRV9OQU1FU1BBQ0UpOwotCQlhc3NlcnRFcXVhbHMoWE1MX1RZUEVfTkFNRVNQQUNFLCB4bWxUeXBlQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxUeXBlKG5hbWVzcGFjZSA9IFwiIiArIFhNTF9UWVBFX05BTUVTUEFDRSArICJcIikiLCBjdSk7Ci0KLQkJeG1sVHlwZUFubm90YXRpb24uc2V0TmFtZXNwYWNlKG51bGwpOwotCQlhc3NlcnROdWxsKHhtbFR5cGVBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFR5cGUiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sVHlwZShuYW1lc3BhY2UgPSBcIiIgKyBYTUxfVFlQRV9OQU1FU1BBQ0UgKyAiXCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGYWN0b3J5TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxUeXBlV2l0aEZhY3RvcnlNZXRob2QoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxUeXBlQW5ub3RhdGlvbiB4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCWFzc2VydFRydWUoeG1sVHlwZUFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfVFlQRV9GQUNUT1JZX01FVEhPRCwgeG1sVHlwZUFubm90YXRpb24uZ2V0RmFjdG9yeU1ldGhvZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmFjdG9yeU1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFR5cGVBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0TnVsbCh4bWxUeXBlQW5ub3RhdGlvbi5nZXRGYWN0b3J5TWV0aG9kKCkpOwotCQl4bWxUeXBlQW5ub3RhdGlvbi5zZXRGYWN0b3J5TWV0aG9kKFhNTF9UWVBFX0ZBQ1RPUllfTUVUSE9EKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9UWVBFX0ZBQ1RPUllfTUVUSE9ELCB4bWxUeXBlQW5ub3RhdGlvbi5nZXRGYWN0b3J5TWV0aG9kKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sVHlwZShmYWN0b3J5TWV0aG9kID0gXCIiICsgWE1MX1RZUEVfRkFDVE9SWV9NRVRIT0QgKyAiXCIpIiwgY3UpOwotCi0JCXhtbFR5cGVBbm5vdGF0aW9uLnNldEZhY3RvcnlNZXRob2QobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sVHlwZUFubm90YXRpb24uZ2V0RmFjdG9yeU1ldGhvZCgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFR5cGUiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sVHlwZShmYWN0b3J5TWV0aG9kID0gXCIiICsgWE1MX1RZUEVfRkFDVE9SWV9NRVRIT0QgKyAiXCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGYWN0b3J5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbFR5cGVXaXRoRmFjdG9yeUNsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sVHlwZUFubm90YXRpb24geG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlhc3NlcnRUcnVlKHhtbFR5cGVBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX1RZUEVfRkFDVE9SWV9DTEFTUywgeG1sVHlwZUFubm90YXRpb24uZ2V0RmFjdG9yeUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QuIiArIFhNTF9UWVBFX0ZBQ1RPUllfQ0xBU1MsIHhtbFR5cGVBbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkRmFjdG9yeUNsYXNzTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmFjdG9yeUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sVHlwZUFubm90YXRpb24geG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlhc3NlcnROdWxsKHhtbFR5cGVBbm5vdGF0aW9uLmdldEZhY3RvcnlDbGFzcygpKTsKLQkJeG1sVHlwZUFubm90YXRpb24uc2V0RmFjdG9yeUNsYXNzKFhNTF9UWVBFX0ZBQ1RPUllfQ0xBU1MpOwotCQlhc3NlcnRFcXVhbHMoWE1MX1RZUEVfRkFDVE9SWV9DTEFTUywgeG1sVHlwZUFubm90YXRpb24uZ2V0RmFjdG9yeUNsYXNzKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sVHlwZShmYWN0b3J5Q2xhc3MgPSAiICsgWE1MX1RZUEVfRkFDVE9SWV9DTEFTUyAgKyAiLmNsYXNzIiwgY3UpOwotCi0JCXhtbFR5cGVBbm5vdGF0aW9uLnNldEZhY3RvcnlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxUeXBlQW5ub3RhdGlvbi5nZXRGYWN0b3J5Q2xhc3MoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxUeXBlIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbFR5cGUoZmFjdG9yeUNsYXNzID0gIiArIFhNTF9UWVBFX0ZBQ1RPUllfQ0xBU1MgICsgIi5jbGFzcyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvcE9yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxUeXBlV2l0aFByb3BPcmRlcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFR5cGVBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxUeXBlQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gcHJvcE9yZGVyID0geG1sVHlwZUFubm90YXRpb24uZ2V0UHJvcE9yZGVyKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBwcm9wT3JkZXIubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBwcm9wT3JkZXIubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvcE9yZGVyU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sVHlwZVdpdGhQcm9wT3JkZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxUeXBlQW5ub3RhdGlvbiB4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCWFzc2VydFRydWUoeG1sVHlwZUFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscygyLCB4bWxUeXBlQW5ub3RhdGlvbi5nZXRQcm9wT3JkZXJTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRQcm9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sVHlwZUFubm90YXRpb24geG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlhc3NlcnRUcnVlKHhtbFR5cGVBbm5vdGF0aW9uICE9IG51bGwpOwotCi0JCXhtbFR5cGVBbm5vdGF0aW9uLmFkZFByb3AoImZvb28iKTsKLQkJeG1sVHlwZUFubm90YXRpb24uYWRkUHJvcCgiYmFyciIpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sVHlwZShwcm9wT3JkZXIgPSB7IFwiZm9vb1wiLCBcImJhcnJcIiB9KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUHJvcEluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sVHlwZUFubm90YXRpb24geG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlhc3NlcnRUcnVlKHhtbFR5cGVBbm5vdGF0aW9uICE9IG51bGwpOwotCi0JCXhtbFR5cGVBbm5vdGF0aW9uLmFkZFByb3AoMCwgImZvb28iKTsKLQkJeG1sVHlwZUFubm90YXRpb24uYWRkUHJvcCgwLCAiYmFyciIpOwotCQl4bWxUeXBlQW5ub3RhdGlvbi5hZGRQcm9wKDEsICJibGFoIik7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxUeXBlKHByb3BPcmRlciA9IHsgXCJiYXJyXCIsIFwiYmxhaFwiLCBcImZvb29cIiB9KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUHJvcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sVHlwZVdpdGhQcm9wT3JkZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxUeXBlQW5ub3RhdGlvbiB4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCWFzc2VydFRydWUoeG1sVHlwZUFubm90YXRpb24gIT0gbnVsbCk7Ci0KLQkJeG1sVHlwZUFubm90YXRpb24ucmVtb3ZlUHJvcCgiZm9vIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sVHlwZShwcm9wT3JkZXIgPSBcImJhclwiKSIsIGN1KTsKLQotCQl4bWxUeXBlQW5ub3RhdGlvbi5yZW1vdmVQcm9wKCJiYXIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxUeXBlIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigicHJvcE9yZGVyIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQcm9wSW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbFR5cGVXaXRoUHJvcE9yZGVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sVHlwZUFubm90YXRpb24geG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlhc3NlcnRUcnVlKHhtbFR5cGVBbm5vdGF0aW9uICE9IG51bGwpOwotCi0JCXhtbFR5cGVBbm5vdGF0aW9uLnJlbW92ZVByb3AoMCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sVHlwZShwcm9wT3JkZXIgPSBcImJhclwiKSIsIGN1KTsKLQotCQl4bWxUeXBlQW5ub3RhdGlvbi5yZW1vdmVQcm9wKDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFR5cGUiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJwcm9wT3JkZXIiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVQcm9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sVHlwZUFubm90YXRpb24geG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlhc3NlcnRUcnVlKHhtbFR5cGVBbm5vdGF0aW9uICE9IG51bGwpOwotCi0JCXhtbFR5cGVBbm5vdGF0aW9uLmFkZFByb3AoImZvb28iKTsKLQkJeG1sVHlwZUFubm90YXRpb24uYWRkUHJvcCgiYmFyciIpOwotCQl4bWxUeXBlQW5ub3RhdGlvbi5hZGRQcm9wKCJibGFoIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sVHlwZShwcm9wT3JkZXIgPSB7IFwiZm9vb1wiLCBcImJhcnJcIiwgXCJibGFoXCIgfSkiLCBjdSk7Ci0KLQkJeG1sVHlwZUFubm90YXRpb24ubW92ZVByb3AoMCwgMSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sVHlwZShwcm9wT3JkZXIgPSB7IFwiYmFyclwiLCBcImZvb29cIiwgXCJibGFoXCIgfSkiLCBjdSk7Ci0KLQkJeG1sVHlwZUFubm90YXRpb24ubW92ZVByb3AoMiwgMSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sVHlwZShwcm9wT3JkZXIgPSB7IFwiYmFyclwiLCBcImJsYWhcIiwgXCJmb29vXCIgfSkiLCBjdSk7CQkKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxWYWx1ZUFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sVmFsdWVBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI2MzVhMy4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxWYWx1ZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sVmFsdWVBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBYbWxWYWx1ZUFubm90YXRpb25UZXN0cyBleHRlbmRzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBYbWxWYWx1ZUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9WQUxVRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFZhbHVlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRYbWxWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCi0JCVhtbFZhbHVlQW5ub3RhdGlvbiB4bWxWYWx1ZUFubm90YXRpb24gPSAoWG1sVmFsdWVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxWYWx1ZUFubm90YXRpb24gIT0gbnVsbCk7Ci0KLQkJcmVzb3VyY2VBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9WQUxVRSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sVmFsdWUiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3Rlc3QueG1sIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODZjNjk0Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uY2xhc3NwYXRoIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YjdjOTMuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLmN2c2lnbm9yZSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLnByb2plY3QgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNTEzZjYuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxMjllZC4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1RodSBNYXkgMDUgMTc6MjU6MTEgRURUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMmJlM2MuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLURhbGktQ29tbWVudDogamRrIDEuNiBoYXMgdGhlIGphdmF4LnhtbC5iaW5kIGFubm90YXRpb25zCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuNgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5KcHRKYXhiRWNsaXBzZUxpbmtDb3JlVGVzdHNQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy43LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHM7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cztidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjQuMjAwLDIuMC4wKSIsCi0gb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSJbNC4wLjAsNS4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvYWJvdXQuaHRtbCBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZDI5YmMuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NjFjYzQuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgSkFYQiBDb3JlIFRlc3RzCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9KcHRKYXhiRWNsaXBzZUxpbmtDb3JlVGVzdHNQbHVnaW4uamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9KcHRKYXhiRWNsaXBzZUxpbmtDb3JlVGVzdHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRiNjczNS4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvSnB0SmF4YkVjbGlwc2VMaW5rQ29yZVRlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KcHRKYXhiQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnByZWZzLkpheGJQcmVmZXJlbmNlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogY29uZmlndXJlIHRoZSBjb3JlIHRvIGhhbmRsZSBldmVudHMgc3luY2hyb25vdXNseSB3aGVuIHdlIGFyZQotICogcnVubmluZyB0ZXN0cwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKcHRKYXhiRWNsaXBzZUxpbmtDb3JlVGVzdHNQbHVnaW4KLQkJZXh0ZW5kcyBQbHVnaW4gewotCQotCXByaXZhdGUgc3RhdGljIEpwdEpheGJFY2xpcHNlTGlua0NvcmVUZXN0c1BsdWdpbiBJTlNUQU5DRTsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIEpwdEpheGJFY2xpcHNlTGlua0NvcmVUZXN0c1BsdWdpbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkJCi0JLy8gKioqKioqKioqKiBwbHVnLWluIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgSnB0SmF4YkVjbGlwc2VMaW5rQ29yZVRlc3RzUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoSU5TVEFOQ0UgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIHRoaXMgY29udmVudGlvbiBpcyAqd2FjayouLi4gIH5ianYKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJSmF4YlByb2plY3RNYW5hZ2VyIGpheGJQcm9qZWN0TWFuYWdlciA9IEpwdEpheGJDb3JlUGx1Z2luLmdldFByb2plY3RNYW5hZ2VyKCk7Ci0JCVJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKGpheGJQcm9qZWN0TWFuYWdlciwgImhhbmRsZUV2ZW50c1N5bmNocm9ub3VzbHkiKTsKLQkJUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVTdGF0aWNNZXRob2QoSmF4YlByZWZlcmVuY2VzTWFuYWdlci5jbGFzcywgImRvTm90Rmx1c2hQcmVmZXJlbmNlcyIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL0VMSmF4YkNvcmVUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL0VMSmF4YkNvcmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzNkODBjLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9FTEpheGJDb3JlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXhiUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRUxKYXhiQ29yZUNvbnRleHRNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuRUxKYXhiQ29yZVJlc291cmNlTW9kZWxUZXN0czsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXhiQ29yZVRlc3RzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoRUxKYXhiQ29yZVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEVMSmF4YkNvcmVSZXNvdXJjZU1vZGVsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoRUxKYXhiQ29yZUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXF1aXJlZEphcnNFeGlzdHMoKSB7Ci0JCXJldHVybiBqYXhiSmFyUHJvcGVydHlFeGlzdHMoKSAKLQkJCSYmIGpheGJKYXJGaWxlRXhpc3RzKCkKLQkJCSYmIGVjbGlwc2VsaW5rSmFyUHJvcGVydHlFeGlzdHMoKSAKLQkJCSYmIGVjbGlwc2VsaW5rSmFyRmlsZUV4aXN0cygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gamF4YkphclByb3BlcnR5RXhpc3RzKCkgewotCQlyZXR1cm4gZ2V0U3lzdGVtUHJvcGVydHkoVGVzdEpheGJQcm9qZWN0LkpBWEJfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZKSAhPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gamF4YkphckZpbGVFeGlzdHMoKSB7Ci0JCXJldHVybiAobmV3IEZpbGUoZ2V0U3lzdGVtUHJvcGVydHkoVGVzdEpheGJQcm9qZWN0LkpBWEJfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZKSkpLmV4aXN0cygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWNsaXBzZWxpbmtKYXJQcm9wZXJ0eUV4aXN0cygpIHsKLQkJcmV0dXJuIGdldFN5c3RlbVByb3BlcnR5KFRlc3RKYXhiUHJvamVjdC5FQ0xJUFNFTElOS19KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkpICE9IG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlY2xpcHNlbGlua0phckZpbGVFeGlzdHMoKSB7Ci0JCXJldHVybiAobmV3IEZpbGUoZ2V0U3lzdGVtUHJvcGVydHkoVGVzdEpheGJQcm9qZWN0LkVDTElQU0VMSU5LX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWSkpKS5leGlzdHMoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRNaXNzaW5nSmFyRXJyb3JNZXNzYWdlKCkgewotCQlpZiggISBqYXhiSmFyUHJvcGVydHlFeGlzdHMoKSkgewotCQkJcmV0dXJuIGVycm9yTWlzc2luZ1Byb3BlcnR5KFRlc3RKYXhiUHJvamVjdC5KQVhCX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWSk7Ci0JCX0KLQkJZWxzZSBpZiggISBqYXhiSmFyRmlsZUV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gZXJyb3JKYXJGaWxlRG9lc05vdEV4aXN0KGdldFN5c3RlbVByb3BlcnR5KFRlc3RKYXhiUHJvamVjdC5KQVhCX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWSkpOwotCQl9Ci0JCWVsc2UgaWYoICEgZWNsaXBzZWxpbmtKYXJQcm9wZXJ0eUV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gZXJyb3JNaXNzaW5nUHJvcGVydHkoVGVzdEpheGJQcm9qZWN0LkVDTElQU0VMSU5LX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWSk7Ci0JCX0KLQkJcmV0dXJuIGVycm9ySmFyRmlsZURvZXNOb3RFeGlzdChnZXRTeXN0ZW1Qcm9wZXJ0eShUZXN0SmF4YlByb2plY3QuRUNMSVBTRUxJTktfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZKSk7Ci0JfQotCQotCS8qKioqKioqKioqKiBwcml2YXRlICoqKioqKioqKiovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVycm9yTWlzc2luZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuICJtaXNzaW5nIEphdmEgc3lzdGVtIHByb3BlcnR5OiBcIiIgKyBwcm9wZXJ0eU5hbWUgKyAiXCIiOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXJyb3JKYXJGaWxlRG9lc05vdEV4aXN0KFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0JCXJldHVybiAiSkFSIGZpbGUgZG9lc24ndCBleGlzdDogXCIiICsgcHJvcGVydHlWYWx1ZSArICJcIiI7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTeXN0ZW1Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBFTEpheGJDb3JlVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VMSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmI5NDdjLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VMSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLkVMSmF4YlBsYXRmb3JtOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZQotCQlleHRlbmRzIEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEVMSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0UGxhdGZvcm0oKSB7Ci0JCXJldHVybiBFTEpheGJQbGF0Zm9ybS5nZXREZWZhdWx0UGxhdGZvcm0oZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FTEpheGJDb3JlQ29udGV4dE1vZGVsVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VMSmF4YkNvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWFjYWY5Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VMSmF4YkNvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLkVMSmF4YkNvcmVUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YS5FTEpheGJDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzOwotCi0KLXB1YmxpYyBjbGFzcyBFTEpheGJDb3JlQ29udGV4dE1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShFTEpheGJDb3JlQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJCi0JCWlmIChFTEpheGJDb3JlVGVzdHMucmVxdWlyZWRKYXJzRXhpc3RzKCkpIHsKLS8vCQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNDb250ZXh0Um9vdFRlc3RzLmNsYXNzKTsKLQkJCXN1aXRlLmFkZFRlc3QoRUxKYXhiQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXN1aXRlLmFkZFRlc3QoVGVzdFN1aXRlLndhcm5pbmcoRUxKYXhiQ29yZVRlc3RzLmJ1aWxkTWlzc2luZ0phckVycm9yTWVzc2FnZSgpKSk7Ci0JCX0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgRUxKYXhiQ29yZUNvbnRleHRNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MWRmOGYuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFDbGFzc01hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5FTEpheGJQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FTENsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxEaXNjcmltaW5hdG9yTm9kZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVMSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFDbGFzc01hcHBpbmdUZXN0cwotCQlleHRlbmRzIEVMSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgRUxKYXZhQ2xhc3NNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXRQbGF0Zm9ybSgpIHsKLQkJcmV0dXJuIEVMSmF4YlBsYXRmb3JtLlZFUlNJT05fMl8yOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sRGlzY3JpbWluYXRvck5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJRUxDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gKEVMQ2xhc3NNYXBwaW5nKSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlYbWxEaXNjcmltaW5hdG9yTm9kZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShYbWxEaXNjcmltaW5hdG9yTm9kZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfRElTQ1JJTUlOQVRPUl9OT0RFKTsKLQkJYXNzZXJ0TnVsbChjbGFzc01hcHBpbmcuZ2V0WG1sRGlzY3JpbWluYXRvck5vZGUoKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCQotCQljbGFzc01hcHBpbmcuYWRkWG1sRGlzY3JpbWluYXRvck5vZGUoKTsKLQkJYW5ub3RhdGlvbiA9IChYbWxEaXNjcmltaW5hdG9yTm9kZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfRElTQ1JJTUlOQVRPUl9OT0RFKTsKLQkJYXNzZXJ0Tm90TnVsbChjbGFzc01hcHBpbmcuZ2V0WG1sRGlzY3JpbWluYXRvck5vZGUoKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCQotCQljbGFzc01hcHBpbmcucmVtb3ZlWG1sRGlzY3JpbWluYXRvck5vZGUoKTsKLQkJYW5ub3RhdGlvbiA9IChYbWxEaXNjcmltaW5hdG9yTm9kZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfRElTQ1JJTUlOQVRPUl9OT0RFKTsKLQkJYXNzZXJ0TnVsbChjbGFzc01hcHBpbmcuZ2V0WG1sRGlzY3JpbWluYXRvck5vZGUoKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxEaXNjcmltaW5hdG9yTm9kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlFTENsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSAoRUxDbGFzc01hcHBpbmcpIGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCVhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKFhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRUxKYXhiLlhNTF9ESVNDUklNSU5BVE9SX05PREUpOwotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRYbWxEaXNjcmltaW5hdG9yTm9kZSgpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVR5cGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJRUxKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEVMSmF4Yi5YTUxfRElTQ1JJTUlOQVRPUl9OT0RFKTsKLQkJCQkJfQotCQkJCX0pOwotCQlhbm5vdGF0aW9uID0gKFhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRUxKYXhiLlhNTF9ESVNDUklNSU5BVE9SX05PREUpOwotCQlhc3NlcnROb3ROdWxsKGNsYXNzTWFwcGluZy5nZXRYbWxEaXNjcmltaW5hdG9yTm9kZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdCgKLQkJCQkJCU1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCQlFTEphdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEVMSmF4Yi5YTUxfRElTQ1JJTUlOQVRPUl9OT0RFKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCWFubm90YXRpb24gPSAoWG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFTEpheGIuWE1MX0RJU0NSSU1JTkFUT1JfTk9ERSk7Ci0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldFhtbERpc2NyaW1pbmF0b3JOb2RlKCkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sRGlzY3JpbWluYXRvclZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUVMQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IChFTENsYXNzTWFwcGluZykgamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKFhtbERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfRElTQ1JJTUlOQVRPUl9WQUxVRSk7Ci0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldFhtbERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJCi0JCWNsYXNzTWFwcGluZy5hZGRYbWxEaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJYW5ub3RhdGlvbiA9IChYbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFTEpheGIuWE1MX0RJU0NSSU1JTkFUT1JfVkFMVUUpOwotCQlhc3NlcnROb3ROdWxsKGNsYXNzTWFwcGluZy5nZXRYbWxEaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCQotCQljbGFzc01hcHBpbmcucmVtb3ZlWG1sRGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JCWFubm90YXRpb24gPSAoWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRUxKYXhiLlhNTF9ESVNDUklNSU5BVE9SX1ZBTFVFKTsKLQkJYXNzZXJ0TnVsbChjbGFzc01hcHBpbmcuZ2V0WG1sRGlzY3JpbWluYXRvclZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sRGlzY3JpbWluYXRvclZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUVMQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IChFTENsYXNzTWFwcGluZykgamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKFhtbERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfRElTQ1JJTUlOQVRPUl9WQUxVRSk7Ci0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldFhtbERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVR5cGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJRUxKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEVMSmF4Yi5YTUxfRElTQ1JJTUlOQVRPUl9WQUxVRSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJYW5ub3RhdGlvbiA9IChYbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFTEpheGIuWE1MX0RJU0NSSU1JTkFUT1JfVkFMVUUpOwotCQlhc3NlcnROb3ROdWxsKGNsYXNzTWFwcGluZy5nZXRYbWxEaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoCi0JCQkJCQlNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQkJRUxKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBFTEpheGIuWE1MX0RJU0NSSU1JTkFUT1JfVkFMVUUpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJYW5ub3RhdGlvbiA9IChYbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFTEpheGIuWE1MX0RJU0NSSU1JTkFUT1JfVkFMVUUpOwotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRYbWxEaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOThmYjQuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRUxKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZ1Rlc3RzCi0JCWV4dGVuZHMgRUxKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBFTEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aFhtbEFueUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSwgSkFYQi5YTUxfQU5ZX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEFueUF0dHJpYnV0ZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbFBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBbnlBdHRyaWJ1dGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCUVMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZyA9IChFTEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoRUxKYXhiLlhNTF9QQVRIKSkpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sUGF0aCgpKTsKLQkJCi0JCW1hcHBpbmcuYWRkWG1sUGF0aCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfUEFUSCkpKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBwaW5nLmdldFhtbFBhdGgoKSk7Ci0JCQotCQltYXBwaW5nLnJlbW92ZVhtbFBhdGgoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucyhFTEpheGIuWE1MX1BBVEgpKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxQYXRoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sUGF0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEFueUF0dHJpYnV0ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJRUxKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gKEVMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucyhFTEpheGIuWE1MX1BBVEgpKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxQYXRoKCkpOwotCQkKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbigKLQkJCQkJCWRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfUEFUSCkpKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBwaW5nLmdldFhtbFBhdGgoKSk7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlFTEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBFTEpheGIuWE1MX1BBVEgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucyhFTEpheGIuWE1MX1BBVEgpKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxQYXRoKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMTA1YjEuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVMSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzCi0JCWV4dGVuZHMgRUxKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBFTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVHlwZVdpdGhYbWxBbnlFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFLCBKQVhCLlhNTF9BTllfRUxFTUVOVCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEFueUVsZW1lbnQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQW55RWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcgbWFwcGluZyA9IChFTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfUEFUSCkpKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbFBhdGgoKSk7Ci0JCQotCQltYXBwaW5nLmFkZFhtbFBhdGgoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucyhFTEpheGIuWE1MX1BBVEgpKSk7Ci0JCWFzc2VydE5vdE51bGwobWFwcGluZy5nZXRYbWxQYXRoKCkpOwotCQkKLQkJbWFwcGluZy5yZW1vdmVYbWxQYXRoKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoRUxKYXhiLlhNTF9QQVRIKSkpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sUGF0aCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbFBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBbnlFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlFTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZyBtYXBwaW5nID0gKEVMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoRUxKYXhiLlhNTF9QQVRIKSkpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sUGF0aCgpKTsKLQkJCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUVMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKAotCQkJCQkJZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoRUxKYXhiLlhNTF9QQVRIKSkpOwotCQlhc3NlcnROb3ROdWxsKG1hcHBpbmcuZ2V0WG1sUGF0aCgpKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUVMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBFTEpheGIuWE1MX1BBVEgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucyhFTEpheGIuWE1MX1BBVEgpKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxQYXRoKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmQ3MDk3Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLkVMSmF4YlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuWG1sUGF0aEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVMSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMKLQkJZXh0ZW5kcyBFTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEVMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGdldFBsYXRmb3JtKCkgewotCQlyZXR1cm4gRUxKYXhiUGxhdGZvcm0uVkVSU0lPTl8yXzI7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aFhtbEF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSwgSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sQXR0cmlidXRlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVHlwZVdpdGhYbWxQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFLCBFTEpheGIuWE1MX1BBVEgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxQYXRoIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sUGF0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEF0dHJpYnV0ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gKEVMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucyhFTEpheGIuWE1MX1BBVEgpKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxQYXRoKCkpOwotCQkKLQkJbWFwcGluZy5hZGRYbWxQYXRoKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoRUxKYXhiLlhNTF9QQVRIKSkpOwotCQlhc3NlcnROb3ROdWxsKG1hcHBpbmcuZ2V0WG1sUGF0aCgpKTsKLQkJCi0JCW1hcHBpbmcucmVtb3ZlWG1sUGF0aCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfUEFUSCkpKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbFBhdGgoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQXR0cmlidXRlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlFTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgPSAoRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfUEFUSCkpKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbFBhdGgoKSk7Ci0JCQotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlFTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKAotCQkJCQkJZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoRUxKYXhiLlhNTF9QQVRIKSkpOwotCQlhc3NlcnROb3ROdWxsKG1hcHBpbmcuZ2V0WG1sUGF0aCgpKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUVMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfUEFUSCkpKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbFBhdGgoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sUGF0aCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJWG1sUGF0aEFubm90YXRpb24geG1sUGF0aEFubm90YXRpb24gPSAoWG1sUGF0aEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoeG1sUGF0aEFubm90YXRpb24pOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSA9PSBNYXBwaW5nS2V5cy5YTUxfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlFTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMudGhpcy5zZXRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkJCQlkZWNsYXJhdGlvbiwgRUxKYXhiLlhNTF9QQVRILCAiLi9lbGVtZW50W0BuYW1lPVwiZm9vXCJdL2VsZW1lbnRbMV0vdGV4dCgpIik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh4bWxQYXRoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkgPT0gTWFwcGluZ0tleXMuWE1MX0FUVFJJQlVURV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMuc2V0TWVtYmVyVmFsdWVQYWlyKAotCQkJCQkJZGVjbGFyYXRpb24sIEVMSmF4Yi5YTUxfUEFUSCwgImVsZW1lbnQvQGF0dHJpYnV0ZSIpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydE5vdE51bGwoeG1sUGF0aEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkgPT0gTWFwcGluZ0tleXMuWE1MX0FUVFJJQlVURV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlTWVtYmVyVmFsdWVQYWlyKAotCQkJCQkJZGVjbGFyYXRpb24sIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxQYXRoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkgPT0gTWFwcGluZ0tleXMuWE1MX0FUVFJJQlVURV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQXR0cmlidXRlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlFTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgPSAoRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfS0VZKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxLZXkoKSk7Ci0JCQotCQltYXBwaW5nLmFkZFhtbEtleSgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfS0VZKSk7Ci0JCWFzc2VydE5vdE51bGwobWFwcGluZy5nZXRYbWxLZXkoKSk7Ci0JCQotCQltYXBwaW5nLnJlbW92ZVhtbEtleSgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfS0VZKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBdHRyaWJ1dGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCUVMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZyA9IChFTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oRUxKYXhiLlhNTF9LRVkpKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbEtleSgpKTsKLQkJCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUVMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oCi0JCQkJCQlkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBFTEpheGIuWE1MX0tFWSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfS0VZKSk7Ci0JCWFzc2VydE5vdE51bGwobWFwcGluZy5nZXRYbWxLZXkoKSk7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlFTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBFTEpheGIuWE1MX0tFWSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfS0VZKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxLZXkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxEaXNjcmltaW5hdG9yTm9kZVRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbERpc2NyaW1pbmF0b3JOb2RlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjMTExZi4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbERpc2NyaW1pbmF0b3JOb2RlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLkVMSmF4YlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVMQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVMWG1sRGlzY3JpbWluYXRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuWG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sRGlzY3JpbWluYXRvck5vZGVUZXN0cwotCQlleHRlbmRzIEVMSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgRUxKYXZhWG1sRGlzY3JpbWluYXRvck5vZGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGdldFBsYXRmb3JtKCkgewotCQlyZXR1cm4gRUxKYXhiUGxhdGZvcm0uVkVSU0lPTl8yXzI7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aFhtbERpc2NyaW1pbmF0b3JOb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFLCBFTEpheGIuWE1MX0RJU0NSSU1JTkFUT1JfTk9ERSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRGlzY3JpbWluYXRvck5vZGUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRGlzY3JpbWluYXRvck5vZGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJRUxDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gKEVMQ2xhc3NNYXBwaW5nKSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlFTFhtbERpc2NyaW1pbmF0b3JOb2RlIGRpc2NOb2RlID0gY2xhc3NNYXBwaW5nLmdldFhtbERpc2NyaW1pbmF0b3JOb2RlKCk7Ci0JCVhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKFhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRUxKYXhiLlhNTF9ESVNDUklNSU5BVE9SX05PREUpOwotCQkKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGRpc2NOb2RlLmdldFZhbHVlKCkpOwotCQkKLQkJZGlzY05vZGUuc2V0VmFsdWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGRpc2NOb2RlLmdldFZhbHVlKCkpOwotCQkKLQkJZGlzY05vZGUuc2V0VmFsdWUoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCIiLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGRpc2NOb2RlLmdldFZhbHVlKCkpOwotCQkKLQkJZGlzY05vZGUuc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoZGlzY05vZGUuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRGlzY3JpbWluYXRvck5vZGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJRUxDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gKEVMQ2xhc3NNYXBwaW5nKSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlFTFhtbERpc2NyaW1pbmF0b3JOb2RlIGRpc2NOb2RlID0gY2xhc3NNYXBwaW5nLmdldFhtbERpc2NyaW1pbmF0b3JOb2RlKCk7Ci0JCVhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKFhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRUxKYXhiLlhNTF9ESVNDUklNSU5BVE9SX05PREUpOwotCQkKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGRpc2NOb2RlLmdldFZhbHVlKCkpOwotCQkKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlVHlwZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUVMSmF2YVhtbERpc2NyaW1pbmF0b3JOb2RlVGVzdHMudGhpcy5zZXRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkJCQlkZWNsYXJhdGlvbiwgRUxKYXhiLlhNTF9ESVNDUklNSU5BVE9SX05PREUsICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZGlzY05vZGUuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlFTEphdmFYbWxEaXNjcmltaW5hdG9yTm9kZVRlc3RzLnRoaXMuc2V0TWVtYmVyVmFsdWVQYWlyKAotCQkJCQkJZGVjbGFyYXRpb24sIEVMSmF4Yi5YTUxfRElTQ1JJTUlOQVRPUl9OT0RFLCAiIik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCIiLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGRpc2NOb2RlLmdldFZhbHVlKCkpOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sRGlzY3JpbWluYXRvck5vZGVUZXN0cy50aGlzLnJlbW92ZU1lbWJlclZhbHVlUGFpcigKLQkJCQkJCWRlY2xhcmF0aW9uLCBFTEpheGIuWE1MX0RJU0NSSU1JTkFUT1JfTk9ERSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGRpc2NOb2RlLmdldFZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRGlzY3JpbWluYXRvclZhbHVlVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRGlzY3JpbWluYXRvclZhbHVlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjNzlmYS4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbERpc2NyaW1pbmF0b3JWYWx1ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5FTEpheGJQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FTENsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FTFhtbERpc2NyaW1pbmF0b3JWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sRGlzY3JpbWluYXRvclZhbHVlVGVzdHMKLQkJZXh0ZW5kcyBFTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEVMSmF2YVhtbERpc2NyaW1pbmF0b3JWYWx1ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0UGxhdGZvcm0oKSB7Ci0JCXJldHVybiBFTEpheGJQbGF0Zm9ybS5WRVJTSU9OXzJfMjsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVR5cGVXaXRoWG1sRGlzY3JpbWluYXRvclZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFLCBFTEpheGIuWE1MX0RJU0NSSU1JTkFUT1JfVkFMVUUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFhtbERpc2NyaW1pbmF0b3JWYWx1ZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxEaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJRUxDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gKEVMQ2xhc3NNYXBwaW5nKSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlFTFhtbERpc2NyaW1pbmF0b3JWYWx1ZSBkaXNjVmFsdWUgPSBjbGFzc01hcHBpbmcuZ2V0WG1sRGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JCVhtbERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShYbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFTEpheGIuWE1MX0RJU0NSSU1JTkFUT1JfVkFMVUUpOwotCQkKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGRpc2NWYWx1ZS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWRpc2NWYWx1ZS5zZXRWYWx1ZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZGlzY1ZhbHVlLmdldFZhbHVlKCkpOwotCQkKLQkJZGlzY1ZhbHVlLnNldFZhbHVlKCIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBkaXNjVmFsdWUuZ2V0VmFsdWUoKSk7Ci0JCQotCQlkaXNjVmFsdWUuc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoZGlzY1ZhbHVlLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbERpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQlFTENsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSAoRUxDbGFzc01hcHBpbmcpIGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUVMWG1sRGlzY3JpbWluYXRvclZhbHVlIGRpc2NWYWx1ZSA9IGNsYXNzTWFwcGluZy5nZXRYbWxEaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKFhtbERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfRElTQ1JJTUlOQVRPUl9WQUxVRSk7Ci0JCQotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoZGlzY1ZhbHVlLmdldFZhbHVlKCkpOwotCQkKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlVHlwZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUVMSmF2YVhtbERpc2NyaW1pbmF0b3JWYWx1ZVRlc3RzLnRoaXMuc2V0TWVtYmVyVmFsdWVQYWlyKAotCQkJCQkJZGVjbGFyYXRpb24sIEVMSmF4Yi5YTUxfRElTQ1JJTUlOQVRPUl9WQUxVRSwgImZvbyIpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBkaXNjVmFsdWUuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlFTEphdmFYbWxEaXNjcmltaW5hdG9yVmFsdWVUZXN0cy50aGlzLnNldE1lbWJlclZhbHVlUGFpcigKLQkJCQkJCWRlY2xhcmF0aW9uLCBFTEpheGIuWE1MX0RJU0NSSU1JTkFUT1JfVkFMVUUsICIiKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIiIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgZGlzY1ZhbHVlLmdldFZhbHVlKCkpOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sRGlzY3JpbWluYXRvclZhbHVlVGVzdHMudGhpcy5yZW1vdmVNZW1iZXJWYWx1ZVBhaXIoCi0JCQkJCQlkZWNsYXJhdGlvbiwgRUxKYXhiLlhNTF9ESVNDUklNSU5BVE9SX1ZBTFVFKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoZGlzY1ZhbHVlLmdldFZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NGY0NmYuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLkVMSmF4YlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFBhdGhBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cwotCQlleHRlbmRzIEVMSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgRUxKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGdldFBsYXRmb3JtKCkgewotCQlyZXR1cm4gRUxKYXhiUGxhdGZvcm0uVkVSU0lPTl8yXzI7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RZUEUsIEpBWEIuWE1MX0VMRU1FTlQpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVHlwZVdpdGhYbWxQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFLCBFTEpheGIuWE1MX1BBVEgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxQYXRoIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sUGF0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCUVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nIG1hcHBpbmcgPSAoRUxKYXZhWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucyhFTEpheGIuWE1MX1BBVEgpKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxQYXRoKCkpOwotCQkKLQkJbWFwcGluZy5hZGRYbWxQYXRoKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoRUxKYXhiLlhNTF9QQVRIKSkpOwotCQlhc3NlcnROb3ROdWxsKG1hcHBpbmcuZ2V0WG1sUGF0aCgpKTsKLQkJCi0JCW1hcHBpbmcucmVtb3ZlWG1sUGF0aCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfUEFUSCkpKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbFBhdGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbFBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlFTEphdmFYbWxFbGVtZW50TWFwcGluZyBtYXBwaW5nID0gKEVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoRUxKYXhiLlhNTF9QQVRIKSkpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sUGF0aCgpKTsKLQkJCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKAotCQkJCQkJZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoRUxKYXhiLlhNTF9QQVRIKSkpOwotCQlhc3NlcnROb3ROdWxsKG1hcHBpbmcuZ2V0WG1sUGF0aCgpKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBFTEpheGIuWE1MX1BBVEgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucyhFTEpheGIuWE1MX1BBVEgpKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxQYXRoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbFBhdGgoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCVhtbFBhdGhBbm5vdGF0aW9uIHhtbFBhdGhBbm5vdGF0aW9uID0gKFhtbFBhdGhBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHhtbFBhdGhBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSA9PSBNYXBwaW5nS2V5cy5YTUxfRUxFTUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLnNldE1lbWJlclZhbHVlUGFpcigKLQkJCQkJCWRlY2xhcmF0aW9uLCBFTEpheGIuWE1MX1BBVEgsICJlbGVtZW50L0BhdHRyaWJ1dGUiKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHhtbFBhdGhBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSA9PSBNYXBwaW5nS2V5cy5YTUxfRUxFTUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLnNldE1lbWJlclZhbHVlUGFpcigKLQkJCQkJCWRlY2xhcmF0aW9uLCBFTEpheGIuWE1MX1BBVEgsICIuL2VsZW1lbnRbQG5hbWU9XCJmb29cIl0vZWxlbWVudFsxXS90ZXh0KCkiKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHhtbFBhdGhBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpID09IE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlFTEphdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlTWVtYmVyVmFsdWVQYWlyKAotCQkJCQkJZGVjbGFyYXRpb24sIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxQYXRoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSA9PSBNYXBwaW5nS2V5cy5YTUxfRUxFTUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJRUxKYXZhWG1sRWxlbWVudE1hcHBpbmcgbWFwcGluZyA9IChFTEphdmFYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfS0VZKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxLZXkoKSk7Ci0JCQotCQltYXBwaW5nLmFkZFhtbEtleSgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfS0VZKSk7Ci0JCWFzc2VydE5vdE51bGwobWFwcGluZy5nZXRYbWxLZXkoKSk7Ci0JCQotCQltYXBwaW5nLnJlbW92ZVhtbEtleSgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfS0VZKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxLZXkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCUVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nIG1hcHBpbmcgPSAoRUxKYXZhWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihFTEpheGIuWE1MX0tFWSkpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sS2V5KCkpOwotCQkKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oCi0JCQkJCQlkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBFTEpheGIuWE1MX0tFWSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfS0VZKSk7Ci0JCWFzc2VydE5vdE51bGwobWFwcGluZy5nZXRYbWxLZXkoKSk7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlFTEphdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgRUxKYXhiLlhNTF9LRVkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihFTEpheGIuWE1MX0tFWSkpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sQ0RBVEEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlFTEphdmFYbWxFbGVtZW50TWFwcGluZyBtYXBwaW5nID0gKEVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oRUxKYXhiLlhNTF9DREFUQSkpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sQ0RBVEEoKSk7Ci0JCQotCQltYXBwaW5nLmFkZFhtbENEQVRBKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oRUxKYXhiLlhNTF9DREFUQSkpOwotCQlhc3NlcnROb3ROdWxsKG1hcHBpbmcuZ2V0WG1sQ0RBVEEoKSk7Ci0JCQotCQltYXBwaW5nLnJlbW92ZVhtbENEQVRBKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oRUxKYXhiLlhNTF9DREFUQSkpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sQ0RBVEEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxDREFUQSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCUVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nIG1hcHBpbmcgPSAoRUxKYXZhWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihFTEpheGIuWE1MX0NEQVRBKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxDREFUQSgpKTsKLQkJCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKAotCQkJCQkJZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgRUxKYXhiLlhNTF9DREFUQSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfQ0RBVEEpKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBwaW5nLmdldFhtbENEQVRBKCkpOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEVMSmF4Yi5YTUxfQ0RBVEEpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihFTEpheGIuWE1MX0NEQVRBKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxDREFUQSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEVsZW1lbnRzTWFwcGluZ1Rlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEVsZW1lbnRzTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmODFhMzUuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxFbGVtZW50c01hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdWJJdGVyYWJsZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxFbGVtZW50c01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFBhdGhBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nVGVzdHMKLQkJZXh0ZW5kcyBFTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEVMSmF2YVhtbEVsZW1lbnRzTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSwgSkFYQi5YTUxfRUxFTUVOVFMpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50cyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE5vcm1hbEFubm90YXRpb24gbmV3WG1sUGF0aEFubm90YXRpb24oQVNUIGFzdCwgU3RyaW5nIHZhbHVlKSB7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IG5ld05vcm1hbEFubm90YXRpb24oYXN0LCBFTEpheGIuWE1MX1BBVEgpOwotCQlhZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgRUxKYXhiLlhNTF9QQVRIX19WQUxVRSwgdmFsdWUpOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sUGF0aChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgaW5kZXgsIFN0cmluZyB2YWx1ZSkgewotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSBuZXdYbWxQYXRoQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXRBc3QoKSwgdmFsdWUpOwotCQlhZGRBcnJheUVsZW1lbnQoZGVjbGFyYXRpb24sIEVMSmF4Yi5YTUxfUEFUSFMsIGluZGV4LCAidmFsdWUiLCBhbm5vdGF0aW9uKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlWG1sUGF0aChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQltb3ZlQXJyYXlFbGVtZW50KChOb3JtYWxBbm5vdGF0aW9uKSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoRUxKYXhiLlhNTF9QQVRIUyksICJ2YWx1ZSIsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbFBhdGgoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJlbW92ZUFycmF5RWxlbWVudCgoTm9ybWFsQW5ub3RhdGlvbikgZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKEVMSmF4Yi5YTUxfUEFUSFMpLCAidmFsdWUiLCBpbmRleCk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxFbGVtZW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnRzKCk7Ci0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJRUxYbWxFbGVtZW50c01hcHBpbmcgbWFwcGluZyA9IChFTFhtbEVsZW1lbnRzTWFwcGluZykgQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJSXRlcmFibGU8RUxYbWxQYXRoPiB4bWxQYXRocyA9IG1hcHBpbmcuZ2V0WG1sUGF0aHMoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eSh4bWxQYXRocykpOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFwcGluZy5nZXRYbWxQYXRoc1NpemUoKSk7Ci0JCQotCQkvL2FkZCAyIFhtbFBhdGggYW5ub3RhdGlvbnMKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlFTEphdmFYbWxFbGVtZW50c01hcHBpbmdUZXN0cy50aGlzLmFkZFhtbFBhdGgoZGVjbGFyYXRpb24sIDAsICJmb28iKTsKLQkJCQkJCUVMSmF2YVhtbEVsZW1lbnRzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sUGF0aChkZWNsYXJhdGlvbiwgMSwgImJhciIpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQl4bWxQYXRocyA9IG1hcHBpbmcuZ2V0WG1sUGF0aHMoKTsKLQkJCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHhtbFBhdGhzKSk7Ci0JCWFzc2VydEVxdWFscygyLCBtYXBwaW5nLmdldFhtbFBhdGhzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbFBhdGhzLCAwKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbFBhdGhzLCAxKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHN3aXRjaCBYbWxQYXRoIGFubm90YXRpb25zCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlFTEphdmFYbWxFbGVtZW50c01hcHBpbmdUZXN0cy50aGlzLm1vdmVYbWxQYXRoKGRlY2xhcmF0aW9uLCAwLCAxKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJeG1sUGF0aHMgPSBtYXBwaW5nLmdldFhtbFBhdGhzKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eSh4bWxQYXRocykpOwotCQlhc3NlcnRFcXVhbHMoMiwgbWFwcGluZy5nZXRYbWxQYXRoc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxQYXRocywgMCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxQYXRocywgMSkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyByZW1vdmUgWG1sUGF0aCBhbm5vdGF0aW9ucwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVYbWxQYXRoKGRlY2xhcmF0aW9uLCAxKTsKLQkJCQkJCUVMSmF2YVhtbEVsZW1lbnRzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlWG1sUGF0aChkZWNsYXJhdGlvbiwgMCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCXhtbFBhdGhzID0gbWFwcGluZy5nZXRYbWxQYXRocygpOwotCQkKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eSh4bWxQYXRocykpOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFwcGluZy5nZXRYbWxQYXRoc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbFBhdGhzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudHMoKTsKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlFTFhtbEVsZW1lbnRzTWFwcGluZyBtYXBwaW5nID0gKEVMWG1sRWxlbWVudHNNYXBwaW5nKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEVMSmF4Yi5YTUxfUEFUSCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFwcGluZy5nZXRYbWxQYXRoc1NpemUoKSk7Ci0JCQotCQltYXBwaW5nLmFkZFhtbFBhdGgoMCkuc2V0VmFsdWUoImZvbyIpOwotCQltYXBwaW5nLmFkZFhtbFBhdGgoMSkuc2V0VmFsdWUoImJheiIpOwotCQltYXBwaW5nLmFkZFhtbFBhdGgoMSkuc2V0VmFsdWUoImJhciIpOwotCQkKLQkJSXRlcmFibGU8WG1sUGF0aEFubm90YXRpb24+IHhtbFBhdGhBbm5vdGF0aW9ucyA9IAotCQkJCW5ldyBTdWJJdGVyYWJsZVdyYXBwZXIocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoRUxKYXhiLlhNTF9QQVRIKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoeG1sUGF0aEFubm90YXRpb25zKSk7Ci0JCWFzc2VydEVxdWFscygzLCBtYXBwaW5nLmdldFhtbFBhdGhzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbFBhdGhBbm5vdGF0aW9ucywgMCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxQYXRoQW5ub3RhdGlvbnMsIDEpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sUGF0aEFubm90YXRpb25zLCAyKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCW1hcHBpbmcubW92ZVhtbFBhdGgoMSwgMik7Ci0JCQotCQl4bWxQYXRoQW5ub3RhdGlvbnMgPSAKLQkJCQluZXcgU3ViSXRlcmFibGVXcmFwcGVyKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfUEFUSCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHhtbFBhdGhBbm5vdGF0aW9ucykpOwotCQlhc3NlcnRFcXVhbHMoMywgbWFwcGluZy5nZXRYbWxQYXRoc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxQYXRoQW5ub3RhdGlvbnMsIDApLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sUGF0aEFubm90YXRpb25zLCAxKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbFBhdGhBbm5vdGF0aW9ucywgMikuZ2V0VmFsdWUoKSk7Ci0JCQotCQltYXBwaW5nLnJlbW92ZVhtbFBhdGgoMik7Ci0JCW1hcHBpbmcucmVtb3ZlWG1sUGF0aCgwKTsKLQkJbWFwcGluZy5yZW1vdmVYbWxQYXRoKDApOwotCQkKLQkJeG1sUGF0aEFubm90YXRpb25zID0gCi0JCQkJbmV3IFN1Ykl0ZXJhYmxlV3JhcHBlcihyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucyhFTEpheGIuWE1MX1BBVEgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh4bWxQYXRoQW5ub3RhdGlvbnMpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcHBpbmcuZ2V0WG1sUGF0aHNTaXplKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmdUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxJbnZlcnNlUmVmZXJlbmNlTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNzcxMGIuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxJbnZlcnNlUmVmZXJlbmNlTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVMSmF2YVhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmdUZXN0cwotCQlleHRlbmRzIEVMSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVR5cGVXaXRoWG1sSW52ZXJzZVJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSwgRUxKYXhiLlhNTF9JTlZFUlNFX1JFRkVSRU5DRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sSW52ZXJzZVJlZmVyZW5jZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sSW52ZXJzZVJlZmVyZW5jZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmcgbWFwcGluZyA9IChFTEphdmFYbWxJbnZlcnNlUmVmZXJlbmNlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfSU5WRVJTRV9SRUZFUkVOQ0UpOwotCQkKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQltYXBwaW5nLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJbWFwcGluZy5zZXRNYXBwZWRCeShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEludmVyc2VSZWZlcmVuY2UoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCUVMSmF2YVhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nIG1hcHBpbmcgPSAoRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihFTEpheGIuWE1MX0lOVkVSU0VfUkVGRVJFTkNFKTsKLQkJCi0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmdUZXN0cy50aGlzLmFkZE1lbWJlclZhbHVlUGFpcigKLQkJCQkJCShNYXJrZXJBbm5vdGF0aW9uKSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoRUxKYXhiLlhNTF9JTlZFUlNFX1JFRkVSRU5DRSksCi0JCQkJCQlFTEpheGIuWE1MX0lOVkVSU0VfUkVGRVJFTkNFX19NQVBQRURfQlksICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoRUxKYXhiLlhNTF9JTlZFUlNFX1JFRkVSRU5DRSk7Ci0JCQkJRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmdUZXN0cy50aGlzLnZhbHVlcyhhbm5vdGF0aW9uKS5yZW1vdmUoMCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxKb2luTm9kZVRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEpvaW5Ob2RlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNiZTdkMy4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEpvaW5Ob2RlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLkVMSmF4YlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVMWG1sSm9pbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxKb2luTm9kZXNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVMSmF2YVhtbEpvaW5Ob2Rlc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuWG1sSm9pbk5vZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sSm9pbk5vZGVUZXN0cwotCQlleHRlbmRzIEVMSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgRUxKYXZhWG1sSm9pbk5vZGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGdldFBsYXRmb3JtKCkgewotCQlyZXR1cm4gRUxKYXhiUGxhdGZvcm0uVkVSU0lPTl8yXzI7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aFhtbEpvaW5Ob2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFLCBFTEpheGIuWE1MX0pPSU5fTk9ERSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEpvaW5Ob2RlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sUGF0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEpvaW5Ob2RlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlFTFhtbEpvaW5Ob2Rlc01hcHBpbmcgbWFwcGluZyA9IChFTFhtbEpvaW5Ob2Rlc01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJRUxYbWxKb2luTm9kZSB4bWxKb2luTm9kZSA9IENvbGxlY3Rpb25Ub29scy5nZXQobWFwcGluZy5nZXRYbWxKb2luTm9kZXMoKSwgMCk7Ci0JCVhtbEpvaW5Ob2RlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFhtbEpvaW5Ob2RlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBFTEpheGIuWE1MX0pPSU5fTk9ERSk7Ci0JCQotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0WG1sUGF0aCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxKb2luTm9kZS5nZXRYbWxQYXRoKCkpOwotCQkKLQkJeG1sSm9pbk5vZGUuc2V0WG1sUGF0aCgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0WG1sUGF0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxKb2luTm9kZS5nZXRYbWxQYXRoKCkpOwotCQkKLQkJeG1sSm9pbk5vZGUuc2V0WG1sUGF0aCgiIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIiIsIGFubm90YXRpb24uZ2V0WG1sUGF0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCB4bWxKb2luTm9kZS5nZXRYbWxQYXRoKCkpOwotCQkKLQkJeG1sSm9pbk5vZGUuc2V0WG1sUGF0aChudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRYbWxQYXRoKCkpOwotCQlhc3NlcnROdWxsKHhtbEpvaW5Ob2RlLmdldFhtbFBhdGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbFBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxKb2luTm9kZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJRUxKYXZhWG1sSm9pbk5vZGVzTWFwcGluZyBtYXBwaW5nID0gKEVMSmF2YVhtbEpvaW5Ob2Rlc01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJRUxYbWxKb2luTm9kZSB4bWxKb2luTm9kZSA9IENvbGxlY3Rpb25Ub29scy5nZXQobWFwcGluZy5nZXRYbWxKb2luTm9kZXMoKSwgMCk7Ci0JCVhtbEpvaW5Ob2RlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFhtbEpvaW5Ob2RlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBFTEpheGIuWE1MX0pPSU5fTk9ERSk7Ci0JCQotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0WG1sUGF0aCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxKb2luTm9kZS5nZXRYbWxQYXRoKCkpOwotCQkKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sSm9pbk5vZGVUZXN0cy50aGlzLnNldE1lbWJlclZhbHVlUGFpcigKLQkJCQkJCWRlY2xhcmF0aW9uLCBFTEpheGIuWE1MX0pPSU5fTk9ERSwgRUxKYXhiLlhNTF9KT0lOX05PREVfX1hNTF9QQVRILCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhbm5vdGF0aW9uLmdldFhtbFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sSm9pbk5vZGUuZ2V0WG1sUGF0aCgpKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUVMSmF2YVhtbEpvaW5Ob2RlVGVzdHMudGhpcy5zZXRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkJCQlkZWNsYXJhdGlvbiwgRUxKYXhiLlhNTF9KT0lOX05PREUsIEVMSmF4Yi5YTUxfSk9JTl9OT0RFX19YTUxfUEFUSCwgIiIpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydEVxdWFscygiIiwgYW5ub3RhdGlvbi5nZXRYbWxQYXRoKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIHhtbEpvaW5Ob2RlLmdldFhtbFBhdGgoKSk7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlFTEphdmFYbWxKb2luTm9kZVRlc3RzLnRoaXMucmVtb3ZlTWVtYmVyVmFsdWVQYWlyKAotCQkJCQkJZGVjbGFyYXRpb24sIEVMSmF4Yi5YTUxfSk9JTl9OT0RFLCBFTEpheGIuWE1MX0pPSU5fTk9ERV9fWE1MX1BBVEgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRYbWxQYXRoKCkpOwotCQlhc3NlcnROdWxsKHhtbEpvaW5Ob2RlLmdldFhtbFBhdGgoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlSZWZlcmVuY2VkWG1sUGF0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEpvaW5Ob2RlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlFTFhtbEpvaW5Ob2Rlc01hcHBpbmcgbWFwcGluZyA9IChFTFhtbEpvaW5Ob2Rlc01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJRUxYbWxKb2luTm9kZSB4bWxKb2luTm9kZSA9IENvbGxlY3Rpb25Ub29scy5nZXQobWFwcGluZy5nZXRYbWxKb2luTm9kZXMoKSwgMCk7Ci0JCVhtbEpvaW5Ob2RlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFhtbEpvaW5Ob2RlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBFTEpheGIuWE1MX0pPSU5fTk9ERSk7Ci0JCQotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0UmVmZXJlbmNlZFhtbFBhdGgoKSk7Ci0JCWFzc2VydE51bGwoeG1sSm9pbk5vZGUuZ2V0UmVmZXJlbmNlZFhtbFBhdGgoKSk7Ci0JCQotCQl4bWxKb2luTm9kZS5zZXRSZWZlcmVuY2VkWG1sUGF0aCgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0UmVmZXJlbmNlZFhtbFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sSm9pbk5vZGUuZ2V0UmVmZXJlbmNlZFhtbFBhdGgoKSk7Ci0JCQotCQl4bWxKb2luTm9kZS5zZXRSZWZlcmVuY2VkWG1sUGF0aCgiIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIiIsIGFubm90YXRpb24uZ2V0UmVmZXJlbmNlZFhtbFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgeG1sSm9pbk5vZGUuZ2V0UmVmZXJlbmNlZFhtbFBhdGgoKSk7Ci0JCQotCQl4bWxKb2luTm9kZS5zZXRSZWZlcmVuY2VkWG1sUGF0aChudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRSZWZlcmVuY2VkWG1sUGF0aCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxKb2luTm9kZS5nZXRSZWZlcmVuY2VkWG1sUGF0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUmVmZXJlbmNlZFhtbFBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxKb2luTm9kZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJRUxKYXZhWG1sSm9pbk5vZGVzTWFwcGluZyBtYXBwaW5nID0gKEVMSmF2YVhtbEpvaW5Ob2Rlc01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJRUxYbWxKb2luTm9kZSB4bWxKb2luTm9kZSA9IENvbGxlY3Rpb25Ub29scy5nZXQobWFwcGluZy5nZXRYbWxKb2luTm9kZXMoKSwgMCk7Ci0JCVhtbEpvaW5Ob2RlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFhtbEpvaW5Ob2RlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBFTEpheGIuWE1MX0pPSU5fTk9ERSk7Ci0JCQotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0UmVmZXJlbmNlZFhtbFBhdGgoKSk7Ci0JCWFzc2VydE51bGwoeG1sSm9pbk5vZGUuZ2V0UmVmZXJlbmNlZFhtbFBhdGgoKSk7Ci0JCQotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlFTEphdmFYbWxKb2luTm9kZVRlc3RzLnRoaXMuc2V0TWVtYmVyVmFsdWVQYWlyKAotCQkJCQkJZGVjbGFyYXRpb24sIEVMSmF4Yi5YTUxfSk9JTl9OT0RFLCBFTEpheGIuWE1MX0pPSU5fTk9ERV9fUkVGRVJFTkNFRF9YTUxfUEFUSCwgImZvbyIpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRSZWZlcmVuY2VkWG1sUGF0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxKb2luTm9kZS5nZXRSZWZlcmVuY2VkWG1sUGF0aCgpKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUVMSmF2YVhtbEpvaW5Ob2RlVGVzdHMudGhpcy5zZXRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkJCQlkZWNsYXJhdGlvbiwgRUxKYXhiLlhNTF9KT0lOX05PREUsIEVMSmF4Yi5YTUxfSk9JTl9OT0RFX19SRUZFUkVOQ0VEX1hNTF9QQVRILCAiIik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCIiLCBhbm5vdGF0aW9uLmdldFJlZmVyZW5jZWRYbWxQYXRoKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIHhtbEpvaW5Ob2RlLmdldFJlZmVyZW5jZWRYbWxQYXRoKCkpOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sSm9pbk5vZGVUZXN0cy50aGlzLnJlbW92ZU1lbWJlclZhbHVlUGFpcigKLQkJCQkJCWRlY2xhcmF0aW9uLCBFTEpheGIuWE1MX0pPSU5fTk9ERSwgRUxKYXhiLlhNTF9KT0lOX05PREVfX1JFRkVSRU5DRURfWE1MX1BBVEgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRSZWZlcmVuY2VkWG1sUGF0aCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxKb2luTm9kZS5nZXRSZWZlcmVuY2VkWG1sUGF0aCgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxKb2luTm9kZXNNYXBwaW5nVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sSm9pbk5vZGVzTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMDU1OWEuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxKb2luTm9kZXNNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3ViSXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5FTEpheGJQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FTFhtbEpvaW5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVMWG1sSm9pbk5vZGVzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxKb2luTm9kZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVMSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxKb2luTm9kZXNNYXBwaW5nVGVzdHMKLQkJZXh0ZW5kcyBFTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEVMSmF2YVhtbEpvaW5Ob2Rlc01hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGdldFBsYXRmb3JtKCkgewotCQlyZXR1cm4gRUxKYXhiUGxhdGZvcm0uVkVSU0lPTl8yXzI7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aFhtbEpvaW5Ob2RlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSwgRUxKYXhiLlhNTF9KT0lOX05PREVTKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sSm9pbk5vZGVzIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgTm9ybWFsQW5ub3RhdGlvbiBuZXdYbWxKb2luTm9kZUFubm90YXRpb24oQVNUIGFzdCwgU3RyaW5nIHhtbFBhdGgsIFN0cmluZyByZWZlcmVuY2VkWG1sUGF0aCkgewotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSBuZXdOb3JtYWxBbm5vdGF0aW9uKGFzdCwgRUxKYXhiLlhNTF9KT0lOX05PREUpOwotCQlhZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgRUxKYXhiLlhNTF9KT0lOX05PREVfX1hNTF9QQVRILCB4bWxQYXRoKTsKLQkJYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sIEVMSmF4Yi5YTUxfSk9JTl9OT0RFX19SRUZFUkVOQ0VEX1hNTF9QQVRILCByZWZlcmVuY2VkWG1sUGF0aCk7Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxKb2luTm9kZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgaW5kZXgsIFN0cmluZyB4bWxQYXRoLCBTdHJpbmcgcmVmZXJlbmNlZFhtbFBhdGgpIHsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbmV3WG1sSm9pbk5vZGVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldEFzdCgpLCB4bWxQYXRoLCByZWZlcmVuY2VkWG1sUGF0aCk7Ci0JCWFkZEFycmF5RWxlbWVudChkZWNsYXJhdGlvbiwgRUxKYXhiLlhNTF9KT0lOX05PREVTLCBpbmRleCwgInZhbHVlIiwgYW5ub3RhdGlvbik7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbW92ZVhtbEpvaW5Ob2RlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCW1vdmVBcnJheUVsZW1lbnQoKE5vcm1hbEFubm90YXRpb24pIGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChFTEpheGIuWE1MX0pPSU5fTk9ERVMpLCAidmFsdWUiLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxKb2luTm9kZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmVtb3ZlQXJyYXlFbGVtZW50KChOb3JtYWxBbm5vdGF0aW9uKSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoRUxKYXhiLlhNTF9KT0lOX05PREVTKSwgInZhbHVlIiwgaW5kZXgpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sSm9pbk5vZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sSm9pbk5vZGVzKCk7Ci0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJRUxYbWxKb2luTm9kZXNNYXBwaW5nIG1hcHBpbmcgPSAoRUxYbWxKb2luTm9kZXNNYXBwaW5nKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlJdGVyYWJsZTxFTFhtbEpvaW5Ob2RlPiB4bWxKb2luTm9kZXMgPSBtYXBwaW5nLmdldFhtbEpvaW5Ob2RlcygpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHhtbEpvaW5Ob2RlcykpOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFwcGluZy5nZXRYbWxKb2luTm9kZXNTaXplKCkpOwotCQkKLQkJLy9hZGQgMiBYbWxKb2luTm9kZSBhbm5vdGF0aW9ucwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSBhbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCUVMSmF2YVhtbEpvaW5Ob2Rlc01hcHBpbmdUZXN0cy50aGlzLmFkZFhtbEpvaW5Ob2RlKGRlY2xhcmF0aW9uLCAwLCAiZm9vIiwgIkBmb28iKTsKLQkJCQkJCUVMSmF2YVhtbEpvaW5Ob2Rlc01hcHBpbmdUZXN0cy50aGlzLmFkZFhtbEpvaW5Ob2RlKGRlY2xhcmF0aW9uLCAxLCAiYmFyIiwgIkBiYXIiKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJeG1sSm9pbk5vZGVzID0gbWFwcGluZy5nZXRYbWxKb2luTm9kZXMoKTsKLQkJCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHhtbEpvaW5Ob2RlcykpOwotCQlhc3NlcnRFcXVhbHMoMiwgbWFwcGluZy5nZXRYbWxKb2luTm9kZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sSm9pbk5vZGVzLCAwKS5nZXRYbWxQYXRoKCkpOwotCQlhc3NlcnRFcXVhbHMoIkBmb28iLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEpvaW5Ob2RlcywgMCkuZ2V0UmVmZXJlbmNlZFhtbFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxKb2luTm9kZXMsIDEpLmdldFhtbFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscygiQGJhciIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sSm9pbk5vZGVzLCAxKS5nZXRSZWZlcmVuY2VkWG1sUGF0aCgpKTsKLQkJCi0JCS8vIHN3aXRjaCBYbWxKb2luTm9kZSBhbm5vdGF0aW9ucwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJRUxKYXZhWG1sSm9pbk5vZGVzTWFwcGluZ1Rlc3RzLnRoaXMubW92ZVhtbEpvaW5Ob2RlKGRlY2xhcmF0aW9uLCAwLCAxKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJeG1sSm9pbk5vZGVzID0gbWFwcGluZy5nZXRYbWxKb2luTm9kZXMoKTsKLQkJCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHhtbEpvaW5Ob2RlcykpOwotCQlhc3NlcnRFcXVhbHMoMiwgbWFwcGluZy5nZXRYbWxKb2luTm9kZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sSm9pbk5vZGVzLCAwKS5nZXRYbWxQYXRoKCkpOwotCQlhc3NlcnRFcXVhbHMoIkBiYXIiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEpvaW5Ob2RlcywgMCkuZ2V0UmVmZXJlbmNlZFhtbFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxKb2luTm9kZXMsIDEpLmdldFhtbFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscygiQGZvbyIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sSm9pbk5vZGVzLCAxKS5nZXRSZWZlcmVuY2VkWG1sUGF0aCgpKTsKLQkJCi0JCS8vIHJlbW92ZSBYbWxKb2luTm9kZSBhbm5vdGF0aW9ucwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJRUxKYXZhWG1sSm9pbk5vZGVzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlWG1sSm9pbk5vZGUoZGVjbGFyYXRpb24sIDEpOwotCQkJCQkJRUxKYXZhWG1sSm9pbk5vZGVzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlWG1sSm9pbk5vZGUoZGVjbGFyYXRpb24sIDApOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQl4bWxKb2luTm9kZXMgPSBtYXBwaW5nLmdldFhtbEpvaW5Ob2RlcygpOwotCQkKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eSh4bWxKb2luTm9kZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcHBpbmcuZ2V0WG1sSm9pbk5vZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sSm9pbk5vZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sSm9pbk5vZGVzKCk7Ci0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJRUxYbWxKb2luTm9kZXNNYXBwaW5nIG1hcHBpbmcgPSAoRUxYbWxKb2luTm9kZXNNYXBwaW5nKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEVMSmF4Yi5YTUxfSk9JTl9OT0RFKSk7Ci0JCWFzc2VydEVxdWFscygwLCBtYXBwaW5nLmdldFhtbEpvaW5Ob2Rlc1NpemUoKSk7Ci0JCQotCQlFTFhtbEpvaW5Ob2RlIGpvaW5Ob2RlID0gbWFwcGluZy5hZGRYbWxKb2luTm9kZSgwKTsKLQkJam9pbk5vZGUuc2V0WG1sUGF0aCgiZm9vIik7Ci0JCWpvaW5Ob2RlLnNldFJlZmVyZW5jZWRYbWxQYXRoKCJAZm9vIik7Ci0JCWpvaW5Ob2RlID0gbWFwcGluZy5hZGRYbWxKb2luTm9kZSgxKTsKLQkJam9pbk5vZGUuc2V0WG1sUGF0aCgiYmF6Iik7Ci0JCWpvaW5Ob2RlLnNldFJlZmVyZW5jZWRYbWxQYXRoKCJAYmF6Iik7Ci0JCWpvaW5Ob2RlID0gbWFwcGluZy5hZGRYbWxKb2luTm9kZSgxKTsKLQkJam9pbk5vZGUuc2V0WG1sUGF0aCgiYmFyIik7Ci0JCWpvaW5Ob2RlLnNldFJlZmVyZW5jZWRYbWxQYXRoKCJAYmFyIik7Ci0JCQotCQlJdGVyYWJsZTxYbWxKb2luTm9kZUFubm90YXRpb24+IHhtbEpvaW5Ob2RlQW5ub3RhdGlvbnMgPSAKLQkJCQluZXcgU3ViSXRlcmFibGVXcmFwcGVyKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfSk9JTl9OT0RFKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoeG1sSm9pbk5vZGVBbm5vdGF0aW9ucykpOwotCQlhc3NlcnRFcXVhbHMoMywgbWFwcGluZy5nZXRYbWxKb2luTm9kZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sSm9pbk5vZGVBbm5vdGF0aW9ucywgMCkuZ2V0WG1sUGF0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJAZm9vIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxKb2luTm9kZUFubm90YXRpb25zLCAwKS5nZXRSZWZlcmVuY2VkWG1sUGF0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEpvaW5Ob2RlQW5ub3RhdGlvbnMsIDEpLmdldFhtbFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscygiQGJhciIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sSm9pbk5vZGVBbm5vdGF0aW9ucywgMSkuZ2V0UmVmZXJlbmNlZFhtbFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxKb2luTm9kZUFubm90YXRpb25zLCAyKS5nZXRYbWxQYXRoKCkpOwotCQlhc3NlcnRFcXVhbHMoIkBiYXoiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEpvaW5Ob2RlQW5ub3RhdGlvbnMsIDIpLmdldFJlZmVyZW5jZWRYbWxQYXRoKCkpOwotCQkKLQkJbWFwcGluZy5tb3ZlWG1sSm9pbk5vZGUoMSwgMik7Ci0JCQotCQl4bWxKb2luTm9kZUFubm90YXRpb25zID0gCi0JCQkJbmV3IFN1Ykl0ZXJhYmxlV3JhcHBlcihyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucyhFTEpheGIuWE1MX0pPSU5fTk9ERSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHhtbEpvaW5Ob2RlQW5ub3RhdGlvbnMpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcHBpbmcuZ2V0WG1sSm9pbk5vZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEpvaW5Ob2RlQW5ub3RhdGlvbnMsIDApLmdldFhtbFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscygiQGZvbyIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sSm9pbk5vZGVBbm5vdGF0aW9ucywgMCkuZ2V0UmVmZXJlbmNlZFhtbFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxKb2luTm9kZUFubm90YXRpb25zLCAxKS5nZXRYbWxQYXRoKCkpOwotCQlhc3NlcnRFcXVhbHMoIkBiYXoiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEpvaW5Ob2RlQW5ub3RhdGlvbnMsIDEpLmdldFJlZmVyZW5jZWRYbWxQYXRoKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sSm9pbk5vZGVBbm5vdGF0aW9ucywgMikuZ2V0WG1sUGF0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJAYmFyIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxKb2luTm9kZUFubm90YXRpb25zLCAyKS5nZXRSZWZlcmVuY2VkWG1sUGF0aCgpKTsKLQkJCi0JCW1hcHBpbmcucmVtb3ZlWG1sSm9pbk5vZGUoMik7Ci0JCW1hcHBpbmcucmVtb3ZlWG1sSm9pbk5vZGUoMCk7Ci0JCW1hcHBpbmcucmVtb3ZlWG1sSm9pbk5vZGUoMCk7Ci0JCQotCQl4bWxKb2luTm9kZUFubm90YXRpb25zID0gCi0JCQkJbmV3IFN1Ykl0ZXJhYmxlV3JhcHBlcihyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucyhFTEpheGIuWE1MX0pPSU5fTk9ERSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHhtbEpvaW5Ob2RlQW5ub3RhdGlvbnMpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcHBpbmcuZ2V0WG1sSm9pbk5vZGVzU2l6ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbFBhdGhUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxQYXRoVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY1OGNiOS4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbFBhdGhUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FTFhtbEVsZW1lbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVMWG1sUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FTEphdmFYbWxFbGVtZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxQYXRoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRUxKYXhiQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF2YVhtbFBhdGhUZXN0cwotCQlleHRlbmRzIEVMSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgRUxKYXZhWG1sUGF0aFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVHlwZVdpdGhYbWxQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFLCBFTEpheGIuWE1MX1BBVEgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxQYXRoIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxQYXRoKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlFTFhtbEVsZW1lbnRNYXBwaW5nIG1hcHBpbmcgPSAoRUxYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlFTFhtbFBhdGggeHBhdGggPSBtYXBwaW5nLmdldFhtbFBhdGgoKTsKLQkJWG1sUGF0aEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChYbWxQYXRoQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBFTEpheGIuWE1MX1BBVEgpOwotCQkKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHhwYXRoLmdldFZhbHVlKCkpOwotCQkKLQkJeHBhdGguc2V0VmFsdWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhwYXRoLmdldFZhbHVlKCkpOwotCQkKLQkJeHBhdGguc2V0VmFsdWUoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCIiLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIHhwYXRoLmdldFZhbHVlKCkpOwotCQkKLQkJeHBhdGguc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoeHBhdGguZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sUGF0aCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJRUxKYXZhWG1sRWxlbWVudE1hcHBpbmcgbWFwcGluZyA9IChFTEphdmFYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlFTFhtbFBhdGggeHBhdGggPSBtYXBwaW5nLmdldFhtbFBhdGgoKTsKLQkJWG1sUGF0aEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChYbWxQYXRoQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBFTEpheGIuWE1MX1BBVEgpOwotCQkKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHhwYXRoLmdldFZhbHVlKCkpOwotCQkKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sUGF0aFRlc3RzLnRoaXMuc2V0TWVtYmVyVmFsdWVQYWlyKAotCQkJCQkJZGVjbGFyYXRpb24sIEVMSmF4Yi5YTUxfUEFUSCwgImZvbyIpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4cGF0aC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUVMSmF2YVhtbFBhdGhUZXN0cy50aGlzLnNldE1lbWJlclZhbHVlUGFpcigKLQkJCQkJCWRlY2xhcmF0aW9uLCBFTEpheGIuWE1MX1BBVEgsICIiKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIiIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgeHBhdGguZ2V0VmFsdWUoKSk7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlFTEphdmFYbWxQYXRoVGVzdHMudGhpcy5yZW1vdmVNZW1iZXJWYWx1ZVBhaXIoCi0JCQkJCQlkZWNsYXJhdGlvbiwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoeHBhdGguZ2V0VmFsdWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxWYWx1ZU1hcHBpbmdUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxWYWx1ZU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWU0NGEyLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sVmFsdWVNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLkVMSmF4YlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVMSmF2YVhtbFZhbHVlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sVmFsdWVNYXBwaW5nVGVzdHMKLQkJZXh0ZW5kcyBFTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEVMSmF2YVhtbFZhbHVlTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0UGxhdGZvcm0oKSB7Ci0JCXJldHVybiBFTEpheGJQbGF0Zm9ybS5WRVJTSU9OXzJfMjsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVR5cGVXaXRoWG1sVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RZUEUsIEpBWEIuWE1MX1ZBTFVFKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVmFsdWUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxDREFUQSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbFZhbHVlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlFTEphdmFYbWxWYWx1ZU1hcHBpbmcgbWFwcGluZyA9IChFTEphdmFYbWxWYWx1ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihFTEpheGIuWE1MX0NEQVRBKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxDREFUQSgpKTsKLQkJCi0JCW1hcHBpbmcuYWRkWG1sQ0RBVEEoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihFTEpheGIuWE1MX0NEQVRBKSk7Ci0JCWFzc2VydE5vdE51bGwobWFwcGluZy5nZXRYbWxDREFUQSgpKTsKLQkJCi0JCW1hcHBpbmcucmVtb3ZlWG1sQ0RBVEEoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihFTEpheGIuWE1MX0NEQVRBKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxDREFUQSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbENEQVRBKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sVmFsdWUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCUVMSmF2YVhtbFZhbHVlTWFwcGluZyBtYXBwaW5nID0gKEVMSmF2YVhtbFZhbHVlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfQ0RBVEEpKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbENEQVRBKCkpOwotCQkKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sVmFsdWVNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKAotCQkJCQkJZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgRUxKYXhiLlhNTF9DREFUQSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfQ0RBVEEpKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBwaW5nLmdldFhtbENEQVRBKCkpOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sVmFsdWVNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBFTEpheGIuWE1MX0NEQVRBKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oRUxKYXhiLlhNTF9DREFUQSkpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sQ0RBVEEoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEpheGJDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF4YkNvcmVKYXZhQ29udGV4dE1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjliYzdmNi4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF4YkNvcmVKYXZhQ29udGV4dE1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXhiQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cwotCQlleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoRUxKYXhiQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRUxKYXZhQ2xhc3NNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRUxKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVMSmF2YVhtbERpc2NyaW1pbmF0b3JOb2RlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRUxKYXZhWG1sRGlzY3JpbWluYXRvclZhbHVlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRUxKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFTEphdmFYbWxFbGVtZW50c01hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFTEphdmFYbWxJbnZlcnNlUmVmZXJlbmNlTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVMSmF2YVhtbEpvaW5Ob2Rlc01hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFTEphdmFYbWxKb2luTm9kZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVMSmF2YVhtbFBhdGhUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFTEphdmFYbWxWYWx1ZU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBFTEpheGJDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvRUxKYXhiQ29yZVJlc291cmNlTW9kZWxUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL0VMSmF4YkNvcmVSZXNvdXJjZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJhMDBjMi4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvRUxKYXhiQ29yZVJlc291cmNlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLkVMSmF4YkNvcmVUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmEuRUxKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0czsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXhiQ29yZVJlc291cmNlTW9kZWxUZXN0cyAKLQkJZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEVMSmF4YkNvcmVSZXNvdXJjZU1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQotCQlpZiAoRUxKYXhiQ29yZVRlc3RzLnJlcXVpcmVkSmFyc0V4aXN0cygpKSB7Ci0JCQlzdWl0ZS5hZGRUZXN0KEVMSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdHMuc3VpdGUoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdWl0ZS5hZGRUZXN0KFRlc3RTdWl0ZS53YXJuaW5nKEVMSmF4YkNvcmVUZXN0cy5idWlsZE1pc3NpbmdKYXJFcnJvck1lc3NhZ2UoKSkpOwotCQl9Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBFTEpheGJDb3JlUmVzb3VyY2VNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FTEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FTEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OTAxMGMuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRUxKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF4YlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8xLkVMSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBFTEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIAotCQlleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewkKLQkKLQlwdWJsaWMgRUxKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5qYXZhUHJvamVjdC5hZGRKYXIoVGVzdEpheGJQcm9qZWN0LmVjbGlwc2VsaW5rSmFyTmFtZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJLy8gbm90aGluZyBhcyBvZiB5ZXQKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb25EZWZpbml0aW9uW10gYW5ub3RhdGlvbkRlZmluaXRpb25zKCkgewotCQlyZXR1cm4gRUxKYXhiXzJfMV9QbGF0Zm9ybURlZmluaXRpb24uaW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25bXSBuZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIEVMSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uLmluc3RhbmNlKCkuZ2V0TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FTEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FTEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YzRhODkuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRUxKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0cwotCQlleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoRUxKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sQ0RBVEFBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sSm9pbk5vZGVBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sS2V5QW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbFBhdGhBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQkKLQlwcml2YXRlIEVMSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbENEQVRBQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxDREFUQUFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDg4MjIxLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbENEQVRBQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMi5FTEpheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxDREFUQUFubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIFhtbENEQVRBQW5ub3RhdGlvblRlc3RzCi0JCWV4dGVuZHMgRUxKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFhtbENEQVRBQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkRlZmluaXRpb25bXSBhbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBFTEpheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbi5pbnN0YW5jZSgpLmdldEFubm90YXRpb25EZWZpbml0aW9ucygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbltdIG5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zKCkgewotCQlyZXR1cm4gRUxKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb24uaW5zdGFuY2UoKS5nZXROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucygpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbENEQVRBKCkgCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVMSmF4Yi5YTUxfQ0RBVEEpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbENEQVRBIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIFhtbENEQVRBQW5ub3RhdGlvbiBnZXRYbWxDREFUQUFubm90YXRpb24oSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlKSB7Ci0JCXJldHVybiAoWG1sQ0RBVEFBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfQ0RBVEEpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFhtbENEQVRBKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sQ0RBVEFBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxDREFUQUFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uICE9IG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxEaXNjcmltaW5hdG9yTm9kZUFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmQyZjZlLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8yLkVMSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uVGVzdHMKLQkJZXh0ZW5kcyBFTEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgWG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRGVmaW5pdGlvbltdIGFubm90YXRpb25EZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIEVMSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uLmluc3RhbmNlKCkuZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25zKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uW10gbmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBFTEpheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbi5pbnN0YW5jZSgpLmdldE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zKCk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRGlzY3JpbWluYXRvck5vZGVXaXRoVmFsdWUoKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFTEpheGIuWE1MX0RJU0NSSU1JTkFUT1JfTk9ERSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRGlzY3JpbWluYXRvck5vZGUoXCJmb29cIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCQotCXByaXZhdGUgWG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uIGdldFhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gKFhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRUxKYXhiLlhNTF9ESVNDUklNSU5BVE9SX05PREUpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RYbWxEaXNjcmltaW5hdG9yTm9kZVdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCVhtbERpc2NyaW1pbmF0b3JOb2RlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sRGlzY3JpbWluYXRvck5vZGVBbm5vdGF0aW9uKHJlc291cmNlVHlwZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRGlzY3JpbWluYXRvck5vZGUoXCJmb29cIikiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFZhbHVlKCJiYXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYmFyIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxEaXNjcmltaW5hdG9yTm9kZShcImJhclwiKSIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0VmFsdWUoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCIiLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbERpc2NyaW1pbmF0b3JOb2RlKFwiXCIpIiwgY3UpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxEaXNjcmltaW5hdG9yTm9kZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxEaXNjcmltaW5hdG9yTm9kZSgiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3NDNmZC4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzIuRUxKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvblRlc3RzCi0JCWV4dGVuZHMgRUxKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFhtbERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb25EZWZpbml0aW9uW10gYW5ub3RhdGlvbkRlZmluaXRpb25zKCkgewotCQlyZXR1cm4gRUxKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb24uaW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25bXSBuZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIEVMSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uLmluc3RhbmNlKCkuZ2V0TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxEaXNjcmltaW5hdG9yVmFsdWVXaXRoVmFsdWUoKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFTEpheGIuWE1MX0RJU0NSSU1JTkFUT1JfVkFMVUUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbERpc2NyaW1pbmF0b3JWYWx1ZShcImZvb1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBYbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIGdldFhtbERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24oSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIChYbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFTEpheGIuWE1MX0RJU0NSSU1JTkFUT1JfVkFMVUUpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RYbWxEaXNjcmltaW5hdG9yVmFsdWVXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlYbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKHJlc291cmNlVHlwZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRGlzY3JpbWluYXRvclZhbHVlKFwiZm9vXCIpIiwgY3UpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZSgiYmFyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImJhciIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRGlzY3JpbWluYXRvclZhbHVlKFwiYmFyXCIpIiwgY3UpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZSgiIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIiIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRGlzY3JpbWluYXRvclZhbHVlKFwiXCIpIiwgY3UpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxEaXNjcmltaW5hdG9yVmFsdWUiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sRGlzY3JpbWluYXRvclZhbHVlKCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNDA0ZjkuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvblRlc3RzCi0JCWV4dGVuZHMgRUxKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sSW52ZXJzZVJlZmVyZW5jZSgpIAotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFTEpheGIuWE1MX0lOVkVSU0VfUkVGRVJFTkNFKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxJbnZlcnNlUmVmZXJlbmNlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEludmVyc2VSZWZlcmVuY2VXaXRoTWFwcGVkQnkoKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFTEpheGIuWE1MX0lOVkVSU0VfUkVGRVJFTkNFKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxJbnZlcnNlUmVmZXJlbmNlKG1hcHBlZEJ5ID0gXCJmb29cIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24gZ2V0WG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24oSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlKSB7Ci0JCXJldHVybiAoWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oRUxKYXhiLlhNTF9JTlZFUlNFX1JFRkVSRU5DRSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0WG1sSW52ZXJzZVJlZmVyZW5jZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKGFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0WG1sSW52ZXJzZVJlZmVyZW5jZVdpdGhNYXBwZWRCeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFhtbEludmVyc2VSZWZlcmVuY2UoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRNYXBwZWRCeSgiYmFyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImJhciIsIGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sSW52ZXJzZVJlZmVyZW5jZShtYXBwZWRCeSA9IFwiYmFyXCIpIiwgY3UpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRNYXBwZWRCeSgiIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIiIsIGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sSW52ZXJzZVJlZmVyZW5jZShtYXBwZWRCeSA9IFwiXCIpIiwgY3UpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRNYXBwZWRCeShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxJbnZlcnNlUmVmZXJlbmNlIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigibWFwcGVkQnkiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSm9pbk5vZGVBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEpvaW5Ob2RlQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YjgxNWUuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSm9pbk5vZGVBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMi5FTEpheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxKb2luTm9kZUFubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIFhtbEpvaW5Ob2RlQW5ub3RhdGlvblRlc3RzCi0JCWV4dGVuZHMgRUxKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFhtbEpvaW5Ob2RlQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkRlZmluaXRpb25bXSBhbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBFTEpheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbi5pbnN0YW5jZSgpLmdldEFubm90YXRpb25EZWZpbml0aW9ucygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbltdIG5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zKCkgewotCQlyZXR1cm4gRUxKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb24uaW5zdGFuY2UoKS5nZXROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucygpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEpvaW5Ob2RlKCkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRUxKYXhiLlhNTF9KT0lOX05PREUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEpvaW5Ob2RlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEpvaW5Ob2RlV2l0aFhtbFBhdGgoKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFTEpheGIuWE1MX0pPSU5fTk9ERSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sSm9pbk5vZGUoeG1sUGF0aD1cImZvb1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxKb2luTm9kZVdpdGhSZWZlcmVuY2VkWG1sUGF0aCgpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVMSmF4Yi5YTUxfSk9JTl9OT0RFKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxKb2luTm9kZShyZWZlcmVuY2VkWG1sUGF0aD1cImZvb1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxKb2luTm9kZXMoKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFTEpheGIuWE1MX0pPSU5fTk9ERVMsIEVMSmF4Yi5YTUxfSk9JTl9OT0RFKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxKb2luTm9kZXMoe0BYbWxKb2luTm9kZSxAWG1sSm9pbk5vZGV9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBYbWxKb2luTm9kZUFubm90YXRpb24gZ2V0WG1sSm9pbk5vZGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSkgewotCQlyZXR1cm4gZ2V0WG1sSm9pbk5vZGVBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlLCAwKTsKLQl9Ci0JCi0JcHJpdmF0ZSBYbWxKb2luTm9kZUFubm90YXRpb24gZ2V0WG1sSm9pbk5vZGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSwgaW50IGluZGV4KSB7Ci0JCXJldHVybiAoWG1sSm9pbk5vZGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKGluZGV4LCBFTEpheGIuWE1MX0pPSU5fTk9ERSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RYbWxQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0WG1sSm9pbk5vZGVXaXRoWG1sUGF0aCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEpvaW5Ob2RlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sSm9pbk5vZGVBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRYbWxQYXRoKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEpvaW5Ob2RlKHhtbFBhdGg9XCJmb29cIikiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFhtbFBhdGgoImJhciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBhbm5vdGF0aW9uLmdldFhtbFBhdGgoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sSm9pbk5vZGUoeG1sUGF0aD1cImJhclwiKSIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0WG1sUGF0aCgiIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIiIsIGFubm90YXRpb24uZ2V0WG1sUGF0aCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxKb2luTm9kZSh4bWxQYXRoPVwiXCIpIiwgY3UpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRYbWxQYXRoKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldFhtbFBhdGgoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sSm9pbk5vZGUiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sSm9pbk5vZGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVmZXJlbmNlZFhtbFBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RYbWxKb2luTm9kZVdpdGhSZWZlcmVuY2VkWG1sUGF0aCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEpvaW5Ob2RlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sSm9pbk5vZGVBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRSZWZlcmVuY2VkWG1sUGF0aCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxKb2luTm9kZShyZWZlcmVuY2VkWG1sUGF0aD1cImZvb1wiKSIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0UmVmZXJlbmNlZFhtbFBhdGgoImJhciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBhbm5vdGF0aW9uLmdldFJlZmVyZW5jZWRYbWxQYXRoKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEpvaW5Ob2RlKHJlZmVyZW5jZWRYbWxQYXRoPVwiYmFyXCIpIiwgY3UpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRSZWZlcmVuY2VkWG1sUGF0aCgiIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIiIsIGFubm90YXRpb24uZ2V0UmVmZXJlbmNlZFhtbFBhdGgoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sSm9pbk5vZGUocmVmZXJlbmNlZFhtbFBhdGg9XCJcIikiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFJlZmVyZW5jZWRYbWxQYXRoKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldFJlZmVyZW5jZWRYbWxQYXRoKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEpvaW5Ob2RlIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbEpvaW5Ob2RlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5lZFhtbFBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gdGVzdCBjb250YWluZWQgYW5ub3RhdGlvbiB4bWxQYXRoIHNldHRpbmcvdXBkYXRpbmcKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0WG1sSm9pbk5vZGVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sSm9pbk5vZGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxKb2luTm9kZUFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldFhtbFBhdGgoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sSm9pbk5vZGVzKHtAWG1sSm9pbk5vZGUsQFhtbEpvaW5Ob2RlfSkiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFhtbFBhdGgoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0WG1sUGF0aCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxKb2luTm9kZXMoe0BYbWxKb2luTm9kZSh4bWxQYXRoID0gXCJmb29cIiksQFhtbEpvaW5Ob2RlfSkiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFhtbFBhdGgobnVsbCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRYbWxQYXRoKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygKLQkJCQkiQFhtbEpvaW5Ob2Rlcyh7QFhtbEpvaW5Ob2RlLEBYbWxKb2luTm9kZX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbmVkUmVmZXJlbmNlZFhtbFBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gdGVzdCBjb250YWluZWQgYW5ub3RhdGlvbiByZWZlcmVuY2VkWG1sUGF0aCBzZXR0aW5nL3VwZGF0aW5nCi0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFhtbEpvaW5Ob2RlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEpvaW5Ob2RlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sSm9pbk5vZGVBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRSZWZlcmVuY2VkWG1sUGF0aCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxKb2luTm9kZXMoe0BYbWxKb2luTm9kZSxAWG1sSm9pbk5vZGV9KSIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0UmVmZXJlbmNlZFhtbFBhdGgoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0UmVmZXJlbmNlZFhtbFBhdGgoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sSm9pbk5vZGVzKHtAWG1sSm9pbk5vZGUocmVmZXJlbmNlZFhtbFBhdGggPSBcImZvb1wiKSxAWG1sSm9pbk5vZGV9KSIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0UmVmZXJlbmNlZFhtbFBhdGgobnVsbCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRSZWZlcmVuY2VkWG1sUGF0aCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxKb2luTm9kZXMoe0BYbWxKb2luTm9kZSxAWG1sSm9pbk5vZGV9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5lZCgpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gdGVzdCBhZGRpbmcvcmVtb3ZpbmcvbW92aW5nCi0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFhtbEpvaW5Ob2RlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoRUxKYXhiLlhNTF9KT0lOX05PREUpKTsKLQkJCi0JCXJlc291cmNlQXR0cmlidXRlLmFkZEFubm90YXRpb24oMSwgRUxKYXhiLlhNTF9KT0lOX05PREUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZShFTEpheGIuWE1MX0pPSU5fTk9ERSkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEpvaW5Ob2Rlcyh7IEBYbWxKb2luTm9kZSwgQFhtbEpvaW5Ob2RlIH0pIiwgY3UpOwotCQkKLQkJWG1sSm9pbk5vZGVBbm5vdGF0aW9uIGFubm90YXRpb24xID0gZ2V0WG1sSm9pbk5vZGVBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlLCAwKTsKLQkJYW5ub3RhdGlvbjEuc2V0WG1sUGF0aCgiZm9vIik7Ci0JCVhtbEpvaW5Ob2RlQW5ub3RhdGlvbiBhbm5vdGF0aW9uMiA9IGdldFhtbEpvaW5Ob2RlQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSwgMSk7Ci0JCWFubm90YXRpb24yLnNldFhtbFBhdGgoImJhciIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygKLQkJCQkiQFhtbEpvaW5Ob2Rlcyh7IEBYbWxKb2luTm9kZSh4bWxQYXRoID0gXCJmb29cIiksIEBYbWxKb2luTm9kZSh4bWxQYXRoID0gXCJiYXJcIikgfSkiLCBjdSk7Ci0JCQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5tb3ZlQW5ub3RhdGlvbigwLCAxLCBFTEpheGIuWE1MX0pPSU5fTk9ERSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sSm9pbk5vZGVzKHsgQFhtbEpvaW5Ob2RlKHhtbFBhdGggPSBcImJhclwiKSwgQFhtbEpvaW5Ob2RlKHhtbFBhdGggPSBcImZvb1wiKSB9KSIsIGN1KTsKLQkJCi0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oMCwgRUxKYXhiLlhNTF9KT0lOX05PREUpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEVMSmF4Yi5YTUxfSk9JTl9OT0RFKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sSm9pbk5vZGUoeG1sUGF0aCA9IFwiZm9vXCIpIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbEpvaW5Ob2RlcyIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxLZXlBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEtleUFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmQwYTE2Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEtleUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzIuRUxKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuWG1sS2V5QW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sS2V5QW5ub3RhdGlvblRlc3RzCi0JCWV4dGVuZHMgRUxKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFhtbEtleUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb25EZWZpbml0aW9uW10gYW5ub3RhdGlvbkRlZmluaXRpb25zKCkgewotCQlyZXR1cm4gRUxKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb24uaW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25bXSBuZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIEVMSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uLmluc3RhbmNlKCkuZ2V0TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxLZXkoKSAKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRUxKYXhiLlhNTF9LRVkpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEtleSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBYbWxLZXlBbm5vdGF0aW9uIGdldFhtbEtleUFubm90YXRpb24oSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlKSB7Ci0JCXJldHVybiAoWG1sS2V5QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihFTEpheGIuWE1MX0tFWSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0WG1sS2V5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sS2V5QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sS2V5QW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKGFubm90YXRpb24gIT0gbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sUGF0aEFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sUGF0aEFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDI3Mzk0Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFBhdGhBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxQYXRoQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sUGF0aEFubm90YXRpb25UZXN0cwotCQlleHRlbmRzIEVMSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBYbWxQYXRoQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbFBhdGgoKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFTEpheGIuWE1MX1BBVEgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFBhdGgiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sUGF0aFdpdGhWYWx1ZSgpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sUGF0aChcImZvb1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxQYXRocygpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVMSmF4Yi5YTUxfUEFUSFMsIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sUGF0aHMoe0BYbWxQYXRoLEBYbWxQYXRofSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgWG1sUGF0aEFubm90YXRpb24gZ2V0WG1sUGF0aEFubm90YXRpb24oSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlKSB7Ci0JCXJldHVybiBnZXRYbWxQYXRoQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSwgMCk7Ci0JfQotCQotCXByaXZhdGUgWG1sUGF0aEFubm90YXRpb24gZ2V0WG1sUGF0aEFubm90YXRpb24oSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChYbWxQYXRoQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihpbmRleCwgRUxKYXhiLlhNTF9QQVRIKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0WG1sUGF0aFdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbFBhdGhBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxQYXRoQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sUGF0aChcImZvb1wiKSIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0VmFsdWUoImJhciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFBhdGgoXCJiYXJcIikiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFZhbHVlKCIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxQYXRoKFwiXCIpIiwgY3UpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxQYXRoIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbFBhdGgoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbmVkVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gdGVzdCBjb250YWluZWQgYW5ub3RhdGlvbiB2YWx1ZSBzZXR0aW5nL3VwZGF0aW5nCi0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFhtbFBhdGhzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sUGF0aEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbFBhdGhBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxQYXRocyh7QFhtbFBhdGgsQFhtbFBhdGh9KSIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sUGF0aHMoe0BYbWxQYXRoKFwiZm9vXCIpLEBYbWxQYXRofSkiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sUGF0aHMoe0BYbWxQYXRoLEBYbWxQYXRofSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluZWQoKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHRlc3QgYWRkaW5nL3JlbW92aW5nL21vdmluZwotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RYbWxQYXRoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoRUxKYXhiLlhNTF9QQVRIKSk7Ci0JCQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKDEsIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEVMSmF4Yi5YTUxfUEFUSCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFBhdGhzKHsgQFhtbFBhdGgsIEBYbWxQYXRoIH0pIiwgY3UpOwotCQkKLQkJWG1sUGF0aEFubm90YXRpb24gYW5ub3RhdGlvbjEgPSBnZXRYbWxQYXRoQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSwgMCk7Ci0JCWFubm90YXRpb24xLnNldFZhbHVlKCJmb28iKTsKLQkJWG1sUGF0aEFubm90YXRpb24gYW5ub3RhdGlvbjIgPSBnZXRYbWxQYXRoQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSwgMSk7Ci0JCWFubm90YXRpb24yLnNldFZhbHVlKCJiYXIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxQYXRocyh7IEBYbWxQYXRoKFwiZm9vXCIpLCBAWG1sUGF0aChcImJhclwiKSB9KSIsIGN1KTsKLQkJCi0JCXJlc291cmNlQXR0cmlidXRlLm1vdmVBbm5vdGF0aW9uKDAsIDEsIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sUGF0aHMoeyBAWG1sUGF0aChcImJhclwiKSwgQFhtbFBhdGgoXCJmb29cIikgfSkiLCBjdSk7Ci0JCQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoRUxKYXhiLlhNTF9QQVRIKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sUGF0aChcImZvb1wiKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxQYXRocyIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZkNDAzOS4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8yLkVMSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uVGVzdHMKLQkJZXh0ZW5kcyBFTEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRGVmaW5pdGlvbltdIGFubm90YXRpb25EZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIEVMSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uLmluc3RhbmNlKCkuZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25zKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uW10gbmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBFTEpheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbi5pbnN0YW5jZSgpLmdldE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zKCk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sVHJhbnNmb3JtYXRpb24oKSAKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRUxKYXhiLlhNTF9UUkFOU0ZPUk1BVElPTik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHJhbnNmb3JtYXRpb24iKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sVHJhbnNmb3JtYXRpb25XaXRoT3B0aW9uYWwoKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFTEpheGIuWE1MX1RSQU5TRk9STUFUSU9OKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUcmFuc2Zvcm1hdGlvbihvcHRpb25hbCA9IHRydWUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIFhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbiBnZXRYbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24oSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlKSB7Ci0JCXJldHVybiAoWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfVFJBTlNGT1JNQVRJT04pOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFhtbFRyYW5zZm9ybWF0aW9uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0T3B0aW9uYWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFhtbFRyYW5zZm9ybWF0aW9uV2l0aE9wdGlvbmFsKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYW5ub3RhdGlvbi5nZXRPcHRpb25hbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0WG1sVHJhbnNmb3JtYXRpb24oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGFubm90YXRpb24uZ2V0T3B0aW9uYWwoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sVHJhbnNmb3JtYXRpb24ob3B0aW9uYWwgPSBmYWxzZSkiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldE9wdGlvbmFsKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE9wdGlvbmFsKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFRyYW5zZm9ybWF0aW9uIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigib3B0aW9uYWwiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3Rlc3QueG1sIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTQzMDIyLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLQotICBDb250cmlidXRvcnM6Ci0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLQk8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotCTwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+Ci0JPGVjaG8gbWVzc2FnZT0iYmFzZWRpciAke2Jhc2VkaXJ9IiAvPgotCTxlY2hvIG1lc3NhZ2U9ImVjbGlwc2UgcGxhY2UgJHtlY2xpcHNlLWhvbWV9IiAvPgotCTwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBwbHVnaW4tbmFtZSAtLT4KLQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzIi8+Ci0gICAgPGVjaG8gbGV2ZWw9ImRlYnVnIiBtZXNzYWdlPSJ0ZXN0Um9vdDogJHt0ZXN0Um9vdH0iIC8+Ci0gICAgPGZhaWwgbWVzc2FnZT0idGVzdFJvb3QgbXVzdCBiZSBzZXQiIHVubGVzcz0idGVzdFJvb3QiIC8+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0JPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLQk8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8dHN0YW1wLz4KLQkJPGRlbGV0ZT4KLQkJCTxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnKi54bWwiLz4KLQkJPC9kZWxldGU+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotCTx0YXJnZXQgbmFtZT0ic3VpdGUxIj4KLSAgICAJPHByb3BlcnR5IGZpbGU9IiR7dGVzdFJvb3R9L3Rlc3RTZXJ2ZXIucHJvcGVydGllcyIvPgotCSAgICA8cHJvcGVydHkgbmFtZT0ianB0LWZvbGRlciIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9qcHRfZm9sZGVyIi8+Ci0JICAgIDxkZWxldGUgZGlyPSIke2pwdC1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotCi0JCTxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotCQkgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHtqcHQtZm9sZGVyfSIvPgotCQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLkVMSmF4YkNvcmVSZXNvdXJjZU1vZGVsVGVzdHMiLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSItRG9yZy5lY2xpcHNlLmpwdC5qYXhiLmphcj0ke3Rlc3REaXJ9LyR7anB0LWphdmF4LXhtbC1iaW5kLWphcn0gLURvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuamFyPSR7dGVzdERpcn0vJHtqcHQtZWNsaXBzZWxpbmstamFyfSIvPgotCQk8L2FudD4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InN1aXRlMiI+Ci0gICAgCTxwcm9wZXJ0eSBmaWxlPSIke3Rlc3RSb290fS90ZXN0U2VydmVyLnByb3BlcnRpZXMiLz4KLQkgICAgPHByb3BlcnR5IG5hbWU9ImpwdC1mb2xkZXIiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vanB0X2ZvbGRlciIvPgotCSAgICA8ZGVsZXRlIGRpcj0iJHtqcHQtZm9sZGVyfSIgcXVpZXQ9InRydWUiLz4KLQotCQk8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLQkJICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7anB0LWZvbGRlcn0iLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVMSmF4YkNvcmVDb250ZXh0TW9kZWxUZXN0cyIvPgotCQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9Ii1Eb3JnLmVjbGlwc2UuanB0LmpheGIuamFyPSR7dGVzdERpcn0vJHtqcHQtamF2YXgteG1sLWJpbmQtamFyfSAtRG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5qYXI9JHt0ZXN0RGlyfS8ke2pwdC1lY2xpcHNlbGluay1qYXJ9Ii8+Ci0JCTwvYW50PgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0JPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotCTwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLQk8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotCTwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCwgc3VpdGUxLCBzdWl0ZTIsIGNsZWFudXAiPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS8ucHJvamVjdCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxMjNjZS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PnJlbmFtZWQgdG8gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YTAzZjAuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PnJlbmFtZWQgdG8gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZTwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS8ucHJvamVjdCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgzZTlkZS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PnJlbmFtZWQgdG8gb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS8ucHJvamVjdCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYjVjMzEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYjU4MzcuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjEwOjQ3IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjY2ZhZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiOWYzMWUuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgSlBBIFN1cHBvcnQKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIEpQQSBTdXBwb3J0Ci0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYzNlYzUuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjIuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZSIgdmVyc2lvbj0iMy4yLjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlIiB2ZXJzaW9uPSIxLjIuMCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImphdmF4LnBlcnNpc3RlbmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC40LnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFudGxyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFzbSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMS5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuNC4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjQuMC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTllNWYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0IFNvdXJjZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNmY2Q2Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyoqLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDAwYmEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotCi08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjIwODJmLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NzgzOWYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MTMxOGYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydAotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIEVjbGlwc2VMaW5rIFN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjU5ZTVmLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydCBTb3VyY2VcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjZmNkNi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLmdpZixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8qKixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZiBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQwMGJhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLQotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYyMDgyZi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvLnByb2plY3QgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmM3MDAxLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzViODRhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMToxNyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNmRlNzQuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3Y2M3NC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIEpQQSBDb3JlIEpVbml0IFRlc3RzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi0jIFRPUkVWSUVXIC0gdXBkYXRlU2l0ZU5hbWUKLXVwZGF0ZVNpdGVOYW1lPVdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgRWNsaXBzZUxpbmsgSlBBIENvcmUgSlVuaXQgVGVzdHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5MmMyNC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMi4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBsaWNlbnNlLWZlYXR1cmU9Im9yZy5lY2xpcHNlLmxpY2Vuc2UiCi0gICAgICBsaWNlbnNlLWZlYXR1cmUtdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi50ZXN0cy5mZWF0dXJlIiB2ZXJzaW9uPSIxLjIuMCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2NWQzZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1mZWF0dXJlLnRlbXAuZm9sZGVyCi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZV8xLjAuMS4qCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWY0ODYyLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNjN2Q0Yi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjA5OjU5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTE2OThmLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZmVhZjYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBKUEEgU3VwcG9ydCBTREsKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIGFyY2hpdmVzIGZvciBEYWxpIEphdmEgUGVyc2lzdGVuY2UgLSBFY2xpcHNlTGluayBKUEEgU3VwcG9ydAotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NzZhNWEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMi4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBsaWNlbnNlLWZlYXR1cmU9Im9yZy5lY2xpcHNlLmxpY2Vuc2UiCi0gICAgICBsaWNlbnNlLWZlYXR1cmUtdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFkOTVkNy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiNTgzNy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTA6NDcgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2NjZmFkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU1OGFhOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKUEEgU3VwcG9ydAotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSlBBIFN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYzYTM3NC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjIuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZSIgdmVyc2lvbj0iMS4yLjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQuZmVhdHVyZSIgdmVyc2lvbj0iMS45LjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbGRldnRvb2xzLmZlYXR1cmUiIHZlcnNpb249IjEuOS4wIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZmVhdHVyZSIgdmVyc2lvbj0iMS45LjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmRiIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAucXVhbGlmaWVyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmxhbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4xLjAucXVhbGlmaWVyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS52ZWxvY2l0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjUuMC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuamRvbSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDI4OGFlLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFNvdXJjZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTk1MjliLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgZWNsaXBzZTMyLmdpZiwgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkMDBiYS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci0KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCi0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNzU5NGQuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYTNlZjAuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0N2FkNGYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjE2MzRkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFNvdXJjZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA4LCAyMDEwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTk1MjliLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgZWNsaXBzZTMyLmdpZiwgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkMDBiYS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci0KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCi0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNzU5NGQuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NjZmYTUuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNWI4NGEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjExOjE3IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE2ZGU3NC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjA2ZTExLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gQ29tbW9uIGFuZCBKUEEgSlVuaXQgVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLSMgVE9SRVZJRVcgLSB1cGRhdGVTaXRlTmFtZQotdXBkYXRlU2l0ZU5hbWU9V2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBDb21tb24gYW5kIEpQQSBKVW5pdCBUZXN0cwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzg0YWRkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4xLjEwMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udGVzdHMuZmVhdHVyZSIgdmVyc2lvbj0iMS4wLjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4N2FlYmUuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotZmVhdHVyZS50ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlXzEuMC4xLioKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MzNiNWUuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2M3ZDRiLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MDk6NTkgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNjEwYzMuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiZmVjYS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpQQSBTdXBwb3J0IFNESwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgYXJjaGl2ZXMgZm9yIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpQQSBTdXBwb3J0Ci0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAwNTkyZi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4yLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZG9jLmlzdiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWU3MGZhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmU8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ1MjNjZS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMzE1ZTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmc8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZmNTY1OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmU8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YTU1NzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZGIudWk8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDRjZmNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmRiPC9uYW1lPgotCTxjb21tZW50PnJlbmFtZWQgdG8gb3JnLmVjbGlwc2UuanB0LmpwYS5kYjwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2NzBmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNTU3NDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNC4xLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuaGVscDtidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cztidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Fib3V0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9hYm91dC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YTkxMzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Fib3V0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QWJvdXQgdGhpcyBjb250ZW50PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkFib3V0IHRoaXMgY29udGVudCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmMjk1IiBuYW1lPSJzdGhyZWYyOTUiPjwvYT4KLTxoMT5BYm91dCB0aGlzIGNvbnRlbnQ8L2gxPgotPHA+Tm92ZW1iZXIsIDIwMDk8L3A+Ci08YSBpZD0ic3RocmVmMjk2IiBuYW1lPSJzdGhyZWYyOTYiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+TGljZW5zZTwvcD4KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT48L2NvZGU+LiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPjwvY29kZT4uPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhODRlZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QWJvdXQgdGhpcyBjb250ZW50PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMTEtMTZUOTo1NjoyM1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJBYm91dCB0aGlzIGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMy4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+PGEgaWQ9InN0aHJlZjI5MCIgbmFtZT0ic3RocmVmMjkwIj48L2E+Ci08aDE+QWJvdXQgdGhpcyBjb250ZW50PC9oMT4KLTxwPk5vdmVtYmVyLCAyMDA5PC9wPgotPGEgaWQ9InN0aHJlZjI5MSIgbmFtZT0ic3RocmVmMjkxIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkxpY2Vuc2U8L3A+Ci08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+PC9jb2RlPi4gRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT48L2NvZGU+LjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNDIxMDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gY2hlYXRzaGVldHMvLFwKLSAgICAgICAgICAgICAgIGRjb21tb24vLFwKLSAgICAgICAgICAgICAgIGltZy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBjb25jZXB0X21hcHBpbmcuaHRtLFwKLSAgICAgICAgICAgICAgIGNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtLFwKLSAgICAgICAgICAgICAgIGNvbmNlcHRzLmh0bSxcCi0gICAgICAgICAgICAgICBjb25jZXB0czAwMS5odG0sXAotICAgICAgICAgICAgICAgY29uY2VwdHMwMDIuaHRtLFwKLSAgICAgICAgICAgICAgIGNvbmNlcHRzMDAzLmh0bSxcCi0gICAgICAgICAgICAgICBjb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgZ2V0dGluZ19zdGFydGVkLmh0bSxcCi0gICAgICAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQwMDEuaHRtLFwKLSAgICAgICAgICAgICAgIGdldHRpbmdfc3RhcnRlZDAwMi5odG0sXAotICAgICAgICAgICAgICAgZ2V0dGluZ19zdGFydGVkMDAzLmh0bSxcCi0gICAgICAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtLFwKLSAgICAgICAgICAgICAgIGluZGV4LnhtbCxcCi0gICAgICAgICAgICAgICBsZWdhbC5odG0sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICByZWZfZGV0YWlsc19vcm0uaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9qcGFfZmFjZXQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9uZXdfanBhX3Byb2plY3QuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9wcmltYXJ5X2tleS5odG0sXAotICAgICAgICAgICAgICAgcmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDEuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwMi5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDAzLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwNS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDA2Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDcuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwOC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDA5Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTAuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxMS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDEyLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTMuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxNC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDE1Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTYuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxNy5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDE4Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0sXAotICAgICAgICAgICAgICAgdGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0sXAotICAgICAgICAgICAgICAgdGFza19pbmhlcml0YW5jZS5odG0sXAotICAgICAgICAgICAgICAgdGFza19tYW5hZ2Vfb3JtLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0sXAotICAgICAgICAgICAgICAgdGFza19tYXBwaW5nLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrcy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDEuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDAyLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwMy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDQuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDA1Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwNi5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDcuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDA4Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwOS5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTAuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDExLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxMi5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTMuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDE0Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxNS5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTYuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDE3Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxOC5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTkuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDIwLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAyMS5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMjIuaHRtLFwKLSAgICAgICAgICAgICAgIHRpcHNfYW5kX3RyaWNrcy5odG0sXAotICAgICAgICAgICAgICAgdG9jLnhtbCxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcuaHRtLFwKLSAgICAgICAgICAgICAgIHdoYXRzX25ldzAwMS5odG0sXAotICAgICAgICAgICAgICAgd2hhdHNfbmV3MDAyLmh0bSxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcwMDMuaHRtLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTkuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyMC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDIxLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjIuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyMy5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDI0Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjUuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyNi5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDI3Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjguaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAzMC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDI5Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMzEuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAzMi5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMjMuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDI0Lmh0bSxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcwMDQuaHRtLFwKLSAgICAgICAgICAgICAgIHdoYXRzX25ldzAwNS5odG0sXAotICAgICAgICAgICAgICAgcmVmX3BlcnNpc3RlbmNlX3htbGxfZWRpdG9yLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfRW50aXR5Q2xhc3NQYWdlLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfRW50aXR5UHJvcGVydGllc1BhZ2UuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9hZGRfY29udmVydGVyLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfYXNzb2NpYXRpb25fY2FyZGluYWxpdHkuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9hc3NvY2lhdGlvbl90YWJsZS5odG0sXAotICAgICAgICAgICAgICAgcmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0sXAotICAgICAgICAgICAgICAgcmVmX2N1c3RvbWl6ZURlZmF1bHRFbnRpdHlHZW5lcmF0aW9uLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfZWNsaXBzZWxpbmtfbWFwcGluZ19maWxlLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfamF2YV9wYWdlLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfam9pbl9jb2x1bW5zLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbC5odG0sXAotICAgICAgICAgICAgICAgcmVmX3NlbGVjdFRhYmxlcy5odG0sXAotICAgICAgICAgICAgICAgcmVmX3NlbGVjdF9jYXNjYWRlX2RpYWxvZy5odG0sXAotICAgICAgICAgICAgICAgcmVmX3RhYmxlQXNzb2NpYXRpb25zLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZfY29uZmlndXJlX2pheGJfY2xhc3NfZ2VuZXJhdGlvbl9kaWFsb2cuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9qYXhiX3NjaGVtYV93aXphcmQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9zY2hlbWFfZnJvbV9jbGFzc2VzX3BhZ2UuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAzMy5odG0sXAotICAgICAgICAgICAgICAgdGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX2dlbmVyYXRpbmdfc2NoZW1hX2Zyb21fY2xhc3Nlcy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMjUuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDI2Lmh0bSxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcwMDYuaHRtCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NoZWF0c2hlZXRzL2FkZF9wZXJzaXN0ZW5jZS54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvYWRkX3BlcnNpc3RlbmNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiZWVkYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvYWRkX3BlcnNpc3RlbmNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2hlYXRzaGVldCB0aXRsZT0iQ3JlYXRlIGEgSlBBIFByb2plY3QiPgotICAgPGludHJvIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9yZWZlcmVuY2UvcmVmLWNoZWF0c2hlZXRzLmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgYXV0b21hdGljYWxseSBsYXVuY2ggd2l6YXJkcywgcGVyZm9ybSBhY3Rpb25zLCBhbmQgZ3VpZGUgeW91IHRocm91Z2ggdGhlIHN0ZXBzIHRvIGNyZWF0ZSBhIEpQQSBwcm9qZWN0LiAKLQotVG8gbGVhcm4gbW9yZSBhYm91dCB1c2luZyBjaGVhdCBzaGVldHMsIG9yIHRvIHNlZSBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNoZWF0IHNoZWV0cywgY2xpY2sgSGVscCAoPykuIAotVG8gc3RhcnQgd29yayB3b3JraW5nIG9uIHRoaXMgY2hlYXQgc2hlZXQgY2xpY2sgdGhlICZxdW90O0NsaWNrIHRvIEJlZ2luJnF1b3Q7IGJ1dHRvbiBiZWxvdy4gCi0KLUxldCZhcG9zO3MgZ2V0IHN0YXJ0ZWQhCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pbnRybz4KLSAgIDxpdGVtIHRpdGxlPSJTZXR1cCB0aGUgRW52aXJvbm1lbnQiIGRpYWxvZz0iZmFsc2UiIHNraXA9InRydWUiIGhyZWY9Ii9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuZG9jLnVzZXIvY19kYXRhYmFzZV9kZXZlbG9wbWVudF9zZXR1cC5odG1sIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFlvdXIgZW52aXJvbm1lbnQgbXVzdCBiZSBzZXQgdXAgYmVmb3JlIHlvdSBjYW4gcGVyZm9ybSB0aGUgc3RlcHMgaW4gdGhpcyBjaGVhdCBzaGVldC4gCi0KLUNyZWF0ZSBhIGRhdGFiYXNlIHByb2ZpbGUgYW5kIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotCi1UaGUgRGF0YWJhc2UgQ29ubmVjdGlvbiBkaWFsb2cgYXV0b21hdGljYWxseSBhcHBlYXJzIHdoZW4geW91IGNsaWNrIHRoZSAmcXVvdDtDbGljayB0byBQZXJmb3JtJnF1b3Q7IGJ1dHRvbi4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8Y29tbWFuZCBzZXJpYWxpemF0aW9uPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsdG9vbHMuc3FsZWRpdG9yLmF0dGFjaFByb2ZpbGVBY3Rpb24iIGNvbmZpcm09ImZhbHNlIj4KLSAgICAgIDwvY29tbWFuZD4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJDcmVhdGUgYSBKUEEgUHJvamVjdCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiIGhyZWY9Ii9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFVzZSB0aGUgTmV3IFByb2plY3QgV2l6YXJkIHRvIGNyZWF0ZSBhIEpQQSBwcm9qZWN0LiAKLVNlbGVjdCA8Yj5GaWxlLSZndDtOZXctJmd0O1Byb2plY3QuLi48L2I+IGFuZCBjaG9vc2UgPGI+SlBBLSZndDtKUEEgUHJvamVjdDwvYj4gaW4gdGhlIGxpc3QuIAotCi1PbiB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgd2l6YXJkLCBlbnRlciBhIHByb2plY3QgbmFtZSBhbmQgbG9jYXRpb24sIHNlbGVjdCB5b3VyIHRhcmdldCBydW50aW1lLCBhbmQgc2VsZWN0IGEgcHJlZGVmaW5lZCBwcm9qZWN0IGNvbmZpZ3VyYXRpb24uCi0KLUNsaWNrIDxiPk5leHQ8L2I+IHRvIGRpc3BsYXkgdGhlIG5leHQgcGFnZSBvZiB0aGUgd2l6YXJkLgotCi1UaGUgJnF1b3Q7TmV3IEpQQSBQcm9qZWN0JnF1b3Q7IHdpemFyZCBpcyBhdXRvbWF0aWNhbGx5IGRpc3BsYXllZCB3aGVuIHlvdSBjbGljayB0aGUgJnF1b3Q7Q2xpY2sgdG8gUGVyZm9ybSZxdW90OyBidXR0b24uCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGFjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuT3BlblByb2plY3RXaXphcmRBY3Rpb24iIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5qZHQudWkiIGNvbmZpcm09ImZhbHNlIj4KLSAgICAgIDwvYWN0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IlNlbGVjdCBQcm9qZWN0IEZhY2V0IiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSIgaHJlZj0iL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9waC1wcm9qZWN0cy5odG1sIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFVzZSB0aGUgUHJvamVjdCBGYWNldCBwYWdlIHRvIHNlbGVjdCBhIHByZWRlZmluZWQgcHJvamVjdCBjb25maWd1cmF0aW9uIG9yIHNwZWNpZmljIHNwZWNpZmljIGZhY2V0cyB0byBpbmNsdWRlIGluIHRoZSBwcm9qZWN0LiAKLQotQ2xpY2sgJnF1b3Q7TmV4dCZxdW90OyB0byBkaXNwbGF5IHRoZSBuZXh0IHBhZ2Ugb2YgdGhlIHdpemFyZC4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iU3BlY2lmeSB0aGUgSlBBIEZhY2V0IiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSIgaHJlZj0iL29yZy5lY2xpcHNlLmpkdC5kb2MudXNlci9yZWZfanBhX2ZhY2V0Lmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBVc2UgdGhlIEpQQSBGYWNldCBwYWdlIHRvIHNwZWNpZnkgdGhlIHRoZSB2ZW5kb3Itc3BlY2lmaWMgSlBBIHBsYXRmb3JtLCB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2UsIGFuZCB0aGUgc3BlY2lmaWMgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnkuIAotCi1Zb3UgY2FuIGFsc28gc3BlY2lmeSBpZiBEYWxpIHNob3VsZCBjcmVhdGUgYW4gb3JtLnhtbCBmaWxlLgotCi1JZiB5b3UgZG8gbm90IGhhdmUgYW4gYWN0aXZlIGRhdGFiYXNlIGNvbm5lY3Rpb24sIGNsaWNrIDxiPkFkZCBDb25uZWN0aW9uczwvYj4gdG8gY3JlYXRlIG9uZS4gCi0KLUlmIHlvdSBkbyBub3QgaGF2ZSBhIGRlZmluZWQgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnksIGNsaWNrIDxiPkNvbmZpZ3VyZSBkZWZhdWx0IEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5PC9iPiBvciA8Yj5Db25maWd1cmUgdXNlciBsaWJyYXJpZXM8L2I+IHRvIGRlZmluZSBvbmUuIAotCi1DbGljayA8Yj5GaW5pc2g8L2I+IHRvIGNvbXBsZXRlIHRoZSB3aXphcmQgYW5kIG9wZW4gdGhlIG9wZW4gdGhlIHByb2plY3QuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkZpbmlzaCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgQ29uZ3JhdHVsYXRpb25zISBZb3UgaGF2ZSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBhIEpQQSBwcm9qZWN0LiBDb21wbGV0ZSB0aGUgYWRkaXRpb25hbCBjaGVhdCBzaGVldHMgdG8gYWRkIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcyBhbmQgbWFwIHRob3NlIGVudGl0aWVzIHRvIGRhdGFiYXNlIHRhYmxlcy4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlX2VudGl0eS54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlX2VudGl0eS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NGU4YWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZV9lbnRpdHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjaGVhdHNoZWV0IHRpdGxlPSJDcmVhdGUgYSBQZXJzaXN0ZW50IEVudGl0eSI+Ci0JPGludHJvIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9yZWZlcmVuY2UvcmVmLWNoZWF0c2hlZXRzLmh0bSI+Ci0JCTxkZXNjcmlwdGlvbj4KLVRoaXMgY2hlYXQgc2hlZXQgd2lsbCBhdXRvbWF0aWNhbGx5IGxhdW5jaCB3aXphcmRzLCBwZXJmb3JtIGFjdGlvbnMsIGFuZCBndWlkZSB5b3UgdGhyb3VnaCB0aGUgc3RlcHMgdG8gYWRkIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB0byB5b3VyIEphdmEgcHJvamVjdC4gCi1UbyBsZWFybiBtb3JlIGFib3V0IHVzaW5nIGNoZWF0IHNoZWV0cyBvciB0byBzZWUgYSBsaXN0IG9mIGF2YWlsYWJsZSBjaGVhdCBzaGVldHMsIGNsaWNrIEhlbHAgKD8pLiAKLVRvIHN0YXJ0IHdvcmsgd29ya2luZyBvbiB0aGlzIGNoZWF0IHNoZWV0LCBjbGljayB0aGUgPGI+Q2xpY2sgdG8gQmVnaW48L2I+IGJ1dHRvbiBiZWxvdy4gCi1MZXQncyBnZXQgc3RhcnRlZCEKLSAgPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCTxpdGVtIHRpdGxlPSJDcmVhdGUgYSBKUEEgUHJvamVjdCIgc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj4KLVRvIGNyZWF0ZSBhIFBlcnNpc3RlbnQgZW50aXR5LCB5b3UgbXVzdCBjcmVhdGUgYSBKUEEgcHJvamVjdC4gSWYgeW91IGFscmVhZHkgaGF2ZSBhIEpQQSBwcm9qZWN0LCB5b3UgbWF5IHNraXAgdGhpcyBzdGVwIGJ5IGNsaWNraW5nIHRoZSAiQ2xpY2sgdG8gU2tpcCIgYnV0dG9uLgotSWYgbm90LCBzZWxlY3QgPGI+RmlsZS0+TmV3LT5Qcm9qZWN0Li4uPC9iPiBhbmQgY2hvb3NlIDxiPkpQQS0+SlBBIFByb2plY3Q8L2I+IGluIHRoZSBsaXN0LiBDb21wbGV0ZSBlYWNoIHBhZ2Ugb2YgdGhlIENyZWF0ZSBKUEEgUHJvamVjdCB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IEpQQSBwcm9qZWN0LgotICAgICAgPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9Ik9wZW4gdGhlIEpQQSBEZXZlbG9wbWVudCBQZXJzcGVjdGl2ZSIgc2tpcD0idHJ1ZSIgaHJlZj0iL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtIj4KLQkJPGFjdGlvbiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMiIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jaGVhdHNoZWV0cy5hY3Rpb25zLk9wZW5QZXJzcGVjdGl2ZSIgcGFyYW0xPSJvcmcuZWNsaXBzZS5qcHQudWkuUGVyc2lzdGVuY2VQZXJzcGVjdGl2ZSIvPgotCQk8ZGVzY3JpcHRpb24+Ci1XaGVuIHdvcmtpbmcgd2l0aCBKUEEgIHBlcnNpc3RlbmNlLCB5b3Ugc2hvdWxkIHVzZSB0aGUgUGVyc2lzdGVuY2UgcGVyc3BlY3RpdmUuIElmIHlvdSBhbHJlYWR5IGhhdmUgdGhlIFBlcnNpc3RlbmNlIHBlcnNwZWN0aXZlIGFjdGl2ZSwgeW91IG1heSBza2lwIHRoaXMgc3RlcCBieSBjbGlja2luZyB0aGUgIkNsaWNrIHRvIFNraXAiIGJ1dHRvbi4gCi1JZiBub3QsIHNlbGVjdCA8Yj5XaW5kb3ctPk9wZW4gUGVyc3BlY3RpdmUtPk90aGVyPC9iPiBpbiB0aGUgbWVudWJhciBhdCB0aGUgdG9wIG9mIHRoZSB3b3JrYmVuY2guIEluIHRoZSBTZWxlY3QgUGVyc3BlY3RpdmVzIGRpYWxvZywgc2VsZWN0IDxiPkpQQSBEZXZlbG9wbWVudDwvYj4gYW5kIGNsaWNrIE9LLiBUaGlzIHN0ZXAgY2hhbmdlcyB0aGUgcGVyc3BlY3RpdmUgdG8gc2V0IHVwIHRoZSBFY2xpcHNlIHdvcmtiZW5jaCBmb3IgSlBBIGRldmVsb3BtZW50LgotWW91IGNhbiBjbGljayB0aGUgIkNsaWNrIHRvIFBlcmZvcm0iIGJ1dHRvbiB0byBoYXZlIHRoZSAiUGVyc2lzdGVuY2UiIHBlcnNwZWN0aXZlIG9wZW5lZCBhdXRvbWF0aWNhbGx5LgotICAgPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkNyZWF0ZSBhIEphdmEgQ2xhc3MiPgotCQk8ZGVzY3JpcHRpb24+Ci1UaGUgbmV4dCBzdGVwIGlzIHRvIGNyZWF0ZSBhIG5ldyBKYXZhIGNsYXNzLiBJbiB0aGUgbWFpbiB0b29sYmFyIGFnYWluLCBjbGljayBvbiA8Yj5OZXcgSmF2YSBDbGFzczwvYj4gYnV0dG9uIChvciB0aGUgbGluayBiZWxvdykuCi1UaGUgSmF2YSBlZGl0b3Igd2lsbCBhdXRvbWF0aWNhbGx5IG9wZW4gc2hvd2luZyB5b3VyIG5ldyBjbGFzcy4gICAgICAKLSAgICAgPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkNyZWF0ZSBhIFBlcnNpc3RlbnQgRW50aXR5Ij4KLQkJPGRlc2NyaXB0aW9uPgotRmluYWxseSB3ZSB3aWxsIG1ha2UgdGhlIEphdmEgY2xhc3MgYSBwZXJzaXN0ZW50IGVudGl0eS4KLUluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcgc2VsZWN0IHRoZSBKYXZhIGNsYXNzLiAKLUluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCB1c2UgdGhlICJNYXAgQXMiIGZpZWxkIHRvIHNlbGVjdCA8Yj5FbnRpdHk8L2I+LiBEYWxpIGF1dG9tYXRpY2FsbHkgYWRkcyB0aGUgQEVudGl0eSBhbm5vdGF0aW9uIHRvIHRoZSBjbGFzcyBpbiB0aGUgSmF2YSBlZGl0b3IuIAotVXNlIHRoZSBUYWJsZSwgQ2F0YWxvZywgYW5kIFNjaGVtYSBmaWVsZHMgdG8gYXNzb2NpYXRlIHRoZSBlbnRpdHkgd2l0aCBhIHNwZWNpZmljIHRhYmxlIGluIHRoZSBkYXRhYmFzZS4KLSAgICAgPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkZpbmlzaCI+Ci0JCTxkZXNjcmlwdGlvbj4KLUNvbmdyYXR1bGF0aW9ucyEgWW91IGhhdmUgc3VjY2Vzc2Z1bGx5IGFkZGVkIGEgSlBBIGVudGl0eSB0byB5b3VyIEpQQSBwcm9qZWN0LiBDb21wbGV0ZSB0aGUgYWRkaXRpb25hbCBjaGVhdCBzaGVldHMgdG8gbWFwIHRoZSBlbnRpdHkncyBmaWVsZHMgdG8gZGF0YWJhc2UgdGFibGVzLgotICA8L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLTwvY2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9tYXBfZW50aXR5LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9tYXBfZW50aXR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzMDdmMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvbWFwX2VudGl0eS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNoZWF0c2hlZXQgdGl0bGU9Ik1hcCBhIEphdmEgUGVyc2lzdGVudCBFbnRpdHkiPgotICAgPGludHJvIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9yZWZlcmVuY2UvcmVmLWNoZWF0c2hlZXRzLmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgYXV0b21hdGljYWxseSBsYXVuY2ggd2l6YXJkcywgcGVyZm9ybSBhY3Rpb25zLCBhbmQgZ3VpZGUgeW91IHRocm91Z2ggdGhlIHN0ZXBzIHRvIG1hcCB0aGUgZmllbGRzIG9mIGEgSlBBIGVudGl0eSBlbnRpdHkgdG8geW91ciBkYXRhYmFzZS4KLQotVG8gbGVhcm4gbW9yZSBhYm91dCB1c2luZyBjaGVhdCBzaGVldHMgb3IgdG8gc2VlIGEgbGlzdCBvZiBhdmFpbGFibGUgY2hlYXQgc2hlZXRzLCBjbGljayBIZWxwICg/KS4gCi1UbyBzdGFydCB3b3JrIHdvcmtpbmcgb24gdGhpcyBjaGVhdCBzaGVldCwgY2xpY2sgdGhlICZxdW90O0NsaWNrIHRvIEJlZ2luJnF1b3Q7IGJ1dHRvbiBiZWxvdy4gCi0KLUxldCZhcG9zO3MgZ2V0IHN0YXJ0ZWQhCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pbnRybz4KLSAgIDxpdGVtIHRpdGxlPSJTZXR1cCB0aGUgRW52aXJvbm1lbnQiIGRpYWxvZz0iZmFsc2UiIHNraXA9InRydWUiIGhyZWY9Ii9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuZG9jLnVzZXIvY19kYXRhYmFzZV9kZXZlbG9wbWVudF9zZXR1cC5odG1sIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFlvdXIgZW52aXJvbm1lbnQgbXVzdCBiZSBzZXQgdXAgYmVmb3JlIHlvdSBjYW4gcGVyZm9ybSB0aGUgc3RlcHMgaW4gdGhpcyBjaGVhdCBzaGVldC4gCi0KLUNyZWF0ZSBhIGRhdGFiYXNlIHByb2ZpbGUgYW5kIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotCi1JZiB5b3UgYWxyZWFkeSBoYXZlIChhbmQgYXJlIGNvbm5lY3RlZCB0bykgYSBkYXRhYmFzZSBjb25uZWN0aW9uLCB5b3UgIG1heSBza2lwIHRoaXMgc3RlcCBieSBjbGlja2luZyB0aGUgJnF1b3Q7Q2xpY2sgdG8gU2tpcCZxdW90OyBidXR0b24uCi0KLVRoZSBEYXRhYmFzZSBDb25uZWN0aW9uIGRpYWxvZyBhdXRvbWF0aWNhbGx5IGFwcGVhcnMgd2hlbiB5b3UgY2xpY2sgdGhlICZxdW90O0NsaWNrIHRvIFBlcmZvcm0mcXVvdDsgYnV0dG9uLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxjb21tYW5kIHNlcmlhbGl6YXRpb249Im9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWx0b29scy5zcWxlZGl0b3IuYXR0YWNoUHJvZmlsZUFjdGlvbiIgY29uZmlybT0iZmFsc2UiPgotICAgICAgPC9jb21tYW5kPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkNyZWF0ZSBhIEpQQSBQcm9qZWN0IiBkaWFsb2c9ImZhbHNlIiBza2lwPSJ0cnVlIiBocmVmPSIvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBVc2UgdGhlIE5ldyBQcm9qZWN0IFdpemFyZCB0byBjcmVhdGUgYSBKUEEgcHJvamVjdC4gCi1TZWxlY3QgPGI+RmlsZS0mZ3Q7TmV3LSZndDtQcm9qZWN0Li4uPC9iPiBhbmQgY2hvb3NlIDxiPkpQQS0mZ3Q7SlBBIFByb2plY3Q8L2I+IGluIHRoZSBsaXN0LiAKLQotQ29tcGxldGUgZWFjaCBwYWdlIG9mIHRoZSB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IEpQQSBwcm9qZWN0LgotCi1UaGUgJnF1b3Q7TmV3IEpQQSBQcm9qZWN0JnF1b3Q7IHdpemFyZCBpcyBhdXRvbWF0aWNhbGx5IGRpc3BsYXllZCB3aGVuIHlvdSBjbGljayB0aGUgJnF1b3Q7Q2xpY2sgdG8gUGVyZm9ybSZxdW90OyBidXR0b24uCi0KLUlmIHlvdSBhbHJlYWR5IGhhdmUgYSBKUEEgcHJvamVjdCwgeW91ICBtYXkgc2tpcCB0aGlzIHN0ZXAgYnkgY2xpY2tpbmcgdGhlICZxdW90O0NsaWNrIHRvIFNraXAmcXVvdDsgYnV0dG9uLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxhY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLk9wZW5Qcm9qZWN0V2l6YXJkQWN0aW9uIiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UuamR0LnVpIiBjb25maXJtPSJmYWxzZSI+Ci0gICAgICA8L2FjdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJPcGVuIHRoZSBKUEEgRGV2ZWxvcG1lbnQgUGVyc3BlY3RpdmUiIGRpYWxvZz0iZmFsc2UiIHNraXA9InRydWUiIGhyZWY9Ii9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBXaGVuIHdvcmtpbmcgd2l0aCBKUEEgIHBlcnNpc3RlbmNlLCB5b3Ugc2hvdWxkIHVzZSB0aGUgUGVyc2lzdGVuY2UgcGVyc3BlY3RpdmUuIElmIHlvdSBhbHJlYWR5IGhhdmUgdGhlIFBlcnNpc3RlbmNlIHBlcnNwZWN0aXZlIGFjdGl2ZSwgeW91IG1heSBza2lwIHRoaXMgc3RlcCBieSBjbGlja2luZyB0aGUgJnF1b3Q7Q2xpY2sgdG8gU2tpcCZxdW90OyBidXR0b24uIAotSWYgbm90LCBzZWxlY3QgPGI+V2luZG93LSZndDtPcGVuIFBlcnNwZWN0aXZlLSZndDtPdGhlcjwvYj4gaW4gdGhlIG1lbnViYXIgYXQgdGhlIHRvcCBvZiB0aGUgd29ya2JlbmNoLiBJbiB0aGUgU2VsZWN0IFBlcnNwZWN0aXZlcyBkaWFsb2csIHNlbGVjdCA8Yj5KUEEgRGV2ZWxvcG1lbnQ8L2I+IGFuZCBjbGljayBPSy4gVGhpcyBzdGVwIGNoYW5nZXMgdGhlIHBlcnNwZWN0aXZlIHRvIHNldCB1cCB0aGUgRWNsaXBzZSB3b3JrYmVuY2ggZm9yIEpQQSBkZXZlbG9wbWVudC4KLVlvdSBjYW4gY2xpY2sgdGhlICZxdW90O0NsaWNrIHRvIFBlcmZvcm0mcXVvdDsgYnV0dG9uIHRvIGhhdmUgdGhlICZxdW90O1BlcnNpc3RlbmNlJnF1b3Q7IHBlcnNwZWN0aXZlIG9wZW5lZCBhdXRvbWF0aWNhbGx5LgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxhY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNoZWF0c2hlZXRzLmFjdGlvbnMuT3BlblBlcnNwZWN0aXZlIiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMiIGNvbmZpcm09ImZhbHNlIiBwYXJhbTE9Im9yZy5lY2xpcHNlLmpwdC51aS5QZXJzaXN0ZW5jZVBlcnNwZWN0aXZlIj4KLSAgICAgIDwvYWN0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkNyZWF0ZSBhIEphdmEgQ2xhc3MiIGRpYWxvZz0iZmFsc2UiIHNraXA9ImZhbHNlIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFRoZSBuZXh0IHN0ZXAgaXMgdG8gY3JlYXRlIGEgbmV3IEphdmEgY2xhc3MuIEluIHRoZSBtYWluIHRvb2xiYXIgYWdhaW4sIGNsaWNrIG9uIDxiPk5ldyBKYXZhIENsYXNzPC9iPiBidXR0b24gKG9yIHRoZSBsaW5rIGJlbG93KS4KLVRoZSBKYXZhIGVkaXRvciB3aWxsIGF1dG9tYXRpY2FsbHkgb3BlbiBzaG93aW5nIHlvdXIgbmV3IGNsYXNzLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJDcmVhdGUgYSBQZXJzaXN0ZW50IEVudGl0eSIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgRmluYWxseSB3ZSB3aWxsIG1ha2UgdGhlIEphdmEgY2xhc3MgYSBwZXJzaXN0ZW50IGVudGl0eS4KLUluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcgc2VsZWN0IHRoZSBKYXZhIGNsYXNzLiAKLUluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCB1c2UgdGhlICZxdW90O01hcCBBcyZxdW90OyBmaWVsZCB0byBzZWxlY3QgPGI+RW50aXR5PC9iPi4gRGFsaSBhdXRvbWF0aWNhbGx5IGFkZHMgdGhlIEBFbnRpdHkgYW5ub3RhdGlvbiB0byB0aGUgY2xhc3MgaW4gdGhlIEphdmEgZWRpdG9yLiAKLVVzZSB0aGUgVGFibGUsIENhdGFsb2csIGFuZCBTY2hlbWEgZmllbGRzIHRvIGFzc29jaWF0ZSB0aGUgZW50aXR5IHdpdGggYSBzcGVjaWZpYyB0YWJsZSBpbiB0aGUgZGF0YWJhc2UuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkFkZCBGaWVsZHMgdG8gdGhlIENsYXNzIiBkaWFsb2c9ImZhbHNlIiBza2lwPSJ0cnVlIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIE5vdyB5b3Ugd2lsbCBhZGQgc29tZSBmaWVsZHMgdG8gdGhlIGVudGl0eSB0byBtYXAgdG8gcm93cyBpbiB0aGUgZGF0YWJhc2UgdGFibGUuICAgCi0KLUlmIHlvdXIgcGVyc2lzdGVudCBlbnRpdHkgYWxyZWFkeSBoYXMgZmllbGRzIHRvIG1hcCwgeW91IG1heSBza2lwIHRoaXMgc3RlcCBieSBjbGlja2luZyB0aGUgJnF1b3Q7Q2xpY2sgdG8gU2tpcCZxdW90OyBidXR0b24uIElmIG5vdCwgdXNlIHRoZSBKYXZhIGVkaXRvciB0byBhZGQgZmllbGRzIHRvIHRoZSBlbnRpdHkuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGFjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY2hlYXRzaGVldHMuYWN0aW9ucy5PcGVuUGVyc3BlY3RpdmUiIHBsdWdpbklkPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cyIgY29uZmlybT0iZmFsc2UiIHBhcmFtMT0ib3JnLmVjbGlwc2UuZGFsaS51aS5QZXJzaXN0ZW5jZVBlcnNwZWN0aXZlIj4KLSAgICAgIDwvYWN0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkNyZWF0ZSB0aGUgTWFwcGluZyIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiIGhyZWY9Ii9vcmcuZWNsaXBzZS5kYWxpLmRvYy51c2VyL3JlZl9lbnRpdHlfcGFnZS5odG0iPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgTm93IHlvdSBhcmUgcmVhZHkgdG8gbWFwIHRoZSBlbnRpdHkgZmllbGRzIHRvIGNvbHVtbnMgaW4gdGhlIGRhdGFiYXNlIHRhYmxlLiBJbiB0aGUgUGFja2FnZSBFeHBsb3Jlciwgc2VsZWN0IHRoZSBKYXZhIGNsYXNzLiAKLQotSW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldywgZXhwYW5kIHRoZSBwZXJzaXN0ZW50IGVudGl0eSB0byBkaXNwbGF5IHRoZSBmaWVsZHMuIFNlbGVjdCBhIGZpZWxkLiAKLQotVGhlIEpQQSBEZXRhaWxzIHZpZXcgZGlzcGxheXMgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgZmllbGQuIFVzZSB0aGUgTWFwIEFzIGZpZWxkIHRvIHNlbGVjdCB0aGUgQmFzaWMgbWFwcGluZy4gVXNlIHRoZSBDb2x1bW4gZmllbGQgdG8gc2VsZWN0IGEgY29sdW1uIGZyb20gdGhlIGRhdGFiYXNlIHRhYmxlLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxhY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNoZWF0c2hlZXRzLmFjdGlvbnMuT3BlblBlcnNwZWN0aXZlIiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMiIGNvbmZpcm09ImZhbHNlIiBwYXJhbTE9Im9yZy5lY2xpcHNlLmRhbGkudWkuUGVyc2lzdGVuY2VQZXJzcGVjdGl2ZSI+Ci0gICAgICA8L2FjdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJGaW5pc2giIGRpYWxvZz0iZmFsc2UiIHNraXA9ImZhbHNlIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIENvbmdyYXR1bGF0aW9ucyEgWW91IGhhdmUgc3VjY2Vzc2Z1bGx5IG1hcHBlZCB0aGUgZmllbGRzIGZyb20gYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHRvIGEgY29sdW1uIGluIGEgZGF0YWJhc2UgdGFibGUuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotPC9jaGVhdHNoZWV0PgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRfbWFwcGluZy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9tYXBwaW5nLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmN2Q5Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9tYXBwaW5nLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCQkRKRkkiIG5hbWU9IkJBQkJESkZJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPgotPGgxPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIxIiBuYW1lPSJzdGhyZWYyMSI+PC9hPjxhIGlkPSJzdGhyZWYyMiIgbmFtZT0ic3RocmVmMjIiPjwvYT5UaGUgRGFsaSBPUiAob2JqZWN0LXJlbGF0aW9uYWwpIE1hcHBpbmcgVG9vbCBhbGxvd3MgeW91IHRvIGRlc2NyaWJlIGhvdyB5b3VyIGVudGl0eSBvYmplY3RzIDxzcGFuIGNsYXNzPSJpdGFsaWMiPm1hcDwvc3Bhbj4gdG8gdGhlIGRhdGEgc291cmNlIChvciBvdGhlciBvYmplY3RzKS4gVGhpcyBhcHByb2FjaCBpc29sYXRlcyBwZXJzaXN0ZW5jZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvYmplY3QgbW9kZWwmbmRhc2g7ZGV2ZWxvcGVycyBhcmUgZnJlZSB0byBkZXNpZ24gdGhlaXIgaWRlYWwgb2JqZWN0IG1vZGVsLCBhbmQgREJBcyBhcmUgZnJlZSB0byBkZXNpZ24gdGhlaXIgaWRlYWwgc2NoZW1hLjwvcD4KLTxwPlRoZXNlIG1hcHBpbmdzIHRyYW5zZm9ybSBhbiBvYmplY3QgZGF0YSBtZW1iZXIgdHlwZSB0byBhIGNvcnJlc3BvbmRpbmcgcmVsYXRpb25hbCBkYXRhYmFzZSBkYXRhIHNvdXJjZSByZXByZXNlbnRhdGlvbi4gVGhlc2UgT1IgbWFwcGluZ3MgY2FuIGFsc28gdHJhbnNmb3JtIG9iamVjdCBkYXRhIG1lbWJlcnMgdGhhdCByZWZlcmVuY2Ugb3RoZXIgZG9tYWluIG9iamVjdHMgc3RvcmVkIGluIG90aGVyIHRhYmxlcyBpbiB0aGUgZGF0YWJhc2UgYW5kIGFyZSByZWxhdGVkIHRocm91Z2ggZm9yZWlnbiBrZXlzLjwvcD4KLTxwPllvdSBjYW4gdXNlIHRoZXNlIG1hcHBpbmdzIHRvIG1hcCBzaW1wbGUgZGF0YSB0eXBlcyBpbmNsdWRpbmcgcHJpbWl0aXZlcyAoc3VjaCBhcyA8Y29kZT5pbnQ8L2NvZGU+KSwgSkRLIGNsYXNzZXMgKHN1Y2ggYXMgPGNvZGU+U3RyaW5nPC9jb2RlPiksIGFuZCBsYXJnZSBvYmplY3QgKExPQikgdmFsdWVzLiBZb3UgY2FuIGFsc28gdXNlIHRoZW0gdG8gdHJhbnNmb3JtIG9iamVjdCBkYXRhIG1lbWJlcnMgdGhhdCByZWZlcmVuY2Ugb3RoZXIgZG9tYWluIG9iamVjdHMgYnkgd2F5IG9mIGFzc29jaWF0aW9uIHdoZXJlIGRhdGEgc291cmNlIHJlcHJlc2VudGF0aW9ucyByZXF1aXJlIG9iamVjdCBpZGVudGl0eSBtYWludGVuYW5jZSAoc3VjaCBhcyBzZXF1ZW5jaW5nIGFuZCBiYWNrIHJlZmVyZW5jZXMpIGFuZCBwb3NzZXNzIHZhcmlvdXMgdHlwZXMgb2YgbXVsdGlwbGljaXR5IGFuZCBuYXZpZ2FiaWxpdHkuIFRoZSBhcHByb3ByaWF0ZSBtYXBwaW5nIGNsYXNzIGlzIGNob3NlbiBwcmltYXJpbHkgYnkgdGhlIGNhcmRpbmFsaXR5IG9mIHRoZSByZWxhdGlvbnNoaXAuPC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjN2Y4MGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRfcGVyc2lzdGVuY2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iVW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCQ0FISUMiIG5hbWU9IkJBQkNBSElDIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPgotPGgxPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTkiIG5hbWU9InN0aHJlZjE5Ij48L2E+PHNwYW4gY2xhc3M9Iml0YWxpYyI+UGVyc2lzdGVuY2U8L3NwYW4+IHJlZmVycyB0byB0aGUgYWJpbGl0eSB0byBzdG9yZSBvYmplY3RzIGluIGEgZGF0YWJhc2UgYW5kIHVzZSB0aG9zZSBvYmplY3RzIHdpdGggdHJhbnNhY3Rpb25hbCBpbnRlZ3JpdHkuIEluIGEgSjJFRSBhcHBsaWNhdGlvbiwgZGF0YSBpcyB0eXBpY2FsbHkgc3RvcmVkIGFuZCBwZXJzaXN0ZWQgaW4gdGhlIGRhdGEgdGllciwgaW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlLjwvcD4KLTxwPjxhIGlkPSJzdGhyZWYyMCIgbmFtZT0ic3RocmVmMjAiPjwvYT48c3BhbiBjbGFzcz0iaXRhbGljIj5FbnRpdHkgYmVhbnM8L3NwYW4+IGFyZSBlbnRlcnByaXNlIGJlYW5zIHRoYXQgY29udGFpbiBwZXJzaXN0ZW50IGRhdGEgYW5kIHRoYXQgY2FuIGJlIHNhdmVkIGluIHZhcmlvdXMgcGVyc2lzdGVudCBkYXRhIHN0b3Jlcy4gVGhlIGVudGl0eSBiZWFucyByZXByZXNlbnQgZGF0YSBmcm9tIGEgZGF0YWJhc2U7IGVhY2ggZW50aXR5IGJlYW4gY2FycmllcyBpdHMgb3duIGlkZW50aXR5LiBFbnRpdHkgYmVhbnMgY2FuIGJlIGRlcGxveWVkIHVzaW5nIDxzcGFuIGNsYXNzPSJpdGFsaWMiPmFwcGxpY2F0aW9uLW1hbmFnZWQgcGVyc2lzdGVuY2U8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJpdGFsaWMiPmNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlPC9zcGFuPi48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ExNDBiNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Db25jZXB0czwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSIgQ29uY2VwdHMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJzdGhyZWYxOCIgbmFtZT0ic3RocmVmMTgiPjwvYT48L3A+Ci08aDE+Q29uY2VwdHM8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGFuIG92ZXJ2aWV3IG9mIGNvbmNlcHRzIHlvdSBzaG91bGQgYmUgZmFtaWxpYXIgd2l0aCB3aGVuIHVzaW5nIERhbGkgdG8gY3JlYXRlIG1hcHBpbmdzIGZvciBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMuPC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5JbiBhZGRpdGlvbiB0byB0aGVzZSBzZWN0aW9ucywgeW91IHNob3VsZCByZXZpZXcgdGhlIGZvbGxvd2luZyByZXNvdXJjZXMgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb246PC9wPgotPHVsPgotPGxpPgotPHA+RWNsaXBzZSBEYWxpIHByb2plY3Q6IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvZGFsaSI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9kYWxpPC9hPjwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gcHJvamVjdDogPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29sczwvYT48L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPkpTUiAyMjAgRUpCIDMuMCBzcGVjaWZpY2F0aW9uOiA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmpjcC5vcmcvZW4vanNyL2RldGFpbD9pZD0yMjAiPmh0dHA6Ly93d3cuamNwLm9yZy9lbi9qc3IvZGV0YWlsP2lkPTIyMDwvYT48L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPkVjbGlwc2VMaW5rIHByb2plY3Q6IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbms8L2E+PC9jb2RlPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTA0ZGExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJVbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEkiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJCR0ZKRyIgbmFtZT0iQkFCQkdGSkciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+Ci08aDE+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9oMT4KLTxwPlRoZSBKYXZhIDIgRW50ZXJwcmlzZSBFZGl0aW9uKEoyRUUpIEVudGVycHJpc2UgSmF2YUJlYW5zIChFSkIpIGFyZSBhIGNvbXBvbmVudCBhcmNoaXRlY3R1cmUgdGhhdCB5b3UgdXNlIHRvIGRldmVsb3AgYW5kIGRlcGxveSBvYmplY3Qtb3JpZW50ZWQsIGRpc3RyaWJ1dGVkLCBlbnRlcnByaXNlLXNjYWxlIGFwcGxpY2F0aW9ucy4gQW4gYXBwbGljYXRpb24gd3JpdHRlbiBhY2NvcmRpbmcgdG8gdGhlIEVudGVycHJpc2UgSmF2YUJlYW5zIGFyY2hpdGVjdHVyZSBpcyBzY2FsYWJsZSwgdHJhbnNhY3Rpb25hbCwgYW5kIHNlY3VyZS48L3A+Ci08cD5UaGUgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBpbXByb3ZlcyB0aGUgRUpCIGFyY2hpdGVjdHVyZSBieSByZWR1Y2luZyBpdHMgY29tcGxleGl0eSB0aHJvdWdoIHRoZSB1c2Ugb2YgbWV0YWRhdGEgKGFubm90YXRpb25zKSBhbmQgc3BlY2lmeWluZyBwcm9ncmFtbWF0aWMgZGVmYXVsdHMgb2YgdGhhdCBtZXRhZGF0YS48L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmMWU0My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iVGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0hESEFHSUgiIG5hbWU9IkNIREhBR0lIIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT48YSBpZD0ic3RocmVmMjMiIG5hbWU9InN0aHJlZjIzIj48L2E+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9oMT4KLTxwPlRoZSBKUEEgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyB0aGUgdXNlIG9mIGEgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIGZvciBkZXBsb3ltZW50LiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZGF0YWJhc2UgYW5kIGVudGl0eSBtYW5hZ2VyIG9wdGlvbnMsIGFuZCBtYXkgY29udGFpbiBtb3JlIHRoYW4gb25lIHBlcnNpc3RlbmNlIHVuaXQuIFRvIGVuYWJsZSB5b3UgdG8gZWFzaWx5IGVkaXQgdGhpcyBpbmZvcm1hdGlvbiwgRGFsaSBwcm92aWRlcyB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbGxfZWRpdG9yLmh0bSNDSUFDQ0hJRCI+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvYT4uIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZSBFY2xpcHNlIFhNTCBFZGl0b3IgdG8gY3JlYXRlIGFuZCBtYWludGFpbiB0aGlzIGluZm9ybWF0aW9uLiBTZWUgPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj4iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotVG8gd29yayB3aXRoIG11bHRpcGxlIHBlcnNpc3RlbmNlIHVuaXRzLCBjb21tZW50IG91dCBhbGwgYnV0IG9uZSBwZXJzaXN0ZW5jZSB1bml0IGluIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljODg3YTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+VGhlIG9ybS54bWwgZmlsZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJUaGUgb3JtLnhtbCBmaWxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0hEQklKQUMiIG5hbWU9IkNIREJJSkFDIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT48YSBpZD0ic3RocmVmMjQiIG5hbWU9InN0aHJlZjI0Ij48L2E+VGhlIG9ybS54bWwgZmlsZTwvaDE+Ci08cD5BbHRob3VnaCB0aGUgSlBBIHNwZWNpZmljYXRpb24gZW1waGFzaXplcyB0aGUgdXNlIG9mIGFubm90YXRpb25zIHRvIHNwZWNpZnkgcGVyc2lzdGVuY2UsIHlvdSBjYW4gYWxzbyB1c2UgdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgdG8gc3RvcmUgdGhpcyBtZXRhZGF0YS4gRGFsaSBlbmFibGVzIHlvdSB0byBjcmVhdGUgYSBzdHViIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgZm9yIGEgSlBBIHByb2plY3QgdXNpbmcgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAwMi5odG0jQ0lBSUpDQ0UiPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+LiBTZWUgPGEgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSNDSUhER0RDRCI+Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoZSBtZXRhZGF0YSBtdXN0IG1hdGNoIHRoZSBYU0Qgc3BlY2lmaWNhdGlvbiBvZiB5b3VyIHNlbGVjdGVkIEpQQSBpbXBsZW1lbnRhdGlvbi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTxwPkRhbGkgcHJvdmlkZXMgY29tcHJlaGVuc2l2ZSBzdXBwb3J0IGZvciBjb25maWd1cmluZyBYTUwgbWFwcGluZyBmaWxlcyB0aHJvdWdoIHRoZSA8YSBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtI0NBQ0dER0hDIj5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L2E+IHRoYXQgaXMgbmVhcmx5IGlkZW50aWNhbCB0byB0aGUgYW5ub3RhdGlvbi1iYXNlZCBjb25maWd1cmF0aW9uIGluIHRoZSBKYXZhIHNvdXJjZS4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBhbHNvIHVzZSB0aGUgRWNsaXBzZSBYTUwgRWRpdG9yIHRvIGNyZWF0ZSBhbmQgbWFpbnRhaW4gdGhlIG1ldGFkYXRhIGluZm9ybWF0aW9uIGluIDxjb2RlPm9ybS54bWw8L2NvZGU+LjwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jQ0lIREdEQ0QiPk1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPjxiciAvPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbnRleHRzLnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YTY2MWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPGNvbnRleHRzPgotCTxjb250ZXh0IGlkPSJlbnRpdHlfYWNjZXNzVHlwZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGhvdyB0aGUgdmFyaWFibGUgaXMgYWNjZXNzZWQ6IFByb3BlcnR5IChkZWZhdWx0KSBvciBGaWVsZC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X25hbWUiPgotCQk8ZGVzY3JpcHRpb24+VGhlIG5hbWUgb2YgdGhpcyBlbnRpdHkuIEJ5IGRlZmF1bHQsIHRoZSBjbGFzcyBuYW1lIGlzIHVzZWQgYXMgdGhlIGVudGl0eSBuYW1lLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfdGFibGUiPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIHRhYmxlIGFzc2lnbmVkIHRvIHRoaXMgZW50aXR5LiBCeSBkZWZhdWx0LCB0aGUgY2xhc3MgbmFtZSBpcyB1c2VkIGFzIHRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2F0dHJpYnV0ZU92ZXJyaWRlcyI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGEgcHJvcGVydHkgb3IgZmllbGQgdG8gYmUgb3ZlcnJpZGRlbiAoZnJvbSB0aGUgZGVmYXVsdCBtYXBwaW5ncykuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9hdHRyaWJ1dGVPdmVycmlkZXNOYW1lIj4KLQkJPGRlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2F0dHJpYnV0ZU92ZXJyaWRlc0NvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY29sdW1uIHRoYXQgb3ZlcnJpZGVzIGEgcHJvcGVydHkgb3IgZmllbGQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9hdHRyaWJ1dGVPdmVycmlkZXNJbnNlcnRhYmxlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZmllcyBpZiB0aGUgY29sdW1uIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiBTUUwgSU5TRVJUIHN0YXRlbWVudHMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9hdHRyaWJ1dGVPdmVycmlkZXNVcGRhdGFibGUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIGlmIHRoZSBjb2x1bW4gaXMgYWx3YXlzIGluY2x1ZGVkIGluIFNRTCBVUERBVEUgc3RhdGVtZW50cy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19tYXBBcyI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGhvdyB0aGlzIGF0dHJpYnV0ZSBtYXBzIHRvIHRoZSBkYXRhYmFzZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2NvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY29sdW1uIHRoYXQgY29udGFpbnMgdGhlIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfY29sdW1uVGFibGUiPgotCQk8ZGVzY3JpcHRpb24+TmFtZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0ZWQgY29sdW1uLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfY29sdW1uSW5zZXJ0YWJsZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZpZXMgaWYgdGhlIGNvbHVtbiBpcyBhbHdheXMgaW5jbHVkZWQgaW4gU1FMIElOU0VSVCBzdGF0ZW1lbnRzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfY29sdW1uVXBkYXRhYmxlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZmllcyBpZiB0aGUgY29sdW1uIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiBTUUwgVVBEQVRFIHN0YXRlbWVudHMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19mZXRjaFR5cGUiPgotCQk8ZGVzY3JpcHRpb24+RGVmaW5lcyBob3cgZGF0YSBpcyBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2U6IEVhZ2VyIChkZWZhdWx0KSBvciBMYXp5PC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19vcHRpb25hbCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZpZXMgaWYgdGhpcyBmaWVsZCBpcyBjYW4gYmUgbnVsbC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2dlbmVyYXRlZFZhbHVlU3RyYXRlZ3kiPgotCQk8ZGVzY3JpcHRpb24+RGV0ZXJtaW5lcyBob3cgdGhlIHByaW1hcnkga2V5IGlzIGdlbmVyYXRlZDogQXV0byAoZGVmYXVsdCksIFNlcXVlbmNlLCBJZGVudGl0eSwgb3IgVGFibGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19nZW5lcmF0ZWRWYWx1ZUdlbmVyYXRvck5hbWUiPgotCQk8ZGVzY3JpcHRpb24+VW5pcXVlIG5hbWUgb2YgdGhlIGdlbmVyYXRvci48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3RhcmdldEVudGl0eSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZW50aXR5IHRvIHdoaWNoIHRoaXMgYXR0cmlidXRlIGlzIG1hcHBlZC4gPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19jYXNjYWRlVHlwZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHdoaWNoIG9wZXJhdGlvbnMgYXJlIHByb3BhZ2F0ZWQgdGhyb3VnaG91dCB0aGUgZW50aXR5OiBBbGwsIFBlcnNpc3QsIE1lcmdlLCBvciBNb3ZlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfbWFwcGVkQnkiPgotCQk8ZGVzY3JpcHRpb24+VGhlIGZpZWxkIGluIHRoZSBkYXRhYmFzZSB0YWJsZSB0aGF0IG93bnMgdGhlIHJlbGF0aW9uc2hpcC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2pvaW5Db2x1bW5OYW1lIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4gdGhhdCBjb250YWlucyB0aGUgZm9yZWlnbiBrZXkgcmVmZXJlbmNlIGZvciB0aGUgZW50aXR5IGFzc29jaWF0aW9uLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfam9pblJlZmVyZW5jZWRDb2x1bW4iPgotCQk8ZGVzY3JpcHRpb24+TmFtZSBvZiB0aGUgam9pbiB0YWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBmb3JlaWduIGtleSBjb2x1bW4uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19lbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlcyI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0ICBtYXBwaW5nIG9mIGFuIGVudGl0eeKAmXMgYXR0cmlidXRlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfZW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb2x1bW4iPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIGNvbHVtbiB0aGF0IGlzIGJlaW5nIG1hcHBlZCB0byB0aGUgZW50aXR54oCZcyBhdHRyaWJ1dGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X21hcEFzIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIHR5cGUgb2YgcGVyc2lzdGVudCBkb21haW4gb2JqZWN0IGZvciB0aGUgSmF2YSBjbGFzczogUGVyc2lzdGVudCwgRW1iZWRkZWQsIG9yIE1hcHBlZCBTdXBlcmNsYXNzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfaW5oZXJpdGFuY2VTdHJhdGVneSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGhvdyBhbiBlbnRpdHkgbWF5IGluaGVyaXQgcHJvcGVydGllcyBmcm9tIG90aGVyIGVudGl0aWVzOiBTaW5nbGUgdGFibGUsIE9uZSB0YWJsZSBwZXIgY2xhc3MsIG9yIEpvaW5lZCB0YWJsZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJTcGVjaWZ5aW5nIGluaGVyaXRhbmNlIiBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2luaGVyaXRhbmNlRGlzY3JpbWluYXRvckNvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgZGlzY3JpbWluYXRvciBjb2x1bW4gd2hlbiB1c2luZyBhIFNpbmdsZSBvciBKb2luZWQgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJTcGVjaWZ5aW5nIGluaGVyaXRhbmNlIiBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2luaGVyaXRhbmNlRGlzY3JpbWluYXRvclR5cGUiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZmllbGQgdG8gc2V0IHRoZSBkaXNjcmltaW5hdG9yIHR5cGUgdG8gQ0hBUiBvciBJTlRFR0VSIChpbnN0ZWFkIG9mIGl0cyBkZWZhdWx0OiBTdHJpbmcpLiBUaGUgZGlzY3JpbWluYXRvciB2YWx1ZSBtdXN0IGNvbmZvcm0gdG8gdGhpcyB0eXBlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iU3BlY2lmeWluZyBpbmhlcml0YW5jZSIgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9pbmhlcml0YW5jZURpc2NyaW1pbmF0b3JWYWx1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSBkaXNjcmltaW5hdG9yIHZhbHVlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBhbiBlbnRpdHkgaW4gdGhpcyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIFRoZSB2YWx1ZSBtdXN0IGNvbmZvcm0gdG8gdGhlIHNwZWNpZmllZCBkaXNjcmltaW5hdG9yIHR5cGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJTcGVjaWZ5aW5nIGluaGVyaXRhbmNlIiBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19vcmRlckJ5Ij4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIGRlZmF1bHQgb3JkZXIgZm9yIG9iamVjdHMgcmV0dXJuZWQgZnJvbSBhIHF1ZXJ5LiAgCQotb3JkZXJieV9saXN0Ojo9IG9yZGVyYnlfaXRlbSBbLG9yZGVyYnlfaXRlbV0gICAgIAotb3JkZXJieV9pdGVtOjo9IFtwcm9wZXJ0eV9vcl9maWVsZF9uYW1lXSBbQVNDIHwgREVTQ10gICAgIAotRm9yIGV4YW1wbGU6ICJsYXN0TmFtZSBBU0MgLHNhbGFyeSBERVNDIgk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gRW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2pvaW5UYWJsZU5hbWUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgIG5hbWUgb2YgdGhlIGRhdGFiYXNlIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgZm9yZWlnbiBrZXkgZm9yIGEgbWFueS10by1tYW55IG9yIGEgdW5pZGlyZWN0aW9uYWwgb25lLXRvLW1hbnkgYXNzb2NpYXRpb24uIFlvdSBjYW4gY29uZmlndXJlIHRoZSBqb2luIHRhYmxlIHdpdGggYSBzcGVjaWZpYyBjYXRhbG9nIG9yIHNjaGVtYSwgY29uZmlndXJlIG9uZSBvciBtb3JlIGpvaW4gdGFibGUgY29sdW1ucyB3aXRoIGEgdW5pcXVlIGNvbnN0cmFpbnQsIGFuZCB1c2UgbXVsdGlwbGUgam9pbiBjb2x1bW5zIHBlciBlbnRpdHkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19qb2luVGFibGVKb2luQ29sdW1ucyI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5ICB0d28gb3IgbW9yZSBqb2luIGNvbHVtbnMgKHRoYXQgaXMsIGEgY29tcG9zaXRlIHByaW1hcnkga2V5KS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2pvaW5UYWJsZUludmVyc2VKb2luQ29sdW1ucyI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSBqb2luIGNvbHVtbiBvbiB0aGUgb3duZWQgKG9yIGludmVyc2Ugc2lkZSkgb2YgdGhlIGFzc29jaWF0aW9uOiB0aGUgb3duZWQgZW50aXR5J3MgcHJpbWFyeSBrZXkgY29sdW1uLiA8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwcm9wZXJ0aWVzX2phdmFQZXJzaXN0ZW5jZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhlIEphdmEgUGVyc2lzdGVuY2Ugb3B0aW9ucyBvbiB0aGUgUHJvcGVydGllcyBwYWdlIHRvIHNlbGVjdCB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2Ugd2l0aCB0aGUgcHJvamVjdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByb2plY3QgcHJvcGVydGllcyIgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcyIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0icmVmX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icHJvcGVydGllc19qYXZhUGVyc2lzdGVuY2VDb25uZWN0aW9uIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHVzZWQgdG8gbWFwIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJvamVjdCBwcm9wZXJ0aWVzIiBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InByb3BlcnRpZXNfamF2YVBlcnNpc3RlbmNlU2NoZW1hIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBzY2hlbWEgdXNlZCB0byBtYXAgdGhlIHBlcnNpc3RlbnQgZW50aXRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcm9qZWN0IHByb3BlcnRpZXMiIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMiLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2FkZFBlcnNpc3RlbmNlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGUgQWRkIFBlcnNpc3RlbmNlIGRpYWxvZyB0byBkZWZpbmUgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdXNlIHRvIHN0b3JlIHRoZSBwZXJzaXN0ZW5jZSBlbnRpdGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0icmVmX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2VPdXRsaW5lIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBKUEEgU3RydWN0dXJlIHZpZXcgZGlzcGxheXMgYW4gb3V0bGluZSBvZiB0aGUgc3RydWN0dXJlIChpdHMgYXR0cmlidXRlcyBhbmQgbWFwcGluZ3MpIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgb3Igb3BlbmVkIGluIHRoZSBlZGl0b3IuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgU3RydWN0dXJlIHZpZXciIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfZ2VuZXJhdGVFbnRpdGllcyI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhlIEdlbmVyYXRlIEVudGl0aWVzIGRpYWxvZyB0byBjcmVhdGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzIGJhc2VkIG9uIHlvdXIgZGF0YWJhc2UgdGFibGVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyIgaHJlZj0idGFza19nZW5lcmF0ZV9lbnRpdGllcy5odG0uaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IlByb2plY3QgcHJvcGVydGllcyIgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcyIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2dlbmVyYXRlRW50aXRpZXNfc291cmNlIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBwcm9qZWN0IGZvbGRlciBuYW1lIGluIHdoaWNoIHRvIGdlbmVyYXRlIHRoZSBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMuIENsaWNrIEJyb3dzZSB0byBzZWxlY3QgYW4gZXhpc3RpbmcgZm9sZGVyLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyIgaHJlZj0idGFza19nZW5lcmF0ZV9lbnRpdGllcy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19nZW5lcmF0ZUVudGl0aWVzX3BhY2thZ2UiPgotCQk8ZGVzY3JpcHRpb24+VGhlIHBhY2thZ2UgaW4gd2hpY2ggdG8gZ2VuZXJhdGUgdGhlIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcywgb3IgY2xpY2sgQnJvd3NlIHRvIHNlbGVjdCBhbiBleGlzdGluZyBwYWNrYWdlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyIgaHJlZj0idGFza19nZW5lcmF0ZV9lbnRpdGllcy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19nZW5lcmF0ZUVudGl0aWVzX3RhYmxlcyI+Ci0JCTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhlIHRhYmxlcyBmcm9tIHdoaWNoIHRvIGNyZWF0ZSBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2VudGl0aWVzLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlByb2plY3QgcHJvcGVydGllcyIgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcyIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2FkZEphdmFQZXJzaXN0ZW5jZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gZGVmaW5lIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHVzZWQgdG8gc3RvcmUgdGhlIHBlcnNpc3RlbmNlIGVudGl0aWVzIGFuZCB0byBjcmVhdGUgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkIFBlcnNpc3RlbmNlIGRpYWxvZyIgaHJlZj0icmVmX2FkZF9wZXJzaXN0ZW5jZS5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgcHJvamVjdCIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfbmV3SlBBUHJvamVjdCI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gZGVmaW5lIHRoZSBuZXcgSlBBIHByb2plY3QgbmFtZSwgaXRzIGxvY2F0aW9uLCB0YXJnZXQgcnVudGltZSwgYW5kIG90aGVyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJOZXcgSlBBIFByb2plY3QgcGFnZSIgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdC5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTmV3IEpQQSBQcm9qZWN0IHdpemFyZCIgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgcHJvamVjdCIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19hZGRKYXZhUGVyc2lzdGVuY2VfZGF0YWJhc2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoZXNlIGZpZWxkcyB0byBkZWZpbmUgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdXNlZCB0byBzdG9yZSB0aGUgcGVyc2lzdGVudCBlbnRpdGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFkZCBQZXJzaXN0ZW5jZSBkaWFsb2ciIGhyZWY9InJlZl9hZGRfcGVyc2lzdGVuY2UuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIHByb2plY3QiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2FkZEphdmFQZXJzaXN0ZW5jZV9jbGFzc3BhdGgiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgb3B0aW9uIHRvIGFkZCBsaWJyYXJpZXMgb3IgSkFScyB0aGF0IGNvbnRhaW4gdGhlIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIGFuZCBlbnRpdGllcyB0byB0aGUgcHJvamVjdOKAmXMgSmF2YSBCdWlsZCBQYXRoLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkIFBlcnNpc3RlbmNlIGRpYWxvZyIgaHJlZj0icmVmX2FkZF9wZXJzaXN0ZW5jZS5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgcHJvamVjdCIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfYWRkSmF2YVBlcnNpc3RlbmNlX3BhY2thZ2luZyI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhlc2UgZmllbGRzIHRvIGNyZWF0ZSB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUuIFNlbGVjdCB0aGUgcGVyc2lzdGVuY2UgdmVyc2lvbiwgdGhlIG5hbWUgb2YgdGhlIEpQQSBwcm92aWRlciwgYW5kIGEgdW5pcXVlIG5hbWUgdG8gaWRlbnRpZnkgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBZGQgUGVyc2lzdGVuY2UgZGlhbG9nIiBocmVmPSJyZWZfYWRkX3BlcnNpc3RlbmNlLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndpemFyZF9nZW5lcmF0ZURETF9vcHRpb25zICI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBwYWdlIHRvIHNlbGVjdCB3aGljaCBzY3JpcHQgb3B0aW9ucyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgc2NyaXB0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyB0YWJsZXMgKERETCkgZnJvbSBlbnRpdGllcyAiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZGRsLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJPcHRpb25zIHBhZ2UgIiBocmVmPSJyZWZfb3B0aW9ucy5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3aXphcmRfZ2VuZXJhdGVERExfb2JqZWN0cyAiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgcGFnZSB0byBzZWxlY3Qgd2hpY2ggZWxlbWVudHMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIHNjcmlwdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgdGFibGVzIChEREwpIGZyb20gZW50aXRpZXMgIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2RkbC5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iT2JqZWN0cyBwYWdlICIgaHJlZj0icmVmX29iamVjdHMuaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id2l6YXJkX2dlbmVyYXRlRERMX3NhdmUgIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHBhZ2UgdG8gc2VsZWN0IHRoZSBmaWxlbmFtZSBhbmQgbG9jYXRpb24gb2YgdGhlIGdlbmVyYXRlZCBzY3JpcHQuIFlvdSBjYW4gYWxzbyBwcmV2aWV3IHRoZSBzY3JpcHQgYW5kIHNwZWNpZnkgdG8gcnVuIG9yIGNvbnRpbnVlIGVkaXRpbmcgdGhlIHNjcmlwdCBhZnRlciBnZW5lcmF0aW9uLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyB0YWJsZXMgKERETCkgZnJvbSBlbnRpdGllcyAiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZGRsLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJTYXZlIGFuZCBSdW4gRERMIHBhZ2UgIiBocmVmPSJyZWZfc2F2ZV9hbmRfcnVuLmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndpemFyZF9nZW5lcmF0ZURETF9zdW1tYXJ5ICI+Ci0JCTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2Ugc2hvd3MgdGhlIHNldHRpbmdzIHRoYXQgeW91IHNlbGVjdGVkIGZvciB0aGUgZ2VuZXJhdGVkIERETC4gVG8gY2hhbmdlIGFueSBvcHRpb24gY2xpY2sgIkJhY2siIG9yIGNsaWNrICJGaW5pc2giIHRvIGNvbnRpbnVlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyB0YWJsZXMgKERETCkgZnJvbSBlbnRpdGllcyAiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZGRsLmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGFibGVHZW5lcmF0b3JOYW1lIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBuYW1lIG9mIHRoZSB0YWJsZSBzZXF1ZW5jZSBnZW5lcmF0b3IuIFRoaXMgbmFtZSBpcyBnbG9iYWwgdG8gdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgKGFjcm9zcyBhbGwgZ2VuZXJhdG9yIHR5cGVzKS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGFibGVHZW5lcmF0b3JUYWJsZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgdGFibGUgdGhhdCBzdG9yZXMgdGhlIGdlbmVyYXRlZCBJRCB2YWx1ZXMuIDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ190YWJsZUdlbmVyYXRvclByaW1hcnlLZXlDb2x1bW4iPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIGNvbHVtbiBvZiB0aGUgZ2VuZXJhdG9yIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBnZW5lcmF0ZWQgSUQgdmFsdWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ190YWJsZUdlbmVyYXRvclZhbHVlQ29sdW1uIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBuYW1lIGZvciB0aGUgY29sdW1uIHRoYXQgc3RvcmVzIHRoZSBnZW5lcmF0ZWQgSUQgdmFsdWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ190YWJsZUdlbmVyYXRvclByaW1hcnlLZXlDb2x1bW5WYWx1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY29sdW1uIG9mIHRoZSBnZW5lcmF0b3IgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSBwcmltYXJ5IGtleSB2YWx1ZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19kYXRhYmFzZUF1dGhvcml6YXRpb24iPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRvIGNvbm5lY3QgKGxvZyBpbikgdG8gYSBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIHVzZSB3aXRoIHlvdXIgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzLiAKLQkJWW91IG11c3QgaGF2ZSBhIGRlZmluZWQgZGF0YWJhc2UgY29ubmVjdGlvbiAoYW5kIGJlIGNvbm5lY3RlZCkgdG8gYWRkIHBlcnNpc3RlbmNlLiA8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFkZCBwZXJzaXN0ZW5jZSB0byBhIEphdmEgcHJvamVjdCIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2VfcHJvamVjdC5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGVtcG9yYWwiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSBpZiB0aGUgbWFwcGVkIGZpZWxkIGNvbnRhaW5zIGEgRGF0ZSAoamF2YS5zcWwuRGF0ZSksIFRpbWUgKGphdmEuc3FsLlRpbWUpLCBvciBUaW1lc3RhbXAgKGphdmEuc3FsLlRpbWVzdGFtcCkgdmFsdWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3ByaW1hcnlLZXlHZW5lcmF0aW9uIj4KLQkJPGRlc2NyaXB0aW9uPkRlZmluZSBob3cgdGhlIHByaW1hcnkga2V5IGlzIGdlbmVyYXRlZDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiIgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGFibGVHZW5lcmF0b3IiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0byB1c2UgYSBzcGVjaWZpYyBkYXRhYmFzZSB0YWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUgcHJpbWFyeSBrZXkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19zZXF1ZW5jZUdlbmVyYXRvciI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRvIHVzZSBhIHNwZWNpZmljIHNlcXVlbmNlIGZvciBnZW5lcmF0aW5nIHRoZSBwcmltYXJ5IGtleS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3NlcXVlbmNlR2VuZXJhdG9yTmFtZSI+Ci0JCTxkZXNjcmlwdGlvbj5OYW1lIG9mIHRoZSBzZXF1ZW5jZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3NlcXVlbmNlR2VuZXJhdG9yU2VxdWVuY2UiPgotCQk8ZGVzY3JpcHRpb24+IDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiIgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfbG9iIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgaWYgdGhlIGZpZWxkIGlzIG1hcHBlZCB0byBqYXZhLnNxbC5DbG9iIG9yIGphdmEuc3FsLkJsb2IuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmFsIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfZW51bWVyYXRlZCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGhvdyB0byBwZXJzaXN0IGVudW1lcmF0ZWQgY29uc3RyYWludHMgaWYgdGhlIFN0cmluZyB2YWx1ZSBzdWl0cyB5b3VyIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cyBvciB0byBtYXRjaCBhbiBleGlzdGluZyBkYXRhYmFzZSBzY2hlbWEuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmFsIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19lZGl0SW52ZXJzZUpvaW5Db2x1bW4iPgotCQk8ZGVzY3JpcHRpb24+LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9jYXRhbG9nIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBjYXRhbG9nIHRoYXQgY29udGFpbnMgdGhlIFRhYmxlLiBUaGlzIGZpZWxkIG92ZXJyaWRlcyB0aGUgZGVmYXVsdHMgaW4gdGhlIG9ybS54bWwgZmlsZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X3NjaGVtYSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2Ugc2NoZW1hIHRoYXQgY29udGFpbnMgdGhlIFRhYmxlLiBUaGlzIGZpZWxkIG92ZXJyaWRlcyB0aGUgZGVmYXVsdHMgaW4gdGhlIG9ybS54bWwgZmlsZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3JtX3BhY2thZ2UiPgotCQk8ZGVzY3JpcHRpb24+VGhlIEphdmEgcGFja2FnZSB0aGF0IGNvbnRhaW5zIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzIHRvIHdoaWNoIHRoZSBvcm0ueG1sIGZpbGUgYXBwbGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3JtX3NjaGVtYSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2Ugc2NoZW1hIHRvIHVzZSBhcyB0aGUgZGVmYXVsdCBmb3IgYWxsIGVudGl0aWVzIG1hbmFnZWQgYnkgdGhpcyBwZXJzaXN0ZW5jZSB1bml0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJvcm1fY2F0YWxvZyI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY2F0YWxvZyB0byB1c2UgYXMgdGhlIGRlZmF1bHQgZm9yIGFsbCBlbnRpdGllcyBtYW5hZ2VkIGJ5IHRoaXMgcGVyc2lzdGVuY2UgdW5pdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3JtX2FjY2VzcyI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGVmYXVsdCBhY2Nlc3MgbWV0aG9kIGZvciB2YXJpYWJsZXMgaW4gdGhpcyBwcm9qZWN0OiBQcm9wZXJ0eSBvciBGaWVsZC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3JtX2Nhc2NhZGUiPgotCQk8ZGVzY3JpcHRpb24+QWRkcyBjYXNjYWRlLXBlcnNpc3QgdG8gdGhlIHNldCBvZiBjYXNjYWRlIG9wdGlvbnMgaW4gZW50aXR5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9ybV94bWwiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIHRoYXQgdGhlIEphdmEgY2xhc3NlcyBpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQgYXJlIGZ1bGx5IHNwZWNpZmllZCBieSB0aGVpciBtZXRhZGF0YS4gQW55IGFubm90YXRpb25zIHdpbGwgYmUgaWdub3JlZC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX0pQQVBsYXRmb3JtIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIHZlbmRvci1zcGVjaWZpYyBKUEEgaW1wbGVtZW50YXRpb24uRGVmYXVsdCBpcyBHZW5lcmljLi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBGYWNldCBwYWdlIiBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2NyZWF0ZU9STSI+Ci0JCTxkZXNjcmlwdGlvbj5DcmVhdGUgYW4gaW5pdGlhbCBvcm0ueG1sIGZpbGUuIFVzZSB0aGlzIGZpbGUgdG8gc3BlY2lmeSBwcm9qZWN0IGFuZCBwZXJzaXN0ZW5jZSB1bml0IGRlZmF1bHRzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBGYWNldCBwYWdlIiBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSIvPgotCTwvY29udGV4dD4KLQotCTxjb250ZXh0IGlkPSJjYWNoaW5nX2RlZmF1bHRUeXBlIj4KLQkJPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGUgZGVmYXVsdCBjYWNoaW5nIHN0cmF0ZWd5IGZvciB0aGUgcHJvamVjdC4gVGhlIGRlZmF1bHQgaXMgV2VhayB3aXRoIFNvZnQgU3ViY2FjaGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iY2FjaGluZ19kZWZhdWx0U2l6ZSI+Ci0JCTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhlIGRlZmF1bHQgc2l6ZSBvZiB0aGUgY2FjaGUuIFRoZSBkZWZhdWx0IGlzIDEwMCBpdGVtcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJjYWNoaW5nX2RlZmF1bHRTaGFyZWQiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSBpZiBjYWNoZWQgaW5zdGFuY2VzIHNob3VsZCBiZSBpbiB0aGUgc2hhcmVkIGNhY2hlIG9yIGluIGEgY2xpZW50IGlzb2xhdGVkIGNhY2hlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImxvZ2dpbmdfbGV2ZWwiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIHRoZSBhbW91bnQgYW5kIGRldGFpbCBvZiBsb2cgb3V0cHV0IGJ5IHNlbGVjdGluZyB0aGUgbG9nIGxldmVsLiBEZWZhdWx0IGlzIEluZm8gbGV2ZWwuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibG9nZ2luZ190aW1lU3RhbXAiPgotCQk8ZGVzY3JpcHRpb24+Q29udHJvbCB3aGV0aGVyIHRoZSB0aW1lc3RhbXAgaXMgbG9nZ2VkIGluIGVhY2ggbG9nIGVudHJ5LiBEZWZhdWx0IGlzIFRydWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibG9nZ2luZ190aHJlYWQiPgotCQk8ZGVzY3JpcHRpb24+Q29udHJvbCB3aGV0aGVyIGEgdGhyZWFkIGlkZW50aWZpZXIgaXMgbG9nZ2VkIGluIGVhY2ggbG9nIGVudHJ5LiBEZWZhdWx0IGlzIFRydWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibG9nZ2luZ19zZXNzaW9uIj4KLQkJPGRlc2NyaXB0aW9uPkNvbnRyb2wgd2hldGhlciBhbiBFY2xpcHNlTGluayBzZXNzaW9uIGlkZW50aWZpZXIgaXMgbG9nZ2VkIGluIGVhY2ggbG9nIGVudHJ5LiBEZWZhdWx0IGlzIFRydWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibG9nZ2luZ19leGNlcHRpb25zIj4KLQkJPGRlc2NyaXB0aW9uPkNvbnRyb2wgd2hldGhlciB0aGUgZXhjZXB0aW9ucyB0aHJvd24gZnJvbSB3aXRoaW4gdGhlIGNvZGUgYXJlIGxvZ2dlZCBwcmlvciB0byByZXR1cm5pbmcgdGhlIGV4Y2VwdGlvbiB0byB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbi4gRW5zdXJlcyB0aGF0IGFsbCBleGNlcHRpb25zIGFyZSBsb2dnZWQgYW5kIG5vdCBtYXNrZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNvZGUuLiBEZWZhdWx0IGlzIEZhbHNlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9wdGlvbnNfc2Vzc2lvbk5hbWUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgbmFtZSBieSB3aGljaCB0aGUgRWNsaXBzZUxpbmsgc2Vzc2lvbiBpcyBzdG9yZWQgaW4gdGhlIHN0YXRpYyBzZXNzaW9uIG1hbmFnZXIuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3B0aW9uc19zZXNzaW9uc1htbCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHBlcnNpc3RlbmNlIGluZm9ybWF0aW9uIGxvYWRlZCBmcm9tIHRoZSBFY2xpcHNlTGluayBzZXNzaW9uIGNvbmZpZ3VyYXRpb24gZmlsZS4gWW91IGNhbiB1c2UgdGhpcyBvcHRpb24gYXMgYW4gYWx0ZXJuYXRpdmUgdG8gYW5ub3RhdGlvbnMgYW5kIGRlcGxveW1lbnQgWE1MLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9wdGlvbnNfdGFyZ2V0RGF0YWJhc2UiPgotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3B0aW9uc190YXJnZXRTZXJ2ZXIiPgotCQk8ZGVzY3JpcHRpb24+IDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19uZXdKUEFQcm9qZWN0SmF2YSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gaW5jbHVkZSBleGlzdGluZyBKYXZhIHNvdXJjZSBmaWxlcyBpbiB0aGlzIHByb2plY3QuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKYXZhIHBhZ2UiIGhyZWY9InJlZl9qYXZhX3BhZ2UuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9Ik5ldyBKUEEgUHJvamVjdCB3aXphcmQiIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkIiAvPgotCQk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IiBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfbmV3SlBBUHJvamVjdEZhY2V0Ij4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IHlvdXIgdmVuZGVyLXNwZWNpZmljIHBsYXRmb3JtLCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSwgYW5kIGRhdGFiYXNlIGNvbm5lY3Rpb24uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRmFjZXQgcGFnZSIgaHJlZj0icmVmX2pwYV9mYWNldC5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTmV3IEpQQSBQcm9qZWN0IHdpemFyZCIgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19lbnRpdHlDbGFzc1BhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgcGFja2FnZSwgY2xhc3MgbmFtZSwgYW5kIGluaGVyaXRhbmNlIHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eSB0byBjcmVhdGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJFbnRpdHkgQ2xhc3MgcGFnZSIgaHJlZj0icmVmX0VudGl0eUNsYXNzUGFnZS5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTmV3IEpQQSBFbnRpdHkgd2l6YXJkIiBocmVmPSJyZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIG5ldyBKUEEgZW50aXR5IiBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19lbnRpdHlQcm9wZXJ0aWVzUGFnZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSB0aGUgZW50aXR5IG5hbWUsIGFzc29jaWF0ZWQgdGFibGUsIGFuZCBtYXBwZWQgZmllbGRzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iRW50aXR5IFByb3BlcnRpZXMgcGFnZSIgaHJlZj0icmVmX0VudGl0eVByb3BlcnRpZXNQYWdlLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJOZXcgSlBBIEVudGl0eSB3aXphcmQiIGhyZWY9InJlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgbmV3IEpQQSBlbnRpdHkiIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX3NlbGVjdFRhYmxlc1BhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIGRhdGFiYXNlIHRhYmxlcyBmcm9tIHdoaWNoIHRvIGdlbmVyYXRlIGVudGl0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iU2VsZWN0IFRhYmxlcyBwYWdlIiBocmVmPSJyZWZfc2VsZWN0VGFibGVzLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0ZSBDdXN0b20gRW50aXRpZXMgd2l6YXJkIiBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtIiAvPgotCTwvY29udGV4dD4JCi0JPGNvbnRleHQgaWQ9ImRpYWxvZ190YWJsZUFzc29jaWF0aW9uc1BhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIGNyZWF0ZSBvciBlZGl0IHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBkYXRhYmFzZSB0YWJsZSBhbmQgZW50aXR5LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iVGFibGUgQXNzb2NpYXRpb25zIHBhZ2UiIGhyZWY9InJlZl90YWJsZUFzc29jaWF0aW9ucy5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGUgQ3VzdG9tIEVudGl0aWVzIHdpemFyZCIgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSIgLz4KLQk8L2NvbnRleHQ+CQotCTxjb250ZXh0IGlkPSJkaWFsb2dfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24iPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIHRhYmxlIG1hcHBpbmcgYW5kIGRvbWFpbiBjbGFzcyBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZCBlbnRpdHkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJDdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbiBwYWdlIiBocmVmPSJyZWZfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24uaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRlIEN1c3RvbSBFbnRpdGllcyB3aXphcmQiIGhyZWY9InJlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0iIC8+Ci0JPC9jb250ZXh0PgkKLQk8Y29udGV4dCBpZD0iZGlhbG9nX2N1c3RvbWl6ZUluZGl2aWR1YWxFbnRpdGllcyI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSB0aGUgdGFibGUgbWFwcGluZyBhbmQgZG9tYWluIGNsYXNzIGluZm9ybWF0aW9uIGZvciB0aGUgZ2VuZXJhdGVkIGVudGl0eS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzIHBhZ2UiIGhyZWY9InJlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGUgQ3VzdG9tIEVudGl0aWVzIHdpemFyZCIgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSIgLz4KLQk8L2NvbnRleHQ+CQotCi0JPGNvbnRleHQgaWQ9ImRpYWxvZ19hc3NvY2lhdGlvblRhYmxlc1BhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIGFzc29jaWF0aW9uIHRhYmxlcyBmb3IgYW4gZW50aXR5LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQXNzb2NpYXRpb24gVGFibGVzIHBhZ2UiIGhyZWY9InJlZl9hc3NvY2lhdGlvbl90YWJsZXMuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkNyZWF0ZSBOZXcgQXNzb2NpYXRpb24gd2l6YXJkIiBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtIiAvPgotCTwvY29udGV4dD4JCi0JPGNvbnRleHQgaWQ9ImRpYWxvZ19qb2luQ29sdW1uc1BhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIGpvaW4gY29sdW1ucyBvZiBhbiBhc3NvY2lhdGlvbiB0YWJsZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpvaW4gQ29sdW1ucyBwYWdlIiBocmVmPSJyZWZfam9pbl9jb2x1bW5zLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJDcmVhdGUgTmV3IEFzc29jaWF0aW9uIHdpemFyZCIgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSIgLz4KLQk8L2NvbnRleHQ+CQotCTxjb250ZXh0IGlkPSJkaWFsb2dfYXNzb2NpYXRpb25DYXJkaW5hbGl0eVBhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgY2FyZGluYWxpdHkgb2YgYW4gYXNzb2NpYXRpb24gdGFibGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBc3NvY2lhdGlvbiBDYXJkaW5hbGl0eSBwYWdlIiBocmVmPSJyZWZfYXNzb2NpYXRpb25fY2FyZGluYWxpdHkuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkNyZWF0ZSBOZXcgQXNzb2NpYXRpb24gd2l6YXJkIiBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtIiAvPgotCTwvY29udGV4dD4JCi0JPGNvbnRleHQgaWQ9ImRpYWxvZ19zZWxlY3RDYXNjYWRlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgd2hpY2ggb3BlcmF0aW9ucyBhcmUgcHJvcGFnYXRlZCB0aHJvdWdob3V0IHRoZSBhc3NvY2lhdGlvbjogQWxsLCBQZXJzaXN0LCBNZXJnZSwgUmVtb3ZlLCBvciBSZWZyZXNoLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iU2VsZWN0IENhc2NhZGUgcGFnZSIgaHJlZj0icmVmX3NlbGVjdF9jYXNjYWRlX2RpYWxvZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2VfZ2VuZXJhbCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSBnZW5lcmFsIHBlcnNpc3RlbmNlIG9wdGlvbnMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmFsIHBhZ2UiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9nZW5lcmFsIiAvPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwZXJzaXN0ZW5jZV9jb25uZWN0aW9uIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIGRhdGEgc291cmNlIG9yIEpEQkMgY29ubmVjdGlvbiBwcm9wZXJ0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQ29ubmVjdGlvbiBwYWdlIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfY29ubmVjdGlvbiIgLz4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2VfY3VzdG9taXphdGlvbiI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSBkZWZhdWx0IG9yIGVudGl0eSBzcGVjaWZpYyBFY2xpcHNlTGluayBjdXN0b21pemF0aW9uIGFuZCB2YWxpZGF0aW9uIHByb3BlcnRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJDdXN0b21pemF0aW9uIHBhZ2UiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9jb25uZWN0aW9uIiAvPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwZXJzaXN0ZW5jZV9jYWNoaW5nIj4KLQkJPGRlc2NyaXB0aW9uPkNvbmZpZ3VyZSB0aGUgc2Vzc2lvbiBvciBlbnRpdHkgc3BlY2lmaWMgRWNsaXBzZUxpbmsgY2FjaGluZyBwcm9wZXJ0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQ2FjaGluZyBwYWdlIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfY2FjaGluZyIgLz4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2VfbG9nZ2luZyI+Ci0JCTxkZXNjcmlwdGlvbj5Db25maWd1cmUgdGhlIEVjbGlwc2VMaW5rIGxvZ2dpbmcgcHJvcGVydGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkxvZ2dpbmcgcGFnZSIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX2xvZ2dpbmciIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlX29wdGlvbnMiPgotCQk8ZGVzY3JpcHRpb24+Q29uZmlndXJlIHRoZSBFY2xpcHNlTGluayBzZXNzaW9uIGFuZCBtaXNjZWxsYW5vdXMgb3B0aW9ucy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik9wdGlvbnMgcGFnZSIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX29wdGlvbnMiIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlX3NjaGVtYUdlbmVyYXRpb24iPgotCQk8ZGVzY3JpcHRpb24+Q29uZmlndXJlIHRoZSBzY2hlbWEgZ2VuZXJhdGlvbiBwcm9wZXJ0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iU2NoZW1hIEdlbmVyYXRpb24gcGFnZSIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3NjaGVtYUdlbmVyYXRpb24iIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlX3Byb3BlcnRpZXMiPgotCQk8ZGVzY3JpcHRpb24+Q29uZmlndXJlIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJvcGVydGllcyBwYWdlIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcGVydGllcyIgLz4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQkJPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlX3NvdXJjZSI+Ci0JCTxkZXNjcmlwdGlvbj5Db25maWd1cmUgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcm9wZXJ0aWVzIHBhZ2UiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wZXJ0aWVzIiAvPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgkKLQk8Y29udGV4dCBpZD0iZGlhbG9nX2VjbGlwc2VsaW5rX21hcHBpbmdfZmlsZSI+Ci0JCTxkZXNjcmlwdGlvbj5Db25maWd1cmUgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJOZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIHBhZ2UiIGhyZWY9InJlZl9lY2xpcHNlbGlua19tYXBwaW5nX2ZpbGUiIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2NyZWF0ZV9uZXdfY29udmVydGVycyI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gY3JlYXRlIGEgbmV3IEVjbGlwc2VMaW5rIGNvbnZldGVyLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkIENvbnZlcnRlciBkaWFsb2ciIGhyZWY9InJlZl9hZGRfY29udmVydGVyIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybSIgLz4KLQk8L2NvbnRleHQ+Ci0KLTwhLS0gQWRkZWQgZm9yIDIuMyAtLT4KLQk8Y29udGV4dCBpZD0icHJvcGVydGllc19jYW5vbmljYWxNZXRhbW9kZWwiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIGlmIHRoZSBwcm9qZWN0IG1vZGVsIHVzZXMgdGhlIENhbm9uaWNhbCBNZXRhbW9kZWwuIDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJvamVjdCBwcm9wZXJ0aWVzIiBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9jYWNoZWFibGUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSBpZiB0aGUgZW50aXR5IHVzZXMgdGhlIEBDYWNoYWJsZSBhbm5vdGF0aW9uLiBEZWZhdWx0IGlzIEBDYWNoYWJsZShmYWxzZSkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X3ByaW1hcnlLZXlDbGFzcyI+Ci0JCTxkZXNjcmlwdGlvbj5DbGljayBCcm93c2UgYW5kIHNlbGVjdCB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSBlbnRpdHkuIENsaWNraW5nIHRoZSBmaWVsZCBuYW1lLCB3aGljaCBpcyByZXByZXNlbnRlZCBhcyBhIGh5cGVybGluaywgYWxsb3dzIHlvdSB0byBjcmVhdGUgYSBuZXcgY2xhc3MuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3aXphcmRfamF4YnNjaGVtYV9jbGFzc2VzIj4KLQkJPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGUgcHJvamVjdCwgcGFja2FnZSwgb3IgY2xhc3NlcyBmcm9tIHdoaWNoIHRvIGdlbmVyYXRlIHRoZSBYTUwgc2NoZW1hLiBDbGljayBGaW5pc2ggdG8gZ2VuZXJhdGUgdGhlIHNjaGVtYTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIHdpemFyZCIgaHJlZj0icmVmX2pheGJfc2NoZW1hX3dpemFyZC5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIHNjaGVtYSBmcm9tIGNsYXNzZXMiIGhyZWY9InRhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iY29uZmlndXJlX2pheGJfY2xhc3NfZ2VuZXJhdGlvbl9kaWFsb2ciPgotCQk8ZGVzY3JpcHRpb24+RW50ZXIgdGhlIEpBWEIgY2xhc3MgZ2VuZXJhdGlvbiBzZXR0aW5ncyBhbmQgY2xpY2sgRmluaXNoIHRvIGdlbmVyYXRlIGNsYXNzZXMuICBBbGwgZmllbGRzIGFyZSBvcHRpb25hbCBleGNlcHQgZm9yIHRoZSBzb3VyY2UgZm9sZGVyLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQ29uZmlndXJlIEpBWEIgQ2xhc3MgR2VuZXJhdGlvbiBkaWFsb2ciIGhyZWY9InJlZl9jb25maWd1cmVfamF4Yl9jbGFzc19nZW5lcmF0aW9uX2RpYWxvZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEuaHRtIi8+Ci0JPC9jb250ZXh0PgotCQotCQotCQotCQotCQotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9kY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9kY29tbW9uL2Nzcy9ibGFmZG9jLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFmNjEyNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1AaW1wb3J0ICIuLi8uLi8uLi9QUk9EVUNUX1BMVUdJTi9ib29rLmNzcyI7Ci0KLXNwYW4uY29udHJvbCwgc3Bhbi5ndWktb2JqZWN0LWFjdGlvbiwgcC5zdWJoZWFkMiwgc3Bhbi5ib2xkLCBwLm5vdGVwMSB7Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1zcGFuLm5hbWUsIHAudGl0bGVpbmZpZ3VyZSwgc3Bhbi5pdGFsaWMgewotICBmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXAudGl0bGVpbmZpZ3VyZSwgcC5zdWJoZWFkMiB7Ci0gIHBhZGRpbmctdG9wOiAxMHB4OwotfQotCi1zcGFuLmNvZGUgewotICBmb250LWZhbWlseTogbW9ub3NwYWNlOwotfQotCi1zcGFuLmNvcHlyaWdodGxvZ28ge2ZvbnQtc2l6ZTogMC44ZW19Ci0KLS5mb290ZXIge21hcmdpbi10b3A6IDJlbTtib3JkZXItdG9wOjFweCBzb2xpZCAjY2NjY2NjO3BhZGRpbmctdG9wOjFlbTt9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Rjb21tb24vaHRtbC9jcHlyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9kY29tbW9uL2h0bWwvY3B5ci5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MmVjNjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Rjb21tb24vaHRtbC9jcHlyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci0KLTxoZWFkPgotPCEtLSAgPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDt1cmw9Li4vLi4vbGVnYWwuaHRtIj4gLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGhyZWY9Ii4uLy4uL2xlZ2FsLmh0bSI+TGljZW5zZSBJbmZvcm1hdGlvbjwvYT48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTkzYWQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZXR0aW5nIHN0YXJ0ZWQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIEdldHRpbmcgc3RhcnRlZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9InN0aHJlZjIiIG5hbWU9InN0aHJlZjIiPjwvYT48L3A+Ci08aDE+R2V0dGluZyBzdGFydGVkPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBnZXR0aW5nIHN0YXJ0ZWQgd2l0aCB0aGUgSmF2YSBQZXJzaXN0ZW5jZSBUb29scy48L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDEuaHRtI0JBQkVGSENEIj5SZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAyLmh0bSNCQUJJR0NKQSI+RGFsaSBxdWljayBzdGFydDwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPkZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBwbGVhc2UgdmlzaXQgdGhlIERhbGkgaG9tZSBwYWdlIGF0OjwvcD4KLTxwPjxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvZGFsaSI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9kYWxpPC9hPjwvY29kZT4uPC9wPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxY2Y5NjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQxWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRUZIQ0QiIG5hbWU9IkJBQkVGSENEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5SZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbjxhIGlkPSJzdGhyZWYzIiBuYW1lPSJzdGhyZWYzIj48L2E+PGEgaWQ9InN0aHJlZjQiIG5hbWU9InN0aHJlZjQiPjwvYT48L2gxPgotPHA+QmVmb3JlIGluc3RhbGxpbmcgRGFsaSwgZW5zdXJlIHRoYXQgeW91ciBlbnZpcm9ubWVudCBtZWV0cyB0aGUgZm9sbG93aW5nIDxzcGFuIGNsYXNzPSJpdGFsaWMiPm1pbmltdW08L3NwYW4+IHJlcXVpcmVtZW50czo8L3A+Ci08dWw+Ci08bGk+Ci08cD5FY2xpcHNlIDMuNiAoPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzPC9hPjwvY29kZT4pPC9wPgotPC9saT4KLTxsaT4KLTxwPkphdmEgUnVudGltZSBFbnZpcm9ubWVudCAoSlJFKSAxLjUgKDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLmNvbSI+aHR0cDovL2phdmEuY29tPC9hPjwvY29kZT4pPC9wPgotPC9saT4KLTxsaT4KLTxwPkVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIDMuMiAoPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29sczwvYT48L2NvZGU+KTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5KYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBmb3IgSmF2YSBFRSA1LiBGb3IgZXhhbXBsZSwgdGhlIEVjbGlwc2VMaW5rIGltcGxlbWVudGF0aW9uIGZvciBKUEEgY2FuIGJlIG9idGFpbmVkIGZyb206IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rLzwvYT48L2NvZGU+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5SZWZlciB0byA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2RhbGkvZ2V0dGluZ3N0YXJ0ZWRfbWFpbi5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2RhbGkvZ2V0dGluZ3N0YXJ0ZWRfbWFpbi5odG1sPC9hPjwvY29kZT4gZm9yIGFkZGl0aW9uYWwgaW5zdGFsbGF0aW9uIGluZm9ybWF0aW9uLjwvcD4KLTxwPjxhIGlkPSJzdGhyZWY1IiBuYW1lPSJzdGhyZWY1Ij48L2E+RGFsaSBpcyBpbmNsdWRlZCBhcyBwYXJ0IG9mIFdUUCAzLjIuIE5vIGFkZGl0aW9uYWwgaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQuPC9wPgotPGEgaWQ9InN0aHJlZjYiIG5hbWU9InN0aHJlZjYiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+QWNjZXNzaWJpbGl0eSBGZWF0dXJlczwvcD4KLTxwPkRhbGkgc3VwcG9ydHMgdGhlIHN0YW5kYXJkIGFjY2Vzc2liaWxpdHkgZmVhdHVyZXMgaW4gRWNsaXBzZSwgaW5jbHVkaW5nIHRoZSBmb2xsb3dpbmc6PC9wPgotPHVsPgotPGxpPgotPHA+TmF2aWdhdGluZyB0aGUgdXNlciBpbnRlcmZhY2UgdXNpbmcgdGhlIGtleWJvYXJkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TcGVjaWZ5aW5nIGdlbmVyYWwgYWNjZXNzaWJpbGl0eSBwcmVmZXJlbmNlcyBmb3IgdGhlIGVkaXRvci48L3A+Ci08L2xpPgotPC91bD4KLTxwPlNlZSA8YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9hY2Nlc3NpYmlsaXR5L2FjY2Vzc21haW4uaHRtIj5BY2Nlc3NpYmlsaXR5IEZlYXR1cmVzIGluIEVjbGlwc2U8L2E+IGluIHRoZSA8c3BhbiBjbGFzcz0iaXRhbGljIj5Xb3JrYmVuY2ggVXNlciBHdWlkZTwvc3Bhbj4gZm9yIGRldGFpbHMuPC9wPgotPGEgaWQ9InN0aHJlZjciIG5hbWU9InN0aHJlZjciPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+SGVscCBBY2Nlc3NpYmlsaXR5PC9wPgotPHA+VGhlIGRvY3VtZW50YXRpb24gYW5kIGhlbHAgY29udGFpbnMgbWFya3VwIHRvIGZhY2lsaXRhdGUgYWNjZXNzIGJ5IHRoZSBkaXNhYmxlZCBjb21tdW5pdHkuIFNlZSA8YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci90YXNrcy9oZWxwX2FjY2Vzc2liaWxpdHkuaHRtIj5IZWxwIEFjY2Vzc2liaWxpdHk8L2E+IGluIHRoZSA8c3BhbiBjbGFzcz0iaXRhbGljIj5Xb3JrYmVuY2ggVXNlciBHdWlkZTwvc3Bhbj4gZm9yIGRldGFpbHMuPC9wPgotPHA+V2hlbiB1c2luZyB0aGUgaGVscCwgYmUgYXdhcmUgb2YgdGhlIGZvbGxvd2luZzo8L3A+Ci08dWw+Ci08bGk+Ci08cD5TY3JlZW4gcmVhZGVycyBtYXkgbm90IGFsd2F5cyBjb3JyZWN0bHkgcmVhZCB0aGUgY29kZSBleGFtcGxlcyBpbiB0aGlzIGRvY3VtZW50LiBUaGUgY29udmVudGlvbnMgZm9yIHdyaXRpbmcgY29kZSByZXF1aXJlIHRoYXQgY2xvc2luZyBicmFjZXMgc2hvdWxkIGFwcGVhciBvbiBhbiBvdGhlcndpc2UgZW1wdHkgbGluZTsgaG93ZXZlciwgc29tZSBzY3JlZW4gcmVhZGVycyBtYXkgbm90IGFsd2F5cyByZWFkIGEgbGluZSBvZiB0ZXh0IHRoYXQgY29uc2lzdHMgc29sZWx5IG9mIGEgYnJhY2tldCBvciBicmFjZS48L3A+Ci08L2xpPgotPGxpPgotPHA+VGhpcyBkb2N1bWVudGF0aW9uIG1heSBjb250YWluIGxpbmtzIHRvIFdlYiBzaXRlcyBvZiBvdGhlciBjb21wYW5pZXMgb3Igb3JnYW5pemF0aW9ucyB0aGF0IHdlIGRvIG5vdCBjb250cm9sLiBXZSBuZWl0aGVyIGV2YWx1YXRlIG5vciBtYWtlIGFueSByZXByZXNlbnRhdGlvbnMgcmVnYXJkaW5nIHRoZSBhY2Nlc3NpYmlsaXR5IG9mIHRoZXNlIFdlYiBzaXRlcy48L3A+Ci08L2xpPgotPC91bD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyODUzMTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkRhbGkgcXVpY2sgc3RhcnQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRGFsaSBxdWljayBzdGFydCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQklHQ0pBIiBuYW1lPSJCQUJJR0NKQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RGFsaSBxdWljayBzdGFydDwvaDE+Ci08cD48YSBpZD0ic3RocmVmOCIgbmFtZT0ic3RocmVmOCI+PC9hPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiB0byBoZWxwIHlvdSBxdWlja2x5IHN0YXJ0IHVzaW5nIERhbGkgdG8gY3JlYXRlIHJlbGF0aW9uYWwgbWFwcGluZ3MgYmV0d2VlbiBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMgYW5kIGRhdGFiYXNlIHRhYmxlcy48L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtI0JBQkRGSERBIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSNCQUJGR0RERyI+Q3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHM8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGlwc19hbmRfdHJpY2tzLmh0bSNDSERIR0hCRiI+VGlwcyBhbmQgdHJpY2tzPC9hPjxiciAvPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYmFjNzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkRGSERBIiBuYW1lPSJCQUJERkhEQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjkiIG5hbWU9InN0aHJlZjkiPjwvYT5UaGlzIHF1aWNrIHN0YXJ0IHNob3dzIGhvdyB0byBjcmVhdGUgYSBuZXcgSlBBIHByb2plY3QuPC9wPgotPG9sPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlNlbGVjdCBGaWxlICZndDsgTmV3ICZndDsgUHJvamVjdDwvc3Bhbj4uIFRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIGFwcGVhcnMuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotWW91IGNhbiBhbHNvIHNlbGVjdCB0aGUgSlBBIHBlcnNwZWN0aXZlIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IEpQQSBQcm9qZWN0PC9zcGFuPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5KUEEgUHJvamVjdDwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdC5odG0jQ0FDQkpBR0MiPk5ldyBKUEEgUHJvamVjdCBwYWdlPC9hPiBhcHBlYXJzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbnRlciBhIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+UHJvamVjdCBuYW1lPC9zcGFuPiAoc3VjaCBhcyA8Y29kZT5RdWlja1N0YXJ0PC9jb2RlPikuPC9wPgotPC9saT4KLTxsaT4KLTxwPklmIG5lZWRlZCwgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFyZ2V0IFJ1bnRpbWU8L3NwYW4+IChzdWNoIGFzIDxjb2RlPkFwYWNoZSBUb21jYXQ8L2NvZGU+KSBhbmQgY29uZmlndXJhdGlvbiwgc3VjaCBhcyA8c3BhbiBjbGFzcz0iYm9sZCI+VXRpbGl0eSBKUEEgUHJvamVjdCB3aXRoIEphdmEgNS4wPC9zcGFuPiBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSBKYXZhIHNvdXJjZSBwYWdlIGFwcGVhcnMuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGUgVGFyZ2V0IFJ1bnRpbWUgaXMgbm90IHJlcXVpcmVkIGZvciBKYXZhIFNFIGRldmVsb3BtZW50LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9saT4KLTxsaT4KLTxwPklmIHlvdSBoYXZlIGV4aXN0aW5nIEphdmEgc291cmNlIGZpbGVzLCBhZGQgdGhlbSB0byB5b3VyIGNsYXNzcGF0aCBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+IGFwcGVhcnMuPC9wPgotPC9saT4KLTxsaT4KLTxwPk9uIHRoZSBKUEEgRmFjZXQgZGlhbG9nLCBzZWxlY3QgeW91ciB2ZW5kb3Itc3BlY2lmaWMgSlBBIHBsYXRmb3JtIChvciBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyaWM8L3NwYW4+KSwgZGF0YWJhc2UgY29ubmVjdGlvbiAob3IgY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24pLCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSAoc3VjaCBhcyBFY2xpcHNlTGluayksIGRlZmluZSBob3cgRGFsaSBzaG91bGQgbWFuYWdlIHBlcnNpc3RlbnQgY2xhc3NlcywgYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbmlzaDwvc3Bhbj4uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSB0aGUgRGVmYXVsdCBTY2hlbWEgZm9yIENvbm5lY3Rpb248L3NwYW4+IGlmIHlvdSByZXF1aXJlIGEgc2NoZW1hIG90aGVyIHRoYW4gdGhlIG9uZSB0aGF0IERhbGkgZGVyaXZlcyBmcm9tIHRoZSBjb25uZWN0aW9uIGluZm9ybWF0aW9uLCB3aGljaCBtYXkgYmUgaW5jb3JyZWN0IGluIHNvbWUgY2FzZXMuIFVzaW5nIHRoaXMgb3B0aW9uLCB5b3UgY2FuIHNlbGVjdCBhIGRldmVsb3BtZW50IHRpbWUgc2NoZW1hIGZvciBkZWZhdWx0cyBhbmQgdmFsaWRhdGlvbi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgcHJvamVjdCB0byB0aGUgd29ya2JlbmNoIGFuZCBvcGVucyB0aGUgSlBBIHBlcnNwZWN0aXZlLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjEwIiBuYW1lPSJzdGhyZWYxMCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkpQQSBQcm9qZWN0IGluIFByb2plY3QgRXhwbG9yZXI8L3A+Ci08aW1nIHNyYz0iaW1nL3F1aWNrc3RhcnRfcHJvamVjdC5wbmciIGFsdD0iUGFja2FnZSBFeHBsb3JlciBzaG93aW5nIHRoZSBKUEEgcHJvamVjdC4iIHRpdGxlPSJQYWNrYWdlIEV4cGxvcmVyIHNob3dpbmcgdGhlIEpQQSBwcm9qZWN0LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD5Ob3cgdGhhdCB5b3UgaGF2ZSBjcmVhdGVkIGEgcHJvamVjdCB3aXRoIHBlcnNpc3RlbmNlLCB5b3UgY2FuIGNvbnRpbnVlIHdpdGggPGEgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSNCQUJGR0RERyI+Q3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHM8L2E+LjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0OWVhNzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkZHRERHIiBuYW1lPSJCQUJGR0RERyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjExIiBuYW1lPSJzdGhyZWYxMSI+PC9hPlRoaXMgcXVpY2sgc3RhcnQgc2hvd3MgaG93IHRvIGNyZWF0ZSBhIG5ldyBwZXJzaXN0ZW50IEphdmEgZW50aXR5LiBXZSB3aWxsIGNyZWF0ZSBhbiBlbnRpdHkgdG8gYXNzb2NpYXRlIHdpdGggYSBkYXRhYmFzZSB0YWJsZS4gWW91IHdpbGwgYWxzbyBuZWVkIHRvIGFkZCB0aGUgQUREUkVTUyB0YWJsZSB0byB5b3VyIGRhdGFiYXNlLjwvcD4KLTxvbD4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgSlBBIHByb2plY3QgaW4gdGhlIE5hdmlnYXRvciBvciBQcm9qZWN0IEV4cGxvcmVyIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXcgJmd0OyBPdGhlcjwvc3Bhbj4uIFRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIGFwcGVhcnMuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SlBBICZndDsgRW50aXR5PC9zcGFuPiBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfRW50aXR5Q2xhc3NQYWdlLmh0bSNDSUFGRUlHRiI+RW50aXR5IENsYXNzIHBhZ2U8L2E+IGFwcGVhcnMuPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIHRoZSBwYWNrYWdlIG5hbWUgKHN1Y2ggYXMgPGNvZGU+cXVpY2tzdGFydC5kZW1vLm1vZGVsPC9jb2RlPiksIHRoZSBjbGFzcyBuYW1lIChzdWNoIGFzIDxjb2RlPkFkZHJlc3M8L2NvZGU+KSBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfRW50aXR5UHJvcGVydGllc1BhZ2UuaHRtI0NJQURFQ0lBIj5FbnRpdHkgUHJvcGVydGllcyBwYWdlPC9hPiBhcHBlYXJzLCB3aGljaCBlbmFibGVzIHlvdSB0byBkZWZpbmUgdGhlIHBlcnNpc3RlbmNlIGZpZWxkcywgd2hpY2ggeW91IHdpbGwgbWFwIHRvIHRoZSBjb2x1bW5zIG9mIGEgZGF0YWJhc2UgdGFibGUuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGlkPSJzdGhyZWYxMiIgbmFtZT0ic3RocmVmMTIiPjwvYT48YSBpZD0ic3RocmVmMTMiIG5hbWU9InN0aHJlZjEzIj48L2E+VXNlIHRoZSBFbnRpdHkgRmllbGRzIGRpYWxvZyAoaW52b2tlZCBieSBjbGlja2luZyA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPikgdG8gYWRkIHBlcnNpc3RlbmNlIGZpZWxkcyB0byB0aGUgQWRkcmVzcyBjbGFzczo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1wcml2YXRlIExvbmcgaWQ7Ci1wcml2YXRlIFN0cmluZyBjaXR5OwotcHJpdmF0ZSBTdHJpbmcgY291bnRyeTsKLXByaXZhdGUgU3RyaW5nIHN0YXRlT3JQcm92aW5jZTsKLXByaXZhdGUgU3RyaW5nIHBvc3RhbENvZGU7Ci1wcml2YXRlIFN0cmluZyBzdHJlZXQ7Ci08L3ByZT4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotWW91IHdpbGwgYWxzbyBuZWVkIHRvIGFkZCB0aGUgZm9sbG93aW5nIGNvbHVtbnMgdG8gdGhlIEFERFJFU1MgZGF0YWJhc2UgdGFibGU6Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1OVU1CRVIoMTAsMCkgQUREUkVTU19JRCAocHJpbWFyeSBrZXkpCi1WQVJDSEFSMig4MCkgUFJPVklOQ0UKLVZBUkNIQVIyKDgwKSBDT1VOVFJZCi1WQVJDSEFSMigyMCkgUF9DT0RFCi1WQVJDSEFSMig4MCkgU1RSRUVUCi1WQVJDSEFSMig4MCkgQ0lUWQotPC9wcmU+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci08L3ByZT48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi4gV2l0aCB0aGUgQ3JlYXRlIEpQQSBFbnRpdHkgY29tcGxldGVkLCBFY2xpcHNlIGRpc3BsYXlzIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkcmVzczwvc3Bhbj4gZW50aXR5IGluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcuPC9wPgotPHA+QWRkcmVzcy5qYXZhIGluY2x1ZGVzIHRoZSA8Y29kZT5ARW50aXR5PC9jb2RlPiBhbm5vdGF0aW9uLCB0aGUgcGVyc2lzdGVuY2UgZmllbGRzLCBhcyB3ZWxsIGFzIDxjb2RlPmdldHRlcjwvY29kZT4gYW5kIDxjb2RlPnNldHRlcjwvY29kZT4gbWV0aG9kcyBmb3IgZWFjaCBvZiB0aGUgZmllbGRzLjwvcD4KLTwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTQiIG5hbWU9InN0aHJlZjE0Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+QWRkcmVzcyBFbnRpdHkgaW4gQWRkcmVzcy5qYXZhPC9wPgotPGltZyBzcmM9ImltZy9qYXZhX2VkaXRvcl9hZGRyZXNzLnBuZyIgYWx0PSJKYXZhIGVkaXRvciB3aXRoIHRoZSBBZGRyZXNzIGVudGl0eS4iIHRpdGxlPSJKYXZhIGVkaXRvciB3aXRoIHRoZSBBZGRyZXNzIGVudGl0eS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+RWNsaXBzZSBhbHNvIGRpc3BsYXlzIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkcmVzczwvc3Bhbj4gZW50aXR5IGluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXc6PC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTUiIG5hbWU9InN0aHJlZjE1Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+QWRkcmVzcyBFbnRpdHkgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgVmlldzwvcD4KLTxpbWcgc3JjPSJpbWcvYWRkcmVzc19qYXZhX0pQQV9zdHJ1Y3R1cmVfcXVpY2tzdGFydC5wbmciIGFsdD0iQWRkcmVzcy5qYXZhIGluIHRoZSBKUEEgU3RydWN0dXJlIFZpZXcuIiB0aXRsZT0iQWRkcmVzcy5qYXZhIGluIHRoZSBKUEEgU3RydWN0dXJlIFZpZXcuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxvbD4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5BZGRyZXNzPC9zcGFuPiBjbGFzcyBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LCBub3RpY2UgdGhhdCBEYWxpIGhhcyBhdXRvbWF0aWNhbGx5IGFzc29jaWF0ZWQgdGhlIEFERFJFU1MgZGF0YWJhc2UgdGFibGUgd2l0aCB0aGUgZW50aXR5IGJlY2F1c2UgdGhleSBhcmUgbmFtZWQgaWRlbnRpY2FsbHkuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1EZXBlbmRpbmcgb24geW91ciBkYXRhYmFzZSBjb25uZWN0aW9uIHR5cGUsIHlvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+U2NoZW1hPC9zcGFuPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE2IiBuYW1lPSJzdGhyZWYxNiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkpQQSBEZXRhaWxzIFZpZXcgZm9yIEFkZHJlc3MgRW50aXR5PC9wPgotPGltZyBzcmM9ImltZy9hZGRyZXNzLmphdmFfanBhX2RldGFpbHMucG5nIiBhbHQ9IkFkZHJlc3MuamF2YSBpbiB0aGUgSlBBIERldGFpbHMgdmlldy4iIHRpdGxlPSJBZGRyZXNzLmphdmEgaW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPC9vbD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGVBbHNvIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+VGlwOjwvcD4KLUFmdGVyIGFzc29jaWF0aW5nIHRoZSBlbnRpdHkgd2l0aCB0aGUgZGF0YWJhc2UgdGFibGUsIHlvdSBzaG91bGQgdXBkYXRlIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgdG8gaW5jbHVkZSB0aGlzIEpQQSBlbnRpdHkuCi08cD5SaWdodC1jbGljayB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkpQQSBUb29scyAmZ3Q7IFN5bmNocm9uaXplIENsYXNzIExpc3Q8L3NwYW4+LiBEYWxpIGFkZHMgdGhlIGZvbGxvd2luZyB0byB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlOjwvcD4KLTxwPjxjb2RlPiZsdDtjbGFzcyZndDtxdWlja3N0YXJ0LmRlbW8ubW9kZWwuQWRkcmVzcyZsdDsvY2xhc3MmZ3Q7PC9jb2RlPjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGVhbHNvIiAtLT48L2Rpdj4KLTxwPk5vdyB3ZSBhcmUgcmVhZHkgdG8gbWFwIGVhY2ggZmllbGRzIGluIHRoZSBBZGRyZXNzIGNsYXNzIHRvIGEgY29sdW1uIGluIHRoZSBkYXRhYmFzZSB0YWJsZS48L3A+Ci08b2w+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+aWQ8L3NwYW4+IGZpZWxkIGluIHRoZSBKUEEgRGV0YWlscyB2aWV3LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodCBjbGljayBpZCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IGlkPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+SW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+QUREUkVTU19JRDwvc3Bhbj4gaW4gdGhlIE5hbWUgZmllbGQ6PC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTciIG5hbWU9InN0aHJlZjE3Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+SlBBIERldGFpbHMgVmlldyBmb3IgdGhlIGFkZHJlc3NJZCBGaWVsZDwvcD4KLTxpbWcgc3JjPSJpbWcvYWRkcmVzc19pZF9kZXRhaWxzX3F1aWNrc3RhcnQucG5nIiBhbHQ9IlRoZSBKUEEgRGV0YWlscyB2aWV3IGZvciB0aGUgQWRkcmVzcyBlbnRpdHkmcnNxdW87cyBpZCBhdHRyaWJ1dGUuIiB0aXRsZT0iVGhlIEpQQSBEZXRhaWxzIHZpZXcgZm9yIHRoZSBBZGRyZXNzIGVudGl0eSZyc3F1bztzIGlkIGF0dHJpYnV0ZS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIEFkZHJlc3MgZW50aXR5OjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBJZAotQENvbHVtbihuYW1lPSJBRERSRVNTX0lEIikKLTwvcHJlPjwvbGk+Ci08bGk+Ci08cD5NYXAgZWFjaCBvZiB0aGUgZm9sbG93aW5nIGZpZWxkcyAoYXMgPHNwYW4gY2xhc3M9ImJvbGQiPkJhc2ljPC9zcGFuPiBtYXBwaW5ncykgdG8gdGhlIGFwcHJvcHJpYXRlIGRhdGFiYXNlIGNvbHVtbjo8L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxocnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSFJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBtYXBwaW5ncyBmb3IgZWFjaCBvZiB0aGUgZmllbGRzIGluIHRoZSBBZGRyZXNzIGVudGl0eS4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBtYXBwaW5ncyBmb3IgZWFjaCBvZiB0aGUgZmllbGRzIGluIHRoZSBBZGRyZXNzIGVudGl0eS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjMzJSIgLz4KLTxjb2wgd2lkdGg9IjMzJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDgiPkZpZWxkPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ4Ij5NYXAgQXM8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDgiPkRhdGFiYXNlIENvbHVtbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10OCIgaGVhZGVycz0icjFjMS10OCI+Y2l0eTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDggcjFjMi10OCI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ4IHIxYzMtdDgiPkNJVFk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10OCIgaGVhZGVycz0icjFjMS10OCI+Y291bnRyeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDggcjFjMi10OCI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ4IHIxYzMtdDgiPkNPVU5UUlk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10OCIgaGVhZGVycz0icjFjMS10OCI+cG9zdGFsQ29kZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDggcjFjMi10OCI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ4IHIxYzMtdDgiPlBfQ09ERTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5wcm92aW5jZU9yU3RhdGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ4IHIxYzItdDgiPkJhc2ljPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10OCByMWMzLXQ4Ij5QUk9WSU5DRTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5zdHJlZXQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ4IHIxYzItdDgiPkJhc2ljPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10OCByMWMzLXQ4Ij5TVFJFRVQ8L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxocnVsZWluZm9ybWFsIiAtLT48L2xpPgotPC9vbD4KLTxwPkRhbGkgYXV0b21hdGljYWxseSBtYXBzIHNvbWUgZmllbGRzIHRvIHRoZSBjb3JyZWN0IGRhdGFiYXNlIGNvbHVtbiAoc3VjaCBhcyB0aGUgY2l0eSBmaWVsZCB0byB0aGUgQ2l0eSBjb2x1bW4pIGlmIHRoZSBuYW1lcyBhcmUgaWRlbnRpY2FsLjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzcy5qYXZhX2pwYV9kZXRhaWxzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzcy5qYXZhX2pwYV9kZXRhaWxzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjZjAwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3MuamF2YV9qcGFfZGV0YWlscy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3NfaWRfZGV0YWlsc19xdWlja3N0YXJ0LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzc19pZF9kZXRhaWxzX3F1aWNrc3RhcnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWY0MGNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzc19pZF9kZXRhaWxzX3F1aWNrc3RhcnQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzX2phdmFfSlBBX3N0cnVjdHVyZV9xdWlja3N0YXJ0LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzc19qYXZhX0pQQV9zdHJ1Y3R1cmVfcXVpY2tzdGFydC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZjUxYTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzX2phdmFfSlBBX3N0cnVjdHVyZV9xdWlja3N0YXJ0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM2MGUwYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2NyZWF0ZV9qcGFfZmllbGRzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9maWVsZHMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTc5N2E4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9maWVsZHMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jdXN0b21pemVfZGVmYXVsdF9lbnRpdHlfZ2VuZXJhdGlvbi5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2N1c3RvbWl6ZV9kZWZhdWx0X2VudGl0eV9nZW5lcmF0aW9uLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU2NzYxNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2N1c3RvbWl6ZV9kZWZhdWx0X2VudGl0eV9nZW5lcmF0aW9uLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3VzdG9taXplX2luZGl2aWR1YWxfZW50aXRpZXMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jdXN0b21pemVfaW5kaXZpZHVhbF9lbnRpdGllcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzN2JkZWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jdXN0b21pemVfaW5kaXZpZHVhbF9lbnRpdGllcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2RldGFpbHNfZW50aXR5bWFwcGluZ3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9kZXRhaWxzX2VudGl0eW1hcHBpbmdzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2MzAwZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2RldGFpbHNfZW50aXR5bWFwcGluZ3MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9lcnJvcl9zYW1wbGUucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9lcnJvcl9zYW1wbGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTQ5NjQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZXJyb3Jfc2FtcGxlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZ2VuZXJhdGVfY2xhc3Nlc19mcm9tX3NjaGVtYS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTExZDAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZ2VuZXJhdGVfY2xhc3Nlc19mcm9tX3NjaGVtYS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2dlbmVyYXRlX2VudGl0aWVzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZ2VuZXJhdGVfZW50aXRpZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGFhMjVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZ2VuZXJhdGVfZW50aXRpZXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pY29uX2Jhc2ljbWFwbWFwcGluZ3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pY29uX2Jhc2ljbWFwbWFwcGluZ3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmVlZjNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaWNvbl9iYXNpY21hcG1hcHBpbmdzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaWNvbl9iYXNpY21hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pY29uX2Jhc2ljbWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOTM3NTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pY29uX2Jhc2ljbWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX2pvaW4ucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV9qb2luLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJiNjg3NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX2pvaW4ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV9zaW5nbGUucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV9zaW5nbGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTQ2NDgyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2Vfc2luZ2xlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2VfdGFiLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2VfdGFiLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc2ZGQ5Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX3RhYi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2phdmFfZWRpdG9yX2FkZHJlc3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9qYXZhX2VkaXRvcl9hZGRyZXNzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0Mjg5MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2phdmFfZWRpdG9yX2FkZHJlc3MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9qYXhiX3NjaG1lYV9nZW5lcmF0aW9uX2RpYWxvZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2pheGJfc2NobWVhX2dlbmVyYXRpb25fZGlhbG9nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzliMjIyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2pheGJfc2NobWVhX2dlbmVyYXRpb25fZGlhbG9nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvanBhX3dpemFyZF9jcmVhdGVfZmllbGRzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvanBhX3dpemFyZF9jcmVhdGVfZmllbGRzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA1NTBlYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2pwYV93aXphcmRfY3JlYXRlX2ZpZWxkcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBlZF9lbnRpdHlfdHlwZV9saW5rLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGVkX2VudGl0eV90eXBlX2xpbmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjYxNjAzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGVkX2VudGl0eV90eXBlX2xpbmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX2ZpbGVfbmV3LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ19maWxlX25ldy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNTU3NDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX2ZpbGVfbmV3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbWJlZC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fZW1iZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODZlYTZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbWJlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fZW50aXR5LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbnRpdHkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjA0ZmQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbnRpdHkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX3N1cGVyY2xhc3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX3N1cGVyY2xhc3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjhlOGZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9zdXBlcmNsYXNzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbW9kaWZ5X2ZhY2V0ZWRfcHJvamVjdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21vZGlmeV9mYWNldGVkX3Byb2plY3QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGM3OTY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbW9kaWZ5X2ZhY2V0ZWRfcHJvamVjdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2Jhc2ljbWFwcGluZ3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9iYXNpY21hcHBpbmdzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwYjdmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2Jhc2ljbWFwcGluZ3MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRhYmxlZW50aXR5bWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGFibGVlbnRpdHltYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyOTRlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGFibGVlbnRpdHltYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fZW1iZWRkZWRpZG1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRlZGlkbWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZTlkYzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRlZGlkbWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGVkbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGVkbWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZDUyYjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRlZG1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9pZG1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9pZG1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGVmYjVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25faWRtYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFueXRvbWFueW1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYW55dG9tYW55bWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViODAyMmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYW55dG9tYW55bWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hbnl0b29uZW1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYW55dG9vbmVtYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NhY2MxOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hbnl0b29uZW1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYXBwZWRlbnRpdHkucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYXBwZWRlbnRpdHkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOThlYTJjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFwcGVkZW50aXR5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFwcGVkc3VwZXJjbGFzcy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hcHBlZHN1cGVyY2xhc3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzk3Y2ViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFwcGVkc3VwZXJjbGFzcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX29uZXRvbWFueW1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9vbmV0b21hbnltYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRkYzk4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX29uZXRvbWFueW1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9vbmV0b29uZW1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9vbmV0b29uZW1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGQ5YmJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fb25ldG9vbmVtYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdHJhbnNpZW50bWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX3RyYW5zaWVudG1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTA0ODhmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdHJhbnNpZW50bWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX3ZlcnNpb25tYXBwaW5nLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdmVyc2lvbm1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODczNzEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdmVyc2lvbm1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX2ZhY2V0X3Rhc2sucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX2ZhY2V0X3Rhc2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjA3ODA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9mYWNldF90YXNrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9wZXJzcGVjdGl2ZV9idXR0b24ucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX3BlcnNwZWN0aXZlX2J1dHRvbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NDI1YWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX3BlcnNwZWN0aXZlX2J1dHRvbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19qcGFfcHJvamVjdF90YXNrLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9wcm9qZWN0X3Rhc2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjA3OWMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9wcm9qZWN0X3Rhc2sucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbGMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbGMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODM4MWE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWxjLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWxyLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWxyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJiYzc0NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYWYyMWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wZXJzaXN0ZW5jZV9vdXRsaW5lX3ZpZXcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wZXJzaXN0ZW5jZV9vdXRsaW5lX3ZpZXcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjlhYTgyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcGVyc2lzdGVuY2Vfb3V0bGluZV92aWV3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcHJvamVjdF9wcm9wZXJ0aWVzX3Rhc2tzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcHJvamVjdF9wcm9wZXJ0aWVzX3Rhc2tzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc1NTdlZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3Byb2plY3RfcHJvcGVydGllc190YXNrcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3F1aWNrc3RhcnRfcHJvamVjdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3F1aWNrc3RhcnRfcHJvamVjdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4Y2EwNTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9xdWlja3N0YXJ0X3Byb2plY3QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWNvbmRhcnlfdGFibGVzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2Vjb25kYXJ5X3RhYmxlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MWY5ZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWNvbmRhcnlfdGFibGVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX2VudGl0eS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9lbnRpdHkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ViZTkwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX2VudGl0eS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9qcGFfcHJvamVjdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9qcGFfcHJvamVjdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MjM1MDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfYV93aXphcmRfanBhX3Byb2plY3QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfYV93aXphcmRfbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9tYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5YzlkMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9tYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2pheGJfc2NoZW1hX3dpemFyZC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9qYXhiX3NjaGVtYV93aXphcmQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODdlNjFjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2pheGJfc2NoZW1hX3dpemFyZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF90YWJsZXMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfdGFibGVzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU3YzkzMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF90YWJsZXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zeW5jaG9ybml6ZV9jbGFzc2VzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc3luY2hvcm5pemVfY2xhc3Nlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNTlmNjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zeW5jaG9ybml6ZV9jbGFzc2VzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFibGVfYXNzb2NpYXRpb25zLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFibGVfYXNzb2NpYXRpb25zLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjViNDBiZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3RhYmxlX2Fzc29jaWF0aW9ucy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3RhYmxlX2VudGl0eS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3RhYmxlX2VudGl0eS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYTFkYmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy90YWJsZV9lbnRpdHkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy90YXNrX2VudGVyaW5nX3F1ZXJ5LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFza19lbnRlcmluZ19xdWVyeS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YmVhY2ViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFza19lbnRlcmluZ19xdWVyeS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3VwZ3JhZGVfcGVyc2lzdGVuY2VfanBhX3ZlcnNpb24ucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy91cGdyYWRlX3BlcnNpc3RlbmNlX2pwYV92ZXJzaW9uLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmYTRkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3VwZ3JhZGVfcGVyc2lzdGVuY2VfanBhX3ZlcnNpb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2luZGV4LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZjliZWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+Ci08aW5kZXggdmVyc2lvbj0iMS4wIj4KLSAgPGVudHJ5IGtleXdvcmQ9IkBCYXNpYyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkJhc2ljIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMC5odG0jc3RocmVmMTE2IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJAQ29sdW1uIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI0NSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQERpc2NyaW1pbmF0b3JDb2x1bW4iPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjk2IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA5Lmh0bSNzdGhyZWYyMzkiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBEaXNjcmltaW5hdG9yVmFsdWUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjk4IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA5Lmh0bSNzdGhyZWYyMzciIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBFbWJlZGRhYmxlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkYWJsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA3Lmh0bSNzdGhyZWY4MSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQEVtYmVkZGVkIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkZWQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDExLmh0bSNzdGhyZWYxMjAiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBFbWJlZGRlZElkIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkZWQgSUQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEyLmh0bSNzdGhyZWYxMjQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBFbnRpdHkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrczAwNi5odG0jc3RocmVmNzQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBFbnVtZXJhdGVkIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI1NSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQEdlbmVyYXRlZFZhbHVlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0jc3RocmVmMjY1IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJASWQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJJRCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTMuaHRtI3N0aHJlZjEyOCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQEluaGVyaXRhbmNlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWY5NCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQEpvaW5Db2x1bW4iPgotICAgIDxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTUuaHRtI3N0aHJlZjEzOSIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJPbmUtdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNy5odG0jc3RocmVmMTQ5IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpvaW4gVGFibGUgSW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTEuaHRtI3N0aHJlZjI2MSIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJKb2luIENvbHVtbnMgSW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTIuaHRtI3N0aHJlZjI2NCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQExvYiI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNTAiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBNYW55VG9NYW55Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNC5odG0jc3RocmVmMTMyIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJATWFueVRvT25lIj4KLSAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE1Lmh0bSNzdGhyZWYxMzciIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBNYXBwZWRTdXBlcmNsYXNzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iTWFwcGVkIHN1cGVyY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jc3RocmVmODgiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBOYW1lZFF1ZXJ5Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgTmFtZWQgUXVlcmllcyI+PHRvcGljIGhyZWY9InRhc2tzMDA5Lmh0bSNzdGhyZWYxMDgiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBPbmVUb01hbnkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJPbmUtdG8tbWFueSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTYuaHRtI3N0aHJlZjE0MiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQE9uZVRvT25lIj4KLSAgICA8ZW50cnkga2V5d29yZD0iT25lLXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI3N0aHJlZjE0NiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQE9yZGVyQnkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjU5IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJAU2VxdWVuY2VHZW5lcmF0b3IiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNzdGhyZWYyNjciIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBUZW1wb3JhbCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNTIiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBUcmFuc2llbnQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJUcmFuc2llbnQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE4Lmh0bSNzdGhyZWYxNTIiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBWZXJzaW9uIj4KLSAgICA8ZW50cnkga2V5d29yZD0iVmVyc2lvbiBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTkuaHRtI3N0aHJlZjE1NiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iYXJjaGl0ZWN0dXJlIG9mIERhbGkgZmVhdHVyZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMzMuaHRtI3N0aHJlZjMwMyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iYXNzb2NpYXRpb24gdGFibGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRlIE5ldyBBc3NvY2lhdGlvbiI+PHRvcGljIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jc3RocmVmMjIxIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJhdHRyaWJ1dGUgb3ZlcnJpZGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQXR0cmlidXRlIG92ZXJyaWRlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwNy5odG0jc3RocmVmMjI4IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJBdHRyaWJ1dGUgT3ZlcnJpZGVzIC0gaW4gSmF2YSBEZXRhaWxzIHZpZXciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJBdHRyaWJ1dGUgb3ZlcnJpZGVzIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA3Lmh0bSNzdGhyZWYyMzAiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImF0dHJpYnV0ZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRGV0YWlscyB2aWV3Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI3N0aHJlZjI0NCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hcHBpbmciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiPjx0b3BpYyBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI3N0aHJlZjIxIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImJhc2ljIG1hcHBpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJAQmFzaWMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkJhc2ljIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMC5odG0jc3RocmVmMTE3IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkJhc2ljIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMC5odG0jc3RocmVmMTE1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iKFNlZSBhbHNvIG1hcHBpbmdzKSI+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImNhY2hpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJDYWNoaW5nIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDIwLmh0bSNzdGhyZWYyNzgiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImNhbm9uaWNhbCBtZXRhbW9kZWwiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI3N0aHJlZjI5OCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iY2FyZGluYWxpdHkgLSBhc3NvY2lhdGlvbiB0YWJsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJBc3NvY2lhdGlvbiBDYXJkaW5hbGl0eSI+PHRvcGljIGhyZWY9InJlZl9hc3NvY2lhdGlvbl9jYXJkaW5hbGl0eS5odG0jc3RocmVmMjI0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJjbGFzc2VzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIHBlcnNpc3RlbmNlIHRvIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNzdGhyZWY2OSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGFibGUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGFibGUiPjx0b3BpYyBocmVmPSJ0YXNrczAwNy5odG0jc3RocmVmODAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbnRpdHkiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNzdGhyZWY3MiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImdlbmVyYXRpbmcgc2NoZW1hIGZyb20iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgU2NoZW1hIGZyb20gQ2xhc3NlcyI+PHRvcGljIGhyZWY9InRhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSNzdGhyZWYxOTAiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hIj48dG9waWMgaHJlZj0idGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bSNzdGhyZWYxOTgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYW5hZ2VkIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNTAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYW5hZ2luZyBwZXJzaXN0ZW50IGNsYXNzZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBGYWNldCBwYWdlIj48dG9waWMgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jc3RocmVmMjA3IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ibWFwcGVkIHN1cGVyY2xhc3MiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hcHBlZCBzdXBlcmNsYXNzIj48dG9waWMgaHJlZj0idGFza3MwMDguaHRtI3N0aHJlZjg2IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic3luY2hyb25pemluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU3luY2hyb25pemluZyBjbGFzc2VzIj48dG9waWMgaHJlZj0idGFza3MwMDIuaHRtI3N0aHJlZjUyIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImNvbHVtbnMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJkaXNjcmltaW5hdG9yIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjk3IiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI3N0aHJlZjI0MCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImpvaW4iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hbnktdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNS5odG0jc3RocmVmMTM4IiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iT25lLXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI3N0aHJlZjE0OCIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpvaW4gVGFibGUgSW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTEuaHRtI3N0aHJlZjI2MCIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jc3RocmVmMjYzIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ibWFwcGluZyB0byI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI0NiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InZhbHVlIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjk5IiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI3N0aHJlZjIzOCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJjb25uZWN0aW9uIHBvb2wiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNTEiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImNvbnZlcnRpbmcgSmF2YSBwcm9qZWN0IHRvIEpQQSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkNvbnZlcnRpbmcgYSBKYXZhIFByb2plY3QgdG8gYSBKUEEgUHJvamVjdCI+PHRvcGljIGhyZWY9InRhc2tzMDAxLmh0bSNzdGhyZWYzNyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQ3JlYXRlIGEgSlBBIFByb2plY3QgV2l6YXJkIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiPjx0b3BpYyBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jc3RocmVmMjkiIC8+PC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhdGluZyBTY2hlbWEgZnJvbSBDbGFzc2VzIj48dG9waWMgaHJlZj0idGFza19nZW5lcmF0aW5nX3NjaGVtYV9mcm9tX2NsYXNzZXMuaHRtI3N0aHJlZjE5NCIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hIj48dG9waWMgaHJlZj0idGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bSNzdGhyZWYyMDIiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQiPjx0b3BpYyBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jc3RocmVmMjA0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJkYXRhYmFzZSB0YWJsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0aW5nIGVudGl0aWVzIGZyb20iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMS5odG0jc3RocmVmMTYxIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImRhdGFiYXNlIC0gcGVyc2lzdGVuY2UiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb25uZWN0aW9uIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI3N0aHJlZjI5MyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNjaGVtYSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBWYWxpZGF0aW9uIFByZWZlcmVuY2VzIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDI3Lmh0bSNzdGhyZWYyOTUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZGVyaXZlZCBJRCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNTciIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImRldmVsb3BlciBkb2N1bWVudGF0aW9uIC0gRGFsaSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMzMuaHRtI3N0aHJlZjMwMiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZWFnZXIgZmV0Y2giPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjQ4IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlbWJlZGRhYmxlIGNsYXNzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQEVtYmVkZGFibGUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGFibGUiPjx0b3BpYyBocmVmPSJ0YXNrczAwNy5odG0jc3RocmVmODIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkYWJsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA3Lmh0bSNzdGhyZWY3OSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlbWJlZGRlZCBJRCBtYXBwaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQEVtYmVkZGVkSWQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGVkIElEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMi5odG0jc3RocmVmMTI1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGVkIElEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMi5odG0jc3RocmVmMTIzIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGVkIG1hcHBpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJARW1iZWRkZWQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGVkIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMS5odG0jc3RocmVmMTIxIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGVkIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMS5odG0jc3RocmVmMTE5IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImVudGl0aWVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQEVudGl0eSBhbm5vdGF0aW9uIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrczAwNi5odG0jc3RocmVmNzUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlIj48dG9waWMgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jc3RocmVmMjAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgYSBKUEEgRW50aXR5Ij48dG9waWMgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jc3RocmVmNDAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjdXN0b21pemluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3VzdG9taXplIEluZGl2aWR1YWwgRW50aXRpZXMiPjx0b3BpYyBocmVmPSJyZWZfY3VzdG9taXpJbmRpdmlkdWFsRW50aXRpZXMuaHRtI3N0aHJlZjIyMCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGFibGUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGFibGUiPjx0b3BpYyBocmVmPSJ0YXNrczAwNy5odG0jc3RocmVmODMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJmcm9tIHRhYmxlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyI+PHRvcGljIGhyZWY9InRhc2tzMDIxLmh0bSNzdGhyZWYxNTgiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTZWxlY3QgVGFibGVzIj48dG9waWMgaHJlZj0icmVmX3NlbGVjdFRhYmxlcy5odG0jc3RocmVmMjE2IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZ2VuZXJhdGluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3VzdG9taXplIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24uaHRtI3N0aHJlZjIxOSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNzdGhyZWYyMjciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYXBwZWQgc3VwZXJjbGFzcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFwcGVkIHN1cGVyY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jc3RocmVmODkiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYXBwaW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkcyI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwNC5odG0jc3RocmVmMTMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwZXJzaXN0ZW5jZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHMiPjx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtI3N0aHJlZjExIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icGVyc2lzdGVudCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW50aXR5Ij48dG9waWMgaHJlZj0idGFza3MwMDYuaHRtI3N0aHJlZjcwIiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW50aXR5Ij48dG9waWMgaHJlZj0idGFza3MwMDYuaHRtI3N0aHJlZjc2IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2Vjb25kYXJ5IHRhYmxlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA4Lmh0bSNzdGhyZWYyMzMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iRW50aXR5IENsYXNzIHBhZ2UiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTZWxlY3RpbmcgdGhlIENyZWF0ZSBhIEpQQSBFbnRpdHkgV2l6YXJkIj48dG9waWMgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jc3RocmVmNDMiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSBQcm9wZXJ0aWVzIHBhZ2UiPgotICAgIDxlbnRyeSBrZXl3b3JkPSImbHQ7YSBpZD0mcXVvdDtzdGhyZWY0MyZxdW90OyBuYW1lPSZxdW90O3N0aHJlZjQzJnF1b3Q7Jmd0OyZsdDsvYSZndDtUaGUgRW50aXR5IENsYXNzIFBhZ2UiPjx0b3BpYyBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNzdGhyZWY0NSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZW51bWVyYXRlZCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNTQiIC8+PC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI1NiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZXJyb3IgbWVzc2FnZXMgLSBEYWxpIj4KLSAgICA8ZW50cnkga2V5d29yZD0iVmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zIj48dG9waWMgaHJlZj0idGFza3MwMjMuaHRtI3N0aHJlZjE2NyIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJFcnJvciBtZXNzYWdlcyI+PHRvcGljIGhyZWY9InRhc2tzMDI0Lmh0bSNzdGhyZWYxNzIiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImV4dGVuc2lvbiBwb2ludHMgLSBEYWxpIGZlYXR1cmUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJEYWxpIERldmVsb3BlciBEb2N1bWVudGF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDMzLmh0bSNzdGhyZWYzMDQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImZldGNoIHR5cGUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjQ3IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBkaWFsb2ciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIj48dG9waWMgaHJlZj0idGFza3MwMjEuaHRtI3N0aHJlZjE2MCIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJTZWxlY3QgVGFibGVzIj48dG9waWMgaHJlZj0icmVmX3NlbGVjdFRhYmxlcy5odG0jc3RocmVmMjE1IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0ZSBTY2hlbWEgZnJvbSBDbGFzc2VzIHdpemFyZCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgU2NoZW1hIGZyb20gQ2xhc3NlcyI+PHRvcGljIGhyZWY9InRhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSNzdGhyZWYxOTIiIC8+PC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhdGluZyBKQVhCIENsYXNzZXMgZnJvbSBhIFNjaGVtYSI+PHRvcGljIGhyZWY9InRhc2tfZ2VuZXJhdGVfY2xhc3Nlc19mcm9tX3NjaGVtYS5odG0jc3RocmVmMjAwIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0ZWQgdmFsdWVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iSUQgbWFwcGluZ3MiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI3N0aHJlZjI2NiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNlcXVlbmNlIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNzdGhyZWYyNjgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iaGludHMgLSBxdWVyeSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAwOS5odG0jc3RocmVmMTEwIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJJRCBtYXBwaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQElkIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJJRCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTMuaHRtI3N0aHJlZjEyOSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJJRCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTMuaHRtI3N0aHJlZjEyNyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJpbmhlcml0YW5jZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVudGl0eSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWY5MyIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSBDbGFzcyBwYWdlIj48dG9waWMgaHJlZj0icmVmX0VudGl0eUNsYXNzUGFnZS5odG0jc3RocmVmMjA5IiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI3N0aHJlZjIzNiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImpvaW5lZCB0YWJsZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlNpbmdsZSBUYWJsZSBJbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjEwNSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNpbmdsZSB0YWJsZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWYxMDAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgLSBpbiBKYXZhIERldGFpbHMgdmlldyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA5Lmh0bSNzdGhyZWYyMzUiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Imluc3RhbGxhdGlvbiAtIERhbGkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJSZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbiI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMS5odG0jc3RocmVmMyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSmF2YSBwcm9qZWN0IC0gY29udmVydGluZyB0byBKUEEiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJDb252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3QiPjx0b3BpYyBocmVmPSJ0YXNrczAwMS5odG0jc3RocmVmMzUiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkpBWEIiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIFNjaGVtYSBmcm9tIENsYXNzZXMiPjx0b3BpYyBocmVmPSJ0YXNrX2dlbmVyYXRpbmdfc2NoZW1hX2Zyb21fY2xhc3Nlcy5odG0jc3RocmVmMTkxIiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gYSBTY2hlbWEiPjx0b3BpYyBocmVmPSJ0YXNrX2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEuaHRtI3N0aHJlZjE5OSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iam9pbiBjb2x1bW5zIj4KLSAgICA8ZW50cnkga2V5d29yZD0iSm9pbiBDb2x1bW5zIj48dG9waWMgaHJlZj0icmVmX2pvaW5fY29sdW1ucy5odG0jc3RocmVmMjIzIiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jc3RocmVmMjYyIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJqb2luZWQgdGFibGVzIC0gaW5oZXJpdGFuY2UiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTaW5nbGUgVGFibGUgSW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWYxMDYiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI3N0aHJlZjI0MiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVudGl0aWVzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpIj48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jc3RocmVmMjI1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZSI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jc3RocmVmMzAwIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJKUEEgRmFjZXQgcGFnZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlRoZSBKYXZhIFNvdXJjZSBQYWdlIj48dG9waWMgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI3N0aHJlZjM0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJKUEEgcHJvamVjdCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNvbnZlcnRpbmcgZnJvbSBKYXZhIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDb252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3QiPjx0b3BpYyBocmVmPSJ0YXNrczAwMS5odG0jc3RocmVmMzYiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyBuZXciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0Ij48dG9waWMgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI3N0aHJlZjI3IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaW1wbGVtZW50YXRpb24iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBGYWNldCBwYWdlIj48dG9waWMgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jc3RocmVmMjA1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icGFnZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iJmx0O2EgaWQ9JnF1b3Q7c3RocmVmMjkmcXVvdDsgbmFtZT0mcXVvdDtzdGhyZWYyOSZxdW90OyZndDsmbHQ7L2EmZ3Q7U2VsZWN0aW5nIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQiPjx0b3BpYyBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jc3RocmVmMzEiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSImbHQ7YSBpZD0mcXVvdDtzdGhyZWYxOTQmcXVvdDsgbmFtZT0mcXVvdDtzdGhyZWYxOTQmcXVvdDsmZ3Q7Jmx0Oy9hJmd0O1NlbGVjdGluZyB0aGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIHdpemFyZCI+PHRvcGljIGhyZWY9InRhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSNzdGhyZWYxOTYiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwbGF0Zm9ybSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBWYWxpZGF0aW9uIFByZWZlcmVuY2VzIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDI3Lmh0bSNzdGhyZWYyOTIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSlBBIFN0cnVjdHVyZSB2aWV3Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iSlBBIFN0cnVjdHVyZSB2aWV3Ij48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI3N0aHJlZjI3MCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibGF6eSBmZXRjaCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNDkiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImxpYnJhcnkgLSBKUEEiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRmFjZXQgcGFnZSI+PHRvcGljIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI3N0aHJlZjIwNiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibWFueS10by1tYW55IG1hcHBpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJATWFueVRvTWFueSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNC5odG0jc3RocmVmMTMzIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hbnktdG8tbWFueSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTQuaHRtI3N0aHJlZjEzMSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYW55LXRvLW9uZSBtYXBwaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQE1hbnlUb09uZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE1Lmh0bSNzdGhyZWYxMzYiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE1Lmh0bSNzdGhyZWYxMzUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibWFwcGVkIHN1cGVyY2xhc3MiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJATWFwcGVkU3VwZXJjbGFzcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFwcGVkIHN1cGVyY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jc3RocmVmODciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFwcGVkIHN1cGVyY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jc3RocmVmODUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibWFwcGluZyBlbnRpdGllcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkNyZWF0aW5nIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB3aXRoIHBlcnNpc3RlbnQgZmllbGRzIj48dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSNzdGhyZWYxMiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibWFwcGluZyBmaWxlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iJmx0O2EgaWQ9JnF1b3Q7c3RocmVmNTgmcXVvdDsgbmFtZT0mcXVvdDtzdGhyZWY1OCZxdW90OyZndDsmbHQ7L2EmZ3Q7TWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA0Lmh0bSNzdGhyZWY2MSIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJFbnRpdHkgQ2xhc3MgcGFnZSI+PHRvcGljIGhyZWY9InJlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtI3N0aHJlZjIxMCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibWFwcGluZ3MiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyI+PHRvcGljIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jc3RocmVmMjIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJiYXNpYyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQmFzaWMgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEwLmh0bSNzdGhyZWYxMTQiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbWJlZGRlZCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkZWQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDExLmh0bSNzdGhyZWYxMTgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbWJlZGRlZCBJRCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkZWQgSUQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEyLmh0bSNzdGhyZWYxMjIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJJRCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSUQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEzLmh0bSNzdGhyZWYxMjYiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYW55LXRvLW1hbnkiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hbnktdG8tbWFueSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTQuaHRtI3N0aHJlZjEzMCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hbnktdG8tb25lIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTUuaHRtI3N0aHJlZjEzNCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im9uZS10by1tYW55Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJPbmUtdG8tbWFueSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTYuaHRtI3N0aHJlZjE0MCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im9uZS10by1vbmUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik9uZS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE3Lmh0bSNzdGhyZWYxNDQiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwcm9ibGVtcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zIj48dG9waWMgaHJlZj0idGFza3MwMjMuaHRtI3N0aHJlZjE3MCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InRyYW5zaWVudCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVHJhbnNpZW50IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxOC5odG0jc3RocmVmMTUwIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idmVyc2lvbiI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVmVyc2lvbiBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTkuaHRtI3N0aHJlZjE1NCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtZXRhbW9kZWwgLSBjYW5vbmljYWwiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI3N0aHJlZjI5OSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibmFtZWQgcXVlcmllcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVudGl0eSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgTmFtZWQgUXVlcmllcyI+PHRvcGljIGhyZWY9InRhc2tzMDA5Lmh0bSNzdGhyZWYxMDciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJoaW50cyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgTmFtZWQgUXVlcmllcyI+PHRvcGljIGhyZWY9InRhc2tzMDA5Lmh0bSNzdGhyZWYxMTEiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibmF0aXZlIHF1ZXJpZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBOYW1lZCBRdWVyaWVzIj48dG9waWMgaHJlZj0idGFza3MwMDkuaHRtI3N0aHJlZjExMiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibm9ucGVyc2lzdGVudCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNsYXNzZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIj48dG9waWMgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjY4IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZmllbGRzLiBTZWUgdHJhbnNpZW50Ij48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ib25lLXRvLW1hbnkgbWFwcGluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkBPbmVUb01hbnkiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik9uZS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNi5odG0jc3RocmVmMTQzIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik9uZS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNi5odG0jc3RocmVmMTQxIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im9uZS10by1vbmUgbWFwcGluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkBPbmVUb09uZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iT25lLXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI3N0aHJlZjE0NyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJPbmUtdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNy5odG0jc3RocmVmMTQ1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im9yZGVyaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI1OCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ib3JtLnhtbCBmaWxlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlRoZSBvcm0ueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJjb25jZXB0czAwMy5odG0jc3RocmVmMjQiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSlBBIEZhY2V0IHBhZ2UiPjx0b3BpYyBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNzdGhyZWYyMDgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYW5hZ2luZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jc3RocmVmNTgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzYW1wbGUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI3N0aHJlZjU5IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im92ZXJyaWRlcyAtIEpQQSBhdHRyaWJ1dGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQXR0cmlidXRlIG92ZXJyaWRlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwNy5odG0jc3RocmVmMjI5IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwZXJzaXN0ZW5jZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJVbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2UiPjx0b3BpYyBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNzdGhyZWYxOSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImRhdGFiYXNlIGNvbm5lY3Rpb24iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gVmFsaWRhdGlvbiBQcmVmZXJlbmNlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAyNy5odG0jc3RocmVmMjk0IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZGF0YWJhc2Ugc2NoZW1hIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI3N0aHJlZjI5NyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVudGl0eSBjbGFzcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNjciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJvcHRpb25zIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEphdmEgUGVyc2lzdGVuY2UgT3B0aW9ucyI+PHRvcGljIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI3N0aHJlZjI4NyIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gVmFsaWRhdGlvbiBQcmVmZXJlbmNlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAyNy5odG0jc3RocmVmMjg5IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icHJvdmlkZXIiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNzdGhyZWY0OSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwZXJzaXN0ZW5jZS54bWwgZmlsZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJUaGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJjb25jZXB0czAwMi5odG0jc3RocmVmMjMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYW5hZ2luZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjQ3IiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iV29ya2luZyB3aXRoIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA1Lmh0bSNzdGhyZWY2NSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNhbXBsZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjQ4IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic3luY2hyb25pemluZyB3aXRoIGNsYXNzZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlN5bmNocm9uaXppbmcgY2xhc3NlcyI+PHRvcGljIGhyZWY9InRhc2tzMDAyLmh0bSNzdGhyZWY1MyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwZXJzaXN0ZW50IGVudGl0eSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNzdGhyZWY3MSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icGVyc3BlY3RpdmUgLSBKUEEgRGV2ZWxvcG1lbnQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmUiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtI3N0aHJlZjMwMSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icGxhdGZvcm0gLSBKUEEiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI3N0aHJlZjI5MSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icHJvYmxlbXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJWYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMy5odG0jc3RocmVmMTY5IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwcm9qZWN0cyAtIEpQQSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIG5ldyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiPjx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtI3N0aHJlZjkiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI+PHRvcGljIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNzdGhyZWYyNiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im9wdGlvbnMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gVmFsaWRhdGlvbiBQcmVmZXJlbmNlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAyNy5odG0jc3RocmVmMjkwIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idmFsaWRhdGlvbiBwcmVmZXJlbmNlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnMiPjx0b3BpYyBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNzdGhyZWYyODgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icXVlcnkgaGludHMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBOYW1lZCBRdWVyaWVzIj48dG9waWMgaHJlZj0idGFza3MwMDkuaHRtI3N0aHJlZjEwOSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icXVpY2sgc3RhcnQgLSBEYWxpIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRGFsaSBxdWljayBzdGFydCI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMi5odG0jc3RocmVmOCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icmVxdWlyZW1lbnRzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJSZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbiI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMS5odG0jc3RocmVmNCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InBlcnNpc3RlbnQgZW50aXRpZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNzdGhyZWY3MyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzY2hlbWEiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJmcm9tIGNsYXNzZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgU2NoZW1hIGZyb20gQ2xhc3NlcyI+PHRvcGljIGhyZWY9InRhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSNzdGhyZWYxODkiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hIj48dG9waWMgaHJlZj0idGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bSNzdGhyZWYxOTciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic2NoZW1hIC0gZGF0YWJhc2UiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI3N0aHJlZjI5NiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic2Vjb25kYXJ5IHRhYmxlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwOC5odG0jc3RocmVmMjMxIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJTZWNvbmRhcnkgVGFibGVzIC0gaW4gSmF2YSBEZXRhaWxzIHZpZXciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDguaHRtI3N0aHJlZjIzNCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic2luZ2xlIHRhYmxlIGluaGVyaXRhbmNlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWYxMDEiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InN1cGVyY2xhc3MiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJNYXBwZWQgc3VwZXJjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNzdGhyZWY5MCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic3luY2hyb25pemluZyBjbGFzc2VzIHdpdGggcGVyc2lzdGVuY2UueG1sIGZpbGUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTeW5jaHJvbml6aW5nIGNsYXNzZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAwMi5odG0jc3RocmVmNTQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InRhYmxlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFzc29jaWF0aW9ucyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVGFibGUgQXNzb2NpYXRpb25zIj48dG9waWMgaHJlZj0icmVmX3RhYmxlQXNzb2NpYXRpb25zLmh0bSNzdGhyZWYyMTgiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGUgTmV3IEFzc29jaWF0aW9uIj48dG9waWMgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSNzdGhyZWYyMjIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyBlbnRpdGllcyBmcm9tIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIj48dG9waWMgaHJlZj0idGFza3MwMjEuaHRtI3N0aHJlZjE1OSIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlNlbGVjdCBUYWJsZXMiPjx0b3BpYyBocmVmPSJyZWZfc2VsZWN0VGFibGVzLmh0bSNzdGhyZWYyMTciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJpbmhlcml0YW5jZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWYxMDIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzZWNvbmRhcnkiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwOC5odG0jc3RocmVmMjMyIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InRlbXBvcmFsIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI1MSIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjUzIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ0cmFuc2llbnQgbWFwcGluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkBUcmFuc2llbnQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlRyYW5zaWVudCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTguaHRtI3N0aHJlZjE1MyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJUcmFuc2llbnQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE4Lmh0bSNzdGhyZWYxNTEiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0idmVyc2lvbiBtYXBwaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQFZlcnNpb24iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlZlcnNpb24gbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE5Lmh0bSNzdGhyZWYxNTciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVmVyc2lvbiBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTkuaHRtI3N0aHJlZjE1NSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ2aWV3cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNzdGhyZWYyMjYiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI3N0aHJlZjI0MyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBTdHJ1Y3R1cmUgdmlldyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSlBBIFN0cnVjdHVyZSB2aWV3Ij48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI3N0aHJlZjI2OSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ3YXJuaW5nIG1lc3NhZ2VzIC0gRGFsaSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlZhbGlkYXRpbmcgbWFwcGluZ3MgYW5kIHJlcG9ydGluZyBwcm9ibGVtcyI+PHRvcGljIGhyZWY9InRhc2tzMDIzLmh0bSNzdGhyZWYxNjgiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uIj48dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAxLmh0bSNzdGhyZWY1IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYTUwgZWRpdG9yIj4KLSAgICA8ZW50cnkga2V5d29yZD0iV29ya2luZyB3aXRoIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA1Lmh0bSNzdGhyZWY2NCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotPC9pbmRleD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9sZWdhbC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvbGVnYWwuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmEwMDA3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9sZWdhbC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkxlZ2FsPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IiBMZWdhbCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9InN0aHJlZjI5NCIgbmFtZT0ic3RocmVmMjk0Ij48L2E+PC9wPgotPGgxPkxlZ2FsPC9oMT4KLTxwPkNvcHlyaWdodCAmY29weTsgMjAwNiwgMjAxMCwgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvcD4KLTxwPlRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0OjwvcD4KLTxwPjxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT48L2NvZGU+PC9wPgotPHA+PGEgaHJlZj0iYWJvdXQuaHRtIj5UZXJtcyBhbmQgY29uZGl0aW9ucyByZWdhcmRpbmcgdGhlIHVzZSBvZiB0aGlzIGd1aWRlLjwvYT48L3A+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWVhMGM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIERvY3VtZW50YXRpb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLWpwYURldmVsb3BtZW50PUpQQSBEZXZlbG9wbWVudAotY3JlYXRlQUpwYVByb2plY3Q9Q3JlYXRlIGEgSlBBIHByb2plY3QKLWNyZWF0ZUFKcGFQcm9qZWN0RGVzY3JpcHRpb249VGhpcyBjaGVhdCBzaGVldCBoZWxwcyB5b3UgY3JlYXRlIGEgSlBBIHByb2plY3QuCi1jcmVhdGVBUGVyc2lzdGVudEVudGl0eT1DcmVhdGUgYSBwZXJzaXN0ZW50IGVudGl0eQotY3JlYXRlQVBlcnNpc3RlbnRFbnRpdHlEZXNjcmlwdGlvbj1UaGlzIGNoZWF0IHNoZWV0IGhlbHBzIHlvdSBjcmVhdGUgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5LgotTWFwQVBlcnNpc3RlbnRFbnRpdHk9TWFwIGEgcGVyc2lzdGVudCBlbnRpdHkKLU1hcEFQZXJzaXN0ZW50RW50aXR5RGVzY3JpcHRpb249VGhpcyBjaGVhdCBzaGVldCBoZWxwcyB5b3UgbWFwIHRoZSBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgdG8gYSBkYXRhYmFzZSB0YWJsZS4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9wbHVnaW4ueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MDUyNjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQk8IS0tID09PT09PT09PT09IC0tPgotCTwhLS0gRGVmaW5lIFRPQyAgLS0+Ci0JPCEtLSA9PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0JCTx0b2MgZmlsZT0idG9jLnhtbCIgcHJpbWFyeT0idHJ1ZSIvPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gPT09PT09PT09PT0gLS0+Ci0JPCEtLSBEZWZpbmUgRjEgICAtLT4KLQk8IS0tID09PT09PT09PT09IC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPgotCQk8Y29udGV4dHMgZmlsZT0iY29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLz4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gRGVmaW5lIEtleXdvcmQgSW5kZXggLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLQkJPGluZGV4IGZpbGU9ImluZGV4LnhtbCIvPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gPT09PT09PT09PT0gLS0+Ci0JPCEtLSBDaGVhdHNoZWV0cyAtLT4KLQk8IS0tID09PT09PT09PT09IC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLmNoZWF0U2hlZXRDb250ZW50Ij4KLQkJPGNhdGVnb3J5IG5hbWU9IiVqcGFEZXZlbG9wbWVudCIgaWQ9ImNvbS5qcGEuY2F0ZWdvcnkiLz4KLQkJPGNoZWF0c2hlZXQgbmFtZT0iJWNyZWF0ZUFKcGFQcm9qZWN0IiBjYXRlZ29yeT0iY29tLmpwYS5jYXRlZ29yeSIgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvYWRkX3BlcnNpc3RlbmNlLnhtbCIgaWQ9Im9yZy5lY2xpcHNlLmpwYS5jaGVhdHNoZWV0LmNyZWF0ZXByb2plY3QxIj4KLQkJCTxkZXNjcmlwdGlvbj4lY3JlYXRlQUpwYVByb2plY3REZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0JCTwvY2hlYXRzaGVldD4KLQkJPGNoZWF0c2hlZXQgbmFtZT0iJWNyZWF0ZUFQZXJzaXN0ZW50RW50aXR5IiBjYXRlZ29yeT0iY29tLmpwYS5jYXRlZ29yeSIgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvY3JlYXRlX2VudGl0eS54bWwiIGlkPSJvcmcuZWNsaXBzZS5qcGEuY2hlYXRzaGVldC5hZGRlbnRpdHkiPgotCQkJPGRlc2NyaXB0aW9uPiVjcmVhdGVBUGVyc2lzdGVudEVudGl0eURlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLQkJPC9jaGVhdHNoZWV0PgotCQk8Y2hlYXRzaGVldCBuYW1lPSIlTWFwQVBlcnNpc3RlbnRFbnRpdHkiIGNhdGVnb3J5PSJjb20uanBhLmNhdGVnb3J5IiBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9tYXBfZW50aXR5LnhtbCIgaWQ9Im9yZy5lY2xpcHNlLmpwYS5jaGVhdHNoZWV0Lm1hcGVudGl0eSI+Ci0JCQk8ZGVzY3JpcHRpb24+JU1hcEFQZXJzaXN0ZW50RW50aXR5RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotCQk8L2NoZWF0c2hlZXQ+Ci0JPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfRW50aXR5Q2xhc3NQYWdlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfRW50aXR5Q2xhc3NQYWdlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1NzhmMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX0VudGl0eUNsYXNzUGFnZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5FbnRpdHkgQ2xhc3MgcGFnZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFbnRpdHkgQ2xhc3MgcGFnZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUZFSUdGIiBuYW1lPSJDSUFGRUlHRiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RW50aXR5IENsYXNzIHBhZ2U8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgRW50aXR5IENsYXNzIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtI0NJQUdHR0RGIj5DcmVhdGUgSlBBIEVudGl0eSB3aXphcmQ8L2E+LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgRW50aXR5IENsYXNzIHBhZ2Ugb2YgdGhlIENyZWF0ZSBKUEEgRW50aXR5IHdpemFyZC4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjIlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjE3JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDUiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ1Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10NSI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10NSIgaGVhZGVycz0icjFjMS10NSI+UHJvamVjdDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDUgcjFjMi10NSI+VGhlIG5hbWUgb2YgdGhlIEpQQSBwcm9qZWN0LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDUgcjFjMy10NSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDUiIGhlYWRlcnM9InIxYzEtdDUiPlNvdXJjZSBGb2xkZXI8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ1IHIxYzItdDUiPlRoZSBsb2NhdGlvbiBvZiB0aGUgSlBBIHByb2plY3QncyBzcmMgZm9sZGVyLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDUgcjFjMy10NSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDUiIGhlYWRlcnM9InIxYzEtdDUiPkphdmEgUGFja2FnZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDUgcjFjMi10NSI+VGhlIG5hbWUgb2YgdGhlIGNsYXNzIHBhY2thZ2UuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NSByMWMzLXQ1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NSIgaGVhZGVycz0icjFjMS10NSI+Q2xhc3MgbmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDUgcjFjMi10NSI+VGhlIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NSByMWMzLXQ1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10NSIgaGVhZGVycz0icjFjMS10NSI+U3VwZXJjbGFzczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDUgcjFjMi10NSI+U2VsZWN0IHRoZSBzdXBlcmNsYXNzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDUgcjFjMy10NSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDUiIGhlYWRlcnM9InIxYzEtdDUiPjxhIGlkPSJzdGhyZWYxOTUiIG5hbWU9InN0aHJlZjE5NSI+PC9hPkluaGVyaXRhbmNlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10NSByMWMyLXQ1Ij5CZWNhdXNlIHRoZSB3aXphcmQgY3JlYXRlcyBhIEphdmEgY2xhc3Mgd2l0aCBhbiA8Y29kZT5ARW50aXR5PC9jb2RlPiBub3RhdGlvbiwgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5FbnRpdHk8L3NwYW4+IG9wdGlvbiBpcyBzZWxlY3RlZCBieSBkZWZhdWx0LgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXBwZWQgU3VwZXJjbGFzczwvc3Bhbj4gaWYgeW91IGRlZmluZWQgYSBzdXBlcmNsYXNzLjwvcD4KLTxwPlRvIGFkZCBhbiA8Y29kZT5ASW5oZXJpdGFuY2U8L2NvZGU+IG5vdGF0aW9uIHRvIHRoZSBlbnRpdHksIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SW5oZXJpdGFuY2U8L3NwYW4+IGFuZCB0aGVuIHNlbGVjdCBvbmUgb2YgdGhlIGluaGVyaXRhbmNlIG1hcHBpbmcgc3RyYXRlZ2llcyAoZGVzY3JpYmVkIGluIEpTUiAyMjApOjwvcD4KLTx1bD4KLTxsaT4KLTxwPlNJTkdMRV9UQUJMRSAtLSBBbGwgY2xhc3NlcyBpbiBhIGhpZXJhcmNoeSBhcyBtYXBwZWQgdG8gYSBzaW5nbGUgdGFibGUuIFRoaXMgYW5ub3RhdGlvbiBpcyB3aXRob3V0IGFuIGF0dHJpYnV0ZSBmb3IgdGhlIGluaGVyaXRhbmNlIHN0cmF0ZWd5LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UQUJMRV9QRVJfQ0xBU1MgLS0gRWFjaCBjbGFzcyBpcyBtYXBwZWQgdG8gYSBzZXBhcmF0ZSB0YWJsZS48L3A+Ci08L2xpPgotPGxpPgotPHA+Sk9JTkVEIC0tIFRoZSByb290IG9mIHRoZSBjbGFzcyBoaWVyYXJjaHkgaXMgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgdGFibGUuIEVhY2ggc3ViY2xhc3MgaXMgcmVwcmVzZW50ZWQgYnkgYSBzZXBhcmF0ZSB0YWJsZSB0aGF0IGNvbnRhaW5zIHRob3NlIGZpZWxkcyB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGUgc3ViY2xhc3MgKG5vdCBpbmhlcml0ZWQgZnJvbSBpdHMgc3VwZXJjbGFzcyksIGFzIHdlbGwgYXMgdGhlIGNvbHVtbihzKSB0aGF0IHJlcHJlc2VudCBpdHMgcHJpbWFyeSBrZXkuIFRoZSBwcmltYXJ5IGtleSBjb2x1bW4ocykgb2YgdGhlIHN1YmNsYXNzIHRhYmxlIHNlcnZlcyBhcyBhIGZvcmVpZ24ga2V5IHRvIHRoZSBwcmltYXJ5IGtleSBvZiB0aGUgc3VwZXJjbGFzcyB0YWJsZS48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDUgcjFjMy10NSI+RW50aXR5PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDUiIGhlYWRlcnM9InIxYzEtdDUiPjxhIGlkPSJzdGhyZWYxOTYiIG5hbWU9InN0aHJlZjE5NiI+PC9hPlhNTCBFbnRpdHkgTWFwcGluZ3M8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQ1IHIxYzItdDUiPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIHRvIGVudGl0eSBtYXBwaW5ncyBpbiBYTUw8L3NwYW4+IHRvIGNyZWF0ZSBYTUwgbWFwcGluZ3MgaW4gPGNvZGU+b3JtLnhtbDwvY29kZT4sIHJhdGhlciB0aGFuIGFubm90YXRpb25zLgotPHA+VXNlIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwcGluZyBmaWxlPC9zcGFuPiBmaWVsZCB0byBzcGVjaWZ5IHRoZSBmaWxlIHRvIHVzZS4gQnkgZGVmYXVsdCwgbWFwcGluZ3MgYXJlIHN0b3JlZCBpbiB0aGUgPGNvZGU+TUVUQS1JTkYvb3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQ1IHIxYzMtdDUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNCQUJGQkpCRyI+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0jQ0lBR0dHREYiPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX0VudGl0eVByb3BlcnRpZXNQYWdlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfRW50aXR5UHJvcGVydGllc1BhZ2UuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTE0Zjg2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfRW50aXR5UHJvcGVydGllc1BhZ2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RW50aXR5IFByb3BlcnRpZXMgcGFnZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFbnRpdHkgUHJvcGVydGllcyBwYWdlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBREVDSUEiIG5hbWU9IkNJQURFQ0lBIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbnRpdHkgUHJvcGVydGllcyBwYWdlPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIEVudGl0eSBQcm9wZXJ0aWVzIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtI0NJQUdHR0RGIj5DcmVhdGUgSlBBIEVudGl0eSB3aXphcmQ8L2E+LjwvcD4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjE5NyIgbmFtZT0ic3RocmVmMTk3Ij48L2E+PGEgaWQ9InN0aHJlZjE5OCIgbmFtZT0ic3RocmVmMTk4Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj4mbmJzcDs8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9IiIgc3VtbWFyeT0iVGhpcyB0YWJsZSB0byBiZSBjb252ZXJ0ZWQgdG8gaW5mb3JtYWwuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ2Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10NiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDYiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDYiIGhlYWRlcnM9InIxYzEtdDYiPgotPHA+RW50aXR5IE5hbWU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ2IHIxYzItdDYiPgotPHA+VGhlIG5hbWUgb2YgdGhlIGVudGl0eS4gQnkgZGVmYXVsdCwgdGhpcyB2YWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIGVudGVyZWQgYXMgdGhlIGNsYXNzIG5hbWUuIElmIHRoZSBlbnRpdHkgbmFtZSBkaWZmZXJzIGZyb20gdGhlIGNsYXNzIG5hbWUsIHRoZW4gdGhlIGVudGl0eSBuYW1lIGlzIGFkZGVkIGFzIGFuIGF0dHJpYnV0ZS4gRm9yIGV4YW1wbGU6IDxjb2RlPkBFbnRpdHkobmFtZT0iRW50aXR5TmFtZSIpPC9jb2RlPi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ2IHIxYzMtdDYiPgotPHA+RGV0ZXJtaW5lZCBieSBzZXJ2ZXIuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDYiIGhlYWRlcnM9InIxYzEtdDYiPgotPHA+VGFibGUgTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDYgcjFjMi10NiI+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPlVzZSBkZWZhdWx0PC9zcGFuPiB0byBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgbWFwcGVkIHRhYmxlIG5hbWUgdG8gdGhlIGVudGl0eSBuYW1lLiBPdGhlcndpc2UsIGNsZWFyIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VXNlIGRlZmF1bHQ8L3NwYW4+IG9wdGlvbiBhbmQgZW50ZXIgdGhlIG5hbWUgaW4gdGhlIDxzcGFuIGNsYXNzPSJpdGFsaWMiPlRhYmxlIE5hbWU8L3NwYW4+IGZpZWxkLiBUaGVzZSBvcHRpb25zIHJlc3VsdCBpbiB0aGUgYWRkaXRpb24gb2YgdGhlIDxjb2RlPkBUYWJsZTwvY29kZT4gb3B0aW9uIHRvIHRoZSBKYXZhIGNsYXNzIGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NiByMWMzLXQ2Ij4KLTxwPlVzZSBkZWZhdWx0LjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQ2IiBoZWFkZXJzPSJyMWMxLXQ2Ij4KLTxwPkVudGl0eSBGaWVsZHM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ2IHIxYzItdDYiPgotPHA+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+IGJ1dHRvbiB0byBhZGQgcGVyc2lzdGVuY2UgZmllbGRzIHVzaW5nIHRoZSBFbnRpdHkgRmllbGRzIGRpYWxvZy4gVGhpcyBkaWFsb2cgZW5hYmxlIHlvdSB0byBidWlsZCBhIGZpZWxkIGJ5IGVudGVyaW5nIGEgZmllbGQgbmFtZSBhbmQgc2VsZWN0aW5nIGFtb25nIHBlcnNpc3RlbmNlIHR5cGVzLiBUaGUgPHNwYW4gY2xhc3M9ImJvbGQiPktleTwvc3Bhbj4gb3B0aW9uIGVuYWJsZXMgeW91IHRvIG1hcmsgYSBmaWVsZCBhcyBhIHByaW1hcnkga2V5LiBUaGUgZGlhbG9nJ3MgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gZnVuY3Rpb24gZW5hYmxlcyB5b3UgdG8gYWRkIG90aGVyIHBlcnNpc3RlbmNlIHR5cGVzIGRlc2NyaWJlZCBpbiB0aGUgSlBBIHNwZWNpZmljYXRpb24uIFRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+RWRpdDwvc3Bhbj4gYnV0dG9uIGVuYWJsZXMgeW91IHRvIGNoYW5nZSB0aGUgbmFtZSBvciB0eXBlIHNldCBmb3IgYSBwZXJzaXN0ZW50IGZpZWxkLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDYgcjFjMy10NiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDYiIGhlYWRlcnM9InIxYzEtdDYiPgotPHA+QWNjZXNzIFR5cGU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ2IHIxYzItdDYiPgotPHA+U2VsZWN0IHdoZXRoZXIgdGhlIGVudGl0eSdzIGFjY2VzcyB0byBpbnN0YW5jZSB2YXJpYWJsZXMgaXMgZmllbGQtYmFzZWQgb3IgcHJvcGVydHktYmFzZWQsIGFzIGRlZmluZWQgaW4gdGhlIEpQQSBzcGVjaWZpY2F0aW9uLjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5GaWVsZDwvc3Bhbj4gJm5kYXNoOyBJbnN0YW5jZSB2YXJpYWJsZXMgYXJlIGFjY2Vzc2VkIGRpcmVjdGx5LiBBbGwgbm9uLXRyYW5zaWVudCBpbnN0YW5jZSB2YXJpYWJsZXMgYXJlIHBlcnNpc3RlbnQuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Qcm9wZXJ0eTwvc3Bhbj4gJm5kYXNoOyBQZXJzaXN0ZW50IHN0YXRlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMuIFRoZSBwcm9wZXJ0eSBhY2Nlc3NvciBtZXRob2RzIG11c3QgYmUgPHNwYW4gY2xhc3M9ImJvbGQiPnB1YmxpYzwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9ImJvbGQiPnByaXZhdGU8L3NwYW4+LjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NiByMWMzLXQ2Ij4KLTxwPkZpZWxkPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfYWRkX2NvbnZlcnRlci5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2FkZF9jb252ZXJ0ZXIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTkyMjU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfYWRkX2NvbnZlcnRlci5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkFkZCBDb252ZXJ0ZXIgZGlhbG9nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkFkZCBDb252ZXJ0ZXIgZGlhbG9nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBR0NHSUoiIG5hbWU9IkNJQUdDR0lKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5BZGQgQ29udmVydGVyIGRpYWxvZzwvaDE+Ci08cD5Vc2UgdGhpcyBkaWFsb2cgdG8gY3JlYXRlIGEgbmV3IEVjbGlwc2VMaW5rIGNvbnZlcnRlci48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxocnVsZWluZm9ybWFsbWF4Ij4KLTx0YWJsZSBjbGFzcz0iSFJ1bGVJbmZvcm1hbE1heCIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgb3B0aW9ucyBvbiB0aGUgTmV3IEVjbGlwc2VMaW5rIE1hcHBpbmcgRmlsZSBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9InJvd3MiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10NDAiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ0MCI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDQwIiBoZWFkZXJzPSJyMWMxLXQ0MCI+TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDQwIHIxYzItdDQwIj5FbnRlciB0aGUgbmFtZSBmb3IgdGhpcyBjb252ZXJ0ZXI8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10NDAiIGhlYWRlcnM9InIxYzEtdDQwIj5UeXBlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NDAgcjFjMi10NDAiPlNlbGVjdCB0aGUgY29udmVydGVyIHR5cGU6Ci08dWw+Ci08bGk+Ci08cD5DdXN0b208L3A+Ci08L2xpPgotPGxpPgotPHA+T2JqZWN0IHR5cGU8L3A+Ci08L2xpPgotPGxpPgotPHA+U3RydWN0PC9wPgotPC9saT4KLTxsaT4KLTxwPlR5cGU8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGhydWxlaW5mb3JtYWxtYXgiIC0tPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfYXNzb2NpYXRpb25fY2FyZGluYWxpdHkuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9hc3NvY2lhdGlvbl9jYXJkaW5hbGl0eS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YjhlNWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9hc3NvY2lhdGlvbl9jYXJkaW5hbGl0eS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkFzc29jaWF0aW9uIENhcmRpbmFsaXR5PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkFzc29jaWF0aW9uIENhcmRpbmFsaXR5IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBRklJRkgiIG5hbWU9IkNJQUZJSUZIIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Bc3NvY2lhdGlvbiBDYXJkaW5hbGl0eTwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjEwIiBuYW1lPSJzdGhyZWYyMTAiPjwvYT5Vc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSBjYXJkaW5hbGl0eSBvZiBhbiBhc3NvY2lhdGlvbiB0YWJsZS4gRGVwZW5kaW5nIG9uIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+QXNzb2NpYXRpb24gS2luZDwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJib2xkIj5Kb2luIENvbHVtbnM8L3NwYW4+IHRoYXQgeW91IHNlbGVjdGVkIHByZXZpb3VzbHksIHNvbWUgYXNzb2NpYXRpb25zIG1heSBub3QgYmUgYXZhaWxhYmxlLjwvcD4KLTx1bD4KLTxsaT4KLTxwPk1hbnkgdG8gb25lPC9wPgotPC9saT4KLTxsaT4KLTxwPk9uZSB0byBtYW55PC9wPgotPC9saT4KLTxsaT4KLTxwPk9uZSB0byBvbmU8L3A+Ci08L2xpPgotPGxpPgotPHA+TWFueSB0byBtYW55PC9wPgotPC9saT4KLTwvdWw+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtI0NJQUZHSElGIj5DcmVhdGUgTmV3IEFzc29jaWF0aW9uPC9hPjxiciAvPgotPGEgaHJlZj0idGFza3MwMjEuaHRtI0JBQkJBR0ZJIj5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSNDSUFHQkZKRSI+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfYXNzb2NpYXRpb25fdGFibGUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9hc3NvY2lhdGlvbl90YWJsZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MTk3ZjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9hc3NvY2lhdGlvbl90YWJsZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkFzc29jaWF0aW9uIFRhYmxlczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJBc3NvY2lhdGlvbiBUYWJsZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFHSkhEQyIgbmFtZT0iQ0lBR0pIREMiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkFzc29jaWF0aW9uIFRhYmxlczwvaDE+Ci08cD5Vc2UgdGhpcyBwYWdlIHRvIHNwZWNpZnkgdGhlIGFzc29jaWF0aW9uIHRhYmxlcyBmb3IgYW4gZW50aXR5LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgQXNzb2NpYXRpb24gVGFibGVzIGRpYWxvZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBBc3NvY2lhdGlvbiBUYWJsZXMgZGlhbG9nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIzMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTIiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxMiI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDEyIiBoZWFkZXJzPSJyMWMxLXQxMiI+QXNzb2NpYXRpb24ga2luZDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDEyIHIxYzItdDEyIj5TcGVjaWZ5IGlmIHRoZSBhc3NvY2lhdGlvbiBpcyA8c3BhbiBjbGFzcz0iYm9sZCI+U2ltcGxlPC9zcGFuPiAoMTpNKSBvciA8c3BhbiBjbGFzcz0iYm9sZCI+TWFueSB0byBNYW55PC9zcGFuPiAoTTpNKS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTIiIGhlYWRlcnM9InIxYzEtdDEyIj5Bc3NvY2lhdGlvbiB0YWJsZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxMiByMWMyLXQxMiI+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlIFNlbGVjdGlvbjwvc3Bhbj4sIHRoZW4gc2VsZWN0IHRoZSB0d28gdGFibGVzIHRvIGFzc29jaWF0ZS4KLTxwPldoZW4gY3JlYXRpbmcgYSA8c3BhbiBjbGFzcz0iYm9sZCI+TWFueSB0byBNYW55PC9zcGFuPiBhc3NvY2lhdGlvbiwgeW91IGNhbiBzZWxlY3QgYSA8c3BhbiBjbGFzcz0iYm9sZCI+Sm9pbiBUYWJsZTwvc3Bhbj4gZm9yIHRoZSBhc3NvY2lhdGlvbi48L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtI0NJQUZHSElGIj5DcmVhdGUgTmV3IEFzc29jaWF0aW9uPC9hPjxiciAvPgotPGEgaHJlZj0idGFza3MwMjEuaHRtI0JBQkJBR0ZJIj5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSNDSUFHQkZKRSI+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY29uZmlndXJlX2pheGJfY2xhc3NfZ2VuZXJhdGlvbl9kaWFsb2cuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jb25maWd1cmVfamF4Yl9jbGFzc19nZW5lcmF0aW9uX2RpYWxvZy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZmM3YTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jb25maWd1cmVfamF4Yl9jbGFzc19nZW5lcmF0aW9uX2RpYWxvZy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNvbmZpZ3VyZSBKQVhCIENsYXNzIEdlbmVyYXRpb24gZGlhbG9nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNi0wNFQxOTozMzo3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNvbmZpZ3VyZSBKQVhCIENsYXNzIEdlbmVyYXRpb24gZGlhbG9nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDSEhISkEiIG5hbWU9IkNBQ0hISEpBIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Db25maWd1cmUgSkFYQiBDbGFzcyBHZW5lcmF0aW9uIGRpYWxvZzwvaDE+Ci08cD5Vc2UgdGhpcyBkaWFsb2cgdG8gZ2VuZXJhdGUgSkFYQiBjbGFzc2VzIGZyb20gYSBzY2hlbWEuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaHJ1bGVpbmZvcm1hbG1heCI+Ci08dGFibGUgY2xhc3M9IkhSdWxlSW5mb3JtYWxNYXgiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIG9wdGlvbnMgb24gdGhlIE5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUgZGlhbG9nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJyb3dzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDQxIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10NDEiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPlNvdXJjZSBmb2xkZXI8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ0MSByMWMyLXQ0MSI+TG9jYXRpb24gaW4gd2hpY2ggdG8gZ2VuZXJhdGUgdGhlIGNsYXNzZXMuIENsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Ccm93c2U8L3NwYW4+IHRvIHNlbGVjdCBhIGxvY2F0aW9uLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPlBhY2thZ2U8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ0MSByMWMyLXQ0MSI+TmFtZSBvZiB0aGUgcGFja2FnZS4gQ2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gdG8gc2VsZWN0IGFuIGV4aXN0aW5nIHBhY2thZ2UuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+Q2F0YWxvZzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDQxIHIxYzItdDQxIj5OYW1lIG9mIHRoZSBjYXRhbG9nIGZpbGUgdG8gdXNlIHRvIHJlc29sdmUgZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZXMuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+QmluZGluZ3MgZmlsZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ0MSByMWMyLXQ0MSI+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gdG8gc2VsZWN0IHRoZSBleHRlcm5hbCBiaW5kaW5ncyBmaWxlczwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGhydWxlaW5mb3JtYWxtYXgiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bSNDSUhDQkhKRCI+R2VuZXJhdGluZyBKQVhCIENsYXNzZXMgZnJvbSBhIFNjaGVtYTwvYT4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNTY5NGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIFdpemFyZDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFHQkZKRSIgbmFtZT0iQ0lBR0JGSkUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIFdpemFyZDwvaDE+Ci08cD5Vc2UgdGhlIEdlbmVyYXRlIEN1c3RvbSBFbnRpdGllcyBXaXphcmQgdG8gY3JlYXRlIGVudGl0aWVzIGZyb20geW91ciBkYXRhYmFzZSB0YWJsZXMuPC9wPgotPHA+VGhlIHdpemFyZCBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHBhZ2VzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9zZWxlY3RUYWJsZXMuaHRtI0NJQUhDR0VFIj5TZWxlY3QgVGFibGVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfdGFibGVBc3NvY2lhdGlvbnMuaHRtI0NJQUNESUNCIj5UYWJsZSBBc3NvY2lhdGlvbnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9jdXN0b21pemVEZWZhdWx0RW50aXR5R2VuZXJhdGlvbi5odG0jQ0lBRUpEQkUiPkN1c3RvbWl6ZSBEZWZhdWx0IEVudGl0eSBHZW5lcmF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfY3VzdG9taXpJbmRpdmlkdWFsRW50aXRpZXMuaHRtI0NJQUNJR0VFIj5DdXN0b21pemUgSW5kaXZpZHVhbCBFbnRpdGllczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZGE3NDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DcmVhdGUgSlBBIEVudGl0eSB3aXphcmQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBR0dHREYiIG5hbWU9IkNJQUdHR0RGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DcmVhdGUgSlBBIEVudGl0eSB3aXphcmQ8L2gxPgotPHA+VGhlIENyZWF0ZSBKUEEgd2l6YXJkIGVuYWJsZXMgeW91IHRvIHF1aWNrbHkgYWRkIGFuIGVudGl0eSBhbmQgYWxzbyBhZGQgcGVyc2lzdGVuY2UgZmllbGRzIHRvIHRoYXQgZW50aXR5LiBJbiBhZGRpdGlvbiwgdGhpcyB3aXphcmQgYWRkcyB0aGUgYWNjZXNzb3IgbWV0aG9kcyAoPGNvZGU+Z2V0dGVyPC9jb2RlPiBhbmQgPGNvZGU+c2V0dGVyPC9jb2RlPikgaW4gdGhlIGNsYXNzIGZpbGUuIFRoZSB3aXphcmQgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYWdlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfRW50aXR5Q2xhc3NQYWdlLmh0bSNDSUFGRUlHRiI+RW50aXR5IENsYXNzIHBhZ2U8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9FbnRpdHlQcm9wZXJ0aWVzUGFnZS5odG0jQ0lBREVDSUEiPkVudGl0eSBQcm9wZXJ0aWVzIHBhZ2U8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc0YWE1YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3JlYXRlIE5ldyBBc3NvY2lhdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGUgTmV3IEFzc29jaWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBRkdISUYiIG5hbWU9IkNJQUZHSElGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DcmVhdGUgTmV3IEFzc29jaWF0aW9uPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyMDciIG5hbWU9InN0aHJlZjIwNyI+PC9hPjxhIGlkPSJzdGhyZWYyMDgiIG5hbWU9InN0aHJlZjIwOCI+PC9hPlVzZSB0aGUgQ3JlYXRlIE5ldyBBc3NvY2lhdGlvbiB3aXphcmQgdG8gc3BlY2lmeSBhc3NvY2lhdGlvbiB0YWJsZXMgd2hlbiBnZW5lcmF0aW5nIGFuIGVudGl0eS48L3A+Ci08cD5UaGUgd2l6YXJkIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgcGFnZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2Fzc29jaWF0aW9uX3RhYmxlLmh0bSNDSUFHSkhEQyI+QXNzb2NpYXRpb24gVGFibGVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfam9pbl9jb2x1bW5zLmh0bSNDSUFFR0VFRyI+Sm9pbiBDb2x1bW5zPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfYXNzb2NpYXRpb25fY2FyZGluYWxpdHkuaHRtI0NJQUZJSUZIIj5Bc3NvY2lhdGlvbiBDYXJkaW5hbGl0eTwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2N1c3RvbWl6SW5kaXZpZHVhbEVudGl0aWVzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3VzdG9taXpJbmRpdmlkdWFsRW50aXRpZXMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODQ3ZGEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3VzdG9taXpJbmRpdmlkdWFsRW50aXRpZXMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DdXN0b21pemUgSW5kaXZpZHVhbCBFbnRpdGllczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDdXN0b21pemUgSW5kaXZpZHVhbCBFbnRpdGllcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUNJR0VFIiBuYW1lPSJDSUFDSUdFRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3VzdG9taXplIEluZGl2aWR1YWwgRW50aXRpZXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIwNiIgbmFtZT0ic3RocmVmMjA2Ij48L2E+VXNlIHRoaXMgcGFnZSB0byBjdXN0b21pemUgZWFjaCBnZW5lcmF0ZWQgZW50aXR5LiBTZWxlY3QgYW4gaXRlbSBpbiB0aGUgVGFibGUgYW5kIGNvbHVtbnMgYXJlYSwgdGhlbiBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIGZpZWxkcyBmb3IgZWFjaCBpdGVtLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSW5kaXZpZHVhbCBFbnRpdGllcyBkaWFsb2cuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSW5kaXZpZHVhbCBFbnRpdGllcyBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjMyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxMSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDExIj5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTEiIGhlYWRlcnM9InIxYzEtdDExIj5UYWJsZSBNYXBwaW5nPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTEgcjFjMi10MTEiPlVzZSB0aGVzZSBvcHRpb25zIHRvIGRlZmluZSB0aGUgdGFibGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGVudGl0eS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTEiIGhlYWRlcnM9InIxYzEtdDExIj4mbmJzcDsmbmJzcDtLZXkmbmJzcDtnZW5lcmF0b3I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxMSByMWMyLXQxMSI+U2VsZWN0IHRoZSBnZW5lcmF0b3IgdXNlZCBmb3IgdGhpcyBtYXBwaW5nLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxMSIgaGVhZGVycz0icjFjMS10MTEiPiZuYnNwOyZuYnNwO1NlcXVlbmNlJm5ic3A7bmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDExIHIxYzItdDExIj5FbnRlciBhIG5hbWUgZm9yIHRoZSBzZXF1ZW5jZS4KLTxwPllvdSBjYW4gdXNlIDxzcGFuIGNsYXNzPSJib2xkIj4kdGFibGU8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0iYm9sZCI+JHBrPC9zcGFuPiBhcyB2YXJpYWJsZXMgaW4gdGhlIG5hbWUuIFRoZXNlIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHRhYmxlIG5hbWUgYW5kIHByaW1hcnkga2V5IGNvbHVtbiBuYW1lIChyZXNwZWN0aXZlbHkpIHdoZW4gRGFsaSBnZW5lcmF0ZXMgYSB0YWJsZSBtYXBwaW5nLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxMSIgaGVhZGVycz0icjFjMS10MTEiPiZuYnNwOyZuYnNwO0VudGl0eSZuYnNwO2FjY2VzczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDExIHIxYzItdDExIj5TcGVjaWZ5IHRoZSBkZWZhdWx0IGVudGl0eSBhY2Nlc3MgbWV0aG9kOiA8c3BhbiBjbGFzcz0iYm9sZCI+RmllbGQ8L3NwYW4+IChkZWZhdWx0KSBvciA8c3BhbiBjbGFzcz0iYm9sZCI+UHJvcGVydHk8L3NwYW4+LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQxMSIgaGVhZGVycz0icjFjMS10MTEiPkRvbWFpbiBKYXZhIENsYXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTEgcjFjMi10MTEiPlVzZSB0aGVzZSBvcHRpb25zIHRvIGRlZmluZSB0aGUgY2xhc3MgaW5mb3JtYXRpb24gKDxzcGFuIGNsYXNzPSJib2xkIj5TdXBlcmNsYXNzPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImJvbGQiPkludGVyZmFjZXM8L3NwYW4+KSBmb3IgdGhlIGVudGl0eS48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNCQUJGQkpCRyI+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC9hPjxiciAvPgotPGEgaHJlZj0idGFza3MwMjEuaHRtI0JBQkJBR0ZJIj5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSNDSUFHQkZKRSI+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9hPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jdXN0b21pemVEZWZhdWx0RW50aXR5R2VuZXJhdGlvbi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2N1c3RvbWl6ZURlZmF1bHRFbnRpdHlHZW5lcmF0aW9uLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4ODAxYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2N1c3RvbWl6ZURlZmF1bHRFbnRpdHlHZW5lcmF0aW9uLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3VzdG9taXplIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3VzdG9taXplIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFFSkRCRSIgbmFtZT0iQ0lBRUpEQkUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkN1c3RvbWl6ZSBEZWZhdWx0IEVudGl0eSBHZW5lcmF0aW9uPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyMDUiIG5hbWU9InN0aHJlZjIwNSI+PC9hPlVzZSB0aGlzIHBhZ2UgdG8gc3BlY2lmeSB0aGUgZGVmYXVsdCBpbmZvcm1hdGlvbiBEYWxpIHdpbGwgdXNlIHdoZW4gZ2VuZXJhdGluZyB0aGUgZW50aXRpZXMgZnJvbSB0aGUgZGF0YWJhc2UgdGFibGVzLiBZb3Ugd2lsbCBiZSBhYmxlIHRvIG92ZXJyaWRlIHRoaXMgaW5mb3JtYXRpb24gZm9yIHNwZWNpZmljIGVudGl0aWVzLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgR2VuZXJhdGUgRW50aXRpZXMgZGlhbG9nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEN1c3RvbSBEZWZhdWx0IEVudGl0eSBHZW5lcmF0aW9uIGRpYWxvZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMzIlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDEwIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTAiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPlRhYmxlIE1hcHBpbmc8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxMCByMWMyLXQxMCI+VXNlIHRoZXNlIG9wdGlvbnMgdG8gZGVmaW5lIHRoZSB0YWJsZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZW50aXR5LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPiZuYnNwOyZuYnNwO0tleSZuYnNwO2dlbmVyYXRvcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDEwIHIxYzItdDEwIj5TZWxlY3QgdGhlIGdlbmVyYXRvciB1c2VkIGZvciB0aGlzIG1hcHBpbmcuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+Jm5ic3A7Jm5ic3A7U2VxdWVuY2UmbmJzcDtuYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTAgcjFjMi10MTAiPkVudGVyIGEgbmFtZSBmb3IgdGhlIHNlcXVlbmNlLgotPHA+WW91IGNhbiB1c2UgPHNwYW4gY2xhc3M9ImJvbGQiPiR0YWJsZTwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJib2xkIj4kcGs8L3NwYW4+IGFzIHZhcmlhYmxlcyBpbiB0aGUgbmFtZS4gVGhlc2Ugd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdGFibGUgbmFtZSBhbmQgcHJpbWFyeSBrZXkgY29sdW1uIG5hbWUgKHJlc3BlY3RpdmVseSkgd2hlbiBEYWxpIGdlbmVyYXRlcyBhIHRhYmxlIG1hcHBpbmcuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+Jm5ic3A7Jm5ic3A7RW50aXR5Jm5ic3A7YWNjZXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTAgcjFjMi10MTAiPlNwZWNpZnkgdGhlIGRlZmF1bHQgZW50aXR5IGFjY2VzcyBtZXRob2Q6IDxzcGFuIGNsYXNzPSJib2xkIj5GaWVsZDwvc3Bhbj4gKGRlZmF1bHQpIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5Qcm9wZXJ0eTwvc3Bhbj4uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+Jm5ic3A7Jm5ic3A7QXNzb2NpYXRpb25zJm5ic3A7ZmV0Y2g8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxMCByMWMyLXQxMCI+U3BlY2lmeSB0aGUgZGVmYXVsdCBmZXRjaCBtb2RlIGZvciBhc3NvY2lhdGlvbnM6IDxzcGFuIGNsYXNzPSJib2xkIj5EZWZhdWx0PC9zcGFuPiwgYXMgZGVmaW5lZCBieSB0aGUgYXBwbGljYXRpb24gKGRlZmF1bHQpLCBvciA8c3BhbiBjbGFzcz0iYm9sZCI+TGF6eTwvc3Bhbj4uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+Jm5ic3A7Jm5ic3A7Q29sbGVjdGlvbiZuYnNwO3R5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxMCByMWMyLXQxMCI+U3BlY2lmeSBpZiB0aGUgY29sbGVjdGlvbiBwcm9wZXJ0aWVzIGFyZSBhIDxzcGFuIGNsYXNzPSJib2xkIj5TZXQ8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJib2xkIj5MaXN0PC9zcGFuPi4KLTxwPkVuYWJsZSB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkFsd2F5cyBnZW5lcmF0ZSBvcHRpb25hbCBKUEEgYW5ub3RhdGlvbnMgYW5kIERETCBwYXJhbWV0ZXJzPC9zcGFuPiBvcHRpb24gdG8gaGF2ZSBEYWxpIGluY2x1ZGUgdGhpcyBpbmZvcm1hdGlvbiBpbiB0aGUgZW50aXR5LjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPkRvbWFpbiBKYXZhIENsYXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTAgcjFjMi10MTAiPlVzZSB0aGVzZSBvcHRpb25zIHRvIGRlZmluZSB0aGUgY2xhc3MgaW5mb3JtYXRpb24gKDxzcGFuIGNsYXNzPSJib2xkIj5QYWNrYWdlPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImJvbGQiPlN1cGVyY2xhc3M8L3NwYW4+LCBhbmQgPHNwYW4gY2xhc3M9ImJvbGQiPkludGVyZmFjZXM8L3NwYW4+KSBmb3IgdGhlIGVudGl0eS48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNCQUJGQkpCRyI+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC9hPjxiciAvPgotPGEgaHJlZj0idGFza3MwMjEuaHRtI0JBQkJBR0ZJIj5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSNDSUFHQkZKRSI+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfZGV0YWlsc19vcm0uaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9kZXRhaWxzX29ybS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxODU5NGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9kZXRhaWxzX29ybS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCkiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNHREdIQyIgbmFtZT0iQ0FDR0RHSEMiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKTwvaDE+Ci08cD5UaGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGRpc3BsYXlzIHRoZSBkZWZhdWx0IG1hcHBpbmcgYW5kIHBlcnNpc3RlbmNlIGluZm9ybWF0aW9uIGZvciB0aGUgcHJvamVjdCBhbmQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBhcmVhczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMTMuaHRtI0NBQ0NBQ0dIIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMTQuaHRtI0NBQ0VBR0JHIj5QZXJzaXN0ZW5jZSBVbml0IGluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMTUuaHRtI0NJQUZHQUlKIj5HZW5lcmF0b3JzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMTYuaHRtI0NJQUlCQUFKIj5RdWVyaWVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMTcuaHRtI0NJQURHQ0lEIj5Db252ZXJ0ZXJzPC9hPiAod2hlbiB1c2luZyBFY2xpcHNlTGluayk8L3A+Ci08L2xpPgotPC91bD4KLTxwPlRoZXNlIGRlZmF1bHRzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBzZXR0aW5ncyBvbiBhIHNwZWNpZmljIGVudGl0eSBvciBtYXBwaW5nLjwvcD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2VjbGlwc2VsaW5rX21hcHBpbmdfZmlsZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2VjbGlwc2VsaW5rX21hcHBpbmdfZmlsZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YTYzMDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9lY2xpcHNlbGlua19tYXBwaW5nX2ZpbGUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5OZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIGRpYWxvZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJOZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIGRpYWxvZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUVERUpGIiBuYW1lPSJDSUFFREVKRiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TmV3IEVjbGlwc2VMaW5rIE1hcHBpbmcgRmlsZSBkaWFsb2c8L2gxPgotPHA+U3BlY2lmeSB0aGUgbG9jYXRpb24gYW5kIHByb3BlcnRpZXMgb2YgdGhlIEVjbGlwc2VMaW5rIG1hcHBpbmcgZmlsZSAoPGNvZGU+ZWNsaXNwZWxpbmstb3JtLnhtbDwvY29kZT4pLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGhydWxlaW5mb3JtYWxtYXgiPgotPHRhYmxlIGNsYXNzPSJIUnVsZUluZm9ybWFsTWF4IiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBvcHRpb25zIG9uIHRoZSBOZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIGRpYWxvZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0icm93cyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQzOSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDM5Ij5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MzkiIGhlYWRlcnM9InIxYzEtdDM5Ij5Qcm9qZWN0PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzkgcjFjMi10MzkiPlNlbGVjdCB0aGUgcHJvamVjdCBpbiB3aGljaCB0byBhZGQgdGhlIG1hcHBpbmcgZmlsZS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MzkiIGhlYWRlcnM9InIxYzEtdDM5Ij5Tb3VyY2UgZm9sZGVyPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MzkgcjFjMi10MzkiPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Ccm93c2U8L3NwYW4+IGFuZCBzZWxlY3QgdGhlIHNvdXJjZSBmaWxlIGluIHdoaWNoIHRvIGFkZCB0aGUgbWFwcGluZyBmaWxlLiBUaGUgZGVmYXVsdCBpcyA8Y29kZT4uLi88L2NvZGU+PGNvZGU+PHNwYW4gY2xhc3M9ImNvZGVpbmxpbmVpdGFsaWMiPiZsdDtQUk9KRUNUJmd0Ozwvc3Bhbj48L2NvZGU+PGNvZGU+L3NyYzwvY29kZT4uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDM5IiBoZWFkZXJzPSJyMWMxLXQzOSI+RmlsZSBwYXRoPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MzkgcjFjMi10MzkiPkVudGVyIHRoZSBmaWxlbmFtZSBhbmQgcGF0aCBvZiB0aGUgbWFwcGluZyBmaWxlLiBUaGUgZGVmYXVsdCBpcyA8Y29kZT5NRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sPC9jb2RlPi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MzkiIGhlYWRlcnM9InIxYzEtdDM5Ij5EZWZhdWx0IGFjY2VzczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDM5IHIxYzItdDM5Ij5TZWxlY3Qgd2hldGhlciB0aGUgZW50aXR5J3MgYWNjZXNzIHRvIGluc3RhbmNlIHZhcmlhYmxlcyBpcyA8c3BhbiBjbGFzcz0iYm9sZCI+ZmllbGQ8L3NwYW4+LWJhc2VkIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5wcm9wZXJ0eTwvc3Bhbj4tYmFzZWQsIGFzIGRlZmluZWQgaW4gdGhlIEpQQSBzcGVjaWZpY2F0aW9uLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQzOSIgaGVhZGVycz0icjFjMS10MzkiPkFkZCB0byBwZXJzaXN0ZW5jZSB1bml0PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MzkgcjFjMi10MzkiPlNwZWNpZnkgaWYgdGhpcyBtYXBwaW5nIGZpbGUgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0ICg8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+KS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MzkiIGhlYWRlcnM9InIxYzEtdDM5Ij4mbmJzcDsmbmJzcDtQZXJzaXN0ZW5jZSZuYnNwO1VuaXQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQzOSByMWMyLXQzOSI+U2VsZWN0IHRoZSBwZXJzaXN0ZW5jZSB1bml0IGluIHdoaWNoIHRvIGFkZCB0aGUgbWFwcGluZyBmaWxlLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGhydWxlaW5mb3JtYWxtYXgiIC0tPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAwMy5odG0jQ0lBSkVJREoiPk1hcHBpbmcgRmlsZTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2phdmFfcGFnZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2phdmFfcGFnZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYmYzZmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9qYXZhX3BhZ2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5KYXZhIFBhZ2U8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSmF2YSBQYWdlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBR0VCQUEiIG5hbWU9IkNJQUdFQkFBIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5KYXZhIFBhZ2U8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBhdmFpbGFibGUgb24gdGhlIEphdmEgcGFnZSBvZiB0aGUgPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT4uPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBEREwgLSBPYmplY3RzIHBhZ2UuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgR2VuZXJhdGUgRERMIC0gT2JqZWN0cyBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjUlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDMiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQzIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzIiBoZWFkZXJzPSJyMWMxLXQzIj5Tb3VyY2UgZm9sZGVycyBvbiBidWlsZCBwYXRoPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MyByMWMyLXQzIj5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIEZvbGRlcjwvc3Bhbj4gdG8gc2VsZWN0IGFuIGV4aXN0aW5nIEphdmEgc291cmNlIGZvbGRlciB0byBhZGQgdG8gdGhpcyBwcm9qZWN0LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDMgcjFjMy10MyI+RWNsaXBzZUxpbms8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MyIgaGVhZGVycz0icjFjMS10MyI+RGVmYXVsdCBvdXRwdXQgZm9sZGVyPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MyByMWMyLXQzIj5TcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUmbmJzcDs8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGVzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDMgcjFjMy10MyI+YnVpbGRcY2xhc3NlczwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfamF4Yl9zY2hlbWFfd2l6YXJkLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfamF4Yl9zY2hlbWFfd2l6YXJkLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJlYjViZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2pheGJfc2NoZW1hX3dpemFyZC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkdlbmVyYXRlIFNjaGVtYSBmcm9tIEpBWEIgQ2xhc3NlcyBXaXphcmQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA2LTA0VDE2OjE4OjEzWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRlIFNjaGVtYSBmcm9tIEpBWEIgQ2xhc3NlcyBXaXphcmQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNHQURGSCIgbmFtZT0iQ0FDR0FERkgiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYXRlIFNjaGVtYSBmcm9tIEpBWEIgQ2xhc3NlcyBXaXphcmQ8L2gxPgotPHA+VXNlIHRoZSBHZW5lcmF0ZSBTY2hlbWEgZnJvbSBKQVhCIENsYXNzZXMgd2l6YXJkIGNyZWF0ZSBhbiBYTUwgc2NoZW1hICgmbmJzcDsueHNkKSBmb3IgYSBzZXQgb2YgSkFYQiBtYXBwZWQgY2xhc3Nlcy48L3A+Ci08cD5UaGUgd2l6YXJkIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgcGFnZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3NjaGVtYV9mcm9tX2NsYXNzZXNfcGFnZS5odG0jQ0FDSEJFR0oiPkdlbmVyYXRlIFNjaGVtYSBmcm9tIENsYXNzZXM8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2dlbmVyYXRpbmdfc2NoZW1hX2Zyb21fY2xhc3Nlcy5odG0jQ0lISEJKQ0oiPkdlbmVyYXRpbmcgU2NoZW1hIGZyb20gQ2xhc3NlczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSIjQ0FDR0FERkgiPkdlbmVyYXRlIFNjaGVtYSBmcm9tIEpBWEIgQ2xhc3NlcyBXaXphcmQ8L2E+IDwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2pvaW5fY29sdW1ucy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2pvaW5fY29sdW1ucy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MzJjYmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9qb2luX2NvbHVtbnMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Kb2luIENvbHVtbnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSm9pbiBDb2x1bW5zIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBRUdFRUciIG5hbWU9IkNJQUVHRUVHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Kb2luIENvbHVtbnM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIwOSIgbmFtZT0ic3RocmVmMjA5Ij48L2E+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIGpvaW4gY29sdW1ucyBvZiBhbiBhc3NvY2lhdGlvbiB0YWJsZS48L3A+Ci08cD5DbGljayBBZGQgdG8gc3BlY2lmeSB0aGUgam9pbiBjb2x1bW5zIGJldHdlZW4gdGhlIHR3byB0YWJsZXMuPC9wPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSNDSUFGR0hJRiI+Q3JlYXRlIE5ldyBBc3NvY2lhdGlvbjwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tzMDIxLmh0bSNCQUJCQUdGSSI+R2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0jQ0lBR0JGSkUiPkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIFdpemFyZDwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2pwYV9mYWNldC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2pwYV9mYWNldC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZTRmZjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9qcGFfZmFjZXQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+SlBBIEZhY2V0IHBhZ2U8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSlBBIEZhY2V0IHBhZ2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNJRkRJRiIgbmFtZT0iQ0FDSUZESUYiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpQQSBGYWNldCBwYWdlPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIG9uIHRoZSBKUEEgRmFjZXQgcGFnZSBvZiB0aGUgPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT4uPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBEREwgLSBPYmplY3RzIHBhZ2UuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgR2VuZXJhdGUgRERMIC0gT2JqZWN0cyBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjUlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10NCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDQiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQ0Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ0IiBoZWFkZXJzPSJyMWMxLXQ0Ij5QbGF0Zm9ybTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDQgcjFjMi10NCI+VmVuZG9yLXNwZWNpZmljIEpQQSBpbXBsZW1lbnRhdGlvbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ0IHIxYzMtdDQiPkVjbGlwc2VMaW5rPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPjxhIGlkPSJzdGhyZWYxOTEiIG5hbWU9InN0aHJlZjE5MSI+PC9hPjxhIGlkPSJzdGhyZWYxOTIiIG5hbWU9InN0aHJlZjE5MiI+PC9hPkpQQSBJbXBsZW1lbnRhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDQgcjFjMi10NCI+U2VsZWN0IGEgc3BlY2lmaWMgSlBBIGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5NYW5hZ2UgbGlicmFyaWVzPC9zcGFuPiB0byBjcmVhdGUgb3IgdXBkYXRlIGEgdXNlciBsaWJyYXJ5LjwvcD4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Eb3dubG9hZCBsaWJyYXJpZXM8L3NwYW4+IHRvIGRvd25sb2FkIGEgc3BlY2lmaWMgbGlicmFyeSBjb25maWd1cmF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDQgcjFjMy10NCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPiZuYnNwOyZuYnNwO1R5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ0IHIxYzItdDQiPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+VXNlciBMaWJyYXJ5PC9zcGFuPiB0byBzZWxlY3QgZnJvbSB0aGUgYXZhaWxhYmxlIHVzZXItZGVmaW5lZCBvciBkb3dubG9hZGVkIGxpYnJhcmllcy4KLTxwPklmIHlvdSBzZWxlY3QgRGlzYWJsZSwgeW91IG11c3QgbWFudWFsbHkgaW5jbHVkZSB0aGUgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnkgb24gdGhlIHByb2plY3QgY2xhc3NwYXRoLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDQgcjFjMy10NCI+VXNlciBMaWJyYXJ5PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPiZuYnNwOyZuYnNwO0luY2x1ZGUgbGlicmFyaWVzIHdpdGggdGhpcyBhcHBsaWNhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDQgcjFjMi10NCI+U3BlY2lmeSBpZiB0aGUgc2VsZWN0ZWQgbGlicmFyaWVzIGFyZSBpbmNsdWRlZCB3aGVuIGRlcGxveWluZyB0aGUgYXBwbGljYXRpb24uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NCByMWMzLXQ0Ij5TZWxlY3RlZDwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQ0IiBoZWFkZXJzPSJyMWMxLXQ0Ij5Db25uZWN0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NCByMWMyLXQ0Ij5TZWxlY3QgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdG8gdXNlIHdpdGggdGhlIHByb2plY3QuIERhbGkgcmVxdWlyZXMgYW4gYWN0aXZlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdG8gdXNlIGFuZCB2YWxpZGF0ZSB0aGUgcGVyc2lzdGVudCBlbnRpdGllcyBhbmQgbWFwcGluZ3MuCi08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIGNvbm5lY3Rpb248L3NwYW4+IHRvIGNyZWF0ZSBhIG5ldyBkYXRhYmFzZSBjb25uZWN0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDQgcjFjMy10NCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPiZuYnNwOyZuYnNwO092ZXJyaWRlJm5ic3A7ZGVmYXVsdCBzY2hlbWEgZnJvbSBjb25uZWN0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10NCByMWMyLXQ0Ij5TZWxlY3QgYSBzY2hlbWEgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBvbmUgdGhhdCBpcyBkZXJpdmVkIGZyb20gdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24uIFVzZSB0aGlzIG9wdGlvbiBpZiB0aGUgZGVmYXVsdCBzY2hlbWEgY2Fubm90IGJlIHVzZWQuIEZvciBleGFtcGxlLCB1c2UgdGhpcyBvcHRpb24gd2hlbiB0aGUgZGVwbG95bWVudCBsb2dpbiBkaWZmZXJzIGZyb20gdGhlIGRlc2lnbi10aW1lIGxvZ2luLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDQgcjFjMy10NCI+VGhlIHZhbHVlIGNhbGN1bGF0ZWQgYnkgRGFsaS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10NCIgaGVhZGVycz0icjFjMS10NCI+SlBBIEltcGxlbWVudGF0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10NCByMWMyLXQ0Ij5TZWxlY3QgdG8gdXNlIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+SlBBIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBzZXJ2ZXIgYXQgcnVudGltZTwvc3Bhbj4sIG9yIHNlbGVjdCBhIHNwZWNpZmljIDxzcGFuIGNsYXNzPSJib2xkIj5pbXBsZW1lbnRhdGlvbiBsaWJyYXJ5PC9zcGFuPiB0aGF0IGNvbnRhaW4gdGhlIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIGFuZCBlbnRpdGllcyB0byBiZSBhZGRlZCB0byB0aGUgcHJvamVjdCdzIEphdmEgQnVpbGQgUGF0aC4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Db25maWd1cmUgZGVmYXVsdCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeTwvc3Bhbj4gdG8gY3JlYXRlIGEgZGVmYXVsdCBsaWJyYXJ5IGZvciB0aGUgcHJvamVjdCBvciBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+Q29uZmlndXJlIHVzZXIgbGlicmFyaWVzPC9zcGFuPiB0byBkZWZpbmUgYWRkaXRpb25hbCBsaWJyYXJpZXMuPC9wPgotPHA+RGVwZW5kaW5nIG9uIHlvdXIgSlBBIGltcGxlbWVudGF0aW9uIChmb3IgZXhhbXBsZSwgR2VuZXJpYyBvciBFY2xpcHNlTGluayksIGRpZmZlcmVudCBvcHRpb25zIG1heSBiZSBhdmFpbGFibGUgd2hlbiB3b3JraW5nIHdpdGggSlBBIHByb2plY3RzLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDQgcjFjMy10NCI+RGV0ZXJtaW5lZCBieSBzZXJ2ZXIuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI5YzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPjxhIGlkPSJzdGhyZWYxOTMiIG5hbWU9InN0aHJlZjE5MyI+PC9hPlBlcnNpc3RlbnQgY2xhc3MgbWFuYWdlbWVudDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDQgcjFjMi10NCI+U3BlY2lmeSBpZiBEYWxpIHdpbGwgPHNwYW4gY2xhc3M9ImJvbGQiPmRpc2NvdmVyIGFubm90YXRlZCBjbGFzc2VzIGF1dG9tYXRpY2FsbHk8L3NwYW4+LCBvciBpZiB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPmFubm90YXRlZCBjbGFzc2VzIG11c3QgYmUgbGlzdGVkIGluIHRoZSBwZXJzaXN0ZW5jZS54bWw8L3NwYW4+IGZpbGUuCi08cD48c3BhbiBjbGFzcz0iYm9sZCI+Tm90ZTwvc3Bhbj46IFRvIGluc3VyZSBhcHBsaWNhdGlvbiBwb3J0YWJpbGl0eSwgeW91IHNob3VsZCBleHBsaWNpdGx5IGxpc3QgdGhlIG1hbmFnZWQgcGVyc2lzdGVuY2UgY2xhc3NlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQ0IHIxYzMtdDQiPkRldGVybWluZWQgYnkgc2VydmVyLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTBjMS10NCIgaGVhZGVycz0icjFjMS10NCI+PGEgaWQ9InN0aHJlZjE5NCIgbmFtZT0ic3RocmVmMTk0Ij48L2E+Q3JlYXRlIDxjb2RlPm9ybS54bWw8L2NvZGU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDQgcjFjMi10NCI+U3BlY2lmeSBpZiBEYWxpIHNob3VsZCBjcmVhdGUgYSBkZWZhdWx0IDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgZm9yIHlvdXIgZW50aXR5IG1hcHBpbmdzIGFuZCBwZXJzaXN0ZW5jZSB1bml0IGRlZmF1bHRzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQ0IHIxYzMtdDQiPlNlbGVjdGVkPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9tYXBwaW5nX2dlbmVyYWwuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9tYXBwaW5nX2dlbmVyYWwuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjAyYmI2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbWFwcGluZ19nZW5lcmFsLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkdlbmVyYWwgaW5mb3JtYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhbCBpbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0JIRklKIiBuYW1lPSJDQUNCSEZJSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhbCBpbmZvcm1hdGlvbjwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBHZW5lcmFsIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SmF2YSBEZXRhaWxzIHZpZXc8L3NwYW4+IGZvciBlYWNoIG1hcHBpbmcgdHlwZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjElIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjI3JSIgLz4KLTxjb2wgd2lkdGg9IjIxJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE2Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTYiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxNiI+RGVmYXVsdDwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjNC10MTYiPkF2YWlsYWJsZSBmb3IgTWFwcGluZyBUeXBlPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPk1hcHBpbmcgVHlwZSBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNiByMWMyLXQxNiI+Q2xpY2tpbmcgdGhlIG5hbWUgb2YgdGhlIG1hcHBpbmcgdHlwZSwgd2hpY2ggaXMgcmVwcmVzZW50ZWQgYXMgYSBoeXBlcmxpbmssIGludm9rZXMgdGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nLiBVc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBhdHRyaWJ1dGUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTYgcjFjMy10MTYiPkJhc2ljPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTYgcjFjNC10MTYiPkFsbCBtYXBwaW5nIHR5cGVzPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+PGEgaWQ9IkNBQ0dDQkhCIiBuYW1lPSJDQUNHQ0JIQiI+PC9hPkNvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE2IHIxYzItdDE2Ij48YSBpZD0ic3RocmVmMjMxIiBuYW1lPSJzdGhyZWYyMzEiPjwvYT48YSBpZD0ic3RocmVmMjMyIiBuYW1lPSJzdGhyZWYyMzIiPjwvYT5UaGUgZGF0YWJhc2UgY29sdW1uIHRoYXQgY29udGFpbnMgdGhlIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AQ29sdW1uPC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE2IHIxYzMtdDE2Ij5CeSBkZWZhdWx0LCB0aGUgQ29sdW1uIGlzIGFzc3VtZWQgdG8gYmUgbmFtZWQgaWRlbnRpY2FsbHkgdG8gdGhlIGF0dHJpYnV0ZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTkuaHRtI0JBQkhJQklJIj5WZXJzaW9uIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+Jm5ic3A7Jm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE2IHIxYzItdDE2Ij5OYW1lIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4uCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AQ29sdW1uPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE2IHIxYzMtdDE2Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPiZuYnNwOyZuYnNwO1RhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTYgcjFjMi10MTYiPk5hbWUgb2YgdGhlIGRhdGFiYXNlIHRhYmxlIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIGNvbHVtbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtJbnNlcnRhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTYgcjFjMi10MTYiPlNwZWNpZmllcyBpZiB0aGUgY29sdW1uIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiA8Y29kZT5TUUwgSU5TRVJUPC9jb2RlPiBzdGF0ZW1lbnRzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE2IHIxYzMtdDE2Ij5UcnVlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtVcGRhdGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxNiByMWMyLXQxNiI+U3BlY2lmaWVzIGlmIHRoaXMgY29sdW1uIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiA8Y29kZT5TUUwgVVBEQVRFPC9jb2RlPiBzdGF0ZW1lbnRzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE2IHIxYzMtdDE2Ij5UcnVlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtVbmlxdWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQxNiByMWMyLXQxNiI+U2V0cyB0aGUgPGNvZGU+VU5JUVVFPC9jb2RlPiBjb25zdHJhaW50IGZvciB0aGUgY29sdW1uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDE2IHIxYzMtdDE2Ij5GYWxzZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI5YzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+Jm5ic3A7Jm5ic3A7TnVsbGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQxNiByMWMyLXQxNiI+U3BlY2lmaWVzIGlmIHRoZSBjb2x1bW4gYWxsb3dzIG51bGwgdmFsdWVzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDE2IHIxYzMtdDE2Ij5UcnVlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEwYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+Jm5ic3A7Jm5ic3A7TGVuZ3RoPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDE2IHIxYzItdDE2Ij5TZXRzIHRoZSBjb2x1bW4gbGVuZ3RoLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQxNiByMWMzLXQxNiI+MjU1PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMWMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPiZuYnNwOyZuYnNwO1ByZWNpc2lvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQxNiByMWMyLXQxNiI+U2V0cyB0aGUgcHJlY2lzaW9uIGZvciB0aGUgY29sdW1uIHZhbHVlcy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MTYgcjFjMy10MTYiPjA8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEyYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+Jm5ic3A7Jm5ic3A7U2NhbGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTJjMS10MTYgcjFjMi10MTYiPlNldHMgdGhlIG51bWJlciBvZiBkaWdpdHMgdGhhdCBhcHBlYXIgdG8gdGhlIHJpZ2h0IG9mIHRoZSBkZWNpbWFsIHBvaW50LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQxNiByMWMzLXQxNiI+MDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTNjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtDb2x1bW4gRGVmaW5pdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxM2MxLXQxNiByMWMyLXQxNiI+RGVmaW5lIHRoZSBEREwgZm9yIGEgY29sdW1uLiBUaGlzIGlzIHVzZWQgd2hlbiBhIHRhYmxlIGlzIGJlaW5nIGdlbmVyYXRlZC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTNjMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxM2MxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTRjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij48YSBpZD0iQ0FDR0dHSEIiIG5hbWU9IkNBQ0dHR0hCIj48L2E+PGEgaWQ9InN0aHJlZjIzMyIgbmFtZT0ic3RocmVmMjMzIj48L2E+PGEgaWQ9InN0aHJlZjIzNCIgbmFtZT0ic3RocmVmMjM0Ij48L2E+PGEgaWQ9InN0aHJlZjIzNSIgbmFtZT0ic3RocmVmMjM1Ij48L2E+RmV0Y2ggVHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNGMxLXQxNiByMWMyLXQxNiI+RGVmaW5lcyBob3cgZGF0YSBpcyBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2U6Ci08dWw+Ci08bGk+Ci08cD5FYWdlciAmbmRhc2g7IERhdGEgaXMgbG9hZGVkIGluIGJlZm9yZSBpdCBpcyBhY3R1YWxseSBuZWVkZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPkxhenkgJm5kYXNoOyBEYXRhIGlzIGxvYWRlZCBvbmx5IHdoZW4gcmVxdWlyZWQgYnkgdGhlIHRyYW5zYWN0aW9uLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE0YzEtdDE2IHIxYzMtdDE2Ij5FYWdlcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNGMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNC5odG0jQkFCRUlFR0QiPk1hbnktdG8tbWFueSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTUuaHRtI0JBQkhGQUZKIj5NYW55LXRvLW9uZSBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTVjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij5PcHRpb25hbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNWMxLXQxNiByMWMyLXQxNiI+U3BlY2lmaWVzIGlmIHRoaXMgZmllbGQgaXMgY2FuIGJlIG51bGwuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE1YzEtdDE2IHIxYzMtdDE2Ij5ZZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTVjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE3Lmh0bSNCQUJGSEJDSiI+T25lLXRvLW9uZSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTUuaHRtI0JBQkhGQUZKIj5NYW55LXRvLW9uZSBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTZjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij48YSBpZD0iQ0FDQkJJQkkiIG5hbWU9IkNBQ0JCSUJJIj48L2E+PGEgaWQ9InN0aHJlZjIzNiIgbmFtZT0ic3RocmVmMjM2Ij48L2E+TG9iPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE2YzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZ5IGlmIHRoZSBmaWVsZCBpcyBtYXBwZWQgdG8gPGNvZGU+amF2YS5zcWwuQ2xvYjwvY29kZT4gb3IgPGNvZGU+amF2YS5zcWwuQmxvYjwvY29kZT4uCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ATG9iPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNmMxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE2YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxN2MxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPjxhIGlkPSJDQUNFQUpHRCIgbmFtZT0iQ0FDRUFKR0QiPjwvYT48YSBpZD0ic3RocmVmMjM3IiBuYW1lPSJzdGhyZWYyMzciPjwvYT48YSBpZD0ic3RocmVmMjM4IiBuYW1lPSJzdGhyZWYyMzgiPjwvYT48YSBpZD0ic3RocmVmMjM5IiBuYW1lPSJzdGhyZWYyMzkiPjwvYT5UZW1wb3JhbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxN2MxLXQxNiByMWMyLXQxNiI+U3BlY2lmaWVzIGlmIHRoaXMgZmllbGQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci08dWw+Ci08bGk+Ci08cD5EYXRlICZuZGFzaDsgPGNvZGU+amF2YS5zcWwuRGF0ZTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+VGltZSAmbmRhc2g7IDxjb2RlPmphdmEuc3FsLlRpbWU8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPlRpbWVzdGFtcCAmbmRhc2g7IDxjb2RlPmphdmEuc3FsLlRpbWVzdGFtcDwvY29kZT48L3A+Ci08L2xpPgotPC91bD4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBUZW1wb3JhbDwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTdjMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxN2MxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMThjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij48YSBpZD0ic3RocmVmMjQwIiBuYW1lPSJzdGhyZWYyNDAiPjwvYT48YSBpZD0ic3RocmVmMjQxIiBuYW1lPSJzdGhyZWYyNDEiPjwvYT48YSBpZD0ic3RocmVmMjQyIiBuYW1lPSJzdGhyZWYyNDIiPjwvYT5FbnVtZXJhdGVkPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE4YzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZ5IGhvdyB0byBwZXJzaXN0IGVudW1lcmF0ZWQgY29uc3RyYWludHMgaWYgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUgc3VpdHMgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMgb3IgdG8gbWF0Y2ggYW4gZXhpc3RpbmcgZGF0YWJhc2Ugc2NoZW1hLgotPHVsPgotPGxpPgotPHA+b3JkaW5hbDwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5TdHJpbmc8L2NvZGU+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ARW51bWVyYXRlZDwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMThjMS10MTYgcjFjMy10MTYiPk9yZGluYWw8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMThjMS10MTYgcjFjNC10MTYiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTljMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij5UYXJnZXQgRW50aXR5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE5YzEtdDE2IHIxYzItdDE2Ij5UaGUgcGVyc2lzdGVudCBlbnRpdHkgdG8gd2hpY2ggdGhlIGF0dHJpYnV0ZSBpcyBtYXBwZWQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE5YzEtdDE2IHIxYzMtdDE2Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTljMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDE3Lmh0bSNCQUJGSEJDSiI+T25lLXRvLW9uZSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTYuaHRtI0JBQkhHRUJEIj5PbmUtdG8tbWFueSBtYXBwaW5nPC9hPiA8YSBocmVmPSJ0YXNrczAxNC5odG0jQkFCRUlFR0QiPk1hbnktdG8tbWFueSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTUuaHRtI0JBQkhGQUZKIj5NYW55LXRvLW9uZSBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMjBjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij48YSBpZD0ic3RocmVmMjQzIiBuYW1lPSJzdGhyZWYyNDMiPjwvYT5JRDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMGMxLXQxNiByMWMyLXQxNiI+U3BlY2lmeSBpZiB0aGUgZW50aXR5J3MgSUQgaXMgZGVyaXZlZCBmcm9tIHRoZSBpZGVudGl0eSBvZiBhbm90aGVyIGVudGl0eS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjBjMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMGMxLXQxNiByMWM0LXQxNiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyMWMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPjxhIGlkPSJDQUNKQUlIQiIgbmFtZT0iQ0FDSkFJSEIiPjwvYT5DYXNjYWRlIFR5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjFjMS10MTYgcjFjMi10MTYiPlNwZWNpZnkgd2hpY2ggb3BlcmF0aW9ucyBhcmUgcHJvcGFnYXRlZCB0aHJvdWdob3V0IHRoZSBlbnRpdHkuCi08dWw+Ci08bGk+Ci08cD5BbGwgJm5kYXNoOyBBbGwgb3BlcmF0aW9uczwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QZXJzaXN0PC9wPgotPC9saT4KLTxsaT4KLTxwPk1lcmdlPC9wPgotPC9saT4KLTxsaT4KLTxwPk1vdmU8L3A+Ci08L2xpPgotPGxpPgotPHA+UmVtb3ZlPC9wPgotPC9saT4KLTxsaT4KLTxwPlJlZnJlc2g8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMWMxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIxYzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxNy5odG0jQkFCRkhCQ0oiPk9uZS10by1vbmUgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJIR0VCRCI+T25lLXRvLW1hbnkgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJFSUVHRCI+TWFueS10by1tYW55IG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyMmMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPjxhIGlkPSJDQUNKREpKQSIgbmFtZT0iQ0FDSkRKSkEiPjwvYT5NYXBwZWQgQnk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjJjMS10MTYgcjFjMi10MTYiPlRoZSBmaWVsZCBpbiB0aGUgZGF0YWJhc2UgdGFibGUgdGhhdCAib3ducyIgdGhlIHJlbGF0aW9uc2hpcC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBvbmx5IG9uIHRoZSBub24tb3duaW5nIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjJjMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMmMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNi5odG0jQkFCSEdFQkQiPk9uZS10by1tYW55IG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyM2MxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPjxhIGlkPSJDQUNEQURJSCIgbmFtZT0iQ0FDREFESUgiPjwvYT48YSBpZD0ic3RocmVmMjQ0IiBuYW1lPSJzdGhyZWYyNDQiPjwvYT48YSBpZD0ic3RocmVmMjQ1IiBuYW1lPSJzdGhyZWYyNDUiPjwvYT5PcmRlciBCeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyM2MxLXQxNiByMWMyLXQxNiI+U3BlY2lmeSB0aGUgZGVmYXVsdCBvcmRlciBmb3Igb2JqZWN0cyByZXR1cm5lZCBmcm9tIGEgcXVlcnk6Ci08dWw+Ci08bGk+Ci08cD5ObyBvcmRlcmluZzwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QcmltYXJ5IGtleTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DdXN0b20gb3JkZXJpbmc8L3A+Ci08L2xpPgotPC91bD4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBPcmRlckJ5PC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyM2MxLXQxNiByMWMzLXQxNiI+UHJpbWFyeSBrZXk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjNjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJIR0VCRCI+T25lLXRvLW1hbnkgbWFwcGluZzwvYT4uIDxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJFSUVHRCI+TWFueS10by1tYW55IG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyNGMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjRjMS10MTYgcjFjMi10MTYiPk92ZXJyaWRlcyA8c3BhbiBjbGFzcz0iYm9sZCI+QmFzaWM8L3NwYW4+IG1hcHBpbmdzIG9mIGEgbWFwcGVkIHN1cGVyY2xhc3MgKGZvciBleGFtcGxlLCBpZiB0aGUgaW5oZXJpdGVkIGNvbHVtbiBuYW1lIGlzIGluY29tcGF0aWJsZSB3aXRoIGEgcHJlLWV4aXN0aW5nIGRhdGEgbW9kZWwsIG9yIGludmFsaWQgYXMgYSBjb2x1bW4gbmFtZSBpbiB5b3VyIGRhdGFiYXNlKS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjRjMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyNGMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPgotPHA+PGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPjwvcD4KLTxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX25ld19qcGFfcHJvamVjdC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX25ld19qcGFfcHJvamVjdC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNTc2ZTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9uZXdfanBhX3Byb2plY3QuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TmV3IEpQQSBQcm9qZWN0IHBhZ2U8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTmV3IEpQQSBQcm9qZWN0IHBhZ2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNCSkFHQyIgbmFtZT0iQ0FDQkpBR0MiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk5ldyBKUEEgUHJvamVjdCBwYWdlPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIG9uIHRoZSBOZXcgSlBBIFByb2plY3QgcGFnZSBvZiB0aGUgPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT4uPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBEREwgLSBPYmplY3RzIHBhZ2UuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgR2VuZXJhdGUgRERMIC0gT2JqZWN0cyBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjUlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyIiBoZWFkZXJzPSJyMWMxLXQyIj5Qcm9qZWN0IG5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyIHIxYzItdDIiPk5hbWUgb2YgdGhlIEVjbGlwc2UgSlBBIHByb2plY3QuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MiByMWMzLXQyIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MiIgaGVhZGVycz0icjFjMS10MiI+UHJvamVjdCBjb250ZW50czwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIgcjFjMi10MiI+TG9jYXRpb24gb2YgdGhlIHdvcmtzcGFjZSBpbiB3aGljaCB0byBzYXZlIHRoZSBwcm9qZWN0LgotPHA+VW5zZWxlY3QgVGhlIDxzcGFuIGNsYXNzPSJib2xkIj5Vc2UgRGVmYXVsdDwvc3Bhbj4gb3B0aW9uIGFuZCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QnJvd3NlPC9zcGFuPiB0byBzZWxlY3QgYSBuZXcgbG9jYXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MiByMWMzLXQyIj5DdXJyZW50IHdvcmtzcGFjZTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyIiBoZWFkZXJzPSJyMWMxLXQyIj5UYXJnZXQgcnVudGltZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDIgcjFjMi10MiI+U2VsZWN0IGEgcHJlLWRlZmluZWQgdGFyZ2V0IGZvciB0aGUgcHJvamVjdC4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXc8L3NwYW4+IHRvIGNyZWF0ZSBhIG5ldyBlbnZpcm9ubWVudCB3aXRoIHRoZSBOZXcgU2VydmVyIFJ1bnRpbWUgd2l6YXJkLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDIgcjFjMy10MiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDIiIGhlYWRlcnM9InIxYzEtdDIiPkNvbmZpZ3VyYXRpb25zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MiByMWMyLXQyIj5TZWxlY3QgYSBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gd2l0aCBwcmUtZGVmaW5lZCBmYWNldHMuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPiZsdDtjdXN0b20mZ3Q7PC9zcGFuPiB0byBtYW51YWxseSBzZWxlY3QgdGhlIGZhY2V0cyBmb3IgdGhpcyBwcm9qZWN0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDIgcjFjMy10MiI+VXRpbGl0eSBKUEEgcHJvamVjdCB3aXRoIEphdmEgNS4wPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDIiIGhlYWRlcnM9InIxYzEtdDIiPkVBUiBtZW1iZXJzaGlwPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MiByMWMyLXQyIj5TcGVjaWZ5IGlmIHRoaXMgcHJvamVjdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYW4gRUFSIGZpbGUgZm9yIGRlcGxveW1lbnQuCi08cD5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5FQVIgUHJvamVjdCBOYW1lPC9zcGFuPiwgb3IgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5ldzwvc3Bhbj4gdG8gY3JlYXRlIGEgbmV3IEVBUiBwcm9qZWN0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDIgcjFjMy10MiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDIiIGhlYWRlcnM9InIxYzEtdDIiPldvcmtpbmcgc2V0czwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDIgcjFjMi10MiI+U3BlY2lmeSBpZiB0aGlzIHByb2plY3Qgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGFuIGV4aXN0aW5nIHdvcmtpbmcgc2V0LiBUaGUgZHJvcCBkb3duIGZpZWxkIHNob3dzIGEgbGlzdCBvZiBwcmV2aW91cyBzZWxlY3RlZCB3b3JraW5nIHNldHMuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCBwcm9qZWN0IHRvIHdvcmtpbmcgc2V0czwvc3Bhbj4sIHRoZW4gc2VsZWN0IGEgd29ya2luZyBzZXQgaW4gd2hpY2ggdG8gYWRkIHRoaXMgcHJvamVjdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQyIHIxYzMtdDIiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTkzMjBiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQkpHQkciIG5hbWU9IkNBQ0JKR0JHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTkwIiBuYW1lPSJzdGhyZWYxOTAiPjwvYT5UaGUgQ3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQgYWxsb3dzIHlvdSB0byBjcmVhdGUgYSBuZXcgSmF2YSBwcm9qZWN0IHVzaW5nIEpQQS4gVGhlIHdpemFyZCBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHBhZ2VzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3QuaHRtI0NBQ0JKQUdDIj5OZXcgSlBBIFByb2plY3QgcGFnZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2phdmFfcGFnZS5odG0jQ0lBR0VCQUEiPkphdmEgUGFnZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jQ0FDSUZESUYiPkpQQSBGYWNldCBwYWdlPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX2dlbmVyYWwuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTZmMDk5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmFsPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYWwiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFDSUZHSiIgbmFtZT0iQ0lBQ0lGR0oiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYWw8L2gxPgotPHA+VGhlIGZvbGxvd2luZyB0YWJsZSBsaXN0cyBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB0aGUgR2VuZXJhbCBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyNTgiIG5hbWU9InN0aHJlZjI1OCI+PC9hPjxhIGlkPSJzdGhyZWYyNTkiIG5hbWU9InN0aHJlZjI1OSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW50YWJsZSI+UHJvcGVydGllcyBvZiB0aGUgR2VuZXJhbCBQYWdlPC9wPgotPHRhYmxlIGNsYXNzPSJGb3JtYWwiIHRpdGxlPSJQcm9wZXJ0aWVzIG9mIHRoZSBHZW5lcmFsIFBhZ2UiIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwmcnNxdW87cyBHZW5lcmFsIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyNCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI0Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjQiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI0IiBoZWFkZXJzPSJyMWMxLXQyNCI+Ci08cD5OYW1lPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjQgcjFjMi10MjQiPgotPHA+RW50ZXIgdGhlIG5hbWUgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjQgcjFjMy10MjQiPgotPHA+VGhlIHByb2plY3QgbmFtZS48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjQiIGhlYWRlcnM9InIxYzEtdDI0Ij4KLTxwPlBlcnNpc3RlbmNlIFByb3ZpZGVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjQgcjFjMi10MjQiPgotPHA+RW50ZXIgdGhlIG5hbWUgb2YgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI0IHIxYzMtdDI0Ij4KLTxwPkRldGVybWluZWQgYnkgdGhlIHNlcnZlci48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjQiIGhlYWRlcnM9InIxYzEtdDI0Ij4KLTxwPkRlc2NyaXB0aW9uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjQgcjFjMi10MjQiPgotPHA+RW50ZXIgYSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBwZXJzaXN0ZW5jZSB1bml0LiBUaGlzIGlzIGFuIG9wdGlvbmFsIHByb3BlcnR5LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI0IHIxYzMtdDI0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MjQiIGhlYWRlcnM9InIxYzEtdDI0Ij4KLTxwPk1hbmFnZWQgQ2xhc3NlczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI0IHIxYzItdDI0Ij4KLTxwPkFkZCBvciByZW1vdmUgdGhlIGNsYXNzZXMgbWFuYWdlZCB0aHJvdWdoIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI0IHIxYzMtdDI0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MjQiIGhlYWRlcnM9InIxYzEtdDI0Ij4KLTxwPkV4Y2x1ZGUgVW5saXN0ZWQgQ2xhc3NlczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDI0IHIxYzItdDI0Ij4KLTxwPlNlbGVjdCB0byBpbmNsdWRlIGFsbCBhbm5vdGF0ZWQgZW50aXR5IGNsYXNzZXMgaW4gdGhlIHJvb3Qgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjQgcjFjMy10MjQiPgotPHA+RmFsc2U8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MjQiIGhlYWRlcnM9InIxYzEtdDI0Ij4KLTxwPlhNTCBNYXBwaW5nIEZpbGVzPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjQgcjFjMi10MjQiPgotPHA+QWRkIG9yIHJlbW92ZSB0aGUgb2JqZWN0L3JlbGF0aW9uYWwgbWFwcGluZyBYTUwgZmlsZXMgdGhhdCBkZWZpbmUgdGhlIGNsYXNzZXMgdG8gYmUgbWFuYWdlZCBieSB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQyNCByMWMzLXQyNCI+Ci08cD5NZXRhLUlORlxvcm0ueG1sPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDI0IiBoZWFkZXJzPSJyMWMxLXQyNCI+Ci08cD5KQVIgRmlsZXM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQyNCByMWMyLXQyNCI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MjQgcjFjMy10MjQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBkMjY3My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQklGQkFGIiBuYW1lPSJCQUJJRkJBRiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyMjgiIG5hbWU9InN0aHJlZjIyOCI+PC9hPjxhIGlkPSJzdGhyZWYyMjkiIG5hbWU9InN0aHJlZjIyOSI+PC9hPjxhIGlkPSJzdGhyZWYyMzAiIG5hbWU9InN0aHJlZjIzMCI+PC9hPlRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZGlzcGxheXMgdGhlIHBlcnNpc3RlbmNlIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1hcHBlZCBhdHRyaWJ1dGUgYW5kIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXJlYXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDQkhGSUoiPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxMS5odG0jQ0FDQkFFQkMiPkpvaW4gVGFibGUgSW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jQ0FDRkNFSkMiPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNDQUNGQ0NBQiI+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkYWZjZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5KUEEgU3RydWN0dXJlIHZpZXc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSlBBIFN0cnVjdHVyZSB2aWV3IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRUdHRkUiIG5hbWU9IkJBQkVHR0ZFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5KUEEgU3RydWN0dXJlIHZpZXc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjI1NSIgbmFtZT0ic3RocmVmMjU1Ij48L2E+PGEgaWQ9InN0aHJlZjI1NiIgbmFtZT0ic3RocmVmMjU2Ij48L2E+VGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgU3RydWN0dXJlPC9zcGFuPiB2aWV3IGRpc3BsYXlzIGFuIG91dGxpbmUgb2YgdGhlIHN0cnVjdHVyZSAoaXRzIGF0dHJpYnV0ZXMgYW5kIG1hcHBpbmdzKSBvZiB0aGUgZW50aXR5IHRoYXQgaXMgY3VycmVudGx5IHNlbGVjdGVkIG9yIG9wZW5lZCBpbiB0aGUgZWRpdG9yLiBUaGUgc3RydWN0dXJhbCBlbGVtZW50cyBzaG93biBpbiB0aGUgb3V0bGluZSBhcmUgdGhlIGVudGl0eSBhbmQgaXRzIGZpZWxkcy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYyNTciIG5hbWU9InN0aHJlZjI1NyI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlNhbXBsZSBKUEEgU3RydWN0dXJlIFZpZXc8L3A+Ci08aW1nIHNyYz0iaW1nL3BlcnNpc3RlbmNlX291dGxpbmVfdmlldy5wbmciIGFsdD0iU2FtcGxlIEpQQSBTdHJ1Y3R1cmUgdmlldyBmb3IgYW4gZW50aXR5LiIgdGl0bGU9IlNhbXBsZSBKUEEgU3RydWN0dXJlIHZpZXcgZm9yIGFuIGVudGl0eS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvYT4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZThjYWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJJRkJEQiIgbmFtZT0iQkFCSUZCREIiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjg2IiBuYW1lPSJzdGhyZWYyODYiPjwvYT48YSBpZD0ic3RocmVmMjg3IiBuYW1lPSJzdGhyZWYyODciPjwvYT5UaGUgPHNwYW4gY2xhc3M9ImJvbGQiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvc3Bhbj4gZGVmaW5lcyB0aGUgaW5pdGlhbCBzZXQgYW5kIGxheW91dCBvZiB2aWV3cyBpbiB0aGUgV29ya2JlbmNoIHdpbmRvdyB3aGVuIHVzaW5nIERhbGkuIEJ5IGRlZmF1bHQsIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9zcGFuPiBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIHZpZXdzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtI0NBQ0dER0hDIj5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPHA+PGEgaHJlZj0iLi4vb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvY29uY2VwdHMvY29uY2VwdHMtNC5odG0iPlBlcnNwZWN0aXZlczwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOGUwMTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcykiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJGQUVCQiIgbmFtZT0iQkFCRkFFQkIiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIxMSIgbmFtZT0ic3RocmVmMjExIj48L2E+PGEgaWQ9InN0aHJlZjIxMiIgbmFtZT0ic3RocmVmMjEyIj48L2E+PGEgaWQ9InN0aHJlZjIxMyIgbmFtZT0ic3RocmVmMjEzIj48L2E+VGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBkaXNwbGF5cyB0aGUgcGVyc2lzdGVuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZW50aXR5IGFuZCBjb250YWlucyB0aGUgZm9sbG93aW5nIHRhYnM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDA2Lmh0bSNDQUNDQUdHQyI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDA3Lmh0bSNDQUNJSkJHSCI+QXR0cmlidXRlIG92ZXJyaWRlczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDA4Lmh0bSNDQUNCSElEQSI+U2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI0NBQ0ZIR0hFIj5Jbmhlcml0YW5jZSBpbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3htbGxfZWRpdG9yLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjc5MDAwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9InBlcnNpc3RlbmNlLnhtbCBFZGl0b3IiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFDQ0hJRCIgbmFtZT0iQ0lBQ0NISUQiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2gxPgotPHA+VGhlIHBlcnNpc3RlbmNlLnhtbCBFZGl0b3IgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRoYXQgZW5hYmxlcyB5b3UgdG8gdXBkYXRlIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZS4gRm9yIHByb2plY3RzIHVzaW5nIHRoZSBFY2xpcHNlTGluayBwbGF0Zm9ybSwgdGhlIHBlcmlzaXN0ZW5jZS54bWwgRWRpdG9yIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgcGFnZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX2dlbmVyYWwuaHRtI0NJQUNJRkdKIj5HZW5lcmFsPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMTguaHRtI0NJQUZGSklFIj5Db25uZWN0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMTkuaHRtI0NJQUpBRkVHIj5DdXN0b21pemF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjAuaHRtI0NJQUJFRENIIj5DYWNoaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjEuaHRtI0NJQUJHSEhJIj5Mb2dnaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjIuaHRtI0NJQUZKQ0hFIj5PcHRpb25zPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjMuaHRtI0NJQUNDRkNCIj5TY2hlbWEgR2VuZXJhdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI0Lmh0bSNDSUFISkRGRiI+UHJvcGVydGllczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI1Lmh0bSNDSUFIQ0pBSCI+U291cmNlPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+Rm9yIHByb2plY3RzIHVzaW5nIHRoZSBHZW5lcmljIHBsYXRmb3JtLCB0aGUgZm9sbG93aW5nIHN1YnNldCBvZiB0aGVzZSBwYWdlcyBpcyBhdmFpbGFibGU6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX2dlbmVyYWwuaHRtI0NJQUNJRkdKIj5HZW5lcmFsPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMTguaHRtI0NJQUZGSklFIj5Db25uZWN0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjQuaHRtI0NJQUhKREZGIj5Qcm9wZXJ0aWVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjUuaHRtI0NJQUhDSkFIIj5Tb3VyY2U8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wcmltYXJ5X2tleS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3ByaW1hcnlfa2V5Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhZTAxOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3ByaW1hcnlfa2V5Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0ZDQ0FCIiBuYW1lPSJDQUNGQ0NBQiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbjwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbjwvc3Bhbj4gYXJlYSBpbiBKUEEgRGV0YWlscyB2aWV3IGZvciA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+IHR5cGVzLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBKb2luIENvbHVtbnMgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gQ29sdW1ucyB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzNCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxOSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE5Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTkiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+PGEgaWQ9IkNBQ0JBSkJDIiBuYW1lPSJDQUNCQUpCQyI+PC9hPlByaW1hcnkgS2V5IEdlbmVyYXRpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxOSByMWMyLXQxOSI+PGEgaWQ9InN0aHJlZjI1MSIgbmFtZT0ic3RocmVmMjUxIj48L2E+PGEgaWQ9InN0aHJlZjI1MiIgbmFtZT0ic3RocmVmMjUyIj48L2E+VGhlc2UgZmllbGRzIGRlZmluZSBob3cgdGhlIHByaW1hcnkga2V5IGlzIGdlbmVyYXRlZC4gVGhlc2UgZmllbGRzIGNvcnJlc3BvbmQgdG8gdGhlIDxjb2RlPkBHZW5lcmF0ZWRWYWx1ZTwvY29kZT4gYW5ub3RhdGlvbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxOSByMWMzLXQxOSI+R2VuZXJhdGVkIFZhbHVlPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+PGEgaWQ9IkNBQ0pFRUVDIiBuYW1lPSJDQUNKRUVFQyI+PC9hPiZuYnNwOyZuYnNwOyZuYnNwO1N0cmF0ZWd5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTkgcjFjMi10MTkiPgotPHVsPgotPGxpPkF1dG88L2xpPgotPGxpPgotPHA+SWRlbnRpdHkgJm5kYXNoOyBWYWx1ZXMgYXJlIGFzc2lnbmVkIGJ5IHRoZSBkYXRhYmFzZSdzIDxzcGFuIGNsYXNzPSJib2xkIj5JZGVudGl0eTwvc3Bhbj4gY29sdW1uLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZXF1ZW5jZSAmbmRhc2g7IFZhbHVlcyBhcmUgYXNzaWduZWQgYnkgYSBzZXF1ZW5jZSB0YWJsZSAoc2VlIDxhIGhyZWY9IiNDQUNGRkhFSCI+U2VxdWVuY2UmbmJzcDtHZW5lcmF0b3I8L2E+KS48L3A+Ci08L2xpPgotPGxpPgotPHA+VGFibGUgJm5kYXNoOyBWYWx1ZXMgYXJlIGFzc2lnbmVkIGJ5IGEgZGF0YWJhc2UgdGFibGUgKHNlZSA8YSBocmVmPSIjQ0FDR0ZFQUgiPlRhYmxlIEdlbmVyYXRvcjwvYT4pLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTkgcjFjMy10MTkiPkF1dG88L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij48YSBpZD0iQkFCRUVBSEoiIG5hbWU9IkJBQkVFQUhKIj48L2E+Jm5ic3A7Jm5ic3A7R2VuZXJhdG9yIE5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxOSByMWMyLXQxOSI+VW5pcXVlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCB2YWx1ZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+PGEgaWQ9IkNBQ0dGRUFIIiBuYW1lPSJDQUNHRkVBSCI+PC9hPlRhYmxlIEdlbmVyYXRvcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE5IHIxYzItdDE5Ij5UaGVzZSBmaWVsZHMgZGVmaW5lIHRoZSBkYXRhYmFzZSB0YWJsZSB1c2VkIGZvciBnZW5lcmF0aW5nIHRoZSBwcmltYXJ5IGtleSBhbmQgY29ycmVzcG9uZCB0byB0aGUgPGNvZGU+QFRhYmxlR2VuZXJhdG9yPC9jb2RlPiBhbm5vdGF0aW9uLgotPHA+VGhlc2UgZmllbGRzIGFwcGx5IG9ubHkgd2hlbiA8c3BhbiBjbGFzcz0iYm9sZCI+U3RyYXRlZ3k8L3NwYW4+Jm5ic3A7PSZuYnNwOzxzcGFuIGNsYXNzPSJib2xkIj5UYWJsZTwvc3Bhbj4uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTkgcjFjMy10MTkiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPiZuYnNwOyZuYnNwO05hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxOSByMWMyLXQxOSI+VW5pcXVlIG5hbWUgb2YgdGhlIGdlbmVyYXRvci48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7VGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxOSByMWMyLXQxOSI+RGF0YWJhc2UgdGFibGUgdGhhdCBzdG9yZXMgdGhlIGdlbmVyYXRlZCBJRCB2YWx1ZXMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTkgcjFjMy10MTkiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPiZuYnNwOyZuYnNwO1ByaW1hcnkgS2V5IENvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDE5IHIxYzItdDE5Ij5UaGUgY29sdW1uIGluIHRoZSB0YWJsZSBnZW5lcmF0b3IncyA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+IHRoYXQgY29udGFpbnMgdGhlIHByaW1hcnkga2V5LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij4mbmJzcDsmbmJzcDtWYWx1ZSBDb2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQxOSByMWMyLXQxOSI+VGhlIGNvbHVtbiB0aGF0IHN0b3JlcyB0aGUgZ2VuZXJhdGVkIElEIHZhbHVlcy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPiZuYnNwOyZuYnNwO1ByaW1hcnkgS2V5IENvbHVtbiBWYWx1ZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQxOSByMWMyLXQxOSI+VGhlIHZhbHVlIGZvciB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlByaW1hcnkgS2V5IENvbHVtbjwvc3Bhbj4gaW4gdGhlIGdlbmVyYXRvciB0YWJsZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MTkgcjFjMy10MTkiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTFjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij48YSBpZD0iQ0FDRkZIRUgiIG5hbWU9IkNBQ0ZGSEVIIj48L2E+U2VxdWVuY2UmbmJzcDtHZW5lcmF0b3I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MTkgcjFjMi10MTkiPjxhIGlkPSJzdGhyZWYyNTMiIG5hbWU9InN0aHJlZjI1MyI+PC9hPjxhIGlkPSJzdGhyZWYyNTQiIG5hbWU9InN0aHJlZjI1NCI+PC9hPlRoZXNlIGZpZWxkcyBkZWZpbmUgdGhlIHNwZWNpZmljIHNlcXVlbmNlIHVzZWQgZm9yIGdlbmVyYXRpbmcgdGhlIHByaW1hcnkga2V5IGFuZCBjb3JyZXNwb25kIHRvIHRoZSA8Y29kZT5AU2VxdWVuY2VHZW5lcmF0b3I8L2NvZGU+IGFubm90YXRpb24uCi08cD5UaGVzZSBmaWVsZHMgYXBwbHkgb25seSB3aGVuIDxzcGFuIGNsYXNzPSJib2xkIj5TdHJhdGVneTwvc3Bhbj4gPSA8c3BhbiBjbGFzcz0iYm9sZCI+U2VxdWVuY2U8L3NwYW4+LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMmMxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPiZuYnNwOyZuYnNwO05hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTJjMS10MTkgcjFjMi10MTkiPk5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlIHRvIHVzZSBmb3IgZGVmaW5pbmcgcHJpbWFyeSBrZXkgdmFsdWVzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxM2MxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPiZuYnNwOyZuYnNwO1NlcXVlbmNlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDE5IHIxYzItdDE5Ij5VbmlxdWUgbmFtZSBvZiB0aGUgc2VxdWVuY2UuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E2YWE4NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlByb2plY3QgUHJvcGVydGllcyBwYWdlICZuZGFzaDsgSmF2YSBQZXJzaXN0ZW5jZSBPcHRpb25zPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlICZuZGFzaDsgSmF2YSBQZXJzaXN0ZW5jZSBPcHRpb25zIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSkhCQ0kiIG5hbWU9IkJBQkpIQkNJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEphdmEgUGVyc2lzdGVuY2UgT3B0aW9uczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjczIiBuYW1lPSJzdGhyZWYyNzMiPjwvYT48YSBpZD0ic3RocmVmMjc0IiBuYW1lPSJzdGhyZWYyNzQiPjwvYT5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5FcnJvcnMvV2FybmluZ3M8L3NwYW4+IG9wdGlvbnMgb24gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9wZXJ0aWVzPC9zcGFuPiBwYWdlIHRvIHNwZWNpZnkgdGhlIHZhbGlkYXRpb24gb3B0aW9ucyB0byB1c2Ugd2l0aCB0aGUgcHJvamVjdC48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgcGFnZS4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjMyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQzNiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDM2Ij5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MzYiIGhlYWRlcnM9InIxYzEtdDM2Ij5FbmFibGUgcHJvamVjdCBzcGVjaWZpYyBzZXR0aW5nczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDM2IHIxYzItdDM2Ij5TZWxlY3QgdGhlIHRvIG92ZXJyaWRlIHRoZSBnZW5lcmFsIHNldHRpbmdzIGZvciB0aGlzIHByb2plY3QuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDM2IiBoZWFkZXJzPSJyMWMxLXQzNiI+Jm5ic3A7Jm5ic3A7UHJvamVjdCBsZXZlbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDM2IHIxYzItdDM2Ij5TZWxlY3QgdGhlIHdhcm5pbmcgbGV2ZWwgdG8gcmVwb3J0LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQzNiIgaGVhZGVycz0icjFjMS10MzYiPiZuYnNwOyZuYnNwO1BlcnNpc3RlbnQgdW5pdCBsZXZlbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDM2IHIxYzItdDM2Ij5TZWxlY3QgdGhlIHdhcm5pbmcgbGV2ZWwgdG8gcmVwb3J0LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQzNiIgaGVhZGVycz0icjFjMS10MzYiPiZuYnNwOyZuYnNwO1R5cGUgbGV2ZWw8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQzNiByMWMyLXQzNiI+U2VsZWN0IHRoZSB3YXJuaW5nIGxldmVsIHRvIHJlcG9ydC48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MzYiIGhlYWRlcnM9InIxYzEtdDM2Ij4mbmJzcDsmbmJzcDtBdHRyaWJ1dGUgbGV2ZWw8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQzNiByMWMyLXQzNiI+U2VsZWN0IHRoZSB3YXJuaW5nIGxldmVsIHRvIHJlcG9ydC48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MzYiIGhlYWRlcnM9InIxYzEtdDM2Ij4mbmJzcDsmbmJzcDtTY2hlbWEgbWFwcGluZzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDM2IHIxYzItdDM2Ij5TZWxlY3QgdGhlIHdhcm5pbmcgbGV2ZWwgdG8gcmVwb3J0LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQzNiIgaGVhZGVycz0icjFjMS10MzYiPiZuYnNwOyZuYnNwO0ltcGxpZWQmbmJzcDthdHRyaWJ1dGVzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MzYgcjFjMi10MzYiPlNlbGVjdCB0aGUgd2FybmluZyBsZXZlbCB0byByZXBvcnQuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI5YzEtdDM2IiBoZWFkZXJzPSJyMWMxLXQzNiI+Jm5ic3A7Jm5ic3A7SW1wbGllZCZuYnNwO2Fzc29jaWF0aW9uczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDM2IHIxYzItdDM2Ij5TZWxlY3QgdGhlIHdhcm5pbmcgbGV2ZWwgdG8gcmVwb3J0LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTBjMS10MzYiIGhlYWRlcnM9InIxYzEtdDM2Ij4mbmJzcDsmbmJzcDtJbmhlcml0YW5jZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQzNiByMWMyLXQzNiI+U2VsZWN0IHRoZSB3YXJuaW5nIGxldmVsIHRvIHJlcG9ydC48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjExYzEtdDM2IiBoZWFkZXJzPSJyMWMxLXQzNiI+Jm5ic3A7Jm5ic3A7UXVlcmllcyZuYnNwO2FuZCZuYnNwO2dlbmVyYXRvcnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MzYgcjFjMi10MzYiPlNlbGVjdCB0aGUgd2FybmluZyBsZXZlbCB0byByZXBvcnQuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza3MwMjYuaHRtI0JBQkRCQ0JJIj5Nb2RpZnlpbmcgcGVyc2lzdGVudCBwcm9qZWN0IHByb3BlcnRpZXM8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9zY2hlbWFfZnJvbV9jbGFzc2VzX3BhZ2UuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9zY2hlbWFfZnJvbV9jbGFzc2VzX3BhZ2UuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmZmODFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfc2NoZW1hX2Zyb21fY2xhc3Nlc19wYWdlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhdGUgU2NoZW1hIGZyb20gQ2xhc3NlczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDYtMDRUMTY6MTg6MTNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhdGUgU2NoZW1hIGZyb20gQ2xhc3NlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0hCRUdKIiBuYW1lPSJDQUNIQkVHSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdGUgU2NoZW1hIGZyb20gQ2xhc3NlczwvaDE+Ci08cD5Vc2UgdGhpcyBkaWFsb2cgdG8gc2VsZWN0IHRoZSBjbGFzc2VzIGZyb20gd2hpY2ggdG8gZ2VuZXJhdGUgYSBzY2hlbWEuIFlvdSBjYW4gc2VsZWN0IGFuIGVudGlyZSBwcm9qZWN0LCBhIHBhY2thZ2UsIG9yIHNwZWNpZmljIGNsYXNzZXMuPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9zZWxlY3RUYWJsZXMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9zZWxlY3RUYWJsZXMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTdkM2MxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfc2VsZWN0VGFibGVzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+U2VsZWN0IFRhYmxlczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJTZWxlY3QgVGFibGVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBSENHRUUiIG5hbWU9IkNJQUhDR0VFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TZWxlY3QgVGFibGVzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyMDEiIG5hbWU9InN0aHJlZjIwMSI+PC9hPjxhIGlkPSJzdGhyZWYyMDIiIG5hbWU9InN0aHJlZjIwMiI+PC9hPjxhIGlkPSJzdGhyZWYyMDMiIG5hbWU9InN0aHJlZjIwMyI+PC9hPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlNlbGVjdCBUYWJsZXM8L3NwYW4+IGRpYWxvZyB0byBzcGVjaWZ5IHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCB0YWJsZXMgZnJvbSB3aGljaCB0byBjcmVhdGUgZW50aXRpZXMuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBFbnRpdGllcyBkaWFsb2cuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgR2VuZXJhdGUgRW50aXRpZXMgZGlhbG9nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIzMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10OCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDgiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5Db25uZWN0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10OCByMWMyLXQ4Ij5TZWxlY3QgYSBkYXRhYmFzZSBjb25uZWN0aW9uIG9yIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgQ29ubmVjdGlvbjwvc3Bhbj4gdG8gY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPlNjaGVtYTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDggcjFjMi10OCI+U2VsZWN0IHRoZSBkYXRhYmFzZSBzY2hlbWEgZnJvbSB3aGljaCB0byBzZWxlY3QgdGFibGVzLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5UYWJsZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ4IHIxYzItdDgiPlNlbGVjdCB0aGUgdGFibGVzIGZyb20gd2hpY2ggdG8gY3JlYXRlIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcy4gVGhlIHRhYmxlcyBzaG93biBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgc2NoZW1hIHNlbGVjdGlvbnMuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPlN5bmNocm9uaXplIENsYXNzZXMgbGlzdGVkIGluIHBlcnNpc3RlbmNlLnhtbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDggcjFjMi10OCI+U3BlY2lmeSBpZiBEYWxpIHNob3VsZCB1cGRhdGUgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZSB0byBpbmNsdWRlIHRoZSBnZW5lcmF0ZWQgY2xhc3Nlcy48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNCQUJGQkpCRyI+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC9hPjxiciAvPgotPGEgaHJlZj0idGFza3MwMjEuaHRtI0JBQkJBR0ZJIj5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0jQ0lBR0JGSkUiPkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIFdpemFyZDwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3NlbGVjdF9jYXNjYWRlX2RpYWxvZy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3NlbGVjdF9jYXNjYWRlX2RpYWxvZy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxN2JmMWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9zZWxlY3RfY2FzY2FkZV9kaWFsb2cuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5TZWxlY3QgQ2FzY2FkZSBkaWFsb2c8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iU2VsZWN0IENhc2NhZGUgZGlhbG9nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBRkRHSUoiIG5hbWU9IkNJQUZER0lKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TZWxlY3QgQ2FzY2FkZSBkaWFsb2c8L2gxPgotPHA+U3BlY2lmeSB3aGljaCBvcGVyYXRpb25zIGFyZSBwcm9wYWdhdGVkIHRocm91Z2hvdXQgdGhlIGFzc29jaWF0aW9uOiBBbGwsIFBlcnNpc3QsIE1lcmdlLCBSZW1vdmUsIG9yIFJlZnJlc2guPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl90YWJsZUFzc29jaWF0aW9ucy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3RhYmxlQXNzb2NpYXRpb25zLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA3ZWYzYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3RhYmxlQXNzb2NpYXRpb25zLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+VGFibGUgQXNzb2NpYXRpb25zPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlRhYmxlIEFzc29jaWF0aW9ucyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUNESUNCIiBuYW1lPSJDSUFDRElDQiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+VGFibGUgQXNzb2NpYXRpb25zPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyMDQiIG5hbWU9InN0aHJlZjIwNCI+PC9hPlVzZSB0aGlzIHBhZ2UgdG8gY3JlYXRlIG9yIGVkaXQgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gdGhlIGRhdGFiYXNlIHRhYmxlIGFuZCBlbnRpdHkuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBFbnRpdGllcyBkaWFsb2cuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgVGFibGUgQXNzb2NpYXRpb25zIGRpYWxvZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMzIlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDkiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ5Ij5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10OSIgaGVhZGVycz0icjFjMS10OSI+VGFibGUgYXNzb2NpYXRpb25zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10OSByMWMyLXQ5Ij5TZWxlY3QgYW4gYXNzb2NpYXRpb24gdG8gbW9kaWZ5IG9yIGNsaWNrIHRvIGNyZWF0ZSBhIG5ldyB0YWJsZSBhc3NvY2lhdGlvbiB3aXRoIHRoZSA8YSBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtI0NJQUZHSElGIj5DcmVhdGUgTmV3IEFzc29jaWF0aW9uPC9hPiB3aXphcmQuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDkiIGhlYWRlcnM9InIxYzEtdDkiPkdlbmVyYXRlIHRoaXMgYXNzb2NpYXRpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ5IHIxYzItdDkiPlNwZWNpZnkgaWYgRGFsaSBzaG91bGQgY3JlYXRlIHRoZSBzZWxlY3RlZCBhc3NvY2lhdGlvbi4gSWYgZW5hYmxlZCwgeW91IGNhbiBzcGVjaWZ5IHRoZSBDYXJkaW5hbGl0eSBhbmQgSm9pbiB0YWJsZSBmb3IgdGhlIHRhYmxlIGFzc29jaWF0aW9uLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQ5IiBoZWFkZXJzPSJyMWMxLXQ5Ij5HZW5lcmF0ZSBhIHJlZmVyZW5jZSB0byA8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Uk9XJmd0Ozwvc3Bhbj4gaW4gPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBQkxFJmd0Ozwvc3Bhbj48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ5IHIxYzItdDkiPlNwZWNpZnkgaWYgdGhlIGVudGl0eSBzaG91bGQgY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgc3BlY2lmaWVkIHRhYmxlLgotPHA+SWYgZW5hYmxlZCwgeW91IGNhbiBhbHNvIGVudGVyIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+UHJvcGVydHk8L3NwYW4+IG5hbWUgYW5kIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkNhc2NhZGU8L3NwYW4+IG1ldGhvZCAoYWxsLCBwZXJzaXN0LCBtZXJnZSwgcmVtb3ZlLCBvciByZWZyZXNoKSBmb3IgdGhlIHJlZmVyZW5jZS48L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNCQUJGQkpCRyI+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC9hPjxiciAvPgotPGEgaHJlZj0idGFza3MwMjEuaHRtI0JBQkJBR0ZJIj5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSNDSUFGR0hJRiI+Q3JlYXRlIE5ldyBBc3NvY2lhdGlvbjwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtI0NJQUdCRkpFIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRiMDI3ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+UmVmZXJlbmNlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IiBSZWZlcmVuY2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJzdGhyZWYxODkiIG5hbWU9InN0aHJlZjE4OSI+PC9hPjwvcD4KLTxoMT5SZWZlcmVuY2U8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGRldGFpbGVkIGhlbHAgaW5mb3JtYXRpb24gZm9yIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50cyBpbiB0aGUgRGFsaSBPUiBNYXBwaW5nIFRvb2w6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDAxLmh0bSNDQUNKSkpKSCI+V2l6YXJkczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDA1Lmh0bSNDQUNESklJRyI+UHJvcGVydHkgcGFnZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNi5odG0jQ0FDREVJRUUiPlByZWZlcmVuY2VzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjguaHRtI0NBQ0dFSkRBIj5EaWFsb2dzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtI0JBQklGQkRCIj5KUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmU8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAzMC5odG0jQ0FDREhDSUEiPkljb25zIGFuZCBidXR0b25zPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMzMuaHRtI0NBQ0JCRElCIj5EYWxpIERldmVsb3BlciBEb2N1bWVudGF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNDAyMjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPldpemFyZHM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA2LTA0VDE5OjMzOjNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iV2l6YXJkcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0pKSkpIIiBuYW1lPSJDQUNKSkpKSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+V2l6YXJkczwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gaW5jbHVkZXMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZyB3aXphcmRzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtI0NJQUdHR0RGIj5DcmVhdGUgSlBBIEVudGl0eSB3aXphcmQ8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAwNC5odG0jQ0lBR0hDR0EiPkdlbmVyYXRlIFRhYmxlcyBmcm9tIEVudGl0aWVzIFdpemFyZDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSNDSUFHQkZKRSI+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtI0NJQUZHSElGIj5DcmVhdGUgTmV3IEFzc29jaWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfamF4Yl9zY2hlbWFfd2l6YXJkLmh0bSNDQUNHQURGSCI+R2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIFdpemFyZDwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjM2NDA2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5NYXBwaW5nIEZpbGUgV2l6YXJkPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hcHBpbmcgRmlsZSBXaXphcmQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFJSkNDRSIgbmFtZT0iQ0lBSUpDQ0UiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2gxPgotPHA+VGhlIE1hcHBpbmcgRmlsZSB3aXphcmQgZW5hYmxlcyB5b3UgdG8gYWRkIGFuIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgdG8gYSBKUEEgcHJvamVjdCBpZiBubyBvYmplY3QgbWFwIGV4aXN0cyBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSwgaWYgeW91IGNsZWFyZWQgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5DcmVhdGUgb3JtLnhtbDwvc3Bhbj4gb3B0aW9uIG9uIHRoZSA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+LCB5b3UgY2FuIGxhdGVyIGFkZCB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSB0byB0aGUgc3JjIGZpbGUgb2YgdGhlIHByb2plY3QgdXNpbmcgdGhpcyB3aXphcmQuPC9wPgotPHA+VGhlIDxhIGhyZWY9IiNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4gY29uc2lzdHMgb2YgdGhlIE1hcHBpbmcgRmlsZSBwYWdlLjwvcD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDc3M2NlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TWFwcGluZyBGaWxlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hcHBpbmcgRmlsZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUpFSURKIiBuYW1lPSJDSUFKRUlESiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TWFwcGluZyBGaWxlPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAwMi5odG0jQ0lBSUpDQ0UiPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+LjwvcD4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjE5OSIgbmFtZT0ic3RocmVmMTk5Ij48L2E+PGEgaWQ9InN0aHJlZjIwMCIgbmFtZT0ic3RocmVmMjAwIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj5NYXBwaW5nIEZpbGUgV2l6YXJkIFByb3BlcnRpZXM8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9Ik1hcHBpbmcgRmlsZSBXaXphcmQgUHJvcGVydGllcyIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgTWFwcGluZyBGaWxlIFdpemFyZC4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDciPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ3Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10NyI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10NyIgaGVhZGVycz0icjFjMS10NyI+Ci08cD5Qcm9qZWN0PC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NyByMWMyLXQ3Ij4KLTxwPlRoZSBuYW1lIG9mIHRoZSBKUEEgcHJvamVjdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ3IHIxYzMtdDciPgotPHA+U2VsZWN0ZWQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDciIGhlYWRlcnM9InIxYzEtdDciPgotPHA+U291cmNlIGZvbGRlcjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDcgcjFjMi10NyI+Ci08cD5UaGUgbG9jYXRpb24gb2YgdGhlIHByb2plY3QncyBzcmMgZm9sZGVyLiBJZiBuZWVkZWQsIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Ccm93c2U8L3NwYW4+IHRvIHBvaW50IHRoZSB3aXphcmQgdG8gdGhlIHNyYyBmaWxlJ3MgbG9jYXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NyByMWMzLXQ3Ij4KLTxwPlNlbGVjdGVkLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQ3IiBoZWFkZXJzPSJyMWMxLXQ3Ij4KLTxwPkZpbGUgUGF0aDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDcgcjFjMi10NyI+Ci08cD5UaGUgbG9jYXRpb24gZm9yIHRoZSBuZXcgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ3IHIxYzMtdDciPgotPHA+U2VsZWN0ZWQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDciIGhlYWRlcnM9InIxYzEtdDciPgotPHA+RGVmYXVsdCBBY2Nlc3M8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ3IHIxYzItdDciPgotPHA+U2VsZWN0IHdoZXRoZXIgdGhlIGFjY2VzcyB0byB0aGUgZW50aXR5IGlzIGZpZWxkLWJhc2VkIG9yIHByb3BlcnR5LWJhc2VkLCBhcyBkZWZpbmVkIGluIEpQQSBzcGVjaWZpY2F0aW9uLjwvcD4KLTx1bD4KLTxsaT4KLTxwPk5vbmUgJm5kYXNoOyBObyBhY2Nlc3MgdHlwZSBzcGVjaWZpZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Qcm9wZXJ0eS1iYXNlZDwvc3Bhbj4gJm5kYXNoOyBQZXJzaXN0ZW50IHN0YXRlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMuIFRoZSBwcm9wZXJ0eSBhY2Nlc3NvciBtZXRob2RzIG11c3QgYmUgPHNwYW4gY2xhc3M9ImJvbGQiPnB1YmxpYzwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9ImJvbGQiPnByaXZhdGU8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RmllbGQtYmFzZWQ8L3NwYW4+ICZuZGFzaDsgSW5zdGFuY2UgdmFyaWFibGVzIGFyZSBhY2Nlc3NlZCBkaXJlY3RseS4gQWxsIG5vbi10cmFuc2llbnQgaW5zdGFuY2UgdmFyaWFibGVzIGFyZSBwZXJzaXN0ZW50LjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NyByMWMzLXQ3Ij4KLTxwPk5vbmU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10NyIgaGVhZGVycz0icjFjMS10NyI+Ci08cD5BZGQgdG8gcGVyc2lzdGVuY2UgdW5pdDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDcgcjFjMi10NyI+Ci08cD5EZXNpZ25hdGVzIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGZvciB0aGlzIG9iamVjdCBtYXAgZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ3IHIxYzMtdDciPgotPHA+U2VsZWN0ZWQuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNCQUJGQkpCRyI+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC9hPjxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZlcmVuY2UwMDIuaHRtI0NJQUlKQ0NFIj5NYXBwaW5nIEZpbGUgV2l6YXJkPC9hPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMDBjZDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkdlbmVyYXRlIFRhYmxlcyBmcm9tIEVudGl0aWVzIFdpemFyZDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmF0ZSBUYWJsZXMgZnJvbSBFbnRpdGllcyBXaXphcmQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFHSENHQSIgbmFtZT0iQ0lBR0hDR0EiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYXRlIFRhYmxlcyBmcm9tIEVudGl0aWVzIFdpemFyZDwvaDE+Ci08cD5Vc2UgdGhlIEdlbmVyYXRlIERETCBmcm9tIEVudGl0aWVzIFdpemFyZCB0byBxdWlja2x5IGNyZWF0ZSBEREwgc2NyaXB0cyBmcm9tIHlvdXIgcGVyc2lzdGVudCBlbnRpdGllcy4gRGFsaSBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgdGhlIG5lY2Vzc2FyeSBwcmltYXJ5IGFuZCBmb3JlaWduIGtleXMsIGJhc2VkIG9uIHRoZSBlbnRpdHkgbWFwcGluZ3MuPC9wPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza3MwMjEuaHRtI0JBQkJBR0ZJIj5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jQkFCRkJKQkciPkNyZWF0aW5nIGEgSlBBIEVudGl0eTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0jQ0lBR0dHREYiPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA1Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTE0MDBkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Qcm9wZXJ0eSBwYWdlczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJQcm9wZXJ0eSBwYWdlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0RKSUlHIiBuYW1lPSJDQUNESklJRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+UHJvcGVydHkgcGFnZXM8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSNDQUNHREdIQyI+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDYuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWJjMjRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhbCBpbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmFsIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQ0FHR0MiIG5hbWU9IkNBQ0NBR0dDIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5HZW5lcmFsIGluZm9ybWF0aW9uPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIEdlbmVyYWwgaW5mb3JtYXRpb24gZmllbGRzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGZvciBlYWNoIGVudGl0eSB0eXBlLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIxNiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMTclIiAvPgotPGNvbCB3aWR0aD0iMjUlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTMiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxMyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDEzIj5EZWZhdWx0PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWM0LXQxMyI+QXZhaWxhYmxlIGZvciBFbnRpdHkmbmJzcDtUeXBlPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPk1hcHBpbmcgVHlwZSBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxMyByMWMyLXQxMyI+Q2xpY2tpbmcgdGhlIG5hbWUgb2YgdGhlIG1hcHBpbmcgdHlwZSwgd2hpY2ggaXMgcmVwcmVzZW50ZWQgYXMgYSBoeXBlcmxpbmssIGludm9rZXMgdGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nLiBVc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBlbnRpdHk6IE1hcHBlZCBTdXBlcmNsYXNzLCBFbWJlZGRhYmxlIG9yIHRoZSBkZWZhdWx0IG1hcHBpbmcgdHlwZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxMyByMWMzLXQxMyI+RW50aXR5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTMgcjFjNC10MTMiPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPiwgPGEgaHJlZj0idGFza3MwMDcuaHRtI0JBQkZFSUNFIj5FbWJlZGRhYmxlPC9hPiwgYW5kIDxhIGhyZWY9InRhc2tzMDA4Lmh0bSNCQUJEQUdDSSI+TWFwcGVkIHN1cGVyY2xhc3M8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+VGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxMyByMWMyLXQxMyI+VGhlIGRlZmF1bHQgZGF0YWJhc2UgdGFibGUgaW5mb3JtYXRpb24gZm9yIHRoaXMgZW50aXR5LiBUaGVzZSBmaWVsZHMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGluZm9ybWF0aW9uIGluIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMDcuaHRtI0NBQ0lKQkdIIj5BdHRyaWJ1dGUgb3ZlcnJpZGVzPC9hPiBhcmVhLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDEzIHIxYzMtdDEzIj48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxMyByMWM0LXQxMyI+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+Jm5ic3A7Jm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDEzIHIxYzItdDEzIj5UaGUgbmFtZSBvZiB0aGUgcHJpbWFyeSBkYXRhYmFzZSB0YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0eS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMyByMWMzLXQxMyI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTMgcjFjNC10MTMiPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPiZuYnNwOyZuYnNwO0NhdGFsb2c8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxMyByMWMyLXQxMyI+VGhlIGRhdGFiYXNlIGNhdGFsb2cgdGhhdCBjb250YWlucyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxMyByMWMzLXQxMyI+QXMgZGVmaW5lZCBpbiA8Y29kZT5vcm0ueG1sPC9jb2RlPi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxMyByMWM0LXQxMyI+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+Jm5ic3A7Jm5ic3A7U2NoZW1hPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTMgcjFjMi10MTMiPlRoZSBkYXRhYmFzZSBzY2hlbWEgdGhhdCBjb250YWlucyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxMyByMWMzLXQxMyI+QXMgZGVmaW5lZCBpbiA8Y29kZT5vcm0ueG1sPC9jb2RlPi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxMyByMWM0LXQxMyI+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDEzIHIxYzItdDEzIj5UaGUgbmFtZSBvZiB0aGlzIGVudGl0eS4gQnkgZGVmYXVsdCwgdGhlIGNsYXNzIG5hbWUgaXMgdXNlZCBhcyB0aGUgZW50aXR5IG5hbWUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDEzIHIxYzQtdDEzIj48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj5BY2Nlc3M8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQxMyByMWMyLXQxMyI+VGhlIGFjY2VzcyBtZXRob2QgZm9yIHRoaXMgZW50aXR5LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDEzIHIxYzMtdDEzIj5GaWVsZDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDEzIHIxYzQtdDEzIj48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj5QcmltYXJ5Jm5ic3A7a2V5Jm5ic3A7Y2xhc3M8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQxMyByMWMyLXQxMyI+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gYW5kIHNlbGVjdCB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSBlbnRpdHkuIENsaWNraW5nIHRoZSBmaWVsZCBuYW1lLCB3aGljaCBpcyByZXByZXNlbnRlZCBhcyBhIGh5cGVybGluaywgYWxsb3dzIHlvdSB0byBjcmVhdGUgYSBuZXcgY2xhc3MuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDEzIHIxYzQtdDEzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEwYzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+Q2FjaGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MTMgcjFjMi10MTMiPlNwZWNpZmllcyBpZiB0aGUgZW50aXR5IGlzIGNhY2hhYmxlLgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QENhY2hhYmxlPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQxMyByMWMzLXQxMyI+QENhY2hhYmxlKGZhbHNlKTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQxMyByMWM0LXQxMyI+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA3Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTAwYWNkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5BdHRyaWJ1dGUgb3ZlcnJpZGVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkF0dHJpYnV0ZSBvdmVycmlkZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNJSkJHSCIgbmFtZT0iQ0FDSUpCR0giPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkF0dHJpYnV0ZSBvdmVycmlkZXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIxNCIgbmFtZT0ic3RocmVmMjE0Ij48L2E+PGEgaWQ9InN0aHJlZjIxNSIgbmFtZT0ic3RocmVmMjE1Ij48L2E+PGEgaWQ9InN0aHJlZjIxNiIgbmFtZT0ic3RocmVmMjE2Ij48L2E+VXNlIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+QXR0cmlidXRlIE92ZXJyaWRlczwvc3Bhbj4gYXJlYSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHNldHRpbmdzIHNwZWNpZmllZCBpbiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDA2Lmh0bSNDQUNDQUdHQyI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT4gYXJlYSBvZiBhbiBhdHRyaWJ1dGUuIEF0dHJpYnV0ZSBvdmVycmlkZXMgZ2VuZXJhbGx5IG92ZXJyaWRlL2NvbmZpZ3VyZSBhdHRyaWJ1dGVzIHRoYXQgYXJlIGluaGVyaXRlZCBvciBlbWJlZGRlZC48L3A+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBBdHRyaWJ1dGUgb3ZlcnJpZGUgZmllbGRzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGZvciBlYWNoIGVudGl0eSB0eXBlLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIxNiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMTclIiAvPgotPGNvbCB3aWR0aD0iMjUlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTQiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxNCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDE0Ij5EZWZhdWx0PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWM0LXQxNCI+QXZhaWxhYmxlIGZvciBFbnRpdHkmbmJzcDtUeXBlPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxNCIgaGVhZGVycz0icjFjMS10MTQiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNCByMWMyLXQxNCI+U3BlY2lmeSBhIHByb3BlcnR5IG9yIGZpZWxkIHRvIGJlIG92ZXJyaWRkZW4gKGZyb20gdGhlIGRlZmF1bHQgbWFwcGluZ3MpLiBTZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE0IHIxYzMtdDE0Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNCByMWM0LXQxNCI+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+Sm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTQgcjFjMi10MTQiPlNwZWNpZnkgdGhlIGpvaW5pbmcgc3RyYXRlZ3kuIFNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4gdG8gYWRkIGEgZGlmZmVyZW50IGpvaW5pbmcgc3RyYXRlZ3kuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTQgcjFjMy10MTQiPkpvaW4gY29sdW1uczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE0IHIxYzQtdDE0Ij48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZlcmVuY2UwMDYuaHRtI0NBQ0NBR0dDIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA4Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDguaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGQwZjlmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDguaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5TZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iU2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQkhJREEiIG5hbWU9IkNBQ0JISURBIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb248L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIxNyIgbmFtZT0ic3RocmVmMjE3Ij48L2E+PGEgaWQ9InN0aHJlZjIxOCIgbmFtZT0ic3RocmVmMjE4Ij48L2E+PGEgaWQ9InN0aHJlZjIxOSIgbmFtZT0ic3RocmVmMjE5Ij48L2E+PGEgaWQ9InN0aHJlZjIyMCIgbmFtZT0ic3RocmVmMjIwIj48L2E+VXNlIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+U2Vjb25kYXJ5IFRhYmxlczwvc3Bhbj4gYXJlYSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IHRvIGFzc29jaWF0ZSBhZGRpdGlvbmFsIHRhYmxlcyB3aXRoIGFuIGVudGl0eS4gVXNlIHRoaXMgYXJlYSBpZiB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggYW4gZW50aXR5IGlzIHNwcmVhZCBhY3Jvc3MgbXVsdGlwbGUgdGFibGVzLjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkaXRvbmFsX3RhYmxlcy5odG0jQ0lIR0JJRUkiPlNwZWNpZnlpbmcgYWRkaXRpb25hbCB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDkuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwOS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MDUzODUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwOS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Jbmhlcml0YW5jZSBpbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJJbmhlcml0YW5jZSBpbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0ZIR0hFIiBuYW1lPSJDQUNGSEdIRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SW5oZXJpdGFuY2UgaW5mb3JtYXRpb248L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIyMSIgbmFtZT0ic3RocmVmMjIxIj48L2E+PGEgaWQ9InN0aHJlZjIyMiIgbmFtZT0ic3RocmVmMjIyIj48L2E+VGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGF2YWlsYWJsZSBvbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkluaGVyaXRhbmNlPC9zcGFuPiBhcmVhIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIGVhY2ggZW50aXR5IHR5cGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgSW5oZXJpdGFuY2UgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgSW5oZXJpdGFuY2UgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjMlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTUiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxNSI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDE1Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxNSIgaGVhZGVycz0icjFjMS10MTUiPlN0cmF0ZWd5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTUgcjFjMi10MTUiPlNwZWNpZnkgdGhlIHN0cmF0ZWd5IHRvIHVzZSB3aGVuIG1hcHBpbmcgYSBjbGFzcyBvciBjbGFzcyBoaWVyYXJjaHk6Ci08dWw+Ci08bGk+Ci08cD5TaW5nbGUgdGFibGUgJm5kYXNoOyBBbGwgY2xhc3NlcyBpbiB0aGUgaGllcmFyY2h5IGFyZSBtYXBwZWQgdG8gYSBzaW5nbGUgdGFibGUuPC9wPgotPC9saT4KLTxsaT4KLTxwPkpvaW5lZCAmbmRhc2g7IFRoZSByb290IG9mIHRoZSBoaWVyYXJjaHkgaXMgbWFwcGVkIHRvIGEgc2luZ2xlIHRhYmxlOyBlYWNoIGNoaWxkIG1hcHMgdG8gaXRzIG93biB0YWJsZS48L3A+Ci08L2xpPgotPGxpPgotPHA+VGFibGUgcGVyIGNsYXNzICZuZGFzaDsgRWFjaCBjbGFzcyBpcyBtYXBwZWQgdG8gYSBzZXBhcmF0ZSB0YWJsZS48L3A+Ci08L2xpPgotPC91bD4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBJbmhlcml0YW5jZTwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNSByMWMzLXQxNSI+U2luZ2xlIHRhYmxlPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+PGEgaWQ9InN0aHJlZjIyMyIgbmFtZT0ic3RocmVmMjIzIj48L2E+PGEgaWQ9InN0aHJlZjIyNCIgbmFtZT0ic3RocmVmMjI0Ij48L2E+RGlzY3JpbWluYXRvciBWYWx1ZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE1IHIxYzItdDE1Ij5TcGVjaWZ5IHRoZSBkaXNjcmltaW5hdG9yIHZhbHVlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBhbiBlbnRpdHkgaW4gdGhpcyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIFRoZSB2YWx1ZSBtdXN0IGNvbmZvcm0gdG8gdGhlIHNwZWNpZmllZCA8c3BhbiBjbGFzcz0iYm9sZCI+RGlzY3JpbWluYXRvciBUeXBlPC9zcGFuPi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNSByMWMzLXQxNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+PGEgaWQ9InN0aHJlZjIyNSIgbmFtZT0ic3RocmVmMjI1Ij48L2E+PGEgaWQ9InN0aHJlZjIyNiIgbmFtZT0ic3RocmVmMjI2Ij48L2E+RGlzY3JpbWluYXRvciBDb2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNSByMWMyLXQxNSI+VGhlc2UgZmllbGRzIGFyZSBhdmFpbGFibGUgd2hlbiB1c2luZyBhIDxzcGFuIGNsYXNzPSJib2xkIj5TaW5nbGU8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJib2xkIj5Kb2luZWQ8L3NwYW4+IGluaGVyaXRhbmNlIHN0cmF0ZWd5LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QERpc2NyaW1pbmF0b3JDb2x1bW48L2NvZGU+IGFubm90YXRpb24uPC9wPgotPHA+VXNlIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+RGV0YWlsczwvc3Bhbj4gYXJlYSB0byBkZWZpbmUgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5MZW5ndGg8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0iYm9sZCI+Q29sdW1uIGRlZmluaXRpb248L3NwYW4+IG9mIHRoaXMgRGlzY3JpbWluYXRvciBDb2x1bW4uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTUgcjFjMy10MTUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxNSIgaGVhZGVycz0icjFjMS10MTUiPiZuYnNwOyZuYnNwO05hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNSByMWMyLXQxNSI+TmFtZSBvZiB0aGUgZGlzY3JpbWluYXRvciBjb2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNSByMWMzLXQxNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+Jm5ic3A7Jm5ic3A7VHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE1IHIxYzItdDE1Ij5TZXQgdGhpcyBmaWVsZCB0byBzZXQgdGhlIGRpc2NyaW1pbmF0b3IgdHlwZSB0byA8Y29kZT5DaGFyPC9jb2RlPiBvciA8Y29kZT5JbnRlZ2VyPC9jb2RlPiAoaW5zdGVhZCBvZiBpdHMgZGVmYXVsdDogPGNvZGU+U3RyaW5nPC9jb2RlPikuIFRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+RGlzY3JpbWluYXRvciBWYWx1ZTwvc3Bhbj4gbXVzdCBjb25mb3JtIHRvIHRoaXMgdHlwZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxNSByMWMzLXQxNSI+U3RyaW5nPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTUgcjFjMi10MTUiPlVzZSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMuIFNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gdG8gc2VsZWN0IG5ldyBKb2luIENvbHVtbi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgd2l0aCBAUHJpbWFyeUtleUpvaW5Db2x1bW4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxNSByMWMzLXQxNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI0NJSENDQ0pEIj5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDEwLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRiM2U5YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDEwLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+UXVlcmllczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJRdWVyaWVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPjxhIGlkPSJzdGhyZWYyMjciIG5hbWU9InN0aHJlZjIyNyI+PC9hPgotPGgxPlF1ZXJpZXM8L2gxPgotPHA+VXNlIHRoZSBxdWVyaWVzIGFyZWEgb2YgdGhlIEpQQSBEZXRhaWxzIHZpZXcgdG8gY3JlYXRlIG5hbWVkIHF1ZXJpZXMgYW5kIG5hbWVkIG5hdGl2ZSBxdWVyaWVzLiBSZWZlciB0byA8YSBocmVmPSJ0YXNrczAwOS5odG0jQkFCSUdCR0ciPiJDcmVhdGluZyBOYW1lZCBRdWVyaWVzIjwvYT4gZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uPC9wPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza3MwMDkuaHRtI0JBQklHQkdHIj5DcmVhdGluZyBOYW1lZCBRdWVyaWVzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Y2RjZTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkpvaW4gVGFibGUgSW5mb3JtYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSm9pbiBUYWJsZSBJbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0JBRUJDIiBuYW1lPSJDQUNCQUVCQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvaDE+Ci08cD5Vc2UgYXJlYSB0byBzcGVjaWZ5IGEgbWFwcGVkIGNvbHVtbiBmb3Igam9pbmluZyBhbiBlbnRpdHkgYXNzb2NpYXRpb24uIEJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvcD4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBhdmFpbGFibGUgb24gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Kb2luIFRhYmxlPC9zcGFuPiBhcmVhIGluIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj50aGUgSlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIDxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJIR0VCRCI+T25lLXRvLW1hbnkgbWFwcGluZzwvYT4gYW5kIDxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJFSUVHRCI+TWFueS10by1tYW55IG1hcHBpbmc8L2E+IG1hcHBpbmcgdHlwZXMuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gVGFibGUgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gVGFibGUgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMzQlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTciPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxNyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDE3Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxNyIgaGVhZGVycz0icjFjMS10MTciPk5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNyByMWMyLXQxNyI+TmFtZSBvZiB0aGUgam9pbiB0YWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBmb3JlaWduIGtleSBjb2x1bW4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTcgcjFjMy10MTciPkJ5IGRlZmF1bHQsIHRoZSBuYW1lIGlzIGFzc3VtZWQgdG8gYmUgdGhlIHByaW1hcnkgdGFibGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50aXRpZXMgY29uY2F0ZW5hdGVkIHdpdGggYW4gdW5kZXJzY29yZS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTciIGhlYWRlcnM9InIxYzEtdDE3Ij48YSBpZD0iQ0FDQkJERkciIG5hbWU9IkNBQ0JCREZHIj48L2E+Sm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTcgcjFjMi10MTciPjxhIGlkPSJzdGhyZWYyNDYiIG5hbWU9InN0aHJlZjI0NiI+PC9hPjxhIGlkPSJzdGhyZWYyNDciIG5hbWU9InN0aHJlZjI0NyI+PC9hPlNwZWNpZnkgYSBtYXBwZWQgY29sdW1uIGZvciBqb2luaW5nIGFuIGVudGl0eSBhc3NvY2lhdGlvbi4gVGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QEpvaW5Db2x1bTwvY29kZT4gYXR0cmlidXRlLgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSBEZWZhdWx0PC9zcGFuPiwgdGhlbiBBZGQsIEVkaXQsIG9yIFJlbW92ZSB0aGUgam9pbiBjb2x1bW5zLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE3IHIxYzMtdDE3Ij5CeSBkZWZhdWx0LCB0aGUgbWFwcGluZyBpcyBhc3N1bWVkIHRvIGhhdmUgYSBzaW5nbGUgam9pbi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTciIGhlYWRlcnM9InIxYzEtdDE3Ij5JbnZlcnNlIEpvaW4gQ29sdW1uczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE3IHIxYzItdDE3Ij5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTcgcjFjMy10MTciPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAyOS5odG0jQ0FDQ0dFSEMiPkVkaXQgSm9pbiBDb2x1bW5zIERpYWxvZzwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDEyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTk5MDc3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Kb2luIENvbHVtbnMgSW5mb3JtYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDRkNFSkMiIG5hbWU9IkNBQ0ZDRUpDIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Kb2luIENvbHVtbnMgSW5mb3JtYXRpb248L2gxPgotPHA+PGEgaWQ9InN0aHJlZjI0OCIgbmFtZT0ic3RocmVmMjQ4Ij48L2E+VGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpvaW4gVGFibGU8L3NwYW4+IGFyZWEgaW4gPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGZvciA8YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+IGFuZCA8YSBocmVmPSJ0YXNrczAxNy5odG0jQkFCRkhCQ0oiPk9uZS10by1vbmUgbWFwcGluZzwvYT4gbWFwcGluZyB0eXBlcy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSm9pbiBDb2x1bW5zIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBKb2luIENvbHVtbnMgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMzQlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTgiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxOCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDE4Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxOCIgaGVhZGVycz0icjFjMS10MTgiPkpvaW4gQ29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTggcjFjMi10MTgiPjxhIGlkPSJzdGhyZWYyNDkiIG5hbWU9InN0aHJlZjI0OSI+PC9hPjxhIGlkPSJzdGhyZWYyNTAiIG5hbWU9InN0aHJlZjI1MCI+PC9hPlNwZWNpZnkgYSBtYXBwZWQgY29sdW1uIGZvciBqb2luaW5nIGFuIGVudGl0eSBhc3NvY2lhdGlvbi4gVGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QEpvaW5Db2x1bTwvY29kZT4gYXR0cmlidXRlLgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSBEZWZhdWx0PC9zcGFuPiwgdGhlbiBBZGQsIEVkaXQsIG9yIFJlbW92ZSB0aGUgam9pbiBjb2x1bW5zLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE4IHIxYzMtdDE4Ij5CeSBkZWZhdWx0LCB0aGUgbWFwcGluZyBpcyBhc3N1bWVkIHRvIGhhdmUgYSBzaW5nbGUgam9pbi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZlcmVuY2UwMjkuaHRtI0NBQ0NHRUhDIj5FZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2c8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDEzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIwODkyMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDEzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhbCBpbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmFsIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQ0FDR0giIG5hbWU9IkNBQ0NBQ0dIIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5HZW5lcmFsIGluZm9ybWF0aW9uPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIEdlbmVyYWwgaW5mb3JtYXRpb24gZmllbGRzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGZvciBlYWNoIGVudGl0eSB0eXBlLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjIxJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyMiUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyMCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIwIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjAiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+UGFja2FnZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIwIHIxYzItdDIwIj5UaGUgSmF2YSBwYWNrYWdlIHRoYXQgY29udGFpbnMgdGhlIHBlcnNpc3RlbnQgZW50aXRpZXMuIENsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Ccm93c2U8L3NwYW4+IGFuZCBzZWxlY3QgdGhlIHBhY2thZ2U8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMCByMWMzLXQyMCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+U2NoZW1hPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjAgcjFjMi10MjAiPlRoZSBkYXRhYmFzZSBzY2hlbWEgdGhhdCBjb250YWlucyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDtzY2hlbWEmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIwIHIxYzMtdDIwIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjAiIGhlYWRlcnM9InIxYzEtdDIwIj5DYXRhbG9nPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjAgcjFjMi10MjAiPlRoZSBkYXRhYmFzZSBjYXRhbG9nIHRoYXQgY29udGFpbnMgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5UYWJsZTwvc3Bhbj4uCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT4mbHQ7Y2F0YWxvZyZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjAgcjFjMy10MjAiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyMCIgaGVhZGVycz0icjFjMS10MjAiPkFjY2VzczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDIwIHIxYzItdDIwIj5TcGVjaWZ5IHRoZSBkZWZhdWx0IGFjY2VzcyBtZXRob2QgZm9yIHRoZSB2YXJpYWJsZXMgaW4gdGhlIHByb2plY3Q6Ci08dWw+Ci08bGk+Ci08cD5Qcm9wZXJ0eTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5GaWVsZDwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+Jmx0O2FjY2VzcyZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjAgcjFjMy10MjAiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjRkM2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5QZXJzaXN0ZW5jZSBVbml0IGluZm9ybWF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNFQUdCRyIgbmFtZT0iQ0FDRUFHQkciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb248L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgUGVyc2lzdGVuY2UgVW5pdCBpbmZvcm1hdGlvbiBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIGVhY2ggZW50aXR5IHR5cGUuIFRoZXNlIGZpZWxkcyBhcmUgY29udGFpbmVkIGluIHRoZSA8Y29kZT4mbHQ7cGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjElIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjIyJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDIxIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjEiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyMSI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjEiIGhlYWRlcnM9InIxYzEtdDIxIj5YTUwgTWFwcGluZyBEYXRhIENvbXBsZXRlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjEgcjFjMi10MjEiPlNwZWNpZmllcyB0aGF0IHRoZSBKYXZhIGNsYXNzZXMgaW4gdGhpcyBwZXJzaXN0ZW5jZSB1bml0IGFyZSBmdWxseSBzcGVjaWZpZWQgYnkgdGhlaXIgbWV0YWRhdGEuIEFueSBhbm5vdGF0aW9ucyB3aWxsIGJlIGlnbm9yZWQuCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT4mbHQ7eG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIxIHIxYzMtdDIxIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjEiIGhlYWRlcnM9InIxYzEtdDIxIj5DYXNjYWRlIFBlcnNpc3Q8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMSByMWMyLXQyMSI+QWRkcyBjYXNjYWRlLXBlcnNpc3QgdG8gdGhlIHNldCBvZiBjYXNjYWRlIG9wdGlvbnMgaW4gZW50aXR5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT4mbHQ7Y2FzY2FkZS1wZXJzaXN0Jmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMSByMWMzLXQyMSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+U2NoZW1hPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjEgcjFjMi10MjEiPlRoZSBkYXRhYmFzZSBzY2hlbWEgdGhhdCBjb250YWlucyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDtzY2hlbWEmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDIxIHIxYzMtdDIxIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MjEiIGhlYWRlcnM9InIxYzEtdDIxIj5DYXRhbG9nPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjEgcjFjMi10MjEiPlRoZSBkYXRhYmFzZSBjYXRhbG9nIHRoYXQgY29udGFpbnMgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5UYWJsZTwvc3Bhbj4uCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT4mbHQ7Y2F0YWxvZyZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjEgcjFjMy10MjEiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQyMSIgaGVhZGVycz0icjFjMS10MjEiPkFjY2VzczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDIxIHIxYzItdDIxIj5TcGVjaWZ5IGhvdyB0aGUgZW50aXR5IGl0cyBhY2Nlc3MgaW5zdGFuY2UgdmFyaWFibGVzLgotPHVsPgotPGxpPgotPHA+UHJvcGVydHkgJm5kYXNoOyBQZXJzaXN0ZW50IHN0YXRlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMuIFRoZSBwcm9wZXJ0eSBhY2Nlc3NvciBtZXRob2RzIG11c3QgYmUgPHNwYW4gY2xhc3M9ImJvbGQiPnB1YmxpYzwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9ImJvbGQiPnByaXZhdGU8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5GaWVsZCAmbmRhc2g7IEluc3RhbmNlIHZhcmlhYmxlcyBhcmUgYWNjZXNzZWQgZGlyZWN0bHkuIEFsbCBub24tdHJhbnNpZW50IGluc3RhbmNlIHZhcmlhYmxlcyBhcmUgcGVyc2lzdGVudC48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDIxIHIxYzMtdDIxIj5Qcm9wZXJ0eTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMGM4OGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmF0b3JzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRvcnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFGR0FJSiIgbmFtZT0iQ0lBRkdBSUoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYXRvcnM8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgR2VuZXJhdG9yIGluZm9ybWF0aW9uIGZpZWxkcyBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBmb3IgdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjElIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDIyIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjIiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyMiIgaGVhZGVycz0icjFjMS10MjIiPkdlbmVyYXRvcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIyIHIxYzItdDIyIj5EaXNwbGF5cyB0aGUgZXhpc3RpbmcgU2VxdWVuY2UgYW5kIFRhYmxlIGdlbmVyYXRvcnMuCi08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIFNlcXVlbmNlPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIFRhYmxlPC9zcGFuPiB0byBhZGQgYSBuZXcgZ2VuZXJhdG9yLjwvcD4KLTxwPkZvciBzZXF1ZW5jZSBnZW5lcmF0b3JzLCB5b3UgbXVzdCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIGZpZWxkczo8L3A+Ci08dWw+Ci08bGk+Ci08cD5OYW1lPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlcXVlbmNlPC9wPgotPC9saT4KLTxsaT4KLTxwPlNjaGVtYTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DYXRhbG9nPC9wPgotPC9saT4KLTxsaT4KLTxwPkFsbG9jYXRpb24gc2l6ZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Jbml0aWFsIHZhbHVlPC9wPgotPC9saT4KLTwvdWw+Ci08cD5Gb3IgdGFibGUgZ2VuZXJhdG9ycywgeW91IG11c3QgY29tcGxldGUgdGhlIGZvbGxvd2luZyBmaWVsZHM6PC9wPgotPHVsPgotPGxpPgotPHA+TmFtZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UYWJsZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TY2hlbWE8L3A+Ci08L2xpPgotPGxpPgotPHA+Q2F0YWxvZzwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QcmltYXJ5IGtleSBjb2x1bW48L3A+Ci08L2xpPgotPGxpPgotPHA+VmFsdWUgY29sdW1uPC9wPgotPC9saT4KLTxsaT4KLTxwPlByaW1hcnkga2V5IGNvbHVtbiB2YWx1ZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5BbGxvY2F0aW9uIHNpemU8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0jQ0FDR0RHSEMiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTYuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjdhMmIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5RdWVyaWVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlF1ZXJpZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFJQkFBSiIgbmFtZT0iQ0lBSUJBQUoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlF1ZXJpZXM8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgUXVlcnkgaW5mb3JtYXRpb24gZmllbGRzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGZvciB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyMSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjMiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyMyI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIzIiBoZWFkZXJzPSJyMWMxLXQyMyI+UXVlcmllczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIzIHIxYzItdDIzIj5EaXNwbGF5cyB0aGUgZXhpc3RpbmcgTmFtZWQgYW5kIE5hdGl2ZSBxdWVyaWVzLgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gdG8gYWRkIGEgbmFtZWQgcXVlcnksIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgTmF0aXZlPC9zcGFuPiBmb3IgYSBuYXRpdmUgcXVlcnkuPC9wPgotPHA+Rm9yIG5hbWVkIHF1ZXJpZXMsIGVudGVyIHRoZSBxdWVyeSBpbiB0aGUgUXVlcnkgZmllbGQuPC9wPgotPHA+Rm9yIG5hdGl2ZSBxdWVyaWVzLCBzZWxlY3QgYSByZXN1bHQgY2xhc3MsIHRoZW4gZW50ZXIgdGhlIHF1ZXJ5IGluIHRoZSBRdWVyeSBmaWVsZC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjMiIGhlYWRlcnM9InIxYzEtdDIzIj5RdWVyeSBIaW50czwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIzIHIxYzItdDIzIj5EaXNwbGF5cyB0aGUgZXhpc3RpbmcgcXVlcnkgaGludHMgKE5hbWUgYW5kIFZhbHVlKS4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+IHRvIGFkZCBhIG5ldyBxdWVyeSBoaW50LjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAwOS5odG0jQkFCSUdCR0ciPkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXM8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSNDQUNHREdIQyI+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YTIxYWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNvbnZlcnRlcnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ29udmVydGVycyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQURHQ0lEIiBuYW1lPSJDSUFER0NJRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q29udmVydGVyczwvaDE+Ci08cD5UaGUgQ29udmVydGVycyBpbmZvcm1hdGlvbiBpbiB0aGUgSlBBIERldGFpbHMgdmlldyBhcHBsaWVzIG9ubHkgd2hlbiB1c2luZyBFY2xpcHNlTGluazwvcD4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+IHRvIGNyZWF0ZSBhIG5ldyBjb252ZXJ0ZXIsIHVzaW5nIHRoZSA8YSBocmVmPSJyZWZfYWRkX2NvbnZlcnRlci5odG0jQ0lBR0NHSUoiPkFkZCBDb252ZXJ0ZXIgZGlhbG9nPC9hPi48L3A+Ci08cD4mbmJzcDs8L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSNDQUNHREdIQyI+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTguaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxOC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMzViNzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxOC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Db25uZWN0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNvbm5lY3Rpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFGRkpJRSIgbmFtZT0iQ0lBRkZKSUUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNvbm5lY3Rpb248L2gxPgotPHA+VGhlIGZvbGxvd2luZyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBhdmFpbGFibGUgaW4gdGhlIENvbm5lY3Rpb24gcGFnZSBvZiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbGxfZWRpdG9yLmh0bSNDSUFDQ0hJRCI+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvYT4uPC9wPgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMjYwIiBuYW1lPSJzdGhyZWYyNjAiPjwvYT48YSBpZD0ic3RocmVmMjYxIiBuYW1lPSJzdGhyZWYyNjEiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPlByb3BlcnRpZXMgb2YgdGhlIENvbm5lY3Rpb24gUGFnZTwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iUHJvcGVydGllcyBvZiB0aGUgQ29ubmVjdGlvbiBQYWdlIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGVyc2lzdGVuY2UueG1sIGVkaXRvciZyc3F1bztzIGNvbm5lY3Rpb24gcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDI1Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjUiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyNSI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjUiIGhlYWRlcnM9InIxYzEtdDI1Ij4KLTxwPlRyYW5zYWN0aW9uIFR5cGU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNSByMWMyLXQyNSI+Ci08cD5TcGVjaWZ5IGlmIHRoZSBjb25uZWN0aW9uIGZvciB0aGlzIHBlcnNpc3RlbmNlIHVuaXQgdXNlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB0cmFuc2FjdGlvbiB0eXBlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RGVmYXVsdDwvc3Bhbj4gLS0gU2VsZWN0IHRvIHVzZSB0aGUgY29udGFpbmVyIHVzZWQgYnkgdGhlIGNvbnRhaW5lci48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkpUQTwvc3Bhbj4gKEphdmEgVHJhbnNhY3Rpb24gQVBJKSAtLSBUcmFuc2FjdGlvbnMgb2YgdGhlIEphdmEgRUUgc2VydmVyLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+UmVzb3VyY2UgTG9jYWw8L3NwYW4+IC0tIE5hdGl2ZSBhY3Rpb25zIG9mIGEgSkRCQyBkcml2ZXIgdGhhdCBhcmUgcmVmZXJlbmNlZCBieSBhIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNSByMWMzLXQyNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD5CYXRjaCBXcml0aW5nPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjUgcjFjMi10MjUiPgotPHA+U3BlY2lmeSB0aGUgdXNlIG9mIGJhdGNoIHdyaXRpbmcgdG8gb3B0aW1pemUgdHJhbnNhY3Rpb25zIHdpdGggbXVsdGlwbGUgd3JpdGUgb3BlcmF0aW9ucy48L3A+Ci08cD5TZXQgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgaW50byB0aGUgc2Vzc2lvbiBhdCBkZXBsb3ltZW50IHRpbWUuPC9wPgotPHA+Tm90ZTogVGhpcyBwcm9wZXJ0eSBhcHBsaWVzIHdoZW4gdXNlZCBib3RoIGluIGEgSmF2YSBTRSBhbmQgSmF2YSBFRSBlbnZpcm9ubWVudC48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsaWQgdmFsdWVzIGZvciBvcmFjbGUudG9wbGluay5jb25maWcuQmF0Y2hXcml0aW5nOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5KREJDPC9zcGFuPiZuZGFzaDtVc2UgSkRCQyBiYXRjaCB3cml0aW5nLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+QnVmZmVyZWQ8L3NwYW4+Jm5kYXNoO0RvIG5vdCB1c2UgZWl0aGVyIEpEQkMgYmF0Y2ggd3JpdGluZyBub3IgbmF0aXZlIHBsYXRmb3JtIGJhdGNoIHdyaXRpbmcuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5PcmFjbGVKREJDPC9zcGFuPiZuZGFzaDtVc2UgYm90aCBKREJDIGJhdGNoIHdyaXRpbmcgYW5kIE9yYWNsZSBuYXRpdmUgcGxhdGZvcm0gYmF0Y2ggd3JpdGluZy48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk5vbmU8L3NwYW4+Jm5kYXNoO0RvIG5vdCB1c2UgYmF0Y2ggd3JpdGluZyAodHVybiBpdCBvZmYpLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjUgcjFjMy10MjUiPgotPHA+Tm9uZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPgotPHA+U3RhdGVtZW50IGNhY2hpbmc8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNSByMWMyLXQyNSI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjUgcjFjMy10MjUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPgotPHA+TmF0aXZlIFNRTDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI1IHIxYzItdDI1Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyNSByMWMzLXQyNSI+Ci08cD5GYWxzZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPgotPHA+SlRBIERhdGEgU291cmNlIE5hbWU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyNSByMWMyLXQyNSI+Ci08cD5JZiB5b3Ugc2VsZWN0ZWQgPHNwYW4gY2xhc3M9ImJvbGQiPkpUQTwvc3Bhbj4gYXMgdGhlIHRyYW5zYWN0aW9uIHR5cGUsIHRoZW4gZW50ZXIgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgSlRBIGRhdGEgc291cmNlIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyNSByMWMzLXQyNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD5Ob24tSlRBIERhdGEgU291cmNlIE5hbWU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQyNSByMWMyLXQyNSI+Ci08cD5JZiB5b3Ugc2VsZWN0ZWQgPHNwYW4gY2xhc3M9ImJvbGQiPlJlc291cmNlIExvY2FsPC9zcGFuPiBhcyB0aGUgdHJhbnNhY3Rpb24gdHlwZSwgdGhlbiBlbnRlciB0aGUgbmFtZSBvZiB0aGUgbm9uLUpUQSBkYXRhIHNvdXJjZS48L3A+Ci08cD5UaGlzIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSBHZW5lcmljIHBsYXRmb3JtLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MjUiIGhlYWRlcnM9InIxYzEtdDI1Ij4KLTxwPiZuYnNwOyZuYnNwO0JpbmQmbmJzcDtQYXJhbWV0ZXJzPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MjUgcjFjMi10MjUiPgotPHA+Q29udHJvbCB3aGV0aGVyIG9yIG5vdCB0aGUgcXVlcnkgdXNlcyBwYXJhbWV0ZXIgYmluZGluZy48L3A+Ci08cD5Ob3RlOiBUaGlzIHByb3BlcnR5IGFwcGxpZXMgd2hlbiB1c2VkIGluIGEgSmF2YSBTRSBlbnZpcm9ubWVudC48L3A+Ci08cD5UaGlzIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSBHZW5lcmljIHBsYXRmb3JtLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10MjUiIGhlYWRlcnM9InIxYzEtdDI1Ij4KLTxwPkVjbGlwc2VMaW5rIENvbm5lY3Rpb24gUG9vbDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDI1IHIxYzItdDI1Ij4KLTxwPkRlZmluZSB0aGUgY29ubmVjdGlvbiBwb29sIGRyaXZlciwgVVJMLCB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkLjwvcD4KLTxwPlRoZXNlIHByb3BlcnRpZXMgYXJlIG5vdGUgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgR2VuZXJpYyBwbGF0Zm9ybS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQyNSByMWMzLXQyNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPgotPHA+Jm5ic3A7Jm5ic3A7UmVhZCZuYnNwO0Nvbm5lY3Rpb248L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MjUgcjFjMi10MjUiPgotPHA+VGhlIG1heGltdW0gYW5kIG1pbmltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGFsbG93ZWQgaW4gdGhlIEpEQkMgcmVhZCBjb25uZWN0aW9uIHBvb2wuPC9wPgotPHA+Tm90ZTogVGhlc2UgcHJvcGVydHkgYXBwbHkgd2hlbiB1c2VkIGluIGEgSmF2YSBTRSBlbnZpcm9ubWVudC48L3A+Ci08cD5UaGVzZSBwcm9wZXJ0aWVzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgR2VuZXJpYyBwbGF0Zm9ybTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQyNSByMWMzLXQyNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMWMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPgotPHA+Jm5ic3A7Jm5ic3A7V3JpdGUmbmJzcDtDb25uZWN0aW9uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjExYzEtdDI1IHIxYzItdDI1Ij4KLTxwPlRoZSBtYXhpbXVtIGFuZCBtaW5pbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyBhbGxvd2VkIGluIHRoZSBKREJDIHJlYWQgY29ubmVjdGlvbiBwb29sLjwvcD4KLTxwPk5vdGU6IFRoZXNlIHByb3BlcnR5IGFwcGx5IHdoZW4gdXNlZCBpbiBhIEphdmEgU0UgZW52aXJvbm1lbnQuPC9wPgotPHA+VGhlc2UgcHJvcGVydGllcyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIEdlbmVyaWMgcGxhdGZvcm08L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MjUgcjFjMy10MjUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxOS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE5Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExM2RiYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE5Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkN1c3RvbWl6YXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3VzdG9taXphdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUpBRkVHIiBuYW1lPSJDSUFKQUZFRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3VzdG9taXphdGlvbjwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB0aGUgQ3VzdG9taXphdGlvbiBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyNjIiIG5hbWU9InN0aHJlZjI2MiI+PC9hPjxhIGlkPSJzdGhyZWYyNjMiIG5hbWU9InN0aHJlZjI2MyI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW50YWJsZSI+UHJvcGVydGllcyBvZiB0aGUgQ3VzdG9taXphdGlvbiBQYWdlPC9wPgotPHRhYmxlIGNsYXNzPSJGb3JtYWwiIHRpdGxlPSJQcm9wZXJ0aWVzIG9mIHRoZSBDdXN0b21pemF0aW9uIFBhZ2UiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBFZGl0b3ImcnNxdW87cyBDdXN0b21pemF0aW9uIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyMyUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyNiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI2Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjYiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD5XZWF2aW5nPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjYgcjFjMi10MjYiPgotPHA+U3BlY2lmaWVzIGlmIHdlYXZpbmcgb2YgdGhlIGVudGl0eSBjbGFzc2VzIGlzIHBlcmZvcm1lZC4gVGhlIEVjbGlwc2VMaW5rIEpQQSBwZXJzaXN0ZW5jZSBwcm92aWRlciB1c2VzIHdlYXZpbmcgdG8gZW5oYW5jZSBKUEEgZW50aXRpZXMgZm9yIHN1Y2ggcHJvcGVydGllcyBhcyBsYXp5IGxvYWRpbmcsIGNoYW5nZSB0cmFja2luZywgZmV0Y2ggZ3JvdXBzLCBhbmQgaW50ZXJuYWwgb3B0aW1pemF0aW9ucy4gU2VsZWN0IGZyb20gdGhlIGZvbGxvd2luZyBvcHRpb25zOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5ObyBXZWF2aW5nPC9zcGFuPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+V2VhdmUgRHluYW1pY2FsbHk8L3NwYW4+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5XZWF2ZSBTdGF0aWNhbGx5PC9zcGFuPiAtLSBVc2UgdGhpcyBvcHRpb24gaWYgeW91IHBsYW4gdG8gZXhlY3V0ZSB5b3VyIGFwcGxpY2F0aW9uIG91dHNpZGUgb2YgYSBKYXZhIEVFIDUgY29udGFpbmVyIGluIGFuIGVudmlyb25tZW50IHRoYXQgZG9lcyBub3QgcGVybWl0IHRoZSB1c2Ugb2YgPGNvZGU+LWphdmFhZ2VudDplY2xpcHNlbGluay5qYXI8L2NvZGU+IG9uIHRoZSBKVk0gY29tbWFuZCBsaW5lLiBUaGlzIGFzc3VtZXMgdGhhdCBjbGFzc2VzIGhhdmUgYWxyZWFkeSBiZWVuIHN0YXRpY2FsbHkgd292ZW4uIFJ1biB0aGUgc3RhdGljIHdlYXZlciBvbiB0aGUgY2xhc3NlcyBiZWZvcmUgZGVwbG95aW5nIHRoZW0uPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNiByMWMzLXQyNiI+Ci08cD5XZWF2ZSBEeW5hbWljYWxseTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyNiIgaGVhZGVycz0icjFjMS10MjYiPgotPHA+Jm5ic3A7Jm5ic3A7V2VhdmluZyZuYnNwO0xhenk8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNiByMWMyLXQyNiI+Ci08cD5TZWxlY3QgdGhpcyBvcHRpb24gdG8gZW5hYmxlIGxhenkgd2VhdmluZy48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNiByMWMzLXQyNiI+Ci08cD5UcnVlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD4mbmJzcDsmbmJzcDtXZWF2aW5nJm5ic3A7RmV0Y2gmbmJzcDtHcm91cHM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNiByMWMyLXQyNiI+Ci08cD5TZWxlY3QgdGhpcyBvcHRpb24gdG8gZW5hYmxlIGZldGNoIGdyb3VwcyB0aHJvdWdoIHdlYXZpbmcuIFNldCB0aGlzIG9wdGlvbiB0byBmYWxzZSBpZjo8L3A+Ci08dWw+Ci08bGk+Ci08cD5UaGVyZSBpcyBubyB3ZWF2aW5nLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DbGFzc2VzIHNob3VsZCBub3QgYmUgY2hhbmdlZCBkdXJpbmcgd2VhdmluZyAoZm9yIGV4YW1wbGUsIHdoZW4gZGVidWdnaW5nKS48L3A+Ci08L2xpPgotPC91bD4KLTxwPlNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIGZvciBwbGF0Zm9ybXMgd2hlcmUgaXQgaXMgbm90IHN1cHBvcnRlZC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNiByMWMzLXQyNiI+Ci08cD5UcnVlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD5XZWF2aW5nJm5ic3A7aW50ZXJuYWw8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyNiByMWMyLXQyNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjYgcjFjMy10MjYiPgotPHA+VHJ1ZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQyNiIgaGVhZGVycz0icjFjMS10MjYiPgotPHA+V2VhdmluZyZuYnNwO2VhZ2VyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjYgcjFjMi10MjYiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDI2IHIxYzMtdDI2Ij4KLTxwPkZhbHNlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD4mbmJzcDsmbmJzcDtXZWF2aW5nJm5ic3A7Q2hhbmdlJm5ic3A7VHJhY2tpbmc8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQyNiByMWMyLXQyNiI+Ci08cD5TZWxlY3QgdGhpcyBvcHRpb24gdG8gdXNlIHdlYXZpbmcgdG8gZGV0ZWN0IHdoaWNoIGZpZWxkcyBvciBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QgY2hhbmdlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDI2IHIxYzMtdDI2Ij4KLTxwPlRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPiZuYnNwOyZuYnNwO1Rocm93Jm5ic3A7RXhjZXB0aW9uczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDI2IHIxYzItdDI2Ij4KLTxwPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBzZXQgRWNsaXBzZUxpbmsgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIG9yIGxvZyBhIHdhcm5pbmcgd2hlbiBpdCBlbmNvdW50ZXJzIGEgcHJvYmxlbSB3aXRoIGFueSBvZiB0aGUgZmlsZXMgbGlzdGVkIGluIGEgPHNwYW4gY2xhc3M9ImJvbGQiPnBlcnNpc3RlbmNlLnhtbDwvc3Bhbj4gZmlsZSA8Y29kZT4mbHQ7bWFwcGluZy1maWxlJmd0OzwvY29kZT4gZWxlbWVudC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQyNiByMWMzLXQyNiI+Ci08cD5UcnVlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI5YzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD5FeGNlcHRpb24gaGFuZGxlcjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDI2IHIxYzItdDI2Ij4KLTxwPlNlbGVjdCAob3IgY3JlYXRlKSBhIEphdmEgY2xhc3MgdG8gaGFuZGxlIGV4Y2VwdGlvbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MjYgcjFjMy10MjYiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTBjMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPlNlc3Npb24gQ3VzdG9taXplcjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQyNiByMWMyLXQyNiI+Ci08cD5TZWxlY3QgYSBzZXNzaW9uIGN1c3RvbWl6ZXIgY2xhc3M6IGEgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIDxjb2RlPmVjbGlwc2VsaW5rLnRvb2xzLnNlc3Npb25jb25maWd1cmF0aW9uLlNlc3Npb25DdXN0b21pemVyPC9jb2RlPiBpbnRlcmZhY2UgYW5kIHByb3ZpZGVzIGEgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuIFVzZSB0aGlzIGNsYXNzJyA8Y29kZT5jdXN0b21pemU8L2NvZGU+IG1ldGhvZCwgd2hpY2ggdGFrZXMgYW4gPGNvZGU+ZWNsaXBzZWxpbmsuc2Vzc2lvbnMuU2Vzc2lvbjwvY29kZT4sIHRvIHByb2dyYW1tYXRpY2FsbHkgYWNjZXNzIGFkdmFuY2VkIEVjbGlwc2VMaW5rIHNlc3Npb24gQVBJLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQyNiByMWMzLXQyNiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMWMxLXQyNiIgaGVhZGVycz0icjFjMS10MjYiPgotPHA+RGVzY3JpcHRvciBDdXN0b21pemVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjExYzEtdDI2IHIxYzItdDI2Ij4KLTxwPlNlbGVjdCBhbiBFY2xpcHNlTGluayBkZXNjcmlwdG9yIGN1c3RvbWl6ZXIgY2xhc3MmbmRhc2g7YSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgPGNvZGU+ZWNsaXBzZWxpbmsudG9vbHMuc2Vzc2lvbmNvbmZpZ3VyYXRpb24uRGVzY3JpcHRvckN1c3RvbWl6ZXI8L2NvZGU+IGludGVyZmFjZSBhbmQgcHJvdmlkZXMgYSBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4gVXNlIHRoaXMgY2xhc3MncyA8Y29kZT5jdXN0b21pemU8L2NvZGU+IG1ldGhvZCwgd2hpY2ggdGFrZXMgYW4gPGNvZGU+ZWNsaXBzZWxpbmsuZGVzY3JpcHRvcnMuQ2xhc3NEZXNjcmlwdG9yPC9jb2RlPiwgdG8gcHJvZ3JhbW1hdGljYWxseSBhY2Nlc3MgYWR2YW5jZWQgRWNsaXBzZUxpbmsgZGVzY3JpcHRvciBhbmQgbWFwcGluZyBBUEkgZm9yIHRoZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgSlBBIGVudGl0eSBuYW1lZCA8Y29kZT4mbHQ7RU5USVRZJmd0OzwvY29kZT4uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjExYzEtdDI2IHIxYzMtdDI2Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEyYzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD5WYWxpZGF0aW9uIG9ubHk8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTJjMS10MjYgcjFjMi10MjYiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQyNiByMWMzLXQyNiI+Ci08cD5UcnVlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxM2MxLXQyNiIgaGVhZGVycz0icjFjMS10MjYiPgotPHA+UHJvZmlsZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTNjMS10MjYgcjFjMi10MjYiPgotPHVsPgotPGxpPgotPHA+Tm8gUHJvZmlsZXI8L3A+Ci08L2xpPgotPGxpPgotPHA+UGVyZm9ybWFuY2UgUHJvZmlsZXI8L3A+Ci08L2xpPgotPGxpPgotPHA+UXVlcnkgTW9uaXRvcjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDI2IHIxYzMtdDI2Ij4KLTxwPk5vUHJvZmlsZXI8L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJ0Ymxmb3JtYWwiIC0tPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGlzIHBhZ2UgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5HZW5lcmljPC9zcGFuPiBwbGF0Zm9ybS48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjAuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2OWU2ZGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DYWNoaW5nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNhY2hpbmciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFCRURDSCIgbmFtZT0iQ0lBQkVEQ0giPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPjxhIGlkPSJzdGhyZWYyNjQiIG5hbWU9InN0aHJlZjI2NCI+PC9hPkNhY2hpbmc8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgQ2FjaGluZyBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyNjUiIG5hbWU9InN0aHJlZjI2NSI+PC9hPjxhIGlkPSJzdGhyZWYyNjYiIG5hbWU9InN0aHJlZjI2NiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW50YWJsZSI+UHJvcGVydGllcyBvZiB0aGUgQ2FjaGluZyBQYWdlPC9wPgotPHRhYmxlIGNsYXNzPSJGb3JtYWwiIHRpdGxlPSJQcm9wZXJ0aWVzIG9mIHRoZSBDYWNoaW5nIFBhZ2UiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCZyc3F1bztzIENhY2hpbmcgcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDI4Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjgiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyOCI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjgiIGhlYWRlcnM9InIxYzEtdDI4Ij4KLTxwPkRlZmF1bHQgQ2FjaGUgVHlwZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI4IHIxYzItdDI4Ij4KLTxwPlNlbGVjdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBhcyB0aGUgRGVmYXVsdCBDYWNoZSBUeXBlOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Tb2Z0IHdpdGggV2VhayBTdWJjYWNoZTwvc3Bhbj4mbmRhc2g7VGhpcyBvcHRpb24gaXMgc2ltaWxhciB0byA8c3BhbiBjbGFzcz0iYm9sZCI+V2VhayB3aXRoIEhhcmQgU3ViY2FjaGU8L3NwYW4+IGV4Y2VwdCB0aGF0IGl0IG1haW50YWlucyBhIG1vc3QgZnJlcXVlbnRseSB1c2VkIHN1YmNhY2hlIHRoYXQgdXNlcyBzb2Z0IHJlZmVyZW5jZXMuIFRoZSBzaXplIG9mIHRoZSBzdWJjYWNoZSBpcyBwcm9wb3J0aW9uYWwgdG8gdGhlIHNpemUgb2YgdGhlIGlkZW50aXR5IG1hcC4gVGhlIHN1YmNhY2hlIHVzZXMgc29mdCByZWZlcmVuY2VzIHRvIGVuc3VyZSB0aGF0IHRoZXNlIG9iamVjdHMgYXJlIGdhcmJhZ2UtY29sbGVjdGVkIG9ubHkgaWYgdGhlIHN5c3RlbSBpcyBsb3cgb24gbWVtb3J5LjwvcD4KLTxwPlVzZSB0aGlzIGlkZW50aXR5IG1hcCBpbiBtb3N0IGNpcmN1bXN0YW5jZXMgYXMgYSBtZWFucyB0byBjb250cm9sIG1lbW9yeSB1c2VkIGJ5IHRoZSBjYWNoZS48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPldlZWsgd2l0aCBIYXJkIFN1YmNhY2hlPC9zcGFuPiZuZGFzaDtUaGlzIG9wdGlvbiBpcyBzaW1pbGFyIHRvIDxzcGFuIGNsYXNzPSJib2xkIj5Tb2Z0IHdpdGggV2Vhazwvc3Bhbj4gc3ViY2FjaGUgZXhjZXB0IHRoYXQgaXQgbWFpbnRhaW5zIGEgbW9zdCBmcmVxdWVudGx5IHVzZWQgc3ViY2FjaGUgdGhhdCB1c2VzIGhhcmQgcmVmZXJlbmNlcy4gVXNlIHRoaXMgaWRlbnRpdHkgbWFwIGlmIHNvZnQgcmVmZXJlbmNlcyBhcmUgbm90IHN1aXRhYmxlIGZvciB5b3VyIHBsYXRmb3JtLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+V2Vhazwvc3Bhbj4mbmRhc2g7VGhpcyBvcHRpb24gaXMgc2ltaWxhciB0byA8c3BhbiBjbGFzcz0iYm9sZCI+RnVsbDwvc3Bhbj4sIGV4Y2VwdCB0aGF0IG9iamVjdHMgYXJlIHJlZmVyZW5jZWQgdXNpbmcgd2VhayByZWZlcmVuY2VzLiBUaGlzIG9wdGlvbiB1c2VzIGxlc3MgbWVtb3J5IHRoYW4gPHNwYW4gY2xhc3M9ImJvbGQiPkZ1bGw8L3NwYW4+LCBhbGxvd3MgY29tcGxldGUgZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZCBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuPC9wPgotPHA+VXNlIHRoaXMgaWRlbnRpdHkgbWFwIGZvciB0cmFuc2FjdGlvbnMgdGhhdCwgb25jZSBzdGFydGVkLCBzdGF5IG9uIHRoZSBzZXJ2ZXIgc2lkZS48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlNvZnQ8L3NwYW4+Jm5kYXNoO1RoaXMgb3B0aW9uIGlzIHNpbWlsYXIgdG8gPHNwYW4gY2xhc3M9ImJvbGQiPldlYWs8L3NwYW4+IGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlIG9iamVjdHMgdXNpbmcgc29mdCByZWZlcmVuY2VzLiBUaGlzIGlkZW50aXR5IG1hcCBlbmFibGVzIGZ1bGwgZ2FyYmFnZSBjb2xsZWN0aW9uIHdoZW4gbWVtb3J5IGlzIGxvdy4gSXQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RnVsbDwvc3Bhbj4mbmRhc2g7VGhpcyBvcHRpb24gcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5OiBhbGwgb2JqZWN0cyBhcmUgY2FjaGVkIGFuZCBub3QgcmVtb3ZlZC48L3A+Ci08cD5Ob3RlOiBUaGlzIHByb2Nlc3MgbWF5IGJlIG1lbW9yeS1pbnRlbnNpdmUgd2hlbiBtYW55IG9iamVjdHMgYXJlIHJlYWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Ob25lPC9zcGFuPiZuZGFzaDtUaGlzIG9wdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBvYmplY3QgaWRlbnRpdHkgYW5kIGRvZXMgbm90IGNhY2hlIG9iamVjdHMuVGhpcyBvcHRpb24gaXMgbm90IHJlY29tbWVuZGVkLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjggcjFjMy10MjgiPgotPHA+V2VhayB3aXRoIHNvZnQgc3ViY2FjaGU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjgiIGhlYWRlcnM9InIxYzEtdDI4Ij4KLTxwPkRlZmF1bHQgQ2FjaGUgU2l6ZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI4IHIxYzItdDI4Ij4KLTxwPlNldCB0aGUgc2l6ZSAobWF4aW11bSBudW1iZXIgb2Ygb2JqZWN0cykgb2YgdGhlIGNhY2hlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI4IHIxYzMtdDI4Ij4KLTxwPjEwMDwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPgotPHA+RGVmYXVsdCBTaGFyZWQgQ2FjaGU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyOCByMWMyLXQyOCI+Ci08cD5TcGVjaWZpZXMgaWYgY2FjaGVkIGluc3RhbmNlcyBzaG91bGQgYmUgaW4gdGhlIHNoYXJlZCBjYWNoZSBvciBpbiBhIGNsaWVudCBpc29sYXRlZCBjYWNoZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyOCByMWMzLXQyOCI+Ci08cD5UcnVlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDI4IiBoZWFkZXJzPSJyMWMxLXQyOCI+Ci08cD5FbnRpdHkgQ2FjaGluZzwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI4IHIxYzItdDI4Ij4KLTxwPlNwZWNpZnkgdGhlIGVudGl0eS1zcGVjaWZpYyBjYWNoaW5nIGluZm9ybWF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI4IHIxYzMtdDI4Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MjgiIGhlYWRlcnM9InIxYzEtdDI4Ij4KLTxwPiZuYnNwOyZuYnNwO0NhY2hlJm5ic3A7VHlwZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDI4IHIxYzItdDI4Ij4KLTxwPlNlZSA8c3BhbiBjbGFzcz0iaXRhbGljIj5EZWZhdWx0IENhY2hlIFR5cGUuPC9zcGFuPjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDI4IHIxYzMtdDI4Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MjgiIGhlYWRlcnM9InIxYzEtdDI4Ij4KLTxwPiZuYnNwOyZuYnNwO0NhY2hlJm5ic3A7U2l6ZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDI4IHIxYzItdDI4Ij4KLTxwPlNlZSA8c3BhbiBjbGFzcz0iaXRhbGljIj5EZWZhdWx0IENhY2hlIFNpemUuPC9zcGFuPjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDI4IHIxYzMtdDI4Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MjgiIGhlYWRlcnM9InIxYzEtdDI4Ij4KLTxwPiZuYnNwOyZuYnNwO1NoYXJlZCZuYnNwO0NhY2hlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MjggcjFjMi10MjgiPgotPHA+U2VlIDxzcGFuIGNsYXNzPSJpdGFsaWMiPkRlZmF1bHQgU2hhcmVkIENhY2hlPC9zcGFuPi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQyOCByMWMzLXQyOCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI5YzEtdDI4IiBoZWFkZXJzPSJyMWMxLXQyOCI+Ci08cD5GbHVzaCBjbGVhciBjYWNoZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDI4IHIxYzItdDI4Ij4KLTxwPlNlbGVjdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBhcyB0aGUgRGVmYXVsdCBDYWNoZSBUeXBlOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Ecm9wPC9zcGFuPiAmbmRhc2g7IFRoaXMgbW9kZSBpcyB0aGUgZmFzdGVzdCBhbmQgdXNlcyB0aGUgbGVhc3QgbWVtb3J5LiBIb3dldmVyLCBhZnRlciBjb21taXQgdGhlIHNoYXJlZCBjYWNoZSBtaWdodCBwb3RlbnRpYWxseSBjb250YWluIHN0YWxlIGRhdGEuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Ecm9wIEludmFsaWRhdGU8L3NwYW4+ICZuZGFzaDsgQ2xhc3NlcyB0aGF0IGhhdmUgYXQgbGVhc3Qgb25lIG9iamVjdCB1cGRhdGVkIG9yIGRlbGV0ZWQgYXJlIGludmFsaWRhdGVkIGluIHRoZSBzaGFyZWQgY2FjaGUgYXQgY29tbWl0IHRpbWUuIFRoaXMgbW9kZSBpcyBzbG93ZXIgdGhhbiA8c3BhbiBjbGFzcz0iYm9sZCI+RHJvcDwvc3Bhbj4sIGJ1dCBhcyBlZmZpY2llbnQgbWVtb3J5IHVzYWdlLXdpc2UsIGFuZCBwcmV2ZW50cyBzdGFsZSBkYXRhLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+TWVyZ2U8L3NwYW4+ICZuZGFzaDsgRHJvcCBjbGFzc2VzIGZyb20gdGhlIEVudGl0eU1hbmFnZXIncyBjYWNoZSBvZiBvYmplY3RzIHRoYXQgaGF2ZSBub3QgYmVlbiBmbHVzaGVkLiBUaGlzIG1vZGUgbGVhdmVzIHRoZSBzaGFyZWQgY2FjaGUgaW4gYSBwZXJmZWN0IHN0YXRlIGFmdGVyIGNvbW1pdC4gSG93ZXZlciwgaXQgaXMgdGhlIGxlYXN0IG1lbW9yeS1lZmZpY2llbnQgbW9kZTsgdGhlIG1lbW9yeSBtaWdodCBldmVuIHJ1biBvdXQgaW4gYSB2ZXJ5IGxhcmdlIHRyYW5zYWN0aW9uLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MjggcjFjMy10MjgiPgotPHA+RHJvcCBJbnZhbGlkYXRlPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhpcyBwYWdlIGlzIG5vdCBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+R2VuZXJpYzwvc3Bhbj4gcGxhdGZvcm0uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIxLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTJjMzYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TG9nZ2luZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJMb2dnaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBQkdISEkiIG5hbWU9IkNJQUJHSEhJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Mb2dnaW5nPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIExvZ2dpbmcgcGFnZSBvZiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbGxfZWRpdG9yLmh0bSNDSUFDQ0hJRCI+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvYT4uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGlzIHBhZ2UgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5HZW5lcmljPC9zcGFuPiBwbGF0Zm9ybS48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjI2NyIgbmFtZT0ic3RocmVmMjY3Ij48L2E+PGEgaWQ9InN0aHJlZjI2OCIgbmFtZT0ic3RocmVmMjY4Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj5Qcm9wZXJ0aWVzIG9mIHRoZSBMb2dnaW5nIFBhZ2U8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9IlByb3BlcnRpZXMgb2YgdGhlIExvZ2dpbmcgUGFnZSIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgTG9nZ2luZyBwYWdlIG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwgRWRpdG9yLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MzEiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQzMSI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDMxIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzMSIgaGVhZGVycz0icjFjMS10MzEiPgotPHA+TG9nZ2luZyBMZXZlbDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDMxIHIxYzItdDMxIj4KLTxwPlNwZWNpZmllcyB0aGUgYW1vdW50IGFuZCBkZXRhaWwgb2YgbG9nIG91dHB1dCBieSBzZWxlY3RpbmcgdGhlIGxvZyBsZXZlbCAoaW4gYXNjZW5kaW5nIG9yZGVyIG9mIGluZm9ybWF0aW9uKTo8L3A+Ci08cD5UaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsaWQgdmFsdWVzIGZvciB0aGUgPGNvZGU+amF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw8L2NvZGU+OjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5PRkY8L3NwYW4+Jm5kYXNoO2Rpc2FibGVzIGxvZ2dpbmc8L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlNFVkVSRTwvc3Bhbj4mbmRhc2g7bG9ncyBleGNlcHRpb25zIGluZGljYXRpbmcgVG9wTGluayBjYW5ub3QgY29udGludWUsIGFzIHdlbGwgYXMgYW55IGV4Y2VwdGlvbnMgZ2VuZXJhdGVkIGR1cmluZyBsb2dpbi4gVGhpcyBpbmNsdWRlcyBhIHN0YWNrIHRyYWNlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+V0FSTklORzwvc3Bhbj4mbmRhc2g7bG9ncyBleGNlcHRpb25zIHRoYXQgZG8gbm90IGZvcmNlIFRvcExpbmsgdG8gc3RvcCwgaW5jbHVkaW5nIGFsbCBleGNlcHRpb25zIG5vdCBsb2dnZWQgd2l0aCBzZXZlcmUgbGV2ZWwuIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBhIHN0YWNrIHRyYWNlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+SU5GTzwvc3Bhbj4mbmRhc2g7bG9ncyB0aGUgbG9naW4vbG9nb3V0IHBlciBzZXZlciBzZXNzaW9uLCBpbmNsdWRpbmcgdGhlIHVzZXIgbmFtZS4gQWZ0ZXIgYWNxdWlyaW5nIHRoZSBzZXNzaW9uLCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBpcyBsb2dnZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5DT05GSUc8L3NwYW4+Jm5kYXNoO2xvZ3Mgb25seSBsb2dpbiwgSkRCQyBjb25uZWN0aW9uLCBhbmQgZGF0YWJhc2UgaW5mb3JtYXRpb24uPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5GSU5FPC9zcGFuPiZuZGFzaDtsb2dzIFNRTC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkZJTkVSPC9zcGFuPiZuZGFzaDtzaW1pbGFyIHRvIHdhcm5pbmcuIEluY2x1ZGVzIHN0YWNrIHRyYWNlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RklORVNUPC9zcGFuPiZuZGFzaDtpbmNsdWRlcyBhZGRpdGlvbmFsIGxvdyBsZXZlbCBpbmZvcm1hdGlvbi48L3A+Ci08L2xpPgotPC91bD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmxvZ2dpbmcubGV2ZWwiIHZhbHVlPSJJTkZPIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzMSByMWMzLXQzMSI+Ci08cD5JbmZvPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+Ci08cD4mbmJzcDsmbmJzcDtUaW1lc3RhbXA8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzMSByMWMyLXQzMSI+Ci08cD5Db250cm9sIHdoZXRoZXIgdGhlIHRpbWVzdGFtcCBpcyBsb2dnZWQgaW4gZWFjaCBsb2cgZW50cnkuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbGlkIHZhbHVlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+dHJ1ZTwvc3Bhbj4mbmRhc2g7bG9nIGEgdGltZXN0YW1wLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+ZmFsc2U8L3NwYW4+Jm5kYXNoO2RvIG5vdCBsb2cgYSB0aW1lc3RhbXAuPC9wPgotPC9saT4KLTwvdWw+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RXhhbXBsZTwvc3Bhbj46IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLSZsdDtwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlbGluay5sb2dnaW5nLnRpbWVzdGFtcCIgdmFsdWU9ImZhbHNlIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzMSByMWMzLXQzMSI+Ci08cD50cnVlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+Ci08cD4mbmJzcDsmbmJzcDtUaHJlYWQ8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQzMSByMWMyLXQzMSI+Ci08cD5Db250cm9sIHdoZXRoZXIgYSB0aHJlYWQgaWRlbnRpZmllciBpcyBsb2dnZWQgaW4gZWFjaCBsb2cgZW50cnkuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbGlkIHZhbHVlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+dHJ1ZTwvc3Bhbj4mbmRhc2g7bG9nIGEgdGhyZWFkIGlkZW50aWZpZXIuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5mYWxzZTwvc3Bhbj4mbmRhc2g7ZG8gbm90IGxvZyBhIHRocmVhZCBpZGVudGlmaWVyLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MzEgcjFjMy10MzEiPgotPHA+dHJ1ZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQzMSIgaGVhZGVycz0icjFjMS10MzEiPgotPHA+Jm5ic3A7Jm5ic3A7U2Vzc2lvbjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDMxIHIxYzItdDMxIj4KLTxwPkNvbnRyb2wgd2hldGhlciBhbiBFY2xpcHNlTGluayBzZXNzaW9uIGlkZW50aWZpZXIgaXMgbG9nZ2VkIGluIGVhY2ggbG9nIGVudHJ5LjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2YWxpZCB2YWx1ZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPnRydWU8L3NwYW4+Jm5kYXNoO2xvZyBhIEVjbGlwc2VMaW5rIHNlc3Npb24gaWRlbnRpZmllci48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPmZhbHNlPC9zcGFuPiZuZGFzaDtkbyBub3QgbG9nIGEgRWNsaXBzZUxpbmsgc2Vzc2lvbiBpZGVudGlmaWVyLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsubG9nZ2luZy5zZXNzaW9uIiB2YWx1ZT0iZmFsc2UiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDMxIHIxYzMtdDMxIj4KLTxwPnRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MzEiIGhlYWRlcnM9InIxYzEtdDMxIj4KLTxwPiZuYnNwOyZuYnNwO0V4Y2VwdGlvbnM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQzMSByMWMyLXQzMSI+Ci08cD5Db250cm9sIHdoZXRoZXIgdGhlIGV4Y2VwdGlvbnMgdGhyb3duIGZyb20gd2l0aGluIHRoZSBFY2xpcHNlTGluayBjb2RlIGFyZSBsb2dnZWQgcHJpb3IgdG8gcmV0dXJuaW5nIHRoZSBleGNlcHRpb24gdG8gdGhlIGNhbGxpbmcgYXBwbGljYXRpb24uIEVuc3VyZXMgdGhhdCBhbGwgZXhjZXB0aW9ucyBhcmUgbG9nZ2VkIGFuZCBub3QgbWFza2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjb2RlLjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2YWxpZCB2YWx1ZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPnRydWU8L3NwYW4+Jm5kYXNoO2xvZyBhbGwgZXhjZXB0aW9ucy48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPmZhbHNlPC9zcGFuPiZuZGFzaDtkbyBub3QgbG9nIGV4Y2VwdGlvbnMuPC9wPgotPC9saT4KLTwvdWw+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RXhhbXBsZTwvc3Bhbj46IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLSZsdDtwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlbGluay5sb2dnaW5nLmV4Y2VwdGlvbnMiIHZhbHVlPSJ0cnVlIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQzMSByMWMzLXQzMSI+Ci08cD5mYWxzZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQzMSIgaGVhZGVycz0icjFjMS10MzEiPgotPHA+TG9nIGZpbGU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQzMSByMWMyLXQzMSI+Ci08cD5TcGVjaWZ5IGEgZmlsZSBsb2NhdGlvbiBmb3IgdGhlIGxvZyBvdXRwdXQgKGluc3RlYWQgb2YgdGhlIHN0YW5kYXJkIG91dCkuPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsubG9nZ2luZy5maWxlIiB2YWx1ZT0iQzpcbXlvdXRcIiAvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MzEgcjFjMy10MzEiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQzMSIgaGVhZGVycz0icjFjMS10MzEiPgotPHA+TG9nZ2VyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MzEgcjFjMi10MzEiPgotPHA+U2VsZWN0IHRoZSB0eXBlIG9mIGxvZ2dlciB0byB1c2U6PC9wPgotPHA+VGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbGlkIHZhbHVlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RGVmYXVsdExvZ2dlcjwvc3Bhbj4mbmRhc2g7dGhlIEVjbGlwc2VMaW5rIG5hdGl2ZSBsb2dnZXIgPGNvZGU+ZWNsaXBzZWxpbmsubG9nZ2luZy5EZWZhdWx0U2Vzc2lvbkxvZzwvY29kZT4uPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5KYXZhTG9nZ2VyPC9zcGFuPiZuZGFzaDt0aGUgPGNvZGU+amF2YS51dGlsLmxvZ2dpbmc8L2NvZGU+IGxvZ2dlciA8Y29kZT5lY2xpcHNlbGluay5sb2dnaW5nLkphdmFMb2c8L2NvZGU+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+U2VydmVyTG9nZ2VyPC9zcGFuPiZuZGFzaDt0aGUgPGNvZGU+amF2YS51dGlsLmxvZ2dpbmc8L2NvZGU+IGxvZ2dlciA8Y29kZT5lY2xpcHNlbGluay5wbGF0Zm9ybS5zZXJ2ZXIuU2VydmVyTG9nPC9jb2RlPi4gSW50ZWdyYXRlcyB3aXRoIHRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIncyBsb2dnaW5nIGFzIGRlZmluZSBpbiB0aGUgPGNvZGU+ZWNsaXBzZWxpbmsucGxhdGZvcm0uc2VydmVyLlNlcnZlclBsYXRmb3JtLjwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+RnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBjdXN0b20gbG9nZ2VyLiBUaGUgY3VzdG9tIGxvZ2dlciBtdXN0IGltcGxlbWVudCB0aGUgPGNvZGU+ZWNsaXBzZWxpbmsubG9nZ2luZy5TZXNzaW9uTG9nPC9jb2RlPiBpbnRlcmZhY2UuPC9wPgotPC9saT4KLTwvdWw+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RXhhbXBsZTwvc3Bhbj46IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLSZsdDtwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlbGluay5sb2dnaW5nLmxvZ2dlciIgdmFsdWU9ImFjbWUubG9nZ2Vycy5NeUN1c3RvbUxvZ2dlciIgLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDMxIHIxYzMtdDMxIj4KLTxwPkRlZmF1bHRMb2dnZXI8L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJ0Ymxmb3JtYWwiIC0tPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMWI3Y2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5PcHRpb25zPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik9wdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFGSkNIRSIgbmFtZT0iQ0lBRkpDSEUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk9wdGlvbnM8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgT3B0aW9ucyBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoaXMgcGFnZSBpcyBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyaWM8L3NwYW4+IHBsYXRmb3JtLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMjY5IiBuYW1lPSJzdGhyZWYyNjkiPjwvYT48YSBpZD0ic3RocmVmMjcwIiBuYW1lPSJzdGhyZWYyNzAiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPlByb3BlcnRpZXMgb2YgdGhlIE9wdGlvbnMgUGFnZTwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iUHJvcGVydGllcyBvZiB0aGUgT3B0aW9ucyBQYWdlIiBzdW1tYXJ5PSJQcm9wZXJ0aWVzIG9mIHRoZSBPcHRpb25zIFBhZ2UiIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDMzIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MzMiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQzMyI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MzMiIGhlYWRlcnM9InIxYzEtdDMzIj4KLTxwPlNlc3Npb24gTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDMzIHIxYzItdDMzIj4KLTxwPlNwZWNpZnkgdGhlIG5hbWUgYnkgd2hpY2ggdGhlIEVjbGlwc2VMaW5rIHNlc3Npb24gaXMgc3RvcmVkIGluIHRoZSBzdGF0aWMgc2Vzc2lvbiBtYW5hZ2VyLiBVc2UgdGhpcyBvcHRpb24gaWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBFY2xpcHNlTGluayBzaGFyZWQgc2Vzc2lvbiBvdXRzaWRlIG9mIHRoZSBjb250ZXh0IG9mIHRoZSBKUEEgb3IgdG8gdXNlIGEgcHJlLWV4aXN0aW5nIEVjbGlwc2VMaW5rIHNlc3Npb24gY29uZmlndXJlZCB0aHJvdWdoIGEgRWNsaXBzZUxpbmsgPGNvZGU+c2Vzc2lvbnMueG1sPC9jb2RlPiBmaWxlPC9wPgotPHA+VmFsaWQgdmFsdWVzOiBhIHZhbGlkIEVjbGlwc2VMaW5rIHNlc3Npb24gbmFtZSB0aGF0IGlzIHVuaXF1ZSBpbiBhIHNlcnZlciBkZXBsb3ltZW50LjwvcD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLnNlc3Npb24tbmFtZSIgdmFsdWU9Ik15U2Vzc2lvbiIvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzMgcjFjMy10MzMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQzMyIgaGVhZGVycz0icjFjMS10MzMiPgotPHA+U2Vzc2lvbnMgWE1MPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MzMgcjFjMi10MzMiPgotPHA+U3BlY2lmeSBwZXJzaXN0ZW5jZSBpbmZvcm1hdGlvbiBsb2FkZWQgZnJvbSB0aGUgRWNsaXBzZUxpbmsgc2Vzc2lvbiBjb25maWd1cmF0aW9uIGZpbGUgKDxjb2RlPnNlc3Npb25zLnhtbDwvY29kZT4pLjwvcD4KLTxwPllvdSBjYW4gdXNlIHRoaXMgb3B0aW9uIGFzIGFuIGFsdGVybmF0aXZlIHRvIGFubm90YXRpb25zIGFuZCBkZXBsb3ltZW50IFhNTC4gSWYgeW91IHNwZWNpZnkgdGhpcyBwcm9wZXJ0eSwgRWNsaXBzZUxpbmsgd2lsbCBvdmVycmlkZSBhbGwgY2xhc3MgYW5ub3RhdGlvbiBhbmQgdGhlIG9iamVjdCByZWxhdGlvbmFsIG1hcHBpbmcgZnJvbSB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiwgYXMgd2VsbCBhcyA8Y29kZT5PUk0ueG1sPC9jb2RlPiBhbmQgb3RoZXIgbWFwcGluZyBmaWxlcywgaWYgcHJlc2VudC48L3A+Ci08cD5JbmRpY2F0ZSB0aGUgc2Vzc2lvbiBieSBzZXR0aW5nIHRoZSA8Y29kZT5lY2xpcHNlbGluay5zZXNzaW9uLW5hbWU8L2NvZGU+IHByb3BlcnR5LjwvcD4KLTxwPk5vdGU6IElmIHlvdSBkbyBub3Qgc3BlY2lmeSB0aGUgdmFsdWUgZm9yIHRoaXMgcHJvcGVydHksIDxjb2RlPnNlc3Npb25zLnhtbDwvY29kZT4gZmlsZSB3aWxsIG5vdCBiZSB1c2VkLjwvcD4KLTxwPlZhbGlkIHZhbHVlczogdGhlIHJlc291cmNlIG5hbWUgb2YgdGhlIHNlc3Npb25zIFhNTCBmaWxlLjwvcD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9InRvcGxpbmsuc2Vzc2lvbi14bWwiIHZhbHVlPSJteXNlc3Npb24ueG1sIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzMyByMWMzLXQzMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD5UYXJnZXQgRGF0YWJhc2U8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQzMyByMWMyLXQzMyI+Ci08cD5TZWxlY3QgdGhlIHRhcmdldCBkYXRhYmFzZS4gWW91IGNhbiBhbHNvIHNldCB0aGUgdmFsdWUgdG8gdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgc3ViY2xhc3Mgb2YgdGhlIDxjb2RlPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLkRhdGFiYXNlUGxhdGZvcm0gY2xhc3M8L2NvZGU+LjwvcD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLnRhcmdldC1kYXRhYmFzZSIgdmFsdWU9Ik9yYWNsZSIvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MzMgcjFjMy10MzMiPgotPHA+QXV0bzwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQzMyIgaGVhZGVycz0icjFjMS10MzMiPgotPHA+VGFyZ2V0IFNlcnZlcjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDMzIHIxYzItdDMzIj4KLTxwPlNlbGVjdCB0aGUgdGFyZ2V0IHNlcnZlciBmb3IgeW91ciBKUEEgYXBwbGljYXRpb24uPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsudGFyZ2V0LXNlcnZlciIgdmFsdWU9Ik9DNEpfMTBfMV8zIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQzMyByMWMzLXQzMyI+Ci08cD5Ob25lPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD5FdmVudCBMaXN0ZW5lcjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDMzIHIxYzItdDMzIj4KLTxwPlNwZWNpZnkgYSBkZXNjcmlwdG9yIGV2ZW50IGxpc3RlbmVyIHRvIGJlIGFkZGVkIGR1cmluZyBib290c3RyYXBwaW5nLjwvcD4KLTxwPlZhbGlkIHZhbHVlczogcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSA8Y29kZT5lY2xpcHNlbGluay5zZXNzaW9ucy5TZXNzaW9uRXZlbnRMaXN0ZW5lcjwvY29kZT4gaW50ZXJmYWNlLjwvcD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLnNlc3Npb24tZXZlbnQtbGlzdGVuZXIiIHZhbHVlPSJteXBhY2thZ2UuTXlDbGFzcy5jbGFzcyIvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MzMgcjFjMy10MzMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQzMyIgaGVhZGVycz0icjFjMS10MzMiPgotPHA+SW5jbHVkZSBEZXNjcmlwdG9yIFF1ZXJpZXM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQzMyByMWMyLXQzMyI+Ci08cD5FbmFibGUgb3IgZGlzYWJsZSB0aGUgZGVmYXVsdCBjb3B5aW5nIG9mIGFsbCBuYW1lZCBxdWVyaWVzIGZyb20gdGhlIGRlc2NyaXB0b3JzIHRvIHRoZSBzZXNzaW9uLiBUaGVzZSBxdWVyaWVzIGluY2x1ZGUgdGhlIG9uZXMgZGVmaW5lZCB1c2luZyBFY2xpcHNlTGluayBBUEksIGRlc2NyaXB0b3IgYW1lbmRtZW50IG1ldGhvZHMsIGFuZCBzbyBvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQzMyByMWMzLXQzMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD5NaXNjZWxsYW5lb3VzIE9wdGlvbnM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQzMyByMWMyLXQzMyI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MzMgcjFjMy10MzMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOWMxLXQzMyIgaGVhZGVycz0icjFjMS10MzMiPgotPHA+Jm5ic3A7Jm5ic3A7VGVtcG9yYWwgbXV0YWJsZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDMzIHIxYzItdDMzIj4KLTxwPlNwZWNpZnkgaWYgYWxsIDxjb2RlPkRhdGU8L2NvZGU+IGFuZCA8Y29kZT5DYWxlbmRhcjwvY29kZT4gcGVyc2lzdGVudCBmaWVsZHMgc2hvdWxkIGJlIGhhbmRsZWQgYXMgbXV0YWJsZSBvYmplY3RzLjwvcD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLnRlbXBvcmFsLm11dGFibGUiIHZhbHVlPSJ0cnVlIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQzMyByMWMzLXQzMyI+Ci08cD5GYWxzZTwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJlYzQwNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlNjaGVtYSBHZW5lcmF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlNjaGVtYSBHZW5lcmF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBQ0NGQ0IiIG5hbWU9IkNJQUNDRkNCIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TY2hlbWEgR2VuZXJhdGlvbjwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBTY2hlbWEgR2VuZXJhdGlvbiBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoaXMgcGFnZSBpcyBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyaWM8L3NwYW4+IHBsYXRmb3JtLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMjcxIiBuYW1lPSJzdGhyZWYyNzEiPjwvYT48YSBpZD0ic3RocmVmMjcyIiBuYW1lPSJzdGhyZWYyNzIiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPiZuYnNwOzwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwgRWRpdG9yJnJzcXVvO3MgU2NoZW1hIEdlbmVyYXRpb24gcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDM1Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MzUiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQzNSI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MzUiIGhlYWRlcnM9InIxYzEtdDM1Ij4KLTxwPkRETCBHZW5lcmF0aW9uIFR5cGU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzNSByMWMyLXQzNSI+Ci08cD5TZWxlY3QgdGhlIHR5cGUgb2YgRERMIGdlbmVyYXRpb246PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk5vbmU8L3NwYW4+IC0tIERvIG5vdCBnZW5lcmF0ZSBEREw7IG5vIHNjaGVtYSBpcyBnZW5lcmF0ZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5DcmVhdGUgVGFibGVzPC9zcGFuPiAtLSBDcmVhdGUgRERMIGZvciBub24tZXhpc3RlbnQgdGFibGVzOyBsZWF2ZSBleGlzdGluZyB0YWJsZXMgdW5jaGFuZ2VkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RHJvcCBhbmQgQ3JlYXRlIFRhYmxlczwvc3Bhbj4gLS0gQ3JlYXRlIERETCBmb3IgYWxsIHRhYmxlczsgZHJvcCBhbGwgZXhpc3RpbmcgdGFibGVzLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzUgcjFjMy10MzUiPgotPHA+Tm9uZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQzNSIgaGVhZGVycz0icjFjMS10MzUiPgotPHA+T3V0cHV0IE1vZGU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzNSByMWMyLXQzNSI+Ci08cD5TZWxlY3QgdGhlIERETCBnZW5lcmF0aW9uIHRhcmdldDo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+Qm90aDwvc3Bhbj4gLS0gR2VuZXJhdGUgU1FMIGZpbGVzIGFuZCBleGVjdXRlIHRoZW0gb24gdGhlIGRhdGFiYXNlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RGF0YWJhc2U8L3NwYW4+IC0tIEV4ZWN1dGUgU1FMIG9uIHRoZSBkYXRhYmFzZSBvbmx5IChkbyBub3QgZ2VuZXJhdGUgU1FMIGZpbGVzKS48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlNRTCBTY3JpcHQ8L3NwYW4+IC0tIEdlbmVyYXRlIFNRTCBmaWxlcyBvbmx5IChkbyBub3QgZXhlY3V0ZSB0aGVtIG9uIHRoZSBkYXRhYmFzZSkuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzNSByMWMzLXQzNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDM1IiBoZWFkZXJzPSJyMWMxLXQzNSI+Ci08cD5EREwgR2VuZXJhdGlvbiBMb2NhdGlvbjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDM1IHIxYzItdDM1Ij4KLTxwPlNwZWNpZnkgd2hlcmUgRWNsaXBzZUxpbmsgd3JpdGVzIERETCBvdXRwdXQuIFNwZWNpZnkgYSBmaWxlIHNwZWNpZmljYXRpb24gdG8gYSBkaXJlY3RvcnkgaW4gd2hpY2ggeW91IGhhdmUgd3JpdGUgYWNjZXNzLiBUaGUgZmlsZSBzcGVjaWZpY2F0aW9uIG1heSBiZSByZWxhdGl2ZSB0byB5b3VyIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgb3IgYWJzb2x1dGUuIElmIGl0IGRvZXMgbm90IGVuZCBpbiBhIGZpbGUgc2VwYXJhdG9yLCB0aGVuIEVjbGlwc2VMaW5rIGFwcGVuZHMgb25lIHRoYXQgaXMgdmFsaWQgZm9yIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQzNSByMWMzLXQzNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDM1IiBoZWFkZXJzPSJyMWMxLXQzNSI+Ci08cD5DcmVhdGUgRERMIEZpbGUgTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDM1IHIxYzItdDM1Ij4KLTxwPlNwZWNpZnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgRERMIGZpbGUgdGhhdCBFY2xpcHNlTGluayBnZW5lcmF0ZXMgdGhhdCBjb250YWlucyBTUUwgc3RhdGVtZW50cyBmb3IgY3JlYXRpbmcgdGFibGVzIGZvciBKUEEgZW50aXRpZXMuIFNwZWNpZnkgYSBmaWxlIG5hbWUgdmFsaWQgZm9yIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQzNSByMWMzLXQzNSI+Ci08cD5jcmVhdGVEREwuamRiYzwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQzNSIgaGVhZGVycz0icjFjMS10MzUiPgotPHA+RHJvcCBEREwgRmlsZSBOYW1lPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MzUgcjFjMi10MzUiPgotPHA+U3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSBEREwgZmlsZSB0aGF0IEVjbGlwc2VMaW5rIGdlbmVyYXRlcyB0aGF0IGNvbnRhaW5zIFNRTCBzdGF0ZW1lbnRzIGZvciBkcm9wcGluZyB0YWJsZXMgZm9yIEpQQSBlbnRpdGllcy48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQzNSByMWMzLXQzNSI+Ci08cD5kcm9wRERMLmpkYmM8L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJ0Ymxmb3JtYWwiIC0tPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MzBmMDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlByb3BlcnRpZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUHJvcGVydGllcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUhKREZGIiBuYW1lPSJDSUFISkRGRiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+UHJvcGVydGllczwvaDE+Ci08cD5UaGlzIHBhZ2UgZW5hYmxlcyB5b3UgdG8gYWRkIG9yIHJlbW92ZSB0aGUgdmVuZG9yLXNwZWNpZmljIDxjb2RlPiZsdDtwcm9wZXJ0aWVzJmd0OzwvY29kZT4gZWxlbWVudHMgb2YgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPi48L3A+Ci08cD5UbyBhZGQgYSBwcm9wZXJ0eSwgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gdGhlbiBlbnRlciB0aGUgcHJvcGVydHkgPHNwYW4gY2xhc3M9ImJvbGQiPk5hbWU8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0iYm9sZCI+VmFsdWU8L3NwYW4+LjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3Yjk4NGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlNvdXJjZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJTb3VyY2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFIQ0pBSCIgbmFtZT0iQ0lBSENKQUgiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlNvdXJjZTwvaDE+Ci08cD5Vc2luZyB0aGlzIHBhZ2UsIHlvdSBjYW4gbWFudWFsbHkgZWRpdCB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPiJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPC9hPiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPk1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjYuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzViYTgwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5QcmVmZXJlbmNlczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJQcmVmZXJlbmNlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0RFSUVFIiBuYW1lPSJDQUNERUlFRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+UHJlZmVyZW5jZXM8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmcgcHJlZmVyZW5jZSBwYWdlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNCQUJKSEJDSSI+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNy5odG0jQ0FDRkJBRUgiPlByb2plY3QgUHJvcGVydGllcyBwYWdlICZuZGFzaDsgVmFsaWRhdGlvbiBQcmVmZXJlbmNlczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI3Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhkNDViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBWYWxpZGF0aW9uIFByZWZlcmVuY2VzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlICZuZGFzaDsgVmFsaWRhdGlvbiBQcmVmZXJlbmNlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0ZCQUVIIiBuYW1lPSJDQUNGQkFFSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBWYWxpZGF0aW9uIFByZWZlcmVuY2VzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyNzUiIG5hbWU9InN0aHJlZjI3NSI+PC9hPjxhIGlkPSJzdGhyZWYyNzYiIG5hbWU9InN0aHJlZjI3NiI+PC9hPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkphdmEgUGVyc2lzdGVuY2U8L3NwYW4+IG9wdGlvbnMgb24gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9wZXJ0aWVzPC9zcGFuPiBwYWdlIHRvIHNlbGVjdCB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2Ugd2l0aCB0aGUgcHJvamVjdC48L3A+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzIHBhZ2U8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyBwYWdlLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMzIlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDM3Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MzciPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzNyIgaGVhZGVycz0icjFjMS10MzciPjxhIGlkPSJzdGhyZWYyNzciIG5hbWU9InN0aHJlZjI3NyI+PC9hPjxhIGlkPSJzdGhyZWYyNzgiIG5hbWU9InN0aHJlZjI3OCI+PC9hPjxhIGlkPSJzdGhyZWYyNzkiIG5hbWU9InN0aHJlZjI3OSI+PC9hPjxhIGlkPSJzdGhyZWYyODAiIG5hbWU9InN0aHJlZjI4MCI+PC9hPlBsYXRmb3JtPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzcgcjFjMi10MzciPlNlbGVjdCB0aGUgdmVuZG9yLXNwZWNpZmljIHBsYXRmb3JtLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQzNyIgaGVhZGVycz0icjFjMS10MzciPkxpYnJhcnk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzNyByMWMyLXQzNyI+U2VsZWN0IGEgc3BlY2lmaWMgSlBBIGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5NYW5hZ2UgbGlicmFyaWVzPC9zcGFuPiB0byBjcmVhdGUgb3IgdXBkYXRlIGEgdXNlciBsaWJyYXJ5LjwvcD4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Eb3dubG9hZCBsaWJyYXJpZXM8L3NwYW4+IHRvIGRvd25sb2FkIGEgc3BlY2lmaWMgbGlicmFyeSBjb25maWd1cmF0aW9uLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQzNyIgaGVhZGVycz0icjFjMS10MzciPiZuYnNwOyZuYnNwO1R5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQzNyByMWMyLXQzNyI+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5Vc2VyIExpYnJhcnk8L3NwYW4+IHRvIHNlbGVjdCBmcm9tIHRoZSBhdmFpbGFibGUgdXNlci1kZWZpbmVkIG9yIGRvd25sb2FkZWQgbGlicmFyaWVzLgotPHA+SWYgeW91IHNlbGVjdCBEaXNhYmxlLCB5b3UgbXVzdCBtYW51YWxseSBpbmNsdWRlIHRoZSBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSBvbiB0aGUgcHJvamVjdCBjbGFzc3BhdGguPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+Jm5ic3A7Jm5ic3A7SW5jbHVkZSZuYnNwO2xpYnJhcmllcyZuYnNwO3dpdGgmbmJzcDt0aGlzJm5ic3A7YXBwbGljYXRpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQzNyByMWMyLXQzNyI+U3BlY2lmeSBpZiB0aGUgc2VsZWN0ZWQgbGlicmFyaWVzIGFyZSBpbmNsdWRlZCB3aGVuIGRlcGxveWluZyB0aGUgYXBwbGljYXRpb24uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+PGEgaWQ9InN0aHJlZjI4MSIgbmFtZT0ic3RocmVmMjgxIj48L2E+PGEgaWQ9InN0aHJlZjI4MiIgbmFtZT0ic3RocmVmMjgyIj48L2E+PGEgaWQ9InN0aHJlZjI4MyIgbmFtZT0ic3RocmVmMjgzIj48L2E+Q29ubmVjdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDM3IHIxYzItdDM3Ij5UaGUgZGF0YWJhc2UgY29ubmVjdGlvbiB1c2VkIHRvIG1hcCB0aGUgcGVyc2lzdGVudCBlbnRpdGllcy4KLTx1bD4KLTxsaT4KLTxwPlRvIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uLCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIENvbm5lY3Rpb25zPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+VG8gcmVjb25uZWN0IHRvIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5SZWNvbm5lY3Q8L3NwYW4+LjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+Jm5ic3A7Jm5ic3A7T3ZlcnJpZGUmbmJzcDtkZWZhdWx0Jm5ic3A7Y2F0YWxvZyZuYnNwO2Zyb20mbmJzcDtjb25uZWN0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MzcgcjFjMi10MzciPlNlbGVjdCBhIGNhdGFsb2cgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBvbmUgZGVyaXZlZCBmcm9tIHRoZSBjb25uZWN0aW9uIGluZm9ybWF0aW9uLiBVc2UgdGhpcyBvcHRpb24gaWYgdGhlIGRlZmF1bHQgY2F0YWxvZyBpcyBpbmNvcnJlY3Qgb3IgY2Fubm90IGJlIHVzZWQuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+Jm5ic3A7Jm5ic3A7T3ZlcnJpZGUmbmJzcDtkZWZhdWx0Jm5ic3A7c2NoZW1hJm5ic3A7ZnJvbSZuYnNwO2Nvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQzNyByMWMyLXQzNyI+U2VsZWN0IGEgc2NoZW1hIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgb25lIGRlcml2ZWQgZnJvbSB0aGUgY29ubmVjdGlvbiBpbmZvcm1hdGlvbi4gVXNlIHRoaXMgb3B0aW9uIGlmIHRoZSBkZWZhdWx0IHNjaGVtYSBpcyBpbmNvcnJlY3Qgb3IgY2Fubm90IGJlIHVzZWQuIEZvciBleGFtcGxlLCB1c2UgdGhpcyBvcHRpb24gd2hlbiB0aGUgZGVwbG95bWVudCBsb2dpbiBkaWZmZXJzIGZyb20gdGhlIGRlc2lnbi10aW1lIGxvZ2luLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOWMxLXQzNyIgaGVhZGVycz0icjFjMS10MzciPlBlcnNpc3RlbnQgQ2xhc3MgTWFuYWdlbWVudDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDM3IHIxYzItdDM3Ij5TcGVjaWZ5IGlmIERhbGkgd2lsbCA8c3BhbiBjbGFzcz0iYm9sZCI+ZGlzY292ZXIgYW5ub3RhdGVkIGNsYXNzZXMgYXV0b21hdGljYWxseTwvc3Bhbj4sIG9yIGlmIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+YW5ub3RhdGVkIGNsYXNzZXMgbXVzdCBiZSBsaXN0ZWQgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbDwvc3Bhbj4gZmlsZS4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Ob3RlPC9zcGFuPjogVG8gaW5zdXJlIGFwcGxpY2F0aW9uIHBvcnRhYmlsaXR5LCB5b3Ugc2hvdWxkIGV4cGxpY2l0bHkgbGlzdCB0aGUgbWFuYWdlZCBwZXJzaXN0ZW5jZSBjbGFzc2VzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTBjMS10MzciIGhlYWRlcnM9InIxYzEtdDM3Ij48YSBpZD0ic3RocmVmMjg0IiBuYW1lPSJzdGhyZWYyODQiPjwvYT48YSBpZD0ic3RocmVmMjg1IiBuYW1lPSJzdGhyZWYyODUiPjwvYT5DYW5vbmljYWwgTWV0YW1vZGVsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDM3IHIxYzItdDM3Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyOC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI4Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM3MWIyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI4Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RGlhbG9nczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJEaWFsb2dzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDR0VKREEiIG5hbWU9IkNBQ0dFSkRBIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5EaWFsb2dzPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nIHByZWZlcmVuY2UgcGFnZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI5Lmh0bSNDQUNDR0VIQyI+RWRpdCBKb2luIENvbHVtbnMgRGlhbG9nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfc2VsZWN0X2Nhc2NhZGVfZGlhbG9nLmh0bSNDSUFGREdJSiI+U2VsZWN0IENhc2NhZGUgZGlhbG9nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfZWNsaXBzZWxpbmtfbWFwcGluZ19maWxlLmh0bSNDSUFFREVKRiI+TmV3IEVjbGlwc2VMaW5rIE1hcHBpbmcgRmlsZSBkaWFsb2c8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyOS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI5Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY2NjY3OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI5Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RWRpdCBKb2luIENvbHVtbnMgRGlhbG9nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkVkaXQgSm9pbiBDb2x1bW5zIERpYWxvZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0NHRUhDIiBuYW1lPSJDQUNDR0VIQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RWRpdCBKb2luIENvbHVtbnMgRGlhbG9nPC9oMT4KLTxwPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpvaW4gQ29sdW1uczwvc3Bhbj4gZGlhbG9nIHRvIGNyZWF0ZSBvciBtb2RpZnkgdGhlIGpvaW4gdGFibGVzIGFuZCBjb2x1bW5zIGluIHJlbGF0aW9uc2hpcCBtYXBwaW5ncy48L3A+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpvaW4gQ29sdW1uczwvc3Bhbj4gZGlhbG9nLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSm9pbiBDb2x1bW5zIGRpYWxvZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBKb2luIENvbHVtbnMgZGlhbG9nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIzMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MzgiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQzOCI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDM4IiBoZWFkZXJzPSJyMWMxLXQzOCI+TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDM4IHIxYzItdDM4Ij5OYW1lIG9mIHRoZSBqb2ludCB0YWJsZSBjb2x1bW4gdGhhdCBjb250YWlucyB0aGUgZm9yZWlnbiBrZXkgY29sdW1uLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQzOCIgaGVhZGVycz0icjFjMS10MzgiPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzOCByMWMyLXQzOCI+TmFtZSBvZiB0aGUgZGF0YWJhc2UgY29sdW1uIHRoYXQgY29udGFpbnMgdGhlIGZvcmVpZ24ga2V5IHJlZmVyZW5jZSBmb3IgdGhlIGVudGl0eSByZWxhdGlvbnNoaXAuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAxMS5odG0jQ0FDQkFFQkMiPkpvaW4gVGFibGUgSW5mb3JtYXRpb248L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZlcmVuY2UwMTIuaHRtI0NBQ0ZDRUpDIj5Kb2luIENvbHVtbnMgSW5mb3JtYXRpb248L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMwLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAyNzk3OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMwLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+SWNvbnMgYW5kIGJ1dHRvbnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSWNvbnMgYW5kIGJ1dHRvbnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNESENJQSIgbmFtZT0iQ0FDREhDSUEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkljb25zIGFuZCBidXR0b25zPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiBlYWNoIG9mIHRoZSBpY29ucyBhbmQgYnV0dG9ucyB1c2VkIGluIHRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbC48L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMzEuaHRtI0NBQ0dFQUNHIj5JY29uczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDMyLmh0bSNDQUNESkNFSSI+QnV0dG9uczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMxLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTc2MGVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+SWNvbnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSWNvbnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNHRUFDRyIgbmFtZT0iQ0FDR0VBQ0ciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkljb25zPC9oMT4KLTxwPlRoZSBmb2xsb3dpbmcgaWNvbnMgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgRGFsaSBPUiBNYXBwaW5nIFRvb2wuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGljb25zIHVzZWQgaW4gdGhlIERhbGkgcGx1Zy1pbi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBpY29ucyB1c2VkIGluIHRoZSBEYWxpIHBsdWctaW4uIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjIzJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ0MSI+SWNvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10NDEiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fbWFwcGVkZW50aXR5LnBuZyIgYWx0PSIiIHRpdGxlPSIiIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NDEgcjFjMi10NDEiPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fZW1iZWRkYWJsZWVudGl0eW1hcHBpbmcucG5nIiBhbHQ9IkVtYmVkZGFibGUgZW50aXR5IGljb24iIHRpdGxlPSJFbWJlZGRhYmxlIGVudGl0eSBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDQxIHIxYzItdDQxIj48YSBocmVmPSJ0YXNrczAwNy5odG0jQkFCRkVJQ0UiPkVtYmVkZGFibGU8L2E+IGVudGl0eTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fbWFwcGVkc3VwZXJjbGFzcy5wbmciIGFsdD0iTWFwcGVkIHN1cGVyY2xhc3MgaWNvbiIgdGl0bGU9Ik1hcHBlZCBzdXBlcmNsYXNzIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NDEgcjFjMi10NDEiPjxhIGhyZWY9InRhc2tzMDA4Lmh0bSNCQUJEQUdDSSI+TWFwcGVkIHN1cGVyY2xhc3M8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9iYXNpY21hcHBpbmdzLnBuZyIgYWx0PSJCYXNpYyBtYXBwaW5nIGljb24iIHRpdGxlPSJCYXNpYyBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NDEgcjFjMi10NDEiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj48aW1nIHNyYz0iaW1nL2ljb25fYmFzaWNtYXBtYXBwaW5ncy5wbmciIGFsdD0iQmFzaWMgbWFwcGluZyBpY29uIiB0aXRsZT0iQmFzaWMgbWFwcGluZyBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDQxIHIxYzItdDQxIj5CYXNpYyBjb2xsZWN0aW9uIG1hcHBpbmc8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj48aW1nIHNyYz0iaW1nL2ljb25fYmFzaWNtYXBwaW5nLnBuZyIgYWx0PSJCYXNpYyBtYXBwaW5nIGljb24iIHRpdGxlPSJCYXNpYyBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10NDEgcjFjMi10NDEiPkJhc2ljIG1hcCBtYXBwaW5nPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9lbWJlZGRlZGlkbWFwcGluZy5wbmciIGFsdD0iRW1iZWRkZWQgbWFwcGluZyBpY29uIiB0aXRsZT0iRW1iZWRkZWQgbWFwcGluZyBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDQxIHIxYzItdDQxIj48YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI5YzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9lbWJlZGRlZG1hcHBpbmcucG5nIiBhbHQ9IkVtYmVkZGVkIElEIG1hcHBpbmcgaWNvbiIgdGl0bGU9IkVtYmVkZGVkIElEIG1hcHBpbmcgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQ0MSByMWMyLXQ0MSI+PGEgaHJlZj0idGFza3MwMTIuaHRtI0NJSERJQUVFIj5FbWJlZGRlZCBJRCBtYXBwaW5nPC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTBjMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX2lkbWFwcGluZy5wbmciIGFsdD0iSUQgbWFwcGluZyBpY29uIiB0aXRsZT0iSUQgbWFwcGluZyBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQ0MSByMWMyLXQ0MSI+PGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTFjMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX21hbnl0b21hbnltYXBwaW5nLnBuZyIgYWx0PSJNYW55LXRvLW1hbnkgbWFwcGluZyBpY29uIiB0aXRsZT0iTWFueS10by1tYW55IG1hcHBpbmcgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10NDEgcjFjMi10NDEiPjxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJFSUVHRCI+TWFueS10by1tYW55IG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMmMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fbWFueXRvb25lbWFwcGluZy5wbmciIGFsdD0iTWFueS10by1vbmUgbWFwcGluZyBpY29uLiIgdGl0bGU9Ik1hbnktdG8tb25lIG1hcHBpbmcgaWNvbi4iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEyYzEtdDQxIHIxYzItdDQxIj48YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxM2MxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fb25ldG9tYW55bWFwcGluZy5wbmciIGFsdD0iT25lLXRvLW1hbnkgbWFwcGluZyBpY29uIiB0aXRsZT0iT25lLXRvLW1hbnkgbWFwcGluZyBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxM2MxLXQ0MSByMWMyLXQ0MSI+PGEgaHJlZj0idGFza3MwMTYuaHRtI0JBQkhHRUJEIj5PbmUtdG8tbWFueSBtYXBwaW5nPC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTRjMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX29uZXRvb25lbWFwcGluZy5wbmciIGFsdD0iT25lLXRvLW9uZSBtYXBwaW5nIGljb24uIiB0aXRsZT0iT25lLXRvLW9uZSBtYXBwaW5nIGljb24uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNGMxLXQ0MSByMWMyLXQ0MSI+PGEgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxNWMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvaWNvbl9iYXNpY21hcG1hcHBpbmdzLnBuZyIgYWx0PSJCYXNpYyBtYXBwaW5nIGljb24iIHRpdGxlPSJCYXNpYyBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE1YzEtdDQxIHIxYzItdDQxIj5UcmFuc2Zvcm1hdGlvbiBtYXBwaW5nczwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTZjMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX3RyYW5zaWVudG1hcHBpbmcucG5nIiBhbHQ9IlRyYW5zaWVudCBtYXBwaW5nIGljb24uIiB0aXRsZT0iVHJhbnNpZW50IG1hcHBpbmcgaWNvbi4iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE2YzEtdDQxIHIxYzItdDQxIj48YSBocmVmPSJ0YXNrczAxOC5odG0jQkFCSEZIRUkiPlRyYW5zaWVudCBtYXBwaW5nPC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTdjMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj48aW1nIHNyYz0iaW1nL2ljb25fYmFzaWNtYXBtYXBwaW5ncy5wbmciIGFsdD0iQmFzaWMgbWFwcGluZyBpY29uIiB0aXRsZT0iQmFzaWMgbWFwcGluZyBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxN2MxLXQ0MSByMWMyLXQ0MSI+VmFyaWFibGUgb25lLXRvLW9uZSBtYXBwaW5nczwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMThjMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX3ZlcnNpb25tYXBwaW5nLnBuZyIgYWx0PSJWZXJzaW9uIG1hcHBpbmcgaWNvbi4iIHRpdGxlPSJWZXJzaW9uIG1hcHBpbmcgaWNvbi4iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE4YzEtdDQxIHIxYzItdDQxIj48YSBocmVmPSJ0YXNrczAxOS5odG0jQkFCSElCSUkiPlZlcnNpb24gbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAzMC5odG0jQ0FDREhDSUEiPkljb25zIGFuZCBidXR0b25zPC9hPjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZGI1NDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkJ1dHRvbnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQnV0dG9ucyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0RKQ0VJIiBuYW1lPSJDQUNESkNFSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+QnV0dG9uczwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIGJ1dHRvbnMgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgRGFsaSBPUiBNYXBwaW5nIFRvb2wuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGJ1dHRvbnMgdXNlZCBpbiB0aGUgRGFsaSBwbHVnLWluLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGJ1dHRvbnMgdXNlZCBpbiB0aGUgRGFsaSBwbHVnLWluLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNyUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10NDIiPkljb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDQyIj5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10NDIiIGhlYWRlcnM9InIxYzEtdDQyIj48aW1nIHNyYz0iaW1nL25ld19qcGFfcGVyc3BlY3RpdmVfYnV0dG9uLnBuZyIgYWx0PSJUaGUgSlBBIFBlcnNwZWN0aXZlIGljb24iIHRpdGxlPSJUaGUgSlBBIFBlcnNwZWN0aXZlIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NDIgcjFjMi10NDIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDMwLmh0bSNDQUNESENJQSI+SWNvbnMgYW5kIGJ1dHRvbnM8L2E+PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE3MDZiOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RGFsaSBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJEYWxpIERldmVsb3BlciBEb2N1bWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQkJESUIiIG5hbWU9IkNBQ0JCRElCIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5EYWxpIERldmVsb3BlciBEb2N1bWVudGF0aW9uPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyODgiIG5hbWU9InN0aHJlZjI4OCI+PC9hPjxhIGlkPSJzdGhyZWYyODkiIG5hbWU9InN0aHJlZjI4OSI+PC9hPjxhIGlkPSJzdGhyZWYyOTAiIG5hbWU9InN0aHJlZjI5MCI+PC9hPkFkZGl0aW9uYWwgRGFsaSBkb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBvbmxpbmUgYXQ6PC9wPgotPHA+PGNvZGU+PGEgaHJlZj0iaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvaW5kZXgucGhwL0RhbGlfRGV2ZWxvcGVyX0RvY3VtZW50YXRpb24iPmh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL2luZGV4LnBocC9EYWxpX0RldmVsb3Blcl9Eb2N1bWVudGF0aW9uPC9hPjwvY29kZT48L3A+Ci08cD5UaGlzIGRldmVsb3BlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVzIGluZm9ybWF0aW9uIGFib3V0OjwvcD4KLTx1bD4KLTxsaT4KLTxwPkRhbGkgYXJjaGl0ZWN0dXJlPC9wPgotPC9saT4KLTxsaT4KLTxwPlBsdWdpbnMgdGhhdCBjb21wcmlzZSB0aGUgRGFsaSBKUEEgRWNsaXBzZSBmZWF0dXJlPC9wPgotPC9saT4KLTxsaT4KLTxwPkV4dGVuc2lvbiBwb2ludHM8L3A+Ci08L2xpPgotPC91bD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRfcGVyc2lzdGVuY2UuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzk4NDJlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQzWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSElDQUkiIG5hbWU9IkJBQkhJQ0FJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPgotPGgxPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY2NyIgbmFtZT0ic3RocmVmNjciPjwvYT48YSBpZD0ic3RocmVmNjgiIG5hbWU9InN0aHJlZjY4Ij48L2E+PGEgaWQ9InN0aHJlZjY5IiBuYW1lPSJzdGhyZWY2OSI+PC9hPllvdSBjYW4gbWFrZSBhIEphdmEgY2xhc3MgaW50byBvbmUgb2YgdGhlIGZvbGxvd2luZyBwZXJzaXN0ZW50IHR5cGVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAwNy5odG0jQkFCRkVJQ0UiPkVtYmVkZGFibGU8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDA4Lmh0bSNCQUJEQUdDSSI+TWFwcGVkIHN1cGVyY2xhc3M8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgdGl0bGU9IlJlbGF0ZWQgdGFza3MiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkaXRvbmFsX3RhYmxlcy5odG0jQ0lIR0JJRUkiPlNwZWNpZnlpbmcgYWRkaXRpb25hbCB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNDSUhDQ0NKRCI+U3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2U8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIj5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMy5odG0jQ0hEQklKQUMiPlRoZSBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMi5odG0jQ0hESEFHSUgiPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT4gPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfYWRkaXRvbmFsX3RhYmxlcy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZDU4NGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfYWRkaXRvbmFsX3RhYmxlcy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlNwZWNpZnlpbmcgYWRkaXRpb25hbCB0YWJsZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iU3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSEdCSUVJIiBuYW1lPSJDSUhHQklFSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvaDE+Ci08cD5BZGQgYSBzZWNvbmRhcnkgdGFibGUgYW5ub3RhdGlvbiB0byBhbiBlbnRpdHkgaWYgaXRzIGRhdGEgaXMgc3BsaXQgYWNyb3NzIG1vcmUgdGhhbiBvbmUgdGFibGUuPC9wPgotPHA+VG8gYWRkIGEgc2Vjb25kYXJ5IHRhYmxlIHRvIHRoZSBlbnRpdHksPC9wPgotPG9sPgotPGxpPgotPHA+U2VsZWN0IHRoZSBlbnRpdHkgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+SW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldywgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPlNlY29uZGFyeSBUYWJsZXM8L3NwYW4+IGluZm9ybWF0aW9uLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjkyIiBuYW1lPSJzdGhyZWY5MiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlNwZWNpZnlpbmcgU2Vjb25kYXJ5IFRhYmxlczwvcD4KLTxpbWcgc3JjPSJpbWcvc2Vjb25kYXJ5X3RhYmxlcy5wbmciIGFsdD0iU2Vjb25kYXJ5IFRhYmxlcyBhcmVhIG9uIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgdGl0bGU9IlNlY29uZGFyeSBUYWJsZXMgYXJlYSBvbiB0aGUgSlBBIERldGFpbHMgdmlldy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPiB0byBhc3NvY2lhdGUgYW4gYWRkaXRpb25hbCB0YWJsZSB3aXRoIHRoZSBlbnRpdHkuIFRoZSBFZGl0IFNlY29uZGFyeSBUYWJsZSBkaWFsb2cgYXBwZWFyczwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5OYW1lPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImJvbGQiPkNhdGFsb2c8L3NwYW4+LCBhbmQgPHNwYW4gY2xhc3M9ImJvbGQiPlNjaGVtYTwvc3Bhbj4gb2YgdGhlIGFkZGl0aW9uYWwgdGFibGUgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGVudGl0eS48L3A+Ci08L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRoZSBlbnRpdHk6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQFNlY29uZGFyeVRhYmxlKG5hbWU9Ik5BTUUiLCBjYXRhbG9nID0gIkNBVEFMT0ciLCBzY2hlbWEgPSAiU0NIRU1BIikKLQotPC9wcmU+Ci08cD5UbyBvdmVycmlkZSB0aGUgZGVmYXVsdCBwcmltYXJ5IGtleTo8L3A+Ci08b2w+Ci08bGk+Ci08cD5FbmFibGUgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5PdmVyd3JpdGUgZGVmYXVsdDwvc3Bhbj4gb3B0aW9uLCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+IHRvIHNwZWNpZnkgYSBuZXcgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4uIFRoZSBDcmVhdGUgTmV3IFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uIGFwcGVhcnMuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPk5hbWU8L3NwYW4+LCA8c3BhbiBjbGFzcz0iYm9sZCI+UmVmZXJlbmNlZCBjb2x1bW4gbmFtZTwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJib2xkIj5UYWJsZTwvc3Bhbj4sIGFuZCA8c3BhbiBjbGFzcz0iYm9sZCI+Q29sdW1uIGRlZmluaXRpb248L3NwYW4+IG9mIHRoZSBwcmltYXJ5IGtleSBmb3IgdGhlIGVudGl0eS48L3A+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0aGUgZW50aXR5OjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBTZWNvbmRhcnlUYWJsZShuYW1lPSJOQU1FIiwgY2F0YWxvZyA9ICJDQVRBTE9HIiwgc2NoZW1hID0gIlNDSEVNQSIsIHBrSm9pbkNvbHVtbnMgPSB7QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9ImlkIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSAiaWQiKSxAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT0iTkFNRSIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gIlJFRkVSRU5DRUQgQ09MVU1OIE5BTUUiLCBjb2x1bW5EZWZpbml0aW9uID0gIkNPTFVNTiBERUZJTklUSU9OIil9KQotCi08L3ByZT48L2xpPgotPC9vbD4KLTxiciAvPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIj5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L2E+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODNmNzg3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNyZWF0aW5nIGEgSlBBIEVudGl0eTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGluZyBhIEpQQSBFbnRpdHkiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJGQkpCRyIgbmFtZT0iQkFCRkJKQkciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPjxhIGlkPSJzdGhyZWY0MCIgbmFtZT0ic3RocmVmNDAiPjwvYT5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2gxPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGNyZWF0ZSBhIEpQQSBlbnRpdHk6PC9wPgotPG9sPgotPGxpPgotPHA+RnJvbSB0aGUgTmF2aWdhdG9yIG9yIFByb2plY3QgRXhwbG9yZXIsIHNlbGVjdCB0aGUgSlBBIHByb2plY3QgYW5kIHRoZW4gPHNwYW4gY2xhc3M9ImJvbGQiPkZpbGUgJmd0OyBOZXcgJmd0OyBPdGhlcjwvc3Bhbj4uIFRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNDEiIG5hbWU9InN0aHJlZjQxIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U2VsZWN0aW5nIHRoZSBDcmVhdGUgYSBKUEEgRW50aXR5IFdpemFyZDwvcD4KLTxpbWcgc3JjPSJpbWcvc2VsZWN0X2Ffd2l6YXJkX2VudGl0eS5wbmciIGFsdD0iVGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cgd2l0aCBFbnRpdHkgc2VsZWN0ZWQuIiB0aXRsZT0iVGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cgd2l0aCBFbnRpdHkgc2VsZWN0ZWQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5KUEEgJmd0OyBFbnRpdHk8L3NwYW4+IGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtI0NJQUZFSUdGIj5FbnRpdHkgQ2xhc3MgcGFnZTwvYT4gYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY0MiIgbmFtZT0ic3RocmVmNDIiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj48YSBpZD0ic3RocmVmNDMiIG5hbWU9InN0aHJlZjQzIj48L2E+VGhlIEVudGl0eSBDbGFzcyBQYWdlPC9wPgotPGltZyBzcmM9ImltZy9jcmVhdGVfanBhX2VudGl0eV93aXphcmQucG5nIiBhbHQ9IlRoZSBFbnRpdHkgQ2xhc3MgcGFnZSBvZiB0aGUgQ3JlYXRlIGEgSlBBIEVudGl0eSB3aXphcmQuIiB0aXRsZT0iVGhlIEVudGl0eSBDbGFzcyBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgRW50aXR5IHdpemFyZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+Q29tcGxldGUgdGhpcyBwYWdlIGFzIGZvbGxvd3M6PC9wPgotPHVsPgotPGxpPgotPHA+U2VsZWN0IHRoZSBKUEEgcHJvamVjdCBpbiB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlByb2plY3Q8L3NwYW4+IGZpZWxkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlNvdXJjZSBGb2xkZXI8L3NwYW4+IGZpZWxkLCBzZWxlY3QsIG9yIGVudGVyLCB0aGUgbG9jYXRpb24gb2YgdGhlIEpQQSBwcm9qZWN0J3MgPGNvZGU+c3JjPC9jb2RlPiBmb2xkZXIuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCwgb3IgZW50ZXIsIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBwYWNrYWdlIGZvciB0aGlzIGVudGl0eSBpbiB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkphdmEgUGFja2FnZTwvc3Bhbj4gZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIHRoZSBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIGluIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+Q2xhc3MgbmFtZTwvc3Bhbj4gZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPklmIG5lZWRlZCwgZW50ZXIsIG9yIHNlbGVjdCBhIHN1cGVyY2xhc3MuPC9wPgotPC9saT4KLTxsaT4KLTxwPklmIG5lZWRlZCwgY29tcGxldGUgdGhlIEluaGVyaXRhbmNlIHNlY3Rpb24gYXMgZm9sbG93cyAodGhlc2UgcHJvcGVydGllcyBhcmUgb3B0aW9uYWwpOjwvcD4KLTx1bD4KLTxsaT4KLTxwPkFjY2VwdCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkVudGl0eTwvc3Bhbj4gb3B0aW9uICh0aGUgZGVmYXVsdCkgdG8gY3JlYXRlIGEgSmF2YSBjbGFzcyB3aXRoIHRoZSA8Y29kZT5ARW50aXR5PC9jb2RlPiBvcHRpb24uPC9wPgotPC9saT4KLTxsaT4KLTxwPkFsdGVybmF0aXZlbHksIHNlbGVjdCA8YSBocmVmPSJ0YXNrczAwOC5odG0jQkFCREFHQ0kiPk1hcHBlZCBzdXBlcmNsYXNzPC9hPiAoaWYgeW91IGRlZmluZWQgYSBzdXBlciBjbGFzcykuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SW5oZXJpdGFuY2U8L3NwYW4+IGFuZCB0aGVuIHNlbGVjdCBvbmUgb2YgdGhlIEpTUiAyMjAgaW5oZXJpdGFuY2UgbWFwcGluZyBzdHJhdGVnaWVzIChTSU5HTEVfVEFCTEUsIFRBQkxFX1BFUl9DTEFTUywgSk9JTkVEKS48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgdG8gZW50aXR5IG1hcHBpbmdzIGluIFhNTDwvc3Bhbj4gdG8gY3JlYXRlIFhNTCBtYXBwaW5ncyBpbiA8Y29kZT5vcm0ueG1sPC9jb2RlPiwgcmF0aGVyIHRoYW4gYW5ub3RhdGlvbnMuPC9wPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4gdG8gcHJvY2VlZCB0byB0aGUgPGEgaHJlZj0icmVmX0VudGl0eVByb3BlcnRpZXNQYWdlLmh0bSNDSUFERUNJQSI+RW50aXR5IFByb3BlcnRpZXMgcGFnZTwvYT4gd2hlcmUgeW91IGRlZmluZSB0aGUgcGVyc2lzdGVudCBmaWVsZHMgZm9yIHRoZSBlbnRpdHkuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNDQiIG5hbWU9InN0aHJlZjQ0Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+PGEgaWQ9InN0aHJlZjQ1IiBuYW1lPSJzdGhyZWY0NSI+PC9hPlRoZSBFbnRpdHkgUHJvcGVydGllcyBQYWdlPC9wPgotPGltZyBzcmM9ImltZy9jcmVhdGVfanBhX2ZpZWxkcy5wbmciIGFsdD0iVGhlIEVudGl0eSBQcm9wZXJ0aWVzIHBhZ2Ugb2YgdGhlIENyZWF0ZSBKUEEgRW50aXR5IHdpemFyZC4iIHRpdGxlPSJUaGUgRW50aXR5IFByb3BlcnRpZXMgcGFnZSBvZiB0aGUgQ3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD5BbHRlcm5hdGl2ZWx5LCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPiB0byBjb21wbGV0ZSB0aGUgZW50aXR5LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Db21wbGV0ZSB0aGUgcGFnZSBhcyBmb2xsb3dzOjwvcD4KLTxvbD4KLTxsaT4KLTxwPklmIG5lZWRlZCwgZW50ZXIgYSBuZXcgbmFtZSBmb3IgdGhlIGVudGl0eS4gRG9pbmcgc28gcmVzdWx0cyBpbiBhZGRpbmcgYSA8Y29kZT5uYW1lPC9jb2RlPiBhdHRyaWJ1dGUgdG8gdGhlIDxjb2RlPkBFbnRpdHk8L2NvZGU+IG5vdGF0aW9uICg8Y29kZT5ARW50aXR5KG5hbWU9IkVudGl0eU5hbWUiKTwvY29kZT4pLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5BY2NlcHQgPHNwYW4gY2xhc3M9ImJvbGQiPlVzZSBkZWZhdWx0PC9zcGFuPiAodGhlIGRlZmF1bHQgc2V0dGluZykgdG8gdXNlIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgbmFtZSBvZiB0aGUgbWFwcGVkIHRhYmxlLiBFbnRlcmluZyBhIGRpZmZlcmVudCBuYW1lIHJlc3VsdHMgaW4gYWRkaW5nIHRoZSA8Y29kZT5AVGFibGU8L2NvZGU+IG5vdGF0aW9uIHdpdGggaXRzIDxjb2RlPm5hbWU8L2NvZGU+IGF0dHJpYnV0ZSBkZWZpbmVkIGFzIHRoZSBuZXcgdGFibGUgKDxjb2RlPkBUYWJsZShuYW1lPSJUYWJsZU5hbWUiKTwvY29kZT4pLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhlIEVudGl0eSBOYW1lLXJlbGF0ZWQgb3B0aW9ucyBhcmUgbm90IGF2YWlsYWJsZSBpZiB5b3Ugc2VsZWN0ZWQgPGEgaHJlZj0idGFza3MwMDguaHRtI0JBQkRBR0NJIj5NYXBwZWQgc3VwZXJjbGFzczwvYT4gb24gdGhlIDxhIGhyZWY9InJlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtI0NJQUZFSUdGIj5FbnRpdHkgQ2xhc3MgcGFnZTwvYT48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08bGk+Ci08cD5BZGQgcGVyc2lzdGVuY2UgZmllbGRzIHRvIHRoZSBlbnRpdHkgYnkgY2xpY2tpbmcgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4uIFRoZSBFbnRpdHkgRmllbGRzIGRpYWxvZyBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjQ2IiBuYW1lPSJzdGhyZWY0NiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlRoZSBFbnRpdHkgRmllbGRzIERpYWxvZzwvcD4KLTxpbWcgc3JjPSJpbWcvanBhX3dpemFyZF9jcmVhdGVfZmllbGRzLnBuZyIgYWx0PSJUaGUgRW50aXR5IEZpZWxkcyBkaWFsb2cuIiB0aXRsZT0iVGhlIEVudGl0eSBGaWVsZHMgZGlhbG9nLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPlNlbGVjdCBhIHBlcnNpc3RlbmNlIHR5cGUgZnJvbSB0aGUgVHlwZSBsaXN0LiBZb3UgY2FuIHJldHJpZXZlIGFkZGl0aW9uYWwgdHlwZXMgdXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5Ccm93c2U8L3NwYW4+IGZ1bmN0aW9uLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbnRlciB0aGUgZmllbGQgbmFtZSBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+T0s8L3NwYW4+LiBSZXBlYXQgdGhpcyBwcm9jZWR1cmUgZm9yIGVhY2ggZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPklmIG5lZWRlZCwgc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5LZXk8L3NwYW4+IHRvIGRlc2lnbmF0ZSB0aGUgZmllbGQgYXMgYSBwcmltYXJ5IGtleS48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IGVpdGhlciB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkZpZWxkLWJhc2VkPC9zcGFuPiBhY2Nlc3MgdHlwZSAodGhlIGRlZmF1bHQpIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5Qcm9wZXJ0eS1iYXNlZDwvc3Bhbj4gYWNjZXNzIHR5cGUuPC9wPgotPC9saT4KLTwvb2w+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbmlzaDwvc3Bhbj4uIEVjbGlwc2UgYWRkcyB0aGUgZW50aXR5IHRvIHlvdXIgcHJvamVjdC48L3A+Ci08L2xpPgotPC9vbD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSNDSUFHR0dERiI+Q3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCI+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlN2UxZWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQxWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lISEVKQ0oiIG5hbWU9IkNJSEhFSkNKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjYiIG5hbWU9InN0aHJlZjI2Ij48L2E+PGEgaWQ9InN0aHJlZjI3IiBuYW1lPSJzdGhyZWYyNyI+PC9hPlVzZSB0aGlzIHByb2NlZHVyZSB0byBjcmVhdGUgYSBuZXcgSlBBIHByb2plY3QuPC9wPgotPG9sPgotPGxpPgotPHA+RnJvbSB0aGUgTmF2aWdhdG9yIG9yIFByb2plY3QgRXhwbG9yZXIsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IFByb2plY3Q8L3NwYW4+LiBUaGUgU2VsZWN0IGEgd2l6YXJkIGRpYWxvZyBhcHBlYXJzLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGVBbHNvIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+VGlwOjwvcD4KLVlvdSBjYW4gYWxzbyBzZWxlY3QgdGhlIEpQQSBwZXJzcGVjdGl2ZSBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbGUgJmd0OyBOZXcgJmd0OyBKUEEgUHJvamVjdDwvc3Bhbj4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMjgiIG5hbWU9InN0aHJlZjI4Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+PGEgaWQ9InN0aHJlZjI5IiBuYW1lPSJzdGhyZWYyOSI+PC9hPlNlbGVjdGluZyB0aGUgQ3JlYXRlIGEgSlBBIFByb2plY3Qgd2l6YXJkPC9wPgotPGltZyBzcmM9ImltZy9zZWxlY3RfYV93aXphcmRfanBhX3Byb2plY3QucG5nIiBhbHQ9IlRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIHdpdGggSlBBIHByb2plY3Qgc2VsZWN0ZWQuIiB0aXRsZT0iVGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cgd2l0aCBKUEEgcHJvamVjdCBzZWxlY3RlZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkpQQSBQcm9qZWN0PC9zcGFuPiBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0Lmh0bSNDQUNCSkFHQyI+TmV3IEpQQSBQcm9qZWN0IHBhZ2U8L2E+IGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMzAiIG5hbWU9InN0aHJlZjMwIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+PGEgaWQ9InN0aHJlZjMxIiBuYW1lPSJzdGhyZWYzMSI+PC9hPlRoZSBKUEEgUHJvamVjdCBQYWdlPC9wPgotPGltZyBzcmM9ImltZy9uZXdfanBhX3Byb2plY3RfdGFzay5wbmciIGFsdD0iVGhlIEpQQSBQcm9qZWN0IHBhZ2Ugb2YgdGhlIENyZWF0ZSBhIEpQQSBQcm9qZWN0IHdpemFyZC4iIHRpdGxlPSJUaGUgSlBBIFByb2plY3QgcGFnZSBvZiB0aGUgQ3JlYXRlIGEgSlBBIFByb2plY3Qgd2l6YXJkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIHRoZSBmaWVsZHMgb24gdGhlIDxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3QuaHRtI0NBQ0JKQUdDIj5OZXcgSlBBIFByb2plY3QgcGFnZTwvYT4gdG8gc3BlY2lmeSB0aGUgcHJvamVjdCBuYW1lIGFuZCBsb2NhdGlvbiwgdGFyZ2V0IHJ1bnRpbWUsIGFuZCBwcmUtZGVmaW5lZCBjb25maWd1cmF0aW9uLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhlIFRhcmdldCBSdW50aW1lIGlzIG5vdCByZXF1aXJlZCBmb3IgSmF2YSBTRSBkZXZlbG9wbWVudC48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSBKYXZhIHNvdXJjZSBwYWdlIGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMzIiIG5hbWU9InN0aHJlZjMyIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIEphdmEgU291cmNlIFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL2phdmFfZWRpdG9yX2FkZHJlc3MucG5nIiBhbHQ9IlRoZSBKUEEgRmFjZXQgcGFnZSBvZiB0aGUgQ3JlYXRlIGEgSlBBIFByb2plY3Qgd2l6YXJkLiIgdGl0bGU9IlRoZSBKUEEgRmFjZXQgcGFnZSBvZiB0aGUgQ3JlYXRlIGEgSlBBIFByb2plY3Qgd2l6YXJkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgRm9sZGVyPC9zcGFuPiB0byBhZGQgZXhpc3RpbmcgSmF2YSBzb3VyY2UgZmlsZXMgdG8gdGhlIHByb2plY3QuPC9wPgotPC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gPGEgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jQ0FDSUZESUYiPkpQQSBGYWNldCBwYWdlPC9hPiBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjMzIiBuYW1lPSJzdGhyZWYzMyI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPjxhIGlkPSJzdGhyZWYzNCIgbmFtZT0ic3RocmVmMzQiPjwvYT5UaGUgSlBBIEZhY2V0IFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL25ld19qcGFfZmFjZXRfdGFzay5wbmciIGFsdD0iVGhlIEpQQSBGYWNldCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiB0aXRsZT0iVGhlIEpQQSBGYWNldCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q29tcGxldGUgdGhlIGZpZWxkcyBvbiB0aGUgPGEgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jQ0FDSUZESUYiPkpQQSBGYWNldCBwYWdlPC9hPiB0byBzcGVjaWZ5IHlvdXIgdmVuZGVyLXNwZWNpZmljIHBsYXRmb3JtLCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSwgYW5kIGRhdGFiYXNlIGNvbm5lY3Rpb24uPC9wPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk1hbmFnZSBsaWJyYXJpZXM8L3NwYW4+IHRvIGNyZWF0ZSBvciB1cGRhdGUgeW91ciBKUEEgdXNlciBsaWJyYXJpZXMuIENsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Eb3dubG9hZCBsaWJyYXJpZXM8L3NwYW4+IHRvIG9idGFpbiBhZGRpdGlvbmFsIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJpZXMuPC9wPgotPHA+SWYgRGFsaSBkZXJpdmVzIHRoZSBpbmNvcnJlY3Qgc2NoZW1hLCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIHRoZSBEZWZhdWx0IFNjaGVtYSBmb3IgQ29ubmVjdGlvbjwvc3Bhbj4uIFVzaW5nIHRoaXMgb3B0aW9uLCB5b3UgY2FuIHNlbGVjdCBhIGRldmVsb3BtZW50IHRpbWUgc2NoZW1hIGZvciBkZWZhdWx0cyBhbmQgdmFsaWRhdGlvbi48L3A+Ci08cD5JZiB5b3UgY2xlYXIgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5DcmVhdGUgb3JtLnhtbDwvc3Bhbj4gb3B0aW9uICh3aGljaCBpcyBzZWxlY3RlZCBieSBkZWZhdWx0KSwgeW91IGNhbiBsYXRlciBhZGQgYSBtYXBwaW5nIGZpbGUgdG8gdGhlIHByb2plY3QgdXNpbmcgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAwMi5odG0jQ0lBSUpDQ0UiPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotSWYgdGhlIHNlcnZlciBydW50aW1lIGRvZXMgbm90IHByb3ZpZGUgYSBKUEEgaW1wbGVtZW50YXRpb24sIHlvdSBtdXN0IGV4cGxpY2l0bHkgc2VsZWN0IGEgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnkuCi08cD5UbyBpbnN1cmUgdGhlIHBvcnRhYmlsaXR5IG9mIHlvdXIgYXBwbGljYXRpb24sIHlvdSBtdXN0IGV4cGxpY2l0bHkgbGlzdCB0aGUgbWFuYWdlZCBwZXJzaXN0ZW5jZSBjbGFzc2VzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBJZiB0aGUgc2VydmVyIHN1cHBvcnRzIEVKQiAzLjAsIHRoZSBwZXJzaXN0ZW50IGNsYXNzZXMgd2lsbCBiZSBkaXNjb3ZlcmVkIGF1dG9tYXRpY2FsbHkuPC9wPgotPHA+RGVwZW5kaW5nIG9uIHlvdXIgSlBBIGltcGxlbWVudGF0aW9uIChmb3IgZXhhbXBsZSwgR2VuZXJpYyBvciBFY2xpcHNlTGluayksIGRpZmZlcmVudCBvcHRpb25zIG1heSBiZSBhdmFpbGFibGUgd2hlbiBjcmVhdGluZyBKUEEgcHJvamVjdHMuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbmlzaDwvc3Bhbj4uIFlvdSBzaG91bGQgbm93IG9wZW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvYT4uPC9wPgotPC9saT4KLTwvb2w+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvYT48YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAwMi5odG0jQ0lBSUpDQ0UiPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgdGl0bGU9IlJlbGF0ZWQgdGFza3MiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tzMDAxLmh0bSNCRUlCQURISCI+Q29udmVydGluZyBhIEphdmEgUHJvamVjdCB0byBhIEpQQSBQcm9qZWN0PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCI+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfZ2VuZXJhdGVfY2xhc3Nlc19mcm9tX3NjaGVtYS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5ZWU4MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhdGluZyBKQVhCIENsYXNzZXMgZnJvbSBhIFNjaGVtYTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDYtMDRUMTk6MzM6M1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIQ0JISkQiIG5hbWU9IkNJSENCSEpEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5HZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxOTciIG5hbWU9InN0aHJlZjE5NyI+PC9hPjxhIGlkPSJzdGhyZWYxOTgiIG5hbWU9InN0aHJlZjE5OCI+PC9hPjxhIGlkPSJzdGhyZWYxOTkiIG5hbWU9InN0aHJlZjE5OSI+PC9hPlVzZSB0aGUgR2VuZXJhdGUgQ2xhc3NlcyBmcm9tIFhTRCBkaWFsb2cgdG8gZ2VuZXJhdGUgSkFYQiBjbGFzc2VzIGZyb20gYW4gWE1MIHNjaGVtYSAoJm5ic3A7LnhzZCkuPGEgaWQ9InN0aHJlZjIwMCIgbmFtZT0ic3RocmVmMjAwIj48L2E+PC9wPgotPG9sPgotPGxpPgotPHA+RnJvbSB0aGUgTmF2aWdhdG9yIG9yIFByb2plY3QgRXhwbG9yZXIsIHJpZ2h0LWNsaWNrIGEgc2NoZW1hICgmbmJzcDsueHNkIGZpbGUpIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyYXRlICZndDsgSkFYQiBDbGFzc2VzPC9zcGFuPi4gVGhlIEdlbmVyYXRlIENsYXNzZXMgZnJvbSBTY2hlbWEgZGlhbG9nIGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMjAxIiBuYW1lPSJzdGhyZWYyMDEiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj48YSBpZD0ic3RocmVmMjAyIiBuYW1lPSJzdGhyZWYyMDIiPjwvYT5Db25maWd1cmUgSkFYQiBDbGFzcyBHZW5lcmF0aW9uIGRpYWxvZzwvcD4KLTxpbWcgc3JjPSJpbWcvZ2VuZXJhdGVfY2xhc3Nlc19mcm9tX3NjaGVtYS5wbmciIGFsdD0iR2VuZXJhdGUgY2xhc3NlcyBmcm9tIHNjaGVtYSBkaWFsb2cuIiB0aXRsZT0iR2VuZXJhdGUgY2xhc3NlcyBmcm9tIHNjaGVtYSBkaWFsb2cuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+RW50ZXIgdGhlIEpBWEIgc2V0dGluZ3MgaW5mb3JtYXRpb24gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5GaW5pc2g8L3NwYW4+LjwvcD4KLTwvbGk+Ci08L29sPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jb25maWd1cmVfamF4Yl9jbGFzc19nZW5lcmF0aW9uX2RpYWxvZy5odG0jQ0FDSEhISkEiPkNvbmZpZ3VyZSBKQVhCIENsYXNzIEdlbmVyYXRpb24gZGlhbG9nPC9hPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2dlbmVyYXRpbmdfc2NoZW1hX2Zyb21fY2xhc3Nlcy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlN2NmMWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhdGluZyBTY2hlbWEgZnJvbSBDbGFzc2VzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNi0wNFQxNjoxODoxMloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmF0aW5nIFNjaGVtYSBmcm9tIENsYXNzZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhIQkpDSiIgbmFtZT0iQ0lISEJKQ0oiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYXRpbmcgU2NoZW1hIGZyb20gQ2xhc3NlczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTg5IiBuYW1lPSJzdGhyZWYxODkiPjwvYT48YSBpZD0ic3RocmVmMTkwIiBuYW1lPSJzdGhyZWYxOTAiPjwvYT48YSBpZD0ic3RocmVmMTkxIiBuYW1lPSJzdGhyZWYxOTEiPjwvYT5Vc2UgdGhlIEdlbmVyYXRlIFNjaGVtYSBmcm9tIEpBWEIgQ2xhc3NlcyB3aXphcmQgY3JlYXRlIGFuIFhNTCBzY2hlbWEgKCZuYnNwOy54c2QpIGZvciBhIHNldCBvZiBKQVhCIG1hcHBlZCBjbGFzc2VzLjxhIGlkPSJzdGhyZWYxOTIiIG5hbWU9InN0aHJlZjE5MiI+PC9hPjwvcD4KLTxvbD4KLTxsaT4KLTxwPkZyb20gdGhlIE5hdmlnYXRvciBvciBQcm9qZWN0IEV4cGxvcmVyLCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbGUgJmd0OyBOZXcgJmd0OyBPdGhlcjwvc3Bhbj4uIFRoZSBTZWxlY3QgYSB3aXphcmQgZGlhbG9nIGFwcGVhcnMuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotWW91IGNhbiBhbHNvIGFjY2VzcyB0aGUgR2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIHdpemFyZCBmcm9tIGEgc3BlY2lmaWMgcHJvamVjdCBvciBwYWNrYWdlLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGVhbHNvIiAtLT48L2Rpdj4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE5MyIgbmFtZT0ic3RocmVmMTkzIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE5NCIgbmFtZT0ic3RocmVmMTk0Ij48L2E+U2VsZWN0aW5nIHRoZSBTY2hlbWEgRnJvbSBKQVhCIENsYXNzZXMgd2l6YXJkPC9wPgotPGltZyBzcmM9ImltZy9zZWxlY3RfamF4Yl9zY2hlbWFfd2l6YXJkLnBuZyIgYWx0PSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIFNjaGVtYSBGcm9tIEpBWEIgQ2xhc3NlcyBzZWxlY3RlZC4iIHRpdGxlPSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIFNjaGVtYSBGcm9tIEpBWEIgQ2xhc3NlcyBzZWxlY3RlZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkpBWEIgJmd0OyBTY2hlbWEgZnJvbSBKQVhCIENsYXNzZXM8L3NwYW4+IGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9zY2hlbWFfZnJvbV9jbGFzc2VzX3BhZ2UuaHRtI0NBQ0hCRUdKIj5HZW5lcmF0ZSBTY2hlbWEgZnJvbSBDbGFzc2VzPC9hPiBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfamF4Yl9zY2hlbWFfd2l6YXJkLmh0bSNDQUNHQURGSCI+R2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIFdpemFyZDwvYT4gYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxOTUiIG5hbWU9InN0aHJlZjE5NSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPjxhIGlkPSJzdGhyZWYxOTYiIG5hbWU9InN0aHJlZjE5NiI+PC9hPlRoZSBHZW5lcmF0ZSBTY2hlbWEgZnJvbSBDbGFzc2VzIFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL2pheGJfc2NobWVhX2dlbmVyYXRpb25fZGlhbG9nLnBuZyIgYWx0PSJUaGUgSlBBIFByb2plY3QgcGFnZSBvZiB0aGUgQ3JlYXRlIGEgSlBBIFByb2plY3Qgd2l6YXJkLiIgdGl0bGU9IlRoZSBKUEEgUHJvamVjdCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+U2VsZWN0IHRoZSBwcm9qZWN0LCBwYWNrYWdlLCBvciBjbGFzc2VzIGZyb20gd2hpY2ggdG8gZ2VuZXJhdGUgdGhlIHNjaGVtYSBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbmlzaDwvc3Bhbj4uPC9wPgotPC9saT4KLTwvb2w+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2pheGJfc2NoZW1hX3dpemFyZC5odG0jQ0FDR0FERkgiPkdlbmVyYXRlIFNjaGVtYSBmcm9tIEpBWEIgQ2xhc3NlcyBXaXphcmQ8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19pbmhlcml0YW5jZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19pbmhlcml0YW5jZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YTRkMDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfaW5oZXJpdGFuY2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+U3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2U8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhDQ0NKRCIgbmFtZT0iQ0lIQ0NDSkQiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY5MyIgbmFtZT0ic3RocmVmOTMiPjwvYT48YSBpZD0ic3RocmVmOTQiIG5hbWU9InN0aHJlZjk0Ij48L2E+QW4gZW50aXR5IG1heSBpbmhlcml0IHByb3BlcnRpZXMgZnJvbSBvdGhlciBlbnRpdGllcy4gWW91IGNhbiBzcGVjaWZ5IGEgc3BlY2lmaWMgc3RyYXRlZ3kgdG8gdXNlIGZvciBpbmhlcml0YW5jZS48L3A+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gc3BlY2lmeSBpbmhlcml0YW5jZSAoPGNvZGU+QEluaGVyaXRhbmNlKTwvY29kZT4gZm9yIGFuIGV4aXN0aW5nIGVudGl0eSAoPGNvZGU+QEVudGl0eTwvY29kZT4pOjwvcD4KLTxvbD4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgZW50aXR5IGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+UHJvamVjdCBFeHBsb3Jlcjwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcsIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5Jbmhlcml0YW5jZTwvc3Bhbj4gaW5mb3JtYXRpb24uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmOTUiIG5hbWU9InN0aHJlZjk1Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U3BlY2lmeWluZyBJbmhlcml0YW5jZTwvcD4KLTxpbWcgc3JjPSJpbWcvaW5oZXJpdGFuY2VfdGFiLnBuZyIgYWx0PSJTZWxlY3RpbmcgdGhlIEluaGVyaXRhbmNlIGFyZWEgb24gdGhlIEpQQSBEZXRhaWxzIHZpZXcuIiB0aXRsZT0iU2VsZWN0aW5nIHRoZSBJbmhlcml0YW5jZSBhcmVhIG9uIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkluIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+U3RyYXRlZ3k8L3NwYW4+IGxpc3QsIHNlbGVjdCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0aGUgaW5oZXJpdGFuY2Ugc3RyYXRlZ2llczo8L3A+Ci08dWw+Ci08bGk+Ci08cD5BIHNpbmdsZSB0YWJsZSAoZGVmYXVsdCk8L3A+Ci08L2xpPgotPGxpPgotPHA+Sm9pbmVkIHRhYmxlPC9wPgotPC9saT4KLTxsaT4KLTxwPk9uZSB0YWJsZSBwZXIgY2xhc3M8L3A+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhlIGZvbGxvd2luZyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgcmVtYWluaW5nIGZpZWxkcyBvbiB0aGUgdGFiLiBTZWUgPGEgaHJlZj0icmVmZXJlbmNlMDA5Lmh0bSNDQUNGSEdIRSI+IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIjwvYT4gZm9yIGFkZGl0aW9uYWwgZGV0YWlscy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBJbmhlcml0YW5jZSB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBJbmhlcml0YW5jZSB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyMyUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxMyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDEzIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTMiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+PGEgaWQ9InN0aHJlZjk2IiBuYW1lPSJzdGhyZWY5NiI+PC9hPjxhIGlkPSJzdGhyZWY5NyIgbmFtZT0ic3RocmVmOTciPjwvYT5EaXNjcmltaW5hdG9yIENvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDEzIHIxYzItdDEzIj5OYW1lIG9mIHRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiB3aGVuIHVzaW5nIGEgPHNwYW4gY2xhc3M9ImJvbGQiPlNpbmdsZTwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9ImJvbGQiPkpvaW5lZDwvc3Bhbj4gaW5oZXJpdGFuY2Ugc3RyYXRlZ3kuCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ARGlzY3JpbWluYXRvckNvbHVtbjwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxMyByMWMzLXQxMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+RGlzY3JpbWluYXRvciBUeXBlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTMgcjFjMi10MTMiPlNldCB0aGUgZGlzY3JpbWluYXRvciB0eXBlIHRvIDxjb2RlPkNoYXI8L2NvZGU+IG9yIDxjb2RlPkludGVnZXI8L2NvZGU+IChpbnN0ZWFkIG9mIGl0cyBkZWZhdWx0OiA8Y29kZT5TdHJpbmc8L2NvZGU+KS4gVGhlIDxzcGFuIGNsYXNzPSJib2xkIj5EaXNjcmltaW5hdG9yIFZhbHVlPC9zcGFuPiBtdXN0IGNvbmZvcm0gdG8gdGhpcyB0eXBlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDEzIHIxYzMtdDEzIj5TdHJpbmc8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj48YSBpZD0ic3RocmVmOTgiIG5hbWU9InN0aHJlZjk4Ij48L2E+PGEgaWQ9InN0aHJlZjk5IiBuYW1lPSJzdGhyZWY5OSI+PC9hPkRpc2NyaW1pbmF0b3IgVmFsdWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMyByMWMyLXQxMyI+U3BlY2lmeSB0aGUgZGlzY3JpbWluYXRvciB2YWx1ZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgYW4gZW50aXR5IGluIHRoaXMgaW5oZXJpdGFuY2UgaGllcmFyY2h5LiBUaGUgdmFsdWUgbXVzdCBjb25mb3JtIHRvIHRoZSBzcGVjaWZpZWQgPHNwYW4gY2xhc3M9ImJvbGQiPkRpc2NyaW1pbmF0b3IgVHlwZTwvc3Bhbj4uCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ARGlzY3JpbWluYXRvclZhbHVlPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDEzIHIxYzMtdDEzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj5PdmVycmlkZSBEZWZhdWx0PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTMgcjFjMi10MTMiPlVzZSB0aGlzIGZpZWxkIHRvIHNwZWNpZnkgY3VzdG9tIHByaW1hcnkga2V5IGpvaW4gY29sdW1ucy4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBQcmltYXJ5S2V5Sm9pbkNsdW1uPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDEzIHIxYzMtdDEzIj48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdGhlIGVudGl0eSBmaWVsZDo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1ASW5oZXJpdGFuY2Uoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtJTkhFUklUQU5DRV9TVFJBVEVHWSZndDs8L3NwYW4+KQotQERpc2NyaW1pbmF0b3JDb2x1bW4obmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0RJU0NSSU1JTkFUT1JfQ09MVU1OJmd0Ozwvc3Bhbj4iLAotICAgIGRpc2NyaW1pbmF0b3JUeXBlPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtESVNDUklNSU5BVE9SX1RZUEUmZ3Q7PC9zcGFuPikKLUBEaXNjcmltaW5hdG9yVmFsdWUodmFsdWUtIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtESVNDUklNSU5BVE9SX1ZBTFVFJmd0Ozwvc3Bhbj4iKQotQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iLCAKLSAgICByZWZlcmVuY2VkQ29sdW1uTmFtZSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7UkVGRVJFTkNFRF9DT0xVTU5fTkFNRSZndDs8L3NwYW4+IikKLQotPC9wcmU+Ci08cD48YSBpZD0ic3RocmVmMTAwIiBuYW1lPSJzdGhyZWYxMDAiPjwvYT48YSBpZD0ic3RocmVmMTAxIiBuYW1lPSJzdGhyZWYxMDEiPjwvYT48YSBpZD0ic3RocmVmMTAyIiBuYW1lPSJzdGhyZWYxMDIiPjwvYT5UaGUgZm9sbG93aW5nIGZpZ3VyZXMgaWxsdXN0cmF0ZXMgdGhlIGRpZmZlcmVudCBpbmhlcml0YW5jZSBzdHJhdGVnaWVzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjEwMyIgbmFtZT0ic3RocmVmMTAzIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U2luZ2xlIFRhYmxlIEluaGVyaXRhbmNlPC9wPgotPGltZyBzcmM9ImltZy9pbmhlcml0YW5jZV9zaW5nbGUucG5nIiBhbHQ9IlRoaXMgZmlndXJlIGlsbHVzdHJhdGVzIGVudGl0eSBpbmhlcml0YW5jZSBpbiBhIHNpbmdsZSB0YWJsZS4iIHRpdGxlPSJUaGlzIGZpZ3VyZSBpbGx1c3RyYXRlcyBlbnRpdHkgaW5oZXJpdGFuY2UgaW4gYSBzaW5nbGUgdGFibGUuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjEwNCIgbmFtZT0ic3RocmVmMTA0Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+PGEgaWQ9InN0aHJlZjEwNSIgbmFtZT0ic3RocmVmMTA1Ij48L2E+PGEgaWQ9InN0aHJlZjEwNiIgbmFtZT0ic3RocmVmMTA2Ij48L2E+Sm9pbmVkIFRhYmxlIEluaGVyaXRhbmNlPC9wPgotPGltZyBzcmM9ImltZy9pbmhlcml0YW5jZV9qb2luLnBuZyIgYWx0PSJUaGlzIGZpZ3VyZSBpbGx1c3RyYXRlcyBhIGpvaW5lZCBzdWJjbGFzcyBpbmhlcml0YW5jZSBzdHJhdGVneS4iIHRpdGxlPSJUaGlzIGZpZ3VyZSBpbGx1c3RyYXRlcyBhIGpvaW5lZCBzdWJjbGFzcyBpbmhlcml0YW5jZSBzdHJhdGVneS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYW5hZ2Vfb3JtLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hbmFnZV9vcm0uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTY4NzM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hbmFnZV9vcm0uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5NYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhER0RDRCIgbmFtZT0iQ0lIREdEQ0QiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPjxhIGlkPSJzdGhyZWY1OCIgbmFtZT0ic3RocmVmNTgiPjwvYT5NYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlPC9oMT4KLTxwPldoZW4gY3JlYXRpbmcgYSBKUEEgcHJvamVjdCwgKHNlZSA8YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPiJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI8L2E+KSB5b3UgY2FuIGFsc28gY3JlYXRlIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlIHRoYXQgZGVmaW5lcyB0aGUgbWFwcGluZyBtZXRhZGF0YSBhbmQgZGVmYXVsdHMuPC9wPgotPHA+PGEgaWQ9InN0aHJlZjU5IiBuYW1lPSJzdGhyZWY1OSI+PC9hPkVjbGlwc2UgY3JlYXRlcyB0aGUgPGNvZGU+TUVUQS1JTkZcb3JtLnhtbDwvY29kZT4gZmlsZSBpbiB5b3VyIHByb2plY3QncyBkaXJlY3Rvcnk6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPyZndDsKLSZsdDtwZXJzaXN0ZW5jZSB2ZXJzaW9uPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7UEVSU0lTVEVOQ0VfVkVSU0lPTiZndDs8L3NwYW4+IgotICAgICAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlIgotICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UKLSAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL3BlcnNpc3RlbmNlXzFfMC54c2QiJmd0OwotICAmbHQ7cGVyc2lzdGVuY2UtdW5pdCBuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7UEVSU0lTVEVOQ0VfVU5JVF9OQU1FJmd0Ozwvc3Bhbj4iJmd0OwotICAgICZsdDtwcm92aWRlcj0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1BFUlNJU1RFTkNFX1BST1ZJREVSJmd0Ozwvc3Bhbj4iIC8mZ3Q7Ci0gICZsdDsvcGVyc2lzdGVuY2UtdW5pdCZndDsKLSZsdDsvcGVyc2lzdGVuY2UmZ3Q7Ci08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX2VjbGlwc2VsaW5rX21hcHBpbmdfZmlsZS5odG0jQ0lBRURFSkYiPk5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUgZGlhbG9nPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza3MwMDUuaHRtI0NJSEJDRENFIj5Xb3JraW5nIHdpdGggb3JtLnhtbCBmaWxlPC9hPjxiciAvPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDMuaHRtI0NIREJJSkFDIj5UaGUgb3JtLnhtbCBmaWxlPC9hPjxiciAvPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmY2MThiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIREFKSUQiIG5hbWU9IkNJSERBSklEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT48YSBpZD0ic3RocmVmNDciIG5hbWU9InN0aHJlZjQ3Ij48L2E+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY0OCIgbmFtZT0ic3RocmVmNDgiPjwvYT5XaGVuIHlvdSBjcmVhdGUgYSBwcm9qZWN0LCBFY2xpcHNlIGNyZWF0ZXMgdGhlIDxjb2RlPk1FVEEtSU5GXHBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZSBpbiB0aGUgcHJvamVjdCdzIGRpcmVjdG9yeS48L3A+Ci08cD5Zb3UgY2FuIGNyZWF0ZSBhIHN0dWIgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIGluIHRoZSBNRVRBLUlORiBkaXJlY3Rvcnkgd2hlbiB5b3UgY3JlYXRlIGEgSlBBIHByb2plY3QgKHNlZSA8YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPiJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI8L2E+KS4gWW91IGNhbiBtYW5hZ2UgdGhpcyBmaWxlIGVpdGhlciB0aHJvdWdoIHRoZSBYTUwgZWRpdG9yIChzZWUgKSBvciB0aHJvdWdoIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLURlcGVuZGluZyBvbiB5b3VyIEpQQSBpbXBsZW1lbnRhdGlvbiAoZm9yIGV4YW1wbGUsIEVjbGlwc2VMaW5rKSwgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHBhZ2VzIG1heSBiZSBhdmFpbGFibGUgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbCBFZGl0b3I6Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMTkuaHRtI0NJQUpBRkVHIj5DdXN0b21pemF0aW9uPC9hPjwvcD4KLTxwPlVzZSB0aGlzIHBhZ2UgdG8gZGVmaW5lIGNoYW5nZS10cmFja2luZyBhbmQgc2Vzc2lvbiBjdXN0b21pemVyLXJlbGF0ZWQgcHJvcGVydGllcy48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDIwLmh0bSNDSUFCRURDSCI+Q2FjaGluZzwvYT48L3A+Ci08cD5Vc2UgdGhpcyBwYWdlIHRvIGRlZmluZSBjYWNoaW5nIHByb3BlcnRpZXMuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMS5odG0jQ0lBQkdISEkiPkxvZ2dpbmc8L2E+PC9wPgotPHA+VXNlIHRoaXMgcGFnZSB0byBkZWZpbmUgbG9nZ2luZyBwcm9wZXJ0aWVzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjIuaHRtI0NJQUZKQ0hFIj5PcHRpb25zPC9hPjwvcD4KLTxwPlVzZSB0aGlzIHBhZ2UgdG8gZGVmaW5lIHNlc3Npb24gYW5kIHRhcmdldCBkYXRhYmFzZSBwcm9wZXJ0aWVzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjMuaHRtI0NJQUNDRkNCIj5TY2hlbWEgR2VuZXJhdGlvbjwvYT48L3A+Ci08cD5Vc2UgdGhpcyBwYWdlIHRvIGRlZmluZSBEREwtcmVsYXRlZCBwcm9wZXJ0aWVzLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+Rm9yIHByb2plY3RzIHVzaW5nIHRoZSBFY2xpcHNlTGluayBKUEEgaW1wbGVtZW50YXRpb24sIHRoZSBDb25uZWN0aW9ucyBwYWdlIGFsc28gaW5jbHVkZXMgSkRCQyBjb25uZWN0aW9uIHBvb2wgcHJvcGVydGllcy48L3A+Ci08cD5JZiB0aGUgcHJvamVjdCB1c2VzIHRoZSBHZW5lcmljIHBsYXRmb3JtLCB0aGVuIG9ubHkgdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9nZW5lcmFsLmh0bSNDSUFDSUZHSiI+R2VuZXJhbDwvYT4sIDxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBRkZKSUUiPkNvbm5lY3Rpb248L2E+LCA8YSBocmVmPSJyZWZlcmVuY2UwMjQuaHRtI0NJQUhKREZGIj5Qcm9wZXJ0aWVzPC9hPiBhbmQgPGEgaHJlZj0icmVmZXJlbmNlMDI1Lmh0bSNDSUFIQ0pBSCI+U291cmNlPC9hPiBwYWdlcyBhcmUgYXZhaWxhYmxlLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPHA+VG8gdXNlIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IEVkaXRvcjo8L3A+Ci08b2w+Ci08bGk+Ci08cD5PcGVuIHRoZSA8Y29kZT5wZXJpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9nZW5lcmFsLmh0bSNDSUFDSUZHSiI+R2VuZXJhbDwvYT4gcGFnZSBvZiB0aGUgZWRpdG9yIGFwcGVhcnMuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyYWw8L3NwYW4+IHBhZ2UgdG8gZGVmaW5lIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGVzIDxjb2RlPiZsdDtwZXJzaXN0ZW50LXVuaXQmZ3Q7PC9jb2RlPi1yZWxhdGVkIGF0dHJpYnV0ZXMgYXMgd2VsbCBhcyB0aGUgPGNvZGU+Jmx0O3Byb3ZpZGVyJmd0OzwvY29kZT4sIGFuZCA8Y29kZT4mbHQ7Y2xhc3MmZ3Q7PC9jb2RlPiBlbGVtZW50cyAoZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGUpLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGVBbHNvIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+VGlwOjwvcD4KLVRoZSBwZXJzaXN0ZW5jZS54bWwgRWRpdG9yJ3MgU291cmNlIHBhZ2UgZW5hYmxlcyB5b3UgdG8gdmlldyBhbmQgZWRpdCB0aGUgcmF3IFhNTCBmaWxlLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGVhbHNvIiAtLT48L2Rpdj4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBlZGl0b3IuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI5JSIgLz4KLTxjb2wgd2lkdGg9IjI5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ4Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10OCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDgiPkVsZW1lbnQgRGVmaW5lZDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10OCIgaGVhZGVycz0icjFjMS10OCI+TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDggcjFjMi10OCI+RW50ZXIgdGhlIG5hbWUgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10OCByMWMzLXQ4Ij48Y29kZT4mbHQ7cGVyc2lzdGVuY2UtdW5pdCBuYW1lID0gIiZsdDtOYW1lJmd0OyImZ3Q7PC9jb2RlPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij48YSBpZD0ic3RocmVmNDkiIG5hbWU9InN0aHJlZjQ5Ij48L2E+UGVyc2lzdGVuY2UgUHJvdmlkZXI8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ4IHIxYzItdDgiPkVudGVyIHRoZSBuYW1lIG9mIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlci48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ4IHIxYzMtdDgiPjxjb2RlPiZsdDtwcm92aWRlciZndDs8L2NvZGU+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPkRlc2NyaXB0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10OCByMWMyLXQ4Ij5FbnRlciBhIGRlc2NyaXB0aW9uIGZvciB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuIFRoaXMgaXMgYW4gb3B0aW9uYWwgcHJvcGVydHkuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10OCByMWMzLXQ4Ij48Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7PC9jb2RlPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij48YSBpZD0ic3RocmVmNTAiIG5hbWU9InN0aHJlZjUwIj48L2E+TWFuYWdlZCBDbGFzc2VzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10OCByMWMyLXQ4Ij5BZGQgb3IgcmVtb3ZlIHRoZSBjbGFzc2VzIG1hbmFnZWQgdGhyb3VnaCB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ4IHIxYzMtdDgiPjxjb2RlPiZsdDtjbGFzcyZndDs8L2NvZGU+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPiZuYnNwOyZuYnNwO0V4Y2x1ZGUmbmJzcDtVbmxpc3RlZCZuYnNwO0NsYXNzZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ4IHIxYzItdDgiPlNlbGVjdCB0byBpbmNsdWRlIGFsbCBhbm5vdGF0ZWQgZW50aXR5IGNsYXNzZXMgaW4gdGhlIHJvb3Qgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10OCByMWMzLXQ4Ij48Y29kZT4mbHQ7ZXhjbHVkZS11bmxpc3RlZC1jbGFzc2VzJmd0OzwvY29kZT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10OCIgaGVhZGVycz0icjFjMS10OCI+WE1MJm5ic3A7TWFwcGluZyZuYnNwO0ZpbGVzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10OCByMWMyLXQ4Ij5BZGQgb3IgcmVtb3ZlIHRoZSBvYmplY3QvcmVsYXRpb25hbCBtYXBwaW5nIFhNTCBmaWxlcyBkZWZpbmUgdGhlIGNsYXNzZXMgbWFuYWdlZCB0aHJvdWdoIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDggcjFjMy10OCI+PGNvZGU+Jmx0O21hcHBpbmctZmlsZSZndDs8L2NvZGU+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPkpBUiZuYnNwO0ZpbGVzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10OCByMWMyLXQ4Ij5BZGQgb3IgcmVtb3ZlIGFkZGl0aW9uYWwgSkFSIGZpbGVzIGFuZCBsaWJyYXJpZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQ4IHIxYzMtdDgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMTguaHRtI0NJQUZGSklFIj5Db25uZWN0aW9uPC9hPiBwYWdlIHRvIGRlZmluZSB0aGUgPGNvZGU+Jmx0O2p0YS1kYXRhLXNvdXJjZSZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7bm9uLWp0YS1kYXRhLXNvdXJjZSZndDs8L2NvZGU+IGVsZW1lbnRzIGFzIGZvbGxvd3M6PC9wPgotPHA+VG8gY29uZmlndXJlIHRoZSBKVEEgKEphdmEgVHJhbnNhY3Rpb24gQVBJKSBzb3VyY2UgdXNlZCBieSB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXI6PC9wPgotPG9sPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5KVEE8L3NwYW4+IGZyb20gdGhlIFRyYW5zYWN0aW9uIFR5cGUgbGlzdC48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgdGhlIGdsb2JhbCBKTkRJIG5hbWUgb2YgdGhlIGRhdGEgc291cmNlLjwvcD4KLTwvbGk+Ci08L29sPgotPHA+VG8gY29uZmlndXJlIGEgbm9uLUpUQSBkYXRhIHNvdXJjZTo8L3A+Ci08b2w+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPlJlc291cmNlIExvY2FsPC9zcGFuPiBmcm9tIHRoZSBUcmFuc2FjdGlvbiBUeXBlIGxpc3QuPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIHRoZSBnbG9iYWwgSk5ESSBuYW1lIG9mIHRoZSBkYXRhIHNvdXJjZS48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RGVmYXVsdCgpPC9zcGFuPiB0byB1c2UgdGhlIGRhdGEgc291cmNlIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08L2xpPgotPC9vbD4KLTxwPjxhIGlkPSJzdGhyZWY1MSIgbmFtZT0ic3RocmVmNTEiPjwvYT5Gb3IgcHJvamVjdHMgdXNpbmcgdGhlIEdlbmVyaWMgcGxhdGZvcm0sIHlvdSBjYW4gYWxzbyBkZWZpbmUgdGhlIEVjbGlwc2VMaW5rIGNvbm5lY3Rpb24gcG9vbCBkcml2ZXIsIGNvbm5lY3Rpb24gcG9vbCBkcml2ZXIsIFVSTCwgdXNlciBuYW1lIGFuZCBwYXNzd29yZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoZSB0YWJsZSBpbiB0aGUgUHJvcGVydGllcyBwYWdlIHRvIHNldCB0aGUgdmVuZG9yLXNwZWNpZmljIDxjb2RlPiZsdDtwcm9wZXJ0aWVzJmd0OzwvY29kZT4gZWxlbWVudC48L3A+Ci08cD5UbyBhZGQgPGNvZGU+Jmx0O3Byb3BlcnR5Jmd0OzwvY29kZT4gZWxlbWVudHM6PC9wPgotPG9sPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIHRoZSA8Y29kZT4mbHQ7bmFtZSZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7dmFsdWUmZ3Q7PC9jb2RlPiBhdHRyaWJ1dGVzIGZvciB0aGUgPGNvZGU+Jmx0O3Byb3BlcnR5Jmd0OzwvY29kZT4gZWxlbWVudCB1c2luZyB0aGUgdGFibGUncyBOYW1lIGFuZCBWYWx1ZSBmaWVsZHMuPC9wPgotPC9saT4KLTwvb2w+Ci08cD5UbyByZW1vdmUgYSA8Y29kZT4mbHQ7cHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50LCBzZWxlY3QgYSBkZWZpbmVkIHByb3BlcnR5IGluIHRoZSB0YWJsZSBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+UmVtb3ZlPC9zcGFuPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLUlmIHRoZSBwcm9qZWN0IHVzZXMgdGhlIEVjbGlwc2VMaW5rIHBsYXRmb3JtLCB0aGUgY29ubmVjdGlvbiBwYWdlIGFsc28gaW5jbHVkZXMgcGFyYW1ldGVycyBmb3IgSkRCQyBjb25uZWN0aW9uIHBvb2xpbmcuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08L2xpPgotPC9vbD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza3MwMDIuaHRtI0NJSEZFQkFJIj5TeW5jaHJvbml6aW5nIGNsYXNzZXM8L2E+PGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMi5odG0jQ0hESEFHSUgiPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT48YnIgLz4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYXBwaW5nLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hcHBpbmcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZThkOGYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hcHBpbmcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5NYXBwaW5nIGFuIGVudGl0eTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0M1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNYXBwaW5nIGFuIGVudGl0eSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkRHQklKIiBuYW1lPSJCQUJER0JJSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj4KLTxoMT5NYXBwaW5nIGFuIGVudGl0eTwvaDE+Ci08cD5EYWxpIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgbWFwcGluZyB0eXBlcyBmb3IgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxMi5odG0jQ0lIRElBRUUiPkVtYmVkZGVkIElEIG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTQuaHRtI0JBQkVJRUdEIj5NYW55LXRvLW1hbnkgbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTUuaHRtI0JBQkhGQUZKIj5NYW55LXRvLW9uZSBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxNi5odG0jQkFCSEdFQkQiPk9uZS10by1tYW55IG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDE3Lmh0bSNCQUJGSEJDSiI+T25lLXRvLW9uZSBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxOC5odG0jQkFCSEZIRUkiPlRyYW5zaWVudCBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxOS5odG0jQkFCSElCSUkiPlZlcnNpb24gbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMjAuaHRtI0NJSEJERUFKIj5FbGVtZW50IENvbGxlY3Rpb24gbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPkFkZGl0aW9uYWwgbWFwcGluZyB0eXBlcyAoc3VjaCBhcyBCYXNpYyBDb2xsZWN0aW9uIG1hcHBpbmdzKSBtYXkgYmUgYXZhaWxhYmxlIHdoZW4gdXNpbmcgRGFsaSB3aXRoIEVjbGlwc2VMaW5rLjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+IDwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBlMjE4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5UYXNrczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDYtMDRUMTk6MzI6NThaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIFRhc2tzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0ic3RocmVmMjUiIG5hbWU9InN0aHJlZjI1Ij48L2E+PC9wPgotPGgxPlRhc2tzPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBkZXRhaWxlZCBzdGVwLWJ5LXN0ZXAgcHJvY2VkdXJlcyBmb3IgYWNjZXNzaW5nIHRoZSBEYWxpIE9SIG1hcHBpbmcgdG9vbCBmdW5jdGlvbmFsaXR5LjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDAxLmh0bSNCRUlCQURISCI+Q29udmVydGluZyBhIEphdmEgUHJvamVjdCB0byBhIEpQQSBQcm9qZWN0PC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNCQUJGQkpCRyI+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPk1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSNDSUhER0RDRCI+TWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jQ0lIQ0NDSkQiPlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMjEuaHRtI0JBQkJBR0ZJIj5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAyMy5odG0jQkFCRkFJQkEiPlZhbGlkYXRpbmcgbWFwcGluZ3MgYW5kIHJlcG9ydGluZyBwcm9ibGVtczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMjYuaHRtI0JBQkRCQ0JJIj5Nb2RpZnlpbmcgcGVyc2lzdGVudCBwcm9qZWN0IHByb3BlcnRpZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSNDSUhIQkpDSiI+R2VuZXJhdGluZyBTY2hlbWEgZnJvbSBDbGFzc2VzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEuaHRtI0NJSENCSEpEIj5HZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTYwNDM0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNvbnZlcnRpbmcgYSBKYXZhIFByb2plY3QgdG8gYSBKUEEgUHJvamVjdDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDb252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3QiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCRUlCQURISCIgbmFtZT0iQkVJQkFESEgiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNvbnZlcnRpbmcgYSBKYXZhIFByb2plY3QgdG8gYSBKUEEgUHJvamVjdDwvaDE+Ci08cD48YSBpZD0ic3RocmVmMzUiIG5hbWU9InN0aHJlZjM1Ij48L2E+PGEgaWQ9InN0aHJlZjM2IiBuYW1lPSJzdGhyZWYzNiI+PC9hPjxhIGlkPSJzdGhyZWYzNyIgbmFtZT0ic3RocmVmMzciPjwvYT5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gY29udmVydCBhbiBleGlzdGluZyBKYXZhIHByb2plY3QgdG8gYSBKUEEgcHJvamVjdC48L3A+Ci08b2w+Ci08bGk+Ci08cD5Gcm9tIHRoZSBOYXZpZ2F0b3Igb3IgUHJvamVjdCBleHBsb3JlciwgcmlnaHQtY2xpY2sgdGhlIEphdmEgcHJvamVjdCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkNvbmZpZ3VyZSAmZ3Q7IENvbnZlcnQgdG8gSlBBIFByb2plY3QuPC9zcGFuPiBUaGUgUHJvamVjdCBGYWNldHMgcGFnZSBvZiB0aGUgTW9kaWZ5IEZhY2V0ZWQgUHJvamVjdCB3aXphcmQgYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYzOCIgbmFtZT0ic3RocmVmMzgiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5Nb2RpZnkgRmFjZXRlZCBQcm9qZWN0IFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL21vZGlmeV9mYWNldGVkX3Byb2plY3QucG5nIiBhbHQ9IiIgdGl0bGU9IiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNoYW5nZSB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkNvbmZpZ3VyYXRpb248L3NwYW4+IHRvIDxzcGFuIGNsYXNzPSJib2xkIj5EZWZhdWx0IEpQQSBDb25maWd1cmF0aW9uPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+IGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMzkiIG5hbWU9InN0aHJlZjM5Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+SlBBIEZhY2V0IFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL25ld19qcGFfZmFjZXRfdGFzay5wbmciIGFsdD0iIiB0aXRsZT0iIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q29tcGxldGUgdGhlIGZpZWxkcyBvbiB0aGUgPGEgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jQ0FDSUZESUYiPkpQQSBGYWNldCBwYWdlPC9hPiB0byBzcGVjaWZ5IHlvdXIgdmVuZGVyLXNwZWNpZmljIHBsYXRmb3JtLCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSwgYW5kIGRhdGFiYXNlIGNvbm5lY3Rpb24uPC9wPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk1hbmFnZSBsaWJyYXJpZXM8L3NwYW4+IHRvIGNyZWF0ZSBvciB1cGRhdGUgeW91ciBKUEEgdXNlciBsaWJyYXJpZXMuIENsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Eb3dubG9hZCBsaWJyYXJpZXM8L3NwYW4+IHRvIG9idGFpbiBhZGRpdGlvbmFsIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJpZXMuPC9wPgotPHA+SWYgRGFsaSBkZXJpdmVzIHRoZSBpbmNvcnJlY3Qgc2NoZW1hLCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIHRoZSBEZWZhdWx0IFNjaGVtYSBmb3IgQ29ubmVjdGlvbjwvc3Bhbj4uIFVzaW5nIHRoaXMgb3B0aW9uLCB5b3UgY2FuIHNlbGVjdCBhIGRldmVsb3BtZW50IHRpbWUgc2NoZW1hIGZvciBkZWZhdWx0cyBhbmQgdmFsaWRhdGlvbi48L3A+Ci08cD5JZiB5b3UgY2xlYXIgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5DcmVhdGUgb3JtLnhtbDwvc3Bhbj4gb3B0aW9uICh3aGljaCBpcyBzZWxlY3RlZCBieSBkZWZhdWx0KSwgeW91IGNhbiBsYXRlciBhZGQgYSBtYXBwaW5nIGZpbGUgdG8gdGhlIHByb2plY3QgdXNpbmcgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAwMi5odG0jQ0lBSUpDQ0UiPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi48L3A+Ci08L2xpPgotPC9vbD4KLTxwPlRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbCBhZGRzIHRoZSBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyaWVzIHRvIHlvdXIgcHJvamVjdCBhbmQgY3JlYXRlcyB0aGUgbmVjZXNzYXJ5IDxjb2RlPm9ybS54bWw8L2NvZGU+IGFuZCA8Y29kZT5wZXJpc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlcy48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvYT48YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAwMi5odG0jQ0lBSUpDQ0UiPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgdGl0bGU9IlJlbGF0ZWQgdGFza3MiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNCQUJDQUhJQyI+VW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDIuaHRtI0NIREhBR0lIIj5UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmOWJiMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5TeW5jaHJvbml6aW5nIGNsYXNzZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iU3luY2hyb25pemluZyBjbGFzc2VzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIRkVCQUkiIG5hbWU9IkNJSEZFQkFJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TeW5jaHJvbml6aW5nIGNsYXNzZXM8L2gxPgotPHA+QXMgeW91IHdvcmsgd2l0aCB0aGUgY2xhc3NlcyBpbiB5b3VyIEphdmEgcHJvamVjdCwgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZSB0byByZWZsZWN0IHRoZSBjaGFuZ2VzLiA8YSBpZD0ic3RocmVmNTIiIG5hbWU9InN0aHJlZjUyIj48L2E+PGEgaWQ9InN0aHJlZjUzIiBuYW1lPSJzdGhyZWY1MyI+PC9hPjxhIGlkPSJzdGhyZWY1NCIgbmFtZT0ic3RocmVmNTQiPjwvYT48L3A+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gc3luY2hyb25pemUgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTo8L3A+Ci08b2w+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+UHJvamVjdCBFeHBsb3Jlcjwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPkpQQSBUb29scyAmZ3Q7IFN5bmNocm9uaXplIENsYXNzIExpc3Q8L3NwYW4+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVXNlIHRoaXMgZnVuY3Rpb24gaWYgeW91IHNlbGVjdGVkIDxzcGFuIGNsYXNzPSJib2xkIj5Bbm5vdGF0ZWQgY2xhc3NlcyBtdXN0IGJlIGxpc3RlZCBpbiB0aGUgcGVyc2lzdGVuY2UueG1sIG9wdGlvbjwvc3Bhbj4gaW4gdGhlIDxhIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI0NBQ0lGRElGIj5KUEEgRmFjZXQgcGFnZTwvYT4uIEluIGdlbmVyYWwsIHlvdSBkbyBub3QgaGF2ZSB0byB1c2UgdGhpcyBmdW5jdGlvbiB3aXRoaW4gdGhlIGNvbnRhaW5lci48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjU1IiBuYW1lPSJzdGhyZWY1NSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlN5bmNocm9uaXppbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBGaWxlPC9wPgotPGltZyBzcmM9ImltZy9zeW5jaG9ybml6ZV9jbGFzc2VzLnBuZyIgYWx0PSJUaGlzIGZpZ3VyZSBzaG93cyB0aGUgSlBBIFRvb2xzICZndDsgU3luY2hyb25pemUgQ2xhc3NlcyBvcHRpb24uIiB0aXRsZT0iVGhpcyBmaWd1cmUgc2hvd3MgdGhlIEpQQSBUb29scyAmZ3Q7IFN5bmNocm9uaXplIENsYXNzZXMgb3B0aW9uLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD5EYWxpIGFkZHMgdGhlIG5lY2Vzc2FyeSA8Y29kZT4mbHQ7Y2xhc3MmZ3Q7PC9jb2RlPiBlbGVtZW50cyB0byB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5QZXJzaXN0ZW5jZSBYTUwgRWRpdG9yPC9zcGFuPiB0byBjb250aW51ZSBlZGl0aW5nIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC9saT4KLTwvb2w+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPk1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCI+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxOGYxNDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+VXBncmFkaW5nIGRvY3VtZW50IHZlcnNpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iVXBncmFkaW5nIGRvY3VtZW50IHZlcnNpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+PGEgaWQ9InN0aHJlZjU2IiBuYW1lPSJzdGhyZWY1NiI+PC9hPgotPGgxPlVwZ3JhZGluZyBkb2N1bWVudCB2ZXJzaW9uPC9oMT4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBtaWdyYXRlIHlvdXIgcHJvamVjdCBmcm9tIEpQQSAxLjAgdG8gSlBBIDIuMC4gWW91IG11c3QgY29tcGxldGUgdGhpcyB1cGdyYWRlIHRvIHVzZSB0aGUgY3VycmVudCBKUEEgMi4wIGZlYXR1cmVzIGluIERhbGkuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNTciIG5hbWU9InN0aHJlZjU3Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VXBncmFkaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgRmlsZTwvcD4KLTxpbWcgc3JjPSJpbWcvdXBncmFkZV9wZXJzaXN0ZW5jZV9qcGFfdmVyc2lvbi5wbmciIGFsdD0iVGhpcyBmaWd1cmUgc2hvd3MgdGhlIEpQQSBUb29scyAmZ3Q7IFN5bmNocm9uaXplIENsYXNzZXMgb3B0aW9uLiIgdGl0bGU9IlRoaXMgZmlndXJlIHNob3dzIHRoZSBKUEEgVG9vbHMgJmd0OyBTeW5jaHJvbml6ZSBDbGFzc2VzIG9wdGlvbi4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDQ0MWFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNyZWF0aW5nIGFuIG9ybS54bWwgZmlsZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGluZyBhbiBvcm0ueG1sIGZpbGUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+PGEgaWQ9InN0aHJlZjYwIiBuYW1lPSJzdGhyZWY2MCI+PC9hPgotPGgxPkNyZWF0aW5nIGFuIG9ybS54bWwgZmlsZTwvaDE+Ci08cD48YSBpZD0ic3RocmVmNjEiIG5hbWU9InN0aHJlZjYxIj48L2E+SWYgeW91IG9wdCBub3QgdG8gY3JlYXRlIGFuIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgd2hlbiB5b3UgY3JlYXRlIGEgSlBBIHByb2plY3QsIHlvdSBjYW4gY3JlYXRlIG9uZSB1c2luZyB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4uPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGNyZWF0ZSBhbiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlOjwvcD4KLTxvbD4KLTxsaT4KLTxwPkZyb20gdGhlIE5hdmlnYXRvciBvciBQcm9qZWN0IEV4cGxvcmVyLCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbGUgJmd0OyBOZXcgJmd0OyBPdGhlcjwvc3Bhbj4uIFRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNjIiIG5hbWU9InN0aHJlZjYyIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIFNlbGVjdCBhIFdpemFyZCBEaWFsb2c8L3A+Ci08aW1nIHNyYz0iaW1nL3NlbGVjdF9hX3dpemFyZF9tYXBwaW5nLnBuZyIgYWx0PSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIE1hcHBpbmcgZmlsZSBzZWxlY3RlZC4iIHRpdGxlPSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIE1hcHBpbmcgZmlsZSBzZWxlY3RlZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcHBpbmcgRmlsZTwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgTWFwcGluZyBGaWxlIHBhZ2UgYXBwZWFycy48L3A+Ci08cD5JZiB5b3UgYXJlIHVzaW5nIEVjbGlwc2VMaW5rLCB5b3UgY2FuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RWNsaXBzZUxpbmsgJmd0OyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGU8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjYzIiBuYW1lPSJzdGhyZWY2MyI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlRoZSBNYXBwaW5nIEZpbGUgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvbWFwcGluZ19maWxlX25ldy5wbmciIGFsdD0iVGhlIE1hcHBpbmcgRmlsZSBwYWdlLiIgdGl0bGU9IlRoZSBNYXBwaW5nIEZpbGUgcGFnZS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5EZWZpbmUgdGhlIHByb3BlcnRpZXMgaW4gdGhlIHBhZ2UgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5GaW5pc2g8L3NwYW4+LiBUaGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSBhcHBlYXJzIGluIHRoZSBzcmMgZGlyZWN0b3J5IG9mIHRoZSBzZWxlY3RlZCBKUEEgcHJvamVjdC4gWW91IGNhbiBtYW5hZ2UgdGhlIG9ybS54bWwgZmlsZSB1c2luZyB0aGUgSlBBIERldGFpbHMgdmlldyBvciB0aHJvdWdoIHRoZSBYTUwgRWRpdG9yLiBTZWUgYWxzbyA8YSBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtI0NBQ0dER0hDIj5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L2E+LjwvcD4KLTwvbGk+Ci08L29sPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA1Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmOTYwODMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+V29ya2luZyB3aXRoIG9ybS54bWwgZmlsZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJXb3JraW5nIHdpdGggb3JtLnhtbCBmaWxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIQkNEQ0UiIG5hbWU9IkNJSEJDRENFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Xb3JraW5nIHdpdGggb3JtLnhtbCBmaWxlPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY2NCIgbmFtZT0ic3RocmVmNjQiPjwvYT48YSBpZD0ic3RocmVmNjUiIG5hbWU9InN0aHJlZjY1Ij48L2E+WW91IGNhbiB3b3JrIHdpdGggdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGJ5IHVzaW5nIHRoZSBKUEEgRGV0YWlscyB2aWV3LjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byB3b3JrIHdpdGggdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGU6PC9wPgotPG9sPgotPGxpPgotPHA+UmlnaHQtY2xpY2sgdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+T3Blbjwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RW50aXR5TWFwcGluZ3M8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhlIEpQQSBEZXRhaWxzIHZpZXcgdG8gY29uZmlndXJlIHRoZSBlbnRpdHkgbWFwcGluZyBhbmQgcGVyc2lzdGVuY2UgdW5pdCBkZWZhdWx0cy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY2NiIgbmFtZT0ic3RocmVmNjYiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5KUEEgRGV0YWlscyB2aWV3IGZvciBFbnRpdHlNYXBwaW5ncyAob3JtLnhtbCk8L3A+Ci08aW1nIHNyYz0iaW1nL2RldGFpbHNfZW50aXR5bWFwcGluZ3MucG5nIiBhbHQ9IkpQQSBEZXRhaWxzIHZpZXcgZm9yIG9ybS54bWwgZmlsZS4iIHRpdGxlPSJKUEEgRGV0YWlscyB2aWV3IGZvciBvcm0ueG1sIGZpbGUuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPC9vbD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0jQ0FDR0RHSEMiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKTwvYT48YnIgLz4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9IiNDSUhCQ0RDRSI+V29ya2luZyB3aXRoIG9ybS54bWwgZmlsZTwvYT48YnIgLz4KLTxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWE1MLmh0bWwiPldvcmtpbmcgd2l0aCBYTUwgRmlsZXM8L2E+PGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMy5odG0jQ0hEQklKQUMiPlRoZSBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYTBkNzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA2Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RW50aXR5PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQzWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkVudGl0eSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkdCSUVFIiBuYW1lPSJCQUJHQklFRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RW50aXR5PC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY3MCIgbmFtZT0ic3RocmVmNzAiPjwvYT48YSBpZD0ic3RocmVmNzEiIG5hbWU9InN0aHJlZjcxIj48L2E+PGEgaWQ9InN0aHJlZjcyIiBuYW1lPSJzdGhyZWY3MiI+PC9hPjxhIGlkPSJzdGhyZWY3MyIgbmFtZT0ic3RocmVmNzMiPjwvYT5BbiA8c3BhbiBjbGFzcz0iYm9sZCI+RW50aXR5PC9zcGFuPiBpcyBhIHBlcnNpc3RlbnQgZG9tYWluIG9iamVjdC48L3A+Ci08cD5BbiBlbnRpdHkgPHNwYW4gY2xhc3M9Iml0YWxpYyI+Y2FuIGJlPC9zcGFuPjo8L3A+Ci08dWw+Ci08bGk+Ci08cD5BYnN0cmFjdCBvciBjb25jcmV0ZSBjbGFzc2VzLiBFbnRpdGllcyBtYXkgYWxzbyBleHRlbmQgbm9uLWVudGl0eSBjbGFzc2VzIGFzIHdlbGwgYXMgZW50aXR5IGNsYXNzZXMsIGFuZCBub24tZW50aXR5IGNsYXNzZXMgbWF5IGV4dGVuZCBlbnRpdHkgY2xhc3Nlcy48L3A+Ci08L2xpPgotPC91bD4KLTxwPkFuIGVudGl0eSA8c3BhbiBjbGFzcz0iaXRhbGljIj5tdXN0IGhhdmU8L3NwYW4+OjwvcD4KLTx1bD4KLTxsaT4KLTxwPkEgbm8tYXJnIGNvbnN0cnVjdG9yIChwdWJsaWMgb3IgcHJvdGVjdGVkKTsgdGhlIGVudGl0eSBjbGFzcyBtYXkgaGF2ZSBvdGhlciBjb25zdHJ1Y3RvcnMgYXMgd2VsbC48L3A+Ci08L2xpPgotPC91bD4KLTxwPjxhIGlkPSJzdGhyZWY3NCIgbmFtZT0ic3RocmVmNzQiPjwvYT48YSBpZD0ic3RocmVmNzUiIG5hbWU9InN0aHJlZjc1Ij48L2E+PGEgaWQ9InN0aHJlZjc2IiBuYW1lPSJzdGhyZWY3NiI+PC9hPkVhY2ggcGVyc2lzdGVudCBlbnRpdHkgbXVzdCBiZSBtYXBwZWQgdG8gYSBkYXRhYmFzZSB0YWJsZSBhbmQgY29udGFpbiBhIHByaW1hcnkga2V5LiBQZXJzaXN0ZW50IGVudGl0aWVzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSA8Y29kZT5ARW50aXR5PC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBhZGQgcGVyc2lzdGVuY2UgdG8gYW4gZXhpc3RpbmcgZW50aXR5OjwvcD4KLTxvbD4KLTxsaT4KLTxwPk9wZW4gdGhlIEphdmEgY2xhc3MgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyLjwvc3Bhbj48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IHRoZSBjbGFzcyBpbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgSlBBIERldGFpbHMgdmlldywgY2xpY2sgdGhlIG1hcHBpbmcgdHlwZSBoeXBlcmxpbmsgdG8gYWNjZXNzIHRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZy4gSW4gdGhlIGZvbGxvd2luZyBmaWd1cmUsIGNsaWNraW5nIDxzcGFuIGNsYXNzPSJpdGFsaWMiPmVudGl0eTwvc3Bhbj4gaW52b2tlcyB0aGUgZGlhbG9nIGZyb20gdGhlIEpQQSBEZXRhaWxzIFZpZXcuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNzciIG5hbWU9InN0aHJlZjc3Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIE1hcHBpbmcgVHlwZSBIeXBlcmxpbms8L3A+Ci08aW1nIHNyYz0iaW1nL21hcHBlZF9lbnRpdHlfdHlwZV9saW5rLnBuZyIgYWx0PSJUaGUgSlBBIERldGFpbHMgdmlldyBmb3IgYW4gZW50aXR5IHNob3dpbmcgdGhlIG1hcHBpbmcgdHlwZSBoeXBlcmxpbmsuIiB0aXRsZT0iVGhlIEpQQSBEZXRhaWxzIHZpZXcgZm9yIGFuIGVudGl0eSBzaG93aW5nIHRoZSBtYXBwaW5nIHR5cGUgaHlwZXJsaW5rLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZWFsc28iPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlQWxzbyBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPlRpcDo8L3A+Ci1Zb3UgY2FuIGFsc28gY2hhbmdlIChvciBhZGQpIHBlcnNpc3RlbmNlIGZvciBhbiBlbnRpdHkgYnkgcmlnaHQtY2xpY2tpbmcgdGhlIGNsYXNzIGluIHRoZSBKUEEgU3RydWN0dXJlIFZpZXcgYW5kIHRoZW4gY2xpY2tpbmcgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IEVudGl0eTwvc3Bhbj4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RW50aXR5PC9zcGFuPiBmcm9tIHRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZyBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+T0s8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjc4IiBuYW1lPSJzdGhyZWY3OCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIERpYWxvZzwvcD4KLTxpbWcgc3JjPSJpbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbnRpdHkucG5nIiBhbHQ9IlRoZSBNYXBwaW5nIFR5cGUgc2VsZWN0aW9uIGRpYWxvZyB3aXRoIEVuaXR5IHNlbGVjdGVkLiIgdGl0bGU9IlRoZSBNYXBwaW5nIFR5cGUgc2VsZWN0aW9uIGRpYWxvZyB3aXRoIEVuaXR5IHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIHRoZSByZW1haW5pbmcgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIHRpdGxlPSJSZWxhdGVkIHRhc2tzIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI0NJSENDQ0pEIj5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0YTE2OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5FbWJlZGRhYmxlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQzWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkVtYmVkZGFibGUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJGRUlDRSIgbmFtZT0iQkFCRkVJQ0UiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkVtYmVkZGFibGU8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjc5IiBuYW1lPSJzdGhyZWY3OSI+PC9hPjxhIGlkPSJzdGhyZWY4MCIgbmFtZT0ic3RocmVmODAiPjwvYT5BbiA8c3BhbiBjbGFzcz0iYm9sZCI+RW1iZWRkZWQ8L3NwYW4+IGNsYXNzIGlzIGEgY2xhc3Mgd2hvc2UgaW5zdGFuY2VzIGFyZSBzdG9yZWQgYXMgcGFydCBvZiBhbiBvd25pbmcgZW50aXR5OyBpdCBzaGFyZXMgdGhlIGlkZW50aXR5IG9mIHRoZSBvd25pbmcgZW50aXR5LiBFYWNoIGZpZWxkIG9mIHRoZSBlbWJlZGRlZCBjbGFzcyBpcyBtYXBwZWQgdG8gdGhlIGRhdGFiYXNlIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3duaW5nIGVudGl0eS48L3A+Ci08cD5UbyBvdmVycmlkZSB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBzdWJjbGFzcywgdXNlIHRoZSA8Y29kZT5AQXR0cmlidXRlT3ZlcnJpZGU8L2NvZGU+IGFubm90YXRpb24gZm9yIHRoYXQgc3BlY2lmaWMgY2xhc3MuPC9wPgotPHA+PGEgaWQ9InN0aHJlZjgxIiBuYW1lPSJzdGhyZWY4MSI+PC9hPjxhIGlkPSJzdGhyZWY4MiIgbmFtZT0ic3RocmVmODIiPjwvYT48YSBpZD0ic3RocmVmODMiIG5hbWU9InN0aHJlZjgzIj48L2E+QW4gZW1iZWRkYWJsZSBlbnRpdHkgaXMgaWRlbnRpZmllZCBieSB0aGUgPGNvZGU+QEVtYmVkZGFibGU8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGFkZCBlbWJlZGRhYmxlIHBlcnNpc3RlbmNlIHRvIGFuIGV4aXN0aW5nIGVudGl0eTo8L3A+Ci08b2w+Ci08bGk+Ci08cD5PcGVuIHRoZSBKYXZhIGNsYXNzIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+UHJvamVjdCBFeHBsb3Jlcjwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgY2xhc3MgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldy48L3A+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgdGhlIG1hcHBpbmcgdHlwZSBoeXBlcmxpbmsgdG8gb3BlbiB0aGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RW1iZWRkYWJsZTwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk9LPC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY4NCIgbmFtZT0ic3RocmVmODQiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5NYXBwaW5nIFR5cGUgU2VsZWN0aW9uIERpYWxvZyAoRW1iZWRkYWJsZSk8L3A+Ci08aW1nIHNyYz0iaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fZW1iZWQucG5nIiBhbHQ9IlRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZyB3aXRoIEVtYmVkZGFibGUgc2VsZWN0ZWQuIiB0aXRsZT0iVGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nIHdpdGggRW1iZWRkYWJsZSBzZWxlY3RlZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5Db21wbGV0ZSB0aGUgcmVtYWluaW5nIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPi48L3A+Ci08L2xpPgotPC9vbD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxkbD4KLTxkZD48YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjwvZGQ+Ci08ZGQ+PGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48L2RkPgotPGRkPjxhIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI0NJSENDQ0pEIj5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvYT48L2RkPgotPC9kbD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwOC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDguaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjUwNTRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwOC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hcHBlZCBzdXBlcmNsYXNzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQzWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hcHBlZCBzdXBlcmNsYXNzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCREFHQ0kiIG5hbWU9IkJBQkRBR0NJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5NYXBwZWQgc3VwZXJjbGFzczwvaDE+Ci08cD48YSBpZD0ic3RocmVmODUiIG5hbWU9InN0aHJlZjg1Ij48L2E+PGEgaWQ9InN0aHJlZjg2IiBuYW1lPSJzdGhyZWY4NiI+PC9hPkFuIGVudGl0eSB0aGF0IGV4dGVuZHMgYSA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwcGVkIFN1cGVyY2xhc3M8L3NwYW4+IGNsYXNzIGluaGVyaXRzIHRoZSBwZXJzaXN0ZW50IHN0YXRlIGFuZCBtYXBwaW5nIGluZm9ybWF0aW9uIGZyb20gYSBzdXBlcmNsYXNzLiBZb3Ugc2hvdWxkIHVzZSBhIG1hcHBlZCBzdXBlcmNsYXNzIHRvIGRlZmluZSBtYXBwaW5nIGluZm9ybWF0aW9uIHRoYXQgaXMgY29tbW9uIHRvIG11bHRpcGxlIGVudGl0eSBjbGFzc2VzLjwvcD4KLTxwPkEgbWFwcGVkIHN1cGVyY2xhc3MgPHNwYW4gY2xhc3M9Iml0YWxpYyI+Y2FuIGJlPC9zcGFuPjo8L3A+Ci08dWw+Ci08bGk+Ci08cD5BYnN0cmFjdCBvciBjb25jcmV0ZSBjbGFzc2VzPC9wPgotPC9saT4KLTwvdWw+Ci08cD5BIG1hcHBlZCBzdXBlcmNsYXNzIDxzcGFuIGNsYXNzPSJpdGFsaWMiPmNhbm5vdCBiZTwvc3Bhbj46PC9wPgotPHVsPgotPGxpPgotPHA+QmUgcXVlcmllZCBvciBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gRW50aXR5LU1hbmFnZXIgb3IgUXVlcnkgb3BlcmF0aW9uczwvcD4KLTwvbGk+Ci08bGk+Ci08cD5CZSB0aGUgdGFyZ2V0IG9mIGEgcGVyc2lzdGVudCByZWxhdGlvbnNoaXA8L3A+Ci08L2xpPgotPC91bD4KLTxwPkEgbWFwcGVkIHN1cGVyY2xhc3MgZG9lcyBub3QgaGF2ZSBhIGRlZmluZWQgZGF0YWJhc2UgdGFibGUuIEluc3RlYWQsIGl0cyBtYXBwaW5nIGluZm9ybWF0aW9uIGlzIGRlcml2ZWQgZnJvbSBpdHMgc3VwZXJjbGFzcy4gVG8gb3ZlcnJpZGUgdGhlIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgc3ViY2xhc3MsIHVzZSB0aGUgPGNvZGU+QEF0dHJpYnV0ZU92ZXJyaWRlPC9jb2RlPiBhbm5vdGF0aW9uIGZvciB0aGF0IHNwZWNpZmljIGNsYXNzLjwvcD4KLTxwPjxhIGlkPSJzdGhyZWY4NyIgbmFtZT0ic3RocmVmODciPjwvYT48YSBpZD0ic3RocmVmODgiIG5hbWU9InN0aHJlZjg4Ij48L2E+PGEgaWQ9InN0aHJlZjg5IiBuYW1lPSJzdGhyZWY4OSI+PC9hPjxhIGlkPSJzdGhyZWY5MCIgbmFtZT0ic3RocmVmOTAiPjwvYT5BIG1hcHBlZCBzdXBlcmNsYXNzIGlzIGlkZW50aWZpZWQgYnkgdGhlIDxjb2RlPkBNYXBwZWRTdXBlcmNsYXNzPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBhZGQgTWFwcGVkIFN1cGVyY2xhc3MgcGVyc2lzdGVuY2UgdG8gYW4gZXhpc3RpbmcgZW50aXR5OjwvcD4KLTxvbD4KLTxsaT4KLTxwPk9wZW4gdGhlIEphdmEgY2xhc3MgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IHRoZSBjbGFzcyBpbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgSlBBIERldGFpbHMgdmlldywgY2xpY2sgdGhlIG1hcHBpbmcgdHlwZSBoeXBlcmxpbmsgdG8gb3BlbiB0aGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwcGVkIFN1cGVyY2xhc3M8L3NwYW4+IGFuZCB0aGVuIDxzcGFuIGNsYXNzPSJib2xkIj5PSzwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmOTEiIG5hbWU9InN0aHJlZjkxIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+TWFwcGluZyBUeXBlIFNlbGVjdGlvbiBEaWFsb2cgKE1hcHBlZCBTdXBlcmNsYXNzKTwvcD4KLTxpbWcgc3JjPSJpbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9zdXBlcmNsYXNzLnBuZyIgYWx0PSJUaGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cgd2l0aCBNYXBwZWQgU3VwZXJjbGFzcyBzZWxlY3RlZC4iIHRpdGxlPSJUaGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cgd2l0aCBNYXBwZWQgU3VwZXJjbGFzcyBzZWxlY3RlZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5Db21wbGV0ZSB0aGUgcmVtYWluaW5nIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPi48L3A+Ci08L2xpPgotPC9vbD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkaXRvbmFsX3RhYmxlcy5odG0jQ0lIR0JJRUkiPlNwZWNpZnlpbmcgYWRkaXRpb25hbCB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNDSUhDQ0NKRCI+U3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2U8L2E+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwOS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZTg2OTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA5Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgTmFtZWQgUXVlcmllczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0M1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGluZyBOYW1lZCBRdWVyaWVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSUdCR0ciIG5hbWU9IkJBQklHQkdHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DcmVhdGluZyBOYW1lZCBRdWVyaWVzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMDciIG5hbWU9InN0aHJlZjEwNyI+PC9hPjxhIGlkPSJzdGhyZWYxMDgiIG5hbWU9InN0aHJlZjEwOCI+PC9hPk5hbWVkIHF1ZXJpZXMgaW1wcm92ZSBhcHBsaWNhdGlvbiBwZXJmb3JtYW5jZSBiZWNhdXNlIHRoZXkgYXJlIHByZXBhcmVkIG9uY2UgYW5kIHRoZXkgKGFuZCBhbGwgb2YgdGhlaXIgYXNzb2NpYXRlZCBzdXBwb3J0aW5nIG9iamVjdHMpIGNhbiBiZSBlZmZpY2llbnRseSByZXVzZWQgdGhlcmVhZnRlciwgbWFraW5nIHRoZW0gd2VsbCBzdWl0ZWQgZm9yIGNvbXBsZXggYW5kIGZyZXF1ZW50bHkgZXhlY3V0ZWQgb3BlcmF0aW9ucy4gTmFtZWQgcXVlcmllcyB1c2UgdGhlIEpQQSBxdWVyeSBsYW5ndWFnZSBmb3IgcG9ydGFibGUgZXhlY3V0aW9uIG9uIGFueSB1bmRlcmx5aW5nIGRhdGFiYXNlOyBuYW1lZCBuYXRpdmUgcXVlcmllcyB1c2UgdGhlIFNRTCBsYW5ndWFnZSBuYXRpdmUgdG8gdGhlIHVuZGVybHlpbmcgZGF0YWJhc2UuPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGFkZCA8Y29kZT5ATmFtZWRRdWVyeTwvY29kZT4gYW5kIDxjb2RlPkBOYW1lZE5hdGl2ZVF1ZXJ5PC9jb2RlPiBhbm5vdGF0aW9ucyB0byB0aGUgZW50aXR5LjwvcD4KLTxwPlRvIGNyZWF0ZSBhIG5hbWVkIHF1ZXJ5OjwvcD4KLTxvbD4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgZW50aXR5IGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgSlBBIERldGFpbHMgdmlldywgZXhwYW5kIFF1ZXJpZXMuPC9wPgotPC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+IGZvciBhIG5hbWVkIHF1ZXJ5LCBvciA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIE5hdGl2ZTwvc3Bhbj4gZm9yIGEgbmF0aXZlIHF1ZXJ5LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgZGlhbG9nIHRoYXQgYXBwZWFycywgZW50ZXIgdGhlIG5hbWUgb2YgdGhlIHF1ZXJ5IGluIHRoZSBOYW1lIGZpZWxkIGFuZCB0aGVuIGNsaWNrIE9LLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbnRlciB0aGUgcXVlcnkgaW4gdGhlIFF1ZXJ5IGZpZWxkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBpZD0ic3RocmVmMTA5IiBuYW1lPSJzdGhyZWYxMDkiPjwvYT48YSBpZD0ic3RocmVmMTEwIiBuYW1lPSJzdGhyZWYxMTAiPjwvYT48YSBpZD0ic3RocmVmMTExIiBuYW1lPSJzdGhyZWYxMTEiPjwvYT48YSBpZD0ic3RocmVmMTEyIiBuYW1lPSJzdGhyZWYxMTIiPjwvYT5UbyBhZGQgYSBRdWVyeSBoaW50LCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxMTMiIG5hbWU9InN0aHJlZjExMyI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkVudGVyaW5nIGEgTmFtZWQgUXVlcnk8L3A+Ci08aW1nIHNyYz0iaW1nL3Rhc2tfZW50ZXJpbmdfcXVlcnkucG5nIiBhbHQ9IlRoZSBRdWVyaWVzIHNlY3Rpb24gb2YgdGhlIEpQQSBEZXRhaWxzIHZpZXcuIiB0aXRsZT0iVGhlIFF1ZXJpZXMgc2VjdGlvbiBvZiB0aGUgSlBBIERldGFpbHMgdmlldy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08L29sPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEwLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MDIyZDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEwLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkJhc2ljIG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQmFzaWMgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkJBQkNFIiBuYW1lPSJCQUJCQUJDRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+QmFzaWMgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTE0IiBuYW1lPSJzdGhyZWYxMTQiPjwvYT48YSBpZD0ic3RocmVmMTE1IiBuYW1lPSJzdGhyZWYxMTUiPjwvYT48YSBpZD0ic3RocmVmMTE2IiBuYW1lPSJzdGhyZWYxMTYiPjwvYT48YSBpZD0ic3RocmVmMTE3IiBuYW1lPSJzdGhyZWYxMTciPjwvYT5Vc2UgYSA8c3BhbiBjbGFzcz0iYm9sZCI+QmFzaWMgTWFwcGluZzwvc3Bhbj4gdG8gbWFwIGFuIGF0dHJpYnV0ZSBkaXJlY3RseSB0byBhIGRhdGFiYXNlIGNvbHVtbi4gQmFzaWMgbWFwcGluZ3MgbWF5IGJlIHVzZWQgb25seSB3aXRoIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlIHR5cGVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPkphdmEgcHJpbWl0aXZlIHR5cGVzIGFuZCB3cmFwcGVycyBvZiB0aGUgcHJpbWl0aXZlIHR5cGVzPC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPmphdmEubGFuZy5TdHJpbmcsIGphdmEubWF0aC5CaWdJbnRlZ2VyPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5qYXZhLm1hdGguQmlnRGVjaW1hbDwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+amF2YS51dGlsLkRhdGU8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPmphdmEudXRpbC5DYWxlbmRhciwgamF2YS5zcWwuRGF0ZTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+amF2YS5zcWwuVGltZTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+amF2YS5zcWwuVGltZXN0YW1wPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5ieXRlW108L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPkJ5dGVbXTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+Y2hhcltdPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5DaGFyYWN0ZXJbXTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+ZW51bXM8L3A+Ci08L2xpPgotPGxpPgotPHA+YW55IG90aGVyIHR5cGUgdGhhdCBpbXBsZW1lbnRzIDxjb2RlPlNlcmlhbGl6YWJsZTwvY29kZT48L3A+Ci08L2xpPgotPC91bD4KLTxwPlRvIGNyZWF0ZSBhIGJhc2ljIG1hcHBpbmc6PC9wPgotPG9sPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgcmlnaHQtY2xpY2sgdGhlIGZpZWxkIHRvIG1hcC4gU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBCYXNpYzwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQgZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSByZW1haW5pbmcgZmllbGRzIG9uIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSI0MSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE0Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTQiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+RW50aXR5IE1hcCBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNCByMWMyLXQxNCI+RGVmaW5lcyB0aGlzIG1hcHBpbmcgYXMgYSA8c3BhbiBjbGFzcz0iYm9sZCI+QmFzaWMgTWFwcGluZzwvc3Bhbj4uCi08cD5UaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AQmFzaWM8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTQgcjFjMy10MTQiPkJhc2ljPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+Q29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTQgcjFjMi10MTQiPlRoZSBkYXRhYmFzZSBjb2x1bW4gbWFwcGVkIHRvIHRoZSBlbnRpdHkgYXR0cmlidXRlLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDR0NCSEIiPiJDb2x1bW4iPC9hPiBmb3IgZGV0YWlscy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNCByMWMzLXQxNCI+QnkgZGVmYXVsdCwgdGhlIENvbHVtbiBpcyBhc3N1bWVkIHRvIGJlIG5hbWVkIGlkZW50aWNhbGx5IHRvIHRoZSBhdHRyaWJ1dGUgYW5kIGFsd2F5cyBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+SU5TRVJUPC9jb2RlPiBhbmQgPGNvZGU+VVBEQVRFPC9jb2RlPiBzdGF0ZW1lbnRzLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxNCIgaGVhZGVycz0icjFjMS10MTQiPlRhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTQgcjFjMi10MTQiPk5hbWUgb2YgdGhlIGRhdGFiYXNlIHRhYmxlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE0IHIxYzMtdDE0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5GZXRjaDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE0IHIxYzItdDE0Ij5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dHR0hCIj4iRmV0Y2ggVHlwZSI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RWFnZXI8L3A+Ci08L2xpPgotPGxpPgotPHA+TGF6eTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTQgcjFjMy10MTQiPkVhZ2VyPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+T3B0aW9uYWw8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxNCByMWMyLXQxNCI+U3BlY2lmaWVzIGlmIHRoaXMgZmllbGQgaXMgY2FuIGJlIG51bGwuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTQgcjFjMy10MTQiPlllczwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQxNCIgaGVhZGVycz0icjFjMS10MTQiPlR5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxNCByMWMyLXQxNCI+U3BlY2lmaWVzIHRoZSB0eXBlIG9mIGRhdGE6Ci08dWw+Ci08bGk+Ci08cD5EZWZhdWx0PC9wPgotPC9saT4KLTxsaT4KLTxwPkxPQiAmbmRhc2g7IFNwZWNpZmllcyBpZiB0aGlzIGlzIGEgbGFyZ2Ugb2JqZWN0cyAoQkxPQiBvciBDTE9CKS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0JCSUJJIj4iTG9iIjwvYT4gZm9yIGRldGFpbHMuPC9wPgotPC9saT4KLTxsaT4KLTxwPlRlbXBvcmFsICZuZGFzaDsgU3BlY2lmeSBpZiB0aGlzIGlzIGEgRGF0ZSwgVGltZSwgb3IgVGltZXN0YW1wIG9iamVjdC4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0VBSkdEIj4iVGVtcG9yYWwiPC9hPiBmb3IgZGV0YWlscy48L3A+Ci08L2xpPgotPGxpPgotPHA+RW51bWVyYXRlZCAmbmRhc2g7IFNwZWNpZnkgaG93IHRvIHBlcnNpc3QgZW51bWVyYXRlZCBjb25zdHJhaW50cyBhcyBvcmRpbmFsIG9yIHN0cmluZywgaW4gb3JkZXIgdG8gbWF0Y2ggYW4gZXhpc3RpbmcgZGF0YWJhc2Ugc2NoZW1hLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTQgcjFjMy10MTQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQENvbHVtbihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIsIHRhYmxlPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09MVU1OX1RBQkxFJmd0Ozwvc3Bhbj4iLCAKLSAgICBpbnNlcnRhYmxlPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtJTlNFUlRBQkxFJmd0Ozwvc3Bhbj4sIHVwZGF0YWJsZT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VVBEQVRBQkxFJmd0Ozwvc3Bhbj4pCi1AQmFzaWMoZmV0Y2g9RmV0Y2hUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtGRVRDSF9UWVBFJmd0Ozwvc3Bhbj4sIG9wdGlvbmFsID0gPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O09QVElPTkFMJmd0Ozwvc3Bhbj4pCi1AVGVtcG9yYWwoVGVtcG9yYWxUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtURU1QT1JBTCZndDs8L3NwYW4+KQotCi08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyI+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjM0ZDc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkVtYmVkZGVkIG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRW1iZWRkZWQgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkNCSERGIiBuYW1lPSJCQUJDQkhERiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RW1iZWRkZWQgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTE4IiBuYW1lPSJzdGhyZWYxMTgiPjwvYT48YSBpZD0ic3RocmVmMTE5IiBuYW1lPSJzdGhyZWYxMTkiPjwvYT48YSBpZD0ic3RocmVmMTIwIiBuYW1lPSJzdGhyZWYxMjAiPjwvYT48YSBpZD0ic3RocmVmMTIxIiBuYW1lPSJzdGhyZWYxMjEiPjwvYT5Vc2UgYW4gPHNwYW4gY2xhc3M9ImJvbGQiPkVtYmVkZGVkIE1hcHBpbmc8L3NwYW4+IHRvIHNwZWNpZnkgYSBwZXJzaXN0ZW50IGZpZWxkIG9yIHByb3BlcnR5IG9mIGFuIGVudGl0eSB3aG9zZSB2YWx1ZSBpcyBhbiBpbnN0YW5jZSBvZiBhbiBlbWJlZGRhYmxlIGNsYXNzLjwvcD4KLTxvbD4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHJpZ2h0LWNsaWNrIHRoZSBmaWVsZCB0byBtYXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIGFzICZndDsgRW1iZWRkZWQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPiBkaXNwbGF5cyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIHNlbGVjdGVkIGZpZWxkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhpcyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgcmVtYWluaW5nIGZpZWxkcyBvbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIxOSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMzglIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTUiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxNSI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDE1Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxNSIgaGVhZGVycz0icjFjMS10MTUiPkVudGl0eSBNYXBwaW5nIEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE1IHIxYzItdDE1Ij5EZWZpbmVzIHRoaXMgbWFwcGluZyBhcyBhIDxzcGFuIGNsYXNzPSJib2xkIj5FbWJlZGRlZDwvc3Bhbj4uCi08cD5UaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ARW1iZWRkZWQ8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTUgcjFjMy10MTUiPkVtYmVkZGVkPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+QXR0cmlidXRlIE92ZXJyaWRlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE1IHIxYzItdDE1Ij5TcGVjaWZ5IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG1hcHBpbmcgb2YgYW4gZW50aXR5J3MgYXR0cmlidXRlLiBTZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE1IHIxYzMtdDE1Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBFbWJlZGRlZAotQEF0dHJpYnV0ZU92ZXJyaWRlKGNvbHVtbj1AQ29sdW1uKHRhYmxlPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09MVU1OX1RBQkxFJmd0Ozwvc3Bhbj4iLCBuYW1lID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fTkFNRSZndDs8L3NwYW4+IikpCi08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyI+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjVmYjY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkVtYmVkZGVkIElEIG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRW1iZWRkZWQgSUQgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSERJQUVFIiBuYW1lPSJDSUhESUFFRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RW1iZWRkZWQgSUQgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTIyIiBuYW1lPSJzdGhyZWYxMjIiPjwvYT48YSBpZD0ic3RocmVmMTIzIiBuYW1lPSJzdGhyZWYxMjMiPjwvYT48YSBpZD0ic3RocmVmMTI0IiBuYW1lPSJzdGhyZWYxMjQiPjwvYT48YSBpZD0ic3RocmVmMTI1IiBuYW1lPSJzdGhyZWYxMjUiPjwvYT5Vc2UgYW4gPHNwYW4gY2xhc3M9ImJvbGQiPkVtYmVkZGVkIElEIE1hcHBpbmc8L3NwYW4+IHRvIHNwZWNpZnkgdGhlIHByaW1hcnkga2V5IG9mIGFuIGVtYmVkZGVkIElELiBUaGVzZSBtYXBwaW5ncyBtYXkgYmUgdXNlZCB3aXRoIGEgPGEgaHJlZj0idGFza3MwMDcuaHRtI0JBQkZFSUNFIj5FbWJlZGRhYmxlPC9hPiBlbnRpdGllcy48L3A+Ci08b2w+Ci08bGk+Ci08cD5JbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+LCBzZWxlY3QgdGhlIGZpZWxkIHRvIG1hcC48L3A+Ci08L2xpPgotPGxpPgotPHA+UmlnaHQtY2xpY2sgdGhlIGZpZWxkIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIEFzICZndDsgRW1iZWRkZWQgSWQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPiBkaXNwbGF5cyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIHNlbGVjdGVkIGZpZWxkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhpcyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgcmVtYWluaW5nIGZpZWxkcyBvbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIxOSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMzglIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTYiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxNiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDE2Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPkVudGl0eSBNYXBwaW5nIEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE2IHIxYzItdDE2Ij5EZWZpbmVzIHRoaXMgbWFwcGluZyBhcyBhIDxzcGFuIGNsYXNzPSJib2xkIj5FbWJlZGRlZCBJZDwvc3Bhbj4uCi08cD5UaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ARW1iZWRkZWRJZDwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNiByMWMzLXQxNiI+RW1iZWRkZWQgSWQ8L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBFbWJlZGRlZElkCi08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyI+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWFkZjgxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5JRCBtYXBwaW5nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ0WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IklEIG1hcHBpbmciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJHQ0JIRyIgbmFtZT0iQkFCR0NCSEciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPklEIG1hcHBpbmc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjEyNiIgbmFtZT0ic3RocmVmMTI2Ij48L2E+PGEgaWQ9InN0aHJlZjEyNyIgbmFtZT0ic3RocmVmMTI3Ij48L2E+PGEgaWQ9InN0aHJlZjEyOCIgbmFtZT0ic3RocmVmMTI4Ij48L2E+PGEgaWQ9InN0aHJlZjEyOSIgbmFtZT0ic3RocmVmMTI5Ij48L2E+VXNlIGFuIDxzcGFuIGNsYXNzPSJib2xkIj5JRCBNYXBwaW5nPC9zcGFuPiB0byBzcGVjaWZ5IHRoZSBwcmltYXJ5IGtleSBvZiBhbiBlbnRpdHkuIElEIG1hcHBpbmdzIG1heSBiZSB1c2VkIHdpdGggYSA8YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT4gb3IgPGEgaHJlZj0idGFza3MwMDguaHRtI0JBQkRBR0NJIj5NYXBwZWQgc3VwZXJjbGFzczwvYT4uIEVhY2ggPGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+IG11c3QgaGF2ZSBhbiBJRCBtYXBwaW5nLjwvcD4KLTxvbD4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodCBjbGljayB0aGUgZmlsZWQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgYXMgJmd0OyBJRDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCSEZJSiI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT4gZmllbGRzIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjIyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE3Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTciPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE3IiBoZWFkZXJzPSJyMWMxLXQxNyI+RW50aXR5IE1hcHBpbmcgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTcgcjFjMi10MTciPkRlZmluZXMgdGhpcyBtYXBwaW5nIGFzIGFuIDxzcGFuIGNsYXNzPSJib2xkIj5JRCBNYXBwaW5nPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBJZDwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNyByMWMzLXQxNyI+SUQ8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTciIGhlYWRlcnM9InIxYzEtdDE3Ij5Db2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNyByMWMyLXQxNyI+VGhlIGRhdGFiYXNlIGNvbHVtbiBtYXBwZWQgdG8gdGhlIGVudGl0eSBhdHRyaWJ1dGUuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNHQ0JIQiI+IkNvbHVtbiI8L2E+IGZvciBkZXRhaWxzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE3IHIxYzMtdDE3Ij5CeSBkZWZhdWx0LCB0aGUgQ29sdW1uIGlzIGFzc3VtZWQgdG8gYmUgbmFtZWQgaWRlbnRpY2FsbHkgdG8gdGhlIGF0dHJpYnV0ZS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTciIGhlYWRlcnM9InIxYzEtdDE3Ij5UYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE3IHIxYzItdDE3Ij5UaGUgZGF0YWJhc2UgdGFibGUgbWFwcGVkIHRvIHRoZSBlbnRpdHkgYXR0cmlidXRlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE3IHIxYzMtdDE3Ij5CeSBkZWZhdWx0LCB0aGUgVGFibGUgaXMgYXNzdW1lZCB0byBiZSBpZGVudGljYWwgdG8gdGhlIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50aXR5LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxNyIgaGVhZGVycz0icjFjMS10MTciPlRlbXBvcmFsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTcgcjFjMi10MTciPlNwZWNpZmllcyB0aGUgdHlwZSBvZiBkYXRhLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDRUFKR0QiPiJUZW1wb3JhbCI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RGF0ZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UaW1lPC9wPgotPC9saT4KLTxsaT4KLTxwPlRpbWVzdGFtcDwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTcgcjFjMy10MTciPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSBmaWVsZHMgaW4gPGEgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNDQUNGQ0NBQiI+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbjwvYT4gYXJlYSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUEsgR2VuZXJhdGlvbiB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBLIEdlbmVyYXRpb24gdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMzUlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTgiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxOCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDE4Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxOCIgaGVhZGVycz0icjFjMS10MTgiPlByaW1hcnkgS2V5IEdlbmVyYXRpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxOCByMWMyLXQxOCI+VGhlc2UgZmllbGRzIGRlZmluZSBob3cgdGhlIHByaW1hcnkga2V5IGlzIGdlbmVyYXRlZC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxOCByMWMzLXQxOCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDE4IiBoZWFkZXJzPSJyMWMxLXQxOCI+Jm5ic3A7Jm5ic3A7U3RyYXRlZ3k8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxOCByMWMyLXQxOCI+U2VlIDxhIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0jQ0FDQkFKQkMiPiJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5BdXRvPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlcXVlbmNlPC9wPgotPC9saT4KLTxsaT4KLTxwPklkZW50aXR5PC9wPgotPC9saT4KLTxsaT4KLTxwPlRhYmxlPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxOCByMWMzLXQxOCI+QXV0bzwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxOCIgaGVhZGVycz0icjFjMS10MTgiPiZuYnNwOyZuYnNwO0dlbmVyYXRvciZuYnNwO05hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxOCByMWMyLXQxOCI+TmFtZSBvZiB0aGUgcHJpbWFyeSBrZXkgZ2VuZXJhdG9yIHNwZWNpZmllZCBpbiB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlN0cmF0ZWd5PC9zcGFuPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE4IHIxYzMtdDE4Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08L29sPgotPHA+QWRkaXRpb25hbCBmaWVsZHMgd2lsbCBhcHBlYXIgaW4gdGhlIDxhIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0jQ0FDRkNDQUIiPlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb248L2E+IGFyZWEsIGRlcGVuZGluZyBvbiB0aGUgc2VsZWN0ZWQgU3RyYXRlZ3kuIFNlZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj4iSlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpIjwvYT4gZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uPC9wPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBJZAotQENvbHVtbihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIsIHRhYmxlPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFCTEVfTkFNRSZndDs8L3NwYW4+IiwgaW5zZXJ0YWJsZT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7SU5TRVJUQUJMRSZndDs8L3NwYW4+LAotICAgIHVwZGF0YWJsZT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VVBEQVRBQkxFJmd0Ozwvc3Bhbj4pCi1AVGVtcG9yYWwoPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RFTVBPUkFMJmd0Ozwvc3Bhbj4pCi1AR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3k9R2VuZXJhdG9yVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7U1RSQVRFR1kmZ3Q7PC9zcGFuPiwgZ2VuZXJhdG9yPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7R0VORVJBVE9SX05BTUUmZ3Q7PC9zcGFuPiIpQFRhYmxlR2VuZXJhdG9yKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRV9HRU5FUkFUT1JfTkFNRSZndDs8L3NwYW4+IiwgdGFibGUgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBQkxFX0dFTkVSQVRPUl9UQUJMRSZndDs8L3NwYW4+IiwgCi0gICAgcGtDb2x1bW5OYW1lID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRV9HRU5FUkFUT1JfUEsmZ3Q7PC9zcGFuPiIsIAotICAgIHZhbHVlQ29sdW1uTmFtZSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFCTEVfR0VORVJBVE9SX1ZBTFVFX0NPTFVNTiZndDs8L3NwYW4+IiwgCi0gICAgcGtDb2x1bW5WYWx1ZSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFCTEVfR0VORVJBVE9SX1BLX0NPTFVNTl9WQUxVRSZndDs8L3NwYW4+IilAU2VxdWVuY2VHZW5lcmF0b3IobmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1NFUVVFTkNFX0dFTkVSQVRPUl9OQU1FJmd0Ozwvc3Bhbj4iLCAKLSAgICBzZXF1ZW5jZU5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtTRVFVRU5DRV9HRU5FUkFUT1JfU0VRVUVOQ0UmZ3Q7PC9zcGFuPiIpCi08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyI+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTU4MTkwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5NYW55LXRvLW1hbnkgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNYW55LXRvLW1hbnkgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkVJRUdEIiBuYW1lPSJCQUJFSUVHRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TWFueS10by1tYW55IG1hcHBpbmc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjEzMCIgbmFtZT0ic3RocmVmMTMwIj48L2E+PGEgaWQ9InN0aHJlZjEzMSIgbmFtZT0ic3RocmVmMTMxIj48L2E+PGEgaWQ9InN0aHJlZjEzMiIgbmFtZT0ic3RocmVmMTMyIj48L2E+PGEgaWQ9InN0aHJlZjEzMyIgbmFtZT0ic3RocmVmMTMzIj48L2E+VXNlIGEgPHNwYW4gY2xhc3M9ImJvbGQiPk1hbnktdG8tTWFueSBNYXBwaW5nPC9zcGFuPiB0byBkZWZpbmUgYSBtYW55LXZhbHVlZCBhc3NvY2lhdGlvbiB3aXRoIG1hbnktdG8tbWFueSBtdWx0aXBsaWNpdHkuIEEgbWFueS10by1tYW55IG1hcHBpbmcgaGFzIHR3byBzaWRlczogdGhlIDxzcGFuIGNsYXNzPSJpdGFsaWMiPm93bmluZyBzaWRlPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9Iml0YWxpYyI+bm9uLW93bmluZyBzaWRlPC9zcGFuPi4gWW91IG11c3Qgc3BlY2lmeSB0aGUgam9pbiB0YWJsZSBvbiB0aGUgb3duaW5nIHNpZGUuIEZvciBiaWRpcmVjdGlvbmFsIG1hcHBpbmdzLCBlaXRoZXIgc2lkZSBtYXkgYmUgdGhlIG93bmluZyBzaWRlLjwvcD4KLTxvbD4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBNYW55LXRvLU1hbnk8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPiBkaXNwbGF5cyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIHNlbGVjdGVkIGZpZWxkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhpcyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDQkhGSUoiPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+IGZpZWxkcyBvZiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIxOSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iNDElIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTkiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxOSI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDE5Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPk1hcHBpbmcgRW50aXR5IEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE5IHIxYzItdDE5Ij5EZWZpbmVzIHRoaXMgbWFwcGluZyBhcyBhIDxzcGFuIGNsYXNzPSJib2xkIj5NYW55IHRvIE1hbnkgTWFwcGluZzwvc3Bhbj4uCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ATWFueVRvTWFueTwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxOSByMWMzLXQxOSI+TWFueSB0byBNYW55PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+VGFyZ2V0IEVudGl0eTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE5IHIxYzItdDE5Ij5UaGUgZW50aXR5IHRvIHdoaWNoIHRoaXMgYXR0cmlidXRlIGlzIG1hcHBlZC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxOSByMWMzLXQxOSI+bnVsbAotPHA+WW91IGRvIG5vdCBuZWVkIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgdGFyZ2V0IGVudGl0eSwgc2luY2UgaXQgY2FuIGJlIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2Ygb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+RmV0Y2g8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxOSByMWMyLXQxOSI+RGVmaW5lcyBob3cgZGF0YSBpcyBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2UuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNHR0dIQiI+IkZldGNoIFR5cGUiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPkVhZ2VyPC9wPgotPC9saT4KLTxsaT4KLTxwPkxhenk8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE5IHIxYzMtdDE5Ij5MYXp5PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+TWFwcGVkIEJ5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTkgcjFjMi10MTkiPlRoZSBkYXRhYmFzZSBmaWVsZCB0aGF0IG93bnMgdGhlIHJlbGF0aW9uc2hpcC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+T3JkZXIgQnk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxOSByMWMyLXQxOSI+U3BlY2lmeSB0aGUgZGVmYXVsdCBvcmRlciBmb3Igb2JqZWN0cyByZXR1cm5lZCBmcm9tIGEgcXVlcnkuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNEQURJSCI+Ik9yZGVyIEJ5IjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5ObyBvcmRlcmluZzwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QcmltYXJ5IGtleTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DdXN0b208L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE5IHIxYzMtdDE5Ij5ObyBvcmRlcmluZzwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSBmaWVsZHMgaW4gdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxMS5odG0jQ0FDQkFFQkMiPkpvaW4gVGFibGUgSW5mb3JtYXRpb248L2E+IGFyZWEgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIEpvaW4gVGFibGUgdGFiIG9mIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgSm9pbiBUYWJsZSB0YWIgb2YgdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIxOSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMzglIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjAiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyMCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDIwIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyMCIgaGVhZGVycz0icjFjMS10MjAiPk5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMCByMWMyLXQyMCI+TmFtZSBvZiB0aGUgam9pbiB0YWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBmb3JlaWduIGtleSBjb2x1bW4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjAgcjFjMy10MjAiPllvdSBtdXN0IHNwZWNpZnkgdGhlIGpvaW4gdGFibGUgb24gdGhlIG93bmluZyBzaWRlLgotPHA+QnkgZGVmYXVsdCwgdGhlIG5hbWUgaXMgYXNzdW1lZCB0byBiZSB0aGUgcHJpbWFyeSB0YWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdGllcyBjb25jYXRlbmF0ZWQgd2l0aCBhbiB1bmRlcnNjb3JlLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyMCIgaGVhZGVycz0icjFjMS10MjAiPkpvaW4gQ29sdW1uczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIwIHIxYzItdDIwIj5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjAgcjFjMy10MjAiPkJ5IGRlZmF1bHQsIHRoZSBuYW1lIGlzIGFzc3VtZWQgdG8gYmUgdGhlIHByaW1hcnkgdGFibGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50aXRpZXMgY29uY2F0ZW5hdGVkIHdpdGggYW4gdW5kZXJzY29yZS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjAiIGhlYWRlcnM9InIxYzEtdDIwIj5JbnZlcnNlIEpvaW4gQ29sdW1uczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDIwIHIxYzItdDIwIj5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjAgcjFjMy10MjAiPkJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTxsaT4KLTxwPlRvIGFkZCBhIG5ldyBKb2luIG9yIEludmVyc2UgSm9pbiBDb2x1bW4sIGNsaWNrIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+QWRkPC9zcGFuPi48L3A+Ci08cD5UbyBlZGl0IGFuIGV4aXN0aW5nIEpvaW4gb3IgSW52ZXJzZSBKb2luIENvbHVtbiwgc2VsZWN0IHRoZSBmaWVsZCB0byBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5FZGl0PC9zcGFuPi48L3A+Ci08L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRvIHRoZSBmaWVsZDo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1ASm9pblRhYmxlKGpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX0NPTFVNTiZndDs8L3NwYW4+IiksIAotICAgIG5hbWUgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fVEFCTEVfTkFNRSZndDs8L3NwYW4+IikKLUBNYW55VG9NYW55KGNhc2NhZGU9Q2FzY2FkZVR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NBU0NBREVfVFlQRSZndDs8L3NwYW4+LCBmZXRjaD1GZXRjaFR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0ZFVENIX1RZUEUmZ3Q7PC9zcGFuPiwKLSAgICB0YXJnZXRFbnRpdHk9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBUkdFVF9FTlRJVFkmZ3Q7PC9zcGFuPiwgbWFwcGVkQnkgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O01BUFBFRF9CWSZndDs8L3NwYW4+IikKLUBPcmRlckJ5KCI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7T1JERVJfQlkmZ3Q7PC9zcGFuPiIpCi0KLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE1Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZWJhNmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hbnktdG8tb25lIG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFueS10by1vbmUgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkhGQUZKIiBuYW1lPSJCQUJIRkFGSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TWFueS10by1vbmUgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTM0IiBuYW1lPSJzdGhyZWYxMzQiPjwvYT48YSBpZD0ic3RocmVmMTM1IiBuYW1lPSJzdGhyZWYxMzUiPjwvYT48YSBpZD0ic3RocmVmMTM2IiBuYW1lPSJzdGhyZWYxMzYiPjwvYT48YSBpZD0ic3RocmVmMTM3IiBuYW1lPSJzdGhyZWYxMzciPjwvYT5Vc2UgYSA8c3BhbiBjbGFzcz0iYm9sZCI+TWFueS10by1PbmU8L3NwYW4+IG1hcHBpbmcgdG8gZGVmaW5lcyBhIHNpbmdsZS12YWx1ZWQgYXNzb2NpYXRpb24gdG8gYW5vdGhlciBlbnRpdHkgY2xhc3MgdGhhdCBoYXMgbWFueS10by1vbmUgbXVsdGlwbGljaXR5LjwvcD4KLTxvbD4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodCBjbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBNYW55LXRvLU9uZTwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCSEZJSiI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT4gZmllbGRzIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGlvbiB0aGUgR2VuZXJhbCB0YWIgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpb24gdGhlIEdlbmVyYWwgdGFiIGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSI0MSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyMSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIxIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjEiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+TWFwcGluZyBFbnRpdHkgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjEgcjFjMi10MjEiPkRlZmluZXMgbWFwcGluZyBhcyA8c3BhbiBjbGFzcz0iYm9sZCI+TWFueS10by1PbmU8L3NwYW4+LiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ATWFueVRvT25lPC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIxIHIxYzMtdDIxIj5NYW55LXRvLU9uZTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyMSIgaGVhZGVycz0icjFjMS10MjEiPlRhcmdldCBFbnRpdHk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMSByMWMyLXQyMSI+VGhlIGVudGl0eSB0byB3aGljaCB0aGlzIGF0dHJpYnV0ZSBpcyBtYXBwZWQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjEgcjFjMy10MjEiPm51bGwKLTxwPllvdSBkbyBub3QgbmVlZCB0byBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIHRhcmdldCBlbnRpdHksIHNpbmNlIGl0IGNhbiBiZSBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIG9iamVjdCBiZWluZyByZWZlcmVuY2VkLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyMSIgaGVhZGVycz0icjFjMS10MjEiPkZldGNoPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjEgcjFjMi10MjEiPkRlZmluZXMgaG93IGRhdGEgaXMgbG9hZGVkIGZyb20gdGhlIGRhdGFiYXNlLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDR0dHSEIiPiJGZXRjaCBUeXBlIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5FYWdlcjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5MYXp5PC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMSByMWMzLXQyMSI+RWFnZXI8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MjEiIGhlYWRlcnM9InIxYzEtdDIxIj5DYXNjYWRlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjEgcjFjMi10MjEiPlNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNKQUlIQiI+IkNhc2NhZGUgVHlwZSI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RGVmYXVsdDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5BbGw8L3A+Ci08L2xpPgotPGxpPgotPHA+UGVyc2lzdDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5NZXJnZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SZW1vdmU8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDIxIHIxYzMtdDIxIj5EZWZhdWx0PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+T3B0aW9uYWw8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyMSByMWMyLXQyMSI+U3BlY2lmaWVzIGlmIHRoaXMgZmllbGQgaXMgY2FuIGJlIG51bGwuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjEgcjFjMy10MjEiPlllczwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSBmaWVsZHMgb24gdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jQ0FDRkNFSkMiPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvYT4gdGFiIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSI0MSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyMiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIyIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjIiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIyIiBoZWFkZXJzPSJyMWMxLXQyMiI+Sm9pbiBDb2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMiByMWMyLXQyMiI+PGEgaWQ9InN0aHJlZjEzOCIgbmFtZT0ic3RocmVmMTM4Ij48L2E+PGEgaWQ9InN0aHJlZjEzOSIgbmFtZT0ic3RocmVmMTM5Ij48L2E+U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ASm9pbkNvbHVtPC9jb2RlPiBhdHRyaWJ1dGUuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjIgcjFjMy10MjIiPkJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQEpvaW5UYWJsZShqb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9DT0xVTU4mZ3Q7PC9zcGFuPiIpLCAKLSAgICBuYW1lID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX1RBQkxFX05BTUUmZ3Q7PC9zcGFuPiIpCi1ATWFueVRvT25lKHRhcmdldEVudGl0eT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFSR0VUX0VOVElUWSZndDs8L3NwYW4+LCBmZXRjaD08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RkVUQ0hfVFlQRSZndDs8L3NwYW4+LCAKLSAgICBjYXNjYWRlPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDQVNDQURFX1RZUEUmZ3Q7PC9zcGFuPikKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxN2M3NDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE2Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk9uZS10by1tYW55IG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iT25lLXRvLW1hbnkgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkhHRUJEIiBuYW1lPSJCQUJIR0VCRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+T25lLXRvLW1hbnkgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTQwIiBuYW1lPSJzdGhyZWYxNDAiPjwvYT48YSBpZD0ic3RocmVmMTQxIiBuYW1lPSJzdGhyZWYxNDEiPjwvYT48YSBpZD0ic3RocmVmMTQyIiBuYW1lPSJzdGhyZWYxNDIiPjwvYT48YSBpZD0ic3RocmVmMTQzIiBuYW1lPSJzdGhyZWYxNDMiPjwvYT5Vc2UgYSA8c3BhbiBjbGFzcz0iYm9sZCI+T25lLXRvLU1hbnkgTWFwcGluZzwvc3Bhbj4gdG8gZGVmaW5lIGEgcmVsYXRpb25zaGlwIHdpdGggb25lLXRvLW1hbnkgbXVsdGlwbGljaXR5LjwvcD4KLTxvbD4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBPbmUtdG8tbWFueTwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCSEZJSiI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT4gZmllbGRzIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBHZW5lcmFsIHRhYiBvZiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIEdlbmVyYWwgdGFiIG9mIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMTklIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjM4JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDIzIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjMiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyMyI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjMiIGhlYWRlcnM9InIxYzEtdDIzIj5NYXBwaW5nIEVudGl0eSBUeXBlIEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIzIHIxYzItdDIzIj5EZWZpbmVzIG1hcHBpbmcgYXMgPHNwYW4gY2xhc3M9ImJvbGQiPk9uZS10by1NYW55PC9zcGFuPi4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QE9uZVRvTWFueTwvY29kZT4gYW5ub3RhdGlvbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMyByMWMzLXQyMyI+T25lLXRvLU1hbnk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjMiIGhlYWRlcnM9InIxYzEtdDIzIj5UYXJnZXQgRW50aXR5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjMgcjFjMi10MjMiPlRoZSBlbnRpdHkgdG8gd2hpY2ggdGhpcyBhdHRyaWJ1dGUgaXMgbWFwcGVkLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIzIHIxYzMtdDIzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjMiIGhlYWRlcnM9InIxYzEtdDIzIj5DYXNjYWRlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjMgcjFjMi10MjMiPlNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNKQUlIQiI+IkNhc2NhZGUgVHlwZSI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RGVmYXVsdDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5BbGw8L3A+Ci08L2xpPgotPGxpPgotPHA+UGVyc2lzdDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5NZXJnZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SZW1vdmU8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDIzIHIxYzMtdDIzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MjMiIGhlYWRlcnM9InIxYzEtdDIzIj5GZXRjaDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDIzIHIxYzItdDIzIj5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dHR0hCIj4iRmV0Y2ggVHlwZSI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RWFnZXI8L3A+Ci08L2xpPgotPGxpPgotPHA+TGF6eTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjMgcjFjMy10MjMiPkVhZ2VyPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDIzIiBoZWFkZXJzPSJyMWMxLXQyMyI+TWFwcGVkIEJ5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjMgcjFjMi10MjMiPlRoZSBkYXRhYmFzZSBmaWVsZCB0aGF0IG93bnMgdGhlIHJlbGF0aW9uc2hpcC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyMyByMWMzLXQyMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDIzIiBoZWFkZXJzPSJyMWMxLXQyMyI+T3JkZXIgQnk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQyMyByMWMyLXQyMyI+U3BlY2lmeSB0aGUgZGVmYXVsdCBvcmRlciBmb3Igb2JqZWN0cyByZXR1cm5lZCBmcm9tIGEgcXVlcnkuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNEQURJSCI+Ik9yZGVyIEJ5IjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5ObyBvcmRlcmluZzwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QcmltYXJ5IGtleTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DdXN0b208L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDIzIHIxYzMtdDIzIj5ObyBvcmRlcmluZzwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMTEuaHRtI0NBQ0JBRUJDIj5Kb2luIFRhYmxlIEluZm9ybWF0aW9uPC9hPiBmaWVsZHMgaW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBKb2luIFRhYmxlIHRhYiBvZiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIEpvaW4gVGFibGUgdGFiIG9mIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMTklIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjM4JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDI0Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjQiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyNCI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjQiIGhlYWRlcnM9InIxYzEtdDI0Ij5OYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjQgcjFjMi10MjQiPk5hbWUgb2YgdGhlIGpvaW4gdGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNCByMWMzLXQyNCI+QnkgZGVmYXVsdCwgdGhlIG5hbWUgaXMgYXNzdW1lZCB0byBiZSB0aGUgcHJpbWFyeSB0YWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdGllcyBjb25jYXRlbmF0ZWQgd2l0aCBhbiB1bmRlcnNjb3JlLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPkpvaW4gQ29sdW1uczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI0IHIxYzItdDI0Ij5TcGVjaWZ5IHR3byBvciBtb3JlIGpvaW4gY29sdW1ucyAodGhhdCBpcywgYSBwcmltYXJ5IGtleSkuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjQgcjFjMy10MjQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPkludmVyc2UgSm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjQgcjFjMi10MjQiPlRoZSBqb2luIGNvbHVtbiBvbiB0aGUgb3duZWQgKG9yIGludmVyc2UpIHNpZGUgb2YgdGhlIGFzc29jaWF0aW9uOiB0aGUgb3duZWQgZW50aXR5J3MgcHJpbWFyeSBrZXkgY29sdW1uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI0IHIxYzMtdDI0Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBPbmVUb01hbnkodGFyZ2V0RW50aXR5PTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQVJHRVRfRU5USVRZJmd0Ozwvc3Bhbj4pCi1AQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU4mZ3Q7PC9zcGFuPiIpCi0KLQotQE9uZVRvTWFueSh0YXJnZXRFbnRpdHk9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBUkdFVF9FTlRJVFkmZ3Q7PC9zcGFuPi5jbGFzcywgY2FzY2FkZT1DYXNjYWRlVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q0FTQ0FERV9UWVBFJmd0Ozwvc3Bhbj4sIAotICAgIGZldGNoID0gRmV0Y2hUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtGRVRDSF9UWVBFJmd0Ozwvc3Bhbj4sIG1hcHBlZEJ5ID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtNQVBQRURfQlkmZ3Q7PC9zcGFuPiIpQE9yZGVyQnkoIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtPUkRFUl9CWSZndDs8L3NwYW4+IikKLUBKb2luVGFibGUobmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fVEFCTEVfTkFNRSZndDs8L3NwYW4+Iiwgam9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT0KLSAgICAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fQ09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU4mZ3Q7PC9zcGFuPiIpLCAKLSAgICBpbnZlcnNlSm9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0lOVkVSU0VfSk9JTl9DT0xVTU5fTkFNRSZndDs8L3NwYW4+IiwgCi0gICAgcmVmZXJlbmNlZENvbHVtbk5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtJTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OJmd0Ozwvc3Bhbj4iKSkKLQotPC9wcmU+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM1OGY4YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+T25lLXRvLW9uZSBtYXBwaW5nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ0WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik9uZS10by1vbmUgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkZIQkNKIiBuYW1lPSJCQUJGSEJDSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+T25lLXRvLW9uZSBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxNDQiIG5hbWU9InN0aHJlZjE0NCI+PC9hPjxhIGlkPSJzdGhyZWYxNDUiIG5hbWU9InN0aHJlZjE0NSI+PC9hPjxhIGlkPSJzdGhyZWYxNDYiIG5hbWU9InN0aHJlZjE0NiI+PC9hPjxhIGlkPSJzdGhyZWYxNDciIG5hbWU9InN0aHJlZjE0NyI+PC9hPlVzZSBhIDxzcGFuIGNsYXNzPSJib2xkIj5PbmUtdG8tT25lIE1hcHBpbmc8L3NwYW4+IHRvIGRlZmluZSBhIHJlbGF0aW9uc2hpcCB3aXRoIG9uZS10by1tYW55IG11bHRpcGxpY2l0eS48L3A+Ci08b2w+Ci08bGk+Ci08cD5JbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+LCBzZWxlY3QgdGhlIGZpZWxkIHRvIG1hcC48L3A+Ci08L2xpPgotPGxpPgotPHA+UmlnaHQtY2xpY2sgdGhlIGZpZWxkIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIEFzICZndDsgT25lLXRvLU9uZTwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCSEZJSiI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT4gZmllbGRzIGluIHRoZSBKUEEgRGV0YWlscyB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIxOSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iNDElIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjUiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyNSI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDI1Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPk1hcHBlZCBFbnRpdHkgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjUgcjFjMi10MjUiPkRlZmluZXMgbWFwcGluZyBhcyA8c3BhbiBjbGFzcz0iYm9sZCI+T25lLXRvLU9uZTwvc3Bhbj4uIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBPbmVUb09uZTwvY29kZT4gYW5ub3RhdGlvbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNSByMWMzLXQyNSI+T25lLXRvLU9uZTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPlRhcmdldCBFbnRpdHk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNSByMWMyLXQyNSI+VGhlIGVudGl0eSB0byB3aGljaCB0aGlzIGF0dHJpYnV0ZSBpcyBtYXBwZWQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjUgcjFjMy10MjUiPm51bGwKLTxwPllvdSBkbyBub3QgbmVlZCB0byBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIHRhcmdldCBlbnRpdHksIHNpbmNlIGl0IGNhbiBiZSBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIG9iamVjdCBiZWluZyByZWZlcmVuY2VkLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPkZldGNoIFR5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNSByMWMyLXQyNSI+RGVmaW5lcyBob3cgZGF0YSBpcyBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2UuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNHR0dIQiI+IkZldGNoIFR5cGUiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPkVhZ2VyPC9wPgotPC9saT4KLTxsaT4KLTxwPkxhenk8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI1IHIxYzMtdDI1Ij5FYWdlcjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPk1hcHBlZCBCeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI1IHIxYzItdDI1Ij5UaGUgZGF0YWJhc2UgZmllbGQgdGhhdCBvd25zIHRoZSByZWxhdGlvbnNoaXAuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjUgcjFjMy10MjUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMTIuaHRtI0NBQ0ZDRUpDIj5Kb2luIENvbHVtbnMgSW5mb3JtYXRpb248L2E+IGZpZWxkcyBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIxOSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iNDElIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjYiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyNiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDI2Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyNiIgaGVhZGVycz0icjFjMS10MjYiPkpvaW4gQ29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjYgcjFjMi10MjYiPjxhIGlkPSJzdGhyZWYxNDgiIG5hbWU9InN0aHJlZjE0OCI+PC9hPjxhIGlkPSJzdGhyZWYxNDkiIG5hbWU9InN0aHJlZjE0OSI+PC9hPlNwZWNpZnkgYSBtYXBwZWQgY29sdW1uIGZvciBqb2luaW5nIGFuIGVudGl0eSBhc3NvY2lhdGlvbi4gVGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QEpvaW5Db2x1bTwvY29kZT4gYXR0cmlidXRlLgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSBEZWZhdWx0PC9zcGFuPiwgdGhlbiBBZGQsIEVkaXQsIG9yIFJlbW92ZSB0aGUgam9pbiBjb2x1bW5zLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI2IHIxYzMtdDI2Ij5CeSBkZWZhdWx0LCB0aGUgbWFwcGluZyBpcyBhc3N1bWVkIHRvIGhhdmUgYSBzaW5nbGUgam9pbi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBPbmVUb09uZSh0YXJnZXRFbnRpdHk9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBUkdFVF9FTlRJVFkmZ3Q7PC9zcGFuPiwgY2FzY2FkZT1DYXNjYWRlVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q0FTQ0FERV9UWVBFJmd0Ozwvc3Bhbj4sIAotICAgIGZldGNoID0gRmV0Y2hUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtGRVRDSF9UWVBFJmd0Ozwvc3Bhbj4sIG1hcHBlZEJ5ID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtNQVBQRURfQlkmZ3Q7PC9zcGFuPiIpCi1ASm9pbkNvbHVtbihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9DT0xVTU5fTkFNRSZndDs8L3NwYW4+IiwgcmVmZXJlbmNlZENvbHVtbk5hbWU9Ci0gICAgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTiZndDs8L3NwYW4+IiwgaW5zZXJ0YWJsZSA9IDxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtJTlNFUlRBQkxFJmd0Ozwvc3Bhbj4sIAotICAgIHVwZGF0YWJsZSA9IDxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtVUERBVEFCTEUmZ3Q7PC9zcGFuPikKLQotPC9wcmU+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTguaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE4Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0YmRiMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTguaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5UcmFuc2llbnQgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJUcmFuc2llbnQgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkhGSEVJIiBuYW1lPSJCQUJIRkhFSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+VHJhbnNpZW50IG1hcHBpbmc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE1MCIgbmFtZT0ic3RocmVmMTUwIj48L2E+PGEgaWQ9InN0aHJlZjE1MSIgbmFtZT0ic3RocmVmMTUxIj48L2E+PGEgaWQ9InN0aHJlZjE1MiIgbmFtZT0ic3RocmVmMTUyIj48L2E+PGEgaWQ9InN0aHJlZjE1MyIgbmFtZT0ic3RocmVmMTUzIj48L2E+VXNlIHRoZSBUcmFuc2llbnQgTWFwcGluZyB0byBzcGVjaWZ5IGEgZmllbGQgb2YgdGhlIGVudGl0eSBjbGFzcyB0aGF0IDxzcGFuIGNsYXNzPSJpdGFsaWMiPmlzIG5vdDwvc3Bhbj4gcGVyc2lzdGVudC48L3A+Ci08cD5UbyBjcmVhdGUgYSB0cmFuc2llbnQgbWFwcGluZzo8L3A+Ci08b2w+Ci08bGk+Ci08cD5JbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+LCBzZWxlY3QgdGhlIGZpZWxkIHRvIG1hcC48L3A+Ci08L2xpPgotPGxpPgotPHA+UmlnaHQtY2xpY2sgdGhlIGZpZWxkIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIEFzIFRyYW5zaWVudDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQuPC9wPgotPC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9uIHRvIHRoZSBmaWVsZDo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1AVHJhbnNpZW50Ci08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyI+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxOS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWYzMjA5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxOS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5WZXJzaW9uIG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDVaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iVmVyc2lvbiBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSElCSUkiIG5hbWU9IkJBQkhJQklJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5WZXJzaW9uIG1hcHBpbmc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE1NCIgbmFtZT0ic3RocmVmMTU0Ij48L2E+PGEgaWQ9InN0aHJlZjE1NSIgbmFtZT0ic3RocmVmMTU1Ij48L2E+PGEgaWQ9InN0aHJlZjE1NiIgbmFtZT0ic3RocmVmMTU2Ij48L2E+PGEgaWQ9InN0aHJlZjE1NyIgbmFtZT0ic3RocmVmMTU3Ij48L2E+VXNlIGEgPHNwYW4gY2xhc3M9ImJvbGQiPlZlcnNpb24gTWFwcGluZzwvc3Bhbj4gdG8gc3BlY2lmeSB0aGUgZmllbGQgdXNlZCBmb3Igb3B0aW1pc3RpYyBsb2NraW5nLiBJZiB0aGUgZW50aXR5IGlzIGFzc29jaWF0ZWQgd2l0aCBtdWx0aXBsZSB0YWJsZXMsIHlvdSBzaG91bGQgdXNlIGEgdmVyc2lvbiBtYXBwaW5nIG9ubHkgd2l0aCB0aGUgcHJpbWFyeSB0YWJsZS4gWW91IHNob3VsZCBoYXZlIG9ubHkgYSBzaW5nbGUgdmVyc2lvbiBtYXBwaW5nIHBlciBwZXJzaXN0ZW50IGVudGl0eS4gVmVyc2lvbiBtYXBwaW5ncyBtYXkgYmUgdXNlZCBvbmx5IHdpdGggdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGUgdHlwZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGNvZGU+aW50PC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5JbnRlZ2VyPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5zaG9ydCwgU2hvcnQ8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPmxvbmcsIExvbmc8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPlRpbWVzdGFtcDwvY29kZT48L3A+Ci08L2xpPgotPC91bD4KLTxwPlRvIGNyZWF0ZSBhIHZlcnNpb24gbWFwcGluZzo8L3A+Ci08b2w+Ci08bGk+Ci08cD5JbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+LCBzZWxlY3QgdGhlIGZpZWxkIHRvIG1hcC48L3A+Ci08L2xpPgotPGxpPgotPHA+UmlnaHQtY2xpY2sgdGhlIGZpZWxkIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIEFzICZndDsgVmVyc2lvbjwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSByZW1haW5pbmcgZmllbGRzIGluIHRoZSBKUEEgRGV0YWlscyB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIxOSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMzglIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjciPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyNyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDI3Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyNyIgaGVhZGVycz0icjFjMS10MjciPk1hcHBlZCBFbnRpdHkgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjcgcjFjMi10MjciPkRlZmluZXMgdGhlIG1hcHBpbmcgYXMgVmVyc2lvbi4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QFZlcnNpb248L2NvZGU+IGFubm90YXRpb24uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjcgcjFjMy10MjciPlZlcnNpb248L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjciIGhlYWRlcnM9InIxYzEtdDI3Ij5Db2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNyByMWMyLXQyNyI+VGhlIGRhdGFiYXNlIGNvbHVtbiBtYXBwZWQgdG8gdGhlIGVudGl0eSBhdHRyaWJ1dGUuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNHQ0JIQiI+IkNvbHVtbiI8L2E+IGZvciBkZXRhaWxzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI3IHIxYzMtdDI3Ij5CeSBkZWZhdWx0LCB0aGUgQ29sdW1uIGlzIGFzc3VtZWQgdG8gYmUgbmFtZWQgaWRlbnRpY2FsbHkgdG8gdGhlIGF0dHJpYnV0ZSBhbmQgYWx3YXlzIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5JTlNFUlQ8L2NvZGU+IGFuZCA8Y29kZT5VUERBVEU8L2NvZGU+IHN0YXRlbWVudHMuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDI3IiBoZWFkZXJzPSJyMWMxLXQyNyI+VGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNyByMWMyLXQyNyI+TmFtZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUuIFRoaXMgbXVzdCBiZSB0aGUgcHJpbWFyeSB0YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGF0dHJpYnV0ZSdzIGVudGl0eS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNyByMWMzLXQyNyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDI3IiBoZWFkZXJzPSJyMWMxLXQyNyI+VGVtcG9yYWw8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyNyByMWMyLXQyNyI+U3BlY2lmaWVzIHRoZSB0eXBlIG9mIGRhdGEuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNFQUpHRCI+IlRlbXBvcmFsIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5EYXRlPC9wPgotPC9saT4KLTxsaT4KLTxwPlRpbWU8L3A+Ci08L2xpPgotPGxpPgotPHA+VGltZXN0YW1wPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyNyByMWMzLXQyNyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRvIHRoZSBmaWVsZDo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1AVmVyc2lvbgotQENvbHVtbih0YWJsZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTl9UQUJMRSZndDs8L3NwYW4+IiwgbmFtZT0iJmx0OzxzcGFuIGNsYXNzPSJpdGFsaWMiPkNPTFVNTl9OQU1FPC9zcGFuPiZndDsiKQotCi08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyI+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjAuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzg1Y2Q0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkVsZW1lbnQgQ29sbGVjdGlvbiBtYXBwaW5nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ1WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkVsZW1lbnQgQ29sbGVjdGlvbiBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIQkRFQUoiIG5hbWU9IkNJSEJERUFKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbGVtZW50IENvbGxlY3Rpb24gbWFwcGluZzwvaDE+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIxLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU4ZWJiOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ1WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJCQUdGSSIgbmFtZT0iQkFCQkFHRkkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+Ci08aDE+R2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTU4IiBuYW1lPSJzdGhyZWYxNTgiPjwvYT48YSBpZD0ic3RocmVmMTU5IiBuYW1lPSJzdGhyZWYxNTkiPjwvYT5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gZ2VuZXJhdGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzIGZyb20gZGF0YWJhc2UgdGFibGVzLiBZb3UgbXVzdCBjcmVhdGUgYSBKUEEgcHJvamVjdCBhbmQgZXN0YWJsaXNoIGEgZGF0YWJhc2UgY29ubmVjdGlvbiA8c3BhbiBjbGFzcz0iaXRhbGljIj5iZWZvcmU8L3NwYW4+IGdlbmVyYXRpbmcgcGVyc2lzdGVudCBlbnRpdGllcy4gU2VlIDxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPGEgaWQ9InN0aHJlZjE2MCIgbmFtZT0ic3RocmVmMTYwIj48L2E+PGEgaWQ9InN0aHJlZjE2MSIgbmFtZT0ic3RocmVmMTYxIj48L2E+PC9wPgotPG9sPgotPGxpPgotPHA+UmlnaHQtY2xpY2sgdGhlIEpQQSBwcm9qZWN0IGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+UHJvamVjdCBFeHBsb3Jlcjwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPkpQQSBUb29scyAmZ3Q7IEdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzPC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNjIiIG5hbWU9InN0aHJlZjE2MiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkdlbmVyYXRpbmcgRW50aXRpZXM8L3A+Ci08aW1nIHNyYz0iaW1nL2dlbmVyYXRlX2VudGl0aWVzLnBuZyIgYWx0PSJVc2luZyB0aGUgSlBBIFRvb2xzICZndDsgR2VuZXJhdGUgRW50aXRpZXMgbWVudSBvcHRpb24uIiB0aXRsZT0iVXNpbmcgdGhlIEpQQSBUb29scyAmZ3Q7IEdlbmVyYXRlIEVudGl0aWVzIG1lbnUgb3B0aW9uLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPk9uIHRoZSA8YSBocmVmPSJyZWZfc2VsZWN0VGFibGVzLmh0bSNDSUFIQ0dFRSI+U2VsZWN0IFRhYmxlczwvYT4gcGFnZSwgc2VsZWN0IHlvdXIgZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgc2NoZW1hLjwvcD4KLTxwPlRvIGNyZWF0ZSBhIG5ldyBkYXRhYmFzZSBjb25uZWN0aW9uLCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIGNvbm5lY3Rpb248L3NwYW4+LjwvcD4KLTxwPklmIHlvdSBhcmUgbm90IGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gdGhlIGRhdGFiYXNlLCB0aGUgRGF0YWJhc2UgQ29ubmVjdGlvbiBwYWdlIGFwcGVhcnMuIFNlbGVjdCB5b3VyIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIHNjaGVtYSwgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5SZWNvbm5lY3Q8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE2MyIgbmFtZT0ic3RocmVmMTYzIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U2VsZWN0IFRhYmxlczwvcD4KLTxpbWcgc3JjPSJpbWcvc2VsZWN0X3RhYmxlcy5wbmciIGFsdD0iIiB0aXRsZT0iIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+QWZ0ZXIgc2VsZWN0aW5nIGEgc2NoZW1hLCBzZWxlY3QgdGhlIHRhYmxlcyBmcm9tIHdoaWNoIHRvIGdlbmVyYXRlIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcyBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5PbiB0aGUgPGEgaHJlZj0icmVmX3RhYmxlQXNzb2NpYXRpb25zLmh0bSNDSUFDRElDQiI+VGFibGUgQXNzb2NpYXRpb25zPC9hPiBwYWdlLCBzZWxlY3QgdGhlIGFzc29jaWF0aW9ucyB0byBnZW5lcmF0ZS4gWW91IGNhbiBzcGVjaWZ5IHRvIGdlbmVyYXRlIHNwZWNpZmljIHJlZmVyZW5jZXMgZm9yIGVhY2ggYXNzb2NpYXRpb24uPC9wPgotPHA+VG8gY3JlYXRlIGEgbmV3IGFzc29jaWF0aW9uLCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIEFzc29jaWF0aW9uPC9zcGFuPi4gVXNlIHRoZSA8YSBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtI0NJQUZHSElGIj5DcmVhdGUgTmV3IEFzc29jaWF0aW9uPC9hPiB3aXphcmQgdG8gZGVmaW5lIHRoZSBhc3NvY2lhdGlvbi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNjQiIG5hbWU9InN0aHJlZjE2NCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlRhYmxlIEFzc29jaWF0aW9uczwvcD4KLTxpbWcgc3JjPSJpbWcvdGFibGVfYXNzb2NpYXRpb25zLnBuZyIgYWx0PSIiIHRpdGxlPSIiIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5BZnRlciBlZGl0aW5nIHRoZSB0YWJsZSBhc3NvY2lhdGlvbnMsIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+T24gdGhlIDxhIGhyZWY9InJlZl9jdXN0b21pemVEZWZhdWx0RW50aXR5R2VuZXJhdGlvbi5odG0jQ0lBRUpEQkUiPkN1c3RvbWl6ZSBEZWZhdWx0IEVudGl0eSBHZW5lcmF0aW9uPC9hPiBwYWdlLCBjdXN0b21pemUgdGhlIG1hcHBpbmcgYW5kIGNsYXNzIGluZm9ybWF0aW9uIGZvciBlYWNoIGdlbmVyYXRlZCBlbnRpdHkuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTY1IiBuYW1lPSJzdGhyZWYxNjUiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5DdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbjwvcD4KLTxpbWcgc3JjPSJpbWcvY3VzdG9taXplX2RlZmF1bHRfZW50aXR5X2dlbmVyYXRpb24ucG5nIiBhbHQ9IiIgdGl0bGU9IiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkFmdGVyIGN1c3RvbWl6aW5nIHRoZSBtYXBwaW5ncywgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5PbiB0aGUgPGEgaHJlZj0icmVmX2N1c3RvbWl6SW5kaXZpZHVhbEVudGl0aWVzLmh0bSNDSUFDSUdFRSI+Q3VzdG9taXplIEluZGl2aWR1YWwgRW50aXRpZXM8L2E+IHBhZ2UsIHJldmlldyB0aGUgbWFwcGluZyBhbmQgY2xhc3MgaW5mb3JtYXRpb24gZm9yIGVhY2ggZW50aXR5IHRoYXQgd2lsbCBiZSBnZW5lcmF0ZWQsIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbmlzaDwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTY2IiBuYW1lPSJzdGhyZWYxNjYiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5DdXN0b21pemUgSW5kaXZpZHVhbCBFbnRpdGllczwvcD4KLTxpbWcgc3JjPSJpbWcvY3VzdG9taXplX2luZGl2aWR1YWxfZW50aXRpZXMucG5nIiBhbHQ9IiIgdGl0bGU9IiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGNyZWF0ZXMgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IGZvciBlYWNoIGRhdGFiYXNlIHRhYmxlLiBFYWNoIGVudGl0eSBjb250YWlucyBmaWVsZHMgYmFzZWQgb24gdGhlIHRhYmxlJ3MgY29sdW1ucy4gRWNsaXBzZSB3aWxsIGFsc28gZ2VuZXJhdGUgZW50aXR5IHJlbGF0aW9uc2hpcHMgKHN1Y2ggYXMgb25lLXRvLW9uZSkgYmFzZWQgb24gdGhlIHRhYmxlIGNvbnN0cmFpbnRzLiA8YSBocmVmPSIjQ0lISklKSkMiPkZpZ3VyZTogR2VuZXJhdGluZyBFbnRpdGllcyBmcm9tIFRhYmxlczwvYT4gaWxsdXN0cmF0ZXMgaG93IEVjbGlwc2UgZ2VuZXJhdGVzIGVudGl0aWVzIGZyb20gdGFibGVzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9IkNJSEpJSkpDIiBuYW1lPSJDSUhKSUpKQyI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkdlbmVyYXRpbmcgRW50aXRpZXMgZnJvbSBUYWJsZXM8L3A+Ci08aW1nIHNyYz0iaW1nL3RhYmxlX2VudGl0eS5wbmciIGFsdD0iVGhpcyBmaWd1cmUgc2hvd3MgdGhlIEVNUExPWUVFIGFuZCBBRERSRVNTIGVudGl0aWVzIGdlbmVyYXRlZCBmcm9tIGRhdGFiYXNlIHRhYmxlcy4iIHRpdGxlPSJUaGlzIGZpZ3VyZSBzaG93cyB0aGUgRU1QTE9ZRUUgYW5kIEFERFJFU1MgZW50aXRpZXMgZ2VuZXJhdGVkIGZyb20gZGF0YWJhc2UgdGFibGVzLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPHA+PGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jQkFCSkhCQ0kiPlByb2plY3QgUHJvcGVydGllcyBwYWdlICZuZGFzaDsgSmF2YSBQZXJzaXN0ZW5jZSBPcHRpb25zPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzQxZTg5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkdlbmVyYXRpbmcgdGFibGVzIGZyb20gZW50aXRpZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDVaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhdGluZyB0YWJsZXMgZnJvbSBlbnRpdGllcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSEpJR0JFIiBuYW1lPSJDSUhKSUdCRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdGluZyB0YWJsZXMgZnJvbSBlbnRpdGllczwvaDE+Ci08cD5XaGVuIHVzaW5nIGEgdmVuZG9yLXNwZWNpZmljIHBsYXRmb3JtLCB5b3UgY2FuIGNyZWF0ZSBhIERETCBzY3JpcHQgZnJvbSB5b3VyIHBlcnNpc3RlbnQgZW50aXRpZXMuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGUgRERMIHNjcmlwdCB3aXRoIERST1AgZXhpc3RpbmcgdGFibGVzIG9uIHRoZSBkYXRhYmFzZSBhbmQgQ1JFQVRFIG5ldyB0YWJsZXMsIGJhc2VkIG9uIHRoZSBlbnRpdGllcyBpbiB5b3VyIHByb2plY3QuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08cD5UbyBnZW5lcmF0ZSBhIERETCBzY3JpcHQ6PC9wPgotPHA+UmlnaHQtY2xpY2sgdGhlIEpQQSBwcm9qZWN0IGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+UHJvamVjdCBFeHBsb3Jlcjwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPkpQQSBUb29scyAmZ3Q7IEdlbmVyYXRlIFRhYmxlcyBmcm9tIEVudGl0aWVzPC9zcGFuPi48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPHA+PGEgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jQkFCRkJKQkciPkNyZWF0aW5nIGEgSlBBIEVudGl0eTwvYT48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jQkFCSkhCQ0kiPlByb2plY3QgUHJvcGVydGllcyBwYWdlICZuZGFzaDsgSmF2YSBQZXJzaXN0ZW5jZSBPcHRpb25zPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTg3MGU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlZhbGlkYXRpbmcgbWFwcGluZ3MgYW5kIHJlcG9ydGluZyBwcm9ibGVtczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJWYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJGQUlCQSIgbmFtZT0iQkFCRkFJQkEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+Ci08aDE+VmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxNjciIG5hbWU9InN0aHJlZjE2NyI+PC9hPjxhIGlkPSJzdGhyZWYxNjgiIG5hbWU9InN0aHJlZjE2OCI+PC9hPjxhIGlkPSJzdGhyZWYxNjkiIG5hbWU9InN0aHJlZjE2OSI+PC9hPjxhIGlkPSJzdGhyZWYxNzAiIG5hbWU9InN0aHJlZjE3MCI+PC9hPkVycm9ycyBhbmQgd2FybmluZ3Mgb24gcGVyc2lzdGVudCBlbnRpdGllcyBhbmQgbWFwcGluZ3MgYXJlIGluZGljYXRlZCB3aXRoIGEgcmVkIGVycm9yIG9yIHllbGxvdyB3YXJuaW5nIG5leHQgdG8gdGhlIHJlc291cmNlIHdpdGggdGhlIGVycm9yLCBhcyB3ZWxsIGFzIHRoZSBwYXJlbnQgY29udGFpbmVycyB1cCB0byB0aGUgcHJvamVjdC48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNzEiIG5hbWU9InN0aHJlZjE3MSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlNhbXBsZSBFcnJvcnMgYW5kIFdhcm5pbmdzPC9wPgotPGltZyBzcmM9ImltZy9lcnJvcl9zYW1wbGUucG5nIiBhbHQ9IlRoaXMgZmlndXJlIHNob3dzIHNhbXBsZSBlcnJvciBhbmQgd2FybmluZyBpY29ucyBpbiB0aGUgRXhwbG9yZXIgdmlldy4iIHRpdGxlPSJUaGlzIGZpZ3VyZSBzaG93cyBzYW1wbGUgZXJyb3IgYW5kIHdhcm5pbmcgaWNvbnMgaW4gdGhlIEV4cGxvcmVyIHZpZXcuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDI0Lmh0bSNDSUhGRURFSSI+RXJyb3IgbWVzc2FnZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDI1Lmh0bSNDSUhHRUFJSiI+V2FybmluZyBtZXNzYWdlczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08cD48YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9jcHJidmlldy5odG0iPlByb2JsZW1zIHZpZXc8L2E+PC9wPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2ZlZTFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkVycm9yIG1lc3NhZ2VzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ1WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkVycm9yIG1lc3NhZ2VzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIRkVERUkiIG5hbWU9IkNJSEZFREVJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FcnJvciBtZXNzYWdlczxhIGlkPSJzdGhyZWYxNzIiIG5hbWU9InN0aHJlZjE3MiI+PC9hPjwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gZXJyb3IgbWVzc2FnZXMgKGluY2x1ZGluZyBob3cgdG8gcmVzb2x2ZSB0aGUgaXNzdWUpIHlvdSBtYXkgZW5jb3VudGVyIHdoaWxlIHdvcmtpbmcgd2l0aCBEYWxpLjwvcD4KLTxhIGlkPSJzdGhyZWYxNzMiIG5hbWU9InN0aHJlZjE3MyI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5BdHRyaWJ1dGUgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtBVFRSSUJVVEVfX05BTUUmZ3Q7PC9zcGFuPiIgaGFzIGludmFsaWQgbWFwcGluZyB0eXBlIGluIHRoaXMgY29udGV4dDwvcD4KLTxwPlRoZSBtYXBwZWQgYXR0cmlidXRlIGlzIGludmFsaWQuIEVpdGhlciBjaGFuZ2UgdGhlIG1hcHBpbmcgdHlwZSBvciBjaGFuZ2UgdGhlIGVudGl0eSB0eXBlLjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj4iTWFwcGluZyBhbiBlbnRpdHkiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08YSBpZD0ic3RocmVmMTc0IiBuYW1lPSJzdGhyZWYxNzQiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+QXR0cmlidXRlICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7QVRUUklCVVRFX05BTUUmZ3Q7PC9zcGFuPiIgY2Fubm90IGJlIHJlc29sdmVkLjwvcD4KLTxwPkRhbGkgY2Fubm90IG1hcCB0aGUgYXR0cmlidXRlIHRvIGEgZGF0YWJhc2UgdGFibGUgYW5kIGNvbHVtbi4gVmVyaWZ5IHRoYXQgeW91IGRhdGFiYXNlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gaXMgY29ycmVjdC48L3A+Ci08cD5TZWUgPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj4iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08YSBpZD0ic3RocmVmMTc1IiBuYW1lPSJzdGhyZWYxNzUiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+Q2xhc3MgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDTEFTU19OQU1FJmd0Ozwvc3Bhbj4iIGlzIG5vdCBhbm5vdGF0ZWQgYXMgYSBwZXJzaXN0ZW50IGNsYXNzLjwvcD4KLTxwPlRoZSBjbGFzcyBoYXMgbm90IGJlZW4gaWRlbnRpZmllZCBhcyBhIHBlcnNpc3RlbnQgY2xhc3MuIENvbmZpZ3VyZSB0aGUgY2xhc3MgYXMgYW4gRW50aXR5LCBNYXBwZWQgU3VwZXJjbGFzcywgb3IgRW1iZWRkYWJsZSBwZXJzaXN0ZW50IGVudGl0eS48L3A+Ci08cD5TZWUgPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj4iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiPC9hPi48L3A+Ci08YSBpZD0ic3RocmVmMTc2IiBuYW1lPSJzdGhyZWYxNzYiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+Q29sdW1uICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIgY2Fubm90IGJlIHJlc29sdmVkLjwvcD4KLTxwPllvdSBtYXBwZWQgYW4gZW50aXR5J3MgZmllbGQgdG8gYW4gaW5jb3JyZWN0IG9yIGludmFsaWQgY29sdW1uIGluIHRoZSBkYXRhYmFzZSB0YWJsZS4gQnkgZGVmYXVsdCwgRGFsaSB3aWxsIGF0dGVtcHQgdG8gbWFwIGVhY2ggZmllbGQgaW4gdGhlIGVudGl0eSB3aXRoIGFuIGlkZW50aWNhbGx5IG5hbWVkIHJvdyBpbiB0aGUgZGF0YWJhc2UgdGFibGUuIElmIHRoZSBmaWVsZCdzIG5hbWUgZGlmZmVycyBmcm9tIHRoZSByb3cncyBuYW1lLCB5b3UgbXVzdCBleHBsaWNpdGx5IGNyZWF0ZSB0aGUgbWFwcGluZy48L3A+Ci08cD5NYXAgdGhlIGZpZWxkIHRvIGEgdmFsaWQgcm93IGluIHRoZSBkYXRhYmFzZSB0YWJsZSBhcyBzaG93biBpbiA8YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj4iTWFwcGluZyBhbiBlbnRpdHkiPC9hPi48L3A+Ci08YSBpZD0ic3RocmVmMTc3IiBuYW1lPSJzdGhyZWYxNzciPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+RHVwbGljYXRlIGNsYXNzICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q0xBU1NfTkFNRSZndDs8L3NwYW4+Ii48L3A+Ci08cD5Zb3UgY3JlYXRlZCB0byBwZXJzaXN0ZW5jZSBjbGFzc2VzIHdpdGggdGhlIHNhbWUgbmFtZS4gRWFjaCBKYXZhIGNsYXNzIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lLiBTZWUgPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj4iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08YSBpZD0ic3RocmVmMTc4IiBuYW1lPSJzdGhyZWYxNzgiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+RW50aXR5IGRvZXMgbm90IGhhdmUgYW4gSWQgb3IgRW1iZWRkZWQgSWQuPC9wPgotPHA+WW91IGNyZWF0ZWQgYSBwZXJzaXN0ZW50IGVudGl0eSB3aXRob3V0IGlkZW50aWZ5aW5nIGl0cyBwcmltYXJ5IGtleS4gQSBwZXJzaXN0ZW50IGVudGl0eSBtdXN0IGhhdmUgYSBwcmltYXJ5IGtleSBmaWVsZCBkZXNpZ25hdGVkIHdpdGggYW4gPGNvZGU+QElkPC9jb2RlPiBvciA8Y29kZT5ARW1iZWRkZWRJZDwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08cD5BZGQgYW4gSUQgbWFwcGluZyB0byB0aGUgZW50aXR5IGFzIHNob3duIGluIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+IklEIG1hcHBpbmciPC9hPiBvciA8YSBocmVmPSJ0YXNrczAxMi5odG0jQ0lIRElBRUUiPiJFbWJlZGRlZCBJRCBtYXBwaW5nIjwvYT4uPC9wPgotPGEgaWQ9InN0aHJlZjE3OSIgbmFtZT0ic3RocmVmMTc5Ij48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPk11bHRpcGxlIHBlcnNpc3RlbmNlLnhtbCBmaWxlcyBpbiBwcm9qZWN0LjwvcD4KLTxwPllvdSBjcmVhdGVkIGEgSlBBIHByb2plY3Qgd2l0aCBtb3JlIHRoYW4gb25lIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS4gRWFjaCBKUEEgcHJvamVjdCBtdXN0IGNvbnRhaW4gYSA8c3BhbiBjbGFzcz0iaXRhbGljIj5zaW5nbGU8L3NwYW4+IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08cD5TZWUgPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj4iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE4MCIgbmFtZT0ic3RocmVmMTgwIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPk5vIHBlcnNpc3RlbmNlIHVuaXQgZGVmaW5lZC48L3A+Ci08cD5UaGVyZSBpcyBubyBwZXJzaXN0ZW5jZSB1bml0IGRlZmluZWQgaW4gdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS4gVXNlIHRoZSAmbHQ7cGVyc2lzdGVuY2UtdW5pdCBuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7UEVSU0lTVEVOQ0VfVU5JVF9OQU1FJmd0Ozwvc3Bhbj4iIHRhZyB0byBkZWZpbmUgdGhlIHBlcnNpc3RlbnQgdW5pdC48L3A+Ci08cD5TZWUgPGEgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSNDSUhER0RDRCI+Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08YSBpZD0ic3RocmVmMTgxIiBuYW1lPSJzdGhyZWYxODEiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+Tm8gcGVyc2lzdGVuY2UueG1sIGZpbGUgaW4gcHJvamVjdC48L3A+Ci08cD5Zb3UgY3JlYXRlZCBhIEpQQSBwcm9qZWN0IHdpdGhvdXQgYSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuIEVhY2ggSlBBIHByb2plY3QgbXVzdCBjb250YWluIGEgPHNwYW4gY2xhc3M9Iml0YWxpYyI+c2luZ2xlPC9zcGFuPiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxODIiIG5hbWU9InN0aHJlZjE4MiI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5SZWZlcmVuY2VkIGNvbHVtbiAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iIGluIGpvaW4gY29sdW1uICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIgY2Fubm90IGJlIHJlc29sdmVkLjwvcD4KLTxwPlRoZSBjb2x1bW4gdGhhdCB5b3Ugc2VsZWN0ZWQgdG8gam9pbiBhIHJlbGF0aW9uc2hpcCBtYXBwaW5nIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBkYXRhYmFzZSB0YWJsZS4gRWl0aGVyIHNlbGVjdCBhIGRpZmZlcmVudCBjb2x1bW4gb24gdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxMS5odG0jQ0FDQkFFQkMiPkpvaW4gVGFibGUgSW5mb3JtYXRpb248L2E+IG9yIGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IGNvbHVtbiBvbiB0aGUgZGF0YWJhc2UgdGFibGUuPC9wPgotPHA+U2VlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPiJKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08YSBpZD0ic3RocmVmMTgzIiBuYW1lPSJzdGhyZWYxODMiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+U2NoZW1hICImbHQ7PHNwYW4gY2xhc3M9Iml0YWxpYyI+U0NIRU1BX05BTUU8L3NwYW4+Jmd0OyIgY2Fubm90IGJlIHJlc29sdmVkIGZvciB0YWJsZS9qb2luIHRhYmxlICImbHQ7PHNwYW4gY2xhc3M9Iml0YWxpYyI+VEFCTEVfTkFNRTwvc3Bhbj4mZ3Q7Ii48L3A+Ci08cD5EZWZpbmUgdGhlIGRlZmF1bHQgZGF0YWJhc2Ugc2NoZW1hIGluZm9ybWF0aW9uIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI0NJSERHRENEIj4iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxODQiIG5hbWU9InN0aHJlZjE4NCI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5UYWJsZSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBQkxFX05BTUUmZ3Q7PC9zcGFuPiIgY2Fubm90IGJlIHJlc29sdmVkLjwvcD4KLTxwPllvdSBhc3NvY2lhdGVkIGEgcGVyc2lzdGVudCBlbnRpdHkgdG8gYW4gaW5jb3JyZWN0IG9yIGludmFsaWQgZGF0YWJhc2UgdGFibGUuIEJ5IGRlZmF1bHQsIERhbGkgd2lsbCBhdHRlbXB0IHRvIGFzc29jaWF0ZSBlYWNoIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggYW4gaWRlbnRpY2FsbHkgbmFtZWQgZGF0YWJhc2UgdGFibGUuIElmIHRoZSBlbnRpdHkncyBuYW1lIGRpZmZlcnMgZnJvbSB0aGUgdGFibGUncyBuYW1lLCB5b3UgbXVzdCBleHBsaWNpdGx5IGNyZWF0ZSB0aGUgYXNzb2NpYXRpb24uPC9wPgotPHA+QXNzb2NpYXRlIHRoZSBlbnRpdHkgd2l0aCBhIHZhbGlkIGRhdGFiYXNlIHRhYmxlIGFzIHNob3duIGluIDxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIjwvYT4uPC9wPgotPGEgaWQ9InN0aHJlZjE4NSIgbmFtZT0ic3RocmVmMTg1Ij48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPlVucmVzb2x2ZWQgZ2VuZXJhdG9yICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7R0VORVJBVE9SX05BTUUmZ3Q7PC9zcGFuPiIgaXMgZGVmaW5lZCBpbiBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTxwPllvdSBjcmVhdGVkIGEgcGVyc2lzdGVuY2UgZW50aXR5IHRoYXQgdXNlcyBzZXF1ZW5jaW5nIG9yIGEgdGFibGUgZ2VuZXJhdG9yLCBidXQgZGlkIG5vdCBkZWZpbmUgdGhlIGdlbmVyYXRvciBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gRWl0aGVyIGRlZmluZSB0aGUgZ2VuZXJhdG9yIGJ5IHVzaW5nIGFuIGFubm90YXRpb24gb3IgaW5jbHVkaW5nIGl0IGluIHRoZSBYTUwgbWFwcGluZyBmaWxlLjwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08cD48YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9jcHJidmlldy5odG0iPlByb2JsZW1zIHZpZXc8L2E+PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI1Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YmJhY2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+V2FybmluZyBtZXNzYWdlczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJXYXJuaW5nIG1lc3NhZ2VzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIR0VBSUoiIG5hbWU9IkNJSEdFQUlKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5XYXJuaW5nIG1lc3NhZ2VzPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB3YXJuaW5nIG1lc3NhZ2VzIChpbmNsdWRpbmcgaG93IHRvIHJlc29sdmUgdGhlIGlzc3VlKSB5b3UgbWF5IGVuY291bnRlciB3aGlsZSB3b3JraW5nIHdpdGggRGFsaS48L3A+Ci08YSBpZD0ic3RocmVmMTg2IiBuYW1lPSJzdGhyZWYxODYiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+Q29ubmVjdGlvbiAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTk5FQ1RJT05fTkFNRSZndDs8L3NwYW4+IiBpcyBub3QgYWN0aXZlLiBObyB2YWxpZGF0aW9uIHdpbGwgYmUgZG9uZSBhZ2FpbnN0IHRoZSBkYXRhIHNvdXJjZS48L3A+Ci08cD5UaGUgZGF0YWJhc2UgY29ubmVjdGlvbiB5b3Ugc3BlY2lmaWVkIHRvIHVzZSB3aXRoIHRoZSBKUEEgcHJvamVjdCBpcyBub3QgYWN0aXZlLiBUaGUgSlBBIHByb2plY3QgcmVxdWlyZXMgYW4gYWN0aXZlIGNvbm5lY3Rpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE4NyIgbmFtZT0ic3RocmVmMTg3Ij48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPk5vIGNvbm5lY3Rpb24gc3BlY2lmaWVkIGZvciB0aGUgcHJvamVjdC4gTm8gZGF0YS1zcGVjaWZpYyB2YWxpZGF0aW9uIHdpbGwgYmUgcGVyZm9ybWVkLjwvcD4KLTxwPllvdSBjcmVhdGVkIGEgSlBBIHByb2plY3Qgd2l0aG91dCBzcGVjaWZ5aW5nIGEgZGF0YWJhc2UgY29ubmVjdGlvbi4gVGhlIEpQQSBwcm9qZWN0IHJlcXVpcmVzIGFuIGFjdGl2ZSBjb25uZWN0aW9uLjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPiJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI8L2E+IG9yIDxhIGhyZWY9InRhc2tzMDI2Lmh0bSNCQUJEQkNCSSI+Ik1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllcyI8L2E+IGZvciBpbmZvcm1hdGlvbiBvbiBzcGVjaWZ5aW5nIGEgZGF0YWJhc2UgY29ubmVjdGlvbi48L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPHA+PGEgaHJlZj0iLi4vb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvY29uY2VwdHMvY3ByYnZpZXcuaHRtIj5Qcm9ibGVtcyB2aWV3PC9hPjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyNi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjYuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTVhMDNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNb2RpZnlpbmcgcGVyc2lzdGVudCBwcm9qZWN0IHByb3BlcnRpZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJEQkNCSSIgbmFtZT0iQkFCREJDQkkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllczwvaDE+Ci08cD5FYWNoIHBlcnNpc3RlbnQgcHJvamVjdCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhIGRhdGFiYXNlIGNvbm5lY3Rpb24uIFRvIGNyZWF0ZSBhIG5ldyBkYXRhYmFzZSBjb25uZWN0aW9uLCBjbGljayA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPkRhdGFiYXNlIENvbm5lY3Rpb248L3NwYW4+IHVzZSB0aGUgTmV3IENvbm5lY3Rpb24gd2l6YXJkLjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBtb2RpZnkgdGhlIHZlbmRlci1zcGVjaWZpYyBwbGF0Zm9ybSBhbmQgZGF0YWJhc2UgY29ubmVjdGlvbiBhc3NvY2lhdGVkIHdpdGggeW91ciBKUEEgcHJvamVjdC48L3A+Ci08b2w+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgcHJvamVjdCBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkV4cGxvcmVyPC9zcGFuPiB2aWV3IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5Qcm9wZXJ0aWVzPC9zcGFuPi4gVGhlIFByb3BlcnRpZXMgcGFnZSBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE4OCIgbmFtZT0ic3RocmVmMTg4Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIFByb3BlcnRpZXMgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvcHJvamVjdF9wcm9wZXJ0aWVzX3Rhc2tzLnBuZyIgYWx0PSJUaGUgUGVyc2lzdGVuY2UgcGFnZS4iIHRpdGxlPSJUaGUgUGVyc2lzdGVuY2UgcGFnZS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5Db21wbGV0ZSBlYWNoIGZpZWxkIG9uIHRoZSA8YSBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNCQUJKSEJDSSI+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnM8L2E+IGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5PSzwvc3Bhbj4uPC9wPgotPC9saT4KLTwvb2w+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIj5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEphdmEgUGVyc2lzdGVuY2UgT3B0aW9uczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIj5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RpcHNfYW5kX3RyaWNrcy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ3OTE3Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+VGlwcyBhbmQgdHJpY2tzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IiBUaXBzIGFuZCB0cmlja3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSERIR0hCRiIgbmFtZT0iQ0hESEdIQkYiPjwvYT48L3A+Ci08aDE+VGlwcyBhbmQgdHJpY2tzPC9oMT4KLTxwPlRoZSBmb2xsb3dpbmcgdGlwcyBhbmQgdHJpY2tzIGdpdmUgc29tZSBoZWxwZnVsIGlkZWFzIGZvciBpbmNyZWFzaW5nIHlvdXIgcHJvZHVjdGl2aXR5LjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9IiNCQUJGSUlIQSI+PHNwYW4gY2xhc3M9ImJvbGQiPkRhdGFiYXNlIENvbm5lY3Rpb25zPC9zcGFuPjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0iI0JBQkNIQUhGIj48c3BhbiBjbGFzcz0iYm9sZCI+U2NoZW1hLWJhc2VkIHBlcnNpc3RlbmNlLnhtbDwvc3Bhbj48L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSB0aXBzIGFuZCB0cmlja3MgaW4gdGhpcyBjYXRlZ29yeS4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHRpcHMgYW5kIHRyaWNrcyBpbiB0aGlzIGNhdGVnb3J5LiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNyUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MiI+VGlwPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyIj5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MiIgaGVhZGVycz0icjFjMS10MiI+PGEgaWQ9IkJBQkZJSUhBIiBuYW1lPSJCQUJGSUlIQSI+PC9hPjxzcGFuIGNsYXNzPSJib2xkIj5EYXRhYmFzZSBDb25uZWN0aW9uczwvc3Bhbj48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyIHIxYzItdDIiPldoZW4gc3RhcnRpbmcgYSBuZXcgd29ya2JlbmNoIHNlc3Npb24sIGJlIHN1cmUgdG8gPGEgaHJlZj0iLi4vb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kb2MudXNlci9kb2MvaHRtbC9hc2MxMjI5NzAwMzQzMzUyLmh0bWwiPnJlY29ubmVjdCB0byB5b3VyIGRhdGFiYXNlPC9hPiAoaWYgeW91IGFyZSB3b3JraW5nIG9ubGluZSkuIFRoaXMgYWxsb3dzIERhbGkgdG8gcHJvdmlkZSBkYXRhYmFzZS1yZWxhdGVkIG1hcHBpbmcgYXNzaXN0YW5jZSBhbmQgdmFsaWRhdGlvbi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MiIgaGVhZGVycz0icjFjMS10MiI+PGEgaWQ9IkJBQkNIQUhGIiBuYW1lPSJCQUJDSEFIRiI+PC9hPjxzcGFuIGNsYXNzPSJib2xkIj5TY2hlbWEtYmFzZWQgcGVyc2lzdGVuY2UueG1sPC9zcGFuPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIgcjFjMi10MiI+SWYgeW91IGFyZSBiZWhpbmQgYSBmaXJld2FsbCwgeW91IG1heSBuZWVkIHRvIGNvbmZpZ3VyZSB5b3VyIEVjbGlwc2Ugd29ya3NwYWNlIHByb3h5IGluIHRoZSA8YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9yZWZlcmVuY2UvcmVmLTcyLmh0bSI+UHJlZmVyZW5jZXMgZGlhbG9nPC9hPiAoPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5QcmVmZXJlbmNlcyAmZ3Q7IEludGVybmV0ICZndDsgUHJveHkgU2V0dGluZ3M8L3NwYW4+KSB0byBwcm9wZXJseSB2YWxpZGF0ZSBhIHNjaGVtYS1iYXNlZCA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdG9jLnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzZkZWJlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90b2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2lzby04ODU5LTEnPz4KLTwhLS0gVXNlciBHdWlkZSAtLT4KLSAgPHRvYyBsYWJlbD0iRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFVzZXIgR3VpZGUiPgotICAgIDx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQuaHRtIiBsYWJlbD0iR2V0dGluZyBzdGFydGVkIj4KLSAgICAgIDx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDEuaHRtI0JBQkVGSENEIiBsYWJlbD0iUmVxdWlyZW1lbnRzIGFuZCBpbnN0YWxsYXRpb24iIC8+Ci0gICAgICA8dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAyLmh0bSNCQUJJR0NKQSIgbGFiZWw9IkRhbGkgcXVpY2sgc3RhcnQiPgotICAgICAgICA8dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAzLmh0bSNCQUJERkhEQSIgbGFiZWw9IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IiAvPgotICAgICAgICA8dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSNCQUJGR0RERyIgbGFiZWw9IkNyZWF0aW5nIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB3aXRoIHBlcnNpc3RlbnQgZmllbGRzIiAvPgotICAgICAgPC90b3BpYz4KLSAgICA8L3RvcGljPgotICAgIDx0b3BpYyBocmVmPSJjb25jZXB0cy5odG0iIGxhYmVsPSIgQ29uY2VwdHMiPgotICAgICAgPHRvcGljIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIiBsYWJlbD0iVW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlIiAvPgotICAgICAgPHRvcGljIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiAvPgotICAgICAgPHRvcGljIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyIgbGFiZWw9IlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSSI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJjb25jZXB0czAwMi5odG0jQ0hESEFHSUgiIGxhYmVsPSJUaGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJjb25jZXB0czAwMy5odG0jQ0hEQklKQUMiIGxhYmVsPSJUaGUgb3JtLnhtbCBmaWxlIiAvPgotICAgICAgPC90b3BpYz4KLSAgICA8L3RvcGljPgotICAgIDx0b3BpYyBocmVmPSJ0YXNrcy5odG0iIGxhYmVsPSIgVGFza3MiPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiIgbGFiZWw9IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDAxLmh0bSNCRUlCQURISCIgbGFiZWw9IkNvbnZlcnRpbmcgYSBKYXZhIFByb2plY3QgdG8gYSBKUEEgUHJvamVjdCIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNCQUJGQkpCRyIgbGFiZWw9IkNyZWF0aW5nIGEgSlBBIEVudGl0eSIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMDIuaHRtI0NJSEZFQkFJIiBsYWJlbD0iU3luY2hyb25pemluZyBjbGFzc2VzIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMDMuaHRtI3N0aHJlZjU2IiBsYWJlbD0iVXBncmFkaW5nIGRvY3VtZW50IHZlcnNpb24iIC8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jQ0lIREdEQ0QiIGxhYmVsPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDA0Lmh0bSNzdGhyZWY2MCIgbGFiZWw9IkNyZWF0aW5nIGFuIG9ybS54bWwgZmlsZSIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDA1Lmh0bSNDSUhCQ0RDRSIgbGFiZWw9Ildvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGUiIC8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSIgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSIgbGFiZWw9IkVudGl0eSIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDA3Lmh0bSNCQUJGRUlDRSIgbGFiZWw9IkVtYmVkZGFibGUiIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jQkFCREFHQ0kiIGxhYmVsPSJNYXBwZWQgc3VwZXJjbGFzcyIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSIgbGFiZWw9IlNwZWNpZnlpbmcgYWRkaXRpb25hbCB0YWJsZXMiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jQ0lIQ0NDSkQiIGxhYmVsPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAwOS5odG0jQkFCSUdCR0ciIGxhYmVsPSJDcmVhdGluZyBOYW1lZCBRdWVyaWVzIiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiIGxhYmVsPSJCYXNpYyBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIiBsYWJlbD0iRW1iZWRkZWQgbWFwcGluZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDEyLmh0bSNDSUhESUFFRSIgbGFiZWw9IkVtYmVkZGVkIElEIG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciIGxhYmVsPSJJRCBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTQuaHRtI0JBQkVJRUdEIiBsYWJlbD0iTWFueS10by1tYW55IG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiIGxhYmVsPSJNYW55LXRvLW9uZSBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTYuaHRtI0JBQkhHRUJEIiBsYWJlbD0iT25lLXRvLW1hbnkgbWFwcGluZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDE3Lmh0bSNCQUJGSEJDSiIgbGFiZWw9Ik9uZS10by1vbmUgbWFwcGluZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDE4Lmh0bSNCQUJIRkhFSSIgbGFiZWw9IlRyYW5zaWVudCBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTkuaHRtI0JBQkhJQklJIiBsYWJlbD0iVmVyc2lvbiBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMjAuaHRtI0NJSEJERUFKIiBsYWJlbD0iRWxlbWVudCBDb2xsZWN0aW9uIG1hcHBpbmciIC8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDIxLmh0bSNCQUJCQUdGSSIgbGFiZWw9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza3MwMjIuaHRtI0NJSEpJR0JFIiBsYWJlbD0iR2VuZXJhdGluZyB0YWJsZXMgZnJvbSBlbnRpdGllcyIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAyMy5odG0jQkFCRkFJQkEiIGxhYmVsPSJWYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXMiPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMjQuaHRtI0NJSEZFREVJIiBsYWJlbD0iRXJyb3IgbWVzc2FnZXMiIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAyNS5odG0jQ0lIR0VBSUoiIGxhYmVsPSJXYXJuaW5nIG1lc3NhZ2VzIiAvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAyNi5odG0jQkFCREJDQkkiIGxhYmVsPSJNb2RpZnlpbmcgcGVyc2lzdGVudCBwcm9qZWN0IHByb3BlcnRpZXMiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19nZW5lcmF0aW5nX3NjaGVtYV9mcm9tX2NsYXNzZXMuaHRtI0NJSEhCSkNKIiBsYWJlbD0iR2VuZXJhdGluZyBTY2hlbWEgZnJvbSBDbGFzc2VzIiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tfZ2VuZXJhdGVfY2xhc3Nlc19mcm9tX3NjaGVtYS5odG0jQ0lIQ0JISkQiIGxhYmVsPSJHZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hIiAvPgotICAgIDwvdG9waWM+Ci0gICAgPHRvcGljIGxhYmVsPSIgUmVmZXJlbmNlIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iV2l6YXJkcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciIGxhYmVsPSJDcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZCI+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3QuaHRtI0NBQ0JKQUdDIiBsYWJlbD0iTmV3IEpQQSBQcm9qZWN0IHBhZ2UiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9qYXZhX3BhZ2UuaHRtI0NJQUdFQkFBIiBsYWJlbD0iSmF2YSBQYWdlIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiIgbGFiZWw9IkpQQSBGYWNldCBwYWdlIiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0jQ0lBR0dHREYiIGxhYmVsPSJDcmVhdGUgSlBBIEVudGl0eSB3aXphcmQiPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfRW50aXR5Q2xhc3NQYWdlLmh0bSNDSUFGRUlHRiIgbGFiZWw9IkVudGl0eSBDbGFzcyBwYWdlIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfRW50aXR5UHJvcGVydGllc1BhZ2UuaHRtI0NJQURFQ0lBIiBsYWJlbD0iRW50aXR5IFByb3BlcnRpZXMgcGFnZSIgLz4KLSAgICAgICAgPC90b3BpYz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAwMi5odG0jQ0lBSUpDQ0UiIGxhYmVsPSJNYXBwaW5nIEZpbGUgV2l6YXJkIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDAzLmh0bSNDSUFKRUlESiIgbGFiZWw9Ik1hcHBpbmcgRmlsZSIgLz4KLSAgICAgICAgPC90b3BpYz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAwNC5odG0jQ0lBR0hDR0EiIGxhYmVsPSJHZW5lcmF0ZSBUYWJsZXMgZnJvbSBFbnRpdGllcyBXaXphcmQiIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtI0NJQUdCRkpFIiBsYWJlbD0iR2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX3NlbGVjdFRhYmxlcy5odG0jQ0lBSENHRUUiIGxhYmVsPSJTZWxlY3QgVGFibGVzIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfdGFibGVBc3NvY2lhdGlvbnMuaHRtI0NJQUNESUNCIiBsYWJlbD0iVGFibGUgQXNzb2NpYXRpb25zIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24uaHRtI0NJQUVKREJFIiBsYWJlbD0iQ3VzdG9taXplIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0jQ0lBQ0lHRUUiIGxhYmVsPSJDdXN0b21pemUgSW5kaXZpZHVhbCBFbnRpdGllcyIgLz4KLSAgICAgICAgPC90b3BpYz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jQ0lBRkdISUYiIGxhYmVsPSJDcmVhdGUgTmV3IEFzc29jaWF0aW9uIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX2Fzc29jaWF0aW9uX3RhYmxlLmh0bSNDSUFHSkhEQyIgbGFiZWw9IkFzc29jaWF0aW9uIFRhYmxlcyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX2pvaW5fY29sdW1ucy5odG0jQ0lBRUdFRUciIGxhYmVsPSJKb2luIENvbHVtbnMiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9hc3NvY2lhdGlvbl9jYXJkaW5hbGl0eS5odG0jQ0lBRklJRkgiIGxhYmVsPSJBc3NvY2lhdGlvbiBDYXJkaW5hbGl0eSIgLz4KLSAgICAgICAgPC90b3BpYz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9qYXhiX3NjaGVtYV93aXphcmQuaHRtI0NBQ0dBREZIIiBsYWJlbD0iR2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIFdpemFyZCI+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9zY2hlbWFfZnJvbV9jbGFzc2VzX3BhZ2UuaHRtI0NBQ0hCRUdKIiBsYWJlbD0iR2VuZXJhdGUgU2NoZW1hIGZyb20gQ2xhc3NlcyIgLz4KLSAgICAgICAgPC90b3BpYz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgbGFiZWw9IlByb3BlcnR5IHBhZ2VzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIiBsYWJlbD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKSI+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAwNi5odG0jQ0FDQ0FHR0MiIGxhYmVsPSJHZW5lcmFsIGluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDcuaHRtI0NBQ0lKQkdIIiBsYWJlbD0iQXR0cmlidXRlIG92ZXJyaWRlcyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDA4Lmh0bSNDQUNCSElEQSIgbGFiZWw9IlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDA5Lmh0bSNDQUNGSEdIRSIgbGFiZWw9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTAuaHRtI3N0aHJlZjI0MSIgbGFiZWw9IlF1ZXJpZXMiIC8+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIiBsYWJlbD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDQkhGSUoiIGxhYmVsPSJHZW5lcmFsIGluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTEuaHRtI0NBQ0JBRUJDIiBsYWJlbD0iSm9pbiBUYWJsZSBJbmZvcm1hdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDEyLmh0bSNDQUNGQ0VKQyIgbGFiZWw9IkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNDQUNGQ0NBQiIgbGFiZWw9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtI0NBQ0dER0hDIiBsYWJlbD0iSlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDEzLmh0bSNDQUNDQUNHSCIgbGFiZWw9IkdlbmVyYWwgaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAxNC5odG0jQ0FDRUFHQkciIGxhYmVsPSJQZXJzaXN0ZW5jZSBVbml0IGluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTUuaHRtI0NJQUZHQUlKIiBsYWJlbD0iR2VuZXJhdG9ycyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDE2Lmh0bSNDSUFJQkFBSiIgbGFiZWw9IlF1ZXJpZXMiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAxNy5odG0jQ0lBREdDSUQiIGxhYmVsPSJDb252ZXJ0ZXJzIiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIiBsYWJlbD0iSlBBIFN0cnVjdHVyZSB2aWV3IiAvPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbGxfZWRpdG9yLmh0bSNDSUFDQ0hJRCIgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBFZGl0b3IiPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbC5odG0jQ0lBQ0lGR0oiIGxhYmVsPSJHZW5lcmFsIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTguaHRtI0NJQUZGSklFIiBsYWJlbD0iQ29ubmVjdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDE5Lmh0bSNDSUFKQUZFRyIgbGFiZWw9IkN1c3RvbWl6YXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAyMC5odG0jQ0lBQkVEQ0giIGxhYmVsPSJDYWNoaW5nIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjEuaHRtI0NJQUJHSEhJIiBsYWJlbD0iTG9nZ2luZyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDIyLmh0bSNDSUFGSkNIRSIgbGFiZWw9Ik9wdGlvbnMiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAyMy5odG0jQ0lBQ0NGQ0IiIGxhYmVsPSJTY2hlbWEgR2VuZXJhdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDI0Lmh0bSNDSUFISkRGRiIgbGFiZWw9IlByb3BlcnRpZXMiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAyNS5odG0jQ0lBSENKQUgiIGxhYmVsPSJTb3VyY2UiIC8+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGxhYmVsPSJQcmVmZXJlbmNlcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNCQUJKSEJDSSIgbGFiZWw9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gSmF2YSBQZXJzaXN0ZW5jZSBPcHRpb25zIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDI3Lmh0bSNDQUNGQkFFSCIgbGFiZWw9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gVmFsaWRhdGlvbiBQcmVmZXJlbmNlcyIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgbGFiZWw9IkRpYWxvZ3MiPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDI5Lmh0bSNDQUNDR0VIQyIgbGFiZWw9IkVkaXQgSm9pbiBDb2x1bW5zIERpYWxvZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9zZWxlY3RfY2FzY2FkZV9kaWFsb2cuaHRtI0NJQUZER0lKIiBsYWJlbD0iU2VsZWN0IENhc2NhZGUgZGlhbG9nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX2VjbGlwc2VsaW5rX21hcHBpbmdfZmlsZS5odG0jQ0lBRURFSkYiIGxhYmVsPSJOZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIGRpYWxvZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9hZGRfY29udmVydGVyLmh0bSNDSUFHQ0dJSiIgbGFiZWw9IkFkZCBDb252ZXJ0ZXIgZGlhbG9nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX2NvbmZpZ3VyZV9qYXhiX2NsYXNzX2dlbmVyYXRpb25fZGlhbG9nLmh0bSNDQUNISEhKQSIgbGFiZWw9IkNvbmZpZ3VyZSBKQVhCIENsYXNzIEdlbmVyYXRpb24gZGlhbG9nIiAvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtI0JBQklGQkRCIiBsYWJlbD0iSlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlIiAvPgotICAgICAgPHRvcGljIGxhYmVsPSJJY29ucyBhbmQgYnV0dG9ucyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMzEuaHRtI0NBQ0dFQUNHIiBsYWJlbD0iSWNvbnMiIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMzIuaHRtI0NBQ0RKQ0VJIiBsYWJlbD0iQnV0dG9ucyIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDMzLmh0bSNDQUNCQkRJQiIgbGFiZWw9IkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb24iIC8+Ci0gICAgPC90b3BpYz4KLSAgICA8dG9waWMgaHJlZj0idGlwc19hbmRfdHJpY2tzLmh0bSIgbGFiZWw9IlRpcHMgYW5kIHRyaWNrcyI+Ci0gICAgICA8dG9waWMgaHJlZj0id2hhdHNfbmV3MDAxLmh0bSNzdGhyZWYzMDYiIGxhYmVsPSJJbXByb3ZlZCBJbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgTG9jYWxpemF0aW9uIiAvPgotICAgICAgPHRvcGljIGhyZWY9IndoYXRzX25ldzAwMi5odG0jQ0pBQ0VEREUiIGxhYmVsPSJNdWx0aXBsZSBJbXByb3ZlbWVudHMgdG8gdGhlIERhbGkgUGVyc3BlY3RpdmUiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0id2hhdHNfbmV3MDAzLmh0bSNDSkFESUZISiIgbGFiZWw9IlN1cHBvcnQgZm9yIEpQQSAyLjAgYW5kIEVjbGlwc2VMaW5rIiAvPgotICAgICAgPHRvcGljIGhyZWY9IndoYXRzX25ldzAwNC5odG0jQ0pBQklKRUMiIGxhYmVsPSJDb252ZXJzaW9uIG9mIEphdmEgUHJvamVjdHMgdG8gSlBBIFByb2plY3RzIiAvPgotICAgICAgPHRvcGljIGhyZWY9IndoYXRzX25ldzAwNS5odG0jQ0pBQ0pCREEiIGxhYmVsPSJFY2xpcHNlTGluayAyLnggU3VwcG9ydCIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ3aGF0c19uZXcwMDYuaHRtI3N0aHJlZjMwNyIgbGFiZWw9IlRhYmxlLXBlci1Db25jcmV0ZS1DbGFzcyBJbmhlcml0YW5jZSIgLz4KLSAgICA8L3RvcGljPgotICAgIDx0b3BpYyBocmVmPSJsZWdhbC5odG0iIGxhYmVsPSIgTGVnYWwiPgotICAgICAgPHRvcGljIGhyZWY9ImFib3V0Lmh0bSNzdGhyZWYzMDkiIGxhYmVsPSJBYm91dCB0aGlzIGNvbnRlbnQiIC8+Ci0gICAgPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUyOTRhMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+V2hhdCdzIG5ldzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSIgV2hhdCdzIG5ldyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9InN0aHJlZjI5MSIgbmFtZT0ic3RocmVmMjkxIj48L2E+IFdoYXQncyBuZXc8L3A+Ci08cD5UaGlzIHNlY3Rpb24gY29udGFpbnMgZGVzY3JpcHRpb25zIG9mIHRoZSBmb2xsb3dpbmcgbmV3IGZlYXR1cmVzIGFuZCBzaWduaWZpY2FudCBjaGFuZ2VzIG1hZGUgdG8gdGhlIERhbGkgT1IgTWFwcGluZyBUb29sIGZvciBSZWxlYXNlIDIuMzo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJ3aGF0c19uZXcwMDIuaHRtI0NKQUNFRERFIj5NdWx0aXBsZSBJbXByb3ZlbWVudHMgdG8gdGhlIERhbGkgUGVyc3BlY3RpdmU8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9IndoYXRzX25ldzAwMy5odG0jQ0pBRElGSEoiPlN1cHBvcnQgZm9yIEpQQSAyLjAgYW5kIEVjbGlwc2VMaW5rPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ3aGF0c19uZXcwMDQuaHRtI0NKQUJJSkVDIj5Db252ZXJzaW9uIG9mIEphdmEgUHJvamVjdHMgdG8gSlBBIFByb2plY3RzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ3aGF0c19uZXcwMDUuaHRtI0NKQUNKQkRBIj5FY2xpcHNlTGluayAyLnggU3VwcG9ydDwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDAxLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGNhNDQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5JbXByb3ZlZCBJbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgTG9jYWxpemF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkltcHJvdmVkIEludGVybmF0aW9uYWxpemF0aW9uIGFuZCBMb2NhbGl6YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+PGEgaWQ9InN0aHJlZjI5MiIgbmFtZT0ic3RocmVmMjkyIj48L2E+Ci08aDE+SW1wcm92ZWQgSW50ZXJuYXRpb25hbGl6YXRpb24gYW5kIExvY2FsaXphdGlvbjwvaDE+Ci08cD5UaGlzIHJlbGVhc2Ugb2YgdGhlIERhbGkgT1IgTWFwcGluZyBUb29sIHByb3ZpZGVzIGltcHJvdmVkIGludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBhbmQgbG9jYWxpemF0aW9uIHN1cHBvcnQuIERhbGkgcHJvamVjdHMgY2FuIHN1cHBvcnQgZGlmZmVyZW50IGxvY2FsZXMgYW5kIHByb2Nlc3Npbmcgb2YgaW50ZXJuYXRpb25hbCBkYXRhIChzdWNoIGFzIGRhdGVzIGFuZCBzdHJpbmdzKS48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDAyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmIxNWU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5NdWx0aXBsZSBJbXByb3ZlbWVudHMgdG8gdGhlIERhbGkgUGVyc3BlY3RpdmU8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTXVsdGlwbGUgSW1wcm92ZW1lbnRzIHRvIHRoZSBEYWxpIFBlcnNwZWN0aXZlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0pBQ0VEREUiIG5hbWU9IkNKQUNFRERFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5NdWx0aXBsZSBJbXByb3ZlbWVudHMgdG8gdGhlIERhbGkgUGVyc3BlY3RpdmU8L2gxPgotPHA+VGhlcmUgaGF2ZSBiZWVuIG11bHRpcGxlIGltcHJvdmVtZW50cyB0byB0aGUgRGFsaSBwZXJzcGVjdGl2ZXMgdG8gaW1wcm92ZSBpdHMgZWFzZS1vZi11c2U6PC9wPgotPHVsPgotPGxpPgotPHA+VGhlIDxhIGhyZWY9InJlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtI0NJQUdHR0RGIj5DcmVhdGUgSlBBIEVudGl0eSB3aXphcmQ8L2E+IG5vdyBhY2NlcHRzIHNob3J0IG5hbWVzIGFzIGF0dHJpYnV0ZSB0eXBlcy48L3A+Ci08L2xpPgotPGxpPgotPHA+RGFsaSB3aWxsIHBlcmZvcm0gdmFsaWRhdGlvbiBhZnRlciByZWZyZXNoaW5nIGRhdGFiYXNlIGluZm9ybWF0aW9uLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5EYWxpIGFsbG93cyBwcm9qZWN0LWxldmVsIGN1c3RvbWl6YXRpb24gZm9yIHZhbGlkYXRpb24gKGVycm9yIGFuZCB3YXJuaW5nIHJlcG9ydHMpPC9wPgotPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDAzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDYxY2M0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5TdXBwb3J0IGZvciBKUEEgMi4wIGFuZCBFY2xpcHNlTGluazwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJTdXBwb3J0IGZvciBKUEEgMi4wIGFuZCBFY2xpcHNlTGluayIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNKQURJRkhKIiBuYW1lPSJDSkFESUZISiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+U3VwcG9ydCBmb3IgSlBBIDIuMCBhbmQgRWNsaXBzZUxpbms8L2gxPgotPHA+VGhpcyByZWxlYXNlIG9mIHRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbCBzdXBwb3J0cyBnZW5lcmljIEpQQSAyLjAgYXMgd2VsbCBhcyBzcGVjaWZpYyBpdGVtcyBmb3IgRWNsaXNwZUxpbmsgMS4yLjwvcD4KLTx1bD4KLTxsaT4KLTxwPkRlcml2ZWQgSURzPC9wPgotPC9saT4KLTxsaT4KLTxwPkNhY2hpbmcgKFNoYXJlZCBDYWNoZSBhbmQgQ2FjaGFibGUpPC9wPgotPC9saT4KLTxsaT4KLTxwPkNhbm9uaWNhbCBtZXRhbW9kZWwgZ2VuZXJhdGlvbjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5PcmRlciBDb2x1bW4gY29uZmlndXJhdGlvbjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbGVtZW50Q29sbGVjdGlvbiBtYXBwaW5nIHR5cGU8L3A+Ci08L2xpPgotPGxpPgotPHA+Q2FzY2FkZSBkZXRhY2g8L3A+Ci08L2xpPgotPGxpPgotPHA+RGFsaSB3aWxsIHVwZ3JhZGUgeW91ciA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZyb20gSlBBIDEuMCB0byAyLjAuPC9wPgotPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWQ1NDViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Db252ZXJzaW9uIG9mIEphdmEgUHJvamVjdHMgdG8gSlBBIFByb2plY3RzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNvbnZlcnNpb24gb2YgSmF2YSBQcm9qZWN0cyB0byBKUEEgUHJvamVjdHMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSkFCSUpFQyIgbmFtZT0iQ0pBQklKRUMiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNvbnZlcnNpb24gb2YgSmF2YSBQcm9qZWN0cyB0byBKUEEgUHJvamVjdHM8L2gxPgotPHA+VGhlIERhbGkgT1IgTWFwcGluZyBUb29sIG5vdyB1c2VzIHRoZSBFY2xpcHNlIDxzcGFuIGNsYXNzPSJib2xkIj5Db25maWd1cmU8L3NwYW4+IG1lbnUgdG8gY29udmVydCBleGlzdGluZyBKYXZhIHByb2plY3RzIHRvIEpQQSBwcm9qZWN0cy48L3A+Ci08cD5TZWUgPGEgaHJlZj0idGFza3MwMDEuaHRtI0JFSUJBREhIIj4iQ29udmVydGluZyBhIEphdmEgUHJvamVjdCB0byBhIEpQQSBQcm9qZWN0IjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxZjk5OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RWNsaXBzZUxpbmsgMi54IFN1cHBvcnQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRWNsaXBzZUxpbmsgMi54IFN1cHBvcnQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSkFDSkJEQSIgbmFtZT0iQ0pBQ0pCREEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkVjbGlwc2VMaW5rIDIueCBTdXBwb3J0PC9oMT4KLTxwPlJlbGVhc2UgMi4zIHByb3ZpZGVzIHN1cHBvcnQgZm9yIEVjbGlwc2VMaW5rIDIueCBmZWF0dXJlcy48L3A+Ci08cD5FY2xpcHNlTGluayAodGhlIEVjbGlwc2UgUGVyc2lzdGVuY2UgU2VydmljZXMgUHJvamVjdCkgaXMgYSBjb21wbGV0ZSBwZXJzaXN0ZW5jZSBmcmFtZSB3b3JrLiBSZWZlciB0byA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay88L2E+PC9jb2RlPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDYuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTI4NjdhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5UYWJsZS1wZXItQ29uY3JldGUtQ2xhc3MgSW5oZXJpdGFuY2U8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iVGFibGUtcGVyLUNvbmNyZXRlLUNsYXNzIEluaGVyaXRhbmNlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPjxhIGlkPSJzdGhyZWYyOTMiIG5hbWU9InN0aHJlZjI5MyI+PC9hPgotPGgxPlRhYmxlLXBlci1Db25jcmV0ZS1DbGFzcyBJbmhlcml0YW5jZTwvaDE+Ci08cD5UaGUgRGFsaSBPUiBNYXBwaW5nIFRvb2wgbm93IHN1cHBvcnRzIHRoZSBKUEEgMS4wLW9wdGlvbmFsIHRhYmxlLXBlci1jb25jcmV0ZS1jbGFzcyBpbmhlcml0YW5jZSBvcHRpb24uIFRoaXMgZnVuY3Rpb25hbGl0eSBtYXkgYmUgcmVxdWlyZWQgaW4gSlBBIDIuMC48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2Y2M1YWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmc8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNTM1OWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW48L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQxNDU5NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmU8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuamF4Yi5jb3JlLnNjaGVtYWdlbi8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjhlMjFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuamF4Yi5jb3JlLnNjaGVtYWdlbjwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuIGFuZCBtb3ZlZCB0byBqYXhiIGNvbXBvbmVudDwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTY1ODc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpPC9uYW1lPgotCTxjb21tZW50PnJlbmFtZWQgdG8gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aTwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODgyMjVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5nZW48L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbjwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNTUyZjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuPC9uYW1lPgotCTxjb21tZW50Pm1vdmVkIHRvIGpheGIgY29tcG9uZW50PC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGMzMDE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuamF4Yi51aTwvbmFtZT4KLQk8Y29tbWVudD5tb3ZlZCB0byBqYXhiIGNvbXBvbmVudDwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy8uY3ZzaWdub3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTQwMWEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qcHRfMS4wLjAuKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTk2MzRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFlYzI5ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTA6MDkgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMWMwYzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmc7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMy4yLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2MDZiMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2Fib3V0LmluaSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDg4YjlkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ0aXBzQW5kVHJpY2tzSHJlZiIgY29udGFpbnMgdGhlIEhlbHAgdG9waWMgaHJlZiB0byBhIHRpcHMgYW5kIHRyaWNrcyBwYWdlIAotIyBvcHRpb25hbAotdGlwc0FuZFRyaWNrc0hyZWY9L29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtCi0KLQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9hYm91dC5tYXBwaW5ncyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZjE3MGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKUEEgU3VwcG9ydFxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgT3JhY2xlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDYsIDIwMTEuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTA4OWJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2NvbXBvbmVudC54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNTExMzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmciPgotPGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPgotPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmciIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5IiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmRiIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5nZW4iIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMDljMmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MTI2NjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpQQSBTdXBwb3J0Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRlODYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzZGFiMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmNlZjkwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDg6NTUgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM4ODVmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGI7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWx0b29scy5lZGl0b3IuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5nZW5lcmljLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEsMi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS51aSIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTgzN2ViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvY29tcG9uZW50LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIzYzk0Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLQotICBDb250cmlidXRvcnM6Ci0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci0KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkiPjxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkiIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTFlOTZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpQQSBEQiBVSQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi91aS9pbnRlcm5hbC9EVFBVaVRvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3VpL2ludGVybmFsL0RUUFVpVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4NzNmYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3VpL2ludGVybmFsL0RUUFVpVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSVByb2ZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LlByb2ZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZ2VuZXJpYy51aS53aXphcmQuTmV3SkRCQ0ZpbHRlcmVkQ1BXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogRFRQIFVJIHRvb2xzCi0gKi8KLXB1YmxpYyBjbGFzcyBEVFBVaVRvb2xzIHsKLQotCS8qKgotCSAqIExhdW5jaCB0aGUgRFRQIE5ldyBDb25uZWN0aW9uIFByb2ZpbGUgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBkYXRhYmFzZSBjb25uZWN0aW9uIHByb2ZpbGUuCi0JICogCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYWRkZWQgcHJvZmlsZSwgb3IgbnVsbCBpZiB0aGUgd2l6YXJkIHdhcyBjYW5jZWxsZWQuCi0JICogVGhlIG5hbWUgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYSBEYWxpIGNvbm5lY3Rpb24gcHJvZmlsZSBmcm9tCi0JICogSnB0SnBhRGJQbHVnaW4uZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZU5ld0Nvbm5lY3Rpb25Qcm9maWxlKCkgewotCQkvLyBGaWx0ZXIgZGF0YXNvdXJjZSBjYXRlZ29yeQotCQlOZXdKREJDRmlsdGVyZWRDUFdpemFyZCAgd2l6YXJkID0gbmV3IE5ld0pEQkNGaWx0ZXJlZENQV2l6YXJkKCk7Ci0JCVdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHdpemFyZCk7Ci0JCXdpemFyZERpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQotCQlMb2NhbFByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMb2NhbFByb2ZpbGVMaXN0ZW5lcigpOwotCQlQcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFByb2ZpbGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJU3RyaW5nIG5ld0NQTmFtZSA9IG51bGw7Ci0JCWlmICh3aXphcmREaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJLy8gYXNzdW1lIHRoZSBsYXN0IGFkZGVkIHByb2ZpbGUgaXMgdGhlIG9uZSB3ZSB3YW50Ci0JCQluZXdDUE5hbWUgPSBsaXN0ZW5lci5hZGRlZFByb2ZpbGUuZ2V0TmFtZSgpOwotCQl9Ci0JCVByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlUHJvZmlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlyZXR1cm4gbmV3Q1BOYW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFAgcHJvZmlsZSBsaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGxpc3RlbmVyIHNpbXBseSBob2xkcyBvbiB0byB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBjb25uZWN0aW9uCi0JICogcHJvZmlsZS4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgTG9jYWxQcm9maWxlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvZmlsZUxpc3RlbmVyIHsKLQkJSUNvbm5lY3Rpb25Qcm9maWxlIGFkZGVkUHJvZmlsZTsKLQkJCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVBZGRlZChJQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5hZGRlZFByb2ZpbGUgPSBwcm9maWxlOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVDaGFuZ2VkKElDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkKLQkJcHVibGljIHZvaWQgcHJvZmlsZURlbGV0ZWQoSUNvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotCi0vLwkvLyAqKioqKioqKioqIHZpZXdlciBmaWx0ZXIgKioqKioqKioqKgotLy8KLS8vCXN0YXRpYyBjbGFzcyBMb2NhbFZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0vLwotLy8JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBQkFTRV9DQVRFR09SWV9JRCA9ICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQlMb2NhbFZpZXdlckZpbHRlcigpIHsKLS8vCQkJc3VwZXIoKTsKLS8vCQl9Ci0vLwotLy8JCUBPdmVycmlkZQotLy8JCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLS8vCQkJQ1BXaXphcmROb2RlIHdpemFyZE5vZGUgPSAoQ1BXaXphcmROb2RlKSBlbGVtZW50OwotLy8JCQlJUHJvZmlsZVdpemFyZFByb3ZpZGVyIHdpemFyZFByb3ZpZGVyID0gd2l6YXJkTm9kZS5nZXRQcm92aWRlcigpOwotLy8JCQlpZiAod2l6YXJkUHJvdmlkZXIgaW5zdGFuY2VvZiBJV2l6YXJkQ2F0ZWdvcnlQcm92aWRlcikgewotLy8JCQkJcmV0dXJuIGZhbHNlOwotLy8JCQl9Ci0vLwkJCUlDYXRlZ29yeSBjYXRlZ29yeSA9IENvbm5lY3Rpb25Qcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFByb3ZpZGVyKAotLy8JCQkJCQkJKChQcm9maWxlV2l6YXJkUHJvdmlkZXIpIHdpemFyZFByb3ZpZGVyKS5nZXRQcm9maWxlKCkpLmdldENhdGVnb3J5KCk7Ci0vLwkJCQotLy8JCQkvLyBPbmx5IGRpc3BsYXkgd2l6YXJkcyBiZWxvbmcgdG8gZGF0YWJhc2UgY2F0ZWdvcnkKLS8vCQkJd2hpbGUgKGNhdGVnb3J5ICE9IG51bGwpIHsKLS8vCQkJCWlmIChjYXRlZ29yeS5nZXRJZCgpLmVxdWFscyhEQVRBQkFTRV9DQVRFR09SWV9JRCkpIHsKLS8vCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCX0KLS8vCQkJCWNhdGVnb3J5ID0gY2F0ZWdvcnkuZ2V0UGFyZW50KCk7Ci0vLwkJCX0KLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmMwZTNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJub25hY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NiOGU5Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYS5kYjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmI2NjA1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDg6NDAgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjMzZjNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuMTAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5KcHRKcGFEYlBsdWdpbgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5qZHQuY2xhc3NwYXRoO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsdG9vbHMuZWRpdG9yLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmpwYS5kYiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXI7eC1pbnRlcm5hbDo9dHJ1ZQotSW1wb3J0LVBhY2thZ2U6IGNvbS5pYm0uaWN1LnRleHQ7dmVyc2lvbj0iNC4wLjEiCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhMjU3OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL2NvbXBvbmVudC54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MmI0ZWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0KLSAgQ29udHJpYnV0b3JzOgotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIC0tPgotCi08Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQuanBhLmRiIj48ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmRiIiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQyODg4Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKUEEgREIKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ2F0YWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9DYXRhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NzZkM2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9DYXRhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGI7Ci0KLS8qKgotICogRGF0YWJhc2UgY2F0YWxvZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDYXRhbG9nCi0JZXh0ZW5kcyBTY2hlbWFDb250YWluZXIKLXsKLQkvLyBub3RoaW5nIHlldAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMjRkM2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuSmF2YVR5cGU7Ci0KLS8qKgotICogRGF0YWJhc2UgY29sdW1uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbHVtbgotCWV4dGVuZHMgRGF0YWJhc2VPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbHVtbidzIHRhYmxlLgotCSAqLwotCVRhYmxlIGdldFRhYmxlKCk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RyYWludHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyBwYXJ0IG9mIGl0cyB0YWJsZSdzIHByaW1hcnkga2V5LgotCSAqLwotCWJvb2xlYW4gaXNQYXJ0T2ZQcmltYXJ5S2V5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sdW1uIGlzIHBhcnQgb2Ygb25lIG9mIGl0cyB0YWJsZSdzIGZvcmVpZ24ga2V5cy4KLQkgKi8KLQlib29sZWFuIGlzUGFydE9mRm9yZWlnbktleSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyBwYXJ0IG9mIGEgdW5pcXVlIGNvbnN0cmFpbnQgZGVmaW5lZCBmb3IgaXRzCi0JICogdGFibGUuCi0JICovCi0JYm9vbGVhbiBpc1BhcnRPZlVuaXF1ZUNvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgbnVsbGFibGUuCi0JICovCi0JYm9vbGVhbiBpc051bGxhYmxlKCk7Ci0KLQotCS8vICoqKioqKioqKiogZGF0YSB0eXBlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29sdW1uJ3MgZGF0YXR5cGUuCi0JICovCi0JU3RyaW5nIGdldERhdGFUeXBlTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbHVtbidzIHR5cGUgaXMgbnVtZXJpYy4KLQkgKi8KLQlib29sZWFuIGlzTnVtZXJpYygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb2x1bW4ncyBwcmVjaXNpb24gaWYgaXQgaXMgYSBOdW1lcmljYWxEYXRhVHlwZTsKLQkgKiBvdGhlcndpc2UsIHJldHVybiAtMS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFByZWNpc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb2x1bW4ncyBzY2FsZSBpZiBpdCBpcyBhbiBFeGFjdE51bWVyaWNEYXRhVHlwZTsKLQkgKiBvdGhlcndpc2UsIHJldHVybiAtMS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNjYWxlKCk7Ci0KLQkvKioKLQkgKiBJZiB0aGUgY29sdW1uIGlzIGEgQ2hhcmFjdGVyU3RyaW5nRGF0YVR5cGUsIHJldHVybiBpdHMgbGVuZ3RoOwotCSAqIG90aGVyd2lzZSwgcmV0dXJuIC0xLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sdW1uJ3MgZGF0YXR5cGUgaXMgYSBMT0IgdHlwZQotCSAqIChpLmUuIEJMT0IsIENMT0IsIG9yIE5DTE9CKS4KLQkgKi8KLQlib29sZWFuIGlzTE9CKCk7Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSB0eXBlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIEphdmEgdHlwZSBkZWNsYXJhdGlvbiB0aGF0IGlzIHJlYXNvbmFibHkKLQkgKiBzaW1pbGFyIHRvIHRoZSBjb2x1bW4ncyBkYXRhIHR5cGUuCi0JICovCi0JU3RyaW5nIGdldEphdmFUeXBlRGVjbGFyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiBhIEphdmEgdHlwZSB0aGF0IGlzIHJlYXNvbmFibHkKLQkgKiBzaW1pbGFyIHRvIHRoZSBjb2x1bW4ncyBkYXRhIHR5cGUuCi0JICovCi0JSmF2YVR5cGUgZ2V0SmF2YVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIEphdmEgdHlwZSBkZWNsYXJhdGlvbiB0aGF0IGlzIHJlYXNvbmFibHkKLQkgKiBzaW1pbGFyIHRvIHRoZSBjb2x1bW4ncyBkYXRhIHR5cGUgYW5kIHN1aXRhYmxlIGZvciB1c2UgYXMgYQotCSAqIHByaW1hcnkga2V5IGZpZWxkLgotCSAqLwotCVN0cmluZyBnZXRQcmltYXJ5S2V5SmF2YVR5cGVEZWNsYXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgSmF2YSB0eXBlIHRoYXQgaXMgcmVhc29uYWJseQotCSAqIHNpbWlsYXIgdG8gdGhlIGNvbHVtbidzIGRhdGEgdHlwZSBhbmQgc3VpdGFibGUgZm9yIHVzZSBhcyBhCi0JICogcHJpbWFyeSBrZXkgZmllbGQuCi0JICovCi0JSmF2YVR5cGUgZ2V0UHJpbWFyeUtleUphdmFUeXBlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0Nvbm5lY3Rpb25BZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0Nvbm5lY3Rpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZTNkN2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Db25uZWN0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEFuIGVtcHR5IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDb25uZWN0aW9uTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkFkYXB0ZXIKLQlpbXBsZW1lbnRzIENvbm5lY3Rpb25MaXN0ZW5lcgotewotCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgZGF0YWJhc2VDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZmllZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBva1RvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgY2F0YWxvZ0NoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzY2hlbWFDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFNjaGVtYSBzY2hlbWEpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHNlcXVlbmNlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBTZXF1ZW5jZSBzZXF1ZW5jZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFRhYmxlIHRhYmxlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2x1bW5DaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIENvbHVtbiBjb2x1bW4pIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcmVpZ25LZXlDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Db25uZWN0aW9uTGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYjkxMjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Db25uZWN0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYjsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi0vKioKLSAqIEEgPGNvZGU+Q29ubmVjdGlvbkxpc3RlbmVyPC9jb2RlPiBpcyBub3RpZmllZCBvZiBhbnkgY2hhbmdlcyB0byBhIGNvbm5lY3Rpb24uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSU1hbmFnZWRDb25uZWN0aW9uTGlzdGVuZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uTGlzdGVuZXIKLQlleHRlbmRzIEV2ZW50TGlzdGVuZXIKLXsKLQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSk7Ci0JcHVibGljIHZvaWQgbW9kaWZpZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSk7Ci0JcHVibGljIGJvb2xlYW4gb2tUb0Nsb3NlKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpOwotCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKTsKLQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSk7Ci0KLQlwdWJsaWMgdm9pZCBkYXRhYmFzZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgRGF0YWJhc2UgZGF0YWJhc2UpOwotCXB1YmxpYyB2b2lkIGNhdGFsb2dDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIENhdGFsb2cgY2F0YWxvZyk7Ci0JcHVibGljIHZvaWQgc2NoZW1hQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBTY2hlbWEgc2NoZW1hKTsKLQlwdWJsaWMgdm9pZCBzZXF1ZW5jZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgU2VxdWVuY2Ugc2VxdWVuY2UpOwotCXB1YmxpYyB2b2lkIHRhYmxlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBUYWJsZSB0YWJsZSk7Ci0JcHVibGljIHZvaWQgY29sdW1uQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBDb2x1bW4gY29sdW1uKTsKLQlwdWJsaWMgdm9pZCBmb3JlaWduS2V5Q2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBGb3JlaWduS2V5IGZvcmVpZ25LZXkpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Db25uZWN0aW9uUHJvZmlsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Db25uZWN0aW9uUHJvZmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODgxNTg3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvblByb2ZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGI7Ci0KLWltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5qZGJjLklKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50czsKLQotLyoqCi0gKiBEYXRhYmFzZSBjb25uZWN0aW9uIHByb2ZpbGUKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvblByb2ZpbGUKLQlleHRlbmRzIERhdGFiYXNlT2JqZWN0Ci17Ci0JLy8gKioqKioqKioqKiBwcm9wZXJ0aWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29ubmVjdGlvbiBwcm9maWxlJ3MgZGF0YWJhc2UuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgaXMgaW5hY3RpdmUuCi0JICovCi0JRGF0YWJhc2UgZ2V0RGF0YWJhc2UoKTsKLQotCS8qKgotCSAqIFJldHVybiBJRCBvZiB0aGUgcHJvdmlkZXIgbWFuYWdpbmcgdGhlIERUUCBwcm9maWxlLgotCSAqLwotCVN0cmluZyBnZXRQcm92aWRlcklEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSdzIHN0YXRpYyBJRC4KLQkgKi8KLQlTdHJpbmcgZ2V0SW5zdGFuY2VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IGRhdGFiYXNlIG5hbWUuCi0JICovCi0JU3RyaW5nIGdldERhdGFiYXNlTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSBwcm9kdWN0IG5hbWUuCi0JICovCi0JU3RyaW5nIGdldERhdGFiYXNlUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSB2ZW5kb3IuCi0JICovCi0JU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIHZlcnNpb24uCi0JICovCi0JU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkcml2ZXIgY2xhc3MgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RHJpdmVyQ2xhc3NOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgY29ubmVjdGlvbiBVUkwuCi0JICovCi0JU3RyaW5nIGdldFVSTCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IHVzZXIgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0VXNlck5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCB1c2VyIHBhc3N3b3JkLgotCSAqLwotCVN0cmluZyBnZXRVc2VyUGFzc3dvcmQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgRHJpdmVyIGRlZmluaXRpb24uCi0JICovCi0JU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBqYXIgbGlzdCBmb3IgdGhlIGFzc29jaWF0ZWQgRHJpdmVyIGFzIGEgCi0JICogY29tbWEtZGVsaW1pdGVkIHN0cmluZy4KLQkgKi8KLQlTdHJpbmcgZ2V0RHJpdmVySmFyTGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhc3NvY2lhdGVkIERyaXZlciBkZWZpbml0aW9uLgotCSAqLwotCVN0cmluZyBnZXREcml2ZXJOYW1lKCk7Ci0KLQotCS8vICoqKioqKioqKiogaWRlbnRpZmllcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYWxsIGlkZW50aWZpZXJzIGFyZSB0byBiZSB0cmVhdGVkIGFzIHRob3VnaCB0aGV5IHdlcmUKLQkgKiBkZWxpbWl0ZWQuIFRoaXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY2xpZW50LXN1cHBsaWVkIGRhdGFiYXNlCi0JICogaWRlbnRpZmllciBhZGFwdGVyLgotCSAqLwotCWJvb2xlYW4gdHJlYXRJZGVudGlmaWVyc0FzRGVsaW1pdGVkKCk7Ci0KLQotCS8vICoqKioqKioqKiogY29ubmVjdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcHJvZmlsZSBpcyBlaXRoZXIgY29ubmVjdGVkIHRvIGEgbGl2ZSBkYXRhYmFzZQotCSAqIHNlc3Npb24gb3Igd29ya2luZyBvZmYtbGluZSAoaS5lLiBpdCBoYXMgYWNjZXNzIHRvIG1ldGEtZGF0YSkuCi0JICogQHNlZSAjaXNDb25uZWN0ZWQoKQotCSAqIEBzZWUgI2lzV29ya2luZ09mZmxpbmUoKQotCSAqLwotCWJvb2xlYW4gaXNBY3RpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwcm9maWxlIGlzIG5laXRoZXIgY29ubmVjdGVkIHRvIGEgbGl2ZSBkYXRhYmFzZQotCSAqIHNlc3Npb24gbm9yIHdvcmtpbmcgb2ZmLWxpbmUgKGkuZS4gaXQgaGFzIGFjY2VzcyB0byBtZXRhLWRhdGEpLgotCSAqIEBzZWUgI2lzQWN0aXZlKCkKLQkgKi8KLQlib29sZWFuIGlzSW5hY3RpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwcm9maWxlIGlzIGNvbm5lY3RlZCB0byBhIGxpdmUgZGF0YWJhc2Ugc2Vzc2lvbgotCSAqIChpLmUuIHRoZSBtZXRhLWRhdGEgY29tZXMgZnJvbSB0aGUgZGF0YWJhc2UpLCBhcyBvcHBvc2VkIHRvIHdvcmtpbmcKLQkgKiBvZmYtbGluZS4KLQkgKiBAc2VlICNpc0FjdGl2ZSgpCi0JICovCi0JYm9vbGVhbiBpc0Nvbm5lY3RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHByb2ZpbGUgaXMgbm90IGNvbm5lY3RlZCB0byBhIGxpdmUgZGF0YWJhc2Ugc2Vzc2lvbgotCSAqIChpLmUuIHRoZSBtZXRhLWRhdGEgY29tZXMgZnJvbSB0aGUgZGF0YWJhc2UpLCBhcyBvcHBvc2VkIHRvIHdvcmtpbmcKLQkgKiBvZmYtbGluZS4KLQkgKiBAc2VlICNpc0Nvbm5lY3RlZCgpCi0JICovCi0JYm9vbGVhbiBpc0Rpc2Nvbm5lY3RlZCgpOwotCi0JLyoqCi0JICogQ29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi0JICogQHNlZSAjZGlzY29ubmVjdCgpCi0JICovCi0Jdm9pZCBjb25uZWN0KCk7Ci0KLQkvKioKLQkgKiBEaXNjb25uZWN0IGZyb20gdGhlIGRhdGFiYXNlLgotCSAqIEBzZWUgI2Nvbm5lY3QoKQotCSAqLwotCXZvaWQgZGlzY29ubmVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKREJDIGNvbm5lY3Rpb24uCi0JICovCi0JQ29ubmVjdGlvbiBnZXRKREJDQ29ubmVjdGlvbigpOwotCi0KLQkvLyAqKioqKioqKioqIG9mZi1saW5lIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHByb2ZpbGUgaXMgd29ya2luZyBvZmYtbGluZSAoaS5lLiB0aGUgbWV0YS1kYXRhCi0JICogY29tZXMgZnJvbSBhIGxvY2FsIGNhY2hlKSwgYXMgb3Bwb3NlZCB0byBjb25uZWN0ZWQgdG8gYSBsaXZlCi0JICogZGF0YWJhc2Ugc2Vzc2lvbi4KLQkgKiBAc2VlICNpc0FjdGl2ZSgpCi0JICovCi0JYm9vbGVhbiBpc1dvcmtpbmdPZmZsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29ubmVjdGlvbiBmYWN0b3JpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZQotCSAqIGNvbm5lY3Rpb24gcHJvZmlsZSdzIHByb3ZpZGVyIHN1cHBvcnQgd29ya2luZyBvZmZsaW5lLgotCSAqLwotCWJvb2xlYW4gc3VwcG9ydHNXb3JrT2ZmbGluZU1vZGUoKTsKLQotCS8qKgotCSAqIFNhdmUgdGhlIHN0YXRlIG9mIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgZm9yIHdvcmtpbmcgaW4gYW4gb2ZmbGluZSBtb2RlLgotCSAqIElmIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgZG9lcyBub3Qgc3VwcG9ydCB3b3JraW5nIGluIGFuIG9mZmxpbmUgbW9kZSwgbm8KLQkgKiBleGNlcHRpb24gaXMgdGhyb3duIGFuZCB0aGUgbWV0aG9kIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCUlTdGF0dXMgc2F2ZVdvcmtPZmZsaW5lRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBzdXBwb3J0cyB3b3JraW5nIG9mZmxpbmUgYW5kIGRhdGEKLQkgKiBoYXMgYmVlbiBzYXZlZCBmb3Igd29ya2luZyBvZmZsaW5lLgotCSAqLwotCWJvb2xlYW4gY2FuV29ya09mZmxpbmUoKTsKLQotCS8qKgotCSAqIEJlZ2luIHdvcmtpbmcgb2ZmLWxpbmUuCi0JICovCi0JSVN0YXR1cyB3b3JrT2ZmbGluZSgpOwotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIGxpc3RlbmVyIHRvIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUuCi0JICovCi0Jdm9pZCBhZGRDb25uZWN0aW9uTGlzdGVuZXIoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gbGlzdGVuZXIgZnJvbSB0aGUgY29ubmVjdGlvbiBwcm9maWxlLgotCSAqLwotCXZvaWQgcmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RhbnRzICoqKioqKioqKioKLQotCVN0cmluZyBDT05ORUNUSU9OX1BST0ZJTEVfVFlQRSA9ICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmdlbmVyaWMuY29ubmVjdGlvblByb2ZpbGUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBEUklWRVJfREVGSU5JVElPTl9QUk9QX0lEID0gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVyRGVmaW5pdGlvbklEIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRFJJVkVSX0RFRklOSVRJT05fVFlQRV9QUk9QX0lEID0gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5kZWZuVHlwZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERSSVZFUl9KQVJfTElTVF9QUk9QX0lEID0gImphckxpc3QiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBEQVRBQkFTRV9TQVZFX1BXRF9QUk9QX0lEID0gSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlBST1BfUFJFRklYICsgInNhdmVQV0QiOyAgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Db25uZWN0aW9uUHJvZmlsZUFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvblByb2ZpbGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZjRhOTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Db25uZWN0aW9uUHJvZmlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYjsKLQotLyoqCi0gKiBBbiBlbXB0eSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0aW9uUHJvZmlsZUFkYXB0ZXIKLQlpbXBsZW1lbnRzIENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIKLXsKLQlwdWJsaWMgdm9pZCBjb25uZWN0aW9uUHJvZmlsZUFkZGVkKFN0cmluZyBuYW1lKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25uZWN0aW9uUHJvZmlsZVJlbW92ZWQoU3RyaW5nIG5hbWUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlUmVuYW1lZChTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0Nvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzE1MjE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGI7Ci0KLS8qKgotICogRGF0YWJhc2UgY29ubmVjdGlvbiBwcm9maWxlIGZhY3RvcnkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlIERUUCBjb25uZWN0aW9uIHByb2ZpbGVzIHRoZSBmYWN0b3J5IGNhbiB3cmFwIHdpdGgKLQkgKiBuZXcgY29ubmVjdGlvbiBwcm9maWxlcy4KLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldENvbm5lY3Rpb25Qcm9maWxlTmFtZXMoKTsKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBjb25uZWN0aW9uIHByb2ZpbGUgdGhhdCB3cmFwcyB0aGUgRFRQIGNvbm5lY3Rpb24KLQkgKiBwcm9maWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBEVFAgY29ubmVjdGlvbiBwcm9maWxlIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIG5hbWUuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UgaWRlbnRpZmllciBhZGFwdGVyIHRvIGFsbG93IGNsaWVudHMgdG8gY29udHJvbCBob3cKLQkgKiBkYXRhYmFzZSBpZGVudGlmaWVycyBhcmUgaGFuZGxlZC4KLQkgKi8KLQlDb25uZWN0aW9uUHJvZmlsZSBidWlsZENvbm5lY3Rpb25Qcm9maWxlKFN0cmluZyBuYW1lLCBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyIGFkYXB0ZXIpOwotCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhIGNvbm5lY3Rpb24gcHJvZmlsZSB0aGF0IHdyYXBzIHRoZSBEVFAgY29ubmVjdGlvbgotCSAqIHByb2ZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIERUUCBjb25uZWN0aW9uIHByb2ZpbGUgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8cD4KLQkgKiBDbGllbnRzIHNob3VsZCB1c2UgdGhpcyBtZXRob2Qgd2hlbiBhIEpQQSBwbGF0Zm9ybSBpcyB1bmF2YWlsYWJsZQotCSAqIChlLmcuIGR1cmluZyBwcm9qZWN0IGNyZWF0aW9uKS4gVGhlIHJldHVybmVkIGNvbm5lY3Rpb24gcHJvZmlsZSB3aWxsCi0JICogdXNlIHRoZSBkZWZhdWx0IGRhdGFiYXNlIGlkZW50aWZpZXIgYWRhcHRlci4KLQkgKi8KLQlDb25uZWN0aW9uUHJvZmlsZSBidWlsZENvbm5lY3Rpb25Qcm9maWxlKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBub3RpZmllZCBvZiBjaGFuZ2VzIHRvIHRoZSBEVFAKLQkgKiBjb25uZWN0aW9uIHByb2ZpbGVzLgotCSAqLwotCXZvaWQgYWRkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyLgotCSAqLwotCXZvaWQgcmVtb3ZlQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Db25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZWIxZTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Db25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotLyoqCi0gKiBBIDxjb2RlPlByb2ZpbGVMaXN0ZW5lcjwvY29kZT4gaXMgbm90aWZpZWQgb2YgYW55IGNoYW5nZXMgdG8gdGhlIERUUCBjb25uZWN0aW9uIHByb2ZpbGVzLgotICogPHA+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSVByb2ZpbGVMaXN0ZW5lcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyCi0JZXh0ZW5kcyBFdmVudExpc3RlbmVyCi17Ci0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBwcm9maWxlIGhhcyBiZWVuIGFkZGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlQWRkZWQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBwcm9maWxlIGhhcyBiZWVuIHJlbW92ZWQuCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVSZW1vdmVkKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgcHJvZmlsZSBoYXMgYmVlbiByZW5hbWVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlUmVuYW1lZChTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9EYXRhYmFzZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9EYXRhYmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWM0ODZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvRGF0YWJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGI7Ci0KLS8qKgotICogRGF0YWJhc2UKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGF0YWJhc2UKLQlleHRlbmRzIFNjaGVtYUNvbnRhaW5lcgotewotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2UncyBEVFAgZGF0YWJhc2UuCi0JICovCi0Jb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlIGdldERUUERhdGFiYXNlKCk7Ci0KLQotCS8vICoqKioqKioqKiogcHJvcGVydGllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGRhdGFiYXNlJ3MgdmVuZG9yLgotCSAqLwotCVN0cmluZyBnZXRWZW5kb3JOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlJ3MgdmVyc2lvbi4KLQkgKi8KLQlTdHJpbmcgZ2V0VmVyc2lvbigpOwotCi0KLQkvLyAqKioqKioqKioqIGNhdGFsb2dzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBkYXRhYmFzZSBzdXBwb3J0cyBjYXRhbG9ncy4gSWYgaXQgZG9lcywgYWxsIGRhdGFiYXNlCi0JICogb2JqZWN0cyBhcmUgY29udGFpbmVkIGJ5IHRoZSBkYXRhYmFzZSdzIGNhdGFsb2dzOyBvdGhlcndpc2UgYWxsIGRhdGFiYXNlCi0JICogb2JqZWN0cyBhcmUgY29udGFpbmVkIGJ5IHRoZSBkYXRhYmFzZSdzIHNjaGVtYXRhLgotCSAqIDxicj4KLQkgKiBQcmFjdGljYWxseSBzcGVha2luZzo8dWw+Ci0JICogICAgIDxsaT5JZiB7QGxpbmsgI3N1cHBvcnRzQ2F0YWxvZ3MoKX0gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPjx1bD4KLQkgKiAgICAgICAgIDxsaT57QGxpbmsgI2dldENhdGFsb2dzKCl9IHJldHVybnMgY2F0YWxvZ3MgdGhhdCBjb250YWluIHRoZSBkYXRhYmFzZSdzIHNjaGVtYXRhCi0JICogICAgICAgICA8bGk+e0BsaW5rICNnZXRTY2hlbWF0YSgpfSByZXR1cm5zIGFuIGVtcHR5IGl0ZXJhYmxlCi0JICogICAgIDwvdWw+Ci0JICogICAgIDxsaT5lbHNlPHVsPgotCSAqICAgICAgICAgPGxpPntAbGluayAjZ2V0Q2F0YWxvZ3MoKX0gcmV0dXJucyBhbiBlbXB0eSBpdGVyYWJsZQotCSAqICAgICAgICAgPGxpPntAbGluayAjZ2V0U2NoZW1hdGEoKX0gcmV0dXJucyB0aGUgZGF0YWJhc2UncyBzY2hlbWF0YQotCSAqICAgICA8L3VsPgotCSAqIDwvdWw+Ci0JICogVGhpcyBpcyBjb21wbGljYXRlZCBieSB0aGUgcHJlc2VuY2Ugb2YgYSAiZGVmYXVsdCIgY2F0YWxvZyB0aGF0IGNsaWVudHMgY2FuCi0JICogdXNlIHRvIGFsbG93IHRoZSBzcGVjaWZpY2F0aW9uIG9mIGEgY2F0YWxvZyB0byBiZSBvcHRpb25hbDsgYnV0IGNsaWVudHMKLQkgKiBtdXN0IG1hbmFnZSB0aGlzIGV4cGxpY2l0bHkuCi0JICogQHNlZSAjZ2V0Q2F0YWxvZ3MoKQotCSAqIEBzZWUgI2dldFNjaGVtYXRhKCkKLQkgKi8KLQlib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2UncyBjYXRhbG9ncy4KLQkgKiBSZXR1cm4gYW4gZW1wdHkgaXRlcmFibGUgaWYgdGhlIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICogQHNlZSAjc3VwcG9ydHNDYXRhbG9ncygpCi0JICovCi0JSXRlcmFibGU8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNhdGFsb2dzIHRoZSBkYXRhYmFzZSBjb250YWlucy4KLQkgKiBSZXR1cm4gemVybyBpZiB0aGUgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KLQkgKiBAc2VlICNzdXBwb3J0c0NhdGFsb2dzKCkKLQkgKi8KLQlpbnQgZ2V0Q2F0YWxvZ3NTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlJ3MgY2F0YWxvZyBuYW1lcywgc29ydGVkLgotCSAqIFJldHVybiBhbiBlbXB0eSBpdGVyYWJsZSBpZiB0aGUgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KLQkgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSB1c2VyIGlzIHNlbGVjdGluZyBhIGNhdGFsb2cgZnJvbSBhIHJlYWQtb25seQotCSAqIGNvbWJvLWJveCAoZS5nLiBpbiBhIHdpemFyZCkuCi0JICogQHNlZSAjZ2V0U29ydGVkQ2F0YWxvZ0lkZW50aWZpZXJzKCkKLQkgKiBAc2VlICNnZXRDYXRhbG9nTmFtZWQoU3RyaW5nKQotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0U29ydGVkQ2F0YWxvZ05hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNhdGFsb2cgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRoZSBuYW1lIG11c3QgYmUgYW4gZXhhY3QgbWF0Y2gKLQkgKiBvZiB0aGUgY2F0YWxvZydzIG5hbWUuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzLgotCSAqIEBzZWUgI3N1cHBvcnRzQ2F0YWxvZ3MoKQotCSAqIEBzZWUgI2dldFNvcnRlZENhdGFsb2dOYW1lcygpCi0JICogQHNlZSAjZ2V0Q2F0YWxvZ0ZvcklkZW50aWZpZXIoU3RyaW5nKQotCSAqLwotCUNhdGFsb2cgZ2V0Q2F0YWxvZ05hbWVkKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2UncyBjYXRhbG9nIGlkZW50aWZpZXJzLCBzb3J0ZWQgYnkgbmFtZS4KLQkgKiBSZXR1cm4gYW4gZW1wdHkgaXRlcmFibGUgaWYgdGhlIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICogVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgdXNlciBpcyBzZWxlY3RpbmcgYW4gaWRlbnRpZmllciB0aGF0IHdpbGwgYmUKLQkgKiBwbGFjZWQgaW4gYSB0ZXh0IGZpbGUgKGUuZy4gaW4gYSBKYXZhIGFubm90YXRpb24pLgotCSAqIEBzZWUgI2dldFNvcnRlZENhdGFsb2dOYW1lcygpCi0JICogQHNlZSAjZ2V0Q2F0YWxvZ0ZvcklkZW50aWZpZXIoU3RyaW5nKQotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0U29ydGVkQ2F0YWxvZ0lkZW50aWZpZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNhdGFsb2cgZm9yIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllci4gVGhlIGlkZW50aWZpZXIgc2hvdWxkCi0JICogYmUgYW4gU1FMIGlkZW50aWZpZXIgKGkuZS4gcXVvdGVkIHdoZW4gY2FzZS1zZW5zaXRpdmUgb3IgY29udGFpbmluZwotCSAqIHNwZWNpYWwgY2hhcmFjdGVycywgdW5xdW90ZWQgb3RoZXJ3aXNlKS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICogQHNlZSAjc3VwcG9ydHNDYXRhbG9ncygpCi0JICogQHNlZSAjZ2V0U29ydGVkQ2F0YWxvZ0lkZW50aWZpZXJzKCkKLQkgKiBAc2VlICNnZXRDYXRhbG9nTmFtZWQoU3RyaW5nKQotCSAqLwotCUNhdGFsb2cgZ2V0Q2F0YWxvZ0ZvcklkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSdzIGRlZmF1bHQgY2F0YWxvZywgYXMgZGVmaW5lZCBieSB0aGUgZGF0YWJhc2UgdmVuZG9yLgotCSAqIEluIG1vc3QgY2FzZXMgdGhlIGRlZmF1bHQgY2F0YWxvZydzIG5hbWUgd2lsbCBtYXRjaCB0aGUgdXNlciBuYW1lLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncyBvcgotCSAqIGlmIHRoZSBkZWZhdWx0IGNhdGFsb2cgZG9lcyBub3QgZXhpc3QgKGUuZy4gdGhlIGRhdGFiYXNlIGhhcyBubyBjYXRhbG9nCi0JICogd2hvc2UgbmFtZSBtYXRjaGVzIHRoZSB1c2VyIG5hbWUpLgotCSAqIEBzZWUgI3N1cHBvcnRzQ2F0YWxvZ3MoKQotCSAqIEBzZWUgI2dldERlZmF1bHRDYXRhbG9nSWRlbnRpZmllcigpCi0JICovCi0JQ2F0YWxvZyBnZXREZWZhdWx0Q2F0YWxvZygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSdzIGRlZmF1bHQgY2F0YWxvZyBpZGVudGlmaWVyLgotCSAqIFRoZSBkYXRhYmFzZSBtYXkgb3IgbWF5IG5vdCBoYXZlIGEgY2F0YWxvZyB3aXRoIGEgbWF0Y2hpbmcgbmFtZS4KLQkgKiBAc2VlICNzdXBwb3J0c0NhdGFsb2dzKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0Q2F0YWxvZygpCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nSWRlbnRpZmllcigpOwotCi0KLQkvLyAqKioqKioqKioqIHV0aWxpdHkgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZWxlY3QgYW5kIHJldHVybiBmcm9tIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiB0YWJsZXMgdGhlCi0JICogdGFibGUgaWRlbnRpZmllZCBieSB0aGUgc3BlY2lmaWVkIGlkZW50aWZpZXIuCi0JICogVGhlIGlkZW50aWZpZXIgc2hvdWxkIGJlIGFuIFNRTCBpZGVudGlmaWVyIChpLmUuIGRlbGltaXRlZCBhcwotCSAqIGFwcHJvcHJpYXRlKS4KLQkgKi8KLQlUYWJsZSBzZWxlY3RUYWJsZUZvcklkZW50aWZpZXIoSXRlcmFibGU8VGFibGU+IHRhYmxlcywgU3RyaW5nIGlkZW50aWZpZXIpOwotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIG5hbWUgdG8gYSBkYXRhYmFzZS1hcHByb3ByaWF0ZSBTUUwgaWRlbnRpZmllcgotCSAqIChpLmUuIGRlbGltaXQgdGhlIG5hbWUgYXMgYXBwcm9wcmlhdGUpLgotCSAqLwotCS8vIGl0IHNlZW1zIHdlIGRvbid0IG5lZWQgZGF0YWJhc2Ugb2JqZWN0LXNwZWNpZmljIGNvbnZlcnNpb25zIGhlcmU7Ci0JLy8gaS5lLiBzZXBhcmF0ZSBtZXRob2RzIGZvciB0YWJsZXMsIGNvbHVtbnMsIGV0Yy4KLQlTdHJpbmcgY29udmVydE5hbWVUb0lkZW50aWZpZXIoU3RyaW5nIG5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9EYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0RhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZjMTczZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0RhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgY2xpZW50cyBvZiB0aGUgRGFsaSBkYiBwYWNrYWdlIHRvIGNvbnRyb2wgd2hldGhlcgotICogZGF0YWJhc2UgaWRlbnRpZmllcnMgYXJlIHRvIGJlIHRyZWF0ZWQgYXMgdGhvdWdoIHRoZXkgYXJlIGRlbGltaXRlZCwgd2hpY2gsCi0gKiBtb3N0IHNpZ25pZmljYW50bHksIHVzdWFsbHkgbWVhbnMgdGhlIGlkZW50aWZpZXJzIGFyZSBjYXNlLXNlbnNpdGl2ZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBpZGVudGlmaWVycyBhcmUgdG8gYmUgdHJlYXRlZCBhcyB0aG91Z2ggdGhleSB3ZXJlCi0JICogZGVsaW1pdGVkLgotCSAqLwotCWJvb2xlYW4gdHJlYXRJZGVudGlmaWVyc0FzRGVsaW1pdGVkKCk7Ci0KLQotCS8qKgotCSAqIFRoaXMgYWRhcHRlciBzaW1wbHkgcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIHdoaWNoIGlzIGNvbXBhdGlibGUKLQkgKiB3aXRoIEpQQSAxLjAuCi0JICovCi0JZmluYWwgY2xhc3MgRGVmYXVsdAotCQlpbXBsZW1lbnRzIERhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0KCk7Ci0JCXB1YmxpYyBzdGF0aWMgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGVmYXVsdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gdHJlYXRJZGVudGlmaWVyc0FzRGVsaW1pdGVkKCkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gSlBBIDEuMAotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0RhdGFiYXNlT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0RhdGFiYXNlT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMGE1NDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9EYXRhYmFzZU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYjsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIEJlaGF2aW9yIGNvbW1vbiB0byBhbGwgZGF0YWJhc2Ugb2JqZWN0cy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGF0YWJhc2VPYmplY3QgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSBvYmplY3QncyBuYW1lLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIG9iamVjdCdzIDxlbT5pZGVudGlmaWVyPC9lbT4sIHdoaWNoIGlzIHRoZSBvYmplY3QncyBuYW1lCi0JICogbW9kaWZpZWQgc28gaXQgY2FuIGJlIHVzZWQgaW4gYW4gU1FMIHN0YXRlbWVudCAoZS5nLiBpZiB0aGUgbmFtZSBjb250YWlucwotCSAqIHNwZWNpYWwgY2hhcmFjdGVycyBvciBpcyBtaXhlZCBjYXNlLCBpdCB3aWxsIGJlIGRlbGltaXRlZCwgdHlwaWNhbGx5IGJ5Ci0JICogZG91YmxlLXF1b3RlcykuCi0JICovCi0JU3RyaW5nIGdldElkZW50aWZpZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2Ugb2JqZWN0J3MgPGVtPmlkZW50aWZpZXI8L2VtPiwgd2hpY2ggaXMgdGhlIG9iamVjdCdzIG5hbWUKLQkgKiBtb2RpZmllZCBzbyBpdCBjYW4gYmUgdXNlZCBpbiBhbiBTUUwgc3RhdGVtZW50IChlLmcuIGlmIHRoZSBuYW1lIGNvbnRhaW5zCi0JICogc3BlY2lhbCBjaGFyYWN0ZXJzIG9yIGlzIG1peGVkIGNhc2UsIGl0IHdpbGwgYmUgZGVsaW1pdGVkLCB0eXBpY2FsbHkgYnkKLQkgKiBkb3VibGUtcXVvdGVzKS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGRhdGFiYXNlIG9iamVjdCdzIGlkZW50aWZpZXIgbWF0Y2hlcyB0aGUKLQkgKiBzcGVjaWZpZWQgZGVmYXVsdCBuYW1lLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgdXNlZCBieSB0aGUgRGFsaSBlbnRpdHkgZ2VuZXJhdGlvbiBjb2RlIHRvIGRldGVybWluZSB3aGV0aGVyCi0JICogYSBnZW5lcmF0ZWQgYW5ub3RhdGlvbiBtdXN0IGV4cGxpY2l0bHkgaWRlbnRpZnkgYSBkYXRhYmFzZSBvYmplY3QKLQkgKiAoZS5nLiBhIHRhYmxlKSBvciB0aGUgZGVmYXVsdCAoYXMgc3BlY2lmaWVkIGhlcmUpIGFkZXF1YXRlbHkgaWRlbnRpZmllcwotCSAqIHRoZSBkYXRhYmFzZSBvYmplY3QgKHRha2luZyBpbnRvIGNvbnNpZGVyYXRpb24gY2FzZS1zZW5zaXRpdml0eSwKLQkgKiBzcGVjaWFsIGNoYXJhY3RlcnMsIGV0Yy4pLgotCSAqLwotCVN0cmluZyBnZXRJZGVudGlmaWVyKFN0cmluZyBkZWZhdWx0TmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIG9iamVjdCdzIGRhdGFiYXNlLgotCSAqLwotCURhdGFiYXNlIGdldERhdGFiYXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIG9iamVjdCdzIGNvbm5lY3Rpb24gcHJvZmlsZS4KLQkgKi8KLQlDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCi0KLQkvKioKLQkgKiBTb3J0IGJ5IG5hbWUuCi0JICovCi0JQ29tcGFyYXRvcjxEYXRhYmFzZU9iamVjdD4gREVGQVVMVF9DT01QQVJBVE9SID0KLQkJCW5ldyBDb21wYXJhdG9yPERhdGFiYXNlT2JqZWN0PigpIHsKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoRGF0YWJhc2VPYmplY3QgZGJPYmplY3QxLCBEYXRhYmFzZU9iamVjdCBkYk9iamVjdDIpIHsKLQkJCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShkYk9iamVjdDEuZ2V0TmFtZSgpLCBkYk9iamVjdDIuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRFbmNsb3NpbmdDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIuREVGQVVMVF9DT01QQVJBVE9SIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX07Ci0KLQlUcmFuc2Zvcm1lcjxEYXRhYmFzZU9iamVjdCwgU3RyaW5nPiBOQU1FX1RSQU5TRk9STUVSID0KLQkJCW5ldyBUcmFuc2Zvcm1lcjxEYXRhYmFzZU9iamVjdCwgU3RyaW5nPigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShEYXRhYmFzZU9iamVjdCBkYk9iamVjdCkgewotCQkJCQlyZXR1cm4gZGJPYmplY3QuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldEVuY2xvc2luZ0NsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIi5OQU1FX1RSQU5TRk9STUVSIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX07Ci0KLQlUcmFuc2Zvcm1lcjxEYXRhYmFzZU9iamVjdCwgU3RyaW5nPiBJREVOVElGSUVSX1RSQU5TRk9STUVSID0KLQkJCW5ldyBUcmFuc2Zvcm1lcjxEYXRhYmFzZU9iamVjdCwgU3RyaW5nPigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShEYXRhYmFzZU9iamVjdCBkYk9iamVjdCkgewotCQkJCQlyZXR1cm4gZGJPYmplY3QuZ2V0SWRlbnRpZmllcigpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldEVuY2xvc2luZ0NsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIi5JREVOVElGSUVSX1RSQU5TRk9STUVSIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX07Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0ZvcmVpZ25LZXkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvRm9yZWlnbktleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2MwYWJjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvRm9yZWlnbktleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYjsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotLyoqCi0gKiBEYXRhYmFzZSBmb3JlaWduIGtleQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBGb3JlaWduS2V5Ci0JZXh0ZW5kcyBEYXRhYmFzZU9iamVjdAotewotCS8vICoqKioqKioqKiogdGFibGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZm9yZWlnbiBrZXkncyA8ZW0+YmFzZTwvZW0+IHRhYmxlLgotCSAqLwotCVRhYmxlIGdldEJhc2VUYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmb3JlaWduIGtleSdzIDxlbT5yZWZlcmVuY2VkPC9lbT4gdGFibGUuCi0JICovCi0JVGFibGUgZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1uIHBhaXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZm9yZWlnbiBrZXkncyBjb2x1bW4gcGFpcnMuCi0JICovCi0JSXRlcmFibGU8Q29sdW1uUGFpcj4gZ2V0Q29sdW1uUGFpcnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgZm9yZWlnbiBrZXkncyBjb2x1bW4gcGFpcnMuCi0JICovCi0JaW50IGdldENvbHVtblBhaXJzU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmb3JlaWduIGtleSdzIHNpbmdsZSBjb2x1bW4gcGFpci4gVGhyb3cgYW4KLQkgKiB7QGxpbmsgSWxsZWdhbFN0YXRlRXhjZXB0aW9ufSBpZiB0aGUgZm9yZWlnbiBrZXkgaGFzIG1vcmUgdGhhbiBvbmUgY29sdW1uIHBhaXIuCi0JICovCi0JQ29sdW1uUGFpciBnZXRDb2x1bW5QYWlyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZvcmVpZ24ga2V5J3MgPGVtPmJhc2U8L2VtPiBjb2x1bW5zLgotCSAqLwotCUl0ZXJhYmxlPENvbHVtbj4gZ2V0QmFzZUNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZm9yZWlnbiBrZXkncyA8ZW0+YmFzZTwvZW0+IGNvbHVtbnMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIGJhc2UKLQkgKiB0YWJsZSdzIHByaW1hcnkga2V5LiAoVGhlIG5vbi1wcmltYXJ5IGtleSBiYXNlIGNvbHVtbnMgYXJlIG5vdCB1c2VkIHRvCi0JICogZ2VuZXJhdGUgYmFzaWMgYXR0cmlidXRlcyBkdXJpbmcgZW50aXR5IGdlbmVyYXRpb24uKQotCSAqLwotCUl0ZXJhYmxlPENvbHVtbj4gZ2V0Tm9uUHJpbWFyeUtleUJhc2VDb2x1bW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZvcmVpZ24ga2V5J3MgPGVtPnJlZmVyZW5jZWQ8L2VtPiBjb2x1bW5zLgotCSAqLwotCUl0ZXJhYmxlPENvbHVtbj4gZ2V0UmVmZXJlbmNlZENvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBmb3JlaWduIGtleSByZWZlcmVuY2VzIHRoZSBwcmltYXJ5IGtleSBvZiB0aGUKLQkgKiA8ZW0+cmVmZXJlbmNlZDwvZW0+IHRhYmxlIGFuZCB0aGF0IHByaW1hcnkga2V5IGhhcyBvbmx5IGEgc2luZ2xlIGNvbHVtbi4KLQkgKiBUaGlzIGNhbiBiZSB1c2VkIHdoZW4gZGV0ZXJtaW5pbmcgSlBBIGRlZmF1bHRzLgotCSAqLwotCWJvb2xlYW4gcmVmZXJlbmNlc1NpbmdsZUNvbHVtblByaW1hcnlLZXkoKTsKLQotCi0JLy8gKioqKioqKioqKiBKUEEgc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXBwcm9wcmlhdGUgbmFtZSBmb3IgYW4gYXR0cmlidXRlIHRoYXQgaG9sZHMgdGhlIGVudGl0eQotCSAqIG1hcHBlZCB0byB0aGUgZm9yZWlnbiBrZXkncyA8ZW0+cmVmZXJlbmNlZDwvZW0+IHRhYmxlLgotCSAqLwotCVN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBJZiB0aGUgbmFtZSBvZiB0aGUgPGVtPmJhc2U8L2VtPiBjb2x1bW4gYWRoZXJlcyB0byB0aGUgSlBBIHNwZWMgZm9yIGEKLQkgKiBkZWZhdWx0IG1hcHBpbmcgKGkuZS4gaXQgZW5kcyB3aXRoIGFuIHVuZGVyc2NvcmUgZm9sbG93ZWQgYnkgdGhlIG5hbWUKLQkgKiBvZiB0aGUgPGVtPnJlZmVyZW5jZWQ8L2VtPiBjb2x1bW4sIGFuZCB0aGUgPGVtPnJlZmVyZW5jZWQ8L2VtPiBjb2x1bW4gaXMgdGhlIHNpbmdsZQotCSAqIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgPGVtPnJlZmVyZW5jZWQ8L2VtPiB0YWJsZSksIHJldHVybiB0aGUgY29ycmVzcG9uZGluZwotCSAqIGRlZmF1bHQgYXR0cmlidXRlIG5hbWU6PHByZT4KLQkgKiAgICAgRm9yZWlnbktleShFTVAuQ1VCSUNMRV9JRCA9PiBDVUJJQ0xFLklEKSA9PiAiQ1VCSUNMRSIKLQkgKiA8L3ByZT4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgZG9lcyBub3QgYWRoZXJlIHRvIHRoZSBKUEEgc3BlYzo8cHJlPgotCSAqICAgICBGb3JlaWduS2V5KEVNUC5DVUJJQ0xFX0lEID0+IENVQklDTEUuQ1VCSUNMRV9JRCkgPT4gbnVsbAotCSAqICAgICBGb3JlaWduS2V5KEVNUC5DVUJJQ0xFID0+IENVQklDTEUuSUQpID0+IG51bGwKLQkgKiA8L3ByZT4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdEF0dHJpYnV0ZU5hbWUoKTsKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSAoZmllbGQgb3IgcHJvcGVydHkpIHRoYXQgaXMgbWFwcGVkIHRvIHRoZQotCSAqIGZvcmVpZ24ga2V5LCBidWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciB0aGUKLQkgKiBhdHRyaWJ1dGUncyA8Y29kZT5AamF2YXgucGVyc2lzdGVuY2UuSm9pbkNvbHVtbjwvY29kZT4gYW5ub3RhdGlvbidzCi0JICogPGNvZGU+bmFtZTwvY29kZT4gZWxlbWVudC4gUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBhdHRyaWJ1dGUKLQkgKiBtYXBzIHRvIHRoZSBqb2luIGNvbHVtbiBieSBkZWZhdWx0LgotCSAqIDxwPgotCSAqIFByZWNvbmRpdGlvbjogVGhlIGZvcmVpZ24ga2V5IGNvbnNpc3RzIG9mIGEgc2luZ2xlIGNvbHVtbiBwYWlyIHdob3NlCi0JICogcmVmZXJlbmNlZCBjb2x1bW4gaXMgdGhlIHNpbmdsZS1jb2x1bW4gcHJpbWFyeSBrZXkgb2YgdGhlIGZvcmVpZ24KLQkgKiBrZXkncyByZWZlcmVuY2VkIHRhYmxlLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgdXNlZCBieSB0aGUgZW50aXR5IGdlbmVyYXRpb24gY29kZSB0byBkZXRlcm1pbmUgd2hldGhlcgotCSAqIGEgZ2VuZXJhdGVkIGFubm90YXRpb24gbXVzdCBleHBsaWNpdGx5IGlkZW50aWZ5IHRoZSBqb2luIGNvbHVtbgotCSAqIG9yIHRoZSBjYWxjdWxhdGVkIGRlZmF1bHQgYWRlcXVhdGVseSBpZGVudGlmaWVzIHRoZSBqb2luIGNvbHVtbgotCSAqICh0YWtpbmcgaW50byBjb25zaWRlcmF0aW9uIGNhc2Utc2Vuc2l0aXZpdHksIHNwZWNpYWwgY2hhcmFjdGVycywgZXRjLikuCi0JICovCi0JU3RyaW5nIGdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcihTdHJpbmcgYXR0cmlidXRlTmFtZSk7Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1uIHBhaXIgaW50ZXJmYWNlICoqKioqKioqKioKLQotCS8qKgotCSAqIFBhaXIgdXAgdGhlIGZvcmVpZ24ga2V5J3MgY29sdW1uIHBhaXJzLCBtYXRjaGluZyBlYWNoIDxlbT5iYXNlPC9lbT4gY29sdW1uIHdpdGgKLQkgKiB0aGUgYXBwcm9wcmlhdGUgPGVtPnJlZmVyZW5jZWQ8L2VtPiBjb2x1bW4uCi0JICogQHNlZSAjZ2V0Q29sdW1uUGFpcnMoKQotCSAqLwotCWludGVyZmFjZSBDb2x1bW5QYWlyIHsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjb2x1bW4gcGFpcidzIDxlbT5iYXNlPC9lbT4gY29sdW1uLgotCQkgKi8KLQkJQ29sdW1uIGdldEJhc2VDb2x1bW4oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjb2x1bW4gcGFpcidzIDxlbT5yZWZlcmVuY2VkPC9lbT4gY29sdW1uLgotCQkgKi8KLQkJQ29sdW1uIGdldFJlZmVyZW5jZWRDb2x1bW4oKTsKLQotCQlDb21wYXJhdG9yPENvbHVtblBhaXI+IEJBU0VfQ09MVU1OX0NPTVBBUkFUT1IgPQotCQkJCW5ldyBDb21wYXJhdG9yPENvbHVtblBhaXI+KCkgewotCQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoQ29sdW1uUGFpciBjcDEsIENvbHVtblBhaXIgY3AyKSB7Ci0JCQkJCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGNwMS5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpLCBjcDIuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCQlyZXR1cm4gIkZvcmVpZ25LZXkuQ29sdW1uUGFpci5CQVNFX0NPTFVNTl9DT01QQVJBVE9SIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0pwdEpwYURiUGx1Z2luLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0pwdEpwYURiUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3M2FiODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9KcHRKcGFEYlBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5qZHQuY2xhc3NwYXRoLkRyaXZlckNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwuRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBEYWxpIEpQQSBEQiBwbHVnLWluIGxpZmVjeWNsZSBpbXBsZW1lbnRhdGlvbi4KLSAqIEdsb2JhbGx5IGF2YWlsYWJsZSBjb25uZWN0aW9uIHByb2ZpbGUgZmFjdG9yeS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIEpwdEpwYURiUGx1Z2luCi0JZXh0ZW5kcyBQbHVnaW4KLXsKLQkvLyBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBEVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgY29ubmVjdGlvblByb2ZpbGVGYWN0b3J5OwotCi0JcHJpdmF0ZSBzdGF0aWMgSnB0SnBhRGJQbHVnaW4gSU5TVEFOQ0U7ICAvLyBzb3J0YS1maW5hbAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEuZGIiOyAgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24gSlBUIERCIHBsdWctaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcHRKcGFEYlBsdWdpbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgewotCQlyZXR1cm4gSU5TVEFOQ0UuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5XygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsb2dnaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGxvZyhtc2csIG51bGwpOwotICAgIH0KLQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiBvciBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJbG9nKHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIHRocm93YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBhbmQgZXhjZXB0aW9uIG9yIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgdGhyb3dhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgc3RhdHVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgSU5TVEFOQ0UuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotCi0KLQkvLyAqKioqKioqKioqIHBsdWctaW4gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEpwdEpwYURiUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoSU5TVEFOQ0UgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIHRoaXMgY29udmVudGlvbiBpcyAqd2FjayouLi4gIH5ianYKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkvLyB0aGUgY29ubmVjdGlvbiBwcm9maWxlIGZhY3RvcnkgaXMgbGF6eS1pbml0aWFsaXplZC4uLgotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5zdG9wKCk7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQkJSU5TVEFOQ0UgPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSBnZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnlfKCkgewotCQlpZiAodGhpcy5jb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgPT0gbnVsbCkgewotCQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCk7Ci0JICAgICAgICB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5zdGFydCgpOwkJCQotCQl9Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeTsKLQl9Ci0KLQlwcml2YXRlIERUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSBidWlsZENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIERUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5pbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBqYXIgbGlzdCBjb250YWluZXIgZm9yIHRoZSBnaXZlbiBEVFAgZHJpdmVyLgotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoQ29udGFpbmVyIGJ1aWxkRHJpdmVyQ2xhc3NwYXRoQ29udGFpbmVyRm9yKFN0cmluZyBkcml2ZXJOYW1lKSB7Ci0JCXJldHVybiBuZXcgRHJpdmVyQ2xhc3NwYXRoQ29udGFpbmVyKGRyaXZlck5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvU2NoZW1hLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL1NjaGVtYS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWUzMzZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvU2NoZW1hLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiOwotCi0vKioKLSAqIERhdGFiYXNlIHNjaGVtYQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBTY2hlbWEKLQlleHRlbmRzIERhdGFiYXNlT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEncyBjb250YWluZXI7IGVpdGhlciBhIGNhdGFsb2cgb3IgYSBkYXRhYmFzZS4KLQkgKi8KLQlTY2hlbWFDb250YWluZXIgZ2V0Q29udGFpbmVyKCk7Ci0KLQotCS8vICoqKioqKioqKiogdGFibGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2NoZW1hJ3MgdGFibGVzLgotCSAqLwotCUl0ZXJhYmxlPFRhYmxlPiBnZXRUYWJsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHRhYmxlcyB0aGUgc2NoZW1hIGNvbnRhaW5zLgotCSAqLwotCWludCBnZXRUYWJsZXNTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUaGUgbmFtZSBtdXN0IGJlIGFuIGV4YWN0IG1hdGNoCi0JICogb2YgdGhlIHRhYmxlJ3MgbmFtZS4KLQkgKiBAc2VlICNnZXRUYWJsZUZvcklkZW50aWZpZXIoU3RyaW5nKQotCSAqLwotCSBUYWJsZSBnZXRUYWJsZU5hbWVkKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2NoZW1hJ3MgdGFibGUgaWRlbnRpZmllcnMsIHNvcnRlZCBieSBuYW1lLgotCSAqIEBzZWUgI2dldFRhYmxlRm9ySWRlbnRpZmllcihTdHJpbmcpCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRUYWJsZUlkZW50aWZpZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGlkZW50aWZpZXIuIFRoZSBpZGVudGlmaWVyIHNob3VsZAotCSAqIGJlIGFuIFNRTCBpZGVudGlmaWVyIChpLmUuIHF1b3RlZCB3aGVuIGNhc2Utc2Vuc2l0aXZlIG9yIGNvbnRhaW5pbmcKLQkgKiBzcGVjaWFsIGNoYXJhY3RlcnMsIHVucXVvdGVkIG90aGVyd2lzZSkuCi0JICogQHNlZSAjZ2V0VGFibGVOYW1lZChTdHJpbmcpCi0JICogQHNlZSAjZ2V0U29ydGVkVGFibGVJZGVudGlmaWVycygpCi0JICovCi0JVGFibGUgZ2V0VGFibGVGb3JJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKTsKLQotCi0JLy8gKioqKioqKioqKiBzZXF1ZW5jZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEncyBzZXF1ZW5jZXMuCi0JICovCi0JSXRlcmFibGU8U2VxdWVuY2U+IGdldFNlcXVlbmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2VxdWVuY2VzIHRoZSBzY2hlbWEgY29udGFpbnMuCi0JICovCi0JaW50IGdldFNlcXVlbmNlc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2VxdWVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRoZSBuYW1lIG11c3QgYmUgYW4gZXhhY3QgbWF0Y2gKLQkgKiBvZiB0aGUgc2VxdWVuY2UncyBuYW1lLgotCSAqIEBzZWUgI2dldFNlcXVlbmNlRm9ySWRlbnRpZmllcihTdHJpbmcpCi0JICovCi0JU2VxdWVuY2UgZ2V0U2VxdWVuY2VOYW1lZChTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNjaGVtYSdzIHNlcXVlbmNlIGlkZW50aWZlcnMsIHNvcnRlZCBieSBuYW1lLgotCSAqIEBzZWUgI2dldFNlcXVlbmNlRm9ySWRlbnRpZmllcihTdHJpbmcpCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRTZXF1ZW5jZUlkZW50aWZpZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNlcXVlbmNlIGZvciB0aGUgc3BlY2lmaWVkIGlkZW50aWZpZXIuIFRoZSBpZGVudGlmaWVyIHNob3VsZAotCSAqIGJlIGFuIFNRTCBpZGVudGlmaWVyIChpLmUuIHF1b3RlZCB3aGVuIGNhc2Utc2Vuc2l0aXZlIG9yIGNvbnRhaW5pbmcKLQkgKiBzcGVjaWFsIGNoYXJhY3RlcnMsIHVucXVvdGVkIG90aGVyd2lzZSkuCi0JICogQHNlZSAjZ2V0U2VxdWVuY2VOYW1lZChTdHJpbmcpCi0JICogQHNlZSAjZ2V0U29ydGVkU2VxdWVuY2VJZGVudGlmaWVycygpCi0JICovCi0JU2VxdWVuY2UgZ2V0U2VxdWVuY2VGb3JJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKTsKLQotCS8vICoqKioqKioqKiogc2VxdWVuY2VzICoqKioqKioqKioKLQotCXZvaWQgcmVmcmVzaCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9TY2hlbWFDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvU2NoZW1hQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmM2ZhZDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9TY2hlbWFDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYjsKLQotLyoqCi0gKiBTY2hlbWEgY29udGFpbmVyIChpLmUuIERhdGFiYXNlIG9yIENhdGFsb2cpCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYUNvbnRhaW5lcgotCWV4dGVuZHMgRGF0YWJhc2VPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5lcidzIHNjaGVtYXRhLgotCSAqLwotCUl0ZXJhYmxlPFNjaGVtYT4gZ2V0U2NoZW1hdGEoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHNjaGVtYXRhIGluIHRoZSBjb250YWluZXIuCi0JICovCi0JaW50IGdldFNjaGVtYXRhU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250YWluZXIncyBzY2hlbWEgbmFtZXMsIHNvcnRlZC4KLQkgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSB1c2VyIGlzIHNlbGVjdGluZyBhIHNjaGVtYSBmcm9tIGEgcmVhZC1vbmx5Ci0JICogY29tYm8tYm94IChlLmcuIGluIGEgd2l6YXJkKS4KLQkgKiBAc2VlICNnZXRTY2hlbWFOYW1lZChTdHJpbmcpCi0JICogQHNlZSAjZ2V0U29ydGVkU2NoZW1hSWRlbnRpZmllcnMoKQotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0U29ydGVkU2NoZW1hTmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2NoZW1hIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUaGUgbmFtZSBtdXN0IGJlIGFuIGV4YWN0IG1hdGNoCi0JICogb2YgdGhlIHNjaGVtYSdzIG5hbWUuCi0JICogQHNlZSAjZ2V0U29ydGVkU2NoZW1hTmFtZXMoKQotCSAqIEBzZWUgI2dldFNjaGVtYUZvcklkZW50aWZpZXIoU3RyaW5nKQotCSAqLwotCVNjaGVtYSBnZXRTY2hlbWFOYW1lZChTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5lcidzIHNjaGVtYSBpZGVudGlmaWVycywgc29ydGVkIGJ5IG5hbWUuCi0JICogVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgdXNlciBpcyBzZWxlY3RpbmcgYW4gaWRlbnRpZmllciB0aGF0IHdpbGwgYmUKLQkgKiBwbGFjZWQgaW4gYSB0ZXh0IGZpbGUgKGUuZy4gaW4gYSBKYXZhIGFubm90YXRpb24pLgotCSAqIEBzZWUgI2dldFNjaGVtYUZvcklkZW50aWZpZXIoU3RyaW5nKQotCSAqIEBzZWUgI2dldFNvcnRlZFNjaGVtYU5hbWVzKCkKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZFNjaGVtYUlkZW50aWZpZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNjaGVtYSBmb3IgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyLiBUaGUgaWRlbnRpZmllciBzaG91bGQKLQkgKiBiZSBhbiBTUUwgaWRlbnRpZmllciAoaS5lLiBxdW90ZWQgd2hlbiBjYXNlLXNlbnNpdGl2ZSBvciBjb250YWluaW5nCi0JICogc3BlY2lhbCBjaGFyYWN0ZXJzLCB1bnF1b3RlZCBvdGhlcndpc2UpLgotCSAqIEBzZWUgI2dldFNvcnRlZFNjaGVtYUlkZW50aWZpZXJzKCkKLQkgKiBAc2VlICNnZXRTY2hlbWFOYW1lZChTdHJpbmcpCi0JICovCi0JU2NoZW1hIGdldFNjaGVtYUZvcklkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250YWluZXIncyBkZWZhdWx0IHNjaGVtYSwgYXMgZGVmaW5lZCBieSB0aGUgZGF0YWJhc2UgdmVuZG9yLgotCSAqIEluIG1vc3QgY2FzZXMgdGhlIGRlZmF1bHQgc2NoZW1hJ3MgbmFtZSB3aWxsIG1hdGNoIHRoZSB1c2VyIG5hbWUuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBkZWZhdWx0IHNjaGVtYSBkb2VzIG5vdCBleGlzdCAoZS5nLiB0aGUKLQkgKiBjb250YWluZXIgaGFzIG5vIHNjaGVtYSB3aG9zZSBuYW1lIG1hdGNoZXMgdGhlIHVzZXIgbmFtZSkuCi0JICogQHNlZSAjZ2V0RGVmYXVsdFNjaGVtYUlkZW50aWZpZXIoKQotCSAqLwotCVNjaGVtYSBnZXREZWZhdWx0U2NoZW1hKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5lcidzIGRlZmF1bHQgc2NoZW1hIGlkZW50aWZpZXIuCi0JICogVGhlIGNvbnRhaW5lciBtYXkgb3IgbWF5IG5vdCBoYXZlIGEgc2NoZW1hIHdpdGggYSBtYXRjaGluZyBuYW1lLgotCSAqIEBzZWUgI2dldERlZmF1bHRTY2hlbWEoKQotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0U2NoZW1hSWRlbnRpZmllcigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9TZXF1ZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9TZXF1ZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODZjNzI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvU2VxdWVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYjsKLQotLyoqCi0gKiBEYXRhYmFzZSBzZXF1ZW5jZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBTZXF1ZW5jZQotCWV4dGVuZHMgRGF0YWJhc2VPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNlcXVlbmNlJ3Mgc2NoZW1hLgotCSAqLwotCVNjaGVtYSBnZXRTY2hlbWEoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyMjU4YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL1RhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiOwotCi0vKioKLSAqIERhdGFiYXNlIHRhYmxlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhYmxlCi0JZXh0ZW5kcyBEYXRhYmFzZU9iamVjdAotewotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUncyBzY2hlbWEuCi0JICovCi0JU2NoZW1hIGdldFNjaGVtYSgpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWJsZSdzIGNvbHVtbnMuCi0JICovCi0JSXRlcmFibGU8Q29sdW1uPiBnZXRDb2x1bW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjb2x1bW5zIHRoZSB0YWJsZSBjb250YWlucy4KLQkgKi8KLQlpbnQgZ2V0Q29sdW1uc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29sdW1uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUaGUgbmFtZSBtdXN0IGJlIGFuIGV4YWN0IG1hdGNoCi0JICogb2YgdGhlIGNvbHVtbidzIG5hbWUuCi0JICogQHNlZSAjZ2V0Q29sdW1uRm9ySWRlbnRpZmllcihTdHJpbmcpCi0JICovCi0JQ29sdW1uIGdldENvbHVtbk5hbWVkKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUncyBjb2x1bW4gaWRlbnRpZmVycywgc29ydGVkIGJ5IG5hbWUuCi0JICogQHNlZSAjZ2V0Q29sdW1uRm9ySWRlbnRpZmllcihTdHJpbmcpCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRDb2x1bW5JZGVudGlmaWVycygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb2x1bW4gZm9yIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllci4gVGhlIGlkZW50aWZpZXIgc2hvdWxkCi0JICogYmUgYW4gU1FMIGlkZW50aWZpZXIgKGkuZS4gcXVvdGVkIHdoZW4gY2FzZS1zZW5zaXRpdmUgb3IgY29udGFpbmluZwotCSAqIHNwZWNpYWwgY2hhcmFjdGVycywgdW5xdW90ZWQgb3RoZXJ3aXNlKS4KLQkgKiBAc2VlICNnZXRDb2x1bW5OYW1lZChTdHJpbmcpCi0JICogQHNlZSAjZ2V0U29ydGVkQ29sdW1uSWRlbnRpZmllcnMoKQotCSAqLwotCUNvbHVtbiBnZXRDb2x1bW5Gb3JJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKTsKLQotCi0JLy8gKioqKioqKioqKiBwcmltYXJ5IGtleSBjb2x1bW5zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUncyBwcmltYXJ5IGtleSBjb2x1bW5zLgotCSAqLwotCUl0ZXJhYmxlPENvbHVtbj4gZ2V0UHJpbWFyeUtleUNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHByaW1hcnkga2V5IGNvbHVtbnMgdGhlIHRhYmxlIGNvbnRhaW5zLgotCSAqLwotCWludCBnZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUncyBzaW5nbGUgcHJpbWFyeSBrZXkgY29sdW1uLiBUaHJvdyBhbgotCSAqIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IGlmIHRoZSB0YWJsZSBoYXMgbW9yZSB0aGFuIG9uZSBwcmltYXJ5IGtleSBjb2x1bW4uCi0JICovCi0JQ29sdW1uIGdldFByaW1hcnlLZXlDb2x1bW4oKTsKLQotCi0JLy8gKioqKioqKioqKiBmb3JlaWduIGtleXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWJsZSdzIGZvcmVpZ24ga2V5cy4KLQkgKi8KLQlJdGVyYWJsZTxGb3JlaWduS2V5PiBnZXRGb3JlaWduS2V5cygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZm9yZWlnbiBrZXlzIHRoZSB0YWJsZSBjb250YWlucy4KLQkgKi8KLQlpbnQgZ2V0Rm9yZWlnbktleXNTaXplKCk7Ci0KLQotCS8vICoqKioqKioqKiogam9pbiB0YWJsZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0YWJsZSBpcyBwb3NzaWJseSBhIDxlbT5qb2luPC9lbT4gdGFibGUKLQkgKiAoaS5lLiBpdCBjb250YWlucyBvbmx5IDIgZm9yZWlnbiBrZXlzKS4gV2hldGhlciB0aGUgdGFibGUgPGVtPmFjdHVhbGx5PC9lbT4gaXMKLQkgKiBhIDxlbT5qb2luPC9lbT4gdGFibGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgc2VtYW50aWNzIG9mIHRoZSBkYXRhYmFzZSBkZXNpZ24uCi0JICovCi0JYm9vbGVhbiBpc1Bvc3NpYmxlSm9pblRhYmxlKCk7Ci0KLQkvKioKLQkgKiBBc3N1bWluZyB0aGUgdGFibGUgaXMgYSA8ZW0+am9pbjwvZW0+IHRhYmxlLCByZXR1cm4gdGhlIGZvcmVpZ24ga2V5IHRvIHRoZQotCSAqIDxlbT5vd25pbmc8L2VtPiB0YWJsZS4KLQkgKiBAc2VlICNpc1Bvc3NpYmxlSm9pblRhYmxlKCkKLQkgKi8KLQlGb3JlaWduS2V5IGdldEpvaW5UYWJsZU93bmluZ0ZvcmVpZ25LZXkoKTsKLQotCS8qKgotCSAqIEFzc3VtaW5nIHRoZSB0YWJsZSBpcyBhIDxlbT5qb2luPC9lbT4gdGFibGUsIHJldHVybiB0aGUgZm9yZWlnbiBrZXkgdG8gdGhlCi0JICogPGVtPm5vbi1vd25pbmc8L2VtPiB0YWJsZS4KLQkgKiBAc2VlICNpc1Bvc3NpYmxlSm9pblRhYmxlKCkKLQkgKi8KLQlGb3JlaWduS2V5IGdldEpvaW5UYWJsZU5vbk93bmluZ0ZvcmVpZ25LZXkoKTsKLQotCS8qKgotCSAqIEFzc3VtaW5nIHRoZSB0YWJsZSBpcyBhIDxlbT5qb2luPC9lbT4gdGFibGUsIHJldHVybiB3aGV0aGVyIGl0cyBuYW1lIG1hdGNoZXMKLQkgKiB0aGUgSlBBIGRlZmF1bHQgKGkuZS4gPGNvZGU+Ik9XTklOR1RBQkxFX05PTk9XTklOR1RBQkxFIjwvY29kZT4pLgotCSAqIEBzZWUgI2lzUG9zc2libGVKb2luVGFibGUoKQotCSAqLwotCWJvb2xlYW4gam9pblRhYmxlTmFtZUlzRGVmYXVsdCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBDYXRhbG9nV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBDYXRhbG9nV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzczMDM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQQ2F0YWxvZ1dyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5DYXRhbG9nOwotCi0vKioKLSAqIFdyYXAgYSBEVFAgQ2F0YWxvZwotICovCi1maW5hbCBjbGFzcyBEVFBDYXRhbG9nV3JhcHBlcgotCWV4dGVuZHMgRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlcjxEVFBEYXRhYmFzZVdyYXBwZXI+Ci0JaW1wbGVtZW50cyBDYXRhbG9nCi17Ci0JLyoqIHRoZSB3cmFwcGVkIERUUCBjYXRhbG9nICovCi0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZyBkdHBDYXRhbG9nOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCURUUENhdGFsb2dXcmFwcGVyKERUUERhdGFiYXNlV3JhcHBlciBkYXRhYmFzZSwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZHRwQ2F0YWxvZykgewotCQlzdXBlcihkYXRhYmFzZSk7Ci0JCXRoaXMuZHRwQ2F0YWxvZyA9IGR0cENhdGFsb2c7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUERhdGFiYXNlT2JqZWN0V3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlJQ2F0YWxvZ09iamVjdCBnZXRDYXRhbG9nT2JqZWN0KCkgewotCQlyZXR1cm4gKElDYXRhbG9nT2JqZWN0KSB0aGlzLmR0cENhdGFsb2c7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2F0YWxvZ09iamVjdENoYW5nZWQoKSB7Ci0JCXN1cGVyLmNhdGFsb2dPYmplY3RDaGFuZ2VkKCk7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5jYXRhbG9nQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE+IGdldERUUFNjaGVtYXMoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENhdGFsb2cuZ2V0U2NoZW1hcygpOwotCX0KLQotCUBPdmVycmlkZQotCURUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hKSB7Ci0JCS8vIHRyeSB0byBzaG9ydC1jaXJjdWl0IHRoZSBzZWFyY2gKLQkJcmV0dXJuIHRoaXMud3JhcHMoZHRwU2NoZW1hLmdldENhdGFsb2coKSkgPwotCQkJCQkJdGhpcy5nZXRTY2hlbWFfKGR0cFNjaGVtYSkgOgotCQkJCQkJdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZyb21DYXRhbG9ncyhkdHBTY2hlbWEpOwotCX0KLQotCUBPdmVycmlkZQotCURUUFRhYmxlV3JhcHBlciBnZXRUYWJsZShvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGUpIHsKLQkJLy8gdHJ5IHRvIHNob3J0LWNpcmN1aXQgdGhlIHNlYXJjaAotCQlyZXR1cm4gdGhpcy53cmFwcyhkdHBUYWJsZS5nZXRTY2hlbWEoKS5nZXRDYXRhbG9nKCkpID8KLQkJCQkJCXRoaXMuZ2V0VGFibGVfKGR0cFRhYmxlKSA6Ci0JCQkJCQl0aGlzLmdldERhdGFiYXNlKCkuZ2V0VGFibGVGcm9tQ2F0YWxvZ3MoZHRwVGFibGUpOwotCX0KLQotCUBPdmVycmlkZQotCURUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCS8vIHRyeSB0byBzaG9ydC1jaXJjdWl0IHRoZSBzZWFyY2gKLQkJcmV0dXJuIHRoaXMud3JhcHMoZHRwQ29sdW1uLmdldFRhYmxlKCkuZ2V0U2NoZW1hKCkuZ2V0Q2F0YWxvZygpKSA/Ci0JCQkJCQl0aGlzLmdldENvbHVtbl8oZHRwQ29sdW1uKSA6Ci0JCQkJCQl0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q29sdW1uRnJvbUNhdGFsb2dzKGR0cENvbHVtbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERhdGFiYXNlT2JqZWN0IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ2F0YWxvZy5nZXROYW1lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JYm9vbGVhbiB3cmFwcyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCXJldHVybiB0aGlzLmR0cENhdGFsb2cgPT0gY2F0YWxvZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQQ29sdW1uV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBDb2x1bW5XcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MTNjYWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBDb2x1bW5XcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5kYmRlZmluaXRpb24uUHJlZGVmaW5lZERhdGFUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5kYXRhdHlwZXMuQ2hhcmFjdGVyU3RyaW5nRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuZGF0YXR5cGVzLkRhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmRhdGF0eXBlcy5FeGFjdE51bWVyaWNEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5kYXRhdHlwZXMuTnVtZXJpY2FsRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuZGF0YXR5cGVzLlByZWRlZmluZWREYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5kYXRhdHlwZXMuUHJpbWl0aXZlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db2x1bW47Ci0KLS8qKgotICogIFdyYXAgYSBEVFAgQ29sdW1uCi0gKi8KLWZpbmFsIGNsYXNzIERUUENvbHVtbldyYXBwZXIKLQlleHRlbmRzIERUUERhdGFiYXNlT2JqZWN0V3JhcHBlcjxEVFBUYWJsZVdyYXBwZXI+Ci0JaW1wbGVtZW50cyBDb2x1bW4KLXsKLQkvKiogdGhlIHdyYXBwZWQgRFRQIGNvbHVtbiAqLwotCXByaXZhdGUgZmluYWwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW47Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQQ29sdW1uV3JhcHBlcihEVFBUYWJsZVdyYXBwZXIgdGFibGUsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCXN1cGVyKHRhYmxlKTsKLQkJdGhpcy5kdHBDb2x1bW4gPSBkdHBDb2x1bW47Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUERhdGFiYXNlT2JqZWN0V3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlJQ2F0YWxvZ09iamVjdCBnZXRDYXRhbG9nT2JqZWN0KCkgewotCQlyZXR1cm4gKElDYXRhbG9nT2JqZWN0KSB0aGlzLmR0cENvbHVtbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjYXRhbG9nT2JqZWN0Q2hhbmdlZCgpIHsKLQkJc3VwZXIuY2F0YWxvZ09iamVjdENoYW5nZWQoKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmNvbHVtbkNoYW5nZWQodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbHVtbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbHVtbi5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIERUUFRhYmxlV3JhcHBlciBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGFydE9mUHJpbWFyeUtleSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGFibGUoKS5wcmltYXJ5S2V5Q29sdW1uc0NvbnRhaW5zKHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGFydE9mRm9yZWlnbktleSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGFibGUoKS5mb3JlaWduS2V5QmFzZUNvbHVtbnNDb250YWlucyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnRPZlVuaXF1ZUNvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbHVtbi5pc1BhcnRPZlVuaXF1ZUNvbnN0cmFpbnQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc051bGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb2x1bW4uaXNOdWxsYWJsZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGVOYW1lKCkgewotCQlEYXRhVHlwZSBkYXRhVHlwZSA9IHRoaXMuZHRwQ29sdW1uLmdldERhdGFUeXBlKCk7Ci0JCXJldHVybiAoZGF0YVR5cGUgPT0gbnVsbCkgPyBudWxsIDogZGF0YVR5cGUuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTnVtZXJpYygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29sdW1uLmdldERhdGFUeXBlKCkgaW5zdGFuY2VvZiBOdW1lcmljYWxEYXRhVHlwZTsKLQl9CQotCi0JcHVibGljIGludCBnZXRQcmVjaXNpb24oKSB7Ci0JCURhdGFUeXBlIGRhdGFUeXBlID0gdGhpcy5kdHBDb2x1bW4uZ2V0RGF0YVR5cGUoKTsKLQkJcmV0dXJuIChkYXRhVHlwZSBpbnN0YW5jZW9mIE51bWVyaWNhbERhdGFUeXBlKSA/Ci0JCQkJCQkoKE51bWVyaWNhbERhdGFUeXBlKSBkYXRhVHlwZSkuZ2V0UHJlY2lzaW9uKCkgOgotCQkJCQkJLTE7Ci0JfQotCi0JcHVibGljIGludCBnZXRTY2FsZSgpewotCQlEYXRhVHlwZSBkYXRhVHlwZSA9IHRoaXMuZHRwQ29sdW1uLmdldERhdGFUeXBlKCk7Ci0JCXJldHVybiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBFeGFjdE51bWVyaWNEYXRhVHlwZSkgPwotCQkJCQkJKChFeGFjdE51bWVyaWNEYXRhVHlwZSkgZGF0YVR5cGUpLmdldFNjYWxlKCkgOgotCQkJCQkJLTE7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCURhdGFUeXBlIGRhdGFUeXBlID0gdGhpcy5kdHBDb2x1bW4uZ2V0RGF0YVR5cGUoKTsKLQkJcmV0dXJuIChkYXRhVHlwZSBpbnN0YW5jZW9mIENoYXJhY3RlclN0cmluZ0RhdGFUeXBlKSA/Ci0JCQkJCQkoKENoYXJhY3RlclN0cmluZ0RhdGFUeXBlKSBkYXRhVHlwZSkuZ2V0TGVuZ3RoKCkgOgotCQkJCQkJLTE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMT0IoKSB7Ci0JCURhdGFUeXBlIGRhdGFUeXBlID0gdGhpcy5kdHBDb2x1bW4uZ2V0RGF0YVR5cGUoKTsKLQkJcmV0dXJuIChkYXRhVHlwZSBpbnN0YW5jZW9mIFByZWRlZmluZWREYXRhVHlwZSkgPwotCQkJCQkJcHJpbWl0aXZlVHlwZUlzTG9iKCgoUHJlZGVmaW5lZERhdGFUeXBlKSBkYXRhVHlwZSkuZ2V0UHJpbWl0aXZlVHlwZSgpKSA6Ci0JCQkJCQlmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFUeXBlRGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmdldEphdmFUeXBlKCkuZGVjbGFyYXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVR5cGUgZ2V0SmF2YVR5cGUoKSB7Ci0JCURhdGFUeXBlIGRhdGFUeXBlID0gdGhpcy5kdHBDb2x1bW4uZ2V0RGF0YVR5cGUoKTsKLQkJcmV0dXJuIChkYXRhVHlwZSBpbnN0YW5jZW9mIFByZWRlZmluZWREYXRhVHlwZSkgPwotCQkJY29udmVydFRvSlBBSmF2YVR5cGUodGhpcy5nZXRKYXZhVHlwZSgoUHJlZGVmaW5lZERhdGFUeXBlKSBkYXRhVHlwZSkpIDoKLQkJCURFRkFVTFRfSkFWQV9UWVBFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleUphdmFUeXBlRGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmdldFByaW1hcnlLZXlKYXZhVHlwZSgpLmRlY2xhcmF0aW9uKCk7Ci0JfQotCi0JcHVibGljIEphdmFUeXBlIGdldFByaW1hcnlLZXlKYXZhVHlwZSgpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0pQQVByaW1hcnlLZXlKYXZhVHlwZSh0aGlzLmdldEphdmFUeXBlKCkpOwotCX0KLQotCXByaXZhdGUgSmF2YVR5cGUgZ2V0SmF2YVR5cGUoUHJlZGVmaW5lZERhdGFUeXBlIGRhdGFUeXBlKSB7Ci0JCS8vIHRoaXMgaXMganVzdCBhIGJpdCBoYWNreTogbW92aW5nIGZyb20gYSB0eXBlIGRlY2xhcmF0aW9uIHRvIGEgY2xhc3MgbmFtZSB0byBhIHR5cGUgZGVjbGFyYXRpb24uLi4KLQkJU3RyaW5nIGR0cEphdmFDbGFzc05hbWUgPSB0aGlzLnJlc29sdmVEZWZpbml0aW9uKGRhdGFUeXBlKS5nZXRKYXZhQ2xhc3NOYW1lKCk7Ci0JCXJldHVybiBuZXcgU2ltcGxlSmF2YVR5cGUoUmVmbGVjdGlvblRvb2xzLmdldENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbihkdHBKYXZhQ2xhc3NOYW1lKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcmVkZWZpbmVkRGF0YVR5cGVEZWZpbml0aW9uIHJlc29sdmVEZWZpbml0aW9uKFByZWRlZmluZWREYXRhVHlwZSBkYXRhVHlwZSkgewotCQlyZXR1cm4gdGhpcy5nZXREYXRhYmFzZSgpLmdldERUUERlZmluaXRpb24oKS5nZXRQcmVkZWZpbmVkRGF0YVR5cGVEZWZpbml0aW9uKGRhdGFUeXBlLmdldE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JYm9vbGVhbiB3cmFwcyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5kdHBDb2x1bW4gPT0gY29sdW1uOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgY2xlYXIoKSB7Ci0JCS8vIG5vIHN0YXRlIHRvIGNsZWFyCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBKREJDIHNwZWMgc2F5cyBKREJDIGRyaXZlcnMgc2hvdWxkIGJlIGFibGUgdG8gbWFwIEJMT0JzIGFuZCBDTE9CcwotCSAqIGRpcmVjdGx5LCBidXQgdGhlIEpQQSBzcGVjIGRvZXMgbm90IGFsbG93IHRoZW0uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSmF2YVR5cGUgY29udmVydFRvSlBBSmF2YVR5cGUoSmF2YVR5cGUgamF2YVR5cGUpIHsKLQkJaWYgKGphdmFUeXBlLmVxdWFscyhCTE9CX0pBVkFfVFlQRSkpIHsKLQkJCXJldHVybiBCWVRFX0FSUkFZX0pBVkFfVFlQRTsKLQkJfQotCQlpZiAoamF2YVR5cGUuZXF1YWxzKENMT0JfSkFWQV9UWVBFKSkgewotCQkJcmV0dXJuIFNUUklOR19KQVZBX1RZUEU7Ci0JCX0KLQkJcmV0dXJuIGphdmFUeXBlOwotCX0KLQotCS8qKgotCSAqIFRoZSBKUEEgc3BlYyBbMi4xLjRdIHNheXMgb25seSB0aGUgZm9sbG93aW5nIHR5cGVzIGFyZSBhbGxvd2VkIGluCi0JICogcHJpbWFyeSBrZXkgZmllbGRzOjx1bD4KLQkgKiAgICAgPGxpPlt2YXJpYWJsZV0gcHJpbWl0aXZlcwotCSAqICAgICA8bGk+W3ZhcmlhYmxlXSBwcmltaXRpdmUgd3JhcHBlcnMKLQkgKiAgICAgPGxpPntAbGluayBqYXZhLmxhbmcuU3RyaW5nfQotCSAqICAgICA8bGk+e0BsaW5rIGphdmEudXRpbC5EYXRlfQotCSAqICAgICA8bGk+e0BsaW5rIGphdmEuc3FsLkRhdGV9Ci0JICogPC91bD4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBKYXZhVHlwZSBjb252ZXJ0VG9KUEFQcmltYXJ5S2V5SmF2YVR5cGUoSmF2YVR5cGUgamF2YVR5cGUpIHsKLQkJaWYgKGphdmFUeXBlLmlzVmFyaWFibGVQcmltaXRpdmUoKQotCQkJCXx8IGphdmFUeXBlLmlzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKCkKLQkJCQl8fCBqYXZhVHlwZS5lcXVhbHMoU1RSSU5HX0pBVkFfVFlQRSkKLQkJCQl8fCBqYXZhVHlwZS5lcXVhbHMoVVRJTF9EQVRFX0pBVkFfVFlQRSkKLQkJCQl8fCBqYXZhVHlwZS5lcXVhbHMoU1FMX0RBVEVfSkFWQV9UWVBFKSkgewotCQkJcmV0dXJuIGphdmFUeXBlOwotCQl9Ci0JCWlmIChqYXZhVHlwZS5lcXVhbHMoQklHX0RFQ0lNQUxfSkFWQV9UWVBFKSkgewotCQkJcmV0dXJuIExPTkdfSkFWQV9UWVBFOyAgLy8gPz8KLQkJfQotCQlpZiAoamF2YVR5cGUuZXF1YWxzKFNRTF9USU1FX0pBVkFfVFlQRSkpIHsKLQkJCXJldHVybiBVVElMX0RBVEVfSkFWQV9UWVBFOyAgLy8gPz8/Ci0JCX0KLQkJaWYgKGphdmFUeXBlLmVxdWFscyhTUUxfVElNRVNUQU1QX0pBVkFfVFlQRSkpIHsKLQkJCXJldHVybiBVVElMX0RBVEVfSkFWQV9UWVBFOyAgLy8gPz8/Ci0JCX0KLQkJLy8gYWxsIHRoZSBvdGhlciB0eXBpY2FsIHR5cGVzIGFyZSBwcmV0dHkgbXVjaCB1bi1tYXBwYWJsZSAtIHJldHVybiBTdHJpbmcoPykKLQkJcmV0dXJuIFNUUklOR19KQVZBX1RZUEU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwcmltaXRpdmVUeXBlSXNMb2IoUHJpbWl0aXZlVHlwZSBwcmltaXRpdmVUeXBlKSB7Ci0JCXJldHVybiAocHJpbWl0aXZlVHlwZSA9PSBQcmltaXRpdmVUeXBlLkJJTkFSWV9MQVJHRV9PQkpFQ1RfTElURVJBTCkKLQkJCQl8fCAocHJpbWl0aXZlVHlwZSA9PSBQcmltaXRpdmVUeXBlLkNIQVJBQ1RFUl9MQVJHRV9PQkpFQ1RfTElURVJBTCkKLQkJCQl8fCAocHJpbWl0aXZlVHlwZSA9PSBQcmltaXRpdmVUeXBlLk5BVElPTkFMX0NIQVJBQ1RFUl9MQVJHRV9PQkpFQ1RfTElURVJBTCk7Ci0JfQotCi0KLQkvLyAqKioqKiBzb21lIGNvbnN0YW50cyB1c2VkIHdoZW4gY29udmVydGluZyB0aGUgY29sdW1uIHRvIGEgSmF2YSBhdHRyaWJ1dGUKLQkvLyBUT0RPIE9iamVjdCBpcyB0aGUgZGVmYXVsdD8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBERUZBVUxUX0pBVkFfVFlQRSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIEJMT0JfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEuc3FsLkJsb2IuY2xhc3MpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIEJZVEVfQVJSQVlfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGJ5dGVbXS5jbGFzcyk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBDTE9CX0pBVkFfVFlQRSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnNxbC5DbG9iLmNsYXNzKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBTVFJJTkdfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgVVRJTF9EQVRFX0pBVkFfVFlQRSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuRGF0ZS5jbGFzcyk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgU1FMX0RBVEVfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEuc3FsLkRhdGUuY2xhc3MpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIFNRTF9USU1FX0pBVkFfVFlQRSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnNxbC5UaW1lLmNsYXNzKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBTUUxfVElNRVNUQU1QX0pBVkFfVFlQRSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnNxbC5UaW1lc3RhbXAuY2xhc3MpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgQklHX0RFQ0lNQUxfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBMT05HX0pBVkFfVFlQRSA9IG5ldyBTaW1wbGVKYXZhVHlwZShsb25nLmNsYXNzKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTI1MjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklDb25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklQcm9maWxlTGlzdGVuZXIxOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuUHJvZmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlcjsKLQotLyoqCi0gKiBXcmFwIHRoZSBEVFAge0BsaW5rIFByb2ZpbGVNYW5hZ2VyfSBpbiB5ZXQgYW5vdGhlciBzaW5nbGV0b24uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkKLQlpbXBsZW1lbnRzIENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeQotewotCXByaXZhdGUgUHJvZmlsZU1hbmFnZXIgZHRwUHJvZmlsZU1hbmFnZXI7Ci0KLQlwcml2YXRlIExvY2FsUHJvZmlsZUxpc3RlbmVyIHByb2ZpbGVMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBzaW5nbGV0b24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5IElOU1RBTkNFID0gbmV3IERUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpOwotCi0JcHVibGljIHN0YXRpYyBEVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBBY2Nlc3MgaXMgPGNvZGU+cHJpdmF0ZTwvY29kZT4gdG8gZW5zdXJlIHNpbmdsZXRvbgotCSAqLwotCXByaXZhdGUgRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaWZlY3ljbGUgKioqKioqKioqKgotCi0JLyoqCi0JICogY2FsbGVkIGJ5IHBsdWctaW4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoKSB7Ci0JCXRoaXMuZHRwUHJvZmlsZU1hbmFnZXIgPSBQcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCQl0aGlzLnByb2ZpbGVMaXN0ZW5lciA9IG5ldyBMb2NhbFByb2ZpbGVMaXN0ZW5lcigpOwotCQl0aGlzLmR0cFByb2ZpbGVNYW5hZ2VyLmFkZFByb2ZpbGVMaXN0ZW5lcih0aGlzLnByb2ZpbGVMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogY2FsbGVkIGJ5IHBsdWctaW4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKLQkJdGhpcy5kdHBQcm9maWxlTWFuYWdlci5yZW1vdmVQcm9maWxlTGlzdGVuZXIodGhpcy5wcm9maWxlTGlzdGVuZXIpOwotCQl0aGlzLnByb2ZpbGVMaXN0ZW5lciA9IG51bGw7Ci0JCXRoaXMuZHRwUHJvZmlsZU1hbmFnZXIgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25uZWN0aW9uIHByb2ZpbGVzICoqKioqKioqKioKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgQ29ubmVjdGlvblByb2ZpbGUgYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcgbmFtZSwgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlciBhZGFwdGVyKSB7Ci0JCWZvciAoSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUgOiB0aGlzLmR0cFByb2ZpbGVNYW5hZ2VyLmdldFByb2ZpbGVzKCkpIHsKLQkJCWlmIChkdHBQcm9maWxlLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZENvbm5lY3Rpb25Qcm9maWxlKGR0cFByb2ZpbGUsIGFkYXB0ZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgYnVpbGRDb25uZWN0aW9uUHJvZmlsZShJQ29ubmVjdGlvblByb2ZpbGUgZHRwUHJvZmlsZSwgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlciBhZGFwdGVyKSB7Ci0JCXJldHVybiBuZXcgRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyKGR0cFByb2ZpbGUsIGFkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uUHJvZmlsZSBidWlsZENvbm5lY3Rpb25Qcm9maWxlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUobmFtZSwgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlci5EZWZhdWx0Lmluc3RhbmNlKCkpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENvbm5lY3Rpb25Qcm9maWxlTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxJQ29ubmVjdGlvblByb2ZpbGUsIFN0cmluZz4odGhpcy5nZXREVFBDb25uZWN0aW9uUHJvZmlsZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShJQ29ubmVjdGlvblByb2ZpbGUgZHRwUHJvZmlsZSkgewotCQkJCSByZXR1cm4gZHRwUHJvZmlsZS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgSXRlcmFibGU8SUNvbm5lY3Rpb25Qcm9maWxlPiBnZXREVFBDb25uZWN0aW9uUHJvZmlsZXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxJQ29ubmVjdGlvblByb2ZpbGU+KHRoaXMuZHRwUHJvZmlsZU1hbmFnZXIuZ2V0UHJvZmlsZXMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5wcm9maWxlTGlzdGVuZXIuYWRkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucHJvZmlsZUxpc3RlbmVyLnJlbW92ZUNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBGb3J3YXJkIGV2ZW50cyB0byB0aGUgZmFjdG9yeSdzIGxpc3RlbmVycy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2NhbFByb2ZpbGVMaXN0ZW5lcgotCQlpbXBsZW1lbnRzIElQcm9maWxlTGlzdGVuZXIxCi0JewotCQlwcml2YXRlIGZpbmFsIExpc3RlbmVyTGlzdDxDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXI+KENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIuY2xhc3MpOwotCi0JCUxvY2FsUHJvZmlsZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXZvaWQgYWRkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCQl9Ci0KLQkJdm9pZCByZW1vdmVDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogSVByb2ZpbGVMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJcHVibGljIHZvaWQgcHJvZmlsZUFkZGVkKElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGR0cFByb2ZpbGUuZ2V0TmFtZSgpOwotCQkJZm9yIChDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlsaXN0ZW5lci5jb25uZWN0aW9uUHJvZmlsZUFkZGVkKG5hbWUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvZmlsZUNoYW5nZWQoSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUsIFN0cmluZyBvbGROYW1lLCBTdHJpbmcgb2xkRGVzY3JpcHRpb24sIEJvb2xlYW4gb2xkQXV0b0Nvbm5lY3QpIHsKLQkJCVN0cmluZyBuZXdOYW1lID0gZHRwUHJvZmlsZS5nZXROYW1lKCk7Ci0JCQlpZiAoICEgbmV3TmFtZS5lcXVhbHMob2xkTmFtZSkpIHsKLQkJCQlmb3IgKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCQlsaXN0ZW5lci5jb25uZWN0aW9uUHJvZmlsZVJlbmFtZWQob2xkTmFtZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvZmlsZUNoYW5nZWQoSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUpIHsKLQkJCS8vIHRoaXMgbWV0aG9kIHNob3VsZG4ndCBiZSBjYWxsZWQgb24gSVByb2ZpbGVMaXN0ZW5lcjEKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvZmlsZURlbGV0ZWQoSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUpIHsKLQkJCVN0cmluZyBuYW1lID0gZHRwUHJvZmlsZS5nZXROYW1lKCk7Ci0JCQlmb3IgKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWxpc3RlbmVyLmNvbm5lY3Rpb25Qcm9maWxlUmVtb3ZlZChuYW1lKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDc1NTFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LkNvbm5lY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklDb25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklNYW5hZ2VkQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklNYW5hZ2VkQ29ubmVjdGlvbk9mZmxpbmVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuRHJpdmVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuamRiYy5JSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5jb25uZWN0aW9uLkNvbm5lY3Rpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWx0b29scy5jb3JlLkRhdGFiYXNlSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsdG9vbHMuY29yZS5wcm9maWxlLlByb2ZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29ubmVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyOwotCi0vKioKLSAqICBXcmFwIGEgRFRQIHtAbGluayBJQ29ubmVjdGlvblByb2ZpbGV9Ci0gKi8KLWZpbmFsIGNsYXNzIERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlcgotCWltcGxlbWVudHMgRFRQRGF0YWJhc2VPYmplY3QsIENvbm5lY3Rpb25Qcm9maWxlCi17Ci0JLyoqIHRoZSB3cmFwcGVkIERUUCBjb25uZWN0aW9uIHByb2ZpbGUgKi8KLQlwcml2YXRlIGZpbmFsIElDb25uZWN0aW9uUHJvZmlsZSBkdHBDb25uZWN0aW9uUHJvZmlsZTsKLQotCS8qKiBhZGFwdGVyIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQgKGRldGVybWluZXMgaWRlbnRpZmllciBkZWxpbWl0ZXJzKSAqLwotCXByaXZhdGUgZmluYWwgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlciBpZGVudGlmaWVyQWRhcHRlcjsKLQotCS8qKiB0aGUgRFRQIG1hbmFnZWQgY29ubmVjdGlvbiB3ZSBsaXN0ZW4gdG8gKi8KLQlwcml2YXRlIGZpbmFsIElNYW5hZ2VkQ29ubmVjdGlvbiBkdHBNYW5hZ2VkQ29ubmVjdGlvbjsKLQotCS8qKgotCSAqIGZvcndhcmQgZXZlbnRzIGZyb20gdGhlIERUUCBtYW5hZ2VkIGNvbm5lY3Rpb24gYWJvdmU7Ci0JICogd2UgbGlzdGVuIGFuZCBwcm9wYWdhdGUgZXZlbnRzIGlmZiB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMKLQkgKi8KLQlwcml2YXRlIGZpbmFsIExvY2FsQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5lY3Rpb25MaXN0ZW5lcjsKLQotCS8qKiBsYXp5LWluaXRpYWxpemVkLCBhbmQgZGVsZXRlZCBhdCBkaXNjb25uZWN0ICovCi0JcHJpdmF0ZSBEVFBEYXRhYmFzZVdyYXBwZXIgZGF0YWJhc2U7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RhbnRzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSVZFX0RUUF9DT05ORUNUSU9OX1RZUEUgPSBqYXZhLnNxbC5Db25uZWN0aW9uLmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPRkZMSU5FX0RUUF9DT05ORUNUSU9OX1RZUEUgPSBDb25uZWN0aW9uSW5mby5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQUJBU0VfUFJPRFVDVF9QUk9QX0lEID0gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc2VydmVyLnZlcnNpb24iOyAgLy8kTk9OLU5MUy0xJAotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCURUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlcihJQ29ubmVjdGlvblByb2ZpbGUgZHRwQ29ubmVjdGlvblByb2ZpbGUsIERhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIgaWRlbnRpZmllckFkYXB0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZSA9IGR0cENvbm5lY3Rpb25Qcm9maWxlOwotCQl0aGlzLmlkZW50aWZpZXJBZGFwdGVyID0gaWRlbnRpZmllckFkYXB0ZXI7Ci0JCXRoaXMuZHRwTWFuYWdlZENvbm5lY3Rpb24gPSB0aGlzLmJ1aWxkRFRQTWFuYWdlZENvbm5lY3Rpb24oKTsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgPSBuZXcgTG9jYWxDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJLy8gZG9uJ3QgbGlzdGVuIHRvIHRoZSBtYW5hZ2VkIGNvbm5lY3Rpb24geWV0Ci0JfQotCi0JcHJpdmF0ZSBJTWFuYWdlZENvbm5lY3Rpb24gYnVpbGREVFBNYW5hZ2VkQ29ubmVjdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuZ2V0TWFuYWdlZENvbm5lY3Rpb24odGhpcy5nZXREVFBDb25uZWN0aW9uVHlwZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREVFBDb25uZWN0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuc3VwcG9ydHNXb3JrT2ZmbGluZU1vZGUoKSA/Ci0JCQkJT0ZGTElORV9EVFBfQ09OTkVDVElPTl9UWVBFIDoKLQkJCQlMSVZFX0RUUF9DT05ORUNUSU9OX1RZUEU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERhdGFiYXNlT2JqZWN0IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcihTdHJpbmcgamF2YUlkZW50aWZpZXIpIHsKLQkJLy8gY29ubmVjdGlvbiBwcm9maWxlcyBkbyBub3QgaGF2ZSAiaWRlbnRpZmllcnMiCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsKLQkJLy8gY29ubmVjdGlvbiBwcm9maWxlcyBkbyBub3QgaGF2ZSAiaWRlbnRpZmllcnMiCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBEYXRhYmFzZU9iamVjdCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIERUUERhdGFiYXNlV3JhcHBlciBnZXREYXRhYmFzZSgpIHsKLQkJaWYgKHRoaXMuZGF0YWJhc2UgPT0gbnVsbCkgewotCQkJdGhpcy5kYXRhYmFzZSA9IHRoaXMuYnVpbGREYXRhYmFzZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmRhdGFiYXNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb25uZWN0aW9uUHJvZmlsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBwcm9wZXJ0aWVzCi0JcHVibGljIFN0cmluZyBnZXRQcm92aWRlcklEKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5nZXRQcm92aWRlcklkKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbnN0YW5jZUlEKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5nZXRJbnN0YW5jZUlEKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhYmFzZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9OQU1FX1BST1BfSUQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJhc2VQcm9kdWN0KCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShEQVRBQkFTRV9QUk9EVUNUX1BST1BfSUQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9WRU5ET1JfUFJPUF9JRCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9WRVJTSU9OX1BST1BfSUQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuRFJJVkVSX0NMQVNTX1BST1BfSUQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VVJMKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuVVJMX1BST1BfSUQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlck5hbWUoKSB7Ci0JCVN0cmluZyB1c2VyTmFtZSA9IHRoaXMuZ2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlVTRVJOQU1FX1BST1BfSUQpOwotCQlyZXR1cm4gdGhpcy5leHRyYWN0VXNlck5hbWUodXNlck5hbWUudHJpbSgpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBleHRyYWN0VXNlck5hbWUoU3RyaW5nIHVzZXJOYW1lKSB7Ci0JCVN0cmluZ1tdIHN0cmluZ3MgPSB1c2VyTmFtZS5zcGxpdCgiXFxzKyIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGJ1ZyAyMDg5NDYgaGFuZGxlIHVzZXJuYW1lIGxpa2UgInN5cyBhcyBzeXNkYmEiIG9uIE9yYWNsZQotCQlpZiAoKHN0cmluZ3MubGVuZ3RoID09IDMpICYmIHN0cmluZ3NbMV0uZXF1YWxzSWdub3JlQ2FzZSgiYXMiKSkgeyAvLyROT04tTkxTLTEkCi0JICAgIAlyZXR1cm4gc3RyaW5nc1swXTsKLQkJfQotCQlyZXR1cm4gdXNlck5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVc2VyUGFzc3dvcmQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5QQVNTV09SRF9QUk9QX0lEKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoRFJJVkVSX0RFRklOSVRJT05fUFJPUF9JRCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREcml2ZXJKYXJMaXN0KCkgewotCQlyZXR1cm4gRHJpdmVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldERyaXZlckluc3RhbmNlQnlJRCh0aGlzLmdldERyaXZlckRlZmluaXRpb25JRCgpKS5nZXRKYXJMaXN0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gRHJpdmVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldERyaXZlckluc3RhbmNlQnlJRCh0aGlzLmdldERyaXZlckRlZmluaXRpb25JRCgpKS5nZXROYW1lKCk7Ci0JfQotCi0JLy8gKioqKiogY29ubmVjdGlvbgotCXB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpIHx8IHRoaXMuaXNXb3JraW5nT2ZmbGluZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW5hY3RpdmUoKSB7Ci0JCXJldHVybiAhIHRoaXMuaXNBY3RpdmUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwTWFuYWdlZENvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKQotCQkJCSYmICEgdGhpcy5kdHBNYW5hZ2VkQ29ubmVjdGlvbi5pc1dvcmtpbmdPZmZsaW5lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEaXNjb25uZWN0ZWQoKSB7Ci0JCXJldHVybiAhIHRoaXMuaXNDb25uZWN0ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25uZWN0KCkgewotCQlpZiAodGhpcy5pc0Rpc2Nvbm5lY3RlZCgpKSB7Ci0JCQl0aGlzLmNoZWNrU3RhdHVzKHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkgewotCQl0aGlzLmNoZWNrU3RhdHVzKHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbiBnZXRKREJDQ29ubmVjdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvbkluZm8oKS5nZXRTaGFyZWRDb25uZWN0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogb2ZmLWxpbmUgc3VwcG9ydAotCXB1YmxpYyBib29sZWFuIGlzV29ya2luZ09mZmxpbmUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cE1hbmFnZWRDb25uZWN0aW9uLmlzV29ya2luZ09mZmxpbmUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1dvcmtPZmZsaW5lTW9kZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuc3VwcG9ydHNXb3JrT2ZmbGluZU1vZGUoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBzYXZlV29ya09mZmxpbmVEYXRhKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5zYXZlV29ya09mZmxpbmVEYXRhKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbldvcmtPZmZsaW5lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5jYW5Xb3JrT2ZmbGluZSgpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHdvcmtPZmZsaW5lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS53b3JrT2ZmbGluZSgpOwotCX0KLQkKLQkvLyAqKioqKiBsaXN0ZW5lcnMKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7ICAvLyBmaXJzdCBsaXN0ZW5lciBhZGRlZAotCQkJdGhpcy5zdGFydExpc3RlbmluZygpOwotCQl9Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0TGlzdGVuaW5nKCkgewotCQl0aGlzLmR0cE1hbmFnZWRDb25uZWN0aW9uLmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmRhdGFiYXNlICE9IG51bGwpIHsgIC8vIGRvbid0IHRyaWdnZXIgZGF0YWJhc2UgY3JlYXRpb24KLQkJCWlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHsgIC8vIERUUCBkb2VzIG5vdCBjaGFuZ2Ugd2hlbiBvZmYtbGluZQotCQkJCXRoaXMuZGF0YWJhc2Uuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsgIC8vIGxhc3QgbGlzdGVuZXIgcmVtb3ZlZAotCQkJdGhpcy5zdG9wTGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcExpc3RlbmluZygpIHsKLQkJaWYgKHRoaXMuZGF0YWJhc2UgIT0gbnVsbCkgeyAgLy8gZG9uJ3QgdHJpZ2dlciBkYXRhYmFzZSBjcmVhdGlvbgotCQkJaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkgeyAgLy8gRFRQIGRvZXMgbm90IGNoYW5nZSB3aGVuIG9mZi1saW5lCi0JCQkJdGhpcy5kYXRhYmFzZS5zdG9wTGlzdGVuaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5kdHBNYW5hZ2VkQ29ubmVjdGlvbi5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCWJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lci5oYXNOb0xpc3RlbmVycygpOwotCX0KLQotCWJvb2xlYW4gaGFzQW55TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIuaGFzQW55TGlzdGVuZXJzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrU3RhdHVzKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHN0YXR1cy5pc011bHRpU3RhdHVzKCkpIHsKLQkJCWZvciAoSVN0YXR1cyBjaGlsZCA6IHN0YXR1cy5nZXRDaGlsZHJlbigpKSB7Ci0JCQkJdGhpcy5jaGVja1N0YXR1cyhjaGlsZCk7ICAvLyByZWN1cnNlLCBsb29raW5nIGZvciB0aGUgZmlyc3QgZXJyb3IKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihzdGF0dXMuZ2V0TWVzc2FnZSgpLCBzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgRFRQRGF0YWJhc2VXcmFwcGVyIGJ1aWxkRGF0YWJhc2UoKSB7Ci0JCXJldHVybiB0aGlzLmlzSW5hY3RpdmUoKSA/IG51bGwgOiBuZXcgRFRQRGF0YWJhc2VXcmFwcGVyKHRoaXMsIHRoaXMuYnVpbGREVFBEYXRhYmFzZSgpKTsKLQl9Ci0KLQlwcml2YXRlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZSBidWlsZERUUERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpcy5pc1dvcmtpbmdPZmZsaW5lKCkgPwotCQkJCXRoaXMuYnVpbGRPZmZsaW5lRFRQRGF0YWJhc2UoKSA6Ci0JCQkJdGhpcy5idWlsZExpdmVEVFBEYXRhYmFzZSgpOwotCX0KLQotCXByaXZhdGUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlIGJ1aWxkT2ZmbGluZURUUERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb25uZWN0aW9uSW5mbygpLmdldFNoYXJlZERhdGFiYXNlKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb25uZWN0aW9uSW5mbyBnZXRDb25uZWN0aW9uSW5mbygpIHsKLQkJcmV0dXJuIChDb25uZWN0aW9uSW5mbykgdGhpcy5kdHBNYW5hZ2VkQ29ubmVjdGlvbi5nZXRDb25uZWN0aW9uKCkuZ2V0UmF3Q29ubmVjdGlvbigpOwotCX0KLQotCXByaXZhdGUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlIGJ1aWxkTGl2ZURUUERhdGFiYXNlKCkgewotCQkvLyBUT0RPIHNlZSBEVFAgYnVnIDIwMjMwNgotCQkvLyBwYXNzIGNvbm5lY3Q9dHJ1ZSBpbiB0byBQcm9maWxlVXRpbC5nZXREYXRhYmFzZSgpCi0JCS8vIHRoZXJlIGlzIGEgYnVnIG1lbnRpb25lZCBpbiBhIGNvbW1lbnQ6IAotCQkvLyAgICAgImR1cmluZyB0aGUgcHJvZmlsZSBjb25uZWN0ZWQgZXZlbnQgbm90aWZpY2F0aW9uLCAKLQkJLy8gICAgIElNYW5hZ2VkQ29ubmVjdGlvbiBpcyBjb25uZWN0ZWQgd2hpbGUgSUNvbm5lY3Rpb25Qcm9maWxlIGlzIG5vdCIKLQkJLy8gc28sIHNvbWUgaGFja2VyeSBoZXJlIHRvIGhhbmRsZSBoYWNrZXJ5IHRoZXJlCi0JCXJldHVybiBQcm9maWxlVXRpbC5nZXREYXRhYmFzZShuZXcgRGF0YWJhc2VJZGVudGlmaWVyKHRoaXMuZ2V0TmFtZSgpLCB0aGlzLmdldERhdGFiYXNlTmFtZSgpKSwgdHJ1ZSk7Ci0JfQotCi0Jc3luY2hyb25pemVkIHZvaWQgY2xlYXJEYXRhYmFzZSgpIHsKLQkJaWYgKHRoaXMuZGF0YWJhc2UgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkgeyAgLy8gRFRQIGRvZXMgbm90IGNoYW5nZSB3aGVuIG9mZi1saW5lCi0JCQkJdGhpcy5kYXRhYmFzZS5zdG9wTGlzdGVuaW5nKCk7Ci0JCQl9Ci0JCQl0aGlzLmRhdGFiYXNlID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHRyZWF0SWRlbnRpZmllcnNBc0RlbGltaXRlZCgpIHsKLQkJcmV0dXJuIHRoaXMuaWRlbnRpZmllckFkYXB0ZXIudHJlYXRJZGVudGlmaWVyc0FzRGVsaW1pdGVkKCk7Ci0JfQotCi0Jdm9pZCBkYXRhYmFzZUNoYW5nZWQoRFRQRGF0YWJhc2VXcmFwcGVyIGRiKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLmRhdGFiYXNlQ2hhbmdlZChkYik7Ci0JfQotCi0Jdm9pZCBjYXRhbG9nQ2hhbmdlZChEVFBDYXRhbG9nV3JhcHBlciBjYXRhbG9nKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLmNhdGFsb2dDaGFuZ2VkKGNhdGFsb2cpOwotCX0KLQotCXZvaWQgc2NoZW1hQ2hhbmdlZChEVFBTY2hlbWFXcmFwcGVyIHNjaGVtYSkgewotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lci5zY2hlbWFDaGFuZ2VkKHNjaGVtYSk7Ci0JfQotCi0Jdm9pZCBzZXF1ZW5jZUNoYW5nZWQoRFRQU2VxdWVuY2VXcmFwcGVyIHNlcXVlbmNlKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLnNlcXVlbmNlQ2hhbmdlZChzZXF1ZW5jZSk7Ci0JfQotCi0Jdm9pZCB0YWJsZUNoYW5nZWQoRFRQVGFibGVXcmFwcGVyIHRhYmxlKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLnRhYmxlQ2hhbmdlZCh0YWJsZSk7Ci0JfQotCi0Jdm9pZCBjb2x1bW5DaGFuZ2VkKERUUENvbHVtbldyYXBwZXIgY29sdW1uKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLmNvbHVtbkNoYW5nZWQoY29sdW1uKTsKLQl9Ci0KLQl2b2lkIGZvcmVpZ25LZXlDaGFuZ2VkKERUUEZvcmVpZ25LZXlXcmFwcGVyIGZvcmVpZ25LZXkpIHsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIuZm9yZWlnbktleUNoYW5nZWQoZm9yZWlnbktleSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5nZXRCYXNlUHJvcGVydGllcygpLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmdldE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUCBjb25uZWN0aW9uIGxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgbGlzdGVuZXIgdHJhbnNsYXRlcyBhbmQgZm9yd2FyZHMKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JTWFuYWdlZENvbm5lY3Rpb25MaXN0ZW5lcn0gYW5kCi0JICoge0BsaW5rIElNYW5hZ2VkQ29ubmVjdGlvbk9mZmxpbmVMaXN0ZW5lcn0gZXZlbnRzIHRvCi0JICoge0BsaW5rIENvbm5lY3Rpb25MaXN0ZW5lcn1zLiBBbHNvLCB0aGUgY29ubmVjdGlvbiBwcm9maWxlIGRlbGVnYXRlcyB0bwotCSAqIHRoaXMgbGlzdGVuZXIgd2hlbiBub3RpZnlpbmcge0BsaW5rIENvbm5lY3Rpb25MaXN0ZW5lcn1zIG9mIGNoYW5nZXMgdG8KLQkgKiB0aGUgZGF0YWJhc2Ugb2JqZWN0cyAoY2F0YWxvZ3MsIHNjaGVtYXRhLCB0YWJsZXMsIGV0Yy4pLgotCSAqLwotCXByaXZhdGUgY2xhc3MgTG9jYWxDb25uZWN0aW9uTGlzdGVuZXIKLQkJaW1wbGVtZW50cyBJTWFuYWdlZENvbm5lY3Rpb25PZmZsaW5lTGlzdGVuZXIKLQl7Ci0JCXByaXZhdGUgTGlzdGVuZXJMaXN0PENvbm5lY3Rpb25MaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxDb25uZWN0aW9uTGlzdGVuZXI+KENvbm5lY3Rpb25MaXN0ZW5lci5jbGFzcyk7Ci0KLQkJTG9jYWxDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJdm9pZCBhZGRDb25uZWN0aW9uTGlzdGVuZXIoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCQl9Ci0KLQkJdm9pZCByZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLmxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0KLQkJYm9vbGVhbiBoYXNOb0xpc3RlbmVycygpIHsKLQkJCXJldHVybiB0aGlzLmxpc3RlbmVyTGlzdC5pc0VtcHR5KCk7Ci0JCX0KLQotCQlib29sZWFuIGhhc0FueUxpc3RlbmVycygpIHsKLQkJCXJldHVybiAhIHRoaXMubGlzdGVuZXJMaXN0LmlzRW1wdHkoKTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBJTWFuYWdlZENvbm5lY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJLy8gb2ZmLWxpbmUgb3IgaW5hY3RpdmUgPT4gbGl2ZQotCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBkbyAqbm90KiBidWlsZCB0aGUgZGF0YWJhc2UgaGVyZSAtIGl0IGlzIGJ1aWx0IG9uLWRlbWFuZDsKLQkJCS8vIGZvcndhcmQgZXZlbnQgdG8gbGlzdGVuZXJzCi0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIub3BlbmVkKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBUaGlzIG1ldGhvZCBpcyBuZXZlciBjYWxsZWQgZnJvbSB0aGUgYmFzZSBEVFAgY29kZS4KLQkJICogUGVyaGFwcyBEVFAgZXh0ZW5kZXJzIGNhbGwgaXQuLi4uCi0JCSAqIFNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5pbnRlcm5hbC5NYW5hZ2VkQ29ubmVjdGlvbiNmaXJlTW9kaWZpZWRFdmVudChPYmplY3QpfSwKLQkJICogd2hpY2ggaXMgbmV2ZXIgY2FsbGVkLi4uCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RpZmllZChDb25uZWN0RXZlbnQgZXZlbnQpIHsKLQkJCS8vIGZvcndhcmQgZXZlbnQgdG8gbGlzdGVuZXJzCi0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIubW9kaWZpZWQoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gb2tUb0Nsb3NlKENvbm5lY3RFdmVudCBldmVudCkgewotCQkJLy8gZm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJCWZvciAoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlyZXN1bHQgJj0gbGlzdGVuZXIub2tUb0Nsb3NlKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQkvLyBsaXZlIG9yIG9mZi1saW5lID0+IGluYWN0aXZlCi0JCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0RXZlbnQgZXZlbnQpIHsKLQkJCS8vIGZvcndhcmQgZXZlbnQgdG8gbGlzdGVuZXJzCi0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIuYWJvdXRUb0Nsb3NlKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzKTsKLQkJCX0KLQkJCS8vIGNsZWFyIHRoZSBkYXRhYmFzZSAqYmVmb3JlKiB0aGUgRFRQIGNvbm5lY3Rpb24gaXMgY2xvc2VkCi0JCQkvLyBidXQgYWZ0ZXIgd2Ugbm90aWZ5IG91ciBsaXN0ZW5lcnMgb2YgdGhlICJhYm91dCB0byBjbG9zZSI7Ci0JCQkvLyBvdGhlcndpc2Ugd2UgbGVhdmUgb3Vyc2VsdmVzIG9wZW4gdG8gaGl0dGluZyBhIGNsb3NlZCBkYXRhYmFzZQotCQkJRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMuY2xlYXJEYXRhYmFzZSgpOwotCQl9Ci0KLQkJLy8gbGl2ZSBvciBvZmYtbGluZSA9PiBpbmFjdGl2ZQotCQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBmb3J3YXJkIGV2ZW50IHRvIGxpc3RlbmVycwotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWxpc3RlbmVyLmNsb3NlZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcyk7Ci0JCQl9Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogSU1hbmFnZWRDb25uZWN0aW9uT2ZmbGluZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCQkvLyBsaXZlID0+IG9mZi1saW5lCi0JCXB1YmxpYyBib29sZWFuIG9rVG9EZXRhY2goQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBjb252ZXJ0IHRoZSBldmVudCB0byBhbiAib2sgdG8gY2xvc2UiIGV2ZW50OwotCQkJLy8gd2UgYXJlICJjbG9zaW5nIiB0aGUgbGl2ZSBjb25uZWN0aW9uCi0JCQlyZXR1cm4gdGhpcy5va1RvQ2xvc2UoZXZlbnQpOwotCQl9Ci0JCQotCQkvLyBsaXZlID0+IG9mZi1saW5lCi0JCXB1YmxpYyB2b2lkIGFib3V0VG9EZXRhY2goQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBjb252ZXJ0IHRoZSBldmVudCB0byBhbiAiYWJvdXQgdG8gY2xvc2UiIGV2ZW50OwotCQkJLy8gd2UgYXJlICJjbG9zaW5nIiB0aGUgbGl2ZSBjb25uZWN0aW9uCi0JCQl0aGlzLmFib3V0VG9DbG9zZShldmVudCk7Ci0JCX0KLQotCQkvLyBpbmFjdGl2ZSBvciBsaXZlID0+IG9mZi1saW5lCi0JCXB1YmxpYyB2b2lkIHdvcmtpbmdPZmZsaW5lKENvbm5lY3RFdmVudCBldmVudCkgewotCQkJLy8gY29udmVydCB0aGUgZXZlbnQgdG8gYW4gIm9wZW5lZCIgZXZlbnQ7Ci0JCQkvLyB3ZSBhcmUgIm9wZW5pbmciIHRoZSBvZmYtbGluZSBjb25uZWN0aW9uCi0JCQl0aGlzLm9wZW5lZChldmVudCk7Ci0JCX0KLQotCQkvLyBvZmYtbGluZSA9PiBsaXZlCi0JCXB1YmxpYyB2b2lkIGFib3V0VG9BdHRhY2goQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBjb252ZXJ0IHRoZSBldmVudCB0byBhbiAiYWJvdXQgdG8gY2xvc2UiIGV2ZW50OwotCQkJLy8gd2UgYXJlICJjbG9zaW5nIiB0aGUgb2ZmLWxpbmUgY29ubmVjdGlvbgotCQkJdGhpcy5hYm91dFRvQ2xvc2UoZXZlbnQpOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JCXZvaWQgZGF0YWJhc2VDaGFuZ2VkKERUUERhdGFiYXNlV3JhcHBlciBkYikgewotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWxpc3RlbmVyLmRhdGFiYXNlQ2hhbmdlZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcywgZGIpOwotCQkJfQotCQl9Ci0KLQkJdm9pZCBjYXRhbG9nQ2hhbmdlZChEVFBDYXRhbG9nV3JhcHBlciBjYXRhbG9nKSB7Ci0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIuY2F0YWxvZ0NoYW5nZWQoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMsIGNhdGFsb2cpOwotCQkJfQotCQl9Ci0KLQkJdm9pZCBzY2hlbWFDaGFuZ2VkKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hKSB7Ci0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIuc2NoZW1hQ2hhbmdlZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcywgc2NoZW1hKTsKLQkJCX0KLQkJfQotCi0JCXZvaWQgc2VxdWVuY2VDaGFuZ2VkKERUUFNlcXVlbmNlV3JhcHBlciBzZXF1ZW5jZSkgewotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWxpc3RlbmVyLnNlcXVlbmNlQ2hhbmdlZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcywgc2VxdWVuY2UpOwotCQkJfQotCQl9Ci0KLQkJdm9pZCB0YWJsZUNoYW5nZWQoRFRQVGFibGVXcmFwcGVyIHRhYmxlKSB7Ci0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIudGFibGVDaGFuZ2VkKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzLCB0YWJsZSk7Ci0JCQl9Ci0JCX0KLQotCQl2b2lkIGNvbHVtbkNoYW5nZWQoRFRQQ29sdW1uV3JhcHBlciBjb2x1bW4pIHsKLQkJCWZvciAoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlsaXN0ZW5lci5jb2x1bW5DaGFuZ2VkKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzLCBjb2x1bW4pOwotCQkJfQotCQl9Ci0KLQkJdm9pZCBmb3JlaWduS2V5Q2hhbmdlZChEVFBGb3JlaWduS2V5V3JhcHBlciBmb3JlaWduS2V5KSB7Ci0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIuZm9yZWlnbktleUNoYW5nZWQoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMsIGZvcmVpZ25LZXkpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBEYXRhYmFzZU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBEYXRhYmFzZU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2NhYTNlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQRGF0YWJhc2VPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2VPYmplY3Q7Ci0KLS8qKgotICogSW50ZXJuYWwgaW50ZXJmYWNlOiBEVFAgZGF0YWJhc2Ugb2JqZWN0LgotICovCi1pbnRlcmZhY2UgRFRQRGF0YWJhc2VPYmplY3QKLQlleHRlbmRzIERhdGFiYXNlT2JqZWN0Ci17Ci0JLyoqCi0JICogY292YXJpYW50IG92ZXJyaWRlCi0JICovCi0JRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyIGdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0KLQkvKioKLQkgKiBjb3ZhcmlhbnQgb3ZlcnJpZGUKLQkgKi8KLQlwdWJsaWMgRFRQRGF0YWJhc2VXcmFwcGVyIGdldERhdGFiYXNlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUERhdGFiYXNlT2JqZWN0V3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5OGUxNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUERhdGFiYXNlT2JqZWN0V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuUmVmcmVzaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2VPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXIuRFRQRHJpdmVyQWRhcHRlcjsKLQotLyoqCi0gKiBEVFAgT2JqZWN0IFdyYXBwZXIgYmFzZSBjbGFzcwotICovCi1hYnN0cmFjdCBjbGFzcyBEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXI8UCBleHRlbmRzIERUUERhdGFiYXNlT2JqZWN0PgotCWltcGxlbWVudHMgRFRQRGF0YWJhc2VPYmplY3QKLXsKLQkvKiogd2UgbmVlZCBhIHdheSB0byBnZXQgdG8gdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSAqLwotCWZpbmFsIFAgcGFyZW50OwotCi0JLyoqIGxpc3RlbiBmb3IgdGhlICJjYXRhbG9nIG9iamVjdCIgYmVpbmcgcmVmcmVzaGVkICovCi0JcHJpdmF0ZSBmaW5hbCBJQ2F0YWxvZ09iamVjdExpc3RlbmVyIGNhdGFsb2dPYmplY3RMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIoUCBwYXJlbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCWlmICh0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuaXNDb25uZWN0ZWQoKSkgewotCQkJLy8gd2Ugb25seSBsaXN0ZW4gdG8gImxpdmUiIGNvbm5lY3Rpb25zIChhcyBvcHBvc2VkIHRvICJvZmYtbGluZSIgY29ubmVjdGlvbnMpOwotCQkJLy8gYW5kIHRoZSBtb2RlbCBpcyByZWJ1aWx0IHdoZW4gdGhlIGNvbm5lY3Rpb24gY29ubmVjdHMgb3IgZGlzY29ubmVjdHMKLQkJCXRoaXMuY2F0YWxvZ09iamVjdExpc3RlbmVyID0gdGhpcy5idWlsZENhdGFsb2dPYmplY3RMaXN0ZW5lcigpOwotCQkJaWYgKHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5oYXNBbnlMaXN0ZW5lcnMoKSkgewotCQkJCXRoaXMuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRoaXMuY2F0YWxvZ09iamVjdExpc3RlbmVyID0gbnVsbDsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lcyB2cy4gaWRlbnRpZmllcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogRXhhbXBsZXM6PHVsPgotCSAqIDxsaT5PcmFjbGUgZXRjLjx1bD48Y29kZT4KLQkgKiAgICAgPGxpPlRhYmxlKEZPTykgdnMuICJGb28iID0+IG51bGwKLQkgKiAgICAgPGxpPlRhYmxlKEJBUikgdnMuICJGb28iID0+ICJCQVIiCi0JICogICAgIDxsaT5UYWJsZShGb28pIHZzLiAiRm9vIiA9PiAiXCJGb29cIiIKLQkgKiAgICAgPGxpPlRhYmxlKEJhcikgdnMuICJGb28iID0+ICJcIkJhclwiIgotCSAqIDwvY29kZT48L3VsPgotCSAqIDxsaT5Qb3N0Z3JlU1FMIGV0Yy48dWw+PGNvZGU+Ci0JICogICAgIDxsaT5UYWJsZShmb28pIHZzLiAiRm9vIiA9PiBudWxsCi0JICogICAgIDxsaT5UYWJsZShiYXIpIHZzLiAiRm9vIiA9PiAiYmFyIgotCSAqICAgICA8bGk+VGFibGUoRm9vKSB2cy4gIkZvbyIgPT4gIlwiRm9vXCIiCi0JICogICAgIDxsaT5UYWJsZShCYXIpIHZzLiAiRm9vIiA9PiAiXCJCYXJcIiIKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8bGk+U1FMIFNlcnZlciBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+VGFibGUoRm9vKSB2cy4gIkZvbyIgPT4gbnVsbAotCSAqICAgICA8bGk+VGFibGUoZm9vKSB2cy4gIkZvbyIgPT4gImZvbyIKLQkgKiAgICAgPGxpPlRhYmxlKGJhcikgdnMuICJGb28iID0+ICJiYXIiCi0JICogICAgIDxsaT5UYWJsZShCYXIpIHZzLiAiRm9vIiA9PiAiQmFyIgotCSAqIDwvY29kZT48L3VsPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKFN0cmluZyBkZWZhdWx0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXREVFBEcml2ZXJBZGFwdGVyKCkuY29udmVydE5hbWVUb0lkZW50aWZpZXIodGhpcy5nZXROYW1lKCksIGRlZmF1bHROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGFtcGxlczo8dWw+Ci0JICogPGxpPk9yYWNsZSBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+VGFibGUoRk9PKSA9PiAiRk9PIgotCSAqICAgICA8bGk+VGFibGUoRm9vKSA9PiAiXCJGb29cIiIKLQkgKiAgICAgPGxpPlRhYmxlKGZvbykgPT4gIlwiZm9vXCIiCi0JICogICAgIDxsaT5UYWJsZShmb28rKykgPT4gIlwiZm9vKytcIiIKLQkgKiAgICAgPGxpPlRhYmxlKGYibykgPT4gIlwiZlwiXCJvXCIiIChpLmUuICJmIiJvIikKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8bGk+UG9zdGdyZVNRTCBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+VGFibGUoRk9PKSA9PiAiXCJGT09cIiIKLQkgKiAgICAgPGxpPlRhYmxlKEZvbykgPT4gIlwiRm9vXCIiCi0JICogICAgIDxsaT5UYWJsZShmb28pID0+ICJmb28iCi0JICogICAgIDxsaT5UYWJsZShmb28rKykgPT4gIlwiZm9vKytcIiIKLQkgKiAgICAgPGxpPlRhYmxlKGYibykgPT4gIlwiZlwiXCJvXCIiIChpLmUuICJmIiJvIikKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8bGk+U1FMIFNlcnZlciBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+VGFibGUoRk9PKSA9PiAiRk9PIgotCSAqICAgICA8bGk+VGFibGUoRm9vKSA9PiAiRm9vIgotCSAqICAgICA8bGk+VGFibGUoZm9vKSA9PiAiZm9vIgotCSAqICAgICA8bGk+VGFibGUoZm9vKyspID0+ICJcImZvbysrXCIiCi0JICogICAgIDxsaT5UYWJsZShmIm8pID0+ICJcImZcIlwib1wiIiAoaS5lLiAiZiIibyIpCi0JICogPC9jb2RlPjwvdWw+Ci0JICogPGxpPk15U1FMPHVsPjxjb2RlPgotCSAqICAgICA8bGk+VGFibGUoRk9PKSA9PiAiRk9PIgotCSAqICAgICA8bGk+VGFibGUoRm9vKSA9PiAiRm9vIgotCSAqICAgICA8bGk+VGFibGUoZm9vKSA9PiAiZm9vIgotCSAqICAgICA8bGk+VGFibGUoZm9vKyspID0+ICJgZm9vKytgIgotCSAqICAgICA8bGk+VGFibGUoZiJvKSA9PiAiYGZcIm9gIiAoaS5lLiBgZiJvYCkKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydE5hbWVUb0lkZW50aWZpZXIodGhpcy5nZXROYW1lKCkpOwotCX0KLQotCVN0cmluZyBjb252ZXJ0TmFtZVRvSWRlbnRpZmllcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXREVFBEcml2ZXJBZGFwdGVyKCkuY29udmVydE5hbWVUb0lkZW50aWZpZXIobmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUCBkYXRhYmFzZSBvYmplY3QgbGlzdGVuZXIgKioqKioqKioqKgotCi0JcHJpdmF0ZSBJQ2F0YWxvZ09iamVjdExpc3RlbmVyIGJ1aWxkQ2F0YWxvZ09iamVjdExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IElDYXRhbG9nT2JqZWN0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElDYXRhbG9nT2JqZWN0IGRtRWxlbWVudCwgaW50IGV2ZW50VHlwZSkgewotCQkJCWlmIChkbUVsZW1lbnQgPT0gRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyLnRoaXMuZ2V0Q2F0YWxvZ09iamVjdCgpKSB7Ci0JCQkJCS8vICdldmVudFR5cGUnIGRvZXNuJ3Qgc2VlbSB0byBiZSB2ZXJ5IHVzZWZ1bCwgc28gZHJvcCBpdAotCQkJCQlEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIudGhpcy5jYXRhbG9nT2JqZWN0Q2hhbmdlZCgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBUeXBpY2FsbHksIHJldHVybiB0aGUgd3JhcHBlZCBEVFAgZGF0YWJhc2Ugb2JqZWN0LgotCSAqLwotCWFic3RyYWN0IElDYXRhbG9nT2JqZWN0IGdldENhdGFsb2dPYmplY3QoKTsKLQotCS8qKgotCSAqIFR5cGljYWxseSwgYSBzdWJjbGFzcyB3aWxsIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvCi0JICogY2FsbCA8Y29kZT5zdXBlci5jYXRhbG9nT2JqZWN0Q2hhbmdlZCgpPC9jb2RlPiBhbmQKLQkgKiBub3RpZnkgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBzb21ldGhpbmcgaGFzIGNoYW5nZWQKLQkgKi8KLQl2b2lkIGNhdGFsb2dPYmplY3RDaGFuZ2VkKCkgewotCQl0aGlzLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIERUUCBvYmplY3QgaGFzIGNoYW5nZWQsIGNsZWFyIHRoZSB3cmFwcGVyJ3Mgc3RhdGUgc28gaXQgd2lsbCBiZQotCSAqIHN5bmNocm9uaXplZCBvbi1kZW1hbmQuCi0JICovCi0JYWJzdHJhY3Qgdm9pZCBjbGVhcigpOwotCi0JLy8gdGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBwcm9maWxlIGlzICJsaXZlIiBhbmQgaGFzIGxpc3RlbmVycwotCXZvaWQgc3RhcnRMaXN0ZW5pbmcoKSB7Ci0JCXRoaXMuY2hlY2tMaXN0ZW5lcigpOwotCQlSZWZyZXNoTWFuYWdlci5nZXRJbnN0YW5jZSgpLkFkZExpc3RlbmVyKHRoaXMuZ2V0Q2F0YWxvZ09iamVjdCgpLCB0aGlzLmNhdGFsb2dPYmplY3RMaXN0ZW5lcik7Ci0JfQotCi0JLy8gdGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBwcm9maWxlIGlzICJsaXZlIiBhbmQgaGFzIG5vIGxpc3RlbmVycwotCXZvaWQgc3RvcExpc3RlbmluZygpIHsKLQkJdGhpcy5jaGVja0xpc3RlbmVyKCk7Ci0gICAgICAgIFJlZnJlc2hNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlTGlzdGVuZXIodGhpcy5nZXRDYXRhbG9nT2JqZWN0KCksIHRoaXMuY2F0YWxvZ09iamVjdExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBXZSBvbmx5IGJ1aWxkIHtAbGluayAjY2F0YWxvZ09iamVjdExpc3RlbmVyfSB3aGVuIHRoZSBjb25uZWN0aW9uCi0JICogcHJvZmlsZSBpcyAibGl2ZSIuIElmIHdlIGdldCBoZXJlIGFuZCBpdCBpcyA8Y29kZT5udWxsPC9jb2RlPiwKLQkgKiBzb21ldGhpbmcgaXMgd3JvbmcuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTGlzdGVuZXIoKSB7Ci0JCWlmICh0aGlzLmNhdGFsb2dPYmplY3RMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0aGUgY2F0YWxvZyBsaXN0ZW5lciBpcyBudWxsIik7ICAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgRFRQRGF0YWJhc2VXcmFwcGVyIGdldERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0RGF0YWJhc2UoKTsKLQl9Ci0KLQlEVFBEcml2ZXJBZGFwdGVyIGdldERUUERyaXZlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldERhdGFiYXNlKCkuZ2V0RFRQRHJpdmVyQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKi8KLQk8VCBleHRlbmRzIERhdGFiYXNlT2JqZWN0PiBUIHNlbGVjdERhdGFiYXNlT2JqZWN0TmFtZWQoSXRlcmFibGU8VD4gZGF0YWJhc2VPYmplY3RzLCBTdHJpbmcgbmFtZSkgewotCQlmb3IgKFQgZGF0YWJhc2VPYmplY3QgOiBkYXRhYmFzZU9iamVjdHMpIHsKLQkJCWlmIChkYXRhYmFzZU9iamVjdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGRhdGFiYXNlT2JqZWN0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUERhdGFiYXNlV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBEYXRhYmFzZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ3ZDUxNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUERhdGFiYXNlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUuZGVmaW5pdGlvbi5EYXRhYmFzZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uaW50ZXJuYWwuY29yZS5SREJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXIuRFRQRHJpdmVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLmRyaXZlci5EVFBEcml2ZXJBZGFwdGVyTWFuYWdlcjsKLQotLyoqCi0gKiBXcmFwIGEgRFRQIERhdGFiYXNlLgotICogPHA+Ci0gKiBDYXRhbG9ncyB2cy4gU2NoZW1hdGE6PGJyPgotICogVHlwaWNhbGx5LCBpZiBhIERUUCBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IDxlbT5jYXRhbG9nczwvZW0+LAotICogby5lLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZSNnZXRDYXRhbG9ncygpIHdpbGwgcmV0dXJuIGEKLSAqIHNpbmdsZSBjYXRhbG9nIHdpdGhvdXQgYSBuYW1lIChhY3R1YWxseSwgaXQncyBhbiBlbXB0eSBzdHJpbmcpLiBUaGlzIGNhdGFsb2cKLSAqIHdpbGwgY29udGFpbiBhbGwgdGhlIGRhdGFiYXNlJ3Mgc2NoZW1hdGEuIFdlIHRyeSB0byBpZ25vcmUgdGhpcyBjYXRhbG9nIGFuZAotICogcmV0dXJuIHRoZSBzY2hlbWF0YSBmcm9tIHRoZSBkYXRhYmFzZSBkaXJlY3RseS4KLSAqIDxwPgotICogQ2F0YWxvZyBOb3RlIDE6PGJyPgotICogQXMgb2YgSmFuIDIwMDksIHRoZSBEVFAgTXlTUUwgZHJpdmVyIGlzIG5vdCBjb25zaXN0ZW50IHdpdGggdGhpcyBwYXR0ZXJuLgotICogQSBEVFAgTXlTUUwgZGF0YWJhc2UgaGFzIDxlbT5ubzwvZW0+IGNhdGFsb2dzOyBpdCBob2xkcyBhIHNpbmdsZSBzY2hlbWEKLSAqIGRpcmVjdGx5LCBhbmQgdGhhdCBzY2hlbWEgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGRhdGFiYXNlLiBTZWUgYnVnIDI0OTAxMy4KLSAqIDxwPgotICogQ2F0YWxvZyBOb3RlIDI6PGJyPgotICogQXMgb2YgSmFuIDIwMDksIHRoZSBQb3N0Z3JlU1FMIEpEQkMgZHJpdmVyIGNvbXBsaWNhdGVzIHRoaXMgcGF0dGVybiBhIGJpdC4KLSAqIEV2ZW4gdGhvdWdoIFBvc3RncmVTUUwgZG9lcyBub3Qgc3VwcG9ydCA8ZW0+Y2F0YWxvZ3M8L2VtPiwgaXRzIEpEQkMgZHJpdmVyCi0gKiByZXR1cm5zIGEgc2luZ2xlIGNhdGFsb2cgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZGF0YWJhc2Ugc3BlY2lmaWVkCi0gKiBpbiB0aGUgSkRCQyBjb25uZWN0aW9uIFVSTC4gVGhlIERUUCBQb3N0Z3JlU1FMIGRyaXZlciBzaW1wbHkgcmVwbGljYXRlcyB0aGlzCi0gKiBiZWhhdmlvci4gVW5mb3J0dW5hdGVseSwgdGhpcyBjYXRhbG9nIGNhbiBiZSB1bm5hbWVkOyBpLmUuIGl0cyBuYW1lIGlzIGFuCi0gKiBlbXB0eSBzdHJpbmcuLi4uCi0gKiA8cD4KLSAqIChZZXQgQW5vdGhlcikgTm90ZTo8YnI+Ci0gKiBXZSB1c2UgPGVtPm5hbWU8L2VtPiB3aGVuIGRlYWxpbmcgd2l0aCB0aGUgdW5tb2RpZmllZCBuYW1lIG9mIGEgZGF0YWJhc2Ugb2JqZWN0Ci0gKiBhcyBzdXBwbGllZCBieSB0aGUgZGF0YWJhc2UgaXRzZWxmIChpLmUuIGl0IGlzIG5vdCBkZWxpbWl0ZWQgYW5kIGl0IGlzIGFsd2F5cwotICogY2FzZS1zZW5zaXRpdmUpLgotICogV2UgdXNlIDxlbT5pZGVudGlmaWVyPC9lbT4gd2hlbiBkZWFsaW5nIHdpdGggYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBkYXRhYmFzZQotICogb2JqZWN0IG5hbWUgKGkuZS4gaXQgbWF5IGJlIGRlbGltaXRlZCBhbmQsIGRlcGVuZGluZyBvbiB0aGUgdmVuZG9yLCBpdCBtYXkKLSAqIGJlIGNhc2UtaW5zZW5zaXRpdmUpLgotICovCi1maW5hbCBjbGFzcyBEVFBEYXRhYmFzZVdyYXBwZXIKLQlleHRlbmRzIERUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXI8RFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyPgotCWltcGxlbWVudHMgRGF0YWJhc2UKLXsKLQkvKiogdGhlIHdyYXBwZWQgRFRQIGRhdGFiYXNlICovCi0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2UgZHRwRGF0YWJhc2U7Ci0KLQkvKiogZGF0YWJhc2Utc3BlY2lmaWMgYmVoYXZpb3IgKi8KLQlwcml2YXRlIGZpbmFsIERUUERyaXZlckFkYXB0ZXIgZHRwRHJpdmVyQWRhcHRlcjsKLQotCS8qKiBsYXp5LWluaXRpYWxpemVkLCBzb3J0ZWQgKi8KLQlwcml2YXRlIERUUENhdGFsb2dXcmFwcGVyW10gY2F0YWxvZ3M7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQRGF0YWJhc2VXcmFwcGVyKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlciBjb25uZWN0aW9uUHJvZmlsZSwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlIGR0cERhdGFiYXNlKSB7Ci0JCXN1cGVyKGNvbm5lY3Rpb25Qcm9maWxlKTsKLQkJdGhpcy5kdHBEYXRhYmFzZSA9IGR0cERhdGFiYXNlOwotCQl0aGlzLmR0cERyaXZlckFkYXB0ZXIgPSBEVFBEcml2ZXJBZGFwdGVyTWFuYWdlci5pbnN0YW5jZSgpLmJ1aWxkQWRhcHRlcih0aGlzLmdldFZlbmRvck5hbWUoKSwgdGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUERhdGFiYXNlT2JqZWN0V3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlJQ2F0YWxvZ09iamVjdCBnZXRDYXRhbG9nT2JqZWN0KCkgewotCQlyZXR1cm4gKElDYXRhbG9nT2JqZWN0KSB0aGlzLmR0cERhdGFiYXNlOwotCX0KLQotCS8qIFRPRE8KLQkgKiBXZSBtaWdodCB3YW50IHRvIGxpc3RlbiB0byB0aGUgInZpcnR1YWwiIGNhdGFsb2c7IGJ1dCB0aGF0J3MgcHJvYmFibHkKLQkgKiBub3QgbmVjZXNzYXJ5IHNpbmNlIHRoZXJlIGlzIG5vIGVhc3kgd2F5IGZvciB0aGUgdXNlciB0byByZWZyZXNoIGl0Ci0JICogKGkuZS4gaXQgaXMgbm90IGRpc3BsYXllZCBpbiB0aGUgRFRQIFVJKS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjYXRhbG9nT2JqZWN0Q2hhbmdlZCgpIHsKLQkJc3VwZXIuY2F0YWxvZ09iamVjdENoYW5nZWQoKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmRhdGFiYXNlQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRFRQRGF0YWJhc2VXcmFwcGVyIGdldERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE+IGdldERUUFNjaGVtYXMoKSB7Ci0JCXJldHVybiB0aGlzLmR0cERyaXZlckFkYXB0ZXIuZ2V0RFRQU2NoZW1hcygpOwotCX0KLQotCUBPdmVycmlkZQotCURUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hKSB7Ci0JCXJldHVybiB0aGlzLmdldFNjaGVtYV8oZHRwU2NoZW1hKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGZyb20gYSBjYXRhbG9nLCBzbyB3ZSBrbm93IHdlIGhhdmUgY2F0YWxvZ3M7Ci0JICogaS5lLiB0aGUgc2VhcmNoIGhhcyB0byBkZXNjZW5kIHRocm91Z2ggY2F0YWxvZ3MsIHRoZW4gdG8gc2NoZW1hdGEuCi0JICovCi0JRFRQU2NoZW1hV3JhcHBlciBnZXRTY2hlbWFGcm9tQ2F0YWxvZ3Mob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBkdHBTY2hlbWEpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2F0YWxvZyhkdHBTY2hlbWEuZ2V0Q2F0YWxvZygpKS5nZXRTY2hlbWFfKGR0cFNjaGVtYSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBvbmx5IGNhbGxlZCBmcm9tIGEgc2NoZW1hIHdoZW4gdGhlIGRhdGFiYXNlIGlzIHRoZSBzY2hlbWEKLQkgKiBjb250YWluZXIsIHNvIHdlIGtub3cgd2UgZG9uJ3QgaGF2ZSBhbnkgY2F0YWxvZ3MuCi0JICovCi0JQE92ZXJyaWRlCi0JRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZV8oZHRwVGFibGUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSBhIGNhdGFsb2csIHNvIHdlIGtub3cgd2UgaGF2ZSBjYXRhbG9nczsKLQkgKiBpLmUuIHRoZSBzZWFyY2ggaGFzIHRvIGRlc2NlbmQgdGhyb3VnaCBjYXRhbG9ncywgdGhlbiB0byBzY2hlbWF0YS4KLQkgKi8KLQlEVFBUYWJsZVdyYXBwZXIgZ2V0VGFibGVGcm9tQ2F0YWxvZ3Mob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIGR0cFRhYmxlKSB7Ci0JCXJldHVybiB0aGlzLmdldENhdGFsb2coZHRwVGFibGUuZ2V0U2NoZW1hKCkuZ2V0Q2F0YWxvZygpKS5nZXRUYWJsZV8oZHRwVGFibGUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSBhIHNjaGVtYSB3aGVuIHRoZSBkYXRhYmFzZSBpcyB0aGUgc2NoZW1hCi0JICogY29udGFpbmVyLCBzbyB3ZSBrbm93IHdlIGRvbid0IGhhdmUgYW55IGNhdGFsb2dzLgotCSAqLwotCUBPdmVycmlkZQotCURUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtbl8oZHRwQ29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGZyb20gYSBjYXRhbG9nLCBzbyB3ZSBrbm93IHdlIGhhdmUgY2F0YWxvZ3M7Ci0JICogaS5lLiB0aGUgc2VhcmNoIGhhcyB0byBkZXNjZW5kIHRocm91Z2ggY2F0YWxvZ3MsIHRoZW4gdG8gc2NoZW1hdGEuCi0JICovCi0JRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW5Gcm9tQ2F0YWxvZ3Mob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2F0YWxvZyhkdHBDb2x1bW4uZ2V0VGFibGUoKS5nZXRTY2hlbWEoKS5nZXRDYXRhbG9nKCkpLmdldENvbHVtbl8oZHRwQ29sdW1uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2F0YWxvZ3MgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRHJpdmVyQWRhcHRlci5zdXBwb3J0c0NhdGFsb2dzKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPENhdGFsb2c+IGdldENhdGFsb2dzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8Q2F0YWxvZz4odGhpcy5nZXRDYXRhbG9nQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxEVFBDYXRhbG9nV3JhcHBlcj4gZ2V0Q2F0YWxvZ1dyYXBwZXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8RFRQQ2F0YWxvZ1dyYXBwZXI+KHRoaXMuZ2V0Q2F0YWxvZ0FycmF5KCkpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIERUUENhdGFsb2dXcmFwcGVyW10gZ2V0Q2F0YWxvZ0FycmF5KCkgewotCQlpZiAodGhpcy5jYXRhbG9ncyA9PSBudWxsKSB7Ci0JCQl0aGlzLmNhdGFsb2dzID0gdGhpcy5idWlsZENhdGFsb2dBcnJheSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNhdGFsb2dzOwotCX0KLQotCXByaXZhdGUgRFRQQ2F0YWxvZ1dyYXBwZXJbXSBidWlsZENhdGFsb2dBcnJheSgpIHsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZz4gZHRwQ2F0YWxvZ3MgPSB0aGlzLmdldERUUENhdGFsb2dzKCk7Ci0JCURUUENhdGFsb2dXcmFwcGVyW10gcmVzdWx0ID0gbmV3IERUUENhdGFsb2dXcmFwcGVyW2R0cENhdGFsb2dzLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSByZXN1bHQubGVuZ3RoOyBpLS0gPiAwOykgewotCQkJcmVzdWx0W2ldID0gbmV3IERUUENhdGFsb2dXcmFwcGVyKHRoaXMsIGR0cENhdGFsb2dzLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydChyZXN1bHQsIERFRkFVTFRfQ09NUEFSQVRPUik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nPiBnZXREVFBDYXRhbG9ncygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRHJpdmVyQWRhcHRlci5nZXREVFBDYXRhbG9ncygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q2F0YWxvZ3NTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDYXRhbG9nQXJyYXkoKS5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjYXRhbG9nIGZvciB0aGUgc3BlY2lmaWVkIERUUCBjYXRhbG9nLgotCSAqLwotCURUUENhdGFsb2dXcmFwcGVyIGdldENhdGFsb2cob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZHRwQ2F0YWxvZykgewotCQlmb3IgKERUUENhdGFsb2dXcmFwcGVyIGNhdGFsb2cgOiB0aGlzLmdldENhdGFsb2dBcnJheSgpKSB7Ci0JCQlpZiAoY2F0YWxvZy53cmFwcyhkdHBDYXRhbG9nKSkgewotCQkJCXJldHVybiBjYXRhbG9nOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgRFRQIGNhdGFsb2c6ICIgKyBkdHBDYXRhbG9nKTsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRDYXRhbG9nTmFtZXMoKSB7Ci0JCS8vIHRoZSBjYXRhbG9ncyBhcmUgYWxyZWFkeSBzb3J0ZWQKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+KHRoaXMuZ2V0Q2F0YWxvZ1dyYXBwZXJzKCksIE5BTUVfVFJBTlNGT1JNRVIpOwotCX0KLQotCXB1YmxpYyBEVFBDYXRhbG9nV3JhcHBlciBnZXRDYXRhbG9nTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3ROYW1lZCh0aGlzLmdldENhdGFsb2dXcmFwcGVycygpLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRDYXRhbG9nSWRlbnRpZmllcnMoKSB7Ci0JCS8vIHRoZSBjYXRhbG9ncyBhcmUgYWxyZWFkeSBzb3J0ZWQKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+KHRoaXMuZ2V0Q2F0YWxvZ1dyYXBwZXJzKCksIElERU5USUZJRVJfVFJBTlNGT1JNRVIpOwotCX0KLQotCXB1YmxpYyBDYXRhbG9nIGdldENhdGFsb2dGb3JJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiB0aGlzLmR0cERyaXZlckFkYXB0ZXIuc2VsZWN0Q2F0YWxvZ0ZvcklkZW50aWZpZXIodGhpcy5nZXRDYXRhbG9ncygpLCBpZGVudGlmaWVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIERUUENhdGFsb2dXcmFwcGVyIGdldERlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDYXRhbG9nRm9yTmFtZXModGhpcy5nZXREZWZhdWx0Q2F0YWxvZ05hbWVzKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBnZXREZWZhdWx0Q2F0YWxvZ05hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5kdHBEcml2ZXJBZGFwdGVyLmdldERlZmF1bHRDYXRhbG9nTmFtZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGNhdGFsb2cgZm91bmQuCi0JICovCi0JcHJpdmF0ZSBEVFBDYXRhbG9nV3JhcHBlciBnZXRDYXRhbG9nRm9yTmFtZXMoSXRlcmFibGU8U3RyaW5nPiBuYW1lcykgewotCQlmb3IgKFN0cmluZyBuYW1lIDogbmFtZXMpIHsKLQkJCURUUENhdGFsb2dXcmFwcGVyIGNhdGFsb2cgPSB0aGlzLmdldENhdGFsb2dOYW1lZChuYW1lKTsKLQkJCWlmIChjYXRhbG9nICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gY2F0YWxvZzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJZiB3ZSBmaW5kIGEgZGVmYXVsdCBjYXRhbG9nLCByZXR1cm4gaXRzIGlkZW50aWZpZXI7Ci0JICogb3RoZXJ3aXNlLCByZXR1cm4gdGhlIGxhc3QgbmFtZSBvbiB0aGUgbGlzdCBvZiBkZWZhdWx0IG5hbWVzLgotCSAqIChTb21lIGRhdGFiYXNlcyBoYXZlIG11bHRpcGxlIHBvc3NpYmxlIGRlZmF1bHQgbmFtZXMuKQotCSAqIFJldHVybiBudWxsIGlmIHRoZSBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nSWRlbnRpZmllcigpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBuYW1lcyA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2dOYW1lcygpOwotCQlEVFBDYXRhbG9nV3JhcHBlciBjYXRhbG9nID0gdGhpcy5nZXRDYXRhbG9nRm9yTmFtZXMobmFtZXMpOwotCQlpZiAoY2F0YWxvZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY2F0YWxvZy5nZXRJZGVudGlmaWVyKCk7Ci0JCX0KLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBuYW1lcy5pdGVyYXRvcigpOwotCQlyZXR1cm4gc3RyZWFtLmhhc05leHQoKSA/IHRoaXMuY29udmVydE5hbWVUb0lkZW50aWZpZXIoQ29sbGVjdGlvblRvb2xzLmxhc3Qoc3RyZWFtKSkgOiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lcyB2cy4gaWRlbnRpZmllcnMgKioqKioqKioqKgotCi0JLy8gb3ZlcnJpZGUgdG8gbWFrZSBtZXRob2QgcHVibGljIHNpbmNlIGl0J3MgaW4gdGhlIERhdGFiYXNlIGludGVyZmFjZQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29udmVydE5hbWVUb0lkZW50aWZpZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnROYW1lVG9JZGVudGlmaWVyKG5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2UgZ2V0RFRQRGF0YWJhc2UoKSB7Ci0JCXJldHVybiB0aGlzLmR0cERhdGFiYXNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRGF0YWJhc2UuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVuZG9yTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRGF0YWJhc2UuZ2V0VmVuZG9yKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5kdHBEYXRhYmFzZS5nZXRWZXJzaW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRFRQRHJpdmVyQWRhcHRlciBnZXREVFBEcml2ZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5kdHBEcml2ZXJBZGFwdGVyOwotCX0KLQotCXB1YmxpYyBUYWJsZSBzZWxlY3RUYWJsZUZvcklkZW50aWZpZXIoSXRlcmFibGU8VGFibGU+IHRhYmxlcywgU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRHJpdmVyQWRhcHRlci5zZWxlY3RUYWJsZUZvcklkZW50aWZpZXIodGFibGVzLCBpZGVudGlmaWVyKTsKLQl9Ci0KLQkvLyBUT0RPIGFkZCB0byBpbnRlcmZhY2U/IChzbyBpdCBjYW4gYmUgdXNlZCBieSBBYnN0cmFjdERUUERyaXZlckFkYXB0ZXIpCi0JRGF0YWJhc2VEZWZpbml0aW9uIGdldERUUERlZmluaXRpb24oKSB7Ci0JCXJldHVybiBSREJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREYXRhYmFzZURlZmluaXRpb25SZWdpc3RyeSgpLmdldERlZmluaXRpb24odGhpcy5kdHBEYXRhYmFzZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBzdGFydExpc3RlbmluZygpIHsKLQkJaWYgKHRoaXMuY2F0YWxvZ3MgIT0gbnVsbCkgewotCQkJdGhpcy5zdGFydENhdGFsb2dzKCk7Ci0JCX0KLQkJc3VwZXIuc3RhcnRMaXN0ZW5pbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRDYXRhbG9ncygpIHsKLQkJZm9yIChEVFBDYXRhbG9nV3JhcHBlciBjYXRhbG9nIDogdGhpcy5jYXRhbG9ncykgewotCQkJY2F0YWxvZy5zdGFydExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgc3RvcExpc3RlbmluZygpIHsKLQkJaWYgKHRoaXMuY2F0YWxvZ3MgIT0gbnVsbCkgewotCQkJdGhpcy5zdG9wQ2F0YWxvZ3MoKTsKLQkJfQotCQlzdXBlci5zdG9wTGlzdGVuaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3BDYXRhbG9ncygpIHsKLQkJZm9yIChEVFBDYXRhbG9nV3JhcHBlciBjYXRhbG9nIDogdGhpcy5jYXRhbG9ncykgewotCQkJY2F0YWxvZy5zdG9wTGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xlYXIgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKSB7Ci0JCWlmICh0aGlzLmNhdGFsb2dzICE9IG51bGwpIHsKLQkJCXRoaXMuY2xlYXJDYXRhbG9ncygpOwotCQl9Ci0JCXN1cGVyLmNsZWFyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyQ2F0YWxvZ3MoKSB7Ci0JCXRoaXMuc3RvcENhdGFsb2dzKCk7Ci0JCWZvciAoRFRQQ2F0YWxvZ1dyYXBwZXIgY2F0YWxvZyA6IHRoaXMuY2F0YWxvZ3MpIHsKLQkJCWNhdGFsb2cuY2xlYXIoKTsKLQkJfQotCQl0aGlzLmNhdGFsb2dzID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUEZvcmVpZ25LZXlXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUEZvcmVpZ25LZXlXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMzQxYzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBGb3JlaWduS2V5V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Gb3JlaWduS2V5OwotCi0vKioKLSAqICBXcmFwIGEgRFRQIEZvcmVpZ25LZXkKLSAqLwotZmluYWwgY2xhc3MgRFRQRm9yZWlnbktleVdyYXBwZXIKLQlleHRlbmRzIERUUERhdGFiYXNlT2JqZWN0V3JhcHBlcjxEVFBUYWJsZVdyYXBwZXI+Ci0JaW1wbGVtZW50cyBGb3JlaWduS2V5Ci17Ci0JLyoqIHRoZSB3cmFwcGVkIERUUCBmb3JlaWduIGtleSAqLwotCXByaXZhdGUgZmluYWwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuY29uc3RyYWludHMuRm9yZWlnbktleSBkdHBGb3JlaWduS2V5OwotCi0JLyoqIGxhenktaW5pdGlhbGl6ZWQgKi8KLQlwcml2YXRlIERUUFRhYmxlV3JhcHBlciByZWZlcmVuY2VkVGFibGU7Ci0KLQkvKiogbGF6eS1pbml0aWFsaXplZCAqLwotCXByaXZhdGUgTG9jYWxDb2x1bW5QYWlyW10gY29sdW1uUGFpcnM7Ci0KLQkvKiogbGF6eS1pbml0aWFsaXplZCAtIGJ1dCBpdCBjYW4gYmUgJ251bGwnIHNvIHdlIHVzZSBhIGZsYWcgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0QXR0cmlidXRlTmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gZGVmYXVsdEF0dHJpYnV0ZU5hbWVDYWxjdWxhdGVkID0gZmFsc2U7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQRm9yZWlnbktleVdyYXBwZXIoRFRQVGFibGVXcmFwcGVyIGJhc2VUYWJsZSwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuY29uc3RyYWludHMuRm9yZWlnbktleSBkdHBGb3JlaWduS2V5KSB7Ci0JCXN1cGVyKGJhc2VUYWJsZSk7Ci0JCXRoaXMuZHRwRm9yZWlnbktleSA9IGR0cEZvcmVpZ25LZXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUERhdGFiYXNlT2JqZWN0V3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlJQ2F0YWxvZ09iamVjdCBnZXRDYXRhbG9nT2JqZWN0KCkgewotCQlyZXR1cm4gKElDYXRhbG9nT2JqZWN0KSB0aGlzLmR0cEZvcmVpZ25LZXk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2F0YWxvZ09iamVjdENoYW5nZWQoKSB7Ci0JCXN1cGVyLmNhdGFsb2dPYmplY3RDaGFuZ2VkKCk7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5mb3JlaWduS2V5Q2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmdldE5hbWUoKSArICI6ICIgKyBBcnJheXMuYXNMaXN0KHRoaXMuZ2V0Q29sdW1uUGFpckFycmF5KCkpKTsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRm9yZWlnbktleSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cEZvcmVpZ25LZXkuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBEVFBUYWJsZVdyYXBwZXIgZ2V0QmFzZVRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBEVFBUYWJsZVdyYXBwZXIgZ2V0UmVmZXJlbmNlZFRhYmxlKCkgewotCQlpZiAodGhpcy5yZWZlcmVuY2VkVGFibGUgPT0gbnVsbCkgewotCQkJdGhpcy5yZWZlcmVuY2VkVGFibGUgPSB0aGlzLmdldEJhc2VUYWJsZSgpLmdldFRhYmxlKHRoaXMuZHRwRm9yZWlnbktleS5nZXRVbmlxdWVDb25zdHJhaW50KCkuZ2V0QmFzZVRhYmxlKCkpOwotCQl9Ci0JCXJldHVybiB0aGlzLnJlZmVyZW5jZWRUYWJsZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWZlcmVuY2VzU2luZ2xlQ29sdW1uUHJpbWFyeUtleSgpIHsKLQkJaWYgKHRoaXMuZ2V0Q29sdW1uUGFpcnNTaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICh0aGlzLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW5QYWlyKCkuZ2V0UmVmZXJlbmNlZENvbHVtbigpID09IHRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0UHJpbWFyeUtleUNvbHVtbigpOwotCX0KLQotCS8vICoqKioqIGNvbHVtbiBwYWlycwotCi0JcHVibGljIEl0ZXJhYmxlPENvbHVtblBhaXI+IGdldENvbHVtblBhaXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8Q29sdW1uUGFpcj4odGhpcy5nZXRDb2x1bW5QYWlyQXJyYXkoKSk7Ci0JfQotCi0JcHVibGljIExvY2FsQ29sdW1uUGFpciBnZXRDb2x1bW5QYWlyKCkgewotCQlMb2NhbENvbHVtblBhaXJbXSBwYWlycyA9IHRoaXMuZ2V0Q29sdW1uUGFpckFycmF5KCk7Ci0JCWlmIChwYWlycy5sZW5ndGggIT0gMSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibXVsdGlwbGUgY29sdW1uIHBhaXJzOiAiICsgcGFpcnMubGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcGFpcnNbMF07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxMb2NhbENvbHVtblBhaXI+IGdldExvY2FsQ29sdW1uUGFpcnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxMb2NhbENvbHVtblBhaXI+KHRoaXMuZ2V0Q29sdW1uUGFpckFycmF5KCkpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIExvY2FsQ29sdW1uUGFpcltdIGdldENvbHVtblBhaXJBcnJheSgpIHsKLQkJaWYgKHRoaXMuY29sdW1uUGFpcnMgPT0gbnVsbCkgewotCQkJdGhpcy5jb2x1bW5QYWlycyA9IHRoaXMuYnVpbGRDb2x1bW5QYWlyQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jb2x1bW5QYWlyczsKLQl9Ci0KLQlwcml2YXRlIExvY2FsQ29sdW1uUGFpcltdIGJ1aWxkQ29sdW1uUGFpckFycmF5KCkgewotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4+IGJhc2VDb2x1bW5zID0gdGhpcy5nZXREVFBCYXNlQ29sdW1ucygpOwotCQlpbnQgc2l6ZSA9IGJhc2VDb2x1bW5zLnNpemUoKTsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiByZWZDb2x1bW5zID0gdGhpcy5nZXREVFBSZWZlcmVuY2VDb2x1bW5zKCk7Ci0JCWlmIChyZWZDb2x1bW5zLnNpemUoKSAhPSBzaXplKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHRoaXMuZ2V0QmFzZVRhYmxlKCkuZ2V0TmFtZSgpICsgJy4nICsgdGhpcy5nZXROYW1lKCkgKwotCQkJCQkJCQkiIC0gbWlzbWF0Y2hlZCBzaXplczogIiArIHNpemUgKyAiIHZzLiAiICsgcmVmQ29sdW1ucy5zaXplKCkpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCUxvY2FsQ29sdW1uUGFpcltdIHJlc3VsdCA9IG5ldyBMb2NhbENvbHVtblBhaXJbYmFzZUNvbHVtbnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IGJhc2VDb2x1bW5zLnNpemUoKTsgaS0tID4gMDsgKSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgTG9jYWxDb2x1bW5QYWlyKAotCQkJCQkJCQl0aGlzLmdldEJhc2VUYWJsZSgpLmdldENvbHVtbihiYXNlQ29sdW1ucy5nZXQoaSkpLAotCQkJCQkJCQl0aGlzLmdldEJhc2VUYWJsZSgpLmdldENvbHVtbihyZWZDb2x1bW5zLmdldChpKSkKLQkJCQkJCSk7Ci0JCX0KLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydChyZXN1bHQsIENvbHVtblBhaXIuQkFTRV9DT0xVTU5fQ09NUEFSQVRPUik7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBnZXREVFBCYXNlQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRm9yZWlnbktleS5nZXRNZW1iZXJzKCk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBnZXREVFBSZWZlcmVuY2VDb2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5kdHBGb3JlaWduS2V5LmdldFVuaXF1ZUNvbnN0cmFpbnQoKS5nZXRNZW1iZXJzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb2x1bW5QYWlyc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtblBhaXJBcnJheSgpLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8Q29sdW1uPiBnZXRCYXNlQ29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPExvY2FsQ29sdW1uUGFpciwgQ29sdW1uPih0aGlzLmdldExvY2FsQ29sdW1uUGFpcnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29sdW1uIHRyYW5zZm9ybShMb2NhbENvbHVtblBhaXIgcGFpcikgewotCQkJCXJldHVybiBwYWlyLmdldEJhc2VDb2x1bW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlib29sZWFuIGJhc2VDb2x1bW5zQ29udGFpbnMoQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0QmFzZUNvbHVtbnMoKSwgY29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8Q29sdW1uPiBnZXROb25QcmltYXJ5S2V5QmFzZUNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8Q29sdW1uPih0aGlzLmdldEJhc2VDb2x1bW5zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KENvbHVtbiBjb2x1bW4pIHsKLQkJCQlyZXR1cm4gISBjb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPENvbHVtbj4gZ2V0UmVmZXJlbmNlZENvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxMb2NhbENvbHVtblBhaXIsIENvbHVtbj4odGhpcy5nZXRMb2NhbENvbHVtblBhaXJzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbHVtbiB0cmFuc2Zvcm0oTG9jYWxDb2x1bW5QYWlyIGNvbHVtblBhaXIpIHsKLQkJCQlyZXR1cm4gY29sdW1uUGFpci5nZXRSZWZlcmVuY2VkQ29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKiogYXR0cmlidXRlIG5hbWUKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJU3RyaW5nIGRlZmF1bHROYW1lID0gdGhpcy5nZXREZWZhdWx0QXR0cmlidXRlTmFtZSgpOwotCQlyZXR1cm4gKGRlZmF1bHROYW1lICE9IG51bGwpID8gZGVmYXVsdE5hbWUgOiB0aGlzLmdldE5vbkRlZmF1bHRBdHRyaWJ1dGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0RGVmYXVsdEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCWlmICggISB0aGlzLmRlZmF1bHRBdHRyaWJ1dGVOYW1lQ2FsY3VsYXRlZCkgewotCQkJdGhpcy5kZWZhdWx0QXR0cmlidXRlTmFtZUNhbGN1bGF0ZWQgPSB0cnVlOwotCQkJdGhpcy5kZWZhdWx0QXR0cmlidXRlTmFtZSA9IHRoaXMuYnVpbGREZWZhdWx0QXR0cmlidXRlTmFtZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRBdHRyaWJ1dGVOYW1lOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVmYXVsdEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCWlmICggISB0aGlzLnJlZmVyZW5jZXNTaW5nbGVDb2x1bW5QcmltYXJ5S2V5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUxvY2FsQ29sdW1uUGFpciBjb2x1bW5QYWlyID0gdGhpcy5nZXRDb2x1bW5QYWlyKCk7Ci0JCVN0cmluZyBiYXNlQ29sTmFtZSA9IGNvbHVtblBhaXIuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKTsKLQkJU3RyaW5nIHJlZkNvbE5hbWUgPSBjb2x1bW5QYWlyLmdldFJlZmVyZW5jZWRDb2x1bW4oKS5nZXROYW1lKCk7Ci0JCWlmIChiYXNlQ29sTmFtZS5sZW5ndGgoKSA8PSAocmVmQ29sTmFtZS5sZW5ndGgoKSArIDEpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoICEgYmFzZUNvbE5hbWUuZW5kc1dpdGgocmVmQ29sTmFtZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWludCBfaW5kZXggPSBiYXNlQ29sTmFtZS5sZW5ndGgoKSAtIHJlZkNvbE5hbWUubGVuZ3RoKCkgLSAxOwotCQlpZiAoYmFzZUNvbE5hbWUuY2hhckF0KF9pbmRleCkgIT0gJ18nKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gYmFzZUNvbE5hbWUuc3Vic3RyaW5nKDAsIF9pbmRleCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhpcyBpcyBhIHNpbXBsZSAoc2luZ2xlLWNvbHVtbikgZm9yZWlnbiBrZXksIHVzZSB0aGUgbmFtZSBvZiB0aGUKLQkgKiBzaW5nbGUgYmFzZSBjb2x1bW4gdG8gYnVpbGQgYSBuYW1lLiBJZiB0aGlzIGlzIGEgY29tcG91bmQgZm9yZWlnbiBrZXksCi0JICogcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2VkIHRhYmxlLgotCSAqLwotCS8vIFRPRE8gaWYgdGhlcmUgaXMgb25seSBvbmUgRksgdG8gYSBnaXZlbiB0YWJsZSwgdXNlIHRoZSB0YWJsZSdzIG5hbWUgaW5zdGVhZCBvZiB0aGUgY29sdW1uJ3MgbmFtZT8KLQlwcml2YXRlIFN0cmluZyBnZXROb25EZWZhdWx0QXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldENvbHVtblBhaXJzU2l6ZSgpID09IDEpID8KLQkJCQkJCXRoaXMuZ2V0Tm9uRGVmYXVsdEF0dHJpYnV0ZU5hbWVGcm9tQmFzZUNvbHVtbigpIDoKLQkJCQkJCXRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB1bmRlcnNjb3JlIGNoZWNrIGlzIGhlbHBmdWwgd2hlbiB0aGUgcmVmZXJlbmNlZCBjb2x1bW4gaXMgPGVtPm5vdDwvZW0+IHRoZQotCSAqIHByaW1hcnkga2V5IG9mIHRoZSByZWZlcmVuY2VkIHRhYmxlIChpLmUuIGl0IGhhcyBvbmx5IGEgPGVtPnVuaXF1ZTwvZW0+IGNvbnN0cmFpbnQpLgotCSAqIDxwcmU+Ci0JICogICAgIEZvcmVpZ25LZXkoRU1QLkNVQklDTEVfSUQgPT4gQ1VCSUNMRS5JRCkgPT4gIkNVQklDTEUiCi0JICogICAgIEZvcmVpZ25LZXkoRU1QLkNVQklDTEVJRCAgPT4gQ1VCSUNMRS5JRCkgPT4gIkNVQklDTEUiCi0JICogICAgIEZvcmVpZ25LZXkoRU1QLkNVQklDTEVfUEsgPT4gQ1VCSUNMRS5JRCkgPT4gIkNVQklDTEVfUEsiCi0JICogPC9wcmU+Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Tm9uRGVmYXVsdEF0dHJpYnV0ZU5hbWVGcm9tQmFzZUNvbHVtbigpIHsKLQkJTG9jYWxDb2x1bW5QYWlyIGNvbHVtblBhaXIgPSB0aGlzLmdldENvbHVtblBhaXIoKTsKLQkJU3RyaW5nIGJhc2VDb2xOYW1lID0gY29sdW1uUGFpci5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgcmVmQ29sTmFtZSA9IGNvbHVtblBhaXIuZ2V0UmVmZXJlbmNlZENvbHVtbigpLmdldE5hbWUoKTsKLQkJaW50IGxlbiA9IGJhc2VDb2xOYW1lLmxlbmd0aCgpOwotCQlpbnQgcmVmTGVuID0gcmVmQ29sTmFtZS5sZW5ndGgoKTsKLQkJaWYgKChsZW4gPiByZWZMZW4pICYmIGJhc2VDb2xOYW1lLmVuZHNXaXRoKHJlZkNvbE5hbWUpKSB7Ci0JCQlsZW4gPSBsZW4gLSByZWZMZW47Ci0JCQlpZiAoKGxlbiA+IDEpICYmIGJhc2VDb2xOYW1lLmNoYXJBdChsZW4gLSAxKSA9PSAnXycpIHsKLQkJCQlsZW4gPSBsZW4gLSAxOwotCQkJfQotCQl9Ci0JCXJldHVybiBiYXNlQ29sTmFtZS5zdWJzdHJpbmcoMCwgbGVuKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGFtcGxlczo8dWw+Ci0JICogPGxpPk9yYWNsZSBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGT09fSUQgPT4gSUQpIHZzLiAiZm9vIiA9PiBudWxsCi0JICogICAgIDxsaT5Gb3JlaWduS2V5KEZPT19JRCA9PiBGT09fSUQpIHZzLiAiZm9vIiA9PiAiRk9PX0lEIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGT08gPT4gSUQpIHZzLiAiZm9vIiA9PiAiRk9PIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGb29fSUQgPT4gSUQpIHZzLiAiZm9vIiA9PiAiXCJGb29fSURcIiIKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8bGk+UG9zdGdyZVNRTCBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+Rm9yZWlnbktleShmb29faWQgPT4gaWQpIHZzLiAiZm9vIiA9PiBudWxsCi0JICogICAgIDxsaT5Gb3JlaWduS2V5KGZvb19pZCA9PiBmb29faWQpIHZzLiAiZm9vIiA9PiAiZm9vX2lkIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShmb28gPT4gaWQpIHZzLiAiZm9vIiA9PiAiZm9vIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGb29fSUQgPT4gSUQpIHZzLiAiZm9vIiA9PiAiXCJGb29fSURcIiIKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8bGk+U1FMIFNlcnZlciBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+Rm9yZWlnbktleShmb29fSUQgPT4gSUQpIHZzLiAiZm9vIiA9PiBudWxsCi0JICogICAgIDxsaT5Gb3JlaWduS2V5KEZPT19JRCA9PiBGT09fSUQpIHZzLiAiZm9vIiA9PiAiRk9PX0lEIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGT08gPT4gSUQpIHZzLiAiZm9vIiA9PiAiRk9PIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGb29fSUQgPT4gSUQpIHZzLiAiZm9vIiA9PiAiRm9vX0lEIgotCSAqIDwvY29kZT48L3VsPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJU3RyaW5nIGJhc2VDb2x1bW5OYW1lID0gdGhpcy5nZXRDb2x1bW5QYWlyKCkuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKTsKLQkJU3RyaW5nIGRlZmF1bHRCYXNlQ29sdW1uTmFtZSA9IGF0dHJpYnV0ZU5hbWUgKyAnXycgKyB0aGlzLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldFByaW1hcnlLZXlDb2x1bW4oKS5nZXROYW1lKCk7Ci0JCXJldHVybiB0aGlzLmdldERUUERyaXZlckFkYXB0ZXIoKS5jb252ZXJ0TmFtZVRvSWRlbnRpZmllcihiYXNlQ29sdW1uTmFtZSwgZGVmYXVsdEJhc2VDb2x1bW5OYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlib29sZWFuIHdyYXBzKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmNvbnN0cmFpbnRzLkZvcmVpZ25LZXkgZm9yZWlnbktleSkgewotCQlyZXR1cm4gdGhpcy5kdHBGb3JlaWduS2V5ID09IGZvcmVpZ25LZXk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKSB7Ci0JCS8vIHRoZSBmb3JlaWduIGtleSBkb2VzIG5vdCAiY29udGFpbiIgYW55IG90aGVyIG9iamVjdHMsCi0JCS8vIHNvIHdlIGRvbid0IG5lZWQgdG8gZm9yd2FyZCB0aGUgI2NsZWFyKCkKLQkJdGhpcy5kZWZhdWx0QXR0cmlidXRlTmFtZUNhbGN1bGF0ZWQgPSBmYWxzZTsKLQkJdGhpcy5kZWZhdWx0QXR0cmlidXRlTmFtZSA9IG51bGw7Ci0JCXRoaXMuY29sdW1uUGFpcnMgPSAgbnVsbDsKLQkJdGhpcy5yZWZlcmVuY2VkVGFibGUgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2x1bW4gcGFpciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlzdGF0aWMgY2xhc3MgTG9jYWxDb2x1bW5QYWlyIGltcGxlbWVudHMgQ29sdW1uUGFpciB7Ci0JCXByaXZhdGUgZmluYWwgRFRQQ29sdW1uV3JhcHBlciBiYXNlQ29sdW1uOwotCQlwcml2YXRlIGZpbmFsIERUUENvbHVtbldyYXBwZXIgcmVmZXJlbmNlZENvbHVtbjsKLQotCQlMb2NhbENvbHVtblBhaXIoRFRQQ29sdW1uV3JhcHBlciBiYXNlQ29sdW1uLCBEVFBDb2x1bW5XcmFwcGVyIHJlZmVyZW5jZWRDb2x1bW4pIHsKLQkJCXN1cGVyKCk7Ci0JCQlpZiAoKGJhc2VDb2x1bW4gPT0gbnVsbCkgfHwgKHJlZmVyZW5jZWRDb2x1bW4gPT0gbnVsbCkpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuYmFzZUNvbHVtbiA9IGJhc2VDb2x1bW47Ci0JCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW4gPSByZWZlcmVuY2VkQ29sdW1uOwotCQl9Ci0KLQkJcHVibGljIERUUENvbHVtbldyYXBwZXIgZ2V0QmFzZUNvbHVtbigpIHsKLQkJCXJldHVybiB0aGlzLmJhc2VDb2x1bW47Ci0JCX0KLQotCQlwdWJsaWMgRFRQQ29sdW1uV3JhcHBlciBnZXRSZWZlcmVuY2VkQ29sdW1uKCkgewotCQkJcmV0dXJuIHRoaXMucmVmZXJlbmNlZENvbHVtbjsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5iYXNlQ29sdW1uLmdldE5hbWUoKSArICI9PiIgKyB0aGlzLnJlZmVyZW5jZWRDb2x1bW4uZ2V0TmFtZSgpKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmQwZjZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2VPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWFDb250YWluZXI7Ci0KLS8qKgotICogQ29hbGVzY2UgYmVoYXZpb3IgZm9yIGEgc2NoZW1hIGNvbnRhaW5lciAoaS5lLiBkYXRhYmFzZSBvciBjYXRhbG9nKS4KLSAqLwotYWJzdHJhY3QgY2xhc3MgRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlcjxQIGV4dGVuZHMgRFRQRGF0YWJhc2VPYmplY3Q+Ci0JZXh0ZW5kcyBEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXI8UD4KLQlpbXBsZW1lbnRzIFNjaGVtYUNvbnRhaW5lcgotewotCS8qKiBsYXp5LWluaXRpYWxpemVkICovCi0JcHJpdmF0ZSBEVFBTY2hlbWFXcmFwcGVyW10gc2NoZW1hdGE7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlcihQIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2F0YWxvZ09iamVjdENoYW5nZWQoKSB7Ci0JCXN1cGVyLmNhdGFsb2dPYmplY3RDaGFuZ2VkKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFic3RyYWN0IG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEgY29udGFpbmVyJ3MgRFRQIHNjaGVtYXMuCi0JICovCi0JYWJzdHJhY3QgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hPiBnZXREVFBTY2hlbWFzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNjaGVtYSBmb3IgdGhlIHNwZWNpZmllZCBEVFAgc2NoZW1hLgotCSAqLwotCWFic3RyYWN0IERUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hKTsKLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IFRoZSBzY2hlbWEgY29udGFpbmVyIChkYXRhYmFzZSBvciBjYXRhbG9nKSBjb250YWlucwotCSAqIHRoZSBzcGVjaWZpZWQgc2NoZW1hLgotCSAqLwotCURUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hXyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hIGR0cFNjaGVtYSkgewotCQlmb3IgKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hIDogdGhpcy5nZXRTY2hlbWFBcnJheSgpKSB7Ci0JCQlpZiAoc2NoZW1hLndyYXBzKGR0cFNjaGVtYSkpIHsKLQkJCQlyZXR1cm4gc2NoZW1hOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgRFRQIHNjaGVtYTogIiArIGR0cFNjaGVtYSk7ICAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWJsZSBmb3IgdGhlIHNwZWNpZmllZCBEVFAgdGFibGUuCi0JICogVGhpcyBpcyBvbmx5IGNhbGxlZCBmcm9tIGEgc2NoZW1hICh0byBpdHMgY29udGFpbmVyKS4KLQkgKi8KLQlhYnN0cmFjdCBEVFBUYWJsZVdyYXBwZXIgZ2V0VGFibGUob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIGR0cFRhYmxlKTsKLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IFRoZSBzY2hlbWEgY29udGFpbmVyIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgdGFibGUuCi0JICovCi0JRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlXyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2NoZW1hXyhkdHBUYWJsZS5nZXRTY2hlbWEoKSkuZ2V0VGFibGVfKGR0cFRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbHVtbiBmb3IgdGhlIHNwZWNpZmllZCBEVFAgY29sdW1uLgotCSAqIFRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSBhIHNjaGVtYSAodG8gaXRzIGNvbnRhaW5lcikuCi0JICovCi0JYWJzdHJhY3QgRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW4ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pOwotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogVGhlIHNjaGVtYSBjb250YWluZXIgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjb2x1bW4uCi0JICovCi0JRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW5fKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmdldFRhYmxlXyhkdHBDb2x1bW4uZ2V0VGFibGUoKSkuZ2V0Q29sdW1uXyhkdHBDb2x1bW4pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzY2hlbWF0YSAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8U2NoZW1hPiBnZXRTY2hlbWF0YSgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPFNjaGVtYT4odGhpcy5nZXRTY2hlbWFBcnJheSgpKTsKLQl9Ci0KLQlJdGVyYWJsZTxEVFBTY2hlbWFXcmFwcGVyPiBnZXRTY2hlbWFXcmFwcGVycygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPERUUFNjaGVtYVdyYXBwZXI+KHRoaXMuZ2V0U2NoZW1hQXJyYXkoKSk7Ci0JfQotCi0Jc3luY2hyb25pemVkIERUUFNjaGVtYVdyYXBwZXJbXSBnZXRTY2hlbWFBcnJheSgpIHsKLQkJaWYgKHRoaXMuc2NoZW1hdGEgPT0gbnVsbCkgewotCQkJdGhpcy5zY2hlbWF0YSA9IHRoaXMuYnVpbGRTY2hlbWFBcnJheSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLnNjaGVtYXRhOwotCX0KLQotCXByaXZhdGUgRFRQU2NoZW1hV3JhcHBlcltdIGJ1aWxkU2NoZW1hQXJyYXkoKSB7Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYT4gZHRwU2NoZW1hdGEgPSB0aGlzLmdldERUUFNjaGVtYXMoKTsKLQkJRFRQU2NoZW1hV3JhcHBlcltdIHJlc3VsdCA9IG5ldyBEVFBTY2hlbWFXcmFwcGVyW2R0cFNjaGVtYXRhLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSByZXN1bHQubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCXJlc3VsdFtpXSA9IG5ldyBEVFBTY2hlbWFXcmFwcGVyKHRoaXMsIGR0cFNjaGVtYXRhLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydChyZXN1bHQsIERFRkFVTFRfQ09NUEFSQVRPUik7Ci0JfQotCi0JcHVibGljIGludCBnZXRTY2hlbWF0YVNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFNjaGVtYUFycmF5KCkubGVuZ3RoOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZFNjaGVtYU5hbWVzKCkgewotCQkvLyB0aGUgc2NoZW1hdGEgYXJlIGFscmVhZHkgc29ydGVkCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxEYXRhYmFzZU9iamVjdCwgU3RyaW5nPih0aGlzLmdldFNjaGVtYVdyYXBwZXJzKCksIE5BTUVfVFJBTlNGT1JNRVIpOwotCX0KLQotCXB1YmxpYyBEVFBTY2hlbWFXcmFwcGVyIGdldFNjaGVtYU5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0TmFtZWQodGhpcy5nZXRTY2hlbWFXcmFwcGVycygpLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRTY2hlbWFJZGVudGlmaWVycygpIHsKLQkJLy8gdGhlIHNjaGVtYXRhIGFyZSBhbHJlYWR5IHNvcnRlZAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8RGF0YWJhc2VPYmplY3QsIFN0cmluZz4odGhpcy5nZXRTY2hlbWFXcmFwcGVycygpLCBJREVOVElGSUVSX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwdWJsaWMgU2NoZW1hIGdldFNjaGVtYUZvcklkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RFRQRHJpdmVyQWRhcHRlcigpLnNlbGVjdFNjaGVtYUZvcklkZW50aWZpZXIodGhpcy5nZXRTY2hlbWF0YSgpLCBpZGVudGlmaWVyKTsKLQl9Ci0KLQlwdWJsaWMgRFRQU2NoZW1hV3JhcHBlciBnZXREZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTY2hlbWFGb3JOYW1lcyh0aGlzLmdldERUUERyaXZlckFkYXB0ZXIoKS5nZXREZWZhdWx0U2NoZW1hTmFtZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBzY2hlbWEgZm91bmQuCi0JICovCi0JRFRQU2NoZW1hV3JhcHBlciBnZXRTY2hlbWFGb3JOYW1lcyhJdGVyYWJsZTxTdHJpbmc+IG5hbWVzKSB7Ci0JCWZvciAoU3RyaW5nIG5hbWUgOiBuYW1lcykgewotCQkJRFRQU2NoZW1hV3JhcHBlciBzY2hlbWEgPSB0aGlzLmdldFNjaGVtYU5hbWVkKG5hbWUpOwotCQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHNjaGVtYTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJZiB3ZSBmaW5kIGEgZGVmYXVsdCBzY2hlbWEsIHJldHVybiBpdHMgaWRlbnRpZmllcjsKLQkgKiBvdGhlcndpc2UsIHJldHVybiB0aGUgbGFzdCBuYW1lIG9uIHRoZSBsaXN0IG9mIGRlZmF1bHQgbmFtZXMuCi0JICogKFNvbWUgY29udGFpbmVycyBoYXZlIG11bHRpcGxlIHBvc3NpYmxlIGRlZmF1bHQgbmFtZXMuKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldERlZmF1bHRTY2hlbWFJZGVudGlmaWVyKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IG5hbWVzID0gdGhpcy5nZXREVFBEcml2ZXJBZGFwdGVyKCkuZ2V0RGVmYXVsdFNjaGVtYU5hbWVzKCk7Ci0JCURUUFNjaGVtYVdyYXBwZXIgc2NoZW1hID0gdGhpcy5nZXRTY2hlbWFGb3JOYW1lcyhuYW1lcyk7Ci0JCS8vIGFzc3VtZSAnbmFtZXMnIGlzIG5vbi1lbXB0eSAoISkKLQkJcmV0dXJuIChzY2hlbWEgIT0gbnVsbCkgPwotCQkJCXNjaGVtYS5nZXRJZGVudGlmaWVyKCkgOgotCQkJCXRoaXMuY29udmVydE5hbWVUb0lkZW50aWZpZXIoQ29sbGVjdGlvblRvb2xzLmxhc3QobmFtZXMpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIHN0YXJ0TGlzdGVuaW5nKCkgewotCQlpZiAodGhpcy5zY2hlbWF0YSAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0YXJ0U2NoZW1hdGEoKTsKLQkJfQotCQlzdXBlci5zdGFydExpc3RlbmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydFNjaGVtYXRhKCkgewotCQlmb3IgKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hIDogdGhpcy5zY2hlbWF0YSkgewotCQkJc2NoZW1hLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBzdG9wTGlzdGVuaW5nKCkgewotCQlpZiAodGhpcy5zY2hlbWF0YSAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0b3BTY2hlbWF0YSgpOwotCQl9Ci0JCXN1cGVyLnN0b3BMaXN0ZW5pbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcFNjaGVtYXRhKCkgewotCQlmb3IgKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hIDogdGhpcy5zY2hlbWF0YSkgewotCQkJc2NoZW1hLnN0b3BMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbGVhciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHsKLQkJaWYgKHRoaXMuc2NoZW1hdGEgIT0gbnVsbCkgewotCQkJdGhpcy5jbGVhclNjaGVtYXRhKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJTY2hlbWF0YSgpIHsKLQkJdGhpcy5zdG9wU2NoZW1hdGEoKTsKLQkJZm9yIChEVFBTY2hlbWFXcmFwcGVyIHNjaGVtYSA6IHRoaXMuc2NoZW1hdGEpIHsKLQkJCXNjaGVtYS5jbGVhcigpOwotCQl9Ci0JCXRoaXMuc2NoZW1hdGEgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQU2NoZW1hV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBTY2hlbWFXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYzcwNDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBTY2hlbWFXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlNRTFRhYmxlc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotLyoqCi0gKiAgV3JhcCBhIERUUCBTY2hlbWEKLSAqLwotZmluYWwgY2xhc3MgRFRQU2NoZW1hV3JhcHBlcgotCWV4dGVuZHMgRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyPERUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXI8Pz4+Ci0JaW1wbGVtZW50cyBTY2hlbWEKLXsKLQkvKiogdGhlIHdyYXBwZWQgRFRQIHNjaGVtYSAqLwotCXByaXZhdGUgZmluYWwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBkdHBTY2hlbWE7Ci0KLQkvKiogbGF6eS1pbml0aWFsaXplZCAqLwotCXByaXZhdGUgRFRQVGFibGVXcmFwcGVyW10gdGFibGVzOwotCi0JLyoqIGxhenktaW5pdGlhbGl6ZWQgKi8KLQlwcml2YXRlIERUUFNlcXVlbmNlV3JhcHBlcltdIHNlcXVlbmNlczsKLQotCQotCS8vICoqKioqKioqKiogY29uc3RhbnRzICoqKioqKioqKioKLQkKLQkvKiogdXNlZCBmb3IgYWRvcHRlciBwcm9kdWN0IGN1c3RvbWl6YXRpb24gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOVF9BTkRfVklFV19UQUJMRVNfT05MWSA9ICJzdXBwb3J0UGVyc2lzdGVudEFuZFZpZXdUYWJsZXNPbmx5IjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCURUUFNjaGVtYVdyYXBwZXIoRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlcjw/PiBjb250YWluZXIsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hKSB7Ci0JCXN1cGVyKGNvbnRhaW5lcik7Ci0JCXRoaXMuZHRwU2NoZW1hID0gZHRwU2NoZW1hOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JSUNhdGFsb2dPYmplY3QgZ2V0Q2F0YWxvZ09iamVjdCgpIHsKLQkJcmV0dXJuIChJQ2F0YWxvZ09iamVjdCkgdGhpcy5kdHBTY2hlbWE7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2F0YWxvZ09iamVjdENoYW5nZWQoKSB7Ci0JCXN1cGVyLmNhdGFsb2dPYmplY3RDaGFuZ2VkKCk7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5zY2hlbWFDaGFuZ2VkKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTY2hlbWEgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBTY2hlbWEuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBEVFBTY2hlbWFDb250YWluZXJXcmFwcGVyPD8+IGdldENvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50OwotCX0KLQotCS8vICoqKioqIHRhYmxlcwotCi0JcHVibGljIEl0ZXJhYmxlPFRhYmxlPiBnZXRUYWJsZXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxUYWJsZT4odGhpcy5nZXRUYWJsZUFycmF5KCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8RFRQVGFibGVXcmFwcGVyPiBnZXRUYWJsZVdyYXBwZXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8RFRQVGFibGVXcmFwcGVyPih0aGlzLmdldFRhYmxlQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgRFRQVGFibGVXcmFwcGVyW10gZ2V0VGFibGVBcnJheSgpIHsKLQkJaWYgKHRoaXMudGFibGVzID09IG51bGwpIHsKLQkJCXRoaXMudGFibGVzID0gdGhpcy5idWlsZFRhYmxlQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy50YWJsZXM7Ci0JfQotCi0JcHJpdmF0ZSBEVFBUYWJsZVdyYXBwZXJbXSBidWlsZFRhYmxlQXJyYXkoKSB7Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlPiBkdHBUYWJsZXMgPSB0aGlzLmdldERUUFRhYmxlcygpOwotCQlEVFBUYWJsZVdyYXBwZXJbXSByZXN1bHQgPSBuZXcgRFRQVGFibGVXcmFwcGVyW2R0cFRhYmxlcy5zaXplKCldOwotCQlmb3IgKGludCBpID0gcmVzdWx0Lmxlbmd0aDsgaS0tID4gMDspIHsKLQkJCXJlc3VsdFtpXSA9IG5ldyBEVFBUYWJsZVdyYXBwZXIodGhpcywgZHRwVGFibGVzLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydChyZXN1bHQsIERFRkFVTFRfQ09NUEFSQVRPUik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZT4gZ2V0RFRQVGFibGVzKCkgewotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZT4gZHRwVGFibGVzID0gdGhpcy5nZXREVFBUYWJsZXNfKCk7Ci0JCXJldHVybiB0aGlzLmhhY2soKSA/IHRoaXMuaGFjayhkdHBUYWJsZXMpIDogZHRwVGFibGVzOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlPiBnZXREVFBUYWJsZXNfKCkgewotCQlyZXR1cm4gdGhpcy5kdHBTY2hlbWEuZ2V0VGFibGVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhY2soKSB7Ci0JCS8vIHRoZSBwcm9kdWN0IGlzIG51bGwgZHVyaW5nIGp1bml0IHRlc3RpbmcKLQkJSVByb2R1Y3QgcHJvZHVjdCA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKTsKLQkJU3RyaW5nIGhhY2sgPSAocHJvZHVjdCA9PSBudWxsKSA/IG51bGwgOiBwcm9kdWN0LmdldFByb3BlcnR5KFBFUlNJU1RFTlRfQU5EX1ZJRVdfVEFCTEVTX09OTFkpOwotCQlyZXR1cm4gKGhhY2sgIT0gbnVsbCkgJiYgaGFjay5lcXVhbHMoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBEVFAgZXh0ZW5kZXJzIHRoYXQgc3VwcG9ydCBzeW5vbnltcyBidXQgZG9uJ3Qgd2FudCB0byBoYXZlIHRoZW0gYXBwZWFyCi0JLy8gaW4gRGFsaSB0byBmaWx0ZXIgb3V0IHRoZXNlIHRhYmxlIHR5cGVzIGZyb20gRGFsaSAKLQlwcml2YXRlIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlPiBoYWNrKExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlPiBkdHBUYWJsZXMpIHsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlPigpOwotCQlmb3IgKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSA6IGR0cFRhYmxlcykgewotCQkJaWYgKHRoaXMuaGFjayhkdHBUYWJsZSkpIHsKLQkJCQlyZXN1bHQuYWRkKGR0cFRhYmxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYWNrKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSkgewotCQlyZXR1cm4gU1FMVGFibGVzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGVyc2lzdGVudFRhYmxlKCkuaXNTdXBlclR5cGVPZihkdHBUYWJsZS5lQ2xhc3MoKSkgfHwKLQkJCQkJU1FMVGFibGVzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Vmlld1RhYmxlKCkuaXNTdXBlclR5cGVPZihkdHBUYWJsZS5lQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUYWJsZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZUFycmF5KCkubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgRFRQIHRhYmxlCi0JICovCi0JRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSkgewotCQkvLyB0cnkgdG8gc2hvcnQtY2lyY3VpdCB0aGUgc2VhcmNoCi0JCXJldHVybiB0aGlzLndyYXBzKGR0cFRhYmxlLmdldFNjaGVtYSgpKSA/Ci0JCQkJCQl0aGlzLmdldFRhYmxlXyhkdHBUYWJsZSkgOgotCQkJCQkJdGhpcy5nZXRDb250YWluZXIoKS5nZXRUYWJsZShkdHBUYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBzY2hlbWEgY29udGFpbnMgdGhlIHNwZWNpZmllZCB0YWJsZQotCSAqLwotCURUUFRhYmxlV3JhcHBlciBnZXRUYWJsZV8ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIGR0cFRhYmxlKSB7Ci0JCWZvciAoRFRQVGFibGVXcmFwcGVyIHRhYmxlIDogdGhpcy5nZXRUYWJsZUFycmF5KCkpIHsKLQkJCWlmICh0YWJsZS53cmFwcyhkdHBUYWJsZSkpIHsKLQkJCQlyZXR1cm4gdGFibGU7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBEVFAgdGFibGU6ICIgKyBkdHBUYWJsZSk7ICAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIERUUFRhYmxlV3JhcHBlciBnZXRUYWJsZU5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0TmFtZWQodGhpcy5nZXRUYWJsZVdyYXBwZXJzKCksIG5hbWUpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZFRhYmxlSWRlbnRpZmllcnMoKSB7Ci0JCS8vIHRoZSB0YWJsZXMgYXJlIGFscmVhZHkgc29ydGVkCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxEYXRhYmFzZU9iamVjdCwgU3RyaW5nPih0aGlzLmdldFRhYmxlV3JhcHBlcnMoKSwgSURFTlRJRklFUl9UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHVibGljIFRhYmxlIGdldFRhYmxlRm9ySWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gdGhpcy5nZXREVFBEcml2ZXJBZGFwdGVyKCkuc2VsZWN0VGFibGVGb3JJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVzKCksIGlkZW50aWZpZXIpOwotCX0KLQotCS8vICoqKioqIHNlcXVlbmNlcwotCi0JcHVibGljIEl0ZXJhYmxlPFNlcXVlbmNlPiBnZXRTZXF1ZW5jZXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxTZXF1ZW5jZT4odGhpcy5nZXRTZXF1ZW5jZUFycmF5KCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8RFRQU2VxdWVuY2VXcmFwcGVyPiBnZXRTZXF1ZW5jZVdyYXBwZXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8RFRQU2VxdWVuY2VXcmFwcGVyPih0aGlzLmdldFNlcXVlbmNlQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgRFRQU2VxdWVuY2VXcmFwcGVyW10gZ2V0U2VxdWVuY2VBcnJheSgpIHsKLQkJaWYgKHRoaXMuc2VxdWVuY2VzID09IG51bGwpIHsKLQkJCXRoaXMuc2VxdWVuY2VzID0gdGhpcy5idWlsZFNlcXVlbmNlQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zZXF1ZW5jZXM7Ci0JfQotCi0JcHJpdmF0ZSBEVFBTZXF1ZW5jZVdyYXBwZXJbXSBidWlsZFNlcXVlbmNlQXJyYXkoKSB7Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNlcXVlbmNlPiBkdHBTZXF1ZW5jZXMgPSB0aGlzLmdldERUUFNlcXVlbmNlcygpOwotCQlEVFBTZXF1ZW5jZVdyYXBwZXJbXSByZXN1bHQgPSBuZXcgRFRQU2VxdWVuY2VXcmFwcGVyW2R0cFNlcXVlbmNlcy5zaXplKCldOwotCQlmb3IgKGludCBpID0gcmVzdWx0Lmxlbmd0aDsgaS0tID4gMDspIHsKLQkJCXJlc3VsdFtpXSA9IG5ldyBEVFBTZXF1ZW5jZVdyYXBwZXIodGhpcywgZHRwU2VxdWVuY2VzLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydChyZXN1bHQsIERFRkFVTFRfQ09NUEFSQVRPUik7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2VxdWVuY2U+IGdldERUUFNlcXVlbmNlcygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwU2NoZW1hLmdldFNlcXVlbmNlcygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2VxdWVuY2VzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2VxdWVuY2VBcnJheSgpLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgRFRQU2VxdWVuY2VXcmFwcGVyIGdldFNlcXVlbmNlTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3ROYW1lZCh0aGlzLmdldFNlcXVlbmNlV3JhcHBlcnMoKSwgbmFtZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U29ydGVkU2VxdWVuY2VJZGVudGlmaWVycygpIHsKLQkJLy8gdGhlIHNlcXVlbmNlcyBhcmUgYWxyZWFkeSBzb3J0ZWQKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+KHRoaXMuZ2V0U2VxdWVuY2VXcmFwcGVycygpLCBJREVOVElGSUVSX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwdWJsaWMgU2VxdWVuY2UgZ2V0U2VxdWVuY2VGb3JJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiB0aGlzLmdldERUUERyaXZlckFkYXB0ZXIoKS5zZWxlY3RTZXF1ZW5jZUZvcklkZW50aWZpZXIodGhpcy5nZXRTZXF1ZW5jZXMoKSwgaWRlbnRpZmllcik7Ci0JfQotCi0JLy8gKioqKiogcmVmcmVzaAotCQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCQotCQl0aGlzLmdldENhdGFsb2dPYmplY3QoKS5yZWZyZXNoKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCWJvb2xlYW4gd3JhcHMob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBzY2hlbWEpIHsKLQkJcmV0dXJuIHRoaXMuZHRwU2NoZW1hID09IHNjaGVtYTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbHVtbiBmb3IgdGhlIHNwZWNpZmllZCBEVFAgY29sdW1uLgotCSAqLwotCURUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCS8vIHRyeSB0byBzaG9ydC1jaXJjdWl0IHRoZSBzZWFyY2gKLQkJcmV0dXJuIHRoaXMud3JhcHMoZHRwQ29sdW1uLmdldFRhYmxlKCkuZ2V0U2NoZW1hKCkpID8KLQkJCQkJCXRoaXMuZ2V0Q29sdW1uXyhkdHBDb2x1bW4pIDoKLQkJCQkJCXRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0Q29sdW1uKGR0cENvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQXNzdW1lIHRoZSBzY2hlbWEgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjb2x1bW4uCi0JICovCi0JRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW5fKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmdldFRhYmxlXyhkdHBDb2x1bW4uZ2V0VGFibGUoKSkuZ2V0Q29sdW1uXyhkdHBDb2x1bW4pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5pbmcgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgc3RhcnRMaXN0ZW5pbmcoKSB7Ci0JCWlmICh0aGlzLnNlcXVlbmNlcyAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0YXJ0U2VxdWVuY2VzKCk7Ci0JCX0KLQkJaWYgKHRoaXMudGFibGVzICE9IG51bGwpIHsKLQkJCXRoaXMuc3RhcnRUYWJsZXMoKTsKLQkJfQotCQlzdXBlci5zdGFydExpc3RlbmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydFNlcXVlbmNlcygpIHsKLQkJZm9yIChEVFBTZXF1ZW5jZVdyYXBwZXIgc2VxdWVuY2UgOiB0aGlzLnNlcXVlbmNlcykgewotCQkJc2VxdWVuY2Uuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydFRhYmxlcygpIHsKLQkJZm9yIChEVFBUYWJsZVdyYXBwZXIgdGFibGUgOiB0aGlzLnRhYmxlcykgewotCQkJdGFibGUuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIHN0b3BMaXN0ZW5pbmcoKSB7Ci0JCWlmICh0aGlzLnNlcXVlbmNlcyAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0b3BTZXF1ZW5jZXMoKTsKLQkJfQotCQlpZiAodGhpcy50YWJsZXMgIT0gbnVsbCkgewotCQkJdGhpcy5zdG9wVGFibGVzKCk7Ci0JCX0KLQkJc3VwZXIuc3RvcExpc3RlbmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9wU2VxdWVuY2VzKCkgewotCQlmb3IgKERUUFNlcXVlbmNlV3JhcHBlciBzZXF1ZW5jZSA6IHRoaXMuc2VxdWVuY2VzKSB7Ci0JCQlzZXF1ZW5jZS5zdG9wTGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcFRhYmxlcygpIHsKLQkJZm9yIChEVFBUYWJsZVdyYXBwZXIgdGFibGUgOiB0aGlzLnRhYmxlcykgewotCQkJdGFibGUuc3RvcExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsZWFyICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNsZWFyKCkgewotCQlpZiAodGhpcy5zZXF1ZW5jZXMgIT0gbnVsbCkgewotCQkJdGhpcy5jbGVhclNlcXVlbmNlcygpOwotCQl9Ci0JCWlmICh0aGlzLnRhYmxlcyAhPSBudWxsKSB7Ci0JCQl0aGlzLmNsZWFyVGFibGVzKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJTZXF1ZW5jZXMoKSB7Ci0JCXRoaXMuc3RvcFNlcXVlbmNlcygpOwotCQlmb3IgKERUUFNlcXVlbmNlV3JhcHBlciBzZXF1ZW5jZSA6IHRoaXMuc2VxdWVuY2VzKSB7Ci0JCQlzZXF1ZW5jZS5jbGVhcigpOwotCQl9Ci0JCXRoaXMuc2VxdWVuY2VzID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJUYWJsZXMoKSB7Ci0JCXRoaXMuc3RvcFRhYmxlcygpOwotCQlmb3IgKERUUFRhYmxlV3JhcHBlciB0YWJsZSA6IHRoaXMudGFibGVzKSB7Ci0JCQl0YWJsZS5jbGVhcigpOwotCQl9Ci0JCXRoaXMudGFibGVzID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUFNlcXVlbmNlV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBTZXF1ZW5jZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxMTRlMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUFNlcXVlbmNlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TZXF1ZW5jZTsKLQotLyoqCi0gKiAgV3JhcCBhIERUUCBTZXF1ZW5jZQotICovCi1maW5hbCBjbGFzcyBEVFBTZXF1ZW5jZVdyYXBwZXIKLQlleHRlbmRzIERUUERhdGFiYXNlT2JqZWN0V3JhcHBlcjxEVFBTY2hlbWFXcmFwcGVyPgotCWltcGxlbWVudHMgU2VxdWVuY2UKLXsKLQkvKiogdGhlIHdyYXBwZWQgRFRQIHNlcXVlbmNlICovCi0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2VxdWVuY2UgZHRwU2VxdWVuY2U7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQU2VxdWVuY2VXcmFwcGVyKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2VxdWVuY2UgZHRwU2VxdWVuY2UpIHsKLQkJc3VwZXIoc2NoZW1hKTsKLQkJdGhpcy5kdHBTZXF1ZW5jZSA9IGR0cFNlcXVlbmNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JSUNhdGFsb2dPYmplY3QgZ2V0Q2F0YWxvZ09iamVjdCgpIHsKLQkJcmV0dXJuIChJQ2F0YWxvZ09iamVjdCkgdGhpcy5kdHBTZXF1ZW5jZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjYXRhbG9nT2JqZWN0Q2hhbmdlZCgpIHsKLQkJc3VwZXIuY2F0YWxvZ09iamVjdENoYW5nZWQoKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLnNlcXVlbmNlQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU2VxdWVuY2UgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBTZXF1ZW5jZS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIERUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JYm9vbGVhbiB3cmFwcyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2VxdWVuY2Ugc2VxdWVuY2UpIHsKLQkJcmV0dXJuIHRoaXMuZHRwU2VxdWVuY2UgPT0gc2VxdWVuY2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCBjbGVhcigpIHsKLQkJLy8gbm8gc3RhdGUgdG8gY2xlYXIKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQVGFibGVXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUFRhYmxlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2E1OGM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQVGFibGVXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5jb25zdHJhaW50cy5QcmltYXJ5S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5CYXNlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotCi0vKioKLSAqICBXcmFwIGEgRFRQIFRhYmxlCi0gKi8KLWZpbmFsIGNsYXNzIERUUFRhYmxlV3JhcHBlcgotCWV4dGVuZHMgRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyPERUUFNjaGVtYVdyYXBwZXI+Ci0JaW1wbGVtZW50cyBUYWJsZQotewotCS8qKiB0aGUgd3JhcHBlZCBEVFAgdGFibGUgKi8KLQlwcml2YXRlIGZpbmFsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZTsKLQotCS8qKiBsYXp5LWluaXRpYWxpemVkICovCi0JcHJpdmF0ZSBEVFBDb2x1bW5XcmFwcGVyW10gY29sdW1uczsKLQotCS8qKiBsYXp5LWluaXRpYWxpemVkICovCi0JcHJpdmF0ZSBEVFBDb2x1bW5XcmFwcGVyW10gcHJpbWFyeUtleUNvbHVtbnM7Ci0KLQkvKiogbGF6eS1pbml0aWFsaXplZCAqLwotCXByaXZhdGUgRFRQRm9yZWlnbktleVdyYXBwZXJbXSBmb3JlaWduS2V5czsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFRQQ29sdW1uV3JhcHBlcltdIEVNUFRZX0NPTFVNTlMgPSBuZXcgRFRQQ29sdW1uV3JhcHBlclswXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEVFBGb3JlaWduS2V5V3JhcHBlcltdIEVNUFRZX0ZPUkVJR05fS0VZUyA9IG5ldyBEVFBGb3JlaWduS2V5V3JhcHBlclswXTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlEVFBUYWJsZVdyYXBwZXIoRFRQU2NoZW1hV3JhcHBlciBzY2hlbWEsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSkgewotCQlzdXBlcihzY2hlbWEpOwotCQl0aGlzLmR0cFRhYmxlID0gZHRwVGFibGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPENvbHVtbj4gZ2V0Q29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPENvbHVtbj4odGhpcy5nZXRDb2x1bW5BcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPERUUENvbHVtbldyYXBwZXI+IGdldENvbHVtbldyYXBwZXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8RFRQQ29sdW1uV3JhcHBlcj4odGhpcy5nZXRDb2x1bW5BcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBEVFBDb2x1bW5XcmFwcGVyW10gZ2V0Q29sdW1uQXJyYXkoKSB7Ci0JCWlmICh0aGlzLmNvbHVtbnMgPT0gbnVsbCkgewotCQkJdGhpcy5jb2x1bW5zID0gdGhpcy5idWlsZENvbHVtbkFycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY29sdW1uczsKLQl9Ci0KLQlwcml2YXRlIERUUENvbHVtbldyYXBwZXJbXSBidWlsZENvbHVtbkFycmF5KCkgewotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4+IGR0cENvbHVtbnMgPSB0aGlzLmdldERUUENvbHVtbnMoKTsKLQkJRFRQQ29sdW1uV3JhcHBlcltdIHJlc3VsdCA9IG5ldyBEVFBDb2x1bW5XcmFwcGVyW2R0cENvbHVtbnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IHJlc3VsdC5sZW5ndGg7IGktLSA+IDA7KSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgRFRQQ29sdW1uV3JhcHBlcih0aGlzLCBkdHBDb2x1bW5zLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydChyZXN1bHQsIERFRkFVTFRfQ09NUEFSQVRPUik7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBnZXREVFBDb2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5kdHBUYWJsZS5nZXRDb2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uQXJyYXkoKS5sZW5ndGg7Ci0JfQotCi0JcHVibGljIERUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3ROYW1lZCh0aGlzLmdldENvbHVtbldyYXBwZXJzKCksIG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29sdW1uIGZvciB0aGUgc3BlY2lmaWVkIERUUCBjb2x1bW4uCi0JICovCi0JRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW4ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJLy8gdHJ5IHRvIHNob3J0LWNpcmN1aXQgdGhlIHNlYXJjaAotCQlyZXR1cm4gdGhpcy53cmFwcyhkdHBDb2x1bW4uZ2V0VGFibGUoKSkgPwotCQkJCQkJdGhpcy5nZXRDb2x1bW5fKGR0cENvbHVtbikgOgotCQkJCQkJdGhpcy5nZXRTY2hlbWEoKS5nZXRDb2x1bW4oZHRwQ29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBUaGUgdGFibGUgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjb2x1bW4uCi0JICovCi0JRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW5fKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCWZvciAoRFRQQ29sdW1uV3JhcHBlciBjb2x1bW4gOiB0aGlzLmdldENvbHVtbkFycmF5KCkpIHsKLQkJCWlmIChjb2x1bW4ud3JhcHMoZHRwQ29sdW1uKSkgewotCQkJCXJldHVybiBjb2x1bW47Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBEVFAgY29sdW1uOiAiICsgZHRwQ29sdW1uKTsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRDb2x1bW5JZGVudGlmaWVycygpIHsKLQkJLy8gdGhlIGNvbHVtbnMgYXJlIGFscmVhZHkgc29ydGVkCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxEYXRhYmFzZU9iamVjdCwgU3RyaW5nPih0aGlzLmdldENvbHVtbldyYXBwZXJzKCksIElERU5USUZJRVJfVFJBTlNGT1JNRVIpOwotCX0KLQotCXB1YmxpYyBDb2x1bW4gZ2V0Q29sdW1uRm9ySWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gdGhpcy5nZXREVFBEcml2ZXJBZGFwdGVyKCkuc2VsZWN0Q29sdW1uRm9ySWRlbnRpZmllcih0aGlzLmdldENvbHVtbnMoKSwgaWRlbnRpZmllcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW1hcnkga2V5IGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPENvbHVtbj4gZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxDb2x1bW4+KHRoaXMuZ2V0UHJpbWFyeUtleUNvbHVtbkFycmF5KCkpOwotCX0KLQotCXB1YmxpYyBEVFBDb2x1bW5XcmFwcGVyIGdldFByaW1hcnlLZXlDb2x1bW4oKSB7Ci0JCURUUENvbHVtbldyYXBwZXJbXSBwa0NvbHVtbnMgPSB0aGlzLmdldFByaW1hcnlLZXlDb2x1bW5BcnJheSgpOwotCQlpZiAocGtDb2x1bW5zLmxlbmd0aCAhPSAxKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtdWx0aXBsZSBwcmltYXJ5IGtleSBjb2x1bW5zOiAiICsgcGtDb2x1bW5zLmxlbmd0aCk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHBrQ29sdW1uc1swXTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBEVFBDb2x1bW5XcmFwcGVyW10gZ2V0UHJpbWFyeUtleUNvbHVtbkFycmF5KCkgewotCQlpZiAodGhpcy5wcmltYXJ5S2V5Q29sdW1ucyA9PSBudWxsKSB7Ci0JCQl0aGlzLnByaW1hcnlLZXlDb2x1bW5zID0gdGhpcy5idWlsZFByaW1hcnlLZXlDb2x1bW5BcnJheSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLnByaW1hcnlLZXlDb2x1bW5zOwotCX0KLQotCXByaXZhdGUgRFRQQ29sdW1uV3JhcHBlcltdIGJ1aWxkUHJpbWFyeUtleUNvbHVtbkFycmF5KCkgewotCQlpZiAoICEgKHRoaXMuZHRwVGFibGUgaW5zdGFuY2VvZiBCYXNlVGFibGUpKSB7Ci0JCQlyZXR1cm4gRU1QVFlfQ09MVU1OUzsKLQkJfQotCQlQcmltYXJ5S2V5IHBrID0gKChCYXNlVGFibGUpIHRoaXMuZHRwVGFibGUpLmdldFByaW1hcnlLZXkoKTsKLQkJaWYgKHBrID09IG51bGwpIHsKLQkJCS8vIG5vIFBLIHdhcyBkZWZpbmVkCi0JCQlyZXR1cm4gRU1QVFlfQ09MVU1OUzsKLQkJfQotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4+IHBrQ29sdW1ucyA9IHRoaXMuZ2V0Q29sdW1ucyhwayk7Ci0JCURUUENvbHVtbldyYXBwZXJbXSByZXN1bHQgPSBuZXcgRFRQQ29sdW1uV3JhcHBlcltwa0NvbHVtbnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IHJlc3VsdC5sZW5ndGg7IGktLSA+IDA7KSB7Ci0JCQlyZXN1bHRbaV0gPSB0aGlzLmdldENvbHVtbihwa0NvbHVtbnMuZ2V0KGkpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbj4gZ2V0Q29sdW1ucyhQcmltYXJ5S2V5IHBrKSB7Ci0JCXJldHVybiBway5nZXRNZW1iZXJzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByaW1hcnlLZXlDb2x1bW5BcnJheSgpLmxlbmd0aDsKLQl9Ci0KLQlib29sZWFuIHByaW1hcnlLZXlDb2x1bW5zQ29udGFpbnMoQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gQXJyYXlUb29scy5jb250YWlucyh0aGlzLmdldFByaW1hcnlLZXlDb2x1bW5BcnJheSgpLCBjb2x1bW4pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmb3JlaWduIGtleXMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEZvcmVpZ25LZXk+IGdldEZvcmVpZ25LZXlzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8Rm9yZWlnbktleT4odGhpcy5nZXRGb3JlaWduS2V5QXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgRFRQRm9yZWlnbktleVdyYXBwZXJbXSBnZXRGb3JlaWduS2V5QXJyYXkoKSB7Ci0JCWlmICh0aGlzLmZvcmVpZ25LZXlzID09IG51bGwpIHsKLQkJCXRoaXMuZm9yZWlnbktleXMgPSB0aGlzLmJ1aWxkRm9yZWlnbktleUFycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZm9yZWlnbktleXM7Ci0JfQotCi0JcHJpdmF0ZSBEVFBGb3JlaWduS2V5V3JhcHBlcltdIGJ1aWxkRm9yZWlnbktleUFycmF5KCkgewotCQlpZiAoICEgKHRoaXMuZHRwVGFibGUgaW5zdGFuY2VvZiBCYXNlVGFibGUpKSB7Ci0JCQlyZXR1cm4gRU1QVFlfRk9SRUlHTl9LRVlTOwotCQl9Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuY29uc3RyYWludHMuRm9yZWlnbktleT4gZHRwRm9yZWlnbktleXMgPSB0aGlzLmdldERUUEZvcmVpZ25LZXlzKCk7Ci0JCURUUEZvcmVpZ25LZXlXcmFwcGVyW10gcmVzdWx0ID0gbmV3IERUUEZvcmVpZ25LZXlXcmFwcGVyW2R0cEZvcmVpZ25LZXlzLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSByZXN1bHQubGVuZ3RoOyBpLS0gPiAwOykgewotCQkJcmVzdWx0W2ldID0gbmV3IERUUEZvcmVpZ25LZXlXcmFwcGVyKHRoaXMsIGR0cEZvcmVpZ25LZXlzLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuY29uc3RyYWludHMuRm9yZWlnbktleT4gZ2V0RFRQRm9yZWlnbktleXMoKSB7Ci0JCXJldHVybiAoKEJhc2VUYWJsZSkgdGhpcy5kdHBUYWJsZSkuZ2V0Rm9yZWlnbktleXMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEZvcmVpZ25LZXlzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Rm9yZWlnbktleUFycmF5KCkubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sdW1uIGlzIGEgYmFzZSBjb2x1bW4gZm9yIGF0IGxlYXN0IG9uZQotCSAqIG9mIHRoZSB0aGUgdGFibGUncyBmb3JlaWduIGtleXMKLQkgKi8KLQlib29sZWFuIGZvcmVpZ25LZXlCYXNlQ29sdW1uc0NvbnRhaW5zKENvbHVtbiBjb2x1bW4pIHsKLQkJZm9yIChEVFBGb3JlaWduS2V5V3JhcHBlciBma1dyYXBwZXIgOiB0aGlzLmdldEZvcmVpZ25LZXlBcnJheSgpKSB7Ci0JCQlpZiAoZmtXcmFwcGVyLmJhc2VDb2x1bW5zQ29udGFpbnMoY29sdW1uKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiB0YWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1Bvc3NpYmxlSm9pblRhYmxlKCkgewotCQlpZiAodGhpcy5nZXRGb3JlaWduS2V5QXJyYXkoKS5sZW5ndGggIT0gMikgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlIHRhYmxlIG11c3QgaGF2ZSBleGFjdGx5IDIgZm9yZWlnbiBrZXlzCi0JCX0KLQkJZm9yIChDb2x1bW4gY29sdW1uIDogdGhpcy5nZXRDb2x1bW5zKCkpIHsKLQkJCWlmICggISB0aGlzLmZvcmVpZ25LZXlCYXNlQ29sdW1uc0NvbnRhaW5zKGNvbHVtbikpIHsKLQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBhbGwgdGhlIHRhYmxlJ3MgY29sdW1ucyBtdXN0IGJlbG9uZyB0byBvbmUgKG9yIGJvdGgpIG9mIHRoZSAyIGZvcmVpZ24ga2V5cwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSB0YWJsZSBuYW1lIGlzIDxjb2RlPkZPT19CQVI8L2NvZGU+Ci0JICogYW5kIGl0IGpvaW5zIHRhYmxlcyA8Y29kZT5GT088L2NvZGU+IGFuZCA8Y29kZT5CQVI8L2NvZGU+LAotCSAqIHJldHVybiB0aGUgZm9yZWlnbiBrZXkgdG8gPGNvZGU+Rk9PPC9jb2RlPjsKLQkgKiBpZiB0aGUgdGFibGUgbmFtZSBpcyA8Y29kZT5CQVJfRk9PPC9jb2RlPgotCSAqIGFuZCBpdCBqb2lucyB0YWJsZXMgPGNvZGU+Rk9PPC9jb2RlPiBhbmQgPGNvZGU+QkFSPC9jb2RlPiwKLQkgKiByZXR1cm4gdGhlIGZvcmVpZ24ga2V5IHRvIDxjb2RlPkJBUjwvY29kZT47Ci0JICogb3RoZXJ3aXNlIHNpbXBseSByZXR1cm4gdGhlIGZpcnN0IGZvcmVpZ24ga2V5IGluIHRoZSBhcnJheS4KLQkgKi8KLQlwdWJsaWMgRm9yZWlnbktleSBnZXRKb2luVGFibGVPd25pbmdGb3JlaWduS2V5KCkgewotCQlGb3JlaWduS2V5IGZrMCA9IHRoaXMuZ2V0Rm9yZWlnbktleUFycmF5KClbMF07Ci0JCVN0cmluZyBuYW1lMCA9IGZrMC5nZXRSZWZlcmVuY2VkVGFibGUoKS5nZXROYW1lKCk7Ci0KLQkJRm9yZWlnbktleSBmazEgPSB0aGlzLmdldEZvcmVpZ25LZXlBcnJheSgpWzFdOwotCQlTdHJpbmcgbmFtZTEgPSBmazEuZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0TmFtZSgpOwotCi0JCXJldHVybiB0aGlzLmdldE5hbWUoKS5lcXVhbHMobmFtZTEgKyAnXycgKyBuYW1lMCkgPyBmazEgOiBmazA7Ci0JfQotCi0JcHVibGljIEZvcmVpZ25LZXkgZ2V0Sm9pblRhYmxlTm9uT3duaW5nRm9yZWlnbktleSgpIHsKLQkJRm9yZWlnbktleSBmazAgPSB0aGlzLmdldEZvcmVpZ25LZXlBcnJheSgpWzBdOwotCQlGb3JlaWduS2V5IGZrMSA9IHRoaXMuZ2V0Rm9yZWlnbktleUFycmF5KClbMV07Ci0JCUZvcmVpZ25LZXkgb2ZrID0gdGhpcy5nZXRKb2luVGFibGVPd25pbmdGb3JlaWduS2V5KCk7Ci0JCXJldHVybiAob2ZrID09IGZrMCkgPyBmazEgOiBmazA7Ci0JfQotCi0JLyoqCi0JICogSG1tbS4uLi4KLQkgKiBXZSBtaWdodCB3YW50IHRvIGdvIHRvIHRoZSBwbGF0Zm9ybSB0byBhbGxvdyBhIHZlbmRvci1zcGVjaWZpYwotCSAqIGNvbXBhcmlzb24gaGVyZTsKLQkgKiBidXQsIHNpbmNlIGFsbCB0aGUgbmFtZXMgYXJlIGNvbWluZyBkaXJlY3RseSBmcm9tIHRoZSBkYXRhYmFzZQotCSAqIChpLmUuIHRoZXJlIGFyZSBubyBjb252ZXJzaW9ucyB0byBKYXZhIGlkZW50aWZpZXJzIGV0Yy4pLCBpdCBzZWVtcwotCSAqIGxpa2Ugd2UgY2FuIGp1c3QgY29tcGFyZSB0aGVtIGRpcmVjdGx5IGFuZCBpZ25vcmUgY2FzZS1zZW5zaXRpdml0eQotCSAqIGlzc3Vlcy4uLi4gIH5ianYKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBqb2luVGFibGVOYW1lSXNEZWZhdWx0KCkgewotCQlyZXR1cm4gdGhpcy5nZXROYW1lKCkuZXF1YWxzKHRoaXMuYnVpbGREZWZhdWx0Sm9pblRhYmxlTmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERlZmF1bHRKb2luVGFibGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKb2luVGFibGVPd25pbmdUYWJsZSgpLmdldE5hbWUoKQotCQkJCQkrICdfJwotCQkJCQkrIHRoaXMuZ2V0Sm9pblRhYmxlTm9uT3duaW5nVGFibGUoKS5nZXROYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZSBnZXRKb2luVGFibGVPd25pbmdUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Sm9pblRhYmxlT3duaW5nRm9yZWlnbktleSgpLmdldFJlZmVyZW5jZWRUYWJsZSgpOwotCX0KLQotCXByaXZhdGUgVGFibGUgZ2V0Sm9pblRhYmxlTm9uT3duaW5nVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpvaW5UYWJsZU5vbk93bmluZ0ZvcmVpZ25LZXkoKS5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgRFRQU2NoZW1hV3JhcHBlciBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cFRhYmxlLmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJQ2F0YWxvZ09iamVjdCBnZXRDYXRhbG9nT2JqZWN0KCkgewotCQlyZXR1cm4gKElDYXRhbG9nT2JqZWN0KSB0aGlzLmR0cFRhYmxlOwotCX0KLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNhdGFsb2dPYmplY3RDaGFuZ2VkKCkgewotCQlzdXBlci5jYXRhbG9nT2JqZWN0Q2hhbmdlZCgpOwotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkudGFibGVDaGFuZ2VkKHRoaXMpOwotCX0KLQotCWJvb2xlYW4gd3JhcHMob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIHRhYmxlKSB7Ci0JCXJldHVybiB0aGlzLmR0cFRhYmxlID09IHRhYmxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgRFRQIHRhYmxlLgotCSAqLwotCURUUFRhYmxlV3JhcHBlciBnZXRUYWJsZShvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgdGFibGUpIHsKLQkJLy8gdHJ5IHRvIHNob3J0LWNpcmN1aXQgdGhlIHNlYXJjaAotCQlyZXR1cm4gdGhpcy53cmFwcyh0YWJsZSkgPyB0aGlzIDogdGhpcy5nZXRTY2hlbWEoKS5nZXRUYWJsZSh0YWJsZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBzdGFydExpc3RlbmluZygpIHsKLQkJaWYgKHRoaXMuZm9yZWlnbktleXMgIT0gbnVsbCkgewotCQkJdGhpcy5zdGFydEZvcmVpZ25LZXlzKCk7Ci0JCX0KLQkJaWYgKHRoaXMuY29sdW1ucyAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0YXJ0Q29sdW1ucygpOwotCQl9Ci0JCXN1cGVyLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0Rm9yZWlnbktleXMoKSB7Ci0JCWZvciAoRFRQRm9yZWlnbktleVdyYXBwZXIgZm9yZWlnbktleSA6IHRoaXMuZm9yZWlnbktleXMpIHsKLQkJCWZvcmVpZ25LZXkuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydENvbHVtbnMoKSB7Ci0JCWZvciAoRFRQQ29sdW1uV3JhcHBlciBjb2x1bW4gOiB0aGlzLmNvbHVtbnMpIHsKLQkJCWNvbHVtbi5zdGFydExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgc3RvcExpc3RlbmluZygpIHsKLQkJaWYgKHRoaXMuZm9yZWlnbktleXMgIT0gbnVsbCkgewotCQkJdGhpcy5zdG9wRm9yZWlnbktleXMoKTsKLQkJfQotCQlpZiAodGhpcy5jb2x1bW5zICE9IG51bGwpIHsKLQkJCXRoaXMuc3RvcENvbHVtbnMoKTsKLQkJfQotCQlzdXBlci5zdG9wTGlzdGVuaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3BGb3JlaWduS2V5cygpIHsKLQkJZm9yIChEVFBGb3JlaWduS2V5V3JhcHBlciBmb3JlaWduS2V5IDogdGhpcy5mb3JlaWduS2V5cykgewotCQkJZm9yZWlnbktleS5zdG9wTGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcENvbHVtbnMoKSB7Ci0JCWZvciAoRFRQQ29sdW1uV3JhcHBlciBjb2x1bW4gOiB0aGlzLmNvbHVtbnMpIHsKLQkJCWNvbHVtbi5zdG9wTGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xlYXIgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKSB7Ci0JCWlmICh0aGlzLmZvcmVpZ25LZXlzICE9IG51bGwpIHsKLQkJCXRoaXMuY2xlYXJGb3JlaWduS2V5cygpOwotCQl9Ci0KLQkJLy8gdGhlIHRhYmxlIGRvZXMgbm90ICJjb250YWluIiB0aGUgcGsgY29sdW1ucywgc28gbm8gbmVlZCB0byBmb3J3YXJkICNjbGVhcigpCi0JCXRoaXMucHJpbWFyeUtleUNvbHVtbnMgPSBudWxsOwotCi0JCWlmICh0aGlzLmNvbHVtbnMgIT0gbnVsbCkgewotCQkJdGhpcy5jbGVhckNvbHVtbnMoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckZvcmVpZ25LZXlzKCkgewotCQl0aGlzLnN0b3BGb3JlaWduS2V5cygpOwotCQlmb3IgKERUUEZvcmVpZ25LZXlXcmFwcGVyIGZvcmVpZ25LZXkgOiB0aGlzLmZvcmVpZ25LZXlzKSB7Ci0JCQlmb3JlaWduS2V5LmNsZWFyKCk7Ci0JCX0KLSAgICAJdGhpcy5mb3JlaWduS2V5cyA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyQ29sdW1ucygpIHsKLQkJdGhpcy5zdG9wQ29sdW1ucygpOwotCQlmb3IgKERUUENvbHVtbldyYXBwZXIgY29sdW1uIDogdGhpcy5jb2x1bW5zKSB7Ci0JCQljb2x1bW4uY2xlYXIoKTsKLQkJfQotICAgIAl0aGlzLmNvbHVtbnMgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0Fic3RyYWN0RFRQRHJpdmVyQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvQWJzdHJhY3REVFBEcml2ZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhM2U4NDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvQWJzdHJhY3REVFBEcml2ZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLmRyaXZlcjsKLQotaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKLWltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXRNZXRhRGF0YTsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUuZGVmaW5pdGlvbi5EYXRhYmFzZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uaW50ZXJuYWwuY29yZS5SREJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVzdWx0U2V0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuSnB0SnBhRGJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotCi0vKioKLSAqIENvbnNvbGlkYXRlIHRoZSBiZWhhdmlvciBjb21tb24gdG8gdGhlIHR5cGljYWwgRFRQIGRyaXZlcnMuCi0gKiAKLSAqIEBzZWUgVW5rbm93bgotICovCi1hYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERUUERyaXZlckFkYXB0ZXIKLQlpbXBsZW1lbnRzIERUUERyaXZlckFkYXB0ZXIKLXsKLQkvKioKLQkgKiBUaGUgRGFsaSBkYXRhYmFzZSB0aGF0IHdyYXBzIHRoZSBjb3JyZXNwb25kaW5nIERUUCBkYXRhYmFzZS4KLQkgKi8KLQlmaW5hbCBEYXRhYmFzZSBkYXRhYmFzZTsKLQotCS8qKgotCSAqIERUUCBkcml2ZXJzIHJldHVybiBjYXRhbG9ncyBhbmQgc2NoZW1hdGEgaW4gYSB2YXJpZXR5IG9mIHdheXMuLi4uCi0JICovCi0JZmluYWwgQ2F0YWxvZ1N0cmF0ZWd5IGNhdGFsb2dTdHJhdGVneTsKLQotCS8qKgotCSAqIFRoZSBTUUwgc3BlYyBzYXlzIGEgPGVtPnJlZ3VsYXI8L2VtPiAobm9uLWRlbGltaXRlZCkgaWRlbnRpZmllciBzaG91bGQgYmUKLQkgKiBmb2xkZWQgdG8gdXBwZXJjYXNlOyBidXQgc29tZSBkYXRhYmFzZXMgZG8gb3RoZXJ3aXNlIChlLmcuIFN5YmFzZSkuCi0JICovCi0JZmluYWwgRm9sZGluZ1N0cmF0ZWd5IGZvbGRpbmdTdHJhdGVneTsKLQotCi0JQWJzdHJhY3REVFBEcml2ZXJBZGFwdGVyKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGF0YWJhc2UgPSBkYXRhYmFzZTsKLQkJdGhpcy5jYXRhbG9nU3RyYXRlZ3kgPSB0aGlzLmJ1aWxkQ2F0YWxvZ1N0cmF0ZWd5KCk7Ci0JCXRoaXMuZm9sZGluZ1N0cmF0ZWd5ID0gdGhpcy5idWlsZEZvbGRpbmdTdHJhdGVneSgpOwotCX0KLQotCWFic3RyYWN0IENhdGFsb2dTdHJhdGVneSBidWlsZENhdGFsb2dTdHJhdGVneSgpOwotCi0JYWJzdHJhY3QgRm9sZGluZ1N0cmF0ZWd5IGJ1aWxkRm9sZGluZ1N0cmF0ZWd5KCk7Ci0KLQotCS8vICoqKioqKioqKiogY2F0YWxvZ3MgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJcmV0dXJuIHRoaXMuY2F0YWxvZ1N0cmF0ZWd5LnN1cHBvcnRzQ2F0YWxvZ3MoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZz4gZ2V0RFRQQ2F0YWxvZ3MoKSB7Ci0JCXJldHVybiB0aGlzLmNhdGFsb2dTdHJhdGVneS5nZXRDYXRhbG9ncygpOwotCX0KLQotCS8qKgotCSAqIFR5cGljYWxseSwgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgY2F0YWxvZyBpcyB0aGUgdXNlciBuYW1lLgotCSAqLwotCXB1YmxpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IGdldERlZmF1bHRDYXRhbG9nTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLnN1cHBvcnRzQ2F0YWxvZ3MoKSA/IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2dOYW1lc18oKSA6IENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCk7Ci0JfQotCi0JZmluYWwgSXRlcmFibGU8U3RyaW5nPiBnZXREZWZhdWx0Q2F0YWxvZ05hbWVzXygpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGREZWZhdWx0Q2F0YWxvZ05hbWVzVG8obmFtZXMpOwotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0Jdm9pZCBhZGREZWZhdWx0Q2F0YWxvZ05hbWVzVG8oQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMpIHsKLQkJbmFtZXMuYWRkKHRoaXMuZ2V0VXNlck5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNjaGVtYXMgKioqKioqKioqKgotCi0JcHVibGljIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYT4gZ2V0RFRQU2NoZW1hcygpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmNhdGFsb2dTdHJhdGVneS5nZXRTY2hlbWFzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImRyaXZlciBhZGFwdGVyOiAiICsgdGhpcywgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUeXBpY2FsbHksIHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IHNjaGVtYSBpcyB0aGUgdXNlciBuYW1lLgotCSAqLwotCXB1YmxpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IGdldERlZmF1bHRTY2hlbWFOYW1lcygpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGREZWZhdWx0U2NoZW1hTmFtZXNUbyhuYW1lcyk7Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0KLQl2b2lkIGFkZERlZmF1bHRTY2hlbWFOYW1lc1RvKEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCW5hbWVzLmFkZCh0aGlzLmdldFVzZXJOYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lIC0+IGlkZW50aWZpZXIgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TmFtZVRvSWRlbnRpZmllcihTdHJpbmcgbmFtZSkgewotCQlpZiAodGhpcy50cmVhdElkZW50aWZpZXJzQXNEZWxpbWl0ZWQoKSkgewotCQkJcmV0dXJuIG5hbWU7ICAvLyBubyBkZWxpbWl0ZXJzIG5lY2Vzc2FyeQotCQl9Ci0JCWlmICh0aGlzLm5hbWVSZXF1aXJlc0RlbGltaXRlcnMobmFtZSkpIHsKLQkJCXJldHVybiB0aGlzLmRlbGltaXROYW1lKG5hbWUpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8vIFRPRE8gYnJlYWsgaW50byBjb252ZXJ0aW5nIHRhYmxlIGFuZCBjb2x1bW4gbmFtZXMgc28gTXlTUUwgd29ya3MgYmV0dGVyCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TmFtZVRvSWRlbnRpZmllcihTdHJpbmcgbmFtZSwgU3RyaW5nIGRlZmF1bHROYW1lKSB7Ci0JCWlmICgoICEgdGhpcy50cmVhdElkZW50aWZpZXJzQXNEZWxpbWl0ZWQoKSkgJiYgIHRoaXMubmFtZVJlcXVpcmVzRGVsaW1pdGVycyhuYW1lKSkgewotCQkJLy8gbm8gbWF0Y2ggcG9zc2libGUKLQkJCXJldHVybiB0aGlzLmRlbGltaXROYW1lKG5hbWUpOwotCQl9Ci0JCWlmICh0aGlzLnJlZ3VsYXJOYW1lc01hdGNoKG5hbWUsIGRlZmF1bHROYW1lKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBkYXRhYmFzZSBvYmplY3QgbmFtZSBtdXN0IGJlIGRlbGltaXRlZAotCSAqIHdoZW4gdXNlZCBpbiBhbiBTUUwgc3RhdGVtZW50LgotCSAqIElmIHRoZSBuYW1lIGhhcyBhbnkgPGVtPnNwZWNpYWw8L2VtPiBjaGFyYWN0ZXJzIChhcyBvcHBvc2VkIHRvIGxldHRlcnMsCi0JICogZGlnaXRzLCBhbmQgb3RoZXIgYWxsb3dlZCBjaGFyYWN0ZXJzIFtlLmcuIHVuZGVyc2NvcmVzXSksIGl0IHJlcXVpcmVzCi0JICogZGVsaW1pdGVycy4KLQkgKiBJZiB0aGUgbmFtZSBpcyBtaXhlZCBjYXNlIGFuZCB0aGUgZGF0YWJhc2UgZm9sZHMgdW5kZWxpbWl0ZWQgbmFtZXMKLQkgKiAodG8gZWl0aGVyIHVwcGVyY2FzZSBvciBsb3dlcmNhc2UpLCBpdCByZXF1aXJlcyBkZWxpbWl0ZXJzLgotCSAqLwotCWJvb2xlYW4gbmFtZVJlcXVpcmVzRGVsaW1pdGVycyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKG5hbWUubGVuZ3RoKCkgPT0gMCkgIC8vICBhbiBlbXB0eSBzdHJpbmcgbXVzdCBiZSBkZWxpbWl0ZWQoPykKLQkJCQkJfHwgdGhpcy5uYW1lSXNSZXNlcnZlZFdvcmQobmFtZSkKLQkJCQkJfHwgdGhpcy5uYW1lQ29udGFpbnNBbnlTcGVjaWFsQ2hhcmFjdGVycyhuYW1lKQotCQkJCQl8fCB0aGlzLm5hbWVJc05vdEZvbGRlZChuYW1lKTsKLQl9Ci0KLQlib29sZWFuIG5hbWVJc1Jlc2VydmVkV29yZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXREVFBEZWZpbml0aW9uKCkuaXNTUUxLZXl3b3JkKG5hbWUpOwotCX0KLQotCS8vIFRPRE8gbWFrZSBEYXRhYmFzZS5nZXREVFBEZWZpbml0aW9uKCkgcHVibGljPwotCURhdGFiYXNlRGVmaW5pdGlvbiBnZXREVFBEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gUkRCQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGF0YWJhc2VEZWZpbml0aW9uUmVnaXN0cnkoKS5nZXREZWZpbml0aW9uKHRoaXMuZGF0YWJhc2UuZ2V0RFRQRGF0YWJhc2UoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBuYW1lIGNvbnRhaW5zIGFueSA8ZW0+c3BlY2lhbDwvZW0+Ci0JICogY2hhcmFjdGVycyB0aGF0IHJlcXVpcmUgdGhlIG5hbWUgdG8gYmUgZGVsaW1pdGVkLgotCSAqIDxicj4KLQkgKiBQcmUtY29uZGl0aW9uOiB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgbm90IGVtcHR5Ci0JICovCi0JYm9vbGVhbiBuYW1lQ29udGFpbnNBbnlTcGVjaWFsQ2hhcmFjdGVycyhTdHJpbmcgbmFtZSkgewotCQljaGFyW10gc3RyaW5nID0gbmFtZS50b0NoYXJBcnJheSgpOwotCQlpZiAodGhpcy5jaGFyYWN0ZXJJc05vblJlZ3VsYXJOYW1lU3RhcnQoc3RyaW5nWzBdKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IHN0cmluZy5sZW5ndGg7IGktLSA+IDE7ICkgeyAgLy8gbm90ZTogc3RvcCBhdCAxCi0JCQlpZiAodGhpcy5jaGFyYWN0ZXJJc05vblJlZ3VsYXJOYW1lUGFydChzdHJpbmdbaV0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIG5vbi08ZW0+cmVndWxhcjwvZW0+IGZvciB0aGUgZmlyc3QKLQkgKiBjaGFyYWN0ZXIgb2YgYSBuYW1lLgotCSAqIFR5cGljYWxseSwgZGF0YWJhc2VzIGFyZSBtb3JlIHJlc3RyaWN0aXZlIGFib3V0IHdoYXQgY2hhcmFjdGVycyBjYW4KLQkgKiBiZSB1c2VkIHRvIDxlbT5zdGFydDwvZW0+IGFuIGlkZW50aWZpZXIgKGFzIG9wcG9zZWQgdG8gdGhlIGNoYXJhY3RlcnMKLQkgKiBhbGxvd2VkIGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBpZGVudGlmaWVyKS4KLQkgKi8KLQlib29sZWFuIGNoYXJhY3RlcklzTm9uUmVndWxhck5hbWVTdGFydChjaGFyIGMpIHsKLQkJcmV0dXJuICEgdGhpcy5jaGFyYWN0ZXJJc1JlZ3VsYXJOYW1lU3RhcnQoYyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgPGVtPnJlZ3VsYXI8L2VtPiBmb3IgdGhlIGZpcnN0Ci0JICogY2hhcmFjdGVyIG9mIGEgbmFtZS4KLQkgKiBUaGUgZmlyc3QgY2hhcmFjdGVyIG9mIGFuIGlkZW50aWZpZXIgY2FuIGJlOjx1bD4KLQkgKiA8bGk+YSBsZXR0ZXIKLQkgKiA8bGk+YW55IG9mIHRoZSBleHRlbmRlZCwgZGF0YWJhc2Utc3BlY2lmaWMsIDxlbT5yZWd1bGFyPC9lbT4gc3RhcnQgY2hhcmFjdGVycwotCSAqIDwvdWw+Ci0JICovCi0JYm9vbGVhbiBjaGFyYWN0ZXJJc1JlZ3VsYXJOYW1lU3RhcnQoY2hhciBjKSB7Ci0JCS8vIGFsbCBkYXRhYmFzZXMgYWxsb3cgYSBsZXR0ZXIKLQkJcmV0dXJuIENoYXJhY3Rlci5pc0xldHRlcihjKQotCQkJCXx8IHRoaXMuY2hhcmFjdGVySXNFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnQoYyk7Ci0JfQotCi0JYm9vbGVhbiBjaGFyYWN0ZXJJc0V4dGVuZGVkUmVndWxhck5hbWVTdGFydChjaGFyIGMpIHsKLQkJcmV0dXJuIHRoaXMuYXJyYXlDb250YWlucyh0aGlzLmdldEV4dGVuZGVkUmVndWxhck5hbWVTdGFydENoYXJhY3RlcnMoKSwgYyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSA8ZW0+cmVndWxhcjwvZW0+IGNoYXJhY3RlcnMsIGJleW9uZCBsZXR0ZXJzLCBmb3IgdGhlCi0JICogZmlyc3QgY2hhcmFjdGVyIG9mIGEgbmFtZS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vICJleHRlbmRlZCIgY2hhcmFjdGVycy4KLQkgKi8KLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVN0YXJ0Q2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgbm9uLTxlbT5yZWd1bGFyPC9lbT4gZm9yIHRoZQotCSAqIHNlY29uZCBhbmQgc3Vic2VxdWVudCBjaGFyYWN0ZXJzIG9mIGEgbmFtZS4KLQkgKi8KLQlib29sZWFuIGNoYXJhY3RlcklzTm9uUmVndWxhck5hbWVQYXJ0KGNoYXIgYykgewotCQlyZXR1cm4gISB0aGlzLmNoYXJhY3RlcklzUmVndWxhck5hbWVQYXJ0KGMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIDxlbT5yZWd1bGFyPC9lbT4gZm9yIHRoZSBzZWNvbmQgYW5kCi0JICogc3Vic2VxdWVudCBjaGFyYWN0ZXJzIG9mIGEgbmFtZS4KLQkgKiBUaGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IGNoYXJhY3RlcnMgb2YgYSA8ZW0+cmVndWxhcjwvZW0+IG5hbWUgY2FuIGJlOjx1bD4KLQkgKiA8bGk+YSBsZXR0ZXIKLQkgKiA8bGk+YSBkaWdpdAotCSAqIDxsaT5hbiB1bmRlcnNjb3JlCi0JICogPGxpPmFueSBvZiB0aGUgZXh0ZW5kZWQsIGRhdGFiYXNlLXNwZWNpZmljLCA8ZW0+cmVndWxhcjwvZW0+IHN0YXJ0IGNoYXJhY3RlcnMKLQkgKiA8bGk+YW55IG9mIHRoZSBleHRlbmRlZCwgZGF0YWJhc2Utc3BlY2lmaWMsIDxlbT5yZWd1bGFyPC9lbT4gcGFydCBjaGFyYWN0ZXJzCi0JICogPC91bD4KLQkgKi8KLQlib29sZWFuIGNoYXJhY3RlcklzUmVndWxhck5hbWVQYXJ0KGNoYXIgYykgewotCQkvLyBhbGwgZGF0YWJhc2VzIGFsbG93IGEgbGV0dGVyIG9yIGRpZ2l0Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGMpIHx8Ci0JCQkJKGMgPT0gJ18nKSB8fAotCQkJCXRoaXMuY2hhcmFjdGVySXNFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnQoYykgfHwKLQkJCQl0aGlzLmNoYXJhY3RlcklzRXh0ZW5kZWRSZWd1bGFyTmFtZVBhcnQoYyk7Ci0JfQotCi0JYm9vbGVhbiBjaGFyYWN0ZXJJc0V4dGVuZGVkUmVndWxhck5hbWVQYXJ0KGNoYXIgYykgewotCQlyZXR1cm4gdGhpcy5hcnJheUNvbnRhaW5zKHRoaXMuZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVBhcnRDaGFyYWN0ZXJzKCksIGMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgPGVtPnJlZ3VsYXI8L2VtPiBjaGFyYWN0ZXJzLCBiZXlvbmQgbGV0dGVycyBhbmQgZGlnaXRzIGFuZCB0aGUKLQkgKiA8ZW0+cmVndWxhcjwvZW0+IGZpcnN0IGNoYXJhY3RlcnMsIGZvciB0aGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IGNoYXJhY3RlcnMKLQkgKiBvZiBhbiBpZGVudGlmaWVyLiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIGFkZGl0aW9uYWwgY2hhcmFjdGVycy4KLQkgKi8KLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVBhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgbm90IGZvbGRlZCB0byB0aGUgZGF0YWJhc2UncwotCSAqIGNhc2UsIHJlcXVpcmluZyBpdCB0byBiZSBkZWxpbWl0ZWQuCi0JICovCi0JYm9vbGVhbiBuYW1lSXNOb3RGb2xkZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuICEgdGhpcy5mb2xkaW5nU3RyYXRlZ3kubmFtZUlzRm9sZGVkKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgPGVtPnJlZ3VsYXI8L2VtPiBuYW1lcyBtYXRjaC4KLQkgKiBUeXBpY2FsbHksIDxlbT5yZWd1bGFyPC9lbT4gaWRlbnRpZmllcnMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuCi0JICovCi0JYm9vbGVhbiByZWd1bGFyTmFtZXNNYXRjaChTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQlyZXR1cm4gbmFtZTEuZXF1YWxzSWdub3JlQ2FzZShuYW1lMik7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gZGVsaW1pdGVycyAodHlwaWNhbGx5IGRvdWJsZS1xdW90ZXMpLAotCSAqIGNvbnZlcnRpbmcgaXQgdG8gYW4gaWRlbnRpZmllci4KLQkgKi8KLQlTdHJpbmcgZGVsaW1pdE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnF1b3RlKG5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpZGVudGlmaWVyIC0+IG5hbWUgKioqKioqKioqKgotCi0JLy8gbm90IHN1cmUgaG93IHRvIGhhbmRsZSBhbiBlbXB0eSBzdHJpbmc6Ci0JLy8gYm90aCAiIiBhbmQgIlwiXCIiIGFyZSBjb252ZXJ0ZWQgdG8gIiIgLi4uCi0JLy8gY29udmVydCAiIiB0byAnbnVsbCcgc2luY2UgZW1wdHkgc3RyaW5ncyBtdXN0IGJlIGRlbGltaXRlZD8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRJZGVudGlmaWVyVG9OYW1lKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCWlmIChpZGVudGlmaWVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICh0aGlzLnRyZWF0SWRlbnRpZmllcnNBc0RlbGltaXRlZCgpKSB7Ci0JCQlyZXR1cm4gaWRlbnRpZmllcjsgIC8vIGF1dG9tYXRpY2FsbHkgZGVsaW1pdGVkCi0JCX0KLQkJaWYgKHRoaXMuaWRlbnRpZmllcklzRGVsaW1pdGVkKGlkZW50aWZpZXIpKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMudW5kZWxpbWl0KGlkZW50aWZpZXIpOwotCQl9Ci0JCXJldHVybiB0aGlzLmZvbGRpbmdTdHJhdGVneS5mb2xkKGlkZW50aWZpZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllciBpcyA8ZW0+ZGVsaW1pdGVkPC9lbT4uCi0JICogVGhlIFNRTC05MiBzcGVjIHNheXMgaWRlbnRpZmllcnMgc2hvdWxkIGJlIGRlbGltaXRlZCBieQotCSAqIGRvdWJsZS1xdW90ZXM7IGJ1dCBzb21lIGRhdGFiYXNlcyBhbGxvdyBvdGhlcndpc2UgKGUuZy4gU3liYXNlKS4KLQkgKi8KLQlib29sZWFuIGlkZW50aWZpZXJJc0RlbGltaXRlZChTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nSXNRdW90ZWQoaWRlbnRpZmllcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlbGVjdGluZyBkYXRhYmFzZSBvYmplY3RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIGNvbnZlcnQgdGhlIGlkZW50aWZpZXIgdG8gYSBuYW1lIGFuZCBwZXJmb3JtIGEgbmFtZSBsb29rdXAuCi0JICovCi0JcHVibGljIENhdGFsb2cgc2VsZWN0Q2F0YWxvZ0ZvcklkZW50aWZpZXIoSXRlcmFibGU8Q2F0YWxvZz4gY2F0YWxvZ3MsIFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllcihjYXRhbG9ncywgaWRlbnRpZmllcik7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgY29udmVydCB0aGUgaWRlbnRpZmllciB0byBhIG5hbWUgYW5kIHBlcmZvcm0gYSBuYW1lIGxvb2t1cC4KLQkgKi8KLQlwdWJsaWMgU2NoZW1hIHNlbGVjdFNjaGVtYUZvcklkZW50aWZpZXIoSXRlcmFibGU8U2NoZW1hPiBzY2hlbWF0YSwgU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3RGb3JJZGVudGlmaWVyKHNjaGVtYXRhLCBpZGVudGlmaWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0LCBjb252ZXJ0IHRoZSBpZGVudGlmaWVyIHRvIGEgbmFtZSBhbmQgcGVyZm9ybSBhIG5hbWUgbG9va3VwLgotCSAqLwotCXB1YmxpYyBUYWJsZSBzZWxlY3RUYWJsZUZvcklkZW50aWZpZXIoSXRlcmFibGU8VGFibGU+IHRhYmxlcywgU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3RGb3JJZGVudGlmaWVyKHRhYmxlcywgaWRlbnRpZmllcik7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgY29udmVydCB0aGUgaWRlbnRpZmllciB0byBhIG5hbWUgYW5kIHBlcmZvcm0gYSBuYW1lIGxvb2t1cC4KLQkgKi8KLQlwdWJsaWMgU2VxdWVuY2Ugc2VsZWN0U2VxdWVuY2VGb3JJZGVudGlmaWVyKEl0ZXJhYmxlPFNlcXVlbmNlPiBzZXF1ZW5jZXMsIFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllcihzZXF1ZW5jZXMsIGlkZW50aWZpZXIpOwotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIGNvbnZlcnQgdGhlIGlkZW50aWZpZXIgdG8gYSBuYW1lIGFuZCBwZXJmb3JtIGEgbmFtZSBsb29rdXAuCi0JICovCi0JcHVibGljIENvbHVtbiBzZWxlY3RDb2x1bW5Gb3JJZGVudGlmaWVyKEl0ZXJhYmxlPENvbHVtbj4gY29sdW1ucywgU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3RGb3JJZGVudGlmaWVyKGNvbHVtbnMsIGlkZW50aWZpZXIpOwotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIGNvbnZlcnQgdGhlIGlkZW50aWZpZXIgdG8gYSBuYW1lIGFuZCBwZXJmb3JtIGEgbmFtZSBsb29rdXAuCi0JICovCi0JPFQgZXh0ZW5kcyBEYXRhYmFzZU9iamVjdD4gVCBzZWxlY3REYXRhYmFzZU9iamVjdEZvcklkZW50aWZpZXIoSXRlcmFibGU8VD4gZGF0YWJhc2VPYmplY3RzLCBTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gdGhpcy5zZWxlY3REYXRhYmFzZU9iamVjdE5hbWVkKGRhdGFiYXNlT2JqZWN0cywgdGhpcy5jb252ZXJ0SWRlbnRpZmllclRvTmFtZShpZGVudGlmaWVyKSk7Ci0JfQotCi0JLyoqCi0JICogV2UgY2FuIHRhbnNsYXRlIGlkZW50aWZpZXJzIG9uIG1vc3QgZGF0YWJhc2VlIGludG8gYSBuYW1lIHdlIGNhbiB0cmVhdCBhcwotCSAqIGNhc2Utc2Vuc2l0aXZlLgotCSAqLwotCTxUIGV4dGVuZHMgRGF0YWJhc2VPYmplY3Q+IFQgc2VsZWN0RGF0YWJhc2VPYmplY3ROYW1lZChJdGVyYWJsZTxUPiBkYXRhYmFzZU9iamVjdHMsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0TmFtZWRSZXNwZWN0Q2FzZShkYXRhYmFzZU9iamVjdHMsIG5hbWUpOwotCX0KLQotCTxUIGV4dGVuZHMgRGF0YWJhc2VPYmplY3Q+IFQgc2VsZWN0RGF0YWJhc2VPYmplY3ROYW1lZFJlc3BlY3RDYXNlKEl0ZXJhYmxlPFQ+IGRhdGFiYXNlT2JqZWN0cywgU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChUIGRhdGFiYXNlT2JqZWN0IDogZGF0YWJhc2VPYmplY3RzKSB7Ci0JCQlpZiAoZGF0YWJhc2VPYmplY3QuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBkYXRhYmFzZU9iamVjdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQk8VCBleHRlbmRzIERhdGFiYXNlT2JqZWN0PiBUIHNlbGVjdERhdGFiYXNlT2JqZWN0TmFtZWRJZ25vcmVDYXNlKEl0ZXJhYmxlPFQ+IGRhdGFiYXNlT2JqZWN0cywgU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChUIGRhdGFiYXNlT2JqZWN0IDogZGF0YWJhc2VPYmplY3RzKSB7Ci0JCQlpZiAoZGF0YWJhc2VPYmplY3QuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpIHsKLQkJCQlyZXR1cm4gZGF0YWJhc2VPYmplY3Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRhdGFiYXNlIHF1ZXJpZXMgKioqKioqKioqKgotCi0JTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBleGVjdXRlKFN0cmluZyBzcWwpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmV4ZWN1dGVfKHNxbCk7Ci0JCX0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBleCkgewotCQkJSnB0SnBhRGJQbHVnaW4ubG9nKCJTUUw6ICIgKyBzcWwsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JfQotCi0JTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBleGVjdXRlXyhTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJU3RhdGVtZW50IGpkYmNTdGF0ZW1lbnQgPSB0aGlzLmNyZWF0ZUpEQkNTdGF0ZW1lbnQoKTsKLQkJTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiByb3dzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlqZGJjU3RhdGVtZW50LmV4ZWN1dGUoc3FsKTsKLQkJCXJvd3MgPSB0aGlzLmJ1aWxkUm93cyhqZGJjU3RhdGVtZW50LmdldFJlc3VsdFNldCgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWpkYmNTdGF0ZW1lbnQuY2xvc2UoKTsKLQkJfQotCQlyZXR1cm4gcm93czsKLQl9Ci0KLQlTdGF0ZW1lbnQgY3JlYXRlSkRCQ1N0YXRlbWVudCgpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmdldEpEQkNDb25uZWN0aW9uKCkuY3JlYXRlU3RhdGVtZW50KCk7Ci0JfQotCi0JTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBidWlsZFJvd3MoUmVzdWx0U2V0IHJlc3VsdFNldCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCUxpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gcm93cyA9IG5ldyBBcnJheUxpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4oKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChyb3dzLCB0aGlzLmJ1aWxkUmVzdWx0U2V0SXRlcmF0b3IocmVzdWx0U2V0KSk7Ci0JCXJldHVybiByb3dzOwotCX0KLQotCUl0ZXJhdG9yPE1hcDxTdHJpbmcsIE9iamVjdD4+IGJ1aWxkUmVzdWx0U2V0SXRlcmF0b3IoUmVzdWx0U2V0IHJlc3VsdFNldCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgUmVzdWx0U2V0SXRlcmF0b3I8TWFwPFN0cmluZywgT2JqZWN0Pj4ocmVzdWx0U2V0LCBuZXcgTGlzdFJlc3VsdFNldEl0ZXJhdG9yQWRhcHRlcihyZXN1bHRTZXQuZ2V0TWV0YURhdGEoKSkpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgZWFjaCByb3cgaW4gdGhlIHJlc3VsdCBzZXQgaW50byBhIG1hcCB3aG9zZSBrZXkgaXMgdGhlIGNvbHVtbgotCSAqIG5hbWUgYW5kIHZhbHVlIGlzIHRoZSBjb2x1bW4gdmFsdWUuCi0JICovCi0Jc3RhdGljIGNsYXNzIExpc3RSZXN1bHRTZXRJdGVyYXRvckFkYXB0ZXIKLQkJaW1wbGVtZW50cyBSZXN1bHRTZXRJdGVyYXRvci5BZGFwdGVyPE1hcDxTdHJpbmcsIE9iamVjdD4+Ci0JewotCQlwcml2YXRlIGZpbmFsIGludCBjb2x1bW5Db3VudDsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBjb2x1bW5OYW1lczsKLQotCQlMaXN0UmVzdWx0U2V0SXRlcmF0b3JBZGFwdGVyKFJlc3VsdFNldE1ldGFEYXRhIHJzTWV0YURhdGEpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY29sdW1uQ291bnQgPSByc01ldGFEYXRhLmdldENvbHVtbkNvdW50KCk7Ci0JCQl0aGlzLmNvbHVtbk5hbWVzID0gbmV3IFN0cmluZ1t0aGlzLmNvbHVtbkNvdW50ICsgMV07ICAvLyBsZWF2ZSB0aGUgemVybyBzbG90IGVtcHR5Ci0JCQlmb3IgKGludCBpID0gMTsgaSA8PSB0aGlzLmNvbHVtbkNvdW50OyBpKyspIHsgIC8vIE5COiBSZXN1bHRTZXQgaW5kZXgvc3Vic2NyaXB0IGlzIDEtYmFzZWQKLQkJCQl0aGlzLmNvbHVtbk5hbWVzW2ldID0gcnNNZXRhRGF0YS5nZXRDb2x1bW5OYW1lKGkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gYnVpbGROZXh0KFJlc3VsdFNldCBycykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCQlIYXNoTWFwPFN0cmluZywgT2JqZWN0PiByb3cgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4odGhpcy5jb2x1bW5Db3VudCk7Ci0JCQlmb3IgKGludCBpID0gMTsgaSA8PSB0aGlzLmNvbHVtbkNvdW50OyBpKyspIHsgIC8vIE5COiBSZXN1bHRTZXQgaW5kZXgvc3Vic2NyaXB0IGlzIDEtYmFzZWQKLQkJCQlyb3cucHV0KHRoaXMuY29sdW1uTmFtZXNbaV0sIHJzLmdldE9iamVjdChpKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcm93OwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JU3RyaW5nIGdldFVzZXJOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0SWRlbnRpZmllclRvTmFtZSh0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuZ2V0VXNlck5hbWUoKSk7Ci0JfQotCi0JYm9vbGVhbiB0cmVhdElkZW50aWZpZXJzQXNEZWxpbWl0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkudHJlYXRJZGVudGlmaWVyc0FzRGVsaW1pdGVkKCk7Ci0JfQotCi0JQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFiYXNlLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kOiBBZGQgPGNvZGU+bnVsbDwvY29kZT4gY2hlY2suCi0JICovCi0JYm9vbGVhbiBhcnJheUNvbnRhaW5zKGNoYXJbXSBhcnJheSwgY2hhciBjKSB7Ci0JCXJldHVybiAoYXJyYXkgIT0gbnVsbCkgJiYgQXJyYXlUb29scy5jb250YWlucyhhcnJheSwgYyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kYXRhYmFzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvQ2F0YWxvZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9DYXRhbG9nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhMzQ1YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9DYXRhbG9nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hOwotCi0vKioKLSAqIEFkYXB0IHRoZSB2YXJpZXR5IG9mIGNhdGFsb2cgKGFuZCBzY2hlbWEpIGNvbmZpZ3VyYXRpb25zIGdlbmVyYXRlZCBieQotICogRFRQLXN1cHBsaWVkIGRyaXZlcnMuCi0gKi8KLWludGVyZmFjZSBDYXRhbG9nU3RyYXRlZ3kgewotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIERUUCBkYXRhYmFzZSBoYXMgInJlYWwiIGNhdGFsb2dzIChpLmUuIGNhdGFsb2dzIHRoYXQKLQkgKiBjYW4gYmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyKS4KLQkgKi8KLQlib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgRFRQIGRhdGFiYXNlJ3MgY2F0YWxvZ3MuIFRoaXMgd2lsbCBiZSBlbXB0eSBpZiB0aGUgZGF0YWJhc2UKLQkgKiBkb2VzIDxlbT5ub3Q8L2VtPiBzdXBwb3J0IGNhdGFsb2dzLgotCSAqIEBzZWUgI3N1cHBvcnRzQ2F0YWxvZ3MoKQotCSAqLwotCUxpc3Q8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgRFRQIGRhdGFiYXNlJ3Mgc2NoZW1hcy4gVGhpcyB3aWxsIGJlIGVtcHR5IGlmIHRoZSBkYXRhYmFzZQotCSAqIHN1cHBvcnRzIGNhdGFsb2dzLgotCSAqIEBzZWUgI3N1cHBvcnRzQ2F0YWxvZ3MoKQotCSAqLwotCUxpc3Q8U2NoZW1hPiBnZXRTY2hlbWFzKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9EQjIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0RCMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzFmZjY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0RCMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLmRyaXZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2U7Ci0KLWNsYXNzIERCMgotCWV4dGVuZHMgQWJzdHJhY3REVFBEcml2ZXJBZGFwdGVyCi17Ci0JREIyKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXN1cGVyKGRhdGFiYXNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlDYXRhbG9nU3RyYXRlZ3kgYnVpbGRDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCS8vIHVudmVyaWZpZWQuLi4KLQkJcmV0dXJuIG5ldyBVbmtub3duQ2F0YWxvZ1N0cmF0ZWd5KHRoaXMuZGF0YWJhc2UuZ2V0RFRQRGF0YWJhc2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRm9sZGluZ1N0cmF0ZWd5IGJ1aWxkRm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY3RvcnkgKioqKioqKioqKgotCi0Jc3RhdGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBEVFBEcml2ZXJBZGFwdGVyRmFjdG9yeSB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFZFTkRPUlMgPSB7Ci0JCQkJIkRCMiBVREIiLCAvLyROT04tTkxTLTEkCi0JCQkJIkRCMiBVREIgaVNlcmllcyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiREIyIFVEQiB6U2VyaWVzIiAvLyROT04tTkxTLTEkCi0JCQl9OwotCQlwdWJsaWMgU3RyaW5nW10gZ2V0U3VwcG9ydGVkVmVuZG9ycygpIHsKLQkJCXJldHVybiBWRU5ET1JTOwotCQl9Ci0JCXB1YmxpYyBEVFBEcml2ZXJBZGFwdGVyIGJ1aWxkQWRhcHRlcihEYXRhYmFzZSBkYXRhYmFzZSkgewotCQkJcmV0dXJuIG5ldyBEQjIoZGF0YWJhc2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvRFRQRHJpdmVyQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvRFRQRHJpdmVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTQzODBiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0RUUERyaXZlckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwuZHJpdmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotLyoqCi0gKiBEZWxlZ2F0ZSBEVFAgZHJpdmVyLXNwZWNpZmljIGJlaGF2aW9yIHRvIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzCi0gKiBpbnRlcmZhY2U6PHVsPgotICogICA8bGk+Y2F0YWxvZ3Mvc2NoZW1hcwotICogICA8bGk+bmFtZXMvaWRlbnRpZmllcnMKLSAqICAgPGxpPmRhdGFiYXNlIG9iamVjdCBzZWxlY3Rpb24KLSAqIDwvdWw+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPjxicj4KLSAqIFdlIHVzZSA8ZW0+bmFtZTwvZW0+IHdoZW4gZGVhbGluZyB3aXRoIHRoZSB1bm1vZGlmaWVkIG5hbWUgb2YgYSBkYXRhYmFzZQotICogb2JqZWN0IGFzIHN1cHBsaWVkIGJ5IHRoZSBkYXRhYmFzZSBpdHNlbGYgKGkuZS4gaXQgaXMgbm90IGRlbGltaXRlZCBhbmQgaXQgaXMKLSAqIGFsd2F5cyBjYXNlLXNlbnNpdGl2ZSkuCi0gKiA8YnI+Ci0gKiBXZSB1c2UgPGVtPmlkZW50aWZpZXI8L2VtPiB3aGVuIGRlYWxpbmcgd2l0aCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhCi0gKiBkYXRhYmFzZSBvYmplY3QgbmFtZSAoaS5lLiBpdCBtYXkgYmUgZGVsaW1pdGVkIGFuZCwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhYmFzZSwKLSAqIGl0IG1heSBiZSBjYXNlLWluc2Vuc2l0aXZlKS4KLSAqLwotcHVibGljIGludGVyZmFjZSBEVFBEcml2ZXJBZGFwdGVyIHsKLQotCS8vICoqKioqKioqKiogY2F0YWxvZ3MgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIERUUCBkcml2ZXIgc3VwcG9ydHMgInJlYWwiIGNhdGFsb2dzIChlLmcuIFN5YmFzZSkuCi0JICogSWYgaXQgZG9lcywgdXNlIHtAbGluayAjZ2V0RFRQQ2F0YWxvZ3MoKX0gdG8gcmV0cmlldmUgdGhlbTsKLQkgKiBvdGhlcndpc2UsIHVzZSB7QGxpbmsgI2dldERUUFNjaGVtYXMoKX0gdG8gcmV0cmlldmUgdGhlIHNjaGVtYXMgZGlyZWN0bHkuCi0JICovCi0JYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIERUUCBkYXRhYmFzZSdzIGNhdGFsb2dzLgotCSAqIFRoaXMgd2lsbCBiZSBlbXB0eSBpZiB0aGUgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KLQkgKiBAc2VlICNzdXBwb3J0c0NhdGFsb2dzKCkKLQkgKi8KLQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nPiBnZXREVFBDYXRhbG9ncygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBEVFAgZGF0YWJhc2UncyBkZWZhdWx0IGNhdGFsb2cgbmFtZXMuCi0JICogVGhlIGZpcnN0IG5hbWUgaW4gdGhlIGxpc3QgdGhhdCBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGNhdGFsb2cKLQkgKiBpcyA8ZW0+dGhlPC9lbT4gZGVmYXVsdC4KLQkgKiBUaGlzIHdpbGwgYmUgZW1wdHkgaWYgdGhlIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXREZWZhdWx0Q2F0YWxvZ05hbWVzKCk7Ci0KLQotCS8vICoqKioqKioqKiogc2NoZW1hcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIERUUCBkYXRhYmFzZSdzIHNjaGVtYXMuCi0JICogVGhpcyB3aWxsIGJlIGVtcHR5IGlmIHRoZSBkYXRhYmFzZSBzdXBwb3J0cyBjYXRhbG9ncy4KLQkgKiBAc2VlICNzdXBwb3J0c0NhdGFsb2dzKCkKLQkgKi8KLQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE+IGdldERUUFNjaGVtYXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgRFRQIGRhdGFiYXNlJ3MgZGVmYXVsdCBzY2hlbWEgbmFtZXMuCi0JICogVGhlIGZpcnN0IG5hbWUgaW4gdGhlIGxpc3QgdGhhdCBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIHNjaGVtYQotCSAqIGlzIDxlbT50aGU8L2VtPiBkZWZhdWx0LgotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0RGVmYXVsdFNjaGVtYU5hbWVzKCk7Ci0KLQotCS8vICoqKioqKioqKiogbmFtZXMvaWRlbnRpZmllcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIG9iamVjdCBuYW1lIHRvIGEgZGF0YWJhc2Utc3BlY2lmaWMKLQkgKiBpZGVudGlmaWVyIChpLmUuIGRlbGltaXQgdGhlIG5hbWUgYXMgYXBwcm9wcmlhdGUpLgotCSAqLwotCVN0cmluZyBjb252ZXJ0TmFtZVRvSWRlbnRpZmllcihTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgZGF0YWJhc2Ugb2JqZWN0IG5hbWUgdG8gYSBkYXRhYmFzZS1zcGVjaWZpYwotCSAqIGlkZW50aWZpZXIgKGkuZS4gZGVsaW1pdCB0aGUgbmFtZSBhcyBhcHByb3ByaWF0ZSkuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXN1bHRpbmcgaWRlbnRpZmllciBtYXRjaGVzIHRoZQotCSAqIHNwZWNpZmllZCBkZWZhdWx0IG5hbWUuCi0JICogPHA+Ci0JICogVGhpcyBpcyB1c2VkIGJ5IGVudGl0eSBnZW5lcmF0aW9uIGNvZGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKLQkgKiBhIGdlbmVyYXRlZCBhbm5vdGF0aW9uIG11c3QgZXhwbGljaXRseSBpZGVudGlmeSBhIGRhdGFiYXNlIG9iamVjdAotCSAqIChlLmcuIGEgdGFibGUpIG9yIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCBhZGVxdWF0ZWx5IGlkZW50aWZpZXMgdGhlCi0JICogc3BlY2lmaWVkIGRhdGFiYXNlIG9iamVjdCAodGFraW5nIGludG8gY29uc2lkZXJhdGlvbiBjYXNlLXNlbnNpdGl2aXR5LAotCSAqIHNwZWNpYWwgY2hhcmFjdGVycywgZXRjLikuCi0JICovCi0JU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVmYXVsdE5hbWUpOwotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIG9iamVjdCBpZGVudGlmaWVyIHRvIGEgZGF0YWJhc2Utc3BlY2lmaWMKLQkgKiBuYW1lIChpLmUuIHN0cmlwcGluZyBkZWxpbWl0ZXJzIGZyb20gYW5kIGZvbGRpbmcgdGhlIGlkZW50aWZpZXIgYXMKLQkgKiBhcHByb3ByaWF0ZSkuCi0JICovCi0JU3RyaW5nIGNvbnZlcnRJZGVudGlmaWVyVG9OYW1lKFN0cmluZyBpZGVudGlmaWVyKTsKLQotCi0JLy8gKioqKioqKioqKiBzZWxlY3RpbmcgZGF0YWJhc2Ugb2JqZWN0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZWxlY3QgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdGhlIGNhdGFsb2cgZm9yIHRoZSBzcGVjaWZpZWQKLQkgKiBpZGVudGlmaWVyLgotCSAqLwotCUNhdGFsb2cgc2VsZWN0Q2F0YWxvZ0ZvcklkZW50aWZpZXIoSXRlcmFibGU8Q2F0YWxvZz4gY2F0YWxvZ3MsIFN0cmluZyBpZGVudGlmaWVyKTsKLQotCS8qKgotCSAqIFNlbGVjdCBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB0aGUgc2NoZW1hIGZvciB0aGUgc3BlY2lmaWVkCi0JICogaWRlbnRpZmllci4KLQkgKi8KLQlTY2hlbWEgc2VsZWN0U2NoZW1hRm9ySWRlbnRpZmllcihJdGVyYWJsZTxTY2hlbWE+IHNjaGVtYXRhLCBTdHJpbmcgaWRlbnRpZmllcik7Ci0KLQkvKioKLQkgKiBTZWxlY3QgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdGhlIHRhYmxlIGZvciB0aGUgc3BlY2lmaWVkCi0JICogaWRlbnRpZmllci4KLQkgKi8KLQlUYWJsZSBzZWxlY3RUYWJsZUZvcklkZW50aWZpZXIoSXRlcmFibGU8VGFibGU+IHRhYmxlcywgU3RyaW5nIGlkZW50aWZpZXIpOwotCi0JLyoqCi0JICogU2VsZWN0IGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHRoZSBzZXF1ZW5jZSBmb3IgdGhlIHNwZWNpZmllZAotCSAqIGlkZW50aWZpZXIuCi0JICovCi0JU2VxdWVuY2Ugc2VsZWN0U2VxdWVuY2VGb3JJZGVudGlmaWVyKEl0ZXJhYmxlPFNlcXVlbmNlPiBzZXF1ZW5jZXMsIFN0cmluZyBpZGVudGlmaWVyKTsKLQotCS8qKgotCSAqIFNlbGVjdCBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB0aGUgY29sdW1uIGZvciB0aGUgc3BlY2lmaWVkCi0JICogaWRlbnRpZmllci4KLQkgKi8KLQlDb2x1bW4gc2VsZWN0Q29sdW1uRm9ySWRlbnRpZmllcihJdGVyYWJsZTxDb2x1bW4+IGNvbHVtbnMsIFN0cmluZyBpZGVudGlmaWVyKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0RUUERyaXZlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9EVFBEcml2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTMxOWZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0RUUERyaXZlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwuZHJpdmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZTsKLQotLyoqCi0gKiBGYWN0b3J5IGludGVyZmFjZS4KLSAqLwotaW50ZXJmYWNlIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5IHsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZlbmRvcnMgc3VwcG9ydGVkIGJ5IHRoZSBmYWN0b3J5J3MgYWRhcHRlci4KLQkgKi8KLQlTdHJpbmdbXSBnZXRTdXBwb3J0ZWRWZW5kb3JzKCk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhIG5ldyBEVFAgZHJpdmVyIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgRGFsaSBkYXRhYmFzZS4KLQkgKi8KLQlEVFBEcml2ZXJBZGFwdGVyIGJ1aWxkQWRhcHRlcihEYXRhYmFzZSBkYXRhYmFzZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvRFRQRHJpdmVyQWRhcHRlck1hbmFnZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0RUUERyaXZlckFkYXB0ZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YTVlMmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvRFRQRHJpdmVyQWRhcHRlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlOwotCi1wdWJsaWMgY2xhc3MgRFRQRHJpdmVyQWRhcHRlck1hbmFnZXIgewotCXByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5PiBhZGFwdGVyRmFjdG9yaWVzOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFRQRHJpdmVyQWRhcHRlck1hbmFnZXIgSU5TVEFOQ0UgPSBuZXcgRFRQRHJpdmVyQWRhcHRlck1hbmFnZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFRQRHJpdmVyQWRhcHRlck1hbmFnZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRFRQRHJpdmVyQWRhcHRlck1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcmllcyA9IHRoaXMuYnVpbGRBZGFwdGVyRmFjdG9yaWVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgRFRQRHJpdmVyQWRhcHRlckZhY3Rvcnk+IGJ1aWxkQWRhcHRlckZhY3RvcmllcygpIHsKLQkJSGFzaE1hcDxTdHJpbmcsIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5PiBmYWN0b3JpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5PigpOwotCQl0aGlzLmFkZEFkYXB0ZXJGYWN0b3JpZXNUbyhmYWN0b3JpZXMpOwotCQlyZXR1cm4gZmFjdG9yaWVzOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRBZGFwdGVyRmFjdG9yaWVzVG8oSGFzaE1hcDxTdHJpbmcsIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5PiBmYWN0b3JpZXMpIHsKLQkJdGhpcy5hZGRBZGFwdGVyRmFjdG9yeVRvKG5ldyBEQjIuRmFjdG9yeSgpLCBmYWN0b3JpZXMpOwotCQl0aGlzLmFkZEFkYXB0ZXJGYWN0b3J5VG8obmV3IERlcmJ5LkZhY3RvcnkoKSwgZmFjdG9yaWVzKTsKLQkJdGhpcy5hZGRBZGFwdGVyRmFjdG9yeVRvKG5ldyBIU1FMREIuRmFjdG9yeSgpLCBmYWN0b3JpZXMpOwotCQl0aGlzLmFkZEFkYXB0ZXJGYWN0b3J5VG8obmV3IEluZm9ybWl4LkZhY3RvcnkoKSwgZmFjdG9yaWVzKTsKLQkJdGhpcy5hZGRBZGFwdGVyRmFjdG9yeVRvKG5ldyBNYXhEQi5GYWN0b3J5KCksIGZhY3Rvcmllcyk7Ci0JCXRoaXMuYWRkQWRhcHRlckZhY3RvcnlUbyhuZXcgTXlTUUwuRmFjdG9yeSgpLCBmYWN0b3JpZXMpOwotCQl0aGlzLmFkZEFkYXB0ZXJGYWN0b3J5VG8obmV3IE9yYWNsZS5GYWN0b3J5KCksIGZhY3Rvcmllcyk7Ci0JCXRoaXMuYWRkQWRhcHRlckZhY3RvcnlUbyhuZXcgUG9zdGdyZVNRTC5GYWN0b3J5KCksIGZhY3Rvcmllcyk7Ci0JCXRoaXMuYWRkQWRhcHRlckZhY3RvcnlUbyhuZXcgU1FMU2VydmVyLkZhY3RvcnkoKSwgZmFjdG9yaWVzKTsKLQkJdGhpcy5hZGRBZGFwdGVyRmFjdG9yeVRvKG5ldyBTeWJhc2UuRmFjdG9yeSgpLCBmYWN0b3JpZXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlI2dldFZlbmRvcigpCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEFkYXB0ZXJGYWN0b3J5VG8oRFRQRHJpdmVyQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgSGFzaE1hcDxTdHJpbmcsIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5PiBmYWN0b3JpZXMpIHsKLQkJZm9yIChTdHJpbmcgbmFtZSA6IGZhY3RvcnkuZ2V0U3VwcG9ydGVkVmVuZG9ycygpKSB7Ci0JCQl0aGlzLmFkZEFkYXB0ZXJGYWN0b3J5VG8obmFtZSwgZmFjdG9yeSwgZmFjdG9yaWVzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRBZGFwdGVyRmFjdG9yeVRvKFN0cmluZyBuYW1lLCBEVFBEcml2ZXJBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBIYXNoTWFwPFN0cmluZywgRFRQRHJpdmVyQWRhcHRlckZhY3Rvcnk+IGZhY3RvcmllcykgewotCQlpZiAoZmFjdG9yaWVzLnB1dChuYW1lLCBmYWN0b3J5KSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJEdXBsaWNhdGUgYWRhcHRlciBmYWN0b3J5OiAiICsgbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBEVFBEcml2ZXJBZGFwdGVyIGJ1aWxkQWRhcHRlcihTdHJpbmcgZHRwVmVuZG9yTmFtZSwgRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QWRhcHRlckZhY3RvcnkoZHRwVmVuZG9yTmFtZSkuYnVpbGRBZGFwdGVyKGRhdGFiYXNlKTsKLQl9Ci0KLQlwcml2YXRlIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KFN0cmluZyBkdHBWZW5kb3JOYW1lKSB7Ci0JCURUUERyaXZlckFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSB0aGlzLmFkYXB0ZXJGYWN0b3JpZXMuZ2V0KGR0cFZlbmRvck5hbWUpOwotCQlyZXR1cm4gKGZhY3RvcnkgIT0gbnVsbCkgPyBmYWN0b3J5IDogVU5SRUNPR05JWkVEX0FEQVBURVJfRkFDVE9SWTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFRQRHJpdmVyQWRhcHRlckZhY3RvcnkgVU5SRUNPR05JWkVEX0FEQVBURVJfRkFDVE9SWSA9IG5ldyBVbmtub3duLkZhY3RvcnkoKTsKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0RlcmJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9EZXJieS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTkwNjYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0RlcmJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwuZHJpdmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlOwotCi1jbGFzcyBEZXJieQotCWV4dGVuZHMgQWJzdHJhY3REVFBEcml2ZXJBZGFwdGVyCi17Ci0JRGVyYnkoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJc3VwZXIoZGF0YWJhc2UpOwotCX0KLQotCUBPdmVycmlkZQotCUNhdGFsb2dTdHJhdGVneSBidWlsZENhdGFsb2dTdHJhdGVneSgpIHsKLQkJcmV0dXJuIG5ldyBGYXV4Q2F0YWxvZ1N0cmF0ZWd5KHRoaXMuZGF0YWJhc2UuZ2V0RFRQRGF0YWJhc2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRm9sZGluZ1N0cmF0ZWd5IGJ1aWxkRm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCBhZGREZWZhdWx0U2NoZW1hTmFtZXNUbyhBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewotCQluYW1lcy5hZGQodGhpcy5nZXREZWZhdWx0U2NoZW1hTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB1c2VyIG5hbWUgb24gRGVyYnkgaXMgPGNvZGU+IkFQUCI8L2NvZGU+IHdoZW4gdGhlIHVzZXIKLQkgKiBjb25uZWN0cyB3aXRob3V0IGEgdXNlciBuYW1lLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRTY2hlbWFOYW1lKCkgewotCQlTdHJpbmcgdXNlck5hbWUgPSB0aGlzLmdldFVzZXJOYW1lKCk7Ci0JCXJldHVybiAoKHVzZXJOYW1lICE9IG51bGwpICYmICh1c2VyTmFtZS5sZW5ndGgoKSAhPSAwKSkgPwotCQkJCXVzZXJOYW1lIDoKLQkJCQlERUZBVUxUX1VTRVJfTkFNRTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVVNFUl9OQU1FID0gIkFQUCI7ICAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSAqKioqKioqKioqCi0KLQlzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkVORE9SUyA9IHsKLQkJCQkiRGVyYnkiIC8vJE5PTi1OTFMtMSQKLQkJCX07Ci0JCXB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRWZW5kb3JzKCkgewotCQkJcmV0dXJuIFZFTkRPUlM7Ci0JCX0KLQkJcHVibGljIERUUERyaXZlckFkYXB0ZXIgYnVpbGRBZGFwdGVyKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCQlyZXR1cm4gbmV3IERlcmJ5KGRhdGFiYXNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0ZhdXhDYXRhbG9nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0ZhdXhDYXRhbG9nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA3ZDVjYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9GYXV4Q2F0YWxvZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwuZHJpdmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE7Ci0KLS8qKgotICogQ2F0YWxvZyBzdHJhdGVneSBmb3IgRFRQIGRhdGFiYXNlIGRyaXZlcnMgdGhhdCBidWlsZCBhICJ2aXJ0dWFsIiBjYXRhbG9nCi0gKiAodGhhdCBoYXMgbm8gbmFtZSkgYmVjYXVzZSB0aGUgdW5kZXJseWluZyBKREJDIGRyaXZlciBkb2VzIG5vdCByZXR1cm4gYW55Ci0gKiBjYXRhbG9ncyAoZS5nLiBPcmFjbGUpLiBUaGlzIGNhdGFsb2cgY2Fubm90IGJlIHNwZWNpZmllZCBieSB0aGUgdXNlciBpbgotICogYW5ub3RhdGlvbnMgZXRjLgotICogCi0gKiBAc2VlIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0Q2F0YWxvZ3MoKQotICovCi1jbGFzcyBGYXV4Q2F0YWxvZ1N0cmF0ZWd5Ci0JaW1wbGVtZW50cyBDYXRhbG9nU3RyYXRlZ3kKLXsKLQlwcml2YXRlIGZpbmFsIERhdGFiYXNlIGRhdGFiYXNlOwotCi0JRmF1eENhdGFsb2dTdHJhdGVneShEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmRhdGFiYXNlID0gZGF0YWJhc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBMaXN0PENhdGFsb2c+IGdldENhdGFsb2dzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCi0JcHVibGljIExpc3Q8U2NoZW1hPiBnZXRTY2hlbWFzKCkgewotCQlDYXRhbG9nIGZhdXhDYXRhbG9nID0gdGhpcy5nZXRGYXV4Q2F0YWxvZygpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJTGlzdDxTY2hlbWE+IHNjaGVtYXMgPSBmYXV4Q2F0YWxvZy5nZXRTY2hlbWFzKCk7Ci0JCXJldHVybiBzY2hlbWFzOwotCX0KLQotCXByaXZhdGUgQ2F0YWxvZyBnZXRGYXV4Q2F0YWxvZygpIHsKLQkJTGlzdDxDYXRhbG9nPiBjYXRhbG9ncyA9IHRoaXMuZ2V0Q2F0YWxvZ3NfKCk7Ci0JCWlmIChjYXRhbG9ncyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjYXRhbG9ncyBsaXN0IGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChjYXRhbG9ncy5zaXplKCkgIT0gMSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IGEgc2luZ2xlIGNhdGFsb2c6ICIgKyBjYXRhbG9ncyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUNhdGFsb2cgY2F0YWxvZyA9IGNhdGFsb2dzLmdldCgwKTsKLQkJaWYgKGNhdGFsb2cuZ2V0TmFtZSgpLmxlbmd0aCgpICE9IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImlsbGVnYWwgbmFtZTogIiArIGNhdGFsb2cuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBjYXRhbG9nOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxDYXRhbG9nPiBnZXRDYXRhbG9nc18oKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFiYXNlLmdldENhdGFsb2dzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvRm9sZGluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9Gb2xkaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIzYmI3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9Gb2xkaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXI7Ci0KLS8qKgotICogQWRhcHQgZGF0YWJhc2Utc3BlY2lmaWMgaWRlbnRpZmllci1mb2xkaW5nIGV0Yy4KLSAqLwotaW50ZXJmYWNlIEZvbGRpbmdTdHJhdGVneSB7Ci0KLQkvKioKLQkgKiBGb2xkIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllci4KLQkgKi8KLQlTdHJpbmcgZm9sZChTdHJpbmcgaWRlbnRpZmllcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIG9iamVjdCBuYW1lIGlzIGFscmVhZHkgZm9sZGVkLAotCSAqIG1lYW5pbmcsIHR5cGljYWxseSwgaWYgaXQgaGFzIG5vIHNwZWNpYWwgY2hhcmFjdGVycywgaXQgcmVxdWlyZXMgbm8KLQkgKiBkZWxpbWl0ZXJzLgotCSAqLwotCWJvb2xlYW4gbmFtZUlzRm9sZGVkKFN0cmluZyBuYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0hTUUxEQi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvSFNRTERCLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NzZjMmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvSFNRTERCLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwuZHJpdmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlOwotCi1jbGFzcyBIU1FMREIKLQlleHRlbmRzIEFic3RyYWN0RFRQRHJpdmVyQWRhcHRlcgotewotCUhTUUxEQihEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlzdXBlcihkYXRhYmFzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGJ1aWxkQ2F0YWxvZ1N0cmF0ZWd5KCkgewotCQkvLyB1bnZlcmlmaWVkLi4uCi0JCXJldHVybiBuZXcgVW5rbm93bkNhdGFsb2dTdHJhdGVneSh0aGlzLmRhdGFiYXNlLmdldERUUERhdGFiYXNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCUZvbGRpbmdTdHJhdGVneSBidWlsZEZvbGRpbmdTdHJhdGVneSgpIHsKLQkJcmV0dXJuIFVwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneS5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgYWRkRGVmYXVsdFNjaGVtYU5hbWVzVG8oQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMpIHsKLQkJbmFtZXMuYWRkKFBVQkxJQ19TQ0hFTUFfTkFNRSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNfU0NIRU1BX05BTUUgPSAiUFVCTElDIjsgIC8vJE5PTi1OTFMtMSQKLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5ICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgRFRQRHJpdmVyQWRhcHRlckZhY3RvcnkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWRU5ET1JTID0gewotCQkJCSJIU1FMREIiIC8vJE5PTi1OTFMtMSQKLQkJCX07Ci0JCXB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRWZW5kb3JzKCkgewotCQkJcmV0dXJuIFZFTkRPUlM7Ci0JCX0KLQkJcHVibGljIERUUERyaXZlckFkYXB0ZXIgYnVpbGRBZGFwdGVyKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCQlyZXR1cm4gbmV3IEhTUUxEQihkYXRhYmFzZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9JbmZvcm1peC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvSW5mb3JtaXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmODRhMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9JbmZvcm1peC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLmRyaXZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2U7Ci0KLWNsYXNzIEluZm9ybWl4Ci0JZXh0ZW5kcyBBYnN0cmFjdERUUERyaXZlckFkYXB0ZXIKLXsKLQlJbmZvcm1peChEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlzdXBlcihkYXRhYmFzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGJ1aWxkQ2F0YWxvZ1N0cmF0ZWd5KCkgewotCQkvLyB1bnZlcmlmaWVkLi4uCi0JCXJldHVybiBuZXcgVW5rbm93bkNhdGFsb2dTdHJhdGVneSh0aGlzLmRhdGFiYXNlLmdldERUUERhdGFiYXNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCUZvbGRpbmdTdHJhdGVneSBidWlsZEZvbGRpbmdTdHJhdGVneSgpIHsKLQkJcmV0dXJuIExvd2VyQ2FzZUZvbGRpbmdTdHJhdGVneS5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnXycgfTsKLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lUGFydENoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBFWFRFTkRFRF9SRUdVTEFSX05BTUVfUEFSVF9DSEFSQUNURVJTOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfUkVHVUxBUl9OQU1FX1BBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnJCcgfTsKLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5ICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgRFRQRHJpdmVyQWRhcHRlckZhY3RvcnkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWRU5ET1JTID0gewotCQkJCSJJbmZvcm1peCIgLy8kTk9OLU5MUy0xJAotCQkJfTsKLQkJcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZFZlbmRvcnMoKSB7Ci0JCQlyZXR1cm4gVkVORE9SUzsKLQkJfQotCQlwdWJsaWMgRFRQRHJpdmVyQWRhcHRlciBidWlsZEFkYXB0ZXIoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJCXJldHVybiBuZXcgSW5mb3JtaXgoZGF0YWJhc2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvTG93ZXJDYXNlRm9sZGluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9Mb3dlckNhc2VGb2xkaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzYWQwYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9Mb3dlckNhc2VGb2xkaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogRm9sZCA8ZW0+cmVndWxhcjwvZW0+IGlkZW50aWZpZXJzIHRvIGxvd2VyIGNhc2UuCi0gKi8KLWNsYXNzIExvd2VyQ2FzZUZvbGRpbmdTdHJhdGVneQotCWltcGxlbWVudHMgRm9sZGluZ1N0cmF0ZWd5Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9sZGluZ1N0cmF0ZWd5IElOU1RBTkNFID0gbmV3IExvd2VyQ2FzZUZvbGRpbmdTdHJhdGVneSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIEZvbGRpbmdTdHJhdGVneSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBMb3dlckNhc2VGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBmb2xkKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiBpZGVudGlmaWVyLnRvTG93ZXJDYXNlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbmFtZUlzRm9sZGVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc0xvd2VyY2FzZShuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9NYXhEQi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvTWF4REIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEzZDA4Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9NYXhEQi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLmRyaXZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2U7Ci0KLWNsYXNzIE1heERCCi0JZXh0ZW5kcyBBYnN0cmFjdERUUERyaXZlckFkYXB0ZXIKLXsKLQlNYXhEQihEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlzdXBlcihkYXRhYmFzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGJ1aWxkQ2F0YWxvZ1N0cmF0ZWd5KCkgewotCQkvLyB1bnZlcmlmaWVkLi4uCi0JCXJldHVybiBuZXcgVW5rbm93bkNhdGFsb2dTdHJhdGVneSh0aGlzLmRhdGFiYXNlLmdldERUUERhdGFiYXNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCUZvbGRpbmdTdHJhdGVneSBidWlsZEZvbGRpbmdTdHJhdGVneSgpIHsKLQkJcmV0dXJuIFVwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneS5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnIycsICdAJywgJyQnIH07Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSAqKioqKioqKioqCi0KLQlzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkVORE9SUyA9IHsKLQkJCQkiTWF4REIiIC8vJE5PTi1OTFMtMSQKLQkJCX07Ci0JCXB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRWZW5kb3JzKCkgewotCQkJcmV0dXJuIFZFTkRPUlM7Ci0JCX0KLQkJcHVibGljIERUUERyaXZlckFkYXB0ZXIgYnVpbGRBZGFwdGVyKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCQlyZXR1cm4gbmV3IE1heERCKGRhdGFiYXNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL015U1FMLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9NeVNRTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDc2YWFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL015U1FMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLmRyaXZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotCi0vKioKLSAqIE15U1FMIGlzIGEgYml0IHVudXN1YWwgaW4gdGhhdCBpdCBkb2VzIDxlbT5ub3Q8L2VtPiBmb2xkIDxlbT5yZWd1bGFyPC9lbT4KLSAqIGlkZW50aWZpZXJzIGFuZCBpdHMgaWRlbnRpZmllcnMgYXJlIDxlbT5ub3Q8L2VtPiBjYXNlLXNlbnNpdGl2ZQotICogKGV4Y2VwdCBpbiBzcGVjaWFsIGNhc2VzLCBkZXNjcmliZWQgYmVsb3cpLiBFdmVuIDxlbT5kZWxpbWl0ZWQ8L2VtPiBpZGVudGlmaWVycwotICogYXJlIGNhc2UtPGVtPmluPC9lbT5zZW5zaXRpdmUuIChEZWxpbWl0ZXJzIGFyZSBvbmx5IG5lZWRlZCBmb3IgaWRlbnRpZmllcnMKLSAqIHRoYXQgY29udGFpbiBzcGVjaWFsIGNoYXJhY3RlcnMgb3IgYXJlIHJlc2VydmVkIHdvcmRzLikKLSAqIDxwPgotICogTXlTUUwgaGFuZGxlcyB0aGUgY2FzZS1zZW5zaXRpdml0eSBvZiBkYXRhYmFzZXMgYW5kIHRhYmxlcyBhY2NvcmRpbmcgdG8gdGhlCi0gKiB2YWx1ZSBvZiB0aGUgc3lzdGVtIHZhcmlhYmxlIDxjb2RlPmxvd2VyX2Nhc2VfdGFibGVfbmFtZXM8L2NvZGU+Ojx1bD4KLSAqIDxsaT4wIChVbml4L0xpbnV4IGRlZmF1bHQpOiBkYXRhYmFzZSBhbmQgdGFibGUgbmFtZXMgYXJlIDxlbT5ub3Q8L2VtPiBmb2xkZWQKLSAqIGFuZCB0aGV5IGFyZSBjYXNlLXNlbnNpdGl2ZQotICogPGxpPjEgKFdpbmRvd3MgZGVmYXVsdCk6IGRhdGFiYXNlIGFuZCB0YWJsZSBuYW1lcyBhcmUgZm9sZGVkIHRvIGxvd2VyY2FzZQotICogYW5kIHRoZXkgYXJlIDxlbT5ub3Q8L2VtPiBjYXNlLXNlbnNpdGl2ZQotICogPGxpPjIgKE1hYyBPUyBYIGRlZmF1bHQpOiBkYXRhYmFzZSBhbmQgdGFibGUgbmFtZXMgYXJlIDxlbT5ub3Q8L2VtPiBmb2xkZWQKLSAqIGFuZCB0aGV5IGFyZSA8ZW0+bm90PC9lbT4gY2FzZS1zZW5zaXRpdmUKLSAqIDwvdWw+Ci0gKiBUaGVzZSB2YWx1ZXMgd2lsbCBub3Qgd29yayBwZXJmZWN0bHkgb24gYWxsIHBsYXRmb3JtcyBiZWNhdXNlIGRhdGFiYXNlcyBhcmUKLSAqIHN0b3JlZCBhcyBkaXJlY3RvcmllcyBhbmQgdGFibGVzIGFyZSBzdG9yZWQgYXMgZmlsZXMgaW4gdGhlIHVuZGVybHlpbmcKLSAqIE8vUzsgYW5kIHRoZSBhY3R1YWwgY2FzZS1zZW5zaXRpdml0eSBvZiB0aGUgbmFtZXMgd2lsbCB1bGltYXRlbHkgYmUKLSAqIGRldGVybWluZWQgYnkgdGhlIGJlaGF2aW9yIG9mIGZpbGVuYW1lcyBvbiB0aGUgTy9TLgotICogPHA+Ci0gKiBTZWUgPGEgaHJlZj1odHRwOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzUuMC9lbi9pZGVudGlmaWVyLWNhc2Utc2Vuc2l0aXZpdHkuaHRtbD4KLSAqIElkZW50aWZpZXIgQ2FzZSBTZW5zaXRpdml0eTwvYT4uCi0gKi8KLWNsYXNzIE15U1FMCi0JZXh0ZW5kcyBBYnN0cmFjdERUUERyaXZlckFkYXB0ZXIKLXsKLQkvKiogbGF6eS1pbml0aWFsaXplZDsgdmFsdWUgY29tZXMgZnJvbSB0aGUgZGF0YWJhc2Ugc2VydmVyICovCi0JcHJpdmF0ZSBpbnQgbG93ZXJfY2FzZV90YWJsZV9uYW1lcyA9IC0xOwotCi0JLyoqIGxhenktaW5pdGlhbGl6ZWQ7IHZhbHVlIGNvbWVzIGZyb20gdGhlIGRhdGFiYXNlIHNlcnZlciAqLwotCXByaXZhdGUgQm9vbGVhbiBBTlNJX1FVT1RFUyA9IG51bGw7Ci0KLQotCU15U1FMKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXN1cGVyKGRhdGFiYXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgRFRQIG1vZGVsIGZvciBNeVNRTCBoYXMgYSBkYXRhYmFzZSB0aGF0IGNvbnRhaW5zIG5vIGNhdGFsb2dzOwotCSAqIGJ1dCwgaW5zdGVhZCwgZGlyZWN0bHkgaG9sZHMgYSBzaW5nbGUgc2NoZW1hIHdpdGggdGhlIHNhbWUgbmFtZSBhcwotCSAqIHRoZSBkYXRhYmFzZS4gKFRoaXMgaXMgaGFyZC1jb2RlZCBpbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5teXNxbC5jYXRhbG9nLk15U3FsQ2F0YWxvZ0RhdGFiYXNlI2dldFNjaGVtYXMoKX0uKQotCSAqIEFsdGhvdWdoIHlvdSBjYW4gcXVhbGlmeSBpZGVudGlmaWVycyB3aXRoIGEgZGF0YWJhc2UgbmFtZQotCSAqIGluIE15U1FMLCBvbmx5IHRoZSBkYXRhYmFzZSBzcGVjaWZpZWQgYXQgbG9naW4gc2VlbXMgdG8gYmUgYXZhaWxhYmxlCi0JICogaW4gdGhlIERUUCBtb2RlbC4uLi4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBJbiBNeVNRTCBEREwsIDxjb2RlPlNDSEVNQTwvY29kZT4gaXMgYSBzeW5vbnltCi0JICogZm9yIDxjb2RlPkRBVEFCQVNFPC9jb2RlPjsgYnV0IHRoZSBKREJDCi0JICogbWV0aG9kIHtAbGluayBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2dldFNjaGVtYXMoKX0gcmV0dXJucyBhbiBlbXB0eSBsaXN0LAotCSAqIHdoaWxlIHtAbGluayBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2dldENhdGFsb2dzKCl9IHJldHVybnMgYSBsaXN0IG9mIHRoZQotCSAqIGF2YWlsYWJsZSBkYXRhYmFzZXMuCi0JICogWW91IGNhbiBhbHNvIHVzZSB0aGUgSkRCQyBtZXRob2Qge0BsaW5rIGphdmEuc3FsLkNvbm5lY3Rpb24jc2V0Q2F0YWxvZyhTdHJpbmcpfQotCSAqIHRvIHNldCB0aGUgZGVmYXVsdCBkYXRhYmFzZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlDYXRhbG9nU3RyYXRlZ3kgYnVpbGRDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBuZXcgTm9DYXRhbG9nU3RyYXRlZ3kodGhpcy5kYXRhYmFzZS5nZXREVFBEYXRhYmFzZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGVyZSBhcmUgc29tZSBjYXNlcyB3aGVyZSBNeVNRTCBmb2xkcyBpZGVudGlmaWVycywgYnV0IHVzaW5nIHRoZQotCSAqIG5vbi1mb2xkaW5nIHN0cmF0ZWd5IHNob3VsZCB3b3JrOjx1bD4KLQkgKiA8bGk+V2Ugb25seSBmb2xkIGlkZW50aWZpZXJzIHdoZW4KLQkgKiBjb252ZXJ0aW5nIHRoZW0gdG8gbmFtZXM7IGJ1dCBNeVNRTCBpcyBjYXNlLTxlbT5pbjwvZW0+c2Vuc2l0aXZlCi0JICogd2hlbiBpdCBpcyBmb2xkaW5nIGRhdGFiYXNlIGFuZCB0YWJsZSBuYW1lcwotCSAqICg8Y29kZT5sb3dlcl9jYXNlX3RhYmxlX25hbWVzPC9jb2RlPj0xKSwgc28gbG9va3VwcyB3aWxsIHdvcmsKLQkgKiBmaW5lIHdpdGhvdXQgYW55IGZvbGRpbmcgYW55d2F5cy4KLQkgKiA8bGk+V2Ugb25seSB0ZXN0IHdoZXRoZXIgYSBuYW1lIGlzIGFscmVhZHkgZm9sZGVkIHdoZW4gZGV0ZXJtaW5pbmcKLQkgKiB3aGV0aGVyIGl0IG11c3QgYmUgZGVsaW1pdGVkOyBhbmQgTXlTUUwgaWdub3JlcyBkZWxpbWl0ZXJzCi0JICogd2hlbiBpdCBjb21lcyB0byBjYXNlLXNlbnNpdGl2aXR5LCBzbyB3ZSBjYW4gbGVhdmUgYW55IDxlbT5yZWd1bGFyPC9lbT4KLQkgKiBtaXhlZC1jYXNlIG5hbWVzIHVuZGVsaW1pdGVkLiAoTXlTUUwgb25seSByZXF1aXJlcyBkZWxpbWl0ZXJzIGZvcgotCSAqIHNwZWNpYWwgY2hhcmFjdGVycyBhbmQgcmVzZXJ2ZWQgd29yZHMuKQotCSAqIDwvdWw+Ci0JICovCi0JQE92ZXJyaWRlCi0JRm9sZGluZ1N0cmF0ZWd5IGJ1aWxkRm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gTm9uRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCBhZGREZWZhdWx0U2NoZW1hTmFtZXNUbyhBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewotCQluYW1lcy5hZGQodGhpcy5kYXRhYmFzZS5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpZGVudGlmaWVycy9uYW1lcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBNeVNRTCBpcyB0aGUgb25seSB2ZW5kb3IgdGhhdCBhbGxvd3MgYSBkaWdpdC4KLQkgKiBBbHRob3VnaCwgdGhlIG5hbWUgY2Fubm5vdCBiZSA8ZW0+YWxsPC9lbT4gZGlnaXRzCi0JICogKHVubGVzcyBkZWxpbWl0ZWQpLgotCSAqLwotCUBPdmVycmlkZQotCWJvb2xlYW4gY2hhcmFjdGVySXNSZWd1bGFyTmFtZVN0YXJ0KGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzRGlnaXQoYykgfHwgc3VwZXIuY2hhcmFjdGVySXNSZWd1bGFyTmFtZVN0YXJ0KGMpOwotCX0KLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnXycsICckJyB9OwotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGRlbGltaXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5kZWxpbWl0KG5hbWUsIEJBQ0tUSUNLKTsKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0LCBNeVNRTCBkZWxpbWl0cyBpZGVudGlmaWVycyB3aXRoIGJhY2t0aWNrcyAoPGNvZGU+YDwvY29kZT4pOwotCSAqIGJ1dCBpdCBjYW4gYWxzbyBiZSBjb25maWd1cmVkIHRvIHVzZSBkb3VibGUtcXVvdGVzLgotCSAqLwotCUBPdmVycmlkZQotCWJvb2xlYW4gaWRlbnRpZmllcklzRGVsaW1pdGVkKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChpZGVudGlmaWVyLCBCQUNLVElDSykKLQkJCQkJfHwgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUXVvdGVkKGlkZW50aWZpZXIpICYmIHRoaXMuZG91YmxlUXVvdGVJc0lkZW50aWZpZXJEZWxpbWl0ZXIoKSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQkFDS1RJQ0sgPSAnYCc7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBhZmZlY3Qgd2hldGhlciBlbnRpdHkKLQkgKiBnZW5lcmF0aW9uIHdpbGwgZ2VuZXJhdGUgYSBzcGVjaWZpZWQgdGFibGUgb3IgY29sdW1uIGlkZW50aWZpZXIgd2hlbiB0aGUKLQkgKiBkZWZhdWx0IGlkZW50aWZpZXIgaXMgbm90IGEgbWF0Y2guIFdvcnN0IGNhc2U6IEVudGl0eSBnZW5lcmF0aW9uIHdpbGwKLQkgKiBnZW5lcmF0ZSBleHBsaWNpdCBpZGVudGlmaWVycyB1bm5lY2Vzc2FyaWx5IGZvciBjb2x1bW5zIHdoZW4gdGFibGVzIGFyZQotCSAqIGNhc2Utc2Vuc2l0aXZlLiBUaGUgZ2VuZXJhdGVkIGFubm90YXRpb24gd2lsbCBiZSB2YWxpZCBidXQgdGhlIGNvbHVtbgotCSAqIG5hbWUgd2lsbCBiZSByZWR1bmRhbnQuCi0JICovCi0JQE92ZXJyaWRlCi0JYm9vbGVhbiByZWd1bGFyTmFtZXNNYXRjaChTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQlyZXR1cm4gdGhpcy50YWJsZU5hbWVzQXJlQ2FzZVNlbnNpdGl2ZSgpID8KLQkJCQluYW1lMS5lcXVhbHMobmFtZTIpIDoKLQkJCQluYW1lMS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2VsZWN0aW5nIGRhdGFiYXNlIG9iamVjdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogRFRQIHNjaGVtYXRhIGFyZSBNeVNRTCBkYXRhYmFzZXMoPykuIE9mIGNvdXJzZSwgd2Ugb25seSBoYXZlIG9uZSBwZXIKLQkgKiBjb25uZWN0aW9uLi4uLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTY2hlbWEgc2VsZWN0U2NoZW1hRm9ySWRlbnRpZmllcihJdGVyYWJsZTxTY2hlbWE+IHNjaGVtYXRhLCBTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gdGhpcy50YWJsZU5hbWVzQXJlQ2FzZVNlbnNpdGl2ZSgpID8KLQkJCQl0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllclJlc3BlY3RDYXNlKHNjaGVtYXRhLCBpZGVudGlmaWVyKSA6Ci0JCQkJc3VwZXIuc2VsZWN0U2NoZW1hRm9ySWRlbnRpZmllcihzY2hlbWF0YSwgaWRlbnRpZmllcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmxlIHNlbGVjdFRhYmxlRm9ySWRlbnRpZmllcihJdGVyYWJsZTxUYWJsZT4gdGFibGVzLCBTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gdGhpcy50YWJsZU5hbWVzQXJlQ2FzZVNlbnNpdGl2ZSgpID8KLQkJCQl0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllclJlc3BlY3RDYXNlKHRhYmxlcywgaWRlbnRpZmllcikgOgotCQkJCXN1cGVyLnNlbGVjdFRhYmxlRm9ySWRlbnRpZmllcih0YWJsZXMsIGlkZW50aWZpZXIpOwotCX0KLQotCXByaXZhdGUgPFQgZXh0ZW5kcyBEYXRhYmFzZU9iamVjdD4gVCBzZWxlY3REYXRhYmFzZU9iamVjdEZvcklkZW50aWZpZXJSZXNwZWN0Q2FzZShJdGVyYWJsZTxUPiBkYXRhYmFzZU9iamVjdHMsIFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0TmFtZWRSZXNwZWN0Q2FzZShkYXRhYmFzZU9iamVjdHMsIHRoaXMuY29udmVydElkZW50aWZpZXJUb05hbWUoaWRlbnRpZmllcikpOwotCX0KLQotCS8qKgotCSAqIE15U1FMIGRhdGFiYXNlIG9iamVjdCBuYW1lcyBhcmUgdXN1YWxseSBjYXNlLWluc2Vuc2l0aXZlOwotCSAqIHRoZSBleGNlcHRpb24gYmVpbmcgZGF0YWJhc2VzIChzY2hlbWF0YSkgYW5kIHRhYmxlcyB3aGVuIHRoZSBzeXN0ZW0KLQkgKiB2YXJpYWJsZSA8Y29kZT5sb3dlcl9jYXNlX3RhYmxlX25hbWVzPC9jb2RlPiBpcyAwICh0aGUgZGVmYXVsdCBvbgotCSAqIFVOSVgvTGludXgpLiAoRm9yIHNvbWUgb2RkIHJlYXNvbiwgdHJpZ2dlciBuYW1lcyBhcmUgYWxzbwotCSAqIGNhc2Utc2Vuc2l0aXZlLi4uLiBGb3J0dW5hdGVseSwgd2UgZG9uJ3QgY2FyZSB5ZXQuKQotCSAqLwotCUBPdmVycmlkZQotCTxUIGV4dGVuZHMgRGF0YWJhc2VPYmplY3Q+IFQgc2VsZWN0RGF0YWJhc2VPYmplY3ROYW1lZChJdGVyYWJsZTxUPiBkYXRhYmFzZU9iamVjdHMsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0TmFtZWRJZ25vcmVDYXNlKGRhdGFiYXNlT2JqZWN0cywgbmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxvd2VyX2Nhc2VfdGFibGVfbmFtZXMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBib29sZWFuIHRhYmxlTmFtZXNBcmVDYXNlU2Vuc2l0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRMb3dlckNhc2VUYWJsZU5hbWVzKCkgPT0gMDsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRMb3dlckNhc2VUYWJsZU5hbWVzKCkgewotCQlpZiAodGhpcy5sb3dlcl9jYXNlX3RhYmxlX25hbWVzID09IC0xKSB7Ci0JCQl0aGlzLmxvd2VyX2Nhc2VfdGFibGVfbmFtZXMgPSB0aGlzLmJ1aWxkTG93ZXJDYXNlVGFibGVOYW1lcygpOwotCQl9Ci0JCXJldHVybiB0aGlzLmxvd2VyX2Nhc2VfdGFibGVfbmFtZXM7Ci0JfQotCi0JLyoqCi0JICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGxpdmUgY29ubmVjdGlvbiAoaS5lLiB3ZSBhcmUgd29ya2luZyBvZmYtbGluZSksCi0JICogdXNlIHRoZSBjdXJyZW50IE8vUyBkZWZhdWx0IHNldHRpbmcoPykuCi0JICovCi0JcHJpdmF0ZSBpbnQgYnVpbGRMb3dlckNhc2VUYWJsZU5hbWVzKCkgewotCQlpbnQgZGJWYWx1ZSA9IHRoaXMuZ2V0TG93ZXJDYXNlVGFibGVOYW1lc0Zyb21EYXRhYmFzZSgpOwotCQlyZXR1cm4gKGRiVmFsdWUgIT0gLTEpID8gZGJWYWx1ZSA6IHRoaXMuZ2V0TG93ZXJDYXNlVGFibGVOYW1lc0Zyb21PUygpOwotCX0KLQotCS8qKgotCSAqIFNlZSA8YSBocmVmPWh0dHA6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vNS4wL2VuL2lkZW50aWZpZXItY2FzZS1zZW5zaXRpdml0eS5odG1sPgotCSAqIElkZW50aWZpZXIgQ2FzZSBTZW5zaXRpdml0eTwvYT4uCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0TG93ZXJDYXNlVGFibGVOYW1lc0Zyb21EYXRhYmFzZSgpIHsKLQkJaWYgKHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5pc0Rpc2Nvbm5lY3RlZCgpKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJLy8gdGhlIHVuZGVyc2NvcmUgaXMgYSB3aWxkIGNoYXJhY3RlciBvbiBNeVNRTCwgc28gd2UgbmVlZCB0byBlc2NhcGUgaXQKLQkJTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiByb3dzID0gdGhpcy5leGVjdXRlKCJTSE9XIFZBUklBQkxFUyBMSUtFICdsb3dlclxcX2Nhc2VcXF90YWJsZVxcX25hbWVzJyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyb3dzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCU1hcDxTdHJpbmcsIE9iamVjdD4gcm93ID0gcm93cy5nZXQoMCk7Ci0JCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbChyb3cuZ2V0KCJWYXJpYWJsZV9uYW1lIiksICJsb3dlcl9jYXNlX3RhYmxlX25hbWVzIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKChTdHJpbmcpIHJvdy5nZXQoIlZhbHVlIikpLmludFZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogTWFrZSBhIGJlc3QgZ3Vlc3MgYXQgd2hhdCB0aGUgc2V0dGluZyBtaWdodCBiZToKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBjdXJyZW50IE8vUyAodW5mb3J0dW5hdGVseSB0aGlzIGlzIHRoZQotCSAqIGNsaWVudCBPL1MsIG5vdCB0aGUgTXlTUUwgU2VydmVyIE8vUy4uLikuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0TG93ZXJDYXNlVGFibGVOYW1lc0Zyb21PUygpIHsKLQkJaWYgKFRvb2xzLm9zSXNNYWMoKSkgewotCQkJcmV0dXJuIDI7Ci0JCX0KLQkJaWYgKFRvb2xzLm9zSXNXaW5kb3dzKCkpIHsKLQkJCXJldHVybiAxOwotCQl9Ci0JCXJldHVybiAwOyAgLy8gTGludXggZXRjLgotCX0KLQotCi0JLy8gKioqKioqKioqKiBBTlNJX1FVT1RFUyAqKioqKioqKioqCi0KLQlwcml2YXRlIGJvb2xlYW4gZG91YmxlUXVvdGVJc0lkZW50aWZpZXJEZWxpbWl0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldEFOU0lRdW90ZXMoKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gZ2V0QU5TSVF1b3RlcygpIHsKLQkJaWYgKHRoaXMuQU5TSV9RVU9URVMgPT0gbnVsbCkgewotCQkJdGhpcy5BTlNJX1FVT1RFUyA9IHRoaXMuYnVpbGRBTlNJUXVvdGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuQU5TSV9RVU9URVM7Ci0JfQotCi0JLyoqCi0JICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGxpdmUgY29ubmVjdGlvbiAoaS5lLiB3ZSBhcmUgd29ya2luZyBvZmYtbGluZSksCi0JICogcmV0dXJuIDxjb2RlPkZBTFNFPC9jb2RlPiAodGhlIGRlZmF1bHQgc2V0dGluZykuCi0JICovCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkQU5TSVF1b3RlcygpIHsKLQkJQm9vbGVhbiBkYlZhbHVlID0gdGhpcy5nZXRBTlNJUXVvdGVzRnJvbURhdGFiYXNlKCk7Ci0JCXJldHVybiAoZGJWYWx1ZSAhPSBudWxsKSA/IGRiVmFsdWUgOiBCb29sZWFuLkZBTFNFOwotCX0KLQotCS8qKgotCSAqIFNlZSA8YSBocmVmPWh0dHA6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vNS4wL2VuL3NlcnZlci1zcWwtbW9kZS5odG1sI3NxbG1vZGVfYW5zaV9xdW90ZXM+Ci0JICogQU5TSV9RVU9URVM8L2E+LgotCSAqLwotCXByaXZhdGUgQm9vbGVhbiBnZXRBTlNJUXVvdGVzRnJvbURhdGFiYXNlKCkgewotCQlpZiAodGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmlzRGlzY29ubmVjdGVkKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUxpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gcm93cyA9IHRoaXMuZXhlY3V0ZSgiU0VMRUNUIEBAU0VTU0lPTi5zcWxfbW9kZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyb3dzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTWFwPFN0cmluZywgT2JqZWN0PiByb3cgPSByb3dzLmdldCgwKTsKLQkJU3RyaW5nIHNxbF9tb2RlID0gKFN0cmluZykgcm93LmdldCgiQEBTRVNTSU9OLnNxbF9tb2RlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNxbF9tb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZ1tdIG1vZGVzID0gc3FsX21vZGUuc3BsaXQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKEFycmF5VG9vbHMuY29udGFpbnMobW9kZXMsICJBTlNJX1FVT1RFUyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5ICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgRFRQRHJpdmVyQWRhcHRlckZhY3RvcnkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWRU5ET1JTID0gewotCQkJCSJNeVNxbCIgLy8kTk9OLU5MUy0xJAotCQkJfTsKLQkJcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZFZlbmRvcnMoKSB7Ci0JCQlyZXR1cm4gVkVORE9SUzsKLQkJfQotCQlwdWJsaWMgRFRQRHJpdmVyQWRhcHRlciBidWlsZEFkYXB0ZXIoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJCXJldHVybiBuZXcgTXlTUUwoZGF0YWJhc2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvTm9DYXRhbG9nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL05vQ2F0YWxvZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OGJkNTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvTm9DYXRhbG9nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYTsKLQotLyoqCi0gKiBDYXRhbG9nIHN0cmF0ZWd5IGZvciBEVFAgZGF0YWJhc2UgZHJpdmVycyB0aGF0IGRvIG5vdCBoYXZlIGNhdGFsb2dzCi0gKiAoZS5nLiBNeVNRTDsgc2VlIGJ1ZyAyNDkwMTMpLgotICovCi1jbGFzcyBOb0NhdGFsb2dTdHJhdGVneQotCWltcGxlbWVudHMgQ2F0YWxvZ1N0cmF0ZWd5Ci17Ci0JcHJpdmF0ZSBmaW5hbCBEYXRhYmFzZSBkYXRhYmFzZTsKLQotCU5vQ2F0YWxvZ1N0cmF0ZWd5KERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGF0YWJhc2UgPSBkYXRhYmFzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIExpc3Q8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdDxTY2hlbWE+IGdldFNjaGVtYXMoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFiYXNlLmdldFNjaGVtYXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9Ob25Gb2xkaW5nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL05vbkZvbGRpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDUzNjc3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL05vbkZvbGRpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLmRyaXZlcjsKLQotLyoqCi0gKiBEbyBub3QgZm9sZCA8ZW0+cmVndWxhcjwvZW0+IGlkZW50aWZpZXJzLgotICovCi1jbGFzcyBOb25Gb2xkaW5nU3RyYXRlZ3kKLQlpbXBsZW1lbnRzIEZvbGRpbmdTdHJhdGVneQotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZvbGRpbmdTdHJhdGVneSBJTlNUQU5DRSA9IG5ldyBOb25Gb2xkaW5nU3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXN0YXRpYyBGb2xkaW5nU3RyYXRlZ3kgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTm9uRm9sZGluZ1N0cmF0ZWd5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFNpbmNlIGlkZW50aWZpZXJzIGFyZSBub3QgZm9sZGVkIHRvIHVwcGVyLSBvciBsb3dlci1jYXNlLCB0aGUgbmFtZSBpcwotCSAqIGFscmVhZHkgPGVtPmZvbGRlZDwvZW0+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZm9sZChTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gaWRlbnRpZmllcjsKLQl9Ci0KLQkvKioKLQkgKiBTaW5jZSBpZGVudGlmaWVycyBhcmUgbm90IGZvbGRlZCB0byB1cHBlci0gb3IgbG93ZXItY2FzZSwgdGhlIG5hbWUgaXMKLQkgKiBhbHJlYWR5IDxlbT5mb2xkZWQ8L2VtPi4KLQkgKiAoTm9uLWZvbGRpbmcgZGF0YWJhc2VzIGRvIG5vdCByZXF1aXJlIGRlbGltaXRlcnMgYXJvdW5kIG1peGVkLWNhc2UKLQkgKiA8ZW0+cmVndWxhcjwvZW0+IGlkZW50aWZpZXJzLikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBuYW1lSXNGb2xkZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvT3JhY2xlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9PcmFjbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhmYzE0OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9PcmFjbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlOwotCi1jbGFzcyBPcmFjbGUKLQlleHRlbmRzIEFic3RyYWN0RFRQRHJpdmVyQWRhcHRlcgotewotCU9yYWNsZShEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlzdXBlcihkYXRhYmFzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGJ1aWxkQ2F0YWxvZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gbmV3IEZhdXhDYXRhbG9nU3RyYXRlZ3kodGhpcy5kYXRhYmFzZS5nZXREVFBEYXRhYmFzZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlGb2xkaW5nU3RyYXRlZ3kgYnVpbGRGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBVcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVBhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1BBUlRfQ0hBUkFDVEVSUzsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9QQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJyQnLCAnIycgfTsKLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5ICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgRFRQRHJpdmVyQWRhcHRlckZhY3RvcnkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWRU5ET1JTID0gewotCQkJCSJPcmFjbGUiIC8vJE5PTi1OTFMtMSQKLQkJCX07Ci0JCXB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRWZW5kb3JzKCkgewotCQkJcmV0dXJuIFZFTkRPUlM7Ci0JCX0KLQkJcHVibGljIERUUERyaXZlckFkYXB0ZXIgYnVpbGRBZGFwdGVyKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCQlyZXR1cm4gbmV3IE9yYWNsZShkYXRhYmFzZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9Qb3N0Z3JlU1FMLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9Qb3N0Z3JlU1FMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNTk4ZjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvUG9zdGdyZVNRTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLmRyaXZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZTsKLQotY2xhc3MgUG9zdGdyZVNRTAotCWV4dGVuZHMgQWJzdHJhY3REVFBEcml2ZXJBZGFwdGVyCi17Ci0JUG9zdGdyZVNRTChEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlzdXBlcihkYXRhYmFzZSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIFBvc3RncmVTUUwgSkRCQyBkcml2ZXIgcmV0dXJucyBhIHNpbmdsZSBjYXRhbG9nIGZyb20gdGhlIGNhbGwgdG8KLQkgKiB7QGxpbmsgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRDYXRhbG9ncygpfSB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZQotCSAqIGRhdGFiYXNlIGluaXRpYWxseSBzcGVjaWZpZWQgYnkgdGhlIGNvbm5lY3Rpb24gKGluIHRoZSBKREJDIFVSTCkuCi0JICogRFRQIHVzZXMgdGhpcyBjb25maWd1cmF0aW9uIHVubW9kaWZpZWQuIFVuZm9ydHVuYXRlbHksIHRoZSBEVFAKLQkgKiBkYXRhYmFzZSdzIG5hbWUgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBQb3N0Z3JlU1FMIGRhdGFiYXNlJ3MKLQkgKiBuYW1lLgotCSAqLwotCUBPdmVycmlkZQotCUNhdGFsb2dTdHJhdGVneSBidWlsZENhdGFsb2dTdHJhdGVneSgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDYXRhbG9nU3RyYXRlZ3kodGhpcy5kYXRhYmFzZS5nZXREVFBEYXRhYmFzZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlGb2xkaW5nU3RyYXRlZ3kgYnVpbGRGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBMb3dlckNhc2VGb2xkaW5nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgUG9zdGdyZVNRTCBkYXRhYmFzZSBob2xkcyBhIHNpbmdsZSBjYXRhbG9nIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMKLQkgKiB0aGUgZGF0YWJhc2UuCi0JICovCi0JQE92ZXJyaWRlCi0Jdm9pZCBhZGREZWZhdWx0Q2F0YWxvZ05hbWVzVG8oQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMpIHsKLQkJbmFtZXMuYWRkKHRoaXMuYnVpbGREZWZhdWx0Q2F0YWxvZ05hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREZWZhdWx0Q2F0YWxvZ05hbWUoKSB7Ci0JCXJldHVybiAoKENhdGFsb2cpIHRoaXMuZGF0YWJhc2UuZ2V0RFRQRGF0YWJhc2UoKS5nZXRDYXRhbG9ncygpLmdldCgwKSkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFBvc3RncmVTUUwgaGFzIGEgInNjaGVtYSBzZWFyY2ggcGF0aCIuIFRoZSBkZWZhdWx0IGlzOjxicj48Y29kZT4KLQkgKiAgICAgIiR1c2VyIixwdWJsaWMKLQkgKiA8L2NvZGU+PGJyPgotCSAqIElmIHRoZSA8Y29kZT4iJHVzZXIiPC9jb2RlPiBzY2hlbWEgaXMgbm90IGZvdW5kLCB1c2UgdGhlCi0JICogPGNvZGU+InB1YmxpYyI8L2NvZGU+IHNjaGVtYS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQl2b2lkIGFkZERlZmF1bHRTY2hlbWFOYW1lc1RvKEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCXN1cGVyLmFkZERlZmF1bHRTY2hlbWFOYW1lc1RvKG5hbWVzKTsKLQkJbmFtZXMuYWRkKFBVQkxJQ19TQ0hFTUFfTkFNRSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNfU0NIRU1BX05BTUUgPSAicHVibGljIjsgIC8vJE5PTi1OTFMtMSQKLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnXycgfTsKLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lUGFydENoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBFWFRFTkRFRF9SRUdVTEFSX05BTUVfUEFSVF9DSEFSQUNURVJTOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfUkVHVUxBUl9OQU1FX1BBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnJCcgfTsKLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5ICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgRFRQRHJpdmVyQWRhcHRlckZhY3RvcnkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWRU5ET1JTID0gewotCQkJCSJwb3N0Z3JlcyIgLy8kTk9OLU5MUy0xJAotCQkJfTsKLQkJcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZFZlbmRvcnMoKSB7Ci0JCQlyZXR1cm4gVkVORE9SUzsKLQkJfQotCQlwdWJsaWMgRFRQRHJpdmVyQWRhcHRlciBidWlsZEFkYXB0ZXIoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJCXJldHVybiBuZXcgUG9zdGdyZVNRTChkYXRhYmFzZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9TUUxTZXJ2ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL1NRTFNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWFlZmIwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL1NRTFNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlOwotCi0vKioKLSAqIE1pY3Jvc29mdCBTUUwgU2VydmVyCi0gKi8KLWNsYXNzIFNRTFNlcnZlcgotCWV4dGVuZHMgQWJzdHJhY3REVFBEcml2ZXJBZGFwdGVyCi17Ci0JU1FMU2VydmVyKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXN1cGVyKGRhdGFiYXNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlDYXRhbG9nU3RyYXRlZ3kgYnVpbGRDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ2F0YWxvZ1N0cmF0ZWd5KHRoaXMuZGF0YWJhc2UuZ2V0RFRQRGF0YWJhc2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRm9sZGluZ1N0cmF0ZWd5IGJ1aWxkRm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gTm9uRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgU1FMIFNlcnZlciBpZGVudGlmaWVycyBhcmUgY2FzZS1zZW5zaXRpdmUsIGV2ZW4gd2l0aG91dAotCSAqIGRlbGltaXRlcnMuIFRoaXMgY2FuIGRlcGVuZCBvbiB0aGUgY29sbGF0aW9uIHNldHRpbmcuLi4uCi0JICovCi0JLy9UT0RPIHF1ZXJ5IGRhdGFiYXNlIGZvciBjb2xsYXRpb24gc2V0dGluZwotCUBPdmVycmlkZQotCWJvb2xlYW4gcmVndWxhck5hbWVzTWF0Y2goU3RyaW5nIG5hbWUxLCBTdHJpbmcgbmFtZTIpIHsKLQkJcmV0dXJuIG5hbWUxLmVxdWFscyhuYW1lMik7Ci0JfQotCi0JLyoqCi0JICogU1FMIFNlcnZlciB3aWxsIHVzZSB0aGUgdXNlci1yZXF1ZXN0ZWQgZGF0YWJhc2U7IGlmIHRoYXQgZGF0YWJhc2UgaXMgbm90Ci0JICogZm91bmQsIGl0IHdpbGwgZGVmYXVsdCB0byA8Y29kZT5tYXN0ZXI8L2NvZGU+LgotCSAqLwotCUBPdmVycmlkZQotCXZvaWQgYWRkRGVmYXVsdENhdGFsb2dOYW1lc1RvKEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCW5hbWVzLmFkZCh0aGlzLmRhdGFiYXNlLmdldE5hbWUoKSk7Ci0JCW5hbWVzLmFkZChNQVNURVJfQ0FUQUxPR19JREVOVElGSUVSKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BU1RFUl9DQVRBTE9HX0lERU5USUZJRVIgPSAibWFzdGVyIjsgIC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHNjaGVtYSBvbiBTUUwgU2VydmVyIGZvciBhbnkgZGF0YWJhc2UgKGNhdGFsb2cpIGlzCi0JICogPGNvZGU+ZGJvPC9jb2RlPi4KLQkgKi8KLQlAT3ZlcnJpZGUKLQl2b2lkIGFkZERlZmF1bHRTY2hlbWFOYW1lc1RvKEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCW5hbWVzLmFkZChERUZBVUxUX1NDSEVNQV9OQU1FKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0NIRU1BX05BTUUgPSAiZGJvIjsgIC8vJE5PTi1OTFMtMSQKLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnXycsICdAJywgJyMnIH07Ci0KLQlAT3ZlcnJpZGUKLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVBhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1BBUlRfQ0hBUkFDVEVSUzsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9QQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJyQnIH07Ci0KLQkvL1RPRE8gcXVlcnkgZGF0YWJhc2UgZm9yIGRlbGltaXRlciBzZXR0aW5nCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGRlbGltaXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAnWycgKyBuYW1lICsgJ10nOwotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIFNRTCBTZXJ2ZXIgZGVsaW1pdHMgaWRlbnRpZmllcnMgd2l0aCBicmFja2V0cwotCSAqICg8Y29kZT5bXTwvY29kZT4pOyBidXQgaXQKLQkgKiBjYW4gYWxzbyBiZSBjb25maWd1cmVkIHRvIHVzZSBkb3VibGUtcXVvdGVzLgotCSAqLwotCS8vVE9ETyBxdWVyeSBkYXRhYmFzZSBmb3IgZGVsaW1pdGVyIHNldHRpbmcKLQlAT3ZlcnJpZGUKLQlib29sZWFuIGlkZW50aWZpZXJJc0RlbGltaXRlZChTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFja2V0ZWQoaWRlbnRpZmllcikKLQkJCQkJfHwgc3VwZXIuaWRlbnRpZmllcklzRGVsaW1pdGVkKGlkZW50aWZpZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5ICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgRFRQRHJpdmVyQWRhcHRlckZhY3RvcnkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWRU5ET1JTID0gewotCQkJCSJTUUwgU2VydmVyIiAvLyROT04tTkxTLTEkCi0JCQl9OwotCQlwdWJsaWMgU3RyaW5nW10gZ2V0U3VwcG9ydGVkVmVuZG9ycygpIHsKLQkJCXJldHVybiBWRU5ET1JTOwotCQl9Ci0JCXB1YmxpYyBEVFBEcml2ZXJBZGFwdGVyIGJ1aWxkQWRhcHRlcihEYXRhYmFzZSBkYXRhYmFzZSkgewotCQkJcmV0dXJuIG5ldyBTUUxTZXJ2ZXIoZGF0YWJhc2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvU2ltcGxlQ2F0YWxvZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9TaW1wbGVDYXRhbG9nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ0MmQwNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9TaW1wbGVDYXRhbG9nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE7Ci0KLS8qKgotICogQ2F0YWxvZyBzdHJhdGVneSBmb3IgRFRQIGRhdGFiYXNlIGRyaXZlcnMgdGhhdCBzaW1wbHkgbW9kZWwgdGhlIGNhdGFsb2dzCi0gKiByZXR1cm5lZCBieSB0aGUgdW5kZXJseWluZyBKREJDIGRyaXZlciAoZS5nLiBTeWJhc2UpLgotICogCi0gKiBAc2VlIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0Q2F0YWxvZ3MoKQotICovCi1jbGFzcyBTaW1wbGVDYXRhbG9nU3RyYXRlZ3kKLQlpbXBsZW1lbnRzIENhdGFsb2dTdHJhdGVneQotewotCXByaXZhdGUgZmluYWwgRGF0YWJhc2UgZGF0YWJhc2U7Ci0KLQlTaW1wbGVDYXRhbG9nU3RyYXRlZ3koRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kYXRhYmFzZSA9IGRhdGFiYXNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0PENhdGFsb2c+IGdldENhdGFsb2dzKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXRDYXRhbG9ncygpOwotCX0KLQotCXB1YmxpYyBMaXN0PFNjaGVtYT4gZ2V0U2NoZW1hcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL1N5YmFzZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvU3liYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NDdhMGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvU3liYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLmRyaXZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2U7Ci0KLWNsYXNzIFN5YmFzZQotCWV4dGVuZHMgQWJzdHJhY3REVFBEcml2ZXJBZGFwdGVyCi17Ci0JU3liYXNlKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXN1cGVyKGRhdGFiYXNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlDYXRhbG9nU3RyYXRlZ3kgYnVpbGRDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ2F0YWxvZ1N0cmF0ZWd5KHRoaXMuZGF0YWJhc2UuZ2V0RFRQRGF0YWJhc2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRm9sZGluZ1N0cmF0ZWd5IGJ1aWxkRm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gTm9uRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgU3liYXNlIGlkZW50aWZpZXJzIGFyZSBjYXNlLXNlbnNpdGl2ZSwgZXZlbiB3aXRob3V0Ci0JICogZGVsaW1pdGVycy4gVGhpcyBjYW4gZGVwZW5kIG9uIHRoZSBjb2xsYXRpb24gc2V0dGluZy4uLi4KLQkgKi8KLQkvL1RPRE8gcXVlcnkgZGF0YWJhc2UgZm9yIGNvbGxhdGlvbiBzZXR0aW5nCi0JQE92ZXJyaWRlCi0JYm9vbGVhbiByZWd1bGFyTmFtZXNNYXRjaChTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQlyZXR1cm4gbmFtZTEuZXF1YWxzKG5hbWUyKTsKLQl9Ci0KLQkvKioKLQkgKiBTeWJhc2Ugd2lsbCB1c2UgdGhlIHVzZXItcmVxdWVzdGVkIGRhdGFiYXNlOyBpZiB0aGF0IGRhdGFiYXNlIGlzIG5vdAotCSAqIGZvdW5kLCBpdCB3aWxsIGRlZmF1bHQgdG8gPGNvZGU+bWFzdGVyPC9jb2RlPi4KLQkgKi8KLQlAT3ZlcnJpZGUKLQl2b2lkIGFkZERlZmF1bHRDYXRhbG9nTmFtZXNUbyhBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewotCQluYW1lcy5hZGQodGhpcy5kYXRhYmFzZS5nZXROYW1lKCkpOwotCQluYW1lcy5hZGQoTUFTVEVSX0NBVEFMT0dfTkFNRSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVNURVJfQ0FUQUxPR19OQU1FID0gIm1hc3RlciI7ICAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgdHlwaWNhbCBkZWZhdWx0IHNjaGVtYSBvbiBTeWJhc2UgZm9yIGFueSBkYXRhYmFzZSAoY2F0YWxvZykgaXMKLQkgKiA8Y29kZT5kYm88L2NvZGU+LgotCSAqIDxicj4KLQkgKiBBY3R1YWxseSwgdGhlIGRlZmF1bHQgc2NoZW1hIGlzIG1vcmUgbGlrZSBhIHNlYXJjaCBwYXRoOgotCSAqIFRoZSBzZXJ2ZXIgbG9va3MgZm9yIGEgc2NoZW1hIG9iamVjdCAoZS5nLiBhIHRhYmxlKSBmaXJzdCBpbiB0aGUgdXNlcidzCi0JICogc2NoZW1hLCB0aGVuIGl0IGxvb2tzIGZvciB0aGUgc2NoZW1hIG9iamVjdCBpbiB0aGUgZGF0YWJhc2Ugb3duZXIncwotCSAqIHNjaGVtYSAoPGNvZGU+ZGJvPC9jb2RlPikuIEFzIGEgcmVzdWx0LCBpdCdzIHJlYWxseSBub3QgcG9zc2libGUgdG8gc3BlY2lmeQotCSAqIHRoZSAiZGVmYXVsdCIgc2NoZW1hIHdpdGhvdXQga25vd2luZyB0aGUgc2NoZW1hIG9iamVjdCB3ZSBhcmUKLQkgKiBsb29raW5nIGZvci4KLQkgKiA8YnI+Ci0JICogKE5vdGU6IHRoZSBjdXJyZW50ICd1c2VyJyBpcyBub3QgdGhlIHNhbWUgdGhpbmcgYXMgdGhlIGN1cnJlbnQKLQkgKiAnbG9naW4nIC0gc2VlIHNwX2FkZHVzZXIgYW5kIHNwX2FkZGxvZ2luOyBzbyB3ZSBwcm9iYWJseSBjYW4ndAotCSAqIHVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZSNnZXRVc2VyTmFtZSgpfS4pCi0JICovCi0JQE92ZXJyaWRlCi0Jdm9pZCBhZGREZWZhdWx0U2NoZW1hTmFtZXNUbyhBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewotCQluYW1lcy5hZGQoREVGQVVMVF9TQ0hFTUFfTkFNRSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NDSEVNQV9OQU1FID0gImRibyI7ICAvLyROT04tTkxTLTEkCi0KLQlAT3ZlcnJpZGUKLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVN0YXJ0Q2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9TVEFSVF9DSEFSQUNURVJTOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJ18nLCAnQCcgfTsKLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lUGFydENoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBFWFRFTkRFRF9SRUdVTEFSX05BTUVfUEFSVF9DSEFSQUNURVJTOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfUkVHVUxBUl9OQU1FX1BBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnJCcsICelJywgJ6MnLCAnIycgfTsKLQotCS8vVE9ETyBxdWVyeSBkYXRhYmFzZSBmb3IgZGVsaW1pdGVyIHNldHRpbmcKLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZGVsaW1pdE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuICdbJyArIG5hbWUgKyAnXSc7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgU3liYXNlIGRlbGltaXRzIGlkZW50aWZpZXJzIHdpdGggYnJhY2tldHMKLQkgKiAoPGNvZGU+W108L2NvZGU+KTsgYnV0IGl0Ci0JICogY2FuIGFsc28gYmUgY29uZmlndXJlZCB0byB1c2UgZG91YmxlLXF1b3Rlcy4KLQkgKi8KLQkvL1RPRE8gcXVlcnkgZGF0YWJhc2UgZm9yIGRlbGltaXRlciBzZXR0aW5nCi0JQE92ZXJyaWRlCi0JYm9vbGVhbiBpZGVudGlmaWVySXNEZWxpbWl0ZWQoU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2tldGVkKGlkZW50aWZpZXIpCi0JCQkJCXx8IHN1cGVyLmlkZW50aWZpZXJJc0RlbGltaXRlZChpZGVudGlmaWVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSAqKioqKioqKioqCi0KLQlzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkVORE9SUyA9IHsKLQkJCQkiU3liYXNlX0FTQSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiU3liYXNlX0FTRSIgLy8kTk9OLU5MUy0xJAotCQkJfTsKLQkJcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZFZlbmRvcnMoKSB7Ci0JCQlyZXR1cm4gVkVORE9SUzsKLQkJfQotCQlwdWJsaWMgRFRQRHJpdmVyQWRhcHRlciBidWlsZEFkYXB0ZXIoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJCXJldHVybiBuZXcgU3liYXNlKGRhdGFiYXNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL1Vua25vd24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL1Vua25vd24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQxNzI1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9Vbmtub3duLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwuZHJpdmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZTsKLQotY2xhc3MgVW5rbm93bgotCWV4dGVuZHMgQWJzdHJhY3REVFBEcml2ZXJBZGFwdGVyCi17Ci0JVW5rbm93bihEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlzdXBlcihkYXRhYmFzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGJ1aWxkQ2F0YWxvZ1N0cmF0ZWd5KCkgewotCQkvLyBpbmZlciBmcm9tIGV4aXN0aW5nIGNhdGFsb2dzIGFuZCBzY2hlbWFzCi0JCXJldHVybiBuZXcgVW5rbm93bkNhdGFsb2dTdHJhdGVneSh0aGlzLmRhdGFiYXNlLmdldERUUERhdGFiYXNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCUZvbGRpbmdTdHJhdGVneSBidWlsZEZvbGRpbmdTdHJhdGVneSgpIHsKLQkJLy8gU1FMIHN0YW5kYXJkCi0JCXJldHVybiBVcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSAqKioqKioqKioqCi0KLQlzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5IHsKLQkJcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZFZlbmRvcnMoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlwdWJsaWMgRFRQRHJpdmVyQWRhcHRlciBidWlsZEFkYXB0ZXIoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJCXJldHVybiBuZXcgVW5rbm93bihkYXRhYmFzZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9Vbmtub3duQ2F0YWxvZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9Vbmtub3duQ2F0YWxvZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNzcyMmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvVW5rbm93bkNhdGFsb2dTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLmRyaXZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hOwotCi0vKioKLSAqIENhdGFsb2cgc3RyYXRlZ3kgZm9yIHVua25vd24gRFRQIGRhdGFiYXNlIGRyaXZlcnMuCi0gKiBJbmZlciB0aGUgc3RyYXRlZ3kgZnJvbSB0aGUgcmV0dXJuZWQgY2F0YWxvZ3MgYW5kIHNjaGVtYXMuCi0gKiAKLSAqIEBzZWUgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRDYXRhbG9ncygpCi0gKi8KLWNsYXNzIFVua25vd25DYXRhbG9nU3RyYXRlZ3kKLQlpbXBsZW1lbnRzIENhdGFsb2dTdHJhdGVneQotewotCXByaXZhdGUgZmluYWwgRGF0YWJhc2UgZGF0YWJhc2U7Ci0KLQlVbmtub3duQ2F0YWxvZ1N0cmF0ZWd5KERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGF0YWJhc2UgPSBkYXRhYmFzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRhdGFiYXNlIHJldHVybnMgYSBsaXN0IG9mIGNhdGFsb2dzIGFuZAotCSAqIHRoYXQgbGlzdCBkb2VzIG5vdCBjb250YWluIG9ubHkgYSAiZmF1eCIgY2F0YWxvZy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gISB0aGlzLmdldENhdGFsb2dzKCkuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBMaXN0PENhdGFsb2c+IGdldENhdGFsb2dzKCkgewotCQlMaXN0PENhdGFsb2c+IGNhdGFsb2dzID0gdGhpcy5nZXRDYXRhbG9nc18oKTsKLQkJLy8gaWYgdGhlcmUgYXJlIG5vIGNhdGFsb2dzLCB0aGUgZGF0YWJhc2UgbXVzdCBob2xkIHRoZSBzY2hlbWF0YSBkaXJlY3RseQotCQlpZiAoKGNhdGFsb2dzID09IG51bGwpIHx8IGNhdGFsb2dzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0KLQkJQ2F0YWxvZyBmYXV4Q2F0YWxvZyA9IHRoaXMuc2VsZWN0RmF1eENhdGFsb2coY2F0YWxvZ3MpOwotCQkvLyBpZiB3ZSBkb24ndCBoYXZlIGEgImZhdXgiIGNhdGFsb2csIHdlIG11c3QgaGF2ZSAicmVhbCIgY2F0YWxvZ3MKLQkJcmV0dXJuIChmYXV4Q2F0YWxvZyA9PSBudWxsKSA/IGNhdGFsb2dzIDogQ29sbGVjdGlvbnMuPENhdGFsb2c+ZW1wdHlMaXN0KCk7Ci0JfQotCi0JcHVibGljIExpc3Q8U2NoZW1hPiBnZXRTY2hlbWFzKCkgewotCQlMaXN0PENhdGFsb2c+IGNhdGFsb2dzID0gdGhpcy5nZXRDYXRhbG9nc18oKTsKLQkJLy8gaWYgdGhlcmUgYXJlIG5vIGNhdGFsb2dzLCB0aGUgZGF0YWJhc2UgbXVzdCBob2xkIHRoZSBzY2hlbWF0YSBkaXJlY3RseQotCQlpZiAoKGNhdGFsb2dzID09IG51bGwpIHx8IGNhdGFsb2dzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuZ2V0U2NoZW1hc18oKTsKLQkJfQotCi0JCUNhdGFsb2cgZmF1eENhdGFsb2cgPSB0aGlzLnNlbGVjdEZhdXhDYXRhbG9nKGNhdGFsb2dzKTsKLQkJcmV0dXJuIChmYXV4Q2F0YWxvZyAhPSBudWxsKSA/IHRoaXMuZ2V0U2NoZW1hcyhmYXV4Q2F0YWxvZykgOiBDb2xsZWN0aW9ucy48U2NoZW1hPmVtcHR5TGlzdCgpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8U2NoZW1hPiBnZXRTY2hlbWFzKENhdGFsb2cgY2F0YWxvZykgewotCQlyZXR1cm4gY2F0YWxvZy5nZXRTY2hlbWFzKCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHNwZWNpZmllZCBsaXN0IG9mIGNhdGFsb2dzIGNvbnRhaW5zIGEgImZhdXgiIGNhdGFsb2cgKGkuZS4gYQotCSAqIHNpbmdsZSBjYXRhbG9nIHdpdGggYW4gZW1wdHkgc3RyaW5nIGZvciBhIG5hbWUpLCByZXR1cm4gaXQ7IG90aGVyd2lzZQotCSAqIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIENhdGFsb2cgc2VsZWN0RmF1eENhdGFsb2coTGlzdDxDYXRhbG9nPiBjYXRhbG9ncykgewotCQlpZiAoY2F0YWxvZ3Muc2l6ZSgpID09IDEpIHsKLQkJCUNhdGFsb2cgY2F0YWxvZyA9IGNhdGFsb2dzLmdldCgwKTsKLQkJCWlmIChjYXRhbG9nLmdldE5hbWUoKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gY2F0YWxvZzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3NfKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXRDYXRhbG9ncygpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxTY2hlbWE+IGdldFNjaGVtYXNfKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXRTY2hlbWFzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9VcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhZmVjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9VcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogRm9sZCA8ZW0+cmVndWxhcjwvZW0+IGlkZW50aWZpZXJzIHRvIHVwcGVyIGNhc2UuCi0gKi8KLWNsYXNzIFVwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneQotCWltcGxlbWVudHMgRm9sZGluZ1N0cmF0ZWd5Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9sZGluZ1N0cmF0ZWd5IElOU1RBTkNFID0gbmV3IFVwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIEZvbGRpbmdTdHJhdGVneSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBVcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBmb2xkKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiBpZGVudGlmaWVyLnRvVXBwZXJDYXNlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbmFtZUlzRm9sZGVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc1VwcGVyY2FzZShuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkMDdiMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZWMyOWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjEwOjA5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTczYWNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDMuMi4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjA2YjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5pbmkgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4OGI5ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAidGlwc0FuZFRyaWNrc0hyZWYiIGNvbnRhaW5zIHRoZSBIZWxwIHRvcGljIGhyZWYgdG8gYSB0aXBzIGFuZCB0cmlja3MgcGFnZSAKLSMgb3B0aW9uYWwKLXRpcHNBbmRUcmlja3NIcmVmPS9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bQotCi0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmRkMjhkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgSlBBIFN1cHBvcnRcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IE9yYWNsZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA2LCAyMDExLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwODliYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgY29tcG9uZW50LnhtbApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9jb21wb25lbnQueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWIxNDZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmciPgotPGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPgotPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmciIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwOWMyYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwMTczNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgSlBBIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5jbGFzc3BhdGggYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLmN2c2lnbm9yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODRhYTY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YTIwYzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVHVlIE1hciAwOCAxMjowOTowNyBFU1QgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWFmMTExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIgotSW1wb3J0LVBhY2thZ2U6IGphdmF4LnBlcnNpc3RlbmNlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9hYm91dC5odG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzFmNTg2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgyPkFib3V0IFRoaXMgQ29udGVudDwvSDI+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgCi0gIG91dCBiZWxvdy4gSWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCAKLSAgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIAotICB0byB0aGUgUmVkaXN0cmlidXRvciYjODIxNztzIGxpY2Vuc2UgZm9yIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLTxoND48YSBuYW1lPSJKUEEiIGlkPSJKUEEiPjwvYT5KYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSB2MS4wPC9oND4KLQotPGJsb2NrcXVvdGU+Ci0gIDxwPlRoZSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSB3aGljaCBpcyBkaXN0cmlidXRlZCB1bmRlciA8YSBocmVmPSJodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWwiPkNEREwgCi0gICAgdjEuMDwvYT4gaXMgcmVxdWlyZWQgYnkgdGhlIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBQcm9qZWN0IGluIG9yZGVyIAotICAgIHRvIHN1cHBvcnQgdGhpcyBzdGFuZGFyZC48L3A+Ci08L2Jsb2NrcXVvdGU+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YTI1NzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZjg0ODAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSnBhIEVjbGlwc2VMaW5rIFN1cHBvcnQgLSBEREwgR2VuZXJhdGlvbgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9kZGxnZW4vTWFpbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2RkbGdlbi9NYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNGU1YWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2RkbGdlbi9NYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb25maWcuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5keW5hbWljLkR5bmFtaWNDbGFzc0xvYWRlcjsKLQotLyoqIAotICogVGhpcyBjbGFzcyBjcmVhdGVzIGEgRWNsaXBzZUxpbmsgPGNvZGU+RW50aXR5TWFuYWdlckZhY3Rvcnk8L2NvZGU+LCAKLSAqIGFuZCBleGVjdXRlcyB0aGUgRERMIGdlbmVyYXRvciB3aXRoIHRoZSBjb21tYW5kIHNldCBpbiB0aGUgcHJvcGVydGllczogCi0gKiAgICAgPGNvZGU+ZWNsaXBzZWxpbmsuZGRsLWdlbmVyYXRpb24ub3V0cHV0LW1vZGU8L2NvZGU+IAotICogICAgIDxjb2RlPmVjbGlwc2VsaW5rLmFwcGxpY2F0aW9uLWxvY2F0aW9uPC9jb2RlPgotICogCi0gKiBDdXJyZW50IGNvbW1hbmQtbGluZSBhcmd1bWVudHM6Ci0gKiAgICAgWy1wdSBwdU5hbWVdIC0gcGVyc2lzdGVuY2UgdW5pdCBuYW1lCi0gKiAgICAgWy1wIHByb3BlcnRpZXNGaWxlUGF0aF0gLSBwcm9wZXJ0aWVzIGZvciBFY2xpcHNlTGluayBFbnRpdHlNYW5hZ2VyCi0gKiAgICAgWy1kZWJ1Z10gLSBkZWJ1ZyBtb2RlCi0gKiAgICAgWy1keW5hbWljXSAtIHVzZSB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZHluYW1pYy5EeW5hbWljQ2xhc3NMb2FkZXIKLSAqICAKLSAqICBFeGFtcGxlIG9mIGEgcHJvcGVydGllcyBmaWxlOgotICogIAllY2xpcHNlbGluay5qZGJjLmJpbmQtcGFyYW1ldGVycz1mYWxzZQotICogIAllY2xpcHNlbGluay5qZGJjLmRyaXZlcj1vcmcuYXBhY2hlLmRlcmJ5LmpkYmMuRW1iZWRkZWREcml2ZXIKLSAqICAJZWNsaXBzZWxpbmsuamRiYy51cmw9amRiY1w6ZGVyYnlcOmNcOi9kZXJieWRiL3Rlc3RkYjtjcmVhdGVcPXRydWUKLSAqICAJZWNsaXBzZWxpbmsuamRiYy51c2VyPXRyYW4KLSAqICAJZWNsaXBzZWxpbmsuamRiYy5wYXNzd29yZD0KLSAqICAJZWNsaXBzZWxpbmsubG9nZ2luZy5sZXZlbD1GSU5FU1QKLSAqICAJZWNsaXBzZWxpbmsubG9nZ2luZy50aW1lc3RhbXA9ZmFsc2UKLSAqICAJZWNsaXBzZWxpbmsubG9nZ2luZy50aHJlYWQ9ZmFsc2UKLSAqICAJZWNsaXBzZWxpbmsubG9nZ2luZy5zZXNzaW9uPWZhbHNlCi0gKiAgCWVjbGlwc2VsaW5rLmxvZ2dpbmcuZXhjZXB0aW9ucz10cnVlCi0gKiAgCWVjbGlwc2VsaW5rLm9ybS50aHJvdy5leGNlcHRpb25zPXRydWUKLSAqICAJZWNsaXBzZWxpbmsuZGRsLWdlbmVyYXRpb24ub3V0cHV0LW1vZGU9ZGF0YWJhc2UKLSAqICAJZWNsaXBzZWxpbmsuZGRsLWdlbmVyYXRpb249ZHJvcC1hbmQtY3JlYXRlLXRhYmxlcwotICogIAllY2xpcHNlbGluay5hcHBsaWNhdGlvbi1sb2NhdGlvbj1jXDovX1Byb2plY3RzXy9FeGFtcGxlRERMCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWluCi17Ci0JcHJvdGVjdGVkIEVudGl0eU1hbmFnZXJGYWN0b3J5IGVtZjsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gZWNsaXBzZUxpbmtQcm9wZXJ0aWVzOwotCXByaXZhdGUgU3RyaW5nIGVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGg7Ci0JcHJpdmF0ZSBib29sZWFuIGlzRGVidWdNb2RlOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCW5ldyBNYWluKCkuZXhlY3V0ZShhcmdzKTsKLQl9Ci0KLQlwcml2YXRlIE1haW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShTdHJpbmdbXSBhcmdzKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZVdpdGgoYXJncyk7Ci0JCQotCQl0aGlzLmVtZiA9IFBlcnNpc3RlbmNlLmNyZWF0ZUVudGl0eU1hbmFnZXJGYWN0b3J5KHRoaXMuZ2V0UFVOYW1lKGFyZ3MpLCB0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllcyk7Ci0JCXRoaXMucGVyZm9ybSgpOwotCQl0aGlzLmNsb3NlRW50aXR5TWFuYWdlckZhY3RvcnkoKTsKLQkJCi0JCXRoaXMuZGlzcG9zZSgpOwotCQlyZXR1cm47Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm0oKSB7Ci0JCS8vIGNyZWF0ZSBhbiBFTSB0byBnZW5lcmF0ZSBzY2hlbWEuCi0JCXRoaXMuZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKS5jbG9zZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjbG9zZUVudGl0eU1hbmFnZXJGYWN0b3J5KCkgewotCQl0aGlzLmVtZi5jbG9zZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVdpdGgoU3RyaW5nW10gYXJncykgewotCQl0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGggPSB0aGlzLmdldEVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgoYXJncyk7Ci0JCXRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKHRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCk7Ci0JCXRoaXMuc2V0RHluYW1pY0NsYXNzTG9hZGVyUHJvcGVydHkoYXJncyk7Ci0KLQkJdGhpcy5pc0RlYnVnTW9kZSA9IHRoaXMuZ2V0RGVidWdNb2RlKGFyZ3MpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREeW5hbWljQ2xhc3NMb2FkZXJQcm9wZXJ0eShTdHJpbmdbXSBhcmdzKSB7Ci0JCWlmICh0aGlzLmdldEVjbGlwc2VMaW5rRHluYW1pYyhhcmdzKSkgewotCQkJdGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXMucHV0KFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuQ0xBU1NMT0FERVIsIHRoaXMuYnVpbGREeW5hbWljQ2xhc3NMb2FkZXIoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENsYXNzTG9hZGVyIGJ1aWxkRHluYW1pY0NsYXNzTG9hZGVyKCkgewotCQlyZXR1cm4gbmV3IER5bmFtaWNDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoICEgdGhpcy5pc0RlYnVnTW9kZSkgewotCQkJbmV3IEZpbGUodGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKS5kZWxldGUoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0UHJvcGVydGllcyhTdHJpbmcgZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCkgewotCQlTZXQ8RW50cnk8T2JqZWN0LCBPYmplY3Q+PiBwcm9wZXJ0aWVzU2V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXByb3BlcnRpZXNTZXQgPSB0aGlzLmxvYWRFY2xpcHNlTGlua1Byb3BlcnRpZXMoZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJNaXNzaW5nOiAiICsgZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCWZvcihFbnRyeTxPYmplY3QsIE9iamVjdD4gcHJvcGVydHkgOiBwcm9wZXJ0aWVzU2V0KSB7Ci0JCQlwcm9wZXJ0aWVzLnB1dCgoU3RyaW5nKSBwcm9wZXJ0eS5nZXRLZXkoKSwgcHJvcGVydHkuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0gICAgcHJpdmF0ZSBTZXQ8RW50cnk8T2JqZWN0LCBPYmplY3Q+PiBsb2FkRWNsaXBzZUxpbmtQcm9wZXJ0aWVzKFN0cmluZyBlY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShlY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKTsKLSAgICAgICAgCi0gICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHByb3BlcnRpZXMubG9hZChzdHJlYW0pOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuZW50cnlTZXQoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGFyZ3VtZW50IHF1ZXJpZXMgKioqKioqKioqKgotICAgIAotCXByaXZhdGUgU3RyaW5nIGdldFBVTmFtZShTdHJpbmdbXSBhcmdzKSB7Ci0JCXJldHVybiB0aGlzLmdldEFyZ3VtZW50VmFsdWUoIi1wdSIsIGFyZ3MpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgoU3RyaW5nW10gYXJncykgewotCQlyZXR1cm4gdGhpcy5nZXRBcmd1bWVudFZhbHVlKCItcCIsIGFyZ3MpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGdldERlYnVnTW9kZShTdHJpbmdbXSBhcmdzKSB7Ci0JCXJldHVybiB0aGlzLmFyZ3VtZW50RXhpc3RzKCItZGVidWciLCBhcmdzKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZ2V0RWNsaXBzZUxpbmtEeW5hbWljKFN0cmluZ1tdIGFyZ3MpIHsKLQkJcmV0dXJuIHRoaXMuYXJndW1lbnRFeGlzdHMoIi1keW5hbWljIiwgYXJncyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXJndW1lbnRWYWx1ZShTdHJpbmcgYXJndW1lbnQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgYXJnID0gYXJnc1tpXTsKLQkJCWlmIChhcmcudG9Mb3dlckNhc2UoKS5lcXVhbHMoYXJndW1lbnQpKSB7Ci0JCQkJaW50IGogPSBpICsgMTsKLQkJCQlpZiAoaiA8IGFyZ3MubGVuZ3RoKSB7Ci0JCQkJCXJldHVybiBhcmdzW2pdOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFyZ3VtZW50RXhpc3RzKFN0cmluZyBhcmd1bWVudCwgU3RyaW5nW10gYXJncykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhcmcgPSBhcmdzW2ldOwotCQkJaWYgKGFyZy50b0xvd2VyQ2FzZSgpLmVxdWFscyhhcmd1bWVudCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLy5jbGFzc3BhdGggYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhMGQzOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0ibm9uYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJub25hY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJub25hY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9Im5vbmFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDBjMmIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIyMjkyMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDk6MDEgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOTUzMGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4xMDAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4wLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjEwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjQwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS40LjEwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDIuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmJ1aWxkZXIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0sCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuZGRsZ2VuO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmxpYnZhbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLndlYXZlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmpwcWwuc3BpLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5wbGF0Zm9ybSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTRjMGU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgotc3JjLmluY2x1ZGVzID0gbW9kZWwvCi1zcmMuaW5jbHVkZXMgPSBtb2RlbC8KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9tb2RlbC9lY2xpcHNlTGlua1Jlc291cmNlTW9kZWxzLmdlbm1vZGVsIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL21vZGVsL2VjbGlwc2VMaW5rUmVzb3VyY2VNb2RlbHMuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYjVhNDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL21vZGVsL2VjbGlwc2VMaW5rUmVzb3VyY2VNb2RlbHMuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYyIKLSAgICBjcmVhdGlvbkNvbW1hbmRzPSJmYWxzZSIgY3JlYXRpb25JY29ucz0iZmFsc2UiIGVkaXREaXJlY3Rvcnk9IiIgZWRpdG9yRGlyZWN0b3J5PSIiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlIiBtb2RlbE5hbWU9IkVjbGlwc2VMaW5rQ29yZSIKLSAgICBlZGl0UGx1Z2luQ2xhc3M9IiIgZWRpdG9yUGx1Z2luQ2xhc3M9IiIgdXBkYXRlQ2xhc3NwYXRoPSJmYWxzZSIgcm9vdEV4dGVuZHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdCIKLSAgICByb290RXh0ZW5kc0NsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdCIgc3VwcHJlc3NJbnRlcmZhY2VzPSJ0cnVlIgotICAgIHRlc3RzRGlyZWN0b3J5PSIiIHRlc3RTdWl0ZUNsYXNzPSIiIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLmVtZi5pbXBvcnRlci5lY29yZSIKLSAgICBjb21wbGlhbmNlTGV2ZWw9IjUuMCIgY29weXJpZ2h0RmllbGRzPSJmYWxzZSIgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvanBhUmVzb3VyY2VNb2RlbHMuZ2VubW9kZWwjLy9vcm0gLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL2pwYVJlc291cmNlTW9kZWxzLmdlbm1vZGVsIy8veG1sIj4KLSAgPGZvcmVpZ25Nb2RlbD5lY2xpcHNlbGlua19vcm0uZWNvcmU8L2ZvcmVpZ25Nb2RlbD4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iRWNsaXBzZUxpbmtPcm0iIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UiCi0gICAgICBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIiBhZGFwdGVyRmFjdG9yeT0iZmFsc2UiIGVjb3JlUGFja2FnZT0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9DYWNoZUNvb3JkaW5hdGlvblR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9DYWNoZUNvb3JkaW5hdGlvblR5cGUvU0VORF9PQkpFQ1RfQ0hBTkdFUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9DYWNoZUNvb3JkaW5hdGlvblR5cGUvSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVDb29yZGluYXRpb25UeXBlL1NFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL0NhY2hlQ29vcmRpbmF0aW9uVHlwZS9OT05FIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVUeXBlL0ZVTEwiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVUeXBlL1dFQUsiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVUeXBlL1NPRlQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVUeXBlL1NPRlRfV0VBSyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9DYWNoZVR5cGUvSEFSRF9XRUFLIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL0NhY2hlVHlwZS9DQUNIRSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9DYWNoZVR5cGUvTk9ORSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENoYW5nZVRyYWNraW5nVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENoYW5nZVRyYWNraW5nVHlwZS9BVFRSSUJVVEUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2hhbmdlVHJhY2tpbmdUeXBlL09CSkVDVCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDaGFuZ2VUcmFja2luZ1R5cGUvREVGRVJSRUQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2hhbmdlVHJhY2tpbmdUeXBlL0FVVE8iLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxEaXJlY3Rpb24iPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxEaXJlY3Rpb24vSU4iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRGlyZWN0aW9uL09VVCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxEaXJlY3Rpb24vSU5fT1VUIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbERpcmVjdGlvbi9PVVRfQ1VSU09SIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vRXhpc3RlbmNlVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL0V4aXN0ZW5jZVR5cGUvQ0hFQ0tfQ0FDSEUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vRXhpc3RlbmNlVHlwZS9DSEVDS19EQVRBQkFTRSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9FeGlzdGVuY2VUeXBlL0FTU1VNRV9FWElTVEVOQ0UiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vRXhpc3RlbmNlVHlwZS9BU1NVTUVfTk9OX0VYSVNURU5DRSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEpvaW5GZXRjaFR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxKb2luRmV0Y2hUeXBlL0lOTkVSIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEpvaW5GZXRjaFR5cGUvT1VURVIiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUvQUxMX0NPTFVNTlMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlL0NIQU5HRURfQ09MVU1OUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUvU0VMRUNURURfQ09MVU1OUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUvVkVSU0lPTl9DT0xVTU4iLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQWNjZXNzTWV0aG9kcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQWNjZXNzTWV0aG9kcy9nZXRNZXRob2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxBY2Nlc3NNZXRob2RzL3NldE1ldGhvZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEFjY2Vzc01ldGhvZHNIb2xkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxBY2Nlc3NNZXRob2RzSG9sZGVyL2FjY2Vzc01ldGhvZHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQWRkaXRpb25hbENyaXRlcmlhIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQXJyYXkiLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEF0dHJpYnV0ZU1hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEF0dHJpYnV0ZU1hcHBpbmcvYXR0cmlidXRlVHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9BdHRyaWJ1dGVzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQXR0cmlidXRlcy9iYXNpY0NvbGxlY3Rpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL0F0dHJpYnV0ZXMvYmFzaWNNYXBzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL0F0dHJpYnV0ZXMvdHJhbnNmb3JtYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL0F0dHJpYnV0ZXMvdmFyaWFibGVPbmVUb09uZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQmFzaWMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEJhc2ljQ29sbGVjdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQmFzaWNNYXAiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxCYXRjaEZldGNoIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxCYXRjaEZldGNoSG9sZGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQmF0Y2hGZXRjaEhvbGRlci9iYXRjaEZldGNoIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENhY2hlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDYWNoZS9leHBpcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDYWNoZS9zaXplIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2FjaGUvc2hhcmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2FjaGUvdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENhY2hlL2Fsd2F5c1JlZnJlc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDYWNoZS9yZWZyZXNoT25seUlmTmV3ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDYWNoZS9kaXNhYmxlSGl0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENhY2hlL2Nvb3JkaW5hdGlvblR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDYWNoZS9leHBpcnlUaW1lT2ZEYXkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDYWNoZUhvbGRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENhY2hlSG9sZGVyL2NhY2hlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2FjaGVIb2xkZXIvZXhpc3RlbmNlQ2hlY2tpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2FjaGVJbmRleCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENoYW5nZVRyYWNraW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDaGFuZ2VUcmFja2luZy90eXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDaGFuZ2VUcmFja2luZ0hvbGRlci9jaGFuZ2VUcmFja2luZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDbG9uZUNvcHlQb2xpY3kiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENsb25lQ29weVBvbGljeS9tZXRob2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDbG9uZUNvcHlQb2xpY3kvd29ya2luZ0NvcHlNZXRob2QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29sbGVjdGlvblRhYmxlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVyc2lvblZhbHVlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDb252ZXJzaW9uVmFsdWUvZGF0YVZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVyc2lvblZhbHVlL29iamVjdFZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENvbnZlcnRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVydGVyL2NsYXNzTmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENvbnZlcnRlckNvbnRhaW5lciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENvbnZlcnRlckNvbnRhaW5lci9jb252ZXJ0ZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENvbnZlcnRlckNvbnRhaW5lci90eXBlQ29udmVydGVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDb252ZXJ0ZXJDb250YWluZXIvb2JqZWN0VHlwZUNvbnZlcnRlcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVydGVyQ29udGFpbmVyL3N0cnVjdENvbnZlcnRlcnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVydGlibGVNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVydGlibGVNYXBwaW5nL2NvbnZlcnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29weVBvbGljeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29weVBvbGljeS9jbGFzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEN1c3RvbWl6ZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEN1c3RvbWl6ZXIvY3VzdG9taXplckNsYXNzTmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEN1c3RvbWl6ZXJIb2xkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDdXN0b21pemVySG9sZGVyL2N1c3RvbWl6ZXIiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRWxlbWVudENvbGxlY3Rpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxFbWJlZGRhYmxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRW1iZWRkYWJsZS9jb3B5UG9saWN5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEVtYmVkZGFibGUvaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRW1iZWRkYWJsZS9jbG9uZUNvcHlQb2xpY3kiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxFbWJlZGRhYmxlL2V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxFbWJlZGRlZCIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRW1iZWRkZWRJZCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEVudGl0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEVudGl0eS9vcHRpbWlzdGljTG9ja2luZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxFbnRpdHkvY29weVBvbGljeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxFbnRpdHkvaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRW50aXR5L2Nsb25lQ29weVBvbGljeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEVudGl0eS9leGNsdWRlRGVmYXVsdE1hcHBpbmdzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRmV0Y2hBdHRyaWJ1dGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxGZXRjaEdyb3VwIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sSGFzaFBhcnRpdGlvbmluZyIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbElkIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sSW5kZXgiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sSm9pbkZldGNoIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxKb2luRmV0Y2gvam9pbkZldGNoIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEpvaW5UYWJsZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE1hbnlUb01hbnkiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxNYW55VG9PbmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTWFwcGVkU3VwZXJjbGFzcy9vcHRpbWlzdGljTG9ja2luZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzL2NvcHlQb2xpY3kiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTWFwcGVkU3VwZXJjbGFzcy9pbnN0YW50aWF0aW9uQ29weVBvbGljeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzL2Nsb25lQ29weVBvbGljeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MvZXhjbHVkZURlZmF1bHRNYXBwaW5ncyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxNdWx0aXRlbmFudCIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTXVsdGl0ZW5hbnRIb2xkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxNdWx0aXRlbmFudEhvbGRlci9tdWx0aXRlbmFudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE11dGFibGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE11dGFibGUvbXV0YWJsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE5hbWVkQ29udmVydGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxOYW1lZENvbnZlcnRlci9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS9yZXN1bHRDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkvcmVzdWx0U2V0TWFwcGluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkvcHJvY2VkdXJlTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkvcmV0dXJuc1Jlc3VsdFNldCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5L2hpbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkvcGFyYW1ldGVycyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPYmplY3RUeXBlQ29udmVydGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPYmplY3RUeXBlQ29udmVydGVyL2RhdGFUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sT2JqZWN0VHlwZUNvbnZlcnRlci9vYmplY3RUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE9iamVjdFR5cGVDb252ZXJ0ZXIvY29udmVyc2lvblZhbHVlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE9iamVjdFR5cGVDb252ZXJ0ZXIvZGVmYXVsdE9iamVjdFZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE9uZVRvTWFueSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE9uZVRvT25lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sT3B0aW1pc3RpY0xvY2tpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE9wdGltaXN0aWNMb2NraW5nL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcHRpbWlzdGljTG9ja2luZy9jYXNjYWRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE9wdGltaXN0aWNMb2NraW5nL3NlbGVjdGVkQ29sdW1ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcmRlckNvbHVtbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFBhcnRpdGlvbmluZyIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhL2V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUGlubmVkUGFydGl0aW9uaW5nIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUGxzcWxSZWNvcmQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxQbHNxbFRhYmxlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUHJpbWFyeUtleSIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUHJpdmF0ZU93bmVkIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxQcml2YXRlT3duZWQvcHJpdmF0ZU93bmVkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFByb3BlcnR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxQcm9wZXJ0eS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUHJvcGVydHkvdmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxQcm9wZXJ0eS92YWx1ZVR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxQcm9wZXJ0eUNvbnRhaW5lciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFByb3BlcnR5Q29udGFpbmVyL3Byb3BlcnRpZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxRdWVyeUNvbnRhaW5lciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFF1ZXJ5Q29udGFpbmVyL25hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxRdWVyeVJlZGlyZWN0b3JzIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUmFuZ2VQYXJ0aXRpb25pbmciLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFJlYWRPbmx5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxSZWFkT25seS9yZWFkT25seSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZyIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFJldHVybkluc2VydCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmciLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxTZWNvbmRhcnlUYWJsZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyL2RpcmVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlci9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyL3F1ZXJ5UGFyYW1ldGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIvamRiY1R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIvamRiY1R5cGVOYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFN0cnVjdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFN0cnVjdENvbnZlcnRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sU3RydWN0Q29udmVydGVyL2NvbnZlcnRlciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxTdHJ1Y3R1cmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxUYWJsZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFRhYmxlR2VuZXJhdG9yIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFRpbWVPZkRheSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVGltZU9mRGF5L2hvdXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxUaW1lT2ZEYXkvbWludXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVGltZU9mRGF5L3NlY29uZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFRpbWVPZkRheS9taWxsaXNlY29uZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFRyYW5zZm9ybWF0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVHJhbnNpZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVHlwZUNvbnZlcnRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVHlwZUNvbnZlcnRlci9kYXRhVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFR5cGVDb252ZXJ0ZXIvb2JqZWN0VHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFR5cGVNYXBwaW5nIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVW5pb25QYXJ0aXRpb25pbmciLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxWYWx1ZVBhcnRpdGlvbmluZyIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVmFyaWFibGVPbmVUb09uZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVmFyaWFibGVPbmVUb09uZS90YXJnZXRJbnRlcmZhY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVmVyc2lvbiIvPgotICAgIDxuZXN0ZWRHZW5QYWNrYWdlcyBwcmVmaXg9IkVjbGlwc2VMaW5rT3JtVjFfMSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0iCi0gICAgICAgIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiIGFkYXB0ZXJGYWN0b3J5PSJmYWxzZSIgZWNvcmVQYWNrYWdlPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92MV8xIj4KLSAgICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92MV8xL0lkVmFsaWRhdGlvblR5cGVfMV8xIj4KLSAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92MV8xL0lkVmFsaWRhdGlvblR5cGVfMV8xL05VTEwiLz4KLSAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92MV8xL0lkVmFsaWRhdGlvblR5cGVfMV8xL1pFUk8iLz4KLSAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92MV8xL0lkVmFsaWRhdGlvblR5cGVfMV8xL05PTkUiLz4KLSAgICAgIDwvZ2VuRW51bXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEvWG1sQmFzaWNfMV8xIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92MV8xL1htbEJhc2ljXzFfMS9nZW5lcmF0ZWRWYWx1ZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92MV8xL1htbEVudGl0eV8xXzEiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEvWG1sRW50aXR5XzFfMS9wcmltYXJ5S2V5Ii8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEvWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEvWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEvcHJpbWFyeUtleSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92MV8xL1htbFByaW1hcnlLZXlfMV8xIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEvWG1sUHJpbWFyeUtleV8xXzEvdmFsaWRhdGlvbiIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEvWG1sUHJpbWFyeUtleV8xXzEvY29sdW1ucyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgIDwvbmVzdGVkR2VuUGFja2FnZXM+Ci0gICAgPG5lc3RlZEdlblBhY2thZ2VzIHByZWZpeD0iRWNsaXBzZUxpbmtPcm1WMl8wIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybSIKLSAgICAgICAgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIgYWRhcHRlckZhY3Rvcnk9ImZhbHNlIiBlY29yZVBhY2thZ2U9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAiPgotICAgICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAiPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAvUkVBRCIvPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAvUkVBRF9XUklURSIvPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAvRVhDRVBUSU9OIi8+Ci0gICAgICA8L2dlbkVudW1zPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbENvbGxlY3Rpb25NYXBwaW5nXzJfMCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbENvbGxlY3Rpb25NYXBwaW5nXzJfMC9tYXBLZXlDb252ZXJ0Ii8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIi8+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sRW50aXR5XzJfMCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9YbWxFbnRpdHlfMl8wL2NhY2hlSW50ZXJjZXB0b3IiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbEVudGl0eV8yXzAvcXVlcnlSZWRpcmVjdG9ycyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbE1hbnlUb01hbnlfMl8wIi8+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAvbWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMC9jYWNoZUludGVyY2VwdG9yIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sT25lVG9NYW55XzJfMCIvPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbE9yZGVyQ29sdW1uXzJfMCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbE9yZGVyQ29sdW1uXzJfMC9jb3JyZWN0aW9uVHlwZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAvYWxsUXVlcmllcyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMC9yZWFkQWxsIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wL3JlYWRPYmplY3QiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAvcmVwb3J0Ii8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wL3VwZGF0ZSIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMC9pbnNlcnQiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAvZGVsZXRlIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPC9uZXN0ZWRHZW5QYWNrYWdlcz4KLSAgICA8bmVzdGVkR2VuUGFja2FnZXMgcHJlZml4PSJFY2xpcHNlTGlua09ybVYyXzEiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtIgotICAgICAgICBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIiBhZGFwdGVyRmFjdG9yeT0iZmFsc2UiIGZpbGVFeHRlbnNpb25zPSJlY2xpcHNlbGlua29ybXYyXzEiCi0gICAgICAgIGVjb3JlUGFja2FnZT0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMSI+Ci0gICAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9DYWNoZUtleVR5cGVfMl8xIj4KLSAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL0NhY2hlS2V5VHlwZV8yXzEvSURfVkFMVUUiLz4KLSAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL0NhY2hlS2V5VHlwZV8yXzEvQ0FDSEVfS0VZIi8+Ci0gICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9DYWNoZUtleVR5cGVfMl8xL0FVVE8iLz4KLSAgICAgIDwvZ2VuRW51bXM+Ci0gICAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9CYXRjaEZldGNoVHlwZV8yXzEiPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvQmF0Y2hGZXRjaFR5cGVfMl8xL0pPSU4iLz4KLSAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL0JhdGNoRmV0Y2hUeXBlXzJfMS9FWElTVFMiLz4KLSAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL0JhdGNoRmV0Y2hUeXBlXzJfMS9JTiIvPgotICAgICAgPC9nZW5FbnVtcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxCYXNpY18yXzEiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sQmFzaWNfMl8xL3JldHVybkluc2VydCIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxCYXNpY18yXzEvcmV0dXJuVXBkYXRlIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sQmF0Y2hGZXRjaF8yXzEiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxCYXRjaEZldGNoXzJfMS9zaXplIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEJhdGNoRmV0Y2hfMl8xL2JhdGNoRmV0Y2hUeXBlIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xIi8+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sRW50aXR5XzJfMSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxFbnRpdHlfMl8xL2NsYXNzRXh0cmFjdG9yIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sRW50aXR5TWFwcGluZ3NfMl8xIi8+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xL25hbWUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxGZXRjaEdyb3VwXzJfMSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEZldGNoR3JvdXBfMl8xL25hbWUiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sRmV0Y2hHcm91cF8yXzEvbG9hZCIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sRmV0Y2hHcm91cF8yXzEvYXR0cmlidXRlcyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMS9mZXRjaEdyb3VwcyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbE1hbnlUb01hbnlfMl8xIi8+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sTWFueVRvT25lXzJfMSIvPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbE1hcHBlZFN1cGVyY2xhc3NfMl8xIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbE1hcHBlZFN1cGVyY2xhc3NfMl8xL3NxbFJlc3VsdFNldE1hcHBpbmdzIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMS9xdWVyeVJlZGlyZWN0b3JzIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sT25lVG9NYW55XzJfMSIvPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbE9uZVRvT25lXzJfMSIvPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMSIvPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbFByaW1hcnlLZXlfMl8xIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sUHJpbWFyeUtleV8yXzEvY2FjaGVLZXlUeXBlIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sUmV0dXJuSW5zZXJ0XzJfMSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbFJldHVybkluc2VydF8yXzEvcmV0dXJuT25seSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbFR5cGVNYXBwaW5nXzJfMSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbFR5cGVNYXBwaW5nXzJfMS9wYXJlbnRDbGFzcyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgIDwvbmVzdGVkR2VuUGFja2FnZXM+Ci0gICAgPG5lc3RlZEdlblBhY2thZ2VzIHByZWZpeD0iRWNsaXBzZUxpbmtPcm1WMl8yIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybSIKLSAgICAgICAgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIgYWRhcHRlckZhY3Rvcnk9ImZhbHNlIiBmaWxlRXh0ZW5zaW9ucz0iRWNsaXBzZUxpbmtPcm1WMl8yIgotICAgICAgICBlY29yZVBhY2thZ2U9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIiPgotICAgICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvQ2FjaGVJc29sYXRpb25UeXBlIj4KLSAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL0NhY2hlSXNvbGF0aW9uVHlwZS9TSEFSRUQiLz4KLSAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL0NhY2hlSXNvbGF0aW9uVHlwZS9QUk9URUNURUQiLz4KLSAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL0NhY2hlSXNvbGF0aW9uVHlwZS9JU09MQVRFRCIvPgotICAgICAgPC9nZW5FbnVtcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMi9jcml0ZXJpYSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEJhc2ljXzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxCYXNpY18yXzIvaW5kZXgiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxCYXNpY0NvbGxlY3Rpb25fMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sQmFzaWNDb2xsZWN0aW9uXzJfMi9jYXNjYWRlT25EZWxldGUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxCYXNpY01hcF8yXzIiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxCYXNpY01hcF8yXzIvY2FzY2FkZU9uRGVsZXRlIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sQ2FjaGVfMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sQ2FjaGVfMl8yL2lzb2xhdGlvbiIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbENvbGxlY3Rpb25UYWJsZV8yXzIiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxDb2xsZWN0aW9uVGFibGVfMl8yL2NyZWF0aW9uU3VmZml4Ii8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8yL2Nhc2NhZGVPbkRlbGV0ZSIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIvbm9uY2FjaGVhYmxlIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sRW1iZWRkYWJsZV8yXzIiLz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxFbnRpdHlfMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEVudGl0eV8yXzIvYWRkaXRpb25hbENyaXRlcmlhIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEVudGl0eV8yXzIvY2FzY2FkZU9uRGVsZXRlIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxFbnRpdHlfMl8yL2luZGV4Ii8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sRW50aXR5TWFwcGluZ3NfMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEVudGl0eU1hcHBpbmdzXzJfMi9wYXJ0aXRpb25pbmciLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEVudGl0eU1hcHBpbmdzXzJfMi9yZXBsaWNhdGlvblBhcnRpdGlvbmluZyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sRW50aXR5TWFwcGluZ3NfMl8yL3JvdW5kUm9iaW5QYXJ0aXRpb25pbmciLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEVudGl0eU1hcHBpbmdzXzJfMi9waW5uZWRQYXJ0aXRpb25pbmciLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEVudGl0eU1hcHBpbmdzXzJfMi9yYW5nZVBhcnRpdGlvbmluZyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sRW50aXR5TWFwcGluZ3NfMl8yL3ZhbHVlUGFydGl0aW9uaW5nIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxFbnRpdHlNYXBwaW5nc18yXzIvaGFzaFBhcnRpdGlvbmluZyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sRW50aXR5TWFwcGluZ3NfMl8yL3VuaW9uUGFydGl0aW9uaW5nIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxIYXNoUGFydGl0aW9uaW5nXzJfMi9uYW1lIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbElkXzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxJZF8yXzIvaW5kZXgiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxJbmRleF8yXzIiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxJbmRleF8yXzIvbmFtZSIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxJbmRleF8yXzIvc2NoZW1hIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEluZGV4XzJfMi9jYXRhbG9nIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEluZGV4XzJfMi90YWJsZSIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxJbmRleF8yXzIvdW5pcXVlIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEluZGV4XzJfMi9jb2x1bW5OYW1lcyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEpvaW5UYWJsZV8yXzIiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxKb2luVGFibGVfMl8yL2NyZWF0aW9uU3VmZml4Ii8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sTWFueVRvTWFueV8yXzIiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxNYW55VG9NYW55XzJfMi9jYXNjYWRlT25EZWxldGUiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sTWFueVRvTWFueV8yXzIvbm9uQ2FjaGVhYmxlIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sTWFueVRvT25lXzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbE1hbnlUb09uZV8yXzIvbm9uQ2FjaGVhYmxlIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sTWFwcGVkU3VwZXJjbGFzc18yXzIiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sTWFwcGVkU3VwZXJjbGFzc18yXzIvYWRkaXRpb25hbENyaXRlcmlhIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sT25lVG9PbmVfMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sT25lVG9PbmVfMl8yL2Nhc2NhZGVPbkRlbGV0ZSIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxPbmVUb09uZV8yXzIvbm9uQ2FjaGVhYmxlIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sT25lVG9NYW55XzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbE9uZVRvTWFueV8yXzIvY2FzY2FkZU9uRGVsZXRlIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbE9uZVRvTWFueV8yXzIvbm9uY2FjaGVhYmxlIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sUGFydGl0aW9uaW5nXzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFBhcnRpdGlvbmluZ18yXzIvbmFtZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIvcGFydGl0aW9uaW5nIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIvcmVwbGljYXRpb25QYXJ0aXRpb25pbmciLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFBhcnRpdGlvbmluZ0dyb3VwXzJfMi9yb3VuZFJvYmluUGFydGl0aW9uaW5nIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIvcGlubmVkUGFydGl0aW9uaW5nIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIvcmFuZ2VQYXJ0aXRpb25pbmciLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFBhcnRpdGlvbmluZ0dyb3VwXzJfMi92YWx1ZVBhcnRpdGlvbmluZyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yL2hhc2hQYXJ0aXRpb25pbmciLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFBhcnRpdGlvbmluZ0dyb3VwXzJfMi91bmlvblBhcnRpdGlvbmluZyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIvcGFydGl0aW9uZWQiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMi9uYW1lIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yL25hbWUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIvbmFtZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIvbmFtZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFNlY29uZGFyeVRhYmxlXzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFNlY29uZGFyeVRhYmxlXzJfMi9jcmVhdGlvblN1ZmZpeCIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFRhYmxlXzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFRhYmxlXzJfMi9jcmVhdGlvblN1ZmZpeCIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFRhYmxlR2VuZXJhdG9yXzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFRhYmxlR2VuZXJhdG9yXzJfMi9jcmVhdGlvblN1ZmZpeCIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFVuaW9uUGFydGl0aW9uaW5nXzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFVuaW9uUGFydGl0aW9uaW5nXzJfMi9uYW1lIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yL25hbWUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxWYXJpYWJsZU9uZVRvT25lXzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFZhcmlhYmxlT25lVG9PbmVfMl8yL25vbkNhY2hlYWJsZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFZlcnNpb25fMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFZlcnNpb25fMl8yL2luZGV4Ii8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPC9uZXN0ZWRHZW5QYWNrYWdlcz4KLSAgICA8bmVzdGVkR2VuUGFja2FnZXMgcHJlZml4PSJFY2xpcHNlTGlua09ybVYyXzMiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtIgotICAgICAgICBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIiBhZGFwdGVyRmFjdG9yeT0iZmFsc2UiIGZpbGVFeHRlbnNpb25zPSJFY2xpcHNlbGlua09ybVYyXzMiCi0gICAgICAgIGVjb3JlUGFja2FnZT0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMyI+Ci0gICAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMy9NdWx0aXRlbmFudFR5cGUiPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvTXVsdGl0ZW5hbnRUeXBlL1NJTkdMRV9UQUJMRSIvPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvTXVsdGl0ZW5hbnRUeXBlL1RBQkxFX1BFUl9URU5BTlQiLz4KLSAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8zL011bHRpdGVuYW50VHlwZS9WUEQiLz4KLSAgICAgIDwvZ2VuRW51bXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvWG1sQXJyYXlfMl8zIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvWG1sQXJyYXlfMl8zL2RhdGFiYXNlVHlwZSIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMy9YbWxBcnJheV8yXzMvdGFyZ2V0Q2xhc3MiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMy9YbWxBdHRyaWJ1dGVzXzJfMyI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMy9YbWxBdHRyaWJ1dGVzXzJfMy9zdHJ1Y3R1cmVzIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMy9YbWxBdHRyaWJ1dGVzXzJfMy9hcnJheXMiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMy9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzMiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMy9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzMvY29tcG9zaXRlTWVtYmVyIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvWG1sRW1iZWRkYWJsZV8yXzMiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvWG1sRW1iZWRkYWJsZV8yXzMvcGxzcWxSZWNvcmRzIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMy9YbWxFbWJlZGRhYmxlXzJfMy9wbHNxbFRhYmxlcyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvWG1sRW1iZWRkYWJsZV8yXzMvc3RydWN0Ii8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvWG1sRW50aXR5XzJfMyI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMy9YbWxFbnRpdHlfMl8zL25hbWVkU3RvcmVkRnVuY3Rpb25RdWVyaWVzIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMy9YbWxFbnRpdHlfMl8zL25hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8zL1htbEVudGl0eV8yXzMvbmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8zL1htbEVudGl0eV8yXzMvcGxzcWxSZWNvcmRzIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMy9YbWxFbnRpdHlfMl8zL3Bsc3FsVGFibGVzIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMy9YbWxFbnRpdHlfMl8zL3N0cnVjdCIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8zL1htbEVudGl0eU1hcHBpbmdzXzJfMyI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMy9YbWxFbnRpdHlNYXBwaW5nc18yXzMvdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8zL1htbEVudGl0eU1hcHBpbmdzXzJfMy9uYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvWG1sRW50aXR5TWFwcGluZ3NfMl8zL25hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8zL1htbEVudGl0eU1hcHBpbmdzXzJfMy9uYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvWG1sRW50aXR5TWFwcGluZ3NfMl8zL3Bsc3FsUmVjb3JkcyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvWG1sRW50aXR5TWFwcGluZ3NfMl8zL3Bsc3FsVGFibGVzIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvWG1sTWFwcGVkU3VwZXJjbGFzc18yXzMiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvWG1sTWFwcGVkU3VwZXJjbGFzc18yXzMvbmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8zL1htbE1hcHBlZFN1cGVyY2xhc3NfMl8zL25hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8zL1htbE1hcHBlZFN1cGVyY2xhc3NfMl8zL25hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMy9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMy9wbHNxbFJlY29yZHMiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8zL1htbE1hcHBlZFN1cGVyY2xhc3NfMl8zL3Bsc3FsVGFibGVzIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvWG1sTXVsdGl0ZW5hbnRfMl8zIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvWG1sTXVsdGl0ZW5hbnRfMl8zL3R5cGUiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8zL1htbE11bHRpdGVuYW50XzJfMy90ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8zL1htbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMyI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8zL1htbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMy9uYW1lIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfMyI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8zL1htbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzMvbmFtZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8zL1htbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMy9YbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zL25hbWUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMy9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzMiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8zL3RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvWG1sUGxzcWxSZWNvcmRfMl8zIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvWG1sUGxzcWxSZWNvcmRfMl8zL25hbWUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMy9YbWxQbHNxbFRhYmxlXzJfMyI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8zL1htbFBsc3FsVGFibGVfMl8zL25hbWUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMy9YbWxTdHJ1Y3RfMl8zIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvWG1sU3RydWN0XzJfMy9uYW1lIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMy9YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMy9jb250ZXh0UHJvcGVydHkiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMvdGFibGUiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzMvWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMvcHJpbWFyeUtleSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8zL1htbFN0cnVjdHVyZV8yXzMiLz4KLSAgICA8L25lc3RlZEdlblBhY2thZ2VzPgotICAgIDxuZXN0ZWRHZW5QYWNrYWdlcyBwcmVmaXg9IkVjbGlwc2VMaW5rT3JtVjJfNCIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0iCi0gICAgICAgIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiIGFkYXB0ZXJGYWN0b3J5PSJmYWxzZSIgZmlsZUV4dGVuc2lvbnM9IkVjbGlwc2VsaW5rT3JtVjJfNCIKLSAgICAgICAgZWNvcmVQYWNrYWdlPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml80Ij4KLSAgICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml80L0RhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSI+Ci0gICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfNC9EYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUvTk9ORSIvPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzQvRGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlL0lOVkFMSURBVElPTiIvPgotICAgICAgPC9nZW5FbnVtcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfNC9YbWxCYXNpY18yXzQiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzQvWG1sQmFzaWNfMl80L2NhY2hlSW5kZXgiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfNC9YbWxDYWNoZV8yXzQiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfNC9YbWxDYWNoZV8yXzQvZGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzQvWG1sQ2FjaGVJbmRleF8yXzQiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfNC9YbWxDYWNoZUluZGV4XzJfNC9jb2x1bW5OYW1lcyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml80L1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfNCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml80L1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfNC9kZWxldGVBbGwiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfNC9YbWxFbnRpdHlfMl80Ij4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml80L1htbEVudGl0eV8yXzQvY2FjaGVJbmRleCIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml80L1htbElkXzJfNCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfNC9YbWxJZF8yXzQvY2FjaGVJbmRleCIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml80L1htbE1hcHBlZFN1cGVyY2xhc3NfMl80Ij4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml80L1htbE1hcHBlZFN1cGVyY2xhc3NfMl80L2NhY2hlSW5kZXgiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfNC9YbWxNdWx0aXRlbmFudF8yXzQiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfNC9YbWxNdWx0aXRlbmFudF8yXzQvaW5jbHVkZUNyaXRlcmlhIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzQvWG1sT25lVG9NYW55XzJfNCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml80L1htbE9uZVRvTWFueV8yXzQvZGVsZXRlQWxsIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPC9uZXN0ZWRHZW5QYWNrYWdlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvbW9kZWwvZWNsaXBzZWxpbmtfb3JtLmVjb3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL21vZGVsL2VjbGlwc2VsaW5rX29ybS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliZDk4ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvbW9kZWwvZWNsaXBzZWxpbmtfb3JtLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsODA2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9Im9ybSIKLSAgICBuc1VSST0ianB0LmVjbGlwc2VsaW5rLm9ybS54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxBY2Nlc3NNZXRob2RzIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2V0TWV0aG9kIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZXRNZXRob2QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEFjY2Vzc01ldGhvZHNIb2xkZXIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWNjZXNzTWV0aG9kcyIgZVR5cGU9IiMvL1htbEFjY2Vzc01ldGhvZHMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQWRkaXRpb25hbENyaXRlcmlhIiBlU3VwZXJUeXBlcz0iIy8vdjJfMi9YbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQXJyYXkiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vdjJfMy9YbWxBcnJheV8yXzMgIy8vWG1sQ29udmVydGlibGVNYXBwaW5nIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQXR0cmlidXRlTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sQXR0cmlidXRlTWFwcGluZyAjLy9YbWxBY2Nlc3NNZXRob2RzSG9sZGVyICMvL1htbFByb3BlcnR5Q29udGFpbmVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXR0cmlidXRlVHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXR0cmlidXRlcyIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9BdHRyaWJ1dGVzICMvL3YyXzMvWG1sQXR0cmlidXRlc18yXzMiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNpY0NvbGxlY3Rpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbEJhc2ljQ29sbGVjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNpY01hcHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sQmFzaWNNYXAiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idHJhbnNmb3JtYXRpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbFRyYW5zZm9ybWF0aW9uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhcmlhYmxlT25lVG9PbmVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbFZhcmlhYmxlT25lVG9PbmUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQmFzaWMiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sQmFzaWMgIy8vdjFfMS9YbWxCYXNpY18xXzEgIy8vdjJfMS9YbWxCYXNpY18yXzEgIy8vdjJfMi9YbWxCYXNpY18yXzIgIy8vdjJfNC9YbWxCYXNpY18yXzQgIy8vWG1sQXR0cmlidXRlTWFwcGluZyAjLy9YbWxNdXRhYmxlICMvL1htbENvbnZlcnRpYmxlTWFwcGluZyAjLy9YbWxDb252ZXJ0ZXJDb250YWluZXIiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxCYXNpY0NvbGxlY3Rpb24iIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vdjJfMi9YbWxCYXNpY0NvbGxlY3Rpb25fMl8yIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQmFzaWNNYXAiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vdjJfMi9YbWxCYXNpY01hcF8yXzIiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxCYXRjaEZldGNoIiBlU3VwZXJUeXBlcz0iIy8vdjJfMS9YbWxCYXRjaEZldGNoXzJfMSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEJhdGNoRmV0Y2hIb2xkZXIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmF0Y2hGZXRjaCIgZVR5cGU9IiMvL1htbEJhdGNoRmV0Y2giCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ2FjaGUiIGVTdXBlclR5cGVzPSIjLy92Ml8yL1htbENhY2hlXzJfMiAjLy92Ml80L1htbENhY2hlXzJfNCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4cGlyeSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2l6ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2hhcmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9IiMvL0NhY2hlVHlwZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbHdheXNSZWZyZXNoIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVmcmVzaE9ubHlJZk5ld2VyIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGlzYWJsZUhpdHMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb29yZGluYXRpb25UeXBlIiBlVHlwZT0iIy8vQ2FjaGVDb29yZGluYXRpb25UeXBlIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhwaXJ5VGltZU9mRGF5IiBlVHlwZT0iIy8vWG1sVGltZU9mRGF5IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDYWNoZUhvbGRlciIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhY2hlIiBlVHlwZT0iIy8vWG1sQ2FjaGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhpc3RlbmNlQ2hlY2tpbmciIGVUeXBlPSIjLy9FeGlzdGVuY2VUeXBlIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ2FjaGVJbmRleCIgZVN1cGVyVHlwZXM9IiMvL3YyXzQvWG1sQ2FjaGVJbmRleF8yXzQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDaGFuZ2VUcmFja2luZyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSIjLy9YbWxDaGFuZ2VUcmFja2luZ1R5cGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hhbmdlVHJhY2tpbmciIGVUeXBlPSIjLy9YbWxDaGFuZ2VUcmFja2luZyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDbG9uZUNvcHlQb2xpY3kiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtZXRob2QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtpbmdDb3B5TWV0aG9kIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDb2xsZWN0aW9uVGFibGUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sQ29sbGVjdGlvblRhYmxlICMvL3YyXzIvWG1sQ29sbGVjdGlvblRhYmxlXzJfMiIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENvbnZlcnNpb25WYWx1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRhdGFWYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib2JqZWN0VmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENvbnZlcnRlciIgZVN1cGVyVHlwZXM9IiMvL1htbE5hbWVkQ29udmVydGVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2xhc3NOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDb252ZXJ0ZXJDb250YWluZXIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udmVydGVycyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxDb252ZXJ0ZXIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idHlwZUNvbnZlcnRlcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sVHlwZUNvbnZlcnRlciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvYmplY3RUeXBlQ29udmVydGVycyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxPYmplY3RUeXBlQ29udmVydGVyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN0cnVjdENvbnZlcnRlcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sU3RydWN0Q29udmVydGVyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENvbnZlcnRpYmxlTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sQ29udmVydGlibGVNYXBwaW5nIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29udmVydCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ29weVBvbGljeSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsYXNzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDdXN0b21pemVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3VzdG9taXplckNsYXNzTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ3VzdG9taXplckhvbGRlciIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjdXN0b21pemVyIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxDbGFzc1JlZmVyZW5jZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbGVtZW50Q29sbGVjdGlvbiIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxFbGVtZW50Q29sbGVjdGlvbiAjLy92Ml8wL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCAjLy92Ml8xL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMSAjLy92Ml8yL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMiAjLy92Ml8zL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMyAjLy92Ml80L1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfNCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVtYmVkZGFibGUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sRW1iZWRkYWJsZSAjLy9YbWxUeXBlTWFwcGluZyAjLy92Ml8yL1htbEVtYmVkZGFibGVfMl8yICMvL3YyXzMvWG1sRW1iZWRkYWJsZV8yXzMgIy8vWG1sQ3VzdG9taXplckhvbGRlciAjLy9YbWxDaGFuZ2VUcmFja2luZ0hvbGRlciAjLy9YbWxDb252ZXJ0ZXJDb250YWluZXIgIy8vWG1sUHJvcGVydHlDb250YWluZXIiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb3B5UG9saWN5IiBlVHlwZT0iIy8vWG1sQ29weVBvbGljeSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnN0YW50aWF0aW9uQ29weVBvbGljeSIKLSAgICAgICAgZVR5cGU9IiMvL1htbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNsb25lQ29weVBvbGljeSIgZVR5cGU9IiMvL1htbENsb25lQ29weVBvbGljeSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGNsdWRlRGVmYXVsdE1hcHBpbmdzIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW1iZWRkZWQiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sRW1iZWRkZWQgIy8vWG1sQXR0cmlidXRlTWFwcGluZyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVtYmVkZGVkSWQiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sRW1iZWRkZWRJZCAjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW50aXR5IiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbEVudGl0eSAjLy9YbWxUeXBlTWFwcGluZyAjLy92MV8xL1htbEVudGl0eV8xXzEgIy8vdjJfMC9YbWxFbnRpdHlfMl8wICMvL3YyXzEvWG1sRW50aXR5XzJfMSAjLy92Ml8yL1htbEVudGl0eV8yXzIgIy8vdjJfMy9YbWxFbnRpdHlfMl8zICMvL3YyXzQvWG1sRW50aXR5XzJfNCAjLy9YbWxSZWFkT25seSAjLy9YbWxDdXN0b21pemVySG9sZGVyICMvL1htbENoYW5nZVRyYWNraW5nSG9sZGVyICMvL1htbENhY2hlSG9sZGVyICMvL1htbENvbnZlcnRlckNvbnRhaW5lciAjLy9YbWxRdWVyeUNvbnRhaW5lciAjLy9YbWxQcm9wZXJ0eUNvbnRhaW5lciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9wdGltaXN0aWNMb2NraW5nIiBlVHlwZT0iIy8vWG1sT3B0aW1pc3RpY0xvY2tpbmciCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29weVBvbGljeSIgZVR5cGU9IiMvL1htbENvcHlQb2xpY3kiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjbG9uZUNvcHlQb2xpY3kiIGVUeXBlPSIjLy9YbWxDbG9uZUNvcHlQb2xpY3kiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhjbHVkZURlZmF1bHRNYXBwaW5ncyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVudGl0eU1hcHBpbmdzIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzICMvL3YyXzEvWG1sRW50aXR5TWFwcGluZ3NfMl8xICMvL3YyXzIvWG1sRW50aXR5TWFwcGluZ3NfMl8yICMvL3YyXzMvWG1sRW50aXR5TWFwcGluZ3NfMl8zICMvL1htbENvbnZlcnRlckNvbnRhaW5lciAjLy9YbWxRdWVyeUNvbnRhaW5lciIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEZldGNoQXR0cmlidXRlIiBlU3VwZXJUeXBlcz0iIy8vdjJfMS9YbWxGZXRjaEF0dHJpYnV0ZV8yXzEiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxGZXRjaEdyb3VwIiBlU3VwZXJUeXBlcz0iIy8vdjJfMS9YbWxGZXRjaEdyb3VwXzJfMSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEhhc2hQYXJ0aXRpb25pbmciIGVTdXBlclR5cGVzPSIjLy92Ml8yL1htbEhhc2hQYXJ0aXRpb25pbmdfMl8yIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sSWQiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sSWQgIy8vdjJfMi9YbWxJZF8yXzIgIy8vdjJfNC9YbWxJZF8yXzQgIy8vWG1sQXR0cmlidXRlTWFwcGluZyAjLy9YbWxNdXRhYmxlICMvL1htbENvbnZlcnRpYmxlTWFwcGluZyAjLy9YbWxDb252ZXJ0ZXJDb250YWluZXIiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxJbmRleCIgZVN1cGVyVHlwZXM9IiMvL3YyXzIvWG1sSW5kZXhfMl8yIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxKb2luRmV0Y2giIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJqb2luRmV0Y2giIGVUeXBlPSIjLy9YbWxKb2luRmV0Y2hUeXBlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEpvaW5UYWJsZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxKb2luVGFibGUgIy8vdjJfMi9YbWxKb2luVGFibGVfMl8yIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFueVRvTWFueSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxNYW55VG9NYW55ICMvL3YyXzAvWG1sTWFueVRvTWFueV8yXzAgIy8vdjJfMS9YbWxNYW55VG9NYW55XzJfMSAjLy92Ml8yL1htbE1hbnlUb01hbnlfMl8yICMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sSm9pbkZldGNoIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFueVRvT25lIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbE1hbnlUb09uZSAjLy92Ml8xL1htbE1hbnlUb09uZV8yXzEgIy8vdjJfMi9YbWxNYW55VG9PbmVfMl8yICMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sSm9pbkZldGNoIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFwcGVkU3VwZXJjbGFzcyIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzICMvL1htbFR5cGVNYXBwaW5nICMvL3YxXzEvWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEgIy8vdjJfMC9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCAjLy92Ml8xL1htbE1hcHBlZFN1cGVyY2xhc3NfMl8xICMvL3YyXzIvWG1sTWFwcGVkU3VwZXJjbGFzc18yXzIgIy8vdjJfMy9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMyAjLy92Ml80L1htbE1hcHBlZFN1cGVyY2xhc3NfMl80ICMvL1htbFJlYWRPbmx5ICMvL1htbEN1c3RvbWl6ZXJIb2xkZXIgIy8vWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIgIy8vWG1sQ2FjaGVIb2xkZXIgIy8vWG1sQ29udmVydGVyQ29udGFpbmVyICMvL1htbFByb3BlcnR5Q29udGFpbmVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3B0aW1pc3RpY0xvY2tpbmciIGVUeXBlPSIjLy9YbWxPcHRpbWlzdGljTG9ja2luZyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb3B5UG9saWN5IiBlVHlwZT0iIy8vWG1sQ29weVBvbGljeSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnN0YW50aWF0aW9uQ29weVBvbGljeSIKLSAgICAgICAgZVR5cGU9IiMvL1htbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNsb25lQ29weVBvbGljeSIgZVR5cGU9IiMvL1htbENsb25lQ29weVBvbGljeSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGNsdWRlRGVmYXVsdE1hcHBpbmdzIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTXVsdGl0ZW5hbnQiIGVTdXBlclR5cGVzPSIjLy92Ml8zL1htbE11bHRpdGVuYW50XzJfMyAjLy92Ml80L1htbE11bHRpdGVuYW50XzJfNCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE11bHRpdGVuYW50SG9sZGVyIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im11bHRpdGVuYW50IiBlVHlwZT0iIy8vWG1sTXVsdGl0ZW5hbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTXV0YWJsZSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im11dGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxOYW1lZENvbnZlcnRlciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5IiBlU3VwZXJUeXBlcz0iIy8vdjJfMy9YbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnkiIGVTdXBlclR5cGVzPSIjLy92Ml8zL1htbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzMiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnkiIGVTdXBlclR5cGVzPSIjLy92Ml8zL1htbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdWx0Q2xhc3MiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3VsdFNldE1hcHBpbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2NlZHVyZU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJldHVybnNSZXN1bHRTZXQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJoaW50cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbFF1ZXJ5SGludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwYXJhbWV0ZXJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxPYmplY3RUeXBlQ29udmVydGVyIiBlU3VwZXJUeXBlcz0iIy8vWG1sTmFtZWRDb252ZXJ0ZXIiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkYXRhVHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib2JqZWN0VHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udmVyc2lvblZhbHVlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxDb252ZXJzaW9uVmFsdWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdE9iamVjdFZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxPbmVUb01hbnkiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sT25lVG9NYW55ICMvL3YyXzAvWG1sT25lVG9NYW55XzJfMCAjLy92Ml8xL1htbE9uZVRvTWFueV8yXzEgIy8vdjJfMi9YbWxPbmVUb01hbnlfMl8yICMvL3YyXzQvWG1sT25lVG9NYW55XzJfNCAjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbFByaXZhdGVPd25lZCAjLy9YbWxKb2luRmV0Y2giLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxPbmVUb09uZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxPbmVUb09uZSAjLy92Ml8xL1htbE9uZVRvT25lXzJfMSAjLy92Ml8yL1htbE9uZVRvT25lXzJfMiAjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbFByaXZhdGVPd25lZCAjLy9YbWxKb2luRmV0Y2giLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxPcHRpbWlzdGljTG9ja2luZyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSIjLy9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FzY2FkZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlbGVjdGVkQ29sdW1ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbENvbHVtbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxPcmRlckNvbHVtbiIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxPcmRlckNvbHVtbiAjLy92Ml8wL1htbE9yZGVyQ29sdW1uXzJfMCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFBhcnRpdGlvbmluZyIgZVN1cGVyVHlwZXM9IiMvL3YyXzIvWG1sUGFydGl0aW9uaW5nXzJfMiIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzICMvL3YyXzEvWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xICMvL3YyXzMvWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8zIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGNsdWRlRGVmYXVsdE1hcHBpbmdzIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUGlubmVkUGFydGl0aW9uaW5nIiBlU3VwZXJUeXBlcz0iIy8vdjJfMi9YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUGxzcWxSZWNvcmQiIGVTdXBlclR5cGVzPSIjLy92Ml8zL1htbFBsc3FsUmVjb3JkXzJfMyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFBsc3FsVGFibGUiIGVTdXBlclR5cGVzPSIjLy92Ml8zL1htbFBsc3FsVGFibGVfMl8zIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUHJpbWFyeUtleSIgZVN1cGVyVHlwZXM9IiMvL3YxXzEvWG1sUHJpbWFyeUtleV8xXzEgIy8vdjJfMS9YbWxQcmltYXJ5S2V5XzJfMSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFByaXZhdGVPd25lZCIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByaXZhdGVPd25lZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFByb3BlcnR5Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlVHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUHJvcGVydHlDb250YWluZXIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydGllcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxQcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxRdWVyeUNvbnRhaW5lciIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcyIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFF1ZXJ5UmVkaXJlY3RvcnMiIGVTdXBlclR5cGVzPSIjLy92Ml8wL1htbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUmFuZ2VQYXJ0aXRpb25pbmciIGVTdXBlclR5cGVzPSIjLy92Ml8yL1htbFJhbmdlUGFydGl0aW9uaW5nXzJfMiIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFJlYWRPbmx5IiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhZE9ubHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZyIgZVN1cGVyVHlwZXM9IiMvL3YyXzIvWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUmV0dXJuSW5zZXJ0IiBlU3VwZXJUeXBlcz0iIy8vdjJfMS9YbWxSZXR1cm5JbnNlcnRfMl8xIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZyIgZVN1cGVyVHlwZXM9IiMvL3YyXzIvWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxTZWNvbmRhcnlUYWJsZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxTZWNvbmRhcnlUYWJsZSAjLy92Ml8yL1htbFNlY29uZGFyeVRhYmxlXzJfMiIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpcmVjdGlvbiIgZVR5cGU9IiMvL1htbERpcmVjdGlvbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJxdWVyeVBhcmFtZXRlciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iamRiY1R5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImpkYmNUeXBlTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sU3RydWN0IiBlU3VwZXJUeXBlcz0iIy8vdjJfMy9YbWxTdHJ1Y3RfMl8zIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sU3RydWN0Q29udmVydGVyIiBlU3VwZXJUeXBlcz0iIy8vWG1sTmFtZWRDb252ZXJ0ZXIiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb252ZXJ0ZXIiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFN0cnVjdHVyZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sQXR0cmlidXRlTWFwcGluZyAjLy92Ml8zL1htbFN0cnVjdHVyZV8yXzMiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxUYWJsZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxUYWJsZSAjLy92Ml8yL1htbFRhYmxlXzJfMiIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFRhYmxlR2VuZXJhdG9yIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbFRhYmxlR2VuZXJhdG9yICMvL3YyXzIvWG1sVGFibGVHZW5lcmF0b3JfMl8yIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbiIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9BYnN0cmFjdFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uICMvL3YyXzMvWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxUaW1lT2ZEYXkiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJob3VyIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludE9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaW51dGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlY29uZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWlsbGlzZWNvbmQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFRyYW5zZm9ybWF0aW9uIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL0Fic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyAjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVHJhbnNpZW50IiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbFRyYW5zaWVudCAjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVHlwZUNvbnZlcnRlciIgZVN1cGVyVHlwZXM9IiMvL1htbE5hbWVkQ29udmVydGVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF0YVR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9iamVjdFR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFR5cGVNYXBwaW5nIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxUeXBlTWFwcGluZyAjLy92Ml8xL1htbFR5cGVNYXBwaW5nXzJfMSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFVuaW9uUGFydGl0aW9uaW5nIiBlU3VwZXJUeXBlcz0iIy8vdjJfMi9YbWxVbmlvblBhcnRpdGlvbmluZ18yXzIiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxWYWx1ZVBhcnRpdGlvbmluZyIgZVN1cGVyVHlwZXM9IiMvL3YyXzIvWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVmFyaWFibGVPbmVUb09uZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sQXR0cmlidXRlTWFwcGluZyAjLy92Ml8yL1htbFZhcmlhYmxlT25lVG9PbmVfMl8yIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFyZ2V0SW50ZXJmYWNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxWZXJzaW9uIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbFZlcnNpb24gIy8vdjJfMi9YbWxWZXJzaW9uXzJfMiAjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbE11dGFibGUgIy8vWG1sQ29udmVydGlibGVNYXBwaW5nICMvL1htbENvbnZlcnRlckNvbnRhaW5lciIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iQ2FjaGVDb29yZGluYXRpb25UeXBlIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlNFTkRfT0JKRUNUX0NIQU5HRVMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJOT05FIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkNhY2hlVHlwZSI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJGVUxMIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJXRUFLIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU09GVCIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlNPRlRfV0VBSyIgdmFsdWU9IjMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkhBUkRfV0VBSyIgdmFsdWU9IjQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNBQ0hFIiB2YWx1ZT0iNSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTk9ORSIgdmFsdWU9IjYiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJYbWxDaGFuZ2VUcmFja2luZ1R5cGUiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQVRUUklCVVRFIiBsaXRlcmFsPSJBVFRSSUJVVEUiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik9CSkVDVCIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkRFRkVSUkVEIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQVVUTyIgdmFsdWU9IjMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJYbWxEaXJlY3Rpb24iPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU4iLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik9VVCIgdmFsdWU9IjEiIGxpdGVyYWw9Ik9VVCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU5fT1VUIiB2YWx1ZT0iMiIgbGl0ZXJhbD0iSU5fT1VUIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJPVVRfQ1VSU09SIiB2YWx1ZT0iMyIgbGl0ZXJhbD0iT1VUX0NVUlNPUiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkV4aXN0ZW5jZVR5cGUiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ0hFQ0tfQ0FDSEUiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNIRUNLX0RBVEFCQVNFIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQVNTVU1FX0VYSVNURU5DRSIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkFTU1VNRV9OT05fRVhJU1RFTkNFIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlhtbEpvaW5GZXRjaFR5cGUiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU5ORVIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik9VVEVSIiB2YWx1ZT0iMSIgbGl0ZXJhbD0iT1VURVIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQUxMX0NPTFVNTlMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNIQU5HRURfQ09MVU1OUyIgdmFsdWU9IjEiIGxpdGVyYWw9IkNIQU5HRURfQ09MVU1OUyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU0VMRUNURURfQ09MVU1OUyIgdmFsdWU9IjIiIGxpdGVyYWw9IlNFTEVDVEVEX0NPTFVNTlMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlZFUlNJT05fQ09MVU1OIiB2YWx1ZT0iMyIgbGl0ZXJhbD0iVkVSU0lPTl9DT0xVTU4iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlU3VicGFja2FnZXMgbmFtZT0idjFfMSIgbnNVUkk9ImpwdC5lY2xpcHNlbGluay5vcm0udjFfMS54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEiPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQmFzaWNfMV8xIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgICBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbEdlbmVyYXRvckNvbnRhaW5lciI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ2VuZXJhdGVkVmFsdWUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbEdlbmVyYXRlZFZhbHVlIgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVudGl0eV8xXzEiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByaW1hcnlLZXkiIGVUeXBlPSIjLy9YbWxQcmltYXJ5S2V5IgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJpbWFyeUtleSIgZVR5cGU9IiMvL1htbFByaW1hcnlLZXkiCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFByaW1hcnlLZXlfMV8xIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWxpZGF0aW9uIiBlVHlwZT0iIy8vdjFfMS9JZFZhbGlkYXRpb25UeXBlXzFfMSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbHVtbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbENvbHVtbiIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IklkVmFsaWRhdGlvblR5cGVfMV8xIj4KLSAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iTlVMTCIvPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJaRVJPIiB2YWx1ZT0iMiIvPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJOT05FIiB2YWx1ZT0iMiIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICA8L2VTdWJwYWNrYWdlcz4KLSAgPGVTdWJwYWNrYWdlcyBuYW1lPSJ2Ml8wIiBuc1VSST0ianB0LmVjbGlwc2VsaW5rLm9ybS52Ml8wLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMCI+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy92Ml8wL1htbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wICMvL1htbENvbnZlcnRlckNvbnRhaW5lciI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFwS2V5Q29udmVydCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sQ29udmVydGlibGVNYXBwaW5nICMvL3YyXzAvWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wIi8+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbnRpdHlfMl8wIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYWNoZUludGVyY2VwdG9yIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxDbGFzc1JlZmVyZW5jZSIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icXVlcnlSZWRpcmVjdG9ycyIgZVR5cGU9IiMvL1htbFF1ZXJ5UmVkaXJlY3RvcnMiCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFueVRvTWFueV8yXzAiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy92Ml8wL1htbENvbGxlY3Rpb25NYXBwaW5nXzJfMCIvPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAiCi0gICAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzIgotICAgICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlIgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy92Ml8wL1htbENhY2hlYWJsZV8yXzAiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhY2hlSW50ZXJjZXB0b3IiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbENsYXNzUmVmZXJlbmNlIgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE9uZVRvTWFueV8yXzAiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy92Ml8wL1htbENvbGxlY3Rpb25NYXBwaW5nXzJfMCIvPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT3JkZXJDb2x1bW5fMl8wIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3JyZWN0aW9uVHlwZSIgZVR5cGU9IiMvL3YyXzAvT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbGxRdWVyaWVzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlYWRBbGwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhZE9iamVjdCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXBvcnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXBkYXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imluc2VydCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWxldGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9Ik9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIj4KLSAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iUkVBRCIvPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJSRUFEX1dSSVRFIiB2YWx1ZT0iMSIvPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJFWENFUFRJT04iIHZhbHVlPSIyIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDwvZVN1YnBhY2thZ2VzPgotICA8ZVN1YnBhY2thZ2VzIG5hbWU9InYyXzEiIG5zVVJJPSJqcHQuZWNsaXBzZWxpbmsub3JtLnYyXzEueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xIj4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEJhc2ljXzJfMSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmV0dXJuSW5zZXJ0IiBlVHlwZT0iIy8vWG1sUmV0dXJuSW5zZXJ0IgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXR1cm5VcGRhdGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQmF0Y2hGZXRjaF8yXzEiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNpemUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmF0Y2hGZXRjaFR5cGUiIGVUeXBlPSIjLy92Ml8xL0JhdGNoRmV0Y2hUeXBlXzJfMSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vWG1sSm9pbkZldGNoICMvL1htbEJhdGNoRmV0Y2hIb2xkZXIiLz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVudGl0eV8yXzEiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICAgIGVTdXBlclR5cGVzPSIjLy92Ml8xL1htbFR5cGVNYXBwaW5nXzJfMSAjLy92Ml8xL1htbEZldGNoR3JvdXBDb250YWluZXJfMl8xIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjbGFzc0V4dHJhY3RvciIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sQ2xhc3NSZWZlcmVuY2UiCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW50aXR5TWFwcGluZ3NfMl8xIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vWG1sQWNjZXNzTWV0aG9kc0hvbGRlciIvPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRmV0Y2hHcm91cF8yXzEiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9hZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXR0cmlidXRlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgICAgZVR5cGU9IiMvL1htbEZldGNoQXR0cmlidXRlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZmV0Y2hHcm91cHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICAgIGVUeXBlPSIjLy9YbWxGZXRjaEdyb3VwIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYW55VG9NYW55XzJfMSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbEJhdGNoRmV0Y2hIb2xkZXIiLz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hbnlUb09uZV8yXzEiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9YbWxCYXRjaEZldGNoSG9sZGVyIi8+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIC4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciAjLy92Ml8xL1htbEZldGNoR3JvdXBDb250YWluZXJfMl8xIC4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxHZW5lcmF0b3JDb250YWluZXIgLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbFF1ZXJ5Q29udGFpbmVyICMvL1htbFF1ZXJ5Q29udGFpbmVyICMvL3YyXzEvWG1sVHlwZU1hcHBpbmdfMl8xIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzcWxSZXN1bHRTZXRNYXBwaW5ncyIKLSAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vU3FsUmVzdWx0U2V0TWFwcGluZyIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icXVlcnlSZWRpcmVjdG9ycyIgZVR5cGU9IiMvL1htbFF1ZXJ5UmVkaXJlY3RvcnMiCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT25lVG9NYW55XzJfMSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbEJhdGNoRmV0Y2hIb2xkZXIiLz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE9uZVRvT25lXzJfMSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAgICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbEJhdGNoRmV0Y2hIb2xkZXIiLz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbEFjY2Vzc01ldGhvZHNIb2xkZXIiLz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFByaW1hcnlLZXlfMl8xIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYWNoZUtleVR5cGUiIGVUeXBlPSIjLy92Ml8xL0NhY2hlS2V5VHlwZV8yXzEiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFJldHVybkluc2VydF8yXzEiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJldHVybk9ubHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVHlwZU1hcHBpbmdfMl8xIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vWG1sQWNjZXNzTWV0aG9kc0hvbGRlciI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFyZW50Q2xhc3MiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkNhY2hlS2V5VHlwZV8yXzEiPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJJRF9WQUxVRSIgbGl0ZXJhbD0iSURfVkFMVUUiLz4KLSAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ0FDSEVfS0VZIiB2YWx1ZT0iMSIvPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJBVVRPIiB2YWx1ZT0iMiIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJCYXRjaEZldGNoVHlwZV8yXzEiPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJKT0lOIi8+Ci0gICAgICA8ZUxpdGVyYWxzIG5hbWU9IkVYSVNUUyIgdmFsdWU9IjEiLz4KLSAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU4iIHZhbHVlPSIyIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDwvZVN1YnBhY2thZ2VzPgotICA8ZVN1YnBhY2thZ2VzIG5hbWU9InYyXzIiIG5zVVJJPSJqcHQuZWNsaXBzZWxpbmsub3JtLnYyXzIueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yIj4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyaXRlcmlhIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQmFzaWNfMl8yIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmRleCIgZVR5cGU9IiMvL3YyXzIvWG1sSW5kZXhfMl8yIgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxCYXNpY0NvbGxlY3Rpb25fMl8yIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXNjYWRlT25EZWxldGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQmFzaWNNYXBfMl8yIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXNjYWRlT25EZWxldGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ2FjaGVfMl8yIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc29sYXRpb24iIGVUeXBlPSIjLy92Ml8yL0NhY2hlSXNvbGF0aW9uVHlwZSIKLSAgICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENvbGxlY3Rpb25UYWJsZV8yXzIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyZWF0aW9uU3VmZml4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRWxlbWVudENvbGxlY3Rpb25fMl8yIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vdjJfMi9YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhc2NhZGVPbkRlbGV0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm9uY2FjaGVhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVtYmVkZGFibGVfMl8yIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIC4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIi8+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbnRpdHlfMl8yIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgICBlU3VwZXJUeXBlcz0iIy8vdjJfMi9YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZGl0aW9uYWxDcml0ZXJpYSIgZVR5cGU9IiMvL3YyXzIvWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMiIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhc2NhZGVPbkRlbGV0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5kZXgiIGVUeXBlPSIjLy92Ml8yL1htbEluZGV4XzJfMiIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW50aXR5TWFwcGluZ3NfMl8yIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwYXJ0aXRpb25pbmciIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICAgIGVUeXBlPSIjLy92Ml8yL1htbFBhcnRpdGlvbmluZ18yXzIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVwbGljYXRpb25QYXJ0aXRpb25pbmciCi0gICAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy92Ml8yL1htbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb3VuZFJvYmluUGFydGl0aW9uaW5nIgotICAgICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vdjJfMi9YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwaW5uZWRQYXJ0aXRpb25pbmciIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICAgIGVUeXBlPSIjLy92Ml8yL1htbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmFuZ2VQYXJ0aXRpb25pbmciIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICAgIGVUeXBlPSIjLy92Ml8yL1htbFJhbmdlUGFydGl0aW9uaW5nXzJfMiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWx1ZVBhcnRpdGlvbmluZyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgICAgZVR5cGU9IiMvL3YyXzIvWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imhhc2hQYXJ0aXRpb25pbmciIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICAgIGVUeXBlPSIjLy92Ml8yL1htbEhhc2hQYXJ0aXRpb25pbmdfMl8yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InVuaW9uUGFydGl0aW9uaW5nIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgICBlVHlwZT0iIy8vdjJfMi9YbWxVbmlvblBhcnRpdGlvbmluZ18yXzIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbElkXzJfMiIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5kZXgiIGVUeXBlPSIjLy92Ml8yL1htbEluZGV4XzJfMiIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sSW5kZXhfMl8yIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjaGVtYSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXRhbG9nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuaXF1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29sdW1uTmFtZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxKb2luVGFibGVfMl8yIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcmVhdGlvblN1ZmZpeCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hbnlUb01hbnlfMl8yIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vdjJfMi9YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhc2NhZGVPbkRlbGV0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm9uQ2FjaGVhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hbnlUb09uZV8yXzIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy92Ml8yL1htbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm9uQ2FjaGVhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vdjJfMi9YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZGl0aW9uYWxDcml0ZXJpYSIgZVR5cGU9IiMvL3YyXzIvWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMiIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT25lVG9PbmVfMl8yIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgICBlU3VwZXJUeXBlcz0iIy8vdjJfMi9YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhc2NhZGVPbkRlbGV0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm9uQ2FjaGVhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE9uZVRvTWFueV8yXzIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy92Ml8yL1htbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FzY2FkZU9uRGVsZXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub25jYWNoZWFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUGFydGl0aW9uaW5nXzJfMiIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGFydGl0aW9uaW5nIiBlVHlwZT0iIy8vdjJfMi9YbWxQYXJ0aXRpb25pbmdfMl8yIgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVwbGljYXRpb25QYXJ0aXRpb25pbmciCi0gICAgICAgICAgZVR5cGU9IiMvL3YyXzIvWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvdW5kUm9iaW5QYXJ0aXRpb25pbmciCi0gICAgICAgICAgZVR5cGU9IiMvL3YyXzIvWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGlubmVkUGFydGl0aW9uaW5nIiBlVHlwZT0iIy8vdjJfMi9YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmFuZ2VQYXJ0aXRpb25pbmciIGVUeXBlPSIjLy92Ml8yL1htbFJhbmdlUGFydGl0aW9uaW5nXzJfMiIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlUGFydGl0aW9uaW5nIiBlVHlwZT0iIy8vdjJfMi9YbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIiCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJoYXNoUGFydGl0aW9uaW5nIiBlVHlwZT0iIy8vdjJfMi9YbWxIYXNoUGFydGl0aW9uaW5nXzJfMiIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InVuaW9uUGFydGl0aW9uaW5nIiBlVHlwZT0iIy8vdjJfMi9YbWxVbmlvblBhcnRpdGlvbmluZ18yXzIiCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXJ0aXRpb25lZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFNlY29uZGFyeVRhYmxlXzJfMiIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JlYXRpb25TdWZmaXgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxUYWJsZV8yXzIiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyZWF0aW9uU3VmZml4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVGFibGVHZW5lcmF0b3JfMl8yIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcmVhdGlvblN1ZmZpeCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFZhcmlhYmxlT25lVG9PbmVfMl8yIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vdjJfMi9YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vbkNhY2hlYWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxWZXJzaW9uXzJfMiIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5kZXgiIGVUeXBlPSIjLy92Ml8yL1htbEluZGV4XzJfMiIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJDYWNoZUlzb2xhdGlvblR5cGUiPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJTSEFSRUQiLz4KLSAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iUFJPVEVDVEVEIiB2YWx1ZT0iMSIgbGl0ZXJhbD0iUFJPVEVDVEVEIi8+Ci0gICAgICA8ZUxpdGVyYWxzIG5hbWU9IklTT0xBVEVEIiB2YWx1ZT0iMiIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICA8L2VTdWJwYWNrYWdlcz4KLSAgPGVTdWJwYWNrYWdlcyBuYW1lPSJ2Ml8zIiBuc1VSST0ianB0LmVjbGlwc2VsaW5rLm9ybS52Ml8zLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMyI+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxBcnJheV8yXzMiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICAgIGVTdXBlclR5cGVzPSIjLy9YbWxDb252ZXJ0ZXJDb250YWluZXIgLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbENvbnZlcnRpYmxlTWFwcGluZyAuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vQ29sdW1uTWFwcGluZyI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF0YWJhc2VUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhcmdldENsYXNzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQXR0cmlidXRlc18yXzMiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN0cnVjdHVyZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICAgIGVUeXBlPSIjLy92Ml8zL1htbFN0cnVjdHVyZV8yXzMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhcnJheXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICAgIGVUeXBlPSIjLy92Ml8zL1htbEFycmF5XzJfMyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRWxlbWVudENvbGxlY3Rpb25fMl8zIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb21wb3NpdGVNZW1iZXIiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbWJlZGRhYmxlXzJfMyIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGxzcWxSZWNvcmRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgICBlVHlwZT0iIy8vdjJfMy9YbWxQbHNxbFJlY29yZF8yXzMiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGxzcWxUYWJsZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICAgIGVUeXBlPSIjLy9YbWxQbHNxbFRhYmxlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN0cnVjdCIgZVR5cGU9IiMvL3YyXzMvWG1sU3RydWN0XzJfMyIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW50aXR5XzJfMyIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAgICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbE11bHRpdGVuYW50SG9sZGVyIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcyIKLSAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL3YyXzMvWG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzIgotICAgICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vdjJfMy9YbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMiCi0gICAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy92Ml8zL1htbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzMiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGxzcWxSZWNvcmRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgICBlVHlwZT0iIy8vdjJfMy9YbWxQbHNxbFJlY29yZF8yXzMiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGxzcWxUYWJsZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICAgIGVUeXBlPSIjLy9YbWxQbHNxbFRhYmxlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN0cnVjdCIgZVR5cGU9IiMvL3YyXzMvWG1sU3RydWN0XzJfMyIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW50aXR5TWFwcGluZ3NfMl8zIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyIKLSAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL3YyXzMvWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMiCi0gICAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy92Ml8zL1htbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcyIKLSAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL3YyXzMvWG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzIgotICAgICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vdjJfMy9YbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBsc3FsUmVjb3JkcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgICAgZVR5cGU9IiMvL3YyXzMvWG1sUGxzcWxSZWNvcmRfMl8zIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBsc3FsVGFibGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgICBlVHlwZT0iIy8vWG1sUGxzcWxUYWJsZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vWG1sTXVsdGl0ZW5hbnRIb2xkZXIiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyaWVzIgotICAgICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vdjJfMy9YbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMiCi0gICAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy92Ml8zL1htbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcyIKLSAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL3YyXzMvWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfMyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwbHNxbFJlY29yZHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICAgIGVUeXBlPSIjLy92Ml8zL1htbFBsc3FsUmVjb3JkXzJfMyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwbHNxbFRhYmxlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgICAgZVR5cGU9IiMvL1htbFBsc3FsVGFibGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNdWx0aXRlbmFudF8yXzMiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSIjLy92Ml8zL011bHRpdGVuYW50VHlwZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zIgotICAgICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vdjJfMy9YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMyIKLSAgICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzMiCi0gICAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8zIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyIKLSAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL3YyXzMvWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQbHNxbFJlY29yZF8yXzMiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQbHNxbFRhYmxlXzJfMyIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFN0cnVjdF8yXzMiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMyIKLSAgICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbiI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29udGV4dFByb3BlcnR5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByaW1hcnlLZXkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0Ii8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxTdHJ1Y3R1cmVfMl8zIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIi8+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9Ik11bHRpdGVuYW50VHlwZSI+Ci0gICAgICA8ZUxpdGVyYWxzIG5hbWU9IlNJTkdMRV9UQUJMRSIvPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJUQUJMRV9QRVJfVEVOQU5UIiB2YWx1ZT0iMSIgbGl0ZXJhbD0iVEFCTEVfUEVSX1RFTkFOVCIvPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJWUEQiIHZhbHVlPSIyIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDwvZVN1YnBhY2thZ2VzPgotICA8ZVN1YnBhY2thZ2VzIG5hbWU9InYyXzQiIG5zVVJJPSJqcHQuZWNsaXBzZWxpbmsub3JtLnYyXzQueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80Ij4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEJhc2ljXzJfNCIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2FjaGVJbmRleCIgZVR5cGU9IiMvL3YyXzQvWG1sQ2FjaGVJbmRleF8yXzQiCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENhY2hlXzJfNCIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlIgotICAgICAgICAgIGVUeXBlPSIjLy92Ml80L0RhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDYWNoZUluZGV4XzJfNCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29sdW1uTmFtZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlbGV0ZUFsbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbnRpdHlfMl80IiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYWNoZUluZGV4IiBlVHlwZT0iIy8vdjJfNC9YbWxDYWNoZUluZGV4XzJfNCIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sSWRfMl80IiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYWNoZUluZGV4IiBlVHlwZT0iIy8vdjJfNC9YbWxDYWNoZUluZGV4XzJfNCIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFwcGVkU3VwZXJjbGFzc18yXzQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhY2hlSW5kZXgiIGVUeXBlPSIjLy92Ml80L1htbENhY2hlSW5kZXhfMl80IgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNdWx0aXRlbmFudF8yXzQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImluY2x1ZGVDcml0ZXJpYSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxPbmVUb01hbnlfMl80IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWxldGVBbGwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJEYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUiPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJOT05FIi8+Ci0gICAgICA8ZUxpdGVyYWxzIG5hbWU9IklOVkFMSURBVElPTiIgdmFsdWU9IjEiIGxpdGVyYWw9IklOVkFMSURBVElPTiIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICA8L2VTdWJwYWNrYWdlcz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNzA4MTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKUEEgRWNsaXBzZUxpbmsgU3VwcG9ydCAtIENvcmUKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLUVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVCA9IEVjbGlwc2VMaW5rIFhNTCBtYXBwaW5nIGZpbGVzCi0KLUVDTElQU0VMSU5LX1BMQVRGT1JNX0dST1VQX0xBQkVMPUVjbGlwc2VMaW5rCi1FQ0xJUFNFTElOSzFfMF94X1BMQVRGT1JNID0gRWNsaXBzZUxpbmsgMS4wLngKLUVDTElQU0VMSU5LMV8xX3hfUExBVEZPUk0gPSBFY2xpcHNlTGluayAxLjEueAotRUNMSVBTRUxJTksxXzJfeF9QTEFURk9STSA9IEVjbGlwc2VMaW5rIDEuMi54Ci1FQ0xJUFNFTElOSzJfMF94X1BMQVRGT1JNID0gRWNsaXBzZUxpbmsgMi4wLngKLUVDTElQU0VMSU5LMl8xX3hfUExBVEZPUk0gPSBFY2xpcHNlTGluayAyLjEueAotRUNMSVBTRUxJTksyXzJfeF9QTEFURk9STSA9IEVjbGlwc2VMaW5rIDIuMi54Ci1FQ0xJUFNFTElOSzJfM194X1BMQVRGT1JNID0gRWNsaXBzZUxpbmsgMi4zLngKLUVDTElQU0VMSU5LMl80X3hfUExBVEZPUk0gPSBFY2xpcHNlTGluayAyLjQueAotCi1idWlsZGVyTmFtZSA9IEVjbGlwc2VsaW5rIFN0YXRpYyBXZWF2aW5nIEJ1aWxkZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NTg3MjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0KLSAgQ29udHJpYnV0b3JzOgotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIC0tPgotCi08cGx1Z2luPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUuY29udGVudFR5cGVzIj4KLQkJCi0JCTxjb250ZW50LXR5cGUKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGVudC5vcm0iCi0JCQluYW1lPSIlRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGVudC5tYXBwaW5nRmlsZSI+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LlhNTFJvb3RFbGVtZW50Q29udGVudERlc2NyaWJlcjIiPgotCQkJCTxwYXJhbWV0ZXIgCi0JCQkJCW5hbWU9ImVsZW1lbnQiIAotCQkJCQl2YWx1ZT0ie2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm19ZW50aXR5LW1hcHBpbmdzIi8+Ci0JCQk8L2Rlc2NyaWJlcj4KLQkJPC9jb250ZW50LXR5cGU+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGFQbGF0Zm9ybXMiPgotCQkKLQkJPGpwYVBsYXRmb3JtR3JvdXAKLSAgICAgICAgCWlkPSJlY2xpcHNlbGluayIKLSAgICAgICAgCWxhYmVsPSIlRUNMSVBTRUxJTktfUExBVEZPUk1fR1JPVVBfTEFCRUwiLz4KLQkJCi0JCTxqcGFQbGF0Zm9ybQotCQkJaWQ9Im9yZy5lY2xpcHNlLmVjbGlwc2VsaW5rLnBsYXRmb3JtIgotICAgICAgICAgICAgbGFiZWw9IiVFQ0xJUFNFTElOSzFfMF94X1BMQVRGT1JNIgotCQkJZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybUZhY3RvcnkiCi0JCQlncm91cD0iZWNsaXBzZWxpbmsiCi0JCQlqcGFGYWNldFZlcnNpb249IjEuMCIvPgotCSAgICAKLQkgICAgPGpwYVBsYXRmb3JtCi0JICAgICAgICBpZD0iZWNsaXBzZWxpbmsxXzEiCi0JICAgICAgICBsYWJlbD0iJUVDTElQU0VMSU5LMV8xX3hfUExBVEZPUk0iCi0JICAgICAgICBmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtRmFjdG9yeSIKLQkgICAgICAgIGdyb3VwPSJlY2xpcHNlbGluayIKLQkJCWpwYUZhY2V0VmVyc2lvbj0iMS4wIi8+Ci0JICAgIAotCSAgICA8anBhUGxhdGZvcm0KLQkJCWlkPSJlY2xpcHNlbGluazFfMiIKLQkJCWxhYmVsPSIlRUNMSVBTRUxJTksxXzJfeF9QTEFURk9STSIKLQkJCWZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1GYWN0b3J5IgotCQkJZ3JvdXA9ImVjbGlwc2VsaW5rIgotCQkJanBhRmFjZXRWZXJzaW9uPSIxLjAiLz4KLQkJCi0JICAgIDxqcGFQbGF0Zm9ybQotCSAgICAgICAgaWQ9ImVjbGlwc2VsaW5rMl8wIgotCSAgICAgICAgbGFiZWw9IiVFQ0xJUFNFTElOSzJfMF94X1BMQVRGT1JNIgotCSAgICAgICAgZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybUZhY3RvcnkiCi0JICAgICAgICBncm91cD0iZWNsaXBzZWxpbmsiCi0JCQlqcGFGYWNldFZlcnNpb249IjIuMCIvPgotCQkKLQkJPGpwYVBsYXRmb3JtCi0JICAgICAgICBpZD0iZWNsaXBzZWxpbmsyXzEiCi0JICAgICAgICBsYWJlbD0iJUVDTElQU0VMSU5LMl8xX3hfUExBVEZPUk0iCi0JICAgICAgICBmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtRmFjdG9yeSIKLQkgICAgICAgIGdyb3VwPSJlY2xpcHNlbGluayIKLQkJCWpwYUZhY2V0VmVyc2lvbj0iMi4wIi8+Ci0JCQotCQk8anBhUGxhdGZvcm0KLQkgICAgICAgIGlkPSJlY2xpcHNlbGluazJfMiIKLQkgICAgICAgIGxhYmVsPSIlRUNMSVBTRUxJTksyXzJfeF9QTEFURk9STSIKLQkgICAgICAgIGZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rMl8ySnBhUGxhdGZvcm1GYWN0b3J5IgotCSAgICAgICAgZ3JvdXA9ImVjbGlwc2VsaW5rIgotCQkJanBhRmFjZXRWZXJzaW9uPSIyLjAiLz4KLQkJCi0JCTxqcGFQbGF0Zm9ybQotCSAgICAgICAgaWQ9ImVjbGlwc2VsaW5rMl8zIgotCSAgICAgICAgbGFiZWw9IiVFQ0xJUFNFTElOSzJfM194X1BMQVRGT1JNIgotCSAgICAgICAgZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmsyXzNKcGFQbGF0Zm9ybUZhY3RvcnkiCi0JICAgICAgICBncm91cD0iZWNsaXBzZWxpbmsiCi0JCQlqcGFGYWNldFZlcnNpb249IjIuMCIvPgotCQkKLQkJPGpwYVBsYXRmb3JtCi0JICAgICAgICBpZD0iZWNsaXBzZWxpbmsyXzQiCi0JICAgICAgICBsYWJlbD0iJUVDTElQU0VMSU5LMl80X3hfUExBVEZPUk0iCi0JICAgICAgICBmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGluazJfNEpwYVBsYXRmb3JtRmFjdG9yeSIKLQkgICAgICAgIGdyb3VwPSJlY2xpcHNlbGluayIKLQkJCWpwYUZhY2V0VmVyc2lvbj0iMi4wIi8+Ci0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnJhcnlWYWxpZGF0b3JzIj4KLQkJCi0JCTxsaWJyYXJ5VmFsaWRhdG9yCi0JCQlpZD0iZWNsaXBzZWxpbmtMaWJyYXJ5VmFsaWRhdG9yIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5saWJ2YWwuRWNsaXBzZUxpbmtVc2VyTGlicmFyeVZhbGlkYXRvciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8YW5kPgotCQkJCQk8d2l0aCB2YXJpYWJsZT0ibGlicmFyeVByb3ZpZGVyIj4KLQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuZXh0ZW5kc0lkIgotCQkJCQkJCXZhbHVlPSJqcGEtdXNlci1saWJyYXJ5LXByb3ZpZGVyIi8+Ci0JCQkJCTwvd2l0aD4KLQkJCQkJPHdpdGggdmFyaWFibGU9ImNvbmZpZyI+Ci0JCQkJCQk8YWRhcHQgdHlwZSA9ICJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiI+Ci0JCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGFQbGF0Zm9ybUdyb3VwIgotCQkJCQkJCQl2YWx1ZT0iZWNsaXBzZWxpbmsiLz4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvd2l0aD4KLQkJCQk8L2FuZD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9saWJyYXJ5VmFsaWRhdG9yPgotCQkKLQkJPGxpYnJhcnlWYWxpZGF0b3IKLQkJCWlkPSJlY2xpcHNlbGlua0VjbGlwc2VsaW5rQnVuZGxlc0xpYnJhcnlWYWxpZGF0b3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmxpYnZhbC5FY2xpcHNlTGlua0VjbGlwc2VMaW5rQnVuZGxlc0xpYnJhcnlWYWxpZGF0b3IiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPGFuZD4KLQkJCQkJPHdpdGggdmFyaWFibGU9ImxpYnJhcnlQcm92aWRlciI+Ci0JCQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmV4dGVuZHNJZCIKLQkJCQkJCQl2YWx1ZT0iZWNsaXBzZWxpbmstYnVuZGxlcy1saWJyYXJ5LXByb3ZpZGVyIi8+Ci0JCQkJCTwvd2l0aD4KLQkJCQkJPHdpdGggdmFyaWFibGU9ImNvbmZpZyI+Ci0JCQkJCQk8YWRhcHQgdHlwZSA9ICJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiI+Ci0JCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGFQbGF0Zm9ybUdyb3VwIgotCQkJCQkJCQl2YWx1ZT0iZWNsaXBzZWxpbmsiLz4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvd2l0aD4KLQkJCQk8L2FuZD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9saWJyYXJ5VmFsaWRhdG9yPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uIAotCQlwb2ludD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicmFyeVByb3ZpZGVycyI+Ci0JCQotCQk8cHJvdmlkZXIgCi0JCQlpZD0ianBhLWVjbGlwc2VsaW5rMV8wLXVzZXItbGlicmFyeS1wcm92aWRlciIgCi0JCQlleHRlbmRzPSJqcGEtZGVwcmVjYXRlZC11c2VyLWxpYnJhcnktcHJvdmlkZXIiCi0JCQloaWRkZW49InRydWUiPgotCQk8L3Byb3ZpZGVyPgotCQkKLQkJPHByb3ZpZGVyIAotCQkJaWQ9ImpwYS1lY2xpcHNlbGluazFfMS11c2VyLWxpYnJhcnktcHJvdmlkZXIiIAotCQkJZXh0ZW5kcz0ianBhLWRlcHJlY2F0ZWQtdXNlci1saWJyYXJ5LXByb3ZpZGVyIgotCQkJaGlkZGVuPSJ0cnVlIj4KLQkJPC9wcm92aWRlcj4KLQkJCi0JCTxwcm92aWRlciAKLQkJCWlkPSJqcGEtZWNsaXBzZWxpbmsxXzItdXNlci1saWJyYXJ5LXByb3ZpZGVyIiAKLQkJCWV4dGVuZHM9ImpwYS1kZXByZWNhdGVkLXVzZXItbGlicmFyeS1wcm92aWRlciIKLQkJCWhpZGRlbj0idHJ1ZSI+Ci0JCTwvcHJvdmlkZXI+Ci0JCQotCQk8cHJvdmlkZXIgCi0JCQlpZD0iZWNsaXBzZWxpbmsyXzAtdXNlci1saWJyYXJ5LXByb3ZpZGVyIiAKLQkJCWV4dGVuZHM9ImpwYS1kZXByZWNhdGVkLXVzZXItbGlicmFyeS1wcm92aWRlciIKLQkJCWhpZGRlbj0idHJ1ZSI+Ci0JCTwvcHJvdmlkZXI+Ci0JCQotCQk8cHJvdmlkZXIgCi0JCQlpZD0ianBhLWVjbGlwc2VsaW5rMl8xLXVzZXItbGlicmFyeS1wcm92aWRlciIgCi0JCQlleHRlbmRzPSJqcGEtZGVwcmVjYXRlZC11c2VyLWxpYnJhcnktcHJvdmlkZXIiCi0JCQloaWRkZW49InRydWUiPgotCQk8L3Byb3ZpZGVyPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uIAotCQlpZD0iYnVpbGRlciIgCi0JCW5hbWU9IiVidWlsZGVyTmFtZSIKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmJ1aWxkZXJzIj4KLQkJCi0JCTxidWlsZGVyIGhhc05hdHVyZT0iZmFsc2UiPgotCQkJPHJ1biBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmJ1aWxkZXIuRWNsaXBzZUxpbmtTdGF0aWNXZWF2aW5nQnVpbGRlciIvPgotCQk8L2J1aWxkZXI+Ci0JPC9leHRlbnNpb24+Ci0JCi0JCi0JCi0JPCEtLSAqKioqKiBXVFAgZXh0ZW5zaW9ucyAqKioqKiAtLT4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5yZXNvdXJjZUZhY3RvcmllcyI+Ci0JCQotCQk8cmVzb3VyY2VGYWN0b3J5Ci0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVhtbFJlc291cmNlRmFjdG9yeSIKLQkJCWlzRGVmYXVsdD0idHJ1ZSI+Ci0JCQk8Y29udGVudFR5cGVCaW5kaW5nCi0JCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRlbnQub3JtIj4KLQkJCTwvY29udGVudFR5cGVCaW5kaW5nPgotCQk8L3Jlc291cmNlRmFjdG9yeT4KLQkgICAgCi0JPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9wcm9wZXJ0eV9maWxlcy9lY2xpcHNlbGlua19qcGFfdmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3Byb3BlcnR5X2ZpbGVzL2VjbGlwc2VsaW5rX2pwYV92YWxpZGF0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZTg0MDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3Byb3BlcnR5X2ZpbGVzL2VjbGlwc2VsaW5rX2pwYV92YWxpZGF0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQ0FDSEVfRVhQSVJZX0FORF9FWFBJUllfVElNRV9PRl9EQVlfQk9USF9TUEVDSUZJRUQ9VGhlIEBDYWNoZSBhbm5vdGF0aW9uIG9uIGVudGl0eSBcInswfVwiIGhhcyBib3RoIGV4cGlyeSgpIGFuZCBleHBpcnlUaW1lT2ZEYXkoKSBzcGVjaWZpZWQuIE9ubHkgb25lIG9mIHRoZSB0d28gbWF5IGJlIHNwZWNpZmllZAotQ09OVkVSVEVSX0NMQVNTX0VYSVNUUz1UaGUgY29udmVydGVyIGNsYXNzIFwiezB9XCIgZG9lcyBub3QgZXhpc3Qgb24gdGhlIHByb2plY3QgY2xhc3NwYXRoCi1DT05WRVJURVJfQ0xBU1NfREVGSU5FRD1UaGUgY29udmVydGVyIGNsYXNzIG11c3QgYmUgZGVmaW5lZC4KLUNPTlZFUlRFUl9DTEFTU19JTVBMRU1FTlRTX0NPTlZFUlRFUj1UaGUgY29udmVydGVyIGNsYXNzIFwiezB9XCIgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlciBpbnRlcmZhY2UKLVNUUlVDVF9DT05WRVJURVJfQ0xBU1NfSU1QTEVNRU5UU19TVFJVQ1RfQ09OVkVSVEVSPVRoZSBzdHJ1Y3QgY29udmVydGVyIGNsYXNzIFwiezB9XCIgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5kYXRhYmFzZS5jb252ZXJ0ZXJzLlN0cnVjdENvbnZlcnRlciBpbnRlcmZhY2UKLUNPTlZFUlRFUl9EVVBMSUNBVEVfTkFNRT1NdWx0aXBsZSBjb252ZXJ0ZXJzIG5hbWVkIFwiezB9XCIgZGVmaW5lZCBpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQKLUNPTlZFUlRFUl9OQU1FX1VOREVGSU5FRD1Db252ZXJ0ZXIgaXMgdW5uYW1lZC4gQWxsIGNvbnZlcnRlcnMgcmVxdWlyZSBhIG5hbWUuCi1SRVNFUlZFRF9DT05WRVJURVJfTkFNRT1Db252ZXJ0ZXIgbmFtZSBtdXN0IG5vdCBiZSBhIHJlc2VydmVkIGNvbnZlcnRlciBuYW1lLgotREVTQ1JJUFRPUl9DVVNUT01JWkVSX0NMQVNTX05PVF9TUEVDSUZJRUQ9QW4gZW50aXR5IGN1c3RvbWl6ZXIgY2xhc3Mgc2hvdWxkIGJlIHNwZWNpZmllZAotREVTQ1JJUFRPUl9DVVNUT01JWkVSX0NMQVNTX05PVF9FWElTVD1UaGUgZW50aXR5IGN1c3RvbWl6ZXIgY2xhc3MgXCJ7MH1cIiBkb2VzIG5vdCBleGlzdCBvbiB0aGUgcHJvamVjdCBjbGFzc3BhdGgKLURFU0NSSVBUT1JfQ1VTVE9NSVpFUl9DTEFTU19OT1RfVkFMSUQ9VGhlIGVudGl0eSBjdXN0b21pemVyIGNsYXNzIFwiezB9XCIgbXVzdCBoYXZlIGEgcHVibGljLCB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi1ERVNDUklQVE9SX0NVU1RPTUlaRVJfQ0xBU1NfSU1QTEVNRU5UU19ERVNDUklQVE9SX0NVU1RPTUlaRVI9VGhlIGVudGl0eSBjdXN0b21pemVyIGNsYXNzIFwiezB9XCIgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb25maWcuRGVzY3JpcHRvckN1c3RvbWl6ZXIgaW50ZXJmYWNlCi1FWENFUFRJT05fSEFORExFUl9DTEFTU19OT1RfU1BFQ0lGSUVEPUFuIGV4Y2VwdGlvbiBoYW5kbGVyIGNsYXNzIHNob3VsZCBiZSBzcGVjaWZpZWQKLUVYQ0VQVElPTl9IQU5ETEVSX0NMQVNTX05PVF9FWElTVD1UaGUgZXhjZXB0aW9uIGhhbmRsZXIgY2xhc3MgXCJ7MH1cIiBkb2VzIG5vdCBleGlzdCBvbiB0aGUgcHJvamVjdCBjbGFzc3BhdGgKLUVYQ0VQVElPTl9IQU5ETEVSX0NMQVNTX05PVF9WQUxJRD1UaGUgZXhjZXB0aW9uIGhhbmRsZXIgY2xhc3MgXCJ7MH1cIiBtdXN0IGhhdmUgYSBwdWJsaWMsIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLUVYQ0VQVElPTl9IQU5ETEVSX0NMQVNTX0lNUExFTUVOVFNfRVhDRVBUSU9OX0hBTkRMRVI9VGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGNsYXNzIFwiezB9XCIgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5leGNlcHRpb25zLkV4Y2VwdGlvbkhhbmRsZXIgaW50ZXJmYWNlCi1HRU5FUkFUT1JfRFVQTElDQVRFX05BTUU9TXVsdGlwbGUgZ2VuZXJhdG9ycyBuYW1lZCBcInswfVwiIGRlZmluZWQgaW4gdGhpcyBwZXJzaXN0ZW5jZSB1bml0Ci1HRU5FUkFUT1JfRVFVSVZBTEVOVD1FcXVpdmFsZW50IGdlbmVyYXRvciBcInswfVwiIGRlZmluZWQgaW4gdGhpcyBwZXJzaXN0ZW5jZSB1bml0LCB3aGljaCBtYXkgbm90IGJlIHBvcnRhYmxlCi1JRF9NQVBQSU5HX1VOUkVTT0xWRURfQ09OVkVSVEVSX05BTUU9VGhlIHNwZWNpZmllZCBjb252ZXJ0ZXIgXCJ7MH1cIiBmb3IgbWFwcGluZyBcInsxfVwiIGNhbm5vdCBiZSByZXNvbHZlZAotTVVMVElQTEVfT0JKRUNUX1ZBTFVFU19GT1JfREFUQV9WQUxVRT1NdWx0aXBsZSBvYmplY3QgdmFsdWVzIGFyZSBzcGVjaWZpZWQgZm9yIHRoZSBkYXRhIHZhbHVlIFwiezB9XCIKLVBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfVkVSU0lPTl9NQVBQSU5HX1RZUEU9VGhlIHBlcnNpc3RlbnQgZmllbGQgb3IgcHJvcGVydHkgZm9yIGEgVmVyc2lvbiBtYXBwaW5nIG11c3QgYmUgb2YgdHlwZSBpbnQsIEludGVnZXIsIHNob3J0LCBTaG9ydCwgbG9uZywgTG9uZywgb3IgVGltZXN0YW1wCi1QRVJTSVNURU5DRV9VTklUX0xFR0FDWV9ERVNDUklQVE9SX0NVU1RPTUlaRVI9XCJ7MH1cIiBpcyBhIGxlZ2FjeSBkZXNjcmlwdG9yIGN1c3RvbWl6ZXIgcHJvcGVydHkuIENvbnNpZGVyIG1pZ3JhdGlvbiB0byB0aGUgRWNsaXBzZUxpbmsgY3VzdG9taXplciBzZXR0aW5ncyB2aWEgYW5ub3RhdGlvbiBvciBYTUwgbWFwcGluZyBmaWxlCi1QRVJTSVNURU5DRV9VTklUX0xFR0FDWV9FTlRJVFlfQ0FDSElORz1cInswfVwiIGlzIGEgbGVnYWN5IGVudGl0eSBjYWNoaW5nIHByb3BlcnR5LiBDb25zaWRlciBtaWdyYXRpb24gdG8gSlBBIDIuMCBhbmQgRWNsaXBzZUxpbmsgY2FjaGUgc2V0dGluZ3MgdmlhIGFubm90YXRpb24gb3IgWE1MIG1hcHBpbmcgZmlsZQotUEVSU0lTVEVOQ0VfVU5JVF9DQUNISU5HX1BST1BFUlRZX0lHTk9SRUQ9UHJvcGVydHkgXCJ7MH1cIiB3aWxsIGJlIGlnbm9yZWQgYXMgc2hhcmVkLWNhY2hlLW1vZGUgaXMgc2V0IHRvIE5PTkUKLVFVRVJZX0RVUExJQ0FURV9OQU1FPU11bHRpcGxlIHF1ZXJpZXMgbmFtZWQgXCJ7MH1cIiBkZWZpbmVkIGluIHRoaXMgcGVyc2lzdGVuY2UgdW5pdAotUVVFUllfRVFVSVZBTEVOVD1FcXVpdmFsZW50IHF1ZXJ5IFwiezB9XCIgZGVmaW5lZCBpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQsIHdoaWNoIG1heSBub3QgYmUgcG9ydGFibGUKLVNFU1NJT05fQ1VTVE9NSVpFUl9DTEFTU19OT1RfU1BFQ0lGSUVEPUEgc2Vzc2lvbiBjdXN0b21pemVyIGNsYXNzIHNob3VsZCBiZSBzcGVjaWZpZWQKLVNFU1NJT05fQ1VTVE9NSVpFUl9DTEFTU19OT1RfRVhJU1Q9VGhlIHNlc3Npb24gY3VzdG9taXplciBjbGFzcyBcInswfVwiIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBwcm9qZWN0IGNsYXNzcGF0aAotU0VTU0lPTl9DVVNUT01JWkVSX0NMQVNTX05PVF9WQUxJRD1UaGUgc2Vzc2lvbiBjdXN0b21pemVyIGNsYXNzIFwiezB9XCIgbXVzdCBoYXZlIGEgcHVibGljLCB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi1TRVNTSU9OX0NVU1RPTUlaRVJfQ0xBU1NfSU1QTEVNRU5UU19TRVNTSU9OX0NVU1RPTUlaRVI9VGhlIHNlc3Npb24gY3VzdG9taXplciBjbGFzcyBcInswfVwiIGRvZXMgbm90IGltcGxlbWVudCB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29uZmlnLlNlc3Npb25DdXN0b21pemVyIGludGVyZmFjZQotU0VTU0lPTl9MT0dHRVJfQ0xBU1NfTk9UX1NQRUNJRklFRD1BIHNlc3Npb24gbG9nZ2VyIGNsYXNzIHNob3VsZCBiZSBzcGVjaWZpZWQKLVNFU1NJT05fTE9HR0VSX0NMQVNTX05PVF9FWElTVD1UaGUgc2Vzc2lvbiBsb2dnZXIgY2xhc3MgXCJ7MH1cIiBkb2VzIG5vdCBleGlzdCBvbiB0aGUgcHJvamVjdCBjbGFzc3BhdGgKLVNFU1NJT05fTE9HR0VSX0NMQVNTX0lNUExFTUVOVFNfU0VTU0lPTl9MT0c9VGhlIHNlc3Npb24gbG9nZ2VyIGNsYXNzIFwiezB9XCIgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5sb2dnaW5nLlNlc3Npb25Mb2cgaW50ZXJmYWNlCi1TRVNTSU9OX1BST0ZJTEVSX0NMQVNTX05PVF9TUEVDSUZJRUQ9QSBzZXNzaW9uIHByb2ZpbGVyIGNsYXNzIHNob3VsZCBiZSBzcGVjaWZpZWQKLVNFU1NJT05fUFJPRklMRVJfQ0xBU1NfTk9UX0VYSVNUPVRoZSBzZXNzaW9uIHByb2ZpbGVyIGNsYXNzIFwiezB9XCIgZG9lcyBub3QgZXhpc3Qgb24gdGhlIHByb2plY3QgY2xhc3NwYXRoCi1TRVNTSU9OX1BST0ZJTEVSX0NMQVNTX05PVF9WQUxJRD1UaGUgc2Vzc2lvbiBwcm9maWxlciBjbGFzcyBcInswfVwiIG11c3QgaGF2ZSBhIHB1YmxpYywgemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvcgotU0VTU0lPTl9QUk9GSUxFUl9DTEFTU19JTVBMRU1FTlRTX1NFU1NJT05fUFJPRklMRVI9VGhlIHNlc3Npb24gcHJvZmlsZXIgY2xhc3MgXCJ7MH1cIiBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnNlc3Npb25zLlNlc3Npb25Qcm9maWxlciBpbnRlcmZhY2UKLUJBU0lDX0NPTExFQ1RJT05fTUFQUElOR19ERVBSRUNBVEVEPVRoZSB0eXBlIGJhc2ljLWNvbGxlY3Rpb24gaXMgZGVwcmVjYXRlZAotQkFTSUNfTUFQX01BUFBJTkdfREVQUkVDQVRFRD1UaGUgdHlwZSBiYXNpYy1tYXAgaXMgZGVwcmVjYXRlZAotVFlQRV9NQVBQSU5HX01FTUJFUl9DTEFTU19OT1RfU1RBVElDPVRoZSBqYXZhIGNsYXNzIGZvciBtYXBwZWQgdHlwZSBcInswfVwiIGlzIGEgbm9uLXN0YXRpYyBtZW1iZXIgY2xhc3MgCi1URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPVRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbiBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBvbiB0YWJsZSBcInsxfVwiCi1WSVJUVUFMX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9SW4gZGVmYXVsdCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW4sIG5hbWUgXCJ7MH1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgb24gdGFibGUgXCJ7MX1cIgotVklSVFVBTF9BVFRSSUJVVEVfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW4gXCJ7MX1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgb24gdGFibGUgXCJ7Mn1cIgotVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX1RBQkxFX05PVF9WQUxJRD1UYWJsZSBcInswfVwiIGZvciB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW4gXCJ7MX1cIiB7Mn0KLVZJUlRVQUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX1RBQkxFX05PVF9WQUxJRD1JbiBkZWZhdWx0IHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbiBcInsxfVwiLCB0YWJsZSBcInswfVwiIHsyfQotVklSVFVBTF9BVFRSSUJVVEVfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX1RBQkxFX05PVF9WQUxJRD1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCB0YWJsZSBcInsxfVwiIGZvciB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW4gXCJ7Mn1cIiB7M30KLU1VTFRJVEVOQU5UX05PVF9TUEVDSUZJRURfV0lUSF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TPVRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMgY2Fubm90IGJlIHNwZWNpZmllZCB3aXRob3V0IHRoZSBNdWx0aXRlbmFudCBhbm5vdGF0aW9uCi1NVUxUSVRFTkFOVF9NRVRBREFUQV9DQU5OT1RfQkVfU1BFQ0lGSUVEX09OX05PTl9ST09UX0VOVElUWT1NdWx0aXRlbmFudCBtZXRhZGF0YSBjYW5ub3QgYmUgc3BlY2lmaWVkIG9uIG5vbi1yb290IGVudGl0aWVzIGluIGEgU0lOR0xFX1RBQkxFIG9yIEpPSU5FRCBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLU1VTFRJVEVOQU5UX1RBQkxFX1BFUl9URU5BTlRfTk9UX1NVUFBPUlRFRD1FY2xpcHNlTGluayBkb2VzIG5vdCBzdXBwb3J0IE11bHRpdGVuYW50VHlwZS5UQUJMRV9QRVJfVEVOQU5UCi1NVUxUSVRFTkFOVF9WUERfTUlHSFRfTk9UX0JFX05PVF9TVVBQT1JURUQ9VGFyZ2V0IGRhdGFiYXNlIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbCwgbXVsdGl0ZW5hbmN5IHdpdGggT3JhY2xlIFZQRCBtaWdodCBub3QgYmUgc3VwcG9ydGVkCi1NVUxUSVRFTkFOVF9WUERfTk9UX1NVUFBPUlRFRF9PTl9OT05fT1JBQ0xFX0RBVEFCQVNFX1BMQVRGT1JNPVRhcmdldCBkYXRhYmFzZSBpcyBcInswfVwiLCBtdWx0aXRlbmFuY3kgd2l0aCBPcmFjbGUgVlBEIGlzIG9ubHkgc3VwcG9ydGVkIG9uIE9yYWNsZSBwbGF0Zm9ybQotTVVMVElURU5BTlRfVlBEX0lOQ0xVREVfQ1JJVEVSSUFfV0lMTF9CRV9JR05PUkVEPUluY2x1ZGUgY3JpdGVyaWEgaXMgZmFsc2Ugd2hlbiBtdWx0aXRlbmFudCB0eXBlIGlzIFZQRC4gVGhlIHNwZWNpZmllZCBzZXR0aW5nIHdpbGwgYmUgaWdub3JlZC4KLVZJUlRVQUxfQVRUUklCVVRFX05PX0FUVFJJQlVURV9UWVBFX1NQRUNJRklFRD1WaXJ0dWFsIGF0dHJpYnV0ZSBcInswfVwiIG11c3Qgc3BlY2lmeSBhbiBhdHRyaWJ1dGUtdHlwZQotVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX1RZUEVfRE9FU19OT1RfRVhJU1Q9QXR0cmlidXRlIHR5cGUgXCJ7MH1cIiBkb2VzIG5vdCBleGlzdAotVklSVFVBTF9UWVBFX1BBUkVOVF9DTEFTU19ET0VTX05PVF9FWElTVD1QYXJlbnQgY2xhc3MgXCJ7MH1cIiBkb2VzIG5vdCBleGlzdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9wcm9wZXJ0eV9maWxlcy9qcHRfanBhX2VjbGlwc2VsaW5rX2NvcmUucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9wcm9wZXJ0eV9maWxlcy9qcHRfanBhX2VjbGlwc2VsaW5rX2NvcmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYzNmE4Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvcHJvcGVydHlfZmlsZXMvanB0X2pwYV9lY2xpcHNlbGlua19jb3JlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotSkFWQV9NRVRBREFUQV9DT05WRVJTSU9OX0NPTlZFUlRfQ09OVkVSVEVSPUNvbnZlcnRpbmcgSmF2YSBjb252ZXJ0ZXIgJyd7MH0nJwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvRWNsaXBzZUxpbmtKcGFQcm9qZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9FY2xpcHNlTGlua0pwYVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJiZTY4NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9FY2xpcHNlTGlua0pwYVByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBKUEEgcHJvamVjdC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtKcGFQcm9qZWN0Ci0JZXh0ZW5kcyBKcGFQcm9qZWN0Ci17Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIG1vZGVsIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBmaWxlCi0JICogPGNvZGU+TUVUQS1JTkYvZWNsaXBzZWxpbmstb3JtLnhtbDwvY29kZT4gaWYgdGhhdCBmaWxlIGhhcyB0aGUKLQkgKiBFY2xpcHNlTGluayBjb250ZW50IHR5cGUuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luI0RFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4jRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUKLQkgKi8KLQlKcGFYbWxSZXNvdXJjZSBnZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9FY2xpcHNlTGlua01hcHBpbmdLZXlzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9FY2xpcHNlTGlua01hcHBpbmdLZXlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOWMyYjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmU7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtNYXBwaW5nS2V5cyB7Ci0KLQlTdHJpbmcgQkFTSUNfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAiYmFzaWNDb2xsZWN0aW9uIjsKLQlTdHJpbmcgQkFTSUNfTUFQX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9ICJiYXNpY01hcCI7Ci0JU3RyaW5nIFRSQU5TRk9STUFUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9ICJ0cmFuc2Zvcm1hdGlvbiI7Ci0JU3RyaW5nIFZBUklBQkxFX09ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gInZhcmlhYmxlT25lVG9PbmUiOwotCi0JLy9FY2xpcHNlTGluayAyLjMgbWFwcGluZyBrZXlzCi0JU3RyaW5nIFNUUlVDVFVSRV9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAic3RydWN0dXJlIjsKLQlTdHJpbmcgQVJSQVlfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gImFycmF5IjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL0pwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMWVlMWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhUGxhdGZvcm1GYWN0b3J5LkVjbGlwc2VMaW5rVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGluazFfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzIuRWNsaXBzZUxpbmsxXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGluazJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmsyXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGluazJfNDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbgotCWV4dGVuZHMgUGx1Z2luCi17Ci0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRF8gPSBQTFVHSU5fSUQgKyAnLic7Ci0JCi0JLyoqCi0JICogVmVyc2lvbiBzdHJpbmcgZm9yIEVjbGlwc2VMaW5rIHBsYXRmb3JtIHZlcnNpb24gMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUExBVEZPUk1fVkVSU0lPTl8xXzAgPSAiMS4wIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBWZXJzaW9uIHN0cmluZyBmb3IgRWNsaXBzZUxpbmsgcGxhdGZvcm0gdmVyc2lvbiAxLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzFfMSA9ICIxLjEiOyAgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFZlcnNpb24gc3RyaW5nIGZvciBFY2xpcHNlTGluayBwbGF0Zm9ybSB2ZXJzaW9uIDEuMgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1BMQVRGT1JNX1ZFUlNJT05fMV8yID0gIjEuMiI7ICAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVmVyc2lvbiBzdHJpbmcgZm9yIEVjbGlwc2VMaW5rIHBsYXRmb3JtIHZlcnNpb24gMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUExBVEZPUk1fVkVSU0lPTl8yXzAgPSAiMi4wIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBWZXJzaW9uIHN0cmluZyBmb3IgRWNsaXBzZUxpbmsgcGxhdGZvcm0gdmVyc2lvbiAyLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzJfMSA9ICIyLjEiOyAgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFZlcnNpb24gc3RyaW5nIGZvciBFY2xpcHNlTGluayBwbGF0Zm9ybSB2ZXJzaW9uIDIuMgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1BMQVRGT1JNX1ZFUlNJT05fMl8yID0gIjIuMiI7ICAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVmVyc2lvbiBzdHJpbmcgZm9yIEVjbGlwc2VMaW5rIHBsYXRmb3JtIHZlcnNpb24gMi4zCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUExBVEZPUk1fVkVSU0lPTl8yXzMgPSAiMi4zIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBWZXJzaW9uIHN0cmluZyBmb3IgRWNsaXBzZUxpbmsgcGxhdGZvcm0gdmVyc2lvbiAyLjQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzJfNCA9ICIyLjQiOyAgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVmFsdWUgb2YgdGhlIGNvbnRlbnQtdHlwZSBmb3IgZWNsaXBzZWxpbmstb3JtLnhtbCAgbWFwcGluZ3MgZmlsZXMuIFVzZSB0aGlzIAotCSAqIHZhbHVlIHRvIHJldHJpZXZlIHRoZSBPUk0geG1sIGNvbnRlbnQgdHlwZSBmcm9tIHRoZSBjb250ZW50IHR5cGUgbWFuYWdlciAKLQkgKiBhbmQgdG8gYWRkIG5ldyBlY2xpcHNlbGluay1vcm0ueG1sLWxpa2UgZXh0ZW5zaW9ucyB0byB0aGlzIGNvbnRlbnQgdHlwZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXIjZ2V0Q29udGVudFR5cGUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUNvbnRlbnRUeXBlIEVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFID0gCi0JCQlQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShQTFVHSU5fSURfICsgImNvbnRlbnQub3JtIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgcmVzb3VyY2UgdHlwZSBmb3IgZWNsaXBzZWxpbmstb3JtLnhtbCB2ZXJzaW9uIDEuMCBtYXBwaW5nIGZpbGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKcHRSZXNvdXJjZVR5cGUgRUNMSVBTRUxJTktfT1JNX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRQotCQkJPSBuZXcgSnB0UmVzb3VyY2VUeXBlKEVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFLCBFY2xpcHNlTGluay5TQ0hFTUFfVkVSU0lPTik7Ci0JCi0JLyoqCi0JICogVGhlIHJlc291cmNlIHR5cGUgZm9yIGVjbGlwc2VsaW5rLW9ybS54bWwgdmVyc2lvbiAxLjEgbWFwcGluZyBmaWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnB0UmVzb3VyY2VUeXBlIEVDTElQU0VMSU5LX09STV9YTUxfMV8xX1JFU09VUkNFX1RZUEUKLQkJCT0gbmV3IEpwdFJlc291cmNlVHlwZShFQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgRWNsaXBzZUxpbmsxXzEuU0NIRU1BX1ZFUlNJT04pOwotCQotCS8qKgotCSAqIFRoZSByZXNvdXJjZSB0eXBlIGZvciBlY2xpcHNlbGluay1vcm0ueG1sIHZlcnNpb24gMS4xIG1hcHBpbmcgZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwdFJlc291cmNlVHlwZSBFQ0xJUFNFTElOS19PUk1fWE1MXzFfMl9SRVNPVVJDRV9UWVBFCi0JCQk9IG5ldyBKcHRSZXNvdXJjZVR5cGUoRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIEVjbGlwc2VMaW5rMV8yLlNDSEVNQV9WRVJTSU9OKTsKLQkKLQkvKioKLQkgKiBUaGUgcmVzb3VyY2UgdHlwZSBmb3IgZWNsaXBzZWxpbmstb3JtLnhtbCB2ZXJzaW9uIDIuMCBtYXBwaW5nIGZpbGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKcHRSZXNvdXJjZVR5cGUgRUNMSVBTRUxJTktfT1JNX1hNTF8yXzBfUkVTT1VSQ0VfVFlQRQotCQkJPSBuZXcgSnB0UmVzb3VyY2VUeXBlKEVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFLCBFY2xpcHNlTGluazJfMC5TQ0hFTUFfVkVSU0lPTik7Ci0JCi0JLyoqCi0JICogVGhlIHJlc291cmNlIHR5cGUgZm9yIGVjbGlwc2VsaW5rLW9ybS54bWwgdmVyc2lvbiAyLjEgbWFwcGluZyBmaWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnB0UmVzb3VyY2VUeXBlIEVDTElQU0VMSU5LX09STV9YTUxfMl8xX1JFU09VUkNFX1RZUEUKLQkJCT0gbmV3IEpwdFJlc291cmNlVHlwZShFQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgRWNsaXBzZUxpbmsyXzEuU0NIRU1BX1ZFUlNJT04pOwotCQotCS8qKgotCSAqIFRoZSByZXNvdXJjZSB0eXBlIGZvciBlY2xpcHNlbGluay1vcm0ueG1sIHZlcnNpb24gMi4yIG1hcHBpbmcgZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwdFJlc291cmNlVHlwZSBFQ0xJUFNFTElOS19PUk1fWE1MXzJfMl9SRVNPVVJDRV9UWVBFCi0JCQk9IG5ldyBKcHRSZXNvdXJjZVR5cGUoRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIEVjbGlwc2VMaW5rMl8yLlNDSEVNQV9WRVJTSU9OKTsKLQkKLQkvKioKLQkgKiBUaGUgcmVzb3VyY2UgdHlwZSBmb3IgZWNsaXBzZWxpbmstb3JtLnhtbCB2ZXJzaW9uIDIuMyBtYXBwaW5nIGZpbGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKcHRSZXNvdXJjZVR5cGUgRUNMSVBTRUxJTktfT1JNX1hNTF8yXzNfUkVTT1VSQ0VfVFlQRQotCQkJPSBuZXcgSnB0UmVzb3VyY2VUeXBlKEVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFLCBFY2xpcHNlTGluazJfMy5TQ0hFTUFfVkVSU0lPTik7Ci0JCi0JLyoqCi0JICogVGhlIHJlc291cmNlIHR5cGUgZm9yIGVjbGlwc2VsaW5rLW9ybS54bWwgdmVyc2lvbiAyLjQgbWFwcGluZyBmaWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnB0UmVzb3VyY2VUeXBlIEVDTElQU0VMSU5LX09STV9YTUxfMl80X1JFU09VUkNFX1RZUEUKLQkJCT0gbmV3IEpwdFJlc291cmNlVHlwZShFQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgRWNsaXBzZUxpbmsyXzQuU0NIRU1BX1ZFUlNJT04pOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRIID0gbmV3IFBhdGgoIk1FVEEtSU5GL2VjbGlwc2VsaW5rLW9ybS54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQotCQotCS8vICoqKioqKioqKiogc2luZ2xldG9uICoqKioqKioqKioKLQlwcml2YXRlIHN0YXRpYyBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4gSU5TVEFOQ0U7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24gSlBUIEVjbGlwc2VMaW5rIHBsdWctaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9CQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbm9kZUlzRWNsaXBzZUxpbmsyXzNDb21wYXRpYmxlKEpwYU5vZGUganBhTm9kZSkgewotCQlyZXR1cm4gbm9kZUlzRWNsaXBzZUxpbmtWZXJzaW9uQ29tcGF0aWJsZShqcGFOb2RlLCBFQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzJfMyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG5vZGVJc0VjbGlwc2VMaW5rMl80Q29tcGF0aWJsZShKcGFOb2RlIGpwYU5vZGUpIHsKLQkJcmV0dXJuIG5vZGVJc0VjbGlwc2VMaW5rVmVyc2lvbkNvbXBhdGlibGUoanBhTm9kZSwgRUNMSVBTRUxJTktfUExBVEZPUk1fVkVSU0lPTl8yXzQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBub2RlSXNFY2xpcHNlTGlua1ZlcnNpb25Db21wYXRpYmxlKEpwYU5vZGUganBhTm9kZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJcmV0dXJuICgoRWNsaXBzZUxpbmtWZXJzaW9uKSBqcGFOb2RlLmdldEpwYVByb2plY3QoKS5nZXRKcGFQbGF0Zm9ybSgpLmdldEpwYVZlcnNpb24oKSkuaXNDb21wYXRpYmxlV2l0aFZlcnNpb24odmVyc2lvbik7Ci0JfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLSAgICAgICAgbG9nKG1zZywgbnVsbCk7Ci0gICAgfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIG9yIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlsb2codGhyb3dhYmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgdGhyb3dhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGFuZCBleGNlcHRpb24gb3IgZXJyb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCB0aHJvd2FibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBzdGF0dXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBJTlNUQU5DRS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0KLQkKLQkvLyAqKioqKioqKioqIHBsdWctaW4gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgkKLQkKLQlwdWJsaWMgSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCUlOU1RBTkNFID0gdGhpczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlOU1RBTkNFID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2J1aWxkZXIvRWNsaXBzZUxpbmtTdGF0aWNXZWF2aW5nQnVpbGRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvYnVpbGRlci9FY2xpcHNlTGlua1N0YXRpY1dlYXZpbmdCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYjIwZDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvYnVpbGRlci9FY2xpcHNlTGlua1N0YXRpY1dlYXZpbmdCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC53ZWF2ZS5TdGF0aWNXZWF2ZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rU3RhdGljV2VhdmluZ0J1aWxkZXIgZXh0ZW5kcyBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERFUl9JRCA9IEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLmJ1aWxkZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEVjbGlwc2VMaW5rU3RhdGljV2VhdmluZ0J1aWxkZXJDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQkKLQkvKioKLSAgICAgKiBQZXJmb3JtcyBzdGF0aWMgd2VhdmluZyBvbiBwcm9qZWN0J3MgbW9kZWwgY2xhc3NlcwotICAgICAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUHJvamVjdFtdIGJ1aWxkKGludCBraW5kLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVN0YXRpY1dlYXZlLndlYXZlKAotCQkJSmF2YUNvcmUuY3JlYXRlKHRoaXMuZ2V0UHJvamVjdCgpKSwgCi0JCQl0aGlzLmNvbmZpZ3VyYXRvci5nZXRTb3VyY2VMb2NhdGlvblByZWZlcmVuY2UoKSwKLQkJCXRoaXMuY29uZmlndXJhdG9yLmdldFRhcmdldExvY2F0aW9uUHJlZmVyZW5jZSgpLAotCQkJdGhpcy5jb25maWd1cmF0b3IuZ2V0TG9nTGV2ZWxQcmVmZXJlbmNlKCksCi0JCQl0aGlzLmNvbmZpZ3VyYXRvci5nZXRQZXJzaXN0ZW5jZUluZm9QcmVmZXJlbmNlKCksCi0JCQltb25pdG9yKTsKLQotCQlyZXR1cm4gbmV3IElQcm9qZWN0WzBdOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHN0YXJ0dXBPbkluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLnN0YXJ0dXBPbkluaXRpYWxpemUoKTsKLQkJdGhpcy5jb25maWd1cmF0b3IgPSBuZXcgRWNsaXBzZUxpbmtTdGF0aWNXZWF2aW5nQnVpbGRlckNvbmZpZ3VyYXRvcih0aGlzLmdldFByb2plY3QoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNsZWFuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlci5jbGVhbihtb25pdG9yKTsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvYnVpbGRlci9FY2xpcHNlTGlua1N0YXRpY1dlYXZpbmdCdWlsZGVyQ29uZmlndXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9idWlsZGVyL0VjbGlwc2VMaW5rU3RhdGljV2VhdmluZ0J1aWxkZXJDb25maWd1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI1NGI0NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9idWlsZGVyL0VjbGlwc2VMaW5rU3RhdGljV2VhdmluZ0J1aWxkZXJDb25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnByZWZzLkpwYVByZWZlcmVuY2VzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Mb2dnaW5nTGV2ZWw7Ci0KLS8qKgotICogIENvbmZpZ3VyZXMgYW5kIGNvb3JkaW5hdGVzIFN0YXRpY1dlYXZpbmcgYnVpbGRlciBiZWhhdmlvciBmb3IgdGhlIHByb2plY3QuCi0gKiAgQWxzbyBoYW5kbGVzIHRoZSBidWlsZGVyIHByZWZlcmVuY2VzLgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtTdGF0aWNXZWF2aW5nQnVpbGRlckNvbmZpZ3VyYXRvciBleHRlbmRzIEpwYVByZWZlcmVuY2VzTWFuYWdlcgotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxERVJfSUQgPSBFY2xpcHNlTGlua1N0YXRpY1dlYXZpbmdCdWlsZGVyLkJVSUxERVJfSUQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVElDX1dFQVZFX1BSRUZJWCA9ICJzdGF0aWN3ZWF2ZS4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0UgPSAiU09VUkNFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVCA9ICJUQVJHRVQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0xFVkVMID0gIkxPR19MRVZFTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9JTkZPID0gIlBFUlNJU1RFTkNFX0lORk8iOyAvLyROT04tTkxTLTEkCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtTdGF0aWNXZWF2aW5nQnVpbGRlckNvbmZpZ3VyYXRvcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQotCQlzdXBlcihwcm9qZWN0KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJ1aWxkZXIgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkQnVpbGRlcigpIHsKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSB0aGlzLmdldFByb2plY3QoKS5nZXREZXNjcmlwdGlvbigpOwotCQkJSUNvbW1hbmRbXSBjb21tYW5kcyA9IGRlc2NyaXB0aW9uLmdldEJ1aWxkU3BlYygpOwotCi0JCQlJQ29tbWFuZCBuZXdDb21tYW5kID0gZGVzY3JpcHRpb24ubmV3Q29tbWFuZCgpOwotCQkJbmV3Q29tbWFuZC5zZXRCdWlsZGVyTmFtZShCVUlMREVSX0lEKTsKLQotCQkJSUNvbW1hbmRbXSBuZXdDb21tYW5kcyA9IG51bGw7Ci0JCQlpZihjb21tYW5kcyAhPSBudWxsKSB7Ci0JCQkJbmV3Q29tbWFuZHMgPSBuZXcgSUNvbW1hbmRbY29tbWFuZHMubGVuZ3RoICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShjb21tYW5kcywgMCwgbmV3Q29tbWFuZHMsIDAsIGNvbW1hbmRzLmxlbmd0aCk7Ci0JCQkJbmV3Q29tbWFuZHNbY29tbWFuZHMubGVuZ3RoXSA9IG5ld0NvbW1hbmQ7Ci0JCQl9IAotCQkJZWxzZSB7Ci0JCQkJbmV3Q29tbWFuZHMgPSBuZXcgSUNvbW1hbmRbMV07Ci0JCQkJbmV3Q29tbWFuZHNbMF0gPSBuZXdDb21tYW5kOwotCQkJfQotCQkJZGVzY3JpcHRpb24uc2V0QnVpbGRTcGVjKG5ld0NvbW1hbmRzKTsKLQkJCXRoaXMuZ2V0UHJvamVjdCgpLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQkJfSAKLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy8gaWYgd2UgY2FuJ3QgcmVhZCB0aGUgaW5mb3JtYXRpb24sIHRoZSBwcm9qZWN0IGlzbid0IG9wZW4KLQkJCXJldHVybjsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHByb2plY3RIYXNTdGF0aWNXZWF2aW5nQnVpbGRlcigpIHsKLQotCQl0cnkgewotCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHRoaXMuZ2V0UHJvamVjdCgpLmdldERlc2NyaXB0aW9uKCk7Ci0JCQlJQ29tbWFuZFtdIGNvbW1hbmRzID0gZGVzY3JpcHRpb24uZ2V0QnVpbGRTcGVjKCk7Ci0JCQlpZihjb21tYW5kcy5sZW5ndGggPT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlmb3IoaW50IGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZihjb21tYW5kc1tpXS5nZXRCdWlsZGVyTmFtZSgpLmVxdWFscyhCVUlMREVSX0lEKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy8gaWYgd2UgY2FuJ3QgcmVhZCB0aGUgaW5mb3JtYXRpb24sIHRoZSBwcm9qZWN0IGlzbid0IG9wZW4KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUJ1aWxkZXIoKSB7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gdGhpcy5nZXRQcm9qZWN0KCkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCUlDb21tYW5kW10gY29tbWFuZHMgPSBkZXNjcmlwdGlvbi5nZXRCdWlsZFNwZWMoKTsKLQkJCWlmKGNvbW1hbmRzLmxlbmd0aCA9PSAwKQotCQkJCXJldHVybjsKLQkJCWludCBuZXdMZW5ndGggPSAwOwotCQkJLy8gbnVsbCBvdXQgYWxsIGNvbW1hbmRzIHRoYXQgbWF0Y2ggQlVJTERFUl9JRAotCQkJZm9yKGludCBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYoY29tbWFuZHNbaV0uZ2V0QnVpbGRlck5hbWUoKS5lcXVhbHMoQlVJTERFUl9JRCkpCi0JCQkJCWNvbW1hbmRzW2ldID0gbnVsbDsKLQkJCQllbHNlCi0JCQkJCW5ld0xlbmd0aCsrOwotCQkJfQotCQkJLy8gY2hlY2sgaWYgYW55IHdlcmUgYWN0dWFsbHkgcmVtb3ZlZAotCQkJaWYobmV3TGVuZ3RoID09IGNvbW1hbmRzLmxlbmd0aCkKLQkJCQlyZXR1cm47Ci0KLQkJCUlDb21tYW5kW10gbmV3Q29tbWFuZHMgPSBuZXcgSUNvbW1hbmRbbmV3TGVuZ3RoXTsKLQkJCWZvcihpbnQgaSA9IDAsIGogPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZihjb21tYW5kc1tpXSAhPSBudWxsKQotCQkJCQluZXdDb21tYW5kc1tqKytdID0gY29tbWFuZHNbaV07Ci0JCQl9Ci0JCQlkZXNjcmlwdGlvbi5zZXRCdWlsZFNwZWMobmV3Q29tbWFuZHMpOwotCQkJdGhpcy5nZXRQcm9qZWN0KCkuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIElSZXNvdXJjZS5OT05FLCBudWxsKTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvLyBpZiB3ZSBjYW4ndCByZWFkIHRoZSBpbmZvcm1hdGlvbiwgdGhlIHByb2plY3QgaXNuJ3Qgb3BlbgotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBwcmVmZXJlbmNlcyAqKioqKioqKioqCi0JCi0JLy8gIHJldHJpZXZlcyBwcmVmZXJlbmNlLCBpZiBub25lIHJldHVybiBkZWZhdWx0Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTb3VyY2VMb2NhdGlvblByZWZlcmVuY2UoKSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5nZXRMZWdhY3lQcm9qZWN0UHJlZmVyZW5jZSh0aGlzLmFwcGVuZFByZWZpeChTT1VSQ0UpLCB0aGlzLmdldERlZmF1bHRTb3VyY2VMb2NhdGlvbigpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRMb2NhdGlvblByZWZlcmVuY2UoKSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5nZXRMZWdhY3lQcm9qZWN0UHJlZmVyZW5jZSh0aGlzLmFwcGVuZFByZWZpeChUQVJHRVQpLCB0aGlzLmdldERlZmF1bHRUYXJnZXRMb2NhdGlvbigpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQZXJzaXN0ZW5jZUluZm9QcmVmZXJlbmNlKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZ2V0TGVnYWN5UHJvamVjdFByZWZlcmVuY2UodGhpcy5hcHBlbmRQcmVmaXgoUEVSU0lTVEVOQ0VfSU5GTyksIHRoaXMuZ2V0RGVmYXVsdFBlcnNpc3RlbmNlSW5mbygpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMb2dMZXZlbFByZWZlcmVuY2UoKSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5nZXRMZWdhY3lQcm9qZWN0UHJlZmVyZW5jZSh0aGlzLmFwcGVuZFByZWZpeChMT0dfTEVWRUwpLCB0aGlzLmdldERlZmF1bHRMb2dMZXZlbCgpKTsKLQl9Ci0KLQkvLyBkZWZhdWx0IHByZWZlcmVuY2VzIHZhbHVlCi0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U291cmNlTG9jYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmdldEphdmFQcm9qZWN0T3V0cHV0TG9jYXRpb24oKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFyZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmdldEphdmFQcm9qZWN0T3V0cHV0TG9jYXRpb24oKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGVyc2lzdGVuY2VJbmZvKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TG9nTGV2ZWwoKSB7Ci0JCXJldHVybiBMZXZlbC5TRVZFUkUuZ2V0TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgTG9nZ2luZ0xldmVsW10gZ2V0TG9nTGV2ZWxWYWx1ZXMoKSB7Ci0JCQotCQlyZXR1cm4gTG9nZ2luZ0xldmVsLnZhbHVlcygpOwotCX0KLQotCS8vICBzZXR0aW5nIGFuZCByZW1vdmluZyBwcmVmZXJlbmNlcwotCQotCXB1YmxpYyB2b2lkIHNldFNvdXJjZUxvY2F0aW9uUHJlZmVyZW5jZShTdHJpbmcgbG9jYXRpb24pIHsKLQkJdGhpcy5zZXRMZWdhY3lQcm9qZWN0UHJlZmVyZW5jZSh0aGlzLmFwcGVuZFByZWZpeChTT1VSQ0UpLCBsb2NhdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNvdXJjZUxvY2F0aW9uUHJlZmVyZW5jZSgpIHsKLQkJdGhpcy5zZXRMZWdhY3lQcm9qZWN0UHJlZmVyZW5jZSh0aGlzLmFwcGVuZFByZWZpeChTT1VSQ0UpLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0TG9jYXRpb25QcmVmZXJlbmNlKFN0cmluZyBsb2NhdGlvbikgewotCQl0aGlzLnNldExlZ2FjeVByb2plY3RQcmVmZXJlbmNlKHRoaXMuYXBwZW5kUHJlZml4KFRBUkdFVCksIGxvY2F0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlVGFyZ2V0TG9jYXRpb25QcmVmZXJlbmNlKCkgewotCQl0aGlzLnNldExlZ2FjeVByb2plY3RQcmVmZXJlbmNlKHRoaXMuYXBwZW5kUHJlZml4KFRBUkdFVCksIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRMb2dMZXZlbFByZWZlcmVuY2UoU3RyaW5nIGxvZ0xldmVsKSB7Ci0JCXRoaXMuc2V0TGVnYWN5UHJvamVjdFByZWZlcmVuY2UodGhpcy5hcHBlbmRQcmVmaXgoTE9HX0xFVkVMKSwgbG9nTGV2ZWwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVMb2dMZXZlbFByZWZlcmVuY2UoKSB7Ci0JCXRoaXMuc2V0TGVnYWN5UHJvamVjdFByZWZlcmVuY2UodGhpcy5hcHBlbmRQcmVmaXgoTE9HX0xFVkVMKSwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFBlcnNpc3RlbmNlSW5mb1ByZWZlcmVuY2UoU3RyaW5nIHBlcnNpc3RlbmNlSW5mbykgewotCQl0aGlzLnNldExlZ2FjeVByb2plY3RQcmVmZXJlbmNlKHRoaXMuYXBwZW5kUHJlZml4KFBFUlNJU1RFTkNFX0lORk8pLCBwZXJzaXN0ZW5jZUluZm8pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVQZXJzaXN0ZW5jZUluZm9QcmVmZXJlbmNlKCkgewotCQl0aGlzLnNldExlZ2FjeVByb2plY3RQcmVmZXJlbmNlKHRoaXMuYXBwZW5kUHJlZml4KFBFUlNJU1RFTkNFX0lORk8pLCBudWxsKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SmF2YVByb2plY3RPdXRwdXRMb2NhdGlvbigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmdldEphdmFQcm9qZWN0T3V0cHV0TG9jYXRpb25QYXRoKCkudG9PU1N0cmluZygpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiLiI7IAkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiBvdXRwdXQgbG9jYXRpb24gcGF0aCByZWxhdGl2ZSB0byB0aGUgcHJvamVjdAotCSAqLwotCXByaXZhdGUgSVBhdGggZ2V0SmF2YVByb2plY3RPdXRwdXRMb2NhdGlvblBhdGgoKSAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUGF0aCBvdXRwdXRMb2NhdGlvbiA9IHRoaXMuZ2V0SmF2YVByb2plY3QoKS5nZXRPdXRwdXRMb2NhdGlvbigpOwotICAgIAlTdHJpbmcgcHJvamVjdE5hbWUgPSBvdXRwdXRMb2NhdGlvbi5zZWdtZW50KDApOwotCi0gICAgCWlmKHRoaXMuZ2V0UHJvamVjdCgpLmdldE5hbWUoKS5lcXVhbHMocHJvamVjdE5hbWUpKSB7Ci0gICAgCQlvdXRwdXRMb2NhdGlvbiA9IG91dHB1dExvY2F0aW9uLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIG91dHB1dExvY2F0aW9uOwotCX0KLQotCXByaXZhdGUgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCSAgcmV0dXJuICBKYXZhQ29yZS5jcmVhdGUodGhpcy5nZXRQcm9qZWN0KCkpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBhcHBlbmRQcmVmaXgoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBTVEFUSUNfV0VBVkVfUFJFRklYICsgaWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQWNjZXNzTWV0aG9kc0hvbGRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0FjY2Vzc01ldGhvZHNIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY0MzEyNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQWNjZXNzTWV0aG9kc0hvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBDb21tb24gaW50ZXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQgYnkgY2xpZW50cyBpbnRlcmVzdGVkIG9ubHkgaW4gYSB0eXBlCi0gKiBvciBhdHRyaWJ1dGUncyBhY2Nlc3Mgc2V0dGluZyAoZS5nLiBhIFVJIGNvbXBvc2l0ZSkuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjIgCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtBY2Nlc3NNZXRob2RzSG9sZGVyCi0JZXh0ZW5kcyBFY2xpcHNlTGlua1JlYWRPbmx5QWNjZXNzTWV0aG9kc0hvbGRlcgotewotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGdldCBtZXRob2Q7Ci0JICovCi0JU3RyaW5nIGdldFNwZWNpZmllZEdldE1ldGhvZCgpOwotCi0JLyoqCi0JICogU2V0IHRoZSBzcGVjaWZpZWQgYWNjZXNzIHR5cGUuCi0JICovCi0Jdm9pZCBzZXRTcGVjaWZpZWRHZXRNZXRob2QoU3RyaW5nIG5ld1NwZWNpZmllZEdldE1ldGhvZCk7Ci0KLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHNwZWNpZmllZCBnZXQgbWV0aG9kCi0JICovCi0JU3RyaW5nIFNQRUNJRklFRF9HRVRfTUVUSE9EX1BST1BFUlRZID0gInNwZWNpZmllZEdldE1ldGhvZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBnZXQgbWV0aG9kCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRHZXRNZXRob2QoKTsKLQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgZGVmYXVsdCBnZXQgbWV0aG9kCi0JICovCi0JU3RyaW5nIERFRkFVTFRfR0VUX01FVEhPRF9QUk9QRVJUWSA9ICJkZWZhdWx0R2V0TWV0aG9kIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGZvciB0aGUgZGVmYXVsdCBnZXQgbWV0aG9kCi0JICovCi0JU3RyaW5nIERFRkFVTFRfR0VUX01FVEhPRCA9ICJnZXQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBzZXQgbWV0aG9kOwotCSAqLwotCVN0cmluZyBnZXRTcGVjaWZpZWRTZXRNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgc3BlY2lmaWVkIGFjY2VzcyB0eXBlLgotCSAqLwotCXZvaWQgc2V0U3BlY2lmaWVkU2V0TWV0aG9kKFN0cmluZyBuZXdTcGVjaWZpZWRTZXRNZXRob2QpOwotCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpZWQgZ2V0IG1ldGhvZAotCSAqLwotCVN0cmluZyBTUEVDSUZJRURfU0VUX01FVEhPRF9QUk9QRVJUWSA9ICJzcGVjaWZpZWRTZXRNZXRob2QiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgc2V0IG1ldGhvZCwgbmV2ZXIgbnVsbAotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0U2V0TWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIGRlZmF1bHQgc2V0IG1ldGhvZAotCSAqLwotCVN0cmluZyBERUZBVUxUX1NFVF9NRVRIT0RfUFJPUEVSVFkgPSAiZGVmYXVsdFNldE1ldGhvZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBmb3IgdGhlIGRlZmF1bHQgc2V0IG1ldGhvZAotCSAqLwotCVN0cmluZyBERUZBVUxUX1NFVF9NRVRIT0QgPSAic2V0IjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQWNjZXNzVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0FjY2Vzc1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg5N2YzNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQWNjZXNzVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci0KLS8qKgotICogQ29udGV4dCBtb2RlbCBjb3JyZXNwb25kaW5nIHRvOjx1bD4KLSAqIDxsaT50aGUgWE1MIHJlc291cmNlIG1vZGVsCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rQWNjZXNzVHlwZX0sCi0gKiB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+YWNjZXNzPC9jb2RlPiBlbGVtZW50IGluIHRoZQotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS4KLSAqIDxsaT50aGUgSmF2YSByZXNvdXJjZSBtb2RlbCB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQWNjZXNzVHlwZX0KLSAqIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5BY2Nlc3M8L2NvZGU+IGFubm90YXRpb24uCi0gKiA8L3VsPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtBY2Nlc3NUeXBlIGV4dGVuZHMgQWNjZXNzVHlwZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFjY2Vzc1R5cGUgVklSVFVBTCA9IG5ldyBBY2Nlc3NUeXBlKAotCQkJbnVsbCwKLQkJCW9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCwKLQkJCSJWaXJ0dWFsIiAvLyROT04tTkxTLTEkCi0JCSk7Ci0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0FjY2Vzc1R5cGUob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQWNjZXNzVHlwZSBqYXZhQWNjZXNzVHlwZSwgU3RyaW5nIG9ybUFjY2Vzc1R5cGUsIFN0cmluZyBkaXNwbGF5U3RyaW5nKSB7Ci0JCXN1cGVyKGphdmFBY2Nlc3NUeXBlLCBvcm1BY2Nlc3NUeXBlLCBkaXNwbGF5U3RyaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMmIxOWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0FycmF5TWFwcGluZzJfMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sdW1uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0aWJsZU1hcHBpbmc7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgYXJyYXkgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzMKLQlleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcsIENvbnZlcnRpYmxlTWFwcGluZywgRWNsaXBzZUxpbmtDb252ZXJ0aWJsZU1hcHBpbmcsIENvbHVtbk1hcHBpbmcKLXsKLQkvLyBub3RoaW5nIHlldAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYTJjMWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIGJhc2ljIGNvbGxlY3Rpb24gbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nCi0JZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5NzE2Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBiYXNpYyBtYXAgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcKLQlleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcKLXsKLQkvLyBub3RoaW5nIHlldAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0Jhc2ljTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0Jhc2ljTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDgzMTgwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgYmFzaWMgbWFwcGluZy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nCi0JZXh0ZW5kcyBCYXNpY01hcHBpbmcsIEVjbGlwc2VMaW5rQ29udmVydGlibGVNYXBwaW5nCi17Ci0JRWNsaXBzZUxpbmtNdXRhYmxlIGdldE11dGFibGUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE4NTgxZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBlbnVtIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIHsKLQotCVNFTkRfT0JKRUNUX0NIQU5HRVMsCi0JSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsCi0JU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsCi0JTk9ORTsKLQkKLQotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgZnJvbUphdmFSZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZSBqYXZhQ2FjaGVDb29yZGluYXRpb25UeXBlKSB7Ci0JCWlmIChqYXZhQ2FjaGVDb29yZGluYXRpb25UeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoamF2YUNhY2hlQ29vcmRpbmF0aW9uVHlwZSkgewotCQkJY2FzZSBTRU5EX09CSkVDVF9DSEFOR0VTOgotCQkJCXJldHVybiBTRU5EX09CSkVDVF9DSEFOR0VTOwotCQkJY2FzZSBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUzoKLQkJCQlyZXR1cm4gSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFM7Ci0JCQljYXNlIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTOgotCQkJCXJldHVybiBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUzsKLQkJCWNhc2UgTk9ORToKLQkJCQlyZXR1cm4gTk9ORTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjYWNoZSBjb29yZGluYXRpb24gdHlwZTogIiArIGphdmFDYWNoZUNvb3JkaW5hdGlvblR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZSB0b0phdmFSZXNvdXJjZU1vZGVsKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGNhY2hlQ29vcmRpbmF0aW9uVHlwZSkgewotCQlpZiAoY2FjaGVDb29yZGluYXRpb25UeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoY2FjaGVDb29yZGluYXRpb25UeXBlKSB7Ci0JCQljYXNlIFNFTkRfT0JKRUNUX0NIQU5HRVM6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTOwotCQkJY2FzZSBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUzoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTOwotCQkJY2FzZSBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUzoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTOwotCQkJY2FzZSBOT05FOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuTk9ORTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjYWNoZSBjb29yZGluYXRpb24gdHlwZTogIiArIGNhY2hlQ29vcmRpbmF0aW9uVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgZnJvbU9ybVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUgb3JtQ2FjaGVDb29yZGluYXRpb25UeXBlKSB7Ci0JCWlmIChvcm1DYWNoZUNvb3JkaW5hdGlvblR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChvcm1DYWNoZUNvb3JkaW5hdGlvblR5cGUpIHsKLQkJCWNhc2UgU0VORF9PQkpFQ1RfQ0hBTkdFUzoKLQkJCQlyZXR1cm4gU0VORF9PQkpFQ1RfQ0hBTkdFUzsKLQkJCWNhc2UgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFM6Ci0JCQkJcmV0dXJuIElOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTOwotCQkJY2FzZSBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUzoKLQkJCQlyZXR1cm4gU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVM7Ci0JCQljYXNlIE5PTkU6Ci0JCQkJcmV0dXJuIE5PTkU7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY2FjaGUgY29vcmRpbmF0aW9uIHR5cGU6ICIgKyBvcm1DYWNoZUNvb3JkaW5hdGlvblR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZSB0b09ybVJlc291cmNlTW9kZWwoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgY2FjaGVDb29yZGluYXRpb25UeXBlKSB7Ci0JCWlmIChjYWNoZUNvb3JkaW5hdGlvblR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChjYWNoZUNvb3JkaW5hdGlvblR5cGUpIHsKLQkJCWNhc2UgU0VORF9PQkpFQ1RfQ0hBTkdFUzoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUzsKLQkJCWNhc2UgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFM6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTOwotCQkJY2FzZSBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUzoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVM7Ci0JCQljYXNlIE5PTkU6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLk5PTkU7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY2FjaGUgY29vcmRpbmF0aW9uIHR5cGU6ICIgKyBjYWNoZUNvb3JkaW5hdGlvblR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAxZTNjMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi0KLS8qKgotICogY29ycmVzcG9uZHMgdG8gRWNsaXBzZUxpbmsgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29uZmlnLkNhY2hlSXNvbGF0aW9uVHlwZQotICogd2hpY2ggd2FzIGFkZGVkIGluIEVjbGlwc2VMaW5rIDIuMgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBlbnVtIEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yIHsKLQotCVNIQVJFRCwKLQlQUk9URUNURUQsCi0JSVNPTEFURUQ7Ci0JCi0KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUlzb2xhdGlvblR5cGUyXzIgamF2YUNhY2hlSXNvbGF0aW9uVHlwZSkgewotCQlpZiAoamF2YUNhY2hlSXNvbGF0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGphdmFDYWNoZUlzb2xhdGlvblR5cGUpIHsKLQkJCWNhc2UgU0hBUkVEOgotCQkJCXJldHVybiBTSEFSRUQ7Ci0JCQljYXNlIFBST1RFQ1RFRDoKLQkJCQlyZXR1cm4gUFJPVEVDVEVEOwotCQkJY2FzZSBJU09MQVRFRDoKLQkJCQlyZXR1cm4gSVNPTEFURUQ7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY2FjaGUgaXNvbGF0aW9uIHR5cGU6ICIgKyBqYXZhQ2FjaGVJc29sYXRpb25UeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUlzb2xhdGlvblR5cGUyXzIgdG9KYXZhUmVzb3VyY2VNb2RlbChFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMiBjYWNoZUlzb2xhdGlvblR5cGUpIHsKLQkJaWYgKGNhY2hlSXNvbGF0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGNhY2hlSXNvbGF0aW9uVHlwZSkgewotCQkJY2FzZSBTSEFSRUQ6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlSXNvbGF0aW9uVHlwZTJfMi5TSEFSRUQ7Ci0JCQljYXNlIFBST1RFQ1RFRDoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVJc29sYXRpb25UeXBlMl8yLlBST1RFQ1RFRDsKLQkJCWNhc2UgSVNPTEFURUQ6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlSXNvbGF0aW9uVHlwZTJfMi5JU09MQVRFRDsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjYWNoZSBpc29sYXRpb24gdHlwZTogIiArIGNhY2hlSXNvbGF0aW9uVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIgZnJvbU9ybVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkNhY2hlSXNvbGF0aW9uVHlwZSBvcm1DYWNoZUlzb2xhdGlvblR5cGUpIHsKLQkJaWYgKG9ybUNhY2hlSXNvbGF0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKG9ybUNhY2hlSXNvbGF0aW9uVHlwZSkgewotCQkJY2FzZSBTSEFSRUQ6Ci0JCQkJcmV0dXJuIFNIQVJFRDsKLQkJCWNhc2UgUFJPVEVDVEVEOgotCQkJCXJldHVybiBQUk9URUNURUQ7Ci0JCQljYXNlIElTT0xBVEVEOgotCQkJCXJldHVybiBJU09MQVRFRDsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjYWNoZSBpc29sYXRpb24gdHlwZTogIiArIG9ybUNhY2hlSXNvbGF0aW9uVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5DYWNoZUlzb2xhdGlvblR5cGUgdG9Pcm1SZXNvdXJjZU1vZGVsKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yIGNhY2hlSXNvbGF0aW9uVHlwZSkgewotCQlpZiAoY2FjaGVJc29sYXRpb25UeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoY2FjaGVJc29sYXRpb25UeXBlKSB7Ci0JCQljYXNlIFNIQVJFRDoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkNhY2hlSXNvbGF0aW9uVHlwZS5TSEFSRUQ7Ci0JCQljYXNlIFBST1RFQ1RFRDoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkNhY2hlSXNvbGF0aW9uVHlwZS5QUk9URUNURUQ7Ci0JCQljYXNlIElTT0xBVEVEOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuQ2FjaGVJc29sYXRpb25UeXBlLklTT0xBVEVEOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNhY2hlIGlzb2xhdGlvbiB0eXBlOiAiICsgY2FjaGVJc29sYXRpb25UeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2FjaGVUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2FjaGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMWRiNTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NhY2hlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgZW51bSBFY2xpcHNlTGlua0NhY2hlVHlwZSB7Ci0KLQlTT0ZUX1dFQUssCi0JSEFSRF9XRUFLLAotCVdFQUssCi0JU09GVCwKLQlGVUxMLAotCUNBQ0hFLAotCU5PTkU7Ci0JCi0KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGUgamF2YUNhY2hlVHlwZSkgewotCQlpZiAoamF2YUNhY2hlVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGphdmFDYWNoZVR5cGUpIHsKLQkJCWNhc2UgRlVMTDoKLQkJCQlyZXR1cm4gRlVMTDsKLQkJCWNhc2UgV0VBSzoKLQkJCQlyZXR1cm4gV0VBSzsKLQkJCWNhc2UgU09GVDoKLQkJCQlyZXR1cm4gU09GVDsKLQkJCWNhc2UgU09GVF9XRUFLOgotCQkJCXJldHVybiBTT0ZUX1dFQUs7Ci0JCQljYXNlIEhBUkRfV0VBSzoKLQkJCQlyZXR1cm4gSEFSRF9XRUFLOwotCQkJY2FzZSBDQUNIRToKLQkJCQlyZXR1cm4gQ0FDSEU7Ci0JCQljYXNlIE5PTkU6Ci0JCQkJcmV0dXJuIE5PTkU7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY2FjaGUgdHlwZTogIiArIGphdmFDYWNoZVR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZSB0b0phdmFSZXNvdXJjZU1vZGVsKEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGNhY2hlVHlwZSkgewotCQlpZiAoY2FjaGVUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoY2FjaGVUeXBlKSB7Ci0JCQljYXNlIEZVTEw6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZS5GVUxMOwotCQkJY2FzZSBXRUFLOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGUuV0VBSzsKLQkJCWNhc2UgU09GVDoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLlNPRlQ7Ci0JCQljYXNlIFNPRlRfV0VBSzoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLlNPRlRfV0VBSzsKLQkJCWNhc2UgSEFSRF9XRUFLOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGUuSEFSRF9XRUFLOwotCQkJY2FzZSBDQUNIRToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLkNBQ0hFOwotCQkJY2FzZSBOT05FOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGUuTk9ORTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjYWNoZSB0eXBlOiAiICsgY2FjaGVUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua0NhY2hlVHlwZSBmcm9tT3JtUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZSBvcm1DYWNoZVR5cGUpIHsKLQkJaWYgKG9ybUNhY2hlVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKG9ybUNhY2hlVHlwZSkgewotCQkJY2FzZSBGVUxMOgotCQkJCXJldHVybiBGVUxMOwotCQkJY2FzZSBXRUFLOgotCQkJCXJldHVybiBXRUFLOwotCQkJY2FzZSBTT0ZUOgotCQkJCXJldHVybiBTT0ZUOwotCQkJY2FzZSBTT0ZUX1dFQUs6Ci0JCQkJcmV0dXJuIFNPRlRfV0VBSzsKLQkJCWNhc2UgSEFSRF9XRUFLOgotCQkJCXJldHVybiBIQVJEX1dFQUs7Ci0JCQljYXNlIENBQ0hFOgotCQkJCXJldHVybiBDQUNIRTsKLQkJCWNhc2UgTk9ORToKLQkJCQlyZXR1cm4gTk9ORTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjYWNoZSB0eXBlOiAiICsgb3JtQ2FjaGVUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUgdG9Pcm1SZXNvdXJjZU1vZGVsKEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGNhY2hlVHlwZSkgewotCQlpZiAoY2FjaGVUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoY2FjaGVUeXBlKSB7Ci0JCQljYXNlIEZVTEw6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEw7Ci0JCQljYXNlIFdFQUs6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLldFQUs7Ci0JCQljYXNlIFNPRlQ6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLlNPRlQ7Ci0JCQljYXNlIFNPRlRfV0VBSzoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuU09GVF9XRUFLOwotCQkJY2FzZSBIQVJEX1dFQUs6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkhBUkRfV0VBSzsKLQkJCWNhc2UgQ0FDSEU6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkNBQ0hFOwotCQkJY2FzZSBOT05FOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5OT05FOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNhY2hlIHR5cGU6ICIgKyBjYWNoZVR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDYWNoaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2FjaGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWU5YTQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDYWNoaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIGNhY2hpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDIuMQotICovCi0vLyBUT0RPIGJqdiBFY2xpcHNlTGlua0NhY2hpbmdQb2xpY3kKLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtDYWNoaW5nCi0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCS8vICoqKioqKioqKiogdHlwZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBjb21iaW5hdGlvbiBvZiBkZWZhdWx0VHlwZSBhbmQgc3BlY2lmaWVkVHlwZS4KLQkgKiBJZiBnZXRTcGVjaWZpZWRUeXBlKCkgcmV0dXJucyBudWxsLCB0aGVuIHJldHVybiBnZXREZWZhdWx0VHlwZSgpCi0JICovCi0JRWNsaXBzZUxpbmtDYWNoZVR5cGUgZ2V0VHlwZSgpOwotCQotCUVjbGlwc2VMaW5rQ2FjaGVUeXBlIGdldFNwZWNpZmllZFR5cGUoKTsJCi0Jdm9pZCBzZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlIHR5cGUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1RZUEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlFY2xpcHNlTGlua0NhY2hlVHlwZSBnZXREZWZhdWx0VHlwZSgpOwkJCi0JCVN0cmluZyBERUZBVUxUX1RZUEVfUFJPUEVSVFkgPSAiZGVmYXVsdFR5cGUiOyAvLyROT04tTkxTLTEkCi0JCUVjbGlwc2VMaW5rQ2FjaGVUeXBlIERFRkFVTFRfVFlQRSA9IEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSzsKLQkJCi0JCi0JLy8gKioqKioqKioqKiBzaXplICoqKioqKioqKioKLQkJCQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHRTaXplIGFuZCBzcGVjaWZpZWRTaXplLgotCSAqIElmIGdldFNwZWNpZmllZFNpemUoKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGdldERlZmF1bHRTaXplKCkKLQkgKi8KLQlpbnQgZ2V0U2l6ZSgpOwotCi0JSW50ZWdlciBnZXRTcGVjaWZpZWRTaXplKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRTaXplKEludGVnZXIgc2l6ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfU0laRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRTaXplIjsgLy8kTk9OLU5MUy0xJAotCQotCWludCBnZXREZWZhdWx0U2l6ZSgpOwotCQlTdHJpbmcgREVGQVVMVF9TSVpFX1BST1BFUlRZID0gImRlZmF1bHRTaXplIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgREVGQVVMVF9TSVpFID0gMTAwOwotCi0KLQkvLyAqKioqKioqKioqIHNoYXJlZCAqKioqKioqKioqCi0JCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgY29tYmluYXRpb24gb2YgZGVmYXVsdFNoYXJlZCBhbmQgc3BlY2lmaWVkU2hhcmVkLgotCSAqIElmIGdldFNwZWNpZmllZFNoYXJlZCgpIHJldHVybnMgbnVsbCwgdGhlbiByZXR1cm4gaXNEZWZhdWx0U2hhcmVkKCkKLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkKCk7Ci0JCi0JQm9vbGVhbiBnZXRTcGVjaWZpZWRTaGFyZWQoKTsKLQkKLQkvKioKLQkgKiBTcGVjaWZ5aW5nIDxlbT5zaGFyZWQ8L2VtPiA8Y29kZT5mYWxzZTwvY29kZT4gd2lsbCByZXR1cm4gdGhlIGZvbGxvd2luZwotCSAqIGNhY2hpbmcgc2V0dGluZ3MgdG8gdGhlaXIgZGVmYXVsdHM6PHVsPgotCSAqIDxsaT50eXBlCi0JICogPGxpPnNpemUKLQkgKiA8bGk+YWx3YXlzIHJlZnJlc2gKLQkgKiA8bGk+cmVmcmVzaCBvbmx5IGlmIG5ld2VyCi0JICogPGxpPmRpc2FibGUgaGl0cwotCSAqIDxsaT5jb29yZGluYXRpb24gdHlwZQotCSAqIDwvdWw+Ci0JICogQWRkaXRpb25hbGx5LCB0aGUgZm9sbG93aW5nIHNldHRpbmdzIHdpbGwgYmUgY2xlYXJlZDo8dWw+Ci0JICogPGxpPmV4cGlyeQotCSAqIDxsaT5leHBpcnkgdGltZSBvZiBkYXkKLQkgKiA8L3VsPgotCSAqIFRoZXNlIHNldHRpbmdzIGRvIG5vdCBhcHBseSB0byBhbiB1bmNoYXJlZCBjYWNoZS4KLQkgKi8KLQl2b2lkIHNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuIHNoYXJlZCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfU0hBUkVEX1BST1BFUlRZID0gInNwZWNpZmllZFNoYXJlZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlib29sZWFuIGlzRGVmYXVsdFNoYXJlZCgpOwotCQlTdHJpbmcgREVGQVVMVF9TSEFSRURfUFJPUEVSVFkgPSAiZGVmYXVsdFNoYXJlZCI7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBERUZBVUxUX1NIQVJFRCA9IHRydWU7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBhbHdheXMgcmVmcmVzaCAqKioqKioqKioqCi0JCQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHRBbHdheXNSZWZyZXNoIGFuZCBzcGVjaWZpZWRBbHdheXNSZWZyZXNoLgotCSAqIElmIGdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKQotCSAqLwotCWJvb2xlYW4gaXNBbHdheXNSZWZyZXNoKCk7Ci0JCi0JQm9vbGVhbiBnZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4gYWx3YXlzUmVmcmVzaCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFkgPSAic3BlY2lmaWVkQWx3YXlzUmVmcmVzaCI7IC8vJE5PTi1OTFMtMSQKLQotCWJvb2xlYW4gaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpOwotCQlTdHJpbmcgREVGQVVMVF9BTFdBWVNfUkVGUkVTSF9QUk9QRVJUWSA9ICJkZWZhdWx0QWx3YXlzUmVmcmVzaCI7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBERUZBVUxUX0FMV0FZU19SRUZSRVNIID0gZmFsc2U7Ci0JCi0KLQkvLyAqKioqKioqKioqIHJlZnJlc2ggb25seSBpZiBuZXdlciAqKioqKioqKioqCi0JCQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIgYW5kIHNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlci4KLQkgKiBJZiBnZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpCi0JICovCi0JYm9vbGVhbiBpc1JlZnJlc2hPbmx5SWZOZXdlcigpOwotCQotCUJvb2xlYW4gZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXIpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1JFRlJFU0hfT05MWV9JRl9ORVdFUl9QUk9QRVJUWSA9ICJzcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIiOyAvLyROT04tTkxTLTEkCi0KLQlib29sZWFuIGlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpOwotCQlTdHJpbmcgREVGQVVMVF9SRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFkgPSAiZGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlciI7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBERUZBVUxUX1JFRlJFU0hfT05MWV9JRl9ORVdFUiA9IGZhbHNlOwotCQotCQkKLQkvLyAqKioqKioqKioqIGRpc2FibGUgaGl0cyAqKioqKioqKioqCi0JCQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHREaXNhYmxlSGl0cyBhbmQgc3BlY2lmaWVkRGlzYWJsZUhpdHMuCi0JICogSWYgZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGdldERlZmF1bHREaXNhYmxlSGl0cygpCi0JICovCi0JYm9vbGVhbiBpc0Rpc2FibGVIaXRzKCk7Ci0JCi0JQm9vbGVhbiBnZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpOwotCXZvaWQgc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoQm9vbGVhbiBkaXNhYmxlSGl0cyk7Ci0JCVN0cmluZyBTUEVDSUZJRURfRElTQUJMRV9ISVRTX1BST1BFUlRZID0gInNwZWNpZmllZERpc2FibGVIaXRzIjsgLy8kTk9OLU5MUy0xJAotCi0JYm9vbGVhbiBpc0RlZmF1bHREaXNhYmxlSGl0cygpOwotCQlTdHJpbmcgREVGQVVMVF9ESVNBQkxFX0hJVFNfUFJPUEVSVFkgPSAiZGVmYXVsdERpc2FibGVIaXRzIjsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIERFRkFVTFRfRElTQUJMRV9ISVRTID0gZmFsc2U7Ci0JCi0JCQotCS8vICoqKioqKioqKiogY29vcmRpbmF0aW9uIHR5cGUgKioqKioqKioqKgotCQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHRDb29yZGluYXRpb25UeXBlIGFuZCBzcGVjaWZpZWRDb29yZGluYXRpb25UeXBlLgotCSAqIElmIGdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkKLQkgKi8KLQlFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRDb29yZGluYXRpb25UeXBlKCk7Ci0JCi0JRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpOwkKLQl2b2lkIHNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfQ09PUkRJTkFUSU9OX1RZUEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCUVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCk7CQkKLQkJU3RyaW5nIERFRkFVTFRfQ09PUkRJTkFUSU9OX1RZUEVfUFJPUEVSVFkgPSAiZGVmYXVsdENvb3JkaW5hdGlvblR5cGUiOyAvLyROT04tTkxTLTEkCi0JCUVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIERFRkFVTFRfQ09PUkRJTkFUSU9OX1RZUEUgPSBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTOwotCi0JCQotCS8vICoqKioqKioqKiogZXhwaXJ5ICoqKioqKioqKioKLQotCS8qKgotCSAqIGNvcnJlc3BvbmRzIHRvIHRoZSBDYWNoZSBleHBpcnkgZWxlbWVudC4gIElmIHRoaXMgcmV0dXJucwotCSAqIGEgbm9uLW51bGwgdmFsdWUgdGhlbiBnZXRFeHBpcnlUaW1lT2ZEYXkgd2lsbCByZXR1cm4gbnVsbC4KLQkgKiBJdCBpcyBub3QgdmFsaWQgdG8gc3BlY2lmeSBib3RoCi0JICovCi0JSW50ZWdlciBnZXRFeHBpcnkoKTsKLQkKLQkvKioKLQkgKiBTZXR0aW5nIHRoaXMgdG8gYSBub24tbnVsbCB2YWx1ZSB3aWxsIHNldCB0aW1lT2ZEYXlFeHBpcnkgdG8gbnVsbAotCSAqLwotCXZvaWQgc2V0RXhwaXJ5KEludGVnZXIgZXhwaXJ5KTsKLQkJU3RyaW5nIEVYUElSWV9QUk9QRVJUWSA9ICJleHBpcnkiOyAvLyROT04tTkxTLTEkCi0JCi0JCQotCS8vICoqKioqKioqKiogZXhwaXJ5IHRpbWUgb2YgZGF5ICoqKioqKioqKioKLQotCS8qKgotCSAqIGNvcnJlc3BvbmRzIHRvIHRoZSBDYWNoZSBleHBpcnlUaW1lT2ZEYXkgYW5ub3RhdGlvbiBvciB4bWwgZWxlbWVudC4gIAotCSAqIElmIHRoaXMgcmV0dXJucyBhIG5vbi1udWxsIHZhbHVlIHRoZW4gZ2V0RXhwaXJ5IHdpbGwgcmV0dXJuIG51bGwuCi0JICogSXQgaXMgbm90IHZhbGlkIHRvIHNwZWNpZnkgYm90aC4KLQkgKi8KLQlFY2xpcHNlTGlua1RpbWVPZkRheSBnZXRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJU3RyaW5nIEVYUElSWV9USU1FX09GX0RBWV9QUk9QRVJUWSA9ICJleHBpcnlUaW1lT2ZEYXkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQWRkIENhY2hlIGV4cGlyeVRpbWVPZkRheSBhbm5vdGF0aW9uIG9yIHhtbCBlbGVtZW50LCB0aGlzIHdpbGwgc2V0IAotCSAqIEV4cGlyeSB0byBudWxsIGFzIGl0IGlzIG5vdCB2YWxpZCB0byBzZXQgYm90aCBleHBpcnkgYW5kIHRpbWVPZkRheUV4cGlyeQotCSAqLwotCUVjbGlwc2VMaW5rVGltZU9mRGF5IGFkZEV4cGlyeVRpbWVPZkRheSgpOwotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIENhY2hlIGV4cGlyeVRpbWVPZkRheSBhbm5vdGF0aW9uL3htbCBlbGVtZW50Ci0JICovCi0Jdm9pZCByZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKTsKLQkKLQotCS8vICoqKioqKioqKiogZXhpc3RlbmNlIHR5cGUgKioqKioqKioqKgotCS8vIFRPRE8gYmp2IHJlbmFtZSBleGlzdGVuY2VDaGVja2luZ1BvbGljeQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHRFeGlzdGVuY2VUeXBlIGFuZCBzcGVjaWZpZWRFeGlzdGVuY2VUeXBlLgotCSAqIElmIGdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkKLQkgKi8KLQlFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZ2V0RXhpc3RlbmNlVHlwZSgpOwotCQotCUVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBnZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCk7CQotCXZvaWQgc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgdHlwZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfRVhJU1RFTkNFX1RZUEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkRXhpc3RlbmNlVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCUVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBnZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpOwkJCi0JCVN0cmluZyBERUZBVUxUX0VYSVNURU5DRV9UWVBFX1BST1BFUlRZID0gImRlZmF1bHRFeGlzdGVuY2VUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQlFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgREVGQVVMVF9FWElTVEVOQ0VfVFlQRSA9IEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRTsKLQotCi0JLy8gKioqKioqKioqKiBpc29sYXRpb24gYWRkZWQgaW4gRWNsaXBzZUxpbmsgMi4yICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHRJc29sYXRpb24gYW5kIHNwZWNpZmllZElzb2xhdGlvbi4KLQkgKiBJZiBnZXRTcGVjaWZpZWRJc29sYXRpb24oKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGdldERlZmF1bHRJc29sYXRpb24oKQotCSAqLwotCUVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yIGdldElzb2xhdGlvbigpOwotCi0JRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIgZ2V0U3BlY2lmaWVkSXNvbGF0aW9uKCk7CQotCXZvaWQgc2V0U3BlY2lmaWVkSXNvbGF0aW9uKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yIGlzb2xhdGlvbik7Ci0JCVN0cmluZyBTUEVDSUZJRURfSVNPTEFUSU9OX1BST1BFUlRZID0gInNwZWNpZmllZElzb2xhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCQlFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMiBnZXREZWZhdWx0SXNvbGF0aW9uKCk7CQkKLQkJU3RyaW5nIERFRkFVTFRfSVNPTEFUSU9OX1BST1BFUlRZID0gImRlZmF1bHRJc29sYXRpb24iOyAvLyROT04tTkxTLTEkCi0JCUVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yIERFRkFVTFRfSVNPTEFUSU9OID0gRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIuU0hBUkVEOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjRhZmU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgY2hhbmdlIHRyYWNraW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcKLQlleHRlbmRzIEpwYUNvbnRleHROb2RlCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgdHlwZSBpZiBpdCBpcyBwcmVzZW50LCBvdGhlcndpc2UgcmV0dXJuIHRoZSBkZWZhdWx0Ci0JICogdHlwZS4KLQkgKi8KLQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBnZXRUeXBlKCk7Ci0KLQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBnZXRTcGVjaWZpZWRUeXBlKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIHR5cGUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1RZUEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIGdldERlZmF1bHRUeXBlKCk7Ci0JCVN0cmluZyBERUZBVUxUX1RZUEVfUFJPUEVSVFkgPSAiZGVmYXVsdFR5cGUiOyAvLyROT04tTkxTLTEkCi0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIERFRkFVTFRfVFlQRSA9IEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE87Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNGQ1YTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nVHlwZTsKLQotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBlbnVtIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIHsKLQotCUFUVFJJQlVURSwKLQlPQkpFQ1QsCi0JREVGRVJSRUQsCi0JQVVUTzsKLQkKLQotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgZnJvbUphdmFSZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZSBqYXZhQ2hhbmdlVHJhY2tpbmdUeXBlKSB7Ci0JCWlmIChqYXZhQ2hhbmdlVHJhY2tpbmdUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoamF2YUNoYW5nZVRyYWNraW5nVHlwZSkgewotCQkJY2FzZSBBVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIEFUVFJJQlVURTsKLQkJCWNhc2UgT0JKRUNUOgotCQkJCXJldHVybiBPQkpFQ1Q7Ci0JCQljYXNlIERFRkVSUkVEOgotCQkJCXJldHVybiBERUZFUlJFRDsKLQkJCWNhc2UgQVVUTzoKLQkJCQlyZXR1cm4gQVVUTzsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjaGFuZ2UgdHJhY2tpbmcgdHlwZTogIiArIGphdmFDaGFuZ2VUcmFja2luZ1R5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZSB0b0phdmFSZXNvdXJjZU1vZGVsKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIGNoYW5nZVRyYWNraW5nVHlwZSkgewotCQlpZiAoY2hhbmdlVHJhY2tpbmdUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoY2hhbmdlVHJhY2tpbmdUeXBlKSB7Ci0JCQljYXNlIEFUVFJJQlVURToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURTsKLQkJCWNhc2UgT0JKRUNUOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUOwotCQkJY2FzZSBERUZFUlJFRDoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEOwotCQkJY2FzZSBBVVRPOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVVUTzsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjaGFuZ2UgdHJhY2tpbmcgdHlwZTogIiArIGNoYW5nZVRyYWNraW5nVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIGZyb21Pcm1SZXNvdXJjZU1vZGVsKFhtbENoYW5nZVRyYWNraW5nVHlwZSBvcm1DaGFuZ2VUcmFja2luZ1R5cGUpIHsKLQkJaWYgKG9ybUNoYW5nZVRyYWNraW5nVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKG9ybUNoYW5nZVRyYWNraW5nVHlwZSkgewotCQkJY2FzZSBBVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIEFUVFJJQlVURTsKLQkJCWNhc2UgT0JKRUNUOgotCQkJCXJldHVybiBPQkpFQ1Q7Ci0JCQljYXNlIERFRkVSUkVEOgotCQkJCXJldHVybiBERUZFUlJFRDsKLQkJCWNhc2UgQVVUTzoKLQkJCQlyZXR1cm4gQVVUTzsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjaGFuZ2UgdHJhY2tpbmcgdHlwZTogIiArIG9ybUNoYW5nZVRyYWNraW5nVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFhtbENoYW5nZVRyYWNraW5nVHlwZSB0b09ybVJlc291cmNlTW9kZWwoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgY2hhbmdlVHJhY2tpbmdUeXBlKSB7Ci0JCWlmIChjaGFuZ2VUcmFja2luZ1R5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChjaGFuZ2VUcmFja2luZ1R5cGUpIHsKLQkJCWNhc2UgQVRUUklCVVRFOgotCQkJCXJldHVybiBYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFOwotCQkJY2FzZSBPQkpFQ1Q6Ci0JCQkJcmV0dXJuIFhtbENoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1Q7Ci0JCQljYXNlIERFRkVSUkVEOgotCQkJCXJldHVybiBYbWxDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQ7Ci0JCQljYXNlIEFVVE86Ci0JCQkJcmV0dXJuIFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVVRPOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNoYW5nZSB0cmFja2luZyB0eXBlOiAiICsgY2hhbmdlVHJhY2tpbmdUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjBjMTY1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byBhIENvbnZlcnNpb25WYWx1ZSByZXNvdXJjZSBtb2RlbCBvYmplY3QKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlCi0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBnZXRQYXJlbnQoKTsKLQotCVN0cmluZyBnZXREYXRhVmFsdWUoKTsJCi0Jdm9pZCBzZXREYXRhVmFsdWUoU3RyaW5nIGRhdGFWYWx1ZSk7Ci0JCVN0cmluZyBEQVRBX1ZBTFVFX1BST1BFUlRZID0gImRhdGFWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JU3RyaW5nIGdldE9iamVjdFZhbHVlKCk7CQotCXZvaWQgc2V0T2JqZWN0VmFsdWUoU3RyaW5nIG9iamVjdFZhbHVlKTsKLQkJU3RyaW5nIE9CSkVDVF9WQUxVRV9QUk9QRVJUWSA9ICJvYmplY3RWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb252ZXJzaW9uIHZhbHVlIGhhcyB0aGUgc2FtZSBzdGF0ZSBhcyB0aGUgc3BlY2lmaWVkCi0JICogY29udmVyc2lvbiB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIGlzRXF1aXZhbGVudFRvKEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ29udmVydC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3ZjMzNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ29udmVydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBjb252ZXJ0IChub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBFY2xpcHNlTGluayBjb252ZXJ0ZXIpCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0NvbnZlcnQKLQlleHRlbmRzIENvbnZlcnRlcgotewotCi0JRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0KLQlTdHJpbmcgZ2V0Q29udmVydGVyTmFtZSgpOwotCQotCVN0cmluZyBnZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKFN0cmluZyBjb252ZXJ0ZXJOYW1lKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9DT05WRVJURVJfTkFNRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRDb252ZXJ0ZXJOYW1lIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBnZXREZWZhdWx0Q29udmVydGVyTmFtZSgpOwotCQlTdHJpbmcgREVGQVVMVF9DT05WRVJURVJfTkFNRV9QUk9QRVJUWSA9ICJkZWZhdWx0Q29udmVydGVyTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJlc2VydmVkIG5hbWUgZm9yIHNwZWNpZnlpbmcgYSBzZXJpYWxpemVkIG9iamVjdCBjb252ZXJ0ZXIuCi0JICogSW4gdGhpcyBjYXNlIGEgY29ycmVzcG9uZGluZyBAQ3VzdG9tQ29udmVydGVyIGlzIHVubmVjZXNzYXJ5LgotCSAqLwotCVN0cmluZyBTRVJJQUxJWkVEX0NPTlZFUlRFUiA9ICJzZXJpYWxpemVkIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJlc2VydmVkIG5hbWUgZm9yIHNwZWNpZnlpbmcgYSBjbGFzcyBpbnN0YW5jZSBjb252ZXJ0ZXIuCi0JICogV2lsbCB1c2UgYSBDbGFzc0luc3RhbmNlQ29udmVydGVyCi0JICogb24gdGhlIGFzc29jaWF0ZWQgbWFwcGluZy4gV2hlbiB1c2luZyBhIENsYXNzSW5zdGFuY2VDb252ZXJ0ZXIgdGhlIGRhdGFiYXNlIHJlcHJlc2VudGF0aW9uIGlzIGEgCi0JICogU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgQ2xhc3MgbmFtZSBhbmQgdGhlIG9iamVjdC1tb2RlbCByZXByZXNlbnRhdGlvbiBpcyBhbiBpbnN0YW5jZSAKLQkgKiBvZiB0aGF0IGNsYXNzIGJ1aWx0IHdpdGggdGhlIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IuCi0JICogSW4gdGhpcyBjYXNlIGEgY29ycmVzcG9uZGluZyBAQ3VzdG9tQ29udmVydGVyIGlzIHVubmVjZXNzYXJ5LgotCSAqLwotCVN0cmluZyBDTEFTU19JTlNUQU5DRV9DT05WRVJURVIgPSAiY2xhc3MtaW5zdGFuY2UiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmVzZXJ2ZWQgbmFtZSBmb3Igc3BlY2lmeWluZyBubyBjb252ZXJ0ZXIuCi0JICogVGhpcyBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSBhIHNpdHVhdGlvbiB3aGVyZSBlaXRoZXIgCi0JICogYW5vdGhlciBjb252ZXJ0ZXIgaXMgZGVmYXVsdGVkIG9yIGFub3RoZXIgY29udmVydGVyIGlzIHNldC4KLQkgKiBJbiB0aGlzIGNhc2UgYSBjb3JyZXNwb25kaW5nIEBDdXN0b21Db252ZXJ0ZXIgaXMgdW5uZWNlc3NhcnkuCi0JICovCi0JU3RyaW5nIE5PX0NPTlZFUlRFUiA9ICJub25lIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZ1tdIFJFU0VSVkVEX0NPTlZFUlRFUl9OQU1FUyA9IHtOT19DT05WRVJURVIsIENMQVNTX0lOU1RBTkNFX0NPTlZFUlRFUiwgU0VSSUFMSVpFRF9DT05WRVJURVJ9OwotCQotCVN0cmluZyBERUZBVUxUX0NPTlZFUlRFUl9OQU1FID0gTk9fQ09OVkVSVEVSOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTAzNzZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDb252ZXJ0ZXJDbGFzc0NvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnRlckNsYXNzQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZjQwMGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnRlckNsYXNzQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gYSAqQ29udmVydGVyQ2xhc3NDb252ZXJ0ZXIgcmVzb3VyY2UgbW9kZWwgb2JqZWN0Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAyLjQKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQ29udmVydGVyQ2xhc3NDb252ZXJ0ZXIKLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyCi17Ci0JU3RyaW5nIGdldENvbnZlcnRlckNsYXNzKCk7CQotCQlTdHJpbmcgQ09OVkVSVEVSX0NMQVNTX1BST1BFUlRZID0gImNvbnZlcnRlckNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXZvaWQgc2V0Q29udmVydGVyQ2xhc3MoU3RyaW5nIGNvbnZlcnRlckNsYXNzKTsKLQotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzKCk7CQotCQlTdHJpbmcgRlVMTFlfUVVBTElGSUVEX0NPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSA9ICJmdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjZjNWU2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBjb252ZXJ0ZXIgY29udGFpbmVyCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcgotCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQlJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4gZ2V0Q29udmVydGVycygpOwotCQotCWludCBnZXRDb252ZXJ0ZXJzU2l6ZSgpOwotCi0JaW50IGdldE51bWJlclN1cHBvcnRlZENvbnZlcnRlcnMoKTsKLQotCQotCS8vKioqKioqKioqKioqIGN1c3RvbUNvbnZlcnRlcnMgKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgY3VzdG9tIGNvbnZlcnRlcnMuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IGdldEN1c3RvbUNvbnZlcnRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGN1c3RvbSBjb252ZXJ0ZXJzLgotCSAqLwotCWludCBnZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpOwotCi0JLyoqCi0JICogQWRkIGEgY3VzdG9tIGNvbnZlcnRlciB0byB0aGUgY29udmVydGVyIGhvbGRlciwgcmV0dXJuIHRoZSBvYmplY3QgcmVwcmVzZW50aW5nIGl0LgotCSAqLwotCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGFkZEN1c3RvbUNvbnZlcnRlcihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBjdXN0b20gY29udmVydGVyIGF0IHRoZSBpbmRleCBmcm9tIHRoZSBjb252ZXJ0ZXIgaG9sZGVyLgotCSAqLwotCXZvaWQgcmVtb3ZlQ3VzdG9tQ29udmVydGVyKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGN1c3RvbSBjb252ZXJ0ZXIgYXQgZnJvbSB0aGUgY29udmVydGVyIGhvbGRlci4KLQkgKi8KLQl2b2lkIHJlbW92ZUN1c3RvbUNvbnZlcnRlcihFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb252ZXJ0ZXIpOwotCi0JLyoqCi0JICogTW92ZSB0aGUgY3VzdG9tIGNvbnZlcnRlciBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlIHRhcmdldCBpbmRleC4KLQkgKi8KLQl2b2lkIG1vdmVDdXN0b21Db252ZXJ0ZXIoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCi0JU3RyaW5nIENVU1RPTV9DT05WRVJURVJTX0xJU1QgPSAiY3VzdG9tQ29udmVydGVycyI7IC8vJE5PTi1OTFMtMSQKLQotCQotCS8vKioqKioqKioqKioqIG9iamVjdCB0eXBlIGNvbnZlcnRlcnMgKioqKioqKioqKioqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBvYmplY3QgdHlwZSBjb252ZXJ0ZXJzLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIG9iamVjdCB0eXBlIGNvbnZlcnRlcnMuCi0JICovCi0JaW50IGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpOwotCi0JLyoqCi0JICogQWRkIGEgb2JqZWN0IHR5cGUgY29udmVydGVyIHRvIHRoZSBjb252ZXJ0ZXIgaG9sZGVyLCByZXR1cm4gdGhlIG9iamVjdCByZXByZXNlbnRpbmcgaXQuCi0JICovCi0JRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgb2JqZWN0IHR5cGUgY29udmVydGVyIGF0IHRoZSBpbmRleCBmcm9tIHRoZSBjb252ZXJ0ZXIgaG9sZGVyLgotCSAqLwotCXZvaWQgcmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBvYmplY3QgdHlwZSBjb252ZXJ0ZXIgYXQgZnJvbSB0aGUgY29udmVydGVyIGhvbGRlci4KLQkgKi8KLQl2b2lkIHJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlcik7Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBvYmplY3QgdHlwZSBjb252ZXJ0ZXIgZnJvbSB0aGUgc291cmNlIGluZGV4IHRvIHRoZSB0YXJnZXQgaW5kZXguCi0JICovCi0Jdm9pZCBtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0KLQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSU19MSVNUID0gIm9iamVjdFR5cGVDb252ZXJ0ZXJzIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCS8vKioqKioqKioqKioqIHN0cnVjdCBjb252ZXJ0ZXJzICoqKioqKioqKioqKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgc3RydWN0IGNvbnZlcnRlcnMuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IGdldFN0cnVjdENvbnZlcnRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHN0cnVjdCBjb252ZXJ0ZXJzLgotCSAqLwotCWludCBnZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpOwotCi0JLyoqCi0JICogQWRkIGEgc3RydWN0IGNvbnZlcnRlciB0byB0aGUgY29udmVydGVyIGhvbGRlciwgcmV0dXJuIHRoZSBvYmplY3QgcmVwcmVzZW50aW5nIGl0LgotCSAqLwotCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGFkZFN0cnVjdENvbnZlcnRlcihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzdHJ1Y3QgY29udmVydGVyIGF0IHRoZSBpbmRleCBmcm9tIHRoZSBjb252ZXJ0ZXIgaG9sZGVyLgotCSAqLwotCXZvaWQgcmVtb3ZlU3RydWN0Q29udmVydGVyKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHN0cnVjdCBjb252ZXJ0ZXIgYXQgZnJvbSB0aGUgY29udmVydGVyIGhvbGRlci4KLQkgKi8KLQl2b2lkIHJlbW92ZVN0cnVjdENvbnZlcnRlcihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXIpOwotCi0JLyoqCi0JICogTW92ZSB0aGUgc3RydWN0IGNvbnZlcnRlciBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlIHRhcmdldCBpbmRleC4KLQkgKi8KLQl2b2lkIG1vdmVTdHJ1Y3RDb252ZXJ0ZXIoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCi0JU3RyaW5nIFNUUlVDVF9DT05WRVJURVJTX0xJU1QgPSAic3RydWN0Q29udmVydGVycyI7IC8vJE5PTi1OTFMtMSQKLQotCQotCS8vKioqKioqKioqKioqIHR5cGUgY29udmVydGVycyAqKioqKioqKioqKioqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3Igb2YgdGhlIHR5cGUgY29udmVydGVycy4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCi0JICovCi0JTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IGdldFR5cGVDb252ZXJ0ZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB0eXBlIGNvbnZlcnRlcnMuCi0JICovCi0JaW50IGdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpOwotCi0JLyoqCi0JICogQWRkIGEgdHlwZSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnZlcnRlciBob2xkZXIsIHJldHVybiB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyBpdC4KLQkgKi8KLQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgYWRkVHlwZUNvbnZlcnRlcihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSB0eXBlIGNvbnZlcnRlciBhdCB0aGUgaW5kZXggZnJvbSB0aGUgY29udmVydGVyIGhvbGRlci4KLQkgKi8KLQl2b2lkIHJlbW92ZVR5cGVDb252ZXJ0ZXIoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgdHlwZSBjb252ZXJ0ZXIgYXQgZnJvbSB0aGUgY29udmVydGVyIGhvbGRlci4KLQkgKi8KLQl2b2lkIHJlbW92ZVR5cGVDb252ZXJ0ZXIoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlcik7Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSB0eXBlIGNvbnZlcnRlciBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlIHRhcmdldCBpbmRleC4KLQkgKi8KLQl2b2lkIG1vdmVUeXBlQ29udmVydGVyKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQotCVN0cmluZyBUWVBFX0NPTlZFUlRFUlNfTElTVCA9ICJ0eXBlQ29udmVydGVycyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDb252ZXJ0aWJsZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDb252ZXJ0aWJsZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ0MDU3ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ29udmVydGlibGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIGNvbnZlcnRpYmxlIG1hcHBpbmcuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0NvbnZlcnRpYmxlTWFwcGluZwotewotCUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNDNiNWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBjdXN0b20gY29udmVydGVyCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcgotCWV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXJDbGFzc0NvbnZlcnRlcgotewotCVN0cmluZyBFQ0xJUFNFTElOS19DT05WRVJURVJfQ0xBU1NfTkFNRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDdXN0b21pemVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ3VzdG9taXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDUyMjM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDdXN0b21pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gYSBDdXN0b21pemVyIHJlc291cmNlIG1vZGVsIG9iamVjdAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtDdXN0b21pemVyCi0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCVN0cmluZyBnZXRDdXN0b21pemVyQ2xhc3MoKTsKLQkKLQlTdHJpbmcgZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCk7CQotCXZvaWQgc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKFN0cmluZyBjdXN0b21pemVyQ2xhc3MpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0NVU1RPTUlaRVJfQ0xBU1NfUFJPUEVSVFkgPSAic3BlY2lmaWVkQ3VzdG9taXplckNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29uZmlnLkRlc2NyaXB0b3JDdXN0b21pemVyIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIGdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKTsKLQkJU3RyaW5nIERFRkFVTFRfQ1VTVE9NSVpFUl9DTEFTU19QUk9QRVJUWSA9ICJkZWZhdWx0Q3VzdG9taXplckNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzKCk7Ci0JCVN0cmluZyBGVUxMWV9RVUFMSUZJRURfQ1VTVE9NSVpFUl9DTEFTU19QUk9QRVJUWSA9ICJmdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNoYXIgdG8gYmUgdXNlZCBmb3IgYnJvd3Npbmcgb3IgY3JlYXRpbmcgdGhlIGN1c3RvbWl6ZXIgY2xhc3MgSVR5cGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSNnZXRGdWxseVF1YWxpZmllZE5hbWUoY2hhcikKLQkgKi8KLQljaGFyIGdldEN1c3RvbWl6ZXJDbGFzc0VuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlmMDU1NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBlbGVtZW50IGNvbGxlY3Rpb24gbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAKLQlleHRlbmRzIEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCwgRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nLCBFY2xpcHNlTGlua0NvbnZlcnRpYmxlTWFwcGluZwotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rRW1iZWRkYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0VtYmVkZGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I4MzhkYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rRW1iZWRkYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rRW1iZWRkYWJsZSAKLQlleHRlbmRzIEVtYmVkZGFibGUsIEVjbGlwc2VMaW5rVHlwZU1hcHBpbmcKLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtFbnRpdHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM0ZTMyMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0VudGl0eQotCWV4dGVuZHMgRW50aXR5LCBFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZwotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ1Njk4ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi0vLyBUT0RPIGJqdiByZW5hbWUgdG8gRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ1BvbGljeQotcHVibGljIGVudW0gRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIHsKLQotICAgIENIRUNLX0NBQ0hFLAotICAgIENIRUNLX0RBVEFCQVNFLAotICAgIEFTU1VNRV9FWElTVEVOQ0UsCi0gICAgQVNTVU1FX05PTl9FWElTVEVOQ0U7Ci0JCi0KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBmcm9tSmF2YVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlVHlwZSBqYXZhRXhpc3RlbmNlVHlwZSkgewotCQlpZiAoamF2YUV4aXN0ZW5jZVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChqYXZhRXhpc3RlbmNlVHlwZSkgewotCQkJY2FzZSBDSEVDS19DQUNIRToKLQkJCQlyZXR1cm4gQ0hFQ0tfQ0FDSEU7Ci0JCQljYXNlIENIRUNLX0RBVEFCQVNFOgotCQkJCXJldHVybiBDSEVDS19EQVRBQkFTRTsKLQkJCWNhc2UgQVNTVU1FX0VYSVNURU5DRToKLQkJCQlyZXR1cm4gQVNTVU1FX0VYSVNURU5DRTsKLQkJCWNhc2UgQVNTVU1FX05PTl9FWElTVEVOQ0U6Ci0JCQkJcmV0dXJuIEFTU1VNRV9OT05fRVhJU1RFTkNFOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGV4aXN0ZW5jZSB0eXBlOiAiICsgamF2YUV4aXN0ZW5jZVR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZVR5cGUgdG9KYXZhUmVzb3VyY2VNb2RlbChFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZXhpc3RlbmNlVHlwZSkgewotCQlpZiAoZXhpc3RlbmNlVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGV4aXN0ZW5jZVR5cGUpIHsKLQkJCWNhc2UgQ0hFQ0tfQ0FDSEU6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZVR5cGUuQ0hFQ0tfQ0FDSEU7Ci0JCQljYXNlIENIRUNLX0RBVEFCQVNFOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFOwotCQkJY2FzZSBBU1NVTUVfRVhJU1RFTkNFOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0U7Ci0JCQljYXNlIEFTU1VNRV9OT05fRVhJU1RFTkNFOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGV4aXN0ZW5jZSB0eXBlOiAiICsgZXhpc3RlbmNlVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGZyb21Pcm1SZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZSBvcm1FeGlzdGVuY2VUeXBlKSB7Ci0JCWlmIChvcm1FeGlzdGVuY2VUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAob3JtRXhpc3RlbmNlVHlwZSkgewotCQkJY2FzZSBDSEVDS19DQUNIRToKLQkJCQlyZXR1cm4gQ0hFQ0tfQ0FDSEU7Ci0JCQljYXNlIENIRUNLX0RBVEFCQVNFOgotCQkJCXJldHVybiBDSEVDS19EQVRBQkFTRTsKLQkJCWNhc2UgQVNTVU1FX0VYSVNURU5DRToKLQkJCQlyZXR1cm4gQVNTVU1FX0VYSVNURU5DRTsKLQkJCWNhc2UgQVNTVU1FX05PTl9FWElTVEVOQ0U6Ci0JCQkJcmV0dXJuIEFTU1VNRV9OT05fRVhJU1RFTkNFOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGV4aXN0ZW5jZSB0eXBlOiAiICsgb3JtRXhpc3RlbmNlVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZSB0b09ybVJlc291cmNlTW9kZWwoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGV4aXN0ZW5jZVR5cGUpIHsKLQkJaWYgKGV4aXN0ZW5jZVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChleGlzdGVuY2VUeXBlKSB7Ci0JCQljYXNlIENIRUNLX0NBQ0hFOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQ0hFQ0tfQ0FDSEU7Ci0JCQljYXNlIENIRUNLX0RBVEFCQVNFOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0U7Ci0JCQljYXNlIEFTU1VNRV9FWElTVEVOQ0U6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFOwotCQkJY2FzZSBBU1NVTUVfTk9OX0VYSVNURU5DRToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGV4aXN0ZW5jZSB0eXBlOiAiICsgZXhpc3RlbmNlVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0lkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0lkTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTRmZjhiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtJZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgSUQgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtJZE1hcHBpbmcKLQlleHRlbmRzIElkTWFwcGluZywgRWNsaXBzZUxpbmtDb252ZXJ0aWJsZU1hcHBpbmcKLXsKLQlFY2xpcHNlTGlua011dGFibGUgZ2V0TXV0YWJsZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0pvaW5GZXRjaC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0pvaW5GZXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGZhMWNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtKb2luRmV0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtKb2luRmV0Y2gKLQlleHRlbmRzIEpwYUNvbnRleHROb2RlCi17Ci0JRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIGdldFZhbHVlKCk7Ci0Jdm9pZCBzZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgdmFsdWUpOwotCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0JCUVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBERUZBVUxUX1ZBTFVFID0gRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0pvaW5GZXRjaE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3OTY2ZjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0pvaW5GZXRjaE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIGpvaW4tZmV0Y2ggbWFwcGluZy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nCi0JZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nCi17Ci0JRWNsaXBzZUxpbmtKb2luRmV0Y2ggZ2V0Sm9pbkZldGNoKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYxYTJjOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgZW51bSBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgewotCi0JSU5ORVIsCi0JT1VURVI7Ci0JCi0KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBmcm9tSmF2YVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZSBqYXZhSm9pbkZldGNoVHlwZSkgewotCQlpZiAoamF2YUpvaW5GZXRjaFR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChqYXZhSm9pbkZldGNoVHlwZSkgewotCQkJY2FzZSBJTk5FUjoKLQkJCQlyZXR1cm4gSU5ORVI7Ci0JCQljYXNlIE9VVEVSOgotCQkJCXJldHVybiBPVVRFUjsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBqb2luIGZldGNoIHR5cGU6ICIgKyBqYXZhSm9pbkZldGNoVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZSB0b0phdmFSZXNvdXJjZU1vZGVsKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBqb2luRmV0Y2hUeXBlKSB7Ci0JCWlmIChqb2luRmV0Y2hUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoam9pbkZldGNoVHlwZSkgewotCQkJY2FzZSBJTk5FUjoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5JTk5FUjsKLQkJCWNhc2UgT1VURVI6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVI7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gam9pbiBmZXRjaCB0eXBlOiAiICsgam9pbkZldGNoVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIGZyb21Pcm1SZXNvdXJjZU1vZGVsKFhtbEpvaW5GZXRjaFR5cGUgb3JtSm9pbkZldGNoVHlwZSkgewotCQlpZiAob3JtSm9pbkZldGNoVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKG9ybUpvaW5GZXRjaFR5cGUpIHsKLQkJCWNhc2UgSU5ORVI6Ci0JCQkJcmV0dXJuIElOTkVSOwotCQkJY2FzZSBPVVRFUjoKLQkJCQlyZXR1cm4gT1VURVI7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gam9pbiBmZXRjaCB0eXBlOiAiICsgb3JtSm9pbkZldGNoVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFhtbEpvaW5GZXRjaFR5cGUgdG9Pcm1SZXNvdXJjZU1vZGVsKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBmZXRjaFR5cGUpIHsKLQkJaWYgKGZldGNoVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGZldGNoVHlwZSkgewotCQkJY2FzZSBJTk5FUjoKLQkJCQlyZXR1cm4gWG1sSm9pbkZldGNoVHlwZS5JTk5FUjsKLQkJCWNhc2UgT1VURVI6Ci0JCQkJcmV0dXJuIFhtbEpvaW5GZXRjaFR5cGUuT1VURVI7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gam9pbiBmZXRjaCB0eXBlOiAiICsgZmV0Y2hUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTc5Y2UxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIHJlbGF0aW9uc2hpcCAoMToxLCAxOm0sIG06MSwgbTptKSBtYXBwaW5nLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZyAKLQlleHRlbmRzIE1hbnlUb01hbnlNYXBwaW5nLCBFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcsIEVjbGlwc2VMaW5rQ29udmVydGlibGVNYXBwaW5nCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDE3NDc1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGVkU3VwZXJjbGFzczsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzCi0JZXh0ZW5kcyBNYXBwZWRTdXBlcmNsYXNzLCBFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZwotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkM2YwYWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBtdWx0aXRlbmFuY3kKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zCi0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCi0JYm9vbGVhbiBpc011bHRpdGVuYW50KCk7Ci0JYm9vbGVhbiBpc0RlZmF1bHRNdWx0aXRlbmFudCgpOwotCQlTdHJpbmcgREVGQVVMVF9NVUxUSVRFTkFOVF9QUk9QRVJUWSA9ICJkZWZhdWx0TXVsdGl0ZW5hbnQiOyAvLyROT04tTkxTLTEkCi0JYm9vbGVhbiBpc1NwZWNpZmllZE11bHRpdGVuYW50KCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRNdWx0aXRlbmFudChib29sZWFuIGlzTXVsdGl0ZW5hbnQpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX01VTFRJVEVOQU5UX1BST1BFUlRZID0gInNwZWNpZmllZE11bHRpdGVuYW50IjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gKioqKioqKioqKiB0eXBlICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHRUeXBlIGFuZCBzcGVjaWZpZWRUeXBlLgotCSAqIElmIGdldFNwZWNpZmllZFR5cGUoKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGdldERlZmF1bHRUeXBlKCkKLQkgKi8KLQlFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMyBnZXRUeXBlKCk7Ci0KLQlFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMyBnZXRTcGVjaWZpZWRUeXBlKCk7CQotCXZvaWQgc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMyB0eXBlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9UWVBFX1BST1BFUlRZID0gInNwZWNpZmllZFR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMyBnZXREZWZhdWx0VHlwZSgpOwkJCi0JCVN0cmluZyBERUZBVUxUX1RZUEVfUFJPUEVSVFkgPSAiZGVmYXVsdFR5cGUiOyAvLyROT04tTkxTLTEkCi0JCUVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zIERFRkFVTFRfVFlQRSA9IEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlNJTkdMRV9UQUJMRTsKLQotCi0JLy8gKioqKioqKioqKiBpbmNsdWRlIGNyaXRlcmlhIChFY2xpcHNlTGluayAyLjQrKSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBjb21iaW5hdGlvbiBvZiBkZWZhdWx0SW5jbHVkZUNyaXRlcmlhIGFuZCBzcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEuCi0JICogSWYgZ2V0U3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhKCkgcmV0dXJucyBudWxsLCB0aGVuIHJldHVybiBpc0RlZmF1bHRJbmNsdWRlQ3JpdGVyaWEoKQotCSAqLwotCWJvb2xlYW4gaXNJbmNsdWRlQ3JpdGVyaWEoKTsKLQotCUJvb2xlYW4gZ2V0U3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoQm9vbGVhbiBpbmNsdWRlQ3JpdGVyaWEpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0lOQ0xVREVfQ1JJVEVSSUFfUFJPUEVSVFkgPSAic3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhIjsgLy8kTk9OLU5MUy0xJAotCi0JYm9vbGVhbiBpc0RlZmF1bHRJbmNsdWRlQ3JpdGVyaWEoKTsKLQkJU3RyaW5nIERFRkFVTFRfSU5DTFVERV9DUklURVJJQV9QUk9QRVJUWSA9ICJkZWZhdWx0SW5jbHVkZUNyaXRlcmlhIjsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIERFRkFVTFRfSU5DTFVERV9DUklURVJJQSA9IHRydWU7Ci0KLQotCS8vICoqKioqKioqKiogdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdC4KLQkgKi8KLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMsIHdoZXRoZXIgc3BlY2lmaWVkIGFuZCBkZWZhdWx0LgotCSAqLwotCWludCBnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKTsKLQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhYmxlIG9mIHRoZSBzcGVjaWZpZWQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucy4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCi0JICovCi0JTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBnZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlNfTElTVCA9ICJzcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHNwZWNpZmllZCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zLgotCSAqLwotCWludCBnZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgc3BlY2lmaWVkIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMuCi0JICovCi0JYm9vbGVhbiBoYXNTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpOwotCi0JLyoqCi0JICogQWRkIGEgc3BlY2lmaWVkIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbiBhbmQgcmV0dXJuIHRoZSBvYmplY3QKLQkgKiByZXByZXNlbnRpbmcgaXQuCi0JICovCi0JVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBhZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0KLQkvKioKLQkgKiBBZGQgYSBzcGVjaWZpZWQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uIGFuZCByZXR1cm4gdGhlIG9iamVjdAotCSAqIHJlcHJlc2VudGluZyBpdC4KLQkgKi8KLQlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbi4KLQkgKi8KLQl2b2lkIHJlbW92ZVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbiBhdCB0aGUgaW5kZXguCi0JICovCi0Jdm9pZCByZW1vdmVTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBzcGVjaWZpZWQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uIGZyb20gdGhlIHNvdXJjZSBpbmRleCB0byB0aGUgdGFyZ2V0IGluZGV4LgotCSAqLwotCXZvaWQgbW92ZVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhYmxlIG9mIHRoZSBkZWZhdWx0IHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLiBJZiB0aGVyZSBhcmUgc3BlY2lmaWVkIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMKLQkgKiB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gZGVmYXVsdCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zLgotCSAqLwotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGdldERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpOwotCQlTdHJpbmcgREVGQVVMVF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TX0xJU1QgPSAiZGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZGVmYXVsdCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zLgotCSAqLwotCWludCBnZXREZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4gaXMgYWxsb3dlZCBmb3IgdGhpcyB0eXBlIG1hcHBpbmcuCi0JICogSXQgaXMgYWxsb3dlZCBpZiBpdCBpcyBhIG1hcHBlZC1zdXBlcmNsYXNzLCB0aGUgcm9vdCBlbnRpdHkgaW4gdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSwKLQkgKiBvciB0aGUgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kgaXMgdGFibGUtcGVyLWNsYXNzCi0JICovCi0JYm9vbGVhbiBzcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0FsbG93ZWQoKTsKLSAJCVN0cmluZyBTUEVDSUZJRURfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OU19BTExPV0VEX1BST1BFUlRZID0gInNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQWxsb3dlZCI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYW55IG9mIHRoZSB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zIChzcGVjaWZpZWQgb3IgZGVmYXVsdCkKLQkgKiBoYXZlIHRoZSBwcmltYXJ5S2V5IG9wdGlvbiBzZXQgdG8gdHJ1ZQotCSAqLwotIAlib29sZWFuIHVzZXNQcmltYXJ5S2V5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzA0ZTRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgZW51bSBFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMyB7Ci0KLQlTSU5HTEVfVEFCTEUsCi0JVEFCTEVfUEVSX1RFTkFOVCwKLQlWUEQ7Ci0KLQotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMgZnJvbUphdmFSZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLk11bHRpdGVuYW50VHlwZTJfMyBqYXZhTXVsdGl0ZW5hbnRUeXBlKSB7Ci0JCWlmIChqYXZhTXVsdGl0ZW5hbnRUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoamF2YU11bHRpdGVuYW50VHlwZSkgewotCQkJY2FzZSBTSU5HTEVfVEFCTEU6Ci0JCQkJcmV0dXJuIFNJTkdMRV9UQUJMRTsKLQkJCWNhc2UgVEFCTEVfUEVSX1RFTkFOVDoKLQkJCQlyZXR1cm4gVEFCTEVfUEVSX1RFTkFOVDsKLQkJCWNhc2UgVlBEOgotCQkJCXJldHVybiBWUEQ7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gbXVsdGl0ZW5hbnQgdHlwZTogIiArIGphdmFNdWx0aXRlbmFudFR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLk11bHRpdGVuYW50VHlwZTJfMyB0b0phdmFSZXNvdXJjZU1vZGVsKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zIG11bHRpdGVuYW50VHlwZSkgewotCQlpZiAobXVsdGl0ZW5hbnRUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAobXVsdGl0ZW5hbnRUeXBlKSB7Ci0JCQljYXNlIFNJTkdMRV9UQUJMRToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuTXVsdGl0ZW5hbnRUeXBlMl8zLlNJTkdMRV9UQUJMRTsKLQkJCWNhc2UgVEFCTEVfUEVSX1RFTkFOVDoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuTXVsdGl0ZW5hbnRUeXBlMl8zLlRBQkxFX1BFUl9URU5BTlQ7Ci0JCQljYXNlIFZQRDoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuTXVsdGl0ZW5hbnRUeXBlMl8zLlZQRDsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBtdWx0aXRlbmFudCB0eXBlOiAiICsgbXVsdGl0ZW5hbnRUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMyBmcm9tT3JtUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuTXVsdGl0ZW5hbnRUeXBlIG9ybU11bHRpdGVuYW50VHlwZSkgewotCQlpZiAob3JtTXVsdGl0ZW5hbnRUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAob3JtTXVsdGl0ZW5hbnRUeXBlKSB7Ci0JCQljYXNlIFNJTkdMRV9UQUJMRToKLQkJCQlyZXR1cm4gU0lOR0xFX1RBQkxFOwotCQkJY2FzZSBUQUJMRV9QRVJfVEVOQU5UOgotCQkJCXJldHVybiBUQUJMRV9QRVJfVEVOQU5UOwotCQkJY2FzZSBWUEQ6Ci0JCQkJcmV0dXJuIFZQRDsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBtdWx0aXRlbmFudCB0eXBlOiAiICsgb3JtTXVsdGl0ZW5hbnRUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuTXVsdGl0ZW5hbnRUeXBlIHRvT3JtUmVzb3VyY2VNb2RlbChFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMyBtdWx0aXRlbmFudFR5cGUpIHsKLQkJaWYgKG11bHRpdGVuYW50VHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKG11bHRpdGVuYW50VHlwZSkgewotCQkJY2FzZSBTSU5HTEVfVEFCTEU6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5NdWx0aXRlbmFudFR5cGUuU0lOR0xFX1RBQkxFOwotCQkJY2FzZSBUQUJMRV9QRVJfVEVOQU5UOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuTXVsdGl0ZW5hbnRUeXBlLlRBQkxFX1BFUl9URU5BTlQ7Ci0JCQljYXNlIFZQRDoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLk11bHRpdGVuYW50VHlwZS5WUEQ7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gbXVsdGl0ZW5hbnQgdHlwZTogIiArIG11bHRpdGVuYW50VHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua011dGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtNdXRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MTFlNjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua011dGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtNdXRhYmxlCi0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCWJvb2xlYW4gaXNNdXRhYmxlKCk7Ci0JCi0JQm9vbGVhbiBnZXRTcGVjaWZpZWRNdXRhYmxlKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4gbXV0YWJsZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfTVVUQUJMRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRNdXRhYmxlIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlib29sZWFuIGlzRGVmYXVsdE11dGFibGUoKTsKLQkJU3RyaW5nIERFRkFVTFRfTVVUQUJMRV9QUk9QRVJUWSA9ICJkZWZhdWx0TXV0YWJsZSI7ICAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMGYxMGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotCi0vKioKLSAqIEVjbGlwc2VMaW5rIG5vbi1lbWJlZGRhYmxlIHR5cGUgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZwotCWV4dGVuZHMgRWNsaXBzZUxpbmtUeXBlTWFwcGluZwotewotCUVjbGlwc2VMaW5rQ2FjaGluZyBnZXRDYWNoaW5nKCk7Ci0KLQlFY2xpcHNlTGlua1JlYWRPbmx5IGdldFJlYWRPbmx5KCk7Ci0KLQlFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBnZXRNdWx0aXRlbmFuY3koKTsKLQotCS8qKgotCSAqIFVzZWQgZm9yIHZhbGlkYXRpbmcgd2hldGhlciB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zIG1heSBiZSBzcGVjaWZpZWQKLQkgKi8KLQlib29sZWFuIGlzTXVsdGl0ZW5hbnRNZXRhZGF0YUFsbG93ZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjJiOThhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIG9iamVjdCB0eXBlIGNvbnZlcnRlcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRlcgotewotCS8vICoqKioqKioqKiogZGF0YSB0eXBlICoqKioqKioqKioKLQotCVN0cmluZyBnZXREYXRhVHlwZSgpOwkKLQl2b2lkIHNldERhdGFUeXBlKFN0cmluZyBkYXRhVHlwZSk7Ci0JCVN0cmluZyBEQVRBX1RZUEVfUFJPUEVSVFkgPSAiZGF0YVR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWREYXRhVHlwZSgpOwkKLQkJU3RyaW5nIEZVTExZX1FVQUxJRklFRF9EQVRBX1RZUEVfUFJPUEVSVFkgPSAiZnVsbHlRdWFsaWZpZWREYXRhVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLy8gKioqKioqKioqKiBvYmplY3QgdHlwZSAqKioqKioqKioqCi0KLQlTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpOwkKLQl2b2lkIHNldE9iamVjdFR5cGUoU3RyaW5nIG9iamVjdFR5cGUpOwotCQlTdHJpbmcgT0JKRUNUX1RZUEVfUFJPUEVSVFkgPSAib2JqZWN0VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZE9iamVjdFR5cGUoKTsJCi0JCVN0cmluZyBGVUxMWV9RVUFMSUZJRURfT0JKRUNUX1RZUEVfUFJPUEVSVFkgPSAiZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnNpb24gdmFsdWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udmVydGVyJ3MgY29udmVyc2lvbiB2YWx1ZXMuCi0JICovCi0JTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gZ2V0Q29udmVyc2lvblZhbHVlcygpOwotCQlTdHJpbmcgQ09OVkVSU0lPTl9WQUxVRVNfTElTVCA9ICJjb252ZXJzaW9uVmFsdWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY29udmVyc2lvbiB2YWx1ZXMuCi0JICovCi0JaW50IGdldENvbnZlcnNpb25WYWx1ZXNTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnZlcnNpb24gdmFsdWUgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKi8KLQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBnZXRDb252ZXJzaW9uVmFsdWUoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEFkZCBhIGNvbnZlcnNpb24gdmFsdWUgdG8gdGhlIGNvbnZlcnRlciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0JICogYW5kIHJldHVybiBpdC4KLQkgKi8KLQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBhZGRDb252ZXJzaW9uVmFsdWUoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEFkZCBhIGNvbnZlcnNpb24gdmFsdWUgdG8gdGhlIGNvbnZlcnRlciBhbmQgcmV0dXJuIGl0LgotCSAqLwotCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGFkZENvbnZlcnNpb25WYWx1ZSgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBjb252ZXJzaW9uIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICovCi0Jdm9pZCByZW1vdmVDb252ZXJzaW9uVmFsdWUoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNvbnZlcnNpb24gdmFsdWUuCi0JICovCi0Jdm9pZCByZW1vdmVDb252ZXJzaW9uVmFsdWUoRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlKTsKLQotCS8qKgotCSAqIE1vdmUgdGhlIGNvbnZlcnNpb24gdmFsdWUgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgdGFyZ2V0IGluZGV4LgotCSAqLwotCXZvaWQgbW92ZUNvbnZlcnNpb25WYWx1ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0KLQotCS8vICoqKioqKioqKiogZGF0YSB2YWx1ZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb252ZXJ0ZXIncyBkYXRhIHZhbHVlcy4KLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldERhdGFWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGRhdGEgdmFsdWVzLgotCSAqLwotCWludCBnZXREYXRhVmFsdWVzU2l6ZSgpOwotCi0JCi0JLy8gKioqKioqKioqKiBkZWZhdWx0IG9iamVjdCB2YWx1ZSAqKioqKioqKioqCi0JCi0JU3RyaW5nIGdldERlZmF1bHRPYmplY3RWYWx1ZSgpOwotCXZvaWQgc2V0RGVmYXVsdE9iamVjdFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBERUZBVUxUX09CSkVDVF9WQUxVRV9QUk9QRVJUWSA9ICJkZWZhdWx0T2JqZWN0VmFsdWUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0MjcxMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgMTptIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyAKLQlleHRlbmRzIE9uZVRvTWFueU1hcHBpbmcsIEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZywgRWNsaXBzZUxpbmtDb252ZXJ0aWJsZU1hcHBpbmcKLXsKLQlFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKTsKLQkKLQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBnZXRQcml2YXRlT3duZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDE1Y2E3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nMl8wOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIDE6bSBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzAgCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcsIE9uZVRvTWFueU1hcHBpbmcyXzAKLXsKLQlFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCBnZXRSZWxhdGlvbnNoaXAoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0YjYxMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueVJlbGF0aW9uc2hpcDsKLQotLyoqCi0gKiBFY2xpcHNlTGluayAxOm0gcmVsYXRpb25zaGlwCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcAotCWV4dGVuZHMgT25lVG9NYW55UmVsYXRpb25zaGlwLAotCQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcAotewotCS8vIGFkZCBqb2luIGNvbHVtbiBzdXBwb3J0IHRvIEpQQSAxLjAgMTptCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMGM5ZTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcDJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb01hbnlSZWxhdGlvbnNoaXAyXzA7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgMi4wIDE6bSByZWxhdGlvbnNoaXAKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwMl8wCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcCwKLQkJCU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMAotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NjE5MmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZVJlbGF0aW9uc2hpcDsKLQotLyoqCi0gKiBFY2xpcHNlTGluayAxOjEgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcKLQlleHRlbmRzIE9uZVRvT25lTWFwcGluZywgRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JT25lVG9PbmVSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCk7Ci0KLQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBnZXRQcml2YXRlT3duZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyNjVhZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb09uZU1hcHBpbmcyXzA7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgMToxIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZywgT25lVG9PbmVNYXBwaW5nMl8wCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtQcml2YXRlT3duZWQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtQcml2YXRlT3duZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEzYjdmOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rUHJpdmF0ZU93bmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkCi0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCWJvb2xlYW4gaXNQcml2YXRlT3duZWQoKTsKLQl2b2lkIHNldFByaXZhdGVPd25lZChib29sZWFuIHByaXZhdGVPd25lZCk7Ci0JCVN0cmluZyBQUklWQVRFX09XTkVEX1BST1BFUlRZID0gInByaXZhdGVPd25lZCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtSZWFkT25seS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1JlYWRPbmx5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZDIxMjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1JlYWRPbmx5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgcmVhZC1vbmx5Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1JlYWRPbmx5Ci0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCWJvb2xlYW4gaXNSZWFkT25seSgpOwotCi0JYm9vbGVhbiBpc0RlZmF1bHRSZWFkT25seSgpOwotCQlTdHJpbmcgREVGQVVMVF9SRUFEX09OTFlfUFJPUEVSVFkgPSAiZGVmYXVsdFJlYWRPbmx5IjsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIERFRkFVTFRfUkVBRF9PTkxZID0gZmFsc2U7Ci0KLQlCb29sZWFuIGdldFNwZWNpZmllZFJlYWRPbmx5KCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuIG5ld1NwZWNpZmllZFJlYWRPbmx5KTsKLQkJU3RyaW5nIFNQRUNJRklFRF9SRUFEX09OTFlfUFJPUEVSVFkgPSAic3BlY2lmaWVkUmVhZE9ubHkiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rUmVhZE9ubHlBY2Nlc3NNZXRob2RzSG9sZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rUmVhZE9ubHlBY2Nlc3NNZXRob2RzSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMDAxMzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1JlYWRPbmx5QWNjZXNzTWV0aG9kc0hvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBDb21tb24gaW50ZXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQgYnkgY2xpZW50cyBpbnRlcmVzdGVkIG9ubHkgaW4gYSB0eXBlCi0gKiBvciBhdHRyaWJ1dGUncyBhY2Nlc3MgbWV0aG9kcyBzZXR0aW5nIChlLmcuIGEgVUkgY29tcG9zaXRlKS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rUmVhZE9ubHlBY2Nlc3NNZXRob2RzSG9sZGVyCi0JZXh0ZW5kcyBNb2RlbAotewotCS8qKgotCSAqIFJldHVybiB0aGUgZ2V0IG1ldGhvZCwgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdGVkLgotCSAqIFRoaXMgc2hvdWxkIG5ldmVyIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBzaW5jZSBhdCBsZWFzdCB0aGUgZGVmYXVsdAotCSAqIHdpbGwgYmUgc2V0LgotCSAqLwotCVN0cmluZyBnZXRHZXRNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2V0IG1ldGhvZCwgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdGVkLgotCSAqIFRoaXMgc2hvdWxkIG5ldmVyIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBzaW5jZSBhdCBsZWFzdCB0aGUgZGVmYXVsdAotCSAqIHdpbGwgYmUgc2V0LgotCSAqLwotCVN0cmluZyBnZXRTZXRNZXRob2QoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjM0OTExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLQotLyoqCi0gKiBFY2xpcHNlTGluayByZWxhdGlvbnNoaXAgKDE6MSwgMTptLCBtOjEsIG06bSkgbWFwcGluZy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyAKLQlleHRlbmRzIFJlbGF0aW9uc2hpcE1hcHBpbmcsIEVjbGlwc2VMaW5rSm9pbkZldGNoTWFwcGluZwotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YzEzNDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBzdHJ1Y3QgY29udmVydGVyCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyQ2xhc3NDb252ZXJ0ZXIKLXsKLQkJU3RyaW5nIEVDTElQU0VMSU5LX1NUUlVDVF9DT05WRVJURVJfQ0xBU1NfTkFNRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5kYXRhYmFzZS5jb252ZXJ0ZXJzLlN0cnVjdENvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzQwNzMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBzdHJ1Y3R1cmUgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zCi0JZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtUaW1lT2ZEYXkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtUaW1lT2ZEYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJiN2ExNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVGltZU9mRGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgY2FjaGluZyBleHBpcnkgdGltZSBvZiBkYXkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rVGltZU9mRGF5Ci0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCUludGVnZXIgZ2V0SG91cigpOwotCXZvaWQgc2V0SG91cihJbnRlZ2VyIGhvdXIpOwotCQlTdHJpbmcgSE9VUl9QUk9QRVJUWSA9ICJob3VyIjsgLy8kTk9OLU5MUy0xJAotCi0JSW50ZWdlciBnZXRNaW51dGUoKTsKLQl2b2lkIHNldE1pbnV0ZShJbnRlZ2VyIG1pbnV0ZSk7Ci0JCVN0cmluZyBNSU5VVEVfUFJPUEVSVFkgPSAibWludXRlIjsgLy8kTk9OLU5MUy0xJAotCQotCUludGVnZXIgZ2V0U2Vjb25kKCk7Ci0Jdm9pZCBzZXRTZWNvbmQoSW50ZWdlciBzZWNvbmQpOwotCQlTdHJpbmcgU0VDT05EX1BST1BFUlRZID0gInNlY29uZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlJbnRlZ2VyIGdldE1pbGxpc2Vjb25kKCk7Ci0Jdm9pZCBzZXRNaWxsaXNlY29uZChJbnRlZ2VyIG1pbGxpc2Vjb25kKTsKLQkJU3RyaW5nIE1JTExJU0VDT05EX1BST1BFUlRZID0gIm1pbGxpc2Vjb25kIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzJmZGViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIHRyYW5zZm9ybWF0aW9uIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nCi0JZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTczNWU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIHR5cGUgY29udmVydGVyCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIKLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyCi17Ci0JU3RyaW5nIGdldERhdGFUeXBlKCk7CQotCXZvaWQgc2V0RGF0YVR5cGUoU3RyaW5nIGRhdGFUeXBlKTsKLQkJU3RyaW5nIERBVEFfVFlQRV9QUk9QRVJUWSA9ICJkYXRhVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZERhdGFUeXBlKCk7CQotCQlTdHJpbmcgRlVMTFlfUVVBTElGSUVEX0RBVEFfVFlQRV9QUk9QRVJUWSA9ICJmdWxseVF1YWxpZmllZERhdGFUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JCQotCVN0cmluZyBnZXRPYmplY3RUeXBlKCk7CQotCXZvaWQgc2V0T2JqZWN0VHlwZShTdHJpbmcgb2JqZWN0VHlwZSk7Ci0JCVN0cmluZyBPQkpFQ1RfVFlQRV9QUk9QRVJUWSA9ICJvYmplY3RUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSgpOwkKLQkJU3RyaW5nIEZVTExZX1FVQUxJRklFRF9PQkpFQ1RfVFlQRV9QUk9QRVJUWSA9ICJmdWxseVF1YWxpZmllZE9iamVjdFR5cGUiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtUeXBlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1R5cGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZjY1M2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1R5cGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1R5cGVNYXBwaW5nCi0JZXh0ZW5kcyBUeXBlTWFwcGluZywgRWNsaXBzZUxpbmtDb252ZXJ0aWJsZU1hcHBpbmcKLXsKLQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgZ2V0Q3VzdG9taXplcigpOwotCQotCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgdHlwZSBtYXBwaW5nIHNwZWNpZmllcyBwcmltYXJ5IGtleSBjb2x1bW5zIHJhdGhlciB0aGFuIHVzaW5nCi0JICogSlBBLXN0eWxlIGF0dHJpYnV0ZXMKLQkgKiAoVXNlcyB0aGUgQFByaW1hcnlLZXkgYW5ub3RhdGlvbiBmb3IgamF2YSwgb3IgdGhlIHByaW1hcnkta2V5IGVsZW1lbnQgZm9yIHhtbCkKLQkgKiAKLQkgKiBOb3RlOiB0aGVyZSBpcyBubyBjb250ZXh0LWxldmVsIG9yIFVJIHN1cHBvcnQgZm9yIHRoaXMgZmVhdHVyZSBhcyBvZiB5ZXQuCi0JICogTm90ZTogdGhpcyBpcyBhIDEuMSBmZWF0dXJlLCBidXQgdGhpcyBjaGVjayBoYXMgYmVlbiBpbXBsZW1lbnRlZCBmb3IgYWxsIHZlcnNpb25zCi0JICovCi0JYm9vbGVhbiB1c2VzUHJpbWFyeUtleUNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSB0eXBlIG1hcHBpbmcgaXMgbXVsdGl0ZW5hbnQgYW5kIGFueSBvZiB0aGUgdGVuYW50IGRpc2NyaW1pbmF0b3IKLQkgKiBjb2x1bW5zIChzcGVjaWZpZWQgb3IgZGVmYXVsdCkgaGF2ZSB0aGUgcHJpbWFyeUtleSBvcHRpb24gc2V0IHRvIHRydWUKLQkgKi8KLQlib29sZWFuIHVzZXNQcmltYXJ5S2V5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKTsKLQotCUl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJzKCk7Ci0KLQlUcmFuc2Zvcm1lcjxBdHRyaWJ1dGVNYXBwaW5nLCBJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4+IEFUVFJJQlVURV9NQVBQSU5HX0NPTlZFUlRFUl9UUkFOU0ZPUk1FUiA9Ci0JCW5ldyBUcmFuc2Zvcm1lcjxBdHRyaWJ1dGVNYXBwaW5nLCBJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4+KCkgewotCQkJcHVibGljIEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPiB0cmFuc2Zvcm0oQXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nKSB7Ci0JCQkJaWYgKGF0dHJpYnV0ZU1hcHBpbmcgaW5zdGFuY2VvZiBFY2xpcHNlTGlua0NvbnZlcnRpYmxlTWFwcGluZykgewotCQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0NvbnZlcnRpYmxlTWFwcGluZykgYXR0cmlidXRlTWFwcGluZykuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0Q29udmVydGVycygpOwotCQkJCX0KLQkJCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQkJfQotCQl9OwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzExYTIxMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIHZhcmlhYmxlIDE6MSBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nCi0JZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMTAwYjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgdmVyc2lvbiBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nCi0JZXh0ZW5kcyBWZXJzaW9uTWFwcGluZywgRWNsaXBzZUxpbmtDb252ZXJ0aWJsZU1hcHBpbmcKLXsKLQlFY2xpcHNlTGlua011dGFibGUgZ2V0TXV0YWJsZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9SZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MzI2YjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9SZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVRhYmxlQ29sdW1uOwotCi0vKioKLSAqIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zCi0JZXh0ZW5kcyBSZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbiwgUmVhZE9ubHlUYWJsZUNvbHVtbgotewotCVN0cmluZyBERUZBVUxUX05BTUUgPSAiVEVOQU5UX0lEIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvLyAqKioqKioqKioqIGNvbnRleHQgcHJvcGVydHkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgY29udGV4dCBwcm9wZXJ0eSBpZiBwcmVzZW50LCBvdGhlcndpc2UgcmV0dXJuCi0JICogdGhlIGRlZmF1bHQgY29udGV4dCBwcm9wZXJ0eS4KLQkgKi8KLQlTdHJpbmcgZ2V0Q29udGV4dFByb3BlcnR5KCk7Ci0JU3RyaW5nIGdldFNwZWNpZmllZENvbnRleHRQcm9wZXJ0eSgpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0NPTlRFWFRfUFJPUEVSVFlfUFJPUEVSVFkgPSAic3BlY2lmaWVkQ29udGV4dFByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBnZXREZWZhdWx0Q29udGV4dFByb3BlcnR5KCk7Ci0JCVN0cmluZyBERUZBVUxUX0NPTlRFWFRfUFJPUEVSVFlfUFJPUEVSVFkgPSAiZGVmYXVsdENvbnRleHRQcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIERFRkFVTFRfQ09OVEVYVF9QUk9QRVJUWSA9ICJlY2xpcHNlbGluay50ZW5hbnQtaWQiOyAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogcHJpbWFyeUtleSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBwcmltYXJ5S2V5IHNldHRpbmcgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHJldHVybiB0aGUKLQkgKiBkZWZhdWx0IHByaW1hcnlLZXkgc2V0dGluZy4KLQkgKi8KLQlib29sZWFuIGlzUHJpbWFyeUtleSgpOwotCUJvb2xlYW4gZ2V0U3BlY2lmaWVkUHJpbWFyeUtleSgpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1BSSU1BUllfS0VZX1BST1BFUlRZID0gInNwZWNpZmllZFByaW1hcnlLZXkiOyAvLyROT04tTkxTLTEkCi0JYm9vbGVhbiBpc0RlZmF1bHRQcmltYXJ5S2V5KCk7Ci0JCVN0cmluZyBERUZBVUxUX1BSSU1BUllfS0VZX1BST1BFUlRZID0gImRlZmF1bHRQcmltYXJ5S2V5IjsgLy8kTk9OLU5MUy0xJAotCWJvb2xlYW4gREVGQVVMVF9QUklNQVJZX0tFWSA9IGZhbHNlOwotCi0KLQkvLyAqKioqKioqKioqIG93bmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIGludGVyZmFjZSBhbGxvd2luZyB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zIHRvIGJlIHVzZWQgaW4gbXVsdGlwbGUgcGxhY2VzCi0JICovCi0JaW50ZXJmYWNlIE93bmVyCi0JCWV4dGVuZHMgUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4uT3duZXIsIFJlYWRPbmx5VGFibGVDb2x1bW4uT3duZXIKLQl7Ci0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgY29udGV4dCBwcm9wZXJ0eSBuYW1lCi0JCSAqLwotCQlTdHJpbmcgZ2V0RGVmYXVsdENvbnRleHRQcm9wZXJ0eU5hbWUoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBkZWZhdWx0IHByaW1hcnkga2V5IHNldHRpbmcKLQkJICovCi0JCWJvb2xlYW4gZ2V0RGVmYXVsdFByaW1hcnlLZXkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWIwMTJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk5hbWVkRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UYWJsZUNvbHVtbjsKLQotLyoqCi0gKiB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMKLQlleHRlbmRzIE5hbWVkRGlzY3JpbWluYXRvckNvbHVtbiwgUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLCBUYWJsZUNvbHVtbgotewotCi0Jdm9pZCBzZXRTcGVjaWZpZWRDb250ZXh0UHJvcGVydHkoU3RyaW5nIGNvbnRleHRQcm9wZXJ0eSk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRQcmltYXJ5S2V5KEJvb2xlYW4gcHJpbWFyeUtleSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdlZWI5Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L1ZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbE5hbWVkRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsVGFibGVDb2x1bW47Ci0KLS8qKgotICogVmlydHVhbCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMKLQlleHRlbmRzIFZpcnR1YWxOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4sIFZpcnR1YWxUYWJsZUNvbHVtbiwgUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zCi17Ci0JUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGdldE92ZXJyaWRkZW5Db2x1bW4oKTsKLQotCS8vICoqKioqKioqKiogb3duZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogSW50ZXJmYWNlIGFsbG93aW5nIHRoZSB2aXJ0dWFsIGNvbHVtbiB0byBiZSBnZXQgdGhlIGNvbHVtbiBpdCBvdmVycmlkZXMuCi0JICovCi0JaW50ZXJmYWNlIE93bmVyCi0JCWV4dGVuZHMgUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLk93bmVyCi0JewotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjb2x1bW4gb3ZlcnJpZGRlbiBieSB0aGUgdmlydHVhbCBjb2x1bW4uCi0JCSAqLwotCQlSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgcmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQ29udmVydGlibGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQ29udmVydGlibGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZTA0ZTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNvbnZlcnRpYmxlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0aWJsZU1hcHBpbmc7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgamF2YSBjb252ZXJ0aWJsZSBtYXBwaW5nLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtKYXZhQ29udmVydGlibGVNYXBwaW5nCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRpYmxlTWFwcGluZywgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyLlBhcmVudEFkYXB0ZXIKLXsKLQlKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDliOGExYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIEphdmEgMTptIHJlbGF0aW9uc2hpcAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAKLQlleHRlbmRzIEVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwLAotCQkJSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcCwKLQkJCUphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcyM2IzZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55UmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwMl8wOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIDIuMCBKYXZhIDE6bSByZWxhdGlvbnNoaXAKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwMl8wCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCwKLQkJCUVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcCwKLQkJCUphdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAKLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVR5cGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVHlwZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM5YjAyMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVHlwZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZU1hcHBpbmc7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgSmF2YSB0eXBlIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtKYXZhVHlwZU1hcHBpbmcKLQlleHRlbmRzIEphdmFUeXBlTWFwcGluZywgRWNsaXBzZUxpbmtUeXBlTWFwcGluZwotewotCUphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBnZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDYWNoaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ2FjaGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTE3ZDkxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDYWNoaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgSmF2YSBjYWNoaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmcsIEphdmFKcGFDb250ZXh0Tm9kZQotewotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBleGlzdGVuY2UtY2hlY2tpbmcgbW9kZWwgb2JqZWN0IGV4aXN0cy4gIAotCSAqIEhhdmUgdG8gaGF2ZSBhIHNlcGFyYXRlIGZsYWcgZm9yIHRoaXMgc2luY2UgdGhlIGRlZmF1bHQgZXhpc3RlbmNlCi0JICogdHlwZSBpcyBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHdoZXRoZXIgaGFzRXhpc3RlbmNlQ2hlY2tpbmcoKSByZXR1cm5zCi0JICogdHJ1ZSBvciBmYWxzZS4KLQkgKi8KLQlib29sZWFuIGlzRXhpc3RlbmNlQ2hlY2tpbmcoKTsKLQl2b2lkIHNldEV4aXN0ZW5jZUNoZWNraW5nKGJvb2xlYW4gZXhpc3RlbmNlQ2hlY2tpbmcpOwotCQlTdHJpbmcgRVhJU1RFTkNFX0NIRUNLSU5HX1BST1BFUlRZID0gImV4aXN0ZW5jZUNoZWNraW5nIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTc4YzYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBKYXZhIGNvbnZlcnRlciBjb250YWluZXIKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcgotCWV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIsIEphdmFKcGFDb250ZXh0Tm9kZQotewotCUxpc3RJdGVyYWJsZTxKYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IGdldEN1c3RvbUNvbnZlcnRlcnMoKTsKLQlKYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgYWRkQ3VzdG9tQ29udmVydGVyKGludCBpbmRleCk7Ci0KLQlMaXN0SXRlcmFibGU8SmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQlKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoaW50IGluZGV4KTsKLQotCUxpc3RJdGVyYWJsZTxKYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IGdldFN0cnVjdENvbnZlcnRlcnMoKTsKLQlKYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgYWRkU3RydWN0Q29udmVydGVyKGludCBpbmRleCk7Ci0KLQlMaXN0SXRlcmFibGU8SmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gZ2V0VHlwZUNvbnZlcnRlcnMoKTsKLQlKYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGFkZFR5cGVDb252ZXJ0ZXIoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFBhcmVudCBhZGFwdGVyCi0JICovCi0JaW50ZXJmYWNlIFBhcmVudEFkYXB0ZXIgewotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjb250YWluZXIncyBwYXJlbnQuCi0JCSAqLwotCQlKYXZhSnBhQ29udGV4dE5vZGUgZ2V0Q29udmVydGVyQ29udGFpbmVyUGFyZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgZWxlbWVudCB0aGF0IGlzIGFubm90YXRlZCB3aXRoIGNvbnZlcnRlcnMuCi0JCSAqLwotCQlKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IGdldEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbnRhaW5lcidzIHBhcmVudCBzdXBwb3J0cyBjb252ZXJ0ZXJzLgotCQkgKiAoVmlydHVhbCBhdHRyaWJ1dGVzIGRvIG5vdCBzdXBwb3J0IGNvbnZlcnRlcnMuKQotCQkgKi8KLQkJYm9vbGVhbiBwYXJlbnRTdXBwb3J0c0NvbnZlcnRlcnMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0VtYmVkZGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBjM2U0My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0VtYmVkZGFibGU7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsKLSAqIEphdmEgZW1iZWRkYWJsZSB0eXBlIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUKLQlleHRlbmRzIEphdmFFbWJlZGRhYmxlLCBFY2xpcHNlTGlua0VtYmVkZGFibGUsIEVjbGlwc2VMaW5rSmF2YVR5cGVNYXBwaW5nCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJhNzhjNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFbnRpdHk7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsKLSAqIEphdmEgZW50aXR5Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhRWNsaXBzZUxpbmtFbnRpdHkKLQlleHRlbmRzIEphdmFFbnRpdHksIEVjbGlwc2VMaW5rRW50aXR5LCBKYXZhRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcKLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NTQxYzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rCi0gKiBKYXZhIG1hcHBlZCBzdXBlcmNsYXNzCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzCi0JZXh0ZW5kcyBKYXZhTWFwcGVkU3VwZXJjbGFzcywgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzLCBKYXZhRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcKLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg5Nzc1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zCi0JZXh0ZW5kcyBFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMywgSmF2YUpwYUNvbnRleHROb2RlCi17Ci0KLQlMaXN0SXRlcmFibGU8SmF2YVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKTsKLQotCUxpc3RJdGVyYWJsZTxKYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKTsKLQlKYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBhZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JSmF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihpbnQgaW5kZXgpOwotCi0JTGlzdEl0ZXJhYmxlPEphdmFWaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZ2V0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDg5ZTM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIEphdmEgbm9uLWVtYmVkZGFibGUgdHlwZSBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZwotCWV4dGVuZHMgRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcsIEVjbGlwc2VMaW5rSmF2YVR5cGVNYXBwaW5nCi17Ci0JSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBnZXRDYWNoaW5nKCk7Ci0KLQlKYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgZ2V0TXVsdGl0ZW5hbmN5KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZiZjk3Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIEphdmEgcGVyc2lzdGVudCBhdHRyaWJ1dGUKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlCi17Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYXR0cmlidXRlJ3MgdHlwZSBpcyBhIHN1YmNsYXNzIG9mCi0JICogPGNvZGU+amF2YS51dGlsLkRhdGU8L2NvZGU+IG9yIDxjb2RlPmphdmEudXRpbC5DYWxlbmRhcjwvY29kZT4uCi0JICovCi0JYm9vbGVhbiB0eXBlSXNEYXRlT3JDYWxlbmRhcigpOwotCi0JU3RyaW5nIERBVEVfVFlQRV9OQU1FID0gamF2YS51dGlsLkRhdGUuY2xhc3MuZ2V0TmFtZSgpOwotCVN0cmluZyBDQUxFTkRBUl9UWVBFX05BTUUgPSBqYXZhLnV0aWwuQ2FsZW5kYXIuY2xhc3MuZ2V0TmFtZSgpOwotCi0JYm9vbGVhbiB0eXBlSXNTZXJpYWxpemFibGUoKTsKLQotCWJvb2xlYW4gdHlwZUlzVmFsaWRGb3JWYXJpYWJsZU9uZVRvT25lKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE2OWE1Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlUYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5SZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM7Ci0KLS8qKgotICogdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zCi0JZXh0ZW5kcyBKYXZhUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4sIFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMywgSmF2YVJlYWRPbmx5VGFibGVDb2x1bW4KLXsKLQotCS8vICoqKioqKioqKiogb3duZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogaW50ZXJmYWNlIGFsbG93aW5nIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMgdG8gYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMKLQkgKi8KLQlpbnRlcmZhY2UgT3duZXIKLQkJZXh0ZW5kcyBSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuT3duZXIsIEphdmFSZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5Pd25lcgotCXsKLQkJLy9jb21iaW5pbmcgaW50ZXJmYWNlcwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NTEwNGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzM7Ci0KLS8qKgotICogdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMwotCWV4dGVuZHMgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMywgSmF2YVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMwotewotCUVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMgZ2V0Q29sdW1uQW5ub3RhdGlvbigpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YVZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YVZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NDMwYTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFWaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlUYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5SZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM7Ci0KLS8qKgotICogSmF2YSB2aXJ0dWFsIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMKLQlleHRlbmRzIFZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLCBKYXZhUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLCBKYXZhUmVhZE9ubHlUYWJsZUNvbHVtbgotewotCS8qKgotCSAqIFRoZSBvdmVycmlkZGVuIGNvbHVtbiBjYW4gYmUgZWl0aGVyIGEgSmF2YSB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW4gb3IgYW4KLQkgKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW47IHNvIHdlIGRvbid0IGNoYW5nZSB0aGUgcmV0dXJuIHR5cGUKLQkgKiBoZXJlLgotCSAqLwotCVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBnZXRPdmVycmlkZGVuQ29sdW1uKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkzZDJiMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtBY2Nlc3NNZXRob2RzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LlJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLQotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIAotCWV4dGVuZHMgRW50aXR5TWFwcGluZ3MsIEVjbGlwc2VMaW5rQWNjZXNzTWV0aG9kc0hvbGRlcgotewotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIGNvbnZlcnRlcnMgZGVmaW5lZCBpbiBib3RoIHRoZSBlbnRpdHkgbWFwcGluZ3MgYW5kIGl0cwotCSAqIGVudGl0aWVzIChidXQgPGVtPm5vdDwvZW0+IGluIGFueSBhc3NvY2lhdGVkIEphdmEgYW5ub3RhdGlvbnMpLgotCSAqLwotCUl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPiBnZXRNYXBwaW5nRmlsZUNvbnZlcnRlcnMoKTsKLQotCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCi0KLQkvLyAqKioqKioqKioqIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zIHdoZXRoZXIgc3BlY2lmaWVkIG9yIGRlZmF1bHQuCi0JICovCi0JTGlzdEl0ZXJhYmxlPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMsIHdoZXRoZXIgc3BlY2lmaWVkIGFuZCBkZWZhdWx0LgotCSAqLwotCWludCBnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKTsKLQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhYmxlIG9mIHRoZSBzcGVjaWZpZWQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucy4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCi0JICovCi0JTGlzdEl0ZXJhYmxlPE9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OU19MSVNUID0gInNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3BlY2lmaWVkIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMuCi0JICovCi0JaW50IGdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBzcGVjaWZpZWQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucy4KLQkgKi8KLQlib29sZWFuIGhhc1NwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCk7Ci0KLQkvKioKLQkgKiBBZGQgYSBzcGVjaWZpZWQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uIGFuZCByZXR1cm4gdGhlIG9iamVjdAotCSAqIHJlcHJlc2VudGluZyBpdC4KLQkgKi8KLQlPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQotCS8qKgotCSAqIEFkZCBhIHNwZWNpZmllZCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW4gYW5kIHJldHVybiB0aGUgb2JqZWN0Ci0JICogcmVwcmVzZW50aW5nIGl0LgotCSAqLwotCU9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uLgotCSAqLwotCXZvaWQgcmVtb3ZlU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4pOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uIGF0IHRoZSBpbmRleC4KLQkgKi8KLQl2b2lkIHJlbW92ZVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oaW50IGluZGV4KTsKLQotCS8qKgotCSAqIE1vdmUgdGhlIHNwZWNpZmllZCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW4gZnJvbSB0aGUgc291cmNlIGluZGV4IHRvIHRoZSB0YXJnZXQgaW5kZXguCi0JICovCi0Jdm9pZCBtb3ZlU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmFibGUgb2YgdGhlIGRlZmF1bHQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucy4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuIElmIHRoZXJlIGFyZSBzcGVjaWZpZWQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucwotCSAqIHRoZW4gdGhlcmUgd2lsbCBiZSBubyBkZWZhdWx0IHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMuCi0JICovCi0JTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGdldERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpOwotCQlTdHJpbmcgREVGQVVMVF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TX0xJU1QgPSAiZGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZGVmYXVsdCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zLgotCSAqLwotCWludCBnZXREZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUNvbnZlcnRpYmxlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1Db252ZXJ0aWJsZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1MmFjYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUNvbnZlcnRpYmxlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRpYmxlTWFwcGluZzsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBvcm0gY29udmVydGlibGUgbWFwcGluZy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rT3JtQ29udmVydGlibGVNYXBwaW5nCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRpYmxlTWFwcGluZwotewotCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU9uZVRvTWFueVJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU2ZmVlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU9uZVRvTWFueVJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXA7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgPGNvZGU+b3JtLnhtbDwvY29kZT4gMTptIHJlbGF0aW9uc2hpcAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua09ybU9uZVRvTWFueVJlbGF0aW9uc2hpcAotCWV4dGVuZHMgRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXAsCi0JCQlPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAsCi0JCQlPcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT25lVG9NYW55UmVsYXRpb25zaGlwMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWJhOTJjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT25lVG9NYW55UmVsYXRpb25zaGlwMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT25lVG9NYW55UmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwMl8wOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIDIuMCA8Y29kZT5vcm0ueG1sPC9jb2RlPiAxOm0gcmVsYXRpb25zaGlwCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rT3JtT25lVG9NYW55UmVsYXRpb25zaGlwMl8wCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCwKLQkJCUVjbGlwc2VMaW5rT3JtT25lVG9NYW55UmVsYXRpb25zaGlwLAotCQkJT3JtT25lVG9NYW55UmVsYXRpb25zaGlwMl8wCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAxOWU1Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtBY2Nlc3NNZXRob2RzSG9sZGVyOwotCi0vKioKLSAqIDxjb2RlPmVjbGlwc2VsaW5rLW9ybS54bWw8L2NvZGU+IHBlcnNpc3RlbnQgdHlwZTo8dWw+Ci0gKiA8bGk+bWFwcGluZwotICogPGxpPmFjY2VzcwotICogPGxpPmFjY2Vzcy1tZXRob2RzCi0gKiA8bGk+YXR0cmlidXRlcwotICogPGxpPnN1cGVyIHBlcnNpc3RlbnQgdHlwZQotICogPGxpPkphdmEgcGVyc2lzdGVudCB0eXBlCi0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUKLQlleHRlbmRzIE9ybVBlcnNpc3RlbnRUeXBlMl8wLCBFY2xpcHNlTGlua0FjY2Vzc01ldGhvZHNIb2xkZXIKLXsKLQotCS8vKioqKioqKioqKioqKioqIGR5bmFtaWMgKioqKioqKioqKioqKioqKioKLQotCWJvb2xlYW4gaXNEeW5hbWljKCk7Ci0JCVN0cmluZyBEWU5BTUlDX1BST1BFUlRZID0gImR5bmFtaWMiOyAvLyROT04tTkxTLTEkCi0KLQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGFkZFZpcnR1YWxBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBtYXBwaW5nS2V5LCBTdHJpbmcgYXR0cmlidXRlVHlwZSk7Ci0KLQkvLyoqKioqKioqKioqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqKioqKioqKioqKioqCi0KLQlFY2xpcHNlTGlua09ybVR5cGVNYXBwaW5nIGdldE1hcHBpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtVHlwZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtVHlwZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc3ZDRjMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVR5cGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhVHlwZU1hcHBpbmc7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgT1JNIHR5cGUgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua09ybVR5cGVNYXBwaW5nCi0JZXh0ZW5kcyBPcm1UeXBlTWFwcGluZywgRWNsaXBzZUxpbmtUeXBlTWFwcGluZwotewotCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCi0JRWNsaXBzZUxpbmtKYXZhVHlwZU1hcHBpbmcgZ2V0SmF2YVR5cGVNYXBwaW5nKCk7Ci0KLQlFY2xpcHNlTGlua0phdmFUeXBlTWFwcGluZyBnZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMWM0MDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0FjY2Vzc01ldGhvZHNIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZQotICogPGJyPgotICogPGNvZGU+cGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0czwvY29kZT4gZWxlbWVudAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMKLQlleHRlbmRzIE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzMl8wLCBFY2xpcHNlTGlua0FjY2Vzc01ldGhvZHNIb2xkZXIKLXsKLQotCS8vICoqKioqKioqKiogdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhYmxlIG9mIHRoZSB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQlMaXN0SXRlcmFibGU8T3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKTsKLQkJU3RyaW5nIFRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlNfTElTVCA9ICJ0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMuCi0JICovCi0JaW50IGdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zLgotCSAqLwotCWJvb2xlYW4gaGFzVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKTsKLQotCS8qKgotCSAqIEFkZCBhIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbiBhbmQgcmV0dXJuIHRoZSBvYmplY3QKLQkgKiByZXByZXNlbnRpbmcgaXQuCi0JICovCi0JT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBhZGRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0KLQkvKioKLQkgKiBBZGQgYSB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW4gYW5kIHJldHVybiB0aGUgb2JqZWN0Ci0JICogcmVwcmVzZW50aW5nIGl0LgotCSAqLwotCU9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgYWRkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW4uCi0JICovCi0Jdm9pZCByZW1vdmVUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKE9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbiBhdCB0aGUgaW5kZXguCi0JICovCi0Jdm9pZCByZW1vdmVUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW4gZnJvbSB0aGUgc291cmNlIGluZGV4IHRvIHRoZSB0YXJnZXQgaW5kZXguCi0JICovCi0Jdm9pZCBtb3ZlVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NhY2hpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ2FjaGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGFjYjdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ2FjaGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgPGNvZGU+b3JtLnhtbDwvY29kZT4gY2FjaGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtRWNsaXBzZUxpbmtDYWNoaW5nCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmcsIFhtbENvbnRleHROb2RlCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTk2NjZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLQotLyoqCi0gKiBFY2xpcHNlTGluayA8Y29kZT5vcm0ueG1sPC9jb2RlPiBjb252ZXJ0ZXIgY29udGFpbmVyCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcgotCWV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIsIFhtbENvbnRleHROb2RlCi17Ci0KLQlMaXN0SXRlcmFibGU8T3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IGdldEN1c3RvbUNvbnZlcnRlcnMoKTsKLQlPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBhZGRDdXN0b21Db252ZXJ0ZXIoaW50IGluZGV4KTsKLQlPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBhZGRDdXN0b21Db252ZXJ0ZXIoKTsKLQotCUxpc3RJdGVyYWJsZTxPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoaW50IGluZGV4KTsKLQlPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQotCUxpc3RJdGVyYWJsZTxPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gZ2V0U3RydWN0Q29udmVydGVycygpOwotCU9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGFkZFN0cnVjdENvbnZlcnRlcihpbnQgaW5kZXgpOwotCU9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGFkZFN0cnVjdENvbnZlcnRlcigpOwotCi0JTGlzdEl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gZ2V0VHlwZUNvbnZlcnRlcnMoKTsKLQlPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgYWRkVHlwZUNvbnZlcnRlcihpbnQgaW5kZXgpOwotCU9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBhZGRUeXBlQ29udmVydGVyKCk7Ci0KLQotCS8vICoqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKgotCi0JSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKTsKLQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSk7Ci0JSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpOwotCi0KLQlpbnRlcmZhY2UgT3duZXIgewotCQlpbnQgZ2V0TnVtYmVyU3VwcG9ydGVkQ29udmVydGVycygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MDFhZTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIDxjb2RlPm9ybS54bWw8L2NvZGU+IGVtYmVkZGFibGUKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZQotCWV4dGVuZHMgT3JtRW1iZWRkYWJsZSwgRWNsaXBzZUxpbmtFbWJlZGRhYmxlLCBFY2xpcHNlTGlua09ybVR5cGVNYXBwaW5nCi17Ci0JWG1sRW1iZWRkYWJsZSBnZXRYbWxUeXBlTWFwcGluZygpOwotCi0JSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBnZXRKYXZhVHlwZU1hcHBpbmcoKTsKLQotCUphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUgZ2V0SmF2YVR5cGVNYXBwaW5nRm9yRGVmYXVsdHMoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0VudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmIzYjk0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgPGNvZGU+b3JtLnhtbDwvY29kZT4gZW50aXR5Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1FY2xpcHNlTGlua0VudGl0eQotCWV4dGVuZHMgT3JtRW50aXR5LCBFY2xpcHNlTGlua0VudGl0eSwgT3JtRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcKLXsKLQlYbWxFbnRpdHkgZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQotCUphdmFFY2xpcHNlTGlua0VudGl0eSBnZXRKYXZhVHlwZU1hcHBpbmcoKTsKLQotCUphdmFFY2xpcHNlTGlua0VudGl0eSBnZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhMGM3ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBtYXBwZWQgc3VwZXJjbGFzcwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzCi0JZXh0ZW5kcyBPcm1NYXBwZWRTdXBlcmNsYXNzLCBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MsIE9ybUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nCi17Ci0JWG1sTWFwcGVkU3VwZXJjbGFzcyBnZXRYbWxUeXBlTWFwcGluZygpOwotCi0JSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBnZXRKYXZhVHlwZU1hcHBpbmcoKTsKLQotCUphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgZ2V0SmF2YVR5cGVNYXBwaW5nRm9yRGVmYXVsdHMoKTsKLQotCU9ybVF1ZXJ5Q29udGFpbmVyIGdldFF1ZXJ5Q29udGFpbmVyKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFkOWY0NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zOwotCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zCi0JZXh0ZW5kcyBFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMywgWG1sQ29udGV4dE5vZGUKLXsKLQlMaXN0SXRlcmFibGU8T3JtUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpOwotCi0JTGlzdEl0ZXJhYmxlPE9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCk7Ci0JT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBhZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBhZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKGludCBpbmRleCk7Ci0JCi0JTGlzdEl0ZXJhYmxlPE9ybVZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBnZXREZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGNlYzljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIDxjb2RlPm9ybS54bWw8L2NvZGU+IG5vbi1lbWJlZGRhYmxlIHR5cGUgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1FY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZwotCWV4dGVuZHMgRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcsIEVjbGlwc2VMaW5rT3JtVHlwZU1hcHBpbmcKLXsKLQlPcm1FY2xpcHNlTGlua0NhY2hpbmcgZ2V0Q2FjaGluZygpOwotCi0JSmF2YUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nIGdldEphdmFUeXBlTWFwcGluZygpOwotCi0JSmF2YUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nIGdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci0KLQlPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBnZXRNdWx0aXRlbmFuY3koKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vT3JtUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4Nzk0MzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vT3JtUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlUYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5SZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM7Ci0KLS8qKgotICogdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1SZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMKLQlleHRlbmRzIE9ybVJlYWRPbmx5TmFtZWREaXNjcmltaW5hdG9yQ29sdW1uLCBSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMsIE9ybVJlYWRPbmx5VGFibGVDb2x1bW4KLXsKLQotCS8vICoqKioqKioqKiogb3duZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogaW50ZXJmYWNlIGFsbG93aW5nIGRpc2NyaW1pbmF0b3IgY29sdW1ucyB0byBiZSB1c2VkIGluIG11bHRpcGxlIHBsYWNlcwotCSAqLwotCWludGVyZmFjZSBPd25lcgotCQlleHRlbmRzIFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5Pd25lciwgT3JtUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4uT3duZXIKLQl7Ci0JCS8vY29tYmluaW5nIGludGVyZmFjZXMKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZTEyMDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMzsKLQotLyoqCi0gKiBvcm0gdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zCi0JZXh0ZW5kcyBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLCBPcm1SZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMKLXsKLQlYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMyBnZXRYbWxDb2x1bW4oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybVZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1WaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzlkZGZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybVZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LlJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5WaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB2aXJ0dWFsIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1WaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMwotCWV4dGVuZHMgVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMsIE9ybVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMywgT3JtUmVhZE9ubHlUYWJsZUNvbHVtbgotewotCS8qKgotCSAqIFRoZSBvdmVycmlkZGVuIGNvbHVtbiBjYW4gYmUgZWl0aGVyIGEgSmF2YSB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW4gb3IgYW4KLQkgKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW47IHNvIHdlIGRvbid0IGNoYW5nZSB0aGUgcmV0dXJuIHR5cGUKLQkgKiBoZXJlLgotCSAqLwotCVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBnZXRPdmVycmlkZGVuQ29sdW1uKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvQmF0Y2hXcml0aW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0JhdGNoV3JpdGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmUzNzJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvQmF0Y2hXcml0aW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sRW51bVZhbHVlOwotCi0vKioKLSAqICBCYXRjaFdyaXRpbmcKLSAqLwotcHVibGljIGVudW0gQmF0Y2hXcml0aW5nIGltcGxlbWVudHMgUGVyc2lzdGVuY2VYbWxFbnVtVmFsdWUgewotCW5vbmUoIk5vbmUiKSwgIC8vJE5PTi1OTFMtMSQKLQlqZGJjKCJKREJDIiksICAvLyROT04tTkxTLTEkCi0JYnVmZmVyZWQoIkJ1ZmZlcmVkIiksICAvLyROT04tTkxTLTEkCi0Jb3JhY2xlX2pkYmMoIk9yYWNsZS1KREJDIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHByb3BlcnR5VmFsdWU7Ci0KLQlCYXRjaFdyaXRpbmcoU3RyaW5nIHByb3BlcnR5VmFsdWUpIHsKLQkJdGhpcy5wcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3RyaW5nIHVzZWQgYXMgdGhlIHByb3BlcnR5IHZhbHVlIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnByb3BlcnR5VmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9DYWNoZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2FjaGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMjU4ZDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9DYWNoZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sRW51bVZhbHVlOwotCi0vKioKLSAqICBDYWNoZVR5cGUKLSAqLwotcHVibGljIGVudW0gQ2FjaGVUeXBlIGltcGxlbWVudHMgUGVyc2lzdGVuY2VYbWxFbnVtVmFsdWUgewotCXNvZnRfd2VhaygiU29mdFdlYWsiKSwgIC8vJE5PTi1OTFMtMSQKLQloYXJkX3dlYWsoIkhhcmRXZWFrIiksICAvLyROT04tTkxTLTEkCi0Jd2VhaygiV2VhayIpLCAvLyROT04tTkxTLTEkCi0Jc29mdCgiU29mdCIpLCAvLyROT04tTkxTLTEkCi0JZnVsbCgiRnVsbCIpLCAvLyROT04tTkxTLTEkCi0Jbm9uZSgiTk9ORSIpOyAgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvcGVydHlWYWx1ZTsKLQotCUNhY2hlVHlwZShTdHJpbmcgcHJvcGVydHlWYWx1ZSkgewotCQl0aGlzLnByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzdHJpbmcgdXNlZCBhcyB0aGUgcHJvcGVydHkgdmFsdWUgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJvcGVydHlWYWx1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0NhY2hpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2FjaGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjg1ZmNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2FjaGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci0KLS8qKgotICogIENhY2hpbmcKLSAqLwotcHVibGljIGludGVyZmFjZSBDYWNoaW5nIGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotewotCUNhY2hlVHlwZSBnZXREZWZhdWx0Q2FjaGVUeXBlRGVmYXVsdCgpOwotCUNhY2hlVHlwZSBnZXRDYWNoZVR5cGVEZWZhdWx0KCk7Ci0Jdm9pZCBzZXRDYWNoZVR5cGVEZWZhdWx0KENhY2hlVHlwZSBjYWNoZVR5cGVEZWZhdWx0KTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFkgPSAiY2FjaGVUeXBlRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0NBQ0hFX1RZUEVfREVGQVVMVCA9ICJlY2xpcHNlbGluay5jYWNoZS50eXBlLmRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBDYWNoZVR5cGUgREVGQVVMVF9DQUNIRV9UWVBFX0RFRkFVTFQgPSBDYWNoZVR5cGUuc29mdF93ZWFrOwotCi0JSW50ZWdlciBnZXREZWZhdWx0Q2FjaGVTaXplRGVmYXVsdCgpOwotCUludGVnZXIgZ2V0Q2FjaGVTaXplRGVmYXVsdCgpOwotCXZvaWQgc2V0Q2FjaGVTaXplRGVmYXVsdChJbnRlZ2VyIGNhY2hlU2l6ZURlZmF1bHQpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NJWkVfREVGQVVMVF9QUk9QRVJUWSA9ICJjYWNoZVNpemVEZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQ0FDSEVfU0laRV9ERUZBVUxUID0gImVjbGlwc2VsaW5rLmNhY2hlLnNpemUuZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEludGVnZXIgREVGQVVMVF9DQUNIRV9TSVpFX0RFRkFVTFQgPSBJbnRlZ2VyLnZhbHVlT2YoMTAwKTsKLQotCUJvb2xlYW4gZ2V0RGVmYXVsdFNoYXJlZENhY2hlRGVmYXVsdCgpOwotCUJvb2xlYW4gZ2V0U2hhcmVkQ2FjaGVEZWZhdWx0KCk7Ci0Jdm9pZCBzZXRTaGFyZWRDYWNoZURlZmF1bHQoQm9vbGVhbiBzaGFyZWRDYWNoZURlZmF1bHQpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZID0gInNoYXJlZENhY2hlRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0NBQ0hFX1NIQVJFRF9ERUZBVUxUID0gImVjbGlwc2VsaW5rLmNhY2hlLnNoYXJlZC5kZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1NIQVJFRF9DQUNIRV9ERUZBVUxUID0gQm9vbGVhbi5UUlVFOwotCi0KLQlDYWNoZVR5cGUgZ2V0RGVmYXVsdENhY2hlVHlwZSgpOwotCUNhY2hlVHlwZSBnZXRDYWNoZVR5cGVPZihTdHJpbmcgZW50aXR5TmFtZSk7Ci0Jdm9pZCBzZXRDYWNoZVR5cGVPZihTdHJpbmcgZW50aXR5TmFtZSwgQ2FjaGVUeXBlIGNhY2hlVHlwZSk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfVFlQRV9QUk9QRVJUWSA9ICJjYWNoZVR5cGUiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19DQUNIRV9UWVBFID0gImVjbGlwc2VsaW5rLmNhY2hlLnR5cGUuIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQ2FjaGVUeXBlIERFRkFVTFRfQ0FDSEVfVFlQRSA9IENhY2hlVHlwZS5zb2Z0X3dlYWs7Ci0KLQlJbnRlZ2VyIGdldERlZmF1bHRDYWNoZVNpemUoKTsKLQlJbnRlZ2VyIGdldENhY2hlU2l6ZU9mKFN0cmluZyBlbnRpdHlOYW1lKTsKLQl2b2lkIHNldENhY2hlU2l6ZU9mKFN0cmluZyBlbnRpdHlOYW1lLCBJbnRlZ2VyIGNhY2hlU2l6ZSk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfU0laRV9QUk9QRVJUWSA9ICJjYWNoZVNpemUiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19DQUNIRV9TSVpFID0gImVjbGlwc2VsaW5rLmNhY2hlLnNpemUuIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgSW50ZWdlciBERUZBVUxUX0NBQ0hFX1NJWkUgPSBJbnRlZ2VyLnZhbHVlT2YoMTAwKTsKLQotCUJvb2xlYW4gZ2V0RGVmYXVsdFNoYXJlZENhY2hlKCk7Ci0JQm9vbGVhbiBnZXRTaGFyZWRDYWNoZU9mKFN0cmluZyBlbnRpdHlOYW1lKTsKLQl2b2lkIHNldFNoYXJlZENhY2hlT2YoU3RyaW5nIGVudGl0eU5hbWUsIEJvb2xlYW4gc2hhcmVkQ2FjaGUpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNIQVJFRF9DQUNIRV9QUk9QRVJUWSA9ICJzaGFyZWRDYWNoZSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1NIQVJFRF9DQUNIRSA9ICJlY2xpcHNlbGluay5jYWNoZS5zaGFyZWQuIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1NIQVJFRF9DQUNIRSA9IEJvb2xlYW4uVFJVRTsKLQotCUZsdXNoQ2xlYXJDYWNoZSBnZXREZWZhdWx0Rmx1c2hDbGVhckNhY2hlKCk7Ci0JRmx1c2hDbGVhckNhY2hlIGdldEZsdXNoQ2xlYXJDYWNoZSgpOwotCXZvaWQgc2V0Rmx1c2hDbGVhckNhY2hlKEZsdXNoQ2xlYXJDYWNoZSBuZXdGbHVzaENsZWFyQ2FjaGUpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEZMVVNIX0NMRUFSX0NBQ0hFX1BST1BFUlRZID0gImZsdXNoQ2xlYXJDYWNoZSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0ZMVVNIX0NMRUFSX0NBQ0hFID0gImVjbGlwc2VsaW5rLmZsdXNoLWNsZWFyLmNhY2hlIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgRmx1c2hDbGVhckNhY2hlIERFRkFVTFRfRkxVU0hfQ0xFQVJfQ0FDSEUgPSBGbHVzaENsZWFyQ2FjaGUuZHJvcF9pbnZhbGlkYXRlOwotCi0Jdm9pZCByZW1vdmVEZWZhdWx0Q2FjaGluZ1Byb3BlcnRpZXMoKTsKLQotCUxpc3RJdGVyYWJsZTxDYWNoaW5nRW50aXR5PiBnZXRFbnRpdGllcygpOwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0RW50aXR5TmFtZXMoKTsKLQlpbnQgZ2V0RW50aXRpZXNTaXplKCk7Ci0JYm9vbGVhbiBlbnRpdHlFeGlzdHMoU3RyaW5nIGVudGl0eSk7Ci0JQ2FjaGluZ0VudGl0eSBhZGRFbnRpdHkoU3RyaW5nIGVudGl0eSk7Ci0Jdm9pZCByZW1vdmVFbnRpdHkoU3RyaW5nIGVudGl0eSk7Ci0JCVN0cmluZyBFTlRJVElFU19MSVNUID0gImVudGl0aWVzIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0NhY2hpbmdFbnRpdHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2FjaGluZ0VudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjgwZGNkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2FjaGluZ0VudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLQotLyoqCi0gKiAgRW50aXR5Ci0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoaW5nRW50aXR5IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIENhY2hpbmcgcGFyZW50OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfVFlQRV9QUk9QRVJUWSA9IENhY2hpbmcuQ0FDSEVfVFlQRV9QUk9QRVJUWTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TSVpFX1BST1BFUlRZID0gQ2FjaGluZy5DQUNIRV9TSVpFX1BST1BFUlRZOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIQVJFRF9DQUNIRV9QUk9QRVJUWSA9IENhY2hpbmcuU0hBUkVEX0NBQ0hFX1BST1BFUlRZOwotCi0JLy8gKioqKioqKioqKiBFY2xpcHNlTGluayBwcm9wZXJ0aWVzICoqKioqKioqKioKLQlwcml2YXRlIENhY2hlVHlwZSBjYWNoZVR5cGU7Ci0JcHJpdmF0ZSBJbnRlZ2VyIGNhY2hlU2l6ZTsKLQlwcml2YXRlIEJvb2xlYW4gY2FjaGVJc1NoYXJlZDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBDYWNoaW5nRW50aXR5KENhY2hpbmcgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQl0aGlzKHBhcmVudCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZShuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDYWNoaW5nRW50aXR5KENhY2hpbmcgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShTdHJpbmcgbmFtZSkgewotCQlpZihTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KG5hbWUpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9ycyAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmICggISAobyBpbnN0YW5jZW9mIENhY2hpbmdFbnRpdHkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQ2FjaGluZ0VudGl0eSBvdGhlciA9IChDYWNoaW5nRW50aXR5KSBvOwotCQlyZXR1cm4gKAotCQkJKHRoaXMuY2FjaGVUeXBlID09IG51bGwgPwotCQkJCW90aGVyLmNhY2hlVHlwZSA9PSBudWxsIDogdGhpcy5jYWNoZVR5cGUuZXF1YWxzKG90aGVyLmNhY2hlVHlwZSkpICYmCi0JCQkodGhpcy5jYWNoZUlzU2hhcmVkID09IG51bGwgPwotCQkJCW90aGVyLmNhY2hlSXNTaGFyZWQgPT0gbnVsbCA6IHRoaXMuY2FjaGVJc1NoYXJlZC5lcXVhbHMob3RoZXIuY2FjaGVJc1NoYXJlZCkpICYmCi0JCQkodGhpcy5jYWNoZVNpemUgPT0gbnVsbCA/Ci0JCQkJb3RoZXIuY2FjaGVTaXplID09IG51bGwgOiB0aGlzLmNhY2hlU2l6ZS5lcXVhbHMob3RoZXIuY2FjaGVTaXplKSkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiAodGhpcy5jYWNoZVR5cGUgPT0gbnVsbCkgPyAwIDogdGhpcy5jYWNoZVR5cGUuaGFzaENvZGUoKTsKLQl9Ci0JCi0JIEBPdmVycmlkZQotCSBwdWJsaWMgQ2FjaGluZ0VudGl0eSBjbG9uZSgpIHsKLQkJIHRyeSB7Ci0JCQkgcmV0dXJuIChDYWNoaW5nRW50aXR5KXN1cGVyLmNsb25lKCk7Ci0JCSB9Ci0JCSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQkgfQotCSB9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gKHRoaXMuY2FjaGVUeXBlID09IG51bGwpICYmCi0JCQkJCSh0aGlzLmNhY2hlU2l6ZSA9PSBudWxsKSAmJgotCQkJCQkodGhpcy5jYWNoZUlzU2hhcmVkID09IG51bGwpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBlbnRpdHlOYW1lSXNWYWxpZCgpIHsKLQkJcmV0dXJuICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLm5hbWUpOwotCX0KLQotCXB1YmxpYyBDYWNoaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50OwotCX0KLQkKLQkvLyAqKioqKioqKioqIG5hbWUgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNhY2hlVHlwZSAqKioqKioqKioqCi0JcHVibGljIENhY2hlVHlwZSBnZXRDYWNoZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hlVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZVR5cGUoQ2FjaGVUeXBlIGNhY2hlVHlwZSkgewotCQlDYWNoZVR5cGUgb2xkID0gdGhpcy5jYWNoZVR5cGU7Ci0JCXRoaXMuY2FjaGVUeXBlID0gY2FjaGVUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfVFlQRV9QUk9QRVJUWSwgb2xkLCBjYWNoZVR5cGUpOwotCX0KLQotCS8vICoqKioqKioqKiogY2FjaGVTaXplICoqKioqKioqKioKLQlwdWJsaWMgSW50ZWdlciBnZXRDYWNoZVNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hlU2l6ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZVNpemUoSW50ZWdlciBjYWNoZVNpemUpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLmNhY2hlU2l6ZTsKLQkJdGhpcy5jYWNoZVNpemUgPSBjYWNoZVNpemU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9TSVpFX1BST1BFUlRZLCBvbGQsIGNhY2hlU2l6ZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjYWNoZUlzU2hhcmVkICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBjYWNoZUlzU2hhcmVkKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoZUlzU2hhcmVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNoYXJlZENhY2hlKEJvb2xlYW4gaXNTaGFyZWQpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmNhY2hlSXNTaGFyZWQ7Ci0JCXRoaXMuY2FjaGVJc1NoYXJlZCA9IGlzU2hhcmVkOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0hBUkVEX0NBQ0hFX1BST1BFUlRZLCBvbGQsIGlzU2hhcmVkKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCgibmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JCXNiLmFwcGVuZCgiLCBjYWNoZVR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCh0aGlzLmNhY2hlVHlwZSk7Ci0JCXNiLmFwcGVuZCgiLCBjYWNoZVNpemU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCh0aGlzLmNhY2hlU2l6ZSk7Ci0JCXNiLmFwcGVuZCgiLCBjYWNoZUlzU2hhcmVkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQodGhpcy5jYWNoZUlzU2hhcmVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0Nvbm5lY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjY2YmFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci0KLS8qKgotICogIENvbm5lY3Rpb24KLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uIGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotewotCUJvb2xlYW4gZ2V0RGVmYXVsdE5hdGl2ZVNxbCgpOwotCUJvb2xlYW4gZ2V0TmF0aXZlU3FsKCk7Ci0Jdm9pZCBzZXROYXRpdmVTcWwoQm9vbGVhbiBuZXdOYXRpdmVTcWwpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIE5BVElWRV9TUUxfUFJPUEVSVFkgPSAibmF0aXZlU3FsIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfTkFUSVZFX1NRTCA9ICJlY2xpcHNlbGluay5qZGJjLm5hdGl2ZS1zcWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfTkFUSVZFX1NRTCA9IEJvb2xlYW4uRkFMU0U7Ci0KLQlCYXRjaFdyaXRpbmcgZ2V0RGVmYXVsdEJhdGNoV3JpdGluZygpOwotCUJhdGNoV3JpdGluZyBnZXRCYXRjaFdyaXRpbmcoKTsKLQl2b2lkIHNldEJhdGNoV3JpdGluZyhCYXRjaFdyaXRpbmcgbmV3QmF0Y2hXcml0aW5nKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBCQVRDSF9XUklUSU5HX1BST1BFUlRZID0gImJhdGNoV3JpdGluZyI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0JBVENIX1dSSVRJTkcgPSAiZWNsaXBzZWxpbmsuamRiYy5iYXRjaC13cml0aW5nIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQmF0Y2hXcml0aW5nIERFRkFVTFRfQkFUQ0hfV1JJVElORyA9IEJhdGNoV3JpdGluZy5ub25lOwotCi0JQm9vbGVhbiBnZXREZWZhdWx0Q2FjaGVTdGF0ZW1lbnRzKCk7Ci0JQm9vbGVhbiBnZXRDYWNoZVN0YXRlbWVudHMoKTsKLQl2b2lkIHNldENhY2hlU3RhdGVtZW50cyhCb29sZWFuIG5ld0NhY2hlU3RhdGVtZW50cyk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfU1RBVEVNRU5UU19QUk9QRVJUWSA9ICJjYWNoZVN0YXRlbWVudHMiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19DQUNIRV9TVEFURU1FTlRTID0gImVjbGlwc2VsaW5rLmpkYmMuY2FjaGUtc3RhdGVtZW50cyI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9DQUNIRV9TVEFURU1FTlRTID0gQm9vbGVhbi5GQUxTRTsKLQotCUludGVnZXIgZ2V0RGVmYXVsdENhY2hlU3RhdGVtZW50c1NpemUoKTsKLQlJbnRlZ2VyIGdldENhY2hlU3RhdGVtZW50c1NpemUoKTsKLQl2b2lkIHNldENhY2hlU3RhdGVtZW50c1NpemUoSW50ZWdlciBuZXdDYWNoZVN0YXRlbWVudHNTaXplKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TVEFURU1FTlRTX1NJWkVfUFJPUEVSVFkgPSAiY2FjaGVTdGF0ZW1lbnRzU2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0NBQ0hFX1NUQVRFTUVOVFNfU0laRSA9ICJlY2xpcHNlbGluay5qZGJjLmNhY2hlLXN0YXRlbWVudHMuc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEludGVnZXIgREVGQVVMVF9DQUNIRV9TVEFURU1FTlRTX1NJWkUgPSBJbnRlZ2VyLnZhbHVlT2YoNTApOwotCi0JU3RyaW5nIGdldERlZmF1bHREcml2ZXIoKTsKLQlTdHJpbmcgZ2V0RHJpdmVyKCk7Ci0Jdm9pZCBzZXREcml2ZXIoU3RyaW5nIG5ld0RyaXZlcik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX1BST1BFUlRZID0gImRyaXZlciI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0RSSVZFUiA9ICJlY2xpcHNlbGluay5qZGJjLmRyaXZlciI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0RSSVZFUiA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgZ2V0RGVmYXVsdFVybCgpOwotCVN0cmluZyBnZXRVcmwoKTsKLQl2b2lkIHNldFVybChTdHJpbmcgbmV3VXJsKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfUFJPUEVSVFkgPSAidXJsIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfVVJMID0gImVjbGlwc2VsaW5rLmpkYmMudXJsIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVVJMID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBnZXREZWZhdWx0VXNlcigpOwotCVN0cmluZyBnZXRVc2VyKCk7Ci0Jdm9pZCBzZXRVc2VyKFN0cmluZyBuZXdVc2VyKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1BST1BFUlRZID0gInVzZXIiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19VU0VSID0gImVjbGlwc2VsaW5rLmpkYmMudXNlciI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1VTRVIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIGdldERlZmF1bHRQYXNzd29yZCgpOwotCVN0cmluZyBnZXRQYXNzd29yZCgpOwotCXZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIG5ld1Bhc3N3b3JkKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9QUk9QRVJUWSA9ICJwYXNzd29yZCI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1BBU1NXT1JEID0gImVjbGlwc2VsaW5rLmpkYmMucGFzc3dvcmQiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QQVNTV09SRCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlCb29sZWFuIGdldERlZmF1bHRCaW5kUGFyYW1ldGVycygpOwotCUJvb2xlYW4gZ2V0QmluZFBhcmFtZXRlcnMoKTsKLQl2b2lkIHNldEJpbmRQYXJhbWV0ZXJzKEJvb2xlYW4gbmV3QmluZFBhcmFtZXRlcnMpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRfUEFSQU1FVEVSU19QUk9QRVJUWSA9ICJiaW5kUGFyYW1ldGVycyI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0JJTkRfUEFSQU1FVEVSUyA9ICJlY2xpcHNlbGluay5qZGJjLmJpbmQtcGFyYW1ldGVycyI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9CSU5EX1BBUkFNRVRFUlMgPSBCb29sZWFuLlRSVUU7Ci0KLQlCb29sZWFuIGdldERlZmF1bHRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoKTsKLQlCb29sZWFuIGdldFJlYWRDb25uZWN0aW9uc1NoYXJlZCgpOwotCXZvaWQgc2V0UmVhZENvbm5lY3Rpb25zU2hhcmVkKEJvb2xlYW4gbmV3UmVhZENvbm5lY3Rpb25zU2hhcmVkKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9QUk9QRVJUWSA9ICJyZWFkQ29ubmVjdGlvbnNTaGFyZWQiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX1NIQVJFRCA9ICJlY2xpcHNlbGluay5qZGJjLnJlYWQtY29ubmVjdGlvbnMuc2hhcmVkIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1JFQURfQ09OTkVDVElPTlNfU0hBUkVEID0gQm9vbGVhbi5GQUxTRTsKLQotCUludGVnZXIgZ2V0RGVmYXVsdFJlYWRDb25uZWN0aW9uc01pbigpOwotCUludGVnZXIgZ2V0UmVhZENvbm5lY3Rpb25zTWluKCk7Ci0Jdm9pZCBzZXRSZWFkQ29ubmVjdGlvbnNNaW4oSW50ZWdlciBuZXdSZWFkQ29ubmVjdGlvbnNNaW4pOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZID0gInJlYWRDb25uZWN0aW9uc01pbiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUlOID0gImVjbGlwc2VsaW5rLmpkYmMucmVhZC1jb25uZWN0aW9ucy5taW4iOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIERFRkFVTFRfUkVBRF9DT05ORUNUSU9OU19NSU4gPSBJbnRlZ2VyLnZhbHVlT2YoMik7Ci0KLQlJbnRlZ2VyIGdldERlZmF1bHRSZWFkQ29ubmVjdGlvbnNNYXgoKTsKLQlJbnRlZ2VyIGdldFJlYWRDb25uZWN0aW9uc01heCgpOwotCXZvaWQgc2V0UmVhZENvbm5lY3Rpb25zTWF4KEludGVnZXIgbmV3UmVhZENvbm5lY3Rpb25zTWF4KTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSA9ICJyZWFkQ29ubmVjdGlvbnNNYXgiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX01BWCA9ICJlY2xpcHNlbGluay5qZGJjLnJlYWQtY29ubmVjdGlvbnMubWF4IjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgSW50ZWdlciBERUZBVUxUX1JFQURfQ09OTkVDVElPTlNfTUFYID0gSW50ZWdlci52YWx1ZU9mKDIpOwotCi0JSW50ZWdlciBnZXREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01pbigpOwotCUludGVnZXIgZ2V0V3JpdGVDb25uZWN0aW9uc01pbigpOwotCXZvaWQgc2V0V3JpdGVDb25uZWN0aW9uc01pbihJbnRlZ2VyIG5ld1dyaXRlQ29ubmVjdGlvbnNNaW4pOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFdSSVRFX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSA9ICJ3cml0ZUNvbm5lY3Rpb25zTWluIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUlOID0gImVjbGlwc2VsaW5rLmpkYmMud3JpdGUtY29ubmVjdGlvbnMubWluIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgSW50ZWdlciBERUZBVUxUX1dSSVRFX0NPTk5FQ1RJT05TX01JTiA9IEludGVnZXIudmFsdWVPZig1KTsKLQotCUludGVnZXIgZ2V0RGVmYXVsdFdyaXRlQ29ubmVjdGlvbnNNYXgoKTsKLQlJbnRlZ2VyIGdldFdyaXRlQ29ubmVjdGlvbnNNYXgoKTsKLQl2b2lkIHNldFdyaXRlQ29ubmVjdGlvbnNNYXgoSW50ZWdlciBuZXdXcml0ZUNvbm5lY3Rpb25zTWF4KTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBXUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkgPSAid3JpdGVDb25uZWN0aW9uc01heCI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01BWCA9ICJlY2xpcHNlbGluay5qZGJjLndyaXRlLWNvbm5lY3Rpb25zLm1heCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEludGVnZXIgREVGQVVMVF9XUklURV9DT05ORUNUSU9OU19NQVggPSBJbnRlZ2VyLnZhbHVlT2YoMTApOwotCi0JRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgZ2V0RGVmYXVsdEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlKCk7Ci0JRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgZ2V0RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUoKTsKLQl2b2lkIHNldEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlKEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlIG5ld0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX1BST1BFUlRZID0gImV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERSA9ICJlY2xpcHNlbGluay5qZGJjLmV4Y2x1c2l2ZS1jb25uZWN0aW9uLm1vZGUiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBERUZBVUxUX0VYQ0xVU0lWRV9DT05ORUNUSU9OX01PREUgPSBFeGNsdXNpdmVDb25uZWN0aW9uTW9kZS50cmFuc2FjdGlvbmFsOwotCi0JQm9vbGVhbiBnZXREZWZhdWx0TGF6eUNvbm5lY3Rpb24oKTsKLQlCb29sZWFuIGdldExhenlDb25uZWN0aW9uKCk7Ci0Jdm9pZCBzZXRMYXp5Q29ubmVjdGlvbihCb29sZWFuIG5ld0xhenlDb25uZWN0aW9uKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBMQVpZX0NPTk5FQ1RJT05fUFJPUEVSVFkgPSAibGF6eUNvbm5lY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19MQVpZX0NPTk5FQ1RJT04gPSAiZWNsaXBzZWxpbmsuamRiYy5leGNsdXNpdmUtY29ubmVjdGlvbi5pcy1sYXp5IjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX0xBWllfQ09OTkVDVElPTiA9IEJvb2xlYW4uVFJVRTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9Db25uZWN0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0Nvbm5lY3Rpb24yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkzNzc5ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0Nvbm5lY3Rpb24yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5KcGFDb25uZWN0aW9uMl8wOwotCi0vKioKLSAqICBDb25uZWN0aW9uMl8wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvbjJfMCBleHRlbmRzIENvbm5lY3Rpb24sIEpwYUNvbm5lY3Rpb24yXzAKLXsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvQ3VzdG9taXphdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9DdXN0b21pemF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZWEzMmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9DdXN0b21pemF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci0KLS8qKgotICogIEN1c3RvbWl6YXRpb24KLSAqLwotcHVibGljIGludGVyZmFjZSBDdXN0b21pemF0aW9uIGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotewotCUJvb2xlYW4gZ2V0RGVmYXVsdFRocm93RXhjZXB0aW9ucygpOwotCUJvb2xlYW4gZ2V0VGhyb3dFeGNlcHRpb25zKCk7Ci0Jdm9pZCBzZXRUaHJvd0V4Y2VwdGlvbnMoQm9vbGVhbiBuZXdUaHJvd0V4Y2VwdGlvbnMpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFkgPSAidGhyb3dFeGNlcHRpb25zIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfVEhST1dfRVhDRVBUSU9OUyA9ICJlY2xpcHNlbGluay5vcm0udGhyb3cuZXhjZXB0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9USFJPV19FWENFUFRJT05TID0gQm9vbGVhbi5UUlVFOwotCQotCVdlYXZpbmcgZ2V0RGVmYXVsdFdlYXZpbmcoKTsKLQlXZWF2aW5nIGdldFdlYXZpbmcoKTsKLQl2b2lkIHNldFdlYXZpbmcoV2VhdmluZyBuZXdXZWF2aW5nKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX1BST1BFUlRZID0gIndlYXZpbmciOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19XRUFWSU5HID0gImVjbGlwc2VsaW5rLndlYXZpbmciOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBXZWF2aW5nIERFRkFVTFRfV0VBVklORyA9IFdlYXZpbmcudHJ1ZV87Ci0gCi0JQm9vbGVhbiBnZXREZWZhdWx0V2VhdmluZ0xhenkoKTsKLQlCb29sZWFuIGdldFdlYXZpbmdMYXp5KCk7Ci0Jdm9pZCBzZXRXZWF2aW5nTGF6eShCb29sZWFuIG5ld1dlYXZpbmdMYXp5KTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0xBWllfUFJPUEVSVFkgPSAid2VhdmluZ0xhenkiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19XRUFWSU5HX0xBWlkgPSAiZWNsaXBzZWxpbmsud2VhdmluZy5sYXp5IjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1dFQVZJTkdfTEFaWSA9IEJvb2xlYW4uVFJVRTsKLQkKLQlCb29sZWFuIGdldERlZmF1bHRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcoKTsKLQlCb29sZWFuIGdldFdlYXZpbmdDaGFuZ2VUcmFja2luZygpOwotCXZvaWQgc2V0V2VhdmluZ0NoYW5nZVRyYWNraW5nKEJvb2xlYW4gbmV3V2VhdmluZ0NoYW5nZVRyYWNraW5nKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19QUk9QRVJUWSA9ICJ3ZWF2aW5nQ2hhbmdlVHJhY2tpbmciOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19XRUFWSU5HX0NIQU5HRV9UUkFDS0lORyA9ICJlY2xpcHNlbGluay53ZWF2aW5nLmNoYW5nZXRyYWNraW5nIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1dFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HID0gQm9vbGVhbi5UUlVFOwotCi0JQm9vbGVhbiBnZXREZWZhdWx0V2VhdmluZ0ZldGNoR3JvdXBzKCk7Ci0JQm9vbGVhbiBnZXRXZWF2aW5nRmV0Y2hHcm91cHMoKTsKLQl2b2lkIHNldFdlYXZpbmdGZXRjaEdyb3VwcyhCb29sZWFuIG5ld1dlYXZpbmdGZXRjaEdyb3Vwcyk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBVklOR19GRVRDSF9HUk9VUFNfUFJPUEVSVFkgPSAid2VhdmluZ0ZldGNoR3JvdXBzIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfV0VBVklOR19GRVRDSF9HUk9VUFMgPSAiZWNsaXBzZWxpbmsud2VhdmluZy5mZXRjaGdyb3VwcyI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9XRUFWSU5HX0ZFVENIX0dST1VQUyA9IEJvb2xlYW4uVFJVRTsKLQotCUJvb2xlYW4gZ2V0RGVmYXVsdFdlYXZpbmdJbnRlcm5hbCgpOwotCUJvb2xlYW4gZ2V0V2VhdmluZ0ludGVybmFsKCk7Ci0Jdm9pZCBzZXRXZWF2aW5nSW50ZXJuYWwoQm9vbGVhbiBuZXdXZWF2aW5nSW50ZXJuYWwpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfSU5URVJOQUxfUFJPUEVSVFkgPSAid2VhdmluZ0ludGVybmFsIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfV0VBVklOR19JTlRFUk5BTCA9ICJlY2xpcHNlbGluay53ZWF2aW5nLmludGVybmFsIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1dFQVZJTkdfSU5URVJOQUwgPSBCb29sZWFuLlRSVUU7Ci0KLQlCb29sZWFuIGdldERlZmF1bHRXZWF2aW5nRWFnZXIoKTsKLQlCb29sZWFuIGdldFdlYXZpbmdFYWdlcigpOwotCXZvaWQgc2V0V2VhdmluZ0VhZ2VyKEJvb2xlYW4gbmV3V2VhdmluZ0VhZ2VyKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0VBR0VSX1BST1BFUlRZID0gIndlYXZpbmdFYWdlciI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1dFQVZJTkdfRUFHRVIgPSAiZWNsaXBzZWxpbmsud2VhdmluZy5lYWdlciI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9XRUFWSU5HX0VBR0VSID0gQm9vbGVhbi5GQUxTRTsKLQotCVN0cmluZyBnZXREZWZhdWx0RGVzY3JpcHRvckN1c3RvbWl6ZXIoKTsKLQlTdHJpbmcgZ2V0RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihTdHJpbmcgZW50aXR5TmFtZSk7Ci0Jdm9pZCBzZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKFN0cmluZyBlbnRpdHlOYW1lLCBTdHJpbmcgbmV3RGVzY3JpcHRvckN1c3RvbWl6ZXIpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSA9ICJkZXNjcmlwdG9yQ3VzdG9taXplciI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUiA9ICJlY2xpcHNlbGluay5kZXNjcmlwdG9yLmN1c3RvbWl6ZXIuIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfREVTQ1JJUFRPUl9DVVNUT01JWkVSID0gbnVsbDsJLy8gbm8gZGVmYXVsdAotCi0JTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0U2Vzc2lvbkN1c3RvbWl6ZXJzKCk7Ci0JaW50IGdldFNlc3Npb25DdXN0b21pemVyc1NpemUoKTsKLQlib29sZWFuIHNlc3Npb25DdXN0b21pemVyRXhpc3RzKFN0cmluZyBzZXNzaW9uQ3VzdG9taXplckNsYXNzTmFtZSk7Ci0JU3RyaW5nIGFkZFNlc3Npb25DdXN0b21pemVyKFN0cmluZyBuZXdTZXNzaW9uQ3VzdG9taXplckNsYXNzTmFtZSk7Ci0Jdm9pZCByZW1vdmVTZXNzaW9uQ3VzdG9taXplcihTdHJpbmcgc2Vzc2lvbkN1c3RvbWl6ZXJDbGFzc05hbWUpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fQ1VTVE9NSVpFUl9MSVNUID0gInNlc3Npb25DdXN0b21pemVycyI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0NVU1RPTUlaRVJfUFJPUEVSVFkgPSAic2Vzc2lvbkN1c3RvbWl6ZXIiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19TRVNTSU9OX0NVU1RPTUlaRVIgPSAiZWNsaXBzZWxpbmsuc2Vzc2lvbi5jdXN0b21pemVyIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgRUNMSVBTRUxJTktfU0VTU0lPTl9DVVNUT01JWkVSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29uZmlnLlNlc3Npb25DdXN0b21pemVyIjsgLy8kTk9OLU5MUy0xJAotCi0JTGlzdEl0ZXJhYmxlPEN1c3RvbWl6YXRpb25FbnRpdHk+IGdldEVudGl0aWVzKCk7Ci0JSXRlcmFibGU8U3RyaW5nPiBnZXRFbnRpdHlOYW1lcygpOwotCWludCBnZXRFbnRpdGllc1NpemUoKTsKLQlib29sZWFuIGVudGl0eUV4aXN0cyhTdHJpbmcgZW50aXR5KTsKLQlDdXN0b21pemF0aW9uRW50aXR5IGFkZEVudGl0eShTdHJpbmcgZW50aXR5KTsKLQl2b2lkIHJlbW92ZUVudGl0eShTdHJpbmcgZW50aXR5KTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVElFU19MSVNUID0gImVudGl0aWVzIjsgLy8kTk9OLU5MUy0xJAotCQkKLQlTdHJpbmcgZ2V0RGVmYXVsdFByb2ZpbGVyKCk7Ci0JU3RyaW5nIGdldFByb2ZpbGVyKCk7Ci0Jdm9pZCBzZXRQcm9maWxlcihTdHJpbmcgbmV3UHJvZmlsZXIpOwotCXZvaWQgc2V0UHJvZmlsZXIoUHJvZmlsZXIgbmV3UHJvZmlsZXIpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVSX1BST1BFUlRZID0gInByb2ZpbGVyIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUFJPRklMRVIgPSAiZWNsaXBzZWxpbmsucHJvZmlsZXIiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QUk9GSUxFUiA9IFByb2ZpbGVyLm5vX3Byb2ZpbGVyLmdldFByb3BlcnR5VmFsdWUoKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZ1tdIFJFU0VSVkVEX1BST0ZJTEVSX05BTUVTID0ge1Byb2ZpbGVyLm5vX3Byb2ZpbGVyLmdldFByb3BlcnR5VmFsdWUoKSwgUHJvZmlsZXIucGVyZm9ybWFuY2VfcHJvZmlsZXIuZ2V0UHJvcGVydHlWYWx1ZSgpLCBQcm9maWxlci5xdWVyeV9tb25pdG9yLmdldFByb3BlcnR5VmFsdWUoKX07Ci0JCVN0cmluZyBFQ0xJUFNFTElOS19TRVNTSU9OX1BST0ZJTEVSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2Uuc2Vzc2lvbnMuU2Vzc2lvblByb2ZpbGVyIjsgLy8kTk9OLU5MUy0xJAotCQkKLQlCb29sZWFuIGdldERlZmF1bHRWYWxpZGF0aW9uT25seSgpOwotCUJvb2xlYW4gZ2V0VmFsaWRhdGlvbk9ubHkoKTsKLQl2b2lkIHNldFZhbGlkYXRpb25Pbmx5KEJvb2xlYW4gbmV3VmFsaWRhdGlvbk9ubHkpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fT05MWV9QUk9QRVJUWSA9ICJ2YWxpZGF0aW9uT25seSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1ZBTElEQVRJT05fT05MWSA9ICJlY2xpcHNlbGluay52YWxpZGF0aW9uLW9ubHkiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfVkFMSURBVElPTl9PTkxZID0gQm9vbGVhbi5UUlVFOwotCi0JU3RyaW5nIGdldERlZmF1bHRFeGNlcHRpb25IYW5kbGVyKCk7Ci0JU3RyaW5nIGdldEV4Y2VwdGlvbkhhbmRsZXIoKTsKLQl2b2lkIHNldEV4Y2VwdGlvbkhhbmRsZXIoU3RyaW5nIG5ld0V4Y2VwdGlvbkhhbmRsZXIpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTl9IQU5ETEVSX1BST1BFUlRZID0gImV4Y2VwdGlvbkhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19FWENFUFRJT05fSEFORExFUiA9ICJlY2xpcHNlbGluay5leGNlcHRpb24taGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VYQ0VQVElPTl9IQU5ETEVSID0gbnVsbDsJLy8gbm8gZGVmYXVsdAotCQlTdHJpbmcgRUNMSVBTRUxJTktfRVhDRVBUSU9OX0hBTkRMRVJfQ0xBU1NfTkFNRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5leGNlcHRpb25zLkV4Y2VwdGlvbkhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0KLQlCb29sZWFuIGdldERlZmF1bHRWYWxpZGF0ZVNjaGVtYSgpOwotCUJvb2xlYW4gZ2V0VmFsaWRhdGVTY2hlbWEoKTsKLQl2b2lkIHNldFZhbGlkYXRlU2NoZW1hKEJvb2xlYW4gbmV3VmFsaWRhdGVTY2hlbWEpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX1NDSEVNQV9QUk9QRVJUWSA9ICJ2YWxpZGF0ZVNjaGVtYSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1ZBTElEQVRFX1NDSEVNQSA9ICJlY2xpcHNlbGluay5vcm0udmFsaWRhdGUuc2NoZW1hIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1ZBTElEQVRFX1NDSEVNQSA9IEJvb2xlYW4uRkFMU0U7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0N1c3RvbWl6YXRpb25FbnRpdHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvQ3VzdG9taXphdGlvbkVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTdhNmU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvQ3VzdG9taXphdGlvbkVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci0KLS8qKgotICogIEVudGl0eQotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9taXphdGlvbkVudGl0eSBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBDdXN0b21pemF0aW9uIHBhcmVudDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSA9IEN1c3RvbWl6YXRpb24uREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZOwotCi0JLy8gKioqKioqKioqKiBFY2xpcHNlTGluayBwcm9wZXJ0aWVzICoqKioqKioqKioKLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdG9yQ3VzdG9taXplcjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBDdXN0b21pemF0aW9uRW50aXR5KEN1c3RvbWl6YXRpb24gcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQl0aGlzKHBhcmVudCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZShuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIEN1c3RvbWl6YXRpb25FbnRpdHkoQ3VzdG9taXphdGlvbiBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKFN0cmluZyBuYW1lKSB7Ci0JCWlmKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkobmFtZSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3JzICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKCAhIChvIGluc3RhbmNlb2YgQ3VzdG9taXphdGlvbkVudGl0eSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlDdXN0b21pemF0aW9uRW50aXR5IGN1c3RvbWl6ZXIgPSAoQ3VzdG9taXphdGlvbkVudGl0eSkgbzsKLQkJcmV0dXJuICgKLQkJCSh0aGlzLmRlc2NyaXB0b3JDdXN0b21pemVyID09IG51bGwgPwotCQkJCWN1c3RvbWl6ZXIuZGVzY3JpcHRvckN1c3RvbWl6ZXIgPT0gbnVsbCA6IAotCQkJCXRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXIuZXF1YWxzKGN1c3RvbWl6ZXIuZGVzY3JpcHRvckN1c3RvbWl6ZXIpKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiAodGhpcy5kZXNjcmlwdG9yQ3VzdG9taXplciA9PSBudWxsKSA/IDAgOiB0aGlzLmRlc2NyaXB0b3JDdXN0b21pemVyLmhhc2hDb2RlKCk7Ci0JfQotCQotCSBAT3ZlcnJpZGUKLQkgcHVibGljIEN1c3RvbWl6YXRpb25FbnRpdHkgY2xvbmUoKSB7Ci0JCSB0cnkgewotCQkJIHJldHVybiAoQ3VzdG9taXphdGlvbkVudGl0eSlzdXBlci5jbG9uZSgpOwotCQkgfQotCQkgY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJIH0KLQkgfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXIgPT0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZW50aXR5TmFtZUlzVmFsaWQoKSB7Ci0JCXJldHVybiAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5uYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ3VzdG9taXphdGlvbiBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldHRlci9zZXR0ZXIgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0b3JDdXN0b21pemVyKCkgewotCQlyZXR1cm4gdGhpcy5kZXNjcmlwdG9yQ3VzdG9taXplcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdG9yQ3VzdG9taXplcihTdHJpbmcgZGVzY3JpcHRvckN1c3RvbWl6ZXIpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXI7Ci0JCXRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXIgPSBkZXNjcmlwdG9yQ3VzdG9taXplcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSwgb2xkLCBkZXNjcmlwdG9yQ3VzdG9taXplcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoIm5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCQlzYi5hcHBlbmQoIiwgZGVzY3JpcHRvckN1c3RvbWl6ZXI6ICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCh0aGlzLmRlc2NyaXB0b3JDdXN0b21pemVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0RkbEdlbmVyYXRpb25UeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0RkbEdlbmVyYXRpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZjA4NmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9EZGxHZW5lcmF0aW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxFbnVtVmFsdWU7Ci0KLS8qKgotICogIERkbEdlbmVyYXRpb25UeXBlCi0gKi8KLXB1YmxpYyBlbnVtIERkbEdlbmVyYXRpb25UeXBlIGltcGxlbWVudHMgUGVyc2lzdGVuY2VYbWxFbnVtVmFsdWV7Ci0Jbm9uZSgibm9uZSIpICwgIC8vJE5PTi1OTFMtMSQKLQljcmVhdGVfdGFibGVzKCJjcmVhdGUtdGFibGVzIiksICAvLyROT04tTkxTLTEkCi0JZHJvcF9hbmRfY3JlYXRlX3RhYmxlcygiZHJvcC1hbmQtY3JlYXRlLXRhYmxlcyIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBwcm9wZXJ0eVZhbHVlOwotCQotCURkbEdlbmVyYXRpb25UeXBlKFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0JCXRoaXMucHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN0cmluZyB1c2VkIGFzIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpbiB0aGUgcGVyc2lzdGVuY2UueG1sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5wcm9wZXJ0eVZhbHVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTc3MjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTm9uRW1wdHlTdHJpbmdGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3ViSXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhTmFtZWRDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwaW5nRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBpbmdGaWxlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSnB0Q29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0UGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQucGVyc2lzdGVuY2UuSW1wbGllZE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuSnBhSnBxbFF1ZXJ5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYUpwcWxRdWVyeUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEpwYUVjbGlwc2VMaW5rQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rR2VuZXJhbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIHBlcnNpc3RlbmNlIHVuaXQKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0Ci0JZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlVW5pdAotewotCS8qKgotCSAqIFdpbGwgYmUgbnVsbCBpZiB0aGUgaW1wbGllZCBFTCBtYXBwaW5nIGZpbGUgc2hvdWxkIG5vdCBiZSBwYXJ0IG9mIHRoZSBjb250ZXh0IG1vZGVsLgotCSAqIE90aGVyd2lzZSB3aWxsIGJlIGVxdWFsIHRvIHBvdGVudGlhbEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmLgotCSAqIAotCSAqIEBzZWUgI3BvdGVudGlhbEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmCi0JICovCi0JcHJvdGVjdGVkIE1hcHBpbmdGaWxlUmVmIGltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmOwotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgaW1wbGllZCBlY2xpcHNlbGluayBtYXBwaW5nIGZpbGUgcmVmCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTElFRF9FQ0xJUFNFTElOS19NQVBQSU5HX0ZJTEVfUkVGX1BST1BFUlRZID0gImltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU3RvcmUgdGhlIGltcGxpZWQgRUwgbWFwcGluZyBmaWxlIHJlZiBldmVuIGlmIGl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBjb250ZXh0IG1vZGVsLgotCSAqIFRoaXMgYWxsb3dzIHVzIHRvIHN5bmMgaXQgaW4gdGhlIHN5bmNXaXRoUmVzb3VyY2VNb2RlbC4gSW4gdGhlIHVwZGF0ZSwgZGV0ZXJtaW5lIGlmCi0JICogaXQgc2hvdWxkIGJlIHBhcnQgb2YgdGhlIGNvbnRleHQgbW9kZWwgYW5kIHNldCB0aGUgaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYgYXBwcm9wcmlhdGVseS4KLQkgKiAKLQkgKiBAc2VlICNpbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZgotCSAqIEBzZWUgI3VzZXNJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZSgpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIE1hcHBpbmdGaWxlUmVmIHBvdGVudGlhbEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmOwotCi0KLQlwcml2YXRlLypmaW5hbCovIEdlbmVyYWxQcm9wZXJ0aWVzIGdlbmVyYWxQcm9wZXJ0aWVzOwotCXByaXZhdGUgQ3VzdG9taXphdGlvbiBjdXN0b21pemF0aW9uOwotCXByaXZhdGUgQ2FjaGluZyBjYWNoaW5nOwotCXByaXZhdGUgTG9nZ2luZyBsb2dnaW5nOwotCXByaXZhdGUgU2NoZW1hR2VuZXJhdGlvbiBzY2hlbWFHZW5lcmF0aW9uOwotCi0JLyogZ2xvYmFsIGNvbnZlcnRlciBkZWZpbml0aW9ucywgZGVmaW5lZCBlbHNld2hlcmUgaW4gbW9kZWwgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPEVjbGlwc2VMaW5rQ29udmVydGVyPiBjb252ZXJ0ZXJzID0gbmV3IFZlY3RvcjxFY2xpcHNlTGlua0NvbnZlcnRlcj4oKTsKLQotCXByb3RlY3RlZCBmaW5hbCBWZWN0b3I8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBkZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMgPSBuZXcgVmVjdG9yPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4oKTsKLQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdEdldE1ldGhvZDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTZXRNZXRob2Q7Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2UgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sUGVyc2lzdGVuY2VVbml0KTsKLQkJdGhpcy5wb3RlbnRpYWxJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZiA9IHRoaXMuYnVpbGRFY2xpcHNlTGlua0ltcGxpZWRNYXBwaW5nRmlsZVJlZigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRDb252ZXJ0ZXJzKHRoaXMuYnVpbGRDb252ZXJ0ZXJzKCkpOwotCi0JCU9ybUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgbWV0YWRhdGEgPSB0aGlzLmdldEVjbGlwc2VMaW5rTWV0YWRhdGEoKTsKLQotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGRlZmF1bHRzID0gKG1ldGFkYXRhID09IG51bGwpID8gbnVsbCA6IG1ldGFkYXRhLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKHRoaXMuYnVpbGREZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoZGVmYXVsdHMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBnZXRFY2xpcHNlTGlua01ldGFkYXRhKCkgewotCQlNYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIG1ldGFkYXRhID0gc3VwZXIuZ2V0TWV0YWRhdGEoKTsKLQkJaWYgKG1ldGFkYXRhIGluc3RhbmNlb2YgT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSkgewotCQkJcmV0dXJuIChPcm1FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKSBtZXRhZGF0YTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpIHsKLQkJc3VwZXIudXBkYXRlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBtZXRhZGF0YSA9IHRoaXMuZ2V0RWNsaXBzZUxpbmtNZXRhZGF0YSgpOwotCi0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZGVmYXVsdHMgPSAobWV0YWRhdGEgPT0gbnVsbCkgPyBudWxsIDogbWV0YWRhdGEuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJdGhpcy5zZXREZWZhdWx0R2V0TWV0aG9kKHRoaXMuYnVpbGREZWZhdWx0R2V0TWV0aG9kKGRlZmF1bHRzKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFNldE1ldGhvZCh0aGlzLmJ1aWxkRGVmYXVsdFNldE1ldGhvZChkZWZhdWx0cykpOwotCX0KLQotCS8vICoqKioqKioqKiogcHJvcGVydGllcyAqKioqKioqKioqCi0KLQlwdWJsaWMgR2VuZXJhbFByb3BlcnRpZXMgZ2V0R2VuZXJhbFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiAoQ29ubmVjdGlvbikgc3VwZXIuZ2V0Q29ubmVjdGlvbigpOwotCX0KLQotCXB1YmxpYyBDdXN0b21pemF0aW9uIGdldEN1c3RvbWl6YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6YXRpb247Ci0JfQotCi0JcHVibGljIENhY2hpbmcgZ2V0Q2FjaGluZygpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGluZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDYWNoZVR5cGVQcm9wZXJ0eVZhbHVlKCkgewotCQlQcm9wZXJ0eSBjYWNoZVR5cGVEZWZhdWx0UHJvcGVydHkgPSBnZXRDYWNoZVR5cGVEZWZhdWx0UHJvcGVydHkoKTsKLQkJcmV0dXJuIGNhY2hlVHlwZURlZmF1bHRQcm9wZXJ0eSAhPSBudWxsID8gY2FjaGVUeXBlRGVmYXVsdFByb3BlcnR5LmdldFZhbHVlKCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENhY2hlU2l6ZVByb3BlcnR5VmFsdWUoKSB7Ci0JCVByb3BlcnR5IGNhY2hlU2l6ZURlZmF1bHRQcm9wZXJ0eSA9IGdldENhY2hlU2l6ZURlZmF1bHRQcm9wZXJ0eSgpOwotCQlyZXR1cm4gY2FjaGVTaXplRGVmYXVsdFByb3BlcnR5ICE9IG51bGwgPyBjYWNoZVNpemVEZWZhdWx0UHJvcGVydHkuZ2V0VmFsdWUoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q2FjaGVTaGFyZWRQcm9wZXJ0eVZhbHVlKCkgewotCQlQcm9wZXJ0eSBjYWNoZVNoYXJlZERlZmF1bHRQcm9wZXJ0eSA9IGdldENhY2hlU2hhcmVkRGVmYXVsdFByb3BlcnR5KCk7Ci0JCXJldHVybiBjYWNoZVNoYXJlZERlZmF1bHRQcm9wZXJ0eSAhPSBudWxsID8gY2FjaGVTaGFyZWREZWZhdWx0UHJvcGVydHkuZ2V0VmFsdWUoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIExvZ2dpbmcgZ2V0TG9nZ2luZygpIHsKLQkJcmV0dXJuIHRoaXMubG9nZ2luZzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3B0aW9ucyBnZXRPcHRpb25zKCkgewotCQlyZXR1cm4gKE9wdGlvbnMpIHN1cGVyLmdldE9wdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgU2NoZW1hR2VuZXJhdGlvbiBnZXRTY2hlbWFHZW5lcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWFHZW5lcmF0aW9uOwotCX0KLQotCXByb3RlY3RlZCBHZW5lcmFsUHJvcGVydGllcyBidWlsZEVjbGlwc2VMaW5rR2VuZXJhbFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtHZW5lcmFsUHJvcGVydGllcyh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29ubmVjdGlvbiBidWlsZEVjbGlwc2VMaW5rQ29ubmVjdGlvbigpIHsKLQkJcmV0dXJuIChDb25uZWN0aW9uKSB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkQ29ubmVjdGlvbih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ3VzdG9taXphdGlvbiBidWlsZEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24odGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIENhY2hpbmcgYnVpbGRFY2xpcHNlTGlua0NhY2hpbmcoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtDYWNoaW5nKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBMb2dnaW5nIGJ1aWxkRWNsaXBzZUxpbmtMb2dnaW5nKCkgewotCQlyZXR1cm4gKExvZ2dpbmcpIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRMb2dnaW5nKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBPcHRpb25zIGJ1aWxkRWNsaXBzZUxpbmtPcHRpb25zKCkgewotCQlyZXR1cm4gKE9wdGlvbnMpIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcHRpb25zKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBTY2hlbWFHZW5lcmF0aW9uIGJ1aWxkRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbih0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUHJvcGVydGllcygpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKLQkJdGhpcy5nZW5lcmFsUHJvcGVydGllcyA9IHRoaXMuYnVpbGRFY2xpcHNlTGlua0dlbmVyYWxQcm9wZXJ0aWVzKCk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbiA9IHRoaXMuYnVpbGRFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24oKTsKLQkJdGhpcy5jYWNoaW5nID0gdGhpcy5idWlsZEVjbGlwc2VMaW5rQ2FjaGluZygpOwotCQl0aGlzLmxvZ2dpbmcgPSB0aGlzLmJ1aWxkRWNsaXBzZUxpbmtMb2dnaW5nKCk7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbiA9IHRoaXMuYnVpbGRFY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlQ2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJc3VwZXIucHJvcGVydHlWYWx1ZUNoYW5nZWQocHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7Ci0JCXRoaXMuZ2VuZXJhbFByb3BlcnRpZXMucHJvcGVydHlWYWx1ZUNoYW5nZWQocHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKLQkJdGhpcy5jYWNoaW5nLnByb3BlcnR5VmFsdWVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOwotCQl0aGlzLmxvZ2dpbmcucHJvcGVydHlWYWx1ZUNoYW5nZWQocHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlzdXBlci5wcm9wZXJ0eVJlbW92ZWQocHJvcGVydHlOYW1lKTsKLQkJdGhpcy5nZW5lcmFsUHJvcGVydGllcy5wcm9wZXJ0eVJlbW92ZWQocHJvcGVydHlOYW1lKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLnByb3BlcnR5UmVtb3ZlZChwcm9wZXJ0eU5hbWUpOwotCQl0aGlzLmNhY2hpbmcucHJvcGVydHlSZW1vdmVkKHByb3BlcnR5TmFtZSk7Ci0JCXRoaXMubG9nZ2luZy5wcm9wZXJ0eVJlbW92ZWQocHJvcGVydHlOYW1lKTsKLQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLnByb3BlcnR5UmVtb3ZlZChwcm9wZXJ0eU5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtYXBwaW5nIGZpbGUgcmVmcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE1hcHBpbmdGaWxlUmVmPiBnZXRNYXBwaW5nRmlsZVJlZnMoKSB7Ci0JCXJldHVybiAodGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZiA9PSBudWxsKSA/Ci0JCQkJc3VwZXIuZ2V0TWFwcGluZ0ZpbGVSZWZzKCkgOgotCQkJCW5ldyBDb21wb3NpdGVMaXN0SXRlcmFibGU8TWFwcGluZ0ZpbGVSZWY+KHN1cGVyLmdldE1hcHBpbmdGaWxlUmVmcygpLCB0aGlzLmltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGdldE1hcHBpbmdGaWxlUmVmc1NpemUoKSB7Ci0JCXJldHVybiAodGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZiA9PSBudWxsKSA/Ci0JCQkJc3VwZXIuZ2V0TWFwcGluZ0ZpbGVSZWZzU2l6ZSgpIDoKLQkJCQlzdXBlci5nZXRNYXBwaW5nRmlsZVJlZnNTaXplKCkgKyAxOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbXBsaWVkIGVjbGlwc2VsaW5rIG1hcHBpbmcgZmlsZSByZWYgKioqKioqKioqKgotCi0JcHVibGljIE1hcHBpbmdGaWxlUmVmIGdldEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmKCkgewotCQlyZXR1cm4gdGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZihNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZikgewotCQlNYXBwaW5nRmlsZVJlZiBvbGQgPSB0aGlzLmltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmOwotCQl0aGlzLmltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmID0gbWFwcGluZ0ZpbGVSZWY7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChJTVBMSUVEX0VDTElQU0VMSU5LX01BUFBJTkdfRklMRV9SRUZfUFJPUEVSVFksIG9sZCwgbWFwcGluZ0ZpbGVSZWYpOwotCX0KLQotCXByaXZhdGUgSW1wbGllZE1hcHBpbmdGaWxlUmVmIGJ1aWxkRWNsaXBzZUxpbmtJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSB7Ci0JCXJldHVybiBuZXcgSW1wbGllZE1hcHBpbmdGaWxlUmVmKHRoaXMsIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHN5bmNJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSB7Ci0JCXN1cGVyLnN5bmNJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKTsKLQkJdGhpcy5wb3RlbnRpYWxJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZi5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSW1wbGllZE1hcHBpbmdGaWxlUmVmKCkgewotCQlzdXBlci51cGRhdGVJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKTsKLQotCQlpZiAodGhpcy51c2VzSW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGUoKSkgewotCQkJdGhpcy5zZXRJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZih0aGlzLnBvdGVudGlhbEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmKTsKLQkJCXRoaXMucG90ZW50aWFsSW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYudXBkYXRlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnNldEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmKG51bGwpOwotCQkJLy90aGlzIGlzIG5lZWRlZCB0byB1bnJlZ2lzdGVyIHRoZSByb290IHN0cnVjdHVyZSBub2RlLCBob3cgd2UgYnVpbGQgdGhlIHJvb3Qgc3RydWN0dXJlIG5vZGVzIHByb2JhYmx5IG5lZWRzIHRvIGNoYW5nZS4KLQkJCXRoaXMucG90ZW50aWFsSW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoZSBpbXBsaWVkIEVjbGlwc2VMaW5rIG1hcHBpbmcgZmlsZSBpZiBhbGwgdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZTo8dWw+Ci0JICogPGxpPnRoZSBwcm9wZXJ0aWVzIGRvIG5vdCBleHBsaWNpdGx5IGV4Y2x1ZGUgaXQKLQkgKiA8bGk+aXQgaXMgbm90IHNwZWNpZmllZCBleHBsaWNpdGx5IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0JICogPGxpPnRoZSBmaWxlIGFjdHVhbGx5IGV4aXN0cwotCSAqIDwvdWw+Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIHVzZXNJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVJc05vdEV4Y2x1ZGVkKCkgJiYKLQkJCQl0aGlzLmltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlSXNOb3RTcGVjaWZpZWQoKSAmJgotCQkJCXRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVFeGlzdHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZUlzTm90RXhjbHVkZWQoKSB7Ci0JCXJldHVybiAhIHRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVJc0V4Y2x1ZGVkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVJc0V4Y2x1ZGVkKCkgewotCQlyZXR1cm4gdGhpcy5nZXRHZW5lcmFsUHJvcGVydGllcygpLmdldEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpID09IEJvb2xlYW4uVFJVRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZUlzTm90U3BlY2lmaWVkKCkgewotCQlyZXR1cm4gISB0aGlzLmltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlSXNTcGVjaWZpZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZUlzU3BlY2lmaWVkKCkgewotCQlyZXR1cm4gdGhpcy5tYXBwaW5nRmlsZUlzU3BlY2lmaWVkKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlRXhpc3RzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKSAhPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0IHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MKLQkgKiBsaXN0IG9mIGRlZmF1bHQgdGVuYW50IGRpc2NyaW1pbmF0b3IgQ29sdW1ucwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OU19MSVNUID0gImRlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBnZXREZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4odGhpcy5kZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyhJdGVyYWJsZTxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKSB7Ci0JCXRoaXMuc3luY2hyb25pemVMaXN0KHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLCB0aGlzLmRlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucywgREVGQVVMVF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TX0xJU1QpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBidWlsZERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyhFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGRlZmF1bHRzKSB7Ci0JCXJldHVybiAoZGVmYXVsdHMgPT0gbnVsbCkgPyBFbXB0eUxpc3RJdGVyYWJsZS48UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBpbnN0YW5jZSgpIDogbmV3IFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+KGRlZmF1bHRzLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzCi0JICogY29sbGVjdGlvbiBvZiAiZ2xvYmFsIiBjb252ZXJ0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRFUlNfQ09MTEVDVElPTiA9ICJjb252ZXJ0ZXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiYWN0aXZlIiBjb252ZXJ0ZXJzIGRlZmluZWQgd2l0aGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3Mgc2NvcGUsCi0JICogaW5jbHVkaW5nIGNvbnZlcnRlcnMgd2l0aCBkdXBsaWNhdGUgbmFtZXMuICJBY3RpdmUiIGNvbnZlcnRlcnMgYXJlOjx1bD4KLQkgKiA8bGk+YW55IGNvbnZlcnRlciBkZWZpbmVkIGluIG1hcHBpbmcgZmlsZXMKLQkgKiA8bGk+YW55IGNvbnZlcnRlciBkZWZpbmVkIHZpYSBKYXZhIGFubm90YXRpb25zIHRoYXQgaXMgbm90ICJvdmVycmlkZGVuIgotCSAqICAgICBieSBhIG1hcHBpbmcgZmlsZSBjb252ZXJ0ZXIgd2l0aCB0aGUgc2FtZSBuYW1lCi0JICogPC91bD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBBIEphdmEgY29udmVydGVyIGRlZmluZWQgb24gYSBjbGFzcyBvciBhdHRyaWJ1dGUKLQkgKiB0aGF0IGlzIG92ZXJyaWRkZW4gaW4gYSBtYXBwaW5nIGZpbGUgaXMgPGVtPm5vdDwvZW0+LCBhcyBhIHJlc3VsdCwKLQkgKiBpdHNlbGYgb3ZlcnJpZGRlbi4gQSBKYXZhIGNvbnZlcnRlciBjYW4gb25seSBiZSBvdmVycmlkZGVuIGJ5IGEgbWFwcGluZwotCSAqIGZpbGUgY29udmVydGVyIHdpdGggdGhlIHNhbWUgbmFtZS4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBBIEphdmEgY29udmVydGVyIGRlZmluZWQgb24gYSBjbGFzcyBvciBhdHRyaWJ1dGUKLQkgKiB3aG9zZSBjb3JyZXNwb25kaW5nIG1hcHBpbmcgZmlsZSBtYXBwaW5nIChvciBtYXBwaW5nIGZpbGUpIGlzIG1hcmtlZAotCSAqICJtZXRhZGF0YSBjb21wbGV0ZSIgaXMgaWdub3JlZC4KLQkgKi8KLQkvLyBUT0RPIGJqdiBjaGFuZ2UgdG8gZ2V0Q29udmVydGVyTmFtZXMoKSBldGMuCi0JcHVibGljIEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPiBnZXRBbGxDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb252ZXJ0ZXJzKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPih0aGlzLmNvbnZlcnRlcnMpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q29udmVydGVyc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlcnMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlICJhY3RpdmUiIGNvbnZlcnRlcnMgZGVmaW5lZCBpbiB0aGUgcGVyc2lzdGVuY2UKLQkgKiB1bml0J3Mgc2NvcGUsIHdpdGggZHVwbGljYXRlcyByZW1vdmVkLgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFVuaXF1ZUNvbnZlcnRlck5hbWVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmdldE5vbkVtcHR5Q29udmVydGVyTmFtZXMoKSwgdGhpcy5nZXRDb252ZXJ0ZXJzU2l6ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXROb25FbXB0eUNvbnZlcnRlck5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4odGhpcy5nZXRDb252ZXJ0ZXJOYW1lcygpLCBOb25FbXB0eVN0cmluZ0ZpbHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRDb252ZXJ0ZXJOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyLCBTdHJpbmc+KHRoaXMuZ2V0Q29udmVydGVycygpLCBKcGFOYW1lZENvbnRleHROb2RlLk5hbWVUcmFuc2Zvcm1lci48RWNsaXBzZUxpbmtDb252ZXJ0ZXI+aW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29udmVydGVycyhJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4gY29udmVydGVycykgewotCQl0aGlzLnN5bmNocm9uaXplQ29sbGVjdGlvbihjb252ZXJ0ZXJzLCB0aGlzLmNvbnZlcnRlcnMsIENPTlZFUlRFUlNfQ09MTEVDVElPTik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydGVycyBhcmUgbXVjaCBsaWtlIHF1ZXJpZXMuCi0JICogQHNlZSAjYnVpbGRRdWVyaWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGJ1aWxkQ29udmVydGVycygpIHsKLQkJQXJyYXlMaXN0PEVjbGlwc2VMaW5rQ29udmVydGVyPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmdldE1hcHBpbmdGaWxlQ29udmVydGVycygpKTsKLQotCQlIYXNoU2V0PFN0cmluZz4gbWFwcGluZ0ZpbGVDb252ZXJ0ZXJOYW1lcyA9IHRoaXMuY29udmVydFRvTmFtZXMocmVzdWx0KTsKLQkJSGFzaE1hcDxTdHJpbmcsIEFycmF5TGlzdDxKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXI8Pz4+PiBqYXZhQ29udmVydGVycyA9IHRoaXMubWFwQnlOYW1lKHRoaXMuZ2V0QWxsSmF2YUNvbnZlcnRlcnMoKSk7Ci0JCWZvciAoTWFwLkVudHJ5PFN0cmluZywgQXJyYXlMaXN0PEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcjw/Pj4+IGVudHJ5IDogamF2YUNvbnZlcnRlcnMuZW50cnlTZXQoKSkgewotCQkJaWYgKCAhIG1hcHBpbmdGaWxlQ29udmVydGVyTmFtZXMuY29udGFpbnMoZW50cnkuZ2V0S2V5KCkpKSB7Ci0JCQkJcmVzdWx0LmFkZEFsbChlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPiBnZXRNYXBwaW5nRmlsZUNvbnZlcnRlcnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+KHRoaXMuZ2V0TWFwcGluZ0ZpbGVDb252ZXJ0ZXJMaXN0cygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+PiBnZXRNYXBwaW5nRmlsZUNvbnZlcnRlckxpc3RzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8TWFwcGluZ0ZpbGUsIEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPj4odGhpcy5nZXRNYXBwaW5nRmlsZXMoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPiB0cmFuc2Zvcm0oTWFwcGluZ0ZpbGUgbWFwcGluZ0ZpbGUpIHsKLQkJCQkJCU1hcHBpbmdGaWxlUm9vdCByb290ID0gbWFwcGluZ0ZpbGUuZ2V0Um9vdCgpOwotCQkJCQkJcmV0dXJuIChyb290IGluc3RhbmNlb2YgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncykgPwotCQkJCQkJCQkoKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MpIHJvb3QpLmdldE1hcHBpbmdGaWxlQ29udmVydGVycygpIDoKLQkJCQkJCQkJRW1wdHlJdGVyYWJsZS48RWNsaXBzZUxpbmtDb252ZXJ0ZXI+aW5zdGFuY2UoKTsKLQkJCQkJfQotCQkJCX07Ci0JfQotCi0JLyoqCi0JICogSW5jbHVkZSAib3ZlcnJpZGRlbiIgSmF2YSBjb252ZXJ0ZXJzLgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTxKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXI8Pz4+IGdldEFsbEphdmFDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcjw/Pj4odGhpcy5nZXRBbGxKYXZhVHlwZU1hcHBpbmdDb252ZXJ0ZXJMaXN0cygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SXRlcmFibGU8SmF2YUVjbGlwc2VMaW5rQ29udmVydGVyPD8+Pj4gZ2V0QWxsSmF2YVR5cGVNYXBwaW5nQ29udmVydGVyTGlzdHMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxUeXBlTWFwcGluZywgSXRlcmFibGU8SmF2YUVjbGlwc2VMaW5rQ29udmVydGVyPD8+Pj4odGhpcy5nZXRBbGxKYXZhVHlwZU1hcHBpbmdzVW5pcXVlKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXI8Pz4+IHRyYW5zZm9ybShUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQkJCQkJcmV0dXJuIG5ldyBTdWJJdGVyYWJsZVdyYXBwZXI8RWNsaXBzZUxpbmtDb252ZXJ0ZXIsIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcjw/Pj4odGhpcy50cmFuc2Zvcm1fKHR5cGVNYXBwaW5nKSk7Ci0JCQkJCX0KLQkJCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPiB0cmFuc2Zvcm1fKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCQkJCQkvLyBKYXZhICJudWxsIiB0eXBlIG1hcHBpbmdzIGFyZSBub3QgRWNsaXBzZUxpbmsgbWFwcGluZ3MKLQkJCQkJCXJldHVybiAodHlwZU1hcHBpbmcgaW5zdGFuY2VvZiBFY2xpcHNlTGlua1R5cGVNYXBwaW5nKSA/Ci0JCQkJCQkJCSgoRWNsaXBzZUxpbmtUeXBlTWFwcGluZykgdHlwZU1hcHBpbmcpLmdldENvbnZlcnRlcnMoKSA6Ci0JCQkJCQkJCUVtcHR5SXRlcmFibGUuPEVjbGlwc2VMaW5rQ29udmVydGVyPmluc3RhbmNlKCk7Ci0JCQkJCX0KLQkJCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBFY2xpcHNlTGlua0pwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua0pwYVByb2plY3QpIHN1cGVyLmdldEpwYVByb2plY3QoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSBnZXRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSkgc3VwZXIuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZSBzcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUpIHsKLQkJc3VwZXIuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKHNwZWNpZmllZFNoYXJlZENhY2hlTW9kZSk7Ci0KLQkJaWYoc3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlID09IFNoYXJlZENhY2hlTW9kZS5OT05FKSB7Ci0JCQl0aGlzLmNhY2hpbmcucmVtb3ZlRGVmYXVsdENhY2hpbmdQcm9wZXJ0aWVzKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU2hhcmVkQ2FjaGVNb2RlIGJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlTW9kZSgpIHsKLQkJcmV0dXJuIFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCkgewotCQlTaGFyZWRDYWNoZU1vZGUgc2hhcmVkQ2FjaGVNb2RlID0gdGhpcy5nZXRTaGFyZWRDYWNoZU1vZGUoKTsKLQkJaWYgKHNoYXJlZENhY2hlTW9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlzd2l0Y2ggKHNoYXJlZENhY2hlTW9kZSkgewotCQkJY2FzZSBOT05FOgotCQkJY2FzZSBFTkFCTEVfU0VMRUNUSVZFOgotCQkJCXJldHVybiBmYWxzZTsKLQkJCWNhc2UgQUxMOgotCQkJY2FzZSBESVNBQkxFX1NFTEVDVElWRToKLQkJCWNhc2UgVU5TUEVDSUZJRUQ6Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRHZXRNZXRob2QoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRHZXRNZXRob2Q7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEdldE1ldGhvZChTdHJpbmcgZ2V0TWV0aG9kKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRHZXRNZXRob2Q7Ci0JCXRoaXMuZGVmYXVsdEdldE1ldGhvZCA9IGdldE1ldGhvZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfR0VUX01FVEhPRF9QUk9QRVJUWSwgb2xkLCBnZXRNZXRob2QpOwotCX0KLQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzCi0JICogZGVmYXVsdCBnZXQgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfR0VUX01FVEhPRF9QUk9QRVJUWSA9ICJkZWZhdWx0R2V0TWV0aG9kIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRHZXRNZXRob2QoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBkZWZhdWx0cykgewotCQlTdHJpbmcgZ2V0TWV0aG9kID0gKGRlZmF1bHRzID09IG51bGwpID8gbnVsbCA6IGRlZmF1bHRzLmdldEdldE1ldGhvZCgpOwotCQlyZXR1cm4gKGdldE1ldGhvZCAhPSBudWxsKSA/IGdldE1ldGhvZCA6IG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2V0TWV0aG9kKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2V0TWV0aG9kOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRTZXRNZXRob2QoU3RyaW5nIHNldE1ldGhvZCkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0U2V0TWV0aG9kOwotCQl0aGlzLmRlZmF1bHRTZXRNZXRob2QgPSBzZXRNZXRob2Q7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1NFVF9NRVRIT0RfUFJPUEVSVFksIG9sZCwgc2V0TWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncwotCSAqIGRlZmF1bHQgc2V0IG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NFVF9NRVRIT0RfUFJPUEVSVFkgPSAiZGVmYXVsdFNldE1ldGhvZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0U2V0TWV0aG9kKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZGVmYXVsdHMpIHsKLQkJU3RyaW5nIHNldE1ldGhvZCA9IChkZWZhdWx0cyA9PSBudWxsKSA/IG51bGwgOiBkZWZhdWx0cy5nZXRTZXRNZXRob2QoKTsKLQkJcmV0dXJuIChzZXRNZXRob2QgIT0gbnVsbCkgPyBzZXRNZXRob2QgOiBudWxsOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEVjbGlwc2VMaW5rRHluYW1pY1BlcnNpc3RlbnRUeXBlTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlLCBTdHJpbmc+KHRoaXMuZ2V0RWNsaXBzZUxpbmtEeW5hbWljUGVyc2lzdGVudFR5cGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZSB0eXBlKSB7Ci0JCQkJcmV0dXJuIHR5cGUuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlPiBnZXRFY2xpcHNlTGlua0R5bmFtaWNQZXJzaXN0ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8RWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZT4odGhpcy5nZXRFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlcygpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZSBwVHlwZSkgewotCQkJCQkJcmV0dXJuIHBUeXBlLmlzRHluYW1pYygpOwotCQkJCQl9Ci0JCQkJfTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8RWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZT4gZ2V0RWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxQZXJzaXN0ZW50VHlwZSwgRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZT4oCi0JCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFBlcnNpc3RlbnRUeXBlPih0aGlzLmdldE1hcHBpbmdGaWxlUGVyc2lzdGVudFR5cGVzKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChQZXJzaXN0ZW50VHlwZSBwVHlwZSkgewotCQkJCQkJcmV0dXJuIHBUeXBlIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZTsKLQkJCQkJfQotCQkJCX0pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUgdHJhbnNmb3JtKFBlcnNpc3RlbnRUeXBlIHBUeXBlKSB7Ci0JCQkJcmV0dXJuIChFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlKSBwVHlwZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEpwYUpwcWxRdWVyeUhlbHBlciBjcmVhdGVKcHFsUXVlcnlIZWxwZXIoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtKcGFKcHFsUXVlcnlIZWxwZXIodGhpcy5nZXRKcGFQbGF0Zm9ybSgpLmdldEpwcWxHcmFtbWFyKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy52YWxpZGF0ZUNvbnZlcnRlcnMobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVByb3BlcnRpZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCi0JCWlmKHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkpIHsKLQkJCWZvcihQcm9wZXJ0eSBwcm9wZXJ0eTogdGhpcy5nZXRMZWdhY3lFbnRpdHlDYWNoaW5nUHJvcGVydGllcygpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9MRUdBQ1lfRU5USVRZX0NBQ0hJTkcsCi0JCQkJCQluZXcgU3RyaW5nW10ge3Byb3BlcnR5LmdldE5hbWUoKX0sCi0JCQkJCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLAotCQkJCQkJcHJvcGVydHkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJCSkKLQkJCQkpOwotCQkJfQotCQkJZm9yKFByb3BlcnR5IHByb3BlcnR5OiB0aGlzLmdldExlZ2FjeURlc2NyaXB0b3JDdXN0b21pemVyUHJvcGVydGllcygpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9MRUdBQ1lfREVTQ1JJUFRPUl9DVVNUT01JWkVSLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtwcm9wZXJ0eS5nZXROYW1lKCl9LAotCQkJCQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKSwKLQkJCQkJCXByb3BlcnR5LmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkJKTsKLQkJCX0KLQkJCXRoaXMudmFsaWRhdGVEZWZhdWx0Q2FjaGluZ1Byb3BlcnR5KHRoaXMuZ2V0Q2FjaGVUeXBlRGVmYXVsdFByb3BlcnR5KCksIG1lc3NhZ2VzKTsKLQkJCXRoaXMudmFsaWRhdGVEZWZhdWx0Q2FjaGluZ1Byb3BlcnR5KHRoaXMuZ2V0Q2FjaGVTaXplRGVmYXVsdFByb3BlcnR5KCksIG1lc3NhZ2VzKTsKLQkJCXRoaXMudmFsaWRhdGVEZWZhdWx0Q2FjaGluZ1Byb3BlcnR5KHRoaXMuZ2V0Rmx1c2hDbGVhckNhY2hlUHJvcGVydHkoKSwgbWVzc2FnZXMpOwotCQkJdGhpcy52YWxpZGF0ZUxvZ2dlclByb3BlcnR5KHRoaXMuZ2V0TG9nZ2VyUHJvcGVydHkoKSwgbWVzc2FnZXMpOwotCQkJdGhpcy52YWxpZGF0ZUV4Y2VwdGlvbkhhbmRsZXJQcm9wZXJ0eSh0aGlzLmdldEV4Y2VwdGlvbkhhbmRsZXJQcm9wZXJ0eSgpLCBtZXNzYWdlcyk7Ci0JCQl0aGlzLnZhbGlkYXRlUGVyZm9ybWFuY2VQcm9maWxlclByb3BlcnR5KHRoaXMuZ2V0UGVyZm9ybWFuY2VQcm9maWxlclByb3BlcnR5KCksIG1lc3NhZ2VzKTsKLQkJCXRoaXMudmFsaWRhdGVTZXNzaW9uQ3VzdG9taXplclByb3BlcnR5KHRoaXMuZ2V0U2Vzc2lvbkN1c3RvbWl6ZXJQcm9wZXJ0aWVzKCksIG1lc3NhZ2VzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRGVmYXVsdENhY2hpbmdQcm9wZXJ0eShQcm9wZXJ0eSBjYWNoaW5nUHJvcGVydHksIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0KLQkJaWYodGhpcy5nZXRTaGFyZWRDYWNoZU1vZGUoKSA9PSBTaGFyZWRDYWNoZU1vZGUuTk9ORSkgewotCQkJaWYoY2FjaGluZ1Byb3BlcnR5ICE9IG51bGwpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCi0JCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX0NBQ0hJTkdfUFJPUEVSVFlfSUdOT1JFRCwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Y2FjaGluZ1Byb3BlcnR5LmdldE5hbWUoKX0sCi0JCQkJCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLAotCQkJCQkJY2FjaGluZ1Byb3BlcnR5LmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkJKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTG9nZ2VyUHJvcGVydHkoUHJvcGVydHkgbG9nZ2VyUHJvcGVydHksIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmICgobG9nZ2VyUHJvcGVydHkgPT0gbnVsbCkgfHwgKGxvZ2dlclByb3BlcnR5LmdldFZhbHVlKCkgPT0gbnVsbCkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoQXJyYXlUb29scy5jb250YWlucyhMb2dnaW5nLlJFU0VSVkVEX0xPR0dFUl9OQU1FUywgbG9nZ2VyUHJvcGVydHkuZ2V0VmFsdWUoKSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShsb2dnZXJQcm9wZXJ0eS5nZXRWYWx1ZSgpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuU0VTU0lPTl9MT0dHRVJfQ0xBU1NfTk9UX1NQRUNJRklFRCwKLQkJCQkJCQlFTVBUWV9TVFJJTkdfQVJSQVksCi0JCQkJCQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKSwKLQkJCQkJCQlsb2dnZXJQcm9wZXJ0eS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKLQkJCQkJKQotCQkJKTsKLQkJfSBlbHNlIGlmIChKRFRUb29scy5maW5kVHlwZShqYXZhUHJvamVjdCwgbG9nZ2VyUHJvcGVydHkuZ2V0VmFsdWUoKSkgPT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuU0VTU0lPTl9MT0dHRVJfQ0xBU1NfTk9UX0VYSVNULAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7bG9nZ2VyUHJvcGVydHkuZ2V0VmFsdWUoKX0sCi0JCQkJCQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKSwKLQkJCQkJCQlsb2dnZXJQcm9wZXJ0eS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKLQkJCQkJKQotCQkJKTsKLQkJfSBlbHNlIGlmICghSkRUVG9vbHMudHlwZUlzU3ViVHlwZSgKLQkJCQlqYXZhUHJvamVjdCwgbG9nZ2VyUHJvcGVydHkuZ2V0VmFsdWUoKSwgTG9nZ2luZy5FQ0xJUFNFTElOS19MT0dHRVJfQ0xBU1NfTkFNRSkKLQkJKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5TRVNTSU9OX0xPR0dFUl9DTEFTU19JTVBMRU1FTlRTX1NFU1NJT05fTE9HLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7bG9nZ2VyUHJvcGVydHkuZ2V0VmFsdWUoKX0sCi0JCQkJCQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKSwKLQkJCQkJCQlsb2dnZXJQcm9wZXJ0eS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKLQkJCQkJKQotCQkJKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUV4Y2VwdGlvbkhhbmRsZXJQcm9wZXJ0eShQcm9wZXJ0eSBoYW5kbGVyUHJvcGVydHksIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmICgoaGFuZGxlclByb3BlcnR5ID09IG51bGwpIHx8IChoYW5kbGVyUHJvcGVydHkuZ2V0VmFsdWUoKSA9PSBudWxsKSApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShoYW5kbGVyUHJvcGVydHkuZ2V0VmFsdWUoKSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVYQ0VQVElPTl9IQU5ETEVSX0NMQVNTX05PVF9TUEVDSUZJRUQsCi0JCQkJCQkJRU1QVFlfU1RSSU5HX0FSUkFZLAotCQkJCQkJCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCksCi0JCQkJCQkJaGFuZGxlclByb3BlcnR5LmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkpOwotCQl9IGVsc2UgaWYgKEpEVFRvb2xzLmZpbmRUeXBlKGphdmFQcm9qZWN0LCBoYW5kbGVyUHJvcGVydHkuZ2V0VmFsdWUoKSkgPT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRVhDRVBUSU9OX0hBTkRMRVJfQ0xBU1NfTk9UX0VYSVNULAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7aGFuZGxlclByb3BlcnR5LmdldFZhbHVlKCl9LAotCQkJCQkJCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCksCi0JCQkJCQkJaGFuZGxlclByb3BlcnR5LmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkpOwotCQl9IGVsc2UgaWYgKCFKRFRUb29scy5jbGFzc0hhc1B1YmxpY1plcm9BcmdDb25zdHJ1Y3RvcihqYXZhUHJvamVjdCwgaGFuZGxlclByb3BlcnR5LmdldFZhbHVlKCkpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5FWENFUFRJT05fSEFORExFUl9DTEFTU19OT1RfVkFMSUQsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtoYW5kbGVyUHJvcGVydHkuZ2V0VmFsdWUoKX0sCi0JCQkJCQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKSwKLQkJCQkJCQloYW5kbGVyUHJvcGVydHkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJCSkKLQkJCSk7Ci0JCX0gZWxzZSBpZiAoIUpEVFRvb2xzLnR5cGVJc1N1YlR5cGUoCi0JCQkJamF2YVByb2plY3QsIGhhbmRsZXJQcm9wZXJ0eS5nZXRWYWx1ZSgpLCBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX0VYQ0VQVElPTl9IQU5ETEVSX0NMQVNTX05BTUUpCi0JCSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRVhDRVBUSU9OX0hBTkRMRVJfQ0xBU1NfSU1QTEVNRU5UU19FWENFUFRJT05fSEFORExFUiwKLQkJCQkJCQluZXcgU3RyaW5nW10ge2hhbmRsZXJQcm9wZXJ0eS5nZXRWYWx1ZSgpfSwKLQkJCQkJCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLAotCQkJCQkJCWhhbmRsZXJQcm9wZXJ0eS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKLQkJCQkJKQotCQkJKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVBlcmZvcm1hbmNlUHJvZmlsZXJQcm9wZXJ0eShQcm9wZXJ0eSBwcm9maWxlclByb3BlcnR5LCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCi0JCWlmICgocHJvZmlsZXJQcm9wZXJ0eSA9PSBudWxsKSB8fCAocHJvZmlsZXJQcm9wZXJ0eS5nZXRWYWx1ZSgpID09IG51bGwpICkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKEFycmF5VG9vbHMuY29udGFpbnMoQ3VzdG9taXphdGlvbi5SRVNFUlZFRF9QUk9GSUxFUl9OQU1FUywgcHJvZmlsZXJQcm9wZXJ0eS5nZXRWYWx1ZSgpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHByb2ZpbGVyUHJvcGVydHkuZ2V0VmFsdWUoKSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlNFU1NJT05fUFJPRklMRVJfQ0xBU1NfTk9UX1NQRUNJRklFRCwKLQkJCQkJCQlFTVBUWV9TVFJJTkdfQVJSQVksCi0JCQkJCQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKSwKLQkJCQkJCQlwcm9maWxlclByb3BlcnR5LmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkpOwotCQl9IGVsc2UgaWYgKEpEVFRvb2xzLmZpbmRUeXBlKGphdmFQcm9qZWN0LCBwcm9maWxlclByb3BlcnR5LmdldFZhbHVlKCkpID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlNFU1NJT05fUFJPRklMRVJfQ0xBU1NfTk9UX0VYSVNULAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7cHJvZmlsZXJQcm9wZXJ0eS5nZXRWYWx1ZSgpfSwKLQkJCQkJCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLAotCQkJCQkJCXByb2ZpbGVyUHJvcGVydHkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJCSkKLQkJCSk7Ci0JCX0gZWxzZSBpZiAoIUpEVFRvb2xzLmNsYXNzSGFzUHVibGljWmVyb0FyZ0NvbnN0cnVjdG9yKGphdmFQcm9qZWN0LCBwcm9maWxlclByb3BlcnR5LmdldFZhbHVlKCkpKXsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlNFU1NJT05fUFJPRklMRVJfQ0xBU1NfTk9UX1ZBTElELAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7cHJvZmlsZXJQcm9wZXJ0eS5nZXRWYWx1ZSgpfSwKLQkJCQkJCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLAotCQkJCQkJCXByb2ZpbGVyUHJvcGVydHkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJCSkKLQkJCSk7Ci0JCX0gZWxzZSBpZiAoIUpEVFRvb2xzLnR5cGVJc1N1YlR5cGUoCi0JCQkJamF2YVByb2plY3QsIHByb2ZpbGVyUHJvcGVydHkuZ2V0VmFsdWUoKSwgQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19TRVNTSU9OX1BST0ZJTEVSX0NMQVNTX05BTUUpCi0JCSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuU0VTU0lPTl9QUk9GSUxFUl9DTEFTU19JTVBMRU1FTlRTX1NFU1NJT05QX1JPRklMRVIsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtwcm9maWxlclByb3BlcnR5LmdldFZhbHVlKCl9LAotCQkJCQkJCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCksCi0JCQkJCQkJcHJvZmlsZXJQcm9wZXJ0eS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKLQkJCQkJKQotCQkJKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVNlc3Npb25DdXN0b21pemVyUHJvcGVydHkoCUl0ZXJhYmxlPFByb3BlcnR5PiBwcm9wZXJ0aWVzLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlmb3IgKFByb3BlcnR5IHByb3BlcnR5IDogcHJvcGVydGllcykgewotCQkJaWYgKHByb3BlcnR5LmdldFZhbHVlKCkgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkocHJvcGVydHkuZ2V0VmFsdWUoKSkpIHsKLQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuU0VTU0lPTl9DVVNUT01JWkVSX0NMQVNTX05PVF9TUEVDSUZJRUQsCi0JCQkJCQkJCQlFTVBUWV9TVFJJTkdfQVJSQVksCi0JCQkJCQkJCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLAotCQkJCQkJCQkJcHJvcGVydHkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJCQkJKQotCQkJCQkpOwotCQkJCX0gZWxzZSBpZiAoSkRUVG9vbHMuZmluZFR5cGUoamF2YVByb2plY3QsIHByb3BlcnR5LmdldFZhbHVlKCkpID09IG51bGwpIHsKLQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuU0VTU0lPTl9DVVNUT01JWkVSX0NMQVNTX05PVF9FWElTVCwKLQkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7cHJvcGVydHkuZ2V0VmFsdWUoKX0sCi0JCQkJCQkJCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLAotCQkJCQkJCQkJcHJvcGVydHkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJCQkJKQotCQkJCQkpOwotCQkJCX0gZWxzZSBpZiAoIUpEVFRvb2xzLmNsYXNzSGFzUHVibGljWmVyb0FyZ0NvbnN0cnVjdG9yKGphdmFQcm9qZWN0LCBwcm9wZXJ0eS5nZXRWYWx1ZSgpKSl7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlNFU1NJT05fQ1VTVE9NSVpFUl9DTEFTU19OT1RfVkFMSUQsCi0JCQkJCQkJCQluZXcgU3RyaW5nW10ge3Byb3BlcnR5LmdldFZhbHVlKCl9LAotCQkJCQkJCQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKSwKLQkJCQkJCQkJCXByb3BlcnR5LmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCQkJCSkKLQkJCQkJKTsKLQkJCQl9IGVsc2UgaWYgKCFKRFRUb29scy50eXBlSXNTdWJUeXBlKAotCQkJCQkJamF2YVByb2plY3QsIHByb3BlcnR5LmdldFZhbHVlKCksIEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfU0VTU0lPTl9DVVNUT01JWkVSX0NMQVNTX05BTUUpCi0JCQkJKSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlNFU1NJT05fQ1VTVE9NSVpFUl9DTEFTU19JTVBMRU1FTlRTX1NFU1NJT05fQ1VTVE9NSVpFUiwKLQkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7cHJvcGVydHkuZ2V0VmFsdWUoKX0sCi0JCQkJCQkJCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLAotCQkJCQkJCQkJcHJvcGVydHkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJCQkJKQotCQkJCQkpOwotCQkJCX0KLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIEFycmF5TGlzdDxQcm9wZXJ0eT4gZ2V0TGVnYWN5RGVzY3JpcHRvckN1c3RvbWl6ZXJQcm9wZXJ0aWVzKCkgewotCQlBcnJheUxpc3Q8UHJvcGVydHk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHk+KCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwocmVzdWx0LCB0aGlzLmdldERlc2NyaXB0b3JDdXN0b21pemVyUHJvcGVydGllcygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PFByb3BlcnR5PiBnZXRMZWdhY3lFbnRpdHlDYWNoaW5nUHJvcGVydGllcygpIHsKLQkJQXJyYXlMaXN0PFByb3BlcnR5PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5PigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHJlc3VsdCwgdGhpcy5nZXRTaGFyZWRDYWNoZVByb3BlcnRpZXMoKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwocmVzdWx0LCB0aGlzLmdldEVudGl0eUNhY2hlVHlwZVByb3BlcnRpZXMoKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwocmVzdWx0LCB0aGlzLmdldEVudGl0eUNhY2hlU2l6ZVByb3BlcnRpZXMoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eSBnZXRDYWNoZVR5cGVEZWZhdWx0UHJvcGVydHkoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfVFlQRV9ERUZBVUxUKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5IGdldENhY2hlU2l6ZURlZmF1bHRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9TSVpFX0RFRkFVTFQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHkgZ2V0Q2FjaGVTaGFyZWREZWZhdWx0UHJvcGVydHkoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHkgZ2V0Rmx1c2hDbGVhckNhY2hlUHJvcGVydHkoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KENhY2hpbmcuRUNMSVBTRUxJTktfRkxVU0hfQ0xFQVJfQ0FDSEUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIFNoYXJlZCBDYWNoZSBQcm9wZXJ0aWVzLCBpbmNsdWRpbmcgRW50aXR5IGFuZCBkZWZhdWx0LgotCSAqLwotCXByaXZhdGUgSXRlcmFibGU8UHJvcGVydHk+IGdldFNoYXJlZENhY2hlUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydGllc1dpdGhOYW1lUHJlZml4KENhY2hpbmcuRUNMSVBTRUxJTktfU0hBUkVEX0NBQ0hFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIEVudGl0eSBDYWNoZSBTaXplIFByb3BlcnRpZXMsIGV4Y2x1ZGluZyBkZWZhdWx0LgotCSAqLwotCXByaXZhdGUgSXRlcmFibGU8UHJvcGVydHk+IGdldEVudGl0eUNhY2hlU2l6ZVByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldEVudGl0eVByb3BlcnRpZXNXaXRoUHJlZml4KENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfU0laRSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBFbnRpdHkgQ2FjaGUgVHlwZSBQcm9wZXJ0aWVzLCBleGNsdWRpbmcgZGVmYXVsdC4KLQkgKi8KLQlwcml2YXRlIEl0ZXJhYmxlPFByb3BlcnR5PiBnZXRFbnRpdHlDYWNoZVR5cGVQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbnRpdHlQcm9wZXJ0aWVzV2l0aFByZWZpeChDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1RZUEUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgRGVzY3JpcHRvciBDdXN0b21pemVyIFByb3BlcnRpZXMuCi0JICovCi0JcHJpdmF0ZSBJdGVyYWJsZTxQcm9wZXJ0eT4gZ2V0RGVzY3JpcHRvckN1c3RvbWl6ZXJQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbnRpdHlQcm9wZXJ0aWVzV2l0aFByZWZpeChDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBFbnRpdHkgUHJvcGVydGllcyB3aXRoIHRoZSBnaXZlbiBwcmVmaXgsCi0JICogZXhjbHVkaW5nIEVudGl0eSB3aGljaCBuYW1lIGVxdWFscyAiZGVmYXVsdCIuCi0JICovCi0JcHJpdmF0ZSBJdGVyYWJsZTxQcm9wZXJ0eT4gZ2V0RW50aXR5UHJvcGVydGllc1dpdGhQcmVmaXgoU3RyaW5nIHByZWZpeCkgewotCSAgIHJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8UHJvcGVydHk+KHRoaXMuZ2V0UHJvcGVydGllc1dpdGhOYW1lUHJlZml4KHByZWZpeCkpIHsKLQkgICAgICBAT3ZlcnJpZGUKLQkgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoUHJvcGVydHkgbmV4dCkgewotCQkJCXJldHVybiAhIG5leHQuZ2V0TmFtZSgpLmVuZHNXaXRoKCJkZWZhdWx0Iik7IC8vJE5PTi1OTFMtMSQKLQkgICAgICB9Ci0JICAgfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5IGdldExvZ2dlclByb3BlcnR5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShMb2dnaW5nLkVDTElQU0VMSU5LX0xPR0dFUik7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eSBnZXRFeGNlcHRpb25IYW5kbGVyUHJvcGVydHkoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfRVhDRVBUSU9OX0hBTkRMRVIpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHkgZ2V0UGVyZm9ybWFuY2VQcm9maWxlclByb3BlcnR5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX1BST0ZJTEVSKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBTZXNzaW9uIEN1c3RvbWl6ZXIgUHJvcGVydGllcy4KLQkgKi8KLQlwcml2YXRlIEl0ZXJhYmxlPFByb3BlcnR5PiBnZXRTZXNzaW9uQ3VzdG9taXplclByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnRpZXNXaXRoTmFtZVByZWZpeChDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX1NFU1NJT05fQ1VTVE9NSVpFUik7Ci0JfQotCi0JLyoqCi0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gV2UgdmFsaWRhdGUgY29udmVydGVycyBoZXJlLgotCSAqIEBzZWUgI3ZhbGlkYXRlR2VuZXJhdG9ycyhMaXN0LCBJUmVwb3J0ZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDb252ZXJ0ZXJzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJdGhpcy5jaGVja0ZvckNvbnZlcnRlcnNXaXRoU2FtZU5hbWUobWVzc2FnZXMpOwotCQlmb3IgKEVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlciA6IHRoaXMuZ2V0Q29udmVydGVycygpKSB7Ci0JCQl0aGlzLnZhbGlkYXRlKGNvbnZlcnRlciwgbWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrRm9yQ29udmVydGVyc1dpdGhTYW1lTmFtZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PEVjbGlwc2VMaW5rQ29udmVydGVyPj4gY29udmVydGVyc0J5TmFtZSA9IHRoaXMubWFwQnlOYW1lKHRoaXMuZ2V0Q29udmVydGVycygpKTsKLQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBBcnJheUxpc3Q8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+PiBlbnRyeSA6IGNvbnZlcnRlcnNCeU5hbWUuZW50cnlTZXQoKSkgewotCQkJU3RyaW5nIGNvbnZlcnRlck5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc05vdEVtcHR5KGNvbnZlcnRlck5hbWUpKSB7ICAvLyBpZ25vcmUgZW1wdHkgbmFtZXMKLQkJCQlBcnJheUxpc3Q8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGR1cHMgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWlmIChkdXBzLnNpemUoKSA+IDEpIHsKLQkJCQkJdGhpcy52YWxpZGF0ZUNvbnZlcnRlcnNXaXRoU2FtZU5hbWUoY29udmVydGVyTmFtZSwgZHVwcywgbWVzc2FnZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFVubGlrZSBnZW5lcmF0b3JzIGFuZCBxdWVyaWVzLCB3ZSBkbyBub3QgbWFyawotCSAqICJlcXVpdmFsZW50IiBjb252ZXJ0ZXJzIHdpdGggaW5mbyBtZXNzYWdlcyAtIHdlIGp1c3QgaWdub3JlIHRoZW0KLQkgKiBiZWNhdXNlIHRoZXkgY2Fubm90IGJlICJwb3J0YWJsZSIgKHNpbmNlIG9ubHkgRWNsaXBzZUxpbmsgaGFzIGNvbnZlcnRlcnMpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ29udmVydGVyc1dpdGhTYW1lTmFtZShTdHJpbmcgY29udmVydGVyTmFtZSwgQXJyYXlMaXN0PEVjbGlwc2VMaW5rQ29udmVydGVyPiBkdXBzLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbXSB7Y29udmVydGVyTmFtZX07Ci0JCWlmICh0aGlzLmFueU5vZGVzQXJlSW5lcXVpdmFsZW50KGR1cHMpKSB7Ci0JCQlmb3IgKEVjbGlwc2VMaW5rQ29udmVydGVyIGR1cCA6IGR1cHMpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09OVkVSVEVSX0RVUExJQ0FURV9OQU1FLAotCQkJCQkJcGFybXMsCi0JCQkJCQlkdXAsCi0JCQkJCQl0aGlzLmV4dHJhY3ROYW1lVGV4dFJhbmdlKGR1cCkKLQkJCQkJKQotCQkJCSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhbGwgdGhlIHNwZWNpZmllZCBub2RlcyBhcmUgImVxdWl2YWxlbnQiCi0JICogKGkuZS4gdGhleSBhbGwgaGF2ZSB0aGUgc2FtZSBzdGF0ZSkuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWxsTm9kZXNBcmVFcXVpdmFsZW50KEFycmF5TGlzdDw/IGV4dGVuZHMgSnBhTmFtZWRDb250ZXh0Tm9kZT4gbm9kZXMpIHsKLQkJcmV0dXJuICEgdGhpcy5hbnlOb2Rlc0FyZUluZXF1aXZhbGVudChub2Rlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYW55Tm9kZXNBcmVJbmVxdWl2YWxlbnQoQXJyYXlMaXN0PD8gZXh0ZW5kcyBKcGFOYW1lZENvbnRleHROb2RlPiBub2RlcykgewotCQlpZiAobm9kZXMuc2l6ZSgpIDwgMikgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUl0ZXJhdG9yPD8gZXh0ZW5kcyBKcGFOYW1lZENvbnRleHROb2RlPiBzdHJlYW0gPSBub2Rlcy5pdGVyYXRvcigpOwotCQlKcGFOYW1lZENvbnRleHROb2RlIGZpcnN0ID0gc3RyZWFtLm5leHQoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWlmICggISBzdHJlYW0ubmV4dCgpLmlzRXF1aXZhbGVudFRvKGZpcnN0KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBUT0RPIGJqdiBpc24ndCBpdCBvYnZpb3VzPwotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZXh0cmFjdE5hbWVUZXh0UmFuZ2UoRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCXJldHVybiAoY29udmVydGVyIGluc3RhbmNlb2YgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXI8Pz4pID8KLQkJCQkoKE9ybUVjbGlwc2VMaW5rQ29udmVydGVyPD8+KSBjb252ZXJ0ZXIpLmdldE5hbWVUZXh0UmFuZ2UoKSA6Ci0JCQkJKChKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXI8Pz4pIGNvbnZlcnRlcikuZ2V0TmFtZVRleHRSYW5nZShudWxsKTsKLQl9Ci0KLQkvLyBUT0RPIGJqdiBpc24ndCBpdCBvYnZpb3VzPwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKEVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlciwgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoY29udmVydGVyIGluc3RhbmNlb2YgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXI8Pz4pIHsKLQkJCSgoT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXI8Pz4pIGNvbnZlcnRlcikudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJfSBlbHNlIHsKLQkJCSgoSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyPD8+KSBjb252ZXJ0ZXIpLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiBhbGwgdGhlIGdlbmVyYXRvcnMgYXJlICJlcXVpdmFsZW50IiBhZGQgaW5mbyBtZXNzYWdlczsKLQkgKiBvdGhlcndpc2UgbWFyayB0aGVtIGFsbCBhcyBkdXBsaWNhdGVzLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlR2VuZXJhdG9yc1dpdGhTYW1lTmFtZShTdHJpbmcgZ2VuZXJhdG9yTmFtZSwgQXJyYXlMaXN0PEdlbmVyYXRvcj4gZHVwcywgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKHRoaXMuYWxsTm9kZXNBcmVFcXVpdmFsZW50KGR1cHMpKSB7Ci0JCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbXSB7Z2VuZXJhdG9yTmFtZX07Ci0JCQlmb3IgKEdlbmVyYXRvciBkdXAgOiBkdXBzKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLAotCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuR0VORVJBVE9SX0VRVUlWQUxFTlQsCi0JCQkJCQlwYXJtcywKLQkJCQkJCWR1cCwKLQkJCQkJCXRoaXMuZXh0cmFjdE5hbWVUZXh0UmFuZ2UoZHVwKQotCQkJCQkpCi0JCQkJKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnZhbGlkYXRlR2VuZXJhdG9yc1dpdGhTYW1lTmFtZShnZW5lcmF0b3JOYW1lLCBkdXBzLCBtZXNzYWdlcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlICN2YWxpZGF0ZUdlbmVyYXRvcnNXaXRoU2FtZU5hbWUoU3RyaW5nLCBBcnJheUxpc3QsIExpc3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVRdWVyaWVzV2l0aFNhbWVOYW1lKFN0cmluZyBxdWVyeU5hbWUsIEFycmF5TGlzdDxRdWVyeT4gZHVwcywgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKHRoaXMuYWxsTm9kZXNBcmVFcXVpdmFsZW50KGR1cHMpKSB7Ci0JCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbXSB7cXVlcnlOYW1lfTsKLQkJCWZvciAoUXVlcnkgZHVwIDogZHVwcykgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkxPV19TRVZFUklUWSwKLQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlFVRVJZX0VRVUlWQUxFTlQsCi0JCQkJCQlwYXJtcywKLQkJCQkJCWR1cCwKLQkJCQkJCXRoaXMuZXh0cmFjdE5hbWVUZXh0UmFuZ2UoZHVwKQotCQkJCQkpCi0JCQkJKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnZhbGlkYXRlUXVlcmllc1dpdGhTYW1lTmFtZShxdWVyeU5hbWUsIGR1cHMsIG1lc3NhZ2VzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQlzdXBlci5jcmVhdGVQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5jdXN0b21pemF0aW9uLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpLAotCQkJCXRoaXMubG9nZ2luZy5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKQotCQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCXN1cGVyLmNyZWF0ZVBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQkJdGhpcy5jdXN0b21pemF0aW9uLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSwKLQkJCQl0aGlzLmxvZ2dpbmcuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpCi0JCQkpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc1JlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQkJc3VwZXIuY3JlYXRlUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc1JlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpLAotCQkJCXRoaXMuY3VzdG9taXphdGlvbi5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCQl0aGlzLmxvZ2dpbmcuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSkKLQkJCSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBtZXRhZGF0YSBjb252ZXJzaW9uICoqKioqKioqKioKLQkvLyAqKioqKiBxdWVyaWVzCi0JCi0JLyoqCi0JICogQHNlZSAjY29udmVydEphdmFRdWVyaWVzKEVudGl0eU1hcHBpbmdzLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGhhc0NvbnZlcnRpYmxlSmF2YVF1ZXJpZXMoKSB7Ci0JCXJldHVybiAhIHRoaXMuZ2V0RWNsaXBzZUxpbmtDb252ZXJ0aWJsZUphdmFRdWVyaWVzKCkuaXNFbXB0eSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGhhcyBhbnkgZXF1aXZhbGVudCBKYXZhIGdlbmVyYXRvcnMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55RXF1aXZhbGVudEphdmFRdWVyaWVzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlFcXVpdmFsZW50SmF2YU5vZGVzKHRoaXMuZ2V0QWxsSmF2YVF1ZXJpZXMoKSwgdGhpcy5nZXRNYXBwaW5nRmlsZVF1ZXJpZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYmVjYXVzZSBFY2xpcHNlTGluayBhbGxvd3MKLQkgKiAiZXF1aXZhbGVudCIgcXVlcmllcy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjb252ZXJ0SmF2YVF1ZXJpZXMoRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlPcm1RdWVyeUNvbnRhaW5lciBxdWVyeUNvbnRhaW5lciA9IGVudGl0eU1hcHBpbmdzLmdldFF1ZXJ5Q29udGFpbmVyKCk7Ci0JCUhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8SmF2YVF1ZXJ5Pj4gY29udmVydGlibGVKYXZhUXVlcmllcyA9IHRoaXMuZ2V0RWNsaXBzZUxpbmtDb252ZXJ0aWJsZUphdmFRdWVyaWVzKCk7Ci0JCWludCB3b3JrID0gdGhpcy5jYWxjdWxhdGVDdW11bGF0aXZlU2l6ZShjb252ZXJ0aWJsZUphdmFRdWVyaWVzLnZhbHVlcygpKTsKLQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBKcHRDb3JlTWVzc2FnZXMuSkFWQV9NRVRBREFUQV9DT05WRVJTSU9OX0lOX1BST0dSRVNTLCB3b3JrKTsKLQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBBcnJheUxpc3Q8SmF2YVF1ZXJ5Pj4gZW50cnkgOiBjb252ZXJ0aWJsZUphdmFRdWVyaWVzLmVudHJ5U2V0KCkpIHsKLQkJCXRoaXMuY29udmVydEphdmFRdWVyaWVzV2l0aFNhbWVOYW1lKHF1ZXJ5Q29udGFpbmVyLCBlbnRyeSwgc20ubmV3Q2hpbGQoZW50cnkuZ2V0VmFsdWUoKS5zaXplKCkpKTsKLQkJfQotCQlzbS5zZXRUYXNrTmFtZShKcHRDb3JlTWVzc2FnZXMuSkFWQV9NRVRBREFUQV9DT05WRVJTSU9OX0NPTVBMRVRFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb252ZXJ0SmF2YVF1ZXJpZXNXaXRoU2FtZU5hbWUoT3JtUXVlcnlDb250YWluZXIgcXVlcnlDb250YWluZXIsIE1hcC5FbnRyeTxTdHJpbmcsIEFycmF5TGlzdDxKYXZhUXVlcnk+PiBlbnRyeSwgU3ViTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKEpwdENvcmVNZXNzYWdlcy5KQVZBX01FVEFEQVRBX0NPTlZFUlNJT05fQ0FOQ0VMRUQpOwotCQl9Ci0JCW1vbml0b3Iuc2V0VGFza05hbWUoTkxTLmJpbmQoSnB0Q29yZU1lc3NhZ2VzLkpBVkFfTUVUQURBVEFfQ09OVkVSU0lPTl9DT05WRVJUX1FVRVJZLCBlbnRyeS5nZXRLZXkoKSkpOwotCi0JCUFycmF5TGlzdDxKYXZhUXVlcnk+IGphdmFRdWVyaWVzV2l0aFNhbWVOYW1lID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJSmF2YVF1ZXJ5IGZpcnN0ID0gamF2YVF1ZXJpZXNXaXRoU2FtZU5hbWUuZ2V0KDApOwotCQlmaXJzdC5jb252ZXJ0VG8ocXVlcnlDb250YWluZXIpOwotCQlmaXJzdC5kZWxldGUoKTsgIC8vIGRlbGV0ZSBhbnkgY29udmVydGVkIHF1ZXJpZXMKLQkJbW9uaXRvci53b3JrZWQoMSk7Ci0KLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBqYXZhUXVlcmllc1dpdGhTYW1lTmFtZS5zaXplKCk7IGkrKykgeyAgLy8gTkI6IHN0YXJ0IHdpdGggMSEKLQkJCWphdmFRdWVyaWVzV2l0aFNhbWVOYW1lLmdldChpKS5kZWxldGUoKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgI2V4dHJhY3RFY2xpcHNlTGlua0NvbnZlcnRpYmxlSmF2YU5vZGVzKEl0ZXJhYmxlLCBJdGVyYWJsZSkKLQkgKi8KLQlwcm90ZWN0ZWQgSGFzaE1hcDxTdHJpbmcsIEFycmF5TGlzdDxKYXZhUXVlcnk+PiBnZXRFY2xpcHNlTGlua0NvbnZlcnRpYmxlSmF2YVF1ZXJpZXMoKSB7Ci0JCXJldHVybiB0aGlzLmV4dHJhY3RFY2xpcHNlTGlua0NvbnZlcnRpYmxlSmF2YU5vZGVzKHRoaXMuZ2V0QWxsSmF2YVF1ZXJpZXMoKSwgdGhpcy5nZXRNYXBwaW5nRmlsZVF1ZXJpZXMoKSk7Ci0JfQotCi0JLy8gKioqKiogZ2VuZXJhdG9ycwotCQotCS8qKgotCSAqIEBzZWUgI2NvbnZlcnRKYXZhR2VuZXJhdG9ycyhFbnRpdHlNYXBwaW5ncywgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBoYXNDb252ZXJ0aWJsZUphdmFHZW5lcmF0b3JzKCkgewotCQlyZXR1cm4gISB0aGlzLmdldEVjbGlwc2VMaW5rQ29udmVydGlibGVKYXZhR2VuZXJhdG9ycygpLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcGVyc2lzdGVuY2UgdW5pdCBoYXMgYW55IGVxdWl2YWxlbnQgSmF2YSBnZW5lcmF0b3JzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueUVxdWl2YWxlbnRKYXZhR2VuZXJhdG9ycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55RXF1aXZhbGVudEphdmFOb2Rlcyh0aGlzLmdldEFsbEphdmFHZW5lcmF0b3JzKCksIHRoaXMuZ2V0TWFwcGluZ0ZpbGVHZW5lcmF0b3JzKCkpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGJlY2F1c2UgRWNsaXBzZUxpbmsgYWxsb3dzCi0JICogImVxdWl2YWxlbnQiIGdlbmVyYXRvcnMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY29udmVydEphdmFHZW5lcmF0b3JzKEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSGFzaE1hcDxTdHJpbmcsIEFycmF5TGlzdDxKYXZhR2VuZXJhdG9yPj4gY29udmVydGlibGVKYXZhR2VuZXJhdG9ycyA9IHRoaXMuZ2V0RWNsaXBzZUxpbmtDb252ZXJ0aWJsZUphdmFHZW5lcmF0b3JzKCk7Ci0JCWludCB3b3JrID0gdGhpcy5jYWxjdWxhdGVDdW11bGF0aXZlU2l6ZShjb252ZXJ0aWJsZUphdmFHZW5lcmF0b3JzLnZhbHVlcygpKTsKLQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBKcHRDb3JlTWVzc2FnZXMuSkFWQV9NRVRBREFUQV9DT05WRVJTSU9OX0lOX1BST0dSRVNTLCB3b3JrKTsKLQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBBcnJheUxpc3Q8SmF2YUdlbmVyYXRvcj4+IGVudHJ5IDogY29udmVydGlibGVKYXZhR2VuZXJhdG9ycy5lbnRyeVNldCgpKSB7Ci0JCQl0aGlzLmNvbnZlcnRKYXZhR2VuZXJhdG9yc1dpdGhTYW1lTmFtZShlbnRpdHlNYXBwaW5ncywgZW50cnksIHNtLm5ld0NoaWxkKGVudHJ5LmdldFZhbHVlKCkuc2l6ZSgpKSk7Ci0JCX0KLQkJc20uc2V0VGFza05hbWUoSnB0Q29yZU1lc3NhZ2VzLkpBVkFfTUVUQURBVEFfQ09OVkVSU0lPTl9DT01QTEVURSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29udmVydEphdmFHZW5lcmF0b3JzV2l0aFNhbWVOYW1lKEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzLCBNYXAuRW50cnk8U3RyaW5nLCBBcnJheUxpc3Q8SmF2YUdlbmVyYXRvcj4+IGVudHJ5LCBTdWJNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oSnB0Q29yZU1lc3NhZ2VzLkpBVkFfTUVUQURBVEFfQ09OVkVSU0lPTl9DQU5DRUxFRCk7Ci0JCX0KLQkJbW9uaXRvci5zZXRUYXNrTmFtZShOTFMuYmluZChKcHRDb3JlTWVzc2FnZXMuSkFWQV9NRVRBREFUQV9DT05WRVJTSU9OX0NPTlZFUlRfR0VORVJBVE9SLCBlbnRyeS5nZXRLZXkoKSkpOwotCi0JCUFycmF5TGlzdDxKYXZhR2VuZXJhdG9yPiBqYXZhR2VuZXJhdG9yc1dpdGhTYW1lTmFtZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCUphdmFHZW5lcmF0b3IgZmlyc3QgPSBqYXZhR2VuZXJhdG9yc1dpdGhTYW1lTmFtZS5nZXQoMCk7Ci0JCWZpcnN0LmNvbnZlcnRUbyhlbnRpdHlNYXBwaW5ncyk7Ci0JCWZpcnN0LmRlbGV0ZSgpOyAgLy8gZGVsZXRlIGFueSBjb252ZXJ0ZWQgZ2VuZXJhdG9ycwotCQltb25pdG9yLndvcmtlZCgxKTsKLQotCQlmb3IgKGludCBpID0gMTsgaSA8IGphdmFHZW5lcmF0b3JzV2l0aFNhbWVOYW1lLnNpemUoKTsgaSsrKSB7ICAvLyBOQjogc3RhcnQgd2l0aCAxIQotCQkJamF2YUdlbmVyYXRvcnNXaXRoU2FtZU5hbWUuZ2V0KGkpLmRlbGV0ZSgpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSAjZXh0cmFjdEVjbGlwc2VMaW5rQ29udmVydGlibGVKYXZhTm9kZXMoSXRlcmFibGUsIEl0ZXJhYmxlKQotCSAqLwotCXByb3RlY3RlZCBIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PEphdmFHZW5lcmF0b3I+PiBnZXRFY2xpcHNlTGlua0NvbnZlcnRpYmxlSmF2YUdlbmVyYXRvcnMoKSB7Ci0JCXJldHVybiB0aGlzLmV4dHJhY3RFY2xpcHNlTGlua0NvbnZlcnRpYmxlSmF2YU5vZGVzKHRoaXMuZ2V0QWxsSmF2YUdlbmVyYXRvcnMoKSwgdGhpcy5nZXRNYXBwaW5nRmlsZUdlbmVyYXRvcnMoKSk7Ci0JfQotCi0JLy8gKioqKiogY29udmVydGVycwotCQotCS8qKgotCSAqIEBzZWUgI2NvbnZlcnRKYXZhQ29udmVydGVycyhFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NvbnZlcnRpYmxlSmF2YUNvbnZlcnRlcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuZ2V0RWNsaXBzZUxpbmtDb252ZXJ0aWJsZUphdmFDb252ZXJ0ZXJzKCkuaXNFbXB0eSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGhhcyBhbnkgZXF1aXZhbGVudCBKYXZhIGdlbmVyYXRvcnMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55RXF1aXZhbGVudEphdmFDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlFcXVpdmFsZW50SmF2YU5vZGVzKHRoaXMuZ2V0QWxsSmF2YUNvbnZlcnRlcnMoKSwgdGhpcy5nZXRNYXBwaW5nRmlsZUNvbnZlcnRlcnMoKSk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYmVjYXVzZSBFY2xpcHNlTGluayBhbGxvd3MKLQkgKiAiZXF1aXZhbGVudCIgY29udmVydGVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb252ZXJ0SmF2YUNvbnZlcnRlcnMoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnZlcnRlckNvbnRhaW5lciA9IGVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcjw/Pj4+IGNvbnZlcnRpYmxlSmF2YUNvbnZlcnRlcnMgPSB0aGlzLmdldEVjbGlwc2VMaW5rQ29udmVydGlibGVKYXZhQ29udmVydGVycygpOwotCQlpbnQgd29yayA9IHRoaXMuY2FsY3VsYXRlQ3VtdWxhdGl2ZVNpemUoY29udmVydGlibGVKYXZhQ29udmVydGVycy52YWx1ZXMoKSk7Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgSnB0Q29yZU1lc3NhZ2VzLkpBVkFfTUVUQURBVEFfQ09OVkVSU0lPTl9JTl9QUk9HUkVTUywgd29yayk7Ci0JCWZvciAoTWFwLkVudHJ5PFN0cmluZywgQXJyYXlMaXN0PEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcjw/Pj4+IGVudHJ5IDogY29udmVydGlibGVKYXZhQ29udmVydGVycy5lbnRyeVNldCgpKSB7Ci0JCQl0aGlzLmNvbnZlcnRKYXZhQ29udmVydGVyc1dpdGhTYW1lTmFtZShvcm1Db252ZXJ0ZXJDb250YWluZXIsIGVudHJ5LCBzbS5uZXdDaGlsZChlbnRyeS5nZXRWYWx1ZSgpLnNpemUoKSkpOwotCQl9Ci0JCXNtLnNldFRhc2tOYW1lKEpwdENvcmVNZXNzYWdlcy5KQVZBX01FVEFEQVRBX0NPTlZFUlNJT05fQ09NUExFVEUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnZlcnRKYXZhQ29udmVydGVyc1dpdGhTYW1lTmFtZShPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db252ZXJ0ZXJDb250YWluZXIsIE1hcC5FbnRyeTxTdHJpbmcsIEFycmF5TGlzdDxKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXI8Pz4+PiBlbnRyeSwgU3ViTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKEpwdENvcmVNZXNzYWdlcy5KQVZBX01FVEFEQVRBX0NPTlZFUlNJT05fQ0FOQ0VMRUQpOwotCQl9Ci0JCW1vbml0b3Iuc2V0VGFza05hbWUoTkxTLmJpbmQoSnB0SnBhRWNsaXBzZUxpbmtDb3JlTWVzc2FnZXMuSkFWQV9NRVRBREFUQV9DT05WRVJTSU9OX0NPTlZFUlRfQ09OVkVSVEVSLCBlbnRyeS5nZXRLZXkoKSkpOwotCi0JCUFycmF5TGlzdDxKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXI8Pz4+IGphdmFDb252ZXJ0ZXJzV2l0aFNhbWVOYW1lID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyPD8+IGZpcnN0ID0gamF2YUNvbnZlcnRlcnNXaXRoU2FtZU5hbWUuZ2V0KDApOwotCQlmaXJzdC5jb252ZXJ0VG8ob3JtQ29udmVydGVyQ29udGFpbmVyKTsKLQkJZmlyc3QuZGVsZXRlKCk7ICAvLyBkZWxldGUgYW55IGNvbnZlcnRlZCBnZW5lcmF0b3JzCi0JCW1vbml0b3Iud29ya2VkKDEpOwotCi0JCWZvciAoaW50IGkgPSAxOyBpIDwgamF2YUNvbnZlcnRlcnNXaXRoU2FtZU5hbWUuc2l6ZSgpOyBpKyspIHsgIC8vIE5COiBzdGFydCB3aXRoIDEhCi0JCQlqYXZhQ29udmVydGVyc1dpdGhTYW1lTmFtZS5nZXQoaSkuZGVsZXRlKCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlICNleHRyYWN0RWNsaXBzZUxpbmtDb252ZXJ0aWJsZUphdmFOb2RlcyhJdGVyYWJsZSwgSXRlcmFibGUpCi0JICovCi0JcHJvdGVjdGVkIEhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8SmF2YUVjbGlwc2VMaW5rQ29udmVydGVyPD8+Pj4gZ2V0RWNsaXBzZUxpbmtDb252ZXJ0aWJsZUphdmFDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gdGhpcy5leHRyYWN0RWNsaXBzZUxpbmtDb252ZXJ0aWJsZUphdmFOb2Rlcyh0aGlzLmdldEFsbEphdmFDb252ZXJ0ZXJzKCksIHRoaXMuZ2V0TWFwcGluZ0ZpbGVDb252ZXJ0ZXJzKCkpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgY2FsY3VsYXRlQ3VtdWxhdGl2ZVNpemUoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29sbGVjdGlvbjw/Pj4gY29sbGVjdGlvbnMpIHsKLQkJaW50IGN1bXVsYXRpdmVTaXplID0gMDsKLQkJZm9yIChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24gOiBjb2xsZWN0aW9ucykgewotCQkJY3VtdWxhdGl2ZVNpemUgKz0gY29sbGVjdGlvbi5zaXplKCk7Ci0JCX0KLQkJcmV0dXJuIGN1bXVsYXRpdmVTaXplOwotCX0KLQotCXByb3RlY3RlZCA8TiBleHRlbmRzIEpwYU5hbWVkQ29udGV4dE5vZGU+IGJvb2xlYW4gaGFzQW55RXF1aXZhbGVudEphdmFOb2RlcyhJdGVyYWJsZTxOPiBhbGxKYXZhTm9kZXMsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBKcGFOYW1lZENvbnRleHROb2RlPiBtYXBwaW5nRmlsZU5vZGVzKSB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8Tj4+IGNvbnZlcnRpYmxlSmF2YU5vZGVzID0gdGhpcy5leHRyYWN0RWNsaXBzZUxpbmtDb252ZXJ0aWJsZUphdmFOb2RlcyhhbGxKYXZhTm9kZXMsIG1hcHBpbmdGaWxlTm9kZXMpOwotCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEFycmF5TGlzdDxOPj4gZW50cnkgOiBjb252ZXJ0aWJsZUphdmFOb2Rlcy5lbnRyeVNldCgpKSB7Ci0JCQlpZiAoZW50cnkuZ2V0VmFsdWUoKS5zaXplKCkgPiAxKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSBub2RlcyB0aGF0IGFyZSBuZWl0aGVyIG92ZXJyaWRkZW4gbm9yIGR1cGxpY2F0ZWQKLQkgKiAoYnkgZGVmYXVsdCBhbnkgSmF2YSBub2RlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYXJlICJkdXBsaWNhdGVzIik7Ci0JICogYnV0LCBpbiBFY2xpcHNlTGluayB3ZSByZXR1cm4gYW55ICJlcXVpdmFsZW50IiBub2RlcyBhbHNvLgotCSAqLwotCXByb3RlY3RlZCA8TiBleHRlbmRzIEpwYU5hbWVkQ29udGV4dE5vZGU+IEhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8Tj4+IGV4dHJhY3RFY2xpcHNlTGlua0NvbnZlcnRpYmxlSmF2YU5vZGVzKEl0ZXJhYmxlPE4+IGFsbEphdmFOb2RlcywgSXRlcmFibGU8PyBleHRlbmRzIEpwYU5hbWVkQ29udGV4dE5vZGU+IG1hcHBpbmdGaWxlTm9kZXMpIHsKLQkJSGFzaE1hcDxTdHJpbmcsIEFycmF5TGlzdDxOPj4gY29udmVydGlibGVOb2RlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PE4+PigpOwotCi0JCUhhc2hTZXQ8U3RyaW5nPiBtYXBwaW5nRmlsZU5vZGVOYW1lcyA9IHRoaXMuY29udmVydFRvTmFtZXMoQ29sbGVjdGlvblRvb2xzLmxpc3QobWFwcGluZ0ZpbGVOb2RlcykpOwotCQlIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PE4+PiBhbGxKYXZhTm9kZXNCeU5hbWUgPSB0aGlzLm1hcEJ5TmFtZShhbGxKYXZhTm9kZXMpOwotCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEFycmF5TGlzdDxOPj4gZW50cnkgOiBhbGxKYXZhTm9kZXNCeU5hbWUuZW50cnlTZXQoKSkgewotCQkJU3RyaW5nIGphdmFOb2RlTmFtZSA9IGVudHJ5LmdldEtleSgpOwotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoamF2YU5vZGVOYW1lKSkgewotCQkJCWNvbnRpbnVlOyAgLy8gaWdub3JlIGFueSBub2RlcyB3aXRoIGFuIGVtcHR5IG5hbWUoPykKLQkJCX0KLQkJCWlmIChtYXBwaW5nRmlsZU5vZGVOYW1lcy5jb250YWlucyhqYXZhTm9kZU5hbWUpKSB7Ci0JCQkJY29udGludWU7ICAvLyBpZ25vcmUgYW55IEphdmEgbm9kZXMgb3ZlcnJpZGRlbiBpbiB0aGUgbWFwcGluZyBmaWxlCi0JCQl9Ci0JCQlBcnJheUxpc3Q8Tj4gamF2YU5vZGVzV2l0aFNhbWVOYW1lID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWlmICgoamF2YU5vZGVzV2l0aFNhbWVOYW1lLnNpemUoKSA9PSAxKSB8fCB0aGlzLmFsbE5vZGVzQXJlRXF1aXZhbGVudChqYXZhTm9kZXNXaXRoU2FtZU5hbWUpKSB7Ci0JCQkJY29udmVydGlibGVOb2Rlcy5wdXQoamF2YU5vZGVOYW1lLCBqYXZhTm9kZXNXaXRoU2FtZU5hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBpZ25vcmUgbXVsdGlwbGUgSmF2YSBub2RlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYnV0IHRoYXQgYXJlIG5vdCBhbGwgImVxdWl2YWxlbnQiCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY29udmVydGlibGVOb2RlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTIxNDAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkgZXh0ZW5kcyBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeQotewkKLQotCVBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgYnVpbGRMb2dnaW5nKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZmZlMjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9FeGNsdXNpdmVDb25uZWN0aW9uTW9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxFbnVtVmFsdWU7Ci0KLS8qKgotICogIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlCi0gKi8KLXB1YmxpYyBlbnVtIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlIGltcGxlbWVudHMgUGVyc2lzdGVuY2VYbWxFbnVtVmFsdWUgewotCWFsd2F5cygiQWx3YXlzIiksIC8vJE5PTi1OTFMtMSQKLQlpc29sYXRlZCgiSXNvbGF0ZWQiKSwgLy8kTk9OLU5MUy0xJAotCXRyYW5zYWN0aW9uYWwoIlRyYW5zYWN0aW9uYWwiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvcGVydHlWYWx1ZTsKLQotCUV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlKFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0JCXRoaXMucHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN0cmluZyB1c2VkIGFzIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpbiB0aGUgcGVyc2lzdGVuY2UueG1sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5wcm9wZXJ0eVZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvRmx1c2hDbGVhckNhY2hlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0ZsdXNoQ2xlYXJDYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzVhMGRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvRmx1c2hDbGVhckNhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbEVudW1WYWx1ZTsKLQotLyoqCi0gKiAgRmx1c2hDbGVhckNhY2hlCi0gKi8KLXB1YmxpYyBlbnVtIEZsdXNoQ2xlYXJDYWNoZSBpbXBsZW1lbnRzIFBlcnNpc3RlbmNlWG1sRW51bVZhbHVlIHsKLQlkcm9wKCJEcm9wIiksIC8vJE5PTi1OTFMtMSQKLQlkcm9wX2ludmFsaWRhdGUoIkRyb3BJbnZhbGlkYXRlIiksIC8vJE5PTi1OTFMtMSQKLQltZXJnZSgiTWVyZ2UiKTsgIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHByb3BlcnR5VmFsdWU7Ci0KLQlGbHVzaENsZWFyQ2FjaGUoU3RyaW5nIHByb3BlcnR5VmFsdWUpIHsKLQkJdGhpcy5wcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3RyaW5nIHVzZWQgYXMgdGhlIHByb3BlcnR5IHZhbHVlIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnByb3BlcnR5VmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmFsUHJvcGVydGllcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmFsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTUxNmE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJhbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci0KLS8qKgotICogIEdlbmVyYWxQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR2VuZXJhbFByb3BlcnRpZXMgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi17Ci0KLQlCb29sZWFuIGdldERlZmF1bHRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oKTsKLQlCb29sZWFuIGdldEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpOwotCXZvaWQgc2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKEJvb2xlYW4gbmV3RXhjbHVkZUVjbGlwc2VsaW5rT3JtKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVURFX0VDTElQU0VMSU5LX09STV9QUk9QRVJUWSA9ICJleGNsdWRlRWNsaXBzZWxpbmtPcm0iOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19FWENMVURFX0VDTElQU0VMSU5LX09STSA9ICJlY2xpcHNlbGluay5leGNsdWRlLWVjbGlwc2VsaW5rLW9ybSI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9FWENMVURFX0VDTElQU0VMSU5LX09STSA9IEJvb2xlYW4uRkFMU0U7Ci0JCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9Mb2dnZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZmM4MzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxFbnVtVmFsdWU7Ci0KLS8qKgotICogTG9nZ2VyCi0gKi8KLXB1YmxpYyBlbnVtIExvZ2dlciBpbXBsZW1lbnRzIFBlcnNpc3RlbmNlWG1sRW51bVZhbHVlIHsKLQlkZWZhdWx0X2xvZ2dlcigiRGVmYXVsdExvZ2dlciIsICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5sb2dnaW5nLkRlZmF1bHRTZXNzaW9uTG9nIiksICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlqYXZhX2xvZ2dlcigiSmF2YUxvZ2dlciIsICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5sb2dnaW5nLkphdmFMb2ciKSwgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXNlcnZlcl9sb2dnZXIoIlNlcnZlckxvZ2dlciIsICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5zZXJ2ZXIuU2VydmVyTG9nIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvcGVydHlWYWx1ZTsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGNsYXNzTmFtZTsKLQotCUxvZ2dlcihTdHJpbmcgcHJvcGVydHlWYWx1ZSwgU3RyaW5nIGNsYXNzTmFtZSkgewotCQl0aGlzLnByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlOwotCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnByb3BlcnR5VmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmNsYXNzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIExvZ2dlciB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBsaXRlcmFsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTG9nZ2VyIGdldExvZ2dlckZvcihTdHJpbmcgbGl0ZXJhbCkgewotCQkKLQkJZm9yKCBMb2dnZXIgbG9nZ2VyIDogTG9nZ2VyLnZhbHVlcygpKSB7Ci0JCQlpZihsb2dnZXIudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gbG9nZ2VyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvZ2dlckNsYXNzTmFtZShTdHJpbmcgbG9nZ2VyVmFsdWUpIHsKLQkJZm9yIChMb2dnZXIgbG9nZ2VyIDogdmFsdWVzKCkpIHsKLQkJCWlmIChsb2dnZXIuZ2V0UHJvcGVydHlWYWx1ZSgpID09IGxvZ2dlclZhbHVlKSB7Ci0JCQkJcmV0dXJuIGxvZ2dlci5nZXRDbGFzc05hbWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbG9nZ2VyVmFsdWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvTG9nZ2luZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9Mb2dnaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMzRmMzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9Mb2dnaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci0KLS8qKgotICogTG9nZ2luZwotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvZ2dpbmcgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi17Ci0JTG9nZ2luZ0xldmVsIGdldERlZmF1bHRMZXZlbCgpOwotCUxvZ2dpbmdMZXZlbCBnZXRMZXZlbCgpOwotCXZvaWQgc2V0TGV2ZWwoTG9nZ2luZ0xldmVsIGxldmVsKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBMRVZFTF9QUk9QRVJUWSA9ICJsZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0xFVkVMID0gImVjbGlwc2VsaW5rLmxvZ2dpbmcubGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgREVGQVVMVF9MRVZFTCA9IExvZ2dpbmdMZXZlbC5pbmZvOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdFRpbWVzdGFtcCgpOwotCUJvb2xlYW4gZ2V0VGltZXN0YW1wKCk7Ci0Jdm9pZCBzZXRUaW1lc3RhbXAoQm9vbGVhbiB0aW1lc3RhbXApOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVTVEFNUF9QUk9QRVJUWSA9ICJ0aW1lc3RhbXAiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19USU1FU1RBTVAgPSAiZWNsaXBzZWxpbmsubG9nZ2luZy50aW1lc3RhbXAiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfVElNRVNUQU1QID0gQm9vbGVhbi5UUlVFOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdFRocmVhZCgpOwotCUJvb2xlYW4gZ2V0VGhyZWFkKCk7Ci0Jdm9pZCBzZXRUaHJlYWQoQm9vbGVhbiB0aHJlYWQpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRIUkVBRF9QUk9QRVJUWSA9ICJ0aHJlYWQiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19USFJFQUQgPSAiZWNsaXBzZWxpbmsubG9nZ2luZy50aHJlYWQiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfVEhSRUFEID0gQm9vbGVhbi5UUlVFOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdFNlc3Npb24oKTsKLQlCb29sZWFuIGdldFNlc3Npb24oKTsKLQl2b2lkIHNldFNlc3Npb24oQm9vbGVhbiBzZXNzaW9uKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX1BST1BFUlRZID0gInNlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19TRVNTSU9OID0gImVjbGlwc2VsaW5rLmxvZ2dpbmcuc2Vzc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9TRVNTSU9OID0gQm9vbGVhbi5UUlVFOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdEV4Y2VwdGlvbnMoKTsKLQlCb29sZWFuIGdldEV4Y2VwdGlvbnMoKTsKLQl2b2lkIHNldEV4Y2VwdGlvbnMoQm9vbGVhbiBleGNlcHRpb25zKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05TX1BST1BFUlRZID0gImV4Y2VwdGlvbnMiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19FWENFUFRJT05TID0gImVjbGlwc2VsaW5rLmxvZ2dpbmcuZXhjZXB0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9FWENFUFRJT05TID0gQm9vbGVhbi5GQUxTRTsKLQkJCi0JU3RyaW5nIGdldERlZmF1bHRMb2dGaWxlTG9jYXRpb24oKTsKLQlTdHJpbmcgZ2V0TG9nRmlsZUxvY2F0aW9uKCk7Ci0Jdm9pZCBzZXRMb2dGaWxlTG9jYXRpb24oU3RyaW5nIG5ld0xvZ0ZpbGVMb2NhdGlvbik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0ZJTEVfTE9DQVRJT05fUFJPUEVSVFkgPSAibG9nRmlsZUxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfTE9HX0ZJTEVfTE9DQVRJT04gPSAiZWNsaXBzZWxpbmsubG9nZ2luZy5maWxlIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTE9HX0ZJTEVfTE9DQVRJT04gPSBudWxsOwkJLy8gTm8gRGVmYXVsdAotCQkKLQlTdHJpbmcgZ2V0RGVmYXVsdExvZ2dlcigpOwotCVN0cmluZyBnZXRMb2dnZXIoKTsKLQl2b2lkIHNldExvZ2dlcihTdHJpbmcgbmV3TG9nZ2VyKTsKLQl2b2lkIHNldExvZ2dlcihMb2dnZXIgbmV3TG9nZ2VyKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBMT0dHRVJfUFJPUEVSVFkgPSAibG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfTE9HR0VSID0gImVjbGlwc2VsaW5rLmxvZ2dpbmcubG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTE9HR0VSID0gTG9nZ2VyLmRlZmF1bHRfbG9nZ2VyLmdldFByb3BlcnR5VmFsdWUoKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZ1tdIFJFU0VSVkVEX0xPR0dFUl9OQU1FUyA9IHtMb2dnZXIuZGVmYXVsdF9sb2dnZXIuZ2V0UHJvcGVydHlWYWx1ZSgpLCBMb2dnZXIuamF2YV9sb2dnZXIuZ2V0UHJvcGVydHlWYWx1ZSgpLCBMb2dnZXIuc2VydmVyX2xvZ2dlci5nZXRQcm9wZXJ0eVZhbHVlKCl9OwotCQlTdHJpbmcgRUNMSVBTRUxJTktfTE9HR0VSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubG9nZ2luZy5TZXNzaW9uTG9nIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9Mb2dnaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0xvZ2dpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3M2EwOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0xvZ2dpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotLyoqCi0gKiAgTG9nZ2luZzJfMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvZ2dpbmcyXzAgZXh0ZW5kcyBMb2dnaW5nCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfUFJFRklYXyA9ICJlY2xpcHNlbGluay5sb2dnaW5nLmxldmVsLiI7IC8vJE5PTi1OTFMtMSQKLQotCUJvb2xlYW4gZ2V0RGVmYXVsdENvbm5lY3Rpb24oKTsKLQlCb29sZWFuIGdldENvbm5lY3Rpb24oKTsKLQl2b2lkIHNldENvbm5lY3Rpb24oQm9vbGVhbiBjb25uZWN0aW9uKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUSU9OX1BST1BFUlRZID0gImNvbm5lY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19DT05ORUNUSU9OID0gImVjbGlwc2VsaW5rLmxvZ2dpbmcuY29ubmVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9DT05ORUNUSU9OID0gQm9vbGVhbi5UUlVFOwotCQkKLQlMb2dnaW5nTGV2ZWwgZ2V0Q2F0ZWdvcmllc0RlZmF1bHRMZXZlbCgpOwotCUxvZ2dpbmdMZXZlbCBnZXRMZXZlbChTdHJpbmcgY2F0ZWdvcnkpOwotCXZvaWQgc2V0TGV2ZWwoU3RyaW5nIGNhdGVnb3J5LCBMb2dnaW5nTGV2ZWwgbGV2ZWwpOwotCXZvaWQgc2V0RGVmYXVsdExldmVsKExvZ2dpbmdMZXZlbCBsZXZlbCk7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SSUVTX0RFRkFVTFRfTE9HR0lOR19QUk9QRVJUWSA9ICJjYXRlZ29yaWVzRGVmYXVsdExvZ2dpbmdMZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNRTF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZID0gInNxbExvZ2dpbmdMZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19TUUxfQ0FURUdPUllfTE9HR0lOR19MRVZFTCA9IENBVEVHT1JZX1BSRUZJWF8gKyAic3FsIjsgLy8kTk9OLU5MUy0xJAotCQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TQUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkgPSAidHJhbnNhY3Rpb25Mb2dnaW5nTGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfVFJBTlNBQ1RJT05fQ0FURUdPUllfTE9HR0lOR19MRVZFTCA9IENBVEVHT1JZX1BSRUZJWF8gKyAidHJhbnNhY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSA9ICJldmVudExvZ2dpbmdMZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19FVkVOVF9DQVRFR09SWV9MT0dHSU5HX0xFVkVMID0gQ0FURUdPUllfUFJFRklYXyArICJldmVudCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkgPSAiY29ubmVjdGlvbkxvZ2dpbmdMZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19DT05ORUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwgPSBDQVRFR09SWV9QUkVGSVhfICsgImNvbm5lY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSA9ICJxdWVyeUxvZ2dpbmdMZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19RVUVSWV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMID0gQ0FURUdPUllfUFJFRklYXyArICJxdWVyeSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZID0gImNhY2hlTG9nZ2luZ0xldmVsIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0NBQ0hFX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwgPSBDQVRFR09SWV9QUkVGSVhfICsgImNhY2hlIjsgLy8kTk9OLU5MUy0xJAotCQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BBR0FUSU9OX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkgPSAicHJvcGFnYXRpb25Mb2dnaW5nTGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUFJPUEFHQVRJT05fQ0FURUdPUllfTE9HR0lOR19MRVZFTCA9IENBVEVHT1JZX1BSRUZJWF8gKyAicHJvcGFnYXRpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VRVUVOQ0lOR19DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZID0gInNlcXVlbmNpbmdMb2dnaW5nTGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfU0VRVUVOQ0lOR19DQVRFR09SWV9MT0dHSU5HX0xFVkVMID0gQ0FURUdPUllfUFJFRklYXyArICJzZXF1ZW5jaW5nIjsgLy8kTk9OLU5MUy0xJAotCQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZID0gImVqYkxvZ2dpbmdMZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19FSkJfQ0FURUdPUllfTE9HR0lOR19MRVZFTCA9IENBVEVHT1JZX1BSRUZJWF8gKyAiZWpiIjsgLy8kTk9OLU5MUy0xJAotCQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERNU19DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZID0gImRtc0xvZ2dpbmdMZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19ETVNfQ0FURUdPUllfTE9HR0lOR19MRVZFTCA9IENBVEVHT1JZX1BSRUZJWF8gKyAiZG1zIjsgLy8kTk9OLU5MUy0xJAotCQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9PUl9NRVRBREFUQV9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZID0gImVqYl9vcl9tZXRhZGF0YUxvZ2dpbmdMZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19FSkJfT1JfTUVUQURBVEFfQ0FURUdPUllfTE9HR0lOR19MRVZFTCA9IENBVEVHT1JZX1BSRUZJWF8gKyAiZWpiX29yX21ldGFkYXRhIjsgLy8kTk9OLU5MUy0xJAotCQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFNT0RFTF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZID0gImpwYV9tZXRhbW9kZWxMb2dnaW5nTGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfTUVUQU1PREVMX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwgPSBDQVRFR09SWV9QUkVGSVhfICsgImpwYV9tZXRhbW9kZWwiOyAvLyROT04tTkxTLTEkCi0KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWRVJfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSA9ICJ3ZWF2ZXJMb2dnaW5nTGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfV0VBVkVSX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwgPSBDQVRFR09SWV9QUkVGSVhfICsgIndlYXZlciI7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSA9ICJwcm9wZXJ0aWVzTG9nZ2luZ0xldmVsIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1BST1BFUlRJRVNfQ0FURUdPUllfTE9HR0lOR19MRVZFTCA9IENBVEVHT1JZX1BSRUZJWF8gKyAicHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZID0gInNlcnZlckxvZ2dpbmdMZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19TRVJWRVJfQ0FURUdPUllfTE9HR0lOR19MRVZFTCA9IENBVEVHT1JZX1BSRUZJWF8gKyAic2VydmVyIjsgLy8kTk9OLU5MUy0xJAotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9Mb2dnaW5nTGV2ZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvTG9nZ2luZ0xldmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMDI4ZjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9Mb2dnaW5nTGV2ZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxFbnVtVmFsdWU7Ci0KLS8qKgotICogIExvZ2dpbmdMZXZlbAotICovCi1wdWJsaWMgZW51bSBMb2dnaW5nTGV2ZWwgaW1wbGVtZW50cyBQZXJzaXN0ZW5jZVhtbEVudW1WYWx1ZSB7Ci0Jb2ZmKCJPRkYiKSwgIC8vJE5PTi1OTFMtMSQKLQlzZXZlcmUoIlNFVkVSRSIpLCAgLy8kTk9OLU5MUy0xJAotCXdhcm5pbmcoIldBUk5JTkciKSwgIC8vJE5PTi1OTFMtMSQKLQlpbmZvKCJJTkZPIiksICAvLyROT04tTkxTLTEkCi0JY29uZmlnKCJDT05GSUciKSwgIC8vJE5PTi1OTFMtMSQKLQlmaW5lKCJGSU5FIiksICAvLyROT04tTkxTLTEkCi0JZmluZXIoIkZJTkVSIiksIC8vJE5PTi1OTFMtMSQKLQlmaW5lc3QoIkZJTkVTVCIpLCAvLyROT04tTkxTLTEkCi0JYWxsKCJBTEwiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRWNsaXBzZUxpbmsgcHJvcGVydHkgdmFsdWUKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBwcm9wZXJ0eVZhbHVlOwotCi0JTG9nZ2luZ0xldmVsKFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0JCXRoaXMucHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN0cmluZyB1c2VkIGFzIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpbiB0aGUgcGVyc2lzdGVuY2UueG1sCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5wcm9wZXJ0eVZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvT3B0aW9ucy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9PcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMGFjZGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9PcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotCi0vKioKLSAqICBTZXNzaW9uIE9wdGlvbnMKLSAqLwotcHVibGljIGludGVyZmFjZSBPcHRpb25zIGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotewotCVN0cmluZyBnZXREZWZhdWx0U2Vzc2lvbk5hbWUoKTsKLQlTdHJpbmcgZ2V0U2Vzc2lvbk5hbWUoKTsKLQl2b2lkIHNldFNlc3Npb25OYW1lKFN0cmluZyBuZXdTZXNzaW9uTmFtZSk7IAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fTkFNRV9QUk9QRVJUWSA9ICJzZXNzaW9uTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1NFU1NJT05fTkFNRSA9ICJlY2xpcHNlbGluay5zZXNzaW9uLW5hbWUiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TRVNTSU9OX05BTUUgPSAiIjsJLy8gbm8gZGVmYXVsdCAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgZ2V0RGVmYXVsdFNlc3Npb25zWG1sKCk7Ci0JU3RyaW5nIGdldFNlc3Npb25zWG1sKCk7Ci0Jdm9pZCBzZXRTZXNzaW9uc1htbChTdHJpbmcgbmV3U2Vzc2lvbnNYbWwpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05TX1hNTF9QUk9QRVJUWSA9ICJzZXNzaW9uc1htbCI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1NFU1NJT05TX1hNTCA9ICJlY2xpcHNlbGluay5zZXNzaW9ucy14bWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TRVNTSU9OU19YTUwgPSAiIjsJLy8gbm8gZGVmYXVsdCAvLyROT04tTkxTLTEkCi0JCQotCUJvb2xlYW4gZ2V0RGVmYXVsdEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpOwotCUJvb2xlYW4gZ2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCk7Ci0Jdm9pZCBzZXRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoQm9vbGVhbiBuZXdJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkgPSAiaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzeSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1NFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVMgPSAiZWNsaXBzZWxpbmsuc2Vzc2lvbi5pbmNsdWRlLmRlc2NyaXB0b3IucXVlcmllcyI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTID0gQm9vbGVhbi5UUlVFOwotCQkKLQlTdHJpbmcgZ2V0RGVmYXVsdFRhcmdldERhdGFiYXNlKCk7Ci0JU3RyaW5nIGdldFRhcmdldERhdGFiYXNlKCk7Ci0Jdm9pZCBzZXRUYXJnZXREYXRhYmFzZShTdHJpbmcgbmV3VGFyZ2V0RGF0YWJhc2UpOwotCXZvaWQgc2V0VGFyZ2V0RGF0YWJhc2UoVGFyZ2V0RGF0YWJhc2UgbmV3VGFyZ2V0RGF0YWJhc2UpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSA9ICJ0YXJnZXREYXRhYmFzZSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1RBUkdFVF9EQVRBQkFTRSA9ICJlY2xpcHNlbGluay50YXJnZXQtZGF0YWJhc2UiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9UQVJHRVRfREFUQUJBU0UgPSBUYXJnZXREYXRhYmFzZS5hdXRvLmdldFByb3BlcnR5VmFsdWUoKTsKLQotCVN0cmluZyBnZXREZWZhdWx0VGFyZ2V0U2VydmVyKCk7Ci0JU3RyaW5nIGdldFRhcmdldFNlcnZlcigpOwotCXZvaWQgc2V0VGFyZ2V0U2VydmVyKFN0cmluZyBuZXdUYXJnZXRTZXJ2ZXIpOwotCXZvaWQgc2V0VGFyZ2V0U2VydmVyKFRhcmdldFNlcnZlciBuZXdUYXJnZXRTZXJ2ZXIpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9TRVJWRVJfUFJPUEVSVFkgPSAidGFyZ2V0U2VydmVyIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfVEFSR0VUX1NFUlZFUiA9ICJlY2xpcHNlbGluay50YXJnZXQtc2VydmVyIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVEFSR0VUX1NFUlZFUiA9IFRhcmdldFNlcnZlci5ub25lLmdldFByb3BlcnR5VmFsdWUoKTsKLQotCVN0cmluZyBnZXREZWZhdWx0RXZlbnRMaXN0ZW5lcigpOwotCVN0cmluZyBnZXRFdmVudExpc3RlbmVyKCk7Ci0Jdm9pZCBzZXRFdmVudExpc3RlbmVyKFN0cmluZyBuZXdFdmVudExpc3RlbmVyKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1BST1BFUlRZID0gImV2ZW50TGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19TRVNTSU9OX0VWRU5UX0xJU1RFTkVSID0gImVjbGlwc2VsaW5rLnNlc3Npb24tZXZlbnQtbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TRVNTSU9OX0VWRU5UX0xJU1RFTkVSID0gbnVsbDsJLy8gbm8gZGVmYXVsdAotCQlTdHJpbmcgRUNMSVBTRUxJTktfRVZFTlRfTElTVEVORVJfQ0xBU1NfTkFNRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5zZXNzaW9ucy5TZXNzaW9uRXZlbnRMaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQotCUJvb2xlYW4gZ2V0RGVmYXVsdFRlbXBvcmFsTXV0YWJsZSgpOwotCUJvb2xlYW4gZ2V0VGVtcG9yYWxNdXRhYmxlKCk7Ci0Jdm9pZCBzZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbiB0ZW1wb3JhbE11dGFibGUpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBPUkFMX01VVEFCTEVfUFJPUEVSVFkgPSAidGVtcG9yYWxNdXRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfVEVNUE9SQUxfTVVUQUJMRSA9ICJlY2xpcHNlbGluay50ZW1wb3JhbC5tdXRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1RFTVBPUkFMX01VVEFCTEUgPSBCb29sZWFuLkZBTFNFOwotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9PcHRpb25zMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL09wdGlvbnMyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJmZDJhYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL09wdGlvbnMyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5KcGFPcHRpb25zMl8wOwotCi0vKioKLSAqICBPcHRpb25zMl8wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3B0aW9uczJfMCBleHRlbmRzIE9wdGlvbnMsIEpwYU9wdGlvbnMyXzAKLXsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9PdXRwdXRNb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL091dHB1dE1vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQzZDE1Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL091dHB1dE1vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sRW51bVZhbHVlOwotCi0vKioKLSAqICBPdXRwdXRNb2RlCi0gKi8KLXB1YmxpYyBlbnVtIE91dHB1dE1vZGUgaW1wbGVtZW50cyBQZXJzaXN0ZW5jZVhtbEVudW1WYWx1ZSB7Ci0JYm90aCgiYm90aCIpLCAgLy8kTk9OLU5MUy0xJAotCWRhdGFiYXNlKCJkYXRhYmFzZSIpLCAvLyROT04tTkxTLTEkCi0Jc3FsX3NjcmlwdCgic3FsLXNjcmlwdCIpOyAgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvcGVydHlWYWx1ZTsKLQotCU91dHB1dE1vZGUoU3RyaW5nIHByb3BlcnR5VmFsdWUpIHsKLQkJdGhpcy5wcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3RyaW5nIHVzZWQgYXMgdGhlIHByb3BlcnR5IHZhbHVlIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnByb3BlcnR5VmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9Qcm9maWxlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9Qcm9maWxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWI5NDNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUHJvZmlsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sRW51bVZhbHVlOwotCi0vKioKLSAqICBQcm9maWxlcgotICovCi1wdWJsaWMgZW51bSBQcm9maWxlciBpbXBsZW1lbnRzIFBlcnNpc3RlbmNlWG1sRW51bVZhbHVlIHsKLQotCXBlcmZvcm1hbmNlX3Byb2ZpbGVyKCJQZXJmb3JtYW5jZVByb2ZpbGVyIiwgIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnRvb2xzLnByb2ZpbGVyLlBlcmZvcm1hbmNlUHJvZmlsZXIiKSwgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXF1ZXJ5X21vbml0b3IoIlF1ZXJ5TW9uaXRvciIsICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS50b29scy5wcm9maWxlci5RdWVyeU1vbml0b3IiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0Jbm9fcHJvZmlsZXIoIk5vUHJvZmlsZXIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRWNsaXBzZUxpbmsgcHJvcGVydHkgdmFsdWUKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBwcm9wZXJ0eVZhbHVlOwotCi0JLyoqCi0JICogRWNsaXBzZUxpbmsgcHJvZmlsZXIgY2xhc3MgbmFtZQotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGNsYXNzTmFtZTsKLQotCVByb2ZpbGVyKFN0cmluZyBwcm9wZXJ0eVZhbHVlLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXRoaXMucHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWU7Ci0JCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIFRoZSBzdHJpbmcgdXNlZCBhcyB0aGUgcHJvcGVydHkgdmFsdWUgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJvcGVydHlWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvZmlsZXIgZnJvbVByb3BlcnR5VmFsdWUoU3RyaW5nIHByb3BlcnR5VmFsdWUpIHsKLQkJZm9yIChQcm9maWxlciBwcm9maWxlciA6IFByb2ZpbGVyLnZhbHVlcygpKSB7Ci0JCQlpZiAocHJvZmlsZXIuZ2V0UHJvcGVydHlWYWx1ZSgpLmVxdWFscyhwcm9wZXJ0eVZhbHVlKSkgewotCQkJCXJldHVybiBwcm9maWxlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFByb2ZpbGVyIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpdGVyYWwuCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9maWxlciBnZXRQcm9maWxlckZvcihTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IoIFByb2ZpbGVyIHByb2ZpbGVyIDogUHJvZmlsZXIudmFsdWVzKCkpIHsKLQkJCWlmKHByb2ZpbGVyLnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHByb2ZpbGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb2ZpbGVyQ2xhc3NOYW1lKFN0cmluZyBwcm9maWxlclZhbHVlKSB7Ci0JCXJldHVybiBmcm9tUHJvcGVydHlWYWx1ZShwcm9maWxlclZhbHVlKS5nZXRDbGFzc05hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1NjaGVtYUdlbmVyYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvU2NoZW1hR2VuZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzI2YTMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvU2NoZW1hR2VuZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLQotLyoqCi0gKiAgU2NoZW1hR2VuZXJhdGlvbgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYUdlbmVyYXRpb24gZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi17Ci0JRGRsR2VuZXJhdGlvblR5cGUgZ2V0RGVmYXVsdERkbEdlbmVyYXRpb25UeXBlKCk7Ci0JRGRsR2VuZXJhdGlvblR5cGUgZ2V0RGRsR2VuZXJhdGlvblR5cGUoKTsKLQl2b2lkIHNldERkbEdlbmVyYXRpb25UeXBlKERkbEdlbmVyYXRpb25UeXBlIGRkbEdlbmVyYXRpb25UeXBlKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERExfR0VORVJBVElPTl9UWVBFX1BST1BFUlRZID0gImRkbEdlbmVyYXRpb25UeXBlIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSA9ICJlY2xpcHNlbGluay5kZGwtZ2VuZXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIERkbEdlbmVyYXRpb25UeXBlIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fRERMX0dFTkVSQVRJT05fVFlQRSA9IERkbEdlbmVyYXRpb25UeXBlLm5vbmU7Ci0KLQlPdXRwdXRNb2RlIGdldERlZmF1bHRPdXRwdXRNb2RlKCk7Ci0JT3V0cHV0TW9kZSBnZXRPdXRwdXRNb2RlKCk7Ci0Jdm9pZCBzZXRPdXRwdXRNb2RlKE91dHB1dE1vZGUgb3V0cHV0TW9kZSk7IC8vIHB1dAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9NT0RFX1BST1BFUlRZID0gIm91dHB1dE1vZGUiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERSA9ICJlY2xpcHNlbGluay5kZGwtZ2VuZXJhdGlvbi5vdXRwdXQtbW9kZSI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIE91dHB1dE1vZGUgREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9PVVRQVVRfTU9ERSA9IG51bGw7CQkvLyBObyBEZWZhdWx0Ci0KLQlTdHJpbmcgZ2V0RGVmYXVsdENyZWF0ZUZpbGVOYW1lKCk7Ci0JU3RyaW5nIGdldENyZWF0ZUZpbGVOYW1lKCk7Ci0Jdm9pZCBzZXRDcmVhdGVGaWxlTmFtZShTdHJpbmcgY3JlYXRlRmlsZU5hbWUpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9GSUxFX05BTUVfUFJPUEVSVFkgPSAiY3JlYXRlRmlsZU5hbWUiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19DUkVBVEVfRklMRV9OQU1FID0gImVjbGlwc2VsaW5rLmNyZWF0ZS1kZGwtamRiYy1maWxlLW5hbWUiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9DUkVBVEVfRklMRV9OQU1FID0gImNyZWF0ZURETC5zcWwiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIGdldERlZmF1bHREcm9wRmlsZU5hbWUoKTsKLQlTdHJpbmcgZ2V0RHJvcEZpbGVOYW1lKCk7Ci0Jdm9pZCBzZXREcm9wRmlsZU5hbWUoU3RyaW5nIGRyb3BGaWxlTmFtZSk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRFJPUF9GSUxFX05BTUVfUFJPUEVSVFkgPSAiZHJvcEZpbGVOYW1lIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRFJPUF9GSUxFX05BTUUgPSAiZWNsaXBzZWxpbmsuZHJvcC1kZGwtamRiYy1maWxlLW5hbWUiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9EUk9QX0ZJTEVfTkFNRSA9ICJkcm9wRERMLnNxbCI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JU3RyaW5nIGdldERlZmF1bHRBcHBsaWNhdGlvbkxvY2F0aW9uKCk7Ci0JU3RyaW5nIGdldEFwcGxpY2F0aW9uTG9jYXRpb24oKTsKLQl2b2lkIHNldEFwcGxpY2F0aW9uTG9jYXRpb24oU3RyaW5nIGFwcGxpY2F0aW9uTG9jYXRpb24pOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0xPQ0FUSU9OX1BST1BFUlRZID0gImFwcGxpY2F0aW9uTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19BUFBMSUNBVElPTl9MT0NBVElPTiA9ICJlY2xpcHNlbGluay5hcHBsaWNhdGlvbi1sb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0FQUExJQ0FUSU9OX0xPQ0FUSU9OID0gbnVsbDsgLy8kTk9OLU5MUy0xJAotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9UYXJnZXREYXRhYmFzZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9UYXJnZXREYXRhYmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTU0Nzk1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvVGFyZ2V0RGF0YWJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sRW51bVZhbHVlOwotCi0vKioKLSAqICBUYXJnZXREYXRhYmFzZQotICovCi1wdWJsaWMgZW51bSBUYXJnZXREYXRhYmFzZSBpbXBsZW1lbnRzIFBlcnNpc3RlbmNlWG1sRW51bVZhbHVlIHsKLQlhdHR1bml0eSgiQXR0dW5pdHkiKSwgLy8kTk9OLU5MUy0xJAotCWF1dG8oIkF1dG8iKSwgLy8kTk9OLU5MUy0xJAotCWNsb3Vkc2NhcGUoIkNsb3Vkc2NhcGUiKSwgLy8kTk9OLU5MUy0xJAotCWRhdGFiYXNlKCJEYXRhYmFzZSIpLCAvLyROT04tTkxTLTEkCi0JZGIyKCJEQjIiKSwgLy8kTk9OLU5MUy0xJAotCWRiMm1haW5mcmFtZSgiREIyTWFpbmZyYW1lIiksIC8vJE5PTi1OTFMtMSQKLQlkYmFzZSgiREJhc2UiKSwgLy8kTk9OLU5MUy0xJAotCWRlcmJ5KCJEZXJieSIpLCAvLyROT04tTkxTLTEkCi0JaHNxbCgiSFNRTCIpLCAvLyROT04tTkxTLTEkCi0JaW5mb3JtaXgoIkluZm9ybWl4IiksIC8vJE5PTi1OTFMtMSQKLQlqYXZhZGIoIkphdmFEQiIpLCAvLyROT04tTkxTLTEkCi0JbWF4ZGIoIk1heERCIiksIC8vJE5PTi1OTFMtMSQKLQlteXNxbCgiTXlTUUwiKSwgLy8kTk9OLU5MUy0xJAotCW9yYWNsZSgiT3JhY2xlIiksIC8vJE5PTi1OTFMtMSQKLQlvcmFjbGUxMSgiT3JhY2xlMTEiKSwgLy8kTk9OLU5MUy0xJAotCW9yYWNsZTEwKCJPcmFjbGUxMGciKSwgLy8kTk9OLU5MUy0xJAotCW9yYWNsZTkoIk9yYWNsZTlpIiksIC8vJE5PTi1OTFMtMSQKLQlvcmFjbGU4KCJPcmFjbGU4aSIpLCAvLyROT04tTkxTLTEkCi0JcG9pbnRiYXNlKCJQb2ludEJhc2UiKSwgLy8kTk9OLU5MUy0xJAotCXBvc3RncmVzcWwoIlBvc3RncmVTUUwiKSwgLy8kTk9OLU5MUy0xJAotCXNxbGFueXdoZXJlKCJTUUxBbnl3aGVyZSIpLCAvLyROT04tTkxTLTEkCi0Jc3Fsc2VydmVyKCJTUUxTZXJ2ZXIiKSwgLy8kTk9OLU5MUy0xJAotCXN5YmFzZSgiU3liYXNlIiksIC8vJE5PTi1OTFMtMSQKLQlzeW1mb3dhcmUoIlN5bWZvd2FyZSIpLCAvLyROT04tTkxTLTEkCi0JdGltZXN0ZW4oIlRpbWVzVGVuIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHByb3BlcnR5VmFsdWU7Ci0KLQlUYXJnZXREYXRhYmFzZShTdHJpbmcgcHJvcGVydHlWYWx1ZSkgewotCQl0aGlzLnByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzdHJpbmcgdXNlZCBhcyB0aGUgcHJvcGVydHkgdmFsdWUgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJvcGVydHlWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFRhcmdldERhdGFiYXNlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpdGVyYWwuCi0JICovCi0JcHVibGljIHN0YXRpYyBUYXJnZXREYXRhYmFzZSBnZXRUYXJnZXREYXRhYmFzZUZvcihTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKFRhcmdldERhdGFiYXNlIHRhcmdldERhdGFiYXNlIDogVGFyZ2V0RGF0YWJhc2UudmFsdWVzKCkpIHsKLQkJCWlmICh0YXJnZXREYXRhYmFzZS50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiB0YXJnZXREYXRhYmFzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPcmFjbGVEYXRhYmFzZShTdHJpbmcgbGl0ZXJhbCkgewotCQlyZXR1cm4gbGl0ZXJhbC5jb250YWlucygiT3JhY2xlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1RhcmdldFNlcnZlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9UYXJnZXRTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiZDI0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1RhcmdldFNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxFbnVtVmFsdWU7Ci0KLS8qKgotICogIFRhcmdldFNlcnZlcgotICovCi1wdWJsaWMgZW51bSBUYXJnZXRTZXJ2ZXIgaW1wbGVtZW50cyBQZXJzaXN0ZW5jZVhtbEVudW1WYWx1ZSB7Ci0Jbm9uZSgiTm9uZSIpLCAvLyROT04tTkxTLTEkCi0Jb2M0aigiT0M0SiIpLCAvLyROT04tTkxTLTEkCi0Jc3VuYXM5KCJTdW5BUzkiKSwgLy8kTk9OLU5MUy0xJAotCXdlYnNwaGVyZSgiV2ViU3BoZXJlIiksIC8vJE5PTi1OTFMtMSQKLQl3ZWJzcGhlcmVfNl8xKCJXZWJTcGhlcmVfNl8xIiksIC8vJE5PTi1OTFMtMSQKLQl3ZWJzcGhlcmVfNygiV2ViU3BoZXJlXzciKSwgLy8kTk9OLU5MUy0xJAotCXdlYmxvZ2ljKCJXZWJMb2dpYyIpLCAvLyROT04tTkxTLTEkCi0Jd2VibG9naWNfOSgiV2ViTG9naWNfOSIpLCAvLyROT04tTkxTLTEkCi0Jd2VibG9naWNfMTAoIldlYkxvZ2ljXzEwIiksIC8vJE5PTi1OTFMtMSQKLQlqYm9zcygiSkJvc3MiKSwgLy8kTk9OLU5MUy0xJAotCW5ldHdlYXZlcl83XzEoIk5ldFdlYXZlcl83XzEiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvcGVydHlWYWx1ZTsKLQotCVRhcmdldFNlcnZlcihTdHJpbmcgcHJvcGVydHlWYWx1ZSkgewotCQl0aGlzLnByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzdHJpbmcgdXNlZCBhcyB0aGUgcHJvcGVydHkgdmFsdWUgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJvcGVydHlWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFRhcmdldFNlcnZlciB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBsaXRlcmFsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGFyZ2V0U2VydmVyIGdldFRhcmdldFNlcnZlckZvcihTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKFRhcmdldFNlcnZlciB0YXJnZXRTZXJ2ZXIgOiBUYXJnZXRTZXJ2ZXIudmFsdWVzKCkpIHsKLQkJCWlmICh0YXJnZXRTZXJ2ZXIudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gdGFyZ2V0U2VydmVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1dlYXZpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvV2VhdmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmY5YTMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvV2VhdmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxFbnVtVmFsdWU7Ci0KLS8qKgotICogIFdlYXZpbmcKLSAqLwotcHVibGljIGVudW0gV2VhdmluZyBpbXBsZW1lbnRzIFBlcnNpc3RlbmNlWG1sRW51bVZhbHVlIHsKLQl0cnVlXygidHJ1ZSIpLCAvLyROT04tTkxTLTEkCi0JZmFsc2VfKCJmYWxzZSIpLCAgLy8kTk9OLU5MUy0xJAotCXN0YXRpY18oInN0YXRpYyIpOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIEVjbGlwc2VMaW5rIHByb3BlcnR5IHZhbHVlCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvcGVydHlWYWx1ZTsKLQotCVdlYXZpbmcoU3RyaW5nIHByb3BlcnR5VmFsdWUpIHsKLQkJdGhpcy5wcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3RyaW5nIHVzZWQgYXMgdGhlIHByb3BlcnR5IHZhbHVlIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnByb3BlcnR5VmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0Fic3RyYWN0RWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZjFjYzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuUmVzb3VyY2VEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSmFyUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5KYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5Pcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLlBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1YbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkdlbmVyaWNPcm1YbWwyXzBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUVudGl0eURlZmluaXRpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFJZE1hcHBpbmdEZWZpbml0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YVRyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sMV8xRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWwxXzJEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVhtbDJfMERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbjsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmsgMi4wIHBsYXRmb3JtIGNvbmZpZwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlcgotewotCXByb3RlY3RlZCBBYnN0cmFjdEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgbW9kZWxzICoqKioqKioqKioKLQotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUgZ2V0TW9zdFJlY2VudFN1cHBvcnRlZFJlc291cmNlVHlwZShJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb21tb25Db3JlUGx1Z2luLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRDb21tb25Db3JlUGx1Z2luLkpBVkFfU09VUkNFX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvbW1vbkNvcmVQbHVnaW4uSkFSX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRDb21tb25Db3JlUGx1Z2luLkpBUl9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRKcGFDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfMl8wX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MXzJfMF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMl8wX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNvbnRlbnRUeXBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VNb2RlbFByb3ZpZGVyc1RvKEFycmF5TGlzdDxKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXI+IHByb3ZpZGVycykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHByb3ZpZGVycywgUkVTT1VSQ0VfTU9ERUxfUFJPVklERVJTKTsKLQl9Ci0KLQkvLyBvcmRlciBzaG91bGQgbm90IGJlIGltcG9ydGFudCBoZXJlCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXJbXSBSRVNPVVJDRV9NT0RFTF9QUk9WSURFUlMgPSBuZXcgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gewotCQlKYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCUphclJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQlQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQlPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKQotCX07Ci0KLQotCS8vICoqKioqKioqKiBKYXZhIHR5cGUgbWFwcGluZ3MgKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBKQVZBX1RZUEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLy8gb3JkZXIgbWF0Y2hlcyB0aGF0IHVzZWQgYnkgRWNsaXBzZUxpbmsKLQkvLyBOQjogbm8gRWNsaXBzZUxpbmstc3BlY2lmaWMgbWFwcGluZ3MKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25bXSBKQVZBX1RZUEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQlFY2xpcHNlTGlua0phdmFFbnRpdHlEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uMl8wLmluc3RhbmNlKCkKLQl9OwotCi0KLQkvLyAqKioqKioqKiogSmF2YSBhdHRyaWJ1dGUgbWFwcGluZ3MgKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBERUZBVUxUX0pBVkFfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8vIG9yZGVyIG1hdGNoZXMgdGhhdCB1c2VkIGJ5IEVjbGlwc2VMaW5rCi0JLy8gTkI6IG5vIGNoYW5nZSBmcm9tIEVjbGlwc2VMaW5rIDEuMiB0byAyLjAKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBERUZBVUxUX0pBVkFfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMgPSBuZXcgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJRWNsaXBzZUxpbmtKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YVZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCkKLQl9OwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIFNQRUNJRklFRF9KQVZBX0FUVFJJQlVURV9NQVBQSU5HX0RFRklOSVRJT05TKTsKLQl9Ci0KLQkvLyBvcmRlciBtYXRjaGVzIHRoYXQgdXNlZCBieSBFY2xpcHNlTGluawotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gU1BFQ0lGSUVEX0pBVkFfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMgPSBuZXcgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQlKYXZhVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKQotCX07Ci0KLQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxSZXNvdXJjZURlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIFJFU09VUkNFX0RFRklOSVRJT05TKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJlc291cmNlRGVmaW5pdGlvbltdIFJFU09VUkNFX0RFRklOSVRJT05TID0gbmV3IFJlc291cmNlRGVmaW5pdGlvbltdIHsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJR2VuZXJpY09ybVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJR2VuZXJpY09ybVhtbDJfMERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rT3JtWG1sMV8xRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua09ybVhtbDFfMkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtPcm1YbWwyXzBEZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyZjcwYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIERlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBERUZBVUxUX1BBUk1TID0gbmV3IFN0cmluZ1swXTsKLQlwcml2YXRlIHN0YXRpYyBUZXh0UmFuZ2UgREVGQVVMVF9URVhUX1JBTkdFID0gVGV4dFJhbmdlLkVtcHR5Lmluc3RhbmNlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIElNZXNzYWdlIGJ1aWxkTWVzc2FnZShpbnQgZGVmYXVsdFNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBKcGFOb2RlIHRhcmdldE9iamVjdCkgewotCQlyZXR1cm4gYnVpbGRNZXNzYWdlKGRlZmF1bHRTZXZlcml0eSwgbWVzc2FnZUlkLCB0YXJnZXRPYmplY3QuZ2V0UmVzb3VyY2UoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoaW50IGRlZmF1bHRTZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgSVJlc291cmNlIHRhcmdldE9iamVjdCkgewotCQlyZXR1cm4gYnVpbGRNZXNzYWdlKGRlZmF1bHRTZXZlcml0eSwgbWVzc2FnZUlkLCBERUZBVUxUX1BBUk1TLCB0YXJnZXRPYmplY3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSU1lc3NhZ2UgYnVpbGRNZXNzYWdlKGludCBkZWZhdWx0U2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBKcGFOb2RlIHRhcmdldE9iamVjdCkgewotCQlyZXR1cm4gYnVpbGRNZXNzYWdlKGRlZmF1bHRTZXZlcml0eSwgbWVzc2FnZUlkLCBwYXJtcywgdGFyZ2V0T2JqZWN0LmdldFJlc291cmNlKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSU1lc3NhZ2UgYnVpbGRNZXNzYWdlKGludCBkZWZhdWx0U2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBJUmVzb3VyY2UgdGFyZ2V0T2JqZWN0KSB7Ci0JCXJldHVybiBidWlsZE1lc3NhZ2UoZGVmYXVsdFNldmVyaXR5LCBtZXNzYWdlSWQsIHBhcm1zLCB0YXJnZXRPYmplY3QsIERFRkFVTFRfVEVYVF9SQU5HRSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoaW50IGRlZmF1bHRTZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgSnBhTm9kZSB0YXJnZXRPYmplY3QsIFRleHRSYW5nZSB0ZXh0UmFuZ2UpIHsKLQkJcmV0dXJuIGJ1aWxkTWVzc2FnZShkZWZhdWx0U2V2ZXJpdHksIG1lc3NhZ2VJZCwgdGFyZ2V0T2JqZWN0LmdldFJlc291cmNlKCksIHRleHRSYW5nZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoaW50IGRlZmF1bHRTZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgSVJlc291cmNlIHRhcmdldE9iamVjdCwgVGV4dFJhbmdlIHRleHRSYW5nZSkgewotCQlyZXR1cm4gYnVpbGRNZXNzYWdlKGRlZmF1bHRTZXZlcml0eSwgbWVzc2FnZUlkLCBERUZBVUxUX1BBUk1TLCB0YXJnZXRPYmplY3QsIHRleHRSYW5nZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoaW50IGRlZmF1bHRTZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMsIEpwYU5vZGUgdGFyZ2V0T2JqZWN0LCBUZXh0UmFuZ2UgdGV4dFJhbmdlKSB7Ci0JCXJldHVybiBidWlsZE1lc3NhZ2UoZGVmYXVsdFNldmVyaXR5LCBtZXNzYWdlSWQsIHBhcm1zLCB0YXJnZXRPYmplY3QuZ2V0UmVzb3VyY2UoKSwgdGV4dFJhbmdlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElNZXNzYWdlIGJ1aWxkTWVzc2FnZShpbnQgZGVmYXVsdFNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcywgSVJlc291cmNlIHRhcmdldE9iamVjdCwgVGV4dFJhbmdlIHRleHRSYW5nZSkgewotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoZGVmYXVsdFNldmVyaXR5LCBtZXNzYWdlSWQsIHBhcm1zLCB0YXJnZXRPYmplY3QsIHRleHRSYW5nZSwgTUVTU0FHRV9GQUNUT1JZKTsKLQl9Ci0KLQotCXByaXZhdGUgRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTWVzc2FnZUZhY3RvcnkgTUVTU0FHRV9GQUNUT1JZID0gbmV3IEVjbGlwc2VMaW5rTWVzc2FnZUZhY3RvcnkoKTsKLQotCS8qIENVIHByaXZhdGUgKi8gc3RhdGljIGNsYXNzIEVjbGlwc2VMaW5rTWVzc2FnZUZhY3RvcnkKLQkJaW1wbGVtZW50cyBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1lc3NhZ2VGYWN0b3J5Ci0JewotCQlwdWJsaWMgSU1lc3NhZ2UgYnVpbGRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMsIElSZXNvdXJjZSB0YXJnZXRPYmplY3QpIHsKLQkJCS8vIFRPRE8gY2hlY2sgZm9yIHByZWZlcmVuY2Ugb3ZlcnJpZGUKLS8vCQkJaW50IHByZWZTZXZlcml0eSA9IEpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5nZXRQcm9ibGVtU2V2ZXJpdHlQcmVmZXJlbmNlKHRhcmdldE9iamVjdCwgbWVzc2FnZUlkKTsKLS8vCQkJaWYgKHByZWZTZXZlcml0eSAhPSBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTk9fU0VWRVJJVFlfUFJFRkVSRU5DRSl7Ci0vLwkJCQlzZXZlcml0eSA9IHByZWZTZXZlcml0eTsKLS8vCQkJfQotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBFY2xpcHNlTGlua01lc3NhZ2UoRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQlVORExFX05BTUUsIHNldmVyaXR5LCBtZXNzYWdlSWQsIHBhcm1zLCB0YXJnZXRPYmplY3QpOwotCQkJLy8gVE9ETyAiRWNsaXBzZUxpbmsgSlBBIiB2YWxpZGF0aW9uIG1hcmtlcj8KLQkJCW1lc3NhZ2Uuc2V0TWFya2VySWQoSnB0SnBhQ29yZVBsdWdpbi5WQUxJREFUSU9OX01BUktFUl9JRCk7Ci0JCQlyZXR1cm4gbWVzc2FnZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogV2UgaGF2ZSB0byBidWlsZCB0aGlzIG1lc3NhZ2Ugc28ge0BsaW5rIE1lc3NhZ2V9IHVzZXMgdGhlIHJpZ2h0IGNsYXNzCi0JICogbG9hZGVyIHRvIHJldHJpZXZlIHRoZSBtZXNzYWdlIGJ1bmRsZXMuCi0JICogPHA+Ci0JICogQW5vdGhlciB3YXkgd2UgY291bGQgcG90ZW50aWFsbHkgc29sdmUgdGhpcyBpcyB0byBoYXZlIGEgc2VwYXJhdGUKLQkgKiBFY2xpc3BlTGluayBKUEEgdmFsaWRhdG9yIGFuZCBzZXQgdXAgdGhlIGV4dGVuc2lvbiBwb2ludHMgc28gdGhhdAotCSAqIGl0IG9ubHkgcnVucyBhZ2FpbnN0IEpQQSBwcm9qZWN0cyB3aXRoIHRoZSBFY2xpc3BlTGluayBwbGF0Zm9ybS4uLi4KLQkgKi8KLQkvKiBDVSBwcml2YXRlICovIHN0YXRpYyBjbGFzcyBFY2xpcHNlTGlua01lc3NhZ2UKLQkJZXh0ZW5kcyBNZXNzYWdlCi0JewotCQlFY2xpcHNlTGlua01lc3NhZ2UoU3RyaW5nIGJ1bmRsZU5hbWUsIGludCBzZXZlcml0eSwgU3RyaW5nIGlkLCBTdHJpbmdbXSBwYXJhbXMsIE9iamVjdCB0YXJnZXQpIHsKLQkJCXN1cGVyKGJ1bmRsZU5hbWUsIHNldmVyaXR5LCBpZCwgcGFyYW1zLCB0YXJnZXQpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoTG9jYWxlIGxvY2FsZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEJ1bmRsZShsb2NhbGUsIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybiBzdXBlci5nZXRCdW5kbGUobG9jYWxlLCBjbGFzc0xvYWRlcik7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzNDQyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5Bbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtVmFyaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVBsYXRmb3JtRmFjdG9yeS5FY2xpcHNlTGlua1ZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwucGFyc2VyLkVjbGlwc2VMaW5rSlBRTEdyYW1tYXIxOwotCi0vKioKLSAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIEpQQSBwbGF0Zm9ybSBzaG91bGQgYmUgInN0YXRpYyIgKGkuZS4gdW5jaGFuZ2luZyBvbmNlCi0gKiBpdCBpcyBpbml0aWFsaXplZCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtRmFjdG9yeQotCWltcGxlbWVudHMgSnBhUGxhdGZvcm1GYWN0b3J5Ci17Ci0JLyoqCi0JICogemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnBhUGxhdGZvcm0gYnVpbGRKcGFQbGF0Zm9ybShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhUGxhdGZvcm0oCi0JCQlpZCwKLQkJCWJ1aWxkSnBhVmVyc2lvbigpLAotCQkJbmV3IEVjbGlwc2VMaW5rSnBhRmFjdG9yeSgpLAotCQkJYnVpbGRBbm5vdGF0aW9uUHJvdmlkZXIoKSwKLQkJCUVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1Qcm92aWRlci5pbnN0YW5jZSgpLAotCQkJYnVpbGRKcGFQbGF0Zm9ybVZhcmlhdGlvbigpLAotCQkJRWNsaXBzZUxpbmtKUFFMR3JhbW1hcjEuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb25Qcm92aWRlciBidWlsZEFubm90YXRpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKcGFBbm5vdGF0aW9uUHJvdmlkZXIoCi0JCQlHZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpLAotCQkJRWNsaXBzZUxpbmtKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybVZhcmlhdGlvbiBidWlsZEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkgewotCQkJcHVibGljIFN1cHBvcnRlZCBnZXRUYWJsZVBlckNvbmNyZXRlQ2xhc3NJbmhlcml0YW5jZUlzU3VwcG9ydGVkKCkgewotCQkJCXJldHVybiBTdXBwb3J0ZWQuWUVTOwotCQkJfQotCQkJcHVibGljIGJvb2xlYW4gaXNKb2luVGFibGVPdmVycmlkYWJsZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlwdWJsaWMgQWNjZXNzVHlwZVtdIGdldFN1cHBvcnRlZEFjY2Vzc1R5cGVzKEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJCQlyZXR1cm4gR0VORVJJQ19TVVBQT1JURURfQUNDRVNTX1RZUEVTOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSnBhUGxhdGZvcm0uVmVyc2lvbiBidWlsZEpwYVZlcnNpb24oKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtWZXJzaW9uKAotCQkJCUpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzFfMSwKLQkJCQlKcGFGYWNldC5WRVJTSU9OXzFfMC5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjRkMjhmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLlJlc291cmNlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkphclJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSmF2YVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5QZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhRW50aXR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YVZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWwxXzFEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbERlZmluaXRpb247Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgcGxhdGZvcm0KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1Qcm92aWRlcgotCQlleHRlbmRzIEFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlciB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1Qcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtUHJvdmlkZXIoKTsKLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybVByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSBtb2RlbHMgKioqKioqKioqKgotCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRNb3N0UmVjZW50U3VwcG9ydGVkUmVzb3VyY2VUeXBlKElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVJfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdENvbW1vbkNvcmVQbHVnaW4uSkFSX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRKcGFDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRKcGFDb3JlUGx1Z2luLk9STV9YTUxfMV8wX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzFfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY29udGVudFR5cGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzVG8oQXJyYXlMaXN0PEpwYVJlc291cmNlTW9kZWxQcm92aWRlcj4gcHJvdmlkZXJzKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwocHJvdmlkZXJzLCBSRVNPVVJDRV9NT0RFTF9QUk9WSURFUlMpOwotCX0KLQotCS8vIG9yZGVyIHNob3VsZCBub3QgYmUgaW1wb3J0YW50IGhlcmUKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEpwYVJlc291cmNlTW9kZWxQcm92aWRlcltdIFJFU09VUkNFX01PREVMX1BST1ZJREVSUyA9IG5ldyBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXJbXSB7Ci0JCUphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJSmFyUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCVBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCU9ybVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpCi0JfTsKLQotCi0JLy8gKioqKioqKioqIEphdmEgdHlwZSBtYXBwaW5ncyAqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIEpBVkFfVFlQRV9NQVBQSU5HX0RFRklOSVRJT05TKTsKLQl9Ci0KLQkvLyBvcmRlciBtYXRjaGVzIHRoYXQgdXNlZCBieSBFY2xpcHNlTGluawotCS8vIE5COiBubyBFY2xpcHNlTGluay1zcGVjaWZpYyBtYXBwaW5ncwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIEpBVkFfVFlQRV9NQVBQSU5HX0RFRklOSVRJT05TID0gbmV3IEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCUVjbGlwc2VMaW5rSmF2YUVudGl0eURlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZURlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24uaW5zdGFuY2UoKQotCX07Ci0KLQotCS8vICoqKioqKioqKiBKYXZhIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIERFRkFVTFRfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLy8gb3JkZXIgbWF0Y2hlcyB0aGF0IHVzZWQgYnkgRWNsaXBzZUxpbmsKLQkvLyBOQjogbm8gY2hhbmdlIGZyb20gRWNsaXBzZUxpbmsgMS4wIHRvIDEuMQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIERFRkFVTFRfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQlKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YVZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIFNQRUNJRklFRF9KQVZBX0FUVFJJQlVURV9NQVBQSU5HX0RFRklOSVRJT05TKTsKLQl9Ci0KLQkvLyBvcmRlciBtYXRjaGVzIHRoYXQgdXNlZCBieSBFY2xpcHNlTGluawotCS8vIE5COiBubyBjaGFuZ2UgZnJvbSBFY2xpcHNlTGluayAxLjAgdG8gMS4xCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBTUEVDSUZJRURfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCUphdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YVZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpCi0JfTsKLQotCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSBkZWZpbml0aW9ucyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZURlZmluaXRpb25zVG8oQXJyYXlMaXN0PFJlc291cmNlRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgUkVTT1VSQ0VfREVGSU5JVElPTlMpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUmVzb3VyY2VEZWZpbml0aW9uW10gUkVTT1VSQ0VfREVGSU5JVElPTlMgPSBuZXcgUmVzb3VyY2VEZWZpbml0aW9uW10gewotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlHZW5lcmljT3JtWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtPcm1YbWwxXzFEZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmsxXzJKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazFfMkpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA3NzZkOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazFfMkpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLkFjY2VzczJfMEFubm90YXRpb25EZWZpbml0aW9uOwotCi0vKioKLSAqIFByb3ZpZGVzIGFubm90YXRpb25zIGZvciAxLjIgRWNsaXBzZUxpbmsgcGxhdGZvcm0KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMV8ySnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcgotCWV4dGVuZHMgQWJzdHJhY3RKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGluazFfMkpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmsxXzJKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZEFubm90YXRpb25EZWZpbml0aW9uc1RvKEFycmF5TGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJZGVmaW5pdGlvbnMuYWRkKEFjY2VzczJfMEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zVG8oQXJyYXlMaXN0PE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCS8vIG5vdGhpbmcgbmV3IGZvciBFY2xpcHNlTGluayAxLjIKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4MmVkOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5Bbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtVmFyaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVBsYXRmb3JtRmFjdG9yeS5FY2xpcHNlTGlua1ZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwucGFyc2VyLkVjbGlwc2VMaW5rSlBRTEdyYW1tYXIxOwotCi0vKioKLSAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIEpQQSBwbGF0Zm9ybSBzaG91bGQgYmUgInN0YXRpYyIgKGkuZS4gdW5jaGFuZ2luZyBvbmNlCi0gKiBpdCBpcyBpbml0aWFsaXplZCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtRmFjdG9yeQotCWltcGxlbWVudHMgSnBhUGxhdGZvcm1GYWN0b3J5Ci17Ci0JLyoqCi0JICogemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnBhUGxhdGZvcm0gYnVpbGRKcGFQbGF0Zm9ybShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhUGxhdGZvcm0oCi0JCQlpZCwKLQkJCWJ1aWxkSnBhVmVyc2lvbigpLAotCQkJbmV3IEVjbGlwc2VMaW5rSnBhRmFjdG9yeSgpLAotCQkJYnVpbGRBbm5vdGF0aW9uUHJvdmlkZXIoKSwKLQkJCUVjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1Qcm92aWRlci5pbnN0YW5jZSgpLAotCQkJYnVpbGRKcGFQbGF0Zm9ybVZhcmlhdGlvbigpLAotCQkJRWNsaXBzZUxpbmtKUFFMR3JhbW1hcjEuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb25Qcm92aWRlciBidWlsZEFubm90YXRpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKcGFBbm5vdGF0aW9uUHJvdmlkZXIoCi0JCQlHZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpLAotCQkJRWNsaXBzZUxpbmtKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlFY2xpcHNlTGluazFfMkpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtVmFyaWF0aW9uIGJ1aWxkSnBhUGxhdGZvcm1WYXJpYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgSnBhUGxhdGZvcm1WYXJpYXRpb24oKSB7Ci0JCQlwdWJsaWMgU3VwcG9ydGVkIGdldFRhYmxlUGVyQ29uY3JldGVDbGFzc0luaGVyaXRhbmNlSXNTdXBwb3J0ZWQoKSB7Ci0JCQkJcmV0dXJuIFN1cHBvcnRlZC5ZRVM7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiBpc0pvaW5UYWJsZU92ZXJyaWRhYmxlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXB1YmxpYyBBY2Nlc3NUeXBlW10gZ2V0U3VwcG9ydGVkQWNjZXNzVHlwZXMoSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQkJCXJldHVybiBHRU5FUklDX1NVUFBPUlRFRF9BQ0NFU1NfVFlQRVM7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBKcGFQbGF0Zm9ybS5WZXJzaW9uIGJ1aWxkSnBhVmVyc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1ZlcnNpb24oCi0JCQkJSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX1BMQVRGT1JNX1ZFUlNJT05fMV8yLAotCQkJCUpwYUZhY2V0LlZFUlNJT05fMV8wLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMzFkODguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuUmVzb3VyY2VEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSmFyUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5KYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5Pcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLlBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUJhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFFbWJlZGRhYmxlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUVudGl0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFJZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YVRyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sMV8xRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWwxXzJEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbERlZmluaXRpb247Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgcGxhdGZvcm0KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1Qcm92aWRlcgotCQlleHRlbmRzIEFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlciB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1Qcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtUHJvdmlkZXIoKTsKLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybVByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSBtb2RlbHMgKioqKioqKioqKgotCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRNb3N0UmVjZW50U3VwcG9ydGVkUmVzb3VyY2VUeXBlKElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVJfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdENvbW1vbkNvcmVQbHVnaW4uSkFSX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRKcGFDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRKcGFDb3JlUGx1Z2luLk9STV9YTUxfMV8wX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzJfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY29udGVudFR5cGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzVG8oQXJyYXlMaXN0PEpwYVJlc291cmNlTW9kZWxQcm92aWRlcj4gcHJvdmlkZXJzKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwocHJvdmlkZXJzLCBSRVNPVVJDRV9NT0RFTF9QUk9WSURFUlMpOwotCX0KLQotCS8vIG9yZGVyIHNob3VsZCBub3QgYmUgaW1wb3J0YW50IGhlcmUKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEpwYVJlc291cmNlTW9kZWxQcm92aWRlcltdIFJFU09VUkNFX01PREVMX1BST1ZJREVSUyA9IG5ldyBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXJbXSB7Ci0JCUphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJSmFyUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCVBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCU9ybVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpCi0JfTsKLQotCi0JLy8gKioqKioqKioqIEphdmEgdHlwZSBtYXBwaW5ncyAqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIEpBVkFfVFlQRV9NQVBQSU5HX0RFRklOSVRJT05TKTsKLQl9Ci0KLQkvLyBvcmRlciBtYXRjaGVzIHRoYXQgdXNlZCBieSBFY2xpcHNlTGluawotCS8vIE5COiBubyBFY2xpcHNlTGluay1zcGVjaWZpYyBtYXBwaW5ncwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIEpBVkFfVFlQRV9NQVBQSU5HX0RFRklOSVRJT05TID0gbmV3IEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCUVjbGlwc2VMaW5rSmF2YUVudGl0eURlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZURlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24uaW5zdGFuY2UoKQotCX07Ci0KLQotCS8vICoqKioqKioqKiBKYXZhIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIERFRkFVTFRfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLy8gb3JkZXIgbWF0Y2hlcyB0aGF0IHVzZWQgYnkgRWNsaXBzZUxpbmsKLQkvLyBOQjogbm8gY2hhbmdlIGZyb20gRWNsaXBzZUxpbmsgMS4xIHRvIDEuMgotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIERFRkFVTFRfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQlKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YVZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIFNQRUNJRklFRF9KQVZBX0FUVFJJQlVURV9NQVBQSU5HX0RFRklOSVRJT05TKTsKLQl9Ci0KLQkvLyBvcmRlciBtYXRjaGVzIHRoYXQgdXNlZCBieSBFY2xpcHNlTGluawotCS8vIE5COiBubyBjaGFuZ2UgZnJvbSBFY2xpcHNlTGluayAxLjEgdG8gMS4yCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBTUEVDSUZJRURfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCUphdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKQotCX07Ci0KLQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxSZXNvdXJjZURlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIFJFU09VUkNFX0RFRklOSVRJT05TKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJlc291cmNlRGVmaW5pdGlvbltdIFJFU09VUkNFX0RFRklOSVRJT05TID0gbmV3IFJlc291cmNlRGVmaW5pdGlvbltdIHsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJR2VuZXJpY09ybVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rT3JtWG1sMV8xRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua09ybVhtbDFfMkRlZmluaXRpb24uaW5zdGFuY2UoKQotCX07Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rMl8wSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjkzNDZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rMl8wSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuQWJzdHJhY3RKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua01hcEtleUNvbnZlcnQyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uOwotCi0vKioKLSAqIFByb3ZpZGVzIGFubm90YXRpb25zIGZvciAyLjAgRWNsaXBzZUxpbmsgcGxhdGZvcm0KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcgotCWV4dGVuZHMgQWJzdHJhY3RKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGluazJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rMl8wSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIEFOTk9UQVRJT05fREVGSU5JVElPTlMpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb25bXSBBTk5PVEFUSU9OX0RFRklOSVRJT05TID0gbmV3IEFubm90YXRpb25EZWZpbml0aW9uW10gewotCQlFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rTWFwS2V5Q29udmVydDJfMEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgTkVTVEFCTEVfQU5OT1RBVElPTl9ERUZJTklUSU9OUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uW10gTkVTVEFCTEVfQU5OT1RBVElPTl9ERUZJTklUSU9OUyA9IG5ldyBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uW10gewotCQlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQl9OwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazJfMEpwYUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rMl8wSnBhRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODI2YmExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rMl8wSnBhRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdC5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFHZW5lcmF0b3JDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPcmRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU9yZGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5HZW5lcmljSnBhRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5HZW5lcmljTWV0YW1vZGVsU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFDb2xsZWN0aW9uVGFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhRGVyaXZlZElkZW50aXR5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU5hbWVkUXVlcnkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhT3JkZXJDb2x1bW4yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhT3JwaGFuUmVtb3ZhbDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5KcGFGYWN0b3J5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLkpwYVByb2plY3QyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NZXRhbW9kZWxTb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJhYmxlMl8wLk93bmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ29sbGVjdGlvblRhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRGVyaXZlZElkZW50aXR5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JkZXJDb2x1bW4yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcmRlcmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmsgMi4wIGZhY3RvcnkKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSnBhRmFjdG9yeQotCWV4dGVuZHMgRWNsaXBzZUxpbmtKcGFGYWN0b3J5Ci0JaW1wbGVtZW50cyBKcGFGYWN0b3J5Ml8wCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rMl8wSnBhRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBDb3JlIE1vZGVsICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRWNsaXBzZUxpbmtKcGFQcm9qZWN0IGJ1aWxkSnBhUHJvamVjdChDb25maWcgY29uZmlnKSB7Ci0JCWlmICggISAoY29uZmlnIGluc3RhbmNlb2YgSnBhUHJvamVjdDJfMC5Db25maWcpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb25maWcgbXVzdCBiZSAyLjAtY29tcGF0aWJsZTogIiArIGNvbmZpZyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc3VwZXIuYnVpbGRKcGFQcm9qZWN0KGNvbmZpZyk7Ci0JfQotCQotCXB1YmxpYyBNZXRhbW9kZWxTb3VyY2VUeXBlLlN5bmNocm9uaXplciBidWlsZE1ldGFtb2RlbFN5bmNocm9uaXplcihNZXRhbW9kZWxTb3VyY2VUeXBlIHNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljTWV0YW1vZGVsU3luY2hyb25pemVyKHNvdXJjZVR5cGUpOwotCX0KLQkKLQlwdWJsaWMgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlciBidWlsZERhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIoSnBhRGF0YVNvdXJjZSBkYXRhU291cmNlKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0pwYURhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIoZGF0YVNvdXJjZSk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBKYXZhIENvbnRleHQgTW9kZWwgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBidWlsZEphdmFQZXJzaXN0ZW50VHlwZShQZXJzaXN0ZW50VHlwZS5Pd25lciBvd25lciwgSmF2YVJlc291cmNlVHlwZSBqcnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlMl8wKG93bmVyLCBqcnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkSmF2YVNlcXVlbmNlR2VuZXJhdG9yKEphdmFHZW5lcmF0b3JDb250YWluZXIgcGFyZW50LCBTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IyXzAocGFyZW50LCAoU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKTsKLQl9Ci0KLQkvL1RoZSAyLjAgSlBBIHNwZWMgc3VwcG9ydHMgYXNzb2NpYXRpb24gb3ZlcnJpZGVzIG9uIGFuIGVtYmVkZGVkIG1hcHBpbmcgd2hpbGUgdGhlIDEuMCBzcGVjIGRpZCBub3QKLQlwdWJsaWMgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYnVpbGRKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcihKYXZhRW1iZWRkZWRNYXBwaW5nMl8wIHBhcmVudCwgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuT3duZXIgb3duZXIpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIocGFyZW50LCBvd25lcik7Ci0JfQotCQotCXB1YmxpYyBKYXZhRGVyaXZlZElkZW50aXR5Ml8wIGJ1aWxkSmF2YURlcml2ZWRJZGVudGl0eShKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YURlcml2ZWRJZGVudGl0eTJfMChwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBidWlsZEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhQ2FjaGVhYmxlMl8wIGJ1aWxkSmF2YUNhY2hlYWJsZShKYXZhQ2FjaGVhYmxlSG9sZGVyMl8wIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhQ2FjaGVhYmxlMl8wKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIGJ1aWxkSmF2YU9ycGhhblJlbW92YWwoSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzAgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFPcnBoYW5SZW1vdmFsMl8wKHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFOYW1lZFF1ZXJ5IGJ1aWxkSmF2YU5hbWVkUXVlcnkoSmF2YVF1ZXJ5Q29udGFpbmVyIHBhcmVudCwgTmFtZWRRdWVyeUFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTmFtZWRRdWVyeTJfMChwYXJlbnQsIChOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbikgYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIEphdmFDb2xsZWN0aW9uVGFibGUyXzAgYnVpbGRKYXZhQ29sbGVjdGlvblRhYmxlKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgcGFyZW50LCBUYWJsZS5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhQ29sbGVjdGlvblRhYmxlMl8wKHBhcmVudCwgb3duZXIpOwotCX0KLQotCXB1YmxpYyBKYXZhT3JkZXJDb2x1bW4yXzAgYnVpbGRKYXZhT3JkZXJDb2x1bW4oSmF2YU9yZGVyYWJsZTJfMCBwYXJlbnQsIEphdmFSZWFkT25seU5hbWVkQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFPcmRlckNvbHVtbjJfMChwYXJlbnQsIG93bmVyKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUNvbHVtbiBidWlsZEphdmFNYXBLZXlDb2x1bW4oSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgSmF2YUNvbHVtbi5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhQ29sdW1uKHBhcmVudCwgb3duZXIpOwotCX0KLQotCXB1YmxpYyBKYXZhT3JkZXJhYmxlMl8wIGJ1aWxkSmF2YU9yZGVyYWJsZShKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIE93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFPcmRlcmFibGUocGFyZW50LCBvd25lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFPcmRlcmFibGUgYnVpbGRKYXZhT3JkZXJhYmxlKEphdmFBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc1ODUwOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm1WYXJpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5KcGFBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuR2VuZXJpYzJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybUZhY3RvcnkuRWNsaXBzZUxpbmtWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnBhcnNlci5FY2xpcHNlTGlua0pQUUxHcmFtbWFyMl8wOwotCi0vKioKLSAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIEpQQSBwbGF0Zm9ybSBzaG91bGQgYmUgInN0YXRpYyIgKGkuZS4gdW5jaGFuZ2luZyBvbmNlCi0gKiBpdCBpcyBpbml0aWFsaXplZCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtRmFjdG9yeQotCWltcGxlbWVudHMgSnBhUGxhdGZvcm1GYWN0b3J5Ci17Ci0JLyoqCi0JICogemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnBhUGxhdGZvcm0gYnVpbGRKcGFQbGF0Zm9ybShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhUGxhdGZvcm0oCi0JCQlpZCwKLQkJCWJ1aWxkSnBhVmVyc2lvbigpLAotCQkJbmV3IEVjbGlwc2VMaW5rMl8wSnBhRmFjdG9yeSgpLAotCQkJdGhpcy5idWlsZEFubm90YXRpb25Qcm92aWRlcigpLAotCQkJRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQl0aGlzLmJ1aWxkSnBhVmFyaWF0aW9uKCksCi0JCQlFY2xpcHNlTGlua0pQUUxHcmFtbWFyMl8wLmluc3RhbmNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybS5WZXJzaW9uIGJ1aWxkSnBhVmVyc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1ZlcnNpb24oCi0JCQkJSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX1BMQVRGT1JNX1ZFUlNJT05fMl8wLAotCQkJCUpwYUZhY2V0LlZFUlNJT05fMl8wLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb25Qcm92aWRlciBidWlsZEFubm90YXRpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKcGFBbm5vdGF0aW9uUHJvdmlkZXIoCi0JCQlHZW5lcmljMl8wSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpLAotCQkJRWNsaXBzZUxpbmsyXzBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybVZhcmlhdGlvbiBidWlsZEpwYVZhcmlhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKLQkJCXB1YmxpYyBTdXBwb3J0ZWQgZ2V0VGFibGVQZXJDb25jcmV0ZUNsYXNzSW5oZXJpdGFuY2VJc1N1cHBvcnRlZCgpIHsKLQkJCQlyZXR1cm4gU3VwcG9ydGVkLllFUzsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIGlzSm9pblRhYmxlT3ZlcnJpZGFibGUoKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgQWNjZXNzVHlwZVtdIGdldFN1cHBvcnRlZEFjY2Vzc1R5cGVzKEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJCQlyZXR1cm4gR0VORVJJQ19TVVBQT1JURURfQUNDRVNTX1RZUEVTOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2ZhMzM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtUHJvdmlkZXI7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rIDIuMCBwbGF0Zm9ybSBjb25maWcKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1Qcm92aWRlcgotCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFQbGF0Zm9ybVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1Qcm92aWRlcigpOwotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1Qcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rMl8xSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmsyXzFKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YTBlOTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmsyXzFKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yMl8xQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uOwotCi0vKioKLSAqIFByb3ZpZGVzIGFubm90YXRpb25zIGZvciAyLjEgRWNsaXBzZUxpbmsgcGxhdGZvcm0KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8xSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcgotCWV4dGVuZHMgQWJzdHJhY3RKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGluazJfMUpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rMl8xSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIEFOTk9UQVRJT05fREVGSU5JVElPTlMpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb25bXSBBTk5PVEFUSU9OX0RFRklOSVRJT05TID0gbmV3IEFubm90YXRpb25EZWZpbml0aW9uW10gewotCQlFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3IyXzFBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpCi0JfTsKLQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgTkVTVEFCTEVfQU5OT1RBVElPTl9ERUZJTklUSU9OUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uW10gTkVTVEFCTEVfQU5OT1RBVElPTl9ERUZJTklUSU9OUyA9IG5ldyBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uW10gewotCQlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQl9OwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ4ZDkyZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgIE9yYWNsZS4KLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiAgQ29udHJpYnV0b3JzOgotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm1WYXJpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5KcGFBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuR2VuZXJpYzJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0FjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhUGxhdGZvcm1GYWN0b3J5LkVjbGlwc2VMaW5rVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5wYXJzZXIuRWNsaXBzZUxpbmtKUFFMR3JhbW1hcjJfMTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1GYWN0b3J5Ci0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtRmFjdG9yeQotewotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYVBsYXRmb3JtIGJ1aWxkSnBhUGxhdGZvcm0oU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0pwYVBsYXRmb3JtKAotCQkJaWQsCi0JCQlidWlsZEpwYVZlcnNpb24oKSwKLQkJCW5ldyBFY2xpcHNlTGluazJfMEpwYUZhY3RvcnkoKSwKLQkJCXRoaXMuYnVpbGRBbm5vdGF0aW9uUHJvdmlkZXIoKSwKLQkJCUVjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1Qcm92aWRlci5pbnN0YW5jZSgpLAotCQkJdGhpcy5idWlsZEpwYVZhcmlhdGlvbigpLAotCQkJRWNsaXBzZUxpbmtKUFFMR3JhbW1hcjJfMS5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm0uVmVyc2lvbiBidWlsZEpwYVZlcnNpb24oKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtWZXJzaW9uKAotCQkJCUpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzJfMSwKLQkJCQlKcGFGYWNldC5WRVJTSU9OXzJfMC5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBbm5vdGF0aW9uUHJvdmlkZXIgYnVpbGRBbm5vdGF0aW9uUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSnBhQW5ub3RhdGlvblByb3ZpZGVyKAotCQkJR2VuZXJpYzJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCUVjbGlwc2VMaW5rMl8xSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1WYXJpYXRpb24gYnVpbGRKcGFWYXJpYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgSnBhUGxhdGZvcm1WYXJpYXRpb24oKSB7Ci0JCQlwdWJsaWMgU3VwcG9ydGVkIGdldFRhYmxlUGVyQ29uY3JldGVDbGFzc0luaGVyaXRhbmNlSXNTdXBwb3J0ZWQoKSB7Ci0JCQkJcmV0dXJuIFN1cHBvcnRlZC5ZRVM7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiBpc0pvaW5UYWJsZU92ZXJyaWRhYmxlKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcHVibGljIEFjY2Vzc1R5cGVbXSBnZXRTdXBwb3J0ZWRBY2Nlc3NUeXBlcyhKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCQkJaWYgKHJlc291cmNlVHlwZS5nZXRDb250ZW50VHlwZSgpID09IEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSkgewotCQkJCQlpZiAodGhpcy52ZXJzaW9uSXNFY2xpcHNlTGluazJfMUNvbXBhdGliaWxlKHJlc291cmNlVHlwZSkpIHsKLQkJCQkJCXJldHVybiBFQ0xJUFNFTElOS19TVVBQT1JURURfQUNDRVNTX1RZUEVTOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBHRU5FUklDX1NVUFBPUlRFRF9BQ0NFU1NfVFlQRVM7Ci0JCQl9Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJzaW9uSXNFY2xpcHNlTGluazJfMUNvbXBhdGliaWxlKEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5yZXNvdXJjZVR5cGVJc0NvbXBhdGlibGUocmVzb3VyY2VUeXBlLCBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8yXzFfUkVTT1VSQ0VfVFlQRS5nZXRWZXJzaW9uKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQWNjZXNzVHlwZVtdIEVDTElQU0VMSU5LX1NVUFBPUlRFRF9BQ0NFU1NfVFlQRVMgPSBuZXcgQWNjZXNzVHlwZVtdIHtBY2Nlc3NUeXBlLkZJRUxELCBBY2Nlc3NUeXBlLlBST1BFUlRZLCBFY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTH07Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE1ZWQzMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5SZXNvdXJjZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWwyXzFEZWZpbml0aW9uOwotCi0vKioKLSAqICBFY2xpcHNlTGluayAyLjEgcGxhdGZvcm0gY29uZmlnCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtUHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0RWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1Qcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtUHJvdmlkZXIoKTsKLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIG1vZGVscyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCWlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzJfMV9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRNb3N0UmVjZW50U3VwcG9ydGVkUmVzb3VyY2VUeXBlKGNvbnRlbnRUeXBlKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIGRlZmluaXRpb25zICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8UmVzb3VyY2VEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlzdXBlci5hZGRSZXNvdXJjZURlZmluaXRpb25zVG8oZGVmaW5pdGlvbnMpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWwyXzFEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rMl8ySnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmsyXzJKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMjg2ZGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmsyXzJKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yMl8xQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRlcnMyXzJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJzMl8yQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJzMl8yQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb247Ci0KLS8qKgotICogUHJvdmlkZXMgYW5ub3RhdGlvbnMgZm9yIDIuMyBFY2xpcHNlTGluayBwbGF0Zm9ybQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzJKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rMl8ySnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmsyXzJKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZEFubm90YXRpb25EZWZpbml0aW9uc1RvKEFycmF5TGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgQU5OT1RBVElPTl9ERUZJTklUSU9OUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbltdIEFOTk9UQVRJT05fREVGSU5JVElPTlMgPSBuZXcgQW5ub3RhdGlvbkRlZmluaXRpb25bXSB7Ci0JCUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvcjJfMUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rQ29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcnMyXzJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJzMl8yQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKQotCX07Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uc1RvKEFycmF5TGlzdDxOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBORVNUQUJMRV9BTk5PVEFUSU9OX0RFRklOSVRJT05TKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25bXSBORVNUQUJMRV9BTk5PVEFUSU9OX0RFRklOSVRJT05TID0gbmV3IE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25bXSB7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCX07Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rMl8ySnBhUGxhdGZvcm1GYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazJfMkpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTdhMmQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rMl8ySnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiAgT3JhY2xlLgotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZQotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqICBDb250cmlidXRvcnM6Ci0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5Bbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybVZhcmlhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5HZW5lcmljMl8wSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVBsYXRmb3JtRmFjdG9yeS5FY2xpcHNlTGlua1ZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwucGFyc2VyLkVjbGlwc2VMaW5rSlBRTEdyYW1tYXIyXzI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMkpwYVBsYXRmb3JtRmFjdG9yeQotCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybUZhY3RvcnkKLXsKLQkvKioKLQkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rMl8ySnBhUGxhdGZvcm1GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFQbGF0Zm9ybSBidWlsZEpwYVBsYXRmb3JtKFN0cmluZyBpZCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFQbGF0Zm9ybSgKLQkJCWlkLAotCQkJYnVpbGRKcGFWZXJzaW9uKCksCi0JCQluZXcgRWNsaXBzZUxpbmsyXzBKcGFGYWN0b3J5KCksCi0JCQl0aGlzLmJ1aWxkQW5ub3RhdGlvblByb3ZpZGVyKCksCi0JCQlFY2xpcHNlTGluazJfMkpwYVBsYXRmb3JtUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCXRoaXMuYnVpbGRKcGFWYXJpYXRpb24oKSwKLQkJCUVjbGlwc2VMaW5rSlBRTEdyYW1tYXIyXzIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtLlZlcnNpb24gYnVpbGRKcGFWZXJzaW9uKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rVmVyc2lvbigKLQkJCQlKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfUExBVEZPUk1fVkVSU0lPTl8yXzIsCi0JCQkJSnBhRmFjZXQuVkVSU0lPTl8yXzAuZ2V0VmVyc2lvblN0cmluZygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvblByb3ZpZGVyIGJ1aWxkQW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEpwYUFubm90YXRpb25Qcm92aWRlcigKLQkJCUdlbmVyaWMyXzBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlFY2xpcHNlTGluazJfMkpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtVmFyaWF0aW9uIGJ1aWxkSnBhVmFyaWF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkgewotCQkJcHVibGljIFN1cHBvcnRlZCBnZXRUYWJsZVBlckNvbmNyZXRlQ2xhc3NJbmhlcml0YW5jZUlzU3VwcG9ydGVkKCkgewotCQkJCXJldHVybiBTdXBwb3J0ZWQuWUVTOwotCQkJfQotCQkJcHVibGljIGJvb2xlYW4gaXNKb2luVGFibGVPdmVycmlkYWJsZSgpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyBBY2Nlc3NUeXBlW10gZ2V0U3VwcG9ydGVkQWNjZXNzVHlwZXMoSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQkJCWlmIChyZXNvdXJjZVR5cGUuZ2V0Q29udGVudFR5cGUoKSA9PSBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUpIHsKLQkJCQkJaWYgKHRoaXMudmVyc2lvbklzRWNsaXBzZUxpbmsyXzFDb21wYXRpYmlsZShyZXNvdXJjZVR5cGUpKSB7Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybUZhY3RvcnkuRUNMSVBTRUxJTktfU1VQUE9SVEVEX0FDQ0VTU19UWVBFUzsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gR0VORVJJQ19TVVBQT1JURURfQUNDRVNTX1RZUEVTOwotCQkJfQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gdmVyc2lvbklzRWNsaXBzZUxpbmsyXzFDb21wYXRpYmlsZShKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4ucmVzb3VyY2VUeXBlSXNDb21wYXRpYmxlKHJlc291cmNlVHlwZSwgSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMl8xX1JFU09VUkNFX1RZUEUuZ2V0VmVyc2lvbigpKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmsyXzJKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazJfMkpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQxY2FmYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazJfMkpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLlJlc291cmNlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUVudGl0eURlZmluaXRpb24yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFJZE1hcHBpbmdEZWZpbml0aW9uMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YVRyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sMl8xRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWwyXzJEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzJKcGFQbGF0Zm9ybVByb3ZpZGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1Qcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmsyXzJKcGFQbGF0Zm9ybVByb3ZpZGVyKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rMl8ySnBhUGxhdGZvcm1Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSBtb2RlbHMgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUgZ2V0TW9zdFJlY2VudFN1cHBvcnRlZFJlc291cmNlVHlwZShJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMl8yX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoY29udGVudFR5cGUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHJlc291cmNlIGRlZmluaXRpb25zICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8UmVzb3VyY2VEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlzdXBlci5hZGRSZXNvdXJjZURlZmluaXRpb25zVG8oZGVmaW5pdGlvbnMpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBSRVNPVVJDRV9ERUZJTklUSU9OUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSZXNvdXJjZURlZmluaXRpb25bXSBSRVNPVVJDRV9ERUZJTklUSU9OUyA9IG5ldyBSZXNvdXJjZURlZmluaXRpb25bXSB7Ci0JCUVjbGlwc2VMaW5rT3JtWG1sMl8xRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua09ybVhtbDJfMkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQl9OwotCi0KLQkvLyAqKioqKioqKiogSmF2YSB0eXBlIG1hcHBpbmdzICoqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgSkFWQV9UWVBFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8vIG9yZGVyIG1hdGNoZXMgdGhhdCB1c2VkIGJ5IEVjbGlwc2VMaW5rCi0JLy8gTkI6IG5vIEVjbGlwc2VMaW5rLXNwZWNpZmljIG1hcHBpbmdzCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gSkFWQV9UWVBFX01BUFBJTkdfREVGSU5JVElPTlMgPSBuZXcgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJRWNsaXBzZUxpbmtKYXZhRW50aXR5RGVmaW5pdGlvbjJfMi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFFbWJlZGRhYmxlRGVmaW5pdGlvbjJfMi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjJfMi5pbnN0YW5jZSgpCi0JfTsKLQotCS8vICoqKioqKioqKiBKYXZhIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIERFRkFVTFRfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLy8gb3JkZXIgbWF0Y2hlcyB0aGF0IHVzZWQgYnkgRWNsaXBzZUxpbmsKLQkvLyBOQjogbm8gY2hhbmdlIGZyb20gRWNsaXBzZUxpbmsgMS4yIHRvIDIuMAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIERFRkFVTFRfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQlFY2xpcHNlTGlua0phdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uMl8yLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8yLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzIuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24yXzIuaW5zdGFuY2UoKQotCX07Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgU1BFQ0lGSUVEX0pBVkFfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8vIG9yZGVyIG1hdGNoZXMgdGhhdCB1c2VkIGJ5IEVjbGlwc2VMaW5rCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBTUEVDSUZJRURfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCUphdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24yXzIuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjJfMi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24yXzIuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjJfMi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uMl8yLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjJfMi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8yLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YVZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpCi0JfTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmsyXzNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazJfM0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk4ZjRmNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazJfM0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0FycmF5Ml8zQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yMl8xQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRlcnMyXzJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua011bHRpdGVuYW50Ml8zQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcnMyXzJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdHVyZTJfM0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfM0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMyXzNBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uOwotCi0vKioKLSAqIFByb3ZpZGVzIGFubm90YXRpb25zIGZvciAyLjMgRWNsaXBzZUxpbmsgcGxhdGZvcm0KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8zSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcgotCWV4dGVuZHMgQWJzdHJhY3RKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGluazJfM0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rMl8zSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIEFOTk9UQVRJT05fREVGSU5JVElPTlMpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb25bXSBBTk5PVEFUSU9OX0RFRklOSVRJT05TID0gbmV3IEFubm90YXRpb25EZWZpbml0aW9uW10gewotCQlFY2xpcHNlTGlua0FycmF5Ml8zQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yMl8xQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJzMl8yQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtNdWx0aXRlbmFudDJfM0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcnMyXzJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rU3RydWN0dXJlMl8zQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uczJfM0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJzMl8yQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKQotCX07Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uc1RvKEFycmF5TGlzdDxOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBORVNUQUJMRV9BTk5PVEFUSU9OX0RFRklOSVRJT05TKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25bXSBORVNUQUJMRV9BTk5PVEFUSU9OX0RFRklOSVRJT05TID0gbmV3IE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25bXSB7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzNBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCX07Ci0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmsyXzNKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rMl8zSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNTdhZDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmsyXzNKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogIENvbnRyaWJ1dG9yczoKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtVmFyaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSnBhQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLkdlbmVyaWMyXzBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhUGxhdGZvcm1GYWN0b3J5LkVjbGlwc2VMaW5rVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5wYXJzZXIuRWNsaXBzZUxpbmtKUFFMR3JhbW1hcjJfMzsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8zSnBhUGxhdGZvcm1GYWN0b3J5Ci0JCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybUZhY3RvcnkgewotCi0JLyoqCi0JICogemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGluazJfM0pwYVBsYXRmb3JtRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhUGxhdGZvcm0gYnVpbGRKcGFQbGF0Zm9ybShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhUGxhdGZvcm0oCi0JCQlpZCwKLQkJCWJ1aWxkSnBhVmVyc2lvbigpLAotCQkJbmV3IEVjbGlwc2VMaW5rMl8wSnBhRmFjdG9yeSgpLAotCQkJYnVpbGRBbm5vdGF0aW9uUHJvdmlkZXIoKSwKLQkJCUVjbGlwc2VMaW5rMl8zSnBhUGxhdGZvcm1Qcm92aWRlci5pbnN0YW5jZSgpLAotCQkJYnVpbGRKcGFWYXJpYXRpb24oKSwKLQkJCUVjbGlwc2VMaW5rSlBRTEdyYW1tYXIyXzMuaW5zdGFuY2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtLlZlcnNpb24gYnVpbGRKcGFWZXJzaW9uKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rVmVyc2lvbigKLQkJCQlKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfUExBVEZPUk1fVkVSU0lPTl8yXzMsCi0JCQkJSnBhRmFjZXQuVkVSU0lPTl8yXzAuZ2V0VmVyc2lvblN0cmluZygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvblByb3ZpZGVyIGJ1aWxkQW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEpwYUFubm90YXRpb25Qcm92aWRlcigKLQkJCQlHZW5lcmljMl8wSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpLAotCQkJCUVjbGlwc2VMaW5rMl8zSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1WYXJpYXRpb24gYnVpbGRKcGFWYXJpYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgSnBhUGxhdGZvcm1WYXJpYXRpb24oKSB7Ci0JCQlwdWJsaWMgU3VwcG9ydGVkIGdldFRhYmxlUGVyQ29uY3JldGVDbGFzc0luaGVyaXRhbmNlSXNTdXBwb3J0ZWQoKSB7Ci0JCQkJcmV0dXJuIFN1cHBvcnRlZC5ZRVM7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiBpc0pvaW5UYWJsZU92ZXJyaWRhYmxlKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcHVibGljIEFjY2Vzc1R5cGVbXSBnZXRTdXBwb3J0ZWRBY2Nlc3NUeXBlcyhKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCQkJaWYgKHJlc291cmNlVHlwZS5nZXRDb250ZW50VHlwZSgpID09IEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSkgewotCQkJCQlpZiAodGhpcy52ZXJzaW9uSXNFY2xpcHNlTGluazJfMUNvbXBhdGliaWxlKHJlc291cmNlVHlwZSkpIHsKLQkJCQkJCXJldHVybiBFY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtRmFjdG9yeS5FQ0xJUFNFTElOS19TVVBQT1JURURfQUNDRVNTX1RZUEVTOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBHRU5FUklDX1NVUFBPUlRFRF9BQ0NFU1NfVFlQRVM7Ci0JCQl9Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJzaW9uSXNFY2xpcHNlTGluazJfMUNvbXBhdGliaWxlKEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5yZXNvdXJjZVR5cGVJc0NvbXBhdGlibGUocmVzb3VyY2VUeXBlLCBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8yXzFfUkVTT1VSQ0VfVFlQRS5nZXRWZXJzaW9uKCkpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazJfM0pwYVBsYXRmb3JtUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rMl8zSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzQwNTVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rMl8zSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5SZXNvdXJjZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhQXJyYXlNYXBwaW5nRGVmaW5pdGlvbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUJhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZURlZmluaXRpb24yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhRW50aXR5RGVmaW5pdGlvbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ0RlZmluaXRpb24yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhU3RydWN0dXJlTWFwcGluZ0RlZmluaXRpb24yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVhtbDJfMURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sMl8yRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWwyXzNEZWZpbml0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfM0pwYVBsYXRmb3JtUHJvdmlkZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1Qcm92aWRlciB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1Qcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGluazJfM0pwYVBsYXRmb3JtUHJvdmlkZXIoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1Qcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmsyXzNKcGFQbGF0Zm9ybVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHJlc291cmNlIG1vZGVscyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRNb3N0UmVjZW50U3VwcG9ydGVkUmVzb3VyY2VUeXBlKElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8yXzNfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TW9zdFJlY2VudFN1cHBvcnRlZFJlc291cmNlVHlwZShjb250ZW50VHlwZSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxSZXNvdXJjZURlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCXN1cGVyLmFkZFJlc291cmNlRGVmaW5pdGlvbnNUbyhkZWZpbml0aW9ucyk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIFJFU09VUkNFX0RFRklOSVRJT05TKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJlc291cmNlRGVmaW5pdGlvbltdIFJFU09VUkNFX0RFRklOSVRJT05TID0gbmV3IFJlc291cmNlRGVmaW5pdGlvbltdIHsKLQkJRWNsaXBzZUxpbmtPcm1YbWwyXzFEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rT3JtWG1sMl8yRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua09ybVhtbDJfM0RlZmluaXRpb24uaW5zdGFuY2UoKQotCX07Ci0KLQkvLyAqKioqKioqKiogSmF2YSB0eXBlIG1hcHBpbmdzICoqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgSkFWQV9UWVBFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8vIG9yZGVyIG1hdGNoZXMgdGhhdCB1c2VkIGJ5IEVjbGlwc2VMaW5rCi0JLy8gTkI6IG5vIEVjbGlwc2VMaW5rLXNwZWNpZmljIG1hcHBpbmdzCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gSkFWQV9UWVBFX01BUFBJTkdfREVGSU5JVElPTlMgPSBuZXcgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJRWNsaXBzZUxpbmtKYXZhRW50aXR5RGVmaW5pdGlvbjJfMy5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFFbWJlZGRhYmxlRGVmaW5pdGlvbjJfMi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjJfMy5pbnN0YW5jZSgpCi0JfTsKLQotCi0JLy8gKioqKioqKioqIEphdmEgYXR0cmlidXRlIG1hcHBpbmdzICoqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgREVGQVVMVF9KQVZBX0FUVFJJQlVURV9NQVBQSU5HX0RFRklOSVRJT05TKTsKLQl9Ci0KLQkvLyBvcmRlciBtYXRjaGVzIHRoYXQgdXNlZCBieSBFY2xpcHNlTGluawotCS8vIE5COiBubyBjaGFuZ2UgZnJvbSBFY2xpcHNlTGluayAxLjIgdG8gMi4wCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gREVGQVVMVF9KQVZBX0FUVFJJQlVURV9NQVBQSU5HX0RFRklOSVRJT05TID0gbmV3IERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCUVjbGlwc2VMaW5rSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24yXzIuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzIuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjJfMi5pbnN0YW5jZSgpCi0JfTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBTUEVDSUZJRURfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLy8gb3JkZXIgbWF0Y2hlcyB0aGF0IHVzZWQgYnkgRWNsaXBzZUxpbmsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIFNQRUNJRklFRF9KQVZBX0FUVFJJQlVURV9NQVBQSU5HX0RFRklOSVRJT05TID0gbmV3IEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YUJhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhQXJyYXlNYXBwaW5nRGVmaW5pdGlvbjJfMy5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8yLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ0RlZmluaXRpb24yXzIuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uMl8yLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24yXzIuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhU3RydWN0dXJlTWFwcGluZ0RlZmluaXRpb24yXzMuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjJfMi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24yXzIuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzIuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzIuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzIuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKQotCX07Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazJfNEpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmsyXzRKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2M2EwMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGluazJfNEpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiAgQ29udHJpYnV0b3JzOgotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm1WYXJpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5KcGFBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuR2VuZXJpYzJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybUZhY3RvcnkuRWNsaXBzZUxpbmtWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnBhcnNlci5FY2xpcHNlTGlua0pQUUxHcmFtbWFyMl80OwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzRKcGFQbGF0Zm9ybUZhY3RvcnkKLQkJZXh0ZW5kcyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rMl80SnBhUGxhdGZvcm1GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFQbGF0Zm9ybSBidWlsZEpwYVBsYXRmb3JtKFN0cmluZyBpZCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFQbGF0Zm9ybSgKLQkJCWlkLAotCQkJYnVpbGRKcGFWZXJzaW9uKCksCi0JCQluZXcgRWNsaXBzZUxpbmsyXzBKcGFGYWN0b3J5KCksCi0JCQlidWlsZEFubm90YXRpb25Qcm92aWRlcigpLAotCQkJRWNsaXBzZUxpbmsyXzRKcGFQbGF0Zm9ybVByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlidWlsZEpwYVZhcmlhdGlvbigpLAotCQkJRWNsaXBzZUxpbmtKUFFMR3JhbW1hcjJfNC5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm0uVmVyc2lvbiBidWlsZEpwYVZlcnNpb24oKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtWZXJzaW9uKAotCQkJCUpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzJfNCwKLQkJCQlKcGFGYWNldC5WRVJTSU9OXzJfMC5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBbm5vdGF0aW9uUHJvdmlkZXIgYnVpbGRBbm5vdGF0aW9uUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSnBhQW5ub3RhdGlvblByb3ZpZGVyKAotCQkJCUdlbmVyaWMyXzBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQkJRWNsaXBzZUxpbmsyXzNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybVZhcmlhdGlvbiBidWlsZEpwYVZhcmlhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKLQkJCXB1YmxpYyBTdXBwb3J0ZWQgZ2V0VGFibGVQZXJDb25jcmV0ZUNsYXNzSW5oZXJpdGFuY2VJc1N1cHBvcnRlZCgpIHsKLQkJCQlyZXR1cm4gU3VwcG9ydGVkLllFUzsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIGlzSm9pblRhYmxlT3ZlcnJpZGFibGUoKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgQWNjZXNzVHlwZVtdIGdldFN1cHBvcnRlZEFjY2Vzc1R5cGVzKEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJCQlpZiAocmVzb3VyY2VUeXBlLmdldENvbnRlbnRUeXBlKCkgPT0gSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFKSB7Ci0JCQkJCWlmICh0aGlzLnZlcnNpb25Jc0VjbGlwc2VMaW5rMl8xQ29tcGF0aWJpbGUocmVzb3VyY2VUeXBlKSkgewotCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1GYWN0b3J5LkVDTElQU0VMSU5LX1NVUFBPUlRFRF9BQ0NFU1NfVFlQRVM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIEdFTkVSSUNfU1VQUE9SVEVEX0FDQ0VTU19UWVBFUzsKLQkJCX0KLQkJCXByb3RlY3RlZCBib29sZWFuIHZlcnNpb25Jc0VjbGlwc2VMaW5rMl8xQ29tcGF0aWJpbGUoSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQkJCXJldHVybiBKcHRKcGFDb3JlUGx1Z2luLnJlc291cmNlVHlwZUlzQ29tcGF0aWJsZShyZXNvdXJjZVR5cGUsIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzJfMV9SRVNPVVJDRV9UWVBFLmdldFZlcnNpb24oKSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rMl80SnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmsyXzRKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NGRmMjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmsyXzRKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLlJlc291cmNlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFBcnJheU1hcHBpbmdEZWZpbml0aW9uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFFbWJlZGRhYmxlRGVmaW5pdGlvbjJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFFbnRpdHlEZWZpbml0aW9uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFTdHJ1Y3R1cmVNYXBwaW5nRGVmaW5pdGlvbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YVRyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sMl8xRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWwyXzJEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVhtbDJfM0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sMl80RGVmaW5pdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzRKcGFQbGF0Zm9ybVByb3ZpZGVyCi0JCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIgewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1Qcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGluazJfNEpwYVBsYXRmb3JtUHJvdmlkZXIoKTsKLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGluazJfNEpwYVBsYXRmb3JtUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIG1vZGVscyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCWlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzJfNF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRNb3N0UmVjZW50U3VwcG9ydGVkUmVzb3VyY2VUeXBlKGNvbnRlbnRUeXBlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxSZXNvdXJjZURlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCXN1cGVyLmFkZFJlc291cmNlRGVmaW5pdGlvbnNUbyhkZWZpbml0aW9ucyk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIFJFU09VUkNFX0RFRklOSVRJT05TKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJlc291cmNlRGVmaW5pdGlvbltdIFJFU09VUkNFX0RFRklOSVRJT05TID0gbmV3IFJlc291cmNlRGVmaW5pdGlvbltdIHsKLQkJRWNsaXBzZUxpbmtPcm1YbWwyXzFEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rT3JtWG1sMl8yRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua09ybVhtbDJfM0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtPcm1YbWwyXzREZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotCi0JLy8gKioqKioqKioqIEphdmEgdHlwZSBtYXBwaW5ncyAqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIEpBVkFfVFlQRV9NQVBQSU5HX0RFRklOSVRJT05TKTsKLQl9Ci0KLQkvLyBvcmRlciBtYXRjaGVzIHRoYXQgdXNlZCBieSBFY2xpcHNlTGluawotCS8vIE5COiBubyBFY2xpcHNlTGluay1zcGVjaWZpYyBtYXBwaW5ncwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIEpBVkFfVFlQRV9NQVBQSU5HX0RFRklOSVRJT05TID0gbmV3IEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCUVjbGlwc2VMaW5rSmF2YUVudGl0eURlZmluaXRpb24yXzMuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZURlZmluaXRpb24yXzIuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24yXzMuaW5zdGFuY2UoKQotCX07Ci0KLQotCS8vICoqKioqKioqKiBKYXZhIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIERFRkFVTFRfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLy8gb3JkZXIgbWF0Y2hlcyB0aGF0IHVzZWQgYnkgRWNsaXBzZUxpbmsKLQkvLyBOQjogbm8gY2hhbmdlIGZyb20gRWNsaXBzZUxpbmsgMS4yIHRvIDIuMAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIERFRkFVTFRfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQlFY2xpcHNlTGlua0phdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uMl8yLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8yLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzIuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24yXzIuaW5zdGFuY2UoKQotCX07Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgU1BFQ0lGSUVEX0pBVkFfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8vIG9yZGVyIG1hdGNoZXMgdGhhdCB1c2VkIGJ5IEVjbGlwc2VMaW5rCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBTUEVDSUZJRURfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCUphdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YUFycmF5TWFwcGluZ0RlZmluaXRpb24yXzMuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFJZE1hcHBpbmdEZWZpbml0aW9uMl8yLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbjJfMi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uMl8yLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YVN0cnVjdHVyZU1hcHBpbmdEZWZpbml0aW9uMl8zLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24yXzIuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uMl8yLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YVRyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8yLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8yLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8yLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzIuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCkKLQl9OwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNjYTRmMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBQcm92aWRlcyBhbm5vdGF0aW9ucyBmb3IgMS4wIEVjbGlwc2VMaW5rIHBsYXRmb3JtCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0SnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIEFOTk9UQVRJT05fREVGSU5JVElPTlMpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb25bXSBBTk5PVEFUSU9OX0RFRklOSVRJT05TID0gbmV3IEFubm90YXRpb25EZWZpbml0aW9uW10gewotCQlFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uc1RvKEFycmF5TGlzdDxOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBORVNUQUJMRV9BTk5PVEFUSU9OX0RFRklOSVRJT05TKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25bXSBORVNUQUJMRV9BTk5PVEFUSU9OX0RFRklOSVRJT05TID0gbmV3IE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25bXSB7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCX07Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODljNTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuQWNjZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuQWJzdHJhY3RKcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuU3BlY2lmaWVkSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmc7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0pwYUZhY3RvcnkKLQlleHRlbmRzIEFic3RyYWN0SnBhRmFjdG9yeQotewotCXB1YmxpYyBFY2xpcHNlTGlua0pwYUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvcmUgTW9kZWwgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFY2xpcHNlTGlua0pwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KEpwYVByb2plY3QuQ29uZmlnIGNvbmZpZykgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rSnBhUHJvamVjdEltcGwoY29uZmlnKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIEphdmEgQ29udGV4dCBNb2RlbCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoUGVyc2lzdGVudFR5cGUgcGFyZW50LCBBY2Nlc3NvciBhY2Nlc3NvcikgewotCQlyZXR1cm4gbmV3IFNwZWNpZmllZEphdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUocGFyZW50LCBhY2Nlc3Nvcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkSmF2YVBlcnNpc3RlbnRGaWVsZChQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQpIHsKLQkJcmV0dXJuIG5ldyBTcGVjaWZpZWRKYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlKHBhcmVudCwgcmVzb3VyY2VGaWVsZCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkSmF2YVBlcnNpc3RlbnRQcm9wZXJ0eShQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZUdldHRlciwgSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlU2V0dGVyKSB7Ci0JCXJldHVybiBuZXcgU3BlY2lmaWVkSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZShwYXJlbnQsIHJlc291cmNlR2V0dGVyLCByZXNvdXJjZVNldHRlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFCYXNpY01hcHBpbmcgYnVpbGRKYXZhQmFzaWNNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUVtYmVkZGFibGUgYnVpbGRKYXZhRW1iZWRkYWJsZShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50LCBFbWJlZGRhYmxlQW5ub3RhdGlvbiBlbWJlZGRhYmxlQW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGVJbXBsKHBhcmVudCwgZW1iZWRkYWJsZUFubm90YXRpb24pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rRW50aXR5IGJ1aWxkSmF2YUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50LCBFbnRpdHlBbm5vdGF0aW9uIGVudGl0eUFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtFbnRpdHlJbXBsKHBhcmVudCwgZW50aXR5QW5ub3RhdGlvbik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhSWRNYXBwaW5nIGJ1aWxkSmF2YUlkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgYnVpbGRKYXZhTWFwcGVkU3VwZXJjbGFzcyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50LCBNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbiBtYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NJbXBsKHBhcmVudCwgbWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVZlcnNpb25NYXBwaW5nIGJ1aWxkSmF2YVZlcnNpb25NYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhT25lVG9NYW55TWFwcGluZyBidWlsZEphdmFPbmVUb01hbnlNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFPbmVUb09uZU1hcHBpbmcgYnVpbGRKYXZhT25lVG9PbmVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YU1hbnlUb01hbnlNYXBwaW5nIGJ1aWxkSmF2YU1hbnlUb01hbnlNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhTWFueVRvT25lTWFwcGluZyBidWlsZEphdmFNYW55VG9PbmVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcocGFyZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmstc3BlY2lmaWMgSmF2YSBDb250ZXh0IE1vZGVsICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nIGJ1aWxkSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcgYnVpbGRKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgYnVpbGRKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nIGJ1aWxkSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYUpwcWxRdWVyeUhlbHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFKcHFsUXVlcnlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFmNGFhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYUpwcWxRdWVyeUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uCi0gKiBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBxbC5KcGFKcHFsUXVlcnlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuc3BpLklNYW5hZ2VkVHlwZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmpwcWwuc3BpLkVjbGlwc2VMaW5rTWFuYWdlZFR5cGVCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5qcHFsLnNwaS5FY2xpcHNlTGlua01hcHBpbmdCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLkFic3RyYWN0Q29udGVudEFzc2lzdFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuQWJzdHJhY3RHcmFtbWFyVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLkFic3RyYWN0U2VtYW50aWNWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuRGVmYXVsdFJlZmFjdG9yaW5nVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5FY2xpcHNlTGlua0NvbnRlbnRBc3Npc3RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLkVjbGlwc2VMaW5rR3JhbW1hclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5FY2xpcHNlTGlua0pQUUxRdWVyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuRWNsaXBzZUxpbmtTZW1hbnRpY1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5KUFFMUXVlcnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLlJlZmFjdG9yaW5nVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5tb2RlbC5FY2xpcHNlTGlua0pQUUxRdWVyeUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwubW9kZWwuSUpQUUxRdWVyeUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwucGFyc2VyLkpQUUxHcmFtbWFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JTWFwcGluZ0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklRdWVyeTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEpwYUpwcWxRdWVyeUhlbHBlcn0gdGhhdCBzdXBwb3J0cyBFY2xpcHNlTGluay4KLSAqCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjEKLSAqIEBhdXRob3IgUGFzY2FsIEZpbGlvbgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKcGFKcHFsUXVlcnlIZWxwZXIgZXh0ZW5kcyBKcGFKcHFsUXVlcnlIZWxwZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua0pwYUpwcWxRdWVyeUhlbHBlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0ganBxbEdyYW1tYXIgVGhlIGdyYW1tYXIgdGhhdCBkZWZpbmVzIGhvdyB0byBwYXJzZSBhIEpQUUwgcXVlcnkKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtKcGFKcHFsUXVlcnlIZWxwZXIoSlBRTEdyYW1tYXIganBxbEdyYW1tYXIpIHsKLQkJc3VwZXIoanBxbEdyYW1tYXIpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3RDb250ZW50QXNzaXN0VmlzaXRvciBidWlsZENvbnRlbnRBc3Npc3RWaXNpdG9yKEpQUUxRdWVyeUNvbnRleHQgcXVlcnlDb250ZXh0KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtDb250ZW50QXNzaXN0VmlzaXRvcihxdWVyeUNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3RHcmFtbWFyVmFsaWRhdG9yIGJ1aWxkR3JhbW1hclZhbGlkYXRvcihKUFFMUXVlcnlDb250ZXh0IHF1ZXJ5Q29udGV4dCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rR3JhbW1hclZhbGlkYXRvcihxdWVyeUNvbnRleHQuZ2V0R3JhbW1hcigpKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpQUUxRdWVyeUNvbnRleHQgYnVpbGRKUFFMUXVlcnlDb250ZXh0KEpQUUxHcmFtbWFyIGpwcWxHcmFtbWFyKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtKUFFMUXVlcnlDb250ZXh0KGpwcWxHcmFtbWFyKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElNYW5hZ2VkVHlwZUJ1aWxkZXIgYnVpbGRNYW5hZ2VkVHlwZUJ1aWxkZXIoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtNYW5hZ2VkVHlwZUJ1aWxkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElNYXBwaW5nQnVpbGRlcjxBdHRyaWJ1dGVNYXBwaW5nPiBidWlsZE1hcHBpbmdCdWlsZGVyKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rTWFwcGluZ0J1aWxkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSByaWdodCB7QGxpbmsgSUpQUUxRdWVyeUJ1aWxkZXJ9IGJhc2VkIG9uIHRoZSBKUFFMIGdyYW1tYXIuCi0JICoKLQkgKiBAcmV0dXJuIEEgbmV3IGNvbmNyZXRlIGluc3RhbmNlIG9mIHtAbGluayBJSlBRTFF1ZXJ5QnVpbGRlcn0KLQkgKi8KLQlwcm90ZWN0ZWQgSUpQUUxRdWVyeUJ1aWxkZXIgYnVpbGRRdWVyeUJ1aWxkZXIoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtKUFFMUXVlcnlCdWlsZGVyKGdldEdyYW1tYXIoKSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZWZhY3RvcmluZ1Rvb2wgYnVpbGRSZWZhY3RvcmluZ1Rvb2woKSB7Ci0KLQkJSVF1ZXJ5IHF1ZXJ5ID0gZ2V0UXVlcnkoKTsKLQotCQlyZXR1cm4gbmV3IERlZmF1bHRSZWZhY3RvcmluZ1Rvb2woCi0JCQlxdWVyeS5nZXRQcm92aWRlcigpLAotCQkJYnVpbGRRdWVyeUJ1aWxkZXIoKSwKLQkJCXF1ZXJ5LmdldEV4cHJlc3Npb24oKQotCQkpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3RTZW1hbnRpY1ZhbGlkYXRvciBidWlsZFNlbWFudGljVmFsaWRhdG9yKEpQUUxRdWVyeUNvbnRleHQgcXVlcnlDb250ZXh0KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtTZW1hbnRpY1ZhbGlkYXRvcihxdWVyeUNvbnRleHQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYVBsYXRmb3JtRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMwNjdhMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybVZhcmlhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhUGxhdGZvcm1GYWN0b3J5LlNpbXBsZVZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnBhcnNlci5FY2xpcHNlTGlua0pQUUxHcmFtbWFyMTsKLQotLyoqCi0gKiBBbGwgdGhlIHN0YXRlIGluIHRoZSBKUEEgcGxhdGZvcm0gc2hvdWxkIGJlICJzdGF0aWMiIChpLmUuIHVuY2hhbmdpbmcgb25jZQotICogaXQgaXMgaW5pdGlhbGl6ZWQpLgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybUZhY3RvcnkKLQlpbXBsZW1lbnRzIEpwYVBsYXRmb3JtRmFjdG9yeQotewotCi0JLyoqCi0JICogemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0pwYVBsYXRmb3JtRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnBhUGxhdGZvcm0gYnVpbGRKcGFQbGF0Zm9ybShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhUGxhdGZvcm0oCi0JCQlpZCwKLQkJCWJ1aWxkSnBhVmVyc2lvbigpLAotCQkJbmV3IEVjbGlwc2VMaW5rSnBhRmFjdG9yeSgpLAotCQkJYnVpbGRBbm5vdGF0aW9uUHJvdmlkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSnBhUGxhdGZvcm1Qcm92aWRlci5pbnN0YW5jZSgpLAotCQkJYnVpbGRKcGFQbGF0Zm9ybVZhcmlhdGlvbigpLAotCQkJRWNsaXBzZUxpbmtKUFFMR3JhbW1hcjEuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBKcGFQbGF0Zm9ybS5WZXJzaW9uIGJ1aWxkSnBhVmVyc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1ZlcnNpb24oCi0JCQkJSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX1BMQVRGT1JNX1ZFUlNJT05fMV8wLAotCQkJCUpwYUZhY2V0LlZFUlNJT05fMV8wLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb25Qcm92aWRlciBidWlsZEFubm90YXRpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKcGFBbm5vdGF0aW9uUHJvdmlkZXIoCi0JCQlHZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpLAotCQkJRWNsaXBzZUxpbmtKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybVZhcmlhdGlvbiBidWlsZEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkgewotCQkJcHVibGljIFN1cHBvcnRlZCBnZXRUYWJsZVBlckNvbmNyZXRlQ2xhc3NJbmhlcml0YW5jZUlzU3VwcG9ydGVkKCkgewotCQkJCXJldHVybiBTdXBwb3J0ZWQuTk87Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiBpc0pvaW5UYWJsZU92ZXJyaWRhYmxlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXB1YmxpYyBBY2Nlc3NUeXBlW10gZ2V0U3VwcG9ydGVkQWNjZXNzVHlwZXMoSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQkJCXJldHVybiBHRU5FUklDX1NVUFBPUlRFRF9BQ0NFU1NfVFlQRVM7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEVjbGlwc2VMaW5rVmVyc2lvbiBleHRlbmRzIFNpbXBsZVZlcnNpb24gewotCi0JCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZWNsaXBzZUxpbmtWZXJzaW9uOwotCi0JCXB1YmxpYyBFY2xpcHNlTGlua1ZlcnNpb24oU3RyaW5nIGVjbGlwc2VMaW5rVmVyc2lvbiwgU3RyaW5nIGpwYVZlcnNpb24pIHsKLQkJCXN1cGVyKGpwYVZlcnNpb24pOwotCQkJdGhpcy5lY2xpcHNlTGlua1ZlcnNpb24gPSBlY2xpcHNlTGlua1ZlcnNpb247Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQkJcmV0dXJuIHRoaXMuZWNsaXBzZUxpbmtWZXJzaW9uOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwbGF0Zm9ybSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHNwZWNpZmllZCBFY2xpcHNlTGluayB2ZXJzaW9uLgotCQkgKiBAc2VlIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbiNFQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzFfMAotCQkgKiBAc2VlIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbiNFQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzFfMQotCQkgKiBAc2VlIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbiNFQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzFfMgotCQkgKiBAc2VlIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbiNFQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzJfMAotCQkgKiBAc2VlIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbiNFQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzJfMQotCQkgKiBAc2VlIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbiNFQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzJfMgotCQkgKiBAc2VlIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbiNFQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzJfMwotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNDb21wYXRpYmxlV2l0aFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKLQkJCXJldHVybiBWRVJTSU9OX0NPTVBBUkFUT1IuY29tcGFyZSh0aGlzLmVjbGlwc2VMaW5rVmVyc2lvbiwgdmVyc2lvbikgPj0gMDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiIEVjbGlwc2VMaW5rIHZlcnNpb246ICIgKyB0aGlzLmdldFZlcnNpb24oKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MWU1YjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuUmVzb3VyY2VEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSmFyUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5KYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5Pcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLlBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1YbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFFbnRpdHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbERlZmluaXRpb247Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgcGxhdGZvcm0KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1Qcm92aWRlcgotCQlleHRlbmRzIEFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlciB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1Qcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0pwYVBsYXRmb3JtUHJvdmlkZXIoKTsKLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybVByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqIHJlc291cmNlIG1vZGVscyAqKioqKioqKioKLQotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUgZ2V0TW9zdFJlY2VudFN1cHBvcnRlZFJlc291cmNlVHlwZShJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb21tb25Db3JlUGx1Z2luLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRDb21tb25Db3JlUGx1Z2luLkpBVkFfU09VUkNFX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvbW1vbkNvcmVQbHVnaW4uSkFSX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRDb21tb25Db3JlUGx1Z2luLkpBUl9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRKcGFDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfMV8wX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MXzFfMF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8wX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNvbnRlbnRUeXBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VNb2RlbFByb3ZpZGVyc1RvKEFycmF5TGlzdDxKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXI+IHByb3ZpZGVycykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHByb3ZpZGVycywgUkVTT1VSQ0VfTU9ERUxfUFJPVklERVJTKTsKLQl9Ci0KLQkvLyBvcmRlciBzaG91bGQgbm90IGJlIGltcG9ydGFudCBoZXJlCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXJbXSBSRVNPVVJDRV9NT0RFTF9QUk9WSURFUlMgPSBuZXcgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gewotCQlKYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCUphclJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQlQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQlPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKQotCX07Ci0KLQotCS8vICoqKioqKioqKiBKYXZhIHR5cGUgbWFwcGluZ3MgKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBKQVZBX1RZUEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLy8gb3JkZXIgbWF0Y2hlcyB0aGF0IHVzZWQgYnkgRWNsaXBzZUxpbmsKLQkvLyBOQjogbm8gRWNsaXBzZUxpbmstc3BlY2lmaWMgbWFwcGluZ3MKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25bXSBKQVZBX1RZUEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQlFY2xpcHNlTGlua0phdmFFbnRpdHlEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotCi0KLQkvLyAqKioqKioqKiogSmF2YSBhdHRyaWJ1dGUgbWFwcGluZ3MgKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBERUZBVUxUX0pBVkFfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8vIG9yZGVyIG1hdGNoZXMgdGhhdCB1c2VkIGJ5IEVjbGlwc2VMaW5rCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gREVGQVVMVF9KQVZBX0FUVFJJQlVURV9NQVBQSU5HX0RFRklOSVRJT05TID0gbmV3IERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKQotCX07Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgU1BFQ0lGSUVEX0pBVkFfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8vIG9yZGVyIG1hdGNoZXMgdGhhdCB1c2VkIGJ5IEVjbGlwc2VMaW5rCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBTUEVDSUZJRURfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCUphdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSmF2YVZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpCi0JfTsKLQotCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSBkZWZpbml0aW9ucyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZURlZmluaXRpb25zVG8oQXJyYXlMaXN0PFJlc291cmNlRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgUkVTT1VSQ0VfREVGSU5JVElPTlMpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUmVzb3VyY2VEZWZpbml0aW9uW10gUkVTT1VSQ0VfREVGSU5JVElPTlMgPSBuZXcgUmVzb3VyY2VEZWZpbml0aW9uW10gewotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJR2VuZXJpY09ybVhtbERlZmluaXRpb24uaW5zdGFuY2UoKQotCX07Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYVByb2plY3RJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYVByb2plY3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNTQ0NTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFQcm9qZWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuQWJzdHJhY3RKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rLXNwZWNpZmljIEpQQSBwcm9qZWN0LgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKcGFQcm9qZWN0SW1wbAotCQlleHRlbmRzIEFic3RyYWN0SnBhUHJvamVjdAotCQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rSnBhUHJvamVjdCB7Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rSnBhUHJvamVjdEltcGwoSnBhUHJvamVjdC5Db25maWcgY29uZmlnKSB7Ci0JCXN1cGVyKGNvbmZpZyk7Ci0JfQotCQotCXB1YmxpYyBKcGFYbWxSZXNvdXJjZSBnZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChKcGFYbWxSZXNvdXJjZSkgdGhpcy5nZXRSZXNvdXJjZU1vZGVsKAotCQkJCUpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRILAotCQkJCUpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYjlmYzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImVjbGlwc2VsaW5rX2pwYV92YWxpZGF0aW9uIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0VYUElSWV9BTkRfRVhQSVJZX1RJTUVfT0ZfREFZX0JPVEhfU1BFQ0lGSUVEID0gIkNBQ0hFX0VYUElSWV9BTkRfRVhQSVJZX1RJTUVfT0ZfREFZX0JPVEhfU1BFQ0lGSUVEIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRFUl9DTEFTU19JTVBMRU1FTlRTX0NPTlZFUlRFUiA9ICJDT05WRVJURVJfQ0xBU1NfSU1QTEVNRU5UU19DT05WRVJURVIiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUlVDVF9DT05WRVJURVJfQ0xBU1NfSU1QTEVNRU5UU19TVFJVQ1RfQ09OVkVSVEVSID0gIlNUUlVDVF9DT05WRVJURVJfQ0xBU1NfSU1QTEVNRU5UU19TVFJVQ1RfQ09OVkVSVEVSIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJURVJfRFVQTElDQVRFX05BTUUgPSAiQ09OVkVSVEVSX0RVUExJQ0FURV9OQU1FIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJURVJfTkFNRV9VTkRFRklORUQgPSAiQ09OVkVSVEVSX05BTUVfVU5ERUZJTkVEIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNFUlZFRF9DT05WRVJURVJfTkFNRSA9ICJSRVNFUlZFRF9DT05WRVJURVJfTkFNRSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJURVJfQ0xBU1NfRVhJU1RTID0gIkNPTlZFUlRFUl9DTEFTU19FWElTVFMiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRFUl9DTEFTU19ERUZJTkVEID0gIkNPTlZFUlRFUl9DTEFTU19ERUZJTkVEIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUT1JfQ1VTVE9NSVpFUl9DTEFTU19OT1RfU1BFQ0lGSUVEID0gIkRFU0NSSVBUT1JfQ1VTVE9NSVpFUl9DTEFTU19OT1RfU1BFQ0lGSUVEIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUT1JfQ1VTVE9NSVpFUl9DTEFTU19OT1RfRVhJU1QgPSAiREVTQ1JJUFRPUl9DVVNUT01JWkVSX0NMQVNTX05PVF9FWElTVCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVE9SX0NVU1RPTUlaRVJfQ0xBU1NfTk9UX1ZBTElEID0gIkRFU0NSSVBUT1JfQ1VTVE9NSVpFUl9DTEFTU19OT1RfVkFMSUQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRPUl9DVVNUT01JWkVSX0NMQVNTX0lNUExFTUVOVFNfREVTQ1JJUFRPUl9DVVNUT01JWkVSID0gIkRFU0NSSVBUT1JfQ1VTVE9NSVpFUl9DTEFTU19JTVBMRU1FTlRTX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUiI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDRVBUSU9OX0hBTkRMRVJfQ0xBU1NfTk9UX1NQRUNJRklFRCA9ICJFWENFUFRJT05fSEFORExFUl9DTEFTU19OT1RfU1BFQ0lGSUVEIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05fSEFORExFUl9DTEFTU19OT1RfRVhJU1QgPSAiRVhDRVBUSU9OX0hBTkRMRVJfQ0xBU1NfTk9UX0VYSVNUIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05fSEFORExFUl9DTEFTU19OT1RfVkFMSUQgPSAiRVhDRVBUSU9OX0hBTkRMRVJfQ0xBU1NfTk9UX1ZBTElEIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05fSEFORExFUl9DTEFTU19JTVBMRU1FTlRTX0VYQ0VQVElPTl9IQU5ETEVSID0gIkVYQ0VQVElPTl9IQU5ETEVSX0NMQVNTX0lNUExFTUVOVFNfRVhDRVBUSU9OX0hBTkRMRVIiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRPUl9EVVBMSUNBVEVfTkFNRSA9ICJHRU5FUkFUT1JfRFVQTElDQVRFX05BTUUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SX0VRVUlWQUxFTlQgPSAiR0VORVJBVE9SX0VRVUlWQUxFTlQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfTUFQUElOR19VTlJFU09MVkVEX0NPTlZFUlRFUl9OQU1FID0gIklEX01BUFBJTkdfVU5SRVNPTFZFRF9DT05WRVJURVJfTkFNRSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSVBMRV9PQkpFQ1RfVkFMVUVTX0ZPUl9EQVRBX1ZBTFVFID0gIk1VTFRJUExFX09CSkVDVF9WQUxVRVNfRk9SX0RBVEFfVkFMVUUiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfVkVSU0lPTl9NQVBQSU5HX1RZUEUgPSAiUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9WRVJTSU9OX01BUFBJTkdfVFlQRSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX0xFR0FDWV9ERVNDUklQVE9SX0NVU1RPTUlaRVIgPSAiUEVSU0lTVEVOQ0VfVU5JVF9MRUdBQ1lfREVTQ1JJUFRPUl9DVVNUT01JWkVSIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX0xFR0FDWV9FTlRJVFlfQ0FDSElORyA9ICJQRVJTSVNURU5DRV9VTklUX0xFR0FDWV9FTlRJVFlfQ0FDSElORyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX0NBQ0hJTkdfUFJPUEVSVFlfSUdOT1JFRCA9ICJQRVJTSVNURU5DRV9VTklUX0NBQ0hJTkdfUFJPUEVSVFlfSUdOT1JFRCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9EVVBMSUNBVEVfTkFNRSA9ICJRVUVSWV9EVVBMSUNBVEVfTkFNRSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9FUVVJVkFMRU5UID0gIlFVRVJZX0VRVUlWQUxFTlQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9DVVNUT01JWkVSX0NMQVNTX05PVF9TUEVDSUZJRUQgPSAiU0VTU0lPTl9DVVNUT01JWkVSX0NMQVNTX05PVF9TUEVDSUZJRUQiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fQ1VTVE9NSVpFUl9DTEFTU19OT1RfRVhJU1QgPSAiU0VTU0lPTl9DVVNUT01JWkVSX0NMQVNTX05PVF9FWElTVCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0NVU1RPTUlaRVJfQ0xBU1NfTk9UX1ZBTElEID0gIlNFU1NJT05fQ1VTVE9NSVpFUl9DTEFTU19OT1RfVkFMSUQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9DVVNUT01JWkVSX0NMQVNTX0lNUExFTUVOVFNfU0VTU0lPTl9DVVNUT01JWkVSID0gIlNFU1NJT05fQ1VTVE9NSVpFUl9DTEFTU19JTVBMRU1FTlRTX1NFU1NJT05fQ1VTVE9NSVpFUiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0xPR0dFUl9DTEFTU19OT1RfU1BFQ0lGSUVEID0gIlNFU1NJT05fTE9HR0VSX0NMQVNTX05PVF9TUEVDSUZJRUQiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fTE9HR0VSX0NMQVNTX05PVF9FWElTVCA9ICJTRVNTSU9OX0xPR0dFUl9DTEFTU19OT1RfRVhJU1QiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fTE9HR0VSX0NMQVNTX0lNUExFTUVOVFNfU0VTU0lPTl9MT0cgPSAiU0VTU0lPTl9MT0dHRVJfQ0xBU1NfSU1QTEVNRU5UU19TRVNTSU9OX0xPRyI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9QUk9GSUxFUl9DTEFTU19OT1RfU1BFQ0lGSUVEID0gIlNFU1NJT05fUFJPRklMRVJfQ0xBU1NfTk9UX1NQRUNJRklFRCI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9QUk9GSUxFUl9DTEFTU19OT1RfRVhJU1QgPSAiU0VTU0lPTl9QUk9GSUxFUl9DTEFTU19OT1RfRVhJU1QiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fUFJPRklMRVJfQ0xBU1NfTk9UX1ZBTElEID0gIlNFU1NJT05fUFJPRklMRVJfQ0xBU1NfTk9UX1ZBTElEIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX1BST0ZJTEVSX0NMQVNTX0lNUExFTUVOVFNfU0VTU0lPTlBfUk9GSUxFUiA9ICJTRVNTSU9OX1BST0ZJTEVSX0NMQVNTX0lNUExFTUVOVFNfU0VTU0lPTl9QUk9GSUxFUiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNJQ19DT0xMRUNUSU9OX01BUFBJTkdfREVQUkVDQVRFRCA9ICJCQVNJQ19DT0xMRUNUSU9OX01BUFBJTkdfREVQUkVDQVRFRCI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTSUNfTUFQX01BUFBJTkdfREVQUkVDQVRFRCA9ICJCQVNJQ19NQVBfTUFQUElOR19ERVBSRUNBVEVEIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUFQUElOR19NRU1CRVJfQ0xBU1NfTk9UX1NUQVRJQyA9ICJUWVBFX01BUFBJTkdfTUVNQkVSX0NMQVNTX05PVF9TVEFUSUMiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSA9ICJURU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9VTlJFU09MVkVEX05BTUUgPSAiVklSVFVBTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FID0gIlZJUlRVQUxfQVRUUklCVVRFX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9VTlJFU09MVkVEX05BTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQgPSAiVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX1RBQkxFX05PVF9WQUxJRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEID0gIlZJUlRVQUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX1RBQkxFX05PVF9WQUxJRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX1RBQkxFX05PVF9WQUxJRD0iVklSVFVBTF9BVFRSSUJVVEVfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX1RBQkxFX05PVF9WQUxJRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElURU5BTlRfTk9UX1NQRUNJRklFRF9XSVRIX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlMgPSAiTVVMVElURU5BTlRfTk9UX1NQRUNJRklFRF9XSVRIX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VTFRJVEVOQU5UX01FVEFEQVRBX0NBTk5PVF9CRV9TUEVDSUZJRURfT05fTk9OX1JPT1RfRU5USVRZID0gIk1VTFRJVEVOQU5UX01FVEFEQVRBX0NBTk5PVF9CRV9TUEVDSUZJRURfT05fTk9OX1JPT1RfRU5USVRZIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSVRFTkFOVF9UQUJMRV9QRVJfVEVOQU5UX05PVF9TVVBQT1JURUQgPSAiTVVMVElURU5BTlRfVEFCTEVfUEVSX1RFTkFOVF9OT1RfU1VQUE9SVEVEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSVRFTkFOVF9WUERfTUlHSFRfTk9UX0JFX05PVF9TVVBQT1JURUQgPSAiTVVMVElURU5BTlRfVlBEX01JR0hUX05PVF9CRV9OT1RfU1VQUE9SVEVEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSVRFTkFOVF9WUERfTk9UX1NVUFBPUlRFRF9PTl9OT05fT1JBQ0xFX0RBVEFCQVNFX1BMQVRGT1JNID0gIk1VTFRJVEVOQU5UX1ZQRF9OT1RfU1VQUE9SVEVEX09OX05PTl9PUkFDTEVfREFUQUJBU0VfUExBVEZPUk0iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VTFRJVEVOQU5UX1ZQRF9JTkNMVURFX0NSSVRFUklBX1dJTExfQkVfSUdOT1JFRCA9ICJNVUxUSVRFTkFOVF9WUERfSU5DTFVERV9DUklURVJJQV9XSUxMX0JFX0lHTk9SRUQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfTk9fQVRUUklCVVRFX1RZUEVfU1BFQ0lGSUVEID0gIlZJUlRVQUxfQVRUUklCVVRFX05PX0FUVFJJQlVURV9UWVBFX1NQRUNJRklFRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX1RZUEVfRE9FU19OT1RfRVhJU1QgPSAiVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX1RZUEVfRE9FU19OT1RfRVhJU1QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfVFlQRV9QQVJFTlRfQ0xBU1NfRE9FU19OT1RfRVhJU1QgPSAiVklSVFVBTF9UWVBFX1BBUkVOVF9DTEFTU19ET0VTX05PVF9FWElTVCI7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkOGVkNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVhtbFJlc291cmNlUHJvdmlkZXI7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgb3JtLnhtbAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEpwYVJlc291cmNlTW9kZWxQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVJlc291cmNlTW9kZWxQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxQcm92aWRlcigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFOwotCX0KLQkKLQlwdWJsaWMgSnBhWG1sUmVzb3VyY2UgYnVpbGRSZXNvdXJjZU1vZGVsKEpwYVByb2plY3QganBhUHJvamVjdCwgSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyLmdldFhtbFJlc291cmNlUHJvdmlkZXIoZmlsZSkuZ2V0WG1sUmVzb3VyY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9KcHRKcGFFY2xpcHNlTGlua0NvcmVNZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvSnB0SnBhRWNsaXBzZUxpbmtDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkNzQ4ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9KcHRKcGFFY2xpcHNlTGlua0NvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgSnB0SnBhRWNsaXBzZUxpbmtDb3JlTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcHRfanBhX2VjbGlwc2VsaW5rX2NvcmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQlVORExFX0NMQVNTID0gSnB0SnBhRWNsaXBzZUxpbmtDb3JlTWVzc2FnZXMuY2xhc3M7Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQV9NRVRBREFUQV9DT05WRVJTSU9OX0NPTlZFUlRfQ09OVkVSVEVSOwotCi0JcHJpdmF0ZSBKcHRKcGFFY2xpcHNlTGlua0NvcmVNZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9BYnN0cmFjdEVjbGlwc2VMaW5rVHlwZU1hcHBpbmdWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvQWJzdHJhY3RFY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZGEwZmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9BYnN0cmFjdEVjbGlwc2VMaW5rVHlwZU1hcHBpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVHlwZU1hcHBpbmdUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkFic3RyYWN0VHlwZU1hcHBpbmdWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVjbGlwc2VMaW5rVHlwZU1hcHBpbmdWYWxpZGF0b3I8VCBleHRlbmRzIFR5cGVNYXBwaW5nPgotCWV4dGVuZHMgQWJzdHJhY3RUeXBlTWFwcGluZ1ZhbGlkYXRvcjxUPgotewotCXByb3RlY3RlZCBBYnN0cmFjdEVjbGlwc2VMaW5rVHlwZU1hcHBpbmdWYWxpZGF0b3IoVCB0eXBlTWFwcGluZywgSmF2YVJlc291cmNlVHlwZSBqcnQsIFR5cGVNYXBwaW5nVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJc3VwZXIodHlwZU1hcHBpbmcsIGpydCwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVUeXBlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmICh0aGlzLmlzTWVtYmVyVHlwZSgpICYmICF0aGlzLmlzU3RhdGljVHlwZSgpKSB7Ci0JCQltZXNzYWdlcy5hZGQodGhpcy5idWlsZEVjbGlwc2VMaW5rVHlwZU1lc3NhZ2UoRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX01FTUJFUl9DTEFTU19OT1RfU1RBVElDKSk7Ci0JCX0KLQkJaWYgKCF0aGlzLmhhc05vQXJnQ29uc3RydWN0b3IoKSkgewotCQkJbWVzc2FnZXMuYWRkKHRoaXMuYnVpbGRUeXBlTWVzc2FnZShKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0NMQVNTX01JU1NJTkdfTk9fQVJHX0NPTlNUUlVDVE9SKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRFY2xpcHNlTGlua1R5cGVNZXNzYWdlKFN0cmluZyBtc2dJRCkgewotCQlyZXR1cm4gRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCW1zZ0lELAotCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy50eXBlTWFwcGluZy5nZXROYW1lKCl9LAotCQkJCXRoaXMudHlwZU1hcHBpbmcsCi0JCQkJdGhpcy50ZXh0UmFuZ2VSZXNvbHZlci5nZXRUeXBlTWFwcGluZ1RleHRSYW5nZSgpCi0JCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtDb252ZXJ0VmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rQ29udmVydFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTkwNTdiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtDb252ZXJ0VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQ29udmVydGVyVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0NvbnZlcnRWYWxpZGF0b3IKLQlpbXBsZW1lbnRzIEpwdFZhbGlkYXRvcgotewotCXByb3RlY3RlZCBmaW5hbCBFY2xpcHNlTGlua0NvbnZlcnQgY29udmVydDsKLQotCXByb3RlY3RlZCBmaW5hbCBDb252ZXJ0ZXJUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcjsKLQotCi0JcHVibGljIEVjbGlwc2VMaW5rQ29udmVydFZhbGlkYXRvcihFY2xpcHNlTGlua0NvbnZlcnQgY29udmVydCwgQ29udmVydGVyVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb252ZXJ0ID0gY29udmVydDsKLQkJdGhpcy50ZXh0UmFuZ2VSZXNvbHZlciA9IHRleHRSYW5nZVJlc29sdmVyOwotCX0KLQotCXByb3RlY3RlZCBBdHRyaWJ1dGVNYXBwaW5nIGdldEF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnQuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydC5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29udmVydGVycyBhcmUgdmFsaWRhdGVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQjdmFsaWRhdGVDb252ZXJ0ZXJzKExpc3QsIElSZXBvcnRlcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCS8vIGNvbnZlcnRlcnMgYXJlIHZhbGlkYXRlZCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlyZXR1cm4gdGhpcy52YWxpZGF0ZUNvbnZlcnRlck5hbWUobWVzc2FnZXMpOwotCX0KLQotCQotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZUNvbnZlcnRlck5hbWUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJU3RyaW5nIGNvbnZlcnRlck5hbWUgPSB0aGlzLmNvbnZlcnQuZ2V0Q29udmVydGVyTmFtZSgpOwotCQlpZiAoY29udmVydGVyTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWlmIChDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRVbmlxdWVDb252ZXJ0ZXJOYW1lcygpLCBjb252ZXJ0ZXJOYW1lKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlpZiAoQXJyYXlUb29scy5jb250YWlucyhFY2xpcHNlTGlua0NvbnZlcnQuUkVTRVJWRURfQ09OVkVSVEVSX05BTUVTLCBjb252ZXJ0ZXJOYW1lKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQltZXNzYWdlcy5hZGQoCi0JCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSURfTUFQUElOR19VTlJFU09MVkVEX0NPTlZFUlRFUl9OQU1FLAotCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCWNvbnZlcnRlck5hbWUsCi0JCQkJCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldE5hbWUoKQotCQkJCX0sCi0JCQkJdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCksCi0JCQkJdGhpcy50ZXh0UmFuZ2VSZXNvbHZlci5nZXRDb252ZXJ0ZXJUZXh0UmFuZ2UoKQotCQkJKQotCQkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtEeW5hbWljVHlwZU1hcHBpbmdWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtEeW5hbWljVHlwZU1hcHBpbmdWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ3YWVjZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rRHluYW1pY1R5cGVNYXBwaW5nVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0R5bmFtaWNUeXBlTWFwcGluZ1ZhbGlkYXRvcgotCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yPFR5cGVNYXBwaW5nPgotewotCXB1YmxpYyBFY2xpcHNlTGlua0R5bmFtaWNUeXBlTWFwcGluZ1ZhbGlkYXRvcihUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlzdXBlcih0eXBlTWFwcGluZywgbnVsbCwgbnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVUeXBlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCS8vbm8gdmFsaWRhdGlvbiBmb3IgYSBkeW5hbWljIHR5cGUKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rRW50aXR5UHJpbWFyeUtleVZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGlua0VudGl0eVByaW1hcnlLZXlWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlhM2EzZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rRW50aXR5UHJpbWFyeUtleVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QcmltYXJ5S2V5VGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5BYnN0cmFjdEVudGl0eVByaW1hcnlLZXlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtFbnRpdHlQcmltYXJ5S2V5VmFsaWRhdG9yCi0JZXh0ZW5kcyBBYnN0cmFjdEVudGl0eVByaW1hcnlLZXlWYWxpZGF0b3IKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtFbnRpdHlQcmltYXJ5S2V5VmFsaWRhdG9yKAotCQkJRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5LCBQcmltYXJ5S2V5VGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCi0JCXN1cGVyKGVudGl0eSwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5KCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rRW50aXR5KSB0eXBlTWFwcGluZygpOwotCX0KLQkKLQkvLyBpbiBFY2xpcHNlTGluaywgYSBoaWVyYXJjaHkgbWF5IGRlZmluZSBpdHMgcHJpbWFyeSBrZXkgb24gbXVsdGlwbGUgY2xhc3Nlcywgc28gbG9uZyBhcyB0aGUKLQkvLyByb290IGVudGl0eSBoYXMgYSBjb2hlcmVudCBkZWZpbmVkIHByaW1hcnkga2V5LgotCS8vIEhvd2V2ZXIsIHRoZSBpZCBjbGFzcyBtYXkgb25seSBiZSBkZWZpbmVkIG9uIG9uZSBjbGFzcyBpbiB0aGUgaGllcmFyY2h5LgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUHJpbWFyeUtleUlzTm90UmVkZWZpbmVkKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKGlkQ2xhc3NSZWZlcmVuY2UoKS5pc1NwZWNpZmllZCgpICYmIGRlZmluZXNJZENsYXNzT25BbmNlc3Rvcih0eXBlTWFwcGluZygpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0lEX0NMQVNTX1JFREVGSU5FRCwKLQkJCQkJCW5ldyBTdHJpbmdbMF0sCi0JCQkJCQl0eXBlTWFwcGluZygpLAotCQkJCQkJdGV4dFJhbmdlUmVzb2x2ZXIoKS5nZXRJZENsYXNzVGV4dFJhbmdlKCkpKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZpbmVzUHJpbWFyeUtleShUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlyZXR1cm4gc3VwZXIuZGVmaW5lc1ByaW1hcnlLZXkodHlwZU1hcHBpbmcpCi0JCQl8fCAoKEVjbGlwc2VMaW5rVHlwZU1hcHBpbmcpIHR5cGVNYXBwaW5nKS51c2VzUHJpbWFyeUtleUNvbHVtbnMoKQotCQkJfHwgKChFY2xpcHNlTGlua1R5cGVNYXBwaW5nKSB0eXBlTWFwcGluZykudXNlc1ByaW1hcnlLZXlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcGVjaWZpZXNJZENsYXNzKCkgewotCQlyZXR1cm4gc3VwZXIuc3BlY2lmaWVzSWRDbGFzcygpIHx8IGRlZmluZXNJZENsYXNzKHR5cGVNYXBwaW5nKCkpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVJZENsYXNzQXR0cmlidXRlc1dpdGhQcm9wZXJ0eUFjY2VzcygKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBpZENsYXNzLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywKLQkJCUlSZXBvcnRlciByZXBvcnRlcikgewotCQkvL2RvIG5vdGhpbmcgLSBFY2xpcHNlbGluayBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2Ugc3RhdHVzIG9mIHByb3BlcnR5IG1ldGhvZHMKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc1ByaW1hcnlLZXlWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzUHJpbWFyeUtleVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2I5N2QyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzUHJpbWFyeUtleVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QcmltYXJ5S2V5VGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5BYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NQcmltYXJ5S2V5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NQcmltYXJ5S2V5VmFsaWRhdG9yCi0JZXh0ZW5kcyBBYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NQcmltYXJ5S2V5VmFsaWRhdG9yCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc1ByaW1hcnlLZXlWYWxpZGF0b3IoCi0JCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcywgUHJpbWFyeUtleVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQotCQlzdXBlcihtYXBwZWRTdXBlcmNsYXNzLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcygpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIHR5cGVNYXBwaW5nKCk7Ci0JfQotCQotCS8vIGluIEVjbGlwc2VMaW5rLCBhIGhpZXJhcmNoeSBtYXkgZGVmaW5lIGl0cyBwcmltYXJ5IGtleSBvbiBtdWx0aXBsZSBjbGFzc2VzLCBzbyBsb25nIGFzIHRoZQotCS8vIHJvb3QgZW50aXR5IGhhcyBhIGNvaGVyZW50IGRlZmluZWQgcHJpbWFyeSBrZXkuCi0JLy8gSG93ZXZlciwgdGhlIGlkIGNsYXNzIG1heSBvbmx5IGJlIGRlZmluZWQgb24gb25lIGNsYXNzIGluIHRoZSBoaWVyYXJjaHkuCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQcmltYXJ5S2V5SXNOb3RSZWRlZmluZWQoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoaWRDbGFzc1JlZmVyZW5jZSgpLmlzU3BlY2lmaWVkKCkgJiYgZGVmaW5lc0lkQ2xhc3NPbkFuY2VzdG9yKHR5cGVNYXBwaW5nKCkpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfUkVERUZJTkVELAotCQkJCQkJbmV3IFN0cmluZ1swXSwKLQkJCQkJCXR5cGVNYXBwaW5nKCksCi0JCQkJCQl0ZXh0UmFuZ2VSZXNvbHZlcigpLmdldElkQ2xhc3NUZXh0UmFuZ2UoKSkpOwotCQl9Ci0JfQotCQotCS8vIGluIEVjbGlwc2VMaW5rLCBpdCdzIG9ubHkgdGhlIHJvb3QgZW50aXR5IHdoZXJlIHRoaXMgbWF0dGVycwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSWRDbGFzc0lzVXNlZElmTmVjZXNzYXJ5KExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJLy8gbm8gb3AKLQl9Ci0JCi0JLy8gaW4gRWNsaXBzZUxpbmssIGl0J3Mgb25seSB0aGUgcm9vdCBlbnRpdHkgd2hlcmUgdGhpcyBtYXR0ZXJzCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVJZENsYXNzKEphdmFQZXJzaXN0ZW50VHlwZSBpZENsYXNzLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCS8vIG5vIG9wCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGRlZmluZXNQcmltYXJ5S2V5KFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXJldHVybiBzdXBlci5kZWZpbmVzUHJpbWFyeUtleSh0eXBlTWFwcGluZykKLQkJCXx8ICgoRWNsaXBzZUxpbmtUeXBlTWFwcGluZykgdHlwZU1hcHBpbmcpLnVzZXNQcmltYXJ5S2V5Q29sdW1ucygpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVJZENsYXNzQXR0cmlidXRlc1dpdGhQcm9wZXJ0eUFjY2VzcygKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBpZENsYXNzLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywKLQkJCUlSZXBvcnRlciByZXBvcnRlcikgewotCQkvL2RvIG5vdGhpbmcgLSBFY2xpcHNlbGluayBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2Ugc3RhdHVzIG9mIHByb3BlcnR5IG1ldGhvZHMKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzVmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWIyMTIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UeXBlTWFwcGluZ1RleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzVmFsaWRhdG9yCi0JZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rVHlwZU1hcHBpbmdWYWxpZGF0b3I8TWFwcGVkU3VwZXJjbGFzcz4KLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzVmFsaWRhdG9yKE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcywgSmF2YVJlc291cmNlVHlwZSBqcnQsIFR5cGVNYXBwaW5nVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJc3VwZXIobWFwcGVkU3VwZXJjbGFzcywganJ0LCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVR5cGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKHRoaXMuaXNGaW5hbFR5cGUoKSkgewotCQkJbWVzc2FnZXMuYWRkKHRoaXMuYnVpbGRUeXBlTWVzc2FnZShKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0ZJTkFMX0NMQVNTKSk7Ci0JCX0KLQkJc3VwZXIudmFsaWRhdGVUeXBlKG1lc3NhZ2VzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZVZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEwZjE0ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGVUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkFic3RyYWN0UGVyc2lzdGVudEF0dHJpYnV0ZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlVmFsaWRhdG9yCi0JZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbnRBdHRyaWJ1dGVWYWxpZGF0b3IKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlVmFsaWRhdG9yKAotCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwgUGVyc2lzdGVudEF0dHJpYnV0ZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKQotCXsKLQkJc3VwZXIocGVyc2lzdGVudEF0dHJpYnV0ZSwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCS8qKgotCSAqIEVjbGlwc2VMaW5rIGRvZXMgbm90IGhhdmUgdGhlIHNhbWUgcmVzdHJpY3Rpb25zIG9uIHRoZQotCSAqIGF0dHJpYnV0ZSBhcyB0aGUgSlBBIHNwZWMgZG9lcyAoZS5nLiB0aGUgc3BlYyBwcm9oaWJpdHMgYSBmaWVsZCBmcm9tCi0JICogYmVpbmcgcHVibGljKS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1hcHBlZEF0dHJpYnV0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlyZXR1cm47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rVHlwZU1hcHBpbmdWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmNzIwZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rVHlwZU1hcHBpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UeXBlTWFwcGluZ1RleHRSYW5nZVJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtUeXBlTWFwcGluZ1ZhbGlkYXRvcgotCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yPFR5cGVNYXBwaW5nPgotewotCXB1YmxpYyBFY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nLCBKYXZhUmVzb3VyY2VUeXBlIGpydCwgVHlwZU1hcHBpbmdUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlzdXBlcih0eXBlTWFwcGluZywganJ0LCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uVmFsaWRhdG9yMl8zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5WYWxpZGF0b3IyXzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNhMTVlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5WYWxpZGF0b3IyXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkFic3RyYWN0TmFtZWRDb2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5FbnRpdHlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uVmFsaWRhdG9yMl8zCi0JZXh0ZW5kcyBBYnN0cmFjdE5hbWVkQ29sdW1uVmFsaWRhdG9yPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMywgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcj4KLXsKLQlwdWJsaWMgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtblZhbGlkYXRvcjJfMygKLQkJCVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBuYW1lZENvbHVtbiwKLQkJCU5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJc3VwZXIobmFtZWRDb2x1bW4sIHRleHRSYW5nZVJlc29sdmVyLCBuZXcgRW50aXR5VGFibGVEZXNjcmlwdGlvblByb3ZpZGVyKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRUYWJsZVZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZVZhbGlkYXRvcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFVucmVzb2x2ZWROYW1lTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCW1lc3NhZ2UsCi0JCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJdGhpcy5jb2x1bW4uZ2V0TmFtZSgpLAotCQkJCQl0aGlzLmNvbHVtbi5nZXREYlRhYmxlKCkuZ2V0TmFtZSgpCi0JCQkJfSwKLQkJCQl0aGlzLmNvbHVtbiwKLQkJCQl0aGlzLnRleHRSYW5nZVJlc29sdmVyLmdldE5hbWVUZXh0UmFuZ2UoKQotCQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbi5pc1ZpcnR1YWwoKSA/Ci0JCQkJdGhpcy5idWlsZFVucmVzb2x2ZWROYW1lTWVzc2FnZSh0aGlzLmdldFZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkpIDoKLQkJCQlzdXBlci5idWlsZFVucmVzb2x2ZWROYW1lTWVzc2FnZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5VbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbEF0dHJpYnV0ZVVucmVzb2x2ZWROYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRhYmxlIHZhbGlkYXRvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgVGFibGVWYWxpZGF0b3IKLQkJZXh0ZW5kcyBCYXNlQ29sdW1uVGFibGVWYWxpZGF0b3IKLQl7Ci0JCXByb3RlY3RlZCBUYWJsZVZhbGlkYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBnZXRDb2x1bW4oKSB7Ci0JCQlyZXR1cm4gKFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMykgc3VwZXIuZ2V0Q29sdW1uKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVGFibGVOb3RWYWxpZE1lc3NhZ2VfKCkgewotCQkJcmV0dXJuIERlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCXRoaXMuZ2V0Q29sdW1uVGFibGVOb3RWYWxpZE1lc3NhZ2UoKSwKLQkJCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJCXRoaXMuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSwKLQkJCQkJCXRoaXMuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpLAotCQkJCQkJdGhpcy5nZXRDb2x1bW5UYWJsZURlc2NyaXB0aW9uTWVzc2FnZSgpCi0JCQkJCX0sCi0JCQkJCXRoaXMuZ2V0Q29sdW1uKCksCi0JCQkJCXRoaXMuZ2V0VGV4dFJhbmdlUmVzb2x2ZXIoKS5nZXRUYWJsZVRleHRSYW5nZSgpCi0JCQkJKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbHVtblRhYmxlTm90VmFsaWRNZXNzYWdlKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uKCkuaXNWaXJ0dWFsKCkgPwotCQkJCQl0aGlzLmdldFZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uVGFibGVOb3RWYWxpZE1lc3NhZ2UoKSA6Ci0JCQkJCXRoaXMuZ2V0Q29sdW1uVGFibGVOb3RWYWxpZE1lc3NhZ2VfKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uVGFibGVOb3RWYWxpZE1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb2x1bW5UYWJsZU5vdFZhbGlkTWVzc2FnZV8oKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX1RBQkxFX05PVF9WQUxJRDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVDb2x1bW5UYWJsZU5vdFZhbGlkTWVzc2FnZSgpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUFycmF5TWFwcGluZ0RlZmluaXRpb24yXzMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFBcnJheU1hcHBpbmdEZWZpbml0aW9uMl8zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzN2M0MzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUFycmF5TWFwcGluZ0RlZmluaXRpb24yXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtBcnJheUFubm90YXRpb24yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUFycmF5TWFwcGluZ0RlZmluaXRpb24yXzMKLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0phdmFBcnJheU1hcHBpbmdEZWZpbml0aW9uMl8zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSmF2YUFycmF5TWFwcGluZ0RlZmluaXRpb24yXzMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLkFSUkFZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtBcnJheUFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBuZXcgU3RyaW5nW10gewotCQlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FCi0JfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IEVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KEVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkpOwotCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzMocGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKS5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCi0JCUVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMKLQkpOwotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUJhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY5NzYxMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUJhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uCi0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtKYXZhQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtKYXZhQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKEVjbGlwc2VMaW5rSnBhRmFjdG9yeSkgZmFjdG9yeSkuYnVpbGRKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nKHBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUJhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNzNmM2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUJhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFjY2VzczJfMEFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMAotCWV4dGVuZHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBERUxFR0FURSA9IEVjbGlwc2VMaW5rSmF2YUJhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtKYXZhQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24yXzAoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtKYXZhQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24yXzAoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIERFTEVHQVRFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVlfMl8wID0gbmV3IFN0cmluZ1tdIHsKLQkJQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU18yXzAgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWV8yXzApOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJREVMRUdBVEUuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQlTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfMl8wCi0JKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUJhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OGNiZmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUJhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfTUFQX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKEVjbGlwc2VMaW5rSnBhRmFjdG9yeSkgZmFjdG9yeSkuYnVpbGRKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcocGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUJhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYTA2ZTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUJhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQWNjZXNzMl8wQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24yXzAKLQlleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBFY2xpcHNlTGlua0phdmFCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbjJfMCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0phdmFCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uMl8wKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiBERUxFR0FURTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZXzJfMCA9IG5ldyBTdHJpbmdbXSB7Ci0JCUFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfMl8wID0gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVlfMl8wKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCURFTEVHQVRFLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTXzJfMAotCSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTUxNmNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbgotCWV4dGVuZHMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIERFTEVHQVRFID0gSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKTsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIERFTEVHQVRFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSA9IG5ldyBTdHJpbmdbXSB7Ci0JCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCX07Ci0JLy8gJ3B1YmxpYycgYmVjYXVzZSB0aGUgRWNsaXBzZUxpbmsgSWQgYW5kIFZlcnNpb24gbWFwcGluZ3MgYWxzbyBzdXBwb3J0IHRoZXNlIGFubm90YXRpb25zCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IEVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KEVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkpOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJREVMRUdBVEUuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQlFQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTCi0JKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjFiZjhiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjJfMDsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24yXzAKLQlleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLQlpbXBsZW1lbnRzIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uMl8wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uMl8wKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiBERUxFR0FURTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCURFTEVHQVRFLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5FQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTCi0JKTsKLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkuaXNEZWZhdWx0KHBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODczNTE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24yXzIKLQlleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLQlpbXBsZW1lbnRzIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIERFTEVHQVRFID0gRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uMl8yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uMl8yKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiBERUxFR0FURTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVDTElQU0VfTElOSzJfMl9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBuZXcgU3RyaW5nW10gewotCQlFY2xpcHNlTGluay5DT05WRVJURVJTLAotCQlFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJTLAotCQlFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSUywKLQkJRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVJTLAotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IEVDTElQU0VfTElOSzJfMl9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KEVDTElQU0VfTElOSzJfMl9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkpOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJREVMRUdBVEUuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQlFQ0xJUFNFX0xJTksyXzJfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTCi0JKTsKLQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIERFTEVHQVRFLmlzRGVmYXVsdChwZXJzaXN0ZW50QXR0cmlidXRlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEzOTk3Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24yXzAKLQlleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24yXzAoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZID0gbmV3IFN0cmluZ1tdIHsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FCi0JfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IEVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KEVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkpOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJREVMRUdBVEUuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQlFQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTCi0JKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTRiMmMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMgotCWV4dGVuZHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBERUxFR0FURSA9IEVjbGlwc2VMaW5rSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKTsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24yXzIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIERFTEVHQVRFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJREVMRUdBVEUuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQlFY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uMl8yLkVDTElQU0VfTElOSzJfMl9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMKLQkpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0ZDgwZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uCi0JZXh0ZW5kcyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBKYXZhRW1iZWRkYWJsZURlZmluaXRpb24uaW5zdGFuY2UoKTsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZURlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZID0gbmV3IFN0cmluZ1tdIHsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IEVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KEVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkpOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJREVMRUdBVEUuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQlFQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTCi0JKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbWJlZGRhYmxlRGVmaW5pdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MDMzMTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlRGVmaW5pdGlvbjJfMDsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uMl8wCi0JZXh0ZW5kcyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBKYXZhRW1iZWRkYWJsZURlZmluaXRpb24yXzAuaW5zdGFuY2UoKTsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZURlZmluaXRpb24yXzAoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uMl8wKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQlERUxFR0FURS5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCi0JCUVjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uLkVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMKLQkpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZURlZmluaXRpb24yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYwNzQ2My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZURlZmluaXRpb24yXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFFbWJlZGRhYmxlRGVmaW5pdGlvbjJfMgotCWV4dGVuZHMgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIERFTEVHQVRFID0gRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZURlZmluaXRpb24yXzAuaW5zdGFuY2UoKTsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZURlZmluaXRpb24yXzIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uMl8yKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVDTElQU0VfTElOSzJfMl9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBuZXcgU3RyaW5nW10gewotCQlFY2xpcHNlTGluay5DT05WRVJURVJTLAotCQlFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJTLAotCQlFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSUywKLQkJRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVJTLAotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IEVDTElQU0VfTElOSzJfMl9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KEVDTElQU0VfTElOSzJfMl9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkpOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJREVMRUdBVEUuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQlFQ0xJUFNFX0xJTksyXzJfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTCi0JKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE4YWYxMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24KLQlleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBKYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtKYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZID0gbmV3IFN0cmluZ1tdIHsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IEVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KEVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkpOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJREVMRUdBVEUuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQlFQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTCi0JKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFiZTRmYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uMl8wOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uMl8wCi0JZXh0ZW5kcyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIERFTEVHQVRFID0gSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjJfMCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0phdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24yXzAoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIERFTEVHQVRFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJREVMRUdBVEUuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQlFY2xpcHNlTGlua0phdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUwotCSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYjJlZTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjJfMgotCWV4dGVuZHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBERUxFR0FURSA9IEVjbGlwc2VMaW5rSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjJfMigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0phdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24yXzIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIERFTEVHQVRFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJREVMRUdBVEUuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQlFY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uMl8yLkVDTElQU0VfTElOSzJfMl9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMKLQkpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNDFiNTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24KLQlleHRlbmRzIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBERUxFR0FURSA9IEphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiBERUxFR0FURTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBuZXcgU3RyaW5nW10gewotCQlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSk7Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQlERUxFR0FURS5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCi0JCUVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMKLQkpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNzNkNzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24yXzA7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uMl8wCi0JZXh0ZW5kcyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0phdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uMl8wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0phdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uMl8wKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQlERUxFR0FURS5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCi0JCUVjbGlwc2VMaW5rSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24uRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUwotCSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRlZjBhYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjJfMgotCWV4dGVuZHMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIERFTEVHQVRFID0gRWNsaXBzZUxpbmtKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0phdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uMl8yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0phdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uMl8yKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQlERUxFR0FURS5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCi0JCUVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24yXzIuRUNMSVBTRV9MSU5LMl8yX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUwotCSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW50aXR5RGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUVudGl0eURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ3NzM4Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW50aXR5RGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW50aXR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFFbnRpdHlEZWZpbml0aW9uCi0JZXh0ZW5kcyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBKYXZhRW50aXR5RGVmaW5pdGlvbi5pbnN0YW5jZSgpOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0phdmFFbnRpdHlEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0phdmFFbnRpdHlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZID0gbmV3IFN0cmluZ1tdIHsKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCX07Ci0JLy8gJ3B1YmxpYycgYmVjYXVzZSBFY2xpcHNlTGluayBNYXBwZWRTdXBlcmNsYXNzIGFsc28gc3VwcG9ydHMgdGhlc2UgYW5ub3RhdGlvbnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSk7Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQlERUxFR0FURS5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCi0JCUVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMKLQkpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUVudGl0eURlZmluaXRpb24yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbnRpdHlEZWZpbml0aW9uMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMzAyMWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUVudGl0eURlZmluaXRpb24yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuSmF2YUVudGl0eURlZmluaXRpb24yXzA7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFFbnRpdHlEZWZpbml0aW9uMl8wCi0JZXh0ZW5kcyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBKYXZhRW50aXR5RGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0phdmFFbnRpdHlEZWZpbml0aW9uMl8wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0phdmFFbnRpdHlEZWZpbml0aW9uMl8wKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQlERUxFR0FURS5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCi0JCUVjbGlwc2VMaW5rSmF2YUVudGl0eURlZmluaXRpb24uRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUwotCSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW50aXR5RGVmaW5pdGlvbjJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUVudGl0eURlZmluaXRpb24yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5ZmQ1Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW50aXR5RGVmaW5pdGlvbjJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUVudGl0eURlZmluaXRpb24yXzIKLQlleHRlbmRzIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBERUxFR0FURSA9IEVjbGlwc2VMaW5rSmF2YUVudGl0eURlZmluaXRpb24yXzAuaW5zdGFuY2UoKTsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtKYXZhRW50aXR5RGVmaW5pdGlvbjJfMigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtKYXZhRW50aXR5RGVmaW5pdGlvbjJfMigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBnZXREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIERFTEVHQVRFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFQ0xJUFNFX0xJTksyXzJfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZID0gbmV3IFN0cmluZ1tdIHsKLQkJRWNsaXBzZUxpbmsuQ09OVkVSVEVSUywKLQkJRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSUywKLQkJRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUlMsCi0JCUVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSUywKLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IEVDTElQU0VfTElOSzJfMl9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KEVDTElQU0VfTElOSzJfMl9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkpOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJREVMRUdBVEUuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQlFQ0xJUFNFX0xJTksyXzJfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTCi0JKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbnRpdHlEZWZpbml0aW9uMl8zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW50aXR5RGVmaW5pdGlvbjJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmU3ZDE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbnRpdHlEZWZpbml0aW9uMl8zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzM7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFFbnRpdHlEZWZpbml0aW9uMl8zCi0JZXh0ZW5kcyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBFY2xpcHNlTGlua0phdmFFbnRpdHlEZWZpbml0aW9uMl8yLmluc3RhbmNlKCk7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSmF2YUVudGl0eURlZmluaXRpb24yXzMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSmF2YUVudGl0eURlZmluaXRpb24yXzMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiBERUxFR0FURTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRUNMSVBTRV9MSU5LMl8zX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSA9IG5ldyBTdHJpbmdbXSB7Ci0JCUVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSwKLQkJRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMy5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlMKLQl9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBFQ0xJUFNFX0xJTksyXzNfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihFQ0xJUFNFX0xJTksyXzNfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCURFTEVHQVRFLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJRUNMSVBTRV9MSU5LMl8zX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUwotCSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JiZmIyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmdEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbgotCWV4dGVuZHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBERUxFR0FURSA9IEphdmFJZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0phdmFJZE1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiBERUxFR0FURTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCURFTEVHQVRFLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5FQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTCi0JKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFJZE1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTYyNDQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFJZE1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjJfMDsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ0RlZmluaXRpb24yXzAKLQlleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ0RlZmluaXRpb24yXzAoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjJfMCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciB0aGUgPGNvZGU+SWQ8L2NvZGU+IG1hcHBpbmcgaXMgInNwZWNpZmllZCIgYWNjb3JkaW5nIHRvCi0JICogdGhlIHNwZWMgdGhlbiBjaGVjayBmb3IgRWNsaXBzZUxpbmsgZGVmYXVsdCBtYXBwaW5ncyB0aGF0IG5lZ2F0ZSB0aGUKLQkgKiA8Y29kZT5JZDwvY29kZT4gbWFwcGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCWJvb2xlYW4gc3BlY1NwZWNpZmllZCA9IHN1cGVyLmlzU3BlY2lmaWVkKHBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQlyZXR1cm4gc3BlY1NwZWNpZmllZCAmJiAhIHRoaXMuaXNEZWZhdWx0RGVyaXZlZElkKHBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCX0KLQotCS8qKgotCSAqIEVjbGlwc2VMaW5rIHN1cHBvcnRzIGRlZmF1bHQgTToxIGFuZCAxOjEgbWFwcGluZ3MuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdERlcml2ZWRJZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCVN0cmluZyBkZWZhdWx0S2V5ID0gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpOwotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwoZGVmYXVsdEtleSwgdGhpcy5nZXRNYW55VG9PbmVLZXkoKSkgfHwKLQkJCQlUb29scy52YWx1ZXNBcmVFcXVhbChkZWZhdWx0S2V5LCB0aGlzLmdldE9uZVRvT25lS2V5KCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE1hbnlUb09uZUtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKS5nZXRLZXkoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRPbmVUb09uZUtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKS5nZXRLZXkoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCURFTEVHQVRFLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5FQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTCi0JKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFJZE1hcHBpbmdEZWZpbml0aW9uMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2EzZmM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFJZE1hcHBpbmdEZWZpbml0aW9uMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjJfMgotCWV4dGVuZHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBERUxFR0FURSA9IEVjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKTsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0phdmFJZE1hcHBpbmdEZWZpbml0aW9uMl8yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ0RlZmluaXRpb24yXzIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIERFTEVHQVRFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJREVMRUdBVEUuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQlFY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uMl8yLkVDTElQU0VfTElOSzJfMl9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMKLQkpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmU0ZDkzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24KLQlleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBuZXcgU3RyaW5nW10gewotCQlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSk7Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQlERUxFR0FURS5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCi0JCUVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMKLQkpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTU3Nzg2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzA7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzAKLQlleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCk7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQlERUxFR0FURS5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCi0JCUVjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5FQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTCi0JKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdlN2U2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8yCi0JZXh0ZW5kcyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIERFTEVHQVRFID0gRWNsaXBzZUxpbmtKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCk7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQlERUxFR0FURS5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCi0JCUVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24yXzIuRUNMSVBTRV9MSU5LMl8yX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUwotCSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTFiMzNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24KLQlleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKTsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0phdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0phdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZID0gbmV3IFN0cmluZ1tdIHsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IEVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KEVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkpOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJREVMRUdBVEUuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQlFQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTCi0JKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YzZkNGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzA7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMAotCWV4dGVuZHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBERUxFR0FURSA9IEphdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSmF2YU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSmF2YU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiBERUxFR0FURTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCURFTEVHQVRFLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUwotCSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTMwMDM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8yCi0JZXh0ZW5kcyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIERFTEVHQVRFID0gRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKTsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0phdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0phdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQlERUxFR0FURS5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCi0JCUVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24yXzIuRUNMSVBTRV9MSU5LMl8yX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUwotCSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmNiMWNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24KLQlleHRlbmRzIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBERUxFR0FURSA9IEphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbi5pbnN0YW5jZSgpOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiBERUxFR0FURTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQlERUxFR0FURS5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCi0JCUVjbGlwc2VMaW5rSmF2YUVudGl0eURlZmluaXRpb24uRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUwotCSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzQwN2Y1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24yXzA7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjJfMAotCWV4dGVuZHMgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIERFTEVHQVRFID0gSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uMl8wLmluc3RhbmNlKCk7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uMl8wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjJfMCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBnZXREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIERFTEVHQVRFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCURFTEVHQVRFLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJRWNsaXBzZUxpbmtKYXZhRW50aXR5RGVmaW5pdGlvbi5FQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTCi0JKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OTEyOTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24yXzIKLQlleHRlbmRzIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBERUxFR0FURSA9IEVjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uMl8wLmluc3RhbmNlKCk7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uMl8yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjJfMigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBnZXREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIERFTEVHQVRFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFQ0xJUFNFX0xJTksyXzJfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZID0gbmV3IFN0cmluZ1tdIHsKLQkJRWNsaXBzZUxpbmsuQ09OVkVSVEVSUywKLQkJRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSUywKLQkJRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUlMsCi0JCUVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSUywKLQl9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBFQ0xJUFNFX0xJTksyXzJfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihFQ0xJUFNFX0xJTksyXzJfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCURFTEVHQVRFLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJRUNMSVBTRV9MSU5LMl8yX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUwotCSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24yXzMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGMzNzg4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjJfMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24yXzMKLQlleHRlbmRzIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBERUxFR0FURSA9IEVjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uMl8yLmluc3RhbmNlKCk7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uMl8zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjJfMygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBnZXREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIERFTEVHQVRFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJREVMRUdBVEUuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQlFY2xpcHNlTGlua0phdmFFbnRpdHlEZWZpbml0aW9uMl8zLkVDTElQU0VfTElOSzJfM19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMKLQkpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIwZWQwZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbgotCWV4dGVuZHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotCWltcGxlbWVudHMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBERUxFR0FURSA9IEphdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0phdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIERFTEVHQVRFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSA9IG5ldyBTdHJpbmdbXSB7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQl9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBFQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihFQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCURFTEVHQVRFLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUwotCSk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlTdHJpbmcgdGFyZ2V0RW50aXR5ID0gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNdWx0aVJlZmVyZW5jZVRhcmdldFR5cGVOYW1lKCk7Ci0JCXJldHVybiAodGFyZ2V0RW50aXR5ICE9IG51bGwpCi0JCQkJJiYgKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RW50aXR5KHRhcmdldEVudGl0eSkgIT0gbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJhZThhZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMDsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wCi0JZXh0ZW5kcyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyCi0JaW1wbGVtZW50cyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIERFTEVHQVRFID0gSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCk7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0phdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQlERUxFR0FURS5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCi0JCUVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLkVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMKLQkpOwotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkuaXNEZWZhdWx0KHBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYzk4OWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMgotCWV4dGVuZHMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLQlpbXBsZW1lbnRzIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIERFTEVHQVRFID0gRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKTsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8yKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQlERUxFR0FURS5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCi0JCUVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24yXzIuRUNMSVBTRV9MSU5LMl8yX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUwotCSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYTU1ODcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzA7Ci0KLS8qKgotICogV2UgbmVlZCB0aGlzIGNsYXNzIGJlY2F1c2UgdGhlIEVjbGlwc2VMaW5rIDEuMCAxOm0gbWFwcGluZyBzdXBwb3J0cyBhIGpvaW4KLSAqIGNvbHVtbiBzdHJhdGVneSB3aGlsZSBKUEEgZGlkIG5vdCB1bnRpbCBKUEEgMi4wLiBBcyBhIHJlc3VsdCwgd2UgbmVlZCBhIGNsYXNzCi0gKiB0aGF0IGltcGxlbWVudHMgRWNsaXBzZUxpbmsgMS4wLgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBHZW5lcmljSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcAotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwMl8wCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcChKYXZhT25lVG9NYW55TWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50LCB0cnVlKTsgIC8vIHRydWU9c3VwcG9ydHMgam9pbiBjb2x1bW4gc3RyYXRlZ3kKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk4YjEzYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbgotCWV4dGVuZHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotCWltcGxlbWVudHMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBERUxFR0FURSA9IEphdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIERFTEVHQVRFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSA9IG5ldyBTdHJpbmdbXSB7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQl9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBFQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihFQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCURFTEVHQVRFLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUwotCSk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlTdHJpbmcgdGFyZ2V0RW50aXR5ID0gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTaW5nbGVSZWZlcmVuY2VUYXJnZXRUeXBlTmFtZSgpOwotCQlyZXR1cm4gKHRhcmdldEVudGl0eSAhPSBudWxsKQotCQkJCSYmIChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEVudGl0eSh0YXJnZXRFbnRpdHkpICE9IG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzgyMTE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMDsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAKLQlleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLQlpbXBsZW1lbnRzIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBKYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiBERUxFR0FURTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCURFTEVHQVRFLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5FQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTCi0JKTsKLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkuaXNEZWZhdWx0KHBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTQ2N2JlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8yCi0JZXh0ZW5kcyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBFY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCk7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiBERUxFR0FURTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCURFTEVHQVRFLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjJfMi5FQ0xJUFNFX0xJTksyXzJfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTCi0JKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVN0cnVjdHVyZU1hcHBpbmdEZWZpbml0aW9uMl8zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhU3RydWN0dXJlTWFwcGluZ0RlZmluaXRpb24yXzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkMjAzNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhU3RydWN0dXJlTWFwcGluZ0RlZmluaXRpb24yXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdHVyZUFubm90YXRpb24yXzM7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFTdHJ1Y3R1cmVNYXBwaW5nRGVmaW5pdGlvbjJfMwotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSmF2YVN0cnVjdHVyZU1hcHBpbmdEZWZpbml0aW9uMl8zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSmF2YVN0cnVjdHVyZU1hcHBpbmdEZWZpbml0aW9uMl8zKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5TVFJVQ1RVUkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1N0cnVjdHVyZUFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfMyhwZXJzaXN0ZW50QXR0cmlidXRlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ1NThlZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhTmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzM7Ci0KLS8qKgotICogSmF2YSB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW4KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMKLQlleHRlbmRzIEFic3RyYWN0SmF2YU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbjxFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLCBKYXZhUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLk93bmVyPgotCWltcGxlbWVudHMgSmF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMKLXsKLQkvKiogQHNlZSBBYnN0cmFjdEphdmFOYW1lZENvbHVtbiNBYnN0cmFjdEphdmFOYW1lZENvbHVtbihKYXZhSnBhQ29udGV4dE5vZGUsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5TmFtZWRDb2x1bW4uT3duZXIsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkQ29sdW1uQW5ub3RhdGlvbikgKi8KLQlwcm90ZWN0ZWQgLyogZmluYWwgKi8gRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyBjb2x1bW5Bbm5vdGF0aW9uOyAgLy8gbmV2ZXIgbnVsbAotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRUYWJsZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRUYWJsZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkQ29udGV4dFByb3BlcnR5OwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENvbnRleHRQcm9wZXJ0eTsKLQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZFByaW1hcnlLZXk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdFByaW1hcnlLZXkgPSBERUZBVUxUX1BSSU1BUllfS0VZOwotCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMoSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5SW1wbDJfMyBwYXJlbnQsIEphdmFSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuT3duZXIgb3duZXIsIEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMgY29sdW1uQW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyLCBjb2x1bW5Bbm5vdGF0aW9uKTsKLQkJdGhpcy5zcGVjaWZpZWRUYWJsZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRUYWJsZSgpOwotCQl0aGlzLnNwZWNpZmllZENvbnRleHRQcm9wZXJ0eSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRDb250ZXh0UHJvcGVydHkoKTsKLQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5ID0gdGhpcy5idWlsZFNwZWNpZmllZFByaW1hcnlLZXkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRUYWJsZV8odGhpcy5idWlsZFNwZWNpZmllZFRhYmxlKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZENvbnRleHRQcm9wZXJ0eV8odGhpcy5idWlsZFNwZWNpZmllZENvbnRleHRQcm9wZXJ0eSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRQcmltYXJ5S2V5Xyh0aGlzLmJ1aWxkU3BlY2lmaWVkUHJpbWFyeUtleSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHRUYWJsZSh0aGlzLmJ1aWxkRGVmYXVsdFRhYmxlKCkpOwotCQl0aGlzLnNldERlZmF1bHRDb250ZXh0UHJvcGVydHkodGhpcy5idWlsZERlZmF1bHRDb250ZXh0UHJvcGVydHkoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFByaW1hcnlLZXkodGhpcy5idWlsZERlZmF1bHRQcmltYXJ5S2V5KCkpOwotCX0KLQotCS8vICoqKioqKioqKiogY29sdW1uIGFubm90YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMgZ2V0Q29sdW1uQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uQW5ub3RhdGlvbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb2x1bW5Bbm5vdGF0aW9uKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMgY29sdW1uQW5ub3RhdGlvbikgewotCQl0aGlzLmNvbHVtbkFubm90YXRpb24gPSBjb2x1bW5Bbm5vdGF0aW9uOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbHVtbkFubm90YXRpb24oKSB7Ci0JCS8vIHdlIGRvbid0IHJlbW92ZSBhIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbiBhbm5vdGF0aW9uIHdoZW4gaXQgaXMgZW1wdHkKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGFibGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFRhYmxlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRUYWJsZSA6IHRoaXMuZGVmYXVsdFRhYmxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFRhYmxlKFN0cmluZyB0YWJsZSkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRUYWJsZSwgdGFibGUpKSB7Ci0JCQl0aGlzLmdldENvbHVtbkFubm90YXRpb24oKS5zZXRUYWJsZSh0YWJsZSk7Ci0JCQl0aGlzLnJlbW92ZUNvbHVtbkFubm90YXRpb25JZlVuc2V0KCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFRhYmxlXyh0YWJsZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRUYWJsZV8oU3RyaW5nIHRhYmxlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFRhYmxlOwotCQl0aGlzLnNwZWNpZmllZFRhYmxlID0gdGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVEFCTEVfUFJPUEVSVFksIG9sZCwgdGFibGUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uQW5ub3RhdGlvbigpLmdldFRhYmxlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRUYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VGFibGUoU3RyaW5nIHRhYmxlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRUYWJsZTsKLQkJdGhpcy5kZWZhdWx0VGFibGUgPSB0YWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVEFCTEVfUFJPUEVSVFksIG9sZCwgdGFibGUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0VGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmdldERlZmF1bHRUYWJsZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy5nZXRDb2x1bW5Bbm5vdGF0aW9uKCkuZ2V0VGFibGVUZXh0UmFuZ2UoKSwgYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnRleHRQcm9wZXJ0eSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRleHRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZENvbnRleHRQcm9wZXJ0eSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkQ29udGV4dFByb3BlcnR5IDogdGhpcy5kZWZhdWx0Q29udGV4dFByb3BlcnR5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkQ29udGV4dFByb3BlcnR5KCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDb250ZXh0UHJvcGVydHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ29udGV4dFByb3BlcnR5KFN0cmluZyBjb250ZXh0UHJvcGVydHkpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkQ29udGV4dFByb3BlcnR5LCBjb250ZXh0UHJvcGVydHkpKSB7Ci0JCQl0aGlzLmdldENvbHVtbkFubm90YXRpb24oKS5zZXRDb250ZXh0UHJvcGVydHkoY29udGV4dFByb3BlcnR5KTsKLQkJCXRoaXMucmVtb3ZlQ29sdW1uQW5ub3RhdGlvbklmVW5zZXQoKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkQ29udGV4dFByb3BlcnR5Xyhjb250ZXh0UHJvcGVydHkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQ29udGV4dFByb3BlcnR5XyhTdHJpbmcgY29udGV4dFByb3BlcnR5KSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZENvbnRleHRQcm9wZXJ0eTsKLQkJdGhpcy5zcGVjaWZpZWRDb250ZXh0UHJvcGVydHkgPSBjb250ZXh0UHJvcGVydHk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ09OVEVYVF9QUk9QRVJUWV9QUk9QRVJUWSwgb2xkLCBjb250ZXh0UHJvcGVydHkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRDb250ZXh0UHJvcGVydHkoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtbkFubm90YXRpb24oKS5nZXRDb250ZXh0UHJvcGVydHkoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb250ZXh0UHJvcGVydHkoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRDb250ZXh0UHJvcGVydHk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdENvbnRleHRQcm9wZXJ0eShTdHJpbmcgY29udGV4dFByb3BlcnR5KSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRDb250ZXh0UHJvcGVydHk7Ci0JCXRoaXMuZGVmYXVsdENvbnRleHRQcm9wZXJ0eSA9IGNvbnRleHRQcm9wZXJ0eTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQ09OVEVYVF9QUk9QRVJUWV9QUk9QRVJUWSwgb2xkLCBjb250ZXh0UHJvcGVydHkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0Q29udGV4dFByb3BlcnR5KCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXREZWZhdWx0Q29udGV4dFByb3BlcnR5TmFtZSgpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29udGV4dFByb3BlcnR5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy5nZXRDb2x1bW5Bbm5vdGF0aW9uKCkuZ2V0Q29udGV4dFByb3BlcnR5VGV4dFJhbmdlKCksIGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmltYXJ5S2V5ICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzUHJpbWFyeUtleSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFByaW1hcnlLZXkgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXkuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmlzRGVmYXVsdFByaW1hcnlLZXkoKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRQcmltYXJ5S2V5KCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFByaW1hcnlLZXkoQm9vbGVhbiBwcmltYXJ5S2V5KSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnNwZWNpZmllZFByaW1hcnlLZXksIHByaW1hcnlLZXkpKSB7Ci0JCQl0aGlzLmdldENvbHVtbkFubm90YXRpb24oKS5zZXRQcmltYXJ5S2V5KHByaW1hcnlLZXkpOwotCQkJdGhpcy5yZW1vdmVDb2x1bW5Bbm5vdGF0aW9uSWZVbnNldCgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRQcmltYXJ5S2V5XyhwcmltYXJ5S2V5KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFByaW1hcnlLZXlfKEJvb2xlYW4gcHJpbWFyeUtleSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleTsKLQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5ID0gcHJpbWFyeUtleTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9QUklNQVJZX0tFWV9QUk9QRVJUWSwgb2xkLCBwcmltYXJ5S2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZFByaW1hcnlLZXkoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtbkFubm90YXRpb24oKS5nZXRQcmltYXJ5S2V5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0UHJpbWFyeUtleSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFByaW1hcnlLZXk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFByaW1hcnlLZXkoYm9vbGVhbiBwcmltYXJ5S2V5KSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZWZhdWx0UHJpbWFyeUtleTsKLQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleSA9IHByaW1hcnlLZXk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1BSSU1BUllfS0VZX1BST1BFUlRZLCBvbGQsIHByaW1hcnlLZXkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVmYXVsdFByaW1hcnlLZXkoKSB7Ci0JCXJldHVybiBERUZBVUxUX1BSSU1BUllfS0VZOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3lJbXBsMl8zIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3lJbXBsMl8zKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlVHlwZSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgY29tcGxldGlvbiBwcm9wb3NhbHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWlmICh0aGlzLnRhYmxlVG91Y2hlcyhwb3MpKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRKYXZhQ2FuZGlkYXRlVGFibGVOYW1lcyhmaWx0ZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHRhYmxlVG91Y2hlcyhpbnQgcG9zKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtbkFubm90YXRpb24oKS50YWJsZVRvdWNoZXMocG9zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ2FuZGlkYXRlVGFibGVOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscyh0aGlzLmdldENhbmRpZGF0ZVRhYmxlTmFtZXMoZmlsdGVyKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxTdHJpbmc+KHRoaXMuZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpLCBmaWx0ZXIpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLnRhYmxlTmFtZUlzSW52YWxpZCh0aGlzLmdldFRhYmxlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ldyBKYXZhVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcih0aGlzLCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVGltZU9mRGF5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVGltZU9mRGF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNGYwZGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVRpbWVPZkRheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1RpbWVPZkRheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhVGltZU9mRGF5Ci0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtUaW1lT2ZEYXkKLXsKLQlwcm90ZWN0ZWQgZmluYWwgRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRvZEFubm90YXRpb247Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBob3VyOwotCXByb3RlY3RlZCBJbnRlZ2VyIG1pbnV0ZTsKLQlwcm90ZWN0ZWQgSW50ZWdlciBzZWNvbmQ7Ci0JcHJvdGVjdGVkIEludGVnZXIgbWlsbGlzZWNvbmQ7Ci0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFUaW1lT2ZEYXkoSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBwYXJlbnQsIEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0b2RBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMudG9kQW5ub3RhdGlvbiA9IHRvZEFubm90YXRpb247Ci0JCXRoaXMuaG91ciA9IHRvZEFubm90YXRpb24uZ2V0SG91cigpOwotCQl0aGlzLm1pbnV0ZSA9IHRvZEFubm90YXRpb24uZ2V0TWludXRlKCk7Ci0JCXRoaXMuc2Vjb25kID0gdG9kQW5ub3RhdGlvbi5nZXRTZWNvbmQoKTsKLQkJdGhpcy5taWxsaXNlY29uZCA9IHRvZEFubm90YXRpb24uZ2V0TWlsbGlzZWNvbmQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRIb3VyXyh0aGlzLnRvZEFubm90YXRpb24uZ2V0SG91cigpKTsKLQkJdGhpcy5zZXRNaW51dGVfKHRoaXMudG9kQW5ub3RhdGlvbi5nZXRNaW51dGUoKSk7Ci0JCXRoaXMuc2V0U2Vjb25kXyh0aGlzLnRvZEFubm90YXRpb24uZ2V0U2Vjb25kKCkpOwotCQl0aGlzLnNldE1pbGxpc2Vjb25kXyh0aGlzLnRvZEFubm90YXRpb24uZ2V0TWlsbGlzZWNvbmQoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGhvdXIgKioqKioqKioqKgotCi0JcHVibGljIEludGVnZXIgZ2V0SG91cigpIHsKLQkJcmV0dXJuIHRoaXMuaG91cjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIb3VyKEludGVnZXIgaG91cikgewotCQl0aGlzLnRvZEFubm90YXRpb24uc2V0SG91cihob3VyKTsKLQkJdGhpcy5zZXRIb3VyXyhob3VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRIb3VyXyhJbnRlZ2VyIGhvdXIpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLmhvdXI7Ci0JCXRoaXMuaG91ciA9IGhvdXI7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChIT1VSX1BST1BFUlRZLCBvbGQsIGhvdXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaW51dGUgKioqKioqKioqKgotCi0JcHVibGljIEludGVnZXIgZ2V0TWludXRlKCkgewotCQlyZXR1cm4gdGhpcy5taW51dGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWludXRlKEludGVnZXIgbWludXRlKSB7Ci0JCXRoaXMudG9kQW5ub3RhdGlvbi5zZXRNaW51dGUobWludXRlKTsKLQkJdGhpcy5zZXRNaW51dGVfKG1pbnV0ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWludXRlXyhJbnRlZ2VyIG1pbnV0ZSkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMubWludXRlOwotCQl0aGlzLm1pbnV0ZSA9IG1pbnV0ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1JTlVURV9QUk9QRVJUWSwgb2xkLCBtaW51dGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZWNvbmQgKioqKioqKioqKgotCi0JcHVibGljIEludGVnZXIgZ2V0U2Vjb25kKCkgewotCQlyZXR1cm4gdGhpcy5zZWNvbmQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2Vjb25kKEludGVnZXIgc2Vjb25kKSB7Ci0JCXRoaXMudG9kQW5ub3RhdGlvbi5zZXRTZWNvbmQoc2Vjb25kKTsKLQkJdGhpcy5zZXRTZWNvbmRfKHNlY29uZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2Vjb25kXyhJbnRlZ2VyIHNlY29uZCkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuc2Vjb25kOwotCQl0aGlzLnNlY29uZCA9IHNlY29uZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNFQ09ORF9QUk9QRVJUWSwgb2xkLCBzZWNvbmQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaWxsaXNlY29uZCAqKioqKioqKioqCi0KLQlwdWJsaWMgSW50ZWdlciBnZXRNaWxsaXNlY29uZCgpIHsKLQkJcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWlsbGlzZWNvbmQoSW50ZWdlciBtaWxsaXNlY29uZCkgewotCQl0aGlzLnRvZEFubm90YXRpb24uc2V0TWlsbGlzZWNvbmQobWlsbGlzZWNvbmQpOwotCQl0aGlzLnNldE1pbGxpc2Vjb25kXyhtaWxsaXNlY29uZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWlsbGlzZWNvbmRfKEludGVnZXIgbWlsbGlzZWNvbmQpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLm1pbGxpc2Vjb25kOwotCQl0aGlzLm1pbGxpc2Vjb25kID0gbWlsbGlzZWNvbmQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNSUxMSVNFQ09ORF9QUk9QRVJUWSwgb2xkLCBtaWxsaXNlY29uZCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0NhY2hpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFFY2xpcHNlTGlua0NhY2hpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGdldENhY2hpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gZ2V0VGltZU9mRGF5QW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMudG9kQW5ub3RhdGlvbjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMudG9kQW5ub3RhdGlvbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRDYWNoaW5nKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVRyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMxOTY1NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uCi0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtKYXZhVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0phdmFUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5UUkFOU0ZPUk1BVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbih0aGlzLmdldEFubm90YXRpb25OYW1lKCkpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUsIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gKChFY2xpcHNlTGlua0pwYUZhY3RvcnkpIGZhY3RvcnkpLmJ1aWxkSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nKHBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjJjNTc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFjY2VzczJfMEFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8wCi0JZXh0ZW5kcyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIERFTEVHQVRFID0gRWNsaXBzZUxpbmtKYXZhVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSmF2YVRyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24yXzAoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtKYXZhVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbjJfMCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWV8yXzAgPSBuZXcgU3RyaW5nW10gewotCQlBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQl9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTXzJfMCA9IG5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZXzJfMCk7Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQlERUxFR0FURS5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCi0JCVNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU18yXzAKLQkpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YmNmNDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uCi0JaW1wbGVtZW50cyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0phdmFWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSmF2YVZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVkFSSUFCTEVfT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKEVjbGlwc2VMaW5rSnBhRmFjdG9yeSkgZmFjdG9yeSkuYnVpbGRKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZyhwZXJzaXN0ZW50QXR0cmlidXRlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlyZXR1cm4gKChKYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlKSBwZXJzaXN0ZW50QXR0cmlidXRlKS50eXBlSXNWYWxpZEZvclZhcmlhYmxlT25lVG9PbmUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2N2MxN2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFjY2VzczJfMEFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAKLQlleHRlbmRzIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBERUxFR0FURSA9IEVjbGlwc2VMaW5rSmF2YVZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0phdmFWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSmF2YVZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIERFTEVHQVRFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVlfMl8wID0gbmV3IFN0cmluZ1tdIHsKLQkJQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU18yXzAgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWV8yXzApOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJREVMRUdBVEUuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQlTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfMl8wCi0JKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWQyMzNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uCi0JZXh0ZW5kcyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIERFTEVHQVRFID0gSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIERFTEVHQVRFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJREVMRUdBVEUuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQlFY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uLkVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMKLQkpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWZlYjJlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24yXzA7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24yXzAKLQlleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCk7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uMl8wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbjJfMCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQlERUxFR0FURS5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCi0JCUVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24uRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUwotCSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYTEwODQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbjJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbjJfMgotCWV4dGVuZHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBERUxFR0FURSA9IEVjbGlwc2VMaW5rSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbjJfMigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24yXzIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIERFTEVHQVRFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJREVMRUdBVEUuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQlFY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uMl8yLkVDTElQU0VfTElOSzJfMl9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMKLQkpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M2NjYxNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFWaXJ0dWFsTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLQotLyoqCi0gKiBKYXZhIHZpcnR1YWwgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFWaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhVmlydHVhbE5hbWVkRGlzY3JpbWluYXRvckNvbHVtbjxKYXZhUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLk93bmVyLCBSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+Ci0JaW1wbGVtZW50cyBKYXZhVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMKLXsKLQlwcm90ZWN0ZWQgZmluYWwgUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIG92ZXJyaWRkZW5Db2x1bW47Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFRhYmxlOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFRhYmxlOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRDb250ZXh0UHJvcGVydHk7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0Q29udGV4dFByb3BlcnR5OwotCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkUHJpbWFyeUtleTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0UHJpbWFyeUtleTsKLQotCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YVZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuT3duZXIgb3duZXIsIFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBvdmVycmlkZGVuQ29sdW1uKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIpOwotCQl0aGlzLm92ZXJyaWRkZW5Db2x1bW4gPSBvdmVycmlkZGVuQ29sdW1uOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZFRhYmxlKHRoaXMuYnVpbGRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0VGFibGUodGhpcy5idWlsZERlZmF1bHRUYWJsZSgpKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZENvbnRleHRQcm9wZXJ0eSh0aGlzLmJ1aWxkU3BlY2lmaWVkQ29udGV4dFByb3BlcnR5KCkpOwotCQl0aGlzLnNldERlZmF1bHRDb250ZXh0UHJvcGVydHkodGhpcy5idWlsZERlZmF1bHRDb250ZXh0UHJvcGVydHkoKSk7Ci0KLQkJdGhpcy5zZXRTcGVjaWZpZWRQcmltYXJ5S2V5KHRoaXMuYnVpbGRTcGVjaWZpZWRQcmltYXJ5S2V5KCkpOwotCQl0aGlzLnNldERlZmF1bHRQcmltYXJ5S2V5KHRoaXMuYnVpbGREZWZhdWx0UHJpbWFyeUtleSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgZ2V0T3ZlcnJpZGRlbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMub3ZlcnJpZGRlbkNvbHVtbjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHRhYmxlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRUYWJsZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkVGFibGUgOiB0aGlzLmRlZmF1bHRUYWJsZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRUYWJsZShTdHJpbmcgdGFibGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkVGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkVGFibGUgPSB0YWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSwgb2xkLCB0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPdmVycmlkZGVuQ29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFRhYmxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRUYWJsZShTdHJpbmcgdGFibGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFRhYmxlOwotCQl0aGlzLmRlZmF1bHRUYWJsZSA9IHRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9UQUJMRV9QUk9QRVJUWSwgb2xkLCB0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0RGVmYXVsdFRhYmxlTmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250ZXh0IHByb3BlcnR5ICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFByb3BlcnR5KCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkQ29udGV4dFByb3BlcnR5ICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRDb250ZXh0UHJvcGVydHkgOiB0aGlzLmRlZmF1bHRDb250ZXh0UHJvcGVydHk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRDb250ZXh0UHJvcGVydHkoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZENvbnRleHRQcm9wZXJ0eTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRDb250ZXh0UHJvcGVydHkoU3RyaW5nIGNvbnRleHRQcm9wZXJ0eSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRDb250ZXh0UHJvcGVydHk7Ci0JCXRoaXMuc3BlY2lmaWVkQ29udGV4dFByb3BlcnR5ID0gY29udGV4dFByb3BlcnR5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NPTlRFWFRfUFJPUEVSVFlfUFJPUEVSVFksIG9sZCwgY29udGV4dFByb3BlcnR5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkQ29udGV4dFByb3BlcnR5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRPdmVycmlkZGVuQ29sdW1uKCkuZ2V0U3BlY2lmaWVkQ29udGV4dFByb3BlcnR5KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29udGV4dFByb3BlcnR5KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q29udGV4dFByb3BlcnR5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRDb250ZXh0UHJvcGVydHkoU3RyaW5nIGNvbnRleHRQcm9wZXJ0eSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0Q29udGV4dFByb3BlcnR5OwotCQl0aGlzLmRlZmF1bHRDb250ZXh0UHJvcGVydHkgPSBjb250ZXh0UHJvcGVydHk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NPTlRFWFRfUFJPUEVSVFlfUFJPUEVSVFksIG9sZCwgY29udGV4dFByb3BlcnR5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdENvbnRleHRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0RGVmYXVsdENvbnRleHRQcm9wZXJ0eU5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJpbWFyeSBrZXkgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5S2V5KCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleS5ib29sZWFuVmFsdWUoKSA6IHRoaXMuZGVmYXVsdFByaW1hcnlLZXk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkUHJpbWFyeUtleSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRQcmltYXJ5S2V5KEJvb2xlYW4gcHJpbWFyeUtleSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleTsKLQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5ID0gcHJpbWFyeUtleTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9QUklNQVJZX0tFWV9QUk9QRVJUWSwgb2xkLCBwcmltYXJ5S2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZFByaW1hcnlLZXkoKSB7Ci0JCXJldHVybiB0aGlzLmdldE92ZXJyaWRkZW5Db2x1bW4oKS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0UHJpbWFyeUtleSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFByaW1hcnlLZXk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFByaW1hcnlLZXkoYm9vbGVhbiBwcmltYXJ5S2V5KSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZWZhdWx0UHJpbWFyeUtleTsKLQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleSA9IHByaW1hcnlLZXk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1BSSU1BUllfS0VZX1BST1BFUlRZLCBvbGQsIHByaW1hcnlLZXkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVmYXVsdFByaW1hcnlLZXkoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmdldERlZmF1bHRQcmltYXJ5S2V5KCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZCgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIudGFibGVOYW1lSXNJbnZhbGlkKHRoaXMuZ2V0VGFibGUoKSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciBidWlsZFRleHRSYW5nZVJlc29sdmVyKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBuZXcgSmF2YVRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIodGhpcywgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0FycmF5TWFwcGluZzJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0FycmF5TWFwcGluZzJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzk1ODA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXNzb2NpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZUFzc29jaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5TmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbHVtbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudW1lcmF0ZWRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTG9iQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5FbnRpdHlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5OYW1lZENvbHVtblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuTnVsbEphdmFDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NZXRhbW9kZWxGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0FycmF5TWFwcGluZzJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUNvbnZlcnRpYmxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0FycmF5QW5ub3RhdGlvbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPEVjbGlwc2VMaW5rQXJyYXlBbm5vdGF0aW9uMl8zPgotCWltcGxlbWVudHMgCi0JCUVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zLAotCQlFY2xpcHNlTGlua0phdmFDb252ZXJ0aWJsZU1hcHBpbmcsIAotCQlKYXZhQ29sdW1uTWFwcGluZwotewotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFDb2x1bW4gY29sdW1uOwotCi0JcHJvdGVjdGVkIEphdmFDb252ZXJ0ZXIgY29udmVydGVyOyAgLy8gbmV2ZXIgbnVsbAotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEphdmFDb252ZXJ0ZXIuQWRhcHRlcltdIENPTlZFUlRFUl9BREFQVEVSX0FSUkFZID0gbmV3IEphdmFDb252ZXJ0ZXIuQWRhcHRlcltdIHsKLQkJSmF2YUVudW1lcmF0ZWRDb252ZXJ0ZXIuQWRhcHRlci5pbnN0YW5jZSgpLAotCQlKYXZhVGVtcG9yYWxDb252ZXJ0ZXIuQmFzaWNBZGFwdGVyLmluc3RhbmNlKCksCi0JCUphdmFMb2JDb252ZXJ0ZXIuQWRhcHRlci5pbnN0YW5jZSgpLAotCQlKYXZhRWNsaXBzZUxpbmtDb252ZXJ0LkFkYXB0ZXIuaW5zdGFuY2UoKQotCX07Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPEphdmFDb252ZXJ0ZXIuQWRhcHRlcj4gQ09OVkVSVEVSX0FEQVBURVJTID0gbmV3IEFycmF5SXRlcmFibGU8SmF2YUNvbnZlcnRlci5BZGFwdGVyPihDT05WRVJURVJfQURBUFRFUl9BUlJBWSk7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGNvbnZlcnRlckNvbnRhaW5lcjsKLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzMoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29sdW1uID0gdGhpcy5idWlsZENvbHVtbigpOwotCQl0aGlzLmNvbnZlcnRlciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXIoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNvbHVtbi5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY0NvbnZlcnRlcigpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5jb2x1bW4udXBkYXRlKCk7Ci0JCXRoaXMuc3luY0NvbnZlcnRlcigpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbHVtbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUNvbHVtbiBnZXRDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUNvbHVtbiBidWlsZENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUNvbHVtbih0aGlzLCB0aGlzKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUNvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gY29udmVydGVyVHlwZSkgewotCQlpZiAodGhpcy5jb252ZXJ0ZXIuZ2V0VHlwZSgpICE9IGNvbnZlcnRlclR5cGUpIHsKLQkJCXRoaXMuY29udmVydGVyLmRpc3Bvc2UoKTsKLQkJCUphdmFDb252ZXJ0ZXIuQWRhcHRlciBjb252ZXJ0ZXJBZGFwdGVyID0gdGhpcy5nZXRDb252ZXJ0ZXJBZGFwdGVyKGNvbnZlcnRlclR5cGUpOwotCQkJdGhpcy5yZXRhaW5Db252ZXJ0ZXJBbm5vdGF0aW9uKGNvbnZlcnRlckFkYXB0ZXIpOwotCQkJdGhpcy5zZXRDb252ZXJ0ZXJfKHRoaXMuYnVpbGRDb252ZXJ0ZXIoY29udmVydGVyQWRhcHRlcikpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDb252ZXJ0ZXIgYnVpbGRDb252ZXJ0ZXIoSmF2YUNvbnZlcnRlci5BZGFwdGVyIGNvbnZlcnRlckFkYXB0ZXIpIHsKLQkJIHJldHVybiAoY29udmVydGVyQWRhcHRlciAhPSBudWxsKSA/Ci0JCQkJY29udmVydGVyQWRhcHRlci5idWlsZE5ld0NvbnZlcnRlcih0aGlzLCB0aGlzLmdldEpwYUZhY3RvcnkoKSkgOgotCQkJCXRoaXMuYnVpbGROdWxsQ29udmVydGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29udmVydGVyXyhKYXZhQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlDb252ZXJ0ZXIgb2xkID0gdGhpcy5jb252ZXJ0ZXI7Ci0JCXRoaXMuY29udmVydGVyID0gY29udmVydGVyOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OVkVSVEVSX1BST1BFUlRZLCBvbGQsIGNvbnZlcnRlcik7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgYWxsIHRoZSBjb252ZXJ0ZXIgYW5ub3RhdGlvbnMgPGVtPmV4Y2VwdDwvZW0+IGZvciB0aGUgYW5ub3RhdGlvbgotCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyLiBJZiB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiwgcmVtb3ZlIDxlbT5hbGw8L2VtPiB0aGUgY29udmVydGVyIGFubm90YXRpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJldGFpbkNvbnZlcnRlckFubm90YXRpb24oSmF2YUNvbnZlcnRlci5BZGFwdGVyIGNvbnZlcnRlckFkYXB0ZXIpIHsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlmb3IgKEphdmFDb252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyIDogdGhpcy5nZXRDb252ZXJ0ZXJBZGFwdGVycygpKSB7Ci0JCQlpZiAoYWRhcHRlciAhPSBjb252ZXJ0ZXJBZGFwdGVyKSB7Ci0JCQkJYWRhcHRlci5yZW1vdmVDb252ZXJ0ZXJBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBKYXZhQ29udmVydGVyIGJ1aWxkQ29udmVydGVyKCkgewotCQlKcGFGYWN0b3J5IGpwYUZhY3RvcnkgPSB0aGlzLmdldEpwYUZhY3RvcnkoKTsKLQkJZm9yIChKYXZhQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJSmF2YUNvbnZlcnRlciBqYXZhQ29udmVydGVyID0gYWRhcHRlci5idWlsZENvbnZlcnRlcih0aGlzLCBqcGFGYWN0b3J5KTsKLQkJCWlmIChqYXZhQ29udmVydGVyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gamF2YUNvbnZlcnRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5idWlsZE51bGxDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jQ29udmVydGVyKCkgewotCQlBc3NvY2lhdGlvbjxKYXZhQ29udmVydGVyLkFkYXB0ZXIsIEFubm90YXRpb24+IGFzc29jID0gdGhpcy5nZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKCk7Ci0JCWlmIChhc3NvYyA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5jb252ZXJ0ZXIuZ2V0VHlwZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLnNldENvbnZlcnRlcl8odGhpcy5idWlsZE51bGxDb252ZXJ0ZXIoKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlKYXZhQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA9IGFzc29jLmdldEtleSgpOwotCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYXNzb2MuZ2V0VmFsdWUoKTsKLQkJCWlmICgodGhpcy5jb252ZXJ0ZXIuZ2V0VHlwZSgpID09IGFkYXB0ZXIuZ2V0Q29udmVydGVyVHlwZSgpKSAmJgotCQkJCQkodGhpcy5jb252ZXJ0ZXIuZ2V0Q29udmVydGVyQW5ub3RhdGlvbigpID09IGFubm90YXRpb24pKSB7Ci0JCQkJdGhpcy5jb252ZXJ0ZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNldENvbnZlcnRlcl8oYWRhcHRlci5idWlsZENvbnZlcnRlcihhbm5vdGF0aW9uLCB0aGlzLCB0aGlzLmdldEpwYUZhY3RvcnkoKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBjb252ZXJ0ZXIgYW5ub3RhdGlvbiB3ZSBmaW5kIGFsb25nIHdpdGggaXRzIGNvcnJlc3BvbmRpbmcKLQkgKiBhZGFwdGVyLiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIGNvbnZlcnRlciBhbm5vdGF0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgQXNzb2NpYXRpb248SmF2YUNvbnZlcnRlci5BZGFwdGVyLCBBbm5vdGF0aW9uPiBnZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKCkgewotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JCWZvciAoSmF2YUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldENvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFkYXB0ZXIuZ2V0Q29udmVydGVyQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBTaW1wbGVBc3NvY2lhdGlvbjxKYXZhQ29udmVydGVyLkFkYXB0ZXIsIEFubm90YXRpb24+KGFkYXB0ZXIsIGFubm90YXRpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQ29udmVydGVyIGJ1aWxkTnVsbENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIG5ldyBOdWxsSmF2YUNvbnZlcnRlcih0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyIGFkYXB0ZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udmVydGVyIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgY29udmVydGVyIHR5cGUuCi0JICovCi0JcHJvdGVjdGVkIEphdmFDb252ZXJ0ZXIuQWRhcHRlciBnZXRDb252ZXJ0ZXJBZGFwdGVyKENsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGNvbnZlcnRlclR5cGUpIHsKLQkJZm9yIChKYXZhQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJaWYgKGFkYXB0ZXIuZ2V0Q29udmVydGVyVHlwZSgpID09IGNvbnZlcnRlclR5cGUpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YUNvbnZlcnRlci5BZGFwdGVyPiBnZXRDb252ZXJ0ZXJBZGFwdGVycygpIHsKLQkJcmV0dXJuIENPTlZFUlRFUl9BREFQVEVSUzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGdldENvbnZlcnRlckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbCh0aGlzKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBjb250YWluZXIgcGFyZW50IGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFKcGFDb250ZXh0Tm9kZSBnZXRDb252ZXJ0ZXJDb250YWluZXJQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzOyAgLy8gbm8gYWRhcHRlcgotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IGdldEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGFyZW50U3VwcG9ydHNDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1ldGFtb2RlbCAqKioqKioqKioqICAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1ldGFtb2RlbEZpZWxkVHlwZU5hbWUoKSB7Ci0JCXJldHVybiAoKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wKSB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSkuZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0YW1vZGVsVHlwZU5hbWUoKSB7Ci0JCS8vVE9ETyBzaG91bGQgZ2V0IHRoaXMgZnJvbSB0YXJnZXRDbGFzcwotCQlTdHJpbmcgdGFyZ2V0VHlwZU5hbWUgPSB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNdWx0aVJlZmVyZW5jZVRhcmdldFR5cGVOYW1lKCk7Ci0JCXJldHVybiAodGFyZ2V0VHlwZU5hbWUgIT0gbnVsbCkgPyB0YXJnZXRUeXBlTmFtZSA6IE1ldGFtb2RlbEZpZWxkLkRFRkFVTFRfVFlQRV9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5BUlJBWV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQXJyYXlBbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmFDb2x1bW4uT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChDb2x1bW5Bbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0Tm9uTnVsbEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbHVtbkFubm90YXRpb24oKSB7Ci0JCXRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRBbGxBc3NvY2lhdGVkVGFibGVOYW1lcygpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2wsIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIG5ldyBOYW1lZENvbHVtblZhbGlkYXRvcih0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgKFJlYWRPbmx5QmFzZUNvbHVtbikgY29sLCAoVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcikgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBFbnRpdHlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXN1bHQgPSB0aGlzLmNvbHVtbi5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXN1bHQgPSB0aGlzLmNvbnZlcnRlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmNvbHVtbi52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmNvbnZlcnRlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODQzMjg1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUNvbnZlcnRpYmxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZywgRWNsaXBzZUxpbmtKYXZhQ29udmVydGlibGVNYXBwaW5nCi17Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGNvbnZlcnRlckNvbnRhaW5lcjsKLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGdldENvbnZlcnRlckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbCh0aGlzKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBjb250YWluZXIgcGFyZW50IGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFKcGFDb250ZXh0Tm9kZSBnZXRDb252ZXJ0ZXJDb250YWluZXJQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzOyAgLy8gbm8gYWRhcHRlcgotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IGdldEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGFyZW50U3VwcG9ydHNDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1ldGFtb2RlbCAqKioqKioqKioqICAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1ldGFtb2RlbEZpZWxkVHlwZU5hbWUoKSB7Ci0JCXJldHVybiAoKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wKSB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSkuZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0YW1vZGVsVHlwZU5hbWUoKSB7Ci0JCVN0cmluZyB0YXJnZXRUeXBlTmFtZSA9IHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE11bHRpUmVmZXJlbmNlVGFyZ2V0VHlwZU5hbWUoKTsKLQkJcmV0dXJuICh0YXJnZXRUeXBlTmFtZSAhPSBudWxsKSA/IHRhcmdldFR5cGVOYW1lIDogTWV0YW1vZGVsRmllbGQuREVGQVVMVF9UWVBFX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5CQVNJQ19DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjMwM2E0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NZXRhbW9kZWxGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFDb252ZXJ0aWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc8RWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZywgRWNsaXBzZUxpbmtKYXZhQ29udmVydGlibGVNYXBwaW5nCi17Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGNvbnZlcnRlckNvbnRhaW5lcjsKLQkKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXJzICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgZ2V0Q29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBidWlsZENvbnZlcnRlckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsKHRoaXMpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBjb250YWluZXIgcGFyZW50IGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFKcGFDb250ZXh0Tm9kZSBnZXRDb252ZXJ0ZXJDb250YWluZXJQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzOyAgLy8gbm8gYWRhcHRlcgotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IGdldEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGFyZW50U3VwcG9ydHNDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5CQVNJQ19NQVBfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKiAgCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNZXRhbW9kZWxGaWVsZFR5cGVOYW1lKCkgewotCQlyZXR1cm4gKChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMCkgdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkpLmdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkVHlwZU5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbFR5cGVOYW1lKCkgewotCQlTdHJpbmcgdGFyZ2V0VHlwZU5hbWUgPSB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNdWx0aVJlZmVyZW5jZVRhcmdldFR5cGVOYW1lKCk7Ci0JCXJldHVybiAodGFyZ2V0VHlwZU5hbWUgIT0gbnVsbCkgPyB0YXJnZXRUeXBlTmFtZSA6IE1ldGFtb2RlbEZpZWxkLkRFRkFVTFRfVFlQRV9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZE1ldGFtb2RlbEZpZWxkVHlwZUFyZ3VtZW50TmFtZXNUbyhBcnJheUxpc3Q8U3RyaW5nPiB0eXBlQXJndW1lbnROYW1lcykgewotCQl0aGlzLmFkZE1ldGFtb2RlbEZpZWxkTWFwS2V5VHlwZUFyZ3VtZW50TmFtZVRvKHR5cGVBcmd1bWVudE5hbWVzKTsKLQkJc3VwZXIuYWRkTWV0YW1vZGVsRmllbGRUeXBlQXJndW1lbnROYW1lc1RvKHR5cGVBcmd1bWVudE5hbWVzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZXRhbW9kZWxGaWVsZE1hcEtleVR5cGVBcmd1bWVudE5hbWVUbyhBcnJheUxpc3Q8U3RyaW5nPiB0eXBlQXJndW1lbnROYW1lcykgewotCQlTdHJpbmcgbWFwS2V5VHlwZU5hbWUgPSB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNdWx0aVJlZmVyZW5jZU1hcEtleVR5cGVOYW1lKCk7Ci0JCW1hcEtleVR5cGVOYW1lID0gbWFwS2V5VHlwZU5hbWUgIT0gbnVsbCA/IG1hcEtleVR5cGVOYW1lIDogTWV0YW1vZGVsRmllbGQuREVGQVVMVF9UWVBFX05BTUU7Ci0JCXR5cGVBcmd1bWVudE5hbWVzLmFkZChtYXBLZXlUeXBlTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzFhODJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXV0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUNvbnZlcnRpYmxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFCYXNpY01hcHBpbmcKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nLCBFY2xpcHNlTGlua0phdmFDb252ZXJ0aWJsZU1hcHBpbmcKLXsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlOwotCQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgY29udmVydGVyQ29udGFpbmVyOwotCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm11dGFibGUgPSBuZXcgSmF2YUVjbGlwc2VMaW5rTXV0YWJsZSh0aGlzKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMubXV0YWJsZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLm11dGFibGUudXBkYXRlKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtdXRhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua011dGFibGUgZ2V0TXV0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMubXV0YWJsZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGdldENvbnZlcnRlckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbCh0aGlzKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBjb250YWluZXIgcGFyZW50IGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFKcGFDb250ZXh0Tm9kZSBnZXRDb252ZXJ0ZXJDb250YWluZXJQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzOyAgLy8gbm8gYWRhcHRlcgotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IGdldEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGFyZW50U3VwcG9ydHNDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBhZGFwdGVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBwdXQgdGhlIEVjbGlwc2VMaW5rIGNvbnZlcnQgYWRhcHRlciBmaXJzdCAtIHRoaXMgaXMgdGhlIG9yZGVyIEVjbGlwc2VMaW5rIHNlYXJjaGVzCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFDb252ZXJ0ZXIuQWRhcHRlcj4gZ2V0Q29udmVydGVyQWRhcHRlcnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8SmF2YUNvbnZlcnRlci5BZGFwdGVyPigKLQkJCQlKYXZhRWNsaXBzZUxpbmtDb252ZXJ0LkFkYXB0ZXIuaW5zdGFuY2UoKSwKLQkJCQlzdXBlci5nZXRDb252ZXJ0ZXJBZGFwdGVycygpCi0JCQkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMubXV0YWJsZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDYWNoaW5nSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NhY2hpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYjQwZjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NhY2hpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5OdWxsSmF2YUNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZUhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZUhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUaW1lT2ZEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZ0ltcGwKLQlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nLCBKYXZhQ2FjaGVhYmxlSG9sZGVyMl8wCi17Ci0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIHNwZWNpZmllZFR5cGU7Ci0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkU2l6ZTsKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRTaGFyZWQ7Ci0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkQWx3YXlzUmVmcmVzaDsKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXI7Ci0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkRGlzYWJsZUhpdHM7Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZTsKLQotCXByb3RlY3RlZCBJbnRlZ2VyIGV4cGlyeTsKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKYXZhVGltZU9mRGF5IGV4cGlyeVRpbWVPZkRheTsKLQotCXByb3RlY3RlZCBib29sZWFuIGV4aXN0ZW5jZUNoZWNraW5nOwotCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgc3BlY2lmaWVkRXhpc3RlbmNlVHlwZTsKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGRlZmF1bHRFeGlzdGVuY2VUeXBlOwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFDYWNoZWFibGUyXzAgY2FjaGVhYmxlOwotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yIHNwZWNpZmllZElzb2xhdGlvbjsKLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nSW1wbChKYXZhRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0KLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gdGhpcy5nZXRDYWNoZUFubm90YXRpb24oKTsKLQkJdGhpcy5zcGVjaWZpZWRUeXBlID0gRWNsaXBzZUxpbmtDYWNoZVR5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKGNhY2hlQW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQl0aGlzLnNwZWNpZmllZFNpemUgPSBjYWNoZUFubm90YXRpb24uZ2V0U2l6ZSgpOwotCQl0aGlzLnNwZWNpZmllZFNoYXJlZCA9IGNhY2hlQW5ub3RhdGlvbi5nZXRTaGFyZWQoKTsKLQkJdGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoID0gY2FjaGVBbm5vdGF0aW9uLmdldEFsd2F5c1JlZnJlc2goKTsKLQkJdGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIgPSBjYWNoZUFubm90YXRpb24uZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCk7Ci0JCXRoaXMuc3BlY2lmaWVkRGlzYWJsZUhpdHMgPSBjYWNoZUFubm90YXRpb24uZ2V0RGlzYWJsZUhpdHMoKTsKLQotCQl0aGlzLnNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUgPSBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwoY2FjaGVBbm5vdGF0aW9uLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0KLQkJdGhpcy5leHBpcnkgPSBjYWNoZUFubm90YXRpb24uZ2V0RXhwaXJ5KCk7Ci0JCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gdGhpcy5idWlsZEV4cGlyeVRpbWVPZkRheShjYWNoZUFubm90YXRpb24uZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCi0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGVjQW5ub3RhdGlvbiA9IHRoaXMuZ2V0RXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuZXhpc3RlbmNlQ2hlY2tpbmcgPSAoZWNBbm5vdGF0aW9uICE9IG51bGwpOwotCQl0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkRXhpc3RlbmNlVHlwZShlY0Fubm90YXRpb24pOwotCi0JCXRoaXMuY2FjaGVhYmxlID0gdGhpcy5idWlsZENhY2hlYWJsZSgpOwotCi0JCXRoaXMuc3BlY2lmaWVkSXNvbGF0aW9uID0gRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIuZnJvbUphdmFSZXNvdXJjZU1vZGVsKGNhY2hlQW5ub3RhdGlvbi5nZXRJc29sYXRpb24oKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0KLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gdGhpcy5nZXRDYWNoZUFubm90YXRpb24oKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRUeXBlXyhFY2xpcHNlTGlua0NhY2hlVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwoY2FjaGVBbm5vdGF0aW9uLmdldFR5cGUoKSkpOwotCQl0aGlzLnNldFNwZWNpZmllZFNpemVfKGNhY2hlQW5ub3RhdGlvbi5nZXRTaXplKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFNoYXJlZF8oY2FjaGVBbm5vdGF0aW9uLmdldFNoYXJlZCgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoXyhjYWNoZUFubm90YXRpb24uZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXJfKGNhY2hlQW5ub3RhdGlvbi5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHNfKGNhY2hlQW5ub3RhdGlvbi5nZXREaXNhYmxlSGl0cygpKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGVfKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbChjYWNoZUFubm90YXRpb24uZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKSk7Ci0KLQkJdGhpcy5zZXRFeHBpcnlfKGNhY2hlQW5ub3RhdGlvbi5nZXRFeHBpcnkoKSk7Ci0JCXRoaXMuc3luY0V4cGlyeVRpbWVPZkRheShjYWNoZUFubm90YXRpb24uZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCi0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGVjQW5ub3RhdGlvbiA9IHRoaXMuZ2V0RXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuc2V0RXhpc3RlbmNlQ2hlY2tpbmdfKGVjQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkRXhpc3RlbmNlVHlwZShlY0Fubm90YXRpb24pKTsKLQotCQl0aGlzLmNhY2hlYWJsZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0KLQkJdGhpcy5zZXRTcGVjaWZpZWRJc29sYXRpb25fKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yLmZyb21KYXZhUmVzb3VyY2VNb2RlbChjYWNoZUFubm90YXRpb24uZ2V0SXNvbGF0aW9uKCkpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQlpZiAodGhpcy5leHBpcnlUaW1lT2ZEYXkgIT0gbnVsbCkgewotCQkJdGhpcy5leHBpcnlUaW1lT2ZEYXkudXBkYXRlKCk7Ci0JCX0KLQkJdGhpcy5zZXREZWZhdWx0RXhpc3RlbmNlVHlwZSh0aGlzLmJ1aWxkRGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCXRoaXMuY2FjaGVhYmxlLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVHlwZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkVHlwZSA6IHRoaXMuZ2V0RGVmYXVsdFR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoZVR5cGUgZ2V0U3BlY2lmaWVkVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlIHR5cGUpIHsKLQkJdGhpcy5nZXRDYWNoZUFubm90YXRpb24oKS5zZXRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLnRvSmF2YVJlc291cmNlTW9kZWwodHlwZSkpOwotCQl0aGlzLnNldFNwZWNpZmllZFR5cGVfKHR5cGUpOwotCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkU2hhcmVkKG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVHlwZV8oRWNsaXBzZUxpbmtDYWNoZVR5cGUgdHlwZSkgewotCQlFY2xpcHNlTGlua0NhY2hlVHlwZSBvbGQgPSB0aGlzLnNwZWNpZmllZFR5cGU7Ci0JCXRoaXMuc3BlY2lmaWVkVHlwZSA9IHR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVFlQRV9QUk9QRVJUWSwgb2xkLCB0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoZVR5cGUgZ2V0RGVmYXVsdFR5cGUoKSB7Ci0JCVN0cmluZyBwdURlZmF1bHRDYWNoZVR5cGVOYW1lID0gKChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdClnZXRQZXJzaXN0ZW5jZVVuaXQoKSkuZ2V0RGVmYXVsdENhY2hlVHlwZVByb3BlcnR5VmFsdWUoKTsKLQkJaWYgKCFTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHB1RGVmYXVsdENhY2hlVHlwZU5hbWUpKSB7Ci0JCQl0cnkgeyAKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtDYWNoZVR5cGUudmFsdWVPZihTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKHB1RGVmYXVsdENhY2hlVHlwZU5hbWUpKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkvL25vIG1hdGNoLCByZXR1cm4gZGVmYXVsdAotCQkJfQotCQl9Ci0JCXJldHVybiBERUZBVUxUX1RZUEU7Ci0JfQotCQotCS8vICoqKioqKioqKiogc2l6ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRTaXplICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRTaXplLmludFZhbHVlKCkgOiB0aGlzLmdldERlZmF1bHRTaXplKCk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0U3BlY2lmaWVkU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2l6ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTaXplKEludGVnZXIgc2l6ZSkgewotCQl0aGlzLmdldENhY2hlQW5ub3RhdGlvbigpLnNldFNpemUoc2l6ZSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkU2l6ZV8oc2l6ZSk7Ci0KLQkJaWYgKHNpemUgIT0gbnVsbCkgewotCQkJdGhpcy5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTaXplXyhJbnRlZ2VyIHNpemUpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnNwZWNpZmllZFNpemU7Ci0JCXRoaXMuc3BlY2lmaWVkU2l6ZSA9IHNpemU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0laRV9QUk9QRVJUWSwgb2xkLCBzaXplKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERlZmF1bHRTaXplKCkgewotCQlTdHJpbmcgcHVEZWZhdWx0Q2FjaGVTaXplID0gKChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdClnZXRQZXJzaXN0ZW5jZVVuaXQoKSkuZ2V0RGVmYXVsdENhY2hlU2l6ZVByb3BlcnR5VmFsdWUoKTsKLQkJaWYgKCFTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHB1RGVmYXVsdENhY2hlU2l6ZSkpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZihwdURlZmF1bHRDYWNoZVNpemUpLmludFZhbHVlKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJLy9jb3VsZG4ndCBwYXJzZSwgcmV0dXJuIGRlZmF1bHQKLQkJCX0KLQkJfQotCQlyZXR1cm4gREVGQVVMVF9TSVpFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzaGFyZWQgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWQoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRTaGFyZWQgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFNoYXJlZC5ib29sZWFuVmFsdWUoKSA6IHRoaXMuaXNEZWZhdWx0U2hhcmVkKCk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkU2hhcmVkKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTaGFyZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2hhcmVkKEJvb2xlYW4gc2hhcmVkKSB7Ci0JCXRoaXMuZ2V0Q2FjaGVBbm5vdGF0aW9uKCkuc2V0U2hhcmVkKHNoYXJlZCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkU2hhcmVkXyhzaGFyZWQpOwotCi0JCWlmICgoc2hhcmVkICE9IG51bGwpICYmICEgc2hhcmVkLmJvb2xlYW5WYWx1ZSgpKSB7ICAvLyBCb29sZWFuLkZBTFNFCi0JCQl0aGlzLnNldFNwZWNpZmllZFR5cGUobnVsbCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFNpemUobnVsbCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2gobnVsbCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihudWxsKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMobnVsbCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUobnVsbCk7Ci0JCQl0aGlzLnNldEV4cGlyeShudWxsKTsKLQkJCXRoaXMucmVtb3ZlRXhwaXJ5VGltZU9mRGF5SWZOZWNlc3NhcnkoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFNoYXJlZF8oQm9vbGVhbiBzaGFyZWQpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZFNoYXJlZDsKLQkJdGhpcy5zcGVjaWZpZWRTaGFyZWQgPSBzaGFyZWQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0hBUkVEX1BST1BFUlRZLCBvbGQsIHNoYXJlZCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0U2hhcmVkKCkgewotCQlTdHJpbmcgcHVEZWZhdWx0U2hhcmVkQ2FjaGUgPSAoKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KWdldFBlcnNpc3RlbmNlVW5pdCgpKS5nZXREZWZhdWx0Q2FjaGVTaGFyZWRQcm9wZXJ0eVZhbHVlKCk7Ci0JCXJldHVybiAhU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShwdURlZmF1bHRTaGFyZWRDYWNoZSkgPyBCb29sZWFuLnZhbHVlT2YocHVEZWZhdWx0U2hhcmVkQ2FjaGUpLmJvb2xlYW5WYWx1ZSgpIDogREVGQVVMVF9TSEFSRUQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFsd2F5cyByZWZyZXNoICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzQWx3YXlzUmVmcmVzaCgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEFsd2F5c1JlZnJlc2ggIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZEFsd2F5c1JlZnJlc2guYm9vbGVhblZhbHVlKCkgOiB0aGlzLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goQm9vbGVhbiBhbHdheXNSZWZyZXNoKSB7Ci0JCXRoaXMuZ2V0Q2FjaGVBbm5vdGF0aW9uKCkuc2V0QWx3YXlzUmVmcmVzaChhbHdheXNSZWZyZXNoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoXyhhbHdheXNSZWZyZXNoKTsKLQotCQlpZiAoYWx3YXlzUmVmcmVzaCAhPSBudWxsKSB7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFNoYXJlZChudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2hfKEJvb2xlYW4gYWx3YXlzUmVmcmVzaCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaDsKLQkJdGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoID0gYWx3YXlzUmVmcmVzaDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9BTFdBWVNfUkVGUkVTSF9QUk9QRVJUWSwgb2xkLCBhbHdheXNSZWZyZXNoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkgewotCQlyZXR1cm4gREVGQVVMVF9BTFdBWVNfUkVGUkVTSDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVmcmVzaCBvbmx5IGlmIG5ld2VyICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzUmVmcmVzaE9ubHlJZk5ld2VyKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcikgewotCQl0aGlzLmdldENhY2hlQW5ub3RhdGlvbigpLnNldFJlZnJlc2hPbmx5SWZOZXdlcihyZWZyZXNoT25seUlmTmV3ZXIpOwotCQl0aGlzLnNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcl8ocmVmcmVzaE9ubHlJZk5ld2VyKTsKLQotCQlpZiAocmVmcmVzaE9ubHlJZk5ld2VyICE9IG51bGwpIHsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkU2hhcmVkKG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyXyhCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcikgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyOwotCQl0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlciA9IHJlZnJlc2hPbmx5SWZOZXdlcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9SRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFksIG9sZCwgcmVmcmVzaE9ubHlJZk5ld2VyKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSB7Ci0JCXJldHVybiBERUZBVUxUX1JFRlJFU0hfT05MWV9JRl9ORVdFUjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGlzYWJsZSBoaXRzICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzRGlzYWJsZUhpdHMoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWREaXNhYmxlSGl0cyAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkRGlzYWJsZUhpdHMuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmlzRGVmYXVsdERpc2FibGVIaXRzKCk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZERpc2FibGVIaXRzKEJvb2xlYW4gZGlzYWJsZUhpdHMpIHsKLQkJdGhpcy5nZXRDYWNoZUFubm90YXRpb24oKS5zZXREaXNhYmxlSGl0cyhkaXNhYmxlSGl0cyk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHNfKGRpc2FibGVIaXRzKTsKLQotCQlpZiAoZGlzYWJsZUhpdHMgIT0gbnVsbCkgewotCQkJdGhpcy5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWREaXNhYmxlSGl0c18oQm9vbGVhbiBkaXNhYmxlSGl0cykgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkRGlzYWJsZUhpdHM7Ci0JCXRoaXMuc3BlY2lmaWVkRGlzYWJsZUhpdHMgPSBkaXNhYmxlSGl0czsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9ESVNBQkxFX0hJVFNfUFJPUEVSVFksIG9sZCwgZGlzYWJsZUhpdHMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdERpc2FibGVIaXRzKCkgewotCQlyZXR1cm4gREVGQVVMVF9ESVNBQkxFX0hJVFM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvb3JkaW5hdGlvbiB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRDb29yZGluYXRpb25UeXBlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSA6IHRoaXMuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIHR5cGUpIHsKLQkJdGhpcy5nZXRDYWNoZUFubm90YXRpb24oKS5zZXRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLnRvSmF2YVJlc291cmNlTW9kZWwodHlwZSkpOwotCQl0aGlzLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGVfKHR5cGUpOwotCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkU2hhcmVkKG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZV8oRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgdHlwZSkgewotCQlFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBvbGQgPSB0aGlzLnNwZWNpZmllZENvb3JkaW5hdGlvblR5cGU7Ci0JCXRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSA9IHR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ09PUkRJTkFUSU9OX1RZUEVfUFJPUEVSVFksIG9sZCwgdHlwZSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkgewotCQlyZXR1cm4gREVGQVVMVF9DT09SRElOQVRJT05fVFlQRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXhwaXJ5ICoqKioqKioqKioKLQotCXB1YmxpYyBJbnRlZ2VyIGdldEV4cGlyeSgpIHsKLQkJcmV0dXJuIHRoaXMuZXhwaXJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4cGlyeShJbnRlZ2VyIGV4cGlyeSkgewotCQl0aGlzLmdldENhY2hlQW5ub3RhdGlvbigpLnNldEV4cGlyeShleHBpcnkpOwotCQl0aGlzLnNldEV4cGlyeV8oZXhwaXJ5KTsKLQotCQlpZiAoZXhwaXJ5ICE9IG51bGwpIHsKLQkJCXRoaXMucmVtb3ZlRXhwaXJ5VGltZU9mRGF5SWZOZWNlc3NhcnkoKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkU2hhcmVkKG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXhwaXJ5XyhJbnRlZ2VyIGV4cGlyeSkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuZXhwaXJ5OwotCQl0aGlzLmV4cGlyeSA9IGV4cGlyeTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVYUElSWV9QUk9QRVJUWSwgb2xkLCBleHBpcnkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHBpcnkgdGltZSBvZiBkYXkgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rVGltZU9mRGF5IGdldEV4cGlyeVRpbWVPZkRheSgpIHsKLQkJcmV0dXJuIHRoaXMuZXhwaXJ5VGltZU9mRGF5OwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua1RpbWVPZkRheSBhZGRFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCWlmICh0aGlzLmV4cGlyeVRpbWVPZkRheSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJleHBpcnkgdGltZSBvZiBkYXkgYWxyZWFkeSBleGlzdHM6ICIgKyB0aGlzLmV4cGlyeVRpbWVPZkRheSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gdGltZU9mRGF5QW5ub3RhdGlvbiA9IHRoaXMuZ2V0Q2FjaGVBbm5vdGF0aW9uKCkuYWRkRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCUVjbGlwc2VMaW5rSmF2YVRpbWVPZkRheSB0aW1lT2ZEYXkgPSB0aGlzLmJ1aWxkRXhwaXJ5VGltZU9mRGF5KHRpbWVPZkRheUFubm90YXRpb24pOwotCQl0aGlzLnNldEV4cGlyeVRpbWVPZkRheSh0aW1lT2ZEYXkpOwotCi0JCXRoaXMuc2V0RXhwaXJ5KG51bGwpOwotCQl0aGlzLnNldFNwZWNpZmllZFNoYXJlZChudWxsKTsKLQotCQlyZXR1cm4gdGltZU9mRGF5OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUV4cGlyeVRpbWVPZkRheSgpIHsKLQkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImV4cGlyeSB0aW1lIG9mIGRheSBkb2VzIG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5yZW1vdmVFeHBpcnlUaW1lT2ZEYXlfKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRXhwaXJ5VGltZU9mRGF5SWZOZWNlc3NhcnkoKSB7Ci0JCWlmICh0aGlzLmV4cGlyeVRpbWVPZkRheSAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbW92ZUV4cGlyeVRpbWVPZkRheV8oKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUV4cGlyeVRpbWVPZkRheV8oKSB7Ci0JCXRoaXMuZ2V0Q2FjaGVBbm5vdGF0aW9uKCkucmVtb3ZlRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCXRoaXMuc2V0RXhwaXJ5VGltZU9mRGF5KG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4cGlyeVRpbWVPZkRheShFY2xpcHNlTGlua0phdmFUaW1lT2ZEYXkgdGltZU9mRGF5KSB7Ci0JCUVjbGlwc2VMaW5rSmF2YVRpbWVPZkRheSBvbGQgPSB0aGlzLmV4cGlyeVRpbWVPZkRheTsKLQkJdGhpcy5leHBpcnlUaW1lT2ZEYXkgPSB0aW1lT2ZEYXk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWFBJUllfVElNRV9PRl9EQVlfUFJPUEVSVFksIG9sZCwgdGltZU9mRGF5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jRXhwaXJ5VGltZU9mRGF5KEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXlBbm5vdGF0aW9uKSB7Ci0JCWlmICh0aW1lT2ZEYXlBbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCWlmICh0aGlzLmV4cGlyeVRpbWVPZkRheSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5zZXRFeHBpcnlUaW1lT2ZEYXkobnVsbCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKHRoaXMuZXhwaXJ5VGltZU9mRGF5ICE9IG51bGwpICYmICh0aGlzLmV4cGlyeVRpbWVPZkRheS5nZXRUaW1lT2ZEYXlBbm5vdGF0aW9uKCkgPT0gdGltZU9mRGF5QW5ub3RhdGlvbikpIHsKLQkJCQl0aGlzLmV4cGlyeVRpbWVPZkRheS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0RXhwaXJ5VGltZU9mRGF5KHRoaXMuYnVpbGRFeHBpcnlUaW1lT2ZEYXkodGltZU9mRGF5QW5ub3RhdGlvbikpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rSmF2YVRpbWVPZkRheSBidWlsZEV4cGlyeVRpbWVPZkRheShFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gdGltZU9mRGF5QW5ub3RhdGlvbikgewotCQlyZXR1cm4gKHRpbWVPZkRheUFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogbmV3IEVjbGlwc2VMaW5rSmF2YVRpbWVPZkRheSh0aGlzLCB0aW1lT2ZEYXlBbm5vdGF0aW9uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXhpc3RlbmNlIGNoZWNraW5nICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzRXhpc3RlbmNlQ2hlY2tpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmV4aXN0ZW5jZUNoZWNraW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4aXN0ZW5jZUNoZWNraW5nKGJvb2xlYW4gZXhpc3RlbmNlQ2hlY2tpbmcpIHsKLQkJaWYgKGV4aXN0ZW5jZUNoZWNraW5nICE9IHRoaXMuZXhpc3RlbmNlQ2hlY2tpbmcpIHsKLQkJCWlmIChleGlzdGVuY2VDaGVja2luZykgewotCQkJCXRoaXMuYWRkRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMucmVtb3ZlRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKCk7Ci0JCQkJdGhpcy5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKG51bGwpOwotCQkJfQotCQkJdGhpcy5zZXRFeGlzdGVuY2VDaGVja2luZ18oZXhpc3RlbmNlQ2hlY2tpbmcpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXhpc3RlbmNlQ2hlY2tpbmdfKGJvb2xlYW4gZXhpc3RlbmNlQ2hlY2tpbmcpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmV4aXN0ZW5jZUNoZWNraW5nOwotCQl0aGlzLmV4aXN0ZW5jZUNoZWNraW5nID0gZXhpc3RlbmNlQ2hlY2tpbmc7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWElTVEVOQ0VfQ0hFQ0tJTkdfUFJPUEVSVFksIG9sZCwgZXhpc3RlbmNlQ2hlY2tpbmcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleGlzdGVuY2UgdHlwZSAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGdldEV4aXN0ZW5jZVR5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRFeGlzdGVuY2VUeXBlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRFeGlzdGVuY2VUeXBlIDogdGhpcy5kZWZhdWx0RXhpc3RlbmNlVHlwZTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgdHlwZSkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodHlwZSwgdGhpcy5zcGVjaWZpZWRFeGlzdGVuY2VUeXBlKSkgewotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCXRoaXMuc2V0RXhpc3RlbmNlQ2hlY2tpbmcodHJ1ZSk7Ci0JCQl9Ci0JCQl0aGlzLmdldEV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbigpLnNldFZhbHVlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS50b0phdmFSZXNvdXJjZU1vZGVsKHR5cGUpKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZV8odHlwZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlXyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgdHlwZSkgewotCQlFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgb2xkID0gdGhpcy5zcGVjaWZpZWRFeGlzdGVuY2VUeXBlOwotCQl0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGUgPSB0eXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0VYSVNURU5DRV9UWVBFX1BST1BFUlRZLCBvbGQsIHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgYnVpbGRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGVjQW5ub3RhdGlvbikgewotCQlyZXR1cm4gKGVjQW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKGVjQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0RXhpc3RlbmNlVHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0RXhpc3RlbmNlVHlwZShFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgdHlwZSkgewotCQlFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgb2xkID0gdGhpcy5kZWZhdWx0RXhpc3RlbmNlVHlwZTsKLQkJdGhpcy5kZWZhdWx0RXhpc3RlbmNlVHlwZSA9IHR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0VYSVNURU5DRV9UWVBFX1BST1BFUlRZLCBvbGQsIHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgYnVpbGREZWZhdWx0RXhpc3RlbmNlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZXhpc3RlbmNlQ2hlY2tpbmcgPyBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfQ0FDSEUgOiBERUZBVUxUX0VYSVNURU5DRV9UWVBFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjYWNoZWFibGUgKioqKioqKioqKgotCi0JcHVibGljIEphdmFDYWNoZWFibGUyXzAgZ2V0Q2FjaGVhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoZWFibGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpIHsKLQkJQ2FjaGVhYmxlSG9sZGVyMl8wIHN1cGVyQ2FjaGVhYmxlSG9sZGVyID0gdGhpcy5nZXRDYWNoZWFibGVTdXBlclBlcnNpc3RlbnRUeXBlKHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKSk7Ci0JCXJldHVybiAoc3VwZXJDYWNoZWFibGVIb2xkZXIgIT0gbnVsbCkgPwotCQkJCXN1cGVyQ2FjaGVhYmxlSG9sZGVyLmdldENhY2hlYWJsZSgpLmlzQ2FjaGVhYmxlKCkgOgotCQkJCSgoUGVyc2lzdGVuY2VVbml0Ml8wKSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpKS5jYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENhY2hlYWJsZUhvbGRlcjJfMCBnZXRDYWNoZWFibGVTdXBlclBlcnNpc3RlbnRUeXBlKFBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlKSB7Ci0JCVBlcnNpc3RlbnRUeXBlIHN1cGVyUGVyc2lzdGVudFR5cGUgPSBwZXJzaXN0ZW50VHlwZS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCk7Ci0JCWlmIChzdXBlclBlcnNpc3RlbnRUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVR5cGVNYXBwaW5nIHN1cGVyTWFwcGluZyA9IHN1cGVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlyZXR1cm4gKHN1cGVyTWFwcGluZyBpbnN0YW5jZW9mIENhY2hlYWJsZUhvbGRlcjJfMCkgPwotCQkJCShDYWNoZWFibGVIb2xkZXIyXzApIHN1cGVyTWFwcGluZyA6Ci0JCQkJdGhpcy5nZXRDYWNoZWFibGVTdXBlclBlcnNpc3RlbnRUeXBlKHN1cGVyUGVyc2lzdGVudFR5cGUpOyAgLy8gcmVjdXJzZQotCX0KLQotCXByb3RlY3RlZCBKYXZhQ2FjaGVhYmxlMl8wIGJ1aWxkQ2FjaGVhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5pc0pwYTJfMENvbXBhdGlibGUoKSA/Ci0JCQkJdGhpcy5nZXRKcGFGYWN0b3J5Ml8wKCkuYnVpbGRKYXZhQ2FjaGVhYmxlKHRoaXMpIDoKLQkJCQluZXcgTnVsbEphdmFDYWNoZWFibGUyXzAodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlzb2xhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIgZ2V0SXNvbGF0aW9uKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkSXNvbGF0aW9uICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRJc29sYXRpb24gOiB0aGlzLmdldERlZmF1bHRJc29sYXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIgZ2V0U3BlY2lmaWVkSXNvbGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRJc29sYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkSXNvbGF0aW9uKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yIGlzb2xhdGlvbikgewotCQl0aGlzLmdldENhY2hlQW5ub3RhdGlvbigpLnNldElzb2xhdGlvbihFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMi50b0phdmFSZXNvdXJjZU1vZGVsKGlzb2xhdGlvbikpOwotCQl0aGlzLnNldFNwZWNpZmllZElzb2xhdGlvbl8oaXNvbGF0aW9uKTsKLQotCQlpZiAoaXNvbGF0aW9uICE9IG51bGwpIHsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkU2hhcmVkKG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkSXNvbGF0aW9uXyhFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMiBpc29sYXRpb24pIHsKLQkJRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIgb2xkID0gdGhpcy5zcGVjaWZpZWRJc29sYXRpb247Ci0JCXRoaXMuc3BlY2lmaWVkSXNvbGF0aW9uID0gaXNvbGF0aW9uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0lTT0xBVElPTl9QUk9QRVJUWSwgb2xkLCBpc29sYXRpb24pOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMiBnZXREZWZhdWx0SXNvbGF0aW9uKCkgewotCQlyZXR1cm4gREVGQVVMVF9JU09MQVRJT047Ci0JfQotCi0JLy8gKioqKioqKioqKiBjYWNoZSBhbm5vdGF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBnZXRDYWNoZUFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldE5vbk51bGxBbm5vdGF0aW9uKHRoaXMuZ2V0Q2FjaGVBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENhY2hlQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4aXN0ZW5jZSBjaGVja2luZyBhbm5vdGF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbiBnZXRFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24pIHRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24odGhpcy5nZXRFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbiBhZGRFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24pIHRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmFkZEFubm90YXRpb24odGhpcy5nZXRFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkucmVtb3ZlQW5ub3RhdGlvbih0aGlzLmdldEV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50VHlwZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VUeXBlIGdldEphdmFSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnZhbGlkYXRlRXhwaXJ5KG1lc3NhZ2VzLCBhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVFeHBpcnkoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmICgodGhpcy5leHBpcnkgIT0gbnVsbCkgJiYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5ICE9IG51bGwpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ0FDSEVfRVhQSVJZX0FORF9FWFBJUllfVElNRV9PRl9EQVlfQk9USF9TUEVDSUZJRUQsCi0JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKX0sCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KQotCQkJCSkKLQkJCSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2V0Q2FjaGVBbm5vdGF0aW9uKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzOTFiYzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcKLXsKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgc3BlY2lmaWVkVHlwZTsKLQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nKEphdmFUeXBlTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRUeXBlID0gdGhpcy5idWlsZFNwZWNpZmllZFR5cGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRUeXBlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHlwZSAqKioqKioqKioqICAKLQotCXB1YmxpYyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVHlwZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkVHlwZSA6IHRoaXMuZ2V0RGVmYXVsdFR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0U3BlY2lmaWVkVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIHR5cGUpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHR5cGUsIHRoaXMuc3BlY2lmaWVkVHlwZSkpIHsKLQkJCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldENoYW5nZVRyYWNraW5nQW5ub3RhdGlvbigpOwotCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQkJdGhpcy5yZW1vdmVDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24oKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCQkJYW5ub3RhdGlvbiA9IHRoaXMuYWRkQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKCk7Ci0JCQkJfQotCQkJCWFubm90YXRpb24uc2V0VmFsdWUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUudG9KYXZhUmVzb3VyY2VNb2RlbCh0eXBlKSk7Ci0JCQl9Ci0JCQl0aGlzLnNldFNwZWNpZmllZFR5cGVfKHR5cGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVHlwZV8oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgdHlwZSkgewotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBvbGQgPSB0aGlzLnNwZWNpZmllZFR5cGU7Ci0JCXRoaXMuc3BlY2lmaWVkVHlwZSA9IHR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVFlQRV9QUk9QRVJUWSwgb2xkLCB0eXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgYnVpbGRTcGVjaWZpZWRUeXBlKCkgewotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQ2hhbmdlVHJhY2tpbmdUeXBlIHZhbHVlID0gYW5ub3RhdGlvbi5nZXRWYWx1ZSgpOwotCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gREVGQVVMVF9UWVBFIDogRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0RGVmYXVsdFR5cGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1RZUEU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNoYW5nZSB0cmFja2luZyBhbm5vdGF0aW9uICoqKioqKioqKiogIAotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIGdldENoYW5nZVRyYWNraW5nQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbih0aGlzLmdldENoYW5nZVRyYWNraW5nQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIGFkZENoYW5nZVRyYWNraW5nQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuYWRkQW5ub3RhdGlvbih0aGlzLmdldENoYW5nZVRyYWNraW5nQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKCkgewotCQl0aGlzLmdldEphdmFSZXNvdXJjZVR5cGUoKS5yZW1vdmVBbm5vdGF0aW9uKHRoaXMuZ2V0Q2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENoYW5nZVRyYWNraW5nQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKiAgCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVR5cGVNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhVHlwZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlVHlwZSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqICAKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRBbm5vdGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0QW5ub3RhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24oKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGFubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFjODNjZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlCi17Ci0JcHJpdmF0ZSBmaW5hbCBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gY29udmVyc2lvblZhbHVlQW5ub3RhdGlvbjsKLQotCXByaXZhdGUgU3RyaW5nIGRhdGFWYWx1ZTsKLQotCXByaXZhdGUgU3RyaW5nIG9iamVjdFZhbHVlOwotCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlKEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgcGFyZW50LCBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gY29udmVyc2lvblZhbHVlQW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gPSBjb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uOwotCQl0aGlzLmRhdGFWYWx1ZSA9IGNvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uZ2V0RGF0YVZhbHVlKCk7Ci0JCXRoaXMub2JqZWN0VmFsdWUgPSBjb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmdldE9iamVjdFZhbHVlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0RGF0YVZhbHVlXyh0aGlzLmNvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uZ2V0RGF0YVZhbHVlKCkpOwotCQl0aGlzLnNldE9iamVjdFZhbHVlXyh0aGlzLmNvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRhdGEgdmFsdWUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXREYXRhVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREYXRhVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuY29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5zZXREYXRhVmFsdWUodmFsdWUpOwotCQl0aGlzLnNldERhdGFWYWx1ZV8odmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERhdGFWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRhdGFWYWx1ZTsKLQkJdGhpcy5kYXRhVmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvYmplY3QgdmFsdWUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRPYmplY3RWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuY29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5zZXRPYmplY3RWYWx1ZSh2YWx1ZSk7Ci0JCXRoaXMuc2V0T2JqZWN0VmFsdWVfKHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPYmplY3RWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm9iamVjdFZhbHVlOwotCQl0aGlzLm9iamVjdFZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPQkpFQ1RfVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBnZXRPYmplY3RUeXBlQ29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGdldENvbnZlcnNpb25WYWx1ZUFubm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnNpb25WYWx1ZUFubm90YXRpb247Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldERhdGFWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKHRoaXMuY29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5nZXREYXRhVmFsdWVUZXh0UmFuZ2UoKSwgYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRPYmplY3RWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKHRoaXMuY29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5nZXRPYmplY3RWYWx1ZVRleHRSYW5nZSgpLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuY29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRPYmplY3RUeXBlQ29udmVydGVyKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VxdWl2YWxlbnRUbyhFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMuZGF0YVZhbHVlLCBjb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpICYmCi0JCQkJVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy5vYmplY3RWYWx1ZSwgY29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ29udmVydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzA0MDUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkNvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQ29udmVydAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhQ29udmVydGVyCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0NvbnZlcnQKLXsKLQlwcml2YXRlIGZpbmFsIEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24gY29udmVydEFubm90YXRpb247Ci0KLQlwcml2YXRlIFN0cmluZyBzcGVjaWZpZWRDb252ZXJ0ZXJOYW1lOwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRDb252ZXJ0ZXJOYW1lOwotCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVydChKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24gY29udmVydEFubm90YXRpb24sIEphdmFDb252ZXJ0ZXIuT3duZXIgb3duZXIpIHsKLQkJc3VwZXIocGFyZW50LCBvd25lcik7Ci0JCXRoaXMuY29udmVydEFubm90YXRpb24gPSBjb252ZXJ0QW5ub3RhdGlvbjsKLQkJdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lID0gY29udmVydEFubm90YXRpb24uZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbiBnZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0QW5ub3RhdGlvbjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZV8odGhpcy5jb252ZXJ0QW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHRDb252ZXJ0ZXJOYW1lKHRoaXMuYnVpbGREZWZhdWx0Q29udmVydGVyTmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyIG5hbWUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXJOYW1lKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkQ29udmVydGVyTmFtZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkQ29udmVydGVyTmFtZSA6IHRoaXMuZGVmYXVsdENvbnZlcnRlck5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5jb252ZXJ0QW5ub3RhdGlvbi5zZXRWYWx1ZShuYW1lKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lXyhuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lOwotCQl0aGlzLnNwZWNpZmllZENvbnZlcnRlck5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NPTlZFUlRFUl9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbnZlcnRlck5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRDb252ZXJ0ZXJOYW1lOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRDb252ZXJ0ZXJOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRDb252ZXJ0ZXJOYW1lOwotCQl0aGlzLmRlZmF1bHRDb252ZXJ0ZXJOYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQ09OVkVSVEVSX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRDb252ZXJ0ZXJOYW1lKCkgewotCQlyZXR1cm4gREVGQVVMVF9DT05WRVJURVJfTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydC5jbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29udmVydCBpcyA8ZW0+dmlydHVhbDwvZW0+IGFuZCwgYXMgYSByZXN1bHQsIGRvZXMKLQkgKiBub3QgaGF2ZSBhIGNvbnZlcnRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7Ci0JCXJldHVybiB0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgY29tcGxldGlvbiBwcm9wb3NhbHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWlmICh0aGlzLmNvbnZlcnRWYWx1ZVRvdWNoZXMocG9zKSkgewotCQkJcmVzdWx0ID0gdGhpcy5nZXRKYXZhQ2FuZGlkYXRlQ29udmVydGVyTmFtZXMoZmlsdGVyKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udmVydFZhbHVlVG91Y2hlcyhpbnQgcG9zKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRBbm5vdGF0aW9uLnZhbHVlVG91Y2hlcyhwb3MpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDYW5kaWRhdGVDb252ZXJ0ZXJOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscyh0aGlzLmdldENhbmRpZGF0ZUNvbnZlcnRlck5hbWVzKGZpbHRlcikpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZUNvbnZlcnRlck5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4odGhpcy5nZXRDb252ZXJ0ZXJOYW1lcygpLCBmaWx0ZXIpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gbmFtZXMgb2YgdGhlIHVzZXItZGVmaW5lZCBjb252ZXJ0ZXJzIGFuZCBvZiByZXNlcnZlZCBjb252ZXJ0ZXJzCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q29udmVydGVyTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFVuaXF1ZUNvbnZlcnRlck5hbWVzKCksCi0JCQkJQXJyYXlzLmFzTGlzdChFY2xpcHNlTGlua0NvbnZlcnQuUkVTRVJWRURfQ09OVkVSVEVSX05BTUVTKQotCQkJCSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBBZGFwdGVyCi0JCWV4dGVuZHMgSmF2YUNvbnZlcnRlci5BYnN0cmFjdEFkYXB0ZXIKLQl7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEFkYXB0ZXIgSU5TVEFOQ0UgPSBuZXcgQWRhcHRlcigpOwotCQlwdWJsaWMgc3RhdGljIEFkYXB0ZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQlwcml2YXRlIEFkYXB0ZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGdldENvbnZlcnRlclR5cGUoKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQotCQlwdWJsaWMgSmF2YUNvbnZlcnRlciBidWlsZENvbnZlcnRlcihBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24sIEphdmFBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0NvbnZlcnQocGFyZW50LCAoRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbikgY29udmVydGVyQW5ub3RhdGlvbiwgdGhpcy5idWlsZE93bmVyKCkpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIE93bmVyIGJ1aWxkT3duZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IE93bmVyKCkgewotCQkJCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRWYWxpZGF0b3IoQ29udmVydGVyIGNvbnZlcnRlciwgQ29udmVydGVyVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0NvbnZlcnRWYWxpZGF0b3IoKEVjbGlwc2VMaW5rQ29udmVydCkgY29udmVydGVyLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JCQkJfQotCQkJfTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIxNWNhNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYU5hbWVkQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogPGNvZGU+Ci0gKiA8dWw+Ci0gKiA8bGk+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ29udmVydGVyCi0gKiA8bGk+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuU3RydWN0Q29udmVydGVyCi0gKiA8bGk+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuT2JqZWN0VHlwZUNvbnZlcnRlcgotICogPGxpPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlR5cGVDb252ZXJ0ZXIKLSAqIDwvdWw+Ci0gKiA8L2NvZGU+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXI8QSBleHRlbmRzIEVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uPgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVydGVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEEgY29udmVydGVyQW5ub3RhdGlvbjsKLQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBBIGNvbnZlcnRlckFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uID0gY29udmVydGVyQW5ub3RhdGlvbjsKLQkJdGhpcy5uYW1lID0gY29udmVydGVyQW5ub3RhdGlvbi5nZXROYW1lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0TmFtZV8odGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbmFtZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLmNvbnZlcnRlckFubm90YXRpb24uc2V0TmFtZShuYW1lKTsKLQkJdGhpcy5zZXROYW1lXyhuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBBIGdldENvbnZlcnRlckFubm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckFubm90YXRpb247Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JfQotCi0JcHVibGljIGNoYXIgZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJcmV0dXJuICcuJzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMudmFsaWRhdGVOYW1lKG1lc3NhZ2VzLCBhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU5hbWUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMubmFtZSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCAKLQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09OVkVSVEVSX05BTUVfVU5ERUZJTkVELCAKLQkJCQkJRU1QVFlfU1RSSU5HX0FSUkFZLAotCQkJCQl0aGlzLAotCQkJCQl0aGlzLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCQkpCi0JCQkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKEFycmF5VG9vbHMuY29udGFpbnMoRWNsaXBzZUxpbmtDb252ZXJ0LlJFU0VSVkVEX0NPTlZFUlRFUl9OQU1FUywgdGhpcy5uYW1lKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlJFU0VSVkVEX0NPTlZFUlRFUl9OQU1FLAotCQkJCQlFTVBUWV9TVFJJTkdfQVJSQVksCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KQotCQkJCSkKLQkJCSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuY29udmVydGVyQW5ub3RhdGlvbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKHRoaXMuZ2V0Q29udmVydGVyQW5ub3RhdGlvbigpLmdldE5hbWVUZXh0UmFuZ2UoKSwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFcXVpdmFsZW50VG8oSnBhTmFtZWRDb250ZXh0Tm9kZSBub2RlKSB7Ci0JCXJldHVybiAodGhpcyAhPSBub2RlKSAmJgotCQkJCSh0aGlzLmdldFR5cGUoKSA9PSBub2RlLmdldFR5cGUoKSkgJiYKLQkJCQlUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLm5hbWUsIG5vZGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1ldGFkYXRhIGNvbnZlcnNpb24gKioqKioqKioqKgotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY29udmVydFRvKE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnZlcnRlckNvbnRhaW5lcik7Ci0JCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZGVsZXRlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ2xhc3NDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDbGFzc0NvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDlhY2JmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDbGFzc0NvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFOYW1lZENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyQ2xhc3NDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkRlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiA8Y29kZT4KLSAqIDx1bD4KLSAqIDxsaT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJ0ZXIKLSAqIDxsaT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5TdHJ1Y3RDb252ZXJ0ZXIKLSAqIDwvdWw+Ci0gKiA8L2NvZGU+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDbGFzc0NvbnZlcnRlcjxBIGV4dGVuZHMgRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24+Ci0JZXh0ZW5kcyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXI8QT4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVydGVyQ2xhc3NDb252ZXJ0ZXIKLXsKLQlwcml2YXRlIFN0cmluZyBjb252ZXJ0ZXJDbGFzczsKLQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNsYXNzQ29udmVydGVyKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEEgY29udmVydGVyQW5ub3RhdGlvbiwgU3RyaW5nIGNvbnZlcnRlckNsYXNzKSB7Ci0JCXN1cGVyKHBhcmVudCwgY29udmVydGVyQW5ub3RhdGlvbik7Ci0JCXRoaXMuY29udmVydGVyQ2xhc3MgPSBjb252ZXJ0ZXJDbGFzczsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRDb252ZXJ0ZXJDbGFzc18odGhpcy5nZXRBbm5vdGF0aW9uQ29udmVydGVyQ2xhc3MoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBjbGFzcyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXJDbGFzcyhTdHJpbmcgY29udmVydGVyQ2xhc3MpIHsKLQkJdGhpcy5zZXRBbm5vdGF0aW9uQ29udmVydGVyQ2xhc3MoY29udmVydGVyQ2xhc3MpOwotCQl0aGlzLnNldENvbnZlcnRlckNsYXNzXyhjb252ZXJ0ZXJDbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29udmVydGVyQ2xhc3NfKFN0cmluZyBjb252ZXJ0ZXJDbGFzcykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5jb252ZXJ0ZXJDbGFzczsKLQkJdGhpcy5jb252ZXJ0ZXJDbGFzcyA9IGNvbnZlcnRlckNsYXNzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OVkVSVEVSX0NMQVNTX1BST1BFUlRZLCBvbGQsIGNvbnZlcnRlckNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEFubm90YXRpb25Db252ZXJ0ZXJDbGFzcygpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0QW5ub3RhdGlvbkNvbnZlcnRlckNsYXNzKFN0cmluZyBjb252ZXJ0ZXJDbGFzcyk7Ci0KLQotCS8vICoqKioqKioqKiogSkRUIElUeXBlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCA8Y29kZT5udWxsPC9jb2RlPiBjaGVjay4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0eXBlRXhpc3RzKFN0cmluZyB0eXBlTmFtZSkgewotCQlyZXR1cm4gKHR5cGVOYW1lICE9IG51bGwpICYmIAotCQkJCShKRFRUb29scy5maW5kVHlwZSh0aGlzLmdldEphdmFQcm9qZWN0KCksIHR5cGVOYW1lKSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgPGNvZGU+bnVsbDwvY29kZT4gY2hlY2suCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdHlwZUltcGxlbWVudHNJbnRlcmZhY2UoU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSkgewotCQlyZXR1cm4gKHR5cGVOYW1lICE9IG51bGwpICYmIAotCQkJCUpEVFRvb2xzLnR5cGVJc1N1YlR5cGUodGhpcy5nZXRKYXZhUHJvamVjdCgpLCB0eXBlTmFtZSwgaW50ZXJmYWNlTmFtZSk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy52YWxpZGF0ZUNvbnZlcnRlckNsYXNzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbnZlcnRlckNsYXNzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAodGhpcy5jb252ZXJ0ZXJDbGFzcyA9PSBudWxsKSB7Ci0JCQkvLyB0aGUgYW5ub3RhdGlvbiB3aWxsIGhhdmUgYSBjb21waWxlIGVycm9yIGlmIGl0cyBjb252ZXJ0ZXIgY2xhc3MgaXMgbWlzc2luZwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5jb252ZXJ0ZXJDbGFzcykpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09OVkVSVEVSX0NMQVNTX0RFRklORUQsCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCQkpCi0JCQkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCAhIHRoaXMuY29udmVydGVyQ2xhc3NFeGlzdHMoKSkgewotCQkJdGhpcy5hZGRDb252ZXJ0ZXJDbGFzc0RvZXNOb3RFeGlzdE1lc3NhZ2VUbyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoICEgdGhpcy5jb252ZXJ0ZXJDbGFzc0ltcGxlbWVudHNJbnRlcmZhY2UodGhpcy5nZXRFY2xpcHNlTGlua0NvbnZlcnRlckludGVyZmFjZSgpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCXRoaXMuZ2V0RWNsaXBzZUxpbmtDb252ZXJ0ZXJJbnRlcmZhY2VFcnJvck1lc3NhZ2UoKSwKLQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3MoKX0sCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCQkpCi0JCQkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29udmVydGVyQ2xhc3NEb2VzTm90RXhpc3RNZXNzYWdlVG8oTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCW1lc3NhZ2VzLmFkZCgKLQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5DT05WRVJURVJfQ0xBU1NfRVhJU1RTLAotCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzKCl9LAotCQkJCXRoaXMsCi0JCQkJdGhpcy5nZXRDb252ZXJ0ZXJDbGFzc1RleHRSYW5nZShhc3RSb290KQotCQkJKQotCQkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgRWNsaXBzZUxpbmsgaW50ZXJmYWNlIHRoZSBjb252ZXJ0ZXIgY2xhc3MgbXVzdAotCSAqIGltcGxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEVjbGlwc2VMaW5rQ29udmVydGVySW50ZXJmYWNlKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEVjbGlwc2VMaW5rQ29udmVydGVySW50ZXJmYWNlRXJyb3JNZXNzYWdlKCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb252ZXJ0ZXJDbGFzc0V4aXN0cygpIHsKLQkJcmV0dXJuIHRoaXMudHlwZUV4aXN0cyh0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3MoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udmVydGVyQ2xhc3NJbXBsZW1lbnRzSW50ZXJmYWNlKFN0cmluZyBpbnRlcmZhY2VOYW1lKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVJbXBsZW1lbnRzSW50ZXJmYWNlKHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzcygpLCBpbnRlcmZhY2VOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldENvbnZlcnRlckNsYXNzVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy5nZXRBbm5vdGF0aW9uQ29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoKSwgYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFRleHRSYW5nZSBnZXRBbm5vdGF0aW9uQ29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoKTsKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRXF1aXZhbGVudFRvKEpwYU5hbWVkQ29udGV4dE5vZGUgbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuaXNFcXVpdmFsZW50VG8obm9kZSkKLQkJCQkmJiB0aGlzLmlzRXF1aXZhbGVudFRvKChFY2xpcHNlTGlua0NvbnZlcnRlckNsYXNzQ29udmVydGVyKSBub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VxdWl2YWxlbnRUbyhFY2xpcHNlTGlua0NvbnZlcnRlckNsYXNzQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy5nZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzKCksIGNvbnZlcnRlci5nZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGY3YmNlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdWJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcgotewotCXByb3RlY3RlZCBmaW5hbCBQYXJlbnRBZGFwdGVyIHBhcmVudEFkYXB0ZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8SmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLCBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24+IGN1c3RvbUNvbnZlcnRlckNvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8SmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbj4gb2JqZWN0VHlwZUNvbnZlcnRlckNvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8SmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLCBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24+IHN0cnVjdENvbnZlcnRlckNvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8SmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbj4gdHlwZUNvbnZlcnRlckNvbnRhaW5lcjsKLQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwoUGFyZW50QWRhcHRlciBwYXJlbnRBZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudEFkYXB0ZXIuZ2V0Q29udmVydGVyQ29udGFpbmVyUGFyZW50KCkpOwotCQl0aGlzLnBhcmVudEFkYXB0ZXIgPSBwYXJlbnRBZGFwdGVyOwotCQl0aGlzLmN1c3RvbUNvbnZlcnRlckNvbnRhaW5lciA9IHRoaXMuYnVpbGRDdXN0b21Db252ZXJ0ZXJDb250YWluZXIoKTsKLQkJdGhpcy5vYmplY3RUeXBlQ29udmVydGVyQ29udGFpbmVyID0gdGhpcy5idWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJdGhpcy5zdHJ1Y3RDb252ZXJ0ZXJDb250YWluZXIgPSB0aGlzLmJ1aWxkU3RydWN0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCXRoaXMudHlwZUNvbnZlcnRlckNvbnRhaW5lciA9IHRoaXMuYnVpbGRUeXBlQ29udmVydGVyQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY0N1c3RvbUNvbnZlcnRlcnMoKTsKLQkJdGhpcy5zeW5jT2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJdGhpcy5zeW5jU3RydWN0Q29udmVydGVycygpOwotCQl0aGlzLnN5bmNUeXBlQ29udmVydGVycygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlTm9kZXModGhpcy5nZXRDdXN0b21Db252ZXJ0ZXJzKCkpOwotCQl0aGlzLnVwZGF0ZU5vZGVzKHRoaXMuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSk7Ci0JCXRoaXMudXBkYXRlTm9kZXModGhpcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkpOwotCQl0aGlzLnVwZGF0ZU5vZGVzKHRoaXMuZ2V0VHlwZUNvbnZlcnRlcnMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGN1c3RvbSBjb252ZXJ0ZXJzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8SmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBnZXRDdXN0b21Db252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21Db252ZXJ0ZXJDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbUNvbnZlcnRlckNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHNTaXplKCk7Ci0JfQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBhZGRDdXN0b21Db252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmFkZEN1c3RvbUNvbnZlcnRlcih0aGlzLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgYWRkQ3VzdG9tQ29udmVydGVyKGludCBpbmRleCkgewotCQlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuYWRkQ3VzdG9tQ29udmVydGVyQW5ub3RhdGlvbihpbmRleCk7Ci0JCXJldHVybiB0aGlzLmN1c3RvbUNvbnZlcnRlckNvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgYW5ub3RhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBhZGRDdXN0b21Db252ZXJ0ZXJBbm5vdGF0aW9uKGludCBpbmRleCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgdGhpcy5nZXRKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50KCkuYWRkQW5ub3RhdGlvbihpbmRleCwgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ3VzdG9tQ29udmVydGVyKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGN1c3RvbUNvbnZlcnRlcikgewotCQl0aGlzLnJlbW92ZUN1c3RvbUNvbnZlcnRlcih0aGlzLmN1c3RvbUNvbnZlcnRlckNvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoKEphdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgY3VzdG9tQ29udmVydGVyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ3VzdG9tQ29udmVydGVyKGludCBpbmRleCkgewotCQl0aGlzLmdldEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKS5yZW1vdmVBbm5vdGF0aW9uKGluZGV4LCBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJdGhpcy5jdXN0b21Db252ZXJ0ZXJDb250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVDdXN0b21Db252ZXJ0ZXIoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5nZXRKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50KCkubW92ZUFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJdGhpcy5jdXN0b21Db252ZXJ0ZXJDb250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBidWlsZEN1c3RvbUNvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcih0aGlzLCBjb252ZXJ0ZXJBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jQ3VzdG9tQ29udmVydGVycygpIHsKLQkJdGhpcy5jdXN0b21Db252ZXJ0ZXJDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uPiBnZXRDdXN0b21Db252ZXJ0ZXJBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50QWRhcHRlci5wYXJlbnRTdXBwb3J0c0NvbnZlcnRlcnMoKSA/Ci0JCQkJbmV3IFN1Ykxpc3RJdGVyYWJsZVdyYXBwZXI8TmVzdGFibGVBbm5vdGF0aW9uLCBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24+KHRoaXMuZ2V0TmVzdGFibGVDdXN0b21Db252ZXJ0ZXJBbm5vdGF0aW9uc18oKSkgOgotCQkJCUVtcHR5TGlzdEl0ZXJhYmxlLjxFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbj4gZ2V0TmVzdGFibGVDdXN0b21Db252ZXJ0ZXJBbm5vdGF0aW9uc18oKSB7Ci0JCXJldHVybiB0aGlzLmdldEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKS5nZXRBbm5vdGF0aW9ucyhFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8SmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLCBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24+IGJ1aWxkQ3VzdG9tQ29udmVydGVyQ29udGFpbmVyKCkgewotCQlDdXN0b21Db252ZXJ0ZXJDb250YWluZXIgY29udGFpbmVyID0gbmV3IEN1c3RvbUNvbnZlcnRlckNvbnRhaW5lcigpOwotCQljb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIGN1c3RvbSBjb252ZXJ0ZXIgY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEN1c3RvbUNvbnZlcnRlckNvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciwgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIENVU1RPTV9DT05WRVJURVJTX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgYnVpbGRDb250ZXh0RWxlbWVudChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24gcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbC50aGlzLmJ1aWxkQ3VzdG9tQ29udmVydGVyKHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwudGhpcy5nZXRDdXN0b21Db252ZXJ0ZXJBbm5vdGF0aW9ucygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGdldFJlc291cmNlRWxlbWVudChKYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIG9iamVjdCB0eXBlIGNvbnZlcnRlcnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBnZXRPYmplY3RUeXBlQ29udmVydGVycygpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlckNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIodGhpcy5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgYWRkT2JqZWN0VHlwZUNvbnZlcnRlcihpbnQgaW5kZXgpIHsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5hZGRPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbihpbmRleCk7Ci0JCXJldHVybiB0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJDb250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIGFubm90YXRpb24pOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGFkZE9iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKGludCBpbmRleCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHRoaXMuZ2V0SmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCgpLmFkZEFubm90YXRpb24oaW5kZXgsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVPYmplY3RUeXBlQ29udmVydGVyKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvYmplY3RUeXBlQ29udmVydGVyKSB7Ci0JCXRoaXMucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcih0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJDb250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KChKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBvYmplY3RUeXBlQ29udmVydGVyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcihpbnQgaW5kZXgpIHsKLQkJdGhpcy5nZXRKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50KCkucmVtb3ZlQW5ub3RhdGlvbihpbmRleCwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJDb250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVPYmplY3RUeXBlQ29udmVydGVyKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuZ2V0SmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCgpLm1vdmVBbm5vdGF0aW9uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJDb250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgYnVpbGRPYmplY3RUeXBlQ29udmVydGVyKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIodGhpcywgY29udmVydGVyQW5ub3RhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY09iamVjdFR5cGVDb252ZXJ0ZXJzKCkgewotCQl0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbj4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnRBZGFwdGVyLnBhcmVudFN1cHBvcnRzQ29udmVydGVycygpID8gCi0JCQkJbmV3IFN1Ykxpc3RJdGVyYWJsZVdyYXBwZXI8TmVzdGFibGVBbm5vdGF0aW9uLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uPih0aGlzLmdldE5lc3RhYmxlT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25zXygpKSA6Ci0JCQkJRW1wdHlMaXN0SXRlcmFibGUuPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbj4gZ2V0TmVzdGFibGVPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbnNfKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50KCkuZ2V0QW5ub3RhdGlvbnMoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uPiBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCU9iamVjdFR5cGVDb252ZXJ0ZXJDb250YWluZXIgY29udGFpbmVyID0gbmV3IE9iamVjdFR5cGVDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJY29udGFpbmVyLmluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBvYmplY3RUeXBlIGNvbnZlcnRlciBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgT2JqZWN0VHlwZUNvbnZlcnRlckNvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gT0JKRUNUX1RZUEVfQ09OVkVSVEVSU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBidWlsZENvbnRleHRFbGVtZW50KEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbC50aGlzLmJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlcihyZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbC50aGlzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9ucygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBnZXRSZXNvdXJjZUVsZW1lbnQoSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldENvbnZlcnRlckFubm90YXRpb24oKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogc3RydWN0IGNvbnZlcnRlcnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxKYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IGdldFN0cnVjdENvbnZlcnRlcnMoKSB7Ci0JCXJldHVybiB0aGlzLnN0cnVjdENvbnZlcnRlckNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3RydWN0Q29udmVydGVyQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGFkZFN0cnVjdENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYWRkU3RydWN0Q29udmVydGVyKHRoaXMuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBhZGRTdHJ1Y3RDb252ZXJ0ZXIoaW50IGluZGV4KSB7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5hZGRTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKGluZGV4KTsKLQkJcmV0dXJuIHRoaXMuc3RydWN0Q29udmVydGVyQ29udGFpbmVyLmFkZENvbnRleHRFbGVtZW50KGluZGV4LCBhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGFkZFN0cnVjdENvbnZlcnRlckFubm90YXRpb24oaW50IGluZGV4KSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSB0aGlzLmdldEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKS5hZGRBbm5vdGF0aW9uKGluZGV4LCBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgc3RydWN0Q29udmVydGVyKSB7Ci0JCXRoaXMucmVtb3ZlU3RydWN0Q29udmVydGVyKHRoaXMuc3RydWN0Q29udmVydGVyQ29udGFpbmVyLmluZGV4T2ZDb250ZXh0RWxlbWVudCgoSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSBzdHJ1Y3RDb252ZXJ0ZXIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoaW50IGluZGV4KSB7Ci0JCXRoaXMuZ2V0SmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCgpLnJlbW92ZUFubm90YXRpb24oaW5kZXgsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0aGlzLnN0cnVjdENvbnZlcnRlckNvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVN0cnVjdENvbnZlcnRlcihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLmdldEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKS5tb3ZlQW5ub3RhdGlvbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0aGlzLnN0cnVjdENvbnZlcnRlckNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGJ1aWxkU3RydWN0Q29udmVydGVyKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKHRoaXMsIGNvbnZlcnRlckFubm90YXRpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNTdHJ1Y3RDb252ZXJ0ZXJzKCkgewotCQl0aGlzLnN0cnVjdENvbnZlcnRlckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24+IGdldFN0cnVjdENvbnZlcnRlckFubm90YXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnRBZGFwdGVyLnBhcmVudFN1cHBvcnRzQ29udmVydGVycygpID8KLQkJCQluZXcgU3ViTGlzdEl0ZXJhYmxlV3JhcHBlcjxOZXN0YWJsZUFubm90YXRpb24sIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbj4odGhpcy5nZXROZXN0YWJsZVN0cnVjdENvbnZlcnRlckFubm90YXRpb25zXygpKSA6Ci0JCQkJRW1wdHlMaXN0SXRlcmFibGUuPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbj5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8TmVzdGFibGVBbm5vdGF0aW9uPiBnZXROZXN0YWJsZVN0cnVjdENvbnZlcnRlckFubm90YXRpb25zXygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCgpLmdldEFubm90YXRpb25zKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbj4gYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCVN0cnVjdENvbnZlcnRlckNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgU3RydWN0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogc3RydWN0IGNvbnZlcnRlciBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgU3RydWN0Q29udmVydGVyQ29udGFpbmVyCi0JCWV4dGVuZHMgQ29udGV4dExpc3RDb250YWluZXI8SmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLCBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gU1RSVUNUX0NPTlZFUlRFUlNfTElTVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBidWlsZENvbnRleHRFbGVtZW50KEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLnRoaXMuYnVpbGRTdHJ1Y3RDb252ZXJ0ZXIocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbC50aGlzLmdldFN0cnVjdENvbnZlcnRlckFubm90YXRpb25zKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gZ2V0UmVzb3VyY2VFbGVtZW50KEphdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldENvbnZlcnRlckFubm90YXRpb24oKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB0eXBlIGNvbnZlcnRlcnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxKYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBnZXRUeXBlQ29udmVydGVycygpIHsKLQkJcmV0dXJuIHRoaXMudHlwZUNvbnZlcnRlckNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRUeXBlQ29udmVydGVyc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVDb252ZXJ0ZXJDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGFkZFR5cGVDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmFkZFR5cGVDb252ZXJ0ZXIodGhpcy5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgYWRkVHlwZUNvbnZlcnRlcihpbnQgaW5kZXgpIHsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5hZGRUeXBlQ29udmVydGVyQW5ub3RhdGlvbihpbmRleCk7Ci0JCXJldHVybiB0aGlzLnR5cGVDb252ZXJ0ZXJDb250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIGFubm90YXRpb24pOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGFkZFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKGludCBpbmRleCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIHRoaXMuZ2V0SmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCgpLmFkZEFubm90YXRpb24oaW5kZXgsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVUeXBlQ29udmVydGVyKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciB0eXBlQ29udmVydGVyKSB7Ci0JCXRoaXMucmVtb3ZlVHlwZUNvbnZlcnRlcih0aGlzLnR5cGVDb252ZXJ0ZXJDb250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KChKYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSB0eXBlQ29udmVydGVyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlVHlwZUNvbnZlcnRlcihpbnQgaW5kZXgpIHsKLQkJdGhpcy5nZXRKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50KCkucmVtb3ZlQW5ub3RhdGlvbihpbmRleCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0aGlzLnR5cGVDb252ZXJ0ZXJDb250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVUeXBlQ29udmVydGVyKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuZ2V0SmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCgpLm1vdmVBbm5vdGF0aW9uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0aGlzLnR5cGVDb252ZXJ0ZXJDb250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgYnVpbGRUeXBlQ29udmVydGVyKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIodGhpcywgY29udmVydGVyQW5ub3RhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY1R5cGVDb252ZXJ0ZXJzKCkgewotCQl0aGlzLnR5cGVDb252ZXJ0ZXJDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbj4gZ2V0VHlwZUNvbnZlcnRlckFubm90YXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnRBZGFwdGVyLnBhcmVudFN1cHBvcnRzQ29udmVydGVycygpID8gCi0JCQkJbmV3IFN1Ykxpc3RJdGVyYWJsZVdyYXBwZXI8TmVzdGFibGVBbm5vdGF0aW9uLCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uPih0aGlzLmdldE5lc3RhYmxlVHlwZUNvbnZlcnRlckFubm90YXRpb25zXygpKSA6Ci0JCQkJRW1wdHlMaXN0SXRlcmFibGUuPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbj4gZ2V0TmVzdGFibGVUeXBlQ29udmVydGVyQW5ub3RhdGlvbnNfKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50KCkuZ2V0QW5ub3RhdGlvbnMoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uPiBidWlsZFR5cGVDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCVR5cGVDb252ZXJ0ZXJDb250YWluZXIgY29udGFpbmVyID0gbmV3IFR5cGVDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJY29udGFpbmVyLmluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiB0eXBlIGNvbnZlcnRlciBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgVHlwZUNvbnZlcnRlckNvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gVFlQRV9DT05WRVJURVJTX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGJ1aWxkQ29udGV4dEVsZW1lbnQoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLnRoaXMuYnVpbGRUeXBlQ29udmVydGVyKHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLnRoaXMuZ2V0VHlwZUNvbnZlcnRlckFubm90YXRpb25zKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGdldFJlc291cmNlRWxlbWVudChKYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0Q29udmVydGVyQW5ub3RhdGlvbigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFKcGFDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YUpwYUNvbnRleHROb2RlKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGFyZW50QWRhcHRlciBnZXRQYXJlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnRBZGFwdGVyOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IGdldEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudEFkYXB0ZXIoKS5nZXRKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50KCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPigKLQkJCQkJdGhpcy5nZXRDdXN0b21Db252ZXJ0ZXJzKCksCi0JCQkJCXRoaXMuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSwKLQkJCQkJdGhpcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCksCi0JCQkJCXRoaXMuZ2V0VHlwZUNvbnZlcnRlcnMoKQotCQkJCSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb252ZXJ0ZXJzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKQotCQkJKyB0aGlzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpCi0JCQkrIHRoaXMuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKQotCQkJKyB0aGlzLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyU3VwcG9ydGVkQ29udmVydGVycygpIHsKLQkJcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBjb252ZXJ0ZXJzIGFyZSB2YWxpZGF0ZWQgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCN2YWxpZGF0ZUNvbnZlcnRlcnMoTGlzdCwgSVJlcG9ydGVyKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCS8vIGNvbnZlcnRlcnMgYXJlIHZhbGlkYXRlZCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50KCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYjdkNjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJ0ZXI8L2NvZGU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIKLQlleHRlbmRzIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNsYXNzQ29udmVydGVyPEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyCi17Ci0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzczsKLQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcihKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgcGFyZW50LCBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGNvbnZlcnRlckFubm90YXRpb24sIGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldEZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3ModGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3NOYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgY2xhc3MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uQ29udmVydGVyQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVydGVyQ2xhc3MoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRBbm5vdGF0aW9uQ29udmVydGVyQ2xhc3MoU3RyaW5nIGNvbnZlcnRlckNsYXNzKSB7Ci0JCXRoaXMuY29udmVydGVyQW5ub3RhdGlvbi5zZXRDb252ZXJ0ZXJDbGFzcyhjb252ZXJ0ZXJDbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZ1bGx5IHF1YWxpZmllZCBjb252ZXJ0ZXIgY2xhc3MgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5mdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3MoU3RyaW5nIGNvbnZlcnRlckNsYXNzKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3M7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzcyA9IGNvbnZlcnRlckNsYXNzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRlVMTFlfUVVBTElGSUVEX0NPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSwgb2xkLCBjb252ZXJ0ZXJDbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIENsYXNzPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBnZXRUeXBlKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIuY2xhc3M7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFY2xpcHNlTGlua0NvbnZlcnRlckludGVyZmFjZSgpIHsKLQkJcmV0dXJuIEVDTElQU0VMSU5LX0NPTlZFUlRFUl9DTEFTU19OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWNsaXBzZUxpbmtDb252ZXJ0ZXJJbnRlcmZhY2VFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5DT05WRVJURVJfQ0xBU1NfSU1QTEVNRU5UU19DT05WRVJURVI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRBbm5vdGF0aW9uQ29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb252ZXJ0ZXJDbGFzc0RvZXNOb3RFeGlzdE1lc3NhZ2VUbyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gbm8gbmVlZCB0byBhZGQgbWVzc2FnZSBzaW5jZSB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYSBjb21waWxlciBlcnJvcgotCX0KLQotCS8vICoqKioqKioqKiogbWV0YWRhdGEgY29udmVyc2lvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjb252ZXJ0VG8oT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udmVydGVyQ29udGFpbmVyKSB7Ci0JCW9ybUNvbnZlcnRlckNvbnRhaW5lci5hZGRDdXN0b21Db252ZXJ0ZXIoKS5jb252ZXJ0RnJvbSh0aGlzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVsZXRlKCkgewotCQl0aGlzLmdldFBhcmVudCgpLnJlbW92ZUN1c3RvbUNvbnZlcnRlcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVjMjc1Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIKLQlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0N1c3RvbWl6ZXIKLXsKLQlwcml2YXRlIFN0cmluZyBzcGVjaWZpZWRDdXN0b21pemVyQ2xhc3M7Ci0KLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzczsKLQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIoRWNsaXBzZUxpbmtKYXZhVHlwZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuc3BlY2lmaWVkQ3VzdG9taXplckNsYXNzID0gdGhpcy5idWlsZFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzc18odGhpcy5idWlsZFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldEZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzKHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY3VzdG9taXplciBjbGFzcyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEN1c3RvbWl6ZXJDbGFzcygpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkQ3VzdG9taXplckNsYXNzIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ3VzdG9taXplckNsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhTdHJpbmcgY3VzdG9taXplckNsYXNzKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudChjdXN0b21pemVyQ2xhc3MsIHRoaXMuc3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKSkgewotCQkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRDdXN0b21pemVyQW5ub3RhdGlvbigpOwotCQkJaWYgKGN1c3RvbWl6ZXJDbGFzcyA9PSBudWxsKSB7Ci0JCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQl0aGlzLnJlbW92ZUN1c3RvbWl6ZXJBbm5vdGF0aW9uKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCWFubm90YXRpb24gPSB0aGlzLmFkZEN1c3RvbWl6ZXJBbm5vdGF0aW9uKCk7Ci0JCQkJfQotCQkJCWFubm90YXRpb24uc2V0VmFsdWUoY3VzdG9taXplckNsYXNzKTsKLQkJCX0KLQotCQkJdGhpcy5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3NfKGN1c3RvbWl6ZXJDbGFzcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3NfKFN0cmluZyBjdXN0b21pemVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkQ3VzdG9taXplckNsYXNzOwotCQl0aGlzLnNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyA9IGN1c3RvbWl6ZXJDbGFzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DVVNUT01JWkVSX0NMQVNTX1BST1BFUlRZLCBvbGQsIGN1c3RvbWl6ZXJDbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpIHsKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRDdXN0b21pemVyQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogYW5ub3RhdGlvbi5nZXRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpIHsKLQkJcmV0dXJuIG51bGw7ICAvLyBubyBkZWZhdWx0IGZvciBKYXZhCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGZ1bGx5LXF1YWxpZmllZCBjdXN0b21pemVyIGNsYXNzICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzKFN0cmluZyBjdXN0b21pemVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3M7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3MgPSBjdXN0b21pemVyQ2xhc3M7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfQ1VTVE9NSVpFUl9DTEFTU19QUk9QRVJUWSwgb2xkLCBjdXN0b21pemVyQ2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzcygpIHsKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRDdXN0b21pemVyQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogYW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzc05hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY3VzdG9taXplciBhbm5vdGF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIGdldEN1c3RvbWl6ZXJBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24odGhpcy5nZXRDdXN0b21pemVyQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gYWRkQ3VzdG9taXplckFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuYWRkQW5ub3RhdGlvbih0aGlzLmdldEN1c3RvbWl6ZXJBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDdXN0b21pemVyQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkucmVtb3ZlQW5ub3RhdGlvbih0aGlzLmdldEN1c3RvbWl6ZXJBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbWl6ZXJBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFUeXBlTWFwcGluZyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtKYXZhVHlwZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0phdmFUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVR5cGUgZ2V0SmF2YVJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JfQotCi0JcHVibGljIGNoYXIgZ2V0Q3VzdG9taXplckNsYXNzRW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJcmV0dXJuICcuJzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnZhbGlkYXRlQ3VzdG9taXplckNsYXNzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUN1c3RvbWl6ZXJDbGFzcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcyxDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAodGhpcy5nZXRGdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzcygpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvL2lmIHRoZSB0eXBlIGNhbm5vdCBiZSByZXNvbHZlZCB0aGVyZSBpcyBubyBuZWVkIHRvIHBlcmZvcm0gdGhlIGZvbGxvd2luZyB2YWxpZGF0aW9uLAotCQkvL0pEVCB3aWxsIG5vdGUgdGhlIGVycm9yIGluIHRoZSBzb3VyY2UKLQkJSVR5cGUgY3VzdG9taXplckpkdFR5cGUgPSAgSkRUVG9vbHMuZmluZFR5cGUodGhpcy5nZXRKYXZhUHJvamVjdCgpLCB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQlpZiAoY3VzdG9taXplckpkdFR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghSkRUVG9vbHMudHlwZUhhc1B1YmxpY1plcm9BcmdDb25zdHJ1Y3RvcihjdXN0b21pemVySmR0VHlwZSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkRFU0NSSVBUT1JfQ1VTVE9NSVpFUl9DTEFTU19OT1RfVkFMSUQsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzKCl9LAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJdGhpcy5nZXRDdXN0b21pemVyQ2xhc3NUZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCQkJKQotCQkJKTsKLQkJfSAKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRDdXN0b21pemVyQW5ub3RhdGlvbigpOwotCQlpZiAoIWFubm90YXRpb24uY3VzdG9taXplckNsYXNzSW1wbGVtZW50c0ludGVyZmFjZShFQ0xJUFNFTElOS19ERVNDUklQVE9SX0NVU1RPTUlaRVJfQ0xBU1NfTkFNRSwgYXN0Um9vdCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkRFU0NSSVBUT1JfQ1VTVE9NSVpFUl9DTEFTU19JTVBMRU1FTlRTX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUiwKLQkJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0RnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3MoKX0sCi0JCQkJCQkJdGhpcywKLQkJCQkJCQl0aGlzLmdldEN1c3RvbWl6ZXJDbGFzc1RleHRSYW5nZShhc3RSb290KQotCQkJCQkpCi0JCQkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRDdXN0b21pemVyQ2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLmdldEN1c3RvbWl6ZXJBbm5vdGF0aW9uKCkuZ2V0VmFsdWVUZXh0UmFuZ2UoKSwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldEN1c3RvbWl6ZXJBbm5vdGF0aW9uKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJiYTg3OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhQ29udmVydGlibGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCwgRWNsaXBzZUxpbmtKYXZhQ29udmVydGlibGVNYXBwaW5nCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0pvaW5GZXRjaCBqb2luRmV0Y2g7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGNvbnZlcnRlckNvbnRhaW5lcjsKLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuam9pbkZldGNoID0gbmV3IEphdmFFY2xpcHNlTGlua0pvaW5GZXRjaCh0aGlzKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmpvaW5GZXRjaC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmpvaW5GZXRjaC51cGRhdGUoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gZmV0Y2ggKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rSm9pbkZldGNoIGdldEpvaW5GZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkZldGNoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXJzICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgZ2V0Q29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBidWlsZENvbnZlcnRlckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsKHRoaXMpOwotCX0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyIGNvbnRhaW5lciBwYXJlbnQgYWRhcHRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUpwYUNvbnRleHROb2RlIGdldENvbnZlcnRlckNvbnRhaW5lclBhcmVudCgpIHsKLQkJcmV0dXJuIHRoaXM7ICAvLyBubyBhZGFwdGVyCi0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgZ2V0SmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwYXJlbnRTdXBwb3J0c0NvbnZlcnRlcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpOwotCX0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyIGFkYXB0ZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIHB1dCB0aGUgRWNsaXBzZUxpbmsgY29udmVydCBhZGFwdGVyIGZpcnN0IC0gdGhpcyBpcyB0aGUgb3JkZXIgRWNsaXBzZUxpbmsgc2VhcmNoZXMKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YUNvbnZlcnRlci5BZGFwdGVyPiBnZXRDb252ZXJ0ZXJBZGFwdGVycygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxKYXZhQ29udmVydGVyLkFkYXB0ZXI+KAotCQkJCUphdmFFY2xpcHNlTGlua0NvbnZlcnQuQWRhcHRlci5pbnN0YW5jZSgpLAotCQkJCXN1cGVyLmdldENvbnZlcnRlckFkYXB0ZXJzKCkKLQkJCSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5qb2luRmV0Y2gudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTY0ODc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ob3ROdWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsKLSAqIEphdmEgZW1iZWRkYWJsZSB0eXBlIG1hcHBpbmcKLSAqLwotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGVJbXBsCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFFbWJlZGRhYmxlCi0JaW1wbGVtZW50cyBKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlLCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIuUGFyZW50QWRhcHRlcgotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgY29udmVydGVyQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNoYW5nZVRyYWNraW5nOwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplcjsKLQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGVJbXBsKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEVtYmVkZGFibGVBbm5vdGF0aW9uIG1hcHBpbmdBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWFwcGluZ0Fubm90YXRpb24pOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZyA9IHRoaXMuYnVpbGRDaGFuZ2VUcmFja2luZygpOwotCQl0aGlzLmN1c3RvbWl6ZXIgPSB0aGlzLmJ1aWxkQ3VzdG9taXplcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmN1c3RvbWl6ZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnVwZGF0ZSgpOwotCQl0aGlzLmNoYW5nZVRyYWNraW5nLnVwZGF0ZSgpOwotCQl0aGlzLmN1c3RvbWl6ZXIudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBjb250YWluZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBnZXRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwodGhpcyk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPigKLQkJCQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuZ2V0Q29udmVydGVycygpLAotCQkJCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmdDb252ZXJ0ZXJzKCkKLQkJCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4gZ2V0QXR0cmlidXRlTWFwcGluZ0NvbnZlcnRlcnMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+KHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZ0NvbnZlcnRlcnNfKCksIE5vdE51bGxGaWx0ZXIuPEVjbGlwc2VMaW5rQ29udmVydGVyPmluc3RhbmNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4gZ2V0QXR0cmlidXRlTWFwcGluZ0NvbnZlcnRlcnNfKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPih0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmdDb252ZXJ0ZXJMaXN0cygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+PiBnZXRBdHRyaWJ1dGVNYXBwaW5nQ29udmVydGVyTGlzdHMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nLCBJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4+KAotCQkJCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZ3MoKSwKLQkJCQlBVFRSSUJVVEVfTUFQUElOR19DT05WRVJURVJfVFJBTlNGT1JNRVIKLQkJCSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNoYW5nZSB0cmFja2luZyAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBnZXRDaGFuZ2VUcmFja2luZygpIHsKLQkJcmV0dXJuIHRoaXMuY2hhbmdlVHJhY2tpbmc7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGJ1aWxkQ2hhbmdlVHJhY2tpbmcoKSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGN1c3RvbWl6ZXIgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemVyOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyIGJ1aWxkQ3VzdG9taXplcigpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIHVzZXNQcmltYXJ5S2V5Q29sdW1ucygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZXNQcmltYXJ5S2V5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBjb250YWluZXIgcGFyZW50IGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFKcGFDb250ZXh0Tm9kZSBnZXRDb252ZXJ0ZXJDb250YWluZXJQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzOyAgLy8gbm8gYWRhcHRlcgotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IGdldEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwYXJlbnRTdXBwb3J0c0NvbnZlcnRlcnMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmNoYW5nZVRyYWNraW5nLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMuY3VzdG9taXplci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRUeXBlTWFwcGluZ1ZhbGlkYXRvcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rVHlwZU1hcHBpbmdWYWxpZGF0b3IodGhpcywgdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCksIHRoaXMuYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcihhc3RSb290KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0VtYmVkZGVkSWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwZDFiNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFDb252ZXJ0aWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci0KLS8qKgotICogSmF2YSBlbWJlZGRlZCBJRCBtYXBwaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtFbWJlZGRlZElkTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhRW1iZWRkZWRJZE1hcHBpbmcKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rSmF2YUNvbnZlcnRpYmxlTWFwcGluZwotewotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBjb252ZXJ0ZXJDb250YWluZXI7Ci0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyID0gdGhpcy5idWlsZENvbnZlcnRlckNvbnRhaW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlcnMgKioqKioqKioqKgotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBnZXRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwodGhpcyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgY29udGFpbmVyIHBhcmVudCBhZGFwdGVyICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhSnBhQ29udGV4dE5vZGUgZ2V0Q29udmVydGVyQ29udGFpbmVyUGFyZW50KCkgewotCQlyZXR1cm4gdGhpczsgIC8vIG5vIGFkYXB0ZXIKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBnZXRKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBhcmVudFN1cHBvcnRzQ29udmVydGVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW1iZWRkZWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW1iZWRkZWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxN2Y3YzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0VtYmVkZGVkTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFDb252ZXJ0aWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtFbWJlZGRlZE1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0SmF2YUVtYmVkZGVkTWFwcGluZwotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtKYXZhQ29udmVydGlibGVNYXBwaW5nCi17Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGNvbnZlcnRlckNvbnRhaW5lcjsKLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtFbWJlZGRlZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyID0gdGhpcy5idWlsZENvbnZlcnRlckNvbnRhaW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlcnMgKioqKioqKioqKgotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBnZXRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwodGhpcyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgY29udGFpbmVyIHBhcmVudCBhZGFwdGVyICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhSnBhQ29udGV4dE5vZGUgZ2V0Q29udmVydGVyQ29udGFpbmVyUGFyZW50KCkgewotCQlyZXR1cm4gdGhpczsgIC8vIG5vIGFkYXB0ZXIKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBnZXRKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBhcmVudFN1cHBvcnRzQ29udmVydGVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0VudGl0eUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMDM5NTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0VudGl0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ob3ROdWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlYWRPbmx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0VudGl0eVByaW1hcnlLZXlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rCi0gKiBKYXZhIGVudGl0eQotICovCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rRW50aXR5SW1wbAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhRW50aXR5Ci0JaW1wbGVtZW50cyBKYXZhRWNsaXBzZUxpbmtFbnRpdHksIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lci5QYXJlbnRBZGFwdGVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZzsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seTsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgY29udmVydGVyQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNoYW5nZVRyYWNraW5nOwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplcjsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgbXVsdGl0ZW5hbmN5OwotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0VudGl0eUltcGwoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgRW50aXR5QW5ub3RhdGlvbiBtYXBwaW5nQW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIG1hcHBpbmdBbm5vdGF0aW9uKTsKLQkJdGhpcy5jYWNoaW5nID0gdGhpcy5idWlsZENhY2hpbmcoKTsKLQkJdGhpcy5yZWFkT25seSA9IHRoaXMuYnVpbGRSZWFkT25seSgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZyA9IHRoaXMuYnVpbGRDaGFuZ2VUcmFja2luZygpOwotCQl0aGlzLmN1c3RvbWl6ZXIgPSB0aGlzLmJ1aWxkQ3VzdG9taXplcigpOwotCQl0aGlzLm11bHRpdGVuYW5jeSA9IHRoaXMuYnVpbGRNdWx0aXRlbmFuY3koKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jYWNoaW5nLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5yZWFkT25seS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZy5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY3VzdG9taXplci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMubXVsdGl0ZW5hbmN5LnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmNhY2hpbmcudXBkYXRlKCk7Ci0JCXRoaXMucmVhZE9ubHkudXBkYXRlKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnVwZGF0ZSgpOwotCQl0aGlzLmNoYW5nZVRyYWNraW5nLnVwZGF0ZSgpOwotCQl0aGlzLmN1c3RvbWl6ZXIudXBkYXRlKCk7Ci0JCXRoaXMubXVsdGl0ZW5hbmN5LnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjYWNoaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGdldENhY2hpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hpbmc7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NhY2hpbmcgYnVpbGRDYWNoaW5nKCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0NhY2hpbmdJbXBsKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWFkLW9ubHkgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rUmVhZE9ubHkgZ2V0UmVhZE9ubHkoKSB7Ci0JCXJldHVybiB0aGlzLnJlYWRPbmx5OwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtSZWFkT25seSBidWlsZFJlYWRPbmx5KCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua1JlYWRPbmx5KHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgY29udGFpbmVyICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgZ2V0Q29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBidWlsZENvbnZlcnRlckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsKHRoaXMpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4gZ2V0Q29udmVydGVycygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4oCi0JCQkJCXRoaXMuY29udmVydGVyQ29udGFpbmVyLmdldENvbnZlcnRlcnMoKSwKLQkJCQkJdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nQ29udmVydGVycygpCi0JCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGdldEF0dHJpYnV0ZU1hcHBpbmdDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPih0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmdDb252ZXJ0ZXJzXygpLCBOb3ROdWxsRmlsdGVyLjxFY2xpcHNlTGlua0NvbnZlcnRlcj5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGdldEF0dHJpYnV0ZU1hcHBpbmdDb252ZXJ0ZXJzXygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4odGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nQ29udmVydGVyTGlzdHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPj4gZ2V0QXR0cmlidXRlTWFwcGluZ0NvbnZlcnRlckxpc3RzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZywgSXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+PigKLQkJCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmdzKCksCi0JCQkJQVRUUklCVVRFX01BUFBJTkdfQ09OVkVSVEVSX1RSQU5TRk9STUVSCi0JCQkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjaGFuZ2UgdHJhY2tpbmcgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgZ2V0Q2hhbmdlVHJhY2tpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmNoYW5nZVRyYWNraW5nOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBidWlsZENoYW5nZVRyYWNraW5nKCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjdXN0b21pemVyICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbWl6ZXIgZ2V0Q3VzdG9taXplcigpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplciBidWlsZEN1c3RvbWl6ZXIoKSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplcih0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbXVsdGl0ZW5hbmN5ICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgZ2V0TXVsdGl0ZW5hbmN5KCkgewotCQlyZXR1cm4gdGhpcy5tdWx0aXRlbmFuY3k7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBidWlsZE11bHRpdGVuYW5jeSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNFY2xpcHNlTGluazJfM0NvbXBhdGlibGUoKSA/Ci0JCQluZXcgSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5SW1wbDJfMyh0aGlzKSA6Ci0JCQluZXcgTnVsbEphdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VjbGlwc2VMaW5rMl8zQ29tcGF0aWJsZSgpIHsKLQkJcmV0dXJuIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ub2RlSXNFY2xpcHNlTGluazJfM0NvbXBhdGlibGUodGhpcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNdWx0aXRlbmFudE1ldGFkYXRhQWxsb3dlZCgpIHsKLQkJcmV0dXJuIHRoaXMuaXNSb290RW50aXR5KCkgfHwgdGhpcy5pc0luaGVyaXRhbmNlU3RyYXRlZ3lUYWJsZVBlckNsYXNzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmhlcml0YW5jZVN0cmF0ZWd5VGFibGVQZXJDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpID09IEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1M7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRpc2NyaW1pbmF0b3IgY29sdW1uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkU3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIHN1cGVyLmJ1aWxkU3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpICYmICEgdGhpcy5jbGFzc0V4dHJhY3RvcklzU3BlY2lmaWVkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2xhc3NFeHRyYWN0b3JJc1NwZWNpZmllZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uKCkgIT0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEgZ2V0Q2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xKSB0aGlzLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gdXNlc1ByaW1hcnlLZXlDb2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5QUklNQVJZX0tFWSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1c2VzUHJpbWFyeUtleVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkgewotCQlyZXR1cm4gZ2V0TXVsdGl0ZW5hbmN5KCkudXNlc1ByaW1hcnlLZXlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpOwotCX0KLQotCXB1YmxpYyBKYXZhQ2FjaGVhYmxlMl8wIGdldENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuICgoSmF2YUNhY2hlYWJsZUhvbGRlcjJfMCkgdGhpcy5nZXRDYWNoaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKSB7Ci0JCXJldHVybiAoKEphdmFDYWNoZWFibGVIb2xkZXIyXzApIHRoaXMuZ2V0Q2FjaGluZygpKS5jYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgY29udGFpbmVyIHBhcmVudCBhZGFwdGVyICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhSnBhQ29udGV4dE5vZGUgZ2V0Q29udmVydGVyQ29udGFpbmVyUGFyZW50KCkgewotCQlyZXR1cm4gdGhpczsgIC8vIG5vIGFkYXB0ZXIKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBnZXRKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGFyZW50U3VwcG9ydHNDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEphdmEgY29tcGxldGlvbiBwcm9wb3NhbHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJlc3VsdCA9IHRoaXMubXVsdGl0ZW5hbmN5LmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMuY2FjaGluZy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnJlYWRPbmx5LnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5jdXN0b21pemVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMubXVsdGl0ZW5hbmN5LnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwdFZhbGlkYXRvciBidWlsZFByaW1hcnlLZXlWYWxpZGF0b3IoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0VudGl0eVByaW1hcnlLZXlWYWxpZGF0b3IodGhpcywgdGhpcy5idWlsZFRleHRSYW5nZVJlc29sdmVyKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkVHlwZU1hcHBpbmdWYWxpZGF0b3IoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yKHRoaXMsIHRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpLCBidWlsZFRleHRSYW5nZVJlc29sdmVyKGFzdFJvb3QpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NDc0OWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0lkTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhQ29udmVydGlibGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0SmF2YUlkTWFwcGluZwotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtJZE1hcHBpbmcsIEVjbGlwc2VMaW5rSmF2YUNvbnZlcnRpYmxlTWFwcGluZwotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGU7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGNvbnZlcnRlckNvbnRhaW5lcjsKLQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0lkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5tdXRhYmxlID0gbmV3IEphdmFFY2xpcHNlTGlua011dGFibGUodGhpcyk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyID0gdGhpcy5idWlsZENvbnZlcnRlckNvbnRhaW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLm11dGFibGUuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5tdXRhYmxlLnVwZGF0ZSgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbXV0YWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtNdXRhYmxlIGdldE11dGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm11dGFibGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlcnMgKioqKioqKioqKgotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBnZXRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwodGhpcyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgY29udGFpbmVyIHBhcmVudCBhZGFwdGVyICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhSnBhQ29udGV4dE5vZGUgZ2V0Q29udmVydGVyQ29udGFpbmVyUGFyZW50KCkgewotCQlyZXR1cm4gdGhpczsgIC8vIG5vIGFkYXB0ZXIKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBnZXRKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBhcmVudFN1cHBvcnRzQ29udmVydGVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgYWRhcHRlcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogcHV0IHRoZSBFY2xpcHNlTGluayBjb252ZXJ0IGFkYXB0ZXIgZmlyc3QgLSB0aGlzIGlzIHRoZSBvcmRlciBFY2xpcHNlTGluayBzZWFyY2hlcwotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhQ29udmVydGVyLkFkYXB0ZXI+IGdldENvbnZlcnRlckFkYXB0ZXJzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEphdmFDb252ZXJ0ZXIuQWRhcHRlcj4oSmF2YUVjbGlwc2VMaW5rQ29udmVydC5BZGFwdGVyLmluc3RhbmNlKCksIHN1cGVyLmdldENvbnZlcnRlckFkYXB0ZXJzKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMubXV0YWJsZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2guamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNiOWRkMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rSm9pbkZldGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZTsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0pvaW5GZXRjaAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rSm9pbkZldGNoCi17Ci0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSB2YWx1ZTsKLQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0pvaW5GZXRjaChKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbHVlICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSB2YWx1ZSkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodmFsdWUsIHRoaXMudmFsdWUpKSB7Ci0JCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0Sm9pbkZldGNoQW5ub3RhdGlvbigpOwotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXRoaXMucmVtb3ZlSm9pbkZldGNoQW5ub3RhdGlvbigpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgewotCQkJCQlhbm5vdGF0aW9uID0gdGhpcy5hZGRKb2luRmV0Y2hBbm5vdGF0aW9uKCk7Ci0JCQkJfQotCQkJCWFubm90YXRpb24uc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLnRvSmF2YVJlc291cmNlTW9kZWwodmFsdWUpKTsKLQkJCX0KLQotCQkJdGhpcy5zZXRWYWx1ZV8odmFsdWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSB2YWx1ZSkgewotCQlFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCXByaXZhdGUgRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIGJ1aWxkVmFsdWUoKSB7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRKb2luRmV0Y2hBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUpvaW5GZXRjaFR5cGUgYW5ub3RhdGlvblZhbHVlID0gYW5ub3RhdGlvbi5nZXRWYWx1ZSgpOwotCQlyZXR1cm4gKGFubm90YXRpb25WYWx1ZSAhPSBudWxsKSA/Ci0JCQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbChhbm5vdGF0aW9uVmFsdWUpIDoKLQkJCQl0aGlzLmdldERlZmF1bHRWYWx1ZSgpOyAvLyBASm9pbkZldGNoIGlzIGVxdWl2YWxlbnQgdG8gQEpvaW5GZXRjaChKb2luRmV0Y2guSU5ORVIpCi0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1ZBTFVFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIGZldGNoIGFubm90YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBnZXRKb2luRmV0Y2hBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24odGhpcy5nZXRKb2luRmV0Y2hBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGFkZEpvaW5GZXRjaEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbih0aGlzLmdldEpvaW5GZXRjaEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUpvaW5GZXRjaEFubm90YXRpb24oKSB7Ci0JCXRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKHRoaXMuZ2V0Sm9pbkZldGNoQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRKb2luRmV0Y2hBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhQXR0cmlidXRlTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGdldEF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRBbm5vdGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRBbm5vdGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRKb2luRmV0Y2hBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBhbm5vdGF0aW9uLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTY5YmQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhQ29udmVydGlibGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhTWFueVRvTWFueU1hcHBpbmcKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcsIEVjbGlwc2VMaW5rSmF2YUNvbnZlcnRpYmxlTWFwcGluZwotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2ggam9pbkZldGNoOwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBjb252ZXJ0ZXJDb250YWluZXI7Ci0JCi0JCi0JcHVibGljIEphdmFFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmpvaW5GZXRjaCA9IG5ldyBKYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2godGhpcyk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyID0gdGhpcy5idWlsZENvbnZlcnRlckNvbnRhaW5lcigpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5qb2luRmV0Y2guc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5qb2luRmV0Y2gudXBkYXRlKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIGZldGNoICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0pvaW5GZXRjaCBnZXRKb2luRmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5GZXRjaDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGdldENvbnZlcnRlckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbCh0aGlzKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBjb250YWluZXIgcGFyZW50IGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFKcGFDb250ZXh0Tm9kZSBnZXRDb252ZXJ0ZXJDb250YWluZXJQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzOyAgLy8gbm8gYWRhcHRlcgotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IGdldEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGFyZW50U3VwcG9ydHNDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5qb2luRmV0Y2gudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMxYTUyNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhQ29udmVydGlibGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFNYW55VG9PbmVNYXBwaW5nCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcsIEVjbGlwc2VMaW5rSmF2YUNvbnZlcnRpYmxlTWFwcGluZwotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2ggam9pbkZldGNoOwotCQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgY29udmVydGVyQ29udGFpbmVyOwotCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5qb2luRmV0Y2ggPSBuZXcgSmF2YUVjbGlwc2VMaW5rSm9pbkZldGNoKHRoaXMpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5qb2luRmV0Y2guc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5qb2luRmV0Y2gudXBkYXRlKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIGZldGNoICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0pvaW5GZXRjaCBnZXRKb2luRmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5GZXRjaDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGdldENvbnZlcnRlckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbCh0aGlzKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBjb250YWluZXIgcGFyZW50IGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFKcGFDb250ZXh0Tm9kZSBnZXRDb252ZXJ0ZXJDb250YWluZXJQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzOyAgLy8gbm8gYWRhcHRlcgotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IGdldEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGFyZW50U3VwcG9ydHNDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5qb2luRmV0Y2gudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0ltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzU1OTU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLk5vdE51bGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFDYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFDYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlYWRPbmx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzUHJpbWFyeUtleVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBFY2xpcHNlTGluawotICogSmF2YSBtYXBwZWQgc3VwZXJjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0ltcGwKLQlleHRlbmRzIEFic3RyYWN0SmF2YU1hcHBlZFN1cGVyY2xhc3MKLQlpbXBsZW1lbnRzIEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MsIEphdmFDYWNoZWFibGVIb2xkZXIyXzAsIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lci5QYXJlbnRBZGFwdGVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZzsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seTsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgY29udmVydGVyQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNoYW5nZVRyYWNraW5nOwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplcjsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgbXVsdGl0ZW5hbmN5OwotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NJbXBsKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uIG1hcHBpbmdBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWFwcGluZ0Fubm90YXRpb24pOwotCQl0aGlzLmNhY2hpbmcgPSB0aGlzLmJ1aWxkQ2FjaGluZygpOwotCQl0aGlzLnJlYWRPbmx5ID0gdGhpcy5idWlsZFJlYWRPbmx5KCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyID0gdGhpcy5idWlsZENvbnZlcnRlckNvbnRhaW5lcigpOwotCQl0aGlzLmNoYW5nZVRyYWNraW5nID0gdGhpcy5idWlsZENoYW5nZVRyYWNraW5nKCk7Ci0JCXRoaXMuY3VzdG9taXplciA9IHRoaXMuYnVpbGRDdXN0b21pemVyKCk7Ci0JCXRoaXMubXVsdGl0ZW5hbmN5ID0gdGhpcy5idWlsZE11bHRpdGVuYW5jeSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNhY2hpbmcuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnJlYWRPbmx5LnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNoYW5nZVRyYWNraW5nLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jdXN0b21pemVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5tdWx0aXRlbmFuY3kuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuY2FjaGluZy51cGRhdGUoKTsKLQkJdGhpcy5yZWFkT25seS51cGRhdGUoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIudXBkYXRlKCk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcudXBkYXRlKCk7Ci0JCXRoaXMuY3VzdG9taXplci51cGRhdGUoKTsKLQkJdGhpcy5tdWx0aXRlbmFuY3kudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNhY2hpbmcgKioqKioqKioqKgotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0NhY2hpbmcgZ2V0Q2FjaGluZygpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBidWlsZENhY2hpbmcoKSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZ0ltcGwodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlYWQtb25seSAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtSZWFkT25seSBnZXRSZWFkT25seSgpIHsKLQkJcmV0dXJuIHRoaXMucmVhZE9ubHk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua1JlYWRPbmx5IGJ1aWxkUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rUmVhZE9ubHkodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBjb250YWluZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBnZXRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwodGhpcyk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPigKLQkJCQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuZ2V0Q29udmVydGVycygpLAotCQkJCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmdDb252ZXJ0ZXJzKCkKLQkJCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4gZ2V0QXR0cmlidXRlTWFwcGluZ0NvbnZlcnRlcnMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+KHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZ0NvbnZlcnRlcnNfKCksIE5vdE51bGxGaWx0ZXIuPEVjbGlwc2VMaW5rQ29udmVydGVyPmluc3RhbmNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4gZ2V0QXR0cmlidXRlTWFwcGluZ0NvbnZlcnRlcnNfKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPih0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmdDb252ZXJ0ZXJMaXN0cygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+PiBnZXRBdHRyaWJ1dGVNYXBwaW5nQ29udmVydGVyTGlzdHMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nLCBJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4+KAotCQkJCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZ3MoKSwKLQkJCQlBVFRSSUJVVEVfTUFQUElOR19DT05WRVJURVJfVFJBTlNGT1JNRVIKLQkJCSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNoYW5nZSB0cmFja2luZyAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBnZXRDaGFuZ2VUcmFja2luZygpIHsKLQkJcmV0dXJuIHRoaXMuY2hhbmdlVHJhY2tpbmc7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGJ1aWxkQ2hhbmdlVHJhY2tpbmcoKSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGN1c3RvbWl6ZXIgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemVyOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyIGJ1aWxkQ3VzdG9taXplcigpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtdWx0aXRlbmFuY3kgKioqKioqKioqKgotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBnZXRNdWx0aXRlbmFuY3koKSB7Ci0JCXJldHVybiB0aGlzLm11bHRpdGVuYW5jeTsKLQl9Ci0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgYnVpbGRNdWx0aXRlbmFuY3koKSB7Ci0JCXJldHVybiB0aGlzLmlzRWNsaXBzZUxpbmsyXzNDb21wYXRpYmxlKCkgPwotCQkJbmV3IEphdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeUltcGwyXzModGhpcykgOgotCQkJbmV3IE51bGxKYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzModGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFY2xpcHNlTGluazJfM0NvbXBhdGlibGUoKSB7Ci0JCXJldHVybiBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4ubm9kZUlzRWNsaXBzZUxpbmsyXzNDb21wYXRpYmxlKHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTXVsdGl0ZW5hbnRNZXRhZGF0YUFsbG93ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiB1c2VzUHJpbWFyeUtleUNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlBSSU1BUllfS0VZKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZXNQcmltYXJ5S2V5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXJldHVybiBnZXRNdWx0aXRlbmFuY3koKS51c2VzUHJpbWFyeUtleVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIEphdmFDYWNoZWFibGUyXzAgZ2V0Q2FjaGVhYmxlKCkgewotCQlyZXR1cm4gKChKYXZhQ2FjaGVhYmxlSG9sZGVyMl8wKSB0aGlzLmdldENhY2hpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSB0aGlzLmdldENhY2hpbmcoKSkuY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyIGNvbnRhaW5lciBwYXJlbnQgYWRhcHRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUpwYUNvbnRleHROb2RlIGdldENvbnZlcnRlckNvbnRhaW5lclBhcmVudCgpIHsKLQkJcmV0dXJuIHRoaXM7ICAvLyBubyBhZGFwdGVyCi0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgZ2V0SmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBhcmVudFN1cHBvcnRzQ29udmVydGVycygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXN1bHQgPSB0aGlzLm11bHRpdGVuYW5jeS5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5jYWNoaW5nLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMucmVhZE9ubHkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmN1c3RvbWl6ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5tdWx0aXRlbmFuY3kudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkUHJpbWFyeUtleVZhbGlkYXRvcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc1ByaW1hcnlLZXlWYWxpZGF0b3IodGhpcywgdGhpcy5idWlsZFRleHRSYW5nZVJlc29sdmVyKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkVHlwZU1hcHBpbmdWYWxpZGF0b3IoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NWYWxpZGF0b3IodGhpcywgdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCksIHRoaXMuYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcihhc3RSb290KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeUltcGwyXzMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3lJbXBsMl8zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYzcxYTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeUltcGwyXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlN1Ykxpc3RJdGVyYWJsZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwaW5nRmlsZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LlJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlRhcmdldERhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5WYWxpZGF0b3IyXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5SW1wbDJfMwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMwotewotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRNdWx0aXRlbmFudDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcGVjaWZpZWRNdWx0aXRlbmFudDsKLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMyBzcGVjaWZpZWRUeXBlOwotCXByb3RlY3RlZCBFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMyBkZWZhdWx0VHlwZTsKLQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0SW5jbHVkZUNyaXRlcmlhID0gREVGQVVMVF9JTkNMVURFX0NSSVRFUklBOwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuT3duZXIgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbk93bmVyOwotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMywgRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMz4gc3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8SmF2YVZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLCBSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGRlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgZGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW47Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0FsbG93ZWQ7Ci0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5SW1wbDJfMyhKYXZhRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0KLQkJRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMgbXVsdGl0ZW5hbnRBbm5vdGF0aW9uID0gdGhpcy5nZXRNdWx0aXRlbmFudEFubm90YXRpb24oKTsKLQkJdGhpcy5zcGVjaWZpZWRNdWx0aXRlbmFudCA9IG11bHRpdGVuYW50QW5ub3RhdGlvbi5pc1NwZWNpZmllZCgpOwotCQl0aGlzLnNwZWNpZmllZFR5cGUgPSBFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5mcm9tSmF2YVJlc291cmNlTW9kZWwobXVsdGl0ZW5hbnRBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQl0aGlzLnNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYSA9IG11bHRpdGVuYW50QW5ub3RhdGlvbi5nZXRJbmNsdWRlQ3JpdGVyaWEoKTsKLQkJdGhpcy50ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uT3duZXIgPSB0aGlzLmJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbk93bmVyKCk7Ci0JCXRoaXMuc3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lciA9IHRoaXMuYnVpbGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyKCk7Ci0JCXRoaXMuZGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4gPSB0aGlzLmJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbih0aGlzLmJ1aWxkTnVsbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKCkpOwotCQl0aGlzLmRlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyID0gdGhpcy5idWlsZERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0KLQkJRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMgbXVsdGl0ZW5hbnRBbm5vdGF0aW9uID0gdGhpcy5nZXRNdWx0aXRlbmFudEFubm90YXRpb24oKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRUeXBlXyhFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5mcm9tSmF2YVJlc291cmNlTW9kZWwobXVsdGl0ZW5hbnRBbm5vdGF0aW9uLmdldFZhbHVlKCkpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWFfKG11bHRpdGVuYW50QW5ub3RhdGlvbi5nZXRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0JCXRoaXMuc3luY1NwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVOb2Rlcyh0aGlzLmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZE11bHRpdGVuYW50Xyh0aGlzLmlzTXVsdGl0ZW5hbnRBbm5vdGF0aW9uU3BlY2lmaWVkKCkpOwotCQl0aGlzLnNldERlZmF1bHRNdWx0aXRlbmFudCh0aGlzLmJ1aWxkRGVmYXVsdE11bHRpdGVuYW50KCkpOwotCQl0aGlzLnNldERlZmF1bHRUeXBlKHRoaXMuYnVpbGREZWZhdWx0VHlwZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0SW5jbHVkZUNyaXRlcmlhKHRoaXMuYnVpbGREZWZhdWx0SW5jbHVkZUNyaXRlcmlhKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQWxsb3dlZCh0aGlzLmJ1aWxkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNBbGxvd2VkKCkpOwotCQl0aGlzLnVwZGF0ZURlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtdWx0aXRlbmFudCAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc011bHRpdGVuYW50KCkgewotCQlyZXR1cm4gdGhpcy5pc1NwZWNpZmllZE11bHRpdGVuYW50KCkgfHwgdGhpcy5pc0RlZmF1bHRNdWx0aXRlbmFudCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE11bHRpdGVuYW50KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0TXVsdGl0ZW5hbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE11bHRpdGVuYW50KGJvb2xlYW4gZGVmYXVsdE11bHRpdGVuYW50KSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZWZhdWx0TXVsdGl0ZW5hbnQ7Ci0JCXRoaXMuZGVmYXVsdE11bHRpdGVuYW50ID0gZGVmYXVsdE11bHRpdGVuYW50OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9NVUxUSVRFTkFOVF9QUk9QRVJUWSwgb2xkLCBkZWZhdWx0TXVsdGl0ZW5hbnQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVmYXVsdE11bHRpdGVuYW50KCkgewotCQlyZXR1cm4gdGhpcy5pc011bHRpdGVuYW50SW5oZXJpdGFuY2VIaWVyYXJjaHkoKSB8fCB0aGlzLmlzU3VwZXJNYXBwZWRTdXBlcmNsYXNzTXVsdGl0ZW5hbnQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZE11bHRpdGVuYW50KCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRNdWx0aXRlbmFudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRNdWx0aXRlbmFudChib29sZWFuIGlzTXVsdGl0ZW5hbnQpIHsKLQkJaWYgKGlzTXVsdGl0ZW5hbnQpIHsKLQkJCWlmIChnZXRNdWx0aXRlbmFudEFubm90YXRpb24oKS5pc1NwZWNpZmllZCgpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTXVsdGl0ZW5hbnQgYW5ub3RhdGlvbiBhbHJlYWR5IHNwZWNpZmllZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aGlzLmFkZE11bHRpdGVuYW50QW5ub3RhdGlvbigpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKCFnZXRNdWx0aXRlbmFudEFubm90YXRpb24oKS5pc1NwZWNpZmllZCgpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTXVsdGl0ZW5hbnQgYW5ub3RhdGlvbiBkb2VzIG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aGlzLnJlbW92ZU11bHRpdGVuYW50QW5ub3RhdGlvbigpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkJZm9yIChpbnQgaSA9IHRoaXMuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCk7IGktLSA+IDA7ICkgewotCQkJCXRoaXMucmVtb3ZlU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihpKTsKLQkJCX0KLQkJfQotCQl0aGlzLnNldFNwZWNpZmllZE11bHRpdGVuYW50Xyhpc011bHRpdGVuYW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRNdWx0aXRlbmFudF8oYm9vbGVhbiBpc011bHRpdGVuYW50KSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRNdWx0aXRlbmFudDsKLQkJdGhpcy5zcGVjaWZpZWRNdWx0aXRlbmFudCA9IGlzTXVsdGl0ZW5hbnQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTVVMVElURU5BTlRfUFJPUEVSVFksIG9sZCwgaXNNdWx0aXRlbmFudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zIGdldFR5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRUeXBlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRUeXBlIDogdGhpcy5nZXREZWZhdWx0VHlwZSgpOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMyBnZXRTcGVjaWZpZWRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMgdHlwZSkgewotCQl0aGlzLmdldE11bHRpdGVuYW50QW5ub3RhdGlvbigpLnNldFZhbHVlKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLnRvSmF2YVJlc291cmNlTW9kZWwodHlwZSkpOwotCQl0aGlzLnNldFNwZWNpZmllZFR5cGVfKHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFR5cGVfKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zIHR5cGUpIHsKLQkJRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMgb2xkID0gdGhpcy5zcGVjaWZpZWRUeXBlOwotCQl0aGlzLnNwZWNpZmllZFR5cGUgPSB0eXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1RZUEVfUFJPUEVSVFksIG9sZCwgdHlwZSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zIGdldERlZmF1bHRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VHlwZShFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMyB0eXBlKSB7Ci0JCUVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zIG9sZCA9IHRoaXMuZGVmYXVsdFR5cGU7Ci0JCXRoaXMuZGVmYXVsdFR5cGUgPSB0eXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9UWVBFX1BST1BFUlRZLCBvbGQsIHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMyBidWlsZERlZmF1bHRUeXBlKCkgewotCQlpZiAoIWlzTXVsdGl0ZW5hbnQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGlzU3BlY2lmaWVkTXVsdGl0ZW5hbnQoKSkgewotCQkJcmV0dXJuIERFRkFVTFRfVFlQRTsKLQkJfQotCQlpZiAodGhpcy5pc011bHRpdGVuYW50SW5oZXJpdGFuY2VIaWVyYXJjaHkoKSkgewotCQkJcmV0dXJuIGdldFJvb3RFbnRpdHkoKS5nZXRNdWx0aXRlbmFuY3koKS5nZXRUeXBlKCk7Ci0JCX0KLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIHN1cGVyTWFwcGVkU3VwZXJjbGFzcyA9IGdldFN1cGVyTWFwcGVkU3VwZXJjbGFzcygpOwotCQlyZXR1cm4gc3VwZXJNYXBwZWRTdXBlcmNsYXNzICE9IG51bGwgPyBzdXBlck1hcHBlZFN1cGVyY2xhc3MuZ2V0TXVsdGl0ZW5hbmN5KCkuZ2V0VHlwZSgpIDogREVGQVVMVF9UWVBFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmNsdWRlIGNyaXRlcmlhICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzSW5jbHVkZUNyaXRlcmlhKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmlzRGVmYXVsdEluY2x1ZGVDcml0ZXJpYSgpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYShCb29sZWFuIGluY2x1ZGVDcml0ZXJpYSkgewotCQl0aGlzLmdldE11bHRpdGVuYW50QW5ub3RhdGlvbigpLnNldEluY2x1ZGVDcml0ZXJpYShpbmNsdWRlQ3JpdGVyaWEpOwotCQl0aGlzLnNldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYV8oaW5jbHVkZUNyaXRlcmlhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWFfKEJvb2xlYW4gaW5jbHVkZUNyaXRlcmlhKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWE7Ci0JCXRoaXMuc3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhID0gaW5jbHVkZUNyaXRlcmlhOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0lOQ0xVREVfQ1JJVEVSSUFfUFJPUEVSVFksIG9sZCwgaW5jbHVkZUNyaXRlcmlhKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRJbmNsdWRlQ3JpdGVyaWEoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRJbmNsdWRlQ3JpdGVyaWE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEluY2x1ZGVDcml0ZXJpYShib29sZWFuIGluY2x1ZGVDcml0ZXJpYSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuZGVmYXVsdEluY2x1ZGVDcml0ZXJpYTsKLQkJdGhpcy5kZWZhdWx0SW5jbHVkZUNyaXRlcmlhID0gaW5jbHVkZUNyaXRlcmlhOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9JTkNMVURFX0NSSVRFUklBX1BST1BFUlRZLCBvbGQsIGluY2x1ZGVDcml0ZXJpYSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGREZWZhdWx0SW5jbHVkZUNyaXRlcmlhKCkgewotCQlpZiAoZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlZQRCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBERUZBVUxUX0lOQ0xVREVfQ1JJVEVSSUE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxKYXZhUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSA/Ci0JCQl0aGlzLmdldFJlYWRPbmx5U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSA6IAotCQkJdGhpcy5nZXRSZWFkT25seURlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5oYXNTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpID8KLQkJCXRoaXMuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkgOiAKLQkJCXRoaXMuZ2V0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEphdmFUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBnZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEphdmFSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGdldFJlYWRPbmx5U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyPEphdmFSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+KHRoaXMuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1NwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSAhPSAwOwotCX0KLQotCXB1YmxpYyBKYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBhZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKHRoaXMuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyBKYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBhZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKGludCBpbmRleCkgewotCQlFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zIGFubm90YXRpb24gPSB0aGlzLmFkZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKGluZGV4KTsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4pIHsKLQkJdGhpcy5yZW1vdmVTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKHRoaXMuc3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoKEphdmFUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zKSB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihpbnQgaW5kZXgpIHsKLQkJdGhpcy5yZW1vdmVUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbihpbmRleCk7Ci0JCXRoaXMuc3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5tb3ZlVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5zcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyLm1vdmVDb250ZXh0RWxlbWVudCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBidWlsZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyBkaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rSmF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzModGhpcywgdGhpcy50ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uT3duZXIsIGRpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyBidWlsZE51bGxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBOdWxsRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyh0aGlzLmdldEphdmFSZXNvdXJjZVR5cGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY1NwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkgewotCQl0aGlzLnNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMywgRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMz4gYnVpbGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyKCkgewotCQlTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuT3duZXIgYnVpbGRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbk93bmVyKCk7Ci0JfQotCi0JLyoqCi0JICogc3BlY2lmaWVkIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbiBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLCBFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFNQRUNJRklFRF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBidWlsZENvbnRleHRFbGVtZW50KEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMgcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5SW1wbDJfMy50aGlzLmJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihyZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzM+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5SW1wbDJfMy50aGlzLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9ucygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyBnZXRSZXNvdXJjZUVsZW1lbnQoSmF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8SmF2YVZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBnZXREZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8SmF2YVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZ2V0UmVhZE9ubHlEZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyPEphdmFSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+KHRoaXMuZ2V0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFyRGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkgewotCQl0aGlzLmRlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyLmNsZWFyQ29udGV4dExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGVyZSBhcmUgYW55IHNwZWNpZmllZCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zLCB0aGVuIHRoZXJlIGFyZSBubyBkZWZhdWx0Ci0JICogdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucy4KLQkgKiBAc2VlICNnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0ZvckRlZmF1bHRzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXRoaXMuZGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIudXBkYXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFWaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMywgUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBidWlsZERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFWaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBidWlsZFZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtKYXZhVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzModGhpcywgdGhpcy50ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uT3duZXIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0ZvckRlZmF1bHRzKCkgewotCQlpZiAodGhpcy5nZXRUeXBlKCkgPT0gbnVsbCB8fCB0aGlzLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5UQUJMRV9QRVJfVEVOQU5UKSB7Ci0JCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJfQotCQlpZiAodGhpcy5pc011bHRpdGVuYW50SW5oZXJpdGFuY2VIaWVyYXJjaHkoKSkgewotCQkJcmV0dXJuIG5ldyBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPih0aGlzLmdldFJvb3RFbnRpdHkoKS5nZXRNdWx0aXRlbmFuY3koKS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpKTsKLQkJfQotCQlpZiAoIXRoaXMuaXNTcGVjaWZpZWRNdWx0aXRlbmFudCgpKSB7Ci0JCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgc3VwZXJNYXBwZWRTdXBlcmNsYXNzID0gdGhpcy5nZXRTdXBlck1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJCWlmIChzdXBlck1hcHBlZFN1cGVyY2xhc3MgIT0gbnVsbCAmJiBzdXBlck1hcHBlZFN1cGVyY2xhc3MuZ2V0TXVsdGl0ZW5hbmN5KCkuaXNNdWx0aXRlbmFudCgpKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPihzdXBlck1hcHBlZFN1cGVyY2xhc3MuZ2V0TXVsdGl0ZW5hbmN5KCkuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkgPT0gMCkgewotCQkJTGlzdEl0ZXJhYmxlPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gY29udGV4dENvbHVtbnMgPSB0aGlzLmdldENvbnRleHREZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKTsKLQkJCWlmIChDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShjb250ZXh0Q29sdW1ucykpIHsKLQkJCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPih0aGlzLmRlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKTsKLQkJCX0KLQkJCXJldHVybiBjb250ZXh0Q29sdW1uczsKLQkJfQotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZ2V0Q29udGV4dERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpIHsKLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IHRoaXMuZ2V0RWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncygpOwotCQlyZXR1cm4gKGVudGl0eU1hcHBpbmdzICE9IG51bGwpID8gZW50aXR5TWFwcGluZ3MuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSA6IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNBbGxvd2VkKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0FsbG93ZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNBbGxvd2VkKGJvb2xlYW4gYWxsb3dlZCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNBbGxvd2VkOwotCQl0aGlzLnNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQWxsb3dlZCA9IGFsbG93ZWQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OU19BTExPV0VEX1BST1BFUlRZLCBvbGQsIGFsbG93ZWQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNBbGxvd2VkKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKS5pc011bHRpdGVuYW50TWV0YWRhdGFBbGxvd2VkKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBkZWZhdWx0IHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbiBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMsIFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4KLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBERUZBVUxUX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlNfTElTVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEphdmFWaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBidWlsZENvbnRleHRFbGVtZW50KFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBKYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3lJbXBsMl8zLnRoaXMuYnVpbGRWaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihyZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBKYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3lJbXBsMl8zLnRoaXMuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNGb3JEZWZhdWx0cygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGdldFJlc291cmNlRWxlbWVudChKYXZhVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRPdmVycmlkZGVuQ29sdW1uKCk7Ci0JCX0KLQl9Ci0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uLk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uT3duZXIgCi0JCWltcGxlbWVudHMgSmF2YVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5Pd25lcgotCXsKLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb250ZXh0UHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5ERUZBVUxUX0NPTlRFWFRfUFJPUEVSVFk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0UHJpbWFyeUtleSgpIHsKLQkJCXJldHVybiBSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuREVGQVVMVF9QUklNQVJZX0tFWTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdExlbmd0aCgpIHsKLQkJCXJldHVybiBSZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSDsKLQkJfQotCi0JCXB1YmxpYyBEaXNjcmltaW5hdG9yVHlwZSBnZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSB7Ci0JCQlyZXR1cm4gUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9ESVNDUklNSU5BVE9SX1RZUEU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5VGFibGVOYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uKSB7Ci0JCQlyZXR1cm4gUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLkRFRkFVTFRfTkFNRTsKLQkJfQotCi0JCXB1YmxpYyBUYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldEFsbEFzc29jaWF0ZWRUYWJsZU5hbWVzKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uLCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5WYWxpZGF0b3IyXzMoKFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMykgY29sdW1uLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JCX0KLQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCXJldHVybiBKYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3lJbXBsMl8zLnRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtdWx0aXRlbmFudCBhbm5vdGF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMyBhZGRNdWx0aXRlbmFudEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMpIHRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmFkZEFubm90YXRpb24odGhpcy5nZXRNdWx0aXRlbmFudEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU11bHRpdGVuYW50QW5ub3RhdGlvbigpIHsKLQkJdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkucmVtb3ZlQW5ub3RhdGlvbih0aGlzLmdldE11bHRpdGVuYW50QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zIGdldE11bHRpdGVuYW50QW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMykgdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0Tm9uTnVsbEFubm90YXRpb24odGhpcy5nZXRNdWx0aXRlbmFudEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0TXVsdGl0ZW5hbnRBbm5vdGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldE11bHRpdGVuYW50QW5ub3RhdGlvbigpLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc011bHRpdGVuYW50QW5ub3RhdGlvblNwZWNpZmllZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TXVsdGl0ZW5hbnRBbm5vdGF0aW9uKCkuaXNTcGVjaWZpZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpdGVuYW50QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMy5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbiBhbm5vdGF0aW9ucyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzM+IGdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25zXygpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8RWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMz4gZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25zXygpIHsKLQkJcmV0dXJuIG5ldyBTdWJMaXN0SXRlcmFibGVXcmFwcGVyPE5lc3RhYmxlQW5ub3RhdGlvbiwgRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMz4odGhpcy5nZXROZXN0YWJsZVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uc18oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+IGdldE5lc3RhYmxlVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25zXygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb25zKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyBhZGRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zKSB0aGlzLmdldEphdmFSZXNvdXJjZVR5cGUoKS5hZGRBbm5vdGF0aW9uKGluZGV4LCBFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24oaW50IGluZGV4KSB7Ci0JCXRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpLnJlbW92ZUFubm90YXRpb24oaW5kZXgsIEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkubW92ZUFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZVR5cGUgZ2V0SmF2YVJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZ2V0RWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncygpIHsKLQkJTWFwcGluZ0ZpbGVSb290IG1mUm9vdCA9IHN1cGVyLmdldE1hcHBpbmdGaWxlUm9vdCgpOwotCQlpZiAobWZSb290IGluc3RhbmNlb2YgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncykgewotCQkJcmV0dXJuIChFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzKSBtZlJvb3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNNdWx0aXRlbmFudEluaGVyaXRhbmNlSGllcmFyY2h5KCkgewotCQlpZiAodGhpcy5pc0luaGVyaXRhbmNlU3RyYXRlZ3lUYWJsZVBlckNsYXNzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5pc1Jvb3RFbnRpdHlNdWx0aXRlbmFudCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSW5oZXJpdGFuY2VTdHJhdGVneVRhYmxlUGVyQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpLmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSA9PSBJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUm9vdEVudGl0eU11bHRpdGVuYW50KCkgewotCQlFY2xpcHNlTGlua0VudGl0eSByb290RW50aXR5ID0gdGhpcy5nZXRSb290RW50aXR5KCk7Ci0JCXJldHVybiByb290RW50aXR5ICE9IG51bGwgJiYgcm9vdEVudGl0eSAhPSBnZXRQYXJlbnQoKSAmJiByb290RW50aXR5LmdldE11bHRpdGVuYW5jeSgpLmlzTXVsdGl0ZW5hbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFbnRpdHkgZ2V0Um9vdEVudGl0eSgpIHsKLQkJLy9pbnN0YW5jZW9mIGNoZWNrIGluIGNhc2UgdGhlIHJvb3RFbnRpdHkgaXMgaW4gYW4gb3JtLnhtbCBpbnN0ZWFkIG9mIGFuIGVjbGlwc2VsaW5rb3JtLnhtbCBmaWxlLgotCQlFbnRpdHkgZW50aXR5ID0gZ2V0UGFyZW50KCkuZ2V0Um9vdEVudGl0eSgpOwotCQlyZXR1cm4gZW50aXR5IGluc3RhbmNlb2YgRWNsaXBzZUxpbmtFbnRpdHkgPyAoRWNsaXBzZUxpbmtFbnRpdHkpIGVudGl0eSA6IG51bGw7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1cGVyTWFwcGVkU3VwZXJjbGFzc011bHRpdGVuYW50KCkgewotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IHRoaXMuZ2V0U3VwZXJNYXBwZWRTdXBlcmNsYXNzKGdldFBhcmVudCgpKTsKLQkJcmV0dXJuIG1hcHBlZFN1cGVyY2xhc3MgIT0gbnVsbCAmJiBtYXBwZWRTdXBlcmNsYXNzLmdldE11bHRpdGVuYW5jeSgpLmlzTXVsdGl0ZW5hbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIGdldFN1cGVyTWFwcGVkU3VwZXJjbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3VwZXJNYXBwZWRTdXBlcmNsYXNzKHRoaXMuZ2V0UGFyZW50KCkpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgZ2V0U3VwZXJNYXBwZWRTdXBlcmNsYXNzKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCVR5cGVNYXBwaW5nIHN1cGVyVHlwZU1hcHBpbmcgPSB0eXBlTWFwcGluZy5nZXRTdXBlclR5cGVNYXBwaW5nKCk7Ci0JCWlmIChzdXBlclR5cGVNYXBwaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCS8vaW5zdGFuY2VvZiBjaGVjayBpbiBjYXNlIHRoZSBtYXBwZWQgc3VwZXJjbGFzcyBpcyBpbiBhbiBvcm0ueG1sIGluc3RlYWQgb2YgYW4gZWNsaXBzZWxpbmtvcm0ueG1sIGZpbGUuCi0JCWlmIChzdXBlclR5cGVNYXBwaW5nIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSB7Ci0JCQlyZXR1cm4gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgc3VwZXJUeXBlTWFwcGluZzsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRTdXBlck1hcHBlZFN1cGVyY2xhc3Moc3VwZXJUeXBlTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdXNlc1ByaW1hcnlLZXlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpIHsKLQkJZm9yIChSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgY29sdW1uIDogZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSkgewotCQkJaWYgKGNvbHVtbi5pc1ByaW1hcnlLZXkoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEphdmEgY29tcGxldGlvbiBwcm9wb3NhbHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWZvciAoSmF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbiA6IHRoaXMuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSkgewotCQkJcmVzdWx0ID0gdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbi5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJaWYgKGdldFNwZWNpZmllZFR5cGUoKSA9PSBFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5UQUJMRV9QRVJfVEVOQU5UKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5NVUxUSVRFTkFOVF9UQUJMRV9QRVJfVEVOQU5UX05PVF9TVVBQT1JURUQsCi0JCQkJCUVNUFRZX1NUUklOR19BUlJBWSwKLQkJCQkJdGhpcywKLQkJCQkJdGhpcy5nZXRNdWx0aXRlbmFudEFubm90YXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCQkpCi0JCQkpOwkJCQotCQl9Ci0JCWlmIChnZXRTcGVjaWZpZWRUeXBlKCkgPT0gRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuVlBEKSB7Ci0JCQlTdHJpbmcgdGFyZ2V0RGF0YWJhc2UgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRPcHRpb25zKCkuZ2V0VGFyZ2V0RGF0YWJhc2UoKTsKLQkJCWlmICh0YXJnZXREYXRhYmFzZSA9PSBudWxsKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLAotCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTVVMVElURU5BTlRfVlBEX01JR0hUX05PVF9CRV9OT1RfU1VQUE9SVEVELAotCQkJCQkJRU1QVFlfU1RSSU5HX0FSUkFZLAotCQkJCQkJdGhpcywKLQkJCQkJCXRoaXMuZ2V0TXVsdGl0ZW5hbnRBbm5vdGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJCSkKLQkJCQkpOwotCQkJfQotCQkJZWxzZSBpZiAoIVRhcmdldERhdGFiYXNlLmlzT3JhY2xlRGF0YWJhc2UodGFyZ2V0RGF0YWJhc2UpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTVVMVElURU5BTlRfVlBEX05PVF9TVVBQT1JURURfT05fTk9OX09SQUNMRV9EQVRBQkFTRV9QTEFURk9STSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7dGFyZ2V0RGF0YWJhc2V9LAotCQkJCQkJdGhpcywKLQkJCQkJCXRoaXMuZ2V0TXVsdGl0ZW5hbnRBbm5vdGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJCSkKLQkJCQkpOwotCQkJfQotCQl9Ci0JCWlmICh0aGlzLmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpID4gMCkgewotCQkJaWYgKCF0aGlzLnNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQWxsb3dlZCgpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTVVMVElURU5BTlRfTUVUQURBVEFfQ0FOTk9UX0JFX1NQRUNJRklFRF9PTl9OT05fUk9PVF9FTlRJVFksCi0JCQkJCQlFTVBUWV9TVFJJTkdfQVJSQVksCi0JCQkJCQl0aGlzLAotCQkJCQkJdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0VGV4dFJhbmdlKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FLCBhc3RSb290KQotCQkJCQkpCi0JCQkJKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRoaXMuaXNNdWx0aXRlbmFudEFubm90YXRpb25TcGVjaWZpZWQoKSkgewotCQkJCWZvciAoSmF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgY29sdW1uIDogdGhpcy5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpKSB7Ci0JCQkJCWNvbHVtbi52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKLQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1VTFRJVEVOQU5UX05PVF9TUEVDSUZJRURfV0lUSF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TLAotCQkJCQkJRU1QVFlfU1RSSU5HX0FSUkFZLAotCQkJCQkJdGhpcywKLQkJCQkJCXRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldFRleHRSYW5nZShFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSwgYXN0Um9vdCkKLQkJCQkJKQotCQkJCSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRoaXMuc3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNBbGxvd2VkKCkpIHsKLQkJCS8vYnVnIDM2MDczMSBubyBuZWVkIHRvIHZhbGlkYXRlLCB0aGV5IHdpbGwgYmUgdmFsaWRhdGVkIHdoZXJlIHRoZXkgYXJlIHNwZWNpZmllZCAKLQkJCWZvciAoSmF2YVZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGNvbHVtbiA6IHRoaXMuZ2V0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkpIHsKLQkJCQljb2x1bW4udmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCX0KLQkJfQotCQlpZiAodGhpcy5nZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoKSA9PSBCb29sZWFuLlRSVUUgJiYgZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlZQRCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKLQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTVVMVElURU5BTlRfVlBEX0lOQ0xVREVfQ1JJVEVSSUFfV0lMTF9CRV9JR05PUkVELAotCQkJCQlFTVBUWV9TVFJJTkdfQVJSQVksCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0TXVsdGl0ZW5hbnRBbm5vdGF0aW9uKCkuZ2V0SW5jbHVkZUNyaXRlcmlhVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJKQotCQkJKTsJCQkKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRNdWx0aXRlbmFudEFubm90YXRpb24oKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua011dGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNdXRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YmMxZGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua011dGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rTXV0YWJsZQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rTXV0YWJsZQotewotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZE11dGFibGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdE11dGFibGU7Ci0KLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtNdXRhYmxlKEphdmFBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnNwZWNpZmllZE11dGFibGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkTXV0YWJsZSgpOwotCQkvL2J1aWxkIGRlZmF1bHRzIGR1cmluZyBjb25zdHJ1Y3Rpb24gZm9yIHBlcmZvcm1hbmNlCi0JCXRoaXMuZGVmYXVsdE11dGFibGUgPSB0aGlzLmJ1aWxkRGVmYXVsdE11dGFibGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRNdXRhYmxlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkTXV0YWJsZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHRNdXRhYmxlKHRoaXMuYnVpbGREZWZhdWx0TXV0YWJsZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbXV0YWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc011dGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRNdXRhYmxlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRNdXRhYmxlLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5kZWZhdWx0TXV0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRNdXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRNdXRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbiBtdXRhYmxlKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudChtdXRhYmxlLCB0aGlzLnNwZWNpZmllZE11dGFibGUpKSB7Ci0JCQlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldE11dGFibGVBbm5vdGF0aW9uKCk7Ci0JCQlpZiAobXV0YWJsZSA9PSBudWxsKSB7Ci0JCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQl0aGlzLnJlbW92ZU11dGFibGVBbm5vdGF0aW9uKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCWFubm90YXRpb24gPSB0aGlzLmFkZE11dGFibGVBbm5vdGF0aW9uKCk7Ci0JCQkJfQotCQkJCUJvb2xlYW4gYW5ub3RhdGlvblZhbHVlID0gYW5ub3RhdGlvbi5nZXRWYWx1ZSgpOwotCQkJCWJvb2xlYW4gYW5ub3RhdGlvbkJvb2xlYW5WYWx1ZSA9IChhbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgPyB0cnVlIDogYW5ub3RhdGlvblZhbHVlLmJvb2xlYW5WYWx1ZSgpOwotCQkJCWlmIChhbm5vdGF0aW9uQm9vbGVhblZhbHVlICE9IG11dGFibGUuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShtdXRhYmxlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXRoaXMuc2V0U3BlY2lmaWVkTXV0YWJsZV8obXV0YWJsZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRNdXRhYmxlXyhCb29sZWFuIG11dGFibGUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZE11dGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkTXV0YWJsZSA9IG11dGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTVVUQUJMRV9QUk9QRVJUWSwgb2xkLCBtdXRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZE11dGFibGUoKSB7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0TXV0YWJsZUFubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBATXV0YWJsZSBpcyBlcXVpdmFsZW50IHRvIEBNdXRhYmxlKHRydWUpCi0JCUJvb2xlYW4gYW5ub3RhdGlvblZhbHVlID0gYW5ub3RhdGlvbi5nZXRWYWx1ZSgpOwotCQlyZXR1cm4gKGFubm90YXRpb25WYWx1ZSA9PSBudWxsKSA/IEJvb2xlYW4uVFJVRSA6IGFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRNdXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0TXV0YWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0TXV0YWJsZShib29sZWFuIG11dGFibGUpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRlZmF1bHRNdXRhYmxlOwotCQl0aGlzLmRlZmF1bHRNdXRhYmxlID0gbXV0YWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfTVVUQUJMRV9QUk9QRVJUWSwgb2xkLCBtdXRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERlZmF1bHRNdXRhYmxlKCkgewotCQlKYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFBdHRyaWJ1dGUgPSB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJaWYgKGphdmFBdHRyaWJ1dGUudHlwZUlzRGF0ZU9yQ2FsZW5kYXIoKSkgewotCQkJQm9vbGVhbiBwdVRlbXBvcmFsTXV0YWJsZSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLmdldFRlbXBvcmFsTXV0YWJsZSgpOwotCQkJcmV0dXJuIChwdVRlbXBvcmFsTXV0YWJsZSA9PSBudWxsKSA/IGZhbHNlIDogcHVUZW1wb3JhbE11dGFibGUuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGphdmFBdHRyaWJ1dGUudHlwZUlzU2VyaWFsaXphYmxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG11dGFibGUgYW5ub3RhdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiBnZXRNdXRhYmxlQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbih0aGlzLmdldE11dGFibGVBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiBhZGRNdXRhYmxlQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbih0aGlzLmdldE11dGFibGVBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNdXRhYmxlQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24odGhpcy5nZXRNdXRhYmxlQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdXRhYmxlQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFBdHRyaWJ1dGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgZ2V0QXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIChKYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlKSB0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldEFubm90YXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEFubm90YXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRNdXRhYmxlQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogYW5ub3RhdGlvbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZTE5OWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhTmFtZWRDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuT2JqZWN0VHlwZUNvbnZlcnRlcjwvY29kZT4KLSAqLwotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIKLQlleHRlbmRzIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyCi17Ci0JcHJpdmF0ZSBTdHJpbmcgZGF0YVR5cGU7Ci0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWREYXRhVHlwZTsKLQotCXByaXZhdGUgU3RyaW5nIG9iamVjdFR5cGU7Ci0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlOwotCi0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSwgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBjb252ZXJzaW9uVmFsdWVDb250YWluZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWU7Ci0KLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBwYXJlbnQsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGNvbnZlcnRlckFubm90YXRpb24pOwotCQl0aGlzLmRhdGFUeXBlID0gY29udmVydGVyQW5ub3RhdGlvbi5nZXREYXRhVHlwZSgpOwotCQl0aGlzLm9iamVjdFR5cGUgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE9iamVjdFR5cGUoKTsKLQkJdGhpcy5jb252ZXJzaW9uVmFsdWVDb250YWluZXIgPSB0aGlzLmJ1aWxkQ29udmVyc2lvblZhbHVlQ29udGFpbmVyKCk7Ci0JCXRoaXMuZGVmYXVsdE9iamVjdFZhbHVlID0gY29udmVydGVyQW5ub3RhdGlvbi5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXREYXRhVHlwZV8odGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uLmdldERhdGFUeXBlKCkpOwotCQl0aGlzLnNldE9iamVjdFR5cGVfKHRoaXMuY29udmVydGVyQW5ub3RhdGlvbi5nZXRPYmplY3RUeXBlKCkpOwotCQl0aGlzLnN5bmNDb252ZXJzaW9uVmFsdWVzKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdE9iamVjdFZhbHVlXyh0aGlzLmNvbnZlcnRlckFubm90YXRpb24uZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RnVsbHlRdWFsaWZpZWREYXRhVHlwZSh0aGlzLmNvbnZlcnRlckFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWREYXRhVHlwZSgpKTsKLQkJdGhpcy5zZXRGdWxseVF1YWxpZmllZE9iamVjdFR5cGUodGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSgpKTsKLQkJdGhpcy51cGRhdGVOb2Rlcyh0aGlzLmdldENvbnZlcnNpb25WYWx1ZXMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRhdGEgdHlwZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREYXRhVHlwZShTdHJpbmcgZGF0YVR5cGUpIHsKLQkJdGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uLnNldERhdGFUeXBlKGRhdGFUeXBlKTsKLQkJdGhpcy5zZXREYXRhVHlwZV8oZGF0YVR5cGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERhdGFUeXBlXyhTdHJpbmcgZGF0YVR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGF0YVR5cGU7Ci0JCXRoaXMuZGF0YVR5cGUgPSBkYXRhVHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVFlQRV9QUk9QRVJUWSwgb2xkLCBkYXRhVHlwZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZ1bGx5IHF1YWxpZmllZCBkYXRhIHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZERhdGFUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5mdWxseVF1YWxpZmllZERhdGFUeXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUoU3RyaW5nIGRhdGFUeXBlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmZ1bGx5UXVhbGlmaWVkRGF0YVR5cGU7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWREYXRhVHlwZSA9IGRhdGFUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRlVMTFlfUVVBTElGSUVEX0RBVEFfVFlQRV9QUk9QRVJUWSwgb2xkLCBkYXRhVHlwZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG9iamVjdCB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlKFN0cmluZyBvYmplY3RUeXBlKSB7Ci0JCXRoaXMuY29udmVydGVyQW5ub3RhdGlvbi5zZXRPYmplY3RUeXBlKG9iamVjdFR5cGUpOwotCQl0aGlzLnNldE9iamVjdFR5cGVfKG9iamVjdFR5cGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE9iamVjdFR5cGVfKFN0cmluZyBvYmplY3RUeXBlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm9iamVjdFR5cGU7Ci0JCXRoaXMub2JqZWN0VHlwZSA9IG9iamVjdFR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPQkpFQ1RfVFlQRV9QUk9QRVJUWSwgb2xkLCBvYmplY3RUeXBlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZnVsbHkgcXVhbGlmaWVkIG9iamVjdCB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5mdWxseVF1YWxpZmllZE9iamVjdFR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKFN0cmluZyBvYmplY3RUeXBlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZE9iamVjdFR5cGUgPSBvYmplY3RUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRlVMTFlfUVVBTElGSUVEX09CSkVDVF9UWVBFX1BST1BFUlRZLCBvbGQsIG9iamVjdFR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJzaW9uIHZhbHVlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gZ2V0Q29udmVyc2lvblZhbHVlcygpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVyc2lvblZhbHVlQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q29udmVyc2lvblZhbHVlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnNpb25WYWx1ZUNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHNTaXplKCk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGdldENvbnZlcnNpb25WYWx1ZShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVyc2lvblZhbHVlQ29udGFpbmVyLmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBhZGRDb252ZXJzaW9uVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmFkZENvbnZlcnNpb25WYWx1ZSh0aGlzLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgYWRkQ29udmVyc2lvblZhbHVlKGludCBpbmRleCkgewotCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuY29udmVydGVyQW5ub3RhdGlvbi5hZGRDb252ZXJzaW9uVmFsdWUoaW5kZXgpOwotCQlyZXR1cm4gdGhpcy5jb252ZXJzaW9uVmFsdWVDb250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIGFubm90YXRpb24pOwotCX0KLSAgCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29udmVyc2lvblZhbHVlKEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSkgewotCQl0aGlzLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSh0aGlzLmNvbnZlcnNpb25WYWx1ZUNvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoKEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSkgY29udmVyc2lvblZhbHVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29udmVyc2lvblZhbHVlKGludCBpbmRleCkgewotCQl0aGlzLmNvbnZlcnRlckFubm90YXRpb24ucmVtb3ZlQ29udmVyc2lvblZhbHVlKGluZGV4KTsKLQkJdGhpcy5jb252ZXJzaW9uVmFsdWVDb250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVDb252ZXJzaW9uVmFsdWUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uLm1vdmVDb252ZXJzaW9uVmFsdWUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5jb252ZXJzaW9uVmFsdWVDb250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBidWlsZENvbnZlcnNpb25WYWx1ZShFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gY29udmVyc2lvblZhbHVlQW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSh0aGlzLCBjb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY0NvbnZlcnNpb25WYWx1ZXMoKSB7Ci0JCXRoaXMuY29udmVyc2lvblZhbHVlQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gZ2V0Q29udmVyc2lvblZhbHVlQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVyc2lvblZhbHVlcygpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUsIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gYnVpbGRDb252ZXJzaW9uVmFsdWVDb250YWluZXIoKSB7Ci0JCUNvbnZlcnNpb25WYWx1ZUNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgQ29udmVyc2lvblZhbHVlQ29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogY29udmVyc2lvbiB2YWx1ZSBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgQ29udmVyc2lvblZhbHVlQ29udGFpbmVyCi0JCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSwgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiB7Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gQ09OVkVSU0lPTl9WQUxVRVNfTElTVDsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgYnVpbGRDb250ZXh0RWxlbWVudChFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci50aGlzLmJ1aWxkQ29udmVyc2lvblZhbHVlKHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLnRoaXMuZ2V0Q29udmVyc2lvblZhbHVlQW5ub3RhdGlvbnMoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gZ2V0UmVzb3VyY2VFbGVtZW50KEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldENvbnZlcnNpb25WYWx1ZUFubm90YXRpb24oKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBkYXRhIHZhbHVlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXREYXRhVmFsdWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlLCBTdHJpbmc+KHRoaXMuZ2V0Q29udmVyc2lvblZhbHVlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUpIHsKLQkJCQlyZXR1cm4gY29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RGF0YVZhbHVlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgb2JqZWN0IHZhbHVlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE9iamVjdFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLmNvbnZlcnRlckFubm90YXRpb24uc2V0RGVmYXVsdE9iamVjdFZhbHVlKHZhbHVlKTsKLQkJdGhpcy5zZXREZWZhdWx0T2JqZWN0VmFsdWVfKHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0T2JqZWN0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWU7Ci0JCXRoaXMuZGVmYXVsdE9iamVjdFZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX09CSkVDVF9WQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIENsYXNzPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzczsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmNoZWNrRm9yRHVwbGljYXRlRGF0YVZhbHVlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCWZvciAoSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSA6IHRoaXMuZ2V0Q29udmVyc2lvblZhbHVlcygpKSB7Ci0JCQljb252ZXJzaW9uVmFsdWUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrRm9yRHVwbGljYXRlRGF0YVZhbHVlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJZm9yIChBcnJheUxpc3Q8SmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBkdXBzIDogdGhpcy5tYXBDb252ZXJzaW9uVmFsdWVzQnlEYXRhVmFsdWUoKS52YWx1ZXMoKSkgewotCQkJaWYgKGR1cHMuc2l6ZSgpID4gMSkgewotCQkJCWZvciAoSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGR1cCA6IGR1cHMpIHsKLQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1VTFRJUExFX09CSkVDVF9WQUxVRVNfRk9SX0RBVEFfVkFMVUUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtkdXAuZ2V0RGF0YVZhbHVlKCl9LAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJZHVwLmdldERhdGFWYWx1ZVRleHRSYW5nZShhc3RSb290KQotCQkJCQkJKQotCQkJCQkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4+IG1hcENvbnZlcnNpb25WYWx1ZXNCeURhdGFWYWx1ZSgpIHsKLQkJSGFzaE1hcDxTdHJpbmcsIEFycmF5TGlzdDxKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFycmF5TGlzdDxKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+Pih0aGlzLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlmb3IgKEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUgOiB0aGlzLmdldENvbnZlcnNpb25WYWx1ZXMoKSkgewotCQkJU3RyaW5nIGRhdGFWYWx1ZSA9IGNvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKTsKLQkJCUFycmF5TGlzdDxKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGxpc3QgPSBtYXAuZ2V0KGRhdGFWYWx1ZSk7Ci0JCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQkJbGlzdCA9IG5ldyBBcnJheUxpc3Q8SmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPigpOwotCQkJCW1hcC5wdXQoZGF0YVZhbHVlLCBsaXN0KTsKLQkJCX0KLQkJCWxpc3QuYWRkKGNvbnZlcnNpb25WYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0VxdWl2YWxlbnRUbyhKcGFOYW1lZENvbnRleHROb2RlIG5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmlzRXF1aXZhbGVudFRvKG5vZGUpCi0JCQkJJiYgdGhpcy5pc0VxdWl2YWxlbnRUbygoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VxdWl2YWxlbnRUbyhFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLmZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSwgY29udmVydGVyLmdldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSgpKSAmJgotCQkJCVRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMuZnVsbHlRdWFsaWZpZWREYXRhVHlwZSwgY29udmVydGVyLmdldEZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUoKSkgJiYKLQkJCQlUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZSwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKSAmJgotCQkJCXRoaXMuY29udmVyc2lvblZhbHVlc0FyZUVxdWl2YWxlbnRUbyhjb252ZXJ0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbnZlcnNpb25WYWx1ZXNBcmVFcXVpdmFsZW50VG8oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlcikgewotCQkvLyBnZXQgZml4ZWQgbGlzdHMgb2YgdGhlIGNvbnZlcnNpb24gdmFsdWVzCi0JCUFycmF5TGlzdDxKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGNvbnZlcnNpb25WYWx1ZXMxID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5nZXRDb252ZXJzaW9uVmFsdWVzKCkpOwotCQlBcnJheUxpc3Q8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBjb252ZXJzaW9uVmFsdWVzMiA9IENvbGxlY3Rpb25Ub29scy5saXN0KGNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzKCkpOwotCQlpZiAoY29udmVyc2lvblZhbHVlczEuc2l6ZSgpICE9IGNvbnZlcnNpb25WYWx1ZXMyLnNpemUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udmVyc2lvblZhbHVlczEuc2l6ZSgpOyBpKyspIHsKLQkJCWlmICggISBjb252ZXJzaW9uVmFsdWVzMS5nZXQoaSkuaXNFcXVpdmFsZW50VG8oY29udmVyc2lvblZhbHVlczIuZ2V0KGkpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0YWRhdGEgY29udmVyc2lvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjb252ZXJ0VG8oT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udmVydGVyQ29udGFpbmVyKSB7Ci0JCW9ybUNvbnZlcnRlckNvbnRhaW5lci5hZGRPYmplY3RUeXBlQ29udmVydGVyKCkuY29udmVydEZyb20odGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVsZXRlKCkgewotCQl0aGlzLmdldFBhcmVudCgpLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZmMyYzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwaW5nUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ByaXZhdGVPd25lZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUNvbnZlcnRpYmxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhT25lVG9NYW55TWFwcGluZwotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wLCBFY2xpcHNlTGlua0phdmFDb252ZXJ0aWJsZU1hcHBpbmcKLXsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rSm9pbkZldGNoIGpvaW5GZXRjaDsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgcHJpdmF0ZU93bmVkOwotCQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgY29udmVydGVyQ29udGFpbmVyOwotCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5qb2luRmV0Y2ggPSBuZXcgSmF2YUVjbGlwc2VMaW5rSm9pbkZldGNoKHRoaXMpOwotCQl0aGlzLnByaXZhdGVPd25lZCA9IG5ldyBKYXZhRWNsaXBzZUxpbmtQcml2YXRlT3duZWQodGhpcyk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyID0gdGhpcy5idWlsZENvbnZlcnRlckNvbnRhaW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnByaXZhdGVPd25lZC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuam9pbkZldGNoLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMucHJpdmF0ZU93bmVkLnVwZGF0ZSgpOwotCQl0aGlzLmpvaW5GZXRjaC51cGRhdGUoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgb3duZWQgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIGdldFByaXZhdGVPd25lZCgpIHsKLQkJcmV0dXJuIHRoaXMucHJpdmF0ZU93bmVkOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIGZldGNoICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0pvaW5GZXRjaCBnZXRKb2luRmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5GZXRjaDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGdldENvbnZlcnRlckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbCh0aGlzKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBjb250YWluZXIgcGFyZW50IGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFKcGFDb250ZXh0Tm9kZSBnZXRDb252ZXJ0ZXJDb250YWluZXJQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzOyAgLy8gbm8gYWRhcHRlcgotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IGdldEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGFyZW50U3VwcG9ydHNDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlbGF0aW9uc2hpcCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwMl8wIGdldFJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXApIHN1cGVyLmdldFJlbGF0aW9uc2hpcCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhTWFwcGluZ1JlbGF0aW9uc2hpcCBidWlsZFJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5qb2luRmV0Y2gudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5wcml2YXRlT3duZWQudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNjg2NmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhQ29udmVydGlibGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0SmF2YU9uZVRvT25lTWFwcGluZwotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzAsIEVjbGlwc2VMaW5rSmF2YUNvbnZlcnRpYmxlTWFwcGluZwotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2ggam9pbkZldGNoOwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBwcml2YXRlT3duZWQ7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBjb252ZXJ0ZXJDb250YWluZXI7Ci0KLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuam9pbkZldGNoID0gbmV3IEphdmFFY2xpcHNlTGlua0pvaW5GZXRjaCh0aGlzKTsKLQkJdGhpcy5wcml2YXRlT3duZWQgPSBuZXcgSmF2YUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkKHRoaXMpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMucHJpdmF0ZU93bmVkLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5qb2luRmV0Y2guc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5wcml2YXRlT3duZWQudXBkYXRlKCk7Ci0JCXRoaXMuam9pbkZldGNoLnVwZGF0ZSgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJpdmF0ZSBvd25lZCAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgZ2V0UHJpdmF0ZU93bmVkKCkgewotCQlyZXR1cm4gdGhpcy5wcml2YXRlT3duZWQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gZmV0Y2ggKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rSm9pbkZldGNoIGdldEpvaW5GZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkZldGNoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXJzICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgZ2V0Q29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBidWlsZENvbnZlcnRlckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsKHRoaXMpOwotCX0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyIGNvbnRhaW5lciBwYXJlbnQgYWRhcHRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUpwYUNvbnRleHROb2RlIGdldENvbnZlcnRlckNvbnRhaW5lclBhcmVudCgpIHsKLQkJcmV0dXJuIHRoaXM7ICAvLyBubyBhZGFwdGVyCi0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgZ2V0SmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwYXJlbnRTdXBwb3J0c0NvbnZlcnRlcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpOwotCX0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmpvaW5GZXRjaC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnByaXZhdGVPd25lZC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtQcml2YXRlT3duZWQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtQcml2YXRlT3duZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFiNmU5Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua1ByaXZhdGVPd25lZAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkCi17Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcHJpdmF0ZU93bmVkOwotCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkKEphdmFBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnByaXZhdGVPd25lZCA9IHRoaXMuYnVpbGRQcml2YXRlT3duZWQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRQcml2YXRlT3duZWRfKHRoaXMuYnVpbGRQcml2YXRlT3duZWQoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgb3duZWQgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNQcml2YXRlT3duZWQoKSB7Ci0JCXJldHVybiB0aGlzLnByaXZhdGVPd25lZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcml2YXRlT3duZWQoYm9vbGVhbiBwcml2YXRlT3duZWQpIHsKLQkJaWYgKHByaXZhdGVPd25lZCAhPSB0aGlzLnByaXZhdGVPd25lZCkgewotCQkJRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldFByaXZhdGVPd25lZEFubm90YXRpb24oKTsKLQkJCWlmIChwcml2YXRlT3duZWQpIHsKLQkJCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuYWRkUHJpdmF0ZU93bmVkQW5ub3RhdGlvbigpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQl0aGlzLnJlbW92ZVByaXZhdGVPd25lZEFubm90YXRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXRoaXMuc2V0UHJpdmF0ZU93bmVkXyhwcml2YXRlT3duZWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJpdmF0ZU93bmVkXyhib29sZWFuIHByaXZhdGVPd25lZCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMucHJpdmF0ZU93bmVkOwotCQl0aGlzLnByaXZhdGVPd25lZCA9IHByaXZhdGVPd25lZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBSSVZBVEVfT1dORURfUFJPUEVSVFksIG9sZCwgcHJpdmF0ZU93bmVkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZFByaXZhdGVPd25lZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJpdmF0ZU93bmVkQW5ub3RhdGlvbigpICE9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgb3duZWQgYW5ub3RhdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uIGdldFByaXZhdGVPd25lZEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbih0aGlzLmdldFByaXZhdGVPd25lZEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24gYWRkUHJpdmF0ZU93bmVkQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24pIHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKHRoaXMuZ2V0UHJpdmF0ZU93bmVkQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUHJpdmF0ZU93bmVkQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24odGhpcy5nZXRQcml2YXRlT3duZWRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByaXZhdGVPd25lZEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFBdHRyaWJ1dGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgZ2V0QXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldEFubm90YXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEFubm90YXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldFByaXZhdGVPd25lZEFubm90YXRpb24oKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGFubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtSZWFkT25seS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1JlYWRPbmx5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYzBkYTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1JlYWRPbmx5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWFkT25seTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua1JlYWRPbmx5Ci0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtSZWFkT25seQotewotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZFJlYWRPbmx5OyAgLy8gVFJVRSBvciBudWxsCi0KLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtSZWFkT25seShKYXZhRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuc3BlY2lmaWVkUmVhZE9ubHkgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkUmVhZE9ubHkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRSZWFkT25seV8odGhpcy5idWlsZFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWFkLW9ubHkgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFJlYWRPbmx5ICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRSZWFkT25seS5ib29sZWFuVmFsdWUoKSA6IHRoaXMuaXNEZWZhdWx0UmVhZE9ubHkoKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRSZWFkT25seSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUmVhZE9ubHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbiByZWFkT25seSkgewotCQlyZWFkT25seSA9IChyZWFkT25seSA9PSBudWxsKSA/IG51bGwgOiByZWFkT25seS5ib29sZWFuVmFsdWUoKSA/IHJlYWRPbmx5IDogbnVsbDsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHJlYWRPbmx5LCB0aGlzLnNwZWNpZmllZFJlYWRPbmx5KSkgewotCQkJRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0UmVhZE9ubHlBbm5vdGF0aW9uKCk7Ci0JCQlpZiAocmVhZE9ubHkgIT0gbnVsbCkgewotCQkJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCQkJdGhpcy5hZGRSZWFkT25seUFubm90YXRpb24oKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQkJdGhpcy5yZW1vdmVSZWFkT25seUFubm90YXRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXRoaXMuc2V0U3BlY2lmaWVkUmVhZE9ubHlfKHJlYWRPbmx5KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFJlYWRPbmx5XyhCb29sZWFuIHJlYWRPbmx5KSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRSZWFkT25seTsKLQkJdGhpcy5zcGVjaWZpZWRSZWFkT25seSA9IHJlYWRPbmx5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1JFQURfT05MWV9QUk9QRVJUWSwgb2xkLCByZWFkT25seSk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkU3BlY2lmaWVkUmVhZE9ubHkoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRSZWFkT25seUFubm90YXRpb24oKSA9PSBudWxsKSA/IG51bGwgOiBCb29sZWFuLlRSVUU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0UmVhZE9ubHkoKSB7Ci0JCXJldHVybiBERUZBVUxUX1JFQURfT05MWTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVhZC1vbmx5IGFubm90YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uIGdldFJlYWRPbmx5QW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbikgdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbih0aGlzLmdldFJlYWRPbmx5QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVhZE9ubHlBbm5vdGF0aW9uKCkgewotCQl0aGlzLmdldEphdmFSZXNvdXJjZVR5cGUoKS5hZGRBbm5vdGF0aW9uKHRoaXMuZ2V0UmVhZE9ubHlBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZWFkT25seUFubm90YXRpb24oKSB7Ci0JCXRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpLnJlbW92ZUFubm90YXRpb24odGhpcy5nZXRSZWFkT25seUFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVhZE9ubHlBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlVHlwZSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2V0QW5ub3RhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEFubm90YXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0UmVhZE9ubHlBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBhbm5vdGF0aW9uLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNjhlN2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuU3RydWN0Q29udmVydGVyPC9jb2RlPgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyCi0JZXh0ZW5kcyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDbGFzc0NvbnZlcnRlcjxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcgotewotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIoSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIHBhcmVudCwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBjb252ZXJ0ZXJBbm5vdGF0aW9uLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldENvbnZlcnRlcigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyIGNsYXNzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbkNvbnZlcnRlckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uLmdldENvbnZlcnRlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldEFubm90YXRpb25Db252ZXJ0ZXJDbGFzcyhTdHJpbmcgY29udmVydGVyQ2xhc3MpIHsKLQkJdGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uLnNldENvbnZlcnRlcihjb252ZXJ0ZXJDbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIENsYXNzPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBnZXRUeXBlKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3M7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFY2xpcHNlTGlua0NvbnZlcnRlckludGVyZmFjZSgpIHsKLQkJcmV0dXJuIEVDTElQU0VMSU5LX1NUUlVDVF9DT05WRVJURVJfQ0xBU1NfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVjbGlwc2VMaW5rQ29udmVydGVySW50ZXJmYWNlRXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuU1RSVUNUX0NPTlZFUlRFUl9DTEFTU19JTVBMRU1FTlRTX1NUUlVDVF9DT05WRVJURVI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRBbm5vdGF0aW9uQ29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVydGVyVGV4dFJhbmdlKCk7Ci0JfQotCi0JLyoqCi0JICogU2luY2UgdGhlIGNvbnZlcnRlciBjbGFzcyBpcyBhIHN0cmluZywgaXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb252ZXJ0ZXJDbGFzcygpOwotCX0KLQotCS8vICoqKioqKioqKiogbWV0YWRhdGEgY29udmVyc2lvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjb252ZXJ0VG8oT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udmVydGVyQ29udGFpbmVyKSB7Ci0JCW9ybUNvbnZlcnRlckNvbnRhaW5lci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoKS5jb252ZXJ0RnJvbSh0aGlzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVsZXRlKCkgewotCQl0aGlzLmdldFBhcmVudCgpLnJlbW92ZVN0cnVjdENvbnZlcnRlcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1N0cnVjdHVyZU1hcHBpbmcyXzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFhNjkxNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rU3RydWN0dXJlQW5ub3RhdGlvbjJfMzsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua1N0cnVjdHVyZU1hcHBpbmcyXzMKLQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc8RWNsaXBzZUxpbmtTdHJ1Y3R1cmVBbm5vdGF0aW9uMl8zPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zCi17Ci0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfMyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuU1RSVUNUVVJFX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtTdHJ1Y3R1cmVBbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZWE5OGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUNvbnZlcnRpYmxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZyAKLQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc8RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24+IAotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcsIEVjbGlwc2VMaW5rSmF2YUNvbnZlcnRpYmxlTWFwcGluZwotewotCQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgY29udmVydGVyQ29udGFpbmVyOwotCQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyID0gdGhpcy5idWlsZENvbnZlcnRlckNvbnRhaW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlcnMgKioqKioqKioqKgotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBnZXRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwodGhpcyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgY29udGFpbmVyIHBhcmVudCBhZGFwdGVyICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhSnBhQ29udGV4dE5vZGUgZ2V0Q29udmVydGVyQ29udGFpbmVyUGFyZW50KCkgewotCQlyZXR1cm4gdGhpczsgIC8vIG5vIGFkYXB0ZXIKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBnZXRKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBhcmVudFN1cHBvcnRzQ29udmVydGVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVFJBTlNGT1JNQVRJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzY1OGFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhTmFtZWRDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHlwZUNvbnZlcnRlcjwvY29kZT4KLSAqLwotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIKLQlleHRlbmRzIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcjxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyCi17Ci0JcHJpdmF0ZSBTdHJpbmcgZGF0YVR5cGU7Ci0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWREYXRhVHlwZTsKLQotCXByaXZhdGUgU3RyaW5nIG9iamVjdFR5cGU7Ci0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlOwotCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcihKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgcGFyZW50LCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBjb252ZXJ0ZXJBbm5vdGF0aW9uKTsKLQkJdGhpcy5kYXRhVHlwZSA9IHRoaXMuY29udmVydGVyQW5ub3RhdGlvbi5nZXREYXRhVHlwZSgpOwotCQl0aGlzLm9iamVjdFR5cGUgPSB0aGlzLmNvbnZlcnRlckFubm90YXRpb24uZ2V0T2JqZWN0VHlwZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldERhdGFUeXBlXyh0aGlzLmNvbnZlcnRlckFubm90YXRpb24uZ2V0RGF0YVR5cGUoKSk7Ci0JCXRoaXMuc2V0T2JqZWN0VHlwZV8odGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE9iamVjdFR5cGUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRGdWxseVF1YWxpZmllZERhdGFUeXBlKHRoaXMuY29udmVydGVyQW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZERhdGFUeXBlKCkpOwotCQl0aGlzLnNldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSh0aGlzLmNvbnZlcnRlckFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkYXRhIHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXREYXRhVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YVR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0YVR5cGUoU3RyaW5nIGRhdGFUeXBlKSB7Ci0JCXRoaXMuY29udmVydGVyQW5ub3RhdGlvbi5zZXREYXRhVHlwZShkYXRhVHlwZSk7Ci0JCXRoaXMuc2V0RGF0YVR5cGVfKGRhdGFUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREYXRhVHlwZV8oU3RyaW5nIGRhdGFUeXBlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRhdGFUeXBlOwotCQl0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChEQVRBX1RZUEVfUFJPUEVSVFksIG9sZCwgZGF0YVR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmdWxseSBxdWFsaWZpZWQgZGF0YSB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWREYXRhVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWREYXRhVHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGdWxseVF1YWxpZmllZERhdGFUeXBlKFN0cmluZyBkYXRhVHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZERhdGFUeXBlOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUgPSBkYXRhVHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9EQVRBX1RZUEVfUFJPUEVSVFksIG9sZCwgZGF0YVR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvYmplY3QgdHlwZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0VHlwZShTdHJpbmcgb2JqZWN0VHlwZSkgewotCQl0aGlzLmNvbnZlcnRlckFubm90YXRpb24uc2V0T2JqZWN0VHlwZShvYmplY3RUeXBlKTsKLQkJdGhpcy5zZXRPYmplY3RUeXBlXyhvYmplY3RUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPYmplY3RUeXBlXyhTdHJpbmcgb2JqZWN0VHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5vYmplY3RUeXBlOwotCQl0aGlzLm9iamVjdFR5cGUgPSBvYmplY3RUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1RZUEVfUFJPUEVSVFksIG9sZCwgb2JqZWN0VHlwZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZ1bGx5IHF1YWxpZmllZCBvYmplY3QgdHlwZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZShTdHJpbmcgb2JqZWN0VHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZE9iamVjdFR5cGU7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlID0gb2JqZWN0VHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9PQkpFQ1RfVFlQRV9QUk9QRVJUWSwgb2xkLCBvYmplY3RUeXBlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgQ2xhc3M8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBnZXRUeXBlKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmNsYXNzOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNFcXVpdmFsZW50VG8oSnBhTmFtZWRDb250ZXh0Tm9kZSBub2RlKSB7Ci0JCXJldHVybiBzdXBlci5pc0VxdWl2YWxlbnRUbyhub2RlKQotCQkJCSYmIHRoaXMuaXNFcXVpdmFsZW50VG8oKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgbm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFcXVpdmFsZW50VG8oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy5mdWxseVF1YWxpZmllZERhdGFUeXBlLCBjb252ZXJ0ZXIuZ2V0RnVsbHlRdWFsaWZpZWREYXRhVHlwZSgpKSAmJgotCQkJCVRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMuZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlLCBjb252ZXJ0ZXIuZ2V0RnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZXRhZGF0YSBjb252ZXJzaW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNvbnZlcnRUbyhPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db252ZXJ0ZXJDb250YWluZXIpIHsKLQkJb3JtQ29udmVydGVyQ29udGFpbmVyLmFkZFR5cGVDb252ZXJ0ZXIoKS5jb252ZXJ0RnJvbSh0aGlzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVsZXRlKCkgewotCQl0aGlzLmdldFBhcmVudCgpLnJlbW92ZVR5cGVDb252ZXJ0ZXIodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFjYTI3Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YUNvbnZlcnRpYmxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcgCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nLCBFY2xpcHNlTGlua0phdmFDb252ZXJ0aWJsZU1hcHBpbmcKLXsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGNvbnZlcnRlckNvbnRhaW5lcjsKLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGdldENvbnZlcnRlckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbCh0aGlzKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBjb250YWluZXIgcGFyZW50IGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFKcGFDb250ZXh0Tm9kZSBnZXRDb252ZXJ0ZXJDb250YWluZXJQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzOyAgLy8gbm8gYWRhcHRlcgotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IGdldEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGFyZW50U3VwcG9ydHNDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5WQVJJQUJMRV9PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYjFmOWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXV0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhQ29udmVydGlibGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhVmVyc2lvbk1hcHBpbmcKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcsIEVjbGlwc2VMaW5rSmF2YUNvbnZlcnRpYmxlTWFwcGluZwotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGU7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGNvbnZlcnRlckNvbnRhaW5lcjsKLQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm11dGFibGUgPSBuZXcgSmF2YUVjbGlwc2VMaW5rTXV0YWJsZSh0aGlzKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMubXV0YWJsZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLm11dGFibGUudXBkYXRlKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtdXRhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua011dGFibGUgZ2V0TXV0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMubXV0YWJsZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGdldENvbnZlcnRlckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbCh0aGlzKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBjb250YWluZXIgcGFyZW50IGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFKcGFDb250ZXh0Tm9kZSBnZXRDb252ZXJ0ZXJDb250YWluZXJQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzOyAgLy8gbm8gYWRhcHRlcgotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IGdldEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGFyZW50U3VwcG9ydHNDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBhZGFwdGVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBwdXQgdGhlIEVjbGlwc2VMaW5rIGNvbnZlcnQgYWRhcHRlciBmaXJzdCAtIHRoaXMgaXMgdGhlIG9yZGVyIEVjbGlwc2VMaW5rIHNlYXJjaGVzCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFDb252ZXJ0ZXIuQWRhcHRlcj4gZ2V0Q29udmVydGVyQWRhcHRlcnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8SmF2YUNvbnZlcnRlci5BZGFwdGVyPihKYXZhRWNsaXBzZUxpbmtDb252ZXJ0LkFkYXB0ZXIuaW5zdGFuY2UoKSwgc3VwZXIuZ2V0Q29udmVydGVyQWRhcHRlcnMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5tdXRhYmxlLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXR0cmlidXRlVHlwZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKCFBcnJheVRvb2xzLmNvbnRhaW5zKFNVUFBPUlRFRF9UWVBFX05BTUVTLCB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRUeXBlTmFtZSgpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9WRVJTSU9OX01BUFBJTkdfVFlQRSwKLQkJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KQotCQkJCQkpCi0JCQkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL051bGxKYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9OdWxsSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YjFiMDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL051bGxKYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zOwotCi1wdWJsaWMgY2xhc3MgTnVsbEphdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMwotewotCi0JcHVibGljIE51bGxKYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMoSmF2YUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8vICoqKioqKioqKiogbXVsdGl0ZW5hbnQgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNNdWx0aXRlbmFudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE11bHRpdGVuYW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpZWRNdWx0aXRlbmFudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE11bHRpdGVuYW50KGJvb2xlYW4gaXNNdWx0aXRlbmFudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk11bHRpdGVuYW5jeSBpcyBvbmx5IHN1cHBvcnRlZCBpbiBFY2xpcHNlTGluayB2ZXJzaW9uIDIuMyBhbmQgaGlnaGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHlwZSAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zIGdldFNwZWNpZmllZFR5cGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMgdHlwZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk11bHRpdGVuYW5jeSBpcyBvbmx5IHN1cHBvcnRlZCBpbiBFY2xpcHNlTGluayB2ZXJzaW9uIDIuMyBhbmQgaGlnaGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMgZ2V0RGVmYXVsdFR5cGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW5jbHVkZUNyaXRlcmlhKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoQm9vbGVhbiBpbmNsdWRlQ3JpdGVyaWEpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJNdWx0aXRlbmFuY3kgaXMgb25seSBzdXBwb3J0ZWQgaW4gRWNsaXBzZUxpbmsgdmVyc2lvbiAyLjMgYW5kIGhpZ2hlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0SW5jbHVkZUNyaXRlcmlhKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYWJsZTxKYXZhUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpIHsKLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8SmF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkgewotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJNdWx0aXRlbmFuY3kgaXMgb25seSBzdXBwb3J0ZWQgaW4gRWNsaXBzZUxpbmsgdmVyc2lvbiAyLjMgYW5kIGhpZ2hlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEphdmFUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTXVsdGl0ZW5hbmN5IGlzIG9ubHkgc3VwcG9ydGVkIGluIEVjbGlwc2VMaW5rIHZlcnNpb24gMi4zIGFuZCBoaWdoZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTXVsdGl0ZW5hbmN5IGlzIG9ubHkgc3VwcG9ydGVkIGluIEVjbGlwc2VMaW5rIHZlcnNpb24gMi4zIGFuZCBoaWdoZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTXVsdGl0ZW5hbmN5IGlzIG9ubHkgc3VwcG9ydGVkIGluIEVjbGlwc2VMaW5rIHZlcnNpb24gMi4zIGFuZCBoaWdoZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTXVsdGl0ZW5hbmN5IGlzIG9ubHkgc3VwcG9ydGVkIGluIEVjbGlwc2VMaW5rIHZlcnNpb24gMi4zIGFuZCBoaWdoZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8SmF2YVZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBnZXREZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTXVsdGl0ZW5hbmN5IGlzIG9ubHkgc3VwcG9ydGVkIGluIEVjbGlwc2VMaW5rIHZlcnNpb24gMi4zIGFuZCBoaWdoZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIHNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQWxsb3dlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZXNQcmltYXJ5S2V5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvU3BlY2lmaWVkSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL1NwZWNpZmllZEphdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlMTMwMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvU3BlY2lmaWVkSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5BY2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGVWYWxpZGF0b3I7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgSmF2YSBwZXJzaXN0ZW50IGF0dHJpYnV0ZQotICovCi1wdWJsaWMgY2xhc3MgU3BlY2lmaWVkSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZQotCWltcGxlbWVudHMgSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZQotewotCi0JcHVibGljIFNwZWNpZmllZEphdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUoUGVyc2lzdGVudFR5cGUgcGFyZW50LCBKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkKSB7Ci0JCXN1cGVyKHBhcmVudCxyZXNvdXJjZUZpZWxkKTsKLQl9Ci0KLQlwdWJsaWMgU3BlY2lmaWVkSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZShQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZUdldHRlciwgSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlU2V0dGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VHZXR0ZXIsIHJlc291cmNlU2V0dGVyKTsKLQl9Ci0KLQlwdWJsaWMgU3BlY2lmaWVkSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZShQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEFjY2Vzc29yIGFjY2Vzc29yKSB7Ci0JCXN1cGVyKHBhcmVudCwgYWNjZXNzb3IpOwotCX0KLQotCS8vICoqKioqKioqKiogbWFwcGluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldFNwZWNpZmllZE1hcHBpbmdEZWZpbml0aW9uKFN0cmluZyBrZXkpIHsKLQkJaWYgKHRoaXMuc3BlY2lmaWVkS2V5SXNJbnZhbGlkKGtleSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgbWFwcGluZzogIiArIGtleSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0U3BlY2lmaWVkTWFwcGluZ0RlZmluaXRpb24oa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBFY2xpcHNlTGluayBkb2VzIG5vdCBzdXBwb3J0IHNldHRpbmcgYW4gYXR0cmlidXRlIHdpdGggYSBkZWZhdWx0IDE6MQotCSAqIG1hcHBpbmcgdG8gYSBzcGVjaWZpZWQgbWFwcGluZyBvZiBJRDsgYmVjYXVzZSB0aGUgcmVzdWx0aW5nIElEIGFubm90YXRpb24KLQkgKiBpbmRpY2F0ZXMgYSBwcmltYXJ5IGtleSBkZXJpdmVkIGZyb20gdGhlIDE6MSBtYXBwaW5nLCA8ZW0+bm90PC9lbT4gYW4gSUQKLQkgKiBtYXBwaW5nLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNwZWNpZmllZEtleUlzSW52YWxpZChTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbChrZXksIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgJiYKLQkJCVRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0eXBlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUncyB0eXBlIGlzIGEgc3ViY2xhc3Mgb2YKLQkgKiA8Y29kZT5qYXZhLnV0aWwuRGF0ZTwvY29kZT4gb3IgPGNvZGU+amF2YS51dGlsLkNhbGVuZGFyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB0eXBlSXNEYXRlT3JDYWxlbmRhcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS50eXBlSXNTdWJUeXBlT2YoREFURV9UWVBFX05BTUUpCi0JCQkJfHwgdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLnR5cGVJc1N1YlR5cGVPZihDQUxFTkRBUl9UWVBFX05BTUUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHR5cGVJc1NlcmlhbGl6YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS50eXBlSXNWYXJpYWJsZVByaW1pdGl2ZSgpCi0JCQkJfHwgdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLnR5cGVJc1N1YlR5cGVPZihKRFRUb29scy5TRVJJQUxJWkFCTEVfQ0xBU1NfTkFNRSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdHlwZUlzVmFsaWRGb3JWYXJpYWJsZU9uZVRvT25lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLnR5cGVJc0ludGVyZmFjZSgpCi0JCQkJJiYgdGhpcy5pbnRlcmZhY2VJc1ZhbGlkRm9yVmFyaWFibGVPbmVUb09uZSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGludGVyZmFjZUlzVmFsaWRGb3JWYXJpYWJsZU9uZVRvT25lKCkgewotCQlyZXR1cm4gISB0aGlzLmludGVyZmFjZUlzSW52YWxpZEZvclZhcmlhYmxlT25lVG9PbmUoKTsKLQl9Ci0KLQkvLyBUT0RPIHdlIGNvdWxkIHByb2JhYmx5IGFkZCBtb3JlIGludGVyZmFjZXMgdG8gdGhpcyBsaXN0Li4uCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW50ZXJmYWNlSXNJbnZhbGlkRm9yVmFyaWFibGVPbmVUb09uZSgpIHsKLQkJU3RyaW5nIGludGVyZmFjZU5hbWUgPSB0aGlzLmdldFR5cGVOYW1lKCk7Ci0JCXJldHVybiAoaW50ZXJmYWNlTmFtZSA9PSBudWxsKSB8fAotCQkJCWludGVyZmFjZU5hbWUuZXF1YWxzKCJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5pbmRpcmVjdGlvbi5WYWx1ZUhvbGRlckludGVyZmFjZSIpIHx8IC8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLnR5cGVJc0NvbnRhaW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRBdHRyaWJ1dGVWYWxpZGF0b3IoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGVWYWxpZGF0b3IodGhpcywgYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcihhc3RSb290KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0RWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNzZiOTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbERlZmluaXRpb24KLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEVGYWN0b3J5IGdldFJlc291cmNlTm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MjMzOWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nPFhtbEJhc2ljQ29sbGVjdGlvbj4gCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcKLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEJhc2ljQ29sbGVjdGlvbiB4bWxNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKLQkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbU9ybUF0dHJpYnV0ZU1hcHBpbmcodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5CQVNJQ19DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkWG1sQXR0cmlidXRlTWFwcGluZ1RvKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKLQkJKChBdHRyaWJ1dGVzKSByZXNvdXJjZUF0dHJpYnV0ZXMpLmdldEJhc2ljQ29sbGVjdGlvbnMoKS5hZGQodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sQXR0cmlidXRlTWFwcGluZ0Zyb20ob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgewotCQkoKEF0dHJpYnV0ZXMpIHJlc291cmNlQXR0cmlidXRlcykuZ2V0QmFzaWNDb2xsZWN0aW9ucygpLnJlbW92ZSh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiAyMzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0YW1vZGVsICoqKioqKioqKiogIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWV0YW1vZGVsRmllbGRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuICgoUGVyc2lzdGVudEF0dHJpYnV0ZTJfMCkgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpKS5nZXRNZXRhbW9kZWxDb250YWluZXJGaWVsZFR5cGVOYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxUeXBlTmFtZSgpIHsKLQkJU3RyaW5nIHRhcmdldFR5cGVOYW1lID0gbnVsbDsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlpZiAoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJdGFyZ2V0VHlwZU5hbWUgPSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNdWx0aVJlZmVyZW5jZVRhcmdldFR5cGVOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuICh0YXJnZXRUeXBlTmFtZSAhPSBudWxsKSA/IHRhcmdldFR5cGVOYW1lIDogTWV0YW1vZGVsRmllbGQuREVGQVVMVF9UWVBFX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTdiZjMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NZXRhbW9kZWxGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNNYXA7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc8WG1sQmFzaWNNYXA+IAotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcKLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sQmFzaWNNYXAgeG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1BdHRyaWJ1dGVNYXBwaW5nKHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfTUFQX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkWG1sQXR0cmlidXRlTWFwcGluZ1RvKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKLQkJKChBdHRyaWJ1dGVzKSByZXNvdXJjZUF0dHJpYnV0ZXMpLmdldEJhc2ljTWFwcygpLmFkZCh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxBdHRyaWJ1dGVNYXBwaW5nRnJvbShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKSB7Ci0JCSgoQXR0cmlidXRlcykgcmVzb3VyY2VBdHRyaWJ1dGVzKS5nZXRCYXNpY01hcHMoKS5yZW1vdmUodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0KLQkKLQlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgewotCQlyZXR1cm4gMjc7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1ldGFtb2RlbCAqKioqKioqKioqICAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1ldGFtb2RlbEZpZWxkVHlwZU5hbWUoKSB7Ci0JCXJldHVybiAoKFBlcnNpc3RlbnRBdHRyaWJ1dGUyXzApIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSkuZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0YW1vZGVsVHlwZU5hbWUoKSB7Ci0JCVN0cmluZyB0YXJnZXRUeXBlTmFtZSA9IG51bGw7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJaWYgKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlICE9IG51bGwpIHsKLQkJCXRhcmdldFR5cGVOYW1lID0gamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TXVsdGlSZWZlcmVuY2VUYXJnZXRUeXBlTmFtZSgpOwotCQl9Ci0JCXJldHVybiAodGFyZ2V0VHlwZU5hbWUgIT0gbnVsbCkgPyB0YXJnZXRUeXBlTmFtZSA6IE1ldGFtb2RlbEZpZWxkLkRFRkFVTFRfVFlQRV9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZE1ldGFtb2RlbEZpZWxkVHlwZUFyZ3VtZW50TmFtZXNUbyhBcnJheUxpc3Q8U3RyaW5nPiB0eXBlQXJndW1lbnROYW1lcykgewotCQl0aGlzLmFkZE1ldGFtb2RlbEZpZWxkTWFwS2V5VHlwZUFyZ3VtZW50TmFtZVRvKHR5cGVBcmd1bWVudE5hbWVzKTsKLQkJc3VwZXIuYWRkTWV0YW1vZGVsRmllbGRUeXBlQXJndW1lbnROYW1lc1RvKHR5cGVBcmd1bWVudE5hbWVzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZXRhbW9kZWxGaWVsZE1hcEtleVR5cGVBcmd1bWVudE5hbWVUbyhBcnJheUxpc3Q8U3RyaW5nPiB0eXBlQXJndW1lbnROYW1lcykgewotCQlTdHJpbmcgbWFwS2V5VHlwZU5hbWUgPSBudWxsOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCWlmIChqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQltYXBLZXlUeXBlTmFtZSA9IGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE11bHRpUmVmZXJlbmNlTWFwS2V5VHlwZU5hbWUoKTsKLQkJfQotCQltYXBLZXlUeXBlTmFtZSA9IG1hcEtleVR5cGVOYW1lICE9IG51bGwgPyBtYXBLZXlUeXBlTmFtZSA6IE1ldGFtb2RlbEZpZWxkLkRFRkFVTFRfVFlQRV9OQU1FOwotCQl0eXBlQXJndW1lbnROYW1lcy5hZGQobWFwS2V5VHlwZU5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjIyYjAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdEVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LlJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzSW1wbAotCWV4dGVuZHMgQWJzdHJhY3RFbnRpdHlNYXBwaW5ncwotCWltcGxlbWVudHMgCi0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MsIAotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lci5Pd25lcgotewotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBjb252ZXJ0ZXJDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8T3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMywgWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzM+IHNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXI7Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5Pd25lciB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uT3duZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8T3JtVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMsIFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXI7Ci0KLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkR2V0TWV0aG9kOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdEdldE1ldGhvZDsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkU2V0TWV0aG9kOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFNldE1ldGhvZDsKLQotCi0JcHVibGljIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NJbXBsKE9ybVhtbCBwYXJlbnQsIFhtbEVudGl0eU1hcHBpbmdzIHJlc291cmNlKSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2UpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJdGhpcy50ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uT3duZXIgPSB0aGlzLmJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbk93bmVyKCk7Ci0JCXRoaXMuc3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lciA9IHRoaXMuYnVpbGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyKCk7Ci0JCXRoaXMuZGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIgPSB0aGlzLmJ1aWxkRGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIoKTsKLQkJdGhpcy5zcGVjaWZpZWRHZXRNZXRob2QgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkR2V0TWV0aG9kKCk7Ci0JCXRoaXMuc3BlY2lmaWVkU2V0TWV0aG9kID0gdGhpcy5idWlsZFNwZWNpZmllZFNldE1ldGhvZCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY1NwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkR2V0TWV0aG9kXyh0aGlzLmJ1aWxkU3BlY2lmaWVkR2V0TWV0aG9kKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFNldE1ldGhvZF8odGhpcy5idWlsZFNwZWNpZmllZFNldE1ldGhvZCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVOb2Rlcyh0aGlzLmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkpOwotCQl0aGlzLnVwZGF0ZURlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpOwotCQl0aGlzLnNldERlZmF1bHRHZXRNZXRob2QodGhpcy5idWlsZERlZmF1bHRHZXRNZXRob2QoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFNldE1ldGhvZCh0aGlzLmJ1aWxkRGVmYXVsdFNldE1ldGhvZCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sRW50aXR5TWFwcGluZ3MgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoWG1sRW50aXR5TWFwcGluZ3MpIHN1cGVyLmdldFhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHR5cGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIHByZWNvbmRpdGlvbnM6IAotCSAqIAkJZ2V0UGFja2FnZSgpIGlzIG5vdCBudWxsCi0JICogCQl1bnF1YWxpZmllZENsYXNzTmFtZSBpcyBub3QgcXVhbGlmaWVkIChjb250YWlucyBubyAnLicpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVwZW5kR2xvYmFsUGFja2FnZShTdHJpbmcgdW5xdWFsaWZpZWRDbGFzc05hbWUpIHsKLQkJLy8gRm9ybWF0IG9mIGdsb2JhbCBwYWNrYWdlIGlzICJmb28uYmFyLiIKLQkJaWYgKHRoaXMuZ2V0UGFja2FnZSgpLmVuZHNXaXRoKCIuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRoaXMuZ2V0UGFja2FnZSgpICsgdW5xdWFsaWZpZWRDbGFzc05hbWU7Ci0JCX0KLQkJLy8gRm9ybWF0IG9mIGdsb2JhbCBwYWNrYWdlIGlzICJmb28uYmFyIgotCQlyZXR1cm4gc3VwZXIucHJlcGVuZEdsb2JhbFBhY2thZ2UodW5xdWFsaWZpZWRDbGFzc05hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgY29udGFpbmVyICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBnZXRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsKHRoaXMsIHRoaXMsIChYbWxFbnRpdHlNYXBwaW5ncykgdGhpcy54bWxFbnRpdHlNYXBwaW5ncyk7Ci0JfQotCi0JcHVibGljIGludCBnZXROdW1iZXJTdXBwb3J0ZWRDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPiBnZXRNYXBwaW5nRmlsZUNvbnZlcnRlcnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+KAotCQkJCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5nZXRDb252ZXJ0ZXJzKCksCi0JCQkJCXRoaXMuZ2V0VHlwZU1hcHBpbmdDb252ZXJ0ZXJzKCkKLQkJCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4gZ2V0VHlwZU1hcHBpbmdDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPih0aGlzLmdldFR5cGVNYXBwaW5nQ29udmVydGVyTGlzdHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPj4gZ2V0VHlwZU1hcHBpbmdDb252ZXJ0ZXJMaXN0cygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPE9ybVR5cGVNYXBwaW5nLCBJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4+KHRoaXMuZ2V0VHlwZU1hcHBpbmdzKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4gdHJhbnNmb3JtKE9ybVR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua1R5cGVNYXBwaW5nKSB0eXBlTWFwcGluZykuZ2V0Q29udmVydGVycygpOwotCQkJCQl9Ci0JCQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc1NwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkgPwotCQkJdGhpcy5nZXRSZWFkT25seVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkgOiAKLQkJCXRoaXMuZ2V0UmVhZE9ubHlEZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaGFzU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSA/Ci0JCQl0aGlzLmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpIDogCi0JCQl0aGlzLmdldERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHNwZWNpZmllZCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGdldFJlYWRPbmx5U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4odGhpcy5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHNTaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpICE9IDA7Ci0JfQotCi0JcHVibGljIE9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCi0JcHVibGljIE9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbih0aGlzLmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBhZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKGludCBpbmRleCkgewotCQlYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uIHhtbEpvaW5Db2x1bW4gPSB0aGlzLmJ1aWxkWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGpvaW5Db2x1bW4gPSB0aGlzLnNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIHhtbEpvaW5Db2x1bW4pOwotCQl0aGlzLmdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5hZGQoaW5kZXgsIHhtbEpvaW5Db2x1bW4pOwotCQlyZXR1cm4gam9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbiBidWlsZFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKE9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbikgewotCQl0aGlzLnJlbW92ZVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4odGhpcy5zcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyLmluZGV4T2ZDb250ZXh0RWxlbWVudCh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihpbnQgaW5kZXgpIHsKLQkJdGhpcy5zcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyLnJlbW92ZUNvbnRleHRFbGVtZW50KGluZGV4KTsKLQkJdGhpcy5nZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLnNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXRoaXMuc3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMz4gZ2V0WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCWlmIChnZXRYbWxFbnRpdHlNYXBwaW5ncygpID09IG51bGwpIHsKLQkJCXJldHVybiBFbXB0eUxpc3RJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0JCS8vIGNsb25lIHRvIHJlZHVjZSBjaGFuY2Ugb2YgY29uY3VycmVuY3kgcHJvYmxlbXMKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzM+KHRoaXMuZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpKTsKLQl9Ci0KLQkvKioKLQkgKiAgc3BlY2lmaWVkIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbiBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMsIFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFNQRUNJRklFRF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGJ1aWxkQ29udGV4dEVsZW1lbnQoWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMgcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0ltcGwudGhpcy5idWlsZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4ocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMz4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzSW1wbC50aGlzLmdldFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMyBnZXRSZXNvdXJjZUVsZW1lbnQoT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldFhtbENvbHVtbigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5Pd25lciBidWlsZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uT3duZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lciBidWlsZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIoKSB7Ci0JCVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIgY29udGFpbmVyID0gbmV3IFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIoKTsKLQkJY29udGFpbmVyLmluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBidWlsZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMgeG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbikgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyh0aGlzLCB0aGlzLnRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Pd25lciwgeG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE9ybVZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBnZXREZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBnZXRSZWFkT25seURlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPih0aGlzLmdldERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhckRlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpIHsKLQkJdGhpcy5kZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lci5jbGVhckNvbnRleHRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlcmUgYXJlIGFueSBzcGVjaWZpZWQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucywgdGhlbiB0aGVyZSBhcmUgbm8gZGVmYXVsdAotCSAqIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMuCi0JICogQHNlZSAjZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNGb3JEZWZhdWx0cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkgewotCQl0aGlzLmRlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyLnVwZGF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0ZvckRlZmF1bHRzKCkgewotCQlpZiAodGhpcy5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSA+IDApIHsKLQkJCXJldHVybiBFbXB0eUxpc3RJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBnZXRDb250ZXh0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGdldENvbnRleHREZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlRGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oaW50IGluZGV4LCBPcm1WaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKSB7Ci0JCXRoaXMuZGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KGluZGV4LCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgYWRkRGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oaW50IGluZGV4LCBPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIG9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIG9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCBPcm1WaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBidWlsZFZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybVZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zKHRoaXMsIHRoaXMudGVuYW50RGlzY3JpbWluYXRvckNvbHVtbk93bmVyLCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVEZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihPcm1WaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKSB7Ci0JCXRoaXMuZGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQodGVuYW50RGlzY3JpbWluYXRvckNvbHVtbik7Ci0JfQotCi0JcHJvdGVjdGVkIERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyIGJ1aWxkRGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIoKTsKLQl9Ci0KLQotCS8qKgotCSAqIGRlZmF1bHQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uIGNvbnRhaW5lcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybVZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLCBSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gREVGQVVMVF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBPcm1WaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBidWlsZENvbnRleHRFbGVtZW50KFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzSW1wbC50aGlzLmJ1aWxkVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4ocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0ltcGwudGhpcy5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0ZvckRlZmF1bHRzKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgZ2V0UmVzb3VyY2VFbGVtZW50KE9ybVZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0T3ZlcnJpZGRlbkNvbHVtbigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9ybVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbi5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbk93bmVyIAotCQlpbXBsZW1lbnRzIE9ybVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5Pd25lcgotCXsKLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb250ZXh0UHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5ERUZBVUxUX0NPTlRFWFRfUFJPUEVSVFk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0UHJpbWFyeUtleSgpIHsKLQkJCXJldHVybiBSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuREVGQVVMVF9QUklNQVJZX0tFWTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdExlbmd0aCgpIHsKLQkJCXJldHVybiBSZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSDsKLQkJfQotCi0JCXB1YmxpYyBEaXNjcmltaW5hdG9yVHlwZSBnZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSB7Ci0JCQlyZXR1cm4gUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9ESVNDUklNSU5BVE9SX1RZUEU7Ci0JCX0KLQotCQkvKioKLQkJICogTm8gZGVmYXVsdCB0YWJsZSBuYW1lIGluIHRoZSBjb250ZXh0IG9mIGVudGl0eSBtYXBwaW5ncwotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uKSB7Ci0JCQlyZXR1cm4gUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLkRFRkFVTFRfTkFNRTsKLQkJfQotCi0JCS8qKgotCQkgKiBObyB0YWJsZSBpbiB0aGUgY29udGV4dCBvZiBlbnRpdHkgbWFwcGluZ3MKLQkJICovCi0JCXB1YmxpYyBUYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qKgotCQkgKiBubyBjb2x1bW4gdmFsaWRhdGlvbiBjYW4gYmUgZG9uZSBpbiB0aGUgY29udGV4dCBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdCBkZWZhdWx0cwotCQkgKi8KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbiwgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIEpwdFZhbGlkYXRvci5OdWxsLmluc3RhbmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0ltcGwudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vKioqKioqKioqKioqKioqIGdldCBtZXRob2QgKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0R2V0TWV0aG9kKCkgewotCQlTdHJpbmcgc3BlY2lmaWVkR2V0TWV0aG9kID0gdGhpcy5nZXRTcGVjaWZpZWRHZXRNZXRob2QoKTsKLQkJcmV0dXJuIChzcGVjaWZpZWRHZXRNZXRob2QgIT0gbnVsbCkgPyBzcGVjaWZpZWRHZXRNZXRob2QgOiB0aGlzLmRlZmF1bHRHZXRNZXRob2Q7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0R2V0TWV0aG9kKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0R2V0TWV0aG9kOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0R2V0TWV0aG9kKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXREZWZhdWx0R2V0TWV0aG9kKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEdldE1ldGhvZChTdHJpbmcgZ2V0TWV0aG9kKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRHZXRNZXRob2Q7Ci0JCXRoaXMuZGVmYXVsdEdldE1ldGhvZCA9IGdldE1ldGhvZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfR0VUX01FVEhPRF9QUk9QRVJUWSwgb2xkLCBnZXRNZXRob2QpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkR2V0TWV0aG9kKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRHZXRNZXRob2Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkR2V0TWV0aG9kKFN0cmluZyBnZXRNZXRob2QpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkR2V0TWV0aG9kLCBnZXRNZXRob2QpKSB7Ci0JCQlYbWxBY2Nlc3NNZXRob2RzIHhtbEFjY2Vzc01ldGhvZHMgPSB0aGlzLmdldFhtbEFjY2Vzc01ldGhvZHNGb3JVcGRhdGUoKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkR2V0TWV0aG9kXyhnZXRNZXRob2QpOwotCQkJeG1sQWNjZXNzTWV0aG9kcy5zZXRHZXRNZXRob2QoZ2V0TWV0aG9kKTsKLQkJCXRoaXMucmVtb3ZlWG1sQWNjZXNzTWV0aG9kc0lmVW5zZXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEdldE1ldGhvZF8oU3RyaW5nIGdldE1ldGhvZCkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRHZXRNZXRob2Q7Ci0JCXRoaXMuc3BlY2lmaWVkR2V0TWV0aG9kID0gZ2V0TWV0aG9kOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0dFVF9NRVRIT0RfUFJPUEVSVFksIG9sZCwgZ2V0TWV0aG9kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkR2V0TWV0aG9kKCkgewotCQlYbWxBY2Nlc3NNZXRob2RzIHhtbEFjY2Vzc01ldGhvZHMgPSBnZXRYbWxBY2Nlc3NNZXRob2RzKCk7Ci0JCXJldHVybiB4bWxBY2Nlc3NNZXRob2RzICE9IG51bGwgPyB4bWxBY2Nlc3NNZXRob2RzLmdldEdldE1ldGhvZCgpIDogbnVsbDsKLQl9Ci0KLQotCS8vKioqKioqKioqKioqKioqIHNldCBtZXRob2QgKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2V0TWV0aG9kKCkgewotCQlTdHJpbmcgc3BlY2lmaWVkU2V0TWV0aG9kID0gdGhpcy5nZXRTcGVjaWZpZWRTZXRNZXRob2QoKTsKLQkJcmV0dXJuIChzcGVjaWZpZWRTZXRNZXRob2QgIT0gbnVsbCkgPyBzcGVjaWZpZWRTZXRNZXRob2QgOiB0aGlzLmRlZmF1bHRTZXRNZXRob2Q7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2V0TWV0aG9kKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2V0TWV0aG9kOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRTZXRNZXRob2QoU3RyaW5nIHNldE1ldGhvZCkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0U2V0TWV0aG9kOwotCQl0aGlzLmRlZmF1bHRTZXRNZXRob2QgPSBzZXRNZXRob2Q7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1NFVF9NRVRIT0RfUFJPUEVSVFksIG9sZCwgc2V0TWV0aG9kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFNldE1ldGhvZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RGVmYXVsdFNldE1ldGhvZCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkU2V0TWV0aG9kKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTZXRNZXRob2Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2V0TWV0aG9kKFN0cmluZyBzZXRNZXRob2QpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkU2V0TWV0aG9kLCBzZXRNZXRob2QpKSB7Ci0JCQlYbWxBY2Nlc3NNZXRob2RzIHhtbEFjY2Vzc01ldGhvZHMgPSB0aGlzLmdldFhtbEFjY2Vzc01ldGhvZHNGb3JVcGRhdGUoKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkU2V0TWV0aG9kXyhzZXRNZXRob2QpOwotCQkJeG1sQWNjZXNzTWV0aG9kcy5zZXRTZXRNZXRob2Qoc2V0TWV0aG9kKTsKLQkJCXRoaXMucmVtb3ZlWG1sQWNjZXNzTWV0aG9kc0lmVW5zZXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFNldE1ldGhvZF8oU3RyaW5nIHNldE1ldGhvZCkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRTZXRNZXRob2Q7Ci0JCXRoaXMuc3BlY2lmaWVkU2V0TWV0aG9kID0gc2V0TWV0aG9kOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NFVF9NRVRIT0RfUFJPUEVSVFksIG9sZCwgc2V0TWV0aG9kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkU2V0TWV0aG9kKCkgewotCQlYbWxBY2Nlc3NNZXRob2RzIHhtbEFjY2Vzc01ldGhvZHMgPSBnZXRYbWxBY2Nlc3NNZXRob2RzKCk7Ci0JCXJldHVybiB4bWxBY2Nlc3NNZXRob2RzICE9IG51bGwgPyB4bWxBY2Nlc3NNZXRob2RzLmdldFNldE1ldGhvZCgpIDogbnVsbDsKLQl9Ci0KLQkvLyoqKioqKioqKioqKioqKiBYTUwgYWNjZXNzIG1ldGhvZHMgKioqKioqKioqKioqKioqKioKLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBnZXRYbWxBY2Nlc3NNZXRob2RzKCkgewotCQlyZXR1cm4gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3NNZXRob2RzKCk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgdGhlIFhNTCBhY2Nlc3MgbWV0aG9kcyAoYW5kIFhNTCBkZWZhdWx0cyBhbmQgWE1MIG1ldGFkYXRhIGlmIG5lY2Vzc2FyeSkgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgZ2V0WG1sQWNjZXNzTWV0aG9kc0ZvclVwZGF0ZSgpIHsKLQkJWG1sQWNjZXNzTWV0aG9kcyB4bWxBY2Nlc3NNZXRob2RzID0gZ2V0WG1sQWNjZXNzTWV0aG9kcygpOwotCQlyZXR1cm4gKHhtbEFjY2Vzc01ldGhvZHMgIT0gbnVsbCkgPyB4bWxBY2Nlc3NNZXRob2RzIDogdGhpcy5idWlsZFhtbEFjY2Vzc01ldGhvZHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBidWlsZFhtbEFjY2Vzc01ldGhvZHMoKSB7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgeG1sQWNjZXNzTWV0aG9kcyA9IHRoaXMuYnVpbGRYbWxBY2Nlc3NNZXRob2RzXygpOwotCQl0aGlzLmdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0QWNjZXNzTWV0aG9kcyh4bWxBY2Nlc3NNZXRob2RzKTsKLQkJcmV0dXJuIHhtbEFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYnVpbGRYbWxBY2Nlc3NNZXRob2RzXygpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQWNjZXNzTWV0aG9kcygpOwotCX0KLQotCS8qKgotCSAqIGNsZWFyIHRoZSBYTUwgYWNjZXNzIG1ldGhvZHMgaWYgYXBwcm9wcmlhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxBY2Nlc3NNZXRob2RzSWZVbnNldCgpIHsKLQkJaWYgKHRoaXMuZ2V0WG1sQWNjZXNzTWV0aG9kcygpLmlzVW5zZXQoKSkgewotCQkJdGhpcy5nZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldEFjY2Vzc01ldGhvZHMobnVsbCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSBzdXBlci5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJc3VwZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNyZWF0ZUNvbnZlcnRlclJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUNvbnZlcnRlclJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQlzdXBlci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQl0aGlzLmNyZWF0ZUNvbnZlcnRlck1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDb252ZXJ0ZXJNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJc3VwZXIuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNyZWF0ZUNvbnZlcnRlclJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUNvbnZlcnRlclJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ29udGFpbmVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg0MTY3ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkFic3RyYWN0T3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtBY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybUNvbnZlcnRpYmxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkRlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMAotCWV4dGVuZHMgQWJzdHJhY3RPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA8WG1sRWxlbWVudENvbGxlY3Rpb24+Ci0JaW1wbGVtZW50cwotCQlFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCwKLQkJRWNsaXBzZUxpbmtPcm1Db252ZXJ0aWJsZU1hcHBpbmcsCi0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyLk93bmVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rSm9pbkZldGNoIGpvaW5GZXRjaDsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgY29udmVydGVyQ29udGFpbmVyOwotCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEVsZW1lbnRDb2xsZWN0aW9uIHJlc291cmNlTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JCXRoaXMuam9pbkZldGNoID0gbmV3IE9ybUVjbGlwc2VMaW5rSm9pbkZldGNoKHRoaXMpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5qb2luRmV0Y2guc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5qb2luRmV0Y2gudXBkYXRlKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhdHRyaWJ1dGUgdHlwZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkQXR0cmlidXRlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5nZXRBdHRyaWJ1dGVUeXBlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQXR0cmlidXRlVHlwZUluWG1sKFN0cmluZyBhdHRyaWJ1dGVUeXBlKSB7Ci0JCXRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5zZXRBdHRyaWJ1dGVUeXBlKGF0dHJpYnV0ZVR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIGZldGNoICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0pvaW5GZXRjaCBnZXRKb2luRmV0Y2goKSB7Ci0JCWlmIChnZXRKcGFQbGF0Zm9ybVZlcnNpb24oKS5nZXRWZXJzaW9uKCkuZXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzJfMCkpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiam9pbi1mZXRjaCBub3Qgc3VwcG9ydGVkIGluIEVjbGlwc2VMaW5rIDIuMCBwbGF0Zm9ybSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRoaXMuam9pbkZldGNoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXJzICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBnZXRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsKHRoaXMsIHRoaXMsIHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIGludCBnZXROdW1iZXJTdXBwb3J0ZWRDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gMjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBhZGFwdGVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBwdXQgdGhlIEVjbGlwc2VMaW5rIGNvbnZlcnQgYWRhcHRlciBmaXJzdCAtIHRoaXMgaXMgdGhlIG9yZGVyIEVjbGlwc2VMaW5rIHNlYXJjaGVzCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPE9ybUNvbnZlcnRlci5BZGFwdGVyPiBnZXRDb252ZXJ0ZXJBZGFwdGVycygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxPcm1Db252ZXJ0ZXIuQWRhcHRlcj4oCi0JCQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0LkFkYXB0ZXIuaW5zdGFuY2UoKSwKLQkJCQlzdXBlci5nZXRDb252ZXJ0ZXJBZGFwdGVycygpCi0JCQkpOwotCX0KLQotCi0JLy8qKioqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQlzdXBlci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSkKLQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQlzdXBlci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCXRoaXMuY29udmVydGVyQ29udGFpbmVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpCi0JCSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCXN1cGVyLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpLAotCQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkKLQkJKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCS8vIFRPRE8gam9pbiBmZXRjaCB2YWxpZGF0aW9uCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGVUeXBlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKHRoaXMuaXNWaXJ0dWFsQWNjZXNzKCkpIHsKLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZ2V0QXR0cmlidXRlVHlwZSgpKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9OT19BVFRSSUJVVEVfVFlQRV9TUEVDSUZJRUQsCi0JCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKLQkJCQkJCXRoaXMsCi0JCQkJCQl0aGlzLmdldEF0dHJpYnV0ZVR5cGVUZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkJKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAodGhpcy5nZXRSZXNvbHZlZEF0dHJpYnV0ZVR5cGUoKSA9PSBudWxsKSB7Ci0JCQkJSVR5cGUgamR0VHlwZSA9IEpEVFRvb2xzLmZpbmRUeXBlKHRoaXMuZ2V0SmF2YVByb2plY3QoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZEF0dHJpYnV0ZVR5cGUoKSk7Ci0JCQkJaWYgKGpkdFR5cGUgPT0gbnVsbCkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX1RZUEVfRE9FU19OT1RfRVhJU1QsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQXR0cmlidXRlVHlwZSgpfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCXRoaXMuZ2V0QXR0cmlidXRlVHlwZVRleHRSYW5nZSgpCi0JCQkJCQkpCi0JCQkJCSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIudmFsaWRhdGVBdHRyaWJ1dGVUeXBlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZpcnR1YWxBY2Nlc3MoKSB7Ci0JCXJldHVybiBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkgPT0gRWNsaXBzZUxpbmtBY2Nlc3NUeXBlLlZJUlRVQUw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRBdHRyaWJ1dGVUeXBlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5nZXRBdHRyaWJ1dGVUeXBlVGV4dFJhbmdlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT25lVG9NYW55UmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU9uZVRvTWFueVJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzlkZWYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT25lVG9NYW55UmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtT25lVG9NYW55UmVsYXRpb25zaGlwMl8wOwotCi0vKioKLSAqIFdlIG5lZWQgdGhpcyBjbGFzcyBiZWNhdXNlIHRoZSBFY2xpcHNlTGluayAxLjAgMTptIG1hcHBpbmcgc3VwcG9ydHMgYSBqb2luCi0gKiBjb2x1bW4gc3RyYXRlZ3kgd2hpbGUgSlBBIGRpZCBub3QgdW50aWwgSlBBIDIuMC4gQXMgYSByZXN1bHQsIHdlIG5lZWQgYSBjbGFzcwotICogdGhhdCBpbXBsZW1lbnRzIEVjbGlwc2VMaW5rIDEuMC4KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtT25lVG9NYW55UmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBHZW5lcmljT3JtT25lVG9NYW55UmVsYXRpb25zaGlwCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua09ybU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMAotewotCXB1YmxpYyBFY2xpcHNlTGlua09ybU9uZVRvTWFueVJlbGF0aW9uc2hpcChPcm1PbmVUb01hbnlNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQsIHRydWUpOyAgLy8gdHJ1ZT1zdXBwb3J0cyBqb2luIGNvbHVtbiBzdHJhdGVneQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGVJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjc2MmJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlNwZWNpZmllZE9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogPGNvZGU+ZWNsaXBzZWxpbmstb3JtLnhtbDwvY29kZT4gcGVyc2lzdGVudCB0eXBlOjx1bD4KLSAqIDxsaT5tYXBwaW5nCi0gKiA8bGk+YWNjZXNzCi0gKiA8bGk+YWNjZXNzLW1ldGhvZHMKLSAqIDxsaT5hdHRyaWJ1dGVzCi0gKiA8bGk+c3VwZXIgcGVyc2lzdGVudCB0eXBlCi0gKiA8bGk+SmF2YSBwZXJzaXN0ZW50IHR5cGUKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlSW1wbAotCWV4dGVuZHMgU3BlY2lmaWVkT3JtUGVyc2lzdGVudFR5cGUKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUKLXsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkR2V0TWV0aG9kOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdEdldE1ldGhvZDsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkU2V0TWV0aG9kOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFNldE1ldGhvZDsKLQotCXByb3RlY3RlZCBib29sZWFuIGR5bmFtaWM7Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZUltcGwoRW50aXR5TWFwcGluZ3MgcGFyZW50LCBYbWxUeXBlTWFwcGluZyB4bWxUeXBlTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbFR5cGVNYXBwaW5nKTsKLQkJdGhpcy5zcGVjaWZpZWRHZXRNZXRob2QgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkR2V0TWV0aG9kKCk7Ci0JCXRoaXMuc3BlY2lmaWVkU2V0TWV0aG9kID0gdGhpcy5idWlsZFNwZWNpZmllZFNldE1ldGhvZCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxUeXBlTWFwcGluZyBnZXRYbWxUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIChYbWxUeXBlTWFwcGluZykgc3VwZXIuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1UeXBlTWFwcGluZyBnZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rT3JtVHlwZU1hcHBpbmcpIHN1cGVyLmdldE1hcHBpbmcoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkR2V0TWV0aG9kXyh0aGlzLmJ1aWxkU3BlY2lmaWVkR2V0TWV0aG9kKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFNldE1ldGhvZF8odGhpcy5idWlsZFNwZWNpZmllZFNldE1ldGhvZCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHRHZXRNZXRob2QodGhpcy5idWlsZERlZmF1bHRHZXRNZXRob2QoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFNldE1ldGhvZCh0aGlzLmJ1aWxkRGVmYXVsdFNldE1ldGhvZCgpKTsKLQkJdGhpcy5zZXREeW5hbWljKHRoaXMuYnVpbGREeW5hbWljKCkpOwotCX0KLQotCi0JLy8qKioqKioqKioqKioqKiogZHluYW1pYyAqKioqKioqKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNEeW5hbWljKCkgewotCQlyZXR1cm4gdGhpcy5keW5hbWljOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldER5bmFtaWMoYm9vbGVhbiBkeW5hbWljKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5keW5hbWljOwotCQl0aGlzLmR5bmFtaWMgPSBkeW5hbWljOwotCQlpZiAodGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERZTkFNSUNfUFJPUEVSVFksIG9sZCwgdGhpcy5keW5hbWljKSkgewotCQkJLy8gY2xlYXIgb3V0IHRoZSBKYXZhIHBlcnNpc3RlbnQgdHlwZSBoZXJlLCBpdCB3aWxsIGJlIHJlYnVpbHQgZHVyaW5nICJ1cGRhdGUiCi0JCQlpZiAodGhpcy5qYXZhUGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgewotCQkJCXRoaXMuamF2YVBlcnNpc3RlbnRUeXBlLmRpc3Bvc2UoKTsKLQkJCQl0aGlzLnNldEphdmFQZXJzaXN0ZW50VHlwZShudWxsKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vQmFzZSB0aGUgZHluYW1pYyBzdGF0ZSBvbmx5IG9uIHRoZSBKYXZhUmVzb3VyY2VUeXBlIGJlaW5nIG51bGwuCi0JLy9PdGhlcndpc2UsIHRoZSBhY2Nlc3MgdHlwZSBhZmZlY3RzIHRoZSBoaWVyYXJjaHkKLQkvL2FuZCB0aGVuIHRoZSBoaWVyYXJjaHkgYWZmZWN0cyB0aGUgYWNjZXNzIHR5cGUgYW5kIHdlIGdldCBzdHVjayBpbiBhbiB1cGRhdGUuCi0JLy9WYWxpZGF0aW9uIHdpbGwgY2hlY2sgdGhhdCB2aXJ0dWFsIGFjY2VzcyBpcyBzZXQgaWYgaXQgaXMgZHluYW1pYy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZER5bmFtaWMoKSB7Ci0JCXJldHVybiBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4ubm9kZUlzRWNsaXBzZUxpbmtWZXJzaW9uQ29tcGF0aWJsZSh0aGlzLCBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfUExBVEZPUk1fVkVSU0lPTl8yXzEpCi0JCQkmJiB0aGlzLnJlc29sdmVKYXZhUmVzb3VyY2VUeXBlKCkgPT0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZpcnR1YWxBY2Nlc3MoKSB7Ci0JCXJldHVybiB0aGlzLmdldEFjY2VzcygpID09IEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUoKSB7Ci0JCWlmICh0aGlzLmlzRHluYW1pYygpKSB7Ci0JCQlyZXR1cm4gdGhpcy5idWlsZFZpcnR1YWxKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIGJ1aWxkVmlydHVhbEphdmFQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsSmF2YVBlcnNpc3RlbnRUeXBlKHRoaXMsIHRoaXMuZ2V0WG1sVHlwZU1hcHBpbmcoKSk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUGVyc2lzdGVudFR5cGUgZ2V0T3ZlcnJpZGRlblBlcnNpc3RlbnRUeXBlKCkgewotCQlpZiAodGhpcy5pc0R5bmFtaWMoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldE92ZXJyaWRkZW5QZXJzaXN0ZW50VHlwZSgpOwotCX0KLQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGFkZFZpcnR1YWxBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBtYXBwaW5nS2V5LCBTdHJpbmcgYXR0cmlidXRlVHlwZSkgewotCQkvLyBmb3JjZSB0aGUgY3JlYXRpb24gb2YgYW4gZW1wdHkgeG1sIGF0dHJpYnV0ZSBjb250YWluZXIgYmVmb3JlaGFuZCBvciBpdCB3aWxsIHRyaWdnZXIKLQkJLy8gYSBzeW5jIGFuZCwgaWYgd2UgZG8gdGhpcyBhZnRlciBhZGRpbmcgdGhlIGF0dHJpYnV0ZSwgY2xlYXIgb3V0IG91ciBjb250ZXh0IGF0dHJpYnV0ZXMKLQkJQXR0cmlidXRlcyB4bWxBdHRyaWJ1dGVzID0gdGhpcy5nZXRYbWxBdHRyaWJ1dGVzRm9yVXBkYXRlKCk7Ci0JCXRoaXMuZ2V0WG1sVHlwZU1hcHBpbmcoKS5zZXRBdHRyaWJ1dGVzKHhtbEF0dHJpYnV0ZXMpOyAgLy8gcG9zc2libHkgYSBOT1AKLQotCQlPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBtZCA9IHRoaXMuZ2V0TWFwcGluZ0ZpbGVEZWZpbml0aW9uKCkuZ2V0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24obWFwcGluZ0tleSk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBtZC5idWlsZFJlc291cmNlTWFwcGluZyh0aGlzLmdldFJlc291cmNlTm9kZUZhY3RvcnkoKSk7Ci0JCXhtbE1hcHBpbmcuc2V0TmFtZShhdHRyaWJ1dGVOYW1lKTsKLQkJeG1sTWFwcGluZy5zZXRBdHRyaWJ1dGVUeXBlKGF0dHJpYnV0ZVR5cGUpOwotCQlpZiAodGhpcy5nZXRBY2Nlc3MoKSAhPSBFY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCkgewotCQkJeG1sTWFwcGluZy5zZXRBY2Nlc3MoRWNsaXBzZUxpbmtBY2Nlc3NUeXBlLlZJUlRVQUwuZ2V0T3JtQWNjZXNzVHlwZSgpKTsKLQkJfQotCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkQXR0cmlidXRlID0gdGhpcy5idWlsZFNwZWNpZmllZEF0dHJpYnV0ZSh4bWxNYXBwaW5nKTsKLQkJLy8gd2UgbmVlZCB0byBhZGQgdGhlIGF0dHJpYnV0ZSB0byB0aGUgcmlnaHQgc3BvdCBpbiB0aGUgbGlzdCAtIHN0dXBpZCBzcGVjLi4uCi0JCWludCBzcGVjaWZpZWRJbmRleCA9IHRoaXMuZ2V0U3BlY2lmaWVkQXR0cmlidXRlSW5zZXJ0aW9uSW5kZXgoc3BlY2lmaWVkQXR0cmlidXRlKTsKLQkJdGhpcy5hZGRJdGVtVG9MaXN0KHNwZWNpZmllZEluZGV4LCBzcGVjaWZpZWRBdHRyaWJ1dGUsIHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlcywgU1BFQ0lGSUVEX0FUVFJJQlVURVNfTElTVCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuYWRkWG1sQXR0cmlidXRlTWFwcGluZ1RvKHhtbEF0dHJpYnV0ZXMpOwotCi0JCXJldHVybiBzcGVjaWZpZWRBdHRyaWJ1dGU7Ci0JfQotCi0JLy8qKioqKioqKioqKioqKiogZ2V0IG1ldGhvZCAqKioqKioqKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRHZXRNZXRob2QoKSB7Ci0JCVN0cmluZyBzcGVjaWZpZWRHZXRNZXRob2QgPSB0aGlzLmdldFNwZWNpZmllZEdldE1ldGhvZCgpOwotCQlyZXR1cm4gKHNwZWNpZmllZEdldE1ldGhvZCAhPSBudWxsKSA/IHNwZWNpZmllZEdldE1ldGhvZCA6IHRoaXMuZGVmYXVsdEdldE1ldGhvZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRHZXRNZXRob2QoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRHZXRNZXRob2Q7Ci0JfQotCi0JLy9UT0RPIGdldCB0aGUgZGVmYXVsdCBnZXQgbWV0aG9kIGZyb20gdGhlIGphdmEgVmlydHVhbEFjY2Vzc01ldGhvZHMgYW5ub3RhdGlvbiBhbmQgZnJvbSB0aGUgc3VwZXIgdHlwZQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0R2V0TWV0aG9kKCkgewotCQlpZiAoZ2V0QWNjZXNzKCkgPT0gRWNsaXBzZUxpbmtBY2Nlc3NUeXBlLlZJUlRVQUwpIHsKLQkJCVN0cmluZyBkZWZhdWx0R2V0TWV0aG9kID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0R2V0TWV0aG9kKCk7Ci0JCQlyZXR1cm4gZGVmYXVsdEdldE1ldGhvZCAhPSBudWxsID8gZGVmYXVsdEdldE1ldGhvZCA6IERFRkFVTFRfR0VUX01FVEhPRDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0R2V0TWV0aG9kKFN0cmluZyBnZXRNZXRob2QpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdEdldE1ldGhvZDsKLQkJdGhpcy5kZWZhdWx0R2V0TWV0aG9kID0gZ2V0TWV0aG9kOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9HRVRfTUVUSE9EX1BST1BFUlRZLCBvbGQsIGdldE1ldGhvZCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRHZXRNZXRob2QoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEdldE1ldGhvZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRHZXRNZXRob2QoU3RyaW5nIGdldE1ldGhvZCkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRHZXRNZXRob2QsIGdldE1ldGhvZCkpIHsKLQkJCVhtbEFjY2Vzc01ldGhvZHMgeG1sQWNjZXNzTWV0aG9kcyA9IHRoaXMuZ2V0WG1sQWNjZXNzTWV0aG9kc0ZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRHZXRNZXRob2RfKGdldE1ldGhvZCk7Ci0JCQl4bWxBY2Nlc3NNZXRob2RzLnNldEdldE1ldGhvZChnZXRNZXRob2QpOwotCQkJdGhpcy5yZW1vdmVYbWxBY2Nlc3NNZXRob2RzSWZVbnNldCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkR2V0TWV0aG9kXyhTdHJpbmcgZ2V0TWV0aG9kKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZEdldE1ldGhvZDsKLQkJdGhpcy5zcGVjaWZpZWRHZXRNZXRob2QgPSBnZXRNZXRob2Q7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfR0VUX01FVEhPRF9QUk9QRVJUWSwgb2xkLCBnZXRNZXRob2QpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRHZXRNZXRob2QoKSB7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kcyA9IHRoaXMuZ2V0WG1sQWNjZXNzTWV0aG9kcygpOwotCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsID8gYWNjZXNzTWV0aG9kcy5nZXRHZXRNZXRob2QoKSA6IG51bGw7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKioqKiBzZXQgbWV0aG9kICoqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFNldE1ldGhvZCgpIHsKLQkJU3RyaW5nIHNwZWNpZmllZFNldE1ldGhvZCA9IHRoaXMuZ2V0U3BlY2lmaWVkU2V0TWV0aG9kKCk7Ci0JCXJldHVybiAoc3BlY2lmaWVkU2V0TWV0aG9kICE9IG51bGwpID8gc3BlY2lmaWVkU2V0TWV0aG9kIDogdGhpcy5kZWZhdWx0U2V0TWV0aG9kOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNldE1ldGhvZCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFNldE1ldGhvZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2V0TWV0aG9kKFN0cmluZyBzZXRNZXRob2QpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFNldE1ldGhvZDsKLQkJdGhpcy5kZWZhdWx0U2V0TWV0aG9kID0gc2V0TWV0aG9kOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9TRVRfTUVUSE9EX1BST1BFUlRZLCBvbGQsIHNldE1ldGhvZCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRTZXRNZXRob2QoKSB7Ci0JCWlmIChnZXRBY2Nlc3MoKSA9PSBFY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCkgewotCQkJLy9UT0RPIGdldCB0aGUgZGVmYXVsdCBzZXQgbWV0aG9kIGZyb20gdGhlIGphdmEgVmlydHVhbEFjY2Vzc01ldGhvZHMgYW5ub3RhdGlvbi9zdXBlciBwZXJzaXN0ZW50IHR5cGUsIGVtYmVkZGVkIHBhcmVudCwgZXRjCi0JCQlTdHJpbmcgZGVmYXVsdFNldE1ldGhvZCA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdFNldE1ldGhvZCgpOwotCQkJcmV0dXJuIGRlZmF1bHRTZXRNZXRob2QgIT0gbnVsbCA/IGRlZmF1bHRTZXRNZXRob2QgOiBERUZBVUxUX1NFVF9NRVRIT0Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRTZXRNZXRob2QoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFNldE1ldGhvZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTZXRNZXRob2QoU3RyaW5nIHNldE1ldGhvZCkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRTZXRNZXRob2QsIHNldE1ldGhvZCkpIHsKLQkJCVhtbEFjY2Vzc01ldGhvZHMgeG1sQWNjZXNzTWV0aG9kcyA9IHRoaXMuZ2V0WG1sQWNjZXNzTWV0aG9kc0ZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRTZXRNZXRob2RfKHNldE1ldGhvZCk7Ci0JCQl4bWxBY2Nlc3NNZXRob2RzLnNldFNldE1ldGhvZChzZXRNZXRob2QpOwotCQkJdGhpcy5yZW1vdmVYbWxBY2Nlc3NNZXRob2RzSWZVbnNldCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2V0TWV0aG9kXyhTdHJpbmcgc2V0TWV0aG9kKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFNldE1ldGhvZDsKLQkJdGhpcy5zcGVjaWZpZWRTZXRNZXRob2QgPSBzZXRNZXRob2Q7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0VUX01FVEhPRF9QUk9QRVJUWSwgb2xkLCBzZXRNZXRob2QpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRTZXRNZXRob2QoKSB7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kcyA9IHRoaXMuZ2V0WG1sQWNjZXNzTWV0aG9kcygpOwotCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsID8gYWNjZXNzTWV0aG9kcy5nZXRTZXRNZXRob2QoKSA6IG51bGw7Ci0JfQotCi0JLy8qKioqKioqKioqKioqKiogWE1MIGFjY2VzcyBtZXRob2RzICoqKioqKioqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kc0hvbGRlciBnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRYbWxUeXBlTWFwcGluZygpOwotCX0KLQotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGdldFhtbEFjY2Vzc01ldGhvZHMoKSB7Ci0JCXJldHVybiBnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCkuZ2V0QWNjZXNzTWV0aG9kcygpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIHRoZSBYTUwgYWNjZXNzIG1ldGhvZHMgKGFuZCBYTUwgZGVmYXVsdHMgYW5kIFhNTCBtZXRhZGF0YSBpZiBuZWNlc3NhcnkpIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGdldFhtbEFjY2Vzc01ldGhvZHNGb3JVcGRhdGUoKSB7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgeG1sQWNjZXNzTWV0aG9kcyA9IHRoaXMuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcigpLmdldEFjY2Vzc01ldGhvZHMoKTsKLQkJcmV0dXJuICh4bWxBY2Nlc3NNZXRob2RzICE9IG51bGwpID8geG1sQWNjZXNzTWV0aG9kcyA6IHRoaXMuYnVpbGRYbWxBY2Nlc3NNZXRob2RzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYnVpbGRYbWxBY2Nlc3NNZXRob2RzKCkgewotCQlYbWxBY2Nlc3NNZXRob2RzIHhtbEFjY2Vzc01ldGhvZHMgPSB0aGlzLmJ1aWxkWG1sQWNjZXNzTWV0aG9kc18oKTsKLQkJdGhpcy5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCkuc2V0QWNjZXNzTWV0aG9kcyh4bWxBY2Nlc3NNZXRob2RzKTsKLQkJcmV0dXJuIHhtbEFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYnVpbGRYbWxBY2Nlc3NNZXRob2RzXygpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQWNjZXNzTWV0aG9kcygpOwotCX0KLQotCS8qKgotCSAqIGNsZWFyIHRoZSBYTUwgYWNjZXNzIG1ldGhvZHMgaWYgYXBwcm9wcmlhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxBY2Nlc3NNZXRob2RzSWZVbnNldCgpIHsKLQkJaWYgKHRoaXMuZ2V0WG1sQWNjZXNzTWV0aG9kcygpLmlzVW5zZXQoKSkgewotCQkJdGhpcy5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCkuc2V0QWNjZXNzTWV0aG9kcyhudWxsKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGdldEVudGl0eU1hcHBpbmdzKCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MpIHN1cGVyLmdldEVudGl0eU1hcHBpbmdzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDbGFzcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAodGhpcy5pc0R5bmFtaWMoKSAmJiAhdGhpcy5pc1ZpcnR1YWxBY2Nlc3MoKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9UWVBFX1VOUkVTT0xWRURfQ0xBU1MsCi0JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAotCQkJCQl0aGlzLAotCQkJCQl0aGlzLm1hcHBpbmcuZ2V0Q2xhc3NUZXh0UmFuZ2UoKQotCQkJCSkKLQkJCSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2Mzc1NjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkFic3RyYWN0T3JtTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMzsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW4KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMwotCWV4dGVuZHMgQWJzdHJhY3RPcm1OYW1lZERpc2NyaW1pbmF0b3JDb2x1bW48WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMsIE9ybVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5Pd25lcj4KLQlpbXBsZW1lbnRzIE9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMKLXsKLQlwcm90ZWN0ZWQgWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMgeG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkVGFibGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VGFibGU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZENvbnRleHRQcm9wZXJ0eTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDb250ZXh0UHJvcGVydHk7Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRQcmltYXJ5S2V5OwotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRQcmltYXJ5S2V5ID0gREVGQVVMVF9QUklNQVJZX0tFWTsKLQotCXB1YmxpYyBFY2xpcHNlTGlua09ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBPcm1SZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuT3duZXIgb3duZXIsIFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zIGNvbHVtbikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyLCBjb2x1bW4pOwotCQl0aGlzLnNwZWNpZmllZFRhYmxlID0gdGhpcy5idWlsZFNwZWNpZmllZFRhYmxlKCk7Ci0JCXRoaXMuc3BlY2lmaWVkQ29udGV4dFByb3BlcnR5ID0gdGhpcy5idWlsZFNwZWNpZmllZENvbnRleHRQcm9wZXJ0eSgpOwotCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXkgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkUHJpbWFyeUtleSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZFRhYmxlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkVGFibGUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQ29udGV4dFByb3BlcnR5Xyh0aGlzLmJ1aWxkU3BlY2lmaWVkQ29udGV4dFByb3BlcnR5KCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFByaW1hcnlLZXlfKHRoaXMuYnVpbGRTcGVjaWZpZWRQcmltYXJ5S2V5KCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdFRhYmxlKHRoaXMuYnVpbGREZWZhdWx0VGFibGUoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdENvbnRleHRQcm9wZXJ0eSh0aGlzLmJ1aWxkRGVmYXVsdENvbnRleHRQcm9wZXJ0eSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0UHJpbWFyeUtleSh0aGlzLmJ1aWxkRGVmYXVsdFByaW1hcnlLZXkoKSk7Ci0JfQotCi0KLQotCS8vICoqKioqKioqKiogWE1MIGNvbHVtbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMgZ2V0WG1sQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy54bWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFhtbENvbHVtbihYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMyB4bWxDb2x1bW4pIHsKLQkJdGhpcy54bWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uID0geG1sQ29sdW1uOwotCX0KLQotCS8qKgotCSAqIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMgYXJlIHBhcnQgb2YgYSBjb2xsZWN0aW9uOwotCSAqIHRoZSAndGVuYW50LWRpc2NyaW1pbmF0b3ItY29sdW1uJyBlbGVtZW50IHdpbGwgYmUgcmVtb3ZlZC9hZGRlZAotCSAqIHdoZW4gdGhlIFhNTCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW4gaXMgcmVtb3ZlZCBmcm9tL2FkZGVkIHRvCi0JICogdGhlIG93bmVyJ3MgY29sbGVjdGlvbgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uIGJ1aWxkWG1sQ29sdW1uKCkgewotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJYTUwgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uIGlzIG1pc3NpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgI2J1aWxkWG1sQ29sdW1uKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxDb2x1bW4oKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGFibGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFRhYmxlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRUYWJsZSA6IHRoaXMuZGVmYXVsdFRhYmxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFRhYmxlKFN0cmluZyB0YWJsZSkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRUYWJsZSwgdGFibGUpKSB7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFRhYmxlXyh0YWJsZSk7Ci0JCQl0aGlzLnhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4uc2V0VGFibGUodGFibGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVGFibGVfKFN0cmluZyB0YWJsZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRUYWJsZTsKLQkJdGhpcy5zcGVjaWZpZWRUYWJsZSA9IHRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1RBQkxFX1BST1BFUlRZLCBvbGQsIHRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkVGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy54bWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uID09IG51bGwpID8gbnVsbCA6IHRoaXMueG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbi5nZXRUYWJsZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VGFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFRhYmxlKFN0cmluZyB0YWJsZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0VGFibGU7Ci0JCXRoaXMuZGVmYXVsdFRhYmxlID0gdGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1RBQkxFX1BST1BFUlRZLCBvbGQsIHRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXREZWZhdWx0VGFibGVOYW1lKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb250ZXh0UHJvcGVydHkgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZXh0UHJvcGVydHkoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRDb250ZXh0UHJvcGVydHkgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZENvbnRleHRQcm9wZXJ0eSA6IHRoaXMuZGVmYXVsdENvbnRleHRQcm9wZXJ0eTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZENvbnRleHRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ29udGV4dFByb3BlcnR5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZENvbnRleHRQcm9wZXJ0eShTdHJpbmcgY29udGV4dFByb3BlcnR5KSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnNwZWNpZmllZENvbnRleHRQcm9wZXJ0eSwgY29udGV4dFByb3BlcnR5KSkgewotCQkJdGhpcy5zZXRTcGVjaWZpZWRDb250ZXh0UHJvcGVydHlfKGNvbnRleHRQcm9wZXJ0eSk7Ci0JCQl0aGlzLnhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4uc2V0Q29udGV4dFByb3BlcnR5KGNvbnRleHRQcm9wZXJ0eSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRDb250ZXh0UHJvcGVydHlfKFN0cmluZyBjb250ZXh0UHJvcGVydHkpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkQ29udGV4dFByb3BlcnR5OwotCQl0aGlzLnNwZWNpZmllZENvbnRleHRQcm9wZXJ0eSA9IGNvbnRleHRQcm9wZXJ0eTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DT05URVhUX1BST1BFUlRZX1BST1BFUlRZLCBvbGQsIGNvbnRleHRQcm9wZXJ0eSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZENvbnRleHRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuICh0aGlzLnhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4gPT0gbnVsbCkgPyBudWxsIDogdGhpcy54bWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uLmdldENvbnRleHRQcm9wZXJ0eSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbnRleHRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdENvbnRleHRQcm9wZXJ0eTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q29udGV4dFByb3BlcnR5KFN0cmluZyBjb250ZXh0UHJvcGVydHkpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdENvbnRleHRQcm9wZXJ0eTsKLQkJdGhpcy5kZWZhdWx0Q29udGV4dFByb3BlcnR5ID0gY29udGV4dFByb3BlcnR5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9DT05URVhUX1BST1BFUlRZX1BST1BFUlRZLCBvbGQsIGNvbnRleHRQcm9wZXJ0eSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRDb250ZXh0UHJvcGVydHkoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmdldERlZmF1bHRDb250ZXh0UHJvcGVydHlOYW1lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW1hcnlLZXkgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5S2V5KCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleS5ib29sZWFuVmFsdWUoKSA6IHRoaXMuaXNEZWZhdWx0UHJpbWFyeUtleSgpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZFByaW1hcnlLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUHJpbWFyeUtleShCb29sZWFuIHByaW1hcnlLZXkpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleSwgcHJpbWFyeUtleSkpIHsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkUHJpbWFyeUtleV8ocHJpbWFyeUtleSk7Ci0JCQl0aGlzLnhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4uc2V0UHJpbWFyeUtleShwcmltYXJ5S2V5KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFByaW1hcnlLZXlfKEJvb2xlYW4gcHJpbWFyeUtleSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleTsKLQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5ID0gcHJpbWFyeUtleTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9QUklNQVJZX0tFWV9QUk9QRVJUWSwgb2xkLCBwcmltYXJ5S2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZFByaW1hcnlLZXkoKSB7Ci0JCXJldHVybiAodGhpcy54bWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uID09IG51bGwpID8gbnVsbCA6IHRoaXMueG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbi5nZXRQcmltYXJ5S2V5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0UHJpbWFyeUtleSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFByaW1hcnlLZXk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFByaW1hcnlLZXkoYm9vbGVhbiBkZWZhdWx0UHJpbWFyeUtleSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuZGVmYXVsdFByaW1hcnlLZXk7Ci0JCXRoaXMuZGVmYXVsdFByaW1hcnlLZXkgPSBkZWZhdWx0UHJpbWFyeUtleTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfUFJJTUFSWV9LRVlfUFJPUEVSVFksIG9sZCwgZGVmYXVsdFByaW1hcnlLZXkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVmYXVsdFByaW1hcnlLZXkoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmdldERlZmF1bHRQcmltYXJ5S2V5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZCgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIudGFibGVOYW1lSXNJbnZhbGlkKHRoaXMuZ2V0VGFibGUoKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUYWJsZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLmdldFhtbENvbHVtblRhYmxlVGV4dFJhbmdlKCkpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0WG1sQ29sdW1uVGFibGVUZXh0UmFuZ2UoKSB7Ci0JCVhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zIHhtbENvbHVtbiA9IHRoaXMuZ2V0WG1sQ29sdW1uKCk7Ci0JCXJldHVybiAoeG1sQ29sdW1uID09IG51bGwpID8gbnVsbCA6IHhtbENvbHVtbi5nZXRUYWJsZVRleHRSYW5nZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoKSB7Ci0JCXJldHVybiBuZXcgT3JtVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcih0aGlzKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFhtbENvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcykgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldFhtbENvbXBsZXRpb25Qcm9wb3NhbHMocG9zKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWlmICh0aGlzLnRhYmxlVG91Y2hlcyhwb3MpKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGFibGVUb3VjaGVzKGludCBwb3MpIHsKLQkJcmV0dXJuIHRoaXMueG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbi50YWJsZVRvdWNoZXMocG9zKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVRpbWVPZkRheS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1UaW1lT2ZEYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ2ZmQ1Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVRpbWVPZkRheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUaW1lT2ZEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtVGltZU9mRGF5Ci0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1RpbWVPZkRheQotewotCXByb3RlY3RlZCBmaW5hbCBYbWxUaW1lT2ZEYXkgeG1sVGltZU9mRGF5OwotCi0JcHJvdGVjdGVkIEludGVnZXIgaG91cjsKLQlwcm90ZWN0ZWQgSW50ZWdlciBtaW51dGU7Ci0JcHJvdGVjdGVkIEludGVnZXIgc2Vjb25kOwotCXByb3RlY3RlZCBJbnRlZ2VyIG1pbGxpc2Vjb25kOwotCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1UaW1lT2ZEYXkoT3JtRWNsaXBzZUxpbmtDYWNoaW5nIHBhcmVudCwgWG1sVGltZU9mRGF5IHhtbFRpbWVPZkRheSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnhtbFRpbWVPZkRheSA9IHhtbFRpbWVPZkRheTsKLQkJdGhpcy5ob3VyID0geG1sVGltZU9mRGF5LmdldEhvdXIoKTsKLQkJdGhpcy5taW51dGUgPSB4bWxUaW1lT2ZEYXkuZ2V0TWludXRlKCk7Ci0JCXRoaXMuc2Vjb25kID0geG1sVGltZU9mRGF5LmdldFNlY29uZCgpOwotCQl0aGlzLm1pbGxpc2Vjb25kID0geG1sVGltZU9mRGF5LmdldE1pbGxpc2Vjb25kKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0SG91cl8odGhpcy54bWxUaW1lT2ZEYXkuZ2V0SG91cigpKTsKLQkJdGhpcy5zZXRNaW51dGVfKHRoaXMueG1sVGltZU9mRGF5LmdldE1pbnV0ZSgpKTsKLQkJdGhpcy5zZXRTZWNvbmRfKHRoaXMueG1sVGltZU9mRGF5LmdldFNlY29uZCgpKTsKLQkJdGhpcy5zZXRNaWxsaXNlY29uZF8odGhpcy54bWxUaW1lT2ZEYXkuZ2V0TWlsbGlzZWNvbmQoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGhvdXIgKioqKioqKioqKgotCi0JcHVibGljIEludGVnZXIgZ2V0SG91cigpIHsKLQkJcmV0dXJuIHRoaXMuaG91cjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIb3VyKEludGVnZXIgaG91cikgewotCQl0aGlzLnNldEhvdXJfKGhvdXIpOwotCQl0aGlzLnhtbFRpbWVPZkRheS5zZXRIb3VyKGhvdXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEhvdXJfKEludGVnZXIgaG91cikgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuaG91cjsKLQkJdGhpcy5ob3VyID0gaG91cjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEhPVVJfUFJPUEVSVFksIG9sZCwgaG91cik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pbnV0ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgSW50ZWdlciBnZXRNaW51dGUoKSB7Ci0JCXJldHVybiB0aGlzLm1pbnV0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNaW51dGUoSW50ZWdlciBtaW51dGUpIHsKLQkJdGhpcy5zZXRNaW51dGVfKG1pbnV0ZSk7Ci0JCXRoaXMueG1sVGltZU9mRGF5LnNldE1pbnV0ZShtaW51dGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE1pbnV0ZV8oSW50ZWdlciBtaW51dGUpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLm1pbnV0ZTsKLQkJdGhpcy5taW51dGUgPSBtaW51dGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNSU5VVEVfUFJPUEVSVFksIG9sZCwgbWludXRlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2Vjb25kICoqKioqKioqKioKLQotCXB1YmxpYyBJbnRlZ2VyIGdldFNlY29uZCgpIHsKLQkJcmV0dXJuIHRoaXMuc2Vjb25kOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlY29uZChJbnRlZ2VyIHNlY29uZCkgewotCQl0aGlzLnNldFNlY29uZF8oc2Vjb25kKTsKLQkJdGhpcy54bWxUaW1lT2ZEYXkuc2V0U2Vjb25kKHNlY29uZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2Vjb25kXyhJbnRlZ2VyIHNlY29uZCkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuc2Vjb25kOwotCQl0aGlzLnNlY29uZCA9IHNlY29uZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNFQ09ORF9QUk9QRVJUWSwgb2xkLCBzZWNvbmQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaWxsaXNlY29uZCAqKioqKioqKioqCi0KLQlwdWJsaWMgSW50ZWdlciBnZXRNaWxsaXNlY29uZCgpIHsKLQkJcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWlsbGlzZWNvbmQoSW50ZWdlciBtaWxsaXNlY29uZCkgewotCQl0aGlzLnNldE1pbGxpc2Vjb25kXyhtaWxsaXNlY29uZCk7Ci0JCXRoaXMueG1sVGltZU9mRGF5LnNldE1pbGxpc2Vjb25kKG1pbGxpc2Vjb25kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNaWxsaXNlY29uZF8oSW50ZWdlciBtaWxsaXNlY29uZCkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMubWlsbGlzZWNvbmQ7Ci0JCXRoaXMubWlsbGlzZWNvbmQgPSBtaWxsaXNlY29uZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1JTExJU0VDT05EX1BST1BFUlRZLCBvbGQsIG1pbGxpc2Vjb25kKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1FY2xpcHNlTGlua0NhY2hpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0NhY2hpbmcgZ2V0Q2FjaGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIFhtbFRpbWVPZkRheSBnZXRYbWxUaW1lT2ZEYXkoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFRpbWVPZkRheTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLnhtbFRpbWVPZkRheS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRDYWNoaW5nKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMV8xRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWwxXzFEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNjM2YjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWwxXzFEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sMV8xRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1YbWxEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rT3JtWG1sMV8xRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1YbWxEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1YbWwxXzFEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMV9SRVNPVVJDRV9UWVBFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgYnVpbGRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24uaW5zdGFuY2UoKS5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8T3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIEVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbi5FQ0xJUFNFTElOS19BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDFfMkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMV8yRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzUyN2JlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMV8yRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbDFfMkRlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0RWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtWG1sRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua09ybVhtbDFfMkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtWG1sRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rT3JtWG1sMV8yRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMl9SRVNPVVJDRV9UWVBFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgYnVpbGRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24uaW5zdGFuY2UoKS5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8T3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIEVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbi5FQ0xJUFNFTElOS19BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ0ZTg1ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT3JkZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtT3JkZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkdlbmVyaWNPcm1DYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm0uR2VuZXJpY09ybUNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybS5HZW5lcmljT3JtRGVyaXZlZElkZW50aXR5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkdlbmVyaWNPcm1OYW1lZFF1ZXJ5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkdlbmVyaWNPcm1PcmRlckNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybS5HZW5lcmljT3JtT3JwaGFuUmVtb3ZhbDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybS5HZW5lcmljT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlcmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1DYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1EZXJpdmVkSWRlbnRpdHkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcmRlckNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcmRlcmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeQotCWV4dGVuZHMgRWNsaXBzZUxpbmtPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkKLQlpbXBsZW1lbnRzIE9ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeQotewkKLQotCXB1YmxpYyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcihPcm1FbWJlZGRlZE1hcHBpbmcyXzAgcGFyZW50LCBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyMl8wLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIocGFyZW50LCBvd25lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1TZXF1ZW5jZUdlbmVyYXRvciBidWlsZE9ybVNlcXVlbmNlR2VuZXJhdG9yKFhtbENvbnRleHROb2RlIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvciByZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yMl8wKHBhcmVudCwgcmVzb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcik7Ci0JfQotCQotCXB1YmxpYyBPcm1EZXJpdmVkSWRlbnRpdHkyXzAgYnVpbGRPcm1EZXJpdmVkSWRlbnRpdHkoT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtRGVyaXZlZElkZW50aXR5Ml8wKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgYnVpbGRPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24gcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAocGFyZW50LCAoWG1sRWxlbWVudENvbGxlY3Rpb24pIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyBPcm1DYWNoZWFibGUyXzAgYnVpbGRPcm1DYWNoZWFibGUoT3JtQ2FjaGVhYmxlSG9sZGVyMl8wIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1DYWNoZWFibGUyXzAocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybU9ycGhhblJlbW92YWJsZTJfMCBidWlsZE9ybU9ycGhhblJlbW92YWwoT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtT3JwaGFuUmVtb3ZhbDJfMChwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1OYW1lZFF1ZXJ5IGJ1aWxkT3JtTmFtZWRRdWVyeShYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbE5hbWVkUXVlcnkgcmVzb3VyY2VOYW1lZFF1ZXJ5KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybU5hbWVkUXVlcnkyXzAocGFyZW50LCByZXNvdXJjZU5hbWVkUXVlcnkpOwotCX0KLQotCXB1YmxpYyBPcm1Db2xsZWN0aW9uVGFibGUyXzAgYnVpbGRPcm1Db2xsZWN0aW9uVGFibGUoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHBhcmVudCwgVGFibGUuT3duZXIgb3duZXIpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtQ29sbGVjdGlvblRhYmxlMl8wKHBhcmVudCwgb3duZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1PcmRlcmFibGUgYnVpbGRPcm1PcmRlcmFibGUoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1c2UgI2J1aWxkT3JtT3JkZXJhYmxlKE9ybUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBPcmRlcmFibGUyXzAuT3duZXIgb3duZXIpIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgT3JtT3JkZXJhYmxlMl8wIGJ1aWxkT3JtT3JkZXJhYmxlKE9ybUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBPcmRlcmFibGUyXzAuT3duZXIgb3duZXIpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtT3JkZXJhYmxlKHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlwdWJsaWMgT3JtT3JkZXJDb2x1bW4yXzAgYnVpbGRPcm1PcmRlckNvbHVtbihPcm1PcmRlcmFibGUyXzAgcGFyZW50LCBPcm1PcmRlckNvbHVtbjJfMC5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1PcmRlckNvbHVtbjJfMChwYXJlbnQsIG93bmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDJfMERlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8wRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2Q3NmVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8wRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5OdWxsT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm0uT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbDJfMERlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0RWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtWG1sRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua09ybVhtbDJfMERlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtWG1sRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rT3JtWG1sMl8wRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzJfMF9SRVNPVVJDRV9UWVBFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgYnVpbGRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3RvcnkoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8T3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIEVDTElQU0VMSU5LXzJfMF9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLyoqCi0JICogT3JkZXIgc2hvdWxkIG5vdCBtYXR0ZXIgaGVyZTsgYnV0IHdlJ2xsIHVzZSB0aGUgc2FtZSBvcmRlciBhcyBmb3IgSmF2YS4KLQkgKiBAc2VlIEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1Qcm92aWRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBFQ0xJUFNFTElOS18yXzBfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMgPSBuZXcgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCU9ybVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1WZXJzaW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1FbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJTnVsbE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzFDb250ZXh0Tm9kZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8xQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YWM3MzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzFDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcDsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sMl8xQ29udGV4dE5vZGVGYWN0b3J5Ci0JZXh0ZW5kcyBFY2xpcHNlTGlua09ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeQotewotCi0JQE92ZXJyaWRlCi0JcHVibGljIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nIGJ1aWxkT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxCYXNpY0NvbGxlY3Rpb24gcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nMl8xKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZyBidWlsZE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxCYXNpY01hcCByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzJfMShwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzFEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDJfMURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI1ZjE2MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDJfMURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwyXzFEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybVhtbERlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtPcm1YbWwyXzFEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybVhtbERlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09ybVhtbDJfMURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8yXzFfUkVTT1VSQ0VfVFlQRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGJ1aWxkQ29udGV4dE5vZGVGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtWG1sMl8xQ29udGV4dE5vZGVGYWN0b3J5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBFY2xpcHNlTGlua09ybVhtbDJfMERlZmluaXRpb24uRUNMSVBTRUxJTktfMl8wX0FUVFJJQlVURV9NQVBQSU5HX0RFRklOSVRJT05TKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDJfMkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8yRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjlhNDJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8yRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sMl8yRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1YbWxEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgRWNsaXBzZUxpbmtPcm1YbWwyXzJEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1YbWxEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09ybVhtbDJfMkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBidWlsZENvbnRleHROb2RlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtWG1sMl8xRGVmaW5pdGlvbi5pbnN0YW5jZSgpLmdldENvbnRleHROb2RlRmFjdG9yeSgpOwotCX0KLQkKLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzJfMl9SRVNPVVJDRV9UWVBFOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8T3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIEVjbGlwc2VMaW5rT3JtWG1sMl8wRGVmaW5pdGlvbi5FQ0xJUFNFTElOS18yXzBfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8zQ29udGV4dE5vZGVGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDJfM0NvbnRleHROb2RlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWJiZWI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8zQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXJyYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3R1cmU7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbDJfM0NvbnRleHROb2RlRmFjdG9yeQotCWV4dGVuZHMgRWNsaXBzZUxpbmtPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3RvcnkKLXsKLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0FycmF5TWFwcGluZzJfMyBidWlsZE9ybUVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxBcnJheSByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0FycmF5TWFwcGluZzJfMyhwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfMyBidWlsZE9ybUVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sU3RydWN0dXJlIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfMyhwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDJfM0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8zRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjg2NDI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8zRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uTnVsbE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwyXzNEZWZpbml0aW9uCi0JCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybVhtbERlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtPcm1YbWwyXzNEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1YbWxEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09ybVhtbDJfM0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8yXzNfUkVTT1VSQ0VfVFlQRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGJ1aWxkQ29udGV4dE5vZGVGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtWG1sMl8zQ29udGV4dE5vZGVGYWN0b3J5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBFQ0xJUFNFTElOS18yXzNfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8qKgotCSAqIE9yZGVyIHNob3VsZCBub3QgbWF0dGVyIGhlcmU7IGJ1dCB3ZSdsbCB1c2UgdGhlIHNhbWUgb3JkZXIgYXMgZm9yIEphdmEuCi0JICogQHNlZSBFY2xpcHNlTGluazJfM0pwYVBsYXRmb3JtUHJvdmlkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gRUNMSVBTRUxJTktfMl8zX0FUVFJJQlVURV9NQVBQSU5HX0RFRklOSVRJT05TID0gbmV3IE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQlPcm1UcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1FY2xpcHNlTGlua0FycmF5TWFwcGluZzJfM0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1JZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1CYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybUVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfM0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1FbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1NYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1PbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1PbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU51bGxPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpCi0JfTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDJfNERlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl80RGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjg2ZmIwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl80RGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbDJfNERlZmluaXRpb24KLQkJZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbiB7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1YbWxEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rT3JtWG1sMl80RGVmaW5pdGlvbigpOwotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybVhtbERlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09ybVhtbDJfNERlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzJfNF9SRVNPVVJDRV9UWVBFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgYnVpbGRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVhtbDJfM0RlZmluaXRpb24uaW5zdGFuY2UoKS5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8T3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIEVjbGlwc2VMaW5rT3JtWG1sMl8zRGVmaW5pdGlvbi5FQ0xJUFNFTElOS18yXzNfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDVlZjgzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2Zvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbENvbnRleHROb2RlRmFjdG9yeQotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkKLXsJCi0KLQkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rLXNwZWNpZmljIE9STSBDb250ZXh0IE1vZGVsICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRW50aXR5TWFwcGluZ3MgYnVpbGRFbnRpdHlNYXBwaW5ncyhPcm1YbWwgcGFyZW50LCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzIHhtbEVudGl0eU1hcHBpbmdzKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0ltcGwocGFyZW50LCAoWG1sRW50aXR5TWFwcGluZ3MpIHhtbEVudGl0eU1hcHBpbmdzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRPcm1QZXJzaXN0ZW50QXR0cmlidXRlKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZShwYXJlbnQsIChYbWxBdHRyaWJ1dGVNYXBwaW5nKSByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBidWlsZE9ybVBlcnNpc3RlbnRUeXBlKEVudGl0eU1hcHBpbmdzIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlSW1wbChwYXJlbnQsIChYbWxUeXBlTWFwcGluZykgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtRW1iZWRkYWJsZSBidWlsZE9ybUVtYmVkZGFibGUoT3JtUGVyc2lzdGVudFR5cGUgdHlwZSwgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwodHlwZSwgKFhtbEVtYmVkZGFibGUpIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUVudGl0eSBidWlsZE9ybUVudGl0eShPcm1QZXJzaXN0ZW50VHlwZSB0eXBlLCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0VudGl0eUltcGwodHlwZSwgKFhtbEVudGl0eSkgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybU1hcHBlZFN1cGVyY2xhc3MgYnVpbGRPcm1NYXBwZWRTdXBlcmNsYXNzKE9ybVBlcnNpc3RlbnRUeXBlIHR5cGUsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NJbXBsKHR5cGUsIChYbWxNYXBwZWRTdXBlcmNsYXNzKSByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtQmFzaWNNYXBwaW5nIGJ1aWxkT3JtQmFzaWNNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKHBhcmVudCwgKFhtbEJhc2ljKSByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtSWRNYXBwaW5nIGJ1aWxkT3JtSWRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nKHBhcmVudCwgKFhtbElkKSByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1FbWJlZGRlZE1hcHBpbmcgYnVpbGRPcm1FbWJlZGRlZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsICBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rRW1iZWRkZWRNYXBwaW5nKHBhcmVudCwgKFhtbEVtYmVkZGVkKSByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1FbWJlZGRlZElkTWFwcGluZyBidWlsZE9ybUVtYmVkZGVkSWRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCAgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcocGFyZW50LCAoWG1sRW1iZWRkZWRJZCkgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybU1hbnlUb01hbnlNYXBwaW5nIGJ1aWxkT3JtTWFueVRvTWFueU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nKHBhcmVudCwgKFhtbE1hbnlUb01hbnkpIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1NYW55VG9PbmVNYXBwaW5nIGJ1aWxkT3JtTWFueVRvT25lTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nKHBhcmVudCwgKFhtbE1hbnlUb09uZSkgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybU9uZVRvTWFueU1hcHBpbmcgYnVpbGRPcm1PbmVUb01hbnlNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcocGFyZW50LCAoWG1sT25lVG9NYW55KSByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtT25lVG9PbmVNYXBwaW5nIGJ1aWxkT3JtT25lVG9PbmVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKHBhcmVudCwgKFhtbE9uZVRvT25lKSByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtVmVyc2lvbk1hcHBpbmcgYnVpbGRPcm1WZXJzaW9uTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcocGFyZW50LCAoWG1sVmVyc2lvbikgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nIGJ1aWxkT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxCYXNpY0NvbGxlY3Rpb24gcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcgYnVpbGRPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sQmFzaWNNYXAgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgYnVpbGRPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sVHJhbnNmb3JtYXRpb24gcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZyBidWlsZE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbFZhcmlhYmxlT25lVG9PbmUgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZyhwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGJ1aWxkT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBidWlsZE9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVudGl0eU1hcHBpbmdzIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFlMzZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5OdWxsT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybVhtbERlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybVhtbERlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGJ1aWxkQ29udGV4dE5vZGVGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBFQ0xJUFNFTElOS19BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLyoqCi0JICogT3JkZXIgc2hvdWxkIG5vdCBtYXR0ZXIgaGVyZTsgYnV0IHdlJ2xsIHVzZSB0aGUgc2FtZSBvcmRlciBhcyBmb3IgSmF2YS4KLQkgKiBAc2VlIEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1Qcm92aWRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBFQ0xJUFNFTElOS19BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJT3JtVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1WZXJzaW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1FbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJTnVsbE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNlZWYyOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtVmlydHVhbE5hbWVkRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5SZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gdmlydHVhbCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1WaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMwotCWV4dGVuZHMgQWJzdHJhY3RPcm1WaXJ0dWFsTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uPE9ybVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5Pd25lciwgUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPgotCWltcGxlbWVudHMgT3JtVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMKLXsKLQlwcm90ZWN0ZWQgZmluYWwgUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIG92ZXJyaWRkZW5Db2x1bW47Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFRhYmxlOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFRhYmxlOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRDb250ZXh0UHJvcGVydHk7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0Q29udGV4dFByb3BlcnR5OwotCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkUHJpbWFyeUtleTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0UHJpbWFyeUtleTsKLQotCi0JcHVibGljIEdlbmVyaWNPcm1WaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyhYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIE9ybVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5Pd25lciBvd25lciwgUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIG92ZXJyaWRlbkNvbHVtbikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQkJdGhpcy5vdmVycmlkZGVuQ29sdW1uID0gb3ZlcnJpZGVuQ29sdW1uOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZFRhYmxlKHRoaXMuYnVpbGRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0VGFibGUodGhpcy5idWlsZERlZmF1bHRUYWJsZSgpKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZENvbnRleHRQcm9wZXJ0eSh0aGlzLmJ1aWxkU3BlY2lmaWVkQ29udGV4dFByb3BlcnR5KCkpOwotCQl0aGlzLnNldERlZmF1bHRDb250ZXh0UHJvcGVydHkodGhpcy5idWlsZERlZmF1bHRDb250ZXh0UHJvcGVydHkoKSk7Ci0KLQkJdGhpcy5zZXRTcGVjaWZpZWRQcmltYXJ5S2V5KHRoaXMuYnVpbGRTcGVjaWZpZWRQcmltYXJ5S2V5KCkpOwotCQl0aGlzLnNldERlZmF1bHRQcmltYXJ5S2V5KHRoaXMuYnVpbGREZWZhdWx0UHJpbWFyeUtleSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgZ2V0T3ZlcnJpZGRlbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMub3ZlcnJpZGRlbkNvbHVtbjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGFibGUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFRhYmxlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRUYWJsZSA6IHRoaXMuZGVmYXVsdFRhYmxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFRhYmxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFRhYmxlKFN0cmluZyB0YWJsZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRUYWJsZTsKLQkJdGhpcy5zcGVjaWZpZWRUYWJsZSA9IHRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1RBQkxFX1BST1BFUlRZLCBvbGQsIHRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE92ZXJyaWRkZW5Db2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VGFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFRhYmxlKFN0cmluZyB0YWJsZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0VGFibGU7Ci0JCXRoaXMuZGVmYXVsdFRhYmxlID0gdGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1RBQkxFX1BST1BFUlRZLCBvbGQsIHRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXREZWZhdWx0VGFibGVOYW1lKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb250ZXh0IHByb3BlcnR5ICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFByb3BlcnR5KCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkQ29udGV4dFByb3BlcnR5ICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRDb250ZXh0UHJvcGVydHkgOiB0aGlzLmRlZmF1bHRDb250ZXh0UHJvcGVydHk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRDb250ZXh0UHJvcGVydHkoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZENvbnRleHRQcm9wZXJ0eTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRDb250ZXh0UHJvcGVydHkoU3RyaW5nIGNvbnRleHRQcm9wZXJ0eSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRDb250ZXh0UHJvcGVydHk7Ci0JCXRoaXMuc3BlY2lmaWVkQ29udGV4dFByb3BlcnR5ID0gY29udGV4dFByb3BlcnR5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NPTlRFWFRfUFJPUEVSVFlfUFJPUEVSVFksIG9sZCwgY29udGV4dFByb3BlcnR5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkQ29udGV4dFByb3BlcnR5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRPdmVycmlkZGVuQ29sdW1uKCkuZ2V0U3BlY2lmaWVkQ29udGV4dFByb3BlcnR5KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29udGV4dFByb3BlcnR5KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q29udGV4dFByb3BlcnR5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRDb250ZXh0UHJvcGVydHkoU3RyaW5nIGNvbnRleHRQcm9wZXJ0eSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0Q29udGV4dFByb3BlcnR5OwotCQl0aGlzLmRlZmF1bHRDb250ZXh0UHJvcGVydHkgPSBjb250ZXh0UHJvcGVydHk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NPTlRFWFRfUFJPUEVSVFlfUFJPUEVSVFksIG9sZCwgY29udGV4dFByb3BlcnR5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdENvbnRleHRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0RGVmYXVsdENvbnRleHRQcm9wZXJ0eU5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJpbWFyeSBrZXkgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5S2V5KCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleS5ib29sZWFuVmFsdWUoKSA6IHRoaXMuZGVmYXVsdFByaW1hcnlLZXk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkUHJpbWFyeUtleSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRQcmltYXJ5S2V5KEJvb2xlYW4gcHJpbWFyeUtleSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleTsKLQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5ID0gcHJpbWFyeUtleTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9QUklNQVJZX0tFWV9QUk9QRVJUWSwgb2xkLCBwcmltYXJ5S2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZFByaW1hcnlLZXkoKSB7Ci0JCXJldHVybiB0aGlzLmdldE92ZXJyaWRkZW5Db2x1bW4oKS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0UHJpbWFyeUtleSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFByaW1hcnlLZXk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFByaW1hcnlLZXkoYm9vbGVhbiBwcmltYXJ5S2V5KSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZWZhdWx0UHJpbWFyeUtleTsKLQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleSA9IHByaW1hcnlLZXk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1BSSU1BUllfS0VZX1BST1BFUlRZLCBvbGQsIHByaW1hcnlLZXkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVmYXVsdFByaW1hcnlLZXkoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmdldERlZmF1bHRQcmltYXJ5S2V5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci50YWJsZU5hbWVJc0ludmFsaWQodGhpcy5nZXRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUYWJsZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoKSB7Ci0JCXJldHVybiBuZXcgT3JtVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9OdWxsT3JtRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL051bGxPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGFlYjE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL051bGxPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM7Ci0KLXB1YmxpYyBjbGFzcyBOdWxsT3JtRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zCi17Ci0KLQlwdWJsaWMgTnVsbE9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zKE9ybUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtdWx0aXRlbmFudCAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc011bHRpdGVuYW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TXVsdGl0ZW5hbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZE11bHRpdGVuYW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTXVsdGl0ZW5hbnQoYm9vbGVhbiBpc011bHRpdGVuYW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTXVsdGl0ZW5hbmN5IGlzIG9ubHkgc3VwcG9ydGVkIGluIEVjbGlwc2VMaW5rIHZlcnNpb24gMi4zIGFuZCBoaWdoZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMyBnZXRUeXBlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMgZ2V0U3BlY2lmaWVkVHlwZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMyB0eXBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTXVsdGl0ZW5hbmN5IGlzIG9ubHkgc3VwcG9ydGVkIGluIEVjbGlwc2VMaW5rIHZlcnNpb24gMi4zIGFuZCBoaWdoZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMyBnZXREZWZhdWx0VHlwZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluY2x1ZGUgY3JpdGVyaWEgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNJbmNsdWRlQ3JpdGVyaWEoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYShCb29sZWFuIGluY2x1ZGVDcml0ZXJpYSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk11bHRpdGVuYW5jeSBpcyBvbmx5IHN1cHBvcnRlZCBpbiBFY2xpcHNlTGluayB2ZXJzaW9uIDIuMyBhbmQgaGlnaGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRJbmNsdWRlQ3JpdGVyaWEoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCi0JLy8gKioqKioqKioqKiB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpIHsKLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTXVsdGl0ZW5hbmN5IGlzIG9ubHkgc3VwcG9ydGVkIGluIEVjbGlwc2VMaW5rIHZlcnNpb24gMi4zIGFuZCBoaWdoZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTXVsdGl0ZW5hbmN5IGlzIG9ubHkgc3VwcG9ydGVkIGluIEVjbGlwc2VMaW5rIHZlcnNpb24gMi4zIGFuZCBoaWdoZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTXVsdGl0ZW5hbmN5IGlzIG9ubHkgc3VwcG9ydGVkIGluIEVjbGlwc2VMaW5rIHZlcnNpb24gMi4zIGFuZCBoaWdoZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTXVsdGl0ZW5hbmN5IGlzIG9ubHkgc3VwcG9ydGVkIGluIEVjbGlwc2VMaW5rIHZlcnNpb24gMi4zIGFuZCBoaWdoZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTXVsdGl0ZW5hbmN5IGlzIG9ubHkgc3VwcG9ydGVkIGluIEVjbGlwc2VMaW5rIHZlcnNpb24gMi4zIGFuZCBoaWdoZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJNdWx0aXRlbmFuY3kgaXMgb25seSBzdXBwb3J0ZWQgaW4gRWNsaXBzZUxpbmsgdmVyc2lvbiAyLjMgYW5kIGhpZ2hlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIExpc3RJdGVyYWJsZTxPcm1WaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZ2V0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkgewotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQWxsb3dlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZXNQcmltYXJ5S2V5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0FycmF5TWFwcGluZzJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmZTk1My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0FycmF5TWFwcGluZzJfMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db2x1bW5NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudW1lcmF0ZWRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUxvYkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5FbnRpdHlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5OYW1lZENvbHVtblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5OdWxsT3JtQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0FycmF5TWFwcGluZzJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1Db252ZXJ0aWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXJyYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEF0dHJpYnV0ZXNfMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLy9UT0RPIGNhbm9uaWNhbCBtZXRhbW9kZWwgZ2VuZXJhdGlvbiwgbmVlZCB0byBvdmVycmlkZSBnZXRNZXRhbW9kZWxUeXBlTmFtZSgpIGFuZCB1c2UgdGhlIHRhcmdldC1jbGFzcyBlbGVtZW50Ci1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzMKLQlleHRlbmRzIEFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzxYbWxBcnJheT4KLQlpbXBsZW1lbnRzCi0JCUVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zLAotCQlFY2xpcHNlTGlua09ybUNvbnZlcnRpYmxlTWFwcGluZywKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIuT3duZXIsCi0JCU9ybUNvbHVtbk1hcHBpbmcKLXsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtQ29sdW1uIGNvbHVtbjsKLQotCXByb3RlY3RlZCBPcm1Db252ZXJ0ZXIgY29udmVydGVyOyAgLy8gbmV2ZXIgbnVsbAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPcm1Db252ZXJ0ZXIuQWRhcHRlcltdIENPTlZFUlRFUl9BREFQVEVSX0FSUkFZID0gbmV3IE9ybUNvbnZlcnRlci5BZGFwdGVyW10gewotCQlPcm1FbnVtZXJhdGVkQ29udmVydGVyLkFkYXB0ZXIuaW5zdGFuY2UoKSwKLQkJT3JtVGVtcG9yYWxDb252ZXJ0ZXIuQmFzaWNBZGFwdGVyLmluc3RhbmNlKCksCi0JCU9ybUxvYkNvbnZlcnRlci5BZGFwdGVyLmluc3RhbmNlKCksCi0JCU9ybUVjbGlwc2VMaW5rQ29udmVydC5BZGFwdGVyLmluc3RhbmNlKCkKLQl9OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSXRlcmFibGU8T3JtQ29udmVydGVyLkFkYXB0ZXI+IENPTlZFUlRFUl9BREFQVEVSUyA9IG5ldyBBcnJheUl0ZXJhYmxlPE9ybUNvbnZlcnRlci5BZGFwdGVyPihDT05WRVJURVJfQURBUFRFUl9BUlJBWSk7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgY29udmVydGVyQ29udGFpbmVyOwotCi0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzMoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEFycmF5IHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQkJdGhpcy5jb2x1bW4gPSB0aGlzLmJ1aWxkQ29sdW1uKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyID0gdGhpcy5idWlsZENvbnZlcnRlckNvbnRhaW5lcigpOwotCQl0aGlzLmNvbnZlcnRlciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jb2x1bW4uc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY0NvbnZlcnRlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuY29sdW1uLnVwZGF0ZSgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci51cGRhdGUoKTsKLQkJdGhpcy5jb252ZXJ0ZXIudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGF0dHJpYnV0ZSB0eXBlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRBdHRyaWJ1dGVUeXBlKCkgewotCQlyZXR1cm4gdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmdldEF0dHJpYnV0ZVR5cGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRBdHRyaWJ1dGVUeXBlSW5YbWwoU3RyaW5nIGF0dHJpYnV0ZVR5cGUpIHsKLQkJdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLnNldEF0dHJpYnV0ZVR5cGUoYXR0cmlidXRlVHlwZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtQ29sdW1uIGdldENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uOwotCX0KLQotCXByb3RlY3RlZCBPcm1Db2x1bW4gYnVpbGRDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtQ29sdW1uKHRoaXMsIHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgKioqKioqKioqKgotCi0JcHVibGljIE9ybUNvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gY29udmVydGVyVHlwZSkgewotCQlpZiAodGhpcy5jb252ZXJ0ZXIuZ2V0VHlwZSgpICE9IGNvbnZlcnRlclR5cGUpIHsKLQkJCS8vIG5vdGU6IHdlIG1heSBhbHNvIGNsZWFyIHRoZSBYTUwgdmFsdWUgd2Ugd2FudDsKLQkJCS8vIGJ1dCBpZiB3ZSBsZWF2ZSBpdCwgdGhlIHJlc3VsdGluZyBzeW5jIHdpbGwgc2NyZXcgdGhpbmdzIHVwLi4uCi0JCQl0aGlzLmNsZWFyWG1sQ29udmVydGVyVmFsdWVzKCk7Ci0JCQlPcm1Db252ZXJ0ZXIuQWRhcHRlciBjb252ZXJ0ZXJBZGFwdGVyID0gdGhpcy5nZXRDb252ZXJ0ZXJBZGFwdGVyKGNvbnZlcnRlclR5cGUpOwotCQkJdGhpcy5zZXRDb252ZXJ0ZXJfKHRoaXMuYnVpbGRDb252ZXJ0ZXIoY29udmVydGVyQWRhcHRlcikpOwotCQkJdGhpcy5jb252ZXJ0ZXIuaW5pdGlhbGl6ZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUNvbnZlcnRlciBidWlsZENvbnZlcnRlcihPcm1Db252ZXJ0ZXIuQWRhcHRlciBjb252ZXJ0ZXJBZGFwdGVyKSB7Ci0JCSByZXR1cm4gKGNvbnZlcnRlckFkYXB0ZXIgIT0gbnVsbCkgPwotCQkJCWNvbnZlcnRlckFkYXB0ZXIuYnVpbGROZXdDb252ZXJ0ZXIodGhpcywgdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKSkgOgotCQkJCXRoaXMuYnVpbGROdWxsQ29udmVydGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29udmVydGVyXyhPcm1Db252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCUNvbnZlcnRlciBvbGQgPSB0aGlzLmNvbnZlcnRlcjsKLQkJdGhpcy5jb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfUFJPUEVSVFksIG9sZCwgY29udmVydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhclhtbENvbnZlcnRlclZhbHVlcygpIHsKLQkJZm9yIChPcm1Db252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyIDogdGhpcy5nZXRDb252ZXJ0ZXJBZGFwdGVycygpKSB7Ci0JCQlhZGFwdGVyLmNsZWFyWG1sVmFsdWUodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBPcm1Db252ZXJ0ZXIgYnVpbGRDb252ZXJ0ZXIoKSB7Ci0JCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5ID0gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKTsKLQkJZm9yIChPcm1Db252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyIDogdGhpcy5nZXRDb252ZXJ0ZXJBZGFwdGVycygpKSB7Ci0JCQlPcm1Db252ZXJ0ZXIgb3JtQ29udmVydGVyID0gYWRhcHRlci5idWlsZENvbnZlcnRlcih0aGlzLCBmYWN0b3J5KTsKLQkJCWlmIChvcm1Db252ZXJ0ZXIgIT0gbnVsbCkgewotCQkJCXJldHVybiBvcm1Db252ZXJ0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYnVpbGROdWxsQ29udmVydGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY0NvbnZlcnRlcigpIHsKLQkJT3JtQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA9IHRoaXMuZ2V0WG1sQ29udmVydGVyQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5jb252ZXJ0ZXIuZ2V0VHlwZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLnNldENvbnZlcnRlcl8odGhpcy5idWlsZE51bGxDb252ZXJ0ZXIoKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5jb252ZXJ0ZXIuZ2V0VHlwZSgpID09IGFkYXB0ZXIuZ2V0Q29udmVydGVyVHlwZSgpKSB7Ci0JCQkJdGhpcy5jb252ZXJ0ZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNldENvbnZlcnRlcl8oYWRhcHRlci5idWlsZE5ld0NvbnZlcnRlcih0aGlzLCB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGFkYXB0ZXIgd2hvc2UgY29udmVydGVyIHZhbHVlIGlzIHNldCBpbiB0aGUgWE1MIG1hcHBpbmcuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBjb252ZXJ0ZXIgdmFsdWVzIGluIHRoZSBYTUwuCi0JICovCi0JcHJvdGVjdGVkIE9ybUNvbnZlcnRlci5BZGFwdGVyIGdldFhtbENvbnZlcnRlckFkYXB0ZXIoKSB7Ci0JCWZvciAoT3JtQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJaWYgKGFkYXB0ZXIuaXNBY3RpdmUodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBPcm1Db252ZXJ0ZXIgYnVpbGROdWxsQ29udmVydGVyKCkgewotCQlyZXR1cm4gbmV3IE51bGxPcm1Db252ZXJ0ZXIodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBhZGFwdGVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnZlcnRlciBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGNvbnZlcnRlciB0eXBlLgotCSAqLwotCXByb3RlY3RlZCBPcm1Db252ZXJ0ZXIuQWRhcHRlciBnZXRDb252ZXJ0ZXJBZGFwdGVyKENsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGNvbnZlcnRlclR5cGUpIHsKLQkJZm9yIChPcm1Db252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyIDogdGhpcy5nZXRDb252ZXJ0ZXJBZGFwdGVycygpKSB7Ci0JCQlpZiAoYWRhcHRlci5nZXRDb252ZXJ0ZXJUeXBlKCkgPT0gY29udmVydGVyVHlwZSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxPcm1Db252ZXJ0ZXIuQWRhcHRlcj4gZ2V0Q29udmVydGVyQWRhcHRlcnMoKSB7Ci0JCXJldHVybiBDT05WRVJURVJfQURBUFRFUlM7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXJzICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBnZXRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsKHRoaXMsIHRoaXMsIHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIGludCBnZXROdW1iZXJTdXBwb3J0ZWRDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gMjsgLy9UT0RPIEVjbGlwc2VMaW5rIHN1cHBvcnRzIDIsIGJ1dCByZWFsbHkgc2hvdWxkIGJlIGp1c3QgMSwgc2VlIGJ1ZyAzNjUxMTQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQVJSQVlfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiAxMTA7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKLQkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbU9ybUF0dHJpYnV0ZU1hcHBpbmcodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1Db2x1bW5NYXBwaW5nKE9ybUNvbHVtbk1hcHBpbmcgb2xkTWFwcGluZykgewotCQlzdXBlci5pbml0aWFsaXplRnJvbU9ybUNvbHVtbk1hcHBpbmcob2xkTWFwcGluZyk7Ci0JCXRoaXMuY29sdW1uLmluaXRpYWxpemVGcm9tKG9sZE1hcHBpbmcuZ2V0Q29sdW1uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFhtbEF0dHJpYnV0ZU1hcHBpbmdUbyhBdHRyaWJ1dGVzIHhtbEF0dHJpYnV0ZXMpIHsKLQkJKChYbWxBdHRyaWJ1dGVzXzJfMykgeG1sQXR0cmlidXRlcykuZ2V0QXJyYXlzKCkuYWRkKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sQXR0cmlidXRlTWFwcGluZ0Zyb20oQXR0cmlidXRlcyB4bWxBdHRyaWJ1dGVzKSB7Ci0JCSgoWG1sQXR0cmlidXRlc18yXzMpIHhtbEF0dHJpYnV0ZXMpLmdldEFycmF5cygpLnJlbW92ZSh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPcm1Db2x1bW4uT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZShSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5VGFibGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIFRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRBbGxBc3NvY2lhdGVkVGFibGVOYW1lcygpOwotCX0KLQotCXB1YmxpYyBYbWxDb2x1bW4gZ2V0WG1sQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmdldENvbHVtbigpOwotCX0KLQotCXB1YmxpYyBYbWxDb2x1bW4gYnVpbGRYbWxDb2x1bW4oKSB7Ci0JCVhtbENvbHVtbiB4bWxDb2x1bW4gPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW4oKTsKLQkJdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLnNldENvbHVtbih4bWxDb2x1bW4pOwotCQlyZXR1cm4geG1sQ29sdW1uOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbENvbHVtbigpIHsKLQkJdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLnNldENvbHVtbihudWxsKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJc3VwZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpLAotCQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpCi0JCSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJc3VwZXIuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKQotCQkpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQlzdXBlci5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSwKLQkJCXRoaXMuY29udmVydGVyQ29udGFpbmVyLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpCi0JCSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLmNvbHVtbi52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLmNvbnZlcnRlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2wsIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIG5ldyBOYW1lZENvbHVtblZhbGlkYXRvcih0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgKFJlYWRPbmx5QmFzZUNvbHVtbikgY29sLCAoVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcikgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBFbnRpdHlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogY29tcGxldGlvbiBwcm9wb3NhbHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0WG1sQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0WG1sQ29tcGxldGlvblByb3Bvc2Fscyhwb3MpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmVzdWx0ID0gdGhpcy5jb2x1bW4uZ2V0WG1sQ29tcGxldGlvblByb3Bvc2Fscyhwb3MpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmVzdWx0ID0gdGhpcy5jb252ZXJ0ZXIuZ2V0WG1sQ29tcGxldGlvblByb3Bvc2Fscyhwb3MpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzNEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0FycmF5TWFwcGluZzJfM0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmMzZlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0FycmF5TWFwcGluZzJfM0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkVtZlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXJyYXk7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0FycmF5TWFwcGluZzJfM0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtRWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzNEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgT3JtRWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzNEZWZpbml0aW9uKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIE9ybUVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5BUlJBWV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAotCQkJCWZhY3RvcnksIAotCQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQXJyYXkoKSwgCi0JCQkJWG1sQXJyYXkuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkQ29udGV4dE1hcHBpbmcoCi0JCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgCi0JCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZywgCi0JCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zKHBhcmVudCwgKFhtbEFycmF5KSByZXNvdXJjZU1hcHBpbmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjgwNGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZwotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEJhc2ljQ29sbGVjdGlvbiB4bWxNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sTWFwcGluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcyXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M3NDQxMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcyXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkRlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzJfMQotCWV4dGVuZHMgQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcKLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nMl8xKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxCYXNpY0NvbGxlY3Rpb24geG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJbWVzc2FnZXMuYWRkKAotCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCi0JCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQkFTSUNfQ09MTEVDVElPTl9NQVBQSU5HX0RFUFJFQ0FURUQsCi0JCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCi0JCQkJdGhpcywKLQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJKQotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjViMjQxNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5FbWZUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljQ29sbGVjdGlvbjsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkUmVzb3VyY2VNYXBwaW5nKEVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIEVtZlRvb2xzLmNyZWF0ZSgKLQkJCQlmYWN0b3J5LCAKLQkJCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhc2ljQ29sbGVjdGlvbigpLCAKLQkJCQlYbWxCYXNpY0NvbGxlY3Rpb24uY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZENvbnRleHRNYXBwaW5nKAotCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIAotCQkJWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcsIAotCQkJT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuICgoRWNsaXBzZUxpbmtPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkpIGZhY3RvcnkpLgotCQkJCWJ1aWxkT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nKHBhcmVudCwgKFhtbEJhc2ljQ29sbGVjdGlvbikgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk2ODUyOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcKLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEJhc2ljTWFwIHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcyXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3MDc4MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzJfMQotCWV4dGVuZHMgQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZwotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzJfMShPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sQmFzaWNNYXAgeG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJbWVzc2FnZXMuYWRkKAotCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCi0JCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQkFTSUNfTUFQX01BUFBJTkdfREVQUkVDQVRFRCwKLQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKLQkJCQl0aGlzLAotCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkpCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEzMGUwMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkVtZlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNNYXA7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc2ZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfTUFQX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAotCQkJCWZhY3RvcnksIAotCQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQmFzaWNNYXAoKSwgCi0JCQkJWG1sQmFzaWNNYXAuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZENvbnRleHRNYXBwaW5nKAotCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIAotCQkJWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcsIAotCQkJT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuICgoRWNsaXBzZUxpbmtPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkpIGZhY3RvcnkpLgotCQkJCWJ1aWxkT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcocGFyZW50LCAoWG1sQmFzaWNNYXApIHJlc291cmNlTWFwcGluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYjAyNmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0FjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybUNvbnZlcnRpYmxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkRlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RPcm1CYXNpY01hcHBpbmc8WG1sQmFzaWM+Ci0JaW1wbGVtZW50cyAKLQkJRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcsIAotCQlFY2xpcHNlTGlua09ybUNvbnZlcnRpYmxlTWFwcGluZywgCi0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyLk93bmVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlOwotCQotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBjb252ZXJ0ZXJDb250YWluZXI7Ci0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sQmFzaWMgeG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCQl0aGlzLm11dGFibGUgPSBuZXcgT3JtRWNsaXBzZUxpbmtNdXRhYmxlKHRoaXMpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5tdXRhYmxlLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMubXV0YWJsZS51cGRhdGUoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGF0dHJpYnV0ZSB0eXBlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRBdHRyaWJ1dGVUeXBlKCkgewotCQlyZXR1cm4gdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmdldEF0dHJpYnV0ZVR5cGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRBdHRyaWJ1dGVUeXBlSW5YbWwoU3RyaW5nIGF0dHJpYnV0ZVR5cGUpIHsKLQkJdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLnNldEF0dHJpYnV0ZVR5cGUoYXR0cmlidXRlVHlwZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG11dGFibGUgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rTXV0YWJsZSBnZXRNdXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5tdXRhYmxlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXJzICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBnZXRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsKHRoaXMsIHRoaXMsIHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIGludCBnZXROdW1iZXJTdXBwb3J0ZWRDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gMTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyIGFkYXB0ZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIHB1dCB0aGUgRWNsaXBzZUxpbmsgY29udmVydCBhZGFwdGVyIGZpcnN0IC0gdGhpcyBpcyB0aGUgb3JkZXIgRWNsaXBzZUxpbmsgc2VhcmNoZXMKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8T3JtQ29udmVydGVyLkFkYXB0ZXI+IGdldENvbnZlcnRlckFkYXB0ZXJzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPE9ybUNvbnZlcnRlci5BZGFwdGVyPigKLQkJCQlPcm1FY2xpcHNlTGlua0NvbnZlcnQuQWRhcHRlci5pbnN0YW5jZSgpLAotCQkJCXN1cGVyLmdldENvbnZlcnRlckFkYXB0ZXJzKCkKLQkJCSk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCXN1cGVyLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSwKLQkJCXRoaXMuY29udmVydGVyQ29udGFpbmVyLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKQotCQkpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCXN1cGVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpLAotCQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSkKLQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJc3VwZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKQotCQkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMudmFsaWRhdGVBdHRyaWJ1dGVUeXBlKG1lc3NhZ2VzKTsKLQkJLy8gVE9ETyBtdXRhYmxlIHZhbGlkYXRpb24KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUF0dHJpYnV0ZVR5cGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKHRoaXMuaXNWaXJ0dWFsQWNjZXNzKCkpIHsKLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZ2V0QXR0cmlidXRlVHlwZSgpKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9OT19BVFRSSUJVVEVfVFlQRV9TUEVDSUZJRUQsCi0JCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKLQkJCQkJCXRoaXMsCi0JCQkJCQl0aGlzLmdldEF0dHJpYnV0ZVR5cGVUZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkJKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoTWFwcGluZ1Rvb2xzLnR5cGVJc0Jhc2ljKHRoaXMuZ2V0SmF2YVByb2plY3QoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZEF0dHJpYnV0ZVR5cGUoKSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAodGhpcy5nZXRSZXNvbHZlZEF0dHJpYnV0ZVR5cGUoKSA9PSBudWxsKSB7Ci0JCQkJSVR5cGUgamR0VHlwZSA9IEpEVFRvb2xzLmZpbmRUeXBlKHRoaXMuZ2V0SmF2YVByb2plY3QoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZEF0dHJpYnV0ZVR5cGUoKSk7Ci0JCQkJaWYgKGpkdFR5cGUgPT0gbnVsbCkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX1RZUEVfRE9FU19OT1RfRVhJU1QsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQXR0cmlidXRlVHlwZSgpfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCXRoaXMuZ2V0QXR0cmlidXRlVHlwZVRleHRSYW5nZSgpCi0JCQkJCQkpCi0JCQkJCSk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzVmlydHVhbEFjY2VzcygpIHsKLQkJcmV0dXJuIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSA9PSBFY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEF0dHJpYnV0ZVR5cGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmdldEF0dHJpYnV0ZVR5cGVUZXh0UmFuZ2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDYWNoaW5nSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDYWNoaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzdlMmI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ2FjaGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybS5OdWxsT3JtQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1DYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FjaGVhYmxlXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUaW1lT2ZEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZUhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQ2FjaGluZ0ltcGwKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybUVjbGlwc2VMaW5rQ2FjaGluZywgT3JtQ2FjaGVhYmxlSG9sZGVyMl8wCi17Ci0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIHNwZWNpZmllZFR5cGU7Ci0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGRlZmF1bHRUeXBlID0gREVGQVVMVF9UWVBFOwotCi0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkU2l6ZTsKLQlwcm90ZWN0ZWQgaW50IGRlZmF1bHRTaXplID0gREVGQVVMVF9TSVpFOwotCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkU2hhcmVkOwotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRTaGFyZWQgPSBERUZBVUxUX1NIQVJFRDsKLQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZEFsd2F5c1JlZnJlc2g7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdEFsd2F5c1JlZnJlc2ggPSBERUZBVUxUX0FMV0FZU19SRUZSRVNIOwotCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyOwotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIgPSBERUZBVUxUX1JFRlJFU0hfT05MWV9JRl9ORVdFUjsKLQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZERpc2FibGVIaXRzOwotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHREaXNhYmxlSGl0cyA9IERFRkFVTFRfRElTQUJMRV9ISVRTOwotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIHNwZWNpZmllZENvb3JkaW5hdGlvblR5cGU7Ci0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGRlZmF1bHRDb29yZGluYXRpb25UeXBlID0gREVGQVVMVF9DT09SRElOQVRJT05fVFlQRTsKLQotCXByb3RlY3RlZCBJbnRlZ2VyIGV4cGlyeTsKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtPcm1UaW1lT2ZEYXkgZXhwaXJ5VGltZU9mRGF5OwotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBzcGVjaWZpZWRFeGlzdGVuY2VUeXBlOwotCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZGVmYXVsdEV4aXN0ZW5jZVR5cGUgPSBERUZBVUxUX0VYSVNURU5DRV9UWVBFOwotCi0JcHJvdGVjdGVkIGZpbmFsIE9ybUNhY2hlYWJsZTJfMCBjYWNoZWFibGU7Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIgc3BlY2lmaWVkSXNvbGF0aW9uOwotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMiBkZWZhdWx0SXNvbGF0aW9uID0gREVGQVVMVF9JU09MQVRJT047Ci0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NhY2hpbmdJbXBsKE9ybUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCi0JCXRoaXMuc3BlY2lmaWVkVHlwZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRUeXBlKCk7Ci0JCXRoaXMuc3BlY2lmaWVkU2l6ZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRTaXplKCk7Ci0JCXRoaXMuc3BlY2lmaWVkU2hhcmVkID0gdGhpcy5idWlsZFNwZWNpZmllZFNoYXJlZCgpOwotCQl0aGlzLnNwZWNpZmllZEFsd2F5c1JlZnJlc2ggPSB0aGlzLmJ1aWxkU3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpOwotCQl0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlciA9IHRoaXMuYnVpbGRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKTsKLQkJdGhpcy5zcGVjaWZpZWREaXNhYmxlSGl0cyA9IHRoaXMuYnVpbGRTcGVjaWZpZWREaXNhYmxlSGl0cygpOwotCi0JCXRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCk7Ci0KLQkJdGhpcy5leHBpcnkgPSB0aGlzLmJ1aWxkRXhwaXJ5KCk7Ci0JCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gdGhpcy5idWlsZEV4cGlyeVRpbWVPZkRheSgpOwotCi0JCXRoaXMuc3BlY2lmaWVkRXhpc3RlbmNlVHlwZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCk7Ci0KLQkJdGhpcy5jYWNoZWFibGUgPSB0aGlzLmJ1aWxkQ2FjaGVhYmxlKCk7Ci0KLQkJdGhpcy5zcGVjaWZpZWRJc29sYXRpb24gPSB0aGlzLmJ1aWxkU3BlY2lmaWVkSXNvbGF0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0KLQkJdGhpcy5zZXRTcGVjaWZpZWRUeXBlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkVHlwZSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTaXplXyh0aGlzLmJ1aWxkU3BlY2lmaWVkU2l6ZSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTaGFyZWRfKHRoaXMuYnVpbGRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaF8odGhpcy5idWlsZFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyXyh0aGlzLmJ1aWxkU3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZERpc2FibGVIaXRzXyh0aGlzLmJ1aWxkU3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0KLQkJdGhpcy5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQotCQl0aGlzLnNldEV4cGlyeV8odGhpcy5idWlsZEV4cGlyeSgpKTsKLQkJdGhpcy5zeW5jRXhwaXJ5VGltZU9mRGF5KCk7Ci0KLQkJdGhpcy5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQotCQl0aGlzLmNhY2hlYWJsZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0KLQkJdGhpcy5zZXRTcGVjaWZpZWRJc29sYXRpb25fKHRoaXMuYnVpbGRTcGVjaWZpZWRJc29sYXRpb24oKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQotCQlib29sZWFuIHhtbENhY2hlTm90U3BlY2lmaWVkID0gKHRoaXMuZ2V0WG1sQ2FjaGUoKSA9PSBudWxsKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ2FjaGluZyA9IHRoaXMuZ2V0SmF2YUNhY2hpbmdGb3JEZWZhdWx0cygpOwotCQlib29sZWFuIGphdmFDYWNoZVNwZWNpZmllZCA9IChqYXZhQ2FjaGluZyAhPSBudWxsKTsKLQkJYm9vbGVhbiB1c2VKYXZhVmFsdWUgPSAoeG1sQ2FjaGVOb3RTcGVjaWZpZWQgJiYgamF2YUNhY2hlU3BlY2lmaWVkKTsKLQotCQl0aGlzLnNldERlZmF1bHRUeXBlKHVzZUphdmFWYWx1ZSA/IGphdmFDYWNoaW5nLmdldFR5cGUoKSA6IERFRkFVTFRfVFlQRSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFNpemUodXNlSmF2YVZhbHVlID8gamF2YUNhY2hpbmcuZ2V0U2l6ZSgpIDogREVGQVVMVF9TSVpFKTsKLQkJdGhpcy5zZXREZWZhdWx0U2hhcmVkKHVzZUphdmFWYWx1ZSA/IGphdmFDYWNoaW5nLmlzU2hhcmVkKCkgOiBERUZBVUxUX1NIQVJFRCk7Ci0JCXRoaXMuc2V0RGVmYXVsdEFsd2F5c1JlZnJlc2godXNlSmF2YVZhbHVlID8gamF2YUNhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkgOiBERUZBVUxUX0FMV0FZU19SRUZSRVNIKTsKLQkJdGhpcy5zZXREZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKHVzZUphdmFWYWx1ZSA/IGphdmFDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkgOiBERUZBVUxUX1JFRlJFU0hfT05MWV9JRl9ORVdFUik7Ci0JCXRoaXMuc2V0RGVmYXVsdERpc2FibGVIaXRzKHVzZUphdmFWYWx1ZSA/IGphdmFDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSA6IERFRkFVTFRfRElTQUJMRV9ISVRTKTsKLQotCQl0aGlzLnNldERlZmF1bHRDb29yZGluYXRpb25UeXBlKHVzZUphdmFWYWx1ZSA/IGphdmFDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSA6IERFRkFVTFRfQ09PUkRJTkFUSU9OX1RZUEUpOwotCi0JCWlmICh0aGlzLmV4cGlyeVRpbWVPZkRheSAhPSBudWxsKSB7Ci0JCQl0aGlzLmV4cGlyeVRpbWVPZkRheS51cGRhdGUoKTsKLQkJfQotCi0JCS8vIGV4aXN0ZW5jZSBjaGVja2luZyBpcyBpdHMgb3duIHhtbCBhdHRyaWJ1dGUsIGl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBjYWNoZSB4bWwgZWxlbWVudAotCQl0aGlzLnNldERlZmF1bHRFeGlzdGVuY2VUeXBlKGphdmFDYWNoZVNwZWNpZmllZCA/IGphdmFDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSA6IERFRkFVTFRfRVhJU1RFTkNFX1RZUEUpOwotCi0JCXRoaXMuY2FjaGVhYmxlLnVwZGF0ZSgpOwotCi0JCXRoaXMuc2V0RGVmYXVsdElzb2xhdGlvbih1c2VKYXZhVmFsdWUgPyBqYXZhQ2FjaGluZy5nZXRJc29sYXRpb24oKSA6IERFRkFVTFRfSVNPTEFUSU9OKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHlwZSAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoZVR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFR5cGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFR5cGUgOiB0aGlzLmRlZmF1bHRUeXBlOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlVHlwZSBnZXRTcGVjaWZpZWRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUgdHlwZSkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRUeXBlLCB0eXBlKSkgewotCQkJWG1sQ2FjaGUgeG1sQ2FjaGUgPSB0aGlzLmdldFhtbENhY2hlRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFR5cGVfKHR5cGUpOwotCQkJeG1sQ2FjaGUuc2V0VHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZS50b09ybVJlc291cmNlTW9kZWwodHlwZSkpOwotCQkJdGhpcy5yZW1vdmVYbWxDYWNoZUlmVW5zZXQoKTsKLQkJfQotCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkU2hhcmVkKG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVHlwZV8oRWNsaXBzZUxpbmtDYWNoZVR5cGUgdHlwZSkgewotCQlFY2xpcHNlTGlua0NhY2hlVHlwZSBvbGQgPSB0aGlzLnNwZWNpZmllZFR5cGU7Ci0JCXRoaXMuc3BlY2lmaWVkVHlwZSA9IHR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVFlQRV9QUk9QRVJUWSwgb2xkLCB0eXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoZVR5cGUgYnVpbGRTcGVjaWZpZWRUeXBlKCkgewotCQlYbWxDYWNoZSB4bWxDYWNoZSA9IHRoaXMuZ2V0WG1sQ2FjaGUoKTsKLQkJcmV0dXJuICh4bWxDYWNoZSA9PSBudWxsKSA/IG51bGwgOiBFY2xpcHNlTGlua0NhY2hlVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbCh4bWxDYWNoZS5nZXRUeXBlKCkpOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlVHlwZSBnZXREZWZhdWx0VHlwZSgpIHsKLQkJU3RyaW5nIHB1RGVmYXVsdENhY2hlVHlwZU5hbWUgPSAoKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KWdldFBlcnNpc3RlbmNlVW5pdCgpKS5nZXREZWZhdWx0Q2FjaGVUeXBlUHJvcGVydHlWYWx1ZSgpOwotCQlpZiAoIVN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkocHVEZWZhdWx0Q2FjaGVUeXBlTmFtZSkpIHsKLQkJCXRyeSB7IAotCQkJCXJldHVybiBFY2xpcHNlTGlua0NhY2hlVHlwZS52YWx1ZU9mKFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMocHVEZWZhdWx0Q2FjaGVUeXBlTmFtZSkpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCS8vbm8gbWF0Y2gsIHJldHVybiBkZWZhdWx0Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUgdHlwZSkgewotCQlFY2xpcHNlTGlua0NhY2hlVHlwZSBvbGQgPSB0aGlzLmRlZmF1bHRUeXBlOwotCQl0aGlzLmRlZmF1bHRUeXBlID0gdHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVFlQRV9QUk9QRVJUWSwgb2xkLCB0eXBlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2l6ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRTaXplICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRTaXplLmludFZhbHVlKCkgOiB0aGlzLmRlZmF1bHRTaXplOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFNpemU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2l6ZShJbnRlZ2VyIHNpemUpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkU2l6ZSwgc2l6ZSkpIHsKLQkJCVhtbENhY2hlIHhtbENhY2hlID0gdGhpcy5nZXRYbWxDYWNoZUZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRTaXplXyhzaXplKTsKLQkJCXhtbENhY2hlLnNldFNpemUoc2l6ZSk7Ci0JCQl0aGlzLnJlbW92ZVhtbENhY2hlSWZVbnNldCgpOwotCQl9Ci0KLQkJaWYgKHNpemUgIT0gbnVsbCkgewotCQkJdGhpcy5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTaXplXyhJbnRlZ2VyIHNpemUpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnNwZWNpZmllZFNpemU7Ci0JCXRoaXMuc3BlY2lmaWVkU2l6ZSA9IHNpemU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0laRV9QUk9QRVJUWSwgb2xkLCBzaXplKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFNwZWNpZmllZFNpemUoKSB7Ci0JCVhtbENhY2hlIHhtbENhY2hlID0gdGhpcy5nZXRYbWxDYWNoZSgpOwotCQlyZXR1cm4gKHhtbENhY2hlID09IG51bGwpID8gbnVsbCA6IHhtbENhY2hlLmdldFNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERlZmF1bHRTaXplKCkgewotCQlTdHJpbmcgcHVEZWZhdWx0Q2FjaGVTaXplID0gKChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdClnZXRQZXJzaXN0ZW5jZVVuaXQoKSkuZ2V0RGVmYXVsdENhY2hlU2l6ZVByb3BlcnR5VmFsdWUoKTsKLQkJaWYgKCFTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHB1RGVmYXVsdENhY2hlU2l6ZSkpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZihwdURlZmF1bHRDYWNoZVNpemUpLmludFZhbHVlKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJLy9jb3VsZG4ndCBwYXJzZSwgcmV0dXJuIGRlZmF1bHQKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2l6ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2l6ZShpbnQgc2l6ZSkgewotCQlpbnQgb2xkID0gdGhpcy5kZWZhdWx0U2l6ZTsKLQkJdGhpcy5kZWZhdWx0U2l6ZSA9IHNpemU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1NJWkVfUFJPUEVSVFksIG9sZCwgc2l6ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNoYXJlZCAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFNoYXJlZCAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkU2hhcmVkLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5kZWZhdWx0U2hhcmVkOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZFNoYXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2hhcmVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuIHNoYXJlZCkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRTaGFyZWQsIHNoYXJlZCkpIHsKLQkJCVhtbENhY2hlIHhtbENhY2hlID0gdGhpcy5nZXRYbWxDYWNoZUZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRTaGFyZWRfKHNoYXJlZCk7Ci0JCQl4bWxDYWNoZS5zZXRTaGFyZWQoc2hhcmVkKTsKLQkJCXRoaXMucmVtb3ZlWG1sQ2FjaGVJZlVuc2V0KCk7Ci0JCX0KLQotCQlpZiAoKHNoYXJlZCAhPSBudWxsKSAmJiAhIHNoYXJlZC5ib29sZWFuVmFsdWUoKSkgeyAgLy8gQm9vbGVhbi5GQUxTRQotCQkJdGhpcy5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRTaXplKG51bGwpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKG51bGwpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIobnVsbCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZERpc2FibGVIaXRzKG51bGwpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKG51bGwpOwotCQkJdGhpcy5zZXRFeHBpcnkobnVsbCk7Ci0JCQl0aGlzLnJlbW92ZUV4cGlyeVRpbWVPZkRheUlmTmVjZXNzYXJ5KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTaGFyZWRfKEJvb2xlYW4gc2hhcmVkKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRTaGFyZWQ7Ci0JCXRoaXMuc3BlY2lmaWVkU2hhcmVkID0gc2hhcmVkOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NIQVJFRF9QUk9QRVJUWSwgb2xkLCBzaGFyZWQpOwotCX0KLQotCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkU3BlY2lmaWVkU2hhcmVkKCkgewotCQlYbWxDYWNoZSB4bWxDYWNoZSA9IHRoaXMuZ2V0WG1sQ2FjaGUoKTsKLQkJcmV0dXJuICh4bWxDYWNoZSA9PSBudWxsKSA/IG51bGwgOiB4bWxDYWNoZS5nZXRTaGFyZWQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRTaGFyZWQoKSB7Ci0JCVN0cmluZyBwdURlZmF1bHRTaGFyZWRDYWNoZSA9ICgoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpZ2V0UGVyc2lzdGVuY2VVbml0KCkpLmdldERlZmF1bHRDYWNoZVNoYXJlZFByb3BlcnR5VmFsdWUoKTsKLQkJcmV0dXJuICFTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHB1RGVmYXVsdFNoYXJlZENhY2hlKSA/IEJvb2xlYW4udmFsdWVPZihwdURlZmF1bHRTaGFyZWRDYWNoZSkgOiB0aGlzLmRlZmF1bHRTaGFyZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFNoYXJlZChib29sZWFuIHNoYXJlZCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuZGVmYXVsdFNoYXJlZDsKLQkJdGhpcy5kZWZhdWx0U2hhcmVkID0gc2hhcmVkOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9TSEFSRURfUFJPUEVSVFksIG9sZCwgc2hhcmVkKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWx3YXlzIHJlZnJlc2ggKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNBbHdheXNSZWZyZXNoKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaCAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaC5ib29sZWFuVmFsdWUoKSA6IHRoaXMuZGVmYXVsdEFsd2F5c1JlZnJlc2g7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4gYWx3YXlzUmVmcmVzaCkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoLCBhbHdheXNSZWZyZXNoKSkgewotCQkJWG1sQ2FjaGUgeG1sQ2FjaGUgPSB0aGlzLmdldFhtbENhY2hlRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2hfKGFsd2F5c1JlZnJlc2gpOwotCQkJeG1sQ2FjaGUuc2V0QWx3YXlzUmVmcmVzaChhbHdheXNSZWZyZXNoKTsKLQkJCXRoaXMucmVtb3ZlWG1sQ2FjaGVJZlVuc2V0KCk7Ci0JCX0KLQotCQlpZiAoYWx3YXlzUmVmcmVzaCAhPSBudWxsKSB7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFNoYXJlZChudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2hfKEJvb2xlYW4gYWx3YXlzUmVmcmVzaCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaDsKLQkJdGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoID0gYWx3YXlzUmVmcmVzaDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9BTFdBWVNfUkVGUkVTSF9QUk9QRVJUWSwgb2xkLCBhbHdheXNSZWZyZXNoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSB7Ci0JCVhtbENhY2hlIHhtbENhY2hlID0gdGhpcy5nZXRYbWxDYWNoZSgpOwotCQlyZXR1cm4gKHhtbENhY2hlID09IG51bGwpID8gbnVsbCA6IHhtbENhY2hlLmdldEFsd2F5c1JlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0QWx3YXlzUmVmcmVzaDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0QWx3YXlzUmVmcmVzaChib29sZWFuIGFsd2F5c1JlZnJlc2gpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRlZmF1bHRBbHdheXNSZWZyZXNoOwotCQl0aGlzLmRlZmF1bHRBbHdheXNSZWZyZXNoID0gYWx3YXlzUmVmcmVzaDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFksIG9sZCwgYWx3YXlzUmVmcmVzaCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZnJlc2ggb25seSBpZiBuZXdlciAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlZnJlc2hPbmx5SWZOZXdlcigpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlciAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5kZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcikgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIsIHJlZnJlc2hPbmx5SWZOZXdlcikpIHsKLQkJCVhtbENhY2hlIHhtbENhY2hlID0gdGhpcy5nZXRYbWxDYWNoZUZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXJfKHJlZnJlc2hPbmx5SWZOZXdlcik7Ci0JCQl4bWxDYWNoZS5zZXRSZWZyZXNoT25seUlmTmV3ZXIocmVmcmVzaE9ubHlJZk5ld2VyKTsKLQkJCXRoaXMucmVtb3ZlWG1sQ2FjaGVJZlVuc2V0KCk7Ci0JCX0KLQotCQlpZiAocmVmcmVzaE9ubHlJZk5ld2VyICE9IG51bGwpIHsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkU2hhcmVkKG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyXyhCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcikgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyOwotCQl0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlciA9IHJlZnJlc2hPbmx5SWZOZXdlcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9SRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFksIG9sZCwgcmVmcmVzaE9ubHlJZk5ld2VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpIHsKLQkJWG1sQ2FjaGUgeG1sQ2FjaGUgPSB0aGlzLmdldFhtbENhY2hlKCk7Ci0JCXJldHVybiAoeG1sQ2FjaGUgPT0gbnVsbCkgPyBudWxsIDogeG1sQ2FjaGUuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoYm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXIpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXI7Ci0JCXRoaXMuZGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlciA9IHJlZnJlc2hPbmx5SWZOZXdlcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfUkVGUkVTSF9PTkxZX0lGX05FV0VSX1BST1BFUlRZLCBvbGQsIHJlZnJlc2hPbmx5SWZOZXdlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRpc2FibGUgaGl0cyAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2FibGVIaXRzKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkRGlzYWJsZUhpdHMgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5kZWZhdWx0RGlzYWJsZUhpdHM7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZERpc2FibGVIaXRzKEJvb2xlYW4gZGlzYWJsZUhpdHMpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkRGlzYWJsZUhpdHMsIGRpc2FibGVIaXRzKSkgewotCQkJWG1sQ2FjaGUgeG1sQ2FjaGUgPSB0aGlzLmdldFhtbENhY2hlRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZERpc2FibGVIaXRzXyhkaXNhYmxlSGl0cyk7Ci0JCQl4bWxDYWNoZS5zZXREaXNhYmxlSGl0cyhkaXNhYmxlSGl0cyk7Ci0JCQl0aGlzLnJlbW92ZVhtbENhY2hlSWZVbnNldCgpOwotCQl9Ci0KLQkJaWYgKGRpc2FibGVIaXRzICE9IG51bGwpIHsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkU2hhcmVkKG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHNfKEJvb2xlYW4gZGlzYWJsZUhpdHMpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzOwotCQl0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzID0gZGlzYWJsZUhpdHM7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfRElTQUJMRV9ISVRTX1BST1BFUlRZLCBvbGQsIGRpc2FibGVIaXRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZERpc2FibGVIaXRzKCkgewotCQlYbWxDYWNoZSB4bWxDYWNoZSA9IHRoaXMuZ2V0WG1sQ2FjaGUoKTsKLQkJcmV0dXJuICh4bWxDYWNoZSA9PSBudWxsKSA/IG51bGwgOiB4bWxDYWNoZS5nZXREaXNhYmxlSGl0cygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdERpc2FibGVIaXRzKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0RGlzYWJsZUhpdHM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdERpc2FibGVIaXRzKGJvb2xlYW4gZGlzYWJsZUhpdHMpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRlZmF1bHREaXNhYmxlSGl0czsKLQkJdGhpcy5kZWZhdWx0RGlzYWJsZUhpdHMgPSBkaXNhYmxlSGl0czsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfRElTQUJMRV9ISVRTX1BST1BFUlRZLCBvbGQsIGRpc2FibGVIaXRzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29vcmRpbmF0aW9uIHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldENvb3JkaW5hdGlvblR5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlIDogdGhpcy5kZWZhdWx0Q29vcmRpbmF0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIHR5cGUpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSwgdHlwZSkpIHsKLQkJCVhtbENhY2hlIHhtbENhY2hlID0gdGhpcy5nZXRYbWxDYWNoZUZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlXyh0eXBlKTsKLQkJCXhtbENhY2hlLnNldENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHR5cGUpKTsKLQkJCXRoaXMucmVtb3ZlWG1sQ2FjaGVJZlVuc2V0KCk7Ci0JCX0KLQotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFNoYXJlZChudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGVfKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIHR5cGUpIHsKLQkJRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgb2xkID0gdGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlOwotCQl0aGlzLnNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUgPSB0eXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NPT1JESU5BVElPTl9UWVBFX1BST1BFUlRZLCBvbGQsIHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBidWlsZFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSB7Ci0JCVhtbENhY2hlIHhtbENhY2hlID0gdGhpcy5nZXRYbWxDYWNoZSgpOwotCQlyZXR1cm4gKHhtbENhY2hlID09IG51bGwpID8gbnVsbCA6IEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLmZyb21Pcm1SZXNvdXJjZU1vZGVsKHhtbENhY2hlLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q29vcmRpbmF0aW9uVHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSB0eXBlKSB7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIG9sZD0gdGhpcy5kZWZhdWx0Q29vcmRpbmF0aW9uVHlwZTsKLQkJdGhpcy5kZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSA9IHR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NPT1JESU5BVElPTl9UWVBFX1BST1BFUlRZLCBvbGQsIHR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHBpcnkgKioqKioqKioqKgotCi0JcHVibGljIEludGVnZXIgZ2V0RXhwaXJ5KCkgewotCQlyZXR1cm4gdGhpcy5leHBpcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhwaXJ5KEludGVnZXIgZXhwaXJ5KSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLmV4cGlyeSwgZXhwaXJ5KSkgewotCQkJWG1sQ2FjaGUgeG1sQ2FjaGUgPSB0aGlzLmdldFhtbENhY2hlRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldEV4cGlyeV8oZXhwaXJ5KTsKLQkJCXhtbENhY2hlLnNldEV4cGlyeShleHBpcnkpOwotCQkJdGhpcy5yZW1vdmVYbWxDYWNoZUlmVW5zZXQoKTsKLQkJfQotCi0JCWlmIChleHBpcnkgIT0gbnVsbCkgewotCQkJdGhpcy5yZW1vdmVFeHBpcnlUaW1lT2ZEYXlJZk5lY2Vzc2FyeSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFeHBpcnlfKEludGVnZXIgZXhwaXJ5KSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5leHBpcnk7Ci0JCXRoaXMuZXhwaXJ5ID0gZXhwaXJ5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1BST1BFUlRZLCBvbGQsIGV4cGlyeSk7Ci0JfQotCi0JcHJvdGVjdGVkIEludGVnZXIgYnVpbGRFeHBpcnkoKSB7Ci0JCVhtbENhY2hlIHhtbENhY2hlID0gdGhpcy5nZXRYbWxDYWNoZSgpOwotCQlyZXR1cm4gKHhtbENhY2hlID09IG51bGwpID8gbnVsbCA6IHhtbENhY2hlLmdldEV4cGlyeSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHBpcnkgdGltZSBvZiBkYXkgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rVGltZU9mRGF5IGdldEV4cGlyeVRpbWVPZkRheSgpIHsKLQkJcmV0dXJuIHRoaXMuZXhwaXJ5VGltZU9mRGF5OwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua1RpbWVPZkRheSBhZGRFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCWlmICh0aGlzLmV4cGlyeVRpbWVPZkRheSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJleHBpcnkgdGltZSBvZiBkYXkgYWxyZWFkeSBleGlzdHM6ICIgKyB0aGlzLmV4cGlyeVRpbWVPZkRheSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVhtbENhY2hlIHhtbENhY2hlID0gdGhpcy5nZXRYbWxDYWNoZUZvclVwZGF0ZSgpOwotCQlYbWxUaW1lT2ZEYXkgeG1sVGltZU9mRGF5ID0gdGhpcy5idWlsZFhtbFRpbWVPZkRheSgpOwotCQlFY2xpcHNlTGlua09ybVRpbWVPZkRheSB0aW1lT2ZEYXkgPSB0aGlzLmJ1aWxkRXhwaXJ5VGltZU9mRGF5KHhtbFRpbWVPZkRheSk7Ci0JCXRoaXMuc2V0RXhwaXJ5VGltZU9mRGF5KHRpbWVPZkRheSk7Ci0JCXhtbENhY2hlLnNldEV4cGlyeVRpbWVPZkRheSh4bWxUaW1lT2ZEYXkpOwotCi0JCXRoaXMuc2V0RXhwaXJ5KG51bGwpOwotCQl0aGlzLnNldFNwZWNpZmllZFNoYXJlZChudWxsKTsKLQotCQlyZXR1cm4gdGltZU9mRGF5OwotCX0KLQotCXByb3RlY3RlZCBYbWxUaW1lT2ZEYXkgYnVpbGRYbWxUaW1lT2ZEYXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRpbWVPZkRheSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUV4cGlyeVRpbWVPZkRheSgpIHsKLQkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImV4cGlyeSB0aW1lIG9mIGRheSBkb2VzIG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5yZW1vdmVFeHBpcnlUaW1lT2ZEYXlfKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRXhwaXJ5VGltZU9mRGF5SWZOZWNlc3NhcnkoKSB7Ci0JCWlmICh0aGlzLmV4cGlyeVRpbWVPZkRheSAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbW92ZUV4cGlyeVRpbWVPZkRheV8oKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUV4cGlyeVRpbWVPZkRheV8oKSB7Ci0JCXRoaXMuc2V0RXhwaXJ5VGltZU9mRGF5KG51bGwpOwotCQl0aGlzLmdldFhtbENhY2hlKCkuc2V0RXhwaXJ5VGltZU9mRGF5KG51bGwpOwotCQl0aGlzLnJlbW92ZVhtbENhY2hlSWZVbnNldCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEV4cGlyeVRpbWVPZkRheShFY2xpcHNlTGlua09ybVRpbWVPZkRheSB0aW1lT2ZEYXkpIHsKLQkJRWNsaXBzZUxpbmtPcm1UaW1lT2ZEYXkgb2xkID0gdGhpcy5leHBpcnlUaW1lT2ZEYXk7Ci0JCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gdGltZU9mRGF5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1RJTUVfT0ZfREFZX1BST1BFUlRZLCBvbGQsIHRpbWVPZkRheSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY0V4cGlyeVRpbWVPZkRheSgpIHsKLQkJWG1sVGltZU9mRGF5IHhtbFRpbWVPZkRheSA9IHRoaXMuZ2V0WG1sRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCWlmICh4bWxUaW1lT2ZEYXkgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5ICE9IG51bGwpIHsKLQkJCQl0aGlzLnNldEV4cGlyeVRpbWVPZkRheShudWxsKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgodGhpcy5leHBpcnlUaW1lT2ZEYXkgIT0gbnVsbCkgJiYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5LmdldFhtbFRpbWVPZkRheSgpID09IHhtbFRpbWVPZkRheSkpIHsKLQkJCQl0aGlzLmV4cGlyeVRpbWVPZkRheS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0RXhwaXJ5VGltZU9mRGF5KHRoaXMuYnVpbGRFeHBpcnlUaW1lT2ZEYXkoeG1sVGltZU9mRGF5KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtPcm1UaW1lT2ZEYXkgYnVpbGRFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRXhwaXJ5VGltZU9mRGF5KHRoaXMuZ2V0WG1sRXhwaXJ5VGltZU9mRGF5KCkpOwotCX0KLQotCXByb3RlY3RlZCBYbWxUaW1lT2ZEYXkgZ2V0WG1sRXhwaXJ5VGltZU9mRGF5KCkgewotCQlYbWxDYWNoZSB4bWxDYWNoZSA9IHRoaXMuZ2V0WG1sQ2FjaGUoKTsKLQkJcmV0dXJuICh4bWxDYWNoZSA9PSBudWxsKSA/IG51bGwgOiB4bWxDYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtPcm1UaW1lT2ZEYXkgYnVpbGRFeHBpcnlUaW1lT2ZEYXkoWG1sVGltZU9mRGF5IHhtbFRpbWVPZkRheSkgewotCQlyZXR1cm4gKHhtbFRpbWVPZkRheSA9PSBudWxsKSA/IG51bGwgOiBuZXcgRWNsaXBzZUxpbmtPcm1UaW1lT2ZEYXkodGhpcywgeG1sVGltZU9mRGF5KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXhpc3RlbmNlIHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBnZXRFeGlzdGVuY2VUeXBlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkRXhpc3RlbmNlVHlwZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkRXhpc3RlbmNlVHlwZSA6IHRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGU7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBnZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRFeGlzdGVuY2VUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIHR5cGUpIHsKLQkJaWYgKHRoaXMuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZV8odHlwZSkpIHsKLQkJCXRoaXMuZ2V0WG1sQ2FjaGVIb2xkZXIoKS5zZXRFeGlzdGVuY2VDaGVja2luZyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHR5cGUpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGVfKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSB0eXBlKSB7Ci0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBvbGQgPSB0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGU7Ci0JCXRoaXMuc3BlY2lmaWVkRXhpc3RlbmNlVHlwZSA9IHR5cGU7Ci0JCXJldHVybiB0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0VYSVNURU5DRV9UWVBFX1BST1BFUlRZLCBvbGQsIHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgYnVpbGRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkgewotCQlYbWxDYWNoZUhvbGRlciB4bWxDYWNoZUhvbGRlciA9IHRoaXMuZ2V0WG1sQ2FjaGVIb2xkZXIoKTsKLQkJcmV0dXJuICh4bWxDYWNoZUhvbGRlciA9PSBudWxsKSA/IG51bGwgOiBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwoeG1sQ2FjaGVIb2xkZXIuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBnZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIHR5cGUpIHsKLQkJRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIG9sZCA9IHRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGU7Ci0JCXRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGUgPSB0eXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9FWElTVEVOQ0VfVFlQRV9QUk9QRVJUWSwgb2xkLCB0eXBlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2FjaGVhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1DYWNoZWFibGUyXzAgZ2V0Q2FjaGVhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoZWFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUNhY2hlYWJsZTJfMCBidWlsZENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNPcm1YbWwyXzBDb21wYXRpYmxlKCkgPwotCQkJCXRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5Ml8wKCkuYnVpbGRPcm1DYWNoZWFibGUodGhpcykgOgotCQkJCW5ldyBOdWxsT3JtQ2FjaGVhYmxlMl8wKHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKSB7Ci0JCWlmICggISB0aGlzLmdldFR5cGVNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSB0aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCWlmICgoamF2YVBlcnNpc3RlbnRUeXBlICE9IG51bGwpICYmIChqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQ2FjaGVhYmxlSG9sZGVyMl8wKSkgewotCQkJCXJldHVybiAoKENhY2hlYWJsZUhvbGRlcjJfMCkgamF2YVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCkuaXNDYWNoZWFibGUoKTsKLQkJCX0KLQkJfQotCQlDYWNoZWFibGVIb2xkZXIyXzAgc3VwZXJDYWNoZWFibGVIb2xkZXIgPSB0aGlzLmdldENhY2hlYWJsZVN1cGVyUGVyc2lzdGVudFR5cGUodGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFBlcnNpc3RlbnRUeXBlKCkpOwotCQlyZXR1cm4gKHN1cGVyQ2FjaGVhYmxlSG9sZGVyICE9IG51bGwpID8KLQkJCQlzdXBlckNhY2hlYWJsZUhvbGRlci5nZXRDYWNoZWFibGUoKS5pc0NhY2hlYWJsZSgpIDoKLQkJCQkoKFBlcnNpc3RlbmNlVW5pdDJfMCkgdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKSkuY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCBDYWNoZWFibGVIb2xkZXIyXzAgZ2V0Q2FjaGVhYmxlU3VwZXJQZXJzaXN0ZW50VHlwZShQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSkgewotCQlQZXJzaXN0ZW50VHlwZSBzdXBlclBlcnNpc3RlbnRUeXBlID0gcGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpOwotCQlpZiAoc3VwZXJQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlUeXBlTWFwcGluZyBzdXBlck1hcHBpbmcgPSBzdXBlclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJcmV0dXJuIChzdXBlck1hcHBpbmcgaW5zdGFuY2VvZiBDYWNoZWFibGVIb2xkZXIyXzApID8KLQkJCQkoQ2FjaGVhYmxlSG9sZGVyMl8wKSBzdXBlck1hcHBpbmcgOgotCQkJCXRoaXMuZ2V0Q2FjaGVhYmxlU3VwZXJQZXJzaXN0ZW50VHlwZShzdXBlclBlcnNpc3RlbnRUeXBlKTsgIC8vIHJlY3Vyc2UKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaXNvbGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMiBnZXRJc29sYXRpb24oKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRJc29sYXRpb24gIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZElzb2xhdGlvbiA6IHRoaXMuZGVmYXVsdElzb2xhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIgZ2V0U3BlY2lmaWVkSXNvbGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRJc29sYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkSXNvbGF0aW9uKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yIGlzb2xhdGlvbikgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRJc29sYXRpb24sIGlzb2xhdGlvbikpIHsKLQkJCVhtbENhY2hlIHhtbENhY2hlID0gdGhpcy5nZXRYbWxDYWNoZUZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRJc29sYXRpb25fKGlzb2xhdGlvbik7Ci0JCQl4bWxDYWNoZS5zZXRJc29sYXRpb24oRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIudG9Pcm1SZXNvdXJjZU1vZGVsKGlzb2xhdGlvbikpOwotCQkJdGhpcy5yZW1vdmVYbWxDYWNoZUlmVW5zZXQoKTsKLQkJfQotCi0JCWlmIChpc29sYXRpb24gIT0gbnVsbCkgewotCQkJdGhpcy5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRJc29sYXRpb25fKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yIGlzb2xhdGlvbikgewotCQlFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMiBvbGQgPSB0aGlzLnNwZWNpZmllZElzb2xhdGlvbjsKLQkJdGhpcy5zcGVjaWZpZWRJc29sYXRpb24gPSBpc29sYXRpb247Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfSVNPTEFUSU9OX1BST1BFUlRZLCBvbGQsIGlzb2xhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yIGJ1aWxkU3BlY2lmaWVkSXNvbGF0aW9uKCkgewotCQlYbWxDYWNoZSB4bWxDYWNoZSA9IHRoaXMuZ2V0WG1sQ2FjaGUoKTsKLQkJcmV0dXJuICh4bWxDYWNoZSA9PSBudWxsKSA/IG51bGwgOiBFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMi5mcm9tT3JtUmVzb3VyY2VNb2RlbCh4bWxDYWNoZS5nZXRJc29sYXRpb24oKSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yIGdldERlZmF1bHRJc29sYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRJc29sYXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdElzb2xhdGlvbihFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMiBpc29sYXRpb24pIHsKLQkJRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIgb2xkID0gdGhpcy5kZWZhdWx0SXNvbGF0aW9uOwotCQl0aGlzLmRlZmF1bHRJc29sYXRpb24gPSBpc29sYXRpb247Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0lTT0xBVElPTl9QUk9QRVJUWSwgb2xkLCBpc29sYXRpb24pOwotCX0KLQotCS8vICoqKioqKioqKiogWE1MIGNhY2hlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBYTUwgY2FjaGUgZG9lcyBub3QgZXhpc3RzLgotCSAqLwotCXByb3RlY3RlZCBYbWxDYWNoZSBnZXRYbWxDYWNoZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sQ2FjaGVIb2xkZXIoKS5nZXRDYWNoZSgpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIHRoZSBYTUwgY2FjaGUgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JcHJvdGVjdGVkIFhtbENhY2hlIGdldFhtbENhY2hlRm9yVXBkYXRlKCkgewotCQlYbWxDYWNoZSB4bWxDYWNoZSA9IHRoaXMuZ2V0WG1sQ2FjaGUoKTsKLQkJcmV0dXJuICh4bWxDYWNoZSAhPSBudWxsKSA/IHhtbENhY2hlIDogdGhpcy5idWlsZFhtbENhY2hlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbENhY2hlIGJ1aWxkWG1sQ2FjaGUoKSB7Ci0JCVhtbENhY2hlIHhtbENhY2hlID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpOwotCQl0aGlzLmdldFhtbENhY2hlSG9sZGVyKCkuc2V0Q2FjaGUoeG1sQ2FjaGUpOwotCQlyZXR1cm4geG1sQ2FjaGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sQ2FjaGVJZlVuc2V0KCkgewotCQlpZiAodGhpcy5nZXRYbWxDYWNoZSgpLmlzVW5zZXQoKSkgewotCQkJdGhpcy5yZW1vdmVYbWxDYWNoZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sQ2FjaGUoKSB7Ci0JCXRoaXMuZ2V0WG1sQ2FjaGVIb2xkZXIoKS5zZXRDYWNoZShudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE9ybUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBYbWxUeXBlTWFwcGluZyBnZXRYbWxUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBYbWxDYWNoZWFibGVfMl8wIGdldFhtbENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIChYbWxDYWNoZWFibGVfMl8wKSB0aGlzLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbENhY2hlSG9sZGVyIGdldFhtbENhY2hlSG9sZGVyKCkgewotCQlyZXR1cm4gKFhtbENhY2hlSG9sZGVyKSB0aGlzLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZyBnZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGdldEphdmFDYWNoaW5nRm9yRGVmYXVsdHMoKSB7Ci0JCUphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZyBqYXZhVHlwZU1hcHBpbmcgPSB0aGlzLmdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci0JCXJldHVybiAoamF2YVR5cGVNYXBwaW5nID09IG51bGwpID8gbnVsbCA6IGphdmFUeXBlTWFwcGluZy5nZXRDYWNoaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRYbWxWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFhtbFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCVhtbENhY2hlIHhtbENhY2hlID0gdGhpcy5nZXRYbWxDYWNoZSgpOwotCQlyZXR1cm4gKHhtbENhY2hlID09IG51bGwpID8gbnVsbCA6IHhtbENhY2hlLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZjMwNzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nSG9sZGVyOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZwotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZwotewotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBzcGVjaWZpZWRUeXBlOwotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBkZWZhdWx0VHlwZSA9IERFRkFVTFRfVFlQRTsKLQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcoRWNsaXBzZUxpbmtPcm1UeXBlTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRUeXBlID0gdGhpcy5idWlsZFNwZWNpZmllZFR5cGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRUeXBlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHRUeXBlKHRoaXMuYnVpbGREZWZhdWx0VHlwZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHlwZSAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFR5cGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFR5cGUgOiB0aGlzLmRlZmF1bHRUeXBlOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBnZXRTcGVjaWZpZWRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgdHlwZSkgewotCQlpZiAodGhpcy5zcGVjaWZpZWRUeXBlICE9IHR5cGUpIHsKLQkJCVhtbENoYW5nZVRyYWNraW5nIHhtbENoYW5nZVRyYWNraW5nID0gdGhpcy5nZXRYbWxDaGFuZ2VUcmFja2luZ0ZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRUeXBlXyh0eXBlKTsKLQkJCXhtbENoYW5nZVRyYWNraW5nLnNldFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHR5cGUpKTsKLQkJCXRoaXMucmVtb3ZlWG1sQ2hhbmdlVHJhY2tpbmdJZlVuc2V0KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRUeXBlXyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSB0eXBlKSB7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIG9sZCA9IHRoaXMuc3BlY2lmaWVkVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWRUeXBlID0gdHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UWVBFX1BST1BFUlRZLCBvbGQsIHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBidWlsZFNwZWNpZmllZFR5cGUoKSB7Ci0JCVhtbENoYW5nZVRyYWNraW5nIHhtbENoYW5nZVRyYWNraW5nID0gdGhpcy5nZXRYbWxDaGFuZ2VUcmFja2luZygpOwotCQlyZXR1cm4gKHhtbENoYW5nZVRyYWNraW5nID09IG51bGwpID8gbnVsbCA6IEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLmZyb21Pcm1SZXNvdXJjZU1vZGVsKHhtbENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIGdldERlZmF1bHRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSB0eXBlKSB7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIG9sZCA9IHRoaXMuZGVmYXVsdFR5cGU7Ci0JCXRoaXMuZGVmYXVsdFR5cGUgPSB0eXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9UWVBFX1BST1BFUlRZLCBvbGQsIHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBidWlsZERlZmF1bHRUeXBlKCkgewotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGphdmFDaGFuZ2VUcmFja2luZyA9IHRoaXMuZ2V0SmF2YUNoYW5nZVRyYWNraW5nRm9yRGVmYXVsdHMoKTsKLQkJcmV0dXJuIChqYXZhQ2hhbmdlVHJhY2tpbmcgIT0gbnVsbCkgPyBqYXZhQ2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpIDogREVGQVVMVF9UWVBFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB4bWwgY3VzdG9taXplciBjbGFzcyByZWYgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBYTUwgY2hhbmdlIHRyYWNraW5nIGRvZXMgbm90IGV4aXN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2hhbmdlVHJhY2tpbmcgZ2V0WG1sQ2hhbmdlVHJhY2tpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyKCkuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCB0aGUgWE1MIGNoYW5nZSB0cmFja2luZyBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2hhbmdlVHJhY2tpbmcgZ2V0WG1sQ2hhbmdlVHJhY2tpbmdGb3JVcGRhdGUoKSB7Ci0JCVhtbENoYW5nZVRyYWNraW5nIHhtbENoYW5nZVRyYWNraW5nID0gdGhpcy5nZXRYbWxDaGFuZ2VUcmFja2luZygpOwotCQlyZXR1cm4gKHhtbENoYW5nZVRyYWNraW5nICE9IG51bGwpID8geG1sQ2hhbmdlVHJhY2tpbmcgOiB0aGlzLmJ1aWxkWG1sQ2hhbmdlVHJhY2tpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sQ2hhbmdlVHJhY2tpbmcgYnVpbGRYbWxDaGFuZ2VUcmFja2luZygpIHsKLQkJWG1sQ2hhbmdlVHJhY2tpbmcgeG1sQ2hhbmdlVHJhY2tpbmcgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENoYW5nZVRyYWNraW5nKCk7Ci0JCXRoaXMuZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKS5zZXRDaGFuZ2VUcmFja2luZyh4bWxDaGFuZ2VUcmFja2luZyk7Ci0JCXJldHVybiB4bWxDaGFuZ2VUcmFja2luZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxDaGFuZ2VUcmFja2luZ0lmVW5zZXQoKSB7Ci0JCWlmICh0aGlzLmdldFhtbENoYW5nZVRyYWNraW5nKCkuaXNVbnNldCgpKSB7Ci0JCQl0aGlzLnJlbW92ZVhtbENoYW5nZVRyYWNraW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxDaGFuZ2VUcmFja2luZygpIHsKLQkJdGhpcy5nZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcigpLnNldENoYW5nZVRyYWNraW5nKG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBFY2xpcHNlTGlua09ybVR5cGVNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua09ybVR5cGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtPcm1UeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbFR5cGVNYXBwaW5nIGdldFhtbFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbENoYW5nZVRyYWNraW5nSG9sZGVyIGdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyKCkgewotCQlyZXR1cm4gKFhtbENoYW5nZVRyYWNraW5nSG9sZGVyKSB0aGlzLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rSmF2YVR5cGVNYXBwaW5nIGdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgZ2V0SmF2YUNoYW5nZVRyYWNraW5nRm9yRGVmYXVsdHMoKSB7Ci0JCUVjbGlwc2VMaW5rSmF2YVR5cGVNYXBwaW5nIGphdmFUeXBlTWFwcGluZyA9IHRoaXMuZ2V0SmF2YVR5cGVNYXBwaW5nRm9yRGVmYXVsdHMoKTsKLQkJcmV0dXJuIChqYXZhVHlwZU1hcHBpbmcgPT0gbnVsbCkgPyBudWxsIDogamF2YVR5cGVNYXBwaW5nLmdldENoYW5nZVRyYWNraW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRYbWxWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFhtbFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCVhtbENoYW5nZVRyYWNraW5nIHhtbENoYW5nZVRyYWNraW5nID0gdGhpcy5nZXRYbWxDaGFuZ2VUcmFja2luZygpOwotCQlyZXR1cm4gKHhtbENoYW5nZVRyYWNraW5nID09IG51bGwpID8gbnVsbCA6IHhtbENoYW5nZVRyYWNraW5nLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyNTRhMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVyc2lvblZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZQotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUKLXsKLQlwcml2YXRlIGZpbmFsIFhtbENvbnZlcnNpb25WYWx1ZSB4bWxDb252ZXJzaW9uVmFsdWU7Ci0KLQlwcml2YXRlIFN0cmluZyBkYXRhVmFsdWU7Ci0KLQlwcml2YXRlIFN0cmluZyBvYmplY3RWYWx1ZTsKLQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlKE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBwYXJlbnQsIFhtbENvbnZlcnNpb25WYWx1ZSB4bWxDb252ZXJzaW9uVmFsdWUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy54bWxDb252ZXJzaW9uVmFsdWUgPSB4bWxDb252ZXJzaW9uVmFsdWU7Ci0JCXRoaXMuZGF0YVZhbHVlID0geG1sQ29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpOwotCQl0aGlzLm9iamVjdFZhbHVlID0geG1sQ29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0RGF0YVZhbHVlXyh0aGlzLnhtbENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCXRoaXMuc2V0T2JqZWN0VmFsdWVfKHRoaXMueG1sQ29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkYXRhIHZhbHVlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhVmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0YVZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnNldERhdGFWYWx1ZV8odmFsdWUpOwotCQl0aGlzLnhtbENvbnZlcnNpb25WYWx1ZS5zZXREYXRhVmFsdWUodmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERhdGFWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRhdGFWYWx1ZTsKLQkJdGhpcy5kYXRhVmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvYmplY3QgdmFsdWUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRPYmplY3RWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuc2V0T2JqZWN0VmFsdWVfKHZhbHVlKTsKLQkJdGhpcy54bWxDb252ZXJzaW9uVmFsdWUuc2V0T2JqZWN0VmFsdWUodmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE9iamVjdFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMub2JqZWN0VmFsdWU7Ci0JCXRoaXMub2JqZWN0VmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9WQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBYbWxDb252ZXJzaW9uVmFsdWUgZ2V0WG1sQ29udmVyc2lvblZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy54bWxDb252ZXJzaW9uVmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RGF0YVZhbHVlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKHRoaXMueG1sQ29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZVRleHRSYW5nZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldE9iamVjdFZhbHVlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKHRoaXMueG1sQ29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlVGV4dFJhbmdlKCkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMueG1sQ29udmVyc2lvblZhbHVlLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFcXVpdmFsZW50VG8oRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlKSB7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLmRhdGFWYWx1ZSwgY29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKSAmJgotCQkJCVRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMub2JqZWN0VmFsdWUsIGNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIGNvbnZlcnRGcm9tKEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSB2YWx1ZSkgewotCQl0aGlzLnNldERhdGFWYWx1ZSh2YWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCXRoaXMuc2V0T2JqZWN0VmFsdWUodmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJ0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlNjA4NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkNvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkFic3RyYWN0T3JtQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtDb252ZXJ0Ci0JZXh0ZW5kcyBBYnN0cmFjdE9ybUNvbnZlcnRlcgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDb252ZXJ0Ci17Ci0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRDb252ZXJ0ZXJOYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENvbnZlcnRlck5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQ29udmVydChPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgT3JtQ29udmVydGVyLk93bmVyIG93bmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIpOwotCQl0aGlzLnNwZWNpZmllZENvbnZlcnRlck5hbWUgPSB0aGlzLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZygpLmdldENvbnZlcnQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKXsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lXyh0aGlzLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZygpLmdldENvbnZlcnQoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0Q29udmVydGVyTmFtZSh0aGlzLmJ1aWxkRGVmYXVsdENvbnZlcnRlck5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udmVydGVyTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZENvbnZlcnRlck5hbWUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZENvbnZlcnRlck5hbWUgOiB0aGlzLmRlZmF1bHRDb252ZXJ0ZXJOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ29udmVydGVyTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZV8obmFtZSk7Ci0JCXRoaXMuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkuc2V0Q29udmVydChuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lOwotCQl0aGlzLnNwZWNpZmllZENvbnZlcnRlck5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NPTlZFUlRFUl9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbnZlcnRlck5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRDb252ZXJ0ZXJOYW1lOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRDb252ZXJ0ZXJOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRDb252ZXJ0ZXJOYW1lOwotCQl0aGlzLmRlZmF1bHRDb252ZXJ0ZXJOYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQ09OVkVSVEVSX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRDb252ZXJ0ZXJOYW1lKCkgewotCQlyZXR1cm4gREVGQVVMVF9DT05WRVJURVJfTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgWG1sQ29udmVydGlibGVNYXBwaW5nIGdldFhtbENvbnZlcnRpYmxlTWFwcGluZygpIHsKLQkJLy8gY2FzdCB0byBFY2xpcHNlTGluayB0eXBlCi0JCXJldHVybiAoWG1sQ29udmVydGlibGVNYXBwaW5nKSBzdXBlci5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIENsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGdldFR5cGUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKS5zZXRDb252ZXJ0KHRoaXMuc3BlY2lmaWVkQ29udmVydGVyTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0WG1sVmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkuZ2V0Q29udmVydFRleHRSYW5nZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogY29tcGxldGlvbiBwcm9wb3NhbHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0WG1sQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0WG1sQ29tcGxldGlvblByb3Bvc2Fscyhwb3MpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJaWYgKHRoaXMuY29udmVydFZhbHVlVG91Y2hlcyhwb3MpKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRDb252ZXJ0ZXJOYW1lcygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbnZlcnRWYWx1ZVRvdWNoZXMoaW50IHBvcykgewotCQlyZXR1cm4gdGhpcy5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKS5jb252ZXJ0VG91Y2hlcyhwb3MpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gbmFtZXMgb2YgdGhlIHVzZXItZGVmaW5lZCBjb252ZXJ0ZXJzIGFuZCBvZiByZXNlcnZlZCBjb252ZXJ0ZXJzCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q29udmVydGVyTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFVuaXF1ZUNvbnZlcnRlck5hbWVzKCksCi0JCQkJQXJyYXlzLmFzTGlzdChFY2xpcHNlTGlua0NvbnZlcnQuUkVTRVJWRURfQ09OVkVSVEVSX05BTUVTKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBhZGFwdGVyICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQWRhcHRlcgotCQlpbXBsZW1lbnRzIE9ybUNvbnZlcnRlci5BZGFwdGVyLCBPcm1Db252ZXJ0ZXIuT3duZXIKLQl7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEFkYXB0ZXIgSU5TVEFOQ0UgPSBuZXcgQWRhcHRlcigpOwotCQlwdWJsaWMgc3RhdGljIEFkYXB0ZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQlwcml2YXRlIEFkYXB0ZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGdldENvbnZlcnRlclR5cGUoKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzOwotCQl9Ci0KLQkJcHVibGljIE9ybUNvbnZlcnRlciBidWlsZENvbnZlcnRlcihPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJCVhtbENvbnZlcnRpYmxlTWFwcGluZyB4bWxNYXBwaW5nID0gKFhtbENvbnZlcnRpYmxlTWFwcGluZykgcGFyZW50LmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQkJCXJldHVybiAoeG1sTWFwcGluZy5nZXRDb252ZXJ0KCkgPT0gbnVsbCkgPyBudWxsIDogbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydChwYXJlbnQsIHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoWG1sQXR0cmlidXRlTWFwcGluZyB4bWxNYXBwaW5nKSB7Ci0JCQlyZXR1cm4gKChYbWxDb252ZXJ0aWJsZU1hcHBpbmcpIHhtbE1hcHBpbmcpLmdldENvbnZlcnQoKSAhPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIE9ybUNvbnZlcnRlciBidWlsZE5ld0NvbnZlcnRlcihPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0KHBhcmVudCwgdGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjbGVhclhtbFZhbHVlKFhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sTWFwcGluZykgewotCQkJKChYbWxDb252ZXJ0aWJsZU1hcHBpbmcpIHhtbE1hcHBpbmcpLnNldENvbnZlcnQobnVsbCk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkVmFsaWRhdG9yKENvbnZlcnRlciBjb252ZXJ0ZXIsIENvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQ29udmVydFZhbGlkYXRvcigoRWNsaXBzZUxpbmtDb252ZXJ0KSBjb252ZXJ0ZXIsIHRleHRSYW5nZVJlc29sdmVyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTIyOTE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhTmFtZWRDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkRlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcjxYIGV4dGVuZHMgWG1sTmFtZWRDb252ZXJ0ZXI+Ci0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0NvbnZlcnRlcgotewotCXByb3RlY3RlZCBmaW5hbCBYIHhtbENvbnZlcnRlcjsKLQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyKFhtbENvbnRleHROb2RlIHBhcmVudCwgWCB4bWxDb252ZXJ0ZXIpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy54bWxDb252ZXJ0ZXIgPSB4bWxDb252ZXJ0ZXI7Ci0JCXRoaXMubmFtZSA9IHhtbENvbnZlcnRlci5nZXROYW1lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0TmFtZV8odGhpcy54bWxDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMuc2V0TmFtZV8obmFtZSk7Ci0JCXRoaXMueG1sQ29udmVydGVyLnNldE5hbWUobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbENvbnRleHROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChYbWxDb250ZXh0Tm9kZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIFggZ2V0WG1sQ29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy54bWxDb252ZXJ0ZXI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JfQotCi0JcHVibGljIGNoYXIgZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJcmV0dXJuICckJzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKgotCi0JcHVibGljIGFic3RyYWN0IEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpOwotCi0JcHVibGljIGFic3RyYWN0IEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKTsKLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy52YWxpZGF0ZU5hbWUobWVzc2FnZXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTmFtZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLm5hbWUpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgCi0JCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTlZFUlRFUl9OQU1FX1VOREVGSU5FRCwgCi0JCQkJCUVNUFRZX1NUUklOR19BUlJBWSwKLQkJCQkJdGhpcywKLQkJCQkJdGhpcy5nZXROYW1lVGV4dFJhbmdlKCkKLQkJCQkpCi0JCQkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKEFycmF5VG9vbHMuY29udGFpbnMoRWNsaXBzZUxpbmtDb252ZXJ0LlJFU0VSVkVEX0NPTlZFUlRFUl9OQU1FUywgdGhpcy5uYW1lKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlJFU0VSVkVEX0NPTlZFUlRFUl9OQU1FLAotCQkJCQlFTVBUWV9TVFJJTkdfQVJSQVksCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0TmFtZVRleHRSYW5nZSgpCi0JCQkJKQotCQkJKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLnhtbENvbnZlcnRlci5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKHRoaXMueG1sQ29udmVydGVyLmdldE5hbWVUZXh0UmFuZ2UoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFcXVpdmFsZW50VG8oSnBhTmFtZWRDb250ZXh0Tm9kZSBub2RlKSB7Ci0JCXJldHVybiAodGhpcyAhPSBub2RlKSAmJgotCQkJCSh0aGlzLmdldFR5cGUoKSA9PSBub2RlLmdldFR5cGUoKSkgJiYKLQkJCQlUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLm5hbWUsIG5vZGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1ldGFkYXRhIGNvbnZlcnNpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgY29udmVydEZyb20oSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyPD8+IGphdmFDb252ZXJ0ZXIpIHsKLQkJdGhpcy5zZXROYW1lKGphdmFDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckNsYXNzQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckNsYXNzQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OWEyNTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDbGFzc0NvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhTmFtZWRDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlckNsYXNzQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDbGFzc0NvbnZlcnRlcjxYIGV4dGVuZHMgWG1sTmFtZWRDb252ZXJ0ZXI+Ci0JZXh0ZW5kcyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcjxYPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXJDbGFzc0NvbnZlcnRlcgotewotCXByaXZhdGUgU3RyaW5nIGNvbnZlcnRlckNsYXNzOwotCXByaXZhdGUgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3M7Ci0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNsYXNzQ29udmVydGVyKFhtbENvbnRleHROb2RlIHBhcmVudCwgWCB4bWxDb252ZXJ0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxDb252ZXJ0ZXIpOwotCQl0aGlzLmNvbnZlcnRlckNsYXNzID0gdGhpcy5nZXRYbWxDb252ZXJ0ZXJDbGFzcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldENvbnZlcnRlckNsYXNzXyh0aGlzLmdldFhtbENvbnZlcnRlckNsYXNzKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzcyh0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzcygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBjbGFzcyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXJDbGFzcyhTdHJpbmcgY29udmVydGVyQ2xhc3MpIHsKLQkJdGhpcy5zZXRDb252ZXJ0ZXJDbGFzc18oY29udmVydGVyQ2xhc3MpOwotCQl0aGlzLnNldFhtbENvbnZlcnRlckNsYXNzKGNvbnZlcnRlckNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb252ZXJ0ZXJDbGFzc18oU3RyaW5nIG5ld0NvbnZlcnRlckNsYXNzKSB7Ci0JCVN0cmluZyBvbGRDb252ZXJ0ZXJDbGFzcyA9IHRoaXMuY29udmVydGVyQ2xhc3M7Ci0JCXRoaXMuY29udmVydGVyQ2xhc3MgPSBuZXdDb252ZXJ0ZXJDbGFzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSwgb2xkQ29udmVydGVyQ2xhc3MsIG5ld0NvbnZlcnRlckNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3M7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzcyhTdHJpbmcgY29udmVydGVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzczsKLQkJdGhpcy5mdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzID0gY29udmVydGVyQ2xhc3M7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfQ09OVkVSVEVSX0NMQVNTX1BST1BFUlRZLCBvbGQsIGNvbnZlcnRlckNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZ0ZpbGVSb290KCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKHRoaXMuY29udmVydGVyQ2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgZ2V0Q29udmVydGVySmF2YVJlc291cmNlVHlwZSgpIHsKLQkJaWYgKHRoaXMuZnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZSh0aGlzLmZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0WG1sQ29udmVydGVyQ2xhc3MoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNldFhtbENvbnZlcnRlckNsYXNzKFN0cmluZyBjb252ZXJ0ZXJDbGFzcyk7Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMudmFsaWRhdGVDb252ZXJ0ZXJDbGFzcyhtZXNzYWdlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDb252ZXJ0ZXJDbGFzcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmNvbnZlcnRlckNsYXNzKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTlZFUlRFUl9DTEFTU19ERUZJTkVELAotCQkJCQl0aGlzLAotCQkJCQl0aGlzLmdldENvbnZlcnRlckNsYXNzVGV4dFJhbmdlKCkKLQkJCQkpCi0JCQkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVR5cGUgY29udmVydGVySmR0VHlwZSA9IEpEVFRvb2xzLmZpbmRUeXBlKHRoaXMuZ2V0SmF2YVByb2plY3QoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzKCkpOyAKLQkJaWYgKGNvbnZlcnRlckpkdFR5cGUgPT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTlZFUlRFUl9DTEFTU19FWElTVFMsCi0JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzKCl9LAotCQkJCQl0aGlzLAotCQkJCQl0aGlzLmdldENvbnZlcnRlckNsYXNzVGV4dFJhbmdlKCkKLQkJCQkpCi0JCQkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCAhIHRoaXMuY29udmVydGVyQ2xhc3NJbXBsZW1lbnRzSW50ZXJmYWNlKHRoaXMuZ2V0RWNsaXBzZUxpbmtDb252ZXJ0ZXJJbnRlcmZhY2UoKSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQl0aGlzLmdldEVjbGlwc2VMaW5rQ29udmVydGVySW50ZXJmYWNlRXJyb3JNZXNzYWdlKCksCi0JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzKCl9LAotCQkJCQl0aGlzLAotCQkJCQl0aGlzLmdldENvbnZlcnRlckNsYXNzVGV4dFJhbmdlKCkKLQkJCQkpCi0JCQkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBFY2xpcHNlTGluayBpbnRlcmZhY2UgdGhlIGNvbnZlcnRlciBjbGFzcyBtdXN0Ci0JICogaW1wbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RWNsaXBzZUxpbmtDb252ZXJ0ZXJJbnRlcmZhY2UoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RWNsaXBzZUxpbmtDb252ZXJ0ZXJJbnRlcmZhY2VFcnJvck1lc3NhZ2UoKTsKLQotCS8qKgotCSAqIEFkZCA8Y29kZT5udWxsPC9jb2RlPiBjaGVjay4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0eXBlSW1wbGVtZW50c0ludGVyZmFjZShTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBpbnRlcmZhY2VOYW1lKSB7Ci0JCXJldHVybiAodHlwZU5hbWUgIT0gbnVsbCkgJiYgCi0JCQkJSkRUVG9vbHMudHlwZUlzU3ViVHlwZSh0aGlzLmdldEphdmFQcm9qZWN0KCksIHR5cGVOYW1lLCBpbnRlcmZhY2VOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb252ZXJ0ZXJDbGFzc0ltcGxlbWVudHNJbnRlcmZhY2UoU3RyaW5nIGludGVyZmFjZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMudHlwZUltcGxlbWVudHNJbnRlcmZhY2UodGhpcy5nZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzKCksIGludGVyZmFjZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy5nZXRYbWxDb252ZXJ0ZXJDbGFzc1RleHRSYW5nZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVGV4dFJhbmdlIGdldFhtbENvbnZlcnRlckNsYXNzVGV4dFJhbmdlKCk7Ci0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRXF1aXZhbGVudFRvKEpwYU5hbWVkQ29udGV4dE5vZGUgbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuaXNFcXVpdmFsZW50VG8obm9kZSkKLQkJCQkmJiB0aGlzLmlzRXF1aXZhbGVudFRvKChFY2xpcHNlTGlua0NvbnZlcnRlckNsYXNzQ29udmVydGVyKSBub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VxdWl2YWxlbnRUbyhFY2xpcHNlTGlua0NvbnZlcnRlckNsYXNzQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy5nZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzKCksIGNvbnZlcnRlci5nZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5pc0ZvcihvcmlnaW5hbFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZUVkaXQob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZUVkaXQoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSk7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIHRoaXMuaXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChuZXdQYWNrYWdlLmdldEVsZW1lbnROYW1lKCkpKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQoU3RyaW5nIG5ld05hbWUpOwotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmlzSW4ob3JpZ2luYWxQYWNrYWdlKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChuZXdOYW1lKSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGb3IoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCVN0cmluZyBjb252ZXJ0ZXJUeXBlID0gdGhpcy5nZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzKCk7Ci0JCXJldHVybiAoY29udmVydGVyVHlwZSAhPSBudWxsKSAmJiBjb252ZXJ0ZXJUeXBlLmVxdWFscyh0eXBlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbihJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCkgewotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY29udmVydGVyVHlwZSA9IHRoaXMuZ2V0Q29udmVydGVySmF2YVJlc291cmNlVHlwZSgpOwotCQlyZXR1cm4gKGNvbnZlcnRlclR5cGUgIT0gbnVsbCkgJiYgY29udmVydGVyVHlwZS5pc0luKHBhY2thZ2VGcmFnbWVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRmODNjNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyCi17Ci0KLQlwcml2YXRlIGZpbmFsIE93bmVyIG93bmVyOwotCXByaXZhdGUgZmluYWwgWG1sQ29udmVydGVyQ29udGFpbmVyIHhtbENvbnZlcnRlckNvbnRhaW5lcjsKLQotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciwgWG1sQ29udmVydGVyPiBjdXN0b21Db252ZXJ0ZXJDb250YWluZXI7Ci0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciwgWG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gb2JqZWN0VHlwZUNvbnZlcnRlckNvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8T3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIsIFhtbFN0cnVjdENvbnZlcnRlcj4gc3RydWN0Q29udmVydGVyQ29udGFpbmVyOwotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIsIFhtbFR5cGVDb252ZXJ0ZXI+IHR5cGVDb252ZXJ0ZXJDb250YWluZXI7Ci0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBPd25lciBvd25lciwgIFhtbENvbnZlcnRlckNvbnRhaW5lciB4bWxDb252ZXJ0ZXJDb250YWluZXIpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLnhtbENvbnZlcnRlckNvbnRhaW5lciA9IHhtbENvbnZlcnRlckNvbnRhaW5lcjsKLQotCQl0aGlzLmN1c3RvbUNvbnZlcnRlckNvbnRhaW5lciA9IHRoaXMuYnVpbGRDdXN0b21Db252ZXJ0ZXJDb250YWluZXIoKTsKLQkJdGhpcy5vYmplY3RUeXBlQ29udmVydGVyQ29udGFpbmVyID0gdGhpcy5idWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJdGhpcy5zdHJ1Y3RDb252ZXJ0ZXJDb250YWluZXIgPSB0aGlzLmJ1aWxkU3RydWN0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCXRoaXMudHlwZUNvbnZlcnRlckNvbnRhaW5lciA9IHRoaXMuYnVpbGRUeXBlQ29udmVydGVyQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY0N1c3RvbUNvbnZlcnRlcnMoKTsKLQkJdGhpcy5zeW5jT2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJdGhpcy5zeW5jU3RydWN0Q29udmVydGVycygpOwotCQl0aGlzLnN5bmNUeXBlQ29udmVydGVycygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlTm9kZXModGhpcy5nZXRDdXN0b21Db252ZXJ0ZXJzKCkpOwotCQl0aGlzLnVwZGF0ZU5vZGVzKHRoaXMuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSk7Ci0JCXRoaXMudXBkYXRlTm9kZXModGhpcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkpOwotCQl0aGlzLnVwZGF0ZU5vZGVzKHRoaXMuZ2V0VHlwZUNvbnZlcnRlcnMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGN1c3RvbSBjb252ZXJ0ZXJzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IGdldEN1c3RvbUNvbnZlcnRlcnMoKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbUNvbnZlcnRlckNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21Db252ZXJ0ZXJDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBhZGRDdXN0b21Db252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmFkZEN1c3RvbUNvbnZlcnRlcih0aGlzLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBhZGRDdXN0b21Db252ZXJ0ZXIoaW50IGluZGV4KSB7Ci0JCVhtbENvbnZlcnRlciB4bWxDb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkWG1sQ3VzdG9tQ29udmVydGVyKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnZlcnRlciA9IHRoaXMuY3VzdG9tQ29udmVydGVyQ29udGFpbmVyLmFkZENvbnRleHRFbGVtZW50KGluZGV4LCB4bWxDb252ZXJ0ZXIpOwotCQl0aGlzLnhtbENvbnZlcnRlckNvbnRhaW5lci5nZXRDb252ZXJ0ZXJzKCkuYWRkKGluZGV4LCB4bWxDb252ZXJ0ZXIpOwotCQlyZXR1cm4gY29udmVydGVyOwotCX0KLQotCXByb3RlY3RlZCBYbWxDb252ZXJ0ZXIgYnVpbGRYbWxDdXN0b21Db252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUN1c3RvbUNvbnZlcnRlcihFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJdGhpcy5yZW1vdmVDdXN0b21Db252ZXJ0ZXIodGhpcy5jdXN0b21Db252ZXJ0ZXJDb250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KChPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgY29udmVydGVyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ3VzdG9tQ29udmVydGVyKGludCBpbmRleCkgewotCQl0aGlzLmN1c3RvbUNvbnZlcnRlckNvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JCXRoaXMueG1sQ29udmVydGVyQ29udGFpbmVyLmdldENvbnZlcnRlcnMoKS5yZW1vdmUoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVDdXN0b21Db252ZXJ0ZXIoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5jdXN0b21Db252ZXJ0ZXJDb250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMueG1sQ29udmVydGVyQ29udGFpbmVyLmdldENvbnZlcnRlcnMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGJ1aWxkQ3VzdG9tQ29udmVydGVyKFhtbENvbnZlcnRlciB4bWxDb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcih0aGlzLCB4bWxDb252ZXJ0ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNDdXN0b21Db252ZXJ0ZXJzKCkgewotCQl0aGlzLmN1c3RvbUNvbnZlcnRlckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxDb252ZXJ0ZXI+IGdldFhtbEN1c3RvbUNvbnZlcnRlcnMoKSB7Ci0JCS8vIGNsb25lIHRvIHJlZHVjZSBjaGFuY2Ugb2YgY29uY3VycmVuY3kgcHJvYmxlbXMKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8WG1sQ29udmVydGVyPih0aGlzLnhtbENvbnZlcnRlckNvbnRhaW5lci5nZXRDb252ZXJ0ZXJzKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciwgWG1sQ29udmVydGVyPiBidWlsZEN1c3RvbUNvbnZlcnRlckNvbnRhaW5lcigpIHsKLQkJQ3VzdG9tQ29udmVydGVyQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBDdXN0b21Db252ZXJ0ZXJDb250YWluZXIoKTsKLQkJY29udGFpbmVyLmluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBjdXN0b20gY29udmVydGVyIGNvbnRhaW5lcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBDdXN0b21Db252ZXJ0ZXJDb250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciwgWG1sQ29udmVydGVyPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIENVU1RPTV9DT05WRVJURVJTX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBidWlsZENvbnRleHRFbGVtZW50KFhtbENvbnZlcnRlciByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwudGhpcy5idWlsZEN1c3RvbUNvbnZlcnRlcihyZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFhtbENvbnZlcnRlcj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwudGhpcy5nZXRYbWxDdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxDb252ZXJ0ZXIgZ2V0UmVzb3VyY2VFbGVtZW50KE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0WG1sQ29udmVydGVyKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogb2JqZWN0IHR5cGUgY29udmVydGVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcih0aGlzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoaW50IGluZGV4KSB7Ci0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgeG1sQ29udmVydGVyID0gdGhpcy5idWlsZFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlckNvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgeG1sQ29udmVydGVyKTsKLQkJdGhpcy54bWxDb252ZXJ0ZXJDb250YWluZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5hZGQoaW5kZXgsIHhtbENvbnZlcnRlcik7Ci0JCXJldHVybiBjb252ZXJ0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgYnVpbGRYbWxPYmplY3RUeXBlQ29udmVydGVyKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCXRoaXMucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcih0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJDb250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KChPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpIGNvbnZlcnRlcikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoaW50IGluZGV4KSB7Ci0JCXRoaXMub2JqZWN0VHlwZUNvbnZlcnRlckNvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JCXRoaXMueG1sQ29udmVydGVyQ29udGFpbmVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJDb250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMueG1sQ29udmVydGVyQ29udGFpbmVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgYnVpbGRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgeG1sQ29udmVydGVyKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKHRoaXMsIHhtbENvbnZlcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY09iamVjdFR5cGVDb252ZXJ0ZXJzKCkgewotCQl0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB7Ci0JCS8vIGNsb25lIHRvIHJlZHVjZSBjaGFuY2Ugb2YgY29uY3VycmVuY3kgcHJvYmxlbXMKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4odGhpcy54bWxDb252ZXJ0ZXJDb250YWluZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciwgWG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gYnVpbGRPYmplY3RUeXBlQ29udmVydGVyQ29udGFpbmVyKCkgewotCQlPYmplY3RUeXBlQ29udmVydGVyQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBPYmplY3RUeXBlQ29udmVydGVyQ29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogb2JqZWN0IHR5cGUgY29udmVydGVyIGNvbnRhaW5lcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBPYmplY3RUeXBlQ29udmVydGVyQ29udGFpbmVyCi0JCWV4dGVuZHMgQ29udGV4dExpc3RDb250YWluZXI8T3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLCBYbWxPYmplY3RUeXBlQ29udmVydGVyPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIE9CSkVDVF9UWVBFX0NPTlZFUlRFUlNfTElTVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBidWlsZENvbnRleHRFbGVtZW50KFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLnRoaXMuYnVpbGRPYmplY3RUeXBlQ29udmVydGVyKHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwudGhpcy5nZXRYbWxPYmplY3RUeXBlQ29udmVydGVycygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBnZXRSZXNvdXJjZUVsZW1lbnQoT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0WG1sQ29udmVydGVyKCk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIHN0cnVjdCBjb252ZXJ0ZXJzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IGdldFN0cnVjdENvbnZlcnRlcnMoKSB7Ci0JCXJldHVybiB0aGlzLnN0cnVjdENvbnZlcnRlckNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zdHJ1Y3RDb252ZXJ0ZXJDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBhZGRTdHJ1Y3RDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmFkZFN0cnVjdENvbnZlcnRlcih0aGlzLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBhZGRTdHJ1Y3RDb252ZXJ0ZXIoaW50IGluZGV4KSB7Ci0JCVhtbFN0cnVjdENvbnZlcnRlciB4bWxDb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkWG1sU3RydWN0Q29udmVydGVyKCk7Ci0JCU9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlciA9IHRoaXMuc3RydWN0Q29udmVydGVyQ29udGFpbmVyLmFkZENvbnRleHRFbGVtZW50KGluZGV4LCB4bWxDb252ZXJ0ZXIpOwotCQl0aGlzLnhtbENvbnZlcnRlckNvbnRhaW5lci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkKGluZGV4LCB4bWxDb252ZXJ0ZXIpOwotCQlyZXR1cm4gY29udmVydGVyOwotCX0KLQotCXByb3RlY3RlZCBYbWxTdHJ1Y3RDb252ZXJ0ZXIgYnVpbGRYbWxTdHJ1Y3RDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVN0cnVjdENvbnZlcnRlcihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJdGhpcy5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIodGhpcy5zdHJ1Y3RDb252ZXJ0ZXJDb250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KChPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgY29udmVydGVyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3RydWN0Q29udmVydGVyKGludCBpbmRleCkgewotCQl0aGlzLnN0cnVjdENvbnZlcnRlckNvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JCXRoaXMueG1sQ29udmVydGVyQ29udGFpbmVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5yZW1vdmUoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVTdHJ1Y3RDb252ZXJ0ZXIoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5zdHJ1Y3RDb252ZXJ0ZXJDb250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMueG1sQ29udmVydGVyQ29udGFpbmVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGJ1aWxkU3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlciB4bWxDb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcih0aGlzLCB4bWxDb252ZXJ0ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNTdHJ1Y3RDb252ZXJ0ZXJzKCkgewotCQl0aGlzLnN0cnVjdENvbnZlcnRlckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxTdHJ1Y3RDb252ZXJ0ZXI+IGdldFhtbFN0cnVjdENvbnZlcnRlcnMoKSB7Ci0JCS8vIGNsb25lIHRvIHJlZHVjZSBjaGFuY2Ugb2YgY29uY3VycmVuY3kgcHJvYmxlbXMKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8WG1sU3RydWN0Q29udmVydGVyPih0aGlzLnhtbENvbnZlcnRlckNvbnRhaW5lci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciwgWG1sU3RydWN0Q29udmVydGVyPiBidWlsZFN0cnVjdENvbnZlcnRlckNvbnRhaW5lcigpIHsKLQkJU3RydWN0Q29udmVydGVyQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTdHJ1Y3RDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJY29udGFpbmVyLmluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBzdHJ1Y3QgY29udmVydGVyIGNvbnRhaW5lcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBTdHJ1Y3RDb252ZXJ0ZXJDb250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciwgWG1sU3RydWN0Q29udmVydGVyPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFNUUlVDVF9DT05WRVJURVJTX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBidWlsZENvbnRleHRFbGVtZW50KFhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwudGhpcy5idWlsZFN0cnVjdENvbnZlcnRlcihyZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFhtbFN0cnVjdENvbnZlcnRlcj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwudGhpcy5nZXRYbWxTdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxTdHJ1Y3RDb252ZXJ0ZXIgZ2V0UmVzb3VyY2VFbGVtZW50KE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0WG1sQ29udmVydGVyKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHlwZSBjb252ZXJ0ZXJzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBnZXRUeXBlQ29udmVydGVycygpIHsKLQkJcmV0dXJuIHRoaXMudHlwZUNvbnZlcnRlckNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZUNvbnZlcnRlckNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHNTaXplKCk7Ci0JfQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBhZGRUeXBlQ29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5hZGRUeXBlQ29udmVydGVyKHRoaXMuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgYWRkVHlwZUNvbnZlcnRlcihpbnQgaW5kZXgpIHsKLQkJWG1sVHlwZUNvbnZlcnRlciB4bWxDb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkWG1sVHlwZUNvbnZlcnRlcigpOwotCQlPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gdGhpcy50eXBlQ29udmVydGVyQ29udGFpbmVyLmFkZENvbnRleHRFbGVtZW50KGluZGV4LCB4bWxDb252ZXJ0ZXIpOwotCQl0aGlzLnhtbENvbnZlcnRlckNvbnRhaW5lci5nZXRUeXBlQ29udmVydGVycygpLmFkZChpbmRleCwgeG1sQ29udmVydGVyKTsKLQkJcmV0dXJuIGNvbnZlcnRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sVHlwZUNvbnZlcnRlciBidWlsZFhtbFR5cGVDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVUeXBlQ29udmVydGVyKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJdGhpcy5yZW1vdmVUeXBlQ29udmVydGVyKHRoaXMudHlwZUNvbnZlcnRlckNvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoKE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgY29udmVydGVyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlVHlwZUNvbnZlcnRlcihpbnQgaW5kZXgpIHsKLQkJdGhpcy50eXBlQ29udmVydGVyQ29udGFpbmVyLnJlbW92ZUNvbnRleHRFbGVtZW50KGluZGV4KTsKLQkJdGhpcy54bWxDb252ZXJ0ZXJDb250YWluZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVUeXBlQ29udmVydGVyKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMudHlwZUNvbnZlcnRlckNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy54bWxDb252ZXJ0ZXJDb250YWluZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBidWlsZFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciB4bWxDb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIodGhpcywgeG1sQ29udmVydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jVHlwZUNvbnZlcnRlcnMoKSB7Ci0JCXRoaXMudHlwZUNvbnZlcnRlckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxUeXBlQ29udmVydGVyPiBnZXRYbWxUeXBlQ29udmVydGVycygpIHsKLQkJLy8gY2xvbmUgdG8gcmVkdWNlIGNoYW5jZSBvZiBjb25jdXJyZW5jeSBwcm9ibGVtcwotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxYbWxUeXBlQ29udmVydGVyPih0aGlzLnhtbENvbnZlcnRlckNvbnRhaW5lci5nZXRUeXBlQ29udmVydGVycygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8T3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLCBYbWxUeXBlQ29udmVydGVyPiBidWlsZFR5cGVDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCVR5cGVDb252ZXJ0ZXJDb250YWluZXIgY29udGFpbmVyID0gbmV3IFR5cGVDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJY29udGFpbmVyLmluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiB0eXBlIGNvbnZlcnRlciBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgVHlwZUNvbnZlcnRlckNvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciwgWG1sVHlwZUNvbnZlcnRlcj4KLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBUWVBFX0NPTlZFUlRFUlNfTElTVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBidWlsZENvbnRleHRFbGVtZW50KFhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLnRoaXMuYnVpbGRUeXBlQ29udmVydGVyKHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sVHlwZUNvbnZlcnRlcj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwudGhpcy5nZXRYbWxUeXBlQ29udmVydGVycygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sVHlwZUNvbnZlcnRlciBnZXRSZXNvdXJjZUVsZW1lbnQoT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0WG1sQ29udmVydGVyKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKgotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCXRoaXMuY3JlYXRlUmVuYW1lT2JqZWN0VHlwZUNvbnZlcnRlckVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNyZWF0ZVJlbmFtZVR5cGVDb252ZXJ0ZXJFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpLAotCQkJdGhpcy5jcmVhdGVSZW5hbWVTdHJ1Y3RDb252ZXJ0ZXJFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpLAotCQkJdGhpcy5jcmVhdGVSZW5hbWVDdXN0b21Db252ZXJ0ZXJFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZU9iamVjdFR5cGVDb252ZXJ0ZXJFZGl0cyhmaW5hbCBJVHlwZSBvcmlnaW5hbFR5cGUsIGZpbmFsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8T3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHRyYW5zZm9ybShPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb2JqZWN0VHlwZUNvbnZlcnRlcikgewotCQkJCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlci5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVUeXBlQ29udmVydGVyRWRpdHMoZmluYWwgSVR5cGUgb3JpZ2luYWxUeXBlLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+PihnZXRUeXBlQ29udmVydGVycygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIHR5cGVDb252ZXJ0ZXIpIHsKLQkJCQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lU3RydWN0Q29udmVydGVyRWRpdHMoZmluYWwgSVR5cGUgb3JpZ2luYWxUeXBlLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KGdldFN0cnVjdENvbnZlcnRlcnMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gdHJhbnNmb3JtKE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIHN0cnVjdENvbnZlcnRlcikgewotCQkJCQlyZXR1cm4gc3RydWN0Q29udmVydGVyLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZUN1c3RvbUNvbnZlcnRlckVkaXRzKGZpbmFsIElUeXBlIG9yaWdpbmFsVHlwZSwgZmluYWwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+PihnZXRDdXN0b21Db252ZXJ0ZXJzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHRyYW5zZm9ybShPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjdXN0b21Db252ZXJ0ZXIpIHsKLQkJCQkJcmV0dXJuIGN1c3RvbUNvbnZlcnRlci5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJdGhpcy5jcmVhdGVNb3ZlT2JqZWN0VHlwZUNvbnZlcnRlckVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQl0aGlzLmNyZWF0ZU1vdmVUeXBlQ29udmVydGVyRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSwKLQkJCXRoaXMuY3JlYXRlTW92ZVN0cnVjdENvbnZlcnRlckVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQl0aGlzLmNyZWF0ZU1vdmVDdXN0b21Db252ZXJ0ZXJFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVPYmplY3RUeXBlQ29udmVydGVyRWRpdHMoZmluYWwgSVR5cGUgb3JpZ2luYWxUeXBlLCBmaW5hbCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4oZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gdHJhbnNmb3JtKE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvYmplY3RUeXBlQ29udmVydGVyKSB7Ci0JCQkJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUNvbnZlcnRlckVkaXRzKGZpbmFsIElUeXBlIG9yaWdpbmFsVHlwZSwgZmluYWwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8T3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KGdldFR5cGVDb252ZXJ0ZXJzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHRyYW5zZm9ybShPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgdHlwZUNvbnZlcnRlcikgewotCQkJCQlyZXR1cm4gdHlwZUNvbnZlcnRlci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVN0cnVjdENvbnZlcnRlckVkaXRzKGZpbmFsIElUeXBlIG9yaWdpbmFsVHlwZSwgZmluYWwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8T3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4oZ2V0U3RydWN0Q29udmVydGVycygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgc3RydWN0Q29udmVydGVyKSB7Ci0JCQkJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVDdXN0b21Db252ZXJ0ZXJFZGl0cyhmaW5hbCBJVHlwZSBvcmlnaW5hbFR5cGUsIGZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KGdldEN1c3RvbUNvbnZlcnRlcnMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gdHJhbnNmb3JtKE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGN1c3RvbUNvbnZlcnRlcikgewotCQkJCQlyZXR1cm4gY3VzdG9tQ29udmVydGVyLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQl0aGlzLmNyZWF0ZU9iamVjdFR5cGVDb252ZXJ0ZXJSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCXRoaXMuY3JlYXRlVHlwZUNvbnZlcnRlclJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpLAotCQkJdGhpcy5jcmVhdGVTdHJ1Y3RDb252ZXJ0ZXJSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCXRoaXMuY3JlYXRlQ3VzdG9tQ29udmVydGVyUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlT2JqZWN0VHlwZUNvbnZlcnRlclJlbmFtZVBhY2thZ2VFZGl0cyhmaW5hbCBJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgZmluYWwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4oZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gdHJhbnNmb3JtKE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvYmplY3RUeXBlQ29udmVydGVyKSB7Ci0JCQkJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVR5cGVDb252ZXJ0ZXJSZW5hbWVQYWNrYWdlRWRpdHMoZmluYWwgSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIGZpbmFsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8T3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KGdldFR5cGVDb252ZXJ0ZXJzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHRyYW5zZm9ybShPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgdHlwZUNvbnZlcnRlcikgewotCQkJCQlyZXR1cm4gdHlwZUNvbnZlcnRlci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVTdHJ1Y3RDb252ZXJ0ZXJSZW5hbWVQYWNrYWdlRWRpdHMoZmluYWwgSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIGZpbmFsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8T3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4oZ2V0U3RydWN0Q29udmVydGVycygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgc3RydWN0Q29udmVydGVyKSB7Ci0JCQkJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXIuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ3VzdG9tQ29udmVydGVyUmVuYW1lUGFja2FnZUVkaXRzKGZpbmFsIElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KGdldEN1c3RvbUNvbnZlcnRlcnMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gdHJhbnNmb3JtKE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGN1c3RvbUNvbnZlcnRlcikgewotCQkJCQlyZXR1cm4gY3VzdG9tQ29udmVydGVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgY29udmVydGVycyBhcmUgdmFsaWRhdGVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQjdmFsaWRhdGVDb252ZXJ0ZXJzKExpc3QsIElSZXBvcnRlcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCS8vIGNvbnZlcnRlcnMgYXJlIHZhbGlkYXRlZCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLnhtbENvbnZlcnRlckNvbnRhaW5lci5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPigKLQkJCQkJdGhpcy5nZXRDdXN0b21Db252ZXJ0ZXJzKCksCi0JCQkJCXRoaXMuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSwKLQkJCQkJdGhpcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCksCi0JCQkJCXRoaXMuZ2V0VHlwZUNvbnZlcnRlcnMoKQotCQkJCSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb252ZXJ0ZXJzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKQotCQkJKyB0aGlzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpCi0JCQkrIHRoaXMuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKQotCQkJKyB0aGlzLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyU3VwcG9ydGVkQ29udmVydGVycygpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0TnVtYmVyU3VwcG9ydGVkQ29udmVydGVycygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoWG1sQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGY3NTIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIKLQlleHRlbmRzIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ2xhc3NDb252ZXJ0ZXI8WG1sQ29udmVydGVyPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIKLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBYbWxDb252ZXJ0ZXIgeG1sQ29udmVydGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sQ29udmVydGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyIGNsYXNzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0WG1sQ29udmVydGVyQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLnhtbENvbnZlcnRlci5nZXRDbGFzc05hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxDb252ZXJ0ZXJDbGFzcyhTdHJpbmcgY29udmVydGVyQ2xhc3MpIHsKLQkJdGhpcy54bWxDb252ZXJ0ZXIuc2V0Q2xhc3NOYW1lKGNvbnZlcnRlckNsYXNzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgQ2xhc3M8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IGdldFR5cGUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5jbGFzczsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZUVkaXQoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy54bWxDb252ZXJ0ZXIuY3JlYXRlUmVuYW1lRWRpdChvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy54bWxDb252ZXJ0ZXIuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQobmV3TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWNsaXBzZUxpbmtDb252ZXJ0ZXJJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBFQ0xJUFNFTElOS19DT05WRVJURVJfQ0xBU1NfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVjbGlwc2VMaW5rQ29udmVydGVySW50ZXJmYWNlRXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09OVkVSVEVSX0NMQVNTX0lNUExFTUVOVFNfQ09OVkVSVEVSOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0WG1sQ29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnhtbENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzc1RleHRSYW5nZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogbWV0YWRhdGEgY29udmVyc2lvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBjb252ZXJ0RnJvbShKYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgamF2YUNvbnZlcnRlcikgewotCQlzdXBlci5jb252ZXJ0RnJvbShqYXZhQ29udmVydGVyKTsKLQkJdGhpcy5zZXRDb252ZXJ0ZXJDbGFzcyhqYXZhQ29udmVydGVyLmdldEZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3MoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDdXN0b21pemVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0N1c3RvbWl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I3MWE2Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0N1c3RvbWl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkRlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplckhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0N1c3RvbWl6ZXIKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ3VzdG9taXplcgotewotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkQ3VzdG9taXplckNsYXNzOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdEN1c3RvbWl6ZXJDbGFzczsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzOwotCi0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDdXN0b21pemVyKEVjbGlwc2VMaW5rT3JtVHlwZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuc3BlY2lmaWVkQ3VzdG9taXplckNsYXNzID0gdGhpcy5idWlsZFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzc18odGhpcy5idWlsZFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHRDdXN0b21pemVyQ2xhc3ModGhpcy5idWlsZERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCXRoaXMuc2V0RnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3ModGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjdXN0b21pemVyIGNsYXNzICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9taXplckNsYXNzKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkQ3VzdG9taXplckNsYXNzICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MgOiB0aGlzLmRlZmF1bHRDdXN0b21pemVyQ2xhc3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoU3RyaW5nIGN1c3RvbWl6ZXJDbGFzcykgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MsIGN1c3RvbWl6ZXJDbGFzcykpIHsKLQkJCVhtbENsYXNzUmVmZXJlbmNlIHhtbENsYXNzUmVmID0gdGhpcy5nZXRYbWxDdXN0b21pemVyQ2xhc3NSZWZGb3JVcGRhdGUoKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzXyhjdXN0b21pemVyQ2xhc3MpOwotCQkJeG1sQ2xhc3NSZWYuc2V0Q2xhc3NOYW1lKGN1c3RvbWl6ZXJDbGFzcyk7Ci0JCQl0aGlzLnJlbW92ZVhtbEN1c3RvbWl6ZXJDbGFzc1JlZklmVW5zZXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzc18oU3RyaW5nIGN1c3RvbWl6ZXJDbGFzcykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRDdXN0b21pemVyQ2xhc3M7Ci0JCXRoaXMuc3BlY2lmaWVkQ3VzdG9taXplckNsYXNzID0gY3VzdG9taXplckNsYXNzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NVU1RPTUlaRVJfQ0xBU1NfUFJPUEVSVFksIG9sZCwgY3VzdG9taXplckNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkgewotCQlYbWxDbGFzc1JlZmVyZW5jZSB4bWxDbGFzc1JlZiA9IHRoaXMuZ2V0WG1sQ3VzdG9taXplckNsYXNzUmVmKCk7Ci0JCXJldHVybiAoeG1sQ2xhc3NSZWYgPT0gbnVsbCkgPyBudWxsIDogeG1sQ2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q3VzdG9taXplckNsYXNzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoU3RyaW5nIGN1c3RvbWl6ZXJDbGFzcykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0Q3VzdG9taXplckNsYXNzOwotCQl0aGlzLmRlZmF1bHRDdXN0b21pemVyQ2xhc3MgPSBjdXN0b21pemVyQ2xhc3M7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NVU1RPTUlaRVJfQ0xBU1NfUFJPUEVSVFksIG9sZCwgY3VzdG9taXplckNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpIHsKLQkJSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplciBqYXZhQ3VzdG9taXplciA9IHRoaXMuZ2V0SmF2YUN1c3RvbWl6ZXJGb3JEZWZhdWx0cygpOwotCQlyZXR1cm4gKGphdmFDdXN0b21pemVyID09IG51bGwpID8gbnVsbCA6IGphdmFDdXN0b21pemVyLmdldEZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3M7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3MoU3RyaW5nIGN1c3RvbWl6ZXJDbGFzcykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzczsKLQkJdGhpcy5mdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzcyA9IGN1c3RvbWl6ZXJDbGFzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9DVVNUT01JWkVSX0NMQVNTX1BST1BFUlRZLCBvbGQsIGN1c3RvbWl6ZXJDbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkQ3VzdG9taXplckNsYXNzID09IG51bGwpID8KLQkJCS8vdGhpcyBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGphdmEgY3VzdG9taXplciBjbGFzcyBuYW1lCi0JCQl0aGlzLmRlZmF1bHRDdXN0b21pemVyQ2xhc3MgOgotCQkJdGhpcy5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSh0aGlzLnNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHhtbCBjdXN0b21pemVyIGNsYXNzIHJlZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgWE1MIGNsYXNzIHJlZiBkb2VzIG5vdCBleGlzdHMuCi0JICovCi0JcHJvdGVjdGVkIFhtbENsYXNzUmVmZXJlbmNlIGdldFhtbEN1c3RvbWl6ZXJDbGFzc1JlZigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sQ3VzdG9taXplckhvbGRlcigpLmdldEN1c3RvbWl6ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCB0aGUgWE1MIGNsYXNzIHJlZiBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2xhc3NSZWZlcmVuY2UgZ2V0WG1sQ3VzdG9taXplckNsYXNzUmVmRm9yVXBkYXRlKCkgewotCQlYbWxDbGFzc1JlZmVyZW5jZSB4bWxDbGFzc1JlZiA9IHRoaXMuZ2V0WG1sQ3VzdG9taXplckNsYXNzUmVmKCk7Ci0JCXJldHVybiAoeG1sQ2xhc3NSZWYgIT0gbnVsbCkgPyB4bWxDbGFzc1JlZiA6IHRoaXMuYnVpbGRYbWxDdXN0b21pemVyQ2xhc3NSZWYoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sQ2xhc3NSZWZlcmVuY2UgYnVpbGRYbWxDdXN0b21pemVyQ2xhc3NSZWYoKSB7Ci0JCVhtbENsYXNzUmVmZXJlbmNlIHJlZiA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENsYXNzUmVmZXJlbmNlKCk7Ci0JCXRoaXMuZ2V0WG1sQ3VzdG9taXplckhvbGRlcigpLnNldEN1c3RvbWl6ZXIocmVmKTsKLQkJcmV0dXJuIHJlZjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxDdXN0b21pemVyQ2xhc3NSZWZJZlVuc2V0KCkgewotCQlpZiAodGhpcy5nZXRYbWxDdXN0b21pemVyQ2xhc3NSZWYoKS5pc1Vuc2V0KCkpIHsKLQkJCXRoaXMucmVtb3ZlWG1sQ3VzdG9taXplckNsYXNzUmVmKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxDdXN0b21pemVyQ2xhc3NSZWYoKSB7Ci0JCXRoaXMuZ2V0WG1sQ3VzdG9taXplckhvbGRlcigpLnNldEN1c3RvbWl6ZXIobnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBnZXRSZXNvdXJjZUN1c3RvbWl6ZXJUeXBlKCkgewotCQlpZiAodGhpcy5mdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZSh0aGlzLmZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1UeXBlTWFwcGluZyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtPcm1UeXBlTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rT3JtVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBYbWxUeXBlTWFwcGluZyBnZXRYbWxUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCX0KLQotCXByb3RlY3RlZCBYbWxDdXN0b21pemVySG9sZGVyIGdldFhtbEN1c3RvbWl6ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiAoWG1sQ3VzdG9taXplckhvbGRlcikgdGhpcy5nZXRYbWxUeXBlTWFwcGluZygpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0phdmFUeXBlTWFwcGluZyBnZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyIGdldEphdmFDdXN0b21pemVyRm9yRGVmYXVsdHMoKSB7Ci0JCUVjbGlwc2VMaW5rSmF2YVR5cGVNYXBwaW5nIGphdmFUeXBlTWFwcGluZyA9IHRoaXMuZ2V0SmF2YVR5cGVNYXBwaW5nRm9yRGVmYXVsdHMoKTsKLQkJcmV0dXJuIChqYXZhVHlwZU1hcHBpbmcgPT0gbnVsbCkgPyBudWxsIDogKEphdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIpIGphdmFUeXBlTWFwcGluZy5nZXRDdXN0b21pemVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVudGl0eU1hcHBpbmdzIGdldEVudGl0eU1hcHBpbmdzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nRmlsZVJvb3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZvcihTdHJpbmcgdHlwZU5hbWUpIHsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWl6ZXJUeXBlID0gdGhpcy5nZXRSZXNvdXJjZUN1c3RvbWl6ZXJUeXBlKCk7Ci0JCXJldHVybiAoY3VzdG9taXplclR5cGUgIT0gbnVsbCkgJiYgY3VzdG9taXplclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyh0eXBlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbihJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCkgewotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3VzdG9taXplclR5cGUgPSB0aGlzLmdldFJlc291cmNlQ3VzdG9taXplclR5cGUoKTsKLQkJcmV0dXJuIChjdXN0b21pemVyVHlwZSAhPSBudWxsKSAmJiBjdXN0b21pemVyVHlwZS5pc0luKHBhY2thZ2VGcmFnbWVudCk7Ci0JfQotCi0JcHVibGljIGNoYXIgZ2V0Q3VzdG9taXplckNsYXNzRW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJcmV0dXJuICckJzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRYbWxDdXN0b21pemVyQ2xhc3NSZWYoKSAhPSBudWxsICYmIHRoaXMuaXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVUeXBlRWRpdChvcmlnaW5hbFR5cGUsIG5ld05hbWUpKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lVHlwZUVkaXQoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRYbWxDdXN0b21pemVyQ2xhc3NSZWYoKS5jcmVhdGVSZW5hbWVFZGl0KG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbEN1c3RvbWl6ZXJDbGFzc1JlZigpICE9IG51bGwgJiYgdGhpcy5pc0ZvcihvcmlnaW5hbFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KG5ld1BhY2thZ2UuZ2V0RWxlbWVudE5hbWUoKSkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRYbWxDdXN0b21pemVyQ2xhc3NSZWYoKSAhPSBudWxsICYmIHRoaXMuaXNJbihvcmlnaW5hbFBhY2thZ2UpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KG5ld05hbWUpKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQoU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sQ3VzdG9taXplckNsYXNzUmVmKCkuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQobmV3TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnZhbGlkYXRlQ3VzdG9taXplckNsYXNzKG1lc3NhZ2VzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUN1c3RvbWl6ZXJDbGFzcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAodGhpcy5nZXRDdXN0b21pemVyQ2xhc3MoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5nZXRDdXN0b21pemVyQ2xhc3MoKSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkRFU0NSSVBUT1JfQ1VTVE9NSVpFUl9DTEFTU19OT1RfU1BFQ0lGSUVELAotCQkJCQkJCUVNUFRZX1NUUklOR19BUlJBWSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJCSkKLQkJCSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJVHlwZSBjdXN0b21pemVySmR0VHlwZSA9IEpEVFRvb2xzLmZpbmRUeXBlKHRoaXMuZ2V0SmF2YVByb2plY3QoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJaWYgKGN1c3RvbWl6ZXJKZHRUeXBlID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkRFU0NSSVBUT1JfQ1VTVE9NSVpFUl9DTEFTU19OT1RfRVhJU1QsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzKCl9LAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKLQkJCQkJKQotCQkJKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIUpEVFRvb2xzLnR5cGVIYXNQdWJsaWNaZXJvQXJnQ29uc3RydWN0b3IoY3VzdG9taXplckpkdFR5cGUpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5ERVNDUklQVE9SX0NVU1RPTUlaRVJfQ0xBU1NfTk9UX1ZBTElELAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXRGdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzcygpfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJCSkKLQkJCSk7Ci0JCX0KLQkJaWYgKCFKRFRUb29scy50eXBlSXNTdWJUeXBlKHRoaXMuZ2V0SmF2YVByb2plY3QoKSwgY3VzdG9taXplckpkdFR5cGUsIEVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUl9DTEFTU19OQU1FKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuREVTQ1JJUFRPUl9DVVNUT01JWkVSX0NMQVNTX0lNUExFTUVOVFNfREVTQ1JJUFRPUl9DVVNUT01JWkVSLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXRGdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzcygpfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJCSkKLQkJCSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldFhtbFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0WG1sVmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJWG1sQ2xhc3NSZWZlcmVuY2UgeG1sQ2xhc3NSZWYgPSB0aGlzLmdldFhtbEN1c3RvbWl6ZXJDbGFzc1JlZigpOwotCQlyZXR1cm4gKHhtbENsYXNzUmVmID09IG51bGwpID8gbnVsbCA6IHhtbENsYXNzUmVmLmdldENsYXNzTmFtZVRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU3NTBjOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGFibGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ob3ROdWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rRHluYW1pY1R5cGVNYXBwaW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZU1hcHBpbmdWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBFY2xpcHNlTGluawotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gZW1iZWRkYWJsZSB0eXBlIG1hcHBpbmcKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwKLQlleHRlbmRzIEFic3RyYWN0T3JtRW1iZWRkYWJsZTxYbWxFbWJlZGRhYmxlPgotCWltcGxlbWVudHMgCi0JCU9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSwKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIuT3duZXIKLXsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgY29udmVydGVyQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY2hhbmdlVHJhY2tpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXI7Ci0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0VtYmVkZGFibGVJbXBsKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgWG1sRW1iZWRkYWJsZSB4bWxFbWJlZGRhYmxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sRW1iZWRkYWJsZSk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyID0gdGhpcy5idWlsZENvbnZlcnRlckNvbnRhaW5lcigpOwotCQl0aGlzLmNoYW5nZVRyYWNraW5nID0gdGhpcy5idWlsZENoYW5nZVRyYWNraW5nKCk7Ci0JCXRoaXMuY3VzdG9taXplciA9IHRoaXMuYnVpbGRDdXN0b21pemVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZy5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY3VzdG9taXplci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIudXBkYXRlKCk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcudXBkYXRlKCk7Ci0JCXRoaXMuY3VzdG9taXplci51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyIGNvbnRhaW5lciAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgZ2V0Q29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbCh0aGlzLCB0aGlzLCB0aGlzLmdldFhtbFR5cGVNYXBwaW5nKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyU3VwcG9ydGVkQ29udmVydGVycygpIHsKLQkJcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4gZ2V0Q29udmVydGVycygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4oCi0JCQkJCXRoaXMuY29udmVydGVyQ29udGFpbmVyLmdldENvbnZlcnRlcnMoKSwKLQkJCQkJdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nQ29udmVydGVycygpCi0JCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGdldEF0dHJpYnV0ZU1hcHBpbmdDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPih0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmdDb252ZXJ0ZXJzXygpLCBOb3ROdWxsRmlsdGVyLjxFY2xpcHNlTGlua0NvbnZlcnRlcj5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGdldEF0dHJpYnV0ZU1hcHBpbmdDb252ZXJ0ZXJzXygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4odGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nQ29udmVydGVyTGlzdHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPj4gZ2V0QXR0cmlidXRlTWFwcGluZ0NvbnZlcnRlckxpc3RzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZywgSXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+PigKLQkJCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmdzKCksCi0JCQkJQVRUUklCVVRFX01BUFBJTkdfQ09OVkVSVEVSX1RSQU5TRk9STUVSCi0JCQkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjaGFuZ2UgdHJhY2tpbmcgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgZ2V0Q2hhbmdlVHJhY2tpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmNoYW5nZVRyYWNraW5nOwotCX0KLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGJ1aWxkQ2hhbmdlVHJhY2tpbmcoKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY3VzdG9taXplciAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDdXN0b21pemVyIGdldEN1c3RvbWl6ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ3VzdG9taXplciBidWlsZEN1c3RvbWl6ZXIoKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtDdXN0b21pemVyKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwYXJlbnQgY2xhc3MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZFBhcmVudENsYXNzKCkgewotCQlyZXR1cm4gdGhpcy54bWxUeXBlTWFwcGluZy5nZXRQYXJlbnRDbGFzcygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFBhcmVudENsYXNzSW5YbWwoU3RyaW5nIHBhcmVudENsYXNzKSB7Ci0JCXRoaXMueG1sVHlwZU1hcHBpbmcuc2V0UGFyZW50Q2xhc3MocGFyZW50Q2xhc3MpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlIGdldEphdmFUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIChKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBzdXBlci5nZXRKYXZhVHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBnZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpIHsKLQkJcmV0dXJuIChKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBzdXBlci5nZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUpIHN1cGVyLmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdXNlc1ByaW1hcnlLZXlDb2x1bW5zKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdXNlc1ByaW1hcnlLZXlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCXN1cGVyLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpLAotCQkJCXRoaXMuY3JlYXRlQ3VzdG9taXplclJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpLAotCQkJCXRoaXMuY3JlYXRlQ29udmVydGVySG9sZGVyUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDdXN0b21pemVyUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplci5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUNvbnZlcnRlckhvbGRlclJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQkJc3VwZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpLAotCQkJCXRoaXMuY3JlYXRlQ3VzdG9taXplck1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSwKLQkJCQl0aGlzLmNyZWF0ZUNvbnZlcnRlckhvbGRlck1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKQotCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUN1c3RvbWl6ZXJNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6ZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ29udmVydGVySG9sZGVyTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQlzdXBlci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCQl0aGlzLmNyZWF0ZUN1c3RvbWl6ZXJSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCQl0aGlzLmNyZWF0ZUNvbnZlcnRlckhvbGRlclJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ3VzdG9taXplclJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUNvbnZlcnRlckhvbGRlclJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ29udGFpbmVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy52YWxpZGF0ZVBhcmVudENsYXNzKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuY3VzdG9taXplci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLmNoYW5nZVRyYWNraW5nLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwdFZhbGlkYXRvciBidWlsZFR5cGVNYXBwaW5nVmFsaWRhdG9yKCkgewotCQlpZiAodGhpcy5pc0R5bmFtaWNUeXBlKCkpIHsKLQkJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtEeW5hbWljVHlwZU1hcHBpbmdWYWxpZGF0b3IodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yKHRoaXMsIGdldEphdmFSZXNvdXJjZVR5cGUoKSwgYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0R5bmFtaWNUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmlzRHluYW1pYygpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQYXJlbnRDbGFzcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWlmICh0aGlzLnNwZWNpZmllZFBhcmVudENsYXNzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodGhpcy5nZXRSZXNvbHZlZFBhcmVudENsYXNzKCkgPT0gbnVsbCkgewotCQkJSVR5cGUgamR0VHlwZSA9IEpEVFRvb2xzLmZpbmRUeXBlKHRoaXMuZ2V0SmF2YVByb2plY3QoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZFBhcmVudENsYXNzKCkpOwotCQkJaWYgKGpkdFR5cGUgPT0gbnVsbCkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX1RZUEVfUEFSRU5UX0NMQVNTX0RPRVNfTk9UX0VYSVNULAotCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldEZ1bGx5UXVhbGlmaWVkUGFyZW50Q2xhc3MoKX0sCi0JCQkJCQl0aGlzLAotCQkJCQkJdGhpcy5nZXRQYXJlbnRDbGFzc1RleHRSYW5nZSgpCi0JCQkJCSkKLQkJCQkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRQYXJlbnRDbGFzc1RleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLnhtbFR5cGVNYXBwaW5nLmdldFBhcmVudENsYXNzVGV4dFJhbmdlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q5NjQzYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGVkSWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBlbWJlZGRlZCBtYXBwaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0VtYmVkZGVkSWRNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybUVtYmVkZGVkSWRNYXBwaW5nPFhtbEVtYmVkZGVkSWQ+Ci17Ci0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtFbWJlZGRlZElkTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sRW1iZWRkZWRJZCB4bWxNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sTWFwcGluZyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGF0dHJpYnV0ZSB0eXBlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRBdHRyaWJ1dGVUeXBlKCkgewotCQlyZXR1cm4gdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmdldEF0dHJpYnV0ZVR5cGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRBdHRyaWJ1dGVUeXBlSW5YbWwoU3RyaW5nIGF0dHJpYnV0ZVR5cGUpIHsKLQkJdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLnNldEF0dHJpYnV0ZVR5cGUoYXR0cmlidXRlVHlwZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlVGFyZ2V0RW1iZWRkYWJsZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAodGhpcy5pc1ZpcnR1YWxBY2Nlc3MoKSkgewotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5nZXRBdHRyaWJ1dGVUeXBlKCkpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX05PX0FUVFJJQlVURV9UWVBFX1NQRUNJRklFRCwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAotCQkJCQkJdGhpcywKLQkJCQkJCXRoaXMuZ2V0QXR0cmlidXRlVHlwZVRleHRSYW5nZSgpCi0JCQkJCSkKLQkJCQkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmICh0aGlzLmdldFJlc29sdmVkQXR0cmlidXRlVHlwZSgpID09IG51bGwpIHsKLQkJCQlJVHlwZSBqZHRUeXBlID0gSkRUVG9vbHMuZmluZFR5cGUodGhpcy5nZXRKYXZhUHJvamVjdCgpLCB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQXR0cmlidXRlVHlwZSgpKTsKLQkJCQlpZiAoamR0VHlwZSA9PSBudWxsKSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BVFRSSUJVVEVfVFlQRV9ET0VTX05PVF9FWElTVCwKLQkJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0RnVsbHlRdWFsaWZpZWRBdHRyaWJ1dGVUeXBlKCl9LAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJdGhpcy5nZXRBdHRyaWJ1dGVUeXBlVGV4dFJhbmdlKCkKLQkJCQkJCSkKLQkJCQkJKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIudmFsaWRhdGVUYXJnZXRFbWJlZGRhYmxlKG1lc3NhZ2VzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZpcnR1YWxBY2Nlc3MoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSA9PSBFY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEF0dHJpYnV0ZVR5cGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmdldEF0dHJpYnV0ZVR5cGVUZXh0UmFuZ2UoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkZWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGVkTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmZiNGI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkZWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0FjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkRlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGVtYmVkZGVkIG1hcHBpbmcKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rRW1iZWRkZWRNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybUVtYmVkZGVkTWFwcGluZzxYbWxFbWJlZGRlZD4KLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtFbWJlZGRlZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEVtYmVkZGVkIHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYXR0cmlidXRlIHR5cGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZEF0dHJpYnV0ZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0QXR0cmlidXRlVHlwZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEF0dHJpYnV0ZVR5cGVJblhtbChTdHJpbmcgYXR0cmlidXRlVHlwZSkgewotCQl0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuc2V0QXR0cmlidXRlVHlwZShhdHRyaWJ1dGVUeXBlKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVUYXJnZXRFbWJlZGRhYmxlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmICh0aGlzLmlzVmlydHVhbEFjY2VzcygpKSB7Ci0JCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmdldEF0dHJpYnV0ZVR5cGUoKSkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfTk9fQVRUUklCVVRFX1RZUEVfU1BFQ0lGSUVELAotCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCi0JCQkJCQl0aGlzLAotCQkJCQkJdGhpcy5nZXRBdHRyaWJ1dGVUeXBlVGV4dFJhbmdlKCkKLQkJCQkJKQotCQkJCSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKHRoaXMuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVUeXBlKCkgPT0gbnVsbCkgewotCQkJCUlUeXBlIGpkdFR5cGUgPSBKRFRUb29scy5maW5kVHlwZSh0aGlzLmdldEphdmFQcm9qZWN0KCksIHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRBdHRyaWJ1dGVUeXBlKCkpOwotCQkJCWlmIChqZHRUeXBlID09IG51bGwpIHsKLQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0FUVFJJQlVURV9UWVBFX0RPRVNfTk9UX0VYSVNULAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXRGdWxseVF1YWxpZmllZEF0dHJpYnV0ZVR5cGUoKX0sCi0JCQkJCQkJdGhpcywKLQkJCQkJCQl0aGlzLmdldEF0dHJpYnV0ZVR5cGVUZXh0UmFuZ2UoKQotCQkJCQkJKQotCQkJCQkpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci52YWxpZGF0ZVRhcmdldEVtYmVkZGFibGUobWVzc2FnZXMpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzVmlydHVhbEFjY2VzcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpID09IEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0QXR0cmlidXRlVHlwZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0QXR0cmlidXRlVHlwZVRleHRSYW5nZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtFbnRpdHlJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0VudGl0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRiNzg3Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0VudGl0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLk5vdE51bGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUNhY2hlYWJsZUhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDYWNoZWFibGVfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0R5bmFtaWNUeXBlTWFwcGluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0VudGl0eVByaW1hcnlLZXlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGVudGl0eSB0eXBlIG1hcHBpbmcKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rRW50aXR5SW1wbAotCWV4dGVuZHMgQWJzdHJhY3RPcm1FbnRpdHk8WG1sRW50aXR5PgotCWltcGxlbWVudHMKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHksCi0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyLk93bmVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHk7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBjaGFuZ2VUcmFja2luZzsKLQotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZzsKLQotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBjb252ZXJ0ZXJDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgbXVsdGl0ZW5hbmN5OwotCi0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtFbnRpdHlJbXBsKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgWG1sRW50aXR5IHhtbEVudGl0eSkgewotCQlzdXBlcihwYXJlbnQsIHhtbEVudGl0eSk7Ci0JCXRoaXMuY2FjaGluZyA9IHRoaXMuYnVpbGRDYWNoaW5nKCk7Ci0JCXRoaXMucmVhZE9ubHkgPSB0aGlzLmJ1aWxkUmVhZE9ubHkoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcgPSB0aGlzLmJ1aWxkQ2hhbmdlVHJhY2tpbmcoKTsKLQkJdGhpcy5jdXN0b21pemVyID0gdGhpcy5idWlsZEN1c3RvbWl6ZXIoKTsKLQkJdGhpcy5tdWx0aXRlbmFuY3kgPSB0aGlzLmJ1aWxkTXVsdGl0ZW5hbmN5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY2FjaGluZy5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMucmVhZE9ubHkuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmN1c3RvbWl6ZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLm11bHRpdGVuYW5jeS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5jYWNoaW5nLnVwZGF0ZSgpOwotCQl0aGlzLnJlYWRPbmx5LnVwZGF0ZSgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci51cGRhdGUoKTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZy51cGRhdGUoKTsKLQkJdGhpcy5jdXN0b21pemVyLnVwZGF0ZSgpOwotCQl0aGlzLm11bHRpdGVuYW5jeS51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2FjaGluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGdldENhY2hpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hpbmc7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ2FjaGluZyBidWlsZENhY2hpbmcoKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtDYWNoaW5nSW1wbCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVhZCBvbmx5ICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua1JlYWRPbmx5IGdldFJlYWRPbmx5KCkgewotCQlyZXR1cm4gdGhpcy5yZWFkT25seTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtSZWFkT25seSBidWlsZFJlYWRPbmx5KCkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rUmVhZE9ubHkodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBjb250YWluZXIgKioqKioqKioqKgotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGdldENvbnZlcnRlckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBidWlsZENvbnZlcnRlckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwodGhpcywgdGhpcywgdGhpcy54bWxUeXBlTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIGludCBnZXROdW1iZXJTdXBwb3J0ZWRDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPigKLQkJCQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuZ2V0Q29udmVydGVycygpLAotCQkJCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmdDb252ZXJ0ZXJzKCkKLQkJCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4gZ2V0QXR0cmlidXRlTWFwcGluZ0NvbnZlcnRlcnMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+KHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZ0NvbnZlcnRlcnNfKCksIE5vdE51bGxGaWx0ZXIuPEVjbGlwc2VMaW5rQ29udmVydGVyPmluc3RhbmNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4gZ2V0QXR0cmlidXRlTWFwcGluZ0NvbnZlcnRlcnNfKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPih0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmdDb252ZXJ0ZXJMaXN0cygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+PiBnZXRBdHRyaWJ1dGVNYXBwaW5nQ29udmVydGVyTGlzdHMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nLCBJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4+KAotCQkJCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZ3MoKSwKLQkJCQlBVFRSSUJVVEVfTUFQUElOR19DT05WRVJURVJfVFJBTlNGT1JNRVIKLQkJCSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNoYW5nZSB0cmFja2luZyAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBnZXRDaGFuZ2VUcmFja2luZygpIHsKLQkJcmV0dXJuIHRoaXMuY2hhbmdlVHJhY2tpbmc7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgYnVpbGRDaGFuZ2VUcmFja2luZygpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjdXN0b21pemVyICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbWl6ZXIgZ2V0Q3VzdG9taXplcigpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDdXN0b21pemVyIGJ1aWxkQ3VzdG9taXplcigpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0N1c3RvbWl6ZXIodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG11bHRpdGVuYW5jeSAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgZ2V0TXVsdGl0ZW5hbmN5KCkgewotCQlyZXR1cm4gdGhpcy5tdWx0aXRlbmFuY3k7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIGJ1aWxkTXVsdGl0ZW5hbmN5KCkgewotCQlyZXR1cm4gdGhpcy5pc0VjbGlwc2VMaW5rMl8zQ29tcGF0aWJsZSgpID8KLQkJCW5ldyBPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeUltcGwyXzModGhpcykgOgotCQkJbmV3IE51bGxPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VjbGlwc2VMaW5rMl8zQ29tcGF0aWJsZSgpIHsKLQkJcmV0dXJuIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ub2RlSXNFY2xpcHNlTGluazJfM0NvbXBhdGlibGUodGhpcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNdWx0aXRlbmFudE1ldGFkYXRhQWxsb3dlZCgpIHsKLQkJcmV0dXJuIHRoaXMuaXNSb290RW50aXR5KCkgfHwgdGhpcy5pc0luaGVyaXRhbmNlU3RyYXRlZ3lUYWJsZVBlckNsYXNzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmhlcml0YW5jZVN0cmF0ZWd5VGFibGVQZXJDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpID09IEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1M7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHBhcmVudCBjbGFzcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkUGFyZW50Q2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFR5cGVNYXBwaW5nLmdldFBhcmVudENsYXNzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUGFyZW50Q2xhc3NJblhtbChTdHJpbmcgcGFyZW50Q2xhc3MpIHsKLQkJdGhpcy54bWxUeXBlTWFwcGluZy5zZXRQYXJlbnRDbGFzcyhwYXJlbnRDbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0VudGl0eSBnZXRKYXZhVHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBzdXBlci5nZXRKYXZhVHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rRW50aXR5IGdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCkgewotCQlyZXR1cm4gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgc3VwZXIuZ2V0SmF2YVR5cGVNYXBwaW5nRm9yRGVmYXVsdHMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlKSBzdXBlci5nZXRQZXJzaXN0ZW50VHlwZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZXNQcmltYXJ5S2V5Q29sdW1ucygpIHsKLQkJcmV0dXJuICh0aGlzLmdldFhtbFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeUtleSgpICE9IG51bGwpCi0JCQkJfHwgdGhpcy51c2VzSmF2YVByaW1hcnlLZXlDb2x1bW5zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlc0phdmFQcmltYXJ5S2V5Q29sdW1ucygpIHsKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGphdmFFbnRpdHkgPSB0aGlzLmdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci0JCXJldHVybiAoamF2YUVudGl0eSAhPSBudWxsKSAmJiBqYXZhRW50aXR5LnVzZXNQcmltYXJ5S2V5Q29sdW1ucygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZXNQcmltYXJ5S2V5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXJldHVybiBnZXRNdWx0aXRlbmFuY3koKS51c2VzUHJpbWFyeUtleVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRTcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkKCkgewotCQlyZXR1cm4gc3VwZXIuYnVpbGRTcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkKCkgJiYgISB0aGlzLmNsYXNzRXh0cmFjdG9ySXNVc2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2xhc3NFeHRyYWN0b3JJc1VzZWQoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRYbWxDbGFzc0V4dHJhY3RvcigpICE9IG51bGwpIHx8ICh0aGlzLmdldENsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbigpICE9IG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBYbWxDbGFzc1JlZmVyZW5jZSBnZXRYbWxDbGFzc0V4dHJhY3RvcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sVHlwZU1hcHBpbmcoKS5nZXRDbGFzc0V4dHJhY3RvcigpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMSBnZXRDbGFzc0V4dHJhY3RvckFubm90YXRpb24oKSB7Ci0JCWlmICh0aGlzLmdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCkgIT0gbnVsbCkgewotCQkJSmF2YVJlc291cmNlVHlwZSBqcnB0ID0gdGhpcy5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQlyZXR1cm4gKEVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xKSBqcnB0LmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEuQU5OT1RBVElPTl9OQU1FKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT3JtQ2FjaGVhYmxlMl8wIGdldENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2FjaGVhYmxlSG9sZGVyKCkuZ2V0Q2FjaGVhYmxlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2FjaGVhYmxlSG9sZGVyKCkuY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1DYWNoZWFibGVIb2xkZXIyXzAgZ2V0Q2FjaGVhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gKE9ybUNhY2hlYWJsZUhvbGRlcjJfMCkgdGhpcy5jYWNoaW5nOwotCX0KLQotCXB1YmxpYyBYbWxDYWNoZWFibGVfMl8wIGdldFhtbENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGdldFJlc291cmNlQ2xhc3NFeHRyYWN0b3JUeXBlKCkgewotCQlYbWxDbGFzc1JlZmVyZW5jZSBjbGFzc0V4dHJhY3RvckNsYXNzUmVmID0gdGhpcy5nZXRYbWxDbGFzc0V4dHJhY3RvcigpOwotCQlpZiAoY2xhc3NFeHRyYWN0b3JDbGFzc1JlZiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyBjbGFzc05hbWUgPSBjbGFzc0V4dHJhY3RvckNsYXNzUmVmLmdldENsYXNzTmFtZSgpOwotCQlpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZ0ZpbGVSb290KCkucmVzb2x2ZUphdmFSZXNvdXJjZVR5cGUoY2xhc3NOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbGFzc0V4dHJhY3RvcklzRm9yKFN0cmluZyB0eXBlTmFtZSkgewotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY2xhc3NFeHRyYWN0b3JUeXBlID0gdGhpcy5nZXRSZXNvdXJjZUNsYXNzRXh0cmFjdG9yVHlwZSgpOwotCQlyZXR1cm4gKGNsYXNzRXh0cmFjdG9yVHlwZSAhPSBudWxsKSAmJiBjbGFzc0V4dHJhY3RvclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyh0eXBlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2xhc3NFeHRyYWN0b3JJc0luKElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50KSB7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBjbGFzc0V4dHJhY3RvclR5cGUgPSB0aGlzLmdldFJlc291cmNlQ2xhc3NFeHRyYWN0b3JUeXBlKCk7Ci0JCXJldHVybiAoY2xhc3NFeHRyYWN0b3JUeXBlICE9IG51bGwpICYmIGNsYXNzRXh0cmFjdG9yVHlwZS5pc0luKHBhY2thZ2VGcmFnbWVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQkJc3VwZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5jcmVhdGVDdXN0b21pemVyUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5jcmVhdGVDb252ZXJ0ZXJIb2xkZXJSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSwKLQkJCQl0aGlzLmNyZWF0ZUNsYXNzRXh0cmFjdG9yUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDdXN0b21pemVyUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplci5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUNvbnZlcnRlckhvbGRlclJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUNsYXNzRXh0cmFjdG9yUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY2xhc3NFeHRyYWN0b3JJc0ZvcihvcmlnaW5hbFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmdldFhtbENsYXNzRXh0cmFjdG9yKCkuY3JlYXRlUmVuYW1lRWRpdChvcmlnaW5hbFR5cGUsIG5ld05hbWUpKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQkJc3VwZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpLAotCQkJCXRoaXMuY3JlYXRlQ3VzdG9taXplck1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSwKLQkJCQl0aGlzLmNyZWF0ZUNvbnZlcnRlckhvbGRlck1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSwKLQkJCQl0aGlzLmNyZWF0ZUNsYXNzRXh0cmFjdG9yTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ3VzdG9taXplck1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDb252ZXJ0ZXJIb2xkZXJNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDbGFzc0V4dHJhY3Rvck1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xhc3NFeHRyYWN0b3JJc0ZvcihvcmlnaW5hbFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmdldFhtbENsYXNzRXh0cmFjdG9yKCkuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQobmV3UGFja2FnZS5nZXRFbGVtZW50TmFtZSgpKSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCXN1cGVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpLAotCQkJCXRoaXMuY3JlYXRlQ3VzdG9taXplclJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpLAotCQkJCXRoaXMuY3JlYXRlQ29udmVydGVySG9sZGVyUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5jcmVhdGVDbGFzc0V4dHJhY3RvclJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ3VzdG9taXplclJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUNvbnZlcnRlckhvbGRlclJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ29udGFpbmVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ2xhc3NFeHRyYWN0b3JSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNsYXNzRXh0cmFjdG9ySXNJbihvcmlnaW5hbFBhY2thZ2UpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmdldFhtbENsYXNzRXh0cmFjdG9yKCkuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQobmV3TmFtZSkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy52YWxpZGF0ZVBhcmVudENsYXNzKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuY2FjaGluZy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnJlYWRPbmx5LnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5jdXN0b21pemVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMubXVsdGl0ZW5hbmN5LnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwdFZhbGlkYXRvciBidWlsZFByaW1hcnlLZXlWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtFbnRpdHlQcmltYXJ5S2V5VmFsaWRhdG9yKHRoaXMsIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwdFZhbGlkYXRvciBidWlsZFR5cGVNYXBwaW5nVmFsaWRhdG9yKCkgewotCQlpZiAodGhpcy5pc0R5bmFtaWNUeXBlKCkpIHsKLQkJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtEeW5hbWljVHlwZU1hcHBpbmdWYWxpZGF0b3IodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yKHRoaXMsIGdldEphdmFSZXNvdXJjZVR5cGUoKSwgYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0R5bmFtaWNUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmlzRHluYW1pYygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGFyZW50Q2xhc3MoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAodGhpcy5zcGVjaWZpZWRQYXJlbnRDbGFzcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0UmVzb2x2ZWRQYXJlbnRDbGFzcygpID09IG51bGwpIHsKLQkJCUlUeXBlIGpkdFR5cGUgPSBKRFRUb29scy5maW5kVHlwZSh0aGlzLmdldEphdmFQcm9qZWN0KCksIHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRQYXJlbnRDbGFzcygpKTsKLQkJCWlmIChqZHRUeXBlID09IG51bGwpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9UWVBFX1BBUkVOVF9DTEFTU19ET0VTX05PVF9FWElTVCwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXRGdWxseVF1YWxpZmllZFBhcmVudENsYXNzKCl9LAotCQkJCQkJdGhpcywKLQkJCQkJCXRoaXMuZ2V0UGFyZW50Q2xhc3NUZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkJKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0UGFyZW50Q2xhc3NUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy54bWxUeXBlTWFwcGluZy5nZXRQYXJlbnRDbGFzc1RleHRSYW5nZSgpKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFhtbENvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcykgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldFhtbENvbXBsZXRpb25Qcm9wb3NhbHMocG9zKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJlc3VsdCA9IHRoaXMubXVsdGl0ZW5hbmN5LmdldFhtbENvbXBsZXRpb25Qcm9wb3NhbHMocG9zKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rSWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MzczZDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0lkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011dGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtQ29udmVydGlibGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybUlkTWFwcGluZzxYbWxJZD4KLQlpbXBsZW1lbnRzCi0JCUVjbGlwc2VMaW5rSWRNYXBwaW5nLAotCQlFY2xpcHNlTGlua09ybUNvbnZlcnRpYmxlTWFwcGluZywKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIuT3duZXIKLXsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGU7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGNvbnZlcnRlckNvbnRhaW5lcjsKLQkKLQkKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbElkIHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQkJdGhpcy5tdXRhYmxlID0gbmV3IE9ybUVjbGlwc2VMaW5rTXV0YWJsZSh0aGlzKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLm11dGFibGUuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5tdXRhYmxlLnVwZGF0ZSgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYXR0cmlidXRlIHR5cGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZEF0dHJpYnV0ZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0QXR0cmlidXRlVHlwZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEF0dHJpYnV0ZVR5cGVJblhtbChTdHJpbmcgYXR0cmlidXRlVHlwZSkgewotCQl0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuc2V0QXR0cmlidXRlVHlwZShhdHRyaWJ1dGVUeXBlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbXV0YWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtNdXRhYmxlIGdldE11dGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm11dGFibGU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXJzICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBnZXRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsKHRoaXMsIHRoaXMsIHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIGludCBnZXROdW1iZXJTdXBwb3J0ZWRDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gMTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyIGFkYXB0ZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIHB1dCB0aGUgRWNsaXBzZUxpbmsgY29udmVydCBhZGFwdGVyIGZpcnN0IC0gdGhpcyBpcyB0aGUgb3JkZXIgRWNsaXBzZUxpbmsgc2VhcmNoZXMKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8T3JtQ29udmVydGVyLkFkYXB0ZXI+IGdldENvbnZlcnRlckFkYXB0ZXJzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPE9ybUNvbnZlcnRlci5BZGFwdGVyPihPcm1FY2xpcHNlTGlua0NvbnZlcnQuQWRhcHRlci5pbnN0YW5jZSgpLCBzdXBlci5nZXRDb252ZXJ0ZXJBZGFwdGVycygpKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJc3VwZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpLAotCQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpCi0JCSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJc3VwZXIuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKQotCQkpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQlzdXBlci5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSwKLQkJCXRoaXMuY29udmVydGVyQ29udGFpbmVyLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpCi0JCSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy52YWxpZGF0ZUF0dHJpYnV0ZVR5cGUobWVzc2FnZXMpOwotCQkvLyBUT0RPIG11dGFibGUgdmFsaWRhdGlvbgotCX0KLQotCS8vVE9ETyBjb3BpZWQgZnJvbSBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXR0cmlidXRlVHlwZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAodGhpcy5pc1ZpcnR1YWxBY2Nlc3MoKSkgewotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5nZXRBdHRyaWJ1dGVUeXBlKCkpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX05PX0FUVFJJQlVURV9UWVBFX1NQRUNJRklFRCwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAotCQkJCQkJdGhpcywKLQkJCQkJCXRoaXMuZ2V0QXR0cmlidXRlVHlwZVRleHRSYW5nZSgpCi0JCQkJCSkKLQkJCQkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChNYXBwaW5nVG9vbHMudHlwZUlzQmFzaWModGhpcy5nZXRKYXZhUHJvamVjdCgpLCB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQXR0cmlidXRlVHlwZSgpKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmICh0aGlzLmdldFJlc29sdmVkQXR0cmlidXRlVHlwZSgpID09IG51bGwpIHsKLQkJCQlJVHlwZSBqZHRUeXBlID0gSkRUVG9vbHMuZmluZFR5cGUodGhpcy5nZXRKYXZhUHJvamVjdCgpLCB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQXR0cmlidXRlVHlwZSgpKTsKLQkJCQlpZiAoamR0VHlwZSA9PSBudWxsKSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BVFRSSUJVVEVfVFlQRV9ET0VTX05PVF9FWElTVCwKLQkJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0RnVsbHlRdWFsaWZpZWRBdHRyaWJ1dGVUeXBlKCl9LAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJdGhpcy5nZXRBdHRyaWJ1dGVUeXBlVGV4dFJhbmdlKCkKLQkJCQkJCSkKLQkJCQkJKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWaXJ0dWFsQWNjZXNzKCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpID09IEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMOwotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0QXR0cmlidXRlVHlwZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0QXR0cmlidXRlVHlwZVRleHRSYW5nZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0pvaW5GZXRjaC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI5ZDU1Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0pvaW5GZXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2gKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rSm9pbkZldGNoCi17Ci0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSB2YWx1ZTsKLQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rSm9pbkZldGNoKE9ybUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWx1ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgdmFsdWUpIHsKLQkJdGhpcy5zZXRWYWx1ZV8odmFsdWUpOwotCQl0aGlzLmdldFhtbEpvaW5GZXRjaCgpLnNldEpvaW5GZXRjaChFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHZhbHVlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSB2YWx1ZSkgewotCQlFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmdldFhtbEpvaW5GZXRjaCgpLmdldEpvaW5GZXRjaCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtQXR0cmlidXRlTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUF0dHJpYnV0ZU1hcHBpbmcgZ2V0QXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbEF0dHJpYnV0ZU1hcHBpbmcgZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sSm9pbkZldGNoIGdldFhtbEpvaW5GZXRjaCgpIHsKLQkJcmV0dXJuIChYbWxKb2luRmV0Y2gpIHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2V0WG1sVmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFhtbFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbEpvaW5GZXRjaCgpLmdldEpvaW5GZXRjaFRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkxMGM0ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybUNvbnZlcnRpYmxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkRlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0T3JtTWFueVRvTWFueU1hcHBpbmc8WG1sTWFueVRvTWFueT4KLQlpbXBsZW1lbnRzCi0JCUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcsIAotCQlFY2xpcHNlTGlua09ybUNvbnZlcnRpYmxlTWFwcGluZywKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIuT3duZXIKLXsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2ggam9pbkZldGNoOwotCQotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBjb252ZXJ0ZXJDb250YWluZXI7Ci0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxNYW55VG9NYW55IHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQkJdGhpcy5qb2luRmV0Y2ggPSBuZXcgT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2godGhpcyk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyID0gdGhpcy5idWlsZENvbnZlcnRlckNvbnRhaW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmpvaW5GZXRjaC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmpvaW5GZXRjaC51cGRhdGUoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGF0dHJpYnV0ZSB0eXBlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRBdHRyaWJ1dGVUeXBlKCkgewotCQlyZXR1cm4gdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmdldEF0dHJpYnV0ZVR5cGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRBdHRyaWJ1dGVUeXBlSW5YbWwoU3RyaW5nIGF0dHJpYnV0ZVR5cGUpIHsKLQkJdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLnNldEF0dHJpYnV0ZVR5cGUoYXR0cmlidXRlVHlwZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gZmV0Y2ggKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rSm9pbkZldGNoIGdldEpvaW5GZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkZldGNoOwotCX0KLQotCS8vICoqKioqKioqKiogY29udmVydGVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgZ2V0Q29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbCh0aGlzLCB0aGlzLCB0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyU3VwcG9ydGVkQ29udmVydGVycygpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCXN1cGVyLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSwKLQkJCXRoaXMuY29udmVydGVyQ29udGFpbmVyLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKQotCQkpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCXN1cGVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpLAotCQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSkKLQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJc3VwZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKQotCQkpOwotCX0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCS8vIFRPRE8gam9pbiBmZXRjaCB2YWxpZGF0aW9uCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGVUeXBlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKHRoaXMuaXNWaXJ0dWFsQWNjZXNzKCkpIHsKLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZ2V0QXR0cmlidXRlVHlwZSgpKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9OT19BVFRSSUJVVEVfVFlQRV9TUEVDSUZJRUQsCi0JCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKLQkJCQkJCXRoaXMsCi0JCQkJCQl0aGlzLmdldEF0dHJpYnV0ZVR5cGVUZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkJKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAodGhpcy5nZXRSZXNvbHZlZEF0dHJpYnV0ZVR5cGUoKSA9PSBudWxsKSB7Ci0JCQkJSVR5cGUgamR0VHlwZSA9IEpEVFRvb2xzLmZpbmRUeXBlKHRoaXMuZ2V0SmF2YVByb2plY3QoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZEF0dHJpYnV0ZVR5cGUoKSk7Ci0JCQkJaWYgKGpkdFR5cGUgPT0gbnVsbCkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX1RZUEVfRE9FU19OT1RfRVhJU1QsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQXR0cmlidXRlVHlwZSgpfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCXRoaXMuZ2V0QXR0cmlidXRlVHlwZVRleHRSYW5nZSgpCi0JCQkJCQkpCi0JCQkJCSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIudmFsaWRhdGVBdHRyaWJ1dGVUeXBlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWaXJ0dWFsQWNjZXNzKCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpID09IEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0QXR0cmlidXRlVHlwZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0QXR0cmlidXRlVHlwZVRleHRSYW5nZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODFjMDhhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0T3JtTWFueVRvT25lTWFwcGluZzxYbWxNYW55VG9PbmU+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcKLXsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2ggam9pbkZldGNoOwotCi0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxNYW55VG9PbmUgeG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCQl0aGlzLmpvaW5GZXRjaCA9IG5ldyBPcm1FY2xpcHNlTGlua0pvaW5GZXRjaCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5qb2luRmV0Y2guc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuam9pbkZldGNoLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIGZldGNoICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0pvaW5GZXRjaCBnZXRKb2luRmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5GZXRjaDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCS8vIFRPRE8gLSBqb2luIGZldGNoIHZhbGlkYXRpb24KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZmU5MzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTm90TnVsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1DYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDYWNoZWFibGVfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rRHluYW1pY1R5cGVNYXBwaW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc1ByaW1hcnlLZXlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IG1hcHBlZCBzdXBlcmNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NJbXBsCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybU1hcHBlZFN1cGVyY2xhc3M8WG1sTWFwcGVkU3VwZXJjbGFzcz4KLQlpbXBsZW1lbnRzCi0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcywKLQkJT3JtQ2FjaGVhYmxlSG9sZGVyMl8wLAotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lci5Pd25lcgotewotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5OwotCi0JcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY2hhbmdlVHJhY2tpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgY29udmVydGVyQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIG11bHRpdGVuYW5jeTsKLQotCXByb3RlY3RlZCBmaW5hbCBPcm1RdWVyeUNvbnRhaW5lciBxdWVyeUNvbnRhaW5lcjsKLQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0ltcGwoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBYbWxNYXBwZWRTdXBlcmNsYXNzIHhtbE1hcHBlZFN1cGVyY2xhc3MpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwZWRTdXBlcmNsYXNzKTsKLQkJdGhpcy5jYWNoaW5nID0gdGhpcy5idWlsZENhY2hpbmcoKTsKLQkJdGhpcy5yZWFkT25seSA9IHRoaXMuYnVpbGRSZWFkT25seSgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZyA9IHRoaXMuYnVpbGRDaGFuZ2VUcmFja2luZygpOwotCQl0aGlzLmN1c3RvbWl6ZXIgPSB0aGlzLmJ1aWxkQ3VzdG9taXplcigpOwotCQl0aGlzLm11bHRpdGVuYW5jeSA9IHRoaXMuYnVpbGRNdWx0aXRlbmFuY3koKTsKLQkJdGhpcy5xdWVyeUNvbnRhaW5lciA9IHRoaXMuYnVpbGRRdWVyeUNvbnRhaW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNhY2hpbmcuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnJlYWRPbmx5LnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNoYW5nZVRyYWNraW5nLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jdXN0b21pemVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5tdWx0aXRlbmFuY3kuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnF1ZXJ5Q29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmNhY2hpbmcudXBkYXRlKCk7Ci0JCXRoaXMucmVhZE9ubHkudXBkYXRlKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnVwZGF0ZSgpOwotCQl0aGlzLmNoYW5nZVRyYWNraW5nLnVwZGF0ZSgpOwotCQl0aGlzLmN1c3RvbWl6ZXIudXBkYXRlKCk7Ci0JCXRoaXMubXVsdGl0ZW5hbmN5LnVwZGF0ZSgpOwotCQl0aGlzLnF1ZXJ5Q29udGFpbmVyLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjYWNoaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NhY2hpbmcgZ2V0Q2FjaGluZygpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGJ1aWxkQ2FjaGluZygpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0NhY2hpbmdJbXBsKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWFkIG9ubHkgKioqKioqKioqKgotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rUmVhZE9ubHkgZ2V0UmVhZE9ubHkoKSB7Ci0JCXJldHVybiB0aGlzLnJlYWRPbmx5OwotCX0KLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua1JlYWRPbmx5IGJ1aWxkUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtSZWFkT25seSh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyIGNvbnRhaW5lciAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgZ2V0Q29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbCh0aGlzLCB0aGlzLCB0aGlzLnhtbFR5cGVNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE51bWJlclN1cHBvcnRlZENvbnZlcnRlcnMoKSB7Ci0JCXJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGdldENvbnZlcnRlcnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+KAotCQkJCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5nZXRDb252ZXJ0ZXJzKCksCi0JCQkJCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZ0NvbnZlcnRlcnMoKQotCQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPiBnZXRBdHRyaWJ1dGVNYXBwaW5nQ29udmVydGVycygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4odGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nQ29udmVydGVyc18oKSwgTm90TnVsbEZpbHRlci48RWNsaXBzZUxpbmtDb252ZXJ0ZXI+aW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPiBnZXRBdHRyaWJ1dGVNYXBwaW5nQ29udmVydGVyc18oKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+KHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZ0NvbnZlcnRlckxpc3RzKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnRlcj4+IGdldEF0dHJpYnV0ZU1hcHBpbmdDb252ZXJ0ZXJMaXN0cygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmcsIEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPj4oCi0JCQkJdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5ncygpLAotCQkJCUFUVFJJQlVURV9NQVBQSU5HX0NPTlZFUlRFUl9UUkFOU0ZPUk1FUgotCQkJKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIHRyYWNraW5nICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGdldENoYW5nZVRyYWNraW5nKCkgewotCQlyZXR1cm4gdGhpcy5jaGFuZ2VUcmFja2luZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBidWlsZENoYW5nZVRyYWNraW5nKCkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGN1c3RvbWl6ZXIgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemVyOwotCX0KLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0N1c3RvbWl6ZXIgYnVpbGRDdXN0b21pemVyKCkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQ3VzdG9taXplcih0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbXVsdGl0ZW5hbmN5ICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBnZXRNdWx0aXRlbmFuY3koKSB7Ci0JCXJldHVybiB0aGlzLm11bHRpdGVuYW5jeTsKLQl9Ci0KLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBidWlsZE11bHRpdGVuYW5jeSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNFY2xpcHNlTGluazJfM0NvbXBhdGlibGUoKSA/Ci0JCQluZXcgT3JtRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3lJbXBsMl8zKHRoaXMpIDoKLQkJCW5ldyBOdWxsT3JtRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzModGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFY2xpcHNlTGluazJfM0NvbXBhdGlibGUoKSB7Ci0JCXJldHVybiBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4ubm9kZUlzRWNsaXBzZUxpbmsyXzNDb21wYXRpYmxlKHRoaXMpOwotCX0KLQotCS8vICoqKioqKioqKiogcXVlcnkgY29udGFpbmVyICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1RdWVyeUNvbnRhaW5lciBnZXRRdWVyeUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnlDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVF1ZXJ5Q29udGFpbmVyIGJ1aWxkUXVlcnlDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtUXVlcnlDb250YWluZXIodGhpcywgdGhpcy54bWxUeXBlTWFwcGluZyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFF1ZXJ5PiBnZXRRdWVyaWVzKCkgewotCQlyZXR1cm4gdGhpcy5xdWVyeUNvbnRhaW5lci5nZXRRdWVyaWVzKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNdWx0aXRlbmFudE1ldGFkYXRhQWxsb3dlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHBhcmVudCBjbGFzcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkUGFyZW50Q2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFR5cGVNYXBwaW5nLmdldFBhcmVudENsYXNzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUGFyZW50Q2xhc3NJblhtbChTdHJpbmcgcGFyZW50Q2xhc3MpIHsKLQkJdGhpcy54bWxUeXBlTWFwcGluZy5zZXRQYXJlbnRDbGFzcyhwYXJlbnRDbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgZ2V0SmF2YVR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIHN1cGVyLmdldEphdmFUeXBlTWFwcGluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIGdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCkgewotCQlyZXR1cm4gKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIHN1cGVyLmdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZSkgc3VwZXIuZ2V0UGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1c2VzUHJpbWFyeUtleUNvbHVtbnMoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRYbWxUeXBlTWFwcGluZygpLmdldFByaW1hcnlLZXkoKSAhPSBudWxsKQotCQkJCXx8IHRoaXMudXNlc0phdmFQcmltYXJ5S2V5Q29sdW1ucygpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHVzZXNKYXZhUHJpbWFyeUtleUNvbHVtbnMoKSB7Ci0JCUphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgamF2YU1hcHBlZFN1cGVyY2xhc3MgPSB0aGlzLmdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci0JCXJldHVybiAoamF2YU1hcHBlZFN1cGVyY2xhc3MgIT0gbnVsbCkgJiYgamF2YU1hcHBlZFN1cGVyY2xhc3MudXNlc1ByaW1hcnlLZXlDb2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdXNlc1ByaW1hcnlLZXlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpIHsKLQkJcmV0dXJuIGdldE11bHRpdGVuYW5jeSgpLnVzZXNQcmltYXJ5S2V5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKTsKLQl9Ci0KLQlwdWJsaWMgT3JtQ2FjaGVhYmxlMl8wIGdldENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2FjaGVhYmxlSG9sZGVyKCkuZ2V0Q2FjaGVhYmxlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2FjaGVhYmxlSG9sZGVyKCkuY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1DYWNoZWFibGVIb2xkZXIyXzAgZ2V0Q2FjaGVhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gKE9ybUNhY2hlYWJsZUhvbGRlcjJfMCkgdGhpcy5jYWNoaW5nOwotCX0KLQotCXB1YmxpYyBYbWxDYWNoZWFibGVfMl8wIGdldFhtbENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQlzdXBlci5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSwKLQkJCQl0aGlzLmNyZWF0ZUN1c3RvbWl6ZXJSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSwKLQkJCQl0aGlzLmNyZWF0ZUNvbnZlcnRlckhvbGRlclJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ3VzdG9taXplclJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6ZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDb252ZXJ0ZXJIb2xkZXJSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQkJc3VwZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpLAotCQkJCXRoaXMuY3JlYXRlQ3VzdG9taXplck1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSwKLQkJCQl0aGlzLmNyZWF0ZUNvbnZlcnRlckhvbGRlck1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKQotCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUN1c3RvbWl6ZXJNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6ZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ29udmVydGVySG9sZGVyTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQlzdXBlci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCQl0aGlzLmNyZWF0ZUN1c3RvbWl6ZXJSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCQl0aGlzLmNyZWF0ZUNvbnZlcnRlckhvbGRlclJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ3VzdG9taXplclJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUNvbnZlcnRlckhvbGRlclJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ29udGFpbmVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy52YWxpZGF0ZVBhcmVudENsYXNzKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuY2FjaGluZy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnJlYWRPbmx5LnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5jdXN0b21pemVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMubXVsdGl0ZW5hbmN5LnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRQcmltYXJ5S2V5VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc1ByaW1hcnlLZXlWYWxpZGF0b3IodGhpcywgdGhpcy5idWlsZFRleHRSYW5nZVJlc29sdmVyKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRUeXBlTWFwcGluZ1ZhbGlkYXRvcigpIHsKLQkJaWYgKHRoaXMuaXNEeW5hbWljVHlwZSgpKSB7Ci0JCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rRHluYW1pY1R5cGVNYXBwaW5nVmFsaWRhdG9yKHRoaXMpOwotCQl9Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzVmFsaWRhdG9yKHRoaXMsIHRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpLCB0aGlzLmJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEeW5hbWljVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5pc0R5bmFtaWMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVBhcmVudENsYXNzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKHRoaXMuc3BlY2lmaWVkUGFyZW50Q2xhc3MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh0aGlzLmdldFJlc29sdmVkUGFyZW50Q2xhc3MoKSA9PSBudWxsKSB7Ci0JCQlJVHlwZSBqZHRUeXBlID0gSkRUVG9vbHMuZmluZFR5cGUodGhpcy5nZXRKYXZhUHJvamVjdCgpLCB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkUGFyZW50Q2xhc3MoKSk7Ci0JCQlpZiAoamR0VHlwZSA9PSBudWxsKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfVFlQRV9QQVJFTlRfQ0xBU1NfRE9FU19OT1RfRVhJU1QsCi0JCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0RnVsbHlRdWFsaWZpZWRQYXJlbnRDbGFzcygpfSwKLQkJCQkJCXRoaXMsCi0JCQkJCQl0aGlzLmdldFBhcmVudENsYXNzVGV4dFJhbmdlKCkKLQkJCQkJKQotCQkJCSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFBhcmVudENsYXNzVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKHRoaXMueG1sVHlwZU1hcHBpbmcuZ2V0UGFyZW50Q2xhc3NUZXh0UmFuZ2UoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb21wbGV0aW9uIHByb3Bvc2FscyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRYbWxDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRYbWxDb21wbGV0aW9uUHJvcG9zYWxzKHBvcyk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXN1bHQgPSB0aGlzLm11bHRpdGVuYW5jeS5nZXRYbWxDb21wbGV0aW9uUHJvcG9zYWxzKHBvcyk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeUltcGwyXzMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5SW1wbDJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTEyZGZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5SW1wbDJfMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5TmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5SZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuVGFyZ2V0RGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkRlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuVGVuYW50RGlzY3JpbWluYXRvckNvbHVtblZhbGlkYXRvcjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11bHRpdGVuYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGl0ZW5hbnRIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sTXVsdGl0ZW5hbnRfMl80OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeUltcGwyXzMKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zCi17Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc3BlY2lmaWVkTXVsdGl0ZW5hbnQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdE11bHRpdGVuYW50OwotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zIHNwZWNpZmllZFR5cGU7Ci0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zIGRlZmF1bHRUeXBlOwotCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhOwotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRJbmNsdWRlQ3JpdGVyaWEgPSBERUZBVUxUX0lOQ0xVREVfQ1JJVEVSSUE7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8T3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMywgWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzM+IHNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXI7Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5Pd25lciB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uT3duZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8T3JtVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMsIFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGRlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNBbGxvd2VkOwotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5SW1wbDJfMyhPcm1FY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQotCQl0aGlzLnNwZWNpZmllZE11bHRpdGVuYW50ID0gaXNNdWx0aXRlbmFudEVsZW1lbnRTcGVjaWZpZWQoKTsKLQkJdGhpcy5zcGVjaWZpZWRUeXBlID0gdGhpcy5idWlsZFNwZWNpZmllZFR5cGUoKTsKLQkJdGhpcy5zcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhKCk7Ci0JCXRoaXMudGVuYW50RGlzY3JpbWluYXRvckNvbHVtbk93bmVyID0gdGhpcy5idWlsZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Pd25lcigpOwotCQl0aGlzLnNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lcigpOwotCQl0aGlzLmRlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uID0gdGhpcy5idWlsZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4obnVsbCk7Ci0JCXRoaXMuZGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIgPSB0aGlzLmJ1aWxkRGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRNdWx0aXRlbmFudF8oaXNNdWx0aXRlbmFudEVsZW1lbnRTcGVjaWZpZWQoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVHlwZV8odGhpcy5idWlsZFNwZWNpZmllZFR5cGUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhXyh0aGlzLmJ1aWxkU3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhKCkpOwotCQl0aGlzLnN5bmNTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlTm9kZXModGhpcy5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpKTsKLQotCQlib29sZWFuIHhtbE11bHRpdGVuYW50Tm90U3BlY2lmaWVkID0gKHRoaXMuZ2V0WG1sTXVsdGl0ZW5hbnQoKSA9PSBudWxsKTsKLQkJSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIGphdmFNdWx0aXRlbmFudFBvbGljeSA9IHRoaXMuZ2V0SmF2YU11bHRpdGVuYW5jeVBvbGljeUZvckRlZmF1bHRzKCk7Ci0JCWJvb2xlYW4gamF2YU11bHRpdGVuYW50UG9saWN5U3BlY2lmaWVkID0gamF2YU11bHRpdGVuYW50UG9saWN5ICE9IG51bGw7Ci0JCWJvb2xlYW4gdXNlSmF2YVZhbHVlID0gKHhtbE11bHRpdGVuYW50Tm90U3BlY2lmaWVkICYmIGphdmFNdWx0aXRlbmFudFBvbGljeVNwZWNpZmllZCk7Ci0KLQkJdGhpcy5zZXREZWZhdWx0TXVsdGl0ZW5hbnQodXNlSmF2YVZhbHVlID8gamF2YU11bHRpdGVuYW50UG9saWN5LmlzTXVsdGl0ZW5hbnQoKSA6IHRoaXMuYnVpbGREZWZhdWx0TXVsdGl0ZW5hbnQoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFR5cGUodXNlSmF2YVZhbHVlID8gamF2YU11bHRpdGVuYW50UG9saWN5LmdldFR5cGUoKSA6IHRoaXMuYnVpbGREZWZhdWx0VHlwZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0SW5jbHVkZUNyaXRlcmlhKHVzZUphdmFWYWx1ZSA/IGphdmFNdWx0aXRlbmFudFBvbGljeS5pc0luY2x1ZGVDcml0ZXJpYSgpIDogdGhpcy5idWlsZERlZmF1bHRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNBbGxvd2VkKHRoaXMuYnVpbGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0FsbG93ZWQoKSk7Ci0JCXRoaXMudXBkYXRlRGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG11bHRpdGVuYW50ICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzTXVsdGl0ZW5hbnQoKSB7Ci0JCXJldHVybiBpc1NwZWNpZmllZE11bHRpdGVuYW50KCkgfHwgaXNEZWZhdWx0TXVsdGl0ZW5hbnQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRNdWx0aXRlbmFudCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE11bHRpdGVuYW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRNdWx0aXRlbmFudChib29sZWFuIGRlZmF1bHRNdWx0aXRlbmFudCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuZGVmYXVsdE11bHRpdGVuYW50OwotCQl0aGlzLmRlZmF1bHRNdWx0aXRlbmFudCA9IGRlZmF1bHRNdWx0aXRlbmFudDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfTVVMVElURU5BTlRfUFJPUEVSVFksIG9sZCwgZGVmYXVsdE11bHRpdGVuYW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERlZmF1bHRNdWx0aXRlbmFudCgpIHsKLQkJcmV0dXJuIHRoaXMuaXNNdWx0aXRlbmFudEluaGVyaXRhbmNlSGllcmFyY2h5KCkgfHwgdGhpcy5pc1N1cGVyTWFwcGVkU3VwZXJjbGFzc011bHRpdGVuYW50KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpZWRNdWx0aXRlbmFudCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTXVsdGl0ZW5hbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTXVsdGl0ZW5hbnQoYm9vbGVhbiBpc011bHRpdGVuYW50KSB7Ci0JCWlmIChpc011bHRpdGVuYW50KSB7Ci0JCQlpZiAoZ2V0WG1sTXVsdGl0ZW5hbnQoKSAhPSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTXVsdGl0ZW5hbnQgZWxlbWVudCBhbHJlYWR5IHNwZWNpZmllZCIpOyAvLyROT04tTkxTLTEkCQkJCQotCQkJfQotCQkJdGhpcy5hZGRYbWxNdWx0aXRlbmFudCgpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGdldFhtbE11bHRpdGVuYW50KCkgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk11bHRpdGVuYW50IGVsZW1lbnQgZG9lcyBub3QgZXhpc3QiKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCX0KLQkJCXRoaXMucmVtb3ZlWG1sTXVsdGl0ZW5hbnQoKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKLQkJCWZvciAoaW50IGkgPSB0aGlzLmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpOyBpLS0gPiAwOyApIHsKLQkJCQl0aGlzLnJlbW92ZVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oaSk7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5zZXRTcGVjaWZpZWRNdWx0aXRlbmFudF8oaXNNdWx0aXRlbmFudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTXVsdGl0ZW5hbnRfKGJvb2xlYW4gaXNNdWx0aXRlbmFudCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkTXVsdGl0ZW5hbnQ7Ci0JCXRoaXMuc3BlY2lmaWVkTXVsdGl0ZW5hbnQgPSBpc011bHRpdGVuYW50OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX01VTFRJVEVOQU5UX1BST1BFUlRZLCBvbGQsIGlzTXVsdGl0ZW5hbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMyBnZXRUeXBlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVHlwZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkVHlwZSA6IHRoaXMuZ2V0RGVmYXVsdFR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMgZ2V0U3BlY2lmaWVkVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zIHR5cGUpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkVHlwZSwgdHlwZSkpIHsKLQkJCVhtbE11bHRpdGVuYW50IHhtbE11bHRpdGVuYW50ID0gdGhpcy5nZXRYbWxNdWx0aXRlbmFudEZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRUeXBlXyh0eXBlKTsKLQkJCXhtbE11bHRpdGVuYW50LnNldFR5cGUoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMudG9Pcm1SZXNvdXJjZU1vZGVsKHR5cGUpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFR5cGVfKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zIHR5cGUpIHsKLQkJRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMgb2xkID0gdGhpcy5zcGVjaWZpZWRUeXBlOwotCQl0aGlzLnNwZWNpZmllZFR5cGUgPSB0eXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1RZUEVfUFJPUEVSVFksIG9sZCwgdHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zIGJ1aWxkU3BlY2lmaWVkVHlwZSgpIHsKLQkJWG1sTXVsdGl0ZW5hbnQgeG1sTXVsdGl0ZW5hbnQgPSB0aGlzLmdldFhtbE11bHRpdGVuYW50KCk7Ci0JCXJldHVybiAoeG1sTXVsdGl0ZW5hbnQgPT0gbnVsbCkgPyBudWxsIDogRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuZnJvbU9ybVJlc291cmNlTW9kZWwoeG1sTXVsdGl0ZW5hbnQuZ2V0VHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMgZ2V0RGVmYXVsdFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRUeXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRUeXBlKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zIHR5cGUpIHsKLQkJRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMgb2xkID0gdGhpcy5kZWZhdWx0VHlwZTsKLQkJdGhpcy5kZWZhdWx0VHlwZSA9IHR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1RZUEVfUFJPUEVSVFksIG9sZCwgdHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zIGJ1aWxkRGVmYXVsdFR5cGUoKSB7Ci0JCWlmICghaXNNdWx0aXRlbmFudCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoaXNTcGVjaWZpZWRNdWx0aXRlbmFudCgpKSB7Ci0JCQlyZXR1cm4gREVGQVVMVF9UWVBFOwotCQl9Ci0JCWlmICh0aGlzLmlzTXVsdGl0ZW5hbnRJbmhlcml0YW5jZUhpZXJhcmNoeSgpKSB7Ci0JCQlyZXR1cm4gZ2V0Um9vdEVudGl0eSgpLmdldE11bHRpdGVuYW5jeSgpLmdldFR5cGUoKTsKLQkJfQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgc3VwZXJNYXBwZWRTdXBlcmNsYXNzID0gZ2V0U3VwZXJNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCXJldHVybiBzdXBlck1hcHBlZFN1cGVyY2xhc3MgIT0gbnVsbCA/IHN1cGVyTWFwcGVkU3VwZXJjbGFzcy5nZXRNdWx0aXRlbmFuY3koKS5nZXRUeXBlKCkgOiBERUZBVUxUX1RZUEU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluY2x1ZGUgY3JpdGVyaWEgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNJbmNsdWRlQ3JpdGVyaWEoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYS5ib29sZWFuVmFsdWUoKSA6IHRoaXMuZGVmYXVsdEluY2x1ZGVDcml0ZXJpYTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoQm9vbGVhbiBpbmNsdWRlQ3JpdGVyaWEpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhLCBpbmNsdWRlQ3JpdGVyaWEpKSB7Ci0JCQlYbWxNdWx0aXRlbmFudCB4bWxNdWx0aXRlbmFudCA9IHRoaXMuZ2V0WG1sTXVsdGl0ZW5hbnRGb3JVcGRhdGUoKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhXyhpbmNsdWRlQ3JpdGVyaWEpOwotCQkJeG1sTXVsdGl0ZW5hbnQuc2V0SW5jbHVkZUNyaXRlcmlhKGluY2x1ZGVDcml0ZXJpYSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWFfKEJvb2xlYW4gaW5jbHVkZUNyaXRlcmlhKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWE7Ci0JCXRoaXMuc3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhID0gaW5jbHVkZUNyaXRlcmlhOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0lOQ0xVREVfQ1JJVEVSSUFfUFJPUEVSVFksIG9sZCwgaW5jbHVkZUNyaXRlcmlhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYSgpIHsKLQkJWG1sTXVsdGl0ZW5hbnQgeG1sTXVsdGl0ZW5hbnQgPSB0aGlzLmdldFhtbE11bHRpdGVuYW50KCk7Ci0JCXJldHVybiAoeG1sTXVsdGl0ZW5hbnQgPT0gbnVsbCkgPyBudWxsIDogeG1sTXVsdGl0ZW5hbnQuZ2V0SW5jbHVkZUNyaXRlcmlhKCk7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRJbmNsdWRlQ3JpdGVyaWEoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRJbmNsdWRlQ3JpdGVyaWE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEluY2x1ZGVDcml0ZXJpYShib29sZWFuIGluY2x1ZGVDcml0ZXJpYSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuZGVmYXVsdEluY2x1ZGVDcml0ZXJpYTsKLQkJdGhpcy5kZWZhdWx0SW5jbHVkZUNyaXRlcmlhID0gaW5jbHVkZUNyaXRlcmlhOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9JTkNMVURFX0NSSVRFUklBX1BST1BFUlRZLCBvbGQsIGluY2x1ZGVDcml0ZXJpYSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGREZWZhdWx0SW5jbHVkZUNyaXRlcmlhKCkgewotCQlpZiAoZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlZQRCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBERUZBVUxUX0lOQ0xVREVfQ1JJVEVSSUE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxPcm1SZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5oYXNTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpID8KLQkJCXRoaXMuZ2V0UmVhZE9ubHlTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpIDogCi0JCQl0aGlzLmdldFJlYWRPbmx5RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmhhc1NwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkgPwotCQkJdGhpcy5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSA6IAotCQkJdGhpcy5nZXREZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8T3JtUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBnZXRSZWFkT25seVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjxPcm1SZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+KHRoaXMuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1NwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSAhPSAwOwotCX0KLQotCXB1YmxpYyBPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4odGhpcy5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIE9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihpbnQgaW5kZXgpIHsKLQkJWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbiB4bWxKb2luQ29sdW1uID0gdGhpcy5idWlsZFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBqb2luQ29sdW1uID0gdGhpcy5zcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyLmFkZENvbnRleHRFbGVtZW50KGluZGV4LCB4bWxKb2luQ29sdW1uKTsKLQkJdGhpcy5nZXRYbWxNdWx0aXRlbmFudEZvclVwZGF0ZSgpLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuYWRkKGluZGV4LCB4bWxKb2luQ29sdW1uKTsKLQkJcmV0dXJuIGpvaW5Db2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4gYnVpbGRYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4pIHsKLQkJdGhpcy5yZW1vdmVTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKHRoaXMuc3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoKE9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMpIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKGludCBpbmRleCkgewotCQl0aGlzLnNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCQl0aGlzLmdldFhtbE11bHRpdGVuYW50KCkuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5yZW1vdmUoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuc3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5nZXRYbWxNdWx0aXRlbmFudCgpLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY1NwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkgewotCQl0aGlzLnNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzM+IGdldFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkgewotCQlpZiAoZ2V0WG1sTXVsdGl0ZW5hbnQoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJfQotCQkvLyBjbG9uZSB0byByZWR1Y2UgY2hhbmNlIG9mIGNvbmN1cnJlbmN5IHByb2JsZW1zCi0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zPih0aGlzLmdldFhtbE11bHRpdGVuYW50KCkuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSk7Ci0JfQotCi0JLyoqCi0JICogIHNwZWNpZmllZCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW4gY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLCBYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMz4KLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBTUEVDSUZJRURfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBidWlsZENvbnRleHRFbGVtZW50KFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIE9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5SW1wbDJfMy50aGlzLmJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihyZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIE9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5SW1wbDJfMy50aGlzLmdldFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMyBnZXRSZXNvdXJjZUVsZW1lbnQoT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldFhtbENvbHVtbigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5Pd25lciBidWlsZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uT3duZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8T3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMywgWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzM+IGJ1aWxkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lcigpIHsKLQkJU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lcigpOwotCQljb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCBPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMyB4bWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zKHRoaXMsIHRoaXMudGVuYW50RGlzY3JpbWluYXRvckNvbHVtbk93bmVyLCB4bWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGdldERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxPcm1SZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGdldFJlYWRPbmx5RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjxPcm1SZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+KHRoaXMuZ2V0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFyRGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkgewotCQl0aGlzLmRlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyLmNsZWFyQ29udGV4dExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGVyZSBhcmUgYW55IHNwZWNpZmllZCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zLCB0aGVuIHRoZXJlIGFyZSBubyBkZWZhdWx0Ci0JICogdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucy4KLQkgKiBJZiB0aGVyZSBhcmUgSmF2YSBzcGVjaWZpZWQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucywgdGhlbiB0aG9zZSBhcmUgdGhlIGRlZmF1bHQKLQkgKiB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zLgotCSAqIEBzZWUgI2dldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zRm9yRGVmYXVsdHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpIHsKLQkJdGhpcy5kZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNGb3JEZWZhdWx0cygpIHsKLQkJaWYgKHRoaXMuZ2V0VHlwZSgpID09IG51bGwgfHwgdGhpcy5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuVEFCTEVfUEVSX1RFTkFOVCkgewotCQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCX0KLQkJSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIGphdmFNdWx0aXRlbmFuY3kgPSB0aGlzLmdldEphdmFNdWx0aXRlbmFuY3lQb2xpY3lGb3JEZWZhdWx0cygpOwotCQlpZiAoamF2YU11bHRpdGVuYW5jeSAhPSBudWxsICYmICF0aGlzLmlzU3BlY2lmaWVkTXVsdGl0ZW5hbnQoKSkgewotCQkJaWYgKGphdmFNdWx0aXRlbmFuY3kuaGFzU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSkgewotCQkJCXJldHVybiBuZXcgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4oamF2YU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpKTsKLQkJCX0KLQkJfQotCQlpZiAodGhpcy5pc011bHRpdGVuYW50SW5oZXJpdGFuY2VIaWVyYXJjaHkoKSkgewotCQkJcmV0dXJuIG5ldyBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPih0aGlzLmdldFJvb3RFbnRpdHkoKS5nZXRNdWx0aXRlbmFuY3koKS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpKTsKLQkJfQotCQlpZiAoIWlzU3BlY2lmaWVkTXVsdGl0ZW5hbnQoKSkgewotCQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIHN1cGVyTWFwcGVkU3VwZXJjbGFzcyA9IHRoaXMuZ2V0U3VwZXJNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCQlpZiAoc3VwZXJNYXBwZWRTdXBlcmNsYXNzICE9IG51bGwgJiYgc3VwZXJNYXBwZWRTdXBlcmNsYXNzLmdldE11bHRpdGVuYW5jeSgpLmlzTXVsdGl0ZW5hbnQoKSkgewotCQkJCXJldHVybiBuZXcgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4oc3VwZXJNYXBwZWRTdXBlcmNsYXNzLmdldE11bHRpdGVuYW5jeSgpLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkpOwotCQkJfQotCQl9Ci0JCWlmICh0aGlzLmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpID09IDApIHsKLQkJCUxpc3RJdGVyYWJsZTxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGNvbnRleHRDb2x1bW5zID0gdGhpcy5nZXRDb250ZXh0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCk7Ci0JCQlpZiAoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoY29udGV4dENvbHVtbnMpKSB7Ci0JCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4odGhpcy5kZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbik7Ci0JCQl9Ci0JCQlyZXR1cm4gY29udGV4dENvbHVtbnM7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGdldENvbnRleHREZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSB0aGlzLmdldEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MoKTsKLQkJcmV0dXJuIChlbnRpdHlNYXBwaW5ncyAhPSBudWxsKSA/IGVudGl0eU1hcHBpbmdzLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkgOiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgbW92ZURlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKGludCBpbmRleCwgT3JtVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbikgewotCQl0aGlzLmRlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyLm1vdmVDb250ZXh0RWxlbWVudChpbmRleCwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbik7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGFkZERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKGludCBpbmRleCwgSmF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgamF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIGphdmFUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgYnVpbGRWaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1WaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyh0aGlzLCB0aGlzLnRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Pd25lciwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oT3JtVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbikgewotCQl0aGlzLmRlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyLnJlbW92ZUNvbnRleHRFbGVtZW50KHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1WaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMywgUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBidWlsZERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNBbGxvd2VkKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0FsbG93ZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNBbGxvd2VkKGJvb2xlYW4gYWxsb3dlZCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNBbGxvd2VkOwotCQl0aGlzLnNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQWxsb3dlZCA9IGFsbG93ZWQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OU19BTExPV0VEX1BST1BFUlRZLCBvbGQsIGFsbG93ZWQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNBbGxvd2VkKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKS5pc011bHRpdGVuYW50TWV0YWRhdGFBbGxvd2VkKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBkZWZhdWx0IHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbiBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1WaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMywgUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIERFRkFVTFRfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgT3JtVmlydHVhbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgYnVpbGRDb250ZXh0RWxlbWVudChSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gT3JtRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3lJbXBsMl8zLnRoaXMuYnVpbGRWaXJ0dWFsVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihyZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeUltcGwyXzMudGhpcy5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0ZvckRlZmF1bHRzKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgZ2V0UmVzb3VyY2VFbGVtZW50KE9ybVZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0T3ZlcnJpZGRlbkNvbHVtbigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9ybVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbi5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbk93bmVyIAotCQlpbXBsZW1lbnRzIE9ybVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5Pd25lcgotCXsKLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb250ZXh0UHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5ERUZBVUxUX0NPTlRFWFRfUFJPUEVSVFk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0UHJpbWFyeUtleSgpIHsKLQkJCXJldHVybiBSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuREVGQVVMVF9QUklNQVJZX0tFWTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdExlbmd0aCgpIHsKLQkJCXJldHVybiBSZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSDsKLQkJfQotCi0JCXB1YmxpYyBEaXNjcmltaW5hdG9yVHlwZSBnZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSB7Ci0JCQlyZXR1cm4gUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9ESVNDUklNSU5BVE9SX1RZUEU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5VGFibGVOYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uKSB7Ci0JCQlyZXR1cm4gUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLkRFRkFVTFRfTkFNRTsKLQkJfQotCi0JCXB1YmxpYyBUYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldEFsbEFzc29jaWF0ZWRUYWJsZU5hbWVzKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uLCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5WYWxpZGF0b3IyXzMoKFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMykgY29sdW1uLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JCX0KLQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCQlyZXR1cm4gT3JtRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3lJbXBsMl8zLnRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBYTUwgbXVsdGl0ZW5hbnQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIFhNTCBtdWx0aXRlbmFudCBkb2VzIG5vdCBleGlzdHMuCi0JICovCi0JcHJvdGVjdGVkIFhtbE11bHRpdGVuYW50IGdldFhtbE11bHRpdGVuYW50KCkgewotCQlyZXR1cm4gZ2V0WG1sTXVsdGl0ZW5hbnRIb2xkZXIoKS5nZXRNdWx0aXRlbmFudCgpOwotCX0KLQotCXByb3RlY3RlZCBYbWxNdWx0aXRlbmFudEhvbGRlciBnZXRYbWxNdWx0aXRlbmFudEhvbGRlcigpIHsKLQkJcmV0dXJuIChYbWxNdWx0aXRlbmFudEhvbGRlcikgdGhpcy5nZXRYbWxUeXBlTWFwcGluZygpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIHRoZSBYTUwgbXVsdGl0ZW5hbnQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JcHJvdGVjdGVkIFhtbE11bHRpdGVuYW50IGdldFhtbE11bHRpdGVuYW50Rm9yVXBkYXRlKCkgewotCQlYbWxNdWx0aXRlbmFudCB4bWxNdWx0aXRlbmFudCA9IHRoaXMuZ2V0WG1sTXVsdGl0ZW5hbnQoKTsKLQkJcmV0dXJuICh4bWxNdWx0aXRlbmFudCAhPSBudWxsKSA/IHhtbE11bHRpdGVuYW50IDogdGhpcy5idWlsZFhtbE11bHRpdGVuYW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbE11bHRpdGVuYW50IGJ1aWxkWG1sTXVsdGl0ZW5hbnQoKSB7Ci0JCVhtbE11bHRpdGVuYW50IHhtbE11bHRpdGVuYW50ID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNdWx0aXRlbmFudCgpOwotCQl0aGlzLmdldFhtbE11bHRpdGVuYW50SG9sZGVyKCkuc2V0TXVsdGl0ZW5hbnQoeG1sTXVsdGl0ZW5hbnQpOwotCQlyZXR1cm4geG1sTXVsdGl0ZW5hbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNdWx0aXRlbmFudEVsZW1lbnRTcGVjaWZpZWQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbE11bHRpdGVuYW50KCkgIT0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sTXVsdGl0ZW5hbnQgYWRkWG1sTXVsdGl0ZW5hbnQoKSB7Ci0JCVhtbE11bHRpdGVuYW50IHhtbE11bHRpdGVuYW50ID0gdGhpcy5idWlsZFhtbE11bHRpdGVuYW50KCk7Ci0JCXRoaXMuZ2V0WG1sTXVsdGl0ZW5hbnRIb2xkZXIoKS5zZXRNdWx0aXRlbmFudCh4bWxNdWx0aXRlbmFudCk7Ci0JCXJldHVybiB4bWxNdWx0aXRlbmFudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxNdWx0aXRlbmFudCgpIHsKLQkJdGhpcy5nZXRYbWxNdWx0aXRlbmFudEhvbGRlcigpLnNldE11bHRpdGVuYW50KG51bGwpOwotCX0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE9ybUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBYbWxUeXBlTWFwcGluZyBnZXRYbWxUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGdldEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncykgc3VwZXIuZ2V0TWFwcGluZ0ZpbGVSb290KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZyBnZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgZ2V0SmF2YU11bHRpdGVuYW5jeVBvbGljeUZvckRlZmF1bHRzKCkgewotCQlKYXZhRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcgamF2YVR5cGVNYXBwaW5nID0gdGhpcy5nZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotCQlyZXR1cm4gKGphdmFUeXBlTWFwcGluZyA9PSBudWxsKSA/IG51bGwgOiBqYXZhVHlwZU1hcHBpbmcuZ2V0TXVsdGl0ZW5hbmN5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNNdWx0aXRlbmFudEluaGVyaXRhbmNlSGllcmFyY2h5KCkgewotCQlpZiAodGhpcy5pc0luaGVyaXRhbmNlU3RyYXRlZ3lUYWJsZVBlckNsYXNzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5pc1Jvb3RFbnRpdHlNdWx0aXRlbmFudCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSW5oZXJpdGFuY2VTdHJhdGVneVRhYmxlUGVyQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpLmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSA9PSBJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUm9vdEVudGl0eU11bHRpdGVuYW50KCkgewotCQlFY2xpcHNlTGlua0VudGl0eSByb290RW50aXR5ID0gdGhpcy5nZXRSb290RW50aXR5KCk7Ci0JCXJldHVybiByb290RW50aXR5ICE9IG51bGwgJiYgcm9vdEVudGl0eSAhPSBnZXRQYXJlbnQoKSAmJiByb290RW50aXR5LmdldE11bHRpdGVuYW5jeSgpLmlzTXVsdGl0ZW5hbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFbnRpdHkgZ2V0Um9vdEVudGl0eSgpIHsKLQkJLy9pbnN0YW5jZW9mIGNoZWNrIGluIGNhc2UgdGhlIHJvb3RFbnRpdHkgaXMgaW4gYW4gb3JtLnhtbCBpbnN0ZWFkIG9mIGFuIGVjbGlwc2VsaW5rb3JtLnhtbCBmaWxlLgotCQlFbnRpdHkgZW50aXR5ID0gZ2V0UGFyZW50KCkuZ2V0Um9vdEVudGl0eSgpOwotCQlyZXR1cm4gZW50aXR5IGluc3RhbmNlb2YgRWNsaXBzZUxpbmtFbnRpdHkgPyAoRWNsaXBzZUxpbmtFbnRpdHkpIGVudGl0eSA6IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTdXBlck1hcHBlZFN1cGVyY2xhc3NNdWx0aXRlbmFudCgpIHsKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSB0aGlzLmdldFN1cGVyTWFwcGVkU3VwZXJjbGFzcyhnZXRQYXJlbnQoKSk7Ci0JCXJldHVybiBtYXBwZWRTdXBlcmNsYXNzICE9IG51bGwgJiYgbWFwcGVkU3VwZXJjbGFzcy5nZXRNdWx0aXRlbmFuY3koKS5pc011bHRpdGVuYW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBnZXRTdXBlck1hcHBlZFN1cGVyY2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmdldFN1cGVyTWFwcGVkU3VwZXJjbGFzcyh0aGlzLmdldFBhcmVudCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIGdldFN1cGVyTWFwcGVkU3VwZXJjbGFzcyhUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlUeXBlTWFwcGluZyBzdXBlclR5cGVNYXBwaW5nID0gdHlwZU1hcHBpbmcuZ2V0U3VwZXJUeXBlTWFwcGluZygpOwotCQlpZiAoc3VwZXJUeXBlTWFwcGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkvL2luc3RhbmNlb2YgY2hlY2sgaW4gY2FzZSB0aGUgbWFwcGVkIHN1cGVyY2xhc3MgaXMgaW4gYW4gb3JtLnhtbCBpbnN0ZWFkIG9mIGFuIGVjbGlwc2VsaW5rb3JtLnhtbCBmaWxlLgotCQlpZiAoc3VwZXJUeXBlTWFwcGluZyBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgewotCQkJcmV0dXJuIChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIHN1cGVyVHlwZU1hcHBpbmc7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0U3VwZXJNYXBwZWRTdXBlcmNsYXNzKHN1cGVyVHlwZU1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZXNQcmltYXJ5S2V5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCWZvciAoUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGNvbHVtbiA6IGdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkpIHsKLQkJCWlmIChjb2x1bW4uaXNQcmltYXJ5S2V5KCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQlpZiAoZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlRBQkxFX1BFUl9URU5BTlQpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCi0JCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1VTFRJVEVOQU5UX1RBQkxFX1BFUl9URU5BTlRfTk9UX1NVUFBPUlRFRCwKLQkJCQkJRU1QVFlfU1RSSU5HX0FSUkFZLAotCQkJCQl0aGlzLAotCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCSkKLQkJCSk7CQkJCi0JCX0KLQkJaWYgKGdldFR5cGUoKSA9PSBFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5WUEQpIHsKLQkJCVN0cmluZyB0YXJnZXREYXRhYmFzZSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5nZXRUYXJnZXREYXRhYmFzZSgpOwotCQkJaWYgKHRhcmdldERhdGFiYXNlID09IG51bGwpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5MT1dfU0VWRVJJVFksCi0JCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5NVUxUSVRFTkFOVF9WUERfTUlHSFRfTk9UX0JFX05PVF9TVVBQT1JURUQsCi0JCQkJCQlFTVBUWV9TVFJJTkdfQVJSQVksCi0JCQkJCQl0aGlzLAotCQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKLQkJCQkJKQotCQkJCSk7Ci0JCQl9Ci0JCQllbHNlIGlmICghVGFyZ2V0RGF0YWJhc2UuaXNPcmFjbGVEYXRhYmFzZSh0YXJnZXREYXRhYmFzZSkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCi0JCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5NVUxUSVRFTkFOVF9WUERfTk9UX1NVUFBPUlRFRF9PTl9OT05fT1JBQ0xFX0RBVEFCQVNFX1BMQVRGT1JNLAotCQkJCQkJbmV3IFN0cmluZ1tdIHt0YXJnZXREYXRhYmFzZX0sCi0JCQkJCQl0aGlzLAotCQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKLQkJCQkJKQotCQkJCSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpID4gMCkgewotCQkJaWYgKCF0aGlzLnNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQWxsb3dlZCgpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTVVMVElURU5BTlRfTUVUQURBVEFfQ0FOTk9UX0JFX1NQRUNJRklFRF9PTl9OT05fUk9PVF9FTlRJVFksCi0JCQkJCQlFTVBUWV9TVFJJTkdfQVJSQVksCi0JCQkJCQl0aGlzLAotCQkJCQkJdGhpcy5nZXRYbWxNdWx0aXRlbmFudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkJKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZvciAoT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBjb2x1bW4gOiB0aGlzLmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkpIHsKLQkJCQkJY29sdW1uLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh0aGlzLnNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQWxsb3dlZCgpKSB7Ci0JCQkvL2J1ZyAzNjA3MzEgbm8gbmVlZCB0byB2YWxpZGF0ZSwgdGhleSB3aWxsIGJlIHZhbGlkYXRlZCB3aGVyZSB0aGV5IGFyZSBzcGVjaWZpZWQgCi0JCQlmb3IgKE9ybVZpcnR1YWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGNvbHVtbiA6IHRoaXMuZ2V0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkpIHsKLQkJCQljb2x1bW4udmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJCX0KLQkJfQotCQlpZiAodGhpcy5nZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoKSA9PSBCb29sZWFuLlRSVUUgJiYgZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlZQRCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKLQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTVVMVElURU5BTlRfVlBEX0lOQ0xVREVfQ1JJVEVSSUFfV0lMTF9CRV9JR05PUkVELAotCQkJCQlFTVBUWV9TVFJJTkdfQVJSQVksCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0WG1sTXVsdGl0ZW5hbnQoKS5nZXRJbmNsdWRlQ3JpdGVyaWFUZXh0UmFuZ2UoKQotCQkJCSkKLQkJCSk7CQkJCi0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldFhtbE11bHRpdGVuYW50VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRYbWxNdWx0aXRlbmFudFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCVhtbE11bHRpdGVuYW50XzJfNCB4bWxNdWx0aXRlbmFudCA9IHRoaXMuZ2V0WG1sTXVsdGl0ZW5hbnQoKTsKLQkJcmV0dXJuICh4bWxNdWx0aXRlbmFudCA9PSBudWxsKSA/IG51bGwgOiB4bWxNdWx0aXRlbmFudC5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb21wbGV0aW9uIHByb3Bvc2FscyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRYbWxDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRYbWxDb21wbGV0aW9uUHJvcG9zYWxzKHBvcyk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlmb3IgKE9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbiA6IHRoaXMuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSkgewotCQkJcmVzdWx0ID0gdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbi5nZXRYbWxDb21wbGV0aW9uUHJvcG9zYWxzKHBvcyk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTXV0YWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNdXRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMmQ5NDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNdXRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011dGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXV0YWJsZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rTXV0YWJsZQotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtNdXRhYmxlCi17Ci0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkTXV0YWJsZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0TXV0YWJsZTsKLQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rTXV0YWJsZShPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnNwZWNpZmllZE11dGFibGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkTXV0YWJsZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZE11dGFibGVfKHRoaXMuYnVpbGRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdE11dGFibGUodGhpcy5idWlsZERlZmF1bHRNdXRhYmxlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtdXRhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzTXV0YWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZE11dGFibGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZE11dGFibGUuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmRlZmF1bHRNdXRhYmxlOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZE11dGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE11dGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuIG11dGFibGUpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWRNdXRhYmxlXyhtdXRhYmxlKTsKLQkJdGhpcy5nZXRYbWxNdXRhYmxlKCkuc2V0TXV0YWJsZShtdXRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRNdXRhYmxlXyhCb29sZWFuIG11dGFibGUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZE11dGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkTXV0YWJsZSA9IG11dGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTVVUQUJMRV9QUk9QRVJUWSwgb2xkLCBtdXRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZE11dGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbE11dGFibGUoKS5nZXRNdXRhYmxlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TXV0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE11dGFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE11dGFibGUoYm9vbGVhbiBtdXRhYmxlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZWZhdWx0TXV0YWJsZTsKLQkJdGhpcy5kZWZhdWx0TXV0YWJsZSA9IG11dGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX01VVEFCTEVfUFJPUEVSVFksIG9sZCwgbXV0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGREZWZhdWx0TXV0YWJsZSgpIHsKLQkJSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhQXR0cmlidXRlID0gdGhpcy5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlpZiAoamF2YUF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGphdmFBdHRyaWJ1dGUudHlwZUlzRGF0ZU9yQ2FsZW5kYXIoKSkgewotCQkJQm9vbGVhbiBwdVRlbXBvcmFsTXV0YWJsZSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLmdldFRlbXBvcmFsTXV0YWJsZSgpOwotCQkJcmV0dXJuIChwdVRlbXBvcmFsTXV0YWJsZSA9PSBudWxsKSA/IGZhbHNlIDogcHVUZW1wb3JhbE11dGFibGUuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGphdmFBdHRyaWJ1dGUudHlwZUlzU2VyaWFsaXphYmxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE9ybUF0dHJpYnV0ZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVNYXBwaW5nIGdldEF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBYbWxNdXRhYmxlIGdldFhtbE11dGFibGUoKSB7Ci0JCXJldHVybiAoWG1sTXV0YWJsZSkgdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlIGdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQlyZXR1cm4gKEphdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUpIHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIHN1cGVyLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2V0WG1sVmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFhtbFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbE11dGFibGUoKS5nZXRNdXRhYmxlVGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU0NzdiNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhTmFtZWRDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkRlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVyc2lvblZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIKLQlleHRlbmRzIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyPFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIKLXsKLQlwcml2YXRlIFN0cmluZyBkYXRhVHlwZTsKLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZERhdGFUeXBlOwotCi0JcHJpdmF0ZSBTdHJpbmcgb2JqZWN0VHlwZTsKLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZE9iamVjdFR5cGU7Ci0KLQotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSwgWG1sQ29udmVyc2lvblZhbHVlPiBjb252ZXJzaW9uVmFsdWVDb250YWluZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWU7Ci0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBYbWxPYmplY3RUeXBlQ29udmVydGVyIHhtbENvbnZlcnRlcikgewotCQlzdXBlcihwYXJlbnQsIHhtbENvbnZlcnRlcik7Ci0JCXRoaXMuZGF0YVR5cGUgPSB4bWxDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKTsKLQkJdGhpcy5vYmplY3RUeXBlID0geG1sQ29udmVydGVyLmdldE9iamVjdFR5cGUoKTsKLQkJdGhpcy5jb252ZXJzaW9uVmFsdWVDb250YWluZXIgPSB0aGlzLmJ1aWxkQ29udmVyc2lvblZhbHVlQ29udGFpbmVyKCk7Ci0JCXRoaXMuZGVmYXVsdE9iamVjdFZhbHVlID0geG1sQ29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldERhdGFUeXBlXyh0aGlzLnhtbENvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJdGhpcy5zZXRPYmplY3RUeXBlXyh0aGlzLnhtbENvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQl0aGlzLnN5bmNDb252ZXJzaW9uVmFsdWVzKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdE9iamVjdFZhbHVlXyh0aGlzLnhtbENvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRGdWxseVF1YWxpZmllZERhdGFUeXBlKHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZERhdGFUeXBlKCkpOwotCQl0aGlzLnNldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSh0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKCkpOwotCQl0aGlzLnVwZGF0ZU5vZGVzKHRoaXMuZ2V0Q29udmVyc2lvblZhbHVlcygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGF0YSB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFUeXBlKFN0cmluZyBkYXRhVHlwZSkgewotCQl0aGlzLnNldERhdGFUeXBlXyhkYXRhVHlwZSk7Ci0JCXRoaXMueG1sQ29udmVydGVyLnNldERhdGFUeXBlKGRhdGFUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREYXRhVHlwZV8oU3RyaW5nIGRhdGFUeXBlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRhdGFUeXBlOwotCQl0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChEQVRBX1RZUEVfUFJPUEVSVFksIG9sZCwgZGF0YVR5cGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWREYXRhVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWREYXRhVHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGdWxseVF1YWxpZmllZERhdGFUeXBlKFN0cmluZyBkYXRhVHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZERhdGFUeXBlOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUgPSBkYXRhVHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9EQVRBX1RZUEVfUFJPUEVSVFksIG9sZCwgZGF0YVR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZERhdGFUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nRmlsZVJvb3QoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUodGhpcy5kYXRhVHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGF0YVR5cGVJc0ZvcihTdHJpbmcgdHlwZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMudHlwZUlzRm9yKHRoaXMuZ2V0RGF0YVR5cGVKYXZhUmVzb3VyY2VUeXBlKCksIHR5cGVOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkYXRhVHlwZUlzSW4oSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQkJcmV0dXJuIHRoaXMudHlwZUlzSW4odGhpcy5nZXREYXRhVHlwZUphdmFSZXNvdXJjZVR5cGUoKSwgcGFja2FnZUZyYWdtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGdldERhdGFUeXBlSmF2YVJlc291cmNlVHlwZSgpIHsKLQkJaWYgKHRoaXMuZnVsbHlRdWFsaWZpZWREYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZSh0aGlzLmZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvYmplY3QgdHlwZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0VHlwZShTdHJpbmcgb2JqZWN0VHlwZSkgewotCQl0aGlzLnNldE9iamVjdFR5cGVfKG9iamVjdFR5cGUpOwotCQl0aGlzLnhtbENvbnZlcnRlci5zZXRPYmplY3RUeXBlKG9iamVjdFR5cGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE9iamVjdFR5cGVfKFN0cmluZyBvYmplY3RUeXBlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm9iamVjdFR5cGU7Ci0JCXRoaXMub2JqZWN0VHlwZSA9IG9iamVjdFR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPQkpFQ1RfVFlQRV9QUk9QRVJUWSwgb2xkLCBvYmplY3RUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZShTdHJpbmcgb2JqZWN0VHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZE9iamVjdFR5cGU7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlID0gb2JqZWN0VHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9PQkpFQ1RfVFlQRV9QUk9QRVJUWSwgb2xkLCBvYmplY3RUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nRmlsZVJvb3QoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUodGhpcy5vYmplY3RUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvYmplY3RUeXBlSXNGb3IoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVJc0Zvcih0aGlzLmdldE9iamVjdFR5cGVKYXZhUmVzb3VyY2VUeXBlKCksIHR5cGVOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvYmplY3RUeXBlSXNJbihJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCkgewotCQlyZXR1cm4gdGhpcy50eXBlSXNJbih0aGlzLmdldE9iamVjdFR5cGVKYXZhUmVzb3VyY2VUeXBlKCksIHBhY2thZ2VGcmFnbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBnZXRPYmplY3RUeXBlSmF2YVJlc291cmNlVHlwZSgpIHsKLQkJaWYgKHRoaXMuZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKHRoaXMuZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVyc2lvbiB2YWx1ZXMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gZ2V0Q29udmVyc2lvblZhbHVlcygpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVyc2lvblZhbHVlQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q29udmVyc2lvblZhbHVlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnNpb25WYWx1ZUNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHNTaXplKCk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGdldENvbnZlcnNpb25WYWx1ZShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVyc2lvblZhbHVlQ29udGFpbmVyLmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGFkZENvbnZlcnNpb25WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYWRkQ29udmVyc2lvblZhbHVlKHRoaXMuZ2V0Q29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGFkZENvbnZlcnNpb25WYWx1ZShpbnQgaW5kZXgpIHsKLQkJWG1sQ29udmVyc2lvblZhbHVlIHhtbENvbnZlcnNpb25WYWx1ZSA9IHRoaXMuYnVpbGRYbWxDb252ZXJzaW9uVmFsdWUoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlID0gdGhpcy5jb252ZXJzaW9uVmFsdWVDb250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIHhtbENvbnZlcnNpb25WYWx1ZSk7Ci0JCXRoaXMueG1sQ29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXMoKS5hZGQoaW5kZXgsIHhtbENvbnZlcnNpb25WYWx1ZSk7Ci0JCXJldHVybiBjb252ZXJzaW9uVmFsdWU7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbENvbnZlcnNpb25WYWx1ZSBidWlsZFhtbENvbnZlcnNpb25WYWx1ZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVyc2lvblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29udmVyc2lvblZhbHVlKEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSkgewotCQl0aGlzLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSh0aGlzLmNvbnZlcnNpb25WYWx1ZUNvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoKE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlKSBjb252ZXJzaW9uVmFsdWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb252ZXJzaW9uVmFsdWUoaW50IGluZGV4KSB7Ci0JCXRoaXMuY29udmVyc2lvblZhbHVlQ29udGFpbmVyLnJlbW92ZUNvbnRleHRFbGVtZW50KGluZGV4KTsKLQkJdGhpcy54bWxDb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlcygpLnJlbW92ZShpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZUNvbnZlcnNpb25WYWx1ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLmNvbnZlcnNpb25WYWx1ZUNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy54bWxDb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlcygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBidWlsZENvbnZlcnNpb25WYWx1ZShYbWxDb252ZXJzaW9uVmFsdWUgeG1sQ29udmVyc2lvblZhbHVlKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUodGhpcywgeG1sQ29udmVyc2lvblZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jQ29udmVyc2lvblZhbHVlcygpIHsKLQkJdGhpcy5jb252ZXJzaW9uVmFsdWVDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sQ29udmVyc2lvblZhbHVlPiBnZXRYbWxDb252ZXJzaW9uVmFsdWVzKCkgewotCQkvLyBjbG9uZSB0byByZWR1Y2UgY2hhbmNlIG9mIGNvbmN1cnJlbmN5IHByb2JsZW1zCi0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFhtbENvbnZlcnNpb25WYWx1ZT4odGhpcy54bWxDb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8T3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUsIFhtbENvbnZlcnNpb25WYWx1ZT4gYnVpbGRDb252ZXJzaW9uVmFsdWVDb250YWluZXIoKSB7Ci0JCUNvbnZlcnNpb25WYWx1ZUNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgQ29udmVyc2lvblZhbHVlQ29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogY29udmVyc2lvbiB2YWx1ZSBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgQ29udmVyc2lvblZhbHVlQ29udGFpbmVyCi0JCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlLCBYbWxDb252ZXJzaW9uVmFsdWU+IHsKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBDT05WRVJTSU9OX1ZBTFVFU19MSVNUOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGJ1aWxkQ29udGV4dEVsZW1lbnQoWG1sQ29udmVyc2lvblZhbHVlIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci50aGlzLmJ1aWxkQ29udmVyc2lvblZhbHVlKHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFhtbENvbnZlcnNpb25WYWx1ZT4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIudGhpcy5nZXRYbWxDb252ZXJzaW9uVmFsdWVzKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sQ29udmVyc2lvblZhbHVlIGdldFJlc291cmNlRWxlbWVudChPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldFhtbENvbnZlcnNpb25WYWx1ZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRhdGEgdmFsdWVzICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldERhdGFWYWx1ZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSwgU3RyaW5nPih0aGlzLmdldENvbnZlcnNpb25WYWx1ZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUpIHsKLQkJCQlyZXR1cm4gY29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RGF0YVZhbHVlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgb2JqZWN0IHZhbHVlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE9iamVjdFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnNldERlZmF1bHRPYmplY3RWYWx1ZV8odmFsdWUpOwotCQl0aGlzLnhtbENvbnZlcnRlci5zZXREZWZhdWx0T2JqZWN0VmFsdWUodmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRPYmplY3RWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZTsKLQkJdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfT0JKRUNUX1ZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgQ2xhc3M8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBnZXRUeXBlKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHR5cGVJc0ZvcihKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgdHlwZSwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiAodHlwZSAhPSBudWxsKSAmJiB0eXBlLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHModHlwZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHR5cGVJc0luKEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSB0eXBlLCBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCkgewotCQlyZXR1cm4gKHR5cGUgIT0gbnVsbCkgJiYgdHlwZS5pc0luKHBhY2thZ2VGcmFnbWVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQkJdGhpcy5jcmVhdGVSZW5hbWVEYXRhVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5jcmVhdGVSZW5hbWVPYmplY3RUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKQotCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZURhdGFUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5kYXRhVHlwZUlzRm9yKG9yaWdpbmFsVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKSkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lRGF0YVR5cGVFZGl0KG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVEYXRhVHlwZUVkaXQoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy54bWxDb252ZXJ0ZXIuY3JlYXRlUmVuYW1lRGF0YVR5cGVFZGl0KG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVPYmplY3RUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5vYmplY3RUeXBlSXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVPYmplY3RUeXBlRWRpdChvcmlnaW5hbFR5cGUsIG5ld05hbWUpKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lT2JqZWN0VHlwZUVkaXQoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy54bWxDb252ZXJ0ZXIuY3JlYXRlUmVuYW1lT2JqZWN0VHlwZUVkaXQob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQkJdGhpcy5jcmVhdGVNb3ZlRGF0YVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpLAotCQkJCXRoaXMuY3JlYXRlTW92ZU9iamVjdFR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZURhdGFUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YVR5cGVJc0ZvcihvcmlnaW5hbFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZURhdGFUeXBlUGFja2FnZUVkaXQobmV3UGFja2FnZS5nZXRFbGVtZW50TmFtZSgpKSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZURhdGFUeXBlUGFja2FnZUVkaXQoU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMueG1sQ29udmVydGVyLmNyZWF0ZVJlbmFtZURhdGFUeXBlUGFja2FnZUVkaXQobmV3TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlT2JqZWN0VHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFR5cGVJc0ZvcihvcmlnaW5hbFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZU9iamVjdFR5cGVQYWNrYWdlRWRpdChuZXdQYWNrYWdlLmdldEVsZW1lbnROYW1lKCkpKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lT2JqZWN0VHlwZVBhY2thZ2VFZGl0KFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLnhtbENvbnZlcnRlci5jcmVhdGVSZW5hbWVPYmplY3RUeXBlUGFja2FnZUVkaXQobmV3TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCXRoaXMuY3JlYXRlUmVuYW1lRGF0YVR5cGVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCQl0aGlzLmNyZWF0ZVJlbmFtZU9iamVjdFR5cGVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKQotCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZURhdGFUeXBlUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5kYXRhVHlwZUlzSW4ob3JpZ2luYWxQYWNrYWdlKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVEYXRhVHlwZVBhY2thZ2VFZGl0KG5ld05hbWUpKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZU9iamVjdFR5cGVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFR5cGVJc0luKG9yaWdpbmFsUGFja2FnZSkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lT2JqZWN0VHlwZVBhY2thZ2VFZGl0KG5ld05hbWUpKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuY2hlY2tGb3JEdXBsaWNhdGVEYXRhVmFsdWVzKG1lc3NhZ2VzKTsKLQkJZm9yIChPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUgOiB0aGlzLmdldENvbnZlcnNpb25WYWx1ZXMoKSkgewotCQkJY29udmVyc2lvblZhbHVlLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja0ZvckR1cGxpY2F0ZURhdGFWYWx1ZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJZm9yIChBcnJheUxpc3Q8T3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGR1cHMgOiB0aGlzLm1hcENvbnZlcnNpb25WYWx1ZXNCeURhdGFWYWx1ZSgpLnZhbHVlcygpKSB7Ci0JCQlpZiAoZHVwcy5zaXplKCkgPiAxKSB7Ci0JCQkJZm9yIChPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBkdXAgOiBkdXBzKSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5NVUxUSVBMRV9PQkpFQ1RfVkFMVUVTX0ZPUl9EQVRBX1ZBTFVFLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7ZHVwLmdldERhdGFWYWx1ZSgpfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCWR1cC5nZXREYXRhVmFsdWVUZXh0UmFuZ2UoKQotCQkJCQkJKQotCQkJCQkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPj4gbWFwQ29udmVyc2lvblZhbHVlc0J5RGF0YVZhbHVlKCkgewotCQlIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPj4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8T3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+Pih0aGlzLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlmb3IgKE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSA6IHRoaXMuZ2V0Q29udmVyc2lvblZhbHVlcygpKSB7Ci0JCQlTdHJpbmcgZGF0YVZhbHVlID0gY29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpOwotCQkJQXJyYXlMaXN0PE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBsaXN0ID0gbWFwLmdldChkYXRhVmFsdWUpOwotCQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0PE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPigpOwotCQkJCW1hcC5wdXQoZGF0YVZhbHVlLCBsaXN0KTsKLQkJCX0KLQkJCWxpc3QuYWRkKGNvbnZlcnNpb25WYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0VxdWl2YWxlbnRUbyhKcGFOYW1lZENvbnRleHROb2RlIG5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmlzRXF1aXZhbGVudFRvKG5vZGUpCi0JCQkJJiYgdGhpcy5pc0VxdWl2YWxlbnRUbygoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VxdWl2YWxlbnRUbyhFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLmZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSwgY29udmVydGVyLmdldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSgpKSAmJgotCQkJCVRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMuZnVsbHlRdWFsaWZpZWREYXRhVHlwZSwgY29udmVydGVyLmdldEZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUoKSkgJiYKLQkJCQlUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZSwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKSAmJgotCQkJCXRoaXMuY29udmVyc2lvblZhbHVlc0FyZUVxdWl2YWxlbnRUbyhjb252ZXJ0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbnZlcnNpb25WYWx1ZXNBcmVFcXVpdmFsZW50VG8oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlcikgewotCQkvLyBnZXQgZml4ZWQgbGlzdHMgb2YgdGhlIGNvbnZlcnNpb24gdmFsdWVzCi0JCUFycmF5TGlzdDxPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gY29udmVyc2lvblZhbHVlczEgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmdldENvbnZlcnNpb25WYWx1ZXMoKSk7Ci0JCUFycmF5TGlzdDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGNvbnZlcnNpb25WYWx1ZXMyID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoY29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXMoKSk7Ci0JCWlmIChjb252ZXJzaW9uVmFsdWVzMS5zaXplKCkgIT0gY29udmVyc2lvblZhbHVlczIuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb252ZXJzaW9uVmFsdWVzMS5zaXplKCk7IGkrKykgewotCQkJaWYgKCAhIGNvbnZlcnNpb25WYWx1ZXMxLmdldChpKS5pc0VxdWl2YWxlbnRUbyhjb252ZXJzaW9uVmFsdWVzMi5nZXQoaSkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZXRhZGF0YSBjb252ZXJzaW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGNvbnZlcnRGcm9tKEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgamF2YUNvbnZlcnRlcikgewotCQlzdXBlci5jb252ZXJ0RnJvbShqYXZhQ29udmVydGVyKTsKLQkJdGhpcy5zZXREYXRhVHlwZShqYXZhQ29udmVydGVyLmdldEZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUoKSk7Ci0JCXRoaXMuc2V0T2JqZWN0VHlwZShqYXZhQ29udmVydGVyLmdldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0T2JqZWN0VmFsdWUoamF2YUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCWZvciAoSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIHZhbHVlIDogamF2YUNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzKCkpIHsKLQkJCXRoaXMuYWRkQ29udmVyc2lvblZhbHVlKCkuY29udmVydEZyb20odmFsdWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ2OGM5MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtBY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ByaXZhdGVPd25lZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1Db252ZXJ0aWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtT25lVG9NYW55UmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0T3JtT25lVG9NYW55TWFwcGluZzxYbWxPbmVUb01hbnk+Ci0JaW1wbGVtZW50cwotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzAsCi0JCUVjbGlwc2VMaW5rT3JtQ29udmVydGlibGVNYXBwaW5nLAotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lci5Pd25lcgotewotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua1ByaXZhdGVPd25lZCBwcml2YXRlT3duZWQ7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2ggam9pbkZldGNoOwotCQotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBjb252ZXJ0ZXJDb250YWluZXI7Ci0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbE9uZVRvTWFueSB4bWxNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sTWFwcGluZyk7Ci0JCXRoaXMucHJpdmF0ZU93bmVkID0gbmV3IE9ybUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkKHRoaXMpOwotCQl0aGlzLmpvaW5GZXRjaCA9IG5ldyBPcm1FY2xpcHNlTGlua0pvaW5GZXRjaCh0aGlzKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMucHJpdmF0ZU93bmVkLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5qb2luRmV0Y2guc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5wcml2YXRlT3duZWQudXBkYXRlKCk7Ci0JCXRoaXMuam9pbkZldGNoLnVwZGF0ZSgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYXR0cmlidXRlIHR5cGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZEF0dHJpYnV0ZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0QXR0cmlidXRlVHlwZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEF0dHJpYnV0ZVR5cGVJblhtbChTdHJpbmcgYXR0cmlidXRlVHlwZSkgewotCQl0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuc2V0QXR0cmlidXRlVHlwZShhdHRyaWJ1dGVUeXBlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJpdmF0ZSBvd25lZCAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgZ2V0UHJpdmF0ZU93bmVkKCkgewotCQlyZXR1cm4gdGhpcy5wcml2YXRlT3duZWQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gZmV0Y2ggKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rSm9pbkZldGNoIGdldEpvaW5GZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkZldGNoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXJzICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBnZXRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsKHRoaXMsIHRoaXMsIHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIGludCBnZXROdW1iZXJTdXBwb3J0ZWRDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gMTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVsYXRpb25zaGlwICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAgYnVpbGRSZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtT25lVG9NYW55UmVsYXRpb25zaGlwMl8wIGdldFJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua09ybU9uZVRvTWFueVJlbGF0aW9uc2hpcCkgc3VwZXIuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCXN1cGVyLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSwKLQkJCXRoaXMuY29udmVydGVyQ29udGFpbmVyLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKQotCQkpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCXN1cGVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpLAotCQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSkKLQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJc3VwZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKQotCQkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJLy8gVE9ETyAtIHByaXZhdGUgb3duZWQsIGpvaW4gZmV0Y2ggdmFsaWRhdGlvbgotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGVUeXBlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKHRoaXMuaXNWaXJ0dWFsQWNjZXNzKCkpIHsKLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZ2V0QXR0cmlidXRlVHlwZSgpKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9OT19BVFRSSUJVVEVfVFlQRV9TUEVDSUZJRUQsCi0JCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKLQkJCQkJCXRoaXMsCi0JCQkJCQl0aGlzLmdldEF0dHJpYnV0ZVR5cGVUZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkJKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAodGhpcy5nZXRSZXNvbHZlZEF0dHJpYnV0ZVR5cGUoKSA9PSBudWxsKSB7Ci0JCQkJSVR5cGUgamR0VHlwZSA9IEpEVFRvb2xzLmZpbmRUeXBlKHRoaXMuZ2V0SmF2YVByb2plY3QoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZEF0dHJpYnV0ZVR5cGUoKSk7Ci0JCQkJaWYgKGpkdFR5cGUgPT0gbnVsbCkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX1RZUEVfRE9FU19OT1RfRVhJU1QsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQXR0cmlidXRlVHlwZSgpfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCXRoaXMuZ2V0QXR0cmlidXRlVHlwZVRleHRSYW5nZSgpCi0JCQkJCQkpCi0JCQkJCSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIudmFsaWRhdGVBdHRyaWJ1dGVUeXBlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWaXJ0dWFsQWNjZXNzKCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpID09IEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0QXR0cmlidXRlVHlwZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0QXR0cmlidXRlVHlwZVRleHRSYW5nZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJhMTI2OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ByaXZhdGVPd25lZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RPcm1PbmVUb09uZU1hcHBpbmc8WG1sT25lVG9PbmU+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZwotewotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua1ByaXZhdGVPd25lZCBwcml2YXRlT3duZWQ7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2ggam9pbkZldGNoOwotCi0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbE9uZVRvT25lIHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQkJdGhpcy5wcml2YXRlT3duZWQgPSBuZXcgT3JtRWNsaXBzZUxpbmtQcml2YXRlT3duZWQodGhpcyk7Ci0JCXRoaXMuam9pbkZldGNoID0gbmV3IE9ybUVjbGlwc2VMaW5rSm9pbkZldGNoKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnByaXZhdGVPd25lZC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuam9pbkZldGNoLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnByaXZhdGVPd25lZC51cGRhdGUoKTsKLQkJdGhpcy5qb2luRmV0Y2gudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgb3duZWQgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIGdldFByaXZhdGVPd25lZCgpIHsKLQkJcmV0dXJuIHRoaXMucHJpdmF0ZU93bmVkOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIGZldGNoICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0pvaW5GZXRjaCBnZXRKb2luRmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5GZXRjaDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCS8vIFRPRE8gLSBwcml2YXRlIG93bmVkLCBqb2luIGZldGNoIHZhbGlkYXRpb24KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OWY4NTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5TmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkFic3RyYWN0T3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5SZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUKLSAqIDxicj4KLSAqIDxjb2RlPnBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHM8L2NvZGU+IGVsZW1lbnQKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMKLQlleHRlbmRzIEFic3RyYWN0T3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMKLXsKLQotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLCBYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMz4gdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLk93bmVyIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Pd25lcjsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkR2V0TWV0aG9kOwotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkU2V0TWV0aG9kOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMudGVuYW50RGlzY3JpbWluYXRvckNvbHVtbk93bmVyID0gdGhpcy5idWlsZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Pd25lcigpOwotCQl0aGlzLnRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIgPSB0aGlzLmJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lcigpOwotCQl0aGlzLnNwZWNpZmllZEdldE1ldGhvZCA9IHRoaXMuYnVpbGRTcGVjaWZpZWRHZXRNZXRob2QoKTsKLQkJdGhpcy5zcGVjaWZpZWRTZXRNZXRob2QgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkU2V0TWV0aG9kKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGJ1aWxkWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGdldFhtbERlZmF1bHRzKCkgewotCQlyZXR1cm4gKFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKSBzdXBlci5nZXRYbWxEZWZhdWx0cygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBnZXRYbWxEZWZhdWx0c0ZvclVwZGF0ZSgpIHsKLQkJcmV0dXJuIChYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykgc3VwZXIuZ2V0WG1sRGVmYXVsdHNGb3JVcGRhdGUoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkR2V0TWV0aG9kXyh0aGlzLmJ1aWxkU3BlY2lmaWVkR2V0TWV0aG9kKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFNldE1ldGhvZF8odGhpcy5idWlsZFNwZWNpZmllZFNldE1ldGhvZCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZU5vZGVzKHRoaXMuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMudGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHNTaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpICE9IDA7Ci0JfQotCi0JcHVibGljIE9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMudGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCi0JcHVibGljIE9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgYWRkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuYWRkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbih0aGlzLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBhZGRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKGludCBpbmRleCkgewotCQlYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uIHhtbEpvaW5Db2x1bW4gPSB0aGlzLmJ1aWxkWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGpvaW5Db2x1bW4gPSB0aGlzLnRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIHhtbEpvaW5Db2x1bW4pOwotCQl0aGlzLmdldFhtbERlZmF1bHRzRm9yVXBkYXRlKCkuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5hZGQoaW5kZXgsIHhtbEpvaW5Db2x1bW4pOwotCQlyZXR1cm4gam9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbiBidWlsZFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKE9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbikgewotCQl0aGlzLnJlbW92ZVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4odGhpcy50ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyLmluZGV4T2ZDb250ZXh0RWxlbWVudCh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihpbnQgaW5kZXgpIHsKLQkJdGhpcy50ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyLnJlbW92ZUNvbnRleHRFbGVtZW50KGluZGV4KTsKLQkJdGhpcy5nZXRYbWxEZWZhdWx0cygpLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLnRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuZ2V0WG1sRGVmYXVsdHMoKS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCXRoaXMudGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMz4gZ2V0WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB7Ci0JCWlmIChnZXRYbWxEZWZhdWx0cygpID09IG51bGwpIHsKLQkJCXJldHVybiBFbXB0eUxpc3RJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0JCS8vIGNsb25lIHRvIHJlZHVjZSBjaGFuY2Ugb2YgY29uY3VycmVuY3kgcHJvYmxlbXMKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzM+KHRoaXMuZ2V0WG1sRGVmYXVsdHMoKS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpKTsKLQl9Ci0KLQkvKioKLQkgKiAgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uIGNvbnRhaW5lcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29udGFpbmVyCi0JCWV4dGVuZHMgQ29udGV4dExpc3RDb250YWluZXI8T3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMywgWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzM+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBidWlsZENvbnRleHRFbGVtZW50KFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIE9ybUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMudGhpcy5idWlsZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4ocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMz4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBPcm1FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnRoaXMuZ2V0WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zIGdldFJlc291cmNlRWxlbWVudChPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0WG1sQ29sdW1uKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLk93bmVyIGJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbk93bmVyKCkgewotCQlyZXR1cm4gbmV3IFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Pd25lcigpOwotCX0KLQotCXByb3RlY3RlZCBPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMyB4bWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zKHRoaXMsIHRoaXMudGVuYW50RGlzY3JpbWluYXRvckNvbHVtbk93bmVyLCB4bWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8T3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMywgWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzM+IGJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lcigpIHsKLQkJVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lcigpOwotCQljb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPcm1SZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4uT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Pd25lciAKLQkJaW1wbGVtZW50cyBPcm1SZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuT3duZXIKLQl7Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29udGV4dFByb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuREVGQVVMVF9DT05URVhUX1BST1BFUlRZOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdFByaW1hcnlLZXkoKSB7Ci0JCQlyZXR1cm4gUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLkRFRkFVTFRfUFJJTUFSWV9LRVk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldERlZmF1bHRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEg7Ci0JCX0KLQotCQlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkgewotCQkJcmV0dXJuIFJlYWRPbmx5TmFtZWREaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIE5vIGRlZmF1bHQgdGFibGUgbmFtZSBpbiB0aGUgY29udGV4dCBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdCBkZWZhdWx0cwotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uKSB7Ci0JCQlyZXR1cm4gUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLkRFRkFVTFRfTkFNRTsKLQkJfQotCi0JCS8qKgotCQkgKiBObyB0YWJsZSBpbiB0aGUgY29udGV4dCBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdCBkZWZhdWx0cwotCQkgKi8KLQkJcHVibGljIFRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIG5vIGNvbHVtbiB2YWxpZGF0aW9uIGNhbiBiZSBkb25lIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGRlZmF1bHRzCi0JCSAqLwotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uLCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gSnB0VmFsaWRhdG9yLk51bGwuaW5zdGFuY2UoKTsKLQkJfQotCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJCXJldHVybiBPcm1FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQl9Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKioqKiBnZXQgbWV0aG9kICoqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEdldE1ldGhvZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3BlY2lmaWVkR2V0TWV0aG9kKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0R2V0TWV0aG9kKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZEdldE1ldGhvZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkR2V0TWV0aG9kOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEdldE1ldGhvZChTdHJpbmcgZ2V0TWV0aG9kKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnNwZWNpZmllZEdldE1ldGhvZCwgZ2V0TWV0aG9kKSkgewotCQkJWG1sQWNjZXNzTWV0aG9kcyB4bWxBY2Nlc3NNZXRob2RzID0gdGhpcy5nZXRYbWxBY2Nlc3NNZXRob2RzRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZEdldE1ldGhvZF8oZ2V0TWV0aG9kKTsKLQkJCXhtbEFjY2Vzc01ldGhvZHMuc2V0R2V0TWV0aG9kKGdldE1ldGhvZCk7Ci0JCQl0aGlzLnJlbW92ZVhtbEFjY2Vzc01ldGhvZHNJZlVuc2V0KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRHZXRNZXRob2RfKFN0cmluZyBnZXRNZXRob2QpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkR2V0TWV0aG9kOwotCQl0aGlzLnNwZWNpZmllZEdldE1ldGhvZCA9IGdldE1ldGhvZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9HRVRfTUVUSE9EX1BST1BFUlRZLCBvbGQsIGdldE1ldGhvZCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZEdldE1ldGhvZCgpIHsKLQkJWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzID0gdGhpcy5nZXRYbWxBY2Nlc3NNZXRob2RzKCk7Ci0JCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGwgPyBhY2Nlc3NNZXRob2RzLmdldEdldE1ldGhvZCgpIDogbnVsbDsKLQl9Ci0KLQotCS8vKioqKioqKioqKioqKioqIHNldCBtZXRob2QgKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2V0TWV0aG9kKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRTZXRNZXRob2QoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTZXRNZXRob2QoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkU2V0TWV0aG9kKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTZXRNZXRob2Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2V0TWV0aG9kKFN0cmluZyBzZXRNZXRob2QpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkU2V0TWV0aG9kLCBzZXRNZXRob2QpKSB7Ci0JCQlYbWxBY2Nlc3NNZXRob2RzIHhtbEFjY2Vzc01ldGhvZHMgPSB0aGlzLmdldFhtbEFjY2Vzc01ldGhvZHNGb3JVcGRhdGUoKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkU2V0TWV0aG9kXyhzZXRNZXRob2QpOwotCQkJeG1sQWNjZXNzTWV0aG9kcy5zZXRTZXRNZXRob2Qoc2V0TWV0aG9kKTsKLQkJCXRoaXMucmVtb3ZlWG1sQWNjZXNzTWV0aG9kc0lmVW5zZXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFNldE1ldGhvZF8oU3RyaW5nIHNldE1ldGhvZCkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRTZXRNZXRob2Q7Ci0JCXRoaXMuc3BlY2lmaWVkU2V0TWV0aG9kID0gc2V0TWV0aG9kOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NFVF9NRVRIT0RfUFJPUEVSVFksIG9sZCwgc2V0TWV0aG9kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkU2V0TWV0aG9kKCkgewotCQlYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHMgPSB0aGlzLmdldFhtbEFjY2Vzc01ldGhvZHMoKTsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHMgIT0gbnVsbCA/IGFjY2Vzc01ldGhvZHMuZ2V0U2V0TWV0aG9kKCkgOiBudWxsOwotCX0KLQotCi0JLy8qKioqKioqKioqKioqKiogWE1MIGFjY2VzcyBtZXRob2RzICoqKioqKioqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBnZXRYbWxBY2Nlc3NNZXRob2RzKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyB4bWxEZWZhdWx0cyA9IGdldFhtbERlZmF1bHRzKCk7Ci0JCXJldHVybiB4bWxEZWZhdWx0cyAhPSBudWxsID8gZ2V0WG1sRGVmYXVsdHMoKS5nZXRBY2Nlc3NNZXRob2RzKCkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIHRoZSBYTUwgYWNjZXNzIG1ldGhvZHMgKGFuZCBYTUwgZGVmYXVsdHMgYW5kIFhNTCBtZXRhZGF0YSBpZiBuZWNlc3NhcnkpIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGdldFhtbEFjY2Vzc01ldGhvZHNGb3JVcGRhdGUoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHhtbERlZmF1bHRzID0gdGhpcy5nZXRYbWxEZWZhdWx0c0ZvclVwZGF0ZSgpOwotCQlYbWxBY2Nlc3NNZXRob2RzIHhtbEFjY2Vzc01ldGhvZHMgPSB4bWxEZWZhdWx0cy5nZXRBY2Nlc3NNZXRob2RzKCk7Ci0JCXJldHVybiAoeG1sQWNjZXNzTWV0aG9kcyAhPSBudWxsKSA/IHhtbEFjY2Vzc01ldGhvZHMgOiB0aGlzLmJ1aWxkWG1sQWNjZXNzTWV0aG9kcygpOwotCX0KLQotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGJ1aWxkWG1sQWNjZXNzTWV0aG9kcygpIHsKLQkJWG1sQWNjZXNzTWV0aG9kcyB4bWxBY2Nlc3NNZXRob2RzID0gdGhpcy5idWlsZFhtbEFjY2Vzc01ldGhvZHNfKCk7Ci0JCXRoaXMuZ2V0WG1sRGVmYXVsdHMoKS5zZXRBY2Nlc3NNZXRob2RzKHhtbEFjY2Vzc01ldGhvZHMpOwotCQlyZXR1cm4geG1sQWNjZXNzTWV0aG9kczsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBidWlsZFhtbEFjY2Vzc01ldGhvZHNfKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBY2Nlc3NNZXRob2RzKCk7Ci0JfQotCi0JLyoqCi0JICogY2xlYXIgdGhlIFhNTCBhY2Nlc3MgbWV0aG9kcyAoYW5kIHRoZSBYTUwgZGVmYXVsdHMgYW5kIFhNTCBtZXRhZGF0YSkgaWYgYXBwcm9wcmlhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxBY2Nlc3NNZXRob2RzSWZVbnNldCgpIHsKLQkJaWYgKHRoaXMuZ2V0WG1sQWNjZXNzTWV0aG9kcygpLmlzVW5zZXQoKSkgewotCQkJdGhpcy5nZXRYbWxEZWZhdWx0cygpLnNldEFjY2Vzc01ldGhvZHMobnVsbCk7Ci0JCQl0aGlzLnJlbW92ZVhtbERlZmF1bHRzSWZVbnNldCgpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb21wbGV0aW9uIHByb3Bvc2FscyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRYbWxDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRYbWxDb21wbGV0aW9uUHJvcG9zYWxzKHBvcyk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlmb3IgKE9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbiA6IHRoaXMuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSkgewotCQkJcmVzdWx0ID0gdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbi5nZXRYbWxDb21wbGV0aW9uUHJvcG9zYWxzKHBvcyk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgwMDE5ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkFic3RyYWN0T3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5FbWZUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotCi0vKioKLSAqIDxjb2RlPmVjbGlwc2VsaW5rIG9ybS54bWw8L2NvZGU+IGZpbGUKLSAqIDxicj4KLSAqIDxjb2RlPnBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGE8L2NvZGU+IGVsZW1lbnQKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEKLQlleHRlbmRzIEFic3RyYWN0T3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEKLXsKLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVudGl0eU1hcHBpbmdzIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzKSBzdXBlci5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBidWlsZFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXygpIHsKLQkJcmV0dXJuIEVtZlRvb2xzLmNyZWF0ZSgKLQkJCQl0aGlzLmdldFJlc291cmNlTm9kZUZhY3RvcnkoKSwKLQkJCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCksCi0JCQkJWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuY2xhc3MKLQkJCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk1ZGQ2Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uU3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0FjY2Vzc01ldGhvZHNIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtBY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLQotLyoqCi0gKiBFY2xpcHNlTGluawotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gcGVyc2lzdGVudCBhdHRyaWJ1dGUKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZQotCWV4dGVuZHMgU3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZQotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtBY2Nlc3NNZXRob2RzSG9sZGVyCi17Ci0JLy9UT0RPIGRlZmF1bHRzIGZyb20gdGhlIHBlcnNpc3RlbnRUeXBlIGlmIHRoZSBhY2Nlc3MgaXMgVklSVFVBTAotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkR2V0TWV0aG9kOwotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkU2V0TWV0aG9kOwotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZShPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCQl0aGlzLnNwZWNpZmllZEdldE1ldGhvZCA9IHRoaXMuYnVpbGRTcGVjaWZpZWRHZXRNZXRob2QoKTsKLQkJdGhpcy5zcGVjaWZpZWRTZXRNZXRob2QgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkU2V0TWV0aG9kKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkR2V0TWV0aG9kXyh0aGlzLmJ1aWxkU3BlY2lmaWVkR2V0TWV0aG9kKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFNldE1ldGhvZF8odGhpcy5idWlsZFNwZWNpZmllZFNldE1ldGhvZCgpKTsKLQl9Ci0KLQkvLyoqKioqKioqKioqKioqKiBnZXQgbWV0aG9kICoqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEdldE1ldGhvZCgpIHsKLQkJU3RyaW5nIHNwZWNpZmllZEdldE1ldGhvZCA9IHRoaXMuZ2V0U3BlY2lmaWVkR2V0TWV0aG9kKCk7Ci0JCXJldHVybiAoc3BlY2lmaWVkR2V0TWV0aG9kICE9IG51bGwpID8gc3BlY2lmaWVkR2V0TWV0aG9kIDogdGhpcy5nZXREZWZhdWx0R2V0TWV0aG9kKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0R2V0TWV0aG9kKCkgewotCQlyZXR1cm4gREVGQVVMVF9HRVRfTUVUSE9EOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkR2V0TWV0aG9kKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRHZXRNZXRob2Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkR2V0TWV0aG9kKFN0cmluZyBnZXRNZXRob2QpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWRHZXRNZXRob2RfKGdldE1ldGhvZCk7Ci0JCXRoaXMuZ2V0WG1sQWNjZXNzTWV0aG9kcygpLnNldEdldE1ldGhvZChnZXRNZXRob2QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEdldE1ldGhvZF8oU3RyaW5nIGdldE1ldGhvZCkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRHZXRNZXRob2Q7Ci0JCXRoaXMuc3BlY2lmaWVkR2V0TWV0aG9kID0gZ2V0TWV0aG9kOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0dFVF9NRVRIT0RfUFJPUEVSVFksIG9sZCwgZ2V0TWV0aG9kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkR2V0TWV0aG9kKCkgewotCQlYbWxBY2Nlc3NNZXRob2RzIHhtbEFjY2Vzc01ldGhvZHMgPSBnZXRYbWxBY2Nlc3NNZXRob2RzKCk7Ci0JCXJldHVybiB4bWxBY2Nlc3NNZXRob2RzICE9IG51bGwgPyB4bWxBY2Nlc3NNZXRob2RzLmdldEdldE1ldGhvZCgpIDogbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kc0hvbGRlciBnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgZ2V0WG1sQWNjZXNzTWV0aG9kcygpIHsKLQkJcmV0dXJuIGdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIoKS5nZXRBY2Nlc3NNZXRob2RzKCk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKioqKiBzZXQgbWV0aG9kICoqKioqKioqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRTZXRNZXRob2QoKSB7Ci0JCVN0cmluZyBzcGVjaWZpZWRTZXRNZXRob2QgPSB0aGlzLmdldFNwZWNpZmllZFNldE1ldGhvZCgpOwotCQlyZXR1cm4gKHNwZWNpZmllZFNldE1ldGhvZCAhPSBudWxsKSA/IHNwZWNpZmllZFNldE1ldGhvZCA6IHRoaXMuZ2V0RGVmYXVsdFNldE1ldGhvZCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNldE1ldGhvZCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0VUX01FVEhPRDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFNldE1ldGhvZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2V0TWV0aG9kOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTZXRNZXRob2QoU3RyaW5nIHNldE1ldGhvZCkgewotCQl0aGlzLnNldFNwZWNpZmllZFNldE1ldGhvZF8oc2V0TWV0aG9kKTsKLQkJdGhpcy5nZXRYbWxBY2Nlc3NNZXRob2RzKCkuc2V0U2V0TWV0aG9kKHNldE1ldGhvZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2V0TWV0aG9kXyhTdHJpbmcgc2V0TWV0aG9kKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFNldE1ldGhvZDsKLQkJdGhpcy5zcGVjaWZpZWRTZXRNZXRob2QgPSBzZXRNZXRob2Q7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0VUX01FVEhPRF9QUk9QRVJUWSwgb2xkLCBzZXRNZXRob2QpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRTZXRNZXRob2QoKSB7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgeG1sQWNjZXNzTWV0aG9kcyA9IGdldFhtbEFjY2Vzc01ldGhvZHMoKTsKLQkJcmV0dXJuIHhtbEFjY2Vzc01ldGhvZHMgIT0gbnVsbCA/IHhtbEFjY2Vzc01ldGhvZHMuZ2V0U2V0TWV0aG9kKCkgOiBudWxsOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldENhY2hlZEphdmFBdHRyaWJ1dGUoKSB7Ci0JCWlmICh0aGlzLmdldEFjY2VzcygpID09IEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMKSB7Ci0JCQkvL2lmIFZJUlRVQUwgd2Ugd2lsbCBhbHdheXMgaGF2ZSB0byBidWlsZCBhbmQgY2FjaGUgdGhlICdqYXZhQXR0cmlidXRlJwotCQkJLy93ZSBjbGVhciBvdXQgdGhlIGNhY2hlZCAnamF2YUF0dHJpYnV0ZSBpbiBzZXRTcGVjaWZpZWRBY2Nlc3NfKCkgYW5kIHNldERlZmF1bHRBY2Nlc3NfKCkKLQkJCWlmICh0aGlzLmNhY2hlZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlID09IG51bGwpIHsKLQkJCQl0aGlzLmNhY2hlZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gbmV3IFZpcnR1YWxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzLmdldFBhcmVudCgpLCB0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpcy5jYWNoZWRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2FjaGVkSmF2YUF0dHJpYnV0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxBdHRyaWJ1dGVNYXBwaW5nIGdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiAoWG1sQXR0cmlidXRlTWFwcGluZykgc3VwZXIuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRBdHRpYnV0ZVZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGVWYWxpZGF0b3IodGhpcywgYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1ByaXZhdGVPd25lZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtQcml2YXRlT3duZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1ZDk2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1ByaXZhdGVPd25lZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcml2YXRlT3duZWQ7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1ByaXZhdGVPd25lZAotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtQcml2YXRlT3duZWQKLXsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcml2YXRlT3duZWQ7Ci0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua1ByaXZhdGVPd25lZChPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnByaXZhdGVPd25lZCA9IHRoaXMuYnVpbGRQcml2YXRlT3duZWQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRQcml2YXRlT3duZWRfKHRoaXMuYnVpbGRQcml2YXRlT3duZWQoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgb3duZWQgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNQcml2YXRlT3duZWQoKSB7Ci0JCXJldHVybiB0aGlzLnByaXZhdGVPd25lZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcml2YXRlT3duZWQoYm9vbGVhbiBwcml2YXRlT3duZWQpIHsKLQkJdGhpcy5zZXRQcml2YXRlT3duZWRfKHByaXZhdGVPd25lZCk7Ci0JCXRoaXMuZ2V0WG1sUHJpdmF0ZU93bmVkKCkuc2V0UHJpdmF0ZU93bmVkKHByaXZhdGVPd25lZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJpdmF0ZU93bmVkXyhib29sZWFuIHByaXZhdGVPd25lZCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMucHJpdmF0ZU93bmVkOwotCQl0aGlzLnByaXZhdGVPd25lZCA9IHByaXZhdGVPd25lZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBSSVZBVEVfT1dORURfUFJPUEVSVFksIG9sZCwgcHJpdmF0ZU93bmVkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZFByaXZhdGVPd25lZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sUHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtQXR0cmlidXRlTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUF0dHJpYnV0ZU1hcHBpbmcgZ2V0QXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbEF0dHJpYnV0ZU1hcHBpbmcgZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sUHJpdmF0ZU93bmVkIGdldFhtbFByaXZhdGVPd25lZCgpIHsKLQkJcmV0dXJuIChYbWxQcml2YXRlT3duZWQpIHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2V0WG1sVmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFhtbFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbFByaXZhdGVPd25lZCgpLmdldFByaXZhdGVPd25lZFRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rUmVhZE9ubHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rUmVhZE9ubHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlY2M1ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1JlYWRPbmx5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVhZE9ubHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVhZE9ubHk7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1JlYWRPbmx5Ci0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1JlYWRPbmx5Ci17Ci0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkUmVhZE9ubHk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdFJlYWRPbmx5OwotCi0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtSZWFkT25seShPcm1FY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRSZWFkT25seSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRSZWFkT25seSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZFJlYWRPbmx5Xyh0aGlzLmJ1aWxkU3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0UmVhZE9ubHkodGhpcy5idWlsZERlZmF1bHRSZWFkT25seSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVhZC1vbmx5ICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRSZWFkT25seSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkUmVhZE9ubHkuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmRlZmF1bHRSZWFkT25seTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRSZWFkT25seSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUmVhZE9ubHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbiByZWFkT25seSkgewotCQl0aGlzLnNldFNwZWNpZmllZFJlYWRPbmx5XyhyZWFkT25seSk7Ci0JCXRoaXMuZ2V0WG1sUmVhZE9ubHkoKS5zZXRSZWFkT25seShyZWFkT25seSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUmVhZE9ubHlfKEJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZFJlYWRPbmx5OwotCQl0aGlzLnNwZWNpZmllZFJlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUkVBRF9PTkxZX1BST1BFUlRZLCBvbGQsIHJlYWRPbmx5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZFJlYWRPbmx5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRYbWxSZWFkT25seSgpLmdldFJlYWRPbmx5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0UmVhZE9ubHkoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRSZWFkT25seTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuZGVmYXVsdFJlYWRPbmx5OwotCQl0aGlzLmRlZmF1bHRSZWFkT25seSA9IHJlYWRPbmx5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9SRUFEX09OTFlfUFJPUEVSVFksIG9sZCwgcmVhZE9ubHkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVmYXVsdFJlYWRPbmx5KCkgewotCQlFY2xpcHNlTGlua1JlYWRPbmx5IGphdmFSZWFkT25seSA9IHRoaXMuZ2V0SmF2YVJlYWRPbmx5Rm9yRGVmYXVsdHMoKTsKLQkJcmV0dXJuIChqYXZhUmVhZE9ubHkgIT0gbnVsbCkgPyBqYXZhUmVhZE9ubHkuaXNSZWFkT25seSgpIDogREVGQVVMVF9SRUFEX09OTFk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1FY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sVHlwZU1hcHBpbmcgZ2V0WG1sVHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sUmVhZE9ubHkgZ2V0WG1sUmVhZE9ubHkoKSB7Ci0JCXJldHVybiAoWG1sUmVhZE9ubHkpIHRoaXMuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nIGdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rUmVhZE9ubHkgZ2V0SmF2YVJlYWRPbmx5Rm9yRGVmYXVsdHMoKSB7Ci0JCUphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZyBqYXZhVHlwZU1hcHBpbmcgPSB0aGlzLmdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci0JCXJldHVybiAoamF2YVR5cGVNYXBwaW5nID09IG51bGwpID8gbnVsbCA6IGphdmFUeXBlTWFwcGluZy5nZXRSZWFkT25seSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2V0WG1sVmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRYbWxWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRYbWxSZWFkT25seSgpLmdldFJlYWRPbmx5VGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYTliMGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcgotCWV4dGVuZHMgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDbGFzc0NvbnZlcnRlcjxYbWxTdHJ1Y3RDb252ZXJ0ZXI+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcgotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbFN0cnVjdENvbnZlcnRlciB4bWxDb252ZXJ0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxDb252ZXJ0ZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgY2xhc3MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRYbWxDb252ZXJ0ZXJDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMueG1sQ29udmVydGVyLmdldENvbnZlcnRlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFhtbENvbnZlcnRlckNsYXNzKFN0cmluZyBjb252ZXJ0ZXJDbGFzcykgewotCQl0aGlzLnhtbENvbnZlcnRlci5zZXRDb252ZXJ0ZXIoY29udmVydGVyQ2xhc3MpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBDbGFzczxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLmNsYXNzOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lRWRpdChJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLnhtbENvbnZlcnRlci5jcmVhdGVSZW5hbWVFZGl0KG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLnhtbENvbnZlcnRlci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChuZXdOYW1lKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWNsaXBzZUxpbmtDb252ZXJ0ZXJJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBFQ0xJUFNFTElOS19TVFJVQ1RfQ09OVkVSVEVSX0NMQVNTX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFY2xpcHNlTGlua0NvbnZlcnRlckludGVyZmFjZUVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlNUUlVDVF9DT05WRVJURVJfQ0xBU1NfSU1QTEVNRU5UU19TVFJVQ1RfQ09OVkVSVEVSOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0WG1sQ29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnhtbENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzc1RleHRSYW5nZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogbWV0YWRhdGEgY29udmVyc2lvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBjb252ZXJ0RnJvbShKYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgamF2YUNvbnZlcnRlcikgewotCQlzdXBlci5jb252ZXJ0RnJvbShqYXZhQ29udmVydGVyKTsKLQkJdGhpcy5zZXRDb252ZXJ0ZXJDbGFzcyhqYXZhQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOWJlMGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdHVyZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfMwotCWV4dGVuZHMgQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nPFhtbFN0cnVjdHVyZT4gCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1N0cnVjdHVyZU1hcHBpbmcyXzMKLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxTdHJ1Y3R1cmUgeG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhdHRyaWJ1dGUgdHlwZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkQXR0cmlidXRlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5nZXRBdHRyaWJ1dGVUeXBlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQXR0cmlidXRlVHlwZUluWG1sKFN0cmluZyBhdHRyaWJ1dGVUeXBlKSB7Ci0JCXRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5zZXRBdHRyaWJ1dGVUeXBlKGF0dHJpYnV0ZVR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5TVFJVQ1RVUkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiAxMDA7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgewotCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtQXR0cmlidXRlTWFwcGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRYbWxBdHRyaWJ1dGVNYXBwaW5nVG8ob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzIHhtbEF0dHJpYnV0ZXMpIHsKLQkJKChBdHRyaWJ1dGVzKSB4bWxBdHRyaWJ1dGVzKS5nZXRTdHJ1Y3R1cmVzKCkuYWRkKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sQXR0cmlidXRlTWFwcGluZ0Zyb20ob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzIHhtbEF0dHJpYnV0ZXMpIHsKLQkJKChBdHRyaWJ1dGVzKSB4bWxBdHRyaWJ1dGVzKS5nZXRTdHJ1Y3R1cmVzKCkucmVtb3ZlKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2MxOTM0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfM0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkVtZlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0dXJlOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zRGVmaW5pdGlvbgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1FY2xpcHNlTGlua1N0cnVjdHVyZU1hcHBpbmcyXzNEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgT3JtRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zRGVmaW5pdGlvbigpOwotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBPcm1FY2xpcHNlTGlua1N0cnVjdHVyZU1hcHBpbmcyXzNEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLlNUUlVDVFVSRV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAotCQkJCWZhY3RvcnksIAotCQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sU3RydWN0dXJlKCksIAotCQkJCVhtbFN0cnVjdHVyZS5jbGFzcyk7Ci0JfQotCi0JcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRDb250ZXh0TWFwcGluZygKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCAKLQkJCVhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nLCAKLQkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zKHBhcmVudCwgKFhtbFN0cnVjdHVyZSkgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJiODA0YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zZm9ybWF0aW9uOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzxYbWxUcmFuc2Zvcm1hdGlvbj4gCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZwotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sVHJhbnNmb3JtYXRpb24geG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhdHRyaWJ1dGUgdHlwZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkQXR0cmlidXRlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5nZXRBdHRyaWJ1dGVUeXBlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQXR0cmlidXRlVHlwZUluWG1sKFN0cmluZyBhdHRyaWJ1dGVUeXBlKSB7Ci0JCXRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5zZXRBdHRyaWJ1dGVUeXBlKGF0dHJpYnV0ZVR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5UUkFOU0ZPUk1BVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIDg1OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1BdHRyaWJ1dGVNYXBwaW5nKHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRYbWxBdHRyaWJ1dGVNYXBwaW5nVG8ob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzIHhtbEF0dHJpYnV0ZXMpIHsKLQkJKChBdHRyaWJ1dGVzKSB4bWxBdHRyaWJ1dGVzKS5nZXRUcmFuc2Zvcm1hdGlvbnMoKS5hZGQodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sQXR0cmlidXRlTWFwcGluZ0Zyb20ob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzIHhtbEF0dHJpYnV0ZXMpIHsKLQkJKChBdHRyaWJ1dGVzKSB4bWxBdHRyaWJ1dGVzKS5nZXRUcmFuc2Zvcm1hdGlvbnMoKS5yZW1vdmUodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWM5M2NkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuRW1mVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2Zvcm1hdGlvbjsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLlRSQU5TRk9STUFUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAotCQkJCWZhY3RvcnksIAotCQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVHJhbnNmb3JtYXRpb24oKSwgCi0JCQkJWG1sVHJhbnNmb3JtYXRpb24uY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZENvbnRleHRNYXBwaW5nKAotCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIAotCQkJWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcsIAotCQkJT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuICgoRWNsaXBzZUxpbmtPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkpIGZhY3RvcnkpLgotCQkJCWJ1aWxkT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcocGFyZW50LCAoWG1sVHJhbnNmb3JtYXRpb24pIHJlc291cmNlTWFwcGluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJlNzUzYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYU5hbWVkQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcgotCWV4dGVuZHMgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXI8WG1sVHlwZUNvbnZlcnRlcj4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcgotewotCXByaXZhdGUgU3RyaW5nIGRhdGFUeXBlOwotCXByaXZhdGUgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkRGF0YVR5cGU7Ci0KLQlwcml2YXRlIFN0cmluZyBvYmplY3RUeXBlOwotCXByaXZhdGUgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZTsKLQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbFR5cGVDb252ZXJ0ZXIgeG1sQ29udmVydGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sQ29udmVydGVyKTsKLQkJdGhpcy5kYXRhVHlwZSA9IHhtbENvbnZlcnRlci5nZXREYXRhVHlwZSgpOwotCQl0aGlzLm9iamVjdFR5cGUgPSB4bWxDb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldERhdGFUeXBlXyh0aGlzLnhtbENvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJdGhpcy5zZXRPYmplY3RUeXBlXyh0aGlzLnhtbENvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RnVsbHlRdWFsaWZpZWREYXRhVHlwZSh0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWREYXRhVHlwZSgpKTsKLQkJdGhpcy5zZXRGdWxseVF1YWxpZmllZE9iamVjdFR5cGUodGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGF0YSB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFUeXBlKFN0cmluZyBkYXRhVHlwZSkgewotCQl0aGlzLnNldERhdGFUeXBlXyhkYXRhVHlwZSk7Ci0JCXRoaXMueG1sQ29udmVydGVyLnNldERhdGFUeXBlKGRhdGFUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREYXRhVHlwZV8oU3RyaW5nIGRhdGFUeXBlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRhdGFUeXBlOwotCQl0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChEQVRBX1RZUEVfUFJPUEVSVFksIG9sZCwgZGF0YVR5cGUpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkRGF0YVR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RnVsbHlRdWFsaWZpZWREYXRhVHlwZShTdHJpbmcgZGF0YVR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZnVsbHlRdWFsaWZpZWREYXRhVHlwZTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZERhdGFUeXBlID0gZGF0YVR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfREFUQV9UWVBFX1BST1BFUlRZLCBvbGQsIGRhdGFUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWREYXRhVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZ0ZpbGVSb290KCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKHRoaXMuZGF0YVR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGRhdGFUeXBlSXNGb3IoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVJc0Zvcih0aGlzLmdldERhdGFUeXBlSmF2YVJlc291cmNlVHlwZSgpLCB0eXBlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGF0YVR5cGVJc0luKElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50KSB7Ci0JCXJldHVybiB0aGlzLnR5cGVJc0luKHRoaXMuZ2V0RGF0YVR5cGVKYXZhUmVzb3VyY2VUeXBlKCksIHBhY2thZ2VGcmFnbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBnZXREYXRhVHlwZUphdmFSZXNvdXJjZVR5cGUoKSB7Ci0JCWlmICh0aGlzLmZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUodGhpcy5mdWxseVF1YWxpZmllZERhdGFUeXBlKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG9iamVjdCB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlKFN0cmluZyBvYmplY3RUeXBlKSB7Ci0JCXRoaXMuc2V0T2JqZWN0VHlwZV8ob2JqZWN0VHlwZSk7Ci0JCXRoaXMueG1sQ29udmVydGVyLnNldE9iamVjdFR5cGUob2JqZWN0VHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T2JqZWN0VHlwZV8oU3RyaW5nIG9iamVjdFR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMub2JqZWN0VHlwZTsKLQkJdGhpcy5vYmplY3RUeXBlID0gb2JqZWN0VHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9UWVBFX1BST1BFUlRZLCBvbGQsIG9iamVjdFR5cGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5mdWxseVF1YWxpZmllZE9iamVjdFR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKFN0cmluZyBvYmplY3RUeXBlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZE9iamVjdFR5cGUgPSBvYmplY3RUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRlVMTFlfUVVBTElGSUVEX09CSkVDVF9UWVBFX1BST1BFUlRZLCBvbGQsIG9iamVjdFR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZE9iamVjdFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmdGaWxlUm9vdCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSh0aGlzLm9iamVjdFR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG9iamVjdFR5cGVJc0ZvcihTdHJpbmcgdHlwZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMudHlwZUlzRm9yKHRoaXMuZ2V0T2JqZWN0VHlwZUphdmFSZXNvdXJjZVR5cGUoKSwgdHlwZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG9iamVjdFR5cGVJc0luKElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50KSB7Ci0JCXJldHVybiB0aGlzLnR5cGVJc0luKHRoaXMuZ2V0T2JqZWN0VHlwZUphdmFSZXNvdXJjZVR5cGUoKSwgcGFja2FnZUZyYWdtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGdldE9iamVjdFR5cGVKYXZhUmVzb3VyY2VUeXBlKCkgewotCQlpZiAodGhpcy5mdWxseVF1YWxpZmllZE9iamVjdFR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUodGhpcy5mdWxseVF1YWxpZmllZE9iamVjdFR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCXRoaXMuY3JlYXRlUmVuYW1lRGF0YVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpLAotCQkJCXRoaXMuY3JlYXRlUmVuYW1lT2JqZWN0VHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVEYXRhVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YVR5cGVJc0ZvcihvcmlnaW5hbFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZURhdGFUeXBlRWRpdChvcmlnaW5hbFR5cGUsIG5ld05hbWUpKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lRGF0YVR5cGVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMueG1sQ29udmVydGVyLmNyZWF0ZVJlbmFtZURhdGFUeXBlRWRpdChvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lT2JqZWN0VHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VHlwZUlzRm9yKG9yaWdpbmFsVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKSkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lT2JqZWN0VHlwZUVkaXQob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZU9iamVjdFR5cGVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMueG1sQ29udmVydGVyLmNyZWF0ZVJlbmFtZU9iamVjdFR5cGVFZGl0KG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCXRoaXMuY3JlYXRlTW92ZURhdGFUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSwKLQkJCQl0aGlzLmNyZWF0ZU1vdmVPYmplY3RUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKQotCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVEYXRhVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFUeXBlSXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVEYXRhVHlwZVBhY2thZ2VFZGl0KG5ld1BhY2thZ2UuZ2V0RWxlbWVudE5hbWUoKSkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVEYXRhVHlwZVBhY2thZ2VFZGl0KFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLnhtbENvbnZlcnRlci5jcmVhdGVSZW5hbWVEYXRhVHlwZVBhY2thZ2VFZGl0KG5ld05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZU9iamVjdFR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gdGhpcy5vYmplY3RUeXBlSXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVPYmplY3RUeXBlUGFja2FnZUVkaXQobmV3UGFja2FnZS5nZXRFbGVtZW50TmFtZSgpKSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZU9iamVjdFR5cGVQYWNrYWdlRWRpdChTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy54bWxDb252ZXJ0ZXIuY3JlYXRlUmVuYW1lT2JqZWN0VHlwZVBhY2thZ2VFZGl0KG5ld05hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQl0aGlzLmNyZWF0ZVJlbmFtZURhdGFUeXBlUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5jcmVhdGVSZW5hbWVPYmplY3RUeXBlUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVEYXRhVHlwZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YVR5cGVJc0luKG9yaWdpbmFsUGFja2FnZSkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lRGF0YVR5cGVQYWNrYWdlRWRpdChuZXdOYW1lKSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVPYmplY3RUeXBlUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5vYmplY3RUeXBlSXNJbihvcmlnaW5hbFBhY2thZ2UpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZU9iamVjdFR5cGVQYWNrYWdlRWRpdChuZXdOYW1lKSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIENsYXNzPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5jbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0eXBlSXNGb3IoSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHR5cGUsIFN0cmluZyB0eXBlTmFtZSkgewotCQlyZXR1cm4gKHR5cGUgIT0gbnVsbCkgJiYgdHlwZS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHR5cGVOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0eXBlSXNJbihKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgdHlwZSwgSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQkJcmV0dXJuICh0eXBlICE9IG51bGwpICYmIHR5cGUuaXNJbihwYWNrYWdlRnJhZ21lbnQpOwotCX0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRXF1aXZhbGVudFRvKEpwYU5hbWVkQ29udGV4dE5vZGUgbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuaXNFcXVpdmFsZW50VG8obm9kZSkKLQkJCQkmJiB0aGlzLmlzRXF1aXZhbGVudFRvKChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpIG5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRXF1aXZhbGVudFRvKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMuZnVsbHlRdWFsaWZpZWREYXRhVHlwZSwgY29udmVydGVyLmdldEZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUoKSkgJiYKLQkJCQlUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLmZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSwgY29udmVydGVyLmdldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSgpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1ldGFkYXRhIGNvbnZlcnNpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgY29udmVydEZyb20oSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBqYXZhQ29udmVydGVyKSB7Ci0JCXN1cGVyLmNvbnZlcnRGcm9tKGphdmFDb252ZXJ0ZXIpOwotCQl0aGlzLnNldERhdGFUeXBlKGphdmFDb252ZXJ0ZXIuZ2V0RnVsbHlRdWFsaWZpZWREYXRhVHlwZSgpKTsKLQkJdGhpcy5zZXRPYmplY3RUeXBlKGphdmFDb252ZXJ0ZXIuZ2V0RnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU3MzUxYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nPFhtbFZhcmlhYmxlT25lVG9PbmU+IAotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZwotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxWYXJpYWJsZU9uZVRvT25lIHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVkFSSUFCTEVfT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIDY1OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1BdHRyaWJ1dGVNYXBwaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFhtbEF0dHJpYnV0ZU1hcHBpbmdUbyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMgeG1sQXR0cmlidXRlcykgewotCQkoKEF0dHJpYnV0ZXMpIHhtbEF0dHJpYnV0ZXMpLmdldFZhcmlhYmxlT25lVG9PbmVzKCkuYWRkKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbEF0dHJpYnV0ZU1hcHBpbmdGcm9tKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyB4bWxBdHRyaWJ1dGVzKSB7Ci0JCSgoQXR0cmlidXRlcykgeG1sQXR0cmlidXRlcykuZ2V0VmFyaWFibGVPbmVUb09uZXMoKS5yZW1vdmUodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA4ZWI3Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuRW1mVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5WQVJJQUJMRV9PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAotCQkJCWZhY3RvcnksIAotCQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVmFyaWFibGVPbmVUb09uZSgpLCAKLQkJCQlYbWxWYXJpYWJsZU9uZVRvT25lLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRDb250ZXh0TWFwcGluZygKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCAKLQkJCVhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nLCAKLQkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKEVjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5KSBmYWN0b3J5KS4KLQkJCQlidWlsZE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcocGFyZW50LCAoWG1sVmFyaWFibGVPbmVUb09uZSkgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDNjNmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011dGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1Db252ZXJ0aWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVZlcnNpb25NYXBwaW5nPFhtbFZlcnNpb24+Ci0JaW1wbGVtZW50cwotCQlFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nLAotCQlFY2xpcHNlTGlua09ybUNvbnZlcnRpYmxlTWFwcGluZywgCi0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyLk93bmVyCi17CQotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua011dGFibGUgbXV0YWJsZTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgY29udmVydGVyQ29udGFpbmVyOwotCQotCQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxWZXJzaW9uIHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQkJdGhpcy5tdXRhYmxlID0gbmV3IE9ybUVjbGlwc2VMaW5rTXV0YWJsZSh0aGlzKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMubXV0YWJsZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLm11dGFibGUudXBkYXRlKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhdHRyaWJ1dGUgdHlwZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkQXR0cmlidXRlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5nZXRBdHRyaWJ1dGVUeXBlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQXR0cmlidXRlVHlwZUluWG1sKFN0cmluZyBhdHRyaWJ1dGVUeXBlKSB7Ci0JCXRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5zZXRBdHRyaWJ1dGVUeXBlKGF0dHJpYnV0ZVR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtdXRhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua011dGFibGUgZ2V0TXV0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMubXV0YWJsZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlcnMgKioqKioqKioqKgotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGdldENvbnZlcnRlckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBidWlsZENvbnZlcnRlckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwodGhpcywgdGhpcywgdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE51bWJlclN1cHBvcnRlZENvbnZlcnRlcnMoKSB7Ci0JCXJldHVybiAxOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgYWRhcHRlcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogcHV0IHRoZSBFY2xpcHNlTGluayBjb252ZXJ0IGFkYXB0ZXIgZmlyc3QgLSB0aGlzIGlzIHRoZSBvcmRlciBFY2xpcHNlTGluayBzZWFyY2hlcwotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTxPcm1Db252ZXJ0ZXIuQWRhcHRlcj4gZ2V0Q29udmVydGVyQWRhcHRlcnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8T3JtQ29udmVydGVyLkFkYXB0ZXI+KE9ybUVjbGlwc2VMaW5rQ29udmVydC5BZGFwdGVyLmluc3RhbmNlKCksIHN1cGVyLmdldENvbnZlcnRlckFkYXB0ZXJzKCkpOwotCX0KLQotCi0JLy8qKioqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQlzdXBlci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSkKLQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQlzdXBlci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCXRoaXMuY29udmVydGVyQ29udGFpbmVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpCi0JCSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCXN1cGVyLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpLAotCQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkKLQkJKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQkvLyBUT0RPIG11dGFibGUgdmFsaWRhdGlvbgotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXR0cmlidXRlVHlwZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQkvL1RPRE8gY29waWVkIGZyb20gT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcKLQkJaWYgKHRoaXMuaXNWaXJ0dWFsQWNjZXNzKCkpIHsKLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZ2V0QXR0cmlidXRlVHlwZSgpKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9OT19BVFRSSUJVVEVfVFlQRV9TUEVDSUZJRUQsCi0JCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKLQkJCQkJCXRoaXMsCi0JCQkJCQl0aGlzLmdldEF0dHJpYnV0ZVR5cGVUZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkJKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoTWFwcGluZ1Rvb2xzLnR5cGVJc0Jhc2ljKHRoaXMuZ2V0SmF2YVByb2plY3QoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZEF0dHJpYnV0ZVR5cGUoKSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlJVHlwZSBqZHRUeXBlID0gSkRUVG9vbHMuZmluZFR5cGUodGhpcy5nZXRKYXZhUHJvamVjdCgpLCB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQXR0cmlidXRlVHlwZSgpKTsKLQkJCWlmIChqZHRUeXBlID09IG51bGwgJiYgdGhpcy5nZXRSZXNvbHZlZEF0dHJpYnV0ZVR5cGUoKSA9PSBudWxsKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0FUVFJJQlVURV9UWVBFX0RPRVNfTk9UX0VYSVNULAotCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQXR0cmlidXRlVHlwZSgpfSwKLQkJCQkJCXRoaXMsCi0JCQkJCQl0aGlzLmdldEF0dHJpYnV0ZVR5cGVUZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkJKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJaWYgKCFBcnJheVRvb2xzLmNvbnRhaW5zKFNVUFBPUlRFRF9UWVBFX05BTUVTLCB0aGlzLmdldEF0dHJpYnV0ZVR5cGUoKSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfVkVSU0lPTl9NQVBQSU5HX1RZUEUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCi0JCQkJCQkJdGhpcywKLQkJCQkJCQl0aGlzLmdldEF0dHJpYnV0ZVR5cGVUZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWaXJ0dWFsQWNjZXNzKCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpID09IEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMOwotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0QXR0cmlidXRlVHlwZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0QXR0cmlidXRlVHlwZVRleHRSYW5nZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmEwMzFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNsYXNzTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db2xsZWN0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkFjY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NZXRhbW9kZWxGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgVmlydHVhbEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wLCBKYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlCi17Ci0JcHJpdmF0ZSBmaW5hbCBYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nOwotCi0JcHJpdmF0ZSBKcGFDb250YWluZXJEZWZpbml0aW9uIGpwYUNvbnRhaW5lckRlZmluaXRpb24gPSBKcGFDb250YWluZXJEZWZpbml0aW9uLk51bGwuaW5zdGFuY2UoKTsKLQotCXB1YmxpYyBWaXJ0dWFsSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbEF0dHJpYnV0ZU1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nID0geG1sQXR0cmlidXRlTWFwcGluZzsKLQkJdGhpcy5hdHRyaWJ1dGVNYXBwaW5nID0gbmV3IEdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVKcGFDb250YWluZXJEZWZpbml0aW9uKCk7Ci0JfQotCi0JcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMueG1sQXR0cmlidXRlTWFwcGluZzsKLQl9Ci0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlTWFwcGluZzsKLQl9Ci0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgc2V0TWFwcGluZ0tleShTdHJpbmcga2V5KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCBhbnl0aGluZyBvbiBhIHZpcnR1YWwgamF2YSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEFjY2Vzc29yIGdldEFjY2Vzc29yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlQXR0cmlidXRlIGdldFJlc291cmNlQXR0cmlidXRlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VHZXR0ZXIsIEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZVNldHRlcikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IG9mZnNldCwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJU3RyaW5nIHR5cGVOYW1lID0gdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmdldEF0dHJpYnV0ZVR5cGUoKTsKLQkJcmV0dXJuIHR5cGVOYW1lID09IG51bGwgPyBudWxsIDogdGhpcy5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSh0eXBlTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdHlwZUlzQmFzaWMoKSB7Ci0JCXJldHVybiBmYWxzZTsvL25vdCB2YWxpZCBmb3IgYSBkZWZhdWx0IGJhc2ljIG1hcHBpbmcsIHNwZWNpZmllZCBpbiBvcm0ueG1sCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTaW5nbGVSZWZlcmVuY2VUYXJnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7IC8vdXNlZCBmb3IgYnVpbGRpbmcgZGVmYXVsdCB0YXJnZXQgZW50aXR5L2VtYmVkZGFibGUsIG11c3QgYmUgc3BlY2lmaWVkIGluIGEgdmlydHVhbCBtYXBwaW5nCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNdWx0aVJlZmVyZW5jZVRhcmdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gbnVsbDsgLy91c2VkIGZvciBidWlsZGluZyBkZWZhdWx0IHRhcmdldCBlbnRpdHkvdGFyZ2V0IGNsYXNzLCBtdXN0IGJlIHNwZWNpZmllZCBpbiBhIHZpcnR1YWwgbWFwcGluZwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TXVsdGlSZWZlcmVuY2VNYXBLZXlUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7IC8vdXNlZCBmb3IgYnVpbGRpbmcgZGVmYXVsdCBtYXAga2V5IGNsYXNzLCBtdXN0IGJlIHNwZWNpZmllZCBpbiBhIHZpcnR1YWwgbWFwcGluZwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiT3dpbmcgb3JtIHBlcnNpc3RlbnQgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZC4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEpwYVN0cnVjdHVyZU5vZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0KLQlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCB0ZXh0T2Zmc2V0KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gcmVzb3VyY2UgZm9yIGEgdmlydHVhbCBqYXZhIHBlcnNpc3RlbnQgYXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGVyZSBpcyBubyByZXNvdXJjZSBmb3IgYSB2aXJ0dWFsIGphdmEgcGVyc2lzdGVudCBhdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBDb250ZXh0VHlwZSBnZXRDb250ZXh0VHlwZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGVyZSBpcyBubyByZXNvdXJjZSBmb3IgYSB2aXJ0dWFsIGphdmEgcGVyc2lzdGVudCBhdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4gZ2V0VHlwZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGVyZSBpcyBubyByZXNvdXJjZSBmb3IgYSB2aXJ0dWFsIGphdmEgcGVyc2lzdGVudCBhdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gcmVzb3VyY2UgZm9yIGEgdmlydHVhbCBqYXZhIHBlcnNpc3RlbnQgYXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldFNwZWNpZmllZEFjY2VzcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUgbmV3U3BlY2lmaWVkQWNjZXNzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCBhbnl0aGluZyBvbiBhIHZpcnR1YWwgamF2YSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdEFjY2VzcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gdHlwZUlzRGF0ZU9yQ2FsZW5kYXIoKSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IHRoaXMuZ2V0VHlwZU5hbWUoKTsKLQkJaWYgKHR5cGVOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gSkRUVG9vbHMudHlwZUlzU3ViVHlwZSh0aGlzLmdldEphdmFQcm9qZWN0KCksIHR5cGVOYW1lLCBEQVRFX1RZUEVfTkFNRSkKLQkJCXx8IEpEVFRvb2xzLnR5cGVJc1N1YlR5cGUodGhpcy5nZXRKYXZhUHJvamVjdCgpLCB0eXBlTmFtZSwgQ0FMRU5EQVJfVFlQRV9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0eXBlSXNTZXJpYWxpemFibGUoKSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IHRoaXMuZ2V0VHlwZU5hbWUoKTsKLQkJaWYgKHR5cGVOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gSkRUVG9vbHMudHlwZUlzU3ViVHlwZSh0aGlzLmdldEphdmFQcm9qZWN0KCksIHR5cGVOYW1lLCBKRFRUb29scy5TRVJJQUxJWkFCTEVfQ0xBU1NfTkFNRSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdHlwZUlzVmFsaWRGb3JWYXJpYWJsZU9uZVRvT25lKCkgewotCQlTdHJpbmcgdHlwZU5hbWUgPSB0aGlzLmdldFR5cGVOYW1lKCk7Ci0JCWlmICh0eXBlTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJSVR5cGUgdHlwZSA9IEpEVFRvb2xzLmZpbmRUeXBlKGdldEphdmFQcm9qZWN0KCksIHR5cGVOYW1lKTsKLQkJdHJ5IHsKLQkJCXJldHVybiB0eXBlICE9IG51bGwgJiYKLQkJCQkJdHlwZS5pc0ludGVyZmFjZSgpICYmCi0JCQkJCXRoaXMuaW50ZXJmYWNlSXNWYWxpZEZvclZhcmlhYmxlT25lVG9PbmUoKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbnRlcmZhY2VJc1ZhbGlkRm9yVmFyaWFibGVPbmVUb09uZSgpIHsKLQkJcmV0dXJuICEgdGhpcy5pbnRlcmZhY2VJc0ludmFsaWRGb3JWYXJpYWJsZU9uZVRvT25lKCk7Ci0JfQotCi0JLy8gVE9ETyB3ZSBjb3VsZCBwcm9iYWJseSBhZGQgbW9yZSBpbnRlcmZhY2VzIHRvIHRoaXMgbGlzdC4uLgotCXByb3RlY3RlZCBib29sZWFuIGludGVyZmFjZUlzSW52YWxpZEZvclZhcmlhYmxlT25lVG9PbmUoKSB7Ci0JCVN0cmluZyBpbnRlcmZhY2VOYW1lID0gdGhpcy5nZXRUeXBlTmFtZSgpOwotCQlyZXR1cm4gKGludGVyZmFjZU5hbWUgPT0gbnVsbCkgfHwKLQkJCQl0aGlzLnR5cGVJc0NvbnRhaW5lcigpIHx8Ci0JCQkJaW50ZXJmYWNlTmFtZS5lcXVhbHMoIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmluZGlyZWN0aW9uLlZhbHVlSG9sZGVySW50ZXJmYWNlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgb25lIG9mIHRoZSBjb250YWluZXIKLQkgKiB0eXBlcyBhbGxvd2VkIGJ5IHRoZSBKUEEgc3BlYwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHR5cGVJc0NvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhQ29udGFpbmVyRGVmaW5pdGlvbigpLmlzQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1ldGFtb2RlbCAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkVHlwZU5hbWUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigicGFyZW50IE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW1wbGVtZW50cyB0aGlzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkTWFwS2V5VHlwZU5hbWUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigicGFyZW50IE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW1wbGVtZW50cyB0aGlzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0YW1vZGVsVHlwZU5hbWUoKSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IHRoaXMuZ2V0VHlwZU5hbWUoKTsKLQkJaWYgKHR5cGVOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhbW9kZWxGaWVsZC5ERUZBVUxUX1RZUEVfTkFNRTsKLQkJfQotCQlpZiAoQ2xhc3NOYW1lLmlzUHJpbWl0aXZlKHR5cGVOYW1lKSkgewotCQkJcmV0dXJuIENsYXNzTmFtZS5nZXRXcmFwcGVyQ2xhc3NOYW1lKHR5cGVOYW1lKTsgIC8vID8/PwotCQl9Ci0JCXJldHVybiB0eXBlTmFtZTsKLQl9Ci0JcHVibGljIEpwYUNvbnRhaW5lckRlZmluaXRpb24gZ2V0SnBhQ29udGFpbmVyRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuanBhQ29udGFpbmVyRGVmaW5pdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVKcGFDb250YWluZXJEZWZpbml0aW9uKCkgewotCQl0aGlzLnNldEpwYUNvbnRhaW5lckRlZmluaXRpb24odGhpcy5idWlsZEpwYUNvbnRhaW5lckRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SnBhQ29udGFpbmVyRGVmaW5pdGlvbihKcGFDb250YWluZXJEZWZpbml0aW9uIGpwYUNvbnRhaW5lckRlZmluaXRpb24pIHsKLQkJSnBhQ29udGFpbmVyRGVmaW5pdGlvbiBvbGQgPSB0aGlzLmpwYUNvbnRhaW5lckRlZmluaXRpb247Ci0JCXRoaXMuanBhQ29udGFpbmVyRGVmaW5pdGlvbiA9IGpwYUNvbnRhaW5lckRlZmluaXRpb247Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSlBBX0NPTlRBSU5FUl9ERUZJTklUSU9OLCBvbGQsIHRoaXMuanBhQ29udGFpbmVyRGVmaW5pdGlvbik7Ci0JfQotCi0JLy9JIGRvbid0IHRoaW5rIHdlIHNob3VsZCBiZSBkb2luZyB0aGlzIGhlcmUsIEkgdGhpbmsgT3JtQXR0cmlidXRlTWFwcGluZ3Mgc2hvdWxkIGJlIHJlc3BvbnNpYmxlIGZvciB0aGVpciBvd24gSnBhQ29udGFpbmVyRGVmaW5pdGlvbgotCS8vR2VuZXJpYyBjYW4ganVzdCBnZXQgaXQgZnJvbSB0aGUgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUKLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpQQSBjb250YWluZXIgZGVmaW5pdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgdHlwZTsKLQkgKiByZXR1cm4gYSAibnVsbCIgZGVmaW5pdGlvbiBpZiB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgbm90ICJhc3NpZ25hYmxlIHRvIiBvbmUgb2YgdGhlCi0JICogY29udGFpbmVyIHR5cGVzIGFsbG93ZWQgYnkgdGhlIEpQQSBzcGVjLgotCSAqLwotCXByb3RlY3RlZCBKcGFDb250YWluZXJEZWZpbml0aW9uIGJ1aWxkSnBhQ29udGFpbmVyRGVmaW5pdGlvbigpIHsKLQkJU3RyaW5nIHR5cGVOYW1lID0gdGhpcy5nZXRUeXBlTmFtZSgpOwotCQlpZiAodHlwZU5hbWUgIT0gbnVsbCkgewotCQkJLy9wZXJmb3JtYW5jZSAtIGxvb3AgYW5kIGNoZWNrIGZvciAuZXF1YWxzKCkgZmlyc3QKLQkJCWZvciAoSnBhQ29udGFpbmVyRGVmaW5pdGlvbiBkZWZpbml0aW9uIDogdGhpcy5nZXRKcGFDb250YWluZXJEZWZpbml0aW9ucygpKSB7Ci0JCQkJaWYgKGRlZmluaXRpb24uZ2V0VHlwZU5hbWUoKS5lcXVhbHModHlwZU5hbWUpKSB7Ci0JCQkJCXJldHVybiBkZWZpbml0aW9uOwotCQkJCX0KLQkJCX0KLQkJCWZvciAoSnBhQ29udGFpbmVyRGVmaW5pdGlvbiBkZWZpbml0aW9uIDogdGhpcy5nZXRKcGFDb250YWluZXJEZWZpbml0aW9ucygpKSB7Ci0JCQkJaWYgKEpEVFRvb2xzLnR5cGVJc1N1YlR5cGUodGhpcy5nZXRKYXZhUHJvamVjdCgpLCB0eXBlTmFtZSwgZGVmaW5pdGlvbi5nZXRUeXBlTmFtZSgpKSkgewotCQkJCQlyZXR1cm4gZGVmaW5pdGlvbjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEpwYUNvbnRhaW5lckRlZmluaXRpb24uTnVsbC5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxKcGFDb250YWluZXJEZWZpbml0aW9uPiBnZXRKcGFDb250YWluZXJEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIEpQQV9DT05UQUlORVJfREVGSU5JVElPTlM7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKcGFDb250YWluZXJEZWZpbml0aW9uW10gSlBBX0NPTlRBSU5FUl9ERUZJTklUSU9OX0FSUkFZID0gbmV3IEpwYUNvbnRhaW5lckRlZmluaXRpb25bXSB7Ci0JCW5ldyBDb2xsZWN0aW9uSnBhQ29udGFpbmVyRGVmaW5pdGlvbihqYXZhLnV0aWwuU2V0LmNsYXNzLCBKUEEyXzAuU0VUX0FUVFJJQlVURSksCi0JCW5ldyBDb2xsZWN0aW9uSnBhQ29udGFpbmVyRGVmaW5pdGlvbihqYXZhLnV0aWwuTGlzdC5jbGFzcywgSlBBMl8wLkxJU1RfQVRUUklCVVRFKSwKLQkJbmV3IENvbGxlY3Rpb25KcGFDb250YWluZXJEZWZpbml0aW9uKGphdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzLCBKUEEyXzAuQ09MTEVDVElPTl9BVFRSSUJVVEUpLAotCQluZXcgTWFwSnBhQ29udGFpbmVyRGVmaW5pdGlvbihqYXZhLnV0aWwuTWFwLmNsYXNzLCBKUEEyXzAuTUFQX0FUVFJJQlVURSkKLQl9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxKcGFDb250YWluZXJEZWZpbml0aW9uPiBKUEFfQ09OVEFJTkVSX0RFRklOSVRJT05TID0gbmV3IEFycmF5SXRlcmFibGU8SnBhQ29udGFpbmVyRGVmaW5pdGlvbj4oSlBBX0NPTlRBSU5FUl9ERUZJTklUSU9OX0FSUkFZKTsKLQotCi0JLyoqCi0JICogQWJzdHJhY3QgSlBBIGNvbnRhaW5lciBkZWZpbml0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBBYnN0cmFjdEpwYUNvbnRhaW5lckRlZmluaXRpb24KLQkJaW1wbGVtZW50cyBKcGFDb250YWluZXJEZWZpbml0aW9uCi0JewotCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHR5cGVOYW1lOwotCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIG1ldGFtb2RlbENvbnRhaW5lckZpZWxkVHlwZU5hbWU7Ci0KLQkJcHJvdGVjdGVkIEFic3RyYWN0SnBhQ29udGFpbmVyRGVmaW5pdGlvbihDbGFzczw/PiBjb250YWluZXJDbGFzcywgU3RyaW5nIG1ldGFtb2RlbENvbnRhaW5lckZpZWxkVHlwZU5hbWUpIHsKLQkJCXRoaXMoY29udGFpbmVyQ2xhc3MuZ2V0TmFtZSgpLCBtZXRhbW9kZWxDb250YWluZXJGaWVsZFR5cGVOYW1lKTsKLQkJfQotCi0JCXByb3RlY3RlZCBBYnN0cmFjdEpwYUNvbnRhaW5lckRlZmluaXRpb24oU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgbWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCWlmICgodHlwZU5hbWUgPT0gbnVsbCkgfHwgKG1ldGFtb2RlbENvbnRhaW5lckZpZWxkVHlwZU5hbWUgPT0gbnVsbCkpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKLQkJCXRoaXMubWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZSA9IG1ldGFtb2RlbENvbnRhaW5lckZpZWxkVHlwZU5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMudHlwZU5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lcigpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxDb250YWluZXJGaWVsZFR5cGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TXVsdGlSZWZlcmVuY2VUYXJnZXRUeXBlTmFtZShKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRNdWx0aVJlZmVyZW5jZU1hcEtleVR5cGVOYW1lKEphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb2xsZWN0aW9uIEpQQSBjb250YWluZXIgZGVmaW5pdGlvbgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQ29sbGVjdGlvbkpwYUNvbnRhaW5lckRlZmluaXRpb24KLQkJZXh0ZW5kcyBBYnN0cmFjdEpwYUNvbnRhaW5lckRlZmluaXRpb24KLQl7Ci0JCXByb3RlY3RlZCBDb2xsZWN0aW9uSnBhQ29udGFpbmVyRGVmaW5pdGlvbihDbGFzczw/PiBjb2xsZWN0aW9uQ2xhc3MsIFN0cmluZyBzdGF0aWNNZXRhbW9kZWxUeXBlRGVjbGFyYXRpb25UeXBlTmFtZSkgewotCQkJc3VwZXIoY29sbGVjdGlvbkNsYXNzLCBzdGF0aWNNZXRhbW9kZWxUeXBlRGVjbGFyYXRpb25UeXBlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkTWFwS2V5VHlwZU5hbWUoQ29sbGVjdGlvbk1hcHBpbmcgbWFwcGluZykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc01hcCgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1hcCBKUEEgY29udGFpbmVyIGRlZmluaXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE1hcEpwYUNvbnRhaW5lckRlZmluaXRpb24KLQkJZXh0ZW5kcyBBYnN0cmFjdEpwYUNvbnRhaW5lckRlZmluaXRpb24KLQl7Ci0JCXByb3RlY3RlZCBNYXBKcGFDb250YWluZXJEZWZpbml0aW9uKENsYXNzPD8+IG1hcENsYXNzLCBTdHJpbmcgc3RhdGljTWV0YW1vZGVsVHlwZURlY2xhcmF0aW9uVHlwZU5hbWUpIHsKLQkJCXN1cGVyKG1hcENsYXNzLCBzdGF0aWNNZXRhbW9kZWxUeXBlRGVjbGFyYXRpb25UeXBlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkTWFwS2V5VHlwZU5hbWUoQ29sbGVjdGlvbk1hcHBpbmcgbWFwcGluZykgewotCQkJcmV0dXJuIG1hcHBpbmcuZ2V0TWV0YW1vZGVsRmllbGRNYXBLZXlUeXBlTmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNNYXAoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtUGVyc2lzdGVudFR5cGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBnZXRPd25pbmdQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIFR5cGVNYXBwaW5nIGdldE93bmluZ1R5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPd25pbmdQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW50aXR5TWFwcGluZ3MgZ2V0RW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoRW50aXR5TWFwcGluZ3MpIGdldFBhcmVudCgpLmdldE1hcHBpbmdGaWxlUm9vdCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiT3dpbmcgb3JtIHBlcnNpc3RlbnQgYXR0cmlidXRlIHNob3VsZCBoYW5kbGUsIHRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEphdmFQZXJzaXN0ZW50VHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEphdmFQZXJzaXN0ZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjVmYTg0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxKYXZhUGVyc2lzdGVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuQm9keVNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5DaGFpbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFOdWxsVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NZXRhbW9kZWxTb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgVmlydHVhbEphdmFQZXJzaXN0ZW50VHlwZQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFQZXJzaXN0ZW50VHlwZTJfMAotewotCi0JcHJpdmF0ZSBmaW5hbCBYbWxUeXBlTWFwcGluZyB4bWxUeXBlTWFwcGluZzsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhVHlwZU1hcHBpbmcgbWFwcGluZzsKLQlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgc3VwZXJQZXJzaXN0ZW50VHlwZTsKLQotCXB1YmxpYyBWaXJ0dWFsSmF2YVBlcnNpc3RlbnRUeXBlKEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBYbWxUeXBlTWFwcGluZyB4bWxUeXBlTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnhtbFR5cGVNYXBwaW5nID0geG1sVHlwZU1hcHBpbmc7Ci0JCXRoaXMubWFwcGluZyA9IG5ldyBKYXZhTnVsbFR5cGVNYXBwaW5nKHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBnZXRFbnRpdHlNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzKSBnZXRQYXJlbnQoKS5nZXRNYXBwaW5nRmlsZVJvb3QoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRTdXBlclBlcnNpc3RlbnRUeXBlKHRoaXMuYnVpbGRTdXBlclBlcnNpc3RlbnRUeXBlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCS8vVGhlIHBhcmVudCBPcm1QZXJzaXN0ZW50VHlwZSBidWlsZHMgaXRzIG5hbWUgZnJvbSB0aGUgc3BlY2lmaWVkIGNsYXNzIGFuZCBwYWNrYWdlLgotCS8vSW4gU3BlY2lmaWVkT3JtUGVyc2lzdGVudFR5cGUudXBkYXRlSmF2YVBlcnNpc3RlbnRUeXBlKCksIGl0IGNvbXBhcmVzIHRoZSBuYW1lcyBhbmQgCi0JLy9yZWJ1aWxkcyBpZiB0aGUgbmFtZSBoYXMgY2hhbmdlZC4gV2UgZG9uJ3QgbmVlZCB0byByZWJ1aWxkIHRoZSB2aXJ0dWFsIGphdmEgcGVyc2lzdGVudCAKLQkvL3R5cGUgYmFzZWQgb24gYSBuYW1lIGNoYW5nZSwgaXQgd2lsbCBnZXQgcmVidWlsdCBpZiB0aGUgZHluYW1pYyBzdGF0ZSBjaGFuZ2VzLgotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3MgKioqKioqKioqKgotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0U3BlY2lmaWVkQWNjZXNzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZSBuZXdTcGVjaWZpZWRBY2Nlc3MpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdEFjY2VzcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwcGluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YVR5cGVNYXBwaW5nIGdldE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwaW5nLmdldEtleSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1hcHBpbmdLZXkoU3RyaW5nIGtleSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01hcHBlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdXBlciBwZXJzaXN0ZW50IHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIFBlcnNpc3RlbnRUeXBlIGdldFN1cGVyUGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnN1cGVyUGVyc2lzdGVudFR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3VwZXJQZXJzaXN0ZW50VHlwZShQZXJzaXN0ZW50VHlwZSBzdXBlclBlcnNpc3RlbnRUeXBlKSB7Ci0JCVBlcnNpc3RlbnRUeXBlIG9sZCA9IHRoaXMuc3VwZXJQZXJzaXN0ZW50VHlwZTsKLQkJdGhpcy5zdXBlclBlcnNpc3RlbnRUeXBlID0gc3VwZXJQZXJzaXN0ZW50VHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNVUEVSX1BFUlNJU1RFTlRfVFlQRV9QUk9QRVJUWSwgb2xkLCBzdXBlclBlcnNpc3RlbnRUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgYnVpbGRTdXBlclBlcnNpc3RlbnRUeXBlKCkgewotCQlIYXNoU2V0PEphdmFSZXNvdXJjZVR5cGU+IHZpc2l0ZWQgPSBuZXcgSGFzaFNldDxKYXZhUmVzb3VyY2VUeXBlPigpOwotCQlQZXJzaXN0ZW50VHlwZSBzcHQgPSB0aGlzLnJlc29sdmVTdXBlclBlcnNpc3RlbnRUeXBlKHRoaXMueG1sVHlwZU1hcHBpbmcuZ2V0UGFyZW50Q2xhc3MoKSwgdmlzaXRlZCk7Ci0JCWlmIChzcHQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhzcHQuZ2V0SW5oZXJpdGFuY2VIaWVyYXJjaHkoKSwgdGhpcykpIHsKLQkJCXJldHVybiBudWxsOyAgLy8gc2hvcnQtY2lyY3VpdCBpbiB0aGlzIGNhc2UsIHdlIGhhdmUgY2lyY3VsYXIgaW5oZXJpdGFuY2UKLQkJfQotCQlyZXR1cm4gc3B0LmlzTWFwcGVkKCkgPyBzcHQgOiBzcHQuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBKUEEgc3BlYyBhbGxvd3Mgbm9uLXBlcnNpc3RlbnQgdHlwZXMgaW4gYSBwZXJzaXN0ZW50IHR5cGUncwotCSAqIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gV2UgY2hlY2sgZm9yIGEgcGVyc2lzdGVudCB0eXBlIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIG5hbWUgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQgKFVzZSB0aGUgRW50aXR5TWFwcGluZwotCSAqIEFQSSBmb3IgdGhpcyBiZWNhdXNlIGl0IHdpbGwgYXBwZW5kIHRoZSBwYWNrYWdlIG5hbWUgaWYgdW5xdWFsaWZpZWQpLgotCSAqIElmIGl0IGlzIG5vdCBmb3VuZCB3ZSB1c2UgamF2YSByZXNvdXJjZSB0eXBlIGFuZCBsb29rIGZvciA8ZW0+aXRzPC9lbT4gc3VwZXIgdHlwZS4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+dmlzaXRlZDwvY29kZT4gY29sbGVjdGlvbiBpcyB1c2VkIHRvIGRldGVjdCBhIGN5Y2xlIGluIHRoZQotCSAqIDxlbT5yZXNvdXJjZTwvZW0+IHR5cGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5IGFuZCBwcmV2ZW50IHRoZSByZXN1bHRpbmcKLQkgKiBzdGFjayBvdmVyZmxvdy4gQW55IGN5Y2xlcyBpbiB0aGUgPGVtPmNvbnRleHQ8L2VtPiB0eXBlIGluaGVyaXRhbmNlCi0JICogaGllcmFyY2h5IGFyZSBoYW5kbGVkIGluIHtAbGluayAjYnVpbGRTdXBlclBlcnNpc3RlbnRUeXBlKCl9LgotCSAqLwotCXByb3RlY3RlZCBQZXJzaXN0ZW50VHlwZSByZXNvbHZlU3VwZXJQZXJzaXN0ZW50VHlwZShTdHJpbmcgdHlwZU5hbWUsIENvbGxlY3Rpb248SmF2YVJlc291cmNlVHlwZT4gdmlzaXRlZCkgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0eXBlTmFtZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVBlcnNpc3RlbnRUeXBlIHNwdCA9IHRoaXMucmVzb2x2ZVBlcnNpc3RlbnRUeXBlKHR5cGVOYW1lKTsKLQkJaWYgKHNwdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc3B0OwotCQl9Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gdGhpcy5yZXNvbHZlSmF2YVJlc291cmNlVHlwZSh0eXBlTmFtZSk7Ci0JCXZpc2l0ZWQuYWRkKHJlc291cmNlVHlwZSk7Ci0JCXJldHVybiAocmVzb3VyY2VUeXBlID09IG51bGwpID8gbnVsbCA6IHRoaXMucmVzb2x2ZVN1cGVyUGVyc2lzdGVudFR5cGUocmVzb3VyY2VUeXBlLmdldFN1cGVyY2xhc3NRdWFsaWZpZWROYW1lKCksIHZpc2l0ZWQpOyAgLy8gcmVjdXJzZQotCX0KLQotCXByb3RlY3RlZCBQZXJzaXN0ZW50VHlwZSByZXNvbHZlUGVyc2lzdGVudFR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLnJlc29sdmVQZXJzaXN0ZW50VHlwZSh0eXBlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVR5cGUgcmVzb2x2ZUphdmFSZXNvdXJjZVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiAoSmF2YVJlc291cmNlVHlwZSkgdGhpcy5nZXRFbnRpdHlNYXBwaW5ncygpLnJlc29sdmVKYXZhUmVzb3VyY2VUeXBlKHR5cGVOYW1lLCBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQuVFlQRSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGF0dHJpYnV0ZXMgKioqKioqKioqKgotCS8vVGhlIFZpcnR1YWxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZXMgYXJlIGJ1aWx0IGJ5IHRoZSBPcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUsIG5vIGF0dHJpYnV0ZXMgaGVyZQotCQotCXB1YmxpYyBMaXN0SXRlcmFibGU8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVOYW1lZChTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlBbm5vdGF0ZWRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgamF2YVJlc291cmNlQXR0cmlidXRlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlc1NpemUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldEFsbEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsQXR0cmlidXRlTmFtZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvbHZlQXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmhlcml0YW5jZSAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8UGVyc2lzdGVudFR5cGU+IGdldEluaGVyaXRhbmNlSGllcmFyY2h5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRJbmhlcml0YW5jZUhpZXJhcmNoeU9mKHRoaXMpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxQZXJzaXN0ZW50VHlwZT4gZ2V0QW5jZXN0b3JzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRJbmhlcml0YW5jZUhpZXJhcmNoeU9mKHRoaXMuc3VwZXJQZXJzaXN0ZW50VHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFBlcnNpc3RlbnRUeXBlPiBnZXRJbmhlcml0YW5jZUhpZXJhcmNoeU9mKFBlcnNpc3RlbnRUeXBlIHN0YXJ0KSB7Ci0JCS8vIHVzaW5nIGEgY2hhaW4gaXRlcmFibGUgdG8gdHJhdmVyc2UgdXAgdGhlIGluaGVyaXRhbmNlIHRyZWUKLQkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhYmxlPFBlcnNpc3RlbnRUeXBlPihzdGFydCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgbmV4dExpbmsoUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUpIHsKLQkJCQlyZXR1cm4gcGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKcGFTdHJ1Y3R1cmVOb2RlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBDb250ZXh0VHlwZSBnZXRDb250ZXh0VHlwZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGVyZSBpcyBubyByZXNvdXJjZSBmb3IgYSB2aXJ0dWFsIGphdmEgcGVyc2lzdGVudCB0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IGdldFR5cGUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gcmVzb3VyY2UgZm9yIGEgdmlydHVhbCBqYXZhIHBlcnNpc3RlbnQgdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEpwYVN0cnVjdHVyZU5vZGUgZ2V0U3RydWN0dXJlTm9kZShpbnQgdGV4dE9mZnNldCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZXJlIGlzIG5vIHJlc291cmNlIGZvciBhIHZpcnR1YWwgamF2YSBwZXJzaXN0ZW50IHR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZXJlIGlzIG5vIHJlc291cmNlIGZvciBhIHZpcnR1YWwgamF2YSBwZXJzaXN0ZW50IHR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIEphdmFSZXNvdXJjZVR5cGUgZ2V0SmF2YVJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0T3duZXJPdmVycmlkZUFjY2VzcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0T3duZXJEZWZhdWx0QWNjZXNzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihTdHJpbmcgdHlwZU5hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbihJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgUGVyc2lzdGVudFR5cGUgZ2V0T3ZlcnJpZGRlblBlcnNpc3RlbnRUeXBlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlY2xhcmluZ1R5cGVOYW1lKCkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gdGhpcy54bWxUeXBlTWFwcGluZy5nZXRDbGFzc05hbWUoKTsKLQkJaW50IGluZGV4ID0gY2xhc3NOYW1lID09IG51bGwgPyAtMSA6IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignJCcpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGluZGV4KS5yZXBsYWNlKCckJywgJy4nKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWQoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRNZXRhbW9kZWxGaWxlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZU1ldGFtb2RlbChNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPE1ldGFtb2RlbFNvdXJjZVR5cGU+PiBtZW1iZXJUeXBlVHJlZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludEJvZHlTb3VyY2VPbihCb2R5U291cmNlV3JpdGVyIHB3LCBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPE1ldGFtb2RlbFNvdXJjZVR5cGU+PiBtZW1iZXJUeXBlVHJlZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9ub3RoaW5nIHRvIGRpc3Bvc2UKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDdjMzU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkphckZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuSnBhT3B0aW9uczJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmFyRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkgCi0JZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5Ci17Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdCBidWlsZFBlcnNpc3RlbmNlVW5pdChQZXJzaXN0ZW5jZSBwYXJlbnQsIFhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdChwYXJlbnQsIHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXJGaWxlUmVmIGJ1aWxkSmFyRmlsZVJlZihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50LCBYbWxKYXJGaWxlUmVmIHhtbEphckZpbGVSZWYpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0phckZpbGVSZWYocGFyZW50LCB4bWxKYXJGaWxlUmVmKTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbm5lY3Rpb24yXzAgYnVpbGRDb25uZWN0aW9uKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0Nvbm5lY3Rpb24yXzAoKFBlcnNpc3RlbmNlVW5pdDJfMCkgcGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEpwYU9wdGlvbnMyXzAgYnVpbGRPcHRpb25zKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09wdGlvbnMyXzAoKFBlcnNpc3RlbmNlVW5pdDJfMCkgcGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBidWlsZExvZ2dpbmcoUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rTG9nZ2luZzJfMCgoUGVyc2lzdGVuY2VVbml0Ml8wKSBwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIzN2FlYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuUGVyc2lzdGVuY2VWMl8wRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfMl8wX1JFU09VUkNFX1RZUEU7Ci0JfQotCi0JcHVibGljIEVGYWN0b3J5IGdldFJlc291cmNlTm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBQZXJzaXN0ZW5jZVYyXzBGYWN0b3J5LmVJTlNUQU5DRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkgYnVpbGRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtDYWNoaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rQ2FjaGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjYzZDAzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtDYWNoaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DYWNoaW5nRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkZsdXNoQ2xlYXJDYWNoZTsKLQotLyoqCi0gKiBFY2xpcHNlTGlua0NhY2hpbmcgZW5jYXBzdWxhdGVzIEVjbGlwc2VMaW5rIENhY2hpbmcgcHJvcGVydGllcy4KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ2FjaGluZyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotCWltcGxlbWVudHMgQ2FjaGluZwotewotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JcHJpdmF0ZSBDYWNoZVR5cGUgY2FjaGVUeXBlRGVmYXVsdDsKLQlwcml2YXRlIEludGVnZXIgY2FjaGVTaXplRGVmYXVsdDsKLQlwcml2YXRlIEJvb2xlYW4gc2hhcmVkQ2FjaGVEZWZhdWx0OwotCXByaXZhdGUgRmx1c2hDbGVhckNhY2hlIGZsdXNoQ2xlYXJDYWNoZTsKLQotCXByaXZhdGUgTGlzdDxDYWNoaW5nRW50aXR5PiBlbnRpdGllczsKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGluZyhQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgewotCQl0aGlzLmVudGl0aWVzID0gbmV3IEFycmF5TGlzdDxDYWNoaW5nRW50aXR5PigpOwotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHQgPSAKLQkJCXRoaXMuZ2V0RW51bVZhbHVlKEVDTElQU0VMSU5LX0NBQ0hFX1RZUEVfREVGQVVMVCwgQ2FjaGVUeXBlLnZhbHVlcygpKTsKLQkJdGhpcy5jYWNoZVNpemVEZWZhdWx0ID0gCi0JCQl0aGlzLmdldEludGVnZXJWYWx1ZShFQ0xJUFNFTElOS19DQUNIRV9TSVpFX0RFRkFVTFQpOwotCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdCA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQpOwotCQl0aGlzLmZsdXNoQ2xlYXJDYWNoZSA9IAotCQkJdGhpcy5nZXRFbnVtVmFsdWUoRUNMSVBTRUxJTktfRkxVU0hfQ0xFQVJfQ0FDSEUsIEZsdXNoQ2xlYXJDYWNoZS52YWx1ZXMoKSk7Ci0JCQotCQlTZXQ8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBjYWNoZVR5cGVQcm9wZXJ0aWVzID0gCi0JCQl0aGlzLmdldFByb3BlcnRpZXNTZXRXaXRoUHJlZml4KEVDTElQU0VMSU5LX0NBQ0hFX1RZUEUpOwotCQlTZXQ8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBjYWNoZVNpemVQcm9wZXJ0aWVzID0gCi0JCQl0aGlzLmdldFByb3BlcnRpZXNTZXRXaXRoUHJlZml4KEVDTElQU0VMSU5LX0NBQ0hFX1NJWkUpOwotCQlTZXQ8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBzaGFyZWRDYWNoZVByb3BlcnRpZXMgPSAKLQkJCXRoaXMuZ2V0UHJvcGVydGllc1NldFdpdGhQcmVmaXgoRUNMSVBTRUxJTktfU0hBUkVEX0NBQ0hFKTsKLQkJCi0JCXRoaXMuaW5pdGlhbGl6ZUVudGl0aWVzQ2FjaGVUeXBlKGNhY2hlVHlwZVByb3BlcnRpZXMpOwotCQl0aGlzLmluaXRpYWxpemVFbnRpdGllc0NhY2hlU2l6ZShjYWNoZVNpemVQcm9wZXJ0aWVzKTsKLQkJdGhpcy5pbml0aWFsaXplRW50aXRpZXNTaGFyZWRDYWNoZShzaGFyZWRDYWNoZVByb3BlcnRpZXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRW50aXRpZXNDYWNoZVR5cGUoU2V0PFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4gY2FjaGVUeXBlUHJvcGVydGllcykgewotCQlmb3IgKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBjYWNoZVR5cGVQcm9wZXJ0eSA6IGNhY2hlVHlwZVByb3BlcnRpZXMpIHsKLQkJCXRoaXMuc2V0RW50aXR5Q2FjaGVUeXBlT2YoY2FjaGVUeXBlUHJvcGVydHkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVFbnRpdGllc0NhY2hlU2l6ZShTZXQ8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBjYWNoZVNpemVQcm9wZXJ0aWVzKSB7Ci0JCWZvciAoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IGNhY2hlU2l6ZVByb3BlcnR5IDogY2FjaGVTaXplUHJvcGVydGllcykgewotCQkJdGhpcy5zZXRFbnRpdHlDYWNoZVNpemVPZihjYWNoZVNpemVQcm9wZXJ0eSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUVudGl0aWVzU2hhcmVkQ2FjaGUoU2V0PFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4gc2hhcmVkQ2FjaGVQcm9wZXJ0aWVzKSB7Ci0JCWZvciAoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHNoYXJlZENhY2hlUHJvcGVydHkgOiBzaGFyZWRDYWNoZVByb3BlcnRpZXMpIHsKLQkJCXRoaXMuc2V0RW50aXR5U2hhcmVkQ2FjaGVPZihzaGFyZWRDYWNoZVByb3BlcnR5KTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQpKSB7Ci0JCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NBQ0hFX1NJWkVfREVGQVVMVCkpIHsKLQkJCXRoaXMuY2FjaGVTaXplRGVmYXVsdENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQpKSB7Ci0JCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX0NBQ0hFX1RZUEUpKSB7Ci0JCQl0aGlzLmNhY2hlVHlwZUNoYW5nZWQocHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfQ0FDSEVfU0laRSkpIHsKLQkJCXRoaXMuY2FjaGVTaXplQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUpKSB7Ci0JCQl0aGlzLnNoYXJlZENhY2hlQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0ZMVVNIX0NMRUFSX0NBQ0hFKSkgewotCQkJdGhpcy5mbHVzaENsZWFyQ2FjaGVDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQpKSB7Ci0JCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQ0FDSEVfU0laRV9ERUZBVUxUKSkgewotCQkJdGhpcy5jYWNoZVNpemVEZWZhdWx0Q2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NBQ0hFX1NIQVJFRF9ERUZBVUxUKSkgewotCQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX0NBQ0hFX1RZUEUpKSB7Ci0JCQl0aGlzLmNhY2hlVHlwZUNoYW5nZWQocHJvcGVydHlOYW1lLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19DQUNIRV9TSVpFKSkgewotCQkJdGhpcy5jYWNoZVNpemVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfU0hBUkVEX0NBQ0hFKSkgewotCQkJdGhpcy5zaGFyZWRDYWNoZUNoYW5nZWQocHJvcGVydHlOYW1lLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0ZMVVNIX0NMRUFSX0NBQ0hFKSkgewotCQkJdGhpcy5mbHVzaENsZWFyQ2FjaGVDaGFuZ2VkKG51bGwpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgcHJvcGVydHkgbmFtZXMga2V5L3ZhbHVlIHBhaXJzLCB3aGVyZTogCi0JICogCQlrZXkgPSBFY2xpcHNlTGluayBwcm9wZXJ0eSBrZXk7Ci0JICogCQl2YWx1ZSA9IHByb3BlcnR5IGlkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQsCi0JCQlDQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0NBQ0hFX1NJWkVfREVGQVVMVCwKLQkJCUNBQ0hFX1NJWkVfREVGQVVMVF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQsCi0JCQlTSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfRkxVU0hfQ0xFQVJfQ0FDSEUsCi0JCQlGTFVTSF9DTEVBUl9DQUNIRV9QUk9QRVJUWSk7Ci0JCQotCQkvLyBEb24ndCBuZWVkIHRvIGluaXRpYWxpemUgcHJvcGVydHlOYW1lcyBmb3I6IAotCQkvLyBjYWNoZVR5cGUsIHNoYXJlZENhY2hlLCBjYWNoZVNpemUKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdXNlZCBmb3IgaWRlbnRpZnlpbmcgdGhlIGdpdmVuIHByb3BlcnR5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGl0ZW1Jc1Byb3BlcnR5KFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBpdGVtKSB7Ci0JCWJvb2xlYW4gaXNQcm9wZXJ0eSA9IHN1cGVyLml0ZW1Jc1Byb3BlcnR5KGl0ZW0pOwotCQkKLQkJaWYgKCAhIGlzUHJvcGVydHkgJiYgaXRlbS5nZXROYW1lKCkgIT0gbnVsbCkgewotCQkJCWlmIChpdGVtLmdldE5hbWUoKS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX0NBQ0hFX1RZUEUpIHx8IAotCQkJCQkJaXRlbS5nZXROYW1lKCkuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19DQUNIRV9TSVpFKSB8fCAKLQkJCQkJCWl0ZW0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfU0hBUkVEX0NBQ0hFKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIGlzUHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvcGVydHkgbmFtZSB1c2VkIGZvciBjaGFuZ2Ugbm90aWZpY2F0aW9uIG9mIHRoZSBnaXZlbgotCSAqIHByb3BlcnR5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgcHJvcGVydHlJZE9mKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSkgewotCQl0cnkgewotCQkJcmV0dXJuIHN1cGVyLnByb3BlcnR5SWRPZihwcm9wZXJ0eSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAocHJvcGVydHkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfQ0FDSEVfVFlQRSkpIHsKLQkJCQlyZXR1cm4gQ0FDSEVfVFlQRV9QUk9QRVJUWTsKLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5LmdldE5hbWUoKS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX0NBQ0hFX1NJWkUpKSB7Ci0JCQkJcmV0dXJuIENBQ0hFX1NJWkVfUFJPUEVSVFk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwcm9wZXJ0eS5nZXROYW1lKCkuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUpKSB7Ci0JCQkJcmV0dXJuIFNIQVJFRF9DQUNIRV9QUk9QRVJUWTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIHByb3BlcnR5OiAiICsgcHJvcGVydHkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIENhY2hpbmdFbnRpdHkgYWRkRW50aXR5KFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCWlmICh0aGlzLmVudGl0eUV4aXN0cyhlbnRpdHlOYW1lKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRHVwbGljYXRlIGVudGl0eTogIiArIGVudGl0eU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJQ2FjaGluZ0VudGl0eSBuZXdFbnRpdHkgPSB0aGlzLmJ1aWxkRW50aXR5KGVudGl0eU5hbWUpOwotCQl0aGlzLmFkZEl0ZW1Ub0xpc3QobmV3RW50aXR5LCB0aGlzLmVudGl0aWVzLCBFTlRJVElFU19MSVNUKTsKLQkJcmV0dXJuIG5ld0VudGl0eTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRpdHkoU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJaWYgKCAhIHRoaXMuZW50aXR5RXhpc3RzKGVudGl0eU5hbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ2FjaGluZ0VudGl0eSBlbnRpdHkgPSB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpOwotCQl0aGlzLmNsZWFyRW50aXR5KGVudGl0eSk7Ci0JCXRoaXMucmVtb3ZlRW50aXR5KGVudGl0eSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDYWNoZVR5cGUgKioqKioqKioqKgotCXB1YmxpYyBDYWNoZVR5cGUgZ2V0Q2FjaGVUeXBlT2YoU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJQ2FjaGluZ0VudGl0eSBlbnRpdHkgPSB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpOwotCQlyZXR1cm4gKGVudGl0eSA9PSBudWxsKSA/IG51bGwgOiBlbnRpdHkuZ2V0Q2FjaGVUeXBlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2FjaGVUeXBlT2YoU3RyaW5nIGVudGl0eU5hbWUsIENhY2hlVHlwZSBuZXdDYWNoZVR5cGUpIHsKLQkJQ2FjaGluZ0VudGl0eSBvbGQgPSB0aGlzLnNldEVudGl0eUNhY2hlVHlwZU9mKGVudGl0eU5hbWUsIG5ld0NhY2hlVHlwZSk7Ci0JCXRoaXMucHV0RW51bVZhbHVlKEVDTElQU0VMSU5LX0NBQ0hFX1RZUEUsIGVudGl0eU5hbWUsIG5ld0NhY2hlVHlwZSwgZmFsc2UpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfVFlQRV9QUk9QRVJUWSwgb2xkLCB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FjaGVUeXBlQ2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJU3RyaW5nIGVudGl0eU5hbWUgPSB0aGlzLmV4dHJhY3RFbnRpdHlOYW1lT2YocHJvcGVydHlOYW1lKTsKLQkJaWYoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShlbnRpdHlOYW1lKSkgewotCQkJQ2FjaGluZ0VudGl0eSBvbGQgPSB0aGlzLnNldEVudGl0eUNhY2hlVHlwZU9mKGVudGl0eU5hbWUsIHN0cmluZ1ZhbHVlKTsgCi0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfVFlQRV9QUk9QRVJUWSwgb2xkLCB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgQ2FjaGVUeXBlIGdldERlZmF1bHRDYWNoZVR5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5jYWNoZVR5cGVEZWZhdWx0ID09IG51bGwpID8gREVGQVVMVF9DQUNIRV9UWVBFIDogdGhpcy5jYWNoZVR5cGVEZWZhdWx0OwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVTaXplICoqKioqKioqKioKLQlwdWJsaWMgSW50ZWdlciBnZXRDYWNoZVNpemVPZihTdHJpbmcgZW50aXR5TmFtZSkgewotCQlDYWNoaW5nRW50aXR5IGVudGl0eSA9IHRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSk7Ci0JCXJldHVybiAoZW50aXR5ID09IG51bGwpID8gbnVsbCA6IGVudGl0eS5nZXRDYWNoZVNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZVNpemVPZihTdHJpbmcgZW50aXR5TmFtZSwgSW50ZWdlciBuZXdDYWNoZVNpemUpIHsKLQkJQ2FjaGluZ0VudGl0eSBvbGQgPSB0aGlzLnNldEVudGl0eUNhY2hlU2l6ZU9mKGVudGl0eU5hbWUsIG5ld0NhY2hlU2l6ZSk7Ci0JCXRoaXMucHV0SW50ZWdlclZhbHVlKEVDTElQU0VMSU5LX0NBQ0hFX1NJWkUgKyBlbnRpdHlOYW1lLCBuZXdDYWNoZVNpemUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfU0laRV9QUk9QRVJUWSwgb2xkLCB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FjaGVTaXplQ2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJU3RyaW5nIGVudGl0eU5hbWUgPSB0aGlzLmV4dHJhY3RFbnRpdHlOYW1lT2YocHJvcGVydHlOYW1lKTsKLQkJaWYoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShlbnRpdHlOYW1lKSkgewotCQkJQ2FjaGluZ0VudGl0eSBvbGQgPSB0aGlzLnNldEVudGl0eUNhY2hlU2l6ZU9mKGVudGl0eU5hbWUsIHN0cmluZ1ZhbHVlKTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9TSVpFX1BST1BFUlRZLCBvbGQsIHRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdENhY2hlU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmNhY2hlU2l6ZURlZmF1bHQgPT0gbnVsbCkgPyBERUZBVUxUX0NBQ0hFX1NJWkUgOiB0aGlzLmNhY2hlU2l6ZURlZmF1bHQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBTaGFyZWRDYWNoZSAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0U2hhcmVkQ2FjaGVPZihTdHJpbmcgZW50aXR5TmFtZSkgewotCQlDYWNoaW5nRW50aXR5IGVudGl0eSA9IHRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSk7Ci0JCXJldHVybiAoZW50aXR5ID09IG51bGwpID8gbnVsbCA6IGVudGl0eS5jYWNoZUlzU2hhcmVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2hhcmVkQ2FjaGVPZihTdHJpbmcgZW50aXR5TmFtZSwgQm9vbGVhbiBuZXdTaGFyZWRDYWNoZSkgewotCQlDYWNoaW5nRW50aXR5IG9sZCA9IHRoaXMuc2V0RW50aXR5U2hhcmVkQ2FjaGVPZihlbnRpdHlOYW1lLCBuZXdTaGFyZWRDYWNoZSk7Ci0JCXRoaXMucHV0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1NIQVJFRF9DQUNIRSwgZW50aXR5TmFtZSwgbmV3U2hhcmVkQ2FjaGUsIGZhbHNlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNIQVJFRF9DQUNIRV9QUk9QRVJUWSwgb2xkLCB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2hhcmVkQ2FjaGVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlTdHJpbmcgZW50aXR5TmFtZSA9IHRoaXMuZXh0cmFjdEVudGl0eU5hbWVPZihwcm9wZXJ0eU5hbWUpOwotCQlpZiggISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGVudGl0eU5hbWUpKSB7Ci0JCQlDYWNoaW5nRW50aXR5IG9sZCA9IHRoaXMuc2V0RW50aXR5U2hhcmVkQ2FjaGVPZihlbnRpdHlOYW1lLCBzdHJpbmdWYWx1ZSk7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0hBUkVEX0NBQ0hFX1BST1BFUlRZLCBvbGQsIHRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFNoYXJlZENhY2hlKCkgewotCQlyZXR1cm4gKHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0ID09IG51bGwpID8gREVGQVVMVF9TSEFSRURfQ0FDSEUgOiB0aGlzLnNoYXJlZENhY2hlRGVmYXVsdDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENhY2hlVHlwZURlZmF1bHQgKioqKioqKioqKgotCXB1YmxpYyBDYWNoZVR5cGUgZ2V0Q2FjaGVUeXBlRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGVUeXBlRGVmYXVsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZVR5cGVEZWZhdWx0KENhY2hlVHlwZSBuZXdDYWNoZVR5cGVEZWZhdWx0KSB7Ci0JCUNhY2hlVHlwZSBvbGQgPSB0aGlzLmNhY2hlVHlwZURlZmF1bHQ7Ci0JCXRoaXMuY2FjaGVUeXBlRGVmYXVsdCA9IG5ld0NhY2hlVHlwZURlZmF1bHQ7Ci0JCXRoaXMucHV0UHJvcGVydHkoQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZLCBuZXdDYWNoZVR5cGVEZWZhdWx0KTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSwgb2xkLCBuZXdDYWNoZVR5cGVEZWZhdWx0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FjaGVUeXBlRGVmYXVsdENoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUNhY2hlVHlwZSBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBDYWNoZVR5cGUudmFsdWVzKCkpOwotCQlDYWNoZVR5cGUgb2xkID0gdGhpcy5jYWNoZVR5cGVEZWZhdWx0OwotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHQgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIENhY2hlVHlwZSBnZXREZWZhdWx0Q2FjaGVUeXBlRGVmYXVsdCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfQ0FDSEVfVFlQRV9ERUZBVUxUOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVTaXplRGVmYXVsdCAqKioqKioqKioqCi0JcHVibGljIEludGVnZXIgZ2V0Q2FjaGVTaXplRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGVTaXplRGVmYXVsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZVNpemVEZWZhdWx0KEludGVnZXIgbmV3Q2FjaGVTaXplRGVmYXVsdCkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuY2FjaGVTaXplRGVmYXVsdDsKLQkJdGhpcy5jYWNoZVNpemVEZWZhdWx0ID0gbmV3Q2FjaGVTaXplRGVmYXVsdDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShDQUNIRV9TSVpFX0RFRkFVTFRfUFJPUEVSVFksIG5ld0NhY2hlU2l6ZURlZmF1bHQpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfU0laRV9ERUZBVUxUX1BST1BFUlRZLCBvbGQsIG5ld0NhY2hlU2l6ZURlZmF1bHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWNoZVNpemVEZWZhdWx0Q2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJSW50ZWdlciBuZXdWYWx1ZSA9IGdldEludGVnZXJWYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLmNhY2hlU2l6ZURlZmF1bHQ7Ci0JCXRoaXMuY2FjaGVTaXplRGVmYXVsdCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfU0laRV9ERUZBVUxUX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0Q2FjaGVTaXplRGVmYXVsdCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfQ0FDSEVfU0laRV9ERUZBVUxUOwotCX0KLQotCS8vICoqKioqKioqKiogU2hhcmVkQ2FjaGVEZWZhdWx0ICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRTaGFyZWRDYWNoZURlZmF1bHQoKSB7Ci0JCXJldHVybiB0aGlzLnNoYXJlZENhY2hlRGVmYXVsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaGFyZWRDYWNoZURlZmF1bHQoQm9vbGVhbiBuZXdTaGFyZWRDYWNoZURlZmF1bHQpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNoYXJlZENhY2hlRGVmYXVsdDsKLQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHQgPSBuZXdTaGFyZWRDYWNoZURlZmF1bHQ7Ci0JCXRoaXMucHV0UHJvcGVydHkoU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFksIG5ld1NoYXJlZENhY2hlRGVmYXVsdCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSwgb2xkLCBuZXdTaGFyZWRDYWNoZURlZmF1bHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzaGFyZWRDYWNoZURlZmF1bHRDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNoYXJlZENhY2hlRGVmYXVsdDsKLQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHQgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0U2hhcmVkQ2FjaGVEZWZhdWx0KCkgewotCQlyZXR1cm4gREVGQVVMVF9TSEFSRURfQ0FDSEVfREVGQVVMVDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEZsdXNoQ2xlYXJDYWNoZSAqKioqKioqKioqCi0JCi0JcHVibGljIEZsdXNoQ2xlYXJDYWNoZSBnZXRGbHVzaENsZWFyQ2FjaGUoKSB7Ci0JCXJldHVybiB0aGlzLmZsdXNoQ2xlYXJDYWNoZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Rmx1c2hDbGVhckNhY2hlKEZsdXNoQ2xlYXJDYWNoZSBuZXdGbHVzaENsZWFyQ2FjaGUpIHsKLQkJRmx1c2hDbGVhckNhY2hlIG9sZCA9IHRoaXMuZmx1c2hDbGVhckNhY2hlOwotCQl0aGlzLmZsdXNoQ2xlYXJDYWNoZSA9IG5ld0ZsdXNoQ2xlYXJDYWNoZTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShGTFVTSF9DTEVBUl9DQUNIRV9QUk9QRVJUWSwgbmV3Rmx1c2hDbGVhckNhY2hlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZMVVNIX0NMRUFSX0NBQ0hFX1BST1BFUlRZLCBvbGQsIG5ld0ZsdXNoQ2xlYXJDYWNoZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZsdXNoQ2xlYXJDYWNoZUNoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUZsdXNoQ2xlYXJDYWNoZSBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBGbHVzaENsZWFyQ2FjaGUudmFsdWVzKCkpOwotCQlGbHVzaENsZWFyQ2FjaGUgb2xkID0gdGhpcy5mbHVzaENsZWFyQ2FjaGU7Ci0JCXRoaXMuZmx1c2hDbGVhckNhY2hlID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGTFVTSF9DTEVBUl9DQUNIRV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBGbHVzaENsZWFyQ2FjaGUgZ2V0RGVmYXVsdEZsdXNoQ2xlYXJDYWNoZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfRkxVU0hfQ0xFQVJfQ0FDSEU7Ci0JfQotCi0JLy8gKioqKioqIEVudGl0eSBDYWNoZVR5cGUgKioqKioqKgotCS8qKgotCSAqIFJldHVybnMgdGhlIG9sZCBFbnRpdHkKLQkgKi8KLQlwcml2YXRlIENhY2hpbmdFbnRpdHkgc2V0RW50aXR5Q2FjaGVUeXBlT2YoU3RyaW5nIGVudGl0eU5hbWUsIFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQkgaWYoKCAhIHRoaXMuZW50aXR5RXhpc3RzKGVudGl0eU5hbWUpKSAmJiBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHN0cmluZ1ZhbHVlKSkgewotCQkJCS8vdGhpcyBpcyBhIHByb3BlcnR5IHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGFkZGVkLCB3ZSBkb24ndCBuZWVkIHRvIGRlYWwgd2l0aCBpdCB1bnRpbCB0aGUgdmFsdWUgaXMgc2V0Ci0JCQkJIHJldHVybiBudWxsOwotCQkJIH0KLQkJQ2FjaGVUeXBlIG5ld1ZhbHVlID0gZ2V0RW51bVZhbHVlT2Yoc3RyaW5nVmFsdWUsIENhY2hlVHlwZS52YWx1ZXMoKSk7Ci0JCXJldHVybiB0aGlzLnNldEVudGl0eUNhY2hlVHlwZU9mKGVudGl0eU5hbWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvbGQgRW50aXR5Ci0JICovCi0JcHJpdmF0ZSBDYWNoaW5nRW50aXR5IHNldEVudGl0eUNhY2hlVHlwZU9mKFN0cmluZyBlbnRpdHlOYW1lLCBDYWNoZVR5cGUgY2FjaGVUeXBlKSB7Ci0JCUNhY2hpbmdFbnRpdHkgZW50aXR5ID0gKHRoaXMuZW50aXR5RXhpc3RzKGVudGl0eU5hbWUpKSA/Ci0JCQkJCQl0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpIDoKLQkJCQkJCXRoaXMuYWRkRW50aXR5KGVudGl0eU5hbWUpOwotCQlyZXR1cm4gdGhpcy5zZXRFbnRpdHlDYWNoZVR5cGVPZihlbnRpdHksIGNhY2hlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2xkIEVudGl0eQotCSAqLwotCXByaXZhdGUgQ2FjaGluZ0VudGl0eSBzZXRFbnRpdHlDYWNoZVR5cGVPZihDYWNoaW5nRW50aXR5IGVudGl0eSwgQ2FjaGVUeXBlIGNhY2hlVHlwZSkgewotCQlpZihlbnRpdHkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUNhY2hpbmdFbnRpdHkgb2xkID0gZW50aXR5LmNsb25lKCk7Ci0JCWVudGl0eS5zZXRDYWNoZVR5cGUoY2FjaGVUeXBlKTsKLQkJcmV0dXJuIG9sZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RW50aXR5Q2FjaGVUeXBlT2YoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IGNhY2hlVHlwZVByb3BlcnR5KSB7Ci0JCVN0cmluZyBlbnRpdHlOYW1lID0gdGhpcy5leHRyYWN0RW50aXR5TmFtZU9mKGNhY2hlVHlwZVByb3BlcnR5KTsKLQkJdGhpcy5zZXRFbnRpdHlDYWNoZVR5cGVPZihlbnRpdHlOYW1lLCBjYWNoZVR5cGVQcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQkvLyAqKioqKiogRW50aXR5IENhY2hlIHNpemUgKioqKioqKgotCS8qKgotCSAqIFJldHVybnMgdGhlIG9sZCBFbnRpdHkKLQkgKi8KLQlwcml2YXRlIENhY2hpbmdFbnRpdHkgc2V0RW50aXR5Q2FjaGVTaXplT2YoU3RyaW5nIGVudGl0eU5hbWUsIFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQkgaWYoKCAhIHRoaXMuZW50aXR5RXhpc3RzKGVudGl0eU5hbWUpKSAmJiBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHN0cmluZ1ZhbHVlKSkgewotCQkJCS8vdGhpcyBpcyBhIHByb3BlcnR5IHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGFkZGVkLCB3ZSBkb24ndCBuZWVkIHRvIGRlYWwgd2l0aCBpdCB1bnRpbCB0aGUgdmFsdWUgaXMgc2V0Ci0JCQkJIHJldHVybiBudWxsOwotCQkJIH0KLQkJSW50ZWdlciBuZXdWYWx1ZSA9IGdldEludGVnZXJWYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJcmV0dXJuIHRoaXMuc2V0RW50aXR5Q2FjaGVTaXplT2YoZW50aXR5TmFtZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9sZCBFbnRpdHkKLQkgKi8KLQlwcml2YXRlIENhY2hpbmdFbnRpdHkgc2V0RW50aXR5Q2FjaGVTaXplT2YoU3RyaW5nIGVudGl0eU5hbWUsIEludGVnZXIgc2l6ZSkgewotCQlDYWNoaW5nRW50aXR5IGVudGl0eSA9ICh0aGlzLmVudGl0eUV4aXN0cyhlbnRpdHlOYW1lKSkgPwotCQkJCQkJdGhpcy5nZXRFbnRpdHlOYW1lZChlbnRpdHlOYW1lKSA6Ci0JCQkJCQl0aGlzLmFkZEVudGl0eShlbnRpdHlOYW1lKTsKLQkJcmV0dXJuIHRoaXMuc2V0RW50aXR5Q2FjaGVTaXplT2YoZW50aXR5LCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvbGQgRW50aXR5Ci0JICovCi0JcHJpdmF0ZSBDYWNoaW5nRW50aXR5IHNldEVudGl0eUNhY2hlU2l6ZU9mKENhY2hpbmdFbnRpdHkgZW50aXR5LCBJbnRlZ2VyIHNpemUpIHsKLQkJaWYoZW50aXR5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlDYWNoaW5nRW50aXR5IG9sZCA9IGVudGl0eS5jbG9uZSgpOwotCQllbnRpdHkuc2V0Q2FjaGVTaXplKHNpemUpOwotCQlyZXR1cm4gb2xkOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRFbnRpdHlDYWNoZVNpemVPZihQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgY2FjaGVTaXplUHJvcGVydHkpIHsKLQkJU3RyaW5nIGVudGl0eU5hbWUgPSB0aGlzLmV4dHJhY3RFbnRpdHlOYW1lT2YoY2FjaGVTaXplUHJvcGVydHkpOwotCQl0aGlzLnNldEVudGl0eUNhY2hlU2l6ZU9mKGVudGl0eU5hbWUsIGNhY2hlU2l6ZVByb3BlcnR5LmdldFZhbHVlKCkpOwotCX0KLQotCS8vICoqKioqKiBFbnRpdHkgU2hhcmVkQ2FjaGUgKioqKioqKgotCS8qKgotCSAqIFJldHVybnMgdGhlIG9sZCBFbnRpdHkKLQkgKi8KLQlwcml2YXRlIENhY2hpbmdFbnRpdHkgc2V0RW50aXR5U2hhcmVkQ2FjaGVPZihTdHJpbmcgZW50aXR5TmFtZSwgU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCSBpZigoICEgdGhpcy5lbnRpdHlFeGlzdHMoZW50aXR5TmFtZSkpICYmIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoc3RyaW5nVmFsdWUpKSB7Ci0JCQkJLy90aGlzIGlzIGEgcHJvcGVydHkgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgYWRkZWQsIHdlIGRvbid0IG5lZWQgdG8gZGVhbCB3aXRoIGl0IHVudGlsIHRoZSB2YWx1ZSBpcyBzZXQKLQkJCQkgcmV0dXJuIG51bGw7Ci0JCQkgfQotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQlyZXR1cm4gdGhpcy5zZXRFbnRpdHlTaGFyZWRDYWNoZU9mKGVudGl0eU5hbWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvbGQgRW50aXR5Ci0JICovCi0JcHJpdmF0ZSBDYWNoaW5nRW50aXR5IHNldEVudGl0eVNoYXJlZENhY2hlT2YoU3RyaW5nIGVudGl0eU5hbWUsIEJvb2xlYW4gc2hhcmVkQ2FjaGUpIHsKLQkJQ2FjaGluZ0VudGl0eSBlbnRpdHkgPSAodGhpcy5lbnRpdHlFeGlzdHMoZW50aXR5TmFtZSkpID8KLQkJCQkJCXRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSkgOgotCQkJCQkJdGhpcy5hZGRFbnRpdHkoZW50aXR5TmFtZSk7Ci0JCXJldHVybiB0aGlzLnNldEVudGl0eVNoYXJlZENhY2hlT2YoZW50aXR5LCBzaGFyZWRDYWNoZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2xkIEVudGl0eQotCSAqLwotCXByaXZhdGUgQ2FjaGluZ0VudGl0eSBzZXRFbnRpdHlTaGFyZWRDYWNoZU9mKENhY2hpbmdFbnRpdHkgZW50aXR5LCBCb29sZWFuIHNoYXJlZENhY2hlKSB7Ci0JCWlmKGVudGl0eSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJQ2FjaGluZ0VudGl0eSBvbGQgPSBlbnRpdHkuY2xvbmUoKTsKLQkJZW50aXR5LnNldFNoYXJlZENhY2hlKHNoYXJlZENhY2hlKTsKLQkJcmV0dXJuIG9sZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RW50aXR5U2hhcmVkQ2FjaGVPZihQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgc2hhcmVkQ2FjaGVQcm9wZXJ0eSkgewotCQlTdHJpbmcgZW50aXR5TmFtZSA9IHRoaXMuZXh0cmFjdEVudGl0eU5hbWVPZihzaGFyZWRDYWNoZVByb3BlcnR5KTsKLQkJdGhpcy5zZXRFbnRpdHlTaGFyZWRDYWNoZU9mKGVudGl0eU5hbWUsIHNoYXJlZENhY2hlUHJvcGVydHkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JLy8gKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKgotCi0JLyoqCi0JICogU2V0IGFsbCBFbnRpdHkgcHJvcGVydGllcyB0byBkZWZhdWx0LgotCSAqLwotCXByaXZhdGUgdm9pZCBjbGVhckVudGl0eShDYWNoaW5nRW50aXR5IGVudGl0eSkgewotCQlpZihlbnRpdHkuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIGVudGl0eU5hbWUgPSBlbnRpdHkuZ2V0TmFtZSgpOwotCQl0aGlzLnNldENhY2hlVHlwZU9mKGVudGl0eU5hbWUsIG51bGwpOwotCQl0aGlzLnNldENhY2hlU2l6ZU9mKGVudGl0eU5hbWUsIG51bGwpOwotCQl0aGlzLnNldFNoYXJlZENhY2hlT2YoZW50aXR5TmFtZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRW50aXR5IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICovCi0JcHJpdmF0ZSBDYWNoaW5nRW50aXR5IGdldEVudGl0eU5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCWZvcihDYWNoaW5nRW50aXR5IGVudGl0eTogdGhpcy5lbnRpdGllcykgewotCQkJaWYoZW50aXR5LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gZW50aXR5OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgQ2FjaGluZ0VudGl0eSBidWlsZEVudGl0eShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbmV3IENhY2hpbmdFbnRpdHkodGhpcywgbmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUVudGl0eShDYWNoaW5nRW50aXR5IGVudGl0eSkgewotCQlpZihlbnRpdHkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoZW50aXR5LCB0aGlzLmVudGl0aWVzLCBFTlRJVElFU19MSVNUKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgRW50aXR5IGV4aXN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVudGl0eUV4aXN0cyhTdHJpbmcgbmFtZSkgewotCQlmb3IoQ2FjaGluZ0VudGl0eSBlbnRpdHk6IHRoaXMuZW50aXRpZXMpIHsKLQkJCWlmKGVudGl0eS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgY2FjaGVUeXBlRGVmYXVsdCwgY2FjaGVTaXplRGVmYXVsdCwgZmx1c2hDbGVhckNhY2hlIHByb3BlcnRpZXMuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRGVmYXVsdENhY2hpbmdQcm9wZXJ0aWVzKCkgewotCQl0aGlzLnNldENhY2hlVHlwZURlZmF1bHQobnVsbCk7Ci0JCXRoaXMuc2V0Q2FjaGVTaXplRGVmYXVsdChudWxsKTsKLQkJdGhpcy5zZXRGbHVzaENsZWFyQ2FjaGUobnVsbCk7Ci0JfQotCi0JLy8gKioqKioqIGVudGl0aWVzIGxpc3QgKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxDYWNoaW5nRW50aXR5PiBnZXRFbnRpdGllcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8Q2FjaGluZ0VudGl0eT4odGhpcy5lbnRpdGllcyk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0RW50aXR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxDYWNoaW5nRW50aXR5LCBTdHJpbmc+KHRoaXMuZ2V0RW50aXRpZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShDYWNoaW5nRW50aXR5IGVudGl0eSkgewotCQkJCXJldHVybiBlbnRpdHkuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW50aXRpZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5lbnRpdGllcy5zaXplKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua0Nvbm5lY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtDb25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYjA0YzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua0Nvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkJhdGNoV3JpdGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlOwotCi0vKioKLSAqICBFY2xpcHNlTGlua0Nvbm5lY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ29ubmVjdGlvbiBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotCWltcGxlbWVudHMgQ29ubmVjdGlvbgotewotCQotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JcHJpdmF0ZSBCYXRjaFdyaXRpbmcgYmF0Y2hXcml0aW5nOwotCXByaXZhdGUgQm9vbGVhbiBuYXRpdmVTcWw7Ci0JcHJpdmF0ZSBCb29sZWFuIGNhY2hlU3RhdGVtZW50czsKLQlwcml2YXRlIEludGVnZXIgY2FjaGVTdGF0ZW1lbnRzU2l6ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlcjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHVybDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHVzZXI7Ci0JcHJvdGVjdGVkIFN0cmluZyBwYXNzd29yZDsKLQlwcml2YXRlIEJvb2xlYW4gYmluZFBhcmFtZXRlcnM7Ci0JcHJpdmF0ZSBCb29sZWFuIHJlYWRDb25uZWN0aW9uc1NoYXJlZDsKLQlwcml2YXRlIEludGVnZXIgcmVhZENvbm5lY3Rpb25zTWluOwotCXByaXZhdGUgSW50ZWdlciByZWFkQ29ubmVjdGlvbnNNYXg7Ci0JcHJpdmF0ZSBJbnRlZ2VyIHdyaXRlQ29ubmVjdGlvbnNNaW47Ci0JcHJpdmF0ZSBJbnRlZ2VyIHdyaXRlQ29ubmVjdGlvbnNNYXg7Ci0JcHJpdmF0ZSBFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBleGNsdXNpdmVDb25uZWN0aW9uTW9kZTsKLQlwcml2YXRlIEJvb2xlYW4gbGF6eUNvbm5lY3Rpb247Ci0JCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rQ29ubmVjdGlvbihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgewotCQl0aGlzLmluaXRpYWxpemVEYXRhYmFzZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzKCk7Ci0JCQotCQl0aGlzLmJhdGNoV3JpdGluZyA9IAotCQkJdGhpcy5nZXRFbnVtVmFsdWUoRUNMSVBTRUxJTktfQkFUQ0hfV1JJVElORywgQmF0Y2hXcml0aW5nLnZhbHVlcygpKTsKLQkJdGhpcy5uYXRpdmVTcWwgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX05BVElWRV9TUUwpOwotCQl0aGlzLmNhY2hlU3RhdGVtZW50cyA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UUyk7Ci0JCXRoaXMuY2FjaGVTdGF0ZW1lbnRzU2l6ZSA9IAotCQkJdGhpcy5nZXRJbnRlZ2VyVmFsdWUoRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UU19TSVpFKTsKLQkJdGhpcy5iaW5kUGFyYW1ldGVycyA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfQklORF9QQVJBTUVURVJTKTsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNTaGFyZWQgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfU0hBUkVEKTsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNaW4gPSAKLQkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUlOKTsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNYXggPSAKLQkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUFYKTsKLQkJdGhpcy53cml0ZUNvbm5lY3Rpb25zTWluID0gCi0JCQl0aGlzLmdldEludGVnZXJWYWx1ZShFQ0xJUFNFTElOS19XUklURV9DT05ORUNUSU9OU19NSU4pOwotCQl0aGlzLndyaXRlQ29ubmVjdGlvbnNNYXggPSAKLQkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKEVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01BWCk7Ci0JCXRoaXMuZXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgPSAKLQkJCXRoaXMuZ2V0RW51bVZhbHVlKEVDTElQU0VMSU5LX0VYQ0xVU0lWRV9DT05ORUNUSU9OX01PREUsIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlLnZhbHVlcygpKTsKLQkJdGhpcy5sYXp5Q29ubmVjdGlvbiA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfTEFaWV9DT05ORUNUSU9OKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURhdGFiYXNlQ29ubmVjdGlvblByb3BlcnRpZXMoKSB7Ci0JCXRoaXMuZHJpdmVyID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0RSSVZFUik7Ci0JCXRoaXMudXJsID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1VSTCk7Ci0JCXRoaXMudXNlciA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19VU0VSKTsKLQkJdGhpcy5wYXNzd29yZCA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19QQVNTV09SRCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX05BVElWRV9TUUwpKSB7Ci0JCQl0aGlzLm5hdGl2ZVNxbENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQkFUQ0hfV1JJVElORykpIHsKLQkJCXRoaXMuYmF0Y2hXcml0aW5nQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DQUNIRV9TVEFURU1FTlRTKSkgewotCQkJdGhpcy5jYWNoZVN0YXRlbWVudHNDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0RSSVZFUikpIHsKLQkJCXRoaXMuZHJpdmVyQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19VUkwpKSB7Ci0JCQl0aGlzLnVybENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVVNFUikpIHsKLQkJCXRoaXMudXNlckNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfUEFTU1dPUkQpKSB7Ci0JCQl0aGlzLnBhc3N3b3JkQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19CSU5EX1BBUkFNRVRFUlMpKSB7Ci0JCQl0aGlzLmJpbmRQYXJhbWV0ZXJzQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX1NIQVJFRCkpIHsKLQkJCXRoaXMucmVhZENvbm5lY3Rpb25zU2hhcmVkQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DQUNIRV9TVEFURU1FTlRTX1NJWkUpKSB7Ci0JCQl0aGlzLmNhY2hlU3RhdGVtZW50c1NpemVDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUlOKSkgewotCQkJcmVhZENvbm5lY3Rpb25zTWluQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX01BWCkpIHsKLQkJCXJlYWRDb25uZWN0aW9uc01heENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUlOKSkgewotCQkJd3JpdGVDb25uZWN0aW9uc01pbkNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUFYKSkgewotCQkJd3JpdGVDb25uZWN0aW9uc01heENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERSkpIHsKLQkJCXRoaXMuZXhjbHVzaXZlQ29ubmVjdGlvbk1vZGVDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0xBWllfQ09OTkVDVElPTikpIHsKLQkJCXRoaXMubGF6eUNvbm5lY3Rpb25DaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19OQVRJVkVfU1FMKSkgewotCQkJdGhpcy5uYXRpdmVTcWxDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQkFUQ0hfV1JJVElORykpIHsKLQkJCXRoaXMuYmF0Y2hXcml0aW5nQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NBQ0hFX1NUQVRFTUVOVFMpKSB7Ci0JCQl0aGlzLmNhY2hlU3RhdGVtZW50c0NoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19EUklWRVIpKSB7Ci0JCQl0aGlzLmRyaXZlckNoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19VUkwpKSB7Ci0JCQl0aGlzLnVybENoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19VU0VSKSkgewotCQkJdGhpcy51c2VyQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1BBU1NXT1JEKSkgewotCQkJdGhpcy5wYXNzd29yZENoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19CSU5EX1BBUkFNRVRFUlMpKSB7Ci0JCQl0aGlzLmJpbmRQYXJhbWV0ZXJzQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfU0hBUkVEKSkgewotCQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNTaGFyZWRDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UU19TSVpFKSkgewotCQkJdGhpcy5jYWNoZVN0YXRlbWVudHNTaXplQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUlOKSkgewotCQkJcmVhZENvbm5lY3Rpb25zTWluQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUFYKSkgewotCQkJcmVhZENvbm5lY3Rpb25zTWF4Q2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01JTikpIHsKLQkJCXdyaXRlQ29ubmVjdGlvbnNNaW5DaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUFYKSkgewotCQkJd3JpdGVDb25uZWN0aW9uc01heENoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19FWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFKSkgewotCQkJdGhpcy5leGNsdXNpdmVDb25uZWN0aW9uTW9kZUNoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19MQVpZX0NPTk5FQ1RJT04pKSB7Ci0JCQl0aGlzLmxhenlDb25uZWN0aW9uQ2hhbmdlZChudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgcHJvcGVydHkgbmFtZXMga2V5L3ZhbHVlIHBhaXJzLCB3aGVyZTogCi0JICogCQlrZXkgPSBFY2xpcHNlTGluayBwcm9wZXJ0eSBrZXkKLQkgKiAJCXZhbHVlID0gcHJvcGVydHkgaWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQl0aGlzLmFkZERhdGFiYXNlQ29ubmVjdGlvblByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX05BVElWRV9TUUwsCi0JCQlOQVRJVkVfU1FMX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19CQVRDSF9XUklUSU5HLAotCQkJQkFUQ0hfV1JJVElOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UUywKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0NBQ0hFX1NUQVRFTUVOVFNfU0laRSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfU0laRV9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfQklORF9QQVJBTUVURVJTLAotCQkJQklORF9QQVJBTUVURVJTX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX1NIQVJFRCwKLQkJCVJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX01JTiwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX01BWCwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19XUklURV9DT05ORUNUSU9OU19NSU4sCi0JCQlXUklURV9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01BWCwKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERSwKLQkJCUVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0xBWllfQ09OTkVDVElPTiwKLQkJCUxBWllfQ09OTkVDVElPTl9QUk9QRVJUWSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGF0YWJhc2VDb25uZWN0aW9uUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19EUklWRVIsCi0JCQlEUklWRVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1VSTCwKLQkJCVVSTF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVVNFUiwKLQkJCVVTRVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1BBU1NXT1JELAotCQkJUEFTU1dPUkRfUFJPUEVSVFkpOwotCX0KLQotCS8qKgotICAgICAqIERvZXMgYWxsIHByZS10cmVhdG1lbnQgaW4gdGhpcyBtZXRob2QgYmVmb3JlIHRoZSBwcm9wZXJ0eSBpcyBzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmVTZXRQcm9wZXJ0eSgpIHsKLQkJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0Ci0JfQotCi0JLy8gKioqKioqKioqKiBOYXRpdmVTcWwgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldE5hdGl2ZVNxbCgpIHsKLQkJcmV0dXJuIHRoaXMubmF0aXZlU3FsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hdGl2ZVNxbChCb29sZWFuIG5ld05hdGl2ZVNxbCkgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMubmF0aXZlU3FsOwotCQl0aGlzLm5hdGl2ZVNxbCA9IG5ld05hdGl2ZVNxbDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShOQVRJVkVfU1FMX1BST1BFUlRZLCBuZXdOYXRpdmVTcWwpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFUSVZFX1NRTF9QUk9QRVJUWSwgb2xkLCBuZXdOYXRpdmVTcWwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbmF0aXZlU3FsQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy5uYXRpdmVTcWw7Ci0JCXRoaXMubmF0aXZlU3FsID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQVRJVkVfU1FMX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0TmF0aXZlU3FsKCkgewotCQlyZXR1cm4gREVGQVVMVF9OQVRJVkVfU1FMOwotCX0KLQotCS8vICoqKioqKioqKiogQmF0Y2hXcml0aW5nICoqKioqKioqKioKLQkKLQlwdWJsaWMgQmF0Y2hXcml0aW5nIGdldEJhdGNoV3JpdGluZygpIHsKLQkJcmV0dXJuIHRoaXMuYmF0Y2hXcml0aW5nOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRCYXRjaFdyaXRpbmcoQmF0Y2hXcml0aW5nIG5ld0JhdGNoV3JpdGluZykgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlCYXRjaFdyaXRpbmcgb2xkID0gdGhpcy5iYXRjaFdyaXRpbmc7Ci0JCXRoaXMuYmF0Y2hXcml0aW5nID0gbmV3QmF0Y2hXcml0aW5nOwotCQl0aGlzLnB1dFByb3BlcnR5KEJBVENIX1dSSVRJTkdfUFJPUEVSVFksIG5ld0JhdGNoV3JpdGluZyk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChCQVRDSF9XUklUSU5HX1BST1BFUlRZLCBvbGQsIG5ld0JhdGNoV3JpdGluZyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJhdGNoV3JpdGluZ0NoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJhdGNoV3JpdGluZyBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBCYXRjaFdyaXRpbmcudmFsdWVzKCkpOwotCQlCYXRjaFdyaXRpbmcgb2xkID0gdGhpcy5iYXRjaFdyaXRpbmc7Ci0JCXRoaXMuYmF0Y2hXcml0aW5nID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChCQVRDSF9XUklUSU5HX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIEJhdGNoV3JpdGluZyBnZXREZWZhdWx0QmF0Y2hXcml0aW5nKCkgewotCQlyZXR1cm4gREVGQVVMVF9CQVRDSF9XUklUSU5HOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVTdGF0ZW1lbnRzICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRDYWNoZVN0YXRlbWVudHMoKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hlU3RhdGVtZW50czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZVN0YXRlbWVudHMoQm9vbGVhbiBuZXdDYWNoZVN0YXRlbWVudHMpIHsKLQkJdGhpcy5wcmVTZXRQcm9wZXJ0eSgpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmNhY2hlU3RhdGVtZW50czsKLQkJdGhpcy5jYWNoZVN0YXRlbWVudHMgPSBuZXdDYWNoZVN0YXRlbWVudHM7Ci0JCXRoaXMucHV0UHJvcGVydHkoQ0FDSEVfU1RBVEVNRU5UU19QUk9QRVJUWSwgbmV3Q2FjaGVTdGF0ZW1lbnRzKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1NUQVRFTUVOVFNfUFJPUEVSVFksIG9sZCwgbmV3Q2FjaGVTdGF0ZW1lbnRzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FjaGVTdGF0ZW1lbnRzQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy5jYWNoZVN0YXRlbWVudHM7Ci0JCXRoaXMuY2FjaGVTdGF0ZW1lbnRzID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9TVEFURU1FTlRTX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0Q2FjaGVTdGF0ZW1lbnRzKCkgewotCQlyZXR1cm4gREVGQVVMVF9DQUNIRV9TVEFURU1FTlRTOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVTdGF0ZW1lbnRzU2l6ZSAqKioqKioqKioqCi0JcHVibGljIEludGVnZXIgZ2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGVTdGF0ZW1lbnRzU2l6ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZVN0YXRlbWVudHNTaXplKEludGVnZXIgbmV3Q2FjaGVTdGF0ZW1lbnRzU2l6ZSkgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuY2FjaGVTdGF0ZW1lbnRzU2l6ZTsKLQkJdGhpcy5jYWNoZVN0YXRlbWVudHNTaXplID0gbmV3Q2FjaGVTdGF0ZW1lbnRzU2l6ZTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShDQUNIRV9TVEFURU1FTlRTX1NJWkVfUFJPUEVSVFksIG5ld0NhY2hlU3RhdGVtZW50c1NpemUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1BST1BFUlRZLCBvbGQsIG5ld0NhY2hlU3RhdGVtZW50c1NpemUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWNoZVN0YXRlbWVudHNTaXplQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJSW50ZWdlciBuZXdWYWx1ZSA9IGdldEludGVnZXJWYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy5jYWNoZVN0YXRlbWVudHNTaXplOwotCQl0aGlzLmNhY2hlU3RhdGVtZW50c1NpemUgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1NUQVRFTUVOVFNfU0laRV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdENhY2hlU3RhdGVtZW50c1NpemUoKSB7Ci0JCXJldHVybiBERUZBVUxUX0NBQ0hFX1NUQVRFTUVOVFNfU0laRTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIERyaXZlciAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXREcml2ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmRyaXZlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREcml2ZXIoU3RyaW5nIG5ld0RyaXZlcikgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlTdHJpbmcgb2xkID0gdGhpcy5kcml2ZXI7Ci0JCXRoaXMuZHJpdmVyID0gbmV3RHJpdmVyOwotCQl0aGlzLnB1dFByb3BlcnR5KERSSVZFUl9QUk9QRVJUWSwgbmV3RHJpdmVyKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERSSVZFUl9QUk9QRVJUWSwgb2xkLCBuZXdEcml2ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRyaXZlckNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRyaXZlcjsKLQkJdGhpcy5kcml2ZXIgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERSSVZFUl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0RHJpdmVyKCkgewotCQlyZXR1cm4gREVGQVVMVF9EUklWRVI7Ci0JfQotCi0JLy8gKioqKioqKioqKiBVUkwgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotCQlyZXR1cm4gdGhpcy51cmw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyBuZXdVcmwpIHsKLQkJdGhpcy5wcmVTZXRQcm9wZXJ0eSgpOwotCQkKLQkJU3RyaW5nIG9sZCA9IHRoaXMudXJsOwotCQl0aGlzLnVybCA9IG5ld1VybDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShVUkxfUFJPUEVSVFksIG5ld1VybCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChVUkxfUFJPUEVSVFksIG9sZCwgbmV3VXJsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cmxDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy51cmw7Ci0JCXRoaXMudXJsID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChVUkxfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFVybCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfVVJMOwotCX0KLQotCS8vICoqKioqKioqKiogVXNlciAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRVc2VyKCkgewotCQlyZXR1cm4gdGhpcy51c2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVzZXIoU3RyaW5nIG5ld1VzZXIpIHsKLQkJdGhpcy5wcmVTZXRQcm9wZXJ0eSgpOwotCQkKLQkJU3RyaW5nIG9sZCA9IHRoaXMudXNlcjsKLQkJdGhpcy51c2VyID0gbmV3VXNlcjsKLQkJdGhpcy5wdXRQcm9wZXJ0eShVU0VSX1BST1BFUlRZLCBuZXdVc2VyKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFVTRVJfUFJPUEVSVFksIG9sZCwgbmV3VXNlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXNlckNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnVzZXI7Ci0JCXRoaXMudXNlciA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVVNFUl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VXNlcigpIHsKLQkJcmV0dXJuIERFRkFVTFRfVVNFUjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFBhc3N3b3JkICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgewotCQlyZXR1cm4gdGhpcy5wYXNzd29yZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgbmV3UGFzc3dvcmQpIHsKLQkJdGhpcy5wcmVTZXRQcm9wZXJ0eSgpOwotCQkKLQkJU3RyaW5nIG9sZCA9IHRoaXMucGFzc3dvcmQ7Ci0JCXRoaXMucGFzc3dvcmQgPSBuZXdQYXNzd29yZDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShQQVNTV09SRF9QUk9QRVJUWSwgbmV3UGFzc3dvcmQpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUEFTU1dPUkRfUFJPUEVSVFksIG9sZCwgbmV3UGFzc3dvcmQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhc3N3b3JkQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucGFzc3dvcmQ7Ci0JCXRoaXMucGFzc3dvcmQgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBBU1NXT1JEX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYXNzd29yZCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfUEFTU1dPUkQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBCaW5kUGFyYW1ldGVycyAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0QmluZFBhcmFtZXRlcnMoKSB7Ci0JCXJldHVybiB0aGlzLmJpbmRQYXJhbWV0ZXJzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJpbmRQYXJhbWV0ZXJzKEJvb2xlYW4gbmV3QmluZFBhcmFtZXRlcnMpIHsKLQkJdGhpcy5wcmVTZXRQcm9wZXJ0eSgpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmJpbmRQYXJhbWV0ZXJzOwotCQl0aGlzLmJpbmRQYXJhbWV0ZXJzID0gbmV3QmluZFBhcmFtZXRlcnM7Ci0JCXRoaXMucHV0UHJvcGVydHkoQklORF9QQVJBTUVURVJTX1BST1BFUlRZLCBuZXdCaW5kUGFyYW1ldGVycyk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChCSU5EX1BBUkFNRVRFUlNfUFJPUEVSVFksIG9sZCwgbmV3QmluZFBhcmFtZXRlcnMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBiaW5kUGFyYW1ldGVyc0NoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMuYmluZFBhcmFtZXRlcnM7Ci0JCXRoaXMuYmluZFBhcmFtZXRlcnMgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEJJTkRfUEFSQU1FVEVSU19QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdEJpbmRQYXJhbWV0ZXJzKCkgewotCQlyZXR1cm4gREVGQVVMVF9CSU5EX1BBUkFNRVRFUlM7Ci0JfQotCi0JLy8gKioqKioqKioqKiBSZWFkQ29ubmVjdGlvbnNTaGFyZWQgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFJlYWRDb25uZWN0aW9uc1NoYXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMucmVhZENvbm5lY3Rpb25zU2hhcmVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlYWRDb25uZWN0aW9uc1NoYXJlZChCb29sZWFuIG5ld1JlYWRDb25uZWN0aW9uc1NoYXJlZCkgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMucmVhZENvbm5lY3Rpb25zU2hhcmVkOwotCQl0aGlzLnJlYWRDb25uZWN0aW9uc1NoYXJlZCA9IG5ld1JlYWRDb25uZWN0aW9uc1NoYXJlZDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9QUk9QRVJUWSwgbmV3UmVhZENvbm5lY3Rpb25zU2hhcmVkKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZLCBvbGQsIG5ld1JlYWRDb25uZWN0aW9uc1NoYXJlZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRDb25uZWN0aW9uc1NoYXJlZENoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMucmVhZENvbm5lY3Rpb25zU2hhcmVkOwotCQl0aGlzLnJlYWRDb25uZWN0aW9uc1NoYXJlZCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVBRF9DT05ORUNUSU9OU19TSEFSRURfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoKSB7Ci0JCXJldHVybiBERUZBVUxUX1JFQURfQ09OTkVDVElPTlNfU0hBUkVEOwotCX0KLQotCS8vICoqKioqKioqKiogUmVhZENvbm5lY3Rpb25zTWluICoqKioqKioqKioKLQlwdWJsaWMgSW50ZWdlciBnZXRSZWFkQ29ubmVjdGlvbnNNaW4oKSB7Ci0JCXJldHVybiB0aGlzLnJlYWRDb25uZWN0aW9uc01pbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWFkQ29ubmVjdGlvbnNNaW4oSW50ZWdlciBuZXdSZWFkQ29ubmVjdGlvbnNNaW4pIHsKLQkJdGhpcy5wcmVTZXRQcm9wZXJ0eSgpOwotCQkKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnJlYWRDb25uZWN0aW9uc01pbjsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNaW4gPSBuZXdSZWFkQ29ubmVjdGlvbnNNaW47Ci0JCXRoaXMucHV0UHJvcGVydHkoUkVBRF9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFksIG5ld1JlYWRDb25uZWN0aW9uc01pbik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRUFEX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSwgb2xkLCBuZXdSZWFkQ29ubmVjdGlvbnNNaW4pOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkQ29ubmVjdGlvbnNNaW5DaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnJlYWRDb25uZWN0aW9uc01pbjsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNaW4gPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0UmVhZENvbm5lY3Rpb25zTWluKCkgewotCQlyZXR1cm4gREVGQVVMVF9SRUFEX0NPTk5FQ1RJT05TX01JTjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFJlYWRDb25uZWN0aW9uc01heCAqKioqKioqKioqCi0JcHVibGljIEludGVnZXIgZ2V0UmVhZENvbm5lY3Rpb25zTWF4KCkgewotCQlyZXR1cm4gdGhpcy5yZWFkQ29ubmVjdGlvbnNNYXg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVhZENvbm5lY3Rpb25zTWF4KEludGVnZXIgbmV3UmVhZENvbm5lY3Rpb25zTWF4KSB7Ci0JCXRoaXMucHJlU2V0UHJvcGVydHkoKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy5yZWFkQ29ubmVjdGlvbnNNYXg7Ci0JCXRoaXMucmVhZENvbm5lY3Rpb25zTWF4ID0gbmV3UmVhZENvbm5lY3Rpb25zTWF4OwotCQl0aGlzLnB1dFByb3BlcnR5KFJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZLCBuZXdSZWFkQ29ubmVjdGlvbnNNYXgpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVBRF9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFksIG9sZCwgbmV3UmVhZENvbm5lY3Rpb25zTWF4KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZENvbm5lY3Rpb25zTWF4Q2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJSW50ZWdlciBuZXdWYWx1ZSA9IGdldEludGVnZXJWYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy5yZWFkQ29ubmVjdGlvbnNNYXg7Ci0JCXRoaXMucmVhZENvbm5lY3Rpb25zTWF4ID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRUFEX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdFJlYWRDb25uZWN0aW9uc01heCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfUkVBRF9DT05ORUNUSU9OU19NQVg7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXcml0ZUNvbm5lY3Rpb25zTWluICoqKioqKioqKioKLQlwdWJsaWMgSW50ZWdlciBnZXRXcml0ZUNvbm5lY3Rpb25zTWluKCkgewotCQlyZXR1cm4gdGhpcy53cml0ZUNvbm5lY3Rpb25zTWluOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdyaXRlQ29ubmVjdGlvbnNNaW4oSW50ZWdlciBuZXdXcml0ZUNvbm5lY3Rpb25zTWluKSB7Ci0JCXRoaXMucHJlU2V0UHJvcGVydHkoKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy53cml0ZUNvbm5lY3Rpb25zTWluOwotCQl0aGlzLndyaXRlQ29ubmVjdGlvbnNNaW4gPSBuZXdXcml0ZUNvbm5lY3Rpb25zTWluOwotCQl0aGlzLnB1dFByb3BlcnR5KFdSSVRFX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSwgbmV3V3JpdGVDb25uZWN0aW9uc01pbik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXUklURV9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFksIG9sZCwgbmV3V3JpdGVDb25uZWN0aW9uc01pbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlQ29ubmVjdGlvbnNNaW5DaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJSW50ZWdlciBvbGQgPSB0aGlzLndyaXRlQ29ubmVjdGlvbnNNaW47Ci0JCXRoaXMud3JpdGVDb25uZWN0aW9uc01pbiA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01pbigpIHsKLQkJcmV0dXJuIERFRkFVTFRfV1JJVEVfQ09OTkVDVElPTlNfTUlOOwotCX0KLQotCS8vICoqKioqKioqKiogV3JpdGVDb25uZWN0aW9uc01heCAqKioqKioqKioqCi0JcHVibGljIEludGVnZXIgZ2V0V3JpdGVDb25uZWN0aW9uc01heCgpIHsKLQkJcmV0dXJuIHRoaXMud3JpdGVDb25uZWN0aW9uc01heDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXcml0ZUNvbm5lY3Rpb25zTWF4KEludGVnZXIgbmV3V3JpdGVDb25uZWN0aW9uc01heCkgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlJbnRlZ2VyIG9sZCA9IHRoaXMud3JpdGVDb25uZWN0aW9uc01heDsKLQkJdGhpcy53cml0ZUNvbm5lY3Rpb25zTWF4ID0gbmV3V3JpdGVDb25uZWN0aW9uc01heDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShXUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFksIG5ld1dyaXRlQ29ubmVjdGlvbnNNYXgpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV1JJVEVfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZLCBvbGQsIG5ld1dyaXRlQ29ubmVjdGlvbnNNYXgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZUNvbm5lY3Rpb25zTWF4Q2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJSW50ZWdlciBuZXdWYWx1ZSA9IGdldEludGVnZXJWYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy53cml0ZUNvbm5lY3Rpb25zTWF4OwotCQl0aGlzLndyaXRlQ29ubmVjdGlvbnNNYXggPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdSSVRFX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdFdyaXRlQ29ubmVjdGlvbnNNYXgoKSB7Ci0JCXJldHVybiBERUZBVUxUX1dSSVRFX0NPTk5FQ1RJT05TX01BWDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlICoqKioqKioqKioKLQkKLQlwdWJsaWMgRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgZ2V0RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUoKSB7Ci0JCXJldHVybiB0aGlzLmV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRFeGNsdXNpdmVDb25uZWN0aW9uTW9kZShFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBuZXdFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSkgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBvbGQgPSB0aGlzLmV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlOwotCQl0aGlzLmV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlID0gbmV3RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGU7Ci0JCXRoaXMucHV0UHJvcGVydHkoRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9QUk9QRVJUWSwgbmV3RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9QUk9QRVJUWSwgb2xkLCBuZXdFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgbmV3VmFsdWUgPSBnZXRFbnVtVmFsdWVPZihzdHJpbmdWYWx1ZSwgRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUudmFsdWVzKCkpOwotCQlFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBvbGQgPSB0aGlzLmV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlOwotCQl0aGlzLmV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlIGdldERlZmF1bHRFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExhenlDb25uZWN0aW9uICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRMYXp5Q29ubmVjdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMubGF6eUNvbm5lY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGF6eUNvbm5lY3Rpb24oQm9vbGVhbiBuZXdMYXp5Q29ubmVjdGlvbikgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMubGF6eUNvbm5lY3Rpb247Ci0JCXRoaXMubGF6eUNvbm5lY3Rpb24gPSBuZXdMYXp5Q29ubmVjdGlvbjsKLQkJdGhpcy5wdXRQcm9wZXJ0eShMQVpZX0NPTk5FQ1RJT05fUFJPUEVSVFksIG5ld0xhenlDb25uZWN0aW9uKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKExBWllfQ09OTkVDVElPTl9QUk9QRVJUWSwgb2xkLCBuZXdMYXp5Q29ubmVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxhenlDb25uZWN0aW9uQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy5sYXp5Q29ubmVjdGlvbjsKLQkJdGhpcy5sYXp5Q29ubmVjdGlvbiA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTEFaWV9DT05ORUNUSU9OX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0TGF6eUNvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiBERUZBVUxUX0xBWllfQ09OTkVDVElPTjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtDb25uZWN0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rQ29ubmVjdGlvbjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGU2YWExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtDb25uZWN0aW9uMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5KcGFDb25uZWN0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ29ubmVjdGlvbjJfMDsKLQotCi0vKioKLSAqICBFY2xpcHNlTGlua0Nvbm5lY3Rpb24yXzAKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ29ubmVjdGlvbjJfMCBleHRlbmRzIEVjbGlwc2VMaW5rQ29ubmVjdGlvbgotCWltcGxlbWVudHMgQ29ubmVjdGlvbjJfMAotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBFY2xpcHNlTGlua0Nvbm5lY3Rpb24yXzAoUGVyc2lzdGVuY2VVbml0Ml8wIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGF0YWJhc2VDb25uZWN0aW9uUHJvcGVydGllcygpIHsKLQkJdGhpcy5kcml2ZXIgPSAKLQkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX0RSSVZFUik7Ci0JCXRoaXMudXJsID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19VUkwpOwotCQl0aGlzLnVzZXIgPSAKLQkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VTRVIpOwotCQl0aGlzLnBhc3N3b3JkID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19QQVNTV09SRCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvc3RJbml0aWFsaXplKCkgewotCQlzdXBlci5wb3N0SW5pdGlhbGl6ZSgpOwotCi0JCS8vIEluaXRpYWxpemUgUHJvcGVydGllcyBmcm9tIGxlZ2FjeSBwcm9wZXJ0aWVzIG5hbWVzIGlmIG5vdCBpbml0aWFsaXplZC4KLQkJaWYodGhpcy5wZXJzaXN0ZW5jZVVuaXRLZXlFeGlzdHMoRUNMSVBTRUxJTktfRFJJVkVSKSkgewotCQkJaWYodGhpcy5kcml2ZXIgPT0gbnVsbCkgewotCQkJCXRoaXMuZHJpdmVyID0gdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19EUklWRVIpOwotCQkJfQotCQl9Ci0JCWlmKHRoaXMucGVyc2lzdGVuY2VVbml0S2V5RXhpc3RzKEVDTElQU0VMSU5LX1VSTCkpIHsKLQkJCWlmKHRoaXMudXJsID09IG51bGwpIHsKLQkJCQl0aGlzLnVybCA9IHRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfVVJMKTsKLQkJCX0KLQkJfQotCQlpZih0aGlzLnBlcnNpc3RlbmNlVW5pdEtleUV4aXN0cyhFQ0xJUFNFTElOS19VU0VSKSkgewotCQkJaWYodGhpcy51c2VyID09IG51bGwpIHsKLQkJCQl0aGlzLnVzZXIgPSB0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1VTRVIpOwotCQkJfQotCQl9Ci0JCWlmKHRoaXMucGVyc2lzdGVuY2VVbml0S2V5RXhpc3RzKEVDTElQU0VMSU5LX1BBU1NXT1JEKSkgewotCQkJaWYodGhpcy5wYXNzd29yZCA9PSBudWxsKSB7Ci0JCQkJdGhpcy5wYXNzd29yZCA9IHRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfUEFTU1dPUkQpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlQ2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJc3VwZXIucHJvcGVydHlWYWx1ZUNoYW5nZWQocHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7Ci0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX0RSSVZFUikpIHsKLQkJCXRoaXMuZHJpdmVyQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfVVJMKSkgewotCQkJdGhpcy51cmxDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19VU0VSKSkgewotCQkJdGhpcy51c2VyQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfUEFTU1dPUkQpKSB7Ci0JCQl0aGlzLnBhc3N3b3JkQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJvcGVydHlSZW1vdmVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJc3VwZXIucHJvcGVydHlSZW1vdmVkKHByb3BlcnR5TmFtZSk7Ci0JCQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfRFJJVkVSKSkgewotCQkJdGhpcy5kcml2ZXJDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VSTCkpIHsKLQkJCXRoaXMudXJsQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19VU0VSKSkgewotCQkJdGhpcy51c2VyQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19QQVNTV09SRCkpIHsKLQkJCXRoaXMucGFzc3dvcmRDaGFuZ2VkKG51bGwpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGF0YWJhc2VDb25uZWN0aW9uUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfRFJJVkVSLAotCQkJQ29ubmVjdGlvbi5EUklWRVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19VUkwsCi0JCQlDb25uZWN0aW9uLlVSTF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VTRVIsCi0JCQlDb25uZWN0aW9uLlVTRVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19QQVNTV09SRCwKLQkJCUNvbm5lY3Rpb24uUEFTU1dPUkRfUFJPUEVSVFkpOwotCX0KLQkKLQkvKioKLQkgKiBNaWdyYXRlIHByb3BlcnRpZXMgbmFtZXMgdG8gRWNsaXBzZUxpbmsgMi4wIG5hbWVzLgotCSAqLwotCXByaXZhdGUgdm9pZCBtaWdyYXRlUHJvcGVydGllcygpIHsKLQkJdGhpcy5taWdyYXRlU3RyaW5nUHJvcGVydHkoRUNMSVBTRUxJTktfRFJJVkVSLCBKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfRFJJVkVSLCB0aGlzLmRyaXZlcik7Ci0JCXRoaXMubWlncmF0ZVN0cmluZ1Byb3BlcnR5KEVDTElQU0VMSU5LX1VSTCwgSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VSTCwgdGhpcy51cmwpOwotCQl0aGlzLm1pZ3JhdGVTdHJpbmdQcm9wZXJ0eShFQ0xJUFNFTElOS19VU0VSLCBKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfVVNFUiwgdGhpcy51c2VyKTsKLQkJdGhpcy5taWdyYXRlU3RyaW5nUHJvcGVydHkoRUNMSVBTRUxJTktfUEFTU1dPUkQsIEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19QQVNTV09SRCwgdGhpcy5wYXNzd29yZCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBtaWdyYXRlU3RyaW5nUHJvcGVydHkoU3RyaW5nIG9sZEtleSwgU3RyaW5nIG5ld0tleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmKHRoaXMucGVyc2lzdGVuY2VVbml0S2V5RXhpc3RzKG9sZEtleSkpIHsKLQkJCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkucmVtb3ZlUHJvcGVydHkob2xkS2V5KTsKLQkJCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0UHJvcGVydHkobmV3S2V5LCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLSAgICAgKiBNaWdyYXRlIGFsbCBwcm9wZXJ0aWVzIG5hbWVzIGJlZm9yZSB0aGUgcHJvcGVydHkgaXMgc2V0Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcHJlU2V0UHJvcGVydHkoKSB7Ci0JCQotCQl0aGlzLm1pZ3JhdGVQcm9wZXJ0aWVzKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua0N1c3RvbWl6YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNWFmMDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua0N1c3RvbWl6YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DdXN0b21pemF0aW9uRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlByb2ZpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLldlYXZpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24gZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLQlpbXBsZW1lbnRzIEN1c3RvbWl6YXRpb24KLXsKLQkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMgKioqKioqKioqKgotCXByaXZhdGUgQm9vbGVhbiB0aHJvd0V4Y2VwdGlvbnM7Ci0JcHJpdmF0ZSBXZWF2aW5nIHdlYXZpbmc7Ci0JcHJpdmF0ZSBCb29sZWFuIHdlYXZpbmdMYXp5OwotCXByaXZhdGUgQm9vbGVhbiB3ZWF2aW5nQ2hhbmdlVHJhY2tpbmc7Ci0JcHJpdmF0ZSBCb29sZWFuIHdlYXZpbmdGZXRjaEdyb3VwczsKLQlwcml2YXRlIEJvb2xlYW4gd2VhdmluZ0ludGVybmFsOwotCXByaXZhdGUgQm9vbGVhbiB3ZWF2aW5nRWFnZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIHZhbGlkYXRpb25Pbmx5OwotCXByaXZhdGUgQm9vbGVhbiB2YWxpZGF0ZVNjaGVtYTsKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzZXNzaW9uQ3VzdG9taXplcnM7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvZmlsZXI7IC8vIHN0b3JpbmcgRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZSBzaW5jZSB2YWx1ZSBjYW4gYmUgUHJvZmlsZXIgb3IgY3VzdG9tIGNsYXNzCi0JcHJpdmF0ZSBTdHJpbmcgZXhjZXB0aW9uSGFuZGxlcjsKLQotCXByaXZhdGUgTGlzdDxDdXN0b21pemF0aW9uRW50aXR5PiBlbnRpdGllczsKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgewotCQl0aGlzLmVudGl0aWVzID0gbmV3IEFycmF5TGlzdDxDdXN0b21pemF0aW9uRW50aXR5PigpOwotCi0JCXRoaXMudGhyb3dFeGNlcHRpb25zID0gCi0JCQl0aGlzLmdldEJvb2xlYW5WYWx1ZShFQ0xJUFNFTElOS19USFJPV19FWENFUFRJT05TKTsKLQkJdGhpcy53ZWF2aW5nID0gCi0JCQl0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19XRUFWSU5HLCBXZWF2aW5nLnZhbHVlcygpKTsKLQkJdGhpcy53ZWF2aW5nTGF6eSA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfV0VBVklOR19MQVpZKTsKLQkJdGhpcy53ZWF2aW5nQ2hhbmdlVHJhY2tpbmcgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1dFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HKTsKLQkJdGhpcy53ZWF2aW5nRmV0Y2hHcm91cHMgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1dFQVZJTkdfRkVUQ0hfR1JPVVBTKTsKLQkJdGhpcy53ZWF2aW5nSW50ZXJuYWwgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1dFQVZJTkdfSU5URVJOQUwpOwotCQl0aGlzLndlYXZpbmdFYWdlciA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfV0VBVklOR19FQUdFUik7Ci0JCXRoaXMudmFsaWRhdGlvbk9ubHkgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1ZBTElEQVRJT05fT05MWSk7Ci0JCXRoaXMudmFsaWRhdGVTY2hlbWEgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1ZBTElEQVRFX1NDSEVNQSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNlc3Npb25DdXN0b21pemVyc0Zyb21QZXJzaXN0ZW5jZVVuaXQoKTsKLQotCQlTZXQ8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBwcm9wZXJ0aWVzID0gCi0JCQl0aGlzLmdldFByb3BlcnRpZXNTZXRXaXRoUHJlZml4KEVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUVudGl0aWVzQ3VzdG9taXplckNsYXNzKHByb3BlcnRpZXMpOwotCQkKLQkJdGhpcy5wcm9maWxlciA9IHRoaXMuZ2V0UHJvZmlsZXJQcm9wZXJ0eVZhbHVlKCk7Ci0JCXRoaXMuZXhjZXB0aW9uSGFuZGxlciA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19FWENFUFRJT05fSEFORExFUik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTZXNzaW9uQ3VzdG9taXplcnNGcm9tUGVyc2lzdGVuY2VVbml0KCkgewotCQl0aGlzLnNlc3Npb25DdXN0b21pemVycyA9IHRoaXMuYnVpbGRTZXNzaW9uQ3VzdG9taXplcnMoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFNlc3Npb25DdXN0b21pemVycygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY29udmVydFRvVmFsdWVzKHRoaXMuZ2V0UHJvcGVydGllc1NldFdpdGhQcmVmaXgoRUNMSVBTRUxJTktfU0VTU0lPTl9DVVNUT01JWkVSKSkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBjb252ZXJ0VG9WYWx1ZXMoSXRlcmFibGU8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBwcm9wZXJ0aWVzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHksIFN0cmluZz4ocHJvcGVydGllcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJCQlyZXR1cm4gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUVudGl0aWVzQ3VzdG9taXplckNsYXNzKFNldDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IGRlc2NyaXB0b3JDdXN0b21pemVyUHJvcGVydGllcykgewotCQlmb3IgKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBkZXNjcmlwdG9yQ3VzdG9taXplclByb3BlcnR5IDogZGVzY3JpcHRvckN1c3RvbWl6ZXJQcm9wZXJ0aWVzKSB7Ci0JCQl0aGlzLnNldEVudGl0eURlc2NyaXB0b3JDdXN0b21pemVyT2YoZGVzY3JpcHRvckN1c3RvbWl6ZXJQcm9wZXJ0eSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBQcm9maWxlciBwcm9wZXJ0eSBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFByb2ZpbGVyUHJvcGVydHlWYWx1ZSgpIHsKLQotCQlTdHJpbmcgdmFsdWUgPSB0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1BST0ZJTEVSKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwkvLyBubyBwcm9wZXJ0eSBmb3VuZAotCQl9Ci0JCVByb2ZpbGVyIHN0YW5kYXJkUHJvZmlsZXIgPSB0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19QUk9GSUxFUiwgUHJvZmlsZXIudmFsdWVzKCkpOwotCQlyZXR1cm4gKHN0YW5kYXJkUHJvZmlsZXIgPT0gbnVsbCkgPyB2YWx1ZSA6IGdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihzdGFuZGFyZFByb2ZpbGVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlQ2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVEhST1dfRVhDRVBUSU9OUykpIHsKLQkJCXRoaXMudGhyb3dFeGNlcHRpb25zQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HKSkgewotCQkJdGhpcy53ZWF2aW5nQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HX0xBWlkpKSB7Ci0JCQl0aGlzLndlYXZpbmdMYXp5Q2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HX0NIQU5HRV9UUkFDS0lORykpIHsKLQkJCXRoaXMud2VhdmluZ0NoYW5nZVRyYWNraW5nQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HX0ZFVENIX0dST1VQUykpIHsKLQkJCXRoaXMud2VhdmluZ0ZldGNoR3JvdXBzQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HX0lOVEVSTkFMKSkgewotCQkJdGhpcy53ZWF2aW5nSW50ZXJuYWxDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dFQVZJTkdfRUFHRVIpKSB7Ci0JCQl0aGlzLndlYXZpbmdFYWdlckNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVkFMSURBVElPTl9PTkxZKSkgewotCQkJdGhpcy52YWxpZGF0aW9uT25seUNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVkFMSURBVEVfU0NIRU1BKSkgewotCQkJdGhpcy52YWxpZGF0ZVNjaGVtYUNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfU0VTU0lPTl9DVVNUT01JWkVSKSkgewotCQkJdGhpcy5zZXNzaW9uQ3VzdG9taXplcnNDaGFuZ2VkKCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSKSkgewotCQkJdGhpcy5kZXNjcmlwdG9yQ3VzdG9taXplckNoYW5nZWQocHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19QUk9GSUxFUikpIHsKLQkJCXRoaXMucHJvZmlsZXJDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0VYQ0VQVElPTl9IQU5ETEVSKSkgewotCQkJdGhpcy5leGNlcHRpb25IYW5kbGVyQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RIUk9XX0VYQ0VQVElPTlMpKSB7Ci0JCQl0aGlzLnRocm93RXhjZXB0aW9uc0NoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HKSkgewotCQkJdGhpcy53ZWF2aW5nQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dFQVZJTkdfTEFaWSkpIHsKLQkJCXRoaXMud2VhdmluZ0xhenlDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfV0VBVklOR19DSEFOR0VfVFJBQ0tJTkcpKSB7Ci0JCQl0aGlzLndlYXZpbmdDaGFuZ2VUcmFja2luZ0NoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HX0ZFVENIX0dST1VQUykpIHsKLQkJCXRoaXMud2VhdmluZ0ZldGNoR3JvdXBzQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dFQVZJTkdfSU5URVJOQUwpKSB7Ci0JCQl0aGlzLndlYXZpbmdJbnRlcm5hbENoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HX0VBR0VSKSkgewotCQkJdGhpcy53ZWF2aW5nRWFnZXJDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVkFMSURBVElPTl9PTkxZKSkgewotCQkJdGhpcy52YWxpZGF0aW9uT25seUNoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19WQUxJREFURV9TQ0hFTUEpKSB7Ci0JCQl0aGlzLnZhbGlkYXRlU2NoZW1hQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1NFU1NJT05fQ1VTVE9NSVpFUikpIHsKLQkJCXRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzQ2hhbmdlZCgpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUikpIHsKLQkJCXRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXJDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19QUk9GSUxFUikpIHsKLQkJCXRoaXMucHJvZmlsZXJDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRVhDRVBUSU9OX0hBTkRMRVIpKSB7Ci0JCQl0aGlzLmV4Y2VwdGlvbkhhbmRsZXJDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIEFkZHMgcHJvcGVydHkgbmFtZXMga2V5L3ZhbHVlIHBhaXJzLCB3aGVyZTogCi0JICogCQlrZXkgPSBFY2xpcHNlTGluayBwcm9wZXJ0eSBrZXkKLQkgKiAJCXZhbHVlID0gcHJvcGVydHkgaWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1RIUk9XX0VYQ0VQVElPTlMsCi0JCQlUSFJPV19FWENFUFRJT05TX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19XRUFWSU5HLAotCQkJV0VBVklOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfV0VBVklOR19MQVpZLAotCQkJV0VBVklOR19MQVpZX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19XRUFWSU5HX0NIQU5HRV9UUkFDS0lORywKLQkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19XRUFWSU5HX0ZFVENIX0dST1VQUywKLQkJCVdFQVZJTkdfRkVUQ0hfR1JPVVBTX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19XRUFWSU5HX0lOVEVSTkFMLAotCQkJV0VBVklOR19JTlRFUk5BTF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfV0VBVklOR19FQUdFUiwKLQkJCVdFQVZJTkdfRUFHRVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1ZBTElEQVRJT05fT05MWSwKLQkJCVZBTElEQVRJT05fT05MWV9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVkFMSURBVEVfU0NIRU1BLAotCQkJVkFMSURBVEVfU0NIRU1BX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19TRVNTSU9OX0NVU1RPTUlaRVIsCi0JCQlTRVNTSU9OX0NVU1RPTUlaRVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1BST0ZJTEVSLAotCQkJUFJPRklMRVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0VYQ0VQVElPTl9IQU5ETEVSLAotCQkJRVhDRVBUSU9OX0hBTkRMRVJfUFJPUEVSVFkpOwotCi0JCS8vIERvbid0IG5lZWQgdG8gaW5pdGlhbGl6ZSBwcm9wZXJ0eU5hbWVzIGZvcjogCi0JCS8vIGRlc2NyaXB0b3JDdXN0b21pemVyUHJvcGVydHkKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdXNlZCBmb3IgaWRlbnRpZnlpbmcgdGhlIGdpdmVuIHByb3BlcnR5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGl0ZW1Jc1Byb3BlcnR5KFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBpdGVtKSB7Ci0JCWJvb2xlYW4gaXNQcm9wZXJ0eSA9IHN1cGVyLml0ZW1Jc1Byb3BlcnR5KGl0ZW0pOwotCQkKLQkJaWYgKCAhIGlzUHJvcGVydHkgJiYgaXRlbS5nZXROYW1lKCkgIT0gbnVsbCkgewotCQkJCWlmIChpdGVtLmdldE5hbWUoKS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBpc1Byb3BlcnR5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb3BlcnR5IG5hbWUgdXNlZCBmb3IgY2hhbmdlIG5vdGlmaWNhdGlvbiBvZiB0aGUgZ2l2ZW4KLQkgKiBwcm9wZXJ0eS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHByb3BlcnR5SWRPZihQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzdXBlci5wcm9wZXJ0eUlkT2YocHJvcGVydHkpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJaWYgKHByb3BlcnR5LmdldE5hbWUoKS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUikpIHsKLQkJCQlyZXR1cm4gREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIEN1c3RvbWl6YXRpb25FbnRpdHkgYWRkRW50aXR5KFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCWlmICh0aGlzLmVudGl0eUV4aXN0cyhlbnRpdHlOYW1lKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRHVwbGljYXRlIGVudGl0eTogIiArIGVudGl0eU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJQ3VzdG9taXphdGlvbkVudGl0eSBuZXdFbnRpdHkgPSB0aGlzLmJ1aWxkRW50aXR5KGVudGl0eU5hbWUpOwotCQl0aGlzLmFkZEl0ZW1Ub0xpc3QobmV3RW50aXR5LCB0aGlzLmVudGl0aWVzLCBFTlRJVElFU19MSVNUKTsKLQkJcmV0dXJuIG5ld0VudGl0eTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRpdHkoU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJaWYgKCAhIHRoaXMuZW50aXR5RXhpc3RzKGVudGl0eU5hbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ3VzdG9taXphdGlvbkVudGl0eSBlbnRpdHkgPSB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpOwotCQl0aGlzLmNsZWFyRW50aXR5KGVudGl0eSk7Ci0JCXRoaXMucmVtb3ZlRW50aXR5KGVudGl0eSk7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBUaHJvd0V4Y2VwdGlvbnMgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFRocm93RXhjZXB0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMudGhyb3dFeGNlcHRpb25zOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUaHJvd0V4Y2VwdGlvbnMoQm9vbGVhbiBuZXdUaHJvd0V4Y2VwdGlvbnMpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnRocm93RXhjZXB0aW9uczsKLQkJdGhpcy50aHJvd0V4Y2VwdGlvbnMgPSBuZXdUaHJvd0V4Y2VwdGlvbnM7Ci0JCXRoaXMucHV0UHJvcGVydHkoVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSwgbmV3VGhyb3dFeGNlcHRpb25zKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFksIG9sZCwgbmV3VGhyb3dFeGNlcHRpb25zKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGhyb3dFeGNlcHRpb25zQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy50aHJvd0V4Y2VwdGlvbnM7Ci0JCXRoaXMudGhyb3dFeGNlcHRpb25zID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUSFJPV19FWENFUFRJT05TX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFRocm93RXhjZXB0aW9ucygpIHsKLQkJcmV0dXJuIERFRkFVTFRfVEhST1dfRVhDRVBUSU9OUzsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFdlYXZpbmdMYXp5ICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRXZWF2aW5nTGF6eSgpIHsKLQkJcmV0dXJuIHRoaXMud2VhdmluZ0xhenk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V2VhdmluZ0xhenkoQm9vbGVhbiBuZXdXZWF2aW5nTGF6eSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMud2VhdmluZ0xhenk7Ci0JCXRoaXMud2VhdmluZ0xhenkgPSBuZXdXZWF2aW5nTGF6eTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShXRUFWSU5HX0xBWllfUFJPUEVSVFksIG5ld1dlYXZpbmdMYXp5KTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdFQVZJTkdfTEFaWV9QUk9QRVJUWSwgb2xkLCBuZXdXZWF2aW5nTGF6eSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdlYXZpbmdMYXp5Q2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy53ZWF2aW5nTGF6eTsKLQkJdGhpcy53ZWF2aW5nTGF6eSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV0VBVklOR19MQVpZX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0V2VhdmluZ0xhenkoKSB7Ci0JCXJldHVybiBERUZBVUxUX1dFQVZJTkdfTEFaWTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFdlYXZpbmdDaGFuZ2VUcmFja2luZyAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0V2VhdmluZ0NoYW5nZVRyYWNraW5nKCkgewotCQlyZXR1cm4gdGhpcy53ZWF2aW5nQ2hhbmdlVHJhY2tpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V2VhdmluZ0NoYW5nZVRyYWNraW5nKEJvb2xlYW4gbmV3V2VhdmluZ0NoYW5nZVRyYWNraW5nKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy53ZWF2aW5nQ2hhbmdlVHJhY2tpbmc7Ci0JCXRoaXMud2VhdmluZ0NoYW5nZVRyYWNraW5nID0gbmV3V2VhdmluZ0NoYW5nZVRyYWNraW5nOwotCQl0aGlzLnB1dFByb3BlcnR5KFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZLCBuZXdXZWF2aW5nQ2hhbmdlVHJhY2tpbmcpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfUFJPUEVSVFksIG9sZCwgbmV3V2VhdmluZ0NoYW5nZVRyYWNraW5nKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd2VhdmluZ0NoYW5nZVRyYWNraW5nQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy53ZWF2aW5nQ2hhbmdlVHJhY2tpbmc7Ci0JCXRoaXMud2VhdmluZ0NoYW5nZVRyYWNraW5nID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFdlYXZpbmdDaGFuZ2VUcmFja2luZygpIHsKLQkJcmV0dXJuIERFRkFVTFRfV0VBVklOR19DSEFOR0VfVFJBQ0tJTkc7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXZWF2aW5nRmV0Y2hHcm91cHMgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFdlYXZpbmdGZXRjaEdyb3VwcygpIHsKLQkJcmV0dXJuIHRoaXMud2VhdmluZ0ZldGNoR3JvdXBzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdlYXZpbmdGZXRjaEdyb3VwcyhCb29sZWFuIG5ld1dlYXZpbmdGZXRjaEdyb3VwcykgewotCQlCb29sZWFuIG9sZCA9IHRoaXMud2VhdmluZ0ZldGNoR3JvdXBzOwotCQl0aGlzLndlYXZpbmdGZXRjaEdyb3VwcyA9IG5ld1dlYXZpbmdGZXRjaEdyb3VwczsKLQkJdGhpcy5wdXRQcm9wZXJ0eShXRUFWSU5HX0ZFVENIX0dST1VQU19QUk9QRVJUWSwgbmV3V2VhdmluZ0ZldGNoR3JvdXBzKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdFQVZJTkdfRkVUQ0hfR1JPVVBTX1BST1BFUlRZLCBvbGQsIG5ld1dlYXZpbmdGZXRjaEdyb3Vwcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdlYXZpbmdGZXRjaEdyb3Vwc0NoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMud2VhdmluZ0ZldGNoR3JvdXBzOwotCQl0aGlzLndlYXZpbmdGZXRjaEdyb3VwcyA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV0VBVklOR19GRVRDSF9HUk9VUFNfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRXZWF2aW5nRmV0Y2hHcm91cHMoKSB7Ci0JCXJldHVybiBERUZBVUxUX1dFQVZJTkdfRkVUQ0hfR1JPVVBTOwotCX0KLQotCS8vICoqKioqKioqKiogV2VhdmluZ0ludGVybmFsICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRXZWF2aW5nSW50ZXJuYWwoKSB7Ci0JCXJldHVybiB0aGlzLndlYXZpbmdJbnRlcm5hbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXZWF2aW5nSW50ZXJuYWwoQm9vbGVhbiBuZXdXZWF2aW5nSW50ZXJuYWwpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLndlYXZpbmdJbnRlcm5hbDsKLQkJdGhpcy53ZWF2aW5nSW50ZXJuYWwgPSBuZXdXZWF2aW5nSW50ZXJuYWw7Ci0JCXRoaXMucHV0UHJvcGVydHkoV0VBVklOR19JTlRFUk5BTF9QUk9QRVJUWSwgbmV3V2VhdmluZ0ludGVybmFsKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdFQVZJTkdfSU5URVJOQUxfUFJPUEVSVFksIG9sZCwgbmV3V2VhdmluZ0ludGVybmFsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd2VhdmluZ0ludGVybmFsQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy53ZWF2aW5nSW50ZXJuYWw7Ci0JCXRoaXMud2VhdmluZ0ludGVybmFsID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXRUFWSU5HX0lOVEVSTkFMX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0V2VhdmluZ0ludGVybmFsKCkgewotCQlyZXR1cm4gREVGQVVMVF9XRUFWSU5HX0lOVEVSTkFMOwotCX0KLQotCS8vICoqKioqKioqKiogV2VhdmluZ0VhZ2VyICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRXZWF2aW5nRWFnZXIoKSB7Ci0JCXJldHVybiB0aGlzLndlYXZpbmdFYWdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXZWF2aW5nRWFnZXIoQm9vbGVhbiBuZXdXZWF2aW5nRWFnZXIpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLndlYXZpbmdFYWdlcjsKLQkJdGhpcy53ZWF2aW5nRWFnZXIgPSBuZXdXZWF2aW5nRWFnZXI7Ci0JCXRoaXMucHV0UHJvcGVydHkoV0VBVklOR19FQUdFUl9QUk9QRVJUWSwgbmV3V2VhdmluZ0VhZ2VyKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdFQVZJTkdfRUFHRVJfUFJPUEVSVFksIG9sZCwgbmV3V2VhdmluZ0VhZ2VyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd2VhdmluZ0VhZ2VyQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy53ZWF2aW5nRWFnZXI7Ci0JCXRoaXMud2VhdmluZ0VhZ2VyID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXRUFWSU5HX0VBR0VSX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0V2VhdmluZ0VhZ2VyKCkgewotCQlyZXR1cm4gREVGQVVMVF9XRUFWSU5HX0VBR0VSOwotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbk9ubHkgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFZhbGlkYXRpb25Pbmx5KCkgewotCQlyZXR1cm4gdGhpcy52YWxpZGF0aW9uT25seTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uT25seShCb29sZWFuIG5ld1ZhbGlkYXRpb25Pbmx5KSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy52YWxpZGF0aW9uT25seTsKLQkJdGhpcy52YWxpZGF0aW9uT25seSA9IG5ld1ZhbGlkYXRpb25Pbmx5OwotCQl0aGlzLnB1dFByb3BlcnR5KFZBTElEQVRJT05fT05MWV9QUk9QRVJUWSwgbmV3VmFsaWRhdGlvbk9ubHkpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMSURBVElPTl9PTkxZX1BST1BFUlRZLCBvbGQsIG5ld1ZhbGlkYXRpb25Pbmx5KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGlvbk9ubHlDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnZhbGlkYXRpb25Pbmx5OwotCQl0aGlzLnZhbGlkYXRpb25Pbmx5ID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxJREFUSU9OX09OTFlfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRWYWxpZGF0aW9uT25seSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfVkFMSURBVElPTl9PTkxZOwotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGVTY2hlbWEgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFZhbGlkYXRlU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy52YWxpZGF0ZVNjaGVtYTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0ZVNjaGVtYShCb29sZWFuIG5ld1ZhbGlkYXRlU2NoZW1hKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy52YWxpZGF0ZVNjaGVtYTsKLQkJdGhpcy52YWxpZGF0ZVNjaGVtYSA9IG5ld1ZhbGlkYXRlU2NoZW1hOwotCQl0aGlzLnB1dFByb3BlcnR5KFZBTElEQVRFX1NDSEVNQV9QUk9QRVJUWSwgbmV3VmFsaWRhdGVTY2hlbWEpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMSURBVEVfU0NIRU1BX1BST1BFUlRZLCBvbGQsIG5ld1ZhbGlkYXRlU2NoZW1hKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVTY2hlbWFDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnZhbGlkYXRlU2NoZW1hOwotCQl0aGlzLnZhbGlkYXRlU2NoZW1hID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxJREFURV9TQ0hFTUFfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRWYWxpZGF0ZVNjaGVtYSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfVkFMSURBVEVfU0NIRU1BOwotCX0KLQotCS8vICoqKioqKioqKiogU2Vzc2lvbkN1c3RvbWl6ZXJzICoqKioqKioqKioKLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0U2Vzc2lvbkN1c3RvbWl6ZXJzKCl7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFN0cmluZz4odGhpcy5zZXNzaW9uQ3VzdG9taXplcnMpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFNlc3Npb25DdXN0b21pemVyc1NpemUoKXsKLQkJcmV0dXJuIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzZXNzaW9uQ3VzdG9taXplckV4aXN0cyhTdHJpbmcgc2Vzc2lvbkN1c3RvbWl6ZXJDbGFzc05hbWUpIHsKLQotCQlmb3IgKFN0cmluZyBzZXNzaW9uQ3VzdG9taXplciA6IHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzKSB7Ci0JCQlpZihzZXNzaW9uQ3VzdG9taXplci5lcXVhbHMoc2Vzc2lvbkN1c3RvbWl6ZXJDbGFzc05hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgYWRkU2Vzc2lvbkN1c3RvbWl6ZXIoU3RyaW5nIG5ld1Nlc3Npb25DdXN0b21pemVyQ2xhc3NOYW1lKXsKLQotCQlpZiggISB0aGlzLnNlc3Npb25DdXN0b21pemVyRXhpc3RzKG5ld1Nlc3Npb25DdXN0b21pemVyQ2xhc3NOYW1lKSkgewotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KG5ld1Nlc3Npb25DdXN0b21pemVyQ2xhc3NOYW1lLCB0aGlzLnNlc3Npb25DdXN0b21pemVycywgU0VTU0lPTl9DVVNUT01JWkVSX0xJU1QpOwotCQkJdGhpcy5wdXRQcm9wZXJ0eShTRVNTSU9OX0NVU1RPTUlaRVJfUFJPUEVSVFksIG5ld1Nlc3Npb25DdXN0b21pemVyQ2xhc3NOYW1lLCB0cnVlKTsKLQkJCXJldHVybiBuZXdTZXNzaW9uQ3VzdG9taXplckNsYXNzTmFtZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU2Vzc2lvbkN1c3RvbWl6ZXIoU3RyaW5nIGNsYXNzTmFtZSl7Ci0JCWlmICh0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChjbGFzc05hbWUsIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzLCBTRVNTSU9OX0NVU1RPTUlaRVJfTElTVCkpIHsKLQkJCXRoaXMucmVtb3ZlUHJvcGVydHkoU0VTU0lPTl9DVVNUT01JWkVSX1BST1BFUlRZLCBjbGFzc05hbWUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXNzaW9uQ3VzdG9taXplcnNDaGFuZ2VkKCkgewotCQl0aGlzLnN5bmNocm9uaXplTGlzdCh0aGlzLmJ1aWxkU2Vzc2lvbkN1c3RvbWl6ZXJzKCksIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzLCBTRVNTSU9OX0NVU1RPTUlaRVJfTElTVCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXZWF2aW5nICoqKioqKioqKioKLQkKLQlwdWJsaWMgV2VhdmluZyBnZXRXZWF2aW5nKCkgewotCQlyZXR1cm4gdGhpcy53ZWF2aW5nOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRXZWF2aW5nKFdlYXZpbmcgbmV3V2VhdmluZykgewotCQlXZWF2aW5nIG9sZCA9IHRoaXMud2VhdmluZzsKLQkJdGhpcy53ZWF2aW5nID0gbmV3V2VhdmluZzsKLQkJdGhpcy5wdXRQcm9wZXJ0eShXRUFWSU5HX1BST1BFUlRZLCBuZXdXZWF2aW5nKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdFQVZJTkdfUFJPUEVSVFksIG9sZCwgbmV3V2VhdmluZyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdlYXZpbmdDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlXZWF2aW5nIG5ld1ZhbHVlID0gZ2V0RW51bVZhbHVlT2Yoc3RyaW5nVmFsdWUsIFdlYXZpbmcudmFsdWVzKCkpOwotCQlXZWF2aW5nIG9sZCA9IHRoaXMud2VhdmluZzsKLQkJdGhpcy53ZWF2aW5nID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXRUFWSU5HX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIFdlYXZpbmcgZ2V0RGVmYXVsdFdlYXZpbmcoKSB7Ci0JCXJldHVybiBERUZBVUxUX1dFQVZJTkc7Ci0JfQotCi0JLy8gKioqKioqKioqKiBFeGNlcHRpb25IYW5kbGVyICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldEV4Y2VwdGlvbkhhbmRsZXIoKSB7Ci0JCXJldHVybiB0aGlzLmV4Y2VwdGlvbkhhbmRsZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhjZXB0aW9uSGFuZGxlcihTdHJpbmcgbmV3RXhjZXB0aW9uSGFuZGxlcikgewotCQlTdHJpbmcgb2xkID0gdGhpcy5leGNlcHRpb25IYW5kbGVyOwotCQl0aGlzLmV4Y2VwdGlvbkhhbmRsZXIgPSBuZXdFeGNlcHRpb25IYW5kbGVyOwotCQl0aGlzLnB1dFByb3BlcnR5KEVYQ0VQVElPTl9IQU5ETEVSX1BST1BFUlRZLCBuZXdFeGNlcHRpb25IYW5kbGVyKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVYQ0VQVElPTl9IQU5ETEVSX1BST1BFUlRZLCBvbGQsIG5ld0V4Y2VwdGlvbkhhbmRsZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGNlcHRpb25IYW5kbGVyQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZXhjZXB0aW9uSGFuZGxlcjsKLQkJdGhpcy5leGNlcHRpb25IYW5kbGVyID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWENFUFRJT05fSEFORExFUl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0RXhjZXB0aW9uSGFuZGxlcigpIHsKLQkJcmV0dXJuIERFRkFVTFRfRVhDRVBUSU9OX0hBTkRMRVI7Ci0JfQotCi0JLy8gKioqKioqKioqKiBEZXNjcmlwdG9yQ3VzdG9taXplciAqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCUN1c3RvbWl6YXRpb25FbnRpdHkgZW50aXR5ID0gdGhpcy5nZXRFbnRpdHlOYW1lZChlbnRpdHlOYW1lKTsKLQkJcmV0dXJuIChlbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogZW50aXR5LmdldERlc2NyaXB0b3JDdXN0b21pemVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0b3JDdXN0b21pemVyT2YoU3RyaW5nIGVudGl0eU5hbWUsIFN0cmluZyBuZXdEZXNjcmlwdG9yQ3VzdG9taXplcikgewotCQlDdXN0b21pemF0aW9uRW50aXR5IG9sZCA9IHRoaXMuc2V0RW50aXR5RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihlbnRpdHlOYW1lLCBuZXdEZXNjcmlwdG9yQ3VzdG9taXplcik7Ci0JCXRoaXMucHV0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSLCBlbnRpdHlOYW1lLCBuZXdEZXNjcmlwdG9yQ3VzdG9taXplciwgZmFsc2UpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZLCBvbGQsIHRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGVzY3JpcHRvckN1c3RvbWl6ZXJDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlTdHJpbmcgZW50aXR5TmFtZSA9IHRoaXMuZXh0cmFjdEVudGl0eU5hbWVPZihwcm9wZXJ0eU5hbWUpOwotCQlpZiggISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGVudGl0eU5hbWUpKSB7Ci0JCQlDdXN0b21pemF0aW9uRW50aXR5IG9sZCA9IHRoaXMuc2V0RW50aXR5RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihlbnRpdHlOYW1lLCBzdHJpbmdWYWx1ZSk7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZLCBvbGQsIHRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdERlc2NyaXB0b3JDdXN0b21pemVyKCkgewotCQlyZXR1cm4gREVGQVVMVF9ERVNDUklQVE9SX0NVU1RPTUlaRVI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2xkIEVudGl0eQotCSAqLwotCXByaXZhdGUgQ3VzdG9taXphdGlvbkVudGl0eSBzZXRFbnRpdHlEZXNjcmlwdG9yQ3VzdG9taXplck9mKFN0cmluZyBlbnRpdHlOYW1lLCBTdHJpbmcgZGVzY3JpcHRvckN1c3RvbWl6ZXJDbGFzc05hbWUpIHsKLQkJIGlmKCggISB0aGlzLmVudGl0eUV4aXN0cyhlbnRpdHlOYW1lKSkgJiYgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShkZXNjcmlwdG9yQ3VzdG9taXplckNsYXNzTmFtZSkpIHsKLQkJCQkvL3RoaXMgaXMgYSBwcm9wZXJ0eSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBhZGRlZCwgd2UgZG9uJ3QgbmVlZCB0byBkZWFsIHdpdGggaXQgdW50aWwgdGhlIHZhbHVlIGlzIHNldAotCQkJCSByZXR1cm4gbnVsbDsKLQkJCSB9Ci0JCUN1c3RvbWl6YXRpb25FbnRpdHkgZW50aXR5ID0gKHRoaXMuZW50aXR5RXhpc3RzKGVudGl0eU5hbWUpKSA/Ci0JCQkJCQl0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpIDoKLQkJCQkJCXRoaXMuYWRkRW50aXR5KGVudGl0eU5hbWUpOwotCQlyZXR1cm4gdGhpcy5zZXRFbnRpdHlEZXNjcmlwdG9yQ3VzdG9taXplck9mKGVudGl0eSwgZGVzY3JpcHRvckN1c3RvbWl6ZXJDbGFzc05hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvbGQgRW50aXR5Ci0JICovCi0JcHJpdmF0ZSBDdXN0b21pemF0aW9uRW50aXR5IHNldEVudGl0eURlc2NyaXB0b3JDdXN0b21pemVyT2YoQ3VzdG9taXphdGlvbkVudGl0eSBlbnRpdHksIFN0cmluZyBkZXNjcmlwdG9yQ3VzdG9taXplckNsYXNzTmFtZSkgewotCQlpZihlbnRpdHkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUN1c3RvbWl6YXRpb25FbnRpdHkgb2xkID0gZW50aXR5LmNsb25lKCk7Ci0JCWVudGl0eS5zZXREZXNjcmlwdG9yQ3VzdG9taXplcihkZXNjcmlwdG9yQ3VzdG9taXplckNsYXNzTmFtZSk7Ci0JCXJldHVybiBvbGQ7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byB1cGRhdGUgdGhlIGRlc2NyaXB0b3JDdXN0b21pemVyQ2xhc3NOYW1lIGluIGVudGl0aWVzLgotCSAqIFJldHVybnMgdGhlIG9sZCBFbnRpdHkKLQkgKi8KLQlwcml2YXRlIEN1c3RvbWl6YXRpb25FbnRpdHkgc2V0RW50aXR5RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgZGVzY3JpcHRvckN1c3RvbWl6ZXJQcm9wZXJ0eSkgewotCQlTdHJpbmcgZW50aXR5TmFtZSA9IHRoaXMuZXh0cmFjdEVudGl0eU5hbWVPZihkZXNjcmlwdG9yQ3VzdG9taXplclByb3BlcnR5KTsKLQkJaWYoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShlbnRpdHlOYW1lKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuc2V0RW50aXR5RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihlbnRpdHlOYW1lLCBkZXNjcmlwdG9yQ3VzdG9taXplclByb3BlcnR5LmdldFZhbHVlKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogUHJvZmlsZXIgKioqKioqKioqKgotCS8qKgotCSAqIFJldHVybnMgUHJvZmlsZXIgb3IgY3VzdG9tIHByb2ZpbGVyIGNsYXNzLgotCSAqIAotCSAqIEByZXR1cm4gRWNsaXBzZUxpbmsgc3RyaW5nIHZhbHVlIGZvciBQcm9maWxlciBlbnVtIG9yIGN1c3RvbSBwcm9maWxlciBjbGFzcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZmlsZXIoKSB7Ci0JCXJldHVybiB0aGlzLnByb2ZpbGVyOwotCX0KLQotCS8qKgotCSAqIFNldHMgRWNsaXBzZUxpbmsgcHJvZmlsZXIuCi0JICogCi0JICogQHBhcmFtIG5ld1Byb2ZpbGVyIC0gUHJvZmlsZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9maWxlcihQcm9maWxlciBuZXdQcm9maWxlcikgewotCQlpZiggbmV3UHJvZmlsZXIgPT0gbnVsbCkgewotCQkJdGhpcy5zZXRQcm9maWxlcl8oKFN0cmluZykgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5zZXRQcm9maWxlcl8oZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKG5ld1Byb2ZpbGVyKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBFY2xpcHNlTGluayBwcm9maWxlciBvciBjdXN0b20gcHJvZmlsZXIuCi0JICogCi0JICogQHBhcmFtIG5ld1Byb2ZpbGVyIC0KLQkgKiAgICAgICAgICAgIENhbiBiZSBhIEVjbGlwc2VMaW5rIHByb2ZpbGVyIGxpdGVyYWwgb3IKLQkgKiAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBjdXN0b20gcHJvZmlsZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvZmlsZXIoU3RyaW5nIG5ld1Byb2ZpbGVyKSB7Ci0JCWlmKCBuZXdQcm9maWxlciA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldFByb2ZpbGVyXygoU3RyaW5nKSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlQcm9maWxlciBwID0gUHJvZmlsZXIuZ2V0UHJvZmlsZXJGb3IobmV3UHJvZmlsZXIpOwotCQlpZihwID09IG51bGwpIHsJLy8gY3VzdG9tIHByb2ZpbGVyIGNsYXNzCi0JCQl0aGlzLnNldFByb2ZpbGVyXyhuZXdQcm9maWxlcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnNldFByb2ZpbGVyKHApOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRQcm9maWxlcl8oU3RyaW5nIG5ld1Byb2ZpbGVyKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnByb2ZpbGVyOwotCQl0aGlzLnByb2ZpbGVyID0gbmV3UHJvZmlsZXI7Ci0JCXRoaXMucHV0UHJvcGVydHkoUFJPRklMRVJfUFJPUEVSVFksIG5ld1Byb2ZpbGVyKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBST0ZJTEVSX1BST1BFUlRZLCBvbGQsIG5ld1Byb2ZpbGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvZmlsZXJDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5wcm9maWxlcjsKLQkJdGhpcy5wcm9maWxlciA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJPRklMRVJfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFByb2ZpbGVyKCkgewotCQlyZXR1cm4gREVGQVVMVF9QUk9GSUxFUjsKLQl9Ci0KLQotCS8vICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKLQotCS8qKgotCSAqIFNldCBhbGwgRW50aXR5IHByb3BlcnRpZXMgdG8gZGVmYXVsdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYXJFbnRpdHkoQ3VzdG9taXphdGlvbkVudGl0eSBlbnRpdHkpIHsKLQkJaWYoZW50aXR5LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBlbnRpdHlOYW1lID0gZW50aXR5LmdldE5hbWUoKTsKLQkJdGhpcy5zZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKGVudGl0eU5hbWUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEVudGl0eSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqLwotCXByaXZhdGUgQ3VzdG9taXphdGlvbkVudGl0eSBnZXRFbnRpdHlOYW1lZChTdHJpbmcgbmFtZSkgewotCQlmb3IoQ3VzdG9taXphdGlvbkVudGl0eSBlbnRpdHk6IHRoaXMuZW50aXRpZXMpIHsKLQkJCWlmKGVudGl0eS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGVudGl0eTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEN1c3RvbWl6YXRpb25FbnRpdHkgYnVpbGRFbnRpdHkoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDdXN0b21pemF0aW9uRW50aXR5KHRoaXMsIG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlRW50aXR5KEN1c3RvbWl6YXRpb25FbnRpdHkgZW50aXR5KSB7Ci0JCWlmKGVudGl0eSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChlbnRpdHksIHRoaXMuZW50aXRpZXMsIEVOVElUSUVTX0xJU1QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBFbnRpdHkgZXhpc3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZW50aXR5RXhpc3RzKFN0cmluZyBuYW1lKSB7Ci0JCWZvcihDdXN0b21pemF0aW9uRW50aXR5IGVudGl0eTogdGhpcy5lbnRpdGllcykgewotCQkJaWYoZW50aXR5LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gKioqKioqIGVudGl0aWVzIGxpc3QgKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxDdXN0b21pemF0aW9uRW50aXR5PiBnZXRFbnRpdGllcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8Q3VzdG9taXphdGlvbkVudGl0eT4odGhpcy5lbnRpdGllcyk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0RW50aXR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxDdXN0b21pemF0aW9uRW50aXR5LCBTdHJpbmc+KHRoaXMuZ2V0RW50aXRpZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShDdXN0b21pemF0aW9uRW50aXR5IGVudGl0eSkgewotCQkJCXJldHVybiBlbnRpdHkuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW50aXRpZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5lbnRpdGllcy5zaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQl0aGlzLmNyZWF0ZVNlc3Npb25DdXN0b21pemVyUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5jcmVhdGVFeGNlcHRpb25IYW5kbGVyUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVTZXNzaW9uQ3VzdG9taXplclJlbmFtZVR5cGVFZGl0cyhmaW5hbCBJVHlwZSBvcmlnaW5hbFR5cGUsIGZpbmFsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5LCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnRpZXNOYW1lZChFQ0xJUFNFTElOS19TRVNTSU9OX0NVU1RPTUlaRVIpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5KSB7Ci0JCQkJCXJldHVybiBwcm9wZXJ0eS5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVFeGNlcHRpb25IYW5kbGVyUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoRUNMSVBTRUxJTktfRVhDRVBUSU9OX0hBTkRMRVIpOwotCQlyZXR1cm4gKHByb3BlcnR5ICE9IG51bGwpID8KLQkJCQlwcm9wZXJ0eS5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQkJdGhpcy5jcmVhdGVTZXNzaW9uQ3VzdG9taXplck1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSwKLQkJCQl0aGlzLmNyZWF0ZUV4Y2VwdGlvbkhhbmRsZXJNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVTZXNzaW9uQ3VzdG9taXplck1vdmVUeXBlRWRpdHMoZmluYWwgSVR5cGUgb3JpZ2luYWxUeXBlLCBmaW5hbCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHksIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4oZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydGllc05hbWVkKEVDTElQU0VMSU5LX1NFU1NJT05fQ1VTVE9NSVpFUikpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHRyYW5zZm9ybShQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJCQkJcmV0dXJuIHByb3BlcnR5LmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVFeGNlcHRpb25IYW5kbGVyTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShFQ0xJUFNFTElOS19FWENFUFRJT05fSEFORExFUik7Ci0JCXJldHVybiAocHJvcGVydHkgIT0gbnVsbCkgPwotCQkJCXByb3BlcnR5LmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQkJdGhpcy5jcmVhdGVTZXNzaW9uQ3VzdG9taXplclJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpLAotCQkJCXRoaXMuY3JlYXRlRXhjZXB0aW9uSGFuZGxlclJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlU2Vzc2lvbkN1c3RvbWl6ZXJSZW5hbWVQYWNrYWdlRWRpdHMoZmluYWwgSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIGZpbmFsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5LCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnRpZXNOYW1lZChFQ0xJUFNFTElOS19TRVNTSU9OX0NVU1RPTUlaRVIpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5KSB7Ci0JCQkJCXJldHVybiBwcm9wZXJ0eS5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVFeGNlcHRpb25IYW5kbGVyUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShFQ0xJUFNFTElOS19FWENFUFRJT05fSEFORExFUik7Ci0JCXJldHVybiAocHJvcGVydHkgIT0gbnVsbCkgPwotCQkJCXByb3BlcnR5LmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtHZW5lcmFsUHJvcGVydGllcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua0dlbmVyYWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MzFmOTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua0dlbmVyYWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyYWxQcm9wZXJ0aWVzOwotCi0vKioKLSAqICBFY2xpcHNlTGlua0dlbmVyYWxQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0dlbmVyYWxQcm9wZXJ0aWVzIGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi0JaW1wbGVtZW50cyBHZW5lcmFsUHJvcGVydGllcwotewotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JcHJpdmF0ZSBCb29sZWFuIGV4Y2x1ZGVFY2xpcHNlbGlua09ybTsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmtHZW5lcmFsUHJvcGVydGllcyhQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgewotCQkKLQkJdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm0gPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX0VYQ0xVREVfRUNMSVBTRUxJTktfT1JNKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19FWENMVURFX0VDTElQU0VMSU5LX09STSkpIHsKLQkJCWV4Y2x1ZGVFY2xpcHNlbGlua09ybUNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0VYQ0xVREVfRUNMSVBTRUxJTktfT1JNKSkgewotCQkJZXhjbHVkZUVjbGlwc2VsaW5rT3JtQ2hhbmdlZChudWxsKTsJCQkKLQkJfQotCX0KLQkKLQkKLQkvKioKLQkgKiBBZGRzIHByb3BlcnR5IG5hbWVzIGtleS92YWx1ZSBwYWlycywgd2hlcmU6IAotCSAqIAkJa2V5ID0gRWNsaXBzZUxpbmsgcHJvcGVydHkga2V5Ci0JICogCQl2YWx1ZSA9IHByb3BlcnR5IGlkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19FWENMVURFX0VDTElQU0VMSU5LX09STSwKLQkJCUVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIEV4Y2x1ZGVFY2xpcHNlbGlua09ybSAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKCkgewotCQlyZXR1cm4gdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm07Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKEJvb2xlYW4gbmV3RXhjbHVkZUVjbGlwc2VsaW5rT3JtKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm07Ci0JCXRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtID0gbmV3RXhjbHVkZUVjbGlwc2VsaW5rT3JtOwotCQl0aGlzLnB1dFByb3BlcnR5KEVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZLCBuZXdFeGNsdWRlRWNsaXBzZWxpbmtPcm0pOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fUFJPUEVSVFksIG9sZCwgbmV3RXhjbHVkZUVjbGlwc2VsaW5rT3JtKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhjbHVkZUVjbGlwc2VsaW5rT3JtQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm07Ci0JCXRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWENMVURFX0VDTElQU0VMSU5LX09STV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfRVhDTFVERV9FQ0xJUFNFTElOS19PUk07Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua0phckZpbGVSZWYuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtKYXJGaWxlUmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxY2M1YjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua0phckZpbGVSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0SmFyRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmFyRmlsZVJlZjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmFyRmlsZVJlZiAKLQlleHRlbmRzIEFic3RyYWN0SmFyRmlsZVJlZgotewotCXB1YmxpYyBFY2xpcHNlTGlua0phckZpbGVSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sSmFyRmlsZVJlZiB4bWxKYXJGaWxlUmVmKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sSmFyRmlsZVJlZik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElQYXRoW10gYnVpbGRSdW50aW1lSmFyRmlsZVBhdGhXZWIoSVBhdGggcm9vdCwgSVBhdGggamFyRmlsZVBhdGgpIHsKLQkJSVBhdGhbXSBnZW5lcmljUGF0aCA9IHN1cGVyLmJ1aWxkUnVudGltZUphckZpbGVQYXRoV2ViKHJvb3QsIGphckZpbGVQYXRoKTsKLQkJcmV0dXJuIEFycmF5VG9vbHMucmVtb3ZlTGFzdChnZW5lcmljUGF0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rTG9nZ2luZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua0xvZ2dpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI2MmNmNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rTG9nZ2luZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Mb2dnaW5nTGV2ZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtMb2dnaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0xvZ2dpbmcgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLQlpbXBsZW1lbnRzIExvZ2dpbmcKLXsKLQkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMgKioqKioqKioqKgotCXByaXZhdGUgTG9nZ2luZ0xldmVsIGxldmVsOwotCXByaXZhdGUgQm9vbGVhbiB0aW1lc3RhbXA7Ci0JcHJpdmF0ZSBCb29sZWFuIHRocmVhZDsKLQlwcml2YXRlIEJvb2xlYW4gc2Vzc2lvbjsKLQlwcml2YXRlIEJvb2xlYW4gZXhjZXB0aW9uczsKLQlwcml2YXRlIFN0cmluZyBsb2dGaWxlTG9jYXRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgbG9nZ2VyOyAvLyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUgc2luY2UgdmFsdWUgY2FuIGJlIExvZ2dlciBvciBjdXN0b20gY2xhc3MKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmtMb2dnaW5nKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkvKioKLQkgKiBJbml0aWFsaXplcyBwcm9wZXJ0aWVzIHdpdGggdmFsdWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7Ci0JCS8vIFRPUkVWSUVXIC0gaGFuZGxlIGluY29ycmVjdCBTdHJpbmcgaW4gcGVyc2lzdGVuY2UueG1sCi0JCXRoaXMubGV2ZWwgPSAKLQkJCXRoaXMuZ2V0RW51bVZhbHVlKEVDTElQU0VMSU5LX0xFVkVMLCBMb2dnaW5nTGV2ZWwudmFsdWVzKCkpOwotCQl0aGlzLnRpbWVzdGFtcCA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfVElNRVNUQU1QKTsKLQkJdGhpcy50aHJlYWQgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1RIUkVBRCk7Ci0JCXRoaXMuc2Vzc2lvbiA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfU0VTU0lPTik7Ci0JCXRoaXMuZXhjZXB0aW9ucyA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfRVhDRVBUSU9OUyk7Ci0JCXRoaXMubG9nRmlsZUxvY2F0aW9uID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0xPR19GSUxFX0xPQ0FUSU9OKTsKLQkJCi0JCXRoaXMubG9nZ2VyID0gdGhpcy5nZXRMb2dnZXJQcm90ZXJ0eVZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgTG9nZ2VyIHByb3BlcnR5IGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TG9nZ2VyUHJvdGVydHlWYWx1ZSgpIHsKLQotCQlTdHJpbmcgdmFsdWUgPSB0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0xPR0dFUik7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsJLy8gbm8gcHJvcGVydHkgZm91bmQKLQkJfQotCQlMb2dnZXIgc3RhbmRhcmRMb2dnZXIgPSB0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19MT0dHRVIsIExvZ2dlci52YWx1ZXMoKSk7Ci0JCXJldHVybiAoc3RhbmRhcmRMb2dnZXIgPT0gbnVsbCkgPyB2YWx1ZSA6IGdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihzdGFuZGFyZExvZ2dlcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0xFVkVMKSkgewotCQkJdGhpcy5sZXZlbENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVElNRVNUQU1QKSkgewotCQkJdGhpcy50aW1lc3RhbXBDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RIUkVBRCkpIHsKLQkJCXRoaXMudGhyZWFkQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVNTSU9OKSkgewotCQkJdGhpcy5zZXNzaW9uQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19FWENFUFRJT05TKSkgewotCQkJdGhpcy5leGNlcHRpb25zQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19MT0dfRklMRV9MT0NBVElPTikpIHsKLQkJCXRoaXMubG9nRmlsZUxvY2F0aW9uQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19MT0dHRVIpKSB7Ci0JCQl0aGlzLmxvZ2dlckNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19MRVZFTCkpIHsKLQkJCXRoaXMubGV2ZWxDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVElNRVNUQU1QKSkgewotCQkJdGhpcy50aW1lc3RhbXBDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVEhSRUFEKSkgewotCQkJdGhpcy50aHJlYWRDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfU0VTU0lPTikpIHsKLQkJCXRoaXMuc2Vzc2lvbkNoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19FWENFUFRJT05TKSkgewotCQkJdGhpcy5leGNlcHRpb25zQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0xPR19GSUxFX0xPQ0FUSU9OKSkgewotCQkJdGhpcy5sb2dGaWxlTG9jYXRpb25DaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfTE9HR0VSKSkgewotCQkJdGhpcy5sb2dnZXJDaGFuZ2VkKG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiAKLQkgKiAJCWtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5IGtleQotCSAqIAkJdmFsdWUgPSBwcm9wZXJ0eSBpZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfTEVWRUwsCi0JCQlMRVZFTF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVElNRVNUQU1QLAotCQkJVElNRVNUQU1QX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19USFJFQUQsCi0JCQlUSFJFQURfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1NFU1NJT04sCi0JCQlTRVNTSU9OX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19FWENFUFRJT05TLAotCQkJRVhDRVBUSU9OU19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfTE9HX0ZJTEVfTE9DQVRJT04sCi0JCQlMT0dfRklMRV9MT0NBVElPTl9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfTE9HR0VSLAotCQkJTE9HR0VSX1BST1BFUlRZKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExvZ2dpbmdMZXZlbCAqKioqKioqKioqCi0JCi0JcHVibGljIExvZ2dpbmdMZXZlbCBnZXRMZXZlbCgpIHsKLQkJcmV0dXJuIHRoaXMubGV2ZWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExldmVsKExvZ2dpbmdMZXZlbCBuZXdMZXZlbCkgewotCQlMb2dnaW5nTGV2ZWwgb2xkID0gdGhpcy5sZXZlbDsKLQkJdGhpcy5sZXZlbCA9IG5ld0xldmVsOwotCQl0aGlzLnB1dFByb3BlcnR5KExFVkVMX1BST1BFUlRZLCBuZXdMZXZlbCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMRVZFTF9QUk9QRVJUWSwgb2xkLCBuZXdMZXZlbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxldmVsQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJTG9nZ2luZ0xldmVsIG5ld1ZhbHVlID0gZ2V0RW51bVZhbHVlT2Yoc3RyaW5nVmFsdWUsIExvZ2dpbmdMZXZlbC52YWx1ZXMoKSk7Ci0JCUxvZ2dpbmdMZXZlbCBvbGQgPSB0aGlzLmxldmVsOwotCQl0aGlzLmxldmVsID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMRVZFTF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBMb2dnaW5nTGV2ZWwgZ2V0RGVmYXVsdExldmVsKCkgewotCQlyZXR1cm4gREVGQVVMVF9MRVZFTDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFRpbWVzdGFtcCAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0VGltZXN0YW1wKCkgewotCQlyZXR1cm4gdGhpcy50aW1lc3RhbXA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKEJvb2xlYW4gbmV3VGltZXN0YW1wKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy50aW1lc3RhbXA7Ci0JCXRoaXMudGltZXN0YW1wID0gbmV3VGltZXN0YW1wOwotCQl0aGlzLnB1dFByb3BlcnR5KFRJTUVTVEFNUF9QUk9QRVJUWSwgbmV3VGltZXN0YW1wKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRJTUVTVEFNUF9QUk9QRVJUWSwgb2xkLCBuZXdUaW1lc3RhbXApOwotCX0KLQotCXByaXZhdGUgdm9pZCB0aW1lc3RhbXBDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnRpbWVzdGFtcDsKLQkJdGhpcy50aW1lc3RhbXAgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRJTUVTVEFNUF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFRpbWVzdGFtcCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfVElNRVNUQU1QOwotCX0KLQotCS8vICoqKioqKioqKiogVGhyZWFkICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRUaHJlYWQoKSB7Ci0JCXJldHVybiB0aGlzLnRocmVhZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUaHJlYWQoQm9vbGVhbiBuZXdUaHJlYWQpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnRocmVhZDsKLQkJdGhpcy50aHJlYWQgPSBuZXdUaHJlYWQ7Ci0JCXRoaXMucHV0UHJvcGVydHkoVEhSRUFEX1BST1BFUlRZLCBuZXdUaHJlYWQpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEhSRUFEX1BST1BFUlRZLCBvbGQsIG5ld1RocmVhZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRocmVhZENoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMudGhyZWFkOwotCQl0aGlzLnRocmVhZCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEhSRUFEX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0VGhyZWFkKCkgewotCQlyZXR1cm4gREVGQVVMVF9USFJFQUQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBTZXNzaW9uICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRTZXNzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5zZXNzaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlc3Npb24oQm9vbGVhbiBuZXdTZXNzaW9uKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zZXNzaW9uOwotCQl0aGlzLnNlc3Npb24gPSBuZXdTZXNzaW9uOwotCQl0aGlzLnB1dFByb3BlcnR5KFNFU1NJT05fUFJPUEVSVFksIG5ld1Nlc3Npb24pOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VTU0lPTl9QUk9QRVJUWSwgb2xkLCBuZXdTZXNzaW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2Vzc2lvbkNoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMuc2Vzc2lvbjsKLQkJdGhpcy5zZXNzaW9uID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTRVNTSU9OX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0U2Vzc2lvbigpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0VTU0lPTjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEV4Y2VwdGlvbnMgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldEV4Y2VwdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLmV4Y2VwdGlvbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhjZXB0aW9ucyhCb29sZWFuIG5ld0V4Y2VwdGlvbnMpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmV4Y2VwdGlvbnM7Ci0JCXRoaXMuZXhjZXB0aW9ucyA9IG5ld0V4Y2VwdGlvbnM7Ci0JCXRoaXMucHV0UHJvcGVydHkoRVhDRVBUSU9OU19QUk9QRVJUWSwgbmV3RXhjZXB0aW9ucyk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWENFUFRJT05TX1BST1BFUlRZLCBvbGQsIG5ld0V4Y2VwdGlvbnMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGNlcHRpb25zQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy5leGNlcHRpb25zOwotCQl0aGlzLmV4Y2VwdGlvbnMgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVYQ0VQVElPTlNfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRFeGNlcHRpb25zKCkgewotCQlyZXR1cm4gREVGQVVMVF9FWENFUFRJT05TOwotCX0KLQotCS8vICoqKioqKioqKiogbG9nRmlsZUxvY2F0aW9uICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldExvZ0ZpbGVMb2NhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMubG9nRmlsZUxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvZ0ZpbGVMb2NhdGlvbihTdHJpbmcgbmV3TG9nRmlsZUxvY2F0aW9uKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmxvZ0ZpbGVMb2NhdGlvbjsKLQkJdGhpcy5sb2dGaWxlTG9jYXRpb24gPSAoU3RyaW5nVG9vbHMuc3RyaW5nSXNOb3RFbXB0eShuZXdMb2dGaWxlTG9jYXRpb24pKSA/IAotCQkJCQkJCQkJCW5ld0xvZ0ZpbGVMb2NhdGlvbiA6IAotCQkJCQkJCQkJCXRoaXMuZ2V0RGVmYXVsdExvZ0ZpbGVMb2NhdGlvbigpOwotCQl0aGlzLnB1dFByb3BlcnR5KExPR19GSUxFX0xPQ0FUSU9OX1BST1BFUlRZLCB0aGlzLmxvZ0ZpbGVMb2NhdGlvbik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMT0dfRklMRV9MT0NBVElPTl9QUk9QRVJUWSwgb2xkLCB0aGlzLmxvZ0ZpbGVMb2NhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvZ0ZpbGVMb2NhdGlvbkNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmxvZ0ZpbGVMb2NhdGlvbjsKLQkJdGhpcy5sb2dGaWxlTG9jYXRpb24gPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKExPR19GSUxFX0xPQ0FUSU9OX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRMb2dGaWxlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBERUZBVUxUX0xPR19GSUxFX0xPQ0FUSU9OOwotCX0KLQotCS8vICoqKioqKioqKiogTG9nZ2VyICoqKioqKioqKioKLQkvKioKLQkgKiBSZXR1cm5zIExvZ2dlciBvciBjdXN0b20gbG9nZ2VyIGNsYXNzLgotCSAqIAotCSAqIEByZXR1cm4gRWNsaXBzZUxpbmsgc3RyaW5nIHZhbHVlIGZvciBMb2dnZXIgZW51bSBvciBjdXN0b20gbG9nZ2VyIGNsYXNzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2dnZXIoKSB7Ci0JCXJldHVybiB0aGlzLmxvZ2dlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIEVjbGlwc2VMaW5rIGxvZ2dlci4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3TG9nZ2VyIC0gTG9nZ2VyCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9nZ2VyKExvZ2dlciBuZXdMb2dnZXIpIHsKLQkJaWYoIG5ld0xvZ2dlciA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldExvZ2dlcl8oKFN0cmluZykgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5zZXRMb2dnZXJfKGdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihuZXdMb2dnZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIEVjbGlwc2VMaW5rIGxvZ2dlciBvciBjdXN0b20gbG9nZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBuZXdMb2dnZXIgLQotCSAqICAgICAgICAgICAgQ2FuIGJlIGEgRWNsaXBzZUxpbmsgbG9nZ2VyIGxpdGVyYWwgb3IKLQkgKiAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBjdXN0b20gbG9nZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvZ2dlcihTdHJpbmcgbmV3TG9nZ2VyKSB7Ci0JCWlmKCBuZXdMb2dnZXIgPT0gbnVsbCkgewotCQkJdGhpcy5zZXRMb2dnZXJfKG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUxvZ2dlciBsID0gTG9nZ2VyLmdldExvZ2dlckZvcihuZXdMb2dnZXIpOwotCQlpZihsID09IG51bGwpIHsJLy8gY3VzdG9tIExvZ2dlciBjbGFzcwotCQkJdGhpcy5zZXRMb2dnZXJfKG5ld0xvZ2dlcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnNldExvZ2dlcihsKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0TG9nZ2VyXyhTdHJpbmcgbmV3TG9nZ2VyKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmxvZ2dlcjsKLQkJdGhpcy5sb2dnZXIgPSBuZXdMb2dnZXI7Ci0JCXRoaXMucHV0UHJvcGVydHkoTE9HR0VSX1BST1BFUlRZLCBuZXdMb2dnZXIpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTE9HR0VSX1BST1BFUlRZLCBvbGQsIG5ld0xvZ2dlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvZ2dlckNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmxvZ2dlcjsKLQkJdGhpcy5sb2dnZXIgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKExPR0dFUl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TG9nZ2VyKCkgewotCQlyZXR1cm4gREVGQVVMVF9MT0dHRVI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVMb2dnZXJSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUxvZ2dlclJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCS8vVE9ETyBzZWVtcyBsaWtlIHdlIHNob3VsZCBoYXZlIHRoZSBQcm9wZXJ0eSBzdG9yZWQgaW4gYSBTZXNzaW9uQ3VzdG9taXplciBvYmplY3QgaW5zdGVhZCBvZiBoYXZpbmcgdG8gZ28gCi0JCS8vZmluZCBhbGwgb2YgdGhlIFByb3BlcnRpZXMgZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoRUNMSVBTRUxJTktfTE9HR0VSKTsKLQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCXJldHVybiBwcm9wZXJ0eS5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVMb2dnZXJNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVMb2dnZXJNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KEVDTElQU0VMSU5LX0xPR0dFUik7Ci0JCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvcGVydHkuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpOwotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZUxvZ2dlclJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTG9nZ2VyUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQkvL2ZpbmQgYWxsIG9mIHRoZSBQcm9wZXJ0aWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KEVDTElQU0VMSU5LX0xPR0dFUik7Ci0JCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvcGVydHkuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua0xvZ2dpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtMb2dnaW5nMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NjIwNzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua0xvZ2dpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTG9nZ2luZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Mb2dnaW5nTGV2ZWw7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rTG9nZ2luZzJfMAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtMb2dnaW5nMl8wIGV4dGVuZHMgRWNsaXBzZUxpbmtMb2dnaW5nCi0JaW1wbGVtZW50cyBMb2dnaW5nMl8wCi17Ci0JLy8gKioqKioqKioqKiBFY2xpcHNlTGluayBwcm9wZXJ0aWVzICoqKioqKioqKioKLQotCS8qKiAKLQkgKiBTdG9yZSBDYXRlZ29yeSBsZXZlbHMgaW4gYSBtYXAKLQkgKiBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiAKLQkgKiAJCWtleSA9IENhdGVnb3J5IHByb3BlcnR5IGlkCi0JICogCQl2YWx1ZSA9IHZhbHVlCi0JICovCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBMb2dnaW5nTGV2ZWw+IGNhdGVnb3J5VmFsdWVzOwotCi0JcHJpdmF0ZSBCb29sZWFuIGNvbm5lY3Rpb247Ci0JCi0JcHJpdmF0ZSBMb2dnaW5nTGV2ZWwgY2F0ZWdvcmllc0RlZmF1bHRWYWx1ZTsKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rTG9nZ2luZzJfMChQZXJzaXN0ZW5jZVVuaXQyXzAgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgewotCQlzdXBlci5pbml0aWFsaXplUHJvcGVydGllcygpOwotCi0JCXRoaXMuY29ubmVjdGlvbiA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfQ09OTkVDVElPTik7Ci0JCQotCQl0aGlzLmNhdGVnb3JpZXNEZWZhdWx0VmFsdWUgPSAKLQkJCXRoaXMuZ2V0RW51bVZhbHVlKEVDTElQU0VMSU5LX0xFVkVMLCBMb2dnaW5nTGV2ZWwudmFsdWVzKCkpOwotCQl0aGlzLmluaXRpYWxpemVDYXRlZ29yeShTUUxfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNhdGVnb3J5KFRSQU5TQUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQl0aGlzLmluaXRpYWxpemVDYXRlZ29yeShFVkVOVF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJdGhpcy5pbml0aWFsaXplQ2F0ZWdvcnkoQ09OTkVDVElPTl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJdGhpcy5pbml0aWFsaXplQ2F0ZWdvcnkoUVVFUllfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNhdGVnb3J5KENBQ0hFX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQl0aGlzLmluaXRpYWxpemVDYXRlZ29yeShQUk9QQUdBVElPTl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJdGhpcy5pbml0aWFsaXplQ2F0ZWdvcnkoU0VRVUVOQ0lOR19DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJdGhpcy5pbml0aWFsaXplQ2F0ZWdvcnkoRUpCX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQl0aGlzLmluaXRpYWxpemVDYXRlZ29yeShETVNfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNhdGVnb3J5KEVKQl9PUl9NRVRBREFUQV9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJdGhpcy5pbml0aWFsaXplQ2F0ZWdvcnkoTUVUQU1PREVMX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQl0aGlzLmluaXRpYWxpemVDYXRlZ29yeShXRUFWRVJfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNhdGVnb3J5KFBST1BFUlRJRVNfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNhdGVnb3J5KFNFUlZFUl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCi0JCXRoaXMuY2F0ZWdvcnlWYWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExvZ2dpbmdMZXZlbD4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc2V0IGEgbG9nZ2luZyBsZXZlbCBjYXRlZ29yeSB2YWx1ZSBmcm9tIHRoZSB2YWx1ZSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKiAKLQkgKiBrZXkgPSBDYXRlZ29yeSBwcm9wZXJ0eSBpZDsgdmFsdWUgPSB2YWx1ZSAoTG9nZ2luZ0xldmVsKQotCSAqIEBwYXJhbSBjYXRlZ29yeUlkIC0gQ2F0ZWdvcnkgcHJvcGVydHkgaWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeUlkKSB7Ci0JCVN0cmluZyBwdUtleSA9IHRoaXMucGVyc2lzdGVuY2VVbml0S2V5T2YoY2F0ZWdvcnlJZCk7Ci0JCUxvZ2dpbmdMZXZlbCBwdVZhbHVlID0gdGhpcy5nZXRFbnVtVmFsdWUocHVLZXksIExvZ2dpbmdMZXZlbC52YWx1ZXMoKSk7Ci0KLQkJdGhpcy5jYXRlZ29yeVZhbHVlcy5wdXQoY2F0ZWdvcnlJZCwgcHVWYWx1ZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCXN1cGVyLnByb3BlcnR5VmFsdWVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOwotCi0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NPTk5FQ1RJT04pKSB7Ci0JCQl0aGlzLmNvbm5lY3Rpb25DaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1NRTF9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19TUUxfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVFJBTlNBQ1RJT05fQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfVFJBTlNBQ1RJT05fQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRVZFTlRfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfRVZFTlRfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQ09OTkVDVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19DT05ORUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1FVRVJZX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX1FVRVJZX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NBQ0hFX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX0NBQ0hFX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1BST1BBR0FUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX1BST1BBR0FUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1NFUVVFTkNJTkdfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfU0VRVUVOQ0lOR19DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19FSkJfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfRUpCX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0RNU19DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19ETVNfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRUpCX09SX01FVEFEQVRBX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX0VKQl9PUl9NRVRBREFUQV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19NRVRBTU9ERUxfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfTUVUQU1PREVMX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dFQVZFUl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19XRUFWRVJfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfUFJPUEVSVElFU19DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19QUk9QRVJUSUVTX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1NFUlZFUl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19TRVJWRVJfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbmV3VmFsdWUpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXN1cGVyLnByb3BlcnR5UmVtb3ZlZChwcm9wZXJ0eU5hbWUpOwotCi0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NPTk5FQ1RJT04pKSB7Ci0JCQl0aGlzLmNvbm5lY3Rpb25DaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfU1FMX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX1NRTF9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RSQU5TQUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX1RSQU5TQUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRVZFTlRfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfRVZFTlRfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DT05ORUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX0NPTk5FQ1RJT05fQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19RVUVSWV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19RVUVSWV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NBQ0hFX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX0NBQ0hFX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfUFJPUEFHQVRJT05fQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfUFJPUEFHQVRJT05fQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVFVRU5DSU5HX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX1NFUVVFTkNJTkdfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19FSkJfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfRUpCX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRE1TX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX0RNU19DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0VKQl9PUl9NRVRBREFUQV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19FSkJfT1JfTUVUQURBVEFfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19NRVRBTU9ERUxfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfTUVUQU1PREVMX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfV0VBVkVSX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX1dFQVZFUl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1BST1BFUlRJRVNfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfUFJPUEVSVElFU19DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1NFUlZFUl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19TRVJWRVJfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHByb3BlcnR5IG5hbWVzIGtleS92YWx1ZSBwYWlycywgd2hlcmU6IAotCSAqIAkJa2V5ID0gRWNsaXBzZUxpbmsgcHJvcGVydHkga2V5Ci0JICogCQl2YWx1ZSA9IHByb3BlcnR5IGlkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0NPTk5FQ1RJT04sCi0JCQlDT05ORUNUSU9OX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19TUUxfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwKLQkJCVNRTF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19UUkFOU0FDVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLAotCQkJVFJBTlNBQ1RJT05fQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfRVZFTlRfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwKLQkJCUVWRU5UX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0NPTk5FQ1RJT05fQ0FURUdPUllfTE9HR0lOR19MRVZFTCwKLQkJCUNPTk5FQ1RJT05fQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfUVVFUllfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwKLQkJCVFVRVJZX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0NBQ0hFX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsCi0JCQlDQUNIRV9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19QUk9QQUdBVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLAotCQkJUFJPUEFHQVRJT05fQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfU0VRVUVOQ0lOR19DQVRFR09SWV9MT0dHSU5HX0xFVkVMLAotCQkJU0VRVUVOQ0lOR19DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19FSkJfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwKLQkJCUVKQl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19ETVNfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwKLQkJCURNU19DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19FSkJfT1JfTUVUQURBVEFfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwKLQkJCUVKQl9PUl9NRVRBREFUQV9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19NRVRBTU9ERUxfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwKLQkJCU1FVEFNT0RFTF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19XRUFWRVJfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwKLQkJCVdFQVZFUl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19QUk9QRVJUSUVTX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsCi0JCQlQUk9QRVJUSUVTX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1NFUlZFUl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLAotCQkJU0VSVkVSX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCX0KLQotCS8vICoqKioqKioqKiogQ29ubmVjdGlvbiAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0Q29ubmVjdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uKEJvb2xlYW4gbmV3Q29ubmVjdGlvbikgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuY29ubmVjdGlvbjsKLQkJdGhpcy5jb25uZWN0aW9uID0gbmV3Q29ubmVjdGlvbjsKLQkJdGhpcy5wdXRQcm9wZXJ0eShDT05ORUNUSU9OX1BST1BFUlRZLCBuZXdDb25uZWN0aW9uKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTk5FQ1RJT05fUFJPUEVSVFksIG9sZCwgbmV3Q29ubmVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbm5lY3Rpb25DaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmNvbm5lY3Rpb247Ci0JCXRoaXMuY29ubmVjdGlvbiA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OTkVDVElPTl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdENvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiBERUZBVUxUX0NPTk5FQ1RJT047Ci0JfQotCQotCS8vICoqKioqKioqKiogQ2F0ZWdvcnkgTGV2ZWxzICoqKioqKioqKioKLQkKLQlwdWJsaWMgTG9nZ2luZ0xldmVsIGdldExldmVsKFN0cmluZyBjYXRlZ29yeSkgewotCi0JCXJldHVybiB0aGlzLmNhdGVnb3J5VmFsdWVzLmdldChjYXRlZ29yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGV2ZWwoU3RyaW5nIGNhdGVnb3J5LCBMb2dnaW5nTGV2ZWwgbmV3TGV2ZWwpIHsKLQkJTG9nZ2luZ0xldmVsIG9sZCA9IHRoaXMuZ2V0TGV2ZWwoY2F0ZWdvcnkpOwotCQl0aGlzLmNhdGVnb3J5VmFsdWVzLnB1dChjYXRlZ29yeSwgbmV3TGV2ZWwpOwotCQl0aGlzLnB1dFByb3BlcnR5KGNhdGVnb3J5LCBuZXdMZXZlbCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChjYXRlZ29yeSwgb2xkLCBuZXdMZXZlbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKFN0cmluZyBlY2xpcHNlbGlua0tleSwgU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCVN0cmluZyBjYXRlZ29yeSA9IHRoaXMucHJvcGVydHlJZE9mKGVjbGlwc2VsaW5rS2V5KTsKLQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkKGNhdGVnb3J5LCBzdHJpbmdWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhdGVnb3J5TG9nZ2luZ0NoYW5nZWQoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJTG9nZ2luZ0xldmVsIGVudW1WYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBMb2dnaW5nTGV2ZWwudmFsdWVzKCkpOwotCQlMb2dnaW5nTGV2ZWwgb2xkID0gdGhpcy5nZXRMZXZlbChjYXRlZ29yeSk7Ci0JCXRoaXMuY2F0ZWdvcnlWYWx1ZXMucHV0KGNhdGVnb3J5LCBlbnVtVmFsdWUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoY2F0ZWdvcnksIG9sZCwgZW51bVZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgTG9nZ2luZ0xldmVsIGdldENhdGVnb3JpZXNEZWZhdWx0TGV2ZWwoKSB7Ci0JCXJldHVybiAodGhpcy5jYXRlZ29yaWVzRGVmYXVsdFZhbHVlID09IG51bGwpID8gc3VwZXIuZ2V0RGVmYXVsdExldmVsKCkgOiB0aGlzLmNhdGVnb3JpZXNEZWZhdWx0VmFsdWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TGV2ZWwoTG9nZ2luZ0xldmVsIGxldmVsKSB7Ci0JCXN1cGVyLnNldExldmVsKGxldmVsKTsKLQkJdGhpcy5zZXREZWZhdWx0TGV2ZWwobGV2ZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRMZXZlbChMb2dnaW5nTGV2ZWwgbGV2ZWwpIHsKLQkJTG9nZ2luZ0xldmVsIG9sZCA9IHRoaXMuY2F0ZWdvcmllc0RlZmF1bHRWYWx1ZTsKLQkJdGhpcy5jYXRlZ29yaWVzRGVmYXVsdFZhbHVlID0gbGV2ZWw7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQVRFR09SSUVTX0RFRkFVTFRfTE9HR0lOR19QUk9QRVJUWSwgb2xkLCBsZXZlbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua09wdGlvbnMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOTllZDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua09wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlRhcmdldERhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlRhcmdldFNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotCi0vKioKLSAqICBFY2xpcHNlTGlua09wdGlvbnMKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3B0aW9ucyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotCWltcGxlbWVudHMgT3B0aW9ucwotewotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JcHJpdmF0ZSBTdHJpbmcgc2Vzc2lvbk5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgc2Vzc2lvbnNYbWw7Ci0JcHJpdmF0ZSBCb29sZWFuIGluY2x1ZGVEZXNjcmlwdG9yUXVlcmllczsKLQlwcml2YXRlIFN0cmluZyB0YXJnZXREYXRhYmFzZTsgLy8gc3RvcmluZyBFY2xpcHNlTGlua1N0cmluZ1ZhbHVlIHNpbmNlIHZhbHVlIGNhbiBiZSBUYXJnZXREYXRhYmFzZSBvciBjdXN0b20gY2xhc3MKLQlwcml2YXRlIFN0cmluZyB0YXJnZXRTZXJ2ZXI7IC8vIHN0b3JpbmcgRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZSBzaW5jZSB2YWx1ZSBjYW4gYmUgVGFyZ2V0U2VydmVyIG9yIGN1c3RvbSBjbGFzcwotCXByaXZhdGUgU3RyaW5nIGV2ZW50TGlzdGVuZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIHRlbXBvcmFsTXV0YWJsZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBFY2xpcHNlTGlua09wdGlvbnMoUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCS8qKgotCSAqIEluaXRpYWxpemVzIHByb3BlcnRpZXMgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUHJvcGVydGllcygpIHsKLQkJLy8gVE9SRVZJRVcgLSBoYW5kbGUgaW5jb3JyZWN0IFN0cmluZyBpbiBwZXJzaXN0ZW5jZS54bWwKLQkJdGhpcy5zZXNzaW9uTmFtZSA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19TRVNTSU9OX05BTUUpOwotCQl0aGlzLnNlc3Npb25zWG1sID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1NFU1NJT05TX1hNTCk7Ci0JCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzID0gCi0JCQl0aGlzLmdldEJvb2xlYW5WYWx1ZShFQ0xJUFNFTElOS19TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTKTsKLQkJdGhpcy50YXJnZXREYXRhYmFzZSA9IHRoaXMuZ2V0VGFyZ2V0RGF0YWJhc2VGcm9tUGVyc2lzdGVuY2VYbWwoKTsKLQkJdGhpcy50YXJnZXRTZXJ2ZXIgPSB0aGlzLmdldFRhcmdldFNlcnZlckZyb21QZXJzaXN0ZW5jZVhtbCgpOwotCQl0aGlzLmV2ZW50TGlzdGVuZXIgPSAKLQkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfU0VTU0lPTl9FVkVOVF9MSVNURU5FUik7Ci0JCXRoaXMudGVtcG9yYWxNdXRhYmxlID0gCi0JCQl0aGlzLmdldEJvb2xlYW5WYWx1ZShFQ0xJUFNFTElOS19URU1QT1JBTF9NVVRBQkxFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYXJnZXREYXRhYmFzZUZyb21QZXJzaXN0ZW5jZVhtbCgpIHsKLQotCQlTdHJpbmcgdmFsdWUgPSB0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1RBUkdFVF9EQVRBQkFTRSk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlUYXJnZXREYXRhYmFzZSBzdGFuZGFyZFRhcmdldERhdGFiYXNlID0gdGhpcy5nZXRFbnVtVmFsdWUoRUNMSVBTRUxJTktfVEFSR0VUX0RBVEFCQVNFLCBUYXJnZXREYXRhYmFzZS52YWx1ZXMoKSk7Ci0JCXJldHVybiAoc3RhbmRhcmRUYXJnZXREYXRhYmFzZSA9PSBudWxsKSA/IHZhbHVlIDogZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKHN0YW5kYXJkVGFyZ2V0RGF0YWJhc2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhcmdldFNlcnZlckZyb21QZXJzaXN0ZW5jZVhtbCgpIHsKLQotCQlTdHJpbmcgdmFsdWUgPSB0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1RBUkdFVF9TRVJWRVIpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJVGFyZ2V0U2VydmVyIHN0YW5kYXJkVGFyZ2V0U2VydmVyID0gdGhpcy5nZXRFbnVtVmFsdWUoRUNMSVBTRUxJTktfVEFSR0VUX1NFUlZFUiwgVGFyZ2V0U2VydmVyLnZhbHVlcygpKTsKLQkJcmV0dXJuIChzdGFuZGFyZFRhcmdldFNlcnZlciA9PSBudWxsKSA/IHZhbHVlIDogZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKHN0YW5kYXJkVGFyZ2V0U2VydmVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlQ2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfU0VTU0lPTl9OQU1FKSkgewotCQkJdGhpcy5zZXNzaW9uTmFtZUNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfU0VTU0lPTlNfWE1MKSkgewotCQkJdGhpcy5zZXNzaW9uc1htbENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVEFSR0VUX0RBVEFCQVNFKSkgewotCQkJdGhpcy50YXJnZXREYXRhYmFzZUNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVEFSR0VUX1NFUlZFUikpIHsKLQkJCXRoaXMudGFyZ2V0U2VydmVyQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTKSkgewotCQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1NFU1NJT05fRVZFTlRfTElTVEVORVIpKSB7Ci0JCQl0aGlzLmV2ZW50TGlzdGVuZXJDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RFTVBPUkFMX01VVEFCTEUpKSB7Ci0JCQl0aGlzLnRlbXBvcmFsTXV0YWJsZUNoYW5nZWQobmV3VmFsdWUpOwotCQl9CQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVNTSU9OX05BTUUpKSB7Ci0JCQl0aGlzLnNlc3Npb25OYW1lQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1NFU1NJT05TX1hNTCkpIHsKLQkJCXRoaXMuc2Vzc2lvbnNYbWxDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVEFSR0VUX0RBVEFCQVNFKSkgewotCQkJdGhpcy50YXJnZXREYXRhYmFzZUNoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19UQVJHRVRfU0VSVkVSKSkgewotCQkJdGhpcy50YXJnZXRTZXJ2ZXJDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUykpIHsKLQkJCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1NFU1NJT05fRVZFTlRfTElTVEVORVIpKSB7Ci0JCQl0aGlzLmV2ZW50TGlzdGVuZXJDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVEVNUE9SQUxfTVVUQUJMRSkpIHsKLQkJCXRoaXMudGVtcG9yYWxNdXRhYmxlQ2hhbmdlZChudWxsKTsKLQkJfQkKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHByb3BlcnR5IG5hbWVzIGtleS92YWx1ZSBwYWlycywgd2hlcmU6IAotCSAqIAkJa2V5ID0gRWNsaXBzZUxpbmsgcHJvcGVydHkga2V5Ci0JICogCQl2YWx1ZSA9IHByb3BlcnR5IGlkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19TRVNTSU9OX05BTUUsCi0JCQlTRVNTSU9OX05BTUVfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1NFU1NJT05TX1hNTCwKLQkJCVNFU1NJT05TX1hNTF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUywKLQkJCVNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1RBUkdFVF9EQVRBQkFTRSwKLQkJCVRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVEFSR0VUX1NFUlZFUiwKLQkJCVRBUkdFVF9TRVJWRVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1NFU1NJT05fRVZFTlRfTElTVEVORVIsCi0JCQlTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19URU1QT1JBTF9NVVRBQkxFLAotCQkJVEVNUE9SQUxfTVVUQUJMRV9QUk9QRVJUWSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNlc3Npb25OYW1lICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldFNlc3Npb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zZXNzaW9uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXNzaW9uTmFtZShTdHJpbmcgbmV3U2Vzc2lvbk5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc2Vzc2lvbk5hbWU7Ci0JCXRoaXMuc2Vzc2lvbk5hbWUgPSBuZXdTZXNzaW9uTmFtZTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShTRVNTSU9OX05BTUVfUFJPUEVSVFksIG5ld1Nlc3Npb25OYW1lKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNFU1NJT05fTkFNRV9QUk9QRVJUWSwgb2xkLCBuZXdTZXNzaW9uTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlc3Npb25OYW1lQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc2Vzc2lvbk5hbWU7Ci0JCXRoaXMuc2Vzc2lvbk5hbWUgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNFU1NJT05fTkFNRV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2Vzc2lvbk5hbWUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NFU1NJT05fTkFNRTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFNlc3Npb25zWG1sICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldFNlc3Npb25zWG1sKCkgewotCQlyZXR1cm4gdGhpcy5zZXNzaW9uc1htbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXNzaW9uc1htbChTdHJpbmcgbmV3U2Vzc2lvbnNYbWwpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc2Vzc2lvbnNYbWw7Ci0JCXRoaXMuc2Vzc2lvbnNYbWwgPSBuZXdTZXNzaW9uc1htbDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShTRVNTSU9OU19YTUxfUFJPUEVSVFksIG5ld1Nlc3Npb25zWG1sKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNFU1NJT05TX1hNTF9QUk9QRVJUWSwgb2xkLCBuZXdTZXNzaW9uc1htbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlc3Npb25zWG1sQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc2Vzc2lvbnNYbWw7Ci0JCXRoaXMuc2Vzc2lvbnNYbWwgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNFU1NJT05TX1hNTF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2Vzc2lvbnNYbWwoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NFU1NJT05TX1hNTDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCkgewotCQlyZXR1cm4gdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKEJvb2xlYW4gbmV3SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXM7Ci0JCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzID0gbmV3SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzOwotCQl0aGlzLnB1dFByb3BlcnR5KFNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFksIG5ld0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZLCBvbGQsIG5ld0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzOwotCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUzsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFRhcmdldERhdGFiYXNlICoqKioqKioqKioKLQkvKioKLQkgKiBSZXR1cm5zIFRhcmdldERhdGFiYXNlIG9yIGN1c3RvbSB0YXJnZXREYXRhYmFzZSBjbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIEVjbGlwc2VMaW5rIHN0cmluZyB2YWx1ZSBmb3IgVGFyZ2V0RGF0YWJhc2UgZW51bSBvciBjdXN0b20gdGFyZ2V0RGF0YWJhc2UgY2xhc3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpcy50YXJnZXREYXRhYmFzZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIEVjbGlwc2VMaW5rIHRhcmdldERhdGFiYXNlLgotCSAqIAotCSAqIEBwYXJhbSBuZXdUYXJnZXREYXRhYmFzZSAtIFRhcmdldERhdGFiYXNlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RGF0YWJhc2UoVGFyZ2V0RGF0YWJhc2UgbmV3VGFyZ2V0RGF0YWJhc2UpIHsKLQkJaWYoIG5ld1RhcmdldERhdGFiYXNlID09IG51bGwpIHsKLQkJCXRoaXMuc2V0VGFyZ2V0RGF0YWJhc2VfKChTdHJpbmcpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuc2V0VGFyZ2V0RGF0YWJhc2VfKGdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihuZXdUYXJnZXREYXRhYmFzZSkpOwotCX0KLQotCS8qKgotCSAqIFNldHMgRWNsaXBzZUxpbmsgdGFyZ2V0RGF0YWJhc2Ugb3IgY3VzdG9tIHRhcmdldERhdGFiYXNlLgotCSAqIAotCSAqIEBwYXJhbSBuZXdUYXJnZXREYXRhYmFzZSAtCi0JICogICAgICAgICAgICBDYW4gYmUgYSBFY2xpcHNlTGluayBUYXJnZXREYXRhYmFzZSBsaXRlcmFsIG9yCi0JICogICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY3VzdG9tIHRhcmdldERhdGFiYXNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldERhdGFiYXNlKFN0cmluZyBuZXdUYXJnZXREYXRhYmFzZSkgewotCQlpZiggbmV3VGFyZ2V0RGF0YWJhc2UgPT0gbnVsbCkgewotCQkJdGhpcy5zZXRUYXJnZXREYXRhYmFzZV8oKFN0cmluZykgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJVGFyZ2V0RGF0YWJhc2UgY3VzdG9tVGFyZ2V0RGF0YWJhc2UgPSBUYXJnZXREYXRhYmFzZS5nZXRUYXJnZXREYXRhYmFzZUZvcihuZXdUYXJnZXREYXRhYmFzZSk7Ci0JCWlmKGN1c3RvbVRhcmdldERhdGFiYXNlID09IG51bGwpIHsJLy8gY3VzdG9tIFRhcmdldERhdGFiYXNlIGNsYXNzCi0JCQl0aGlzLnNldFRhcmdldERhdGFiYXNlXyhuZXdUYXJnZXREYXRhYmFzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnNldFRhcmdldERhdGFiYXNlKGN1c3RvbVRhcmdldERhdGFiYXNlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VGFyZ2V0RGF0YWJhc2VfKFN0cmluZyBuZXdUYXJnZXREYXRhYmFzZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy50YXJnZXREYXRhYmFzZTsKLQkJdGhpcy50YXJnZXREYXRhYmFzZSA9IG5ld1RhcmdldERhdGFiYXNlOwotCQl0aGlzLnB1dFByb3BlcnR5KFRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSwgbmV3VGFyZ2V0RGF0YWJhc2UpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZLCBvbGQsIG5ld1RhcmdldERhdGFiYXNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGFyZ2V0RGF0YWJhc2VDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy50YXJnZXREYXRhYmFzZTsKLQkJdGhpcy50YXJnZXREYXRhYmFzZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFyZ2V0RGF0YWJhc2UoKSB7Ci0JCXJldHVybiBERUZBVUxUX1RBUkdFVF9EQVRBQkFTRTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFRhcmdldFNlcnZlciAqKioqKioqKioqCi0JLyoqCi0JICogUmV0dXJucyBUYXJnZXRTZXJ2ZXIgb3IgY3VzdG9tIHRhcmdldFNlcnZlciBjbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIEVjbGlwc2VMaW5rIHN0cmluZyB2YWx1ZSBmb3IgVGFyZ2V0U2VydmVyIGVudW0gb3IgY3VzdG9tIHRhcmdldFNlcnZlciBjbGFzcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0U2VydmVyKCkgewotCQlyZXR1cm4gdGhpcy50YXJnZXRTZXJ2ZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBFY2xpcHNlTGluayB0YXJnZXRTZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIG5ld1RhcmdldFNlcnZlciAtIFRhcmdldFNlcnZlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldFNlcnZlcihUYXJnZXRTZXJ2ZXIgbmV3VGFyZ2V0U2VydmVyKSB7Ci0JCWlmKCBuZXdUYXJnZXRTZXJ2ZXIgPT0gbnVsbCkgewotCQkJdGhpcy5zZXRUYXJnZXRTZXJ2ZXJfKChTdHJpbmcpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuc2V0VGFyZ2V0U2VydmVyXyhnZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YobmV3VGFyZ2V0U2VydmVyKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBFY2xpcHNlTGluayB0YXJnZXRTZXJ2ZXIgb3IgY3VzdG9tIHRhcmdldFNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGFyZ2V0U2VydmVyIC0KLQkgKiAgICAgICAgICAgIENhbiBiZSBhIEVjbGlwc2VMaW5rIFRhcmdldFNlcnZlciBsaXRlcmFsIG9yCi0JICogICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY3VzdG9tIHRhcmdldFNlcnZlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRTZXJ2ZXIoU3RyaW5nIG5ld1RhcmdldFNlcnZlcikgewotCQlpZiggbmV3VGFyZ2V0U2VydmVyID09IG51bGwpIHsKLQkJCXRoaXMuc2V0VGFyZ2V0U2VydmVyXygoU3RyaW5nKSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlUYXJnZXRTZXJ2ZXIgY3VzdG9tVGFyZ2V0U2VydmVyID0gVGFyZ2V0U2VydmVyLmdldFRhcmdldFNlcnZlckZvcihuZXdUYXJnZXRTZXJ2ZXIpOwotCQlpZihjdXN0b21UYXJnZXRTZXJ2ZXIgPT0gbnVsbCkgewkvLyBjdXN0b20gVGFyZ2V0U2VydmVyIGNsYXNzCi0JCQl0aGlzLnNldFRhcmdldFNlcnZlcl8obmV3VGFyZ2V0U2VydmVyKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuc2V0VGFyZ2V0U2VydmVyKGN1c3RvbVRhcmdldFNlcnZlcik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFRhcmdldFNlcnZlcl8oU3RyaW5nIG5ld1RhcmdldFNlcnZlcikgewotCQlTdHJpbmcgb2xkID0gdGhpcy50YXJnZXRTZXJ2ZXI7Ci0JCXRoaXMudGFyZ2V0U2VydmVyID0gbmV3VGFyZ2V0U2VydmVyOwotCQl0aGlzLnB1dFByb3BlcnR5KFRBUkdFVF9TRVJWRVJfUFJPUEVSVFksIG5ld1RhcmdldFNlcnZlcik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUQVJHRVRfU0VSVkVSX1BST1BFUlRZLCBvbGQsIG5ld1RhcmdldFNlcnZlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRhcmdldFNlcnZlckNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnRhcmdldFNlcnZlcjsKLQkJdGhpcy50YXJnZXRTZXJ2ZXIgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRBUkdFVF9TRVJWRVJfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYXJnZXRTZXJ2ZXIoKSB7Ci0JCXJldHVybiBERUZBVUxUX1RBUkdFVF9TRVJWRVI7Ci0JfQotCi0JLy8gKioqKioqKioqKiBFdmVudExpc3RlbmVyICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldEV2ZW50TGlzdGVuZXIoKSB7Ci0JCXJldHVybiB0aGlzLmV2ZW50TGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXZlbnRMaXN0ZW5lcihTdHJpbmcgbmV3RXZlbnRMaXN0ZW5lcikgewotCQlTdHJpbmcgb2xkID0gdGhpcy5ldmVudExpc3RlbmVyOwotCQl0aGlzLmV2ZW50TGlzdGVuZXIgPSBuZXdFdmVudExpc3RlbmVyOwotCQl0aGlzLnB1dFByb3BlcnR5KFNFU1NJT05fRVZFTlRfTElTVEVORVJfUFJPUEVSVFksIG5ld0V2ZW50TGlzdGVuZXIpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSwgb2xkLCBuZXdFdmVudExpc3RlbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXZlbnRMaXN0ZW5lckNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmV2ZW50TGlzdGVuZXI7Ci0JCXRoaXMuZXZlbnRMaXN0ZW5lciA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0RXZlbnRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0VTU0lPTl9FVkVOVF9MSVNURU5FUjsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBUZW1wb3JhbE11dGFibGUgKioqKioqKioqKgotCi0JcHVibGljIEJvb2xlYW4gZ2V0VGVtcG9yYWxNdXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy50ZW1wb3JhbE11dGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4gbmV3VGVtcG9yYWxNdXRhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy50ZW1wb3JhbE11dGFibGU7Ci0JCXRoaXMudGVtcG9yYWxNdXRhYmxlID0gbmV3VGVtcG9yYWxNdXRhYmxlOwotCQl0aGlzLnB1dFByb3BlcnR5KFRFTVBPUkFMX01VVEFCTEVfUFJPUEVSVFksIG5ld1RlbXBvcmFsTXV0YWJsZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChURU1QT1JBTF9NVVRBQkxFX1BST1BFUlRZLCBvbGQsIG5ld1RlbXBvcmFsTXV0YWJsZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRlbXBvcmFsTXV0YWJsZUNoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMudGVtcG9yYWxNdXRhYmxlOwotCQl0aGlzLnRlbXBvcmFsTXV0YWJsZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEVNUE9SQUxfTVVUQUJMRV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRUZW1wb3JhbE11dGFibGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1RFTVBPUkFMX01VVEFCTEU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVFdmVudExpc3RlbmVyUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVFdmVudExpc3RlbmVyUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoRUNMSVBTRUxJTktfU0VTU0lPTl9FVkVOVF9MSVNURU5FUik7Ci0JCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvcGVydHkuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlRXZlbnRMaXN0ZW5lck1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUV2ZW50TGlzdGVuZXJNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KEVDTElQU0VMSU5LX1NFU1NJT05fRVZFTlRfTElTVEVORVIpOwotCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHByb3BlcnR5LmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVFdmVudExpc3RlbmVyUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVFdmVudExpc3RlbmVyUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShFQ0xJUFNFTElOS19TRVNTSU9OX0VWRU5UX0xJU1RFTkVSKTsKLQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCXJldHVybiBwcm9wZXJ0eS5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rT3B0aW9uczJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua09wdGlvbnMyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc5YjA0YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rT3B0aW9uczJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuT3B0aW9uczJfMDsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtPcHRpb25zMl8wCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09wdGlvbnMyXzAgZXh0ZW5kcyBFY2xpcHNlTGlua09wdGlvbnMKLQlpbXBsZW1lbnRzIE9wdGlvbnMyXzAKLXsKLQkvLyAqKioqKioqKioqIEdlbmVyaWNDb25uZWN0aW9uIHByb3BlcnRpZXMgKioqKioqKioqKgotCXByaXZhdGUgSW50ZWdlciBsb2NrVGltZW91dDsKLQlwcml2YXRlIEludGVnZXIgcXVlcnlUaW1lb3V0OwotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzOwotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXM7Ci0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gdmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlczsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcHRpb25zMl8wKFBlcnNpc3RlbmNlVW5pdDJfMCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkvKioKLQkgKiBJbml0aWFsaXplcyBwcm9wZXJ0aWVzIHdpdGggdmFsdWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVQcm9wZXJ0aWVzKCk7Ci0JCQotCQl0aGlzLmxvY2tUaW1lb3V0ID0gCi0JCQl0aGlzLmdldEludGVnZXJWYWx1ZShQRVJTSVNURU5DRV9MT0NLX1RJTUVPVVQpOwotCQl0aGlzLnF1ZXJ5VGltZW91dCA9IAotCQkJdGhpcy5nZXRJbnRlZ2VyVmFsdWUoUEVSU0lTVEVOQ0VfUVVFUllfVElNRU9VVCk7Ci0KLQkJLy8gVmFsaWRhdGlvbk1vZGUgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgcGVyc2lzdGVuY2UgdW5pdCBlbGVtZW50Ci0JCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHMgPSB0aGlzLmdldENvbXBvc2l0ZVZhbHVlKFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1QpOwotCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXMgPSB0aGlzLmdldENvbXBvc2l0ZVZhbHVlKFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURSk7Ci0JCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlcyA9IHRoaXMuZ2V0Q29tcG9zaXRlVmFsdWUoUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgewotCQlzdXBlci5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKLQkJCi0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX0xPQ0tfVElNRU9VVCkpIHsKLQkJCXRoaXMubG9ja1RpbWVvdXRDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX1FVRVJZX1RJTUVPVVQpKSB7Ci0JCQl0aGlzLnF1ZXJ5VGltZW91dENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVCkpIHsKLQkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHNDaGFuZ2VkKCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEUpKSB7Ci0JCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXNDaGFuZ2VkKCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkUpKSB7Ci0JCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXNDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlzdXBlci5wcm9wZXJ0eVJlbW92ZWQocHJvcGVydHlOYW1lKTsKLQkJCi0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX0xPQ0tfVElNRU9VVCkpIHsKLQkJCXRoaXMubG9ja1RpbWVvdXRDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfUVVFUllfVElNRU9VVCkpIHsKLQkJCXRoaXMucXVlcnlUaW1lb3V0Q2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1QpKSB7Ci0JCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzQ2hhbmdlZCgpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFKSkgewotCQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzQ2hhbmdlZCgpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFKSkgewotCQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiAKLQkgKiAJCWtleSA9IFBVIHByb3BlcnR5IGtleQotCSAqIAkJdmFsdWUgPSBwcm9wZXJ0eSBpZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCVBFUlNJU1RFTkNFX0xPQ0tfVElNRU9VVCwKLQkJCUxPQ0tfVElNRU9VVF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJUEVSU0lTVEVOQ0VfUVVFUllfVElNRU9VVCwKLQkJCVFVRVJZX1RJTUVPVVRfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCVBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1QsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCVBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdDJfMCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB7Ci0JCXJldHVybiAoUGVyc2lzdGVuY2VVbml0Ml8wKSBzdXBlci5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExvY2tUaW1lb3V0ICoqKioqKioqKioKLQlwdWJsaWMgSW50ZWdlciBnZXRMb2NrVGltZW91dCgpIHsKLQkJcmV0dXJuIHRoaXMubG9ja1RpbWVvdXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9ja1RpbWVvdXQoSW50ZWdlciBuZXdMb2NrVGltZW91dCkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMubG9ja1RpbWVvdXQ7Ci0JCXRoaXMubG9ja1RpbWVvdXQgPSBuZXdMb2NrVGltZW91dDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShMT0NLX1RJTUVPVVRfUFJPUEVSVFksIG5ld0xvY2tUaW1lb3V0KTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKExPQ0tfVElNRU9VVF9QUk9QRVJUWSwgb2xkLCBuZXdMb2NrVGltZW91dCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvY2tUaW1lb3V0Q2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJSW50ZWdlciBuZXdWYWx1ZSA9IGdldEludGVnZXJWYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy5sb2NrVGltZW91dDsKLQkJdGhpcy5sb2NrVGltZW91dCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTE9DS19USU1FT1VUX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0TG9ja1RpbWVvdXQoKSB7Ci0JCXJldHVybiBERUZBVUxUX0xPQ0tfVElNRU9VVDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFF1ZXJ5VGltZW91dCAqKioqKioqKioqCi0JcHVibGljIEludGVnZXIgZ2V0UXVlcnlUaW1lb3V0KCkgewotCQlyZXR1cm4gdGhpcy5xdWVyeVRpbWVvdXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UXVlcnlUaW1lb3V0KEludGVnZXIgbmV3UXVlcnlUaW1lb3V0KSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5xdWVyeVRpbWVvdXQ7Ci0JCXRoaXMucXVlcnlUaW1lb3V0ID0gbmV3UXVlcnlUaW1lb3V0OwotCQl0aGlzLnB1dFByb3BlcnR5KFFVRVJZX1RJTUVPVVRfUFJPUEVSVFksIG5ld1F1ZXJ5VGltZW91dCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChRVUVSWV9USU1FT1VUX1BST1BFUlRZLCBvbGQsIG5ld1F1ZXJ5VGltZW91dCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHF1ZXJ5VGltZW91dENoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUludGVnZXIgbmV3VmFsdWUgPSBnZXRJbnRlZ2VyVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlJbnRlZ2VyIG9sZCA9IHRoaXMucXVlcnlUaW1lb3V0OwotCQl0aGlzLnF1ZXJ5VGltZW91dCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUVVFUllfVElNRU9VVF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdFF1ZXJ5VGltZW91dCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfUVVFUllfVElNRU9VVDsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cygpewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxTdHJpbmc+KHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHMpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzU2l6ZSgpewotCQlyZXR1cm4gdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cy5zaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdEV4aXN0cyhTdHJpbmcgdmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdENsYXNzTmFtZSkgewotCi0JCWZvciAoU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QgOiB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzKSB7Ci0JCQlpZih2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0LmVxdWFscyh2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0Q2xhc3NOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGFkZFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoU3RyaW5nIG5ld1ByZVBlcnNpc3RDbGFzc05hbWUpewotCi0JCWlmKCAhIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdEV4aXN0cyhuZXdQcmVQZXJzaXN0Q2xhc3NOYW1lKSkgewotCQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cy5hZGQobmV3UHJlUGVyc2lzdENsYXNzTmFtZSk7Ci0JCQl0aGlzLnB1dFByb3BlcnR5Q29tcG9zaXRlVmFsdWUoVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSwgbmV3UHJlUGVyc2lzdENsYXNzTmFtZSk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0xJU1QsIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHMpOwotCQkJcmV0dXJuIG5ld1ByZVBlcnNpc3RDbGFzc05hbWU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoU3RyaW5nIGNsYXNzTmFtZSl7Ci0KLQkJaWYodGhpcy5yZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0XyhjbGFzc05hbWUpICE9IG51bGwpIHsKLQkJCXRoaXMucmVtb3ZlUHJvcGVydHlDb21wb3NpdGVWYWx1ZShWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZLCBjbGFzc05hbWUpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9MSVNULCB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyByZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0XyhTdHJpbmcgY2xhc3NOYW1lKXsKLQotCQlmb3IgKFN0cmluZyB2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0IDogdGhpcy5nZXRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cygpKSB7Ci0JCQlpZih2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0LmVxdWFscyhjbGFzc05hbWUpKSB7Ci0JCQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cy5yZW1vdmUodmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCk7Ci0JCQkJcmV0dXJuIHZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzQ2hhbmdlZCgpIHsKLQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cyA9IHRoaXMuZ2V0Q29tcG9zaXRlVmFsdWUoUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVCk7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfTElTVCwgdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzKCl7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFN0cmluZz4odGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzU2l6ZSgpewotCQlyZXR1cm4gdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVFeGlzdHMoU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZUNsYXNzTmFtZSkgewotCi0JCWZvciAoU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSA6IHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcykgewotCQkJaWYodmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlLmVxdWFscyh2YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVDbGFzc05hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgYWRkVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKFN0cmluZyBuZXdQcmVVcGRhdGVDbGFzc05hbWUpewotCi0JCWlmKCAhIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlRXhpc3RzKG5ld1ByZVVwZGF0ZUNsYXNzTmFtZSkpIHsKLQkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcy5hZGQobmV3UHJlVXBkYXRlQ2xhc3NOYW1lKTsKLQkJCXRoaXMucHV0UHJvcGVydHlDb21wb3NpdGVWYWx1ZShWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFksIG5ld1ByZVVwZGF0ZUNsYXNzTmFtZSk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfTElTVCwgdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzKTsKLQkJCXJldHVybiBuZXdQcmVVcGRhdGVDbGFzc05hbWU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZShTdHJpbmcgY2xhc3NOYW1lKXsKLQotCQlpZih0aGlzLnJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZV8oY2xhc3NOYW1lKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbW92ZVByb3BlcnR5Q29tcG9zaXRlVmFsdWUoVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZLCBjbGFzc05hbWUpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0xJU1QsIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlXyhTdHJpbmcgY2xhc3NOYW1lKXsKLQotCQlmb3IoU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSA6IHRoaXMuZ2V0VmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcygpKSB7Ci0JCQlpZih2YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXMucmVtb3ZlKHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSk7Ci0JCQkJcmV0dXJuIHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlc0NoYW5nZWQoKSB7Ci0JCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcyA9IHRoaXMuZ2V0Q29tcG9zaXRlVmFsdWUoUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFKTsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0xJU1QsIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzKCl7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFN0cmluZz4odGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzU2l6ZSgpewotCQlyZXR1cm4gdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVFeGlzdHMoU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVJlbW92ZUNsYXNzTmFtZSkgewotCi0JCWZvciAoU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSA6IHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlcykgewotCQkJaWYodmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlLmVxdWFscyh2YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVDbGFzc05hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgYWRkVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKFN0cmluZyBuZXdQcmVSZW1vdmVDbGFzc05hbWUpewotCi0JCWlmKCAhIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlRXhpc3RzKG5ld1ByZVJlbW92ZUNsYXNzTmFtZSkpIHsKLQkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3Zlcy5hZGQobmV3UHJlUmVtb3ZlQ2xhc3NOYW1lKTsKLQkJCXRoaXMucHV0UHJvcGVydHlDb21wb3NpdGVWYWx1ZShWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFksIG5ld1ByZVJlbW92ZUNsYXNzTmFtZSk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfTElTVCwgdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzKTsKLQkJCXJldHVybiBuZXdQcmVSZW1vdmVDbGFzc05hbWU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVJlbW92ZShTdHJpbmcgY2xhc3NOYW1lKXsKLQotCQlpZih0aGlzLnJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVJlbW92ZV8oY2xhc3NOYW1lKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbW92ZVByb3BlcnR5Q29tcG9zaXRlVmFsdWUoVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZLCBjbGFzc05hbWUpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0xJU1QsIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3Zlcyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlXyhTdHJpbmcgY2xhc3NOYW1lKXsKLQotCQlmb3IoU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSA6IHRoaXMuZ2V0VmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlcygpKSB7Ci0JCQlpZih2YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMucmVtb3ZlKHZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSk7Ci0JCQkJcmV0dXJuIHZhbGlkYXRpb25Hcm91cFByZVJlbW92ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGlvbkdyb3VwUHJlUmVtb3Zlc0NoYW5nZWQoKSB7Ci0JCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlcyA9IHRoaXMuZ2V0Q29tcG9zaXRlVmFsdWUoUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFKTsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0xJU1QsIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3Zlcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg4OGY3MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0UGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLQotLyoqCi0gKiBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLSAqIAotICogTGlzdGVucyB0byB0aGUgcHJvcGVydHlMaXN0QWRhcHRlcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi17Ci0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMoUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8vICoqKioqKioqIENvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgU2V0PFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4gZ2V0UHJvcGVydGllc1NldFdpdGhQcmVmaXgoU3RyaW5nIGtleVByZWZpeCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnRpZXNXaXRoTmFtZVByZWZpeChrZXlQcmVmaXgpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRyYWN0cyB0aGUgZW50aXR5TmFtZSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUuIElmIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogaGFzIG5vIHN1ZmZpeCwgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhY3RFbnRpdHlOYW1lT2YoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5KSB7Ci0JCXJldHVybiBleHRyYWN0RW50aXR5TmFtZU9mKHByb3BlcnR5LmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogRXh0cmFjdHMgdGhlIGVudGl0eU5hbWUgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcuIElmIHRoZSBzdHJpbmcKLQkgKiBoYXMgbm8gc3VmZml4LCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXh0cmFjdEVudGl0eU5hbWVPZihTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWludCBpbmRleCA9IHByb3BlcnR5TmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2NkNjI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkphckZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmFyRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotCi0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5Ci0JZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5Ci0JCWltcGxlbWVudHMgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeQotewotCQotCUBPdmVycmlkZQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgYnVpbGRQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2UgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQocGFyZW50LCB4bWxQZXJzaXN0ZW5jZVVuaXQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmFyRmlsZVJlZiBidWlsZEphckZpbGVSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sSmFyRmlsZVJlZiB4bWxKYXJGaWxlUmVmKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtKYXJGaWxlUmVmKHBhcmVudCwgeG1sSmFyRmlsZVJlZik7Ci0JfQotCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgYnVpbGRDb25uZWN0aW9uKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0Nvbm5lY3Rpb24ocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgYnVpbGRPcHRpb25zKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09wdGlvbnMocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgYnVpbGRMb2dnaW5nKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0xvZ2dpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MjIxMTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0UGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MXzFfMF9SRVNPVVJDRV9UWVBFOwotCX0KLQotCXB1YmxpYyBFRmFjdG9yeSBnZXRSZXNvdXJjZU5vZGVGYWN0b3J5KCkgewotCQlyZXR1cm4gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkgYnVpbGRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjMzOTMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRGRsR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuT3V0cHV0TW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5TY2hlbWFHZW5lcmF0aW9uOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbiBlbmNhcHN1bGF0ZXMgRWNsaXBzZUxpbmsgU2NoZW1hR2VuZXJhdGlvbgotICogcHJvcGVydGllcy4KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbgotCWV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGltcGxlbWVudHMgU2NoZW1hR2VuZXJhdGlvbgotewotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBPdXRwdXRNb2RlIG91dHB1dE1vZGU7Ci0JcHJpdmF0ZSBEZGxHZW5lcmF0aW9uVHlwZSBkZGxHZW5lcmF0aW9uVHlwZTsKLQlwcml2YXRlIFN0cmluZyBjcmVhdGVGaWxlTmFtZTsKLQlwcml2YXRlIFN0cmluZyBkcm9wRmlsZU5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgYXBwbGljYXRpb25Mb2NhdGlvbjsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBwcm9wZXJ0aWVzIHdpdGggdmFsdWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7Ci0JCXRoaXMub3V0cHV0TW9kZSA9IAotCQkJdGhpcy5nZXRFbnVtVmFsdWUoRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fT1VUUFVUX01PREUsIE91dHB1dE1vZGUudmFsdWVzKCkpOwotCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlID0gCi0JCQl0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFLCBEZGxHZW5lcmF0aW9uVHlwZS52YWx1ZXMoKSk7Ci0JCXRoaXMuY3JlYXRlRmlsZU5hbWUgPSAKLQkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfQ1JFQVRFX0ZJTEVfTkFNRSk7Ci0JCXRoaXMuZHJvcEZpbGVOYW1lID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0RST1BfRklMRV9OQU1FKTsKLQkJdGhpcy5hcHBsaWNhdGlvbkxvY2F0aW9uID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0FQUExJQ0FUSU9OX0xPQ0FUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHByb3BlcnR5IG5hbWVzIGtleS92YWx1ZSBwYWlycywgd2hlcmU6IGtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5Ci0JICoga2V5OyB2YWx1ZSA9IHByb3BlcnR5IGlkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERSwKLQkJCU9VVFBVVF9NT0RFX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFLAotCQkJRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfQ1JFQVRFX0ZJTEVfTkFNRSwKLQkJCUNSRUFURV9GSUxFX05BTUVfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0RST1BfRklMRV9OQU1FLAotCQkJRFJPUF9GSUxFX05BTUVfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0FQUExJQ0FUSU9OX0xPQ0FUSU9OLAotCQkJQVBQTElDQVRJT05fTE9DQVRJT05fUFJPUEVSVFkpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERSkpIHsKLQkJCXRoaXMub3V0cHV0TW9kZUNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSkpIHsKLQkJCXRoaXMuZGRsR2VuZXJhdGlvblR5cGVDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NSRUFURV9GSUxFX05BTUUpKSB7Ci0JCQl0aGlzLmNyZWF0ZUZpbGVOYW1lQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19EUk9QX0ZJTEVfTkFNRSkpIHsKLQkJCXRoaXMuZHJvcEZpbGVOYW1lQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19BUFBMSUNBVElPTl9MT0NBVElPTikpIHsKLQkJCXRoaXMuYXBwbGljYXRpb25Mb2NhdGlvbkNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX09VVFBVVF9NT0RFKSkgewotCQkJdGhpcy5vdXRwdXRNb2RlQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX1RZUEUpKSB7Ci0JCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NSRUFURV9GSUxFX05BTUUpKSB7Ci0JCQl0aGlzLmNyZWF0ZUZpbGVOYW1lQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0RST1BfRklMRV9OQU1FKSkgewotCQkJdGhpcy5kcm9wRmlsZU5hbWVDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQVBQTElDQVRJT05fTE9DQVRJT04pKSB7Ci0JCQl0aGlzLmFwcGxpY2F0aW9uTG9jYXRpb25DaGFuZ2VkKG51bGwpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBEZGxHZW5lcmF0aW9uVHlwZSAqKioqKioqKioqCi0JcHVibGljIERkbEdlbmVyYXRpb25UeXBlIGdldERkbEdlbmVyYXRpb25UeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kZGxHZW5lcmF0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZGxHZW5lcmF0aW9uVHlwZShEZGxHZW5lcmF0aW9uVHlwZSBuZXdEZGxHZW5UeXBlKSB7Ci0JCURkbEdlbmVyYXRpb25UeXBlIG9sZCA9IHRoaXMuZGRsR2VuZXJhdGlvblR5cGU7Ci0JCXRoaXMuZGRsR2VuZXJhdGlvblR5cGUgPSBuZXdEZGxHZW5UeXBlOwotCQl0aGlzLnB1dFByb3BlcnR5KERETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFksIG5ld0RkbEdlblR5cGUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSwgb2xkLCBuZXdEZGxHZW5UeXBlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGRsR2VuZXJhdGlvblR5cGVDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlEZGxHZW5lcmF0aW9uVHlwZSBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBEZGxHZW5lcmF0aW9uVHlwZS52YWx1ZXMoKSk7Ci0JCURkbEdlbmVyYXRpb25UeXBlIG9sZCA9IHRoaXMuZGRsR2VuZXJhdGlvblR5cGU7Ci0JCXRoaXMuZGRsR2VuZXJhdGlvblR5cGUgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBEZGxHZW5lcmF0aW9uVHlwZSBnZXREZWZhdWx0RGRsR2VuZXJhdGlvblR5cGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0RETF9HRU5FUkFUSU9OX1RZUEU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBPdXRwdXRNb2RlICoqKioqKioqKioKLQlwdWJsaWMgT3V0cHV0TW9kZSBnZXRPdXRwdXRNb2RlKCkgewotCQlyZXR1cm4gdGhpcy5vdXRwdXRNb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE91dHB1dE1vZGUoT3V0cHV0TW9kZSBuZXdPdXRwdXRNb2RlKSB7Ci0JCU91dHB1dE1vZGUgb2xkID0gdGhpcy5vdXRwdXRNb2RlOwotCQl0aGlzLm91dHB1dE1vZGUgPSBuZXdPdXRwdXRNb2RlOwotCQl0aGlzLnB1dFByb3BlcnR5KE9VVFBVVF9NT0RFX1BST1BFUlRZLCBuZXdPdXRwdXRNb2RlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE9VVFBVVF9NT0RFX1BST1BFUlRZLCBvbGQsIG5ld091dHB1dE1vZGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvdXRwdXRNb2RlQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJT3V0cHV0TW9kZSBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBPdXRwdXRNb2RlLnZhbHVlcygpKTsKLQkJT3V0cHV0TW9kZSBvbGQgPSB0aGlzLm91dHB1dE1vZGU7Ci0JCXRoaXMub3V0cHV0TW9kZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT1VUUFVUX01PREVfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBPdXRwdXRNb2RlIGdldERlZmF1bHRPdXRwdXRNb2RlKCkgewotCQlyZXR1cm4gREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9PVVRQVVRfTU9ERTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENyZWF0ZUZpbGVOYW1lICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUZpbGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVGaWxlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDcmVhdGVGaWxlTmFtZShTdHJpbmcgbmV3Q3JlYXRlRmlsZU5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuY3JlYXRlRmlsZU5hbWU7Ci0JCXRoaXMuY3JlYXRlRmlsZU5hbWUgPSBuZXdDcmVhdGVGaWxlTmFtZTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShDUkVBVEVfRklMRV9OQU1FX1BST1BFUlRZLCBuZXdDcmVhdGVGaWxlTmFtZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDUkVBVEVfRklMRV9OQU1FX1BST1BFUlRZLCBvbGQsIG5ld0NyZWF0ZUZpbGVOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRmlsZU5hbWVDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5jcmVhdGVGaWxlTmFtZTsKLQkJdGhpcy5jcmVhdGVGaWxlTmFtZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ1JFQVRFX0ZJTEVfTkFNRV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q3JlYXRlRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0NSRUFURV9GSUxFX05BTUU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBkcm9wRmlsZU5hbWUgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0RHJvcEZpbGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kcm9wRmlsZU5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RHJvcEZpbGVOYW1lKFN0cmluZyBuZXdEcm9wRmlsZU5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZHJvcEZpbGVOYW1lOwotCQl0aGlzLmRyb3BGaWxlTmFtZSA9IG5ld0Ryb3BGaWxlTmFtZTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShEUk9QX0ZJTEVfTkFNRV9QUk9QRVJUWSwgbmV3RHJvcEZpbGVOYW1lKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERST1BfRklMRV9OQU1FX1BST1BFUlRZLCBvbGQsIG5ld0Ryb3BGaWxlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BGaWxlTmFtZUNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRyb3BGaWxlTmFtZTsKLQkJdGhpcy5kcm9wRmlsZU5hbWUgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERST1BfRklMRV9OQU1FX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHREcm9wRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0RST1BfRklMRV9OQU1FOwotCX0KLQotCS8vICoqKioqKioqKiogYXBwbGljYXRpb25Mb2NhdGlvbiAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRBcHBsaWNhdGlvbkxvY2F0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5hcHBsaWNhdGlvbkxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uTG9jYXRpb24oU3RyaW5nIG5ld0FwcGxpY2F0aW9uTG9jYXRpb24pIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuYXBwbGljYXRpb25Mb2NhdGlvbjsKLQkJdGhpcy5hcHBsaWNhdGlvbkxvY2F0aW9uID0gKFN0cmluZ1Rvb2xzLnN0cmluZ0lzTm90RW1wdHkobmV3QXBwbGljYXRpb25Mb2NhdGlvbikpID8gCi0JCQkJCQkJCQkJCQluZXdBcHBsaWNhdGlvbkxvY2F0aW9uIDogCi0JCQkJCQkJCQkJCQl0aGlzLmdldERlZmF1bHRBcHBsaWNhdGlvbkxvY2F0aW9uKCk7Ci0JCXRoaXMucHV0UHJvcGVydHkoQVBQTElDQVRJT05fTE9DQVRJT05fUFJPUEVSVFksIHRoaXMuYXBwbGljYXRpb25Mb2NhdGlvbik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChBUFBMSUNBVElPTl9MT0NBVElPTl9QUk9QRVJUWSwgb2xkLCB0aGlzLmFwcGxpY2F0aW9uTG9jYXRpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBhcHBsaWNhdGlvbkxvY2F0aW9uQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuYXBwbGljYXRpb25Mb2NhdGlvbjsKLQkJdGhpcy5hcHBsaWNhdGlvbkxvY2F0aW9uID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChBUFBMSUNBVElPTl9MT0NBVElPTl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0QXBwbGljYXRpb25Mb2NhdGlvbigpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fQVBQTElDQVRJT05fTE9DQVRJT047Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvZGRsZ2VuL0Fic3RyYWN0RWNsaXBzZUxpbmtERExHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2RkbGdlbi9BYnN0cmFjdEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOTY1MzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvZGRsZ2VuL0Fic3RyYWN0RWNsaXBzZUxpbmtERExHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmRkbGdlbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwuZ2VuLkFic3RyYWN0SnB0R2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbEVudW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSnB0Q29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5EZGxHZW5lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkxvZ2dpbmdMZXZlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5PdXRwdXRNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlNjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk1hbmlmZXN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWNsaXBzZUxpbmtERExHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEpwdEdlbmVyYXRvcgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBVU5DSF9DT05GSUdfTkFNRSA9ICJEYWxpIEVjbGlwc2VMaW5rIFRhYmxlIEdlbmVyYXRpb24iOyAgIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERExfR0VOX1BBQ0tBR0VfTkFNRSA9ICJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuIjsgICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRERMX0dFTl9DTEFTUyA9IERETF9HRU5fUEFDS0FHRV9OQU1FICsgIi5NYWluIjsJICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRERMX0dFTl9KQVJfUFJFRklYID0gRERMX0dFTl9QQUNLQUdFX05BTUUgKyAiXyI7CS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfQ0xBU1NQQVRIID0gIkJ1bmRsZS1DbGFzc1BhdGgiOwkgIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTX0ZJTEVfTkFNRSA9ICJsb2dpbi5wcm9wZXJ0aWVzIjsJICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVRSA9ICJ0cnVlIjsJICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFMU0UgPSAiZmFsc2UiOwkgIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gIk5PTkUiOwkgIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFlOQU1JQ19QUk9HUkFNX0FSR1VNRU5UID0gIi1keW5hbWljIjsgCSAgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBwdU5hbWU7Ci0JcHJvdGVjdGVkIGZpbmFsIEpwYVByb2plY3QganBhUHJvamVjdDsKLQlwcm90ZWN0ZWQgZmluYWwgT3V0cHV0TW9kZSBvdXRwdXRNb2RlOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFic3RyYWN0RWNsaXBzZUxpbmtERExHZW5lcmF0b3IoU3RyaW5nIHB1TmFtZSwgSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBPdXRwdXRNb2RlIG91dHB1dE1vZGUpIHsKLQkJc3VwZXIoSmF2YUNvcmUuY3JlYXRlKGpwYVByb2plY3QuZ2V0UHJvamVjdCgpKSk7Ci0JCXRoaXMucHVOYW1lID0gcHVOYW1lOwotCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCQl0aGlzLm91dHB1dE1vZGUgPSBvdXRwdXRNb2RlOwotCX0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGF1bmNoQ29uZmlnTmFtZSgpIHsKLQkJcmV0dXJuIExBVU5DSF9DT05GSUdfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1haW5UeXBlKCkgewotCQlyZXR1cm4gRUNMSVBTRUxJTktfRERMX0dFTl9DTEFTUzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEJvb3RzdHJhcEphclByZWZpeCgpIHsKLQkJcmV0dXJuIEVDTElQU0VMSU5LX0RETF9HRU5fSkFSX1BSRUZJWDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcHJlR2VuZXJhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgMik7Ci0JCS8vZGlzY29ubmVjdCBzaW5jZSB0aGUgcnVudGltZSBwcm92aWRlciB3aWxsIG5lZWQgdG8gY29ubmVjdCB0byBnZW5lcmF0ZSB0aGUgdGFibGVzCi0JCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCQlpZiAoY3AgIT0gbnVsbCkgewotCQkJY3AuZGlzY29ubmVjdCgpOwotCQkJc20ud29ya2VkKDEpOwotCQl9Ci0JCXNtLnNldFdvcmtSZW1haW5pbmcoMSk7Ci0JCXRoaXMuc2F2ZUxvZ2luUHJvcGVydGllcygpOwotCQlzbS53b3JrZWQoMSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvc3RHZW5lcmF0ZSgpIHsKLQkJc3VwZXIucG9zdEdlbmVyYXRlKCk7Ci0JCXRoaXMucmVjb25uZWN0KCk7Ci0JCXRoaXMudmFsaWRhdGVQcm9qZWN0KCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBTZXR0aW5nIExhdW5jaCBDb25maWd1cmF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNwZWNpZnlQcm9ncmFtQXJndW1lbnRzKCkgewotCQlTdHJpbmdCdWZmZXIgcHJvZ3JhbUFyZ3VtZW50cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJdGhpcy5hcHBlbmRQcm9ncmFtQXJndW1lbnRzKHByb2dyYW1Bcmd1bWVudHMpOwotCQl0aGlzLmxhdW5jaENvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPR1JBTV9BUkdVTUVOVFMsIHByb2dyYW1Bcmd1bWVudHMudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBNYWluIGFyZ3VtZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmRQcm9ncmFtQXJndW1lbnRzKFN0cmluZ0J1ZmZlciBwcm9ncmFtQXJndW1lbnRzKSB7Ci0JCXRoaXMuYXBwZW5kUHVOYW1lQXJndW1lbnQocHJvZ3JhbUFyZ3VtZW50cyk7Ci0JCXRoaXMuYXBwZW5kUHJvcGVydGllc0ZpbGVBcmd1bWVudChwcm9ncmFtQXJndW1lbnRzKTsKLQkJdGhpcy5hcHBlbmREZWJ1Z0FyZ3VtZW50KHByb2dyYW1Bcmd1bWVudHMpOwotCQl0aGlzLmFwcGVuZER5bmFtaWNBcmd1bWVudChwcm9ncmFtQXJndW1lbnRzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXBwZW5kUHVOYW1lQXJndW1lbnQoU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZCgiIC1wdSBcIiIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCh0aGlzLnB1TmFtZSk7Ci0JCXNiLmFwcGVuZCgiXCIiKTsJICAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZFByb3BlcnRpZXNGaWxlQXJndW1lbnQoU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZCgiIC1wIFwiIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMucHJvamVjdExvY2F0aW9uKS5hcHBlbmQoIi8iKS5hcHBlbmQoUFJPUEVSVElFU19GSUxFX05BTUUpLmFwcGVuZCgiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYXBwZW5kRHluYW1pY0FyZ3VtZW50KFN0cmluZ0J1ZmZlciBzYikgewotCQlpZiAoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLm5vZGVJc0VjbGlwc2VMaW5rVmVyc2lvbkNvbXBhdGlibGUodGhpcy5qcGFQcm9qZWN0LCBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfUExBVEZPUk1fVkVSU0lPTl8yXzEpKSB7Ci0JCQlzYi5hcHBlbmQoJyAnKS5hcHBlbmQoRFlOQU1JQ19QUk9HUkFNX0FSR1VNRU5UKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gYnVpbGRDbGFzc3BhdGgoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUxpc3Q8U3RyaW5nPiBjbGFzc3BhdGggPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJLy8gRERMX0dFTiBqYXIKLQkJY2xhc3NwYXRoLmFkZCh0aGlzLmdldEJvb3RzdHJhcEphckNsYXNzcGF0aEVudHJ5KCkuZ2V0TWVtZW50bygpKTsKLQkJLy8gRGVmYXVsdCBQcm9qZWN0IGNsYXNzcGF0aAotCQljbGFzc3BhdGguYWRkKHRoaXMuZ2V0RGVmYXVsdFByb2plY3RDbGFzc3BhdGhFbnRyeSgpLmdldE1lbWVudG8oKSk7Ci0JCS8vIE9zZ2kgQnVuZGxlcwotCQljbGFzc3BhdGguYWRkQWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VPc2dpQnVuZGxlc01lbWVudG8oKSk7Ci0JCS8vIEpEQkMgamFyCi0JCWNsYXNzcGF0aC5hZGQodGhpcy5nZXRKZGJjSmFyQ2xhc3NwYXRoRW50cnkoKS5nZXRNZW1lbnRvKCkpOwotCQkvLyBTeXN0ZW0gTGlicmFyeSAgCi0JCWNsYXNzcGF0aC5hZGQodGhpcy5nZXRTeXN0ZW1MaWJyYXJ5Q2xhc3NwYXRoRW50cnkoKS5nZXRNZW1lbnRvKCkpOwotCQkvLyBtZXRhLWluZgotCQlpZih0aGlzLm1ldGFJbmZJc05vdE9uQ2xhc3NwYXRoKCkpIHsKLQkJCWNsYXNzcGF0aC5hZGQodGhpcy5nZXRNZXRhSW5mQ2xhc3NwYXRoRW50cnkoKS5nZXRNZW1lbnRvKCkpOwotCQl9Ci0JCXJldHVybiBjbGFzc3BhdGg7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvL3JlY29ubmVjdCBzaW5jZSB3ZSBkaXNjb25uZWN0ZWQgaW4gcHJlR2VuZXJhdGUoKTsKLQkvL2Vuc3VyZSB0aGUgcHJvamVjdCBpcyBmdWxseSB1cGRhdGVkIGJlZm9yZSB2YWxpZGF0aW5nIC0gYnVnIDI3NzIzNgotCXByb3RlY3RlZCB2b2lkIHJlY29ubmVjdCgpIHsKLQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCWlmIChjcCAhPSBudWxsKSB7Ci0JCQljcC5jb25uZWN0KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVByb2plY3QoKSB7Ci0JCW5ldyBWYWxpZGF0ZUpvYih0aGlzLmpwYVByb2plY3QuZ2V0UHJvamVjdCgpKS5zY2hlZHVsZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogQ2xhc3NwYXRoRW50cnkgKioqKioqKioqKgotCi0JcHJpdmF0ZSBJUnVudGltZUNsYXNzcGF0aEVudHJ5IGdldEpkYmNKYXJDbGFzc3BhdGhFbnRyeSgpIHsKLQkJcmV0dXJuIGdldEFyY2hpdmVDbGFzc3BhdGhFbnRyeSh0aGlzLmJ1aWxkSmRiY0phclBhdGgoKSk7Ci0JfQotCQotCXByaXZhdGUgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBnZXRCdW5kbGVDbGFzc3BhdGhFbnRyeShTdHJpbmcgYnVuZGxlSWQpIHsKLQkJSVBhdGggcGVyc2lzdENsYXNzcGF0aCA9IHRoaXMuZ2V0QnVuZGxlQ2xhc3NwYXRoKGJ1bmRsZUlkKTsKLQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBidW5kbGVFbnRyeSA9IGdldEFyY2hpdmVDbGFzc3BhdGhFbnRyeShwZXJzaXN0Q2xhc3NwYXRoKTsKLQkJCi0JCXJldHVybiBidW5kbGVFbnRyeTsKLQl9Ci0KLQlwcml2YXRlIElSdW50aW1lQ2xhc3NwYXRoRW50cnkgZ2V0TWV0YUluZkNsYXNzcGF0aEVudHJ5KCkgewotCQlyZXR1cm4gZ2V0VmFyaWFibGVSdW50aW1lQ2xhc3NwYXRoRW50cnkodGhpcy5nZXRNZXRhSW5mUGF0aCgpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkQ29ubmVjdGlvblByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywgIAotCQkJQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19CSU5EX1BBUkFNRVRFUlMsCi0JCQlGQUxTRSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZExvZ2dpbmdQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCi0JCQlMb2dnaW5nLkVDTElQU0VMSU5LX0xFVkVMLAotCQkJTG9nZ2luZ0xldmVsLmZpbmUpOwotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCi0JCQlMb2dnaW5nLkVDTElQU0VMSU5LX1RJTUVTVEFNUCwKLQkJCUZBTFNFKTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAotCQkJTG9nZ2luZy5FQ0xJUFNFTElOS19USFJFQUQsCi0JCQlGQUxTRSk7Ci0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywKLQkJCUxvZ2dpbmcuRUNMSVBTRUxJTktfU0VTU0lPTiwKLQkJCUZBTFNFKTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAotCQkJTG9nZ2luZy5FQ0xJUFNFTElOS19FWENFUFRJT05TLAotCQkJVFJVRSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkQ3VzdG9taXphdGlvblByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywKLQkJCUN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfVEhST1dfRVhDRVBUSU9OUywKLQkJCVRSVUUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwdXRQcm9wZXJ0eShQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlwcm9wZXJ0aWVzLnB1dChrZXksICh2YWx1ZSA9PSBudWxsKSA/ICIiIDogdmFsdWUpOwkgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdXRQcm9wZXJ0eShQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBrZXksIFBlcnNpc3RlbmNlWG1sRW51bVZhbHVlIHZhbHVlKSB7Ci0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywga2V5LCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZih2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFByb3BlcnR5IHN0cmluZyB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoUGVyc2lzdGVuY2VYbWxFbnVtVmFsdWUgdmFsdWUpIHsKLQkJaWYodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlLmdldFByb3BlcnR5VmFsdWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZEFsbFByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCXRoaXMuYnVpbGRDb25uZWN0aW9uUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQkJdGhpcy5idWlsZENvbm5lY3Rpb25Qb29saW5nUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQkJdGhpcy5idWlsZExvZ2dpbmdQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotCQl0aGlzLmJ1aWxkQ3VzdG9taXphdGlvblByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0JCXRoaXMuYnVpbGRERExNb2RlUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQkJdGhpcy5idWlsZFByb2plY3RMb2NhdGlvblByb3BlcnR5KHByb3BlcnRpZXMpOwotCX0KLQotCS8vICoqKioqKioqKiogcHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRQcm9qZWN0TG9jYXRpb25Qcm9wZXJ0eShQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLCAKLQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfQVBQTElDQVRJT05fTE9DQVRJT04sCi0JCQl0aGlzLnByb2plY3RMb2NhdGlvbik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZERETE1vZGVQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsICAKLQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fT1VUUFVUX01PREUsCi0JCQl0aGlzLm91dHB1dE1vZGUpOwotCQkKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLCAgCi0JCQlTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX1RZUEUsCi0JCQlEZGxHZW5lcmF0aW9uVHlwZS5kcm9wX2FuZF9jcmVhdGVfdGFibGVzKTsKLQotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsICAKLQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfQ1JFQVRFX0ZJTEVfTkFNRSwKLQkJCVNjaGVtYUdlbmVyYXRpb24uREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9DUkVBVEVfRklMRV9OQU1FKTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLCAgCi0JCQlTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RST1BfRklMRV9OQU1FLAotCQkJU2NoZW1hR2VuZXJhdGlvbi5ERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0RST1BfRklMRV9OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29ubmVjdGlvblBvb2xpbmdQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCi0JCQlDb25uZWN0aW9uLkVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfU0hBUkVELAotCQkJVFJVRSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzYXZlTG9naW5Qcm9wZXJ0aWVzKCkgewotCQlTdHJpbmcgcHJvcGVydGllc0ZpbGUgID0gdGhpcy5wcm9qZWN0TG9jYXRpb24gKyAiLyIgKyBQUk9QRVJUSUVTX0ZJTEVfTkFNRTsgCSAgLy8kTk9OLU5MUy0xJAotCi0JCVByb3BlcnRpZXMgZWxQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQotCQl0aGlzLmJ1aWxkQWxsUHJvcGVydGllcyhlbFByb3BlcnRpZXMpOwotCQlGaWxlT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JICAgIHRyeSB7Ci0JICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwcm9wZXJ0aWVzRmlsZSk7Ci0JCQlpZiAoIWZpbGUuZXhpc3RzKCkgJiYgISBmaWxlLmNyZWF0ZU5ld0ZpbGUoKSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJjcmVhdGVOZXdGaWxlKCkgZmFpbGVkOiAiICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkgICAgICAgIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCSAgICAgICAgZWxQcm9wZXJ0aWVzLnN0b3JlKHN0cmVhbSwgbnVsbCk7Ci0JICAgIH0KLQkgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JICAgIAlTdHJpbmcgbWVzc2FnZSA9ICJFcnJvciBzYXZpbmc6ICIgKyBwcm9wZXJ0aWVzRmlsZTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSwgZSk7Ci0JCX0KLQkgICAgZmluYWxseSB7Ci0JICAgIAl0aGlzLmNsb3NlU3RyZWFtKHN0cmVhbSk7Ci0JICAgIH0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNsb3NlU3RyZWFtKE91dHB1dFN0cmVhbSBzdHJlYW0pIHsKLSAgICAJaWYgKHN0cmVhbSAhPSBudWxsKSB7Ci0gICAgCQl0cnkgewotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJCX0KLSAgICAJfQkJCi0JfQotCQotCXByaXZhdGUgSVBhdGggZ2V0TWV0YUluZlBhdGgoKSB7Ci0JCUpwYVhtbFJlc291cmNlIHBlcnNpc3RlbmNlWG1sUmVzb3VyY2UgPSB0aGlzLmpwYVByb2plY3QuZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpOwotCQlJUGF0aCBwZXJzaXN0ZW5jZVhtbFBhdGggPSBwZXJzaXN0ZW5jZVhtbFJlc291cmNlLmdldEZpbGUoKS5nZXRMb2NhdGlvbigpOwotCQlyZXR1cm4gcGVyc2lzdGVuY2VYbWxQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG1ldGFJbmZJc05vdE9uQ2xhc3NwYXRoKCkgewotCQlKcGFYbWxSZXNvdXJjZSBwZXJzaXN0ZW5jZVhtbFJlc291cmNlID0gdGhpcy5qcGFQcm9qZWN0LmdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKTsKLQkJcmV0dXJuICEgdGhpcy5qcGFQcm9qZWN0LmdldEphdmFQcm9qZWN0KCkuaXNPbkNsYXNzcGF0aChwZXJzaXN0ZW5jZVhtbFJlc291cmNlLmdldEZpbGUoKSk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdmFsaWRhdGlvbiBhZnRlciB0YWJsZXMgaGF2ZSBiZWVuIGdlbmVyYXRlZAotCSAqLwotCS8qIENVIHByaXZhdGUgKi8gY2xhc3MgVmFsaWRhdGVKb2IKLQkJZXh0ZW5kcyBKb2IgCi0JewkKLQkJcHJpdmF0ZSBmaW5hbCBJUHJvamVjdFtdIHByb2plY3RzOwotCQkKLQkJVmFsaWRhdGVKb2IoSVByb2plY3QgcHJvamVjdCkgewotCQkJc3VwZXIoSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX0pPQik7Ci0JCQl0aGlzLnByb2plY3RzID0gbmV3IElQcm9qZWN0W10ge3Byb2plY3R9OwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJdHJ5IHsKLQkJCQlWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS52YWxpZGF0ZSh0aGlzLnByb2plY3RzLCB0cnVlLCBmYWxzZSwgbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJUGF0aCBidWlsZEpkYmNKYXJQYXRoKCkgewotCQlyZXR1cm4gbmV3IFBhdGgodGhpcy5nZXRKcGFQcm9qZWN0Q29ubmVjdGlvbkRyaXZlckphckxpc3QoKSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEpwYVByb2plY3RDb25uZWN0aW9uRHJpdmVySmFyTGlzdCgpIHsKLQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCXJldHVybiAoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldERyaXZlckphckxpc3QoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiBRdWVyaWVzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm0gZ2V0UGxhdGZvcm0oKSB7Ci0JCXJldHVybiB0aGlzLmpwYVByb2plY3QuZ2V0SnBhUGxhdGZvcm0oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0LmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBCdW5kbGVzICoqKioqKioqKgotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UGVyc2lzdGVuY2VPc2dpQnVuZGxlc01lbWVudG8oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJaWYgKGphdmF4UGVyc2lzdGVuY2VCdW5kbGVFeGlzdHMoKSkgewotCQkJcmVzdWx0LmFkZCh0aGlzLmdldEJ1bmRsZUNsYXNzcGF0aEVudHJ5KEpBVkFYX1BFUlNJU1RFTkNFX0JVTkRMRSkuZ2V0TWVtZW50bygpKTsKLQkJCXJlc3VsdC5hZGQodGhpcy5nZXRCdW5kbGVDbGFzc3BhdGhFbnRyeShPUkdfRUNMSVBTRV9QRVJTSVNURU5DRV9DT1JFX0JVTkRMRSkuZ2V0TWVtZW50bygpKTsKLQkJCXJlc3VsdC5hZGQodGhpcy5nZXRCdW5kbGVDbGFzc3BhdGhFbnRyeShPUkdfRUNMSVBTRV9QRVJTSVNURU5DRV9BU01fQlVORExFKS5nZXRNZW1lbnRvKCkpOwotCQkJcmVzdWx0LmFkZCh0aGlzLmdldEJ1bmRsZUNsYXNzcGF0aEVudHJ5KE9SR19FQ0xJUFNFX1BFUlNJU1RFTkNFX0FOVExSX0JVTkRMRSkuZ2V0TWVtZW50bygpKTsKLQkJCXJlc3VsdC5hZGQodGhpcy5nZXRCdW5kbGVDbGFzc3BhdGhFbnRyeShPUkdfRUNMSVBTRV9QRVJTSVNURU5DRV9KUEFfQlVORExFKS5nZXRNZW1lbnRvKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgSVBhdGggZ2V0QnVuZGxlQ2xhc3NwYXRoKFN0cmluZyBwbHVnaW5JRCkgewotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklEKTsKLQkJaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihwbHVnaW5JRCArICIgY2Fubm90IGJlIHJldHJpZXZlZCBmcm9tIHRoZSBQbGF0Zm9ybSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3NQYXRoKGJ1bmRsZSk7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBnZXRDbGFzc1BhdGgoQnVuZGxlIGJ1bmRsZSkgewotCQlTdHJpbmcgcGF0aCA9IGJ1bmRsZS5nZXRIZWFkZXJzKCkuZ2V0KEJVTkRMRV9DTEFTU1BBVEgpOwotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlwYXRoID0gIi4iOwkgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlNYW5pZmVzdEVsZW1lbnRbXSBlbGVtZW50cyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50cyA9IE1hbmlmZXN0RWxlbWVudC5wYXJzZUhlYWRlcihCVU5ETEVfQ0xBU1NQQVRILCBwYXRoKTsKLQkJfQotCQljYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciBwYXJzaW5nIGJ1bmRsZSBoZWFkZXI6ICIgKyBidW5kbGUsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHsKLQkJCQlNYW5pZmVzdEVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoIi4iLmVxdWFscyh2YWx1ZSkpIHsJICAvLyROT04tTkxTLTEkCi0JCQkJCXZhbHVlID0gIi8iOwkJLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlVUkwgdXJsID0gYnVuZGxlLmdldEVudHJ5KHZhbHVlKTsKLQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVVSTCByZXNvbHZlZFVSTCA9IEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKTsKLQkJCQkJCVN0cmluZyBmaWxlc3RyaW5nID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKHJlc29sdmVkVVJMKS5nZXRGaWxlKCk7Ci0JCSAgICAgICAgICAgICAgICBpZiAoZmlsZXN0cmluZy5zdGFydHNXaXRoKCJmaWxlOiIpKSB7CS8vJE5PTi1OTFMtMSQKLQkJICAgICAgICAgICAgICAgIAlmaWxlc3RyaW5nID0gZmlsZXN0cmluZy5zdWJzdHJpbmcoZmlsZXN0cmluZy5pbmRleE9mKCc6JykgKyAxKTsKLQkJICAgICAgICAgICAgICAgIH0KLQkJICAgICAgICAgICAgICAgIGlmIChmaWxlc3RyaW5nLmVuZHNXaXRoKCIhLyIpKSB7CQkvLyROT04tTkxTLTEkCi0JCSAgICAgICAgICAgICAgICAJZmlsZXN0cmluZyA9IGZpbGVzdHJpbmcuc3Vic3RyaW5nKDAsIGZpbGVzdHJpbmcubGFzdEluZGV4T2YoJyEnKSk7Ci0JCSAgICAgICAgICAgICAgICB9Ci0JCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlc3RyaW5nKTsKLQkJCQkJCVN0cmluZyBmaWxlUGF0aCA9IGZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJCQkJcmV0dXJuIG5ldyBQYXRoKGZpbGVQYXRoKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIGxvY2F0aW5nIGJ1bmRsZTogIiArIGJ1bmRsZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGphdmF4UGVyc2lzdGVuY2VCdW5kbGVFeGlzdHMoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRCdW5kbGUoSkFWQVhfUEVSU0lTVEVOQ0VfQlVORExFKSAhPSBudWxsOwotCX0KLQotCS8vICoqKioqKioqKiogY29uc3RhbnRzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9QRVJTSVNURU5DRV9CVU5ETEUgPSAiamF2YXgucGVyc2lzdGVuY2UiOwkJCQkJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfRUNMSVBTRV9QRVJTSVNURU5DRV9DT1JFX0JVTkRMRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb3JlIjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfRUNMSVBTRV9QRVJTSVNURU5DRV9BU01fQlVORExFID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFzbSI7CS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfUEVSU0lTVEVOQ0VfQU5UTFJfQlVORExFID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFudGxyIjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfRUNMSVBTRV9QRVJTSVNURU5DRV9KUEFfQlVORExFID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYSI7CS8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvZGRsZ2VuL0VjbGlwc2VMaW5rMl8wRERMR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9kZGxnZW4vRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZjOWMxZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9kZGxnZW4vRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuZGRsZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwYUNvbm5lY3Rpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk91dHB1dE1vZGU7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rMl8wRExMR2VuZXJhdG9yIGxhdW5jaGVzIHRoZSBFY2xpcHNlTGluayBEREwgZ2VuZXJhdG9yIGluIGEgc2VwYXJhdGUgVk0uCi0gKiAgRm9yIHRoaXMgaXQgd2lsbCBjcmVhdGUgYSBKYXZhIENvbmZpZ3VyYXRpb24gbmFtZWQgIkRhbGkgRWNsaXBzZUxpbmsgVGFibGUgR2VuZXJhdGlvbiIgCi0gKiAgaW4gdGhlIHRhcmdldCB3b3Jrc3BhY2UgKG5vdGU6IHRoZSBjb25maWd1cmF0aW9uIHdpbGwgYmUgb3ZlcnJpZGRlbiBhdCBlYWNoIHJ1bikuCi0gKiAgSXQgd2lsbCB0aGFuIGxhdW5jaCB0aGUgY29uZmlndXJhdGlvbiBjcmVhdGVkIHdpdGggdGhlIGxvZ2luIGluZm9ybWF0aW9uIGZyb20gCi0gKiAgdGhlIGN1cnJlbnQgRGFsaSBwcm9qZWN0LCBhbmQgcGFzc2VzIGl0IHRvIEVjbGlwc2VMaW5rLgotICogIAotICogIFByZS1yZXEgaW4gUERFIGVudmlyb25tZW50OgotICogIAlvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLmphciBpbiBFQ0xJUFNFX0hPTUUvcGx1Z2lucwotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yCi17Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01PREVfUFJPUEVSVFkgPSAiamF2YXgucGVyc2lzdGVuY2UudmFsaWRhdGlvbi5tb2RlIjsgCSAgLy8kTk9OLU5MUy0xJAotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2VuZXJhdGUoU3RyaW5nIHB1TmFtZSwgSnBhUHJvamVjdCBwcm9qZWN0LCBPdXRwdXRNb2RlIG91dHB1dE1vZGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocHVOYW1lID09IG51bGwgfHwgcHVOYW1lLmxlbmd0aCgpID09IDAgfHwgcHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQluZXcgRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3IocHVOYW1lLCBwcm9qZWN0LCBvdXRwdXRNb2RlKS5nZW5lcmF0ZShtb25pdG9yKTsKLQl9Ci0KLQlwcml2YXRlIEVjbGlwc2VMaW5rMl8wRERMR2VuZXJhdG9yKFN0cmluZyBwdU5hbWUsIEpwYVByb2plY3QganBhUHJvamVjdCwgT3V0cHV0TW9kZSBvdXRwdXRNb2RlKSB7Ci0JCXN1cGVyKHB1TmFtZSwganBhUHJvamVjdCwgb3V0cHV0TW9kZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBFY2xpcHNlTGluayBwcm9wZXJ0aWVzICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZEFsbFByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCXN1cGVyLmJ1aWxkQWxsUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCi0JCQlWQUxJREFUSU9OX01PREVfUFJPUEVSVFksCi0JCQlOT05FKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZEN1c3RvbWl6YXRpb25Qcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlzdXBlci5idWlsZEN1c3RvbWl6YXRpb25Qcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotCQkKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAotCQkJQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19XRUFWSU5HLAotCQkJRkFMU0UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkQ29ubmVjdGlvblByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCXN1cGVyLmJ1aWxkQ29ubmVjdGlvblByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0JCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCi0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywgCi0JCQlKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfRFJJVkVSLAotCQkJKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXREcml2ZXJDbGFzc05hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAotCQkJSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VSTCwKLQkJCShjcCA9PSBudWxsKSA/ICIiIDogY3AuZ2V0VVJMKCkpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywKLQkJCUpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19VU0VSLAotCQkJKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXRVc2VyTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCi0JCQlKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfUEFTU1dPUkQsCi0JCQkoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldFVzZXJQYXNzd29yZCgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2RkbGdlbi9FY2xpcHNlTGlua0RETEdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvZGRsZ2VuL0VjbGlwc2VMaW5rRERMR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYTQ2NjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvZGRsZ2VuL0VjbGlwc2VMaW5rRERMR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmRkbGdlbjsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5PdXRwdXRNb2RlOwotCi0vKioKLSAqICBFY2xpcHNlTGlua0RMTEdlbmVyYXRvciBsYXVuY2hlcyB0aGUgRWNsaXBzZUxpbmsgRERMIGdlbmVyYXRvciBpbiBhIHNlcGFyYXRlIFZNLgotICogIEZvciB0aGlzIGl0IHdpbGwgY3JlYXRlIGEgSmF2YSBDb25maWd1cmF0aW9uIG5hbWVkICJEYWxpIEVjbGlwc2VMaW5rIFRhYmxlIEdlbmVyYXRpb24iIAotICogIGluIHRoZSB0YXJnZXQgd29ya3NwYWNlIChub3RlOiB0aGUgY29uZmlndXJhdGlvbiB3aWxsIGJlIG92ZXJyaWRkZW4gYXQgZWFjaCBydW4pLgotICogIEl0IHdpbGwgdGhhbiBsYXVuY2ggdGhlIGNvbmZpZ3VyYXRpb24gY3JlYXRlZCB3aXRoIHRoZSBsb2dpbiBpbmZvcm1hdGlvbiBmcm9tIAotICogIHRoZSBjdXJyZW50IERhbGkgcHJvamVjdCwgYW5kIHBhc3NlcyBpdCB0byBFY2xpcHNlTGluay4KLSAqICAKLSAqICBQcmUtcmVxIGluIFBERSBlbnZpcm9ubWVudDoKLSAqICAJb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi5qYXIgaW4gRUNMSVBTRV9IT01FL3BsdWdpbnMKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua0RETEdlbmVyYXRvcgotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZShTdHJpbmcgcHVOYW1lLCBKcGFQcm9qZWN0IHByb2plY3QsIE91dHB1dE1vZGUgb3V0cHV0TW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChwdU5hbWUgPT0gbnVsbCB8fCBwdU5hbWUubGVuZ3RoKCkgPT0gMCB8fCBwcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCW5ldyBFY2xpcHNlTGlua0RETEdlbmVyYXRvcihwdU5hbWUsIHByb2plY3QsIG91dHB1dE1vZGUpLmdlbmVyYXRlKG1vbml0b3IpOwotCX0KLQotCXByaXZhdGUgRWNsaXBzZUxpbmtERExHZW5lcmF0b3IoU3RyaW5nIHB1TmFtZSwgSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBPdXRwdXRNb2RlIG91dHB1dE1vZGUpIHsKLQkJc3VwZXIocHVOYW1lLCBqcGFQcm9qZWN0LCBvdXRwdXRNb2RlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZENvbm5lY3Rpb25Qcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlzdXBlci5idWlsZENvbm5lY3Rpb25Qcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsIAotCQkJQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19EUklWRVIsCi0JCQkoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldERyaXZlckNsYXNzTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCi0JCQlDb25uZWN0aW9uLkVDTElQU0VMSU5LX1VSTCwKLQkJCShjcCA9PSBudWxsKSA/ICIiIDogY3AuZ2V0VVJMKCkpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywKLQkJCUNvbm5lY3Rpb24uRUNMSVBTRUxJTktfVVNFUiwKLQkJCShjcCA9PSBudWxsKSA/ICIiIDogY3AuZ2V0VXNlck5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAotCQkJQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19QQVNTV09SRCwKLQkJCShjcCA9PSBudWxsKSA/ICIiIDogY3AuZ2V0VXNlclBhc3N3b3JkKCkpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvbGlidmFsL0VjbGlwc2VMaW5rRWNsaXBzZUxpbmtCdW5kbGVzTGlicmFyeVZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvbGlidmFsL0VjbGlwc2VMaW5rRWNsaXBzZUxpbmtCdW5kbGVzTGlicmFyeVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTFlYWYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2xpYnZhbC9FY2xpcHNlTGlua0VjbGlwc2VMaW5rQnVuZGxlc0xpYnJhcnlWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5saWJ2YWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJwcm92LkpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmxpYnByb3YuSnBhT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5saWJ2YWwuQWJzdHJhY3RPc2dpQnVuZGxlc0xpYnJhcnlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnBsYXRmb3JtLkVjbGlwc2VMaW5rUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRWNsaXBzZUxpbmtCdW5kbGVzTGlicmFyeVZhbGlkYXRvcgotCWV4dGVuZHMgQWJzdHJhY3RPc2dpQnVuZGxlc0xpYnJhcnlWYWxpZGF0b3IgewotCQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKEpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY29uZmlnKSB7Ci0JCUpwYU9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBqcGFDb25maWcgCi0JCQkJPSAoSnBhT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnKSBjb25maWc7Ci0JCU1hcDxTdHJpbmcsIFZlcnNpb25SYW5nZVtdPiBidW5kbGVWZXJzaW9uUmFuZ2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBWZXJzaW9uUmFuZ2VbXT4oKTsKLQkJSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBwbGF0Zm9ybSA9IGpwYUNvbmZpZy5nZXRKcGFQbGF0Zm9ybSgpOwotCQlpZiAoRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzFfMC5lcXVhbHMocGxhdGZvcm0pKSB7Ci0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvcmUiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMCwgMy4wKSIpfSk7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgVmVyc2lvblJhbmdlW10ge25ldyBWZXJzaW9uUmFuZ2UoIlsxLjAsIDMuMCkiKX0pOyAvLyROT04tTkxTLTEkCi0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFzbSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMS4wLCAzLjApIil9KTsgLy8kTk9OLU5MUy0xJAotCQkJYnVuZGxlVmVyc2lvblJhbmdlcy5wdXQoCi0JCQkJCSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbnRsciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMS4wLCAzLjApIil9KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKEVjbGlwc2VMaW5rUGxhdGZvcm0uVkVSU0lPTl8xXzEuZXF1YWxzKHBsYXRmb3JtKSkgewotCQkJYnVuZGxlVmVyc2lvblJhbmdlcy5wdXQoCi0JCQkJCSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb3JlIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgVmVyc2lvblJhbmdlW10ge25ldyBWZXJzaW9uUmFuZ2UoIlsxLjEsIDMuMCkiKX0pOyAvLyROT04tTkxTLTEkCi0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMS4xLCAzLjApIil9KTsgLy8kTk9OLU5MUy0xJAotCQkJYnVuZGxlVmVyc2lvblJhbmdlcy5wdXQoCi0JCQkJCSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hc20iLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMSwgMy4wKSIpfSk7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW50bHIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMSwgMy4wKSIpfSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMV8yLmVxdWFscyhwbGF0Zm9ybSkpIHsKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29yZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMS4yLCAzLjApIil9KTsgLy8kTk9OLU5MUy0xJAotCQkJYnVuZGxlVmVyc2lvblJhbmdlcy5wdXQoCi0JCQkJCSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMiwgMy4wKSIpfSk7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYXNtIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgVmVyc2lvblJhbmdlW10ge25ldyBWZXJzaW9uUmFuZ2UoIlsxLjIsIDMuMCkiKX0pOyAvLyROT04tTkxTLTEkCi0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFudGxyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgVmVyc2lvblJhbmdlW10ge25ldyBWZXJzaW9uUmFuZ2UoIlsxLjIsIDMuMCkiKX0pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzJfMC5lcXVhbHMocGxhdGZvcm0pKSB7Ci0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvcmUiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzIuMCwgMy4wKSIpfSk7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgVmVyc2lvblJhbmdlW10ge25ldyBWZXJzaW9uUmFuZ2UoIlsyLjAsIDMuMCkiKX0pOyAvLyROT04tTkxTLTEkCi0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFzbSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMi4wLCAzLjApIil9KTsgLy8kTk9OLU5MUy0xJAotCQkJYnVuZGxlVmVyc2lvblJhbmdlcy5wdXQoCi0JCQkJCSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbnRsciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMi4wLCAzLjApIil9KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKEVjbGlwc2VMaW5rUGxhdGZvcm0uVkVSU0lPTl8yXzEuZXF1YWxzKHBsYXRmb3JtKSkgewotCQkJYnVuZGxlVmVyc2lvblJhbmdlcy5wdXQoCi0JCQkJCSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb3JlIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgVmVyc2lvblJhbmdlW10ge25ldyBWZXJzaW9uUmFuZ2UoIlsyLjEsIDMuMCkiKX0pOyAvLyROT04tTkxTLTEkCi0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMi4xLCAzLjApIil9KTsgLy8kTk9OLU5MUy0xJAotCQkJYnVuZGxlVmVyc2lvblJhbmdlcy5wdXQoCi0JCQkJCSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hc20iLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzIuMSwgMy4wKSIpfSk7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW50bHIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzIuMSwgMy4wKSIpfSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMl8yLmVxdWFscyhwbGF0Zm9ybSkpIHsKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29yZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMi4yLCAzLjApIil9KTsgLy8kTk9OLU5MUy0xJAotCQkJYnVuZGxlVmVyc2lvblJhbmdlcy5wdXQoCi0JCQkJCSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzIuMiwgMy4wKSIpfSk7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYXNtIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgVmVyc2lvblJhbmdlW10ge25ldyBWZXJzaW9uUmFuZ2UoIlsyLjIsIDMuMCkiKX0pOyAvLyROT04tTkxTLTEkCi0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFudGxyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgVmVyc2lvblJhbmdlW10ge25ldyBWZXJzaW9uUmFuZ2UoIlsyLjIsIDMuMCkiKX0pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzJfMy5lcXVhbHMocGxhdGZvcm0pKSB7Ci0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvcmUiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzIuMywgMy4wKSIpfSk7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgVmVyc2lvblJhbmdlW10ge25ldyBWZXJzaW9uUmFuZ2UoIlsyLjMsIDMuMCkiKX0pOyAvLyROT04tTkxTLTEkCi0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFzbSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMi4zLCAzLjApIil9KTsgLy8kTk9OLU5MUy0xJAotCQkJYnVuZGxlVmVyc2lvblJhbmdlcy5wdXQoCi0JCQkJCSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbnRsciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMi4zLCAzLjApIil9KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKEVjbGlwc2VMaW5rUGxhdGZvcm0uVkVSU0lPTl8yXzQuZXF1YWxzKHBsYXRmb3JtKSkgewotCQkJYnVuZGxlVmVyc2lvblJhbmdlcy5wdXQoCi0JCQkJCSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb3JlIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgVmVyc2lvblJhbmdlW10ge25ldyBWZXJzaW9uUmFuZ2UoIlsyLjQsIDMuMCkiKX0pOyAvLyROT04tTkxTLTEkCi0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMi40LCAzLjApIil9KTsgLy8kTk9OLU5MUy0xJAotCQkJYnVuZGxlVmVyc2lvblJhbmdlcy5wdXQoCi0JCQkJCSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hc20iLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzIuNCwgMy4wKSIpfSk7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW50bHIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzIuNCwgMy4wKSIpfSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJcmV0dXJuIHZhbGlkYXRlKGpwYUNvbmZpZywgYnVuZGxlVmVyc2lvblJhbmdlcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvbGlidmFsL0VjbGlwc2VMaW5rVXNlckxpYnJhcnlWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2xpYnZhbC9FY2xpcHNlTGlua1VzZXJMaWJyYXJ5VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZmRhZDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvbGlidmFsL0VjbGlwc2VMaW5rVXNlckxpYnJhcnlWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmxpYnZhbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnByb3YuSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlidmFsLkxpYnJhcnlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmxpYnZhbC5FY2xpcHNlTGlua0xpYlZhbFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmxpYnByb3YuSnBhVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnBsYXRmb3JtLkVjbGlwc2VMaW5rUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLQotLyoqCi0gKiBMaWJyYXJ5IHZhbGlkYXRvciBmb3IgRWNsaXBzZUxpbmsgdXNlciBsaWJyYXJpZXMuCi0gKiAKLSAqIEluIG9yZGVyIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGNvcnJlY3QgZWNsaXBzZWxpbmsuamFyIGlzIHByZXNlbnQgaW4gdGhlIHVzZXIgbGlicmFyeSwgdGhlIHZlcnNpb24KLSAqIGNsYXNzIHdoaWNoIGFwcGVhcnMgaW4gc3RhbmRhcmQgRWNsaXBzZUxpbmsgbGlicmFyaWVzIHdpbGwgYmUgZXhhbWluZWQgYW5kIGNvbXBhcmVkIGFnYWluc3QgdGhlCi0gKiB1bmlvbiBvZiBjYWxjdWxhdGVkIHZlcnNpb24gcmFuZ2VzLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHNwZWNpZmllZCBpbiB0aGUgY29uZmlnLgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtVc2VyTGlicmFyeVZhbGlkYXRvcgotCQlpbXBsZW1lbnRzIExpYnJhcnlWYWxpZGF0b3IgewotCQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKEpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY29uZmlnKSB7Ci0JCUpwYVVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGpwYUNvbmZpZyAKLQkJCQk9IChKcGFVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZykgY29uZmlnOwotCQlKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIHBsYXRmb3JtID0ganBhQ29uZmlnLmdldEpwYVBsYXRmb3JtKCk7Ci0JCVNldDxWZXJzaW9uUmFuZ2U+IHZlcnNpb25SYW5nZXMgPSBuZXcgSGFzaFNldDxWZXJzaW9uUmFuZ2U+KCk7Ci0JCQotCQlpZiAoRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzFfMC5lcXVhbHMocGxhdGZvcm0pKSB7Ci0JCQl2ZXJzaW9uUmFuZ2VzLmFkZChuZXcgVmVyc2lvblJhbmdlKCJbMS4wLCAzLjApIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzFfMS5lcXVhbHMocGxhdGZvcm0pKSB7Ci0JCQl2ZXJzaW9uUmFuZ2VzLmFkZChuZXcgVmVyc2lvblJhbmdlKCJbMS4xLCAzLjApIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzFfMi5lcXVhbHMocGxhdGZvcm0pKSB7Ci0JCQl2ZXJzaW9uUmFuZ2VzLmFkZChuZXcgVmVyc2lvblJhbmdlKCJbMS4yLCAzLjApIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzJfMC5lcXVhbHMocGxhdGZvcm0pKSB7Ci0JCQl2ZXJzaW9uUmFuZ2VzLmFkZChuZXcgVmVyc2lvblJhbmdlKCJbMi4wLCAzLjApIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzJfMS5lcXVhbHMocGxhdGZvcm0pKSB7Ci0JCQl2ZXJzaW9uUmFuZ2VzLmFkZChuZXcgVmVyc2lvblJhbmdlKCJbMi4xLCAzLjApIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzJfMi5lcXVhbHMocGxhdGZvcm0pKSB7Ci0JCQl2ZXJzaW9uUmFuZ2VzLmFkZChuZXcgVmVyc2lvblJhbmdlKCJbMi4yLCAzLjApIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzJfMy5lcXVhbHMocGxhdGZvcm0pKSB7Ci0JCQl2ZXJzaW9uUmFuZ2VzLmFkZChuZXcgVmVyc2lvblJhbmdlKCJbMi4zLCAzLjApIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzJfNC5lcXVhbHMocGxhdGZvcm0pKSB7Ci0JCQl2ZXJzaW9uUmFuZ2VzLmFkZChuZXcgVmVyc2lvblJhbmdlKCJbMi40LCAzLjApIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXJldHVybiBFY2xpcHNlTGlua0xpYlZhbFV0aWwudmFsaWRhdGUoanBhQ29uZmlnLnJlc29sdmUoKSwgdmVyc2lvblJhbmdlcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0VjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ2YjNlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0VjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5wbGF0Zm9ybS5FY2xpcHNlTGlua1BsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMi5FY2xpcHNlTGluazFfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGluazJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmsyXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rMl80OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKLQlleHRlbmRzIE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyCi17Ci0JLyoqCi0JICogcmVxdWlyZWQgZGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uKGdldERhdGFNb2RlbCgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmlsZU5hbWUoKSB7Ci0JCXJldHVybiBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX1JVTlRJTUVfUEFUSC5sYXN0U2VnbWVudCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWZXJzaW9uKCkgewotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSB0aGlzLmdldEpwYVByb2plY3QoKTsKLQkJaWYgKGpwYVByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJldHVybiBqcGFQcm9qZWN0LmdldEpwYVBsYXRmb3JtKCkuZ2V0TW9zdFJlY2VudFN1cHBvcnRlZFJlc291cmNlVHlwZSgKLQkJCQkJSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFKS5nZXRWZXJzaW9uKCk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCS8vIGVjbGlwc2VsaW5rIGNvbnRlbnQgbm90IHN1cHBvcnRlZCBmb3IgcHJvamVjdAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmlsZVZlcnNpb25TdXBwb3J0ZWQoU3RyaW5nIGZpbGVWZXJzaW9uKSB7Ci0JCXJldHVybiBmaWxlVmVyc2lvbi5lcXVhbHMoRWNsaXBzZUxpbmsuU0NIRU1BX1ZFUlNJT04pCi0JCQkJfHwgZmlsZVZlcnNpb24uZXF1YWxzKEVjbGlwc2VMaW5rMV8xLlNDSEVNQV9WRVJTSU9OKQotCQkJCXx8IGZpbGVWZXJzaW9uLmVxdWFscyhFY2xpcHNlTGluazFfMi5TQ0hFTUFfVkVSU0lPTikKLQkJCQl8fCBmaWxlVmVyc2lvbi5lcXVhbHMoRWNsaXBzZUxpbmsyXzAuU0NIRU1BX1ZFUlNJT04pCi0JCQkJfHwgZmlsZVZlcnNpb24uZXF1YWxzKEVjbGlwc2VMaW5rMl8xLlNDSEVNQV9WRVJTSU9OKQotCQkJCXx8IGZpbGVWZXJzaW9uLmVxdWFscyhFY2xpcHNlTGluazJfMi5TQ0hFTUFfVkVSU0lPTikKLQkJCQl8fCBmaWxlVmVyc2lvbi5lcXVhbHMoRWNsaXBzZUxpbmsyXzMuU0NIRU1BX1ZFUlNJT04pCi0JCQkJfHwgZmlsZVZlcnNpb24uZXF1YWxzKEVjbGlwc2VMaW5rMl80LlNDSEVNQV9WRVJTSU9OKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmlsZVZlcnNpb25TdXBwb3J0ZWRGb3JGYWNldFZlcnNpb24oU3RyaW5nIGZpbGVWZXJzaW9uLCBTdHJpbmcganBhRmFjZXRWZXJzaW9uKSB7Ci0JCS8vIGFzc3VtZSB0aGF0IHBsYXRmb3JtIGhhcyBiZWVuIHBvbGljZWQgZm9yIGZhY2V0IHZlcnNpb24gYWxyZWFkeQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTdXBwb3J0ZWRQbGF0Zm9ybUlkKFN0cmluZyBpZCkgewotCQlKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIHBsYXRmb3JtID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKcGFQbGF0Zm9ybShpZCk7Ci0JCWlmIChwbGF0Zm9ybSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIEVjbGlwc2VMaW5rUGxhdGZvcm0uR1JPVVAuZXF1YWxzKHBsYXRmb3JtLmdldEdyb3VwKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1NzNhMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0VjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuQWJzdHJhY3RYbWxSZXNvdXJjZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uIGV4dGVuZHMgT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdFhtbFJlc291cmNlUHJvdmlkZXIgZ2V0WG1sUmVzb3VyY2VQcm92aWRlcihJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVhtbFJlc291cmNlUHJvdmlkZXIuZ2V0WG1sUmVzb3VyY2VQcm92aWRlcihmaWxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQXJyYXkyXzNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0FycmF5Ml8zQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc2MWJhOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQXJyYXkyXzNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtBcnJheUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rQXJyYXlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQXJyYXlBbm5vdGF0aW9uMl8zOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkFycmF5Ci0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0FycmF5Ml8zQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtBcnJheTJfM0Fubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rQXJyYXkyXzNBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rQXJyYXlBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua0FycmF5QW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0FycmF5QW5ub3RhdGlvbjJfMy5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1MDRiZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5CYXNpY0NvbGxlY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZWRjMjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5CYXNpY01hcAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkzMjQ3OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IE51bGxFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5ZjVlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNoYW5nZVRyYWNraW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yMl8xQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvcjJfMUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZTg3ZDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yMl8xQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMTsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DbGFzc0V4dHJhY3RvcgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvcjJfMUFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3IyXzFBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yMl8xQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMShwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEuQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmMmMyYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ29udmVydAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OTliZDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ29udmVydGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCXB1YmxpYyBOZXN0YWJsZUFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIGludCBpbmRleCkgewotCQlyZXR1cm4gU291cmNlRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLmJ1aWxkU291cmNlQ29udmVydGVyQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuQ09OVkVSVEVSOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5DT05WRVJURVJTOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5DT05WRVJURVJTX19WQUxVRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MTcwNmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NvbnZlcnRlcnMyXzJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlOYW1lZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU5hbWVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHlwZUNvbnZlcnRlcnMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVjbGlwc2VMaW5rQ29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rQ29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rQ29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlTmFtZWRBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlOYW1lZEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uLCBnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuQ09OVkVSVEVSUzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkwYWIwMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ3VzdG9taXplcgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTQ2YzVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb247Ci0gCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkV4aXN0ZW5jZUNoZWNraW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk5NjVmZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Kb2luRmV0Y2gKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IE51bGxFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24ocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rTWFwS2V5Q29udmVydDJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rTWFwS2V5Q29udmVydDJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYTcxNmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua01hcEtleUNvbnZlcnQyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtNYXBLZXlDb252ZXJ0QW5ub3RhdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtNYXBLZXlDb252ZXJ0QW5ub3RhdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua01hcEtleUNvbnZlcnRBbm5vdGF0aW9uMl8wOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk1hcEtleUNvbnZlcnQKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTWFwS2V5Q29udmVydDJfMEFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rTWFwS2V5Q29udmVydDJfMEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rTWFwS2V5Q29udmVydDJfMEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtNYXBLZXlDb252ZXJ0QW5ub3RhdGlvbjJfMChwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtNYXBLZXlDb252ZXJ0QW5ub3RhdGlvbjJfMChwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcEtleUNvbnZlcnRBbm5vdGF0aW9uMl8wLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rTXVsdGl0ZW5hbnQyXzNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua011bHRpdGVuYW50Ml8zQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwNzA1OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rTXVsdGl0ZW5hbnQyXzNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMzsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnQyXzNBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSAKLQkJCT0gbmV3IEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnQyXzNBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtNdWx0aXRlbmFudDJfM0Fubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBOdWxsRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OGJjZjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk11dGFibGUKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZTQ2ODMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuT2JqZWN0VHlwZUNvbnZlcnRlcgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBTb3VyY2VFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmJ1aWxkU291cmNlT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBpbmRleCk7Ci0JfQotCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUlM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUlNfX1ZBTFVFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcnMyXzJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGEyMDQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeU5hbWVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlTmFtZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UeXBlQ29udmVydGVycwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcnMyXzJBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJzMl8yQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VOYW1lZEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeU5hbWVkQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24sIGdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJTOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2U0MWMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSAKLQkJCT0gbmV3IEVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNjg0N2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUHJpdmF0ZU93bmVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMmEwYzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5SZWFkT25seQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZmY1MWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZFRyYW5zZm9ybWVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYyOGIwNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5TdHJ1Y3RDb252ZXJ0ZXIKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBOZXN0YWJsZUFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIGludCBpbmRleCkgewotCQlyZXR1cm4gU291cmNlRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLmJ1aWxkU291cmNlU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUlM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVJTX19WQUxVRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMzQ0NTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcnMyXzJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlOYW1lZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU5hbWVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHlwZUNvbnZlcnRlcnMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlTmFtZWRBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlOYW1lZEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uLCBnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUlM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rU3RydWN0dXJlMl8zQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtTdHJ1Y3R1cmUyXzNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2U5ZGNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtTdHJ1Y3R1cmUyXzNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtTdHJ1Y3R1cmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua1N0cnVjdHVyZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3R1cmVBbm5vdGF0aW9uMl8zOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlNydWN0dXJlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1N0cnVjdHVyZTJfM0Fubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rU3RydWN0dXJlMl8zQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtTdHJ1Y3R1cmUyXzNBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rU3RydWN0dXJlQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtTdHJ1Y3R1cmVBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rU3RydWN0dXJlQW5ub3RhdGlvbjJfMy5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDQ0ODljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFIAotCQkJPSBuZXcgRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzNBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIFNvdXJjZUVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuYnVpbGRTb3VyY2VUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyhwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TX19WQUxVRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMyXzNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zMl8zQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmOTAyMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMyXzNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlOYW1lZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU5hbWVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zMl8zQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uczJfM0Fubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMyXzNBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZU5hbWVkQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5TmFtZWRBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbiwgZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQyN2ZiMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlRyYW5zZm9ybWF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IE51bGxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZTg2MDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHlwZUNvbnZlcnRlcgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBTb3VyY2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmJ1aWxkU291cmNlVHlwZUNvbnZlcnRlckFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBpbmRleCk7Ci0JfQotCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVJTOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUlNfX1ZBTFVFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcnMyXzJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTRlYjA0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeU5hbWVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlTmFtZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UeXBlQ29udmVydGVycwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyczJfMkFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcnMyXzJBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJzMl8yQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VOYW1lZEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeU5hbWVkQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24sIGdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUlM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMmIwZDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlZhcmlhYmxlT25lVG9PbmUKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNzczZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLldyaXRlVHJhbnNmb3JtZXIKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFkMDU1Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVJc29sYXRpb25UeXBlMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGU8L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24KLQlleHRlbmRzIE51bGxBbm5vdGF0aW9uPEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24KLXsKLQlwcm90ZWN0ZWQgTnVsbEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQkvLyAqKioqKiB0eXBlCi0JcHVibGljIENhY2hlVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKENhY2hlVHlwZSB0eXBlKSB7Ci0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldFR5cGUodHlwZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFR5cGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vICoqKioqIHNpemUKLQlwdWJsaWMgSW50ZWdlciBnZXRTaXplKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaXplKEludGVnZXIgc2l6ZSkgewotCQlpZiAoc2l6ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRTaXplKHNpemUpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTaXplVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKiBzaGFyZWQKLQlwdWJsaWMgQm9vbGVhbiBnZXRTaGFyZWQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNoYXJlZChCb29sZWFuIHNoYXJlZCkgewotCQlpZiAoc2hhcmVkICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldFNoYXJlZChzaGFyZWQpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTaGFyZWRUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vICoqKioqIGFsd2F5cyByZWZyZXNoCi0JcHVibGljIEJvb2xlYW4gZ2V0QWx3YXlzUmVmcmVzaCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuIGFsd2F5c1JlZnJlc2gpIHsKLQkJaWYgKGFsd2F5c1JlZnJlc2ggIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0QWx3YXlzUmVmcmVzaChhbHdheXNSZWZyZXNoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0QWx3YXlzUmVmcmVzaFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKiogcmVmcmVzaCBvbmx5IGlmIG5ld2VyCi0JcHVibGljIEJvb2xlYW4gZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXIpIHsKLQkJaWYgKHJlZnJlc2hPbmx5SWZOZXdlciAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIocmVmcmVzaE9ubHlJZk5ld2VyKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmcmVzaE9ubHlJZk5ld2VyVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKiBkaXNhYmxlIGhpdHMKLQlwdWJsaWMgQm9vbGVhbiBnZXREaXNhYmxlSGl0cygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGlzYWJsZUhpdHMoQm9vbGVhbiBkaXNhYmxlSGl0cykgewotCQlpZiAoZGlzYWJsZUhpdHMgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0RGlzYWJsZUhpdHMoZGlzYWJsZUhpdHMpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXREaXNhYmxlSGl0c1RleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKiogY29vcmRpbmF0aW9uIHR5cGUKLQlwdWJsaWMgQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldENvb3JkaW5hdGlvblR5cGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvb3JkaW5hdGlvblR5cGUoQ2FjaGVDb29yZGluYXRpb25UeXBlIGNvb3JkaW5hdGlvblR5cGUpIHsKLQkJaWYgKGNvb3JkaW5hdGlvblR5cGUgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0Q29vcmRpbmF0aW9uVHlwZShjb29yZGluYXRpb25UeXBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29vcmRpbmF0aW9uVHlwZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKiogZXhwaXJ5Ci0JcHVibGljIEludGVnZXIgZ2V0RXhwaXJ5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeHBpcnkoSW50ZWdlciBleHBpcnkpIHsKLQkJaWYgKGV4cGlyeSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRFeHBpcnkoZXhwaXJ5KTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RXhwaXJ5VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKiBleHBpcnkgdGltZSBvZiBkYXkKLQlwdWJsaWMgRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIGdldEV4cGlyeVRpbWVPZkRheSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiBhZGRFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCXJldHVybiB0aGlzLmFkZEFubm90YXRpb24oKS5hZGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEV4cGlyeVRpbWVPZkRheVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKiBpc29sYXRpb24KLQlwdWJsaWMgQ2FjaGVJc29sYXRpb25UeXBlMl8yIGdldElzb2xhdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXNvbGF0aW9uKENhY2hlSXNvbGF0aW9uVHlwZTJfMiBpc29sYXRpb24pIHsKLQkJaWYgKGlzb2xhdGlvbiAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRJc29sYXRpb24oaXNvbGF0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0SXNvbGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzRiNjQ1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlOwotCi0vKioKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkpvaW5GZXRjaDwvY29kZT4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24KLQlleHRlbmRzIE51bGxBbm5vdGF0aW9uPEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbgotewotCXByb3RlY3RlZCBOdWxsRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBKb2luRmV0Y2hUeXBlIGdldFZhbHVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShKb2luRmV0Y2hUeXBlIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc5YWU1Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuTXVsdGl0ZW5hbnRUeXBlMl8zOwotCi0vKioKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk11bHRpdGVuYW50PC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zCi0JZXh0ZW5kcyBOdWxsQW5ub3RhdGlvbjxFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMz4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zCi17Ci0JcHJvdGVjdGVkIE51bGxFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMyhKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyAqKioqKiB0eXBlCi0JcHVibGljIE11bHRpdGVuYW50VHlwZTJfMyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoTXVsdGl0ZW5hbnRUeXBlMl8zIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vICoqKioqIGluY2x1ZGUgY3JpdGVyaWEKLQlwdWJsaWMgQm9vbGVhbiBnZXRJbmNsdWRlQ3JpdGVyaWEoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVDcml0ZXJpYShCb29sZWFuIGluY2x1ZGVDcml0ZXJpYSkgewotCQlpZiAoaW5jbHVkZUNyaXRlcmlhICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldEluY2x1ZGVDcml0ZXJpYShpbmNsdWRlQ3JpdGVyaWEpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRJbmNsdWRlQ3JpdGVyaWFUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNDM4MTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxCYXNlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMzsKLQotLyoqCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMKLQlleHRlbmRzIE51bGxCYXNlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb248RWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMz4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMKLXsJCi0JcHVibGljIE51bGxFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQkvLyAqKioqKiBjb250ZXh0IHByb3BlcnR5Ci0JcHVibGljIFN0cmluZyBnZXRDb250ZXh0UHJvcGVydHkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRleHRQcm9wZXJ0eShTdHJpbmcgY29udGV4dFByb3BlcnR5KSB7Ci0JCWlmIChjb250ZXh0UHJvcGVydHkgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0Q29udGV4dFByb3BlcnR5KGNvbnRleHRQcm9wZXJ0eSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnRleHRQcm9wZXJ0eVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKiogdGFibGUKLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYWJsZShTdHJpbmcgdGFibGUpIHsKLQkJaWYgKHRhYmxlICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldFRhYmxlKHRhYmxlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRhYmxlVG91Y2hlcyhpbnQgcG9zKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyAqKioqKiBwcmltYXJ5IGtleQotCXB1YmxpYyBCb29sZWFuIGdldFByaW1hcnlLZXkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByaW1hcnlLZXkoQm9vbGVhbiBwcmltYXJ5S2V5KSB7Ci0JCWlmIChwcmltYXJ5S2V5ICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldFByaW1hcnlLZXkocHJpbWFyeUtleSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFByaW1hcnlLZXlUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmFmMjljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uOwotCi0vKioKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlRyYW5zZm9ybWF0aW9uPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBOdWxsQW5ub3RhdGlvbjxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uCi17CQotCXByb3RlY3RlZCBOdWxsRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQkvLyAqKioqKiBmZXRjaAotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgZmV0Y2gpIHsKLQkJaWYgKGZldGNoICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldEZldGNoKGZldGNoKTsKLQkJfQkJCQkKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRGZXRjaFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8vICoqKioqIG9wdGlvbmFsCi0JcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKLQkJaWYgKG9wdGlvbmFsICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldE9wdGlvbmFsKG9wdGlvbmFsKTsKLQkJfQkJCQkKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE9wdGlvbmFsVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJDb2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJDb2x1bW5Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MDg3NjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQ29sdW1uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxDb2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW48L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQ29sdW1uQW5ub3RhdGlvbgotCWV4dGVuZHMgTnVsbENvbHVtbkFubm90YXRpb24KLXsJCi0JcHVibGljIE51bGxFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJDb2x1bW5Bbm5vdGF0aW9uKEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIGdldFdyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24pIHRoaXMucGFyZW50OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29sdW1uQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbigpLmFkZENvbHVtbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQXJyYXlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0FycmF5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTZiMGVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQXJyYXlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtBcnJheUFubm90YXRpb24yXzM7Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQXJyYXkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rQXJyYXlBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0FycmF5QW5ub3RhdGlvbjJfMwotewotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua0FycmF5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0Jhc2VDb252ZXJ0QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtCYXNlQ29udmVydEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVjY2I1Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0Jhc2VDb252ZXJ0QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2VDb252ZXJ0QW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT48dWw+Ci0gKiA8bGk+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ29udmVydAotICogPGxpPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk1hcEtleUNvbnZlcnQKLSAqIDwvdWw+PC9jb2RlPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtCYXNlQ29udmVydEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQmFzZUNvbnZlcnRBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQlwcm90ZWN0ZWQgQmluYXJ5RWNsaXBzZUxpbmtCYXNlQ29udmVydEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0VmFsdWVfKHRoaXMuYnVpbGRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29udmVydEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldFZhbHVlRWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWYWx1ZUVsZW1lbnROYW1lKCk7Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZVRvdWNoZXMoaW50IHBvcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0Jhc2VUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtCYXNlVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM0MzljOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0Jhc2VUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNlVHlwZUNvbnZlcnRlckFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+Ci0gKiA8dWw+Ci0gKiA8bGk+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHlwZUNvbnZlcnRlcgotICogPGxpPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk9iamVjdFR5cGVDb252ZXJ0ZXIKLSAqIDwvdWw+Ci0gKiA8L2NvZGU+Ci0gKi8KLWFic3RyYWN0IGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rQmFzZVR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtCYXNlVHlwZUNvbnZlcnRlckFubm90YXRpb24KLXsKLQlTdHJpbmcgZGF0YVR5cGU7Ci0JU3RyaW5nIG9iamVjdFR5cGU7Ci0KLQotCUJpbmFyeUVjbGlwc2VMaW5rQmFzZVR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMuZGF0YVR5cGUgPSB0aGlzLmJ1aWxkRGF0YVR5cGUoKTsKLQkJdGhpcy5vYmplY3RUeXBlID0gdGhpcy5idWlsZE9iamVjdFR5cGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERhdGFUeXBlXyh0aGlzLmJ1aWxkRGF0YVR5cGUoKSk7Ci0JCXRoaXMuc2V0T2JqZWN0VHlwZV8odGhpcy5idWlsZE9iamVjdFR5cGUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIGRhdGEgdHlwZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFUeXBlKFN0cmluZyBkYXRhVHlwZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGF0YVR5cGVfKFN0cmluZyBkYXRhVHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kYXRhVHlwZTsKLQkJdGhpcy5kYXRhVHlwZSA9IGRhdGFUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREFUQV9UWVBFX1BST1BFUlRZLCBvbGQsIGRhdGFUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFUeXBlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGF0YVR5cGUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKHRoaXMuZ2V0RGF0YVR5cGVFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldERhdGFUeXBlVGV4dFJhbmdlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlhYnN0cmFjdCBTdHJpbmcgZ2V0RGF0YVR5cGVFbGVtZW50TmFtZSgpOwotCi0JLy8gKioqKiogb2JqZWN0IHR5cGUKLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0VHlwZShTdHJpbmcgb2JqZWN0VHlwZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0T2JqZWN0VHlwZV8oU3RyaW5nIG9iamVjdFR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMub2JqZWN0VHlwZTsKLQkJdGhpcy5vYmplY3RUeXBlID0gb2JqZWN0VHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9UWVBFX1BST1BFUlRZLCBvbGQsIG9iamVjdFR5cGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3RUeXBlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkT2JqZWN0VHlwZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUodGhpcy5nZXRPYmplY3RUeXBlRWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRPYmplY3RUeXBlVGV4dFJhbmdlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlhYnN0cmFjdCBTdHJpbmcgZ2V0T2JqZWN0VHlwZUVsZW1lbnROYW1lKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2RiMWEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5CYXNpY0NvbGxlY3Rpb24KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uCi17Ci0JcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBhNjEyNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkJhc2ljTWFwCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24KLXsKLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNTNhYWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUlzb2xhdGlvblR5cGUyXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZTwvY29kZT4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbgotewotCXByaXZhdGUgQ2FjaGVUeXBlIHR5cGU7Ci0JcHJpdmF0ZSBJbnRlZ2VyIHNpemU7Ci0JcHJpdmF0ZSBCb29sZWFuIHNoYXJlZDsKLQlwcml2YXRlIEludGVnZXIgZXhwaXJ5OwotCXByaXZhdGUgRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIGV4cGlyeVRpbWVPZkRheTsKLQlwcml2YXRlIEJvb2xlYW4gYWx3YXlzUmVmcmVzaDsKLQlwcml2YXRlIEJvb2xlYW4gcmVmcmVzaE9ubHlJZk5ld2VyOwotCXByaXZhdGUgQm9vbGVhbiBkaXNhYmxlSGl0czsKLQlwcml2YXRlIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBjb29yZGluYXRpb25UeXBlOwotCXByaXZhdGUgQ2FjaGVJc29sYXRpb25UeXBlMl8yIGlzb2xhdGlvbjsKLQotCi0JcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMudHlwZSA9IHRoaXMuYnVpbGRUeXBlKCk7Ci0JCXRoaXMuc2l6ZSA9IHRoaXMuYnVpbGRTaXplKCk7Ci0JCXRoaXMuc2hhcmVkID0gdGhpcy5idWlsZFNoYXJlZCgpOwotCQl0aGlzLmV4cGlyeSA9IHRoaXMuYnVpbGRFeHBpcnkoKTsKLQkJdGhpcy5leHBpcnlUaW1lT2ZEYXkgPSB0aGlzLmJ1aWxkRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCXRoaXMuYWx3YXlzUmVmcmVzaCA9IHRoaXMuYnVpbGRBbHdheXNSZWZyZXNoKCk7Ci0JCXRoaXMucmVmcmVzaE9ubHlJZk5ld2VyID0gdGhpcy5idWlsZFJlZnJlc2hPbmx5SWZOZXdlcigpOwotCQl0aGlzLmRpc2FibGVIaXRzID0gdGhpcy5idWlsZERpc2FibGVIaXRzKCk7Ci0JCXRoaXMuY29vcmRpbmF0aW9uVHlwZSA9IHRoaXMuYnVpbGRDb29yZGluYXRpb25UeXBlKCk7Ci0JCXRoaXMuaXNvbGF0aW9uID0gdGhpcy5idWlsZElzb2xhdGlvbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JLy8gVE9ETwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0VHlwZV8odGhpcy5idWlsZFR5cGUoKSk7Ci0JCXRoaXMuc2V0U2l6ZV8odGhpcy5idWlsZFNpemUoKSk7Ci0JCXRoaXMuc2V0U2hhcmVkXyh0aGlzLmJ1aWxkU2hhcmVkKCkpOwotCQl0aGlzLnNldEV4cGlyeV8odGhpcy5idWlsZEV4cGlyeSgpKTsKLQkJdGhpcy51cGRhdGVFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJdGhpcy5zZXRBbHdheXNSZWZyZXNoXyh0aGlzLmJ1aWxkQWx3YXlzUmVmcmVzaCgpKTsKLQkJdGhpcy5zZXRSZWZyZXNoT25seUlmTmV3ZXJfKHRoaXMuYnVpbGRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCXRoaXMuc2V0RGlzYWJsZUhpdHNfKHRoaXMuYnVpbGREaXNhYmxlSGl0cygpKTsKLQkJdGhpcy5zZXRDb29yZGluYXRpb25UeXBlXyh0aGlzLmJ1aWxkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJdGhpcy5zZXRJc29sYXRpb25fKHRoaXMuYnVpbGRJc29sYXRpb24oKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENhY2hlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB0eXBlCi0JcHVibGljIENhY2hlVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy50eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoQ2FjaGVUeXBlIHR5cGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFR5cGVfKENhY2hlVHlwZSB0eXBlKSB7Ci0JCUNhY2hlVHlwZSBvbGQgPSB0aGlzLnR5cGU7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX1BST1BFUlRZLCBvbGQsIHR5cGUpOwotCX0KLQotCXByaXZhdGUgQ2FjaGVUeXBlIGJ1aWxkVHlwZSgpIHsKLQkJcmV0dXJuIENhY2hlVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNBQ0hFX19UWVBFKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUeXBlVGV4dFJhbmdlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBzaXplCi0JcHVibGljIEludGVnZXIgZ2V0U2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaXplKEludGVnZXIgc2l6ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2l6ZV8oSW50ZWdlciBzaXplKSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5zaXplOwotCQl0aGlzLnNpemUgPSBzaXplOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0laRV9QUk9QRVJUWSwgb2xkLCBzaXplKTsKLQl9Ci0KLQlwcml2YXRlIEludGVnZXIgYnVpbGRTaXplKCkgewotCQlyZXR1cm4gKEludGVnZXIpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuQ0FDSEVfX1NJWkUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2l6ZVRleHRSYW5nZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogc2hhcmVkCi0JcHVibGljIEJvb2xlYW4gZ2V0U2hhcmVkKCkgewotCQlyZXR1cm4gdGhpcy5zaGFyZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2hhcmVkKEJvb2xlYW4gc2hhcmVkKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTaGFyZWRfKEJvb2xlYW4gc2hhcmVkKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zaGFyZWQ7Ci0JCXRoaXMuc2hhcmVkID0gc2hhcmVkOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0hBUkVEX1BST1BFUlRZLCBvbGQsIHNoYXJlZCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkU2hhcmVkKCkgewotCQlyZXR1cm4gKEJvb2xlYW4pIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuQ0FDSEVfX1NIQVJFRCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTaGFyZWRUZXh0UmFuZ2UoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGV4cGlyeQotCXB1YmxpYyBJbnRlZ2VyIGdldEV4cGlyeSgpIHsKLQkJcmV0dXJuIHRoaXMuZXhwaXJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4cGlyeShJbnRlZ2VyIGV4cGlyeSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RXhwaXJ5XyhJbnRlZ2VyIGV4cGlyeSkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuZXhwaXJ5OwotCQl0aGlzLmV4cGlyeSA9IGV4cGlyeTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVYUElSWV9QUk9QRVJUWSwgb2xkLCBleHBpcnkpOwotCX0KLQotCXByaXZhdGUgSW50ZWdlciBidWlsZEV4cGlyeSgpIHsKLQkJcmV0dXJuIChJbnRlZ2VyKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNBQ0hFX19FWFBJUlkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RXhwaXJ5VGV4dFJhbmdlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBleHBpcnkgdGltZSBvZiBkYXkKLQlwdWJsaWMgRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIGdldEV4cGlyeVRpbWVPZkRheSgpIHsKLQkJcmV0dXJuIHRoaXMuZXhwaXJ5VGltZU9mRGF5OwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gYWRkRXhwaXJ5VGltZU9mRGF5KCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIGJ1aWxkRXhwaXJ5VGltZU9mRGF5KCkgewotCQlJQW5ub3RhdGlvbiBqZHRUaW1lT2ZEYXkgPSB0aGlzLmdldEpkdEV4cGlyeVRpbWVPZkRheSgpOwotCQlyZXR1cm4gKGpkdFRpbWVPZkRheSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkVGltZU9mRGF5KGpkdFRpbWVPZkRheSk7Ci0JfQotCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gYnVpbGRUaW1lT2ZEYXkoSUFubm90YXRpb24gamR0VGltZU9mRGF5KSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uKHRoaXMsIGpkdFRpbWVPZkRheSk7Ci0JfQotCi0JcHJpdmF0ZSBJQW5ub3RhdGlvbiBnZXRKZHRFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCXJldHVybiAoSUFubm90YXRpb24pIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEV4cGlyeVRpbWVPZkRheShFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gZXhwaXJ5VGltZU9mRGF5KSB7Ci0JCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiBvbGQgPSB0aGlzLmV4cGlyeVRpbWVPZkRheTsKLQkJdGhpcy5leHBpcnlUaW1lT2ZEYXkgPSBleHBpcnlUaW1lT2ZEYXk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWFBJUllfVElNRV9PRl9EQVlfUFJPUEVSVFksIG9sZCwgZXhwaXJ5VGltZU9mRGF5KTsKLQl9Ci0KLQkvLyBUT0RPCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUV4cGlyeVRpbWVPZkRheSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0vLwkJSUFubm90YXRpb24gamR0VGltZU9mRGF5ID0gdGhpcy5nZXRKZHRFeHBpcnlUaW1lT2ZEYXkoKTsKLS8vCQlpZiAoamR0VGltZU9mRGF5ID09IG51bGwpIHsKLS8vCQkJdGhpcy5zZXRFeHBpcnlUaW1lT2ZEYXkobnVsbCk7Ci0vLwkJfSBlbHNlIHsKLS8vCQkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5ID09IG51bGwpIHsKLS8vCQkJCXRoaXMuc2V0RXhwaXJ5VGltZU9mRGF5KHRoaXMuYnVpbGRUaW1lT2ZEYXkoamR0VGltZU9mRGF5KSk7Ci0vLwkJCX0gZWxzZSB7Ci0vLwkJCQl0aGlzLmV4cGlyeVRpbWVPZkRheS51cGRhdGUoamR0VGltZU9mRGF5KTsKLS8vCQkJfQotLy8JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEV4cGlyeVRpbWVPZkRheVRleHRSYW5nZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogYWx3YXlzIHJlZnJlc2gKLQlwdWJsaWMgQm9vbGVhbiBnZXRBbHdheXNSZWZyZXNoKCkgewotCQlyZXR1cm4gdGhpcy5hbHdheXNSZWZyZXNoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsd2F5c1JlZnJlc2goQm9vbGVhbiBhbHdheXNSZWZyZXNoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRBbHdheXNSZWZyZXNoXyhCb29sZWFuIGFsd2F5c1JlZnJlc2gpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmFsd2F5c1JlZnJlc2g7Ci0JCXRoaXMuYWx3YXlzUmVmcmVzaCA9IGFsd2F5c1JlZnJlc2g7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChBTFdBWVNfUkVGUkVTSF9QUk9QRVJUWSwgb2xkLCBhbHdheXNSZWZyZXNoKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGRBbHdheXNSZWZyZXNoKCkgewotCQlyZXR1cm4gKEJvb2xlYW4pIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuQ0FDSEVfX0FMV0FZU19SRUZSRVNIKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEFsd2F5c1JlZnJlc2hUZXh0UmFuZ2UoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIHJlZnJlc2ggb25seSBpZiBuZXdlcgotCXB1YmxpYyBCb29sZWFuIGdldFJlZnJlc2hPbmx5SWZOZXdlcigpIHsKLQkJcmV0dXJuIHRoaXMucmVmcmVzaE9ubHlJZk5ld2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVmcmVzaE9ubHlJZk5ld2VyXyhCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcikgewotCQlCb29sZWFuIG9sZCA9IHRoaXMucmVmcmVzaE9ubHlJZk5ld2VyOwotCQl0aGlzLnJlZnJlc2hPbmx5SWZOZXdlciA9IHJlZnJlc2hPbmx5SWZOZXdlcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFRlJFU0hfT05MWV9JRl9ORVdFUl9QUk9QRVJUWSwgb2xkLCByZWZyZXNoT25seUlmTmV3ZXIpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZFJlZnJlc2hPbmx5SWZOZXdlcigpIHsKLQkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNBQ0hFX19SRUZSRVNIX09OTFlfSUZfTkVXRVIpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmcmVzaE9ubHlJZk5ld2VyVGV4dFJhbmdlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBkaXNhYmxlIGhpdHMKLQlwdWJsaWMgQm9vbGVhbiBnZXREaXNhYmxlSGl0cygpIHsKLQkJcmV0dXJuIHRoaXMuZGlzYWJsZUhpdHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGlzYWJsZUhpdHMoQm9vbGVhbiBkaXNhYmxlSGl0cykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlzYWJsZUhpdHNfKEJvb2xlYW4gZGlzYWJsZUhpdHMpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmRpc2FibGVIaXRzOwotCQl0aGlzLmRpc2FibGVIaXRzID0gZGlzYWJsZUhpdHM7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVNBQkxFX0hJVFNfUFJPUEVSVFksIG9sZCwgZGlzYWJsZUhpdHMpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZERpc2FibGVIaXRzKCkgewotCQlyZXR1cm4gKEJvb2xlYW4pIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuQ0FDSEVfX0RJU0FCTEVfSElUUyk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXREaXNhYmxlSGl0c1RleHRSYW5nZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogY29vcmRpbmF0aW9uIHR5cGUKLQlwdWJsaWMgQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldENvb3JkaW5hdGlvblR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmNvb3JkaW5hdGlvblR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29vcmRpbmF0aW9uVHlwZShDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q29vcmRpbmF0aW9uVHlwZV8oQ2FjaGVDb29yZGluYXRpb25UeXBlIGNvb3JkaW5hdGlvblR5cGUpIHsKLQkJQ2FjaGVDb29yZGluYXRpb25UeXBlIG9sZCA9IHRoaXMuY29vcmRpbmF0aW9uVHlwZTsKLQkJdGhpcy5jb29yZGluYXRpb25UeXBlID0gY29vcmRpbmF0aW9uVHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRZUEVfUFJPUEVSVFksIG9sZCwgY29vcmRpbmF0aW9uVHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSBDYWNoZUNvb3JkaW5hdGlvblR5cGUgYnVpbGRDb29yZGluYXRpb25UeXBlKCkgewotCQlyZXR1cm4gQ2FjaGVDb29yZGluYXRpb25UeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuQ0FDSEVfX0NPT1JESU5BVElPTl9UWVBFKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRDb29yZGluYXRpb25UeXBlVGV4dFJhbmdlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBpc29sYXRpb24KLQlwdWJsaWMgQ2FjaGVJc29sYXRpb25UeXBlMl8yIGdldElzb2xhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuaXNvbGF0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElzb2xhdGlvbihDYWNoZUlzb2xhdGlvblR5cGUyXzIgaXNvbGF0aW9uKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRJc29sYXRpb25fKENhY2hlSXNvbGF0aW9uVHlwZTJfMiBpc29sYXRpb24pIHsKLQkJQ2FjaGVJc29sYXRpb25UeXBlMl8yIG9sZCA9IHRoaXMuaXNvbGF0aW9uOwotCQl0aGlzLmlzb2xhdGlvbiA9IGlzb2xhdGlvbjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKElTT0xBVElPTl9QUk9QRVJUWSwgb2xkLCBpc29sYXRpb24pOwotCX0KLQotCXByaXZhdGUgQ2FjaGVJc29sYXRpb25UeXBlMl8yIGJ1aWxkSXNvbGF0aW9uKCkgewotCQlyZXR1cm4gQ2FjaGVJc29sYXRpb25UeXBlMl8yLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuQ0FDSEVfX0lTT0xBVElPTikpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0SXNvbGF0aW9uVGV4dFJhbmdlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0MTEwZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2hhbmdlVHJhY2tpbmc8L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24KLXsKLQlwcml2YXRlIENoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZTsKLQotCi0JcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCS8vIFRPRE8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKENoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKENoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZSkgewotCQlDaGFuZ2VUcmFja2luZ1R5cGUgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCXByaXZhdGUgQ2hhbmdlVHJhY2tpbmdUeXBlIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiBDaGFuZ2VUcmFja2luZ1R5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkdfX1ZBTFVFKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ODYwY2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMTsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DbGFzc0V4dHJhY3RvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEKLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xIAotewotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0KLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEoSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNMQVNTX0VYVFJBQ1RPUl9fVkFMVUUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUKLQkvKioKLQkgKiBiaW5hcnkgaXMgYWxyZWFkeSBmdWxseS1xdWFsaWZpZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjcxZWM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ29udmVyc2lvblZhbHVlPC9jb2RlPgotICovCi1maW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbgotewotCXByaXZhdGUgU3RyaW5nIGRhdGFWYWx1ZTsKLQlwcml2YXRlIFN0cmluZyBvYmplY3RWYWx1ZTsKLQotCi0JQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMuZGF0YVZhbHVlID0gdGhpcy5idWlsZERhdGFWYWx1ZSgpOwotCQl0aGlzLm9iamVjdFZhbHVlID0gdGhpcy5idWlsZE9iamVjdFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERhdGFWYWx1ZV8odGhpcy5idWlsZERhdGFWYWx1ZSgpKTsKLQkJdGhpcy5zZXRPYmplY3RWYWx1ZV8odGhpcy5idWlsZE9iamVjdFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIGRhdGEgdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldERhdGFWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YVZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFWYWx1ZShTdHJpbmcgZGF0YVZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREYXRhVmFsdWVfKFN0cmluZyBkYXRhVmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGF0YVZhbHVlOwotCQl0aGlzLmRhdGFWYWx1ZSA9IGRhdGFWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVkFMVUVfUFJPUEVSVFksIG9sZCwgZGF0YVZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERhdGFWYWx1ZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRV9fREFUQV9WQUxVRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXREYXRhVmFsdWVUZXh0UmFuZ2UoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIG9iamVjdCB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9iamVjdFZhbHVlKFN0cmluZyBvYmplY3RWYWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0T2JqZWN0VmFsdWVfKFN0cmluZyBvYmplY3RWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5vYmplY3RWYWx1ZTsKLQkJdGhpcy5vYmplY3RWYWx1ZSA9IG9iamVjdFZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1ZBTFVFX1BST1BFUlRZLCBvbGQsIG9iamVjdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE9iamVjdFZhbHVlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5DT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T2JqZWN0VmFsdWVUZXh0UmFuZ2UoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhiMmM5ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJ0PC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5RWNsaXBzZUxpbmtCYXNlQ29udmVydEFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24KLXsKLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuQ09OVkVSVF9fVkFMVUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNDZkZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ29udmVydGVyPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBTdHJpbmcgY29udmVydGVyQ2xhc3M7Ci0KLQotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5jb252ZXJ0ZXJDbGFzcyA9IHRoaXMuYnVpbGRDb252ZXJ0ZXJDbGFzcygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRDb252ZXJ0ZXJDbGFzc18odGhpcy5idWlsZENvbnZlcnRlckNsYXNzKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCaW5hcnlOYW1lZENvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLkNPTlZFUlRFUl9fTkFNRTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogY29udmVydGVyIGNsYXNzCi0JcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXJDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udmVydGVyQ2xhc3MoU3RyaW5nIGNvbnZlcnRlckNsYXNzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDb252ZXJ0ZXJDbGFzc18oU3RyaW5nIGNvbnZlcnRlckNsYXNzKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmNvbnZlcnRlckNsYXNzOwotCQl0aGlzLmNvbnZlcnRlckNsYXNzID0gY29udmVydGVyQ2xhc3M7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfQ0xBU1NfUFJPUEVSVFksIG9sZCwgY29udmVydGVyQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNsYXNzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQ29udmVydGVyQ2xhc3MoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNPTlZFUlRFUl9fQ09OVkVSVEVSX0NMQVNTKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRlckNsYXNzVGV4dFJhbmdlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb252ZXJ0ZXJDbGFzc0ltcGxlbWVudHNJbnRlcmZhY2UoU3RyaW5nIGludGVyZmFjZU5hbWUsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUwZTdkYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DdXN0b21pemVyPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbgotewotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0KLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEN1c3RvbWl6ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCQotCS8vICoqKioqIGZ1bGx5LXF1YWxpZmllZCBjdXN0b21pemVyIGNsYXNzIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUl9fVkFMVUUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGN1c3RvbWl6ZXJDbGFzc0ltcGxlbWVudHNJbnRlcmZhY2UoU3RyaW5nIGludGVyZmFjZU5hbWUsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDliMWFjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZVR5cGU7Ci0KLS8qKgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuRXhpc3RlbmNlQ2hlY2tpbmc8L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24KLXsKLQlwcml2YXRlIEV4aXN0ZW5jZVR5cGUgdmFsdWU7Ci0KLQotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBFeGlzdGVuY2VUeXBlIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShFeGlzdGVuY2VUeXBlIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oRXhpc3RlbmNlVHlwZSB2YWx1ZSkgewotCQlFeGlzdGVuY2VUeXBlIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIEV4aXN0ZW5jZVR5cGUgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIEV4aXN0ZW5jZVR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkdfX1ZBTFVFKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIxNmIxNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGU7Ci0KLS8qKgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuSm9pbkZldGNoPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24KLXsKLQlwcml2YXRlIEpvaW5GZXRjaFR5cGUgdmFsdWU7Ci0KLQotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCaW5hcnlKb2luRmV0Y2hBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIEpvaW5GZXRjaFR5cGUgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKEpvaW5GZXRjaFR5cGUgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFZhbHVlXyhKb2luRmV0Y2hUeXBlIHZhbHVlKSB7Ci0JCUpvaW5GZXRjaFR5cGUgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCXByaXZhdGUgSm9pbkZldGNoVHlwZSBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gSm9pbkZldGNoVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0hfX1ZBTFVFKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtNYXBLZXlDb252ZXJ0QW5ub3RhdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtNYXBLZXlDb252ZXJ0QW5ub3RhdGlvbjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDEwMmQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rTWFwS2V5Q29udmVydEFubm90YXRpb24yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua01hcEtleUNvbnZlcnRBbm5vdGF0aW9uMl8wOwotCi0vKioKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk1hcEtleUNvbnZlcnQ8L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua01hcEtleUNvbnZlcnRBbm5vdGF0aW9uMl8wCi0JZXh0ZW5kcyBCaW5hcnlFY2xpcHNlTGlua0Jhc2VDb252ZXJ0QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtNYXBLZXlDb252ZXJ0QW5ub3RhdGlvbjJfMAotewotCi0JcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rTWFwS2V5Q29udmVydEFubm90YXRpb24yXzAoSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBLZXlDb252ZXJ0QW5ub3RhdGlvbjJfMC5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuTUFQX0tFWV9DT05WRVJUX19WQUxVRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg5ZTM2Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuTXVsdGl0ZW5hbnRUeXBlMl8zOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk11bHRpdGVuYW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMwotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMKLXsKLQlwcml2YXRlIE11bHRpdGVuYW50VHlwZTJfMyB2YWx1ZTsKLQlwcml2YXRlIEJvb2xlYW4gaW5jbHVkZUNyaXRlcmlhOyAvLyBhZGRlZCBpbiBFY2xpcHNlTGluayAyLjQKLQotCi0JcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQkJdGhpcy5pbmNsdWRlQ3JpdGVyaWEgPSB0aGlzLmJ1aWxkSW5jbHVkZUNyaXRlcmlhKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7Ci0JCXRoaXMuc2V0SW5jbHVkZUNyaXRlcmlhXyh0aGlzLmJ1aWxkSW5jbHVkZUNyaXRlcmlhKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgTXVsdGl0ZW5hbnRUeXBlMl8zIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShNdWx0aXRlbmFudFR5cGUyXzMgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFZhbHVlXyhNdWx0aXRlbmFudFR5cGUyXzMgdmFsdWUpIHsKLQkJTXVsdGl0ZW5hbnRUeXBlMl8zIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIE11bHRpdGVuYW50VHlwZTJfMyBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gTXVsdGl0ZW5hbnRUeXBlMl8zLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuSk9JTl9GRVRDSF9fVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGluY2x1ZGUgY3JpdGVyaWEKLQlwdWJsaWMgQm9vbGVhbiBnZXRJbmNsdWRlQ3JpdGVyaWEoKSB7Ci0JCXJldHVybiB0aGlzLmluY2x1ZGVDcml0ZXJpYTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbmNsdWRlQ3JpdGVyaWEoQm9vbGVhbiBpbmNsdWRlQ3JpdGVyaWEpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEluY2x1ZGVDcml0ZXJpYV8oQm9vbGVhbiBpbmNsdWRlQ3JpdGVyaWEpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmluY2x1ZGVDcml0ZXJpYTsKLQkJdGhpcy5pbmNsdWRlQ3JpdGVyaWEgPSBpbmNsdWRlQ3JpdGVyaWE7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChJTkNMVURFX0NSSVRFUklBX1BST1BFUlRZLCBvbGQsIGluY2x1ZGVDcml0ZXJpYSk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkSW5jbHVkZUNyaXRlcmlhKCkgewotCQlyZXR1cm4gKEJvb2xlYW4pIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuTVVMVElURU5BTlRfX0lOQ0xVREVfQ1JJVEVSSUEpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0SW5jbHVkZUNyaXRlcmlhVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2JmZTJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5NdXRhYmxlPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbgotewotCXByaXZhdGUgQm9vbGVhbiB2YWx1ZTsKLQotCi0JcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBNdXRhYmxlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBCb29sZWFuIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLk1VVEFCTEVfX1ZBTFVFKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA4YTZlMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT4KLSAqIDx1bD4KLSAqIDxsaT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJ0ZXIKLSAqIDxsaT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5TdHJ1Y3RDb252ZXJ0ZXIKLSAqIDxsaT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UeXBlQ29udmVydGVyCi0gKiA8bGk+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuT2JqZWN0VHlwZUNvbnZlcnRlcgotICogPC91bD4KLSAqIDwvY29kZT4KLSAqLwotYWJzdHJhY3QgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIG5hbWU7Ci0KLQlCaW5hcnlFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLm5hbWUgPSB0aGlzLmJ1aWxkTmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0TmFtZV8odGhpcy5idWlsZE5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldE5hbWVFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCWFic3RyYWN0IFN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmN2I2YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk9iamVjdFR5cGVDb252ZXJ0ZXI8L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlFY2xpcHNlTGlua0Jhc2VUeXBlQ29udmVydGVyQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbgotewotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZTsKLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IGNvbnZlcnNpb25WYWx1ZXM7Ci0KLQotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMuZGVmYXVsdE9iamVjdFZhbHVlID0gdGhpcy5idWlsZERlZmF1bHRPYmplY3RWYWx1ZSgpOwotCQl0aGlzLmNvbnZlcnNpb25WYWx1ZXMgPSB0aGlzLmJ1aWxkQ29udmVyc2lvblZhbHVlcygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0T2JqZWN0VmFsdWVfKHRoaXMuYnVpbGREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCXRoaXMudXBkYXRlQ29udmVyc2lvblZhbHVlcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCaW5hcnlOYW1lZENvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fTkFNRTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEJpbmFyeUJhc2VUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0RGF0YVR5cGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFOwotCX0KLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXRPYmplY3RUeXBlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFOwotCX0KLQotCS8vICoqKioqKioqKiogT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogZGVmYXVsdCBvYmplY3QgdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRPYmplY3RWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE9iamVjdFZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRPYmplY3RWYWx1ZShTdHJpbmcgZGVmYXVsdE9iamVjdFZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0T2JqZWN0VmFsdWVfKFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdE9iamVjdFZhbHVlOwotCQl0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZSA9IGRlZmF1bHRPYmplY3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfT0JKRUNUX1ZBTFVFX1BST1BFUlRZLCBvbGQsIGRlZmF1bHRPYmplY3RWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREZWZhdWx0T2JqZWN0VmFsdWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREVGQVVMVF9PQkpFQ1RfVkFMVUUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RGVmYXVsdE9iamVjdFZhbHVlVGV4dFJhbmdlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBjb252ZXJzaW9uIHZhbHVlcwotCXB1YmxpYyBMaXN0SXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBnZXRDb252ZXJzaW9uVmFsdWVzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+KHRoaXMuY29udmVyc2lvblZhbHVlcyk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb252ZXJzaW9uVmFsdWVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVyc2lvblZhbHVlcy5zaXplKCk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBjb252ZXJzaW9uVmFsdWVBdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVyc2lvblZhbHVlcy5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gYWRkQ29udmVyc2lvblZhbHVlKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlQ29udmVyc2lvblZhbHVlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnZlcnNpb25WYWx1ZShpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBWZWN0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBidWlsZENvbnZlcnNpb25WYWx1ZXMoKSB7Ci0JCU9iamVjdFtdIGpkdENvbnZlcnNpb25WYWx1ZXMgPSB0aGlzLmdldEpkdE1lbWJlclZhbHVlcyhFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0NPTlZFUlNJT05fVkFMVUVTKTsKLQkJVmVjdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gcmVzdWx0ID0gbmV3IFZlY3RvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+KGpkdENvbnZlcnNpb25WYWx1ZXMubGVuZ3RoKTsKLQkJZm9yIChPYmplY3QgamR0Q29udmVyc2lvblZhbHVlIDogamR0Q29udmVyc2lvblZhbHVlcykgewotCQkJcmVzdWx0LmFkZChuZXcgQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uKHRoaXMsIChJQW5ub3RhdGlvbikgamR0Q29udmVyc2lvblZhbHVlKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyBUT0RPCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbnZlcnNpb25WYWx1ZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk4MjZiMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUHJpbWFyeUtleQotICovCi1wdWJsaWMgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbgotewotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU2NTI1Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUHJpdmF0ZU93bmVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbgotewotCi0JcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZjZDJhYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlJlYWRPbmx5Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24KLXsKLQotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzZjNTk0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5SZWFkVHJhbnNmb3JtZXIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5RWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbgotewotCi0JcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJpbmFyeVRyYW5zZm9ybWVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0VHJhbnNmb3JtZXJDbGFzc0VsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUl9fVFJBTlNGT1JNRVJfQ0xBU1M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldE1ldGhvZEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUl9fTUVUSE9EOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJiODM4Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlN0cnVjdENvbnZlcnRlcjwvY29kZT4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5RWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbgotewotCXByaXZhdGUgU3RyaW5nIGNvbnZlcnRlcjsKLQotCi0JcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLmNvbnZlcnRlciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0Q29udmVydGVyXyh0aGlzLmJ1aWxkQ29udmVydGVyKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCaW5hcnlOYW1lZENvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVJfX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFN0cnVjdENvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogY29udmVydGVyCi0JcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoU3RyaW5nIGNvbnZlcnRlcikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q29udmVydGVyXyhTdHJpbmcgY29udmVydGVyKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmNvbnZlcnRlcjsKLQkJdGhpcy5jb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfUFJPUEVSVFksIG9sZCwgY29udmVydGVyKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRlclRleHRSYW5nZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtTdHJ1Y3R1cmVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1N0cnVjdHVyZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U0MTQ0MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1N0cnVjdHVyZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdHVyZUFubm90YXRpb24yXzM7Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuU3RydWN0dXJlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua1N0cnVjdHVyZUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rU3RydWN0dXJlQW5ub3RhdGlvbjJfMwotewotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua1N0cnVjdHVyZUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmIwMDAwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlCYXNlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMzsKLQotLyoqCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMwotCWV4dGVuZHMgQmluYXJ5QmFzZURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zCi17Ci0JcHJpdmF0ZSBTdHJpbmcgY29udGV4dFByb3BlcnR5OwotCXByaXZhdGUgU3RyaW5nIHRhYmxlOwotCXByaXZhdGUgQm9vbGVhbiBwcmltYXJ5S2V5OwotCi0JcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMoSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5jb250ZXh0UHJvcGVydHkgPSB0aGlzLmJ1aWxkQ29udGV4dFByb3BlcnR5KCk7Ci0JCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUoKTsKLQkJdGhpcy5wcmltYXJ5S2V5ID0gdGhpcy5idWlsZFByaW1hcnlLZXkoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMy5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRDb250ZXh0UHJvcGVydHlfKHRoaXMuYnVpbGRDb250ZXh0UHJvcGVydHkoKSk7Ci0JCXRoaXMuc2V0VGFibGVfKHRoaXMuYnVpbGRUYWJsZSgpKTsKLQkJdGhpcy5zZXRQcmltYXJ5S2V5Xyh0aGlzLmJ1aWxkUHJpbWFyeUtleSgpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEJpbmFyeUJhc2VEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpc2NyaW1pbmF0b3JUeXBlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0RJU0NSSU1JTkFUT1JfVFlQRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExlbmd0aEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19MRU5HVEg7Ci0JfQotCi0JLy8gKioqKioqKioqKiBCaW5hcnlOYW1lZENvbHVtbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb2x1bW5EZWZpbml0aW9uRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCX0KLQotCi0JLy8qKioqKioqKioqKioqIEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKgotCi0JLy8gKioqKiogY29udGV4dFByb3BlcnR5Ci0JcHVibGljIFN0cmluZyBnZXRDb250ZXh0UHJvcGVydHkoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRleHRQcm9wZXJ0eTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0UHJvcGVydHkoU3RyaW5nIGNvbnRleHRQcm9wZXJ0eSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q29udGV4dFByb3BlcnR5XyhTdHJpbmcgY29udGV4dFByb3BlcnR5KSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmNvbnRleHRQcm9wZXJ0eTsKLQkJdGhpcy5jb250ZXh0UHJvcGVydHkgPSBjb250ZXh0UHJvcGVydHk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT05URVhUX1BST1BFUlRZX1BST1BFUlRZLCBvbGQsIGNvbnRleHRQcm9wZXJ0eSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRDb250ZXh0UHJvcGVydHkoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9fQ09OVEVYVF9QUk9QRVJUWSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRDb250ZXh0UHJvcGVydHlUZXh0UmFuZ2UoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIHRhYmxlCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFibGUoU3RyaW5nIHRhYmxlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUYWJsZV8oU3RyaW5nIHRhYmxlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnRhYmxlOwotCQl0aGlzLnRhYmxlID0gdGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUQUJMRV9QUk9QRVJUWSwgb2xkLCB0YWJsZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUYWJsZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19UQUJMRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUYWJsZVRleHRSYW5nZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVUb3VjaGVzKGludCBwb3MpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogcHJpbWFyeUtleQotCXB1YmxpYyBCb29sZWFuIGdldFByaW1hcnlLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnByaW1hcnlLZXk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleShCb29sZWFuIHByaW1hcnlLZXkpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFByaW1hcnlLZXlfKEJvb2xlYW4gcHJpbWFyeUtleSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMucHJpbWFyeUtleTsKLQkJdGhpcy5wcmltYXJ5S2V5ID0gcHJpbWFyeUtleTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBSSU1BUllfS0VZX1BST1BFUlRZLCBvbGQsIHByaW1hcnlLZXkpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZFByaW1hcnlLZXkoKSB7Ci0JCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX1BSSU1BUllfS0VZKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFByaW1hcnlLZXlUZXh0UmFuZ2UoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmY2U4NTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVGltZU9mRGF5PC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24KLXsKLQlwcml2YXRlIEludGVnZXIgaG91cjsKLQlwcml2YXRlIEludGVnZXIgbWludXRlOwotCXByaXZhdGUgSW50ZWdlciBzZWNvbmQ7Ci0JcHJpdmF0ZSBJbnRlZ2VyIG1pbGxpc2Vjb25kOwotCi0KLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMuaG91ciA9IHRoaXMuYnVpbGRIb3VyKCk7Ci0JCXRoaXMubWludXRlID0gdGhpcy5idWlsZE1pbnV0ZSgpOwotCQl0aGlzLnNlY29uZCA9IHRoaXMuYnVpbGRTZWNvbmQoKTsKLQkJdGhpcy5taWxsaXNlY29uZCA9IHRoaXMuYnVpbGRNaWxsaXNlY29uZCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRIb3VyXyh0aGlzLmJ1aWxkSG91cigpKTsKLQkJdGhpcy5zZXRNaW51dGVfKHRoaXMuYnVpbGRNaW51dGUoKSk7Ci0JCXRoaXMuc2V0U2Vjb25kXyh0aGlzLmJ1aWxkU2Vjb25kKCkpOwotCQl0aGlzLnNldE1pbGxpc2Vjb25kXyh0aGlzLmJ1aWxkTWlsbGlzZWNvbmQoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRpbWVPZkRheUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogaG91cgotCXB1YmxpYyBJbnRlZ2VyIGdldEhvdXIoKSB7Ci0JCXJldHVybiB0aGlzLmhvdXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SG91cihJbnRlZ2VyIGhvdXIpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEhvdXJfKEludGVnZXIgaG91cikgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuaG91cjsKLQkJdGhpcy5ob3VyID0gaG91cjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEhPVVJfUFJPUEVSVFksIG9sZCwgaG91cik7Ci0JfQotCi0JcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkSG91cigpIHsKLQkJcmV0dXJuIChJbnRlZ2VyKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZX19IT1VSKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEhvdXJUZXh0UmFuZ2UoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIG1pbnV0ZQotCXB1YmxpYyBJbnRlZ2VyIGdldE1pbnV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMubWludXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1pbnV0ZShJbnRlZ2VyIG5ld01pbnV0ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TWludXRlXyhJbnRlZ2VyIG5ld01pbnV0ZSkgewotCQlJbnRlZ2VyIG9sZE1pbnV0ZSA9IHRoaXMubWludXRlOwotCQl0aGlzLm1pbnV0ZSA9IG5ld01pbnV0ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1JTlVURV9QUk9QRVJUWSwgb2xkTWludXRlLCBuZXdNaW51dGUpOwotCX0KLQotCXByaXZhdGUgSW50ZWdlciBidWlsZE1pbnV0ZSgpIHsKLQkJcmV0dXJuIChJbnRlZ2VyKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZX19NSU5VVEUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWludXRlVGV4dFJhbmdlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBzZWNvbmQKLQlwdWJsaWMgSW50ZWdlciBnZXRTZWNvbmQoKSB7Ci0JCXJldHVybiB0aGlzLnNlY29uZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWNvbmQoSW50ZWdlciBuZXdTZWNvbmQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNlY29uZF8oSW50ZWdlciBuZXdTZWNvbmQpIHsKLQkJSW50ZWdlciBvbGRTZWNvbmQgPSB0aGlzLnNlY29uZDsKLQkJdGhpcy5zZWNvbmQgPSBuZXdTZWNvbmQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTRUNPTkRfUFJPUEVSVFksIG9sZFNlY29uZCwgbmV3U2Vjb25kKTsKLQl9Ci0KLQlwcml2YXRlIEludGVnZXIgYnVpbGRTZWNvbmQoKSB7Ci0JCXJldHVybiAoSW50ZWdlcikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5USU1FX09GX0RBWV9fU0VDT05EKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlY29uZFRleHRSYW5nZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogbWlsbGlzZWNvbmQKLQlwdWJsaWMgSW50ZWdlciBnZXRNaWxsaXNlY29uZCgpIHsKLQkJcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWlsbGlzZWNvbmQoSW50ZWdlciBuZXdNaWxsaXNlY29uZCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TWlsbGlzZWNvbmRfKEludGVnZXIgbmV3TWlsbGlzZWNvbmQpIHsKLQkJSW50ZWdlciBvbGRNaWxsaXNlY29uZCA9IHRoaXMubWlsbGlzZWNvbmQ7Ci0JCXRoaXMubWlsbGlzZWNvbmQgPSBuZXdNaWxsaXNlY29uZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1JTExJU0VDT05EX1BST1BFUlRZLCBvbGRNaWxsaXNlY29uZCwgbmV3TWlsbGlzZWNvbmQpOwotCX0KLQotCXByaXZhdGUgSW50ZWdlciBidWlsZE1pbGxpc2Vjb25kKCkgewotCQlyZXR1cm4gKEludGVnZXIpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuVElNRV9PRl9EQVlfX01JTExJU0VDT05EKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1pbGxpc2Vjb25kVGV4dFJhbmdlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExNTVmMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHJhbnNmb3JtYXRpb248L2NvZGU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24KLXsKLQlwcml2YXRlIEZldGNoVHlwZSBmZXRjaDsKLQlwcml2YXRlIEJvb2xlYW4gb3B0aW9uYWw7Ci0KLQotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLmZldGNoID0gdGhpcy5idWlsZEZldGNoKCk7Ci0JCXRoaXMub3B0aW9uYWwgPSB0aGlzLmJ1aWxkT3B0aW9uYWwoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RmV0Y2hfKHRoaXMuYnVpbGRGZXRjaCgpKTsKLQkJdGhpcy5zZXRPcHRpb25hbF8odGhpcy5idWlsZE9wdGlvbmFsKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogZmV0Y2gKLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlyZXR1cm4gdGhpcy5mZXRjaDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgZmV0Y2gpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEZldGNoXyhGZXRjaFR5cGUgZmV0Y2gpIHsKLQkJRmV0Y2hUeXBlIG9sZCA9IHRoaXMuZmV0Y2g7Ci0JCXRoaXMuZmV0Y2ggPSBmZXRjaDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZFVENIX1BST1BFUlRZLCBvbGQsIGZldGNoKTsKLQl9Ci0KLQlwcml2YXRlIEZldGNoVHlwZSBidWlsZEZldGNoKCkgewotCQlyZXR1cm4gRmV0Y2hUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT05fX0ZFVENIKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRGZXRjaFRleHRSYW5nZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogb3B0aW9uYWwKLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uYWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBvcHRpb25hbCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0T3B0aW9uYWxfKEJvb2xlYW4gb3B0aW9uYWwpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLm9wdGlvbmFsOwotCQl0aGlzLm9wdGlvbmFsID0gb3B0aW9uYWw7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPUFRJT05BTF9QUk9QRVJUWSwgb2xkLCBvcHRpb25hbCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkT3B0aW9uYWwoKSB7Ci0JCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTl9fT1BUSU9OQUwpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T3B0aW9uYWxUZXh0UmFuZ2UoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWM4Njk5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIDxjb2RlPjx1bD4KLSAqIDxsaT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5SZWFkVHJhbnNmb3JtZXIKLSAqIDxsaT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Xcml0ZVRyYW5zZm9ybWVyCi0gKiA8L3VsPjwvY29kZT4KLSAqLwotYWJzdHJhY3QgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBTdHJpbmcgdHJhbnNmb3JtZXJDbGFzczsKLQlwcml2YXRlIFN0cmluZyBtZXRob2Q7Ci0KLQotCUJpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMudHJhbnNmb3JtZXJDbGFzcyA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1lckNsYXNzKCk7Ci0JCXRoaXMubWV0aG9kID0gdGhpcy5idWlsZE1ldGhvZCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0VHJhbnNmb3JtZXJDbGFzc18odGhpcy5idWlsZFRyYW5zZm9ybWVyQ2xhc3MoKSk7Ci0JCXRoaXMuc2V0TWV0aG9kXyh0aGlzLmJ1aWxkTWV0aG9kKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUcmFuc2Zvcm1lckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdHJhbnNmb3JtZXIgY2xhc3MKLQlwdWJsaWMgU3RyaW5nIGdldFRyYW5zZm9ybWVyQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybWVyQ2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHJhbnNmb3JtZXJDbGFzcyhTdHJpbmcgdHJhbnNmb3JtZXJDbGFzcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VHJhbnNmb3JtZXJDbGFzc18oU3RyaW5nIHRyYW5zZm9ybWVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudHJhbnNmb3JtZXJDbGFzczsKLQkJdGhpcy50cmFuc2Zvcm1lckNsYXNzID0gdHJhbnNmb3JtZXJDbGFzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRSQU5TRk9STUVSX0NMQVNTX1BST1BFUlRZLCBvbGQsIHRyYW5zZm9ybWVyQ2xhc3MpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVHJhbnNmb3JtZXJDbGFzcygpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUodGhpcy5nZXRUcmFuc2Zvcm1lckNsYXNzRWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUcmFuc2Zvcm1lckNsYXNzVGV4dFJhbmdlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlhYnN0cmFjdCBTdHJpbmcgZ2V0VHJhbnNmb3JtZXJDbGFzc0VsZW1lbnROYW1lKCk7Ci0KLQkvLyAqKioqKiBtZXRob2QKLQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZCgpIHsKLQkJcmV0dXJuIHRoaXMubWV0aG9kOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1ldGhvZChTdHJpbmcgbWV0aG9kKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRNZXRob2RfKFN0cmluZyBtZXRob2QpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubWV0aG9kOwotCQl0aGlzLm1ldGhvZCA9IG1ldGhvZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1FVEhPRF9QUk9QRVJUWSwgb2xkLCBtZXRob2QpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTWV0aG9kKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldE1ldGhvZEVsZW1lbnROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWV0aG9kVGV4dFJhbmdlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlhYnN0cmFjdCBTdHJpbmcgZ2V0TWV0aG9kRWxlbWVudE5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA2ZmQ4Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UeXBlQ29udmVydGVyPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5RWNsaXBzZUxpbmtCYXNlVHlwZUNvbnZlcnRlckFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24KLXsKLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJpbmFyeU5hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVJfX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJpbmFyeUJhc2VUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0RGF0YVR5cGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldE9iamVjdFR5cGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmY2Q4YWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVmFyaWFibGVPbmVUb09uZQotICovCi1wdWJsaWMgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbgotewotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzMmUyNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5Q29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJDb2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZFRyYW5zZm9ybWVyPC9jb2RlPgotICovCi1wdWJsaWMgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5RWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24KLXsKLQlwcml2YXRlIENvbHVtbkFubm90YXRpb24gY29sdW1uOwotCXByaXZhdGUgZmluYWwgQ29sdW1uQW5ub3RhdGlvbiBudWxsQ29sdW1uOwotCi0KLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLmNvbHVtbiA9IHRoaXMuYnVpbGRDb2x1bW4oKTsKLQkJdGhpcy5udWxsQ29sdW1uID0gdGhpcy5idWlsZE51bGxDb2x1bW4oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlQ29sdW1uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJpbmFyeVRyYW5zZm9ybWVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0VHJhbnNmb3JtZXJDbGFzc0VsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVJfX1RSQU5TRk9STUVSX0NMQVNTOwotCX0KLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXRNZXRob2RFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSX19NRVRIT0Q7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFdyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIGNvbHVtbgotCXB1YmxpYyBDb2x1bW5Bbm5vdGF0aW9uIGdldENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uOwotCX0KLQotCXB1YmxpYyBDb2x1bW5Bbm5vdGF0aW9uIGdldE5vbk51bGxDb2x1bW4oKSB7Ci0JCXJldHVybiAodGhpcy5jb2x1bW4gIT0gbnVsbCkgPyB0aGlzLmNvbHVtbiA6IHRoaXMubnVsbENvbHVtbjsKLQl9Ci0KLQlwdWJsaWMgQ29sdW1uQW5ub3RhdGlvbiBhZGRDb2x1bW4oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbHVtbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRDb2x1bW5UZXh0UmFuZ2UoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgQ29sdW1uQW5ub3RhdGlvbiBidWlsZENvbHVtbigpIHsKLQkJSUFubm90YXRpb24gamR0Q29sdW1uID0gdGhpcy5nZXRKZHRDb2x1bW4oKTsKLQkJcmV0dXJuIChqZHRDb2x1bW4gPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZENvbHVtbihqZHRDb2x1bW4pOwotCX0KLQotCXByaXZhdGUgQ29sdW1uQW5ub3RhdGlvbiBidWlsZE51bGxDb2x1bW4oKSB7Ci0JCXJldHVybiBuZXcgTnVsbEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckNvbHVtbkFubm90YXRpb24odGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBDb2x1bW5Bbm5vdGF0aW9uIGJ1aWxkQ29sdW1uKElBbm5vdGF0aW9uIGpkdENvbHVtbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUNvbHVtbkFubm90YXRpb24odGhpcywgamR0Q29sdW1uKTsKLQl9Ci0KLQlwcml2YXRlIElBbm5vdGF0aW9uIGdldEpkdENvbHVtbigpIHsKLQkJcmV0dXJuIChJQW5ub3RhdGlvbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUl9fQ09MVU1OKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q29sdW1uKENvbHVtbkFubm90YXRpb24gY29sdW1uKSB7Ci0JCUNvbHVtbkFubm90YXRpb24gb2xkID0gdGhpcy5jb2x1bW47Ci0JCXRoaXMuY29sdW1uID0gY29sdW1uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09MVU1OX1BST1BFUlRZLCBvbGQsIGNvbHVtbik7Ci0JfQotCi0JLy8gVE9ETwotCXByaXZhdGUgdm9pZCB1cGRhdGVDb2x1bW4oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotLy8JCUlBbm5vdGF0aW9uIGpkdENvbHVtbiA9IHRoaXMuZ2V0SmR0Q29sdW1uKCk7Ci0vLwkJaWYgKGpkdENvbHVtbiA9PSBudWxsKSB7Ci0vLwkJCXRoaXMuc2V0Q29sdW1uKG51bGwpOwotLy8JCX0gZWxzZSB7Ci0vLwkJCWlmICh0aGlzLmNvbHVtbiA9PSBudWxsKSB7Ci0vLwkJCQl0aGlzLnNldENvbHVtbih0aGlzLmJ1aWxkQ29sdW1uKGpkdENvbHVtbikpOwotLy8JCQl9IGVsc2UgewotLy8JCQkJdGhpcy5jb2x1bW4udXBkYXRlKGpkdENvbHVtbik7Ci0vLwkJCX0KLS8vCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtBcnJheUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQXJyYXlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMjM3NDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtBcnJheUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQXJyYXlBbm5vdGF0aW9uMl8zOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkFycmF5Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua0FycmF5QW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtBcnJheUFubm90YXRpb24yXzMKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua0FycmF5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtCYXNlQ29udmVydEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQmFzZUNvbnZlcnRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkODE5MzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtCYXNlQ29udmVydEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2VDb252ZXJ0QW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT48dWw+Ci0gKiA8bGk+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ29udmVydAotICogPGxpPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk1hcEtleUNvbnZlcnQKLSAqIDwvdWw+PC9jb2RlPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtCYXNlQ29udmVydEFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQmFzZUNvbnZlcnRBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCXByaXZhdGUgVGV4dFJhbmdlIHZhbHVlVGV4dFJhbmdlOwotCi0KLQlwcm90ZWN0ZWQgU291cmNlRWNsaXBzZUxpbmtCYXNlQ29udmVydEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBkYWEpOwotCQl0aGlzLnZhbHVlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKCk7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihlbGVtZW50LCB0aGlzLnZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7Ci0JCXRoaXMudmFsdWVUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkVmFsdWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7Ci0JCXRoaXMudmFsdWVUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkVmFsdWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLnZhbHVlID09IG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb252ZXJ0QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVmFsdWUoU3RyaW5nIGFzdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gYXN0VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCBhc3RWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVUZXh0UmFuZ2U7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0UmFuZ2UgYnVpbGRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMudmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbHVlVG91Y2hlcyhpbnQgcG9zKSB7Ci0JCXJldHVybiB0aGlzLnRleHRSYW5nZVRvdWNoZXModGhpcy52YWx1ZVRleHRSYW5nZSwgcG9zKTsKLQl9Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRWYWx1ZURlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmRhYSwgdGhpcy5nZXRWYWx1ZUVsZW1lbnROYW1lKCksIFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWYWx1ZUVsZW1lbnROYW1lKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0Jhc2VUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtCYXNlVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBjMzBkZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0Jhc2VUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNlVHlwZUNvbnZlcnRlckFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+Ci0gKiA8dWw+Ci0gKiA8bGk+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHlwZUNvbnZlcnRlcgotICogPGxpPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk9iamVjdFR5cGVDb252ZXJ0ZXIKLSAqIDwvdWw+Ci0gKiA8L2NvZGU+Ci0gKi8KLWFic3RyYWN0IGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rQmFzZVR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtCYXNlVHlwZUNvbnZlcnRlckFubm90YXRpb24KLXsKLQlmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhdGFUeXBlRGVjbGFyYXRpb25BZGFwdGVyOwotCWZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhdGFUeXBlQWRhcHRlcjsKLQlTdHJpbmcgZGF0YVR5cGU7Ci0JVGV4dFJhbmdlIGRhdGFUeXBlVGV4dFJhbmdlOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlSWRDbGFzc0Fubm90YXRpb24jZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUKLQkgKi8KLQlTdHJpbmcgZnVsbHlRdWFsaWZpZWREYXRhVHlwZTsKLQkvLyB3ZSBuZWVkIGEgZmxhZyBzaW5jZSB0aGUgZi1xIG5hbWUgY2FuIGJlIG51bGwKLQlib29sZWFuIGZxRGF0YVR5cGVTdGFsZSA9IHRydWU7Ci0KLQlmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG9iamVjdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gb2JqZWN0VHlwZUFkYXB0ZXI7Ci0JU3RyaW5nIG9iamVjdFR5cGU7Ci0JVGV4dFJhbmdlIG9iamVjdFR5cGVUZXh0UmFuZ2U7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VJZENsYXNzQW5ub3RhdGlvbiNmdWxseVF1YWxpZmllZENsYXNzTmFtZQotCSAqLwotCVN0cmluZyBmdWxseVF1YWxpZmllZE9iamVjdFR5cGU7Ci0JLy8gd2UgbmVlZCBhIGZsYWcgc2luY2UgdGhlIGYtcSBuYW1lIGNhbiBiZSBudWxsCi0JYm9vbGVhbiBmcU9iamVjdFR5cGVTdGFsZSA9IHRydWU7Ci0KLQotCVNvdXJjZUVjbGlwc2VMaW5rQmFzZVR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsCi0JCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsCi0JCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQkJdGhpcy5kYXRhVHlwZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRUeXBlQWRhcHRlcih0aGlzLmdldERhdGFUeXBlRWxlbWVudE5hbWUoKSk7Ci0JCXRoaXMuZGF0YVR5cGVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIHRoaXMuZGF0YVR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCi0JCXRoaXMub2JqZWN0VHlwZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRUeXBlQWRhcHRlcih0aGlzLmdldE9iamVjdFR5cGVFbGVtZW50TmFtZSgpKTsKLQkJdGhpcy5vYmplY3RUeXBlQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCB0aGlzLm9iamVjdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFR5cGVBZGFwdGVyKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQkgLy8gZmFsc2UgPSBkbyBub3QgcmVtb3ZlIGFubm90YXRpb24gd2hlbiBlbXB0eQotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuZGFhLCBlbGVtZW50TmFtZSwgVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCi0JCXRoaXMuZGF0YVR5cGUgPSB0aGlzLmJ1aWxkRGF0YVR5cGUoYXN0Um9vdCk7Ci0JCXRoaXMuZGF0YVR5cGVUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkRGF0YVR5cGVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0KLQkJdGhpcy5vYmplY3RUeXBlID0gdGhpcy5idWlsZE9iamVjdFR5cGUoYXN0Um9vdCk7Ci0JCXRoaXMub2JqZWN0VHlwZVRleHRSYW5nZSA9IHRoaXMuYnVpbGRPYmplY3RUeXBlVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGgoYXN0Um9vdCk7Ci0KLQkJdGhpcy5zeW5jRGF0YVR5cGUodGhpcy5idWlsZERhdGFUeXBlKGFzdFJvb3QpKTsKLQkJdGhpcy5kYXRhVHlwZVRleHRSYW5nZSA9IHRoaXMuYnVpbGREYXRhVHlwZVRleHRSYW5nZShhc3RSb290KTsKLQotCQl0aGlzLnN5bmNPYmplY3RUeXBlKHRoaXMuYnVpbGRPYmplY3RUeXBlKGFzdFJvb3QpKTsKLQkJdGhpcy5vYmplY3RUeXBlVGV4dFJhbmdlID0gdGhpcy5idWlsZE9iamVjdFR5cGVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLmRhdGFUeXBlID09IG51bGwpICYmCi0JCQkJKHRoaXMub2JqZWN0VHlwZSA9PSBudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQmFzZVR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIGRhdGEgdHlwZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFUeXBlKFN0cmluZyBkYXRhVHlwZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5kYXRhVHlwZSwgZGF0YVR5cGUpKSB7Ci0JCQl0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7Ci0JCQl0aGlzLmZxRGF0YVR5cGVTdGFsZSA9IHRydWU7Ci0JCQl0aGlzLmRhdGFUeXBlQWRhcHRlci5zZXRWYWx1ZShkYXRhVHlwZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0RhdGFUeXBlKFN0cmluZyBhc3REYXRhVHlwZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5kYXRhVHlwZSwgYXN0RGF0YVR5cGUpKSB7Ci0JCQl0aGlzLnN5bmNEYXRhVHlwZV8oYXN0RGF0YVR5cGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNEYXRhVHlwZV8oU3RyaW5nIGFzdERhdGFUeXBlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRhdGFUeXBlOwotCQl0aGlzLmRhdGFUeXBlID0gYXN0RGF0YVR5cGU7Ci0JCXRoaXMuZnFEYXRhVHlwZVN0YWxlID0gdHJ1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVFlQRV9QUk9QRVJUWSwgb2xkLCBhc3REYXRhVHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREYXRhVHlwZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5kYXRhVHlwZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXREYXRhVHlwZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YVR5cGVUZXh0UmFuZ2U7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0UmFuZ2UgYnVpbGREYXRhVHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMuZGF0YVR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCWFic3RyYWN0IFN0cmluZyBnZXREYXRhVHlwZUVsZW1lbnROYW1lKCk7Ci0KLQkvLyAqKioqKiBmdWxseS1xdWFsaWZpZWQgZGF0YSB0eXBlCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZERhdGFUeXBlKCkgewotCQlpZiAodGhpcy5mcURhdGFUeXBlU3RhbGUpIHsKLQkJCXRoaXMuZnVsbHlRdWFsaWZpZWREYXRhVHlwZSA9IHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZERhdGFUeXBlKCk7Ci0JCQl0aGlzLmZxRGF0YVR5cGVTdGFsZSA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkRGF0YVR5cGU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZERhdGFUeXBlKCkgewotCQlyZXR1cm4gKHRoaXMuZGF0YVR5cGUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkRGF0YVR5cGVfKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZERhdGFUeXBlXygpIHsKLQkJcmV0dXJuIEFTVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUodGhpcy5kYXRhVHlwZUFkYXB0ZXIuZ2V0RXhwcmVzc2lvbih0aGlzLmJ1aWxkQVNUUm9vdCgpKSk7Ci0JfQotCi0JLy8gKioqKiogb2JqZWN0IHR5cGUKLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0VHlwZShTdHJpbmcgb2JqZWN0VHlwZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5vYmplY3RUeXBlLCBvYmplY3RUeXBlKSkgewotCQkJdGhpcy5vYmplY3RUeXBlID0gb2JqZWN0VHlwZTsKLQkJCXRoaXMuZnFPYmplY3RUeXBlU3RhbGUgPSB0cnVlOwotCQkJdGhpcy5vYmplY3RUeXBlQWRhcHRlci5zZXRWYWx1ZShvYmplY3RUeXBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jT2JqZWN0VHlwZShTdHJpbmcgYXN0T2JqZWN0VHlwZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5vYmplY3RUeXBlLCBhc3RPYmplY3RUeXBlKSkgewotCQkJdGhpcy5zeW5jT2JqZWN0VHlwZV8oYXN0T2JqZWN0VHlwZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY09iamVjdFR5cGVfKFN0cmluZyBhc3RPYmplY3RUeXBlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm9iamVjdFR5cGU7Ci0JCXRoaXMub2JqZWN0VHlwZSA9IGFzdE9iamVjdFR5cGU7Ci0JCXRoaXMuZnFPYmplY3RUeXBlU3RhbGUgPSB0cnVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1RZUEVfUFJPUEVSVFksIG9sZCwgYXN0T2JqZWN0VHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRPYmplY3RUeXBlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFR5cGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T2JqZWN0VHlwZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VHlwZVRleHRSYW5nZTsKLQl9Ci0KLQlwcml2YXRlIFRleHRSYW5nZSBidWlsZE9iamVjdFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm9iamVjdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCWFic3RyYWN0IFN0cmluZyBnZXRPYmplY3RUeXBlRWxlbWVudE5hbWUoKTsKLQotCS8vICoqKioqIGZ1bGx5LXF1YWxpZmllZCBvYmplY3QgdHlwZQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKCkgewotCQlpZiAodGhpcy5mcU9iamVjdFR5cGVTdGFsZSkgewotCQkJdGhpcy5mdWxseVF1YWxpZmllZE9iamVjdFR5cGUgPSB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKCk7Ci0JCQl0aGlzLmZxT2JqZWN0VHlwZVN0YWxlID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKCkgewotCQlyZXR1cm4gKHRoaXMub2JqZWN0VHlwZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlXygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlXygpIHsKLQkJcmV0dXJuIEFTVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUodGhpcy5vYmplY3RUeXBlQWRhcHRlci5nZXRFeHByZXNzaW9uKHRoaXMuYnVpbGRBU1RSb290KCkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzhlZGQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkJhc2ljQ29sbGVjdGlvbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQkKLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNDBkMzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkJhc2ljTWFwCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQkKLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmI2ZDE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Cb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVDb29yZGluYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlSXNvbGF0aW9uVHlwZTJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uOwotCi0vKioKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBUWVBFX0FEQVBURVIgPSBidWlsZFR5cGVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB0eXBlQWRhcHRlcjsKLQlwcml2YXRlIENhY2hlVHlwZSB0eXBlOwotCXByaXZhdGUgVGV4dFJhbmdlIHR5cGVUZXh0UmFuZ2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBTSVpFX0FEQVBURVIgPSBidWlsZFNpemVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gc2l6ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBJbnRlZ2VyIHNpemU7Ci0JcHJpdmF0ZSBUZXh0UmFuZ2Ugc2l6ZVRleHRSYW5nZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IFNIQVJFRF9BREFQVEVSID0gYnVpbGRTaGFyZWRBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gc2hhcmVkQWRhcHRlcjsKLQlwcml2YXRlIEJvb2xlYW4gc2hhcmVkOwotCXByaXZhdGUgVGV4dFJhbmdlIHNoYXJlZFRleHRSYW5nZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IEFMV0FZU19SRUZSRVNIX0FEQVBURVIgPSBidWlsZEFsd2F5c1JlZnJlc2hBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYWx3YXlzUmVmcmVzaEFkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIGFsd2F5c1JlZnJlc2g7Ci0JcHJpdmF0ZSBUZXh0UmFuZ2UgYWx3YXlzUmVmcmVzaFRleHRSYW5nZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IFJFRlJFU0hfT05MWV9JRl9ORVdFUl9BREFQVEVSID0gYnVpbGRSZWZyZXNoT25seUlmTmV3ZXJBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gcmVmcmVzaE9ubHlJZk5ld2VyQWRhcHRlcjsKLQlwcml2YXRlIEJvb2xlYW4gcmVmcmVzaE9ubHlJZk5ld2VyOwotCXByaXZhdGUgVGV4dFJhbmdlIHJlZnJlc2hPbmx5SWZOZXdlclRleHRSYW5nZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IERJU0FCTEVfSElUU19BREFQVEVSID0gYnVpbGREaXNhYmxlSGl0c0FkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkaXNhYmxlSGl0c0FkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIGRpc2FibGVIaXRzOwotCXByaXZhdGUgVGV4dFJhbmdlIGRpc2FibGVIaXRzVGV4dFJhbmdlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBDT09SRElOQVRJT05fVFlQRV9BREFQVEVSID0gYnVpbGRDb29yZGluYXRpb25UeXBlQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gY29vcmRpbmF0aW9uVHlwZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZTsKLQlwcml2YXRlIFRleHRSYW5nZSBjb29yZGluYXRpb25UeXBlVGV4dFJhbmdlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gRVhQSVJZX0FEQVBURVIgPSBidWlsZEV4cGlyeUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBleHBpcnlBZGFwdGVyOwotCXByaXZhdGUgSW50ZWdlciBleHBpcnk7Ci0JcHJpdmF0ZSBUZXh0UmFuZ2UgZXhwaXJ5VGV4dFJhbmdlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBFWFBJUllfVElNRV9PRl9EQVlfQURBUFRFUiA9IGJ1aWxkRXhwaXJ5VGltZU9mRGF5QWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgRWxlbWVudEFubm90YXRpb25BZGFwdGVyIGV4cGlyeVRpbWVPZkRheUFkYXB0ZXI7Ci0JcHJpdmF0ZSBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gZXhwaXJ5VGltZU9mRGF5OwotCXByaXZhdGUgVGV4dFJhbmdlIGV4cGlyeVRpbWVPZkRheVRleHRSYW5nZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gSVNPTEFUSU9OX0FEQVBURVIgPSBidWlsZElzb2xhdGlvbkFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGlzb2xhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBDYWNoZUlzb2xhdGlvblR5cGUyXzIgaXNvbGF0aW9uOwotCXByaXZhdGUgVGV4dFJhbmdlIGlzb2xhdGlvblRleHRSYW5nZTsKLQotCi0JcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnR5cGVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihlbGVtZW50LCBUWVBFX0FEQVBURVIpOwotCQl0aGlzLnNpemVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oZWxlbWVudCwgU0laRV9BREFQVEVSKTsKLQkJdGhpcy5zaGFyZWRBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oZWxlbWVudCwgU0hBUkVEX0FEQVBURVIpOwotCQl0aGlzLmFsd2F5c1JlZnJlc2hBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oZWxlbWVudCwgQUxXQVlTX1JFRlJFU0hfQURBUFRFUik7Ci0JCXRoaXMucmVmcmVzaE9ubHlJZk5ld2VyQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGVsZW1lbnQsIFJFRlJFU0hfT05MWV9JRl9ORVdFUl9BREFQVEVSKTsKLQkJdGhpcy5kaXNhYmxlSGl0c0FkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihlbGVtZW50LCBESVNBQkxFX0hJVFNfQURBUFRFUik7Ci0JCXRoaXMuY29vcmRpbmF0aW9uVHlwZUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGVsZW1lbnQsIENPT1JESU5BVElPTl9UWVBFX0FEQVBURVIpOwotCQl0aGlzLmV4cGlyeUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPihlbGVtZW50LCBFWFBJUllfQURBUFRFUik7Ci0JCXRoaXMuZXhwaXJ5VGltZU9mRGF5QWRhcHRlciA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIoZWxlbWVudCwgRVhQSVJZX1RJTUVfT0ZfREFZX0FEQVBURVIpOwotCQl0aGlzLmlzb2xhdGlvbkFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGVsZW1lbnQsIElTT0xBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy50eXBlID0gdGhpcy5idWlsZFR5cGUoYXN0Um9vdCk7Ci0JCXRoaXMudHlwZVRleHRSYW5nZSA9IHRoaXMuYnVpbGRUeXBlVGV4dFJhbmdlKGFzdFJvb3QpOwotCi0JCXRoaXMuc2l6ZSA9IHRoaXMuYnVpbGRTaXplKGFzdFJvb3QpOwotCQl0aGlzLnNpemVUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkU2l6ZVRleHRSYW5nZShhc3RSb290KTsKLQotCQl0aGlzLnNoYXJlZCA9IHRoaXMuYnVpbGRTaGFyZWQoYXN0Um9vdCk7Ci0JCXRoaXMuc2hhcmVkVGV4dFJhbmdlID0gdGhpcy5idWlsZFNoYXJlZFRleHRSYW5nZShhc3RSb290KTsKLQotCQl0aGlzLmFsd2F5c1JlZnJlc2ggPSB0aGlzLmJ1aWxkQWx3YXlzUmVmcmVzaChhc3RSb290KTsKLQkJdGhpcy5hbHdheXNSZWZyZXNoVGV4dFJhbmdlID0gdGhpcy5idWlsZEFsd2F5c1JlZnJlc2hUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0KLQkJdGhpcy5yZWZyZXNoT25seUlmTmV3ZXIgPSB0aGlzLmJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VyKGFzdFJvb3QpOwotCQl0aGlzLnJlZnJlc2hPbmx5SWZOZXdlclRleHRSYW5nZSA9IHRoaXMuYnVpbGRSZWZyZXNoT25seUlmTmV3ZXJUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0KLQkJdGhpcy5kaXNhYmxlSGl0cyA9IHRoaXMuYnVpbGREaXNhYmxlSGl0cyhhc3RSb290KTsKLQkJdGhpcy5kaXNhYmxlSGl0c1RleHRSYW5nZSA9IHRoaXMuYnVpbGREaXNhYmxlSGl0c1RleHRSYW5nZShhc3RSb290KTsKLQotCQl0aGlzLmNvb3JkaW5hdGlvblR5cGUgPSB0aGlzLmJ1aWxkQ29vcmRpbmF0aW9uVHlwZShhc3RSb290KTsKLQkJdGhpcy5jb29yZGluYXRpb25UeXBlVGV4dFJhbmdlID0gdGhpcy5idWlsZENvb3JkaW5hdGlvblR5cGVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0KLQkJdGhpcy5leHBpcnkgPSB0aGlzLmJ1aWxkRXhwaXJ5KGFzdFJvb3QpOwotCQl0aGlzLmV4cGlyeVRleHRSYW5nZSA9IHRoaXMuYnVpbGRFeHBpcnlUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0KLQkJdGhpcy5pbml0aWFsaXplRXhwaXJ5VGltZU9mRGF5KGFzdFJvb3QpOwotCQl0aGlzLmV4cGlyeVRpbWVPZkRheVRleHRSYW5nZSA9IHRoaXMuYnVpbGRFeHBpcnlUaW1lT2ZEYXlUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0KLQkJdGhpcy5pc29sYXRpb24gPSB0aGlzLmJ1aWxkSXNvbGF0aW9uKGFzdFJvb3QpOwotCQl0aGlzLmlzb2xhdGlvblRleHRSYW5nZSA9IHRoaXMuYnVpbGRJc29sYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVFeHBpcnlUaW1lT2ZEYXkoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5QWRhcHRlci5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpICE9IG51bGwpIHsKLQkJCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gdGhpcy5idWlsZEV4cGlyeVRpbWVPZkRheSgpOwotCQkJdGhpcy5leHBpcnlUaW1lT2ZEYXkuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNUeXBlKHRoaXMuYnVpbGRUeXBlKGFzdFJvb3QpKTsKLQkJdGhpcy50eXBlVGV4dFJhbmdlID0gdGhpcy5idWlsZFR5cGVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0KLQkJdGhpcy5zeW5jU2l6ZSh0aGlzLmJ1aWxkU2l6ZShhc3RSb290KSk7Ci0JCXRoaXMuc2l6ZVRleHRSYW5nZSA9IHRoaXMuYnVpbGRTaXplVGV4dFJhbmdlKGFzdFJvb3QpOwotCi0JCXRoaXMuc3luY1NoYXJlZCh0aGlzLmJ1aWxkU2hhcmVkKGFzdFJvb3QpKTsKLQkJdGhpcy5zaGFyZWRUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkU2hhcmVkVGV4dFJhbmdlKGFzdFJvb3QpOwotCi0JCXRoaXMuc3luY0Fsd2F5c1JlZnJlc2godGhpcy5idWlsZEFsd2F5c1JlZnJlc2goYXN0Um9vdCkpOwotCQl0aGlzLmFsd2F5c1JlZnJlc2hUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkQWx3YXlzUmVmcmVzaFRleHRSYW5nZShhc3RSb290KTsKLQotCQl0aGlzLnN5bmNSZWZyZXNoT25seUlmTmV3ZXIodGhpcy5idWlsZFJlZnJlc2hPbmx5SWZOZXdlcihhc3RSb290KSk7Ci0JCXRoaXMucmVmcmVzaE9ubHlJZk5ld2VyVGV4dFJhbmdlID0gdGhpcy5idWlsZFJlZnJlc2hPbmx5SWZOZXdlclRleHRSYW5nZShhc3RSb290KTsKLQotCQl0aGlzLnN5bmNEaXNhYmxlSGl0cyh0aGlzLmJ1aWxkRGlzYWJsZUhpdHMoYXN0Um9vdCkpOwotCQl0aGlzLmRpc2FibGVIaXRzVGV4dFJhbmdlID0gdGhpcy5idWlsZERpc2FibGVIaXRzVGV4dFJhbmdlKGFzdFJvb3QpOwotCi0JCXRoaXMuc3luY0Nvb3JkaW5hdGlvblR5cGUodGhpcy5idWlsZENvb3JkaW5hdGlvblR5cGUoYXN0Um9vdCkpOwotCQl0aGlzLmNvb3JkaW5hdGlvblR5cGVUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkQ29vcmRpbmF0aW9uVHlwZVRleHRSYW5nZShhc3RSb290KTsKLQotCQl0aGlzLnN5bmNFeHBpcnkodGhpcy5idWlsZEV4cGlyeShhc3RSb290KSk7Ci0JCXRoaXMuZXhwaXJ5VGV4dFJhbmdlID0gdGhpcy5idWlsZEV4cGlyeVRleHRSYW5nZShhc3RSb290KTsKLQotCQl0aGlzLnN5bmNFeHBpcnlUaW1lT2ZEYXkoYXN0Um9vdCk7Ci0JCXRoaXMuZXhwaXJ5VGltZU9mRGF5VGV4dFJhbmdlID0gdGhpcy5idWlsZEV4cGlyeVRpbWVPZkRheVRleHRSYW5nZShhc3RSb290KTsKLQotCQl0aGlzLnN5bmNJc29sYXRpb24odGhpcy5idWlsZElzb2xhdGlvbihhc3RSb290KSk7Ci0JCXRoaXMuaXNvbGF0aW9uVGV4dFJhbmdlID0gdGhpcy5idWlsZElzb2xhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMudHlwZSA9PSBudWxsKSAmJgotCQkJCSh0aGlzLnNpemUgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5zaGFyZWQgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5hbHdheXNSZWZyZXNoID09IG51bGwpICYmCi0JCQkJKHRoaXMucmVmcmVzaE9ubHlJZk5ld2VyID09IG51bGwpICYmCi0JCQkJKHRoaXMuZGlzYWJsZUhpdHMgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5jb29yZGluYXRpb25UeXBlID09IG51bGwpICYmCi0JCQkJKHRoaXMuZXhwaXJ5ID09IG51bGwpICYmCi0JCQkJKHRoaXMuZXhwaXJ5VGltZU9mRGF5ID09IG51bGwpICYmCi0JCQkJKHRoaXMuaXNvbGF0aW9uID09IG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudHlwZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENhY2hlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB0eXBlCi0JcHVibGljIENhY2hlVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy50eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoQ2FjaGVUeXBlIHR5cGUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudHlwZSwgdHlwZSkpIHsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQl0aGlzLnR5cGVBZGFwdGVyLnNldFZhbHVlKENhY2hlVHlwZS50b0phdmFBbm5vdGF0aW9uVmFsdWUodHlwZSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNUeXBlKENhY2hlVHlwZSBhc3RUeXBlKSB7Ci0JCUNhY2hlVHlwZSBvbGQgPSB0aGlzLnR5cGU7Ci0JCXRoaXMudHlwZSA9IGFzdFR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX1BST1BFUlRZLCBvbGQsIGFzdFR5cGUpOwotCX0KLQotCXByaXZhdGUgQ2FjaGVUeXBlIGJ1aWxkVHlwZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gQ2FjaGVUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMudHlwZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VHlwZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZVRleHRSYW5nZTsKLQl9Ci0KLQlwcml2YXRlIFRleHRSYW5nZSBidWlsZFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShUWVBFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIHNpemUKLQlwdWJsaWMgSW50ZWdlciBnZXRTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zaXplOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNpemUoSW50ZWdlciBzaXplKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnNpemUsIHNpemUpKSB7Ci0JCQl0aGlzLnNpemUgPSBzaXplOwotCQkJdGhpcy5zaXplQWRhcHRlci5zZXRWYWx1ZShzaXplKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jU2l6ZShJbnRlZ2VyIGFzdFNpemUpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnNpemU7Ci0JCXRoaXMuc2l6ZSA9IGFzdFNpemU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTSVpFX1BST1BFUlRZLCBvbGQsIGFzdFNpemUpOwotCX0KLQotCXByaXZhdGUgSW50ZWdlciBidWlsZFNpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTaXplVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5zaXplVGV4dFJhbmdlOwotCX0KLQotCXByaXZhdGUgVGV4dFJhbmdlIGJ1aWxkU2l6ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFNJWkVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKiogc2hhcmVkCi0JcHVibGljIEJvb2xlYW4gZ2V0U2hhcmVkKCkgewotCQlyZXR1cm4gdGhpcy5zaGFyZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2hhcmVkKEJvb2xlYW4gc2hhcmVkKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnNoYXJlZCwgc2hhcmVkKSkgewotCQkJdGhpcy5zaGFyZWQgPSBzaGFyZWQ7Ci0JCQl0aGlzLnNoYXJlZEFkYXB0ZXIuc2V0VmFsdWUoc2hhcmVkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jU2hhcmVkKEJvb2xlYW4gYXN0U2hhcmVkKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zaGFyZWQ7Ci0JCXRoaXMuc2hhcmVkID0gYXN0U2hhcmVkOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0hBUkVEX1BST1BFUlRZLCBvbGQsIGFzdFNoYXJlZCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkU2hhcmVkKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnNoYXJlZEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTaGFyZWRUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnNoYXJlZFRleHRSYW5nZTsKLQl9Ci0KLQlwcml2YXRlIFRleHRSYW5nZSBidWlsZFNoYXJlZFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFNIQVJFRF9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBhbHdheXMgcmVmcmVzaAotCXB1YmxpYyBCb29sZWFuIGdldEFsd2F5c1JlZnJlc2goKSB7Ci0JCXJldHVybiB0aGlzLmFsd2F5c1JlZnJlc2g7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuIGFsd2F5c1JlZnJlc2gpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuYWx3YXlzUmVmcmVzaCwgYWx3YXlzUmVmcmVzaCkpIHsKLQkJCXRoaXMuYWx3YXlzUmVmcmVzaCA9IGFsd2F5c1JlZnJlc2g7Ci0JCQl0aGlzLmFsd2F5c1JlZnJlc2hBZGFwdGVyLnNldFZhbHVlKGFsd2F5c1JlZnJlc2gpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNBbHdheXNSZWZyZXNoKEJvb2xlYW4gYXN0QWx3YXlzUmVmcmVzaCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuYWx3YXlzUmVmcmVzaDsKLQkJdGhpcy5hbHdheXNSZWZyZXNoID0gYXN0QWx3YXlzUmVmcmVzaDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEFMV0FZU19SRUZSRVNIX1BST1BFUlRZLCBvbGQsIGFzdEFsd2F5c1JlZnJlc2gpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZEFsd2F5c1JlZnJlc2goQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuYWx3YXlzUmVmcmVzaEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRBbHdheXNSZWZyZXNoVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5hbHdheXNSZWZyZXNoVGV4dFJhbmdlOwotCX0KLQotCXByaXZhdGUgVGV4dFJhbmdlIGJ1aWxkQWx3YXlzUmVmcmVzaFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKEFMV0FZU19SRUZSRVNIX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIHJlZnJlc2ggb25seSBpZiBuZXdlcgotCXB1YmxpYyBCb29sZWFuIGdldFJlZnJlc2hPbmx5SWZOZXdlcigpIHsKLQkJcmV0dXJuIHRoaXMucmVmcmVzaE9ubHlJZk5ld2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcikgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5yZWZyZXNoT25seUlmTmV3ZXIsIHJlZnJlc2hPbmx5SWZOZXdlcikpIHsKLQkJCXRoaXMucmVmcmVzaE9ubHlJZk5ld2VyID0gcmVmcmVzaE9ubHlJZk5ld2VyOwotCQkJdGhpcy5yZWZyZXNoT25seUlmTmV3ZXJBZGFwdGVyLnNldFZhbHVlKHJlZnJlc2hPbmx5SWZOZXdlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1JlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuIGFzdFJlZnJlc2hPbmx5SWZOZXdlcikgewotCQlCb29sZWFuIG9sZCA9IHRoaXMucmVmcmVzaE9ubHlJZk5ld2VyOwotCQl0aGlzLnJlZnJlc2hPbmx5SWZOZXdlciA9IGFzdFJlZnJlc2hPbmx5SWZOZXdlcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFRlJFU0hfT05MWV9JRl9ORVdFUl9QUk9QRVJUWSwgb2xkLCBhc3RSZWZyZXNoT25seUlmTmV3ZXIpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZFJlZnJlc2hPbmx5SWZOZXdlcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5yZWZyZXNoT25seUlmTmV3ZXJBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmcmVzaE9ubHlJZk5ld2VyVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5yZWZyZXNoT25seUlmTmV3ZXJUZXh0UmFuZ2U7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0UmFuZ2UgYnVpbGRSZWZyZXNoT25seUlmTmV3ZXJUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShSRUZSRVNIX09OTFlfSUZfTkVXRVJfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKiogZGlzYWJsZSBoaXRzCi0JcHVibGljIEJvb2xlYW4gZ2V0RGlzYWJsZUhpdHMoKSB7Ci0JCXJldHVybiB0aGlzLmRpc2FibGVIaXRzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpc2FibGVIaXRzKEJvb2xlYW4gZGlzYWJsZUhpdHMpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuZGlzYWJsZUhpdHMsIGRpc2FibGVIaXRzKSkgewotCQkJdGhpcy5kaXNhYmxlSGl0cyA9IGRpc2FibGVIaXRzOwotCQkJdGhpcy5kaXNhYmxlSGl0c0FkYXB0ZXIuc2V0VmFsdWUoZGlzYWJsZUhpdHMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNEaXNhYmxlSGl0cyhCb29sZWFuIGFzdERpc2FibGVIaXRzKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5kaXNhYmxlSGl0czsKLQkJdGhpcy5kaXNhYmxlSGl0cyA9IGFzdERpc2FibGVIaXRzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTQUJMRV9ISVRTX1BST1BFUlRZLCBvbGQsIGFzdERpc2FibGVIaXRzKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGREaXNhYmxlSGl0cyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5kaXNhYmxlSGl0c0FkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXREaXNhYmxlSGl0c1RleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGlzYWJsZUhpdHNUZXh0UmFuZ2U7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0UmFuZ2UgYnVpbGREaXNhYmxlSGl0c1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKERJU0FCTEVfSElUU19BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBjb29yZGluYXRpb24gdHlwZQotCXB1YmxpYyBDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0Q29vcmRpbmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29vcmRpbmF0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb29yZGluYXRpb25UeXBlKENhY2hlQ29vcmRpbmF0aW9uVHlwZSBjb29yZGluYXRpb25UeXBlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmNvb3JkaW5hdGlvblR5cGUsIGNvb3JkaW5hdGlvblR5cGUpKSB7Ci0JCQl0aGlzLmNvb3JkaW5hdGlvblR5cGUgPSBjb29yZGluYXRpb25UeXBlOwotCQkJdGhpcy5jb29yZGluYXRpb25UeXBlQWRhcHRlci5zZXRWYWx1ZShDYWNoZUNvb3JkaW5hdGlvblR5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKGNvb3JkaW5hdGlvblR5cGUpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jQ29vcmRpbmF0aW9uVHlwZShDYWNoZUNvb3JkaW5hdGlvblR5cGUgYXN0Q29vcmRpbmF0aW9uVHlwZSkgewotCQlDYWNoZUNvb3JkaW5hdGlvblR5cGUgb2xkID0gdGhpcy5jb29yZGluYXRpb25UeXBlOwotCQl0aGlzLmNvb3JkaW5hdGlvblR5cGUgPSBhc3RDb29yZGluYXRpb25UeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9QUk9QRVJUWSwgb2xkLCBhc3RDb29yZGluYXRpb25UeXBlKTsKLQl9Ci0KLQlwcml2YXRlIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBidWlsZENvb3JkaW5hdGlvblR5cGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIENhY2hlQ29vcmRpbmF0aW9uVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmNvb3JkaW5hdGlvblR5cGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvb3JkaW5hdGlvblR5cGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmNvb3JkaW5hdGlvblR5cGVUZXh0UmFuZ2U7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0UmFuZ2UgYnVpbGRDb29yZGluYXRpb25UeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoQ09PUkRJTkFUSU9OX1RZUEVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKiogZXhwaXJ5Ci0JcHVibGljIEludGVnZXIgZ2V0RXhwaXJ5KCkgewotCQlyZXR1cm4gdGhpcy5leHBpcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhwaXJ5KEludGVnZXIgZXhwaXJ5KSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmV4cGlyeSwgZXhwaXJ5KSkgewotCQkJdGhpcy5leHBpcnkgPSBleHBpcnk7Ci0JCQl0aGlzLmV4cGlyeUFkYXB0ZXIuc2V0VmFsdWUoZXhwaXJ5KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jRXhwaXJ5KEludGVnZXIgYXN0RXhwaXJ5KSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5leHBpcnk7Ci0JCXRoaXMuZXhwaXJ5ID0gYXN0RXhwaXJ5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1BST1BFUlRZLCBvbGQsIGFzdEV4cGlyeSk7Ci0JfQotCi0JcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkRXhwaXJ5KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmV4cGlyeUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRFeHBpcnlUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmV4cGlyeVRleHRSYW5nZTsKLQl9Ci0KLQlwcml2YXRlIFRleHRSYW5nZSBidWlsZEV4cGlyeVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKEVYUElSWV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBleHBpcnkgdGltZSBvZiBkYXkKLQlwdWJsaWMgRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIGdldEV4cGlyeVRpbWVPZkRheSgpIHsKLQkJcmV0dXJuIHRoaXMuZXhwaXJ5VGltZU9mRGF5OwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gYWRkRXhwaXJ5VGltZU9mRGF5KCkgewotCQlpZiAodGhpcy5leHBpcnlUaW1lT2ZEYXkgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiJ2V4cGlyeVRpbWVPZkRheScgZWxlbWVudCBhbHJlYWR5IGV4aXN0czogIiArIHRoaXMuZXhwaXJ5VGltZU9mRGF5KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gdGhpcy5idWlsZEV4cGlyeVRpbWVPZkRheSgpOwotCQl0aGlzLmV4cGlyeVRpbWVPZkRheS5uZXdBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmV4cGlyeVRpbWVPZkRheTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCWlmICh0aGlzLmV4cGlyeVRpbWVPZkRheSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCInZXhwaXJ5VGltZU9mRGF5JyBlbGVtZW50IGRvZXMgbm90IGV4aXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gb2xkID0gdGhpcy5leHBpcnlUaW1lT2ZEYXk7Ci0JCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gbnVsbDsKLQkJb2xkLnJlbW92ZUFubm90YXRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiBidWlsZEV4cGlyeVRpbWVPZkRheSgpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24odGhpcywgdGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBFWFBJUllfVElNRV9PRl9EQVlfQURBUFRFUik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNFeHBpcnlUaW1lT2ZEYXkoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5QWRhcHRlci5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpID09IG51bGwpIHsKLQkJCXRoaXMuc3luY0V4cGlyeVRpbWVPZkRheV8obnVsbCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5leHBpcnlUaW1lT2ZEYXkgPT0gbnVsbCkgewotCQkJCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0b2QgPSB0aGlzLmJ1aWxkRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCQkJdG9kLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCQkJdGhpcy5zeW5jRXhwaXJ5VGltZU9mRGF5Xyh0b2QpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmV4cGlyeVRpbWVPZkRheS5zeW5jaHJvbml6ZVdpdGgoYXN0Um9vdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0V4cGlyeVRpbWVPZkRheV8oRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIGFzdEV4cGlyeVRpbWVPZkRheSkgewotCQlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gb2xkID0gdGhpcy5leHBpcnlUaW1lT2ZEYXk7Ci0JCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gYXN0RXhwaXJ5VGltZU9mRGF5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1RJTUVfT0ZfREFZX1BST1BFUlRZLCBvbGQsIGFzdEV4cGlyeVRpbWVPZkRheSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRFeHBpcnlUaW1lT2ZEYXlUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmV4cGlyeVRpbWVPZkRheVRleHRSYW5nZTsKLQl9Ci0KLQlwcml2YXRlIFRleHRSYW5nZSBidWlsZEV4cGlyeVRpbWVPZkRheVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRleHRSYW5nZSh0aGlzLmV4cGlyeVRpbWVPZkRheUFkYXB0ZXIuZ2V0QXN0Tm9kZShhc3RSb290KSk7Ci0JfQotCi0JLy8gKioqKiogaXNvbGF0aW9uCi0JcHVibGljIENhY2hlSXNvbGF0aW9uVHlwZTJfMiBnZXRJc29sYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmlzb2xhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJc29sYXRpb24oQ2FjaGVJc29sYXRpb25UeXBlMl8yIGlzb2xhdGlvbikgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5pc29sYXRpb24sIGlzb2xhdGlvbikpIHsKLQkJCXRoaXMuaXNvbGF0aW9uID0gaXNvbGF0aW9uOwotCQkJdGhpcy5pc29sYXRpb25BZGFwdGVyLnNldFZhbHVlKENhY2hlSXNvbGF0aW9uVHlwZTJfMi50b0phdmFBbm5vdGF0aW9uVmFsdWUoaXNvbGF0aW9uKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0lzb2xhdGlvbihDYWNoZUlzb2xhdGlvblR5cGUyXzIgYXN0SXNvbGF0aW9uKSB7Ci0JCUNhY2hlSXNvbGF0aW9uVHlwZTJfMiBvbGQgPSB0aGlzLmlzb2xhdGlvbjsKLQkJdGhpcy5pc29sYXRpb24gPSBhc3RJc29sYXRpb247Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChJU09MQVRJT05fUFJPUEVSVFksIG9sZCwgYXN0SXNvbGF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIENhY2hlSXNvbGF0aW9uVHlwZTJfMiBidWlsZElzb2xhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gQ2FjaGVJc29sYXRpb25UeXBlMl8yLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuaXNvbGF0aW9uQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRJc29sYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmlzb2xhdGlvblRleHRSYW5nZTsKLQl9Ci0KLQlwcml2YXRlIFRleHRSYW5nZSBidWlsZElzb2xhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKElTT0xBVElPTl9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkNBQ0hFX19UWVBFKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZFNpemVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkNBQ0hFX19TSVpFLCBOdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFNoYXJlZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ0FDSEVfX1NIQVJFRCwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRFeHBpcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkNBQ0hFX19FWFBJUlksIE51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkQWx3YXlzUmVmcmVzaEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ0FDSEVfX0FMV0FZU19SRUZSRVNILCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFJlZnJlc2hPbmx5SWZOZXdlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ0FDSEVfX1JFRlJFU0hfT05MWV9JRl9ORVdFUiwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGREaXNhYmxlSGl0c0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ0FDSEVfX0RJU0FCTEVfSElUUywgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZENvb3JkaW5hdGlvblR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkNBQ0hFX19DT09SRElOQVRJT05fVFlQRSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZEV4cGlyeVRpbWVPZkRheUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkNBQ0hFX19FWFBJUllfVElNRV9PRl9EQVksIEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkSXNvbGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5DQUNIRV9fSVNPTEFUSU9OKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDI4ZWMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uOwotCi0vKioKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNoYW5nZVRyYWNraW5nPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBWQUxVRV9BREFQVEVSID0gYnVpbGRWYWx1ZUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKLQlwcml2YXRlIENoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZTsKLQlwcml2YXRlIFRleHRSYW5nZSB2YWx1ZVRleHRSYW5nZTsKLQotCi0JcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnZhbHVlQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZWxlbWVudCwgVkFMVUVfQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7Ci0JCXRoaXMudmFsdWVUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkVmFsdWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7Ci0JCXRoaXMudmFsdWVUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkVmFsdWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLnZhbHVlID09IG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgQ2hhbmdlVHJhY2tpbmdUeXBlIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShDaGFuZ2VUcmFja2luZ1R5cGUgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUoQ2hhbmdlVHJhY2tpbmdUeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZSh2YWx1ZSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZShDaGFuZ2VUcmFja2luZ1R5cGUgYXN0VmFsdWUpIHsKLQkJQ2hhbmdlVHJhY2tpbmdUeXBlIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZVRyYWNraW5nVHlwZSBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBDaGFuZ2VUcmFja2luZ1R5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlVGV4dFJhbmdlOwotCX0KLQotCXByaXZhdGUgVGV4dFJhbmdlIGJ1aWxkVmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShWQUxVRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkdfX1ZBTFVFKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTlhOWI2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5BU1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMTsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DbGFzc0V4dHJhY3RvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEKLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBWQUxVRV9BREFQVEVSID0gYnVpbGRWYWx1ZUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUlkQ2xhc3NBbm5vdGF0aW9uI2Z1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWU7Ci0JLy8gd2UgbmVlZCBhIGZsYWcgc2luY2UgdGhlIGYtcSBuYW1lIGNhbiBiZSBudWxsCi0JcHJpdmF0ZSBib29sZWFuIGZxQ2xhc3NOYW1lU3RhbGUgPSB0cnVlOwotCi0KLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEoSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihlbGVtZW50LCBWQUxVRV9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jVmFsdWUodGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMudmFsdWUgPT0gbnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMuZnFDbGFzc05hbWVTdGFsZSA9IHRydWU7Ci0JCQl0aGlzLnZhbHVlQWRhcHRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1ZhbHVlKFN0cmluZyBhc3RWYWx1ZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy52YWx1ZSwgYXN0VmFsdWUpKSB7Ci0JCQl0aGlzLnN5bmNWYWx1ZV8oYXN0VmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZV8oU3RyaW5nIGFzdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gYXN0VmFsdWU7Ci0JCXRoaXMuZnFDbGFzc05hbWVTdGFsZSA9IHRydWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCBhc3RWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpIHsKLQkJaWYgKHRoaXMuZnFDbGFzc05hbWVTdGFsZSkgewotCQkJdGhpcy5mdWxseVF1YWxpZmllZENsYXNzTmFtZSA9IHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpOwotCQkJdGhpcy5mcUNsYXNzTmFtZVN0YWxlID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRDbGFzc05hbWU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZENsYXNzTmFtZV8oKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lXygpIHsKLQkJcmV0dXJuIEFTVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUodGhpcy52YWx1ZUFkYXB0ZXIuZ2V0RXhwcmVzc2lvbih0aGlzLmJ1aWxkQVNUUm9vdCgpKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkNMQVNTX0VYVFJBQ1RPUl9fVkFMVUUsIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkNTYyOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uOwotCi0vKioKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnNpb25WYWx1ZTwvY29kZT4KLSAqLwotZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24KLXsKLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGF0YVZhbHVlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGF0YVZhbHVlQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBkYXRhVmFsdWU7Ci0JcHJpdmF0ZSBUZXh0UmFuZ2UgZGF0YVZhbHVlVGV4dFJhbmdlOwotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG9iamVjdFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gb2JqZWN0VmFsdWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIG9iamVjdFZhbHVlOwotCXByaXZhdGUgVGV4dFJhbmdlIG9iamVjdFZhbHVlVGV4dFJhbmdlOwotCQotCXB1YmxpYyBzdGF0aWMgU291cmNlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGJ1aWxkTmVzdGVkU291cmNlQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCAKLQkJCUFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgCi0JCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7Ci0JCQotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbihwYXJlbnQsIGVsZW1lbnQsIGlkYWEpOwotCX0KLQotCXByaXZhdGUgU291cmNlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBpZGFhLCBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihlbGVtZW50LCBpZGFhKSk7Ci0JCXRoaXMuZGF0YVZhbHVlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZERhdGFWYWx1ZURlY2xhcmF0aW9uQWRhcHRlcigpOwotCQl0aGlzLmRhdGFWYWx1ZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkRGF0YVZhbHVlQWRhcHRlcigpOwotCQl0aGlzLm9iamVjdFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZE9iamVjdFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKCk7Ci0JCXRoaXMub2JqZWN0VmFsdWVBZGFwdGVyID0gdGhpcy5idWlsZE9iamVjdFZhbHVlQWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLmRhdGFWYWx1ZSA9IHRoaXMuYnVpbGREYXRhVmFsdWUoYXN0Um9vdCk7Ci0JCXRoaXMuZGF0YVZhbHVlVGV4dFJhbmdlID0gdGhpcy5idWlsZERhdGFWYWx1ZVRleHRSYW5nZShhc3RSb290KTsKLQotCQl0aGlzLm9iamVjdFZhbHVlID0gdGhpcy5idWlsZE9iamVjdFZhbHVlKGFzdFJvb3QpOwotCQl0aGlzLm9iamVjdFZhbHVlVGV4dFJhbmdlID0gdGhpcy5idWlsZE9iamVjdFZhbHVlVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNEYXRhVmFsdWUodGhpcy5idWlsZERhdGFWYWx1ZShhc3RSb290KSk7Ci0JCXRoaXMuZGF0YVZhbHVlVGV4dFJhbmdlID0gdGhpcy5idWlsZERhdGFWYWx1ZVRleHRSYW5nZShhc3RSb290KTsKLQotCQl0aGlzLnN5bmNPYmplY3RWYWx1ZSh0aGlzLmJ1aWxkT2JqZWN0VmFsdWUoYXN0Um9vdCkpOwotCQl0aGlzLm9iamVjdFZhbHVlVGV4dFJhbmdlID0gdGhpcy5idWlsZE9iamVjdFZhbHVlVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIGRhdGEgdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldERhdGFWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YVZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFWYWx1ZShTdHJpbmcgZGF0YVZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmRhdGFWYWx1ZSwgZGF0YVZhbHVlKSkgewotCQkJdGhpcy5kYXRhVmFsdWUgPSBkYXRhVmFsdWU7Ci0JCQl0aGlzLmRhdGFWYWx1ZUFkYXB0ZXIuc2V0VmFsdWUoZGF0YVZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jRGF0YVZhbHVlKFN0cmluZyBhc3REYXRhVmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGF0YVZhbHVlOwotCQl0aGlzLmRhdGFWYWx1ZSA9IGFzdERhdGFWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVkFMVUVfUFJPUEVSVFksIG9sZCwgYXN0RGF0YVZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERhdGFWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5kYXRhVmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RGF0YVZhbHVlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhVmFsdWVUZXh0UmFuZ2U7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0UmFuZ2UgYnVpbGREYXRhVmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmRhdGFWYWx1ZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkRGF0YVZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3ModGhpcy5kYWEsIEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUVfX0RBVEFfVkFMVUUpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGREYXRhVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFN0cmluZ0VsZW1lbnRBZGFwdGVyKHRoaXMuZGF0YVZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQkvLyAqKioqKiBvYmplY3QgdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3RWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RWYWx1ZShTdHJpbmcgb2JqZWN0VmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMub2JqZWN0VmFsdWUsIG9iamVjdFZhbHVlKSkgewotCQkJdGhpcy5vYmplY3RWYWx1ZSA9IG9iamVjdFZhbHVlOwotCQkJdGhpcy5vYmplY3RWYWx1ZUFkYXB0ZXIuc2V0VmFsdWUob2JqZWN0VmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNPYmplY3RWYWx1ZShTdHJpbmcgYXN0T2JqZWN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMub2JqZWN0VmFsdWU7Ci0JCXRoaXMub2JqZWN0VmFsdWUgPSBhc3RPYmplY3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9WQUxVRV9QUk9QRVJUWSwgb2xkLCBhc3RPYmplY3RWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRPYmplY3RWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3RWYWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRPYmplY3RWYWx1ZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VmFsdWVUZXh0UmFuZ2U7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0UmFuZ2UgYnVpbGRPYmplY3RWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMub2JqZWN0VmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE9iamVjdFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3ModGhpcy5kYWEsIEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUVfX09CSkVDVF9WQUxVRSk7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE9iamVjdFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcih0aGlzLm9iamVjdFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMuZGF0YVZhbHVlID09IG51bGwpICYmCi0JCQkJKHRoaXMub2JqZWN0VmFsdWUgPT0gbnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5kYXRhVmFsdWUpOwotCQlzYi5hcHBlbmQoIj0+Iik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMub2JqZWN0VmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMzNGUyZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJ0PC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlRWNsaXBzZUxpbmtCYXNlQ29udmVydEFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuQ09OVkVSVF9fVkFMVUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE5MjcxZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJ0ZXI8L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBDT05UQUlORVJfREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRWNsaXBzZUxpbmsuQ09OVkVSVEVSUyk7Ci0KLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gY29udmVydGVyQ2xhc3NEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjb252ZXJ0ZXJDbGFzc0FkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgY29udmVydGVyQ2xhc3M7Ci0JcHJpdmF0ZSBUZXh0UmFuZ2UgY29udmVydGVyQ2xhc3NUZXh0UmFuZ2U7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VJZENsYXNzQW5ub3RhdGlvbiNmdWxseVF1YWxpZmllZENsYXNzTmFtZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3NOYW1lOwotCS8vIHdlIG5lZWQgYSBmbGFnIHNpbmNlIHRoZSBmLXEgbmFtZSBjYW4gYmUgbnVsbAotCXByaXZhdGUgYm9vbGVhbiBmcUNvbnZlcnRlckNsYXNzTmFtZVN0YWxlID0gdHJ1ZTsKLQotCi0JcHVibGljIHN0YXRpYyBTb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24gYnVpbGRTb3VyY2VDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIGludCBpbmRleCkgewotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gYnVpbGRDb252ZXJ0ZXJEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4KTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IGJ1aWxkQ29udmVydGVyQW5ub3RhdGlvbkFkYXB0ZXIoZWxlbWVudCwgaWRhYSk7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKAotCQkJcGFyZW50LAotCQkJZWxlbWVudCwKLQkJCWlkYWEsCi0JCQlpYWEpOwotCX0KLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24oCi0JCQlKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwKLQkJCUFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwKLQkJCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSwKLQkJCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLmNvbnZlcnRlckNsYXNzRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZENvbnZlcnRlckRlY2xhcmF0aW9uQ2xhc3NBZGFwdGVyKCk7Ci0JCXRoaXMuY29udmVydGVyQ2xhc3NBZGFwdGVyID0gdGhpcy5idWlsZENvbnZlcnRlckNsYXNzQWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLmNvbnZlcnRlckNsYXNzID0gdGhpcy5idWlsZENvbnZlcnRlckNsYXNzKGFzdFJvb3QpOwotCQl0aGlzLmNvbnZlcnRlckNsYXNzVGV4dFJhbmdlID0gdGhpcy5idWlsZENvbnZlcnRlckNsYXNzVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGgoYXN0Um9vdCk7Ci0JCXRoaXMuc3luY0NvbnZlcnRlckNsYXNzKHRoaXMuYnVpbGRDb252ZXJ0ZXJDbGFzcyhhc3RSb290KSk7Ci0JCXRoaXMuY29udmVydGVyQ2xhc3NUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkQ29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLmNvbnZlcnRlckNsYXNzID09IG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTb3VyY2VOYW1lZENvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLkNPTlZFUlRFUl9fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBjb252ZXJ0ZXIgY2xhc3MKLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXJDbGFzcyhTdHJpbmcgY29udmVydGVyQ2xhc3MpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuY29udmVydGVyQ2xhc3MsIGNvbnZlcnRlckNsYXNzKSkgewotCQkJdGhpcy5jb252ZXJ0ZXJDbGFzcyA9IGNvbnZlcnRlckNsYXNzOwotCQkJdGhpcy5mcUNvbnZlcnRlckNsYXNzTmFtZVN0YWxlID0gdHJ1ZTsKLQkJCXRoaXMuY29udmVydGVyQ2xhc3NBZGFwdGVyLnNldFZhbHVlKGNvbnZlcnRlckNsYXNzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jQ29udmVydGVyQ2xhc3MoU3RyaW5nIGFzdENvbnZlcnRlckNsYXNzKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmNvbnZlcnRlckNsYXNzLCBhc3RDb252ZXJ0ZXJDbGFzcykpIHsKLQkJCXRoaXMuc3luY0NvbnZlcnRlckNsYXNzXyhhc3RDb252ZXJ0ZXJDbGFzcyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0NvbnZlcnRlckNsYXNzXyhTdHJpbmcgYXN0Q29udmVydGVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuY29udmVydGVyQ2xhc3M7Ci0JCXRoaXMuY29udmVydGVyQ2xhc3MgPSBhc3RDb252ZXJ0ZXJDbGFzczsKLQkJdGhpcy5mcUNvbnZlcnRlckNsYXNzTmFtZVN0YWxlID0gdHJ1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSwgb2xkLCBhc3RDb252ZXJ0ZXJDbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRDb252ZXJ0ZXJDbGFzcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDbGFzc0FkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRDb252ZXJ0ZXJDbGFzc1RleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ2xhc3NUZXh0UmFuZ2U7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0UmFuZ2UgYnVpbGRDb252ZXJ0ZXJDbGFzc1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMuY29udmVydGVyQ2xhc3NEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZENvbnZlcnRlckRlY2xhcmF0aW9uQ2xhc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuZGFhLCBFY2xpcHNlTGluay5DT05WRVJURVJfX0NPTlZFUlRFUl9DTEFTUywgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZENvbnZlcnRlckNsYXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcih0aGlzLmNvbnZlcnRlckNsYXNzRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb252ZXJ0ZXJDbGFzc0ltcGxlbWVudHNJbnRlcmZhY2UoU3RyaW5nIGludGVyZmFjZU5hbWUsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiAodGhpcy5jb252ZXJ0ZXJDbGFzcyAhPSBudWxsKQotCQkJCSYmIEFTVFRvb2xzLnR5cGVJbXBsZW1lbnRzSW50ZXJmYWNlKHRoaXMuY29udmVydGVyQ2xhc3NBZGFwdGVyLmdldEV4cHJlc3Npb24oYXN0Um9vdCksIGludGVyZmFjZU5hbWUpOwotCX0KLQotCS8vICoqKioqIGZ1bGx5LXF1YWxpZmllZCBjb252ZXJ0ZXIgY2xhc3MgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzc05hbWUoKSB7Ci0JCWlmICh0aGlzLmZxQ29udmVydGVyQ2xhc3NOYW1lU3RhbGUpIHsKLQkJCXRoaXMuZnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzc05hbWUgPSB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzc05hbWUoKTsKLQkJCXRoaXMuZnFDb252ZXJ0ZXJDbGFzc05hbWVTdGFsZSA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3NOYW1lOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzc05hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5jb252ZXJ0ZXJDbGFzcyA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzc05hbWVfKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzTmFtZV8oKSB7Ci0JCXJldHVybiBBU1RUb29scy5yZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKHRoaXMuY29udmVydGVyQ2xhc3NBZGFwdGVyLmdldEV4cHJlc3Npb24odGhpcy5idWlsZEFTVFJvb3QoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRDb252ZXJ0ZXJBbm5vdGF0aW9uQWRhcHRlcihBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJcmV0dXJuIG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIGlkYWEpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkQ29udmVydGVyRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgpIHsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IAotCQkJbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLAotCQkJCUNPTlRBSU5FUl9ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsCi0JCQkJaW5kZXgsCi0JCQkJQU5OT1RBVElPTl9OQU1FKTsKLQkJcmV0dXJuIGlkYWE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWQzZDcwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ3VzdG9taXplcjwvY29kZT4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFZBTFVFX0FEQVBURVIgPSBidWlsZFZhbHVlQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCXByaXZhdGUgVGV4dFJhbmdlIHZhbHVlVGV4dFJhbmdlOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlSWRDbGFzc0Fubm90YXRpb24jZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzc05hbWU7Ci0JLy8gd2UgbmVlZCBhIGZsYWcgc2luY2UgdGhlIGYtcSBuYW1lIGNhbiBiZSBudWxsCi0JcHJpdmF0ZSBib29sZWFuIGZxQ3VzdG9taXplckNsYXNzTmFtZVN0YWxlID0gdHJ1ZTsKLQotCi0JcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihlbGVtZW50LCBWQUxVRV9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KTsKLQkJdGhpcy52YWx1ZVRleHRSYW5nZSA9IHRoaXMuYnVpbGRWYWx1ZVRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jVmFsdWUodGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpKTsKLQkJdGhpcy52YWx1ZVRleHRSYW5nZSA9IHRoaXMuYnVpbGRWYWx1ZVRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMudmFsdWUgPT0gbnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEN1c3RvbWl6ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMuZnFDdXN0b21pemVyQ2xhc3NOYW1lU3RhbGUgPSB0cnVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZShTdHJpbmcgYXN0VmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIGFzdFZhbHVlKSkgewotCQkJdGhpcy5zeW5jVmFsdWVfKGFzdFZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVmFsdWVfKFN0cmluZyBhc3RWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IGFzdFZhbHVlOwotCQl0aGlzLmZxQ3VzdG9taXplckNsYXNzTmFtZVN0YWxlID0gdHJ1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZVRleHRSYW5nZTsKLQl9Ci0KLQlwcml2YXRlIFRleHRSYW5nZSBidWlsZFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY3VzdG9taXplckNsYXNzSW1wbGVtZW50c0ludGVyZmFjZShTdHJpbmcgaW50ZXJmYWNlTmFtZSwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuICh0aGlzLnZhbHVlICE9IG51bGwpCi0JCQkJJiYgQVNUVG9vbHMudHlwZUlzU3ViVHlwZU9mKHRoaXMudmFsdWVBZGFwdGVyLmdldEV4cHJlc3Npb24oYXN0Um9vdCksIGludGVyZmFjZU5hbWUpOwotCX0KLQotCi0JLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIGN1c3RvbWl6ZXIgY2xhc3MgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3NOYW1lKCkgewotCQlpZiAodGhpcy5mcUN1c3RvbWl6ZXJDbGFzc05hbWVTdGFsZSkgewotCQkJdGhpcy5mdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzc05hbWUgPSB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3NOYW1lKCk7Ci0JCQl0aGlzLmZxQ3VzdG9taXplckNsYXNzTmFtZVN0YWxlID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3NOYW1lOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzTmFtZV8oKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzTmFtZV8oKSB7Ci0JCXJldHVybiBBU1RUb29scy5yZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKHRoaXMudmFsdWVBZGFwdGVyLmdldEV4cHJlc3Npb24odGhpcy5idWlsZEFTVFJvb3QoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUl9fVkFMVUUsIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNDAxN2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlOwotCi0vKioKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkV4aXN0ZW5jZUNoZWNraW5nPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBWQUxVRV9BREFQVEVSID0gYnVpbGRWYWx1ZUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKLQlwcml2YXRlIEV4aXN0ZW5jZVR5cGUgdmFsdWU7Ci0JcHJpdmF0ZSBUZXh0UmFuZ2UgdmFsdWVUZXh0UmFuZ2U7Ci0KLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGVsZW1lbnQsIFZBTFVFX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOwotCQl0aGlzLnZhbHVlVGV4dFJhbmdlID0gdGhpcy5idWlsZFZhbHVlVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOwotCQl0aGlzLnZhbHVlVGV4dFJhbmdlID0gdGhpcy5idWlsZFZhbHVlVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVW5zZXQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1Vuc2V0KCkgJiYKLQkJCQkodGhpcy52YWx1ZSA9PSBudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIEV4aXN0ZW5jZVR5cGUgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKEV4aXN0ZW5jZVR5cGUgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUoRXhpc3RlbmNlVHlwZS50b0phdmFBbm5vdGF0aW9uVmFsdWUodmFsdWUpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVmFsdWUoRXhpc3RlbmNlVHlwZSBhc3RWYWx1ZSkgewotCQlFeGlzdGVuY2VUeXBlIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIEV4aXN0ZW5jZVR5cGUgYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gRXhpc3RlbmNlVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVUZXh0UmFuZ2U7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0UmFuZ2UgYnVpbGRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lOR19fVkFMVUUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMwMjkyNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZTsKLQotLyoqCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Kb2luRmV0Y2g8L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBKb2luRmV0Y2hUeXBlIHZhbHVlOwotCXByaXZhdGUgVGV4dFJhbmdlIHZhbHVlVGV4dFJhbmdlOwotCi0KLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnZhbHVlQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZWxlbWVudCwgVkFMVUVfQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7Ci0JCXRoaXMudmFsdWVUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkVmFsdWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7Ci0JCXRoaXMudmFsdWVUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkVmFsdWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLnZhbHVlID09IG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKb2luRmV0Y2hBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIEpvaW5GZXRjaFR5cGUgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKEpvaW5GZXRjaFR5cGUgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUoSm9pbkZldGNoVHlwZS50b0phdmFBbm5vdGF0aW9uVmFsdWUodmFsdWUpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVmFsdWUoSm9pbkZldGNoVHlwZSBhc3RWYWx1ZSkgewotCQlKb2luRmV0Y2hUeXBlIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIEpvaW5GZXRjaFR5cGUgYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gSm9pbkZldGNoVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVUZXh0UmFuZ2U7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0UmFuZ2UgYnVpbGRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0hfX1ZBTFVFKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rTWFwS2V5Q29udmVydEFubm90YXRpb24yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rTWFwS2V5Q29udmVydEFubm90YXRpb24yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyMTdlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua01hcEtleUNvbnZlcnRBbm5vdGF0aW9uMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNYXBLZXlDb252ZXJ0QW5ub3RhdGlvbjJfMDsKLQotLyoqCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5NYXBLZXlDb252ZXJ0PC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtNYXBLZXlDb252ZXJ0QW5ub3RhdGlvbjJfMAotCWV4dGVuZHMgU291cmNlRWNsaXBzZUxpbmtCYXNlQ29udmVydEFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rTWFwS2V5Q29udmVydEFubm90YXRpb24yXzAKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEVjbGlwc2VMaW5rTWFwS2V5Q29udmVydEFubm90YXRpb24yXzAuQU5OT1RBVElPTl9OQU1FKTsKLQotCi0JcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rTWFwS2V5Q29udmVydEFubm90YXRpb24yXzAoSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwS2V5Q29udmVydEFubm90YXRpb24yXzAuQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLk1BUF9LRVlfQ09OVkVSVF9fVkFMVUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYTk0ZjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Cb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuTXVsdGl0ZW5hbnRUeXBlMl8zOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk11bHRpdGVuYW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMwotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiAKLQkJCT0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBNdWx0aXRlbmFudFR5cGUyXzMgdmFsdWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBJTkNMVURFX0NSSVRFUklBX0FEQVBURVIgPSBidWlsZEluY2x1ZGVDcml0ZXJpYUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBpbmNsdWRlQ3JpdGVyaWFBZGFwdGVyOwotCXByaXZhdGUgQm9vbGVhbiBpbmNsdWRlQ3JpdGVyaWE7Ci0KLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMoSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihlbGVtZW50LCBWQUxVRV9BREFQVEVSKTsKLQkJdGhpcy5pbmNsdWRlQ3JpdGVyaWFBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oZWxlbWVudCwgSU5DTFVERV9DUklURVJJQV9BREFQVEVSKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOwotCQl0aGlzLmluY2x1ZGVDcml0ZXJpYSA9IHRoaXMuYnVpbGRJbmNsdWRlQ3JpdGVyaWEoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY0luY2x1ZGVDcml0ZXJpYSh0aGlzLmJ1aWxkSW5jbHVkZUNyaXRlcmlhKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMudmFsdWUgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5pbmNsdWRlQ3JpdGVyaWEgPT0gbnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgTXVsdGl0ZW5hbnRUeXBlMl8zIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShNdWx0aXRlbmFudFR5cGUyXzMgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUoTXVsdGl0ZW5hbnRUeXBlMl8zLnRvSmF2YUFubm90YXRpb25WYWx1ZSh2YWx1ZSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZShNdWx0aXRlbmFudFR5cGUyXzMgYXN0VmFsdWUpIHsKLQkJTXVsdGl0ZW5hbnRUeXBlMl8zIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIE11bHRpdGVuYW50VHlwZTJfMyBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBNdWx0aXRlbmFudFR5cGUyXzMuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShWQUxVRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBpbmNsdWRlIGNyaXRlcmlhCi0JcHVibGljIEJvb2xlYW4gZ2V0SW5jbHVkZUNyaXRlcmlhKCkgewotCQlyZXR1cm4gdGhpcy5pbmNsdWRlQ3JpdGVyaWE7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5jbHVkZUNyaXRlcmlhKEJvb2xlYW4gaW5jbHVkZUNyaXRlcmlhKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmluY2x1ZGVDcml0ZXJpYSwgaW5jbHVkZUNyaXRlcmlhKSkgewotCQkJdGhpcy5pbmNsdWRlQ3JpdGVyaWEgPSBpbmNsdWRlQ3JpdGVyaWE7Ci0JCQl0aGlzLmluY2x1ZGVDcml0ZXJpYUFkYXB0ZXIuc2V0VmFsdWUoaW5jbHVkZUNyaXRlcmlhKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jSW5jbHVkZUNyaXRlcmlhKEJvb2xlYW4gYXN0SW5jbHVkZUNyaXRlcmlhKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5pbmNsdWRlQ3JpdGVyaWE7Ci0JCXRoaXMuaW5jbHVkZUNyaXRlcmlhID0gYXN0SW5jbHVkZUNyaXRlcmlhOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSU5DTFVERV9DUklURVJJQV9QUk9QRVJUWSwgb2xkLCBhc3RJbmNsdWRlQ3JpdGVyaWEpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZEluY2x1ZGVDcml0ZXJpYShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5pbmNsdWRlQ3JpdGVyaWFBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0SW5jbHVkZUNyaXRlcmlhVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoSU5DTFVERV9DUklURVJJQV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5NVUxUSVRFTkFOVF9fVkFMVUUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkSW5jbHVkZUNyaXRlcmlhQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5NVUxUSVRFTkFOVF9fSU5DTFVERV9DUklURVJJQSwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMzM3YzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk11dGFibGU8L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gdmFsdWVBZGFwdGVyOwotCXByaXZhdGUgQm9vbGVhbiB2YWx1ZTsKLQlwcml2YXRlIFRleHRSYW5nZSB2YWx1ZVRleHRSYW5nZTsKLQotCi0JcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oZWxlbWVudCwgVkFMVUVfQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7Ci0JCXRoaXMudmFsdWVUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkVmFsdWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7Ci0JCXRoaXMudmFsdWVUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkVmFsdWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLnZhbHVlID09IG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBNdXRhYmxlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBCb29sZWFuIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVmFsdWUoQm9vbGVhbiBhc3RWYWx1ZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVUZXh0UmFuZ2U7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0UmFuZ2UgYnVpbGRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5NVVRBQkxFX19WQUxVRSwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRhMzk3Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT4KLSAqIDx1bD4KLSAqIDxsaT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJ0ZXIKLSAqIDxsaT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5TdHJ1Y3RDb252ZXJ0ZXIKLSAqIDxsaT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UeXBlQ29udmVydGVyCi0gKiA8bGk+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuT2JqZWN0VHlwZUNvbnZlcnRlcgotICogPC91bD4KLSAqIDwvY29kZT4KLSAqLwotYWJzdHJhY3QgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uCi17Ci0JZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lRGVjbGFyYXRpb25BZGFwdGVyOwotCWZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCVN0cmluZyBuYW1lOwotCVRleHRSYW5nZSBuYW1lVGV4dFJhbmdlOwotCQkKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCVNvdXJjZUVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsCi0JCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsCi0JCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQkJdGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCB0aGlzLmdldE5hbWVFbGVtZW50TmFtZSgpKTsKLQkJdGhpcy5uYW1lQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCB0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoYXN0Um9vdCk7Ci0JCXRoaXMubmFtZVRleHRSYW5nZSA9IHRoaXMuYnVpbGROYW1lVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jTmFtZSh0aGlzLmJ1aWxkTmFtZShhc3RSb290KSk7Ci0JCXRoaXMubmFtZVRleHRSYW5nZSA9IHRoaXMuYnVpbGROYW1lVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMubmFtZSA9PSBudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lLCBuYW1lKSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY05hbWUoU3RyaW5nIGFzdE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gYXN0TmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE92ZXJyaWRlQW5ub3RhdGlvbi5OQU1FX1BST1BFUlRZLCBvbGQsIGFzdE5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVUZXh0UmFuZ2U7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0UmFuZ2UgYnVpbGROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyh0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JYWJzdHJhY3QgU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGYyMTViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuT2JqZWN0VHlwZUNvbnZlcnRlcjwvY29kZT4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUVjbGlwc2VMaW5rQmFzZVR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgQ09OVEFJTkVSX0RFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUlMpOwotCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRlZmF1bHRPYmplY3RWYWx1ZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRlZmF1bHRPYmplY3RWYWx1ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdE9iamVjdFZhbHVlOwotCXByaXZhdGUgVGV4dFJhbmdlIGRlZmF1bHRPYmplY3RWYWx1ZVRleHRSYW5nZTsKLQotCXByaXZhdGUgZmluYWwgQ29udmVyc2lvblZhbHVlc0Fubm90YXRpb25Db250YWluZXIgY29udmVyc2lvblZhbHVlc0NvbnRhaW5lciA9IG5ldyBDb252ZXJzaW9uVmFsdWVzQW5ub3RhdGlvbkNvbnRhaW5lcigpOwotCi0KLQlwdWJsaWMgc3RhdGljIFNvdXJjZUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gYnVpbGRTb3VyY2VPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlckRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW5kZXgpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gYnVpbGRPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkFkYXB0ZXIoZWxlbWVudCwgaWRhYSk7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbigKLQkJCXBhcmVudCwKLQkJCWVsZW1lbnQsCi0JCQlpZGFhLAotCQkJaWFhKTsKLQl9Ci0KLQlwcml2YXRlIFNvdXJjZUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24oCi0JCQlKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwKLQkJCUFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwKLQkJCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSwKLQkJCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGREZWZhdWx0T2JqZWN0VmFsdWVBZGFwdGVyKCk7Ci0JCXRoaXMuZGVmYXVsdE9iamVjdFZhbHVlQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZWxlbWVudCwgdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZSA9IHRoaXMuYnVpbGREZWZhdWx0T2JqZWN0VmFsdWUoYXN0Um9vdCk7Ci0JCXRoaXMuZGVmYXVsdE9iamVjdFZhbHVlVGV4dFJhbmdlID0gdGhpcy5idWlsZERlZmF1bHRPYmplY3RWYWx1ZVRleHRSYW5nZShhc3RSb290KTsKLQkJdGhpcy5jb252ZXJzaW9uVmFsdWVzQ29udGFpbmVyLmluaXRpYWxpemVGcm9tQ29udGFpbmVyQW5ub3RhdGlvbih0aGlzLmdldEFzdEFubm90YXRpb24oYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGgoYXN0Um9vdCk7Ci0JCXRoaXMuc3luY0RlZmF1bHRPYmplY3RWYWx1ZSh0aGlzLmJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlKGFzdFJvb3QpKTsKLQkJdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWVUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlVGV4dFJhbmdlKGFzdFJvb3QpOwotCQl0aGlzLmNvbnZlcnNpb25WYWx1ZXNDb250YWluZXIuc3luY2hyb25pemUodGhpcy5nZXRBc3RBbm5vdGF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMuZGVmYXVsdE9iamVjdFZhbHVlID09IG51bGwpICYmCi0JCQkJdGhpcy5jb252ZXJzaW9uVmFsdWVzQ29udGFpbmVyLmlzRW1wdHkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU291cmNlTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNvdXJjZUJhc2VUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0RGF0YVR5cGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFOwotCX0KLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXRPYmplY3RUeXBlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBkZWZhdWx0IG9iamVjdCB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE9iamVjdFZhbHVlKFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuZGVmYXVsdE9iamVjdFZhbHVlLCBkZWZhdWx0T2JqZWN0VmFsdWUpKSB7Ci0JCQl0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZSA9IGRlZmF1bHRPYmplY3RWYWx1ZTsKLQkJCXRoaXMuZGVmYXVsdE9iamVjdFZhbHVlQWRhcHRlci5zZXRWYWx1ZShkZWZhdWx0T2JqZWN0VmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNEZWZhdWx0T2JqZWN0VmFsdWUoU3RyaW5nIGFzdERlZmF1bHRPYmplY3RWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWU7Ci0JCXRoaXMuZGVmYXVsdE9iamVjdFZhbHVlID0gYXN0RGVmYXVsdE9iamVjdFZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9PQkpFQ1RfVkFMVUVfUFJPUEVSVFksIG9sZCwgYXN0RGVmYXVsdE9iamVjdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERlZmF1bHRPYmplY3RWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RGVmYXVsdE9iamVjdFZhbHVlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWVUZXh0UmFuZ2U7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0UmFuZ2UgYnVpbGREZWZhdWx0T2JqZWN0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmRhYSwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19ERUZBVUxUX09CSkVDVF9WQUxVRSwgU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvLyAqKioqKiBjb252ZXJzaW9uIHZhbHVlcwotCi0JcHVibGljIExpc3RJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IGdldENvbnZlcnNpb25WYWx1ZXMoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnNpb25WYWx1ZXNDb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJzaW9uVmFsdWVzQ29udGFpbmVyLmdldE5lc3RlZEFubm90YXRpb25zU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gY29udmVyc2lvblZhbHVlQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnNpb25WYWx1ZXNDb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbihpbmRleCk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBhZGRDb252ZXJzaW9uVmFsdWUoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnNpb25WYWx1ZXNDb250YWluZXIuYWRkTmVzdGVkQW5ub3RhdGlvbihpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZUNvbnZlcnNpb25WYWx1ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLmNvbnZlcnNpb25WYWx1ZXNDb250YWluZXIubW92ZU5lc3RlZEFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb252ZXJzaW9uVmFsdWUoaW50IGluZGV4KSB7Ci0JCXRoaXMuY29udmVyc2lvblZhbHVlc0NvbnRhaW5lci5yZW1vdmVOZXN0ZWRBbm5vdGF0aW9uKGluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGJ1aWxkQ29udmVyc2lvblZhbHVlKGludCBpbmRleCkgewotCQlyZXR1cm4gU291cmNlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmJ1aWxkTmVzdGVkU291cmNlQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbigKLQkJCXRoaXMsIHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgdGhpcy5idWlsZENvbnZlcnNpb25WYWx1ZUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4KSk7Ci0JfQotCQotCXByaXZhdGUgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRDb252ZXJzaW9uVmFsdWVJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQl0aGlzLmRhYSwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19DT05WRVJTSU9OX1ZBTFVFUywgaW5kZXgsIEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUUpOwotCX0KLQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uQWRhcHRlcihBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJcmV0dXJuIG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIGlkYWEpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlckRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4KSB7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSAKLQkJCW5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCURFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwKLQkJCQlDT05UQUlORVJfREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLAotCQkJCWluZGV4LAotCQkJCUFOTk9UQVRJT05fTkFNRSk7Ci0JCXJldHVybiBpZGFhOwotCX0KLQotCS8vICoqKioqKioqKiogaGludCBjb250YWluZXIgKioqKioqKioqKgotCS8qKgotCSAqIGFkYXB0IHRoZSBBbm5vdGF0aW9uQ29udGFpbmVyIGludGVyZmFjZSB0byB0aGUgeG1sIHNjaGVtYSdzIHhtbG5zCi0JICovCi0JY2xhc3MgQ29udmVyc2lvblZhbHVlc0Fubm90YXRpb25Db250YWluZXIgCi0JCWV4dGVuZHMgQW5ub3RhdGlvbkNvbnRhaW5lcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXROZXN0ZWRBbm5vdGF0aW9uc0xpc3ROYW1lKCkgewotCQkJcmV0dXJuIENPTlZFUlNJT05fVkFMVUVTX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19DT05WRVJTSU9OX1ZBTFVFUzsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXROZXN0ZWRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGJ1aWxkTmVzdGVkQW5ub3RhdGlvbihpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBTb3VyY2VFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLnRoaXMuYnVpbGRDb252ZXJzaW9uVmFsdWUoaW5kZXgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjdlZTFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlByaW1hcnlLZXkKLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiAKLQkJCT0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQkKLQkKLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIG5vdGhpbmcgdG8gc3luYwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhODMxZDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUHJpdmF0ZU93bmVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCi0JcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gbm90aGluZyB0byBpbml0aWFsaXplCi0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIG5vdGhpbmcgdG8gc3luYwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNzAxNGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlJlYWRPbmx5Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gbm90aGluZyB0byBpbml0aWFsaXplCi0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIG5vdGhpbmcgdG8gc3luYwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU3ZmJkNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZFRyYW5zZm9ybWVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU291cmNlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXRUcmFuc2Zvcm1lckNsYXNzRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSX19UUkFOU0ZPUk1FUl9DTEFTUzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0TWV0aG9kRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSX19NRVRIT0Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmMzMDBjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5TdHJ1Y3RDb252ZXJ0ZXI8L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBDT05UQUlORVJfREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUlMpOwotCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGNvbnZlcnRlckRlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGNvbnZlcnRlckFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgY29udmVydGVyOwotCXByaXZhdGUgVGV4dFJhbmdlIGNvbnZlcnRlclRleHRSYW5nZTsKLQotCi0JcHVibGljIHN0YXRpYyBTb3VyY2VFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gYnVpbGRTb3VyY2VTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIGludCBpbmRleCkgewotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4KTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IGJ1aWxkU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbkFkYXB0ZXIoZWxlbWVudCwgaWRhYSk7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKAotCQkJcGFyZW50LAotCQkJZWxlbWVudCwKLQkJCWlkYWEsCi0JCQlpYWEpOwotCX0KLQotCXByaXZhdGUgU291cmNlRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsCi0JCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsCi0JCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQkJdGhpcy5jb252ZXJ0ZXJEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyRGVjbGFyYXRpb25BZGFwdGVyKCk7Ci0JCXRoaXMuY29udmVydGVyQWRhcHRlciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXJBZGFwdGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXRoaXMuY29udmVydGVyID0gdGhpcy5idWlsZENvbnZlcnRlcihhc3RSb290KTsKLQkJdGhpcy5jb252ZXJ0ZXJUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkQ29udmVydGVyVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGgoYXN0Um9vdCk7Ci0JCXRoaXMuc3luY0NvbnZlcnRlcih0aGlzLmJ1aWxkQ29udmVydGVyKGFzdFJvb3QpKTsKLQkJdGhpcy5jb252ZXJ0ZXJUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkQ29udmVydGVyVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVW5zZXQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1Vuc2V0KCkgJiYKLQkJCQkodGhpcy5jb252ZXJ0ZXIgPT0gbnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNvdXJjZU5hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUl9fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBjb252ZXJ0ZXIKLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlcihTdHJpbmcgY29udmVydGVyKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmNvbnZlcnRlciwgY29udmVydGVyKSkgewotCQkJdGhpcy5jb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7Ci0JCQl0aGlzLmNvbnZlcnRlckFkYXB0ZXIuc2V0VmFsdWUoY29udmVydGVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jQ29udmVydGVyKFN0cmluZyBhc3RDb252ZXJ0ZXIpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuY29udmVydGVyOwotCQl0aGlzLmNvbnZlcnRlciA9IGFzdENvbnZlcnRlcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9QUk9QRVJUWSwgb2xkLCBhc3RDb252ZXJ0ZXIpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQ29udmVydGVyKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRDb252ZXJ0ZXJUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlclRleHRSYW5nZTsKLQl9Ci0KLQlwcml2YXRlIFRleHRSYW5nZSBidWlsZENvbnZlcnRlclRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMuY29udmVydGVyRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRDb252ZXJ0ZXJEZWNsYXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyh0aGlzLmRhYSwgRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQ29udmVydGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcih0aGlzLmNvbnZlcnRlckRlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uQWRhcHRlcihBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJcmV0dXJuIG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIGlkYWEpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkU3RydWN0Q29udmVydGVyRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgpIHsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IAotCQkJbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLAotCQkJCUNPTlRBSU5FUl9ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsCi0JCQkJaW5kZXgsCi0JCQkJQU5OT1RBVElPTl9OQU1FKTsKLQkJcmV0dXJuIGlkYWE7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1N0cnVjdHVyZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rU3RydWN0dXJlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjA0NTVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rU3RydWN0dXJlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3R1cmVBbm5vdGF0aW9uMl8zOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlN0cnVjdHVyZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtTdHJ1Y3R1cmVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1N0cnVjdHVyZUFubm90YXRpb24yXzMKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua1N0cnVjdHVyZUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I5NTUyMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUJhc2VEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zOwotCi0vKioKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW48L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zCi0JZXh0ZW5kcyBTb3VyY2VCYXNlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIENPTlRBSU5FUl9ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TKTsKLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjb250ZXh0UHJvcGVydHlEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjb250ZXh0UHJvcGVydHlBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIGNvbnRleHRQcm9wZXJ0eTsKLQlwcml2YXRlIFRleHRSYW5nZSBjb250ZXh0UHJvcGVydHlUZXh0UmFuZ2U7Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdGFibGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB0YWJsZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgdGFibGU7Ci0JcHJpdmF0ZSBUZXh0UmFuZ2UgdGFibGVUZXh0UmFuZ2U7Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHByaW1hcnlLZXlEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gcHJpbWFyeUtleUFkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIHByaW1hcnlLZXk7Ci0JcHJpdmF0ZSBUZXh0UmFuZ2UgcHJpbWFyeUtleVRleHRSYW5nZTsKLQotCXB1YmxpYyBzdGF0aWMgU291cmNlRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyBidWlsZFNvdXJjZVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIAotCQkJQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0KLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNvdXJjZUVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMgYnVpbGRTb3VyY2VUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCAKLQkJCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgCi0JCQlpbnQgaW5kZXgpIHsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IGJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW5kZXgpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gYnVpbGRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbkFkYXB0ZXIoYW5ub3RhdGVkRWxlbWVudCwgaWRhYSk7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMygKLQkJCXBhcmVudCwKLQkJCWFubm90YXRlZEVsZW1lbnQsCi0JCQlpZGFhLAotCQkJaWFhKTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgU291cmNlRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyBidWlsZE5lc3RlZFNvdXJjZVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIAotCQkJQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCAKLQkJCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJCi0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyhwYXJlbnQsIGVsZW1lbnQsIGlkYWEpOwotCX0KLQotCXByaXZhdGUgU291cmNlRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyhKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQl0aGlzKHBhcmVudCwgZWxlbWVudCwgZGFhLCBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKGVsZW1lbnQsIGRhYSkpOwotCX0KLQotCXByaXZhdGUgU291cmNlRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyhKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7Ci0JCXRoaXMocGFyZW50LCBlbGVtZW50LCBpZGFhLCBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihlbGVtZW50LCBpZGFhKSk7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLmNvbnRleHRQcm9wZXJ0eURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRDb250ZXh0UHJvcGVydHlEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5jb250ZXh0UHJvcGVydHlBZGFwdGVyID0gdGhpcy5idWlsZENvbnRleHRQcm9wZXJ0eUFkYXB0ZXIoKTsKLQkJdGhpcy50YWJsZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRUYWJsZURlY2xhcmF0aW9uQWRhcHRlcigpOwotCQl0aGlzLnRhYmxlQWRhcHRlciA9IHRoaXMuYnVpbGRUYWJsZUFkYXB0ZXIoKTsKLQkJdGhpcy5wcmltYXJ5S2V5RGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZFByaW1hcnlLZXlEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5wcmltYXJ5S2V5QWRhcHRlciA9IHRoaXMuYnVpbGRQcmltYXJ5S2V5QWRhcHRlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQotCQl0aGlzLmNvbnRleHRQcm9wZXJ0eSA9IHRoaXMuYnVpbGRDb250ZXh0UHJvcGVydHkoYXN0Um9vdCk7Ci0JCXRoaXMuY29udGV4dFByb3BlcnR5VGV4dFJhbmdlID0gdGhpcy5idWlsZENvbnRleHRQcm9wZXJ0eVRleHRSYW5nZShhc3RSb290KTsKLQotCQl0aGlzLnRhYmxlID0gdGhpcy5idWlsZFRhYmxlKGFzdFJvb3QpOwotCQl0aGlzLnRhYmxlVGV4dFJhbmdlID0gdGhpcy5idWlsZFRhYmxlVGV4dFJhbmdlKGFzdFJvb3QpOwotCi0JCXRoaXMucHJpbWFyeUtleSA9IHRoaXMuYnVpbGRQcmltYXJ5S2V5KGFzdFJvb3QpOwotCQl0aGlzLnByaW1hcnlLZXlUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkUHJpbWFyeUtleVRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCi0JCXRoaXMuc3luY0NvbnRleHRQcm9wZXJ0eSh0aGlzLmJ1aWxkQ29udGV4dFByb3BlcnR5KGFzdFJvb3QpKTsKLQkJdGhpcy5jb250ZXh0UHJvcGVydHlUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkQ29udGV4dFByb3BlcnR5VGV4dFJhbmdlKGFzdFJvb3QpOwotCi0JCXRoaXMuc3luY1RhYmxlKHRoaXMuYnVpbGRUYWJsZShhc3RSb290KSk7Ci0JCXRoaXMudGFibGVUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkVGFibGVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0KLQkJdGhpcy5zeW5jUHJpbWFyeUtleSh0aGlzLmJ1aWxkUHJpbWFyeUtleShhc3RSb290KSk7Ci0JCXRoaXMucHJpbWFyeUtleVRleHRSYW5nZSA9IHRoaXMuYnVpbGRQcmltYXJ5S2V5VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU291cmNlTmFtZWRDb2x1bW5Bbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbkVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjsKLQl9Ci0KLQotCS8vKioqKioqKioqKioqKiBTb3VyY2VCYXNlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaXNjcmltaW5hdG9yVHlwZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19ESVNDUklNSU5BVE9SX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMZW5ndGhFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9fTEVOR1RIOwotCX0KLQotCi0JLy8qKioqKioqKioqKioqIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioKLQotCS8vICoqKioqIGNvbnRleHRQcm9wZXJ0eQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFByb3BlcnR5KCkgewotCQlyZXR1cm4gdGhpcy5jb250ZXh0UHJvcGVydHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dFByb3BlcnR5KFN0cmluZyBjb250ZXh0UHJvcGVydHkpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuY29udGV4dFByb3BlcnR5LCBjb250ZXh0UHJvcGVydHkpKSB7Ci0JCQl0aGlzLmNvbnRleHRQcm9wZXJ0eSA9IGNvbnRleHRQcm9wZXJ0eTsKLQkJCXRoaXMuY29udGV4dFByb3BlcnR5QWRhcHRlci5zZXRWYWx1ZShjb250ZXh0UHJvcGVydHkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNDb250ZXh0UHJvcGVydHkoU3RyaW5nIGFzdENvbnRleHRQcm9wZXJ0eSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5jb250ZXh0UHJvcGVydHk7Ci0JCXRoaXMuY29udGV4dFByb3BlcnR5ID0gYXN0Q29udGV4dFByb3BlcnR5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OVEVYVF9QUk9QRVJUWV9QUk9QRVJUWSwgb2xkLCBhc3RDb250ZXh0UHJvcGVydHkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQ29udGV4dFByb3BlcnR5KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmNvbnRleHRQcm9wZXJ0eUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRDb250ZXh0UHJvcGVydHlUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRleHRQcm9wZXJ0eVRleHRSYW5nZTsKLQl9Ci0KLQlwcml2YXRlIFRleHRSYW5nZSBidWlsZENvbnRleHRQcm9wZXJ0eVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMuY29udGV4dFByb3BlcnR5RGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRDb250ZXh0UHJvcGVydHlEZWNsYXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkU3RyaW5nRWxlbWVudEFkYXB0ZXIoRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19DT05URVhUX1BST1BFUlRZKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQ29udGV4dFByb3BlcnR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcih0aGlzLmNvbnRleHRQcm9wZXJ0eURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCi0JLy8gKioqKiogdGFibGUKLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYWJsZShTdHJpbmcgdGFibGUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudGFibGUsIHRhYmxlKSkgewotCQkJdGhpcy50YWJsZSA9IHRhYmxlOwotCQkJdGhpcy50YWJsZUFkYXB0ZXIuc2V0VmFsdWUodGFibGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNUYWJsZShTdHJpbmcgYXN0VGFibGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudGFibGU7Ci0JCXRoaXMudGFibGUgPSBhc3RUYWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX1BST1BFUlRZLCBvbGQsIGFzdFRhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFRhYmxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZVRleHRSYW5nZTsKLQl9Ci0KLQlwcml2YXRlIFRleHRSYW5nZSBidWlsZFRhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy50YWJsZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVUb3VjaGVzKGludCBwb3MpIHsKLQkJcmV0dXJuIHRoaXMudGV4dFJhbmdlVG91Y2hlcyh0aGlzLnRhYmxlVGV4dFJhbmdlLCBwb3MpOwotCX0KLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFRhYmxlRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFN0cmluZ0VsZW1lbnRBZGFwdGVyKEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9fVEFCTEUpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRUYWJsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkU3RyaW5nRWxlbWVudEFkYXB0ZXIodGhpcy50YWJsZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCi0JLy8gKioqKiogcHJpbWFyeUtleQotCXB1YmxpYyBCb29sZWFuIGdldFByaW1hcnlLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnByaW1hcnlLZXk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleShCb29sZWFuIHByaW1hcnlLZXkpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMucHJpbWFyeUtleSwgcHJpbWFyeUtleSkpIHsKLQkJCXRoaXMucHJpbWFyeUtleSA9IHByaW1hcnlLZXk7Ci0JCQl0aGlzLnByaW1hcnlLZXlBZGFwdGVyLnNldFZhbHVlKHByaW1hcnlLZXkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNQcmltYXJ5S2V5KEJvb2xlYW4gYXN0UHJpbWFyeUtleSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMucHJpbWFyeUtleTsKLQkJdGhpcy5wcmltYXJ5S2V5ID0gYXN0UHJpbWFyeUtleTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBSSU1BUllfS0VZX1BST1BFUlRZLCBvbGQsIGFzdFByaW1hcnlLZXkpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZFByaW1hcnlLZXkoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucHJpbWFyeUtleUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRQcmltYXJ5S2V5VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5wcmltYXJ5S2V5VGV4dFJhbmdlOwotCX0KLQotCXByaXZhdGUgVGV4dFJhbmdlIGJ1aWxkUHJpbWFyeUtleVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMucHJpbWFyeUtleURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFByaW1hcnlLZXlEZWNsYXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQm9vbGVhbkVsZW1lbnRBZGFwdGVyKEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9fUFJJTUFSWV9LRVkpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkUHJpbWFyeUtleUFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQm9vbGVhbkVsZW1lbnRBZGFwdGVyKHRoaXMucHJpbWFyeUtleURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLmNvbnRleHRQcm9wZXJ0eSA9PSBudWxsKSAmJgotCQkJCSh0aGlzLnByaW1hcnlLZXkgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy50YWJsZSA9PSBudWxsKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBidWlsZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uQWRhcHRlcihBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJcmV0dXJuIG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIGlkYWEpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4KSB7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSAKLQkJCW5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCURFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwKLQkJCQlDT05UQUlORVJfREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLAotCQkJCWluZGV4LAotCQkJCUVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKTsKLQkJcmV0dXJuIGlkYWE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNlZjE0Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlRpbWVPZkRheQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24KLXsKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGhvdXJEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gaG91ckFkYXB0ZXI7Ci0JcHJpdmF0ZSBJbnRlZ2VyIGhvdXI7Ci0JcHJpdmF0ZSBUZXh0UmFuZ2UgaG91clRleHRSYW5nZTsKLQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gbWludXRlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IG1pbnV0ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBJbnRlZ2VyIG1pbnV0ZTsKLQlwcml2YXRlIFRleHRSYW5nZSBtaW51dGVUZXh0UmFuZ2U7Ci0KLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IHNlY29uZERlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBzZWNvbmRBZGFwdGVyOwotCXByaXZhdGUgSW50ZWdlciBzZWNvbmQ7Ci0JcHJpdmF0ZSBUZXh0UmFuZ2Ugc2Vjb25kVGV4dFJhbmdlOwotCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBtaWxsaXNlY29uZERlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBtaWxsaXNlY29uZEFkYXB0ZXI7Ci0JcHJpdmF0ZSBJbnRlZ2VyIG1pbGxpc2Vjb25kOwotCXByaXZhdGUgVGV4dFJhbmdlIG1pbGxpc2Vjb25kVGV4dFJhbmdlOwotCi0KLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgZGFhKTsKLQkJdGhpcy5ob3VyRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGRIb3VyQWRhcHRlcihkYWEpOwotCQl0aGlzLmhvdXJBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oZWxlbWVudCwgdGhpcy5ob3VyRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5taW51dGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZE1pbnV0ZUFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5taW51dGVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oZWxlbWVudCwgdGhpcy5taW51dGVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLnNlY29uZERlY2xhcmF0aW9uQWRhcHRlciA9IGJ1aWxkU2Vjb25kQWRhcHRlcihkYWEpOwotCQl0aGlzLnNlY29uZEFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPihlbGVtZW50LCB0aGlzLnNlY29uZERlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMubWlsbGlzZWNvbmREZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZE1pbGxpc2Vjb25kQWRhcHRlcihkYWEpOwotCQl0aGlzLm1pbGxpc2Vjb25kQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KGVsZW1lbnQsIHRoaXMubWlsbGlzZWNvbmREZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLmhvdXIgPSB0aGlzLmJ1aWxkSG91cihhc3RSb290KTsKLQkJdGhpcy5ob3VyVGV4dFJhbmdlID0gdGhpcy5idWlsZEhvdXJUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0KLQkJdGhpcy5taW51dGUgPSB0aGlzLmJ1aWxkTWludXRlKGFzdFJvb3QpOwotCQl0aGlzLm1pbnV0ZVRleHRSYW5nZSA9IHRoaXMuYnVpbGRNaW51dGVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0KLQkJdGhpcy5zZWNvbmQgPSB0aGlzLmJ1aWxkU2Vjb25kKGFzdFJvb3QpOwotCQl0aGlzLnNlY29uZFRleHRSYW5nZSA9IHRoaXMuYnVpbGRTZWNvbmRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0KLQkJdGhpcy5taWxsaXNlY29uZCA9IHRoaXMuYnVpbGRNaWxsaXNlY29uZChhc3RSb290KTsKLQkJdGhpcy5taWxsaXNlY29uZFRleHRSYW5nZSA9IHRoaXMuYnVpbGRNaWxsaXNlY29uZFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jSG91cih0aGlzLmJ1aWxkSG91cihhc3RSb290KSk7Ci0JCXRoaXMuaG91clRleHRSYW5nZSA9IHRoaXMuYnVpbGRIb3VyVGV4dFJhbmdlKGFzdFJvb3QpOwotCi0JCXRoaXMuc3luY01pbnV0ZSh0aGlzLmJ1aWxkTWludXRlKGFzdFJvb3QpKTsKLQkJdGhpcy5taW51dGVUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkTWludXRlVGV4dFJhbmdlKGFzdFJvb3QpOwotCi0JCXRoaXMuc3luY1NlY29uZCh0aGlzLmJ1aWxkU2Vjb25kKGFzdFJvb3QpKTsKLQkJdGhpcy5zZWNvbmRUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkU2Vjb25kVGV4dFJhbmdlKGFzdFJvb3QpOwotCi0JCXRoaXMuc3luY01pbGxpc2Vjb25kKHRoaXMuYnVpbGRNaWxsaXNlY29uZChhc3RSb290KSk7Ci0JCXRoaXMubWlsbGlzZWNvbmRUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkTWlsbGlzZWNvbmRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLmhvdXIgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5taW51dGUgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5zZWNvbmQgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5taWxsaXNlY29uZCA9PSBudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGltZU9mRGF5QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBob3VyCi0JcHVibGljIEludGVnZXIgZ2V0SG91cigpIHsKLQkJcmV0dXJuIHRoaXMuaG91cjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIb3VyKEludGVnZXIgaG91cikgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5ob3VyLCBob3VyKSkgewotCQkJdGhpcy5ob3VyID0gaG91cjsKLQkJCXRoaXMuaG91ckFkYXB0ZXIuc2V0VmFsdWUoaG91cik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0hvdXIoSW50ZWdlciBhc3RIb3VyKSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5ob3VyOwotCQl0aGlzLmhvdXIgPSBhc3RIb3VyOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSE9VUl9QUk9QRVJUWSwgb2xkLCBhc3RIb3VyKTsKLQl9Ci0KLQlwcml2YXRlIEludGVnZXIgYnVpbGRIb3VyKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmhvdXJBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0SG91clRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuaG91clRleHRSYW5nZTsKLQl9Ci0KLQlwcml2YXRlIFRleHRSYW5nZSBidWlsZEhvdXJUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmhvdXJEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIG1pbnV0ZQotCXB1YmxpYyBJbnRlZ2VyIGdldE1pbnV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMubWludXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1pbnV0ZShJbnRlZ2VyIG1pbnV0ZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5taW51dGUsIG1pbnV0ZSkpIHsKLQkJCXRoaXMubWludXRlID0gbWludXRlOwotCQkJdGhpcy5taW51dGVBZGFwdGVyLnNldFZhbHVlKG1pbnV0ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY01pbnV0ZShJbnRlZ2VyIGFzdE1pbnV0ZSkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMubWludXRlOwotCQl0aGlzLm1pbnV0ZSA9IGFzdE1pbnV0ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1JTlVURV9QUk9QRVJUWSwgb2xkLCBhc3RNaW51dGUpOwotCX0KLQotCXByaXZhdGUgSW50ZWdlciBidWlsZE1pbnV0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5taW51dGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWludXRlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5taW51dGVUZXh0UmFuZ2U7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0UmFuZ2UgYnVpbGRNaW51dGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm1pbnV0ZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKiogc2Vjb25kCi0JcHVibGljIEludGVnZXIgZ2V0U2Vjb25kKCkgewotCQlyZXR1cm4gdGhpcy5zZWNvbmQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2Vjb25kKEludGVnZXIgbmV3U2Vjb25kKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnNlY29uZCwgbmV3U2Vjb25kKSkgewotCQkJdGhpcy5zZWNvbmQgPSBuZXdTZWNvbmQ7Ci0JCQl0aGlzLnNlY29uZEFkYXB0ZXIuc2V0VmFsdWUobmV3U2Vjb25kKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jU2Vjb25kKEludGVnZXIgYXN0U2Vjb25kKSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5zZWNvbmQ7Ci0JCXRoaXMuc2Vjb25kID0gYXN0U2Vjb25kOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VDT05EX1BST1BFUlRZLCBvbGQsIGFzdFNlY29uZCk7Ci0JfQotCi0JcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkU2Vjb25kKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnNlY29uZEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTZWNvbmRUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnNlY29uZFRleHRSYW5nZTsKLQl9Ci0KLQlwcml2YXRlIFRleHRSYW5nZSBidWlsZFNlY29uZFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMuc2Vjb25kRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBtaWxsaXNlY29uZAotCXB1YmxpYyBJbnRlZ2VyIGdldE1pbGxpc2Vjb25kKCkgewotCQlyZXR1cm4gdGhpcy5taWxsaXNlY29uZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNaWxsaXNlY29uZChJbnRlZ2VyIG1pbGxpc2Vjb25kKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLm1pbGxpc2Vjb25kLCBtaWxsaXNlY29uZCkpIHsKLQkJCXRoaXMubWlsbGlzZWNvbmQgPSBtaWxsaXNlY29uZDsKLQkJCXRoaXMubWlsbGlzZWNvbmRBZGFwdGVyLnNldFZhbHVlKG1pbGxpc2Vjb25kKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jTWlsbGlzZWNvbmQoSW50ZWdlciBhc3RNaWxsaXNlY29uZCkgewotCQlJbnRlZ2VyIG9sZE1pbGxpc2Vjb25kID0gdGhpcy5taWxsaXNlY29uZDsKLQkJdGhpcy5taWxsaXNlY29uZCA9IGFzdE1pbGxpc2Vjb25kOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTUlMTElTRUNPTkRfUFJPUEVSVFksIG9sZE1pbGxpc2Vjb25kLCBhc3RNaWxsaXNlY29uZCk7Ci0JfQotCi0JcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkTWlsbGlzZWNvbmQoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubWlsbGlzZWNvbmRBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWlsbGlzZWNvbmRUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLm1pbGxpc2Vjb25kVGV4dFJhbmdlOwotCX0KLQotCXByaXZhdGUgVGV4dFJhbmdlIGJ1aWxkTWlsbGlzZWNvbmRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm1pbGxpc2Vjb25kRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRIb3VyQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPihkYWEsIEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZX19IT1VSLCBOdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZE1pbnV0ZUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oZGFhLCBFY2xpcHNlTGluay5USU1FX09GX0RBWV9fTUlOVVRFLCBOdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZFNlY29uZEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oZGFhLCBFY2xpcHNlTGluay5USU1FX09GX0RBWV9fU0VDT05ELCBOdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZE1pbGxpc2Vjb25kQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPihkYWEsIEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZX19NSUxMSVNFQ09ORCwgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE5YzNjMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UcmFuc2Zvcm1hdGlvbjwvY29kZT4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gRkVUQ0hfQURBUFRFUiA9IGJ1aWxkRmV0Y2hBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBmZXRjaEFkYXB0ZXI7Ci0JcHJpdmF0ZSBGZXRjaFR5cGUgZmV0Y2g7Ci0JcHJpdmF0ZSBUZXh0UmFuZ2UgZmV0Y2hUZXh0UmFuZ2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBPUFRJT05BTF9BREFQVEVSID0gYnVpbGRPcHRpb25hbEFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBvcHRpb25hbEFkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIG9wdGlvbmFsOwotCXByaXZhdGUgVGV4dFJhbmdlIG9wdGlvbmFsVGV4dFJhbmdlOwotCi0KLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMuZmV0Y2hBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihlbGVtZW50LCBGRVRDSF9BREFQVEVSKTsKLQkJdGhpcy5vcHRpb25hbEFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihlbGVtZW50LCBPUFRJT05BTF9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5mZXRjaCA9IHRoaXMuYnVpbGRGZXRjaChhc3RSb290KTsKLQkJdGhpcy5mZXRjaFRleHRSYW5nZSA9IHRoaXMuYnVpbGRGZXRjaFRleHRSYW5nZShhc3RSb290KTsKLQotCQl0aGlzLm9wdGlvbmFsID0gdGhpcy5idWlsZE9wdGlvbmFsKGFzdFJvb3QpOwotCQl0aGlzLm9wdGlvbmFsVGV4dFJhbmdlID0gdGhpcy5idWlsZE9wdGlvbmFsVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNGZXRjaCh0aGlzLmJ1aWxkRmV0Y2goYXN0Um9vdCkpOwotCQl0aGlzLmZldGNoVGV4dFJhbmdlID0gdGhpcy5idWlsZEZldGNoVGV4dFJhbmdlKGFzdFJvb3QpOwotCi0JCXRoaXMuc3luY09wdGlvbmFsKHRoaXMuYnVpbGRPcHRpb25hbChhc3RSb290KSk7Ci0JCXRoaXMub3B0aW9uYWxUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkT3B0aW9uYWxUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLmZldGNoID09IG51bGwpICYmCi0JCQkJKHRoaXMub3B0aW9uYWwgPT0gbnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5mZXRjaCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBmZXRjaAotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLmZldGNoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBmZXRjaCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5mZXRjaCwgZmV0Y2gpKSB7Ci0JCQl0aGlzLmZldGNoID0gZmV0Y2g7Ci0JCQl0aGlzLmZldGNoQWRhcHRlci5zZXRWYWx1ZShGZXRjaFR5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKGZldGNoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0ZldGNoKEZldGNoVHlwZSBhc3RGZXRjaCkgewotCQlGZXRjaFR5cGUgb2xkID0gdGhpcy5mZXRjaDsKLQkJdGhpcy5mZXRjaCA9IGFzdEZldGNoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkVUQ0hfUFJPUEVSVFksIG9sZCwgYXN0RmV0Y2gpOwotCX0KLQotCXByaXZhdGUgRmV0Y2hUeXBlIGJ1aWxkRmV0Y2goQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIEZldGNoVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmZldGNoQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRGZXRjaFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZmV0Y2hUZXh0UmFuZ2U7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0UmFuZ2UgYnVpbGRGZXRjaFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKEZFVENIX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIG9wdGlvbmFsCi0JcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbmFsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMub3B0aW9uYWwsIG9wdGlvbmFsKSkgewotCQkJdGhpcy5vcHRpb25hbCA9IG9wdGlvbmFsOwotCQkJdGhpcy5vcHRpb25hbEFkYXB0ZXIuc2V0VmFsdWUob3B0aW9uYWwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNPcHRpb25hbChCb29sZWFuIGFzdE9wdGlvbmFsKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5vcHRpb25hbDsKLQkJdGhpcy5vcHRpb25hbCA9IGFzdE9wdGlvbmFsOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT1BUSU9OQUxfUFJPUEVSVFksIG9sZCwgYXN0T3B0aW9uYWwpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZE9wdGlvbmFsKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbmFsQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE9wdGlvbmFsVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25hbFRleHRSYW5nZTsKLQl9Ci0KLQlwcml2YXRlIFRleHRSYW5nZSBidWlsZE9wdGlvbmFsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoT1BUSU9OQUxfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkT3B0aW9uYWxBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OX19PUFRJT05BTCwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEZldGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTl9fRkVUQ0gpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWVhNzgyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIDxjb2RlPjx1bD4KLSAqIDxsaT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5SZWFkVHJhbnNmb3JtZXIKLSAqIDxsaT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Xcml0ZVRyYW5zZm9ybWVyCi0gKiA8L3VsPjwvY29kZT4KLSAqLwotYWJzdHJhY3QgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi17Ci0JZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB0cmFuc2Zvcm1lckNsYXNzRGVjbGFyYXRpb25BZGFwdGVyOwotCWZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHRyYW5zZm9ybWVyQ2xhc3NBZGFwdGVyOwotCVN0cmluZyB0cmFuc2Zvcm1lckNsYXNzOwotCVRleHRSYW5nZSB0cmFuc2Zvcm1lckNsYXNzVGV4dFJhbmdlOwotCi0JZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBtZXRob2REZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbWV0aG9kQWRhcHRlcjsKLQlTdHJpbmcgbWV0aG9kOwotCVRleHRSYW5nZSBtZXRob2RUZXh0UmFuZ2U7Ci0KLQotCVNvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgZGFhKTsKLQkJdGhpcy50cmFuc2Zvcm1lckNsYXNzRGVjbGFyYXRpb25BZGFwdGVyID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgdGhpcy5nZXRUcmFuc2Zvcm1lckNsYXNzRWxlbWVudE5hbWUoKSwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCXRoaXMudHJhbnNmb3JtZXJDbGFzc0FkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGVsZW1lbnQsIHRoaXMudHJhbnNmb3JtZXJDbGFzc0RlY2xhcmF0aW9uQWRhcHRlcik7Ci0KLQkJdGhpcy5tZXRob2REZWNsYXJhdGlvbkFkYXB0ZXIgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsIHRoaXMuZ2V0TWV0aG9kRWxlbWVudE5hbWUoKSk7Ci0JCXRoaXMubWV0aG9kQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZWxlbWVudCwgdGhpcy5tZXRob2REZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy50cmFuc2Zvcm1lckNsYXNzID0gdGhpcy5idWlsZFRyYW5zZm9ybWVyQ2xhc3MoYXN0Um9vdCk7Ci0JCXRoaXMudHJhbnNmb3JtZXJDbGFzc1RleHRSYW5nZSA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1lckNsYXNzVGV4dFJhbmdlKGFzdFJvb3QpOwotCi0JCXRoaXMubWV0aG9kID0gdGhpcy5idWlsZE1ldGhvZChhc3RSb290KTsKLQkJdGhpcy5tZXRob2RUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkTWV0aG9kVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNUcmFuc2Zvcm1lckNsYXNzKHRoaXMuYnVpbGRUcmFuc2Zvcm1lckNsYXNzKGFzdFJvb3QpKTsKLQkJdGhpcy50cmFuc2Zvcm1lckNsYXNzVGV4dFJhbmdlID0gdGhpcy5idWlsZFRyYW5zZm9ybWVyQ2xhc3NUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0KLQkJdGhpcy5zeW5jTWV0aG9kKHRoaXMuYnVpbGRNZXRob2QoYXN0Um9vdCkpOwotCQl0aGlzLm1ldGhvZFRleHRSYW5nZSA9IHRoaXMuYnVpbGRNZXRob2RUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLnRyYW5zZm9ybWVyQ2xhc3MgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5tZXRob2QgPT0gbnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy50cmFuc2Zvcm1lckNsYXNzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVHJhbnNmb3JtZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHRyYW5zZm9ybWVyIGNsYXNzCi0JcHVibGljIFN0cmluZyBnZXRUcmFuc2Zvcm1lckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lckNsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRyYW5zZm9ybWVyQ2xhc3MoU3RyaW5nIHRyYW5zZm9ybWVyQ2xhc3MpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudHJhbnNmb3JtZXJDbGFzcywgdHJhbnNmb3JtZXJDbGFzcykpIHsKLQkJCXRoaXMudHJhbnNmb3JtZXJDbGFzcyA9IHRyYW5zZm9ybWVyQ2xhc3M7Ci0JCQl0aGlzLnRyYW5zZm9ybWVyQ2xhc3NBZGFwdGVyLnNldFZhbHVlKHRyYW5zZm9ybWVyQ2xhc3MpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNUcmFuc2Zvcm1lckNsYXNzKFN0cmluZyBhc3RUcmFuc2Zvcm1lckNsYXNzKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnRyYW5zZm9ybWVyQ2xhc3M7Ci0JCXRoaXMudHJhbnNmb3JtZXJDbGFzcyA9IGFzdFRyYW5zZm9ybWVyQ2xhc3M7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUUkFOU0ZPUk1FUl9DTEFTU19QUk9QRVJUWSwgb2xkLCBhc3RUcmFuc2Zvcm1lckNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFRyYW5zZm9ybWVyQ2xhc3MoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXJDbGFzc0FkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUcmFuc2Zvcm1lckNsYXNzVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lckNsYXNzVGV4dFJhbmdlOwotCX0KLQotCXByaXZhdGUgVGV4dFJhbmdlIGJ1aWxkVHJhbnNmb3JtZXJDbGFzc1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMudHJhbnNmb3JtZXJDbGFzc0RlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JYWJzdHJhY3QgU3RyaW5nIGdldFRyYW5zZm9ybWVyQ2xhc3NFbGVtZW50TmFtZSgpOwotCi0JLy8gKioqKiogbWV0aG9kCi0JcHVibGljIFN0cmluZyBnZXRNZXRob2QoKSB7Ci0JCXJldHVybiB0aGlzLm1ldGhvZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2QoU3RyaW5nIG1ldGhvZCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5tZXRob2QsIG1ldGhvZCkpIHsKLQkJCXRoaXMubWV0aG9kID0gbWV0aG9kOwotCQkJdGhpcy5tZXRob2RBZGFwdGVyLnNldFZhbHVlKG1ldGhvZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY01ldGhvZChTdHJpbmcgYXN0TWV0aG9kKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm1ldGhvZDsKLQkJdGhpcy5tZXRob2QgPSBhc3RNZXRob2Q7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNRVRIT0RfUFJPUEVSVFksIG9sZCwgYXN0TWV0aG9kKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE1ldGhvZChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5tZXRob2RBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWV0aG9kVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5tZXRob2RUZXh0UmFuZ2U7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0UmFuZ2UgYnVpbGRNZXRob2RUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm1ldGhvZERlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JYWJzdHJhY3QgU3RyaW5nIGdldE1ldGhvZEVsZW1lbnROYW1lKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MDBhZDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHlwZUNvbnZlcnRlcjwvY29kZT4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUVjbGlwc2VMaW5rQmFzZVR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgQ09OVEFJTkVSX0RFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSUyk7Ci0KLQlwdWJsaWMgc3RhdGljIFNvdXJjZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gYnVpbGRTb3VyY2VUeXBlQ29udmVydGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IGJ1aWxkVHlwZUNvbnZlcnRlckRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW5kZXgpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gYnVpbGRUeXBlQ29udmVydGVyQW5ub3RhdGlvbkFkYXB0ZXIoZWxlbWVudCwgaWRhYSk7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbigKLQkJCXBhcmVudCwKLQkJCWVsZW1lbnQsCi0JCQlpZGFhLAotCQkJaWFhKTsKLQl9Ci0KLQlwcml2YXRlIFNvdXJjZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24oCi0JCQlKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwKLQkJCUFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwKLQkJCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSwKLQkJCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNvdXJjZU5hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVJfX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNvdXJjZUJhc2VUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0RGF0YVR5cGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldE9iamVjdFR5cGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBidWlsZFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uQWRhcHRlcihBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJcmV0dXJuIG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIGlkYWEpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkVHlwZUNvbnZlcnRlckRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4KSB7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSAKLQkJCW5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCURFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwKLQkJCQlDT05UQUlORVJfREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLAotCQkJCWluZGV4LAotCQkJCUFOTk9UQVRJT05fTkFNRSk7Ci0JCXJldHVybiBpZGFhOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU4ZWUxNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlZhcmlhYmxlT25lVG9PbmUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gbm90aGluZyB0byB1cGRhdGUKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk2MjY1Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLldyaXRlVHJhbnNmb3JtZXI8L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgZmluYWwgRWxlbWVudEFubm90YXRpb25BZGFwdGVyIGNvbHVtbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbjsKLQlwcml2YXRlIGZpbmFsIENvbHVtbkFubm90YXRpb24gbnVsbENvbHVtbjsKLQlwcml2YXRlIFRleHRSYW5nZSBjb2x1bW5UZXh0UmFuZ2U7Ci0KLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLmNvbHVtbkFkYXB0ZXIgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgYnVpbGRDb2x1bW5Bbm5vdGF0aW9uQWRhcHRlcih0aGlzLmRhYSkpOwotCQl0aGlzLm51bGxDb2x1bW4gPSB0aGlzLmJ1aWxkTnVsbENvbHVtbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQlpZiAodGhpcy5jb2x1bW5BZGFwdGVyLmdldEFubm90YXRpb24oYXN0Um9vdCkgIT0gbnVsbCkgewotCQkJdGhpcy5jb2x1bW4gPSBjcmVhdGVDb2x1bW4odGhpcywgdGhpcy5hbm5vdGF0ZWRFbGVtZW50LCB0aGlzLmRhYSk7Ci0JCQl0aGlzLmNvbHVtbi5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl9Ci0JCXRoaXMuY29sdW1uVGV4dFJhbmdlID0gdGhpcy5idWlsZENvbHVtblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNDb2x1bW4oYXN0Um9vdCk7Ci0JCXRoaXMuY29sdW1uVGV4dFJhbmdlID0gdGhpcy5idWlsZENvbHVtblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMuY29sdW1uID09IG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTb3VyY2VUcmFuc2Zvcm1lckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldFRyYW5zZm9ybWVyQ2xhc3NFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSX19UUkFOU0ZPUk1FUl9DTEFTUzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0TWV0aG9kRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUl9fTUVUSE9EOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBjb2x1bW4KLQlwdWJsaWMgQ29sdW1uQW5ub3RhdGlvbiBnZXRDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbjsKLQl9Ci0KLQlwdWJsaWMgQ29sdW1uQW5ub3RhdGlvbiBnZXROb25OdWxsQ29sdW1uKCkgewotCQlyZXR1cm4gKHRoaXMuY29sdW1uICE9IG51bGwpID8gdGhpcy5jb2x1bW4gOiB0aGlzLm51bGxDb2x1bW47Ci0JfQotCi0JcHVibGljIENvbHVtbkFubm90YXRpb24gYWRkQ29sdW1uKCkgewotCQlpZiAodGhpcy5jb2x1bW4gIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiJ2NvbHVtbicgZWxlbWVudCBhbHJlYWR5IGV4aXN0czogIiArIHRoaXMuY29sdW1uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuY29sdW1uID0gY3JlYXRlQ29sdW1uKHRoaXMsIHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgdGhpcy5kYWEpOwotCQl0aGlzLmNvbHVtbi5uZXdBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmNvbHVtbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW4oKSB7Ci0JCWlmICh0aGlzLmNvbHVtbiA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCInY29sdW1uJyBlbGVtZW50IGRvZXMgbm90IGV4aXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlDb2x1bW5Bbm5vdGF0aW9uIG9sZCA9IHRoaXMuY29sdW1uOwotCQl0aGlzLmNvbHVtbiA9IG51bGw7Ci0JCW9sZC5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNDb2x1bW4oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKHRoaXMuY29sdW1uQWRhcHRlci5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpID09IG51bGwpIHsKLQkJCXRoaXMuc3luY0NvbHVtbl8obnVsbCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5jb2x1bW4gPT0gbnVsbCkgewotCQkJCUNvbHVtbkFubm90YXRpb24gY29sID0gY3JlYXRlQ29sdW1uKHRoaXMsIHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgdGhpcy5kYWEpOwotCQkJCWNvbC5pbml0aWFsaXplKGFzdFJvb3QpOwotCQkJCXRoaXMuc3luY0NvbHVtbl8oY29sKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5jb2x1bW4uc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNDb2x1bW5fKENvbHVtbkFubm90YXRpb24gYXN0Q29sdW1uKSB7Ci0JCUNvbHVtbkFubm90YXRpb24gb2xkID0gdGhpcy5jb2x1bW47Ci0JCXRoaXMuY29sdW1uID0gYXN0Q29sdW1uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09MVU1OX1BST1BFUlRZLCBvbGQsIGFzdENvbHVtbik7Ci0JfQotCi0JcHJpdmF0ZSBDb2x1bW5Bbm5vdGF0aW9uIGJ1aWxkTnVsbENvbHVtbigpIHsKLQkJcmV0dXJuIG5ldyBOdWxsRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQ29sdW1uQW5ub3RhdGlvbih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvbHVtblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uVGV4dFJhbmdlOwotCX0KLQotCXByaXZhdGUgVGV4dFJhbmdlIGJ1aWxkQ29sdW1uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmICh0aGlzLmNvbHVtbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCQl9Ci0JCXJldHVybiB0aGlzLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZENvbHVtbkFubm90YXRpb25BZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgd3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcih3cml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkFkYXB0ZXIsIEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSX19DT0xVTU4sIEpQQS5DT0xVTU4pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbHVtbkFubm90YXRpb24gY3JlYXRlQ29sdW1uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgd3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXJldHVybiBuZXcgU291cmNlQ29sdW1uQW5ub3RhdGlvbihwYXJlbnQsIGVsZW1lbnQsIGJ1aWxkQ29sdW1uQW5ub3RhdGlvbkFkYXB0ZXIod3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25BZGFwdGVyKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZDZiZTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL0VjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5BYnN0cmFjdFhtbFJlc291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbFJlc291cmNlUHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0WG1sUmVzb3VyY2VQcm92aWRlcgotCWltcGxlbWVudHMgT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcwotewotCS8qKgotCSAqIChDb252ZW5pZW5jZSBtZXRob2QpIFJldHVybnMgYW4gRWNsaXBzZUxpbmsgT1JNIHJlc291cmNlIG1vZGVsIHByb3ZpZGVyIGZvciAKLQkgKiB0aGUgZ2l2ZW4gZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VQcm92aWRlciBnZXRYbWxSZXNvdXJjZVByb3ZpZGVyKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGdldFhtbFJlc291cmNlUHJvdmlkZXJfKGZpbGUuZ2V0UHJvamVjdCgpLCBmaWxlLmdldEZ1bGxQYXRoKCkpOwotCX0KLQkKLQkvKioKLQkgKiAoQ29udmVuaWVuY2UgbWV0aG9kKSBSZXR1cm5zIGFuIEVjbGlwc2VMaW5rIE9STSByZXNvdXJjZSBtb2RlbCBwcm92aWRlciBmb3IKLQkgKiB0aGUgZ2l2ZW4gcHJvamVjdCBpbiB0aGUgc3BlY2lmaWVkIHJ1bnRpbWUgbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VQcm92aWRlciBnZXRYbWxSZXNvdXJjZVByb3ZpZGVyKElQcm9qZWN0IHByb2plY3QsIElQYXRoIHJ1bnRpbWVQYXRoKSB7Ci0JCXJldHVybiBnZXRYbWxSZXNvdXJjZVByb3ZpZGVyXyhwcm9qZWN0LCBydW50aW1lUGF0aCk7Ci0JfQotCQotCS8qKgotCSAqIChDb252ZW5pZW5jZSBtZXRob2QpIFJldHVybnMgYW4gRWNsaXBzZUxpbmsgT1JNIHJlc291cmNlIG1vZGVsIHByb3ZpZGVyIGZvciAKLQkgKiB0aGUgZ2l2ZW4gcHJvamVjdCBpbiB0aGUgZGVmYXVsdCBydW50aW1lIGxvY2F0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua09ybVhtbFJlc291cmNlUHJvdmlkZXIgZ2V0RGVmYXVsdFhtbFJlc291cmNlUHJvdmlkZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gZ2V0WG1sUmVzb3VyY2VQcm92aWRlcihwcm9qZWN0LCBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX1JVTlRJTUVfUEFUSCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VQcm92aWRlciBnZXRYbWxSZXNvdXJjZVByb3ZpZGVyXyhJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBmdWxsUGF0aCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VQcm92aWRlcihwcm9qZWN0LCBmdWxsUGF0aCk7Ci0JfQotCQotCQotCXB1YmxpYyBFY2xpcHNlTGlua09ybVhtbFJlc291cmNlUHJvdmlkZXIoSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzKHByb2plY3QsIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRIKTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VQcm92aWRlcihJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBmaWxlUGF0aCkgewotCQlzdXBlcihwcm9qZWN0LCBmaWxlUGF0aCwgSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVSb290KE9iamVjdCBjb25maWcpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSAoSURhdGFNb2RlbCkgY29uZmlnOwotCQlYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRW50aXR5TWFwcGluZ3MoKTsKLQkJZW50aXR5TWFwcGluZ3Muc2V0VmVyc2lvbihkYXRhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoVkVSU0lPTikpOwotCQlnZXRSZXNvdXJjZUNvbnRlbnRzKCkuYWRkKGVudGl0eU1hcHBpbmdzKTsKLQkJCi0JCVN0cmluZyBkZWZhdWx0QWNjZXNzID0gKFN0cmluZykgZGF0YU1vZGVsLmdldFByb3BlcnR5KERFRkFVTFRfQUNDRVNTKTsgCi0JCWlmIChkZWZhdWx0QWNjZXNzICE9IG51bGwpIHsKLQkJCVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHB1TWV0YWRhdGEgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCQllbnRpdHlNYXBwaW5ncy5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShwdU1ldGFkYXRhKTsKLQkJCVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHB1RGVmYXVsdHMgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCQlwdU1ldGFkYXRhLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKHB1RGVmYXVsdHMpOwotCQkJcHVEZWZhdWx0cy5zZXRBY2Nlc3MoZGVmYXVsdEFjY2Vzcyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC93ZWF2ZS9TdGF0aWNXZWF2ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvd2VhdmUvU3RhdGljV2VhdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRmOTUzMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC93ZWF2ZS9TdGF0aWNXZWF2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwud2VhdmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5nZW4uQWJzdHJhY3RKcHRHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqICBTdGF0aWNXZWF2ZQotICogIFJ1bm5pbmcgU3RhdGljIFdlYXZpbmcgZnJvbSBQcm9qZWN0J3MgY2xhc3NwYXRoCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0aWNXZWF2ZSBleHRlbmRzIEFic3RyYWN0SnB0R2VuZXJhdG9yCi17Ci0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgTEFVTkNIX0NPTkZJR19OQU1FID0gIlN0YXRpYyBXZWF2aW5nIFJ1biBDb25maWciOyAgIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHVibGljIFN0cmluZyBXRUFWSU5HX1BBQ0tBR0VfTkFNRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS50b29scy53ZWF2aW5nLmpwYSI7ICAgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIFdFQVZJTkdfQ0xBU1MgPSBXRUFWSU5HX1BBQ0tBR0VfTkFNRSArICIuU3RhdGljV2VhdmUiOwkgIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIHNvdXJjZTsKLQlwcml2YXRlIFN0cmluZyB0YXJnZXQ7Ci0JcHJpdmF0ZSBTdHJpbmcgbG9nbGV2ZWw7Ci0JcHJpdmF0ZSBTdHJpbmcgcGVyc2lzdGVuY2VpbmZvOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG1haW5UeXBlOwotCQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyB2b2lkIHdlYXZlKAotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCAKLQkJCVN0cmluZyBzb3VyY2UsIAotCQkJU3RyaW5nIHRhcmdldCwgCi0JCQlTdHJpbmcgbG9nbGV2ZWwsIAotCQkJU3RyaW5nIHBlcnNpc3RlbmNlaW5mbywgCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQlpZihqYXZhUHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImphdmFQcm9qZWN0IGlzIG51bGwiKTsgICAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCW5ldyBTdGF0aWNXZWF2ZShqYXZhUHJvamVjdCwKLQkJCXNvdXJjZSwgCi0JCQl0YXJnZXQsCi0JCQlsb2dsZXZlbCwgCi0JCQlwZXJzaXN0ZW5jZWluZm8pLmdlbmVyYXRlKG1vbml0b3IpOwotCX0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgU3RhdGljV2VhdmUoCi0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QsIAotCQkJU3RyaW5nIHNvdXJjZSwgCi0JCQlTdHJpbmcgdGFyZ2V0LCAKLQkJCVN0cmluZyBsb2dsZXZlbCwgCi0JCQlTdHJpbmcgcGVyc2lzdGVuY2VpbmZvKSB7Ci0JCXN1cGVyKGphdmFQcm9qZWN0KTsKLQkJCi0JCXRoaXMuc291cmNlID0gc291cmNlOwotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQkJdGhpcy5sb2dsZXZlbCA9IGxvZ2xldmVsOwotCQl0aGlzLnBlcnNpc3RlbmNlaW5mbyA9IHBlcnNpc3RlbmNlaW5mbzsKLQotCQl0aGlzLm1haW5UeXBlID0gV0VBVklOR19DTEFTUzsKLQotCQl0aGlzLnNldERlYnVnKGZhbHNlKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYWluVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMubWFpblR5cGU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGF1bmNoQ29uZmlnTmFtZSgpIHsKLQkJcmV0dXJuIExBVU5DSF9DT05GSUdfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzcGVjaWZ5SlJFKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQkJLy8gMzcwODk1IC0gU3RhdGljIHdlYXZpbmcgcmVzdWx0cyBpbiBpbmZpbml0ZSBidWlsZGVyIGxvb3Agd2hlbiBlbmFibGVkCi0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwcmVHZW5lcmF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gbm90aGluZyB0byBkbyB5ZXQuLi4KLQl9Ci0KLQkvLyAqKioqKioqKioqIExhdW5jaCBDb25maWd1cmF0aW9uIFNldHVwICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gYnVpbGRDbGFzc3BhdGgoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUxpc3Q8U3RyaW5nPiBjbGFzc3BhdGggPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJLy8gRGVmYXVsdCBQcm9qZWN0IGNsYXNzcGF0aAotCQljbGFzc3BhdGguYWRkKHRoaXMuZ2V0RGVmYXVsdFByb2plY3RDbGFzc3BhdGhFbnRyeSgpLmdldE1lbWVudG8oKSk7Ci0JCS8vIFN5c3RlbSBMaWJyYXJ5ICAKLQkJY2xhc3NwYXRoLmFkZCh0aGlzLmdldFN5c3RlbUxpYnJhcnlDbGFzc3BhdGhFbnRyeSgpLmdldE1lbWVudG8oKSk7Ci0JCS8vIENvbnRhaW5lcnMgY2xhc3NwYXRoCi0JCWZvcihJUnVudGltZUNsYXNzcGF0aEVudHJ5IGNvbnRhaW5lckNsYXNzcGF0aEVudHJ5OiB0aGlzLmdldENvbnRhaW5lcnNDbGFzc3BhdGhFbnRyaWVzKCkpIHsKLQkJCWNsYXNzcGF0aC5hZGQoY29udGFpbmVyQ2xhc3NwYXRoRW50cnkuZ2V0TWVtZW50bygpKTsKLQkJfQotCQlyZXR1cm4gY2xhc3NwYXRoOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzcGVjaWZ5UHJvZ3JhbUFyZ3VtZW50cygpIHsKLQkJU3RyaW5nQnVmZmVyIHByb2dyYW1Bcmd1bWVudHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJaWYoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLnNvdXJjZSkpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTb3VyY2UgZGlyZWN0b3J5IGNhbm5vdCBiZSBlbXB0eSIpOwkgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZihTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMudGFyZ2V0KSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRhcmdldCBkaXJlY3RvcnkgY2Fubm90IGJlIGVtcHR5Iik7CSAgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmxvZ2xldmVsKSkgewotCQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoIi1sb2dsZXZlbCAiKTsJICAvLyROT04tTkxTLTEkCi0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCh0aGlzLmxvZ2xldmVsKTsKLQkJfQotCi0JCWlmKCAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5wZXJzaXN0ZW5jZWluZm8pKSB7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC1wZXJzaXN0ZW5jZWluZm8gIik7CSAgLy8kTk9OLU5MUy0xJAotCQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoU3RyaW5nVG9vbHMucXVvdGUodGhpcy5wZXJzaXN0ZW5jZWluZm8pKTsKLQkJfQotCi0JCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCcgJyk7Ci0JCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKFN0cmluZ1Rvb2xzLnF1b3RlKHRoaXMuc291cmNlKSk7Ci0KLQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoJyAnKTsKLQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoU3RyaW5nVG9vbHMucXVvdGUodGhpcy50YXJnZXQpKTsKLQotCQl0aGlzLmxhdW5jaENvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPR1JBTV9BUkdVTUVOVFMsIHByb2dyYW1Bcmd1bWVudHMudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCXByaXZhdGUgTGlzdDxJUnVudGltZUNsYXNzcGF0aEVudHJ5PiBnZXRDb250YWluZXJzQ2xhc3NwYXRoRW50cmllcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0PElSdW50aW1lQ2xhc3NwYXRoRW50cnk+IGNsYXNzcGF0aEVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lQ2xhc3NwYXRoRW50cnk+KCk7Ci0JCWZvcihJQ2xhc3NwYXRoRW50cnkgY2xhc3NwYXRoRW50cnk6IHRoaXMuamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCkpIHsKLQkJCWlmKGNsYXNzcGF0aEVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSKSB7Ci0JCQkJSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIoY2xhc3NwYXRoRW50cnkuZ2V0UGF0aCgpLCB0aGlzLmphdmFQcm9qZWN0KTsKLQkJCQlpZihjb250YWluZXIgIT0gbnVsbCAmJiBjb250YWluZXIuZ2V0S2luZCgpID09IElDbGFzc3BhdGhDb250YWluZXIuS19TWVNURU0pIHsKLQkJCQkJY2xhc3NwYXRoRW50cmllcy5hZGQoIAotCQkJCQkJSmF2YVJ1bnRpbWUubmV3UnVudGltZUNvbnRhaW5lckNsYXNzcGF0aEVudHJ5KAotCQkJCQkJCWNvbnRhaW5lci5nZXRQYXRoKCksIAotCQkJCQkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkuQk9PVFNUUkFQX0NMQVNTRVMsIAotCQkJCQkJCXRoaXMuamF2YVByb2plY3QpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNsYXNzcGF0aEVudHJpZXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2pwcWwvc3BpL0VjbGlwc2VMaW5rRHluYW1pY0VtYmVkZGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2pwcWwvc3BpL0VjbGlwc2VMaW5rRHluYW1pY0VtYmVkZGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlkM2Y5Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9qcHFsL3NwaS9FY2xpcHNlTGlua0R5bmFtaWNFbWJlZGRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLgotICogVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5qcHFsLnNwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLnNwaS5KcGFFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLnNwaS5KcGFNYW5hZ2VkVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSU1hbmFnZWRUeXBlVmlzaXRvcjsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGFuIHtAbGluayBJRW1iZWRkYWJsZX0gdGhhdCByZXByZXNlbnRzIGEgZHluYW1pYyBlbWJlZGRhYmxlLgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZAotICogZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UKLSAqIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMKLSAqIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICogQHZlcnNpb24gMi40Ci0gKiBAc2luY2UgMi40Ci0gKiBAYXV0aG9yIFBhc2NhbCBGaWxpb24KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRHluYW1pY0VtYmVkZGFibGUgZXh0ZW5kcyBFY2xpcHNlTGlua0R5bmFtaWNNYW5hZ2VkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBJRW1iZWRkYWJsZSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rRHluYW1pY0VtYmVkZGFibGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHByb3ZpZGVyIFRoZSBwcm92aWRlciBvZiBKUEEgbWFuYWdlZCB0eXBlcwotCSAqIEBwYXJhbSBkZWxlZ2F0ZSBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSU1hbmFnZWRUeXBlfQotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0R5bmFtaWNFbWJlZGRhYmxlKEpwYU1hbmFnZWRUeXBlUHJvdmlkZXIgcHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnBhRW1iZWRkYWJsZSBkZWxlZ2F0ZSkgewotCi0JCXN1cGVyKHByb3ZpZGVyLCBkZWxlZ2F0ZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2VwdChJTWFuYWdlZFR5cGVWaXNpdG9yIHZpc2l0b3IpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUVtYmVkZGFibGUgZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiAoSnBhRW1iZWRkYWJsZSkgc3VwZXIuZ2V0RGVsZWdhdGUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvanBxbC9zcGkvRWNsaXBzZUxpbmtEeW5hbWljRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9qcHFsL3NwaS9FY2xpcHNlTGlua0R5bmFtaWNFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEyMWU4ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9qcHFsL3NwaS9FY2xpcHNlTGlua0R5bmFtaWNFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uCi0gKiBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmpwcWwuc3BpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLnNwaS5KcGFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuc3BpLkpwYU1hbmFnZWRUeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklNYW5hZ2VkVHlwZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklRdWVyeTsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGFuIHtAbGluayBJRW50aXR5fSB0aGF0IHJlcHJlc2VudHMgYSBkeW5hbWljIGVudGl0eS4KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQKLSAqIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlCi0gKiB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzCi0gKiBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMgotICogQGF1dGhvciBQYXNjYWwgRmlsaW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0R5bmFtaWNFbnRpdHkgZXh0ZW5kcyBFY2xpcHNlTGlua0R5bmFtaWNNYW5hZ2VkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIElFbnRpdHkgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua0R5bmFtaWNFbWJlZGRhYmxlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwcm92aWRlciBUaGUgcHJvdmlkZXIgb2YgSlBBIG1hbmFnZWQgdHlwZXMKLQkgKiBAcGFyYW0gZGVsZWdhdGUgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElNYW5hZ2VkVHlwZX0KLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtEeW5hbWljRW50aXR5KEpwYU1hbmFnZWRUeXBlUHJvdmlkZXIgcHJvdmlkZXIsIEpwYUVudGl0eSBkZWxlZ2F0ZSkgewotCQlzdXBlcihwcm92aWRlciwgZGVsZWdhdGUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2NlcHQoSU1hbmFnZWRUeXBlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFFbnRpdHkgZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiAoSnBhRW50aXR5KSBzdXBlci5nZXREZWxlZ2F0ZSgpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXREZWxlZ2F0ZSgpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElRdWVyeSBnZXROYW1lZFF1ZXJ5KFN0cmluZyBxdWVyeU5hbWUpIHsKLQkJcmV0dXJuIGdldERlbGVnYXRlKCkuZ2V0TmFtZWRRdWVyeShxdWVyeU5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9qcHFsL3NwaS9FY2xpcHNlTGlua0R5bmFtaWNNYW5hZ2VkVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvanBxbC9zcGkvRWNsaXBzZUxpbmtEeW5hbWljTWFuYWdlZFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE2YjIxYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9qcHFsL3NwaS9FY2xpcHNlTGlua0R5bmFtaWNNYW5hZ2VkVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uCi0gKiBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmpwcWwuc3BpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBxbC5zcGkuSnBhTWFuYWdlZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuc3BpLkpwYU1hbmFnZWRUeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklNYW5hZ2VkVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnV0aWwuaXRlcmF0b3IuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC51dGlsLml0ZXJhdG9yLkl0ZXJhYmxlSXRlcmF0b3I7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIGEge0BsaW5rIElNYW5hZ2VkVHlwZX0gdGhhdCBzdXBwb3J0cyBhIGR5bmFtaWMgbWFuYWdlZCB0eXBlLgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZAotICogZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UKLSAqIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMKLSAqIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4yCi0gKiBAYXV0aG9yIFBhc2NhbCBGaWxpb24KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rRHluYW1pY01hbmFnZWRUeXBlIGltcGxlbWVudHMgSU1hbmFnZWRUeXBlIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJTWFuYWdlZFR5cGV9LgotCSAqLwotCXByaXZhdGUgSnBhTWFuYWdlZFR5cGUgZGVsZWdhdGU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIGNvbGxlY3Rpb24gb2Yge0BsaW5rIElNYXBwaW5nIG1hcHBpbmdzfSB0aGF0IHByZXZlbnQgcmVidWlsZGluZyB0aGVtIGV2ZXJ5IHRpbWUgb25lCi0JICogaXMgcmVxdWVzdGVkLgotCSAqLwotCXByaXZhdGUgTWFwPFN0cmluZywgRWNsaXBzZUxpbmtEeW5hbWljTWFwcGluZz4gbWFwcGluZ3M7Ci0KLQkvKioKLQkgKiBUaGUgcHJvdmlkZXIgb2YgSlBBIG1hbmFnZWQgdHlwZXMuCi0JICovCi0JcHJpdmF0ZSBKcGFNYW5hZ2VkVHlwZVByb3ZpZGVyIHByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB7QGxpbmsgSVR5cGV9IHJlcHJlc2VudGluZyB0aGUgbWFuYWdlZCB0eXBlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtEeW5hbWljVHlwZSB0eXBlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua0R5bmFtaWNNYW5hZ2VkVHlwZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIG9mIEpQQSBtYW5hZ2VkIHR5cGVzCi0JICogQHBhcmFtIGRlbGVnYXRlIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJTWFuYWdlZFR5cGV9Ci0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rRHluYW1pY01hbmFnZWRUeXBlKEpwYU1hbmFnZWRUeXBlUHJvdmlkZXIgcHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwYU1hbmFnZWRUeXBlIGRlbGVnYXRlKSB7Ci0KLQkJc3VwZXIoKTsKLQkJdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyOwotCQl0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHtAbGluayBJVHlwZX0gdGhhdCBzdXBwb3J0cyBkeW5hbWljIHR5cGUsIHdoaWNoIG1lYW5zIHRoZSB0eXBlIGNhbm5vdCBiZSBmb3VuZCBpbgotCSAqIHRoZSBwcm9qZWN0IGJ1dCBpcyBvbmx5IGluIG1lbW9yeS4KLQkgKgotCSAqIEByZXR1cm4gQSBuZXcge0BsaW5rIEVjbGlwc2VMaW5rRHluYW1pY1R5cGV9Ci0JICovCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rRHluYW1pY1R5cGUgYnVpbGREeW5hbWljVHlwZSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0R5bmFtaWNUeXBlKAotCQkJZGVsZWdhdGUuZ2V0UHJvdmlkZXIoKS5nZXRUeXBlUmVwb3NpdG9yeSgpLAotCQkJZGVsZWdhdGUuZ2V0TWFuYWdlZFR5cGUoKS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKQotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4dGVybmFsIGZvcm0gdGhhdCBuZWVkcyB0byB3cmFwIHRoZSBnaXZlbiB7QGxpbmsgQXR0cmlidXRlTWFwcGluZ30uIEJ5IGRlZmF1bHQsCi0JICogdGhlIGNhbGwgaXMgZGVsZWdhdGVkIHRvIHtAbGluayBJTWFwcGluZ0J1aWxkZXJ9LgotCSAqCi0JICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdG8gd3JhcCB3aXRoIGEge0BsaW5rIElNYXBwaW5nfQotCSAqIEByZXR1cm4gQSBuZXcgY29uY3JldGUgaW5zdGFuY2Ugb2Yge0BsaW5rIElNYXBwaW5nfQotCSAqLwotCXByb3RlY3RlZCBFY2xpcHNlTGlua0R5bmFtaWNNYXBwaW5nIGJ1aWxkTWFwcGluZyhFY2xpcHNlTGlua01hcHBpbmcgbWFwcGluZykgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rRHluYW1pY01hcHBpbmcodGhpcywgbWFwcGluZyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBleHRlcm5hbCBmb3JtIGZvciBlYWNoIHtAbGluayBBdHRyaWJ1dGVNYXBwaW5nfSBhbmQgc3RvcmVzIHRoZW0gYnkgdXNpbmcgdGhlaXIKLQkgKiBtYXBwaW5nIG5hbWUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBtYXBwaW5ncyBtYXBwZWQgYnkgdGhlaXIgbmFtZQotCSAqLwotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBFY2xpcHNlTGlua0R5bmFtaWNNYXBwaW5nPiBidWlsZE1hcHBpbmdzKCkgewotCi0JCU1hcDxTdHJpbmcsIEVjbGlwc2VMaW5rRHluYW1pY01hcHBpbmc+IG1hcHBpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBFY2xpcHNlTGlua0R5bmFtaWNNYXBwaW5nPigpOwotCi0JCWZvciAoSU1hcHBpbmcgbWFwcGluZyA6IGRlbGVnYXRlLm1hcHBpbmdzKCkpIHsKLQkJCW1hcHBpbmdzLnB1dChtYXBwaW5nLmdldE5hbWUoKSwgYnVpbGRNYXBwaW5nKChFY2xpcHNlTGlua01hcHBpbmcpIG1hcHBpbmcpKTsKLQkJfQotCi0JCXJldHVybiBtYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIGludCBjb21wYXJlVG8oSU1hbmFnZWRUeXBlIG1hbmFnZWRUeXBlKSB7Ci0JCXJldHVybiBkZWxlZ2F0ZS5jb21wYXJlVG8obWFuYWdlZFR5cGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElNYW5hZ2VkVHlwZX0gdGhhdCBpcyB3cmFwcGVkIGJ5IHRoaXMgb25lLgotCSAqCi0JICogQHJldHVybiBUaGUgYWN0dWFsIHtAbGluayBKcGFNYW5hZ2VkVHlwZX0KLQkgKi8KLQlwdWJsaWMgSnBhTWFuYWdlZFR5cGUgZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElNYXBwaW5nIGdldE1hcHBpbmdOYW1lZChTdHJpbmcgbmFtZSkgewotCQlpbml0aWFsaXplTWFwcGluZ3MoKTsKLQkJcmV0dXJuIG1hcHBpbmdzLmdldChuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEpwYU1hbmFnZWRUeXBlUHJvdmlkZXIgZ2V0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBwcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElUeXBlIGdldFR5cGUoKSB7Ci0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXR5cGUgPSBidWlsZER5bmFtaWNUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBtYW5hZ2VkIHR5cGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hcHBpbmdzKCkgewotCQlpZiAobWFwcGluZ3MgPT0gbnVsbCkgewotCQkJbWFwcGluZ3MgPSBidWlsZE1hcHBpbmdzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEl0ZXJhYmxlSXRlcmF0b3I8SU1hcHBpbmc+IG1hcHBpbmdzKCkgewotCQlpbml0aWFsaXplTWFwcGluZ3MoKTsKLQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPElNYXBwaW5nPihtYXBwaW5ncy52YWx1ZXMoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2pwcWwvc3BpL0VjbGlwc2VMaW5rRHluYW1pY01hcHBlZFN1cGVyY2xhc3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2pwcWwvc3BpL0VjbGlwc2VMaW5rRHluYW1pY01hcHBlZFN1cGVyY2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0NzIxZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9qcHFsL3NwaS9FY2xpcHNlTGlua0R5bmFtaWNNYXBwZWRTdXBlcmNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLgotICogVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5qcHFsLnNwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLnNwaS5KcGFNYW5hZ2VkVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLnNwaS5KcGFNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JTWFuYWdlZFR5cGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JTWFwcGVkU3VwZXJjbGFzczsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGFuIHtAbGluayBJTWFwcGVkU3VwZXJjbGFzc30gdGhhdCByZXByZXNlbnRzIGEgZHluYW1pYyBtYXBwZWQgc3VwZXJjbGFzcy4KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQKLSAqIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlCi0gKiB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzCi0gKiBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMgotICogQGF1dGhvciBQYXNjYWwgRmlsaW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0R5bmFtaWNNYXBwZWRTdXBlcmNsYXNzIGV4dGVuZHMgRWNsaXBzZUxpbmtEeW5hbWljTWFuYWdlZFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSU1hcHBlZFN1cGVyY2xhc3MgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua0R5bmFtaWNNYXBwZWRTdXBlcmNsYXNzPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwcm92aWRlciBUaGUgcHJvdmlkZXIgb2YgSlBBIG1hbmFnZWQgdHlwZXMKLQkgKiBAcGFyYW0gZGVsZWdhdGUgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElNYW5hZ2VkVHlwZX0KLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtEeW5hbWljTWFwcGVkU3VwZXJjbGFzcyhKcGFNYW5hZ2VkVHlwZVByb3ZpZGVyIHByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwYU1hcHBlZFN1cGVyY2xhc3MgZGVsZWdhdGUpIHsKLQotCQlzdXBlcihwcm92aWRlciwgZGVsZWdhdGUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2NlcHQoSU1hbmFnZWRUeXBlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFNYXBwZWRTdXBlcmNsYXNzIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gKEpwYU1hcHBlZFN1cGVyY2xhc3MpIHN1cGVyLmdldERlbGVnYXRlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2pwcWwvc3BpL0VjbGlwc2VMaW5rRHluYW1pY01hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2pwcWwvc3BpL0VjbGlwc2VMaW5rRHluYW1pY01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVlMDYzOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9qcHFsL3NwaS9FY2xpcHNlTGlua0R5bmFtaWNNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4KLSAqIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuanBxbC5zcGk7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLnNwaS5KcGFUeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuc3BpLkpwYVR5cGVSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JTWFuYWdlZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSVR5cGVEZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSB7QGxpbmsgSU1hcHBpbmd9IHRoYXQgc3VwcG9ydHMgYSBkeW5hbWljIG1hcHBpbmcuCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kCi0gKiBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZQotICogdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcwotICogQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjIKLSAqIEBhdXRob3IgUGFzY2FsIEZpbGlvbgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0R5bmFtaWNNYXBwaW5nIGltcGxlbWVudHMgSU1hcHBpbmcgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElNYXBwaW5nfS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rTWFwcGluZyBkZWxlZ2F0ZTsKLQotCS8qKgotCSAqIFRoZSBwYXJlbnQgb2YgdGhpcyBtYXBwaW5nLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtEeW5hbWljTWFuYWdlZFR5cGUgcGFyZW50OwotCi0JLyoqCi0JICogVGhlIHtAbGluayBJVHlwZX0gb2YgdGhlIHByb3BlcnR5IHJlcHJlc2VudGVkIGJ5IHRoZSBtYXBwaW5nLgotCSAqLwotCXByaXZhdGUgSVR5cGUgdHlwZTsKLQotCS8qKgotCSAqIFRoZSB7QGxpbmsgSVR5cGVEZWNsYXJhdGlvbn0gb2YgdGhlIHByb3BlcnR5IHJlcHJlc2VudGVkIGJ5IHRoZSBtYXBwaW5nLgotCSAqLwotCXByaXZhdGUgSVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rRHluYW1pY01hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IG9mIHRoaXMgbWFwcGluZwotCSAqIEBwYXJhbSBkZWxlZ2F0ZSBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSU1hcHBpbmd9Ci0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rRHluYW1pY01hcHBpbmcoRWNsaXBzZUxpbmtEeW5hbWljTWFuYWdlZFR5cGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rTWFwcGluZyBkZWxlZ2F0ZSkgewotCi0JCXN1cGVyKCk7Ci0JCXRoaXMucGFyZW50ICAgPSBwYXJlbnQ7Ci0JCXRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBsaXN0IG9mIHtAbGluayBJVHlwZURlY2xhcmF0aW9uIHR5cGUgZGVjbGFyYXRpb25zfSB0aGF0IHJlcHJlc2VudHMgdGhlIGdlbmVyaWNzIG9mCi0JICogdGhlIHR5cGUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIHtAbGluayBJVHlwZURlY2xhcmF0aW9uIHR5cGUgZGVjbGFyYXRpb25zfSBvciBhbiBlbXB0eSBsaXN0IGlmIHRoZSB0eXBlIGlzCi0JICogbm90IHBhcmFtZXRlcml6ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVR5cGVEZWNsYXJhdGlvbltdIGJ1aWxkR2VuZXJpY1R5cGVEZWNsYXJhdGlvbnMoKSB7Ci0KLQkJaWYgKGRlbGVnYXRlLmlzUmVsYXRpb25zaGlwKCkgfHwKLQkJICAgIGRlbGVnYXRlLmlzQ29sbGVjdGlvbigpKSB7Ci0KLQkJCVJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZyA9IChSZWxhdGlvbnNoaXBNYXBwaW5nKSBkZWxlZ2F0ZS5nZXRNYXBwaW5nKCk7Ci0JCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gbWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCi0JCQlpZiAodGFyZ2V0RW50aXR5ICE9IG51bGwpIHsKLQkJCQlJRW50aXR5IGVudGl0eSA9IHBhcmVudC5nZXRQcm92aWRlcigpLmdldEVudGl0eU5hbWVkKHRhcmdldEVudGl0eS5nZXROYW1lKCkpOwotCQkJCXJldHVybiBuZXcgSVR5cGVEZWNsYXJhdGlvbltdIHsgZW50aXR5LmdldFR5cGUoKS5nZXRUeXBlRGVjbGFyYXRpb24oKSB9OwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ldyBJVHlwZURlY2xhcmF0aW9uWzBdOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHJpZ2h0IHtAbGluayBJVHlwZX0gYW5kIG1ha2Ugc3VyZSBpdCBjaGVja3MgZm9yIGR5bmFtaWMgdHlwZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHtAbGluayBJVHlwZX0gb2YgdGhpcyBkeW5hbWljIG1hcHBpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgSVR5cGUgYnVpbGRUeXBlKCkgewotCi0JCWlmIChkZWxlZ2F0ZS5pc0NvbGxlY3Rpb24oKSB8fAotCQkgICAgZGVsZWdhdGUuaXNSZWxhdGlvbnNoaXAoKSkgewotCi0JCQlJTWFuYWdlZFR5cGUgbWFuYWdlZFR5cGUgPSBwYXJlbnQuZ2V0UHJvdmlkZXIoKS5nZXRNYW5hZ2VkVHlwZShnZXRUeXBlTmFtZSgpKTsKLQotCQkJaWYgKG1hbmFnZWRUeXBlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbWFuYWdlZFR5cGUuZ2V0VHlwZSgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGdldFR5cGVSZXBvc2l0b3J5KCkuZ2V0VHlwZShnZXRUeXBlTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSByaWdodCB7QGxpbmsgSVR5cGVEZWNsYXJhdGlvbn0gYW5kIG1ha2Ugc3VyZSBpdCBjaGVja3MgZm9yIGR5bmFtaWMgdHlwZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHtAbGluayBJVHlwZURlY2xhcmF0aW9ufSBvZiB0aGlzIGR5bmFtaWMgbWFwcGluZwotCSAqLwotCXByb3RlY3RlZCBJVHlwZURlY2xhcmF0aW9uIGJ1aWxkVHlwZURlY2xhcmF0aW9uKCkgewotCi0JCVN0cmluZyB0eXBlTmFtZSA9IGdldFR5cGVOYW1lKCk7Ci0JCWludCBkaW1lbnNpb25hbGl0eSA9IDA7Ci0KLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzTm90RW1wdHkodHlwZU5hbWUpKSB7Ci0JCQlpbnQgaW5kZXggPSB0eXBlTmFtZS5pbmRleE9mKCJbXSIpOwotCQkJZGltZW5zaW9uYWxpdHkgPSAodHlwZU5hbWUubGVuZ3RoKCkgLSBpbmRleCkgLyAyOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBKcGFUeXBlRGVjbGFyYXRpb24oZ2V0VHlwZSgpLCBidWlsZEdlbmVyaWNUeXBlRGVjbGFyYXRpb25zKCksIGRpbWVuc2lvbmFsaXR5KTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIGludCBjb21wYXJlVG8oSU1hcHBpbmcgbWFwcGluZykgewotCQlyZXR1cm4gZGVsZWdhdGUuY29tcGFyZVRvKG1hcHBpbmcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1hcHBpbmcncyBhdHRyaWJ1dGUgKHR5cGljYWxseSBpdHMgcGFyZW50IG5vZGUgaW4gdGhlIGNvbnRhaW5tZW50IGhpZXJhcmNoeSkuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUGVyc2lzdGVudEF0dHJpYnV0ZX0KLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBkZWxlZ2F0ZS5nZXRNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1hcHBpbmdUeXBlKCkgewotCQlyZXR1cm4gZGVsZWdhdGUuZ2V0TWFwcGluZ1R5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZGVsZWdhdGUuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSU1hbmFnZWRUeXBlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElUeXBlIGdldFR5cGUoKSB7Ci0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXR5cGUgPSBidWlsZFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElUeXBlRGVjbGFyYXRpb24gZ2V0VHlwZURlY2xhcmF0aW9uKCkgewotCQlpZiAodHlwZURlY2xhcmF0aW9uID09IG51bGwpIHsKLQkJCXR5cGVEZWNsYXJhdGlvbiA9IGJ1aWxkVHlwZURlY2xhcmF0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG5hbWUgb2YgdGhlIHBlcnNpc3RlbnQgYXR0cmlidXRlLgotCSAqCi0JICogQHJldHVybiBUaGUgZnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoKS5nZXRUeXBlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgcmVwb3NpdG9yeSBmb3IgdGhlIGFwcGxpY2F0aW9uLgotCSAqCi0JICogQHJldHVybiBUaGUgcmVwb3NpdG9yeSBvZiB7QGxpbmsgSVR5cGUgSVR5cGVzfQotCSAqLwotCXByb3RlY3RlZCBKcGFUeXBlUmVwb3NpdG9yeSBnZXRUeXBlUmVwb3NpdG9yeSgpIHsKLQkJcmV0dXJuIHBhcmVudC5nZXRQcm92aWRlcigpLmdldFR5cGVSZXBvc2l0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0Fubm90YXRpb24oQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKSB7Ci0JCXJldHVybiBkZWxlZ2F0ZS5oYXNBbm5vdGF0aW9uKGFubm90YXRpb25UeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gZGVsZWdhdGUuaXNDb2xsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHkoKSB7Ci0JCXJldHVybiBkZWxlZ2F0ZS5pc1Byb3BlcnR5KCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVsYXRpb25zaGlwKCkgewotCQlyZXR1cm4gZGVsZWdhdGUuaXNSZWxhdGlvbnNoaXAoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUcmFuc2llbnQoKSB7Ci0JCXJldHVybiBkZWxlZ2F0ZS5pc1RyYW5zaWVudCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9qcHFsL3NwaS9FY2xpcHNlTGlua0R5bmFtaWNUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9qcHFsL3NwaS9FY2xpcHNlTGlua0R5bmFtaWNUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYTM0MzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvanBxbC9zcGkvRWNsaXBzZUxpbmtEeW5hbWljVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4KLSAqIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuanBxbC5zcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBxbC5zcGkuSnBhVHlwZVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuc3BpLlNpbXBsZVR5cGU7Ci0KLS8qKgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZAotICogZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UKLSAqIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMKLSAqIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4yCi0gKiBAYXV0aG9yIFBhc2NhbCBGaWxpb24KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRHluYW1pY1R5cGUgZXh0ZW5kcyBTaW1wbGVUeXBlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtEeW5hbWljVHlwZTwvY29kZT4uCi0JICogQHBhcmFtIHR5cGVSZXBvc2l0b3J5Ci0JICogQHBhcmFtIHR5cGUKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtEeW5hbWljVHlwZShKcGFUeXBlUmVwb3NpdG9yeSB0eXBlUmVwb3NpdG9yeSwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXN1cGVyKHR5cGVSZXBvc2l0b3J5LCB0eXBlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzUmVzb2x2YWJsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2pwcWwvc3BpL0VjbGlwc2VMaW5rTWFuYWdlZFR5cGVCdWlsZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9qcHFsL3NwaS9FY2xpcHNlTGlua01hbmFnZWRUeXBlQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDNiOTAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2pwcWwvc3BpL0VjbGlwc2VMaW5rTWFuYWdlZFR5cGVCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4KLSAqIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuanBxbC5zcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuc3BpLklNYW5hZ2VkVHlwZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuc3BpLkpwYUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuc3BpLkpwYUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBxbC5zcGkuSnBhTWFuYWdlZFR5cGVCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLnNwaS5KcGFNYW5hZ2VkVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLnNwaS5KcGFNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklNYXBwaW5nQnVpbGRlcjsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJTWFuYWdlZFR5cGVCdWlsZGVyfSBhZGRzIHN1cHBvcnQgZm9yIGR5bmFtaWMgbWFuYWdlZCB0eXBlcy4KLSAqCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjIKLSAqIEBhdXRob3IgUGFzY2FsIEZpbGlvbgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtNYW5hZ2VkVHlwZUJ1aWxkZXIgaW1wbGVtZW50cyBJTWFuYWdlZFR5cGVCdWlsZGVyIHsKLQotCS8qKgotCSAqIFRoaXMgYnVpbGRlciBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBhbiB7QGxpbmsgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuCi0JICoganBhLmpwcWwuc3BpLklNYW5hZ2VkVHlwZSBJTWFuYWdlZFR5cGV9IHdoaWNoIGlzIG9ubHkgd3JhcHBlZCBpZiB0aGUgbWFuYWdlZCB0eXBlIGlzIGR5bmFtaWMuCi0JICovCi0JcHJpdmF0ZSBKcGFNYW5hZ2VkVHlwZUJ1aWxkZXIgYnVpbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtNYW5hZ2VkVHlwZUJ1aWxkZXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua01hbmFnZWRUeXBlQnVpbGRlcigpIHsKLQkJc3VwZXIoKTsKLQkJYnVpbGRlciA9IG5ldyBKcGFNYW5hZ2VkVHlwZUJ1aWxkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElFbWJlZGRhYmxlIGJ1aWxkRW1iZWRkYWJsZShKcGFNYW5hZ2VkVHlwZVByb3ZpZGVyIHByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW1iZWRkYWJsZSBtYXBwZWRDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNYXBwaW5nQnVpbGRlcjxBdHRyaWJ1dGVNYXBwaW5nPiBtYXBwaW5nQnVpbGRlcikgewotCi0JCUpwYUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChKcGFFbWJlZGRhYmxlKSBidWlsZGVyLmJ1aWxkRW1iZWRkYWJsZSgKLQkJCXByb3ZpZGVyLAotCQkJbWFwcGVkQ2xhc3MsCi0JCQltYXBwaW5nQnVpbGRlcgotCQkpOwotCi0JCVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gbWFwcGVkQ2xhc3MuZ2V0UGVyc2lzdGVudFR5cGUoKTsKLQotCQlpZiAocGVyc2lzdGVudFR5cGUgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlKSB7Ci0JCQlFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gKEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUpIHBlcnNpc3RlbnRUeXBlOwotCQkJaWYgKG9ybVBlcnNpc3RlbnRUeXBlLmlzRHluYW1pYygpKSB7Ci0JCQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0R5bmFtaWNFbWJlZGRhYmxlKHByb3ZpZGVyLCBlbWJlZGRhYmxlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBlbWJlZGRhYmxlOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSUVudGl0eSBidWlsZEVudGl0eShKcGFNYW5hZ2VkVHlwZVByb3ZpZGVyIHByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eSBtYXBwZWRDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBJTWFwcGluZ0J1aWxkZXI8QXR0cmlidXRlTWFwcGluZz4gbWFwcGluZ0J1aWxkZXIpIHsKLQotCQlKcGFFbnRpdHkgZW50aXR5ID0gKEpwYUVudGl0eSkgYnVpbGRlci5idWlsZEVudGl0eShwcm92aWRlciwgbWFwcGVkQ2xhc3MsIG1hcHBpbmdCdWlsZGVyKTsKLQkJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBtYXBwZWRDbGFzcy5nZXRQZXJzaXN0ZW50VHlwZSgpOwotCi0JCWlmIChwZXJzaXN0ZW50VHlwZSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUpIHsKLQkJCUVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAoRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZSkgcGVyc2lzdGVudFR5cGU7Ci0JCQlpZiAob3JtUGVyc2lzdGVudFR5cGUuaXNEeW5hbWljKCkpIHsKLQkJCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rRHluYW1pY0VudGl0eShwcm92aWRlciwgZW50aXR5KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBlbnRpdHk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBJTWFwcGVkU3VwZXJjbGFzcyBidWlsZE1hcHBlZFN1cGVyY2xhc3MoSnBhTWFuYWdlZFR5cGVQcm92aWRlciBwcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkQ2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTWFwcGluZ0J1aWxkZXI8QXR0cmlidXRlTWFwcGluZz4gbWFwcGluZ0J1aWxkZXIpIHsKLQotCQlKcGFNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoSnBhTWFwcGVkU3VwZXJjbGFzcykgYnVpbGRlci5idWlsZE1hcHBlZFN1cGVyY2xhc3MoCi0JCQlwcm92aWRlciwKLQkJCW1hcHBlZENsYXNzLAotCQkJbWFwcGluZ0J1aWxkZXIKLQkJKTsKLQotCQlQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IG1hcHBlZENsYXNzLmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0KLQkJaWYgKHBlcnNpc3RlbnRUeXBlIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZSkgewotCQkJRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IChFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlKSBwZXJzaXN0ZW50VHlwZTsKLQkJCWlmIChvcm1QZXJzaXN0ZW50VHlwZS5pc0R5bmFtaWMoKSkgewotCQkJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtEeW5hbWljTWFwcGVkU3VwZXJjbGFzcyhwcm92aWRlciwgbWFwcGVkU3VwZXJjbGFzcyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbWFwcGVkU3VwZXJjbGFzczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvanBxbC9zcGkvRWNsaXBzZUxpbmtNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9qcHFsL3NwaS9FY2xpcHNlTGlua01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlNmMyMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9qcHFsL3NwaS9FY2xpcHNlTGlua01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLgotICogVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5qcHFsLnNwaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuc3BpLkpwYU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklNYW5hZ2VkVHlwZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSUVjbGlwc2VMaW5rTWFwcGluZ1R5cGUuKjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklNYXBwaW5nVHlwZS4qOwotCi0vKioKLSAqIFRoZSBFY2xpcHNlTGluayBpbXBsZW1lbnRhdGlvbiBvZiBIZXJtZXMnIHtAbGluayBJTWFwcGluZ30sIHdoaWNoIGFkZHMgRWNsaXBzZUxpbmsgc3BlY2lmaWMKLSAqIG1hcHBpbmcgc3VwcG9ydC4KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQKLSAqIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlCi0gKiB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzCi0gKiBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMQotICogQGF1dGhvciBQYXNjYWwgRmlsaW9uCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiIC8qIEZvciB0aGUgZXh0cmEgaW1wb3J0IHN0YXRlbWVudCwgc2VlIGJ1ZyAzMzA3NDAgKi8pCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtNYXBwaW5nIGV4dGVuZHMgSnBhTWFwcGluZyB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rTWFwcGluZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgb2YgdGhpcyBtYXBwaW5nCi0JICogQHBhcmFtIG1hcHBpbmcgVGhlIGRlc2lnbi10aW1lIHtAbGluayBBdHRyaWJ1dGVNYXBwaW5nfSB3cmFwcGVkIGJ5IHRoaXMgY2xhc3MKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtNYXBwaW5nKElNYW5hZ2VkVHlwZSBwYXJlbnQsIEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIG1hcHBpbmcpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGNhbGN1bGF0ZU1hcHBpbmdUeXBlKCkgewotCi0JCVN0cmluZyB0eXBlID0gZ2V0TWFwcGluZygpLmdldEtleSgpOwotCi0JCS8vIEJhc2ljIENvbGxlY3Rpb24KLQkJaWYgKHR5cGUgPT0gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5CQVNJQ19DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJcmV0dXJuIEJBU0lDX0NPTExFQ1RJT047Ci0JCX0KLQotCQkvLyBCYXNpYyBNYXAKLQkJaWYgKHR5cGUgPT0gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5CQVNJQ19NQVBfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlyZXR1cm4gQkFTSUNfTUFQOwotCQl9Ci0KLQkJLy8gVHJhbnNmb3JtYXRpb24KLQkJaWYgKHR5cGUgPT0gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5UUkFOU0ZPUk1BVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCXJldHVybiBUUkFOU0ZPUk1BVElPTjsKLQkJfQotCi0JCS8vIFZhcmlhYmxlIDE6MQotCQlpZiAodHlwZSA9PSBFY2xpcHNlTGlua01hcHBpbmdLZXlzLlZBUklBQkxFX09ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlyZXR1cm4gVkFSSUFCTEVfT05FX1RPX09ORTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5jYWxjdWxhdGVNYXBwaW5nVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQXR0cmlidXRlTWFwcGluZyBnZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TWFwcGluZygpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0NvbGxlY3Rpb24oKSB7Ci0JCXN3aXRjaCAoZ2V0TWFwcGluZ1R5cGUoKSkgewotCQkJY2FzZSBCQVNJQ19DT0xMRUNUSU9OOgotCQkJY2FzZSBCQVNJQ19NQVA6Ci0JCQljYXNlIEVMRU1FTlRfQ09MTEVDVElPTjoKLQkJCWNhc2UgTUFOWV9UT19NQU5ZOgotCQkJY2FzZSBPTkVfVE9fTUFOWTogcmV0dXJuIHRydWU7Ci0JCQlkZWZhdWx0OiAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNSZWxhdGlvbnNoaXAoKSB7Ci0JCXN3aXRjaCAoZ2V0TWFwcGluZ1R5cGUoKSkgewotCQkJY2FzZSBFTEVNRU5UX0NPTExFQ1RJT046Ci0JCQljYXNlIEVNQkVEREVEX0lEOgotCQkJY2FzZSBNQU5ZX1RPX01BTlk6Ci0JCQljYXNlIE1BTllfVE9fT05FOgotCQkJY2FzZSBPTkVfVE9fTUFOWToKLQkJCWNhc2UgT05FX1RPX09ORToKLQkJCWNhc2UgVkFSSUFCTEVfT05FX1RPX09ORTogcmV0dXJuIHRydWU7Ci0JCQlkZWZhdWx0OiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9qcHFsL3NwaS9FY2xpcHNlTGlua01hcHBpbmdCdWlsZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9qcHFsL3NwaS9FY2xpcHNlTGlua01hcHBpbmdCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMjFkMjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvanBxbC9zcGkvRWNsaXBzZUxpbmtNYXBwaW5nQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4KLSAqIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuanBxbC5zcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JTWFuYWdlZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JTWFwcGluZ0J1aWxkZXI7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElNYXBwaW5nQnVpbGRlcn0gdGhhdCBjcmVhdGVzIHRoZSBFY2xpcHNlTGluayB2ZXJzaW9uIG9mIEhlcm1lcydzCi0gKiB7QGxpbmsgSU1hcHBpbmd9LgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZAotICogZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UKLSAqIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMKLSAqIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICogQHZlcnNpb24gMi40Ci0gKiBAc2luY2UgMi40Ci0gKiBAYXV0aG9yIFBhc2NhbCBGaWxpb24KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTWFwcGluZ0J1aWxkZXIgaW1wbGVtZW50cyBJTWFwcGluZ0J1aWxkZXI8QXR0cmlidXRlTWFwcGluZz4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua01hcHBpbmdCdWlsZGVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtNYXBwaW5nQnVpbGRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElNYXBwaW5nIGJ1aWxkTWFwcGluZyhJTWFuYWdlZFR5cGUgcGFyZW50LCBBdHRyaWJ1dGVNYXBwaW5nIHZhbHVlKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtNYXBwaW5nKHBhcmVudCwgdmFsdWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9wbGF0Zm9ybS9FY2xpcHNlTGlua1BsYXRmb3JtLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9wbGF0Zm9ybS9FY2xpcHNlTGlua1BsYXRmb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NDAxZGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcGxhdGZvcm0vRWNsaXBzZUxpbmtQbGF0Zm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uOwotCi0vKioKLSAqIENvbnN0YW50cyBwZXJ0YWluaW5nIHRvIHRoZSBFY2xpcHNlTGluayBKUEEgcGxhdGZvcm1zIGFuZCB0aGVpciBncm91cAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BsYXRmb3JtIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbiBHUk9VUAotCQkJPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtTWFuYWdlcigpLmdldEpwYVBsYXRmb3JtR3JvdXAoImVjbGlwc2VsaW5rIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gVkVSU0lPTl8xXzAKLQkJCT0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKcGFQbGF0Zm9ybSgib3JnLmVjbGlwc2UuZWNsaXBzZWxpbmsucGxhdGZvcm0iKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBWRVJTSU9OXzFfMQotCQkJPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtTWFuYWdlcigpLmdldEpwYVBsYXRmb3JtKCJlY2xpcHNlbGluazFfMSIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIFZFUlNJT05fMV8yCi0JCQk9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SnBhUGxhdGZvcm0oImVjbGlwc2VsaW5rMV8yIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gVkVSU0lPTl8yXzAKLQkJCT0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKcGFQbGF0Zm9ybSgiZWNsaXBzZWxpbmsyXzAiKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBWRVJTSU9OXzJfMQotCQkJPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtTWFuYWdlcigpLmdldEpwYVBsYXRmb3JtKCJlY2xpcHNlbGluazJfMSIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIFZFUlNJT05fMl8yCi0JCQk9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SnBhUGxhdGZvcm0oImVjbGlwc2VsaW5rMl8yIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gVkVSU0lPTl8yXzMKLQkJCT0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKcGFQbGF0Zm9ybSgiZWNsaXBzZWxpbmsyXzMiKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBWRVJTSU9OXzJfNAotCQkJPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtTWFuYWdlcigpLmdldEpwYVBsYXRmb3JtKCJlY2xpcHNlbGluazJfNCIpOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JLyoqCi0JICogTm90IGZvciBpbnN0YW50aWF0aW9uCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1BsYXRmb3JtKCkge30KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvQ2FjaGVDb29yZGluYXRpb25UeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2NkYWUzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvQ2FjaGVDb29yZGluYXRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBlbnVtCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZUNvb3JkaW5hdGlvblR5cGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgZW51bSBDYWNoZUNvb3JkaW5hdGlvblR5cGUgewotCi0JU0VORF9PQkpFQ1RfQ0hBTkdFUyhFY2xpcHNlTGluay5DQUNIRV9DT09SRElOQVRJT05fVFlQRV9fU0VORF9PQkpFQ1RfQ0hBTkdFUyksCi0JSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMoRWNsaXBzZUxpbmsuQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfX0lOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKSwKLQlTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyhFY2xpcHNlTGluay5DQUNIRV9DT09SRElOQVRJT05fVFlQRV9fU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMpLAotCU5PTkUoRWNsaXBzZUxpbmsuQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfX05PTkUpOwotCi0KLQlwcml2YXRlIFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlOwotCi0JQ2FjaGVDb29yZGluYXRpb25UeXBlKFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuamF2YUFubm90YXRpb25WYWx1ZSA9IGphdmFBbm5vdGF0aW9uVmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZShPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlyZXR1cm4gKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKGphdmFBbm5vdGF0aW9uVmFsdWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJZm9yIChDYWNoZUNvb3JkaW5hdGlvblR5cGUgY2FjaGVDb29yZGluYXRpb25UeXBlIDogQ2FjaGVDb29yZGluYXRpb25UeXBlLnZhbHVlcygpKSB7Ci0JCQlpZiAoY2FjaGVDb29yZGluYXRpb25UeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKS5lcXVhbHMoamF2YUFubm90YXRpb25WYWx1ZSkpIHsKLQkJCQlyZXR1cm4gY2FjaGVDb29yZGluYXRpb25UeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmF2YUFubm90YXRpb25WYWx1ZShDYWNoZUNvb3JkaW5hdGlvblR5cGUgY2FjaGVDb29yZGluYXRpb25UeXBlKSB7Ci0JCXJldHVybiAoY2FjaGVDb29yZGluYXRpb25UeXBlID09IG51bGwpID8gbnVsbCA6IGNhY2hlQ29vcmRpbmF0aW9uVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0NhY2hlSXNvbGF0aW9uVHlwZTJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9DYWNoZUlzb2xhdGlvblR5cGUyXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJmZjJkNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0NhY2hlSXNvbGF0aW9uVHlwZTJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgZW51bSAKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvbmZpZy5DYWNoZUlzb2xhdGlvblR5cGUgYWRkZWQgaW4gRWNsaXBzZUxpbmsgMi4yCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGVudW0gQ2FjaGVJc29sYXRpb25UeXBlMl8yIHsKLQotCVNIQVJFRChFY2xpcHNlTGluay5DQUNIRV9JU09MQVRJT05fVFlQRV9fU0hBUkVEKSwKLQlQUk9URUNURUQoRWNsaXBzZUxpbmsuQ0FDSEVfSVNPTEFUSU9OX1RZUEVfX1BST1RFQ1RFRCksCi0JSVNPTEFURUQoRWNsaXBzZUxpbmsuQ0FDSEVfSVNPTEFUSU9OX1RZUEVfX0lTT0xBVEVEKTsKLQotCi0JcHJpdmF0ZSBTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZTsKLQotCUNhY2hlSXNvbGF0aW9uVHlwZTJfMihTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWUgPSBqYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBDYWNoZUlzb2xhdGlvblR5cGUyXzIgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJcmV0dXJuIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhqYXZhQW5ub3RhdGlvblZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDYWNoZUlzb2xhdGlvblR5cGUyXzIgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWZvciAoQ2FjaGVJc29sYXRpb25UeXBlMl8yIGNhY2hlQ29vcmRpbmF0aW9uVHlwZSA6IENhY2hlSXNvbGF0aW9uVHlwZTJfMi52YWx1ZXMoKSkgewotCQkJaWYgKGNhY2hlQ29vcmRpbmF0aW9uVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkuZXF1YWxzKGphdmFBbm5vdGF0aW9uVmFsdWUpKSB7Ci0JCQkJcmV0dXJuIGNhY2hlQ29vcmRpbmF0aW9uVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0phdmFBbm5vdGF0aW9uVmFsdWUoQ2FjaGVJc29sYXRpb25UeXBlMl8yIGNhY2hlQ29vcmRpbmF0aW9uVHlwZSkgewotCQlyZXR1cm4gKGNhY2hlQ29vcmRpbmF0aW9uVHlwZSA9PSBudWxsKSA/IG51bGwgOiBjYWNoZUNvb3JkaW5hdGlvblR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9DYWNoZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvQ2FjaGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNWRkOTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9DYWNoZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGVudW0KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlVHlwZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBlbnVtIENhY2hlVHlwZSB7Ci0KLQlGVUxMKEVjbGlwc2VMaW5rLkNBQ0hFX1RZUEVfX0ZVTEwpLAotCVdFQUsoRWNsaXBzZUxpbmsuQ0FDSEVfVFlQRV9fV0VBSyksCi0JU09GVChFY2xpcHNlTGluay5DQUNIRV9UWVBFX19TT0ZUKSwKLQlTT0ZUX1dFQUsoRWNsaXBzZUxpbmsuQ0FDSEVfVFlQRV9fU09GVF9XRUFLKSwKLQlIQVJEX1dFQUsoRWNsaXBzZUxpbmsuQ0FDSEVfVFlQRV9fSEFSRF9XRUFLKSwKLQlDQUNIRShFY2xpcHNlTGluay5DQUNIRV9UWVBFX19DQUNIRSksCi0JTk9ORShFY2xpcHNlTGluay5DQUNIRV9UWVBFX19OT05FKTsKLQotCi0JcHJpdmF0ZSBTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZTsKLQotCUNhY2hlVHlwZShTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWUgPSBqYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBDYWNoZVR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJcmV0dXJuIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhqYXZhQW5ub3RhdGlvblZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDYWNoZVR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWZvciAoQ2FjaGVUeXBlIGNhY2hlVHlwZSA6IENhY2hlVHlwZS52YWx1ZXMoKSkgewotCQkJaWYgKGNhY2hlVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkuZXF1YWxzKGphdmFBbm5vdGF0aW9uVmFsdWUpKSB7Ci0JCQkJcmV0dXJuIGNhY2hlVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0phdmFBbm5vdGF0aW9uVmFsdWUoQ2FjaGVUeXBlIGNhY2hlVHlwZSkgewotCQlyZXR1cm4gKGNhY2hlVHlwZSA9PSBudWxsKSA/IG51bGwgOiBjYWNoZVR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9DaGFuZ2VUcmFja2luZ1R5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvQ2hhbmdlVHJhY2tpbmdUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZGFjNWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9DaGFuZ2VUcmFja2luZ1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGVudW0KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNoYW5nZVRyYWNraW5nVHlwZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBlbnVtIENoYW5nZVRyYWNraW5nVHlwZSB7Ci0KLQlBVFRSSUJVVEUoRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HX1RZUEVfX0FUVFJJQlVURSksCi0JT0JKRUNUKEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lOR19UWVBFX19PQkpFQ1QpLAotCURFRkVSUkVEKEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lOR19UWVBFX19ERUZFUlJFRCksCi0JQVVUTyhFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkdfVFlQRV9fQVVUTyk7Ci0KLQotCXByaXZhdGUgU3RyaW5nIGphdmFBbm5vdGF0aW9uVmFsdWU7Ci0KLQlDaGFuZ2VUcmFja2luZ1R5cGUoU3RyaW5nIGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlID0gamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFBbm5vdGF0aW9uVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgQ2hhbmdlVHJhY2tpbmdUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCXJldHVybiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oamF2YUFubm90YXRpb25WYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ2hhbmdlVHJhY2tpbmdUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlmb3IgKENoYW5nZVRyYWNraW5nVHlwZSBjaGFuZ2VUcmFja2luZ1R5cGUgOiBDaGFuZ2VUcmFja2luZ1R5cGUudmFsdWVzKCkpIHsKLQkJCWlmIChjaGFuZ2VUcmFja2luZ1R5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpLmVxdWFscyhqYXZhQW5ub3RhdGlvblZhbHVlKSkgewotCQkJCXJldHVybiBjaGFuZ2VUcmFja2luZ1R5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9KYXZhQW5ub3RhdGlvblZhbHVlKENoYW5nZVRyYWNraW5nVHlwZSBjaGFuZ2VUcmFja2luZ1R5cGUpIHsKLQkJcmV0dXJuIChjaGFuZ2VUcmFja2luZ1R5cGUgPT0gbnVsbCkgPyBudWxsIDogY2hhbmdlVHJhY2tpbmdUeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmsuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE4MWRlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBKYXZhLXJlbGF0ZWQgc3R1ZmYgKGFubm90YXRpb25zIGV0Yy4pCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAyLjEKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rIHsKLQotCS8vIEVjbGlwc2VMaW5rIHBhY2thZ2UKLQlTdHJpbmcgUEFDS0FHRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUEFDS0FHRV8gPSBQQUNLQUdFICsgIi4iOwotCi0KLQkvLyAqKioqKioqKioqIEFQSSAqKioqKioqKioqCi0KLQkvLyBFY2xpc3BlTGluayBhbm5vdGF0aW9ucwotCVN0cmluZyBCQVNJQ19DT0xMRUNUSU9OID0gUEFDS0FHRV8gKyAiQmFzaWNDb2xsZWN0aW9uIjsKLQlTdHJpbmcgQkFTSUNfTUFQID0gUEFDS0FHRV8gKyAiQmFzaWNNYXAiOwotCVN0cmluZyBDQUNIRSA9IFBBQ0tBR0VfICsgIkNhY2hlIjsKLQkJU3RyaW5nIENBQ0hFX19TSEFSRUQgPSAic2hhcmVkIjsKLQkJU3RyaW5nIENBQ0hFX19FWFBJUlkgPSAiZXhwaXJ5IjsKLQkJU3RyaW5nIENBQ0hFX19FWFBJUllfVElNRV9PRl9EQVkgPSAiZXhwaXJ5VGltZU9mRGF5IjsKLQkJU3RyaW5nIENBQ0hFX19UWVBFID0gInR5cGUiOwotCQlTdHJpbmcgQ0FDSEVfX1NJWkUgPSAic2l6ZSI7Ci0JCVN0cmluZyBDQUNIRV9fQUxXQVlTX1JFRlJFU0ggPSAiYWx3YXlzUmVmcmVzaCI7Ci0JCVN0cmluZyBDQUNIRV9fUkVGUkVTSF9PTkxZX0lGX05FV0VSID0gInJlZnJlc2hPbmx5SWZOZXdlciI7Ci0JCVN0cmluZyBDQUNIRV9fRElTQUJMRV9ISVRTID0gImRpc2FibGVIaXRzIjsKLQkJU3RyaW5nIENBQ0hFX19DT09SRElOQVRJT05fVFlQRSA9ICJjb29yZGluYXRpb25UeXBlIjsKLQlTdHJpbmcgQ0hBTkdFX1RSQUNLSU5HID0gUEFDS0FHRV8gKyAiQ2hhbmdlVHJhY2tpbmciOwotCQlTdHJpbmcgQ0hBTkdFX1RSQUNLSU5HX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIENPTlZFUlNJT05fVkFMVUUgPSBQQUNLQUdFXyArICJDb252ZXJzaW9uVmFsdWUiOwotCQlTdHJpbmcgQ09OVkVSU0lPTl9WQUxVRV9fREFUQV9WQUxVRSA9ICJkYXRhVmFsdWUiOwotCQlTdHJpbmcgQ09OVkVSU0lPTl9WQUxVRV9fT0JKRUNUX1ZBTFVFID0gIm9iamVjdFZhbHVlIjsKLQlTdHJpbmcgQ09OVkVSVCA9IFBBQ0tBR0VfICsgIkNvbnZlcnQiOwotCQlTdHJpbmcgQ09OVkVSVF9fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBDT05WRVJURVIgPSBQQUNLQUdFXyArICJDb252ZXJ0ZXIiOwotCQlTdHJpbmcgQ09OVkVSVEVSX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgQ09OVkVSVEVSX19DT05WRVJURVJfQ0xBU1MgPSAiY29udmVydGVyQ2xhc3MiOwotCVN0cmluZyBDVVNUT01JWkVSID0gUEFDS0FHRV8gKyAiQ3VzdG9taXplciI7Ci0JCVN0cmluZyBDVVNUT01JWkVSX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIEVYSVNURU5DRV9DSEVDS0lORyA9IFBBQ0tBR0VfICsgIkV4aXN0ZW5jZUNoZWNraW5nIjsKLQkJU3RyaW5nIEVYSVNURU5DRV9DSEVDS0lOR19fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBKT0lOX0ZFVENIID0gUEFDS0FHRV8gKyAiSm9pbkZldGNoIjsKLQkJU3RyaW5nIEpPSU5fRkVUQ0hfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgTVVUQUJMRSA9IFBBQ0tBR0VfICsgIk11dGFibGUiOwotCQlTdHJpbmcgTVVUQUJMRV9fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBPQkpFQ1RfVFlQRV9DT05WRVJURVIgPSBQQUNLQUdFXyArICJPYmplY3RUeXBlQ29udmVydGVyIjsKLQkJU3RyaW5nIE9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIE9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFID0gImRhdGFUeXBlIjsKLQkJU3RyaW5nIE9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEUgPSAib2JqZWN0VHlwZSI7Ci0JCVN0cmluZyBPQkpFQ1RfVFlQRV9DT05WRVJURVJfX0NPTlZFUlNJT05fVkFMVUVTID0gImNvbnZlcnNpb25WYWx1ZXMiOwotCQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19ERUZBVUxUX09CSkVDVF9WQUxVRSA9ICJkZWZhdWx0T2JqZWN0VmFsdWUiOwotCVN0cmluZyBQUklNQVJZX0tFWSA9IFBBQ0tBR0VfICsgIlByaW1hcnlLZXkiOwotCQlTdHJpbmcgUFJJTUFSWV9LRVlfX1ZBTElEQVRJT04gPSAidmFsaWRhdGlvbiI7Ci0JCVN0cmluZyBQUklNQVJZX0tFWV9fQ0FDSEVfS0VZX1RZUEUgPSAiY2FjaGVLZXlUeXBlIjsKLQkJU3RyaW5nIFBSSU1BUllfS0VZX19DT0xVTU5TID0gImNvbHVtbnMiOwotCVN0cmluZyBQUklWQVRFX09XTkVEID0gUEFDS0FHRV8gKyAiUHJpdmF0ZU93bmVkIjsKLQlTdHJpbmcgUkVBRF9PTkxZID0gUEFDS0FHRV8gKyAiUmVhZE9ubHkiOwotCVN0cmluZyBSRUFEX1RSQU5TRk9STUVSID0gUEFDS0FHRV8gKyAiUmVhZFRyYW5zZm9ybWVyIjsKLQkJU3RyaW5nIFJFQURfVFJBTlNGT1JNRVJfX1RSQU5TRk9STUVSX0NMQVNTID0gInRyYW5zZm9ybWVyQ2xhc3MiOwotCQlTdHJpbmcgUkVBRF9UUkFOU0ZPUk1FUl9fTUVUSE9EID0gIm1ldGhvZCI7Ci0JU3RyaW5nIFNUUlVDVF9DT05WRVJURVIgPSBQQUNLQUdFXyArICJTdHJ1Y3RDb252ZXJ0ZXIiOwotCQlTdHJpbmcgU1RSVUNUX0NPTlZFUlRFUl9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIFNUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUiA9ICJjb252ZXJ0ZXIiOwotCVN0cmluZyBUSU1FX09GX0RBWSA9IFBBQ0tBR0VfICsgIlRpbWVPZkRheSI7Ci0JCVN0cmluZyBUSU1FX09GX0RBWV9fSE9VUiA9ICJob3VyIjsKLQkJU3RyaW5nIFRJTUVfT0ZfREFZX19NSU5VVEUgPSAibWludXRlIjsKLQkJU3RyaW5nIFRJTUVfT0ZfREFZX19TRUNPTkQgPSAic2Vjb25kIjsKLQkJU3RyaW5nIFRJTUVfT0ZfREFZX19NSUxMSVNFQ09ORCA9ICJtaWxsaXNlY29uZCI7Ci0JU3RyaW5nIFRSQU5TRk9STUFUSU9OID0gUEFDS0FHRV8gKyAiVHJhbnNmb3JtYXRpb24iOwotCQlTdHJpbmcgVFJBTlNGT1JNQVRJT05fX0ZFVENIID0gImZldGNoIjsKLQkJU3RyaW5nIFRSQU5TRk9STUFUSU9OX19PUFRJT05BTCA9ICJvcHRpb25hbCI7Ci0JU3RyaW5nIFRZUEVfQ09OVkVSVEVSID0gUEFDS0FHRV8gKyAiVHlwZUNvbnZlcnRlciI7Ci0JCVN0cmluZyBUWVBFX0NPTlZFUlRFUl9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIFRZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUgPSAiZGF0YVR5cGUiOwotCQlTdHJpbmcgVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFID0gIm9iamVjdFR5cGUiOwotCVN0cmluZyBWQVJJQUJMRV9PTkVfVE9fT05FID0gUEFDS0FHRV8gKyAiVmFyaWFibGVPbmVUb09uZSI7Ci0JU3RyaW5nIFdSSVRFX1RSQU5TRk9STUVSID0gUEFDS0FHRV8gKyAiV3JpdGVUcmFuc2Zvcm1lciI7Ci0JCVN0cmluZyBXUklURV9UUkFOU0ZPUk1FUl9fVFJBTlNGT1JNRVJfQ0xBU1MgPSAidHJhbnNmb3JtZXJDbGFzcyI7Ci0JCVN0cmluZyBXUklURV9UUkFOU0ZPUk1FUl9fTUVUSE9EID0gIm1ldGhvZCI7Ci0JCVN0cmluZyBXUklURV9UUkFOU0ZPUk1FUl9fQ09MVU1OID0gImNvbHVtbiI7Ci0JU3RyaW5nIFdSSVRFX1RSQU5TRk9STUVSUyA9IFBBQ0tBR0VfICsgIldyaXRlVHJhbnNmb3JtZXJzIjsKLQkJU3RyaW5nIFdSSVRFX1RSQU5TRk9STUVSU19fVkFMVUUgPSAidmFsdWUiOwotCi0JLy8gRWNsaXBzZUxpbmsgZW51bXMKLQlTdHJpbmcgQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEUgPSBQQUNLQUdFXyArICJDYWNoZUNvb3JkaW5hdGlvblR5cGUiOwotCQlTdHJpbmcgQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfID0gQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEUgKyAiLiI7Ci0JCVN0cmluZyBDQUNIRV9DT09SRElOQVRJT05fVFlQRV9fU0VORF9PQkpFQ1RfQ0hBTkdFUyA9IENBQ0hFX0NPT1JESU5BVElPTl9UWVBFXyArICJTRU5EX09CSkVDVF9DSEFOR0VTIjsKLQkJU3RyaW5nIENBQ0hFX0NPT1JESU5BVElPTl9UWVBFX19JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyA9IENBQ0hFX0NPT1JESU5BVElPTl9UWVBFXyArICJJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyI7Ci0JCVN0cmluZyBDQUNIRV9DT09SRElOQVRJT05fVFlQRV9fU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMgPSBDQUNIRV9DT09SRElOQVRJT05fVFlQRV8gKyAiU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMiOwotCQlTdHJpbmcgQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfX05PTkUgPSBDQUNIRV9DT09SRElOQVRJT05fVFlQRV8gKyAiTk9ORSI7Ci0JU3RyaW5nIENBQ0hFX1RZUEUgPSBQQUNLQUdFXyArICJDYWNoZVR5cGUiOwotCQlTdHJpbmcgQ0FDSEVfVFlQRV8gPSBDQUNIRV9UWVBFICsgIi4iOwotCQlTdHJpbmcgQ0FDSEVfVFlQRV9fRlVMTCA9IENBQ0hFX1RZUEVfICsgIkZVTEwiOwotCQlTdHJpbmcgQ0FDSEVfVFlQRV9fV0VBSyA9IENBQ0hFX1RZUEVfICsgIldFQUsiOwotCQlTdHJpbmcgQ0FDSEVfVFlQRV9fU09GVCA9IENBQ0hFX1RZUEVfICsgIlNPRlQiOwotCQlTdHJpbmcgQ0FDSEVfVFlQRV9fU09GVF9XRUFLID0gQ0FDSEVfVFlQRV8gKyAiU09GVF9XRUFLIjsKLQkJU3RyaW5nIENBQ0hFX1RZUEVfX0hBUkRfV0VBSyA9IENBQ0hFX1RZUEVfICsgIkhBUkRfV0VBSyI7Ci0JCVN0cmluZyBDQUNIRV9UWVBFX19DQUNIRSA9IENBQ0hFX1RZUEVfICsgIkNBQ0hFIjsKLQkJU3RyaW5nIENBQ0hFX1RZUEVfX05PTkUgPSBDQUNIRV9UWVBFXyArICJOT05FIjsKLQlTdHJpbmcgQ0hBTkdFX1RSQUNLSU5HX1RZUEUgPSBQQUNLQUdFXyArICJDaGFuZ2VUcmFja2luZ1R5cGUiOwotCQlTdHJpbmcgQ0hBTkdFX1RSQUNLSU5HX1RZUEVfID0gQ0hBTkdFX1RSQUNLSU5HX1RZUEUgKyAiLiI7Ci0JCVN0cmluZyBDSEFOR0VfVFJBQ0tJTkdfVFlQRV9fQVRUUklCVVRFID0gQ0hBTkdFX1RSQUNLSU5HX1RZUEVfICsgIkFUVFJJQlVURSI7Ci0JCVN0cmluZyBDSEFOR0VfVFJBQ0tJTkdfVFlQRV9fT0JKRUNUID0gQ0hBTkdFX1RSQUNLSU5HX1RZUEVfICsgIk9CSkVDVCI7Ci0JCVN0cmluZyBDSEFOR0VfVFJBQ0tJTkdfVFlQRV9fREVGRVJSRUQgPSBDSEFOR0VfVFJBQ0tJTkdfVFlQRV8gKyAiREVGRVJSRUQiOwotCQlTdHJpbmcgQ0hBTkdFX1RSQUNLSU5HX1RZUEVfX0FVVE8gPSBDSEFOR0VfVFJBQ0tJTkdfVFlQRV8gKyAiQVVUTyI7Ci0JU3RyaW5nIEVYSVNURU5DRV9UWVBFID0gUEFDS0FHRV8gKyAiRXhpc3RlbmNlVHlwZSI7Ci0JCVN0cmluZyBFWElTVEVOQ0VfVFlQRV8gPSBFWElTVEVOQ0VfVFlQRSArICIuIjsKLQkJU3RyaW5nIEVYSVNURU5DRV9UWVBFX19DSEVDS19DQUNIRSA9IEVYSVNURU5DRV9UWVBFXyArICJDSEVDS19DQUNIRSI7Ci0JCVN0cmluZyBFWElTVEVOQ0VfVFlQRV9fQ0hFQ0tfREFUQUJBU0UgPSBFWElTVEVOQ0VfVFlQRV8gKyAiQ0hFQ0tfREFUQUJBU0UiOwotCQlTdHJpbmcgRVhJU1RFTkNFX1RZUEVfX0FTU1VNRV9FWElTVEVOQ0UgPSBFWElTVEVOQ0VfVFlQRV8gKyAiQVNTVU1FX0VYSVNURU5DRSI7Ci0JCVN0cmluZyBFWElTVEVOQ0VfVFlQRV9fQVNTVU1FX05PTl9FWElTVEVOQ0UgPSBFWElTVEVOQ0VfVFlQRV8gKyAiQVNTVU1FX05PTl9FWElTVEVOQ0UiOwotCVN0cmluZyBKT0lOX0ZFVENIX1RZUEUgPSBQQUNLQUdFXyArICJKb2luRmV0Y2hUeXBlIjsKLQkJU3RyaW5nIEpPSU5fRkVUQ0hfVFlQRV8gPSBKT0lOX0ZFVENIX1RZUEUgKyAiLiI7Ci0JCVN0cmluZyBKT0lOX0ZFVENIX1RZUEVfX0lOTkVSID0gSk9JTl9GRVRDSF9UWVBFXyArICJJTk5FUiI7Ci0JCVN0cmluZyBKT0lOX0ZFVENIX1RZUEVfX09VVEVSID0gSk9JTl9GRVRDSF9UWVBFXyArICJPVVRFUiI7Ci0KLQotCS8vIEVjbGlzcGVMaW5rIDIuMCBhbm5vdGF0aW9ucwotCVN0cmluZyBNQVBfS0VZX0NPTlZFUlQgPSBQQUNLQUdFXyArICJNYXBLZXlDb252ZXJ0IjsKLQkJU3RyaW5nIE1BUF9LRVlfQ09OVkVSVF9fVkFMVUUgPSAidmFsdWUiOwotCi0KLQkvLyBFY2xpc3BlTGluayAyLjEgYW5ub3RhdGlvbnMKLQlTdHJpbmcgQ0xBU1NfRVhUUkFDVE9SID0gUEFDS0FHRV8gKyAiQ2xhc3NFeHRyYWN0b3IiOwotCQlTdHJpbmcgQ0xBU1NfRVhUUkFDVE9SX19WQUxVRSA9ICJ2YWx1ZSI7Ci0KLQotCS8vIEVjbGlzcGVMaW5rIDIuMiBhbm5vdGF0aW9ucwotCVN0cmluZyBDQUNIRV9fSVNPTEFUSU9OID0gImlzb2xhdGlvbiI7Ci0JU3RyaW5nIENPTlZFUlRFUlMgPSBQQUNLQUdFXyArICJDb252ZXJ0ZXJzIjsKLQkJU3RyaW5nIENPTlZFUlRFUlNfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyA9IFBBQ0tBR0VfICsgIk9iamVjdFR5cGVDb252ZXJ0ZXJzIjsKLQkJU3RyaW5nIE9CSkVDVF9UWVBFX0NPTlZFUlRFUlNfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgU1RSVUNUX0NPTlZFUlRFUlMgPSBQQUNLQUdFXyArICJTdHJ1Y3RDb252ZXJ0ZXJzIjsKLQkJU3RyaW5nIFNUUlVDVF9DT05WRVJURVJTX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIFRZUEVfQ09OVkVSVEVSUyA9IFBBQ0tBR0VfICsgIlR5cGVDb252ZXJ0ZXJzIjsKLQkJU3RyaW5nIFRZUEVfQ09OVkVSVEVSU19fVkFMVUUgPSAidmFsdWUiOwotCi0JLy8gRWNsaXBzZUxpbmsgMi4yIGVudW1zCi0JU3RyaW5nIENBQ0hFX0lTT0xBVElPTl9UWVBFID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvbmZpZy5DYWNoZUlzb2xhdGlvblR5cGUiOwotCQlTdHJpbmcgQ0FDSEVfSVNPTEFUSU9OX1RZUEVfID0gQ0FDSEVfSVNPTEFUSU9OX1RZUEUgKyAiLiI7Ci0JCVN0cmluZyBDQUNIRV9JU09MQVRJT05fVFlQRV9fU0hBUkVEID0gQ0FDSEVfSVNPTEFUSU9OX1RZUEVfICsgIlNIQVJFRCI7Ci0JCVN0cmluZyBDQUNIRV9JU09MQVRJT05fVFlQRV9fUFJPVEVDVEVEID0gQ0FDSEVfSVNPTEFUSU9OX1RZUEVfICsgIlBST1RFQ1RFRCI7Ci0JCVN0cmluZyBDQUNIRV9JU09MQVRJT05fVFlQRV9fSVNPTEFURUQgPSBDQUNIRV9JU09MQVRJT05fVFlQRV8gKyAiSVNPTEFURUQiOwotCi0KLQkvLyBFY2xpc3BlTGluayAyLjMgYW5ub3RhdGlvbnMKLQotCVN0cmluZyBBUlJBWSA9IFBBQ0tBR0VfICsgIkFycmF5IjsKLQotCVN0cmluZyBNVUxUSVRFTkFOVCA9IFBBQ0tBR0VfICsgIk11bHRpdGVuYW50IjsKLQkJU3RyaW5nIE1VTFRJVEVOQU5UX19WQUxVRSA9ICJ2YWx1ZSI7Ci0KLQlTdHJpbmcgTVVMVElURU5BTlRfVFlQRSA9IFBBQ0tBR0VfICsgIk11bHRpdGVuYW50VHlwZSI7Ci0JCVN0cmluZyBNVUxUSVRFTkFOVF9UWVBFXyA9IE1VTFRJVEVOQU5UX1RZUEUgKyAiLiI7Ci0JCVN0cmluZyBNVUxUSVRFTkFOVF9UWVBFX19TSU5HTEVfVEFCTEUgPSBNVUxUSVRFTkFOVF9UWVBFXyArICJTSU5HTEVfVEFCTEUiOwotCQlTdHJpbmcgTVVMVElURU5BTlRfVFlQRV9fVEFCTEVfUEVSX1RFTkFOVCA9IE1VTFRJVEVOQU5UX1RZUEVfICsgIlRBQkxFX1BFUl9URU5BTlQiOwotCQlTdHJpbmcgTVVMVElURU5BTlRfVFlQRV9fVlBEID0gTVVMVElURU5BTlRfVFlQRV8gKyAiVlBEIjsKLQotCVN0cmluZyBTVFJVQ1RVUkUgPSBQQUNLQUdFXyArICJTdHJ1Y3R1cmUiOwotCi0JU3RyaW5nIFRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTiA9IFBBQ0tBR0VfICsgIlRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4iOwotCQlTdHJpbmcgVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19DT05URVhUX1BST1BFUlRZID0gImNvbnRleHRQcm9wZXJ0eSI7Ci0JCVN0cmluZyBURU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0RJU0NSSU1JTkFUT1JfVFlQRSA9ICJkaXNjcmltaW5hdG9yVHlwZSI7Ci0JCVN0cmluZyBURU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gImNvbHVtbkRlZmluaXRpb24iOwotCQlTdHJpbmcgVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19MRU5HVEggPSAibGVuZ3RoIjsKLQkJU3RyaW5nIFRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9fVEFCTEUgPSAidGFibGUiOwotCQlTdHJpbmcgVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19QUklNQVJZX0tFWSA9ICJwcmltYXJ5S2V5IjsKLQotCVN0cmluZyBURU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TID0gUEFDS0FHRV8gKyAiVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMiOwotCQlTdHJpbmcgVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OU19fVkFMVUUgPSAidmFsdWUiOwotCi0KLQkvLyBFY2xpc3BlTGluayAyLjQgYW5ub3RhdGlvbnMKLQlTdHJpbmcgTVVMVElURU5BTlRfX0lOQ0xVREVfQ1JJVEVSSUEgPSAiaW5jbHVkZUNyaXRlcmlhIjsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0FycmF5QW5ub3RhdGlvbjJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0FycmF5QW5ub3RhdGlvbjJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWNjZGJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtBcnJheUFubm90YXRpb24yXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5BcnJheQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtBcnJheUFubm90YXRpb24yXzMKLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuQVJSQVk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQmFzZUNvbnZlcnRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQmFzZUNvbnZlcnRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZTEwMjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2VDb252ZXJ0QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvbW1vbiBwcm90b2NvbCBhbW9uZzo8Y29kZT48dWw+Ci0gKiA8bGk+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ29udmVydAotICogPGxpPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk1hcEtleUNvbnZlcnQKLSAqIDwvdWw+PC9jb2RlPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtCYXNlQ29udmVydEFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBDb252ZXJ0IGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIENvbnZlcnQgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBDb252ZXJ0IGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlICd2YWx1ZScgZWxlbWVudC4KLQkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JYm9vbGVhbiB2YWx1ZVRvdWNoZXMoaW50IHBvcyk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQmFzZVR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQmFzZVR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YzE0MzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2VUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb21tb24gcHJvdG9jb2wgYW1vbmc6PGNvZGU+PHVsPgotICogPGxpPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlR5cGVDb252ZXJ0ZXIKLSAqIDxsaT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5PYmplY3RUeXBlQ29udmVydGVyCi0gKiA8L3VsPjwvY29kZT4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQmFzZVR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbgotewotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZGF0YVR5cGUnIGVsZW1lbnQgb2YgdGhlIFR5cGVDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0RGF0YVR5cGUoKTsKLQkJU3RyaW5nIERBVEFfVFlQRV9QUk9QRVJUWSA9ICJkYXRhVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2RhdGFUeXBlJyBlbGVtZW50IG9mIHRoZSBUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0RGF0YVR5cGUoU3RyaW5nIGRhdGFUeXBlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2RhdGFUeXBlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVHlwZUNvbnZlcnRlciBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXREYXRhVHlwZVRleHRSYW5nZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxseS1xdWFsaWZpZWQgZGF0YSB0eXBlIG5hbWUgYXMgcmVzb2x2ZWQgYnkgdGhlCi0JICogQVNUJ3MgYmluZGluZ3MuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtUeXBlQ29udmVydGVyKGRhdGFUeXBlID0gTXlEYXRhVHlwZS5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiA8Y29kZT4ibW9kZWwuTXlEYXRhVHlwZSI8L2NvZGU+IGlmIHRoZXJlIGlzIGFuIGltcG9ydCBmb3IKLQkgKiA8Y29kZT5tb2RlbC5NeURhdGFUeXBlPC9jb2RlPi4KLQkgKi8KLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWREYXRhVHlwZSgpOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdvYmplY3RUeXBlJyBlbGVtZW50IG9mIHRoZSBUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldE9iamVjdFR5cGUoKTsKLQkJU3RyaW5nIE9CSkVDVF9UWVBFX1BST1BFUlRZID0gIm9iamVjdFR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdvYmplY3RUeXBlJyBlbGVtZW50IG9mIHRoZSBUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0T2JqZWN0VHlwZShTdHJpbmcgb2JqZWN0VHlwZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdvYmplY3RUeXBlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVHlwZUNvbnZlcnRlciBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRPYmplY3RUeXBlVGV4dFJhbmdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5LXF1YWxpZmllZCBvYmplY3QgdHlwZSBuYW1lIGFzIHJlc29sdmVkIGJ5IHRoZQotCSAqIEFTVCdzIGJpbmRpbmdzLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7VHlwZUNvbnZlcnRlcihkYXRhVHlwZSA9IE15T2JqZWN0VHlwZS5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiA8Y29kZT4ibW9kZWwuTXlPYmplY3RUeXBlIjwvY29kZT4gaWYgdGhlcmUgaXMgYW4gaW1wb3J0IGZvcgotCSAqIDxjb2RlPm1vZGVsLk15T2JqZWN0VHlwZTwvY29kZT4uCi0JICovCi0JU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNzNjNGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5CYXNpY0NvbGxlY3Rpb24KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5CQVNJQ19DT0xMRUNUSU9OOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTEyYmQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VsaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkJhc2ljTWFwCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5CQVNJQ19NQVA7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhODcyNjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGU8L2NvZGU+Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5DQUNIRTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndHlwZScgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUNhY2hlVHlwZSBnZXRUeXBlKCk7Ci0JCVN0cmluZyBUWVBFX1BST1BFUlRZID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd0eXBlJyBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFR5cGUoQ2FjaGVUeXBlIHR5cGUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd0eXBlJyBlbGVtZW50LgotCSAqIElmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0KLQkgKiBmb3IgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFR5cGVUZXh0UmFuZ2UoKTsKLQkKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnc2l6ZScgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUludGVnZXIgZ2V0U2l6ZSgpOwotCQlTdHJpbmcgU0laRV9QUk9QRVJUWSA9ICJzaXplIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnc2l6ZScgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRTaXplKEludGVnZXIgc2l6ZSk7Ci0JCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnc2l6ZScgZWxlbWVudC4KLQkgKiBJZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9Ci0JICogZm9yIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRTaXplVGV4dFJhbmdlKCk7Ci0JCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3NoYXJlZCcgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUJvb2xlYW4gZ2V0U2hhcmVkKCk7Ci0JCVN0cmluZyBTSEFSRURfUFJPUEVSVFkgPSAic2hhcmVkIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnc2hhcmVkJyBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFNoYXJlZChCb29sZWFuIHNoYXJlZCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3NoYXJlZCcgZWxlbWVudC4KLQkgKiBJZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9Ci0JICogZm9yIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRTaGFyZWRUZXh0UmFuZ2UoKTsKLQotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdleHBpcnknIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlJbnRlZ2VyIGdldEV4cGlyeSgpOwotCQlTdHJpbmcgRVhQSVJZX1BST1BFUlRZID0gImV4cGlyeSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2V4cGlyeScgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRFeHBpcnkoSW50ZWdlciBleHBpcnkpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdleHBpcnknIGVsZW1lbnQuCi0JICogSWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfQotCSAqIGZvciB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0RXhwaXJ5VGV4dFJhbmdlKCk7Ci0JCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2V4cGlyeVRpbWVPZkRheScgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiBnZXRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJU3RyaW5nIEVYUElSWV9USU1FX09GX0RBWV9QUk9QRVJUWSA9ICJleHBpcnlUaW1lT2ZEYXkiOyAvLyROT04tTkxTLTEkCi0KLQlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gYWRkRXhwaXJ5VGltZU9mRGF5KCk7Ci0KLQl2b2lkIHJlbW92ZUV4cGlyeVRpbWVPZkRheSgpOwotCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2V4cGlyeVRpbWVPZkRheScgZWxlbWVudC4KLQkgKiBJZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9Ci0JICogZm9yIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRFeHBpcnlUaW1lT2ZEYXlUZXh0UmFuZ2UoKTsKLQkKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnYWx3YXlzUmVmcmVzaCcgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUJvb2xlYW4gZ2V0QWx3YXlzUmVmcmVzaCgpOwotCQlTdHJpbmcgQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFkgPSAiYWx3YXlzUmVmcmVzaCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2Fsd2F5c1JlZnJlc2gnIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuIGFsd2F5c1JlZnJlc2gpOwotCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2Fsd2F5c1JlZnJlc2gnIGVsZW1lbnQuCi0JICogSWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfQotCSAqIGZvciB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0QWx3YXlzUmVmcmVzaFRleHRSYW5nZSgpOwotCQotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdyZWZyZXNoT25seUlmTmV3ZXInIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlCb29sZWFuIGdldFJlZnJlc2hPbmx5SWZOZXdlcigpOwotCQlTdHJpbmcgUkVGUkVTSF9PTkxZX0lGX05FV0VSX1BST1BFUlRZID0gInJlZnJlc2hPbmx5SWZOZXdlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3JlZnJlc2hPbmx5SWZOZXdlcicgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXIpOwotCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3JlZnJlc2hPbmx5SWZOZXdlcicgZWxlbWVudC4KLQkgKiBJZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9Ci0JICogZm9yIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRSZWZyZXNoT25seUlmTmV3ZXJUZXh0UmFuZ2UoKTsKLQkKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZGlzYWJsZUhpdHMnIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlCb29sZWFuIGdldERpc2FibGVIaXRzKCk7Ci0JCVN0cmluZyBESVNBQkxFX0hJVFNfUFJPUEVSVFkgPSAiZGlzYWJsZUhpdHMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdkaXNhYmxlSGl0cycgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXREaXNhYmxlSGl0cyhCb29sZWFuIGRpc2FibGVIaXRzKTsKLQkJCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdkaXNhYmxlSGl0cycgZWxlbWVudC4KLQkgKiBJZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9Ci0JICogZm9yIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXREaXNhYmxlSGl0c1RleHRSYW5nZSgpOwotCQotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb29yZGluYXRpb25UeXBlJyBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldENvb3JkaW5hdGlvblR5cGUoKTsKLQkJU3RyaW5nIENPT1JESU5BVElPTl9UWVBFX1BST1BFUlRZID0gImNvb3JkaW5hdGlvblR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb29yZGluYXRpb25UeXBlJyBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldENvb3JkaW5hdGlvblR5cGUoQ2FjaGVDb29yZGluYXRpb25UeXBlIGNvb3JkaW5hdGlvblR5cGUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdjb29yZGluYXRpb25UeXBlJyBlbGVtZW50LgotCSAqIElmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0KLQkgKiBmb3IgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldENvb3JkaW5hdGlvblR5cGVUZXh0UmFuZ2UoKTsKLQotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdpc29sYXRpb24nIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlDYWNoZUlzb2xhdGlvblR5cGUyXzIgZ2V0SXNvbGF0aW9uKCk7Ci0JCVN0cmluZyBJU09MQVRJT05fUFJPUEVSVFkgPSAiaXNvbGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdpc29sYXRpb24nIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0SXNvbGF0aW9uKENhY2hlSXNvbGF0aW9uVHlwZTJfMiBpc29sYXRpb24pOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdpc29sYXRpb24nIGVsZW1lbnQuCi0JICogSWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfQotCSAqIGZvciB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0SXNvbGF0aW9uVGV4dFJhbmdlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYjYxNjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DaGFuZ2VUcmFja2luZzwvY29kZT4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORzsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShDaGFuZ2VUcmFja2luZ1R5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzgwNDc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DbGFzc0V4dHJhY3RvcjwvY29kZT4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLkNMQVNTX0VYVFJBQ1RPUjsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIENsYXNzRXh0cmFjdG9yIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKiBSZXR1cm4gdGhlIHBvcnRpb24gb2YgdGhlIHZhbHVlIHByZWNlZGluZyAiLmNsYXNzIi4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O0NsYXNzRXh0cmFjdG9yKHZhbHVlPU15RXh0cmFjdG9yLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuICJNeUV4dHJhY3RvciIKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgQ2xhc3NFeHRyYWN0b3IgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIENsYXNzRXh0cmFjdG9yIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgYXMgcmVzb2x2ZWQgYnkgdGhlCi0JICogQVNUJ3MgYmluZGluZ3MuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtDbGFzc0V4dHJhY3RvcihNeUV4dHJhY3Rvci5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiA8Y29kZT4ibW9kZWwuTXlFeHRyYWN0b3IiPC9jb2RlPiBpZiB0aGVyZSBpcyBhbiBpbXBvcnQgZm9yCi0JICogPGNvZGU+bW9kZWwuTXlFeHRyYWN0b3I8L2NvZGU+LgotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOTAyZDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJzaW9uVmFsdWU8L2NvZGU+Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24KLQlleHRlbmRzIE5lc3RhYmxlQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5DT05WRVJTSU9OX1ZBTFVFOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdkYXRhVmFsdWUnIGVsZW1lbnQgb2YgdGhlIENvbnZlcnNpb25WYWx1ZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldERhdGFWYWx1ZSgpOwotCQlTdHJpbmcgREFUQV9WQUxVRV9QUk9QRVJUWSA9ICJkYXRhVmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2RhdGFWYWx1ZScgZWxlbWVudCBvZiB0aGUgQ29udmVyc2lvblZhbHVlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0RGF0YVZhbHVlKFN0cmluZyBkYXRhVmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdkYXRhVmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBDb252ZXJzaW9uVmFsdWUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0RGF0YVZhbHVlVGV4dFJhbmdlKCk7Ci0KLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnb2JqZWN0VmFsdWUnIGVsZW1lbnQgb2YgdGhlIENvbnZlcnNpb25WYWx1ZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldE9iamVjdFZhbHVlKCk7Ci0JCVN0cmluZyBPQkpFQ1RfVkFMVUVfUFJPUEVSVFkgPSAib2JqZWN0VmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ29iamVjdFZhbHVlJyBlbGVtZW50IG9mIHRoZSBDb252ZXJzaW9uVmFsdWUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRPYmplY3RWYWx1ZShTdHJpbmcgb2JqZWN0VmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdvYmplY3RWYWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIENvbnZlcnNpb25WYWx1ZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRPYmplY3RWYWx1ZVRleHRSYW5nZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJkNGViYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIDxjb2RlPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnQ8L2NvZGU+Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0Jhc2VDb252ZXJ0QW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5DT05WRVJUOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YjU3YzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ29udmVydGVyPC9jb2RlPgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5DT05WRVJURVI7Ci0JCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY29udmVydGVyQ2xhc3MnIGVsZW1lbnQgb2YgdGhlIENvbnZlcnRlciBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLgotCSAqLwotCVN0cmluZyBnZXRDb252ZXJ0ZXJDbGFzcygpOwotCQlTdHJpbmcgQ09OVkVSVEVSX0NMQVNTX1BST1BFUlRZID0gImNvbnZlcnRlckNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY29udmVydGVyQ2xhc3MnIGVsZW1lbnQgb2YgdGhlIENvbnZlcnRlciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldENvbnZlcnRlckNsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5LXF1YWxpZmllZCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSBhcyByZXNvbHZlZCBieSB0aGUKLQkgKiBBU1QncyBiaW5kaW5ncy4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O0NvbnZlcnRlcihHZW5kZXJDb252ZXJ0ZXIuY2xhc3MpCi0JICogPC9wcmU+Ci0JICogd2lsbCByZXR1cm4gPGNvZGU+Im1vZGVsLkdlbmRlckNvbnZlcnRlciI8L2NvZGU+IGlmIHRoZXJlIGlzIGFuIGltcG9ydCBmb3IKLQkgKiA8Y29kZT5tb2RlbC5HZW5kZXJDb252ZXJ0ZXI8L2NvZGU+LgotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzTmFtZSgpOwotCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2NvbnZlcnRlckNsYXNzJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgQ29udmVydGVyIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldENvbnZlcnRlckNsYXNzVGV4dFJhbmdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29udmVydGVyIGNsYXNzIGltcGxlbWVudHMgdGhlIHNwZWNpZmllZCBpbnRlcmZhY2UuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciNFQ0xJUFNFTElOS19DT05WRVJURVJfQ0xBU1NfTkFNRQotCSAqLwotCWJvb2xlYW4gY29udmVydGVyQ2xhc3NJbXBsZW1lbnRzSW50ZXJmYWNlKFN0cmluZyBpbnRlcmZhY2VOYW1lLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MDU1MzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ3VzdG9taXplcjwvY29kZT4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUjsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIEN1c3RvbWl6ZXIgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBDdXN0b21pemVyIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIGN1c3RvbWl6ZXIgY2xhc3MgbmFtZSBhcyByZXNvbHZlZCBieSB0aGUKLQkgKiBBU1QncyBiaW5kaW5ncy4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O0N1c3RvbWl6ZXIoRW1wbG95ZWVDdXN0b21pemVyLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuIDxjb2RlPiJtb2RlbC5FbXBsb3llZUN1c3RvbWl6ZXIiPC9jb2RlPiBpZiB0aGVyZSBpcyBhbgotCSAqIGltcG9ydCBmb3IgPGNvZGU+bW9kZWwuRW1wbG95ZWVDdXN0b21pemVyPC9jb2RlPi4KLQkgKi8KLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3NOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3ZhbHVlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgQ3VzdG9taXplciBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1c3RvbWl6ZXIgY2xhc3MgaW1wbGVtZW50cyB0aGUgc3BlY2lmaWVkIGludGVyZmFjZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9taXplciNFQ0xJUFNFTElOS19ERVNDUklQVE9SX0NVU1RPTUlaRVJfQ0xBU1NfTkFNRQotCSAqLwotCWJvb2xlYW4gY3VzdG9taXplckNsYXNzSW1wbGVtZW50c0ludGVyZmFjZShTdHJpbmcgaW50ZXJmYWNlTmFtZSwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWZkMzgxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuRXhpc3RlbmNlQ2hlY2tpbmc8L2NvZGU+Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkc7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBFeGlzdGVuY2VDaGVja2luZyBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JRXhpc3RlbmNlVHlwZSBnZXRWYWx1ZSgpOwotCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBFeGlzdGVuY2VDaGVja2luZyBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKEV4aXN0ZW5jZVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIEV4aXN0ZW5jZUNoZWNraW5nIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQwMTBlOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Kb2luRmV0Y2g8L2NvZGU+Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuSk9JTl9GRVRDSDsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIEpvaW5GZXRjaCBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JSm9pbkZldGNoVHlwZSBnZXRWYWx1ZSgpOwotCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBKb2luRmV0Y2ggYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShKb2luRmV0Y2hUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBKb2luRmV0Y2ggYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtNYXBLZXlDb252ZXJ0QW5ub3RhdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua01hcEtleUNvbnZlcnRBbm5vdGF0aW9uMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3M2IzNWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua01hcEtleUNvbnZlcnRBbm5vdGF0aW9uMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5NYXBLZXlDb252ZXJ0PC9jb2RlPgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtNYXBLZXlDb252ZXJ0QW5ub3RhdGlvbjJfMAotCWV4dGVuZHMgRWNsaXBzZUxpbmtCYXNlQ29udmVydEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuTUFQX0tFWV9DT05WRVJUOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2Y5NmUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5NdWx0aXRlbmFudAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMKLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuTVVMVElURU5BTlQ7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYW5ub3RhdGlvbiBleGlzdHMgaW4gSmF2YS4KLQkgKi8KLQlib29sZWFuIGlzU3BlY2lmaWVkKCk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBNdWx0aXRlbmFudCBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JTXVsdGl0ZW5hbnRUeXBlMl8zIGdldFZhbHVlKCk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIE11bHRpdGVuYW50IGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VmFsdWUoTXVsdGl0ZW5hbnRUeXBlMl8zIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBNdWx0aXRlbmFudCBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQotCS8vKioqKioqKioqIGluY2x1ZGUgY3JpdGVyaWEgYWRkZWQgaW4gRWNsaXBzZUxpbmsgMi40ICoqKioqKioqKioKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2luY2x1ZGVDcml0ZXJpYScgZWxlbWVudCBvZiB0aGUgTXVsdGl0ZW5hbnQgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUJvb2xlYW4gZ2V0SW5jbHVkZUNyaXRlcmlhKCk7Ci0JCVN0cmluZyBJTkNMVURFX0NSSVRFUklBX1BST1BFUlRZID0gImluY2x1ZGVDcml0ZXJpYSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnaW5jbHVkZUNyaXRlcmlhJyBlbGVtZW50IG9mIHRoZSBNdWx0aXRlbmFudCBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldEluY2x1ZGVDcml0ZXJpYShCb29sZWFuIGluY2x1ZGVDcml0ZXJpYSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2luY2x1ZGVDcml0ZXJpYScgZWxlbWVudC4KLQkgKiBJZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9Ci0JICogZm9yIHRoZSBNdWx0aXRlbmFudCBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRJbmNsdWRlQ3JpdGVyaWFUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODA4NDIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlbGluayBhbm5vdGF0aW9uCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5NdXRhYmxlPC9jb2RlPgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5NVVRBQkxFOwotCQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBNdXRhYmxlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlCb29sZWFuIGdldFZhbHVlKCk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBNdXRhYmxlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIE11dGFibGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlNDc5OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb21tb24gcHJvdG9jb2wgYW1vbmc6PGNvZGU+PHVsPgotICogPGxpPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnRlcgotICogPGxpPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlN0cnVjdENvbnZlcnRlcgotICogPGxpPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlR5cGVDb252ZXJ0ZXIKLSAqIDxsaT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5PYmplY3RUeXBlQ29udmVydGVyCi0gKiA8L3VsPjwvY29kZT4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbgotCWV4dGVuZHMgTmVzdGFibGVBbm5vdGF0aW9uCi17Ci0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICduYW1lJyBlbGVtZW50IG9mIHRoZSAqQ29udmVydGVyIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbmFtZScgZWxlbWVudCBvZiB0aGUgKkNvbnZlcnRlciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbmFtZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIEN1c3RvbUNvbnZlcnRlciBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDk5Yzg0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuT2JqZWN0VHlwZUNvbnZlcnRlcjwvY29kZT4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24KLQlleHRlbmRzIEVjbGlwc2VMaW5rQmFzZVR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUjsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbnZlcnNpb25WYWx1ZXMnIGVsZW1lbnQgb2YgdGhlIE9iamVjdFR5cGVDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gYW4gZW1wdHkgaXRlcmF0b3IgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlMaXN0SXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBnZXRDb252ZXJzaW9uVmFsdWVzKCk7Ci0JCVN0cmluZyBDT05WRVJTSU9OX1ZBTFVFU19MSVNUID0gImNvbnZlcnNpb25WYWx1ZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb252ZXJzaW9uVmFsdWVzJyBlbGVtZW50IG9mIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICovCi0JaW50IGdldENvbnZlcnNpb25WYWx1ZXNTaXplKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb252ZXJzaW9uVmFsdWVzJyBlbGVtZW50IG9mIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICovCi0JRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGNvbnZlcnNpb25WYWx1ZUF0KGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb252ZXJzaW9uVmFsdWVzJyBlbGVtZW50IG9mIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICovCi0JRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGFkZENvbnZlcnNpb25WYWx1ZShpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY29udmVyc2lvblZhbHVlcycgZWxlbWVudCBvZiB0aGUgT2JqZWN0VHlwZUNvbnZlcnRlciBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgbW92ZUNvbnZlcnNpb25WYWx1ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb252ZXJzaW9uVmFsdWVzJyBlbGVtZW50IG9mIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCByZW1vdmVDb252ZXJzaW9uVmFsdWUoaW50IGluZGV4KTsKLQkKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZGVmYXVsdE9iamVjdFZhbHVlJyBlbGVtZW50IG9mIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCk7Ci0JCVN0cmluZyBERUZBVUxUX09CSkVDVF9WQUxVRV9QUk9QRVJUWSA9ICJkZWZhdWx0T2JqZWN0VmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2RlZmF1bHRPYmplY3RWYWx1ZScgZWxlbWVudCBvZiB0aGUgT2JqZWN0VHlwZUNvbnZlcnRlciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldERlZmF1bHRPYmplY3RWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdkZWZhdWx0T2JqZWN0VmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldERlZmF1bHRPYmplY3RWYWx1ZVRleHRSYW5nZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhMDczMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUHJpbWFyeUtleQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5QUklNQVJZX0tFWTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjk2MzQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUHJpdmF0ZU93bmVkCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsJCi0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLlBSSVZBVEVfT1dORUQ7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMWRhMzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlJlYWRPbmx5Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewkKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuUkVBRF9PTkxZOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNTY4YTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIDxjb2RlPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlJlYWRUcmFuc2Zvcm1lcjwvY29kZT4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbgotCWV4dGVuZHMgRWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTZlYmUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5TdHJ1Y3RDb252ZXJ0ZXI8L2NvZGU+Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24KLQlleHRlbmRzIEVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVI7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbnZlcnRlcicgZWxlbWVudCBvZiB0aGUgU3RydWN0Q29udmVydGVyIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldENvbnZlcnRlcigpOwotCQlTdHJpbmcgQ09OVkVSVEVSX1BST1BFUlRZID0gImNvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY29udmVydGVyJyBlbGVtZW50IG9mIHRoZSBTdHJ1Y3RDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRDb252ZXJ0ZXIoU3RyaW5nIGNvbnZlcnRlcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2NvbnZlcnRlcicgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFN0cnVjdENvbnZlcnRlciBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRDb252ZXJ0ZXJUZXh0UmFuZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtTdHJ1Y3R1cmVBbm5vdGF0aW9uMl8zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rU3RydWN0dXJlQW5ub3RhdGlvbjJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWJiYTFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtTdHJ1Y3R1cmVBbm5vdGF0aW9uMl8zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuU3RydWN0dXJlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1N0cnVjdHVyZUFubm90YXRpb24yXzMKLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuU1RSVUNUVVJFOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA5ZDZkZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjwvY29kZT4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMKLQlleHRlbmRzIERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLCBOZXN0YWJsZUFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OOwotCi0JLy8gKioqKioqKioqKiBjb250ZXh0UHJvcGVydHkgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb250ZXh0UHJvcGVydHknIGVsZW1lbnQgb2YgdGhlIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRDb250ZXh0UHJvcGVydHkoKTsKLQkJU3RyaW5nIENPTlRFWFRfUFJPUEVSVFlfUFJPUEVSVFkgPSAiY29udGV4dFByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb250ZXh0UHJvcGVydHknIGVsZW1lbnQgb2YgdGhlIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRDb250ZXh0UHJvcGVydHkoU3RyaW5nIGNvbnRleHRQcm9wZXJ0eSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2NvbnRleHRQcm9wZXJ0eScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbiBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRDb250ZXh0UHJvcGVydHlUZXh0UmFuZ2UoKTsKLQkKLQkvLyAqKioqKioqKioqIHRhYmxlICoqKioqKioqKioKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndGFibGUnIGVsZW1lbnQgb2YgdGhlIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRUYWJsZSgpOwotCQlTdHJpbmcgVEFCTEVfUFJPUEVSVFkgPSAidGFibGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3RhYmxlJyBlbGVtZW50IG9mIHRoZSBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VGFibGUoU3RyaW5nIHRhYmxlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndGFibGUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50Ci0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ3RhYmxlJyBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIHRhYmxlVG91Y2hlcyhpbnQgcG9zKTsKLQotCS8vICoqKioqKioqKiogcHJpbWFyeUtleSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ByaW1hcnlLZXknIGVsZW1lbnQgb2YgdGhlIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUJvb2xlYW4gZ2V0UHJpbWFyeUtleSgpOwotCQlTdHJpbmcgUFJJTUFSWV9LRVlfUFJPUEVSVFkgPSAicHJpbWFyeUtleSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncHJpbWFyeUtleScgZWxlbWVudCBvZiB0aGUgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFByaW1hcnlLZXkoQm9vbGVhbiBwcmltYXJ5S2V5KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAncHJpbWFyeUtleScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbiBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRQcmltYXJ5S2V5VGV4dFJhbmdlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5MDJjNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVGltZU9mRGF5PC9jb2RlPgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZOwotCi0KLQkvLyAqKioqKioqKioqIGhvdXIgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdob3VyJyBlbGVtZW50IG9mIHRoZSBUaW1lT2ZEYXkgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlJbnRlZ2VyIGdldEhvdXIoKTsKLQkJU3RyaW5nIEhPVVJfUFJPUEVSVFkgPSAiaG91ciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnaG91cicgZWxlbWVudCBvZiB0aGUgVGltZU9mRGF5IGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50IGZyb20gdGhlIGFubm90YXRpb24KLQkgKi8KLQl2b2lkIHNldEhvdXIoSW50ZWdlciBob3VyKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnaG91cicgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRIb3VyVGV4dFJhbmdlKCk7Ci0KLQotCS8vICoqKioqKioqKiogbWludXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbWludXRlJyBlbGVtZW50IG9mIHRoZSBUaW1lT2ZEYXkgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlJbnRlZ2VyIGdldE1pbnV0ZSgpOwotCQlTdHJpbmcgTUlOVVRFX1BST1BFUlRZID0gIm1pbnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbWludXRlJyBlbGVtZW50IG9mIHRoZSBUaW1lT2ZEYXkgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQgZnJvbSB0aGUgYW5ub3RhdGlvbgotCSAqLwotCXZvaWQgc2V0TWludXRlKEludGVnZXIgbWludXRlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbWludXRlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVGltZU9mRGF5IGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE1pbnV0ZVRleHRSYW5nZSgpOwotCi0KLQkvLyAqKioqKioqKioqIHNlY29uZCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3NlY29uZCcgZWxlbWVudCBvZiB0aGUgVGltZU9mRGF5IGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24uCi0JICovCi0JSW50ZWdlciBnZXRTZWNvbmQoKTsKLQkJU3RyaW5nIFNFQ09ORF9QUk9QRVJUWSA9ICJzZWNvbmQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3NlY29uZCcgZWxlbWVudCBvZiB0aGUgVGltZU9mRGF5IGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50IGZyb20gdGhlIGFubm90YXRpb24KLQkgKi8KLQl2b2lkIHNldFNlY29uZChJbnRlZ2VyIHNlY29uZCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3NlY29uZCcgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRTZWNvbmRUZXh0UmFuZ2UoKTsKLQotCi0JLy8gKioqKioqKioqKiBtaWxsaXNlY29uZCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ21pbGxpc2Vjb25kJyBlbGVtZW50IG9mIHRoZSBUaW1lT2ZEYXkgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlJbnRlZ2VyIGdldE1pbGxpc2Vjb25kKCk7Ci0JCVN0cmluZyBNSUxMSVNFQ09ORF9QUk9QRVJUWSA9ICJtaWxsaXNlY29uZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbWlsbGlzZWNvbmQnIGVsZW1lbnQgb2YgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBhbm5vdGF0aW9uCi0JICovCi0Jdm9pZCBzZXRNaWxsaXNlY29uZChJbnRlZ2VyIG1pbGxpc2Vjb25kKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbWlsbGlzZWNvbmQnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBUaW1lT2ZEYXkgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TWlsbGlzZWNvbmRUZXh0UmFuZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3ZjBhMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UcmFuc2Zvcm1hdGlvbjwvY29kZT4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdmZXRjaCcgZWxlbWVudCBvZiB0aGUgVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUZldGNoVHlwZSBnZXRGZXRjaCgpOwotCQlTdHJpbmcgRkVUQ0hfUFJPUEVSVFkgPSAiZmV0Y2giOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2ZldGNoJyBlbGVtZW50IG9mIHRoZSBUcmFuc2Zvcm1hdGlvbiBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldEZldGNoKEZldGNoVHlwZSBmZXRjaCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2ZldGNoJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0RmV0Y2hUZXh0UmFuZ2UoKTsKLQotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdvcHRpb25hbCcgZWxlbWVudCBvZiB0aGUgVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUJvb2xlYW4gZ2V0T3B0aW9uYWwoKTsKLQkJU3RyaW5nIE9QVElPTkFMX1BST1BFUlRZID0gIm9wdGlvbmFsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdvcHRpb25hbCcgZWxlbWVudCBvZiB0aGUgVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG9wdGlvbmFsKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnb3B0aW9uYWwnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBUcmFuc2Zvcm1hdGlvbiBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRPcHRpb25hbFRleHRSYW5nZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGMwZTU2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb21tb24gcHJvdG9jb2wgYW1vbmc6PGNvZGU+PHVsPgotICogPGxpPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlJlYWRUcmFuc2Zvcm1lcgotICogPGxpPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLldyaXRlVHJhbnNmb3JtZXIKLSAqIDwvdWw+PC9jb2RlPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd0cmFuc2Zvcm1lckNsYXNzJyBlbGVtZW50IG9mIHRoZSAqVHJhbnNmb3JtZXIgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqIFJldHVybiB0aGUgcG9ydGlvbiBvZiB0aGUgdmFsdWUgcHJlY2VkaW5nICIuY2xhc3MiLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7UmVhZFRyYW5zZm9ybWVyKHRyYW5zZm9ybWVyQ2xhc3M9RW1wbG95ZWUuY2xhc3MpCi0JICogPC9wcmU+Ci0JICogd2lsbCByZXR1cm4gIkVtcGxveWVlIi4KLQkgKi8KLQlTdHJpbmcgZ2V0VHJhbnNmb3JtZXJDbGFzcygpOwotCQlTdHJpbmcgVFJBTlNGT1JNRVJfQ0xBU1NfUFJPUEVSVFkgPSAidHJhbnNmb3JtZXJDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndHJhbnNmb3JtZXJDbGFzcycgZWxlbWVudCBvZiB0aGUgKlRyYW5zZm9ybWVyIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VHJhbnNmb3JtZXJDbGFzcyhTdHJpbmcgdHJhbnNmb3JtZXJDbGFzcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3RyYW5zZm9ybWVyQ2xhc3MnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAqVHJhbnNmb3JtZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VHJhbnNmb3JtZXJDbGFzc1RleHRSYW5nZSgpOwotCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ21ldGhvZCcgZWxlbWVudCBvZiB0aGUgKlRyYW5zZm9ybWVyIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0TWV0aG9kKCk7Ci0JCVN0cmluZyBNRVRIT0RfUFJPUEVSVFkgPSAibWV0aG9kIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdtZXRob2QnIGVsZW1lbnQgb2YgdGhlICpUcmFuc2Zvcm1lciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldE1ldGhvZChTdHJpbmcgbWV0aG9kKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbWV0aG9kJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKlRyYW5zZm9ybWVyIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE1ldGhvZFRleHRSYW5nZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ0YzRhYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIDxjb2RlPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlR5cGVDb252ZXJ0ZXI8L2NvZGU+Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0Jhc2VUeXBlQ29udmVydGVyQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZTNmNGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5WYXJpYWJsZU9uZVRvT25lCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLlZBUklBQkxFX09ORV9UT19PTkU7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOThkZWU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlbGluayBhbm5vdGF0aW9uCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Xcml0ZVRyYW5zZm9ybWVyPC9jb2RlPgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbgotCWV4dGVuZHMgRWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVI7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbHVtbicgZWxlbWVudCBvZiB0aGUgV3JpdGVUcmFuc2Zvcm1lciBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JQ29sdW1uQW5ub3RhdGlvbiBnZXRDb2x1bW4oKTsKLQkJU3RyaW5nIENPTFVNTl9QUk9QRVJUWSA9ICJjb2x1bW4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBDb2x1bW5Bbm5vdGF0aW9uLCBidXQgZG8gbm90IHJldHVybiBudWxsIGlmIHRoZSAnY29sdW1uJwotCSAqIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb24gdGhlIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGlvbi4gSW5zdGVhZAotCSAqIHJldHVybiBhIG51bGwgb2JqZWN0LgotCSAqLwotCUNvbHVtbkFubm90YXRpb24gZ2V0Tm9uTnVsbENvbHVtbigpOwotCi0JLyoqCi0JICogQWRkIHRoZSAnY29sdW1uJyBlbGVtZW50IHRvIHRoZSBXcml0ZVRyYW5zZm9ybWVyIGFubm90YXRpb24uCi0JICovCi0JQ29sdW1uQW5ub3RhdGlvbiBhZGRDb2x1bW4oKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgJ2NvbHVtbicgZWxlbWVudCBmcm9tIHRoZSBXcml0ZVRyYW5zZm9ybWVyIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCByZW1vdmVDb2x1bW4oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnY29sdW1uJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgV3JpdGVUcmFuc2Zvcm1lciBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRDb2x1bW5UZXh0UmFuZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRXhpc3RlbmNlVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FeGlzdGVuY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNzgyNzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FeGlzdGVuY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBlbnVtCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5FeGlzdGVuY2VUeXBlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGVudW0gRXhpc3RlbmNlVHlwZSB7Ci0KLSAgICBDSEVDS19DQUNIRShFY2xpcHNlTGluay5FWElTVEVOQ0VfVFlQRV9fQ0hFQ0tfQ0FDSEUpLAotICAgIENIRUNLX0RBVEFCQVNFKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9UWVBFX19DSEVDS19EQVRBQkFTRSksCi0gICAgQVNTVU1FX0VYSVNURU5DRShFY2xpcHNlTGluay5FWElTVEVOQ0VfVFlQRV9fQVNTVU1FX0VYSVNURU5DRSksCi0gICAgQVNTVU1FX05PTl9FWElTVEVOQ0UoRWNsaXBzZUxpbmsuRVhJU1RFTkNFX1RZUEVfX0FTU1VNRV9OT05fRVhJU1RFTkNFKTsKLQotCi0JcHJpdmF0ZSBTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZTsKLQotCUV4aXN0ZW5jZVR5cGUoU3RyaW5nIGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlID0gamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFBbm5vdGF0aW9uVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgRXhpc3RlbmNlVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZShPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlyZXR1cm4gKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKGphdmFBbm5vdGF0aW9uVmFsdWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEV4aXN0ZW5jZVR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWZvciAoRXhpc3RlbmNlVHlwZSBleGlzdGVuY2VUeXBlIDogRXhpc3RlbmNlVHlwZS52YWx1ZXMoKSkgewotCQkJaWYgKGV4aXN0ZW5jZVR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpLmVxdWFscyhqYXZhQW5ub3RhdGlvblZhbHVlKSkgewotCQkJCXJldHVybiBleGlzdGVuY2VUeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmF2YUFubm90YXRpb25WYWx1ZShFeGlzdGVuY2VUeXBlIGV4aXN0ZW5jZVR5cGUpIHsKLQkJcmV0dXJuIChleGlzdGVuY2VUeXBlID09IG51bGwpID8gbnVsbCA6IGV4aXN0ZW5jZVR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9Kb2luRmV0Y2hUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0pvaW5GZXRjaFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmViZjgxZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0pvaW5GZXRjaFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGVudW0KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkpvaW5GZXRjaFR5cGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgZW51bSBKb2luRmV0Y2hUeXBlIHsKLQotICAgIElOTkVSKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0hfVFlQRV9fSU5ORVIpLAotICAgIE9VVEVSKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0hfVFlQRV9fT1VURVIpOwotCi0KLQlwcml2YXRlIFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlOwotCi0JSm9pbkZldGNoVHlwZShTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWUgPSBqYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBKb2luRmV0Y2hUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCXJldHVybiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oamF2YUFubm90YXRpb25WYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSm9pbkZldGNoVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJZm9yIChKb2luRmV0Y2hUeXBlIGpvaW5GZXRjaFR5cGUgOiBKb2luRmV0Y2hUeXBlLnZhbHVlcygpKSB7Ci0JCQlpZiAoam9pbkZldGNoVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkuZXF1YWxzKGphdmFBbm5vdGF0aW9uVmFsdWUpKSB7Ci0JCQkJcmV0dXJuIGpvaW5GZXRjaFR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9KYXZhQW5ub3RhdGlvblZhbHVlKEpvaW5GZXRjaFR5cGUgam9pbkZldGNoVHlwZSkgewotCQlyZXR1cm4gKGpvaW5GZXRjaFR5cGUgPT0gbnVsbCkgPyBudWxsIDogam9pbkZldGNoVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL011bHRpdGVuYW50VHlwZTJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9NdWx0aXRlbmFudFR5cGUyXzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2NGViYTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9NdWx0aXRlbmFudFR5cGUyXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgSlBBIGVudW0KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk11bHRpdGVuYW50VHlwZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBlbnVtIE11bHRpdGVuYW50VHlwZTJfMyB7Ci0KLQlTSU5HTEVfVEFCTEUoRWNsaXBzZUxpbmsuTVVMVElURU5BTlRfVFlQRV9fU0lOR0xFX1RBQkxFKSwKLQlUQUJMRV9QRVJfVEVOQU5UKEVjbGlwc2VMaW5rLk1VTFRJVEVOQU5UX1RZUEVfX1RBQkxFX1BFUl9URU5BTlQpLAotCVZQRChFY2xpcHNlTGluay5NVUxUSVRFTkFOVF9UWVBFX19WUEQpOwotCi0KLQlwcml2YXRlIFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlOwotCi0JTXVsdGl0ZW5hbnRUeXBlMl8zKFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuamF2YUFubm90YXRpb25WYWx1ZSA9IGphdmFBbm5vdGF0aW9uVmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIE11bHRpdGVuYW50VHlwZTJfMyBmcm9tSmF2YUFubm90YXRpb25WYWx1ZShPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlyZXR1cm4gKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKGphdmFBbm5vdGF0aW9uVmFsdWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE11bHRpdGVuYW50VHlwZTJfMyBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJZm9yIChNdWx0aXRlbmFudFR5cGUyXzMgbXVsdGl0ZW5hbnRUeXBlIDogTXVsdGl0ZW5hbnRUeXBlMl8zLnZhbHVlcygpKSB7Ci0JCQlpZiAobXVsdGl0ZW5hbnRUeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKS5lcXVhbHMoamF2YUFubm90YXRpb25WYWx1ZSkpIHsKLQkJCQlyZXR1cm4gbXVsdGl0ZW5hbnRUeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmF2YUFubm90YXRpb25WYWx1ZShNdWx0aXRlbmFudFR5cGUyXzMgbXVsdGl0ZW5hbnRUeXBlKSB7Ci0JCXJldHVybiAobXVsdGl0ZW5hbnRUeXBlID09IG51bGwpID8gbnVsbCA6IG11bHRpdGVuYW50VHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vQXR0cmlidXRlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0F0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlMzkwMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vQXR0cmlidXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sQXJyYXlfMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxBdHRyaWJ1dGVzXzJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sU3RydWN0dXJlXzJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGluazJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+Jy4KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0QmFzaWNDb2xsZWN0aW9ucyA8ZW0+QmFzaWMgQ29sbGVjdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRCYXNpY01hcHMgPGVtPkJhc2ljIE1hcHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRUcmFuc2Zvcm1hdGlvbnMgPGVtPlRyYW5zZm9ybWF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldFZhcmlhYmxlT25lVG9PbmVzIDxlbT5WYXJpYWJsZSBPbmUgVG8gT25lczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0QXR0cmlidXRlcygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVzIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzIGltcGxlbWVudHMgWG1sQXR0cmlidXRlc18yXzMKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHJ1Y3R1cmVzKCkgPGVtPlN0cnVjdHVyZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RydWN0dXJlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFN0cnVjdHVyZV8yXzM+IHN0cnVjdHVyZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcnJheXMoKSA8ZW0+QXJyYXlzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFycmF5cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEFycmF5XzJfMz4gYXJyYXlzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzaWNDb2xsZWN0aW9ucygpIDxlbT5CYXNpYyBDb2xsZWN0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNpY0NvbGxlY3Rpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQmFzaWNDb2xsZWN0aW9uPiBiYXNpY0NvbGxlY3Rpb25zOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzaWNNYXBzKCkgPGVtPkJhc2ljIE1hcHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzaWNNYXBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQmFzaWNNYXA+IGJhc2ljTWFwczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zZm9ybWF0aW9ucygpIDxlbT5UcmFuc2Zvcm1hdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHJhbnNmb3JtYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sVHJhbnNmb3JtYXRpb24+IHRyYW5zZm9ybWF0aW9uczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmxlT25lVG9PbmVzKCkgPGVtPlZhcmlhYmxlIE9uZSBUbyBPbmVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmxlT25lVG9PbmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sVmFyaWFibGVPbmVUb09uZT4gdmFyaWFibGVPbmVUb09uZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXR0cmlidXRlcygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuQVRUUklCVVRFUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdHJ1Y3R1cmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFN0cnVjdHVyZV8yXzN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RydWN0dXJlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdHVyZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVzXzJfM19TdHJ1Y3R1cmVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxTdHJ1Y3R1cmVfMl8zPiBnZXRTdHJ1Y3R1cmVzKCkKLQl7Ci0JCWlmIChzdHJ1Y3R1cmVzID09IG51bGwpCi0JCXsKLQkJCXN0cnVjdHVyZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sU3RydWN0dXJlXzJfMz4oWG1sU3RydWN0dXJlXzJfMy5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1NUUlVDVFVSRVMpOwotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFycmF5czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxBcnJheV8yXzN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXJyYXlzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXJyYXlzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlc18yXzNfQXJyYXlzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxBcnJheV8yXzM+IGdldEFycmF5cygpCi0JewotCQlpZiAoYXJyYXlzID09IG51bGwpCi0JCXsKLQkJCWFycmF5cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxBcnJheV8yXzM+KFhtbEFycmF5XzJfMy5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0FSUkFZUyk7Ci0JCX0KLQkJcmV0dXJuIGFycmF5czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNpYyBDb2xsZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2ljIENvbGxlY3Rpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzaWMgQ29sbGVjdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRBdHRyaWJ1dGVzX0Jhc2ljQ29sbGVjdGlvbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEJhc2ljQ29sbGVjdGlvbj4gZ2V0QmFzaWNDb2xsZWN0aW9ucygpCi0JewotCQlpZiAoYmFzaWNDb2xsZWN0aW9ucyA9PSBudWxsKQotCQl7Ci0JCQliYXNpY0NvbGxlY3Rpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEJhc2ljQ29sbGVjdGlvbj4oWG1sQmFzaWNDb2xsZWN0aW9uLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fQkFTSUNfQ09MTEVDVElPTlMpOwotCQl9Ci0JCXJldHVybiBiYXNpY0NvbGxlY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2ljIE1hcHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2ljIE1hcHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNpYyBNYXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0QXR0cmlidXRlc19CYXNpY01hcHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEJhc2ljTWFwPiBnZXRCYXNpY01hcHMoKQotCXsKLQkJaWYgKGJhc2ljTWFwcyA9PSBudWxsKQotCQl7Ci0JCQliYXNpY01hcHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQmFzaWNNYXA+KFhtbEJhc2ljTWFwLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fQkFTSUNfTUFQUyk7Ci0JCX0KLQkJcmV0dXJuIGJhc2ljTWFwczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UcmFuc2Zvcm1hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zZm9ybWF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRyYW5zZm9ybWF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zZm9ybWF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldEF0dHJpYnV0ZXNfVHJhbnNmb3JtYXRpb25zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxUcmFuc2Zvcm1hdGlvbj4gZ2V0VHJhbnNmb3JtYXRpb25zKCkKLQl7Ci0JCWlmICh0cmFuc2Zvcm1hdGlvbnMgPT0gbnVsbCkKLQkJewotCQkJdHJhbnNmb3JtYXRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFRyYW5zZm9ybWF0aW9uPihYbWxUcmFuc2Zvcm1hdGlvbi5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1RSQU5TRk9STUFUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIHRyYW5zZm9ybWF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYXJpYWJsZSBPbmUgVG8gT25lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYXJpYWJsZSBPbmUgVG8gT25lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmxlIE9uZSBUbyBPbmVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0QXR0cmlidXRlc19WYXJpYWJsZU9uZVRvT25lcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sVmFyaWFibGVPbmVUb09uZT4gZ2V0VmFyaWFibGVPbmVUb09uZXMoKQotCXsKLQkJaWYgKHZhcmlhYmxlT25lVG9PbmVzID09IG51bGwpCi0JCXsKLQkJCXZhcmlhYmxlT25lVG9PbmVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFZhcmlhYmxlT25lVG9PbmU+KFhtbFZhcmlhYmxlT25lVG9PbmUuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19WQVJJQUJMRV9PTkVfVE9fT05FUyk7Ci0JCX0KLQkJcmV0dXJuIHZhcmlhYmxlT25lVG9PbmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fU1RSVUNUVVJFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFN0cnVjdHVyZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fQVJSQVlTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QXJyYXlzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0JBU0lDX0NPTExFQ1RJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QmFzaWNDb2xsZWN0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ19NQVBTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QmFzaWNNYXBzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1RSQU5TRk9STUFUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFRyYW5zZm9ybWF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19WQVJJQUJMRV9PTkVfVE9fT05FUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFZhcmlhYmxlT25lVG9PbmVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19TVFJVQ1RVUkVTOgotCQkJCXJldHVybiBnZXRTdHJ1Y3R1cmVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19BUlJBWVM6Ci0JCQkJcmV0dXJuIGdldEFycmF5cygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fQkFTSUNfQ09MTEVDVElPTlM6Ci0JCQkJcmV0dXJuIGdldEJhc2ljQ29sbGVjdGlvbnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0JBU0lDX01BUFM6Ci0JCQkJcmV0dXJuIGdldEJhc2ljTWFwcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fVFJBTlNGT1JNQVRJT05TOgotCQkJCXJldHVybiBnZXRUcmFuc2Zvcm1hdGlvbnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1ZBUklBQkxFX09ORV9UT19PTkVTOgotCQkJCXJldHVybiBnZXRWYXJpYWJsZU9uZVRvT25lcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1NUUlVDVFVSRVM6Ci0JCQkJZ2V0U3RydWN0dXJlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U3RydWN0dXJlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sU3RydWN0dXJlXzJfMz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0FSUkFZUzoKLQkJCQlnZXRBcnJheXMoKS5jbGVhcigpOwotCQkJCWdldEFycmF5cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQXJyYXlfMl8zPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fQkFTSUNfQ09MTEVDVElPTlM6Ci0JCQkJZ2V0QmFzaWNDb2xsZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0QmFzaWNDb2xsZWN0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQmFzaWNDb2xsZWN0aW9uPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fQkFTSUNfTUFQUzoKLQkJCQlnZXRCYXNpY01hcHMoKS5jbGVhcigpOwotCQkJCWdldEJhc2ljTWFwcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQmFzaWNNYXA+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19UUkFOU0ZPUk1BVElPTlM6Ci0JCQkJZ2V0VHJhbnNmb3JtYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRUcmFuc2Zvcm1hdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFRyYW5zZm9ybWF0aW9uPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fVkFSSUFCTEVfT05FX1RPX09ORVM6Ci0JCQkJZ2V0VmFyaWFibGVPbmVUb09uZXMoKS5jbGVhcigpOwotCQkJCWdldFZhcmlhYmxlT25lVG9PbmVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxWYXJpYWJsZU9uZVRvT25lPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fU1RSVUNUVVJFUzoKLQkJCQlnZXRTdHJ1Y3R1cmVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19BUlJBWVM6Ci0JCQkJZ2V0QXJyYXlzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ19DT0xMRUNUSU9OUzoKLQkJCQlnZXRCYXNpY0NvbGxlY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ19NQVBTOgotCQkJCWdldEJhc2ljTWFwcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fVFJBTlNGT1JNQVRJT05TOgotCQkJCWdldFRyYW5zZm9ybWF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fVkFSSUFCTEVfT05FX1RPX09ORVM6Ci0JCQkJZ2V0VmFyaWFibGVPbmVUb09uZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19TVFJVQ1RVUkVTOgotCQkJCXJldHVybiBzdHJ1Y3R1cmVzICE9IG51bGwgJiYgIXN0cnVjdHVyZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fQVJSQVlTOgotCQkJCXJldHVybiBhcnJheXMgIT0gbnVsbCAmJiAhYXJyYXlzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0JBU0lDX0NPTExFQ1RJT05TOgotCQkJCXJldHVybiBiYXNpY0NvbGxlY3Rpb25zICE9IG51bGwgJiYgIWJhc2ljQ29sbGVjdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fQkFTSUNfTUFQUzoKLQkJCQlyZXR1cm4gYmFzaWNNYXBzICE9IG51bGwgJiYgIWJhc2ljTWFwcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19UUkFOU0ZPUk1BVElPTlM6Ci0JCQkJcmV0dXJuIHRyYW5zZm9ybWF0aW9ucyAhPSBudWxsICYmICF0cmFuc2Zvcm1hdGlvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fVkFSSUFCTEVfT05FX1RPX09ORVM6Ci0JCQkJcmV0dXJuIHZhcmlhYmxlT25lVG9PbmVzICE9IG51bGwgJiYgIXZhcmlhYmxlT25lVG9PbmVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZXNfMl8zLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fU1RSVUNUVVJFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX0FUVFJJQlVURVNfMjNfX1NUUlVDVFVSRVM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fQVJSQVlTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfQVRUUklCVVRFU18yM19fQVJSQVlTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlc18yXzMuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX0FUVFJJQlVURVNfMjNfX1NUUlVDVFVSRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fU1RSVUNUVVJFUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX0FUVFJJQlVURVNfMjNfX0FSUkFZUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19BUlJBWVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxYbWxBdHRyaWJ1dGVNYXBwaW5nPiBnZXRBdHRyaWJ1dGVNYXBwaW5ncygpIHsKLQkJLy8gY29udmVydCBsaXN0cyB0byBhcnJheXMgdG8gYXZvaWQgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiB3aGlsZSBhZGRpbmcgdG8gcmVzdWx0IGxpc3QKLQkJQXJyYXlMaXN0PFhtbEF0dHJpYnV0ZU1hcHBpbmc+IGF0dHJpYnV0ZU1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxYbWxBdHRyaWJ1dGVNYXBwaW5nPigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldElkcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0RW1iZWRkZWRJZHMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldEJhc2ljcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0QmFzaWNDb2xsZWN0aW9ucygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0QmFzaWNNYXBzKCkudG9BcnJheShFTVBUWV9YTUxfQVRUUklCVVRFX01BUFBJTkdfQVJSQVkpKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhdHRyaWJ1dGVNYXBwaW5ncywgdGhpcy5nZXRWZXJzaW9ucygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0TWFueVRvT25lcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0T25lVG9NYW55cygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0T25lVG9PbmVzKCkudG9BcnJheShFTVBUWV9YTUxfQVRUUklCVVRFX01BUFBJTkdfQVJSQVkpKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhdHRyaWJ1dGVNYXBwaW5ncywgdGhpcy5nZXRWYXJpYWJsZU9uZVRvT25lcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0TWFueVRvTWFueXMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0RW1iZWRkZWRzKCkudG9BcnJheShFTVBUWV9YTUxfQVRUUklCVVRFX01BUFBJTkdfQVJSQVkpKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhdHRyaWJ1dGVNYXBwaW5ncywgdGhpcy5nZXRUcmFuc2Zvcm1hdGlvbnMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldFRyYW5zaWVudHMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldEFycmF5cygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0U3RydWN0dXJlcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCXJldHVybiBhdHRyaWJ1dGVNYXBwaW5nczsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFhtbEF0dHJpYnV0ZU1hcHBpbmdbXSBFTVBUWV9YTUxfQVRUUklCVVRFX01BUFBJTkdfQVJSQVkgPSBuZXcgWG1sQXR0cmlidXRlTWFwcGluZ1swXTsKLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXMoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIGJ1aWxkVHJhbnNsYXRvcigKLQkJCUVjbGlwc2VMaW5rLkFUVFJJQlVURVMsIAotCQkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVHlwZU1hcHBpbmdfQXR0cmlidXRlcygpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCVhtbElkLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5JRCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19JZHMoKSksCi0JCQlYbWxFbWJlZGRlZElkLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5FTUJFRERFRF9JRCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19FbWJlZGRlZElkcygpKSwKLQkJCVhtbEJhc2ljLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5CQVNJQywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19CYXNpY3MoKSksCi0JCQlYbWxCYXNpY0NvbGxlY3Rpb24uYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLkJBU0lDX0NPTExFQ1RJT04sIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19CYXNpY0NvbGxlY3Rpb25zKCkpLAotCQkJWG1sQmFzaWNNYXAuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLkJBU0lDX01BUCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX0Jhc2ljTWFwcygpKSwKLQkJCVhtbFZlcnNpb24uYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLlZFUlNJT04sIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfVmVyc2lvbnMoKSksCi0JCQlYbWxNYW55VG9PbmUuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLk1BTllfVE9fT05FLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX01hbnlUb09uZXMoKSksCi0JCQlYbWxPbmVUb01hbnkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLk9ORV9UT19NQU5ZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX09uZVRvTWFueXMoKSksCi0JCQlYbWxPbmVUb09uZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuT05FX1RPX09ORSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19PbmVUb09uZXMoKSksCi0JCQlYbWxWYXJpYWJsZU9uZVRvT25lLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5WQVJJQUJMRV9PTkVfVE9fT05FLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfVmFyaWFibGVPbmVUb09uZXMoKSksCi0JCQlYbWxNYW55VG9NYW55LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5NQU5ZX1RPX01BTlksIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfTWFueVRvTWFueXMoKSksCi0JCQlYbWxFbGVtZW50Q29sbGVjdGlvbi5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlc18yXzBfRWxlbWVudENvbGxlY3Rpb25zKCkpLAotCQkJWG1sRW1iZWRkZWQuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLkVNQkVEREVELCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX0VtYmVkZGVkcygpKSwKLQkJCVhtbFRyYW5zZm9ybWF0aW9uLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5UUkFOU0ZPUk1BVElPTiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX1RyYW5zZm9ybWF0aW9ucygpKSwKLQkJCVhtbFRyYW5zaWVudC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuVFJBTlNJRU5ULCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX1RyYW5zaWVudHMoKSksCi0JCQlYbWxTdHJ1Y3R1cmUuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8zLlNUUlVDVFVSRSwgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlc18yXzNfU3RydWN0dXJlcygpKSwKLQkJCVhtbEFycmF5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMy5BUlJBWSwgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlc18yXzNfQXJyYXlzKCkpLAotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9DYWNoZUNvb3JkaW5hdGlvblR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9DYWNoZUNvb3JkaW5hdGlvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5M2VjMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vQ2FjaGVDb29yZGluYXRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5DYWNoZSBDb29yZGluYXRpb24gVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0Q2FjaGVDb29yZGluYXRpb25UeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBDYWNoZUNvb3JkaW5hdGlvblR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+U0VORCBPQkpFQ1QgQ0hBTkdFUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRU5EX09CSkVDVF9DSEFOR0VTX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JU0VORF9PQkpFQ1RfQ0hBTkdFUygwLCAiU0VORF9PQkpFQ1RfQ0hBTkdFUyIsICJTRU5EX09CSkVDVF9DSEFOR0VTIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTlZBTElEQVRFIENIQU5HRUQgT0JKRUNUUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUU19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUlOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKDEsICJJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyIsICJJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U0VORCBORVcgT0JKRUNUUyBXSVRIIENIQU5HRVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVNfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUygyLCAiU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMiLCAiU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9ORV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCU5PTkUoMywgIk5PTkUiLCAiTk9ORSIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U0VORCBPQkpFQ1QgQ0hBTkdFUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U0VORCBPQkpFQ1QgQ0hBTkdFUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRU5EX09CSkVDVF9DSEFOR0VTCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VORF9PQkpFQ1RfQ0hBTkdFU19WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTlZBTElEQVRFIENIQU5HRUQgT0JKRUNUUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU5WQUxJREFURSBDSEFOR0VEIE9CSkVDVFM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUU19WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TRU5EIE5FVyBPQkpFQ1RTIFdJVEggQ0hBTkdFUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U0VORCBORVcgT0JKRUNUUyBXSVRIIENIQU5HRVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFU19WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05PTkUKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FX1ZBTFVFID0gMzsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5DYWNoZSBDb29yZGluYXRpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2FjaGVDb29yZGluYXRpb25UeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IENhY2hlQ29vcmRpbmF0aW9uVHlwZVtdCi0JCXsKLQkJCVNFTkRfT0JKRUNUX0NIQU5HRVMsCi0JCQlJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywKLQkJCVNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLAotCQkJTk9ORSwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5DYWNoZSBDb29yZGluYXRpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PENhY2hlQ29vcmRpbmF0aW9uVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5DYWNoZSBDb29yZGluYXRpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJQ2FjaGVDb29yZGluYXRpb25UeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNhY2hlIENvb3JkaW5hdGlvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlDYWNoZUNvb3JkaW5hdGlvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5DYWNoZSBDb29yZGluYXRpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXQoaW50IHZhbHVlKQotCXsKLQkJc3dpdGNoICh2YWx1ZSkKLQkJewotCQkJY2FzZSBTRU5EX09CSkVDVF9DSEFOR0VTX1ZBTFVFOiByZXR1cm4gU0VORF9PQkpFQ1RfQ0hBTkdFUzsKLQkJCWNhc2UgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFNfVkFMVUU6IHJldHVybiBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUzsKLQkJCWNhc2UgU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVNfVkFMVUU6IHJldHVybiBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUzsKLQkJCWNhc2UgTk9ORV9WQUxVRTogcmV0dXJuIE5PTkU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENhY2hlQ29vcmRpbmF0aW9uVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkKLQl7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JICByZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKQotCXsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci0JCi19IC8vQ2FjaGVDb29yZGluYXRpb25UeXBlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vQ2FjaGVUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vQ2FjaGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMzVhZjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0NhY2hlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0Q2FjaGVUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBDYWNoZVR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+RlVMTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGVUxMX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JRlVMTCgwLCAiRlVMTCIsICJGVUxMIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5XRUFLPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1dFQUtfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlXRUFLKDEsICJXRUFLIiwgIldFQUsiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNPRlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU09GVF9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVNPRlQoMiwgIlNPRlQiLCAiU09GVCIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U09GVCBXRUFLPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NPRlRfV0VBS19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVNPRlRfV0VBSygzLCAiU09GVF9XRUFLIiwgIlNPRlRfV0VBSyIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SEFSRCBXRUFLPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0hBUkRfV0VBS19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUhBUkRfV0VBSyg0LCAiSEFSRF9XRUFLIiwgIkhBUkRfV0VBSyIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0FDSEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ0FDSEVfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlDQUNIRSg1LCAiQ0FDSEUiLCAiQ0FDSEUiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9ORV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCU5PTkUoNiwgIk5PTkUiLCAiTk9ORSIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RlVMTDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RlVMTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGVUxMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlVMTF9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5XRUFLPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5XRUFLPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1dFQUsKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXRUFLX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNPRlQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNPRlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU09GVAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPRlRfVkFMVUUgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U09GVCBXRUFLPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TT0ZUIFdFQUs8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU09GVF9XRUFLCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09GVF9XRUFLX1ZBTFVFID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkhBUkQgV0VBSzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SEFSRCBXRUFLPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0hBUkRfV0VBSwotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBUkRfV0VBS19WQUxVRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DQUNIRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q0FDSEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ0FDSEUKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUNIRV9WQUxVRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05PTkUKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FX1ZBTFVFID0gNjsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5DYWNoZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDYWNoZVR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgQ2FjaGVUeXBlW10KLQkJewotCQkJRlVMTCwKLQkJCVdFQUssCi0JCQlTT0ZULAotCQkJU09GVF9XRUFLLAotCQkJSEFSRF9XRUFLLAotCQkJQ0FDSEUsCi0JCQlOT05FLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkNhY2hlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxDYWNoZVR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q2FjaGUgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENhY2hlVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJQ2FjaGVUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNhY2hlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDYWNoZVR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUNhY2hlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNhY2hlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDYWNoZVR5cGUgZ2V0KGludCB2YWx1ZSkKLQl7Ci0JCXN3aXRjaCAodmFsdWUpCi0JCXsKLQkJCWNhc2UgRlVMTF9WQUxVRTogcmV0dXJuIEZVTEw7Ci0JCQljYXNlIFdFQUtfVkFMVUU6IHJldHVybiBXRUFLOwotCQkJY2FzZSBTT0ZUX1ZBTFVFOiByZXR1cm4gU09GVDsKLQkJCWNhc2UgU09GVF9XRUFLX1ZBTFVFOiByZXR1cm4gU09GVF9XRUFLOwotCQkJY2FzZSBIQVJEX1dFQUtfVkFMVUU6IHJldHVybiBIQVJEX1dFQUs7Ci0JCQljYXNlIENBQ0hFX1ZBTFVFOiByZXR1cm4gQ0FDSEU7Ci0JCQljYXNlIE5PTkVfVkFMVUU6IHJldHVybiBOT05FOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDYWNoZVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpCi0JewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKLQl7Ci0JICByZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCQotfSAvL0NhY2hlVHlwZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0VjbGlwc2VMaW5rLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlZTRhMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGluawotCWV4dGVuZHMgSlBBCi17Ci0JU3RyaW5nIFNDSEVNQV9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSI7Ci0JU3RyaW5nIFNDSEVNQV9MT0NBVElPTiA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfb3JtXzFfMC54c2QiOwotCVN0cmluZyBTQ0hFTUFfVkVSU0lPTiA9ICIxLjAiOwotCQotCS8vIEVjbGlwc2VMaW5rIHNwZWNpZmljIG5vZGVzCi0JCi0JU3RyaW5nIEFDQ0VTU19NRVRIT0RTID0gImFjY2Vzcy1tZXRob2RzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBQ0NFU1NfTUVUSE9EU19fR0VUX01FVEhPRCA9ICJnZXQtbWV0aG9kIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBQ0NFU1NfTUVUSE9EU19fU0VUX01FVEhPRCA9ICJzZXQtbWV0aG9kIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBCQVNJQ19DT0xMRUNUSU9OID0gImJhc2ljLWNvbGxlY3Rpb24iOyAgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBCQVNJQ19NQVAgPSAiYmFzaWMtbWFwIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgQ0FDSEUgPSAiY2FjaGUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDQUNIRV9fRVhQSVJZID0gImV4cGlyeSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENBQ0hFX19TSVpFID0gInNpemUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDQUNIRV9fU0hBUkVEID0gInNoYXJlZCI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENBQ0hFX19UWVBFID0gInR5cGUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDQUNIRV9fQUxXQVlTX1JFRlJFU0ggPSAiYWx3YXlzLXJlZnJlc2giOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDQUNIRV9fUkVGUkVTSF9PTkxZX0lGX05FV0VSID0gInJlZnJlc2gtb25seS1pZi1uZXdlciI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENBQ0hFX19ESVNBQkxFX0hJVFMgPSAiZGlzYWJsZS1oaXRzIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ0FDSEVfX0NPT1JESU5BVElPTl9UWVBFID0gImNvb3JkaW5hdGlvbi10eXBlIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgQ0hBTkdFX1RSQUNLSU5HID0gImNoYW5nZS10cmFja2luZyI7ICAvLyROT04tTkxTLTEkCi0JCQotCVN0cmluZyBDT05WRVJTSU9OX1ZBTFVFID0gImNvbnZlcnNpb24tdmFsdWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTlZFUlNJT05fVkFMVUVfX0RBVEFfVkFMVUUgPSAiZGF0YS12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ09OVkVSU0lPTl9WQUxVRV9fT0JKRUNUX1ZBTFVFID0gIm9iamVjdC12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBDT05WRVJUID0gImNvbnZlcnQiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIENPTlZFUlRFUiA9ICJjb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTlZFUlRFUl9fQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTlZFUlRFUl9fTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBDT1BZX1BPTElDWSA9ICJjb3B5LXBvbGljeSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIENPUFlfUE9MSUNZX19DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgQ0xPTkVfQ09QWV9QT0xJQ1kgPSAiY2xvbmUtY29weS1wb2xpY3kiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBDTE9ORV9DT1BZX1BPTElDWV9fTUVUSE9EID0gIm1ldGhvZCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIENMT05FX0NPUFlfUE9MSUNZX19XT1JLSU5HX0NPUFlfTUVUSE9EID0gIndvcmtpbmctY29weS1tZXRob2QiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIENVU1RPTUlaRVIgPSAiY3VzdG9taXplciI7ICAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTID0gImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyI7ICAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgRVhJU1RFTkNFX0NIRUNLSU5HID0gImV4aXN0ZW5jZS1jaGVja2luZyI7ICAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIEVYUElSWV9USU1FX09GX0RBWSA9ICJleHBpcnktdGltZS1vZi1kYXkiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBFWFBJUllfVElNRV9PRl9EQVlfX0hPVVIgPSAiaG91ciI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVYUElSWV9USU1FX09GX0RBWV9fTUlOVVRFID0gIm1pbnV0ZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVYUElSWV9USU1FX09GX0RBWV9fU0VDT05EID0gInNlY29uZCI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVYUElSWV9USU1FX09GX0RBWV9fTUlMTElTRUNPTkQgPSAibWlsbGlzZWNvbmQiOyAgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBJTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZID0gImluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgSk9JTl9GRVRDSCA9ICJqb2luLWZldGNoIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgTVVUQUJMRSA9ICJtdXRhYmxlIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWSA9ICJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fSElOVCA9ICJoaW50IjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX0NMQVNTID0gInJlc3VsdC1jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIE5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9TRVRfTUFQUElORyA9ICJyZXN1bHQtc2V0LW1hcHBpbmciOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBOQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QUk9DRURVUkVfTkFNRSA9ICJwcm9jZWR1cmUtbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIE5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFVFVSTlNfUkVTVUxUX1NFVCA9ICJyZXR1cm5zLXJlc3VsdC1zZXQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BBUkFNRVRFUiA9ICJwYXJhbWV0ZXIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBQQVJBTUVURVJfX0RJUkVDVElPTiA9ICJkaXJlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBQQVJBTUVURVJfX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIFBBUkFNRVRFUl9fUVVFUllfUEFSQU1FVEVSID0gInF1ZXJ5LXBhcmFtZXRlciI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIFBBUkFNRVRFUl9fVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgUEFSQU1FVEVSX19KREJDX1RZUEUgPSAiamRiYy10eXBlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgUEFSQU1FVEVSX19KREJDX1RZUEVfTkFNRSA9ICJqZGJjLXR5cGUtbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0KLQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSID0gIm9iamVjdC10eXBlLWNvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFID0gImRhdGEtdHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSA9ICJvYmplY3QtdHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19ERUZBVUxUX09CSkVDVF9WQUxVRSA9ICJkZWZhdWx0LW9iamVjdC12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBPUFRJTUlTVElDX0xPQ0tJTkcgPSAib3B0aW1pc3RpYy1sb2NraW5nIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgT1BUSU1JU1RJQ19MT0NLSU5HX19TRUxFQ1RFRF9DT0xVTU4gPSAic2VsZWN0ZWQtY29sdW1uIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgT1BUSU1JU1RJQ19MT0NLSU5HX19UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBPUFRJTUlTVElDX0xPQ0tJTkdfX0NBU0NBREUgPSAiY2FzY2FkZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBQUklWQVRFX09XTkVEID0gInByaXZhdGUtb3duZWQiOyAgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBQUk9QRVJUWSA9ICJwcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUFJPUEVSVFlfX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUFJPUEVSVFlfX1ZBTFVFID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQUk9QRVJUWV9fVkFMVUVfVFlQRSA9ICJ2YWx1ZS10eXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBSRUFEX09OTFkgPSAicmVhZC1vbmx5IjsgIC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlTdHJpbmcgU1RSVUNUX0NPTlZFUlRFUiA9ICJzdHJ1Y3QtY29udmVydGVyIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTVFJVQ1RfQ09OVkVSVEVSX19OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUiA9ICJjb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIFRSQU5TRk9STUFUSU9OID0gInRyYW5zZm9ybWF0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBUWVBFID0gInR5cGUiOyAgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBUWVBFX0NPTlZFUlRFUiA9ICJ0eXBlLWNvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVFlQRV9DT05WRVJURVJfX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSA9ICJkYXRhLXR5cGUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSA9ICJvYmplY3QtdHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JU3RyaW5nIFZBUklBQkxFX09ORV9UT19PTkUgPSAidmFyaWFibGUtb25lLXRvLW9uZSI7ICAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBWQVJJQUJMRV9PTkVfVE9fT05FX19UQVJHRVRfSU5URVJGQUNFID0gInRhcmdldC1pbnRlcmZhY2UiOyAgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0VjbGlwc2VMaW5rT3JtRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0VjbGlwc2VMaW5rT3JtRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGE2YmFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9FY2xpcHNlTGlua09ybUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1GYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnlJbXBsCi17Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRWNsaXBzZUxpbmtPcm1GYWN0b3J5IGVJTlNUQU5DRSA9IGluaXQoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtRmFjdG9yeSBpbml0KCkKLQl7Ci0JCXRyeQotCQl7Ci0JCQlFY2xpcHNlTGlua09ybUZhY3RvcnkgdGhlRWNsaXBzZUxpbmtPcm1GYWN0b3J5ID0gKEVjbGlwc2VMaW5rT3JtRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgianB0LmVjbGlwc2VsaW5rLm9ybS54bWkiKTsgCi0JCQlpZiAodGhlRWNsaXBzZUxpbmtPcm1GYWN0b3J5ICE9IG51bGwpCi0JCQl7Ci0JCQkJcmV0dXJuIHRoZUVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKLQkJewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybUZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybUZhY3RvcnkoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykKLQl7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFM6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxBY2Nlc3NNZXRob2RzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQURESVRJT05BTF9DUklURVJJQTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEFkZGl0aW9uYWxDcml0ZXJpYSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQXJyYXkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVM6IHJldHVybiAoRU9iamVjdCljcmVhdGVBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUM6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxCYXNpYygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxCYXNpY0NvbGxlY3Rpb24oKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVA6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxCYXNpY01hcCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQmF0Y2hGZXRjaCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQ2FjaGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9JTkRFWDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbENhY2hlSW5kZXgoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DSEFOR0VfVFJBQ0tJTkc6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxDaGFuZ2VUcmFja2luZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NMT05FX0NPUFlfUE9MSUNZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQ2xvbmVDb3B5UG9saWN5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09MTEVDVElPTl9UQUJMRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlNJT05fVkFMVUU6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxDb252ZXJzaW9uVmFsdWUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxDb252ZXJ0ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT1BZX1BPTElDWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbENvcHlQb2xpY3koKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DVVNUT01JWkVSOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQ3VzdG9taXplcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEVtYmVkZGFibGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEVtYmVkZGVkKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSUQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxFbWJlZGRlZElkKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sRW50aXR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sRW50aXR5TWFwcGluZ3MoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9BVFRSSUJVVEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxGZXRjaEF0dHJpYnV0ZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sRmV0Y2hHcm91cCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0hBU0hfUEFSVElUSU9OSU5HOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sSGFzaFBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sSWQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JTkRFWDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEluZGV4KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEpvaW5UYWJsZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE1hbnlUb01hbnkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE1hbnlUb09uZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sTWFwcGVkU3VwZXJjbGFzcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VTFRJVEVOQU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sTXVsdGl0ZW5hbnQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9DT05WRVJURVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxOYW1lZENvbnZlcnRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9GVU5DVElPTl9RVUVSWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUlk6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sT25lVG9NYW55KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE9uZVRvT25lKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sT3B0aW1pc3RpY0xvY2tpbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU46IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxPcmRlckNvbHVtbigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BBUlRJVElPTklORzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFM6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEE6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BJTk5FRF9QQVJUSVRJT05JTkc6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxQaW5uZWRQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QTFNRTF9SRUNPUkQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxQbHNxbFJlY29yZCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BMU1FMX1RBQkxFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sUGxzcWxUYWJsZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sUHJpbWFyeUtleSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sUHJvcGVydHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFF1ZXJ5UmVkaXJlY3RvcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9SQU5HRV9QQVJUSVRJT05JTkc6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxSYW5nZVBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUkVUVVJOX0lOU0VSVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFJldHVybkluc2VydCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxTZWNvbmRhcnlUYWJsZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sU3RydWN0KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVFVSRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFN0cnVjdHVyZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RBQkxFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sVGFibGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxUYWJsZUdlbmVyYXRvcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFRpbWVPZkRheSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sVHJhbnNmb3JtYXRpb24oKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxUcmFuc2llbnQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9VTklPTl9QQVJUSVRJT05JTkc6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxVbmlvblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBTFVFX1BBUlRJVElPTklORzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFZhbHVlUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFZhcmlhYmxlT25lVG9PbmUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sVmVyc2lvbigpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUNhY2hlQ29vcmRpbmF0aW9uVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQ0FDSEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ2FjaGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0hBTkdFX1RSQUNLSU5HX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVhtbENoYW5nZVRyYWNraW5nVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0RJUkVDVElPTjoKLQkJCQlyZXR1cm4gY3JlYXRlWG1sRGlyZWN0aW9uRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5FWElTVEVOQ0VfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRXhpc3RlbmNlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fRkVUQ0hfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlWG1sSm9pbkZldGNoVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19UWVBFOgotCQkJCXJldHVybiBjcmVhdGVYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkNBQ0hFX0NPT1JESU5BVElPTl9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q2FjaGVDb29yZGluYXRpb25UeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkNBQ0hFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRDYWNoZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NIQU5HRV9UUkFDS0lOR19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0WG1sQ2hhbmdlVHJhY2tpbmdUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9ESVJFQ1RJT046Ci0JCQkJcmV0dXJuIGNvbnZlcnRYbWxEaXJlY3Rpb25Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuRVhJU1RFTkNFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRFeGlzdGVuY2VUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX0ZFVENIX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRYbWxKb2luRmV0Y2hUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBjcmVhdGVYbWxBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgeG1sQWNjZXNzTWV0aG9kcyA9IG5ldyBYbWxBY2Nlc3NNZXRob2RzKCk7Ci0JCXJldHVybiB4bWxBY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBZGRpdGlvbmFsQ3JpdGVyaWEgY3JlYXRlWG1sQWRkaXRpb25hbENyaXRlcmlhKCkKLQl7Ci0JCVhtbEFkZGl0aW9uYWxDcml0ZXJpYSB4bWxBZGRpdGlvbmFsQ3JpdGVyaWEgPSBuZXcgWG1sQWRkaXRpb25hbENyaXRlcmlhKCk7Ci0JCXJldHVybiB4bWxBZGRpdGlvbmFsQ3JpdGVyaWE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFycmF5IGNyZWF0ZVhtbEFycmF5KCkKLQl7Ci0JCVhtbEFycmF5IHhtbEFycmF5ID0gbmV3IFhtbEFycmF5KCk7Ci0JCXJldHVybiB4bWxBcnJheTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlcyBjcmVhdGVBdHRyaWJ1dGVzKCkKLQl7Ci0JCUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVzKCk7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxCYXNpYyBjcmVhdGVYbWxCYXNpYygpCi0JewotCQlYbWxCYXNpYyB4bWxCYXNpYyA9IG5ldyBYbWxCYXNpYygpOwotCQlyZXR1cm4geG1sQmFzaWM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEJhc2ljQ29sbGVjdGlvbiBjcmVhdGVYbWxCYXNpY0NvbGxlY3Rpb24oKQotCXsKLQkJWG1sQmFzaWNDb2xsZWN0aW9uIHhtbEJhc2ljQ29sbGVjdGlvbiA9IG5ldyBYbWxCYXNpY0NvbGxlY3Rpb24oKTsKLQkJcmV0dXJuIHhtbEJhc2ljQ29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQmFzaWNNYXAgY3JlYXRlWG1sQmFzaWNNYXAoKQotCXsKLQkJWG1sQmFzaWNNYXAgeG1sQmFzaWNNYXAgPSBuZXcgWG1sQmFzaWNNYXAoKTsKLQkJcmV0dXJuIHhtbEJhc2ljTWFwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxCYXRjaEZldGNoIGNyZWF0ZVhtbEJhdGNoRmV0Y2goKQotCXsKLQkJWG1sQmF0Y2hGZXRjaCB4bWxCYXRjaEZldGNoID0gbmV3IFhtbEJhdGNoRmV0Y2goKTsKLQkJcmV0dXJuIHhtbEJhdGNoRmV0Y2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENhY2hlIGNyZWF0ZVhtbENhY2hlKCkKLQl7Ci0JCVhtbENhY2hlIHhtbENhY2hlID0gbmV3IFhtbENhY2hlKCk7Ci0JCXJldHVybiB4bWxDYWNoZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ2FjaGVJbmRleCBjcmVhdGVYbWxDYWNoZUluZGV4KCkKLQl7Ci0JCVhtbENhY2hlSW5kZXggeG1sQ2FjaGVJbmRleCA9IG5ldyBYbWxDYWNoZUluZGV4KCk7Ci0JCXJldHVybiB4bWxDYWNoZUluZGV4OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDaGFuZ2VUcmFja2luZyBjcmVhdGVYbWxDaGFuZ2VUcmFja2luZygpCi0JewotCQlYbWxDaGFuZ2VUcmFja2luZyB4bWxDaGFuZ2VUcmFja2luZyA9IG5ldyBYbWxDaGFuZ2VUcmFja2luZygpOwotCQlyZXR1cm4geG1sQ2hhbmdlVHJhY2tpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENsb25lQ29weVBvbGljeSBjcmVhdGVYbWxDbG9uZUNvcHlQb2xpY3koKQotCXsKLQkJWG1sQ2xvbmVDb3B5UG9saWN5IHhtbENsb25lQ29weVBvbGljeSA9IG5ldyBYbWxDbG9uZUNvcHlQb2xpY3koKTsKLQkJcmV0dXJuIHhtbENsb25lQ29weVBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ29sbGVjdGlvblRhYmxlIGNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpCi0JewotCQlYbWxDb2xsZWN0aW9uVGFibGUgeG1sQ29sbGVjdGlvblRhYmxlID0gbmV3IFhtbENvbGxlY3Rpb25UYWJsZSgpOwotCQlyZXR1cm4geG1sQ29sbGVjdGlvblRhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDb252ZXJzaW9uVmFsdWUgY3JlYXRlWG1sQ29udmVyc2lvblZhbHVlKCkKLQl7Ci0JCVhtbENvbnZlcnNpb25WYWx1ZSB4bWxDb252ZXJzaW9uVmFsdWUgPSBuZXcgWG1sQ29udmVyc2lvblZhbHVlKCk7Ci0JCXJldHVybiB4bWxDb252ZXJzaW9uVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENvbnZlcnRlciBjcmVhdGVYbWxDb252ZXJ0ZXIoKQotCXsKLQkJWG1sQ29udmVydGVyIHhtbENvbnZlcnRlciA9IG5ldyBYbWxDb252ZXJ0ZXIoKTsKLQkJcmV0dXJuIHhtbENvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ29weVBvbGljeSBjcmVhdGVYbWxDb3B5UG9saWN5KCkKLQl7Ci0JCVhtbENvcHlQb2xpY3kgeG1sQ29weVBvbGljeSA9IG5ldyBYbWxDb3B5UG9saWN5KCk7Ci0JCXJldHVybiB4bWxDb3B5UG9saWN5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDdXN0b21pemVyIGNyZWF0ZVhtbEN1c3RvbWl6ZXIoKQotCXsKLQkJWG1sQ3VzdG9taXplciB4bWxDdXN0b21pemVyID0gbmV3IFhtbEN1c3RvbWl6ZXIoKTsKLQkJcmV0dXJuIHhtbEN1c3RvbWl6ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnRDb2xsZWN0aW9uIGNyZWF0ZVhtbEVsZW1lbnRDb2xsZWN0aW9uKCkKLQl7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uIHhtbEVsZW1lbnRDb2xsZWN0aW9uID0gbmV3IFhtbEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCXJldHVybiB4bWxFbGVtZW50Q29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sRW1iZWRkYWJsZSBjcmVhdGVYbWxFbWJlZGRhYmxlKCkKLQl7Ci0JCVhtbEVtYmVkZGFibGUgeG1sRW1iZWRkYWJsZSA9IG5ldyBYbWxFbWJlZGRhYmxlKCk7Ci0JCXJldHVybiB4bWxFbWJlZGRhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxFbWJlZGRlZCBjcmVhdGVYbWxFbWJlZGRlZCgpCi0JewotCQlYbWxFbWJlZGRlZCB4bWxFbWJlZGRlZCA9IG5ldyBYbWxFbWJlZGRlZCgpOwotCQlyZXR1cm4geG1sRW1iZWRkZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEVtYmVkZGVkSWQgY3JlYXRlWG1sRW1iZWRkZWRJZCgpCi0JewotCQlYbWxFbWJlZGRlZElkIHhtbEVtYmVkZGVkSWQgPSBuZXcgWG1sRW1iZWRkZWRJZCgpOwotCQlyZXR1cm4geG1sRW1iZWRkZWRJZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sRW50aXR5IGNyZWF0ZVhtbEVudGl0eSgpCi0JewotCQlYbWxFbnRpdHkgeG1sRW50aXR5ID0gbmV3IFhtbEVudGl0eSgpOwotCQlyZXR1cm4geG1sRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxFbnRpdHlNYXBwaW5ncyBjcmVhdGVYbWxFbnRpdHlNYXBwaW5ncygpCi0JewotCQlYbWxFbnRpdHlNYXBwaW5ncyB4bWxFbnRpdHlNYXBwaW5ncyA9IG5ldyBYbWxFbnRpdHlNYXBwaW5ncygpOwotCQlyZXR1cm4geG1sRW50aXR5TWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEZldGNoQXR0cmlidXRlIGNyZWF0ZVhtbEZldGNoQXR0cmlidXRlKCkKLQl7Ci0JCVhtbEZldGNoQXR0cmlidXRlIHhtbEZldGNoQXR0cmlidXRlID0gbmV3IFhtbEZldGNoQXR0cmlidXRlKCk7Ci0JCXJldHVybiB4bWxGZXRjaEF0dHJpYnV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sRmV0Y2hHcm91cCBjcmVhdGVYbWxGZXRjaEdyb3VwKCkKLQl7Ci0JCVhtbEZldGNoR3JvdXAgeG1sRmV0Y2hHcm91cCA9IG5ldyBYbWxGZXRjaEdyb3VwKCk7Ci0JCXJldHVybiB4bWxGZXRjaEdyb3VwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxJZCBjcmVhdGVYbWxJZCgpCi0JewotCQlYbWxJZCB4bWxJZCA9IG5ldyBYbWxJZCgpOwotCQlyZXR1cm4geG1sSWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEluZGV4IGNyZWF0ZVhtbEluZGV4KCkKLQl7Ci0JCVhtbEluZGV4IHhtbEluZGV4ID0gbmV3IFhtbEluZGV4KCk7Ci0JCXJldHVybiB4bWxJbmRleDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgY3JlYXRlWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCXsKLQkJWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgeG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPSBuZXcgWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKTsKLQkJcmV0dXJuIHhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxKb2luVGFibGUgY3JlYXRlWG1sSm9pblRhYmxlKCkKLQl7Ci0JCVhtbEpvaW5UYWJsZSB4bWxKb2luVGFibGUgPSBuZXcgWG1sSm9pblRhYmxlKCk7Ci0JCXJldHVybiB4bWxKb2luVGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE1hbnlUb01hbnkgY3JlYXRlWG1sTWFueVRvTWFueSgpCi0JewotCQlYbWxNYW55VG9NYW55IHhtbE1hbnlUb01hbnkgPSBuZXcgWG1sTWFueVRvTWFueSgpOwotCQlyZXR1cm4geG1sTWFueVRvTWFueTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sTWFueVRvT25lIGNyZWF0ZVhtbE1hbnlUb09uZSgpCi0JewotCQlYbWxNYW55VG9PbmUgeG1sTWFueVRvT25lID0gbmV3IFhtbE1hbnlUb09uZSgpOwotCQlyZXR1cm4geG1sTWFueVRvT25lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxNYXBwZWRTdXBlcmNsYXNzIGNyZWF0ZVhtbE1hcHBlZFN1cGVyY2xhc3MoKQotCXsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyB4bWxNYXBwZWRTdXBlcmNsYXNzID0gbmV3IFhtbE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJcmV0dXJuIHhtbE1hcHBlZFN1cGVyY2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE11bHRpdGVuYW50IGNyZWF0ZVhtbE11bHRpdGVuYW50KCkKLQl7Ci0JCVhtbE11bHRpdGVuYW50IHhtbE11bHRpdGVuYW50ID0gbmV3IFhtbE11bHRpdGVuYW50KCk7Ci0JCXJldHVybiB4bWxNdWx0aXRlbmFudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sTmFtZWRDb252ZXJ0ZXIgY3JlYXRlWG1sTmFtZWRDb252ZXJ0ZXIoKQotCXsKLQkJWG1sTmFtZWRDb252ZXJ0ZXIgeG1sTmFtZWRDb252ZXJ0ZXIgPSBuZXcgWG1sTmFtZWRDb252ZXJ0ZXIoKTsKLQkJcmV0dXJuIHhtbE5hbWVkQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeSBjcmVhdGVYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeSgpCi0JewotCQlYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeSB4bWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeSA9IG5ldyBYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeSgpOwotCQlyZXR1cm4geG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeSBjcmVhdGVYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQotCXsKLQkJWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5IHhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeSA9IG5ldyBYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnkoKTsKLQkJcmV0dXJuIHhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5IGNyZWF0ZVhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeSgpCi0JewotCQlYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnkgeG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5ID0gbmV3IFhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeSgpOwotCQlyZXR1cm4geG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGNyZWF0ZVhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQotCXsKLQkJWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSB4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5ID0gbmV3IFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKTsKLQkJcmV0dXJuIHhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JewotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIHhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBuZXcgWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlyZXR1cm4geG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sT25lVG9NYW55IGNyZWF0ZVhtbE9uZVRvTWFueSgpCi0JewotCQlYbWxPbmVUb01hbnkgeG1sT25lVG9NYW55ID0gbmV3IFhtbE9uZVRvTWFueSgpOwotCQlyZXR1cm4geG1sT25lVG9NYW55OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxPbmVUb09uZSBjcmVhdGVYbWxPbmVUb09uZSgpCi0JewotCQlYbWxPbmVUb09uZSB4bWxPbmVUb09uZSA9IG5ldyBYbWxPbmVUb09uZSgpOwotCQlyZXR1cm4geG1sT25lVG9PbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE9wdGltaXN0aWNMb2NraW5nIGNyZWF0ZVhtbE9wdGltaXN0aWNMb2NraW5nKCkKLQl7Ci0JCVhtbE9wdGltaXN0aWNMb2NraW5nIHhtbE9wdGltaXN0aWNMb2NraW5nID0gbmV3IFhtbE9wdGltaXN0aWNMb2NraW5nKCk7Ci0JCXJldHVybiB4bWxPcHRpbWlzdGljTG9ja2luZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sT3JkZXJDb2x1bW4gY3JlYXRlWG1sT3JkZXJDb2x1bW4oKQotCXsKLQkJWG1sT3JkZXJDb2x1bW4geG1sT3JkZXJDb2x1bW4gPSBuZXcgWG1sT3JkZXJDb2x1bW4oKTsKLQkJcmV0dXJuIHhtbE9yZGVyQ29sdW1uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBjcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpCi0JewotCQlYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyB4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IG5ldyBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkKLQl7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gbmV3IFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCXJldHVybiB4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUHJpbWFyeUtleSBjcmVhdGVYbWxQcmltYXJ5S2V5KCkKLQl7Ci0JCVhtbFByaW1hcnlLZXkgeG1sUHJpbWFyeUtleSA9IG5ldyBYbWxQcmltYXJ5S2V5KCk7Ci0JCXJldHVybiB4bWxQcmltYXJ5S2V5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxQcm9wZXJ0eSBjcmVhdGVYbWxQcm9wZXJ0eSgpCi0JewotCQlYbWxQcm9wZXJ0eSB4bWxQcm9wZXJ0eSA9IG5ldyBYbWxQcm9wZXJ0eSgpOwotCQlyZXR1cm4geG1sUHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFF1ZXJ5UmVkaXJlY3RvcnMgY3JlYXRlWG1sUXVlcnlSZWRpcmVjdG9ycygpCi0JewotCQlYbWxRdWVyeVJlZGlyZWN0b3JzIHhtbFF1ZXJ5UmVkaXJlY3RvcnMgPSBuZXcgWG1sUXVlcnlSZWRpcmVjdG9ycygpOwotCQlyZXR1cm4geG1sUXVlcnlSZWRpcmVjdG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUmV0dXJuSW5zZXJ0IGNyZWF0ZVhtbFJldHVybkluc2VydCgpCi0JewotCQlYbWxSZXR1cm5JbnNlcnQgeG1sUmV0dXJuSW5zZXJ0ID0gbmV3IFhtbFJldHVybkluc2VydCgpOwotCQlyZXR1cm4geG1sUmV0dXJuSW5zZXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxTZWNvbmRhcnlUYWJsZSBjcmVhdGVYbWxTZWNvbmRhcnlUYWJsZSgpCi0JewotCQlYbWxTZWNvbmRhcnlUYWJsZSB4bWxTZWNvbmRhcnlUYWJsZSA9IG5ldyBYbWxTZWNvbmRhcnlUYWJsZSgpOwotCQlyZXR1cm4geG1sU2Vjb25kYXJ5VGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBjcmVhdGVYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKQotCXsKLQkJWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIHhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciA9IG5ldyBYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKTsKLQkJcmV0dXJuIHhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sU3RydWN0IGNyZWF0ZVhtbFN0cnVjdCgpCi0JewotCQlYbWxTdHJ1Y3QgeG1sU3RydWN0ID0gbmV3IFhtbFN0cnVjdCgpOwotCQlyZXR1cm4geG1sU3RydWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxTdHJ1Y3RDb252ZXJ0ZXIgY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCkKLQl7Ci0JCVhtbFN0cnVjdENvbnZlcnRlciB4bWxTdHJ1Y3RDb252ZXJ0ZXIgPSBuZXcgWG1sU3RydWN0Q29udmVydGVyKCk7Ci0JCXJldHVybiB4bWxTdHJ1Y3RDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFN0cnVjdHVyZSBjcmVhdGVYbWxTdHJ1Y3R1cmUoKQotCXsKLQkJWG1sU3RydWN0dXJlIHhtbFN0cnVjdHVyZSA9IG5ldyBYbWxTdHJ1Y3R1cmUoKTsKLQkJcmV0dXJuIHhtbFN0cnVjdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVGFibGUgY3JlYXRlWG1sVGFibGUoKQotCXsKLQkJWG1sVGFibGUgeG1sVGFibGUgPSBuZXcgWG1sVGFibGUoKTsKLQkJcmV0dXJuIHhtbFRhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxUYWJsZUdlbmVyYXRvciBjcmVhdGVYbWxUYWJsZUdlbmVyYXRvcigpCi0JewotCQlYbWxUYWJsZUdlbmVyYXRvciB4bWxUYWJsZUdlbmVyYXRvciA9IG5ldyBYbWxUYWJsZUdlbmVyYXRvcigpOwotCQlyZXR1cm4geG1sVGFibGVHZW5lcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4gY3JlYXRlWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpCi0JewotCQlYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uIHhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4gPSBuZXcgWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlyZXR1cm4geG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVGltZU9mRGF5IGNyZWF0ZVhtbFRpbWVPZkRheSgpCi0JewotCQlYbWxUaW1lT2ZEYXkgeG1sVGltZU9mRGF5ID0gbmV3IFhtbFRpbWVPZkRheSgpOwotCQlyZXR1cm4geG1sVGltZU9mRGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxUcmFuc2Zvcm1hdGlvbiBjcmVhdGVYbWxUcmFuc2Zvcm1hdGlvbigpCi0JewotCQlYbWxUcmFuc2Zvcm1hdGlvbiB4bWxUcmFuc2Zvcm1hdGlvbiA9IG5ldyBYbWxUcmFuc2Zvcm1hdGlvbigpOwotCQlyZXR1cm4geG1sVHJhbnNmb3JtYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFRyYW5zaWVudCBjcmVhdGVYbWxUcmFuc2llbnQoKQotCXsKLQkJWG1sVHJhbnNpZW50IHhtbFRyYW5zaWVudCA9IG5ldyBYbWxUcmFuc2llbnQoKTsKLQkJcmV0dXJuIHhtbFRyYW5zaWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVHlwZUNvbnZlcnRlciBjcmVhdGVYbWxUeXBlQ29udmVydGVyKCkKLQl7Ci0JCVhtbFR5cGVDb252ZXJ0ZXIgeG1sVHlwZUNvbnZlcnRlciA9IG5ldyBYbWxUeXBlQ29udmVydGVyKCk7Ci0JCXJldHVybiB4bWxUeXBlQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxWYXJpYWJsZU9uZVRvT25lIGNyZWF0ZVhtbFZhcmlhYmxlT25lVG9PbmUoKQotCXsKLQkJWG1sVmFyaWFibGVPbmVUb09uZSB4bWxWYXJpYWJsZU9uZVRvT25lID0gbmV3IFhtbFZhcmlhYmxlT25lVG9PbmUoKTsKLQkJcmV0dXJuIHhtbFZhcmlhYmxlT25lVG9PbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFZlcnNpb24gY3JlYXRlWG1sVmVyc2lvbigpCi0JewotCQlYbWxWZXJzaW9uIHhtbFZlcnNpb24gPSBuZXcgWG1sVmVyc2lvbigpOwotCQlyZXR1cm4geG1sVmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSGFzaFBhcnRpdGlvbmluZyBjcmVhdGVYbWxIYXNoUGFydGl0aW9uaW5nKCkKLQl7Ci0JCVhtbEhhc2hQYXJ0aXRpb25pbmcgeG1sSGFzaFBhcnRpdGlvbmluZyA9IG5ldyBYbWxIYXNoUGFydGl0aW9uaW5nKCk7Ci0JCXJldHVybiB4bWxIYXNoUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxQYXJ0aXRpb25pbmcgY3JlYXRlWG1sUGFydGl0aW9uaW5nKCkKLQl7Ci0JCVhtbFBhcnRpdGlvbmluZyB4bWxQYXJ0aXRpb25pbmcgPSBuZXcgWG1sUGFydGl0aW9uaW5nKCk7Ci0JCXJldHVybiB4bWxQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBpbm5lZFBhcnRpdGlvbmluZyBjcmVhdGVYbWxQaW5uZWRQYXJ0aXRpb25pbmcoKQotCXsKLQkJWG1sUGlubmVkUGFydGl0aW9uaW5nIHhtbFBpbm5lZFBhcnRpdGlvbmluZyA9IG5ldyBYbWxQaW5uZWRQYXJ0aXRpb25pbmcoKTsKLQkJcmV0dXJuIHhtbFBpbm5lZFBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGxzcWxSZWNvcmQgY3JlYXRlWG1sUGxzcWxSZWNvcmQoKQotCXsKLQkJWG1sUGxzcWxSZWNvcmQgeG1sUGxzcWxSZWNvcmQgPSBuZXcgWG1sUGxzcWxSZWNvcmQoKTsKLQkJcmV0dXJuIHhtbFBsc3FsUmVjb3JkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxQbHNxbFRhYmxlIGNyZWF0ZVhtbFBsc3FsVGFibGUoKQotCXsKLQkJWG1sUGxzcWxUYWJsZSB4bWxQbHNxbFRhYmxlID0gbmV3IFhtbFBsc3FsVGFibGUoKTsKLQkJcmV0dXJuIHhtbFBsc3FsVGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJhbmdlUGFydGl0aW9uaW5nIGNyZWF0ZVhtbFJhbmdlUGFydGl0aW9uaW5nKCkKLQl7Ci0JCVhtbFJhbmdlUGFydGl0aW9uaW5nIHhtbFJhbmdlUGFydGl0aW9uaW5nID0gbmV3IFhtbFJhbmdlUGFydGl0aW9uaW5nKCk7Ci0JCXJldHVybiB4bWxSYW5nZVBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmcgY3JlYXRlWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCXsKLQkJWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmcgeG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPSBuZXcgWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKTsKLQkJcmV0dXJuIHhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nIGNyZWF0ZVhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCXsKLQkJWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZyB4bWxSb3VuZFJvYmluUGFydGl0aW9uaW5nID0gbmV3IFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKTsKLQkJcmV0dXJuIHhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFVuaW9uUGFydGl0aW9uaW5nIGNyZWF0ZVhtbFVuaW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCVhtbFVuaW9uUGFydGl0aW9uaW5nIHhtbFVuaW9uUGFydGl0aW9uaW5nID0gbmV3IFhtbFVuaW9uUGFydGl0aW9uaW5nKCk7Ci0JCXJldHVybiB4bWxVbmlvblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVmFsdWVQYXJ0aXRpb25pbmcgY3JlYXRlWG1sVmFsdWVQYXJ0aXRpb25pbmcoKQotCXsKLQkJWG1sVmFsdWVQYXJ0aXRpb25pbmcgeG1sVmFsdWVQYXJ0aXRpb25pbmcgPSBuZXcgWG1sVmFsdWVQYXJ0aXRpb25pbmcoKTsKLQkJcmV0dXJuIHhtbFZhbHVlUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYWNoZUNvb3JkaW5hdGlvblR5cGUgY3JlYXRlQ2FjaGVDb29yZGluYXRpb25UeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJQ2FjaGVDb29yZGluYXRpb25UeXBlIHJlc3VsdCA9IENhY2hlQ29vcmRpbmF0aW9uVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q2FjaGVDb29yZGluYXRpb25UeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2FjaGVUeXBlIGNyZWF0ZUNhY2hlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCUNhY2hlVHlwZSByZXN1bHQgPSBDYWNoZVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydENhY2hlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENoYW5nZVRyYWNraW5nVHlwZSBjcmVhdGVYbWxDaGFuZ2VUcmFja2luZ1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlYbWxDaGFuZ2VUcmFja2luZ1R5cGUgcmVzdWx0ID0gWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRYbWxDaGFuZ2VUcmFja2luZ1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxEaXJlY3Rpb24gY3JlYXRlWG1sRGlyZWN0aW9uRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJWG1sRGlyZWN0aW9uIHJlc3VsdCA9IFhtbERpcmVjdGlvbi5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0WG1sRGlyZWN0aW9uVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXhpc3RlbmNlVHlwZSBjcmVhdGVFeGlzdGVuY2VUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJRXhpc3RlbmNlVHlwZSByZXN1bHQgPSBFeGlzdGVuY2VUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRFeGlzdGVuY2VUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSm9pbkZldGNoVHlwZSBjcmVhdGVYbWxKb2luRmV0Y2hUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJWG1sSm9pbkZldGNoVHlwZSByZXN1bHQgPSBYbWxKb2luRmV0Y2hUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRYbWxKb2luRmV0Y2hUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIGNyZWF0ZVhtbE9wdGltaXN0aWNMb2NraW5nVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCVhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSByZXN1bHQgPSBYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtUGFja2FnZSBnZXRFY2xpcHNlTGlua09ybVBhY2thZ2UoKQotCXsKLQkJcmV0dXJuIChFY2xpcHNlTGlua09ybVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua09ybVBhY2thZ2UgZ2V0UGFja2FnZSgpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMTdiNTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0VjbGlwc2VMaW5rT3JtUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlSW1wbAotewotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTkFNRSA9ICJvcm0iOwotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5TX1VSSSA9ICJqcHQuZWNsaXBzZWxpbmsub3JtLnhtaSI7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtIjsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmluaXQoKTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kcyA8ZW0+WG1sIEFjY2VzcyBNZXRob2RzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FDQ0VTU19NRVRIT0RTID0gMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2V0IE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FDQ0VTU19NRVRIT0RTX19HRVRfTUVUSE9EID0gMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2V0IE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FDQ0VTU19NRVRIT0RTX19TRVRfTUVUSE9EID0gMTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEFjY2VzcyBNZXRob2RzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FDQ0VTU19NRVRIT0RTX0ZFQVRVUkVfQ09VTlQgPSAyOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzSG9sZGVyIDxlbT5YbWwgQWNjZXNzIE1ldGhvZHMgSG9sZGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzSG9sZGVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUiA9IDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUyA9IDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBBY2Nlc3MgTWV0aG9kcyBIb2xkZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX0ZFQVRVUkVfQ09VTlQgPSAxOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBZGRpdGlvbmFsQ3JpdGVyaWEgPGVtPlhtbCBBZGRpdGlvbmFsIENyaXRlcmlhPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBZGRpdGlvbmFsQ3JpdGVyaWEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFkZGl0aW9uYWxDcml0ZXJpYSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BRERJVElPTkFMX0NSSVRFUklBID0gMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3JpdGVyaWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BRERJVElPTkFMX0NSSVRFUklBX19DUklURVJJQSA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0FERElUSU9OQUxfQ1JJVEVSSUFfMjJfX0NSSVRFUklBOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQWRkaXRpb25hbCBDcml0ZXJpYTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BRERJVElPTkFMX0NSSVRFUklBX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9BRERJVElPTkFMX0NSSVRFUklBXzIyX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBcnJheSA8ZW0+WG1sIEFycmF5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBcnJheQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQXJyYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVJSQVkgPSAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BUlJBWV9fQUNDRVNTID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FSUkFZX19OQU1FID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVJSQVlfX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FSUkFZX19QUk9QRVJUSUVTID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVJSQVlfX0FUVFJJQlVURV9UWVBFID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FSUkFZX19DT05WRVJURVJTID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVJSQVlfX1RZUEVfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BUlJBWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVJSQVlfX1NUUlVDVF9DT05WRVJURVJTID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvYjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FSUkFZX19MT0IgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BUlJBWV9fVEVNUE9SQUwgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FSUkFZX19FTlVNRVJBVEVEID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FSUkFZX19DT0xVTU4gPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRhdGFiYXNlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BUlJBWV9fREFUQUJBU0VfVFlQRSA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVJSQVlfX1RBUkdFVF9DTEFTUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FSUkFZX19DT05WRVJUID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDEzOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQXJyYXk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVJSQVlfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxNDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZyA8ZW0+WG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9NQVBQSU5HID0gNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX01BUFBJTkdfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfTUFQUElOR19fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BVFRSSUJVVEVfVFlQRSA9IE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzIDxlbT5BdHRyaWJ1dGVzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFUyA9IDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19ERVNDUklQVElPTiA9IE9ybVBhY2thZ2UuQVRUUklCVVRFU19fREVTQ1JJUFRJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgQ29sbGVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fRUxFTUVOVF9DT0xMRUNUSU9OUyA9IE9ybVBhY2thZ2UuQVRUUklCVVRFU19fRUxFTUVOVF9DT0xMRUNUSU9OUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0lEUyA9IE9ybVBhY2thZ2UuQVRUUklCVVRFU19fSURTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbWJlZGRlZCBJZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fRU1CRURERURfSURTID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX19FTUJFRERFRF9JRFM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2ljczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19CQVNJQ1MgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0JBU0lDUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fVkVSU0lPTlMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1ZFUlNJT05TOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW55IFRvIE9uZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fTUFOWV9UT19PTkVTID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX19NQU5ZX1RPX09ORVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9uZSBUbyBNYW55czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19PTkVfVE9fTUFOWVMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX09ORV9UT19NQU5ZUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T25lIFRvIE9uZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fT05FX1RPX09ORVMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX09ORV9UT19PTkVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW55IFRvIE1hbnlzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX01BTllfVE9fTUFOWVMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX01BTllfVE9fTUFOWVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVtYmVkZGVkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19FTUJFRERFRFMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VNQkVEREVEUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNpZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19UUkFOU0lFTlRTID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX19UUkFOU0lFTlRTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3R1cmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX1NUUlVDVFVSRVMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFycmF5czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19BUlJBWVMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2ljIENvbGxlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0JBU0lDX0NPTExFQ1RJT05TID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNpYyBNYXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0JBU0lDX01BUFMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zZm9ybWF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19UUkFOU0ZPUk1BVElPTlMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmxlIE9uZSBUbyBPbmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX1ZBUklBQkxFX09ORV9UT19PTkVTID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGVzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX0ZFQVRVUkVfQ09VTlQgKyA2OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyA8ZW0+WG1sIEJhc2ljPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUMgPSA2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19OQU1FID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19DT0xVTU4gPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09MVU1OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fTE9CID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfX0xPQjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fVEVNUE9SQUwgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEVNUE9SQUw7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fRU5VTUVSQVRFRCA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX19FTlVNRVJBVEVEOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX19GRVRDSDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fT1BUSU9OQUwgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT1BUSU9OQUw7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19TRVFVRU5DRV9HRU5FUkFUT1IgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX1RBQkxFX0dFTkVSQVRPUiA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZWQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fR0VORVJBVEVEX1ZBTFVFID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldHVybiBJbnNlcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fUkVUVVJOX0lOU0VSVCA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXR1cm4gVXBkYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX1JFVFVSTl9VUERBVEUgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5kZXg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fSU5ERVggPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGUgSW5kZXg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fQ0FDSEVfSU5ERVggPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fQVRUUklCVVRFX1RZUEUgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TXV0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19NVVRBQkxFID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCArIDEwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX0NPTlZFUlQgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgMTE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCArIDEyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19UWVBFX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgMTM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCArIDE0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX1NUUlVDVF9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCArIDE1OwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQmFzaWM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX0ZFQVRVUkVfQ09VTlQgKyAxNjsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9uIDxlbT5YbWwgQmFzaWMgQ29sbGVjdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXNpY0NvbGxlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfQ09MTEVDVElPTiA9IDc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX0NPTExFQ1RJT05fX0FDQ0VTUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19DT0xMRUNUSU9OX19OQU1FID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfQ09MTEVDVElPTl9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX0NPTExFQ1RJT05fX0FUVFJJQlVURV9UWVBFID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfQ09MTEVDVElPTl9fQ0FTQ0FERV9PTl9ERUxFVEUgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEJhc2ljIENvbGxlY3Rpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwIDxlbT5YbWwgQmFzaWMgTWFwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWNNYXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfTUFQID0gODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfTUFQX19BQ0NFU1MgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfTUFQX19OQU1FID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfTUFQX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19NQVBfX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19NQVBfX0FUVFJJQlVURV9UWVBFID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfTUFQX19DQVNDQURFX09OX0RFTEVURSA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQmFzaWMgTWFwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX01BUF9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2ggPGVtPlhtbCBCYXRjaCBGZXRjaDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVRDSF9GRVRDSCA9IDk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVRDSF9GRVRDSF9fU0laRSA9IEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIXzIxX19TSVpFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFUQ0hfRkVUQ0hfX0JBVENIX0ZFVENIX1RZUEUgPSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF8yMV9fQkFUQ0hfRkVUQ0hfVFlQRTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEJhdGNoIEZldGNoPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBVENIX0ZFVENIX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF8yMV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaEhvbGRlciA8ZW0+WG1sIEJhdGNoIEZldGNoIEhvbGRlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaEhvbGRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVRDSF9GRVRDSF9IT0xERVIgPSAxMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2g8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVRDSF9GRVRDSF9IT0xERVJfX0JBVENIX0ZFVENIID0gMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEJhdGNoIEZldGNoIEhvbGRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVRDSF9GRVRDSF9IT0xERVJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlIDxlbT5YbWwgQ2FjaGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRSA9IDExOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jc29sYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9fSVNPTEFUSU9OID0gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfQ0FDSEVfMjJfX0lTT0xBVElPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YWJhc2UgQ2hhbmdlIE5vdGlmaWNhdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVfX0RBVEFCQVNFX0NIQU5HRV9OT1RJRklDQVRJT05fVFlQRSA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0NBQ0hFXzIyX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHBpcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9fRVhQSVJZID0gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfQ0FDSEVfMjJfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9fU0laRSA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0NBQ0hFXzIyX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9fU0hBUkVEID0gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfQ0FDSEVfMjJfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9fVFlQRSA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0NBQ0hFXzIyX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbHdheXMgUmVmcmVzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFX19BTFdBWVNfUkVGUkVTSCA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0NBQ0hFXzIyX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZyZXNoIE9ubHkgSWYgTmV3ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9fUkVGUkVTSF9PTkxZX0lGX05FV0VSID0gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfQ0FDSEVfMjJfRkVBVFVSRV9DT1VOVCArIDY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2FibGUgSGl0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFX19ESVNBQkxFX0hJVFMgPSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9DQUNIRV8yMl9GRUFUVVJFX0NPVU5UICsgNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29vcmRpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9fQ09PUkRJTkFUSU9OX1RZUEUgPSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9DQUNIRV8yMl9GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwaXJ5IFRpbWUgT2YgRGF5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWSA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0NBQ0hFXzIyX0ZFQVRVUkVfQ09VTlQgKyA5OwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ2FjaGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0NBQ0hFXzIyX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIgPGVtPlhtbCBDYWNoZSBIb2xkZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSG9sZGVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZUhvbGRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9IT0xERVIgPSAxMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9IT0xERVJfX0NBQ0hFID0gMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhpc3RlbmNlIENoZWNraW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVfSE9MREVSX19FWElTVEVOQ0VfQ0hFQ0tJTkcgPSAxOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ2FjaGUgSG9sZGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFX0hPTERFUl9GRUFUVVJFX0NPVU5UID0gMjsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVJbmRleCA8ZW0+WG1sIENhY2hlIEluZGV4PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZUluZGV4Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZUluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFX0lOREVYID0gMTM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbiBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVfSU5ERVhfX0NPTFVNTl9OQU1FUyA9IEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UuWE1MX0NBQ0hFX0lOREVYXzI0X19DT0xVTU5fTkFNRVM7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBDYWNoZSBJbmRleDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9JTkRFWF9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5YTUxfQ0FDSEVfSU5ERVhfMjRfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nIDxlbT5YbWwgQ2hhbmdlIFRyYWNraW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2hhbmdlVHJhY2tpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0hBTkdFX1RSQUNLSU5HID0gMTQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DSEFOR0VfVFJBQ0tJTkdfX1RZUEUgPSAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ2hhbmdlIFRyYWNraW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NIQU5HRV9UUkFDS0lOR19GRUFUVVJFX0NPVU5UID0gMTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIgPGVtPlhtbCBDaGFuZ2UgVHJhY2tpbmcgSG9sZGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ0hvbGRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0hBTkdFX1RSQUNLSU5HX0hPTERFUiA9IDE1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgVHJhY2tpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DSEFOR0VfVFJBQ0tJTkdfSE9MREVSX19DSEFOR0VfVFJBQ0tJTkcgPSAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ2hhbmdlIFRyYWNraW5nIEhvbGRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DSEFOR0VfVFJBQ0tJTkdfSE9MREVSX0ZFQVRVUkVfQ09VTlQgPSAxOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDbG9uZUNvcHlQb2xpY3kgPGVtPlhtbCBDbG9uZSBDb3B5IFBvbGljeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDbG9uZUNvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0xPTkVfQ09QWV9QT0xJQ1kgPSAxNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX01FVEhPRCA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmtpbmcgQ29weSBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DTE9ORV9DT1BZX1BPTElDWV9fV09SS0lOR19DT1BZX01FVEhPRCA9IDE7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBDbG9uZSBDb3B5IFBvbGljeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DTE9ORV9DT1BZX1BPTElDWV9GRUFUVVJFX0NPVU5UID0gMjsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sbGVjdGlvblRhYmxlIDxlbT5YbWwgQ29sbGVjdGlvbiBUYWJsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sbGVjdGlvblRhYmxlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MTEVDVElPTl9UQUJMRSA9IDE3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MTEVDVElPTl9UQUJMRV9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX0NPTExFQ1RJT05fVEFCTEVfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX1RBQkxFX19DQVRBTE9HID0gT3JtUGFja2FnZS5YTUxfQ09MTEVDVElPTl9UQUJMRV9fQ0FUQUxPRzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MTEVDVElPTl9UQUJMRV9fU0NIRU1BID0gT3JtUGFja2FnZS5YTUxfQ09MTEVDVElPTl9UQUJMRV9fU0NIRU1BOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWUgQ29uc3RyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTExFQ1RJT05fVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUyA9IE9ybVBhY2thZ2UuWE1MX0NPTExFQ1RJT05fVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX1RBQkxFX19KT0lOX0NPTFVNTlMgPSBPcm1QYWNrYWdlLlhNTF9DT0xMRUNUSU9OX1RBQkxFX19KT0lOX0NPTFVNTlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyZWF0aW9uIFN1ZmZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTExFQ1RJT05fVEFCTEVfX0NSRUFUSU9OX1NVRkZJWCA9IE9ybVBhY2thZ2UuWE1MX0NPTExFQ1RJT05fVEFCTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBDb2xsZWN0aW9uIFRhYmxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTExFQ1RJT05fVEFCTEVfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0NPTExFQ1RJT05fVEFCTEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZSA8ZW0+WG1sIENvbnZlcnNpb24gVmFsdWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVyc2lvblZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlNJT05fVkFMVUUgPSAxODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlNJT05fVkFMVUVfX0RBVEFfVkFMVUUgPSAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUUgPSAxOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ29udmVyc2lvbiBWYWx1ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJTSU9OX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgPSAyOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlciA8ZW0+WG1sIE5hbWVkIENvbnZlcnRlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb252ZXJ0ZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX0NPTlZFUlRFUiA9IDQ1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfQ09OVkVSVEVSX19OQU1FID0gMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE5hbWVkIENvbnZlcnRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlciA8ZW0+WG1sIENvbnZlcnRlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSID0gMTk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJURVJfX05BTUUgPSBYTUxfTkFNRURfQ09OVkVSVEVSX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSX19DTEFTU19OQU1FID0gWE1MX05BTUVEX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENvbnZlcnRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCA9IFhNTF9OQU1FRF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckNvbnRhaW5lciA8ZW0+WG1sIENvbnZlcnRlciBDb250YWluZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckNvbnRhaW5lcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRFUl9DT05UQUlORVIgPSAyMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fQ09OVkVSVEVSUyA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fVFlQRV9DT05WRVJURVJTID0gMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyA9IDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19TVFJVQ1RfQ09OVkVSVEVSUyA9IDM7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBDb252ZXJ0ZXIgQ29udGFpbmVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyA8ZW0+WG1sIENvbnZlcnRpYmxlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRJQkxFX01BUFBJTkcgPSAyMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9iPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVElCTEVfTUFQUElOR19fTE9CID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fTE9COwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX1RFTVBPUkFMID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fVEVNUE9SQUw7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19FTlVNRVJBVEVEID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fRU5VTUVSQVRFRDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0NPTlZFUlQgPSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ29udmVydGlibGUgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb3B5UG9saWN5IDxlbT5YbWwgQ29weSBQb2xpY3k8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvcHlQb2xpY3kKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09QWV9QT0xJQ1kgPSAyMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT1BZX1BPTElDWV9fQ0xBU1MgPSAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ29weSBQb2xpY3k8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09QWV9QT0xJQ1lfRkVBVFVSRV9DT1VOVCA9IDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXIgPGVtPlhtbCBDdXN0b21pemVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDdXN0b21pemVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NVU1RPTUlaRVIgPSAyMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VzdG9taXplciBDbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ1VTVE9NSVpFUl9fQ1VTVE9NSVpFUl9DTEFTU19OQU1FID0gMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEN1c3RvbWl6ZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ1VTVE9NSVpFUl9GRUFUVVJFX0NPVU5UID0gMTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplckhvbGRlciA8ZW0+WG1sIEN1c3RvbWl6ZXIgSG9sZGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVySG9sZGVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDdXN0b21pemVySG9sZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NVU1RPTUlaRVJfSE9MREVSID0gMjQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1c3RvbWl6ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DVVNUT01JWkVSX0hPTERFUl9fQ1VTVE9NSVpFUiA9IDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBDdXN0b21pemVyIEhvbGRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DVVNUT01JWkVSX0hPTERFUl9GRUFUVVJFX0NPVU5UID0gMTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24gPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT04gPSAyNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BQ0NFU1MgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9iPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19MT0IgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0xPQjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RFTVBPUkFMID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19URU1QT1JBTDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fRU5VTUVSQVRFRCA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fRU5VTUVSQVRFRDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9DT0xVTU4gPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09SREVSX0NPTFVNTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09SREVSX0JZID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9CWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BVFRSSUJVVEVfT1ZFUlJJREVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BU1NPQ0lBVElPTl9PVkVSUklERVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBUZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9URU1QT1JBTCA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9URU1QT1JBTDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBFbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0VOVU1FUkFURUQgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfRU5VTUVSQVRFRDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UQVJHRVRfQ0xBU1MgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RBUkdFVF9DTEFTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19GRVRDSDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWSA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDbGFzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DTEFTUyA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DTEFTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09MVU1OID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NPTFVNTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9KT0lOX0NPTFVNTlMgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfSk9JTl9DT0xVTU5TOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTFVNTiA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MVU1OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2xsZWN0aW9uIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT0xMRUNUSU9OX1RBQkxFID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT0xMRUNUSU9OX1RBQkxFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FUVFJJQlVURV9UWVBFID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJUID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyA2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyA4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09OVkVSVCA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBGZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fSk9JTl9GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgMTA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19CQVRDSF9GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgMTE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDEzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JPVU5EX1JPQklOX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgMTQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BJTk5FRF9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDE1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JBTkdFX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgMTY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVkFMVUVfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0hBU0hfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19VTklPTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDE5OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUEFSVElUSU9ORUQgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDIwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIE9uIERlbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ0FTQ0FERV9PTl9ERUxFVEUgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDIxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob25jYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX05PTkNBQ0hFQUJMRSA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgMjI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbXBvc2l0ZSBNZW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTVBPU0lURV9NRU1CRVIgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDIzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxldGUgQWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19ERUxFVEVfQUxMID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyNDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgMjU7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUgPGVtPlhtbCBFbWJlZGRhYmxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEUgPSAyNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fQ0xBU1NfTkFNRSA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NMQVNTX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fTUVUQURBVEFfQ09NUExFVEUgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19NRVRBREFUQV9DT01QTEVURTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19ERVNDUklQVElPTiA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fQVRUUklCVVRFUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FUVFJJQlVURVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJlbnQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19QQVJFTlRfQ0xBU1MgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbHNxbCBSZWNvcmRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19QTFNRTF9SRUNPUkRTID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxzcWwgVGFibGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19QTFNRTF9UQUJMRVMgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19TVFJVQ1QgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgKyA2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXN0b21pemVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fQ1VTVE9NSVpFUiA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfRkVBVFVSRV9DT1VOVCArIDc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBUcmFja2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0NIQU5HRV9UUkFDS0lORyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfRkVBVFVSRV9DT1VOVCArIDg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgKyA5OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX1RZUEVfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfRkVBVFVSRV9DT1VOVCArIDEwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgMTE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19TVFJVQ1RfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfRkVBVFVSRV9DT1VOVCArIDEyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19QUk9QRVJUSUVTID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgMTM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fQ09QWV9QT0xJQ1kgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgKyAxNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1kgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgKyAxNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xvbmUgQ29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19DTE9ORV9DT1BZX1BPTElDWSA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfRkVBVFVSRV9DT1VOVCArIDE2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgKyAxNzsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVtYmVkZGFibGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgMTg7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkIDxlbT5YbWwgRW1iZWRkZWQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRCA9IDI3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX19OQU1FID0gT3JtUGFja2FnZS5YTUxfRU1CRURERURfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FUVFJJQlVURV9PVkVSUklERVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BU1NPQ0lBVElPTl9PVkVSUklERVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5YTUxfRU1CRURERURfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX19QUk9QRVJUSUVTID0gT3JtUGFja2FnZS5YTUxfRU1CRURERURfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfX0FUVFJJQlVURV9UWVBFID0gT3JtUGFja2FnZS5YTUxfRU1CRURERURfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbWJlZGRlZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfRU1CRURERURfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQgPGVtPlhtbCBFbWJlZGRlZCBJZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9JRCA9IDI4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9JRF9fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lEX19OQU1FID0gT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lEX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX0FUVFJJQlVURV9PVkVSUklERVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSURfX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lEX19QUk9QRVJUSUVTID0gT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSURfX0FUVFJJQlVURV9UWVBFID0gT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbWJlZGRlZCBJZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9JRF9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSA8ZW0+WG1sIEVudGl0eTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZID0gMjk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19BQ0NFU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0NMQVNTX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NMQVNTX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19NRVRBREFUQV9DT01QTEVURSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTUVUQURBVEFfQ09NUExFVEU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19ERVNDUklQVElPTiA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fREVTQ1JJUFRJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0FUVFJJQlVURVMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FUVFJJQlVURVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fTkFNRURfUVVFUklFUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfUVVFUklFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fTkFNRURfTkFUSVZFX1FVRVJJRVMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX05BVElWRV9RVUVSSUVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1NFUVVFTkNFX0dFTkVSQVRPUiA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU0VRVUVOQ0VfR0VORVJBVE9SOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1RBQkxFX0dFTkVSQVRPUiA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEVfR0VORVJBVE9SOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgUGVyc2lzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUFJFX1BFUlNJU1QgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9QRVJTSVNUOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BPU1RfUEVSU0lTVCA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9QRVJTSVNUOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QUkVfUkVNT1ZFID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfUkVNT1ZFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFJlbW92ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUE9TVF9SRU1PVkUgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfUkVNT1ZFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QUkVfVVBEQVRFID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfVVBEQVRFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUE9TVF9VUERBVEUgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfVVBEQVRFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IExvYWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BPU1RfTE9BRCA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9MT0FEOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0FUVFJJQlVURV9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FUVFJJQlVURV9PVkVSUklERVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FTU09DSUFUSU9OX09WRVJSSURFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19DQUNIRUFCTEUgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFQUJMRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0lEX0NMQVNTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19JRF9DTEFTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1RBQkxFID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19UQUJMRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2Vjb25kYXJ5IFRhYmxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19TRUNPTkRBUllfVEFCTEVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRUNPTkRBUllfVEFCTEVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaGVyaXRhbmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19JTkhFUklUQU5DRSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5IRVJJVEFOQ0U7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfVkFMVUUgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfVkFMVUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX0NPTFVNTiA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9DT0xVTU47Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IExpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fRU5USVRZX0xJU1RFTkVSUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRU5USVRZX0xJU1RFTkVSUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJlbnQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BBUkVOVF9DTEFTUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BSSU1BUllfS0VZID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWNoZSBJbnRlcmNlcHRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fQ0FDSEVfSU5URVJDRVBUT1IgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlF1ZXJ5IFJlZGlyZWN0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19RVUVSWV9SRURJUkVDVE9SUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2ggR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0ZFVENIX0dST1VQUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgRXh0cmFjdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19DTEFTU19FWFRSQUNUT1IgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyA3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BJTk5FRF9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDEwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1JBTkdFX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMTE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fVkFMVUVfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0hBU0hfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19VTklPTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDE0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUEFSVElUSU9ORUQgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDE1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsIENyaXRlcmlhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19BRERJVElPTkFMX0NSSVRFUklBID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAxNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0NBU0NBREVfT05fREVMRVRFID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAxNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5kZXg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0lOREVYID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAxODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TXVsdGl0ZW5hbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX01VTFRJVEVOQU5UID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAxOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDIwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBQbHNxbCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMjE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFBsc3FsIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19OQU1FRF9QTFNRTF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDIyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbHNxbCBSZWNvcmRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BMU1FMX1JFQ09SRFMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDIzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbHNxbCBUYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUExTUUxfVEFCTEVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAyNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19TVFJVQ1QgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDI1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWNoZSBJbmRleDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fQ0FDSEVfSU5ERVggPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDI2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1JFQURfT05MWSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMjc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1c3RvbWl6ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0NVU1RPTUlaRVIgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDI4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgVHJhY2tpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0NIQU5HRV9UUkFDS0lORyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMjk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhY2hlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19DQUNIRSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMzA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4aXN0ZW5jZSBDaGVja2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fRVhJU1RFTkNFX0NIRUNLSU5HID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAzMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAzMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1RZUEVfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMzM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMzQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1NUUlVDVF9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAzNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMzY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMzc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGltaXN0aWMgTG9ja2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fT1BUSU1JU1RJQ19MT0NLSU5HID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAzODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0NPUFlfUE9MSUNZID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAzOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgNDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsb25lIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgNDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyA0MjsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVudGl0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgNDM7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzIDxlbT5YbWwgRW50aXR5IE1hcHBpbmdzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTID0gMzA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1ZFUlNJT04gPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1ZFUlNJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fU0NIRU1BX0xPQ0FUSU9OID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TQ0hFTUFfTE9DQVRJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfUVVFUklFUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfUVVFUklFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfTkFUSVZFX1FVRVJJRVMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX05BVElWRV9RVUVSSUVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fREVTQ1JJUFRJT04gPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19QQUNLQUdFID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QQUNLQUdFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1NDSEVNQSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU0NIRU1BOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19DQVRBTE9HID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19DQVRBTE9HOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBHZW5lcmF0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1NFUVVFTkNFX0dFTkVSQVRPUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NFUVVFTkNFX0dFTkVSQVRPUlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fVEFCTEVfR0VORVJBVE9SUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVEFCTEVfR0VORVJBVE9SUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1MgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgU3VwZXJjbGFzc2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX01BUFBFRF9TVVBFUkNMQVNTRVMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX01BUFBFRF9TVVBFUkNMQVNTRVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX0VOVElUSUVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19FTlRJVElFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW1iZWRkYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fRU1CRUREQUJMRVMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0VNQkVEREFCTEVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fUElOTkVEX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1JBTkdFX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1ZBTFVFX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fSEFTSF9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfRkVBVFVSRV9DT1VOVCArIDc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19VTklPTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfRkVBVFVSRV9DT1VOVCArIDg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbmFudCBEaXNjcmltaW5hdG9yIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19GRUFUVVJFX0NPVU5UICsgOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfRkVBVFVSRV9DT1VOVCArIDEwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBQbHNxbCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19GRUFUVVJFX0NPVU5UICsgMTE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFBsc3FsIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9QTFNRTF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfRkVBVFVSRV9DT1VOVCArIDEyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbHNxbCBSZWNvcmRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1BMU1FMX1JFQ09SRFMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfRkVBVFVSRV9DT1VOVCArIDEzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbHNxbCBUYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fUExTUUxfVEFCTEVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX0ZFQVRVUkVfQ09VTlQgKyAxNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX0ZFQVRVUkVfQ09VTlQgKyAxNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1RZUEVfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19GRUFUVVJFX0NPVU5UICsgMTY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19GRUFUVVJFX0NPVU5UICsgMTc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1NUUlVDVF9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX0ZFQVRVUkVfQ09VTlQgKyAxODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19GRUFUVVJFX0NPVU5UICsgMTk7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfRkVBVFVSRV9DT1VOVCArIDIwOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxGZXRjaEF0dHJpYnV0ZSA8ZW0+WG1sIEZldGNoIEF0dHJpYnV0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hBdHRyaWJ1dGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEZldGNoQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0ZFVENIX0FUVFJJQlVURSA9IDMxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRkVUQ0hfQVRUUklCVVRFX19OQU1FID0gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfRkVUQ0hfQVRUUklCVVRFXzIxX19OQU1FOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRmV0Y2ggQXR0cmlidXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0ZFVENIX0FUVFJJQlVURV9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfRkVUQ0hfQVRUUklCVVRFXzIxX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxGZXRjaEdyb3VwIDxlbT5YbWwgRmV0Y2ggR3JvdXA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoR3JvdXAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEZldGNoR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRkVUQ0hfR1JPVVAgPSAzMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0ZFVENIX0dST1VQX19OQU1FID0gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfMjFfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvYWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9GRVRDSF9HUk9VUF9fTE9BRCA9IEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQXzIxX19MT0FEOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9GRVRDSF9HUk9VUF9fQVRUUklCVVRFUyA9IEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQXzIxX19BVFRSSUJVVEVTOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRmV0Y2ggR3JvdXA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRkVUQ0hfR1JPVVBfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQXzIxX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCA8ZW0+WG1sIElkPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSUQgPSAzNDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSW5kZXggPGVtPlhtbCBJbmRleDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSW5kZXgKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lOREVYID0gMzU7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IDxlbT5YbWwgSW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1kgPSAzNjsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoIDxlbT5YbWwgSm9pbiBGZXRjaDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxKb2luRmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9GRVRDSCA9IDM3OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGUgPGVtPlhtbCBKb2luIFRhYmxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFID0gMzg7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkgPGVtPlhtbCBNYW55IFRvIE1hbnk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hbnlUb01hbnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZID0gMzk7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZSA8ZW0+WG1sIE1hbnkgVG8gT25lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hbnlUb09uZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORSA9IDQwOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1MgPSA0MTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXV0YWJsZSA8ZW0+WG1sIE11dGFibGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11dGFibGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE11dGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVUQUJMRSA9IDQ0OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IDxlbT5YbWwgTmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZID0gNDk7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgPGVtPlhtbCBPYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSID0gNTA7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSA8ZW0+WG1sIE9uZSBUbyBNYW55PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9uZVRvTWFueSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWSA9IDUxOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSA8ZW0+WG1sIE9uZSBUbyBPbmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPbmVUb09uZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FID0gNTI7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nIDxlbT5YbWwgT3B0aW1pc3RpYyBMb2NraW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1BUSU1JU1RJQ19MT0NLSU5HID0gNTM7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyQ29sdW1uIDxlbT5YbWwgT3JkZXIgQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlckNvbHVtbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT3JkZXJDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OID0gNTQ7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0czwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFMgPSA1NjsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSA9IDU3OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5IDxlbT5YbWwgUHJpbWFyeSBLZXk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByaW1hcnlLZXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVkgPSA2MTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpdmF0ZU93bmVkIDxlbT5YbWwgUHJpdmF0ZSBPd25lZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpdmF0ZU93bmVkCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcml2YXRlT3duZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJVkFURV9PV05FRCA9IDYyOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSA8ZW0+WG1sIFByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJPUEVSVFkgPSA2MzsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHlDb250YWluZXIgPGVtPlhtbCBQcm9wZXJ0eSBDb250YWluZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5Q29udGFpbmVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUWV9DT05UQUlORVIgPSA2NDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIgPGVtPlhtbCBRdWVyeSBDb250YWluZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxRdWVyeUNvbnRhaW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9DT05UQUlORVIgPSA2NTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlSZWRpcmVjdG9ycyA8ZW0+WG1sIFF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeVJlZGlyZWN0b3JzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX1JFRElSRUNUT1JTID0gNjY7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlYWRPbmx5IDxlbT5YbWwgUmVhZCBPbmx5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUkVBRF9PTkxZID0gNjg7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJldHVybkluc2VydCA8ZW0+WG1sIFJldHVybiBJbnNlcnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJldHVybkluc2VydAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUmV0dXJuSW5zZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JFVFVSTl9JTlNFUlQgPSA3MDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGUgPGVtPlhtbCBTZWNvbmRhcnkgVGFibGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTZWNvbmRhcnlUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRUNPTkRBUllfVEFCTEUgPSA3MjsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIDxlbT5YbWwgU3RvcmVkIFByb2NlZHVyZSBQYXJhbWV0ZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSID0gNzM7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlciA8ZW0+WG1sIFN0cnVjdCBDb252ZXJ0ZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sU3RydWN0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUUlVDVF9DT05WRVJURVIgPSA3NTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGUgPGVtPlhtbCBUYWJsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFID0gNzc7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yIDxlbT5YbWwgVGFibGUgR2VuZXJhdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVGFibGVHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SID0gNzg7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSA8ZW0+WG1sIFRpbWUgT2YgRGF5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFRpbWVPZkRheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9USU1FX09GX0RBWSA9IDgwOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2Zvcm1hdGlvbiA8ZW0+WG1sIFRyYW5zZm9ybWF0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2Zvcm1hdGlvbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVHJhbnNmb3JtYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFJBTlNGT1JNQVRJT04gPSA4MTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50IDxlbT5YbWwgVHJhbnNpZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFRyYW5zaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0lFTlQgPSA4MjsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlciA8ZW0+WG1sIFR5cGUgQ29udmVydGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUeXBlQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RZUEVfQ09OVkVSVEVSID0gODM7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmUgPGVtPlhtbCBWYXJpYWJsZSBPbmUgVG8gT25lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxWYXJpYWJsZU9uZVRvT25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBUklBQkxFX09ORV9UT19PTkUgPSA4NzsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiA8ZW0+WG1sIFZlcnNpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTiA9IDg4OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxIYXNoUGFydGl0aW9uaW5nIDxlbT5YbWwgSGFzaCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEhhc2hQYXJ0aXRpb25pbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEhhc2hQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSEFTSF9QQVJUSVRJT05JTkcgPSAzMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0hBU0hfUEFSVElUSU9OSU5HX19OQU1FID0gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfSEFTSF9QQVJUSVRJT05JTkdfMjJfX05BTUU7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBIYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9IQVNIX1BBUlRJVElPTklOR19GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfSEFTSF9QQVJUSVRJT05JTkdfMjJfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19BQ0NFU1MgPSBPcm1QYWNrYWdlLlhNTF9JRF9fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9JRF9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0NPTFVNTiA9IE9ybVBhY2thZ2UuWE1MX0lEX19DT0xVTU47Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvYjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19MT0IgPSBPcm1QYWNrYWdlLlhNTF9JRF9fTE9COwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19URU1QT1JBTCA9IE9ybVBhY2thZ2UuWE1MX0lEX19URU1QT1JBTDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19FTlVNRVJBVEVEID0gT3JtUGFja2FnZS5YTUxfSURfX0VOVU1FUkFURUQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19TRVFVRU5DRV9HRU5FUkFUT1IgPSBPcm1QYWNrYWdlLlhNTF9JRF9fU0VRVUVOQ0VfR0VORVJBVE9SOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fVEFCTEVfR0VORVJBVE9SID0gT3JtUGFja2FnZS5YTUxfSURfX1RBQkxFX0dFTkVSQVRPUjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGVkIFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0dFTkVSQVRFRF9WQUxVRSA9IE9ybVBhY2thZ2UuWE1MX0lEX19HRU5FUkFURURfVkFMVUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0lOREVYID0gT3JtUGFja2FnZS5YTUxfSURfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhY2hlIEluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0NBQ0hFX0lOREVYID0gT3JtUGFja2FnZS5YTUxfSURfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5YTUxfSURfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19QUk9QRVJUSUVTID0gT3JtUGFja2FnZS5YTUxfSURfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0FUVFJJQlVURV9UWVBFID0gT3JtUGFja2FnZS5YTUxfSURfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk11dGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fTVVUQUJMRSA9IE9ybVBhY2thZ2UuWE1MX0lEX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0NPTlZFUlQgPSBPcm1QYWNrYWdlLlhNTF9JRF9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9JRF9GRUFUVVJFX0NPVU5UICsgNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fVFlQRV9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfSURfRkVBVFVSRV9DT1VOVCArIDg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfSURfRkVBVFVSRV9DT1VOVCArIDk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fU1RSVUNUX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9JRF9GRUFUVVJFX0NPVU5UICsgMTA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBJZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfSURfRkVBVFVSRV9DT1VOVCArIDExOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSU5ERVhfX05BTUUgPSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9JTkRFWF8yMl9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSU5ERVhfX1NDSEVNQSA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0lOREVYXzIyX19TQ0hFTUE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JTkRFWF9fQ0FUQUxPRyA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0lOREVYXzIyX19DQVRBTE9HOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lOREVYX19UQUJMRSA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0lOREVYXzIyX19UQUJMRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSU5ERVhfX1VOSVFVRSA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0lOREVYXzIyX19VTklRVUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbiBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSU5ERVhfX0NPTFVNTl9OQU1FUyA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0lOREVYXzIyX19DT0xVTU5fTkFNRVM7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBJbmRleDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JTkRFWF9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfSU5ERVhfMjJfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBJbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1lfRkVBVFVSRV9DT1VOVCA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gRmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0ZFVENIX19KT0lOX0ZFVENIID0gMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEpvaW4gRmV0Y2g8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9GRVRDSF9GRUFUVVJFX0NPVU5UID0gMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fVEFCTEVfX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9fQ0FUQUxPRyA9IE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfX0NBVEFMT0c7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fVEFCTEVfX1NDSEVNQSA9IE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfX1NDSEVNQTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFMgPSBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TID0gT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnZlcnNlIEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9fSU5WRVJTRV9KT0lOX0NPTFVNTlMgPSBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19JTlZFUlNFX0pPSU5fQ09MVU1OUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3JlYXRpb24gU3VmZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9fQ1JFQVRJT05fU1VGRklYID0gT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEpvaW4gVGFibGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1MgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fVEFSR0VUX0VOVElUWSA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVEFSR0VUX0VOVElUWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19GRVRDSDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fQ0FTQ0FERSA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQ0FTQ0FERTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBQRURfQlkgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUFBFRF9CWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fSk9JTl9UQUJMRSA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fSk9JTl9UQUJMRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19PUkRFUl9DT0xVTU4gPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX09SREVSX0NPTFVNTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX09SREVSX0JZID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19PUkRFUl9CWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IFRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX1RFTVBPUkFMID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX1RFTVBPUkFMOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfRU5VTUVSQVRFRCA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9FTlVNRVJBVEVEOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NMQVNTID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NMQVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DT0xVTU4gPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ09MVU1OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0pPSU5fQ09MVU1OUyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9KT0lOX0NPTFVNTlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVkgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19UWVBFX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fU1RSVUNUX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJUID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fQkFUQ0hfRkVUQ0ggPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyA3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX1BJTk5FRF9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDEwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMTE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fVkFMVUVfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX0hBU0hfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19VTklPTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDE0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fUEFSVElUSU9ORUQgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDE1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIE9uIERlbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fQ0FTQ0FERV9PTl9ERUxFVEUgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDE2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob24gQ2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19OT05fQ0FDSEVBQkxFID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAxNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAxODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19QUk9QRVJUSUVTID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAxOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX0FUVFJJQlVURV9UWVBFID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAyMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBGZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fSk9JTl9GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMjE7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYW55IFRvIE1hbnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDIyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19OQU1FID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fVEFSR0VUX0VOVElUWSA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19UQVJHRVRfRU5USVRZOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19GRVRDSDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19DQVNDQURFID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0NBU0NBREU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fSk9JTl9UQUJMRSA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19KT0lOX1RBQkxFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19KT0lOX0NPTFVNTlMgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSk9JTl9DT0xVTU5TOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19JRCA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19JRDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcyBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19NQVBTX0lEID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX01BUFNfSUQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX09QVElPTkFMID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX09QVElPTkFMOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19CQVRDSF9GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX1JBTkdFX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhc2ggUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX0hBU0hfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19VTklPTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fUEFSVElUSU9ORUQgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9uIENhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19OT05fQ0FDSEVBQkxFID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDEwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgMTI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX0FUVFJJQlVURV9UWVBFID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDEzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIEZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX0pPSU5fRkVUQ0ggPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgMTQ7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYW55IFRvIE9uZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDE1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTEFTU19OQU1FID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMQVNTX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX01FVEFEQVRBX0NPTVBMRVRFID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX01FVEFEQVRBX0NPTVBMRVRFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19ERVNDUklQVElPTiA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BVFRSSUJVVEVTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FUVFJJQlVURVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkIENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lEX0NMQVNTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lEX0NMQVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fRU5USVRZX0xJU1RFTkVSUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FTlRJVFlfTElTVEVORVJTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJlbnQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSRU5UX0NMQVNTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSSU1BUllfS0VZID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRUFCTEUgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGUgSW50ZXJjZXB0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVfSU5URVJDRVBUT1IgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZldGNoIEdyb3VwczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0ZFVENIX0dST1VQUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyA3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fU0VRVUVOQ0VfR0VORVJBVE9SID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UQUJMRV9HRU5FUkFUT1IgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1FVRVJJRVMgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMTA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfTkFUSVZFX1FVRVJJRVMgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMTE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UXVlcnkgUmVkaXJlY3RvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUVVFUllfUkVESVJFQ1RPUlMgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMTQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMTU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMTY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMTc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUElOTkVEX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JBTkdFX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1ZBTFVFX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAyMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fSEFTSF9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMjE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19VTklPTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMjI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BBUlRJVElPTkVEID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDIzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsIENyaXRlcmlhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FERElUSU9OQUxfQ1JJVEVSSUEgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMjQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk11bHRpdGVuYW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX01VTFRJVEVOQU5UID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDI1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDI2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBQbHNxbCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDI3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBQbHNxbCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9QTFNRTF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVMgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMjg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsc3FsIFJlY29yZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QTFNRTF9SRUNPUkRTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDI5OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbHNxbCBUYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QTFNRTF9UQUJMRVMgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMzA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhY2hlIEluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFX0lOREVYID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDMxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVBRF9PTkxZID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDMyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXN0b21pemVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NVU1RPTUlaRVIgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMzM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBUcmFja2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DSEFOR0VfVFJBQ0tJTkcgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMzQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhY2hlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDM1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGlzdGVuY2UgQ2hlY2tpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhJU1RFTkNFX0NIRUNLSU5HID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDM2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAzNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fVFlQRV9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDM4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAzOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TVFJVQ1RfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyA0MDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgNDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGltaXN0aWMgTG9ja2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PUFRJTUlTVElDX0xPQ0tJTkcgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgNDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPUFlfUE9MSUNZID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDQzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1kgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgNDQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsb25lIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMT05FX0NPUFlfUE9MSUNZID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDQ1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDQ2OwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyA0NzsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGl0ZW5hbnQgPGVtPlhtbCBNdWx0aXRlbmFudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGl0ZW5hbnQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE11bHRpdGVuYW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01VTFRJVEVOQU5UID0gNDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NVUxUSVRFTkFOVF9fVFlQRSA9IEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX01VTFRJVEVOQU5UXzIzX19UWVBFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW5hbnQgRGlzY3JpbWluYXRvciBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NVUxUSVRFTkFOVF9fVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OUyA9IEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX01VTFRJVEVOQU5UXzIzX19URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlIENyaXRlcmlhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVMVElURU5BTlRfX0lOQ0xVREVfQ1JJVEVSSUEgPSBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9NVUxUSVRFTkFOVF8yM19GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE11bHRpdGVuYW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01VTFRJVEVOQU5UX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9NVUxUSVRFTkFOVF8yM19GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGl0ZW5hbnRIb2xkZXIgPGVtPlhtbCBNdWx0aXRlbmFudCBIb2xkZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11bHRpdGVuYW50SG9sZGVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNdWx0aXRlbmFudEhvbGRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NVUxUSVRFTkFOVF9IT0xERVIgPSA0MzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TXVsdGl0ZW5hbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NVUxUSVRFTkFOVF9IT0xERVJfX01VTFRJVEVOQU5UID0gMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE11bHRpdGVuYW50IEhvbGRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NVUxUSVRFTkFOVF9IT0xERVJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk11dGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NVVRBQkxFX19NVVRBQkxFID0gMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE11dGFibGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVUQUJMRV9GRUFUVVJFX0NPVU5UID0gMTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnkgPGVtPlhtbCBOYW1lZCBQbHNxbCBTdG9yZWQgRnVuY3Rpb24gUXVlcnk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUlkgPSA0NjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSWV9fTkFNRSA9IEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSWV8yM19fTkFNRTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE5hbWVkIFBsc3FsIFN0b3JlZCBGdW5jdGlvbiBRdWVyeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUllfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSWV8yM19GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5IDxlbT5YbWwgTmFtZWQgUGxzcWwgU3RvcmVkIFByb2NlZHVyZSBRdWVyeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSWSA9IDQ3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRSA9IEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfMjNfX05BTUU7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBOYW1lZCBQbHNxbCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJ5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfMjNfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeSA8ZW0+WG1sIE5hbWVkIFN0b3JlZCBGdW5jdGlvbiBRdWVyeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJZID0gNDg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUllfX05BTUUgPSBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUllfMjNfX05BTUU7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBOYW1lZCBTdG9yZWQgRnVuY3Rpb24gUXVlcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJZX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUllfMjNfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19OQU1FID0gMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzdWx0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX0NMQVNTID0gMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzdWx0IFNldCBNYXBwaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HID0gMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VkdXJlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QUk9DRURVUkVfTkFNRSA9IDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldHVybnMgUmVzdWx0IFNldDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFVFVSTlNfUkVTVUxUX1NFVCA9IDQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19ISU5UUyA9IDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmFtZXRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BBUkFNRVRFUlMgPSA2OwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX0ZFQVRVUkVfQ09VTlQgPSA3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19OQU1FID0gWE1MX05BTUVEX0NPTlZFUlRFUl9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUgPSBYTUxfTkFNRURfQ09OVkVSVEVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEUgPSBYTUxfTkFNRURfQ09OVkVSVEVSX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJzaW9uIFZhbHVlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19DT05WRVJTSU9OX1ZBTFVFUyA9IFhNTF9OQU1FRF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgT2JqZWN0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19ERUZBVUxUX09CSkVDVF9WQUxVRSA9IFhNTF9OQU1FRF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBPYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX0ZFQVRVUkVfQ09VTlQgPSBYTUxfTkFNRURfQ09OVkVSVEVSX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19OQU1FID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fVEFSR0VUX0VOVElUWSA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19UQVJHRVRfRU5USVRZOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19GRVRDSDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19DQVNDQURFID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0NBU0NBREU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19NQVBQRURfQlkgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQUEVEX0JZOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX0pPSU5fVEFCTEUgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9UQUJMRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX09SREVSX0NPTFVNTiA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19PUkRFUl9DT0xVTU47Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX09SREVSX0JZID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09SREVSX0JZOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IFRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX01BUF9LRVlfVEVNUE9SQUwgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9URU1QT1JBTDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBFbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX01BUF9LRVlfRU5VTUVSQVRFRCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0VOVU1FUkFURUQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DTEFTUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NMQVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NPTFVNTiA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NPTFVNTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0pPSU5fQ09MVU1OUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0pPSU5fQ09MVU1OUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX0pPSU5fQ09MVU1OUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19KT0lOX0NPTFVNTlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9ycGhhbiBSZW1vdmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX09SUEhBTl9SRU1PVkFMID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09SUEhBTl9SRU1PVkFMOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NPTlZFUlQgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2g8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fQkFUQ0hfRkVUQ0ggPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyA3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19QSU5ORURfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDEwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fUkFOR0VfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDExOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fVkFMVUVfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDEyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXNoIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19IQVNIX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX1VOSU9OX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAxNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fUEFSVElUSU9ORUQgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMTU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX0NBU0NBREVfT05fREVMRVRFID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDE2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob25jYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTk9OQ0FDSEVBQkxFID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDE3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxldGUgQWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX0RFTEVURV9BTEwgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMTg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDE5OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAyMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fQVRUUklCVVRFX1RZUEUgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMjE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByaXZhdGUgT3duZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fUFJJVkFURV9PV05FRCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAyMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBGZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19KT0lOX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDIzOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT25lIFRvIE1hbnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAyNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19UQVJHRVRfRU5USVRZID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVEFSR0VUX0VOVElUWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0ZFVENIOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fQ0FTQ0FERSA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0NBU0NBREU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19KT0lOX1RBQkxFID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fSk9JTl9UQUJMRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19KT0lOX0NPTFVNTlMgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19KT0lOX0NPTFVNTlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fSUQgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19JRDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcyBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX01BUFNfSUQgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19NQVBTX0lEOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX09QVElPTkFMID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fT1BUSU9OQUw7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX01BUFBFRF9CWSA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX01BUFBFRF9CWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9ycGhhbiBSZW1vdmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fT1JQSEFOX1JFTU9WQUwgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19PUlBIQU5fUkVNT1ZBTDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2g8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19CQVRDSF9GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19IQVNIX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX1VOSU9OX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fUEFSVElUSU9ORUQgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0ZFQVRVUkVfQ09VTlQgKyA5OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIE9uIERlbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX0NBU0NBREVfT05fREVMRVRFID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgMTA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vbiBDYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19OT05fQ0FDSEVBQkxFID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgMTE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDEzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX0FUVFJJQlVURV9UWVBFID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgMTQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByaXZhdGUgT3duZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19QUklWQVRFX09XTkVEID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgMTU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gRmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19KT0lOX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgMTY7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBPbmUgVG8gT25lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDE3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19UWVBFID0gMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09QVElNSVNUSUNfTE9DS0lOR19fQ0FTQ0FERSA9IDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlbGVjdGVkIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09QVElNSVNUSUNfTE9DS0lOR19fU0VMRUNURURfQ09MVU1OUyA9IDI7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBPcHRpbWlzdGljIExvY2tpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1BUSU1JU1RJQ19MT0NLSU5HX0ZFQVRVUkVfQ09VTlQgPSAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW4gRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09SREVSX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT04gPSBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OX19OQU1FID0gT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OdWxsYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09SREVSX0NPTFVNTl9fTlVMTEFCTEUgPSBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX05VTExBQkxFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnNlcnRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OX19JTlNFUlRBQkxFID0gT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19JTlNFUlRBQkxFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fX1VQREFUQUJMRSA9IE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fVVBEQVRBQkxFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3JyZWN0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fX0NPUlJFQ1RJT05fVFlQRSA9IE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9yZGVyIENvbHVtbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGFydGl0aW9uaW5nIDxlbT5YbWwgUGFydGl0aW9uaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQYXJ0aXRpb25pbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QQVJUSVRJT05JTkcgPSA1NTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BBUlRJVElPTklOR19fTkFNRSA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR18yMl9fTkFNRTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFBhcnRpdGlvbmluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QQVJUSVRJT05JTkdfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR18yMl9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0RFU0NSSVBUSU9OID0gT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fREVTQ1JJUFRJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlbGltaXRlZCBJZGVudGlmaWVyczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0RFTElNSVRFRF9JREVOVElGSUVSUyA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0RFTElNSVRFRF9JREVOVElGSUVSUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fU0NIRU1BID0gT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fU0NIRU1BOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FUQUxPRyA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBVEFMT0c7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgUGVyc2lzdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBU0NBREVfUEVSU0lTVCA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBU0NBREVfUEVSU0lTVDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IExpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0VOVElUWV9MSVNURU5FUlMgPSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19FTlRJVFlfTElTVEVORVJTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OUyA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fREVTQ1JJUFRJT04gPSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WG1sIE1hcHBpbmcgTWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19YTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURSA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1hNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUyA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUyA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBpbm5lZFBhcnRpdGlvbmluZyA8ZW0+WG1sIFBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBpbm5lZFBhcnRpdGlvbmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BJTk5FRF9QQVJUSVRJT05JTkcgPSA1ODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BJTk5FRF9QQVJUSVRJT05JTkdfX05BTUUgPSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QSU5ORURfUEFSVElUSU9OSU5HXzIyX19OQU1FOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUGlubmVkIFBhcnRpdGlvbmluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QSU5ORURfUEFSVElUSU9OSU5HX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QSU5ORURfUEFSVElUSU9OSU5HXzIyX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQbHNxbFJlY29yZCA8ZW0+WG1sIFBsc3FsIFJlY29yZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGxzcWxSZWNvcmQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBsc3FsUmVjb3JkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BMU1FMX1JFQ09SRCA9IDU5OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUExTUUxfUkVDT1JEX19OQU1FID0gRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfUExTUUxfUkVDT1JEXzIzX19OQU1FOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUGxzcWwgUmVjb3JkPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BMU1FMX1JFQ09SRF9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfUExTUUxfUkVDT1JEXzIzX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQbHNxbFRhYmxlIDxlbT5YbWwgUGxzcWwgVGFibGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBsc3FsVGFibGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBsc3FsVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUExTUUxfVEFCTEUgPSA2MDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BMU1FMX1RBQkxFX19OQU1FID0gRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfUExTUUxfVEFCTEVfMjNfX05BTUU7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQbHNxbCBUYWJsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QTFNRTF9UQUJMRV9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfUExTUUxfVEFCTEVfMjNfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbGlkYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV9fVkFMSURBVElPTiA9IEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZXzExX19WQUxJREFUSU9OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV9fQ09MVU1OUyA9IEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZXzExX19DT0xVTU5TOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWNoZSBLZXkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZX19DQUNIRV9LRVlfVFlQRSA9IEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZXzExX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUHJpbWFyeSBLZXk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZXzExX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcml2YXRlIE93bmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJVkFURV9PV05FRF9fUFJJVkFURV9PV05FRCA9IDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQcml2YXRlIE93bmVkPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSVZBVEVfT1dORURfRkVBVFVSRV9DT1VOVCA9IDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUWV9fTkFNRSA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJPUEVSVFlfX1ZBTFVFID0gMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BST1BFUlRZX19WQUxVRV9UWVBFID0gMjsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFByb3BlcnR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BST1BFUlRZX0ZFQVRVUkVfQ09VTlQgPSAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVMgPSAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUHJvcGVydHkgQ29udGFpbmVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UID0gMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9DT05UQUlORVJfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUyA9IDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBRdWVyeSBDb250YWluZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgPSAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbGwgUXVlcmllczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX1JFRElSRUNUT1JTX19BTExfUVVFUklFUyA9IEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19BTExfUVVFUklFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBBbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9SRURJUkVDVE9SU19fUkVBRF9BTEwgPSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9fUkVBRF9BTEw7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT2JqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfX1JFQURfT0JKRUNUID0gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1JFQURfT0JKRUNUOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9SRURJUkVDVE9SU19fUkVQT1JUID0gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1JFUE9SVDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBkYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfX1VQREFURSA9IEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19VUERBVEU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc2VydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX1JFRElSRUNUT1JTX19JTlNFUlQgPSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9fSU5TRVJUOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9SRURJUkVDVE9SU19fREVMRVRFID0gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX0RFTEVURTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX1JFRElSRUNUT1JTX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmFuZ2VQYXJ0aXRpb25pbmcgPGVtPlhtbCBSYW5nZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJhbmdlUGFydGl0aW9uaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSYW5nZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SQU5HRV9QQVJUSVRJT05JTkcgPSA2NzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JBTkdFX1BBUlRJVElPTklOR19fTkFNRSA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1JBTkdFX1BBUlRJVElPTklOR18yMl9fTkFNRTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFJhbmdlIFBhcnRpdGlvbmluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SQU5HRV9QQVJUSVRJT05JTkdfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1JBTkdFX1BBUlRJVElPTklOR18yMl9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUkVBRF9PTkxZX19SRUFEX09OTFkgPSAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUmVhZCBPbmx5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JFQURfT05MWV9GRUFUVVJFX0NPVU5UID0gMTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPGVtPlhtbCBSZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSA2OTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JFUExJQ0FUSU9OX1BBUlRJVElPTklOR19fTkFNRSA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1JFUExJQ0FUSU9OX1BBUlRJVElPTklOR18yMl9fTkFNRTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SRVBMSUNBVElPTl9QQVJUSVRJT05JTkdfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1JFUExJQ0FUSU9OX1BBUlRJVElPTklOR18yMl9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV0dXJuIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SRVRVUk5fSU5TRVJUX19SRVRVUk5fT05MWSA9IEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX1JFVFVSTl9JTlNFUlRfMjFfX1JFVFVSTl9PTkxZOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUmV0dXJuIEluc2VydDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SRVRVUk5fSU5TRVJUX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9SRVRVUk5fSU5TRVJUXzIxX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nIDxlbT5YbWwgUm91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JPVU5EX1JPQklOX1BBUlRJVElPTklORyA9IDcxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HX19OQU1FID0gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HXzIyX19OQU1FOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUm91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JPVU5EX1JPQklOX1BBUlRJVElPTklOR19GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HXzIyX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFX19OQU1FID0gT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFX19DQVRBTE9HID0gT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX19DQVRBTE9HOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRUNPTkRBUllfVEFCTEVfX1NDSEVNQSA9IE9ybVBhY2thZ2UuWE1MX1NFQ09OREFSWV9UQUJMRV9fU0NIRU1BOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWUgQ29uc3RyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTID0gT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMgPSBPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3JlYXRpb24gU3VmZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFX19DUkVBVElPTl9TVUZGSVggPSBPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBTZWNvbmRhcnkgVGFibGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpcmVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19ESVJFQ1RJT04gPSAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX05BTUUgPSAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5RdWVyeSBQYXJhbWV0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fUVVFUllfUEFSQU1FVEVSID0gMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19UWVBFID0gMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SmRiYyBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0pEQkNfVFlQRSA9IDQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpkYmMgVHlwZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0pEQkNfVFlQRV9OQU1FID0gNTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFN0b3JlZCBQcm9jZWR1cmUgUGFyYW1ldGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX0ZFQVRVUkVfQ09VTlQgPSA2OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3QgPGVtPlhtbCBTdHJ1Y3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sU3RydWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUUlVDVCA9IDc0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1RSVUNUX19OQU1FID0gRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfU1RSVUNUXzIzX19OQU1FOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgU3RydWN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUUlVDVF9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfU1RSVUNUXzIzX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1RSVUNUX0NPTlZFUlRFUl9fTkFNRSA9IFhNTF9OQU1FRF9DT05WRVJURVJfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUiA9IFhNTF9OQU1FRF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBTdHJ1Y3QgQ29udmVydGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUUlVDVF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCA9IFhNTF9OQU1FRF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdHVyZSA8ZW0+WG1sIFN0cnVjdHVyZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0dXJlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdHJ1Y3R1cmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1RSVUNUVVJFID0gNzY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUUlVDVFVSRV9fQUNDRVNTID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUUlVDVFVSRV9fTkFNRSA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUUlVDVFVSRV9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1RSVUNUVVJFX19QUk9QRVJUSUVTID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1RSVUNUVVJFX19BVFRSSUJVVEVfVFlQRSA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgU3RydWN0dXJlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUUlVDVFVSRV9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX1RBQkxFX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfX0NBVEFMT0cgPSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9fQ0FUQUxPRzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfX1NDSEVNQSA9IE9ybVBhY2thZ2UuWE1MX1RBQkxFX19TQ0hFTUE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZSBDb25zdHJhaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUyA9IE9ybVBhY2thZ2UuWE1MX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyZWF0aW9uIFN1ZmZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX19DUkVBVElPTl9TVUZGSVggPSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFRhYmxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfX0RFU0NSSVBUSU9OID0gT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdGlhbCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRSA9IE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWxsb2NhdGlvbiBTaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkUgPSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0FMTE9DQVRJT05fU0laRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfX1RBQkxFID0gT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19UQUJMRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9fQ0FUQUxPRyA9IE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fQ0FUQUxPRzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX19TQ0hFTUEgPSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1NDSEVNQTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGsgQ29sdW1uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfX1BLX0NPTFVNTl9OQU1FID0gT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgQ29sdW1uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfX1ZBTFVFX0NPTFVNTl9OQU1FID0gT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19WQUxVRV9DT0xVTU5fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGsgQ29sdW1uIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fVkFMVUUgPSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1BLX0NPTFVNTl9WQUxVRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfX1VOSVFVRV9DT05TVFJBSU5UUyA9IE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fVU5JUVVFX0NPTlNUUkFJTlRTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DcmVhdGlvbiBTdWZmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfX0NSRUFUSU9OX1NVRkZJWCA9IE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFRhYmxlIEdlbmVyYXRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbiA8ZW0+WG1sIFRlbmFudCBEaXNjcmltaW5hdG9yIENvbHVtbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU4gPSA3OTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX05BTUUgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0RJU0NSSU1JTkFUT1JfVFlQRSA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0JBU0VfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0RJU0NSSU1JTkFUT1JfVFlQRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGVuZ3RoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19MRU5HVEggPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19MRU5HVEg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRleHQgUHJvcGVydHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0NPTlRFWFRfUFJPUEVSVFkgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9fVEFCTEUgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9fUFJJTUFSWV9LRVkgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SG91cjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RJTUVfT0ZfREFZX19IT1VSID0gMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWludXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVElNRV9PRl9EQVlfX01JTlVURSA9IDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY29uZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RJTUVfT0ZfREFZX19TRUNPTkQgPSAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaWxsaXNlY29uZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RJTUVfT0ZfREFZX19NSUxMSVNFQ09ORCA9IDM7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBUaW1lIE9mIERheTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9USU1FX09GX0RBWV9GRUFUVVJFX0NPVU5UID0gNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFJBTlNGT1JNQVRJT05fX0FDQ0VTUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0ZPUk1BVElPTl9fTkFNRSA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TRk9STUFUSU9OX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0ZPUk1BVElPTl9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TRk9STUFUSU9OX19BVFRSSUJVVEVfVFlQRSA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVHJhbnNmb3JtYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFJBTlNGT1JNQVRJT05fRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0lFTlRfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFJBTlNJRU5UX19OQU1FID0gT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TSUVOVF9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TSUVOVF9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0lFTlRfX0FUVFJJQlVURV9UWVBFID0gT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVHJhbnNpZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TSUVOVF9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFlQRV9DT05WRVJURVJfX05BTUUgPSBYTUxfTkFNRURfQ09OVkVSVEVSX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFID0gWE1MX05BTUVEX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEUgPSBYTUxfTkFNRURfQ09OVkVSVEVSX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVHlwZSBDb252ZXJ0ZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFlQRV9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCA9IFhNTF9OQU1FRF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nIDxlbT5YbWwgVHlwZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVHlwZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFlQRV9NQVBQSU5HID0gODQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RZUEVfTUFQUElOR19fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfVFlQRV9NQVBQSU5HX19BQ0NFU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UWVBFX01BUFBJTkdfX0NMQVNTX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9UWVBFX01BUFBJTkdfX0NMQVNTX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFlQRV9NQVBQSU5HX19NRVRBREFUQV9DT01QTEVURSA9IE9ybVBhY2thZ2UuWE1MX1RZUEVfTUFQUElOR19fTUVUQURBVEFfQ09NUExFVEU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFlQRV9NQVBQSU5HX19ERVNDUklQVElPTiA9IE9ybVBhY2thZ2UuWE1MX1RZUEVfTUFQUElOR19fREVTQ1JJUFRJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UWVBFX01BUFBJTkdfX0FUVFJJQlVURVMgPSBPcm1QYWNrYWdlLlhNTF9UWVBFX01BUFBJTkdfX0FUVFJJQlVURVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFlQRV9NQVBQSU5HX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFyZW50IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFlQRV9NQVBQSU5HX19QQVJFTlRfQ0xBU1MgPSBPcm1QYWNrYWdlLlhNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBUeXBlIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaW9uUGFydGl0aW9uaW5nIDxlbT5YbWwgVW5pb24gUGFydGl0aW9uaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlvblBhcnRpdGlvbmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVW5pb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVU5JT05fUEFSVElUSU9OSU5HID0gODU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9VTklPTl9QQVJUSVRJT05JTkdfX05BTUUgPSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9VTklPTl9QQVJUSVRJT05JTkdfMjJfX05BTUU7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBVbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVU5JT05fUEFSVElUSU9OSU5HX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9VTklPTl9QQVJUSVRJT05JTkdfMjJfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhbHVlUGFydGl0aW9uaW5nIDxlbT5YbWwgVmFsdWUgUGFydGl0aW9uaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYWx1ZVBhcnRpdGlvbmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVmFsdWVQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFMVUVfUEFSVElUSU9OSU5HID0gODY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQUxVRV9QQVJUSVRJT05JTkdfX05BTUUgPSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9WQUxVRV9QQVJUSVRJT05JTkdfMjJfX05BTUU7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBWYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFMVUVfUEFSVElUSU9OSU5HX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9WQUxVRV9QQVJUSVRJT05JTkdfMjJfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19OQU1FID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FUVFJJQlVURV9UWVBFID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhbmdlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1JBTkdFX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19WQUxVRV9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19IQVNIX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA5OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19VTklPTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUEFSVElUSU9ORUQgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vbiBDYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19OT05fQ0FDSEVBQkxFID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDEyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fVEFSR0VUX0lOVEVSRkFDRSA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFZhcmlhYmxlIE9uZSBUbyBPbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19BQ0NFU1MgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BQ0NFU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19OQU1FID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fQ09MVU1OID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09MVU1OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19MT0IgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19MT0I7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fVEVNUE9SQUwgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19URU1QT1JBTDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX0VOVU1FUkFURUQgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19FTlVNRVJBVEVEOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX0lOREVYID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX0FUVFJJQlVURV9UWVBFID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TXV0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX01VVEFCTEUgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fQ09OVkVSVCA9IE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0ZFQVRVUkVfQ09VTlQgKyA2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX1RZUEVfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fRkVBVFVSRV9DT1VOVCArIDc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0ZFQVRVUkVfQ09VTlQgKyA4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fU1RSVUNUX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0ZFQVRVUkVfQ09VTlQgKyA5OwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVmVyc2lvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlIDxlbT5DYWNoZSBDb29yZGluYXRpb24gVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldENhY2hlQ29vcmRpbmF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBQ0hFX0NPT1JESU5BVElPTl9UWVBFID0gODk7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZSA8ZW0+Q2FjaGUgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldENhY2hlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBQ0hFX1RZUEUgPSA5MDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIDxlbT5YbWwgQ2hhbmdlIFRyYWNraW5nIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDaGFuZ2VUcmFja2luZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0hBTkdFX1RSQUNLSU5HX1RZUEUgPSA5MTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlyZWN0aW9uIDxlbT5YbWwgRGlyZWN0aW9uPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbERpcmVjdGlvbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRGlyZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0RJUkVDVElPTiA9IDkyOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlIDxlbT5FeGlzdGVuY2UgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRFeGlzdGVuY2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhJU1RFTkNFX1RZUEUgPSA5MzsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZSA8ZW0+WG1sIEpvaW4gRmV0Y2ggVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxKb2luRmV0Y2hUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fRkVUQ0hfVFlQRSA9IDk0OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUgPGVtPlhtbCBPcHRpbWlzdGljIExvY2tpbmcgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfVFlQRSA9IDk1OwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEFjY2Vzc01ldGhvZHNFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEFjY2Vzc01ldGhvZHNIb2xkZXJFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEFkZGl0aW9uYWxDcml0ZXJpYUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQXJyYXlFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGF0dHJpYnV0ZXNFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEJhc2ljRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxCYXNpY0NvbGxlY3Rpb25FQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEJhc2ljTWFwRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxCYXRjaEZldGNoRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxCYXRjaEZldGNoSG9sZGVyRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDYWNoZUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQ2FjaGVIb2xkZXJFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbENhY2hlSW5kZXhFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbENoYW5nZVRyYWNraW5nRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDaGFuZ2VUcmFja2luZ0hvbGRlckVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQ2xvbmVDb3B5UG9saWN5RUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDb2xsZWN0aW9uVGFibGVFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbENvbnZlcnNpb25WYWx1ZUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQ29udmVydGVyRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDb252ZXJ0ZXJDb250YWluZXJFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbENvbnZlcnRpYmxlTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQ29weVBvbGljeUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQ3VzdG9taXplckVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQ3VzdG9taXplckhvbGRlckVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRWxlbWVudENvbGxlY3Rpb25FQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVtYmVkZGFibGVFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVtYmVkZGVkRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbWJlZGRlZElkRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbnRpdHlFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxGZXRjaEF0dHJpYnV0ZUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRmV0Y2hHcm91cEVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sSWRFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEluZGV4RUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxJbnN0YW50aWF0aW9uQ29weVBvbGljeUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sSm9pbkZldGNoRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxKb2luVGFibGVFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE1hbnlUb01hbnlFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE1hbnlUb09uZUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTXVsdGl0ZW5hbnRFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE11bHRpdGVuYW50SG9sZGVyRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxNdXRhYmxlRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxOYW1lZENvbnZlcnRlckVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnlFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5RUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxPYmplY3RUeXBlQ29udmVydGVyRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxPbmVUb01hbnlFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE9uZVRvT25lRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxPcHRpbWlzdGljTG9ja2luZ0VDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sT3JkZXJDb2x1bW5FQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUHJpbWFyeUtleUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUHJpdmF0ZU93bmVkRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxQcm9wZXJ0eUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUHJvcGVydHlDb250YWluZXJFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFF1ZXJ5Q29udGFpbmVyRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxRdWVyeVJlZGlyZWN0b3JzRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxSZWFkT25seUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUmV0dXJuSW5zZXJ0RUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxTZWNvbmRhcnlUYWJsZUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxTdHJ1Y3RFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFN0cnVjdENvbnZlcnRlckVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sU3RydWN0dXJlRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxUYWJsZUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVGFibGVHZW5lcmF0b3JFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5FQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFRpbWVPZkRheUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVHJhbnNmb3JtYXRpb25FQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFRyYW5zaWVudEVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVHlwZUNvbnZlcnRlckVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVHlwZU1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFZhcmlhYmxlT25lVG9PbmVFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFZlcnNpb25FQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEhhc2hQYXJ0aXRpb25pbmdFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFBhcnRpdGlvbmluZ0VDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUGlubmVkUGFydGl0aW9uaW5nRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxQbHNxbFJlY29yZEVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUGxzcWxUYWJsZUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUmFuZ2VQYXJ0aXRpb25pbmdFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxSb3VuZFJvYmluUGFydGl0aW9uaW5nRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxVbmlvblBhcnRpdGlvbmluZ0VDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVmFsdWVQYXJ0aXRpb25pbmdFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gY2FjaGVDb29yZGluYXRpb25UeXBlRUVudW0gPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gY2FjaGVUeXBlRUVudW0gPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0geG1sQ2hhbmdlVHJhY2tpbmdUeXBlRUVudW0gPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0geG1sRGlyZWN0aW9uRUVudW0gPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gZXhpc3RlbmNlVHlwZUVFbnVtID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHhtbEpvaW5GZXRjaFR5cGVFRW51bSA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB4bWxPcHRpbWlzdGljTG9ja2luZ1R5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1QYWNrYWdlKCkKLQl7Ci0JCXN1cGVyKGVOU19VUkksIEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KLQkgKiAKLQkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIEVjbGlwc2VMaW5rT3JtUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KLQkgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1QYWNrYWdlIGluaXQoKQotCXsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEVjbGlwc2VMaW5rT3JtUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlFY2xpcHNlTGlua09ybVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1QYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IEVjbGlwc2VMaW5rT3JtUGFja2FnZSgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5mcmVlemUoKTsKLQotICAKLQkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCi0JCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChFY2xpcHNlTGlua09ybVBhY2thZ2UuZU5TX1VSSSwgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlKTsKLQkJcmV0dXJuIHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHMgPGVtPlhtbCBBY2Nlc3MgTWV0aG9kczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQWNjZXNzIE1ldGhvZHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiB4bWxBY2Nlc3NNZXRob2RzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzI2dldEdldE1ldGhvZCA8ZW0+R2V0IE1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdldCBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHMjZ2V0R2V0TWV0aG9kKCkKLQkgKiBAc2VlICNnZXRYbWxBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQWNjZXNzTWV0aG9kc19HZXRNZXRob2QoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEFjY2Vzc01ldGhvZHNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kcyNnZXRTZXRNZXRob2QgPGVtPlNldCBNZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXQgTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzI2dldFNldE1ldGhvZCgpCi0JICogQHNlZSAjZ2V0WG1sQWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEFjY2Vzc01ldGhvZHNfU2V0TWV0aG9kKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxBY2Nlc3NNZXRob2RzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzSG9sZGVyIDxlbT5YbWwgQWNjZXNzIE1ldGhvZHMgSG9sZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBBY2Nlc3MgTWV0aG9kcyBIb2xkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHNIb2xkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCkKLQl7Ci0JCXJldHVybiB4bWxBY2Nlc3NNZXRob2RzSG9sZGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzSG9sZGVyI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHNIb2xkZXIjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQHNlZSAjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQWNjZXNzTWV0aG9kc0hvbGRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWRkaXRpb25hbENyaXRlcmlhIDxlbT5YbWwgQWRkaXRpb25hbCBDcml0ZXJpYTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQWRkaXRpb25hbCBDcml0ZXJpYTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWRkaXRpb25hbENyaXRlcmlhCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQWRkaXRpb25hbENyaXRlcmlhKCkKLQl7Ci0JCXJldHVybiB4bWxBZGRpdGlvbmFsQ3JpdGVyaWFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBcnJheSA8ZW0+WG1sIEFycmF5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBBcnJheTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXJyYXkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxBcnJheSgpCi0JewotCQlyZXR1cm4geG1sQXJyYXlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5YbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpCi0JewotCQlyZXR1cm4geG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZyNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBzZWUgI2dldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX0F0dHJpYnV0ZVR5cGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMgPGVtPkF0dHJpYnV0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXR0cmlidXRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEF0dHJpYnV0ZXMoKQotCXsKLQkJcmV0dXJuIGF0dHJpYnV0ZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRCYXNpY0NvbGxlY3Rpb25zIDxlbT5CYXNpYyBDb2xsZWN0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QmFzaWMgQ29sbGVjdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0QmFzaWNDb2xsZWN0aW9ucygpCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEF0dHJpYnV0ZXNfQmFzaWNDb2xsZWN0aW9ucygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXR0cmlidXRlc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0QmFzaWNNYXBzIDxlbT5CYXNpYyBNYXBzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5CYXNpYyBNYXBzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldEJhc2ljTWFwcygpCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEF0dHJpYnV0ZXNfQmFzaWNNYXBzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhdHRyaWJ1dGVzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRUcmFuc2Zvcm1hdGlvbnMgPGVtPlRyYW5zZm9ybWF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VHJhbnNmb3JtYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldFRyYW5zZm9ybWF0aW9ucygpCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEF0dHJpYnV0ZXNfVHJhbnNmb3JtYXRpb25zKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhdHRyaWJ1dGVzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRWYXJpYWJsZU9uZVRvT25lcyA8ZW0+VmFyaWFibGUgT25lIFRvIE9uZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlZhcmlhYmxlIE9uZSBUbyBPbmVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldFZhcmlhYmxlT25lVG9PbmVzKCkKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXR0cmlidXRlc19WYXJpYWJsZU9uZVRvT25lcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXR0cmlidXRlc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMgPGVtPlhtbCBCYXNpYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQmFzaWM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQmFzaWMoKQotCXsKLQkJcmV0dXJuIHhtbEJhc2ljRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9uIDxlbT5YbWwgQmFzaWMgQ29sbGVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQmFzaWMgQ29sbGVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQmFzaWNDb2xsZWN0aW9uKCkKLQl7Ci0JCXJldHVybiB4bWxCYXNpY0NvbGxlY3Rpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcCA8ZW0+WG1sIEJhc2ljIE1hcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQmFzaWMgTWFwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEJhc2ljTWFwKCkKLQl7Ci0JCXJldHVybiB4bWxCYXNpY01hcEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2ggPGVtPlhtbCBCYXRjaCBGZXRjaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQmF0Y2ggRmV0Y2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2gKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxCYXRjaEZldGNoKCkKLQl7Ci0JCXJldHVybiB4bWxCYXRjaEZldGNoRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaEhvbGRlciA8ZW0+WG1sIEJhdGNoIEZldGNoIEhvbGRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQmF0Y2ggRmV0Y2ggSG9sZGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoSG9sZGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcigpCi0JewotCQlyZXR1cm4geG1sQmF0Y2hGZXRjaEhvbGRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaEhvbGRlciNnZXRCYXRjaEZldGNoIDxlbT5CYXRjaCBGZXRjaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoSG9sZGVyI2dldEJhdGNoRmV0Y2goKQotCSAqIEBzZWUgI2dldFhtbEJhdGNoRmV0Y2hIb2xkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxCYXRjaEZldGNoSG9sZGVyX0JhdGNoRmV0Y2goKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEJhdGNoRmV0Y2hIb2xkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlIDxlbT5YbWwgQ2FjaGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENhY2hlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbENhY2hlKCkKLQl7Ci0JCXJldHVybiB4bWxDYWNoZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0RXhwaXJ5IDxlbT5FeHBpcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHBpcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldEV4cGlyeSgpCi0JICogQHNlZSAjZ2V0WG1sQ2FjaGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDYWNoZV9FeHBpcnkoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENhY2hlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldFNpemUgPGVtPlNpemU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TaXplPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRTaXplKCkKLQkgKiBAc2VlICNnZXRYbWxDYWNoZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENhY2hlX1NpemUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENhY2hlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldFNoYXJlZCA8ZW0+U2hhcmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2hhcmVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRTaGFyZWQoKQotCSAqIEBzZWUgI2dldFhtbENhY2hlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ2FjaGVfU2hhcmVkKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDYWNoZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sQ2FjaGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDYWNoZV9UeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDYWNoZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRBbHdheXNSZWZyZXNoIDxlbT5BbHdheXMgUmVmcmVzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFsd2F5cyBSZWZyZXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRBbHdheXNSZWZyZXNoKCkKLQkgKiBAc2VlICNnZXRYbWxDYWNoZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENhY2hlX0Fsd2F5c1JlZnJlc2goKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENhY2hlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldFJlZnJlc2hPbmx5SWZOZXdlciA8ZW0+UmVmcmVzaCBPbmx5IElmIE5ld2VyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVmcmVzaCBPbmx5IElmIE5ld2VyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRSZWZyZXNoT25seUlmTmV3ZXIoKQotCSAqIEBzZWUgI2dldFhtbENhY2hlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ2FjaGVfUmVmcmVzaE9ubHlJZk5ld2VyKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDYWNoZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXREaXNhYmxlSGl0cyA8ZW0+RGlzYWJsZSBIaXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGlzYWJsZSBIaXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXREaXNhYmxlSGl0cygpCi0JICogQHNlZSAjZ2V0WG1sQ2FjaGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDYWNoZV9EaXNhYmxlSGl0cygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ2FjaGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0Q29vcmRpbmF0aW9uVHlwZSA8ZW0+Q29vcmRpbmF0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db29yZGluYXRpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0Q29vcmRpbmF0aW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sQ2FjaGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDYWNoZV9Db29yZGluYXRpb25UeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDYWNoZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRFeHBpcnlUaW1lT2ZEYXkgPGVtPkV4cGlyeSBUaW1lIE9mIERheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkV4cGlyeSBUaW1lIE9mIERheTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0RXhwaXJ5VGltZU9mRGF5KCkKLQkgKiBAc2VlICNnZXRYbWxDYWNoZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbENhY2hlX0V4cGlyeVRpbWVPZkRheSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQ2FjaGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSG9sZGVyIDxlbT5YbWwgQ2FjaGUgSG9sZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDYWNoZSBIb2xkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSG9sZGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ2FjaGVIb2xkZXIoKQotCXsKLQkJcmV0dXJuIHhtbENhY2hlSG9sZGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZUhvbGRlciNnZXRDYWNoZSA8ZW0+Q2FjaGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5DYWNoZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIjZ2V0Q2FjaGUoKQotCSAqIEBzZWUgI2dldFhtbENhY2hlSG9sZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sQ2FjaGVIb2xkZXJfQ2FjaGUoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbENhY2hlSG9sZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSG9sZGVyI2dldEV4aXN0ZW5jZUNoZWNraW5nIDxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSG9sZGVyI2dldEV4aXN0ZW5jZUNoZWNraW5nKCkKLQkgKiBAc2VlICNnZXRYbWxDYWNoZUhvbGRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENhY2hlSG9sZGVyX0V4aXN0ZW5jZUNoZWNraW5nKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDYWNoZUhvbGRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVJbmRleCA8ZW0+WG1sIENhY2hlIEluZGV4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDYWNoZSBJbmRleDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVJbmRleAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbENhY2hlSW5kZXgoKQotCXsKLQkJcmV0dXJuIHhtbENhY2hlSW5kZXhFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZyA8ZW0+WG1sIENoYW5nZSBUcmFja2luZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ2hhbmdlIFRyYWNraW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbENoYW5nZVRyYWNraW5nKCkKLQl7Ci0JCXJldHVybiB4bWxDaGFuZ2VUcmFja2luZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmcjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFhtbENoYW5nZVRyYWNraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ2hhbmdlVHJhY2tpbmdfVHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ2hhbmdlVHJhY2tpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nSG9sZGVyIDxlbT5YbWwgQ2hhbmdlIFRyYWNraW5nIEhvbGRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ2hhbmdlIFRyYWNraW5nIEhvbGRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcigpCi0JewotCQlyZXR1cm4geG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nSG9sZGVyI2dldENoYW5nZVRyYWNraW5nIDxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nSG9sZGVyI2dldENoYW5nZVRyYWNraW5nKCkKLQkgKiBAc2VlICNnZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyX0NoYW5nZVRyYWNraW5nKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxDaGFuZ2VUcmFja2luZ0hvbGRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5IDxlbT5YbWwgQ2xvbmUgQ29weSBQb2xpY3k8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENsb25lIENvcHkgUG9saWN5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDbG9uZUNvcHlQb2xpY3kKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDbG9uZUNvcHlQb2xpY3koKQotCXsKLQkJcmV0dXJuIHhtbENsb25lQ29weVBvbGljeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5I2dldE1ldGhvZCA8ZW0+TWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDbG9uZUNvcHlQb2xpY3kjZ2V0TWV0aG9kKCkKLQkgKiBAc2VlICNnZXRYbWxDbG9uZUNvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDbG9uZUNvcHlQb2xpY3lfTWV0aG9kKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDbG9uZUNvcHlQb2xpY3lFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5I2dldFdvcmtpbmdDb3B5TWV0aG9kIDxlbT5Xb3JraW5nIENvcHkgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V29ya2luZyBDb3B5IE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5I2dldFdvcmtpbmdDb3B5TWV0aG9kKCkKLQkgKiBAc2VlICNnZXRYbWxDbG9uZUNvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDbG9uZUNvcHlQb2xpY3lfV29ya2luZ0NvcHlNZXRob2QoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENsb25lQ29weVBvbGljeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sbGVjdGlvblRhYmxlIDxlbT5YbWwgQ29sbGVjdGlvbiBUYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ29sbGVjdGlvbiBUYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sbGVjdGlvblRhYmxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ29sbGVjdGlvblRhYmxlKCkKLQl7Ci0JCXJldHVybiB4bWxDb2xsZWN0aW9uVGFibGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUgPGVtPlhtbCBDb252ZXJzaW9uIFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDb252ZXJzaW9uIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDb252ZXJzaW9uVmFsdWUoKQotCXsKLQkJcmV0dXJuIHhtbENvbnZlcnNpb25WYWx1ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVyc2lvblZhbHVlI2dldERhdGFWYWx1ZSA8ZW0+RGF0YSBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRhdGEgVmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZSNnZXREYXRhVmFsdWUoKQotCSAqIEBzZWUgI2dldFhtbENvbnZlcnNpb25WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENvbnZlcnNpb25WYWx1ZV9EYXRhVmFsdWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENvbnZlcnNpb25WYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUjZ2V0T2JqZWN0VmFsdWUgPGVtPk9iamVjdCBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9iamVjdCBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVyc2lvblZhbHVlI2dldE9iamVjdFZhbHVlKCkKLQkgKiBAc2VlICNnZXRYbWxDb252ZXJzaW9uVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDb252ZXJzaW9uVmFsdWVfT2JqZWN0VmFsdWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENvbnZlcnNpb25WYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyIDxlbT5YbWwgQ29udmVydGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDb252ZXJ0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbENvbnZlcnRlcigpCi0JewotCQlyZXR1cm4geG1sQ29udmVydGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXIjZ2V0Q2xhc3NOYW1lIDxlbT5DbGFzcyBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyI2dldENsYXNzTmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ29udmVydGVyX0NsYXNzTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ29udmVydGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJDb250YWluZXIgPGVtPlhtbCBDb252ZXJ0ZXIgQ29udGFpbmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDb252ZXJ0ZXIgQ29udGFpbmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJDb250YWluZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDb252ZXJ0ZXJDb250YWluZXIoKQotCXsKLQkJcmV0dXJuIHhtbENvbnZlcnRlckNvbnRhaW5lckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJDb250YWluZXIjZ2V0Q29udmVydGVycyA8ZW0+Q29udmVydGVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udmVydGVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyQ29udGFpbmVyI2dldENvbnZlcnRlcnMoKQotCSAqIEBzZWUgI2dldFhtbENvbnZlcnRlckNvbnRhaW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9Db252ZXJ0ZXJzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxDb252ZXJ0ZXJDb250YWluZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJDb250YWluZXIjZ2V0VHlwZUNvbnZlcnRlcnMgPGVtPlR5cGUgQ29udmVydGVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJDb250YWluZXIjZ2V0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBzZWUgI2dldFhtbENvbnZlcnRlckNvbnRhaW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9UeXBlQ29udmVydGVycygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQ29udmVydGVyQ29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyQ29udGFpbmVyI2dldE9iamVjdFR5cGVDb252ZXJ0ZXJzIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJDb250YWluZXIjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBzZWUgI2dldFhtbENvbnZlcnRlckNvbnRhaW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9PYmplY3RUeXBlQ29udmVydGVycygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQ29udmVydGVyQ29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyQ29udGFpbmVyI2dldFN0cnVjdENvbnZlcnRlcnMgPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyQ29udGFpbmVyI2dldFN0cnVjdENvbnZlcnRlcnMoKQotCSAqIEBzZWUgI2dldFhtbENvbnZlcnRlckNvbnRhaW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9TdHJ1Y3RDb252ZXJ0ZXJzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxDb252ZXJ0ZXJDb250YWluZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyA8ZW0+WG1sIENvbnZlcnRpYmxlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENvbnZlcnRpYmxlIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbENvbnZlcnRpYmxlTWFwcGluZygpCi0JewotCQlyZXR1cm4geG1sQ29udmVydGlibGVNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmcjZ2V0Q29udmVydCA8ZW0+Q29udmVydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbnZlcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyNnZXRDb252ZXJ0KCkKLQkgKiBAc2VlICNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfQ29udmVydCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ29udmVydGlibGVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb3B5UG9saWN5IDxlbT5YbWwgQ29weSBQb2xpY3k8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENvcHkgUG9saWN5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb3B5UG9saWN5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4geG1sQ29weVBvbGljeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29weVBvbGljeSNnZXRDbGFzc18gPGVtPkNsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvcHlQb2xpY3kjZ2V0Q2xhc3NfKCkKLQkgKiBAc2VlICNnZXRYbWxDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ29weVBvbGljeV9DbGFzcygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ29weVBvbGljeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplciA8ZW0+WG1sIEN1c3RvbWl6ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEN1c3RvbWl6ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDdXN0b21pemVyKCkKLQl7Ci0JCXJldHVybiB4bWxDdXN0b21pemVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVyI2dldEN1c3RvbWl6ZXJDbGFzc05hbWUgPGVtPkN1c3RvbWl6ZXIgQ2xhc3MgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkN1c3RvbWl6ZXIgQ2xhc3MgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplciNnZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxDdXN0b21pemVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ3VzdG9taXplcl9DdXN0b21pemVyQ2xhc3NOYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDdXN0b21pemVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVySG9sZGVyIDxlbT5YbWwgQ3VzdG9taXplciBIb2xkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEN1c3RvbWl6ZXIgSG9sZGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVySG9sZGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ3VzdG9taXplckhvbGRlcigpCi0JewotCQlyZXR1cm4geG1sQ3VzdG9taXplckhvbGRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplckhvbGRlciNnZXRDdXN0b21pemVyIDxlbT5DdXN0b21pemVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q3VzdG9taXplcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplckhvbGRlciNnZXRDdXN0b21pemVyKCkKLQkgKiBAc2VlICNnZXRYbWxDdXN0b21pemVySG9sZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sQ3VzdG9taXplckhvbGRlcl9DdXN0b21pemVyKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxDdXN0b21pemVySG9sZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uKCkKLQl7Ci0JCXJldHVybiB4bWxFbGVtZW50Q29sbGVjdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUgPGVtPlhtbCBFbWJlZGRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbWJlZGRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW1iZWRkYWJsZSgpCi0JewotCQlyZXR1cm4geG1sRW1iZWRkYWJsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRDb3B5UG9saWN5IDxlbT5Db3B5IFBvbGljeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNvcHkgUG9saWN5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlI2dldENvcHlQb2xpY3koKQotCSAqIEBzZWUgI2dldFhtbEVtYmVkZGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbWJlZGRhYmxlX0NvcHlQb2xpY3koKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVtYmVkZGFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSA8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCSAqIEBzZWUgI2dldFhtbEVtYmVkZGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbWJlZGRhYmxlX0luc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbWJlZGRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0Q2xvbmVDb3B5UG9saWN5IDxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlI2dldENsb25lQ29weVBvbGljeSgpCi0JICogQHNlZSAjZ2V0WG1sRW1iZWRkYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVtYmVkZGFibGVfQ2xvbmVDb3B5UG9saWN5KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbWJlZGRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQotCSAqIEBzZWUgI2dldFhtbEVtYmVkZGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbWJlZGRhYmxlX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEVtYmVkZGFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkIDxlbT5YbWwgRW1iZWRkZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVtYmVkZGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVtYmVkZGVkKCkKLQl7Ci0JCXJldHVybiB4bWxFbWJlZGRlZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQgPGVtPlhtbCBFbWJlZGRlZCBJZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW1iZWRkZWQgSWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbWJlZGRlZElkKCkKLQl7Ci0JCXJldHVybiB4bWxFbWJlZGRlZElkRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5IDxlbT5YbWwgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVudGl0eSgpCi0JewotCQlyZXR1cm4geG1sRW50aXR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0T3B0aW1pc3RpY0xvY2tpbmcgPGVtPk9wdGltaXN0aWMgTG9ja2luZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk9wdGltaXN0aWMgTG9ja2luZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldE9wdGltaXN0aWNMb2NraW5nKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfT3B0aW1pc3RpY0xvY2tpbmcoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q29weVBvbGljeSA8ZW0+Q29weSBQb2xpY3k8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Db3B5IFBvbGljeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldENvcHlQb2xpY3koKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9Db3B5UG9saWN5KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5IDxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q2xvbmVDb3B5UG9saWN5IDxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q2xvbmVDb3B5UG9saWN5KCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfQ2xvbmVDb3B5UG9saWN5KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVudGl0eV9FeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzIDxlbT5YbWwgRW50aXR5IE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQotCXsKLQkJcmV0dXJuIHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hBdHRyaWJ1dGUgPGVtPlhtbCBGZXRjaCBBdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEZldGNoIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hBdHRyaWJ1dGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxGZXRjaEF0dHJpYnV0ZSgpCi0JewotCQlyZXR1cm4geG1sRmV0Y2hBdHRyaWJ1dGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxGZXRjaEdyb3VwIDxlbT5YbWwgRmV0Y2ggR3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEZldGNoIEdyb3VwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxGZXRjaEdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRmV0Y2hHcm91cCgpCi0JewotCQlyZXR1cm4geG1sRmV0Y2hHcm91cEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkIDxlbT5YbWwgSWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIElkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbElkKCkKLQl7Ci0JCXJldHVybiB4bWxJZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEluZGV4IDxlbT5YbWwgSW5kZXg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEluZGV4PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJbmRleAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEluZGV4KCkKLQl7Ci0JCXJldHVybiB4bWxJbmRleEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IDxlbT5YbWwgSW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgSW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4geG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3lFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2ggPGVtPlhtbCBKb2luIEZldGNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBKb2luIEZldGNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2gKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxKb2luRmV0Y2goKQotCXsKLQkJcmV0dXJuIHhtbEpvaW5GZXRjaEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoI2dldEpvaW5GZXRjaCA8ZW0+Sm9pbiBGZXRjaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaCNnZXRKb2luRmV0Y2goKQotCSAqIEBzZWUgI2dldFhtbEpvaW5GZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEpvaW5GZXRjaF9Kb2luRmV0Y2goKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEpvaW5GZXRjaEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlIDxlbT5YbWwgSm9pbiBUYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgSm9pbiBUYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sSm9pblRhYmxlKCkKLQl7Ci0JCXJldHVybiB4bWxKb2luVGFibGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55IDxlbT5YbWwgTWFueSBUbyBNYW55PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYW55IFRvIE1hbnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYW55VG9NYW55KCkKLQl7Ci0JCXJldHVybiB4bWxNYW55VG9NYW55RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lIDxlbT5YbWwgTWFueSBUbyBPbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hbnkgVG8gT25lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYW55VG9PbmUoKQotCXsKLQkJcmV0dXJuIHhtbE1hbnlUb09uZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MgPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQl7Ci0JCXJldHVybiB4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldE9wdGltaXN0aWNMb2NraW5nIDxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0T3B0aW1pc3RpY0xvY2tpbmcoKQotCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX09wdGltaXN0aWNMb2NraW5nKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0Q29weVBvbGljeSA8ZW0+Q29weSBQb2xpY3k8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Db3B5IFBvbGljeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRDb3B5UG9saWN5KCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19Db3B5UG9saWN5KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldENsb25lQ29weVBvbGljeSA8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRDbG9uZUNvcHlQb2xpY3koKQotCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0Nsb25lQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19FeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNdWx0aXRlbmFudCA8ZW0+WG1sIE11bHRpdGVuYW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNdWx0aXRlbmFudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGl0ZW5hbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNdWx0aXRlbmFudCgpCi0JewotCQlyZXR1cm4geG1sTXVsdGl0ZW5hbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNdWx0aXRlbmFudEhvbGRlciA8ZW0+WG1sIE11bHRpdGVuYW50IEhvbGRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTXVsdGl0ZW5hbnQgSG9sZGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNdWx0aXRlbmFudEhvbGRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE11bHRpdGVuYW50SG9sZGVyKCkKLQl7Ci0JCXJldHVybiB4bWxNdWx0aXRlbmFudEhvbGRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGl0ZW5hbnRIb2xkZXIjZ2V0TXVsdGl0ZW5hbnQgPGVtPk11bHRpdGVuYW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TXVsdGl0ZW5hbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11bHRpdGVuYW50SG9sZGVyI2dldE11bHRpdGVuYW50KCkKLQkgKiBAc2VlICNnZXRYbWxNdWx0aXRlbmFudEhvbGRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE11bHRpdGVuYW50SG9sZGVyX011bHRpdGVuYW50KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNdWx0aXRlbmFudEhvbGRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXV0YWJsZSA8ZW0+WG1sIE11dGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE11dGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11dGFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNdXRhYmxlKCkKLQl7Ci0JCXJldHVybiB4bWxNdXRhYmxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNdXRhYmxlI2dldE11dGFibGUgPGVtPk11dGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NdXRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNdXRhYmxlI2dldE11dGFibGUoKQotCSAqIEBzZWUgI2dldFhtbE11dGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxNdXRhYmxlX011dGFibGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE11dGFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29udmVydGVyIDxlbT5YbWwgTmFtZWQgQ29udmVydGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBOYW1lZCBDb252ZXJ0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29udmVydGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTmFtZWRDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIHhtbE5hbWVkQ29udmVydGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlciNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb252ZXJ0ZXIjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sTmFtZWRDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxOYW1lZENvbnZlcnRlcl9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxOYW1lZENvbnZlcnRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnkgPGVtPlhtbCBOYW1lZCBQbHNxbCBTdG9yZWQgRnVuY3Rpb24gUXVlcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE5hbWVkIFBsc3FsIFN0b3JlZCBGdW5jdGlvbiBRdWVyeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeSgpCi0JewotCQlyZXR1cm4geG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnkgPGVtPlhtbCBOYW1lZCBQbHNxbCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBOYW1lZCBQbHNxbCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQotCXsKLQkJcmV0dXJuIHhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeSA8ZW0+WG1sIE5hbWVkIFN0b3JlZCBGdW5jdGlvbiBRdWVyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTmFtZWQgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnkoKQotCXsKLQkJcmV0dXJuIHhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgPGVtPlhtbCBOYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBOYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSgpCi0JewotCQlyZXR1cm4geG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0UmVzdWx0Q2xhc3MgPGVtPlJlc3VsdCBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc3VsdCBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRSZXN1bHRDbGFzcygpCi0JICogQHNlZSAjZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmVzdWx0Q2xhc3MoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRSZXN1bHRTZXRNYXBwaW5nIDxlbT5SZXN1bHQgU2V0IE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXN1bHQgU2V0IE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0UmVzdWx0U2V0TWFwcGluZygpCi0JICogQHNlZSAjZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmVzdWx0U2V0TWFwcGluZygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFByb2NlZHVyZU5hbWUgPGVtPlByb2NlZHVyZSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvY2VkdXJlIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0UHJvY2VkdXJlTmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUHJvY2VkdXJlTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFJldHVybnNSZXN1bHRTZXQgPGVtPlJldHVybnMgUmVzdWx0IFNldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJldHVybnMgUmVzdWx0IFNldDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRSZXR1cm5zUmVzdWx0U2V0KCkKLQkgKiBAc2VlICNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9SZXR1cm5zUmVzdWx0U2V0KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRIaW50cyA8ZW0+SGludHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkhpbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldEhpbnRzKCkKLQkgKiBAc2VlICNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9IaW50cygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0UGFyYW1ldGVycyA8ZW0+UGFyYW1ldGVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGFyYW1ldGVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRQYXJhbWV0ZXJzKCkKLQkgKiBAc2VlICNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9QYXJhbWV0ZXJzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyIDxlbT5YbWwgT2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyKCkKLQl7Ci0JCXJldHVybiB4bWxPYmplY3RUeXBlQ29udmVydGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyI2dldERhdGFUeXBlIDxlbT5EYXRhIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EYXRhIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIjZ2V0RGF0YVR5cGUoKQotCSAqIEBzZWUgI2dldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX0RhdGFUeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxPYmplY3RUeXBlQ29udmVydGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIjZ2V0T2JqZWN0VHlwZSA8ZW0+T2JqZWN0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PYmplY3QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciNnZXRPYmplY3RUeXBlKCkKLQkgKiBAc2VlICNnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9PYmplY3RUeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxPYmplY3RUeXBlQ29udmVydGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciNnZXRDb252ZXJzaW9uVmFsdWVzIDxlbT5Db252ZXJzaW9uIFZhbHVlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udmVyc2lvbiBWYWx1ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIjZ2V0Q29udmVyc2lvblZhbHVlcygpCi0JICogQHNlZSAjZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfQ29udmVyc2lvblZhbHVlcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sT2JqZWN0VHlwZUNvbnZlcnRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyI2dldERlZmF1bHRPYmplY3RWYWx1ZSA8ZW0+RGVmYXVsdCBPYmplY3QgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IE9iamVjdCBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciNnZXREZWZhdWx0T2JqZWN0VmFsdWUoKQotCSAqIEBzZWUgI2dldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX0RlZmF1bHRPYmplY3RWYWx1ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sT2JqZWN0VHlwZUNvbnZlcnRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55IDxlbT5YbWwgT25lIFRvIE1hbnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE9uZSBUbyBNYW55PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxPbmVUb01hbnkoKQotCXsKLQkJcmV0dXJuIHhtbE9uZVRvTWFueUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lIDxlbT5YbWwgT25lIFRvIE9uZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT25lIFRvIE9uZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxPbmVUb09uZSgpCi0JewotCQlyZXR1cm4geG1sT25lVG9PbmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZyA8ZW0+WG1sIE9wdGltaXN0aWMgTG9ja2luZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT3B0aW1pc3RpYyBMb2NraW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE9wdGltaXN0aWNMb2NraW5nKCkKLQl7Ci0JCXJldHVybiB4bWxPcHRpbWlzdGljTG9ja2luZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFhtbE9wdGltaXN0aWNMb2NraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfVHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sT3B0aW1pc3RpY0xvY2tpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcjZ2V0Q2FzY2FkZSA8ZW0+Q2FzY2FkZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhc2NhZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nI2dldENhc2NhZGUoKQotCSAqIEBzZWUgI2dldFhtbE9wdGltaXN0aWNMb2NraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfQ2FzY2FkZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sT3B0aW1pc3RpY0xvY2tpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZyNnZXRTZWxlY3RlZENvbHVtbnMgPGVtPlNlbGVjdGVkIENvbHVtbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlbGVjdGVkIENvbHVtbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nI2dldFNlbGVjdGVkQ29sdW1ucygpCi0JICogQHNlZSAjZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxPcHRpbWlzdGljTG9ja2luZ19TZWxlY3RlZENvbHVtbnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE9wdGltaXN0aWNMb2NraW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlckNvbHVtbiA8ZW0+WG1sIE9yZGVyIENvbHVtbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT3JkZXIgQ29sdW1uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlckNvbHVtbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE9yZGVyQ29sdW1uKCkKLQl7Ci0JCXJldHVybiB4bWxPcmRlckNvbHVtbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpCi0JewotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKQotCXsKLQkJcmV0dXJuIHhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSNpc0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEjaXNFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5IDxlbT5YbWwgUHJpbWFyeSBLZXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFByaW1hcnkgS2V5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUHJpbWFyeUtleSgpCi0JewotCQlyZXR1cm4geG1sUHJpbWFyeUtleUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaXZhdGVPd25lZCA8ZW0+WG1sIFByaXZhdGUgT3duZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFByaXZhdGUgT3duZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaXZhdGVPd25lZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFByaXZhdGVPd25lZCgpCi0JewotCQlyZXR1cm4geG1sUHJpdmF0ZU93bmVkRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcml2YXRlT3duZWQjaXNQcml2YXRlT3duZWQgPGVtPlByaXZhdGUgT3duZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcml2YXRlIE93bmVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcml2YXRlT3duZWQjaXNQcml2YXRlT3duZWQoKQotCSAqIEBzZWUgI2dldFhtbFByaXZhdGVPd25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFByaXZhdGVPd25lZF9Qcml2YXRlT3duZWQoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFByaXZhdGVPd25lZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkgPGVtPlhtbCBQcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUHJvcGVydHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUHJvcGVydHkoKQotCXsKLQkJcmV0dXJuIHhtbFByb3BlcnR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sUHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQcm9wZXJ0eV9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldFhtbFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUHJvcGVydHlfVmFsdWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5I2dldFZhbHVlVHlwZSA8ZW0+VmFsdWUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5I2dldFZhbHVlVHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sUHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQcm9wZXJ0eV9WYWx1ZVR5cGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eUNvbnRhaW5lciA8ZW0+WG1sIFByb3BlcnR5IENvbnRhaW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUHJvcGVydHkgQ29udGFpbmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eUNvbnRhaW5lcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFByb3BlcnR5Q29udGFpbmVyKCkKLQl7Ci0JCXJldHVybiB4bWxQcm9wZXJ0eUNvbnRhaW5lckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eUNvbnRhaW5lciNnZXRQcm9wZXJ0aWVzIDxlbT5Qcm9wZXJ0aWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eUNvbnRhaW5lciNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFByb3BlcnR5Q29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lciA8ZW0+WG1sIFF1ZXJ5IENvbnRhaW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUXVlcnkgQ29udGFpbmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFF1ZXJ5Q29udGFpbmVyKCkKLQl7Ci0JCXJldHVybiB4bWxRdWVyeUNvbnRhaW5lckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lciNnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgPGVtPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lciNnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKQotCSAqIEBzZWUgI2dldFhtbFF1ZXJ5Q29udGFpbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxRdWVyeUNvbnRhaW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlSZWRpcmVjdG9ycyA8ZW0+WG1sIFF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBRdWVyeSBSZWRpcmVjdG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlSZWRpcmVjdG9ycwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFF1ZXJ5UmVkaXJlY3RvcnMoKQotCXsKLQkJcmV0dXJuIHhtbFF1ZXJ5UmVkaXJlY3RvcnNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seSA8ZW0+WG1sIFJlYWQgT25seTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUmVhZCBPbmx5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFJlYWRPbmx5KCkKLQl7Ci0JCXJldHVybiB4bWxSZWFkT25seUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVhZE9ubHkjZ2V0UmVhZE9ubHkgPGVtPlJlYWQgT25seTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlYWQgT25seTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVhZE9ubHkjZ2V0UmVhZE9ubHkoKQotCSAqIEBzZWUgI2dldFhtbFJlYWRPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUmVhZE9ubHlfUmVhZE9ubHkoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFJlYWRPbmx5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZXR1cm5JbnNlcnQgPGVtPlhtbCBSZXR1cm4gSW5zZXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBSZXR1cm4gSW5zZXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZXR1cm5JbnNlcnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxSZXR1cm5JbnNlcnQoKQotCXsKLQkJcmV0dXJuIHhtbFJldHVybkluc2VydEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlIDxlbT5YbWwgU2Vjb25kYXJ5IFRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBTZWNvbmRhcnkgVGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sU2Vjb25kYXJ5VGFibGUoKQotCXsKLQkJcmV0dXJuIHhtbFNlY29uZGFyeVRhYmxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIDxlbT5YbWwgU3RvcmVkIFByb2NlZHVyZSBQYXJhbWV0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFN0b3JlZCBQcm9jZWR1cmUgUGFyYW1ldGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKQotCXsKLQkJcmV0dXJuIHhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldERpcmVjdGlvbiA8ZW0+RGlyZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGlyZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0RGlyZWN0aW9uKCkKLQkgKiBAc2VlICNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfRGlyZWN0aW9uKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0UXVlcnlQYXJhbWV0ZXIgPGVtPlF1ZXJ5IFBhcmFtZXRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlF1ZXJ5IFBhcmFtZXRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldFF1ZXJ5UGFyYW1ldGVyKCkKLQkgKiBAc2VlICNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfUXVlcnlQYXJhbWV0ZXIoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfVHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRKZGJjVHlwZSA8ZW0+SmRiYyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SmRiYyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0SmRiY1R5cGUoKQotCSAqIEBzZWUgI2dldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9KZGJjVHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRKZGJjVHlwZU5hbWUgPGVtPkpkYmMgVHlwZSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SmRiYyBUeXBlIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRKZGJjVHlwZU5hbWUoKQotCSAqIEBzZWUgI2dldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9KZGJjVHlwZU5hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0IDxlbT5YbWwgU3RydWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBTdHJ1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFN0cnVjdCgpCi0JewotCQlyZXR1cm4geG1sU3RydWN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyIDxlbT5YbWwgU3RydWN0IENvbnZlcnRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgU3RydWN0IENvbnZlcnRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sU3RydWN0Q29udmVydGVyKCkKLQl7Ci0JCXJldHVybiB4bWxTdHJ1Y3RDb252ZXJ0ZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlciNnZXRDb252ZXJ0ZXIgPGVtPkNvbnZlcnRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbnZlcnRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyI2dldENvbnZlcnRlcigpCi0JICogQHNlZSAjZ2V0WG1sU3RydWN0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sU3RydWN0Q29udmVydGVyX0NvbnZlcnRlcigpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sU3RydWN0Q29udmVydGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3R1cmUgPGVtPlhtbCBTdHJ1Y3R1cmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFN0cnVjdHVyZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0dXJlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sU3RydWN0dXJlKCkKLQl7Ci0JCXJldHVybiB4bWxTdHJ1Y3R1cmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZSA8ZW0+WG1sIFRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBUYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxUYWJsZSgpCi0JewotCQlyZXR1cm4geG1sVGFibGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciA8ZW0+WG1sIFRhYmxlIEdlbmVyYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVGFibGUgR2VuZXJhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFRhYmxlR2VuZXJhdG9yKCkKLQl7Ci0JCXJldHVybiB4bWxUYWJsZUdlbmVyYXRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4gPGVtPlhtbCBUZW5hbnQgRGlzY3JpbWluYXRvciBDb2x1bW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFRlbmFudCBEaXNjcmltaW5hdG9yIENvbHVtbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKQotCXsKLQkJcmV0dXJuIHhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkgPGVtPlhtbCBUaW1lIE9mIERheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVGltZSBPZiBEYXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFRpbWVPZkRheSgpCi0JewotCQlyZXR1cm4geG1sVGltZU9mRGF5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkjZ2V0SG91ciA8ZW0+SG91cjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhvdXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRIb3VyKCkKLQkgKiBAc2VlICNnZXRYbWxUaW1lT2ZEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUaW1lT2ZEYXlfSG91cigpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVGltZU9mRGF5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRNaW51dGUgPGVtPk1pbnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1pbnV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5I2dldE1pbnV0ZSgpCi0JICogQHNlZSAjZ2V0WG1sVGltZU9mRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sVGltZU9mRGF5X01pbnV0ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVGltZU9mRGF5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRTZWNvbmQgPGVtPlNlY29uZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlY29uZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5I2dldFNlY29uZCgpCi0JICogQHNlZSAjZ2V0WG1sVGltZU9mRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sVGltZU9mRGF5X1NlY29uZCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVGltZU9mRGF5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRNaWxsaXNlY29uZCA8ZW0+TWlsbGlzZWNvbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NaWxsaXNlY29uZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5I2dldE1pbGxpc2Vjb25kKCkKLQkgKiBAc2VlICNnZXRYbWxUaW1lT2ZEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUaW1lT2ZEYXlfTWlsbGlzZWNvbmQoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFRpbWVPZkRheUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNmb3JtYXRpb24gPGVtPlhtbCBUcmFuc2Zvcm1hdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVHJhbnNmb3JtYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zZm9ybWF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVHJhbnNmb3JtYXRpb24oKQotCXsKLQkJcmV0dXJuIHhtbFRyYW5zZm9ybWF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50IDxlbT5YbWwgVHJhbnNpZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBUcmFuc2llbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFRyYW5zaWVudCgpCi0JewotCQlyZXR1cm4geG1sVHJhbnNpZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlciA8ZW0+WG1sIFR5cGUgQ29udmVydGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBUeXBlIENvbnZlcnRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFR5cGVDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIHhtbFR5cGVDb252ZXJ0ZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIjZ2V0RGF0YVR5cGUgPGVtPkRhdGEgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRhdGEgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlciNnZXREYXRhVHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sVHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFR5cGVDb252ZXJ0ZXJfRGF0YVR5cGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFR5cGVDb252ZXJ0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlciNnZXRPYmplY3RUeXBlIDxlbT5PYmplY3QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9iamVjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyI2dldE9iamVjdFR5cGUoKQotCSAqIEBzZWUgI2dldFhtbFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUeXBlQ29udmVydGVyX09iamVjdFR5cGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFR5cGVDb252ZXJ0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nIDxlbT5YbWwgVHlwZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBUeXBlIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVHlwZU1hcHBpbmcoKQotCXsKLQkJcmV0dXJuIHhtbFR5cGVNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZSA8ZW0+WG1sIFZhcmlhYmxlIE9uZSBUbyBPbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFZhcmlhYmxlIE9uZSBUbyBPbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxWYXJpYWJsZU9uZVRvT25lKCkKLQl7Ci0JCXJldHVybiB4bWxWYXJpYWJsZU9uZVRvT25lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lI2dldFRhcmdldEludGVyZmFjZSA8ZW0+VGFyZ2V0IEludGVyZmFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhcmdldCBJbnRlcmZhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmUjZ2V0VGFyZ2V0SW50ZXJmYWNlKCkKLQkgKiBAc2VlICNnZXRYbWxWYXJpYWJsZU9uZVRvT25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sVmFyaWFibGVPbmVUb09uZV9UYXJnZXRJbnRlcmZhY2UoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFZhcmlhYmxlT25lVG9PbmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24gPGVtPlhtbCBWZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBWZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVmVyc2lvbigpCi0JewotCQlyZXR1cm4geG1sVmVyc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEhhc2hQYXJ0aXRpb25pbmcgPGVtPlhtbCBIYXNoIFBhcnRpdGlvbmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgSGFzaCBQYXJ0aXRpb25pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEhhc2hQYXJ0aXRpb25pbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxIYXNoUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB4bWxIYXNoUGFydGl0aW9uaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGFydGl0aW9uaW5nIDxlbT5YbWwgUGFydGl0aW9uaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQYXJ0aXRpb25pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBhcnRpdGlvbmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4geG1sUGFydGl0aW9uaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGlubmVkUGFydGl0aW9uaW5nIDxlbT5YbWwgUGlubmVkIFBhcnRpdGlvbmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUGlubmVkIFBhcnRpdGlvbmluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGlubmVkUGFydGl0aW9uaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUGlubmVkUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB4bWxQaW5uZWRQYXJ0aXRpb25pbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQbHNxbFJlY29yZCA8ZW0+WG1sIFBsc3FsIFJlY29yZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUGxzcWwgUmVjb3JkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQbHNxbFJlY29yZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFBsc3FsUmVjb3JkKCkKLQl7Ci0JCXJldHVybiB4bWxQbHNxbFJlY29yZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBsc3FsVGFibGUgPGVtPlhtbCBQbHNxbCBUYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUGxzcWwgVGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBsc3FsVGFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxQbHNxbFRhYmxlKCkKLQl7Ci0JCXJldHVybiB4bWxQbHNxbFRhYmxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmFuZ2VQYXJ0aXRpb25pbmcgPGVtPlhtbCBSYW5nZSBQYXJ0aXRpb25pbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFJhbmdlIFBhcnRpdGlvbmluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmFuZ2VQYXJ0aXRpb25pbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxSYW5nZVBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4geG1sUmFuZ2VQYXJ0aXRpb25pbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZyA8ZW0+WG1sIFJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB4bWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgPGVtPlhtbCBSb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlvblBhcnRpdGlvbmluZyA8ZW0+WG1sIFVuaW9uIFBhcnRpdGlvbmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVW5pb24gUGFydGl0aW9uaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlvblBhcnRpdGlvbmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFVuaW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB4bWxVbmlvblBhcnRpdGlvbmluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhbHVlUGFydGl0aW9uaW5nIDxlbT5YbWwgVmFsdWUgUGFydGl0aW9uaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBWYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhbHVlUGFydGl0aW9uaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVmFsdWVQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHhtbFZhbHVlUGFydGl0aW9uaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUgPGVtPkNhY2hlIENvb3JkaW5hdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+Q2FjaGUgQ29vcmRpbmF0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0Q2FjaGVDb29yZGluYXRpb25UeXBlKCkKLQl7Ci0JCXJldHVybiBjYWNoZUNvb3JkaW5hdGlvblR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlIDxlbT5DYWNoZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+Q2FjaGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRDYWNoZVR5cGUoKQotCXsKLQkJcmV0dXJuIGNhY2hlVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ1R5cGUgPGVtPlhtbCBDaGFuZ2UgVHJhY2tpbmcgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlhtbCBDaGFuZ2UgVHJhY2tpbmcgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRYbWxDaGFuZ2VUcmFja2luZ1R5cGUoKQotCXsKLQkJcmV0dXJuIHhtbENoYW5nZVRyYWNraW5nVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXJlY3Rpb24gPGVtPlhtbCBEaXJlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5YbWwgRGlyZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXJlY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFhtbERpcmVjdGlvbigpCi0JewotCQlyZXR1cm4geG1sRGlyZWN0aW9uRUVudW07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUgPGVtPkV4aXN0ZW5jZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+RXhpc3RlbmNlIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldEV4aXN0ZW5jZVR5cGUoKQotCXsKLQkJcmV0dXJuIGV4aXN0ZW5jZVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZSA8ZW0+WG1sIEpvaW4gRmV0Y2ggVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlhtbCBKb2luIEZldGNoIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFhtbEpvaW5GZXRjaFR5cGUoKQotCXsKLQkJcmV0dXJuIHhtbEpvaW5GZXRjaFR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIDxlbT5YbWwgT3B0aW1pc3RpYyBMb2NraW5nIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5YbWwgT3B0aW1pc3RpYyBMb2NraW5nIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlKCkKLQl7Ci0JCXJldHVybiB4bWxPcHRpbWlzdGljTG9ja2luZ1R5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1GYWN0b3J5IGdldEVjbGlwc2VMaW5rT3JtRmFjdG9yeSgpCi0JewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rT3JtRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCXhtbEFjY2Vzc01ldGhvZHNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0FDQ0VTU19NRVRIT0RTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxBY2Nlc3NNZXRob2RzRUNsYXNzLCBYTUxfQUNDRVNTX01FVEhPRFNfX0dFVF9NRVRIT0QpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEFjY2Vzc01ldGhvZHNFQ2xhc3MsIFhNTF9BQ0NFU1NfTUVUSE9EU19fU0VUX01FVEhPRCk7Ci0KLQkJeG1sQWNjZXNzTWV0aG9kc0hvbGRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxBY2Nlc3NNZXRob2RzSG9sZGVyRUNsYXNzLCBYTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUyk7Ci0KLQkJeG1sQWRkaXRpb25hbENyaXRlcmlhRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9BRERJVElPTkFMX0NSSVRFUklBKTsKLQotCQl4bWxBcnJheUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQVJSQVkpOwotCi0JCXhtbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0FUVFJJQlVURV9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLCBYTUxfQVRUUklCVVRFX01BUFBJTkdfX0FUVFJJQlVURV9UWVBFKTsKLQotCQlhdHRyaWJ1dGVzRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFUVFJJQlVURVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGF0dHJpYnV0ZXNFQ2xhc3MsIEFUVFJJQlVURVNfX0JBU0lDX0NPTExFQ1RJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhdHRyaWJ1dGVzRUNsYXNzLCBBVFRSSUJVVEVTX19CQVNJQ19NQVBTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhdHRyaWJ1dGVzRUNsYXNzLCBBVFRSSUJVVEVTX19UUkFOU0ZPUk1BVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGF0dHJpYnV0ZXNFQ2xhc3MsIEFUVFJJQlVURVNfX1ZBUklBQkxFX09ORV9UT19PTkVTKTsKLQotCQl4bWxCYXNpY0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQkFTSUMpOwotCi0JCXhtbEJhc2ljQ29sbGVjdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQkFTSUNfQ09MTEVDVElPTik7Ci0KLQkJeG1sQmFzaWNNYXBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0JBU0lDX01BUCk7Ci0KLQkJeG1sQmF0Y2hGZXRjaEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQkFUQ0hfRkVUQ0gpOwotCi0JCXhtbEJhdGNoRmV0Y2hIb2xkZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0JBVENIX0ZFVENIX0hPTERFUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQmF0Y2hGZXRjaEhvbGRlckVDbGFzcywgWE1MX0JBVENIX0ZFVENIX0hPTERFUl9fQkFUQ0hfRkVUQ0gpOwotCi0JCXhtbENhY2hlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DQUNIRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2FjaGVFQ2xhc3MsIFhNTF9DQUNIRV9fRVhQSVJZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDYWNoZUVDbGFzcywgWE1MX0NBQ0hFX19TSVpFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDYWNoZUVDbGFzcywgWE1MX0NBQ0hFX19TSEFSRUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENhY2hlRUNsYXNzLCBYTUxfQ0FDSEVfX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENhY2hlRUNsYXNzLCBYTUxfQ0FDSEVfX0FMV0FZU19SRUZSRVNIKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDYWNoZUVDbGFzcywgWE1MX0NBQ0hFX19SRUZSRVNIX09OTFlfSUZfTkVXRVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENhY2hlRUNsYXNzLCBYTUxfQ0FDSEVfX0RJU0FCTEVfSElUUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2FjaGVFQ2xhc3MsIFhNTF9DQUNIRV9fQ09PUkRJTkFUSU9OX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbENhY2hlRUNsYXNzLCBYTUxfQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWSk7Ci0KLQkJeG1sQ2FjaGVIb2xkZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0NBQ0hFX0hPTERFUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQ2FjaGVIb2xkZXJFQ2xhc3MsIFhNTF9DQUNIRV9IT0xERVJfX0NBQ0hFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDYWNoZUhvbGRlckVDbGFzcywgWE1MX0NBQ0hFX0hPTERFUl9fRVhJU1RFTkNFX0NIRUNLSU5HKTsKLQotCQl4bWxDYWNoZUluZGV4RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DQUNIRV9JTkRFWCk7Ci0KLQkJeG1sQ2hhbmdlVHJhY2tpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0NIQU5HRV9UUkFDS0lORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2hhbmdlVHJhY2tpbmdFQ2xhc3MsIFhNTF9DSEFOR0VfVFJBQ0tJTkdfX1RZUEUpOwotCi0JCXhtbENoYW5nZVRyYWNraW5nSG9sZGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DSEFOR0VfVFJBQ0tJTkdfSE9MREVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxDaGFuZ2VUcmFja2luZ0hvbGRlckVDbGFzcywgWE1MX0NIQU5HRV9UUkFDS0lOR19IT0xERVJfX0NIQU5HRV9UUkFDS0lORyk7Ci0KLQkJeG1sQ2xvbmVDb3B5UG9saWN5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DTE9ORV9DT1BZX1BPTElDWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2xvbmVDb3B5UG9saWN5RUNsYXNzLCBYTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX01FVEhPRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2xvbmVDb3B5UG9saWN5RUNsYXNzLCBYTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX1dPUktJTkdfQ09QWV9NRVRIT0QpOwotCi0JCXhtbENvbGxlY3Rpb25UYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ09MTEVDVElPTl9UQUJMRSk7Ci0KLQkJeG1sQ29udmVyc2lvblZhbHVlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DT05WRVJTSU9OX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDb252ZXJzaW9uVmFsdWVFQ2xhc3MsIFhNTF9DT05WRVJTSU9OX1ZBTFVFX19EQVRBX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDb252ZXJzaW9uVmFsdWVFQ2xhc3MsIFhNTF9DT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUUpOwotCi0JCXhtbENvbnZlcnRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ09OVkVSVEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDb252ZXJ0ZXJFQ2xhc3MsIFhNTF9DT05WRVJURVJfX0NMQVNTX05BTUUpOwotCi0JCXhtbENvbnZlcnRlckNvbnRhaW5lckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ09OVkVSVEVSX0NPTlRBSU5FUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQ29udmVydGVyQ29udGFpbmVyRUNsYXNzLCBYTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fQ09OVkVSVEVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQ29udmVydGVyQ29udGFpbmVyRUNsYXNzLCBYTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fVFlQRV9DT05WRVJURVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxDb252ZXJ0ZXJDb250YWluZXJFQ2xhc3MsIFhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxDb252ZXJ0ZXJDb250YWluZXJFQ2xhc3MsIFhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19TVFJVQ1RfQ09OVkVSVEVSUyk7Ci0KLQkJeG1sQ29udmVydGlibGVNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDb252ZXJ0aWJsZU1hcHBpbmdFQ2xhc3MsIFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19DT05WRVJUKTsKLQotCQl4bWxDb3B5UG9saWN5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DT1BZX1BPTElDWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ29weVBvbGljeUVDbGFzcywgWE1MX0NPUFlfUE9MSUNZX19DTEFTUyk7Ci0KLQkJeG1sQ3VzdG9taXplckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ1VTVE9NSVpFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ3VzdG9taXplckVDbGFzcywgWE1MX0NVU1RPTUlaRVJfX0NVU1RPTUlaRVJfQ0xBU1NfTkFNRSk7Ci0KLQkJeG1sQ3VzdG9taXplckhvbGRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ1VTVE9NSVpFUl9IT0xERVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEN1c3RvbWl6ZXJIb2xkZXJFQ2xhc3MsIFhNTF9DVVNUT01JWkVSX0hPTERFUl9fQ1VTVE9NSVpFUik7Ci0KLQkJeG1sRWxlbWVudENvbGxlY3Rpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VMRU1FTlRfQ09MTEVDVElPTik7Ci0KLQkJeG1sRW1iZWRkYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU1CRUREQUJMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW1iZWRkYWJsZUVDbGFzcywgWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbWJlZGRhYmxlRUNsYXNzLCBYTUxfRU1CRUREQUJMRV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW1iZWRkYWJsZUVDbGFzcywgWE1MX0VNQkVEREFCTEVfX0NMT05FX0NPUFlfUE9MSUNZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbWJlZGRhYmxlRUNsYXNzLCBYTUxfRU1CRUREQUJMRV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTKTsKLQotCQl4bWxFbWJlZGRlZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU1CRURERUQpOwotCi0JCXhtbEVtYmVkZGVkSWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VNQkVEREVEX0lEKTsKLQotCQl4bWxFbnRpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VOVElUWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19PUFRJTUlTVElDX0xPQ0tJTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fQ09QWV9QT0xJQ1kpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MpOwotCi0JCXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTlRJVFlfTUFQUElOR1MpOwotCi0JCXhtbEZldGNoQXR0cmlidXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9GRVRDSF9BVFRSSUJVVEUpOwotCi0JCXhtbEZldGNoR3JvdXBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0ZFVENIX0dST1VQKTsKLQotCQl4bWxIYXNoUGFydGl0aW9uaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9IQVNIX1BBUlRJVElPTklORyk7Ci0KLQkJeG1sSWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0lEKTsKLQotCQl4bWxJbmRleEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfSU5ERVgpOwotCi0JCXhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZKTsKLQotCQl4bWxKb2luRmV0Y2hFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0pPSU5fRkVUQ0gpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEpvaW5GZXRjaEVDbGFzcywgWE1MX0pPSU5fRkVUQ0hfX0pPSU5fRkVUQ0gpOwotCi0JCXhtbEpvaW5UYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfSk9JTl9UQUJMRSk7Ci0KLQkJeG1sTWFueVRvTWFueUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFOWV9UT19NQU5ZKTsKLQotCQl4bWxNYW55VG9PbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BTllfVE9fT05FKTsKLQotCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PUFRJTUlTVElDX0xPQ0tJTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MsIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09QWV9QT0xJQ1kpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MsIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTE9ORV9DT1BZX1BPTElDWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MpOwotCi0JCXhtbE11bHRpdGVuYW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NVUxUSVRFTkFOVCk7Ci0KLQkJeG1sTXVsdGl0ZW5hbnRIb2xkZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01VTFRJVEVOQU5UX0hPTERFUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTXVsdGl0ZW5hbnRIb2xkZXJFQ2xhc3MsIFhNTF9NVUxUSVRFTkFOVF9IT0xERVJfX01VTFRJVEVOQU5UKTsKLQotCQl4bWxNdXRhYmxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NVVRBQkxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxNdXRhYmxlRUNsYXNzLCBYTUxfTVVUQUJMRV9fTVVUQUJMRSk7Ci0KLQkJeG1sTmFtZWRDb252ZXJ0ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX05BTUVEX0NPTlZFUlRFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTmFtZWRDb252ZXJ0ZXJFQ2xhc3MsIFhNTF9OQU1FRF9DT05WRVJURVJfX05BTUUpOwotCi0JCXhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUlkpOwotCi0JCXhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSWSk7Ci0KLQkJeG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUlkpOwotCi0JCXhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUlkpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlFQ2xhc3MsIFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUFJPQ0VEVVJFX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlFQ2xhc3MsIFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVRVUk5TX1JFU1VMVF9TRVQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlFQ2xhc3MsIFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19ISU5UUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcywgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BBUkFNRVRFUlMpOwotCi0JCXhtbE9iamVjdFR5cGVDb252ZXJ0ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sT2JqZWN0VHlwZUNvbnZlcnRlckVDbGFzcywgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxPYmplY3RUeXBlQ29udmVydGVyRUNsYXNzLCBYTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sT2JqZWN0VHlwZUNvbnZlcnRlckVDbGFzcywgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fQ09OVkVSU0lPTl9WQUxVRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE9iamVjdFR5cGVDb252ZXJ0ZXJFQ2xhc3MsIFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RFRkFVTFRfT0JKRUNUX1ZBTFVFKTsKLQotCQl4bWxPbmVUb01hbnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX09ORV9UT19NQU5ZKTsKLQotCQl4bWxPbmVUb09uZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT05FX1RPX09ORSk7Ci0KLQkJeG1sT3B0aW1pc3RpY0xvY2tpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX09QVElNSVNUSUNfTE9DS0lORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sT3B0aW1pc3RpY0xvY2tpbmdFQ2xhc3MsIFhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE9wdGltaXN0aWNMb2NraW5nRUNsYXNzLCBYTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19DQVNDQURFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxPcHRpbWlzdGljTG9ja2luZ0VDbGFzcywgWE1MX09QVElNSVNUSUNfTE9DS0lOR19fU0VMRUNURURfQ09MVU1OUyk7Ci0KLQkJeG1sT3JkZXJDb2x1bW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX09SREVSX0NPTFVNTik7Ci0KLQkJeG1sUGFydGl0aW9uaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QQVJUSVRJT05JTkcpOwotCi0JCXhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTKTsKLQotCQl4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MpOwotCi0JCXhtbFBpbm5lZFBhcnRpdGlvbmluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUElOTkVEX1BBUlRJVElPTklORyk7Ci0KLQkJeG1sUGxzcWxSZWNvcmRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BMU1FMX1JFQ09SRCk7Ci0KLQkJeG1sUGxzcWxUYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUExTUUxfVEFCTEUpOwotCi0JCXhtbFByaW1hcnlLZXlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BSSU1BUllfS0VZKTsKLQotCQl4bWxQcml2YXRlT3duZWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BSSVZBVEVfT1dORUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFByaXZhdGVPd25lZEVDbGFzcywgWE1MX1BSSVZBVEVfT1dORURfX1BSSVZBVEVfT1dORUQpOwotCi0JCXhtbFByb3BlcnR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QUk9QRVJUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUHJvcGVydHlFQ2xhc3MsIFhNTF9QUk9QRVJUWV9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUHJvcGVydHlFQ2xhc3MsIFhNTF9QUk9QRVJUWV9fVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFByb3BlcnR5RUNsYXNzLCBYTUxfUFJPUEVSVFlfX1ZBTFVFX1RZUEUpOwotCi0JCXhtbFByb3BlcnR5Q29udGFpbmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QUk9QRVJUWV9DT05UQUlORVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbFByb3BlcnR5Q29udGFpbmVyRUNsYXNzLCBYTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTKTsKLQotCQl4bWxRdWVyeUNvbnRhaW5lckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUVVFUllfQ09OVEFJTkVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxRdWVyeUNvbnRhaW5lckVDbGFzcywgWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTKTsKLQotCQl4bWxRdWVyeVJlZGlyZWN0b3JzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9RVUVSWV9SRURJUkVDVE9SUyk7Ci0KLQkJeG1sUmFuZ2VQYXJ0aXRpb25pbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1JBTkdFX1BBUlRJVElPTklORyk7Ci0KLQkJeG1sUmVhZE9ubHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1JFQURfT05MWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUmVhZE9ubHlFQ2xhc3MsIFhNTF9SRUFEX09OTFlfX1JFQURfT05MWSk7Ci0KLQkJeG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORyk7Ci0KLQkJeG1sUmV0dXJuSW5zZXJ0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9SRVRVUk5fSU5TRVJUKTsKLQotCQl4bWxSb3VuZFJvYmluUGFydGl0aW9uaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcpOwotCi0JCXhtbFNlY29uZGFyeVRhYmxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9TRUNPTkRBUllfVEFCTEUpOwotCi0JCXhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlckVDbGFzcywgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19ESVJFQ1RJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlckVDbGFzcywgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJFQ2xhc3MsIFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fUVVFUllfUEFSQU1FVEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJFQ2xhc3MsIFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzLCBYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0pEQkNfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzLCBYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0pEQkNfVFlQRV9OQU1FKTsKLQotCQl4bWxTdHJ1Y3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1NUUlVDVCk7Ci0KLQkJeG1sU3RydWN0Q29udmVydGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxTdHJ1Y3RDb252ZXJ0ZXJFQ2xhc3MsIFhNTF9TVFJVQ1RfQ09OVkVSVEVSX19DT05WRVJURVIpOwotCi0JCXhtbFN0cnVjdHVyZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfU1RSVUNUVVJFKTsKLQotCQl4bWxUYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVEFCTEUpOwotCi0JCXhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9UQUJMRV9HRU5FUkFUT1IpOwotCi0JCXhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0KLQkJeG1sVGltZU9mRGF5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9USU1FX09GX0RBWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sVGltZU9mRGF5RUNsYXNzLCBYTUxfVElNRV9PRl9EQVlfX0hPVVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFRpbWVPZkRheUVDbGFzcywgWE1MX1RJTUVfT0ZfREFZX19NSU5VVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFRpbWVPZkRheUVDbGFzcywgWE1MX1RJTUVfT0ZfREFZX19TRUNPTkQpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFRpbWVPZkRheUVDbGFzcywgWE1MX1RJTUVfT0ZfREFZX19NSUxMSVNFQ09ORCk7Ci0KLQkJeG1sVHJhbnNmb3JtYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1RSQU5TRk9STUFUSU9OKTsKLQotCQl4bWxUcmFuc2llbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1RSQU5TSUVOVCk7Ci0KLQkJeG1sVHlwZUNvbnZlcnRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVFlQRV9DT05WRVJURVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFR5cGVDb252ZXJ0ZXJFQ2xhc3MsIFhNTF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUeXBlQ29udmVydGVyRUNsYXNzLCBYTUxfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFKTsKLQotCQl4bWxUeXBlTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVFlQRV9NQVBQSU5HKTsKLQotCQl4bWxVbmlvblBhcnRpdGlvbmluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVU5JT05fUEFSVElUSU9OSU5HKTsKLQotCQl4bWxWYWx1ZVBhcnRpdGlvbmluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVkFMVUVfUEFSVElUSU9OSU5HKTsKLQotCQl4bWxWYXJpYWJsZU9uZVRvT25lRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxWYXJpYWJsZU9uZVRvT25lRUNsYXNzLCBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fVEFSR0VUX0lOVEVSRkFDRSk7Ci0KLQkJeG1sVmVyc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVkVSU0lPTik7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCWNhY2hlQ29vcmRpbmF0aW9uVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEUpOwotCQljYWNoZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKENBQ0hFX1RZUEUpOwotCQl4bWxDaGFuZ2VUcmFja2luZ1R5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFhNTF9DSEFOR0VfVFJBQ0tJTkdfVFlQRSk7Ci0JCXhtbERpcmVjdGlvbkVFbnVtID0gY3JlYXRlRUVudW0oWE1MX0RJUkVDVElPTik7Ci0JCWV4aXN0ZW5jZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKEVYSVNURU5DRV9UWVBFKTsKLQkJeG1sSm9pbkZldGNoVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oWE1MX0pPSU5fRkVUQ0hfVFlQRSk7Ci0JCXhtbE9wdGltaXN0aWNMb2NraW5nVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oWE1MX09QVElNSVNUSUNfTE9DS0lOR19UWVBFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCXsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVOU19VUkkpOwotCQlFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVOU19VUkkpOwotCQlFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVOU19VUkkpOwotCQlFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVOU19VUkkpOwotCQlFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmVOU19VUkkpOwotCQlFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmVOU19VUkkpOwotCQlYTUxUeXBlUGFja2FnZSB0aGVYTUxUeXBlUGFja2FnZSA9IChYTUxUeXBlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYTUxUeXBlUGFja2FnZS5lTlNfVVJJKTsKLQkJT3JtUGFja2FnZSB0aGVPcm1QYWNrYWdlID0gKE9ybVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VicGFja2FnZXMKLQkJZ2V0RVN1YnBhY2thZ2VzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UpOwotCQlnZXRFU3VicGFja2FnZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSk7Ci0JCWdldEVTdWJwYWNrYWdlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlKTsKLQkJZ2V0RVN1YnBhY2thZ2VzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UpOwotCQlnZXRFU3VicGFja2FnZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSk7Ci0JCWdldEVTdWJwYWNrYWdlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlKTsKLQotCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQl4bWxBZGRpdGlvbmFsQ3JpdGVyaWFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5nZXRYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yKCkpOwotCQl4bWxBcnJheUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sQXJyYXlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxBcnJheUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmdldFhtbEFycmF5XzJfMygpKTsKLQkJeG1sQXJyYXlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKSk7Ci0JCXhtbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcigpKTsKLQkJeG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFByb3BlcnR5Q29udGFpbmVyKCkpOwotCQlhdHRyaWJ1dGVzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0QXR0cmlidXRlcygpKTsKLQkJYXR0cmlidXRlc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmdldFhtbEF0dHJpYnV0ZXNfMl8zKCkpOwotCQl4bWxCYXNpY0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbEJhc2ljKCkpOwotCQl4bWxCYXNpY0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmdldFhtbEJhc2ljXzFfMSgpKTsKLQkJeG1sQmFzaWNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxCYXNpY18yXzEoKSk7Ci0JCXhtbEJhc2ljRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sQmFzaWNfMl8yKCkpOwotCQl4bWxCYXNpY0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmdldFhtbEJhc2ljXzJfNCgpKTsKLQkJeG1sQmFzaWNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxCYXNpY0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE11dGFibGUoKSk7Ci0JCXhtbEJhc2ljRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkpOwotCQl4bWxCYXNpY0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbENvbnZlcnRlckNvbnRhaW5lcigpKTsKLQkJeG1sQmFzaWNDb2xsZWN0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0QWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxCYXNpY0NvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxCYXNpY0NvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5nZXRYbWxCYXNpY0NvbGxlY3Rpb25fMl8yKCkpOwotCQl4bWxCYXNpY01hcEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sQmFzaWNNYXBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxCYXNpY01hcEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmdldFhtbEJhc2ljTWFwXzJfMigpKTsKLQkJeG1sQmF0Y2hGZXRjaEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmdldFhtbEJhdGNoRmV0Y2hfMl8xKCkpOwotCQl4bWxDYWNoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmdldFhtbENhY2hlXzJfMigpKTsKLQkJeG1sQ2FjaGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5nZXRYbWxDYWNoZV8yXzQoKSk7Ci0JCXhtbENhY2hlSW5kZXhFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5nZXRYbWxDYWNoZUluZGV4XzJfNCgpKTsKLQkJeG1sQ29sbGVjdGlvblRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sQ29sbGVjdGlvblRhYmxlKCkpOwotCQl4bWxDb2xsZWN0aW9uVGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5nZXRYbWxDb2xsZWN0aW9uVGFibGVfMl8yKCkpOwotCQl4bWxDb252ZXJ0ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxOYW1lZENvbnZlcnRlcigpKTsKLQkJeG1sQ29udmVydGlibGVNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkpOwotCQl4bWxFbGVtZW50Q29sbGVjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uKCkpOwotCQl4bWxFbGVtZW50Q29sbGVjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpKTsKLQkJeG1sRWxlbWVudENvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEoKSk7Ci0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8yKCkpOwotCQl4bWxFbGVtZW50Q29sbGVjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMygpKTsKLQkJeG1sRWxlbWVudENvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzQoKSk7Ci0JCXhtbEVtYmVkZGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxFbWJlZGRhYmxlKCkpOwotCQl4bWxFbWJlZGRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sVHlwZU1hcHBpbmcoKSk7Ci0JCXhtbEVtYmVkZGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5nZXRYbWxFbWJlZGRhYmxlXzJfMigpKTsKLQkJeG1sRW1iZWRkYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmdldFhtbEVtYmVkZGFibGVfMl8zKCkpOwotCQl4bWxFbWJlZGRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ3VzdG9taXplckhvbGRlcigpKTsKLQkJeG1sRW1iZWRkYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyKCkpOwotCQl4bWxFbWJlZGRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyKCkpOwotCQl4bWxFbWJlZGRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUHJvcGVydHlDb250YWluZXIoKSk7Ci0JCXhtbEVtYmVkZGVkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sRW1iZWRkZWQoKSk7Ci0JCXhtbEVtYmVkZGVkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sRW1iZWRkZWRJZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbEVtYmVkZGVkSWQoKSk7Ci0JCXhtbEVtYmVkZGVkSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxFbnRpdHkoKSk7Ci0JCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFR5cGVNYXBwaW5nKCkpOwotCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5nZXRYbWxFbnRpdHlfMV8xKCkpOwotCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5nZXRYbWxFbnRpdHlfMl8wKCkpOwotCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxFbnRpdHlfMl8xKCkpOwotCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5nZXRYbWxFbnRpdHlfMl8yKCkpOwotCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5nZXRYbWxFbnRpdHlfMl8zKCkpOwotCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5nZXRYbWxFbnRpdHlfMl80KCkpOwotCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxSZWFkT25seSgpKTsKLQkJeG1sRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ3VzdG9taXplckhvbGRlcigpKTsKLQkJeG1sRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKSk7Ci0JCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbENhY2hlSG9sZGVyKCkpOwotCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb252ZXJ0ZXJDb250YWluZXIoKSk7Ci0JCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFF1ZXJ5Q29udGFpbmVyKCkpOwotCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcigpKTsKLQkJeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxFbnRpdHlNYXBwaW5ncygpKTsKLQkJeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxFbnRpdHlNYXBwaW5nc18yXzEoKSk7Ci0JCXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yKCkpOwotCQl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmdldFhtbEVudGl0eU1hcHBpbmdzXzJfMygpKTsKLQkJeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb252ZXJ0ZXJDb250YWluZXIoKSk7Ci0JCXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUXVlcnlDb250YWluZXIoKSk7Ci0JCXhtbEZldGNoQXR0cmlidXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZ2V0WG1sRmV0Y2hBdHRyaWJ1dGVfMl8xKCkpOwotCQl4bWxGZXRjaEdyb3VwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZ2V0WG1sRmV0Y2hHcm91cF8yXzEoKSk7Ci0JCXhtbEhhc2hQYXJ0aXRpb25pbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5nZXRYbWxIYXNoUGFydGl0aW9uaW5nXzJfMigpKTsKLQkJeG1sSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxJZCgpKTsKLQkJeG1sSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5nZXRYbWxJZF8yXzIoKSk7Ci0JCXhtbElkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UuZ2V0WG1sSWRfMl80KCkpOwotCQl4bWxJZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbElkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTXV0YWJsZSgpKTsKLQkJeG1sSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKSk7Ci0JCXhtbElkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyKCkpOwotCQl4bWxJbmRleEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmdldFhtbEluZGV4XzJfMigpKTsKLQkJeG1sSm9pblRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sSm9pblRhYmxlKCkpOwotCQl4bWxKb2luVGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5nZXRYbWxKb2luVGFibGVfMl8yKCkpOwotCQl4bWxNYW55VG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sTWFueVRvTWFueSgpKTsKLQkJeG1sTWFueVRvTWFueUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmdldFhtbE1hbnlUb01hbnlfMl8wKCkpOwotCQl4bWxNYW55VG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZ2V0WG1sTWFueVRvTWFueV8yXzEoKSk7Ci0JCXhtbE1hbnlUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5nZXRYbWxNYW55VG9NYW55XzJfMigpKTsKLQkJeG1sTWFueVRvTWFueUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbE1hbnlUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxKb2luRmV0Y2goKSk7Ci0JCXhtbE1hbnlUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbE1hbnlUb09uZSgpKTsKLQkJeG1sTWFueVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZ2V0WG1sTWFueVRvT25lXzJfMSgpKTsKLQkJeG1sTWFueVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sTWFueVRvT25lXzJfMigpKTsKLQkJeG1sTWFueVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sTWFueVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sSm9pbkZldGNoKCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFR5cGVNYXBwaW5nKCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzEoKSk7Ci0JCXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCgpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xKCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzIoKSk7Ci0JCXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMygpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl80KCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUmVhZE9ubHkoKSk7Ci0JCXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDdXN0b21pemVySG9sZGVyKCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKSk7Ci0JCXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDYWNoZUhvbGRlcigpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbENvbnZlcnRlckNvbnRhaW5lcigpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFByb3BlcnR5Q29udGFpbmVyKCkpOwotCQl4bWxNdWx0aXRlbmFudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmdldFhtbE11bHRpdGVuYW50XzJfMygpKTsKLQkJeG1sTXVsdGl0ZW5hbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5nZXRYbWxNdWx0aXRlbmFudF8yXzQoKSk7Ci0JCXhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZ2V0WG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zKCkpOwotCQl4bWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5nZXRYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zKCkpOwotCQl4bWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5nZXRYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zKCkpOwotCQl4bWxPYmplY3RUeXBlQ29udmVydGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTmFtZWRDb252ZXJ0ZXIoKSk7Ci0JCXhtbE9uZVRvTWFueUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbE9uZVRvTWFueSgpKTsKLQkJeG1sT25lVG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZ2V0WG1sT25lVG9NYW55XzJfMCgpKTsKLQkJeG1sT25lVG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZ2V0WG1sT25lVG9NYW55XzJfMSgpKTsKLQkJeG1sT25lVG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sT25lVG9NYW55XzJfMigpKTsKLQkJeG1sT25lVG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UuZ2V0WG1sT25lVG9NYW55XzJfNCgpKTsKLQkJeG1sT25lVG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sT25lVG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUHJpdmF0ZU93bmVkKCkpOwotCQl4bWxPbmVUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxKb2luRmV0Y2goKSk7Ci0JCXhtbE9uZVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sT25lVG9PbmUoKSk7Ci0JCXhtbE9uZVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZ2V0WG1sT25lVG9PbmVfMl8xKCkpOwotCQl4bWxPbmVUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmdldFhtbE9uZVRvT25lXzJfMigpKTsKLQkJeG1sT25lVG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxPbmVUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFByaXZhdGVPd25lZCgpKTsKLQkJeG1sT25lVG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxKb2luRmV0Y2goKSk7Ci0JCXhtbE9yZGVyQ29sdW1uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sT3JkZXJDb2x1bW4oKSk7Ci0JCXhtbE9yZGVyQ29sdW1uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZ2V0WG1sT3JkZXJDb2x1bW5fMl8wKCkpOwotCQl4bWxQYXJ0aXRpb25pbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5nZXRYbWxQYXJ0aXRpb25pbmdfMl8yKCkpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMSgpKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzMoKSk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCXhtbFBpbm5lZFBhcnRpdGlvbmluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmdldFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIoKSk7Ci0JCXhtbFBsc3FsUmVjb3JkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZ2V0WG1sUGxzcWxSZWNvcmRfMl8zKCkpOwotCQl4bWxQbHNxbFRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZ2V0WG1sUGxzcWxUYWJsZV8yXzMoKSk7Ci0JCXhtbFByaW1hcnlLZXlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5nZXRYbWxQcmltYXJ5S2V5XzFfMSgpKTsKLQkJeG1sUHJpbWFyeUtleUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmdldFhtbFByaW1hcnlLZXlfMl8xKCkpOwotCQl4bWxRdWVyeVJlZGlyZWN0b3JzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzAoKSk7Ci0JCXhtbFJhbmdlUGFydGl0aW9uaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yKCkpOwotCQl4bWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmdldFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMigpKTsKLQkJeG1sUmV0dXJuSW5zZXJ0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZ2V0WG1sUmV0dXJuSW5zZXJ0XzJfMSgpKTsKLQkJeG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmdldFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKCkpOwotCQl4bWxTZWNvbmRhcnlUYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbFNlY29uZGFyeVRhYmxlKCkpOwotCQl4bWxTZWNvbmRhcnlUYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmdldFhtbFNlY29uZGFyeVRhYmxlXzJfMigpKTsKLQkJeG1sU3RydWN0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZ2V0WG1sU3RydWN0XzJfMygpKTsKLQkJeG1sU3RydWN0Q29udmVydGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTmFtZWRDb252ZXJ0ZXIoKSk7Ci0JCXhtbFN0cnVjdHVyZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sU3RydWN0dXJlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sU3RydWN0dXJlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZ2V0WG1sU3RydWN0dXJlXzJfMygpKTsKLQkJeG1sVGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxUYWJsZSgpKTsKLQkJeG1sVGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5nZXRYbWxUYWJsZV8yXzIoKSk7Ci0JCXhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sVGFibGVHZW5lcmF0b3IoKSk7Ci0JCXhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sVGFibGVHZW5lcmF0b3JfMl8yKCkpOwotCQl4bWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0QWJzdHJhY3RYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQkJeG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmdldFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zKCkpOwotCQl4bWxUcmFuc2Zvcm1hdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sVHJhbnNmb3JtYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxUcmFuc2llbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxUcmFuc2llbnQoKSk7Ci0JCXhtbFRyYW5zaWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbFR5cGVDb252ZXJ0ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxOYW1lZENvbnZlcnRlcigpKTsKLQkJeG1sVHlwZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxUeXBlTWFwcGluZygpKTsKLQkJeG1sVHlwZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxUeXBlTWFwcGluZ18yXzEoKSk7Ci0JCXhtbFVuaW9uUGFydGl0aW9uaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKCkpOwotCQl4bWxWYWx1ZVBhcnRpdGlvbmluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmdldFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMigpKTsKLQkJeG1sVmFyaWFibGVPbmVUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sVmFyaWFibGVPbmVUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbFZhcmlhYmxlT25lVG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5nZXRYbWxWYXJpYWJsZU9uZVRvT25lXzJfMigpKTsKLQkJeG1sVmVyc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbFZlcnNpb24oKSk7Ci0JCXhtbFZlcnNpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5nZXRYbWxWZXJzaW9uXzJfMigpKTsKLQkJeG1sVmVyc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbFZlcnNpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxNdXRhYmxlKCkpOwotCQl4bWxWZXJzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkpOwotCQl4bWxWZXJzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoeG1sQWNjZXNzTWV0aG9kc0VDbGFzcywgWG1sQWNjZXNzTWV0aG9kcy5jbGFzcywgIlhtbEFjY2Vzc01ldGhvZHMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEFjY2Vzc01ldGhvZHNfR2V0TWV0aG9kKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZ2V0TWV0aG9kIiwgbnVsbCwgMCwgMSwgWG1sQWNjZXNzTWV0aG9kcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQWNjZXNzTWV0aG9kc19TZXRNZXRob2QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzZXRNZXRob2QiLCBudWxsLCAwLCAxLCBYbWxBY2Nlc3NNZXRob2RzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQWNjZXNzTWV0aG9kc0hvbGRlckVDbGFzcywgWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcywgIlhtbEFjY2Vzc01ldGhvZHNIb2xkZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSwgdGhpcy5nZXRYbWxBY2Nlc3NNZXRob2RzKCksIG51bGwsICJhY2Nlc3NNZXRob2RzIiwgbnVsbCwgMCwgMSwgWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEFkZGl0aW9uYWxDcml0ZXJpYUVDbGFzcywgWG1sQWRkaXRpb25hbENyaXRlcmlhLmNsYXNzLCAiWG1sQWRkaXRpb25hbENyaXRlcmlhIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sQXJyYXlFQ2xhc3MsIFhtbEFycmF5LmNsYXNzLCAiWG1sQXJyYXkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLCBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzLCAiWG1sQXR0cmlidXRlTWFwcGluZyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEF0dHJpYnV0ZU1hcHBpbmdfQXR0cmlidXRlVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImF0dHJpYnV0ZVR5cGUiLCBudWxsLCAwLCAxLCBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYXR0cmlidXRlc0VDbGFzcywgQXR0cmlidXRlcy5jbGFzcywgIkF0dHJpYnV0ZXMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEF0dHJpYnV0ZXNfQmFzaWNDb2xsZWN0aW9ucygpLCB0aGlzLmdldFhtbEJhc2ljQ29sbGVjdGlvbigpLCBudWxsLCAiYmFzaWNDb2xsZWN0aW9ucyIsIG51bGwsIDAsIC0xLCBBdHRyaWJ1dGVzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBdHRyaWJ1dGVzX0Jhc2ljTWFwcygpLCB0aGlzLmdldFhtbEJhc2ljTWFwKCksIG51bGwsICJiYXNpY01hcHMiLCBudWxsLCAwLCAtMSwgQXR0cmlidXRlcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXR0cmlidXRlc19UcmFuc2Zvcm1hdGlvbnMoKSwgdGhpcy5nZXRYbWxUcmFuc2Zvcm1hdGlvbigpLCBudWxsLCAidHJhbnNmb3JtYXRpb25zIiwgbnVsbCwgMCwgLTEsIEF0dHJpYnV0ZXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEF0dHJpYnV0ZXNfVmFyaWFibGVPbmVUb09uZXMoKSwgdGhpcy5nZXRYbWxWYXJpYWJsZU9uZVRvT25lKCksIG51bGwsICJ2YXJpYWJsZU9uZVRvT25lcyIsIG51bGwsIDAsIC0xLCBBdHRyaWJ1dGVzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQmFzaWNFQ2xhc3MsIFhtbEJhc2ljLmNsYXNzLCAiWG1sQmFzaWMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxCYXNpY0NvbGxlY3Rpb25FQ2xhc3MsIFhtbEJhc2ljQ29sbGVjdGlvbi5jbGFzcywgIlhtbEJhc2ljQ29sbGVjdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEJhc2ljTWFwRUNsYXNzLCBYbWxCYXNpY01hcC5jbGFzcywgIlhtbEJhc2ljTWFwIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sQmF0Y2hGZXRjaEVDbGFzcywgWG1sQmF0Y2hGZXRjaC5jbGFzcywgIlhtbEJhdGNoRmV0Y2giLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxCYXRjaEZldGNoSG9sZGVyRUNsYXNzLCBYbWxCYXRjaEZldGNoSG9sZGVyLmNsYXNzLCAiWG1sQmF0Y2hGZXRjaEhvbGRlciIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEJhdGNoRmV0Y2hIb2xkZXJfQmF0Y2hGZXRjaCgpLCB0aGlzLmdldFhtbEJhdGNoRmV0Y2goKSwgbnVsbCwgImJhdGNoRmV0Y2giLCBudWxsLCAwLCAxLCBYbWxCYXRjaEZldGNoSG9sZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ2FjaGVFQ2xhc3MsIFhtbENhY2hlLmNsYXNzLCAiWG1sQ2FjaGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENhY2hlX0V4cGlyeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJbnRPYmplY3QoKSwgImV4cGlyeSIsIG51bGwsIDAsIDEsIFhtbENhY2hlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDYWNoZV9TaXplKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAic2l6ZSIsIG51bGwsIDAsIDEsIFhtbENhY2hlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDYWNoZV9TaGFyZWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAic2hhcmVkIiwgbnVsbCwgMCwgMSwgWG1sQ2FjaGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENhY2hlX1R5cGUoKSwgdGhpcy5nZXRDYWNoZVR5cGUoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBYbWxDYWNoZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2FjaGVfQWx3YXlzUmVmcmVzaCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJhbHdheXNSZWZyZXNoIiwgbnVsbCwgMCwgMSwgWG1sQ2FjaGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENhY2hlX1JlZnJlc2hPbmx5SWZOZXdlcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJyZWZyZXNoT25seUlmTmV3ZXIiLCBudWxsLCAwLCAxLCBYbWxDYWNoZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2FjaGVfRGlzYWJsZUhpdHMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAiZGlzYWJsZUhpdHMiLCBudWxsLCAwLCAxLCBYbWxDYWNoZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2FjaGVfQ29vcmRpbmF0aW9uVHlwZSgpLCB0aGlzLmdldENhY2hlQ29vcmRpbmF0aW9uVHlwZSgpLCAiY29vcmRpbmF0aW9uVHlwZSIsICIiLCAwLCAxLCBYbWxDYWNoZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQ2FjaGVfRXhwaXJ5VGltZU9mRGF5KCksIHRoaXMuZ2V0WG1sVGltZU9mRGF5KCksIG51bGwsICJleHBpcnlUaW1lT2ZEYXkiLCBudWxsLCAwLCAxLCBYbWxDYWNoZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbENhY2hlSG9sZGVyRUNsYXNzLCBYbWxDYWNoZUhvbGRlci5jbGFzcywgIlhtbENhY2hlSG9sZGVyIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQ2FjaGVIb2xkZXJfQ2FjaGUoKSwgdGhpcy5nZXRYbWxDYWNoZSgpLCBudWxsLCAiY2FjaGUiLCBudWxsLCAwLCAxLCBYbWxDYWNoZUhvbGRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2FjaGVIb2xkZXJfRXhpc3RlbmNlQ2hlY2tpbmcoKSwgdGhpcy5nZXRFeGlzdGVuY2VUeXBlKCksICJleGlzdGVuY2VDaGVja2luZyIsICIiLCAwLCAxLCBYbWxDYWNoZUhvbGRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbENhY2hlSW5kZXhFQ2xhc3MsIFhtbENhY2hlSW5kZXguY2xhc3MsICJYbWxDYWNoZUluZGV4IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ2hhbmdlVHJhY2tpbmdFQ2xhc3MsIFhtbENoYW5nZVRyYWNraW5nLmNsYXNzLCAiWG1sQ2hhbmdlVHJhY2tpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENoYW5nZVRyYWNraW5nX1R5cGUoKSwgdGhpcy5nZXRYbWxDaGFuZ2VUcmFja2luZ1R5cGUoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBYbWxDaGFuZ2VUcmFja2luZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbENoYW5nZVRyYWNraW5nSG9sZGVyRUNsYXNzLCBYbWxDaGFuZ2VUcmFja2luZ0hvbGRlci5jbGFzcywgIlhtbENoYW5nZVRyYWNraW5nSG9sZGVyIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXJfQ2hhbmdlVHJhY2tpbmcoKSwgdGhpcy5nZXRYbWxDaGFuZ2VUcmFja2luZygpLCBudWxsLCAiY2hhbmdlVHJhY2tpbmciLCBudWxsLCAwLCAxLCBYbWxDaGFuZ2VUcmFja2luZ0hvbGRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbENsb25lQ29weVBvbGljeUVDbGFzcywgWG1sQ2xvbmVDb3B5UG9saWN5LmNsYXNzLCAiWG1sQ2xvbmVDb3B5UG9saWN5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDbG9uZUNvcHlQb2xpY3lfTWV0aG9kKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWV0aG9kIiwgbnVsbCwgMCwgMSwgWG1sQ2xvbmVDb3B5UG9saWN5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDbG9uZUNvcHlQb2xpY3lfV29ya2luZ0NvcHlNZXRob2QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ3b3JraW5nQ29weU1ldGhvZCIsIG51bGwsIDAsIDEsIFhtbENsb25lQ29weVBvbGljeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbENvbGxlY3Rpb25UYWJsZUVDbGFzcywgWG1sQ29sbGVjdGlvblRhYmxlLmNsYXNzLCAiWG1sQ29sbGVjdGlvblRhYmxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ29udmVyc2lvblZhbHVlRUNsYXNzLCBYbWxDb252ZXJzaW9uVmFsdWUuY2xhc3MsICJYbWxDb252ZXJzaW9uVmFsdWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENvbnZlcnNpb25WYWx1ZV9EYXRhVmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkYXRhVmFsdWUiLCBudWxsLCAwLCAxLCBYbWxDb252ZXJzaW9uVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENvbnZlcnNpb25WYWx1ZV9PYmplY3RWYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm9iamVjdFZhbHVlIiwgbnVsbCwgMCwgMSwgWG1sQ29udmVyc2lvblZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ29udmVydGVyRUNsYXNzLCBYbWxDb252ZXJ0ZXIuY2xhc3MsICJYbWxDb252ZXJ0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENvbnZlcnRlcl9DbGFzc05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjbGFzc05hbWUiLCBudWxsLCAwLCAxLCBYbWxDb252ZXJ0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxDb252ZXJ0ZXJDb250YWluZXJFQ2xhc3MsIFhtbENvbnZlcnRlckNvbnRhaW5lci5jbGFzcywgIlhtbENvbnZlcnRlckNvbnRhaW5lciIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9Db252ZXJ0ZXJzKCksIHRoaXMuZ2V0WG1sQ29udmVydGVyKCksIG51bGwsICJjb252ZXJ0ZXJzIiwgbnVsbCwgMCwgLTEsIFhtbENvbnZlcnRlckNvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1R5cGVDb252ZXJ0ZXJzKCksIHRoaXMuZ2V0WG1sVHlwZUNvbnZlcnRlcigpLCBudWxsLCAidHlwZUNvbnZlcnRlcnMiLCBudWxsLCAwLCAtMSwgWG1sQ29udmVydGVyQ29udGFpbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSwgdGhpcy5nZXRYbWxPYmplY3RUeXBlQ29udmVydGVyKCksIG51bGwsICJvYmplY3RUeXBlQ29udmVydGVycyIsIG51bGwsIDAsIC0xLCBYbWxDb252ZXJ0ZXJDb250YWluZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9TdHJ1Y3RDb252ZXJ0ZXJzKCksIHRoaXMuZ2V0WG1sU3RydWN0Q29udmVydGVyKCksIG51bGwsICJzdHJ1Y3RDb252ZXJ0ZXJzIiwgbnVsbCwgMCwgLTEsIFhtbENvbnZlcnRlckNvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbENvbnZlcnRpYmxlTWFwcGluZ0VDbGFzcywgWG1sQ29udmVydGlibGVNYXBwaW5nLmNsYXNzLCAiWG1sQ29udmVydGlibGVNYXBwaW5nIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0NvbnZlcnQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb252ZXJ0IiwgbnVsbCwgMCwgMSwgWG1sQ29udmVydGlibGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ29weVBvbGljeUVDbGFzcywgWG1sQ29weVBvbGljeS5jbGFzcywgIlhtbENvcHlQb2xpY3kiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENvcHlQb2xpY3lfQ2xhc3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjbGFzcyIsIG51bGwsIDAsIDEsIFhtbENvcHlQb2xpY3kuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxDdXN0b21pemVyRUNsYXNzLCBYbWxDdXN0b21pemVyLmNsYXNzLCAiWG1sQ3VzdG9taXplciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ3VzdG9taXplcl9DdXN0b21pemVyQ2xhc3NOYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY3VzdG9taXplckNsYXNzTmFtZSIsIG51bGwsIDAsIDEsIFhtbEN1c3RvbWl6ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxDdXN0b21pemVySG9sZGVyRUNsYXNzLCBYbWxDdXN0b21pemVySG9sZGVyLmNsYXNzLCAiWG1sQ3VzdG9taXplckhvbGRlciIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEN1c3RvbWl6ZXJIb2xkZXJfQ3VzdG9taXplcigpLCB0aGVPcm1QYWNrYWdlLmdldFhtbENsYXNzUmVmZXJlbmNlKCksIG51bGwsICJjdXN0b21pemVyIiwgbnVsbCwgMCwgMSwgWG1sQ3VzdG9taXplckhvbGRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEVsZW1lbnRDb2xsZWN0aW9uRUNsYXNzLCBYbWxFbGVtZW50Q29sbGVjdGlvbi5jbGFzcywgIlhtbEVsZW1lbnRDb2xsZWN0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sRW1iZWRkYWJsZUVDbGFzcywgWG1sRW1iZWRkYWJsZS5jbGFzcywgIlhtbEVtYmVkZGFibGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVtYmVkZGFibGVfQ29weVBvbGljeSgpLCB0aGlzLmdldFhtbENvcHlQb2xpY3koKSwgbnVsbCwgImNvcHlQb2xpY3kiLCBudWxsLCAwLCAxLCBYbWxFbWJlZGRhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbWJlZGRhYmxlX0luc3RhbnRpYXRpb25Db3B5UG9saWN5KCksIHRoaXMuZ2V0WG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKSwgbnVsbCwgImluc3RhbnRpYXRpb25Db3B5UG9saWN5IiwgbnVsbCwgMCwgMSwgWG1sRW1iZWRkYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW1iZWRkYWJsZV9DbG9uZUNvcHlQb2xpY3koKSwgdGhpcy5nZXRYbWxDbG9uZUNvcHlQb2xpY3koKSwgbnVsbCwgImNsb25lQ29weVBvbGljeSIsIG51bGwsIDAsIDEsIFhtbEVtYmVkZGFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEVtYmVkZGFibGVfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJleGNsdWRlRGVmYXVsdE1hcHBpbmdzIiwgbnVsbCwgMCwgMSwgWG1sRW1iZWRkYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEVtYmVkZGVkRUNsYXNzLCBYbWxFbWJlZGRlZC5jbGFzcywgIlhtbEVtYmVkZGVkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sRW1iZWRkZWRJZEVDbGFzcywgWG1sRW1iZWRkZWRJZC5jbGFzcywgIlhtbEVtYmVkZGVkSWQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbnRpdHlFQ2xhc3MsIFhtbEVudGl0eS5jbGFzcywgIlhtbEVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X09wdGltaXN0aWNMb2NraW5nKCksIHRoaXMuZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmcoKSwgbnVsbCwgIm9wdGltaXN0aWNMb2NraW5nIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfQ29weVBvbGljeSgpLCB0aGlzLmdldFhtbENvcHlQb2xpY3koKSwgbnVsbCwgImNvcHlQb2xpY3kiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpLCB0aGlzLmdldFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCksIG51bGwsICJpbnN0YW50aWF0aW9uQ29weVBvbGljeSIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X0Nsb25lQ29weVBvbGljeSgpLCB0aGlzLmdldFhtbENsb25lQ29weVBvbGljeSgpLCBudWxsLCAiY2xvbmVDb3B5UG9saWN5IiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbnRpdHlfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJleGNsdWRlRGVmYXVsdE1hcHBpbmdzIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MsIFhtbEVudGl0eU1hcHBpbmdzLmNsYXNzLCAiWG1sRW50aXR5TWFwcGluZ3MiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxGZXRjaEF0dHJpYnV0ZUVDbGFzcywgWG1sRmV0Y2hBdHRyaWJ1dGUuY2xhc3MsICJYbWxGZXRjaEF0dHJpYnV0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEZldGNoR3JvdXBFQ2xhc3MsIFhtbEZldGNoR3JvdXAuY2xhc3MsICJYbWxGZXRjaEdyb3VwIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sSGFzaFBhcnRpdGlvbmluZ0VDbGFzcywgWG1sSGFzaFBhcnRpdGlvbmluZy5jbGFzcywgIlhtbEhhc2hQYXJ0aXRpb25pbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxJZEVDbGFzcywgWG1sSWQuY2xhc3MsICJYbWxJZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEluZGV4RUNsYXNzLCBYbWxJbmRleC5jbGFzcywgIlhtbEluZGV4IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3lFQ2xhc3MsIFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5LmNsYXNzLCAiWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxKb2luRmV0Y2hFQ2xhc3MsIFhtbEpvaW5GZXRjaC5jbGFzcywgIlhtbEpvaW5GZXRjaCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEpvaW5GZXRjaF9Kb2luRmV0Y2goKSwgdGhpcy5nZXRYbWxKb2luRmV0Y2hUeXBlKCksICJqb2luRmV0Y2giLCBudWxsLCAwLCAxLCBYbWxKb2luRmV0Y2guY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxKb2luVGFibGVFQ2xhc3MsIFhtbEpvaW5UYWJsZS5jbGFzcywgIlhtbEpvaW5UYWJsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hbnlUb01hbnlFQ2xhc3MsIFhtbE1hbnlUb01hbnkuY2xhc3MsICJYbWxNYW55VG9NYW55IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sTWFueVRvT25lRUNsYXNzLCBYbWxNYW55VG9PbmUuY2xhc3MsICJYbWxNYW55VG9PbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLCBYbWxNYXBwZWRTdXBlcmNsYXNzLmNsYXNzLCAiWG1sTWFwcGVkU3VwZXJjbGFzcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19PcHRpbWlzdGljTG9ja2luZygpLCB0aGlzLmdldFhtbE9wdGltaXN0aWNMb2NraW5nKCksIG51bGwsICJvcHRpbWlzdGljTG9ja2luZyIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfQ29weVBvbGljeSgpLCB0aGlzLmdldFhtbENvcHlQb2xpY3koKSwgbnVsbCwgImNvcHlQb2xpY3kiLCBudWxsLCAwLCAxLCBYbWxNYXBwZWRTdXBlcmNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0luc3RhbnRpYXRpb25Db3B5UG9saWN5KCksIHRoaXMuZ2V0WG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKSwgbnVsbCwgImluc3RhbnRpYXRpb25Db3B5UG9saWN5IiwgbnVsbCwgMCwgMSwgWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19DbG9uZUNvcHlQb2xpY3koKSwgdGhpcy5nZXRYbWxDbG9uZUNvcHlQb2xpY3koKSwgbnVsbCwgImNsb25lQ29weVBvbGljeSIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJleGNsdWRlRGVmYXVsdE1hcHBpbmdzIiwgbnVsbCwgMCwgMSwgWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE11bHRpdGVuYW50RUNsYXNzLCBYbWxNdWx0aXRlbmFudC5jbGFzcywgIlhtbE11bHRpdGVuYW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sTXVsdGl0ZW5hbnRIb2xkZXJFQ2xhc3MsIFhtbE11bHRpdGVuYW50SG9sZGVyLmNsYXNzLCAiWG1sTXVsdGl0ZW5hbnRIb2xkZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxNdWx0aXRlbmFudEhvbGRlcl9NdWx0aXRlbmFudCgpLCB0aGlzLmdldFhtbE11bHRpdGVuYW50KCksIG51bGwsICJtdWx0aXRlbmFudCIsIG51bGwsIDAsIDEsIFhtbE11bHRpdGVuYW50SG9sZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sTXV0YWJsZUVDbGFzcywgWG1sTXV0YWJsZS5jbGFzcywgIlhtbE11dGFibGUiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxNdXRhYmxlX011dGFibGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAibXV0YWJsZSIsIG51bGwsIDAsIDEsIFhtbE11dGFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxOYW1lZENvbnZlcnRlckVDbGFzcywgWG1sTmFtZWRDb252ZXJ0ZXIuY2xhc3MsICJYbWxOYW1lZENvbnZlcnRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTmFtZWRDb252ZXJ0ZXJfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxOYW1lZENvbnZlcnRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5RUNsYXNzLCBYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeS5jbGFzcywgIlhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLCBYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnkuY2xhc3MsICJYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlFQ2xhc3MsIFhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeS5jbGFzcywgIlhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlFQ2xhc3MsIFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkuY2xhc3MsICJYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9SZXN1bHRDbGFzcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlc3VsdENsYXNzIiwgbnVsbCwgMCwgMSwgWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9SZXN1bHRTZXRNYXBwaW5nKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVzdWx0U2V0TWFwcGluZyIsIG51bGwsIDAsIDEsIFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUHJvY2VkdXJlTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByb2NlZHVyZU5hbWUiLCBudWxsLCAwLCAxLCBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1JldHVybnNSZXN1bHRTZXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAicmV0dXJuc1Jlc3VsdFNldCIsIG51bGwsIDAsIDEsIFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfSGludHMoKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxRdWVyeUhpbnQoKSwgbnVsbCwgImhpbnRzIiwgbnVsbCwgMCwgLTEsIFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUGFyYW1ldGVycygpLCB0aGlzLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpLCBudWxsLCAicGFyYW1ldGVycyIsIG51bGwsIDAsIC0xLCBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sT2JqZWN0VHlwZUNvbnZlcnRlckVDbGFzcywgWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzcywgIlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfRGF0YVR5cGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkYXRhVHlwZSIsIG51bGwsIDAsIDEsIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfT2JqZWN0VHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm9iamVjdFR5cGUiLCBudWxsLCAwLCAxLCBYbWxPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX0NvbnZlcnNpb25WYWx1ZXMoKSwgdGhpcy5nZXRYbWxDb252ZXJzaW9uVmFsdWUoKSwgbnVsbCwgImNvbnZlcnNpb25WYWx1ZXMiLCBudWxsLCAwLCAtMSwgWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9EZWZhdWx0T2JqZWN0VmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZWZhdWx0T2JqZWN0VmFsdWUiLCBudWxsLCAwLCAxLCBYbWxPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sT25lVG9NYW55RUNsYXNzLCBYbWxPbmVUb01hbnkuY2xhc3MsICJYbWxPbmVUb01hbnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxPbmVUb09uZUVDbGFzcywgWG1sT25lVG9PbmUuY2xhc3MsICJYbWxPbmVUb09uZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE9wdGltaXN0aWNMb2NraW5nRUNsYXNzLCBYbWxPcHRpbWlzdGljTG9ja2luZy5jbGFzcywgIlhtbE9wdGltaXN0aWNMb2NraW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxPcHRpbWlzdGljTG9ja2luZ19UeXBlKCksIHRoaXMuZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgWG1sT3B0aW1pc3RpY0xvY2tpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE9wdGltaXN0aWNMb2NraW5nX0Nhc2NhZGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAiY2FzY2FkZSIsIG51bGwsIDAsIDEsIFhtbE9wdGltaXN0aWNMb2NraW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxPcHRpbWlzdGljTG9ja2luZ19TZWxlY3RlZENvbHVtbnMoKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxDb2x1bW4oKSwgbnVsbCwgInNlbGVjdGVkQ29sdW1ucyIsIG51bGwsIDAsIC0xLCBYbWxPcHRpbWlzdGljTG9ja2luZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE9yZGVyQ29sdW1uRUNsYXNzLCBYbWxPcmRlckNvbHVtbi5jbGFzcywgIlhtbE9yZGVyQ29sdW1uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sUGFydGl0aW9uaW5nRUNsYXNzLCBYbWxQYXJ0aXRpb25pbmcuY2xhc3MsICJYbWxQYXJ0aXRpb25pbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcywgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuY2xhc3MsICJYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRUNsYXNzLCBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5jbGFzcywgIlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV9FeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MiLCBudWxsLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFBpbm5lZFBhcnRpdGlvbmluZ0VDbGFzcywgWG1sUGlubmVkUGFydGl0aW9uaW5nLmNsYXNzLCAiWG1sUGlubmVkUGFydGl0aW9uaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sUGxzcWxSZWNvcmRFQ2xhc3MsIFhtbFBsc3FsUmVjb3JkLmNsYXNzLCAiWG1sUGxzcWxSZWNvcmQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxQbHNxbFRhYmxlRUNsYXNzLCBYbWxQbHNxbFRhYmxlLmNsYXNzLCAiWG1sUGxzcWxUYWJsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFByaW1hcnlLZXlFQ2xhc3MsIFhtbFByaW1hcnlLZXkuY2xhc3MsICJYbWxQcmltYXJ5S2V5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sUHJpdmF0ZU93bmVkRUNsYXNzLCBYbWxQcml2YXRlT3duZWQuY2xhc3MsICJYbWxQcml2YXRlT3duZWQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQcml2YXRlT3duZWRfUHJpdmF0ZU93bmVkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgInByaXZhdGVPd25lZCIsIG51bGwsIDAsIDEsIFhtbFByaXZhdGVPd25lZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFByb3BlcnR5RUNsYXNzLCBYbWxQcm9wZXJ0eS5jbGFzcywgIlhtbFByb3BlcnR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQcm9wZXJ0eV9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFhtbFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQcm9wZXJ0eV9WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgWG1sUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFByb3BlcnR5X1ZhbHVlVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhbHVlVHlwZSIsIG51bGwsIDAsIDEsIFhtbFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUHJvcGVydHlDb250YWluZXJFQ2xhc3MsIFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzLCAiWG1sUHJvcGVydHlDb250YWluZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCksIHRoaXMuZ2V0WG1sUHJvcGVydHkoKSwgbnVsbCwgInByb3BlcnRpZXMiLCBudWxsLCAwLCAtMSwgWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxRdWVyeUNvbnRhaW5lckVDbGFzcywgWG1sUXVlcnlDb250YWluZXIuY2xhc3MsICJYbWxRdWVyeUNvbnRhaW5lciIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpLCB0aGlzLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKSwgbnVsbCwgIm5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcyIsIG51bGwsIDAsIC0xLCBYbWxRdWVyeUNvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFF1ZXJ5UmVkaXJlY3RvcnNFQ2xhc3MsIFhtbFF1ZXJ5UmVkaXJlY3RvcnMuY2xhc3MsICJYbWxRdWVyeVJlZGlyZWN0b3JzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sUmFuZ2VQYXJ0aXRpb25pbmdFQ2xhc3MsIFhtbFJhbmdlUGFydGl0aW9uaW5nLmNsYXNzLCAiWG1sUmFuZ2VQYXJ0aXRpb25pbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxSZWFkT25seUVDbGFzcywgWG1sUmVhZE9ubHkuY2xhc3MsICJYbWxSZWFkT25seSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFJlYWRPbmx5X1JlYWRPbmx5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgInJlYWRPbmx5IiwgbnVsbCwgMCwgMSwgWG1sUmVhZE9ubHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ0VDbGFzcywgWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmcuY2xhc3MsICJYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFJldHVybkluc2VydEVDbGFzcywgWG1sUmV0dXJuSW5zZXJ0LmNsYXNzLCAiWG1sUmV0dXJuSW5zZXJ0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ0VDbGFzcywgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZy5jbGFzcywgIlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxTZWNvbmRhcnlUYWJsZUVDbGFzcywgWG1sU2Vjb25kYXJ5VGFibGUuY2xhc3MsICJYbWxTZWNvbmRhcnlUYWJsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlckVDbGFzcywgWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyLmNsYXNzLCAiWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfRGlyZWN0aW9uKCksIHRoaXMuZ2V0WG1sRGlyZWN0aW9uKCksICJkaXJlY3Rpb24iLCBudWxsLCAwLCAxLCBYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX1F1ZXJ5UGFyYW1ldGVyKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicXVlcnlQYXJhbWV0ZXIiLCBudWxsLCAwLCAxLCBYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9UeXBlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidHlwZSIsIG51bGwsIDAsIDEsIFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX0pkYmNUeXBlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAiamRiY1R5cGUiLCBudWxsLCAwLCAxLCBYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9KZGJjVHlwZU5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJqZGJjVHlwZU5hbWUiLCBudWxsLCAwLCAxLCBYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxTdHJ1Y3RFQ2xhc3MsIFhtbFN0cnVjdC5jbGFzcywgIlhtbFN0cnVjdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFN0cnVjdENvbnZlcnRlckVDbGFzcywgWG1sU3RydWN0Q29udmVydGVyLmNsYXNzLCAiWG1sU3RydWN0Q29udmVydGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxTdHJ1Y3RDb252ZXJ0ZXJfQ29udmVydGVyKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29udmVydGVyIiwgbnVsbCwgMCwgMSwgWG1sU3RydWN0Q29udmVydGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sU3RydWN0dXJlRUNsYXNzLCBYbWxTdHJ1Y3R1cmUuY2xhc3MsICJYbWxTdHJ1Y3R1cmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxUYWJsZUVDbGFzcywgWG1sVGFibGUuY2xhc3MsICJYbWxUYWJsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzLCBYbWxUYWJsZUdlbmVyYXRvci5jbGFzcywgIlhtbFRhYmxlR2VuZXJhdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkVDbGFzcywgWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbi5jbGFzcywgIlhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxUaW1lT2ZEYXlFQ2xhc3MsIFhtbFRpbWVPZkRheS5jbGFzcywgIlhtbFRpbWVPZkRheSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVGltZU9mRGF5X0hvdXIoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SW50T2JqZWN0KCksICJob3VyIiwgbnVsbCwgMCwgMSwgWG1sVGltZU9mRGF5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxUaW1lT2ZEYXlfTWludXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAibWludXRlIiwgbnVsbCwgMCwgMSwgWG1sVGltZU9mRGF5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxUaW1lT2ZEYXlfU2Vjb25kKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAic2Vjb25kIiwgbnVsbCwgMCwgMSwgWG1sVGltZU9mRGF5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxUaW1lT2ZEYXlfTWlsbGlzZWNvbmQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SW50T2JqZWN0KCksICJtaWxsaXNlY29uZCIsIG51bGwsIDAsIDEsIFhtbFRpbWVPZkRheS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFRyYW5zZm9ybWF0aW9uRUNsYXNzLCBYbWxUcmFuc2Zvcm1hdGlvbi5jbGFzcywgIlhtbFRyYW5zZm9ybWF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sVHJhbnNpZW50RUNsYXNzLCBYbWxUcmFuc2llbnQuY2xhc3MsICJYbWxUcmFuc2llbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxUeXBlQ29udmVydGVyRUNsYXNzLCBYbWxUeXBlQ29udmVydGVyLmNsYXNzLCAiWG1sVHlwZUNvbnZlcnRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVHlwZUNvbnZlcnRlcl9EYXRhVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRhdGFUeXBlIiwgbnVsbCwgMCwgMSwgWG1sVHlwZUNvbnZlcnRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVHlwZUNvbnZlcnRlcl9PYmplY3RUeXBlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAib2JqZWN0VHlwZSIsIG51bGwsIDAsIDEsIFhtbFR5cGVDb252ZXJ0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxUeXBlTWFwcGluZ0VDbGFzcywgWG1sVHlwZU1hcHBpbmcuY2xhc3MsICJYbWxUeXBlTWFwcGluZyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxVbmlvblBhcnRpdGlvbmluZ0VDbGFzcywgWG1sVW5pb25QYXJ0aXRpb25pbmcuY2xhc3MsICJYbWxVbmlvblBhcnRpdGlvbmluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFZhbHVlUGFydGl0aW9uaW5nRUNsYXNzLCBYbWxWYWx1ZVBhcnRpdGlvbmluZy5jbGFzcywgIlhtbFZhbHVlUGFydGl0aW9uaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sVmFyaWFibGVPbmVUb09uZUVDbGFzcywgWG1sVmFyaWFibGVPbmVUb09uZS5jbGFzcywgIlhtbFZhcmlhYmxlT25lVG9PbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFZhcmlhYmxlT25lVG9PbmVfVGFyZ2V0SW50ZXJmYWNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidGFyZ2V0SW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgWG1sVmFyaWFibGVPbmVUb09uZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFZlcnNpb25FQ2xhc3MsIFhtbFZlcnNpb24uY2xhc3MsICJYbWxWZXJzaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bShjYWNoZUNvb3JkaW5hdGlvblR5cGVFRW51bSwgQ2FjaGVDb29yZGluYXRpb25UeXBlLmNsYXNzLCAiQ2FjaGVDb29yZGluYXRpb25UeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChjYWNoZUNvb3JkaW5hdGlvblR5cGVFRW51bSwgQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMpOwotCQlhZGRFRW51bUxpdGVyYWwoY2FjaGVDb29yZGluYXRpb25UeXBlRUVudW0sIENhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChjYWNoZUNvb3JkaW5hdGlvblR5cGVFRW51bSwgQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTKTsKLQkJYWRkRUVudW1MaXRlcmFsKGNhY2hlQ29vcmRpbmF0aW9uVHlwZUVFbnVtLCBDYWNoZUNvb3JkaW5hdGlvblR5cGUuTk9ORSk7Ci0KLQkJaW5pdEVFbnVtKGNhY2hlVHlwZUVFbnVtLCBDYWNoZVR5cGUuY2xhc3MsICJDYWNoZVR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGNhY2hlVHlwZUVFbnVtLCBDYWNoZVR5cGUuRlVMTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChjYWNoZVR5cGVFRW51bSwgQ2FjaGVUeXBlLldFQUspOwotCQlhZGRFRW51bUxpdGVyYWwoY2FjaGVUeXBlRUVudW0sIENhY2hlVHlwZS5TT0ZUKTsKLQkJYWRkRUVudW1MaXRlcmFsKGNhY2hlVHlwZUVFbnVtLCBDYWNoZVR5cGUuU09GVF9XRUFLKTsKLQkJYWRkRUVudW1MaXRlcmFsKGNhY2hlVHlwZUVFbnVtLCBDYWNoZVR5cGUuSEFSRF9XRUFLKTsKLQkJYWRkRUVudW1MaXRlcmFsKGNhY2hlVHlwZUVFbnVtLCBDYWNoZVR5cGUuQ0FDSEUpOwotCQlhZGRFRW51bUxpdGVyYWwoY2FjaGVUeXBlRUVudW0sIENhY2hlVHlwZS5OT05FKTsKLQotCQlpbml0RUVudW0oeG1sQ2hhbmdlVHJhY2tpbmdUeXBlRUVudW0sIFhtbENoYW5nZVRyYWNraW5nVHlwZS5jbGFzcywgIlhtbENoYW5nZVRyYWNraW5nVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sQ2hhbmdlVHJhY2tpbmdUeXBlRUVudW0sIFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sQ2hhbmdlVHJhY2tpbmdUeXBlRUVudW0sIFhtbENoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sQ2hhbmdlVHJhY2tpbmdUeXBlRUVudW0sIFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxDaGFuZ2VUcmFja2luZ1R5cGVFRW51bSwgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCi0JCWluaXRFRW51bSh4bWxEaXJlY3Rpb25FRW51bSwgWG1sRGlyZWN0aW9uLmNsYXNzLCAiWG1sRGlyZWN0aW9uIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxEaXJlY3Rpb25FRW51bSwgWG1sRGlyZWN0aW9uLklOKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbERpcmVjdGlvbkVFbnVtLCBYbWxEaXJlY3Rpb24uT1VUKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbERpcmVjdGlvbkVFbnVtLCBYbWxEaXJlY3Rpb24uSU5fT1VUKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbERpcmVjdGlvbkVFbnVtLCBYbWxEaXJlY3Rpb24uT1VUX0NVUlNPUik7Ci0KLQkJaW5pdEVFbnVtKGV4aXN0ZW5jZVR5cGVFRW51bSwgRXhpc3RlbmNlVHlwZS5jbGFzcywgIkV4aXN0ZW5jZVR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGV4aXN0ZW5jZVR5cGVFRW51bSwgRXhpc3RlbmNlVHlwZS5DSEVDS19DQUNIRSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChleGlzdGVuY2VUeXBlRUVudW0sIEV4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UpOwotCQlhZGRFRW51bUxpdGVyYWwoZXhpc3RlbmNlVHlwZUVFbnVtLCBFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UpOwotCQlhZGRFRW51bUxpdGVyYWwoZXhpc3RlbmNlVHlwZUVFbnVtLCBFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFKTsKLQotCQlpbml0RUVudW0oeG1sSm9pbkZldGNoVHlwZUVFbnVtLCBYbWxKb2luRmV0Y2hUeXBlLmNsYXNzLCAiWG1sSm9pbkZldGNoVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sSm9pbkZldGNoVHlwZUVFbnVtLCBYbWxKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbEpvaW5GZXRjaFR5cGVFRW51bSwgWG1sSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0KLQkJaW5pdEVFbnVtKHhtbE9wdGltaXN0aWNMb2NraW5nVHlwZUVFbnVtLCBYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUuY2xhc3MsICJYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbE9wdGltaXN0aWNMb2NraW5nVHlwZUVFbnVtLCBYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUuQUxMX0NPTFVNTlMpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlRUVudW0sIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZS5DSEFOR0VEX0NPTFVNTlMpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlRUVudW0sIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZS5TRUxFQ1RFRF9DT0xVTU5TKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbE9wdGltaXN0aWNMb2NraW5nVHlwZUVFbnVtLCBYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUuVkVSU0lPTl9DT0xVTU4pOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIExpdGVyYWxzCi0JewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kcyA8ZW0+WG1sIEFjY2VzcyBNZXRob2RzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9BQ0NFU1NfTUVUSE9EUyA9IGVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HZXQgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQUNDRVNTX01FVEhPRFNfX0dFVF9NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc19HZXRNZXRob2QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNldCBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9BQ0NFU1NfTUVUSE9EU19fU0VUX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzX1NldE1ldGhvZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzSG9sZGVyIDxlbT5YbWwgQWNjZXNzIE1ldGhvZHMgSG9sZGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzSG9sZGVyCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVIgPSBlSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTID0gZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBZGRpdGlvbmFsQ3JpdGVyaWEgPGVtPlhtbCBBZGRpdGlvbmFsIENyaXRlcmlhPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBZGRpdGlvbmFsQ3JpdGVyaWEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBZGRpdGlvbmFsQ3JpdGVyaWEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQURESVRJT05BTF9DUklURVJJQSA9IGVJTlNUQU5DRS5nZXRYbWxBZGRpdGlvbmFsQ3JpdGVyaWEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXJyYXkgPGVtPlhtbCBBcnJheTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXJyYXkKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBcnJheSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9BUlJBWSA9IGVJTlNUQU5DRS5nZXRYbWxBcnJheSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5YbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0FUVFJJQlVURV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQVRUUklCVVRFX01BUFBJTkdfX0FUVFJJQlVURV9UWVBFID0gZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmdfQXR0cmlidXRlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzIDxlbT5BdHRyaWJ1dGVzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0QXR0cmlidXRlcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIEFUVFJJQlVURVMgPSBlSU5TVEFOQ0UuZ2V0QXR0cmlidXRlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzaWMgQ29sbGVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgQVRUUklCVVRFU19fQkFTSUNfQ09MTEVDVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19CYXNpY0NvbGxlY3Rpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNpYyBNYXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEFUVFJJQlVURVNfX0JBU0lDX01BUFMgPSBlSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19CYXNpY01hcHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRyYW5zZm9ybWF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBBVFRSSUJVVEVTX19UUkFOU0ZPUk1BVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19UcmFuc2Zvcm1hdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmxlIE9uZSBUbyBPbmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEFUVFJJQlVURVNfX1ZBUklBQkxFX09ORV9UT19PTkVTID0gZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfVmFyaWFibGVPbmVUb09uZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMgPGVtPlhtbCBCYXNpYzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXNpYygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9CQVNJQyA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpYygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb24gPGVtPlhtbCBCYXNpYyBDb2xsZWN0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb24KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXNpY0NvbGxlY3Rpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQkFTSUNfQ09MTEVDVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY0NvbGxlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNNYXAgPGVtPlhtbCBCYXNpYyBNYXA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWNNYXAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQkFTSUNfTUFQID0gZUlOU1RBTkNFLmdldFhtbEJhc2ljTWFwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2ggPGVtPlhtbCBCYXRjaCBGZXRjaDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhdGNoRmV0Y2goKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQkFUQ0hfRkVUQ0ggPSBlSU5TVEFOQ0UuZ2V0WG1sQmF0Y2hGZXRjaCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoSG9sZGVyIDxlbT5YbWwgQmF0Y2ggRmV0Y2ggSG9sZGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoSG9sZGVyCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9CQVRDSF9GRVRDSF9IT0xERVIgPSBlSU5TVEFOQ0UuZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2g8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9CQVRDSF9GRVRDSF9IT0xERVJfX0JBVENIX0ZFVENIID0gZUlOU1RBTkNFLmdldFhtbEJhdGNoRmV0Y2hIb2xkZXJfQmF0Y2hGZXRjaCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSA8ZW0+WG1sIENhY2hlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NBQ0hFID0gZUlOU1RBTkNFLmdldFhtbENhY2hlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHBpcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DQUNIRV9fRVhQSVJZID0gZUlOU1RBTkNFLmdldFhtbENhY2hlX0V4cGlyeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2l6ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NBQ0hFX19TSVpFID0gZUlOU1RBTkNFLmdldFhtbENhY2hlX1NpemUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNoYXJlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NBQ0hFX19TSEFSRUQgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfU2hhcmVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ0FDSEVfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWx3YXlzIFJlZnJlc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DQUNIRV9fQUxXQVlTX1JFRlJFU0ggPSBlSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfQWx3YXlzUmVmcmVzaCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmcmVzaCBPbmx5IElmIE5ld2VyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ0FDSEVfX1JFRlJFU0hfT05MWV9JRl9ORVdFUiA9IGVJTlNUQU5DRS5nZXRYbWxDYWNoZV9SZWZyZXNoT25seUlmTmV3ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc2FibGUgSGl0czwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NBQ0hFX19ESVNBQkxFX0hJVFMgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfRGlzYWJsZUhpdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvb3JkaW5hdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ0FDSEVfX0NPT1JESU5BVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldFhtbENhY2hlX0Nvb3JkaW5hdGlvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4cGlyeSBUaW1lIE9mIERheTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0NBQ0hFX19FWFBJUllfVElNRV9PRl9EQVkgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfRXhwaXJ5VGltZU9mRGF5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSG9sZGVyIDxlbT5YbWwgQ2FjaGUgSG9sZGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZUhvbGRlcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlSG9sZGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NBQ0hFX0hPTERFUiA9IGVJTlNUQU5DRS5nZXRYbWxDYWNoZUhvbGRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9DQUNIRV9IT0xERVJfX0NBQ0hFID0gZUlOU1RBTkNFLmdldFhtbENhY2hlSG9sZGVyX0NhY2hlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGlzdGVuY2UgQ2hlY2tpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DQUNIRV9IT0xERVJfX0VYSVNURU5DRV9DSEVDS0lORyA9IGVJTlNUQU5DRS5nZXRYbWxDYWNoZUhvbGRlcl9FeGlzdGVuY2VDaGVja2luZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZUluZGV4IDxlbT5YbWwgQ2FjaGUgSW5kZXg8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSW5kZXgKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZUluZGV4KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NBQ0hFX0lOREVYID0gZUlOU1RBTkNFLmdldFhtbENhY2hlSW5kZXgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmcgPGVtPlhtbCBDaGFuZ2UgVHJhY2tpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2hhbmdlVHJhY2tpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ0hBTkdFX1RSQUNLSU5HID0gZUlOU1RBTkNFLmdldFhtbENoYW5nZVRyYWNraW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ0hBTkdFX1RSQUNLSU5HX19UWVBFID0gZUlOU1RBTkNFLmdldFhtbENoYW5nZVRyYWNraW5nX1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIgPGVtPlhtbCBDaGFuZ2UgVHJhY2tpbmcgSG9sZGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ0hvbGRlcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NIQU5HRV9UUkFDS0lOR19IT0xERVIgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBUcmFja2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0NIQU5HRV9UUkFDS0lOR19IT0xERVJfX0NIQU5HRV9UUkFDS0lORyA9IGVJTlNUQU5DRS5nZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcl9DaGFuZ2VUcmFja2luZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDbG9uZUNvcHlQb2xpY3kgPGVtPlhtbCBDbG9uZSBDb3B5IFBvbGljeTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2xvbmVDb3B5UG9saWN5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NMT05FX0NPUFlfUE9MSUNZID0gZUlOU1RBTkNFLmdldFhtbENsb25lQ29weVBvbGljeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRYbWxDbG9uZUNvcHlQb2xpY3lfTWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xb3JraW5nIENvcHkgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX1dPUktJTkdfQ09QWV9NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2xvbmVDb3B5UG9saWN5X1dvcmtpbmdDb3B5TWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbGxlY3Rpb25UYWJsZSA8ZW0+WG1sIENvbGxlY3Rpb24gVGFibGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbGxlY3Rpb25UYWJsZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbGxlY3Rpb25UYWJsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DT0xMRUNUSU9OX1RBQkxFID0gZUlOU1RBTkNFLmdldFhtbENvbGxlY3Rpb25UYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUgPGVtPlhtbCBDb252ZXJzaW9uIFZhbHVlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJzaW9uVmFsdWUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ09OVkVSU0lPTl9WQUxVRSA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJzaW9uVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRhdGEgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DT05WRVJTSU9OX1ZBTFVFX19EQVRBX1ZBTFVFID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnNpb25WYWx1ZV9EYXRhVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NPTlZFUlNJT05fVkFMVUVfX09CSkVDVF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJzaW9uVmFsdWVfT2JqZWN0VmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyIDxlbT5YbWwgQ29udmVydGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ09OVkVSVEVSID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NPTlZFUlRFUl9fQ0xBU1NfTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJfQ2xhc3NOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckNvbnRhaW5lciA8ZW0+WG1sIENvbnZlcnRlciBDb250YWluZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckNvbnRhaW5lcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckNvbnRhaW5lcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DT05WRVJURVJfQ09OVEFJTkVSID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckNvbnRhaW5lcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fQ09OVkVSVEVSUyA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfQ29udmVydGVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19UWVBFX0NPTlZFUlRFUlMgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1R5cGVDb252ZXJ0ZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9PYmplY3RUeXBlQ29udmVydGVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX1NUUlVDVF9DT05WRVJURVJTID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9TdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyA8ZW0+WG1sIENvbnZlcnRpYmxlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0NPTlZFUlQgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0NvbnZlcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29weVBvbGljeSA8ZW0+WG1sIENvcHkgUG9saWN5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb3B5UG9saWN5Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29weVBvbGljeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DT1BZX1BPTElDWSA9IGVJTlNUQU5DRS5nZXRYbWxDb3B5UG9saWN5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NPUFlfUE9MSUNZX19DTEFTUyA9IGVJTlNUQU5DRS5nZXRYbWxDb3B5UG9saWN5X0NsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXIgPGVtPlhtbCBDdXN0b21pemVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVyCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ3VzdG9taXplcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DVVNUT01JWkVSID0gZUlOU1RBTkNFLmdldFhtbEN1c3RvbWl6ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkN1c3RvbWl6ZXIgQ2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NVU1RPTUlaRVJfX0NVU1RPTUlaRVJfQ0xBU1NfTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxDdXN0b21pemVyX0N1c3RvbWl6ZXJDbGFzc05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplckhvbGRlciA8ZW0+WG1sIEN1c3RvbWl6ZXIgSG9sZGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVySG9sZGVyCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ3VzdG9taXplckhvbGRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DVVNUT01JWkVSX0hPTERFUiA9IGVJTlNUQU5DRS5nZXRYbWxDdXN0b21pemVySG9sZGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DdXN0b21pemVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQ1VTVE9NSVpFUl9IT0xERVJfX0NVU1RPTUlaRVIgPSBlSU5TVEFOQ0UuZ2V0WG1sQ3VzdG9taXplckhvbGRlcl9DdXN0b21pemVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uIDxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VMRU1FTlRfQ09MTEVDVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlIDxlbT5YbWwgRW1iZWRkYWJsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVtYmVkZGFibGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU1CRUREQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZID0gZUlOU1RBTkNFLmdldFhtbEVtYmVkZGFibGVfQ29weVBvbGljeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VNQkVEREFCTEVfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZV9JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2xvbmUgQ29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTUJFRERBQkxFX19DTE9ORV9DT1BZX1BPTElDWSA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRhYmxlX0Nsb25lQ29weVBvbGljeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRU1CRUREQUJMRV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldFhtbEVtYmVkZGFibGVfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZCA8ZW0+WG1sIEVtYmVkZGVkPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VNQkVEREVEID0gZUlOU1RBTkNFLmdldFhtbEVtYmVkZGVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQgPGVtPlhtbCBFbWJlZGRlZCBJZDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkSWQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU1CRURERURfSUQgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkZWRJZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkgPGVtPlhtbCBFbnRpdHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTlRJVFkgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcHRpbWlzdGljIExvY2tpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX09QVElNSVNUSUNfTE9DS0lORyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfT3B0aW1pc3RpY0xvY2tpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19DT1BZX1BPTElDWSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfQ29weVBvbGljeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsb25lIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfQ2xvbmVDb3B5UG9saWN5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyA8ZW0+WG1sIEVudGl0eSBNYXBwaW5nczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTlRJVFlfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hBdHRyaWJ1dGUgPGVtPlhtbCBGZXRjaCBBdHRyaWJ1dGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoQXR0cmlidXRlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRmV0Y2hBdHRyaWJ1dGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRkVUQ0hfQVRUUklCVVRFID0gZUlOU1RBTkNFLmdldFhtbEZldGNoQXR0cmlidXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoR3JvdXAgPGVtPlhtbCBGZXRjaCBHcm91cDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hHcm91cAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEZldGNoR3JvdXAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRkVUQ0hfR1JPVVAgPSBlSU5TVEFOQ0UuZ2V0WG1sRmV0Y2hHcm91cCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCA8ZW0+WG1sIElkPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbElkKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0lEID0gZUlOU1RBTkNFLmdldFhtbElkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEluZGV4IDxlbT5YbWwgSW5kZXg8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEluZGV4Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSW5kZXgoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfSU5ERVggPSBlSU5TVEFOQ0UuZ2V0WG1sSW5kZXgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPGVtPlhtbCBJbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoIDxlbT5YbWwgSm9pbiBGZXRjaDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSm9pbkZldGNoKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0pPSU5fRkVUQ0ggPSBlSU5TVEFOQ0UuZ2V0WG1sSm9pbkZldGNoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Kb2luIEZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfSk9JTl9GRVRDSF9fSk9JTl9GRVRDSCA9IGVJTlNUQU5DRS5nZXRYbWxKb2luRmV0Y2hfSm9pbkZldGNoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZSA8ZW0+WG1sIEpvaW4gVGFibGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9KT0lOX1RBQkxFID0gZUlOU1RBTkNFLmdldFhtbEpvaW5UYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55IDxlbT5YbWwgTWFueSBUbyBNYW55PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQU5ZX1RPX01BTlkgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUgPGVtPlhtbCBNYW55IFRvIE9uZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFueVRvT25lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX01BTllfVE9fT05FID0gZUlOU1RBTkNFLmdldFhtbE1hbnlUb09uZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX01BUFBFRF9TVVBFUkNMQVNTID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9wdGltaXN0aWMgTG9ja2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PUFRJTUlTVElDX0xPQ0tJTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19PcHRpbWlzdGljTG9ja2luZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19Db3B5UG9saWN5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2xvbmUgQ29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0xPTkVfQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19DbG9uZUNvcHlQb2xpY3koKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19FeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11bHRpdGVuYW50IDxlbT5YbWwgTXVsdGl0ZW5hbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11bHRpdGVuYW50Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTXVsdGl0ZW5hbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTVVMVElURU5BTlQgPSBlSU5TVEFOQ0UuZ2V0WG1sTXVsdGl0ZW5hbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGl0ZW5hbnRIb2xkZXIgPGVtPlhtbCBNdWx0aXRlbmFudCBIb2xkZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11bHRpdGVuYW50SG9sZGVyCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTXVsdGl0ZW5hbnRIb2xkZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTVVMVElURU5BTlRfSE9MREVSID0gZUlOU1RBTkNFLmdldFhtbE11bHRpdGVuYW50SG9sZGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NdWx0aXRlbmFudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX01VTFRJVEVOQU5UX0hPTERFUl9fTVVMVElURU5BTlQgPSBlSU5TVEFOQ0UuZ2V0WG1sTXVsdGl0ZW5hbnRIb2xkZXJfTXVsdGl0ZW5hbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXV0YWJsZSA8ZW0+WG1sIE11dGFibGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11dGFibGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNdXRhYmxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX01VVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sTXV0YWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TXV0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX01VVEFCTEVfX01VVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sTXV0YWJsZV9NdXRhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29udmVydGVyIDxlbT5YbWwgTmFtZWQgQ29udmVydGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkQ29udmVydGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX05BTUVEX0NPTlZFUlRFUiA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZENvbnZlcnRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX05BTUVEX0NPTlZFUlRFUl9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZENvbnZlcnRlcl9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5IDxlbT5YbWwgTmFtZWQgUGxzcWwgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJ5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSWSA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnkgPGVtPlhtbCBOYW1lZCBQbHNxbCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJ5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnkKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSWSA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5IDxlbT5YbWwgTmFtZWQgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJ5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnkKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJZID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IDxlbT5YbWwgTmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyeTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWSA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc3VsdCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9DTEFTUyA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1Jlc3VsdENsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXN1bHQgU2V0IE1hcHBpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfU0VUX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9SZXN1bHRTZXRNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9jZWR1cmUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BST0NFRFVSRV9OQU1FID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUHJvY2VkdXJlTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmV0dXJucyBSZXN1bHQgU2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVUVVJOU19SRVNVTFRfU0VUID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmV0dXJuc1Jlc3VsdFNldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX0hJTlRTID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfSGludHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcmFtZXRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BBUkFNRVRFUlMgPSBlSU5TVEFOQ0UuZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9QYXJhbWV0ZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgPGVtPlhtbCBPYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUiA9IGVJTlNUQU5DRS5nZXRYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EYXRhIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX0RhdGFUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9PYmplY3RUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db252ZXJzaW9uIFZhbHVlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19DT05WRVJTSU9OX1ZBTFVFUyA9IGVJTlNUQU5DRS5nZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX0NvbnZlcnNpb25WYWx1ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgT2JqZWN0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19ERUZBVUxUX09CSkVDVF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX0RlZmF1bHRPYmplY3RWYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkgPGVtPlhtbCBPbmUgVG8gTWFueTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX09ORV9UT19NQU5ZID0gZUlOU1RBTkNFLmdldFhtbE9uZVRvTWFueSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSA8ZW0+WG1sIE9uZSBUbyBPbmU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT25lVG9PbmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfT05FX1RPX09ORSA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb09uZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZyA8ZW0+WG1sIE9wdGltaXN0aWMgTG9ja2luZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPcHRpbWlzdGljTG9ja2luZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PUFRJTUlTVElDX0xPQ0tJTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX09QVElNSVNUSUNfTE9DS0lOR19fQ0FTQ0FERSA9IGVJTlNUQU5DRS5nZXRYbWxPcHRpbWlzdGljTG9ja2luZ19DYXNjYWRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWxlY3RlZCBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX1NFTEVDVEVEX0NPTFVNTlMgPSBlSU5TVEFOQ0UuZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfU2VsZWN0ZWRDb2x1bW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyQ29sdW1uIDxlbT5YbWwgT3JkZXIgQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlckNvbHVtbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9yZGVyQ29sdW1uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX09SREVSX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRYbWxPcmRlckNvbHVtbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUyA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleSA8ZW0+WG1sIFByaW1hcnkgS2V5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QUklNQVJZX0tFWSA9IGVJTlNUQU5DRS5nZXRYbWxQcmltYXJ5S2V5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaXZhdGVPd25lZCA8ZW0+WG1sIFByaXZhdGUgT3duZWQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaXZhdGVPd25lZAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByaXZhdGVPd25lZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QUklWQVRFX09XTkVEID0gZUlOU1RBTkNFLmdldFhtbFByaXZhdGVPd25lZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJpdmF0ZSBPd25lZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BSSVZBVEVfT1dORURfX1BSSVZBVEVfT1dORUQgPSBlSU5TVEFOQ0UuZ2V0WG1sUHJpdmF0ZU93bmVkX1ByaXZhdGVPd25lZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSA8ZW0+WG1sIFByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BST1BFUlRZID0gZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUFJPUEVSVFlfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QUk9QRVJUWV9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlfVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QUk9QRVJUWV9fVkFMVUVfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eV9WYWx1ZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHlDb250YWluZXIgPGVtPlhtbCBQcm9wZXJ0eSBDb250YWluZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5Q29udGFpbmVyCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUFJPUEVSVFlfQ09OVEFJTkVSID0gZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lciA8ZW0+WG1sIFF1ZXJ5IENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxRdWVyeUNvbnRhaW5lcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9RVUVSWV9DT05UQUlORVIgPSBlSU5TVEFOQ0UuZ2V0WG1sUXVlcnlDb250YWluZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5UmVkaXJlY3RvcnMgPGVtPlhtbCBRdWVyeSBSZWRpcmVjdG9yczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlSZWRpcmVjdG9ycwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUVVFUllfUkVESVJFQ1RPUlMgPSBlSU5TVEFOQ0UuZ2V0WG1sUXVlcnlSZWRpcmVjdG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seSA8ZW0+WG1sIFJlYWQgT25seTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVhZE9ubHkKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSZWFkT25seSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9SRUFEX09OTFkgPSBlSU5TVEFOQ0UuZ2V0WG1sUmVhZE9ubHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1JFQURfT05MWV9fUkVBRF9PTkxZID0gZUlOU1RBTkNFLmdldFhtbFJlYWRPbmx5X1JlYWRPbmx5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJldHVybkluc2VydCA8ZW0+WG1sIFJldHVybiBJbnNlcnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJldHVybkluc2VydAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFJldHVybkluc2VydCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9SRVRVUk5fSU5TRVJUID0gZUlOU1RBTkNFLmdldFhtbFJldHVybkluc2VydCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZSA8ZW0+WG1sIFNlY29uZGFyeSBUYWJsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTZWNvbmRhcnlUYWJsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9TRUNPTkRBUllfVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sU2Vjb25kYXJ5VGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIDxlbT5YbWwgU3RvcmVkIFByb2NlZHVyZSBQYXJhbWV0ZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUiA9IGVJTlNUQU5DRS5nZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpcmVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19ESVJFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX0RpcmVjdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5RdWVyeSBQYXJhbWV0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fUVVFUllfUEFSQU1FVEVSID0gZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9RdWVyeVBhcmFtZXRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19UWVBFID0gZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KZGJjIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fSkRCQ19UWVBFID0gZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9KZGJjVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SmRiYyBUeXBlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fSkRCQ19UWVBFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX0pkYmNUeXBlTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3QgPGVtPlhtbCBTdHJ1Y3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFN0cnVjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9TVFJVQ1QgPSBlSU5TVEFOQ0UuZ2V0WG1sU3RydWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlciA8ZW0+WG1sIFN0cnVjdCBDb252ZXJ0ZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFN0cnVjdENvbnZlcnRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9TVFJVQ1RfQ09OVkVSVEVSID0gZUlOU1RBTkNFLmdldFhtbFN0cnVjdENvbnZlcnRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSID0gZUlOU1RBTkNFLmdldFhtbFN0cnVjdENvbnZlcnRlcl9Db252ZXJ0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0dXJlIDxlbT5YbWwgU3RydWN0dXJlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3R1cmUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdHJ1Y3R1cmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfU1RSVUNUVVJFID0gZUlOU1RBTkNFLmdldFhtbFN0cnVjdHVyZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZSA8ZW0+WG1sIFRhYmxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFRhYmxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1RBQkxFID0gZUlOU1RBTkNFLmdldFhtbFRhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yIDxlbT5YbWwgVGFibGUgR2VuZXJhdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFRhYmxlR2VuZXJhdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1RBQkxFX0dFTkVSQVRPUiA9IGVJTlNUQU5DRS5nZXRYbWxUYWJsZUdlbmVyYXRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uIDxlbT5YbWwgVGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU4gPSBlSU5TVEFOQ0UuZ2V0WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkgPGVtPlhtbCBUaW1lIE9mIERheTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVGltZU9mRGF5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1RJTUVfT0ZfREFZID0gZUlOU1RBTkNFLmdldFhtbFRpbWVPZkRheSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SG91cjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1RJTUVfT0ZfREFZX19IT1VSID0gZUlOU1RBTkNFLmdldFhtbFRpbWVPZkRheV9Ib3VyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NaW51dGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9USU1FX09GX0RBWV9fTUlOVVRFID0gZUlOU1RBTkNFLmdldFhtbFRpbWVPZkRheV9NaW51dGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY29uZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1RJTUVfT0ZfREFZX19TRUNPTkQgPSBlSU5TVEFOQ0UuZ2V0WG1sVGltZU9mRGF5X1NlY29uZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWlsbGlzZWNvbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9USU1FX09GX0RBWV9fTUlMTElTRUNPTkQgPSBlSU5TVEFOQ0UuZ2V0WG1sVGltZU9mRGF5X01pbGxpc2Vjb25kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zZm9ybWF0aW9uIDxlbT5YbWwgVHJhbnNmb3JtYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zZm9ybWF0aW9uCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVHJhbnNmb3JtYXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVFJBTlNGT1JNQVRJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sVHJhbnNmb3JtYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50IDxlbT5YbWwgVHJhbnNpZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUcmFuc2llbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVFJBTlNJRU5UID0gZUlOU1RBTkNFLmdldFhtbFRyYW5zaWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyIDxlbT5YbWwgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUeXBlQ29udmVydGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1RZUEVfQ09OVkVSVEVSID0gZUlOU1RBTkNFLmdldFhtbFR5cGVDb252ZXJ0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRhdGEgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sVHlwZUNvbnZlcnRlcl9EYXRhVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sVHlwZUNvbnZlcnRlcl9PYmplY3RUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nIDxlbT5YbWwgVHlwZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFR5cGVNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1RZUEVfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRYbWxUeXBlTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lIDxlbT5YbWwgVmFyaWFibGUgT25lIFRvIE9uZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFZhcmlhYmxlT25lVG9PbmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVkFSSUFCTEVfT05FX1RPX09ORSA9IGVJTlNUQU5DRS5nZXRYbWxWYXJpYWJsZU9uZVRvT25lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fVEFSR0VUX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRYbWxWYXJpYWJsZU9uZVRvT25lX1RhcmdldEludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uIDxlbT5YbWwgVmVyc2lvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFZlcnNpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRYbWxWZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEhhc2hQYXJ0aXRpb25pbmcgPGVtPlhtbCBIYXNoIFBhcnRpdGlvbmluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSGFzaFBhcnRpdGlvbmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEhhc2hQYXJ0aXRpb25pbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfSEFTSF9QQVJUSVRJT05JTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sSGFzaFBhcnRpdGlvbmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQYXJ0aXRpb25pbmcgPGVtPlhtbCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBhcnRpdGlvbmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QQVJUSVRJT05JTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBpbm5lZFBhcnRpdGlvbmluZyA8ZW0+WG1sIFBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBpbm5lZFBhcnRpdGlvbmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBpbm5lZFBhcnRpdGlvbmluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QSU5ORURfUEFSVElUSU9OSU5HID0gZUlOU1RBTkNFLmdldFhtbFBpbm5lZFBhcnRpdGlvbmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQbHNxbFJlY29yZCA8ZW0+WG1sIFBsc3FsIFJlY29yZDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGxzcWxSZWNvcmQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQbHNxbFJlY29yZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QTFNRTF9SRUNPUkQgPSBlSU5TVEFOQ0UuZ2V0WG1sUGxzcWxSZWNvcmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGxzcWxUYWJsZSA8ZW0+WG1sIFBsc3FsIFRhYmxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQbHNxbFRhYmxlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGxzcWxUYWJsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QTFNRTF9UQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxQbHNxbFRhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJhbmdlUGFydGl0aW9uaW5nIDxlbT5YbWwgUmFuZ2UgUGFydGl0aW9uaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSYW5nZVBhcnRpdGlvbmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFJhbmdlUGFydGl0aW9uaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1JBTkdFX1BBUlRJVElPTklORyA9IGVJTlNUQU5DRS5nZXRYbWxSYW5nZVBhcnRpdGlvbmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZyA8ZW0+WG1sIFJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZyA8ZW0+WG1sIFJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HID0gZUlOU1RBTkNFLmdldFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pb25QYXJ0aXRpb25pbmcgPGVtPlhtbCBVbmlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaW9uUGFydGl0aW9uaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVW5pb25QYXJ0aXRpb25pbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVU5JT05fUEFSVElUSU9OSU5HID0gZUlOU1RBTkNFLmdldFhtbFVuaW9uUGFydGl0aW9uaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhbHVlUGFydGl0aW9uaW5nIDxlbT5YbWwgVmFsdWUgUGFydGl0aW9uaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYWx1ZVBhcnRpdGlvbmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFZhbHVlUGFydGl0aW9uaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1ZBTFVFX1BBUlRJVElPTklORyA9IGVJTlNUQU5DRS5nZXRYbWxWYWx1ZVBhcnRpdGlvbmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUgPGVtPkNhY2hlIENvb3JkaW5hdGlvbiBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldENhY2hlQ29vcmRpbmF0aW9uVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Q2FjaGVDb29yZGluYXRpb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZSA8ZW0+Q2FjaGUgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRDYWNoZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIENBQ0hFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Q2FjaGVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nVHlwZSA8ZW0+WG1sIENoYW5nZSBUcmFja2luZyBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENoYW5nZVRyYWNraW5nVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gWE1MX0NIQU5HRV9UUkFDS0lOR19UWVBFID0gZUlOU1RBTkNFLmdldFhtbENoYW5nZVRyYWNraW5nVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXJlY3Rpb24gPGVtPlhtbCBEaXJlY3Rpb248L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlyZWN0aW9uCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRGlyZWN0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRW51bSBYTUxfRElSRUNUSU9OID0gZUlOU1RBTkNFLmdldFhtbERpcmVjdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlIDxlbT5FeGlzdGVuY2UgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0RXhpc3RlbmNlVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gRVhJU1RFTkNFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RXhpc3RlbmNlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlIDxlbT5YbWwgSm9pbiBGZXRjaCBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxKb2luRmV0Y2hUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRW51bSBYTUxfSk9JTl9GRVRDSF9UWVBFID0gZUlOU1RBTkNFLmdldFhtbEpvaW5GZXRjaFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIDxlbT5YbWwgT3B0aW1pc3RpYyBMb2NraW5nIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRW51bSBYTUxfT1BUSU1JU1RJQ19MT0NLSU5HX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlKCk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9FY2xpcHNlTGlua09ybVhtbFJlc291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzE1NGJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9FY2xpcHNlTGlua09ybVhtbFJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5OwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VGYWN0b3J5IGV4dGVuZHMgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeQotewotCXB1YmxpYyBFY2xpcHNlTGlua09ybVhtbFJlc291cmNlRmFjdG9yeSgpIHsKLQkJdGhpcyhSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFSZW5kZXJlckZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnksIGJvb2xlYW4gbGlzdGVuaW5nRm9yVXBkYXRlcykgewotCQlzdXBlcihhUmVuZGVyZXJGYWN0b3J5LCBsaXN0ZW5pbmdGb3JVcGRhdGVzKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHNlZSBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5I2NyZWF0ZVJlc291cmNlKFVSSSwgUmVuZGVyZXIpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZW5kZXJlciByZW5kZXJlcikgewotCQlyZXR1cm4gbmV3IEpwYVhtbFJlc291cmNlKHVyaSwgcmVuZGVyZXIsIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgWG1sRW50aXR5TWFwcGluZ3MuZ2V0Um9vdFRyYW5zbGF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0V4aXN0ZW5jZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9FeGlzdGVuY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4OTcwN2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0V4aXN0ZW5jZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkV4aXN0ZW5jZSBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0RXhpc3RlbmNlVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gRXhpc3RlbmNlVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DSEVDSyBDQUNIRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDSEVDS19DQUNIRV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUNIRUNLX0NBQ0hFKDAsICJDSEVDS19DQUNIRSIsICJDSEVDS19DQUNIRSIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0hFQ0sgREFUQUJBU0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ0hFQ0tfREFUQUJBU0VfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlDSEVDS19EQVRBQkFTRSgxLCAiQ0hFQ0tfREFUQUJBU0UiLCAiQ0hFQ0tfREFUQUJBU0UiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFTU1VNRSBFWElTVEVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVNTVU1FX0VYSVNURU5DRV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUFTU1VNRV9FWElTVEVOQ0UoMiwgIkFTU1VNRV9FWElTVEVOQ0UiLCAiQVNTVU1FX0VYSVNURU5DRSIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QVNTVU1FIE5PTiBFWElTVEVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVNTVU1FX05PTl9FWElTVEVOQ0VfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlBU1NVTUVfTk9OX0VYSVNURU5DRSgzLCAiQVNTVU1FX05PTl9FWElTVEVOQ0UiLCAiQVNTVU1FX05PTl9FWElTVEVOQ0UiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNIRUNLIENBQ0hFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DSEVDSyBDQUNIRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDSEVDS19DQUNIRQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIRUNLX0NBQ0hFX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNIRUNLIERBVEFCQVNFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DSEVDSyBEQVRBQkFTRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDSEVDS19EQVRBQkFTRQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIRUNLX0RBVEFCQVNFX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFTU1VNRSBFWElTVEVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFTU1VNRSBFWElTVEVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVNTVU1FX0VYSVNURU5DRQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTU1VNRV9FWElTVEVOQ0VfVkFMVUUgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QVNTVU1FIE5PTiBFWElTVEVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFTU1VNRSBOT04gRVhJU1RFTkNFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FTU1VNRV9OT05fRVhJU1RFTkNFCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNTVU1FX05PTl9FWElTVEVOQ0VfVkFMVUUgPSAzOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkV4aXN0ZW5jZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeGlzdGVuY2VUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEV4aXN0ZW5jZVR5cGVbXQotCQl7Ci0JCQlDSEVDS19DQUNIRSwKLQkJCUNIRUNLX0RBVEFCQVNFLAotCQkJQVNTVU1FX0VYSVNURU5DRSwKLQkJCUFTU1VNRV9OT05fRVhJU1RFTkNFLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkV4aXN0ZW5jZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8RXhpc3RlbmNlVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5FeGlzdGVuY2UgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4aXN0ZW5jZVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUV4aXN0ZW5jZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RXhpc3RlbmNlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFeGlzdGVuY2VUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlFeGlzdGVuY2VUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RXhpc3RlbmNlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFeGlzdGVuY2VUeXBlIGdldChpbnQgdmFsdWUpCi0JewotCQlzd2l0Y2ggKHZhbHVlKQotCQl7Ci0JCQljYXNlIENIRUNLX0NBQ0hFX1ZBTFVFOiByZXR1cm4gQ0hFQ0tfQ0FDSEU7Ci0JCQljYXNlIENIRUNLX0RBVEFCQVNFX1ZBTFVFOiByZXR1cm4gQ0hFQ0tfREFUQUJBU0U7Ci0JCQljYXNlIEFTU1VNRV9FWElTVEVOQ0VfVkFMVUU6IHJldHVybiBBU1NVTUVfRVhJU1RFTkNFOwotCQkJY2FzZSBBU1NVTUVfTk9OX0VYSVNURU5DRV9WQUxVRTogcmV0dXJuIEFTU1VNRV9OT05fRVhJU1RFTkNFOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFeGlzdGVuY2VUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQotCXsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQotCXsKLQkgIHJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkgIHJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCi0JewotCSAgcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCXJldHVybiBsaXRlcmFsOwotCX0KLQkKLX0gLy9FeGlzdGVuY2VUeXBlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQWNjZXNzTWV0aG9kcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFjY2Vzc01ldGhvZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiZDEzYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQWNjZXNzTWV0aG9kcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHMjZ2V0R2V0TWV0aG9kIDxlbT5HZXQgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHMjZ2V0U2V0TWV0aG9kIDxlbT5TZXQgTWV0aG9kPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEFjY2Vzc01ldGhvZHMgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdldE1ldGhvZCgpIDxlbT5HZXQgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHZXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVF9NRVRIT0RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R2V0TWV0aG9kKCkgPGVtPkdldCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNZXRob2QgPSBHRVRfTUVUSE9EX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNldE1ldGhvZCgpIDxlbT5TZXQgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9NRVRIT0RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2V0TWV0aG9kKCkgPGVtPlNldCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzZXRNZXRob2QgPSBTRVRfTUVUSE9EX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9BQ0NFU1NfTUVUSE9EUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HZXQgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HZXQgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdldCBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEdldE1ldGhvZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzX0dldE1ldGhvZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEdldE1ldGhvZCgpCi0JewotCQlyZXR1cm4gZ2V0TWV0aG9kOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kcyNnZXRHZXRNZXRob2QgPGVtPkdldCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdldCBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEdldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdldE1ldGhvZChTdHJpbmcgbmV3R2V0TWV0aG9kKQotCXsKLQkJU3RyaW5nIG9sZEdldE1ldGhvZCA9IGdldE1ldGhvZDsKLQkJZ2V0TWV0aG9kID0gbmV3R2V0TWV0aG9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19HRVRfTUVUSE9ELCBvbGRHZXRNZXRob2QsIGdldE1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNldCBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNldCBNZXRob2Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2V0IE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2V0TWV0aG9kKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNfU2V0TWV0aG9kKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2V0TWV0aG9kKCkKLQl7Ci0JCXJldHVybiBzZXRNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzI2dldFNldE1ldGhvZCA8ZW0+U2V0IE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2V0IE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2V0TWV0aG9kKFN0cmluZyBuZXdTZXRNZXRob2QpCi0JewotCQlTdHJpbmcgb2xkU2V0TWV0aG9kID0gc2V0TWV0aG9kOwotCQlzZXRNZXRob2QgPSBuZXdTZXRNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfX1NFVF9NRVRIT0QsIG9sZFNldE1ldGhvZCwgc2V0TWV0aG9kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfX0dFVF9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGdldEdldE1ldGhvZCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19TRVRfTUVUSE9EOgotCQkJCXJldHVybiBnZXRTZXRNZXRob2QoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfX0dFVF9NRVRIT0Q6Ci0JCQkJc2V0R2V0TWV0aG9kKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19fU0VUX01FVEhPRDoKLQkJCQlzZXRTZXRNZXRob2QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19HRVRfTUVUSE9EOgotCQkJCXNldEdldE1ldGhvZChHRVRfTUVUSE9EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfX1NFVF9NRVRIT0Q6Ci0JCQkJc2V0U2V0TWV0aG9kKFNFVF9NRVRIT0RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfX0dFVF9NRVRIT0Q6Ci0JCQkJcmV0dXJuIEdFVF9NRVRIT0RfRURFRkFVTFQgPT0gbnVsbCA/IGdldE1ldGhvZCAhPSBudWxsIDogIUdFVF9NRVRIT0RfRURFRkFVTFQuZXF1YWxzKGdldE1ldGhvZCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfX1NFVF9NRVRIT0Q6Ci0JCQkJcmV0dXJuIFNFVF9NRVRIT0RfRURFRkFVTFQgPT0gbnVsbCA/IHNldE1ldGhvZCAhPSBudWxsIDogIVNFVF9NRVRIT0RfRURFRkFVTFQuZXF1YWxzKHNldE1ldGhvZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdldE1ldGhvZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ2V0TWV0aG9kKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZXRNZXRob2Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNldE1ldGhvZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kcygpLAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQotCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRHZXRNZXRob2RUcmFuc2xhdG9yKCksCi0JCQlidWlsZFNldE1ldGhvZFRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkR2V0TWV0aG9kVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkFDQ0VTU19NRVRIT0RTX19HRVRfTUVUSE9ELCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNfR2V0TWV0aG9kKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNldE1ldGhvZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EU19fU0VUX01FVEhPRCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzX1NldE1ldGhvZCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLX0gLy8gWG1sQWNjZXNzTWV0aG9kcwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFjY2Vzc01ldGhvZHNIb2xkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMzNhMGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFjY2Vzc01ldGhvZHNIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQWNjZXNzIE1ldGhvZHMgSG9sZGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kc0hvbGRlciNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQWNjZXNzTWV0aG9kc0hvbGRlciBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kc0hvbGRlciNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSk7Ci0KLX0gLy8gWG1sQWNjZXNzTWV0aG9kc0hvbGRlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFkZGl0aW9uYWxDcml0ZXJpYS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFkZGl0aW9uYWxDcml0ZXJpYS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWQyM2VkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxBZGRpdGlvbmFsQ3JpdGVyaWEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBBZGRpdGlvbmFsIENyaXRlcmlhPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBZGRpdGlvbmFsQ3JpdGVyaWEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sQWRkaXRpb25hbENyaXRlcmlhIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcml0ZXJpYSgpIDxlbT5Dcml0ZXJpYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JpdGVyaWEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENSSVRFUklBX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyaXRlcmlhKCkgPGVtPkNyaXRlcmlhPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcml0ZXJpYSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjcml0ZXJpYSA9IENSSVRFUklBX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFkZGl0aW9uYWxDcml0ZXJpYSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0FERElUSU9OQUxfQ1JJVEVSSUE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JpdGVyaWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNyaXRlcmlhPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyaXRlcmlhPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDcml0ZXJpYShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yX0NyaXRlcmlhKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JpdGVyaWEoKQotCXsKLQkJcmV0dXJuIGNyaXRlcmlhOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWRkaXRpb25hbENyaXRlcmlhI2dldENyaXRlcmlhIDxlbT5Dcml0ZXJpYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3JpdGVyaWE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENyaXRlcmlhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JpdGVyaWEoU3RyaW5nIG5ld0NyaXRlcmlhKQotCXsKLQkJU3RyaW5nIG9sZENyaXRlcmlhID0gY3JpdGVyaWE7Ci0JCWNyaXRlcmlhID0gbmV3Q3JpdGVyaWE7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQURESVRJT05BTF9DUklURVJJQV9fQ1JJVEVSSUEsIG9sZENyaXRlcmlhLCBjcml0ZXJpYSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FERElUSU9OQUxfQ1JJVEVSSUFfX0NSSVRFUklBOgotCQkJCXJldHVybiBnZXRDcml0ZXJpYSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BRERJVElPTkFMX0NSSVRFUklBX19DUklURVJJQToKLQkJCQlzZXRDcml0ZXJpYSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQURESVRJT05BTF9DUklURVJJQV9fQ1JJVEVSSUE6Ci0JCQkJc2V0Q3JpdGVyaWEoQ1JJVEVSSUFfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQURESVRJT05BTF9DUklURVJJQV9fQ1JJVEVSSUE6Ci0JCQkJcmV0dXJuIENSSVRFUklBX0VERUZBVUxUID09IG51bGwgPyBjcml0ZXJpYSAhPSBudWxsIDogIUNSSVRFUklBX0VERUZBVUxULmVxdWFscyhjcml0ZXJpYSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNyaXRlcmlhOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjcml0ZXJpYSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFkZGl0aW9uYWxDcml0ZXJpYSgpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkQ3JpdGVyaWFUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ3JpdGVyaWFUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuQ1JJVEVSSUEsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzJfQ3JpdGVyaWEoKSk7Ci0JfQotCQotfSAvLyBYbWxBZGRpdGlvbmFsQ3JpdGVyaWEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxBcnJheS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFycmF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNWMzMzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFycmF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5FbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQ29sdW1uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxBcnJheV8yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEFycmF5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFycmF5KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEFycmF5IGV4dGVuZHMgQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudHMgWG1sQXR0cmlidXRlTWFwcGluZywgWG1sQXJyYXlfMl8zLCBYbWxDb252ZXJ0aWJsZU1hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZVR5cGUgPSBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnRlcnMoKSA8ZW0+Q29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQ29udmVydGVyPiBjb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZUNvbnZlcnRlcnMoKSA8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4gdHlwZUNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlQ29udmVydGVycygpIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkgPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0cnVjdENvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+IHN0cnVjdENvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMb2IoKSA8ZW0+TG9iPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0xvYigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMb2IoKSA8ZW0+TG9iPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0xvYigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbG9iID0gTE9CX0VERUZBVUxUOwotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVGVtcG9yYWxUeXBlIFRFTVBPUkFMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRlbXBvcmFsKCkgPGVtPlRlbXBvcmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUZW1wb3JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSB0ZW1wb3JhbCA9IFRFTVBPUkFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRW51bVR5cGUgRU5VTUVSQVRFRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnVtZXJhdGVkKCkgPGVtPkVudW1lcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVudW1lcmF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFbnVtVHlwZSBlbnVtZXJhdGVkID0gRU5VTUVSQVRFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbHVtbigpIDxlbT5Db2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENvbHVtbiBjb2x1bW47Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YWJhc2VUeXBlKCkgPGVtPkRhdGFiYXNlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERhdGFiYXNlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQUJBU0VfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRhYmFzZVR5cGUoKSA8ZW0+RGF0YWJhc2UgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGF0YWJhc2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRhdGFiYXNlVHlwZSA9IERBVEFCQVNFX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0Q2xhc3MoKSA8ZW0+VGFyZ2V0IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXJnZXRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldENsYXNzKCkgPGVtPlRhcmdldCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFyZ2V0Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0Q2xhc3MgPSBUQVJHRVRfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydCgpIDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnQoKSA8ZW0+Q29udmVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0ID0gQ09OVkVSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBcnJheSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0FSUkFZOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOwotCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fQUNDRVNTX01FVEhPRFMsIG9sZEFjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXJyYXkjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCi0JewotCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY2Nlc3NNZXRob2RzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpCi0JewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQl7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByb3BlcnR5PihYbWxQcm9wZXJ0eS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX0NvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbENvbnZlcnRlcj4gZ2V0Q29udmVydGVycygpCi0JewotCQlpZiAoY29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQljb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbENvbnZlcnRlcj4oWG1sQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gY29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1R5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxUeXBlQ29udmVydGVyPiBnZXRUeXBlQ29udmVydGVycygpCi0JewotCQlpZiAodHlwZUNvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJdHlwZUNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4oWG1sVHlwZUNvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fVFlQRV9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gdHlwZUNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckNvbnRhaW5lcl9PYmplY3RUeXBlQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCXsKLQkJaWYgKG9iamVjdFR5cGVDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCW9iamVjdFR5cGVDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+KFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfU3RydWN0Q29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPiBnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmIChzdHJ1Y3RDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCXN0cnVjdENvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPihYbWxTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX1NUUlVDVF9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gc3RydWN0Q29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvYihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0xvYigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMb2IoKQotCXsKLQkJcmV0dXJuIGxvYjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFycmF5I2lzTG9iIDxlbT5Mb2I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNMb2IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2IoYm9vbGVhbiBuZXdMb2IpCi0JewotCQlib29sZWFuIG9sZExvYiA9IGxvYjsKLQkJbG9iID0gbmV3TG9iOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19MT0IsIG9sZExvYiwgbG9iKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQotCSAqIEBzZWUgI3NldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZ19UZW1wb3JhbCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKQotCXsKLQkJcmV0dXJuIHRlbXBvcmFsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXJyYXkjZ2V0VGVtcG9yYWwgPGVtPlRlbXBvcmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQotCSAqIEBzZWUgI2dldFRlbXBvcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlIG5ld1RlbXBvcmFsKQotCXsKLQkJVGVtcG9yYWxUeXBlIG9sZFRlbXBvcmFsID0gdGVtcG9yYWw7Ci0JCXRlbXBvcmFsID0gbmV3VGVtcG9yYWwgPT0gbnVsbCA/IFRFTVBPUkFMX0VERUZBVUxUIDogbmV3VGVtcG9yYWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX1RFTVBPUkFMLCBvbGRUZW1wb3JhbCwgdGVtcG9yYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQotCSAqIEBzZWUgI3NldEVudW1lcmF0ZWQoRW51bVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfRW51bWVyYXRlZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbnVtVHlwZSBnZXRFbnVtZXJhdGVkKCkKLQl7Ci0JCXJldHVybiBlbnVtZXJhdGVkOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXJyYXkjZ2V0RW51bWVyYXRlZCA8ZW0+RW51bWVyYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW51bWVyYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlCi0JICogQHNlZSAjZ2V0RW51bWVyYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudW1lcmF0ZWQoRW51bVR5cGUgbmV3RW51bWVyYXRlZCkKLQl7Ci0JCUVudW1UeXBlIG9sZEVudW1lcmF0ZWQgPSBlbnVtZXJhdGVkOwotCQllbnVtZXJhdGVkID0gbmV3RW51bWVyYXRlZCA9PSBudWxsID8gRU5VTUVSQVRFRF9FREVGQVVMVCA6IG5ld0VudW1lcmF0ZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0VOVU1FUkFURUQsIG9sZEVudW1lcmF0ZWQsIGVudW1lcmF0ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbHVtbihYbWxDb2x1bW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRDb2x1bW5NYXBwaW5nX0NvbHVtbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ29sdW1uIGdldENvbHVtbigpCi0JewotCQlyZXR1cm4gY29sdW1uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbHVtbihYbWxDb2x1bW4gbmV3Q29sdW1uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ29sdW1uIG9sZENvbHVtbiA9IGNvbHVtbjsKLQkJY29sdW1uID0gbmV3Q29sdW1uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19DT0xVTU4sIG9sZENvbHVtbiwgbmV3Q29sdW1uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFycmF5I2dldENvbHVtbiA8ZW0+Q29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbihYbWxDb2x1bW4gbmV3Q29sdW1uKQotCXsKLQkJaWYgKG5ld0NvbHVtbiAhPSBjb2x1bW4pCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNvbHVtbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljb2x1bW4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19DT0xVTU4sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NvbHVtbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb2x1bW4pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19DT0xVTU4sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29sdW1uKG5ld0NvbHVtbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19DT0xVTU4sIG5ld0NvbHVtbiwgbmV3Q29sdW1uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGF0YWJhc2UgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF0YWJhc2UgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhYmFzZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREYXRhYmFzZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQXJyYXlfMl8zX0RhdGFiYXNlVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFiYXNlVHlwZSgpCi0JewotCQlyZXR1cm4gZGF0YWJhc2VUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXJyYXkjZ2V0RGF0YWJhc2VUeXBlIDxlbT5EYXRhYmFzZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhYmFzZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREYXRhYmFzZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhYmFzZVR5cGUoU3RyaW5nIG5ld0RhdGFiYXNlVHlwZSkKLQl7Ci0JCVN0cmluZyBvbGREYXRhYmFzZVR5cGUgPSBkYXRhYmFzZVR5cGU7Ci0JCWRhdGFiYXNlVHlwZSA9IG5ld0RhdGFiYXNlVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fREFUQUJBU0VfVFlQRSwgb2xkRGF0YWJhc2VUeXBlLCBkYXRhYmFzZVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXJnZXQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhcmdldCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRhcmdldENsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFycmF5XzJfM19UYXJnZXRDbGFzcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldENsYXNzKCkKLQl7Ci0JCXJldHVybiB0YXJnZXRDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFycmF5I2dldFRhcmdldENsYXNzIDxlbT5UYXJnZXQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGFyZ2V0Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRDbGFzcyhTdHJpbmcgbmV3VGFyZ2V0Q2xhc3MpCi0JewotCQlTdHJpbmcgb2xkVGFyZ2V0Q2xhc3MgPSB0YXJnZXRDbGFzczsKLQkJdGFyZ2V0Q2xhc3MgPSBuZXdUYXJnZXRDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fVEFSR0VUX0NMQVNTLCBvbGRUYXJnZXRDbGFzcywgdGFyZ2V0Q2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgpCi0JewotCQlyZXR1cm4gYXR0cmlidXRlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFycmF5I2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIG5ld0F0dHJpYnV0ZVR5cGUpCi0JewotCQlTdHJpbmcgb2xkQXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGU7Ci0JCWF0dHJpYnV0ZVR5cGUgPSBuZXdBdHRyaWJ1dGVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19BVFRSSUJVVEVfVFlQRSwgb2xkQXR0cmlidXRlVHlwZSwgYXR0cmlidXRlVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29udmVydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfQ29udmVydCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnQoKQotCXsKLQkJcmV0dXJuIGNvbnZlcnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBcnJheSNnZXRDb252ZXJ0IDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udmVydChTdHJpbmcgbmV3Q29udmVydCkKLQl7Ci0JCVN0cmluZyBvbGRDb252ZXJ0ID0gY29udmVydDsKLQkJY29udmVydCA9IG5ld0NvbnZlcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0NPTlZFUlQsIG9sZENvbnZlcnQsIGNvbnZlcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFR5cGVDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fQ09MVU1OOgotCQkJCXJldHVybiBiYXNpY1NldENvbHVtbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZVR5cGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0Q29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0xPQjoKLQkJCQlyZXR1cm4gaXNMb2IoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fVEVNUE9SQUw6Ci0JCQkJcmV0dXJuIGdldFRlbXBvcmFsKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0VOVU1FUkFURUQ6Ci0JCQkJcmV0dXJuIGdldEVudW1lcmF0ZWQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fQ09MVU1OOgotCQkJCXJldHVybiBnZXRDb2x1bW4oKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fREFUQUJBU0VfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RGF0YWJhc2VUeXBlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX1RBUkdFVF9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0VGFyZ2V0Q2xhc3MoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fQ09OVkVSVDoKLQkJCQlyZXR1cm4gZ2V0Q29udmVydCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fQ09OVkVSVEVSUzoKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFR5cGVDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxPYmplY3RUeXBlQ29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxTdHJ1Y3RDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0xPQjoKLQkJCQlzZXRMb2IoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fVEVNUE9SQUw6Ci0JCQkJc2V0VGVtcG9yYWwoKFRlbXBvcmFsVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19FTlVNRVJBVEVEOgotCQkJCXNldEVudW1lcmF0ZWQoKEVudW1UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0NPTFVNTjoKLQkJCQlzZXRDb2x1bW4oKFhtbENvbHVtbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19EQVRBQkFTRV9UWVBFOgotCQkJCXNldERhdGFiYXNlVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX1RBUkdFVF9DTEFTUzoKLQkJCQlzZXRUYXJnZXRDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0NPTlZFUlQ6Ci0JCQkJc2V0Q29udmVydCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZShBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19DT05WRVJURVJTOgotCQkJCWdldENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19MT0I6Ci0JCQkJc2V0TG9iKExPQl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19URU1QT1JBTDoKLQkJCQlzZXRUZW1wb3JhbChURU1QT1JBTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19FTlVNRVJBVEVEOgotCQkJCXNldEVudW1lcmF0ZWQoRU5VTUVSQVRFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19DT0xVTU46Ci0JCQkJc2V0Q29sdW1uKChYbWxDb2x1bW4pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19EQVRBQkFTRV9UWVBFOgotCQkJCXNldERhdGFiYXNlVHlwZShEQVRBQkFTRV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX1RBUkdFVF9DTEFTUzoKLQkJCQlzZXRUYXJnZXRDbGFzcyhUQVJHRVRfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fQ09OVkVSVDoKLQkJCQlzZXRDb252ZXJ0KENPTlZFUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gYXR0cmlidXRlVHlwZSAhPSBudWxsIDogIUFUVFJJQlVURV9UWVBFX0VERUZBVUxULmVxdWFscyhhdHRyaWJ1dGVUeXBlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gY29udmVydGVycyAhPSBudWxsICYmICFjb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiB0eXBlQ29udmVydGVycyAhPSBudWxsICYmICF0eXBlQ29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIW9iamVjdFR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcnMgIT0gbnVsbCAmJiAhc3RydWN0Q29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0xPQjoKLQkJCQlyZXR1cm4gbG9iICE9IExPQl9FREVGQVVMVDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fVEVNUE9SQUw6Ci0JCQkJcmV0dXJuIHRlbXBvcmFsICE9IFRFTVBPUkFMX0VERUZBVUxUOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19FTlVNRVJBVEVEOgotCQkJCXJldHVybiBlbnVtZXJhdGVkICE9IEVOVU1FUkFURURfRURFRkFVTFQ7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0NPTFVNTjoKLQkJCQlyZXR1cm4gY29sdW1uICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0RBVEFCQVNFX1RZUEU6Ci0JCQkJcmV0dXJuIERBVEFCQVNFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGRhdGFiYXNlVHlwZSAhPSBudWxsIDogIURBVEFCQVNFX1RZUEVfRURFRkFVTFQuZXF1YWxzKGRhdGFiYXNlVHlwZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX1RBUkdFVF9DTEFTUzoKLQkJCQlyZXR1cm4gVEFSR0VUX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyB0YXJnZXRDbGFzcyAhPSBudWxsIDogIVRBUkdFVF9DTEFTU19FREVGQVVMVC5lcXVhbHModGFyZ2V0Q2xhc3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19DT05WRVJUOgotCQkJCXJldHVybiBDT05WRVJUX0VERUZBVUxUID09IG51bGwgPyBjb252ZXJ0ICE9IG51bGwgOiAhQ09OVkVSVF9FREVGQVVMVC5lcXVhbHMoY29udmVydCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BVFRSSUJVVEVfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19TVFJVQ1RfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fU1RSVUNUX0NPTlZFUlRFUlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0xPQjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0xPQjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX1RFTVBPUkFMOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fVEVNUE9SQUw7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19FTlVNRVJBVEVEOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fRU5VTUVSQVRFRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBDb2x1bW5NYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19DT0xVTU46IHJldHVybiBPcm1QYWNrYWdlLkNPTFVNTl9NQVBQSU5HX19DT0xVTU47Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXJyYXlfMl8zLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19EQVRBQkFTRV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfQVJSQVlfMjNfX0RBVEFCQVNFX1RZUEU7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19UQVJHRVRfQ0xBU1M6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9BUlJBWV8yM19fVEFSR0VUX0NMQVNTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fQ09OVkVSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fQ09OVkVSVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19BVFRSSUJVVEVfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX1NUUlVDVF9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fU1RSVUNUX0NPTlZFUlRFUlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0xPQjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0xPQjsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX1RFTVBPUkFMOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fVEVNUE9SQUw7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19FTlVNRVJBVEVEOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fRU5VTUVSQVRFRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBDb2x1bW5NYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLkNPTFVNTl9NQVBQSU5HX19DT0xVTU46IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FSUkFZX19DT0xVTU47Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXJyYXlfMl8zLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9BUlJBWV8yM19fREFUQUJBU0VfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVJSQVlfX0RBVEFCQVNFX1RZUEU7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9BUlJBWV8yM19fVEFSR0VUX0NMQVNTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fVEFSR0VUX0NMQVNTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19DT05WRVJUOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BUlJBWV9fQ09OVkVSVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF0dHJpYnV0ZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF0dHJpYnV0ZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxvYjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobG9iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0ZW1wb3JhbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGVtcG9yYWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVudW1lcmF0ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVudW1lcmF0ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRhdGFiYXNlVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGF0YWJhc2VUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0YXJnZXRDbGFzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGFyZ2V0Q2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbnZlcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbnZlcnQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLkFSUkFZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEVudW1lcmF0ZWRUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLkVOVU1FUkFURUQpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TG9iVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5MT0IpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRlbXBvcmFsVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5URU1QT1JBTCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRDb252ZXJ0VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZShFY2xpcHNlTGluay5DT05WRVJUKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEF0dHJpYnV0ZVR5cGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsyXzEuQVRUUklCVVRFX1RZUEUpOwotCX0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBcnJheSgpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRGF0YWJhc2VUeXBlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUYXJnZXRDbGFzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb2x1bW5UcmFuc2xhdG9yKCksIAotCQkJYnVpbGRUZW1wb3JhbFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRW51bWVyYXRlZFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTG9iVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb252ZXJ0VHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb2x1bW5UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihKUEEuQ09MVU1OLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb2x1bW5NYXBwaW5nX0NvbHVtbigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVGVtcG9yYWxUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLlRFTVBPUkFMLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfVGVtcG9yYWwoKSk7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFbnVtZXJhdGVkVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5FTlVNRVJBVEVELCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfRW51bWVyYXRlZCgpKTsKLQl9CQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZExvYlRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihKUEEuTE9CLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfTG9iKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbnZlcnRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfQ29udmVydCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9Db252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9UeXBlQ29udmVydGVycygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxPYmplY3RUeXBlQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX09iamVjdFR5cGVDb252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sU3RydWN0Q29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9TdHJ1Y3RDb252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxQcm9wZXJ0eS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NNZXRob2RzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGF0YWJhc2VUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8zLkFSUkFZX19EQVRBQkFTRV9UWVBFLCBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBcnJheV8yXzNfRGF0YWJhc2VUeXBlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVGFyZ2V0Q2xhc3NUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzMuQVJSQVlfX1RBUkdFVF9DTEFTUywgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQXJyYXlfMl8zX1RhcmdldENsYXNzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQXR0cmlidXRlVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMy5BUlJBWV9fQVRUUklCVVRFX1RZUEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19BdHRyaWJ1dGVUeXBlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiogY29udGVudCBhc3Npc3QgKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRDb252ZXJ0Q29kZUFzc2lzdFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRDb2RlQXNzaXN0VGV4dFJhbmdlKEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnZlcnRUb3VjaGVzKGludCBwb3MpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2V0Q29udmVydENvZGVBc3Npc3RUZXh0UmFuZ2UoKTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgJiYgKHRleHRSYW5nZS50b3VjaGVzKHBvcykpOwotCX0KLX0gLy8gWG1sQXJyYXkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxBdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTlmNTk1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQXR0cmlidXRlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZyNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQXR0cmlidXRlTWFwcGluZyAKLQlleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZywgCi0JCQlYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLCBYbWxQcm9wZXJ0eUNvbnRhaW5lcgotewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU1hcHBpbmdfQXR0cmlidXRlVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0cmlidXRlVHlwZShTdHJpbmcgdmFsdWUpOwotCi0JVGV4dFJhbmdlIGdldEF0dHJpYnV0ZVR5cGVUZXh0UmFuZ2UoKTsKLQotfSAvLyBYbWxBdHRyaWJ1dGVNYXBwaW5nCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmFzaWMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNpYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGZkYWMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNpYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxCYXNpY18xXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXNpY18yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEluZGV4XzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmsyXzQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbEJhc2ljXzJfNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sQ2FjaGVJbmRleF8yXzQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQmFzaWM8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhc2ljKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEJhc2ljIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyBpbXBsZW1lbnRzIFhtbEJhc2ljXzFfMSwgWG1sQmFzaWNfMl8xLCBYbWxCYXNpY18yXzIsIFhtbEJhc2ljXzJfNCwgWG1sQXR0cmlidXRlTWFwcGluZywgWG1sTXV0YWJsZSwgWG1sQ29udmVydGlibGVNYXBwaW5nLCBYbWxDb252ZXJ0ZXJDb250YWluZXIKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXF1ZW5jZUdlbmVyYXRvcigpIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3I7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFibGVHZW5lcmF0b3IoKSA8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWJsZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdlbmVyYXRlZFZhbHVlKCkgPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R2VuZXJhdGVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJldHVybkluc2VydCgpIDxlbT5SZXR1cm4gSW5zZXJ0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXR1cm5JbnNlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxSZXR1cm5JbnNlcnQgcmV0dXJuSW5zZXJ0OwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXR1cm5VcGRhdGUoKSA8ZW0+UmV0dXJuIFVwZGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmV0dXJuVXBkYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gUkVUVVJOX1VQREFURV9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmV0dXJuVXBkYXRlKCkgPGVtPlJldHVybiBVcGRhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJldHVyblVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gcmV0dXJuVXBkYXRlID0gUkVUVVJOX1VQREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluZGV4KCkgPGVtPkluZGV4PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEluZGV4XzJfMiBpbmRleDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWNoZUluZGV4KCkgPGVtPkNhY2hlIEluZGV4PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWNoZUluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2FjaGVJbmRleF8yXzQgY2FjaGVJbmRleDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZVR5cGUgPSBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TXV0YWJsZSgpIDxlbT5NdXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNdXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gTVVUQUJMRV9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TXV0YWJsZSgpIDxlbT5NdXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNdXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBtdXRhYmxlID0gTVVUQUJMRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydCgpIDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJUX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0KCkgPGVtPkNvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydCA9IENPTlZFUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0ZXJzKCkgPGVtPkNvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbENvbnZlcnRlcj4gY29udmVydGVyczsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlQ29udmVydGVycygpIDxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxUeXBlQ29udmVydGVyPiB0eXBlQ29udmVydGVyczsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlQ29udmVydGVycygpIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RydWN0Q29udmVydGVycygpIDxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPiBzdHJ1Y3RDb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEJhc2ljKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQkFTSUM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TXV0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TXV0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NdXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNdXRhYmxlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNdXRhYmxlX011dGFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldE11dGFibGUoKQotCXsKLQkJcmV0dXJuIG11dGFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRNdXRhYmxlIDxlbT5NdXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NdXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNdXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TXV0YWJsZShCb29sZWFuIG5ld011dGFibGUpCi0JewotCQlCb29sZWFuIG9sZE11dGFibGUgPSBtdXRhYmxlOwotCQltdXRhYmxlID0gbmV3TXV0YWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fTVVUQUJMRSwgb2xkTXV0YWJsZSwgbXV0YWJsZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29udmVydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfQ29udmVydCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnQoKQotCXsKLQkJcmV0dXJuIGNvbnZlcnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRDb252ZXJ0IDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udmVydChTdHJpbmcgbmV3Q29udmVydCkKLQl7Ci0JCVN0cmluZyBvbGRDb252ZXJ0ID0gY29udmVydDsKLQkJY29udmVydCA9IG5ld0NvbnZlcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTlZFUlQsIG9sZENvbnZlcnQsIGNvbnZlcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmIChjb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCWNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQ29udmVydGVyPihYbWxDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiBjb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfVHlwZUNvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+IGdldFR5cGVDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmICh0eXBlQ29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQl0eXBlQ29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxUeXBlQ29udmVydGVyPihYbWxUeXBlQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UWVBFX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiB0eXBlQ29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX09iamVjdFR5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPiBnZXRPYmplY3RUeXBlQ29udmVydGVycygpCi0JewotCQlpZiAob2JqZWN0VHlwZUNvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJb2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4oWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckNvbnRhaW5lcl9TdHJ1Y3RDb252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+IGdldFN0cnVjdENvbnZlcnRlcnMoKQotCXsKLQkJaWYgKHN0cnVjdENvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJc3RydWN0Q29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+KFhtbFN0cnVjdENvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU1RSVUNUX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JDb250YWluZXJfU2VxdWVuY2VHZW5lcmF0b3IoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFNlcXVlbmNlR2VuZXJhdG9yIGdldFNlcXVlbmNlR2VuZXJhdG9yKCkKLQl7Ci0JCXJldHVybiBzZXF1ZW5jZUdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvciBuZXdTZXF1ZW5jZUdlbmVyYXRvciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIG9sZFNlcXVlbmNlR2VuZXJhdG9yID0gc2VxdWVuY2VHZW5lcmF0b3I7Ci0JCXNlcXVlbmNlR2VuZXJhdG9yID0gbmV3U2VxdWVuY2VHZW5lcmF0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NFUVVFTkNFX0dFTkVSQVRPUiwgb2xkU2VxdWVuY2VHZW5lcmF0b3IsIG5ld1NlcXVlbmNlR2VuZXJhdG9yKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldFNlcXVlbmNlR2VuZXJhdG9yIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvciBuZXdTZXF1ZW5jZUdlbmVyYXRvcikKLQl7Ci0JCWlmIChuZXdTZXF1ZW5jZUdlbmVyYXRvciAhPSBzZXF1ZW5jZUdlbmVyYXRvcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc2VxdWVuY2VHZW5lcmF0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc2VxdWVuY2VHZW5lcmF0b3IpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TRVFVRU5DRV9HRU5FUkFUT1IsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1NlcXVlbmNlR2VuZXJhdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1NlcXVlbmNlR2VuZXJhdG9yKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU0VRVUVOQ0VfR0VORVJBVE9SLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFNlcXVlbmNlR2VuZXJhdG9yKG5ld1NlcXVlbmNlR2VuZXJhdG9yLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NFUVVFTkNFX0dFTkVSQVRPUiwgbmV3U2VxdWVuY2VHZW5lcmF0b3IsIG5ld1NlcXVlbmNlR2VuZXJhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvckNvbnRhaW5lcl9UYWJsZUdlbmVyYXRvcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVGFibGVHZW5lcmF0b3IgZ2V0VGFibGVHZW5lcmF0b3IoKQotCXsKLQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yIG5ld1RhYmxlR2VuZXJhdG9yLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sVGFibGVHZW5lcmF0b3Igb2xkVGFibGVHZW5lcmF0b3IgPSB0YWJsZUdlbmVyYXRvcjsKLQkJdGFibGVHZW5lcmF0b3IgPSBuZXdUYWJsZUdlbmVyYXRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEFCTEVfR0VORVJBVE9SLCBvbGRUYWJsZUdlbmVyYXRvciwgbmV3VGFibGVHZW5lcmF0b3IpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0VGFibGVHZW5lcmF0b3IgPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRUYWJsZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yIG5ld1RhYmxlR2VuZXJhdG9yKQotCXsKLQkJaWYgKG5ld1RhYmxlR2VuZXJhdG9yICE9IHRhYmxlR2VuZXJhdG9yKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh0YWJsZUdlbmVyYXRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0YWJsZUdlbmVyYXRvcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RBQkxFX0dFTkVSQVRPUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VGFibGVHZW5lcmF0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VGFibGVHZW5lcmF0b3IpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UQUJMRV9HRU5FUkFUT1IsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VGFibGVHZW5lcmF0b3IobmV3VGFibGVHZW5lcmF0b3IsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEFCTEVfR0VORVJBVE9SLCBuZXdUYWJsZUdlbmVyYXRvciwgbmV3VGFibGVHZW5lcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HZW5lcmF0ZWQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEdlbmVyYXRlZFZhbHVlKFhtbEdlbmVyYXRlZFZhbHVlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWNfMV8xX0dlbmVyYXRlZFZhbHVlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxHZW5lcmF0ZWRWYWx1ZSBnZXRHZW5lcmF0ZWRWYWx1ZSgpCi0JewotCQlyZXR1cm4gZ2VuZXJhdGVkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0R2VuZXJhdGVkVmFsdWUoWG1sR2VuZXJhdGVkVmFsdWUgbmV3R2VuZXJhdGVkVmFsdWUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxHZW5lcmF0ZWRWYWx1ZSBvbGRHZW5lcmF0ZWRWYWx1ZSA9IGdlbmVyYXRlZFZhbHVlOwotCQlnZW5lcmF0ZWRWYWx1ZSA9IG5ld0dlbmVyYXRlZFZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19HRU5FUkFURURfVkFMVUUsIG9sZEdlbmVyYXRlZFZhbHVlLCBuZXdHZW5lcmF0ZWRWYWx1ZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRHZW5lcmF0ZWRWYWx1ZSA8ZW0+R2VuZXJhdGVkIFZhbHVlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEdlbmVyYXRlZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdGVkVmFsdWUoWG1sR2VuZXJhdGVkVmFsdWUgbmV3R2VuZXJhdGVkVmFsdWUpCi0JewotCQlpZiAobmV3R2VuZXJhdGVkVmFsdWUgIT0gZ2VuZXJhdGVkVmFsdWUpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGdlbmVyYXRlZFZhbHVlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWdlbmVyYXRlZFZhbHVlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fR0VORVJBVEVEX1ZBTFVFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdHZW5lcmF0ZWRWYWx1ZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdHZW5lcmF0ZWRWYWx1ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0dFTkVSQVRFRF9WQUxVRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRHZW5lcmF0ZWRWYWx1ZShuZXdHZW5lcmF0ZWRWYWx1ZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19HRU5FUkFURURfVkFMVUUsIG5ld0dlbmVyYXRlZFZhbHVlLCBuZXdHZW5lcmF0ZWRWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJldHVybiBJbnNlcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJldHVybiBJbnNlcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJuIEluc2VydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmV0dXJuSW5zZXJ0KFhtbFJldHVybkluc2VydCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhc2ljXzJfMV9SZXR1cm5JbnNlcnQoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJldHVybkluc2VydCBnZXRSZXR1cm5JbnNlcnQoKQotCXsKLQkJcmV0dXJuIHJldHVybkluc2VydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZXR1cm5JbnNlcnQoWG1sUmV0dXJuSW5zZXJ0IG5ld1JldHVybkluc2VydCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFJldHVybkluc2VydCBvbGRSZXR1cm5JbnNlcnQgPSByZXR1cm5JbnNlcnQ7Ci0JCXJldHVybkluc2VydCA9IG5ld1JldHVybkluc2VydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fUkVUVVJOX0lOU0VSVCwgb2xkUmV0dXJuSW5zZXJ0LCBuZXdSZXR1cm5JbnNlcnQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0UmV0dXJuSW5zZXJ0IDxlbT5SZXR1cm4gSW5zZXJ0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXR1cm4gSW5zZXJ0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSZXR1cm5JbnNlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXR1cm5JbnNlcnQoWG1sUmV0dXJuSW5zZXJ0IG5ld1JldHVybkluc2VydCkKLQl7Ci0JCWlmIChuZXdSZXR1cm5JbnNlcnQgIT0gcmV0dXJuSW5zZXJ0KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyZXR1cm5JbnNlcnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmV0dXJuSW5zZXJ0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fUkVUVVJOX0lOU0VSVCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmV0dXJuSW5zZXJ0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JldHVybkluc2VydCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9JTlNFUlQsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmV0dXJuSW5zZXJ0KG5ld1JldHVybkluc2VydCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19SRVRVUk5fSU5TRVJULCBuZXdSZXR1cm5JbnNlcnQsIG5ld1JldHVybkluc2VydCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJldHVybiBVcGRhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJldHVybiBVcGRhdGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJuIFVwZGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmV0dXJuVXBkYXRlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXNpY18yXzFfUmV0dXJuVXBkYXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRSZXR1cm5VcGRhdGUoKQotCXsKLQkJcmV0dXJuIHJldHVyblVwZGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldFJldHVyblVwZGF0ZSA8ZW0+UmV0dXJuIFVwZGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJuIFVwZGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmV0dXJuVXBkYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmV0dXJuVXBkYXRlKEJvb2xlYW4gbmV3UmV0dXJuVXBkYXRlKQotCXsKLQkJQm9vbGVhbiBvbGRSZXR1cm5VcGRhdGUgPSByZXR1cm5VcGRhdGU7Ci0JCXJldHVyblVwZGF0ZSA9IG5ld1JldHVyblVwZGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fUkVUVVJOX1VQREFURSwgb2xkUmV0dXJuVXBkYXRlLCByZXR1cm5VcGRhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgpCi0JewotCQlyZXR1cm4gYXR0cmlidXRlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIG5ld0F0dHJpYnV0ZVR5cGUpCi0JewotCQlTdHJpbmcgb2xkQXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGU7Ci0JCWF0dHJpYnV0ZVR5cGUgPSBuZXdBdHRyaWJ1dGVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BVFRSSUJVVEVfVFlQRSwgb2xkQXR0cmlidXRlVHlwZSwgYXR0cmlidXRlVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SW5kZXgoWG1sSW5kZXhfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWNfMl8yX0luZGV4KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxJbmRleF8yXzIgZ2V0SW5kZXgoKQotCXsKLQkJcmV0dXJuIGluZGV4OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEluZGV4KFhtbEluZGV4XzJfMiBuZXdJbmRleCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEluZGV4XzJfMiBvbGRJbmRleCA9IGluZGV4OwotCQlpbmRleCA9IG5ld0luZGV4OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19JTkRFWCwgb2xkSW5kZXgsIG5ld0luZGV4KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldEluZGV4IDxlbT5JbmRleDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5kZXgoWG1sSW5kZXhfMl8yIG5ld0luZGV4KQotCXsKLQkJaWYgKG5ld0luZGV4ICE9IGluZGV4KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChpbmRleCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbmRleCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0lOREVYLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdJbmRleCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJbmRleCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0lOREVYLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEluZGV4KG5ld0luZGV4LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0lOREVYLCBuZXdJbmRleCwgbmV3SW5kZXgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWNoZSBJbmRleDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FjaGUgSW5kZXg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgSW5kZXg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENhY2hlSW5kZXgoWG1sQ2FjaGVJbmRleF8yXzQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXNpY18yXzRfQ2FjaGVJbmRleCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ2FjaGVJbmRleF8yXzQgZ2V0Q2FjaGVJbmRleCgpCi0JewotCQlyZXR1cm4gY2FjaGVJbmRleDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDYWNoZUluZGV4KFhtbENhY2hlSW5kZXhfMl80IG5ld0NhY2hlSW5kZXgsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDYWNoZUluZGV4XzJfNCBvbGRDYWNoZUluZGV4ID0gY2FjaGVJbmRleDsKLQkJY2FjaGVJbmRleCA9IG5ld0NhY2hlSW5kZXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NBQ0hFX0lOREVYLCBvbGRDYWNoZUluZGV4LCBuZXdDYWNoZUluZGV4KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldENhY2hlSW5kZXggPGVtPkNhY2hlIEluZGV4PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZSBJbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2FjaGVJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhY2hlSW5kZXgoWG1sQ2FjaGVJbmRleF8yXzQgbmV3Q2FjaGVJbmRleCkKLQl7Ci0JCWlmIChuZXdDYWNoZUluZGV4ICE9IGNhY2hlSW5kZXgpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNhY2hlSW5kZXggIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY2FjaGVJbmRleCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NBQ0hFX0lOREVYLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDYWNoZUluZGV4ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NhY2hlSW5kZXgpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DQUNIRV9JTkRFWCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDYWNoZUluZGV4KG5ld0NhY2hlSW5kZXgsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ0FDSEVfSU5ERVgsIG5ld0NhY2hlSW5kZXgsIG5ld0NhY2hlSW5kZXgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKLQkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQotCXsKLQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQotCXsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TRVFVRU5DRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U2VxdWVuY2VHZW5lcmF0b3IobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RBQkxFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRUYWJsZUdlbmVyYXRvcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fR0VORVJBVEVEX1ZBTFVFOgotCQkJCXJldHVybiBiYXNpY1NldEdlbmVyYXRlZFZhbHVlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19SRVRVUk5fSU5TRVJUOgotCQkJCXJldHVybiBiYXNpY1NldFJldHVybkluc2VydChudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fSU5ERVg6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SW5kZXgobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NBQ0hFX0lOREVYOgotCQkJCXJldHVybiBiYXNpY1NldENhY2hlSW5kZXgobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBiYXNpY1NldEFjY2Vzc01ldGhvZHMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRUeXBlQ29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRPYmplY3RUeXBlQ29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3RydWN0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TRVFVRU5DRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIGdldFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RBQkxFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gZ2V0VGFibGVHZW5lcmF0b3IoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fR0VORVJBVEVEX1ZBTFVFOgotCQkJCXJldHVybiBnZXRHZW5lcmF0ZWRWYWx1ZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19SRVRVUk5fSU5TRVJUOgotCQkJCXJldHVybiBnZXRSZXR1cm5JbnNlcnQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fUkVUVVJOX1VQREFURToKLQkJCQlyZXR1cm4gZ2V0UmV0dXJuVXBkYXRlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0lOREVYOgotCQkJCXJldHVybiBnZXRJbmRleCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DQUNIRV9JTkRFWDoKLQkJCQlyZXR1cm4gZ2V0Q2FjaGVJbmRleCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVUeXBlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX01VVEFCTEU6Ci0JCQkJcmV0dXJuIGdldE11dGFibGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09OVkVSVDoKLQkJCQlyZXR1cm4gZ2V0Q29udmVydCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0VHlwZUNvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldFN0cnVjdENvbnZlcnRlcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlzZXRTZXF1ZW5jZUdlbmVyYXRvcigoWG1sU2VxdWVuY2VHZW5lcmF0b3IpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEFCTEVfR0VORVJBVE9SOgotCQkJCXNldFRhYmxlR2VuZXJhdG9yKChYbWxUYWJsZUdlbmVyYXRvciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19HRU5FUkFURURfVkFMVUU6Ci0JCQkJc2V0R2VuZXJhdGVkVmFsdWUoKFhtbEdlbmVyYXRlZFZhbHVlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9JTlNFUlQ6Ci0JCQkJc2V0UmV0dXJuSW5zZXJ0KChYbWxSZXR1cm5JbnNlcnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fUkVUVVJOX1VQREFURToKLQkJCQlzZXRSZXR1cm5VcGRhdGUoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fSU5ERVg6Ci0JCQkJc2V0SW5kZXgoKFhtbEluZGV4XzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DQUNIRV9JTkRFWDoKLQkJCQlzZXRDYWNoZUluZGV4KChYbWxDYWNoZUluZGV4XzJfNCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19NVVRBQkxFOgotCQkJCXNldE11dGFibGUoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09OVkVSVDoKLQkJCQlzZXRDb252ZXJ0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09OVkVSVEVSUzoKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFR5cGVDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxPYmplY3RUeXBlQ29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxTdHJ1Y3RDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlzZXRTZXF1ZW5jZUdlbmVyYXRvcigoWG1sU2VxdWVuY2VHZW5lcmF0b3IpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJc2V0VGFibGVHZW5lcmF0b3IoKFhtbFRhYmxlR2VuZXJhdG9yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fR0VORVJBVEVEX1ZBTFVFOgotCQkJCXNldEdlbmVyYXRlZFZhbHVlKChYbWxHZW5lcmF0ZWRWYWx1ZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9JTlNFUlQ6Ci0JCQkJc2V0UmV0dXJuSW5zZXJ0KChYbWxSZXR1cm5JbnNlcnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19SRVRVUk5fVVBEQVRFOgotCQkJCXNldFJldHVyblVwZGF0ZShSRVRVUk5fVVBEQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0lOREVYOgotCQkJCXNldEluZGV4KChYbWxJbmRleF8yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DQUNIRV9JTkRFWDoKLQkJCQlzZXRDYWNoZUluZGV4KChYbWxDYWNoZUluZGV4XzJfNCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQVRUUklCVVRFX1RZUEU6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZShBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19NVVRBQkxFOgotCQkJCXNldE11dGFibGUoTVVUQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJUOgotCQkJCXNldENvbnZlcnQoQ09OVkVSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVJTOgotCQkJCWdldENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU0VRVUVOQ0VfR0VORVJBVE9SOgotCQkJCXJldHVybiBzZXF1ZW5jZUdlbmVyYXRvciAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9yICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0dFTkVSQVRFRF9WQUxVRToKLQkJCQlyZXR1cm4gZ2VuZXJhdGVkVmFsdWUgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fUkVUVVJOX0lOU0VSVDoKLQkJCQlyZXR1cm4gcmV0dXJuSW5zZXJ0ICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9VUERBVEU6Ci0JCQkJcmV0dXJuIFJFVFVSTl9VUERBVEVfRURFRkFVTFQgPT0gbnVsbCA/IHJldHVyblVwZGF0ZSAhPSBudWxsIDogIVJFVFVSTl9VUERBVEVfRURFRkFVTFQuZXF1YWxzKHJldHVyblVwZGF0ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0lOREVYOgotCQkJCXJldHVybiBpbmRleCAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DQUNIRV9JTkRFWDoKLQkJCQlyZXR1cm4gY2FjaGVJbmRleCAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGF0dHJpYnV0ZVR5cGUgIT0gbnVsbCA6ICFBVFRSSUJVVEVfVFlQRV9FREVGQVVMVC5lcXVhbHMoYXR0cmlidXRlVHlwZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX01VVEFCTEU6Ci0JCQkJcmV0dXJuIE1VVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IG11dGFibGUgIT0gbnVsbCA6ICFNVVRBQkxFX0VERUZBVUxULmVxdWFscyhtdXRhYmxlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09OVkVSVDoKLQkJCQlyZXR1cm4gQ09OVkVSVF9FREVGQVVMVCA9PSBudWxsID8gY29udmVydCAhPSBudWxsIDogIUNPTlZFUlRfRURFRkFVTFQuZXF1YWxzKGNvbnZlcnQpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVJTOgotCQkJCXJldHVybiBjb252ZXJ0ZXJzICE9IG51bGwgJiYgIWNvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhb2JqZWN0VHlwZUNvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gc3RydWN0Q29udmVydGVycyAhPSBudWxsICYmICFzdHJ1Y3RDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sR2VuZXJhdG9yQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TRVFVRU5DRV9HRU5FUkFUT1I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSX19TRVFVRU5DRV9HRU5FUkFUT1I7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UQUJMRV9HRU5FUkFUT1I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSX19UQUJMRV9HRU5FUkFUT1I7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQmFzaWNfMV8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19HRU5FUkFURURfVkFMVUU6IHJldHVybiBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLlhNTF9CQVNJQ18xMV9fR0VORVJBVEVEX1ZBTFVFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEJhc2ljXzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fUkVUVVJOX0lOU0VSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0JBU0lDXzIxX19SRVRVUk5fSU5TRVJUOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fUkVUVVJOX1VQREFURTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0JBU0lDXzIxX19SRVRVUk5fVVBEQVRFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEJhc2ljXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fSU5ERVg6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9CQVNJQ18yMl9fSU5ERVg7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQmFzaWNfMl80LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DQUNIRV9JTkRFWDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UuWE1MX0JBU0lDXzI0X19DQUNIRV9JTkRFWDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FUVFJJQlVURV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTXV0YWJsZS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fTVVUQUJMRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTVVUQUJMRV9fTVVUQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTlZFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0NPTlZFUlQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVyQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU1RSVUNUX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX1NUUlVDVF9DT05WRVJURVJTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sR2VuZXJhdG9yQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSX19TRVFVRU5DRV9HRU5FUkFUT1I6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TRVFVRU5DRV9HRU5FUkFUT1I7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSX19UQUJMRV9HRU5FUkFUT1I6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UQUJMRV9HRU5FUkFUT1I7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQmFzaWNfMV8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLlhNTF9CQVNJQ18xMV9fR0VORVJBVEVEX1ZBTFVFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fR0VORVJBVEVEX1ZBTFVFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEJhc2ljXzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfQkFTSUNfMjFfX1JFVFVSTl9JTlNFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19SRVRVUk5fSU5TRVJUOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfQkFTSUNfMjFfX1JFVFVSTl9VUERBVEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19SRVRVUk5fVVBEQVRFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEJhc2ljXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfQkFTSUNfMjJfX0lOREVYOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fSU5ERVg7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQmFzaWNfMl80LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLlhNTF9CQVNJQ18yNF9fQ0FDSEVfSU5ERVg6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DQUNIRV9JTkRFWDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FUVFJJQlVURV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTXV0YWJsZS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NVVRBQkxFX19NVVRBQkxFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fTVVUQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fQ09OVkVSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTlZFUlQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVyQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19TVFJVQ1RfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NUUlVDVF9DT05WRVJURVJTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmV0dXJuVXBkYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXR1cm5VcGRhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF0dHJpYnV0ZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF0dHJpYnV0ZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG11dGFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG11dGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbnZlcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbnZlcnQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE11dGFibGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuTVVUQUJMRSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29udmVydFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuQ09OVkVSVCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRBdHRyaWJ1dGVUeXBlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEVjbGlwc2VMaW5rMl8xLkFUVFJJQlVURV9UWVBFKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxCYXNpYygpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRGZXRjaFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkT3B0aW9uYWxUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTXV0YWJsZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXR0cmlidXRlVHlwZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29sdW1uVHJhbnNsYXRvcigpLCAKLQkJCWJ1aWxkSW5kZXhUcmFuc2xhdG9yKCksIAotCQkJYnVpbGRDYWNoZUluZGV4VHJhbnNsYXRvcigpLCAKLQkJCWJ1aWxkR2VuZXJhdGVkVmFsdWVUcmFuc2xhdG9yKCksIAotCQkJYnVpbGRMb2JUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRlbXBvcmFsVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFbnVtZXJhdGVkVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb252ZXJ0VHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVGFibGVHZW5lcmF0b3JUcmFuc2xhdG9yKCksCi0JCQlidWlsZFNlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUmV0dXJuSW5zZXJ0VHJhbnNsYXRvcigpLAotCQkJYnVpbGRSZXR1cm5VcGRhdGVUcmFuc2xhdG9yKCl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNdXRhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk1VVEFCTEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTXV0YWJsZV9NdXRhYmxlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSW5kZXhUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sSW5kZXguYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLklOREVYLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxCYXNpY18yXzJfSW5kZXgoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2FjaGVJbmRleFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDYWNoZUluZGV4LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfNC5DQUNIRV9JTkRFWCwgRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfMl80X0NhY2hlSW5kZXgoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEdlbmVyYXRlZFZhbHVlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEdlbmVyYXRlZFZhbHVlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazFfMS5HRU5FUkFURURfVkFMVUUsIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhc2ljXzFfMV9HZW5lcmF0ZWRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29udmVydFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Db252ZXJ0KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX0NvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sVHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1R5cGVDb252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxTdHJ1Y3RDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1N0cnVjdENvbnZlcnRlcnMoKSk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUYWJsZUdlbmVyYXRvclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazFfMS5UQUJMRV9HRU5FUkFUT1IsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEdlbmVyYXRvckNvbnRhaW5lcl9UYWJsZUdlbmVyYXRvcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sU2VxdWVuY2VHZW5lcmF0b3IuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMV8xLlNFUVVFTkNFX0dFTkVSQVRPUiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1NlcXVlbmNlR2VuZXJhdG9yKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxQcm9wZXJ0eS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NNZXRob2RzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFJldHVybkluc2VydFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxSZXR1cm5JbnNlcnQuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLlJFVFVSTl9JTlNFUlQsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhc2ljXzJfMV9SZXR1cm5JbnNlcnQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFJldHVyblVwZGF0ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5SRVRVUk5fVVBEQVRFLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxCYXNpY18yXzFfUmV0dXJuVXBkYXRlKCkpOwkKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkFUVFJJQlVURV9UWVBFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmdfQXR0cmlidXRlVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCS8vICoqKioqKioqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqKioqKioqKgotCQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0Q29udmVydENvZGVBc3Npc3RUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50Q29kZUFzc2lzdFRleHRSYW5nZShFY2xpcHNlTGluay5DT05WRVJUKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb252ZXJ0VG91Y2hlcyhpbnQgcG9zKSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldENvbnZlcnRDb2RlQXNzaXN0VGV4dFJhbmdlKCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpICYmICh0ZXh0UmFuZ2UudG91Y2hlcyhwb3MpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmFzaWNDb2xsZWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmFzaWNDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3Y2M4YTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2ljQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGluazJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQmFzaWNDb2xsZWN0aW9uXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQmFzaWMgQ29sbGVjdGlvbiBJbXBsPC9iPjwvZW0+Jy4KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4gKgotICoKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhc2ljQ29sbGVjdGlvbigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxCYXNpY0NvbGxlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50cyBYbWxBdHRyaWJ1dGVNYXBwaW5nLCBYbWxCYXNpY0NvbGxlY3Rpb25fMl8yCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdHRyaWJ1dGVUeXBlID0gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBDQVNDQURFX09OX0RFTEVURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXNjYWRlT25EZWxldGUoKSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhc2NhZGVPbkRlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gY2FzY2FkZU9uRGVsZXRlID0gQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQmFzaWNDb2xsZWN0aW9uKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQkFTSUNfQ09MTEVDVElPTjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7Ci0JCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljQ29sbGVjdGlvbiNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKLQl7Ci0JCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXR0cmlidXRlVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX0F0dHJpYnV0ZVR5cGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKCkKLQl7Ci0JCXJldHVybiBhdHRyaWJ1dGVUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9uI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIG5ld0F0dHJpYnV0ZVR5cGUpCi0JewotCQlTdHJpbmcgb2xkQXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGU7Ci0JCWF0dHJpYnV0ZVR5cGUgPSBuZXdBdHRyaWJ1dGVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX0FUVFJJQlVURV9UWVBFLCBvbGRBdHRyaWJ1dGVUeXBlLCBhdHRyaWJ1dGVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlT25EZWxldGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhc2ljQ29sbGVjdGlvbl8yXzJfQ2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRDYXNjYWRlT25EZWxldGUoKQotCXsKLQkJcmV0dXJuIGNhc2NhZGVPbkRlbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljQ29sbGVjdGlvbiNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4gbmV3Q2FzY2FkZU9uRGVsZXRlKQotCXsKLQkJQm9vbGVhbiBvbGRDYXNjYWRlT25EZWxldGUgPSBjYXNjYWRlT25EZWxldGU7Ci0JCWNhc2NhZGVPbkRlbGV0ZSA9IG5ld0Nhc2NhZGVPbkRlbGV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19DQVNDQURFX09OX0RFTEVURSwgb2xkQ2FzY2FkZU9uRGVsZXRlLCBjYXNjYWRlT25EZWxldGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZVR5cGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19DQVNDQURFX09OX0RFTEVURToKLQkJCQlyZXR1cm4gZ2V0Q2FzY2FkZU9uRGVsZXRlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX0NBU0NBREVfT05fREVMRVRFOgotCQkJCXNldENhc2NhZGVPbkRlbGV0ZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoQVRUUklCVVRFX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19DQVNDQURFX09OX0RFTEVURToKLQkJCQlzZXRDYXNjYWRlT25EZWxldGUoQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGFjY2Vzc01ldGhvZHMgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gYXR0cmlidXRlVHlwZSAhPSBudWxsIDogIUFUVFJJQlVURV9UWVBFX0VERUZBVUxULmVxdWFscyhhdHRyaWJ1dGVUeXBlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19DQVNDQURFX09OX0RFTEVURToKLQkJCQlyZXR1cm4gQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNhc2NhZGVPbkRlbGV0ZSAhPSBudWxsIDogIUNBU0NBREVfT05fREVMRVRFX0VERUZBVUxULmVxdWFscyhjYXNjYWRlT25EZWxldGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX0FUVFJJQlVURV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQmFzaWNDb2xsZWN0aW9uXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19DQVNDQURFX09OX0RFTEVURTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fMjJfX0NBU0NBREVfT05fREVMRVRFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEJhc2ljQ29sbGVjdGlvbl8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fMjJfX0NBU0NBREVfT05fREVMRVRFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19DQVNDQURFX09OX0RFTEVURTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF0dHJpYnV0ZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF0dHJpYnV0ZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhc2NhZGVPbkRlbGV0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2FzY2FkZU9uRGVsZXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5CQVNJQ19DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEF0dHJpYnV0ZVR5cGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsyXzEuQVRUUklCVVRFX1RZUEUpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNpY01hcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2ljTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOTEwNjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2ljTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY01hcF8yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEJhc2ljIE1hcCBJbXBsPC9iPjwvZW0+Jy4KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4gKgotICoKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhc2ljTWFwKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEJhc2ljTWFwIGV4dGVuZHMgQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudHMgWG1sQXR0cmlidXRlTWFwcGluZywgWG1sQmFzaWNNYXBfMl8yCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdHRyaWJ1dGVUeXBlID0gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBDQVNDQURFX09OX0RFTEVURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXNjYWRlT25EZWxldGUoKSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhc2NhZGVPbkRlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gY2FzY2FkZU9uRGVsZXRlID0gQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQmFzaWNNYXAoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9CQVNJQ19NQVA7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOwotCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQotCXsKLQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQotCXsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgpCi0JewotCQlyZXR1cm4gYXR0cmlidXRlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIG5ld0F0dHJpYnV0ZVR5cGUpCi0JewotCQlTdHJpbmcgb2xkQXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGU7Ci0JCWF0dHJpYnV0ZVR5cGUgPSBuZXdBdHRyaWJ1dGVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQVRUUklCVVRFX1RZUEUsIG9sZEF0dHJpYnV0ZVR5cGUsIGF0dHJpYnV0ZVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlIE9uIERlbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhc2NhZGVPbkRlbGV0ZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWNNYXBfMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQl7Ci0JCXJldHVybiBjYXNjYWRlT25EZWxldGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcCNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4gbmV3Q2FzY2FkZU9uRGVsZXRlKQotCXsKLQkJQm9vbGVhbiBvbGRDYXNjYWRlT25EZWxldGUgPSBjYXNjYWRlT25EZWxldGU7Ci0JCWNhc2NhZGVPbkRlbGV0ZSA9IG5ld0Nhc2NhZGVPbkRlbGV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX0NBU0NBREVfT05fREVMRVRFLCBvbGRDYXNjYWRlT25EZWxldGUsIGNhc2NhZGVPbkRlbGV0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZVR5cGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX0NBU0NBREVfT05fREVMRVRFOgotCQkJCXJldHVybiBnZXRDYXNjYWRlT25EZWxldGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19DQVNDQURFX09OX0RFTEVURToKLQkJCQlzZXRDYXNjYWRlT25EZWxldGUoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKEFUVFJJQlVURV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19DQVNDQURFX09OX0RFTEVURToKLQkJCQlzZXRDYXNjYWRlT25EZWxldGUoQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gcHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gYXR0cmlidXRlVHlwZSAhPSBudWxsIDogIUFUVFJJQlVURV9UWVBFX0VERUZBVUxULmVxdWFscyhhdHRyaWJ1dGVUeXBlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX0NBU0NBREVfT05fREVMRVRFOgotCQkJCXJldHVybiBDQVNDQURFX09OX0RFTEVURV9FREVGQVVMVCA9PSBudWxsID8gY2FzY2FkZU9uRGVsZXRlICE9IG51bGwgOiAhQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQuZXF1YWxzKGNhc2NhZGVPbkRlbGV0ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BVFRSSUJVVEVfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXNpY01hcF8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19DQVNDQURFX09OX0RFTEVURTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0JBU0lDX01BUF8yMl9fQ0FTQ0FERV9PTl9ERUxFVEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQmFzaWNNYXBfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9CQVNJQ19NQVBfMjJfX0NBU0NBREVfT05fREVMRVRFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX0NBU0NBREVfT05fREVMRVRFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXR0cmlidXRlVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXR0cmlidXRlVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FzY2FkZU9uRGVsZXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXNjYWRlT25EZWxldGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX01BUF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRBdHRyaWJ1dGVUeXBlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEVjbGlwc2VMaW5rMl8xLkFUVFJJQlVURV9UWVBFKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmF0Y2hGZXRjaC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhdGNoRmV0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTczMDFlOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmF0Y2hGZXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5CYXRjaEZldGNoVHlwZV8yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXRjaEZldGNoXzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbSBCYXRjaCBGZXRjaDwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXRjaEZldGNoKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEJhdGNoRmV0Y2ggZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxCYXRjaEZldGNoXzJfMQotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaXplKCkgPGVtPlNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNpemUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBTSVpFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNpemUoKSA8ZW0+U2l6ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2l6ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEludGVnZXIgc2l6ZSA9IFNJWkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCYXRjaEZldGNoVHlwZV8yXzEgQkFUQ0hfRkVUQ0hfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXRjaEZldGNoVHlwZSgpIDxlbT5CYXRjaCBGZXRjaCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXRjaEZldGNoVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJhdGNoRmV0Y2hUeXBlXzJfMSBiYXRjaEZldGNoVHlwZSA9IEJBVENIX0ZFVENIX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQmF0Y2hGZXRjaCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0JBVENIX0ZFVENIOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2l6ZShJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaF8yXzFfU2l6ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRTaXplKCkKLQl7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaCNnZXRTaXplIDxlbT5TaXplPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TaXplPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTaXplKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2l6ZShJbnRlZ2VyIG5ld1NpemUpCi0JewotCQlJbnRlZ2VyIG9sZFNpemUgPSBzaXplOwotCQlzaXplID0gbmV3U2l6ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9fU0laRSwgb2xkU2l6ZSwgc2l6ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuQmF0Y2hGZXRjaFR5cGVfMl8xfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2ggVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuQmF0Y2hGZXRjaFR5cGVfMl8xCi0JICogQHNlZSAjc2V0QmF0Y2hGZXRjaFR5cGUoQmF0Y2hGZXRjaFR5cGVfMl8xKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaF8yXzFfQmF0Y2hGZXRjaFR5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmF0Y2hGZXRjaFR5cGVfMl8xIGdldEJhdGNoRmV0Y2hUeXBlKCkKLQl7Ci0JCXJldHVybiBiYXRjaEZldGNoVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2gjZ2V0QmF0Y2hGZXRjaFR5cGUgPGVtPkJhdGNoIEZldGNoIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkJhdGNoRmV0Y2hUeXBlXzJfMQotCSAqIEBzZWUgI2dldEJhdGNoRmV0Y2hUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmF0Y2hGZXRjaFR5cGUoQmF0Y2hGZXRjaFR5cGVfMl8xIG5ld0JhdGNoRmV0Y2hUeXBlKQotCXsKLQkJQmF0Y2hGZXRjaFR5cGVfMl8xIG9sZEJhdGNoRmV0Y2hUeXBlID0gYmF0Y2hGZXRjaFR5cGU7Ci0JCWJhdGNoRmV0Y2hUeXBlID0gbmV3QmF0Y2hGZXRjaFR5cGUgPT0gbnVsbCA/IEJBVENIX0ZFVENIX1RZUEVfRURFRkFVTFQgOiBuZXdCYXRjaEZldGNoVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9fQkFUQ0hfRkVUQ0hfVFlQRSwgb2xkQmF0Y2hGZXRjaFR5cGUsIGJhdGNoRmV0Y2hUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfX1NJWkU6Ci0JCQkJcmV0dXJuIGdldFNpemUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9fQkFUQ0hfRkVUQ0hfVFlQRToKLQkJCQlyZXR1cm4gZ2V0QmF0Y2hGZXRjaFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfX1NJWkU6Ci0JCQkJc2V0U2l6ZSgoSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX19CQVRDSF9GRVRDSF9UWVBFOgotCQkJCXNldEJhdGNoRmV0Y2hUeXBlKChCYXRjaEZldGNoVHlwZV8yXzEpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9fU0laRToKLQkJCQlzZXRTaXplKFNJWkVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9fQkFUQ0hfRkVUQ0hfVFlQRToKLQkJCQlzZXRCYXRjaEZldGNoVHlwZShCQVRDSF9GRVRDSF9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX19TSVpFOgotCQkJCXJldHVybiBTSVpFX0VERUZBVUxUID09IG51bGwgPyBzaXplICE9IG51bGwgOiAhU0laRV9FREVGQVVMVC5lcXVhbHMoc2l6ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfX0JBVENIX0ZFVENIX1RZUEU6Ci0JCQkJcmV0dXJuIGJhdGNoRmV0Y2hUeXBlICE9IEJBVENIX0ZFVENIX1RZUEVfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNpemU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNpemUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGJhdGNoRmV0Y2hUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChiYXRjaEZldGNoVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLAotCQkJVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkU2l6ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQmF0Y2hGZXRjaFR5cGVUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNpemVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuQkFUQ0hfRkVUQ0hfX1NJWkUsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhdGNoRmV0Y2hfMl8xX1NpemUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQmF0Y2hGZXRjaFR5cGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuQkFUQ0hfRkVUQ0hfX1RZUEUsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhdGNoRmV0Y2hfMl8xX0JhdGNoRmV0Y2hUeXBlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi19IC8vIFhtQmF0Y2hGZXRjaApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhdGNoRmV0Y2hIb2xkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXRjaEZldGNoSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYjY3NDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhdGNoRmV0Y2hIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEJhdGNoIEZldGNoIEhvbGRlcjwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2hIb2xkZXIjZ2V0QmF0Y2hGZXRjaCA8ZW0+QmF0Y2ggRmV0Y2g8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhdGNoRmV0Y2hIb2xkZXIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEJhdGNoRmV0Y2hIb2xkZXIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2g8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRCYXRjaEZldGNoKFhtbEJhdGNoRmV0Y2gpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXRjaEZldGNoSG9sZGVyX0JhdGNoRmV0Y2goKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sQmF0Y2hGZXRjaCBnZXRCYXRjaEZldGNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2hIb2xkZXIjZ2V0QmF0Y2hGZXRjaCA8ZW0+QmF0Y2ggRmV0Y2g8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRCYXRjaEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCYXRjaEZldGNoKFhtbEJhdGNoRmV0Y2ggdmFsdWUpOwotCi19IC8vIFhtbEJhdGNoRmV0Y2hIb2xkZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDYWNoZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Nzc0NTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkNhY2hlSXNvbGF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmsyXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbENhY2hlXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGluazJfNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sQ2FjaGVfMl80OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENhY2hlPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldEV4cGlyeSA8ZW0+RXhwaXJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldFNpemUgPGVtPlNpemU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0U2hhcmVkIDxlbT5TaGFyZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRBbHdheXNSZWZyZXNoIDxlbT5BbHdheXMgUmVmcmVzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRSZWZyZXNoT25seUlmTmV3ZXIgPGVtPlJlZnJlc2ggT25seSBJZiBOZXdlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXREaXNhYmxlSGl0cyA8ZW0+RGlzYWJsZSBIaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldENvb3JkaW5hdGlvblR5cGUgPGVtPkNvb3JkaW5hdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldEV4cGlyeVRpbWVPZkRheSA8ZW0+RXhwaXJ5IFRpbWUgT2YgRGF5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxDYWNoZSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbENhY2hlXzJfMiwgWG1sQ2FjaGVfMl80Ci17Ci0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2FjaGVJc29sYXRpb25UeXBlIElTT0xBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc29sYXRpb24oKSA8ZW0+SXNvbGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc29sYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDYWNoZUlzb2xhdGlvblR5cGUgaXNvbGF0aW9uID0gSVNPTEFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlIERBVEFCQVNFX0NIQU5HRV9OT1RJRklDQVRJT05fVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUoKSA8ZW0+RGF0YWJhc2UgQ2hhbmdlIE5vdGlmaWNhdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUgZGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlID0gREFUQUJBU0VfQ0hBTkdFX05PVElGSUNBVElPTl9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4cGlyeSgpIDxlbT5FeHBpcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4cGlyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIEVYUElSWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHBpcnkoKSA8ZW0+RXhwaXJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHBpcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIGV4cGlyeSA9IEVYUElSWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaXplKCkgPGVtPlNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNpemUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBTSVpFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNpemUoKSA8ZW0+U2l6ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2l6ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEludGVnZXIgc2l6ZSA9IFNJWkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2hhcmVkKCkgPGVtPlNoYXJlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2hhcmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gU0hBUkVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNoYXJlZCgpIDxlbT5TaGFyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNoYXJlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gc2hhcmVkID0gU0hBUkVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2FjaGVUeXBlIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FjaGVUeXBlIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsd2F5c1JlZnJlc2goKSA8ZW0+QWx3YXlzIFJlZnJlc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsd2F5c1JlZnJlc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBBTFdBWVNfUkVGUkVTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHdheXNSZWZyZXNoKCkgPGVtPkFsd2F5cyBSZWZyZXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbHdheXNSZWZyZXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBhbHdheXNSZWZyZXNoID0gQUxXQVlTX1JFRlJFU0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkgPGVtPlJlZnJlc2ggT25seSBJZiBOZXdlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gUkVGUkVTSF9PTkxZX0lGX05FV0VSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZnJlc2hPbmx5SWZOZXdlcigpIDxlbT5SZWZyZXNoIE9ubHkgSWYgTmV3ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZnJlc2hPbmx5SWZOZXdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gcmVmcmVzaE9ubHlJZk5ld2VyID0gUkVGUkVTSF9PTkxZX0lGX05FV0VSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc2FibGVIaXRzKCkgPGVtPkRpc2FibGUgSGl0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzYWJsZUhpdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBESVNBQkxFX0hJVFNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzYWJsZUhpdHMoKSA8ZW0+RGlzYWJsZSBIaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNhYmxlSGl0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gZGlzYWJsZUhpdHMgPSBESVNBQkxFX0hJVFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDYWNoZUNvb3JkaW5hdGlvblR5cGUgQ09PUkRJTkFUSU9OX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29vcmRpbmF0aW9uVHlwZSgpIDxlbT5Db29yZGluYXRpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29vcmRpbmF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBjb29yZGluYXRpb25UeXBlID0gQ09PUkRJTkFUSU9OX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHBpcnlUaW1lT2ZEYXkoKSA8ZW0+RXhwaXJ5IFRpbWUgT2YgRGF5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHBpcnlUaW1lT2ZEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxUaW1lT2ZEYXkgZXhwaXJ5VGltZU9mRGF5OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENhY2hlKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQ0FDSEU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXNvbGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5DYWNoZUlzb2xhdGlvblR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXNvbGF0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzb2xhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuQ2FjaGVJc29sYXRpb25UeXBlCi0JICogQHNlZSAjc2V0SXNvbGF0aW9uKENhY2hlSXNvbGF0aW9uVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlXzJfMl9Jc29sYXRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYWNoZUlzb2xhdGlvblR5cGUgZ2V0SXNvbGF0aW9uKCkKLQl7Ci0JCXJldHVybiBpc29sYXRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRJc29sYXRpb24gPGVtPklzb2xhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXNvbGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5DYWNoZUlzb2xhdGlvblR5cGUKLQkgKiBAc2VlICNnZXRJc29sYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc29sYXRpb24oQ2FjaGVJc29sYXRpb25UeXBlIG5ld0lzb2xhdGlvbikKLQl7Ci0JCUNhY2hlSXNvbGF0aW9uVHlwZSBvbGRJc29sYXRpb24gPSBpc29sYXRpb247Ci0JCWlzb2xhdGlvbiA9IG5ld0lzb2xhdGlvbiA9PSBudWxsID8gSVNPTEFUSU9OX0VERUZBVUxUIDogbmV3SXNvbGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19JU09MQVRJT04sIG9sZElzb2xhdGlvbiwgaXNvbGF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGF0YWJhc2UgQ2hhbmdlIE5vdGlmaWNhdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5EYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF0YWJhc2UgQ2hhbmdlIE5vdGlmaWNhdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRhdGFiYXNlIENoYW5nZSBOb3RpZmljYXRpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlCi0JICogQHNlZSAjc2V0RGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlKERhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlXzJfNF9EYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUgZ2V0RGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlKCkKLQl7Ci0JCXJldHVybiBkYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXREYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUgPGVtPkRhdGFiYXNlIENoYW5nZSBOb3RpZmljYXRpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YWJhc2UgQ2hhbmdlIE5vdGlmaWNhdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5EYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUKLQkgKiBAc2VlICNnZXREYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUoRGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlIG5ld0RhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSkKLQl7Ci0JCURhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSBvbGREYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUgPSBkYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGU7Ci0JCWRhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSA9IG5ld0RhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSA9PSBudWxsID8gREFUQUJBU0VfQ0hBTkdFX05PVElGSUNBVElPTl9UWVBFX0VERUZBVUxUIDogbmV3RGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19EQVRBQkFTRV9DSEFOR0VfTk9USUZJQ0FUSU9OX1RZUEUsIG9sZERhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSwgZGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhwaXJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeHBpcnk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhwaXJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeHBpcnkoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlX0V4cGlyeSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRFeHBpcnkoKQotCXsKLQkJcmV0dXJuIGV4cGlyeTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldEV4cGlyeSA8ZW0+RXhwaXJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHBpcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4cGlyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cGlyeShJbnRlZ2VyIG5ld0V4cGlyeSkKLQl7Ci0JCUludGVnZXIgb2xkRXhwaXJ5ID0gZXhwaXJ5OwotCQlleHBpcnkgPSBuZXdFeHBpcnk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWSwgb2xkRXhwaXJ5LCBleHBpcnkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TaXplPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNpemUoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlX1NpemUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0U2l6ZSgpCi0JewotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldFNpemUgPGVtPlNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNpemUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaXplKEludGVnZXIgbmV3U2l6ZSkKLQl7Ci0JCUludGVnZXIgb2xkU2l6ZSA9IHNpemU7Ci0JCXNpemUgPSBuZXdTaXplOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19TSVpFLCBvbGRTaXplLCBzaXplKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2hhcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TaGFyZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2hhcmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTaGFyZWQoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlX1NoYXJlZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0U2hhcmVkKCkKLQl7Ci0JCXJldHVybiBzaGFyZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRTaGFyZWQgPGVtPlNoYXJlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2hhcmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTaGFyZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaGFyZWQoQm9vbGVhbiBuZXdTaGFyZWQpCi0JewotCQlCb29sZWFuIG9sZFNoYXJlZCA9IHNoYXJlZDsKLQkJc2hhcmVkID0gbmV3U2hhcmVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19TSEFSRUQsIG9sZFNoYXJlZCwgc2hhcmVkKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZQotCSAqIEBzZWUgI3NldFR5cGUoQ2FjaGVUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVfVHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYWNoZVR5cGUgZ2V0VHlwZSgpCi0JewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUKLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShDYWNoZVR5cGUgbmV3VHlwZSkKLQl7Ci0JCUNhY2hlVHlwZSBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGUgPT0gbnVsbCA/IFRZUEVfRURFRkFVTFQgOiBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWx3YXlzIFJlZnJlc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFsd2F5cyBSZWZyZXNoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsd2F5cyBSZWZyZXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZV9BbHdheXNSZWZyZXNoKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRBbHdheXNSZWZyZXNoKCkKLQl7Ci0JCXJldHVybiBhbHdheXNSZWZyZXNoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0QWx3YXlzUmVmcmVzaCA8ZW0+QWx3YXlzIFJlZnJlc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFsd2F5cyBSZWZyZXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbHdheXNSZWZyZXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuIG5ld0Fsd2F5c1JlZnJlc2gpCi0JewotCQlCb29sZWFuIG9sZEFsd2F5c1JlZnJlc2ggPSBhbHdheXNSZWZyZXNoOwotCQlhbHdheXNSZWZyZXNoID0gbmV3QWx3YXlzUmVmcmVzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fQUxXQVlTX1JFRlJFU0gsIG9sZEFsd2F5c1JlZnJlc2gsIGFsd2F5c1JlZnJlc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZyZXNoIE9ubHkgSWYgTmV3ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZnJlc2ggT25seSBJZiBOZXdlcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZyZXNoIE9ubHkgSWYgTmV3ZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVfUmVmcmVzaE9ubHlJZk5ld2VyKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRSZWZyZXNoT25seUlmTmV3ZXIoKQotCXsKLQkJcmV0dXJuIHJlZnJlc2hPbmx5SWZOZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldFJlZnJlc2hPbmx5SWZOZXdlciA8ZW0+UmVmcmVzaCBPbmx5IElmIE5ld2VyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZyZXNoIE9ubHkgSWYgTmV3ZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlZnJlc2hPbmx5SWZOZXdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuIG5ld1JlZnJlc2hPbmx5SWZOZXdlcikKLQl7Ci0JCUJvb2xlYW4gb2xkUmVmcmVzaE9ubHlJZk5ld2VyID0gcmVmcmVzaE9ubHlJZk5ld2VyOwotCQlyZWZyZXNoT25seUlmTmV3ZXIgPSBuZXdSZWZyZXNoT25seUlmTmV3ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1JFRlJFU0hfT05MWV9JRl9ORVdFUiwgb2xkUmVmcmVzaE9ubHlJZk5ld2VyLCByZWZyZXNoT25seUlmTmV3ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNhYmxlIEhpdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc2FibGUgSGl0czwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNhYmxlIEhpdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERpc2FibGVIaXRzKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZV9EaXNhYmxlSGl0cygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0RGlzYWJsZUhpdHMoKQotCXsKLQkJcmV0dXJuIGRpc2FibGVIaXRzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0RGlzYWJsZUhpdHMgPGVtPkRpc2FibGUgSGl0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlzYWJsZSBIaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREaXNhYmxlSGl0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc2FibGVIaXRzKEJvb2xlYW4gbmV3RGlzYWJsZUhpdHMpCi0JewotCQlCb29sZWFuIG9sZERpc2FibGVIaXRzID0gZGlzYWJsZUhpdHM7Ci0JCWRpc2FibGVIaXRzID0gbmV3RGlzYWJsZUhpdHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0RJU0FCTEVfSElUUywgb2xkRGlzYWJsZUhpdHMsIGRpc2FibGVIaXRzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29vcmRpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29vcmRpbmF0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29vcmRpbmF0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUKLQkgKiBAc2VlICNzZXRDb29yZGluYXRpb25UeXBlKENhY2hlQ29vcmRpbmF0aW9uVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlX0Nvb3JkaW5hdGlvblR5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0Q29vcmRpbmF0aW9uVHlwZSgpCi0JewotCQlyZXR1cm4gY29vcmRpbmF0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldENvb3JkaW5hdGlvblR5cGUgPGVtPkNvb3JkaW5hdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db29yZGluYXRpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZQotCSAqIEBzZWUgI2dldENvb3JkaW5hdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb29yZGluYXRpb25UeXBlKENhY2hlQ29vcmRpbmF0aW9uVHlwZSBuZXdDb29yZGluYXRpb25UeXBlKQotCXsKLQkJQ2FjaGVDb29yZGluYXRpb25UeXBlIG9sZENvb3JkaW5hdGlvblR5cGUgPSBjb29yZGluYXRpb25UeXBlOwotCQljb29yZGluYXRpb25UeXBlID0gbmV3Q29vcmRpbmF0aW9uVHlwZSA9PSBudWxsID8gQ09PUkRJTkFUSU9OX1RZUEVfRURFRkFVTFQgOiBuZXdDb29yZGluYXRpb25UeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19DT09SRElOQVRJT05fVFlQRSwgb2xkQ29vcmRpbmF0aW9uVHlwZSwgY29vcmRpbmF0aW9uVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4cGlyeSBUaW1lIE9mIERheTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhwaXJ5IFRpbWUgT2YgRGF5PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4cGlyeSBUaW1lIE9mIERheTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RXhwaXJ5VGltZU9mRGF5KFhtbFRpbWVPZkRheSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlX0V4cGlyeVRpbWVPZkRheSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVGltZU9mRGF5IGdldEV4cGlyeVRpbWVPZkRheSgpCi0JewotCQlyZXR1cm4gZXhwaXJ5VGltZU9mRGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEV4cGlyeVRpbWVPZkRheShYbWxUaW1lT2ZEYXkgbmV3RXhwaXJ5VGltZU9mRGF5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sVGltZU9mRGF5IG9sZEV4cGlyeVRpbWVPZkRheSA9IGV4cGlyeVRpbWVPZkRheTsKLQkJZXhwaXJ5VGltZU9mRGF5ID0gbmV3RXhwaXJ5VGltZU9mRGF5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19FWFBJUllfVElNRV9PRl9EQVksIG9sZEV4cGlyeVRpbWVPZkRheSwgbmV3RXhwaXJ5VGltZU9mRGF5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldEV4cGlyeVRpbWVPZkRheSA8ZW0+RXhwaXJ5IFRpbWUgT2YgRGF5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHBpcnkgVGltZSBPZiBEYXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEV4cGlyeVRpbWVPZkRheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cGlyeVRpbWVPZkRheShYbWxUaW1lT2ZEYXkgbmV3RXhwaXJ5VGltZU9mRGF5KQotCXsKLQkJaWYgKG5ld0V4cGlyeVRpbWVPZkRheSAhPSBleHBpcnlUaW1lT2ZEYXkpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGV4cGlyeVRpbWVPZkRheSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClleHBpcnlUaW1lT2ZEYXkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19FWFBJUllfVElNRV9PRl9EQVksIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0V4cGlyeVRpbWVPZkRheSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFeHBpcnlUaW1lT2ZEYXkpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19FWFBJUllfVElNRV9PRl9EQVksIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RXhwaXJ5VGltZU9mRGF5KG5ld0V4cGlyeVRpbWVPZkRheSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19FWFBJUllfVElNRV9PRl9EQVksIG5ld0V4cGlyeVRpbWVPZkRheSwgbmV3RXhwaXJ5VGltZU9mRGF5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRFeHBpcnlUaW1lT2ZEYXkobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19JU09MQVRJT046Ci0JCQkJcmV0dXJuIGdldElzb2xhdGlvbigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19EQVRBQkFTRV9DSEFOR0VfTk9USUZJQ0FUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGdldERhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19FWFBJUlk6Ci0JCQkJcmV0dXJuIGdldEV4cGlyeSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19TSVpFOgotCQkJCXJldHVybiBnZXRTaXplKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1NIQVJFRDoKLQkJCQlyZXR1cm4gZ2V0U2hhcmVkKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fQUxXQVlTX1JFRlJFU0g6Ci0JCQkJcmV0dXJuIGdldEFsd2F5c1JlZnJlc2goKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fUkVGUkVTSF9PTkxZX0lGX05FV0VSOgotCQkJCXJldHVybiBnZXRSZWZyZXNoT25seUlmTmV3ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fRElTQUJMRV9ISVRTOgotCQkJCXJldHVybiBnZXREaXNhYmxlSGl0cygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19DT09SRElOQVRJT05fVFlQRToKLQkJCQlyZXR1cm4gZ2V0Q29vcmRpbmF0aW9uVHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19FWFBJUllfVElNRV9PRl9EQVk6Ci0JCQkJcmV0dXJuIGdldEV4cGlyeVRpbWVPZkRheSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fSVNPTEFUSU9OOgotCQkJCXNldElzb2xhdGlvbigoQ2FjaGVJc29sYXRpb25UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0RBVEFCQVNFX0NIQU5HRV9OT1RJRklDQVRJT05fVFlQRToKLQkJCQlzZXREYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUoKERhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19FWFBJUlk6Ci0JCQkJc2V0RXhwaXJ5KChJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1NJWkU6Ci0JCQkJc2V0U2l6ZSgoSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19TSEFSRUQ6Ci0JCQkJc2V0U2hhcmVkKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoQ2FjaGVUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0FMV0FZU19SRUZSRVNIOgotCQkJCXNldEFsd2F5c1JlZnJlc2goKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fUkVGUkVTSF9PTkxZX0lGX05FV0VSOgotCQkJCXNldFJlZnJlc2hPbmx5SWZOZXdlcigoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19ESVNBQkxFX0hJVFM6Ci0JCQkJc2V0RGlzYWJsZUhpdHMoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fQ09PUkRJTkFUSU9OX1RZUEU6Ci0JCQkJc2V0Q29vcmRpbmF0aW9uVHlwZSgoQ2FjaGVDb29yZGluYXRpb25UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWToKLQkJCQlzZXRFeHBpcnlUaW1lT2ZEYXkoKFhtbFRpbWVPZkRheSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19JU09MQVRJT046Ci0JCQkJc2V0SXNvbGF0aW9uKElTT0xBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19EQVRBQkFTRV9DSEFOR0VfTk9USUZJQ0FUSU9OX1RZUEU6Ci0JCQkJc2V0RGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlKERBVEFCQVNFX0NIQU5HRV9OT1RJRklDQVRJT05fVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19FWFBJUlk6Ci0JCQkJc2V0RXhwaXJ5KEVYUElSWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19TSVpFOgotCQkJCXNldFNpemUoU0laRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19TSEFSRUQ6Ci0JCQkJc2V0U2hhcmVkKFNIQVJFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19BTFdBWVNfUkVGUkVTSDoKLQkJCQlzZXRBbHdheXNSZWZyZXNoKEFMV0FZU19SRUZSRVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1JFRlJFU0hfT05MWV9JRl9ORVdFUjoKLQkJCQlzZXRSZWZyZXNoT25seUlmTmV3ZXIoUkVGUkVTSF9PTkxZX0lGX05FV0VSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0RJU0FCTEVfSElUUzoKLQkJCQlzZXREaXNhYmxlSGl0cyhESVNBQkxFX0hJVFNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fQ09PUkRJTkFUSU9OX1RZUEU6Ci0JCQkJc2V0Q29vcmRpbmF0aW9uVHlwZShDT09SRElOQVRJT05fVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19FWFBJUllfVElNRV9PRl9EQVk6Ci0JCQkJc2V0RXhwaXJ5VGltZU9mRGF5KChYbWxUaW1lT2ZEYXkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fSVNPTEFUSU9OOgotCQkJCXJldHVybiBpc29sYXRpb24gIT0gSVNPTEFUSU9OX0VERUZBVUxUOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19EQVRBQkFTRV9DSEFOR0VfTk9USUZJQ0FUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGRhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSAhPSBEQVRBQkFTRV9DSEFOR0VfTk9USUZJQ0FUSU9OX1RZUEVfRURFRkFVTFQ7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWToKLQkJCQlyZXR1cm4gRVhQSVJZX0VERUZBVUxUID09IG51bGwgPyBleHBpcnkgIT0gbnVsbCA6ICFFWFBJUllfRURFRkFVTFQuZXF1YWxzKGV4cGlyeSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1NJWkU6Ci0JCQkJcmV0dXJuIFNJWkVfRURFRkFVTFQgPT0gbnVsbCA/IHNpemUgIT0gbnVsbCA6ICFTSVpFX0VERUZBVUxULmVxdWFscyhzaXplKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fU0hBUkVEOgotCQkJCXJldHVybiBTSEFSRURfRURFRkFVTFQgPT0gbnVsbCA/IHNoYXJlZCAhPSBudWxsIDogIVNIQVJFRF9FREVGQVVMVC5lcXVhbHMoc2hhcmVkKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fVFlQRToKLQkJCQlyZXR1cm4gdHlwZSAhPSBUWVBFX0VERUZBVUxUOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19BTFdBWVNfUkVGUkVTSDoKLQkJCQlyZXR1cm4gQUxXQVlTX1JFRlJFU0hfRURFRkFVTFQgPT0gbnVsbCA/IGFsd2F5c1JlZnJlc2ggIT0gbnVsbCA6ICFBTFdBWVNfUkVGUkVTSF9FREVGQVVMVC5lcXVhbHMoYWx3YXlzUmVmcmVzaCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1JFRlJFU0hfT05MWV9JRl9ORVdFUjoKLQkJCQlyZXR1cm4gUkVGUkVTSF9PTkxZX0lGX05FV0VSX0VERUZBVUxUID09IG51bGwgPyByZWZyZXNoT25seUlmTmV3ZXIgIT0gbnVsbCA6ICFSRUZSRVNIX09OTFlfSUZfTkVXRVJfRURFRkFVTFQuZXF1YWxzKHJlZnJlc2hPbmx5SWZOZXdlcik7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0RJU0FCTEVfSElUUzoKLQkJCQlyZXR1cm4gRElTQUJMRV9ISVRTX0VERUZBVUxUID09IG51bGwgPyBkaXNhYmxlSGl0cyAhPSBudWxsIDogIURJU0FCTEVfSElUU19FREVGQVVMVC5lcXVhbHMoZGlzYWJsZUhpdHMpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19DT09SRElOQVRJT05fVFlQRToKLQkJCQlyZXR1cm4gY29vcmRpbmF0aW9uVHlwZSAhPSBDT09SRElOQVRJT05fVFlQRV9FREVGQVVMVDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fRVhQSVJZX1RJTUVfT0ZfREFZOgotCQkJCXJldHVybiBleHBpcnlUaW1lT2ZEYXkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ2FjaGVfMl80LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19EQVRBQkFTRV9DSEFOR0VfTk9USUZJQ0FUSU9OX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLlhNTF9DQUNIRV8yNF9fREFUQUJBU0VfQ0hBTkdFX05PVElGSUNBVElPTl9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ2FjaGVfMl80LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLlhNTF9DQUNIRV8yNF9fREFUQUJBU0VfQ0hBTkdFX05PVElGSUNBVElPTl9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fREFUQUJBU0VfQ0hBTkdFX05PVElGSUNBVElPTl9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaXNvbGF0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpc29sYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleHBpcnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4cGlyeSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2l6ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2l6ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2hhcmVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzaGFyZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFsd2F5c1JlZnJlc2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFsd2F5c1JlZnJlc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlZnJlc2hPbmx5SWZOZXdlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVmcmVzaE9ubHlJZk5ld2VyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkaXNhYmxlSGl0czogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGlzYWJsZUhpdHMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvb3JkaW5hdGlvblR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvb3JkaW5hdGlvblR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRFeHBpcnlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEV4cGlyeVRpbWVPZkRheVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2l6ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2hhcmVkVHJhbnNsYXRvcigpLAotCQkJYnVpbGRJc29sYXRpb25UcmFuc2xhdG9yKCksCi0JCQlidWlsZFR5cGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFsd2F5c1JlZnJlc2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZFJlZnJlc2hPbmx5SWZOZXdlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRGlzYWJsZUhpdHNUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvb3JkaW5hdGlvblR5cGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZERhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZVRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFeHBpcnlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0FDSEVfX0VYUElSWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDYWNoZV9FeHBpcnkoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEV4cGlyeVRpbWVPZkRheVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxUaW1lT2ZEYXkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkVYUElSWV9USU1FX09GX0RBWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDYWNoZV9FeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNpemVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0FDSEVfX1NJWkUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfU2l6ZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTaGFyZWRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0FDSEVfX1NIQVJFRCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDYWNoZV9TaGFyZWQoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DQUNIRV9fVFlQRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDYWNoZV9UeXBlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFsd2F5c1JlZnJlc2hUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0FDSEVfX0FMV0FZU19SRUZSRVNILCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhY2hlX0Fsd2F5c1JlZnJlc2goKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNBQ0hFX19SRUZSRVNIX09OTFlfSUZfTkVXRVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfUmVmcmVzaE9ubHlJZk5ld2VyKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERpc2FibGVIaXRzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNBQ0hFX19ESVNBQkxFX0hJVFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfRGlzYWJsZUhpdHMoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29vcmRpbmF0aW9uVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DQUNIRV9fQ09PUkRJTkFUSU9OX1RZUEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfQ29vcmRpbmF0aW9uVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRJc29sYXRpb25UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuQ0FDSEVfX0lTT0xBVElPTiwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfMl8yX0lzb2xhdGlvbigpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzQuQ0FDSEVfX0RBVEFCQVNFX0NIQU5HRV9OT1RJRklDQVRJT05fVFlQRSwgRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfMl80X0RhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotfSAvLyBYbWxDYWNoZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENhY2hlSG9sZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2FjaGVIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBhNWMwZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2FjaGVIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ2FjaGUgSG9sZGVyPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZUhvbGRlciNnZXRDYWNoZSA8ZW0+Q2FjaGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIjZ2V0RXhpc3RlbmNlQ2hlY2tpbmcgPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVIb2xkZXIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbENhY2hlSG9sZGVyIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhY2hlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYWNoZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2FjaGUoWG1sQ2FjaGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZUhvbGRlcl9DYWNoZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxDYWNoZSBnZXRDYWNoZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZUhvbGRlciNnZXRDYWNoZSA8ZW0+Q2FjaGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDYWNoZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2FjaGUoWG1sQ2FjaGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhpc3RlbmNlIENoZWNraW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhpc3RlbmNlIENoZWNraW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZQotCSAqIEBzZWUgI3NldEV4aXN0ZW5jZUNoZWNraW5nKEV4aXN0ZW5jZVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZUhvbGRlcl9FeGlzdGVuY2VDaGVja2luZygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXhpc3RlbmNlVHlwZSBnZXRFeGlzdGVuY2VDaGVja2luZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZUhvbGRlciNnZXRFeGlzdGVuY2VDaGVja2luZyA8ZW0+RXhpc3RlbmNlIENoZWNraW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlCi0JICogQHNlZSAjZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4aXN0ZW5jZUNoZWNraW5nKEV4aXN0ZW5jZVR5cGUgdmFsdWUpOwotCi19IC8vIFhtbENhY2hlSG9sZGVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2FjaGVJbmRleC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENhY2hlSW5kZXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyNTJmMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2FjaGVJbmRleC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGluazJfNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sQ2FjaGVJbmRleF8yXzQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENhY2hlIEluZGV4PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlSW5kZXgoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sQ2FjaGVJbmRleCBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbENhY2hlSW5kZXhfMl80Ci17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29sdW1uTmFtZXMoKSA8ZW0+Q29sdW1uIE5hbWVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbHVtbk5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBjb2x1bW5OYW1lczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDYWNoZUluZGV4KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQ0FDSEVfSU5ERVg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29sdW1uIE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db2x1bW4gTmFtZXM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW4gTmFtZXM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZUluZGV4XzJfNF9Db2x1bW5OYW1lcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRDb2x1bW5OYW1lcygpCi0JewotCQlpZiAoY29sdW1uTmFtZXMgPT0gbnVsbCkKLQkJewotCQkJY29sdW1uTmFtZXMgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfSU5ERVhfX0NPTFVNTl9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbHVtbk5hbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX0lOREVYX19DT0xVTU5fTkFNRVM6Ci0JCQkJcmV0dXJuIGdldENvbHVtbk5hbWVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX0lOREVYX19DT0xVTU5fTkFNRVM6Ci0JCQkJZ2V0Q29sdW1uTmFtZXMoKS5jbGVhcigpOwotCQkJCWdldENvbHVtbk5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfSU5ERVhfX0NPTFVNTl9OQU1FUzoKLQkJCQlnZXRDb2x1bW5OYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9JTkRFWF9fQ09MVU1OX05BTUVTOgotCQkJCXJldHVybiBjb2x1bW5OYW1lcyAhPSBudWxsICYmICFjb2x1bW5OYW1lcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNvbHVtbk5hbWVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb2x1bW5OYW1lcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhY2hlSW5kZXgoKSwKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkQ29sdW1uTmFtZVRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb2x1bW5OYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl80LkNBQ0hFX0lOREVYX19DT0xVTU5fTkFNRSwgRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVJbmRleF8yXzRfQ29sdW1uTmFtZXMoKSk7Ci0JfQotfSAvLyBYbWxDYWNoZUluZGV4CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2hhbmdlVHJhY2tpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDaGFuZ2VUcmFja2luZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODJiYjc3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDaGFuZ2VUcmFja2luZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDaGFuZ2UgVHJhY2tpbmc8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENoYW5nZVRyYWNraW5nKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbENoYW5nZVRyYWNraW5nIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFhtbENoYW5nZVRyYWNraW5nVHlwZSBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENoYW5nZVRyYWNraW5nVHlwZSB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDaGFuZ2VUcmFja2luZygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0NIQU5HRV9UUkFDS0lORzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ1R5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlCi0JICogQHNlZSAjc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDaGFuZ2VUcmFja2luZ19UeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENoYW5nZVRyYWNraW5nVHlwZSBnZXRUeXBlKCkKLQl7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmcjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nVHlwZQotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZSBuZXdUeXBlKQotCXsKLQkJWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZSA9PSBudWxsID8gVFlQRV9FREVGQVVMVCA6IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0hBTkdFX1RSQUNLSU5HX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0hBTkdFX1RSQUNLSU5HX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NIQU5HRV9UUkFDS0lOR19fVFlQRToKLQkJCQlzZXRUeXBlKChYbWxDaGFuZ2VUcmFja2luZ1R5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DSEFOR0VfVFJBQ0tJTkdfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NIQU5HRV9UUkFDS0lOR19fVFlQRToKLQkJCQlyZXR1cm4gdHlwZSAhPSBUWVBFX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0eXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0eXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5ULCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkVHlwZVRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2hhbmdlVHJhY2tpbmdfVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotfSAvLyBYbWxDaGFuZ2VUcmFja2luZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENoYW5nZVRyYWNraW5nSG9sZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0NDQwNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDaGFuZ2UgVHJhY2tpbmcgSG9sZGVyPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ0hvbGRlciNnZXRDaGFuZ2VUcmFja2luZyA8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhbmdlIFRyYWNraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDaGFuZ2VUcmFja2luZyhYbWxDaGFuZ2VUcmFja2luZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyX0NoYW5nZVRyYWNraW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbENoYW5nZVRyYWNraW5nIGdldENoYW5nZVRyYWNraW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nSG9sZGVyI2dldENoYW5nZVRyYWNraW5nIDxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2hhbmdlVHJhY2tpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENoYW5nZVRyYWNraW5nKFhtbENoYW5nZVRyYWNraW5nIHZhbHVlKTsKLQotfSAvLyBYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENoYW5nZVRyYWNraW5nVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENoYW5nZVRyYWNraW5nVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmE3NjVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDaGFuZ2VUcmFja2luZ1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5YbWwgQ2hhbmdlIFRyYWNraW5nIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDaGFuZ2VUcmFja2luZ1R5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIFhtbENoYW5nZVRyYWNraW5nVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5BVFRSSUJVVEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVRUUklCVVRFX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JQVRUUklCVVRFKDAsICJBVFRSSUJVVEUiLCAiQVRUUklCVVRFIiksIC8qKgotCSAqIFRoZSAnPGVtPjxiPk9CSkVDVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNPQkpFQ1RfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlPQkpFQ1QoMSwgIk9CSkVDVCIsICJPQkpFQ1QiKSwgLyoqCi0JICogVGhlICc8ZW0+PGI+REVGRVJSRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjREVGRVJSRURfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlERUZFUlJFRCgyLCAiREVGRVJSRUQiLCAiREVGRVJSRUQiKSwgLyoqCi0JICogVGhlICc8ZW0+PGI+QVVUTzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBVVRPX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JQVVUTygzLCAiQVVUTyIsICJBVVRPIikKLQk7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5BVFRSSUJVVEU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFUVFJJQlVURTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBVFRSSUJVVEUKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVfVkFMVUUgPSAwOwotCi0vKioKLQkgKiBUaGUgJzxlbT48Yj5PQkpFQ1Q8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk9CSkVDVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNPQkpFQ1QKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfVkFMVUUgPSAxOwotCi0vKioKLQkgKiBUaGUgJzxlbT48Yj5ERUZFUlJFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+REVGRVJSRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjREVGRVJSRUQKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZFUlJFRF9WQUxVRSA9IDI7Ci0KLS8qKgotCSAqIFRoZSAnPGVtPjxiPkFVVE88L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFVVE88L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVVUTwotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVVE9fVkFMVUUgPSAzOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlhtbCBDaGFuZ2UgVHJhY2tpbmcgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFhtbENoYW5nZVRyYWNraW5nVHlwZVtdCi0JCXsKLQkJCUFUVFJJQlVURSwKLQkJCU9CSkVDVCwKLQkJCURFRkVSUkVELAotCQkJQVVUTywKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5YbWwgQ2hhbmdlIFRyYWNraW5nIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxYbWxDaGFuZ2VUcmFja2luZ1R5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIENoYW5nZSBUcmFja2luZyBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlYbWxDaGFuZ2VUcmFja2luZ1R5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIENoYW5nZSBUcmFja2luZyBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlYbWxDaGFuZ2VUcmFja2luZ1R5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgQ2hhbmdlIFRyYWNraW5nIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBYbWxDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0KGludCB2YWx1ZSkKLQl7Ci0JCXN3aXRjaCAodmFsdWUpCi0JCXsKLQkJCWNhc2UgQVRUUklCVVRFX1ZBTFVFOiByZXR1cm4gQVRUUklCVVRFOwotCQkJY2FzZSBPQkpFQ1RfVkFMVUU6IHJldHVybiBPQkpFQ1Q7Ci0JCQljYXNlIERFRkVSUkVEX1ZBTFVFOiByZXR1cm4gREVGRVJSRUQ7Ci0JCQljYXNlIEFVVE9fVkFMVUU6IHJldHVybiBBVVRPOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBYbWxDaGFuZ2VUcmFja2luZ1R5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpCi0JewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKLQl7Ci0JICByZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCQotfSAvL1htbENoYW5nZVRyYWNraW5nVHlwZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENsb25lQ29weVBvbGljeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENsb25lQ29weVBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzJhZmZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDbG9uZUNvcHlQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENsb25lIENvcHkgUG9saWN5PC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENsb25lQ29weVBvbGljeSNnZXRNZXRob2QgPGVtPk1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDbG9uZUNvcHlQb2xpY3kjZ2V0V29ya2luZ0NvcHlNZXRob2QgPGVtPldvcmtpbmcgQ29weSBNZXRob2Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENsb25lQ29weVBvbGljeSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxDbG9uZUNvcHlQb2xpY3kgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZCgpIDxlbT5NZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZCgpIDxlbT5NZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtZXRob2QgPSBNRVRIT0RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya2luZ0NvcHlNZXRob2QoKSA8ZW0+V29ya2luZyBDb3B5IE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya2luZ0NvcHlNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktJTkdfQ09QWV9NRVRIT0RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya2luZ0NvcHlNZXRob2QoKSA8ZW0+V29ya2luZyBDb3B5IE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya2luZ0NvcHlNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgd29ya2luZ0NvcHlNZXRob2QgPSBXT1JLSU5HX0NPUFlfTUVUSE9EX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENsb25lQ29weVBvbGljeSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0NMT05FX0NPUFlfUE9MSUNZOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWV0aG9kKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENsb25lQ29weVBvbGljeV9NZXRob2QoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXRob2QoKQotCXsKLQkJcmV0dXJuIG1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENsb25lQ29weVBvbGljeSNnZXRNZXRob2QgPGVtPk1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2QoU3RyaW5nIG5ld01ldGhvZCkKLQl7Ci0JCVN0cmluZyBvbGRNZXRob2QgPSBtZXRob2Q7Ci0JCW1ldGhvZCA9IG5ld01ldGhvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DTE9ORV9DT1BZX1BPTElDWV9fTUVUSE9ELCBvbGRNZXRob2QsIG1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmtpbmcgQ29weSBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldvcmtpbmcgQ29weSBNZXRob2Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29ya2luZyBDb3B5IE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29ya2luZ0NvcHlNZXRob2QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2xvbmVDb3B5UG9saWN5X1dvcmtpbmdDb3B5TWV0aG9kKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V29ya2luZ0NvcHlNZXRob2QoKQotCXsKLQkJcmV0dXJuIHdvcmtpbmdDb3B5TWV0aG9kOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5I2dldFdvcmtpbmdDb3B5TWV0aG9kIDxlbT5Xb3JraW5nIENvcHkgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JraW5nIENvcHkgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JraW5nQ29weU1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtpbmdDb3B5TWV0aG9kKFN0cmluZyBuZXdXb3JraW5nQ29weU1ldGhvZCkKLQl7Ci0JCVN0cmluZyBvbGRXb3JraW5nQ29weU1ldGhvZCA9IHdvcmtpbmdDb3B5TWV0aG9kOwotCQl3b3JraW5nQ29weU1ldGhvZCA9IG5ld1dvcmtpbmdDb3B5TWV0aG9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NMT05FX0NPUFlfUE9MSUNZX19XT1JLSU5HX0NPUFlfTUVUSE9ELCBvbGRXb3JraW5nQ29weU1ldGhvZCwgd29ya2luZ0NvcHlNZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DTE9ORV9DT1BZX1BPTElDWV9fTUVUSE9EOgotCQkJCXJldHVybiBnZXRNZXRob2QoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DTE9ORV9DT1BZX1BPTElDWV9fV09SS0lOR19DT1BZX01FVEhPRDoKLQkJCQlyZXR1cm4gZ2V0V29ya2luZ0NvcHlNZXRob2QoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX01FVEhPRDoKLQkJCQlzZXRNZXRob2QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NMT05FX0NPUFlfUE9MSUNZX19XT1JLSU5HX0NPUFlfTUVUSE9EOgotCQkJCXNldFdvcmtpbmdDb3B5TWV0aG9kKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DTE9ORV9DT1BZX1BPTElDWV9fTUVUSE9EOgotCQkJCXNldE1ldGhvZChNRVRIT0RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DTE9ORV9DT1BZX1BPTElDWV9fV09SS0lOR19DT1BZX01FVEhPRDoKLQkJCQlzZXRXb3JraW5nQ29weU1ldGhvZChXT1JLSU5HX0NPUFlfTUVUSE9EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NMT05FX0NPUFlfUE9MSUNZX19NRVRIT0Q6Ci0JCQkJcmV0dXJuIE1FVEhPRF9FREVGQVVMVCA9PSBudWxsID8gbWV0aG9kICE9IG51bGwgOiAhTUVUSE9EX0VERUZBVUxULmVxdWFscyhtZXRob2QpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NMT05FX0NPUFlfUE9MSUNZX19XT1JLSU5HX0NPUFlfTUVUSE9EOgotCQkJCXJldHVybiBXT1JLSU5HX0NPUFlfTUVUSE9EX0VERUZBVUxUID09IG51bGwgPyB3b3JraW5nQ29weU1ldGhvZCAhPSBudWxsIDogIVdPUktJTkdfQ09QWV9NRVRIT0RfRURFRkFVTFQuZXF1YWxzKHdvcmtpbmdDb3B5TWV0aG9kKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWV0aG9kOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtZXRob2QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcmtpbmdDb3B5TWV0aG9kOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JraW5nQ29weU1ldGhvZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE1ldGhvZFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkV29ya2luZ0NvcHlNZXRob2RUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE1ldGhvZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DTE9ORV9DT1BZX1BPTElDWV9fTUVUSE9ELCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENsb25lQ29weVBvbGljeV9NZXRob2QoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkV29ya2luZ0NvcHlNZXRob2RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0xPTkVfQ09QWV9QT0xJQ1lfX1dPUktJTkdfQ09QWV9NRVRIT0QsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2xvbmVDb3B5UG9saWN5X1dvcmtpbmdDb3B5TWV0aG9kKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotfSAvLyBYbWxDbG9uZUNvcHlQb2xpY3kKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb2xsZWN0aW9uVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb2xsZWN0aW9uVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzMzFmMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29sbGVjdGlvblRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGluazJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQ29sbGVjdGlvblRhYmxlXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ29sbGVjdGlvbiBUYWJsZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29sbGVjdGlvblRhYmxlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbENvbGxlY3Rpb25UYWJsZSBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sbGVjdGlvblRhYmxlIGltcGxlbWVudHMgWG1sQ29sbGVjdGlvblRhYmxlXzJfMgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcmVhdGlvblN1ZmZpeCgpIDxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0aW9uU3VmZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVElPTl9TVUZGSVhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25TdWZmaXgoKSA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjcmVhdGlvblN1ZmZpeCA9IENSRUFUSU9OX1NVRkZJWF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDb2xsZWN0aW9uVGFibGUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9DT0xMRUNUSU9OX1RBQkxFOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyZWF0aW9uIFN1ZmZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3JlYXRpb25TdWZmaXgoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29sbGVjdGlvblRhYmxlXzJfMl9DcmVhdGlvblN1ZmZpeCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0aW9uU3VmZml4KCkKLQl7Ci0JCXJldHVybiBjcmVhdGlvblN1ZmZpeDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbGxlY3Rpb25UYWJsZSNnZXRDcmVhdGlvblN1ZmZpeCA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENyZWF0aW9uU3VmZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRpb25TdWZmaXgoU3RyaW5nIG5ld0NyZWF0aW9uU3VmZml4KQotCXsKLQkJU3RyaW5nIG9sZENyZWF0aW9uU3VmZml4ID0gY3JlYXRpb25TdWZmaXg7Ci0JCWNyZWF0aW9uU3VmZml4ID0gbmV3Q3JlYXRpb25TdWZmaXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09MTEVDVElPTl9UQUJMRV9fQ1JFQVRJT05fU1VGRklYLCBvbGRDcmVhdGlvblN1ZmZpeCwgY3JlYXRpb25TdWZmaXgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT0xMRUNUSU9OX1RBQkxFX19DUkVBVElPTl9TVUZGSVg6Ci0JCQkJcmV0dXJuIGdldENyZWF0aW9uU3VmZml4KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTExFQ1RJT05fVEFCTEVfX0NSRUFUSU9OX1NVRkZJWDoKLQkJCQlzZXRDcmVhdGlvblN1ZmZpeCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09MTEVDVElPTl9UQUJMRV9fQ1JFQVRJT05fU1VGRklYOgotCQkJCXNldENyZWF0aW9uU3VmZml4KENSRUFUSU9OX1NVRkZJWF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT0xMRUNUSU9OX1RBQkxFX19DUkVBVElPTl9TVUZGSVg6Ci0JCQkJcmV0dXJuIENSRUFUSU9OX1NVRkZJWF9FREVGQVVMVCA9PSBudWxsID8gY3JlYXRpb25TdWZmaXggIT0gbnVsbCA6ICFDUkVBVElPTl9TVUZGSVhfRURFRkFVTFQuZXF1YWxzKGNyZWF0aW9uU3VmZml4KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29sbGVjdGlvblRhYmxlXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT0xMRUNUSU9OX1RBQkxFX19DUkVBVElPTl9TVUZGSVg6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9DT0xMRUNUSU9OX1RBQkxFXzIyX19DUkVBVElPTl9TVUZGSVg7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb2xsZWN0aW9uVGFibGVfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9DT0xMRUNUSU9OX1RBQkxFXzIyX19DUkVBVElPTl9TVUZGSVg6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTExFQ1RJT05fVEFCTEVfX0NSRUFUSU9OX1NVRkZJWDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNyZWF0aW9uU3VmZml4OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjcmVhdGlvblN1ZmZpeCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbGxlY3Rpb25UYWJsZSgpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXRhbG9nVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTY2hlbWFUcmFuc2xhdG9yKCksCi0JCQlidWlsZENyZWF0aW9uU3VmZml4VHJhbnNsYXRvcigpLAotCQkJYnVpbGRKb2luQ29sdW1uVHJhbnNsYXRvcigpLAotCQkJYnVpbGRVbmlxdWVDb25zdHJhaW50VHJhbnNsYXRvcigpfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ3JlYXRpb25TdWZmaXhUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuQ1JFQVRJT05fU1VGRklYLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb2xsZWN0aW9uVGFibGVfMl8yX0NyZWF0aW9uU3VmZml4KCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi19IC8vIFhtbENvbGxlY3Rpb25UYWJsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbnZlcnNpb25WYWx1ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbnZlcnNpb25WYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzQ2YzkyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJzaW9uVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENvbnZlcnNpb24gVmFsdWU8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZSNnZXREYXRhVmFsdWUgPGVtPkRhdGEgVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVyc2lvblZhbHVlI2dldE9iamVjdFZhbHVlIDxlbT5PYmplY3QgVmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnNpb25WYWx1ZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxDb252ZXJzaW9uVmFsdWUgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERhdGFWYWx1ZSgpIDxlbT5EYXRhIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXRhVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YVZhbHVlKCkgPGVtPkRhdGEgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERhdGFWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkYXRhVmFsdWUgPSBEQVRBX1ZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9iamVjdFZhbHVlKCkgPGVtPk9iamVjdCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T2JqZWN0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9WQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RWYWx1ZSgpIDxlbT5PYmplY3QgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9iamVjdFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG9iamVjdFZhbHVlID0gT0JKRUNUX1ZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENvbnZlcnNpb25WYWx1ZSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0NPTlZFUlNJT05fVkFMVUU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGF0YSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF0YSBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREYXRhVmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVyc2lvblZhbHVlX0RhdGFWYWx1ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFWYWx1ZSgpCi0JewotCQlyZXR1cm4gZGF0YVZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVyc2lvblZhbHVlI2dldERhdGFWYWx1ZSA8ZW0+RGF0YSBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YSBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGF0YVZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YVZhbHVlKFN0cmluZyBuZXdEYXRhVmFsdWUpCi0JewotCQlTdHJpbmcgb2xkRGF0YVZhbHVlID0gZGF0YVZhbHVlOwotCQlkYXRhVmFsdWUgPSBuZXdEYXRhVmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSU0lPTl9WQUxVRV9fREFUQV9WQUxVRSwgb2xkRGF0YVZhbHVlLCBkYXRhVmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PYmplY3QgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9iamVjdCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE9iamVjdFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnNpb25WYWx1ZV9PYmplY3RWYWx1ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdFZhbHVlKCkKLQl7Ci0JCXJldHVybiBvYmplY3RWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZSNnZXRPYmplY3RWYWx1ZSA8ZW0+T2JqZWN0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE9iamVjdFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0VmFsdWUoU3RyaW5nIG5ld09iamVjdFZhbHVlKQotCXsKLQkJU3RyaW5nIG9sZE9iamVjdFZhbHVlID0gb2JqZWN0VmFsdWU7Ci0JCW9iamVjdFZhbHVlID0gbmV3T2JqZWN0VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSU0lPTl9WQUxVRV9fT0JKRUNUX1ZBTFVFLCBvbGRPYmplY3RWYWx1ZSwgb2JqZWN0VmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJTSU9OX1ZBTFVFX19EQVRBX1ZBTFVFOgotCQkJCXJldHVybiBnZXREYXRhVmFsdWUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUU6Ci0JCQkJcmV0dXJuIGdldE9iamVjdFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlNJT05fVkFMVUVfX0RBVEFfVkFMVUU6Ci0JCQkJc2V0RGF0YVZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUU6Ci0JCQkJc2V0T2JqZWN0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlNJT05fVkFMVUVfX0RBVEFfVkFMVUU6Ci0JCQkJc2V0RGF0YVZhbHVlKERBVEFfVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUU6Ci0JCQkJc2V0T2JqZWN0VmFsdWUoT0JKRUNUX1ZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlNJT05fVkFMVUVfX0RBVEFfVkFMVUU6Ci0JCQkJcmV0dXJuIERBVEFfVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IGRhdGFWYWx1ZSAhPSBudWxsIDogIURBVEFfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGRhdGFWYWx1ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSU0lPTl9WQUxVRV9fT0JKRUNUX1ZBTFVFOgotCQkJCXJldHVybiBPQkpFQ1RfVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IG9iamVjdFZhbHVlICE9IG51bGwgOiAhT0JKRUNUX1ZBTFVFX0VERUZBVUxULmVxdWFscyhvYmplY3RWYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRhdGFWYWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGF0YVZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvYmplY3RWYWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQob2JqZWN0VmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXREYXRhVmFsdWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRV9fREFUQV9WQUxVRSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T2JqZWN0VmFsdWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRV9fT0JKRUNUX1ZBTFVFKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLAotCQkJc3RydWN0dXJhbEZlYXR1cmUsCi0JCQlUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5ULAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQotCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGREYXRhVmFsdWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9iamVjdFZhbHVlVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERhdGFWYWx1ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJTSU9OX1ZBTFVFX19EQVRBX1ZBTFVFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnNpb25WYWx1ZV9EYXRhVmFsdWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT2JqZWN0VmFsdWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRV9fT0JKRUNUX1ZBTFVFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnNpb25WYWx1ZV9PYmplY3RWYWx1ZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLX0gLy8gWG1sQ29udmVyc2lvblZhbHVlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NjE1MDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEN1c3RvbUNvbnZlcnRlcjwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyI2dldENsYXNzTmFtZSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbENvbnZlcnRlciBleHRlbmRzIFhtbE5hbWVkQ29udmVydGVyCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzTmFtZSgpIDxlbT5DbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc05hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX05BTUVfRURFRkFVTFQgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzTmFtZSgpIDxlbT5DbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc05hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lID0gQ0xBU1NfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDb252ZXJ0ZXIoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9DT05WRVJURVI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDbGFzc05hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyX0NsYXNzTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpCi0JewotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyI2dldENsYXNzTmFtZSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2xhc3NOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBuZXdDbGFzc05hbWUpCi0JewotCQlTdHJpbmcgb2xkQ2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQljbGFzc05hbWUgPSBuZXdDbGFzc05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX19DTEFTU19OQU1FLCBvbGRDbGFzc05hbWUsIGNsYXNzTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9fQ0xBU1NfTkFNRToKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9fQ0xBU1NfTkFNRToKLQkJCQlzZXRDbGFzc05hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9fQ0xBU1NfTkFNRToKLQkJCQlzZXRDbGFzc05hbWUoQ0xBU1NfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfX0NMQVNTX05BTUU6Ci0JCQkJcmV0dXJuIENMQVNTX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGNsYXNzTmFtZSAhPSBudWxsIDogIUNMQVNTX05BTUVfRURFRkFVTFQuZXF1YWxzKGNsYXNzTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNsYXNzTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2xhc3NOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuQ09OVkVSVEVSX19DTEFTUyk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5ULCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2xhc3NUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlRFUl9fQ0xBU1MsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyX0NsYXNzTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lRWRpdChJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvcmlnaW5hbE5hbWUgPSBvcmlnaW5hbFR5cGUuZ2V0VHlwZVF1YWxpZmllZE5hbWUoKTsKLQkJaW50IG5hbWVJbmRleCA9IHRoaXMuY2xhc3NOYW1lLmxhc3RJbmRleE9mKG9yaWdpbmFsTmFtZSk7Ci0JCWludCBvZmZzZXQgPSBnZXRBdHRyaWJ1dGVOb2RlKEVjbGlwc2VMaW5rLkNPTlZFUlRFUl9fQ0xBU1MpLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKSArIDE7IC8vICsxID0gb3BlbmluZyBkb3VibGUgcXVvdGUKLQkJcmV0dXJuIG5ldyBSZXBsYWNlRWRpdChvZmZzZXQgKyBuYW1lSW5kZXgsIG9yaWdpbmFsTmFtZS5sZW5ndGgoKSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KFN0cmluZyBuZXdQYWNrYWdlTmFtZSkgewotCQlpbnQgcGFja2FnZUxlbmd0aCA9IHRoaXMuY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChuZXdQYWNrYWdlTmFtZSA9PSAiIikgey8vJE5PTi1OTFMtMSQKLQkJCS8vbW92aW5nIHRvIHRoZSBkZWZhdWx0IHBhY2thZ2UsIHJlbW92ZSB0aGUgJy4nCi0JCQlwYWNrYWdlTGVuZ3RoKys7Ci0JCX0KLQkJaWYgKHBhY2thZ2VMZW5ndGggPT0gLTEpIHsKLQkJCS8vbW92aW5nIGZyb20gdGhlIGRlZmF1bHQgcGFja2FnZSBvciB1bnNwZWNpZmllZCBwYWNrYWdlCi0JCQlwYWNrYWdlTGVuZ3RoID0gMDsKLQkJCW5ld1BhY2thZ2VOYW1lID0gbmV3UGFja2FnZU5hbWUgKyAnLic7Ci0JCX0KLQkJaW50IG9mZnNldCA9IGdldEF0dHJpYnV0ZU5vZGUoRWNsaXBzZUxpbmsuQ09OVkVSVEVSX19DTEFTUykuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsgLy8gKzEgPSBvcGVuaW5nIGRvdWJsZSBxdW90ZQotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCwgcGFja2FnZUxlbmd0aCwgbmV3UGFja2FnZU5hbWUpOwotCX0KLQotfSAvLyBYbWxDb252ZXJ0ZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJ0ZXJDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJ0ZXJDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdmYTgzYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVydGVyQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDb252ZXJ0ZXIgQ29udGFpbmVyPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJDb250YWluZXIjZ2V0Q29udmVydGVycyA8ZW0+Q29udmVydGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJDb250YWluZXIjZ2V0VHlwZUNvbnZlcnRlcnMgPGVtPlR5cGUgQ29udmVydGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJDb250YWluZXIjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyQ29udGFpbmVyI2dldFN0cnVjdENvbnZlcnRlcnMgPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJDb250YWluZXIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbENvbnZlcnRlckNvbnRhaW5lciBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxDb252ZXJ0ZXI+IGdldENvbnZlcnRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfVHlwZUNvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4gZ2V0VHlwZUNvbnZlcnRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckNvbnRhaW5lcl9TdHJ1Y3RDb252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4gZ2V0U3RydWN0Q29udmVydGVycygpOwotCi19IC8vIFhtbENvbnZlcnRlckNvbnRhaW5lcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbnZlcnRpYmxlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbnZlcnRpYmxlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWY3YjY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJ0aWJsZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENvbnZlcnRpYmxlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyNnZXRDb252ZXJ0IDxlbT5Db252ZXJ0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbENvbnZlcnRpYmxlTWFwcGluZyBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udmVydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb252ZXJ0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Db252ZXJ0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb252ZXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyNnZXRDb252ZXJ0IDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb252ZXJ0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgY29udmVydCBlbGVtZW50LiAgSWYgdGhlIGNvbnZlcnQgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgbWFwcGluZyBlbGVtZW50LgotCSAqLwotCVRleHRSYW5nZSBnZXRDb252ZXJ0VGV4dFJhbmdlKCk7Ci0KLQlib29sZWFuIGNvbnZlcnRUb3VjaGVzKGludCBwb3MpOwotCi19IC8vIFhtbENvbnZlcnRpYmxlTWFwcGluZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvcHlQb2xpY3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb3B5UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMjFiNDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvcHlQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENvcHkgUG9saWN5PC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvcHlQb2xpY3kjZ2V0Q2xhc3NfIDxlbT5DbGFzczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29weVBvbGljeSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxDb3B5UG9saWN5IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc18oKSA8ZW0+Q2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsYXNzXygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NfKCkgPGVtPkNsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc18oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NfID0gQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ29weVBvbGljeSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0NPUFlfUE9MSUNZOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29weVBvbGljeV9DbGFzcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzXygpCi0JewotCQlyZXR1cm4gY2xhc3NfOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29weVBvbGljeSNnZXRDbGFzc18gPGVtPkNsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2xhc3NfKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xhc3MoU3RyaW5nIG5ld0NsYXNzKQotCXsKLQkJU3RyaW5nIG9sZENsYXNzID0gY2xhc3NfOwotCQljbGFzc18gPSBuZXdDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT1BZX1BPTElDWV9fQ0xBU1MsIG9sZENsYXNzLCBjbGFzc18pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT1BZX1BPTElDWV9fQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldENsYXNzXygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT1BZX1BPTElDWV9fQ0xBU1M6Ci0JCQkJc2V0Q2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPUFlfUE9MSUNZX19DTEFTUzoKLQkJCQlzZXRDbGFzcyhDTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT1BZX1BPTElDWV9fQ0xBU1M6Ci0JCQkJcmV0dXJuIENMQVNTX0VERUZBVUxUID09IG51bGwgPyBjbGFzc18gIT0gbnVsbCA6ICFDTEFTU19FREVGQVVMVC5lcXVhbHMoY2xhc3NfKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY2xhc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNsYXNzXyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZENsYXNzVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPUFlfUE9MSUNZX19DTEFTUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb3B5UG9saWN5X0NsYXNzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotfSAvLyBYbWxDb3B5UG9saWN5CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ3VzdG9taXplci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEN1c3RvbWl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljMzU0Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ3VzdG9taXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEN1c3RvbWl6ZXI8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVyI2dldEN1c3RvbWl6ZXJDbGFzc05hbWUgPGVtPkN1c3RvbWl6ZXIgQ2xhc3MgTmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ3VzdG9taXplcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxDdXN0b21pemVyIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkgPGVtPkN1c3RvbWl6ZXIgQ2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VzdG9taXplckNsYXNzTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NSVpFUl9DTEFTU19OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1c3RvbWl6ZXJDbGFzc05hbWUoKSA8ZW0+Q3VzdG9taXplciBDbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGN1c3RvbWl6ZXJDbGFzc05hbWUgPSBDVVNUT01JWkVSX0NMQVNTX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ3VzdG9taXplcigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0NVU1RPTUlaRVI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3VzdG9taXplciBDbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DdXN0b21pemVyIENsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplciBDbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDdXN0b21pemVyQ2xhc3NOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEN1c3RvbWl6ZXJfQ3VzdG9taXplckNsYXNzTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1c3RvbWl6ZXJDbGFzc05hbWUoKQotCXsKLQkJcmV0dXJuIGN1c3RvbWl6ZXJDbGFzc05hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVyI2dldEN1c3RvbWl6ZXJDbGFzc05hbWUgPGVtPkN1c3RvbWl6ZXIgQ2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplciBDbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VzdG9taXplckNsYXNzTmFtZShTdHJpbmcgbmV3Q3VzdG9taXplckNsYXNzTmFtZSkKLQl7Ci0JCVN0cmluZyBvbGRDdXN0b21pemVyQ2xhc3NOYW1lID0gY3VzdG9taXplckNsYXNzTmFtZTsKLQkJY3VzdG9taXplckNsYXNzTmFtZSA9IG5ld0N1c3RvbWl6ZXJDbGFzc05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ1VTVE9NSVpFUl9fQ1VTVE9NSVpFUl9DTEFTU19OQU1FLCBvbGRDdXN0b21pemVyQ2xhc3NOYW1lLCBjdXN0b21pemVyQ2xhc3NOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ1VTVE9NSVpFUl9fQ1VTVE9NSVpFUl9DTEFTU19OQU1FOgotCQkJCXJldHVybiBnZXRDdXN0b21pemVyQ2xhc3NOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NVU1RPTUlaRVJfX0NVU1RPTUlaRVJfQ0xBU1NfTkFNRToKLQkJCQlzZXRDdXN0b21pemVyQ2xhc3NOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DVVNUT01JWkVSX19DVVNUT01JWkVSX0NMQVNTX05BTUU6Ci0JCQkJc2V0Q3VzdG9taXplckNsYXNzTmFtZShDVVNUT01JWkVSX0NMQVNTX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ1VTVE9NSVpFUl9fQ1VTVE9NSVpFUl9DTEFTU19OQU1FOgotCQkJCXJldHVybiBDVVNUT01JWkVSX0NMQVNTX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGN1c3RvbWl6ZXJDbGFzc05hbWUgIT0gbnVsbCA6ICFDVVNUT01JWkVSX0NMQVNTX05BTUVfRURFRkFVTFQuZXF1YWxzKGN1c3RvbWl6ZXJDbGFzc05hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjdXN0b21pemVyQ2xhc3NOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjdXN0b21pemVyQ2xhc3NOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIFhtbEN1c3RvbWl6ZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDdXN0b21pemVySG9sZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ3VzdG9taXplckhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTM0OTc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDdXN0b21pemVySG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xhc3NSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDdXN0b21pemVyIEhvbGRlcjwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplckhvbGRlciNnZXRDdXN0b21pemVyIDxlbT5DdXN0b21pemVyPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDdXN0b21pemVySG9sZGVyKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxDdXN0b21pemVySG9sZGVyIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkN1c3RvbWl6ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1c3RvbWl6ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q3VzdG9taXplcihYbWxDbGFzc1JlZmVyZW5jZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEN1c3RvbWl6ZXJIb2xkZXJfQ3VzdG9taXplcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxDbGFzc1JlZmVyZW5jZSBnZXRDdXN0b21pemVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXJIb2xkZXIjZ2V0Q3VzdG9taXplciA8ZW0+Q3VzdG9taXplcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q3VzdG9taXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3VzdG9taXplcihYbWxDbGFzc1JlZmVyZW5jZSB2YWx1ZSk7Ci0KLX0gLy8gWG1sQ3VzdG9taXplckhvbGRlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbERpcmVjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbERpcmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2M3ODAxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxEaXJlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5YbWwgRGlyZWN0aW9uPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICoKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxEaXJlY3Rpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIFhtbERpcmVjdGlvbiBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTl9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUlOKDAsICJJTiIsICJJTiIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+T1VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI09VVF9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCU9VVCgxLCAiT1VUIiwgIk9VVCIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU4gT1VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lOX09VVF9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUlOX09VVCgyLCAiSU5fT1VUIiwgIklOX09VVCIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+T1VUIENVUlNPUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNPVVRfQ1VSU09SX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JT1VUX0NVUlNPUigzLCAiT1VUX0NVUlNPUiIsICJPVVRfQ1VSU09SIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU4KLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk9VVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNPVVQKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRfVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU4gT1VUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTiBPVVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5fT1VUCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fT1VUX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9VVCBDVVJTT1I8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk9VVCBDVVJTT1I8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjT1VUX0NVUlNPUgotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVF9DVVJTT1JfVkFMVUUgPSAzOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlhtbCBEaXJlY3Rpb248L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFhtbERpcmVjdGlvbltdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBYbWxEaXJlY3Rpb25bXQotCQl7Ci0JCQlJTiwKLQkJCU9VVCwKLQkJCUlOX09VVCwKLQkJCU9VVF9DVVJTT1IsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIERpcmVjdGlvbjwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFhtbERpcmVjdGlvbj4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgRGlyZWN0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWG1sRGlyZWN0aW9uIGdldChTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlYbWxEaXJlY3Rpb24gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIERpcmVjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhtbERpcmVjdGlvbiBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJWG1sRGlyZWN0aW9uIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIERpcmVjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhtbERpcmVjdGlvbiBnZXQoaW50IHZhbHVlKQotCXsKLQkJc3dpdGNoICh2YWx1ZSkKLQkJewotCQkJY2FzZSBJTl9WQUxVRTogcmV0dXJuIElOOwotCQkJY2FzZSBPVVRfVkFMVUU6IHJldHVybiBPVVQ7Ci0JCQljYXNlIElOX09VVF9WQUxVRTogcmV0dXJuIElOX09VVDsKLQkJCWNhc2UgT1VUX0NVUlNPUl9WQUxVRTogcmV0dXJuIE9VVF9DVVJTT1I7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFhtbERpcmVjdGlvbihpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkKLQl7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JICByZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKQotCXsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci0JCi19IC8vWG1sRGlyZWN0aW9uCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRWxlbWVudENvbGxlY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbGVtZW50Q29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWQ2NjE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbGVtZW50Q29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5FbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmsyXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSGFzaFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxVbmlvblBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmsyXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmsyXzQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfNDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRWxlbWVudCBDb2xsZWN0aW9uPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEVsZW1lbnRDb2xsZWN0aW9uIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiBpbXBsZW1lbnRzIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCwgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xLCBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIsIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMywgWG1sRWxlbWVudENvbGxlY3Rpb25fMl80Ci17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdHRyaWJ1dGVUeXBlID0gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydCgpIDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnQoKSA8ZW0+Q29udmVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0ID0gQ09OVkVSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgPGVtPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gbWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0ZXJzKCkgPGVtPkNvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbENvbnZlcnRlcj4gY29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVDb252ZXJ0ZXJzKCkgPGVtPlR5cGUgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlQ29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+IHR5cGVDb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPYmplY3RUeXBlQ29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+IG9iamVjdFR5cGVDb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RydWN0Q29udmVydGVycygpIDxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPiBzdHJ1Y3RDb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcEtleUNvbnZlcnQoKSA8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBLZXlDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5Q29udmVydCgpIDxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcEtleUNvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFwS2V5Q29udmVydCA9IE1BUF9LRVlfQ09OVkVSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFhtbEpvaW5GZXRjaFR5cGUgSk9JTl9GRVRDSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKb2luRmV0Y2goKSA8ZW0+Sm9pbiBGZXRjaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Sm9pbkZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSm9pbkZldGNoVHlwZSBqb2luRmV0Y2ggPSBKT0lOX0ZFVENIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmF0Y2hGZXRjaCgpIDxlbT5CYXRjaCBGZXRjaDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmF0Y2hGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEJhdGNoRmV0Y2ggYmF0Y2hGZXRjaDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnRpdGlvbmluZygpIDxlbT5QYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFBhcnRpdGlvbmluZ18yXzIgcGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKSA8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiByZXBsaWNhdGlvblBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKSA8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBpbm5lZFBhcnRpdGlvbmluZygpIDxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIHBpbm5lZFBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkgPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgcmFuZ2VQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpIDxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIHZhbHVlUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFzaFBhcnRpdGlvbmluZygpIDxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFzaFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIGhhc2hQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbmlvblBhcnRpdGlvbmluZygpIDxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIHVuaW9uUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnRpdGlvbmVkKCkgPGVtPlBhcnRpdGlvbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVElUSU9ORURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydGl0aW9uZWQoKSA8ZW0+UGFydGl0aW9uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcnRpdGlvbmVkID0gUEFSVElUSU9ORURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBDQVNDQURFX09OX0RFTEVURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXNjYWRlT25EZWxldGUoKSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhc2NhZGVPbkRlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gY2FzY2FkZU9uRGVsZXRlID0gQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNOb25jYWNoZWFibGUoKSA8ZW0+Tm9uY2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc05vbmNhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE5PTkNBQ0hFQUJMRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNOb25jYWNoZWFibGUoKSA8ZW0+Tm9uY2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc05vbmNhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbm9uY2FjaGVhYmxlID0gTk9OQ0FDSEVBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbXBvc2l0ZU1lbWJlcigpIDxlbT5Db21wb3NpdGUgTWVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb21wb3NpdGVNZW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPU0lURV9NRU1CRVJfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tcG9zaXRlTWVtYmVyKCkgPGVtPkNvbXBvc2l0ZSBNZW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbXBvc2l0ZU1lbWJlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb21wb3NpdGVNZW1iZXIgPSBDT01QT1NJVEVfTUVNQkVSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGVsZXRlQWxsKCkgPGVtPkRlbGV0ZSBBbGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRGVsZXRlQWxsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVMRVRFX0FMTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEZWxldGVBbGwoKSA8ZW0+RGVsZXRlIEFsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEZWxldGVBbGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRlbGV0ZUFsbCA9IERFTEVURV9BTExfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sRWxlbWVudENvbGxlY3Rpb24oKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9FTEVNRU5UX0NPTExFQ1RJT047Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7Ci0JCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFMsIG9sZEFjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCi0JewotCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpCi0JewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQl7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByb3BlcnR5PihYbWxQcm9wZXJ0eS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29udmVydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfQ29udmVydCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnQoKQotCXsKLQkJcmV0dXJuIGNvbnZlcnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRDb252ZXJ0IDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udmVydChTdHJpbmcgbmV3Q29udmVydCkKLQl7Ci0JCVN0cmluZyBvbGRDb252ZXJ0ID0gY29udmVydDsKLQkJY29udmVydCA9IG5ld0NvbnZlcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJULCBvbGRDb252ZXJ0LCBjb252ZXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wX01hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiBnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpCi0JewotCQlpZiAobWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMgPT0gbnVsbCkKLQkJewotCQkJbWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4oWG1sQXNzb2NpYXRpb25PdmVycmlkZS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJfQotCQlyZXR1cm4gbWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBDb252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYXBLZXlDb252ZXJ0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMF9NYXBLZXlDb252ZXJ0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwS2V5Q29udmVydCgpCi0JewotCQlyZXR1cm4gbWFwS2V5Q29udmVydDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldE1hcEtleUNvbnZlcnQgPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYXBLZXlDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFwS2V5Q29udmVydChTdHJpbmcgbmV3TWFwS2V5Q29udmVydCkKLQl7Ci0JCVN0cmluZyBvbGRNYXBLZXlDb252ZXJ0ID0gbWFwS2V5Q29udmVydDsKLQkJbWFwS2V5Q29udmVydCA9IG5ld01hcEtleUNvbnZlcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NPTlZFUlQsIG9sZE1hcEtleUNvbnZlcnQsIG1hcEtleUNvbnZlcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIEZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKLQkgKiBAc2VlICNzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEpvaW5GZXRjaF9Kb2luRmV0Y2goKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSm9pbkZldGNoVHlwZSBnZXRKb2luRmV0Y2goKQotCXsKLQkJcmV0dXJuIGpvaW5GZXRjaDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldEpvaW5GZXRjaCA8ZW0+Sm9pbiBGZXRjaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKLQkgKiBAc2VlICNnZXRKb2luRmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSBuZXdKb2luRmV0Y2gpCi0JewotCQlYbWxKb2luRmV0Y2hUeXBlIG9sZEpvaW5GZXRjaCA9IGpvaW5GZXRjaDsKLQkJam9pbkZldGNoID0gbmV3Sm9pbkZldGNoID09IG51bGwgPyBKT0lOX0ZFVENIX0VERUZBVUxUIDogbmV3Sm9pbkZldGNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fSk9JTl9GRVRDSCwgb2xkSm9pbkZldGNoLCBqb2luRmV0Y2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2g8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2g8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEJhdGNoRmV0Y2goWG1sQmF0Y2hGZXRjaCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhdGNoRmV0Y2hIb2xkZXJfQmF0Y2hGZXRjaCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQmF0Y2hGZXRjaCBnZXRCYXRjaEZldGNoKCkKLQl7Ci0JCXJldHVybiBiYXRjaEZldGNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEJhdGNoRmV0Y2goWG1sQmF0Y2hGZXRjaCBuZXdCYXRjaEZldGNoLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQmF0Y2hGZXRjaCBvbGRCYXRjaEZldGNoID0gYmF0Y2hGZXRjaDsKLQkJYmF0Y2hGZXRjaCA9IG5ld0JhdGNoRmV0Y2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19CQVRDSF9GRVRDSCwgb2xkQmF0Y2hGZXRjaCwgbmV3QmF0Y2hGZXRjaCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRCYXRjaEZldGNoIDxlbT5CYXRjaCBGZXRjaDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2g8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEJhdGNoRmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXRjaEZldGNoKFhtbEJhdGNoRmV0Y2ggbmV3QmF0Y2hGZXRjaCkKLQl7Ci0JCWlmIChuZXdCYXRjaEZldGNoICE9IGJhdGNoRmV0Y2gpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGJhdGNoRmV0Y2ggIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYmF0Y2hGZXRjaCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19CQVRDSF9GRVRDSCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QmF0Y2hGZXRjaCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdCYXRjaEZldGNoKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0JBVENIX0ZFVENILCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEJhdGNoRmV0Y2gobmV3QmF0Y2hGZXRjaCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQkFUQ0hfRkVUQ0gsIG5ld0JhdGNoRmV0Y2gsIG5ld0JhdGNoRmV0Y2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgpCi0JewotCQlyZXR1cm4gYXR0cmlidXRlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIG5ld0F0dHJpYnV0ZVR5cGUpCi0JewotCQlTdHJpbmcgb2xkQXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGU7Ci0JCWF0dHJpYnV0ZVR5cGUgPSBuZXdBdHRyaWJ1dGVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVRUUklCVVRFX1RZUEUsIG9sZEF0dHJpYnV0ZVR5cGUsIGF0dHJpYnV0ZVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBhcnRpdGlvbmluZyhYbWxQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGFydGl0aW9uaW5nXzJfMiBnZXRQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQYXJ0aXRpb25pbmcoWG1sUGFydGl0aW9uaW5nXzJfMiBuZXdQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxQYXJ0aXRpb25pbmdfMl8yIG9sZFBhcnRpdGlvbmluZyA9IHBhcnRpdGlvbmluZzsKLQkJcGFydGl0aW9uaW5nID0gbmV3UGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUEFSVElUSU9OSU5HLCBvbGRQYXJ0aXRpb25pbmcsIG5ld1BhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRQYXJ0aXRpb25pbmcgPGVtPlBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0aXRpb25pbmcoWG1sUGFydGl0aW9uaW5nXzJfMiBuZXdQYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3UGFydGl0aW9uaW5nICE9IHBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1BhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBhcnRpdGlvbmluZyhuZXdQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BBUlRJVElPTklORywgbmV3UGFydGl0aW9uaW5nLCBuZXdQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9SZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIGdldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiByZXBsaWNhdGlvblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgb2xkUmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPSByZXBsaWNhdGlvblBhcnRpdGlvbmluZzsKLQkJcmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPSBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORywgb2xkUmVwbGljYXRpb25QYXJ0aXRpb25pbmcsIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nIDxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gcmVwbGljYXRpb25QYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9Sb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiBnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiByb3VuZFJvYmluUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIG9sZFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgPSByb3VuZFJvYmluUGFydGl0aW9uaW5nOwotCQlyb3VuZFJvYmluUGFydGl0aW9uaW5nID0gbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JPVU5EX1JPQklOX1BBUlRJVElPTklORywgb2xkUm91bmRSb2JpblBhcnRpdGlvbmluZywgbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nIDxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpcm91bmRSb2JpblBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBpbm5lZFBhcnRpdGlvbmluZyhYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1Bpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHBpbm5lZFBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBuZXdQaW5uZWRQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIG9sZFBpbm5lZFBhcnRpdGlvbmluZyA9IHBpbm5lZFBhcnRpdGlvbmluZzsKLQkJcGlubmVkUGFydGl0aW9uaW5nID0gbmV3UGlubmVkUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUElOTkVEX1BBUlRJVElPTklORywgb2xkUGlubmVkUGFydGl0aW9uaW5nLCBuZXdQaW5uZWRQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0UGlubmVkUGFydGl0aW9uaW5nIDxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQaW5uZWRQYXJ0aXRpb25pbmcoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBuZXdQaW5uZWRQYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3UGlubmVkUGFydGl0aW9uaW5nICE9IHBpbm5lZFBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocGlubmVkUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBpbm5lZFBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QSU5ORURfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQaW5uZWRQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UGlubmVkUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BJTk5FRF9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UGlubmVkUGFydGl0aW9uaW5nKG5ld1Bpbm5lZFBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUElOTkVEX1BBUlRJVElPTklORywgbmV3UGlubmVkUGFydGl0aW9uaW5nLCBuZXdQaW5uZWRQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJhbmdlUGFydGl0aW9uaW5nKFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9SYW5nZVBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIGdldFJhbmdlUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiByYW5nZVBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSYW5nZVBhcnRpdGlvbmluZyhYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgbmV3UmFuZ2VQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgb2xkUmFuZ2VQYXJ0aXRpb25pbmcgPSByYW5nZVBhcnRpdGlvbmluZzsKLQkJcmFuZ2VQYXJ0aXRpb25pbmcgPSBuZXdSYW5nZVBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JBTkdFX1BBUlRJVElPTklORywgb2xkUmFuZ2VQYXJ0aXRpb25pbmcsIG5ld1JhbmdlUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldFJhbmdlUGFydGl0aW9uaW5nIDxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSYW5nZVBhcnRpdGlvbmluZyhYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgbmV3UmFuZ2VQYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3UmFuZ2VQYXJ0aXRpb25pbmcgIT0gcmFuZ2VQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJhbmdlUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJhbmdlUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JBTkdFX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmFuZ2VQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmFuZ2VQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUkFOR0VfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJhbmdlUGFydGl0aW9uaW5nKG5ld1JhbmdlUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19SQU5HRV9QQVJUSVRJT05JTkcsIG5ld1JhbmdlUGFydGl0aW9uaW5nLCBuZXdSYW5nZVBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VmFsdWVQYXJ0aXRpb25pbmcoWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1ZhbHVlUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHZhbHVlUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiBuZXdWYWx1ZVBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiBvbGRWYWx1ZVBhcnRpdGlvbmluZyA9IHZhbHVlUGFydGl0aW9uaW5nOwotCQl2YWx1ZVBhcnRpdGlvbmluZyA9IG5ld1ZhbHVlUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVkFMVUVfUEFSVElUSU9OSU5HLCBvbGRWYWx1ZVBhcnRpdGlvbmluZywgbmV3VmFsdWVQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0VmFsdWVQYXJ0aXRpb25pbmcgPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiBuZXdWYWx1ZVBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdWYWx1ZVBhcnRpdGlvbmluZyAhPSB2YWx1ZVBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodmFsdWVQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdmFsdWVQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVkFMVUVfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdWYWx1ZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdWYWx1ZVBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19WQUxVRV9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VmFsdWVQYXJ0aXRpb25pbmcobmV3VmFsdWVQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1ZBTFVFX1BBUlRJVElPTklORywgbmV3VmFsdWVQYXJ0aXRpb25pbmcsIG5ld1ZhbHVlUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRIYXNoUGFydGl0aW9uaW5nKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX0hhc2hQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIGdldEhhc2hQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIGhhc2hQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SGFzaFBhcnRpdGlvbmluZyhYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBuZXdIYXNoUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgb2xkSGFzaFBhcnRpdGlvbmluZyA9IGhhc2hQYXJ0aXRpb25pbmc7Ci0JCWhhc2hQYXJ0aXRpb25pbmcgPSBuZXdIYXNoUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fSEFTSF9QQVJUSVRJT05JTkcsIG9sZEhhc2hQYXJ0aXRpb25pbmcsIG5ld0hhc2hQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0SGFzaFBhcnRpdGlvbmluZyA8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRIYXNoUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFzaFBhcnRpdGlvbmluZyhYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBuZXdIYXNoUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld0hhc2hQYXJ0aXRpb25pbmcgIT0gaGFzaFBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoaGFzaFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCloYXNoUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0hBU0hfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdIYXNoUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0hhc2hQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fSEFTSF9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SGFzaFBhcnRpdGlvbmluZyhuZXdIYXNoUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19IQVNIX1BBUlRJVElPTklORywgbmV3SGFzaFBhcnRpdGlvbmluZywgbmV3SGFzaFBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuaW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VW5pb25QYXJ0aXRpb25pbmcoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1VuaW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgZ2V0VW5pb25QYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHVuaW9uUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFVuaW9uUGFydGl0aW9uaW5nKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiBuZXdVbmlvblBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiBvbGRVbmlvblBhcnRpdGlvbmluZyA9IHVuaW9uUGFydGl0aW9uaW5nOwotCQl1bmlvblBhcnRpdGlvbmluZyA9IG5ld1VuaW9uUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVU5JT05fUEFSVElUSU9OSU5HLCBvbGRVbmlvblBhcnRpdGlvbmluZywgbmV3VW5pb25QYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0VW5pb25QYXJ0aXRpb25pbmcgPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRVbmlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuaW9uUGFydGl0aW9uaW5nKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiBuZXdVbmlvblBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdVbmlvblBhcnRpdGlvbmluZyAhPSB1bmlvblBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodW5pb25QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdW5pb25QYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVU5JT05fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdVbmlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdVbmlvblBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19VTklPTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VW5pb25QYXJ0aXRpb25pbmcobmV3VW5pb25QYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1VOSU9OX1BBUlRJVElPTklORywgbmV3VW5pb25QYXJ0aXRpb25pbmcsIG5ld1VuaW9uUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFydGl0aW9uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJ0aXRpb25lZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGFydGl0aW9uZWQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25lZCgpCi0JewotCQlyZXR1cm4gcGFydGl0aW9uZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRQYXJ0aXRpb25lZCA8ZW0+UGFydGl0aW9uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnRpdGlvbmVkKFN0cmluZyBuZXdQYXJ0aXRpb25lZCkKLQl7Ci0JCVN0cmluZyBvbGRQYXJ0aXRpb25lZCA9IHBhcnRpdGlvbmVkOwotCQlwYXJ0aXRpb25lZCA9IG5ld1BhcnRpdGlvbmVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUEFSVElUSU9ORUQsIG9sZFBhcnRpdGlvbmVkLCBwYXJ0aXRpb25lZCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzJfQ2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRDYXNjYWRlT25EZWxldGUoKQotCXsKLQkJcmV0dXJuIGNhc2NhZGVPbkRlbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldENhc2NhZGVPbkRlbGV0ZSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlT25EZWxldGUoQm9vbGVhbiBuZXdDYXNjYWRlT25EZWxldGUpCi0JewotCQlCb29sZWFuIG9sZENhc2NhZGVPbkRlbGV0ZSA9IGNhc2NhZGVPbkRlbGV0ZTsKLQkJY2FzY2FkZU9uRGVsZXRlID0gbmV3Q2FzY2FkZU9uRGVsZXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ0FTQ0FERV9PTl9ERUxFVEUsIG9sZENhc2NhZGVPbkRlbGV0ZSwgY2FzY2FkZU9uRGVsZXRlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm9uY2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ob25jYWNoZWFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm9uY2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROb25jYWNoZWFibGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMl9Ob25jYWNoZWFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm9uY2FjaGVhYmxlKCkKLQl7Ci0JCXJldHVybiBub25jYWNoZWFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNpc05vbmNhY2hlYWJsZSA8ZW0+Tm9uY2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob25jYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzTm9uY2FjaGVhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9uY2FjaGVhYmxlKGJvb2xlYW4gbmV3Tm9uY2FjaGVhYmxlKQotCXsKLQkJYm9vbGVhbiBvbGROb25jYWNoZWFibGUgPSBub25jYWNoZWFibGU7Ci0JCW5vbmNhY2hlYWJsZSA9IG5ld05vbmNhY2hlYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX05PTkNBQ0hFQUJMRSwgb2xkTm9uY2FjaGVhYmxlLCBub25jYWNoZWFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21wb3NpdGUgTWVtYmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21wb3NpdGUgTWVtYmVyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbXBvc2l0ZSBNZW1iZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbXBvc2l0ZU1lbWJlcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzNfQ29tcG9zaXRlTWVtYmVyKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9zaXRlTWVtYmVyKCkKLQl7Ci0JCXJldHVybiBjb21wb3NpdGVNZW1iZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRDb21wb3NpdGVNZW1iZXIgPGVtPkNvbXBvc2l0ZSBNZW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbXBvc2l0ZSBNZW1iZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbXBvc2l0ZU1lbWJlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbXBvc2l0ZU1lbWJlcihTdHJpbmcgbmV3Q29tcG9zaXRlTWVtYmVyKQotCXsKLQkJU3RyaW5nIG9sZENvbXBvc2l0ZU1lbWJlciA9IGNvbXBvc2l0ZU1lbWJlcjsKLQkJY29tcG9zaXRlTWVtYmVyID0gbmV3Q29tcG9zaXRlTWVtYmVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09NUE9TSVRFX01FTUJFUiwgb2xkQ29tcG9zaXRlTWVtYmVyLCBjb21wb3NpdGVNZW1iZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWxldGUgQWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWxldGUgQWxsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlbGV0ZSBBbGw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlbGV0ZUFsbChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl80X0RlbGV0ZUFsbCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWxldGVBbGwoKQotCXsKLQkJcmV0dXJuIGRlbGV0ZUFsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2lzRGVsZXRlQWxsIDxlbT5EZWxldGUgQWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWxldGUgQWxsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0RlbGV0ZUFsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlbGV0ZUFsbChib29sZWFuIG5ld0RlbGV0ZUFsbCkKLQl7Ci0JCWJvb2xlYW4gb2xkRGVsZXRlQWxsID0gZGVsZXRlQWxsOwotCQlkZWxldGVBbGwgPSBuZXdEZWxldGVBbGw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19ERUxFVEVfQUxMLCBvbGREZWxldGVBbGwsIGRlbGV0ZUFsbCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckNvbnRhaW5lcl9Db252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxDb252ZXJ0ZXI+IGdldENvbnZlcnRlcnMoKQotCXsKLQkJaWYgKGNvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJY29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxDb252ZXJ0ZXI+KFhtbENvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiBjb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfVHlwZUNvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+IGdldFR5cGVDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmICh0eXBlQ29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQl0eXBlQ29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxUeXBlQ29udmVydGVyPihYbWxUeXBlQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gdHlwZUNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckNvbnRhaW5lcl9PYmplY3RUeXBlQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCXsKLQkJaWYgKG9iamVjdFR5cGVDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCW9iamVjdFR5cGVDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+KFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1N0cnVjdENvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4gZ2V0U3RydWN0Q29udmVydGVycygpCi0JewotCQlpZiAoc3RydWN0Q29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQlzdHJ1Y3RDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4oWG1sU3RydWN0Q29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fU1RSVUNUX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VHlwZUNvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3RydWN0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19CQVRDSF9GRVRDSDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRCYXRjaEZldGNoKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UmFuZ2VQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19WQUxVRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VmFsdWVQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRIYXNoUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFVuaW9uUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlVHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVDoKLQkJCQlyZXR1cm4gZ2V0Q29udmVydCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIGdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRPYmplY3RUeXBlQ29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldFN0cnVjdENvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09OVkVSVDoKLQkJCQlyZXR1cm4gZ2V0TWFwS2V5Q29udmVydCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fSk9JTl9GRVRDSDoKLQkJCQlyZXR1cm4gZ2V0Sm9pbkZldGNoKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19CQVRDSF9GRVRDSDoKLQkJCQlyZXR1cm4gZ2V0QmF0Y2hGZXRjaCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UGlubmVkUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFJhbmdlUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19WQUxVRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFZhbHVlUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0SGFzaFBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRVbmlvblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUEFSVElUSU9ORUQ6Ci0JCQkJcmV0dXJuIGdldFBhcnRpdGlvbmVkKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DQVNDQURFX09OX0RFTEVURToKLQkJCQlyZXR1cm4gZ2V0Q2FzY2FkZU9uRGVsZXRlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19OT05DQUNIRUFCTEU6Ci0JCQkJcmV0dXJuIGlzTm9uY2FjaGVhYmxlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT01QT1NJVEVfTUVNQkVSOgotCQkJCXJldHVybiBnZXRDb21wb3NpdGVNZW1iZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0RFTEVURV9BTEw6Ci0JCQkJcmV0dXJuIGlzRGVsZXRlQWxsKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVDoKLQkJCQlzZXRDb252ZXJ0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCWdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQXNzb2NpYXRpb25PdmVycmlkZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQ29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxPYmplY3RUeXBlQ29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sU3RydWN0Q29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DT05WRVJUOgotCQkJCXNldE1hcEtleUNvbnZlcnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fSk9JTl9GRVRDSDoKLQkJCQlzZXRKb2luRmV0Y2goKFhtbEpvaW5GZXRjaFR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0JBVENIX0ZFVENIOgotCQkJCXNldEJhdGNoRmV0Y2goKFhtbEJhdGNoRmV0Y2gpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BBUlRJVElPTklORzoKLQkJCQlzZXRQYXJ0aXRpb25pbmcoKFhtbFBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlzZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UGlubmVkUGFydGl0aW9uaW5nKChYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UmFuZ2VQYXJ0aXRpb25pbmcoKFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXNldFZhbHVlUGFydGl0aW9uaW5nKChYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXNldEhhc2hQYXJ0aXRpb25pbmcoKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0VW5pb25QYXJ0aXRpb25pbmcoKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUEFSVElUSU9ORUQ6Ci0JCQkJc2V0UGFydGl0aW9uZWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ0FTQ0FERV9PTl9ERUxFVEU6Ci0JCQkJc2V0Q2FzY2FkZU9uRGVsZXRlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19OT05DQUNIRUFCTEU6Ci0JCQkJc2V0Tm9uY2FjaGVhYmxlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT01QT1NJVEVfTUVNQkVSOgotCQkJCXNldENvbXBvc2l0ZU1lbWJlcigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19ERUxFVEVfQUxMOgotCQkJCXNldERlbGV0ZUFsbCgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoQVRUUklCVVRFX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlQ6Ci0JCQkJc2V0Q29udmVydChDT05WRVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSUzoKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09OVkVSVDoKLQkJCQlzZXRNYXBLZXlDb252ZXJ0KE1BUF9LRVlfQ09OVkVSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fSk9JTl9GRVRDSDoKLQkJCQlzZXRKb2luRmV0Y2goSk9JTl9GRVRDSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQkFUQ0hfRkVUQ0g6Ci0JCQkJc2V0QmF0Y2hGZXRjaCgoWG1sQmF0Y2hGZXRjaCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UGFydGl0aW9uaW5nKChYbWxQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlzZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzoKLQkJCQlzZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKChYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXNldFBpbm5lZFBhcnRpdGlvbmluZygoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UmFuZ2VQYXJ0aXRpb25pbmcoKFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19WQUxVRV9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0VmFsdWVQYXJ0aXRpb25pbmcoKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlzZXRIYXNoUGFydGl0aW9uaW5nKChYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0VW5pb25QYXJ0aXRpb25pbmcoKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QQVJUSVRJT05FRDoKLQkJCQlzZXRQYXJ0aXRpb25lZChQQVJUSVRJT05FRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ0FTQ0FERV9PTl9ERUxFVEU6Ci0JCQkJc2V0Q2FzY2FkZU9uRGVsZXRlKENBU0NBREVfT05fREVMRVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19OT05DQUNIRUFCTEU6Ci0JCQkJc2V0Tm9uY2FjaGVhYmxlKE5PTkNBQ0hFQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09NUE9TSVRFX01FTUJFUjoKLQkJCQlzZXRDb21wb3NpdGVNZW1iZXIoQ09NUE9TSVRFX01FTUJFUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fREVMRVRFX0FMTDoKLQkJCQlzZXREZWxldGVBbGwoREVMRVRFX0FMTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJcmV0dXJuIEFUVFJJQlVURV9UWVBFX0VERUZBVUxUID09IG51bGwgPyBhdHRyaWJ1dGVUeXBlICE9IG51bGwgOiAhQVRUUklCVVRFX1RZUEVfRURFRkFVTFQuZXF1YWxzKGF0dHJpYnV0ZVR5cGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVDoKLQkJCQlyZXR1cm4gQ09OVkVSVF9FREVGQVVMVCA9PSBudWxsID8gY29udmVydCAhPSBudWxsIDogIUNPTlZFUlRfRURFRkFVTFQuZXF1YWxzKGNvbnZlcnQpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIG1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzICE9IG51bGwgJiYgIW1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhY29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIW9iamVjdFR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXN0cnVjdENvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DT05WRVJUOgotCQkJCXJldHVybiBNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQgPT0gbnVsbCA/IG1hcEtleUNvbnZlcnQgIT0gbnVsbCA6ICFNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQuZXF1YWxzKG1hcEtleUNvbnZlcnQpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fSk9JTl9GRVRDSDoKLQkJCQlyZXR1cm4gam9pbkZldGNoICE9IEpPSU5fRkVUQ0hfRURFRkFVTFQ7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19CQVRDSF9GRVRDSDoKLQkJCQlyZXR1cm4gYmF0Y2hGZXRjaCAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBwYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcm91bmRSb2JpblBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcGlubmVkUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHJhbmdlUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19WQUxVRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHZhbHVlUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gaGFzaFBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiB1bmlvblBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUEFSVElUSU9ORUQ6Ci0JCQkJcmV0dXJuIFBBUlRJVElPTkVEX0VERUZBVUxUID09IG51bGwgPyBwYXJ0aXRpb25lZCAhPSBudWxsIDogIVBBUlRJVElPTkVEX0VERUZBVUxULmVxdWFscyhwYXJ0aXRpb25lZCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DQVNDQURFX09OX0RFTEVURToKLQkJCQlyZXR1cm4gQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNhc2NhZGVPbkRlbGV0ZSAhPSBudWxsIDogIUNBU0NBREVfT05fREVMRVRFX0VERUZBVUxULmVxdWFscyhjYXNjYWRlT25EZWxldGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTk9OQ0FDSEVBQkxFOgotCQkJCXJldHVybiBub25jYWNoZWFibGUgIT0gTk9OQ0FDSEVBQkxFX0VERUZBVUxUOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09NUE9TSVRFX01FTUJFUjoKLQkJCQlyZXR1cm4gQ09NUE9TSVRFX01FTUJFUl9FREVGQVVMVCA9PSBudWxsID8gY29tcG9zaXRlTWVtYmVyICE9IG51bGwgOiAhQ09NUE9TSVRFX01FTUJFUl9FREVGQVVMVC5lcXVhbHMoY29tcG9zaXRlTWVtYmVyKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0RFTEVURV9BTEw6Ci0JCQkJcmV0dXJuIGRlbGV0ZUFsbCAhPSBERUxFVEVfQUxMX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FUVFJJQlVURV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGlibGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fQ09OVkVSVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfMjBfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19TVFJVQ1RfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fU1RSVUNUX0NPTlZFUlRFUlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DT05WRVJUOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19NQVBfS0VZX0NPTlZFUlQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pbkZldGNoLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fSk9JTl9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9GRVRDSF9fSk9JTl9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXRjaEZldGNoSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQkFUQ0hfRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9fQkFUQ0hfRkVUQ0g7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUElOTkVEX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19SQU5HRV9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JBTkdFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19WQUxVRV9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1ZBTFVFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19IQVNIX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fSEFTSF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVU5JT05fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19VTklPTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUEFSVElUSU9ORUQ6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTkVEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NBU0NBREVfT05fREVMRVRFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIyX19DQVNDQURFX09OX0RFTEVURTsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19OT05DQUNIRUFCTEU6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjJfX05PTkNBQ0hFQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzMuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT01QT1NJVEVfTUVNQkVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIzX19DT01QT1NJVEVfTUVNQkVSOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfNC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0RFTEVURV9BTEw6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjRfX0RFTEVURV9BTEw7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGlibGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0NPTlZFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfMjBfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fU1RSVUNUX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fU1RSVUNUX0NPTlZFUlRFUlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfX01BUF9LRVlfQ09OVkVSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NPTlZFUlQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pbkZldGNoLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fRkVUQ0hfX0pPSU5fRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fSk9JTl9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXRjaEZldGNoSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9fQkFUQ0hfRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQkFUQ0hfRkVUQ0g7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUElOTkVEX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkFOR0VfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JBTkdFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVkFMVUVfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1ZBTFVFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fSEFTSF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fSEFTSF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1VOSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19VTklPTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTkVEOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BBUlRJVElPTkVEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIyX19DQVNDQURFX09OX0RFTEVURTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DQVNDQURFX09OX0RFTEVURTsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMl9fTk9OQ0FDSEVBQkxFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX05PTkNBQ0hFQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzMuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yM19fQ09NUE9TSVRFX01FTUJFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT01QT1NJVEVfTUVNQkVSOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfNC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzI0X19ERUxFVEVfQUxMOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0RFTEVURV9BTEw7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhdHRyaWJ1dGVUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdHRyaWJ1dGVUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb252ZXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb252ZXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtYXBLZXlDb252ZXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYXBLZXlDb252ZXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqb2luRmV0Y2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGpvaW5GZXRjaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFydGl0aW9uZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcnRpdGlvbmVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYXNjYWRlT25EZWxldGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhc2NhZGVPbkRlbGV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbm9uY2FjaGVhYmxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChub25jYWNoZWFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbXBvc2l0ZU1lbWJlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29tcG9zaXRlTWVtYmVyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWxldGVBbGw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlbGV0ZUFsbCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RW51bWVyYXRlZFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEuRU5VTUVSQVRFRCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TG9iVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5MT0IpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRlbXBvcmFsVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5URU1QT1JBTCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29udmVydFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuQ09OVkVSVCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Sm9pbkZldGNoVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZShFY2xpcHNlTGluay5KT0lOX0ZFVENIKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEF0dHJpYnV0ZVR5cGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsyXzEuQVRUUklCVVRFX1RZUEUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb24oKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRhcmdldENsYXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRGZXRjaFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb21wb3NpdGVNZW1iZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9yZGVyQnlUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9yZGVyQ29sdW1uVHJhbnNsYXRvcigpLAkJCi0JCQlidWlsZE1hcEtleVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5Q2xhc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleVRlbXBvcmFsVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlFbnVtZXJhdGVkVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlDb252ZXJ0VHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IoKSwKLQkJCVhtbENvbHVtbi5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLk1BUF9LRVlfQ09MVU1OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUNvbHVtbigpKSwKLQkJCVhtbEpvaW5Db2x1bW4uYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUpvaW5Db2x1bW5zKCkpLAotCQkJWG1sQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihKUEEuQ09MVU1OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0NvbHVtbigpKSwKLQkJCWJ1aWxkVGVtcG9yYWxUcmFuc2xhdG9yKCksCi0JCQlidWlsZEVudW1lcmF0ZWRUcmFuc2xhdG9yKCksCi0JCQlidWlsZExvYlRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29udmVydFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlYbWxDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfQ29udmVydGVycygpKSwKLQkJCVhtbFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9UeXBlQ29udmVydGVycygpKSwKLQkJCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSksCi0JCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1N0cnVjdENvbnZlcnRlcnMoKSksCi0JCQlYbWxDb2xsZWN0aW9uVGFibGUuYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0NvbGxlY3Rpb25UYWJsZSgpKSwKLQkJCWJ1aWxkQ2FzY2FkZU9uRGVsZXRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKb2luRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZEJhdGNoRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpLAotCQkJYnVpbGROb25jYWNoZWFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZERlbGV0ZUFsbFRyYW5zbGF0b3IoKSwKLQkJICAgIFhtbFBhcnRpdGlvbmluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuUEFSVElUSU9OSU5HLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGFydGl0aW9uaW5nKCkpLAotCQkJWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlJFUExJQ0FUSU9OX1BBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkpLAotCQkJWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUm91bmRSb2JpblBhcnRpdGlvbmluZygpKSwKLQkJCVhtbFBpbm5lZFBhcnRpdGlvbmluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuUElOTkVEX1BBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1Bpbm5lZFBhcnRpdGlvbmluZygpKSwKLQkJCVhtbFJhbmdlUGFydGl0aW9uaW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5SQU5HRV9QQVJUSVRJT05JTkcsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9SYW5nZVBhcnRpdGlvbmluZygpKSwKLQkJCVhtbFZhbHVlUGFydGl0aW9uaW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5WQUxVRV9QQVJUSVRJT05JTkcsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9WYWx1ZVBhcnRpdGlvbmluZygpKSwKLQkJCVhtbEhhc2hQYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLkhBU0hfUEFSVElUSU9OSU5HLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfSGFzaFBhcnRpdGlvbmluZygpKSwKLQkJCVhtbFVuaW9uUGFydGl0aW9uaW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5VTklPTl9QQVJUSVRJT05JTkcsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9VbmlvblBhcnRpdGlvbmluZygpKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5Q29udmVydFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuTUFQX0tFWV9DT05WRVJULCBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzBfTWFwS2V5Q29udmVydCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29udmVydFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Db252ZXJ0KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxQcm9wZXJ0eS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NNZXRob2RzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQXNzb2NpYXRpb25PdmVycmlkZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERSwgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzBfTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQXR0cmlidXRlVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5BVFRSSUJVVEVfVFlQRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX0F0dHJpYnV0ZVR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSm9pbkZldGNoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSm9pbkZldGNoX0pvaW5GZXRjaCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQmF0Y2hGZXRjaFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxCYXRjaEZldGNoLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5CQVRDSF9GRVRDSCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxCYXRjaEZldGNoSG9sZGVyX0JhdGNoRmV0Y2goKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2FzY2FkZU9uRGVsZXRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIENhc2NhZGVUeXBlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5DQVNDQURFX09OX0RFTEVURSwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTm9uY2FjaGVhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLk5PTkNBQ0hFQUJMRSwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8yX05vbmNhY2hlYWJsZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb21wb3NpdGVNZW1iZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzMuQ09NUE9TSVRFX01FTUJFUiwgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8zX0NvbXBvc2l0ZU1lbWJlcigpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREZWxldGVBbGxUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzQuREVMRVRFX0FMTCwgRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl80X0RlbGV0ZUFsbCgpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldENvbnZlcnRDb2RlQXNzaXN0VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudENvZGVBc3Npc3RUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuQ09OVkVSVCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udmVydFRvdWNoZXMoaW50IHBvcykgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRDb252ZXJ0Q29kZUFzc2lzdFRleHRSYW5nZSgpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSAmJiAodGV4dFJhbmdlLnRvdWNoZXMocG9zKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYTg3MjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xhc3NSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxUeXBlTWFwcGluZ18yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbWJlZGRhYmxlXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmsyXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVtYmVkZGFibGVfMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxQbHNxbFJlY29yZF8yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFN0cnVjdF8yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRW1iZWRkYWJsZTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRDb3B5UG9saWN5IDxlbT5Db3B5IFBvbGljeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlI2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5IDxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0Q2xvbmVDb3B5UG9saWN5IDxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkYWJsZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxFbWJlZGRhYmxlIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlIGltcGxlbWVudHMgWG1sVHlwZU1hcHBpbmcsIFhtbEVtYmVkZGFibGVfMl8yLCBYbWxFbWJlZGRhYmxlXzJfMywgWG1sQ3VzdG9taXplckhvbGRlciwgWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIsIFhtbENvbnZlcnRlckNvbnRhaW5lciwgWG1sUHJvcGVydHlDb250YWluZXIKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmVudENsYXNzKCkgPGVtPlBhcmVudCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyZW50Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJlbnRDbGFzcygpIDxlbT5QYXJlbnQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmVudENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcmVudENsYXNzID0gUEFSRU5UX0NMQVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkgPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgPGVtPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGxzcWxSZWNvcmRzKCkgPGVtPlBsc3FsIFJlY29yZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGxzcWxSZWNvcmRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUGxzcWxSZWNvcmRfMl8zPiBwbHNxbFJlY29yZHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQbHNxbFRhYmxlcygpIDxlbT5QbHNxbCBUYWJsZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGxzcWxUYWJsZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQbHNxbFRhYmxlPiBwbHNxbFRhYmxlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0cnVjdCgpIDxlbT5TdHJ1Y3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0cnVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFN0cnVjdF8yXzMgc3RydWN0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VzdG9taXplcigpIDxlbT5DdXN0b21pemVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXN0b21pemVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2xhc3NSZWZlcmVuY2UgY3VzdG9taXplcjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZVRyYWNraW5nKCkgPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlVHJhY2tpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDaGFuZ2VUcmFja2luZyBjaGFuZ2VUcmFja2luZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnRlcnMoKSA8ZW0+Q29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQ29udmVydGVyPiBjb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZUNvbnZlcnRlcnMoKSA8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4gdHlwZUNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlQ29udmVydGVycygpIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkgPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0cnVjdENvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+IHN0cnVjdENvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29weVBvbGljeSgpIDxlbT5Db3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29weVBvbGljeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENvcHlQb2xpY3kgY29weVBvbGljeTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkgPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgaW5zdGFudGlhdGlvbkNvcHlQb2xpY3k7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbG9uZUNvcHlQb2xpY3koKSA8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsb25lQ29weVBvbGljeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENsb25lQ29weVBvbGljeSBjbG9uZUNvcHlQb2xpY3k7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPSBFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sRW1iZWRkYWJsZSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0VNQkVEREFCTEU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7Ci0JCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCi0JewotCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl9BdHRyaWJ1dGVPdmVycmlkZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKQotCXsKLQkJaWYgKGF0dHJpYnV0ZU92ZXJyaWRlcyA9PSBudWxsKQotCQl7Ci0JCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+KFhtbEF0dHJpYnV0ZU92ZXJyaWRlLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FUVFJJQlVURV9PVkVSUklERVMpOwotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVPdmVycmlkZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfQXNzb2NpYXRpb25PdmVycmlkZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IGdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQl7Ci0JCWlmIChhc3NvY2lhdGlvbk92ZXJyaWRlcyA9PSBudWxsKQotCQl7Ci0JCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPihYbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FTU09DSUFUSU9OX09WRVJSSURFUyk7Ci0JCX0KLQkJcmV0dXJuIGFzc29jaWF0aW9uT3ZlcnJpZGVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcmVudCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFyZW50IENsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcmVudCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFyZW50Q2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVHlwZU1hcHBpbmdfMl8xX1BhcmVudENsYXNzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50Q2xhc3MoKQotCXsKLQkJcmV0dXJuIHBhcmVudENsYXNzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRQYXJlbnRDbGFzcyA8ZW0+UGFyZW50IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJlbnQgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhcmVudENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50Q2xhc3MoU3RyaW5nIG5ld1BhcmVudENsYXNzKQotCXsKLQkJU3RyaW5nIG9sZFBhcmVudENsYXNzID0gcGFyZW50Q2xhc3M7Ci0JCXBhcmVudENsYXNzID0gbmV3UGFyZW50Q2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUEFSRU5UX0NMQVNTLCBvbGRQYXJlbnRDbGFzcywgcGFyZW50Q2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QbHNxbCBSZWNvcmRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFBsc3FsUmVjb3JkXzJfM30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QbHNxbCBSZWNvcmRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGxzcWwgUmVjb3JkczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVtYmVkZGFibGVfMl8zX1Bsc3FsUmVjb3JkcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUGxzcWxSZWNvcmRfMl8zPiBnZXRQbHNxbFJlY29yZHMoKQotCXsKLQkJaWYgKHBsc3FsUmVjb3JkcyA9PSBudWxsKQotCQl7Ci0JCQlwbHNxbFJlY29yZHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUGxzcWxSZWNvcmRfMl8zPihYbWxQbHNxbFJlY29yZF8yXzMuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUExTUUxfUkVDT1JEUyk7Ci0JCX0KLQkJcmV0dXJuIHBsc3FsUmVjb3JkczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QbHNxbCBUYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBsc3FsVGFibGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGxzcWwgVGFibGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGxzcWwgVGFibGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkYWJsZV8yXzNfUGxzcWxUYWJsZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFBsc3FsVGFibGU+IGdldFBsc3FsVGFibGVzKCkKLQl7Ci0JCWlmIChwbHNxbFRhYmxlcyA9PSBudWxsKQotCQl7Ci0JCQlwbHNxbFRhYmxlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQbHNxbFRhYmxlPihYbWxQbHNxbFRhYmxlLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1BMU1FMX1RBQkxFUyk7Ci0JCX0KLQkJcmV0dXJuIHBsc3FsVGFibGVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0cnVjdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RydWN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U3RydWN0KFhtbFN0cnVjdF8yXzMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRhYmxlXzJfM19TdHJ1Y3QoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFN0cnVjdF8yXzMgZ2V0U3RydWN0KCkKLQl7Ci0JCXJldHVybiBzdHJ1Y3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U3RydWN0KFhtbFN0cnVjdF8yXzMgbmV3U3RydWN0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sU3RydWN0XzJfMyBvbGRTdHJ1Y3QgPSBzdHJ1Y3Q7Ci0JCXN0cnVjdCA9IG5ld1N0cnVjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19TVFJVQ1QsIG9sZFN0cnVjdCwgbmV3U3RydWN0KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0U3RydWN0IDxlbT5TdHJ1Y3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U3RydWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0KFhtbFN0cnVjdF8yXzMgbmV3U3RydWN0KQotCXsKLQkJaWYgKG5ld1N0cnVjdCAhPSBzdHJ1Y3QpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHN0cnVjdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzdHJ1Y3QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1NUUlVDVCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3U3RydWN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1N0cnVjdCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fU1RSVUNULCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFN0cnVjdChuZXdTdHJ1Y3QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19TVFJVQ1QsIG5ld1N0cnVjdCwgbmV3U3RydWN0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3VzdG9taXplcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q3VzdG9taXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DdXN0b21pemVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDdXN0b21pemVyKFhtbENsYXNzUmVmZXJlbmNlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ3VzdG9taXplckhvbGRlcl9DdXN0b21pemVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDbGFzc1JlZmVyZW5jZSBnZXRDdXN0b21pemVyKCkKLQl7Ci0JCXJldHVybiBjdXN0b21pemVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEN1c3RvbWl6ZXIoWG1sQ2xhc3NSZWZlcmVuY2UgbmV3Q3VzdG9taXplciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENsYXNzUmVmZXJlbmNlIG9sZEN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOwotCQljdXN0b21pemVyID0gbmV3Q3VzdG9taXplcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DVVNUT01JWkVSLCBvbGRDdXN0b21pemVyLCBuZXdDdXN0b21pemVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0Q3VzdG9taXplciA8ZW0+Q3VzdG9taXplcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q3VzdG9taXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1c3RvbWl6ZXIoWG1sQ2xhc3NSZWZlcmVuY2UgbmV3Q3VzdG9taXplcikKLQl7Ci0JCWlmIChuZXdDdXN0b21pemVyICE9IGN1c3RvbWl6ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGN1c3RvbWl6ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY3VzdG9taXplcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ1VTVE9NSVpFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q3VzdG9taXplciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDdXN0b21pemVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DVVNUT01JWkVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEN1c3RvbWl6ZXIobmV3Q3VzdG9taXplciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NVU1RPTUlaRVIsIG5ld0N1c3RvbWl6ZXIsIG5ld0N1c3RvbWl6ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgVHJhY2tpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENoYW5nZVRyYWNraW5nKFhtbENoYW5nZVRyYWNraW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXJfQ2hhbmdlVHJhY2tpbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENoYW5nZVRyYWNraW5nIGdldENoYW5nZVRyYWNraW5nKCkKLQl7Ci0JCXJldHVybiBjaGFuZ2VUcmFja2luZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDaGFuZ2VUcmFja2luZyhYbWxDaGFuZ2VUcmFja2luZyBuZXdDaGFuZ2VUcmFja2luZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENoYW5nZVRyYWNraW5nIG9sZENoYW5nZVRyYWNraW5nID0gY2hhbmdlVHJhY2tpbmc7Ci0JCWNoYW5nZVRyYWNraW5nID0gbmV3Q2hhbmdlVHJhY2tpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0hBTkdFX1RSQUNLSU5HLCBvbGRDaGFuZ2VUcmFja2luZywgbmV3Q2hhbmdlVHJhY2tpbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRDaGFuZ2VUcmFja2luZyA8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENoYW5nZVRyYWNraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlVHJhY2tpbmcoWG1sQ2hhbmdlVHJhY2tpbmcgbmV3Q2hhbmdlVHJhY2tpbmcpCi0JewotCQlpZiAobmV3Q2hhbmdlVHJhY2tpbmcgIT0gY2hhbmdlVHJhY2tpbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNoYW5nZVRyYWNraW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNoYW5nZVRyYWNraW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NoYW5nZVRyYWNraW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NoYW5nZVRyYWNraW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2hhbmdlVHJhY2tpbmcobmV3Q2hhbmdlVHJhY2tpbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkcsIG5ld0NoYW5nZVRyYWNraW5nLCBuZXdDaGFuZ2VUcmFja2luZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckNvbnRhaW5lcl9Db252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxDb252ZXJ0ZXI+IGdldENvbnZlcnRlcnMoKQotCXsKLQkJaWYgKGNvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJY29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxDb252ZXJ0ZXI+KFhtbENvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gY29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1R5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxUeXBlQ29udmVydGVyPiBnZXRUeXBlQ29udmVydGVycygpCi0JewotCQlpZiAodHlwZUNvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJdHlwZUNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4oWG1sVHlwZUNvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19UWVBFX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiB0eXBlQ29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX09iamVjdFR5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPiBnZXRPYmplY3RUeXBlQ29udmVydGVycygpCi0JewotCQlpZiAob2JqZWN0VHlwZUNvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJb2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4oWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1N0cnVjdENvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4gZ2V0U3RydWN0Q29udmVydGVycygpCi0JewotCQlpZiAoc3RydWN0Q29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQlzdHJ1Y3RDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4oWG1sU3RydWN0Q29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1NUUlVDVF9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gc3RydWN0Q29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvcHlQb2xpY3koWG1sQ29weVBvbGljeSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVtYmVkZGFibGVfQ29weVBvbGljeSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ29weVBvbGljeSBnZXRDb3B5UG9saWN5KCkKLQl7Ci0JCXJldHVybiBjb3B5UG9saWN5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvcHlQb2xpY3koWG1sQ29weVBvbGljeSBuZXdDb3B5UG9saWN5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ29weVBvbGljeSBvbGRDb3B5UG9saWN5ID0gY29weVBvbGljeTsKLQkJY29weVBvbGljeSA9IG5ld0NvcHlQb2xpY3k7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09QWV9QT0xJQ1ksIG9sZENvcHlQb2xpY3ksIG5ld0NvcHlQb2xpY3kpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRDb3B5UG9saWN5IDxlbT5Db3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5UG9saWN5KFhtbENvcHlQb2xpY3kgbmV3Q29weVBvbGljeSkKLQl7Ci0JCWlmIChuZXdDb3B5UG9saWN5ICE9IGNvcHlQb2xpY3kpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNvcHlQb2xpY3kgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY29weVBvbGljeSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NvcHlQb2xpY3kgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q29weVBvbGljeSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29weVBvbGljeShuZXdDb3B5UG9saWN5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09QWV9QT0xJQ1ksIG5ld0NvcHlQb2xpY3ksIG5ld0NvcHlQb2xpY3kpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkYWJsZV9JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCXsKLQkJcmV0dXJuIGluc3RhbnRpYXRpb25Db3B5UG9saWN5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgb2xkSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPSBpbnN0YW50aWF0aW9uQ29weVBvbGljeTsKLQkJaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPSBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZLCBvbGRJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSA8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSkKLQl7Ci0JCWlmIChuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSAhPSBpbnN0YW50aWF0aW9uQ29weVBvbGljeSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSwgbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3ksIG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2xvbmUgQ29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDbG9uZUNvcHlQb2xpY3koWG1sQ2xvbmVDb3B5UG9saWN5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkYWJsZV9DbG9uZUNvcHlQb2xpY3koKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENsb25lQ29weVBvbGljeSBnZXRDbG9uZUNvcHlQb2xpY3koKQotCXsKLQkJcmV0dXJuIGNsb25lQ29weVBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDbG9uZUNvcHlQb2xpY3koWG1sQ2xvbmVDb3B5UG9saWN5IG5ld0Nsb25lQ29weVBvbGljeSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENsb25lQ29weVBvbGljeSBvbGRDbG9uZUNvcHlQb2xpY3kgPSBjbG9uZUNvcHlQb2xpY3k7Ci0JCWNsb25lQ29weVBvbGljeSA9IG5ld0Nsb25lQ29weVBvbGljeTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DTE9ORV9DT1BZX1BPTElDWSwgb2xkQ2xvbmVDb3B5UG9saWN5LCBuZXdDbG9uZUNvcHlQb2xpY3kpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRDbG9uZUNvcHlQb2xpY3kgPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2xvbmVDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xvbmVDb3B5UG9saWN5KFhtbENsb25lQ29weVBvbGljeSBuZXdDbG9uZUNvcHlQb2xpY3kpCi0JewotCQlpZiAobmV3Q2xvbmVDb3B5UG9saWN5ICE9IGNsb25lQ29weVBvbGljeSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY2xvbmVDb3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNsb25lQ29weVBvbGljeSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0xPTkVfQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0Nsb25lQ29weVBvbGljeSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDbG9uZUNvcHlQb2xpY3kpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NMT05FX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENsb25lQ29weVBvbGljeShuZXdDbG9uZUNvcHlQb2xpY3ksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DTE9ORV9DT1BZX1BPTElDWSwgbmV3Q2xvbmVDb3B5UG9saWN5LCBuZXdDbG9uZUNvcHlQb2xpY3kpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyhCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkYWJsZV9FeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQl7Ci0JCXJldHVybiBleGNsdWRlRGVmYXVsdE1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoQm9vbGVhbiBuZXdFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKQotCXsKLQkJQm9vbGVhbiBvbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzID0gZXhjbHVkZURlZmF1bHRNYXBwaW5nczsKLQkJZXhjbHVkZURlZmF1bHRNYXBwaW5ncyA9IG5ld0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTLCBvbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzLCBleGNsdWRlRGVmYXVsdE1hcHBpbmdzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUExTUUxfUkVDT1JEUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFBsc3FsUmVjb3JkcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUExTUUxfVEFCTEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UGxzcWxUYWJsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1NUUlVDVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRTdHJ1Y3QobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ1VTVE9NSVpFUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRDdXN0b21pemVyKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NIQU5HRV9UUkFDS0lORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRDaGFuZ2VUcmFja2luZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VHlwZUNvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRPYmplY3RUeXBlQ29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q29weVBvbGljeShudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBiYXNpY1NldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NMT05FX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBiYXNpY1NldENsb25lQ29weVBvbGljeShudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19QQVJFTlRfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldFBhcmVudENsYXNzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCXJldHVybiBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1BMU1FMX1JFQ09SRFM6Ci0JCQkJcmV0dXJuIGdldFBsc3FsUmVjb3JkcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1BMU1FMX1RBQkxFUzoKLQkJCQlyZXR1cm4gZ2V0UGxzcWxUYWJsZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19TVFJVQ1Q6Ci0JCQkJcmV0dXJuIGdldFN0cnVjdCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NVU1RPTUlaRVI6Ci0JCQkJcmV0dXJuIGdldEN1c3RvbWl6ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkc6Ci0JCQkJcmV0dXJuIGdldENoYW5nZVRyYWNraW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0Q29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0VHlwZUNvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRPYmplY3RUeXBlQ29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBnZXRDb3B5UG9saWN5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DTE9ORV9DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gZ2V0Q2xvbmVDb3B5UG9saWN5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTOgotCQkJCXJldHVybiBnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19QQVJFTlRfQ0xBU1M6Ci0JCQkJc2V0UGFyZW50Q2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUExTUUxfUkVDT1JEUzoKLQkJCQlnZXRQbHNxbFJlY29yZHMoKS5jbGVhcigpOwotCQkJCWdldFBsc3FsUmVjb3JkcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUGxzcWxSZWNvcmRfMl8zPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1BMU1FMX1RBQkxFUzoKLQkJCQlnZXRQbHNxbFRhYmxlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGxzcWxUYWJsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFBsc3FsVGFibGU+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fU1RSVUNUOgotCQkJCXNldFN0cnVjdCgoWG1sU3RydWN0XzJfMyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NVU1RPTUlaRVI6Ci0JCQkJc2V0Q3VzdG9taXplcigoWG1sQ2xhc3NSZWZlcmVuY2UpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkc6Ci0JCQkJc2V0Q2hhbmdlVHJhY2tpbmcoKFhtbENoYW5nZVRyYWNraW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09OVkVSVEVSUzoKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxTdHJ1Y3RDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT1BZX1BPTElDWToKLQkJCQlzZXRDb3B5UG9saWN5KChYbWxDb3B5UG9saWN5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWToKLQkJCQlzZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgoWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DTE9ORV9DT1BZX1BPTElDWToKLQkJCQlzZXRDbG9uZUNvcHlQb2xpY3koKFhtbENsb25lQ29weVBvbGljeSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKLQkJCQlzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUEFSRU5UX0NMQVNTOgotCQkJCXNldFBhcmVudENsYXNzKFBBUkVOVF9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCWdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUExTUUxfUkVDT1JEUzoKLQkJCQlnZXRQbHNxbFJlY29yZHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19QTFNRTF9UQUJMRVM6Ci0JCQkJZ2V0UGxzcWxUYWJsZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19TVFJVQ1Q6Ci0JCQkJc2V0U3RydWN0KChYbWxTdHJ1Y3RfMl8zKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DVVNUT01JWkVSOgotCQkJCXNldEN1c3RvbWl6ZXIoKFhtbENsYXNzUmVmZXJlbmNlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkc6Ci0JCQkJc2V0Q2hhbmdlVHJhY2tpbmcoKFhtbENoYW5nZVRyYWNraW5nKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT05WRVJURVJTOgotCQkJCWdldENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZOgotCQkJCXNldENvcHlQb2xpY3koKFhtbENvcHlQb2xpY3kpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1k6Ci0JCQkJc2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DTE9ORV9DT1BZX1BPTElDWToKLQkJCQlzZXRDbG9uZUNvcHlQb2xpY3koKFhtbENsb25lQ29weVBvbGljeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTOgotCQkJCXNldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUEFSRU5UX0NMQVNTOgotCQkJCXJldHVybiBQQVJFTlRfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IHBhcmVudENsYXNzICE9IG51bGwgOiAhUEFSRU5UX0NMQVNTX0VERUZBVUxULmVxdWFscyhwYXJlbnRDbGFzcyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gYXR0cmlidXRlT3ZlcnJpZGVzICE9IG51bGwgJiYgIWF0dHJpYnV0ZU92ZXJyaWRlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCXJldHVybiBhc3NvY2lhdGlvbk92ZXJyaWRlcyAhPSBudWxsICYmICFhc3NvY2lhdGlvbk92ZXJyaWRlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUExTUUxfUkVDT1JEUzoKLQkJCQlyZXR1cm4gcGxzcWxSZWNvcmRzICE9IG51bGwgJiYgIXBsc3FsUmVjb3Jkcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUExTUUxfVEFCTEVTOgotCQkJCXJldHVybiBwbHNxbFRhYmxlcyAhPSBudWxsICYmICFwbHNxbFRhYmxlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fU1RSVUNUOgotCQkJCXJldHVybiBzdHJ1Y3QgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DVVNUT01JWkVSOgotCQkJCXJldHVybiBjdXN0b21pemVyICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0hBTkdFX1RSQUNLSU5HOgotCQkJCXJldHVybiBjaGFuZ2VUcmFja2luZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhY29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiB0eXBlQ29udmVydGVycyAhPSBudWxsICYmICF0eXBlQ29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhb2JqZWN0VHlwZUNvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXN0cnVjdENvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGNvcHlQb2xpY3kgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBpbnN0YW50aWF0aW9uQ29weVBvbGljeSAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NMT05FX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBjbG9uZUNvcHlQb2xpY3kgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVCA9PSBudWxsID8gZXhjbHVkZURlZmF1bHRNYXBwaW5ncyAhPSBudWxsIDogIUVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVC5lcXVhbHMoZXhjbHVkZURlZmF1bHRNYXBwaW5ncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sVHlwZU1hcHBpbmdfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1BBUkVOVF9DTEFTUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX1RZUEVfTUFQUElOR18yMV9fUEFSRU5UX0NMQVNTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFR5cGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQVRUUklCVVRFX09WRVJSSURFUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9DT05UQUlORVJfX0FUVFJJQlVURV9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19BU1NPQ0lBVElPTl9PVkVSUklERVM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfX0FTU09DSUFUSU9OX09WRVJSSURFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbWJlZGRhYmxlXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVtYmVkZGFibGVfMl8zLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1BMU1FMX1JFQ09SRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9FTUJFRERBQkxFXzIzX19QTFNRTF9SRUNPUkRTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19QTFNRTF9UQUJMRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9FTUJFRERBQkxFXzIzX19QTFNRTF9UQUJMRVM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1NUUlVDVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX0VNQkVEREFCTEVfMjNfX1NUUlVDVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDdXN0b21pemVySG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NVU1RPTUlaRVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NVU1RPTUlaRVJfSE9MREVSX19DVVNUT01JWkVSOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENoYW5nZVRyYWNraW5nSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NIQU5HRV9UUkFDS0lORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0hBTkdFX1RSQUNLSU5HX0hPTERFUl9fQ0hBTkdFX1RSQUNLSU5HOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fU1RSVUNUX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX1NUUlVDVF9DT05WRVJURVJTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sVHlwZU1hcHBpbmdfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9UWVBFX01BUFBJTkdfMjFfX1BBUkVOVF9DTEFTUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUEFSRU5UX0NMQVNTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFR5cGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9DT05UQUlORVJfX0FUVFJJQlVURV9PVkVSUklERVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FUVFJJQlVURV9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX19BU1NPQ0lBVElPTl9PVkVSUklERVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FTU09DSUFUSU9OX09WRVJSSURFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbWJlZGRhYmxlXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVtYmVkZGFibGVfMl8zLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9FTUJFRERBQkxFXzIzX19QTFNRTF9SRUNPUkRTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19QTFNRTF9SRUNPUkRTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfRU1CRUREQUJMRV8yM19fUExTUUxfVEFCTEVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19QTFNRTF9UQUJMRVM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9FTUJFRERBQkxFXzIzX19TVFJVQ1Q6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1NUUlVDVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDdXN0b21pemVySG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NVU1RPTUlaRVJfSE9MREVSX19DVVNUT01JWkVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DVVNUT01JWkVSOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENoYW5nZVRyYWNraW5nSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NIQU5HRV9UUkFDS0lOR19IT0xERVJfX0NIQU5HRV9UUkFDS0lORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0hBTkdFX1RSQUNLSU5HOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fU1RSVUNUX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1NUUlVDVF9DT05WRVJURVJTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHBhcmVudENsYXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJlbnRDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXhjbHVkZURlZmF1bHRNYXBwaW5nczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXhjbHVkZURlZmF1bHRNYXBwaW5ncyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRQYXJlbnRDbGFzc1RleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShFY2xpcHNlTGluazJfMS5QQVJFTlRfQ0xBU1MpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVtYmVkZGFibGUoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZENsYXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQYXJlbnRDbGFzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzVHJhbnNsYXRvcigpLAotCQkJYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ3VzdG9taXplclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2hhbmdlVHJhY2tpbmdUcmFuc2xhdG9yKCksCi0JCQlYbWxTdHJ1Y3QuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8zLlNUUlVDVCwgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZV8yXzNfU3RydWN0KCkpLAotCQkJYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29weVBvbGljeVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSW5zdGFudGlhdGlvbkNveXBQb2xpY3lUcmFuc2xhdG9yKCksCi0JCQlidWlsZENsb25lQ29weVBvbGljeVRyYW5zbGF0b3IoKSwKLQkJCVhtbFBsc3FsUmVjb3JkLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMy5QTFNRTF9SRUNPUkQsIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVtYmVkZGFibGVfMl8zX1Bsc3FsUmVjb3JkcygpKSwKLQkJCVhtbFBsc3FsVGFibGUuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8zLlBMU1FMX1RBQkxFLCBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbWJlZGRhYmxlXzJfM19QbHNxbFRhYmxlcygpKSwKLQkJCWJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpLAotCQkJQXR0cmlidXRlcy5idWlsZFRyYW5zbGF0b3IoKX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3NUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVtYmVkZGFibGVfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDdXN0b21pemVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENsYXNzUmVmZXJlbmNlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DVVNUT01JWkVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEN1c3RvbWl6ZXJIb2xkZXJfQ3VzdG9taXplcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2hhbmdlVHJhY2tpbmdUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ2hhbmdlVHJhY2tpbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcl9DaGFuZ2VUcmFja2luZygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9Db252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9UeXBlQ29udmVydGVycygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxPYmplY3RUeXBlQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX09iamVjdFR5cGVDb252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sU3RydWN0Q29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9TdHJ1Y3RDb252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb3B5UG9saWN5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENvcHlQb2xpY3kuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPUFlfUE9MSUNZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVtYmVkZGFibGVfQ29weVBvbGljeSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSW5zdGFudGlhdGlvbkNveXBQb2xpY3lUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLklOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1ksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZV9JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2xvbmVDb3B5UG9saWN5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENsb25lQ29weVBvbGljeS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0xPTkVfQ09QWV9QT0xJQ1ksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZV9DbG9uZUNvcHlQb2xpY3koKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFByb3BlcnR5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFBhcmVudENsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlBBUkVOVF9DTEFTUywgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVHlwZU1hcHBpbmdfMl8xX1BhcmVudENsYXNzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQXR0cmlidXRlT3ZlcnJpZGUuYnVpbGRUcmFuc2xhdG9yKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyX0F0dHJpYnV0ZU92ZXJyaWRlcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmJ1aWxkVHJhbnNsYXRvcihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfQXNzb2NpYXRpb25PdmVycmlkZXMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGVkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVmMjllNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEVtYmVkZGVkIEltcGw8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWQoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sRW1iZWRkZWQgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkIGltcGxlbWVudHMgWG1sQXR0cmlidXRlTWFwcGluZwotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlVHlwZSA9IEFUVFJJQlVURV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEVtYmVkZGVkKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfRU1CRURERUQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU1hcHBpbmdfQXR0cmlidXRlVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoKQotCXsKLQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZCNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZyBuZXdBdHRyaWJ1dGVUeXBlKQotCXsKLQkJU3RyaW5nIG9sZEF0dHJpYnV0ZVR5cGUgPSBhdHRyaWJ1dGVUeXBlOwotCQlhdHRyaWJ1dGVUeXBlID0gbmV3QXR0cmlidXRlVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQVRUUklCVVRFX1RZUEUsIG9sZEF0dHJpYnV0ZVR5cGUsIGF0dHJpYnV0ZVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKLQkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQotCXsKLQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQotCXsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoQVRUUklCVVRFX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gYXR0cmlidXRlVHlwZSAhPSBudWxsIDogIUFUVFJJQlVURV9UWVBFX0VERUZBVUxULmVxdWFscyhhdHRyaWJ1dGVUeXBlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF0dHJpYnV0ZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF0dHJpYnV0ZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEF0dHJpYnV0ZVR5cGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsyXzEuQVRUUklCVVRFX1RZUEUpOwotCX0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVtYmVkZGVkKCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXR0cmlidXRlVHlwZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFByb3BlcnR5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFjY2Vzc01ldGhvZHMuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkFDQ0VTU19NRVRIT0RTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkFUVFJJQlVURV9UWVBFLCAgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX0F0dHJpYnV0ZVR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZElkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkZWRJZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2MxNjRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZElkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbWJlZGRlZCBJZCBJbXBsPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkSWQoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sRW1iZWRkZWRJZCBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZCBpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZVR5cGUgPSBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxFbWJlZGRlZElkKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfRU1CRURERURfSUQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU1hcHBpbmdfQXR0cmlidXRlVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoKQotCXsKLQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIG5ld0F0dHJpYnV0ZVR5cGUpCi0JewotCQlTdHJpbmcgb2xkQXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGU7Ci0JCWF0dHJpYnV0ZVR5cGUgPSBuZXdBdHRyaWJ1dGVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BVFRSSUJVVEVfVFlQRSwgb2xkQXR0cmlidXRlVHlwZSwgYXR0cmlidXRlVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOwotCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQUNDRVNTX01FVEhPRFMsIG9sZEFjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZCNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKLQl7Ci0JCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlVHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKEFUVFJJQlVURV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGF0dHJpYnV0ZVR5cGUgIT0gbnVsbCA6ICFBVFRSSUJVVEVfVFlQRV9FREVGQVVMVC5lcXVhbHMoYXR0cmlidXRlVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BVFRSSUJVVEVfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BVFRSSUJVVEVfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhdHRyaWJ1dGVUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdHRyaWJ1dGVUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEF0dHJpYnV0ZVR5cGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsyXzEuQVRUUklCVVRFX1RZUEUpOwotCX0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVtYmVkZGVkSWQoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sUHJvcGVydHkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEF0dHJpYnV0ZVR5cGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuQVRUUklCVVRFX1RZUEUsICBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmdfQXR0cmlidXRlVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVudGl0eS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2ZhMGI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3OTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xhc3NSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxFbnRpdHlfMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGluazJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5XzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVudGl0eV8yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxUeXBlTWFwcGluZ18yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxIYXNoUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVudGl0eV8yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sUGxzcWxSZWNvcmRfMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxTdHJ1Y3RfMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGluazJfNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sQ2FjaGVJbmRleF8yXzQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbEVudGl0eV8yXzQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEVudGl0eTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldE9wdGltaXN0aWNMb2NraW5nIDxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldENvcHlQb2xpY3kgPGVtPkNvcHkgUG9saWN5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSA8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q2xvbmVDb3B5UG9saWN5IDxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHkoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sRW50aXR5IGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkgaW1wbGVtZW50cyBYbWxUeXBlTWFwcGluZywgWG1sRW50aXR5XzFfMSwgWG1sRW50aXR5XzJfMCwgWG1sRW50aXR5XzJfMSwgWG1sRW50aXR5XzJfMiwgWG1sRW50aXR5XzJfMywgWG1sRW50aXR5XzJfNCwgWG1sUmVhZE9ubHksIFhtbEN1c3RvbWl6ZXJIb2xkZXIsIFhtbENoYW5nZVRyYWNraW5nSG9sZGVyLCBYbWxDYWNoZUhvbGRlciwgWG1sQ29udmVydGVyQ29udGFpbmVyLCBYbWxRdWVyeUNvbnRhaW5lciwgWG1sUHJvcGVydHlDb250YWluZXIKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmVudENsYXNzKCkgPGVtPlBhcmVudCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyZW50Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJlbnRDbGFzcygpIDxlbT5QYXJlbnQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmVudENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcmVudENsYXNzID0gUEFSRU5UX0NMQVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpbWFyeUtleSgpIDxlbT5QcmltYXJ5IEtleTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJpbWFyeUtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFByaW1hcnlLZXkgcHJpbWFyeUtleTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhY2hlSW50ZXJjZXB0b3IoKSA8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhY2hlSW50ZXJjZXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDbGFzc1JlZmVyZW5jZSBjYWNoZUludGVyY2VwdG9yOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UXVlcnlSZWRpcmVjdG9ycygpIDxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UXVlcnlSZWRpcmVjdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFF1ZXJ5UmVkaXJlY3RvcnMgcXVlcnlSZWRpcmVjdG9yczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZldGNoR3JvdXBzKCkgPGVtPkZldGNoIEdyb3VwczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGZXRjaEdyb3VwcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEZldGNoR3JvdXA+IGZldGNoR3JvdXBzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NFeHRyYWN0b3IoKSA8ZW0+Q2xhc3MgRXh0cmFjdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc0V4dHJhY3RvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENsYXNzUmVmZXJlbmNlIGNsYXNzRXh0cmFjdG9yOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydGl0aW9uaW5nKCkgPGVtPlBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGFydGl0aW9uaW5nXzJfMiBwYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpIDxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpIDxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiByb3VuZFJvYmluUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkgPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgcGlubmVkUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKSA8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYW5nZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiByYW5nZVBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlUGFydGl0aW9uaW5nKCkgPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgdmFsdWVQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYXNoUGFydGl0aW9uaW5nKCkgPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIYXNoUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgaGFzaFBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaW9uUGFydGl0aW9uaW5nKCkgPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VW5pb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgdW5pb25QYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydGl0aW9uZWQoKSA8ZW0+UGFydGl0aW9uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJUSVRJT05FRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJ0aXRpb25lZCgpIDxlbT5QYXJ0aXRpb25lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFydGl0aW9uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFydGl0aW9uZWQgPSBQQVJUSVRJT05FRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFkZGl0aW9uYWxDcml0ZXJpYSgpIDxlbT5BZGRpdGlvbmFsIENyaXRlcmlhPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsQ3JpdGVyaWEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yIGFkZGl0aW9uYWxDcml0ZXJpYTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXNjYWRlT25EZWxldGUoKSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhc2NhZGVPbkRlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIENBU0NBREVfT05fREVMRVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhc2NhZGVPbkRlbGV0ZSgpIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBjYXNjYWRlT25EZWxldGUgPSBDQVNDQURFX09OX0RFTEVURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluZGV4KCkgPGVtPkluZGV4PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEluZGV4XzJfMiBpbmRleDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE11bHRpdGVuYW50KCkgPGVtPk11bHRpdGVuYW50PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNdWx0aXRlbmFudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE11bHRpdGVuYW50IG11bHRpdGVuYW50OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKSA8ZW0+TmFtZWQgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zPiBuYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKSA8ZW0+TmFtZWQgUGxzcWwgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMz4gbmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkgPGVtPk5hbWVkIFBsc3FsIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzM+IG5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGxzcWxSZWNvcmRzKCkgPGVtPlBsc3FsIFJlY29yZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGxzcWxSZWNvcmRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUGxzcWxSZWNvcmRfMl8zPiBwbHNxbFJlY29yZHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQbHNxbFRhYmxlcygpIDxlbT5QbHNxbCBUYWJsZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGxzcWxUYWJsZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQbHNxbFRhYmxlPiBwbHNxbFRhYmxlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0cnVjdCgpIDxlbT5TdHJ1Y3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0cnVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFN0cnVjdF8yXzMgc3RydWN0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FjaGVJbmRleCgpIDxlbT5DYWNoZSBJbmRleDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FjaGVJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENhY2hlSW5kZXhfMl80IGNhY2hlSW5kZXg7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVhZE9ubHkoKSA8ZW0+UmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIFJFQURfT05MWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFkT25seSgpIDxlbT5SZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlYWRPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiByZWFkT25seSA9IFJFQURfT05MWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1c3RvbWl6ZXIoKSA8ZW0+Q3VzdG9taXplcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VzdG9taXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENsYXNzUmVmZXJlbmNlIGN1c3RvbWl6ZXI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VUcmFja2luZygpIDxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZVRyYWNraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2hhbmdlVHJhY2tpbmcgY2hhbmdlVHJhY2tpbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWNoZSgpIDxlbT5DYWNoZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FjaGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDYWNoZSBjYWNoZTsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEV4aXN0ZW5jZVR5cGUgRVhJU1RFTkNFX0NIRUNLSU5HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4aXN0ZW5jZUNoZWNraW5nKCkgPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFeGlzdGVuY2VUeXBlIGV4aXN0ZW5jZUNoZWNraW5nID0gRVhJU1RFTkNFX0NIRUNLSU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydGVycygpIDxlbT5Db252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxDb252ZXJ0ZXI+IGNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlQ29udmVydGVycygpIDxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxUeXBlQ29udmVydGVyPiB0eXBlQ29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPiBvYmplY3RUeXBlQ29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0cnVjdENvbnZlcnRlcnMoKSA8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RydWN0Q29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4gc3RydWN0Q29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpIDxlbT5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeT4gbmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9wdGltaXN0aWNMb2NraW5nKCkgPGVtPk9wdGltaXN0aWMgTG9ja2luZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3B0aW1pc3RpY0xvY2tpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxPcHRpbWlzdGljTG9ja2luZyBvcHRpbWlzdGljTG9ja2luZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvcHlQb2xpY3koKSA8ZW0+Q29weSBQb2xpY3k8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDb3B5UG9saWN5IGNvcHlQb2xpY3k7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpIDxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGluc3RhbnRpYXRpb25Db3B5UG9saWN5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xvbmVDb3B5UG9saWN5KCkgPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbG9uZUNvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDbG9uZUNvcHlQb2xpY3kgY2xvbmVDb3B5UG9saWN5OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBleGNsdWRlRGVmYXVsdE1hcHBpbmdzID0gRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEVudGl0eSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0VOVElUWTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlYWRPbmx5KEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSZWFkT25seV9SZWFkT25seSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0UmVhZE9ubHkoKQotCXsKLQkJcmV0dXJuIHJlYWRPbmx5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFJlYWRPbmx5IDxlbT5SZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShCb29sZWFuIG5ld1JlYWRPbmx5KQotCXsKLQkJQm9vbGVhbiBvbGRSZWFkT25seSA9IHJlYWRPbmx5OwotCQlyZWFkT25seSA9IG5ld1JlYWRPbmx5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkVBRF9PTkxZLCBvbGRSZWFkT25seSwgcmVhZE9ubHkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DdXN0b21pemVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DdXN0b21pemVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkN1c3RvbWl6ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEN1c3RvbWl6ZXIoWG1sQ2xhc3NSZWZlcmVuY2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDdXN0b21pemVySG9sZGVyX0N1c3RvbWl6ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENsYXNzUmVmZXJlbmNlIGdldEN1c3RvbWl6ZXIoKQotCXsKLQkJcmV0dXJuIGN1c3RvbWl6ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q3VzdG9taXplcihYbWxDbGFzc1JlZmVyZW5jZSBuZXdDdXN0b21pemVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ2xhc3NSZWZlcmVuY2Ugb2xkQ3VzdG9taXplciA9IGN1c3RvbWl6ZXI7Ci0JCWN1c3RvbWl6ZXIgPSBuZXdDdXN0b21pemVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ1VTVE9NSVpFUiwgb2xkQ3VzdG9taXplciwgbmV3Q3VzdG9taXplcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q3VzdG9taXplciA8ZW0+Q3VzdG9taXplcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q3VzdG9taXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1c3RvbWl6ZXIoWG1sQ2xhc3NSZWZlcmVuY2UgbmV3Q3VzdG9taXplcikKLQl7Ci0JCWlmIChuZXdDdXN0b21pemVyICE9IGN1c3RvbWl6ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGN1c3RvbWl6ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY3VzdG9taXplcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DVVNUT01JWkVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDdXN0b21pemVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0N1c3RvbWl6ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ1VTVE9NSVpFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDdXN0b21pemVyKG5ld0N1c3RvbWl6ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NVU1RPTUlaRVIsIG5ld0N1c3RvbWl6ZXIsIG5ld0N1c3RvbWl6ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgVHJhY2tpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENoYW5nZVRyYWNraW5nKFhtbENoYW5nZVRyYWNraW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXJfQ2hhbmdlVHJhY2tpbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENoYW5nZVRyYWNraW5nIGdldENoYW5nZVRyYWNraW5nKCkKLQl7Ci0JCXJldHVybiBjaGFuZ2VUcmFja2luZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDaGFuZ2VUcmFja2luZyhYbWxDaGFuZ2VUcmFja2luZyBuZXdDaGFuZ2VUcmFja2luZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENoYW5nZVRyYWNraW5nIG9sZENoYW5nZVRyYWNraW5nID0gY2hhbmdlVHJhY2tpbmc7Ci0JCWNoYW5nZVRyYWNraW5nID0gbmV3Q2hhbmdlVHJhY2tpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DSEFOR0VfVFJBQ0tJTkcsIG9sZENoYW5nZVRyYWNraW5nLCBuZXdDaGFuZ2VUcmFja2luZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q2hhbmdlVHJhY2tpbmcgPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDaGFuZ2VUcmFja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYW5nZVRyYWNraW5nKFhtbENoYW5nZVRyYWNraW5nIG5ld0NoYW5nZVRyYWNraW5nKQotCXsKLQkJaWYgKG5ld0NoYW5nZVRyYWNraW5nICE9IGNoYW5nZVRyYWNraW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjaGFuZ2VUcmFja2luZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljaGFuZ2VUcmFja2luZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DSEFOR0VfVFJBQ0tJTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NoYW5nZVRyYWNraW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NoYW5nZVRyYWNraW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NIQU5HRV9UUkFDS0lORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDaGFuZ2VUcmFja2luZyhuZXdDaGFuZ2VUcmFja2luZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0hBTkdFX1RSQUNLSU5HLCBuZXdDaGFuZ2VUcmFja2luZywgbmV3Q2hhbmdlVHJhY2tpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWNoZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FjaGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENhY2hlKFhtbENhY2hlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVIb2xkZXJfQ2FjaGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENhY2hlIGdldENhY2hlKCkKLQl7Ci0JCXJldHVybiBjYWNoZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDYWNoZShYbWxDYWNoZSBuZXdDYWNoZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENhY2hlIG9sZENhY2hlID0gY2FjaGU7Ci0JCWNhY2hlID0gbmV3Q2FjaGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRSwgb2xkQ2FjaGUsIG5ld0NhY2hlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRDYWNoZSA8ZW0+Q2FjaGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDYWNoZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhY2hlKFhtbENhY2hlIG5ld0NhY2hlKQotCXsKLQkJaWYgKG5ld0NhY2hlICE9IGNhY2hlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjYWNoZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljYWNoZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q2FjaGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q2FjaGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2FjaGUobmV3Q2FjaGUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFLCBuZXdDYWNoZSwgbmV3Q2FjaGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGlzdGVuY2UgQ2hlY2tpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlCi0JICogQHNlZSAjc2V0RXhpc3RlbmNlQ2hlY2tpbmcoRXhpc3RlbmNlVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlSG9sZGVyX0V4aXN0ZW5jZUNoZWNraW5nKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXhpc3RlbmNlVHlwZSBnZXRFeGlzdGVuY2VDaGVja2luZygpCi0JewotCQlyZXR1cm4gZXhpc3RlbmNlQ2hlY2tpbmc7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0RXhpc3RlbmNlQ2hlY2tpbmcgPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhpc3RlbmNlIENoZWNraW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZQotCSAqIEBzZWUgI2dldEV4aXN0ZW5jZUNoZWNraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhpc3RlbmNlQ2hlY2tpbmcoRXhpc3RlbmNlVHlwZSBuZXdFeGlzdGVuY2VDaGVja2luZykKLQl7Ci0JCUV4aXN0ZW5jZVR5cGUgb2xkRXhpc3RlbmNlQ2hlY2tpbmcgPSBleGlzdGVuY2VDaGVja2luZzsKLQkJZXhpc3RlbmNlQ2hlY2tpbmcgPSBuZXdFeGlzdGVuY2VDaGVja2luZyA9PSBudWxsID8gRVhJU1RFTkNFX0NIRUNLSU5HX0VERUZBVUxUIDogbmV3RXhpc3RlbmNlQ2hlY2tpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWElTVEVOQ0VfQ0hFQ0tJTkcsIG9sZEV4aXN0ZW5jZUNoZWNraW5nLCBleGlzdGVuY2VDaGVja2luZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckNvbnRhaW5lcl9Db252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxDb252ZXJ0ZXI+IGdldENvbnZlcnRlcnMoKQotCXsKLQkJaWYgKGNvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJY29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxDb252ZXJ0ZXI+KFhtbENvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiBjb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfVHlwZUNvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+IGdldFR5cGVDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmICh0eXBlQ29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQl0eXBlQ29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxUeXBlQ29udmVydGVyPihYbWxUeXBlQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVFlQRV9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gdHlwZUNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckNvbnRhaW5lcl9PYmplY3RUeXBlQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCXsKLQkJaWYgKG9iamVjdFR5cGVDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCW9iamVjdFR5cGVDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+KFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1N0cnVjdENvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4gZ2V0U3RydWN0Q29udmVydGVycygpCi0JewotCQlpZiAoc3RydWN0Q29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQlzdHJ1Y3RDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4oWG1sU3RydWN0Q29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1RSVUNUX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9wdGltaXN0aWMgTG9ja2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3B0aW1pc3RpYyBMb2NraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9wdGltaXN0aWMgTG9ja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0T3B0aW1pc3RpY0xvY2tpbmcoWG1sT3B0aW1pc3RpY0xvY2tpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfT3B0aW1pc3RpY0xvY2tpbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE9wdGltaXN0aWNMb2NraW5nIGdldE9wdGltaXN0aWNMb2NraW5nKCkKLQl7Ci0JCXJldHVybiBvcHRpbWlzdGljTG9ja2luZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRPcHRpbWlzdGljTG9ja2luZyhYbWxPcHRpbWlzdGljTG9ja2luZyBuZXdPcHRpbWlzdGljTG9ja2luZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbE9wdGltaXN0aWNMb2NraW5nIG9sZE9wdGltaXN0aWNMb2NraW5nID0gb3B0aW1pc3RpY0xvY2tpbmc7Ci0JCW9wdGltaXN0aWNMb2NraW5nID0gbmV3T3B0aW1pc3RpY0xvY2tpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PUFRJTUlTVElDX0xPQ0tJTkcsIG9sZE9wdGltaXN0aWNMb2NraW5nLCBuZXdPcHRpbWlzdGljTG9ja2luZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0T3B0aW1pc3RpY0xvY2tpbmcgPGVtPk9wdGltaXN0aWMgTG9ja2luZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW1pc3RpYyBMb2NraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRPcHRpbWlzdGljTG9ja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wdGltaXN0aWNMb2NraW5nKFhtbE9wdGltaXN0aWNMb2NraW5nIG5ld09wdGltaXN0aWNMb2NraW5nKQotCXsKLQkJaWYgKG5ld09wdGltaXN0aWNMb2NraW5nICE9IG9wdGltaXN0aWNMb2NraW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChvcHRpbWlzdGljTG9ja2luZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClvcHRpbWlzdGljTG9ja2luZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PUFRJTUlTVElDX0xPQ0tJTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld09wdGltaXN0aWNMb2NraW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld09wdGltaXN0aWNMb2NraW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX09QVElNSVNUSUNfTE9DS0lORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRPcHRpbWlzdGljTG9ja2luZyhuZXdPcHRpbWlzdGljTG9ja2luZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fT1BUSU1JU1RJQ19MT0NLSU5HLCBuZXdPcHRpbWlzdGljTG9ja2luZywgbmV3T3B0aW1pc3RpY0xvY2tpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvcHlQb2xpY3koWG1sQ29weVBvbGljeSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eV9Db3B5UG9saWN5KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDb3B5UG9saWN5IGdldENvcHlQb2xpY3koKQotCXsKLQkJcmV0dXJuIGNvcHlQb2xpY3k7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29weVBvbGljeShYbWxDb3B5UG9saWN5IG5ld0NvcHlQb2xpY3ksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDb3B5UG9saWN5IG9sZENvcHlQb2xpY3kgPSBjb3B5UG9saWN5OwotCQljb3B5UG9saWN5ID0gbmV3Q29weVBvbGljeTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPUFlfUE9MSUNZLCBvbGRDb3B5UG9saWN5LCBuZXdDb3B5UG9saWN5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRDb3B5UG9saWN5IDxlbT5Db3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5UG9saWN5KFhtbENvcHlQb2xpY3kgbmV3Q29weVBvbGljeSkKLQl7Ci0JCWlmIChuZXdDb3B5UG9saWN5ICE9IGNvcHlQb2xpY3kpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNvcHlQb2xpY3kgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY29weVBvbGljeSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q29weVBvbGljeSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb3B5UG9saWN5KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvcHlQb2xpY3kobmV3Q29weVBvbGljeSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ09QWV9QT0xJQ1ksIG5ld0NvcHlQb2xpY3ksIG5ld0NvcHlQb2xpY3kpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X0luc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4gaW5zdGFudGlhdGlvbkNvcHlQb2xpY3k7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3ksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBvbGRJbnN0YW50aWF0aW9uQ29weVBvbGljeSA9IGluc3RhbnRpYXRpb25Db3B5UG9saWN5OwotCQlpbnN0YW50aWF0aW9uQ29weVBvbGljeSA9IG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSwgb2xkSW5zdGFudGlhdGlvbkNvcHlQb2xpY3ksIG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSA8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSkKLQl7Ci0JCWlmIChuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSAhPSBpbnN0YW50aWF0aW9uQ29weVBvbGljeSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSwgbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3ksIG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2xvbmUgQ29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDbG9uZUNvcHlQb2xpY3koWG1sQ2xvbmVDb3B5UG9saWN5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X0Nsb25lQ29weVBvbGljeSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ2xvbmVDb3B5UG9saWN5IGdldENsb25lQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4gY2xvbmVDb3B5UG9saWN5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENsb25lQ29weVBvbGljeShYbWxDbG9uZUNvcHlQb2xpY3kgbmV3Q2xvbmVDb3B5UG9saWN5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ2xvbmVDb3B5UG9saWN5IG9sZENsb25lQ29weVBvbGljeSA9IGNsb25lQ29weVBvbGljeTsKLQkJY2xvbmVDb3B5UG9saWN5ID0gbmV3Q2xvbmVDb3B5UG9saWN5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xPTkVfQ09QWV9QT0xJQ1ksIG9sZENsb25lQ29weVBvbGljeSwgbmV3Q2xvbmVDb3B5UG9saWN5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRDbG9uZUNvcHlQb2xpY3kgPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2xvbmVDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xvbmVDb3B5UG9saWN5KFhtbENsb25lQ29weVBvbGljeSBuZXdDbG9uZUNvcHlQb2xpY3kpCi0JewotCQlpZiAobmV3Q2xvbmVDb3B5UG9saWN5ICE9IGNsb25lQ29weVBvbGljeSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY2xvbmVDb3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNsb25lQ29weVBvbGljeSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q2xvbmVDb3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0Nsb25lQ29weVBvbGljeSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDbG9uZUNvcHlQb2xpY3kobmV3Q2xvbmVDb3B5UG9saWN5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWSwgbmV3Q2xvbmVDb3B5UG9saWN5LCBuZXdDbG9uZUNvcHlQb2xpY3kpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5PiBnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKQotCXsKLQkJaWYgKG5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcyA9PSBudWxsKQotCQl7Ci0JCQluYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeT4oWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUyk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmltYXJ5S2V5KFhtbFByaW1hcnlLZXkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfMV8xX1ByaW1hcnlLZXkoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFByaW1hcnlLZXkgZ2V0UHJpbWFyeUtleSgpCi0JewotCQlyZXR1cm4gcHJpbWFyeUtleTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcmltYXJ5S2V5KFhtbFByaW1hcnlLZXkgbmV3UHJpbWFyeUtleSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFByaW1hcnlLZXkgb2xkUHJpbWFyeUtleSA9IHByaW1hcnlLZXk7Ci0JCXByaW1hcnlLZXkgPSBuZXdQcmltYXJ5S2V5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVksIG9sZFByaW1hcnlLZXksIG5ld1ByaW1hcnlLZXkpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFByaW1hcnlLZXkgPGVtPlByaW1hcnkgS2V5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmltYXJ5IEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJpbWFyeUtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByaW1hcnlLZXkoWG1sUHJpbWFyeUtleSBuZXdQcmltYXJ5S2V5KQotCXsKLQkJaWYgKG5ld1ByaW1hcnlLZXkgIT0gcHJpbWFyeUtleSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJpbWFyeUtleSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwcmltYXJ5S2V5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSSU1BUllfS0VZLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcmltYXJ5S2V5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1ByaW1hcnlLZXkpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVksIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJpbWFyeUtleShuZXdQcmltYXJ5S2V5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWSwgbmV3UHJpbWFyeUtleSwgbmV3UHJpbWFyeUtleSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhY2hlIEludGVyY2VwdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYWNoZSBJbnRlcmNlcHRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZSBJbnRlcmNlcHRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2FjaGVJbnRlcmNlcHRvcihYbWxDbGFzc1JlZmVyZW5jZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eV8yXzBfQ2FjaGVJbnRlcmNlcHRvcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ2xhc3NSZWZlcmVuY2UgZ2V0Q2FjaGVJbnRlcmNlcHRvcigpCi0JewotCQlyZXR1cm4gY2FjaGVJbnRlcmNlcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDYWNoZUludGVyY2VwdG9yKFhtbENsYXNzUmVmZXJlbmNlIG5ld0NhY2hlSW50ZXJjZXB0b3IsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDbGFzc1JlZmVyZW5jZSBvbGRDYWNoZUludGVyY2VwdG9yID0gY2FjaGVJbnRlcmNlcHRvcjsKLQkJY2FjaGVJbnRlcmNlcHRvciA9IG5ld0NhY2hlSW50ZXJjZXB0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRV9JTlRFUkNFUFRPUiwgb2xkQ2FjaGVJbnRlcmNlcHRvciwgbmV3Q2FjaGVJbnRlcmNlcHRvcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q2FjaGVJbnRlcmNlcHRvciA8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlIEludGVyY2VwdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDYWNoZUludGVyY2VwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FjaGVJbnRlcmNlcHRvcihYbWxDbGFzc1JlZmVyZW5jZSBuZXdDYWNoZUludGVyY2VwdG9yKQotCXsKLQkJaWYgKG5ld0NhY2hlSW50ZXJjZXB0b3IgIT0gY2FjaGVJbnRlcmNlcHRvcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY2FjaGVJbnRlcmNlcHRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljYWNoZUludGVyY2VwdG9yKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFX0lOVEVSQ0VQVE9SLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDYWNoZUludGVyY2VwdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NhY2hlSW50ZXJjZXB0b3IpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEVfSU5URVJDRVBUT1IsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2FjaGVJbnRlcmNlcHRvcihuZXdDYWNoZUludGVyY2VwdG9yLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRV9JTlRFUkNFUFRPUiwgbmV3Q2FjaGVJbnRlcmNlcHRvciwgbmV3Q2FjaGVJbnRlcmNlcHRvcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlF1ZXJ5IFJlZGlyZWN0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UXVlcnlSZWRpcmVjdG9ycyhYbWxRdWVyeVJlZGlyZWN0b3JzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5XzJfMF9RdWVyeVJlZGlyZWN0b3JzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxRdWVyeVJlZGlyZWN0b3JzIGdldFF1ZXJ5UmVkaXJlY3RvcnMoKQotCXsKLQkJcmV0dXJuIHF1ZXJ5UmVkaXJlY3RvcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UXVlcnlSZWRpcmVjdG9ycyhYbWxRdWVyeVJlZGlyZWN0b3JzIG5ld1F1ZXJ5UmVkaXJlY3RvcnMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxRdWVyeVJlZGlyZWN0b3JzIG9sZFF1ZXJ5UmVkaXJlY3RvcnMgPSBxdWVyeVJlZGlyZWN0b3JzOwotCQlxdWVyeVJlZGlyZWN0b3JzID0gbmV3UXVlcnlSZWRpcmVjdG9yczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1FVRVJZX1JFRElSRUNUT1JTLCBvbGRRdWVyeVJlZGlyZWN0b3JzLCBuZXdRdWVyeVJlZGlyZWN0b3JzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRRdWVyeVJlZGlyZWN0b3JzIDxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFF1ZXJ5UmVkaXJlY3RvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRRdWVyeVJlZGlyZWN0b3JzKFhtbFF1ZXJ5UmVkaXJlY3RvcnMgbmV3UXVlcnlSZWRpcmVjdG9ycykKLQl7Ci0JCWlmIChuZXdRdWVyeVJlZGlyZWN0b3JzICE9IHF1ZXJ5UmVkaXJlY3RvcnMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHF1ZXJ5UmVkaXJlY3RvcnMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcXVlcnlSZWRpcmVjdG9ycykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19RVUVSWV9SRURJUkVDVE9SUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UXVlcnlSZWRpcmVjdG9ycyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdRdWVyeVJlZGlyZWN0b3JzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1FVRVJZX1JFRElSRUNUT1JTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFF1ZXJ5UmVkaXJlY3RvcnMobmV3UXVlcnlSZWRpcmVjdG9ycywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUVVFUllfUkVESVJFQ1RPUlMsIG5ld1F1ZXJ5UmVkaXJlY3RvcnMsIG5ld1F1ZXJ5UmVkaXJlY3RvcnMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKLQkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCi0JewotCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmV0Y2ggR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxGZXRjaEdyb3VwfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZldGNoIEdyb3VwczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZldGNoIEdyb3VwczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xX0ZldGNoR3JvdXBzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxGZXRjaEdyb3VwPiBnZXRGZXRjaEdyb3VwcygpCi0JewotCQlpZiAoZmV0Y2hHcm91cHMgPT0gbnVsbCkKLQkJewotCQkJZmV0Y2hHcm91cHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sRmV0Y2hHcm91cD4oWG1sRmV0Y2hHcm91cC5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0ZFVENIX0dST1VQUyk7Ci0JCX0KLQkJcmV0dXJuIGZldGNoR3JvdXBzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNsYXNzIEV4dHJhY3RvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xhc3MgRXh0cmFjdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIEV4dHJhY3RvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2xhc3NFeHRyYWN0b3IoWG1sQ2xhc3NSZWZlcmVuY2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8xX0NsYXNzRXh0cmFjdG9yKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDbGFzc1JlZmVyZW5jZSBnZXRDbGFzc0V4dHJhY3RvcigpCi0JewotCQlyZXR1cm4gY2xhc3NFeHRyYWN0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2xhc3NFeHRyYWN0b3IoWG1sQ2xhc3NSZWZlcmVuY2UgbmV3Q2xhc3NFeHRyYWN0b3IsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDbGFzc1JlZmVyZW5jZSBvbGRDbGFzc0V4dHJhY3RvciA9IGNsYXNzRXh0cmFjdG9yOwotCQljbGFzc0V4dHJhY3RvciA9IG5ld0NsYXNzRXh0cmFjdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xBU1NfRVhUUkFDVE9SLCBvbGRDbGFzc0V4dHJhY3RvciwgbmV3Q2xhc3NFeHRyYWN0b3IpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldENsYXNzRXh0cmFjdG9yIDxlbT5DbGFzcyBFeHRyYWN0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIEV4dHJhY3RvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2xhc3NFeHRyYWN0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc0V4dHJhY3RvcihYbWxDbGFzc1JlZmVyZW5jZSBuZXdDbGFzc0V4dHJhY3RvcikKLQl7Ci0JCWlmIChuZXdDbGFzc0V4dHJhY3RvciAhPSBjbGFzc0V4dHJhY3RvcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY2xhc3NFeHRyYWN0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY2xhc3NFeHRyYWN0b3IpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xBU1NfRVhUUkFDVE9SLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDbGFzc0V4dHJhY3RvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDbGFzc0V4dHJhY3RvcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTEFTU19FWFRSQUNUT1IsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2xhc3NFeHRyYWN0b3IobmV3Q2xhc3NFeHRyYWN0b3IsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NMQVNTX0VYVFJBQ1RPUiwgbmV3Q2xhc3NFeHRyYWN0b3IsIG5ld0NsYXNzRXh0cmFjdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyZW50IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJlbnQgQ2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyZW50IENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJlbnRDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUeXBlTWFwcGluZ18yXzFfUGFyZW50Q2xhc3MoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJlbnRDbGFzcygpCi0JewotCQlyZXR1cm4gcGFyZW50Q2xhc3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UGFyZW50Q2xhc3MgPGVtPlBhcmVudCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFyZW50IENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYXJlbnRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudENsYXNzKFN0cmluZyBuZXdQYXJlbnRDbGFzcykKLQl7Ci0JCVN0cmluZyBvbGRQYXJlbnRDbGFzcyA9IHBhcmVudENsYXNzOwotCQlwYXJlbnRDbGFzcyA9IG5ld1BhcmVudENsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSRU5UX0NMQVNTLCBvbGRQYXJlbnRDbGFzcywgcGFyZW50Q2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBhcnRpdGlvbmluZyhYbWxQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGFydGl0aW9uaW5nXzJfMiBnZXRQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQYXJ0aXRpb25pbmcoWG1sUGFydGl0aW9uaW5nXzJfMiBuZXdQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxQYXJ0aXRpb25pbmdfMl8yIG9sZFBhcnRpdGlvbmluZyA9IHBhcnRpdGlvbmluZzsKLQkJcGFydGl0aW9uaW5nID0gbmV3UGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSVElUSU9OSU5HLCBvbGRQYXJ0aXRpb25pbmcsIG5ld1BhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UGFydGl0aW9uaW5nIDxlbT5QYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFydGl0aW9uaW5nKFhtbFBhcnRpdGlvbmluZ18yXzIgbmV3UGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1BhcnRpdGlvbmluZyAhPSBwYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQYXJ0aXRpb25pbmcobmV3UGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QQVJUSVRJT05JTkcsIG5ld1BhcnRpdGlvbmluZywgbmV3UGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiBnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG9sZFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nID0gcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JCXJlcGxpY2F0aW9uUGFydGl0aW9uaW5nID0gbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIG9sZFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSByZXBsaWNhdGlvblBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmVwbGljYXRpb25QYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcobmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORywgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcsIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIGdldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHJvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgb2xkUm91bmRSb2JpblBhcnRpdGlvbmluZyA9IHJvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0JCXJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgPSBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HLCBvbGRSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nIDxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpcm91bmRSb2JpblBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBpbm5lZFBhcnRpdGlvbmluZyhYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1Bpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHBpbm5lZFBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBuZXdQaW5uZWRQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIG9sZFBpbm5lZFBhcnRpdGlvbmluZyA9IHBpbm5lZFBhcnRpdGlvbmluZzsKLQkJcGlubmVkUGFydGl0aW9uaW5nID0gbmV3UGlubmVkUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUElOTkVEX1BBUlRJVElPTklORywgb2xkUGlubmVkUGFydGl0aW9uaW5nLCBuZXdQaW5uZWRQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFBpbm5lZFBhcnRpdGlvbmluZyA8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGlubmVkUGFydGl0aW9uaW5nKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgbmV3UGlubmVkUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1Bpbm5lZFBhcnRpdGlvbmluZyAhPSBwaW5uZWRQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwaW5uZWRQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUElOTkVEX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UGlubmVkUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Bpbm5lZFBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QSU5ORURfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBpbm5lZFBhcnRpdGlvbmluZyhuZXdQaW5uZWRQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BJTk5FRF9QQVJUSVRJT05JTkcsIG5ld1Bpbm5lZFBhcnRpdGlvbmluZywgbmV3UGlubmVkUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSYW5nZVBhcnRpdGlvbmluZyhYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiBnZXRSYW5nZVBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcmFuZ2VQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmFuZ2VQYXJ0aXRpb25pbmcoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG5ld1JhbmdlUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG9sZFJhbmdlUGFydGl0aW9uaW5nID0gcmFuZ2VQYXJ0aXRpb25pbmc7Ci0JCXJhbmdlUGFydGl0aW9uaW5nID0gbmV3UmFuZ2VQYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SQU5HRV9QQVJUSVRJT05JTkcsIG9sZFJhbmdlUGFydGl0aW9uaW5nLCBuZXdSYW5nZVBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcgPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSYW5nZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhbmdlUGFydGl0aW9uaW5nKFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiBuZXdSYW5nZVBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdSYW5nZVBhcnRpdGlvbmluZyAhPSByYW5nZVBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmFuZ2VQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmFuZ2VQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkFOR0VfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSYW5nZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSYW5nZVBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SQU5HRV9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmFuZ2VQYXJ0aXRpb25pbmcobmV3UmFuZ2VQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1JBTkdFX1BBUlRJVElPTklORywgbmV3UmFuZ2VQYXJ0aXRpb25pbmcsIG5ld1JhbmdlUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRWYWx1ZVBhcnRpdGlvbmluZyhYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfVmFsdWVQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiBnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gdmFsdWVQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VmFsdWVQYXJ0aXRpb25pbmcoWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIG5ld1ZhbHVlUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIG9sZFZhbHVlUGFydGl0aW9uaW5nID0gdmFsdWVQYXJ0aXRpb25pbmc7Ci0JCXZhbHVlUGFydGl0aW9uaW5nID0gbmV3VmFsdWVQYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19WQUxVRV9QQVJUSVRJT05JTkcsIG9sZFZhbHVlUGFydGl0aW9uaW5nLCBuZXdWYWx1ZVBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0VmFsdWVQYXJ0aXRpb25pbmcgPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiBuZXdWYWx1ZVBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdWYWx1ZVBhcnRpdGlvbmluZyAhPSB2YWx1ZVBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodmFsdWVQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdmFsdWVQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVkFMVUVfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdWYWx1ZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdWYWx1ZVBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19WQUxVRV9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VmFsdWVQYXJ0aXRpb25pbmcobmV3VmFsdWVQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1ZBTFVFX1BBUlRJVElPTklORywgbmV3VmFsdWVQYXJ0aXRpb25pbmcsIG5ld1ZhbHVlUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRIYXNoUGFydGl0aW9uaW5nKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX0hhc2hQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIGdldEhhc2hQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIGhhc2hQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SGFzaFBhcnRpdGlvbmluZyhYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBuZXdIYXNoUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgb2xkSGFzaFBhcnRpdGlvbmluZyA9IGhhc2hQYXJ0aXRpb25pbmc7Ci0JCWhhc2hQYXJ0aXRpb25pbmcgPSBuZXdIYXNoUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSEFTSF9QQVJUSVRJT05JTkcsIG9sZEhhc2hQYXJ0aXRpb25pbmcsIG5ld0hhc2hQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEhhc2hQYXJ0aXRpb25pbmcgPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SGFzaFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc2hQYXJ0aXRpb25pbmcoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgbmV3SGFzaFBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdIYXNoUGFydGl0aW9uaW5nICE9IGhhc2hQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGhhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaGFzaFBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19IQVNIX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SGFzaFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdIYXNoUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0hBU0hfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEhhc2hQYXJ0aXRpb25pbmcobmV3SGFzaFBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSEFTSF9QQVJUSVRJT05JTkcsIG5ld0hhc2hQYXJ0aXRpb25pbmcsIG5ld0hhc2hQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFVuaW9uUGFydGl0aW9uaW5nKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9VbmlvblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIGdldFVuaW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB1bmlvblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRVbmlvblBhcnRpdGlvbmluZyhYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgbmV3VW5pb25QYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgb2xkVW5pb25QYXJ0aXRpb25pbmcgPSB1bmlvblBhcnRpdGlvbmluZzsKLQkJdW5pb25QYXJ0aXRpb25pbmcgPSBuZXdVbmlvblBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1VOSU9OX1BBUlRJVElPTklORywgb2xkVW5pb25QYXJ0aXRpb25pbmcsIG5ld1VuaW9uUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRVbmlvblBhcnRpdGlvbmluZyA8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFVuaW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5pb25QYXJ0aXRpb25pbmcoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIG5ld1VuaW9uUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1VuaW9uUGFydGl0aW9uaW5nICE9IHVuaW9uUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh1bmlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl1bmlvblBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19VTklPTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1VuaW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1VuaW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1VOSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRVbmlvblBhcnRpdGlvbmluZyhuZXdVbmlvblBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVU5JT05fUEFSVElUSU9OSU5HLCBuZXdVbmlvblBhcnRpdGlvbmluZywgbmV3VW5pb25QYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJ0aXRpb25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFydGl0aW9uZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhcnRpdGlvbmVkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QYXJ0aXRpb25lZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvbmVkKCkKLQl7Ci0JCXJldHVybiBwYXJ0aXRpb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQYXJ0aXRpb25lZCA8ZW0+UGFydGl0aW9uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnRpdGlvbmVkKFN0cmluZyBuZXdQYXJ0aXRpb25lZCkKLQl7Ci0JCVN0cmluZyBvbGRQYXJ0aXRpb25lZCA9IHBhcnRpdGlvbmVkOwotCQlwYXJ0aXRpb25lZCA9IG5ld1BhcnRpdGlvbmVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSVElUSU9ORUQsIG9sZFBhcnRpdGlvbmVkLCBwYXJ0aXRpb25lZCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQl7Ci0JCXJldHVybiBjYXNjYWRlT25EZWxldGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhc2NhZGVPbkRlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVPbkRlbGV0ZShCb29sZWFuIG5ld0Nhc2NhZGVPbkRlbGV0ZSkKLQl7Ci0JCUJvb2xlYW4gb2xkQ2FzY2FkZU9uRGVsZXRlID0gY2FzY2FkZU9uRGVsZXRlOwotCQljYXNjYWRlT25EZWxldGUgPSBuZXdDYXNjYWRlT25EZWxldGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQVNDQURFX09OX0RFTEVURSwgb2xkQ2FzY2FkZU9uRGVsZXRlLCBjYXNjYWRlT25EZWxldGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEluZGV4KFhtbEluZGV4XzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eV8yXzJfSW5kZXgoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEluZGV4XzJfMiBnZXRJbmRleCgpCi0JewotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SW5kZXgoWG1sSW5kZXhfMl8yIG5ld0luZGV4LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sSW5kZXhfMl8yIG9sZEluZGV4ID0gaW5kZXg7Ci0JCWluZGV4ID0gbmV3SW5kZXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTkRFWCwgb2xkSW5kZXgsIG5ld0luZGV4KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRJbmRleCA8ZW0+SW5kZXg8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluZGV4PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluZGV4KFhtbEluZGV4XzJfMiBuZXdJbmRleCkKLQl7Ci0JCWlmIChuZXdJbmRleCAhPSBpbmRleCkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoaW5kZXggIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaW5kZXgpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5ERVgsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0luZGV4ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0luZGV4KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOREVYLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEluZGV4KG5ld0luZGV4LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTkRFWCwgbmV3SW5kZXgsIG5ld0luZGV4KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TXVsdGl0ZW5hbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk11bHRpdGVuYW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk11bHRpdGVuYW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRNdWx0aXRlbmFudChYbWxNdWx0aXRlbmFudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE11bHRpdGVuYW50SG9sZGVyX011bHRpdGVuYW50KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxNdWx0aXRlbmFudCBnZXRNdWx0aXRlbmFudCgpCi0JewotCQlyZXR1cm4gbXVsdGl0ZW5hbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TXVsdGl0ZW5hbnQoWG1sTXVsdGl0ZW5hbnQgbmV3TXVsdGl0ZW5hbnQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxNdWx0aXRlbmFudCBvbGRNdWx0aXRlbmFudCA9IG11bHRpdGVuYW50OwotCQltdWx0aXRlbmFudCA9IG5ld011bHRpdGVuYW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTVVMVElURU5BTlQsIG9sZE11bHRpdGVuYW50LCBuZXdNdWx0aXRlbmFudCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0TXVsdGl0ZW5hbnQgPGVtPk11bHRpdGVuYW50PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NdWx0aXRlbmFudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TXVsdGl0ZW5hbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNdWx0aXRlbmFudChYbWxNdWx0aXRlbmFudCBuZXdNdWx0aXRlbmFudCkKLQl7Ci0JCWlmIChuZXdNdWx0aXRlbmFudCAhPSBtdWx0aXRlbmFudCkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAobXVsdGl0ZW5hbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbXVsdGl0ZW5hbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTVVMVElURU5BTlQsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld011bHRpdGVuYW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld011bHRpdGVuYW50KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX01VTFRJVEVOQU5ULCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE11bHRpdGVuYW50KG5ld011bHRpdGVuYW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19NVUxUSVRFTkFOVCwgbmV3TXVsdGl0ZW5hbnQsIG5ld011bHRpdGVuYW50KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZWQgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfM30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lZCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVkIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5XzJfM19OYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMz4gZ2V0TmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKQotCXsKLQkJaWYgKG5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyaWVzID09IG51bGwpCi0JCXsKLQkJCW5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyaWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM+KFhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUyk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyaWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVkIFBsc3FsIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfM30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lZCBQbHNxbCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVkIFBsc3FsIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5XzJfM19OYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM+IGdldE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKQotCXsKLQkJaWYgKG5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMgPT0gbnVsbCkKLQkJewotCQkJbmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM+KFhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMy5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTKTsKLQkJfQotCQlyZXR1cm4gbmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBQbHNxbCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfM30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lZCBQbHNxbCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lZCBQbHNxbCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8zX05hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zPiBnZXROYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCi0JewotCQlpZiAobmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgPT0gbnVsbCkKLQkJewotCQkJbmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfMz4oWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfMy5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUyk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBsc3FsIFJlY29yZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sUGxzcWxSZWNvcmRfMl8zfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBsc3FsIFJlY29yZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QbHNxbCBSZWNvcmRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5XzJfM19QbHNxbFJlY29yZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFBsc3FsUmVjb3JkXzJfMz4gZ2V0UGxzcWxSZWNvcmRzKCkKLQl7Ci0JCWlmIChwbHNxbFJlY29yZHMgPT0gbnVsbCkKLQkJewotCQkJcGxzcWxSZWNvcmRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFBsc3FsUmVjb3JkXzJfMz4oWG1sUGxzcWxSZWNvcmRfMl8zLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUExTUUxfUkVDT1JEUyk7Ci0JCX0KLQkJcmV0dXJuIHBsc3FsUmVjb3JkczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QbHNxbCBUYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBsc3FsVGFibGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGxzcWwgVGFibGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGxzcWwgVGFibGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5XzJfM19QbHNxbFRhYmxlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUGxzcWxUYWJsZT4gZ2V0UGxzcWxUYWJsZXMoKQotCXsKLQkJaWYgKHBsc3FsVGFibGVzID09IG51bGwpCi0JCXsKLQkJCXBsc3FsVGFibGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFBsc3FsVGFibGU+KFhtbFBsc3FsVGFibGUuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QTFNRTF9UQUJMRVMpOwotCQl9Ci0JCXJldHVybiBwbHNxbFRhYmxlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdHJ1Y3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cnVjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFN0cnVjdChYbWxTdHJ1Y3RfMl8zKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5XzJfM19TdHJ1Y3QoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFN0cnVjdF8yXzMgZ2V0U3RydWN0KCkKLQl7Ci0JCXJldHVybiBzdHJ1Y3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U3RydWN0KFhtbFN0cnVjdF8yXzMgbmV3U3RydWN0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sU3RydWN0XzJfMyBvbGRTdHJ1Y3QgPSBzdHJ1Y3Q7Ci0JCXN0cnVjdCA9IG5ld1N0cnVjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NUUlVDVCwgb2xkU3RydWN0LCBuZXdTdHJ1Y3QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFN0cnVjdCA8ZW0+U3RydWN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFN0cnVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cnVjdChYbWxTdHJ1Y3RfMl8zIG5ld1N0cnVjdCkKLQl7Ci0JCWlmIChuZXdTdHJ1Y3QgIT0gc3RydWN0KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChzdHJ1Y3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc3RydWN0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NUUlVDVCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3U3RydWN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1N0cnVjdCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19TVFJVQ1QsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U3RydWN0KG5ld1N0cnVjdCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1RSVUNULCBuZXdTdHJ1Y3QsIG5ld1N0cnVjdCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhY2hlIEluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYWNoZSBJbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZSBJbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2FjaGVJbmRleChYbWxDYWNoZUluZGV4XzJfNCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eV8yXzRfQ2FjaGVJbmRleCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ2FjaGVJbmRleF8yXzQgZ2V0Q2FjaGVJbmRleCgpCi0JewotCQlyZXR1cm4gY2FjaGVJbmRleDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDYWNoZUluZGV4KFhtbENhY2hlSW5kZXhfMl80IG5ld0NhY2hlSW5kZXgsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDYWNoZUluZGV4XzJfNCBvbGRDYWNoZUluZGV4ID0gY2FjaGVJbmRleDsKLQkJY2FjaGVJbmRleCA9IG5ld0NhY2hlSW5kZXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRV9JTkRFWCwgb2xkQ2FjaGVJbmRleCwgbmV3Q2FjaGVJbmRleCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q2FjaGVJbmRleCA8ZW0+Q2FjaGUgSW5kZXg8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlIEluZGV4PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDYWNoZUluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FjaGVJbmRleChYbWxDYWNoZUluZGV4XzJfNCBuZXdDYWNoZUluZGV4KQotCXsKLQkJaWYgKG5ld0NhY2hlSW5kZXggIT0gY2FjaGVJbmRleCkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY2FjaGVJbmRleCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljYWNoZUluZGV4KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFX0lOREVYLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDYWNoZUluZGV4ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NhY2hlSW5kZXgpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEVfSU5ERVgsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2FjaGVJbmRleChuZXdDYWNoZUluZGV4LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRV9JTkRFWCwgbmV3Q2FjaGVJbmRleCwgbmV3Q2FjaGVJbmRleCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkaXRpb25hbCBDcml0ZXJpYTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWRkaXRpb25hbENyaXRlcmlhKFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8yX0FkZGl0aW9uYWxDcml0ZXJpYSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMiBnZXRBZGRpdGlvbmFsQ3JpdGVyaWEoKQotCXsKLQkJcmV0dXJuIGFkZGl0aW9uYWxDcml0ZXJpYTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBZGRpdGlvbmFsQ3JpdGVyaWEoWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMiBuZXdBZGRpdGlvbmFsQ3JpdGVyaWEsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yIG9sZEFkZGl0aW9uYWxDcml0ZXJpYSA9IGFkZGl0aW9uYWxDcml0ZXJpYTsKLQkJYWRkaXRpb25hbENyaXRlcmlhID0gbmV3QWRkaXRpb25hbENyaXRlcmlhOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQURESVRJT05BTF9DUklURVJJQSwgb2xkQWRkaXRpb25hbENyaXRlcmlhLCBuZXdBZGRpdGlvbmFsQ3JpdGVyaWEpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEFkZGl0aW9uYWxDcml0ZXJpYSA8ZW0+QWRkaXRpb25hbCBDcml0ZXJpYTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWRkaXRpb25hbCBDcml0ZXJpYTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWRkaXRpb25hbENyaXRlcmlhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWRkaXRpb25hbENyaXRlcmlhKFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIgbmV3QWRkaXRpb25hbENyaXRlcmlhKQotCXsKLQkJaWYgKG5ld0FkZGl0aW9uYWxDcml0ZXJpYSAhPSBhZGRpdGlvbmFsQ3JpdGVyaWEpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFkZGl0aW9uYWxDcml0ZXJpYSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhZGRpdGlvbmFsQ3JpdGVyaWEpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQURESVRJT05BTF9DUklURVJJQSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QWRkaXRpb25hbENyaXRlcmlhICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FkZGl0aW9uYWxDcml0ZXJpYSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19BRERJVElPTkFMX0NSSVRFUklBLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFkZGl0aW9uYWxDcml0ZXJpYShuZXdBZGRpdGlvbmFsQ3JpdGVyaWEsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FERElUSU9OQUxfQ1JJVEVSSUEsIG5ld0FkZGl0aW9uYWxDcml0ZXJpYSwgbmV3QWRkaXRpb25hbENyaXRlcmlhKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JewotCQlyZXR1cm4gZXhjbHVkZURlZmF1bHRNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoQm9vbGVhbiBuZXdFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKQotCXsKLQkJQm9vbGVhbiBvbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzID0gZXhjbHVkZURlZmF1bHRNYXBwaW5nczsKLQkJZXhjbHVkZURlZmF1bHRNYXBwaW5ncyA9IG5ld0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MsIG9sZEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MsIGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBiYXNpY1NldEFjY2Vzc01ldGhvZHMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcmltYXJ5S2V5KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEVfSU5URVJDRVBUT1I6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q2FjaGVJbnRlcmNlcHRvcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1FVRVJZX1JFRElSRUNUT1JTOgotCQkJCXJldHVybiBiYXNpY1NldFF1ZXJ5UmVkaXJlY3RvcnMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19GRVRDSF9HUk9VUFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRGZXRjaEdyb3VwcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTEFTU19FWFRSQUNUT1I6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q2xhc3NFeHRyYWN0b3IobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFBpbm5lZFBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSYW5nZVBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRWYWx1ZVBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldEhhc2hQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VW5pb25QYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19BRERJVElPTkFMX0NSSVRFUklBOgotCQkJCXJldHVybiBiYXNpY1NldEFkZGl0aW9uYWxDcml0ZXJpYShudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOREVYOgotCQkJCXJldHVybiBiYXNpY1NldEluZGV4KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTVVMVElURU5BTlQ6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TXVsdGl0ZW5hbnQobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9QTFNRTF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXROYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QTFNRTF9SRUNPUkRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UGxzcWxSZWNvcmRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BMU1FMX1RBQkxFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFBsc3FsVGFibGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NUUlVDVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRTdHJ1Y3QobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRV9JTkRFWDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRDYWNoZUluZGV4KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ1VTVE9NSVpFUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRDdXN0b21pemVyKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0hBTkdFX1RSQUNLSU5HOgotCQkJCXJldHVybiBiYXNpY1NldENoYW5nZVRyYWNraW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q2FjaGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRUeXBlQ29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PUFRJTUlTVElDX0xPQ0tJTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0T3B0aW1pc3RpY0xvY2tpbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRDb3B5UG9saWN5KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NMT05FX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBiYXNpY1NldENsb25lQ29weVBvbGljeShudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSRU5UX0NMQVNTOgotCQkJCXJldHVybiBnZXRQYXJlbnRDbGFzcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVk6Ci0JCQkJcmV0dXJuIGdldFByaW1hcnlLZXkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFX0lOVEVSQ0VQVE9SOgotCQkJCXJldHVybiBnZXRDYWNoZUludGVyY2VwdG9yKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19RVUVSWV9SRURJUkVDVE9SUzoKLQkJCQlyZXR1cm4gZ2V0UXVlcnlSZWRpcmVjdG9ycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fRkVUQ0hfR1JPVVBTOgotCQkJCXJldHVybiBnZXRGZXRjaEdyb3VwcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xBU1NfRVhUUkFDVE9SOgotCQkJCXJldHVybiBnZXRDbGFzc0V4dHJhY3RvcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UGlubmVkUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFJhbmdlUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19WQUxVRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFZhbHVlUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0SGFzaFBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRVbmlvblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSVElUSU9ORUQ6Ci0JCQkJcmV0dXJuIGdldFBhcnRpdGlvbmVkKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19BRERJVElPTkFMX0NSSVRFUklBOgotCQkJCXJldHVybiBnZXRBZGRpdGlvbmFsQ3JpdGVyaWEoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBU0NBREVfT05fREVMRVRFOgotCQkJCXJldHVybiBnZXRDYXNjYWRlT25EZWxldGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOREVYOgotCQkJCXJldHVybiBnZXRJbmRleCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTVVMVElURU5BTlQ6Ci0JCQkJcmV0dXJuIGdldE11bHRpdGVuYW50KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzoKLQkJCQlyZXR1cm4gZ2V0TmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTOgotCQkJCXJldHVybiBnZXROYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9QTFNRTF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIGdldE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QTFNRTF9SRUNPUkRTOgotCQkJCXJldHVybiBnZXRQbHNxbFJlY29yZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BMU1FMX1RBQkxFUzoKLQkJCQlyZXR1cm4gZ2V0UGxzcWxUYWJsZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NUUlVDVDoKLQkJCQlyZXR1cm4gZ2V0U3RydWN0KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRV9JTkRFWDoKLQkJCQlyZXR1cm4gZ2V0Q2FjaGVJbmRleCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkVBRF9PTkxZOgotCQkJCXJldHVybiBnZXRSZWFkT25seSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ1VTVE9NSVpFUjoKLQkJCQlyZXR1cm4gZ2V0Q3VzdG9taXplcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0hBTkdFX1RSQUNLSU5HOgotCQkJCXJldHVybiBnZXRDaGFuZ2VUcmFja2luZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEU6Ci0JCQkJcmV0dXJuIGdldENhY2hlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWElTVEVOQ0VfQ0hFQ0tJTkc6Ci0JCQkJcmV0dXJuIGdldEV4aXN0ZW5jZUNoZWNraW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRPYmplY3RUeXBlQ29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldFN0cnVjdENvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PUFRJTUlTVElDX0xPQ0tJTkc6Ci0JCQkJcmV0dXJuIGdldE9wdGltaXN0aWNMb2NraW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gZ2V0Q29weVBvbGljeSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NMT05FX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBnZXRDbG9uZUNvcHlQb2xpY3koKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BBUkVOVF9DTEFTUzoKLQkJCQlzZXRQYXJlbnRDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWToKLQkJCQlzZXRQcmltYXJ5S2V5KChYbWxQcmltYXJ5S2V5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRV9JTlRFUkNFUFRPUjoKLQkJCQlzZXRDYWNoZUludGVyY2VwdG9yKChYbWxDbGFzc1JlZmVyZW5jZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUVVFUllfUkVESVJFQ1RPUlM6Ci0JCQkJc2V0UXVlcnlSZWRpcmVjdG9ycygoWG1sUXVlcnlSZWRpcmVjdG9ycyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fRkVUQ0hfR1JPVVBTOgotCQkJCWdldEZldGNoR3JvdXBzKCkuY2xlYXIoKTsKLQkJCQlnZXRGZXRjaEdyb3VwcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sRmV0Y2hHcm91cD4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NMQVNTX0VYVFJBQ1RPUjoKLQkJCQlzZXRDbGFzc0V4dHJhY3RvcigoWG1sQ2xhc3NSZWZlcmVuY2UpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BBUlRJVElPTklORzoKLQkJCQlzZXRQYXJ0aXRpb25pbmcoKFhtbFBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlzZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UGlubmVkUGFydGl0aW9uaW5nKChYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UmFuZ2VQYXJ0aXRpb25pbmcoKFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXNldFZhbHVlUGFydGl0aW9uaW5nKChYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXNldEhhc2hQYXJ0aXRpb25pbmcoKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0VW5pb25QYXJ0aXRpb25pbmcoKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSVElUSU9ORUQ6Ci0JCQkJc2V0UGFydGl0aW9uZWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQURESVRJT05BTF9DUklURVJJQToKLQkJCQlzZXRBZGRpdGlvbmFsQ3JpdGVyaWEoKFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBU0NBREVfT05fREVMRVRFOgotCQkJCXNldENhc2NhZGVPbkRlbGV0ZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5ERVg6Ci0JCQkJc2V0SW5kZXgoKFhtbEluZGV4XzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTVVMVElURU5BTlQ6Ci0JCQkJc2V0TXVsdGl0ZW5hbnQoKFhtbE11bHRpdGVuYW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzoKLQkJCQlnZXROYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzoKLQkJCQlnZXROYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkuY2xlYXIoKTsKLQkJCQlnZXROYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9QTFNRTF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6Ci0JCQkJZ2V0TmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCWdldE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUExTUUxfUkVDT1JEUzoKLQkJCQlnZXRQbHNxbFJlY29yZHMoKS5jbGVhcigpOwotCQkJCWdldFBsc3FsUmVjb3JkcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUGxzcWxSZWNvcmRfMl8zPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUExTUUxfVEFCTEVTOgotCQkJCWdldFBsc3FsVGFibGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQbHNxbFRhYmxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUGxzcWxUYWJsZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NUUlVDVDoKLQkJCQlzZXRTdHJ1Y3QoKFhtbFN0cnVjdF8yXzMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFX0lOREVYOgotCQkJCXNldENhY2hlSW5kZXgoKFhtbENhY2hlSW5kZXhfMl80KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SRUFEX09OTFk6Ci0JCQkJc2V0UmVhZE9ubHkoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NVU1RPTUlaRVI6Ci0JCQkJc2V0Q3VzdG9taXplcigoWG1sQ2xhc3NSZWZlcmVuY2UpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NIQU5HRV9UUkFDS0lORzoKLQkJCQlzZXRDaGFuZ2VUcmFja2luZygoWG1sQ2hhbmdlVHJhY2tpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFOgotCQkJCXNldENhY2hlKChYbWxDYWNoZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhJU1RFTkNFX0NIRUNLSU5HOgotCQkJCXNldEV4aXN0ZW5jZUNoZWNraW5nKChFeGlzdGVuY2VUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT05WRVJURVJTOgotCQkJCWdldENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldENvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbENvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFR5cGVDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFN0cnVjdENvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCWdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PUFRJTUlTVElDX0xPQ0tJTkc6Ci0JCQkJc2V0T3B0aW1pc3RpY0xvY2tpbmcoKFhtbE9wdGltaXN0aWNMb2NraW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT1BZX1BPTElDWToKLQkJCQlzZXRDb3B5UG9saWN5KChYbWxDb3B5UG9saWN5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgotCQkJCXNldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KChYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xPTkVfQ09QWV9QT0xJQ1k6Ci0JCQkJc2V0Q2xvbmVDb3B5UG9saWN5KChYbWxDbG9uZUNvcHlQb2xpY3kpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKLQkJCQlzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BBUkVOVF9DTEFTUzoKLQkJCQlzZXRQYXJlbnRDbGFzcyhQQVJFTlRfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSSU1BUllfS0VZOgotCQkJCXNldFByaW1hcnlLZXkoKFhtbFByaW1hcnlLZXkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEVfSU5URVJDRVBUT1I6Ci0JCQkJc2V0Q2FjaGVJbnRlcmNlcHRvcigoWG1sQ2xhc3NSZWZlcmVuY2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUVVFUllfUkVESVJFQ1RPUlM6Ci0JCQkJc2V0UXVlcnlSZWRpcmVjdG9ycygoWG1sUXVlcnlSZWRpcmVjdG9ycyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19GRVRDSF9HUk9VUFM6Ci0JCQkJZ2V0RmV0Y2hHcm91cHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NMQVNTX0VYVFJBQ1RPUjoKLQkJCQlzZXRDbGFzc0V4dHJhY3RvcigoWG1sQ2xhc3NSZWZlcmVuY2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSVElUSU9OSU5HOgotCQkJCXNldFBhcnRpdGlvbmluZygoWG1sUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlzZXRQaW5uZWRQYXJ0aXRpb25pbmcoKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXNldFJhbmdlUGFydGl0aW9uaW5nKChYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXNldFZhbHVlUGFydGl0aW9uaW5nKChYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0SGFzaFBhcnRpdGlvbmluZygoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFVuaW9uUGFydGl0aW9uaW5nKChYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSVElUSU9ORUQ6Ci0JCQkJc2V0UGFydGl0aW9uZWQoUEFSVElUSU9ORURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FERElUSU9OQUxfQ1JJVEVSSUE6Ci0JCQkJc2V0QWRkaXRpb25hbENyaXRlcmlhKChYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBU0NBREVfT05fREVMRVRFOgotCQkJCXNldENhc2NhZGVPbkRlbGV0ZShDQVNDQURFX09OX0RFTEVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5ERVg6Ci0JCQkJc2V0SW5kZXgoKFhtbEluZGV4XzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19NVUxUSVRFTkFOVDoKLQkJCQlzZXRNdWx0aXRlbmFudCgoWG1sTXVsdGl0ZW5hbnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVM6Ci0JCQkJZ2V0TmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTOgotCQkJCWdldE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlnZXROYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUExTUUxfUkVDT1JEUzoKLQkJCQlnZXRQbHNxbFJlY29yZHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BMU1FMX1RBQkxFUzoKLQkJCQlnZXRQbHNxbFRhYmxlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1RSVUNUOgotCQkJCXNldFN0cnVjdCgoWG1sU3RydWN0XzJfMyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRV9JTkRFWDoKLQkJCQlzZXRDYWNoZUluZGV4KChYbWxDYWNoZUluZGV4XzJfNCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SRUFEX09OTFk6Ci0JCQkJc2V0UmVhZE9ubHkoUkVBRF9PTkxZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DVVNUT01JWkVSOgotCQkJCXNldEN1c3RvbWl6ZXIoKFhtbENsYXNzUmVmZXJlbmNlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NIQU5HRV9UUkFDS0lORzoKLQkJCQlzZXRDaGFuZ2VUcmFja2luZygoWG1sQ2hhbmdlVHJhY2tpbmcpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEU6Ci0JCQkJc2V0Q2FjaGUoKFhtbENhY2hlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYSVNURU5DRV9DSEVDS0lORzoKLQkJCQlzZXRFeGlzdGVuY2VDaGVja2luZyhFWElTVEVOQ0VfQ0hFQ0tJTkdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6Ci0JCQkJZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX09QVElNSVNUSUNfTE9DS0lORzoKLQkJCQlzZXRPcHRpbWlzdGljTG9ja2luZygoWG1sT3B0aW1pc3RpY0xvY2tpbmcpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ09QWV9QT0xJQ1k6Ci0JCQkJc2V0Q29weVBvbGljeSgoWG1sQ29weVBvbGljeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgotCQkJCXNldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KChYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWToKLQkJCQlzZXRDbG9uZUNvcHlQb2xpY3koKFhtbENsb25lQ29weVBvbGljeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6Ci0JCQkJc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyhFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSRU5UX0NMQVNTOgotCQkJCXJldHVybiBQQVJFTlRfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IHBhcmVudENsYXNzICE9IG51bGwgOiAhUEFSRU5UX0NMQVNTX0VERUZBVUxULmVxdWFscyhwYXJlbnRDbGFzcyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWToKLQkJCQlyZXR1cm4gcHJpbWFyeUtleSAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEVfSU5URVJDRVBUT1I6Ci0JCQkJcmV0dXJuIGNhY2hlSW50ZXJjZXB0b3IgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1FVRVJZX1JFRElSRUNUT1JTOgotCQkJCXJldHVybiBxdWVyeVJlZGlyZWN0b3JzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19GRVRDSF9HUk9VUFM6Ci0JCQkJcmV0dXJuIGZldGNoR3JvdXBzICE9IG51bGwgJiYgIWZldGNoR3JvdXBzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NMQVNTX0VYVFJBQ1RPUjoKLQkJCQlyZXR1cm4gY2xhc3NFeHRyYWN0b3IgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHBpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiByYW5nZVBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiB2YWx1ZVBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGhhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gdW5pb25QYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BBUlRJVElPTkVEOgotCQkJCXJldHVybiBQQVJUSVRJT05FRF9FREVGQVVMVCA9PSBudWxsID8gcGFydGl0aW9uZWQgIT0gbnVsbCA6ICFQQVJUSVRJT05FRF9FREVGQVVMVC5lcXVhbHMocGFydGl0aW9uZWQpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQURESVRJT05BTF9DUklURVJJQToKLQkJCQlyZXR1cm4gYWRkaXRpb25hbENyaXRlcmlhICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQVNDQURFX09OX0RFTEVURToKLQkJCQlyZXR1cm4gQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNhc2NhZGVPbkRlbGV0ZSAhPSBudWxsIDogIUNBU0NBREVfT05fREVMRVRFX0VERUZBVUxULmVxdWFscyhjYXNjYWRlT25EZWxldGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5ERVg6Ci0JCQkJcmV0dXJuIGluZGV4ICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19NVUxUSVRFTkFOVDoKLQkJCQlyZXR1cm4gbXVsdGl0ZW5hbnQgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTOgotCQkJCXJldHVybiBuYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcyAhPSBudWxsICYmICFuYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzoKLQkJCQlyZXR1cm4gbmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcyAhPSBudWxsICYmICFuYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gbmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgIT0gbnVsbCAmJiAhbmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUExTUUxfUkVDT1JEUzoKLQkJCQlyZXR1cm4gcGxzcWxSZWNvcmRzICE9IG51bGwgJiYgIXBsc3FsUmVjb3Jkcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QTFNRTF9UQUJMRVM6Ci0JCQkJcmV0dXJuIHBsc3FsVGFibGVzICE9IG51bGwgJiYgIXBsc3FsVGFibGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NUUlVDVDoKLQkJCQlyZXR1cm4gc3RydWN0ICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRV9JTkRFWDoKLQkJCQlyZXR1cm4gY2FjaGVJbmRleCAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkVBRF9PTkxZOgotCQkJCXJldHVybiBSRUFEX09OTFlfRURFRkFVTFQgPT0gbnVsbCA/IHJlYWRPbmx5ICE9IG51bGwgOiAhUkVBRF9PTkxZX0VERUZBVUxULmVxdWFscyhyZWFkT25seSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DVVNUT01JWkVSOgotCQkJCXJldHVybiBjdXN0b21pemVyICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DSEFOR0VfVFJBQ0tJTkc6Ci0JCQkJcmV0dXJuIGNoYW5nZVRyYWNraW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRToKLQkJCQlyZXR1cm4gY2FjaGUgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYSVNURU5DRV9DSEVDS0lORzoKLQkJCQlyZXR1cm4gZXhpc3RlbmNlQ2hlY2tpbmcgIT0gRVhJU1RFTkNFX0NIRUNLSU5HX0VERUZBVUxUOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gY29udmVydGVycyAhPSBudWxsICYmICFjb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gdHlwZUNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhdHlwZUNvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhb2JqZWN0VHlwZUNvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcnMgIT0gbnVsbCAmJiAhc3RydWN0Q29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIG5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcyAhPSBudWxsICYmICFuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gcHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX09QVElNSVNUSUNfTE9DS0lORzoKLQkJCQlyZXR1cm4gb3B0aW1pc3RpY0xvY2tpbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBjb3B5UG9saWN5ICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBpbnN0YW50aWF0aW9uQ29weVBvbGljeSAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xPTkVfQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGNsb25lQ29weVBvbGljeSAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTOgotCQkJCXJldHVybiBFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQgPT0gbnVsbCA/IGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgIT0gbnVsbCA6ICFFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQuZXF1YWxzKGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sVHlwZU1hcHBpbmdfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSRU5UX0NMQVNTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfVFlQRV9NQVBQSU5HXzIxX19QQVJFTlRfQ0xBU1M7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sVHlwZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbnRpdHlfMV8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVk6IHJldHVybiBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLlhNTF9FTlRJVFlfMTFfX1BSSU1BUllfS0VZOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVudGl0eV8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRV9JTlRFUkNFUFRPUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX0VOVElUWV8yMF9fQ0FDSEVfSU5URVJDRVBUT1I7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUVVFUllfUkVESVJFQ1RPUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9FTlRJVFlfMjBfX1FVRVJZX1JFRElSRUNUT1JTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fRkVUQ0hfR1JPVVBTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfQ09OVEFJTkVSXzIxX19GRVRDSF9HUk9VUFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW50aXR5XzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NMQVNTX0VYVFJBQ1RPUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0VOVElUWV8yMV9fQ0xBU1NfRVhUUkFDVE9SOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BJTk5FRF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkFOR0VfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVkFMVUVfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSEFTSF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX0hBU0hfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1VOSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVU5JT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BBUlRJVElPTkVEOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbnRpdHlfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQURESVRJT05BTF9DUklURVJJQTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0VOVElUWV8yMl9fQURESVRJT05BTF9DUklURVJJQTsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQVNDQURFX09OX0RFTEVURTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0VOVElUWV8yMl9fQ0FTQ0FERV9PTl9ERUxFVEU7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5ERVg6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9FTlRJVFlfMjJfX0lOREVYOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE11bHRpdGVuYW50SG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTVVMVElURU5BTlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VTFRJVEVOQU5UX0hPTERFUl9fTVVMVElURU5BTlQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW50aXR5XzJfMy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfRU5USVRZXzIzX19OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX0VOVElUWV8yM19fTkFNRURfUExTUUxfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfRU5USVRZXzIzX19OQU1FRF9QTFNRTF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUExTUUxfUkVDT1JEUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX0VOVElUWV8yM19fUExTUUxfUkVDT1JEUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QTFNRTF9UQUJMRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9FTlRJVFlfMjNfX1BMU1FMX1RBQkxFUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19TVFJVQ1Q6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9FTlRJVFlfMjNfX1NUUlVDVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbnRpdHlfMl80LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEVfSU5ERVg6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLlhNTF9FTlRJVFlfMjRfX0NBQ0hFX0lOREVYOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFJlYWRPbmx5LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkVBRF9PTkxZOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9SRUFEX09OTFlfX1JFQURfT05MWTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDdXN0b21pemVySG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ1VTVE9NSVpFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ1VTVE9NSVpFUl9IT0xERVJfX0NVU1RPTUlaRVI7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DSEFOR0VfVFJBQ0tJTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NIQU5HRV9UUkFDS0lOR19IT0xERVJfX0NIQU5HRV9UUkFDS0lORzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDYWNoZUhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9IT0xERVJfX0NBQ0hFOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYSVNURU5DRV9DSEVDS0lORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfSE9MREVSX19FWElTVEVOQ0VfQ0hFQ0tJTkc7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVyQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NUUlVDVF9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19TVFJVQ1RfQ09OVkVSVEVSUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxRdWVyeUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sVHlwZU1hcHBpbmdfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9UWVBFX01BUFBJTkdfMjFfX1BBUkVOVF9DTEFTUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QQVJFTlRfQ0xBU1M7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sVHlwZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbnRpdHlfMV8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLlhNTF9FTlRJVFlfMTFfX1BSSU1BUllfS0VZOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSSU1BUllfS0VZOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVudGl0eV8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX0VOVElUWV8yMF9fQ0FDSEVfSU5URVJDRVBUT1I6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEVfSU5URVJDRVBUT1I7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9FTlRJVFlfMjBfX1FVRVJZX1JFRElSRUNUT1JTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1FVRVJZX1JFRElSRUNUT1JTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF9DT05UQUlORVJfMjFfX0ZFVENIX0dST1VQUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19GRVRDSF9HUk9VUFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW50aXR5XzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfRU5USVRZXzIxX19DTEFTU19FWFRSQUNUT1I6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xBU1NfRVhUUkFDVE9SOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QSU5ORURfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BJTk5FRF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JBTkdFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1ZBTFVFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX0hBU0hfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0hBU0hfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19VTklPTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVU5JT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QQVJUSVRJT05FRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbnRpdHlfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9FTlRJVFlfMjJfX0FERElUSU9OQUxfQ1JJVEVSSUE6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQURESVRJT05BTF9DUklURVJJQTsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0VOVElUWV8yMl9fQ0FTQ0FERV9PTl9ERUxFVEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FTQ0FERV9PTl9ERUxFVEU7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9FTlRJVFlfMjJfX0lOREVYOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOREVYOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE11bHRpdGVuYW50SG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VTFRJVEVOQU5UX0hPTERFUl9fTVVMVElURU5BTlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTVVMVElURU5BTlQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW50aXR5XzJfMy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfRU5USVRZXzIzX19OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX0VOVElUWV8yM19fTkFNRURfUExTUUxfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfUExTUUxfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9FTlRJVFlfMjNfX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9QTFNRTF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9FTlRJVFlfMjNfX1BMU1FMX1JFQ09SRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUExTUUxfUkVDT1JEUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX0VOVElUWV8yM19fUExTUUxfVEFCTEVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BMU1FMX1RBQkxFUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX0VOVElUWV8yM19fU1RSVUNUOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NUUlVDVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbnRpdHlfMl80LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLlhNTF9FTlRJVFlfMjRfX0NBQ0hFX0lOREVYOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFX0lOREVYOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFJlYWRPbmx5LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JFQURfT05MWV9fUkVBRF9PTkxZOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1JFQURfT05MWTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDdXN0b21pemVySG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NVU1RPTUlaRVJfSE9MREVSX19DVVNUT01JWkVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NVU1RPTUlaRVI7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0hBTkdFX1RSQUNLSU5HX0hPTERFUl9fQ0hBTkdFX1RSQUNLSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NIQU5HRV9UUkFDS0lORzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDYWNoZUhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9IT0xERVJfX0NBQ0hFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9IT0xERVJfX0VYSVNURU5DRV9DSEVDS0lORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWElTVEVOQ0VfQ0hFQ0tJTkc7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVyQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19TVFJVQ1RfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19TVFJVQ1RfQ09OVkVSVEVSUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxRdWVyeUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9DT05UQUlORVJfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwYXJlbnRDbGFzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFyZW50Q2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhcnRpdGlvbmVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJ0aXRpb25lZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FzY2FkZU9uRGVsZXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXNjYWRlT25EZWxldGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlYWRPbmx5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZWFkT25seSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXhpc3RlbmNlQ2hlY2tpbmc6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4aXN0ZW5jZUNoZWNraW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleGNsdWRlRGVmYXVsdE1hcHBpbmdzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleGNsdWRlRGVmYXVsdE1hcHBpbmdzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWFkT25seVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShFY2xpcHNlTGluay5SRUFEX09OTFkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UGFyZW50Q2xhc3NUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsyXzEuUEFSRU5UX0NMQVNTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHkoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENsYXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQYXJlbnRDbGFzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYWNoZWFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1ldGFkYXRhQ29tcGxldGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFJlYWRPbmx5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRFeGlzdGVuY2VDaGVja2luZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRXhjbHVkZURlZmF1bHRNYXBwaW5nc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCksCi0JCSAgICBYbWxNdWx0aXRlbmFudC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzMuTVVMVElURU5BTlQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTXVsdGl0ZW5hbnRIb2xkZXJfTXVsdGl0ZW5hbnQoKSksCi0JCQlidWlsZEFkZGl0aW9uYWxDcml0ZXJpYVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ3VzdG9taXplclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2hhbmdlVHJhY2tpbmdUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTZWNvbmRhcnlUYWJsZVRyYW5zbGF0b3IoKSwKLQkJCVhtbFN0cnVjdC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzMuU1RSVUNULCBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMl8zX1N0cnVjdCgpKSwKLQkJCWJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZENhc2NhZGVPbkRlbGV0ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSW5kZXhUcmFuc2xhdG9yKCksCi0JCQlidWlsZElkQ2xhc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByaW1hcnlLZXlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEluaGVyaXRhbmNlVHJhbnNsYXRvcigpLAotCQkJYnVpbGREaXNjcmltaW5hdG9yVmFsdWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZERpc2NyaW1pbmF0b3JDb2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZENsYXNzRXh0cmFjdG9yVHJhbnNsYXRvcigpLAotCQkJYnVpbGRPcHRpbWlzdGljTG9ja2luZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2FjaGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhY2hlSW50ZXJjZXB0b3JUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhY2hlSW5kZXhUcmFuc2xhdG9yKCksCi0JCQlidWlsZEZldGNoR3JvdXBzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29weVBvbGljeVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSW5zdGFudGlhdGlvbkNveXBQb2xpY3lUcmFuc2xhdG9yKCksCi0JCQlidWlsZENsb25lQ29weVBvbGljeVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRhYmxlR2VuZXJhdG9yVHJhbnNsYXRvcigpLAotCQkgICAgWG1sUGFydGl0aW9uaW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5QQVJUSVRJT05JTkcsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QYXJ0aXRpb25pbmcoKSksCi0JCQlYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKSksCi0JCQlYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9Sb3VuZFJvYmluUGFydGl0aW9uaW5nKCkpLAotCQkJWG1sUGlubmVkUGFydGl0aW9uaW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5QSU5ORURfUEFSVElUSU9OSU5HLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGlubmVkUGFydGl0aW9uaW5nKCkpLAotCQkJWG1sUmFuZ2VQYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlJBTkdFX1BBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JhbmdlUGFydGl0aW9uaW5nKCkpLAotCQkJWG1sVmFsdWVQYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlZBTFVFX1BBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1ZhbHVlUGFydGl0aW9uaW5nKCkpLAotCQkJWG1sSGFzaFBhcnRpdGlvbmluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuSEFTSF9QQVJUSVRJT05JTkcsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9IYXNoUGFydGl0aW9uaW5nKCkpLAotCQkJWG1sVW5pb25QYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlVOSU9OX1BBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1VuaW9uUGFydGl0aW9uaW5nKCkpLAotCQkJYnVpbGRQYXJ0aXRpb25lZFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTmFtZWRRdWVyeVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTmFtZWROYXRpdmVRdWVyeVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeVRyYW5zbGF0b3IoKSwKLQkJCVhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzMuTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJZLCBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMl8zX05hbWVkU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkpLAotCQkJWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMy5OQU1FRF9QTFNRTF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZLCBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMl8zX05hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkpLAotCQkJWG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8zLk5BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSWSwgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzJfM19OYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkpLAotCQkJWG1sUGxzcWxSZWNvcmQuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8zLlBMU1FMX1JFQ09SRCwgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzJfM19QbHNxbFJlY29yZHMoKSksCi0JCQlYbWxQbHNxbFRhYmxlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMy5QTFNRTF9UQUJMRSwgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzJfM19QbHNxbFRhYmxlcygpKSwKLQkJCWJ1aWxkU3FsUmVzdWx0U2V0TWFwcGluZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUXVlcnlSZWRpcmVjdG9yc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCi0JCQlidWlsZEV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFbnRpdHlMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByZVBlcnNpc3RUcmFuc2xhdG9yKCksCi0JCQlidWlsZFBvc3RQZXJzaXN0VHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcmVSZW1vdmVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFBvc3RSZW1vdmVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByZVVwZGF0ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUG9zdFVwZGF0ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUG9zdExvYWRUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IoKSwKLQkJCUF0dHJpYnV0ZXMuYnVpbGRUcmFuc2xhdG9yKCl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDdXN0b21pemVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENsYXNzUmVmZXJlbmNlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DVVNUT01JWkVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEN1c3RvbWl6ZXJIb2xkZXJfQ3VzdG9taXplcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2hhbmdlVHJhY2tpbmdUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ2hhbmdlVHJhY2tpbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcl9DaGFuZ2VUcmFja2luZygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJpbWFyeUtleVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxQcmltYXJ5S2V5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazFfMS5QUklNQVJZX0tFWSwgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzFfMV9QcmltYXJ5S2V5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDbGFzc0V4dHJhY3RvclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDbGFzc1JlZmVyZW5jZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuQ0xBU1NfRVhUUkFDVE9SLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMl8xX0NsYXNzRXh0cmFjdG9yKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPcHRpbWlzdGljTG9ja2luZ1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxPcHRpbWlzdGljTG9ja2luZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuT1BUSU1JU1RJQ19MT0NLSU5HLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV9PcHRpbWlzdGljTG9ja2luZygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2FjaGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ2FjaGUuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNBQ0hFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhY2hlSG9sZGVyX0NhY2hlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYWNoZUludGVyY2VwdG9yVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENsYXNzUmVmZXJlbmNlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5DQUNIRV9JTlRFUkNFUFRPUiwgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzJfMF9DYWNoZUludGVyY2VwdG9yKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENhY2hlSW5kZXhUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ2FjaGVJbmRleC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzQuQ0FDSEVfSU5ERVgsIEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzRfQ2FjaGVJbmRleCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRmV0Y2hHcm91cHNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sRmV0Y2hHcm91cC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuRkVUQ0hfR1JPVVAsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xX0ZldGNoR3JvdXBzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRRdWVyeVJlZGlyZWN0b3JzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFF1ZXJ5UmVkaXJlY3RvcnMuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLlFVRVJZX1JFRElSRUNUT1JTLCBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMl8wX1F1ZXJ5UmVkaXJlY3RvcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfQ29udmVydGVycygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxUeXBlQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfVHlwZUNvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9PYmplY3RUeXBlQ29udmVydGVycygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU3RydWN0Q29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFN0cnVjdENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfU3RydWN0Q29udmVydGVycygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29weVBvbGljeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDb3B5UG9saWN5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT1BZX1BPTElDWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfQ29weVBvbGljeSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSW5zdGFudGlhdGlvbkNveXBQb2xpY3lUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLklOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1ksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0luc3RhbnRpYXRpb25Db3B5UG9saWN5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDbG9uZUNvcHlQb2xpY3lUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ2xvbmVDb3B5UG9saWN5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DTE9ORV9DT1BZX1BPTElDWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfQ2xvbmVDb3B5UG9saWN5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRSZWFkT25seVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5SRUFEX09OTFksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUmVhZE9ubHlfUmVhZE9ubHkoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRXhpc3RlbmNlQ2hlY2tpbmdUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuRVhJU1RFTkNFX0NIRUNLSU5HLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhY2hlSG9sZGVyX0V4aXN0ZW5jZUNoZWNraW5nKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3NUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV9FeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFByb3BlcnR5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFjY2Vzc01ldGhvZHMuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkFDQ0VTU19NRVRIT0RTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQYXJlbnRDbGFzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5QQVJFTlRfQ0xBU1MsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFR5cGVNYXBwaW5nXzJfMV9QYXJlbnRDbGFzcygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFkZGl0aW9uYWxDcml0ZXJpYVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBZGRpdGlvbmFsQ3JpdGVyaWEuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLkFERElUSU9OQUxfQ1JJVEVSSUEsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzJfQWRkaXRpb25hbENyaXRlcmlhKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENhc2NhZGVPbkRlbGV0ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBDYXNjYWRlVHlwZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuQ0FTQ0FERV9PTl9ERUxFVEUsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzJfQ2FzY2FkZU9uRGVsZXRlKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEluZGV4VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEluZGV4LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5JTkRFWCwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzJfMl9JbmRleCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sVGFibGUuYnVpbGRUcmFuc2xhdG9yKEpQQS5UQUJMRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X1RhYmxlKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNlY29uZGFyeVRhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFNlY29uZGFyeVRhYmxlLmJ1aWxkVHJhbnNsYXRvcihKUEEuU0VDT05EQVJZX1RBQkxFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfU2Vjb25kYXJ5VGFibGVzKCkpOwotCX0JCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVGFibGVHZW5lcmF0b3JUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sVGFibGVHZW5lcmF0b3IuYnVpbGRUcmFuc2xhdG9yKEpQQS5UQUJMRV9HRU5FUkFUT1IsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEdlbmVyYXRvckNvbnRhaW5lcl9UYWJsZUdlbmVyYXRvcigpKTsKLQl9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQYXJ0aXRpb25lZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5QQVJUSVRJT05JTkdfR1JPVVBfX1BBUlRJVElPTkVELCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGFydGl0aW9uZWQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVudGl0eU1hcHBpbmdzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW50aXR5TWFwcGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyZDBhNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW50aXR5TWFwcGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlUm9vdFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uU3FsUmVzdWx0U2V0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMi5FY2xpcHNlTGluazFfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbnRpdHlNYXBwaW5nc18yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlNYXBwaW5nc18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSYW5nZVBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGluazJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW50aXR5TWFwcGluZ3NfMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFBsc3FsUmVjb3JkXzJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rMl80OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEVudGl0eSBNYXBwaW5nczwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEVudGl0eU1hcHBpbmdzIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyBpbXBsZW1lbnRzIFhtbEVudGl0eU1hcHBpbmdzXzJfMSwgWG1sRW50aXR5TWFwcGluZ3NfMl8yLCBYbWxFbnRpdHlNYXBwaW5nc18yXzMsIFhtbENvbnZlcnRlckNvbnRhaW5lciwgWG1sUXVlcnlDb250YWluZXIKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydGl0aW9uaW5nKCkgPGVtPlBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQYXJ0aXRpb25pbmdfMl8yPiBwYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpIDxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzI+IHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpIDxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yPiByb3VuZFJvYmluUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkgPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMj4gcGlubmVkUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKSA8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yPiByYW5nZVBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlUGFydGl0aW9uaW5nKCkgPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMj4gdmFsdWVQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYXNoUGFydGl0aW9uaW5nKCkgPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhc2hQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxIYXNoUGFydGl0aW9uaW5nXzJfMj4gaGFzaFBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaW9uUGFydGl0aW9uaW5nKCkgPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVbmlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMj4gdW5pb25QYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpIDxlbT5UZW5hbnQgRGlzY3JpbWluYXRvciBDb2x1bW5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzM+IHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKSA8ZW0+TmFtZWQgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zPiBuYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKSA8ZW0+TmFtZWQgUGxzcWwgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMz4gbmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkgPGVtPk5hbWVkIFBsc3FsIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzM+IG5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGxzcWxSZWNvcmRzKCkgPGVtPlBsc3FsIFJlY29yZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGxzcWxSZWNvcmRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUGxzcWxSZWNvcmRfMl8zPiBwbHNxbFJlY29yZHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQbHNxbFRhYmxlcygpIDxlbT5QbHNxbCBUYWJsZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGxzcWxUYWJsZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQbHNxbFRhYmxlPiBwbHNxbFRhYmxlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnRlcnMoKSA8ZW0+Q29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQ29udmVydGVyPiBjb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZUNvbnZlcnRlcnMoKSA8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4gdHlwZUNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlQ29udmVydGVycygpIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkgPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0cnVjdENvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+IHN0cnVjdENvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKSA8ZW0+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnk+IG5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxFbnRpdHlNYXBwaW5ncygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0VOVElUWV9NQVBQSU5HUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKLQkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKLQl7Ci0JCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY2Nlc3NNZXRob2RzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nXzJfMn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQYXJ0aXRpb25pbmdfMl8yPiBnZXRQYXJ0aXRpb25pbmcoKQotCXsKLQkJaWYgKHBhcnRpdGlvbmluZyA9PSBudWxsKQotCQl7Ci0JCQlwYXJ0aXRpb25pbmcgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUGFydGl0aW9uaW5nXzJfMj4oWG1sUGFydGl0aW9uaW5nXzJfMi5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BBUlRJVElPTklORyk7Ci0JCX0KLQkJcmV0dXJuIHBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9SZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yPiBnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JewotCQlpZiAocmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPT0gbnVsbCkKLQkJewotCQkJcmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yPihYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcpOwotCQl9Ci0JCXJldHVybiByZXBsaWNhdGlvblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yPiBnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQl7Ci0JCWlmIChyb3VuZFJvYmluUGFydGl0aW9uaW5nID09IG51bGwpCi0JCXsKLQkJCXJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzI+KFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HKTsKLQkJfQotCQlyZXR1cm4gcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yPiBnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCXsKLQkJaWYgKHBpbm5lZFBhcnRpdGlvbmluZyA9PSBudWxsKQotCQl7Ci0JCQlwaW5uZWRQYXJ0aXRpb25pbmcgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMj4oWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMi5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BJTk5FRF9QQVJUSVRJT05JTkcpOwotCQl9Ci0JCXJldHVybiBwaW5uZWRQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMj4gZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKQotCXsKLQkJaWYgKHJhbmdlUGFydGl0aW9uaW5nID09IG51bGwpCi0JCXsKLQkJCXJhbmdlUGFydGl0aW9uaW5nID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMj4oWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUkFOR0VfUEFSVElUSU9OSU5HKTsKLQkJfQotCQlyZXR1cm4gcmFuZ2VQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfVmFsdWVQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMj4gZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKQotCXsKLQkJaWYgKHZhbHVlUGFydGl0aW9uaW5nID09IG51bGwpCi0JCXsKLQkJCXZhbHVlUGFydGl0aW9uaW5nID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMj4oWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVkFMVUVfUEFSVElUSU9OSU5HKTsKLQkJfQotCQlyZXR1cm4gdmFsdWVQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSGFzaFBhcnRpdGlvbmluZ18yXzJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9IYXNoUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxIYXNoUGFydGl0aW9uaW5nXzJfMj4gZ2V0SGFzaFBhcnRpdGlvbmluZygpCi0JewotCQlpZiAoaGFzaFBhcnRpdGlvbmluZyA9PSBudWxsKQotCQl7Ci0JCQloYXNoUGFydGl0aW9uaW5nID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yPihYbWxIYXNoUGFydGl0aW9uaW5nXzJfMi5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0hBU0hfUEFSVElUSU9OSU5HKTsKLQkJfQotCQlyZXR1cm4gaGFzaFBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9VbmlvblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yPiBnZXRVbmlvblBhcnRpdGlvbmluZygpCi0JewotCQlpZiAodW5pb25QYXJ0aXRpb25pbmcgPT0gbnVsbCkKLQkJewotCQkJdW5pb25QYXJ0aXRpb25pbmcgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yPihYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19VTklPTl9QQVJUSVRJT05JTkcpOwotCQl9Ci0JCXJldHVybiB1bmlvblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZW5hbnQgRGlzY3JpbWluYXRvciBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRlbmFudCBEaXNjcmltaW5hdG9yIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZW5hbnQgRGlzY3JpbWluYXRvciBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8zX1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMz4gZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKQotCXsKLQkJaWYgKHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zID09IG51bGwpCi0JCXsKLQkJCXRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zPihYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMy5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlMpOwotCQl9Ci0JCXJldHVybiB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVkIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZWQgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzNfTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM+IGdldE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkKLQl7Ci0JCWlmIChuYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcyA9PSBudWxsKQotCQl7Ci0JCQluYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zPihYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVMpOwotCQl9Ci0JCXJldHVybiBuYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBQbHNxbCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZWQgUGxzcWwgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lZCBQbHNxbCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfM19OYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM+IGdldE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKQotCXsKLQkJaWYgKG5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMgPT0gbnVsbCkKLQkJewotCQkJbmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM+KFhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMy5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTKTsKLQkJfQotCQlyZXR1cm4gbmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBQbHNxbCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfM30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lZCBQbHNxbCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lZCBQbHNxbCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzNfTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzM+IGdldE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkKLQl7Ci0JCWlmIChuYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcyA9PSBudWxsKQotCQl7Ci0JCQluYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zPihYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTKTsKLQkJfQotCQlyZXR1cm4gbmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGxzcWwgUmVjb3JkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxQbHNxbFJlY29yZF8yXzN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGxzcWwgUmVjb3JkczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBsc3FsIFJlY29yZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzNfUGxzcWxSZWNvcmRzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQbHNxbFJlY29yZF8yXzM+IGdldFBsc3FsUmVjb3JkcygpCi0JewotCQlpZiAocGxzcWxSZWNvcmRzID09IG51bGwpCi0JCXsKLQkJCXBsc3FsUmVjb3JkcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQbHNxbFJlY29yZF8yXzM+KFhtbFBsc3FsUmVjb3JkXzJfMy5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BMU1FMX1JFQ09SRFMpOwotCQl9Ci0JCXJldHVybiBwbHNxbFJlY29yZHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGxzcWwgVGFibGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQbHNxbFRhYmxlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBsc3FsIFRhYmxlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBsc3FsIFRhYmxlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfM19QbHNxbFRhYmxlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUGxzcWxUYWJsZT4gZ2V0UGxzcWxUYWJsZXMoKQotCXsKLQkJaWYgKHBsc3FsVGFibGVzID09IG51bGwpCi0JCXsKLQkJCXBsc3FsVGFibGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFBsc3FsVGFibGU+KFhtbFBsc3FsVGFibGUuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QTFNRTF9UQUJMRVMpOwotCQl9Ci0JCXJldHVybiBwbHNxbFRhYmxlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmIChjb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCWNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQ29udmVydGVyPihYbWxDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gY29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1R5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxUeXBlQ29udmVydGVyPiBnZXRUeXBlQ29udmVydGVycygpCi0JewotCQlpZiAodHlwZUNvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJdHlwZUNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4oWG1sVHlwZUNvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1RZUEVfQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+IGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmIChvYmplY3RUeXBlQ29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQlvYmplY3RUeXBlQ29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPihYbWxPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckNvbnRhaW5lcl9TdHJ1Y3RDb252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+IGdldFN0cnVjdENvbnZlcnRlcnMoKQotCXsKLQkJaWYgKHN0cnVjdENvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJc3RydWN0Q29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+KFhtbFN0cnVjdENvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NUUlVDVF9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gc3RydWN0Q29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5PiBnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKQotCXsKLQkJaWYgKG5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcyA9PSBudWxsKQotCQl7Ci0JCQluYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeT4oWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUyk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBiYXNpY1NldEFjY2Vzc01ldGhvZHMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQYXJ0aXRpb25pbmcoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFJhbmdlUGFydGl0aW9uaW5nKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFZhbHVlUGFydGl0aW9uaW5nKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SGFzaFBhcnRpdGlvbmluZygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRVbmlvblBhcnRpdGlvbmluZygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXROYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUExTUUxfUkVDT1JEUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFBsc3FsUmVjb3JkcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QTFNRTF9UQUJMRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQbHNxbFRhYmxlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRUeXBlQ29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFBpbm5lZFBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRSYW5nZVBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRWYWx1ZVBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldEhhc2hQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0VW5pb25QYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIGdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzoKLQkJCQlyZXR1cm4gZ2V0TmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTOgotCQkJCXJldHVybiBnZXROYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9QTFNRTF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIGdldE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QTFNRTF9SRUNPUkRTOgotCQkJCXJldHVybiBnZXRQbHNxbFJlY29yZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BMU1FMX1RBQkxFUzoKLQkJCQlyZXR1cm4gZ2V0UGxzcWxUYWJsZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldENvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0VHlwZUNvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0U3RydWN0Q29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOgotCQkJCXJldHVybiBnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QQVJUSVRJT05JTkc6Ci0JCQkJZ2V0UGFydGl0aW9uaW5nKCkuY2xlYXIoKTsKLQkJCQlnZXRQYXJ0aXRpb25pbmcoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFBhcnRpdGlvbmluZ18yXzI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKS5jbGVhcigpOwotCQkJCWdldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpLmNsZWFyKCk7Ci0JCQkJZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCWdldFBpbm5lZFBhcnRpdGlvbmluZygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCWdldFJhbmdlUGFydGl0aW9uaW5nKCkuY2xlYXIoKTsKLQkJCQlnZXRSYW5nZVBhcnRpdGlvbmluZygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCWdldFZhbHVlUGFydGl0aW9uaW5nKCkuY2xlYXIoKTsKLQkJCQlnZXRWYWx1ZVBhcnRpdGlvbmluZygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJZ2V0SGFzaFBhcnRpdGlvbmluZygpLmNsZWFyKCk7Ci0JCQkJZ2V0SGFzaFBhcnRpdGlvbmluZygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sSGFzaFBhcnRpdGlvbmluZ18yXzI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJZ2V0VW5pb25QYXJ0aXRpb25pbmcoKS5jbGVhcigpOwotCQkJCWdldFVuaW9uUGFydGl0aW9uaW5nKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxVbmlvblBhcnRpdGlvbmluZ18yXzI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TOgotCQkJCWdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzM+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzoKLQkJCQlnZXROYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzoKLQkJCQlnZXROYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkuY2xlYXIoKTsKLQkJCQlnZXROYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9QTFNRTF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6Ci0JCQkJZ2V0TmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCWdldE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUExTUUxfUkVDT1JEUzoKLQkJCQlnZXRQbHNxbFJlY29yZHMoKS5jbGVhcigpOwotCQkJCWdldFBsc3FsUmVjb3JkcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUGxzcWxSZWNvcmRfMl8zPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUExTUUxfVEFCTEVTOgotCQkJCWdldFBsc3FsVGFibGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQbHNxbFRhYmxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUGxzcWxUYWJsZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQ29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxPYmplY3RUeXBlQ29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sU3RydWN0Q29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOgotCQkJCWdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QQVJUSVRJT05JTkc6Ci0JCQkJZ2V0UGFydGl0aW9uaW5nKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzoKLQkJCQlnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCWdldFBpbm5lZFBhcnRpdGlvbmluZygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCWdldFJhbmdlUGFydGl0aW9uaW5nKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19WQUxVRV9QQVJUSVRJT05JTkc6Ci0JCQkJZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCWdldEhhc2hQYXJ0aXRpb25pbmcoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlnZXRVbmlvblBhcnRpdGlvbmluZygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OUzoKLQkJCQlnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVM6Ci0JCQkJZ2V0TmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTOgotCQkJCWdldE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlnZXROYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUExTUUxfUkVDT1JEUzoKLQkJCQlnZXRQbHNxbFJlY29yZHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BMU1FMX1RBQkxFUzoKLQkJCQlnZXRQbHNxbFRhYmxlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQ09OVkVSVEVSUzoKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBwYXJ0aXRpb25pbmcgIT0gbnVsbCAmJiAhcGFydGl0aW9uaW5nLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gbnVsbCAmJiAhcmVwbGljYXRpb25QYXJ0aXRpb25pbmcuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiByb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IG51bGwgJiYgIXJvdW5kUm9iaW5QYXJ0aXRpb25pbmcuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcGlubmVkUGFydGl0aW9uaW5nICE9IG51bGwgJiYgIXBpbm5lZFBhcnRpdGlvbmluZy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHJhbmdlUGFydGl0aW9uaW5nICE9IG51bGwgJiYgIXJhbmdlUGFydGl0aW9uaW5nLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gdmFsdWVQYXJ0aXRpb25pbmcgIT0gbnVsbCAmJiAhdmFsdWVQYXJ0aXRpb25pbmcuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGhhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbCAmJiAhaGFzaFBhcnRpdGlvbmluZy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHVuaW9uUGFydGl0aW9uaW5nICE9IG51bGwgJiYgIXVuaW9uUGFydGl0aW9uaW5nLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zICE9IG51bGwgJiYgIXRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTOgotCQkJCXJldHVybiBuYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcyAhPSBudWxsICYmICFuYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzoKLQkJCQlyZXR1cm4gbmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcyAhPSBudWxsICYmICFuYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gbmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgIT0gbnVsbCAmJiAhbmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUExTUUxfUkVDT1JEUzoKLQkJCQlyZXR1cm4gcGxzcWxSZWNvcmRzICE9IG51bGwgJiYgIXBsc3FsUmVjb3Jkcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QTFNRTF9UQUJMRVM6Ci0JCQkJcmV0dXJuIHBsc3FsVGFibGVzICE9IG51bGwgJiYgIXBsc3FsVGFibGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhY29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIW9iamVjdFR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXN0cnVjdENvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOgotCQkJCXJldHVybiBuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgIT0gbnVsbCAmJiAhbmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVudGl0eU1hcHBpbmdzXzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVudGl0eU1hcHBpbmdzXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BJTk5FRF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUkFOR0VfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTXzIyX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVkFMVUVfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTXzIyX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fSEFTSF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX0hBU0hfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1VOSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fVU5JT05fUEFSVElUSU9OSU5HOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVudGl0eU1hcHBpbmdzXzJfMy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlM6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfMjNfX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfMjNfX05BTUVEX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTXzIzX19OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9QTFNRTF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfMjNfX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QTFNRTF9SRUNPUkRTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTXzIzX19QTFNRTF9SRUNPUkRTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BMU1FMX1RBQkxFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU18yM19fUExTUUxfVEFCTEVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TVFJVQ1RfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fU1RSVUNUX0NPTlZFUlRFUlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUXVlcnlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVudGl0eU1hcHBpbmdzXzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVudGl0eU1hcHBpbmdzXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTXzIyX19QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTXzIyX19QSU5ORURfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BJTk5FRF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1JBTkdFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1ZBTFVFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX0hBU0hfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0hBU0hfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTXzIyX19VTklPTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVU5JT05fUEFSVElUSU9OSU5HOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVudGl0eU1hcHBpbmdzXzJfMy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTXzIzX19URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfMjNfX05BTUVEX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTXzIzX19OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU18yM19fTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU18yM19fUExTUUxfUkVDT1JEUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QTFNRTF9SRUNPUkRTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTXzIzX19QTFNRTF9UQUJMRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUExTUUxfVEFCTEVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fU1RSVUNUX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU1RSVUNUX0NPTlZFUlRFUlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUXVlcnlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdmVyc2lvbiAtPiBzY2hlbWEgbG9jYXRpb24gbWFwcGluZyAqKioqKioqKioqKioqKioqKioqKgotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBuYW1lc3BhY2UgPSBFY2xpcHNlTGluay5TQ0hFTUFfTkFNRVNQQUNFOwotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMgPSBidWlsZFZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMoKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGJ1aWxkVmVyc2lvbnNUb1NjaGVtYUxvY2F0aW9ucygpIHsKLQkJTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJbWFwLnB1dChFY2xpcHNlTGluay5TQ0hFTUFfVkVSU0lPTiwgRWNsaXBzZUxpbmsuU0NIRU1BX0xPQ0FUSU9OKTsKLQkJbWFwLnB1dChFY2xpcHNlTGluazFfMS5TQ0hFTUFfVkVSU0lPTiwgRWNsaXBzZUxpbmsxXzEuU0NIRU1BX0xPQ0FUSU9OKTsKLQkJbWFwLnB1dChFY2xpcHNlTGluazFfMi5TQ0hFTUFfVkVSU0lPTiwgRWNsaXBzZUxpbmsxXzIuU0NIRU1BX0xPQ0FUSU9OKTsKLQkJbWFwLnB1dChFY2xpcHNlTGluazJfMC5TQ0hFTUFfVkVSU0lPTiwgRWNsaXBzZUxpbmsyXzAuU0NIRU1BX0xPQ0FUSU9OKTsKLQkJbWFwLnB1dChFY2xpcHNlTGluazJfMS5TQ0hFTUFfVkVSU0lPTiwgRWNsaXBzZUxpbmsyXzEuU0NIRU1BX0xPQ0FUSU9OKTsKLQkJbWFwLnB1dChFY2xpcHNlTGluazJfMi5TQ0hFTUFfVkVSU0lPTiwgRWNsaXBzZUxpbmsyXzIuU0NIRU1BX0xPQ0FUSU9OKTsKLQkJbWFwLnB1dChFY2xpcHNlTGluazJfMy5TQ0hFTUFfVkVSU0lPTiwgRWNsaXBzZUxpbmsyXzMuU0NIRU1BX0xPQ0FUSU9OKTsKLQkJbWFwLnB1dChFY2xpcHNlTGluazJfNC5TQ0hFTUFfVkVSU0lPTiwgRWNsaXBzZUxpbmsyXzQuU0NIRU1BX0xPQ0FUSU9OKTsKLQkJcmV0dXJuIG1hcDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTY2hlbWFMb2NhdGlvbkZvclZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKLQkJcmV0dXJuIHZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMuZ2V0KHZlcnNpb24pOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIFJPT1RfVFJBTlNMQVRPUiA9IGJ1aWxkUm9vdFRyYW5zbGF0b3IoKTsKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgZ2V0Um9vdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBST09UX1RSQU5TTEFUT1I7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRSb290VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVSb290VHJhbnNsYXRvcigKLQkJCQlKUEEuRU5USVRZX01BUFBJTkdTLAotCQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3MoKSwKLQkJCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZFZlcnNpb25UcmFuc2xhdG9yKHZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMpLAotCQkJYnVpbGROYW1lc3BhY2VUcmFuc2xhdG9yKG5hbWVzcGFjZSksCi0JCQlidWlsZFNjaGVtYU5hbWVzcGFjZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2NoZW1hTG9jYXRpb25UcmFuc2xhdG9yKG5hbWVzcGFjZSwgdmVyc2lvbnNUb1NjaGVtYUxvY2F0aW9ucyksCi0JCQlidWlsZERlc2NyaXB0aW9uVHJhbnNsYXRvcigpLAotCQkJWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuYnVpbGRUcmFuc2xhdG9yKEpQQS5QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKSwKLQkJCWJ1aWxkUGFja2FnZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2NoZW1hVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXRhbG9nVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCksCi0JCQlYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMy5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU4sIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzXzJfM19UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpKSwKLQkJCVhtbENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9Db252ZXJ0ZXJzKCkpLAotCQkJWG1sVHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1R5cGVDb252ZXJ0ZXJzKCkpLAotCQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9PYmplY3RUeXBlQ29udmVydGVycygpKSwKLQkJCVhtbFN0cnVjdENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfU3RydWN0Q29udmVydGVycygpKSwKLQkJCVhtbFNlcXVlbmNlR2VuZXJhdG9yLmJ1aWxkVHJhbnNsYXRvcihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19TZXF1ZW5jZUdlbmVyYXRvcnMoKSksCi0JCQlYbWxUYWJsZUdlbmVyYXRvci5idWlsZFRyYW5zbGF0b3IoSlBBLlRBQkxFX0dFTkVSQVRPUiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfVGFibGVHZW5lcmF0b3JzKCkpLAotCQkJWG1sUGFydGl0aW9uaW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5QQVJUSVRJT05JTkcsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9QYXJ0aXRpb25pbmcoKSksCi0JCQlYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKSksCi0JCQlYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9Sb3VuZFJvYmluUGFydGl0aW9uaW5nKCkpLAotCQkJWG1sUGlubmVkUGFydGl0aW9uaW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5QSU5ORURfUEFSVElUSU9OSU5HLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUGlubmVkUGFydGl0aW9uaW5nKCkpLAotCQkJWG1sUmFuZ2VQYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlJBTkdFX1BBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1JhbmdlUGFydGl0aW9uaW5nKCkpLAotCQkJWG1sVmFsdWVQYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlZBTFVFX1BBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1ZhbHVlUGFydGl0aW9uaW5nKCkpLAotCQkJWG1sSGFzaFBhcnRpdGlvbmluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuSEFTSF9QQVJUSVRJT05JTkcsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9IYXNoUGFydGl0aW9uaW5nKCkpLAotCQkJWG1sVW5pb25QYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlVOSU9OX1BBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1VuaW9uUGFydGl0aW9uaW5nKCkpLAotCQkJWG1sTmFtZWRRdWVyeS5idWlsZFRyYW5zbGF0b3IoSlBBLk5BTUVEX1FVRVJZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFF1ZXJpZXMoKSksCi0JCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5LmJ1aWxkVHJhbnNsYXRvcihKUEEuTkFNRURfTkFUSVZFX1FVRVJZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZE5hdGl2ZVF1ZXJpZXMoKSksCi0JCQlYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpKSwKLQkJCVhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzMuTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJZLCBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc18yXzNfTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKSksCi0JCQlYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8zLk5BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUlksIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzXzJfM19OYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpKSwKLQkJCVhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMy5OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUlksIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzXzJfM19OYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkpLAotCQkJWG1sUGxzcWxSZWNvcmQuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8zLlBMU1FMX1JFQ09SRCwgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8zX1Bsc3FsUmVjb3JkcygpKSwKLQkJCVhtbFBsc3FsVGFibGUuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8zLlBMU1FMX1RBQkxFLCBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc18yXzNfUGxzcWxUYWJsZXMoKSksCi0JCQlTcWxSZXN1bHRTZXRNYXBwaW5nLmJ1aWxkVHJhbnNsYXRvcihKUEEuU1FMX1JFU1VMVF9TRVRfTUFQUElORywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfU3FsUmVzdWx0U2V0TWFwcGluZ3MoKSksCi0JCQlYbWxNYXBwZWRTdXBlcmNsYXNzLmJ1aWxkVHJhbnNsYXRvcihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX01hcHBlZFN1cGVyY2xhc3NlcygpKSwKLQkJCVhtbEVudGl0eS5idWlsZFRyYW5zbGF0b3IoSlBBLkVOVElUWSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfRW50aXRpZXMoKSksCi0JCQlYbWxFbWJlZGRhYmxlLmJ1aWxkVHJhbnNsYXRvcihKUEEuRU1CRUREQUJMRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfRW1iZWRkYWJsZXMoKSksCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEZldGNoQXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRmV0Y2hBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEzYmRlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRmV0Y2hBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEF0dHJpYnV0ZV8yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEZldGNoIEF0dHJpYnV0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxGZXRjaEF0dHJpYnV0ZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxGZXRjaEF0dHJpYnV0ZSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbEZldGNoQXR0cmlidXRlXzJfMQotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEZldGNoQXR0cmlidXRlKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfRkVUQ0hfQVRUUklCVVRFOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxGZXRjaEF0dHJpYnV0ZV8yXzFfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxGZXRjaEF0dHJpYnV0ZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfQVRUUklCVVRFX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfQVRUUklCVVRFX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0FUVFJJQlVURV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9BVFRSSUJVVEVfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0FUVFJJQlVURV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJCWVsZW1lbnROYW1lLAotCQkJCXN0cnVjdHVyYWxGZWF0dXJlLAotCQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlidWlsZE5hbWVUcmFuc2xhdG9yKCl9OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5OQU1FLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxGZXRjaEF0dHJpYnV0ZV8yXzFfTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxGZXRjaEdyb3VwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRmV0Y2hHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTJmZmRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxGZXRjaEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwXzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRmV0Y2ggR3JvdXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxGZXRjaEdyb3VwIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sRmV0Y2hHcm91cF8yXzEKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2FkKCkgPGVtPkxvYWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvYWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBMT0FEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvYWQoKSA8ZW0+TG9hZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9hZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gbG9hZCA9IExPQURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVzKCkgPGVtPkF0dHJpYnV0ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEZldGNoQXR0cmlidXRlPiBhdHRyaWJ1dGVzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEZldGNoR3JvdXAoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9GRVRDSF9HUk9VUDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cF8yXzFfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxGZXRjaEdyb3VwI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoQXR0cmlidXRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cF8yXzFfQXR0cmlidXRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sRmV0Y2hBdHRyaWJ1dGU+IGdldEF0dHJpYnV0ZXMoKQotCXsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKLQkJewotCQkJYXR0cmlidXRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxGZXRjaEF0dHJpYnV0ZT4oWG1sRmV0Y2hBdHRyaWJ1dGUuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfX0FUVFJJQlVURVMpOwotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvYWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvYWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9hZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TG9hZChCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cF8yXzFfTG9hZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0TG9hZCgpCi0JewotCQlyZXR1cm4gbG9hZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoR3JvdXAjZ2V0TG9hZCA8ZW0+TG9hZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9hZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TG9hZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvYWQoQm9vbGVhbiBuZXdMb2FkKQotCXsKLQkJQm9vbGVhbiBvbGRMb2FkID0gbG9hZDsKLQkJbG9hZCA9IG5ld0xvYWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfX0xPQUQsIG9sZExvYWQsIGxvYWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF9fQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEF0dHJpYnV0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQX19MT0FEOgotCQkJCXJldHVybiBnZXRMb2FkKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfX0xPQUQ6Ci0JCQkJc2V0TG9hZCgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQX19BVFRSSUJVVEVTOgotCQkJCWdldEF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCWdldEF0dHJpYnV0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEZldGNoQXR0cmlidXRlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQX19MT0FEOgotCQkJCXNldExvYWQoTE9BRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQX19BVFRSSUJVVEVTOgotCQkJCWdldEF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF9fTE9BRDoKLQkJCQlyZXR1cm4gTE9BRF9FREVGQVVMVCA9PSBudWxsID8gbG9hZCAhPSBudWxsIDogIUxPQURfRURFRkFVTFQuZXF1YWxzKGxvYWQpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBhdHRyaWJ1dGVzICE9IG51bGwgJiYgIWF0dHJpYnV0ZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsb2FkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsb2FkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJCWVsZW1lbnROYW1lLAotCQkJCXN0cnVjdHVyYWxGZWF0dXJlLAotCQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQkJYnVpbGRMb2FkVHJhbnNsYXRvcigpLAotCQkJCWJ1aWxkQXR0cmlidXRlc1RyYW5zbGF0b3IoKX07Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5OQU1FLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxGZXRjaEdyb3VwXzJfMV9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBdHRyaWJ1dGVzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEZldGNoQXR0cmlidXRlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5BVFRSSUJVVEUsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEZldGNoR3JvdXBfMl8xX0F0dHJpYnV0ZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZExvYWRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuRkVUQ0hfR1JPVVBfX0xPQUQsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEZldGNoR3JvdXBfMl8xX0xvYWQoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxIYXNoUGFydGl0aW9uaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSGFzaFBhcnRpdGlvbmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTRmNjNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxIYXNoUGFydGl0aW9uaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBIYXNoIFBhcnRpdGlvbmluZzwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSGFzaFBhcnRpdGlvbmluZygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxIYXNoUGFydGl0aW9uaW5nIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxIYXNoUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfSEFTSF9QQVJUSVRJT05JTkc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSGFzaFBhcnRpdGlvbmluZyNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSEFTSF9QQVJUSVRJT05JTkdfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9IQVNIX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9IQVNIX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9IQVNIX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSEFTSF9QQVJUSVRJT05JTkdfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEhhc2hQYXJ0aXRpb25pbmcoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk5BTUUsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci19IC8vIFhtbEhhc2hQYXJ0aXRpb25pbmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxJZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbElkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNmI5OGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbElkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJZF8yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEluZGV4XzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmsyXzQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbENhY2hlSW5kZXhfMl80OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxJZF8yXzQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgSWQ8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxJZCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxJZCBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQgaW1wbGVtZW50cyBYbWxJZF8yXzIsIFhtbElkXzJfNCwgWG1sQXR0cmlidXRlTWFwcGluZywgWG1sTXV0YWJsZSwgWG1sQ29udmVydGlibGVNYXBwaW5nLCBYbWxDb252ZXJ0ZXJDb250YWluZXIKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmRleCgpIDxlbT5JbmRleDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxJbmRleF8yXzIgaW5kZXg7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWNoZUluZGV4KCkgPGVtPkNhY2hlIEluZGV4PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWNoZUluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2FjaGVJbmRleF8yXzQgY2FjaGVJbmRleDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlVHlwZSA9IEFUVFJJQlVURV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE11dGFibGUoKSA8ZW0+TXV0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TXV0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIE1VVEFCTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TXV0YWJsZSgpIDxlbT5NdXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNdXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBtdXRhYmxlID0gTVVUQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0KCkgPGVtPkNvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydCgpIDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnQgPSBDT05WRVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydGVycygpIDxlbT5Db252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxDb252ZXJ0ZXI+IGNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlQ29udmVydGVycygpIDxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxUeXBlQ29udmVydGVyPiB0eXBlQ29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPiBvYmplY3RUeXBlQ29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0cnVjdENvbnZlcnRlcnMoKSA8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RydWN0Q29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4gc3RydWN0Q29udmVydGVyczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxJZCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0lEOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXR0cmlidXRlVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX0F0dHJpYnV0ZVR5cGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKCkKLQl7Ci0JCXJldHVybiBhdHRyaWJ1dGVUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0QXR0cmlidXRlVHlwZSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlVHlwZShTdHJpbmcgbmV3QXR0cmlidXRlVHlwZSkKLQl7Ci0JCVN0cmluZyBvbGRBdHRyaWJ1dGVUeXBlID0gYXR0cmlidXRlVHlwZTsKLQkJYXR0cmlidXRlVHlwZSA9IG5ld0F0dHJpYnV0ZVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FUVFJJQlVURV9UWVBFLCBvbGRBdHRyaWJ1dGVUeXBlLCBhdHRyaWJ1dGVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5kZXg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluZGV4PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluZGV4PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJbmRleChYbWxJbmRleF8yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxJZF8yXzJfSW5kZXgoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEluZGV4XzJfMiBnZXRJbmRleCgpCi0JewotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SW5kZXgoWG1sSW5kZXhfMl8yIG5ld0luZGV4LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sSW5kZXhfMl8yIG9sZEluZGV4ID0gaW5kZXg7Ci0JCWluZGV4ID0gbmV3SW5kZXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0lOREVYLCBvbGRJbmRleCwgbmV3SW5kZXgpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0SW5kZXggPGVtPkluZGV4PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmRleChYbWxJbmRleF8yXzIgbmV3SW5kZXgpCi0JewotCQlpZiAobmV3SW5kZXggIT0gaW5kZXgpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGluZGV4ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWluZGV4KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fSU5ERVgsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0luZGV4ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0luZGV4KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fSU5ERVgsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SW5kZXgobmV3SW5kZXgsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fSU5ERVgsIG5ld0luZGV4LCBuZXdJbmRleCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhY2hlIEluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYWNoZSBJbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZSBJbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2FjaGVJbmRleChYbWxDYWNoZUluZGV4XzJfNCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbElkXzJfNF9DYWNoZUluZGV4KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDYWNoZUluZGV4XzJfNCBnZXRDYWNoZUluZGV4KCkKLQl7Ci0JCXJldHVybiBjYWNoZUluZGV4OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENhY2hlSW5kZXgoWG1sQ2FjaGVJbmRleF8yXzQgbmV3Q2FjaGVJbmRleCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENhY2hlSW5kZXhfMl80IG9sZENhY2hlSW5kZXggPSBjYWNoZUluZGV4OwotCQljYWNoZUluZGV4ID0gbmV3Q2FjaGVJbmRleDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ0FDSEVfSU5ERVgsIG9sZENhY2hlSW5kZXgsIG5ld0NhY2hlSW5kZXgpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0Q2FjaGVJbmRleCA8ZW0+Q2FjaGUgSW5kZXg8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlIEluZGV4PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDYWNoZUluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FjaGVJbmRleChYbWxDYWNoZUluZGV4XzJfNCBuZXdDYWNoZUluZGV4KQotCXsKLQkJaWYgKG5ld0NhY2hlSW5kZXggIT0gY2FjaGVJbmRleCkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY2FjaGVJbmRleCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljYWNoZUluZGV4KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ0FDSEVfSU5ERVgsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NhY2hlSW5kZXggIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q2FjaGVJbmRleCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NBQ0hFX0lOREVYLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENhY2hlSW5kZXgobmV3Q2FjaGVJbmRleCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DQUNIRV9JTkRFWCwgbmV3Q2FjaGVJbmRleCwgbmV3Q2FjaGVJbmRleCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk11dGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk11dGFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TXV0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TXV0YWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTXV0YWJsZV9NdXRhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRNdXRhYmxlKCkKLQl7Ci0JCXJldHVybiBtdXRhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0TXV0YWJsZSA8ZW0+TXV0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TXV0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TXV0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE11dGFibGUoQm9vbGVhbiBuZXdNdXRhYmxlKQotCXsKLQkJQm9vbGVhbiBvbGRNdXRhYmxlID0gbXV0YWJsZTsKLQkJbXV0YWJsZSA9IG5ld011dGFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX01VVEFCTEUsIG9sZE11dGFibGUsIG11dGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbnZlcnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0NvbnZlcnQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb252ZXJ0KCkKLQl7Ci0JCXJldHVybiBjb252ZXJ0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0Q29udmVydCA8ZW0+Q29udmVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29udmVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnZlcnQoU3RyaW5nIG5ld0NvbnZlcnQpCi0JewotCQlTdHJpbmcgb2xkQ29udmVydCA9IGNvbnZlcnQ7Ci0JCWNvbnZlcnQgPSBuZXdDb252ZXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJULCBvbGRDb252ZXJ0LCBjb252ZXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX0NvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbENvbnZlcnRlcj4gZ2V0Q29udmVydGVycygpCi0JewotCQlpZiAoY29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQljb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbENvbnZlcnRlcj4oWG1sQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gY29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1R5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxUeXBlQ29udmVydGVyPiBnZXRUeXBlQ29udmVydGVycygpCi0JewotCQlpZiAodHlwZUNvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJdHlwZUNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4oWG1sVHlwZUNvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fVFlQRV9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gdHlwZUNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckNvbnRhaW5lcl9PYmplY3RUeXBlQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCXsKLQkJaWYgKG9iamVjdFR5cGVDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCW9iamVjdFR5cGVDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+KFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfU3RydWN0Q29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPiBnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmIChzdHJ1Y3RDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCXN0cnVjdENvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPihYbWxTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1NUUlVDVF9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gc3RydWN0Q29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKLQkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQotCXsKLQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQotCXsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19JTkRFWDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRJbmRleChudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ0FDSEVfSU5ERVg6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q2FjaGVJbmRleChudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFR5cGVDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0lOREVYOgotCQkJCXJldHVybiBnZXRJbmRleCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DQUNIRV9JTkRFWDoKLQkJCQlyZXR1cm4gZ2V0Q2FjaGVJbmRleCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVUeXBlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX01VVEFCTEU6Ci0JCQkJcmV0dXJuIGdldE11dGFibGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ09OVkVSVDoKLQkJCQlyZXR1cm4gZ2V0Q29udmVydCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0VHlwZUNvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldFN0cnVjdENvbnZlcnRlcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0lOREVYOgotCQkJCXNldEluZGV4KChYbWxJbmRleF8yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ0FDSEVfSU5ERVg6Ci0JCQkJc2V0Q2FjaGVJbmRleCgoWG1sQ2FjaGVJbmRleF8yXzQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fTVVUQUJMRToKLQkJCQlzZXRNdXRhYmxlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlQ6Ci0JCQkJc2V0Q29udmVydCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQ29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxUeXBlQ29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sU3RydWN0Q29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19JTkRFWDoKLQkJCQlzZXRJbmRleCgoWG1sSW5kZXhfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ0FDSEVfSU5ERVg6Ci0JCQkJc2V0Q2FjaGVJbmRleCgoWG1sQ2FjaGVJbmRleF8yXzQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoQVRUUklCVVRFX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fTVVUQUJMRToKLQkJCQlzZXRNdXRhYmxlKE1VVEFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ09OVkVSVDoKLQkJCQlzZXRDb252ZXJ0KENPTlZFUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ09OVkVSVEVSUzoKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0lOREVYOgotCQkJCXJldHVybiBpbmRleCAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DQUNIRV9JTkRFWDoKLQkJCQlyZXR1cm4gY2FjaGVJbmRleCAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGF0dHJpYnV0ZVR5cGUgIT0gbnVsbCA6ICFBVFRSSUJVVEVfVFlQRV9FREVGQVVMVC5lcXVhbHMoYXR0cmlidXRlVHlwZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX01VVEFCTEU6Ci0JCQkJcmV0dXJuIE1VVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IG11dGFibGUgIT0gbnVsbCA6ICFNVVRBQkxFX0VERUZBVUxULmVxdWFscyhtdXRhYmxlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ09OVkVSVDoKLQkJCQlyZXR1cm4gQ09OVkVSVF9FREVGQVVMVCA9PSBudWxsID8gY29udmVydCAhPSBudWxsIDogIUNPTlZFUlRfRURFRkFVTFQuZXF1YWxzKGNvbnZlcnQpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJURVJTOgotCQkJCXJldHVybiBjb252ZXJ0ZXJzICE9IG51bGwgJiYgIWNvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhb2JqZWN0VHlwZUNvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gc3RydWN0Q29udmVydGVycyAhPSBudWxsICYmICFzdHJ1Y3RDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSWRfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19JTkRFWDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0lEXzIyX19JTkRFWDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxJZF8yXzQuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NBQ0hFX0lOREVYOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5YTUxfSURfMjRfX0NBQ0hFX0lOREVYOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BVFRSSUJVVEVfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNdXRhYmxlLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19NVVRBQkxFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NVVRBQkxFX19NVVRBQkxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ09OVkVSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fQ09OVkVSVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19TVFJVQ1RfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fU1RSVUNUX0NPTlZFUlRFUlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxJZF8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0lEXzIyX19JTkRFWDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0lOREVYOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbElkXzJfNC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5YTUxfSURfMjRfX0NBQ0hFX0lOREVYOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ0FDSEVfSU5ERVg7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE11dGFibGUuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTVVUQUJMRV9fTVVUQUJMRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX01VVEFCTEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGlibGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0NPTlZFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJUOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fU1RSVUNUX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19TVFJVQ1RfQ09OVkVSVEVSUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF0dHJpYnV0ZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF0dHJpYnV0ZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG11dGFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG11dGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbnZlcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbnZlcnQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRNdXRhYmxlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEVjbGlwc2VMaW5rLk1VVEFCTEUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0QXR0cmlidXRlVHlwZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShFY2xpcHNlTGluazJfMS5BVFRSSUJVVEVfVFlQRSk7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbElkKCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZE11dGFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEF0dHJpYnV0ZVR5cGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSW5kZXhUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhY2hlSW5kZXhUcmFuc2xhdG9yKCksCi0JCQlidWlsZEdlbmVyYXRlZFZhbHVlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUZW1wb3JhbFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRW51bWVyYXRlZFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29udmVydFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRhYmxlR2VuZXJhdG9yVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTZXF1ZW5jZUdlbmVyYXRvclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTXV0YWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5NVVRBQkxFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE11dGFibGVfTXV0YWJsZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRJbmRleFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxJbmRleC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuSU5ERVgsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbElkXzJfMl9JbmRleCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYWNoZUluZGV4VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENhY2hlSW5kZXguYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl80LkNBQ0hFX0lOREVYLCBFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxJZF8yXzRfQ2FjaGVJbmRleCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29udmVydFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Db252ZXJ0KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX0NvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sVHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1R5cGVDb252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxTdHJ1Y3RDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1N0cnVjdENvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFByb3BlcnR5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFjY2Vzc01ldGhvZHMuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkFDQ0VTU19NRVRIT0RTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkFUVFJJQlVURV9UWVBFLCAgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX0F0dHJpYnV0ZVR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFbnVtZXJhdGVkVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5FTlVNRVJBVEVELCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfRW51bWVyYXRlZCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUYWJsZUdlbmVyYXRvclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxUYWJsZUdlbmVyYXRvci5idWlsZFRyYW5zbGF0b3IoSlBBLlRBQkxFX0dFTkVSQVRPUiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1RhYmxlR2VuZXJhdG9yKCkpOwotCX0KLQotCS8vICoqKioqKioqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqKioqKioqKgotCQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0Q29udmVydENvZGVBc3Npc3RUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50Q29kZUFzc2lzdFRleHRSYW5nZShFY2xpcHNlTGluay5DT05WRVJUKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb252ZXJ0VG91Y2hlcyhpbnQgcG9zKSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldENvbnZlcnRDb2RlQXNzaXN0VGV4dFJhbmdlKCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpICYmICh0ZXh0UmFuZ2UudG91Y2hlcyhwb3MpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSW5kZXguamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxJbmRleC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWE5NTBlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxJbmRleC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLkJvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEluZGV4PC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxJbmRleCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxJbmRleCBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbEluZGV4XzJfMgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjaGVtYSgpIDxlbT5TY2hlbWE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjaGVtYSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjaGVtYSgpIDxlbT5TY2hlbWE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjaGVtYSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzY2hlbWEgPSBTQ0hFTUFfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0YWxvZygpIDxlbT5DYXRhbG9nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXRhbG9nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRBTE9HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhdGFsb2coKSA8ZW0+Q2F0YWxvZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2F0YWxvZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjYXRhbG9nID0gQ0FUQUxPR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWJsZSgpIDxlbT5UYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhYmxlKCkgPGVtPlRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0YWJsZSA9IFRBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaXF1ZSgpIDxlbT5VbmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaXF1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIFVOSVFVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbmlxdWUoKSA8ZW0+VW5pcXVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVbmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIHVuaXF1ZSA9IFVOSVFVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbHVtbk5hbWVzKCkgPGVtPkNvbHVtbiBOYW1lczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb2x1bW5OYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gY29sdW1uTmFtZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSW5kZXgoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9JTkRFWDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSW5kZXhfMl8yX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSW5kZXgjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOREVYX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTY2hlbWEoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSW5kZXhfMl8yX1NjaGVtYSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpCi0JewotCQlyZXR1cm4gc2NoZW1hOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSW5kZXgjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2NoZW1hKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NoZW1hKFN0cmluZyBuZXdTY2hlbWEpCi0JewotCQlTdHJpbmcgb2xkU2NoZW1hID0gc2NoZW1hOwotCQlzY2hlbWEgPSBuZXdTY2hlbWE7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVhfX1NDSEVNQSwgb2xkU2NoZW1hLCBzY2hlbWEpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXRhbG9nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhdGFsb2coU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSW5kZXhfMl8yX0NhdGFsb2coKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkKLQl7Ci0JCXJldHVybiBjYXRhbG9nOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSW5kZXgjZ2V0Q2F0YWxvZyA8ZW0+Q2F0YWxvZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0YWxvZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2F0YWxvZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhdGFsb2coU3RyaW5nIG5ld0NhdGFsb2cpCi0JewotCQlTdHJpbmcgb2xkQ2F0YWxvZyA9IGNhdGFsb2c7Ci0JCWNhdGFsb2cgPSBuZXdDYXRhbG9nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOREVYX19DQVRBTE9HLCBvbGRDYXRhbG9nLCBjYXRhbG9nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYWJsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxJbmRleF8yXzJfVGFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZSgpCi0JewotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJbmRleCNnZXRUYWJsZSA8ZW0+VGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYmxlKFN0cmluZyBuZXdUYWJsZSkKLQl7Ci0JCVN0cmluZyBvbGRUYWJsZSA9IHRhYmxlOwotCQl0YWJsZSA9IG5ld1RhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOREVYX19UQUJMRSwgb2xkVGFibGUsIHRhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmlxdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5pcXVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVbmlxdWUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEluZGV4XzJfMl9VbmlxdWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldFVuaXF1ZSgpCi0JewotCQlyZXR1cm4gdW5pcXVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSW5kZXgjZ2V0VW5pcXVlIDxlbT5VbmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuaXF1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VW5pcXVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5pcXVlKEJvb2xlYW4gbmV3VW5pcXVlKQotCXsKLQkJQm9vbGVhbiBvbGRVbmlxdWUgPSB1bmlxdWU7Ci0JCXVuaXF1ZSA9IG5ld1VuaXF1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JTkRFWF9fVU5JUVVFLCBvbGRVbmlxdWUsIHVuaXF1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbHVtbiBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29sdW1uIE5hbWVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uIE5hbWVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSW5kZXhfMl8yX0NvbHVtbk5hbWVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldENvbHVtbk5hbWVzKCkKLQl7Ci0JCWlmIChjb2x1bW5OYW1lcyA9PSBudWxsKQotCQl7Ci0JCQljb2x1bW5OYW1lcyA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JTkRFWF9fQ09MVU1OX05BTUVTKTsKLQkJfQotCQlyZXR1cm4gY29sdW1uTmFtZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVhfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JTkRFWF9fU0NIRU1BOgotCQkJCXJldHVybiBnZXRTY2hlbWEoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JTkRFWF9fQ0FUQUxPRzoKLQkJCQlyZXR1cm4gZ2V0Q2F0YWxvZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOREVYX19UQUJMRToKLQkJCQlyZXR1cm4gZ2V0VGFibGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JTkRFWF9fVU5JUVVFOgotCQkJCXJldHVybiBnZXRVbmlxdWUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JTkRFWF9fQ09MVU1OX05BTUVTOgotCQkJCXJldHVybiBnZXRDb2x1bW5OYW1lcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JTkRFWF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JTkRFWF9fU0NIRU1BOgotCQkJCXNldFNjaGVtYSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVhfX0NBVEFMT0c6Ci0JCQkJc2V0Q2F0YWxvZygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVhfX1RBQkxFOgotCQkJCXNldFRhYmxlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JTkRFWF9fVU5JUVVFOgotCQkJCXNldFVuaXF1ZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOREVYX19DT0xVTU5fTkFNRVM6Ci0JCQkJZ2V0Q29sdW1uTmFtZXMoKS5jbGVhcigpOwotCQkJCWdldENvbHVtbk5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVhfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVhfX1NDSEVNQToKLQkJCQlzZXRTY2hlbWEoU0NIRU1BX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVhfX0NBVEFMT0c6Ci0JCQkJc2V0Q2F0YWxvZyhDQVRBTE9HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVhfX1RBQkxFOgotCQkJCXNldFRhYmxlKFRBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVhfX1VOSVFVRToKLQkJCQlzZXRVbmlxdWUoVU5JUVVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVhfX0NPTFVNTl9OQU1FUzoKLQkJCQlnZXRDb2x1bW5OYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JTkRFWF9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOREVYX19TQ0hFTUE6Ci0JCQkJcmV0dXJuIFNDSEVNQV9FREVGQVVMVCA9PSBudWxsID8gc2NoZW1hICE9IG51bGwgOiAhU0NIRU1BX0VERUZBVUxULmVxdWFscyhzY2hlbWEpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOREVYX19DQVRBTE9HOgotCQkJCXJldHVybiBDQVRBTE9HX0VERUZBVUxUID09IG51bGwgPyBjYXRhbG9nICE9IG51bGwgOiAhQ0FUQUxPR19FREVGQVVMVC5lcXVhbHMoY2F0YWxvZyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVhfX1RBQkxFOgotCQkJCXJldHVybiBUQUJMRV9FREVGQVVMVCA9PSBudWxsID8gdGFibGUgIT0gbnVsbCA6ICFUQUJMRV9FREVGQVVMVC5lcXVhbHModGFibGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOREVYX19VTklRVUU6Ci0JCQkJcmV0dXJuIFVOSVFVRV9FREVGQVVMVCA9PSBudWxsID8gdW5pcXVlICE9IG51bGwgOiAhVU5JUVVFX0VERUZBVUxULmVxdWFscyh1bmlxdWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOREVYX19DT0xVTU5fTkFNRVM6Ci0JCQkJcmV0dXJuIGNvbHVtbk5hbWVzICE9IG51bGwgJiYgIWNvbHVtbk5hbWVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2NoZW1hOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzY2hlbWEpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhdGFsb2c6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhdGFsb2cpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRhYmxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0YWJsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdW5pcXVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1bmlxdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbHVtbk5hbWVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb2x1bW5OYW1lcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEluZGV4KCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRDb2x1bW5OYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXRhbG9nVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTY2hlbWFUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRhYmxlVHJhbnNsYXRvcigpLCAKLQkJCWJ1aWxkVW5pcXVlVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbHVtbk5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuSU5ERVhfX0NPTFVNTl9OQU1FLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxJbmRleF8yXzJfQ29sdW1uTmFtZXMoKSk7Ci0JfQkJCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5JTkRFWF9fTkFNRSwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSW5kZXhfMl8yX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5JTkRFWF9fQ0FUQUxPRywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSW5kZXhfMl8yX0NhdGFsb2coKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU2NoZW1hVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLklOREVYX19TQ0hFTUEsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEluZGV4XzJfMl9TY2hlbWEoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuSU5ERVhfX1RBQkxFLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxJbmRleF8yXzJfVGFibGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVW5pcXVlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBCb29sZWFuVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5JTkRFWF9fVU5JUVVFLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxJbmRleF8yXzJfVW5pcXVlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotfSAvLyBYbWxJbmRleApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEluc3RhbnRpYXRpb25Db3B5UG9saWN5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI4N2Q5NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBJbnN0YW50aWF0aW9uIFBvbGljeTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1k7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHt9OwotCX0KLQotfSAvLyBYbWxJbnN0YW50aWF0aW9uUG9saWN5CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pbkZldGNoLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pbkZldGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmODZhNmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEpvaW5GZXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBKb2luIEZldGNoPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2gjZ2V0Sm9pbkZldGNoIDxlbT5Kb2luIEZldGNoPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxKb2luRmV0Y2goKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEpvaW5GZXRjaCBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIEZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKLQkgKiBAc2VlICNzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEpvaW5GZXRjaF9Kb2luRmV0Y2goKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxKb2luRmV0Y2hUeXBlIGdldEpvaW5GZXRjaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2gjZ2V0Sm9pbkZldGNoIDxlbT5Kb2luIEZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIEZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZQotCSAqIEBzZWUgI2dldEpvaW5GZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUgdmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBqb2luLWZldGNoIGVsZW1lbnQuCi0JICovCi0JVGV4dFJhbmdlIGdldEpvaW5GZXRjaFRleHRSYW5nZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luRmV0Y2hUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pbkZldGNoVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTE5YjkwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luRmV0Y2hUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+WG1sIEpvaW4gRmV0Y2ggVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEpvaW5GZXRjaFR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIFhtbEpvaW5GZXRjaFR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5ORVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5ORVJfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlJTk5FUigwLCAiSU5ORVIiLCAiSU5ORVIiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9VVEVSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI09VVEVSX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JT1VURVIoMSwgIk9VVEVSIiwgIk9VVEVSIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTk5FUjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU5ORVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5ORVIKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTk5FUl9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PVVRFUjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T1VURVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjT1VURVIKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRFUl9WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIEpvaW4gRmV0Y2ggVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgWG1sSm9pbkZldGNoVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBYbWxKb2luRmV0Y2hUeXBlW10KLQkJewotCQkJSU5ORVIsCi0JCQlPVVRFUiwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5YbWwgSm9pbiBGZXRjaCBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8WG1sSm9pbkZldGNoVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgSm9pbiBGZXRjaCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWG1sSm9pbkZldGNoVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJWG1sSm9pbkZldGNoVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgSm9pbiBGZXRjaCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWG1sSm9pbkZldGNoVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJWG1sSm9pbkZldGNoVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhtbCBKb2luIEZldGNoIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBYbWxKb2luRmV0Y2hUeXBlIGdldChpbnQgdmFsdWUpCi0JewotCQlzd2l0Y2ggKHZhbHVlKQotCQl7Ci0JCQljYXNlIElOTkVSX1ZBTFVFOiByZXR1cm4gSU5ORVI7Ci0JCQljYXNlIE9VVEVSX1ZBTFVFOiByZXR1cm4gT1VURVI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFhtbEpvaW5GZXRjaFR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpCi0JewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKLQl7Ci0JICByZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCQotfSAvL1htbEpvaW5GZXRjaFR5cGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlMzFhOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pblRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGluazJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSm9pblRhYmxlXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgSm9pbiBUYWJsZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSm9pblRhYmxlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEpvaW5UYWJsZSBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlIGltcGxlbWVudHMgWG1sSm9pblRhYmxlXzJfMgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcmVhdGlvblN1ZmZpeCgpIDxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0aW9uU3VmZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVElPTl9TVUZGSVhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25TdWZmaXgoKSA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjcmVhdGlvblN1ZmZpeCA9IENSRUFUSU9OX1NVRkZJWF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxKb2luVGFibGUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9KT0lOX1RBQkxFOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyZWF0aW9uIFN1ZmZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3JlYXRpb25TdWZmaXgoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSm9pblRhYmxlXzJfMl9DcmVhdGlvblN1ZmZpeCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0aW9uU3VmZml4KCkKLQl7Ci0JCXJldHVybiBjcmVhdGlvblN1ZmZpeDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZSNnZXRDcmVhdGlvblN1ZmZpeCA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENyZWF0aW9uU3VmZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRpb25TdWZmaXgoU3RyaW5nIG5ld0NyZWF0aW9uU3VmZml4KQotCXsKLQkJU3RyaW5nIG9sZENyZWF0aW9uU3VmZml4ID0gY3JlYXRpb25TdWZmaXg7Ci0JCWNyZWF0aW9uU3VmZml4ID0gbmV3Q3JlYXRpb25TdWZmaXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9fQ1JFQVRJT05fU1VGRklYLCBvbGRDcmVhdGlvblN1ZmZpeCwgY3JlYXRpb25TdWZmaXgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19DUkVBVElPTl9TVUZGSVg6Ci0JCQkJcmV0dXJuIGdldENyZWF0aW9uU3VmZml4KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfX0NSRUFUSU9OX1NVRkZJWDoKLQkJCQlzZXRDcmVhdGlvblN1ZmZpeCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9fQ1JFQVRJT05fU1VGRklYOgotCQkJCXNldENyZWF0aW9uU3VmZml4KENSRUFUSU9OX1NVRkZJWF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19DUkVBVElPTl9TVUZGSVg6Ci0JCQkJcmV0dXJuIENSRUFUSU9OX1NVRkZJWF9FREVGQVVMVCA9PSBudWxsID8gY3JlYXRpb25TdWZmaXggIT0gbnVsbCA6ICFDUkVBVElPTl9TVUZGSVhfRURFRkFVTFQuZXF1YWxzKGNyZWF0aW9uU3VmZml4KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pblRhYmxlXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19DUkVBVElPTl9TVUZGSVg6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9KT0lOX1RBQkxFXzIyX19DUkVBVElPTl9TVUZGSVg7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luVGFibGVfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9KT0lOX1RBQkxFXzIyX19DUkVBVElPTl9TVUZGSVg6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfX0NSRUFUSU9OX1NVRkZJWDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNyZWF0aW9uU3VmZml4OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjcmVhdGlvblN1ZmZpeCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxKb2luVGFibGUoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2NoZW1hVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDcmVhdGlvblN1ZmZpeFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSW52ZXJzZUpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZFVuaXF1ZUNvbnN0cmFpbnRUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDcmVhdGlvblN1ZmZpeFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5DUkVBVElPTl9TVUZGSVgsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEpvaW5UYWJsZV8yXzJfQ3JlYXRpb25TdWZmaXgoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci19IC8vIFhtbEpvaW5UYWJsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb01hbnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxNYW55VG9NYW55LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZGU5ZmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb01hbnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGluazJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFueVRvTWFueV8yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxIYXNoUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sTWFueVRvTWFueV8yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxVbmlvblBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNYW55IFRvIE1hbnk8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYW55VG9NYW55KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE1hbnlUb01hbnkgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkgaW1wbGVtZW50cyBYbWxNYW55VG9NYW55XzJfMCwgWG1sTWFueVRvTWFueV8yXzEsIFhtbE1hbnlUb01hbnlfMl8yLCBYbWxBdHRyaWJ1dGVNYXBwaW5nLCBYbWxKb2luRmV0Y2gKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpIDxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IG1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydGVycygpIDxlbT5Db252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxDb252ZXJ0ZXI+IGNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlQ29udmVydGVycygpIDxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxUeXBlQ29udmVydGVyPiB0eXBlQ29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPiBvYmplY3RUeXBlQ29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0cnVjdENvbnZlcnRlcnMoKSA8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RydWN0Q29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4gc3RydWN0Q29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlDb252ZXJ0KCkgPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwS2V5Q29udmVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQX0tFWV9DT05WRVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcEtleUNvbnZlcnQoKSA8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBLZXlDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcEtleUNvbnZlcnQgPSBNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXRjaEZldGNoKCkgPGVtPkJhdGNoIEZldGNoPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXRjaEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQmF0Y2hGZXRjaCBiYXRjaEZldGNoOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydGl0aW9uaW5nKCkgPGVtPlBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGFydGl0aW9uaW5nXzJfMiBwYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpIDxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpIDxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiByb3VuZFJvYmluUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkgPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgcGlubmVkUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKSA8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYW5nZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiByYW5nZVBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlUGFydGl0aW9uaW5nKCkgPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgdmFsdWVQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYXNoUGFydGl0aW9uaW5nKCkgPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIYXNoUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgaGFzaFBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaW9uUGFydGl0aW9uaW5nKCkgPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VW5pb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgdW5pb25QYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydGl0aW9uZWQoKSA8ZW0+UGFydGl0aW9uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJUSVRJT05FRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJ0aXRpb25lZCgpIDxlbT5QYXJ0aXRpb25lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFydGl0aW9uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFydGl0aW9uZWQgPSBQQVJUSVRJT05FRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXNjYWRlT25EZWxldGUoKSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhc2NhZGVPbkRlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIENBU0NBREVfT05fREVMRVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhc2NhZGVPbkRlbGV0ZSgpIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBjYXNjYWRlT25EZWxldGUgPSBDQVNDQURFX09OX0RFTEVURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05vbkNhY2hlYWJsZSgpIDxlbT5Ob24gQ2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc05vbkNhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE5PTl9DQUNIRUFCTEVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTm9uQ2FjaGVhYmxlKCkgPGVtPk5vbiBDYWNoZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTm9uQ2FjaGVhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBub25DYWNoZWFibGUgPSBOT05fQ0FDSEVBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdHRyaWJ1dGVUeXBlID0gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYbWxKb2luRmV0Y2hUeXBlIEpPSU5fRkVUQ0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Sm9pbkZldGNoKCkgPGVtPkpvaW4gRmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpvaW5GZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEpvaW5GZXRjaFR5cGUgam9pbkZldGNoID0gSk9JTl9GRVRDSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxNYW55VG9NYW55KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfTUFOWV9UT19NQU5ZOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gRmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIEZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZQotCSAqIEBzZWUgI3NldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSm9pbkZldGNoX0pvaW5GZXRjaCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxKb2luRmV0Y2hUeXBlIGdldEpvaW5GZXRjaCgpCi0JewotCQlyZXR1cm4gam9pbkZldGNoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSNnZXRKb2luRmV0Y2ggPGVtPkpvaW4gRmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlCi0JICogQHNlZSAjZ2V0Sm9pbkZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUgbmV3Sm9pbkZldGNoKQotCXsKLQkJWG1sSm9pbkZldGNoVHlwZSBvbGRKb2luRmV0Y2ggPSBqb2luRmV0Y2g7Ci0JCWpvaW5GZXRjaCA9IG5ld0pvaW5GZXRjaCA9PSBudWxsID8gSk9JTl9GRVRDSF9FREVGQVVMVCA6IG5ld0pvaW5GZXRjaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0pPSU5fRkVUQ0gsIG9sZEpvaW5GZXRjaCwgam9pbkZldGNoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wX01hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiBnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpCi0JewotCQlpZiAobWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMgPT0gbnVsbCkKLQkJewotCQkJbWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4oWG1sQXNzb2NpYXRpb25PdmVycmlkZS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJfQotCQlyZXR1cm4gbWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBDb252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYXBLZXlDb252ZXJ0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMF9NYXBLZXlDb252ZXJ0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwS2V5Q29udmVydCgpCi0JewotCQlyZXR1cm4gbWFwS2V5Q29udmVydDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkjZ2V0TWFwS2V5Q29udmVydCA8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hcEtleUNvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBLZXlDb252ZXJ0KFN0cmluZyBuZXdNYXBLZXlDb252ZXJ0KQotCXsKLQkJU3RyaW5nIG9sZE1hcEtleUNvbnZlcnQgPSBtYXBLZXlDb252ZXJ0OwotCQltYXBLZXlDb252ZXJ0ID0gbmV3TWFwS2V5Q29udmVydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ09OVkVSVCwgb2xkTWFwS2V5Q29udmVydCwgbWFwS2V5Q29udmVydCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckNvbnRhaW5lcl9Db252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxDb252ZXJ0ZXI+IGdldENvbnZlcnRlcnMoKQotCXsKLQkJaWYgKGNvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJY29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxDb252ZXJ0ZXI+KFhtbENvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiBjb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfVHlwZUNvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+IGdldFR5cGVDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmICh0eXBlQ29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQl0eXBlQ29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxUeXBlQ29udmVydGVyPihYbWxUeXBlQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVFlQRV9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gdHlwZUNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckNvbnRhaW5lcl9PYmplY3RUeXBlQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCXsKLQkJaWYgKG9iamVjdFR5cGVDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCW9iamVjdFR5cGVDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+KFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1N0cnVjdENvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4gZ2V0U3RydWN0Q29udmVydGVycygpCi0JewotCQlpZiAoc3RydWN0Q29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQlzdHJ1Y3RDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4oWG1sU3RydWN0Q29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fU1RSVUNUX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QmF0Y2hGZXRjaChYbWxCYXRjaEZldGNoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcl9CYXRjaEZldGNoKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxCYXRjaEZldGNoIGdldEJhdGNoRmV0Y2goKQotCXsKLQkJcmV0dXJuIGJhdGNoRmV0Y2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QmF0Y2hGZXRjaChYbWxCYXRjaEZldGNoIG5ld0JhdGNoRmV0Y2gsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxCYXRjaEZldGNoIG9sZEJhdGNoRmV0Y2ggPSBiYXRjaEZldGNoOwotCQliYXRjaEZldGNoID0gbmV3QmF0Y2hGZXRjaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0JBVENIX0ZFVENILCBvbGRCYXRjaEZldGNoLCBuZXdCYXRjaEZldGNoKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkjZ2V0QmF0Y2hGZXRjaCA8ZW0+QmF0Y2ggRmV0Y2g8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRCYXRjaEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmF0Y2hGZXRjaChYbWxCYXRjaEZldGNoIG5ld0JhdGNoRmV0Y2gpCi0JewotCQlpZiAobmV3QmF0Y2hGZXRjaCAhPSBiYXRjaEZldGNoKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChiYXRjaEZldGNoICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWJhdGNoRmV0Y2gpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQkFUQ0hfRkVUQ0gsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0JhdGNoRmV0Y2ggIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QmF0Y2hGZXRjaCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19CQVRDSF9GRVRDSCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRCYXRjaEZldGNoKG5ld0JhdGNoRmV0Y2gsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0JBVENIX0ZFVENILCBuZXdCYXRjaEZldGNoLCBuZXdCYXRjaEZldGNoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU1hcHBpbmdfQXR0cmlidXRlVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoKQotCXsKLQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55I2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIG5ld0F0dHJpYnV0ZVR5cGUpCi0JewotCQlTdHJpbmcgb2xkQXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGU7Ci0JCWF0dHJpYnV0ZVR5cGUgPSBuZXdBdHRyaWJ1dGVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQVRUUklCVVRFX1RZUEUsIG9sZEF0dHJpYnV0ZVR5cGUsIGF0dHJpYnV0ZVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBhcnRpdGlvbmluZyhYbWxQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGFydGl0aW9uaW5nXzJfMiBnZXRQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQYXJ0aXRpb25pbmcoWG1sUGFydGl0aW9uaW5nXzJfMiBuZXdQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxQYXJ0aXRpb25pbmdfMl8yIG9sZFBhcnRpdGlvbmluZyA9IHBhcnRpdGlvbmluZzsKLQkJcGFydGl0aW9uaW5nID0gbmV3UGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUEFSVElUSU9OSU5HLCBvbGRQYXJ0aXRpb25pbmcsIG5ld1BhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55I2dldFBhcnRpdGlvbmluZyA8ZW0+UGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnRpdGlvbmluZyhYbWxQYXJ0aXRpb25pbmdfMl8yIG5ld1BhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdQYXJ0aXRpb25pbmcgIT0gcGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1BhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UGFydGl0aW9uaW5nKG5ld1BhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUEFSVElUSU9OSU5HLCBuZXdQYXJ0aXRpb25pbmcsIG5ld1BhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiBvbGRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyA9IHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nOwotCQlyZXBsaWNhdGlvblBhcnRpdGlvbmluZyA9IG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBvbGRSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyA8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nICE9IHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZXBsaWNhdGlvblBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUm91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiBvbGRSb3VuZFJvYmluUGFydGl0aW9uaW5nID0gcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQkJcm91bmRSb2JpblBhcnRpdGlvbmluZyA9IG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG9sZFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nIDxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpcm91bmRSb2JpblBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBpbm5lZFBhcnRpdGlvbmluZyhYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1Bpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHBpbm5lZFBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBuZXdQaW5uZWRQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIG9sZFBpbm5lZFBhcnRpdGlvbmluZyA9IHBpbm5lZFBhcnRpdGlvbmluZzsKLQkJcGlubmVkUGFydGl0aW9uaW5nID0gbmV3UGlubmVkUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUElOTkVEX1BBUlRJVElPTklORywgb2xkUGlubmVkUGFydGl0aW9uaW5nLCBuZXdQaW5uZWRQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSNnZXRQaW5uZWRQYXJ0aXRpb25pbmcgPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBpbm5lZFBhcnRpdGlvbmluZyhYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIG5ld1Bpbm5lZFBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdQaW5uZWRQYXJ0aXRpb25pbmcgIT0gcGlubmVkUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwaW5uZWRQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcGlubmVkUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1BJTk5FRF9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Bpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQaW5uZWRQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUElOTkVEX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcobmV3UGlubmVkUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QSU5ORURfUEFSVElUSU9OSU5HLCBuZXdQaW5uZWRQYXJ0aXRpb25pbmcsIG5ld1Bpbm5lZFBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJhbmdlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmFuZ2VQYXJ0aXRpb25pbmcoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHJhbmdlUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJhbmdlUGFydGl0aW9uaW5nKFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiBuZXdSYW5nZVBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiBvbGRSYW5nZVBhcnRpdGlvbmluZyA9IHJhbmdlUGFydGl0aW9uaW5nOwotCQlyYW5nZVBhcnRpdGlvbmluZyA9IG5ld1JhbmdlUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUkFOR0VfUEFSVElUSU9OSU5HLCBvbGRSYW5nZVBhcnRpdGlvbmluZywgbmV3UmFuZ2VQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSNnZXRSYW5nZVBhcnRpdGlvbmluZyA8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmFuZ2VQYXJ0aXRpb25pbmcoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG5ld1JhbmdlUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1JhbmdlUGFydGl0aW9uaW5nICE9IHJhbmdlUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyYW5nZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyYW5nZVBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19SQU5HRV9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JhbmdlUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JhbmdlUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSYW5nZVBhcnRpdGlvbmluZyhuZXdSYW5nZVBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUkFOR0VfUEFSVElUSU9OSU5HLCBuZXdSYW5nZVBhcnRpdGlvbmluZywgbmV3UmFuZ2VQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9WYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIGdldFZhbHVlUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB2YWx1ZVBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRWYWx1ZVBhcnRpdGlvbmluZyhYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgbmV3VmFsdWVQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgb2xkVmFsdWVQYXJ0aXRpb25pbmcgPSB2YWx1ZVBhcnRpdGlvbmluZzsKLQkJdmFsdWVQYXJ0aXRpb25pbmcgPSBuZXdWYWx1ZVBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1ZBTFVFX1BBUlRJVElPTklORywgb2xkVmFsdWVQYXJ0aXRpb25pbmcsIG5ld1ZhbHVlUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkjZ2V0VmFsdWVQYXJ0aXRpb25pbmcgPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiBuZXdWYWx1ZVBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdWYWx1ZVBhcnRpdGlvbmluZyAhPSB2YWx1ZVBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodmFsdWVQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdmFsdWVQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVkFMVUVfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdWYWx1ZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdWYWx1ZVBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19WQUxVRV9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VmFsdWVQYXJ0aXRpb25pbmcobmV3VmFsdWVQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1ZBTFVFX1BBUlRJVElPTklORywgbmV3VmFsdWVQYXJ0aXRpb25pbmcsIG5ld1ZhbHVlUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRIYXNoUGFydGl0aW9uaW5nKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX0hhc2hQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIGdldEhhc2hQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIGhhc2hQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SGFzaFBhcnRpdGlvbmluZyhYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBuZXdIYXNoUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgb2xkSGFzaFBhcnRpdGlvbmluZyA9IGhhc2hQYXJ0aXRpb25pbmc7Ci0JCWhhc2hQYXJ0aXRpb25pbmcgPSBuZXdIYXNoUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fSEFTSF9QQVJUSVRJT05JTkcsIG9sZEhhc2hQYXJ0aXRpb25pbmcsIG5ld0hhc2hQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSNnZXRIYXNoUGFydGl0aW9uaW5nIDxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEhhc2hQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIYXNoUGFydGl0aW9uaW5nKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIG5ld0hhc2hQYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3SGFzaFBhcnRpdGlvbmluZyAhPSBoYXNoUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChoYXNoUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWhhc2hQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fSEFTSF9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0hhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SGFzaFBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19IQVNIX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRIYXNoUGFydGl0aW9uaW5nKG5ld0hhc2hQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0hBU0hfUEFSVElUSU9OSU5HLCBuZXdIYXNoUGFydGl0aW9uaW5nLCBuZXdIYXNoUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5pb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRVbmlvblBhcnRpdGlvbmluZyhYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfVW5pb25QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiBnZXRVbmlvblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gdW5pb25QYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VW5pb25QYXJ0aXRpb25pbmcoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIG5ld1VuaW9uUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIG9sZFVuaW9uUGFydGl0aW9uaW5nID0gdW5pb25QYXJ0aXRpb25pbmc7Ci0JCXVuaW9uUGFydGl0aW9uaW5nID0gbmV3VW5pb25QYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19VTklPTl9QQVJUSVRJT05JTkcsIG9sZFVuaW9uUGFydGl0aW9uaW5nLCBuZXdVbmlvblBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55I2dldFVuaW9uUGFydGl0aW9uaW5nIDxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VW5pb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmlvblBhcnRpdGlvbmluZyhYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgbmV3VW5pb25QYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3VW5pb25QYXJ0aXRpb25pbmcgIT0gdW5pb25QYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHVuaW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXVuaW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1VOSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VW5pb25QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VW5pb25QYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVU5JT05fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFVuaW9uUGFydGl0aW9uaW5nKG5ld1VuaW9uUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19VTklPTl9QQVJUSVRJT05JTkcsIG5ld1VuaW9uUGFydGl0aW9uaW5nLCBuZXdVbmlvblBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFydGl0aW9uZWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmVkKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uZWQoKQotCXsKLQkJcmV0dXJuIHBhcnRpdGlvbmVkOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSNnZXRQYXJ0aXRpb25lZCA8ZW0+UGFydGl0aW9uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnRpdGlvbmVkKFN0cmluZyBuZXdQYXJ0aXRpb25lZCkKLQl7Ci0JCVN0cmluZyBvbGRQYXJ0aXRpb25lZCA9IHBhcnRpdGlvbmVkOwotCQlwYXJ0aXRpb25lZCA9IG5ld1BhcnRpdGlvbmVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUEFSVElUSU9ORUQsIG9sZFBhcnRpdGlvbmVkLCBwYXJ0aXRpb25lZCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYW55VG9NYW55XzJfMl9DYXNjYWRlT25EZWxldGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldENhc2NhZGVPbkRlbGV0ZSgpCi0JewotCQlyZXR1cm4gY2FzY2FkZU9uRGVsZXRlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4gbmV3Q2FzY2FkZU9uRGVsZXRlKQotCXsKLQkJQm9vbGVhbiBvbGRDYXNjYWRlT25EZWxldGUgPSBjYXNjYWRlT25EZWxldGU7Ci0JCWNhc2NhZGVPbkRlbGV0ZSA9IG5ld0Nhc2NhZGVPbkRlbGV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0NBU0NBREVfT05fREVMRVRFLCBvbGRDYXNjYWRlT25EZWxldGUsIGNhc2NhZGVPbkRlbGV0ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vbiBDYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm9uQ2FjaGVhYmxlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYW55VG9NYW55XzJfMl9Ob25DYWNoZWFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm9uQ2FjaGVhYmxlKCkKLQl7Ci0JCXJldHVybiBub25DYWNoZWFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55I2lzTm9uQ2FjaGVhYmxlIDxlbT5Ob24gQ2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc05vbkNhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vbkNhY2hlYWJsZShib29sZWFuIG5ld05vbkNhY2hlYWJsZSkKLQl7Ci0JCWJvb2xlYW4gb2xkTm9uQ2FjaGVhYmxlID0gbm9uQ2FjaGVhYmxlOwotCQlub25DYWNoZWFibGUgPSBuZXdOb25DYWNoZWFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19OT05fQ0FDSEVBQkxFLCBvbGROb25DYWNoZWFibGUsIG5vbkNhY2hlYWJsZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOwotCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCi0JewotCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpCi0JewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQl7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByb3BlcnR5PihYbWxQcm9wZXJ0eS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRUeXBlQ29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0JBVENIX0ZFVENIOgotCQkJCXJldHVybiBiYXNpY1NldEJhdGNoRmV0Y2gobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFBpbm5lZFBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSYW5nZVBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRWYWx1ZVBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldEhhc2hQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VW5pb25QYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCXJldHVybiBnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0Q29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRUeXBlQ29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NPTlZFUlQ6Ci0JCQkJcmV0dXJuIGdldE1hcEtleUNvbnZlcnQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0JBVENIX0ZFVENIOgotCQkJCXJldHVybiBnZXRCYXRjaEZldGNoKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRIYXNoUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFVuaW9uUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QQVJUSVRJT05FRDoKLQkJCQlyZXR1cm4gZ2V0UGFydGl0aW9uZWQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0NBU0NBREVfT05fREVMRVRFOgotCQkJCXJldHVybiBnZXRDYXNjYWRlT25EZWxldGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX05PTl9DQUNIRUFCTEU6Ci0JCQkJcmV0dXJuIGlzTm9uQ2FjaGVhYmxlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZVR5cGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0pPSU5fRkVUQ0g6Ci0JCQkJcmV0dXJuIGdldEpvaW5GZXRjaCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCWdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQXNzb2NpYXRpb25PdmVycmlkZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQ29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxPYmplY3RUeXBlQ29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sU3RydWN0Q29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJUOgotCQkJCXNldE1hcEtleUNvbnZlcnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQkFUQ0hfRkVUQ0g6Ci0JCQkJc2V0QmF0Y2hGZXRjaCgoWG1sQmF0Y2hGZXRjaCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUEFSVElUSU9OSU5HOgotCQkJCXNldFBhcnRpdGlvbmluZygoWG1sUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKChYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzoKLQkJCQlzZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKChYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlzZXRQaW5uZWRQYXJ0aXRpb25pbmcoKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlzZXRSYW5nZVBhcnRpdGlvbmluZygoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19WQUxVRV9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0VmFsdWVQYXJ0aXRpb25pbmcoKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0SGFzaFBhcnRpdGlvbmluZygoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlzZXRVbmlvblBhcnRpdGlvbmluZygoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QQVJUSVRJT05FRDoKLQkJCQlzZXRQYXJ0aXRpb25lZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19DQVNDQURFX09OX0RFTEVURToKLQkJCQlzZXRDYXNjYWRlT25EZWxldGUoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX05PTl9DQUNIRUFCTEU6Ci0JCQkJc2V0Tm9uQ2FjaGVhYmxlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19KT0lOX0ZFVENIOgotCQkJCXNldEpvaW5GZXRjaCgoWG1sSm9pbkZldGNoVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NPTlZFUlQ6Ci0JCQkJc2V0TWFwS2V5Q29udmVydChNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0JBVENIX0ZFVENIOgotCQkJCXNldEJhdGNoRmV0Y2goKFhtbEJhdGNoRmV0Y2gpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUEFSVElUSU9OSU5HOgotCQkJCXNldFBhcnRpdGlvbmluZygoWG1sUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlzZXRQaW5uZWRQYXJ0aXRpb25pbmcoKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXNldFJhbmdlUGFydGl0aW9uaW5nKChYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXNldFZhbHVlUGFydGl0aW9uaW5nKChYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0SGFzaFBhcnRpdGlvbmluZygoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFVuaW9uUGFydGl0aW9uaW5nKChYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUEFSVElUSU9ORUQ6Ci0JCQkJc2V0UGFydGl0aW9uZWQoUEFSVElUSU9ORURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0NBU0NBREVfT05fREVMRVRFOgotCQkJCXNldENhc2NhZGVPbkRlbGV0ZShDQVNDQURFX09OX0RFTEVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTk9OX0NBQ0hFQUJMRToKLQkJCQlzZXROb25DYWNoZWFibGUoTk9OX0NBQ0hFQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoQVRUUklCVVRFX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0pPSU5fRkVUQ0g6Ci0JCQkJc2V0Sm9pbkZldGNoKEpPSU5fRkVUQ0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gbWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMgIT0gbnVsbCAmJiAhbWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gY29udmVydGVycyAhPSBudWxsICYmICFjb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gdHlwZUNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhdHlwZUNvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhb2JqZWN0VHlwZUNvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcnMgIT0gbnVsbCAmJiAhc3RydWN0Q29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NPTlZFUlQ6Ci0JCQkJcmV0dXJuIE1BUF9LRVlfQ09OVkVSVF9FREVGQVVMVCA9PSBudWxsID8gbWFwS2V5Q29udmVydCAhPSBudWxsIDogIU1BUF9LRVlfQ09OVkVSVF9FREVGQVVMVC5lcXVhbHMobWFwS2V5Q29udmVydCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19CQVRDSF9GRVRDSDoKLQkJCQlyZXR1cm4gYmF0Y2hGZXRjaCAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBwYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcm91bmRSb2JpblBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcGlubmVkUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHJhbmdlUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19WQUxVRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHZhbHVlUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gaGFzaFBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiB1bmlvblBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUEFSVElUSU9ORUQ6Ci0JCQkJcmV0dXJuIFBBUlRJVElPTkVEX0VERUZBVUxUID09IG51bGwgPyBwYXJ0aXRpb25lZCAhPSBudWxsIDogIVBBUlRJVElPTkVEX0VERUZBVUxULmVxdWFscyhwYXJ0aXRpb25lZCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19DQVNDQURFX09OX0RFTEVURToKLQkJCQlyZXR1cm4gQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNhc2NhZGVPbkRlbGV0ZSAhPSBudWxsIDogIUNBU0NBREVfT05fREVMRVRFX0VERUZBVUxULmVxdWFscyhjYXNjYWRlT25EZWxldGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTk9OX0NBQ0hFQUJMRToKLQkJCQlyZXR1cm4gbm9uQ2FjaGVhYmxlICE9IE5PTl9DQUNIRUFCTEVfRURFRkFVTFQ7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gcHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gYXR0cmlidXRlVHlwZSAhPSBudWxsIDogIUFUVFJJQlVURV9UWVBFX0VERUZBVUxULmVxdWFscyhhdHRyaWJ1dGVUeXBlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0pPSU5fRkVUQ0g6Ci0JCQkJcmV0dXJuIGpvaW5GZXRjaCAhPSBKT0lOX0ZFVENIX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfMjBfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19TVFJVQ1RfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fU1RSVUNUX0NPTlZFUlRFUlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJUOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19NQVBfS0VZX0NPTlZFUlQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFueVRvTWFueV8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXRjaEZldGNoSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQkFUQ0hfRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9fQkFUQ0hfRkVUQ0g7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFueVRvTWFueV8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QSU5ORURfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QSU5ORURfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkFOR0VfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1ZBTFVFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVkFMVUVfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0hBU0hfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19VTklPTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1VOSU9OX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QQVJUSVRJT05FRDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9ORUQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFueVRvTWFueV8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19DQVNDQURFX09OX0RFTEVURTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV8yMl9fQ0FTQ0FERV9PTl9ERUxFVEU7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTk9OX0NBQ0hFQUJMRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV8yMl9fTk9OX0NBQ0hFQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FUVFJJQlVURV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pbkZldGNoLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fSk9JTl9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9GRVRDSF9fSk9JTl9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl8yMF9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVyQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19TVFJVQ1RfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19TVFJVQ1RfQ09OVkVSVEVSUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9fTUFQX0tFWV9DT05WRVJUOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ09OVkVSVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYW55VG9NYW55XzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEJhdGNoRmV0Y2hIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX19CQVRDSF9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19CQVRDSF9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYW55VG9NYW55XzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QSU5ORURfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1BJTk5FRF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JBTkdFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1ZBTFVFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX0hBU0hfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0hBU0hfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19VTklPTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVU5JT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QQVJUSVRJT05FRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYW55VG9NYW55XzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZXzIyX19DQVNDQURFX09OX0RFTEVURTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19DQVNDQURFX09OX0RFTEVURTsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV8yMl9fTk9OX0NBQ0hFQUJMRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19OT05fQ0FDSEVBQkxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BVFRSSUJVVEVfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luRmV0Y2guY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9GRVRDSF9fSk9JTl9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19KT0lOX0ZFVENIOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWFwS2V5Q29udmVydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWFwS2V5Q29udmVydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFydGl0aW9uZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcnRpdGlvbmVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYXNjYWRlT25EZWxldGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhc2NhZGVPbkRlbGV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbm9uQ2FjaGVhYmxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChub25DYWNoZWFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF0dHJpYnV0ZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF0dHJpYnV0ZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGpvaW5GZXRjaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoam9pbkZldGNoKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Sm9pbkZldGNoVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZShFY2xpcHNlTGluay5KT0lOX0ZFVENIKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEF0dHJpYnV0ZVR5cGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsyXzEuQVRUUklCVVRFX1RZUEUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueSgpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVGFyZ2V0RW50aXR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRGZXRjaFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBwZWRCeVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXR0cmlidXRlVHlwZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkT3JkZXJCeVRyYW5zbGF0b3IoKSwKLQkJCVhtbE9yZGVyQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihKUEEyXzAuT1JERVJfQ09MVU1OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT3JkZXJhYmxlXzJfMF9PcmRlckNvbHVtbigpKSwJCQotCQkJYnVpbGRNYXBLZXlUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUNsYXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlUZW1wb3JhbFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5RW51bWVyYXRlZFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5Q29udmVydFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5Sm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZEpvaW5UYWJsZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2FzY2FkZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2FzY2FkZU9uRGVsZXRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKb2luRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZEJhdGNoRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpLAotCQkJYnVpbGROb25jYWNoZWFibGVUcmFuc2xhdG9yKCksCi0JCSAgICBYbWxQYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlBBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmluZygpKSwKLQkJCVhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9SZXBsaWNhdGlvblBhcnRpdGlvbmluZygpKSwKLQkJCVhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlJPVU5EX1JPQklOX1BBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKSksCi0JCQlYbWxQaW5uZWRQYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlBJTk5FRF9QQVJUSVRJT05JTkcsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QaW5uZWRQYXJ0aXRpb25pbmcoKSksCi0JCQlYbWxSYW5nZVBhcnRpdGlvbmluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuUkFOR0VfUEFSVElUSU9OSU5HLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKSksCi0JCQlYbWxWYWx1ZVBhcnRpdGlvbmluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuVkFMVUVfUEFSVElUSU9OSU5HLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfVmFsdWVQYXJ0aXRpb25pbmcoKSksCi0JCQlYbWxIYXNoUGFydGl0aW9uaW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5IQVNIX1BBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX0hhc2hQYXJ0aXRpb25pbmcoKSksCi0JCQlYbWxVbmlvblBhcnRpdGlvbmluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuVU5JT05fUEFSVElUSU9OSU5HLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfVW5pb25QYXJ0aXRpb25pbmcoKSksCi0JCQlidWlsZFBhcnRpdGlvbmVkVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBLZXlDb252ZXJ0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQTJfMC5NQVBfS0VZX0NPTlZFUlQsIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMF9NYXBLZXlDb252ZXJ0KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBdHRyaWJ1dGVPdmVycmlkZS5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLk1BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfMl8wX01hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFLCBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMF9NYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpKTsKLQl9CQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfQ29udmVydGVycygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxUeXBlQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfVHlwZUNvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9PYmplY3RUeXBlQ29udmVydGVycygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU3RydWN0Q29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFN0cnVjdENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfU3RydWN0Q29udmVydGVycygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSm9pbkZldGNoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSm9pbkZldGNoX0pvaW5GZXRjaCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sUHJvcGVydHkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEF0dHJpYnV0ZVR5cGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuQVRUUklCVVRFX1RZUEUsICBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmdfQXR0cmlidXRlVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEJhdGNoRmV0Y2hUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQmF0Y2hGZXRjaC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuQkFUQ0hfRkVUQ0gsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcl9CYXRjaEZldGNoKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENhc2NhZGVPbkRlbGV0ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBDYXNjYWRlVHlwZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuQ0FTQ0FERV9PTl9ERUxFVEUsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hbnlUb01hbnlfMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRKb2luVGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sSm9pblRhYmxlLmJ1aWxkVHJhbnNsYXRvcihKUEEuSk9JTl9UQUJMRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSm9pblRhYmxlQ29udGFpbmVyX0pvaW5UYWJsZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTm9uY2FjaGVhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLk5PTkNBQ0hFQUJMRSwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueV8yXzJfTm9uQ2FjaGVhYmxlKCkpOwotCX0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFBhcnRpdGlvbmVkVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlBBUlRJVElPTklOR19HUk9VUF9fUEFSVElUSU9ORUQsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QYXJ0aXRpb25lZCgpKTsKLQl9CQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFueVRvT25lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFueVRvT25lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOWJhMDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb09uZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYW55VG9PbmVfMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGluazJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSGFzaFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb09uZV8yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxVbmlvblBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5FbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE1hbnkgVG8gT25lPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFueVRvT25lKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE1hbnlUb09uZSBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lIGltcGxlbWVudHMgWG1sTWFueVRvT25lXzJfMSwgWG1sTWFueVRvT25lXzJfMiwgWG1sQXR0cmlidXRlTWFwcGluZywgWG1sSm9pbkZldGNoCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmF0Y2hGZXRjaCgpIDxlbT5CYXRjaCBGZXRjaDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmF0Y2hGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEJhdGNoRmV0Y2ggYmF0Y2hGZXRjaDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnRpdGlvbmluZygpIDxlbT5QYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFBhcnRpdGlvbmluZ18yXzIgcGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKSA8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiByZXBsaWNhdGlvblBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKSA8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBpbm5lZFBhcnRpdGlvbmluZygpIDxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIHBpbm5lZFBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkgPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgcmFuZ2VQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpIDxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIHZhbHVlUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFzaFBhcnRpdGlvbmluZygpIDxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFzaFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIGhhc2hQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbmlvblBhcnRpdGlvbmluZygpIDxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIHVuaW9uUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnRpdGlvbmVkKCkgPGVtPlBhcnRpdGlvbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVElUSU9ORURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydGl0aW9uZWQoKSA8ZW0+UGFydGl0aW9uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcnRpdGlvbmVkID0gUEFSVElUSU9ORURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNOb25DYWNoZWFibGUoKSA8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNOb25DYWNoZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBOT05fQ0FDSEVBQkxFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05vbkNhY2hlYWJsZSgpIDxlbT5Ob24gQ2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc05vbkNhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbm9uQ2FjaGVhYmxlID0gTk9OX0NBQ0hFQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlVHlwZSA9IEFUVFJJQlVURV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgWG1sSm9pbkZldGNoVHlwZSBKT0lOX0ZFVENIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpvaW5GZXRjaCgpIDxlbT5Kb2luIEZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKb2luRmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxKb2luRmV0Y2hUeXBlIGpvaW5GZXRjaCA9IEpPSU5fRkVUQ0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sTWFueVRvT25lKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfTUFOWV9UT19PTkU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2g8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRCYXRjaEZldGNoKFhtbEJhdGNoRmV0Y2gpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXRjaEZldGNoSG9sZGVyX0JhdGNoRmV0Y2goKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEJhdGNoRmV0Y2ggZ2V0QmF0Y2hGZXRjaCgpCi0JewotCQlyZXR1cm4gYmF0Y2hGZXRjaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRCYXRjaEZldGNoKFhtbEJhdGNoRmV0Y2ggbmV3QmF0Y2hGZXRjaCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEJhdGNoRmV0Y2ggb2xkQmF0Y2hGZXRjaCA9IGJhdGNoRmV0Y2g7Ci0JCWJhdGNoRmV0Y2ggPSBuZXdCYXRjaEZldGNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19CQVRDSF9GRVRDSCwgb2xkQmF0Y2hGZXRjaCwgbmV3QmF0Y2hGZXRjaCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUjZ2V0QmF0Y2hGZXRjaCA8ZW0+QmF0Y2ggRmV0Y2g8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRCYXRjaEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmF0Y2hGZXRjaChYbWxCYXRjaEZldGNoIG5ld0JhdGNoRmV0Y2gpCi0JewotCQlpZiAobmV3QmF0Y2hGZXRjaCAhPSBiYXRjaEZldGNoKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChiYXRjaEZldGNoICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWJhdGNoRmV0Y2gpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19CQVRDSF9GRVRDSCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QmF0Y2hGZXRjaCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdCYXRjaEZldGNoKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQkFUQ0hfRkVUQ0gsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QmF0Y2hGZXRjaChuZXdCYXRjaEZldGNoLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0JBVENIX0ZFVENILCBuZXdCYXRjaEZldGNoLCBuZXdCYXRjaEZldGNoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQYXJ0aXRpb25pbmcoWG1sUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBhcnRpdGlvbmluZ18yXzIgZ2V0UGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiBwYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UGFydGl0aW9uaW5nKFhtbFBhcnRpdGlvbmluZ18yXzIgbmV3UGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUGFydGl0aW9uaW5nXzJfMiBvbGRQYXJ0aXRpb25pbmcgPSBwYXJ0aXRpb25pbmc7Ci0JCXBhcnRpdGlvbmluZyA9IG5ld1BhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUEFSVElUSU9OSU5HLCBvbGRQYXJ0aXRpb25pbmcsIG5ld1BhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUjZ2V0UGFydGl0aW9uaW5nIDxlbT5QYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFydGl0aW9uaW5nKFhtbFBhcnRpdGlvbmluZ18yXzIgbmV3UGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1BhcnRpdGlvbmluZyAhPSBwYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1BhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UGFydGl0aW9uaW5nKG5ld1BhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QQVJUSVRJT05JTkcsIG5ld1BhcnRpdGlvbmluZywgbmV3UGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiBnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG9sZFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nID0gcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JCXJlcGxpY2F0aW9uUGFydGl0aW9uaW5nID0gbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORywgb2xkUmVwbGljYXRpb25QYXJ0aXRpb25pbmcsIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZSNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyA8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nICE9IHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZXBsaWNhdGlvblBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcobmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUm91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiBvbGRSb3VuZFJvYmluUGFydGl0aW9uaW5nID0gcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQkJcm91bmRSb2JpblBhcnRpdGlvbmluZyA9IG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORywgb2xkUm91bmRSb2JpblBhcnRpdGlvbmluZywgbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyA8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3Um91bmRSb2JpblBhcnRpdGlvbmluZyAhPSByb3VuZFJvYmluUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJvdW5kUm9iaW5QYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HLCBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQaW5uZWRQYXJ0aXRpb25pbmcoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QaW5uZWRQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiBwaW5uZWRQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UGlubmVkUGFydGl0aW9uaW5nKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgbmV3UGlubmVkUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBvbGRQaW5uZWRQYXJ0aXRpb25pbmcgPSBwaW5uZWRQYXJ0aXRpb25pbmc7Ci0JCXBpbm5lZFBhcnRpdGlvbmluZyA9IG5ld1Bpbm5lZFBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORywgb2xkUGlubmVkUGFydGl0aW9uaW5nLCBuZXdQaW5uZWRQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lI2dldFBpbm5lZFBhcnRpdGlvbmluZyA8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGlubmVkUGFydGl0aW9uaW5nKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgbmV3UGlubmVkUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1Bpbm5lZFBhcnRpdGlvbmluZyAhPSBwaW5uZWRQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwaW5uZWRQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQaW5uZWRQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UGlubmVkUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcobmV3UGlubmVkUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkcsIG5ld1Bpbm5lZFBhcnRpdGlvbmluZywgbmV3UGlubmVkUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSYW5nZVBhcnRpdGlvbmluZyhYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiBnZXRSYW5nZVBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcmFuZ2VQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmFuZ2VQYXJ0aXRpb25pbmcoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG5ld1JhbmdlUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG9sZFJhbmdlUGFydGl0aW9uaW5nID0gcmFuZ2VQYXJ0aXRpb25pbmc7Ci0JCXJhbmdlUGFydGl0aW9uaW5nID0gbmV3UmFuZ2VQYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1JBTkdFX1BBUlRJVElPTklORywgb2xkUmFuZ2VQYXJ0aXRpb25pbmcsIG5ld1JhbmdlUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZSNnZXRSYW5nZVBhcnRpdGlvbmluZyA8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmFuZ2VQYXJ0aXRpb25pbmcoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG5ld1JhbmdlUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1JhbmdlUGFydGl0aW9uaW5nICE9IHJhbmdlUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyYW5nZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyYW5nZVBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1JBTkdFX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmFuZ2VQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmFuZ2VQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmFuZ2VQYXJ0aXRpb25pbmcobmV3UmFuZ2VQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HLCBuZXdSYW5nZVBhcnRpdGlvbmluZywgbmV3UmFuZ2VQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9WYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIGdldFZhbHVlUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB2YWx1ZVBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRWYWx1ZVBhcnRpdGlvbmluZyhYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgbmV3VmFsdWVQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgb2xkVmFsdWVQYXJ0aXRpb25pbmcgPSB2YWx1ZVBhcnRpdGlvbmluZzsKLQkJdmFsdWVQYXJ0aXRpb25pbmcgPSBuZXdWYWx1ZVBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HLCBvbGRWYWx1ZVBhcnRpdGlvbmluZywgbmV3VmFsdWVQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lI2dldFZhbHVlUGFydGl0aW9uaW5nIDxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZVBhcnRpdGlvbmluZyhYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgbmV3VmFsdWVQYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3VmFsdWVQYXJ0aXRpb25pbmcgIT0gdmFsdWVQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHZhbHVlUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXZhbHVlUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdWYWx1ZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdWYWx1ZVBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRWYWx1ZVBhcnRpdGlvbmluZyhuZXdWYWx1ZVBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19WQUxVRV9QQVJUSVRJT05JTkcsIG5ld1ZhbHVlUGFydGl0aW9uaW5nLCBuZXdWYWx1ZVBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhc2ggUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SGFzaFBhcnRpdGlvbmluZyhYbWxIYXNoUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9IYXNoUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBnZXRIYXNoUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiBoYXNoUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEhhc2hQYXJ0aXRpb25pbmcoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgbmV3SGFzaFBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIG9sZEhhc2hQYXJ0aXRpb25pbmcgPSBoYXNoUGFydGl0aW9uaW5nOwotCQloYXNoUGFydGl0aW9uaW5nID0gbmV3SGFzaFBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkcsIG9sZEhhc2hQYXJ0aXRpb25pbmcsIG5ld0hhc2hQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lI2dldEhhc2hQYXJ0aXRpb25pbmcgPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SGFzaFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc2hQYXJ0aXRpb25pbmcoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgbmV3SGFzaFBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdIYXNoUGFydGl0aW9uaW5nICE9IGhhc2hQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGhhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaGFzaFBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0hBU0hfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdIYXNoUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0hhc2hQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19IQVNIX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRIYXNoUGFydGl0aW9uaW5nKG5ld0hhc2hQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkcsIG5ld0hhc2hQYXJ0aXRpb25pbmcsIG5ld0hhc2hQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFVuaW9uUGFydGl0aW9uaW5nKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9VbmlvblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIGdldFVuaW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB1bmlvblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRVbmlvblBhcnRpdGlvbmluZyhYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgbmV3VW5pb25QYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgb2xkVW5pb25QYXJ0aXRpb25pbmcgPSB1bmlvblBhcnRpdGlvbmluZzsKLQkJdW5pb25QYXJ0aXRpb25pbmcgPSBuZXdVbmlvblBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HLCBvbGRVbmlvblBhcnRpdGlvbmluZywgbmV3VW5pb25QYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lI2dldFVuaW9uUGFydGl0aW9uaW5nIDxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VW5pb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmlvblBhcnRpdGlvbmluZyhYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgbmV3VW5pb25QYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3VW5pb25QYXJ0aXRpb25pbmcgIT0gdW5pb25QYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHVuaW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXVuaW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdVbmlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdVbmlvblBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1VOSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRVbmlvblBhcnRpdGlvbmluZyhuZXdVbmlvblBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19VTklPTl9QQVJUSVRJT05JTkcsIG5ld1VuaW9uUGFydGl0aW9uaW5nLCBuZXdVbmlvblBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFydGl0aW9uZWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmVkKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uZWQoKQotCXsKLQkJcmV0dXJuIHBhcnRpdGlvbmVkOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lI2dldFBhcnRpdGlvbmVkIDxlbT5QYXJ0aXRpb25lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFydGl0aW9uZWQoU3RyaW5nIG5ld1BhcnRpdGlvbmVkKQotCXsKLQkJU3RyaW5nIG9sZFBhcnRpdGlvbmVkID0gcGFydGl0aW9uZWQ7Ci0JCXBhcnRpdGlvbmVkID0gbmV3UGFydGl0aW9uZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BBUlRJVElPTkVELCBvbGRQYXJ0aXRpb25lZCwgcGFydGl0aW9uZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob24gQ2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vbkNhY2hlYWJsZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFueVRvT25lXzJfMl9Ob25DYWNoZWFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm9uQ2FjaGVhYmxlKCkKLQl7Ci0JCXJldHVybiBub25DYWNoZWFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUjaXNOb25DYWNoZWFibGUgPGVtPk5vbiBDYWNoZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzTm9uQ2FjaGVhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9uQ2FjaGVhYmxlKGJvb2xlYW4gbmV3Tm9uQ2FjaGVhYmxlKQotCXsKLQkJYm9vbGVhbiBvbGROb25DYWNoZWFibGUgPSBub25DYWNoZWFibGU7Ci0JCW5vbkNhY2hlYWJsZSA9IG5ld05vbkNhY2hlYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fTk9OX0NBQ0hFQUJMRSwgb2xkTm9uQ2FjaGVhYmxlLCBub25DYWNoZWFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIEZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKLQkgKiBAc2VlICNzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEpvaW5GZXRjaF9Kb2luRmV0Y2goKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSm9pbkZldGNoVHlwZSBnZXRKb2luRmV0Y2goKQotCXsKLQkJcmV0dXJuIGpvaW5GZXRjaDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZSNnZXRKb2luRmV0Y2ggPGVtPkpvaW4gRmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlCi0JICogQHNlZSAjZ2V0Sm9pbkZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUgbmV3Sm9pbkZldGNoKQotCXsKLQkJWG1sSm9pbkZldGNoVHlwZSBvbGRKb2luRmV0Y2ggPSBqb2luRmV0Y2g7Ci0JCWpvaW5GZXRjaCA9IG5ld0pvaW5GZXRjaCA9PSBudWxsID8gSk9JTl9GRVRDSF9FREVGQVVMVCA6IG5ld0pvaW5GZXRjaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSk9JTl9GRVRDSCwgb2xkSm9pbkZldGNoLCBqb2luRmV0Y2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKLQkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZSNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKLQl7Ci0JCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgpCi0JewotCQlyZXR1cm4gYXR0cmlidXRlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZyBuZXdBdHRyaWJ1dGVUeXBlKQotCXsKLQkJU3RyaW5nIG9sZEF0dHJpYnV0ZVR5cGUgPSBhdHRyaWJ1dGVUeXBlOwotCQlhdHRyaWJ1dGVUeXBlID0gbmV3QXR0cmlidXRlVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQVRUUklCVVRFX1RZUEUsIG9sZEF0dHJpYnV0ZVR5cGUsIGF0dHJpYnV0ZVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQkFUQ0hfRkVUQ0g6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QmF0Y2hGZXRjaChudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSYW5nZVBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFZhbHVlUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRIYXNoUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VW5pb25QYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBiYXNpY1NldEFjY2Vzc01ldGhvZHMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0JBVENIX0ZFVENIOgotCQkJCXJldHVybiBnZXRCYXRjaEZldGNoKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFBpbm5lZFBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFJhbmdlUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldEhhc2hQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRVbmlvblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QQVJUSVRJT05FRDoKLQkJCQlyZXR1cm4gZ2V0UGFydGl0aW9uZWQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fTk9OX0NBQ0hFQUJMRToKLQkJCQlyZXR1cm4gaXNOb25DYWNoZWFibGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlVHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19KT0lOX0ZFVENIOgotCQkJCXJldHVybiBnZXRKb2luRmV0Y2goKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0JBVENIX0ZFVENIOgotCQkJCXNldEJhdGNoRmV0Y2goKFhtbEJhdGNoRmV0Y2gpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUEFSVElUSU9OSU5HOgotCQkJCXNldFBhcnRpdGlvbmluZygoWG1sUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlzZXRQaW5uZWRQYXJ0aXRpb25pbmcoKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXNldFJhbmdlUGFydGl0aW9uaW5nKChYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXNldFZhbHVlUGFydGl0aW9uaW5nKChYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0SGFzaFBhcnRpdGlvbmluZygoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFVuaW9uUGFydGl0aW9uaW5nKChYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUEFSVElUSU9ORUQ6Ci0JCQkJc2V0UGFydGl0aW9uZWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19OT05fQ0FDSEVBQkxFOgotCQkJCXNldE5vbkNhY2hlYWJsZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19KT0lOX0ZFVENIOgotCQkJCXNldEpvaW5GZXRjaCgoWG1sSm9pbkZldGNoVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19CQVRDSF9GRVRDSDoKLQkJCQlzZXRCYXRjaEZldGNoKChYbWxCYXRjaEZldGNoKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUEFSVElUSU9OSU5HOgotCQkJCXNldFBhcnRpdGlvbmluZygoWG1sUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlzZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXNldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlzZXRQaW5uZWRQYXJ0aXRpb25pbmcoKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UmFuZ2VQYXJ0aXRpb25pbmcoKFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlzZXRWYWx1ZVBhcnRpdGlvbmluZygoWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0SGFzaFBhcnRpdGlvbmluZygoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0VW5pb25QYXJ0aXRpb25pbmcoKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BBUlRJVElPTkVEOgotCQkJCXNldFBhcnRpdGlvbmVkKFBBUlRJVElPTkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX05PTl9DQUNIRUFCTEU6Ci0JCQkJc2V0Tm9uQ2FjaGVhYmxlKE5PTl9DQUNIRUFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKEFUVFJJQlVURV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0pPSU5fRkVUQ0g6Ci0JCQkJc2V0Sm9pbkZldGNoKEpPSU5fRkVUQ0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0JBVENIX0ZFVENIOgotCQkJCXJldHVybiBiYXRjaEZldGNoICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiByb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHBpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHJhbmdlUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gdmFsdWVQYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGhhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiB1bmlvblBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QQVJUSVRJT05FRDoKLQkJCQlyZXR1cm4gUEFSVElUSU9ORURfRURFRkFVTFQgPT0gbnVsbCA/IHBhcnRpdGlvbmVkICE9IG51bGwgOiAhUEFSVElUSU9ORURfRURFRkFVTFQuZXF1YWxzKHBhcnRpdGlvbmVkKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fTk9OX0NBQ0hFQUJMRToKLQkJCQlyZXR1cm4gbm9uQ2FjaGVhYmxlICE9IE5PTl9DQUNIRUFCTEVfRURFRkFVTFQ7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gYXR0cmlidXRlVHlwZSAhPSBudWxsIDogIUFUVFJJQlVURV9UWVBFX0VERUZBVUxULmVxdWFscyhhdHRyaWJ1dGVUeXBlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSk9JTl9GRVRDSDoKLQkJCQlyZXR1cm4gam9pbkZldGNoICE9IEpPSU5fRkVUQ0hfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEJhdGNoRmV0Y2hIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0JBVENIX0ZFVENIOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9IT0xERVJfX0JBVENIX0ZFVENIOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hbnlUb09uZV8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JBTkdFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVkFMVUVfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX0hBU0hfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19VTklPTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QQVJUSVRJT05FRDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9ORUQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFueVRvT25lXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fTk9OX0NBQ0hFQUJMRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX01BTllfVE9fT05FXzIyX19OT05fQ0FDSEVBQkxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BVFRSSUJVVEVfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luRmV0Y2guY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0pPSU5fRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fRkVUQ0hfX0pPSU5fRkVUQ0g7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXRjaEZldGNoSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9fQkFUQ0hfRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19CQVRDSF9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYW55VG9PbmVfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SQU5HRV9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1ZBTFVFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fSEFTSF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19IQVNIX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVU5JT05fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BBUlRJVElPTkVEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hbnlUb09uZV8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX01BTllfVE9fT05FXzIyX19OT05fQ0FDSEVBQkxFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fTk9OX0NBQ0hFQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FUVFJJQlVURV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pbkZldGNoLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fRkVUQ0hfX0pPSU5fRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19KT0lOX0ZFVENIOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocGFydGl0aW9uZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcnRpdGlvbmVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBub25DYWNoZWFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5vbkNhY2hlYWJsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXR0cmlidXRlVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXR0cmlidXRlVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgam9pbkZldGNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChqb2luRmV0Y2gpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0QXR0cmlidXRlVHlwZVRleHRSYW5nZSgpIHsKLQkJLy9ubyBhdHRyaWJ1dGUtdHlwZSBmb3IgbWFueS10by1vbmUKLQkJcmV0dXJuIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hbnlUb09uZSgpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVGFyZ2V0RW50aXR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRGZXRjaFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkT3B0aW9uYWxUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwc0lkVHJhbnNsYXRvcigpLAotCQkJYnVpbGRJZFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSm9pblRhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXNjYWRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKb2luRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZEJhdGNoRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpLAotCQkJYnVpbGROb25jYWNoZWFibGVUcmFuc2xhdG9yKCksCi0JCSAgICBYbWxQYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlBBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmluZygpKSwKLQkJCVhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9SZXBsaWNhdGlvblBhcnRpdGlvbmluZygpKSwKLQkJCVhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlJPVU5EX1JPQklOX1BBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKSksCi0JCQlYbWxQaW5uZWRQYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlBJTk5FRF9QQVJUSVRJT05JTkcsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QaW5uZWRQYXJ0aXRpb25pbmcoKSksCi0JCQlYbWxSYW5nZVBhcnRpdGlvbmluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuUkFOR0VfUEFSVElUSU9OSU5HLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKSksCi0JCQlYbWxWYWx1ZVBhcnRpdGlvbmluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuVkFMVUVfUEFSVElUSU9OSU5HLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfVmFsdWVQYXJ0aXRpb25pbmcoKSksCi0JCQlYbWxIYXNoUGFydGl0aW9uaW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5IQVNIX1BBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX0hhc2hQYXJ0aXRpb25pbmcoKSksCi0JCQlYbWxVbmlvblBhcnRpdGlvbmluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuVU5JT05fUEFSVElUSU9OSU5HLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfVW5pb25QYXJ0aXRpb25pbmcoKSksCi0JCQlidWlsZFBhcnRpdGlvbmVkVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcml2YXRlT3duZWRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJJVkFURV9PV05FRCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcml2YXRlT3duZWRfUHJpdmF0ZU93bmVkKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRKb2luRmV0Y2hUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxKb2luRmV0Y2hfSm9pbkZldGNoKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxQcm9wZXJ0eS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NNZXRob2RzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQmF0Y2hGZXRjaFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxCYXRjaEZldGNoLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5CQVRDSF9GRVRDSCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxCYXRjaEZldGNoSG9sZGVyX0JhdGNoRmV0Y2goKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSm9pblRhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEpvaW5UYWJsZS5idWlsZFRyYW5zbGF0b3IoSlBBLkpPSU5fVEFCTEUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEpvaW5UYWJsZUNvbnRhaW5lcl9Kb2luVGFibGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTm9uY2FjaGVhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLk5PTkNBQ0hFQUJMRSwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFueVRvT25lXzJfMl9Ob25DYWNoZWFibGUoKSk7Ci0JfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUGFydGl0aW9uZWRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuUEFSVElUSU9OSU5HX0dST1VQX19QQVJUSVRJT05FRCwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmVkKCkpOwotCX0KLSAgIAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hcHBlZFN1cGVyY2xhc3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxNYXBwZWRTdXBlcmNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YTgzZTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hcHBlZFN1cGVyY2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDbGFzc1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDYWNoZWFibGVfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGluazFfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18xXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sVHlwZU1hcHBpbmdfMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGluazJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSGFzaFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFBsc3FsUmVjb3JkXzJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmsyXzQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbENhY2hlSW5kZXhfMl80OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmsyXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTWFwcGVkIFN1cGVyY2xhc3M8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0T3B0aW1pc3RpY0xvY2tpbmcgPGVtPk9wdGltaXN0aWMgTG9ja2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldENvcHlQb2xpY3kgPGVtPkNvcHkgUG9saWN5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRDbG9uZUNvcHlQb2xpY3kgPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE1hcHBlZFN1cGVyY2xhc3MgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MgaW1wbGVtZW50cyBYbWxUeXBlTWFwcGluZywgWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEsIFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wLCBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSwgWG1sTWFwcGVkU3VwZXJjbGFzc18yXzIsIFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zLCBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfNCwgWG1sUmVhZE9ubHksIFhtbEN1c3RvbWl6ZXJIb2xkZXIsIFhtbENoYW5nZVRyYWNraW5nSG9sZGVyLCBYbWxDYWNoZUhvbGRlciwgWG1sQ29udmVydGVyQ29udGFpbmVyLCBYbWxQcm9wZXJ0eUNvbnRhaW5lcgotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyZW50Q2xhc3MoKSA8ZW0+UGFyZW50IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJlbnRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmVudENsYXNzKCkgPGVtPlBhcmVudCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyZW50Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFyZW50Q2xhc3MgPSBQQVJFTlRfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmltYXJ5S2V5KCkgPGVtPlByaW1hcnkgS2V5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmltYXJ5S2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUHJpbWFyeUtleSBwcmltYXJ5S2V5OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhY2hlYWJsZSgpIDxlbT5DYWNoZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIENBQ0hFQUJMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWNoZWFibGUoKSA8ZW0+Q2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWNoZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGNhY2hlYWJsZSA9IENBQ0hFQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhY2hlSW50ZXJjZXB0b3IoKSA8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhY2hlSW50ZXJjZXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDbGFzc1JlZmVyZW5jZSBjYWNoZUludGVyY2VwdG9yOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKSA8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSA8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmV0Y2hHcm91cHMoKSA8ZW0+RmV0Y2ggR3JvdXBzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZldGNoR3JvdXBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sRmV0Y2hHcm91cD4gZmV0Y2hHcm91cHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXF1ZW5jZUdlbmVyYXRvcigpIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3I7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWJsZUdlbmVyYXRvcigpIDxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhYmxlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3I7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lZFF1ZXJpZXMoKSA8ZW0+TmFtZWQgUXVlcmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lZFF1ZXJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxOYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKSA8ZW0+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkgPGVtPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5PiBuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpIDxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFNxbFJlc3VsdFNldE1hcHBpbmc+IHNxbFJlc3VsdFNldE1hcHBpbmdzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UXVlcnlSZWRpcmVjdG9ycygpIDxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UXVlcnlSZWRpcmVjdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFF1ZXJ5UmVkaXJlY3RvcnMgcXVlcnlSZWRpcmVjdG9yczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnRpdGlvbmluZygpIDxlbT5QYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFBhcnRpdGlvbmluZ18yXzIgcGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKSA8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiByZXBsaWNhdGlvblBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKSA8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBpbm5lZFBhcnRpdGlvbmluZygpIDxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIHBpbm5lZFBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkgPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgcmFuZ2VQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpIDxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIHZhbHVlUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFzaFBhcnRpdGlvbmluZygpIDxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFzaFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIGhhc2hQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbmlvblBhcnRpdGlvbmluZygpIDxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIHVuaW9uUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnRpdGlvbmVkKCkgPGVtPlBhcnRpdGlvbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVElUSU9ORURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydGl0aW9uZWQoKSA8ZW0+UGFydGl0aW9uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcnRpdGlvbmVkID0gUEFSVElUSU9ORURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZGRpdGlvbmFsQ3JpdGVyaWEoKSA8ZW0+QWRkaXRpb25hbCBDcml0ZXJpYTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWRkaXRpb25hbENyaXRlcmlhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMiBhZGRpdGlvbmFsQ3JpdGVyaWE7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNdWx0aXRlbmFudCgpIDxlbT5NdWx0aXRlbmFudDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TXVsdGl0ZW5hbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxNdWx0aXRlbmFudCBtdWx0aXRlbmFudDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkgPGVtPk5hbWVkIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMz4gbmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkgPGVtPk5hbWVkIFBsc3FsIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM+IG5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpIDxlbT5OYW1lZCBQbHNxbCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zPiBuYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBsc3FsUmVjb3JkcygpIDxlbT5QbHNxbCBSZWNvcmRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBsc3FsUmVjb3JkcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFBsc3FsUmVjb3JkXzJfMz4gcGxzcWxSZWNvcmRzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGxzcWxUYWJsZXMoKSA8ZW0+UGxzcWwgVGFibGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBsc3FsVGFibGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUGxzcWxUYWJsZT4gcGxzcWxUYWJsZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWNoZUluZGV4KCkgPGVtPkNhY2hlIEluZGV4PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWNoZUluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2FjaGVJbmRleF8yXzQgY2FjaGVJbmRleDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFkT25seSgpIDxlbT5SZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlYWRPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gUkVBRF9PTkxZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlYWRPbmx5KCkgPGVtPlJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIHJlYWRPbmx5ID0gUkVBRF9PTkxZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VzdG9taXplcigpIDxlbT5DdXN0b21pemVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXN0b21pemVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2xhc3NSZWZlcmVuY2UgY3VzdG9taXplcjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZVRyYWNraW5nKCkgPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlVHJhY2tpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDaGFuZ2VUcmFja2luZyBjaGFuZ2VUcmFja2luZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhY2hlKCkgPGVtPkNhY2hlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWNoZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENhY2hlIGNhY2hlOwotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRXhpc3RlbmNlVHlwZSBFWElTVEVOQ0VfQ0hFQ0tJTkdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSA8ZW0+RXhpc3RlbmNlIENoZWNraW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGlzdGVuY2VDaGVja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEV4aXN0ZW5jZVR5cGUgZXhpc3RlbmNlQ2hlY2tpbmcgPSBFWElTVEVOQ0VfQ0hFQ0tJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0ZXJzKCkgPGVtPkNvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbENvbnZlcnRlcj4gY29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVDb252ZXJ0ZXJzKCkgPGVtPlR5cGUgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlQ29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+IHR5cGVDb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPYmplY3RUeXBlQ29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+IG9iamVjdFR5cGVDb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RydWN0Q29udmVydGVycygpIDxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPiBzdHJ1Y3RDb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9wdGltaXN0aWNMb2NraW5nKCkgPGVtPk9wdGltaXN0aWMgTG9ja2luZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3B0aW1pc3RpY0xvY2tpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxPcHRpbWlzdGljTG9ja2luZyBvcHRpbWlzdGljTG9ja2luZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvcHlQb2xpY3koKSA8ZW0+Q29weSBQb2xpY3k8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDb3B5UG9saWN5IGNvcHlQb2xpY3k7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpIDxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGluc3RhbnRpYXRpb25Db3B5UG9saWN5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xvbmVDb3B5UG9saWN5KCkgPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbG9uZUNvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDbG9uZUNvcHlQb2xpY3kgY2xvbmVDb3B5UG9saWN5OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBleGNsdWRlRGVmYXVsdE1hcHBpbmdzID0gRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE1hcHBlZFN1cGVyY2xhc3MoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9NQVBQRURfU1VQRVJDTEFTUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlYWRPbmx5KEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSZWFkT25seV9SZWFkT25seSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0UmVhZE9ubHkoKQotCXsKLQkJcmV0dXJuIHJlYWRPbmx5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRSZWFkT25seSA8ZW0+UmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlYWRPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoQm9vbGVhbiBuZXdSZWFkT25seSkKLQl7Ci0JCUJvb2xlYW4gb2xkUmVhZE9ubHkgPSByZWFkT25seTsKLQkJcmVhZE9ubHkgPSBuZXdSZWFkT25seTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVBRF9PTkxZLCBvbGRSZWFkT25seSwgcmVhZE9ubHkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DdXN0b21pemVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DdXN0b21pemVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkN1c3RvbWl6ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEN1c3RvbWl6ZXIoWG1sQ2xhc3NSZWZlcmVuY2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDdXN0b21pemVySG9sZGVyX0N1c3RvbWl6ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENsYXNzUmVmZXJlbmNlIGdldEN1c3RvbWl6ZXIoKQotCXsKLQkJcmV0dXJuIGN1c3RvbWl6ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q3VzdG9taXplcihYbWxDbGFzc1JlZmVyZW5jZSBuZXdDdXN0b21pemVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ2xhc3NSZWZlcmVuY2Ugb2xkQ3VzdG9taXplciA9IGN1c3RvbWl6ZXI7Ci0JCWN1c3RvbWl6ZXIgPSBuZXdDdXN0b21pemVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DVVNUT01JWkVSLCBvbGRDdXN0b21pemVyLCBuZXdDdXN0b21pemVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0Q3VzdG9taXplciA8ZW0+Q3VzdG9taXplcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q3VzdG9taXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1c3RvbWl6ZXIoWG1sQ2xhc3NSZWZlcmVuY2UgbmV3Q3VzdG9taXplcikKLQl7Ci0JCWlmIChuZXdDdXN0b21pemVyICE9IGN1c3RvbWl6ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGN1c3RvbWl6ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY3VzdG9taXplcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NVU1RPTUlaRVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0N1c3RvbWl6ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q3VzdG9taXplcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NVU1RPTUlaRVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q3VzdG9taXplcihuZXdDdXN0b21pemVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NVU1RPTUlaRVIsIG5ld0N1c3RvbWl6ZXIsIG5ld0N1c3RvbWl6ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgVHJhY2tpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENoYW5nZVRyYWNraW5nKFhtbENoYW5nZVRyYWNraW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXJfQ2hhbmdlVHJhY2tpbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENoYW5nZVRyYWNraW5nIGdldENoYW5nZVRyYWNraW5nKCkKLQl7Ci0JCXJldHVybiBjaGFuZ2VUcmFja2luZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDaGFuZ2VUcmFja2luZyhYbWxDaGFuZ2VUcmFja2luZyBuZXdDaGFuZ2VUcmFja2luZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENoYW5nZVRyYWNraW5nIG9sZENoYW5nZVRyYWNraW5nID0gY2hhbmdlVHJhY2tpbmc7Ci0JCWNoYW5nZVRyYWNraW5nID0gbmV3Q2hhbmdlVHJhY2tpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NIQU5HRV9UUkFDS0lORywgb2xkQ2hhbmdlVHJhY2tpbmcsIG5ld0NoYW5nZVRyYWNraW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0Q2hhbmdlVHJhY2tpbmcgPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDaGFuZ2VUcmFja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYW5nZVRyYWNraW5nKFhtbENoYW5nZVRyYWNraW5nIG5ld0NoYW5nZVRyYWNraW5nKQotCXsKLQkJaWYgKG5ld0NoYW5nZVRyYWNraW5nICE9IGNoYW5nZVRyYWNraW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjaGFuZ2VUcmFja2luZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljaGFuZ2VUcmFja2luZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NIQU5HRV9UUkFDS0lORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q2hhbmdlVHJhY2tpbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q2hhbmdlVHJhY2tpbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DSEFOR0VfVFJBQ0tJTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2hhbmdlVHJhY2tpbmcobmV3Q2hhbmdlVHJhY2tpbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0hBTkdFX1RSQUNLSU5HLCBuZXdDaGFuZ2VUcmFja2luZywgbmV3Q2hhbmdlVHJhY2tpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWNoZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FjaGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENhY2hlKFhtbENhY2hlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVIb2xkZXJfQ2FjaGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENhY2hlIGdldENhY2hlKCkKLQl7Ci0JCXJldHVybiBjYWNoZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDYWNoZShYbWxDYWNoZSBuZXdDYWNoZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENhY2hlIG9sZENhY2hlID0gY2FjaGU7Ci0JCWNhY2hlID0gbmV3Q2FjaGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFLCBvbGRDYWNoZSwgbmV3Q2FjaGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRDYWNoZSA8ZW0+Q2FjaGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDYWNoZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhY2hlKFhtbENhY2hlIG5ld0NhY2hlKQotCXsKLQkJaWYgKG5ld0NhY2hlICE9IGNhY2hlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjYWNoZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljYWNoZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDYWNoZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDYWNoZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENhY2hlKG5ld0NhY2hlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFLCBuZXdDYWNoZSwgbmV3Q2FjaGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGlzdGVuY2UgQ2hlY2tpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlCi0JICogQHNlZSAjc2V0RXhpc3RlbmNlQ2hlY2tpbmcoRXhpc3RlbmNlVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlSG9sZGVyX0V4aXN0ZW5jZUNoZWNraW5nKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXhpc3RlbmNlVHlwZSBnZXRFeGlzdGVuY2VDaGVja2luZygpCi0JewotCQlyZXR1cm4gZXhpc3RlbmNlQ2hlY2tpbmc7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldEV4aXN0ZW5jZUNoZWNraW5nIDxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUKLQkgKiBAc2VlICNnZXRFeGlzdGVuY2VDaGVja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4aXN0ZW5jZUNoZWNraW5nKEV4aXN0ZW5jZVR5cGUgbmV3RXhpc3RlbmNlQ2hlY2tpbmcpCi0JewotCQlFeGlzdGVuY2VUeXBlIG9sZEV4aXN0ZW5jZUNoZWNraW5nID0gZXhpc3RlbmNlQ2hlY2tpbmc7Ci0JCWV4aXN0ZW5jZUNoZWNraW5nID0gbmV3RXhpc3RlbmNlQ2hlY2tpbmcgPT0gbnVsbCA/IEVYSVNURU5DRV9DSEVDS0lOR19FREVGQVVMVCA6IG5ld0V4aXN0ZW5jZUNoZWNraW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWElTVEVOQ0VfQ0hFQ0tJTkcsIG9sZEV4aXN0ZW5jZUNoZWNraW5nLCBleGlzdGVuY2VDaGVja2luZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckNvbnRhaW5lcl9Db252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxDb252ZXJ0ZXI+IGdldENvbnZlcnRlcnMoKQotCXsKLQkJaWYgKGNvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJY29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxDb252ZXJ0ZXI+KFhtbENvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckNvbnRhaW5lcl9UeXBlQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4gZ2V0VHlwZUNvbnZlcnRlcnMoKQotCXsKLQkJaWYgKHR5cGVDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCXR5cGVDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+KFhtbFR5cGVDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1RZUEVfQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+IGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmIChvYmplY3RUeXBlQ29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQlvYmplY3RUeXBlQ29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPihYbWxPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1N0cnVjdENvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4gZ2V0U3RydWN0Q29udmVydGVycygpCi0JewotCQlpZiAoc3RydWN0Q29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQlzdHJ1Y3RDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4oWG1sU3RydWN0Q29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TVFJVQ1RfQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3B0aW1pc3RpYyBMb2NraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW1pc3RpYyBMb2NraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRPcHRpbWlzdGljTG9ja2luZyhYbWxPcHRpbWlzdGljTG9ja2luZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfT3B0aW1pc3RpY0xvY2tpbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE9wdGltaXN0aWNMb2NraW5nIGdldE9wdGltaXN0aWNMb2NraW5nKCkKLQl7Ci0JCXJldHVybiBvcHRpbWlzdGljTG9ja2luZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRPcHRpbWlzdGljTG9ja2luZyhYbWxPcHRpbWlzdGljTG9ja2luZyBuZXdPcHRpbWlzdGljTG9ja2luZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbE9wdGltaXN0aWNMb2NraW5nIG9sZE9wdGltaXN0aWNMb2NraW5nID0gb3B0aW1pc3RpY0xvY2tpbmc7Ci0JCW9wdGltaXN0aWNMb2NraW5nID0gbmV3T3B0aW1pc3RpY0xvY2tpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09QVElNSVNUSUNfTE9DS0lORywgb2xkT3B0aW1pc3RpY0xvY2tpbmcsIG5ld09wdGltaXN0aWNMb2NraW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0T3B0aW1pc3RpY0xvY2tpbmcgPGVtPk9wdGltaXN0aWMgTG9ja2luZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW1pc3RpYyBMb2NraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRPcHRpbWlzdGljTG9ja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wdGltaXN0aWNMb2NraW5nKFhtbE9wdGltaXN0aWNMb2NraW5nIG5ld09wdGltaXN0aWNMb2NraW5nKQotCXsKLQkJaWYgKG5ld09wdGltaXN0aWNMb2NraW5nICE9IG9wdGltaXN0aWNMb2NraW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChvcHRpbWlzdGljTG9ja2luZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClvcHRpbWlzdGljTG9ja2luZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09QVElNSVNUSUNfTE9DS0lORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3T3B0aW1pc3RpY0xvY2tpbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3T3B0aW1pc3RpY0xvY2tpbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PUFRJTUlTVElDX0xPQ0tJTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0T3B0aW1pc3RpY0xvY2tpbmcobmV3T3B0aW1pc3RpY0xvY2tpbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT1BUSU1JU1RJQ19MT0NLSU5HLCBuZXdPcHRpbWlzdGljTG9ja2luZywgbmV3T3B0aW1pc3RpY0xvY2tpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvcHlQb2xpY3koWG1sQ29weVBvbGljeSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfQ29weVBvbGljeSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ29weVBvbGljeSBnZXRDb3B5UG9saWN5KCkKLQl7Ci0JCXJldHVybiBjb3B5UG9saWN5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvcHlQb2xpY3koWG1sQ29weVBvbGljeSBuZXdDb3B5UG9saWN5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ29weVBvbGljeSBvbGRDb3B5UG9saWN5ID0gY29weVBvbGljeTsKLQkJY29weVBvbGljeSA9IG5ld0NvcHlQb2xpY3k7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPUFlfUE9MSUNZLCBvbGRDb3B5UG9saWN5LCBuZXdDb3B5UG9saWN5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0Q29weVBvbGljeSA8ZW0+Q29weSBQb2xpY3k8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weVBvbGljeShYbWxDb3B5UG9saWN5IG5ld0NvcHlQb2xpY3kpCi0JewotCQlpZiAobmV3Q29weVBvbGljeSAhPSBjb3B5UG9saWN5KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvcHlQb2xpY3kpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q29weVBvbGljeSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb3B5UG9saWN5KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29weVBvbGljeShuZXdDb3B5UG9saWN5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPUFlfUE9MSUNZLCBuZXdDb3B5UG9saWN5LCBuZXdDb3B5UG9saWN5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGdldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQl7Ci0JCXJldHVybiBpbnN0YW50aWF0aW9uQ29weVBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IG9sZEluc3RhbnRpYXRpb25Db3B5UG9saWN5ID0gaW5zdGFudGlhdGlvbkNvcHlQb2xpY3k7Ci0JCWluc3RhbnRpYXRpb25Db3B5UG9saWN5ID0gbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3k7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1ksIG9sZEluc3RhbnRpYXRpb25Db3B5UG9saWN5LCBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5IDxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5KQotCXsKLQkJaWYgKG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5ICE9IGluc3RhbnRpYXRpb25Db3B5UG9saWN5KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChpbnN0YW50aWF0aW9uQ29weVBvbGljeSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbnN0YW50aWF0aW9uQ29weVBvbGljeSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZLCBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbG9uZSBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENsb25lQ29weVBvbGljeShYbWxDbG9uZUNvcHlQb2xpY3kpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0Nsb25lQ29weVBvbGljeSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ2xvbmVDb3B5UG9saWN5IGdldENsb25lQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4gY2xvbmVDb3B5UG9saWN5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENsb25lQ29weVBvbGljeShYbWxDbG9uZUNvcHlQb2xpY3kgbmV3Q2xvbmVDb3B5UG9saWN5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ2xvbmVDb3B5UG9saWN5IG9sZENsb25lQ29weVBvbGljeSA9IGNsb25lQ29weVBvbGljeTsKLQkJY2xvbmVDb3B5UG9saWN5ID0gbmV3Q2xvbmVDb3B5UG9saWN5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTE9ORV9DT1BZX1BPTElDWSwgb2xkQ2xvbmVDb3B5UG9saWN5LCBuZXdDbG9uZUNvcHlQb2xpY3kpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRDbG9uZUNvcHlQb2xpY3kgPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2xvbmVDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xvbmVDb3B5UG9saWN5KFhtbENsb25lQ29weVBvbGljeSBuZXdDbG9uZUNvcHlQb2xpY3kpCi0JewotCQlpZiAobmV3Q2xvbmVDb3B5UG9saWN5ICE9IGNsb25lQ29weVBvbGljeSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY2xvbmVDb3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNsb25lQ29weVBvbGljeSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMT05FX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDbG9uZUNvcHlQb2xpY3kgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q2xvbmVDb3B5UG9saWN5KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0xPTkVfQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2xvbmVDb3B5UG9saWN5KG5ld0Nsb25lQ29weVBvbGljeSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTE9ORV9DT1BZX1BPTElDWSwgbmV3Q2xvbmVDb3B5UG9saWN5LCBuZXdDbG9uZUNvcHlQb2xpY3kpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByaW1hcnlLZXkoWG1sUHJpbWFyeUtleSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xX1ByaW1hcnlLZXkoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFByaW1hcnlLZXkgZ2V0UHJpbWFyeUtleSgpCi0JewotCQlyZXR1cm4gcHJpbWFyeUtleTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcmltYXJ5S2V5KFhtbFByaW1hcnlLZXkgbmV3UHJpbWFyeUtleSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFByaW1hcnlLZXkgb2xkUHJpbWFyeUtleSA9IHByaW1hcnlLZXk7Ci0JCXByaW1hcnlLZXkgPSBuZXdQcmltYXJ5S2V5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUklNQVJZX0tFWSwgb2xkUHJpbWFyeUtleSwgbmV3UHJpbWFyeUtleSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFByaW1hcnlLZXkgPGVtPlByaW1hcnkgS2V5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmltYXJ5IEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJpbWFyeUtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByaW1hcnlLZXkoWG1sUHJpbWFyeUtleSBuZXdQcmltYXJ5S2V5KQotCXsKLQkJaWYgKG5ld1ByaW1hcnlLZXkgIT0gcHJpbWFyeUtleSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJpbWFyeUtleSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwcmltYXJ5S2V5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJJTUFSWV9LRVksIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByaW1hcnlLZXkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UHJpbWFyeUtleSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSSU1BUllfS0VZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFByaW1hcnlLZXkobmV3UHJpbWFyeUtleSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUklNQVJZX0tFWSwgbmV3UHJpbWFyeUtleSwgbmV3UHJpbWFyeUtleSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FjaGVhYmxlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZWFibGVfMl8wX0NhY2hlYWJsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0Q2FjaGVhYmxlKCkKLQl7Ci0JCXJldHVybiBjYWNoZWFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldENhY2hlYWJsZSA8ZW0+Q2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhY2hlYWJsZShCb29sZWFuIG5ld0NhY2hlYWJsZSkKLQl7Ci0JCUJvb2xlYW4gb2xkQ2FjaGVhYmxlID0gY2FjaGVhYmxlOwotCQljYWNoZWFibGUgPSBuZXdDYWNoZWFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFQUJMRSwgb2xkQ2FjaGVhYmxlLCBjYWNoZWFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWNoZSBJbnRlcmNlcHRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENhY2hlSW50ZXJjZXB0b3IoWG1sQ2xhc3NSZWZlcmVuY2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMF9DYWNoZUludGVyY2VwdG9yKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDbGFzc1JlZmVyZW5jZSBnZXRDYWNoZUludGVyY2VwdG9yKCkKLQl7Ci0JCXJldHVybiBjYWNoZUludGVyY2VwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENhY2hlSW50ZXJjZXB0b3IoWG1sQ2xhc3NSZWZlcmVuY2UgbmV3Q2FjaGVJbnRlcmNlcHRvciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENsYXNzUmVmZXJlbmNlIG9sZENhY2hlSW50ZXJjZXB0b3IgPSBjYWNoZUludGVyY2VwdG9yOwotCQljYWNoZUludGVyY2VwdG9yID0gbmV3Q2FjaGVJbnRlcmNlcHRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVfSU5URVJDRVBUT1IsIG9sZENhY2hlSW50ZXJjZXB0b3IsIG5ld0NhY2hlSW50ZXJjZXB0b3IpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRDYWNoZUludGVyY2VwdG9yIDxlbT5DYWNoZSBJbnRlcmNlcHRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhY2hlSW50ZXJjZXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZUludGVyY2VwdG9yKFhtbENsYXNzUmVmZXJlbmNlIG5ld0NhY2hlSW50ZXJjZXB0b3IpCi0JewotCQlpZiAobmV3Q2FjaGVJbnRlcmNlcHRvciAhPSBjYWNoZUludGVyY2VwdG9yKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjYWNoZUludGVyY2VwdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNhY2hlSW50ZXJjZXB0b3IpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRV9JTlRFUkNFUFRPUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q2FjaGVJbnRlcmNlcHRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDYWNoZUludGVyY2VwdG9yKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVfSU5URVJDRVBUT1IsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2FjaGVJbnRlcmNlcHRvcihuZXdDYWNoZUludGVyY2VwdG9yLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFX0lOVEVSQ0VQVE9SLCBuZXdDYWNoZUludGVyY2VwdG9yLCBuZXdDYWNoZUludGVyY2VwdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfQXNzb2NpYXRpb25PdmVycmlkZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IGdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQl7Ci0JCWlmIChhc3NvY2lhdGlvbk92ZXJyaWRlcyA9PSBudWxsKQotCQl7Ci0JCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPihYbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQl9Ci0JCXJldHVybiBhc3NvY2lhdGlvbk92ZXJyaWRlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyX0F0dHJpYnV0ZU92ZXJyaWRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpCi0JewotCQlpZiAoYXR0cmlidXRlT3ZlcnJpZGVzID09IG51bGwpCi0JCXsKLQkJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4oWG1sQXR0cmlidXRlT3ZlcnJpZGUuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FUVFJJQlVURV9PVkVSUklERVMpOwotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVPdmVycmlkZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmV0Y2ggR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxGZXRjaEdyb3VwfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZldGNoIEdyb3VwczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZldGNoIEdyb3VwczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xX0ZldGNoR3JvdXBzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxGZXRjaEdyb3VwPiBnZXRGZXRjaEdyb3VwcygpCi0JewotCQlpZiAoZmV0Y2hHcm91cHMgPT0gbnVsbCkKLQkJewotCQkJZmV0Y2hHcm91cHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sRmV0Y2hHcm91cD4oWG1sRmV0Y2hHcm91cC5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRkVUQ0hfR1JPVVBTKTsKLQkJfQotCQlyZXR1cm4gZmV0Y2hHcm91cHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvckNvbnRhaW5lcl9TZXF1ZW5jZUdlbmVyYXRvcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sU2VxdWVuY2VHZW5lcmF0b3IgZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKQotCXsKLQkJcmV0dXJuIHNlcXVlbmNlR2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFNlcXVlbmNlR2VuZXJhdG9yKFhtbFNlcXVlbmNlR2VuZXJhdG9yIG5ld1NlcXVlbmNlR2VuZXJhdG9yLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igb2xkU2VxdWVuY2VHZW5lcmF0b3IgPSBzZXF1ZW5jZUdlbmVyYXRvcjsKLQkJc2VxdWVuY2VHZW5lcmF0b3IgPSBuZXdTZXF1ZW5jZUdlbmVyYXRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU0VRVUVOQ0VfR0VORVJBVE9SLCBvbGRTZXF1ZW5jZUdlbmVyYXRvciwgbmV3U2VxdWVuY2VHZW5lcmF0b3IpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRTZXF1ZW5jZUdlbmVyYXRvciA8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IgbmV3U2VxdWVuY2VHZW5lcmF0b3IpCi0JewotCQlpZiAobmV3U2VxdWVuY2VHZW5lcmF0b3IgIT0gc2VxdWVuY2VHZW5lcmF0b3IpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHNlcXVlbmNlR2VuZXJhdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXNlcXVlbmNlR2VuZXJhdG9yKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU0VRVUVOQ0VfR0VORVJBVE9SLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTZXF1ZW5jZUdlbmVyYXRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTZXF1ZW5jZUdlbmVyYXRvcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NFUVVFTkNFX0dFTkVSQVRPUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTZXF1ZW5jZUdlbmVyYXRvcihuZXdTZXF1ZW5jZUdlbmVyYXRvciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TRVFVRU5DRV9HRU5FUkFUT1IsIG5ld1NlcXVlbmNlR2VuZXJhdG9yLCBuZXdTZXF1ZW5jZUdlbmVyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VGFibGVHZW5lcmF0b3IoWG1sVGFibGVHZW5lcmF0b3IpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JDb250YWluZXJfVGFibGVHZW5lcmF0b3IoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFRhYmxlR2VuZXJhdG9yIGdldFRhYmxlR2VuZXJhdG9yKCkKLQl7Ci0JCXJldHVybiB0YWJsZUdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvciBuZXdUYWJsZUdlbmVyYXRvciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFRhYmxlR2VuZXJhdG9yIG9sZFRhYmxlR2VuZXJhdG9yID0gdGFibGVHZW5lcmF0b3I7Ci0JCXRhYmxlR2VuZXJhdG9yID0gbmV3VGFibGVHZW5lcmF0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1RBQkxFX0dFTkVSQVRPUiwgb2xkVGFibGVHZW5lcmF0b3IsIG5ld1RhYmxlR2VuZXJhdG9yKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0VGFibGVHZW5lcmF0b3IgPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRUYWJsZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yIG5ld1RhYmxlR2VuZXJhdG9yKQotCXsKLQkJaWYgKG5ld1RhYmxlR2VuZXJhdG9yICE9IHRhYmxlR2VuZXJhdG9yKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh0YWJsZUdlbmVyYXRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0YWJsZUdlbmVyYXRvcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1RBQkxFX0dFTkVSQVRPUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VGFibGVHZW5lcmF0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VGFibGVHZW5lcmF0b3IpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UQUJMRV9HRU5FUkFUT1IsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VGFibGVHZW5lcmF0b3IobmV3VGFibGVHZW5lcmF0b3IsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVEFCTEVfR0VORVJBVE9SLCBuZXdUYWJsZUdlbmVyYXRvciwgbmV3VGFibGVHZW5lcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVkIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lZCBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRRdWVyaWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxOYW1lZFF1ZXJ5PiBnZXROYW1lZFF1ZXJpZXMoKQotCXsKLQkJaWYgKG5hbWVkUXVlcmllcyA9PSBudWxsKQotCQl7Ci0JCQluYW1lZFF1ZXJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sTmFtZWRRdWVyeT4oWG1sTmFtZWRRdWVyeS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfUVVFUklFUyk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVkUXVlcmllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBOYXRpdmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lZCBOYXRpdmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWROYXRpdmVRdWVyaWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxOYW1lZE5hdGl2ZVF1ZXJ5PiBnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKQotCXsKLQkJaWYgKG5hbWVkTmF0aXZlUXVlcmllcyA9PSBudWxsKQotCQl7Ci0JCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sTmFtZWROYXRpdmVRdWVyeT4oWG1sTmFtZWROYXRpdmVRdWVyeS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfTkFUSVZFX1FVRVJJRVMpOwotCQl9Ci0JCXJldHVybiBuYW1lZE5hdGl2ZVF1ZXJpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeT4gZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkKLQl7Ci0JCWlmIChuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgPT0gbnVsbCkKLQkJewotCQkJbmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnk+KFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUyk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKLQkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCi0JewotCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY2Nlc3NNZXRob2RzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xX1NxbFJlc3VsdFNldE1hcHBpbmdzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTcWxSZXN1bHRTZXRNYXBwaW5nPiBnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpCi0JewotCQlpZiAoc3FsUmVzdWx0U2V0TWFwcGluZ3MgPT0gbnVsbCkKLQkJewotCQkJc3FsUmVzdWx0U2V0TWFwcGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8U3FsUmVzdWx0U2V0TWFwcGluZz4oU3FsUmVzdWx0U2V0TWFwcGluZy5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1MpOwotCQl9Ci0JCXJldHVybiBzcWxSZXN1bHRTZXRNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5RdWVyeSBSZWRpcmVjdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFF1ZXJ5UmVkaXJlY3RvcnMoWG1sUXVlcnlSZWRpcmVjdG9ycykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xX1F1ZXJ5UmVkaXJlY3RvcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFF1ZXJ5UmVkaXJlY3RvcnMgZ2V0UXVlcnlSZWRpcmVjdG9ycygpCi0JewotCQlyZXR1cm4gcXVlcnlSZWRpcmVjdG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRRdWVyeVJlZGlyZWN0b3JzKFhtbFF1ZXJ5UmVkaXJlY3RvcnMgbmV3UXVlcnlSZWRpcmVjdG9ycywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFF1ZXJ5UmVkaXJlY3RvcnMgb2xkUXVlcnlSZWRpcmVjdG9ycyA9IHF1ZXJ5UmVkaXJlY3RvcnM7Ci0JCXF1ZXJ5UmVkaXJlY3RvcnMgPSBuZXdRdWVyeVJlZGlyZWN0b3JzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19RVUVSWV9SRURJUkVDVE9SUywgb2xkUXVlcnlSZWRpcmVjdG9ycywgbmV3UXVlcnlSZWRpcmVjdG9ycyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFF1ZXJ5UmVkaXJlY3RvcnMgPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UXVlcnlSZWRpcmVjdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1ZXJ5UmVkaXJlY3RvcnMoWG1sUXVlcnlSZWRpcmVjdG9ycyBuZXdRdWVyeVJlZGlyZWN0b3JzKQotCXsKLQkJaWYgKG5ld1F1ZXJ5UmVkaXJlY3RvcnMgIT0gcXVlcnlSZWRpcmVjdG9ycykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocXVlcnlSZWRpcmVjdG9ycyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClxdWVyeVJlZGlyZWN0b3JzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUVVFUllfUkVESVJFQ1RPUlMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1F1ZXJ5UmVkaXJlY3RvcnMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UXVlcnlSZWRpcmVjdG9ycykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1FVRVJZX1JFRElSRUNUT1JTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFF1ZXJ5UmVkaXJlY3RvcnMobmV3UXVlcnlSZWRpcmVjdG9ycywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19RVUVSWV9SRURJUkVDVE9SUywgbmV3UXVlcnlSZWRpcmVjdG9ycywgbmV3UXVlcnlSZWRpcmVjdG9ycykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcmVudCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFyZW50IENsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcmVudCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFyZW50Q2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVHlwZU1hcHBpbmdfMl8xX1BhcmVudENsYXNzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50Q2xhc3MoKQotCXsKLQkJcmV0dXJuIHBhcmVudENsYXNzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQYXJlbnRDbGFzcyA8ZW0+UGFyZW50IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJlbnQgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhcmVudENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50Q2xhc3MoU3RyaW5nIG5ld1BhcmVudENsYXNzKQotCXsKLQkJU3RyaW5nIG9sZFBhcmVudENsYXNzID0gcGFyZW50Q2xhc3M7Ci0JCXBhcmVudENsYXNzID0gbmV3UGFyZW50Q2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BBUkVOVF9DTEFTUywgb2xkUGFyZW50Q2xhc3MsIHBhcmVudENsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQYXJ0aXRpb25pbmcoWG1sUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBhcnRpdGlvbmluZ18yXzIgZ2V0UGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiBwYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UGFydGl0aW9uaW5nKFhtbFBhcnRpdGlvbmluZ18yXzIgbmV3UGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUGFydGl0aW9uaW5nXzJfMiBvbGRQYXJ0aXRpb25pbmcgPSBwYXJ0aXRpb25pbmc7Ci0JCXBhcnRpdGlvbmluZyA9IG5ld1BhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSVElUSU9OSU5HLCBvbGRQYXJ0aXRpb25pbmcsIG5ld1BhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFBhcnRpdGlvbmluZyA8ZW0+UGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnRpdGlvbmluZyhYbWxQYXJ0aXRpb25pbmdfMl8yIG5ld1BhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdQYXJ0aXRpb25pbmcgIT0gcGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBhcnRpdGlvbmluZyhuZXdQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSVElUSU9OSU5HLCBuZXdQYXJ0aXRpb25pbmcsIG5ld1BhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiBvbGRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyA9IHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nOwotCQlyZXBsaWNhdGlvblBhcnRpdGlvbmluZyA9IG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIG9sZFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nIDxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gcmVwbGljYXRpb25QYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9Sb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiBnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiByb3VuZFJvYmluUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIG9sZFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgPSByb3VuZFJvYmluUGFydGl0aW9uaW5nOwotCQlyb3VuZFJvYmluUGFydGl0aW9uaW5nID0gbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HLCBvbGRSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyA8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3Um91bmRSb2JpblBhcnRpdGlvbmluZyAhPSByb3VuZFJvYmluUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJvdW5kUm9iaW5QYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HLCBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQaW5uZWRQYXJ0aXRpb25pbmcoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QaW5uZWRQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiBwaW5uZWRQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UGlubmVkUGFydGl0aW9uaW5nKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgbmV3UGlubmVkUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBvbGRQaW5uZWRQYXJ0aXRpb25pbmcgPSBwaW5uZWRQYXJ0aXRpb25pbmc7Ci0JCXBpbm5lZFBhcnRpdGlvbmluZyA9IG5ld1Bpbm5lZFBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUElOTkVEX1BBUlRJVElPTklORywgb2xkUGlubmVkUGFydGl0aW9uaW5nLCBuZXdQaW5uZWRQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQaW5uZWRQYXJ0aXRpb25pbmcgPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBpbm5lZFBhcnRpdGlvbmluZyhYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIG5ld1Bpbm5lZFBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdQaW5uZWRQYXJ0aXRpb25pbmcgIT0gcGlubmVkUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwaW5uZWRQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcGlubmVkUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUElOTkVEX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UGlubmVkUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Bpbm5lZFBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BJTk5FRF9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UGlubmVkUGFydGl0aW9uaW5nKG5ld1Bpbm5lZFBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QSU5ORURfUEFSVElUSU9OSU5HLCBuZXdQaW5uZWRQYXJ0aXRpb25pbmcsIG5ld1Bpbm5lZFBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJhbmdlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmFuZ2VQYXJ0aXRpb25pbmcoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHJhbmdlUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJhbmdlUGFydGl0aW9uaW5nKFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiBuZXdSYW5nZVBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiBvbGRSYW5nZVBhcnRpdGlvbmluZyA9IHJhbmdlUGFydGl0aW9uaW5nOwotCQlyYW5nZVBhcnRpdGlvbmluZyA9IG5ld1JhbmdlUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SQU5HRV9QQVJUSVRJT05JTkcsIG9sZFJhbmdlUGFydGl0aW9uaW5nLCBuZXdSYW5nZVBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFJhbmdlUGFydGl0aW9uaW5nIDxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSYW5nZVBhcnRpdGlvbmluZyhYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgbmV3UmFuZ2VQYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3UmFuZ2VQYXJ0aXRpb25pbmcgIT0gcmFuZ2VQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJhbmdlUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJhbmdlUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkFOR0VfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSYW5nZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSYW5nZVBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JBTkdFX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSYW5nZVBhcnRpdGlvbmluZyhuZXdSYW5nZVBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SQU5HRV9QQVJUSVRJT05JTkcsIG5ld1JhbmdlUGFydGl0aW9uaW5nLCBuZXdSYW5nZVBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VmFsdWVQYXJ0aXRpb25pbmcoWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1ZhbHVlUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHZhbHVlUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiBuZXdWYWx1ZVBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiBvbGRWYWx1ZVBhcnRpdGlvbmluZyA9IHZhbHVlUGFydGl0aW9uaW5nOwotCQl2YWx1ZVBhcnRpdGlvbmluZyA9IG5ld1ZhbHVlUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19WQUxVRV9QQVJUSVRJT05JTkcsIG9sZFZhbHVlUGFydGl0aW9uaW5nLCBuZXdWYWx1ZVBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFZhbHVlUGFydGl0aW9uaW5nIDxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZVBhcnRpdGlvbmluZyhYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgbmV3VmFsdWVQYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3VmFsdWVQYXJ0aXRpb25pbmcgIT0gdmFsdWVQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHZhbHVlUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXZhbHVlUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVkFMVUVfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdWYWx1ZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdWYWx1ZVBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1ZBTFVFX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRWYWx1ZVBhcnRpdGlvbmluZyhuZXdWYWx1ZVBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19WQUxVRV9QQVJUSVRJT05JTkcsIG5ld1ZhbHVlUGFydGl0aW9uaW5nLCBuZXdWYWx1ZVBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhc2ggUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SGFzaFBhcnRpdGlvbmluZyhYbWxIYXNoUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9IYXNoUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBnZXRIYXNoUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiBoYXNoUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEhhc2hQYXJ0aXRpb25pbmcoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgbmV3SGFzaFBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIG9sZEhhc2hQYXJ0aXRpb25pbmcgPSBoYXNoUGFydGl0aW9uaW5nOwotCQloYXNoUGFydGl0aW9uaW5nID0gbmV3SGFzaFBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSEFTSF9QQVJUSVRJT05JTkcsIG9sZEhhc2hQYXJ0aXRpb25pbmcsIG5ld0hhc2hQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRIYXNoUGFydGl0aW9uaW5nIDxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEhhc2hQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIYXNoUGFydGl0aW9uaW5nKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIG5ld0hhc2hQYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3SGFzaFBhcnRpdGlvbmluZyAhPSBoYXNoUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChoYXNoUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWhhc2hQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19IQVNIX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SGFzaFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdIYXNoUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSEFTSF9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SGFzaFBhcnRpdGlvbmluZyhuZXdIYXNoUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0hBU0hfUEFSVElUSU9OSU5HLCBuZXdIYXNoUGFydGl0aW9uaW5nLCBuZXdIYXNoUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5pb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRVbmlvblBhcnRpdGlvbmluZyhYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfVW5pb25QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiBnZXRVbmlvblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gdW5pb25QYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VW5pb25QYXJ0aXRpb25pbmcoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIG5ld1VuaW9uUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIG9sZFVuaW9uUGFydGl0aW9uaW5nID0gdW5pb25QYXJ0aXRpb25pbmc7Ci0JCXVuaW9uUGFydGl0aW9uaW5nID0gbmV3VW5pb25QYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1VOSU9OX1BBUlRJVElPTklORywgb2xkVW5pb25QYXJ0aXRpb25pbmcsIG5ld1VuaW9uUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0VW5pb25QYXJ0aXRpb25pbmcgPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRVbmlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuaW9uUGFydGl0aW9uaW5nKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiBuZXdVbmlvblBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdVbmlvblBhcnRpdGlvbmluZyAhPSB1bmlvblBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodW5pb25QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdW5pb25QYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19VTklPTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1VuaW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1VuaW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVU5JT05fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFVuaW9uUGFydGl0aW9uaW5nKG5ld1VuaW9uUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1VOSU9OX1BBUlRJVElPTklORywgbmV3VW5pb25QYXJ0aXRpb25pbmcsIG5ld1VuaW9uUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFydGl0aW9uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJ0aXRpb25lZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGFydGl0aW9uZWQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25lZCgpCi0JewotCQlyZXR1cm4gcGFydGl0aW9uZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFBhcnRpdGlvbmVkIDxlbT5QYXJ0aXRpb25lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFydGl0aW9uZWQoU3RyaW5nIG5ld1BhcnRpdGlvbmVkKQotCXsKLQkJU3RyaW5nIG9sZFBhcnRpdGlvbmVkID0gcGFydGl0aW9uZWQ7Ci0JCXBhcnRpdGlvbmVkID0gbmV3UGFydGl0aW9uZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BBUlRJVElPTkVELCBvbGRQYXJ0aXRpb25lZCwgcGFydGl0aW9uZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsIENyaXRlcmlhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsIENyaXRlcmlhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFkZGl0aW9uYWxDcml0ZXJpYShYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzJfQWRkaXRpb25hbENyaXRlcmlhKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yIGdldEFkZGl0aW9uYWxDcml0ZXJpYSgpCi0JewotCQlyZXR1cm4gYWRkaXRpb25hbENyaXRlcmlhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFkZGl0aW9uYWxDcml0ZXJpYShYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yIG5ld0FkZGl0aW9uYWxDcml0ZXJpYSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIgb2xkQWRkaXRpb25hbENyaXRlcmlhID0gYWRkaXRpb25hbENyaXRlcmlhOwotCQlhZGRpdGlvbmFsQ3JpdGVyaWEgPSBuZXdBZGRpdGlvbmFsQ3JpdGVyaWE7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FERElUSU9OQUxfQ1JJVEVSSUEsIG9sZEFkZGl0aW9uYWxDcml0ZXJpYSwgbmV3QWRkaXRpb25hbENyaXRlcmlhKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0QWRkaXRpb25hbENyaXRlcmlhIDxlbT5BZGRpdGlvbmFsIENyaXRlcmlhPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsIENyaXRlcmlhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsQ3JpdGVyaWEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsQ3JpdGVyaWEoWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMiBuZXdBZGRpdGlvbmFsQ3JpdGVyaWEpCi0JewotCQlpZiAobmV3QWRkaXRpb25hbENyaXRlcmlhICE9IGFkZGl0aW9uYWxDcml0ZXJpYSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWRkaXRpb25hbENyaXRlcmlhICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFkZGl0aW9uYWxDcml0ZXJpYSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FERElUSU9OQUxfQ1JJVEVSSUEsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FkZGl0aW9uYWxDcml0ZXJpYSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBZGRpdGlvbmFsQ3JpdGVyaWEpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BRERJVElPTkFMX0NSSVRFUklBLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFkZGl0aW9uYWxDcml0ZXJpYShuZXdBZGRpdGlvbmFsQ3JpdGVyaWEsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQURESVRJT05BTF9DUklURVJJQSwgbmV3QWRkaXRpb25hbENyaXRlcmlhLCBuZXdBZGRpdGlvbmFsQ3JpdGVyaWEpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NdWx0aXRlbmFudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TXVsdGl0ZW5hbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TXVsdGl0ZW5hbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE11bHRpdGVuYW50KFhtbE11bHRpdGVuYW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTXVsdGl0ZW5hbnRIb2xkZXJfTXVsdGl0ZW5hbnQoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE11bHRpdGVuYW50IGdldE11bHRpdGVuYW50KCkKLQl7Ci0JCXJldHVybiBtdWx0aXRlbmFudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNdWx0aXRlbmFudChYbWxNdWx0aXRlbmFudCBuZXdNdWx0aXRlbmFudCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbE11bHRpdGVuYW50IG9sZE11bHRpdGVuYW50ID0gbXVsdGl0ZW5hbnQ7Ci0JCW11bHRpdGVuYW50ID0gbmV3TXVsdGl0ZW5hbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX01VTFRJVEVOQU5ULCBvbGRNdWx0aXRlbmFudCwgbmV3TXVsdGl0ZW5hbnQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRNdWx0aXRlbmFudCA8ZW0+TXVsdGl0ZW5hbnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk11bHRpdGVuYW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNdWx0aXRlbmFudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE11bHRpdGVuYW50KFhtbE11bHRpdGVuYW50IG5ld011bHRpdGVuYW50KQotCXsKLQkJaWYgKG5ld011bHRpdGVuYW50ICE9IG11bHRpdGVuYW50KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChtdWx0aXRlbmFudCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCltdWx0aXRlbmFudCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX01VTFRJVEVOQU5ULCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdNdWx0aXRlbmFudCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdNdWx0aXRlbmFudCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX01VTFRJVEVOQU5ULCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE11bHRpdGVuYW50KG5ld011bHRpdGVuYW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX01VTFRJVEVOQU5ULCBuZXdNdWx0aXRlbmFudCwgbmV3TXVsdGl0ZW5hbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVkIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZWQgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfM19OYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMz4gZ2V0TmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKQotCXsKLQkJaWYgKG5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyaWVzID09IG51bGwpCi0JCXsKLQkJCW5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyaWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM+KFhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTKTsKLQkJfQotCQlyZXR1cm4gbmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZWQgUGxzcWwgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVkIFBsc3FsIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZWQgUGxzcWwgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfM19OYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM+IGdldE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKQotCXsKLQkJaWYgKG5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMgPT0gbnVsbCkKLQkJewotCQkJbmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM+KFhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMy5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfUExTUUxfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVMpOwotCQl9Ci0JCXJldHVybiBuYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVkIFBsc3FsIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVkIFBsc3FsIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVkIFBsc3FsIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zX05hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zPiBnZXROYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCi0JewotCQlpZiAobmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgPT0gbnVsbCkKLQkJewotCQkJbmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfMz4oWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfMy5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTKTsKLQkJfQotCQlyZXR1cm4gbmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGxzcWwgUmVjb3JkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxQbHNxbFJlY29yZF8yXzN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGxzcWwgUmVjb3JkczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBsc3FsIFJlY29yZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfM19QbHNxbFJlY29yZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFBsc3FsUmVjb3JkXzJfMz4gZ2V0UGxzcWxSZWNvcmRzKCkKLQl7Ci0JCWlmIChwbHNxbFJlY29yZHMgPT0gbnVsbCkKLQkJewotCQkJcGxzcWxSZWNvcmRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFBsc3FsUmVjb3JkXzJfMz4oWG1sUGxzcWxSZWNvcmRfMl8zLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QTFNRTF9SRUNPUkRTKTsKLQkJfQotCQlyZXR1cm4gcGxzcWxSZWNvcmRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBsc3FsIFRhYmxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGxzcWxUYWJsZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QbHNxbCBUYWJsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QbHNxbCBUYWJsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfM19QbHNxbFRhYmxlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUGxzcWxUYWJsZT4gZ2V0UGxzcWxUYWJsZXMoKQotCXsKLQkJaWYgKHBsc3FsVGFibGVzID09IG51bGwpCi0JCXsKLQkJCXBsc3FsVGFibGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFBsc3FsVGFibGU+KFhtbFBsc3FsVGFibGUuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BMU1FMX1RBQkxFUyk7Ci0JCX0KLQkJcmV0dXJuIHBsc3FsVGFibGVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhY2hlIEluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYWNoZSBJbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZSBJbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2FjaGVJbmRleChYbWxDYWNoZUluZGV4XzJfNCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl80X0NhY2hlSW5kZXgoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENhY2hlSW5kZXhfMl80IGdldENhY2hlSW5kZXgoKQotCXsKLQkJcmV0dXJuIGNhY2hlSW5kZXg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2FjaGVJbmRleChYbWxDYWNoZUluZGV4XzJfNCBuZXdDYWNoZUluZGV4LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ2FjaGVJbmRleF8yXzQgb2xkQ2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7Ci0JCWNhY2hlSW5kZXggPSBuZXdDYWNoZUluZGV4OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRV9JTkRFWCwgb2xkQ2FjaGVJbmRleCwgbmV3Q2FjaGVJbmRleCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldENhY2hlSW5kZXggPGVtPkNhY2hlIEluZGV4PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZSBJbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2FjaGVJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhY2hlSW5kZXgoWG1sQ2FjaGVJbmRleF8yXzQgbmV3Q2FjaGVJbmRleCkKLQl7Ci0JCWlmIChuZXdDYWNoZUluZGV4ICE9IGNhY2hlSW5kZXgpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNhY2hlSW5kZXggIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY2FjaGVJbmRleCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFX0lOREVYLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDYWNoZUluZGV4ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NhY2hlSW5kZXgpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRV9JTkRFWCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDYWNoZUluZGV4KG5ld0NhY2hlSW5kZXgsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVfSU5ERVgsIG5ld0NhY2hlSW5kZXgsIG5ld0NhY2hlSW5kZXgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JewotCQlyZXR1cm4gZXhjbHVkZURlZmF1bHRNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKEJvb2xlYW4gbmV3RXhjbHVkZURlZmF1bHRNYXBwaW5ncykKLQl7Ci0JCUJvb2xlYW4gb2xkRXhjbHVkZURlZmF1bHRNYXBwaW5ncyA9IGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3M7Ci0JCWV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPSBuZXdFeGNsdWRlRGVmYXVsdE1hcHBpbmdzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MsIG9sZEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MsIGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJJTUFSWV9LRVk6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UHJpbWFyeUtleShudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVfSU5URVJDRVBUT1I6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q2FjaGVJbnRlcmNlcHRvcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRkVUQ0hfR1JPVVBTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RmV0Y2hHcm91cHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TRVFVRU5DRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U2VxdWVuY2VHZW5lcmF0b3IobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1RBQkxFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRUYWJsZUdlbmVyYXRvcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfUVVFUklFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE5hbWVkUXVlcmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX05BVElWRV9RVUVSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1FVRVJZX1JFRElSRUNUT1JTOgotCQkJCXJldHVybiBiYXNpY1NldFF1ZXJ5UmVkaXJlY3RvcnMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UGlubmVkUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UmFuZ2VQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRWYWx1ZVBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SGFzaFBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFVuaW9uUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BRERJVElPTkFMX0NSSVRFUklBOgotCQkJCXJldHVybiBiYXNpY1NldEFkZGl0aW9uYWxDcml0ZXJpYShudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTVVMVElURU5BTlQ6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TXVsdGl0ZW5hbnQobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9QTFNRTF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXROYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BMU1FMX1JFQ09SRFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQbHNxbFJlY29yZHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QTFNRTF9UQUJMRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQbHNxbFRhYmxlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFX0lOREVYOgotCQkJCXJldHVybiBiYXNpY1NldENhY2hlSW5kZXgobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NVU1RPTUlaRVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q3VzdG9taXplcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0hBTkdFX1RSQUNLSU5HOgotCQkJCXJldHVybiBiYXNpY1NldENoYW5nZVRyYWNraW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRDYWNoZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRUeXBlQ29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRPYmplY3RUeXBlQ29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3RydWN0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT1BUSU1JU1RJQ19MT0NLSU5HOgotCQkJCXJldHVybiBiYXNpY1NldE9wdGltaXN0aWNMb2NraW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRDb3B5UG9saWN5KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBiYXNpY1NldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTE9ORV9DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRDbG9uZUNvcHlQb2xpY3kobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QQVJFTlRfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldFBhcmVudENsYXNzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSSU1BUllfS0VZOgotCQkJCXJldHVybiBnZXRQcmltYXJ5S2V5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFQUJMRToKLQkJCQlyZXR1cm4gZ2V0Q2FjaGVhYmxlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFX0lOVEVSQ0VQVE9SOgotCQkJCXJldHVybiBnZXRDYWNoZUludGVyY2VwdG9yKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0ZFVENIX0dST1VQUzoKLQkJCQlyZXR1cm4gZ2V0RmV0Y2hHcm91cHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU0VRVUVOQ0VfR0VORVJBVE9SOgotCQkJCXJldHVybiBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIGdldFRhYmxlR2VuZXJhdG9yKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIGdldE5hbWVkUXVlcmllcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9OQVRJVkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOgotCQkJCXJldHVybiBnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19RVUVSWV9SRURJUkVDVE9SUzoKLQkJCQlyZXR1cm4gZ2V0UXVlcnlSZWRpcmVjdG9ycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRSYW5nZVBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19WQUxVRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFZhbHVlUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRIYXNoUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0VW5pb25QYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSVElUSU9ORUQ6Ci0JCQkJcmV0dXJuIGdldFBhcnRpdGlvbmVkKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FERElUSU9OQUxfQ1JJVEVSSUE6Ci0JCQkJcmV0dXJuIGdldEFkZGl0aW9uYWxDcml0ZXJpYSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19NVUxUSVRFTkFOVDoKLQkJCQlyZXR1cm4gZ2V0TXVsdGl0ZW5hbnQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIGdldE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTOgotCQkJCXJldHVybiBnZXROYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gZ2V0TmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUExTUUxfUkVDT1JEUzoKLQkJCQlyZXR1cm4gZ2V0UGxzcWxSZWNvcmRzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BMU1FMX1RBQkxFUzoKLQkJCQlyZXR1cm4gZ2V0UGxzcWxUYWJsZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVfSU5ERVg6Ci0JCQkJcmV0dXJuIGdldENhY2hlSW5kZXgoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVBRF9PTkxZOgotCQkJCXJldHVybiBnZXRSZWFkT25seSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DVVNUT01JWkVSOgotCQkJCXJldHVybiBnZXRDdXN0b21pemVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NIQU5HRV9UUkFDS0lORzoKLQkJCQlyZXR1cm4gZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEU6Ci0JCQkJcmV0dXJuIGdldENhY2hlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYSVNURU5DRV9DSEVDS0lORzoKLQkJCQlyZXR1cm4gZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0Q29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT1BUSU1JU1RJQ19MT0NLSU5HOgotCQkJCXJldHVybiBnZXRPcHRpbWlzdGljTG9ja2luZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gZ2V0Q29weVBvbGljeSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTE9ORV9DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gZ2V0Q2xvbmVDb3B5UG9saWN5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QQVJFTlRfQ0xBU1M6Ci0JCQkJc2V0UGFyZW50Q2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUklNQVJZX0tFWToKLQkJCQlzZXRQcmltYXJ5S2V5KChYbWxQcmltYXJ5S2V5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFQUJMRToKLQkJCQlzZXRDYWNoZWFibGUoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVfSU5URVJDRVBUT1I6Ci0JCQkJc2V0Q2FjaGVJbnRlcmNlcHRvcigoWG1sQ2xhc3NSZWZlcmVuY2UpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCWdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQXNzb2NpYXRpb25PdmVycmlkZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCWdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQXR0cmlidXRlT3ZlcnJpZGU+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0ZFVENIX0dST1VQUzoKLQkJCQlnZXRGZXRjaEdyb3VwcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RmV0Y2hHcm91cHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEZldGNoR3JvdXA+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlzZXRTZXF1ZW5jZUdlbmVyYXRvcigoWG1sU2VxdWVuY2VHZW5lcmF0b3IpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVEFCTEVfR0VORVJBVE9SOgotCQkJCXNldFRhYmxlR2VuZXJhdG9yKChYbWxUYWJsZUdlbmVyYXRvciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9RVUVSSUVTOgotCQkJCWdldE5hbWVkUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TmFtZWRRdWVyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxOYW1lZFF1ZXJ5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9OQVRJVkVfUVVFUklFUzoKLQkJCQlnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCWdldE5hbWVkTmF0aXZlUXVlcmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sTmFtZWROYXRpdmVRdWVyeT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOgotCQkJCWdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzoKLQkJCQlnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNxbFJlc3VsdFNldE1hcHBpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1FVRVJZX1JFRElSRUNUT1JTOgotCQkJCXNldFF1ZXJ5UmVkaXJlY3RvcnMoKFhtbFF1ZXJ5UmVkaXJlY3RvcnMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSVElUSU9OSU5HOgotCQkJCXNldFBhcnRpdGlvbmluZygoWG1sUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlzZXRQaW5uZWRQYXJ0aXRpb25pbmcoKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXNldFJhbmdlUGFydGl0aW9uaW5nKChYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXNldFZhbHVlUGFydGl0aW9uaW5nKChYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0SGFzaFBhcnRpdGlvbmluZygoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFVuaW9uUGFydGl0aW9uaW5nKChYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSVElUSU9ORUQ6Ci0JCQkJc2V0UGFydGl0aW9uZWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BRERJVElPTkFMX0NSSVRFUklBOgotCQkJCXNldEFkZGl0aW9uYWxDcml0ZXJpYSgoWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19NVUxUSVRFTkFOVDoKLQkJCQlzZXRNdWx0aXRlbmFudCgoWG1sTXVsdGl0ZW5hbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVM6Ci0JCQkJZ2V0TmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCWdldE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzoKLQkJCQlnZXROYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkuY2xlYXIoKTsKLQkJCQlnZXROYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlnZXROYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzM+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BMU1FMX1JFQ09SRFM6Ci0JCQkJZ2V0UGxzcWxSZWNvcmRzKCkuY2xlYXIoKTsKLQkJCQlnZXRQbHNxbFJlY29yZHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFBsc3FsUmVjb3JkXzJfMz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUExTUUxfVEFCTEVTOgotCQkJCWdldFBsc3FsVGFibGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQbHNxbFRhYmxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUGxzcWxUYWJsZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVfSU5ERVg6Ci0JCQkJc2V0Q2FjaGVJbmRleCgoWG1sQ2FjaGVJbmRleF8yXzQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVBRF9PTkxZOgotCQkJCXNldFJlYWRPbmx5KChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NVU1RPTUlaRVI6Ci0JCQkJc2V0Q3VzdG9taXplcigoWG1sQ2xhc3NSZWZlcmVuY2UpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0hBTkdFX1RSQUNLSU5HOgotCQkJCXNldENoYW5nZVRyYWNraW5nKChYbWxDaGFuZ2VUcmFja2luZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRToKLQkJCQlzZXRDYWNoZSgoWG1sQ2FjaGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhJU1RFTkNFX0NIRUNLSU5HOgotCQkJCXNldEV4aXN0ZW5jZUNoZWNraW5nKChFeGlzdGVuY2VUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQ29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxUeXBlQ29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sU3RydWN0Q29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PUFRJTUlTVElDX0xPQ0tJTkc6Ci0JCQkJc2V0T3B0aW1pc3RpY0xvY2tpbmcoKFhtbE9wdGltaXN0aWNMb2NraW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPUFlfUE9MSUNZOgotCQkJCXNldENvcHlQb2xpY3koKFhtbENvcHlQb2xpY3kpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWToKLQkJCQlzZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgoWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0xPTkVfQ09QWV9QT0xJQ1k6Ci0JCQkJc2V0Q2xvbmVDb3B5UG9saWN5KChYbWxDbG9uZUNvcHlQb2xpY3kpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTOgotCQkJCXNldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BBUkVOVF9DTEFTUzoKLQkJCQlzZXRQYXJlbnRDbGFzcyhQQVJFTlRfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJJTUFSWV9LRVk6Ci0JCQkJc2V0UHJpbWFyeUtleSgoWG1sUHJpbWFyeUtleSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFQUJMRToKLQkJCQlzZXRDYWNoZWFibGUoQ0FDSEVBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFX0lOVEVSQ0VQVE9SOgotCQkJCXNldENhY2hlSW50ZXJjZXB0b3IoKFhtbENsYXNzUmVmZXJlbmNlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCWdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0ZFVENIX0dST1VQUzoKLQkJCQlnZXRGZXRjaEdyb3VwcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TRVFVRU5DRV9HRU5FUkFUT1I6Ci0JCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IoKFhtbFNlcXVlbmNlR2VuZXJhdG9yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVEFCTEVfR0VORVJBVE9SOgotCQkJCXNldFRhYmxlR2VuZXJhdG9yKChYbWxUYWJsZUdlbmVyYXRvciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1FVRVJJRVM6Ci0JCQkJZ2V0TmFtZWRRdWVyaWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX05BVElWRV9RVUVSSUVTOgotCQkJCWdldE5hbWVkTmF0aXZlUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6Ci0JCQkJZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOgotCQkJCWdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1FVRVJZX1JFRElSRUNUT1JTOgotCQkJCXNldFF1ZXJ5UmVkaXJlY3RvcnMoKFhtbFF1ZXJ5UmVkaXJlY3RvcnMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UGFydGl0aW9uaW5nKChYbWxQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKChYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXNldFBpbm5lZFBhcnRpdGlvbmluZygoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlzZXRSYW5nZVBhcnRpdGlvbmluZygoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXNldFZhbHVlUGFydGl0aW9uaW5nKChYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlzZXRIYXNoUGFydGl0aW9uaW5nKChYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlzZXRVbmlvblBhcnRpdGlvbmluZygoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSVElUSU9ORUQ6Ci0JCQkJc2V0UGFydGl0aW9uZWQoUEFSVElUSU9ORURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQURESVRJT05BTF9DUklURVJJQToKLQkJCQlzZXRBZGRpdGlvbmFsQ3JpdGVyaWEoKFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19NVUxUSVRFTkFOVDoKLQkJCQlzZXRNdWx0aXRlbmFudCgoWG1sTXVsdGl0ZW5hbnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzoKLQkJCQlnZXROYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzoKLQkJCQlnZXROYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlnZXROYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QTFNRTF9SRUNPUkRTOgotCQkJCWdldFBsc3FsUmVjb3JkcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QTFNRTF9UQUJMRVM6Ci0JCQkJZ2V0UGxzcWxUYWJsZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVfSU5ERVg6Ci0JCQkJc2V0Q2FjaGVJbmRleCgoWG1sQ2FjaGVJbmRleF8yXzQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRUFEX09OTFk6Ci0JCQkJc2V0UmVhZE9ubHkoUkVBRF9PTkxZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NVU1RPTUlaRVI6Ci0JCQkJc2V0Q3VzdG9taXplcigoWG1sQ2xhc3NSZWZlcmVuY2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DSEFOR0VfVFJBQ0tJTkc6Ci0JCQkJc2V0Q2hhbmdlVHJhY2tpbmcoKFhtbENoYW5nZVRyYWNraW5nKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEU6Ci0JCQkJc2V0Q2FjaGUoKFhtbENhY2hlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhJU1RFTkNFX0NIRUNLSU5HOgotCQkJCXNldEV4aXN0ZW5jZUNoZWNraW5nKEVYSVNURU5DRV9DSEVDS0lOR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT05WRVJURVJTOgotCQkJCWdldENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT1BUSU1JU1RJQ19MT0NLSU5HOgotCQkJCXNldE9wdGltaXN0aWNMb2NraW5nKChYbWxPcHRpbWlzdGljTG9ja2luZyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPUFlfUE9MSUNZOgotCQkJCXNldENvcHlQb2xpY3koKFhtbENvcHlQb2xpY3kpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgotCQkJCXNldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KChYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMT05FX0NPUFlfUE9MSUNZOgotCQkJCXNldENsb25lQ29weVBvbGljeSgoWG1sQ2xvbmVDb3B5UG9saWN5KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTOgotCQkJCXNldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QQVJFTlRfQ0xBU1M6Ci0JCQkJcmV0dXJuIFBBUkVOVF9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gcGFyZW50Q2xhc3MgIT0gbnVsbCA6ICFQQVJFTlRfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKHBhcmVudENsYXNzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJJTUFSWV9LRVk6Ci0JCQkJcmV0dXJuIHByaW1hcnlLZXkgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVBQkxFOgotCQkJCXJldHVybiBDQUNIRUFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IGNhY2hlYWJsZSAhPSBudWxsIDogIUNBQ0hFQUJMRV9FREVGQVVMVC5lcXVhbHMoY2FjaGVhYmxlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVfSU5URVJDRVBUT1I6Ci0JCQkJcmV0dXJuIGNhY2hlSW50ZXJjZXB0b3IgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCXJldHVybiBhc3NvY2lhdGlvbk92ZXJyaWRlcyAhPSBudWxsICYmICFhc3NvY2lhdGlvbk92ZXJyaWRlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZU92ZXJyaWRlcyAhPSBudWxsICYmICFhdHRyaWJ1dGVPdmVycmlkZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19GRVRDSF9HUk9VUFM6Ci0JCQkJcmV0dXJuIGZldGNoR3JvdXBzICE9IG51bGwgJiYgIWZldGNoR3JvdXBzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU0VRVUVOQ0VfR0VORVJBVE9SOgotCQkJCXJldHVybiBzZXF1ZW5jZUdlbmVyYXRvciAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9yICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIG5hbWVkUXVlcmllcyAhPSBudWxsICYmICFuYW1lZFF1ZXJpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9OQVRJVkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gbmFtZWROYXRpdmVRdWVyaWVzICE9IG51bGwgJiYgIW5hbWVkTmF0aXZlUXVlcmllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gbmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzICE9IG51bGwgJiYgIW5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOgotCQkJCXJldHVybiBzcWxSZXN1bHRTZXRNYXBwaW5ncyAhPSBudWxsICYmICFzcWxSZXN1bHRTZXRNYXBwaW5ncy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1FVRVJZX1JFRElSRUNUT1JTOgotCQkJCXJldHVybiBxdWVyeVJlZGlyZWN0b3JzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiByb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHBpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHJhbmdlUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gdmFsdWVQYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGhhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiB1bmlvblBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QQVJUSVRJT05FRDoKLQkJCQlyZXR1cm4gUEFSVElUSU9ORURfRURFRkFVTFQgPT0gbnVsbCA/IHBhcnRpdGlvbmVkICE9IG51bGwgOiAhUEFSVElUSU9ORURfRURFRkFVTFQuZXF1YWxzKHBhcnRpdGlvbmVkKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQURESVRJT05BTF9DUklURVJJQToKLQkJCQlyZXR1cm4gYWRkaXRpb25hbENyaXRlcmlhICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX01VTFRJVEVOQU5UOgotCQkJCXJldHVybiBtdWx0aXRlbmFudCAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzoKLQkJCQlyZXR1cm4gbmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMgIT0gbnVsbCAmJiAhbmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzoKLQkJCQlyZXR1cm4gbmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcyAhPSBudWxsICYmICFuYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOgotCQkJCXJldHVybiBuYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcyAhPSBudWxsICYmICFuYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BMU1FMX1JFQ09SRFM6Ci0JCQkJcmV0dXJuIHBsc3FsUmVjb3JkcyAhPSBudWxsICYmICFwbHNxbFJlY29yZHMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QTFNRTF9UQUJMRVM6Ci0JCQkJcmV0dXJuIHBsc3FsVGFibGVzICE9IG51bGwgJiYgIXBsc3FsVGFibGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVfSU5ERVg6Ci0JCQkJcmV0dXJuIGNhY2hlSW5kZXggIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVBRF9PTkxZOgotCQkJCXJldHVybiBSRUFEX09OTFlfRURFRkFVTFQgPT0gbnVsbCA/IHJlYWRPbmx5ICE9IG51bGwgOiAhUkVBRF9PTkxZX0VERUZBVUxULmVxdWFscyhyZWFkT25seSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NVU1RPTUlaRVI6Ci0JCQkJcmV0dXJuIGN1c3RvbWl6ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0hBTkdFX1RSQUNLSU5HOgotCQkJCXJldHVybiBjaGFuZ2VUcmFja2luZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRToKLQkJCQlyZXR1cm4gY2FjaGUgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhJU1RFTkNFX0NIRUNLSU5HOgotCQkJCXJldHVybiBleGlzdGVuY2VDaGVja2luZyAhPSBFWElTVEVOQ0VfQ0hFQ0tJTkdfRURFRkFVTFQ7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhY29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gdHlwZUNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhdHlwZUNvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVycyAhPSBudWxsICYmICFvYmplY3RUeXBlQ29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXN0cnVjdENvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PUFRJTUlTVElDX0xPQ0tJTkc6Ci0JCQkJcmV0dXJuIG9wdGltaXN0aWNMb2NraW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBjb3B5UG9saWN5ICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGluc3RhbnRpYXRpb25Db3B5UG9saWN5ICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMT05FX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBjbG9uZUNvcHlQb2xpY3kgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTOgotCQkJCXJldHVybiBFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQgPT0gbnVsbCA/IGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgIT0gbnVsbCA6ICFFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQuZXF1YWxzKGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxUeXBlTWFwcGluZ18yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BBUkVOVF9DTEFTUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX1RZUEVfTUFQUElOR18yMV9fUEFSRU5UX0NMQVNTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFR5cGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSSU1BUllfS0VZOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMTFfX1BSSU1BUllfS0VZOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENhY2hlYWJsZV8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFQUJMRTogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9DQUNIRUFCTEVfMjBfX0NBQ0hFQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVfSU5URVJDRVBUT1I6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU18yMF9fQ0FDSEVfSU5URVJDRVBUT1I7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQVNTT0NJQVRJT05fT1ZFUlJJREVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX19BU1NPQ0lBVElPTl9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FUVFJJQlVURV9PVkVSUklERVM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09OVEFJTkVSX19BVFRSSUJVVEVfT1ZFUlJJREVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19GRVRDSF9HUk9VUFM6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF9DT05UQUlORVJfMjFfX0ZFVENIX0dST1VQUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxHZW5lcmF0b3JDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NFUVVFTkNFX0dFTkVSQVRPUjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1NFUVVFTkNFX0dFTkVSQVRPUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1RBQkxFX0dFTkVSQVRPUjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1RBQkxFX0dFTkVSQVRPUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxRdWVyeUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfUVVFUklFUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfUVVFUklFUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX05BVElWRV9RVUVSSUVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9OQVRJVkVfUVVFUklFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1FVRVJZX1JFRElSRUNUT1JTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX1FVRVJZX1JFRElSRUNUT1JTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUElOTkVEX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JBTkdFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkFOR0VfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVkFMVUVfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19IQVNIX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fSEFTSF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19VTklPTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1VOSU9OX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BBUlRJVElPTkVEOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQURESVRJT05BTF9DUklURVJJQTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIyX19BRERJVElPTkFMX0NSSVRFUklBOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE11bHRpdGVuYW50SG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19NVUxUSVRFTkFOVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTVVMVElURU5BTlRfSE9MREVSX19NVUxUSVRFTkFOVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU18yM19fTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIzX19OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIzX19OQU1FRF9QTFNRTF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QTFNRTF9SRUNPUkRTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjNfX1BMU1FMX1JFQ09SRFM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QTFNRTF9UQUJMRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU18yM19fUExTUUxfVEFCTEVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcHBlZFN1cGVyY2xhc3NfMl80LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRV9JTkRFWDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTXzI0X19DQUNIRV9JTkRFWDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxSZWFkT25seS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVBRF9PTkxZOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9SRUFEX09OTFlfX1JFQURfT05MWTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDdXN0b21pemVySG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DVVNUT01JWkVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DVVNUT01JWkVSX0hPTERFUl9fQ1VTVE9NSVpFUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDaGFuZ2VUcmFja2luZ0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0hBTkdFX1RSQUNLSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DSEFOR0VfVFJBQ0tJTkdfSE9MREVSX19DSEFOR0VfVFJBQ0tJTkc7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ2FjaGVIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9IT0xERVJfX0NBQ0hFOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhJU1RFTkNFX0NIRUNLSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9IT0xERVJfX0VYSVNURU5DRV9DSEVDS0lORzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TVFJVQ1RfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fU1RSVUNUX0NPTlZFUlRFUlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFR5cGVNYXBwaW5nXzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfVFlQRV9NQVBQSU5HXzIxX19QQVJFTlRfQ0xBU1M6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QQVJFTlRfQ0xBU1M7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sVHlwZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMTFfX1BSSU1BUllfS0VZOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJJTUFSWV9LRVk7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ2FjaGVhYmxlXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX0NBQ0hFQUJMRV8yMF9fQ0FDSEVBQkxFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVBQkxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU18yMF9fQ0FDSEVfSU5URVJDRVBUT1I6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRV9JTlRFUkNFUFRPUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfX0FTU09DSUFUSU9OX09WRVJSSURFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FTU09DSUFUSU9OX09WRVJSSURFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX0NPTlRBSU5FUl9fQVRUUklCVVRFX09WRVJSSURFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FUVFJJQlVURV9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQX0NPTlRBSU5FUl8yMV9fRkVUQ0hfR1JPVVBTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRkVUQ0hfR1JPVVBTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEdlbmVyYXRvckNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9fU0VRVUVOQ0VfR0VORVJBVE9SOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU0VRVUVOQ0VfR0VORVJBVE9SOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9fVEFCTEVfR0VORVJBVE9SOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVEFCTEVfR0VORVJBVE9SOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFF1ZXJ5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9RVUVSWV9DT05UQUlORVJfX05BTUVEX1FVRVJJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9RVUVSSUVTOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9OQVRJVkVfUVVFUklFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX05BVElWRV9RVUVSSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX1FVRVJZX1JFRElSRUNUT1JTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUVVFUllfUkVESVJFQ1RPUlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QSU5ORURfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SQU5HRV9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1ZBTFVFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1ZBTFVFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fSEFTSF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19IQVNIX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVU5JT05fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVU5JT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BBUlRJVElPTkVEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU18yMl9fQURESVRJT05BTF9DUklURVJJQTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FERElUSU9OQUxfQ1JJVEVSSUE7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTXVsdGl0ZW5hbnRIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTVVMVElURU5BTlRfSE9MREVSX19NVUxUSVRFTkFOVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX01VTFRJVEVOQU5UOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU18yM19fTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIzX19OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjNfX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIzX19QTFNRTF9SRUNPUkRTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUExTUUxfUkVDT1JEUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIzX19QTFNRTF9UQUJMRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QTFNRTF9UQUJMRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwcGVkU3VwZXJjbGFzc18yXzQuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTXzI0X19DQUNIRV9JTkRFWDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFX0lOREVYOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFJlYWRPbmx5LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JFQURfT05MWV9fUkVBRF9PTkxZOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVBRF9PTkxZOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEN1c3RvbWl6ZXJIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ1VTVE9NSVpFUl9IT0xERVJfX0NVU1RPTUlaRVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DVVNUT01JWkVSOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENoYW5nZVRyYWNraW5nSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NIQU5HRV9UUkFDS0lOR19IT0xERVJfX0NIQU5HRV9UUkFDS0lORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NIQU5HRV9UUkFDS0lORzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDYWNoZUhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9IT0xERVJfX0NBQ0hFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEU7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX0hPTERFUl9fRVhJU1RFTkNFX0NIRUNLSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhJU1RFTkNFX0NIRUNLSU5HOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fU1RSVUNUX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TVFJVQ1RfQ09OVkVSVEVSUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocGFyZW50Q2xhc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcmVudENsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYWNoZWFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhY2hlYWJsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFydGl0aW9uZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcnRpdGlvbmVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZWFkT25seTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVhZE9ubHkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4aXN0ZW5jZUNoZWNraW5nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleGlzdGVuY2VDaGVja2luZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXhjbHVkZURlZmF1bHRNYXBwaW5nczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXhjbHVkZURlZmF1bHRNYXBwaW5ncyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVhZE9ubHlUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuUkVBRF9PTkxZKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRDYWNoZWFibGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRQYXJlbnRDbGFzc1RleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShFY2xpcHNlTGluazJfMS5QQVJFTlRfQ0xBU1MpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkQ2xhc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZFBhcmVudENsYXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhY2hlYWJsZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWV0YWRhdGFDb21wbGV0ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUmVhZE9ubHlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEV4aXN0ZW5jZUNoZWNraW5nVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzVHJhbnNsYXRvcigpLAotCQkJYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSwKLQkJICAgIFhtbE11bHRpdGVuYW50LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMy5NVUxUSVRFTkFOVCwgIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTXVsdGl0ZW5hbnRIb2xkZXJfTXVsdGl0ZW5hbnQoKSksCi0JCSAgICBidWlsZEFkZGl0aW9uYWxDcml0ZXJpYVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ3VzdG9taXplclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2hhbmdlVHJhY2tpbmdUcmFuc2xhdG9yKCksCi0JCQlidWlsZElkQ2xhc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByaW1hcnlLZXlUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9wdGltaXN0aWNMb2NraW5nVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYWNoZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2FjaGVJbnRlcmNlcHRvclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2FjaGVJbmRleFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRmV0Y2hHcm91cHNUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU3RydWN0Q29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb3B5UG9saWN5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRJbnN0YW50aWF0aW9uQ295cFBvbGljeVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2xvbmVDb3B5UG9saWN5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRTZXF1ZW5jZUdlbmVyYXRvclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVGFibGVHZW5lcmF0b3JUcmFuc2xhdG9yKCksCi0JCQlidWlsZE5hbWVkUXVlcnlUcmFuc2xhdG9yKCksCi0JCQlidWlsZE5hbWVkTmF0aXZlUXVlcnlUcmFuc2xhdG9yKCksCi0JCQlidWlsZE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlUcmFuc2xhdG9yKCksCi0JCQlYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8zLk5BTUVEX1NUT1JFRF9GVU5DVElPTl9RVUVSWSwgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzNfTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKSksCi0JCQlYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8zLk5BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUlksIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zX05hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkpLAotCQkJWG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8zLk5BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSWSwgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzNfTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpKSwKLQkJCVhtbFBsc3FsUmVjb3JkLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMy5QTFNRTF9SRUNPUkQsIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zX1Bsc3FsUmVjb3JkcygpKSwKLQkJCVhtbFBsc3FsVGFibGUuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8zLlBMU1FMX1RBQkxFLCBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfM19QbHNxbFRhYmxlcygpKSwKLQkJCWJ1aWxkU3FsUmVzdWx0U2V0TWFwcGluZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUXVlcnlSZWRpcmVjdG9yc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCi0JCQlidWlsZEV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFbnRpdHlMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByZVBlcnNpc3RUcmFuc2xhdG9yKCksCi0JCQlidWlsZFBvc3RQZXJzaXN0VHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcmVSZW1vdmVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFBvc3RSZW1vdmVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByZVVwZGF0ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUG9zdFVwZGF0ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUG9zdExvYWRUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IoKSwKLQkJCUF0dHJpYnV0ZXMuYnVpbGRUcmFuc2xhdG9yKCl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYWNoZWFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBMl8wLkNBQ0hFQUJMRSwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhY2hlYWJsZV8yXzBfQ2FjaGVhYmxlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUmVhZE9ubHlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUkVBRF9PTkxZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFJlYWRPbmx5X1JlYWRPbmx5KCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEV4aXN0ZW5jZUNoZWNraW5nVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDYWNoZUhvbGRlcl9FeGlzdGVuY2VDaGVja2luZygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkVYQ0xVREVfREVGQVVMVF9NQVBQSU5HUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ3VzdG9taXplclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDbGFzc1JlZmVyZW5jZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDdXN0b21pemVySG9sZGVyX0N1c3RvbWl6ZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENoYW5nZVRyYWNraW5nVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENoYW5nZVRyYWNraW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkcsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXJfQ2hhbmdlVHJhY2tpbmcoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByaW1hcnlLZXlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sUHJpbWFyeUtleS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsxXzEuUFJJTUFSWV9LRVksIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xX1ByaW1hcnlLZXkoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9wdGltaXN0aWNMb2NraW5nVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbE9wdGltaXN0aWNMb2NraW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5PUFRJTUlTVElDX0xPQ0tJTkcsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19PcHRpbWlzdGljTG9ja2luZygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2FjaGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ2FjaGUuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNBQ0hFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhY2hlSG9sZGVyX0NhY2hlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYWNoZUludGVyY2VwdG9yVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENsYXNzUmVmZXJlbmNlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5DQUNIRV9JTlRFUkNFUFRPUiwgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzBfQ2FjaGVJbnRlcmNlcHRvcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYWNoZUluZGV4VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENhY2hlSW5kZXguYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl80LkNBQ0hFX0lOREVYLCBFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfNF9DYWNoZUluZGV4KCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEZldGNoR3JvdXBzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEZldGNoR3JvdXAuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkZFVENIX0dST1VQLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMV9GZXRjaEdyb3VwcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9Db252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9UeXBlQ29udmVydGVycygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxPYmplY3RUeXBlQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX09iamVjdFR5cGVDb252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sU3RydWN0Q29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckNvbnRhaW5lcl9TdHJ1Y3RDb252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb3B5UG9saWN5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENvcHlQb2xpY3kuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPUFlfUE9MSUNZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfQ29weVBvbGljeSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSW5zdGFudGlhdGlvbkNveXBQb2xpY3lUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLklOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1ksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2xvbmVDb3B5UG9saWN5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENsb25lQ29weVBvbGljeS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0xPTkVfQ09QWV9QT0xJQ1ksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19DbG9uZUNvcHlQb2xpY3koKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFNlcXVlbmNlR2VuZXJhdG9yLmJ1aWxkVHJhbnNsYXRvcihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0b3JDb250YWluZXJfU2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRhYmxlR2VuZXJhdG9yVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IuYnVpbGRUcmFuc2xhdG9yKEpQQS5UQUJMRV9HRU5FUkFUT1IsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEdlbmVyYXRvckNvbnRhaW5lcl9UYWJsZUdlbmVyYXRvcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZWRRdWVyeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxOYW1lZFF1ZXJ5LmJ1aWxkVHJhbnNsYXRvcihKUEEuTkFNRURfUVVFUlksIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkUXVlcmllcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZWROYXRpdmVRdWVyeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxOYW1lZE5hdGl2ZVF1ZXJ5LmJ1aWxkVHJhbnNsYXRvcihKUEEuTkFNRURfTkFUSVZFX1FVRVJZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZE5hdGl2ZVF1ZXJpZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNxbFJlc3VsdFNldE1hcHBpbmdUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gU3FsUmVzdWx0U2V0TWFwcGluZy5idWlsZFRyYW5zbGF0b3IoSlBBLlNRTF9SRVNVTFRfU0VUX01BUFBJTkcsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xX1NxbFJlc3VsdFNldE1hcHBpbmdzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRRdWVyeVJlZGlyZWN0b3JzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFF1ZXJ5UmVkaXJlY3RvcnMuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLlFVRVJZX1JFRElSRUNUT1JTLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMV9RdWVyeVJlZGlyZWN0b3JzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxQcm9wZXJ0eS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpKTsKLQl9Ci0JCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEF0dHJpYnV0ZU92ZXJyaWRlLmJ1aWxkVHJhbnNsYXRvcihKUEEuQVRUUklCVVRFX09WRVJSSURFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl9BdHRyaWJ1dGVPdmVycmlkZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQXNzb2NpYXRpb25PdmVycmlkZS5idWlsZFRyYW5zbGF0b3IoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyX0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFBhcmVudENsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLlBBUkVOVF9DTEFTUywgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVHlwZU1hcHBpbmdfMl8xX1BhcmVudENsYXNzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWRkaXRpb25hbENyaXRlcmlhVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFkZGl0aW9uYWxDcml0ZXJpYS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuQURESVRJT05BTF9DUklURVJJQSwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzJfQWRkaXRpb25hbENyaXRlcmlhKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxNdWx0aXRlbmFudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE11bHRpdGVuYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZmE4MjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE11bHRpdGVuYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5NdWx0aXRlbmFudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxNdWx0aXRlbmFudF8yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGluazJfNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sTXVsdGl0ZW5hbnRfMl80OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNdWx0aXRlbmFudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNdWx0aXRlbmFudCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxNdWx0aXRlbmFudCBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbE11bHRpdGVuYW50XzJfMywgWG1sTXVsdGl0ZW5hbnRfMl80Ci17Ci0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTXVsdGl0ZW5hbnRUeXBlIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTXVsdGl0ZW5hbnRUeXBlIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSA8ZW0+VGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zPiB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmNsdWRlQ3JpdGVyaWEoKSA8ZW0+SW5jbHVkZSBDcml0ZXJpYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5jbHVkZUNyaXRlcmlhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSU5DTFVERV9DUklURVJJQV9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5jbHVkZUNyaXRlcmlhKCkgPGVtPkluY2x1ZGUgQ3JpdGVyaWE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluY2x1ZGVDcml0ZXJpYSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaW5jbHVkZUNyaXRlcmlhID0gSU5DTFVERV9DUklURVJJQV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxNdWx0aXRlbmFudCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX01VTFRJVEVOQU5UOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLk11bHRpdGVuYW50VHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLk11bHRpdGVuYW50VHlwZQotCSAqIEBzZWUgI3NldFR5cGUoTXVsdGl0ZW5hbnRUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTXVsdGl0ZW5hbnRfMl8zX1R5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTXVsdGl0ZW5hbnRUeXBlIGdldFR5cGUoKQotCXsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNdWx0aXRlbmFudCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5NdWx0aXRlbmFudFR5cGUKLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShNdWx0aXRlbmFudFR5cGUgbmV3VHlwZSkKLQl7Ci0JCU11bHRpdGVuYW50VHlwZSBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGUgPT0gbnVsbCA/IFRZUEVfRURFRkFVTFQgOiBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VTFRJVEVOQU5UX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfM30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZW5hbnQgRGlzY3JpbWluYXRvciBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE11bHRpdGVuYW50XzJfM19UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzM+IGdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkKLQl7Ci0JCWlmICh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9PSBudWxsKQotCQl7Ci0JCQl0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMz4oWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTVVMVElURU5BTlRfX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlMpOwotCQl9Ci0JCXJldHVybiB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmNsdWRlIENyaXRlcmlhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmNsdWRlIENyaXRlcmlhPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluY2x1ZGUgQ3JpdGVyaWE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEluY2x1ZGVDcml0ZXJpYShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTXVsdGl0ZW5hbnRfMl80X0luY2x1ZGVDcml0ZXJpYSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0SW5jbHVkZUNyaXRlcmlhKCkKLQl7Ci0JCXJldHVybiBpbmNsdWRlQ3JpdGVyaWE7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNdWx0aXRlbmFudCNnZXRJbmNsdWRlQ3JpdGVyaWEgPGVtPkluY2x1ZGUgQ3JpdGVyaWE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluY2x1ZGUgQ3JpdGVyaWE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEluY2x1ZGVDcml0ZXJpYSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVDcml0ZXJpYShCb29sZWFuIG5ld0luY2x1ZGVDcml0ZXJpYSkKLQl7Ci0JCUJvb2xlYW4gb2xkSW5jbHVkZUNyaXRlcmlhID0gaW5jbHVkZUNyaXRlcmlhOwotCQlpbmNsdWRlQ3JpdGVyaWEgPSBuZXdJbmNsdWRlQ3JpdGVyaWE7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTVVMVElURU5BTlRfX0lOQ0xVREVfQ1JJVEVSSUEsIG9sZEluY2x1ZGVDcml0ZXJpYSwgaW5jbHVkZUNyaXRlcmlhKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTVVMVElURU5BTlRfX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VTFRJVEVOQU5UX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTVVMVElURU5BTlRfX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIGdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTVVMVElURU5BTlRfX0lOQ0xVREVfQ1JJVEVSSUE6Ci0JCQkJcmV0dXJuIGdldEluY2x1ZGVDcml0ZXJpYSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NVUxUSVRFTkFOVF9fVFlQRToKLQkJCQlzZXRUeXBlKChNdWx0aXRlbmFudFR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NVUxUSVRFTkFOVF9fVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OUzoKLQkJCQlnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VTFRJVEVOQU5UX19JTkNMVURFX0NSSVRFUklBOgotCQkJCXNldEluY2x1ZGVDcml0ZXJpYSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VTFRJVEVOQU5UX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VTFRJVEVOQU5UX19URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TOgotCQkJCWdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTVVMVElURU5BTlRfX0lOQ0xVREVfQ1JJVEVSSUE6Ci0JCQkJc2V0SW5jbHVkZUNyaXRlcmlhKElOQ0xVREVfQ1JJVEVSSUFfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTVVMVElURU5BTlRfX1RZUEU6Ci0JCQkJcmV0dXJuIHR5cGUgIT0gVFlQRV9FREVGQVVMVDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NVUxUSVRFTkFOVF9fVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OUzoKLQkJCQlyZXR1cm4gdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMgIT0gbnVsbCAmJiAhdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VTFRJVEVOQU5UX19JTkNMVURFX0NSSVRFUklBOgotCQkJCXJldHVybiBJTkNMVURFX0NSSVRFUklBX0VERUZBVUxUID09IG51bGwgPyBpbmNsdWRlQ3JpdGVyaWEgIT0gbnVsbCA6ICFJTkNMVURFX0NSSVRFUklBX0VERUZBVUxULmVxdWFscyhpbmNsdWRlQ3JpdGVyaWEpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNdWx0aXRlbmFudF8yXzQuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTVVMVElURU5BTlRfX0lOQ0xVREVfQ1JJVEVSSUE6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLlhNTF9NVUxUSVRFTkFOVF8yNF9fSU5DTFVERV9DUklURVJJQTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbE11bHRpdGVuYW50XzJfNC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5YTUxfTVVMVElURU5BTlRfMjRfX0lOQ0xVREVfQ1JJVEVSSUE6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VTFRJVEVOQU5UX19JTkNMVURFX0NSSVRFUklBOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaW5jbHVkZUNyaXRlcmlhOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbmNsdWRlQ3JpdGVyaWEpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEluY2x1ZGVDcml0ZXJpYVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShFY2xpcHNlTGluazJfNC5NVUxUSVRFTkFOVF9fSU5DTFVERV9DUklURVJJQSk7IAotCX0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTXVsdGl0ZW5hbnQoKSwKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRUeXBlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRJbmNsdWRlQ3JpdGVyaWFUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMy5NVUxUSVRFTkFOVF9fVFlQRSwgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTXVsdGl0ZW5hbnRfMl8zX1R5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMy5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU4sIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE11bHRpdGVuYW50XzJfM19UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRJbmNsdWRlQ3JpdGVyaWFUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzQuTVVMVElURU5BTlRfX0lOQ0xVREVfQ1JJVEVSSUEsIEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE11bHRpdGVuYW50XzJfNF9JbmNsdWRlQ3JpdGVyaWEoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLX0gLy8gWG1sTXVsdGl0ZW5hbnQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxNdWx0aXRlbmFudEhvbGRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE11bHRpdGVuYW50SG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYmNlYTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE11bHRpdGVuYW50SG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNdWx0aXRlbmFudCBIb2xkZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNdWx0aXRlbmFudEhvbGRlciNnZXRNdWx0aXRlbmFudCA8ZW0+TXVsdGl0ZW5hbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE11bHRpdGVuYW50SG9sZGVyKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNdWx0aXRlbmFudEhvbGRlciBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NdWx0aXRlbmFudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TXVsdGl0ZW5hbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TXVsdGl0ZW5hbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE11bHRpdGVuYW50KFhtbE11bHRpdGVuYW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTXVsdGl0ZW5hbnRIb2xkZXJfTXVsdGl0ZW5hbnQoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sTXVsdGl0ZW5hbnQgZ2V0TXVsdGl0ZW5hbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGl0ZW5hbnRIb2xkZXIjZ2V0TXVsdGl0ZW5hbnQgPGVtPk11bHRpdGVuYW50PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NdWx0aXRlbmFudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TXVsdGl0ZW5hbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE11bHRpdGVuYW50KFhtbE11bHRpdGVuYW50IHZhbHVlKTsKLQotfSAvLyBYbWxNdWx0aXRlbmFudEhvbGRlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE11dGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxNdXRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNzlkYmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE11dGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTXV0YWJsZTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXV0YWJsZSNnZXRNdXRhYmxlIDxlbT5NdXRhYmxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNdXRhYmxlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNdXRhYmxlIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk11dGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk11dGFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TXV0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TXV0YWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTXV0YWJsZV9NdXRhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldE11dGFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXV0YWJsZSNnZXRNdXRhYmxlIDxlbT5NdXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NdXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNdXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNdXRhYmxlKEJvb2xlYW4gdmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBtdXRhYmxlIGF0dGlidXRlLgotCSAqLwotCVRleHRSYW5nZSBnZXRNdXRhYmxlVGV4dFJhbmdlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE5hbWVkQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ2MDJiMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTmFtZWQgQ29udmVydGVyPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlciNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZENvbnZlcnRlcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxOYW1lZENvbnZlcnRlciBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sTmFtZWRDb252ZXJ0ZXIoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9OQU1FRF9DT05WRVJURVI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkQ29udmVydGVyX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29udmVydGVyI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfQ09OVkVSVEVSX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfQ09OVkVSVEVSX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX0NPTlZFUlRFUl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9DT05WRVJURVJfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX0NPTlZFUlRFUl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEuTkFNRSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSVEVSX19OQU1FLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE5hbWVkQ29udmVydGVyX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLX0gLy8gWG1sTmFtZWRDb252ZXJ0ZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MDhkMzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmsyXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTmFtZWQgUGxzcWwgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJ5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfTkFNRURfUExTUUxfU1RPUkVEX0ZVTkNUSU9OX1FVRVJZOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSWV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSWV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUllfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfUExTUUxfU1RPUkVEX0ZVTkNUSU9OX1FVRVJZX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUllfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnkoKSwKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzMuTkFNRURfUExTUUxfU1RPUkVEX0ZVTkNUSU9OX1FVRVJZX19OQU1FLCBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzNfTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLX0gLy8gWG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZjVjZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmsyXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE5hbWVkIFBsc3FsIFN0b3JlZCBQcm9jZWR1cmUgUXVlcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzMKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSWTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzNfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9QTFNRTF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnkoKSwKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzMuTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRSwgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfM19OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotfSAvLyBYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcxZWM4MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmsyXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE5hbWVkIFN0b3JlZCBGdW5jdGlvbiBRdWVyeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnkoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMwotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnkoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUlk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUllfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUllfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJZX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9GVU5DVElPTl9RVUVSWV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJZX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeSgpLAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMy5OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUllfX05BTUUsIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzNfTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLX0gLy8gWG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJiZTMzOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLkJvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBOYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJ5PC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFJlc3VsdENsYXNzIDxlbT5SZXN1bHQgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRSZXN1bHRTZXRNYXBwaW5nIDxlbT5SZXN1bHQgU2V0IE1hcHBpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRQcm9jZWR1cmVOYW1lIDxlbT5Qcm9jZWR1cmUgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFJldHVybnNSZXN1bHRTZXQgPGVtPlJldHVybnMgUmVzdWx0IFNldDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldEhpbnRzIDxlbT5IaW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFBhcmFtZXRlcnMgPGVtPlBhcmFtZXRlcnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bHRDbGFzcygpIDxlbT5SZXN1bHQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3VsdENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzdWx0Q2xhc3MoKSA8ZW0+UmVzdWx0IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXN1bHRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXN1bHRDbGFzcyA9IFJFU1VMVF9DTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bHRTZXRNYXBwaW5nKCkgPGVtPlJlc3VsdCBTZXQgTWFwcGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzdWx0U2V0TWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX1NFVF9NQVBQSU5HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3VsdFNldE1hcHBpbmcoKSA8ZW0+UmVzdWx0IFNldCBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXN1bHRTZXRNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcgPSBSRVNVTFRfU0VUX01BUFBJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvY2VkdXJlTmFtZSgpIDxlbT5Qcm9jZWR1cmUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvY2VkdXJlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VEVVJFX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvY2VkdXJlTmFtZSgpIDxlbT5Qcm9jZWR1cmUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvY2VkdXJlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcm9jZWR1cmVOYW1lID0gUFJPQ0VEVVJFX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmV0dXJuc1Jlc3VsdFNldCgpIDxlbT5SZXR1cm5zIFJlc3VsdCBTZXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJldHVybnNSZXN1bHRTZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBSRVRVUk5TX1JFU1VMVF9TRVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmV0dXJuc1Jlc3VsdFNldCgpIDxlbT5SZXR1cm5zIFJlc3VsdCBTZXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJldHVybnNSZXN1bHRTZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIHJldHVybnNSZXN1bHRTZXQgPSBSRVRVUk5TX1JFU1VMVF9TRVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIaW50cygpIDxlbT5IaW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIaW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFF1ZXJ5SGludD4gaGludHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJhbWV0ZXJzKCkgPGVtPlBhcmFtZXRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyYW1ldGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcj4gcGFyYW1ldGVyczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXN1bHQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc3VsdCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bHQgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlc3VsdENsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmVzdWx0Q2xhc3MoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXN1bHRDbGFzcygpCi0JewotCQlyZXR1cm4gcmVzdWx0Q2xhc3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFJlc3VsdENsYXNzIDxlbT5SZXN1bHQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VsdCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVzdWx0Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHRDbGFzcyhTdHJpbmcgbmV3UmVzdWx0Q2xhc3MpCi0JewotCQlTdHJpbmcgb2xkUmVzdWx0Q2xhc3MgPSByZXN1bHRDbGFzczsKLQkJcmVzdWx0Q2xhc3MgPSBuZXdSZXN1bHRDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfQ0xBU1MsIG9sZFJlc3VsdENsYXNzLCByZXN1bHRDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3VsdCBTZXQgTWFwcGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzdWx0IFNldCBNYXBwaW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VsdCBTZXQgTWFwcGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzdWx0U2V0TWFwcGluZyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1Jlc3VsdFNldE1hcHBpbmcoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXN1bHRTZXRNYXBwaW5nKCkKLQl7Ci0JCXJldHVybiByZXN1bHRTZXRNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRSZXN1bHRTZXRNYXBwaW5nIDxlbT5SZXN1bHQgU2V0IE1hcHBpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VsdCBTZXQgTWFwcGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVzdWx0U2V0TWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc3VsdFNldE1hcHBpbmcoU3RyaW5nIG5ld1Jlc3VsdFNldE1hcHBpbmcpCi0JewotCQlTdHJpbmcgb2xkUmVzdWx0U2V0TWFwcGluZyA9IHJlc3VsdFNldE1hcHBpbmc7Ci0JCXJlc3VsdFNldE1hcHBpbmcgPSBuZXdSZXN1bHRTZXRNYXBwaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9TRVRfTUFQUElORywgb2xkUmVzdWx0U2V0TWFwcGluZywgcmVzdWx0U2V0TWFwcGluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2NlZHVyZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9jZWR1cmUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9jZWR1cmUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJvY2VkdXJlTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1Byb2NlZHVyZU5hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9jZWR1cmVOYW1lKCkKLQl7Ci0JCXJldHVybiBwcm9jZWR1cmVOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRQcm9jZWR1cmVOYW1lIDxlbT5Qcm9jZWR1cmUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VkdXJlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb2NlZHVyZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZWR1cmVOYW1lKFN0cmluZyBuZXdQcm9jZWR1cmVOYW1lKQotCXsKLQkJU3RyaW5nIG9sZFByb2NlZHVyZU5hbWUgPSBwcm9jZWR1cmVOYW1lOwotCQlwcm9jZWR1cmVOYW1lID0gbmV3UHJvY2VkdXJlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QUk9DRURVUkVfTkFNRSwgb2xkUHJvY2VkdXJlTmFtZSwgcHJvY2VkdXJlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJldHVybnMgUmVzdWx0IFNldDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmV0dXJucyBSZXN1bHQgU2V0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldHVybnMgUmVzdWx0IFNldDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmV0dXJuc1Jlc3VsdFNldChCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9SZXR1cm5zUmVzdWx0U2V0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRSZXR1cm5zUmVzdWx0U2V0KCkKLQl7Ci0JCXJldHVybiByZXR1cm5zUmVzdWx0U2V0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRSZXR1cm5zUmVzdWx0U2V0IDxlbT5SZXR1cm5zIFJlc3VsdCBTZXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJldHVybnMgUmVzdWx0IFNldDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmV0dXJuc1Jlc3VsdFNldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJldHVybnNSZXN1bHRTZXQoQm9vbGVhbiBuZXdSZXR1cm5zUmVzdWx0U2V0KQotCXsKLQkJQm9vbGVhbiBvbGRSZXR1cm5zUmVzdWx0U2V0ID0gcmV0dXJuc1Jlc3VsdFNldDsKLQkJcmV0dXJuc1Jlc3VsdFNldCA9IG5ld1JldHVybnNSZXN1bHRTZXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVUVVJOU19SRVNVTFRfU0VULCBvbGRSZXR1cm5zUmVzdWx0U2V0LCByZXR1cm5zUmVzdWx0U2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9IaW50cygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUXVlcnlIaW50PiBnZXRIaW50cygpCi0JewotCQlpZiAoaGludHMgPT0gbnVsbCkKLQkJewotCQkJaGludHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUXVlcnlIaW50PihYbWxRdWVyeUhpbnQuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fSElOVFMpOwotCQl9Ci0JCXJldHVybiBoaW50czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJhbWV0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFyYW1ldGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcmFtZXRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1BhcmFtZXRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcj4gZ2V0UGFyYW1ldGVycygpCi0JewotCQlpZiAocGFyYW1ldGVycyA9PSBudWxsKQotCQl7Ci0JCQlwYXJhbWV0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcj4oWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BBUkFNRVRFUlMpOwotCQl9Ci0JCXJldHVybiBwYXJhbWV0ZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX0hJTlRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SGludHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BBUkFNRVRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQYXJhbWV0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0UmVzdWx0Q2xhc3MoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfU0VUX01BUFBJTkc6Ci0JCQkJcmV0dXJuIGdldFJlc3VsdFNldE1hcHBpbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QUk9DRURVUkVfTkFNRToKLQkJCQlyZXR1cm4gZ2V0UHJvY2VkdXJlTmFtZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFVFVSTlNfUkVTVUxUX1NFVDoKLQkJCQlyZXR1cm4gZ2V0UmV0dXJuc1Jlc3VsdFNldCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX0hJTlRTOgotCQkJCXJldHVybiBnZXRIaW50cygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BBUkFNRVRFUlM6Ci0JCQkJcmV0dXJuIGdldFBhcmFtZXRlcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfQ0xBU1M6Ci0JCQkJc2V0UmVzdWx0Q2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9TRVRfTUFQUElORzoKLQkJCQlzZXRSZXN1bHRTZXRNYXBwaW5nKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QUk9DRURVUkVfTkFNRToKLQkJCQlzZXRQcm9jZWR1cmVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVRVUk5TX1JFU1VMVF9TRVQ6Ci0JCQkJc2V0UmV0dXJuc1Jlc3VsdFNldCgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX0hJTlRTOgotCQkJCWdldEhpbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRIaW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUXVlcnlIaW50PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BBUkFNRVRFUlM6Ci0JCQkJZ2V0UGFyYW1ldGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGFyYW1ldGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX0NMQVNTOgotCQkJCXNldFJlc3VsdENsYXNzKFJFU1VMVF9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9TRVRfTUFQUElORzoKLQkJCQlzZXRSZXN1bHRTZXRNYXBwaW5nKFJFU1VMVF9TRVRfTUFQUElOR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BST0NFRFVSRV9OQU1FOgotCQkJCXNldFByb2NlZHVyZU5hbWUoUFJPQ0VEVVJFX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVRVUk5TX1JFU1VMVF9TRVQ6Ci0JCQkJc2V0UmV0dXJuc1Jlc3VsdFNldChSRVRVUk5TX1JFU1VMVF9TRVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19ISU5UUzoKLQkJCQlnZXRIaW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BBUkFNRVRFUlM6Ci0JCQkJZ2V0UGFyYW1ldGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX0NMQVNTOgotCQkJCXJldHVybiBSRVNVTFRfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IHJlc3VsdENsYXNzICE9IG51bGwgOiAhUkVTVUxUX0NMQVNTX0VERUZBVUxULmVxdWFscyhyZXN1bHRDbGFzcyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HOgotCQkJCXJldHVybiBSRVNVTFRfU0VUX01BUFBJTkdfRURFRkFVTFQgPT0gbnVsbCA/IHJlc3VsdFNldE1hcHBpbmcgIT0gbnVsbCA6ICFSRVNVTFRfU0VUX01BUFBJTkdfRURFRkFVTFQuZXF1YWxzKHJlc3VsdFNldE1hcHBpbmcpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BST0NFRFVSRV9OQU1FOgotCQkJCXJldHVybiBQUk9DRURVUkVfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcHJvY2VkdXJlTmFtZSAhPSBudWxsIDogIVBST0NFRFVSRV9OQU1FX0VERUZBVUxULmVxdWFscyhwcm9jZWR1cmVOYW1lKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVRVUk5TX1JFU1VMVF9TRVQ6Ci0JCQkJcmV0dXJuIFJFVFVSTlNfUkVTVUxUX1NFVF9FREVGQVVMVCA9PSBudWxsID8gcmV0dXJuc1Jlc3VsdFNldCAhPSBudWxsIDogIVJFVFVSTlNfUkVTVUxUX1NFVF9FREVGQVVMVC5lcXVhbHMocmV0dXJuc1Jlc3VsdFNldCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fSElOVFM6Ci0JCQkJcmV0dXJuIGhpbnRzICE9IG51bGwgJiYgIWhpbnRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QQVJBTUVURVJTOgotCQkJCXJldHVybiBwYXJhbWV0ZXJzICE9IG51bGwgJiYgIXBhcmFtZXRlcnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXN1bHRDbGFzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVzdWx0Q2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc3VsdFNldE1hcHBpbmc6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlc3VsdFNldE1hcHBpbmcpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb2NlZHVyZU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByb2NlZHVyZU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJldHVybnNSZXN1bHRTZXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJldHVybnNSZXN1bHRTZXQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFJlc3VsdENsYXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRSZXN1bHRTZXRNYXBwaW5nVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcm9jZWR1cmVOYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRSZXR1cm5SZXN1bHRTZXRUcmFuc2xhdG9yKCksCi0JCQlidWlsZEhpbnRUcmFuc2xhdG9yKCksCi0JCQlidWlsZFBhcmFtZXRlclRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX05BTUUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFJlc3VsdENsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9DTEFTUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1Jlc3VsdENsYXNzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFJlc3VsdFNldE1hcHBpbmdUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmVzdWx0U2V0TWFwcGluZygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcm9jZWR1cmVOYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BST0NFRFVSRV9OQU1FLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUHJvY2VkdXJlTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRSZXR1cm5SZXN1bHRTZXRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFVFVSTlNfUkVTVUxUX1NFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1JldHVybnNSZXN1bHRTZXQoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSGludFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxRdWVyeUhpbnQuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX0hJTlQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9IaW50cygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUGFyYW1ldGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUEFSQU1FVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUGFyYW1ldGVycygpKTsKLQl9Ci19IC8vIFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPYmplY3RUeXBlQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDNhYTMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPYmplY3RUeXBlQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE9iamVjdCBUeXBlIEN1c3RvbUNvbnZlcnRlcjwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciNnZXREYXRhVHlwZSA8ZW0+RGF0YSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIjZ2V0T2JqZWN0VHlwZSA8ZW0+T2JqZWN0IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciNnZXRDb252ZXJzaW9uVmFsdWVzIDxlbT5Db252ZXJzaW9uIFZhbHVlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyI2dldERlZmF1bHRPYmplY3RWYWx1ZSA8ZW0+RGVmYXVsdCBPYmplY3QgVmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBleHRlbmRzIFhtbE5hbWVkQ29udmVydGVyCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERhdGFUeXBlKCkgPGVtPkRhdGEgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGF0YVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YVR5cGUoKSA8ZW0+RGF0YSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXRhVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkYXRhVHlwZSA9IERBVEFfVFlQRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0VHlwZSgpIDxlbT5PYmplY3QgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9iamVjdFR5cGUoKSA8ZW0+T2JqZWN0IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9iamVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgb2JqZWN0VHlwZSA9IE9CSkVDVF9UWVBFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnNpb25WYWx1ZXMoKSA8ZW0+Q29udmVyc2lvbiBWYWx1ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVyc2lvblZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbENvbnZlcnNpb25WYWx1ZT4gY29udmVyc2lvblZhbHVlczsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkgPGVtPkRlZmF1bHQgT2JqZWN0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0T2JqZWN0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfT0JKRUNUX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0T2JqZWN0VmFsdWUoKSA8ZW0+RGVmYXVsdCBPYmplY3QgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRPYmplY3RWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWUgPSBERUZBVUxUX09CSkVDVF9WQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxPYmplY3RUeXBlQ29udmVydGVyKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRhdGEgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF0YSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRhdGEgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGF0YVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9EYXRhVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlKCkKLQl7Ci0JCXJldHVybiBkYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIjZ2V0RGF0YVR5cGUgPGVtPkRhdGEgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREYXRhVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGFUeXBlKFN0cmluZyBuZXdEYXRhVHlwZSkKLQl7Ci0JCVN0cmluZyBvbGREYXRhVHlwZSA9IGRhdGFUeXBlOwotCQlkYXRhVHlwZSA9IG5ld0RhdGFUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFLCBvbGREYXRhVHlwZSwgZGF0YVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE9iamVjdFR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9PYmplY3RUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpCi0JewotCQlyZXR1cm4gb2JqZWN0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIjZ2V0T2JqZWN0VHlwZSA8ZW0+T2JqZWN0IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPYmplY3RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0VHlwZShTdHJpbmcgbmV3T2JqZWN0VHlwZSkKLQl7Ci0JCVN0cmluZyBvbGRPYmplY3RUeXBlID0gb2JqZWN0VHlwZTsKLQkJb2JqZWN0VHlwZSA9IG5ld09iamVjdFR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSwgb2xkT2JqZWN0VHlwZSwgb2JqZWN0VHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnNpb24gVmFsdWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udmVyc2lvbiBWYWx1ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJzaW9uIFZhbHVlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfQ29udmVyc2lvblZhbHVlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sQ29udmVyc2lvblZhbHVlPiBnZXRDb252ZXJzaW9uVmFsdWVzKCkKLQl7Ci0JCWlmIChjb252ZXJzaW9uVmFsdWVzID09IG51bGwpCi0JCXsKLQkJCWNvbnZlcnNpb25WYWx1ZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQ29udmVyc2lvblZhbHVlPihYbWxDb252ZXJzaW9uVmFsdWUuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19DT05WRVJTSU9OX1ZBTFVFUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnNpb25WYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBPYmplY3QgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlZmF1bHQgT2JqZWN0IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgT2JqZWN0IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0T2JqZWN0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9EZWZhdWx0T2JqZWN0VmFsdWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0T2JqZWN0VmFsdWUoKQotCXsKLQkJcmV0dXJuIGRlZmF1bHRPYmplY3RWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIjZ2V0RGVmYXVsdE9iamVjdFZhbHVlIDxlbT5EZWZhdWx0IE9iamVjdCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBPYmplY3QgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlZmF1bHRPYmplY3RWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRPYmplY3RWYWx1ZShTdHJpbmcgbmV3RGVmYXVsdE9iamVjdFZhbHVlKQotCXsKLQkJU3RyaW5nIG9sZERlZmF1bHRPYmplY3RWYWx1ZSA9IGRlZmF1bHRPYmplY3RWYWx1ZTsKLQkJZGVmYXVsdE9iamVjdFZhbHVlID0gbmV3RGVmYXVsdE9iamVjdFZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREVGQVVMVF9PQkpFQ1RfVkFMVUUsIG9sZERlZmF1bHRPYmplY3RWYWx1ZSwgZGVmYXVsdE9iamVjdFZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19DT05WRVJTSU9OX1ZBTFVFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbnZlcnNpb25WYWx1ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RGF0YVR5cGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFOgotCQkJCXJldHVybiBnZXRPYmplY3RUeXBlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19DT05WRVJTSU9OX1ZBTFVFUzoKLQkJCQlyZXR1cm4gZ2V0Q29udmVyc2lvblZhbHVlcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREVGQVVMVF9PQkpFQ1RfVkFMVUU6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRPYmplY3RWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRToKLQkJCQlzZXREYXRhVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRToKLQkJCQlzZXRPYmplY3RUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0NPTlZFUlNJT05fVkFMVUVTOgotCQkJCWdldENvbnZlcnNpb25WYWx1ZXMoKS5jbGVhcigpOwotCQkJCWdldENvbnZlcnNpb25WYWx1ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbENvbnZlcnNpb25WYWx1ZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RFRkFVTFRfT0JKRUNUX1ZBTFVFOgotCQkJCXNldERlZmF1bHRPYmplY3RWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEU6Ci0JCQkJc2V0RGF0YVR5cGUoREFUQV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRToKLQkJCQlzZXRPYmplY3RUeXBlKE9CSkVDVF9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19DT05WRVJTSU9OX1ZBTFVFUzoKLQkJCQlnZXRDb252ZXJzaW9uVmFsdWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19ERUZBVUxUX09CSkVDVF9WQUxVRToKLQkJCQlzZXREZWZhdWx0T2JqZWN0VmFsdWUoREVGQVVMVF9PQkpFQ1RfVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEU6Ci0JCQkJcmV0dXJuIERBVEFfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZGF0YVR5cGUgIT0gbnVsbCA6ICFEQVRBX1RZUEVfRURFRkFVTFQuZXF1YWxzKGRhdGFUeXBlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFOgotCQkJCXJldHVybiBPQkpFQ1RfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gb2JqZWN0VHlwZSAhPSBudWxsIDogIU9CSkVDVF9UWVBFX0VERUZBVUxULmVxdWFscyhvYmplY3RUeXBlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0NPTlZFUlNJT05fVkFMVUVTOgotCQkJCXJldHVybiBjb252ZXJzaW9uVmFsdWVzICE9IG51bGwgJiYgIWNvbnZlcnNpb25WYWx1ZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREVGQVVMVF9PQkpFQ1RfVkFMVUU6Ci0JCQkJcmV0dXJuIERFRkFVTFRfT0JKRUNUX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0T2JqZWN0VmFsdWUgIT0gbnVsbCA6ICFERUZBVUxUX09CSkVDVF9WQUxVRV9FREVGQVVMVC5lcXVhbHMoZGVmYXVsdE9iamVjdFZhbHVlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGF0YVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRhdGFUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvYmplY3RUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvYmplY3RUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0T2JqZWN0VmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlZmF1bHRPYmplY3RWYWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZENvbnZlcnNpb25WYWx1ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlVHJhbnNsYXRvcigpLAotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGREYXRhVHlwZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkT2JqZWN0VHlwZVRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29udmVyc2lvblZhbHVlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENvbnZlcnNpb25WYWx1ZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX0NvbnZlcnNpb25WYWx1ZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERlZmF1bHRPYmplY3RWYWx1ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RFRkFVTFRfT0JKRUNUX1ZBTFVFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfRGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREYXRhVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX0RhdGFUeXBlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9iamVjdFR5cGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX09iamVjdFR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKgotCi0JcHVibGljIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZURhdGFUeXBlRWRpdChJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvcmlnaW5hbE5hbWUgPSBvcmlnaW5hbFR5cGUuZ2V0VHlwZVF1YWxpZmllZE5hbWUoKTsKLQkJaW50IG5hbWVJbmRleCA9IHRoaXMuZGF0YVR5cGUubGFzdEluZGV4T2Yob3JpZ2luYWxOYW1lKTsKLQkJaW50IG9mZnNldCA9IGdldEF0dHJpYnV0ZU5vZGUoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUpLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKSArIDE7IC8vICsxID0gb3BlbmluZyBkb3VibGUgcXVvdGUKLQkJcmV0dXJuIG5ldyBSZXBsYWNlRWRpdChvZmZzZXQgKyBuYW1lSW5kZXgsIG9yaWdpbmFsTmFtZS5sZW5ndGgoKSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZURhdGFUeXBlUGFja2FnZUVkaXQoU3RyaW5nIG5ld1BhY2thZ2VOYW1lKSB7Ci0JCWludCBwYWNrYWdlTGVuZ3RoID0gdGhpcy5kYXRhVHlwZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAobmV3UGFja2FnZU5hbWUgPT0gIiIpIHsvLyROT04tTkxTLTEkCi0JCQkvL21vdmluZyB0byB0aGUgZGVmYXVsdCBwYWNrYWdlLCByZW1vdmUgdGhlICcuJwotCQkJcGFja2FnZUxlbmd0aCsrOwotCQl9Ci0JCWlmIChwYWNrYWdlTGVuZ3RoID09IC0xKSB7Ci0JCQkvL21vdmluZyBmcm9tIHRoZSBkZWZhdWx0IHBhY2thZ2Ugb3IgdW5zcGVjaWZpZWQgcGFja2FnZQotCQkJcGFja2FnZUxlbmd0aCA9IDA7Ci0JCQluZXdQYWNrYWdlTmFtZSA9IG5ld1BhY2thZ2VOYW1lICsgJy4nOwotCQl9Ci0JCWludCBvZmZzZXQgPSBnZXRBdHRyaWJ1dGVOb2RlKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFKS5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCkgKyAxOyAvLyArMSA9IG9wZW5pbmcgZG91YmxlIHF1b3RlCi0JCXJldHVybiBuZXcgUmVwbGFjZUVkaXQob2Zmc2V0LCBwYWNrYWdlTGVuZ3RoLCBuZXdQYWNrYWdlTmFtZSk7Ci0JfQotCi0JcHVibGljIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZU9iamVjdFR5cGVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9yaWdpbmFsTmFtZSA9IG9yaWdpbmFsVHlwZS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgpOwotCQlpbnQgbmFtZUluZGV4ID0gdGhpcy5vYmplY3RUeXBlLmxhc3RJbmRleE9mKG9yaWdpbmFsTmFtZSk7Ci0JCWludCBvZmZzZXQgPSBnZXRBdHRyaWJ1dGVOb2RlKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEUpLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKSArIDE7IC8vICsxID0gb3BlbmluZyBkb3VibGUgcXVvdGUKLQkJcmV0dXJuIG5ldyBSZXBsYWNlRWRpdChvZmZzZXQgKyBuYW1lSW5kZXgsIG9yaWdpbmFsTmFtZS5sZW5ndGgoKSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZU9iamVjdFR5cGVQYWNrYWdlRWRpdChTdHJpbmcgbmV3UGFja2FnZU5hbWUpIHsKLQkJaW50IHBhY2thZ2VMZW5ndGggPSB0aGlzLm9iamVjdFR5cGUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKG5ld1BhY2thZ2VOYW1lID09ICIiKSB7Ly8kTk9OLU5MUy0xJAotCQkJLy9tb3ZpbmcgdG8gdGhlIGRlZmF1bHQgcGFja2FnZSwgcmVtb3ZlIHRoZSAnLicKLQkJCXBhY2thZ2VMZW5ndGgrKzsKLQkJfQotCQlpZiAocGFja2FnZUxlbmd0aCA9PSAtMSkgewotCQkJLy9tb3ZpbmcgZnJvbSB0aGUgZGVmYXVsdCBwYWNrYWdlIG9yIHVuc3BlY2lmaWVkIHBhY2thZ2UKLQkJCXBhY2thZ2VMZW5ndGggPSAwOwotCQkJbmV3UGFja2FnZU5hbWUgPSBuZXdQYWNrYWdlTmFtZSArICcuJzsKLQkJfQotCQlpbnQgb2Zmc2V0ID0gZ2V0QXR0cmlidXRlTm9kZShFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFKS5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCkgKyAxOyAvLyArMSA9IG9wZW5pbmcgZG91YmxlIHF1b3RlCi0JCXJldHVybiBuZXcgUmVwbGFjZUVkaXQob2Zmc2V0LCBwYWNrYWdlTGVuZ3RoLCBuZXdQYWNrYWdlTmFtZSk7Ci0JfQotCi19IC8vIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPbmVUb01hbnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPbmVUb01hbnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZkMjkxZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9NYW55LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLkVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGluazJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE9uZVRvTWFueV8yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxIYXNoUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9NYW55XzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSYW5nZVBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGluazJfNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sT25lVG9NYW55XzJfNDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBPbmUgVG8gTWFueTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9uZVRvTWFueSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxPbmVUb01hbnkgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSBpbXBsZW1lbnRzIFhtbE9uZVRvTWFueV8yXzAsIFhtbE9uZVRvTWFueV8yXzEsIFhtbE9uZVRvTWFueV8yXzIsIFhtbE9uZVRvTWFueV8yXzQsIFhtbEF0dHJpYnV0ZU1hcHBpbmcsIFhtbFByaXZhdGVPd25lZCwgWG1sSm9pbkZldGNoCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKSA8ZW0+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiBtYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnRlcnMoKSA8ZW0+Q29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQ29udmVydGVyPiBjb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZUNvbnZlcnRlcnMoKSA8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4gdHlwZUNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlQ29udmVydGVycygpIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkgPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0cnVjdENvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+IHN0cnVjdENvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5Q29udmVydCgpIDxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcEtleUNvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUF9LRVlfQ09OVkVSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlDb252ZXJ0KCkgPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwS2V5Q29udmVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBLZXlDb252ZXJ0ID0gTUFQX0tFWV9DT05WRVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmF0Y2hGZXRjaCgpIDxlbT5CYXRjaCBGZXRjaDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmF0Y2hGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEJhdGNoRmV0Y2ggYmF0Y2hGZXRjaDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnRpdGlvbmluZygpIDxlbT5QYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFBhcnRpdGlvbmluZ18yXzIgcGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKSA8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiByZXBsaWNhdGlvblBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKSA8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBpbm5lZFBhcnRpdGlvbmluZygpIDxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIHBpbm5lZFBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkgPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgcmFuZ2VQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpIDxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIHZhbHVlUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFzaFBhcnRpdGlvbmluZygpIDxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFzaFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIGhhc2hQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbmlvblBhcnRpdGlvbmluZygpIDxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIHVuaW9uUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnRpdGlvbmVkKCkgPGVtPlBhcnRpdGlvbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVElUSU9ORURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydGl0aW9uZWQoKSA8ZW0+UGFydGl0aW9uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcnRpdGlvbmVkID0gUEFSVElUSU9ORURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBDQVNDQURFX09OX0RFTEVURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXNjYWRlT25EZWxldGUoKSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhc2NhZGVPbkRlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gY2FzY2FkZU9uRGVsZXRlID0gQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNOb25jYWNoZWFibGUoKSA8ZW0+Tm9uY2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc05vbmNhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE5PTkNBQ0hFQUJMRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNOb25jYWNoZWFibGUoKSA8ZW0+Tm9uY2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc05vbmNhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbm9uY2FjaGVhYmxlID0gTk9OQ0FDSEVBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGVsZXRlQWxsKCkgPGVtPkRlbGV0ZSBBbGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRGVsZXRlQWxsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVMRVRFX0FMTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEZWxldGVBbGwoKSA8ZW0+RGVsZXRlIEFsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEZWxldGVBbGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRlbGV0ZUFsbCA9IERFTEVURV9BTExfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZVR5cGUgPSBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ByaXZhdGVPd25lZCgpIDxlbT5Qcml2YXRlIE93bmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1ByaXZhdGVPd25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBSSVZBVEVfT1dORURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJpdmF0ZU93bmVkKCkgPGVtPlByaXZhdGUgT3duZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUHJpdmF0ZU93bmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcml2YXRlT3duZWQgPSBQUklWQVRFX09XTkVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgWG1sSm9pbkZldGNoVHlwZSBKT0lOX0ZFVENIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpvaW5GZXRjaCgpIDxlbT5Kb2luIEZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKb2luRmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxKb2luRmV0Y2hUeXBlIGpvaW5GZXRjaCA9IEpPSU5fRkVUQ0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sT25lVG9NYW55KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfT05FX1RPX01BTlk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJpdmF0ZSBPd25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcml2YXRlIE93bmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcml2YXRlT3duZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByaXZhdGVPd25lZF9Qcml2YXRlT3duZWQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZU93bmVkKCkKLQl7Ci0JCXJldHVybiBwcml2YXRlT3duZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjaXNQcml2YXRlT3duZWQgPGVtPlByaXZhdGUgT3duZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByaXZhdGUgT3duZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzUHJpdmF0ZU93bmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJpdmF0ZU93bmVkKGJvb2xlYW4gbmV3UHJpdmF0ZU93bmVkKQotCXsKLQkJYm9vbGVhbiBvbGRQcml2YXRlT3duZWQgPSBwcml2YXRlT3duZWQ7Ci0JCXByaXZhdGVPd25lZCA9IG5ld1ByaXZhdGVPd25lZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUFJJVkFURV9PV05FRCwgb2xkUHJpdmF0ZU93bmVkLCBwcml2YXRlT3duZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIEZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKLQkgKiBAc2VlICNzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEpvaW5GZXRjaF9Kb2luRmV0Y2goKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSm9pbkZldGNoVHlwZSBnZXRKb2luRmV0Y2goKQotCXsKLQkJcmV0dXJuIGpvaW5GZXRjaDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSNnZXRKb2luRmV0Y2ggPGVtPkpvaW4gRmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlCi0JICogQHNlZSAjZ2V0Sm9pbkZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUgbmV3Sm9pbkZldGNoKQotCXsKLQkJWG1sSm9pbkZldGNoVHlwZSBvbGRKb2luRmV0Y2ggPSBqb2luRmV0Y2g7Ci0JCWpvaW5GZXRjaCA9IG5ld0pvaW5GZXRjaCA9PSBudWxsID8gSk9JTl9GRVRDSF9FREVGQVVMVCA6IG5ld0pvaW5GZXRjaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9GRVRDSCwgb2xkSm9pbkZldGNoLCBqb2luRmV0Y2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzBfTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IGdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQl7Ci0JCWlmIChtYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcyA9PSBudWxsKQotCQl7Ci0JCQltYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPihYbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUyk7Ci0JCX0KLQkJcmV0dXJuIG1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFwS2V5Q29udmVydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzBfTWFwS2V5Q29udmVydCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcEtleUNvbnZlcnQoKQotCXsKLQkJcmV0dXJuIG1hcEtleUNvbnZlcnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjZ2V0TWFwS2V5Q29udmVydCA8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hcEtleUNvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBLZXlDb252ZXJ0KFN0cmluZyBuZXdNYXBLZXlDb252ZXJ0KQotCXsKLQkJU3RyaW5nIG9sZE1hcEtleUNvbnZlcnQgPSBtYXBLZXlDb252ZXJ0OwotCQltYXBLZXlDb252ZXJ0ID0gbmV3TWFwS2V5Q29udmVydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJULCBvbGRNYXBLZXlDb252ZXJ0LCBtYXBLZXlDb252ZXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX0NvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbENvbnZlcnRlcj4gZ2V0Q29udmVydGVycygpCi0JewotCQlpZiAoY29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQljb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbENvbnZlcnRlcj4oWG1sQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gY29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1R5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxUeXBlQ29udmVydGVyPiBnZXRUeXBlQ29udmVydGVycygpCi0JewotCQlpZiAodHlwZUNvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJdHlwZUNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4oWG1sVHlwZUNvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVFlQRV9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gdHlwZUNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckNvbnRhaW5lcl9PYmplY3RUeXBlQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCXsKLQkJaWYgKG9iamVjdFR5cGVDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCW9iamVjdFR5cGVDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+KFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfU3RydWN0Q29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPiBnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmIChzdHJ1Y3RDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCXN0cnVjdENvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPihYbWxTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gc3RydWN0Q29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2g8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2g8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEJhdGNoRmV0Y2goWG1sQmF0Y2hGZXRjaCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhdGNoRmV0Y2hIb2xkZXJfQmF0Y2hGZXRjaCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQmF0Y2hGZXRjaCBnZXRCYXRjaEZldGNoKCkKLQl7Ci0JCXJldHVybiBiYXRjaEZldGNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEJhdGNoRmV0Y2goWG1sQmF0Y2hGZXRjaCBuZXdCYXRjaEZldGNoLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQmF0Y2hGZXRjaCBvbGRCYXRjaEZldGNoID0gYmF0Y2hGZXRjaDsKLQkJYmF0Y2hGZXRjaCA9IG5ld0JhdGNoRmV0Y2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0JBVENIX0ZFVENILCBvbGRCYXRjaEZldGNoLCBuZXdCYXRjaEZldGNoKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSNnZXRCYXRjaEZldGNoIDxlbT5CYXRjaCBGZXRjaDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2g8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEJhdGNoRmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXRjaEZldGNoKFhtbEJhdGNoRmV0Y2ggbmV3QmF0Y2hGZXRjaCkKLQl7Ci0JCWlmIChuZXdCYXRjaEZldGNoICE9IGJhdGNoRmV0Y2gpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGJhdGNoRmV0Y2ggIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYmF0Y2hGZXRjaCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0JBVENIX0ZFVENILCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdCYXRjaEZldGNoICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0JhdGNoRmV0Y2gpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19CQVRDSF9GRVRDSCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRCYXRjaEZldGNoKG5ld0JhdGNoRmV0Y2gsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQkFUQ0hfRkVUQ0gsIG5ld0JhdGNoRmV0Y2gsIG5ld0JhdGNoRmV0Y2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgpCi0JewotCQlyZXR1cm4gYXR0cmlidXRlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZyBuZXdBdHRyaWJ1dGVUeXBlKQotCXsKLQkJU3RyaW5nIG9sZEF0dHJpYnV0ZVR5cGUgPSBhdHRyaWJ1dGVUeXBlOwotCQlhdHRyaWJ1dGVUeXBlID0gbmV3QXR0cmlidXRlVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQVRUUklCVVRFX1RZUEUsIG9sZEF0dHJpYnV0ZVR5cGUsIGF0dHJpYnV0ZVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBhcnRpdGlvbmluZyhYbWxQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGFydGl0aW9uaW5nXzJfMiBnZXRQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQYXJ0aXRpb25pbmcoWG1sUGFydGl0aW9uaW5nXzJfMiBuZXdQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxQYXJ0aXRpb25pbmdfMl8yIG9sZFBhcnRpdGlvbmluZyA9IHBhcnRpdGlvbmluZzsKLQkJcGFydGl0aW9uaW5nID0gbmV3UGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QQVJUSVRJT05JTkcsIG9sZFBhcnRpdGlvbmluZywgbmV3UGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSNnZXRQYXJ0aXRpb25pbmcgPGVtPlBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0aXRpb25pbmcoWG1sUGFydGl0aW9uaW5nXzJfMiBuZXdQYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3UGFydGl0aW9uaW5nICE9IHBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1BhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQYXJ0aXRpb25pbmcobmV3UGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BBUlRJVElPTklORywgbmV3UGFydGl0aW9uaW5nLCBuZXdQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9SZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIGdldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiByZXBsaWNhdGlvblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgb2xkUmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPSByZXBsaWNhdGlvblBhcnRpdGlvbmluZzsKLQkJcmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPSBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBvbGRSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nIDxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gcmVwbGljYXRpb25QYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9Sb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiBnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiByb3VuZFJvYmluUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIG9sZFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgPSByb3VuZFJvYmluUGFydGl0aW9uaW5nOwotCQlyb3VuZFJvYmluUGFydGl0aW9uaW5nID0gbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HLCBvbGRSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nIDxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpcm91bmRSb2JpblBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Um91bmRSb2JpblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcobmV3Um91bmRSb2JpblBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBpbm5lZFBhcnRpdGlvbmluZyhYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1Bpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHBpbm5lZFBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBuZXdQaW5uZWRQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIG9sZFBpbm5lZFBhcnRpdGlvbmluZyA9IHBpbm5lZFBhcnRpdGlvbmluZzsKLQkJcGlubmVkUGFydGl0aW9uaW5nID0gbmV3UGlubmVkUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QSU5ORURfUEFSVElUSU9OSU5HLCBvbGRQaW5uZWRQYXJ0aXRpb25pbmcsIG5ld1Bpbm5lZFBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjZ2V0UGlubmVkUGFydGl0aW9uaW5nIDxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQaW5uZWRQYXJ0aXRpb25pbmcoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBuZXdQaW5uZWRQYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3UGlubmVkUGFydGl0aW9uaW5nICE9IHBpbm5lZFBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocGlubmVkUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBpbm5lZFBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BJTk5FRF9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Bpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQaW5uZWRQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QSU5ORURfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBpbm5lZFBhcnRpdGlvbmluZyhuZXdQaW5uZWRQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUElOTkVEX1BBUlRJVElPTklORywgbmV3UGlubmVkUGFydGl0aW9uaW5nLCBuZXdQaW5uZWRQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJhbmdlUGFydGl0aW9uaW5nKFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9SYW5nZVBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIGdldFJhbmdlUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiByYW5nZVBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSYW5nZVBhcnRpdGlvbmluZyhYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgbmV3UmFuZ2VQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgb2xkUmFuZ2VQYXJ0aXRpb25pbmcgPSByYW5nZVBhcnRpdGlvbmluZzsKLQkJcmFuZ2VQYXJ0aXRpb25pbmcgPSBuZXdSYW5nZVBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUkFOR0VfUEFSVElUSU9OSU5HLCBvbGRSYW5nZVBhcnRpdGlvbmluZywgbmV3UmFuZ2VQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldFJhbmdlUGFydGl0aW9uaW5nIDxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSYW5nZVBhcnRpdGlvbmluZyhYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgbmV3UmFuZ2VQYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3UmFuZ2VQYXJ0aXRpb25pbmcgIT0gcmFuZ2VQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJhbmdlUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJhbmdlUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUkFOR0VfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSYW5nZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSYW5nZVBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSYW5nZVBhcnRpdGlvbmluZyhuZXdSYW5nZVBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19SQU5HRV9QQVJUSVRJT05JTkcsIG5ld1JhbmdlUGFydGl0aW9uaW5nLCBuZXdSYW5nZVBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VmFsdWVQYXJ0aXRpb25pbmcoWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1ZhbHVlUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHZhbHVlUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiBuZXdWYWx1ZVBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiBvbGRWYWx1ZVBhcnRpdGlvbmluZyA9IHZhbHVlUGFydGl0aW9uaW5nOwotCQl2YWx1ZVBhcnRpdGlvbmluZyA9IG5ld1ZhbHVlUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19WQUxVRV9QQVJUSVRJT05JTkcsIG9sZFZhbHVlUGFydGl0aW9uaW5nLCBuZXdWYWx1ZVBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjZ2V0VmFsdWVQYXJ0aXRpb25pbmcgPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiBuZXdWYWx1ZVBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdWYWx1ZVBhcnRpdGlvbmluZyAhPSB2YWx1ZVBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodmFsdWVQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdmFsdWVQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19WQUxVRV9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ZhbHVlUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1ZhbHVlUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVkFMVUVfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFZhbHVlUGFydGl0aW9uaW5nKG5ld1ZhbHVlUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1ZBTFVFX1BBUlRJVElPTklORywgbmV3VmFsdWVQYXJ0aXRpb25pbmcsIG5ld1ZhbHVlUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRIYXNoUGFydGl0aW9uaW5nKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX0hhc2hQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIGdldEhhc2hQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIGhhc2hQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SGFzaFBhcnRpdGlvbmluZyhYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBuZXdIYXNoUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgb2xkSGFzaFBhcnRpdGlvbmluZyA9IGhhc2hQYXJ0aXRpb25pbmc7Ci0JCWhhc2hQYXJ0aXRpb25pbmcgPSBuZXdIYXNoUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19IQVNIX1BBUlRJVElPTklORywgb2xkSGFzaFBhcnRpdGlvbmluZywgbmV3SGFzaFBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjZ2V0SGFzaFBhcnRpdGlvbmluZyA8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRIYXNoUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFzaFBhcnRpdGlvbmluZyhYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBuZXdIYXNoUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld0hhc2hQYXJ0aXRpb25pbmcgIT0gaGFzaFBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoaGFzaFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCloYXNoUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSEFTSF9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0hhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SGFzaFBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0hBU0hfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEhhc2hQYXJ0aXRpb25pbmcobmV3SGFzaFBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19IQVNIX1BBUlRJVElPTklORywgbmV3SGFzaFBhcnRpdGlvbmluZywgbmV3SGFzaFBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuaW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VW5pb25QYXJ0aXRpb25pbmcoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1VuaW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgZ2V0VW5pb25QYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHVuaW9uUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFVuaW9uUGFydGl0aW9uaW5nKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiBuZXdVbmlvblBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiBvbGRVbmlvblBhcnRpdGlvbmluZyA9IHVuaW9uUGFydGl0aW9uaW5nOwotCQl1bmlvblBhcnRpdGlvbmluZyA9IG5ld1VuaW9uUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19VTklPTl9QQVJUSVRJT05JTkcsIG9sZFVuaW9uUGFydGl0aW9uaW5nLCBuZXdVbmlvblBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjZ2V0VW5pb25QYXJ0aXRpb25pbmcgPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRVbmlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuaW9uUGFydGl0aW9uaW5nKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiBuZXdVbmlvblBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdVbmlvblBhcnRpdGlvbmluZyAhPSB1bmlvblBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodW5pb25QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdW5pb25QYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19VTklPTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1VuaW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1VuaW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVU5JT05fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFVuaW9uUGFydGl0aW9uaW5nKG5ld1VuaW9uUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1VOSU9OX1BBUlRJVElPTklORywgbmV3VW5pb25QYXJ0aXRpb25pbmcsIG5ld1VuaW9uUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFydGl0aW9uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJ0aXRpb25lZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGFydGl0aW9uZWQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25lZCgpCi0JewotCQlyZXR1cm4gcGFydGl0aW9uZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjZ2V0UGFydGl0aW9uZWQgPGVtPlBhcnRpdGlvbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFydGl0aW9uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0aXRpb25lZChTdHJpbmcgbmV3UGFydGl0aW9uZWQpCi0JewotCQlTdHJpbmcgb2xkUGFydGl0aW9uZWQgPSBwYXJ0aXRpb25lZDsKLQkJcGFydGl0aW9uZWQgPSBuZXdQYXJ0aXRpb25lZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUEFSVElUSU9ORUQsIG9sZFBhcnRpdGlvbmVkLCBwYXJ0aXRpb25lZCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPbmVUb01hbnlfMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQl7Ci0JCXJldHVybiBjYXNjYWRlT25EZWxldGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhc2NhZGVPbkRlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVPbkRlbGV0ZShCb29sZWFuIG5ld0Nhc2NhZGVPbkRlbGV0ZSkKLQl7Ci0JCUJvb2xlYW4gb2xkQ2FzY2FkZU9uRGVsZXRlID0gY2FzY2FkZU9uRGVsZXRlOwotCQljYXNjYWRlT25EZWxldGUgPSBuZXdDYXNjYWRlT25EZWxldGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0NBU0NBREVfT05fREVMRVRFLCBvbGRDYXNjYWRlT25EZWxldGUsIGNhc2NhZGVPbkRlbGV0ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vbmNhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Tm9uY2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vbmNhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm9uY2FjaGVhYmxlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPbmVUb01hbnlfMl8yX05vbmNhY2hlYWJsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb25jYWNoZWFibGUoKQotCXsKLQkJcmV0dXJuIG5vbmNhY2hlYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSNpc05vbmNhY2hlYWJsZSA8ZW0+Tm9uY2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob25jYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzTm9uY2FjaGVhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9uY2FjaGVhYmxlKGJvb2xlYW4gbmV3Tm9uY2FjaGVhYmxlKQotCXsKLQkJYm9vbGVhbiBvbGROb25jYWNoZWFibGUgPSBub25jYWNoZWFibGU7Ci0JCW5vbmNhY2hlYWJsZSA9IG5ld05vbmNhY2hlYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTk9OQ0FDSEVBQkxFLCBvbGROb25jYWNoZWFibGUsIG5vbmNhY2hlYWJsZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlbGV0ZSBBbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlbGV0ZSBBbGw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsZXRlIEFsbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVsZXRlQWxsKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPbmVUb01hbnlfMl80X0RlbGV0ZUFsbCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWxldGVBbGwoKQotCXsKLQkJcmV0dXJuIGRlbGV0ZUFsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSNpc0RlbGV0ZUFsbCA8ZW0+RGVsZXRlIEFsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVsZXRlIEFsbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNEZWxldGVBbGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWxldGVBbGwoYm9vbGVhbiBuZXdEZWxldGVBbGwpCi0JewotCQlib29sZWFuIG9sZERlbGV0ZUFsbCA9IGRlbGV0ZUFsbDsKLQkJZGVsZXRlQWxsID0gbmV3RGVsZXRlQWxsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19ERUxFVEVfQUxMLCBvbGREZWxldGVBbGwsIGRlbGV0ZUFsbCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOwotCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFMsIG9sZEFjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQotCXsKLQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQotCXsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRUeXBlQ29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRPYmplY3RUeXBlQ29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3RydWN0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0JBVENIX0ZFVENIOgotCQkJCXJldHVybiBiYXNpY1NldEJhdGNoRmV0Y2gobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UGlubmVkUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UmFuZ2VQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRWYWx1ZVBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SGFzaFBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFVuaW9uUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0Q29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ09OVkVSVDoKLQkJCQlyZXR1cm4gZ2V0TWFwS2V5Q29udmVydCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19CQVRDSF9GRVRDSDoKLQkJCQlyZXR1cm4gZ2V0QmF0Y2hGZXRjaCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRSYW5nZVBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19WQUxVRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFZhbHVlUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRIYXNoUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0VW5pb25QYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUEFSVElUSU9ORUQ6Ci0JCQkJcmV0dXJuIGdldFBhcnRpdGlvbmVkKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0NBU0NBREVfT05fREVMRVRFOgotCQkJCXJldHVybiBnZXRDYXNjYWRlT25EZWxldGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTk9OQ0FDSEVBQkxFOgotCQkJCXJldHVybiBpc05vbmNhY2hlYWJsZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19ERUxFVEVfQUxMOgotCQkJCXJldHVybiBpc0RlbGV0ZUFsbCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVUeXBlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BSSVZBVEVfT1dORUQ6Ci0JCQkJcmV0dXJuIGlzUHJpdmF0ZU93bmVkKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0pPSU5fRkVUQ0g6Ci0JCQkJcmV0dXJuIGdldEpvaW5GZXRjaCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCWdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19DT05WRVJURVJTOgotCQkJCWdldENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldENvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbENvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlnZXRPYmplY3RUeXBlQ29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFN0cnVjdENvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJUOgotCQkJCXNldE1hcEtleUNvbnZlcnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19CQVRDSF9GRVRDSDoKLQkJCQlzZXRCYXRjaEZldGNoKChYbWxCYXRjaEZldGNoKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BBUlRJVElPTklORzoKLQkJCQlzZXRQYXJ0aXRpb25pbmcoKFhtbFBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKChYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXNldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UGlubmVkUGFydGl0aW9uaW5nKChYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlzZXRSYW5nZVBhcnRpdGlvbmluZygoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlzZXRWYWx1ZVBhcnRpdGlvbmluZygoWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXNldEhhc2hQYXJ0aXRpb25pbmcoKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlzZXRVbmlvblBhcnRpdGlvbmluZygoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BBUlRJVElPTkVEOgotCQkJCXNldFBhcnRpdGlvbmVkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQ0FTQ0FERV9PTl9ERUxFVEU6Ci0JCQkJc2V0Q2FzY2FkZU9uRGVsZXRlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX05PTkNBQ0hFQUJMRToKLQkJCQlzZXROb25jYWNoZWFibGUoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fREVMRVRFX0FMTDoKLQkJCQlzZXREZWxldGVBbGwoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUFJJVkFURV9PV05FRDoKLQkJCQlzZXRQcml2YXRlT3duZWQoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9GRVRDSDoKLQkJCQlzZXRKb2luRmV0Y2goKFhtbEpvaW5GZXRjaFR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQ09OVkVSVEVSUzoKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJUOgotCQkJCXNldE1hcEtleUNvbnZlcnQoTUFQX0tFWV9DT05WRVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0JBVENIX0ZFVENIOgotCQkJCXNldEJhdGNoRmV0Y2goKFhtbEJhdGNoRmV0Y2gpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UGFydGl0aW9uaW5nKChYbWxQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKChYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXNldFBpbm5lZFBhcnRpdGlvbmluZygoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlzZXRSYW5nZVBhcnRpdGlvbmluZygoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXNldFZhbHVlUGFydGl0aW9uaW5nKChYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlzZXRIYXNoUGFydGl0aW9uaW5nKChYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlzZXRVbmlvblBhcnRpdGlvbmluZygoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUEFSVElUSU9ORUQ6Ci0JCQkJc2V0UGFydGl0aW9uZWQoUEFSVElUSU9ORURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQ0FTQ0FERV9PTl9ERUxFVEU6Ci0JCQkJc2V0Q2FzY2FkZU9uRGVsZXRlKENBU0NBREVfT05fREVMRVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX05PTkNBQ0hFQUJMRToKLQkJCQlzZXROb25jYWNoZWFibGUoTk9OQ0FDSEVBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0RFTEVURV9BTEw6Ci0JCQkJc2V0RGVsZXRlQWxsKERFTEVURV9BTExfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKEFUVFJJQlVURV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BSSVZBVEVfT1dORUQ6Ci0JCQkJc2V0UHJpdmF0ZU93bmVkKFBSSVZBVEVfT1dORURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9GRVRDSDoKLQkJCQlzZXRKb2luRmV0Y2goSk9JTl9GRVRDSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIG1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzICE9IG51bGwgJiYgIW1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gY29udmVydGVycyAhPSBudWxsICYmICFjb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiB0eXBlQ29udmVydGVycyAhPSBudWxsICYmICF0eXBlQ29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIW9iamVjdFR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcnMgIT0gbnVsbCAmJiAhc3RydWN0Q29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ09OVkVSVDoKLQkJCQlyZXR1cm4gTUFQX0tFWV9DT05WRVJUX0VERUZBVUxUID09IG51bGwgPyBtYXBLZXlDb252ZXJ0ICE9IG51bGwgOiAhTUFQX0tFWV9DT05WRVJUX0VERUZBVUxULmVxdWFscyhtYXBLZXlDb252ZXJ0KTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQkFUQ0hfRkVUQ0g6Ci0JCQkJcmV0dXJuIGJhdGNoRmV0Y2ggIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBwYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiByZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcGlubmVkUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcmFuZ2VQYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiB2YWx1ZVBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gaGFzaFBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHVuaW9uUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BBUlRJVElPTkVEOgotCQkJCXJldHVybiBQQVJUSVRJT05FRF9FREVGQVVMVCA9PSBudWxsID8gcGFydGl0aW9uZWQgIT0gbnVsbCA6ICFQQVJUSVRJT05FRF9FREVGQVVMVC5lcXVhbHMocGFydGl0aW9uZWQpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19DQVNDQURFX09OX0RFTEVURToKLQkJCQlyZXR1cm4gQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNhc2NhZGVPbkRlbGV0ZSAhPSBudWxsIDogIUNBU0NBREVfT05fREVMRVRFX0VERUZBVUxULmVxdWFscyhjYXNjYWRlT25EZWxldGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19OT05DQUNIRUFCTEU6Ci0JCQkJcmV0dXJuIG5vbmNhY2hlYWJsZSAhPSBOT05DQUNIRUFCTEVfRURFRkFVTFQ7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0RFTEVURV9BTEw6Ci0JCQkJcmV0dXJuIGRlbGV0ZUFsbCAhPSBERUxFVEVfQUxMX0VERUZBVUxUOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGF0dHJpYnV0ZVR5cGUgIT0gbnVsbCA6ICFBVFRSSUJVVEVfVFlQRV9FREVGQVVMVC5lcXVhbHMoYXR0cmlidXRlVHlwZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BSSVZBVEVfT1dORUQ6Ci0JCQkJcmV0dXJuIHByaXZhdGVPd25lZCAhPSBQUklWQVRFX09XTkVEX0VERUZBVUxUOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19KT0lOX0ZFVENIOgotCQkJCXJldHVybiBqb2luRmV0Y2ggIT0gSk9JTl9GRVRDSF9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfMjBfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19TVFJVQ1RfQ09OVkVSVEVSUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ09OVkVSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9fTUFQX0tFWV9DT05WRVJUOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9uZVRvTWFueV8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXRjaEZldGNoSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19CQVRDSF9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX19CQVRDSF9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPbmVUb01hbnlfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QSU5ORURfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QSU5ORURfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUkFOR0VfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19WQUxVRV9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1ZBTFVFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0hBU0hfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1VOSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVU5JT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUEFSVElUSU9ORUQ6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTkVEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9uZVRvTWFueV8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0NBU0NBREVfT05fREVMRVRFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfT05FX1RPX01BTllfMjJfX0NBU0NBREVfT05fREVMRVRFOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTk9OQ0FDSEVBQkxFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfT05FX1RPX01BTllfMjJfX05PTkNBQ0hFQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPbmVUb01hbnlfMl80LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19ERUxFVEVfQUxMOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5YTUxfT05FX1RPX01BTllfMjRfX0RFTEVURV9BTEw7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByaXZhdGVPd25lZC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUFJJVkFURV9PV05FRDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJVkFURV9PV05FRF9fUFJJVkFURV9PV05FRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luRmV0Y2guY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0pPSU5fRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fRkVUQ0hfX0pPSU5fRkVUQ0g7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfMjBfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVyQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19TVFJVQ1RfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVJTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19NQVBfS0VZX0NPTlZFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NPTlZFUlQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sT25lVG9NYW55XzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEJhdGNoRmV0Y2hIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX19CQVRDSF9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0JBVENIX0ZFVENIOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9uZVRvTWFueV8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BJTk5FRF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JBTkdFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVkFMVUVfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVkFMVUVfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0hBU0hfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19VTklPTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19VTklPTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTkVEOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUEFSVElUSU9ORUQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sT25lVG9NYW55XzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfT05FX1RPX01BTllfMjJfX0NBU0NBREVfT05fREVMRVRFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQ0FTQ0FERV9PTl9ERUxFVEU7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV8yMl9fTk9OQ0FDSEVBQkxFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTk9OQ0FDSEVBQkxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9uZVRvTWFueV8yXzQuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UuWE1MX09ORV9UT19NQU5ZXzI0X19ERUxFVEVfQUxMOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fREVMRVRFX0FMTDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FUVFJJQlVURV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJpdmF0ZU93bmVkLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSVZBVEVfT1dORURfX1BSSVZBVEVfT1dORUQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUklWQVRFX09XTkVEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEpvaW5GZXRjaC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX0ZFVENIX19KT0lOX0ZFVENIOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1hcEtleUNvbnZlcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1hcEtleUNvbnZlcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhcnRpdGlvbmVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJ0aXRpb25lZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FzY2FkZU9uRGVsZXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXNjYWRlT25EZWxldGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vbmNhY2hlYWJsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobm9uY2FjaGVhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWxldGVBbGw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlbGV0ZUFsbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXR0cmlidXRlVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXR0cmlidXRlVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJpdmF0ZU93bmVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcml2YXRlT3duZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGpvaW5GZXRjaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoam9pbkZldGNoKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UHJpdmF0ZU93bmVkVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZShFY2xpcHNlTGluay5QUklWQVRFX09XTkVEKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0QXR0cmlidXRlVHlwZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShFY2xpcHNlTGluazJfMS5BVFRSSUJVVEVfVFlQRSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnkoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRhcmdldEVudGl0eVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwcGVkQnlUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9ycGhhblJlbW92YWxUcmFuc2xhdG9yKCksCi0JCQlidWlsZEF0dHJpYnV0ZVR5cGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9yZGVyQnlUcmFuc2xhdG9yKCksCi0JCQlYbWxPcmRlckNvbHVtbi5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLk9SREVSX0NPTFVNTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9yZGVyYWJsZV8yXzBfT3JkZXJDb2x1bW4oKSksCQkKLQkJCWJ1aWxkTWFwS2V5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlDbGFzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5VGVtcG9yYWxUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUVudW1lcmF0ZWRUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUNvbnZlcnRUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlDb2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU3RydWN0Q29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKb2luVGFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZENhc2NhZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhc2NhZGVPbkRlbGV0ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJpdmF0ZU93bmVkVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKb2luRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZEJhdGNoRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpLAotCQkJYnVpbGROb25jYWNoZWFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZERlbGV0ZUFsbFRyYW5zbGF0b3IoKSwKLQkJICAgIFhtbFBhcnRpdGlvbmluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuUEFSVElUSU9OSU5HLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGFydGl0aW9uaW5nKCkpLAotCQkJWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlJFUExJQ0FUSU9OX1BBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkpLAotCQkJWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUm91bmRSb2JpblBhcnRpdGlvbmluZygpKSwKLQkJCVhtbFBpbm5lZFBhcnRpdGlvbmluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuUElOTkVEX1BBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1Bpbm5lZFBhcnRpdGlvbmluZygpKSwKLQkJCVhtbFJhbmdlUGFydGl0aW9uaW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5SQU5HRV9QQVJUSVRJT05JTkcsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9SYW5nZVBhcnRpdGlvbmluZygpKSwKLQkJCVhtbFZhbHVlUGFydGl0aW9uaW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5WQUxVRV9QQVJUSVRJT05JTkcsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9WYWx1ZVBhcnRpdGlvbmluZygpKSwKLQkJCVhtbEhhc2hQYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLkhBU0hfUEFSVElUSU9OSU5HLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfSGFzaFBhcnRpdGlvbmluZygpKSwKLQkJCVhtbFVuaW9uUGFydGl0aW9uaW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5VTklPTl9QQVJUSVRJT05JTkcsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9VbmlvblBhcnRpdGlvbmluZygpKSwKLQkJCWJ1aWxkUGFydGl0aW9uZWRUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE1hcEtleUNvbnZlcnRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBMl8wLk1BUF9LRVlfQ09OVkVSVCwgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wX01hcEtleUNvbnZlcnQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQXNzb2NpYXRpb25PdmVycmlkZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERSwgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzBfTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKSk7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX0NvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sVHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1R5cGVDb252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxTdHJ1Y3RDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1N0cnVjdENvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByaXZhdGVPd25lZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUklWQVRFX09XTkVELCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByaXZhdGVPd25lZF9Qcml2YXRlT3duZWQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEpvaW5GZXRjaFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5KT0lOX0ZFVENILCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEpvaW5GZXRjaF9Kb2luRmV0Y2goKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFByb3BlcnR5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFjY2Vzc01ldGhvZHMuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkFDQ0VTU19NRVRIT0RTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkFUVFJJQlVURV9UWVBFLCAgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX0F0dHJpYnV0ZVR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRCYXRjaEZldGNoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEJhdGNoRmV0Y2guYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkJBVENIX0ZFVENILCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhdGNoRmV0Y2hIb2xkZXJfQmF0Y2hGZXRjaCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYXNjYWRlT25EZWxldGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gQ2FzY2FkZVR5cGUuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLkNBU0NBREVfT05fREVMRVRFLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnlfMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRKb2luVGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sSm9pblRhYmxlLmJ1aWxkVHJhbnNsYXRvcihKUEEuSk9JTl9UQUJMRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSm9pblRhYmxlQ29udGFpbmVyX0pvaW5UYWJsZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROb25jYWNoZWFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuTk9OQ0FDSEVBQkxFLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnlfMl8yX05vbmNhY2hlYWJsZSgpKTsKLQl9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQYXJ0aXRpb25lZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5QQVJUSVRJT05JTkdfR1JPVVBfX1BBUlRJVElPTkVELCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGFydGl0aW9uZWQoKSk7Ci0JfQotICAgCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGVsZXRlQWxsVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl80LkRFTEVURV9BTEwsIEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9uZVRvTWFueV8yXzRfRGVsZXRlQWxsKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPbmVUb09uZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9uZVRvT25lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYWJlZmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9uZVRvT25lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGluazJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sT25lVG9PbmVfMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGluazJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSGFzaFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvT25lXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSYW5nZVBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLkVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgT25lIFRvIE9uZTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9uZVRvT25lKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE9uZVRvT25lIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSBpbXBsZW1lbnRzIFhtbE9uZVRvT25lXzJfMSwgWG1sT25lVG9PbmVfMl8yLCBYbWxBdHRyaWJ1dGVNYXBwaW5nLCBYbWxQcml2YXRlT3duZWQsIFhtbEpvaW5GZXRjaAotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhdGNoRmV0Y2goKSA8ZW0+QmF0Y2ggRmV0Y2g8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhdGNoRmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxCYXRjaEZldGNoIGJhdGNoRmV0Y2g7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJ0aXRpb25pbmcoKSA8ZW0+UGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxQYXJ0aXRpb25pbmdfMl8yIHBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkgPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkgPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIHJvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKSA8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBwaW5uZWRQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYW5nZVBhcnRpdGlvbmluZygpIDxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIHJhbmdlUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKSA8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiB2YWx1ZVBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhc2hQYXJ0aXRpb25pbmcoKSA8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhc2hQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBoYXNoUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5pb25QYXJ0aXRpb25pbmcoKSA8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVbmlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiB1bmlvblBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJ0aXRpb25lZCgpIDxlbT5QYXJ0aXRpb25lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFydGl0aW9uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRJVElPTkVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnRpdGlvbmVkKCkgPGVtPlBhcnRpdGlvbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYXJ0aXRpb25lZCA9IFBBUlRJVElPTkVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhc2NhZGVPbkRlbGV0ZSgpIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGNhc2NhZGVPbkRlbGV0ZSA9IENBU0NBREVfT05fREVMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTm9uQ2FjaGVhYmxlKCkgPGVtPk5vbiBDYWNoZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTm9uQ2FjaGVhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTk9OX0NBQ0hFQUJMRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNOb25DYWNoZWFibGUoKSA8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNOb25DYWNoZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG5vbkNhY2hlYWJsZSA9IE5PTl9DQUNIRUFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZVR5cGUgPSBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ByaXZhdGVPd25lZCgpIDxlbT5Qcml2YXRlIE93bmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1ByaXZhdGVPd25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBSSVZBVEVfT1dORURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJpdmF0ZU93bmVkKCkgPGVtPlByaXZhdGUgT3duZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUHJpdmF0ZU93bmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcml2YXRlT3duZWQgPSBQUklWQVRFX09XTkVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgWG1sSm9pbkZldGNoVHlwZSBKT0lOX0ZFVENIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpvaW5GZXRjaCgpIDxlbT5Kb2luIEZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKb2luRmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxKb2luRmV0Y2hUeXBlIGpvaW5GZXRjaCA9IEpPSU5fRkVUQ0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sT25lVG9PbmUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9PTkVfVE9fT05FOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QmF0Y2hGZXRjaChYbWxCYXRjaEZldGNoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcl9CYXRjaEZldGNoKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxCYXRjaEZldGNoIGdldEJhdGNoRmV0Y2goKQotCXsKLQkJcmV0dXJuIGJhdGNoRmV0Y2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QmF0Y2hGZXRjaChYbWxCYXRjaEZldGNoIG5ld0JhdGNoRmV0Y2gsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxCYXRjaEZldGNoIG9sZEJhdGNoRmV0Y2ggPSBiYXRjaEZldGNoOwotCQliYXRjaEZldGNoID0gbmV3QmF0Y2hGZXRjaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19CQVRDSF9GRVRDSCwgb2xkQmF0Y2hGZXRjaCwgbmV3QmF0Y2hGZXRjaCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSNnZXRCYXRjaEZldGNoIDxlbT5CYXRjaCBGZXRjaDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2g8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEJhdGNoRmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXRjaEZldGNoKFhtbEJhdGNoRmV0Y2ggbmV3QmF0Y2hGZXRjaCkKLQl7Ci0JCWlmIChuZXdCYXRjaEZldGNoICE9IGJhdGNoRmV0Y2gpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGJhdGNoRmV0Y2ggIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYmF0Y2hGZXRjaCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQkFUQ0hfRkVUQ0gsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0JhdGNoRmV0Y2ggIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QmF0Y2hGZXRjaCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQkFUQ0hfRkVUQ0gsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QmF0Y2hGZXRjaChuZXdCYXRjaEZldGNoLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQkFUQ0hfRkVUQ0gsIG5ld0JhdGNoRmV0Y2gsIG5ld0JhdGNoRmV0Y2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBhcnRpdGlvbmluZyhYbWxQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGFydGl0aW9uaW5nXzJfMiBnZXRQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQYXJ0aXRpb25pbmcoWG1sUGFydGl0aW9uaW5nXzJfMiBuZXdQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxQYXJ0aXRpb25pbmdfMl8yIG9sZFBhcnRpdGlvbmluZyA9IHBhcnRpdGlvbmluZzsKLQkJcGFydGl0aW9uaW5nID0gbmV3UGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BBUlRJVElPTklORywgb2xkUGFydGl0aW9uaW5nLCBuZXdQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUjZ2V0UGFydGl0aW9uaW5nIDxlbT5QYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFydGl0aW9uaW5nKFhtbFBhcnRpdGlvbmluZ18yXzIgbmV3UGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1BhcnRpdGlvbmluZyAhPSBwYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1BhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBhcnRpdGlvbmluZyhuZXdQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QQVJUSVRJT05JTkcsIG5ld1BhcnRpdGlvbmluZywgbmV3UGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiBnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG9sZFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nID0gcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JCXJlcGxpY2F0aW9uUGFydGl0aW9uaW5nID0gbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBvbGRSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSByZXBsaWNhdGlvblBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmVwbGljYXRpb25QYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORywgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcsIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIGdldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHJvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgb2xkUm91bmRSb2JpblBhcnRpdGlvbmluZyA9IHJvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0JCXJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgPSBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORywgb2xkUm91bmRSb2JpblBhcnRpdGlvbmluZywgbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nIDxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpcm91bmRSb2JpblBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBpbm5lZFBhcnRpdGlvbmluZyhYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1Bpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHBpbm5lZFBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBuZXdQaW5uZWRQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIG9sZFBpbm5lZFBhcnRpdGlvbmluZyA9IHBpbm5lZFBhcnRpdGlvbmluZzsKLQkJcGlubmVkUGFydGl0aW9uaW5nID0gbmV3UGlubmVkUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkcsIG9sZFBpbm5lZFBhcnRpdGlvbmluZywgbmV3UGlubmVkUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lI2dldFBpbm5lZFBhcnRpdGlvbmluZyA8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGlubmVkUGFydGl0aW9uaW5nKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgbmV3UGlubmVkUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1Bpbm5lZFBhcnRpdGlvbmluZyAhPSBwaW5uZWRQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwaW5uZWRQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Bpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQaW5uZWRQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UGlubmVkUGFydGl0aW9uaW5nKG5ld1Bpbm5lZFBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkcsIG5ld1Bpbm5lZFBhcnRpdGlvbmluZywgbmV3UGlubmVkUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSYW5nZVBhcnRpdGlvbmluZyhYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiBnZXRSYW5nZVBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcmFuZ2VQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmFuZ2VQYXJ0aXRpb25pbmcoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG5ld1JhbmdlUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG9sZFJhbmdlUGFydGl0aW9uaW5nID0gcmFuZ2VQYXJ0aXRpb25pbmc7Ci0JCXJhbmdlUGFydGl0aW9uaW5nID0gbmV3UmFuZ2VQYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HLCBvbGRSYW5nZVBhcnRpdGlvbmluZywgbmV3UmFuZ2VQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcgPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSYW5nZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhbmdlUGFydGl0aW9uaW5nKFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiBuZXdSYW5nZVBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdSYW5nZVBhcnRpdGlvbmluZyAhPSByYW5nZVBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmFuZ2VQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmFuZ2VQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JBTkdFX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmFuZ2VQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmFuZ2VQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JBTkdFX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSYW5nZVBhcnRpdGlvbmluZyhuZXdSYW5nZVBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JBTkdFX1BBUlRJVElPTklORywgbmV3UmFuZ2VQYXJ0aXRpb25pbmcsIG5ld1JhbmdlUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRWYWx1ZVBhcnRpdGlvbmluZyhYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfVmFsdWVQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiBnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gdmFsdWVQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VmFsdWVQYXJ0aXRpb25pbmcoWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIG5ld1ZhbHVlUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIG9sZFZhbHVlUGFydGl0aW9uaW5nID0gdmFsdWVQYXJ0aXRpb25pbmc7Ci0JCXZhbHVlUGFydGl0aW9uaW5nID0gbmV3VmFsdWVQYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HLCBvbGRWYWx1ZVBhcnRpdGlvbmluZywgbmV3VmFsdWVQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUjZ2V0VmFsdWVQYXJ0aXRpb25pbmcgPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiBuZXdWYWx1ZVBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdWYWx1ZVBhcnRpdGlvbmluZyAhPSB2YWx1ZVBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodmFsdWVQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdmFsdWVQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VmFsdWVQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VmFsdWVQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRWYWx1ZVBhcnRpdGlvbmluZyhuZXdWYWx1ZVBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORywgbmV3VmFsdWVQYXJ0aXRpb25pbmcsIG5ld1ZhbHVlUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRIYXNoUGFydGl0aW9uaW5nKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX0hhc2hQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIGdldEhhc2hQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIGhhc2hQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SGFzaFBhcnRpdGlvbmluZyhYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBuZXdIYXNoUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgb2xkSGFzaFBhcnRpdGlvbmluZyA9IGhhc2hQYXJ0aXRpb25pbmc7Ci0JCWhhc2hQYXJ0aXRpb25pbmcgPSBuZXdIYXNoUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0hBU0hfUEFSVElUSU9OSU5HLCBvbGRIYXNoUGFydGl0aW9uaW5nLCBuZXdIYXNoUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lI2dldEhhc2hQYXJ0aXRpb25pbmcgPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SGFzaFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc2hQYXJ0aXRpb25pbmcoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgbmV3SGFzaFBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdIYXNoUGFydGl0aW9uaW5nICE9IGhhc2hQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGhhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaGFzaFBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0hhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SGFzaFBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SGFzaFBhcnRpdGlvbmluZyhuZXdIYXNoUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkcsIG5ld0hhc2hQYXJ0aXRpb25pbmcsIG5ld0hhc2hQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFVuaW9uUGFydGl0aW9uaW5nKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9VbmlvblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIGdldFVuaW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB1bmlvblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRVbmlvblBhcnRpdGlvbmluZyhYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgbmV3VW5pb25QYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgb2xkVW5pb25QYXJ0aXRpb25pbmcgPSB1bmlvblBhcnRpdGlvbmluZzsKLQkJdW5pb25QYXJ0aXRpb25pbmcgPSBuZXdVbmlvblBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19VTklPTl9QQVJUSVRJT05JTkcsIG9sZFVuaW9uUGFydGl0aW9uaW5nLCBuZXdVbmlvblBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSNnZXRVbmlvblBhcnRpdGlvbmluZyA8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFVuaW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5pb25QYXJ0aXRpb25pbmcoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIG5ld1VuaW9uUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1VuaW9uUGFydGl0aW9uaW5nICE9IHVuaW9uUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh1bmlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl1bmlvblBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdVbmlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdVbmlvblBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFVuaW9uUGFydGl0aW9uaW5nKG5ld1VuaW9uUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HLCBuZXdVbmlvblBhcnRpdGlvbmluZywgbmV3VW5pb25QYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJ0aXRpb25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFydGl0aW9uZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhcnRpdGlvbmVkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QYXJ0aXRpb25lZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvbmVkKCkKLQl7Ci0JCXJldHVybiBwYXJ0aXRpb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lI2dldFBhcnRpdGlvbmVkIDxlbT5QYXJ0aXRpb25lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFydGl0aW9uZWQoU3RyaW5nIG5ld1BhcnRpdGlvbmVkKQotCXsKLQkJU3RyaW5nIG9sZFBhcnRpdGlvbmVkID0gcGFydGl0aW9uZWQ7Ci0JCXBhcnRpdGlvbmVkID0gbmV3UGFydGl0aW9uZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUEFSVElUSU9ORUQsIG9sZFBhcnRpdGlvbmVkLCBwYXJ0aXRpb25lZCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPbmVUb09uZV8yXzJfQ2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRDYXNjYWRlT25EZWxldGUoKQotCXsKLQkJcmV0dXJuIGNhc2NhZGVPbkRlbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lI2dldENhc2NhZGVPbkRlbGV0ZSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlT25EZWxldGUoQm9vbGVhbiBuZXdDYXNjYWRlT25EZWxldGUpCi0JewotCQlCb29sZWFuIG9sZENhc2NhZGVPbkRlbGV0ZSA9IGNhc2NhZGVPbkRlbGV0ZTsKLQkJY2FzY2FkZU9uRGVsZXRlID0gbmV3Q2FzY2FkZU9uRGVsZXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0NBU0NBREVfT05fREVMRVRFLCBvbGRDYXNjYWRlT25EZWxldGUsIGNhc2NhZGVPbkRlbGV0ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vbiBDYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm9uQ2FjaGVhYmxlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPbmVUb09uZV8yXzJfTm9uQ2FjaGVhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vbkNhY2hlYWJsZSgpCi0JewotCQlyZXR1cm4gbm9uQ2FjaGVhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUjaXNOb25DYWNoZWFibGUgPGVtPk5vbiBDYWNoZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzTm9uQ2FjaGVhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9uQ2FjaGVhYmxlKGJvb2xlYW4gbmV3Tm9uQ2FjaGVhYmxlKQotCXsKLQkJYm9vbGVhbiBvbGROb25DYWNoZWFibGUgPSBub25DYWNoZWFibGU7Ci0JCW5vbkNhY2hlYWJsZSA9IG5ld05vbkNhY2hlYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19OT05fQ0FDSEVBQkxFLCBvbGROb25DYWNoZWFibGUsIG5vbkNhY2hlYWJsZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByaXZhdGUgT3duZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByaXZhdGUgT3duZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJpdmF0ZU93bmVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcml2YXRlT3duZWRfUHJpdmF0ZU93bmVkKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVPd25lZCgpCi0JewotCQlyZXR1cm4gcHJpdmF0ZU93bmVkOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUjaXNQcml2YXRlT3duZWQgPGVtPlByaXZhdGUgT3duZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByaXZhdGUgT3duZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzUHJpdmF0ZU93bmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJpdmF0ZU93bmVkKGJvb2xlYW4gbmV3UHJpdmF0ZU93bmVkKQotCXsKLQkJYm9vbGVhbiBvbGRQcml2YXRlT3duZWQgPSBwcml2YXRlT3duZWQ7Ci0JCXByaXZhdGVPd25lZCA9IG5ld1ByaXZhdGVPd25lZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUklWQVRFX09XTkVELCBvbGRQcml2YXRlT3duZWQsIHByaXZhdGVPd25lZCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gRmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIEZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZQotCSAqIEBzZWUgI3NldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSm9pbkZldGNoX0pvaW5GZXRjaCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxKb2luRmV0Y2hUeXBlIGdldEpvaW5GZXRjaCgpCi0JewotCQlyZXR1cm4gam9pbkZldGNoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUjZ2V0Sm9pbkZldGNoIDxlbT5Kb2luIEZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIEZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZQotCSAqIEBzZWUgI2dldEpvaW5GZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlIG5ld0pvaW5GZXRjaCkKLQl7Ci0JCVhtbEpvaW5GZXRjaFR5cGUgb2xkSm9pbkZldGNoID0gam9pbkZldGNoOwotCQlqb2luRmV0Y2ggPSBuZXdKb2luRmV0Y2ggPT0gbnVsbCA/IEpPSU5fRkVUQ0hfRURFRkFVTFQgOiBuZXdKb2luRmV0Y2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fSk9JTl9GRVRDSCwgb2xkSm9pbkZldGNoLCBqb2luRmV0Y2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKLQkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFMsIG9sZEFjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCi0JewotCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpCi0JewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQl7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByb3BlcnR5PihYbWxQcm9wZXJ0eS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgpCi0JewotCQlyZXR1cm4gYXR0cmlidXRlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIG5ld0F0dHJpYnV0ZVR5cGUpCi0JewotCQlTdHJpbmcgb2xkQXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGU7Ci0JCWF0dHJpYnV0ZVR5cGUgPSBuZXdBdHRyaWJ1dGVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0FUVFJJQlVURV9UWVBFLCBvbGRBdHRyaWJ1dGVUeXBlLCBhdHRyaWJ1dGVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQkFUQ0hfRkVUQ0g6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QmF0Y2hGZXRjaChudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFBpbm5lZFBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UmFuZ2VQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFZhbHVlUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldEhhc2hQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFVuaW9uUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBiYXNpY1NldEFjY2Vzc01ldGhvZHMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19CQVRDSF9GRVRDSDoKLQkJCQlyZXR1cm4gZ2V0QmF0Y2hGZXRjaCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFBpbm5lZFBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19WQUxVRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFZhbHVlUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldEhhc2hQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFVuaW9uUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUEFSVElUSU9ORUQ6Ci0JCQkJcmV0dXJuIGdldFBhcnRpdGlvbmVkKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQ0FTQ0FERV9PTl9ERUxFVEU6Ci0JCQkJcmV0dXJuIGdldENhc2NhZGVPbkRlbGV0ZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX05PTl9DQUNIRUFCTEU6Ci0JCQkJcmV0dXJuIGlzTm9uQ2FjaGVhYmxlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZVR5cGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUklWQVRFX09XTkVEOgotCQkJCXJldHVybiBpc1ByaXZhdGVPd25lZCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0pPSU5fRkVUQ0g6Ci0JCQkJcmV0dXJuIGdldEpvaW5GZXRjaCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19CQVRDSF9GRVRDSDoKLQkJCQlzZXRCYXRjaEZldGNoKChYbWxCYXRjaEZldGNoKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUEFSVElUSU9OSU5HOgotCQkJCXNldFBhcnRpdGlvbmluZygoWG1sUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlzZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXNldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlzZXRQaW5uZWRQYXJ0aXRpb25pbmcoKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UmFuZ2VQYXJ0aXRpb25pbmcoKFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlzZXRWYWx1ZVBhcnRpdGlvbmluZygoWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0SGFzaFBhcnRpdGlvbmluZygoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0VW5pb25QYXJ0aXRpb25pbmcoKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BBUlRJVElPTkVEOgotCQkJCXNldFBhcnRpdGlvbmVkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19DQVNDQURFX09OX0RFTEVURToKLQkJCQlzZXRDYXNjYWRlT25EZWxldGUoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19OT05fQ0FDSEVBQkxFOgotCQkJCXNldE5vbkNhY2hlYWJsZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BSSVZBVEVfT1dORUQ6Ci0JCQkJc2V0UHJpdmF0ZU93bmVkKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fSk9JTl9GRVRDSDoKLQkJCQlzZXRKb2luRmV0Y2goKFhtbEpvaW5GZXRjaFR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19CQVRDSF9GRVRDSDoKLQkJCQlzZXRCYXRjaEZldGNoKChYbWxCYXRjaEZldGNoKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UGFydGl0aW9uaW5nKChYbWxQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXNldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXNldFBpbm5lZFBhcnRpdGlvbmluZygoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXNldFJhbmdlUGFydGl0aW9uaW5nKChYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlzZXRWYWx1ZVBhcnRpdGlvbmluZygoWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlzZXRIYXNoUGFydGl0aW9uaW5nKChYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFVuaW9uUGFydGl0aW9uaW5nKChYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BBUlRJVElPTkVEOgotCQkJCXNldFBhcnRpdGlvbmVkKFBBUlRJVElPTkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQ0FTQ0FERV9PTl9ERUxFVEU6Ci0JCQkJc2V0Q2FzY2FkZU9uRGVsZXRlKENBU0NBREVfT05fREVMRVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fTk9OX0NBQ0hFQUJMRToKLQkJCQlzZXROb25DYWNoZWFibGUoTk9OX0NBQ0hFQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoQVRUUklCVVRFX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUklWQVRFX09XTkVEOgotCQkJCXNldFByaXZhdGVPd25lZChQUklWQVRFX09XTkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fSk9JTl9GRVRDSDoKLQkJCQlzZXRKb2luRmV0Y2goSk9JTl9GRVRDSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19CQVRDSF9GRVRDSDoKLQkJCQlyZXR1cm4gYmF0Y2hGZXRjaCAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiByZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcm91bmRSb2JpblBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHBpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcmFuZ2VQYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19WQUxVRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHZhbHVlUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGhhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHVuaW9uUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUEFSVElUSU9ORUQ6Ci0JCQkJcmV0dXJuIFBBUlRJVElPTkVEX0VERUZBVUxUID09IG51bGwgPyBwYXJ0aXRpb25lZCAhPSBudWxsIDogIVBBUlRJVElPTkVEX0VERUZBVUxULmVxdWFscyhwYXJ0aXRpb25lZCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQ0FTQ0FERV9PTl9ERUxFVEU6Ci0JCQkJcmV0dXJuIENBU0NBREVfT05fREVMRVRFX0VERUZBVUxUID09IG51bGwgPyBjYXNjYWRlT25EZWxldGUgIT0gbnVsbCA6ICFDQVNDQURFX09OX0RFTEVURV9FREVGQVVMVC5lcXVhbHMoY2FzY2FkZU9uRGVsZXRlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19OT05fQ0FDSEVBQkxFOgotCQkJCXJldHVybiBub25DYWNoZWFibGUgIT0gTk9OX0NBQ0hFQUJMRV9FREVGQVVMVDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJcmV0dXJuIEFUVFJJQlVURV9UWVBFX0VERUZBVUxUID09IG51bGwgPyBhdHRyaWJ1dGVUeXBlICE9IG51bGwgOiAhQVRUUklCVVRFX1RZUEVfRURFRkFVTFQuZXF1YWxzKGF0dHJpYnV0ZVR5cGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BSSVZBVEVfT1dORUQ6Ci0JCQkJcmV0dXJuIHByaXZhdGVPd25lZCAhPSBQUklWQVRFX09XTkVEX0VERUZBVUxUOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0pPSU5fRkVUQ0g6Ci0JCQkJcmV0dXJuIGpvaW5GZXRjaCAhPSBKT0lOX0ZFVENIX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXRjaEZldGNoSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0JBVENIX0ZFVENIOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9IT0xERVJfX0JBVENIX0ZFVENIOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9uZVRvT25lXzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QSU5ORURfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JBTkdFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0hBU0hfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19VTklPTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BBUlRJVElPTkVEOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPbmVUb09uZV8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQ0FTQ0FERV9PTl9ERUxFVEU6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9PTkVfVE9fT05FXzIyX19DQVNDQURFX09OX0RFTEVURTsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fTk9OX0NBQ0hFQUJMRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX09ORV9UT19PTkVfMjJfX05PTl9DQUNIRUFCTEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByaXZhdGVPd25lZC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUklWQVRFX09XTkVEOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklWQVRFX09XTkVEX19QUklWQVRFX09XTkVEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEpvaW5GZXRjaC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19KT0lOX0ZFVENIOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX0ZFVENIX19KT0lOX0ZFVENIOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQmF0Y2hGZXRjaEhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9IT0xERVJfX0JBVENIX0ZFVENIOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19CQVRDSF9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPbmVUb09uZV8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkFOR0VfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1ZBTFVFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1VOSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUEFSVElUSU9ORUQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sT25lVG9PbmVfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9PTkVfVE9fT05FXzIyX19DQVNDQURFX09OX0RFTEVURTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQ0FTQ0FERV9PTl9ERUxFVEU7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9PTkVfVE9fT05FXzIyX19OT05fQ0FDSEVBQkxFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19OT05fQ0FDSEVBQkxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FUVFJJQlVURV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19BVFRSSUJVVEVfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcml2YXRlT3duZWQuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJVkFURV9PV05FRF9fUFJJVkFURV9PV05FRDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJJVkFURV9PV05FRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luRmV0Y2guY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9GRVRDSF9fSk9JTl9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fSk9JTl9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHBhcnRpdGlvbmVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJ0aXRpb25lZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FzY2FkZU9uRGVsZXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXNjYWRlT25EZWxldGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vbkNhY2hlYWJsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobm9uQ2FjaGVhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdHRyaWJ1dGVUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdHRyaWJ1dGVUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcml2YXRlT3duZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByaXZhdGVPd25lZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgam9pbkZldGNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChqb2luRmV0Y2gpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRQcml2YXRlT3duZWRUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rLlBSSVZBVEVfT1dORUQpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEpvaW5GZXRjaFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRBdHRyaWJ1dGVUeXBlVGV4dFJhbmdlKCkgewotCQkvL25vIGF0dHJpYnV0ZS10eXBlIGZvciBvbmUtdG8tb25lCi0JCXJldHVybiBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPbmVUb09uZSgpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVGFyZ2V0RW50aXR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRGZXRjaFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkT3B0aW9uYWxUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwcGVkQnlUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9ycGhhblJlbW92YWxUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcHNJZFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSWRUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKb2luQ29sdW1uVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKb2luVGFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhc2NhZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhc2NhZGVPbkRlbGV0ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJpdmF0ZU93bmVkVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKb2luRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZEJhdGNoRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpLAotCQkJYnVpbGROb25jYWNoZWFibGVUcmFuc2xhdG9yKCksCi0JCSAgICBYbWxQYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlBBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmluZygpKSwKLQkJCVhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9SZXBsaWNhdGlvblBhcnRpdGlvbmluZygpKSwKLQkJCVhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlJPVU5EX1JPQklOX1BBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKSksCi0JCQlYbWxQaW5uZWRQYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlBJTk5FRF9QQVJUSVRJT05JTkcsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QaW5uZWRQYXJ0aXRpb25pbmcoKSksCi0JCQlYbWxSYW5nZVBhcnRpdGlvbmluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuUkFOR0VfUEFSVElUSU9OSU5HLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKSksCi0JCQlYbWxWYWx1ZVBhcnRpdGlvbmluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuVkFMVUVfUEFSVElUSU9OSU5HLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfVmFsdWVQYXJ0aXRpb25pbmcoKSksCi0JCQlYbWxIYXNoUGFydGl0aW9uaW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5IQVNIX1BBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX0hhc2hQYXJ0aXRpb25pbmcoKSksCi0JCQlYbWxVbmlvblBhcnRpdGlvbmluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuVU5JT05fUEFSVElUSU9OSU5HLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfVW5pb25QYXJ0aXRpb25pbmcoKSksCi0JCQlidWlsZFBhcnRpdGlvbmVkVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcml2YXRlT3duZWRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJJVkFURV9PV05FRCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcml2YXRlT3duZWRfUHJpdmF0ZU93bmVkKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRKb2luRmV0Y2hUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxKb2luRmV0Y2hfSm9pbkZldGNoKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxQcm9wZXJ0eS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NNZXRob2RzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQmF0Y2hGZXRjaFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxCYXRjaEZldGNoLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5CQVRDSF9GRVRDSCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxCYXRjaEZldGNoSG9sZGVyX0JhdGNoRmV0Y2goKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2FzY2FkZU9uRGVsZXRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIENhc2NhZGVUeXBlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5DQVNDQURFX09OX0RFTEVURSwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT25lVG9PbmVfMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRKb2luVGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sSm9pblRhYmxlLmJ1aWxkVHJhbnNsYXRvcihKUEEuSk9JTl9UQUJMRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSm9pblRhYmxlQ29udGFpbmVyX0pvaW5UYWJsZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROb25jYWNoZWFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuTk9OQ0FDSEVBQkxFLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPbmVUb09uZV8yXzJfTm9uQ2FjaGVhYmxlKCkpOwotCX0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFBhcnRpdGlvbmVkVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlBBUlRJVElPTklOR19HUk9VUF9fUEFSVElUSU9ORUQsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QYXJ0aXRpb25lZCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT3B0aW1pc3RpY0xvY2tpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPcHRpbWlzdGljTG9ja2luZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTEwNzkyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPcHRpbWlzdGljTG9ja2luZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLkJvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBPcHRpbWlzdGljIExvY2tpbmc8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcjZ2V0Q2FzY2FkZSA8ZW0+Q2FzY2FkZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZyNnZXRTZWxlY3RlZENvbHVtbnMgPGVtPlNlbGVjdGVkIENvbHVtbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9wdGltaXN0aWNMb2NraW5nKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE9wdGltaXN0aWNMb2NraW5nIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXNjYWRlKCkgPGVtPkNhc2NhZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhc2NhZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBDQVNDQURFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhc2NhZGUoKSA8ZW0+Q2FzY2FkZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FzY2FkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gY2FzY2FkZSA9IENBU0NBREVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWxlY3RlZENvbHVtbnMoKSA8ZW0+U2VsZWN0ZWQgQ29sdW1uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWxlY3RlZENvbHVtbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxDb2x1bW4+IHNlbGVjdGVkQ29sdW1uczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxPcHRpbWlzdGljTG9ja2luZygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX09QVElNSVNUSUNfTE9DS0lORzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlCi0JICogQHNlZSAjc2V0VHlwZShYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPcHRpbWlzdGljTG9ja2luZ19UeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSBnZXRUeXBlKCkKLQl7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nVHlwZQotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSBuZXdUeXBlKQotCXsKLQkJWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZSA9PSBudWxsID8gVFlQRV9FREVGQVVMVCA6IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzY2FkZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPcHRpbWlzdGljTG9ja2luZ19DYXNjYWRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRDYXNjYWRlKCkKLQl7Ci0JCXJldHVybiBjYXNjYWRlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcjZ2V0Q2FzY2FkZSA8ZW0+Q2FzY2FkZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FzY2FkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhc2NhZGUoQm9vbGVhbiBuZXdDYXNjYWRlKQotCXsKLQkJQm9vbGVhbiBvbGRDYXNjYWRlID0gY2FzY2FkZTsKLQkJY2FzY2FkZSA9IG5ld0Nhc2NhZGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19DQVNDQURFLCBvbGRDYXNjYWRlLCBjYXNjYWRlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VsZWN0ZWQgQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlbGVjdGVkIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWxlY3RlZCBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfU2VsZWN0ZWRDb2x1bW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxDb2x1bW4+IGdldFNlbGVjdGVkQ29sdW1ucygpCi0JewotCQlpZiAoc2VsZWN0ZWRDb2x1bW5zID09IG51bGwpCi0JCXsKLQkJCXNlbGVjdGVkQ29sdW1ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxDb2x1bW4+KFhtbENvbHVtbi5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX1NFTEVDVEVEX0NPTFVNTlMpOwotCQl9Ci0JCXJldHVybiBzZWxlY3RlZENvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19TRUxFQ1RFRF9DT0xVTU5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U2VsZWN0ZWRDb2x1bW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19DQVNDQURFOgotCQkJCXJldHVybiBnZXRDYXNjYWRlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19TRUxFQ1RFRF9DT0xVTU5TOgotCQkJCXJldHVybiBnZXRTZWxlY3RlZENvbHVtbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19UWVBFOgotCQkJCXNldFR5cGUoKFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fQ0FTQ0FERToKLQkJCQlzZXRDYXNjYWRlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19TRUxFQ1RFRF9DT0xVTU5TOgotCQkJCWdldFNlbGVjdGVkQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VsZWN0ZWRDb2x1bW5zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxDb2x1bW4+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fQ0FTQ0FERToKLQkJCQlzZXRDYXNjYWRlKENBU0NBREVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX1NFTEVDVEVEX0NPTFVNTlM6Ci0JCQkJZ2V0U2VsZWN0ZWRDb2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fVFlQRToKLQkJCQlyZXR1cm4gdHlwZSAhPSBUWVBFX0VERUZBVUxUOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fQ0FTQ0FERToKLQkJCQlyZXR1cm4gQ0FTQ0FERV9FREVGQVVMVCA9PSBudWxsID8gY2FzY2FkZSAhPSBudWxsIDogIUNBU0NBREVfRURFRkFVTFQuZXF1YWxzKGNhc2NhZGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fU0VMRUNURURfQ09MVU1OUzoKLQkJCQlyZXR1cm4gc2VsZWN0ZWRDb2x1bW5zICE9IG51bGwgJiYgIXNlbGVjdGVkQ29sdW1ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhc2NhZGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhc2NhZGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRUeXBlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXNjYWRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTZWxlY3RlZENvbHVtblRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5PUFRJTUlTVElDX0xPQ0tJTkdfX1RZUEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYXNjYWRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBCb29sZWFuVHJhbnNsYXRvcihFY2xpcHNlTGluay5PUFRJTUlTVElDX0xPQ0tJTkdfX0NBU0NBREUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfQ2FzY2FkZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTZWxlY3RlZENvbHVtblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDb2x1bW4uYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9QVElNSVNUSUNfTE9DS0lOR19fU0VMRUNURURfQ09MVU1OLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9wdGltaXN0aWNMb2NraW5nX1NlbGVjdGVkQ29sdW1ucygpKTsKLQl9Ci0KLX0gLy8gWG1sT3B0aW1pc3RpY0xvY2tpbmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA4OTM0YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+WG1sIE9wdGltaXN0aWMgTG9ja2luZyBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+QUxMIENPTFVNTlM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQUxMX0NPTFVNTlNfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlBTExfQ09MVU1OUygwLCAiQUxMX0NPTFVNTlMiLCAiQUxMX0NPTFVNTlMiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNIQU5HRUQgQ09MVU1OUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDSEFOR0VEX0NPTFVNTlNfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlDSEFOR0VEX0NPTFVNTlMoMSwgIkNIQU5HRURfQ09MVU1OUyIsICJDSEFOR0VEX0NPTFVNTlMiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNFTEVDVEVEIENPTFVNTlM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0VMRUNURURfQ09MVU1OU19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVNFTEVDVEVEX0NPTFVNTlMoMiwgIlNFTEVDVEVEX0NPTFVNTlMiLCAiU0VMRUNURURfQ09MVU1OUyIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VkVSU0lPTiBDT0xVTU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVkVSU0lPTl9DT0xVTU5fVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlWRVJTSU9OX0NPTFVNTigzLCAiVkVSU0lPTl9DT0xVTU4iLCAiVkVSU0lPTl9DT0xVTU4iKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFMTCBDT0xVTU5TPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5BTEwgQ09MVU1OUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBTExfQ09MVU1OUwotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTF9DT0xVTU5TX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNIQU5HRUQgQ09MVU1OUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q0hBTkdFRCBDT0xVTU5TPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NIQU5HRURfQ09MVU1OUwotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5HRURfQ09MVU1OU19WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TRUxFQ1RFRCBDT0xVTU5TPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TRUxFQ1RFRCBDT0xVTU5TPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NFTEVDVEVEX0NPTFVNTlMKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RFRF9DT0xVTU5TX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlZFUlNJT04gQ09MVU1OPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5WRVJTSU9OIENPTFVNTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNWRVJTSU9OX0NPTFVNTgotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fQ09MVU1OX1ZBTFVFID0gMzsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5YbWwgT3B0aW1pc3RpYyBMb2NraW5nIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGVbXQotCQl7Ci0JCQlBTExfQ09MVU1OUywKLQkJCUNIQU5HRURfQ09MVU1OUywKLQkJCVNFTEVDVEVEX0NPTFVNTlMsCi0JCQlWRVJTSU9OX0NPTFVNTiwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5YbWwgT3B0aW1pc3RpYyBMb2NraW5nIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIE9wdGltaXN0aWMgTG9ja2luZyBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIE9wdGltaXN0aWMgTG9ja2luZyBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgT3B0aW1pc3RpYyBMb2NraW5nIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUgZ2V0KGludCB2YWx1ZSkKLQl7Ci0JCXN3aXRjaCAodmFsdWUpCi0JCXsKLQkJCWNhc2UgQUxMX0NPTFVNTlNfVkFMVUU6IHJldHVybiBBTExfQ09MVU1OUzsKLQkJCWNhc2UgQ0hBTkdFRF9DT0xVTU5TX1ZBTFVFOiByZXR1cm4gQ0hBTkdFRF9DT0xVTU5TOwotCQkJY2FzZSBTRUxFQ1RFRF9DT0xVTU5TX1ZBTFVFOiByZXR1cm4gU0VMRUNURURfQ09MVU1OUzsKLQkJCWNhc2UgVkVSU0lPTl9DT0xVTU5fVkFMVUU6IHJldHVybiBWRVJTSU9OX0NPTFVNTjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQotCXsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQotCXsKLQkgIHJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkgIHJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCi0JewotCSAgcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCXJldHVybiBsaXRlcmFsOwotCX0KLQkKLX0gLy9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPcmRlckNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9yZGVyQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MjczYTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9yZGVyQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGluazJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgT3JkZXIgQ29sdW1uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9yZGVyQ29sdW1uKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE9yZGVyQ29sdW1uIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlckNvbHVtbiBpbXBsZW1lbnRzIFhtbE9yZGVyQ29sdW1uXzJfMAotewotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAgQ09SUkVDVElPTl9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvcnJlY3Rpb25UeXBlKCkgPGVtPkNvcnJlY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29ycmVjdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCBjb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RJT05fVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxPcmRlckNvbHVtbigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX09SREVSX0NPTFVNTjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3JyZWN0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzB9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29ycmVjdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvcnJlY3Rpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAKLQkgKiBAc2VlICNzZXRDb3JyZWN0aW9uVHlwZShPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9yZGVyQ29sdW1uXzJfMF9Db3JyZWN0aW9uVHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCBnZXRDb3JyZWN0aW9uVHlwZSgpCi0JewotCQlyZXR1cm4gY29ycmVjdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlckNvbHVtbiNnZXRDb3JyZWN0aW9uVHlwZSA8ZW0+Q29ycmVjdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3JyZWN0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9yZGVyQ29ycmVjdGlvblR5cGVfMl8wCi0JICogQHNlZSAjZ2V0Q29ycmVjdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3JyZWN0aW9uVHlwZShPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCBuZXdDb3JyZWN0aW9uVHlwZSkKLQl7Ci0JCU9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIG9sZENvcnJlY3Rpb25UeXBlID0gY29ycmVjdGlvblR5cGU7Ci0JCWNvcnJlY3Rpb25UeXBlID0gbmV3Q29ycmVjdGlvblR5cGUgPT0gbnVsbCA/IENPUlJFQ1RJT05fVFlQRV9FREVGQVVMVCA6IG5ld0NvcnJlY3Rpb25UeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fQ09SUkVDVElPTl9UWVBFLCBvbGRDb3JyZWN0aW9uVHlwZSwgY29ycmVjdGlvblR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX0NPUlJFQ1RJT05fVFlQRToKLQkJCQlyZXR1cm4gZ2V0Q29ycmVjdGlvblR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19DT1JSRUNUSU9OX1RZUEU6Ci0JCQkJc2V0Q29ycmVjdGlvblR5cGUoKE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19DT1JSRUNUSU9OX1RZUEU6Ci0JCQkJc2V0Q29ycmVjdGlvblR5cGUoQ09SUkVDVElPTl9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fQ09SUkVDVElPTl9UWVBFOgotCQkJCXJldHVybiBjb3JyZWN0aW9uVHlwZSAhPSBDT1JSRUNUSU9OX1RZUEVfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9yZGVyQ29sdW1uXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX0NPUlJFQ1RJT05fVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl8yMF9fQ09SUkVDVElPTl9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sT3JkZXJDb2x1bW5fMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fMjBfX0NPUlJFQ1RJT05fVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19DT1JSRUNUSU9OX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb3JyZWN0aW9uVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29ycmVjdGlvblR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLAotCQkJVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE51bGxhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRJbnNlcnRhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRVcGRhdGFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbHVtbkRlZmluaXRpb25UcmFuc2xhdG9yKCksCi0JCQlidWlsZENvcnJlY3Rpb25UeXBlVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkJCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29ycmVjdGlvblR5cGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuQ09SUkVDVElPTl9UWVBFLCBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPcmRlckNvbHVtbl8yXzBfQ29ycmVjdGlvblR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGFydGl0aW9uaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGFydGl0aW9uaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNGNhNWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFBhcnRpdGlvbmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxQYXJ0aXRpb25pbmcgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxQYXJ0aXRpb25pbmdfMl8yCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfUEFSVElUSU9OSU5HOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdfMl8yX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGFydGl0aW9uaW5nI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nKCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk5BTUUsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ18yXzJfTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotfSAvLyBYbWxQYXJ0aXRpb25pbmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZWRjYjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmsyXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGltcGxlbWVudHMgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xLCBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzMKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSA8ZW0+VGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zPiB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7Ci0JCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQotCXsKLQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY2Nlc3NNZXRob2RzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRlbmFudCBEaXNjcmltaW5hdG9yIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRlbmFudCBEaXNjcmltaW5hdG9yIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzNfVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zPiBnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpCi0JewotCQlpZiAodGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMgPT0gbnVsbCkKLQkJewotCQkJdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzM+KFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlMpOwotCQl9Ci0JCXJldHVybiB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OUzoKLQkJCQlyZXR1cm4gZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlM6Ci0JCQkJZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5jbGVhcigpOwotCQkJCWdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TOgotCQkJCWdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OUzoKLQkJCQlyZXR1cm4gdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMgIT0gbnVsbCAmJiAhdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU18yM19fVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8zLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTXzIzX19URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCksCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCi0JCQlidWlsZFNjaGVtYVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRGVsaW1pdGVkSWRlbnRpZmllcnNUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2FzY2FkZVBlcnNpc3RUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFbnRpdHlMaXN0ZW5lcnNUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NNZXRob2RzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbi5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzMuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OLCBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzNfVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSk7Ci0JfQotfSAvLyBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNlYzFiYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSNpc0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGNsdWRlRGVmYXVsdE1hcHBpbmdzID0gRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JewotCQlyZXR1cm4gZXhjbHVkZURlZmF1bHRNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhI2lzRXhjbHVkZURlZmF1bHRNYXBwaW5ncyA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoYm9vbGVhbiBuZXdFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKQotCXsKLQkJYm9vbGVhbiBvbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzID0gZXhjbHVkZURlZmF1bHRNYXBwaW5nczsKLQkJZXhjbHVkZURlZmF1bHRNYXBwaW5ncyA9IG5ld0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTLCBvbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzLCBleGNsdWRlRGVmYXVsdE1hcHBpbmdzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTOgotCQkJCXJldHVybiBpc0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTOgotCQkJCXNldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6Ci0JCQkJc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyhFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTOgotCQkJCXJldHVybiBleGNsdWRlRGVmYXVsdE1hcHBpbmdzICE9IEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZXhjbHVkZURlZmF1bHRNYXBwaW5nczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXhjbHVkZURlZmF1bHRNYXBwaW5ncyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZERlc2NyaXB0aW9uVHJhbnNsYXRvcigpLAotCQkJYnVpbGRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRXhjbHVkZURlZmF1bHRNYXBwaW5nc1RyYW5zbGF0b3IoKSwKLQkJCVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmJ1aWxkVHJhbnNsYXRvcihKUEEuUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRXhjbHVkZURlZmF1bHRNYXBwaW5nc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihFY2xpcHNlTGluay5FWENMVURFX0RFRkFVTFRfTUFQUElOR1MsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGlubmVkUGFydGl0aW9uaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGlubmVkUGFydGl0aW9uaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZDNiMDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFBpbm5lZFBhcnRpdGlvbmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQaW5uZWRQYXJ0aXRpb25pbmcoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sUGlubmVkUGFydGl0aW9uaW5nIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFBpbm5lZFBhcnRpdGlvbmluZygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1BJTk5FRF9QQVJUSVRJT05JTkc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzJfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQaW5uZWRQYXJ0aXRpb25pbmcjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BJTk5FRF9QQVJUSVRJT05JTkdfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QSU5ORURfUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BJTk5FRF9QQVJUSVRJT05JTkdfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUElOTkVEX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUElOTkVEX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGlubmVkUGFydGl0aW9uaW5nKCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5OQU1FLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci19IC8vIFhtbFBpbm5lZFBhcnRpdGlvbmluZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFBsc3FsUmVjb3JkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGxzcWxSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUxMWY5YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGxzcWxSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGluazJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sUGxzcWxSZWNvcmRfMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQbHNxbCBSZWNvcmQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGxzcWxSZWNvcmQoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sUGxzcWxSZWNvcmQgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxQbHNxbFJlY29yZF8yXzMKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGxzcWxSZWNvcmQoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9QTFNRTF9SRUNPUkQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQbHNxbFJlY29yZF8yXzNfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQbHNxbFJlY29yZCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUExTUUxfUkVDT1JEX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUExTUUxfUkVDT1JEX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BMU1FMX1JFQ09SRF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QTFNRTF9SRUNPUkRfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BMU1FMX1JFQ09SRF9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQbHNxbFJlY29yZCgpLAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMy5QTFNRTF9SRUNPUkRfX05BTUUsIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBsc3FsUmVjb3JkXzJfM19OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi19IC8vIFhtbFBsc3FsUmVjb3JkCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGxzcWxUYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFBsc3FsVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkzMzg3MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGxzcWxUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxQbHNxbFRhYmxlXzJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUGxzcWwgVGFibGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGxzcWxUYWJsZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxQbHNxbFRhYmxlIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sUGxzcWxUYWJsZV8yXzMKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGxzcWxUYWJsZSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1BMU1FMX1RBQkxFOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGxzcWxUYWJsZV8yXzNfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQbHNxbFRhYmxlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QTFNRTF9UQUJMRV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BMU1FMX1RBQkxFX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BMU1FMX1RBQkxFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BMU1FMX1RBQkxFX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QTFNRTF9UQUJMRV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQbHNxbFRhYmxlKCksCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzMuUExTUUxfVEFCTEVfX05BTUUsIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBsc3FsVGFibGVfMl8zX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci19IC8vIFhtbFBsc3FsVGFibGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQcmltYXJ5S2V5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUHJpbWFyeUtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzQ0YWE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQcmltYXJ5S2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5JZFZhbGlkYXRpb25UeXBlXzFfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sUHJpbWFyeUtleV8xXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkNhY2hlS2V5VHlwZV8yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxQcmltYXJ5S2V5XzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUHJpbWFyeSBLZXk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxQcmltYXJ5S2V5IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sUHJpbWFyeUtleV8xXzEsIFhtbFByaW1hcnlLZXlfMl8xCi17Ci0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSWRWYWxpZGF0aW9uVHlwZV8xXzEgVkFMSURBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0JCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsaWRhdGlvbigpIDxlbT5WYWxpZGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWxpZGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSWRWYWxpZGF0aW9uVHlwZV8xXzEgdmFsaWRhdGlvbiA9IFZBTElEQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2x1bW5zKCkgPGVtPkNvbHVtbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29sdW1ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbENvbHVtbj4gY29sdW1uczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWNoZUtleVR5cGUoKSA8ZW0+Q2FjaGUgS2V5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhY2hlS2V5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDYWNoZUtleVR5cGVfMl8xIENBQ0hFX0tFWV9UWVBFX0VERUZBVUxUID0gQ2FjaGVLZXlUeXBlXzJfMS5JRF9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhY2hlS2V5VHlwZSgpIDxlbT5DYWNoZSBLZXkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FjaGVLZXlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FjaGVLZXlUeXBlXzJfMSBjYWNoZUtleVR5cGUgPSBDQUNIRV9LRVlfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxQcmltYXJ5S2V5KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfUFJJTUFSWV9LRVk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsaWRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5JZFZhbGlkYXRpb25UeXBlXzFfMX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWxpZGF0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbGlkYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLklkVmFsaWRhdGlvblR5cGVfMV8xCi0JICogQHNlZSAjc2V0VmFsaWRhdGlvbihJZFZhbGlkYXRpb25UeXBlXzFfMSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByaW1hcnlLZXlfMV8xX1ZhbGlkYXRpb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSWRWYWxpZGF0aW9uVHlwZV8xXzEgZ2V0VmFsaWRhdGlvbigpCi0JewotCQlyZXR1cm4gdmFsaWRhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXkjZ2V0VmFsaWRhdGlvbiA8ZW0+VmFsaWRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuSWRWYWxpZGF0aW9uVHlwZV8xXzEKLQkgKiBAc2VlICNnZXRWYWxpZGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvbihJZFZhbGlkYXRpb25UeXBlXzFfMSBuZXdWYWxpZGF0aW9uKQotCXsKLQkJSWRWYWxpZGF0aW9uVHlwZV8xXzEgb2xkVmFsaWRhdGlvbiA9IHZhbGlkYXRpb247Ci0JCXZhbGlkYXRpb24gPSBuZXdWYWxpZGF0aW9uID09IG51bGwgPyBWQUxJREFUSU9OX0VERUZBVUxUIDogbmV3VmFsaWRhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9fVkFMSURBVElPTiwgb2xkVmFsaWRhdGlvbiwgdmFsaWRhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByaW1hcnlLZXlfMV8xX0NvbHVtbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbENvbHVtbj4gZ2V0Q29sdW1ucygpCi0JewotCQlpZiAoY29sdW1ucyA9PSBudWxsKQotCQl7Ci0JCQljb2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbENvbHVtbj4oWG1sQ29sdW1uLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19DT0xVTU5TKTsKLQkJfQotCQlyZXR1cm4gY29sdW1uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWNoZSBLZXkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5DYWNoZUtleVR5cGVfMl8xfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhY2hlIEtleSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlIEtleSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5DYWNoZUtleVR5cGVfMl8xCi0JICogQHNlZSAjc2V0Q2FjaGVLZXlUeXBlKENhY2hlS2V5VHlwZV8yXzEpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5XzJfMV9DYWNoZUtleVR5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2FjaGVLZXlUeXBlXzJfMSBnZXRDYWNoZUtleVR5cGUoKQotCXsKLQkJcmV0dXJuIGNhY2hlS2V5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXkjZ2V0Q2FjaGVLZXlUeXBlIDxlbT5DYWNoZSBLZXkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgS2V5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkNhY2hlS2V5VHlwZV8yXzEKLQkgKiBAc2VlICNnZXRDYWNoZUtleVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZUtleVR5cGUoQ2FjaGVLZXlUeXBlXzJfMSBuZXdDYWNoZUtleVR5cGUpCi0JewotCQlDYWNoZUtleVR5cGVfMl8xIG9sZENhY2hlS2V5VHlwZSA9IGNhY2hlS2V5VHlwZTsKLQkJY2FjaGVLZXlUeXBlID0gbmV3Q2FjaGVLZXlUeXBlID09IG51bGwgPyBDQUNIRV9LRVlfVFlQRV9FREVGQVVMVCA6IG5ld0NhY2hlS2V5VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9fQ0FDSEVfS0VZX1RZUEUsIG9sZENhY2hlS2V5VHlwZSwgY2FjaGVLZXlUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfX0NPTFVNTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRDb2x1bW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfX1ZBTElEQVRJT046Ci0JCQkJcmV0dXJuIGdldFZhbGlkYXRpb24oKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9fQ09MVU1OUzoKLQkJCQlyZXR1cm4gZ2V0Q29sdW1ucygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19DQUNIRV9LRVlfVFlQRToKLQkJCQlyZXR1cm4gZ2V0Q2FjaGVLZXlUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19WQUxJREFUSU9OOgotCQkJCXNldFZhbGlkYXRpb24oKElkVmFsaWRhdGlvblR5cGVfMV8xKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfX0NPTFVNTlM6Ci0JCQkJZ2V0Q29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29sdW1ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQ29sdW1uPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19DQUNIRV9LRVlfVFlQRToKLQkJCQlzZXRDYWNoZUtleVR5cGUoKENhY2hlS2V5VHlwZV8yXzEpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9fVkFMSURBVElPTjoKLQkJCQlzZXRWYWxpZGF0aW9uKFZBTElEQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9fQ09MVU1OUzoKLQkJCQlnZXRDb2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfX0NBQ0hFX0tFWV9UWVBFOgotCQkJCXNldENhY2hlS2V5VHlwZShDQUNIRV9LRVlfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9fVkFMSURBVElPTjoKLQkJCQlyZXR1cm4gdmFsaWRhdGlvbiAhPSBWQUxJREFUSU9OX0VERUZBVUxUOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19DT0xVTU5TOgotCQkJCXJldHVybiBjb2x1bW5zICE9IG51bGwgJiYgIWNvbHVtbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19DQUNIRV9LRVlfVFlQRToKLQkJCQlyZXR1cm4gY2FjaGVLZXlUeXBlICE9IENBQ0hFX0tFWV9UWVBFX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcmltYXJ5S2V5XzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9fQ0FDSEVfS0VZX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9QUklNQVJZX0tFWV8yMV9fQ0FDSEVfS0VZX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcmltYXJ5S2V5XzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfMjFfX0NBQ0hFX0tFWV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9fQ0FDSEVfS0VZX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWxpZGF0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWxpZGF0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYWNoZUtleVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhY2hlS2V5VHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByaW1hcnlLZXkoKSwKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRWYWxpZGF0aW9uVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYWNoZUtleVR5cGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbHVtblRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRWYWxpZGF0aW9uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMV8xLlBSSU1BUllfS0VZX19WQUxJREFUSU9OLCBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcmltYXJ5S2V5XzFfMV9WYWxpZGF0aW9uKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENhY2hlS2V5VHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5DQUNIRV9LRVlfVFlQRSwgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJpbWFyeUtleV8yXzFfQ2FjaGVLZXlUeXBlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbHVtblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDb2x1bW4uYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMV8xLlBSSU1BUllfS0VZX19DT0xVTU4sIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByaW1hcnlLZXlfMV8xX0NvbHVtbnMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByaXZhdGVPd25lZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByaXZhdGVPd25lZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGQxOTE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQcml2YXRlT3duZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUHJpdmF0ZSBPd25lZDwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpdmF0ZU93bmVkI2lzUHJpdmF0ZU93bmVkIDxlbT5Qcml2YXRlIE93bmVkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcml2YXRlT3duZWQoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFByaXZhdGVPd25lZCBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcml2YXRlIE93bmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcml2YXRlIE93bmVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByaXZhdGUgT3duZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByaXZhdGVPd25lZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJpdmF0ZU93bmVkX1ByaXZhdGVPd25lZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1ByaXZhdGVPd25lZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcml2YXRlT3duZWQjaXNQcml2YXRlT3duZWQgPGVtPlByaXZhdGUgT3duZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByaXZhdGUgT3duZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzUHJpdmF0ZU93bmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcml2YXRlT3duZWQoYm9vbGVhbiB2YWx1ZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHByaXZhdGUtb3duZWQgYXR0aWJ1dGUuCi0JICovCi0JVGV4dFJhbmdlIGdldFByaXZhdGVPd25lZFRleHRSYW5nZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQcm9wZXJ0eS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMDY0ZDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQcm9wZXJ0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5I2dldFZhbHVlVHlwZSA8ZW0+VmFsdWUgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHkoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sUHJvcGVydHkgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZVR5cGUoKSA8ZW0+VmFsdWUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlVHlwZSgpIDxlbT5WYWx1ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWVUeXBlID0gVkFMVUVfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxQcm9wZXJ0eSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1BST1BFUlRZOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eV9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlfVmFsdWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpCi0JewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkKLQl7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlfVmFsdWVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVUeXBlKCkKLQl7Ci0JCXJldHVybiB2YWx1ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSNnZXRWYWx1ZVR5cGUgPGVtPlZhbHVlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlVHlwZShTdHJpbmcgbmV3VmFsdWVUeXBlKQotCXsKLQkJU3RyaW5nIG9sZFZhbHVlVHlwZSA9IHZhbHVlVHlwZTsKLQkJdmFsdWVUeXBlID0gbmV3VmFsdWVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX19WQUxVRV9UWVBFLCBvbGRWYWx1ZVR5cGUsIHZhbHVlVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX19WQUxVRV9UWVBFOgotCQkJCXJldHVybiBnZXRWYWx1ZVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9fVkFMVUVfVFlQRToKLQkJCQlzZXRWYWx1ZVR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX19WQUxVRV9UWVBFOgotCQkJCXNldFZhbHVlVHlwZShWQUxVRV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX19WQUxVRV9UWVBFOgotCQkJCXJldHVybiBWQUxVRV9UWVBFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZVR5cGUgIT0gbnVsbCA6ICFWQUxVRV9UWVBFX0VERUZBVUxULmVxdWFscyh2YWx1ZVR5cGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWVUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVmFsdWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFZhbHVlVHlwZVRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWV9fTkFNRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eV9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFZhbHVlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZX19WQUxVRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eV9WYWx1ZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRWYWx1ZVR5cGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFlfX1ZBTFVFX1RZUEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlfVmFsdWVUeXBlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotfSAvLyBYbWxQcm9wZXJ0eQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByb3BlcnR5Q29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUHJvcGVydHlDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ViYTAwZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUHJvcGVydHlDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFByb3BlcnR5IENvbnRhaW5lcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5Q29udGFpbmVyI2dldFByb3BlcnRpZXMgPGVtPlByb3BlcnRpZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxQcm9wZXJ0eUNvbnRhaW5lciBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKTsKLQotfSAvLyBYbWxQcm9wZXJ0eUNvbnRhaW5lcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFF1ZXJ5Q29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUXVlcnlDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFmYWIwYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUXVlcnlDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFF1ZXJ5IENvbnRhaW5lcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyI2dldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcyA8ZW0+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxRdWVyeUNvbnRhaW5lcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sUXVlcnlDb250YWluZXIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5PiBnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKTsKLQotfSAvLyBYbWxRdWVyeUNvbnRhaW5lcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFF1ZXJ5UmVkaXJlY3RvcnMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxRdWVyeVJlZGlyZWN0b3JzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYjFlOTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFF1ZXJ5UmVkaXJlY3RvcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUXVlcnkgUmVkaXJlY3RvcnM8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnMoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sUXVlcnlSZWRpcmVjdG9ycyBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsbFF1ZXJpZXMoKSA8ZW0+QWxsIFF1ZXJpZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsbFF1ZXJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTF9RVUVSSUVTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsbFF1ZXJpZXMoKSA8ZW0+QWxsIFF1ZXJpZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsbFF1ZXJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWxsUXVlcmllcyA9IEFMTF9RVUVSSUVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlYWRBbGwoKSA8ZW0+UmVhZCBBbGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlYWRBbGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfQUxMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlYWRBbGwoKSA8ZW0+UmVhZCBBbGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlYWRBbGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVhZEFsbCA9IFJFQURfQUxMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlYWRPYmplY3QoKSA8ZW0+UmVhZCBPYmplY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlYWRPYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfT0JKRUNUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlYWRPYmplY3QoKSA8ZW0+UmVhZCBPYmplY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlYWRPYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVhZE9iamVjdCA9IFJFQURfT0JKRUNUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcG9ydCgpIDxlbT5SZXBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1JUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcG9ydCgpIDxlbT5SZXBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXBvcnQgPSBSRVBPUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXBkYXRlKCkgPGVtPlVwZGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXBkYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVUERBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXBkYXRlKCkgPGVtPlVwZGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXBkYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVwZGF0ZSA9IFVQREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnNlcnQoKSA8ZW0+SW5zZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbnNlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnNlcnQoKSA8ZW0+SW5zZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbnNlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaW5zZXJ0ID0gSU5TRVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlbGV0ZSgpIDxlbT5EZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlbGV0ZSgpIDxlbT5EZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWxldGUgPSBERUxFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUXVlcnlSZWRpcmVjdG9ycygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1FVRVJZX1JFRElSRUNUT1JTOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsbCBRdWVyaWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BbGwgUXVlcmllczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbGwgUXVlcmllczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWxsUXVlcmllcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9BbGxRdWVyaWVzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWxsUXVlcmllcygpCi0JewotCQlyZXR1cm4gYWxsUXVlcmllczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5UmVkaXJlY3RvcnMjZ2V0QWxsUXVlcmllcyA8ZW0+QWxsIFF1ZXJpZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFsbCBRdWVyaWVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbGxRdWVyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsUXVlcmllcyhTdHJpbmcgbmV3QWxsUXVlcmllcykKLQl7Ci0JCVN0cmluZyBvbGRBbGxRdWVyaWVzID0gYWxsUXVlcmllczsKLQkJYWxsUXVlcmllcyA9IG5ld0FsbFF1ZXJpZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX0FMTF9RVUVSSUVTLCBvbGRBbGxRdWVyaWVzLCBhbGxRdWVyaWVzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVhZCBBbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlYWQgQWxsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlYWQgQWxsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWFkQWxsKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1JlYWRBbGwoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZWFkQWxsKCkKLQl7Ci0JCXJldHVybiByZWFkQWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlSZWRpcmVjdG9ycyNnZXRSZWFkQWxsIDxlbT5SZWFkIEFsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVhZCBBbGw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlYWRBbGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkQWxsKFN0cmluZyBuZXdSZWFkQWxsKQotCXsKLQkJU3RyaW5nIG9sZFJlYWRBbGwgPSByZWFkQWxsOwotCQlyZWFkQWxsID0gbmV3UmVhZEFsbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fUkVBRF9BTEwsIG9sZFJlYWRBbGwsIHJlYWRBbGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWFkIE9iamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVhZCBPYmplY3Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVhZCBPYmplY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlYWRPYmplY3QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfUmVhZE9iamVjdCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlYWRPYmplY3QoKQotCXsKLQkJcmV0dXJuIHJlYWRPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeVJlZGlyZWN0b3JzI2dldFJlYWRPYmplY3QgPGVtPlJlYWQgT2JqZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFkIE9iamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVhZE9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWRPYmplY3QoU3RyaW5nIG5ld1JlYWRPYmplY3QpCi0JewotCQlTdHJpbmcgb2xkUmVhZE9iamVjdCA9IHJlYWRPYmplY3Q7Ci0JCXJlYWRPYmplY3QgPSBuZXdSZWFkT2JqZWN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19SRUFEX09CSkVDVCwgb2xkUmVhZE9iamVjdCwgcmVhZE9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVwb3J0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcG9ydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVwb3J0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1JlcG9ydCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlcG9ydCgpCi0JewotCQlyZXR1cm4gcmVwb3J0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlSZWRpcmVjdG9ycyNnZXRSZXBvcnQgPGVtPlJlcG9ydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVwb3J0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXBvcnQoU3RyaW5nIG5ld1JlcG9ydCkKLQl7Ci0JCVN0cmluZyBvbGRSZXBvcnQgPSByZXBvcnQ7Ci0JCXJlcG9ydCA9IG5ld1JlcG9ydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fUkVQT1JULCBvbGRSZXBvcnQsIHJlcG9ydCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVwZGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXBkYXRlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVwZGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VXBkYXRlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1VwZGF0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVwZGF0ZSgpCi0JewotCQlyZXR1cm4gdXBkYXRlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlSZWRpcmVjdG9ycyNnZXRVcGRhdGUgPGVtPlVwZGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXBkYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVcGRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGUoU3RyaW5nIG5ld1VwZGF0ZSkKLQl7Ci0JCVN0cmluZyBvbGRVcGRhdGUgPSB1cGRhdGU7Ci0JCXVwZGF0ZSA9IG5ld1VwZGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fVVBEQVRFLCBvbGRVcGRhdGUsIHVwZGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluc2VydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5zZXJ0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluc2VydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW5zZXJ0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0luc2VydCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluc2VydCgpCi0JewotCQlyZXR1cm4gaW5zZXJ0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlSZWRpcmVjdG9ycyNnZXRJbnNlcnQgPGVtPkluc2VydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5zZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbnNlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnNlcnQoU3RyaW5nIG5ld0luc2VydCkKLQl7Ci0JCVN0cmluZyBvbGRJbnNlcnQgPSBpbnNlcnQ7Ci0JCWluc2VydCA9IG5ld0luc2VydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fSU5TRVJULCBvbGRJbnNlcnQsIGluc2VydCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVsZXRlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVsZXRlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0RlbGV0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlbGV0ZSgpCi0JewotCQlyZXR1cm4gZGVsZXRlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlSZWRpcmVjdG9ycyNnZXREZWxldGUgPGVtPkRlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWxldGUoU3RyaW5nIG5ld0RlbGV0ZSkKLQl7Ci0JCVN0cmluZyBvbGREZWxldGUgPSBkZWxldGU7Ci0JCWRlbGV0ZSA9IG5ld0RlbGV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fREVMRVRFLCBvbGREZWxldGUsIGRlbGV0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19BTExfUVVFUklFUzoKLQkJCQlyZXR1cm4gZ2V0QWxsUXVlcmllcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19SRUFEX0FMTDoKLQkJCQlyZXR1cm4gZ2V0UmVhZEFsbCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19SRUFEX09CSkVDVDoKLQkJCQlyZXR1cm4gZ2V0UmVhZE9iamVjdCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19SRVBPUlQ6Ci0JCQkJcmV0dXJuIGdldFJlcG9ydCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19VUERBVEU6Ci0JCQkJcmV0dXJuIGdldFVwZGF0ZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19JTlNFUlQ6Ci0JCQkJcmV0dXJuIGdldEluc2VydCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19ERUxFVEU6Ci0JCQkJcmV0dXJuIGdldERlbGV0ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fQUxMX1FVRVJJRVM6Ci0JCQkJc2V0QWxsUXVlcmllcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX1JFQURfQUxMOgotCQkJCXNldFJlYWRBbGwoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19SRUFEX09CSkVDVDoKLQkJCQlzZXRSZWFkT2JqZWN0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fUkVQT1JUOgotCQkJCXNldFJlcG9ydCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX1VQREFURToKLQkJCQlzZXRVcGRhdGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19JTlNFUlQ6Ci0JCQkJc2V0SW5zZXJ0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fREVMRVRFOgotCQkJCXNldERlbGV0ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX0FMTF9RVUVSSUVTOgotCQkJCXNldEFsbFF1ZXJpZXMoQUxMX1FVRVJJRVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fUkVBRF9BTEw6Ci0JCQkJc2V0UmVhZEFsbChSRUFEX0FMTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19SRUFEX09CSkVDVDoKLQkJCQlzZXRSZWFkT2JqZWN0KFJFQURfT0JKRUNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX1JFUE9SVDoKLQkJCQlzZXRSZXBvcnQoUkVQT1JUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX1VQREFURToKLQkJCQlzZXRVcGRhdGUoVVBEQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX0lOU0VSVDoKLQkJCQlzZXRJbnNlcnQoSU5TRVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX0RFTEVURToKLQkJCQlzZXREZWxldGUoREVMRVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19BTExfUVVFUklFUzoKLQkJCQlyZXR1cm4gQUxMX1FVRVJJRVNfRURFRkFVTFQgPT0gbnVsbCA/IGFsbFF1ZXJpZXMgIT0gbnVsbCA6ICFBTExfUVVFUklFU19FREVGQVVMVC5lcXVhbHMoYWxsUXVlcmllcyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX1JFQURfQUxMOgotCQkJCXJldHVybiBSRUFEX0FMTF9FREVGQVVMVCA9PSBudWxsID8gcmVhZEFsbCAhPSBudWxsIDogIVJFQURfQUxMX0VERUZBVUxULmVxdWFscyhyZWFkQWxsKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fUkVBRF9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIFJFQURfT0JKRUNUX0VERUZBVUxUID09IG51bGwgPyByZWFkT2JqZWN0ICE9IG51bGwgOiAhUkVBRF9PQkpFQ1RfRURFRkFVTFQuZXF1YWxzKHJlYWRPYmplY3QpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19SRVBPUlQ6Ci0JCQkJcmV0dXJuIFJFUE9SVF9FREVGQVVMVCA9PSBudWxsID8gcmVwb3J0ICE9IG51bGwgOiAhUkVQT1JUX0VERUZBVUxULmVxdWFscyhyZXBvcnQpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19VUERBVEU6Ci0JCQkJcmV0dXJuIFVQREFURV9FREVGQVVMVCA9PSBudWxsID8gdXBkYXRlICE9IG51bGwgOiAhVVBEQVRFX0VERUZBVUxULmVxdWFscyh1cGRhdGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19JTlNFUlQ6Ci0JCQkJcmV0dXJuIElOU0VSVF9FREVGQVVMVCA9PSBudWxsID8gaW5zZXJ0ICE9IG51bGwgOiAhSU5TRVJUX0VERUZBVUxULmVxdWFscyhpbnNlcnQpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19ERUxFVEU6Ci0JCQkJcmV0dXJuIERFTEVURV9FREVGQVVMVCA9PSBudWxsID8gZGVsZXRlICE9IG51bGwgOiAhREVMRVRFX0VERUZBVUxULmVxdWFscyhkZWxldGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhbGxRdWVyaWVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhbGxRdWVyaWVzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZWFkQWxsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZWFkQWxsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZWFkT2JqZWN0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZWFkT2JqZWN0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXBvcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlcG9ydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdXBkYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1cGRhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGluc2VydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaW5zZXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWxldGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlbGV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKLQkJCVRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5UmVkaXJlY3RvcnMoKSwKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkQWxsUXVlcmllc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUmVhZEFsbFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUmVhZE9iamVjdFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUmVwb3J0VHJhbnNsYXRvcigpLAotCQkJYnVpbGRVcGRhdGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEluc2VydFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRGVsZXRlVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBbGxRdWVyaWVzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLlFVRVJZX1JFRElSRUNUT1JTX19BTExfUVVFUklFUywgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfQWxsUXVlcmllcygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRSZWFkQWxsVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLlFVRVJZX1JFRElSRUNUT1JTX19SRUFEX0FMTCwgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfUmVhZEFsbCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRSZWFkT2JqZWN0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLlFVRVJZX1JFRElSRUNUT1JTX19SRUFEX09CSkVDVCwgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfUmVhZE9iamVjdCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRSZXBvcnRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuUVVFUllfUkVESVJFQ1RPUlNfX1JFUE9SVCwgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfQWxsUXVlcmllcygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRVcGRhdGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuUVVFUllfUkVESVJFQ1RPUlNfX1VQREFURSwgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfQWxsUXVlcmllcygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRJbnNlcnRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuUVVFUllfUkVESVJFQ1RPUlNfX0lOU0VSVCwgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfQWxsUXVlcmllcygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREZWxldGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuUVVFUllfUkVESVJFQ1RPUlNfX0RFTEVURSwgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfQWxsUXVlcmllcygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLX0gLy8gWG1sUXVlcnlSZWRpcmVjdG9ycwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFJhbmdlUGFydGl0aW9uaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUmFuZ2VQYXJ0aXRpb25pbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE2OGFkMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUmFuZ2VQYXJ0aXRpb25pbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBSYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFJhbmdlUGFydGl0aW9uaW5nKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFJhbmdlUGFydGl0aW9uaW5nIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUmFuZ2VQYXJ0aXRpb25pbmcoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9SQU5HRV9QQVJUSVRJT05JTkc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMl9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJhbmdlUGFydGl0aW9uaW5nI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9SQU5HRV9QQVJUSVRJT05JTkdfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9SQU5HRV9QQVJUSVRJT05JTkdfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUkFOR0VfUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JBTkdFX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUkFOR0VfUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxSYW5nZVBhcnRpdGlvbmluZygpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTkFNRSwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci19IC8vIFhtbFJhbmdlUGFydGl0aW9uaW5nCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUmVhZE9ubHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxSZWFkT25seS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGY5MjhhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxSZWFkT25seS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBSZWFkIE9ubHk8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlYWRPbmx5I2dldFJlYWRPbmx5IDxlbT5SZWFkIE9ubHk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFJlYWRPbmx5KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxSZWFkT25seSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlYWRPbmx5KEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSZWFkT25seV9SZWFkT25seSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRSZWFkT25seSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seSNnZXRSZWFkT25seSA8ZW0+UmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlYWRPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWFkT25seShCb29sZWFuIHZhbHVlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgcmVhZC1vbmx5IGF0dGlidXRlLgotCSAqLwotCVRleHRSYW5nZSBnZXRSZWFkT25seVRleHRSYW5nZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NjA3ODQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZyBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzJfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZyNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUkVQTElDQVRJT05fUEFSVElUSU9OSU5HX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUkVQTElDQVRJT05fUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JFUExJQ0FUSU9OX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9SRVBMSUNBVElPTl9QQVJUSVRJT05JTkdfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JFUExJQ0FUSU9OX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk5BTUUsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMl9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotfSAvLyBYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFJldHVybkluc2VydC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFJldHVybkluc2VydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzYyZjAwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxSZXR1cm5JbnNlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxSZXR1cm5JbnNlcnRfMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBSZXR1cm4gSW5zZXJ0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFJldHVybkluc2VydCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxSZXR1cm5JbnNlcnQgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxSZXR1cm5JbnNlcnRfMl8xCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJldHVybk9ubHkoKSA8ZW0+UmV0dXJuIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJldHVybk9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBSRVRVUk5fT05MWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXR1cm5Pbmx5KCkgPGVtPlJldHVybiBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXR1cm5Pbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiByZXR1cm5Pbmx5ID0gUkVUVVJOX09OTFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUmV0dXJuSW5zZXJ0KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfUkVUVVJOX0lOU0VSVDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXR1cm4gT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmV0dXJuIE9ubHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJuIE9ubHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJldHVybk9ubHkoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFJldHVybkluc2VydF8yXzFfUmV0dXJuT25seSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0UmV0dXJuT25seSgpCi0JewotCQlyZXR1cm4gcmV0dXJuT25seTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJldHVybkluc2VydCNnZXRSZXR1cm5Pbmx5IDxlbT5SZXR1cm4gT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJuIE9ubHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJldHVybk9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXR1cm5Pbmx5KEJvb2xlYW4gbmV3UmV0dXJuT25seSkKLQl7Ci0JCUJvb2xlYW4gb2xkUmV0dXJuT25seSA9IHJldHVybk9ubHk7Ci0JCXJldHVybk9ubHkgPSBuZXdSZXR1cm5Pbmx5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JFVFVSTl9JTlNFUlRfX1JFVFVSTl9PTkxZLCBvbGRSZXR1cm5Pbmx5LCByZXR1cm5Pbmx5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUkVUVVJOX0lOU0VSVF9fUkVUVVJOX09OTFk6Ci0JCQkJcmV0dXJuIGdldFJldHVybk9ubHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUkVUVVJOX0lOU0VSVF9fUkVUVVJOX09OTFk6Ci0JCQkJc2V0UmV0dXJuT25seSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JFVFVSTl9JTlNFUlRfX1JFVFVSTl9PTkxZOgotCQkJCXNldFJldHVybk9ubHkoUkVUVVJOX09OTFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUkVUVVJOX0lOU0VSVF9fUkVUVVJOX09OTFk6Ci0JCQkJcmV0dXJuIFJFVFVSTl9PTkxZX0VERUZBVUxUID09IG51bGwgPyByZXR1cm5Pbmx5ICE9IG51bGwgOiAhUkVUVVJOX09OTFlfRURFRkFVTFQuZXF1YWxzKHJldHVybk9ubHkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyZXR1cm5Pbmx5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXR1cm5Pbmx5KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRSZXR1cm5Pbmx5VHJhbnNsYXRvcigpfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUmV0dXJuT25seVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5SRVRVUk5fT05MWSwgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUmV0dXJuSW5zZXJ0XzJfMV9SZXR1cm5Pbmx5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjdkMzU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBSb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZyBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzJfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9ST1VORF9ST0JJTl9QQVJUSVRJT05JTkdfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9ST1VORF9ST0JJTl9QQVJUSVRJT05JTkdfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JPVU5EX1JPQklOX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nKCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5OQU1FLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMl9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotfSAvLyBYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sU2Vjb25kYXJ5VGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxTZWNvbmRhcnlUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDJkMDQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxTZWNvbmRhcnlUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmsyXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFNlY29uZGFyeVRhYmxlXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgU2Vjb25kYXJ5IFRhYmxlPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTZWNvbmRhcnlUYWJsZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxTZWNvbmRhcnlUYWJsZSBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGUgaW1wbGVtZW50cyBYbWxTZWNvbmRhcnlUYWJsZV8yXzIKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25TdWZmaXgoKSA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRJT05fU1VGRklYX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0aW9uU3VmZml4KCkgPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRpb25TdWZmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY3JlYXRpb25TdWZmaXggPSBDUkVBVElPTl9TVUZGSVhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sU2Vjb25kYXJ5VGFibGUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9TRUNPTkRBUllfVEFCTEU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JlYXRpb24gU3VmZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDcmVhdGlvblN1ZmZpeChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTZWNvbmRhcnlUYWJsZV8yXzJfQ3JlYXRpb25TdWZmaXgoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGlvblN1ZmZpeCgpCi0JewotCQlyZXR1cm4gY3JlYXRpb25TdWZmaXg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZSNnZXRDcmVhdGlvblN1ZmZpeCA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENyZWF0aW9uU3VmZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRpb25TdWZmaXgoU3RyaW5nIG5ld0NyZWF0aW9uU3VmZml4KQotCXsKLQkJU3RyaW5nIG9sZENyZWF0aW9uU3VmZml4ID0gY3JlYXRpb25TdWZmaXg7Ci0JCWNyZWF0aW9uU3VmZml4ID0gbmV3Q3JlYXRpb25TdWZmaXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX19DUkVBVElPTl9TVUZGSVgsIG9sZENyZWF0aW9uU3VmZml4LCBjcmVhdGlvblN1ZmZpeCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NFQ09OREFSWV9UQUJMRV9fQ1JFQVRJT05fU1VGRklYOgotCQkJCXJldHVybiBnZXRDcmVhdGlvblN1ZmZpeCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfX0NSRUFUSU9OX1NVRkZJWDoKLQkJCQlzZXRDcmVhdGlvblN1ZmZpeCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX19DUkVBVElPTl9TVUZGSVg6Ci0JCQkJc2V0Q3JlYXRpb25TdWZmaXgoQ1JFQVRJT05fU1VGRklYX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NFQ09OREFSWV9UQUJMRV9fQ1JFQVRJT05fU1VGRklYOgotCQkJCXJldHVybiBDUkVBVElPTl9TVUZGSVhfRURFRkFVTFQgPT0gbnVsbCA/IGNyZWF0aW9uU3VmZml4ICE9IG51bGwgOiAhQ1JFQVRJT05fU1VGRklYX0VERUZBVUxULmVxdWFscyhjcmVhdGlvblN1ZmZpeCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFNlY29uZGFyeVRhYmxlXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfX0NSRUFUSU9OX1NVRkZJWDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1NFQ09OREFSWV9UQUJMRV8yMl9fQ1JFQVRJT05fU1VGRklYOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sU2Vjb25kYXJ5VGFibGVfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfMjJfX0NSRUFUSU9OX1NVRkZJWDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX19DUkVBVElPTl9TVUZGSVg7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjcmVhdGlvblN1ZmZpeDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3JlYXRpb25TdWZmaXgpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sU2Vjb25kYXJ5VGFibGUoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2NoZW1hVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDcmVhdGlvblN1ZmZpeFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5zVHJhbnNsYXRvcigpLAotCQkJYnVpbGRVbmlxdWVDb25zdHJhaW50VHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ3JlYXRpb25TdWZmaXhUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuQ1JFQVRJT05fU1VGRklYLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxTZWNvbmRhcnlUYWJsZV8yXzJfQ3JlYXRpb25TdWZmaXgoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci19IC8vIFhtbFNlY29uZGFyeVRhYmxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMjE5ZDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgU3RvcmVkIFByb2NlZHVyZSBQYXJhbWV0ZXI8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICoKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldERpcmVjdGlvbiA8ZW0+RGlyZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRRdWVyeVBhcmFtZXRlciA8ZW0+UXVlcnkgUGFyYW1ldGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRKZGJjVHlwZSA8ZW0+SmRiYyBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRKZGJjVHlwZU5hbWUgPGVtPkpkYmMgVHlwZSBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFhtbERpcmVjdGlvbiBESVJFQ1RJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlyZWN0aW9uKCkgPGVtPkRpcmVjdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlyZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sRGlyZWN0aW9uIGRpcmVjdGlvbiA9IERJUkVDVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFF1ZXJ5UGFyYW1ldGVyKCkgPGVtPlF1ZXJ5IFBhcmFtZXRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UXVlcnlQYXJhbWV0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1BBUkFNRVRFUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRdWVyeVBhcmFtZXRlcigpIDxlbT5RdWVyeSBQYXJhbWV0ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFF1ZXJ5UGFyYW1ldGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHF1ZXJ5UGFyYW1ldGVyID0gUVVFUllfUEFSQU1FVEVSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmRiY1R5cGUoKSA8ZW0+SmRiYyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKZGJjVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIEpEQkNfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKZGJjVHlwZSgpIDxlbT5KZGJjIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpkYmNUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZWdlciBqZGJjVHlwZSA9IEpEQkNfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKZGJjVHlwZU5hbWUoKSA8ZW0+SmRiYyBUeXBlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpkYmNUeXBlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkRCQ19UWVBFX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmRiY1R5cGVOYW1lKCkgPGVtPkpkYmMgVHlwZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKZGJjVHlwZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgamRiY1R5cGVOYW1lID0gSkRCQ19UWVBFX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlyZWN0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXJlY3Rpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlyZWN0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpcmVjdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbERpcmVjdGlvbgotCSAqIEBzZWUgI3NldERpcmVjdGlvbihYbWxEaXJlY3Rpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfRGlyZWN0aW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbERpcmVjdGlvbiBnZXREaXJlY3Rpb24oKQotCXsKLQkJcmV0dXJuIGRpcmVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXREaXJlY3Rpb24gPGVtPkRpcmVjdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlyZWN0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlyZWN0aW9uCi0JICogQHNlZSAjZ2V0RGlyZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlyZWN0aW9uKFhtbERpcmVjdGlvbiBuZXdEaXJlY3Rpb24pCi0JewotCQlYbWxEaXJlY3Rpb24gb2xkRGlyZWN0aW9uID0gZGlyZWN0aW9uOwotCQlkaXJlY3Rpb24gPSBuZXdEaXJlY3Rpb24gPT0gbnVsbCA/IERJUkVDVElPTl9FREVGQVVMVCA6IG5ld0RpcmVjdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fRElSRUNUSU9OLCBvbGREaXJlY3Rpb24sIGRpcmVjdGlvbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UXVlcnkgUGFyYW1ldGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5RdWVyeSBQYXJhbWV0ZXI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UXVlcnkgUGFyYW1ldGVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRRdWVyeVBhcmFtZXRlcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfUXVlcnlQYXJhbWV0ZXIoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWVyeVBhcmFtZXRlcigpCi0JewotCQlyZXR1cm4gcXVlcnlQYXJhbWV0ZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0UXVlcnlQYXJhbWV0ZXIgPGVtPlF1ZXJ5IFBhcmFtZXRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UXVlcnkgUGFyYW1ldGVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRRdWVyeVBhcmFtZXRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1ZXJ5UGFyYW1ldGVyKFN0cmluZyBuZXdRdWVyeVBhcmFtZXRlcikKLQl7Ci0JCVN0cmluZyBvbGRRdWVyeVBhcmFtZXRlciA9IHF1ZXJ5UGFyYW1ldGVyOwotCQlxdWVyeVBhcmFtZXRlciA9IG5ld1F1ZXJ5UGFyYW1ldGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19RVUVSWV9QQVJBTUVURVIsIG9sZFF1ZXJ5UGFyYW1ldGVyLCBxdWVyeVBhcmFtZXRlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotCXsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIG5ld1R5cGUpCi0JewotCQlTdHJpbmcgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SmRiYyBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5KZGJjIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SmRiYyBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRKZGJjVHlwZShJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX0pkYmNUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldEpkYmNUeXBlKCkKLQl7Ci0JCXJldHVybiBqZGJjVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRKZGJjVHlwZSA8ZW0+SmRiYyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KZGJjIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEpkYmNUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SmRiY1R5cGUoSW50ZWdlciBuZXdKZGJjVHlwZSkKLQl7Ci0JCUludGVnZXIgb2xkSmRiY1R5cGUgPSBqZGJjVHlwZTsKLQkJamRiY1R5cGUgPSBuZXdKZGJjVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fSkRCQ19UWVBFLCBvbGRKZGJjVHlwZSwgamRiY1R5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5KZGJjIFR5cGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SmRiYyBUeXBlIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SmRiYyBUeXBlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEpkYmNUeXBlTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfSmRiY1R5cGVOYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SmRiY1R5cGVOYW1lKCkKLQl7Ci0JCXJldHVybiBqZGJjVHlwZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0SmRiY1R5cGVOYW1lIDxlbT5KZGJjIFR5cGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmRiYyBUeXBlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEpkYmNUeXBlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEpkYmNUeXBlTmFtZShTdHJpbmcgbmV3SmRiY1R5cGVOYW1lKQotCXsKLQkJU3RyaW5nIG9sZEpkYmNUeXBlTmFtZSA9IGpkYmNUeXBlTmFtZTsKLQkJamRiY1R5cGVOYW1lID0gbmV3SmRiY1R5cGVOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEVfTkFNRSwgb2xkSmRiY1R5cGVOYW1lLCBqZGJjVHlwZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fRElSRUNUSU9OOgotCQkJCXJldHVybiBnZXREaXJlY3Rpb24oKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19RVUVSWV9QQVJBTUVURVI6Ci0JCQkJcmV0dXJuIGdldFF1ZXJ5UGFyYW1ldGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fSkRCQ19UWVBFOgotCQkJCXJldHVybiBnZXRKZGJjVHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEVfTkFNRToKLQkJCQlyZXR1cm4gZ2V0SmRiY1R5cGVOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19ESVJFQ1RJT046Ci0JCQkJc2V0RGlyZWN0aW9uKChYbWxEaXJlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fUVVFUllfUEFSQU1FVEVSOgotCQkJCXNldFF1ZXJ5UGFyYW1ldGVyKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fVFlQRToKLQkJCQlzZXRUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fSkRCQ19UWVBFOgotCQkJCXNldEpkYmNUeXBlKChJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0pEQkNfVFlQRV9OQU1FOgotCQkJCXNldEpkYmNUeXBlTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0RJUkVDVElPTjoKLQkJCQlzZXREaXJlY3Rpb24oRElSRUNUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX1FVRVJZX1BBUkFNRVRFUjoKLQkJCQlzZXRRdWVyeVBhcmFtZXRlcihRVUVSWV9QQVJBTUVURVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fSkRCQ19UWVBFOgotCQkJCXNldEpkYmNUeXBlKEpEQkNfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEVfTkFNRToKLQkJCQlzZXRKZGJjVHlwZU5hbWUoSkRCQ19UWVBFX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0RJUkVDVElPTjoKLQkJCQlyZXR1cm4gZGlyZWN0aW9uICE9IERJUkVDVElPTl9FREVGQVVMVDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19RVUVSWV9QQVJBTUVURVI6Ci0JCQkJcmV0dXJuIFFVRVJZX1BBUkFNRVRFUl9FREVGQVVMVCA9PSBudWxsID8gcXVlcnlQYXJhbWV0ZXIgIT0gbnVsbCA6ICFRVUVSWV9QQVJBTUVURVJfRURFRkFVTFQuZXF1YWxzKHF1ZXJ5UGFyYW1ldGVyKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEU6Ci0JCQkJcmV0dXJuIEpEQkNfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gamRiY1R5cGUgIT0gbnVsbCA6ICFKREJDX1RZUEVfRURFRkFVTFQuZXF1YWxzKGpkYmNUeXBlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fSkRCQ19UWVBFX05BTUU6Ci0JCQkJcmV0dXJuIEpEQkNfVFlQRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBqZGJjVHlwZU5hbWUgIT0gbnVsbCA6ICFKREJDX1RZUEVfTkFNRV9FREVGQVVMVC5lcXVhbHMoamRiY1R5cGVOYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGlyZWN0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkaXJlY3Rpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHF1ZXJ5UGFyYW1ldGVyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChxdWVyeVBhcmFtZXRlcik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgamRiY1R5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGpkYmNUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqZGJjVHlwZU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGpkYmNUeXBlTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZERpcmVjdGlvblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUXVlcnlQYXJhbWV0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFR5cGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEpkYmNUeXBlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKZGJjVHlwZU5hbWVUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERpcmVjdGlvblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5QQVJBTUVURVJfX0RJUkVDVElPTiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfRGlyZWN0aW9uKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5QQVJBTUVURVJfX05BTUUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRRdWVyeVBhcmFtZXRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5QQVJBTUVURVJfX1FVRVJZX1BBUkFNRVRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfUXVlcnlQYXJhbWV0ZXIoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBBUkFNRVRFUl9fVFlQRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEpkYmNUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBBUkFNRVRFUl9fSkRCQ19UWVBFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9KZGJjVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEpkYmNUeXBlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5QQVJBTUVURVJfX0pEQkNfVFlQRV9OQU1FLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9KZGJjVHlwZU5hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi19IC8vIFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFN0cnVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFN0cnVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTgyMzZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxTdHJ1Y3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGluazJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sU3RydWN0XzJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgU3RydWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFN0cnVjdCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxTdHJ1Y3QgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxTdHJ1Y3RfMl8zCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFN0cnVjdCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1NUUlVDVDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFN0cnVjdF8yXzNfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3QjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVFJVQ1RfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVFJVQ1RfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sU3RydWN0KCksCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8zLlNUUlVDVF9fTkFNRSwgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sU3RydWN0XzJfM19OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotfSAvLyBYbWxTdHJ1Y3QKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxTdHJ1Y3RDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxTdHJ1Y3RDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIyNzE1Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sU3RydWN0Q29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgU3RydWN0IEN1c3RvbUNvbnZlcnRlcjwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyI2dldENvbnZlcnRlciA8ZW0+Q29udmVydGVyPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdHJ1Y3RDb252ZXJ0ZXIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sU3RydWN0Q29udmVydGVyIGV4dGVuZHMgWG1sTmFtZWRDb252ZXJ0ZXIKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydGVyKCkgPGVtPkNvbnZlcnRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJURVJfRURFRkFVTFQgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnRlcigpIDxlbT5Db252ZXJ0ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0ZXIgPSBDT05WRVJURVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sU3RydWN0Q29udmVydGVyKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfU1RSVUNUX0NPTlZFUlRFUjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1c3RvbUNvbnZlcnRlcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbnZlcnRlcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdHJ1Y3RDb252ZXJ0ZXJfQ29udmVydGVyKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udmVydGVyKCkKLQl7Ci0JCXJldHVybiBjb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXIjZ2V0Q29udmVydGVyIDxlbT5Db252ZXJ0ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udmVydGVyKFN0cmluZyBuZXdDb252ZXJ0ZXIpCi0JewotCQlTdHJpbmcgb2xkQ29udmVydGVyID0gY29udmVydGVyOwotCQljb252ZXJ0ZXIgPSBuZXdDb252ZXJ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSLCBvbGRDb252ZXJ0ZXIsIGNvbnZlcnRlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gZ2V0Q29udmVydGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUjoKLQkJCQlzZXRDb252ZXJ0ZXIoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUjoKLQkJCQlzZXRDb252ZXJ0ZXIoQ09OVkVSVEVSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gQ09OVkVSVEVSX0VERUZBVUxUID09IG51bGwgPyBjb252ZXJ0ZXIgIT0gbnVsbCA6ICFDT05WRVJURVJfRURFRkFVTFQuZXF1YWxzKGNvbnZlcnRlcik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNvbnZlcnRlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29udmVydGVyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLAotCQkJc3RydWN0dXJhbEZlYXR1cmUsCi0JCQlUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5ULAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQotCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxTdHJ1Y3RDb252ZXJ0ZXJfQ29udmVydGVyKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9yaWdpbmFsTmFtZSA9IG9yaWdpbmFsVHlwZS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgpOwotCQlpbnQgbmFtZUluZGV4ID0gdGhpcy5jb252ZXJ0ZXIubGFzdEluZGV4T2Yob3JpZ2luYWxOYW1lKTsKLQkJaW50IG9mZnNldCA9IGdldEF0dHJpYnV0ZU5vZGUoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSKS5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCkgKyAxOyAvLyArMSA9IG9wZW5pbmcgZG91YmxlIHF1b3RlCi0JCXJldHVybiBuZXcgUmVwbGFjZUVkaXQob2Zmc2V0ICsgbmFtZUluZGV4LCBvcmlnaW5hbE5hbWUubGVuZ3RoKCksIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChTdHJpbmcgbmV3UGFja2FnZU5hbWUpIHsKLQkJaW50IHBhY2thZ2VMZW5ndGggPSB0aGlzLmNvbnZlcnRlci5sYXN0SW5kZXhPZignLicpOwotCQlpZiAobmV3UGFja2FnZU5hbWUgPT0gIiIpIHsvLyROT04tTkxTLTEkCi0JCQkvL21vdmluZyB0byB0aGUgZGVmYXVsdCBwYWNrYWdlLCByZW1vdmUgdGhlICcuJwotCQkJcGFja2FnZUxlbmd0aCsrOwotCQl9Ci0JCWlmIChwYWNrYWdlTGVuZ3RoID09IC0xKSB7Ci0JCQkvL21vdmluZyBmcm9tIHRoZSBkZWZhdWx0IHBhY2thZ2Ugb3IgdW5zcGVjaWZpZWQgcGFja2FnZQotCQkJcGFja2FnZUxlbmd0aCA9IDA7Ci0JCQluZXdQYWNrYWdlTmFtZSA9IG5ld1BhY2thZ2VOYW1lICsgJy4nOwotCQl9Ci0JCWludCBvZmZzZXQgPSBnZXRBdHRyaWJ1dGVOb2RlKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUikuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsgLy8gKzEgPSBvcGVuaW5nIGRvdWJsZSBxdW90ZQotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCwgcGFja2FnZUxlbmd0aCwgbmV3UGFja2FnZU5hbWUpOwotCX0KLX0gLy8gWG1sU3RydWN0Q29udmVydGVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sU3RydWN0dXJlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sU3RydWN0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiN2NmOWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFN0cnVjdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxTdHJ1Y3R1cmVfMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBTdHJ1Y3R1cmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sU3RydWN0dXJlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFN0cnVjdHVyZSBleHRlbmRzIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcsIFhtbFN0cnVjdHVyZV8yXzMKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZVR5cGUgPSBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxTdHJ1Y3R1cmUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9TVFJVQ1RVUkU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7Ci0JCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVFVSRV9fQUNDRVNTX01FVEhPRFMsIG9sZEFjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0dXJlI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQotCXsKLQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVFJVQ1RVUkVfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVFVSRV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUVVJFX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQotCXsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUVVJFX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgpCi0JewotCQlyZXR1cm4gYXR0cmlidXRlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdHVyZSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZyBuZXdBdHRyaWJ1dGVUeXBlKQotCXsKLQkJU3RyaW5nIG9sZEF0dHJpYnV0ZVR5cGUgPSBhdHRyaWJ1dGVUeXBlOwotCQlhdHRyaWJ1dGVUeXBlID0gbmV3QXR0cmlidXRlVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVFJVQ1RVUkVfX0FUVFJJQlVURV9UWVBFLCBvbGRBdHRyaWJ1dGVUeXBlLCBhdHRyaWJ1dGVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUVVJFX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVFVSRV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVFJVQ1RVUkVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUVVJFX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUVVJFX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlVHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVFJVQ1RVUkVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVFJVQ1RVUkVfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUVVJFX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVFJVQ1RVUkVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVFVSRV9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUVVJFX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKEFUVFJJQlVURV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVFVSRV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGFjY2Vzc01ldGhvZHMgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVFJVQ1RVUkVfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUVVJFX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGF0dHJpYnV0ZVR5cGUgIT0gbnVsbCA6ICFBVFRSSUJVVEVfVFlQRV9FREVGQVVMVC5lcXVhbHMoYXR0cmlidXRlVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUVVJFX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVFJVQ1RVUkVfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVFVSRV9fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BVFRSSUJVVEVfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxTdHJ1Y3R1cmVfMl8zLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVFVSRV9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVFJVQ1RVUkVfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVFVSRV9fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sU3RydWN0dXJlXzJfMy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXR0cmlidXRlVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXR0cmlidXRlVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuU1RSVUNUVVJFX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEF0dHJpYnV0ZVR5cGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsyXzEuQVRUUklCVVRFX1RZUEUpOwotCX0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxTdHJ1Y3R1cmUoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXR0cmlidXRlVHlwZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8zLlNUUlVDVFVSRV9fQVRUUklCVVRFX1RZUEUsICBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmdfQXR0cmlidXRlVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFByb3BlcnR5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOwotCX0KLX0gLy8gWG1sU3RydWN0dXJlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2Q5ZDA3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmsyXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgVGFibGU8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFRhYmxlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFRhYmxlIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZSBpbXBsZW1lbnRzIFhtbFRhYmxlXzJfMgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcmVhdGlvblN1ZmZpeCgpIDxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0aW9uU3VmZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVElPTl9TVUZGSVhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25TdWZmaXgoKSA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjcmVhdGlvblN1ZmZpeCA9IENSRUFUSU9OX1NVRkZJWF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxUYWJsZSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1RBQkxFOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyZWF0aW9uIFN1ZmZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3JlYXRpb25TdWZmaXgoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVGFibGVfMl8yX0NyZWF0aW9uU3VmZml4KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRpb25TdWZmaXgoKQotCXsKLQkJcmV0dXJuIGNyZWF0aW9uU3VmZml4OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGUjZ2V0Q3JlYXRpb25TdWZmaXggPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyZWF0aW9uU3VmZml4KFN0cmluZyBuZXdDcmVhdGlvblN1ZmZpeCkKLQl7Ci0JCVN0cmluZyBvbGRDcmVhdGlvblN1ZmZpeCA9IGNyZWF0aW9uU3VmZml4OwotCQljcmVhdGlvblN1ZmZpeCA9IG5ld0NyZWF0aW9uU3VmZml4OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RBQkxFX19DUkVBVElPTl9TVUZGSVgsIG9sZENyZWF0aW9uU3VmZml4LCBjcmVhdGlvblN1ZmZpeCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RBQkxFX19DUkVBVElPTl9TVUZGSVg6Ci0JCQkJcmV0dXJuIGdldENyZWF0aW9uU3VmZml4KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RBQkxFX19DUkVBVElPTl9TVUZGSVg6Ci0JCQkJc2V0Q3JlYXRpb25TdWZmaXgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RBQkxFX19DUkVBVElPTl9TVUZGSVg6Ci0JCQkJc2V0Q3JlYXRpb25TdWZmaXgoQ1JFQVRJT05fU1VGRklYX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RBQkxFX19DUkVBVElPTl9TVUZGSVg6Ci0JCQkJcmV0dXJuIENSRUFUSU9OX1NVRkZJWF9FREVGQVVMVCA9PSBudWxsID8gY3JlYXRpb25TdWZmaXggIT0gbnVsbCA6ICFDUkVBVElPTl9TVUZGSVhfRURFRkFVTFQuZXF1YWxzKGNyZWF0aW9uU3VmZml4KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sVGFibGVfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RBQkxFX19DUkVBVElPTl9TVUZGSVg6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9UQUJMRV8yMl9fQ1JFQVRJT05fU1VGRklYOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sVGFibGVfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9UQUJMRV8yMl9fQ1JFQVRJT05fU1VGRklYOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UQUJMRV9fQ1JFQVRJT05fU1VGRklYOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY3JlYXRpb25TdWZmaXg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNyZWF0aW9uU3VmZml4KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUYWJsZSgpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXRhbG9nVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTY2hlbWFUcmFuc2xhdG9yKCksCi0JCQlidWlsZENyZWF0aW9uU3VmZml4VHJhbnNsYXRvcigpLAotCQkJYnVpbGRVbmlxdWVDb25zdHJhaW50VHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ3JlYXRpb25TdWZmaXhUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuQ1JFQVRJT05fU1VGRklYLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUYWJsZV8yXzJfQ3JlYXRpb25TdWZmaXgoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci19IC8vIFhtbFRhYmxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVGFibGVHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxUYWJsZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzE0YzYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxUYWJsZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGluazJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVGFibGVHZW5lcmF0b3JfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgVGFibGUgR2VuZXJhdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFRhYmxlR2VuZXJhdG9yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFRhYmxlR2VuZXJhdG9yIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciBpbXBsZW1lbnRzIFhtbFRhYmxlR2VuZXJhdG9yXzJfMgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcmVhdGlvblN1ZmZpeCgpIDxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0aW9uU3VmZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVElPTl9TVUZGSVhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25TdWZmaXgoKSA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjcmVhdGlvblN1ZmZpeCA9IENSRUFUSU9OX1NVRkZJWF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxUYWJsZUdlbmVyYXRvcigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1RBQkxFX0dFTkVSQVRPUjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DcmVhdGlvbiBTdWZmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyZWF0aW9uU3VmZml4KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFRhYmxlR2VuZXJhdG9yXzJfMl9DcmVhdGlvblN1ZmZpeCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0aW9uU3VmZml4KCkKLQl7Ci0JCXJldHVybiBjcmVhdGlvblN1ZmZpeDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldENyZWF0aW9uU3VmZml4IDxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3JlYXRpb25TdWZmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvblN1ZmZpeChTdHJpbmcgbmV3Q3JlYXRpb25TdWZmaXgpCi0JewotCQlTdHJpbmcgb2xkQ3JlYXRpb25TdWZmaXggPSBjcmVhdGlvblN1ZmZpeDsKLQkJY3JlYXRpb25TdWZmaXggPSBuZXdDcmVhdGlvblN1ZmZpeDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0NSRUFUSU9OX1NVRkZJWCwgb2xkQ3JlYXRpb25TdWZmaXgsIGNyZWF0aW9uU3VmZml4KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19DUkVBVElPTl9TVUZGSVg6Ci0JCQkJcmV0dXJuIGdldENyZWF0aW9uU3VmZml4KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fQ1JFQVRJT05fU1VGRklYOgotCQkJCXNldENyZWF0aW9uU3VmZml4KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0NSRUFUSU9OX1NVRkZJWDoKLQkJCQlzZXRDcmVhdGlvblN1ZmZpeChDUkVBVElPTl9TVUZGSVhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19DUkVBVElPTl9TVUZGSVg6Ci0JCQkJcmV0dXJuIENSRUFUSU9OX1NVRkZJWF9FREVGQVVMVCA9PSBudWxsID8gY3JlYXRpb25TdWZmaXggIT0gbnVsbCA6ICFDUkVBVElPTl9TVUZGSVhfRURFRkFVTFQuZXF1YWxzKGNyZWF0aW9uU3VmZml4KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sVGFibGVHZW5lcmF0b3JfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fQ1JFQVRJT05fU1VGRklYOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SXzIyX19DUkVBVElPTl9TVUZGSVg7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxUYWJsZUdlbmVyYXRvcl8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl8yMl9fQ1JFQVRJT05fU1VGRklYOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0NSRUFUSU9OX1NVRkZJWDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNyZWF0aW9uU3VmZml4OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjcmVhdGlvblN1ZmZpeCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVGFibGVHZW5lcmF0b3IoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVGFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhdGFsb2dUcmFuc2xhdG9yKCksCi0JCQlidWlsZFNjaGVtYVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ3JlYXRpb25TdWZmaXhUcmFuc2xhdG9yKCksCi0JCQlidWlsZFBrQ29sdW1uTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVmFsdWVDb2x1bW5OYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQa0NvbHVtblZhbHVlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRJbml0aWFsVmFsdWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFsbG9jYXRpb25TaXplVHJhbnNsYXRvcigpLAotCQkJYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSwKLQkJCVhtbFVuaXF1ZUNvbnN0cmFpbnQuYnVpbGRUcmFuc2xhdG9yKEpQQS5VTklRVUVfQ09OU1RSQUlOVCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVGFibGVHZW5lcmF0b3JfVW5pcXVlQ29uc3RyYWludHMoKSkKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDcmVhdGlvblN1ZmZpeFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5DUkVBVElPTl9TVUZGSVgsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFRhYmxlR2VuZXJhdG9yXzJfMl9DcmVhdGlvblN1ZmZpeCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLX0gLy8gWG1sVGFibGVHZW5lcmF0b3IKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDE0ZWVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgVGVuYW50IERpc2NyaW1pbmF0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uIGV4dGVuZHMgQWJzdHJhY3RYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbiBpbXBsZW1lbnRzIFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRleHRQcm9wZXJ0eSgpIDxlbT5Db250ZXh0IFByb3BlcnR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250ZXh0UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfUFJPUEVSVFlfRURFRkFVTFQgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRleHRQcm9wZXJ0eSgpIDxlbT5Db250ZXh0IFByb3BlcnR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250ZXh0UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29udGV4dFByb3BlcnR5ID0gQ09OVEVYVF9QUk9QRVJUWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWJsZSgpIDxlbT5UYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWJsZSgpIDxlbT5UYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdGFibGUgPSBUQUJMRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpbWFyeUtleSgpIDxlbT5QcmltYXJ5IEtleTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJpbWFyeUtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIFBSSU1BUllfS0VZX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmltYXJ5S2V5KCkgPGVtPlByaW1hcnkgS2V5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmltYXJ5S2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBwcmltYXJ5S2V5ID0gUFJJTUFSWV9LRVlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTjsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGV4dCBQcm9wZXJ0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGV4dCBQcm9wZXJ0eTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZXh0IFByb3BlcnR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb250ZXh0UHJvcGVydHkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzNfQ29udGV4dFByb3BlcnR5KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFByb3BlcnR5KCkKLQl7Ci0JCXJldHVybiBjb250ZXh0UHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uI2dldENvbnRleHRQcm9wZXJ0eSA8ZW0+Q29udGV4dCBQcm9wZXJ0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGV4dCBQcm9wZXJ0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29udGV4dFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dFByb3BlcnR5KFN0cmluZyBuZXdDb250ZXh0UHJvcGVydHkpCi0JewotCQlTdHJpbmcgb2xkQ29udGV4dFByb3BlcnR5ID0gY29udGV4dFByb3BlcnR5OwotCQljb250ZXh0UHJvcGVydHkgPSBuZXdDb250ZXh0UHJvcGVydHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19DT05URVhUX1BST1BFUlRZLCBvbGRDb250ZXh0UHJvcGVydHksIGNvbnRleHRQcm9wZXJ0eSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFibGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzNfVGFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZSgpCi0JewotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uI2dldFRhYmxlIDxlbT5UYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFibGUoU3RyaW5nIG5ld1RhYmxlKQotCXsKLQkJU3RyaW5nIG9sZFRhYmxlID0gdGFibGU7Ci0JCXRhYmxlID0gbmV3VGFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19UQUJMRSwgb2xkVGFibGUsIHRhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmltYXJ5S2V5KEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfM19QcmltYXJ5S2V5KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0UHJpbWFyeUtleSgpCi0JewotCQlyZXR1cm4gcHJpbWFyeUtleTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4jZ2V0UHJpbWFyeUtleSA8ZW0+UHJpbWFyeSBLZXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmltYXJ5S2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleShCb29sZWFuIG5ld1ByaW1hcnlLZXkpCi0JewotCQlCb29sZWFuIG9sZFByaW1hcnlLZXkgPSBwcmltYXJ5S2V5OwotCQlwcmltYXJ5S2V5ID0gbmV3UHJpbWFyeUtleTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX1BSSU1BUllfS0VZLCBvbGRQcmltYXJ5S2V5LCBwcmltYXJ5S2V5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19DT05URVhUX1BST1BFUlRZOgotCQkJCXJldHVybiBnZXRDb250ZXh0UHJvcGVydHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX1RBQkxFOgotCQkJCXJldHVybiBnZXRUYWJsZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9fUFJJTUFSWV9LRVk6Ci0JCQkJcmV0dXJuIGdldFByaW1hcnlLZXkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19DT05URVhUX1BST1BFUlRZOgotCQkJCXNldENvbnRleHRQcm9wZXJ0eSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19UQUJMRToKLQkJCQlzZXRUYWJsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19QUklNQVJZX0tFWToKLQkJCQlzZXRQcmltYXJ5S2V5KChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19DT05URVhUX1BST1BFUlRZOgotCQkJCXNldENvbnRleHRQcm9wZXJ0eShDT05URVhUX1BST1BFUlRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19UQUJMRToKLQkJCQlzZXRUYWJsZShUQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9fUFJJTUFSWV9LRVk6Ci0JCQkJc2V0UHJpbWFyeUtleShQUklNQVJZX0tFWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0NPTlRFWFRfUFJPUEVSVFk6Ci0JCQkJcmV0dXJuIENPTlRFWFRfUFJPUEVSVFlfRURFRkFVTFQgPT0gbnVsbCA/IGNvbnRleHRQcm9wZXJ0eSAhPSBudWxsIDogIUNPTlRFWFRfUFJPUEVSVFlfRURFRkFVTFQuZXF1YWxzKGNvbnRleHRQcm9wZXJ0eSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19UQUJMRToKLQkJCQlyZXR1cm4gVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IHRhYmxlICE9IG51bGwgOiAhVEFCTEVfRURFRkFVTFQuZXF1YWxzKHRhYmxlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX1BSSU1BUllfS0VZOgotCQkJCXJldHVybiBQUklNQVJZX0tFWV9FREVGQVVMVCA9PSBudWxsID8gcHJpbWFyeUtleSAhPSBudWxsIDogIVBSSU1BUllfS0VZX0VERUZBVUxULmVxdWFscyhwcmltYXJ5S2V5KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19DT05URVhUX1BST1BFUlRZOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OXzIzX19DT05URVhUX1BST1BFUlRZOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX1RBQkxFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OXzIzX19UQUJMRTsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19QUklNQVJZX0tFWTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuWE1MX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl8yM19fUFJJTUFSWV9LRVk7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OXzIzX19DT05URVhUX1BST1BFUlRZOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0NPTlRFWFRfUFJPUEVSVFk7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLlhNTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fMjNfX1RBQkxFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX1RBQkxFOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5YTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OXzIzX19QUklNQVJZX0tFWTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19QUklNQVJZX0tFWTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNvbnRleHRQcm9wZXJ0eTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29udGV4dFByb3BlcnR5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0YWJsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByaW1hcnlLZXk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByaW1hcnlLZXkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEVjbGlwc2VMaW5rMl8zLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9fVEFCTEUpOwotCX0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLAotCQkJVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpLAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbnRleHRQcm9wZXJ0eVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRGlzY3JpbWluYXRvclR5cGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbHVtbkRlZmluaXRpb25UcmFuc2xhdG9yKCksCi0JCQlidWlsZExlbmd0aFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVGFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByaW1hcnlLZXlUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb250ZXh0UHJvcGVydHlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzMuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19DT05URVhUX1BST1BFUlRZLCBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfM19Db250ZXh0UHJvcGVydHkoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUYWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMy5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX1RBQkxFLCBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfM19UYWJsZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByaW1hcnlLZXlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzMuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19QUklNQVJZX0tFWSwgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzNfUHJpbWFyeUtleSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkvLyAqKioqKioqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKioqKioqKgotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFibGVDb2RlQXNzaXN0VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlQ29kZUFzc2lzdFRleHRSYW5nZShFY2xpcHNlTGluazJfMy5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX1RBQkxFKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0YWJsZVRvdWNoZXMoaW50IHBvcykgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRUYWJsZUNvZGVBc3Npc3RUZXh0UmFuZ2UoKTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgJiYgKHRleHRSYW5nZS50b3VjaGVzKHBvcykpOwotCX0KLX0gLy8gWG1sVGVuYW50RGlzY3JpbWluYXRvcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRpbWVPZkRheS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRpbWVPZkRheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTBjNzM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxUaW1lT2ZEYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgVGltZSBPZiBEYXk8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRIb3VyIDxlbT5Ib3VyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRNaW51dGUgPGVtPk1pbnV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkjZ2V0U2Vjb25kIDxlbT5TZWNvbmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5I2dldE1pbGxpc2Vjb25kIDxlbT5NaWxsaXNlY29uZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVGltZU9mRGF5KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFRpbWVPZkRheSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SG91cigpIDxlbT5Ib3VyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIb3VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgSE9VUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIb3VyKCkgPGVtPkhvdXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhvdXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIGhvdXIgPSBIT1VSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbnV0ZSgpIDxlbT5NaW51dGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1pbnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIE1JTlVURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaW51dGUoKSA8ZW0+TWludXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW51dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIG1pbnV0ZSA9IE1JTlVURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWNvbmQoKSA8ZW0+U2Vjb25kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWNvbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBTRUNPTkRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vjb25kKCkgPGVtPlNlY29uZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2Vjb25kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZWdlciBzZWNvbmQgPSBTRUNPTkRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWlsbGlzZWNvbmQoKSA8ZW0+TWlsbGlzZWNvbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1pbGxpc2Vjb25kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgTUlMTElTRUNPTkRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWlsbGlzZWNvbmQoKSA8ZW0+TWlsbGlzZWNvbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1pbGxpc2Vjb25kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZWdlciBtaWxsaXNlY29uZCA9IE1JTExJU0VDT05EX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFRpbWVPZkRheSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1RJTUVfT0ZfREFZOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhvdXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhvdXI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SG91cjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SG91cihJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVGltZU9mRGF5X0hvdXIoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0SG91cigpCi0JewotCQlyZXR1cm4gaG91cjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRIb3VyIDxlbT5Ib3VyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ib3VyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIb3VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG91cihJbnRlZ2VyIG5ld0hvdXIpCi0JewotCQlJbnRlZ2VyIG9sZEhvdXIgPSBob3VyOwotCQlob3VyID0gbmV3SG91cjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fSE9VUiwgb2xkSG91ciwgaG91cikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1pbnV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWludXRlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbnV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWludXRlKEludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUaW1lT2ZEYXlfTWludXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldE1pbnV0ZSgpCi0JewotCQlyZXR1cm4gbWludXRlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5I2dldE1pbnV0ZSA8ZW0+TWludXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NaW51dGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1pbnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbnV0ZShJbnRlZ2VyIG5ld01pbnV0ZSkKLQl7Ci0JCUludGVnZXIgb2xkTWludXRlID0gbWludXRlOwotCQltaW51dGUgPSBuZXdNaW51dGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX01JTlVURSwgb2xkTWludXRlLCBtaW51dGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWNvbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlY29uZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWNvbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlY29uZChJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVGltZU9mRGF5X1NlY29uZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRTZWNvbmQoKQotCXsKLQkJcmV0dXJuIHNlY29uZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRTZWNvbmQgPGVtPlNlY29uZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2Vjb25kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZWNvbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWNvbmQoSW50ZWdlciBuZXdTZWNvbmQpCi0JewotCQlJbnRlZ2VyIG9sZFNlY29uZCA9IHNlY29uZDsKLQkJc2Vjb25kID0gbmV3U2Vjb25kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19TRUNPTkQsIG9sZFNlY29uZCwgc2Vjb25kKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWlsbGlzZWNvbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1pbGxpc2Vjb25kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbGxpc2Vjb25kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNaWxsaXNlY29uZChJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVGltZU9mRGF5X01pbGxpc2Vjb25kKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldE1pbGxpc2Vjb25kKCkKLQl7Ci0JCXJldHVybiBtaWxsaXNlY29uZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRNaWxsaXNlY29uZCA8ZW0+TWlsbGlzZWNvbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pbGxpc2Vjb25kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNaWxsaXNlY29uZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbGxpc2Vjb25kKEludGVnZXIgbmV3TWlsbGlzZWNvbmQpCi0JewotCQlJbnRlZ2VyIG9sZE1pbGxpc2Vjb25kID0gbWlsbGlzZWNvbmQ7Ci0JCW1pbGxpc2Vjb25kID0gbmV3TWlsbGlzZWNvbmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX01JTExJU0VDT05ELCBvbGRNaWxsaXNlY29uZCwgbWlsbGlzZWNvbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fSE9VUjoKLQkJCQlyZXR1cm4gZ2V0SG91cigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19NSU5VVEU6Ci0JCQkJcmV0dXJuIGdldE1pbnV0ZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19TRUNPTkQ6Ci0JCQkJcmV0dXJuIGdldFNlY29uZCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19NSUxMSVNFQ09ORDoKLQkJCQlyZXR1cm4gZ2V0TWlsbGlzZWNvbmQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX0hPVVI6Ci0JCQkJc2V0SG91cigoSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19NSU5VVEU6Ci0JCQkJc2V0TWludXRlKChJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX1NFQ09ORDoKLQkJCQlzZXRTZWNvbmQoKEludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fTUlMTElTRUNPTkQ6Ci0JCQkJc2V0TWlsbGlzZWNvbmQoKEludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fSE9VUjoKLQkJCQlzZXRIb3VyKEhPVVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fTUlOVVRFOgotCQkJCXNldE1pbnV0ZShNSU5VVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fU0VDT05EOgotCQkJCXNldFNlY29uZChTRUNPTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fTUlMTElTRUNPTkQ6Ci0JCQkJc2V0TWlsbGlzZWNvbmQoTUlMTElTRUNPTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX0hPVVI6Ci0JCQkJcmV0dXJuIEhPVVJfRURFRkFVTFQgPT0gbnVsbCA/IGhvdXIgIT0gbnVsbCA6ICFIT1VSX0VERUZBVUxULmVxdWFscyhob3VyKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fTUlOVVRFOgotCQkJCXJldHVybiBNSU5VVEVfRURFRkFVTFQgPT0gbnVsbCA/IG1pbnV0ZSAhPSBudWxsIDogIU1JTlVURV9FREVGQVVMVC5lcXVhbHMobWludXRlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fU0VDT05EOgotCQkJCXJldHVybiBTRUNPTkRfRURFRkFVTFQgPT0gbnVsbCA/IHNlY29uZCAhPSBudWxsIDogIVNFQ09ORF9FREVGQVVMVC5lcXVhbHMoc2Vjb25kKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fTUlMTElTRUNPTkQ6Ci0JCQkJcmV0dXJuIE1JTExJU0VDT05EX0VERUZBVUxUID09IG51bGwgPyBtaWxsaXNlY29uZCAhPSBudWxsIDogIU1JTExJU0VDT05EX0VERUZBVUxULmVxdWFscyhtaWxsaXNlY29uZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGhvdXI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGhvdXIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1pbnV0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWludXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZWNvbmQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNlY29uZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWlsbGlzZWNvbmQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1pbGxpc2Vjb25kKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkSG91clRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWludXRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTZWNvbmRUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1pbGxpc2Vjb25kVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRIb3VyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkVYUElSWV9USU1FX09GX0RBWV9fSE9VUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUaW1lT2ZEYXlfSG91cigpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNaW51dGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuRVhQSVJZX1RJTUVfT0ZfREFZX19NSU5VVEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVGltZU9mRGF5X01pbnV0ZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTZWNvbmRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuRVhQSVJZX1RJTUVfT0ZfREFZX19TRUNPTkQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVGltZU9mRGF5X1NlY29uZCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNaWxsaXNlY29uZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5FWFBJUllfVElNRV9PRl9EQVlfX01JTExJU0VDT05ELCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFRpbWVPZkRheV9NaWxsaXNlY29uZCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLX0gLy8gWG1sVGltZU9mRGF5CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVHJhbnNmb3JtYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxUcmFuc2Zvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjM3NzEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxUcmFuc2Zvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGluazJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgVHJhbnNmb3JtYXRpb24gSW1wbDwvYj48L2VtPicuCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuICoKLSAqCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUcmFuc2Zvcm1hdGlvbigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxUcmFuc2Zvcm1hdGlvbiBleHRlbmRzIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZVR5cGUgPSBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxUcmFuc2Zvcm1hdGlvbigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1RSQU5TRk9STUFUSU9OOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgpCi0JewotCQlyZXR1cm4gYXR0cmlidXRlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zZm9ybWF0aW9uI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIG5ld0F0dHJpYnV0ZVR5cGUpCi0JewotCQlTdHJpbmcgb2xkQXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGU7Ci0JCWF0dHJpYnV0ZVR5cGUgPSBuZXdBdHRyaWJ1dGVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BVFRSSUJVVEVfVFlQRSwgb2xkQXR0cmlidXRlVHlwZSwgYXR0cmlidXRlVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOwotCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQUNDRVNTX01FVEhPRFMsIG9sZEFjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNmb3JtYXRpb24jZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCi0JewotCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY2Nlc3NNZXRob2RzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpCi0JewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQl7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByb3BlcnR5PihYbWxQcm9wZXJ0eS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBiYXNpY1NldEFjY2Vzc01ldGhvZHMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZShBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGFjY2Vzc01ldGhvZHMgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gcHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJcmV0dXJuIEFUVFJJQlVURV9UWVBFX0VERUZBVUxUID09IG51bGwgPyBhdHRyaWJ1dGVUeXBlICE9IG51bGwgOiAhQVRUUklCVVRFX1RZUEVfRURFRkFVTFQuZXF1YWxzKGF0dHJpYnV0ZVR5cGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX0FUVFJJQlVURV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FUVFJJQlVURV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhdHRyaWJ1dGVUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdHRyaWJ1dGVUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5UUkFOU0ZPUk1BVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRBdHRyaWJ1dGVUeXBlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEVjbGlwc2VMaW5rMl8xLkFUVFJJQlVURV9UWVBFKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0vLwkJCWJ1aWxkRmV0Y2hUcmFuc2xhdG9yKCksCi0vLwkJCWJ1aWxkT3B0aW9uYWxUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKLS8vCQkJYnVpbGRNdXRhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpLAotLy8JCQlidWlsZFJlYWRUcmFuc2Zvcm1lclRyYW5zbGF0b3IoKSwKLS8vCQkJYnVpbGRXcml0ZVRyYW5zZm9ybWVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxQcm9wZXJ0eS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NNZXRob2RzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQXR0cmlidXRlVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5BVFRSSUJVVEVfVFlQRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX0F0dHJpYnV0ZVR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxUcmFuc2llbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxUcmFuc2llbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NiN2E1NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVHJhbnNpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBUcmFuc2llbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVHJhbnNpZW50KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFRyYW5zaWVudCBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50IGltcGxlbWVudHMgWG1sQXR0cmlidXRlTWFwcGluZwotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlVHlwZSA9IEFUVFJJQlVURV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFRyYW5zaWVudCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1RSQU5TSUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKLQkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCi0JewotCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpCi0JewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQl7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByb3BlcnR5PihYbWxQcm9wZXJ0eS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXR0cmlidXRlVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX0F0dHJpYnV0ZVR5cGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKCkKLQl7Ci0JCXJldHVybiBhdHRyaWJ1dGVUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50I2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIG5ld0F0dHJpYnV0ZVR5cGUpCi0JewotCQlTdHJpbmcgb2xkQXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGU7Ci0JCWF0dHJpYnV0ZVR5cGUgPSBuZXdBdHRyaWJ1dGVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fQVRUUklCVVRFX1RZUEUsIG9sZEF0dHJpYnV0ZVR5cGUsIGF0dHJpYnV0ZVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBiYXNpY1NldEFjY2Vzc01ldGhvZHMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoQVRUUklCVVRFX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gcHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gYXR0cmlidXRlVHlwZSAhPSBudWxsIDogIUFUVFJJQlVURV9UWVBFX0VERUZBVUxULmVxdWFscyhhdHRyaWJ1dGVUeXBlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FUVFJJQlVURV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF0dHJpYnV0ZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF0dHJpYnV0ZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEF0dHJpYnV0ZVR5cGVUZXh0UmFuZ2UoKSB7Ci0JCS8vbm8gYXR0cmlidXRlLXR5cGUgZm9yIG9uZS10by1vbmUKLQkJcmV0dXJuIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVHJhbnNpZW50KCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQotCQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVHlwZUNvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFR5cGVDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA5NmVkYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVHlwZUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgVHlwZSBDdXN0b21Db252ZXJ0ZXI8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIjZ2V0RGF0YVR5cGUgPGVtPkRhdGEgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyI2dldE9iamVjdFR5cGUgPGVtPk9iamVjdCBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUeXBlQ29udmVydGVyKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFR5cGVDb252ZXJ0ZXIgZXh0ZW5kcyBYbWxOYW1lZENvbnZlcnRlcgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRhVHlwZSgpIDxlbT5EYXRhIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERhdGFUeXBlKCkgPGVtPkRhdGEgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGF0YVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGF0YVR5cGUgPSBEQVRBX1RZUEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9iamVjdFR5cGUoKSA8ZW0+T2JqZWN0IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9iamVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlKCkgPGVtPk9iamVjdCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPYmplY3RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG9iamVjdFR5cGUgPSBPQkpFQ1RfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxUeXBlQ29udmVydGVyKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfVFlQRV9DT05WRVJURVI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGF0YSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EYXRhIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREYXRhVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUeXBlQ29udmVydGVyX0RhdGFUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGUoKQotCXsKLQkJcmV0dXJuIGRhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlciNnZXREYXRhVHlwZSA8ZW0+RGF0YSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YVR5cGUoU3RyaW5nIG5ld0RhdGFUeXBlKQotCXsKLQkJU3RyaW5nIG9sZERhdGFUeXBlID0gZGF0YVR5cGU7Ci0JCWRhdGFUeXBlID0gbmV3RGF0YVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSwgb2xkRGF0YVR5cGUsIGRhdGFUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPYmplY3RUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFR5cGVDb252ZXJ0ZXJfT2JqZWN0VHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdFR5cGUoKQotCXsKLQkJcmV0dXJuIG9iamVjdFR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyI2dldE9iamVjdFR5cGUgPGVtPk9iamVjdCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdFR5cGUoU3RyaW5nIG5ld09iamVjdFR5cGUpCi0JewotCQlTdHJpbmcgb2xkT2JqZWN0VHlwZSA9IG9iamVjdFR5cGU7Ci0JCW9iamVjdFR5cGUgPSBuZXdPYmplY3RUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSwgb2xkT2JqZWN0VHlwZSwgb2JqZWN0VHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEU6Ci0JCQkJcmV0dXJuIGdldERhdGFUeXBlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFOgotCQkJCXJldHVybiBnZXRPYmplY3RUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEU6Ci0JCQkJc2V0RGF0YVR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRToKLQkJCQlzZXRPYmplY3RUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFOgotCQkJCXNldERhdGFUeXBlKERBVEFfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRToKLQkJCQlzZXRPYmplY3RUeXBlKE9CSkVDVF9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEU6Ci0JCQkJcmV0dXJuIERBVEFfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZGF0YVR5cGUgIT0gbnVsbCA6ICFEQVRBX1RZUEVfRURFRkFVTFQuZXF1YWxzKGRhdGFUeXBlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEU6Ci0JCQkJcmV0dXJuIE9CSkVDVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBvYmplY3RUeXBlICE9IG51bGwgOiAhT0JKRUNUX1RZUEVfRURFRkFVTFQuZXF1YWxzKG9iamVjdFR5cGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkYXRhVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGF0YVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG9iamVjdFR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG9iamVjdFR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLAotCQkJc3RydWN0dXJhbEZlYXR1cmUsCi0JCQlUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5ULAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQotCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGREYXRhVHlwZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkT2JqZWN0VHlwZVRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGF0YVR5cGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUeXBlQ29udmVydGVyX0RhdGFUeXBlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9iamVjdFR5cGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFR5cGVDb252ZXJ0ZXJfT2JqZWN0VHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lRGF0YVR5cGVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9yaWdpbmFsTmFtZSA9IG9yaWdpbmFsVHlwZS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgpOwotCQlpbnQgbmFtZUluZGV4ID0gdGhpcy5kYXRhVHlwZS5sYXN0SW5kZXhPZihvcmlnaW5hbE5hbWUpOwotCQlpbnQgb2Zmc2V0ID0gZ2V0QXR0cmlidXRlTm9kZShFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFKS5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCkgKyAxOyAvLyArMSA9IG9wZW5pbmcgZG91YmxlIHF1b3RlCi0JCXJldHVybiBuZXcgUmVwbGFjZUVkaXQob2Zmc2V0ICsgbmFtZUluZGV4LCBvcmlnaW5hbE5hbWUubGVuZ3RoKCksIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVEYXRhVHlwZVBhY2thZ2VFZGl0KFN0cmluZyBuZXdQYWNrYWdlTmFtZSkgewotCQlpbnQgcGFja2FnZUxlbmd0aCA9IHRoaXMuZGF0YVR5cGUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKG5ld1BhY2thZ2VOYW1lID09ICIiKSB7Ly8kTk9OLU5MUy0xJAotCQkJLy9tb3ZpbmcgdG8gdGhlIGRlZmF1bHQgcGFja2FnZSwgcmVtb3ZlIHRoZSAnLicKLQkJCXBhY2thZ2VMZW5ndGgrKzsKLQkJfQotCQlpZiAocGFja2FnZUxlbmd0aCA9PSAtMSkgewotCQkJLy9tb3ZpbmcgZnJvbSB0aGUgZGVmYXVsdCBwYWNrYWdlIG9yIHVuc3BlY2lmaWVkIHBhY2thZ2UKLQkJCXBhY2thZ2VMZW5ndGggPSAwOwotCQkJbmV3UGFja2FnZU5hbWUgPSBuZXdQYWNrYWdlTmFtZSArICcuJzsKLQkJfQotCQlpbnQgb2Zmc2V0ID0gZ2V0QXR0cmlidXRlTm9kZShFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFKS5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCkgKyAxOyAvLyArMSA9IG9wZW5pbmcgZG91YmxlIHF1b3RlCi0JCXJldHVybiBuZXcgUmVwbGFjZUVkaXQob2Zmc2V0LCBwYWNrYWdlTGVuZ3RoLCBuZXdQYWNrYWdlTmFtZSk7Ci0JfQotCi0JcHVibGljIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZU9iamVjdFR5cGVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9yaWdpbmFsTmFtZSA9IG9yaWdpbmFsVHlwZS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgpOwotCQlpbnQgbmFtZUluZGV4ID0gdGhpcy5vYmplY3RUeXBlLmxhc3RJbmRleE9mKG9yaWdpbmFsTmFtZSk7Ci0JCWludCBvZmZzZXQgPSBnZXRBdHRyaWJ1dGVOb2RlKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSkuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsgLy8gKzEgPSBvcGVuaW5nIGRvdWJsZSBxdW90ZQotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCArIG5hbWVJbmRleCwgb3JpZ2luYWxOYW1lLmxlbmd0aCgpLCBuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lT2JqZWN0VHlwZVBhY2thZ2VFZGl0KFN0cmluZyBuZXdQYWNrYWdlTmFtZSkgewotCQlpbnQgcGFja2FnZUxlbmd0aCA9IHRoaXMub2JqZWN0VHlwZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAobmV3UGFja2FnZU5hbWUgPT0gIiIpIHsvLyROT04tTkxTLTEkCi0JCQkvL21vdmluZyB0byB0aGUgZGVmYXVsdCBwYWNrYWdlLCByZW1vdmUgdGhlICcuJwotCQkJcGFja2FnZUxlbmd0aCsrOwotCQl9Ci0JCWlmIChwYWNrYWdlTGVuZ3RoID09IC0xKSB7Ci0JCQkvL21vdmluZyBmcm9tIHRoZSBkZWZhdWx0IHBhY2thZ2Ugb3IgdW5zcGVjaWZpZWQgcGFja2FnZQotCQkJcGFja2FnZUxlbmd0aCA9IDA7Ci0JCQluZXdQYWNrYWdlTmFtZSA9IG5ld1BhY2thZ2VOYW1lICsgJy4nOwotCQl9Ci0JCWludCBvZmZzZXQgPSBnZXRBdHRyaWJ1dGVOb2RlKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSkuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsgLy8gKzEgPSBvcGVuaW5nIGRvdWJsZSBxdW90ZQotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCwgcGFja2FnZUxlbmd0aCwgbmV3UGFja2FnZU5hbWUpOwotCX0KLQotfSAvLyBYbWxUeXBlQ29udmVydGVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVHlwZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxUeXBlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzEyOGJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxUeXBlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFR5cGVNYXBwaW5nXzJfMTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFR5cGUgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUeXBlTWFwcGluZygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sVHlwZU1hcHBpbmcgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nLCBYbWxUeXBlTWFwcGluZ18yXzEKLXsKLX0gLy8gWG1sVHlwZU1hcHBpbmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxVbmlvblBhcnRpdGlvbmluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFVuaW9uUGFydGl0aW9uaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YjVjMjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFVuaW9uUGFydGl0aW9uaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgVW5pb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxVbmlvblBhcnRpdGlvbmluZygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxVbmlvblBhcnRpdGlvbmluZyBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFVuaW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfVU5JT05fUEFSVElUSU9OSU5HOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxVbmlvblBhcnRpdGlvbmluZ18yXzJfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlvblBhcnRpdGlvbmluZyNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVU5JT05fUEFSVElUSU9OSU5HX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVU5JT05fUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1VOSU9OX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9VTklPTl9QQVJUSVRJT05JTkdfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1VOSU9OX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVW5pb25QYXJ0aXRpb25pbmcoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk5BTUUsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMl9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotfSAvLyBYbWxVbmlvblBhcnRpdGlvbmluZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFZhbHVlUGFydGl0aW9uaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVmFsdWVQYXJ0aXRpb25pbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE3ODJhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVmFsdWVQYXJ0aXRpb25pbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBWYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFZhbHVlUGFydGl0aW9uaW5nKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFZhbHVlUGFydGl0aW9uaW5nIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVmFsdWVQYXJ0aXRpb25pbmcoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9WQUxVRV9QQVJUSVRJT05JTkc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMl9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhbHVlUGFydGl0aW9uaW5nI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQUxVRV9QQVJUSVRJT05JTkdfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQUxVRV9QQVJUSVRJT05JTkdfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFMVUVfUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBTFVFX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFMVUVfUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxWYWx1ZVBhcnRpdGlvbmluZygpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTkFNRSwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci19IC8vIFhtbFZhbHVlUGFydGl0aW9uaW5nCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVmFyaWFibGVPbmVUb09uZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFZhcmlhYmxlT25lVG9PbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE4OWU4NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVmFyaWFibGVPbmVUb09uZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhcmlhYmxlT25lVG9PbmVfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBWYXJpYWJsZSBPbmUgVG8gT25lIEltcGw8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmUjZ2V0VGFyZ2V0SW50ZXJmYWNlIDxlbT5UYXJnZXQgSW50ZXJmYWNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxWYXJpYWJsZU9uZVRvT25lKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFZhcmlhYmxlT25lVG9PbmUgZXh0ZW5kcyBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50cyBYbWxBdHRyaWJ1dGVNYXBwaW5nLCBYbWxWYXJpYWJsZU9uZVRvT25lXzJfMgotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlVHlwZSA9IEFUVFJJQlVURV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydGl0aW9uaW5nKCkgPGVtPlBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGFydGl0aW9uaW5nXzJfMiBwYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpIDxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpIDxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiByb3VuZFJvYmluUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkgPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgcGlubmVkUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKSA8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYW5nZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiByYW5nZVBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlUGFydGl0aW9uaW5nKCkgPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgdmFsdWVQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYXNoUGFydGl0aW9uaW5nKCkgPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIYXNoUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgaGFzaFBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaW9uUGFydGl0aW9uaW5nKCkgPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VW5pb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgdW5pb25QYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydGl0aW9uZWQoKSA8ZW0+UGFydGl0aW9uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJUSVRJT05FRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJ0aXRpb25lZCgpIDxlbT5QYXJ0aXRpb25lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFydGl0aW9uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFydGl0aW9uZWQgPSBQQVJUSVRJT05FRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05vbkNhY2hlYWJsZSgpIDxlbT5Ob24gQ2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc05vbkNhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE5PTl9DQUNIRUFCTEVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTm9uQ2FjaGVhYmxlKCkgPGVtPk5vbiBDYWNoZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTm9uQ2FjaGVhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBub25DYWNoZWFibGUgPSBOT05fQ0FDSEVBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldEludGVyZmFjZSgpIDxlbT5UYXJnZXQgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXJnZXRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9JTlRFUkZBQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0SW50ZXJmYWNlKCkgPGVtPlRhcmdldCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhcmdldEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXRJbnRlcmZhY2UgPSBUQVJHRVRfSU5URVJGQUNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFZhcmlhYmxlT25lVG9PbmUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOwotCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQotCXsKLQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY2Nlc3NNZXRob2RzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQotCXsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU1hcHBpbmdfQXR0cmlidXRlVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoKQotCXsKLQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIG5ld0F0dHJpYnV0ZVR5cGUpCi0JewotCQlTdHJpbmcgb2xkQXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGU7Ci0JCWF0dHJpYnV0ZVR5cGUgPSBuZXdBdHRyaWJ1dGVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FUVFJJQlVURV9UWVBFLCBvbGRBdHRyaWJ1dGVUeXBlLCBhdHRyaWJ1dGVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQYXJ0aXRpb25pbmcoWG1sUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBhcnRpdGlvbmluZ18yXzIgZ2V0UGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiBwYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UGFydGl0aW9uaW5nKFhtbFBhcnRpdGlvbmluZ18yXzIgbmV3UGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUGFydGl0aW9uaW5nXzJfMiBvbGRQYXJ0aXRpb25pbmcgPSBwYXJ0aXRpb25pbmc7Ci0JCXBhcnRpdGlvbmluZyA9IG5ld1BhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QQVJUSVRJT05JTkcsIG9sZFBhcnRpdGlvbmluZywgbmV3UGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmUjZ2V0UGFydGl0aW9uaW5nIDxlbT5QYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFydGl0aW9uaW5nKFhtbFBhcnRpdGlvbmluZ18yXzIgbmV3UGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1BhcnRpdGlvbmluZyAhPSBwYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1BhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBhcnRpdGlvbmluZyhuZXdQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QQVJUSVRJT05JTkcsIG5ld1BhcnRpdGlvbmluZywgbmV3UGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiBnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG9sZFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nID0gcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JCXJlcGxpY2F0aW9uUGFydGl0aW9uaW5nID0gbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBvbGRSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZSNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyA8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nICE9IHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZXBsaWNhdGlvblBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUm91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiBvbGRSb3VuZFJvYmluUGFydGl0aW9uaW5nID0gcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQkJcm91bmRSb2JpblBhcnRpdGlvbmluZyA9IG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HLCBvbGRSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmUjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyA8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3Um91bmRSb2JpblBhcnRpdGlvbmluZyAhPSByb3VuZFJvYmluUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJvdW5kUm9iaW5QYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Um91bmRSb2JpblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HLCBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQaW5uZWRQYXJ0aXRpb25pbmcoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QaW5uZWRQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiBwaW5uZWRQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UGlubmVkUGFydGl0aW9uaW5nKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgbmV3UGlubmVkUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBvbGRQaW5uZWRQYXJ0aXRpb25pbmcgPSBwaW5uZWRQYXJ0aXRpb25pbmc7Ci0JCXBpbm5lZFBhcnRpdGlvbmluZyA9IG5ld1Bpbm5lZFBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HLCBvbGRQaW5uZWRQYXJ0aXRpb25pbmcsIG5ld1Bpbm5lZFBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lI2dldFBpbm5lZFBhcnRpdGlvbmluZyA8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGlubmVkUGFydGl0aW9uaW5nKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgbmV3UGlubmVkUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1Bpbm5lZFBhcnRpdGlvbmluZyAhPSBwaW5uZWRQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwaW5uZWRQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Bpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQaW5uZWRQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UGlubmVkUGFydGl0aW9uaW5nKG5ld1Bpbm5lZFBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkcsIG5ld1Bpbm5lZFBhcnRpdGlvbmluZywgbmV3UGlubmVkUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSYW5nZVBhcnRpdGlvbmluZyhYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiBnZXRSYW5nZVBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcmFuZ2VQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmFuZ2VQYXJ0aXRpb25pbmcoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG5ld1JhbmdlUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG9sZFJhbmdlUGFydGl0aW9uaW5nID0gcmFuZ2VQYXJ0aXRpb25pbmc7Ci0JCXJhbmdlUGFydGl0aW9uaW5nID0gbmV3UmFuZ2VQYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HLCBvbGRSYW5nZVBhcnRpdGlvbmluZywgbmV3UmFuZ2VQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZSNnZXRSYW5nZVBhcnRpdGlvbmluZyA8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmFuZ2VQYXJ0aXRpb25pbmcoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG5ld1JhbmdlUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1JhbmdlUGFydGl0aW9uaW5nICE9IHJhbmdlUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyYW5nZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyYW5nZVBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSYW5nZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSYW5nZVBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJhbmdlUGFydGl0aW9uaW5nKG5ld1JhbmdlUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HLCBuZXdSYW5nZVBhcnRpdGlvbmluZywgbmV3UmFuZ2VQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9WYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIGdldFZhbHVlUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB2YWx1ZVBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRWYWx1ZVBhcnRpdGlvbmluZyhYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgbmV3VmFsdWVQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgb2xkVmFsdWVQYXJ0aXRpb25pbmcgPSB2YWx1ZVBhcnRpdGlvbmluZzsKLQkJdmFsdWVQYXJ0aXRpb25pbmcgPSBuZXdWYWx1ZVBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19WQUxVRV9QQVJUSVRJT05JTkcsIG9sZFZhbHVlUGFydGl0aW9uaW5nLCBuZXdWYWx1ZVBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lI2dldFZhbHVlUGFydGl0aW9uaW5nIDxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZVBhcnRpdGlvbmluZyhYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgbmV3VmFsdWVQYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3VmFsdWVQYXJ0aXRpb25pbmcgIT0gdmFsdWVQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHZhbHVlUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXZhbHVlUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19WQUxVRV9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ZhbHVlUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1ZhbHVlUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19WQUxVRV9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VmFsdWVQYXJ0aXRpb25pbmcobmV3VmFsdWVQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19WQUxVRV9QQVJUSVRJT05JTkcsIG5ld1ZhbHVlUGFydGl0aW9uaW5nLCBuZXdWYWx1ZVBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhc2ggUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SGFzaFBhcnRpdGlvbmluZyhYbWxIYXNoUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9IYXNoUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBnZXRIYXNoUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiBoYXNoUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEhhc2hQYXJ0aXRpb25pbmcoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgbmV3SGFzaFBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIG9sZEhhc2hQYXJ0aXRpb25pbmcgPSBoYXNoUGFydGl0aW9uaW5nOwotCQloYXNoUGFydGl0aW9uaW5nID0gbmV3SGFzaFBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19IQVNIX1BBUlRJVElPTklORywgb2xkSGFzaFBhcnRpdGlvbmluZywgbmV3SGFzaFBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lI2dldEhhc2hQYXJ0aXRpb25pbmcgPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SGFzaFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc2hQYXJ0aXRpb25pbmcoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgbmV3SGFzaFBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdIYXNoUGFydGl0aW9uaW5nICE9IGhhc2hQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGhhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaGFzaFBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0hhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SGFzaFBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SGFzaFBhcnRpdGlvbmluZyhuZXdIYXNoUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkcsIG5ld0hhc2hQYXJ0aXRpb25pbmcsIG5ld0hhc2hQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFVuaW9uUGFydGl0aW9uaW5nKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9VbmlvblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIGdldFVuaW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB1bmlvblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRVbmlvblBhcnRpdGlvbmluZyhYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgbmV3VW5pb25QYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgb2xkVW5pb25QYXJ0aXRpb25pbmcgPSB1bmlvblBhcnRpdGlvbmluZzsKLQkJdW5pb25QYXJ0aXRpb25pbmcgPSBuZXdVbmlvblBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19VTklPTl9QQVJUSVRJT05JTkcsIG9sZFVuaW9uUGFydGl0aW9uaW5nLCBuZXdVbmlvblBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lI2dldFVuaW9uUGFydGl0aW9uaW5nIDxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VW5pb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmlvblBhcnRpdGlvbmluZyhYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgbmV3VW5pb25QYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3VW5pb25QYXJ0aXRpb25pbmcgIT0gdW5pb25QYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHVuaW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXVuaW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19VTklPTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1VuaW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1VuaW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19VTklPTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VW5pb25QYXJ0aXRpb25pbmcobmV3VW5pb25QYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19VTklPTl9QQVJUSVRJT05JTkcsIG5ld1VuaW9uUGFydGl0aW9uaW5nLCBuZXdVbmlvblBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFydGl0aW9uZWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmVkKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uZWQoKQotCXsKLQkJcmV0dXJuIHBhcnRpdGlvbmVkOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZSNnZXRQYXJ0aXRpb25lZCA8ZW0+UGFydGl0aW9uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnRpdGlvbmVkKFN0cmluZyBuZXdQYXJ0aXRpb25lZCkKLQl7Ci0JCVN0cmluZyBvbGRQYXJ0aXRpb25lZCA9IHBhcnRpdGlvbmVkOwotCQlwYXJ0aXRpb25lZCA9IG5ld1BhcnRpdGlvbmVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BBUlRJVElPTkVELCBvbGRQYXJ0aXRpb25lZCwgcGFydGl0aW9uZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob24gQ2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vbkNhY2hlYWJsZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVmFyaWFibGVPbmVUb09uZV8yXzJfTm9uQ2FjaGVhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vbkNhY2hlYWJsZSgpCi0JewotCQlyZXR1cm4gbm9uQ2FjaGVhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZSNpc05vbkNhY2hlYWJsZSA8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNOb25DYWNoZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb25DYWNoZWFibGUoYm9vbGVhbiBuZXdOb25DYWNoZWFibGUpCi0JewotCQlib29sZWFuIG9sZE5vbkNhY2hlYWJsZSA9IG5vbkNhY2hlYWJsZTsKLQkJbm9uQ2FjaGVhYmxlID0gbmV3Tm9uQ2FjaGVhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX05PTl9DQUNIRUFCTEUsIG9sZE5vbkNhY2hlYWJsZSwgbm9uQ2FjaGVhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFyZ2V0IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFyZ2V0IEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYXJnZXRJbnRlcmZhY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVmFyaWFibGVPbmVUb09uZV9UYXJnZXRJbnRlcmZhY2UoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRJbnRlcmZhY2UoKQotCXsKLQkJcmV0dXJuIHRhcmdldEludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmUjZ2V0VGFyZ2V0SW50ZXJmYWNlIDxlbT5UYXJnZXQgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYXJnZXRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRJbnRlcmZhY2UoU3RyaW5nIG5ld1RhcmdldEludGVyZmFjZSkKLQl7Ci0JCVN0cmluZyBvbGRUYXJnZXRJbnRlcmZhY2UgPSB0YXJnZXRJbnRlcmZhY2U7Ci0JCXRhcmdldEludGVyZmFjZSA9IG5ld1RhcmdldEludGVyZmFjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19UQVJHRVRfSU5URVJGQUNFLCBvbGRUYXJnZXRJbnRlcmZhY2UsIHRhcmdldEludGVyZmFjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBiYXNpY1NldEFjY2Vzc01ldGhvZHMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UGlubmVkUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSYW5nZVBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19WQUxVRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VmFsdWVQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SGFzaFBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VW5pb25QYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVUeXBlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UGlubmVkUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRSYW5nZVBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0SGFzaFBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0VW5pb25QYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QQVJUSVRJT05FRDoKLQkJCQlyZXR1cm4gZ2V0UGFydGl0aW9uZWQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19OT05fQ0FDSEVBQkxFOgotCQkJCXJldHVybiBpc05vbkNhY2hlYWJsZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1RBUkdFVF9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGdldFRhcmdldEludGVyZmFjZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UGFydGl0aW9uaW5nKChYbWxQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKChYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXNldFBpbm5lZFBhcnRpdGlvbmluZygoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlzZXRSYW5nZVBhcnRpdGlvbmluZygoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXNldFZhbHVlUGFydGl0aW9uaW5nKChYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlzZXRIYXNoUGFydGl0aW9uaW5nKChYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlzZXRVbmlvblBhcnRpdGlvbmluZygoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUEFSVElUSU9ORUQ6Ci0JCQkJc2V0UGFydGl0aW9uZWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX05PTl9DQUNIRUFCTEU6Ci0JCQkJc2V0Tm9uQ2FjaGVhYmxlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fVEFSR0VUX0lOVEVSRkFDRToKLQkJCQlzZXRUYXJnZXRJbnRlcmZhY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoQVRUUklCVVRFX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UGFydGl0aW9uaW5nKChYbWxQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXNldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXNldFBpbm5lZFBhcnRpdGlvbmluZygoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXNldFJhbmdlUGFydGl0aW9uaW5nKChYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlzZXRWYWx1ZVBhcnRpdGlvbmluZygoWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlzZXRIYXNoUGFydGl0aW9uaW5nKChYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFVuaW9uUGFydGl0aW9uaW5nKChYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BBUlRJVElPTkVEOgotCQkJCXNldFBhcnRpdGlvbmVkKFBBUlRJVElPTkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fTk9OX0NBQ0hFQUJMRToKLQkJCQlzZXROb25DYWNoZWFibGUoTk9OX0NBQ0hFQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1RBUkdFVF9JTlRFUkZBQ0U6Ci0JCQkJc2V0VGFyZ2V0SW50ZXJmYWNlKFRBUkdFVF9JTlRFUkZBQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGFjY2Vzc01ldGhvZHMgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gYXR0cmlidXRlVHlwZSAhPSBudWxsIDogIUFUVFJJQlVURV9UWVBFX0VERUZBVUxULmVxdWFscyhhdHRyaWJ1dGVUeXBlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBwaW5uZWRQYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHJhbmdlUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiB2YWx1ZVBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBoYXNoUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiB1bmlvblBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BBUlRJVElPTkVEOgotCQkJCXJldHVybiBQQVJUSVRJT05FRF9FREVGQVVMVCA9PSBudWxsID8gcGFydGl0aW9uZWQgIT0gbnVsbCA6ICFQQVJUSVRJT05FRF9FREVGQVVMVC5lcXVhbHMocGFydGl0aW9uZWQpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX05PTl9DQUNIRUFCTEU6Ci0JCQkJcmV0dXJuIG5vbkNhY2hlYWJsZSAhPSBOT05fQ0FDSEVBQkxFX0VERUZBVUxUOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1RBUkdFVF9JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIFRBUkdFVF9JTlRFUkZBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHRhcmdldEludGVyZmFjZSAhPSBudWxsIDogIVRBUkdFVF9JTlRFUkZBQ0VfRURFRkFVTFQuZXF1YWxzKHRhcmdldEludGVyZmFjZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BVFRSSUJVVEVfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVkFMVUVfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19IQVNIX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fSEFTSF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1VOSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVU5JT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QQVJUSVRJT05FRDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9ORUQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sVmFyaWFibGVPbmVUb09uZV8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fTk9OX0NBQ0hFQUJMRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfMjJfX05PTl9DQUNIRUFCTEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JBTkdFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19WQUxVRV9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fSEFTSF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0hBU0hfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19VTklPTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1VOSU9OX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9ORUQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BBUlRJVElPTkVEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFZhcmlhYmxlT25lVG9PbmVfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FXzIyX19OT05fQ0FDSEVBQkxFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19OT05fQ0FDSEVBQkxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXR0cmlidXRlVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXR0cmlidXRlVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFydGl0aW9uZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcnRpdGlvbmVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBub25DYWNoZWFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5vbkNhY2hlYWJsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdGFyZ2V0SW50ZXJmYWNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0YXJnZXRJbnRlcmZhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLlZBUklBQkxFX09ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0QXR0cmlidXRlVHlwZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShFY2xpcHNlTGluazJfMS5BVFRSSUJVVEVfVFlQRSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUYXJnZXRJbnRlcmZhY2VUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVGFyZ2V0SW50ZXJmYWNlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlZBUklBQkxFX09ORV9UT19PTkVfX1RBUkdFVF9JTlRFUkZBQ0UsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVmFyaWFibGVPbmVUb09uZV9UYXJnZXRJbnRlcmZhY2UoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxWZXJzaW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTYxNzk5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxWZXJzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGluazJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWZXJzaW9uXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBWZXJzaW9uPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVmVyc2lvbigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxWZXJzaW9uIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uIGltcGxlbWVudHMgWG1sVmVyc2lvbl8yXzIsIFhtbEF0dHJpYnV0ZU1hcHBpbmcsIFhtbE11dGFibGUsIFhtbENvbnZlcnRpYmxlTWFwcGluZywgWG1sQ29udmVydGVyQ29udGFpbmVyCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5kZXgoKSA8ZW0+SW5kZXg8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSW5kZXhfMl8yIGluZGV4OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdHRyaWJ1dGVUeXBlID0gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TXV0YWJsZSgpIDxlbT5NdXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNdXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gTVVUQUJMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNdXRhYmxlKCkgPGVtPk11dGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE11dGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIG11dGFibGUgPSBNVVRBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnQoKSA8ZW0+Q29udmVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0KCkgPGVtPkNvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydCA9IENPTlZFUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0ZXJzKCkgPGVtPkNvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbENvbnZlcnRlcj4gY29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVDb252ZXJ0ZXJzKCkgPGVtPlR5cGUgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlQ29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+IHR5cGVDb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPYmplY3RUeXBlQ29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+IG9iamVjdFR5cGVDb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RydWN0Q29udmVydGVycygpIDxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPiBzdHJ1Y3RDb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFZlcnNpb24oKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9WRVJTSU9OOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXR0cmlidXRlVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX0F0dHJpYnV0ZVR5cGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKCkKLQl7Ci0JCXJldHVybiBhdHRyaWJ1dGVUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZyBuZXdBdHRyaWJ1dGVUeXBlKQotCXsKLQkJU3RyaW5nIG9sZEF0dHJpYnV0ZVR5cGUgPSBhdHRyaWJ1dGVUeXBlOwotCQlhdHRyaWJ1dGVUeXBlID0gbmV3QXR0cmlidXRlVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BVFRSSUJVVEVfVFlQRSwgb2xkQXR0cmlidXRlVHlwZSwgYXR0cmlidXRlVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SW5kZXgoWG1sSW5kZXhfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVmVyc2lvbl8yXzJfSW5kZXgoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEluZGV4XzJfMiBnZXRJbmRleCgpCi0JewotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SW5kZXgoWG1sSW5kZXhfMl8yIG5ld0luZGV4LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sSW5kZXhfMl8yIG9sZEluZGV4ID0gaW5kZXg7Ci0JCWluZGV4ID0gbmV3SW5kZXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fSU5ERVgsIG9sZEluZGV4LCBuZXdJbmRleCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uI2dldEluZGV4IDxlbT5JbmRleDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5kZXgoWG1sSW5kZXhfMl8yIG5ld0luZGV4KQotCXsKLQkJaWYgKG5ld0luZGV4ICE9IGluZGV4KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChpbmRleCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbmRleCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fSU5ERVgsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0luZGV4ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0luZGV4KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19JTkRFWCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRJbmRleChuZXdJbmRleCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0lOREVYLCBuZXdJbmRleCwgbmV3SW5kZXgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NdXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NdXRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk11dGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE11dGFibGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE11dGFibGVfTXV0YWJsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0TXV0YWJsZSgpCi0JewotCQlyZXR1cm4gbXV0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24jZ2V0TXV0YWJsZSA8ZW0+TXV0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TXV0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TXV0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE11dGFibGUoQm9vbGVhbiBuZXdNdXRhYmxlKQotCXsKLQkJQm9vbGVhbiBvbGRNdXRhYmxlID0gbXV0YWJsZTsKLQkJbXV0YWJsZSA9IG5ld011dGFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fTVVUQUJMRSwgb2xkTXV0YWJsZSwgbXV0YWJsZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29udmVydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfQ29udmVydCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnQoKQotCXsKLQkJcmV0dXJuIGNvbnZlcnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uI2dldENvbnZlcnQgPGVtPkNvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0KFN0cmluZyBuZXdDb252ZXJ0KQotCXsKLQkJU3RyaW5nIG9sZENvbnZlcnQgPSBjb252ZXJ0OwotCQljb252ZXJ0ID0gbmV3Q29udmVydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJULCBvbGRDb252ZXJ0LCBjb252ZXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX0NvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbENvbnZlcnRlcj4gZ2V0Q29udmVydGVycygpCi0JewotCQlpZiAoY29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQljb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbENvbnZlcnRlcj4oWG1sQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiBjb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfVHlwZUNvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+IGdldFR5cGVDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmICh0eXBlQ29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQl0eXBlQ29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxUeXBlQ29udmVydGVyPihYbWxUeXBlQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1RZUEVfQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+IGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmIChvYmplY3RUeXBlQ29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQlvYmplY3RUeXBlQ29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPihYbWxPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfU3RydWN0Q29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPiBnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmIChzdHJ1Y3RDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCXN0cnVjdENvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPihYbWxTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fU1RSVUNUX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOwotCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQotCXsKLQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY2Nlc3NNZXRob2RzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQotCXsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fSU5ERVg6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SW5kZXgobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFR5cGVDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3RydWN0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0lOREVYOgotCQkJCXJldHVybiBnZXRJbmRleCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVUeXBlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fTVVUQUJMRToKLQkJCQlyZXR1cm4gZ2V0TXV0YWJsZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTlZFUlQ6Ci0JCQkJcmV0dXJuIGdldENvbnZlcnQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRUeXBlQ29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldFN0cnVjdENvbnZlcnRlcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fSU5ERVg6Ci0JCQkJc2V0SW5kZXgoKFhtbEluZGV4XzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX01VVEFCTEU6Ci0JCQkJc2V0TXV0YWJsZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTlZFUlQ6Ci0JCQkJc2V0Q29udmVydCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVEVSUzoKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxTdHJ1Y3RDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fSU5ERVg6Ci0JCQkJc2V0SW5kZXgoKFhtbEluZGV4XzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZShBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX01VVEFCTEU6Ci0JCQkJc2V0TXV0YWJsZShNVVRBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVDoKLQkJCQlzZXRDb252ZXJ0KENPTlZFUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJURVJTOgotCQkJCWdldENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19JTkRFWDoKLQkJCQlyZXR1cm4gaW5kZXggIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJcmV0dXJuIEFUVFJJQlVURV9UWVBFX0VERUZBVUxUID09IG51bGwgPyBhdHRyaWJ1dGVUeXBlICE9IG51bGwgOiAhQVRUUklCVVRFX1RZUEVfRURFRkFVTFQuZXF1YWxzKGF0dHJpYnV0ZVR5cGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX01VVEFCTEU6Ci0JCQkJcmV0dXJuIE1VVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IG11dGFibGUgIT0gbnVsbCA6ICFNVVRBQkxFX0VERUZBVUxULmVxdWFscyhtdXRhYmxlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJUOgotCQkJCXJldHVybiBDT05WRVJUX0VERUZBVUxUID09IG51bGwgPyBjb252ZXJ0ICE9IG51bGwgOiAhQ09OVkVSVF9FREVGQVVMVC5lcXVhbHMoY29udmVydCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gY29udmVydGVycyAhPSBudWxsICYmICFjb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVycyAhPSBudWxsICYmICFvYmplY3RUeXBlQ29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcnMgIT0gbnVsbCAmJiAhc3RydWN0Q29udmVydGVycy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFZlcnNpb25fMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0lOREVYOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfVkVSU0lPTl8yMl9fSU5ERVg7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE11dGFibGUuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fTVVUQUJMRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTVVUQUJMRV9fTVVUQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fQ09OVkVSVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1NUUlVDVF9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19TVFJVQ1RfQ09OVkVSVEVSUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFZlcnNpb25fMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9WRVJTSU9OXzIyX19JTkRFWDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fSU5ERVg7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE11dGFibGUuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTVVUQUJMRV9fTVVUQUJMRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fTVVUQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fQ09OVkVSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX1NUUlVDVF9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19TVFJVQ1RfQ09OVkVSVEVSUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF0dHJpYnV0ZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF0dHJpYnV0ZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG11dGFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG11dGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbnZlcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbnZlcnQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRNdXRhYmxlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEVjbGlwc2VMaW5rLk1VVEFCTEUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0QXR0cmlidXRlVHlwZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShFY2xpcHNlTGluazJfMS5BVFRSSUJVVEVfVFlQRSk7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFZlcnNpb24oKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTXV0YWJsZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXR0cmlidXRlVHlwZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29sdW1uVHJhbnNsYXRvcigpLCAKLQkJCWJ1aWxkSW5kZXhUcmFuc2xhdG9yKCksIAotCQkJYnVpbGRUZW1wb3JhbFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29udmVydFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE11dGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuTVVUQUJMRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNdXRhYmxlX011dGFibGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSW5kZXhUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sSW5kZXguYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLklOREVYLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxWZXJzaW9uXzJfMl9JbmRleCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29udmVydFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Db252ZXJ0KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX0NvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sVHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1R5cGVDb252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJDb250YWluZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxTdHJ1Y3RDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyQ29udGFpbmVyX1N0cnVjdENvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFByb3BlcnR5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFjY2Vzc01ldGhvZHMuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkFDQ0VTU19NRVRIT0RTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkFUVFJJQlVURV9UWVBFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmdfQXR0cmlidXRlVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCS8vICoqKioqKioqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqKioqKioqKgotCQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0Q29udmVydENvZGVBc3Npc3RUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50Q29kZUFzc2lzdFRleHRSYW5nZShFY2xpcHNlTGluay5DT05WRVJUKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb252ZXJ0VG91Y2hlcyhpbnQgcG9zKSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldENvbnZlcnRDb2RlQXNzaXN0VGV4dFJhbmdlKCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpICYmICh0ZXh0UmFuZ2UudG91Y2hlcyhwb3MpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9FY2xpcHNlTGluazFfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvRWNsaXBzZUxpbmsxXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdhMTk4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9FY2xpcHNlTGluazFfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGluazsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rMV8xCi0JZXh0ZW5kcyBFY2xpcHNlTGluawotewotCVN0cmluZyBTQ0hFTUFfTkFNRVNQQUNFID0gRWNsaXBzZUxpbmsuU0NIRU1BX05BTUVTUEFDRTsKLQlTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMV8xLnhzZCI7Ci0JU3RyaW5nIFNDSEVNQV9WRVJTSU9OCT0gIjEuMSI7Ci0JCi0JLy8gRWNsaXBzZUxpbmsgMS4xIHNwZWNpZmljIG5vZGVzCi0JCi0JU3RyaW5nIFBSSU1BUllfS0VZID0gInByaW1hcnkta2V5IjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUFJJTUFSWV9LRVlfX1ZBTElEQVRJT04gPSAidmFsaWRhdGlvbiI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBSSU1BUllfS0VZX19DT0xVTU4gPSAiY29sdW1uIjsgIC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL0VjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL0VjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2ZTRkYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9FY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnlJbXBsCi17Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkgZUlOU1RBTkNFID0gaW5pdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1WMV8xRmFjdG9yeSBpbml0KCkKLQl7Ci0JCXRyeQotCQl7Ci0JCQlFY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5IHRoZUVjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkgPSAoRWNsaXBzZUxpbmtPcm1WMV8xRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgianB0LmVjbGlwc2VsaW5rLm9ybS52MV8xLnhtaSIpOyAKLQkJCWlmICh0aGVFY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5ICE9IG51bGwpCi0JCQl7Ci0JCQkJcmV0dXJuIHRoZUVjbGlwc2VMaW5rT3JtVjFfMUZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pCi0JCXsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1WMV8xRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykKLQl7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKQotCQl7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuSURfVkFMSURBVElPTl9UWVBFXzExOgotCQkJCXJldHVybiBjcmVhdGVJZFZhbGlkYXRpb25UeXBlXzFfMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLklEX1ZBTElEQVRJT05fVFlQRV8xMToKLQkJCQlyZXR1cm4gY29udmVydElkVmFsaWRhdGlvblR5cGVfMV8xVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJZFZhbGlkYXRpb25UeXBlXzFfMSBjcmVhdGVJZFZhbGlkYXRpb25UeXBlXzFfMUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCUlkVmFsaWRhdGlvblR5cGVfMV8xIHJlc3VsdCA9IElkVmFsaWRhdGlvblR5cGVfMV8xLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRJZFZhbGlkYXRpb25UeXBlXzFfMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgZ2V0RWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSgpCi0JewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlIGdldFBhY2thZ2UoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvL0VjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL0VjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL0VjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJlNWQ4NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlSW1wbAotewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5BTUUgPSAidjFfMSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOU19VUkkgPSAianB0LmVjbGlwc2VsaW5rLm9ybS52MV8xLnhtaSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMSI7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxCYXNpY18xXzEgPGVtPlhtbCBCYXNpYyAxMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxCYXNpY18xXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlI2dldFhtbEJhc2ljXzFfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ18xMSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfMTFfX1NFUVVFTkNFX0dFTkVSQVRPUiA9IE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1NFUVVFTkNFX0dFTkVSQVRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ18xMV9fVEFCTEVfR0VORVJBVE9SID0gT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9fVEFCTEVfR0VORVJBVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlZCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDXzExX19HRU5FUkFURURfVkFMVUUgPSBPcm1QYWNrYWdlLlhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBCYXNpYyAxMTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ18xMV9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEVudGl0eV8xXzEgPGVtPlhtbCBFbnRpdHkgMTE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sRW50aXR5XzFfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sRW50aXR5XzFfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMTEgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzExX19QUklNQVJZX0tFWSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVudGl0eSAxMTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMTFfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDExPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18xMSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18xMV9fUFJJTUFSWV9LRVkgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzcyAxMTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18xMV9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbFByaW1hcnlLZXlfMV8xIDxlbT5YbWwgUHJpbWFyeSBLZXkgMTE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sUHJpbWFyeUtleV8xXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlI2dldFhtbFByaW1hcnlLZXlfMV8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZXzExID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfMTFfX1ZBTElEQVRJT04gPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZXzExX19DT0xVTU5TID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUHJpbWFyeSBLZXkgMTE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfMTFfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5JZFZhbGlkYXRpb25UeXBlXzFfMSA8ZW0+SWQgVmFsaWRhdGlvbiBUeXBlIDExPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuSWRWYWxpZGF0aW9uVHlwZV8xXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlI2dldElkVmFsaWRhdGlvblR5cGVfMV8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVkFMSURBVElPTl9UWVBFXzExID0gNDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEJhc2ljXzFfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbnRpdHlfMV8xRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFByaW1hcnlLZXlfMV8xRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gaWRWYWxpZGF0aW9uVHlwZV8xXzFFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSgpCi0JewotCQlzdXBlcihlTlNfVVJJLCBFY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgotCSAqIAotCSAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KLQkgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSBpbml0KCkKLQl7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUVjbGlwc2VMaW5rT3JtUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1QYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lTlNfVVJJKSA6IEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lTlNfVVJJKSA6IEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lTlNfVVJJKSA6IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5lTlNfVVJJKSA6IEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5lTlNfVVJJKSA6IEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5mcmVlemUoKTsKLQotICAKLQkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCi0JCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVOU19VUkksIHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UpOwotCQlyZXR1cm4gdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxCYXNpY18xXzEgPGVtPlhtbCBCYXNpYyAxMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQmFzaWMgMTE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sQmFzaWNfMV8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQmFzaWNfMV8xKCkKLQl7Ci0JCXJldHVybiB4bWxCYXNpY18xXzFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sQmFzaWNfMV8xI2dldEdlbmVyYXRlZFZhbHVlIDxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sQmFzaWNfMV8xI2dldEdlbmVyYXRlZFZhbHVlKCkKLQkgKiBAc2VlICNnZXRYbWxCYXNpY18xXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxCYXNpY18xXzFfR2VuZXJhdGVkVmFsdWUoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEJhc2ljXzFfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxFbnRpdHlfMV8xIDxlbT5YbWwgRW50aXR5IDExPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbnRpdHkgMTE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sRW50aXR5XzFfMQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVudGl0eV8xXzEoKQotCXsKLQkJcmV0dXJuIHhtbEVudGl0eV8xXzFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sRW50aXR5XzFfMSNnZXRQcmltYXJ5S2V5IDxlbT5QcmltYXJ5IEtleTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEVudGl0eV8xXzEjZ2V0UHJpbWFyeUtleSgpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5XzFfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV8xXzFfUHJpbWFyeUtleSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5XzFfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDExPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzcyAxMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xKCkKLQl7Ci0JCXJldHVybiB4bWxNYXBwZWRTdXBlcmNsYXNzXzFfMUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSNnZXRQcmltYXJ5S2V5IDxlbT5QcmltYXJ5IEtleTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xI2dldFByaW1hcnlLZXkoKQotCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzFfUHJpbWFyeUtleSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc18xXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sUHJpbWFyeUtleV8xXzEgPGVtPlhtbCBQcmltYXJ5IEtleSAxMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUHJpbWFyeSBLZXkgMTE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sUHJpbWFyeUtleV8xXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxQcmltYXJ5S2V5XzFfMSgpCi0JewotCQlyZXR1cm4geG1sUHJpbWFyeUtleV8xXzFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sUHJpbWFyeUtleV8xXzEjZ2V0VmFsaWRhdGlvbiA8ZW0+VmFsaWRhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbGlkYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sUHJpbWFyeUtleV8xXzEjZ2V0VmFsaWRhdGlvbigpCi0JICogQHNlZSAjZ2V0WG1sUHJpbWFyeUtleV8xXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQcmltYXJ5S2V5XzFfMV9WYWxpZGF0aW9uKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQcmltYXJ5S2V5XzFfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sUHJpbWFyeUtleV8xXzEjZ2V0Q29sdW1ucyA8ZW0+Q29sdW1uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29sdW1uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxQcmltYXJ5S2V5XzFfMSNnZXRDb2x1bW5zKCkKLQkgKiBAc2VlICNnZXRYbWxQcmltYXJ5S2V5XzFfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFByaW1hcnlLZXlfMV8xX0NvbHVtbnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFByaW1hcnlLZXlfMV8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuSWRWYWxpZGF0aW9uVHlwZV8xXzEgPGVtPklkIFZhbGlkYXRpb24gVHlwZSAxMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPklkIFZhbGlkYXRpb24gVHlwZSAxMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5JZFZhbGlkYXRpb25UeXBlXzFfMQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0SWRWYWxpZGF0aW9uVHlwZV8xXzEoKQotCXsKLQkJcmV0dXJuIGlkVmFsaWRhdGlvblR5cGVfMV8xRUVudW07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkgZ2V0RWNsaXBzZUxpbmtPcm1WMV8xRmFjdG9yeSgpCi0JewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCXsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQl4bWxCYXNpY18xXzFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0JBU0lDXzExKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxCYXNpY18xXzFFQ2xhc3MsIFhNTF9CQVNJQ18xMV9fR0VORVJBVEVEX1ZBTFVFKTsKLQotCQl4bWxFbnRpdHlfMV8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTlRJVFlfMTEpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eV8xXzFFQ2xhc3MsIFhNTF9FTlRJVFlfMTFfX1BSSU1BUllfS0VZKTsKLQotCQl4bWxNYXBwZWRTdXBlcmNsYXNzXzFfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMTEpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMTFfX1BSSU1BUllfS0VZKTsKLQotCQl4bWxQcmltYXJ5S2V5XzFfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUFJJTUFSWV9LRVlfMTEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFByaW1hcnlLZXlfMV8xRUNsYXNzLCBYTUxfUFJJTUFSWV9LRVlfMTFfX1ZBTElEQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbFByaW1hcnlLZXlfMV8xRUNsYXNzLCBYTUxfUFJJTUFSWV9LRVlfMTFfX0NPTFVNTlMpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQlpZFZhbGlkYXRpb25UeXBlXzFfMUVFbnVtID0gY3JlYXRlRUVudW0oSURfVkFMSURBVElPTl9UWVBFXzExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCXsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlPcm1QYWNrYWdlIHRoZU9ybVBhY2thZ2UgPSAoT3JtUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPcm1QYWNrYWdlLmVOU19VUkkpOwotCQlFY2xpcHNlTGlua09ybVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJeG1sQmFzaWNfMV8xRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoeG1sQmFzaWNfMV8xRUNsYXNzLCBYbWxCYXNpY18xXzEuY2xhc3MsICJYbWxCYXNpY18xXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxCYXNpY18xXzFfR2VuZXJhdGVkVmFsdWUoKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxHZW5lcmF0ZWRWYWx1ZSgpLCBudWxsLCAiZ2VuZXJhdGVkVmFsdWUiLCBudWxsLCAwLCAxLCBYbWxCYXNpY18xXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbnRpdHlfMV8xRUNsYXNzLCBYbWxFbnRpdHlfMV8xLmNsYXNzLCAiWG1sRW50aXR5XzFfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV8xXzFfUHJpbWFyeUtleSgpLCB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sUHJpbWFyeUtleSgpLCBudWxsLCAicHJpbWFyeUtleSIsIG51bGwsIDAsIDEsIFhtbEVudGl0eV8xXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNYXBwZWRTdXBlcmNsYXNzXzFfMUVDbGFzcywgWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEuY2xhc3MsICJYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xX1ByaW1hcnlLZXkoKSwgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbFByaW1hcnlLZXkoKSwgbnVsbCwgInByaW1hcnlLZXkiLCBudWxsLCAwLCAxLCBYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFByaW1hcnlLZXlfMV8xRUNsYXNzLCBYbWxQcmltYXJ5S2V5XzFfMS5jbGFzcywgIlhtbFByaW1hcnlLZXlfMV8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUHJpbWFyeUtleV8xXzFfVmFsaWRhdGlvbigpLCB0aGlzLmdldElkVmFsaWRhdGlvblR5cGVfMV8xKCksICJ2YWxpZGF0aW9uIiwgbnVsbCwgMCwgMSwgWG1sUHJpbWFyeUtleV8xXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbFByaW1hcnlLZXlfMV8xX0NvbHVtbnMoKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxDb2x1bW4oKSwgbnVsbCwgImNvbHVtbnMiLCBudWxsLCAwLCAtMSwgWG1sUHJpbWFyeUtleV8xXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKGlkVmFsaWRhdGlvblR5cGVfMV8xRUVudW0sIElkVmFsaWRhdGlvblR5cGVfMV8xLmNsYXNzLCAiSWRWYWxpZGF0aW9uVHlwZV8xXzEiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGlkVmFsaWRhdGlvblR5cGVfMV8xRUVudW0sIElkVmFsaWRhdGlvblR5cGVfMV8xLk5VTEwpOwotCQlhZGRFRW51bUxpdGVyYWwoaWRWYWxpZGF0aW9uVHlwZV8xXzFFRW51bSwgSWRWYWxpZGF0aW9uVHlwZV8xXzEuWkVSTyk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChpZFZhbGlkYXRpb25UeXBlXzFfMUVFbnVtLCBJZFZhbGlkYXRpb25UeXBlXzFfMS5OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIExpdGVyYWxzCi0JewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxCYXNpY18xXzEgPGVtPlhtbCBCYXNpYyAxMTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxCYXNpY18xXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxCYXNpY18xXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQkFTSUNfMTEgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfMV8xKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZWQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9CQVNJQ18xMV9fR0VORVJBVEVEX1ZBTFVFID0gZUlOU1RBTkNFLmdldFhtbEJhc2ljXzFfMV9HZW5lcmF0ZWRWYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEVudGl0eV8xXzEgPGVtPlhtbCBFbnRpdHkgMTE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sRW50aXR5XzFfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlI2dldFhtbEVudGl0eV8xXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU5USVRZXzExID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV8xXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZXzExX19QUklNQVJZX0tFWSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMV8xX1ByaW1hcnlLZXkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDExPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMTEgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMTFfX1BSSU1BUllfS0VZID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xX1ByaW1hcnlLZXkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxQcmltYXJ5S2V5XzFfMSA8ZW0+WG1sIFByaW1hcnkgS2V5IDExPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbFByaW1hcnlLZXlfMV8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleV8xXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUFJJTUFSWV9LRVlfMTEgPSBlSU5TVEFOQ0UuZ2V0WG1sUHJpbWFyeUtleV8xXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbGlkYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QUklNQVJZX0tFWV8xMV9fVkFMSURBVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxQcmltYXJ5S2V5XzFfMV9WYWxpZGF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9QUklNQVJZX0tFWV8xMV9fQ09MVU1OUyA9IGVJTlNUQU5DRS5nZXRYbWxQcmltYXJ5S2V5XzFfMV9Db2x1bW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuSWRWYWxpZGF0aW9uVHlwZV8xXzEgPGVtPklkIFZhbGlkYXRpb24gVHlwZSAxMTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLklkVmFsaWRhdGlvblR5cGVfMV8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0SWRWYWxpZGF0aW9uVHlwZV8xXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIElEX1ZBTElEQVRJT05fVFlQRV8xMSA9IGVJTlNUQU5DRS5nZXRJZFZhbGlkYXRpb25UeXBlXzFfMSgpOwotCi0JfQotCi19IC8vRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvSWRWYWxpZGF0aW9uVHlwZV8xXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL0lkVmFsaWRhdGlvblR5cGVfMV8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NTI2YWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvSWRWYWxpZGF0aW9uVHlwZV8xXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5JZCBWYWxpZGF0aW9uIFR5cGUgMTE8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0SWRWYWxpZGF0aW9uVHlwZV8xXzEoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIElkVmFsaWRhdGlvblR5cGVfMV8xIGltcGxlbWVudHMgRW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5VTEw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTlVMTF9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCU5VTEwoMCwgIk5VTEwiLCAiTlVMTCIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+WkVSTzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNaRVJPX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JWkVSTygyLCAiWkVSTyIsICJaRVJPIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05PTkVfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlOT05FKDIsICJOT05FIiwgIk5PTkUiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5VTEw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5VTEw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTlVMTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTExfVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+WkVSTzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+WkVSTzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNaRVJPCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWkVST19WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05PTkUKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5JZCBWYWxpZGF0aW9uIFR5cGUgMTE8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElkVmFsaWRhdGlvblR5cGVfMV8xW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IElkVmFsaWRhdGlvblR5cGVfMV8xW10KLQkJewotCQkJTlVMTCwKLQkJCVpFUk8sCi0JCQlOT05FLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPklkIFZhbGlkYXRpb24gVHlwZSAxMTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PElkVmFsaWRhdGlvblR5cGVfMV8xPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPklkIFZhbGlkYXRpb24gVHlwZSAxMTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElkVmFsaWRhdGlvblR5cGVfMV8xIGdldChTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlJZFZhbGlkYXRpb25UeXBlXzFfMSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5JZCBWYWxpZGF0aW9uIFR5cGUgMTE8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJZFZhbGlkYXRpb25UeXBlXzFfMSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJSWRWYWxpZGF0aW9uVHlwZV8xXzEgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5JZCBWYWxpZGF0aW9uIFR5cGUgMTE8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJZFZhbGlkYXRpb25UeXBlXzFfMSBnZXQoaW50IHZhbHVlKQotCXsKLQkJc3dpdGNoICh2YWx1ZSkKLQkJewotCQkJY2FzZSBOVUxMX1ZBTFVFOiByZXR1cm4gTlVMTDsKLQkJCWNhc2UgWkVST19WQUxVRTogcmV0dXJuIFpFUk87Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElkVmFsaWRhdGlvblR5cGVfMV8xKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQotCXsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQotCXsKLQkgIHJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkgIHJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCi0JewotCSAgcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCXJldHVybiBsaXRlcmFsOwotCX0KLQkKLX0gLy9JZFZhbGlkYXRpb25UeXBlXzFfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvWG1sQmFzaWNfMV8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9YbWxCYXNpY18xXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJmNTc2NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9YbWxCYXNpY18xXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEJhc2ljIDExPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxCYXNpY18xXzEjZ2V0R2VuZXJhdGVkVmFsdWUgPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sQmFzaWNfMV8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxCYXNpY18xXzEgZXh0ZW5kcyBYbWxHZW5lcmF0b3JDb250YWluZXIKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HZW5lcmF0ZWQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEdlbmVyYXRlZFZhbHVlKFhtbEdlbmVyYXRlZFZhbHVlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sQmFzaWNfMV8xX0dlbmVyYXRlZFZhbHVlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbEdlbmVyYXRlZFZhbHVlIGdldEdlbmVyYXRlZFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sQmFzaWNfMV8xI2dldEdlbmVyYXRlZFZhbHVlIDxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0R2VuZXJhdGVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEdlbmVyYXRlZFZhbHVlKFhtbEdlbmVyYXRlZFZhbHVlIHZhbHVlKTsKLQotfSAvLyBYbWxCYXNpY18xXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL1htbEVudGl0eV8xXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL1htbEVudGl0eV8xXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjliZGQ4Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9YbWxFbnRpdHlfMV8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbnRpdHkgMTE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEVudGl0eV8xXzEjZ2V0UHJpbWFyeUtleSA8ZW0+UHJpbWFyeSBLZXk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlI2dldFhtbEVudGl0eV8xXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVudGl0eV8xXzEgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmltYXJ5S2V5KFhtbFByaW1hcnlLZXkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxFbnRpdHlfMV8xX1ByaW1hcnlLZXkoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sUHJpbWFyeUtleSBnZXRQcmltYXJ5S2V5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sRW50aXR5XzFfMSNnZXRQcmltYXJ5S2V5IDxlbT5QcmltYXJ5IEtleTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByaW1hcnlLZXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByaW1hcnlLZXkoWG1sUHJpbWFyeUtleSB2YWx1ZSk7Ci0KLX0gLy8gWG1sRW50aXR5XzFfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL1htbE1hcHBlZFN1cGVyY2xhc3NfMV8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NTFmNzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDExPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSNnZXRQcmltYXJ5S2V5IDxlbT5QcmltYXJ5IEtleTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmltYXJ5IEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmltYXJ5IEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJpbWFyeUtleShYbWxQcmltYXJ5S2V5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzFfUHJpbWFyeUtleSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxQcmltYXJ5S2V5IGdldFByaW1hcnlLZXkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSNnZXRQcmltYXJ5S2V5IDxlbT5QcmltYXJ5IEtleTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByaW1hcnlLZXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByaW1hcnlLZXkoWG1sUHJpbWFyeUtleSB2YWx1ZSk7Ci0KLX0gLy8gWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL1htbFByaW1hcnlLZXlfMV8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9YbWxQcmltYXJ5S2V5XzFfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Mzg4ZWQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL1htbFByaW1hcnlLZXlfMV8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQcmltYXJ5IEtleSAxMTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sUHJpbWFyeUtleV8xXzEjZ2V0VmFsaWRhdGlvbiA8ZW0+VmFsaWRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbFByaW1hcnlLZXlfMV8xI2dldENvbHVtbnMgPGVtPkNvbHVtbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlI2dldFhtbFByaW1hcnlLZXlfMV8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxQcmltYXJ5S2V5XzFfMSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWxpZGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLklkVmFsaWRhdGlvblR5cGVfMV8xfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbGlkYXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuSWRWYWxpZGF0aW9uVHlwZV8xXzEKLQkgKiBAc2VlICNzZXRWYWxpZGF0aW9uKElkVmFsaWRhdGlvblR5cGVfMV8xKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleV8xXzFfVmFsaWRhdGlvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUlkVmFsaWRhdGlvblR5cGVfMV8xIGdldFZhbGlkYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxQcmltYXJ5S2V5XzFfMSNnZXRWYWxpZGF0aW9uIDxlbT5WYWxpZGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWxpZGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5JZFZhbGlkYXRpb25UeXBlXzFfMQotCSAqIEBzZWUgI2dldFZhbGlkYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbGlkYXRpb24oSWRWYWxpZGF0aW9uVHlwZV8xXzEgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleV8xXzFfQ29sdW1ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxDb2x1bW4+IGdldENvbHVtbnMoKTsKLQotfSAvLyBYbWxQcmltYXJ5S2V5XzFfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzIvRWNsaXBzZUxpbmsxXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8yL0VjbGlwc2VMaW5rMV8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZTczYjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzIvRWNsaXBzZUxpbmsxXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rMV8xOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmsxXzIKLQlleHRlbmRzIEVjbGlwc2VMaW5rMV8xCi17Ci0JU3RyaW5nIFNDSEVNQV9OQU1FU1BBQ0UgPSBFY2xpcHNlTGluay5TQ0hFTUFfTkFNRVNQQUNFOwotCVN0cmluZyBTQ0hFTUFfTE9DQVRJT04gPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX29ybV8xXzIueHNkIjsKLQlTdHJpbmcgU0NIRU1BX1ZFUlNJT04JPSAiMS4yIjsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvRWNsaXBzZUxpbmsyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL0VjbGlwc2VMaW5rMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NjYzY2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvRWNsaXBzZUxpbmsyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmsxXzE7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGluazJfMAotCWV4dGVuZHMgRWNsaXBzZUxpbmsxXzEsIEpQQTJfMAotewotCVN0cmluZyBTQ0hFTUFfTkFNRVNQQUNFID0gRWNsaXBzZUxpbmsuU0NIRU1BX05BTUVTUEFDRTsKLQlTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMl8wLnhzZCI7Ci0JU3RyaW5nIFNDSEVNQV9WRVJTSU9OCT0gIjIuMCI7Ci0JCi0JLy8gRWNsaXBzZUxpbmsgMi4wIHNwZWNpZmljIG5vZGVzCi0KLQlTdHJpbmcgQ0FDSEVfSU5URVJDRVBUT1IgPSAiY2FjaGUtaW50ZXJjZXB0b3IiOwotCQotCVN0cmluZyBDT1JSRUNUSU9OX1RZUEUgPSAiY29ycmVjdGlvbi10eXBlIjsKLQlTdHJpbmcgTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERSA9ICJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIjsKLQotCVN0cmluZyBRVUVSWV9SRURJUkVDVE9SUyA9ICJxdWVyeS1yZWRpcmVjdG9ycyI7Ci0JU3RyaW5nIFFVRVJZX1JFRElSRUNUT1JTX19BTExfUVVFUklFUyA9ICJhbGwtcXVlcmllcyI7Ci0JU3RyaW5nIFFVRVJZX1JFRElSRUNUT1JTX19SRUFEX0FMTCA9ICJyZWFkLWFsbCI7Ci0JU3RyaW5nIFFVRVJZX1JFRElSRUNUT1JTX19SRUFEX09CSkVDVCA9ICJyZWFkLW9iamVjdCI7Ci0JU3RyaW5nIFFVRVJZX1JFRElSRUNUT1JTX19SRVBPUlQgPSAicmVwb3J0IjsKLQlTdHJpbmcgUVVFUllfUkVESVJFQ1RPUlNfX1VQREFURSA9ICJ1cGRhdGUiOwotCVN0cmluZyBRVUVSWV9SRURJUkVDVE9SU19fSU5TRVJUID0gImluc2VydCI7Ci0JU3RyaW5nIFFVRVJZX1JFRElSRUNUT1JTX19ERUxFVEUgPSAiZGVsZXRlIjsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzE3YzEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL0VjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeUltcGwKLXsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeSBlSU5TVEFOQ0UgPSBpbml0KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5IGluaXQoKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCUVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkgdGhlRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeSA9IChFY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJqcHQuZWNsaXBzZWxpbmsub3JtLnYyXzAueG1pIik7IAotCQkJaWYgKHRoZUVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkgIT0gbnVsbCkKLQkJCXsKLQkJCQlyZXR1cm4gdGhlRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKLQkJewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKQotCXsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5PUkRFUl9DT1JSRUNUSU9OX1RZUEVfMjA6Ci0JCQkJcmV0dXJuIGNyZWF0ZU9yZGVyQ29ycmVjdGlvblR5cGVfMl8wRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuT1JERVJfQ09SUkVDVElPTl9UWVBFXzIwOgotCQkJCXJldHVybiBjb252ZXJ0T3JkZXJDb3JyZWN0aW9uVHlwZV8yXzBUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIGNyZWF0ZU9yZGVyQ29ycmVjdGlvblR5cGVfMl8wRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAgcmVzdWx0ID0gT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSBnZXRFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlKCkKLQl7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgZ2V0UGFja2FnZSgpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmM1NWNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL0VjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2VJbXBsCi17Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTkFNRSA9ICJ2Ml8wIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5TX1VSSSA9ICJqcHQuZWNsaXBzZWxpbmsub3JtLnYyXzAueG1pIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wIDxlbT5YbWwgTWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZSBDb250YWluZXIgMjA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSXzIwID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfMjBfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZSBDb250YWluZXIgMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfMjBfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAgPGVtPlhtbCBDb2xsZWN0aW9uIE1hcHBpbmcgMjA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IFhNTF9NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl8yMF9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19DT05WRVJURVJTID0gWE1MX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSXzIwX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19UWVBFX0NPTlZFUlRFUlMgPSBYTUxfTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfMjBfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTID0gWE1MX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSXzIwX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfX1NUUlVDVF9DT05WRVJURVJTID0gWE1MX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSXzIwX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9fTUFQX0tFWV9DT05WRVJUID0gWE1MX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSXzIwX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBDb2xsZWN0aW9uIE1hcHBpbmcgMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX0ZFQVRVUkVfQ09VTlQgPSBYTUxfTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfMjBfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0FDQ0VTUyA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FDQ0VTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19OQU1FID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fQUNDRVNTX01FVEhPRFMgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1NfTUVUSE9EUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX1BST1BFUlRJRVMgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX19QUk9QRVJUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19BVFRSSUJVVEVfVFlQRSA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FUVFJJQlVURV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvYjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTE9CID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fVEVNUE9SQUwgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0VOVU1FUkFURUQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0NPTlZFUlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0NPTlZFUlRFUlMgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19UWVBFX0NPTlZFUlRFUlMgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fU1RSVUNUX0NPTlZFUlRFUlMgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTUFQX0tFWV9DT05WRVJUID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlfMl8wIDxlbT5YbWwgRW50aXR5IDIwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbEVudGl0eV8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIwID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWNoZSBJbnRlcmNlcHRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yMF9fQ0FDSEVfSU5URVJDRVBUT1IgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlF1ZXJ5IFJlZGlyZWN0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIwX19RVUVSWV9SRURJUkVDVE9SUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVudGl0eSAyMDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjBfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMCA8ZW0+WG1sIE1hbnkgVG8gTWFueSAyMDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIwID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIwX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IFhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMF9fQ09OVkVSVEVSUyA9IFhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfX0NPTlZFUlRFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjBfX1RZUEVfQ09OVkVSVEVSUyA9IFhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfX1RZUEVfQ09OVkVSVEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjBfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlMgPSBYTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjBfX1NUUlVDVF9DT05WRVJURVJTID0gWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9fU1RSVUNUX0NPTlZFUlRFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDb252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIwX19NQVBfS0VZX0NPTlZFUlQgPSBYTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19NQVBfS0VZX0NPTlZFUlQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hbnkgVG8gTWFueSAyMDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjBfRkVBVFVSRV9DT1VOVCA9IFhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjBfX0NBQ0hFQUJMRSA9IE9ybVYyXzBQYWNrYWdlLlhNTF9DQUNIRUFCTEVfMjBfX0NBQ0hFQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWNoZSBJbnRlcmNlcHRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIwX19DQUNIRV9JTlRFUkNFUFRPUiA9IE9ybVYyXzBQYWNrYWdlLlhNTF9DQUNIRUFCTEVfMjBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIwX0ZFQVRVUkVfQ09VTlQgPSBPcm1WMl8wUGFja2FnZS5YTUxfQ0FDSEVBQkxFXzIwX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMCA8ZW0+WG1sIE9uZSBUbyBNYW55IDIwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvTWFueV8yXzAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbE9uZVRvTWFueV8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjAgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMF9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBYTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMF9fQ09OVkVSVEVSUyA9IFhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfX0NPTlZFUlRFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMF9fVFlQRV9DT05WRVJURVJTID0gWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9fVFlQRV9DT05WRVJURVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIwX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTID0gWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjBfX1NUUlVDVF9DT05WRVJURVJTID0gWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9fU1RSVUNUX0NPTlZFUlRFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDb252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjBfX01BUF9LRVlfQ09OVkVSVCA9IFhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfX01BUF9LRVlfQ09OVkVSVDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT25lIFRvIE1hbnkgMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjBfRkVBVFVSRV9DT1VOVCA9IFhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzAgPGVtPlhtbCBPcmRlciBDb2x1bW4gMjA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbl8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OXzIwID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3JyZWN0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fMjBfX0NPUlJFQ1RJT05fVFlQRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9yZGVyIENvbHVtbiAyMDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fMjBfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCA8ZW0+WG1sIFF1ZXJ5IFJlZGlyZWN0b3JzIDIwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9SRURJUkVDVE9SU18yMCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWxsIFF1ZXJpZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9fQUxMX1FVRVJJRVMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgQWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1JFQURfQUxMID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9iamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19SRUFEX09CSkVDVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1JFUE9SVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBkYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1VQREFURSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX0lOU0VSVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX0RFTEVURSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFF1ZXJ5IFJlZGlyZWN0b3JzIDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX0ZFQVRVUkVfQ09VTlQgPSA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAgPGVtPk9yZGVyIENvcnJlY3Rpb24gVHlwZSAyMDwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9yZGVyQ29ycmVjdGlvblR5cGVfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9SREVSX0NPUlJFQ1RJT05fVFlQRV8yMCA9IDk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDb2xsZWN0aW9uTWFwcGluZ18yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVudGl0eV8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFueVRvTWFueV8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFwcGVkU3VwZXJjbGFzc18yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sT25lVG9NYW55XzJfMEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxPcmRlckNvbHVtbl8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUXVlcnlSZWRpcmVjdG9yc18yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBvcmRlckNvcnJlY3Rpb25UeXBlXzJfMEVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlKCkKLQl7Ci0JCXN1cGVyKGVOU19VUkksIEVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCi0JICogCi0JICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgotCSAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlIGluaXQoKQotCXsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCVhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlFY2xpcHNlTGlua09ybVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1QYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZnJlZXplKCk7Ci0KLSAgCi0JCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQotCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lTlNfVVJJLCB0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlKTsKLQkJcmV0dXJuIHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2U7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wIDxlbT5YbWwgQ29sbGVjdGlvbiBNYXBwaW5nIDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDb2xsZWN0aW9uIE1hcHBpbmcgMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wKCkKLQl7Ci0JCXJldHVybiB4bWxDb2xsZWN0aW9uTWFwcGluZ18yXzBFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wI2dldE1hcEtleUNvbnZlcnQgPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAjZ2V0TWFwS2V5Q29udmVydCgpCi0JICogQHNlZSAjZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wX01hcEtleUNvbnZlcnQoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAoKQotCXsKLQkJcmV0dXJuIHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5XzJfMCA8ZW0+WG1sIEVudGl0eSAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW50aXR5IDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbnRpdHlfMl8wKCkKLQl7Ci0JCXJldHVybiB4bWxFbnRpdHlfMl8wRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5XzJfMCNnZXRDYWNoZUludGVyY2VwdG9yIDxlbT5DYWNoZSBJbnRlcmNlcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNhY2hlIEludGVyY2VwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAjZ2V0Q2FjaGVJbnRlcmNlcHRvcigpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5XzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV8yXzBfQ2FjaGVJbnRlcmNlcHRvcigpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5XzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5XzJfMCNnZXRRdWVyeVJlZGlyZWN0b3JzIDxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAjZ2V0UXVlcnlSZWRpcmVjdG9ycygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5XzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV8yXzBfUXVlcnlSZWRpcmVjdG9ycygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5XzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wIDxlbT5YbWwgTWFueSBUbyBNYW55IDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYW55IFRvIE1hbnkgMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYW55VG9NYW55XzJfMCgpCi0JewotCQlyZXR1cm4geG1sTWFueVRvTWFueV8yXzBFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wIDxlbT5YbWwgTWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZSBDb250YWluZXIgMjA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGUgQ29udGFpbmVyIDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAoKQotCXsKLQkJcmV0dXJuIHhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMCNnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcyA8ZW0+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wI2dldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQkgKiBAc2VlICNnZXRYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wX01hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMjA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzAoKQotCXsKLQkJcmV0dXJuIHhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAjZ2V0Q2FjaGVJbnRlcmNlcHRvciA8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5DYWNoZSBJbnRlcmNlcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCNnZXRDYWNoZUludGVyY2VwdG9yKCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wX0NhY2hlSW50ZXJjZXB0b3IoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMCA8ZW0+WG1sIE9uZSBUbyBNYW55IDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPbmUgVG8gTWFueSAyMDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sT25lVG9NYW55XzJfMCgpCi0JewotCQlyZXR1cm4geG1sT25lVG9NYW55XzJfMEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wIDxlbT5YbWwgT3JkZXIgQ29sdW1uIDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPcmRlciBDb2x1bW4gMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sT3JkZXJDb2x1bW5fMl8wKCkKLQl7Ci0JCXJldHVybiB4bWxPcmRlckNvbHVtbl8yXzBFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wI2dldENvcnJlY3Rpb25UeXBlIDxlbT5Db3JyZWN0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3JyZWN0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wI2dldENvcnJlY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRYbWxPcmRlckNvbHVtbl8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxPcmRlckNvbHVtbl8yXzBfQ29ycmVjdGlvblR5cGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE9yZGVyQ29sdW1uXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wIDxlbT5YbWwgUXVlcnkgUmVkaXJlY3RvcnMgMjA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFF1ZXJ5IFJlZGlyZWN0b3JzIDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzAoKQotCXsKLQkJcmV0dXJuIHhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0QWxsUXVlcmllcyA8ZW0+QWxsIFF1ZXJpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbGwgUXVlcmllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRBbGxRdWVyaWVzKCkKLQkgKiBAc2VlICNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0FsbFF1ZXJpZXMoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRSZWFkQWxsIDxlbT5SZWFkIEFsbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlYWQgQWxsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldFJlYWRBbGwoKQotCSAqIEBzZWUgI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfUmVhZEFsbCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUXVlcnlSZWRpcmVjdG9yc18yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldFJlYWRPYmplY3QgPGVtPlJlYWQgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVhZCBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0UmVhZE9iamVjdCgpCi0JICogQHNlZSAjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9SZWFkT2JqZWN0KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxRdWVyeVJlZGlyZWN0b3JzXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0UmVwb3J0IDxlbT5SZXBvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXBvcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0UmVwb3J0KCkKLQkgKiBAc2VlICNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1JlcG9ydCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUXVlcnlSZWRpcmVjdG9yc18yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldFVwZGF0ZSA8ZW0+VXBkYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXBkYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldFVwZGF0ZSgpCi0JICogQHNlZSAjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9VcGRhdGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRJbnNlcnQgPGVtPkluc2VydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluc2VydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRJbnNlcnQoKQotCSAqIEBzZWUgI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfSW5zZXJ0KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxRdWVyeVJlZGlyZWN0b3JzXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0RGVsZXRlIDxlbT5EZWxldGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWxldGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0RGVsZXRlKCkKLQkgKiBAc2VlICNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0RlbGV0ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUXVlcnlSZWRpcmVjdG9yc18yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIDxlbT5PcmRlciBDb3JyZWN0aW9uIFR5cGUgMjA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5PcmRlciBDb3JyZWN0aW9uIFR5cGUgMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wKCkKLQl7Ci0JCXJldHVybiBvcmRlckNvcnJlY3Rpb25UeXBlXzJfMEVFbnVtOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkgZ2V0RWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeSgpCi0JewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCXsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQl4bWxDb2xsZWN0aW9uTWFwcGluZ18yXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wRUNsYXNzLCBYTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19NQVBfS0VZX0NPTlZFUlQpOwotCi0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwKTsKLQotCQl4bWxFbnRpdHlfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTlRJVFlfMjApOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eV8yXzBFQ2xhc3MsIFhNTF9FTlRJVFlfMjBfX0NBQ0hFX0lOVEVSQ0VQVE9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlfMl8wRUNsYXNzLCBYTUxfRU5USVRZXzIwX19RVUVSWV9SRURJUkVDVE9SUyk7Ci0KLQkJeG1sTWFueVRvTWFueV8yXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BTllfVE9fTUFOWV8yMCk7Ci0KLQkJeG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSXzIwKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMEVDbGFzcywgWE1MX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSXzIwX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUyk7Ci0KLQkJeG1sTWFwcGVkU3VwZXJjbGFzc18yXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIwKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMEVDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIwX19DQUNIRV9JTlRFUkNFUFRPUik7Ci0KLQkJeG1sT25lVG9NYW55XzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT05FX1RPX01BTllfMjApOwotCi0JCXhtbE9yZGVyQ29sdW1uXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT1JERVJfQ09MVU1OXzIwKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxPcmRlckNvbHVtbl8yXzBFQ2xhc3MsIFhNTF9PUkRFUl9DT0xVTU5fMjBfX0NPUlJFQ1RJT05fVFlQRSk7Ci0KLQkJeG1sUXVlcnlSZWRpcmVjdG9yc18yXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxRdWVyeVJlZGlyZWN0b3JzXzJfMEVDbGFzcywgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19BTExfUVVFUklFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUXVlcnlSZWRpcmVjdG9yc18yXzBFQ2xhc3MsIFhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9fUkVBRF9BTEwpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wRUNsYXNzLCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1JFQURfT0JKRUNUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxRdWVyeVJlZGlyZWN0b3JzXzJfMEVDbGFzcywgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19SRVBPUlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wRUNsYXNzLCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1VQREFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUXVlcnlSZWRpcmVjdG9yc18yXzBFQ2xhc3MsIFhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9fSU5TRVJUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxRdWVyeVJlZGlyZWN0b3JzXzJfMEVDbGFzcywgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19ERUxFVEUpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQlvcmRlckNvcnJlY3Rpb25UeXBlXzJfMEVFbnVtID0gY3JlYXRlRUVudW0oT1JERVJfQ09SUkVDVElPTl9UWVBFXzIwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCXsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlFY2xpcHNlTGlua09ybVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVBhY2thZ2UuZU5TX1VSSSk7Ci0JCVhNTFR5cGVQYWNrYWdlIHRoZVhNTFR5cGVQYWNrYWdlID0gKFhNTFR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOwotCQlPcm1QYWNrYWdlIHRoZU9ybVBhY2thZ2UgPSAoT3JtUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPcm1QYWNrYWdlLmVOU19VUkkpOwotCQlPcm1WMl8wUGFja2FnZSB0aGVPcm1WMl8wUGFja2FnZSA9IChPcm1WMl8wUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPcm1WMl8wUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQl4bWxDb2xsZWN0aW9uTWFwcGluZ18yXzBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMCgpKTsKLQkJeG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxDb252ZXJ0ZXJDb250YWluZXIoKSk7Ci0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKSk7Ci0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCgpKTsKLQkJeG1sTWFueVRvTWFueV8yXzBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAoKSk7Ci0JCXhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlLmdldFhtbENhY2hlYWJsZV8yXzAoKSk7Ci0JCXhtbE9uZVRvTWFueV8yXzBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyh4bWxDb2xsZWN0aW9uTWFwcGluZ18yXzBFQ2xhc3MsIFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMC5jbGFzcywgIlhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMF9NYXBLZXlDb252ZXJ0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwS2V5Q29udmVydCIsIG51bGwsIDAsIDEsIFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcywgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wLmNsYXNzLCAiWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEVudGl0eV8yXzBFQ2xhc3MsIFhtbEVudGl0eV8yXzAuY2xhc3MsICJYbWxFbnRpdHlfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5XzJfMF9DYWNoZUludGVyY2VwdG9yKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sQ2xhc3NSZWZlcmVuY2UoKSwgbnVsbCwgImNhY2hlSW50ZXJjZXB0b3IiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHlfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfMl8wX1F1ZXJ5UmVkaXJlY3RvcnMoKSwgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbFF1ZXJ5UmVkaXJlY3RvcnMoKSwgbnVsbCwgInF1ZXJ5UmVkaXJlY3RvcnMiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHlfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sTWFueVRvTWFueV8yXzBFQ2xhc3MsIFhtbE1hbnlUb01hbnlfMl8wLmNsYXNzLCAiWG1sTWFueVRvTWFueV8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzBFQ2xhc3MsIFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wLmNsYXNzLCAiWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMF9NYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpLCB0aGVPcm1QYWNrYWdlLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSwgbnVsbCwgIm1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzIiwgbnVsbCwgMCwgLTEsIFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sTWFwcGVkU3VwZXJjbGFzc18yXzBFQ2xhc3MsIFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wLmNsYXNzLCAiWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMF9DYWNoZUludGVyY2VwdG9yKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sQ2xhc3NSZWZlcmVuY2UoKSwgbnVsbCwgImNhY2hlSW50ZXJjZXB0b3IiLCBudWxsLCAwLCAxLCBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE9uZVRvTWFueV8yXzBFQ2xhc3MsIFhtbE9uZVRvTWFueV8yXzAuY2xhc3MsICJYbWxPbmVUb01hbnlfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE9yZGVyQ29sdW1uXzJfMEVDbGFzcywgWG1sT3JkZXJDb2x1bW5fMl8wLmNsYXNzLCAiWG1sT3JkZXJDb2x1bW5fMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sT3JkZXJDb2x1bW5fMl8wX0NvcnJlY3Rpb25UeXBlKCksIHRoaXMuZ2V0T3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAoKSwgImNvcnJlY3Rpb25UeXBlIiwgbnVsbCwgMCwgMSwgWG1sT3JkZXJDb2x1bW5fMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUXVlcnlSZWRpcmVjdG9yc18yXzBFQ2xhc3MsIFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wLmNsYXNzLCAiWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9BbGxRdWVyaWVzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYWxsUXVlcmllcyIsIG51bGwsIDAsIDEsIFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9SZWFkQWxsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVhZEFsbCIsIG51bGwsIDAsIDEsIFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9SZWFkT2JqZWN0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVhZE9iamVjdCIsIG51bGwsIDAsIDEsIFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9SZXBvcnQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZXBvcnQiLCBudWxsLCAwLCAxLCBYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfVXBkYXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidXBkYXRlIiwgbnVsbCwgMCwgMSwgWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0luc2VydCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImluc2VydCIsIG51bGwsIDAsIDEsIFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9EZWxldGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZWxldGUiLCBudWxsLCAwLCAxLCBYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0ob3JkZXJDb3JyZWN0aW9uVHlwZV8yXzBFRW51bSwgT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAuY2xhc3MsICJPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCIpOwotCQlhZGRFRW51bUxpdGVyYWwob3JkZXJDb3JyZWN0aW9uVHlwZV8yXzBFRW51bSwgT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAuUkVBRCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChvcmRlckNvcnJlY3Rpb25UeXBlXzJfMEVFbnVtLCBPcmRlckNvcnJlY3Rpb25UeXBlXzJfMC5SRUFEX1dSSVRFKTsKLQkJYWRkRUVudW1MaXRlcmFsKG9yZGVyQ29ycmVjdGlvblR5cGVfMl8wRUVudW0sIE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wLkVYQ0VQVElPTik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludGVyZmFjZSBMaXRlcmFscwotCXsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wIDxlbT5YbWwgQ29sbGVjdGlvbiBNYXBwaW5nIDIwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfX01BUF9LRVlfQ09OVkVSVCA9IGVJTlNUQU5DRS5nZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzBfTWFwS2V5Q29udmVydCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwID0gZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAgPGVtPlhtbCBFbnRpdHkgMjA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5XzJfMAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbEVudGl0eV8yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU5USVRZXzIwID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhY2hlIEludGVyY2VwdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZXzIwX19DQUNIRV9JTlRFUkNFUFRPUiA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMl8wX0NhY2hlSW50ZXJjZXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlF1ZXJ5IFJlZGlyZWN0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZXzIwX19RVUVSWV9SRURJUkVDVE9SUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMl8wX1F1ZXJ5UmVkaXJlY3RvcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMCA8ZW0+WG1sIE1hbnkgVG8gTWFueSAyMDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbE1hbnlUb01hbnlfMl8wKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX01BTllfVE9fTUFOWV8yMCA9IGVJTlNUQU5DRS5nZXRYbWxNYW55VG9NYW55XzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wIDxlbT5YbWwgTWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZSBDb250YWluZXIgMjA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl8yMCA9IGVJTlNUQU5DRS5nZXRYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSXzIwX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IGVJTlNUQU5DRS5nZXRYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMF9NYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMjA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMCA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGUgSW50ZXJjZXB0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMF9fQ0FDSEVfSU5URVJDRVBUT1IgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzBfQ2FjaGVJbnRlcmNlcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvTWFueV8yXzAgPGVtPlhtbCBPbmUgVG8gTWFueSAyMDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PTkVfVE9fTUFOWV8yMCA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnlfMl8wKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wIDxlbT5YbWwgT3JkZXIgQ29sdW1uIDIwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbE9yZGVyQ29sdW1uXzJfMCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PUkRFUl9DT0xVTU5fMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sT3JkZXJDb2x1bW5fMl8wKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db3JyZWN0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9PUkRFUl9DT0xVTU5fMjBfX0NPUlJFQ1RJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxPcmRlckNvbHVtbl8yXzBfQ29ycmVjdGlvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCA8ZW0+WG1sIFF1ZXJ5IFJlZGlyZWN0b3JzIDIwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFsbCBRdWVyaWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX0FMTF9RVUVSSUVTID0gZUlOU1RBTkNFLmdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0FsbFF1ZXJpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlYWQgQWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1JFQURfQUxMID0gZUlOU1RBTkNFLmdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1JlYWRBbGwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT2JqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1JFQURfT0JKRUNUID0gZUlOU1RBTkNFLmdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1JlYWRPYmplY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19SRVBPUlQgPSBlSU5TVEFOQ0UuZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfUmVwb3J0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VcGRhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9fVVBEQVRFID0gZUlOU1RBTkNFLmdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1VwZGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX0lOU0VSVCA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9JbnNlcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19ERUxFVEUgPSBlSU5TVEFOQ0UuZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfRGVsZXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAgPGVtPk9yZGVyIENvcnJlY3Rpb24gVHlwZSAyMDwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9yZGVyQ29ycmVjdGlvblR5cGVfMl8wCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0T3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIE9SREVSX0NPUlJFQ1RJT05fVFlQRV8yMCA9IGVJTlNUQU5DRS5nZXRPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCgpOwotCi0JfQotCi19IC8vRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL09yZGVyQ29ycmVjdGlvblR5cGVfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YTFmNTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+T3JkZXIgQ29sdW1uIENvcnJlY3Rpb24gVHlwZSAyMDwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAgaW1wbGVtZW50cyBFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+UkVBRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRUFEX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JUkVBRCgwLCAiUkVBRCIsICJSRUFEIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRUFEIFdSSVRFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFQURfV1JJVEVfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlSRUFEX1dSSVRFKDEsICJSRUFEX1dSSVRFIiwgIlJFQURfV1JJVEUiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVYQ0VQVElPTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWENFUFRJT05fVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlFWENFUFRJT04oMiwgIkVYQ0VQVElPTiIsICJFWENFUFRJT04iKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJFQUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlJFQUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVBRAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURfVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UkVBRCBXUklURTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UkVBRCBXUklURTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRUFEX1dSSVRFCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRF9XUklURV9WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FWENFUFRJT048L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkVYQ0VQVElPTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWENFUFRJT04KLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWENFUFRJT05fVkFMVUUgPSAyOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPk9yZGVyIENvcnJlY3Rpb24gVHlwZSAyMDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzBbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzBbXQotCQl7Ci0JCQlSRUFELAotCQkJUkVBRF9XUklURSwKLQkJCUVYQ0VQVElPTiwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5PcmRlciBDb3JyZWN0aW9uIFR5cGUgMjA8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxPcmRlckNvcnJlY3Rpb25UeXBlXzJfMD4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5PcmRlciBDb3JyZWN0aW9uIFR5cGUgMjA8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCBnZXQoU3RyaW5nIGxpdGVyYWwpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+T3JkZXIgQ29ycmVjdGlvbiBUeXBlIDIwPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCU9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+T3JkZXIgQ29ycmVjdGlvbiBUeXBlIDIwPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAgZ2V0KGludCB2YWx1ZSkKLQl7Ci0JCXN3aXRjaCAodmFsdWUpCi0JCXsKLQkJCWNhc2UgUkVBRF9WQUxVRTogcmV0dXJuIFJFQUQ7Ci0JCQljYXNlIFJFQURfV1JJVEVfVkFMVUU6IHJldHVybiBSRUFEX1dSSVRFOwotCQkJY2FzZSBFWENFUFRJT05fVkFMVUU6IHJldHVybiBFWENFUFRJT047Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQotCXsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQotCXsKLQkgIHJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkgIHJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCi0JewotCSAgcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCXJldHVybiBsaXRlcmFsOwotCX0KLQkKLX0gLy9PcmRlckNvbHVtbkNvcnJlY3Rpb25UeXBlXzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sQ2FjaGVJbnRlcmNlcHRvcl8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbENhY2hlSW50ZXJjZXB0b3JfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMDlhNTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sQ2FjaGVJbnRlcmNlcHRvcl8yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ2FjaGUgSW50ZXJjZXB0b3IyIDA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDYWNoZUludGVyY2VwdG9yXzJfMCNnZXRDbGFzc05hbWUgPGVtPkNsYXNzIE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbENhY2hlSW50ZXJjZXB0b3JfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxDYWNoZUludGVyY2VwdG9yXzJfMCBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENsYXNzTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxDYWNoZUludGVyY2VwdG9yXzJfMF9DbGFzc05hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q2xhc3NOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FjaGVJbnRlcmNlcHRvcl8yXzAjZ2V0Q2xhc3NOYW1lIDxlbT5DbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDbGFzc05hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbENhY2hlSW50ZXJjZXB0b3IyXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbENvbGxlY3Rpb25NYXBwaW5nXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NGRiZjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyQ29udGFpbmVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ29sbGVjdGlvbiBNYXBwaW5nIDIwPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wI2dldE1hcEtleUNvbnZlcnQgPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAgZXh0ZW5kcyBYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMCwgWG1sQ29udmVydGVyQ29udGFpbmVyCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBDb252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYXBLZXlDb252ZXJ0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMF9NYXBLZXlDb252ZXJ0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYXBLZXlDb252ZXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wI2dldE1hcEtleUNvbnZlcnQgPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYXBLZXlDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXBLZXlDb252ZXJ0KFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjQ4N2QxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmc7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGV4dGVuZHMgWG1sQXR0cmlidXRlTWFwcGluZywgWG1sQ29udmVydGlibGVNYXBwaW5nLCBYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAKLXsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEVudGl0eV8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEVudGl0eV8yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyYTdkOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxFbnRpdHlfMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xhc3NSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlSZWRpcmVjdG9yczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEVudGl0eTIgMDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAjZ2V0Q2FjaGVJbnRlcmNlcHRvciA8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlfMl8wI2dldFF1ZXJ5UmVkaXJlY3RvcnMgPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbnRpdHlfMl8wIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhY2hlIEludGVyY2VwdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYWNoZSBJbnRlcmNlcHRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZSBJbnRlcmNlcHRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2FjaGVJbnRlcmNlcHRvcihYbWxDbGFzc1JlZmVyZW5jZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbEVudGl0eV8yXzBfQ2FjaGVJbnRlcmNlcHRvcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxDbGFzc1JlZmVyZW5jZSBnZXRDYWNoZUludGVyY2VwdG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5XzJfMCNnZXRDYWNoZUludGVyY2VwdG9yIDxlbT5DYWNoZSBJbnRlcmNlcHRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhY2hlSW50ZXJjZXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhY2hlSW50ZXJjZXB0b3IoWG1sQ2xhc3NSZWZlcmVuY2UgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UXVlcnkgUmVkaXJlY3RvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRRdWVyeVJlZGlyZWN0b3JzKFhtbFF1ZXJ5UmVkaXJlY3RvcnMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8wX1F1ZXJ5UmVkaXJlY3RvcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sUXVlcnlSZWRpcmVjdG9ycyBnZXRRdWVyeVJlZGlyZWN0b3JzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5XzJfMCNnZXRRdWVyeVJlZGlyZWN0b3JzIDxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFF1ZXJ5UmVkaXJlY3RvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFF1ZXJ5UmVkaXJlY3RvcnMoWG1sUXVlcnlSZWRpcmVjdG9ycyB2YWx1ZSk7Ci0KLX0gLy8gWG1sRW50aXR5Ml8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxNYW55VG9NYW55XzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTWFueVRvTWFueV8yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4MGNmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxNYW55VG9NYW55XzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE1hbnkgVG8gTWFueSAyMDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzAoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE1hbnlUb01hbnlfMl8wIGV4dGVuZHMgWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wCi17Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1NmNjYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlIENvbnRhaW5lcjIgMDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wI2dldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzIDxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMF9NYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiBnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCi19IC8vIFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIyXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE1hcHBlZFN1cGVyY2xhc3NfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGNiMjgwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE1hcHBlZFN1cGVyY2xhc3NfMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xhc3NSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhY2hlYWJsZV8yXzA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNYXBwZWQgU3VwZXJjbGFzcyAyMDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wI2dldENhY2hlSW50ZXJjZXB0b3IgPGVtPkNhY2hlIEludGVyY2VwdG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAgZXh0ZW5kcyBYbWxDYWNoZWFibGVfMl8wCi17Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWNoZSBJbnRlcmNlcHRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENhY2hlSW50ZXJjZXB0b3IoWG1sQ2xhc3NSZWZlcmVuY2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMF9DYWNoZUludGVyY2VwdG9yKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbENsYXNzUmVmZXJlbmNlIGdldENhY2hlSW50ZXJjZXB0b3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCNnZXRDYWNoZUludGVyY2VwdG9yIDxlbT5DYWNoZSBJbnRlcmNlcHRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhY2hlSW50ZXJjZXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhY2hlSW50ZXJjZXB0b3IoWG1sQ2xhc3NSZWZlcmVuY2UgdmFsdWUpOwotCi19IC8vIFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxPbmVUb01hbnlfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxPbmVUb01hbnlfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZjUwMzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sT25lVG9NYW55XzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE9uZSBUbyBNYW55IDIwPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxPbmVUb01hbnlfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxPbmVUb01hbnlfMl8wIGV4dGVuZHMgWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wCi17Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxPcmRlckNvbHVtbl8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE9yZGVyQ29sdW1uXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2M1YzcxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE9yZGVyQ29sdW1uXzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBPcmRlciBDb2x1bW4gMjA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzAjZ2V0Q29ycmVjdGlvblR5cGUgPGVtPkNvcnJlY3Rpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT3JkZXJDb2x1bW5fMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxPcmRlckNvbHVtbl8yXzAgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29ycmVjdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9yZGVyQ29ycmVjdGlvblR5cGVfMl8wfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvcnJlY3Rpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3JyZWN0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9yZGVyQ29ycmVjdGlvblR5cGVfMl8wCi0JICogQHNlZSAjc2V0Q29ycmVjdGlvblR5cGUoT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzApCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbl8yXzBfQ29ycmVjdGlvblR5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCBnZXRDb3JyZWN0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMCNnZXRDb3JyZWN0aW9uVHlwZSA8ZW0+Q29ycmVjdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3JyZWN0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9yZGVyQ29ycmVjdGlvblR5cGVfMl8wCi0JICogQHNlZSAjZ2V0Q29ycmVjdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvcnJlY3Rpb25UeXBlKE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIHZhbHVlKTsKLQotfSAvLyBYbWxPcmRlckNvbHVtbl8yXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGZhMTE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBRdWVyeSBSZWRpcmVjdG9yczIgMDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldEFsbFF1ZXJpZXMgPGVtPkFsbCBRdWVyaWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0UmVhZEFsbCA8ZW0+UmVhZCBBbGw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRSZWFkT2JqZWN0IDxlbT5SZWFkIE9iamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldFJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0VXBkYXRlIDxlbT5VcGRhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRJbnNlcnQgPGVtPkluc2VydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldERlbGV0ZSA8ZW0+RGVsZXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWxsIFF1ZXJpZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFsbCBRdWVyaWVzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsbCBRdWVyaWVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBbGxRdWVyaWVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0FsbFF1ZXJpZXMoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFsbFF1ZXJpZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRBbGxRdWVyaWVzIDxlbT5BbGwgUXVlcmllczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWxsIFF1ZXJpZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFsbFF1ZXJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsbFF1ZXJpZXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlYWQgQWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWFkIEFsbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFkIEFsbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVhZEFsbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9SZWFkQWxsKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZWFkQWxsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0UmVhZEFsbCA8ZW0+UmVhZCBBbGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlYWQgQWxsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWFkQWxsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWFkQWxsKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWFkIE9iamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVhZCBPYmplY3Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVhZCBPYmplY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlYWRPYmplY3QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfUmVhZE9iamVjdCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UmVhZE9iamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldFJlYWRPYmplY3QgPGVtPlJlYWQgT2JqZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFkIE9iamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVhZE9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVhZE9iamVjdChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXBvcnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwb3J0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXBvcnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfUmVwb3J0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZXBvcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRSZXBvcnQgPGVtPlJlcG9ydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVwb3J0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlcG9ydChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXBkYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VcGRhdGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXBkYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVcGRhdGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfVXBkYXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRVcGRhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRVcGRhdGUgPGVtPlVwZGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXBkYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVcGRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVwZGF0ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5zZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnNlcnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5zZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJbnNlcnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfSW5zZXJ0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJbnNlcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRJbnNlcnQgPGVtPkluc2VydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5zZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbnNlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEluc2VydChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWxldGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWxldGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfRGVsZXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZWxldGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXREZWxldGUgPGVtPkRlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlbGV0ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbFF1ZXJ5UmVkaXJlY3RvcnMyXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL0JhdGNoRmV0Y2hUeXBlXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvQmF0Y2hGZXRjaFR5cGVfMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZGE5MjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvQmF0Y2hGZXRjaFR5cGVfMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5CYXRjaCBGZXRjaCBUeXBlIDIxPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldEJhdGNoRmV0Y2hUeXBlXzJfMSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gQmF0Y2hGZXRjaFR5cGVfMl8xIGltcGxlbWVudHMgRW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkpPSU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSk9JTl9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUpPSU4oMCwgIkpPSU4iLCAiSk9JTiIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RVhJU1RTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYSVNUU19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUVYSVNUUygxLCAiRVhJU1RTIiwgIkVYSVNUUyIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5fVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlJTigyLCAiSU4iLCAiSU4iKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkpPSU48L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkpPSU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSk9JTgotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpPSU5fVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RVhJU1RTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FWElTVFM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVhJU1RTCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhJU1RTX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTgotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaCBUeXBlIDIxPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBCYXRjaEZldGNoVHlwZV8yXzFbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgQmF0Y2hGZXRjaFR5cGVfMl8xW10KLQkJewotCQkJSk9JTiwKLQkJCUVYSVNUUywKLQkJCUlOLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoIFR5cGUgMjE8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxCYXRjaEZldGNoVHlwZV8yXzE+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2ggVHlwZSAyMTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJhdGNoRmV0Y2hUeXBlXzJfMSBnZXQoU3RyaW5nIGxpdGVyYWwpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJQmF0Y2hGZXRjaFR5cGVfMl8xIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoIFR5cGUgMjE8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBCYXRjaEZldGNoVHlwZV8yXzEgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUJhdGNoRmV0Y2hUeXBlXzJfMSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoIFR5cGUgMjE8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBCYXRjaEZldGNoVHlwZV8yXzEgZ2V0KGludCB2YWx1ZSkKLQl7Ci0JCXN3aXRjaCAodmFsdWUpCi0JCXsKLQkJCWNhc2UgSk9JTl9WQUxVRTogcmV0dXJuIEpPSU47Ci0JCQljYXNlIEVYSVNUU19WQUxVRTogcmV0dXJuIEVYSVNUUzsKLQkJCWNhc2UgSU5fVkFMVUU6IHJldHVybiBJTjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQmF0Y2hGZXRjaFR5cGVfMl8xKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQotCXsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQotCXsKLQkgIHJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkgIHJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCi0JewotCSAgcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCXJldHVybiBsaXRlcmFsOwotCX0KLQkKLX0gLy9CYXRjaEZldGNoVHlwZV8yXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL0NhY2hlS2V5VHlwZV8yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL0NhY2hlS2V5VHlwZV8yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQzNjYwNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9DYWNoZUtleVR5cGVfMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+Q2FjaGUgS2V5IFR5cGUgMjE8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0Q2FjaGVLZXlUeXBlXzJfMSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gQ2FjaGVLZXlUeXBlXzJfMSBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JRCBWQUxVRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJRF9WQUxVRV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUlEX1ZBTFVFKDAsICJJRF9WQUxVRSIsICJJRF9WQUxVRSIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0FDSEUgS0VZPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NBQ0hFX0tFWV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUNBQ0hFX0tFWSgxLCAiQ0FDSEVfS0VZIiwgIkNBQ0hFX0tFWSIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QVVUTzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBVVRPX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JQVVUTygyLCAiQVVUTyIsICJBVVRPIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JRCBWQUxVRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SUQgVkFMVUU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSURfVkFMVUUKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9WQUxVRV9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DQUNIRSBLRVk8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNBQ0hFIEtFWTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDQUNIRV9LRVkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUNIRV9LRVlfVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QVVUTzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QVVUTzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBVVRPCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVVUT19WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+Q2FjaGUgS2V5IFR5cGUgMjE8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIENhY2hlS2V5VHlwZV8yXzFbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgQ2FjaGVLZXlUeXBlXzJfMVtdCi0JCXsKLQkJCUlEX1ZBTFVFLAotCQkJQ0FDSEVfS0VZLAotCQkJQVVUTywKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5DYWNoZSBLZXkgVHlwZSAyMTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PENhY2hlS2V5VHlwZV8yXzE+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q2FjaGUgS2V5IFR5cGUgMjE8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDYWNoZUtleVR5cGVfMl8xIGdldChTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlDYWNoZUtleVR5cGVfMl8xIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNhY2hlIEtleSBUeXBlIDIxPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2FjaGVLZXlUeXBlXzJfMSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJQ2FjaGVLZXlUeXBlXzJfMSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNhY2hlIEtleSBUeXBlIDIxPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2FjaGVLZXlUeXBlXzJfMSBnZXQoaW50IHZhbHVlKQotCXsKLQkJc3dpdGNoICh2YWx1ZSkKLQkJewotCQkJY2FzZSBJRF9WQUxVRV9WQUxVRTogcmV0dXJuIElEX1ZBTFVFOwotCQkJY2FzZSBDQUNIRV9LRVlfVkFMVUU6IHJldHVybiBDQUNIRV9LRVk7Ci0JCQljYXNlIEFVVE9fVkFMVUU6IHJldHVybiBBVVRPOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDYWNoZUtleVR5cGVfMl8xKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQotCXsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQotCXsKLQkgIHJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkgIHJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCi0JewotCSAgcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCXJldHVybiBsaXRlcmFsOwotCX0KLQkKLX0gLy9DYWNoZUtleVR5cGVfMl8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9FY2xpcHNlTGluazJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvRWNsaXBzZUxpbmsyXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJkNTQ0YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9FY2xpcHNlTGluazJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGluazJfMDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rMl8xCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMAotewotCVN0cmluZyBTQ0hFTUFfTkFNRVNQQUNFID0gRWNsaXBzZUxpbmsuU0NIRU1BX05BTUVTUEFDRTsKLQlTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMl8xLnhzZCI7Ci0JU3RyaW5nIFNDSEVNQV9WRVJTSU9OCT0gIjIuMSI7Ci0JCi0JCi0JLy8gRWNsaXBzZUxpbmsgMi4xIHNwZWNpZmljIG5vZGVzCi0JCi0JU3RyaW5nIEFUVFJJQlVURSA9ICJhdHRyaWJ1dGUiOwotCVN0cmluZyBBVFRSSUJVVEVfVFlQRSA9ICJhdHRyaWJ1dGUtdHlwZSI7Ci0JU3RyaW5nIEJBVENIX0ZFVENIID0gImJhdGNoLWZldGNoIjsKLQkJU3RyaW5nIEJBVENIX0ZFVENIX19TSVpFID0gInNpemUiOwotCQlTdHJpbmcgQkFUQ0hfRkVUQ0hfX1RZUEUgPSAidHlwZSI7Ci0JU3RyaW5nIENBQ0hFX0tFWV9UWVBFID0gImNhY2hlLWtleS10eXBlIjsKLQlTdHJpbmcgQ0xBU1NfRVhUUkFDVE9SID0gImNsYXNzLWV4dHJhY3RvciI7Ci0JU3RyaW5nIEZFVENIX0dST1VQID0gImZldGNoLWdyb3VwIjsKLQkJU3RyaW5nIEZFVENIX0dST1VQX19MT0FEID0gImxvYWQiOwotCVN0cmluZyBQQVJFTlRfQ0xBU1MgPSAicGFyZW50LWNsYXNzIjsKLQlTdHJpbmcgUkVUVVJOX0lOU0VSVCA9ICJyZXR1cm4taW5zZXJ0IjsKLQlTdHJpbmcgUkVUVVJOX09OTFkgPSAicmV0dXJuLW9ubHkiOwotCVN0cmluZyBSRVRVUk5fVVBEQVRFID0gInJldHVybi11cGRhdGUiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvRWNsaXBzZUxpbmtBY2Nlc3NUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9FY2xpcHNlTGlua0FjY2Vzc1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY3MzUzNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9FY2xpcHNlTGlua0FjY2Vzc1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQWNjZXNzVHlwZQotewotCVN0cmluZyBWSVJUVUFMID0gIlZJUlRVQUwiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvRWNsaXBzZUxpbmtPcm1WMl8xRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvRWNsaXBzZUxpbmtPcm1WMl8xRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2Q3NGNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL0VjbGlwc2VMaW5rT3JtVjJfMUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtVjJfMUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeUltcGwKLXsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRWNsaXBzZUxpbmtPcm1WMl8xRmFjdG9yeSBlSU5TVEFOQ0UgPSBpbml0KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5IGluaXQoKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCUVjbGlwc2VMaW5rT3JtVjJfMUZhY3RvcnkgdGhlRWNsaXBzZUxpbmtPcm1WMl8xRmFjdG9yeSA9IChFY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJqcHQuZWNsaXBzZWxpbmsub3JtLnYyXzEueG1pIik7IAotCQkJaWYgKHRoZUVjbGlwc2VMaW5rT3JtVjJfMUZhY3RvcnkgIT0gbnVsbCkKLQkJCXsKLQkJCQlyZXR1cm4gdGhlRWNsaXBzZUxpbmtPcm1WMl8xRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKLQkJewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1WMl8xRmFjdG9yeSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKQotCXsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5DQUNIRV9LRVlfVFlQRV8yMToKLQkJCQlyZXR1cm4gY3JlYXRlQ2FjaGVLZXlUeXBlXzJfMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLkJBVENIX0ZFVENIX1RZUEVfMjE6Ci0JCQkJcmV0dXJuIGNyZWF0ZUJhdGNoRmV0Y2hUeXBlXzJfMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLkNBQ0hFX0tFWV9UWVBFXzIxOgotCQkJCXJldHVybiBjb252ZXJ0Q2FjaGVLZXlUeXBlXzJfMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuQkFUQ0hfRkVUQ0hfVFlQRV8yMToKLQkJCQlyZXR1cm4gY29udmVydEJhdGNoRmV0Y2hUeXBlXzJfMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2FjaGVLZXlUeXBlXzJfMSBjcmVhdGVDYWNoZUtleVR5cGVfMl8xRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJQ2FjaGVLZXlUeXBlXzJfMSByZXN1bHQgPSBDYWNoZUtleVR5cGVfMl8xLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDYWNoZUtleVR5cGVfMl8xVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmF0Y2hGZXRjaFR5cGVfMl8xIGNyZWF0ZUJhdGNoRmV0Y2hUeXBlXzJfMUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCUJhdGNoRmV0Y2hUeXBlXzJfMSByZXN1bHQgPSBCYXRjaEZldGNoVHlwZV8yXzEuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEJhdGNoRmV0Y2hUeXBlXzJfMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgZ2V0RWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSgpCi0JewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlIGdldFBhY2thZ2UoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvL0VjbGlwc2VMaW5rT3JtVjJfMUZhY3RvcnkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL0VjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL0VjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEwNGE5Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2VJbXBsCi17Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTkFNRSA9ICJ2Ml8xIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5TX1VSSSA9ICJqcHQuZWNsaXBzZWxpbmsub3JtLnYyXzEueG1pIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhc2ljXzJfMSA8ZW0+WG1sIEJhc2ljIDIxPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhc2ljXzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sQmFzaWNfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDXzIxID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXR1cm4gSW5zZXJ0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfMjFfX1JFVFVSTl9JTlNFUlQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldHVybiBVcGRhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ18yMV9fUkVUVVJOX1VQREFURSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEJhc2ljIDIxPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDXzIxX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmF0Y2hGZXRjaF8yXzEgPGVtPlhtbCBCYXRjaCBGZXRjaCAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXRjaEZldGNoXzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaF8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFUQ0hfRkVUQ0hfMjEgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVRDSF9GRVRDSF8yMV9fU0laRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2ggVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBVENIX0ZFVENIXzIxX19CQVRDSF9GRVRDSF9UWVBFID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQmF0Y2ggRmV0Y2ggMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFUQ0hfRkVUQ0hfMjFfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEgPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIxID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIEZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIxX19KT0lOX0ZFVENIID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX0ZFVENIX19KT0lOX0ZFVENIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIxX19CQVRDSF9GRVRDSCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9GRVRDSF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIxPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMV9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX0ZFVENIX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sVHlwZU1hcHBpbmdfMl8xIDxlbT5YbWwgVHlwZSBNYXBwaW5nIDIxPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFR5cGVNYXBwaW5nXzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sVHlwZU1hcHBpbmdfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RZUEVfTUFQUElOR18yMSA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFlQRV9NQVBQSU5HXzIxX19BQ0NFU1NfTUVUSE9EUyA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJlbnQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UWVBFX01BUFBJTkdfMjFfX1BBUkVOVF9DTEFTUyA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBUeXBlIE1hcHBpbmcgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFlQRV9NQVBQSU5HXzIxX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xIDxlbT5YbWwgRmV0Y2ggR3JvdXAgQ29udGFpbmVyIDIxPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9GRVRDSF9HUk9VUF9DT05UQUlORVJfMjEgPSA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW50aXR5XzJfMSA8ZW0+WG1sIEVudGl0eSAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbnRpdHlfMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yMSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjFfX0FDQ0VTU19NRVRIT0RTID0gWE1MX1RZUEVfTUFQUElOR18yMV9fQUNDRVNTX01FVEhPRFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFyZW50IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIxX19QQVJFTlRfQ0xBU1MgPSBYTUxfVFlQRV9NQVBQSU5HXzIxX19QQVJFTlRfQ0xBU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2ggR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjFfX0ZFVENIX0dST1VQUyA9IFhNTF9UWVBFX01BUFBJTkdfMjFfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgRXh0cmFjdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIxX19DTEFTU19FWFRSQUNUT1IgPSBYTUxfVFlQRV9NQVBQSU5HXzIxX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbnRpdHkgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIxX0ZFQVRVUkVfQ09VTlQgPSBYTUxfVFlQRV9NQVBQSU5HXzIxX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW50aXR5TWFwcGluZ3NfMl8xIDxlbT5YbWwgRW50aXR5IE1hcHBpbmdzIDIxPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVudGl0eU1hcHBpbmdzXzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU18yMSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfMjFfX0FDQ0VTU19NRVRIT0RTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3MgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTXzIxX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoQXR0cmlidXRlXzJfMSA8ZW0+WG1sIEZldGNoIEF0dHJpYnV0ZSAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEF0dHJpYnV0ZV8yXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEZldGNoQXR0cmlidXRlXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9GRVRDSF9BVFRSSUJVVEVfMjEgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9GRVRDSF9BVFRSSUJVVEVfMjFfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBGZXRjaCBBdHRyaWJ1dGUgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRkVUQ0hfQVRUUklCVVRFXzIxX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cF8yXzEgPGVtPlhtbCBGZXRjaCBHcm91cCAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwXzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cF8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRkVUQ0hfR1JPVVBfMjEgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9GRVRDSF9HUk9VUF8yMV9fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9hZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0ZFVENIX0dST1VQXzIxX19MT0FEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9GRVRDSF9HUk9VUF8yMV9fQVRUUklCVVRFUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEZldGNoIEdyb3VwIDIxPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0ZFVENIX0dST1VQXzIxX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZldGNoIEdyb3VwczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRkVUQ0hfR1JPVVBfQ09OVEFJTkVSXzIxX19GRVRDSF9HUk9VUFMgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBGZXRjaCBHcm91cCBDb250YWluZXIgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRkVUQ0hfR1JPVVBfQ09OVEFJTkVSXzIxX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFueVRvTWFueV8yXzEgPGVtPlhtbCBNYW55IFRvIE1hbnkgMjE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFueVRvTWFueV8yXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbE1hbnlUb01hbnlfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMSA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2g8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjFfX0JBVENIX0ZFVENIID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9IT0xERVJfX0JBVENIX0ZFVENIOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYW55IFRvIE1hbnkgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIxX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hbnlUb09uZV8yXzEgPGVtPlhtbCBNYW55IFRvIE9uZSAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYW55VG9PbmVfMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxNYW55VG9PbmVfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FXzIxID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FXzIxX19CQVRDSF9GRVRDSCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX19CQVRDSF9GRVRDSDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTWFueSBUbyBPbmUgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfMjFfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEgPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzcyAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjEgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfX0FTU09DSUFUSU9OX09WRVJSSURFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMV9fQVRUUklCVVRFX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaCBHcm91cHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19GRVRDSF9HUk9VUFMgPSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX1NFUVVFTkNFX0dFTkVSQVRPUiA9IE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMV9fVEFCTEVfR0VORVJBVE9SID0gT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19OQU1FRF9RVUVSSUVTID0gT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMV9fTkFNRURfTkFUSVZFX1FVRVJJRVMgPSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMV9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTID0gT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmVudCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19QQVJFTlRfQ0xBU1MgPSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyA9IE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5RdWVyeSBSZWRpcmVjdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19RVUVSWV9SRURJUkVDVE9SUyA9IE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIxPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDExOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sT25lVG9NYW55XzJfMSA8ZW0+WG1sIE9uZSBUbyBNYW55IDIxPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE9uZVRvTWFueV8yXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbE9uZVRvTWFueV8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjEgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIxX19CQVRDSF9GRVRDSCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX19CQVRDSF9GRVRDSDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT25lIFRvIE1hbnkgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjFfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sT25lVG9PbmVfMl8xIDxlbT5YbWwgT25lIFRvIE9uZSAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxPbmVUb09uZV8yXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbE9uZVRvT25lXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FXzIxID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2g8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FXzIxX19CQVRDSF9GRVRDSCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX19CQVRDSF9GRVRDSDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT25lIFRvIE9uZSAyMTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FXzIxX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMSA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHMgMjE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU18yMSA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU18yMV9fQUNDRVNTX01FVEhPRFMgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHMgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU18yMV9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxSZXR1cm5JbnNlcnRfMl8xIDxlbT5YbWwgUmV0dXJuIEluc2VydCAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxSZXR1cm5JbnNlcnRfMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxSZXR1cm5JbnNlcnRfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JFVFVSTl9JTlNFUlRfMjEgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFByaW1hcnlLZXlfMl8xIDxlbT5YbWwgUHJpbWFyeSBLZXkgMjE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUHJpbWFyeUtleV8yXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbFByaW1hcnlLZXlfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZXzIxID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGUgS2V5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV8yMV9fQ0FDSEVfS0VZX1RZUEUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQcmltYXJ5IEtleSAyMTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV8yMV9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXR1cm4gT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JFVFVSTl9JTlNFUlRfMjFfX1JFVFVSTl9PTkxZID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUmV0dXJuIEluc2VydCAyMTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SRVRVUk5fSU5TRVJUXzIxX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuQ2FjaGVLZXlUeXBlXzJfMSA8ZW0+Q2FjaGUgS2V5IFR5cGUgMjE8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5DYWNoZUtleVR5cGVfMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRDYWNoZUtleVR5cGVfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FDSEVfS0VZX1RZUEVfMjEgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkJhdGNoRmV0Y2hUeXBlXzJfMSA8ZW0+QmF0Y2ggRmV0Y2ggVHlwZSAyMTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkJhdGNoRmV0Y2hUeXBlXzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0QmF0Y2hGZXRjaFR5cGVfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFUQ0hfRkVUQ0hfVFlQRV8yMSA9IDE4OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQmFzaWNfMl8xRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEJhdGNoRmV0Y2hfMl8xRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbnRpdHlfMl8xRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVudGl0eU1hcHBpbmdzXzJfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxGZXRjaEF0dHJpYnV0ZV8yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRmV0Y2hHcm91cF8yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFueVRvTWFueV8yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFueVRvT25lXzJfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxPbmVUb01hbnlfMl8xRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE9uZVRvT25lXzJfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUmV0dXJuSW5zZXJ0XzJfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxUeXBlTWFwcGluZ18yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUHJpbWFyeUtleV8yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBjYWNoZUtleVR5cGVfMl8xRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBiYXRjaEZldGNoVHlwZV8yXzFFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSgpCi0JewotCQlzdXBlcihlTlNfVVJJLCBFY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgotCSAqIAotCSAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KLQkgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSBpbml0KCkKLQl7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lTlNfVVJJKSA6IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmZyZWV6ZSgpOwotCi0gIAotCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKLQkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZU5TX1VSSSwgdGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSk7Ci0JCXJldHVybiB0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhc2ljXzJfMSA8ZW0+WG1sIEJhc2ljIDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBCYXNpYyAyMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXNpY18yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxCYXNpY18yXzEoKQotCXsKLQkJcmV0dXJuIHhtbEJhc2ljXzJfMUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXNpY18yXzEjZ2V0UmV0dXJuSW5zZXJ0IDxlbT5SZXR1cm4gSW5zZXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmV0dXJuIEluc2VydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXNpY18yXzEjZ2V0UmV0dXJuSW5zZXJ0KCkKLQkgKiBAc2VlICNnZXRYbWxCYXNpY18yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxCYXNpY18yXzFfUmV0dXJuSW5zZXJ0KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxCYXNpY18yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXNpY18yXzEjZ2V0UmV0dXJuVXBkYXRlIDxlbT5SZXR1cm4gVXBkYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmV0dXJuIFVwZGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXNpY18yXzEjZ2V0UmV0dXJuVXBkYXRlKCkKLQkgKiBAc2VlICNnZXRYbWxCYXNpY18yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxCYXNpY18yXzFfUmV0dXJuVXBkYXRlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxCYXNpY18yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmF0Y2hGZXRjaF8yXzEgPGVtPlhtbCBCYXRjaCBGZXRjaCAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQmF0Y2ggRmV0Y2ggMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmF0Y2hGZXRjaF8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxCYXRjaEZldGNoXzJfMSgpCi0JewotCQlyZXR1cm4geG1sQmF0Y2hGZXRjaF8yXzFFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXRjaEZldGNoXzJfMSNnZXRTaXplIDxlbT5TaXplPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2l6ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXRjaEZldGNoXzJfMSNnZXRTaXplKCkKLQkgKiBAc2VlICNnZXRYbWxCYXRjaEZldGNoXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEJhdGNoRmV0Y2hfMl8xX1NpemUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEJhdGNoRmV0Y2hfMl8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXRjaEZldGNoXzJfMSNnZXRCYXRjaEZldGNoVHlwZSA8ZW0+QmF0Y2ggRmV0Y2ggVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJhdGNoIEZldGNoIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmF0Y2hGZXRjaF8yXzEjZ2V0QmF0Y2hGZXRjaFR5cGUoKQotCSAqIEBzZWUgI2dldFhtbEJhdGNoRmV0Y2hfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQmF0Y2hGZXRjaF8yXzFfQmF0Y2hGZXRjaFR5cGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEJhdGNoRmV0Y2hfMl8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xIDxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzFFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW50aXR5XzJfMSA8ZW0+WG1sIEVudGl0eSAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW50aXR5IDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVudGl0eV8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbnRpdHlfMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxFbnRpdHlfMl8xRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVudGl0eV8yXzEjZ2V0Q2xhc3NFeHRyYWN0b3IgPGVtPkNsYXNzIEV4dHJhY3RvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNsYXNzIEV4dHJhY3RvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbnRpdHlfMl8xI2dldENsYXNzRXh0cmFjdG9yKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5XzJfMV9DbGFzc0V4dHJhY3RvcigpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5XzJfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbnRpdHlNYXBwaW5nc18yXzEgPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3MgMjE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVudGl0eSBNYXBwaW5ncyAyMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbnRpdHlNYXBwaW5nc18yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzEoKQotCXsKLQkJcmV0dXJuIHhtbEVudGl0eU1hcHBpbmdzXzJfMUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEF0dHJpYnV0ZV8yXzEgPGVtPlhtbCBGZXRjaCBBdHRyaWJ1dGUgMjE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEZldGNoIEF0dHJpYnV0ZSAyMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEF0dHJpYnV0ZV8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxGZXRjaEF0dHJpYnV0ZV8yXzEoKQotCXsKLQkJcmV0dXJuIHhtbEZldGNoQXR0cmlidXRlXzJfMUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEF0dHJpYnV0ZV8yXzEjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbEZldGNoQXR0cmlidXRlXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEZldGNoQXR0cmlidXRlXzJfMV9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxGZXRjaEF0dHJpYnV0ZV8yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cF8yXzEgPGVtPlhtbCBGZXRjaCBHcm91cCAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRmV0Y2ggR3JvdXAgMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cF8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxGZXRjaEdyb3VwXzJfMSgpCi0JewotCQlyZXR1cm4geG1sRmV0Y2hHcm91cF8yXzFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cF8yXzEjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cF8yXzEjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sRmV0Y2hHcm91cF8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxGZXRjaEdyb3VwXzJfMV9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxGZXRjaEdyb3VwXzJfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cF8yXzEjZ2V0QXR0cmlidXRlcyA8ZW0+QXR0cmlidXRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXR0cmlidXRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwXzJfMSNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAc2VlICNnZXRYbWxGZXRjaEdyb3VwXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEZldGNoR3JvdXBfMl8xX0F0dHJpYnV0ZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEZldGNoR3JvdXBfMl8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cF8yXzEjZ2V0TG9hZCA8ZW0+TG9hZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvYWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cF8yXzEjZ2V0TG9hZCgpCi0JICogQHNlZSAjZ2V0WG1sRmV0Y2hHcm91cF8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxGZXRjaEdyb3VwXzJfMV9Mb2FkKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxGZXRjaEdyb3VwXzJfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xIDxlbT5YbWwgRmV0Y2ggR3JvdXAgQ29udGFpbmVyIDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBGZXRjaCBHcm91cCBDb250YWluZXIgMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMSgpCi0JewotCQlyZXR1cm4geG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMSNnZXRGZXRjaEdyb3VwcyA8ZW0+RmV0Y2ggR3JvdXBzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5GZXRjaCBHcm91cHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEjZ2V0RmV0Y2hHcm91cHMoKQotCSAqIEBzZWUgI2dldFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzFfRmV0Y2hHcm91cHMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hbnlUb01hbnlfMl8xIDxlbT5YbWwgTWFueSBUbyBNYW55IDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYW55IFRvIE1hbnkgMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFueVRvTWFueV8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYW55VG9NYW55XzJfMSgpCi0JewotCQlyZXR1cm4geG1sTWFueVRvTWFueV8yXzFFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFueVRvT25lXzJfMSA8ZW0+WG1sIE1hbnkgVG8gT25lIDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYW55IFRvIE9uZSAyMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYW55VG9PbmVfMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFueVRvT25lXzJfMSgpCi0JewotCQlyZXR1cm4geG1sTWFueVRvT25lXzJfMUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzcyAyMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xI2dldFNxbFJlc3VsdFNldE1hcHBpbmdzIDxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKQotCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzFfU3FsUmVzdWx0U2V0TWFwcGluZ3MoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEjZ2V0UXVlcnlSZWRpcmVjdG9ycyA8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSNnZXRRdWVyeVJlZGlyZWN0b3JzKCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xX1F1ZXJ5UmVkaXJlY3RvcnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE9uZVRvTWFueV8yXzEgPGVtPlhtbCBPbmUgVG8gTWFueSAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT25lIFRvIE1hbnkgMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sT25lVG9NYW55XzJfMQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE9uZVRvTWFueV8yXzEoKQotCXsKLQkJcmV0dXJuIHhtbE9uZVRvTWFueV8yXzFFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sT25lVG9PbmVfMl8xIDxlbT5YbWwgT25lIFRvIE9uZSAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT25lIFRvIE9uZSAyMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxPbmVUb09uZV8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxPbmVUb09uZV8yXzEoKQotCXsKLQkJcmV0dXJuIHhtbE9uZVRvT25lXzJfMUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzIDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzIDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMSgpCi0JewotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFJldHVybkluc2VydF8yXzEgPGVtPlhtbCBSZXR1cm4gSW5zZXJ0IDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBSZXR1cm4gSW5zZXJ0IDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFJldHVybkluc2VydF8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxSZXR1cm5JbnNlcnRfMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxSZXR1cm5JbnNlcnRfMl8xRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFJldHVybkluc2VydF8yXzEjZ2V0UmV0dXJuT25seSA8ZW0+UmV0dXJuIE9ubHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXR1cm4gT25seTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxSZXR1cm5JbnNlcnRfMl8xI2dldFJldHVybk9ubHkoKQotCSAqIEBzZWUgI2dldFhtbFJldHVybkluc2VydF8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxSZXR1cm5JbnNlcnRfMl8xX1JldHVybk9ubHkoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFJldHVybkluc2VydF8yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sVHlwZU1hcHBpbmdfMl8xIDxlbT5YbWwgVHlwZSBNYXBwaW5nIDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBUeXBlIE1hcHBpbmcgMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sVHlwZU1hcHBpbmdfMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVHlwZU1hcHBpbmdfMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxUeXBlTWFwcGluZ18yXzFFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxUeXBlTWFwcGluZ18yXzEjZ2V0UGFyZW50Q2xhc3MgPGVtPlBhcmVudCBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhcmVudCBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxUeXBlTWFwcGluZ18yXzEjZ2V0UGFyZW50Q2xhc3MoKQotCSAqIEBzZWUgI2dldFhtbFR5cGVNYXBwaW5nXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFR5cGVNYXBwaW5nXzJfMV9QYXJlbnRDbGFzcygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVHlwZU1hcHBpbmdfMl8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUHJpbWFyeUtleV8yXzEgPGVtPlhtbCBQcmltYXJ5IEtleSAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUHJpbWFyeSBLZXkgMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUHJpbWFyeUtleV8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxQcmltYXJ5S2V5XzJfMSgpCi0JewotCQlyZXR1cm4geG1sUHJpbWFyeUtleV8yXzFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUHJpbWFyeUtleV8yXzEjZ2V0Q2FjaGVLZXlUeXBlIDxlbT5DYWNoZSBLZXkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhY2hlIEtleSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFByaW1hcnlLZXlfMl8xI2dldENhY2hlS2V5VHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sUHJpbWFyeUtleV8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQcmltYXJ5S2V5XzJfMV9DYWNoZUtleVR5cGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFByaW1hcnlLZXlfMl8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuQ2FjaGVLZXlUeXBlXzJfMSA8ZW0+Q2FjaGUgS2V5IFR5cGUgMjE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5DYWNoZSBLZXkgVHlwZSAyMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5DYWNoZUtleVR5cGVfMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRDYWNoZUtleVR5cGVfMl8xKCkKLQl7Ci0JCXJldHVybiBjYWNoZUtleVR5cGVfMl8xRUVudW07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuQmF0Y2hGZXRjaFR5cGVfMl8xIDxlbT5CYXRjaCBGZXRjaCBUeXBlIDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+QmF0Y2ggRmV0Y2ggVHlwZSAyMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5CYXRjaEZldGNoVHlwZV8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldEJhdGNoRmV0Y2hUeXBlXzJfMSgpCi0JewotCQlyZXR1cm4gYmF0Y2hGZXRjaFR5cGVfMl8xRUVudW07Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1WMl8xRmFjdG9yeSBnZXRFY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5KCkKLQl7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtPcm1WMl8xRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCXhtbEJhc2ljXzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQkFTSUNfMjEpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEJhc2ljXzJfMUVDbGFzcywgWE1MX0JBU0lDXzIxX19SRVRVUk5fSU5TRVJUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxCYXNpY18yXzFFQ2xhc3MsIFhNTF9CQVNJQ18yMV9fUkVUVVJOX1VQREFURSk7Ci0KLQkJeG1sQmF0Y2hGZXRjaF8yXzFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0JBVENIX0ZFVENIXzIxKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxCYXRjaEZldGNoXzJfMUVDbGFzcywgWE1MX0JBVENIX0ZFVENIXzIxX19TSVpFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxCYXRjaEZldGNoXzJfMUVDbGFzcywgWE1MX0JBVENIX0ZFVENIXzIxX19CQVRDSF9GRVRDSF9UWVBFKTsKLQotCQl4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMSk7Ci0KLQkJeG1sRW50aXR5XzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU5USVRZXzIxKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlfMl8xRUNsYXNzLCBYTUxfRU5USVRZXzIxX19DTEFTU19FWFRSQUNUT1IpOwotCi0JCXhtbEVudGl0eU1hcHBpbmdzXzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU5USVRZX01BUFBJTkdTXzIxKTsKLQotCQl4bWxGZXRjaEF0dHJpYnV0ZV8yXzFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0ZFVENIX0FUVFJJQlVURV8yMSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRmV0Y2hBdHRyaWJ1dGVfMl8xRUNsYXNzLCBYTUxfRkVUQ0hfQVRUUklCVVRFXzIxX19OQU1FKTsKLQotCQl4bWxGZXRjaEdyb3VwXzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRkVUQ0hfR1JPVVBfMjEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEZldGNoR3JvdXBfMl8xRUNsYXNzLCBYTUxfRkVUQ0hfR1JPVVBfMjFfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEZldGNoR3JvdXBfMl8xRUNsYXNzLCBYTUxfRkVUQ0hfR1JPVVBfMjFfX0xPQUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEZldGNoR3JvdXBfMl8xRUNsYXNzLCBYTUxfRkVUQ0hfR1JPVVBfMjFfX0FUVFJJQlVURVMpOwotCi0JCXhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9GRVRDSF9HUk9VUF9DT05UQUlORVJfMjEpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xRUNsYXNzLCBYTUxfRkVUQ0hfR1JPVVBfQ09OVEFJTkVSXzIxX19GRVRDSF9HUk9VUFMpOwotCi0JCXhtbE1hbnlUb01hbnlfMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQU5ZX1RPX01BTllfMjEpOwotCi0JCXhtbE1hbnlUb09uZV8yXzFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BTllfVE9fT05FXzIxKTsKLQotCQl4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjEpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMUVDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19RVUVSWV9SRURJUkVDVE9SUyk7Ci0KLQkJeG1sT25lVG9NYW55XzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT05FX1RPX01BTllfMjEpOwotCi0JCXhtbE9uZVRvT25lXzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT05FX1RPX09ORV8yMSk7Ci0KLQkJeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTXzIxKTsKLQotCQl4bWxQcmltYXJ5S2V5XzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUFJJTUFSWV9LRVlfMjEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFByaW1hcnlLZXlfMl8xRUNsYXNzLCBYTUxfUFJJTUFSWV9LRVlfMjFfX0NBQ0hFX0tFWV9UWVBFKTsKLQotCQl4bWxSZXR1cm5JbnNlcnRfMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9SRVRVUk5fSU5TRVJUXzIxKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxSZXR1cm5JbnNlcnRfMl8xRUNsYXNzLCBYTUxfUkVUVVJOX0lOU0VSVF8yMV9fUkVUVVJOX09OTFkpOwotCi0JCXhtbFR5cGVNYXBwaW5nXzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVFlQRV9NQVBQSU5HXzIxKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUeXBlTWFwcGluZ18yXzFFQ2xhc3MsIFhNTF9UWVBFX01BUFBJTkdfMjFfX1BBUkVOVF9DTEFTUyk7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCWNhY2hlS2V5VHlwZV8yXzFFRW51bSA9IGNyZWF0ZUVFbnVtKENBQ0hFX0tFWV9UWVBFXzIxKTsKLQkJYmF0Y2hGZXRjaFR5cGVfMl8xRUVudW0gPSBjcmVhdGVFRW51bShCQVRDSF9GRVRDSF9UWVBFXzIxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCXsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlFY2xpcHNlTGlua09ybVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVBhY2thZ2UuZU5TX1VSSSk7Ci0JCVhNTFR5cGVQYWNrYWdlIHRoZVhNTFR5cGVQYWNrYWdlID0gKFhNTFR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOwotCQlPcm1QYWNrYWdlIHRoZU9ybVBhY2thZ2UgPSAoT3JtUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPcm1QYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sSm9pbkZldGNoKCkpOwotCQl4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbEJhdGNoRmV0Y2hIb2xkZXIoKSk7Ci0JCXhtbEVudGl0eV8yXzFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxUeXBlTWFwcGluZ18yXzEoKSk7Ci0JCXhtbEVudGl0eV8yXzFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMSgpKTsKLQkJeG1sRW50aXR5TWFwcGluZ3NfMl8xRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCkpOwotCQl4bWxNYW55VG9NYW55XzJfMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcigpKTsKLQkJeG1sTWFueVRvT25lXzJfMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcigpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc18yXzFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xKCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbEdlbmVyYXRvckNvbnRhaW5lcigpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc18yXzFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxRdWVyeUNvbnRhaW5lcigpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc18yXzFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbFF1ZXJ5Q29udGFpbmVyKCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFR5cGVNYXBwaW5nXzJfMSgpKTsKLQkJeG1sT25lVG9NYW55XzJfMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcigpKTsKLQkJeG1sT25lVG9PbmVfMl8xRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxCYXRjaEZldGNoSG9sZGVyKCkpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIoKSk7Ci0JCXhtbFR5cGVNYXBwaW5nXzJfMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcigpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKHhtbEJhc2ljXzJfMUVDbGFzcywgWG1sQmFzaWNfMl8xLmNsYXNzLCAiWG1sQmFzaWNfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQmFzaWNfMl8xX1JldHVybkluc2VydCgpLCB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sUmV0dXJuSW5zZXJ0KCksIG51bGwsICJyZXR1cm5JbnNlcnQiLCBudWxsLCAwLCAxLCBYbWxCYXNpY18yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEJhc2ljXzJfMV9SZXR1cm5VcGRhdGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAicmV0dXJuVXBkYXRlIiwgbnVsbCwgMCwgMSwgWG1sQmFzaWNfMl8xLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQmF0Y2hGZXRjaF8yXzFFQ2xhc3MsIFhtbEJhdGNoRmV0Y2hfMl8xLmNsYXNzLCAiWG1sQmF0Y2hGZXRjaF8yXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxCYXRjaEZldGNoXzJfMV9TaXplKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAic2l6ZSIsIG51bGwsIDAsIDEsIFhtbEJhdGNoRmV0Y2hfMl8xLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxCYXRjaEZldGNoXzJfMV9CYXRjaEZldGNoVHlwZSgpLCB0aGlzLmdldEJhdGNoRmV0Y2hUeXBlXzJfMSgpLCAiYmF0Y2hGZXRjaFR5cGUiLCBudWxsLCAwLCAxLCBYbWxCYXRjaEZldGNoXzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMUVDbGFzcywgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xLmNsYXNzLCAiWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEVudGl0eV8yXzFFQ2xhc3MsIFhtbEVudGl0eV8yXzEuY2xhc3MsICJYbWxFbnRpdHlfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5XzJfMV9DbGFzc0V4dHJhY3RvcigpLCB0aGVPcm1QYWNrYWdlLmdldFhtbENsYXNzUmVmZXJlbmNlKCksIG51bGwsICJjbGFzc0V4dHJhY3RvciIsIG51bGwsIDAsIDEsIFhtbEVudGl0eV8yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbnRpdHlNYXBwaW5nc18yXzFFQ2xhc3MsIFhtbEVudGl0eU1hcHBpbmdzXzJfMS5jbGFzcywgIlhtbEVudGl0eU1hcHBpbmdzXzJfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxGZXRjaEF0dHJpYnV0ZV8yXzFFQ2xhc3MsIFhtbEZldGNoQXR0cmlidXRlXzJfMS5jbGFzcywgIlhtbEZldGNoQXR0cmlidXRlXzJfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEZldGNoQXR0cmlidXRlXzJfMV9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFhtbEZldGNoQXR0cmlidXRlXzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEZldGNoR3JvdXBfMl8xRUNsYXNzLCBYbWxGZXRjaEdyb3VwXzJfMS5jbGFzcywgIlhtbEZldGNoR3JvdXBfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRmV0Y2hHcm91cF8yXzFfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxGZXRjaEdyb3VwXzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRmV0Y2hHcm91cF8yXzFfTG9hZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJsb2FkIiwgbnVsbCwgMCwgMSwgWG1sRmV0Y2hHcm91cF8yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEZldGNoR3JvdXBfMl8xX0F0dHJpYnV0ZXMoKSwgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbEZldGNoQXR0cmlidXRlKCksIG51bGwsICJhdHRyaWJ1dGVzIiwgbnVsbCwgMCwgLTEsIFhtbEZldGNoR3JvdXBfMl8xLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzFFQ2xhc3MsIFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xLmNsYXNzLCAiWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMV9GZXRjaEdyb3VwcygpLCB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sRmV0Y2hHcm91cCgpLCBudWxsLCAiZmV0Y2hHcm91cHMiLCBudWxsLCAwLCAtMSwgWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNYW55VG9NYW55XzJfMUVDbGFzcywgWG1sTWFueVRvTWFueV8yXzEuY2xhc3MsICJYbWxNYW55VG9NYW55XzJfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNYW55VG9PbmVfMl8xRUNsYXNzLCBYbWxNYW55VG9PbmVfMl8xLmNsYXNzLCAiWG1sTWFueVRvT25lXzJfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMUVDbGFzcywgWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEuY2xhc3MsICJYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xX1NxbFJlc3VsdFNldE1hcHBpbmdzKCksIHRoZU9ybVBhY2thZ2UuZ2V0U3FsUmVzdWx0U2V0TWFwcGluZygpLCBudWxsLCAic3FsUmVzdWx0U2V0TWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xX1F1ZXJ5UmVkaXJlY3RvcnMoKSwgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbFF1ZXJ5UmVkaXJlY3RvcnMoKSwgbnVsbCwgInF1ZXJ5UmVkaXJlY3RvcnMiLCBudWxsLCAwLCAxLCBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE9uZVRvTWFueV8yXzFFQ2xhc3MsIFhtbE9uZVRvTWFueV8yXzEuY2xhc3MsICJYbWxPbmVUb01hbnlfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE9uZVRvT25lXzJfMUVDbGFzcywgWG1sT25lVG9PbmVfMl8xLmNsYXNzLCAiWG1sT25lVG9PbmVfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMUVDbGFzcywgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xLmNsYXNzLCAiWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFByaW1hcnlLZXlfMl8xRUNsYXNzLCBYbWxQcmltYXJ5S2V5XzJfMS5jbGFzcywgIlhtbFByaW1hcnlLZXlfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUHJpbWFyeUtleV8yXzFfQ2FjaGVLZXlUeXBlKCksIHRoaXMuZ2V0Q2FjaGVLZXlUeXBlXzJfMSgpLCAiY2FjaGVLZXlUeXBlIiwgbnVsbCwgMCwgMSwgWG1sUHJpbWFyeUtleV8yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxSZXR1cm5JbnNlcnRfMl8xRUNsYXNzLCBYbWxSZXR1cm5JbnNlcnRfMl8xLmNsYXNzLCAiWG1sUmV0dXJuSW5zZXJ0XzJfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFJldHVybkluc2VydF8yXzFfUmV0dXJuT25seSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJyZXR1cm5Pbmx5IiwgbnVsbCwgMCwgMSwgWG1sUmV0dXJuSW5zZXJ0XzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFR5cGVNYXBwaW5nXzJfMUVDbGFzcywgWG1sVHlwZU1hcHBpbmdfMl8xLmNsYXNzLCAiWG1sVHlwZU1hcHBpbmdfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVHlwZU1hcHBpbmdfMl8xX1BhcmVudENsYXNzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicGFyZW50Q2xhc3MiLCBudWxsLCAwLCAxLCBYbWxUeXBlTWFwcGluZ18yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKGNhY2hlS2V5VHlwZV8yXzFFRW51bSwgQ2FjaGVLZXlUeXBlXzJfMS5jbGFzcywgIkNhY2hlS2V5VHlwZV8yXzEiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGNhY2hlS2V5VHlwZV8yXzFFRW51bSwgQ2FjaGVLZXlUeXBlXzJfMS5JRF9WQUxVRSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChjYWNoZUtleVR5cGVfMl8xRUVudW0sIENhY2hlS2V5VHlwZV8yXzEuQ0FDSEVfS0VZKTsKLQkJYWRkRUVudW1MaXRlcmFsKGNhY2hlS2V5VHlwZV8yXzFFRW51bSwgQ2FjaGVLZXlUeXBlXzJfMS5BVVRPKTsKLQotCQlpbml0RUVudW0oYmF0Y2hGZXRjaFR5cGVfMl8xRUVudW0sIEJhdGNoRmV0Y2hUeXBlXzJfMS5jbGFzcywgIkJhdGNoRmV0Y2hUeXBlXzJfMSIpOwotCQlhZGRFRW51bUxpdGVyYWwoYmF0Y2hGZXRjaFR5cGVfMl8xRUVudW0sIEJhdGNoRmV0Y2hUeXBlXzJfMS5KT0lOKTsKLQkJYWRkRUVudW1MaXRlcmFsKGJhdGNoRmV0Y2hUeXBlXzJfMUVFbnVtLCBCYXRjaEZldGNoVHlwZV8yXzEuRVhJU1RTKTsKLQkJYWRkRUVudW1MaXRlcmFsKGJhdGNoRmV0Y2hUeXBlXzJfMUVFbnVtLCBCYXRjaEZldGNoVHlwZV8yXzEuSU4pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTGl0ZXJhbHMKLQl7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhc2ljXzJfMSA8ZW0+WG1sIEJhc2ljIDIxPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhc2ljXzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEJhc2ljXzJfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9CQVNJQ18yMSA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY18yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJldHVybiBJbnNlcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9CQVNJQ18yMV9fUkVUVVJOX0lOU0VSVCA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY18yXzFfUmV0dXJuSW5zZXJ0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXR1cm4gVXBkYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQkFTSUNfMjFfX1JFVFVSTl9VUERBVEUgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfMl8xX1JldHVyblVwZGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhdGNoRmV0Y2hfMl8xIDxlbT5YbWwgQmF0Y2ggRmV0Y2ggMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmF0Y2hGZXRjaF8yXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxCYXRjaEZldGNoXzJfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9CQVRDSF9GRVRDSF8yMSA9IGVJTlNUQU5DRS5nZXRYbWxCYXRjaEZldGNoXzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2l6ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0JBVENIX0ZFVENIXzIxX19TSVpFID0gZUlOU1RBTkNFLmdldFhtbEJhdGNoRmV0Y2hfMl8xX1NpemUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9CQVRDSF9GRVRDSF8yMV9fQkFUQ0hfRkVUQ0hfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxCYXRjaEZldGNoXzJfMV9CYXRjaEZldGNoVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMSA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIxID0gZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVudGl0eV8yXzEgPGVtPlhtbCBFbnRpdHkgMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW50aXR5XzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEVudGl0eV8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU5USVRZXzIxID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIEV4dHJhY3RvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV8yMV9fQ0xBU1NfRVhUUkFDVE9SID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzFfQ2xhc3NFeHRyYWN0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbnRpdHlNYXBwaW5nc18yXzEgPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3MgMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW50aXR5TWFwcGluZ3NfMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VOVElUWV9NQVBQSU5HU18yMSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc18yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEF0dHJpYnV0ZV8yXzEgPGVtPlhtbCBGZXRjaCBBdHRyaWJ1dGUgMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRmV0Y2hBdHRyaWJ1dGVfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0ZFVENIX0FUVFJJQlVURV8yMSA9IGVJTlNUQU5DRS5nZXRYbWxGZXRjaEF0dHJpYnV0ZV8yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9GRVRDSF9BVFRSSUJVVEVfMjFfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sRmV0Y2hBdHRyaWJ1dGVfMl8xX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwXzJfMSA8ZW0+WG1sIEZldGNoIEdyb3VwIDIxPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBfMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cF8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRkVUQ0hfR1JPVVBfMjEgPSBlSU5TVEFOQ0UuZ2V0WG1sRmV0Y2hHcm91cF8yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9GRVRDSF9HUk9VUF8yMV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxGZXRjaEdyb3VwXzJfMV9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9GRVRDSF9HUk9VUF8yMV9fQVRUUklCVVRFUyA9IGVJTlNUQU5DRS5nZXRYbWxGZXRjaEdyb3VwXzJfMV9BdHRyaWJ1dGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2FkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRkVUQ0hfR1JPVVBfMjFfX0xPQUQgPSBlSU5TVEFOQ0UuZ2V0WG1sRmV0Y2hHcm91cF8yXzFfTG9hZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xIDxlbT5YbWwgRmV0Y2ggR3JvdXAgQ29udGFpbmVyIDIxPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRkVUQ0hfR1JPVVBfQ09OVEFJTkVSXzIxID0gZUlOU1RBTkNFLmdldFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GZXRjaCBHcm91cHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0ZFVENIX0dST1VQX0NPTlRBSU5FUl8yMV9fRkVUQ0hfR1JPVVBTID0gZUlOU1RBTkNFLmdldFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xX0ZldGNoR3JvdXBzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFueVRvTWFueV8yXzEgPGVtPlhtbCBNYW55IFRvIE1hbnkgMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFueVRvTWFueV8yXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxNYW55VG9NYW55XzJfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQU5ZX1RPX01BTllfMjEgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueV8yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYW55VG9PbmVfMl8xIDxlbT5YbWwgTWFueSBUbyBPbmUgMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFueVRvT25lXzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbE1hbnlUb09uZV8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFOWV9UT19PTkVfMjEgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFueVRvT25lXzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMSA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMV9TcWxSZXN1bHRTZXRNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UXVlcnkgUmVkaXJlY3RvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMV9fUVVFUllfUkVESVJFQ1RPUlMgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzFfUXVlcnlSZWRpcmVjdG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE9uZVRvTWFueV8yXzEgPGVtPlhtbCBPbmUgVG8gTWFueSAyMTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxPbmVUb01hbnlfMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PTkVfVE9fTUFOWV8yMSA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnlfMl8xKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sT25lVG9PbmVfMl8xIDxlbT5YbWwgT25lIFRvIE9uZSAyMTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxPbmVUb09uZV8yXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxPbmVUb09uZV8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfT05FX1RPX09ORV8yMSA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb09uZV8yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzIDIxPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTXzIxID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFJldHVybkluc2VydF8yXzEgPGVtPlhtbCBSZXR1cm4gSW5zZXJ0IDIxPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFJldHVybkluc2VydF8yXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxSZXR1cm5JbnNlcnRfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1JFVFVSTl9JTlNFUlRfMjEgPSBlSU5TVEFOQ0UuZ2V0WG1sUmV0dXJuSW5zZXJ0XzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmV0dXJuIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9SRVRVUk5fSU5TRVJUXzIxX19SRVRVUk5fT05MWSA9IGVJTlNUQU5DRS5nZXRYbWxSZXR1cm5JbnNlcnRfMl8xX1JldHVybk9ubHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxUeXBlTWFwcGluZ18yXzEgPGVtPlhtbCBUeXBlIE1hcHBpbmcgMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sVHlwZU1hcHBpbmdfMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sVHlwZU1hcHBpbmdfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1RZUEVfTUFQUElOR18yMSA9IGVJTlNUQU5DRS5nZXRYbWxUeXBlTWFwcGluZ18yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcmVudCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1RZUEVfTUFQUElOR18yMV9fUEFSRU5UX0NMQVNTID0gZUlOU1RBTkNFLmdldFhtbFR5cGVNYXBwaW5nXzJfMV9QYXJlbnRDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFByaW1hcnlLZXlfMl8xIDxlbT5YbWwgUHJpbWFyeSBLZXkgMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUHJpbWFyeUtleV8yXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5XzJfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QUklNQVJZX0tFWV8yMSA9IGVJTlNUQU5DRS5nZXRYbWxQcmltYXJ5S2V5XzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGUgS2V5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QUklNQVJZX0tFWV8yMV9fQ0FDSEVfS0VZX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sUHJpbWFyeUtleV8yXzFfQ2FjaGVLZXlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuQ2FjaGVLZXlUeXBlXzJfMSA8ZW0+Q2FjaGUgS2V5IFR5cGUgMjE8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5DYWNoZUtleVR5cGVfMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0Q2FjaGVLZXlUeXBlXzJfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gQ0FDSEVfS0VZX1RZUEVfMjEgPSBlSU5TVEFOQ0UuZ2V0Q2FjaGVLZXlUeXBlXzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkJhdGNoRmV0Y2hUeXBlXzJfMSA8ZW0+QmF0Y2ggRmV0Y2ggVHlwZSAyMTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkJhdGNoRmV0Y2hUeXBlXzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldEJhdGNoRmV0Y2hUeXBlXzJfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gQkFUQ0hfRkVUQ0hfVFlQRV8yMSA9IGVJTlNUQU5DRS5nZXRCYXRjaEZldGNoVHlwZV8yXzEoKTsKLQotCX0KLQotfSAvL0VjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEJhc2ljXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sQmFzaWNfMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZTQ3MDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sQmFzaWNfMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJldHVybkluc2VydDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEJhc2ljIDIxPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXNpY18yXzEjZ2V0UmV0dXJuSW5zZXJ0IDxlbT5SZXR1cm4gSW5zZXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmFzaWNfMl8xI2dldFJldHVyblVwZGF0ZSA8ZW0+UmV0dXJuIFVwZGF0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sQmFzaWNfMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxCYXNpY18yXzEgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV0dXJuIEluc2VydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmV0dXJuIEluc2VydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXR1cm4gSW5zZXJ0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSZXR1cm5JbnNlcnQoWG1sUmV0dXJuSW5zZXJ0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sQmFzaWNfMl8xX1JldHVybkluc2VydCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxSZXR1cm5JbnNlcnQgZ2V0UmV0dXJuSW5zZXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmFzaWNfMl8xI2dldFJldHVybkluc2VydCA8ZW0+UmV0dXJuIEluc2VydDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJuIEluc2VydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmV0dXJuSW5zZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXR1cm5JbnNlcnQoWG1sUmV0dXJuSW5zZXJ0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJldHVybiBVcGRhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJldHVybiBVcGRhdGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJuIFVwZGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmV0dXJuVXBkYXRlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxCYXNpY18yXzFfUmV0dXJuVXBkYXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldFJldHVyblVwZGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhc2ljXzJfMSNnZXRSZXR1cm5VcGRhdGUgPGVtPlJldHVybiBVcGRhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJldHVybiBVcGRhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJldHVyblVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmV0dXJuVXBkYXRlKEJvb2xlYW4gdmFsdWUpOwotfSAvLyBYbWxCYXNpY18yXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEJhdGNoRmV0Y2hfMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxCYXRjaEZldGNoXzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGU5YjMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEJhdGNoRmV0Y2hfMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEJhdGNoIEZldGNoIDIxPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXRjaEZldGNoXzJfMSNnZXRTaXplIDxlbT5TaXplPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmF0Y2hGZXRjaF8yXzEjZ2V0QmF0Y2hGZXRjaFR5cGUgPGVtPkJhdGNoIEZldGNoIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEJhdGNoRmV0Y2hfMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxCYXRjaEZldGNoXzJfMSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TaXplPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNpemUoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEJhdGNoRmV0Y2hfMl8xX1NpemUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW50ZWdlciBnZXRTaXplKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmF0Y2hGZXRjaF8yXzEjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2l6ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2l6ZShJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuQmF0Y2hGZXRjaFR5cGVfMl8xfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2ggVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuQmF0Y2hGZXRjaFR5cGVfMl8xCi0JICogQHNlZSAjc2V0QmF0Y2hGZXRjaFR5cGUoQmF0Y2hGZXRjaFR5cGVfMl8xKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaF8yXzFfQmF0Y2hGZXRjaFR5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCYXRjaEZldGNoVHlwZV8yXzEgZ2V0QmF0Y2hGZXRjaFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXRjaEZldGNoXzJfMSNnZXRCYXRjaEZldGNoVHlwZSA8ZW0+QmF0Y2ggRmV0Y2ggVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2ggVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuQmF0Y2hGZXRjaFR5cGVfMl8xCi0JICogQHNlZSAjZ2V0QmF0Y2hGZXRjaFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJhdGNoRmV0Y2hUeXBlKEJhdGNoRmV0Y2hUeXBlXzJfMSB2YWx1ZSk7Ci0KLX0gLy8gWG1sQmF0Y2hGZXRjaF8yXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OTRjZjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaEhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKiAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMSBleHRlbmRzIFhtbEpvaW5GZXRjaCwgWG1sQmF0Y2hGZXRjaEhvbGRlcgotewotCi19IC8vIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRW50aXR5TWFwcGluZ3NfMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxFbnRpdHlNYXBwaW5nc18yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBkNDE3ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxFbnRpdHlNYXBwaW5nc18yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzSG9sZGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRW50aXR5IE1hcHBpbmdzIDIxPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRW50aXR5TWFwcGluZ3NfMl8xIGV4dGVuZHMgWG1sQWNjZXNzTWV0aG9kc0hvbGRlcgotewotfSAvLyBYbWxFbnRpdHlNYXBwaW5nc18yXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEVudGl0eV8yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEVudGl0eV8yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI3YjE1MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxFbnRpdHlfMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xhc3NSZWZlcmVuY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbnRpdHkgMjE8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVudGl0eV8yXzEjZ2V0Q2xhc3NFeHRyYWN0b3IgPGVtPkNsYXNzIEV4dHJhY3RvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRW50aXR5XzJfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRW50aXR5XzJfMSBleHRlbmRzIFhtbFR5cGVNYXBwaW5nXzJfMSwgWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbGFzcyBFeHRyYWN0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNsYXNzIEV4dHJhY3RvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzcyBFeHRyYWN0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENsYXNzRXh0cmFjdG9yKFhtbENsYXNzUmVmZXJlbmNlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRW50aXR5XzJfMV9DbGFzc0V4dHJhY3RvcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxDbGFzc1JlZmVyZW5jZSBnZXRDbGFzc0V4dHJhY3RvcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVudGl0eV8yXzEjZ2V0Q2xhc3NFeHRyYWN0b3IgPGVtPkNsYXNzIEV4dHJhY3RvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3MgRXh0cmFjdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDbGFzc0V4dHJhY3RvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2xhc3NFeHRyYWN0b3IoWG1sQ2xhc3NSZWZlcmVuY2UgdmFsdWUpOwotCi19IC8vIFhtbEVudGl0eV8yXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEZldGNoQXR0cmlidXRlXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyY2NiNGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEZldGNoIEF0dHJpYnV0ZSAyMTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEZldGNoQXR0cmlidXRlXzJfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxGZXRjaEF0dHJpYnV0ZV8yXzFfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoQXR0cmlidXRlXzJfMSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNlOGJmOTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoR3JvdXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBGZXRjaCBHcm91cCBDb250YWluZXIgMjE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xI2dldEZldGNoR3JvdXBzIDxlbT5GZXRjaCBHcm91cHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GZXRjaCBHcm91cHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoR3JvdXB9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmV0Y2ggR3JvdXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2ggR3JvdXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzFfRmV0Y2hHcm91cHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sRmV0Y2hHcm91cD4gZ2V0RmV0Y2hHcm91cHMoKTsKLQotfSAvLyBYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRmV0Y2hHcm91cF8yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEZldGNoR3JvdXBfMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlM2U0ZGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRmV0Y2hHcm91cF8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxGZXRjaEF0dHJpYnV0ZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEZldGNoIEdyb3VwIDIxPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwXzJfMSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cF8yXzEjZ2V0TG9hZCA8ZW0+TG9hZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBfMl8xI2dldEF0dHJpYnV0ZXMgPGVtPkF0dHJpYnV0ZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEZldGNoR3JvdXBfMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxGZXRjaEdyb3VwXzJfMSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cF8yXzFfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBfMl8xI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoQXR0cmlidXRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cF8yXzFfQXR0cmlidXRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxGZXRjaEF0dHJpYnV0ZT4gZ2V0QXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9hZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9hZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2FkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMb2FkKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxGZXRjaEdyb3VwXzJfMV9Mb2FkKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldExvYWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwXzJfMSNnZXRMb2FkIDxlbT5Mb2FkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2FkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMb2FkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMb2FkKEJvb2xlYW4gdmFsdWUpOwotCi19IC8vIFhtbEZldGNoR3JvdXBfMl8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxNYW55VG9NYW55XzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sTWFueVRvTWFueV8yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM3OTI0Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxNYW55VG9NYW55XzJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2hIb2xkZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNYW55IFRvIE1hbnkgMjE8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE1hbnlUb01hbnlfMl8xIGV4dGVuZHMgWG1sQmF0Y2hGZXRjaEhvbGRlcgotewotCi19IC8vIFhtbE1hbnlUb01hbnlfMl8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxNYW55VG9PbmVfMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxNYW55VG9PbmVfMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NjE5ZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sTWFueVRvT25lXzJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2hIb2xkZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNYW55IFRvIE9uZSAyMTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxNYW55VG9PbmVfMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNYW55VG9PbmVfMl8xIGV4dGVuZHMgWG1sQmF0Y2hGZXRjaEhvbGRlcgotewotfSAvLyBYbWxNYW55VG9PbmVfMl8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE1NjlhNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5TcWxSZXN1bHRTZXRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeVJlZGlyZWN0b3JzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMjE8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xI2dldFNxbFJlc3VsdFNldE1hcHBpbmdzIDxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xI2dldFF1ZXJ5UmVkaXJlY3RvcnMgPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEgZXh0ZW5kcyBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLCBYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciwgWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEsIFhtbEdlbmVyYXRvckNvbnRhaW5lciwgWG1sUXVlcnlDb250YWluZXIsIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIsIFhtbFR5cGVNYXBwaW5nXzJfMQotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5TcWxSZXN1bHRTZXRNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMV9TcWxSZXN1bHRTZXRNYXBwaW5ncygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTcWxSZXN1bHRTZXRNYXBwaW5nPiBnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UXVlcnkgUmVkaXJlY3RvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRRdWVyeVJlZGlyZWN0b3JzKFhtbFF1ZXJ5UmVkaXJlY3RvcnMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMV9RdWVyeVJlZGlyZWN0b3JzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbFF1ZXJ5UmVkaXJlY3RvcnMgZ2V0UXVlcnlSZWRpcmVjdG9ycygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xI2dldFF1ZXJ5UmVkaXJlY3RvcnMgPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UXVlcnlSZWRpcmVjdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UXVlcnlSZWRpcmVjdG9ycyhYbWxRdWVyeVJlZGlyZWN0b3JzIHZhbHVlKTsKLQotfSAvLyBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sT25lVG9NYW55XzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sT25lVG9NYW55XzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTk3YzNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbE9uZVRvTWFueV8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoSG9sZGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgT25lIFRvIE1hbnkgMjE8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sT25lVG9NYW55XzJfMSBleHRlbmRzIFhtbEJhdGNoRmV0Y2hIb2xkZXIKLXsKLQotfSAvLyBYbWxPbmVUb01hbnlfMl8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxPbmVUb09uZV8yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbE9uZVRvT25lXzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGNjNzRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbE9uZVRvT25lXzJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2hIb2xkZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBPbmUgVG8gT25lIDIxPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbE9uZVRvT25lXzJfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sT25lVG9PbmVfMl8xIGV4dGVuZHMgWG1sQmF0Y2hGZXRjaEhvbGRlcgotewotfSAvLyBYbWxPbmVUb09uZV8yXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZThlODcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kc0hvbGRlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHMgMjE8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEgZXh0ZW5kcyBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyCi17Ci19IC8vIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sUHJpbWFyeUtleV8yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbFByaW1hcnlLZXlfMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMjdmM2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sUHJpbWFyeUtleV8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUHJpbWFyeSBLZXkgMjE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFByaW1hcnlLZXlfMl8xI2dldENhY2hlS2V5VHlwZSA8ZW0+Q2FjaGUgS2V5IFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbFByaW1hcnlLZXlfMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxQcmltYXJ5S2V5XzJfMSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWNoZSBLZXkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5DYWNoZUtleVR5cGVfMl8xfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhY2hlIEtleSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlIEtleSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5DYWNoZUtleVR5cGVfMl8xCi0JICogQHNlZSAjc2V0Q2FjaGVLZXlUeXBlKENhY2hlS2V5VHlwZV8yXzEpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5XzJfMV9DYWNoZUtleVR5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDYWNoZUtleVR5cGVfMl8xIGdldENhY2hlS2V5VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFByaW1hcnlLZXlfMl8xI2dldENhY2hlS2V5VHlwZSA8ZW0+Q2FjaGUgS2V5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlIEtleSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5DYWNoZUtleVR5cGVfMl8xCi0JICogQHNlZSAjZ2V0Q2FjaGVLZXlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYWNoZUtleVR5cGUoQ2FjaGVLZXlUeXBlXzJfMSB2YWx1ZSk7Ci0KLX0gLy8gWG1sUHJpbWFyeUtleV8yXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbFJldHVybkluc2VydF8yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbFJldHVybkluc2VydF8yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhmYTVlYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxSZXR1cm5JbnNlcnRfMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFJldHVybiBJbnNlcnQgMjE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFJldHVybkluc2VydF8yXzEjZ2V0UmV0dXJuT25seSA8ZW0+UmV0dXJuIE9ubHk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbFJldHVybkluc2VydF8yXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFJldHVybkluc2VydF8yXzEgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV0dXJuIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJldHVybiBPbmx5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldHVybiBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXR1cm5Pbmx5KEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxSZXR1cm5JbnNlcnRfMl8xX1JldHVybk9ubHkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0UmV0dXJuT25seSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFJldHVybkluc2VydF8yXzEjZ2V0UmV0dXJuT25seSA8ZW0+UmV0dXJuIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJldHVybiBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXR1cm5Pbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXR1cm5Pbmx5KEJvb2xlYW4gdmFsdWUpOwotCi19IC8vIFhtbFJldHVybkluc2VydF8yXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbFR5cGVNYXBwaW5nXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sVHlwZU1hcHBpbmdfMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYzg2MTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sVHlwZU1hcHBpbmdfMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHNIb2xkZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBUeXBlIE1hcHBpbmcgMjE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFR5cGVNYXBwaW5nXzJfMSNnZXRQYXJlbnRDbGFzcyA8ZW0+UGFyZW50IENsYXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxUeXBlTWFwcGluZ18yXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFR5cGVNYXBwaW5nXzJfMSBleHRlbmRzIFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIKLXsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcmVudCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFyZW50IENsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcmVudCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFyZW50Q2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sVHlwZU1hcHBpbmdfMl8xX1BhcmVudENsYXNzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQYXJlbnRDbGFzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFR5cGVNYXBwaW5nXzJfMSNnZXRQYXJlbnRDbGFzcyA8ZW0+UGFyZW50IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJlbnQgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhcmVudENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQYXJlbnRDbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JVGV4dFJhbmdlIGdldFBhcmVudENsYXNzVGV4dFJhbmdlKCk7Ci19IC8vIFhtbFR5cGVNYXBwaW5nXzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvQ2FjaGVJc29sYXRpb25UeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9DYWNoZUlzb2xhdGlvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRhZDY4ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9DYWNoZUlzb2xhdGlvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkNhY2hlIElzb2xhdGlvbiBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldENhY2hlSXNvbGF0aW9uVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gQ2FjaGVJc29sYXRpb25UeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNIQVJFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTSEFSRURfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlTSEFSRUQoMCwgIlNIQVJFRCIsICJTSEFSRUQiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBST1RFQ1RFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQUk9URUNURURfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlQUk9URUNURUQoMSwgIlBST1RFQ1RFRCIsICJQUk9URUNURUQiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklTT0xBVEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lTT0xBVEVEX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JSVNPTEFURUQoMiwgIklTT0xBVEVEIiwgIklTT0xBVEVEIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TSEFSRUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNIQVJFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTSEFSRUQKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSEFSRURfVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UFJPVEVDVEVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5QUk9URUNURUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUFJPVEVDVEVECi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVEVEX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklTT0xBVEVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JU09MQVRFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJU09MQVRFRAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElTT0xBVEVEX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5DYWNoZSBJc29sYXRpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2FjaGVJc29sYXRpb25UeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IENhY2hlSXNvbGF0aW9uVHlwZVtdCi0JCXsKLQkJCVNIQVJFRCwKLQkJCVBST1RFQ1RFRCwKLQkJCUlTT0xBVEVELAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkNhY2hlIElzb2xhdGlvbiBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8Q2FjaGVJc29sYXRpb25UeXBlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNhY2hlIElzb2xhdGlvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2FjaGVJc29sYXRpb25UeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlDYWNoZUlzb2xhdGlvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q2FjaGUgSXNvbGF0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDYWNoZUlzb2xhdGlvblR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUNhY2hlSXNvbGF0aW9uVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNhY2hlIElzb2xhdGlvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2FjaGVJc29sYXRpb25UeXBlIGdldChpbnQgdmFsdWUpCi0JewotCQlzd2l0Y2ggKHZhbHVlKQotCQl7Ci0JCQljYXNlIFNIQVJFRF9WQUxVRTogcmV0dXJuIFNIQVJFRDsKLQkJCWNhc2UgUFJPVEVDVEVEX1ZBTFVFOiByZXR1cm4gUFJPVEVDVEVEOwotCQkJY2FzZSBJU09MQVRFRF9WQUxVRTogcmV0dXJuIElTT0xBVEVEOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDYWNoZUlzb2xhdGlvblR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpCi0JewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKLQl7Ci0JICByZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCQotfSAvL0NhY2hlSXNvbGF0aW9uVHlwZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvRWNsaXBzZUxpbmsyXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL0VjbGlwc2VMaW5rMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhN2JjZWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvRWNsaXBzZUxpbmsyXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGluazJfMgotCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzEKLXsKLQlTdHJpbmcgU0NIRU1BX05BTUVTUEFDRSA9IEVjbGlwc2VMaW5rLlNDSEVNQV9OQU1FU1BBQ0U7Ci0JU3RyaW5nIFNDSEVNQV9MT0NBVElPTiA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfb3JtXzJfMi54c2QiOwotCVN0cmluZyBTQ0hFTUFfVkVSU0lPTgk9ICIyLjIiOwotCQotCQotCS8vIEVjbGlwc2VMaW5rIDIuMiBzcGVjaWZpYyBub2RlcwotCVN0cmluZyBBRERJVElPTkFMX0NSSVRFUklBID0gImFkZGl0aW9uYWwtY3JpdGVyaWEiOwotCVN0cmluZyBDQUNIRV9fSVNPTEFUSU9OID0gImlzb2xhdGlvbiI7Ci0JU3RyaW5nIENBU0NBREVfT05fREVMRVRFID0gImNhc2NhZGUtb24tZGVsZXRlIjsKLQlTdHJpbmcgQ1JFQVRJT05fU1VGRklYID0gImNyZWF0aW9uLXN1ZmZpeCI7Ci0JU3RyaW5nIENSSVRFUklBID0gImNyaXRlcmlhIjsKLQlTdHJpbmcgSEFTSF9QQVJUSVRJT05JTkcgPSAiaGFzaC1wYXJ0aXRpb25pbmciOwotCVN0cmluZyBJTkRFWCA9ICJpbmRleCI7Ci0JCVN0cmluZyBJTkRFWF9fQ09MVU1OX05BTUUgPSAiY29sdW1uLW5hbWUiOwotCQlTdHJpbmcgSU5ERVhfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBJTkRFWF9fQ0FUQUxPRyA9ICJjYXRhbG9nIjsKLQkJU3RyaW5nIElOREVYX19TQ0hFTUEgPSAic2NoZW1hIjsKLQkJU3RyaW5nIElOREVYX19UQUJMRSA9ICJ0YWJsZSI7Ci0JCVN0cmluZyBJTkRFWF9fVU5JUVVFID0gInVuaXF1ZSI7Ci0JU3RyaW5nIE5PTkNBQ0hFQUJMRSA9ICJub25jYWNoZWFibGUiOwotCVN0cmluZyBQQVJUSVRJT05JTkcgPSAicGFydGl0aW9uaW5nIjsKLQlTdHJpbmcgUEFSVElUSU9OSU5HX0dST1VQX19QQVJUSVRJT05FRCA9ICJwYXJ0aXRpb25lZCI7Ci0JU3RyaW5nIFBJTk5FRF9QQVJUSVRJT05JTkcgPSAicGlubmVkLXBhcnRpdGlvbmluZyI7Ci0JU3RyaW5nIFJBTkdFX1BBUlRJVElPTklORyA9ICJyYW5nZS1wYXJ0aXRpb25pbmciOwotCVN0cmluZyBSRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSAicmVwbGljYXRpb24tcGFydGl0aW9uaW5nIjsKLQlTdHJpbmcgUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HID0gInJvdW5kLXJvYmluLXBhcnRpdGlvbmluZyI7Ci0JU3RyaW5nIFVOSU9OX1BBUlRJVElPTklORyA9ICJ1bmlvbi1wYXJ0aXRpb25pbmciOwotCVN0cmluZyBWQUxVRV9QQVJUSVRJT05JTkcgPSAidmFsdWUtcGFydGl0aW9uaW5nIjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL0VjbGlwc2VMaW5rT3JtVjJfMkZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL0VjbGlwc2VMaW5rT3JtVjJfMkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ViNTQ3Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9FY2xpcHNlTGlua09ybVYyXzJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1WMl8yRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5SW1wbAotewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFY2xpcHNlTGlua09ybVYyXzJGYWN0b3J5IGVJTlNUQU5DRSA9IGluaXQoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtVjJfMkZhY3RvcnkgaW5pdCgpCi0JewotCQl0cnkKLQkJewotCQkJRWNsaXBzZUxpbmtPcm1WMl8yRmFjdG9yeSB0aGVFY2xpcHNlTGlua09ybVYyXzJGYWN0b3J5ID0gKEVjbGlwc2VMaW5rT3JtVjJfMkZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImpwdC5lY2xpcHNlbGluay5vcm0udjJfMi54bWkiKTsgCi0JCQlpZiAodGhlRWNsaXBzZUxpbmtPcm1WMl8yRmFjdG9yeSAhPSBudWxsKQotCQkJewotCQkJCXJldHVybiB0aGVFY2xpcHNlTGlua09ybVYyXzJGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQotCQl7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtVjJfMkZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybVYyXzJGYWN0b3J5KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpCi0JewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLkNBQ0hFX0lTT0xBVElPTl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDYWNoZUlzb2xhdGlvblR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5DQUNIRV9JU09MQVRJT05fVFlQRToKLQkJCQlyZXR1cm4gY29udmVydENhY2hlSXNvbGF0aW9uVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2FjaGVJc29sYXRpb25UeXBlIGNyZWF0ZUNhY2hlSXNvbGF0aW9uVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCUNhY2hlSXNvbGF0aW9uVHlwZSByZXN1bHQgPSBDYWNoZUlzb2xhdGlvblR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydENhY2hlSXNvbGF0aW9uVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UgZ2V0RWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSgpCi0JewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlIGdldFBhY2thZ2UoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvL0VjbGlwc2VMaW5rT3JtVjJfMkZhY3RvcnkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL0VjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL0VjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVkNWRlZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMkZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlSW1wbAotewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5BTUUgPSAidjJfMiI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOU19VUkkgPSAianB0LmVjbGlwc2VsaW5rLm9ybS52Ml8yLnhtaSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMiI7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yIDxlbT5YbWwgQWRkaXRpb25hbCBDcml0ZXJpYSAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FERElUSU9OQUxfQ1JJVEVSSUFfMjIgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyaXRlcmlhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQURESVRJT05BTF9DUklURVJJQV8yMl9fQ1JJVEVSSUEgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBBZGRpdGlvbmFsIENyaXRlcmlhIDIyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FERElUSU9OQUxfQ1JJVEVSSUFfMjJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY18yXzIgPGVtPlhtbCBCYXNpYyAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY18yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEJhc2ljXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ18yMiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5kZXg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ18yMl9fSU5ERVggPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBCYXNpYyAyMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ18yMl9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljQ29sbGVjdGlvbl8yXzIgPGVtPlhtbCBCYXNpYyBDb2xsZWN0aW9uIDIyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljQ29sbGVjdGlvbl8yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEJhc2ljQ29sbGVjdGlvbl8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfQ09MTEVDVElPTl8yMiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19DT0xMRUNUSU9OXzIyX19DQVNDQURFX09OX0RFTEVURSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEJhc2ljIENvbGxlY3Rpb24gMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfQ09MTEVDVElPTl8yMl9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljTWFwXzJfMiA8ZW0+WG1sIEJhc2ljIE1hcCAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY01hcF8yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEJhc2ljTWFwXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19NQVBfMjIgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfTUFQXzIyX19DQVNDQURFX09OX0RFTEVURSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEJhc2ljIE1hcCAyMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19NQVBfMjJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxDYWNoZV8yXzIgPGVtPlhtbCBDYWNoZSAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxDYWNoZV8yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbENhY2hlXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV8yMiA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXNvbGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVfMjJfX0lTT0xBVElPTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENhY2hlIDIyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFXzIyX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQ29sbGVjdGlvblRhYmxlXzJfMiA8ZW0+WG1sIENvbGxlY3Rpb24gVGFibGUgMjI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQ29sbGVjdGlvblRhYmxlXzJfMgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sQ29sbGVjdGlvblRhYmxlXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX1RBQkxFXzIyID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DcmVhdGlvbiBTdWZmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX1RBQkxFXzIyX19DUkVBVElPTl9TVUZGSVggPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBDb2xsZWN0aW9uIFRhYmxlIDIyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTExFQ1RJT05fVEFCTEVfMjJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIgPGVtPlhtbCBQYXJ0aXRpb25pbmcgR3JvdXAgMjI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05JTkcgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SQU5HRV9QQVJUSVRJT05JTkcgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVkFMVUVfUEFSVElUSU9OSU5HID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXNoIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fSEFTSF9QQVJUSVRJT05JTkcgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVU5JT05fUEFSVElUSU9OSU5HID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9ORUQgPSA4OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQYXJ0aXRpb25pbmcgR3JvdXAgMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX0ZFQVRVUkVfQ09VTlQgPSA5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8yIDxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMiA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIyX19QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMl9fUElOTkVEX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIyX19SQU5HRV9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIyX19WQUxVRV9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjJfX0hBU0hfUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fSEFTSF9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIyX19VTklPTl9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19VTklPTl9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjJfX1BBUlRJVElPTkVEID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjJfX0NBU0NBREVfT05fREVMRVRFID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob25jYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjJfX05PTkNBQ0hFQUJMRSA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjJfRkVBVFVSRV9DT1VOVCA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlfMl8yIDxlbT5YbWwgRW50aXR5IDIyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eV8yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEVudGl0eV8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIyID0gODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eU1hcHBpbmdzXzJfMiA8ZW0+WG1sIEVudGl0eSBNYXBwaW5ncyAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlNYXBwaW5nc18yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfMjIgPSA5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgPGVtPlhtbCBIYXNoIFBhcnRpdGlvbmluZyAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxIYXNoUGFydGl0aW9uaW5nXzJfMgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sSGFzaFBhcnRpdGlvbmluZ18yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSEFTSF9QQVJUSVRJT05JTkdfMjIgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb01hbnlfMl8yIDxlbT5YbWwgTWFueSBUbyBNYW55IDIyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb01hbnlfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxNYW55VG9NYW55XzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjIgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb09uZV8yXzIgPGVtPlhtbCBNYW55IFRvIE9uZSAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYW55VG9PbmVfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxNYW55VG9PbmVfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FXzIyID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxPbmVUb09uZV8yXzIgPGVtPlhtbCBPbmUgVG8gT25lIDIyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvT25lXzJfMgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sT25lVG9PbmVfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfMjIgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvTWFueV8yXzIgPGVtPlhtbCBPbmUgVG8gTWFueSAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxPbmVUb01hbnlfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxPbmVUb01hbnlfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIyID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdfMl8yIDxlbT5YbWwgUGFydGl0aW9uaW5nIDIyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ18yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ18yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEFSVElUSU9OSU5HXzIyID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIDxlbT5YbWwgUGlubmVkIFBhcnRpdGlvbmluZyAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BJTk5FRF9QQVJUSVRJT05JTkdfMjIgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiA8ZW0+WG1sIFJhbmdlIFBhcnRpdGlvbmluZyAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SQU5HRV9QQVJUSVRJT05JTkdfMjIgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiA8ZW0+WG1sIFJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZyAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SRVBMSUNBVElPTl9QQVJUSVRJT05JTkdfMjIgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIDxlbT5YbWwgUm91bmQgUm9iaW4gUGFydGl0aW9uaW5nIDIyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9ST1VORF9ST0JJTl9QQVJUSVRJT05JTkdfMjIgPSAyNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVtYmVkZGFibGVfMl8yIDxlbT5YbWwgRW1iZWRkYWJsZSAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbWJlZGRhYmxlXzJfMgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sRW1iZWRkYWJsZV8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV8yMiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV8yMl9fQVRUUklCVVRFX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9DT05UQUlORVJfX0FUVFJJQlVURV9PVkVSUklERVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFXzIyX19BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbWJlZGRhYmxlIDIyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfMjJfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIyX19QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yMl9fUElOTkVEX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIyX19SQU5HRV9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIyX19WQUxVRV9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjJfX0hBU0hfUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fSEFTSF9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIyX19VTklPTl9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19VTklPTl9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjJfX1BBUlRJVElPTkVEID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbCBDcml0ZXJpYTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yMl9fQURESVRJT05BTF9DUklURVJJQSA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjJfX0NBU0NBREVfT05fREVMRVRFID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yMl9fSU5ERVggPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbnRpdHkgMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIyX0ZFQVRVUkVfQ09VTlQgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTXzIyX19QQVJUSVRJT05JTkcgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fUElOTkVEX1BBUlRJVElPTklORyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1JBTkdFX1BBUlRJVElPTklORyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1ZBTFVFX1BBUlRJVElPTklORyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fSEFTSF9QQVJUSVRJT05JTkcgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTXzIyX19VTklPTl9QQVJUSVRJT05JTkcgPSA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3MgMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTXzIyX0ZFQVRVUkVfQ09VTlQgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9IQVNIX1BBUlRJVElPTklOR18yMl9fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEhhc2ggUGFydGl0aW9uaW5nIDIyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0hBU0hfUEFSVElUSU9OSU5HXzIyX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSWRfMl8yIDxlbT5YbWwgSWQgMjI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSWRfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxJZF8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfMjIgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEXzIyX19JTkRFWCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIElkIDIyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEXzIyX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yIDxlbT5YbWwgSW5kZXggMjI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxJbmRleF8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSU5ERVhfMjIgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSU5ERVhfMjJfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lOREVYXzIyX19TQ0hFTUEgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JTkRFWF8yMl9fQ0FUQUxPRyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JTkRFWF8yMl9fVEFCTEUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lOREVYXzIyX19VTklRVUUgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbiBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSU5ERVhfMjJfX0NPTFVNTl9OQU1FUyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEluZGV4IDIyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lOREVYXzIyX0ZFQVRVUkVfQ09VTlQgPSA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSm9pblRhYmxlXzJfMiA8ZW0+WG1sIEpvaW4gVGFibGUgMjI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSm9pblRhYmxlXzJfMgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sSm9pblRhYmxlXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFXzIyID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3JlYXRpb24gU3VmZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV8yMl9fQ1JFQVRJT05fU1VGRklYID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgSm9pbiBUYWJsZSAyMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFXzIyX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMl9fUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QSU5ORURfUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhbmdlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMl9fUkFOR0VfUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkFOR0VfUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMl9fVkFMVUVfUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVkFMVUVfUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhc2ggUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIyX19IQVNIX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX0hBU0hfUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMl9fVU5JT05fUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVU5JT05fUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIyX19QQVJUSVRJT05FRCA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIyX19DQVNDQURFX09OX0RFTEVURSA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9uIENhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMl9fTk9OX0NBQ0hFQUJMRSA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hbnkgVG8gTWFueSAyMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjJfRkVBVFVSRV9DT1VOVCA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfMjJfX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV8yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FXzIyX19QSU5ORURfUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV8yMl9fUkFOR0VfUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkFOR0VfUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FXzIyX19WQUxVRV9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV8yMl9fSEFTSF9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV8yMl9fVU5JT05fUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVU5JT05fUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfMjJfX1BBUlRJVElPTkVEID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9uIENhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FXzIyX19OT05fQ0FDSEVBQkxFID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTWFueSBUbyBPbmUgMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfMjJfRkVBVFVSRV9DT1VOVCA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMiA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMiA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIyX19QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMl9fUElOTkVEX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjJfX1JBTkdFX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JBTkdFX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMl9fVkFMVUVfUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVkFMVUVfUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhc2ggUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjJfX0hBU0hfUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fSEFTSF9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjJfX1VOSU9OX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1VOSU9OX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIyX19QQVJUSVRJT05FRCA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMl9fQURESVRJT05BTF9DUklURVJJQSA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIyX0ZFQVRVUkVfQ09VTlQgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfMjJfX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FXzIyX19QSU5ORURfUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FXzIyX19SQU5HRV9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV8yMl9fVkFMVUVfUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVkFMVUVfUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhc2ggUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV8yMl9fSEFTSF9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FXzIyX19VTklPTl9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19VTklPTl9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FXzIyX19QQVJUSVRJT05FRCA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV8yMl9fQ0FTQ0FERV9PTl9ERUxFVEUgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vbiBDYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FXzIyX19OT05fQ0FDSEVBQkxFID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT25lIFRvIE9uZSAyMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FXzIyX0ZFQVRVUkVfQ09VTlQgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIyX19QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMl9fUElOTkVEX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjJfX1JBTkdFX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JBTkdFX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMl9fVkFMVUVfUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVkFMVUVfUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhc2ggUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjJfX0hBU0hfUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fSEFTSF9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjJfX1VOSU9OX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1VOSU9OX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIyX19QQVJUSVRJT05FRCA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjJfX0NBU0NBREVfT05fREVMRVRFID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob25jYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMl9fTk9OQ0FDSEVBQkxFID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT25lIFRvIE1hbnkgMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjJfRkVBVFVSRV9DT1VOVCA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BBUlRJVElPTklOR18yMl9fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFBhcnRpdGlvbmluZyAyMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QQVJUSVRJT05JTkdfMjJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BJTk5FRF9QQVJUSVRJT05JTkdfMjJfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQaW5uZWQgUGFydGl0aW9uaW5nIDIyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BJTk5FRF9QQVJUSVRJT05JTkdfMjJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JBTkdFX1BBUlRJVElPTklOR18yMl9fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFJhbmdlIFBhcnRpdGlvbmluZyAyMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SQU5HRV9QQVJUSVRJT05JTkdfMjJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JFUExJQ0FUSU9OX1BBUlRJVElPTklOR18yMl9fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZyAyMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SRVBMSUNBVElPTl9QQVJUSVRJT05JTkdfMjJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JPVU5EX1JPQklOX1BBUlRJVElPTklOR18yMl9fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFJvdW5kIFJvYmluIFBhcnRpdGlvbmluZyAyMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9ST1VORF9ST0JJTl9QQVJUSVRJT05JTkdfMjJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxTZWNvbmRhcnlUYWJsZV8yXzIgPGVtPlhtbCBTZWNvbmRhcnkgVGFibGUgMjI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sU2Vjb25kYXJ5VGFibGVfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxTZWNvbmRhcnlUYWJsZV8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFXzIyID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3JlYXRpb24gU3VmZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFXzIyX19DUkVBVElPTl9TVUZGSVggPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBTZWNvbmRhcnkgVGFibGUgMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFXzIyX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVGFibGVfMl8yIDxlbT5YbWwgVGFibGUgMjI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVGFibGVfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxUYWJsZV8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfMjIgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DcmVhdGlvbiBTdWZmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV8yMl9fQ1JFQVRJT05fU1VGRklYID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVGFibGUgMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfMjJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxUYWJsZUdlbmVyYXRvcl8yXzIgPGVtPlhtbCBUYWJsZSBHZW5lcmF0b3IgMjI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVGFibGVHZW5lcmF0b3JfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxUYWJsZUdlbmVyYXRvcl8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SXzIyID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3JlYXRpb24gU3VmZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SXzIyX19DUkVBVElPTl9TVUZGSVggPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBUYWJsZSBHZW5lcmF0b3IgMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SXzIyX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIDxlbT5YbWwgVW5pb24gUGFydGl0aW9uaW5nIDIyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1VOSU9OX1BBUlRJVElPTklOR18yMiA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9VTklPTl9QQVJUSVRJT05JTkdfMjJfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBVbmlvbiBQYXJ0aXRpb25pbmcgMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVU5JT05fUEFSVElUSU9OSU5HXzIyX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIDxlbT5YbWwgVmFsdWUgUGFydGl0aW9uaW5nIDIyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBTFVFX1BBUlRJVElPTklOR18yMiA9IDI5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQUxVRV9QQVJUSVRJT05JTkdfMjJfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBWYWx1ZSBQYXJ0aXRpb25pbmcgMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFMVUVfUEFSVElUSU9OSU5HXzIyX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmFyaWFibGVPbmVUb09uZV8yXzIgPGVtPlhtbCBWYXJpYWJsZSBPbmUgVG8gT25lIDIyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhcmlhYmxlT25lVG9PbmVfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxWYXJpYWJsZU9uZVRvT25lXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FXzIyID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV8yMl9fUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QSU5ORURfUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhbmdlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfMjJfX1JBTkdFX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JBTkdFX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FXzIyX19WQUxVRV9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FXzIyX19IQVNIX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX0hBU0hfUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfMjJfX1VOSU9OX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1VOSU9OX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfMjJfX1BBUlRJVElPTkVEID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9uIENhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfMjJfX05PTl9DQUNIRUFCTEUgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBWYXJpYWJsZSBPbmUgVG8gT25lIDIyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfMjJfRkVBVFVSRV9DT1VOVCA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWZXJzaW9uXzJfMiA8ZW0+WG1sIFZlcnNpb24gMjI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmVyc2lvbl8yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFZlcnNpb25fMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fMjIgPSAzMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fMjJfX0lOREVYID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVmVyc2lvbiAyMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OXzIyX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuQ2FjaGVJc29sYXRpb25UeXBlIDxlbT5DYWNoZSBJc29sYXRpb24gVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkNhY2hlSXNvbGF0aW9uVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0Q2FjaGVJc29sYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FDSEVfSVNPTEFUSU9OX1RZUEUgPSAzMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQmFzaWNfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEJhc2ljQ29sbGVjdGlvbl8yXzJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQmFzaWNNYXBfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbENhY2hlXzJfMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDb2xsZWN0aW9uVGFibGVfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbnRpdHlfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVudGl0eU1hcHBpbmdzXzJfMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxIYXNoUGFydGl0aW9uaW5nXzJfMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxNYW55VG9NYW55XzJfMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxNYW55VG9PbmVfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE9uZVRvT25lXzJfMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxPbmVUb01hbnlfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFBhcnRpdGlvbmluZ18yXzJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbWJlZGRhYmxlXzJfMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxJZF8yXzJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sSW5kZXhfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEpvaW5UYWJsZV8yXzJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFwcGVkU3VwZXJjbGFzc18yXzJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sU2Vjb25kYXJ5VGFibGVfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFRhYmxlXzJfMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxUYWJsZUdlbmVyYXRvcl8yXzJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxWYXJpYWJsZU9uZVRvT25lXzJfMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxWZXJzaW9uXzJfMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGNhY2hlSXNvbGF0aW9uVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlKCkKLQl7Ci0JCXN1cGVyKGVOU19VUkksIEVjbGlwc2VMaW5rT3JtVjJfMkZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCi0JICogCi0JICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgotCSAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlIGluaXQoKQotCXsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCVhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlFY2xpcHNlTGlua09ybVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1QYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZnJlZXplKCk7Ci0KLSAgCi0JCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQotCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lTlNfVVJJLCB0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlKTsKLQkJcmV0dXJuIHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2U7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMiA8ZW0+WG1sIEFkZGl0aW9uYWwgQ3JpdGVyaWEgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEFkZGl0aW9uYWwgQ3JpdGVyaWEgMjI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMiNnZXRDcml0ZXJpYSA8ZW0+Q3JpdGVyaWE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Dcml0ZXJpYTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yI2dldENyaXRlcmlhKCkKLQkgKiBAc2VlICNnZXRYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMl9Dcml0ZXJpYSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY18yXzIgPGVtPlhtbCBCYXNpYyAyMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQmFzaWMgMjI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQmFzaWNfMl8yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQmFzaWNfMl8yKCkKLQl7Ci0JCXJldHVybiB4bWxCYXNpY18yXzJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQmFzaWNfMl8yI2dldEluZGV4IDxlbT5JbmRleDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkluZGV4PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljXzJfMiNnZXRJbmRleCgpCi0JICogQHNlZSAjZ2V0WG1sQmFzaWNfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sQmFzaWNfMl8yX0luZGV4KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxCYXNpY18yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQmFzaWNDb2xsZWN0aW9uXzJfMiA8ZW0+WG1sIEJhc2ljIENvbGxlY3Rpb24gMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEJhc2ljIENvbGxlY3Rpb24gMjI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQmFzaWNDb2xsZWN0aW9uXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEJhc2ljQ29sbGVjdGlvbl8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbEJhc2ljQ29sbGVjdGlvbl8yXzJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQmFzaWNDb2xsZWN0aW9uXzJfMiNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQmFzaWNDb2xsZWN0aW9uXzJfMiNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBzZWUgI2dldFhtbEJhc2ljQ29sbGVjdGlvbl8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxCYXNpY0NvbGxlY3Rpb25fMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQmFzaWNDb2xsZWN0aW9uXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY01hcF8yXzIgPGVtPlhtbCBCYXNpYyBNYXAgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEJhc2ljIE1hcCAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY01hcF8yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxCYXNpY01hcF8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbEJhc2ljTWFwXzJfMkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY01hcF8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljTWFwXzJfMiNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBzZWUgI2dldFhtbEJhc2ljTWFwXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEJhc2ljTWFwXzJfMl9DYXNjYWRlT25EZWxldGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEJhc2ljTWFwXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxDYWNoZV8yXzIgPGVtPlhtbCBDYWNoZSAyMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ2FjaGUgMjI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQ2FjaGVfMl8yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ2FjaGVfMl8yKCkKLQl7Ci0JCXJldHVybiB4bWxDYWNoZV8yXzJFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxDYWNoZV8yXzIjZ2V0SXNvbGF0aW9uIDxlbT5Jc29sYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Jc29sYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQ2FjaGVfMl8yI2dldElzb2xhdGlvbigpCi0JICogQHNlZSAjZ2V0WG1sQ2FjaGVfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ2FjaGVfMl8yX0lzb2xhdGlvbigpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ2FjaGVfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQ29sbGVjdGlvblRhYmxlXzJfMiA8ZW0+WG1sIENvbGxlY3Rpb24gVGFibGUgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENvbGxlY3Rpb24gVGFibGUgMjI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQ29sbGVjdGlvblRhYmxlXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbENvbGxlY3Rpb25UYWJsZV8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbENvbGxlY3Rpb25UYWJsZV8yXzJFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxDb2xsZWN0aW9uVGFibGVfMl8yI2dldENyZWF0aW9uU3VmZml4IDxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQ29sbGVjdGlvblRhYmxlXzJfMiNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQHNlZSAjZ2V0WG1sQ29sbGVjdGlvblRhYmxlXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENvbGxlY3Rpb25UYWJsZV8yXzJfQ3JlYXRpb25TdWZmaXgoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENvbGxlY3Rpb25UYWJsZV8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIgPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMiNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBzZWUgI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMl9DYXNjYWRlT25EZWxldGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMiNpc05vbmNhY2hlYWJsZSA8ZW0+Tm9uY2FjaGVhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Tm9uY2FjaGVhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMiNpc05vbmNhY2hlYWJsZSgpCi0JICogQHNlZSAjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8yX05vbmNhY2hlYWJsZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRWxlbWVudENvbGxlY3Rpb25fMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5XzJfMiA8ZW0+WG1sIEVudGl0eSAyMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW50aXR5IDIyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eV8yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbnRpdHlfMl8yKCkKLQl7Ci0JCXJldHVybiB4bWxFbnRpdHlfMl8yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eV8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eV8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW50aXR5XzJfMl9DYXNjYWRlT25EZWxldGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEVudGl0eV8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlfMl8yI2dldEluZGV4IDxlbT5JbmRleDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkluZGV4PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eV8yXzIjZ2V0SW5kZXgoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eV8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfMl8yX0luZGV4KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yIDxlbT5YbWwgRW50aXR5IE1hcHBpbmdzIDIyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3MgMjI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yKCkKLQl7Ci0JCXJldHVybiB4bWxFbnRpdHlNYXBwaW5nc18yXzJFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eU1hcHBpbmdzXzJfMiNnZXRQYXJ0aXRpb25pbmcgPGVtPlBhcnRpdGlvbmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGFydGl0aW9uaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eU1hcHBpbmdzXzJfMiNnZXRQYXJ0aXRpb25pbmcoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9QYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eU1hcHBpbmdzXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlNYXBwaW5nc18yXzIjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eU1hcHBpbmdzXzJfMiNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlNYXBwaW5nc18yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eU1hcHBpbmdzXzJfMiNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUm91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5TWFwcGluZ3NfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eU1hcHBpbmdzXzJfMiNnZXRQaW5uZWRQYXJ0aXRpb25pbmcgPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yI2dldFBpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1Bpbm5lZFBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5TWFwcGluZ3NfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eU1hcHBpbmdzXzJfMiNnZXRSYW5nZVBhcnRpdGlvbmluZyA8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yI2dldFJhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eU1hcHBpbmdzXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlNYXBwaW5nc18yXzIjZ2V0VmFsdWVQYXJ0aXRpb25pbmcgPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eU1hcHBpbmdzXzJfMiNnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1ZhbHVlUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlNYXBwaW5nc18yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yI2dldEhhc2hQYXJ0aXRpb25pbmcgPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlNYXBwaW5nc18yXzIjZ2V0SGFzaFBhcnRpdGlvbmluZygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX0hhc2hQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eU1hcHBpbmdzXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlNYXBwaW5nc18yXzIjZ2V0VW5pb25QYXJ0aXRpb25pbmcgPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eU1hcHBpbmdzXzJfMiNnZXRVbmlvblBhcnRpdGlvbmluZygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1VuaW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlNYXBwaW5nc18yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxIYXNoUGFydGl0aW9uaW5nXzJfMiA8ZW0+WG1sIEhhc2ggUGFydGl0aW9uaW5nIDIyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBIYXNoIFBhcnRpdGlvbmluZyAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxIYXNoUGFydGl0aW9uaW5nXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKCkKLQl7Ci0JCXJldHVybiB4bWxIYXNoUGFydGl0aW9uaW5nXzJfMkVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sSGFzaFBhcnRpdGlvbmluZ18yXzJfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sSGFzaFBhcnRpdGlvbmluZ18yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eV8yXzIjZ2V0QWRkaXRpb25hbENyaXRlcmlhIDxlbT5BZGRpdGlvbmFsIENyaXRlcmlhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QWRkaXRpb25hbCBDcml0ZXJpYTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlfMl8yI2dldEFkZGl0aW9uYWxDcml0ZXJpYSgpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5XzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV8yXzJfQWRkaXRpb25hbENyaXRlcmlhKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb01hbnlfMl8yIDxlbT5YbWwgTWFueSBUbyBNYW55IDIyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYW55IFRvIE1hbnkgMjI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sTWFueVRvTWFueV8yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYW55VG9NYW55XzJfMigpCi0JewotCQlyZXR1cm4geG1sTWFueVRvTWFueV8yXzJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sTWFueVRvTWFueV8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb01hbnlfMl8yI2dldENhc2NhZGVPbkRlbGV0ZSgpCi0JICogQHNlZSAjZ2V0WG1sTWFueVRvTWFueV8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxNYW55VG9NYW55XzJfMl9DYXNjYWRlT25EZWxldGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE1hbnlUb01hbnlfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sTWFueVRvTWFueV8yXzIjaXNOb25DYWNoZWFibGUgPGVtPk5vbiBDYWNoZWFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb01hbnlfMl8yI2lzTm9uQ2FjaGVhYmxlKCkKLQkgKiBAc2VlICNnZXRYbWxNYW55VG9NYW55XzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE1hbnlUb01hbnlfMl8yX05vbkNhY2hlYWJsZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sTWFueVRvTWFueV8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYW55VG9PbmVfMl8yIDxlbT5YbWwgTWFueSBUbyBPbmUgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hbnkgVG8gT25lIDIyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb09uZV8yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYW55VG9PbmVfMl8yKCkKLQl7Ci0JCXJldHVybiB4bWxNYW55VG9PbmVfMl8yRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sTWFueVRvT25lXzJfMiNpc05vbkNhY2hlYWJsZSA8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sTWFueVRvT25lXzJfMiNpc05vbkNhY2hlYWJsZSgpCi0JICogQHNlZSAjZ2V0WG1sTWFueVRvT25lXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE1hbnlUb09uZV8yXzJfTm9uQ2FjaGVhYmxlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxNYW55VG9PbmVfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9PbmVfMl8yIDxlbT5YbWwgT25lIFRvIE9uZSAyMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT25lIFRvIE9uZSAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxPbmVUb09uZV8yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxPbmVUb09uZV8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbE9uZVRvT25lXzJfMkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxPbmVUb09uZV8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvT25lXzJfMiNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBzZWUgI2dldFhtbE9uZVRvT25lXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE9uZVRvT25lXzJfMl9DYXNjYWRlT25EZWxldGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE9uZVRvT25lXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvT25lXzJfMiNpc05vbkNhY2hlYWJsZSA8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9PbmVfMl8yI2lzTm9uQ2FjaGVhYmxlKCkKLQkgKiBAc2VlICNnZXRYbWxPbmVUb09uZV8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxPbmVUb09uZV8yXzJfTm9uQ2FjaGVhYmxlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxPbmVUb09uZV8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxPbmVUb01hbnlfMl8yIDxlbT5YbWwgT25lIFRvIE1hbnkgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE9uZSBUbyBNYW55IDIyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvTWFueV8yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxPbmVUb01hbnlfMl8yKCkKLQl7Ci0JCXJldHVybiB4bWxPbmVUb01hbnlfMl8yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvTWFueV8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvTWFueV8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAc2VlICNnZXRYbWxPbmVUb01hbnlfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sT25lVG9NYW55XzJfMl9DYXNjYWRlT25EZWxldGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE9uZVRvTWFueV8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxPbmVUb01hbnlfMl8yI2lzTm9uY2FjaGVhYmxlIDxlbT5Ob25jYWNoZWFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ob25jYWNoZWFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9NYW55XzJfMiNpc05vbmNhY2hlYWJsZSgpCi0JICogQHNlZSAjZ2V0WG1sT25lVG9NYW55XzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE9uZVRvTWFueV8yXzJfTm9uY2FjaGVhYmxlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxPbmVUb01hbnlfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nXzJfMiA8ZW0+WG1sIFBhcnRpdGlvbmluZyAyMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUGFydGl0aW9uaW5nIDIyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ18yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxQYXJ0aXRpb25pbmdfMl8yKCkKLQl7Ci0JCXJldHVybiB4bWxQYXJ0aXRpb25pbmdfMl8yRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdfMl8yI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbFBhcnRpdGlvbmluZ18yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQYXJ0aXRpb25pbmdfMl8yX05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBhcnRpdGlvbmluZ18yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIgPGVtPlhtbCBQYXJ0aXRpb25pbmcgR3JvdXAgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFBhcnRpdGlvbmluZyBHcm91cCAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMkVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRQYXJ0aXRpb25pbmcgPGVtPlBhcnRpdGlvbmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0UGFydGl0aW9uaW5nKCkKLQkgKiBAc2VlICNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxQYXJ0aXRpb25pbmdHcm91cF8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyA8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JICogQHNlZSAjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxQYXJ0aXRpb25pbmdHcm91cF8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nIDxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCSAqIEBzZWUgI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9Sb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxQYXJ0aXRpb25pbmdHcm91cF8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRQaW5uZWRQYXJ0aXRpb25pbmcgPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCSAqIEBzZWUgI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QaW5uZWRQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yI2dldFJhbmdlUGFydGl0aW9uaW5nIDxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yI2dldFJhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAc2VlICNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yI2dldFZhbHVlUGFydGl0aW9uaW5nIDxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yI2dldFZhbHVlUGFydGl0aW9uaW5nKCkKLQkgKiBAc2VlICNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfVmFsdWVQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yI2dldEhhc2hQYXJ0aXRpb25pbmcgPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yI2dldEhhc2hQYXJ0aXRpb25pbmcoKQotCSAqIEBzZWUgI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9IYXNoUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxQYXJ0aXRpb25pbmdHcm91cF8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRVbmlvblBhcnRpdGlvbmluZyA8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRVbmlvblBhcnRpdGlvbmluZygpCi0JICogQHNlZSAjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1VuaW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxQYXJ0aXRpb25pbmdHcm91cF8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRQYXJ0aXRpb25lZCA8ZW0+UGFydGl0aW9uZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0UGFydGl0aW9uZWQoKQotCSAqIEBzZWUgI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QYXJ0aXRpb25lZCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiA8ZW0+WG1sIFBpbm5lZCBQYXJ0aXRpb25pbmcgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFBpbm5lZCBQYXJ0aXRpb25pbmcgMjI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIoKQotCXsKLQkJcmV0dXJuIHhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzJFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzJfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiA8ZW0+WG1sIFJhbmdlIFBhcnRpdGlvbmluZyAyMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUmFuZ2UgUGFydGl0aW9uaW5nIDIyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMigpCi0JewotCQlyZXR1cm4geG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzJfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIDxlbT5YbWwgUmVwbGljYXRpb24gUGFydGl0aW9uaW5nIDIyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBSZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmcgMjI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yKCkKLQl7Ci0JCXJldHVybiB4bWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzJFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMl9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiA8ZW0+WG1sIFJvdW5kIFJvYmluIFBhcnRpdGlvbmluZyAyMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUm91bmQgUm9iaW4gUGFydGl0aW9uaW5nIDIyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIoKQotCXsKLQkJcmV0dXJuIHhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMl9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVtYmVkZGFibGVfMl8yIDxlbT5YbWwgRW1iZWRkYWJsZSAyMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW1iZWRkYWJsZSAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbWJlZGRhYmxlXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVtYmVkZGFibGVfMl8yKCkKLQl7Ci0JCXJldHVybiB4bWxFbWJlZGRhYmxlXzJfMkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSWRfMl8yIDxlbT5YbWwgSWQgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIElkIDIyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbElkXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbElkXzJfMigpCi0JewotCQlyZXR1cm4geG1sSWRfMl8yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbElkXzJfMiNnZXRJbmRleCA8ZW0+SW5kZXg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5JbmRleDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJZF8yXzIjZ2V0SW5kZXgoKQotCSAqIEBzZWUgI2dldFhtbElkXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbElkXzJfMl9JbmRleCgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sSWRfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEluZGV4XzJfMiA8ZW0+WG1sIEluZGV4IDIyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBJbmRleCAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxJbmRleF8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbEluZGV4XzJfMkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbEluZGV4XzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEluZGV4XzJfMl9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxJbmRleF8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzIjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TY2hlbWE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yI2dldFNjaGVtYSgpCi0JICogQHNlZSAjZ2V0WG1sSW5kZXhfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sSW5kZXhfMl8yX1NjaGVtYSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sSW5kZXhfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yI2dldENhdGFsb2cgPGVtPkNhdGFsb2c8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYXRhbG9nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEluZGV4XzJfMiNnZXRDYXRhbG9nKCkKLQkgKiBAc2VlICNnZXRYbWxJbmRleF8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxJbmRleF8yXzJfQ2F0YWxvZygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sSW5kZXhfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yI2dldFRhYmxlIDxlbT5UYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEluZGV4XzJfMiNnZXRUYWJsZSgpCi0JICogQHNlZSAjZ2V0WG1sSW5kZXhfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sSW5kZXhfMl8yX1RhYmxlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxJbmRleF8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzIjZ2V0VW5pcXVlIDxlbT5VbmlxdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VbmlxdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yI2dldFVuaXF1ZSgpCi0JICogQHNlZSAjZ2V0WG1sSW5kZXhfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sSW5kZXhfMl8yX1VuaXF1ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sSW5kZXhfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzIjZ2V0Q29sdW1uTmFtZXMgPGVtPkNvbHVtbiBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+Q29sdW1uIE5hbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEluZGV4XzJfMiNnZXRDb2x1bW5OYW1lcygpCi0JICogQHNlZSAjZ2V0WG1sSW5kZXhfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sSW5kZXhfMl8yX0NvbHVtbk5hbWVzKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxJbmRleF8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSm9pblRhYmxlXzJfMiA8ZW0+WG1sIEpvaW4gVGFibGUgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEpvaW4gVGFibGUgMjI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSm9pblRhYmxlXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEpvaW5UYWJsZV8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbEpvaW5UYWJsZV8yXzJFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxKb2luVGFibGVfMl8yI2dldENyZWF0aW9uU3VmZml4IDxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSm9pblRhYmxlXzJfMiNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQHNlZSAjZ2V0WG1sSm9pblRhYmxlXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEpvaW5UYWJsZV8yXzJfQ3JlYXRpb25TdWZmaXgoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEpvaW5UYWJsZV8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMiA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzcyAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yKCkKLQl7Ci0JCXJldHVybiB4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMiNnZXRBZGRpdGlvbmFsQ3JpdGVyaWEgPGVtPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5BZGRpdGlvbmFsIENyaXRlcmlhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yI2dldEFkZGl0aW9uYWxDcml0ZXJpYSgpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMl9BZGRpdGlvbmFsQ3JpdGVyaWEoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFNlY29uZGFyeVRhYmxlXzJfMiA8ZW0+WG1sIFNlY29uZGFyeSBUYWJsZSAyMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgU2Vjb25kYXJ5IFRhYmxlIDIyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFNlY29uZGFyeVRhYmxlXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFNlY29uZGFyeVRhYmxlXzJfMigpCi0JewotCQlyZXR1cm4geG1sU2Vjb25kYXJ5VGFibGVfMl8yRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sU2Vjb25kYXJ5VGFibGVfMl8yI2dldENyZWF0aW9uU3VmZml4IDxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sU2Vjb25kYXJ5VGFibGVfMl8yI2dldENyZWF0aW9uU3VmZml4KCkKLQkgKiBAc2VlICNnZXRYbWxTZWNvbmRhcnlUYWJsZV8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxTZWNvbmRhcnlUYWJsZV8yXzJfQ3JlYXRpb25TdWZmaXgoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFNlY29uZGFyeVRhYmxlXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlXzJfMiA8ZW0+WG1sIFRhYmxlIDIyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBUYWJsZSAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxUYWJsZV8yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxUYWJsZV8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbFRhYmxlXzJfMkVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlXzJfMiNnZXRDcmVhdGlvblN1ZmZpeCA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlXzJfMiNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQHNlZSAjZ2V0WG1sVGFibGVfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sVGFibGVfMl8yX0NyZWF0aW9uU3VmZml4KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUYWJsZV8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxUYWJsZUdlbmVyYXRvcl8yXzIgPGVtPlhtbCBUYWJsZSBHZW5lcmF0b3IgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFRhYmxlIEdlbmVyYXRvciAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxUYWJsZUdlbmVyYXRvcl8yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxUYWJsZUdlbmVyYXRvcl8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbFRhYmxlR2VuZXJhdG9yXzJfMkVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlR2VuZXJhdG9yXzJfMiNnZXRDcmVhdGlvblN1ZmZpeCA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlR2VuZXJhdG9yXzJfMiNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQHNlZSAjZ2V0WG1sVGFibGVHZW5lcmF0b3JfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sVGFibGVHZW5lcmF0b3JfMl8yX0NyZWF0aW9uU3VmZml4KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUYWJsZUdlbmVyYXRvcl8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgPGVtPlhtbCBVbmlvbiBQYXJ0aXRpb25pbmcgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFVuaW9uIFBhcnRpdGlvbmluZyAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxVbmlvblBhcnRpdGlvbmluZ18yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIoKQotCXsKLQkJcmV0dXJuIHhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMkVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxVbmlvblBhcnRpdGlvbmluZ18yXzIjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yX05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiA8ZW0+WG1sIFZhbHVlIFBhcnRpdGlvbmluZyAyMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVmFsdWUgUGFydGl0aW9uaW5nIDIyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMigpCi0JewotCQlyZXR1cm4geG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzJfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmFyaWFibGVPbmVUb09uZV8yXzIgPGVtPlhtbCBWYXJpYWJsZSBPbmUgVG8gT25lIDIyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBWYXJpYWJsZSBPbmUgVG8gT25lIDIyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhcmlhYmxlT25lVG9PbmVfMl8yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVmFyaWFibGVPbmVUb09uZV8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbFZhcmlhYmxlT25lVG9PbmVfMl8yRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmFyaWFibGVPbmVUb09uZV8yXzIjaXNOb25DYWNoZWFibGUgPGVtPk5vbiBDYWNoZWFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhcmlhYmxlT25lVG9PbmVfMl8yI2lzTm9uQ2FjaGVhYmxlKCkKLQkgKiBAc2VlICNnZXRYbWxWYXJpYWJsZU9uZVRvT25lXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFZhcmlhYmxlT25lVG9PbmVfMl8yX05vbkNhY2hlYWJsZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVmFyaWFibGVPbmVUb09uZV8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWZXJzaW9uXzJfMiA8ZW0+WG1sIFZlcnNpb24gMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFZlcnNpb24gMjI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmVyc2lvbl8yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxWZXJzaW9uXzJfMigpCi0JewotCQlyZXR1cm4geG1sVmVyc2lvbl8yXzJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmVyc2lvbl8yXzIjZ2V0SW5kZXggPGVtPkluZGV4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SW5kZXg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmVyc2lvbl8yXzIjZ2V0SW5kZXgoKQotCSAqIEBzZWUgI2dldFhtbFZlcnNpb25fMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sVmVyc2lvbl8yXzJfSW5kZXgoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFZlcnNpb25fMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuQ2FjaGVJc29sYXRpb25UeXBlIDxlbT5DYWNoZSBJc29sYXRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkNhY2hlIElzb2xhdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkNhY2hlSXNvbGF0aW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0Q2FjaGVJc29sYXRpb25UeXBlKCkKLQl7Ci0JCXJldHVybiBjYWNoZUlzb2xhdGlvblR5cGVFRW51bTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybVYyXzJGYWN0b3J5IGdldEVjbGlwc2VMaW5rT3JtVjJfMkZhY3RvcnkoKQotCXsKLQkJcmV0dXJuIChFY2xpcHNlTGlua09ybVYyXzJGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQl7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJeG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQURESVRJT05BTF9DUklURVJJQV8yMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMkVDbGFzcywgWE1MX0FERElUSU9OQUxfQ1JJVEVSSUFfMjJfX0NSSVRFUklBKTsKLQotCQl4bWxCYXNpY18yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0JBU0lDXzIyKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxCYXNpY18yXzJFQ2xhc3MsIFhNTF9CQVNJQ18yMl9fSU5ERVgpOwotCi0JCXhtbEJhc2ljQ29sbGVjdGlvbl8yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0JBU0lDX0NPTExFQ1RJT05fMjIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEJhc2ljQ29sbGVjdGlvbl8yXzJFQ2xhc3MsIFhNTF9CQVNJQ19DT0xMRUNUSU9OXzIyX19DQVNDQURFX09OX0RFTEVURSk7Ci0KLQkJeG1sQmFzaWNNYXBfMl8yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9CQVNJQ19NQVBfMjIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEJhc2ljTWFwXzJfMkVDbGFzcywgWE1MX0JBU0lDX01BUF8yMl9fQ0FTQ0FERV9PTl9ERUxFVEUpOwotCi0JCXhtbENhY2hlXzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ0FDSEVfMjIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENhY2hlXzJfMkVDbGFzcywgWE1MX0NBQ0hFXzIyX19JU09MQVRJT04pOwotCi0JCXhtbENvbGxlY3Rpb25UYWJsZV8yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0NPTExFQ1RJT05fVEFCTEVfMjIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENvbGxlY3Rpb25UYWJsZV8yXzJFQ2xhc3MsIFhNTF9DT0xMRUNUSU9OX1RBQkxFXzIyX19DUkVBVElPTl9TVUZGSVgpOwotCi0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzJFQ2xhc3MsIFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjJfX0NBU0NBREVfT05fREVMRVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzJFQ2xhc3MsIFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjJfX05PTkNBQ0hFQUJMRSk7Ci0KLQkJeG1sRW1iZWRkYWJsZV8yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VNQkVEREFCTEVfMjIpOwotCi0JCXhtbEVudGl0eV8yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VOVElUWV8yMik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5XzJfMkVDbGFzcywgWE1MX0VOVElUWV8yMl9fQURESVRJT05BTF9DUklURVJJQSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRW50aXR5XzJfMkVDbGFzcywgWE1MX0VOVElUWV8yMl9fQ0FTQ0FERV9PTl9ERUxFVEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eV8yXzJFQ2xhc3MsIFhNTF9FTlRJVFlfMjJfX0lOREVYKTsKLQotCQl4bWxFbnRpdHlNYXBwaW5nc18yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VOVElUWV9NQVBQSU5HU18yMik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5TWFwcGluZ3NfMl8yRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTXzIyX19QQVJUSVRJT05JTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzXzJfMkVDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlNYXBwaW5nc18yXzJFQ2xhc3MsIFhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5TWFwcGluZ3NfMl8yRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTXzIyX19QSU5ORURfUEFSVElUSU9OSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlNYXBwaW5nc18yXzJFQ2xhc3MsIFhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1JBTkdFX1BBUlRJVElPTklORyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5TWFwcGluZ3NfMl8yRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTXzIyX19WQUxVRV9QQVJUSVRJT05JTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzXzJfMkVDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fSEFTSF9QQVJUSVRJT05JTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzXzJfMkVDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fVU5JT05fUEFSVElUSU9OSU5HKTsKLQotCQl4bWxIYXNoUGFydGl0aW9uaW5nXzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfSEFTSF9QQVJUSVRJT05JTkdfMjIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yRUNsYXNzLCBYTUxfSEFTSF9QQVJUSVRJT05JTkdfMjJfX05BTUUpOwotCi0JCXhtbElkXzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfSURfMjIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbElkXzJfMkVDbGFzcywgWE1MX0lEXzIyX19JTkRFWCk7Ci0KLQkJeG1sSW5kZXhfMl8yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9JTkRFWF8yMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sSW5kZXhfMl8yRUNsYXNzLCBYTUxfSU5ERVhfMjJfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEluZGV4XzJfMkVDbGFzcywgWE1MX0lOREVYXzIyX19TQ0hFTUEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEluZGV4XzJfMkVDbGFzcywgWE1MX0lOREVYXzIyX19DQVRBTE9HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxJbmRleF8yXzJFQ2xhc3MsIFhNTF9JTkRFWF8yMl9fVEFCTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEluZGV4XzJfMkVDbGFzcywgWE1MX0lOREVYXzIyX19VTklRVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEluZGV4XzJfMkVDbGFzcywgWE1MX0lOREVYXzIyX19DT0xVTU5fTkFNRVMpOwotCi0JCXhtbEpvaW5UYWJsZV8yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0pPSU5fVEFCTEVfMjIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEpvaW5UYWJsZV8yXzJFQ2xhc3MsIFhNTF9KT0lOX1RBQkxFXzIyX19DUkVBVElPTl9TVUZGSVgpOwotCi0JCXhtbE1hbnlUb01hbnlfMl8yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQU5ZX1RPX01BTllfMjIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE1hbnlUb01hbnlfMl8yRUNsYXNzLCBYTUxfTUFOWV9UT19NQU5ZXzIyX19DQVNDQURFX09OX0RFTEVURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTWFueVRvTWFueV8yXzJFQ2xhc3MsIFhNTF9NQU5ZX1RPX01BTllfMjJfX05PTl9DQUNIRUFCTEUpOwotCi0JCXhtbE1hbnlUb09uZV8yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BTllfVE9fT05FXzIyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxNYW55VG9PbmVfMl8yRUNsYXNzLCBYTUxfTUFOWV9UT19PTkVfMjJfX05PTl9DQUNIRUFCTEUpOwotCi0JCXhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFwcGVkU3VwZXJjbGFzc18yXzJFQ2xhc3MsIFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMl9fQURESVRJT05BTF9DUklURVJJQSk7Ci0KLQkJeG1sT25lVG9PbmVfMl8yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9PTkVfVE9fT05FXzIyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxPbmVUb09uZV8yXzJFQ2xhc3MsIFhNTF9PTkVfVE9fT05FXzIyX19DQVNDQURFX09OX0RFTEVURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sT25lVG9PbmVfMl8yRUNsYXNzLCBYTUxfT05FX1RPX09ORV8yMl9fTk9OX0NBQ0hFQUJMRSk7Ci0KLQkJeG1sT25lVG9NYW55XzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT05FX1RPX01BTllfMjIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE9uZVRvTWFueV8yXzJFQ2xhc3MsIFhNTF9PTkVfVE9fTUFOWV8yMl9fQ0FTQ0FERV9PTl9ERUxFVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE9uZVRvTWFueV8yXzJFQ2xhc3MsIFhNTF9PTkVfVE9fTUFOWV8yMl9fTk9OQ0FDSEVBQkxFKTsKLQotCQl4bWxQYXJ0aXRpb25pbmdfMl8yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QQVJUSVRJT05JTkdfMjIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFBhcnRpdGlvbmluZ18yXzJFQ2xhc3MsIFhNTF9QQVJUSVRJT05JTkdfMjJfX05BTUUpOwotCi0JCXhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxQYXJ0aXRpb25pbmdHcm91cF8yXzJFQ2xhc3MsIFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yRUNsYXNzLCBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMkVDbGFzcywgWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxQYXJ0aXRpb25pbmdHcm91cF8yXzJFQ2xhc3MsIFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMkVDbGFzcywgWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkFOR0VfUEFSVElUSU9OSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxQYXJ0aXRpb25pbmdHcm91cF8yXzJFQ2xhc3MsIFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1ZBTFVFX1BBUlRJVElPTklORyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yRUNsYXNzLCBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yRUNsYXNzLCBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19VTklPTl9QQVJUSVRJT05JTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMkVDbGFzcywgWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9ORUQpOwotCi0JCXhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BJTk5FRF9QQVJUSVRJT05JTkdfMjIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzJFQ2xhc3MsIFhNTF9QSU5ORURfUEFSVElUSU9OSU5HXzIyX19OQU1FKTsKLQotCQl4bWxSYW5nZVBhcnRpdGlvbmluZ18yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1JBTkdFX1BBUlRJVElPTklOR18yMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yRUNsYXNzLCBYTUxfUkFOR0VfUEFSVElUSU9OSU5HXzIyX19OQU1FKTsKLQotCQl4bWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1JFUExJQ0FUSU9OX1BBUlRJVElPTklOR18yMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yRUNsYXNzLCBYTUxfUkVQTElDQVRJT05fUEFSVElUSU9OSU5HXzIyX19OQU1FKTsKLQotCQl4bWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HXzIyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMkVDbGFzcywgWE1MX1JPVU5EX1JPQklOX1BBUlRJVElPTklOR18yMl9fTkFNRSk7Ci0KLQkJeG1sU2Vjb25kYXJ5VGFibGVfMl8yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9TRUNPTkRBUllfVEFCTEVfMjIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFNlY29uZGFyeVRhYmxlXzJfMkVDbGFzcywgWE1MX1NFQ09OREFSWV9UQUJMRV8yMl9fQ1JFQVRJT05fU1VGRklYKTsKLQotCQl4bWxUYWJsZV8yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1RBQkxFXzIyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUYWJsZV8yXzJFQ2xhc3MsIFhNTF9UQUJMRV8yMl9fQ1JFQVRJT05fU1VGRklYKTsKLQotCQl4bWxUYWJsZUdlbmVyYXRvcl8yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1RBQkxFX0dFTkVSQVRPUl8yMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sVGFibGVHZW5lcmF0b3JfMl8yRUNsYXNzLCBYTUxfVEFCTEVfR0VORVJBVE9SXzIyX19DUkVBVElPTl9TVUZGSVgpOwotCi0JCXhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVU5JT05fUEFSVElUSU9OSU5HXzIyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxVbmlvblBhcnRpdGlvbmluZ18yXzJFQ2xhc3MsIFhNTF9VTklPTl9QQVJUSVRJT05JTkdfMjJfX05BTUUpOwotCi0JCXhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVkFMVUVfUEFSVElUSU9OSU5HXzIyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxWYWx1ZVBhcnRpdGlvbmluZ18yXzJFQ2xhc3MsIFhNTF9WQUxVRV9QQVJUSVRJT05JTkdfMjJfX05BTUUpOwotCi0JCXhtbFZhcmlhYmxlT25lVG9PbmVfMl8yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FXzIyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxWYXJpYWJsZU9uZVRvT25lXzJfMkVDbGFzcywgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfMjJfX05PTl9DQUNIRUFCTEUpOwotCi0JCXhtbFZlcnNpb25fMl8yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9WRVJTSU9OXzIyKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxWZXJzaW9uXzJfMkVDbGFzcywgWE1MX1ZFUlNJT05fMjJfX0lOREVYKTsKLQotCQkvLyBDcmVhdGUgZW51bXMKLQkJY2FjaGVJc29sYXRpb25UeXBlRUVudW0gPSBjcmVhdGVFRW51bShDQUNIRV9JU09MQVRJT05fVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQl7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJWE1MVHlwZVBhY2thZ2UgdGhlWE1MVHlwZVBhY2thZ2UgPSAoWE1MVHlwZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoWE1MVHlwZVBhY2thZ2UuZU5TX1VSSSk7Ci0JCU9ybVBhY2thZ2UgdGhlT3JtUGFja2FnZSA9IChPcm1QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJeG1sRWxlbWVudENvbGxlY3Rpb25fMl8yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yKCkpOwotCQl4bWxFbWJlZGRhYmxlXzJfMkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkpOwotCQl4bWxFbWJlZGRhYmxlXzJfMkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKSk7Ci0JCXhtbEVudGl0eV8yXzJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIoKSk7Ci0JCXhtbE1hbnlUb01hbnlfMl8yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yKCkpOwotCQl4bWxNYW55VG9PbmVfMl8yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yKCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMigpKTsKLQkJeG1sT25lVG9PbmVfMl8yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yKCkpOwotCQl4bWxPbmVUb01hbnlfMl8yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yKCkpOwotCQl4bWxWYXJpYWJsZU9uZVRvT25lXzJfMkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMigpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKHhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzJFQ2xhc3MsIFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIuY2xhc3MsICJYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMl9Dcml0ZXJpYSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNyaXRlcmlhIiwgbnVsbCwgMCwgMSwgWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEJhc2ljXzJfMkVDbGFzcywgWG1sQmFzaWNfMl8yLmNsYXNzLCAiWG1sQmFzaWNfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQmFzaWNfMl8yX0luZGV4KCksIHRoaXMuZ2V0WG1sSW5kZXhfMl8yKCksIG51bGwsICJpbmRleCIsIG51bGwsIDAsIDEsIFhtbEJhc2ljXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEJhc2ljQ29sbGVjdGlvbl8yXzJFQ2xhc3MsIFhtbEJhc2ljQ29sbGVjdGlvbl8yXzIuY2xhc3MsICJYbWxCYXNpY0NvbGxlY3Rpb25fMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQmFzaWNDb2xsZWN0aW9uXzJfMl9DYXNjYWRlT25EZWxldGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAiY2FzY2FkZU9uRGVsZXRlIiwgbnVsbCwgMCwgMSwgWG1sQmFzaWNDb2xsZWN0aW9uXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEJhc2ljTWFwXzJfMkVDbGFzcywgWG1sQmFzaWNNYXBfMl8yLmNsYXNzLCAiWG1sQmFzaWNNYXBfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQmFzaWNNYXBfMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJjYXNjYWRlT25EZWxldGUiLCBudWxsLCAwLCAxLCBYbWxCYXNpY01hcF8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxDYWNoZV8yXzJFQ2xhc3MsIFhtbENhY2hlXzJfMi5jbGFzcywgIlhtbENhY2hlXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENhY2hlXzJfMl9Jc29sYXRpb24oKSwgdGhpcy5nZXRDYWNoZUlzb2xhdGlvblR5cGUoKSwgImlzb2xhdGlvbiIsICIiLCAwLCAxLCBYbWxDYWNoZV8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxDb2xsZWN0aW9uVGFibGVfMl8yRUNsYXNzLCBYbWxDb2xsZWN0aW9uVGFibGVfMl8yLmNsYXNzLCAiWG1sQ29sbGVjdGlvblRhYmxlXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENvbGxlY3Rpb25UYWJsZV8yXzJfQ3JlYXRpb25TdWZmaXgoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjcmVhdGlvblN1ZmZpeCIsIG51bGwsIDAsIDEsIFhtbENvbGxlY3Rpb25UYWJsZV8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzJFQ2xhc3MsIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMi5jbGFzcywgIlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMl9DYXNjYWRlT25EZWxldGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAiY2FzY2FkZU9uRGVsZXRlIiwgbnVsbCwgMCwgMSwgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzJfTm9uY2FjaGVhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgIm5vbmNhY2hlYWJsZSIsIG51bGwsIDAsIDEsIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEVtYmVkZGFibGVfMl8yRUNsYXNzLCBYbWxFbWJlZGRhYmxlXzJfMi5jbGFzcywgIlhtbEVtYmVkZGFibGVfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEVudGl0eV8yXzJFQ2xhc3MsIFhtbEVudGl0eV8yXzIuY2xhc3MsICJYbWxFbnRpdHlfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5XzJfMl9BZGRpdGlvbmFsQ3JpdGVyaWEoKSwgdGhpcy5nZXRYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yKCksIG51bGwsICJhZGRpdGlvbmFsQ3JpdGVyaWEiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHlfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbnRpdHlfMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJjYXNjYWRlT25EZWxldGUiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHlfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfMl8yX0luZGV4KCksIHRoaXMuZ2V0WG1sSW5kZXhfMl8yKCksIG51bGwsICJpbmRleCIsIG51bGwsIDAsIDEsIFhtbEVudGl0eV8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbnRpdHlNYXBwaW5nc18yXzJFQ2xhc3MsIFhtbEVudGl0eU1hcHBpbmdzXzJfMi5jbGFzcywgIlhtbEVudGl0eU1hcHBpbmdzXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9QYXJ0aXRpb25pbmcoKSwgdGhpcy5nZXRYbWxQYXJ0aXRpb25pbmdfMl8yKCksIG51bGwsICJwYXJ0aXRpb25pbmciLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5TWFwcGluZ3NfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKSwgdGhpcy5nZXRYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIoKSwgbnVsbCwgInJlcGxpY2F0aW9uUGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eU1hcHBpbmdzXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKSwgdGhpcy5nZXRYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMigpLCBudWxsLCAicm91bmRSb2JpblBhcnRpdGlvbmluZyIsIG51bGwsIDAsIC0xLCBYbWxFbnRpdHlNYXBwaW5nc18yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9QaW5uZWRQYXJ0aXRpb25pbmcoKSwgdGhpcy5nZXRYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKCksIG51bGwsICJwaW5uZWRQYXJ0aXRpb25pbmciLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5TWFwcGluZ3NfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKSwgdGhpcy5nZXRYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIoKSwgbnVsbCwgInJhbmdlUGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eU1hcHBpbmdzXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1ZhbHVlUGFydGl0aW9uaW5nKCksIHRoaXMuZ2V0WG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yKCksIG51bGwsICJ2YWx1ZVBhcnRpdGlvbmluZyIsIG51bGwsIDAsIC0xLCBYbWxFbnRpdHlNYXBwaW5nc18yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9IYXNoUGFydGl0aW9uaW5nKCksIHRoaXMuZ2V0WG1sSGFzaFBhcnRpdGlvbmluZ18yXzIoKSwgbnVsbCwgImhhc2hQYXJ0aXRpb25pbmciLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5TWFwcGluZ3NfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfVW5pb25QYXJ0aXRpb25pbmcoKSwgdGhpcy5nZXRYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIoKSwgbnVsbCwgInVuaW9uUGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eU1hcHBpbmdzXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yRUNsYXNzLCBYbWxIYXNoUGFydGl0aW9uaW5nXzJfMi5jbGFzcywgIlhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sSGFzaFBhcnRpdGlvbmluZ18yXzJfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxIYXNoUGFydGl0aW9uaW5nXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbElkXzJfMkVDbGFzcywgWG1sSWRfMl8yLmNsYXNzLCAiWG1sSWRfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sSWRfMl8yX0luZGV4KCksIHRoaXMuZ2V0WG1sSW5kZXhfMl8yKCksIG51bGwsICJpbmRleCIsIG51bGwsIDAsIDEsIFhtbElkXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEluZGV4XzJfMkVDbGFzcywgWG1sSW5kZXhfMl8yLmNsYXNzLCAiWG1sSW5kZXhfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sSW5kZXhfMl8yX05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgWG1sSW5kZXhfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxJbmRleF8yXzJfU2NoZW1hKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2NoZW1hIiwgbnVsbCwgMCwgMSwgWG1sSW5kZXhfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxJbmRleF8yXzJfQ2F0YWxvZygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNhdGFsb2ciLCBudWxsLCAwLCAxLCBYbWxJbmRleF8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEluZGV4XzJfMl9UYWJsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInRhYmxlIiwgbnVsbCwgMCwgMSwgWG1sSW5kZXhfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxJbmRleF8yXzJfVW5pcXVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgInVuaXF1ZSIsIG51bGwsIDAsIDEsIFhtbEluZGV4XzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sSW5kZXhfMl8yX0NvbHVtbk5hbWVzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29sdW1uTmFtZXMiLCBudWxsLCAwLCAtMSwgWG1sSW5kZXhfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEpvaW5UYWJsZV8yXzJFQ2xhc3MsIFhtbEpvaW5UYWJsZV8yXzIuY2xhc3MsICJYbWxKb2luVGFibGVfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sSm9pblRhYmxlXzJfMl9DcmVhdGlvblN1ZmZpeCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNyZWF0aW9uU3VmZml4IiwgbnVsbCwgMCwgMSwgWG1sSm9pblRhYmxlXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hbnlUb01hbnlfMl8yRUNsYXNzLCBYbWxNYW55VG9NYW55XzJfMi5jbGFzcywgIlhtbE1hbnlUb01hbnlfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTWFueVRvTWFueV8yXzJfQ2FzY2FkZU9uRGVsZXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgImNhc2NhZGVPbkRlbGV0ZSIsIG51bGwsIDAsIDEsIFhtbE1hbnlUb01hbnlfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxNYW55VG9NYW55XzJfMl9Ob25DYWNoZWFibGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAibm9uQ2FjaGVhYmxlIiwgbnVsbCwgMCwgMSwgWG1sTWFueVRvTWFueV8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNYW55VG9PbmVfMl8yRUNsYXNzLCBYbWxNYW55VG9PbmVfMl8yLmNsYXNzLCAiWG1sTWFueVRvT25lXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE1hbnlUb09uZV8yXzJfTm9uQ2FjaGVhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgIm5vbkNhY2hlYWJsZSIsIG51bGwsIDAsIDEsIFhtbE1hbnlUb09uZV8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMkVDbGFzcywgWG1sTWFwcGVkU3VwZXJjbGFzc18yXzIuY2xhc3MsICJYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yX0FkZGl0aW9uYWxDcml0ZXJpYSgpLCB0aGlzLmdldFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIoKSwgbnVsbCwgImFkZGl0aW9uYWxDcml0ZXJpYSIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sT25lVG9PbmVfMl8yRUNsYXNzLCBYbWxPbmVUb09uZV8yXzIuY2xhc3MsICJYbWxPbmVUb09uZV8yXzIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxPbmVUb09uZV8yXzJfQ2FzY2FkZU9uRGVsZXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgImNhc2NhZGVPbkRlbGV0ZSIsIG51bGwsIDAsIDEsIFhtbE9uZVRvT25lXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sT25lVG9PbmVfMl8yX05vbkNhY2hlYWJsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJub25DYWNoZWFibGUiLCBudWxsLCAwLCAxLCBYbWxPbmVUb09uZV8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxPbmVUb01hbnlfMl8yRUNsYXNzLCBYbWxPbmVUb01hbnlfMl8yLmNsYXNzLCAiWG1sT25lVG9NYW55XzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE9uZVRvTWFueV8yXzJfQ2FzY2FkZU9uRGVsZXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgImNhc2NhZGVPbkRlbGV0ZSIsIG51bGwsIDAsIDEsIFhtbE9uZVRvTWFueV8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE9uZVRvTWFueV8yXzJfTm9uY2FjaGVhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgIm5vbmNhY2hlYWJsZSIsIG51bGwsIDAsIDEsIFhtbE9uZVRvTWFueV8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxQYXJ0aXRpb25pbmdfMl8yRUNsYXNzLCBYbWxQYXJ0aXRpb25pbmdfMl8yLmNsYXNzLCAiWG1sUGFydGl0aW9uaW5nXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFBhcnRpdGlvbmluZ18yXzJfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxQYXJ0aXRpb25pbmdfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yRUNsYXNzLCBYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIuY2xhc3MsICJYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGFydGl0aW9uaW5nKCksIHRoaXMuZ2V0WG1sUGFydGl0aW9uaW5nXzJfMigpLCBudWxsLCAicGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgMSwgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKSwgdGhpcy5nZXRYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIoKSwgbnVsbCwgInJlcGxpY2F0aW9uUGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgMSwgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUm91bmRSb2JpblBhcnRpdGlvbmluZygpLCB0aGlzLmdldFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKCksIG51bGwsICJyb3VuZFJvYmluUGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgMSwgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGlubmVkUGFydGl0aW9uaW5nKCksIHRoaXMuZ2V0WG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMigpLCBudWxsLCAicGlubmVkUGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgMSwgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKSwgdGhpcy5nZXRYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIoKSwgbnVsbCwgInJhbmdlUGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgMSwgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfVmFsdWVQYXJ0aXRpb25pbmcoKSwgdGhpcy5nZXRYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIoKSwgbnVsbCwgInZhbHVlUGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgMSwgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfSGFzaFBhcnRpdGlvbmluZygpLCB0aGlzLmdldFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKCksIG51bGwsICJoYXNoUGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgMSwgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfVW5pb25QYXJ0aXRpb25pbmcoKSwgdGhpcy5nZXRYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIoKSwgbnVsbCwgInVuaW9uUGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgMSwgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGFydGl0aW9uZWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwYXJ0aXRpb25lZCIsIG51bGwsIDAsIDEsIFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzJFQ2xhc3MsIFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIuY2xhc3MsICJYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMl9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxSYW5nZVBhcnRpdGlvbmluZ18yXzJFQ2xhc3MsIFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMi5jbGFzcywgIlhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMl9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMkVDbGFzcywgWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yLmNsYXNzLCAiWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yX05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzJFQ2xhc3MsIFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yLmNsYXNzLCAiWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMl9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sU2Vjb25kYXJ5VGFibGVfMl8yRUNsYXNzLCBYbWxTZWNvbmRhcnlUYWJsZV8yXzIuY2xhc3MsICJYbWxTZWNvbmRhcnlUYWJsZV8yXzIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxTZWNvbmRhcnlUYWJsZV8yXzJfQ3JlYXRpb25TdWZmaXgoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjcmVhdGlvblN1ZmZpeCIsIG51bGwsIDAsIDEsIFhtbFNlY29uZGFyeVRhYmxlXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFRhYmxlXzJfMkVDbGFzcywgWG1sVGFibGVfMl8yLmNsYXNzLCAiWG1sVGFibGVfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVGFibGVfMl8yX0NyZWF0aW9uU3VmZml4KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY3JlYXRpb25TdWZmaXgiLCBudWxsLCAwLCAxLCBYbWxUYWJsZV8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxUYWJsZUdlbmVyYXRvcl8yXzJFQ2xhc3MsIFhtbFRhYmxlR2VuZXJhdG9yXzJfMi5jbGFzcywgIlhtbFRhYmxlR2VuZXJhdG9yXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFRhYmxlR2VuZXJhdG9yXzJfMl9DcmVhdGlvblN1ZmZpeCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNyZWF0aW9uU3VmZml4IiwgbnVsbCwgMCwgMSwgWG1sVGFibGVHZW5lcmF0b3JfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yRUNsYXNzLCBYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIuY2xhc3MsICJYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxVbmlvblBhcnRpdGlvbmluZ18yXzJfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxWYWx1ZVBhcnRpdGlvbmluZ18yXzJFQ2xhc3MsIFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMi5jbGFzcywgIlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMl9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFZhcmlhYmxlT25lVG9PbmVfMl8yRUNsYXNzLCBYbWxWYXJpYWJsZU9uZVRvT25lXzJfMi5jbGFzcywgIlhtbFZhcmlhYmxlT25lVG9PbmVfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVmFyaWFibGVPbmVUb09uZV8yXzJfTm9uQ2FjaGVhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgIm5vbkNhY2hlYWJsZSIsIG51bGwsIDAsIDEsIFhtbFZhcmlhYmxlT25lVG9PbmVfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sVmVyc2lvbl8yXzJFQ2xhc3MsIFhtbFZlcnNpb25fMl8yLmNsYXNzLCAiWG1sVmVyc2lvbl8yXzIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxWZXJzaW9uXzJfMl9JbmRleCgpLCB0aGlzLmdldFhtbEluZGV4XzJfMigpLCBudWxsLCAiaW5kZXgiLCBudWxsLCAwLCAxLCBYbWxWZXJzaW9uXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0oY2FjaGVJc29sYXRpb25UeXBlRUVudW0sIENhY2hlSXNvbGF0aW9uVHlwZS5jbGFzcywgIkNhY2hlSXNvbGF0aW9uVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoY2FjaGVJc29sYXRpb25UeXBlRUVudW0sIENhY2hlSXNvbGF0aW9uVHlwZS5TSEFSRUQpOwotCQlhZGRFRW51bUxpdGVyYWwoY2FjaGVJc29sYXRpb25UeXBlRUVudW0sIENhY2hlSXNvbGF0aW9uVHlwZS5QUk9URUNURUQpOwotCQlhZGRFRW51bUxpdGVyYWwoY2FjaGVJc29sYXRpb25UeXBlRUVudW0sIENhY2hlSXNvbGF0aW9uVHlwZS5JU09MQVRFRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludGVyZmFjZSBMaXRlcmFscwotCXsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMiA8ZW0+WG1sIEFkZGl0aW9uYWwgQ3JpdGVyaWEgMjI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQURESVRJT05BTF9DUklURVJJQV8yMiA9IGVJTlNUQU5DRS5nZXRYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Dcml0ZXJpYTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0FERElUSU9OQUxfQ1JJVEVSSUFfMjJfX0NSSVRFUklBID0gZUlOU1RBTkNFLmdldFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzJfQ3JpdGVyaWEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY18yXzIgPGVtPlhtbCBCYXNpYyAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY18yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxCYXNpY18yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQkFTSUNfMjIgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0JBU0lDXzIyX19JTkRFWCA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY18yXzJfSW5kZXgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY0NvbGxlY3Rpb25fMl8yIDxlbT5YbWwgQmFzaWMgQ29sbGVjdGlvbiAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY0NvbGxlY3Rpb25fMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sQmFzaWNDb2xsZWN0aW9uXzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9CQVNJQ19DT0xMRUNUSU9OXzIyID0gZUlOU1RBTkNFLmdldFhtbEJhc2ljQ29sbGVjdGlvbl8yXzIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQkFTSUNfQ09MTEVDVElPTl8yMl9fQ0FTQ0FERV9PTl9ERUxFVEUgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzaWNDb2xsZWN0aW9uXzJfMl9DYXNjYWRlT25EZWxldGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY01hcF8yXzIgPGVtPlhtbCBCYXNpYyBNYXAgMjI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQmFzaWNNYXBfMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sQmFzaWNNYXBfMl8yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0JBU0lDX01BUF8yMiA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY01hcF8yXzIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQkFTSUNfTUFQXzIyX19DQVNDQURFX09OX0RFTEVURSA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY01hcF8yXzJfQ2FzY2FkZU9uRGVsZXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQ2FjaGVfMl8yIDxlbT5YbWwgQ2FjaGUgMjI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQ2FjaGVfMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sQ2FjaGVfMl8yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NBQ0hFXzIyID0gZUlOU1RBTkNFLmdldFhtbENhY2hlXzJfMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXNvbGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ0FDSEVfMjJfX0lTT0xBVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxDYWNoZV8yXzJfSXNvbGF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQ29sbGVjdGlvblRhYmxlXzJfMiA8ZW0+WG1sIENvbGxlY3Rpb24gVGFibGUgMjI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQ29sbGVjdGlvblRhYmxlXzJfMgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbENvbGxlY3Rpb25UYWJsZV8yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ09MTEVDVElPTl9UQUJMRV8yMiA9IGVJTlNUQU5DRS5nZXRYbWxDb2xsZWN0aW9uVGFibGVfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DcmVhdGlvbiBTdWZmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DT0xMRUNUSU9OX1RBQkxFXzIyX19DUkVBVElPTl9TVUZGSVggPSBlSU5TVEFOQ0UuZ2V0WG1sQ29sbGVjdGlvblRhYmxlXzJfMl9DcmVhdGlvblN1ZmZpeCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMiA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIyID0gZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjJfX0NBU0NBREVfT05fREVMRVRFID0gZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMl9DYXNjYWRlT25EZWxldGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vbmNhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMl9fTk9OQ0FDSEVBQkxFID0gZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMl9Ob25jYWNoZWFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlfMl8yIDxlbT5YbWwgRW50aXR5IDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eV8yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VOVElUWV8yMiA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIE9uIERlbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VOVElUWV8yMl9fQ0FTQ0FERV9PTl9ERUxFVEUgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzJfMl9DYXNjYWRlT25EZWxldGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZXzIyX19JTkRFWCA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMl8yX0luZGV4KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yIDxlbT5YbWwgRW50aXR5IE1hcHBpbmdzIDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eU1hcHBpbmdzXzJfMgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTlRJVFlfTUFQUElOR1NfMjIgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fUEFSVElUSU9OSU5HID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9QYXJ0aXRpb25pbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9Sb3VuZFJvYmluUGFydGl0aW9uaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1Bpbm5lZFBhcnRpdGlvbmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1JBTkdFX1BBUlRJVElPTklORyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTXzIyX19WQUxVRV9QQVJUSVRJT05JTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1ZhbHVlUGFydGl0aW9uaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IYXNoIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTXzIyX19IQVNIX1BBUlRJVElPTklORyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfSGFzaFBhcnRpdGlvbmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VW5pb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1VOSU9OX1BBUlRJVElPTklORyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfVW5pb25QYXJ0aXRpb25pbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxIYXNoUGFydGl0aW9uaW5nXzJfMiA8ZW0+WG1sIEhhc2ggUGFydGl0aW9uaW5nIDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sSGFzaFBhcnRpdGlvbmluZ18yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfSEFTSF9QQVJUSVRJT05JTkdfMjIgPSBlSU5TVEFOQ0UuZ2V0WG1sSGFzaFBhcnRpdGlvbmluZ18yXzIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9IQVNIX1BBUlRJVElPTklOR18yMl9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxIYXNoUGFydGl0aW9uaW5nXzJfMl9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsIENyaXRlcmlhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZXzIyX19BRERJVElPTkFMX0NSSVRFUklBID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzJfQWRkaXRpb25hbENyaXRlcmlhKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sTWFueVRvTWFueV8yXzIgPGVtPlhtbCBNYW55IFRvIE1hbnkgMjI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sTWFueVRvTWFueV8yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxNYW55VG9NYW55XzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQU5ZX1RPX01BTllfMjIgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueV8yXzIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTUFOWV9UT19NQU5ZXzIyX19DQVNDQURFX09OX0RFTEVURSA9IGVJTlNUQU5DRS5nZXRYbWxNYW55VG9NYW55XzJfMl9DYXNjYWRlT25EZWxldGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vbiBDYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9NQU5ZX1RPX01BTllfMjJfX05PTl9DQUNIRUFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueV8yXzJfTm9uQ2FjaGVhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sTWFueVRvT25lXzJfMiA8ZW0+WG1sIE1hbnkgVG8gT25lIDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb09uZV8yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxNYW55VG9PbmVfMl8yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX01BTllfVE9fT05FXzIyID0gZUlOU1RBTkNFLmdldFhtbE1hbnlUb09uZV8yXzIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vbiBDYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9NQU5ZX1RPX09ORV8yMl9fTk9OX0NBQ0hFQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxNYW55VG9PbmVfMl8yX05vbkNhY2hlYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvT25lXzJfMiA8ZW0+WG1sIE9uZSBUbyBPbmUgMjI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9PbmVfMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sT25lVG9PbmVfMl8yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX09ORV9UT19PTkVfMjIgPSBlSU5TVEFOQ0UuZ2V0WG1sT25lVG9PbmVfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIE9uIERlbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX09ORV9UT19PTkVfMjJfX0NBU0NBREVfT05fREVMRVRFID0gZUlOU1RBTkNFLmdldFhtbE9uZVRvT25lXzJfMl9DYXNjYWRlT25EZWxldGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vbiBDYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9PTkVfVE9fT05FXzIyX19OT05fQ0FDSEVBQkxFID0gZUlOU1RBTkNFLmdldFhtbE9uZVRvT25lXzJfMl9Ob25DYWNoZWFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxPbmVUb01hbnlfMl8yIDxlbT5YbWwgT25lIFRvIE1hbnkgMjI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9NYW55XzJfMgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbE9uZVRvTWFueV8yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfT05FX1RPX01BTllfMjIgPSBlSU5TVEFOQ0UuZ2V0WG1sT25lVG9NYW55XzJfMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9PTkVfVE9fTUFOWV8yMl9fQ0FTQ0FERV9PTl9ERUxFVEUgPSBlSU5TVEFOQ0UuZ2V0WG1sT25lVG9NYW55XzJfMl9DYXNjYWRlT25EZWxldGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vbmNhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX09ORV9UT19NQU5ZXzIyX19OT05DQUNIRUFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sT25lVG9NYW55XzJfMl9Ob25jYWNoZWFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdfMl8yIDxlbT5YbWwgUGFydGl0aW9uaW5nIDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ18yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdfMl8yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BBUlRJVElPTklOR18yMiA9IGVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEFSVElUSU9OSU5HXzIyX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ18yXzJfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiA8ZW0+WG1sIFBhcnRpdGlvbmluZyBHcm91cCAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyID0gZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05JTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORyA9IGVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUm91bmRSb2JpblBhcnRpdGlvbmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORyA9IGVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGlubmVkUGFydGl0aW9uaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JBTkdFX1BBUlRJVElPTklORyA9IGVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVkFMVUVfUEFSVElUSU9OSU5HID0gZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9WYWx1ZVBhcnRpdGlvbmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX0hBU0hfUEFSVElUSU9OSU5HID0gZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9IYXNoUGFydGl0aW9uaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1VOSU9OX1BBUlRJVElPTklORyA9IGVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfVW5pb25QYXJ0aXRpb25pbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRCA9IGVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGFydGl0aW9uZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIDxlbT5YbWwgUGlubmVkIFBhcnRpdGlvbmluZyAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QSU5ORURfUEFSVElUSU9OSU5HXzIyID0gZUlOU1RBTkNFLmdldFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QSU5ORURfUEFSVElUSU9OSU5HXzIyX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzJfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiA8ZW0+WG1sIFJhbmdlIFBhcnRpdGlvbmluZyAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUkFOR0VfUEFSVElUSU9OSU5HXzIyID0gZUlOU1RBTkNFLmdldFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1JBTkdFX1BBUlRJVElPTklOR18yMl9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzJfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiA8ZW0+WG1sIFJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZyAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUkVQTElDQVRJT05fUEFSVElUSU9OSU5HXzIyID0gZUlOU1RBTkNFLmdldFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1JFUExJQ0FUSU9OX1BBUlRJVElPTklOR18yMl9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzJfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIDxlbT5YbWwgUm91bmQgUm9iaW4gUGFydGl0aW9uaW5nIDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HXzIyID0gZUlOU1RBTkNFLmdldFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HXzIyX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbWJlZGRhYmxlXzJfMiA8ZW0+WG1sIEVtYmVkZGFibGUgMjI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW1iZWRkYWJsZV8yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbWJlZGRhYmxlXzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTUJFRERBQkxFXzIyID0gZUlOU1RBTkNFLmdldFhtbEVtYmVkZGFibGVfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSWRfMl8yIDxlbT5YbWwgSWQgMjI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSWRfMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sSWRfMl8yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0lEXzIyID0gZUlOU1RBTkNFLmdldFhtbElkXzJfMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5kZXg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9JRF8yMl9fSU5ERVggPSBlSU5TVEFOQ0UuZ2V0WG1sSWRfMl8yX0luZGV4KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yIDxlbT5YbWwgSW5kZXggMjI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sSW5kZXhfMl8yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0lOREVYXzIyID0gZUlOU1RBTkNFLmdldFhtbEluZGV4XzJfMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0lOREVYXzIyX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbEluZGV4XzJfMl9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9JTkRFWF8yMl9fU0NIRU1BID0gZUlOU1RBTkNFLmdldFhtbEluZGV4XzJfMl9TY2hlbWEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9JTkRFWF8yMl9fQ0FUQUxPRyA9IGVJTlNUQU5DRS5nZXRYbWxJbmRleF8yXzJfQ2F0YWxvZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9JTkRFWF8yMl9fVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sSW5kZXhfMl8yX1RhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9JTkRFWF8yMl9fVU5JUVVFID0gZUlOU1RBTkNFLmdldFhtbEluZGV4XzJfMl9VbmlxdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbiBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfSU5ERVhfMjJfX0NPTFVNTl9OQU1FUyA9IGVJTlNUQU5DRS5nZXRYbWxJbmRleF8yXzJfQ29sdW1uTmFtZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxKb2luVGFibGVfMl8yIDxlbT5YbWwgSm9pbiBUYWJsZSAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxKb2luVGFibGVfMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sSm9pblRhYmxlXzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9KT0lOX1RBQkxFXzIyID0gZUlOU1RBTkNFLmdldFhtbEpvaW5UYWJsZV8yXzIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNyZWF0aW9uIFN1ZmZpeDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0pPSU5fVEFCTEVfMjJfX0NSRUFUSU9OX1NVRkZJWCA9IGVJTlNUQU5DRS5nZXRYbWxKb2luVGFibGVfMl8yX0NyZWF0aW9uU3VmZml4KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzIgPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzcyAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIyID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsIENyaXRlcmlhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjJfX0FERElUSU9OQUxfQ1JJVEVSSUEgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzJfQWRkaXRpb25hbENyaXRlcmlhKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sU2Vjb25kYXJ5VGFibGVfMl8yIDxlbT5YbWwgU2Vjb25kYXJ5IFRhYmxlIDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFNlY29uZGFyeVRhYmxlXzJfMgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFNlY29uZGFyeVRhYmxlXzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9TRUNPTkRBUllfVEFCTEVfMjIgPSBlSU5TVEFOQ0UuZ2V0WG1sU2Vjb25kYXJ5VGFibGVfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DcmVhdGlvbiBTdWZmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9TRUNPTkRBUllfVEFCTEVfMjJfX0NSRUFUSU9OX1NVRkZJWCA9IGVJTlNUQU5DRS5nZXRYbWxTZWNvbmRhcnlUYWJsZV8yXzJfQ3JlYXRpb25TdWZmaXgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxUYWJsZV8yXzIgPGVtPlhtbCBUYWJsZSAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxUYWJsZV8yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxUYWJsZV8yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVEFCTEVfMjIgPSBlSU5TVEFOQ0UuZ2V0WG1sVGFibGVfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DcmVhdGlvbiBTdWZmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9UQUJMRV8yMl9fQ1JFQVRJT05fU1VGRklYID0gZUlOU1RBTkNFLmdldFhtbFRhYmxlXzJfMl9DcmVhdGlvblN1ZmZpeCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlR2VuZXJhdG9yXzJfMiA8ZW0+WG1sIFRhYmxlIEdlbmVyYXRvciAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxUYWJsZUdlbmVyYXRvcl8yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxUYWJsZUdlbmVyYXRvcl8yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVEFCTEVfR0VORVJBVE9SXzIyID0gZUlOU1RBTkNFLmdldFhtbFRhYmxlR2VuZXJhdG9yXzJfMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q3JlYXRpb24gU3VmZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVEFCTEVfR0VORVJBVE9SXzIyX19DUkVBVElPTl9TVUZGSVggPSBlSU5TVEFOQ0UuZ2V0WG1sVGFibGVHZW5lcmF0b3JfMl8yX0NyZWF0aW9uU3VmZml4KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIDxlbT5YbWwgVW5pb24gUGFydGl0aW9uaW5nIDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9VTklPTl9QQVJUSVRJT05JTkdfMjIgPSBlSU5TVEFOQ0UuZ2V0WG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVU5JT05fUEFSVElUSU9OSU5HXzIyX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMl9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIDxlbT5YbWwgVmFsdWUgUGFydGl0aW9uaW5nIDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9WQUxVRV9QQVJUSVRJT05JTkdfMjIgPSBlSU5TVEFOQ0UuZ2V0WG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVkFMVUVfUEFSVElUSU9OSU5HXzIyX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMl9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmFyaWFibGVPbmVUb09uZV8yXzIgPGVtPlhtbCBWYXJpYWJsZSBPbmUgVG8gT25lIDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhcmlhYmxlT25lVG9PbmVfMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sVmFyaWFibGVPbmVUb09uZV8yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV8yMiA9IGVJTlNUQU5DRS5nZXRYbWxWYXJpYWJsZU9uZVRvT25lXzJfMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Tm9uIENhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfMjJfX05PTl9DQUNIRUFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sVmFyaWFibGVPbmVUb09uZV8yXzJfTm9uQ2FjaGVhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmVyc2lvbl8yXzIgPGVtPlhtbCBWZXJzaW9uIDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZlcnNpb25fMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sVmVyc2lvbl8yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVkVSU0lPTl8yMiA9IGVJTlNUQU5DRS5nZXRYbWxWZXJzaW9uXzJfMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5kZXg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9WRVJTSU9OXzIyX19JTkRFWCA9IGVJTlNUQU5DRS5nZXRYbWxWZXJzaW9uXzJfMl9JbmRleCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkNhY2hlSXNvbGF0aW9uVHlwZSA8ZW0+Q2FjaGUgSXNvbGF0aW9uIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5DYWNoZUlzb2xhdGlvblR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRDYWNoZUlzb2xhdGlvblR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIENBQ0hFX0lTT0xBVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldENhY2hlSXNvbGF0aW9uVHlwZSgpOwotCi0JfQotCi19IC8vRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjEzMWYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQWRkaXRpb25hbCBDcml0ZXJpYSAyMjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIjZ2V0Q3JpdGVyaWEgPGVtPkNyaXRlcmlhPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyaXRlcmlhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Dcml0ZXJpYTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Dcml0ZXJpYTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3JpdGVyaWEoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMl9Dcml0ZXJpYSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q3JpdGVyaWEoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yI2dldENyaXRlcmlhIDxlbT5Dcml0ZXJpYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3JpdGVyaWE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENyaXRlcmlhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDcml0ZXJpYShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEJhc2ljQ29sbGVjdGlvbl8yXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEJhc2ljQ29sbGVjdGlvbl8yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4Zjk5ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxCYXNpY0NvbGxlY3Rpb25fMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEJhc2ljIENvbGxlY3Rpb24gMjI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY0NvbGxlY3Rpb25fMl8yI2dldENhc2NhZGVPbkRlbGV0ZSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEJhc2ljQ29sbGVjdGlvbl8yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEJhc2ljQ29sbGVjdGlvbl8yXzIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlT25EZWxldGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEJhc2ljQ29sbGVjdGlvbl8yXzJfQ2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldENhc2NhZGVPbkRlbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljQ29sbGVjdGlvbl8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhc2NhZGVPbkRlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4gdmFsdWUpOwotCi19IC8vIFhtbEJhc2ljQ29sbGVjdGlvbl8yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEJhc2ljTWFwXzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sQmFzaWNNYXBfMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmY2NjOTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sQmFzaWNNYXBfMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEJhc2ljIE1hcCAyMjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljTWFwXzJfMiNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxCYXNpY01hcF8yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEJhc2ljTWFwXzJfMiBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlIE9uIERlbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhc2NhZGVPbkRlbGV0ZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sQmFzaWNNYXBfMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRDYXNjYWRlT25EZWxldGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY01hcF8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhc2NhZGVPbkRlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4gdmFsdWUpOwotCi19IC8vIFhtbEJhc2ljTWFwXzJfMgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sQmFzaWNfMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxCYXNpY18yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmViMmUyOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxCYXNpY18yXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQmFzaWMgMjI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY18yXzIjZ2V0SW5kZXggPGVtPkluZGV4PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxCYXNpY18yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEJhc2ljXzJfMiBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEluZGV4KFhtbEluZGV4XzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEJhc2ljXzJfMl9JbmRleCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxJbmRleF8yXzIgZ2V0SW5kZXgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY18yXzIjZ2V0SW5kZXggPGVtPkluZGV4PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEluZGV4KFhtbEluZGV4XzJfMiB2YWx1ZSk7Ci0KLX0gLy8gWG1sQmFzaWNfMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxDYWNoZV8yXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbENhY2hlXzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTFhN2M5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbENhY2hlXzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDYWNoZTIgMjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQ2FjaGVfMl8yI2dldElzb2xhdGlvbiA8ZW0+SXNvbGF0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxDYWNoZV8yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbENhY2hlXzJfMiBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Jc29sYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkNhY2hlSXNvbGF0aW9uVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Jc29sYXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXNvbGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5DYWNoZUlzb2xhdGlvblR5cGUKLQkgKiBAc2VlICNzZXRJc29sYXRpb24oQ2FjaGVJc29sYXRpb25UeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sQ2FjaGVfMl8yX0lzb2xhdGlvbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ2FjaGVJc29sYXRpb25UeXBlIGdldElzb2xhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbENhY2hlXzJfMiNnZXRJc29sYXRpb24gPGVtPklzb2xhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXNvbGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5DYWNoZUlzb2xhdGlvblR5cGUKLQkgKiBAc2VlICNnZXRJc29sYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzb2xhdGlvbihDYWNoZUlzb2xhdGlvblR5cGUgdmFsdWUpOwotCi19IC8vIFhtbENhY2hlMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxDb2xsZWN0aW9uVGFibGVfMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxDb2xsZWN0aW9uVGFibGVfMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZGFiMDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sQ29sbGVjdGlvblRhYmxlXzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDb2xsZWN0aW9uIFRhYmxlIDIyPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQ29sbGVjdGlvblRhYmxlXzJfMiNnZXRDcmVhdGlvblN1ZmZpeCA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uVGFibGVfMl8yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxDb2xsZWN0aW9uVGFibGVfMl8yIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyZWF0aW9uIFN1ZmZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3JlYXRpb25TdWZmaXgoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sQ29sbGVjdGlvblRhYmxlXzJfMl9DcmVhdGlvblN1ZmZpeCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q3JlYXRpb25TdWZmaXgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxDb2xsZWN0aW9uVGFibGVfMl8yI2dldENyZWF0aW9uU3VmZml4IDxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3JlYXRpb25TdWZmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyZWF0aW9uU3VmZml4KFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sQ29sbGVjdGlvblRhYmxlXzJfMgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJlZDhlOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMiNpc05vbmNhY2hlYWJsZSA8ZW0+Tm9uY2FjaGVhYmxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMiBleHRlbmRzIFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMgotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzJfQ2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldENhc2NhZGVPbkRlbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMiNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYXNjYWRlT25EZWxldGUoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob25jYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5vbmNhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob25jYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vbmNhY2hlYWJsZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8yX05vbmNhY2hlYWJsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc05vbmNhY2hlYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMiNpc05vbmNhY2hlYWJsZSA8ZW0+Tm9uY2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob25jYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzTm9uY2FjaGVhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROb25jYWNoZWFibGUoYm9vbGVhbiB2YWx1ZSk7Ci0KLX0gLy8gWG1sRWxlbWVudENvbGxlY3Rpb25fMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxFbWJlZGRhYmxlXzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sRW1iZWRkYWJsZV8yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgzNjUzYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxFbWJlZGRhYmxlXzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEVtYmVkZGFibGUgMjI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEVtYmVkZGFibGVfMl8yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbWJlZGRhYmxlXzJfMiBleHRlbmRzIFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyCi17Ci0KLX0gLy8gWG1sRW1iZWRkYWJsZV8yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEVudGl0eU1hcHBpbmdzXzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sRW50aXR5TWFwcGluZ3NfMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMzAzYjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sRW50aXR5TWFwcGluZ3NfMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbnRpdHkgTWFwcGluZ3MgMjI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlNYXBwaW5nc18yXzIjZ2V0UGFydGl0aW9uaW5nIDxlbT5QYXJ0aXRpb25pbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlNYXBwaW5nc18yXzIjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eU1hcHBpbmdzXzJfMiNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nIDxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlNYXBwaW5nc18yXzIjZ2V0UGlubmVkUGFydGl0aW9uaW5nIDxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yI2dldFJhbmdlUGFydGl0aW9uaW5nIDxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlNYXBwaW5nc18yXzIjZ2V0VmFsdWVQYXJ0aXRpb25pbmcgPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eU1hcHBpbmdzXzJfMiNnZXRIYXNoUGFydGl0aW9uaW5nIDxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eU1hcHBpbmdzXzJfMiNnZXRVbmlvblBhcnRpdGlvbmluZyA8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVudGl0eU1hcHBpbmdzXzJfMiBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nXzJfMn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbFBhcnRpdGlvbmluZ18yXzI+IGdldFBhcnRpdGlvbmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yPiBnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9Sb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yPiBnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzI+IGdldFBpbm5lZFBhcnRpdGlvbmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yPiBnZXRSYW5nZVBhcnRpdGlvbmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfVmFsdWVQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yPiBnZXRWYWx1ZVBhcnRpdGlvbmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSGFzaFBhcnRpdGlvbmluZ18yXzJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9IYXNoUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yPiBnZXRIYXNoUGFydGl0aW9uaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9VbmlvblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxVbmlvblBhcnRpdGlvbmluZ18yXzI+IGdldFVuaW9uUGFydGl0aW9uaW5nKCk7Ci0KLX0gLy8gWG1sRW50aXR5TWFwcGluZ3NfMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxFbnRpdHlfMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxFbnRpdHlfMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMjcwNjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sRW50aXR5XzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbnRpdHkgMjI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlfMl8yI2dldEFkZGl0aW9uYWxDcml0ZXJpYSA8ZW0+QWRkaXRpb25hbCBDcml0ZXJpYTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eV8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eV8yXzIjZ2V0SW5kZXggPGVtPkluZGV4PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbnRpdHlfMl8yIGV4dGVuZHMgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlT25EZWxldGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEVudGl0eV8yXzJfQ2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldENhc2NhZGVPbkRlbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eV8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhc2NhZGVPbkRlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5kZXg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluZGV4PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluZGV4PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJbmRleChYbWxJbmRleF8yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8yX0luZGV4KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbEluZGV4XzJfMiBnZXRJbmRleCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eV8yXzIjZ2V0SW5kZXggPGVtPkluZGV4PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEluZGV4KFhtbEluZGV4XzJfMiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsIENyaXRlcmlhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsIENyaXRlcmlhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFkZGl0aW9uYWxDcml0ZXJpYShYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sRW50aXR5XzJfMl9BZGRpdGlvbmFsQ3JpdGVyaWEoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMiBnZXRBZGRpdGlvbmFsQ3JpdGVyaWEoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlfMl8yI2dldEFkZGl0aW9uYWxDcml0ZXJpYSA8ZW0+QWRkaXRpb25hbCBDcml0ZXJpYTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWRkaXRpb25hbCBDcml0ZXJpYTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWRkaXRpb25hbENyaXRlcmlhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBZGRpdGlvbmFsQ3JpdGVyaWEoWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMiB2YWx1ZSk7Ci0KLX0gLy8gWG1sRW50aXR5XzJfMgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEhhc2hQYXJ0aXRpb25pbmdfMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NTM1MjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgSGFzaCBQYXJ0aXRpb25pbmcgMjI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxIYXNoUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxIYXNoUGFydGl0aW9uaW5nXzJfMigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxIYXNoUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbElkXzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sSWRfMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZTJiNzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sSWRfMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFhtbElkXzJfMi5qYXZhLHYgMS4xIDIwMTEvMDIvMDYgMDI6MTM6MDAga21vb3JlIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgSWQgMjI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbElkXzJfMiNnZXRJbmRleCA8ZW0+SW5kZXg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbElkXzJfMigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sSWRfMl8yIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SW5kZXgoWG1sSW5kZXhfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sSWRfMl8yX0luZGV4KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbEluZGV4XzJfMiBnZXRJbmRleCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbElkXzJfMiNnZXRJbmRleCA8ZW0+SW5kZXg8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluZGV4PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5kZXgoWG1sSW5kZXhfMl8yIHZhbHVlKTsKLQotfSAvLyBYbWxJZF8yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEluZGV4XzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sSW5kZXhfMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZDI1OTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sSW5kZXhfMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgSW5kZXggMjI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEluZGV4XzJfMiNnZXRTY2hlbWEgPGVtPlNjaGVtYTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEluZGV4XzJfMiNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yI2dldFRhYmxlIDxlbT5UYWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEluZGV4XzJfMiNnZXRVbmlxdWUgPGVtPlVuaXF1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEluZGV4XzJfMiNnZXRDb2x1bW5OYW1lcyA8ZW0+Q29sdW1uIE5hbWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxJbmRleF8yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEluZGV4XzJfMiBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sSW5kZXhfMl8yX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTY2hlbWEoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sSW5kZXhfMl8yX1NjaGVtYSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2NoZW1hKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNjaGVtYSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NoZW1hKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXRhbG9nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhdGFsb2coU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sSW5kZXhfMl8yX0NhdGFsb2coKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENhdGFsb2coKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzIjZ2V0Q2F0YWxvZyA8ZW0+Q2F0YWxvZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0YWxvZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2F0YWxvZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYWJsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxJbmRleF8yXzJfVGFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFRhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yI2dldFRhYmxlIDxlbT5UYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUYWJsZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmlxdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5pcXVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVbmlxdWUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEluZGV4XzJfMl9VbmlxdWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0VW5pcXVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yI2dldFVuaXF1ZSA8ZW0+VW5pcXVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlxdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVuaXF1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VW5pcXVlKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29sdW1uIE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db2x1bW4gTmFtZXM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW4gTmFtZXM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxJbmRleF8yXzJfQ29sdW1uTmFtZXMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRDb2x1bW5OYW1lcygpOwotCi19IC8vIFhtbEluZGV4XzJfMgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sSm9pblRhYmxlXzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sSm9pblRhYmxlXzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2RiOTY1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEpvaW5UYWJsZV8yXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgSm9pbiBUYWJsZSAyMjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEpvaW5UYWJsZV8yXzIjZ2V0Q3JlYXRpb25TdWZmaXggPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sSm9pblRhYmxlXzJfMigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sSm9pblRhYmxlXzJfMiBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DcmVhdGlvbiBTdWZmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyZWF0aW9uU3VmZml4KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEpvaW5UYWJsZV8yXzJfQ3JlYXRpb25TdWZmaXgoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENyZWF0aW9uU3VmZml4KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSm9pblRhYmxlXzJfMiNnZXRDcmVhdGlvblN1ZmZpeCA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENyZWF0aW9uU3VmZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDcmVhdGlvblN1ZmZpeChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbEpvaW5UYWJsZV8yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbE1hbnlUb01hbnlfMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxNYW55VG9NYW55XzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjhjMGRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbE1hbnlUb01hbnlfMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTWFueSBUbyBNYW55IDIyPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sTWFueVRvTWFueV8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb01hbnlfMl8yI2lzTm9uQ2FjaGVhYmxlIDxlbT5Ob24gQ2FjaGVhYmxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxNYW55VG9NYW55XzJfMigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sTWFueVRvTWFueV8yXzIgZXh0ZW5kcyBYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlIE9uIERlbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhc2NhZGVPbkRlbGV0ZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzJfQ2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldENhc2NhZGVPbkRlbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb01hbnlfMl8yI2dldENhc2NhZGVPbkRlbGV0ZSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhc2NhZGVPbkRlbGV0ZShCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vbiBDYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm9uQ2FjaGVhYmxlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxNYW55VG9NYW55XzJfMl9Ob25DYWNoZWFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNOb25DYWNoZWFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYW55VG9NYW55XzJfMiNpc05vbkNhY2hlYWJsZSA8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNOb25DYWNoZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5vbkNhY2hlYWJsZShib29sZWFuIHZhbHVlKTsKLQotfSAvLyBYbWxNYW55VG9NYW55XzJfMgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sTWFueVRvT25lXzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sTWFueVRvT25lXzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWVkNmI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbE1hbnlUb09uZV8yXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNYW55IFRvIE9uZSAyMjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb09uZV8yXzIjaXNOb25DYWNoZWFibGUgPGVtPk5vbiBDYWNoZWFibGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbE1hbnlUb09uZV8yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE1hbnlUb09uZV8yXzIgZXh0ZW5kcyBYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob24gQ2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vbkNhY2hlYWJsZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sTWFueVRvT25lXzJfMl9Ob25DYWNoZWFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNOb25DYWNoZWFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYW55VG9PbmVfMl8yI2lzTm9uQ2FjaGVhYmxlIDxlbT5Ob24gQ2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc05vbkNhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Tm9uQ2FjaGVhYmxlKGJvb2xlYW4gdmFsdWUpOwotCi19IC8vIFhtbE1hbnlUb09uZV8yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbE1hcHBlZFN1cGVyY2xhc3NfMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ5YWE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbE1hcHBlZFN1cGVyY2xhc3NfMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMjI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMiNnZXRBZGRpdGlvbmFsQ3JpdGVyaWEgPGVtPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMiBleHRlbmRzIFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMgotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkaXRpb25hbCBDcml0ZXJpYTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWRkaXRpb25hbENyaXRlcmlhKFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMl9BZGRpdGlvbmFsQ3JpdGVyaWEoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMiBnZXRBZGRpdGlvbmFsQ3JpdGVyaWEoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMiNnZXRBZGRpdGlvbmFsQ3JpdGVyaWEgPGVtPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFkZGl0aW9uYWxDcml0ZXJpYSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWRkaXRpb25hbENyaXRlcmlhKFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIgdmFsdWUpOwotCi19IC8vIFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxPbmVUb01hbnlfMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxPbmVUb01hbnlfMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MDdlZjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sT25lVG9NYW55XzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE9uZSBUbyBNYW55IDIyPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9NYW55XzJfMiNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9NYW55XzJfMiNpc05vbmNhY2hlYWJsZSA8ZW0+Tm9uY2FjaGVhYmxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxPbmVUb01hbnlfMl8yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxPbmVUb01hbnlfMl8yIGV4dGVuZHMgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlT25EZWxldGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbE9uZVRvTWFueV8yXzJfQ2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldENhc2NhZGVPbkRlbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvTWFueV8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhc2NhZGVPbkRlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm9uY2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ob25jYWNoZWFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm9uY2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROb25jYWNoZWFibGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbE9uZVRvTWFueV8yXzJfTm9uY2FjaGVhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTm9uY2FjaGVhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9NYW55XzJfMiNpc05vbmNhY2hlYWJsZSA8ZW0+Tm9uY2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob25jYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzTm9uY2FjaGVhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROb25jYWNoZWFibGUoYm9vbGVhbiB2YWx1ZSk7Ci0KLX0gLy8gWG1sT25lVG9NYW55XzJfMgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sT25lVG9PbmVfMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxPbmVUb09uZV8yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M3NDVhOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxPbmVUb09uZV8yXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBPbmUgVG8gT25lIDIyPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9PbmVfMl8yI2dldENhc2NhZGVPbkRlbGV0ZSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxPbmVUb09uZV8yXzIjaXNOb25DYWNoZWFibGUgPGVtPk5vbiBDYWNoZWFibGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbE9uZVRvT25lXzJfMigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sT25lVG9PbmVfMl8yIGV4dGVuZHMgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlT25EZWxldGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbE9uZVRvT25lXzJfMl9DYXNjYWRlT25EZWxldGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0Q2FzY2FkZU9uRGVsZXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9PbmVfMl8yI2dldENhc2NhZGVPbkRlbGV0ZSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhc2NhZGVPbkRlbGV0ZShCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vbiBDYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm9uQ2FjaGVhYmxlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxPbmVUb09uZV8yXzJfTm9uQ2FjaGVhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTm9uQ2FjaGVhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9PbmVfMl8yI2lzTm9uQ2FjaGVhYmxlIDxlbT5Ob24gQ2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc05vbkNhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Tm9uQ2FjaGVhYmxlKGJvb2xlYW4gdmFsdWUpOwotCi19IC8vIFhtbE9uZVRvT25lXzJfMgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBkYmQzOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFBhcnRpdGlvbmluZyBHcm91cDIgMjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRQYXJ0aXRpb25pbmcgPGVtPlBhcnRpdGlvbmluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyA8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRQaW5uZWRQYXJ0aXRpb25pbmcgPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcgPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRWYWx1ZVBhcnRpdGlvbmluZyA8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yI2dldEhhc2hQYXJ0aXRpb25pbmcgPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yI2dldFVuaW9uUGFydGl0aW9uaW5nIDxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0UGFydGl0aW9uZWQgPGVtPlBhcnRpdGlvbmVkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBhcnRpdGlvbmluZyhYbWxQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxQYXJ0aXRpb25pbmdfMl8yIGdldFBhcnRpdGlvbmluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRQYXJ0aXRpb25pbmcgPGVtPlBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcnRpdGlvbmluZyhYbWxQYXJ0aXRpb25pbmdfMl8yIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiBnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyA8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nIDxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBpbm5lZFBhcnRpdGlvbmluZyhYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1Bpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIGdldFBpbm5lZFBhcnRpdGlvbmluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRQaW5uZWRQYXJ0aXRpb25pbmcgPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGlubmVkUGFydGl0aW9uaW5nKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSYW5nZVBhcnRpdGlvbmluZyhYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIGdldFJhbmdlUGFydGl0aW9uaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yI2dldFJhbmdlUGFydGl0aW9uaW5nIDxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJhbmdlUGFydGl0aW9uaW5nKFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9WYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0VmFsdWVQYXJ0aXRpb25pbmcgPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWVQYXJ0aXRpb25pbmcoWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhc2ggUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SGFzaFBhcnRpdGlvbmluZyhYbWxIYXNoUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9IYXNoUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIGdldEhhc2hQYXJ0aXRpb25pbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0SGFzaFBhcnRpdGlvbmluZyA8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRIYXNoUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIYXNoUGFydGl0aW9uaW5nKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuaW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VW5pb25QYXJ0aXRpb25pbmcoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1VuaW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiBnZXRVbmlvblBhcnRpdGlvbmluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRVbmlvblBhcnRpdGlvbmluZyA8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFVuaW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVbmlvblBhcnRpdGlvbmluZyhYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFydGl0aW9uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJ0aXRpb25lZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGFydGl0aW9uZWQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBhcnRpdGlvbmVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yI2dldFBhcnRpdGlvbmVkIDxlbT5QYXJ0aXRpb25lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQYXJ0aXRpb25lZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbFBhcnRpdGlvbmluZ0dyb3VwMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxQYXJ0aXRpb25pbmdfMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxQYXJ0aXRpb25pbmdfMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMTgyNmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sUGFydGl0aW9uaW5nXzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQYXJ0aXRpb25pbmcgMjI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdfMl8yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ18yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFBhcnRpdGlvbmluZ18yXzIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ18yXzJfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ18yXzIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbFBhcnRpdGlvbmluZ18yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmMGQwMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFBpbm5lZCBQYXJ0aXRpb25pbmcgMjI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzJfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFJhbmdlUGFydGl0aW9uaW5nXzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNmE5MzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFJhbmdlIFBhcnRpdGlvbmluZyAyMjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM2ZGQyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUmVwbGljYXRpb24gUGFydGl0aW9uaW5nIDIyPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzJfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyYmIwZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBSb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmcgMjI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFNlY29uZGFyeVRhYmxlXzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sU2Vjb25kYXJ5VGFibGVfMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MGU4MmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sU2Vjb25kYXJ5VGFibGVfMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFNlY29uZGFyeSBUYWJsZSAyMjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFNlY29uZGFyeVRhYmxlXzJfMiNnZXRDcmVhdGlvblN1ZmZpeCA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxTZWNvbmRhcnlUYWJsZV8yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFNlY29uZGFyeVRhYmxlXzJfMiBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DcmVhdGlvbiBTdWZmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyZWF0aW9uU3VmZml4KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFNlY29uZGFyeVRhYmxlXzJfMl9DcmVhdGlvblN1ZmZpeCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q3JlYXRpb25TdWZmaXgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxTZWNvbmRhcnlUYWJsZV8yXzIjZ2V0Q3JlYXRpb25TdWZmaXggPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3JlYXRpb25TdWZmaXgoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBYbWxTZWNvbmRhcnlUYWJsZV8yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFRhYmxlR2VuZXJhdG9yXzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sVGFibGVHZW5lcmF0b3JfMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZGU1NTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sVGFibGVHZW5lcmF0b3JfMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFRhYmxlIEdlbmVyYXRvciAyMjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlR2VuZXJhdG9yXzJfMiNnZXRDcmVhdGlvblN1ZmZpeCA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxUYWJsZUdlbmVyYXRvcl8yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFRhYmxlR2VuZXJhdG9yXzJfMiBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DcmVhdGlvbiBTdWZmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyZWF0aW9uU3VmZml4KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFRhYmxlR2VuZXJhdG9yXzJfMl9DcmVhdGlvblN1ZmZpeCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q3JlYXRpb25TdWZmaXgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxUYWJsZUdlbmVyYXRvcl8yXzIjZ2V0Q3JlYXRpb25TdWZmaXggPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3JlYXRpb25TdWZmaXgoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBYbWxUYWJsZUdlbmVyYXRvcl8yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFRhYmxlXzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sVGFibGVfMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNjIwMTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sVGFibGVfMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFRhYmxlIDIyPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVGFibGVfMl8yI2dldENyZWF0aW9uU3VmZml4IDxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFRhYmxlXzJfMigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sVGFibGVfMl8yIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyZWF0aW9uIFN1ZmZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3JlYXRpb25TdWZmaXgoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sVGFibGVfMl8yX0NyZWF0aW9uU3VmZml4KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDcmVhdGlvblN1ZmZpeCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlXzJfMiNnZXRDcmVhdGlvblN1ZmZpeCA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENyZWF0aW9uU3VmZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDcmVhdGlvblN1ZmZpeChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbFRhYmxlXzJfMgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxVbmlvblBhcnRpdGlvbmluZ18yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM5MjYwNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxVbmlvblBhcnRpdGlvbmluZ18yXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgVW5pb24gUGFydGl0aW9uaW5nIDIyPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxVbmlvblBhcnRpdGlvbmluZ18yXzJfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFZhbHVlUGFydGl0aW9uaW5nXzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODcxODY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFZhbHVlUGFydGl0aW9uaW5nXzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBWYWx1ZSBQYXJ0aXRpb25pbmcgMjI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMl9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFZhcmlhYmxlT25lVG9PbmVfMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxWYXJpYWJsZU9uZVRvT25lXzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTEwOTkxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFZhcmlhYmxlT25lVG9PbmVfMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgVmFyaWFibGUgT25lIFRvIE9uZSAyMjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhcmlhYmxlT25lVG9PbmVfMl8yI2lzTm9uQ2FjaGVhYmxlIDxlbT5Ob24gQ2FjaGVhYmxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxWYXJpYWJsZU9uZVRvT25lXzJfMigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sVmFyaWFibGVPbmVUb09uZV8yXzIgZXh0ZW5kcyBYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob24gQ2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vbkNhY2hlYWJsZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sVmFyaWFibGVPbmVUb09uZV8yXzJfTm9uQ2FjaGVhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTm9uQ2FjaGVhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmFyaWFibGVPbmVUb09uZV8yXzIjaXNOb25DYWNoZWFibGUgPGVtPk5vbiBDYWNoZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzTm9uQ2FjaGVhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROb25DYWNoZWFibGUoYm9vbGVhbiB2YWx1ZSk7Ci0KLX0gLy8gWG1sVmFyaWFibGVPbmVUb09uZV8yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFZlcnNpb25fMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxWZXJzaW9uXzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjkyNTIwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFZlcnNpb25fMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFZlcnNpb24gMjI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWZXJzaW9uXzJfMiNnZXRJbmRleCA8ZW0+SW5kZXg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFZlcnNpb25fMl8yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxWZXJzaW9uXzJfMiBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEluZGV4KFhtbEluZGV4XzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFZlcnNpb25fMl8yX0luZGV4KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbEluZGV4XzJfMiBnZXRJbmRleCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZlcnNpb25fMl8yI2dldEluZGV4IDxlbT5JbmRleDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbmRleChYbWxJbmRleF8yXzIgdmFsdWUpOwotCi19IC8vIFhtbFZlcnNpb25fMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMy9FY2xpcHNlTGluazJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzMvRWNsaXBzZUxpbmsyXzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0ODg5Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMy9FY2xpcHNlTGluazJfMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGluazJfMjsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmsyXzMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8yCi17Ci0JU3RyaW5nIFNDSEVNQV9OQU1FU1BBQ0UgPSBFY2xpcHNlTGluay5TQ0hFTUFfTkFNRVNQQUNFOwotCVN0cmluZyBTQ0hFTUFfTE9DQVRJT04gPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX29ybV8yXzMueHNkIjsKLQlTdHJpbmcgU0NIRU1BX1ZFUlNJT04JPSAiMi4zIjsKLQotCS8vIEVjbGlwc2VMaW5rIDIuMyBzcGVjaWZpYyBub2RlcwotCVN0cmluZyBBUlJBWSA9ICJhcnJheSI7Ci0JCVN0cmluZyBBUlJBWV9fREFUQUJBU0VfVFlQRSA9ICJkYXRhYmFzZS10eXBlIjsKLQkJU3RyaW5nIEFSUkFZX19UQVJHRVRfQ0xBU1MgPSAidGFyZ2V0LWNsYXNzIjsKLQkJU3RyaW5nIEFSUkFZX19BVFRSSUJVVEVfVFlQRSA9ICJhdHRyaWJ1dGUtdHlwZSI7Ci0KLQlTdHJpbmcgQ09NUE9TSVRFX01FTUJFUiA9ICJjb21wb3NpdGUtbWVtYmVyIjsKLQotCVN0cmluZyBNVUxUSVRFTkFOVCA9ICJtdWx0aXRlbmFudCI7Ci0JCVN0cmluZyBNVUxUSVRFTkFOVF9fVFlQRSA9ICJ0eXBlIjsKLQlTdHJpbmcgTVVMVElURU5BTlRfVFlQRSA9ICJtdWx0aWx0ZW5hbnQtdHlwZSI7Ci0KLQlTdHJpbmcgTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJZID0gIm5hbWVkLXN0b3JlZC1mdW5jdGlvbi1xdWVyeSI7Ci0JCVN0cmluZyBOQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUllfX05BTUUgPSAibm5hbWUiOwotCVN0cmluZyBOQU1FRF9QTFNRTF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZID0gIm5hbWVkLXBsc3FsLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiOwotCQlTdHJpbmcgTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRSA9ICJuYW1lIjsKLQlTdHJpbmcgTkFNRURfUExTUUxfU1RPUkVEX0ZVTkNUSU9OX1FVRVJZID0gIm5hbWVkLXBsc3FsLXN0b3JlZC1mdW5jdGlvbi1xdWVyeSI7Ci0JCVN0cmluZyBOQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUllfX05BTUUgPSAibmFtZSI7Ci0JU3RyaW5nIFBMU1FMX1JFQ09SRCA9ICJwbHNxbC1yZWNvcmQiOwotCQlTdHJpbmcgUExTUUxfUkVDT1JEX19OQU1FID0gIm5hbWUiOwotCVN0cmluZyBQTFNRTF9UQUJMRSA9ICJwbHNxbC10YWJsZSI7Ci0JCVN0cmluZyBQTFNRTF9UQUJMRV9fTkFNRSA9ICJuYW1lIjsKLQlTdHJpbmcgU1RSVUNUID0gInN0cnVjdCI7Ci0JCVN0cmluZyBTVFJVQ1RfX05BTUUgPSAibmFtZSI7Ci0JU3RyaW5nIFNUUlVDVFVSRSA9ICJzdHJ1Y3R1cmUiOwotCQlTdHJpbmcgU1RSVUNUVVJFX19BVFRSSUJVVEVfVFlQRSA9ICJhdHRyaWJ1dGUtdHlwZSI7Ci0KLQlTdHJpbmcgVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OID0gInRlbmFudC1kaXNjcmltaW5hdG9yLWNvbHVtbiI7Ci0JCVN0cmluZyBURU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0NPTlRFWFRfUFJPUEVSVFkgPSAiY29udGV4dC1wcm9wZXJ0eSI7Ci0JCVN0cmluZyBURU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX1BSSU1BUllfS0VZPSAicHJpbWFyeS1rZXkiOwotCQlTdHJpbmcgVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19UQUJMRSA9ICJ0YWJsZSI7Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL0VjbGlwc2VMaW5rT3JtVjJfM0ZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL0VjbGlwc2VMaW5rT3JtVjJfM0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTljYjFmNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMy9FY2xpcHNlTGlua09ybVYyXzNGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1WMl8zRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5SW1wbAotewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFY2xpcHNlTGlua09ybVYyXzNGYWN0b3J5IGVJTlNUQU5DRSA9IGluaXQoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtVjJfM0ZhY3RvcnkgaW5pdCgpCi0JewotCQl0cnkKLQkJewotCQkJRWNsaXBzZUxpbmtPcm1WMl8zRmFjdG9yeSB0aGVFY2xpcHNlTGlua09ybVYyXzNGYWN0b3J5ID0gKEVjbGlwc2VMaW5rT3JtVjJfM0ZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImpwdC5lY2xpcHNlbGluay5vcm0udjJfMy54bWkiKTsgCi0JCQlpZiAodGhlRWNsaXBzZUxpbmtPcm1WMl8zRmFjdG9yeSAhPSBudWxsKQotCQkJewotCQkJCXJldHVybiB0aGVFY2xpcHNlTGlua09ybVYyXzNGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQotCQl7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtVjJfM0ZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybVYyXzNGYWN0b3J5KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpCi0JewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLk1VTFRJVEVOQU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU11bHRpdGVuYW50VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLk1VTFRJVEVOQU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRNdWx0aXRlbmFudFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE11bHRpdGVuYW50VHlwZSBjcmVhdGVNdWx0aXRlbmFudFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlNdWx0aXRlbmFudFR5cGUgcmVzdWx0ID0gTXVsdGl0ZW5hbnRUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRNdWx0aXRlbmFudFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlIGdldEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UoKQotCXsKLQkJcmV0dXJuIChFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSBnZXRQYWNrYWdlKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9FY2xpcHNlTGlua09ybVYyXzNGYWN0b3J5CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMy9FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMy9FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YWM3YmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzMvRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM0ZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlSW1wbAotewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5BTUUgPSAidjJfMyI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOU19VUkkgPSAianB0LmVjbGlwc2VsaW5rLm9ybS52Ml8zLnhtaSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMyI7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbWJlZGRhYmxlXzJfMyA8ZW0+WG1sIEVtYmVkZGFibGUgMjM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW1iZWRkYWJsZV8yXzMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbEVtYmVkZGFibGVfMl8zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfMjMgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTXVsdGl0ZW5hbnRfMl8zIDxlbT5YbWwgTXVsdGl0ZW5hbnQgMjM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTXVsdGl0ZW5hbnRfMl8zCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxNdWx0aXRlbmFudF8yXzMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVMVElURU5BTlRfMjMgPSA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW50aXR5XzJfMyA8ZW0+WG1sIEVudGl0eSAyMzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbnRpdHlfMl8zCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yMyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMyA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbnRpdHlNYXBwaW5nc18yXzMgPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3MgMjM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW50aXR5TWFwcGluZ3NfMl8zCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTXzIzID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMyA8ZW0+WG1sIE5hbWVkIFBsc3FsIFN0b3JlZCBGdW5jdGlvbiBRdWVyeSAyMzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUllfMjMgPSA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfMyA8ZW0+WG1sIE5hbWVkIFBsc3FsIFN0b3JlZCBQcm9jZWR1cmUgUXVlcnkgMjM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfMwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9QTFNRTF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZXzIzID0gOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMgPGVtPlhtbCBOYW1lZCBTdG9yZWQgRnVuY3Rpb24gUXVlcnkgMjM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUllfMjMgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMyA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHMgMjM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8zCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU18yMyA9IDExOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sUGxzcWxSZWNvcmRfMl8zIDxlbT5YbWwgUGxzcWwgUmVjb3JkIDIzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFBsc3FsUmVjb3JkXzJfMwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sUGxzcWxSZWNvcmRfMl8zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BMU1FMX1JFQ09SRF8yMyA9IDEyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sUGxzcWxUYWJsZV8yXzMgPGVtPlhtbCBQbHNxbCBUYWJsZSAyMzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxQbHNxbFRhYmxlXzJfMwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sUGxzcWxUYWJsZV8yXzMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUExTUUxfVEFCTEVfMjMgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFN0cnVjdF8yXzMgPGVtPlhtbCBTdHJ1Y3QgMjM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sU3RydWN0XzJfMwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sU3RydWN0XzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TVFJVQ1RfMjMgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEF0dHJpYnV0ZXNfMl8zIDxlbT5YbWwgQXR0cmlidXRlcyAyMzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxBdHRyaWJ1dGVzXzJfMwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sQXR0cmlidXRlc18yXzMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFU18yMyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxTdHJ1Y3R1cmVfMl8zIDxlbT5YbWwgU3RydWN0dXJlIDIzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFN0cnVjdHVyZV8yXzMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbFN0cnVjdHVyZV8yXzMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1RSVUNUVVJFXzIzID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxBcnJheV8yXzMgPGVtPlhtbCBBcnJheSAyMzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxBcnJheV8yXzMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbEFycmF5XzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BUlJBWV8yMyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVJSQVlfMjNfX0NPTlZFUlRFUlMgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX0NPTlZFUlRFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BUlJBWV8yM19fVFlQRV9DT05WRVJURVJTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfQ09OVEFJTkVSX19UWVBFX0NPTlZFUlRFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVJSQVlfMjNfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlMgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FSUkFZXzIzX19TVFJVQ1RfQ09OVkVSVEVSUyA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9fU1RSVUNUX0NPTlZFUlRFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9iPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVJSQVlfMjNfX0xPQiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FSUkFZXzIzX19URU1QT1JBTCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVJSQVlfMjNfX0VOVU1FUkFURUQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVJSQVlfMjNfX0NPTFVNTiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhYmFzZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVJSQVlfMjNfX0RBVEFCQVNFX1RZUEUgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVJSQVlfMjNfX1RBUkdFVF9DTEFTUyA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQXJyYXkgMjM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVJSQVlfMjNfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3R1cmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVTXzIzX19TVFJVQ1RVUkVTID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BcnJheXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURVNfMjNfX0FSUkFZUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEF0dHJpYnV0ZXMgMjM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFU18yM19GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zIDxlbT5YbWwgVGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uIDIzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fMjMgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMyA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbXBvc2l0ZSBNZW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjNfX0NPTVBPU0lURV9NRU1CRVIgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIzX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsc3FsIFJlY29yZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfMjNfX1BMU1FMX1JFQ09SRFMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsc3FsIFRhYmxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV8yM19fUExTUUxfVEFCTEVTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFXzIzX19TVFJVQ1QgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbWJlZGRhYmxlIDIzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfMjNfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TXVsdGl0ZW5hbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjNfX01VTFRJVEVOQU5UID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NVUxUSVRFTkFOVF9IT0xERVJfX01VTFRJVEVOQU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjNfX05BTUVEX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NVUxUSVRFTkFOVF9IT0xERVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgUGxzcWwgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yM19fTkFNRURfUExTUUxfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVMgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VTFRJVEVOQU5UX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBQbHNxbCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yM19fTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NVUxUSVRFTkFOVF9IT0xERVJfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxzcWwgUmVjb3JkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIzX19QTFNRTF9SRUNPUkRTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NVUxUSVRFTkFOVF9IT0xERVJfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxzcWwgVGFibGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjNfX1BMU1FMX1RBQkxFUyA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTVVMVElURU5BTlRfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yM19fU1RSVUNUID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NVUxUSVRFTkFOVF9IT0xERVJfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVudGl0eSAyMzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjNfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTVVMVElURU5BTlRfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbmFudCBEaXNjcmltaW5hdG9yIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU18yM19fVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU18yM19fTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFBsc3FsIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfMjNfX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBQbHNxbCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU18yM19fTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbHNxbCBSZWNvcmRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfMjNfX1BMU1FMX1JFQ09SRFMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsc3FsIFRhYmxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTXzIzX19QTFNRTF9UQUJMRVMgPSA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3MgMjM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTXzIzX0ZFQVRVUkVfQ09VTlQgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk11bHRpdGVuYW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjNfX01VTFRJVEVOQU5UID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NVUxUSVRFTkFOVF9IT0xERVJfX01VTFRJVEVOQU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yM19fTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVMgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VTFRJVEVOQU5UX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBQbHNxbCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjNfX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NVUxUSVRFTkFOVF9IT0xERVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgUGxzcWwgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yM19fTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NVUxUSVRFTkFOVF9IT0xERVJfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxzcWwgUmVjb3JkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjNfX1BMU1FMX1JFQ09SRFMgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VTFRJVEVOQU5UX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbHNxbCBUYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIzX19QTFNRTF9UQUJMRVMgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VTFRJVEVOQU5UX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMjM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjNfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTVVMVElURU5BTlRfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NVUxUSVRFTkFOVF8yM19fVFlQRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVMVElURU5BTlRfMjNfX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlMgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNdWx0aXRlbmFudCAyMzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NVUxUSVRFTkFOVF8yM19GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfUExTUUxfU1RPUkVEX0ZVTkNUSU9OX1FVRVJZXzIzX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTmFtZWQgUGxzcWwgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJ5IDIzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSWV8yM19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV8yM19fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE5hbWVkIFBsc3FsIFN0b3JlZCBQcm9jZWR1cmUgUXVlcnkgMjM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV8yM19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJZXzIzX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTmFtZWQgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJ5IDIzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1NUT1JFRF9GVU5DVElPTl9RVUVSWV8yM19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW5hbnQgRGlzY3JpbWluYXRvciBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTXzIzX19URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0cyAyMzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTXzIzX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QTFNRTF9SRUNPUkRfMjNfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQbHNxbCBSZWNvcmQgMjM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUExTUUxfUkVDT1JEXzIzX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QTFNRTF9UQUJMRV8yM19fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFBsc3FsIFRhYmxlIDIzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BMU1FMX1RBQkxFXzIzX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TVFJVQ1RfMjNfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBTdHJ1Y3QgMjM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1RSVUNUXzIzX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbiBEZWZpbml0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OXzIzX19DT0xVTU5fREVGSU5JVElPTiA9IE9ybVBhY2thZ2UuWE1MX0JBU0VfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fMjNfX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl8yM19fRElTQ1JJTUlOQVRPUl9UWVBFID0gT3JtUGFja2FnZS5YTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTl9fRElTQ1JJTUlOQVRPUl9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxlbmd0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl8yM19fTEVOR1RIID0gT3JtUGFja2FnZS5YTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTl9fTEVOR1RIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRleHQgUHJvcGVydHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fMjNfX0NPTlRFWFRfUFJPUEVSVFkgPSBPcm1QYWNrYWdlLlhNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OXzIzX19UQUJMRSA9IE9ybVBhY2thZ2UuWE1MX0JBU0VfRElTQ1JJTUlOQVRPUl9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fMjNfX1BSSU1BUllfS0VZID0gT3JtUGFja2FnZS5YTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uIDIzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl8yM19GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgU3RydWN0dXJlIDIzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUUlVDVFVSRV8yM19GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLk11bHRpdGVuYW50VHlwZSA8ZW0+TXVsdGl0ZW5hbnQgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLk11bHRpdGVuYW50VHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0TXVsdGl0ZW5hbnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVVMVElURU5BTlRfVFlQRSA9IDE3OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRW1iZWRkYWJsZV8yXzNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTXVsdGl0ZW5hbnRfMl8zRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfM0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRW50aXR5XzJfM0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxNYXBwZWRTdXBlcmNsYXNzXzJfM0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbnRpdHlNYXBwaW5nc18yXzNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8zRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFBsc3FsUmVjb3JkXzJfM0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxQbHNxbFRhYmxlXzJfM0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxTdHJ1Y3RfMl8zRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEF0dHJpYnV0ZXNfMl8zRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFN0cnVjdHVyZV8yXzNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQXJyYXlfMl8zRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfM0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIG11bHRpdGVuYW50VHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlKCkKLQl7Ci0JCXN1cGVyKGVOU19VUkksIEVjbGlwc2VMaW5rT3JtVjJfM0ZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCi0JICogCi0JICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgotCSAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlIGluaXQoKQotCXsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCVhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlFY2xpcHNlTGlua09ybVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1QYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZnJlZXplKCk7Ci0KLSAgCi0JCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQotCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5lTlNfVVJJLCB0aGVFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlKTsKLQkJcmV0dXJuIHRoZUVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2U7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW1iZWRkYWJsZV8yXzMgPGVtPlhtbCBFbWJlZGRhYmxlIDIzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbWJlZGRhYmxlIDIzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVtYmVkZGFibGVfMl8zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW1iZWRkYWJsZV8yXzMoKQotCXsKLQkJcmV0dXJuIHhtbEVtYmVkZGFibGVfMl8zRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbWJlZGRhYmxlXzJfMyNnZXRQbHNxbFJlY29yZHMgPGVtPlBsc3FsIFJlY29yZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBsc3FsIFJlY29yZHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW1iZWRkYWJsZV8yXzMjZ2V0UGxzcWxSZWNvcmRzKCkKLQkgKiBAc2VlICNnZXRYbWxFbWJlZGRhYmxlXzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVtYmVkZGFibGVfMl8zX1Bsc3FsUmVjb3JkcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW1iZWRkYWJsZV8yXzNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW1iZWRkYWJsZV8yXzMjZ2V0UGxzcWxUYWJsZXMgPGVtPlBsc3FsIFRhYmxlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGxzcWwgVGFibGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVtYmVkZGFibGVfMl8zI2dldFBsc3FsVGFibGVzKCkKLQkgKiBAc2VlICNnZXRYbWxFbWJlZGRhYmxlXzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVtYmVkZGFibGVfMl8zX1Bsc3FsVGFibGVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbWJlZGRhYmxlXzJfM0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW1iZWRkYWJsZV8yXzMjZ2V0U3RydWN0IDxlbT5TdHJ1Y3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TdHJ1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW1iZWRkYWJsZV8yXzMjZ2V0U3RydWN0KCkKLQkgKiBAc2VlICNnZXRYbWxFbWJlZGRhYmxlXzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVtYmVkZGFibGVfMl8zX1N0cnVjdCgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW1iZWRkYWJsZV8yXzNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxNdWx0aXRlbmFudF8yXzMgPGVtPlhtbCBNdWx0aXRlbmFudCAyMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTXVsdGl0ZW5hbnQgMjM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTXVsdGl0ZW5hbnRfMl8zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTXVsdGl0ZW5hbnRfMl8zKCkKLQl7Ci0JCXJldHVybiB4bWxNdWx0aXRlbmFudF8yXzNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTXVsdGl0ZW5hbnRfMl8zI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE11bHRpdGVuYW50XzJfMyNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRYbWxNdWx0aXRlbmFudF8yXzMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxNdWx0aXRlbmFudF8yXzNfVHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sTXVsdGl0ZW5hbnRfMl8zRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE11bHRpdGVuYW50XzJfMyNnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA8ZW0+VGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxNdWx0aXRlbmFudF8yXzMjZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKQotCSAqIEBzZWUgI2dldFhtbE11bHRpdGVuYW50XzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE11bHRpdGVuYW50XzJfM19UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTXVsdGl0ZW5hbnRfMl8zRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zIDxlbT5YbWwgTmFtZWQgUGxzcWwgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJ5IDIzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBOYW1lZCBQbHNxbCBTdG9yZWQgRnVuY3Rpb24gUXVlcnkgMjM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zKCkKLQl7Ci0JCXJldHVybiB4bWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzNFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfM19OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zIDxlbT5YbWwgTmFtZWQgUGxzcWwgU3RvcmVkIFByb2NlZHVyZSBRdWVyeSAyMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTmFtZWQgUGxzcWwgU3RvcmVkIFByb2NlZHVyZSBRdWVyeSAyMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfMygpCi0JewotCQlyZXR1cm4geG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfM0VDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzMjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfMyNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfM19OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMyA8ZW0+WG1sIE5hbWVkIFN0b3JlZCBGdW5jdGlvbiBRdWVyeSAyMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTmFtZWQgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJ5IDIzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zKCkKLQl7Ci0JCXJldHVybiB4bWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMyNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zX05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbnRpdHlfMl8zIDxlbT5YbWwgRW50aXR5IDIzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbnRpdHkgMjM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW50aXR5XzJfMwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVudGl0eV8yXzMoKQotCXsKLQkJcmV0dXJuIHhtbEVudGl0eV8yXzNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbnRpdHlfMl8zI2dldE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyaWVzIDxlbT5OYW1lZCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TmFtZWQgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW50aXR5XzJfMyNnZXROYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5XzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV8yXzNfTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eV8yXzNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW50aXR5XzJfMyNnZXROYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzIDxlbT5OYW1lZCBQbHNxbCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TmFtZWQgUGxzcWwgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW50aXR5XzJfMyNnZXROYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlfMl8zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5XzJfM19OYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlfMl8zRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVudGl0eV8yXzMjZ2V0TmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgPGVtPk5hbWVkIFBsc3FsIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TmFtZWQgUGxzcWwgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVudGl0eV8yXzMjZ2V0TmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eV8yXzMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfMl8zX05hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlfMl8zRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVudGl0eV8yXzMjZ2V0UGxzcWxSZWNvcmRzIDxlbT5QbHNxbCBSZWNvcmRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QbHNxbCBSZWNvcmRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVudGl0eV8yXzMjZ2V0UGxzcWxSZWNvcmRzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlfMl8zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5XzJfM19QbHNxbFJlY29yZHMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eV8yXzNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW50aXR5XzJfMyNnZXRQbHNxbFRhYmxlcyA8ZW0+UGxzcWwgVGFibGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QbHNxbCBUYWJsZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW50aXR5XzJfMyNnZXRQbHNxbFRhYmxlcygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5XzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV8yXzNfUGxzcWxUYWJsZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eV8yXzNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVudGl0eV8yXzMjZ2V0U3RydWN0IDxlbT5TdHJ1Y3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TdHJ1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW50aXR5XzJfMyNnZXRTdHJ1Y3QoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eV8yXzMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfMl8zX1N0cnVjdCgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5XzJfM0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMjM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzMoKQotCXsKLQkJcmV0dXJuIHhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzMjZ2V0TmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMgPGVtPk5hbWVkIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5OYW1lZCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMyNnZXROYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfM19OYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc18yXzNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzMjZ2V0TmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcyA8ZW0+TmFtZWQgUGxzcWwgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk5hbWVkIFBsc3FsIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zI2dldE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKQotCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzNfTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc18yXzNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzMjZ2V0TmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgPGVtPk5hbWVkIFBsc3FsIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TmFtZWQgUGxzcWwgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zI2dldE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zX05hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzXzJfM0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMyNnZXRQbHNxbFJlY29yZHMgPGVtPlBsc3FsIFJlY29yZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBsc3FsIFJlY29yZHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzMjZ2V0UGxzcWxSZWNvcmRzKCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zX1Bsc3FsUmVjb3JkcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc18yXzNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzMjZ2V0UGxzcWxUYWJsZXMgPGVtPlBsc3FsIFRhYmxlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGxzcWwgVGFibGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zI2dldFBsc3FsVGFibGVzKCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zX1Bsc3FsVGFibGVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzXzJfM0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVudGl0eU1hcHBpbmdzXzJfMyA8ZW0+WG1sIEVudGl0eSBNYXBwaW5ncyAyMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW50aXR5IE1hcHBpbmdzIDIzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVudGl0eU1hcHBpbmdzXzJfMwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVudGl0eU1hcHBpbmdzXzJfMygpCi0JewotCQlyZXR1cm4geG1sRW50aXR5TWFwcGluZ3NfMl8zRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbnRpdHlNYXBwaW5nc18yXzMjZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMgPGVtPlRlbmFudCBEaXNjcmltaW5hdG9yIENvbHVtbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRlbmFudCBEaXNjcmltaW5hdG9yIENvbHVtbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW50aXR5TWFwcGluZ3NfMl8zI2dldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzNfVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eU1hcHBpbmdzXzJfM0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbnRpdHlNYXBwaW5nc18yXzMjZ2V0TmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMgPGVtPk5hbWVkIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5OYW1lZCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbnRpdHlNYXBwaW5nc18yXzMjZ2V0TmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eU1hcHBpbmdzXzJfM19OYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5TWFwcGluZ3NfMl8zRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVudGl0eU1hcHBpbmdzXzJfMyNnZXROYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzIDxlbT5OYW1lZCBQbHNxbCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TmFtZWQgUGxzcWwgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW50aXR5TWFwcGluZ3NfMl8zI2dldE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eU1hcHBpbmdzXzJfM19OYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlNYXBwaW5nc18yXzNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW50aXR5TWFwcGluZ3NfMl8zI2dldE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzIDxlbT5OYW1lZCBQbHNxbCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk5hbWVkIFBsc3FsIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbnRpdHlNYXBwaW5nc18yXzMjZ2V0TmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eU1hcHBpbmdzXzJfM19OYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5TWFwcGluZ3NfMl8zRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVudGl0eU1hcHBpbmdzXzJfMyNnZXRQbHNxbFJlY29yZHMgPGVtPlBsc3FsIFJlY29yZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBsc3FsIFJlY29yZHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW50aXR5TWFwcGluZ3NfMl8zI2dldFBsc3FsUmVjb3JkcygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8zX1Bsc3FsUmVjb3JkcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5TWFwcGluZ3NfMl8zRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVudGl0eU1hcHBpbmdzXzJfMyNnZXRQbHNxbFRhYmxlcyA8ZW0+UGxzcWwgVGFibGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QbHNxbCBUYWJsZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW50aXR5TWFwcGluZ3NfMl8zI2dldFBsc3FsVGFibGVzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzNfUGxzcWxUYWJsZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eU1hcHBpbmdzXzJfM0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMyA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHMgMjM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHMgMjM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8zKCkKLQl7Ci0JCXJldHVybiB4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzNFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMyNnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA8ZW0+VGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzMjZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfM19UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8zRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sUGxzcWxSZWNvcmRfMl8zIDxlbT5YbWwgUGxzcWwgUmVjb3JkIDIzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQbHNxbCBSZWNvcmQgMjM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sUGxzcWxSZWNvcmRfMl8zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUGxzcWxSZWNvcmRfMl8zKCkKLQl7Ci0JCXJldHVybiB4bWxQbHNxbFJlY29yZF8yXzNFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxQbHNxbFJlY29yZF8yXzMjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sUGxzcWxSZWNvcmRfMl8zI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbFBsc3FsUmVjb3JkXzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBsc3FsUmVjb3JkXzJfM19OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQbHNxbFJlY29yZF8yXzNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxQbHNxbFRhYmxlXzJfMyA8ZW0+WG1sIFBsc3FsIFRhYmxlIDIzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQbHNxbCBUYWJsZSAyMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxQbHNxbFRhYmxlXzJfMwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFBsc3FsVGFibGVfMl8zKCkKLQl7Ci0JCXJldHVybiB4bWxQbHNxbFRhYmxlXzJfM0VDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFBsc3FsVGFibGVfMl8zI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFBsc3FsVGFibGVfMl8zI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbFBsc3FsVGFibGVfMl8zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGxzcWxUYWJsZV8yXzNfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUGxzcWxUYWJsZV8yXzNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxTdHJ1Y3RfMl8zIDxlbT5YbWwgU3RydWN0IDIzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBTdHJ1Y3QgMjM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sU3RydWN0XzJfMwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFN0cnVjdF8yXzMoKQotCXsKLQkJcmV0dXJuIHhtbFN0cnVjdF8yXzNFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxTdHJ1Y3RfMl8zI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFN0cnVjdF8yXzMjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sU3RydWN0XzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFN0cnVjdF8yXzNfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sU3RydWN0XzJfM0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zIDxlbT5YbWwgVGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uIDIzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBUZW5hbnQgRGlzY3JpbWluYXRvciBDb2x1bW4gMjM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMygpCi0JewotCQlyZXR1cm4geG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzNFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMyNnZXRDb250ZXh0UHJvcGVydHkgPGVtPkNvbnRleHQgUHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db250ZXh0IFByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zI2dldENvbnRleHRQcm9wZXJ0eSgpCi0JICogQHNlZSAjZ2V0WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfM19Db250ZXh0UHJvcGVydHkoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMyNnZXRUYWJsZSA8ZW0+VGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMyNnZXRUYWJsZSgpCi0JICogQHNlZSAjZ2V0WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfM19UYWJsZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zI2dldFByaW1hcnlLZXkgPGVtPlByaW1hcnkgS2V5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMjZ2V0UHJpbWFyeUtleSgpCi0JICogQHNlZSAjZ2V0WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfM19QcmltYXJ5S2V5KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfM0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEF0dHJpYnV0ZXNfMl8zIDxlbT5YbWwgQXR0cmlidXRlcyAyMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQXR0cmlidXRlcyAyMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxBdHRyaWJ1dGVzXzJfMwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEF0dHJpYnV0ZXNfMl8zKCkKLQl7Ci0JCXJldHVybiB4bWxBdHRyaWJ1dGVzXzJfM0VDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sQXR0cmlidXRlc18yXzMjZ2V0U3RydWN0dXJlcyA8ZW0+U3RydWN0dXJlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3RydWN0dXJlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxBdHRyaWJ1dGVzXzJfMyNnZXRTdHJ1Y3R1cmVzKCkKLQkgKiBAc2VlICNnZXRYbWxBdHRyaWJ1dGVzXzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEF0dHJpYnV0ZXNfMl8zX1N0cnVjdHVyZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEF0dHJpYnV0ZXNfMl8zRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEF0dHJpYnV0ZXNfMl8zI2dldEFycmF5cyA8ZW0+QXJyYXlzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5BcnJheXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sQXR0cmlidXRlc18yXzMjZ2V0QXJyYXlzKCkKLQkgKiBAc2VlICNnZXRYbWxBdHRyaWJ1dGVzXzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEF0dHJpYnV0ZXNfMl8zX0FycmF5cygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQXR0cmlidXRlc18yXzNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxTdHJ1Y3R1cmVfMl8zIDxlbT5YbWwgU3RydWN0dXJlIDIzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBTdHJ1Y3R1cmUgMjM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sU3RydWN0dXJlXzJfMwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFN0cnVjdHVyZV8yXzMoKQotCXsKLQkJcmV0dXJuIHhtbFN0cnVjdHVyZV8yXzNFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sQXJyYXlfMl8zIDxlbT5YbWwgQXJyYXkgMjM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEFycmF5IDIzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEFycmF5XzJfMwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEFycmF5XzJfMygpCi0JewotCQlyZXR1cm4geG1sQXJyYXlfMl8zRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sQXJyYXlfMl8zI2dldERhdGFiYXNlVHlwZSA8ZW0+RGF0YWJhc2UgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRhdGFiYXNlIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sQXJyYXlfMl8zI2dldERhdGFiYXNlVHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sQXJyYXlfMl8zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQXJyYXlfMl8zX0RhdGFiYXNlVHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQXJyYXlfMl8zRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxBcnJheV8yXzMjZ2V0VGFyZ2V0Q2xhc3MgPGVtPlRhcmdldCBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhcmdldCBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxBcnJheV8yXzMjZ2V0VGFyZ2V0Q2xhc3MoKQotCSAqIEBzZWUgI2dldFhtbEFycmF5XzJfMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEFycmF5XzJfM19UYXJnZXRDbGFzcygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQXJyYXlfMl8zRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8zIDxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8zKCkKLQl7Ci0JCXJldHVybiB4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzNFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzMjZ2V0Q29tcG9zaXRlTWVtYmVyIDxlbT5Db21wb3NpdGUgTWVtYmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29tcG9zaXRlIE1lbWJlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzMjZ2V0Q29tcG9zaXRlTWVtYmVyKCkKLQkgKiBAc2VlICNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzNfQ29tcG9zaXRlTWVtYmVyKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLk11bHRpdGVuYW50VHlwZSA8ZW0+TXVsdGl0ZW5hbnQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPk11bHRpdGVuYW50IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuTXVsdGl0ZW5hbnRUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRNdWx0aXRlbmFudFR5cGUoKQotCXsKLQkJcmV0dXJuIG11bHRpdGVuYW50VHlwZUVFbnVtOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtVjJfM0ZhY3RvcnkgZ2V0RWNsaXBzZUxpbmtPcm1WMl8zRmFjdG9yeSgpCi0JewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rT3JtVjJfM0ZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCXsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQl4bWxBcnJheV8yXzNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0FSUkFZXzIzKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxBcnJheV8yXzNFQ2xhc3MsIFhNTF9BUlJBWV8yM19fREFUQUJBU0VfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQXJyYXlfMl8zRUNsYXNzLCBYTUxfQVJSQVlfMjNfX1RBUkdFVF9DTEFTUyk7Ci0KLQkJeG1sQXR0cmlidXRlc18yXzNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0FUVFJJQlVURVNfMjMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEF0dHJpYnV0ZXNfMl8zRUNsYXNzLCBYTUxfQVRUUklCVVRFU18yM19fU1RSVUNUVVJFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQXR0cmlidXRlc18yXzNFQ2xhc3MsIFhNTF9BVFRSSUJVVEVTXzIzX19BUlJBWVMpOwotCi0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfM0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIzKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzNFQ2xhc3MsIFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjNfX0NPTVBPU0lURV9NRU1CRVIpOwotCi0JCXhtbEVtYmVkZGFibGVfMl8zRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTUJFRERBQkxFXzIzKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbWJlZGRhYmxlXzJfM0VDbGFzcywgWE1MX0VNQkVEREFCTEVfMjNfX1BMU1FMX1JFQ09SRFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVtYmVkZGFibGVfMl8zRUNsYXNzLCBYTUxfRU1CRUREQUJMRV8yM19fUExTUUxfVEFCTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbWJlZGRhYmxlXzJfM0VDbGFzcywgWE1MX0VNQkVEREFCTEVfMjNfX1NUUlVDVCk7Ci0KLQkJeG1sRW50aXR5XzJfM0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU5USVRZXzIzKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlfMl8zRUNsYXNzLCBYTUxfRU5USVRZXzIzX19OQU1FRF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5XzJfM0VDbGFzcywgWE1MX0VOVElUWV8yM19fTkFNRURfUExTUUxfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eV8yXzNFQ2xhc3MsIFhNTF9FTlRJVFlfMjNfX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5XzJfM0VDbGFzcywgWE1MX0VOVElUWV8yM19fUExTUUxfUkVDT1JEUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5XzJfM0VDbGFzcywgWE1MX0VOVElUWV8yM19fUExTUUxfVEFCTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlfMl8zRUNsYXNzLCBYTUxfRU5USVRZXzIzX19TVFJVQ1QpOwotCi0JCXhtbEVudGl0eU1hcHBpbmdzXzJfM0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU5USVRZX01BUFBJTkdTXzIzKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlNYXBwaW5nc18yXzNFQ2xhc3MsIFhNTF9FTlRJVFlfTUFQUElOR1NfMjNfX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzXzJfM0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU18yM19fTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzXzJfM0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU18yM19fTkFNRURfUExTUUxfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzXzJfM0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU18yM19fTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlNYXBwaW5nc18yXzNFQ2xhc3MsIFhNTF9FTlRJVFlfTUFQUElOR1NfMjNfX1BMU1FMX1JFQ09SRFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzXzJfM0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU18yM19fUExTUUxfVEFCTEVTKTsKLQotCQl4bWxNYXBwZWRTdXBlcmNsYXNzXzJfM0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjNfX05BTUVEX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBwZWRTdXBlcmNsYXNzXzJfM0VDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIzX19OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFwcGVkU3VwZXJjbGFzc18yXzNFQ2xhc3MsIFhNTF9NQVBQRURfU1VQRVJDTEFTU18yM19fTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBwZWRTdXBlcmNsYXNzXzJfM0VDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIzX19QTFNRTF9SRUNPUkRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBwZWRTdXBlcmNsYXNzXzJfM0VDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIzX19QTFNRTF9UQUJMRVMpOwotCi0JCXhtbE11bHRpdGVuYW50XzJfM0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTVVMVElURU5BTlRfMjMpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE11bHRpdGVuYW50XzJfM0VDbGFzcywgWE1MX01VTFRJVEVOQU5UXzIzX19UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNdWx0aXRlbmFudF8yXzNFQ2xhc3MsIFhNTF9NVUxUSVRFTkFOVF8yM19fVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OUyk7Ci0KLQkJeG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUllfMjMpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfM0VDbGFzcywgWE1MX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSWV8yM19fTkFNRSk7Ci0KLQkJeG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfM0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV8yMyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfM0VDbGFzcywgWE1MX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfMjNfX05BTUUpOwotCi0JCXhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX05BTUVEX1NUT1JFRF9GVU5DVElPTl9RVUVSWV8yMyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfM0VDbGFzcywgWE1MX05BTUVEX1NUT1JFRF9GVU5DVElPTl9RVUVSWV8yM19fTkFNRSk7Ci0KLQkJeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8zRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTXzIzKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzNFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTXzIzX19URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TKTsKLQotCQl4bWxQbHNxbFJlY29yZF8yXzNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BMU1FMX1JFQ09SRF8yMyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGxzcWxSZWNvcmRfMl8zRUNsYXNzLCBYTUxfUExTUUxfUkVDT1JEXzIzX19OQU1FKTsKLQotCQl4bWxQbHNxbFRhYmxlXzJfM0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUExTUUxfVEFCTEVfMjMpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFBsc3FsVGFibGVfMl8zRUNsYXNzLCBYTUxfUExTUUxfVEFCTEVfMjNfX05BTUUpOwotCi0JCXhtbFN0cnVjdF8yXzNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1NUUlVDVF8yMyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sU3RydWN0XzJfM0VDbGFzcywgWE1MX1NUUlVDVF8yM19fTkFNRSk7Ci0KLQkJeG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl8yMyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzNFQ2xhc3MsIFhNTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fMjNfX0NPTlRFWFRfUFJPUEVSVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zRUNsYXNzLCBYTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OXzIzX19UQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzNFQ2xhc3MsIFhNTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fMjNfX1BSSU1BUllfS0VZKTsKLQotCQl4bWxTdHJ1Y3R1cmVfMl8zRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9TVFJVQ1RVUkVfMjMpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQltdWx0aXRlbmFudFR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKE1VTFRJVEVOQU5UX1RZUEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUVjbGlwc2VMaW5rT3JtUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lTlNfVVJJKTsKLQkJT3JtUGFja2FnZSB0aGVPcm1QYWNrYWdlID0gKE9ybVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtUGFja2FnZS5lTlNfVVJJKTsKLQkJWE1MVHlwZVBhY2thZ2UgdGhlWE1MVHlwZVBhY2thZ2UgPSAoWE1MVHlwZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoWE1MVHlwZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJeG1sQXJyYXlfMl8zRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxDb252ZXJ0ZXJDb250YWluZXIoKSk7Ci0JCXhtbEFycmF5XzJfM0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZygpKTsKLQkJeG1sQXJyYXlfMl8zRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0Q29sdW1uTWFwcGluZygpKTsKLQkJeG1sRW50aXR5XzJfM0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sTXVsdGl0ZW5hbnRIb2xkZXIoKSk7Ci0JCXhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxNdWx0aXRlbmFudEhvbGRlcigpKTsKLQkJeG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKHhtbEFycmF5XzJfM0VDbGFzcywgWG1sQXJyYXlfMl8zLmNsYXNzLCAiWG1sQXJyYXlfMl8zIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQXJyYXlfMl8zX0RhdGFiYXNlVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRhdGFiYXNlVHlwZSIsIG51bGwsIDAsIDEsIFhtbEFycmF5XzJfMy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQXJyYXlfMl8zX1RhcmdldENsYXNzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidGFyZ2V0Q2xhc3MiLCBudWxsLCAwLCAxLCBYbWxBcnJheV8yXzMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxBdHRyaWJ1dGVzXzJfM0VDbGFzcywgWG1sQXR0cmlidXRlc18yXzMuY2xhc3MsICJYbWxBdHRyaWJ1dGVzXzJfMyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEF0dHJpYnV0ZXNfMl8zX1N0cnVjdHVyZXMoKSwgdGhpcy5nZXRYbWxTdHJ1Y3R1cmVfMl8zKCksIG51bGwsICJzdHJ1Y3R1cmVzIiwgbnVsbCwgMCwgLTEsIFhtbEF0dHJpYnV0ZXNfMl8zLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxBdHRyaWJ1dGVzXzJfM19BcnJheXMoKSwgdGhpcy5nZXRYbWxBcnJheV8yXzMoKSwgbnVsbCwgImFycmF5cyIsIG51bGwsIDAsIC0xLCBYbWxBdHRyaWJ1dGVzXzJfMy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfM0VDbGFzcywgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8zLmNsYXNzLCAiWG1sRWxlbWVudENvbGxlY3Rpb25fMl8zIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8zX0NvbXBvc2l0ZU1lbWJlcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNvbXBvc2l0ZU1lbWJlciIsIG51bGwsIDAsIDEsIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEVtYmVkZGFibGVfMl8zRUNsYXNzLCBYbWxFbWJlZGRhYmxlXzJfMy5jbGFzcywgIlhtbEVtYmVkZGFibGVfMl8zIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW1iZWRkYWJsZV8yXzNfUGxzcWxSZWNvcmRzKCksIHRoaXMuZ2V0WG1sUGxzcWxSZWNvcmRfMl8zKCksIG51bGwsICJwbHNxbFJlY29yZHMiLCBudWxsLCAwLCAtMSwgWG1sRW1iZWRkYWJsZV8yXzMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVtYmVkZGFibGVfMl8zX1Bsc3FsVGFibGVzKCksIHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxQbHNxbFRhYmxlKCksIG51bGwsICJwbHNxbFRhYmxlcyIsIG51bGwsIDAsIC0xLCBYbWxFbWJlZGRhYmxlXzJfMy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW1iZWRkYWJsZV8yXzNfU3RydWN0KCksIHRoaXMuZ2V0WG1sU3RydWN0XzJfMygpLCBudWxsLCAic3RydWN0IiwgbnVsbCwgMCwgMSwgWG1sRW1iZWRkYWJsZV8yXzMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbnRpdHlfMl8zRUNsYXNzLCBYbWxFbnRpdHlfMl8zLmNsYXNzLCAiWG1sRW50aXR5XzJfMyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV8yXzNfTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKSwgdGhpcy5nZXRYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zKCksIG51bGwsICJuYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcyIsIG51bGwsIDAsIC0xLCBYbWxFbnRpdHlfMl8zLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfMl8zX05hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKSwgdGhpcy5nZXRYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMoKSwgbnVsbCwgIm5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5XzJfMy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5XzJfM19OYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpLCB0aGlzLmdldFhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzMoKSwgbnVsbCwgIm5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eV8yXzMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV8yXzNfUGxzcWxSZWNvcmRzKCksIHRoaXMuZ2V0WG1sUGxzcWxSZWNvcmRfMl8zKCksIG51bGwsICJwbHNxbFJlY29yZHMiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5XzJfMy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5XzJfM19QbHNxbFRhYmxlcygpLCB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sUGxzcWxUYWJsZSgpLCBudWxsLCAicGxzcWxUYWJsZXMiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5XzJfMy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5XzJfM19TdHJ1Y3QoKSwgdGhpcy5nZXRYbWxTdHJ1Y3RfMl8zKCksIG51bGwsICJzdHJ1Y3QiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHlfMl8zLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sRW50aXR5TWFwcGluZ3NfMl8zRUNsYXNzLCBYbWxFbnRpdHlNYXBwaW5nc18yXzMuY2xhc3MsICJYbWxFbnRpdHlNYXBwaW5nc18yXzMiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzNfVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSwgdGhpcy5nZXRYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMygpLCBudWxsLCAidGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5TWFwcGluZ3NfMl8zLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzNfTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKSwgdGhpcy5nZXRYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zKCksIG51bGwsICJuYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcyIsIG51bGwsIDAsIC0xLCBYbWxFbnRpdHlNYXBwaW5nc18yXzMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eU1hcHBpbmdzXzJfM19OYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCksIHRoaXMuZ2V0WG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zKCksIG51bGwsICJuYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eU1hcHBpbmdzXzJfMy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8zX05hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCksIHRoaXMuZ2V0WG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfMygpLCBudWxsLCAibmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5TWFwcGluZ3NfMl8zLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzNfUGxzcWxSZWNvcmRzKCksIHRoaXMuZ2V0WG1sUGxzcWxSZWNvcmRfMl8zKCksIG51bGwsICJwbHNxbFJlY29yZHMiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5TWFwcGluZ3NfMl8zLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzNfUGxzcWxUYWJsZXMoKSwgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbFBsc3FsVGFibGUoKSwgbnVsbCwgInBsc3FsVGFibGVzIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eU1hcHBpbmdzXzJfMy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zRUNsYXNzLCBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMy5jbGFzcywgIlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzNfTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKSwgdGhpcy5nZXRYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zKCksIG51bGwsICJuYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcyIsIG51bGwsIDAsIC0xLCBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzNfTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpLCB0aGlzLmdldFhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMygpLCBudWxsLCAibmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcyIsIG51bGwsIDAsIC0xLCBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzNfTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKSwgdGhpcy5nZXRYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zKCksIG51bGwsICJuYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcyIsIG51bGwsIDAsIC0xLCBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzNfUGxzcWxSZWNvcmRzKCksIHRoaXMuZ2V0WG1sUGxzcWxSZWNvcmRfMl8zKCksIG51bGwsICJwbHNxbFJlY29yZHMiLCBudWxsLCAwLCAtMSwgWG1sTWFwcGVkU3VwZXJjbGFzc18yXzMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zX1Bsc3FsVGFibGVzKCksIHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxQbHNxbFRhYmxlKCksIG51bGwsICJwbHNxbFRhYmxlcyIsIG51bGwsIDAsIC0xLCBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE11bHRpdGVuYW50XzJfM0VDbGFzcywgWG1sTXVsdGl0ZW5hbnRfMl8zLmNsYXNzLCAiWG1sTXVsdGl0ZW5hbnRfMl8zIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTXVsdGl0ZW5hbnRfMl8zX1R5cGUoKSwgdGhpcy5nZXRNdWx0aXRlbmFudFR5cGUoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBYbWxNdWx0aXRlbmFudF8yXzMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE11bHRpdGVuYW50XzJfM19UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLCB0aGlzLmdldFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zKCksIG51bGwsICJ0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyIsIG51bGwsIDAsIC0xLCBYbWxNdWx0aXRlbmFudF8yXzMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzNFQ2xhc3MsIFhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMy5jbGFzcywgIlhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfM19OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzNFQ2xhc3MsIFhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzMuY2xhc3MsICJYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfM19OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zRUNsYXNzLCBYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zLmNsYXNzLCAiWG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzNfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8zRUNsYXNzLCBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzMuY2xhc3MsICJYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzMiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzNfVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSwgdGhpcy5nZXRYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMygpLCBudWxsLCAidGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMiLCBudWxsLCAwLCAtMSwgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8zLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUGxzcWxSZWNvcmRfMl8zRUNsYXNzLCBYbWxQbHNxbFJlY29yZF8yXzMuY2xhc3MsICJYbWxQbHNxbFJlY29yZF8yXzMiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQbHNxbFJlY29yZF8yXzNfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxQbHNxbFJlY29yZF8yXzMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxQbHNxbFRhYmxlXzJfM0VDbGFzcywgWG1sUGxzcWxUYWJsZV8yXzMuY2xhc3MsICJYbWxQbHNxbFRhYmxlXzJfMyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFBsc3FsVGFibGVfMl8zX05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgWG1sUGxzcWxUYWJsZV8yXzMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxTdHJ1Y3RfMl8zRUNsYXNzLCBYbWxTdHJ1Y3RfMl8zLmNsYXNzLCAiWG1sU3RydWN0XzJfMyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFN0cnVjdF8yXzNfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxTdHJ1Y3RfMl8zLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzNFQ2xhc3MsIFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zLmNsYXNzLCAiWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfM19Db250ZXh0UHJvcGVydHkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb250ZXh0UHJvcGVydHkiLCBudWxsLCAwLCAxLCBYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzNfVGFibGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ0YWJsZSIsIG51bGwsIDAsIDEsIFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfM19QcmltYXJ5S2V5KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbk9iamVjdCgpLCAicHJpbWFyeUtleSIsIG51bGwsIDAsIDEsIFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sU3RydWN0dXJlXzJfM0VDbGFzcywgWG1sU3RydWN0dXJlXzJfMy5jbGFzcywgIlhtbFN0cnVjdHVyZV8yXzMiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bShtdWx0aXRlbmFudFR5cGVFRW51bSwgTXVsdGl0ZW5hbnRUeXBlLmNsYXNzLCAiTXVsdGl0ZW5hbnRUeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtdWx0aXRlbmFudFR5cGVFRW51bSwgTXVsdGl0ZW5hbnRUeXBlLlNJTkdMRV9UQUJMRSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtdWx0aXRlbmFudFR5cGVFRW51bSwgTXVsdGl0ZW5hbnRUeXBlLlRBQkxFX1BFUl9URU5BTlQpOwotCQlhZGRFRW51bUxpdGVyYWwobXVsdGl0ZW5hbnRUeXBlRUVudW0sIE11bHRpdGVuYW50VHlwZS5WUEQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTGl0ZXJhbHMKLQl7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVtYmVkZGFibGVfMl8zIDxlbT5YbWwgRW1iZWRkYWJsZSAyMzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbWJlZGRhYmxlXzJfMwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbEVtYmVkZGFibGVfMl8zKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VNQkVEREFCTEVfMjMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZV8yXzMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBsc3FsIFJlY29yZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VNQkVEREFCTEVfMjNfX1BMU1FMX1JFQ09SRFMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZV8yXzNfUGxzcWxSZWNvcmRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QbHNxbCBUYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VNQkVEREFCTEVfMjNfX1BMU1FMX1RBQkxFUyA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRhYmxlXzJfM19QbHNxbFRhYmxlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU1CRUREQUJMRV8yM19fU1RSVUNUID0gZUlOU1RBTkNFLmdldFhtbEVtYmVkZGFibGVfMl8zX1N0cnVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE11bHRpdGVuYW50XzJfMyA8ZW0+WG1sIE11bHRpdGVuYW50IDIzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE11bHRpdGVuYW50XzJfMwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbE11bHRpdGVuYW50XzJfMygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NVUxUSVRFTkFOVF8yMyA9IGVJTlNUQU5DRS5nZXRYbWxNdWx0aXRlbmFudF8yXzMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9NVUxUSVRFTkFOVF8yM19fVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxNdWx0aXRlbmFudF8yXzNfVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTVVMVElURU5BTlRfMjNfX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTlMgPSBlSU5TVEFOQ0UuZ2V0WG1sTXVsdGl0ZW5hbnRfMl8zX1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zIDxlbT5YbWwgTmFtZWQgUGxzcWwgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJ5IDIzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUllfMjMgPSBlSU5TVEFOQ0UuZ2V0WG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTkFNRURfUExTUUxfU1RPUkVEX0ZVTkNUSU9OX1FVRVJZXzIzX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfM19OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfMyA8ZW0+WG1sIE5hbWVkIFBsc3FsIFN0b3JlZCBQcm9jZWR1cmUgUXVlcnkgMjM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfMwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV8yMyA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV8yM19fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zIDxlbT5YbWwgTmFtZWQgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJ5IDIzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX05BTUVEX1NUT1JFRF9GVU5DVElPTl9RVUVSWV8yMyA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJZXzIzX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzNfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVudGl0eV8yXzMgPGVtPlhtbCBFbnRpdHkgMjM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRW50aXR5XzJfMwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbEVudGl0eV8yXzMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU5USVRZXzIzID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfMjNfX05BTUVEX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzNfTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFBsc3FsIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfMjNfX05BTUVEX1BMU1FMX1NUT1JFRF9GVU5DVElPTl9RVUVSSUVTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzNfTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgUGxzcWwgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfMjNfX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMl8zX05hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QbHNxbCBSZWNvcmRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfMjNfX1BMU1FMX1JFQ09SRFMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzJfM19QbHNxbFJlY29yZHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBsc3FsIFRhYmxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZXzIzX19QTFNRTF9UQUJMRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzJfM19QbHNxbFRhYmxlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZXzIzX19TVFJVQ1QgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzJfM19TdHJ1Y3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMyA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjMgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU18yM19fTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzNfTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFBsc3FsIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU18yM19fTkFNRURfUExTUUxfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzNfTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgUGxzcWwgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU18yM19fTkFNRURfUExTUUxfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zX05hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QbHNxbCBSZWNvcmRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU18yM19fUExTUUxfUkVDT1JEUyA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfM19QbHNxbFJlY29yZHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBsc3FsIFRhYmxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjNfX1BMU1FMX1RBQkxFUyA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfM19QbHNxbFRhYmxlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVudGl0eU1hcHBpbmdzXzJfMyA8ZW0+WG1sIEVudGl0eSBNYXBwaW5ncyAyMzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbnRpdHlNYXBwaW5nc18yXzMKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU5USVRZX01BUFBJTkdTXzIzID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzXzJfMygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTXzIzX19URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzXzJfM19UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9NQVBQSU5HU18yM19fTkFNRURfU1RPUkVEX0ZVTkNUSU9OX1FVRVJJRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8zX05hbWVkU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBQbHNxbCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTXzIzX19OQU1FRF9QTFNRTF9TVE9SRURfRlVOQ1RJT05fUVVFUklFUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc18yXzNfTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgUGxzcWwgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfTUFQUElOR1NfMjNfX05BTUVEX1BMU1FMX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc18yXzNfTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBsc3FsIFJlY29yZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9NQVBQSU5HU18yM19fUExTUUxfUkVDT1JEUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc18yXzNfUGxzcWxSZWNvcmRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QbHNxbCBUYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9NQVBQSU5HU18yM19fUExTUUxfVEFCTEVTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzXzJfM19QbHNxbFRhYmxlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMyA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHMgMjM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8zCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8zKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfMjMgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UZW5hbnQgRGlzY3JpbWluYXRvciBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTXzIzX19URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfM19UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFBsc3FsUmVjb3JkXzJfMyA8ZW0+WG1sIFBsc3FsIFJlY29yZCAyMzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxQbHNxbFJlY29yZF8yXzMKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxQbHNxbFJlY29yZF8yXzMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUExTUUxfUkVDT1JEXzIzID0gZUlOU1RBTkNFLmdldFhtbFBsc3FsUmVjb3JkXzJfMygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BMU1FMX1JFQ09SRF8yM19fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxQbHNxbFJlY29yZF8yXzNfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFBsc3FsVGFibGVfMl8zIDxlbT5YbWwgUGxzcWwgVGFibGUgMjM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sUGxzcWxUYWJsZV8yXzMKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxQbHNxbFRhYmxlXzJfMygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QTFNRTF9UQUJMRV8yMyA9IGVJTlNUQU5DRS5nZXRYbWxQbHNxbFRhYmxlXzJfMygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BMU1FMX1RBQkxFXzIzX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbFBsc3FsVGFibGVfMl8zX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxTdHJ1Y3RfMl8zIDxlbT5YbWwgU3RydWN0IDIzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFN0cnVjdF8yXzMKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxTdHJ1Y3RfMl8zKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1NUUlVDVF8yMyA9IGVJTlNUQU5DRS5nZXRYbWxTdHJ1Y3RfMl8zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfU1RSVUNUXzIzX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbFN0cnVjdF8yXzNfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zIDxlbT5YbWwgVGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uIDIzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OXzIzID0gZUlOU1RBTkNFLmdldFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250ZXh0IFByb3BlcnR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OXzIzX19DT05URVhUX1BST1BFUlRZID0gZUlOU1RBTkNFLmdldFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zX0NvbnRleHRQcm9wZXJ0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fMjNfX1RBQkxFID0gZUlOU1RBTkNFLmdldFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zX1RhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1RFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl8yM19fUFJJTUFSWV9LRVkgPSBlSU5TVEFOQ0UuZ2V0WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzNfUHJpbWFyeUtleSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEF0dHJpYnV0ZXNfMl8zIDxlbT5YbWwgQXR0cmlidXRlcyAyMzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxBdHRyaWJ1dGVzXzJfMwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbEF0dHJpYnV0ZXNfMl8zKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0FUVFJJQlVURVNfMjMgPSBlSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlc18yXzMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdHVyZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0FUVFJJQlVURVNfMjNfX1NUUlVDVFVSRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlc18yXzNfU3RydWN0dXJlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXJyYXlzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9BVFRSSUJVVEVTXzIzX19BUlJBWVMgPSBlSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlc18yXzNfQXJyYXlzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sU3RydWN0dXJlXzJfMyA8ZW0+WG1sIFN0cnVjdHVyZSAyMzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxTdHJ1Y3R1cmVfMl8zCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sU3RydWN0dXJlXzJfMygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9TVFJVQ1RVUkVfMjMgPSBlSU5TVEFOQ0UuZ2V0WG1sU3RydWN0dXJlXzJfMygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEFycmF5XzJfMyA8ZW0+WG1sIEFycmF5IDIzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEFycmF5XzJfMwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbEFycmF5XzJfMygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9BUlJBWV8yMyA9IGVJTlNUQU5DRS5nZXRYbWxBcnJheV8yXzMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRhdGFiYXNlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9BUlJBWV8yM19fREFUQUJBU0VfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxBcnJheV8yXzNfRGF0YWJhc2VUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9BUlJBWV8yM19fVEFSR0VUX0NMQVNTID0gZUlOU1RBTkNFLmdldFhtbEFycmF5XzJfM19UYXJnZXRDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMyA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzMKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIzID0gZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29tcG9zaXRlIE1lbWJlcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yM19fQ09NUE9TSVRFX01FTUJFUiA9IGVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzNfQ29tcG9zaXRlTWVtYmVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuTXVsdGl0ZW5hbnRUeXBlIDxlbT5NdWx0aXRlbmFudCBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuTXVsdGl0ZW5hbnRUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0TXVsdGl0ZW5hbnRUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRW51bSBNVUxUSVRFTkFOVF9UWVBFID0gZUlOU1RBTkNFLmdldE11bHRpdGVuYW50VHlwZSgpOwotCi0JfQotCi19IC8vRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzMvTXVsdGl0ZW5hbnRUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMy9NdWx0aXRlbmFudFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk2M2MyNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMy9NdWx0aXRlbmFudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPk11bHRpdGVuYW50IFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0TXVsdGl0ZW5hbnRUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBNdWx0aXRlbmFudFR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+U0lOR0xFIFRBQkxFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NJTkdMRV9UQUJMRV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVNJTkdMRV9UQUJMRSgwLCAiU0lOR0xFX1RBQkxFIiwgIlNJTkdMRV9UQUJMRSIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VEFCTEUgUEVSIFRFTkFOVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNUQUJMRV9QRVJfVEVOQU5UX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JVEFCTEVfUEVSX1RFTkFOVCgxLCAiVEFCTEVfUEVSX1RFTkFOVCIsICJUQUJMRV9QRVJfVEVOQU5UIiksIC8qKgotCSAqIFRoZSAnPGVtPjxiPlZQRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNWUERfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlWUEQoMiwgIlZQRCIsICJWUEQiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNJTkdMRSBUQUJMRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U0lOR0xFIFRBQkxFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NJTkdMRV9UQUJMRQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJTkdMRV9UQUJMRV9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5UQUJMRSBQRVIgVEVOQU5UPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5UQUJMRSBQRVIgVEVOQU5UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1RBQkxFX1BFUl9URU5BTlQKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUJMRV9QRVJfVEVOQU5UX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlZQRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VlBEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1ZQRAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZQRF9WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+TXVsdGl0ZW5hbnQgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTXVsdGl0ZW5hbnRUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IE11bHRpdGVuYW50VHlwZVtdCi0JCXsKLQkJCVNJTkdMRV9UQUJMRSwKLQkJCVRBQkxFX1BFUl9URU5BTlQsCi0JCQlWUEQsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+TXVsdGl0ZW5hbnQgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PE11bHRpdGVuYW50VHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5NdWx0aXRlbmFudCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTXVsdGl0ZW5hbnRUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlNdWx0aXRlbmFudFR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TXVsdGl0ZW5hbnQgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE11bHRpdGVuYW50VHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJTXVsdGl0ZW5hbnRUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TXVsdGl0ZW5hbnQgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE11bHRpdGVuYW50VHlwZSBnZXQoaW50IHZhbHVlKQotCXsKLQkJc3dpdGNoICh2YWx1ZSkKLQkJewotCQkJY2FzZSBTSU5HTEVfVEFCTEVfVkFMVUU6IHJldHVybiBTSU5HTEVfVEFCTEU7Ci0JCQljYXNlIFRBQkxFX1BFUl9URU5BTlRfVkFMVUU6IHJldHVybiBUQUJMRV9QRVJfVEVOQU5UOwotCQkJY2FzZSBWUERfVkFMVUU6IHJldHVybiBWUEQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE11bHRpdGVuYW50VHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkKLQl7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JICByZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKQotCXsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci0JCi19IC8vWG1sTXVsdGl0ZW5hbnRUeXBlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMy9YbWxBcnJheV8yXzMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL1htbEFycmF5XzJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZThhZTA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL1htbEFycmF5XzJfMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJDb250YWluZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBBcnJheSAyMzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sQXJyYXlfMl8zI2dldERhdGFiYXNlVHlwZSA8ZW0+RGF0YWJhc2UgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEFycmF5XzJfMyNnZXRUYXJnZXRDbGFzcyA8ZW0+VGFyZ2V0IENsYXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxBcnJheV8yXzMoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEFycmF5XzJfMyBleHRlbmRzIFhtbENvbnZlcnRlckNvbnRhaW5lciwgWG1sQ29udmVydGlibGVNYXBwaW5nLCBDb2x1bW5NYXBwaW5nCi17Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXRhYmFzZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EYXRhYmFzZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRhdGFiYXNlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERhdGFiYXNlVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxBcnJheV8yXzNfRGF0YWJhc2VUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREYXRhYmFzZVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxBcnJheV8yXzMjZ2V0RGF0YWJhc2VUeXBlIDxlbT5EYXRhYmFzZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhYmFzZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREYXRhYmFzZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERhdGFiYXNlVHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFyZ2V0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYXJnZXQgQ2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYXJnZXRDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxBcnJheV8yXzNfVGFyZ2V0Q2xhc3MoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFRhcmdldENsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sQXJyYXlfMl8zI2dldFRhcmdldENsYXNzIDxlbT5UYXJnZXQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGFyZ2V0Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhcmdldENsYXNzKFN0cmluZyB2YWx1ZSk7Ci19IC8vIFhtbEFycmF5XzJfMwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzMvWG1sQXR0cmlidXRlc18yXzMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL1htbEF0dHJpYnV0ZXNfMl8zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOTA1MTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzMvWG1sQXR0cmlidXRlc18yXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQXR0cmlidXRlcyAyMzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sQXR0cmlidXRlc18yXzMjZ2V0U3RydWN0dXJlcyA8ZW0+U3RydWN0dXJlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEF0dHJpYnV0ZXNfMl8zI2dldEFycmF5cyA8ZW0+QXJyYXlzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVzXzJfMygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQXR0cmlidXRlc18yXzMgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0dXJlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxTdHJ1Y3R1cmVfMl8zfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cnVjdHVyZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3R1cmVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sQXR0cmlidXRlc18yXzNfU3RydWN0dXJlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxTdHJ1Y3R1cmVfMl8zPiBnZXRTdHJ1Y3R1cmVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BcnJheXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sQXJyYXlfMl8zfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFycmF5czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFycmF5czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbEF0dHJpYnV0ZXNfMl8zX0FycmF5cygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxBcnJheV8yXzM+IGdldEFycmF5cygpOwotCi19IC8vIFhtbEF0dHJpYnV0ZXNfMl8zCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMy9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDk4YTg2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzMuamF2YSx2IDEuMSAyMDExLzA2LzI0IDE1OjQ5OjU2IGttb29yZSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8zI2dldENvbXBvc2l0ZU1lbWJlciA8ZW0+Q29tcG9zaXRlIE1lbWJlcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8zKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzMgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tcG9zaXRlIE1lbWJlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tcG9zaXRlIE1lbWJlcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db21wb3NpdGUgTWVtYmVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb21wb3NpdGVNZW1iZXIoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8zX0NvbXBvc2l0ZU1lbWJlcigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29tcG9zaXRlTWVtYmVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8zI2dldENvbXBvc2l0ZU1lbWJlciA8ZW0+Q29tcG9zaXRlIE1lbWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcG9zaXRlIE1lbWJlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29tcG9zaXRlTWVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb21wb3NpdGVNZW1iZXIoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzMKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL1htbEVtYmVkZGFibGVfMl8zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMy9YbWxFbWJlZGRhYmxlXzJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWU0ZWI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL1htbEVtYmVkZGFibGVfMl8zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGxzcWxUYWJsZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEVtYmVkZGFibGUgMjM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVtYmVkZGFibGVfMl8zI2dldFBsc3FsUmVjb3JkcyA8ZW0+UGxzcWwgUmVjb3JkczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVtYmVkZGFibGVfMl8zI2dldFBsc3FsVGFibGVzIDxlbT5QbHNxbCBUYWJsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbWJlZGRhYmxlXzJfMyNnZXRTdHJ1Y3QgPGVtPlN0cnVjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sRW1iZWRkYWJsZV8yXzMoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVtYmVkZGFibGVfMl8zIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBsc3FsIFJlY29yZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sUGxzcWxSZWNvcmRfMl8zfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBsc3FsIFJlY29yZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QbHNxbCBSZWNvcmRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sRW1iZWRkYWJsZV8yXzNfUGxzcWxSZWNvcmRzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbFBsc3FsUmVjb3JkXzJfMz4gZ2V0UGxzcWxSZWNvcmRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QbHNxbCBUYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBsc3FsVGFibGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGxzcWwgVGFibGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGxzcWwgVGFibGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sRW1iZWRkYWJsZV8yXzNfUGxzcWxUYWJsZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sUGxzcWxUYWJsZT4gZ2V0UGxzcWxUYWJsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0cnVjdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RydWN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U3RydWN0KFhtbFN0cnVjdF8yXzMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxFbWJlZGRhYmxlXzJfM19TdHJ1Y3QoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sU3RydWN0XzJfMyBnZXRTdHJ1Y3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbWJlZGRhYmxlXzJfMyNnZXRTdHJ1Y3QgPGVtPlN0cnVjdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTdHJ1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0cnVjdChYbWxTdHJ1Y3RfMl8zIHZhbHVlKTsKLQotfSAvLyBYbWxFbWJlZGRhYmxlXzJfMwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzMvWG1sRW50aXR5TWFwcGluZ3NfMl8zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMy9YbWxFbnRpdHlNYXBwaW5nc18yXzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMxZGRmMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMy9YbWxFbnRpdHlNYXBwaW5nc18yXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBsc3FsVGFibGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbnRpdHkgTWFwcGluZ3MgMjM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVudGl0eU1hcHBpbmdzXzJfMyNnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA8ZW0+VGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVudGl0eU1hcHBpbmdzXzJfMyNnZXROYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcyA8ZW0+TmFtZWQgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbnRpdHlNYXBwaW5nc18yXzMjZ2V0TmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcyA8ZW0+TmFtZWQgUGxzcWwgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbnRpdHlNYXBwaW5nc18yXzMjZ2V0TmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgPGVtPk5hbWVkIFBsc3FsIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVudGl0eU1hcHBpbmdzXzJfMyNnZXRQbHNxbFJlY29yZHMgPGVtPlBsc3FsIFJlY29yZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbnRpdHlNYXBwaW5nc18yXzMjZ2V0UGxzcWxUYWJsZXMgPGVtPlBsc3FsIFRhYmxlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8zKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbnRpdHlNYXBwaW5nc18yXzMgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfM30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZW5hbnQgRGlzY3JpbWluYXRvciBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfM19UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMz4gZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVkIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZWQgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lZCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfM19OYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zPiBnZXROYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZWQgUGxzcWwgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVkIFBsc3FsIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZWQgUGxzcWwgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzNfTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM+IGdldE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVkIFBsc3FsIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVkIFBsc3FsIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVkIFBsc3FsIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfM19OYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zPiBnZXROYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGxzcWwgUmVjb3JkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxQbHNxbFJlY29yZF8yXzN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGxzcWwgUmVjb3JkczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBsc3FsIFJlY29yZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzNfUGxzcWxSZWNvcmRzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbFBsc3FsUmVjb3JkXzJfMz4gZ2V0UGxzcWxSZWNvcmRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QbHNxbCBUYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBsc3FsVGFibGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGxzcWwgVGFibGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGxzcWwgVGFibGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8zX1Bsc3FsVGFibGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbFBsc3FsVGFibGU+IGdldFBsc3FsVGFibGVzKCk7Ci0KLX0gLy8gWG1sRW50aXR5TWFwcGluZ3NfMl8zCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMy9YbWxFbnRpdHlfMl8zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMy9YbWxFbnRpdHlfMl8zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMjdkOTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzMvWG1sRW50aXR5XzJfMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGl0ZW5hbnRIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQbHNxbFRhYmxlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRW50aXR5IDIzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbnRpdHlfMl8zI2dldE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyaWVzIDxlbT5OYW1lZCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVudGl0eV8yXzMjZ2V0TmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcyA8ZW0+TmFtZWQgUGxzcWwgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbnRpdHlfMl8zI2dldE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzIDxlbT5OYW1lZCBQbHNxbCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxFbnRpdHlfMl8zI2dldFBsc3FsUmVjb3JkcyA8ZW0+UGxzcWwgUmVjb3JkczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVudGl0eV8yXzMjZ2V0UGxzcWxUYWJsZXMgPGVtPlBsc3FsIFRhYmxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVudGl0eV8yXzMjZ2V0U3RydWN0IDxlbT5TdHJ1Y3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbEVudGl0eV8yXzMoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVudGl0eV8yXzMgZXh0ZW5kcyBYbWxNdWx0aXRlbmFudEhvbGRlcgotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVkIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZWQgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lZCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbEVudGl0eV8yXzNfTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMz4gZ2V0TmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVkIFBsc3FsIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfM30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lZCBQbHNxbCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVkIFBsc3FsIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sRW50aXR5XzJfM19OYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbE5hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMz4gZ2V0TmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZWQgUGxzcWwgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZWQgUGxzcWwgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZWQgUGxzcWwgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sRW50aXR5XzJfM19OYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zPiBnZXROYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGxzcWwgUmVjb3JkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxQbHNxbFJlY29yZF8yXzN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGxzcWwgUmVjb3JkczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBsc3FsIFJlY29yZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8zX1Bsc3FsUmVjb3JkcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxQbHNxbFJlY29yZF8yXzM+IGdldFBsc3FsUmVjb3JkcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGxzcWwgVGFibGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQbHNxbFRhYmxlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBsc3FsIFRhYmxlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBsc3FsIFRhYmxlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbEVudGl0eV8yXzNfUGxzcWxUYWJsZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sUGxzcWxUYWJsZT4gZ2V0UGxzcWxUYWJsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0cnVjdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RydWN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U3RydWN0KFhtbFN0cnVjdF8yXzMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8zX1N0cnVjdCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxTdHJ1Y3RfMl8zIGdldFN0cnVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbEVudGl0eV8yXzMjZ2V0U3RydWN0IDxlbT5TdHJ1Y3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U3RydWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdHJ1Y3QoWG1sU3RydWN0XzJfMyB2YWx1ZSk7Ci0KLX0gLy8gWG1sRW50aXR5XzJfMwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzMvWG1sTWFwcGVkU3VwZXJjbGFzc18yXzMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL1htbE1hcHBlZFN1cGVyY2xhc3NfMl8zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NjhjM2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzMvWG1sTWFwcGVkU3VwZXJjbGFzc18yXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11bHRpdGVuYW50SG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGxzcWxUYWJsZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMyNnZXROYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcmllcyA8ZW0+TmFtZWQgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMyNnZXROYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzIDxlbT5OYW1lZCBQbHNxbCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zI2dldE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyaWVzIDxlbT5OYW1lZCBQbHNxbCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMyNnZXRQbHNxbFJlY29yZHMgPGVtPlBsc3FsIFJlY29yZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMyNnZXRQbHNxbFRhYmxlcyA8ZW0+UGxzcWwgVGFibGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sTWFwcGVkU3VwZXJjbGFzc18yXzMgZXh0ZW5kcyBYbWxNdWx0aXRlbmFudEhvbGRlcgotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVkIFN0b3JlZCBGdW5jdGlvbiBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZWQgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lZCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zX05hbWVkU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzM+IGdldE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBQbHNxbCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZWQgUGxzcWwgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lZCBQbHNxbCBTdG9yZWQgRnVuY3Rpb24gUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zX05hbWVkUGxzcWxTdG9yZWRGdW5jdGlvblF1ZXJpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zPiBnZXROYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBQbHNxbCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfM30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lZCBQbHNxbCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lZCBQbHNxbCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfM19OYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zPiBnZXROYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGxzcWwgUmVjb3JkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxQbHNxbFJlY29yZF8yXzN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGxzcWwgUmVjb3JkczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBsc3FsIFJlY29yZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfM19QbHNxbFJlY29yZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sUGxzcWxSZWNvcmRfMl8zPiBnZXRQbHNxbFJlY29yZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBsc3FsIFRhYmxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGxzcWxUYWJsZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QbHNxbCBUYWJsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QbHNxbCBUYWJsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfM19QbHNxbFRhYmxlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxQbHNxbFRhYmxlPiBnZXRQbHNxbFRhYmxlcygpOwotCi19IC8vIFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8zCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMy9YbWxNdWx0aXRlbmFudF8yXzMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL1htbE11bHRpdGVuYW50XzJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDdlMWUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL1htbE11bHRpdGVuYW50XzJfMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTXVsdGl0ZW5hbnQgMjM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE11bHRpdGVuYW50XzJfMyNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTXVsdGl0ZW5hbnRfMl8zI2dldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zIDxlbT5UZW5hbnQgRGlzY3JpbWluYXRvciBDb2x1bW5zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxNdWx0aXRlbmFudF8yXzMoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE11bHRpdGVuYW50XzJfMyBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuTXVsdGl0ZW5hbnRUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuTXVsdGl0ZW5hbnRUeXBlCi0JICogQHNlZSAjc2V0VHlwZShNdWx0aXRlbmFudFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxNdWx0aXRlbmFudF8yXzNfVHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU11bHRpdGVuYW50VHlwZSBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTXVsdGl0ZW5hbnRfMl8zI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLk11bHRpdGVuYW50VHlwZQotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoTXVsdGl0ZW5hbnRUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRlbmFudCBEaXNjcmltaW5hdG9yIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRlbmFudCBEaXNjcmltaW5hdG9yIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxNdWx0aXRlbmFudF8yXzNfVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzM+IGdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCk7Ci19IC8vIFhtbE11bHRpdGVuYW50XzJfMwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzMvWG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMy9YbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNkMmNmNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMy9YbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTmFtZWQgUGxzcWwgU3RvcmVkIEZ1bmN0aW9uIFF1ZXJ5MiAzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sTmFtZWRQbHNxbFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotfSAvLyBYbWxOYW1lZFBsc3FsU3RvcmVkRnVuY3Rpb25RdWVyeTJfMwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzMvWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzMvWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGZmZTA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL1htbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTmFtZWQgUGxzcWwgU3RvcmVkIFByb2NlZHVyZSBRdWVyeTIgMzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRQbHNxbFN0b3JlZFByb2NlZHVyZVF1ZXJ5XzJfMyNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnlfMl8zIGV4dGVuZHMgSnBhRU9iamVjdAotewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzNfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkUGxzcWxTdG9yZWRQcm9jZWR1cmVRdWVyeV8yXzMjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotfSAvLyBYbWxOYW1lZFBsc3FsU3RvcmVkUHJvY2VkdXJlUXVlcnkyXzMKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL1htbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL1htbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ1YjliNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMy9YbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE5hbWVkIFN0b3JlZCBGdW5jdGlvbiBRdWVyeTIgMzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5XzJfMyNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnlfMl8zIGV4dGVuZHMgSnBhRU9iamVjdAotewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzNfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeV8yXzMjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotfSAvLyBYbWxOYW1lZFN0b3JlZEZ1bmN0aW9uUXVlcnkyXzMKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzMvWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MzcyNmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzMvWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHMgMjM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMyNnZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA8ZW0+VGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8zKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzMgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfM30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZW5hbnQgRGlzY3JpbWluYXRvciBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfM19UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMz4gZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKTsKLQotfSAvLyBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzMKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL1htbFBsc3FsUmVjb3JkXzJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzMvWG1sUGxzcWxSZWNvcmRfMl8zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ODkyZTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzMvWG1sUGxzcWxSZWNvcmRfMl8zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFBsc3FsIFJlY29yZDIgMzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sUGxzcWxSZWNvcmRfMl8zI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbFBsc3FsUmVjb3JkXzJfMygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sUGxzcWxSZWNvcmRfMl8zIGV4dGVuZHMgSnBhRU9iamVjdAotewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbFBsc3FsUmVjb3JkXzJfM19OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sUGxzcWxSZWNvcmRfMl8zI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLX0gLy8gWG1sUGxzcWxSZWNvcmQyXzMKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL1htbFBsc3FsVGFibGVfMl8zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMy9YbWxQbHNxbFRhYmxlXzJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTRkMDAwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL1htbFBsc3FsVGFibGVfMl8zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFBsc3FsIFRhYmxlMiAzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxQbHNxbFRhYmxlXzJfMyNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxQbHNxbFRhYmxlXzJfMygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sUGxzcWxUYWJsZV8yXzMgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sUGxzcWxUYWJsZV8yXzNfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFBsc3FsVGFibGVfMl8zI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLX0gLy8gWG1sUGxzcWxUYWJsZTJfMwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzMvWG1sU3RydWN0XzJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzMvWG1sU3RydWN0XzJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2Q3MWRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL1htbFN0cnVjdF8yXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgU3RydWN0MiAzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxTdHJ1Y3RfMl8zI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbFN0cnVjdF8yXzMoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFN0cnVjdF8yXzMgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sU3RydWN0XzJfM19OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sU3RydWN0XzJfMyNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci19IC8vIFhtbFN0cnVjdDJfMwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzMvWG1sU3RydWN0dXJlXzJfMy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzMvWG1sU3RydWN0dXJlXzJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDQ3ZTcwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL1htbFN0cnVjdHVyZV8yXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgU3RydWN0dXJlIDIzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbFN0cnVjdHVyZV8yXzMoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFN0cnVjdHVyZV8yXzMgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci19IC8vIFhtbFN0cnVjdHVyZV8yXzMKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL1htbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMy9YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGU5ZWExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8zL1htbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgVGVuYW50IERpc2NyaW1pbmF0b3IyIDM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zI2dldENvbnRleHRQcm9wZXJ0eSA8ZW0+Q29udGV4dCBQcm9wZXJ0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zI2dldFRhYmxlIDxlbT5UYWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zI2dldFByaW1hcnlLZXkgPGVtPlByaW1hcnkgS2V5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMgZXh0ZW5kcyBYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbgotewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGV4dCBQcm9wZXJ0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGV4dCBQcm9wZXJ0eTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZXh0IFByb3BlcnR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb250ZXh0UHJvcGVydHkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UjZ2V0WG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzNfQ29udGV4dFByb3BlcnR5KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb250ZXh0UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5YbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfMyNnZXRDb250ZXh0UHJvcGVydHkgPGVtPkNvbnRleHQgUHJvcGVydHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRleHQgUHJvcGVydHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbnRleHRQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29udGV4dFByb3BlcnR5KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRhYmxlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMy5FY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlI2dldFhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zX1RhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLlhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fMl8zI2dldFRhYmxlIDxlbT5UYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUYWJsZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmltYXJ5S2V5KEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSNnZXRYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uXzJfM19QcmltYXJ5S2V5KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRQcmltYXJ5S2V5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl8yXzMjZ2V0UHJpbWFyeUtleSA8ZW0+UHJpbWFyeSBLZXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmltYXJ5S2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmltYXJ5S2V5KEJvb2xlYW4gdmFsdWUpOwotCi0JVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKCk7Ci0KLQlib29sZWFuIHRhYmxlVG91Y2hlcyhpbnQgcG9zKTsKLX0gLy8gWG1sVGVuYW50RGlzY3JpbWluYXRvcjJfMwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzQvRGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfNC9EYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI5Mzc0Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfNC9EYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkRhdGFiYXNlIENoYW5nZSBOb3RpZmljYXRpb24gVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSNnZXREYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIERhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05PTkVfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlOT05FKDAsICJOT05FIiwgIk5PTkUiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOVkFMSURBVElPTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTlZBTElEQVRJT05fVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlJTlZBTElEQVRJT04oMSwgIklOVkFMSURBVElPTiIsICJJTlZBTElEQVRJT04iKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9ORQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkVfVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5WQUxJREFUSU9OPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTlZBTElEQVRJT048L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5WQUxJREFUSU9OCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJREFUSU9OX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5EYXRhYmFzZSBDaGFuZ2UgTm90aWZpY2F0aW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBEYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGVbXQotCQl7Ci0JCQlOT05FLAotCQkJSU5WQUxJREFUSU9OLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkRhdGFiYXNlIENoYW5nZSBOb3RpZmljYXRpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PERhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5EYXRhYmFzZSBDaGFuZ2UgTm90aWZpY2F0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCURhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5EYXRhYmFzZSBDaGFuZ2UgTm90aWZpY2F0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCURhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRhdGFiYXNlIENoYW5nZSBOb3RpZmljYXRpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSBnZXQoaW50IHZhbHVlKQotCXsKLQkJc3dpdGNoICh2YWx1ZSkKLQkJewotCQkJY2FzZSBOT05FX1ZBTFVFOiByZXR1cm4gTk9ORTsKLQkJCWNhc2UgSU5WQUxJREFUSU9OX1ZBTFVFOiByZXR1cm4gSU5WQUxJREFUSU9OOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpCi0JewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKLQl7Ci0JICByZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCQotfSAvL0RhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzQvRWNsaXBzZUxpbmsyXzQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml80L0VjbGlwc2VMaW5rMl80LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MDAwYjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzQvRWNsaXBzZUxpbmsyXzQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmsyXzI7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rMl80Ci0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMgotewotCVN0cmluZyBTQ0hFTUFfTkFNRVNQQUNFID0gRWNsaXBzZUxpbmsuU0NIRU1BX05BTUVTUEFDRTsKLQlTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMl80LnhzZCI7Ci0JU3RyaW5nIFNDSEVNQV9WRVJTSU9OCT0gIjIuNCI7Ci0KLQkvLyBFY2xpcHNlTGluayAyLjQgc3BlY2lmaWMgbm9kZXMKLQlTdHJpbmcgQ0FDSEVfX0RBVEFCQVNFX0NIQU5HRV9OT1RJRklDQVRJT05fVFlQRSA9ICJkYXRhYmFzZS1jaGFuZ2Utbm90aWZpY2F0aW9uLXR5cGUiOwotCVN0cmluZyBDQUNIRV9JTkRFWCA9ICJjYWNoZS1pbmRleCI7Ci0JCVN0cmluZyBDQUNIRV9JTkRFWF9fQ09MVU1OX05BTUUgPSAiY29sdW1uLW5hbWUiOwotCVN0cmluZyBERUxFVEVfQUxMID0gImRlbGV0ZS1hbGwiOwotCVN0cmluZyBNVUxUSVRFTkFOVF9fSU5DTFVERV9DUklURVJJQSA9ICJpbmNsdWRlLWNyaXRlcmlhIjsKLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzQvRWNsaXBzZUxpbmtPcm1WMl80RmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzQvRWNsaXBzZUxpbmtPcm1WMl80RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODgyZTg1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml80L0VjbGlwc2VMaW5rT3JtVjJfNEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVYyXzRGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnlJbXBsCi17Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVjbGlwc2VMaW5rT3JtVjJfNEZhY3RvcnkgZUlOU1RBTkNFID0gaW5pdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1WMl80RmFjdG9yeSBpbml0KCkKLQl7Ci0JCXRyeQotCQl7Ci0JCQlFY2xpcHNlTGlua09ybVYyXzRGYWN0b3J5IHRoZUVjbGlwc2VMaW5rT3JtVjJfNEZhY3RvcnkgPSAoRWNsaXBzZUxpbmtPcm1WMl80RmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgianB0LmVjbGlwc2VsaW5rLm9ybS52Ml80LnhtaSIpOyAKLQkJCWlmICh0aGVFY2xpcHNlTGlua09ybVYyXzRGYWN0b3J5ICE9IG51bGwpCi0JCQl7Ci0JCQkJcmV0dXJuIHRoZUVjbGlwc2VMaW5rT3JtVjJfNEZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pCi0JCXsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1WMl80RmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtVjJfNEZhY3RvcnkoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykKLQl7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKQotCQl7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UuREFUQUJBU0VfQ0hBTkdFX05PVElGSUNBVElPTl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVEYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5EQVRBQkFTRV9DSEFOR0VfTk9USUZJQ0FUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnREYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSBjcmVhdGVEYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlEYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUgcmVzdWx0ID0gRGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnREYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlIGdldEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UoKQotCXsKLQkJcmV0dXJuIChFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSBnZXRQYWNrYWdlKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9FY2xpcHNlTGlua09ybVYyXzRGYWN0b3J5CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfNC9FY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfNC9FY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNGI1OGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzQvRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQ29tbW9uUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmtPcm1WMl80RmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2VJbXBsCi17Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTkFNRSA9ICJ2Ml80IjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5TX1VSSSA9ICJqcHQuZWNsaXBzZWxpbmsub3JtLnYyXzQueG1pIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80IjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbE11bHRpdGVuYW50XzJfNCA8ZW0+WG1sIE11bHRpdGVuYW50IDI0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbE11bHRpdGVuYW50XzJfNAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UjZ2V0WG1sTXVsdGl0ZW5hbnRfMl80KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01VTFRJVEVOQU5UXzI0ID0gNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfNCA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyNDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sT25lVG9NYW55XzJfNCA8ZW0+WG1sIE9uZSBUbyBNYW55IDI0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbE9uZVRvTWFueV8yXzQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlI2dldFhtbE9uZVRvTWFueV8yXzQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjQgPSA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sRW50aXR5XzJfNCA8ZW0+WG1sIEVudGl0eSAyNDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxFbnRpdHlfMl80Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSNnZXRYbWxFbnRpdHlfMl80KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yNCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxCYXNpY18yXzQgPGVtPlhtbCBCYXNpYyAyNDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxCYXNpY18yXzQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlI2dldFhtbEJhc2ljXzJfNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ18yNCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGUgSW5kZXg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ18yNF9fQ0FDSEVfSU5ERVggPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBCYXNpYyAyNDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ18yNF9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbENhY2hlXzJfNCA8ZW0+WG1sIENhY2hlIDI0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbENhY2hlXzJfNAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UjZ2V0WG1sQ2FjaGVfMl80KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFXzI0ID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhYmFzZSBDaGFuZ2UgTm90aWZpY2F0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV8yNF9fREFUQUJBU0VfQ0hBTkdFX05PVElGSUNBVElPTl9UWVBFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ2FjaGUgMjQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVfMjRfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxDYWNoZUluZGV4XzJfNCA8ZW0+WG1sIENhY2hlIEluZGV4IDI0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbENhY2hlSW5kZXhfMl80Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSNnZXRYbWxDYWNoZUluZGV4XzJfNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9JTkRFWF8yNCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9JTkRFWF8yNF9fQ09MVU1OX05BTUVTID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ2FjaGUgSW5kZXggMjQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVfSU5ERVhfMjRfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVsZXRlIEFsbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yNF9fREVMRVRFX0FMTCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyNDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjRfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGUgSW5kZXg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjRfX0NBQ0hFX0lOREVYID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRW50aXR5IDI0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yNF9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbElkXzJfNCA8ZW0+WG1sIElkIDI0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbElkXzJfNAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UjZ2V0WG1sSWRfMl80KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEXzI0ID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWNoZSBJbmRleDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEXzI0X19DQUNIRV9JTkRFWCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIElkIDI0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEXzI0X0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzQgPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzcyAyNDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfNAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjQgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhY2hlIEluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjRfX0NBQ0hFX0lOREVYID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMjQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjRfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZSBDcml0ZXJpYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01VTFRJVEVOQU5UXzI0X19JTkNMVURFX0NSSVRFUklBID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTXVsdGl0ZW5hbnQgMjQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVMVElURU5BTlRfMjRfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVsZXRlIEFsbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzI0X19ERUxFVEVfQUxMID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT25lIFRvIE1hbnkgMjQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjRfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5EYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUgPGVtPkRhdGFiYXNlIENoYW5nZSBOb3RpZmljYXRpb24gVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkRhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UjZ2V0RGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREFUQUJBU0VfQ0hBTkdFX05PVElGSUNBVElPTl9UWVBFID0gOTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE11bHRpdGVuYW50XzJfNEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sT25lVG9NYW55XzJfNEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbnRpdHlfMl80RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEJhc2ljXzJfNEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDYWNoZV8yXzRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQ2FjaGVJbmRleF8yXzRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sSWRfMl80RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE1hcHBlZFN1cGVyY2xhc3NfMl80RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gZGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UoKQotCXsKLQkJc3VwZXIoZU5TX1VSSSwgRWNsaXBzZUxpbmtPcm1WMl80RmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KLQkgKiAKLQkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCi0JICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UgaW5pdCgpCi0JewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUVjbGlwc2VMaW5rT3JtUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1QYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lTlNfVVJJKSA6IEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lTlNfVVJJKSA6IEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lTlNfVVJJKSA6IEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lTlNfVVJJKSA6IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVYyXzNQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8zUGFja2FnZS5lTlNfVVJJKSA6IEVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfM1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZS5mcmVlemUoKTsKLQotICAKLQkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCi0JCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChFY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlLmVOU19VUkksIHRoZUVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UpOwotCQlyZXR1cm4gdGhlRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxNdWx0aXRlbmFudF8yXzQgPGVtPlhtbCBNdWx0aXRlbmFudCAyNDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTXVsdGl0ZW5hbnQgMjQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sTXVsdGl0ZW5hbnRfMl80Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTXVsdGl0ZW5hbnRfMl80KCkKLQl7Ci0JCXJldHVybiB4bWxNdWx0aXRlbmFudF8yXzRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sTXVsdGl0ZW5hbnRfMl80I2dldEluY2x1ZGVDcml0ZXJpYSA8ZW0+SW5jbHVkZSBDcml0ZXJpYTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluY2x1ZGUgQ3JpdGVyaWE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sTXVsdGl0ZW5hbnRfMl80I2dldEluY2x1ZGVDcml0ZXJpYSgpCi0JICogQHNlZSAjZ2V0WG1sTXVsdGl0ZW5hbnRfMl80KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTXVsdGl0ZW5hbnRfMl80X0luY2x1ZGVDcml0ZXJpYSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sTXVsdGl0ZW5hbnRfMl80RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfNCA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyNDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDI0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfNAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfNCgpCi0JewotCQlyZXR1cm4geG1sRWxlbWVudENvbGxlY3Rpb25fMl80RUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sRWxlbWVudENvbGxlY3Rpb25fMl80I2lzRGVsZXRlQWxsIDxlbT5EZWxldGUgQWxsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVsZXRlIEFsbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzQjaXNEZWxldGVBbGwoKQotCSAqIEBzZWUgI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfNF9EZWxldGVBbGwoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfNEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbE9uZVRvTWFueV8yXzQgPGVtPlhtbCBPbmUgVG8gTWFueSAyNDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT25lIFRvIE1hbnkgMjQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sT25lVG9NYW55XzJfNAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE9uZVRvTWFueV8yXzQoKQotCXsKLQkJcmV0dXJuIHhtbE9uZVRvTWFueV8yXzRFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxPbmVUb01hbnlfMl80I2lzRGVsZXRlQWxsIDxlbT5EZWxldGUgQWxsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVsZXRlIEFsbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxPbmVUb01hbnlfMl80I2lzRGVsZXRlQWxsKCkKLQkgKiBAc2VlICNnZXRYbWxPbmVUb01hbnlfMl80KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sT25lVG9NYW55XzJfNF9EZWxldGVBbGwoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE9uZVRvTWFueV8yXzRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxFbnRpdHlfMl80IDxlbT5YbWwgRW50aXR5IDI0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbnRpdHkgMjQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sRW50aXR5XzJfNAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVudGl0eV8yXzQoKQotCXsKLQkJcmV0dXJuIHhtbEVudGl0eV8yXzRFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxFbnRpdHlfMl80I2dldENhY2hlSW5kZXggPGVtPkNhY2hlIEluZGV4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q2FjaGUgSW5kZXg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sRW50aXR5XzJfNCNnZXRDYWNoZUluZGV4KCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlfMl80KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5XzJfNF9DYWNoZUluZGV4KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlfMl80RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sQmFzaWNfMl80IDxlbT5YbWwgQmFzaWMgMjQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEJhc2ljIDI0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbEJhc2ljXzJfNAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEJhc2ljXzJfNCgpCi0JewotCQlyZXR1cm4geG1sQmFzaWNfMl80RUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sQmFzaWNfMl80I2dldENhY2hlSW5kZXggPGVtPkNhY2hlIEluZGV4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q2FjaGUgSW5kZXg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sQmFzaWNfMl80I2dldENhY2hlSW5kZXgoKQotCSAqIEBzZWUgI2dldFhtbEJhc2ljXzJfNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEJhc2ljXzJfNF9DYWNoZUluZGV4KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxCYXNpY18yXzRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxDYWNoZV8yXzQgPGVtPlhtbCBDYWNoZSAyNDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ2FjaGUgMjQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sQ2FjaGVfMl80Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ2FjaGVfMl80KCkKLQl7Ci0JCXJldHVybiB4bWxDYWNoZV8yXzRFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxDYWNoZV8yXzQjZ2V0RGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlIDxlbT5EYXRhYmFzZSBDaGFuZ2UgTm90aWZpY2F0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EYXRhYmFzZSBDaGFuZ2UgTm90aWZpY2F0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sQ2FjaGVfMl80I2dldERhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sQ2FjaGVfMl80KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ2FjaGVfMl80X0RhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ2FjaGVfMl80RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sQ2FjaGVJbmRleF8yXzQgPGVtPlhtbCBDYWNoZSBJbmRleCAyNDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ2FjaGUgSW5kZXggMjQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sQ2FjaGVJbmRleF8yXzQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDYWNoZUluZGV4XzJfNCgpCi0JewotCQlyZXR1cm4geG1sQ2FjaGVJbmRleF8yXzRFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbENhY2hlSW5kZXhfMl80I2dldENvbHVtbk5hbWVzIDxlbT5Db2x1bW4gTmFtZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkNvbHVtbiBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxDYWNoZUluZGV4XzJfNCNnZXRDb2x1bW5OYW1lcygpCi0JICogQHNlZSAjZ2V0WG1sQ2FjaGVJbmRleF8yXzQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDYWNoZUluZGV4XzJfNF9Db2x1bW5OYW1lcygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ2FjaGVJbmRleF8yXzRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxJZF8yXzQgPGVtPlhtbCBJZCAyNDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgSWQgMjQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sSWRfMl80Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sSWRfMl80KCkKLQl7Ci0JCXJldHVybiB4bWxJZF8yXzRFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxJZF8yXzQjZ2V0Q2FjaGVJbmRleCA8ZW0+Q2FjaGUgSW5kZXg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5DYWNoZSBJbmRleDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxJZF8yXzQjZ2V0Q2FjaGVJbmRleCgpCi0JICogQHNlZSAjZ2V0WG1sSWRfMl80KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sSWRfMl80X0NhY2hlSW5kZXgoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbElkXzJfNEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbE1hcHBlZFN1cGVyY2xhc3NfMl80IDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMjQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDI0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbE1hcHBlZFN1cGVyY2xhc3NfMl80Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzQoKQotCXsKLQkJcmV0dXJuIHhtbE1hcHBlZFN1cGVyY2xhc3NfMl80RUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzQjZ2V0Q2FjaGVJbmRleCA8ZW0+Q2FjaGUgSW5kZXg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5DYWNoZSBJbmRleDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfNCNnZXRDYWNoZUluZGV4KCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl80X0NhY2hlSW5kZXgoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE1hcHBlZFN1cGVyY2xhc3NfMl80RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5EYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUgPGVtPkRhdGFiYXNlIENoYW5nZSBOb3RpZmljYXRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkRhdGFiYXNlIENoYW5nZSBOb3RpZmljYXRpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5EYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldERhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSgpCi0JewotCQlyZXR1cm4gZGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlRUVudW07Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1WMl80RmFjdG9yeSBnZXRFY2xpcHNlTGlua09ybVYyXzRGYWN0b3J5KCkKLQl7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtPcm1WMl80RmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCXhtbEJhc2ljXzJfNEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQkFTSUNfMjQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEJhc2ljXzJfNEVDbGFzcywgWE1MX0JBU0lDXzI0X19DQUNIRV9JTkRFWCk7Ci0KLQkJeG1sQ2FjaGVfMl80RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DQUNIRV8yNCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2FjaGVfMl80RUNsYXNzLCBYTUxfQ0FDSEVfMjRfX0RBVEFCQVNFX0NIQU5HRV9OT1RJRklDQVRJT05fVFlQRSk7Ci0KLQkJeG1sQ2FjaGVJbmRleF8yXzRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0NBQ0hFX0lOREVYXzI0KTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDYWNoZUluZGV4XzJfNEVDbGFzcywgWE1MX0NBQ0hFX0lOREVYXzI0X19DT0xVTU5fTkFNRVMpOwotCi0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfNEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzI0KTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzRFQ2xhc3MsIFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjRfX0RFTEVURV9BTEwpOwotCi0JCXhtbEVudGl0eV8yXzRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VOVElUWV8yNCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5XzJfNEVDbGFzcywgWE1MX0VOVElUWV8yNF9fQ0FDSEVfSU5ERVgpOwotCi0JCXhtbElkXzJfNEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfSURfMjQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbElkXzJfNEVDbGFzcywgWE1MX0lEXzI0X19DQUNIRV9JTkRFWCk7Ci0KLQkJeG1sTWFwcGVkU3VwZXJjbGFzc18yXzRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BUFBFRF9TVVBFUkNMQVNTXzI0KTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBwZWRTdXBlcmNsYXNzXzJfNEVDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzI0X19DQUNIRV9JTkRFWCk7Ci0KLQkJeG1sTXVsdGl0ZW5hbnRfMl80RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NVUxUSVRFTkFOVF8yNCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTXVsdGl0ZW5hbnRfMl80RUNsYXNzLCBYTUxfTVVMVElURU5BTlRfMjRfX0lOQ0xVREVfQ1JJVEVSSUEpOwotCi0JCXhtbE9uZVRvTWFueV8yXzRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX09ORV9UT19NQU5ZXzI0KTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxPbmVUb01hbnlfMl80RUNsYXNzLCBYTUxfT05FX1RPX01BTllfMjRfX0RFTEVURV9BTEwpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQlkYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKERBVEFCQVNFX0NIQU5HRV9OT1RJRklDQVRJT05fVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQl7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJWE1MVHlwZVBhY2thZ2UgdGhlWE1MVHlwZVBhY2thZ2UgPSAoWE1MVHlwZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoWE1MVHlwZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKHhtbEJhc2ljXzJfNEVDbGFzcywgWG1sQmFzaWNfMl80LmNsYXNzLCAiWG1sQmFzaWNfMl80IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQmFzaWNfMl80X0NhY2hlSW5kZXgoKSwgdGhpcy5nZXRYbWxDYWNoZUluZGV4XzJfNCgpLCBudWxsLCAiY2FjaGVJbmRleCIsIG51bGwsIDAsIDEsIFhtbEJhc2ljXzJfNC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbENhY2hlXzJfNEVDbGFzcywgWG1sQ2FjaGVfMl80LmNsYXNzLCAiWG1sQ2FjaGVfMl80IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2FjaGVfMl80X0RhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSgpLCB0aGlzLmdldERhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSgpLCAiZGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlIiwgIiIsIDAsIDEsIFhtbENhY2hlXzJfNC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbENhY2hlSW5kZXhfMl80RUNsYXNzLCBYbWxDYWNoZUluZGV4XzJfNC5jbGFzcywgIlhtbENhY2hlSW5kZXhfMl80IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2FjaGVJbmRleF8yXzRfQ29sdW1uTmFtZXMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb2x1bW5OYW1lcyIsIG51bGwsIDAsIC0xLCBYbWxDYWNoZUluZGV4XzJfNC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzRFQ2xhc3MsIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfNC5jbGFzcywgIlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfNCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfNF9EZWxldGVBbGwoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiZGVsZXRlQWxsIiwgbnVsbCwgMCwgMSwgWG1sRWxlbWVudENvbGxlY3Rpb25fMl80LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sRW50aXR5XzJfNEVDbGFzcywgWG1sRW50aXR5XzJfNC5jbGFzcywgIlhtbEVudGl0eV8yXzQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfMl80X0NhY2hlSW5kZXgoKSwgdGhpcy5nZXRYbWxDYWNoZUluZGV4XzJfNCgpLCBudWxsLCAiY2FjaGVJbmRleCIsIG51bGwsIDAsIDEsIFhtbEVudGl0eV8yXzQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxJZF8yXzRFQ2xhc3MsIFhtbElkXzJfNC5jbGFzcywgIlhtbElkXzJfNCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbElkXzJfNF9DYWNoZUluZGV4KCksIHRoaXMuZ2V0WG1sQ2FjaGVJbmRleF8yXzQoKSwgbnVsbCwgImNhY2hlSW5kZXgiLCBudWxsLCAwLCAxLCBYbWxJZF8yXzQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNYXBwZWRTdXBlcmNsYXNzXzJfNEVDbGFzcywgWG1sTWFwcGVkU3VwZXJjbGFzc18yXzQuY2xhc3MsICJYbWxNYXBwZWRTdXBlcmNsYXNzXzJfNCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl80X0NhY2hlSW5kZXgoKSwgdGhpcy5nZXRYbWxDYWNoZUluZGV4XzJfNCgpLCBudWxsLCAiY2FjaGVJbmRleCIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3NfMl80LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sTXVsdGl0ZW5hbnRfMl80RUNsYXNzLCBYbWxNdWx0aXRlbmFudF8yXzQuY2xhc3MsICJYbWxNdWx0aXRlbmFudF8yXzQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxNdWx0aXRlbmFudF8yXzRfSW5jbHVkZUNyaXRlcmlhKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgImluY2x1ZGVDcml0ZXJpYSIsIG51bGwsIDAsIDEsIFhtbE11bHRpdGVuYW50XzJfNC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE9uZVRvTWFueV8yXzRFQ2xhc3MsIFhtbE9uZVRvTWFueV8yXzQuY2xhc3MsICJYbWxPbmVUb01hbnlfMl80IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sT25lVG9NYW55XzJfNF9EZWxldGVBbGwoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiZGVsZXRlQWxsIiwgbnVsbCwgMCwgMSwgWG1sT25lVG9NYW55XzJfNC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0oZGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlRUVudW0sIERhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZS5jbGFzcywgIkRhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoZGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlRUVudW0sIERhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZS5OT05FKTsKLQkJYWRkRUVudW1MaXRlcmFsKGRhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZUVFbnVtLCBEYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUuSU5WQUxJREFUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIExpdGVyYWxzCi0JewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxNdWx0aXRlbmFudF8yXzQgPGVtPlhtbCBNdWx0aXRlbmFudCAyNDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxNdWx0aXRlbmFudF8yXzQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSNnZXRYbWxNdWx0aXRlbmFudF8yXzQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTVVMVElURU5BTlRfMjQgPSBlSU5TVEFOQ0UuZ2V0WG1sTXVsdGl0ZW5hbnRfMl80KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlIENyaXRlcmlhPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTVVMVElURU5BTlRfMjRfX0lOQ0xVREVfQ1JJVEVSSUEgPSBlSU5TVEFOQ0UuZ2V0WG1sTXVsdGl0ZW5hbnRfMl80X0luY2x1ZGVDcml0ZXJpYSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfNCA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyNDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzI0ID0gZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfNCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVsZXRlIEFsbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yNF9fREVMRVRFX0FMTCA9IGVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzRfRGVsZXRlQWxsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sT25lVG9NYW55XzJfNCA8ZW0+WG1sIE9uZSBUbyBNYW55IDI0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbE9uZVRvTWFueV8yXzQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSNnZXRYbWxPbmVUb01hbnlfMl80KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX09ORV9UT19NQU5ZXzI0ID0gZUlOU1RBTkNFLmdldFhtbE9uZVRvTWFueV8yXzQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlbGV0ZSBBbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9PTkVfVE9fTUFOWV8yNF9fREVMRVRFX0FMTCA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnlfMl80X0RlbGV0ZUFsbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbEVudGl0eV8yXzQgPGVtPlhtbCBFbnRpdHkgMjQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sRW50aXR5XzJfNAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlI2dldFhtbEVudGl0eV8yXzQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU5USVRZXzI0ID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhY2hlIEluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZXzI0X19DQUNIRV9JTkRFWCA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMl80X0NhY2hlSW5kZXgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxCYXNpY18yXzQgPGVtPlhtbCBCYXNpYyAyNDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxCYXNpY18yXzQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSNnZXRYbWxCYXNpY18yXzQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQkFTSUNfMjQgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfMl80KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYWNoZSBJbmRleDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0JBU0lDXzI0X19DQUNIRV9JTkRFWCA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY18yXzRfQ2FjaGVJbmRleCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbENhY2hlXzJfNCA8ZW0+WG1sIENhY2hlIDI0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbENhY2hlXzJfNAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlI2dldFhtbENhY2hlXzJfNCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DQUNIRV8yNCA9IGVJTlNUQU5DRS5nZXRYbWxDYWNoZV8yXzQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRhdGFiYXNlIENoYW5nZSBOb3RpZmljYXRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NBQ0hFXzI0X19EQVRBQkFTRV9DSEFOR0VfTk9USUZJQ0FUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfMl80X0RhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbENhY2hlSW5kZXhfMl80IDxlbT5YbWwgQ2FjaGUgSW5kZXggMjQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sQ2FjaGVJbmRleF8yXzQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSNnZXRYbWxDYWNoZUluZGV4XzJfNCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DQUNIRV9JTkRFWF8yNCA9IGVJTlNUQU5DRS5nZXRYbWxDYWNoZUluZGV4XzJfNCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DQUNIRV9JTkRFWF8yNF9fQ09MVU1OX05BTUVTID0gZUlOU1RBTkNFLmdldFhtbENhY2hlSW5kZXhfMl80X0NvbHVtbk5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sSWRfMl80IDxlbT5YbWwgSWQgMjQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sSWRfMl80Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UjZ2V0WG1sSWRfMl80KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0lEXzI0ID0gZUlOU1RBTkNFLmdldFhtbElkXzJfNCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGUgSW5kZXg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9JRF8yNF9fQ0FDSEVfSU5ERVggPSBlSU5TVEFOQ0UuZ2V0WG1sSWRfMl80X0NhY2hlSW5kZXgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfNCA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDI0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbE1hcHBlZFN1cGVyY2xhc3NfMl80Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjQgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhY2hlIEluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjRfX0NBQ0hFX0lOREVYID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl80X0NhY2hlSW5kZXgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5EYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUgPGVtPkRhdGFiYXNlIENoYW5nZSBOb3RpZmljYXRpb24gVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkRhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlI2dldERhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gREFUQUJBU0VfQ0hBTkdFX05PVElGSUNBVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldERhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSgpOwotCi0JfQotCi19IC8vRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzQvWG1sQmFzaWNfMl80LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfNC9YbWxCYXNpY18yXzQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIxYzMzMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfNC9YbWxCYXNpY18yXzQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQmFzaWMgMjQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbEJhc2ljXzJfNCNnZXRDYWNoZUluZGV4IDxlbT5DYWNoZSBJbmRleDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UjZ2V0WG1sQmFzaWNfMl80KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxCYXNpY18yXzQgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FjaGUgSW5kZXg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhY2hlIEluZGV4PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlIEluZGV4PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDYWNoZUluZGV4KFhtbENhY2hlSW5kZXhfMl80KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UjZ2V0WG1sQmFzaWNfMl80X0NhY2hlSW5kZXgoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sQ2FjaGVJbmRleF8yXzQgZ2V0Q2FjaGVJbmRleCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbEJhc2ljXzJfNCNnZXRDYWNoZUluZGV4IDxlbT5DYWNoZSBJbmRleDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgSW5kZXg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhY2hlSW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhY2hlSW5kZXgoWG1sQ2FjaGVJbmRleF8yXzQgdmFsdWUpOwotCi19IC8vIFhtbEJhc2ljXzJfNApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzQvWG1sQ2FjaGVJbmRleF8yXzQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml80L1htbENhY2hlSW5kZXhfMl80LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YTEyOTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzQvWG1sQ2FjaGVJbmRleF8yXzQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ2FjaGUgSW5kZXggMjQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbENhY2hlSW5kZXhfMl80I2dldENvbHVtbk5hbWVzIDxlbT5Db2x1bW4gTmFtZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlI2dldFhtbENhY2hlSW5kZXhfMl80KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxDYWNoZUluZGV4XzJfNCBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW4gTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbHVtbiBOYW1lczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbiBOYW1lczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlI2dldFhtbENhY2hlSW5kZXhfMl80X0NvbHVtbk5hbWVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0Q29sdW1uTmFtZXMoKTsKLQotfSAvLyBYbWxDYWNoZUluZGV4XzJfNApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzQvWG1sQ2FjaGVfMl80LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfNC9YbWxDYWNoZV8yXzQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ1YzAzYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfNC9YbWxDYWNoZV8yXzQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ2FjaGUyIDQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbENhY2hlXzJfNCNnZXREYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUgPGVtPkRhdGFiYXNlIENoYW5nZSBOb3RpZmljYXRpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UjZ2V0WG1sQ2FjaGVfMl80KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxDYWNoZV8yXzQgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGF0YWJhc2UgQ2hhbmdlIE5vdGlmaWNhdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5EYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF0YWJhc2UgQ2hhbmdlIE5vdGlmaWNhdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRhdGFiYXNlIENoYW5nZSBOb3RpZmljYXRpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlCi0JICogQHNlZSAjc2V0RGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlKERhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlI2dldFhtbENhY2hlXzJfNF9EYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURhdGFiYXNlQ2hhbmdlTm90aWZpY2F0aW9uVHlwZSBnZXREYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxDYWNoZV8yXzQjZ2V0RGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlIDxlbT5EYXRhYmFzZSBDaGFuZ2UgTm90aWZpY2F0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRhdGFiYXNlIENoYW5nZSBOb3RpZmljYXRpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlCi0JICogQHNlZSAjZ2V0RGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREYXRhYmFzZUNoYW5nZU5vdGlmaWNhdGlvblR5cGUoRGF0YWJhc2VDaGFuZ2VOb3RpZmljYXRpb25UeXBlIHZhbHVlKTsKLQotfSAvLyBYbWxDYWNoZTJfNApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzQvWG1sRWxlbWVudENvbGxlY3Rpb25fMl80LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfNC9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU2NGIyYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfNC9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDI0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzQjaXNEZWxldGVBbGwgPGVtPkRlbGV0ZSBBbGw8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfNCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRWxlbWVudENvbGxlY3Rpb25fMl80IGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlbGV0ZSBBbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlbGV0ZSBBbGw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsZXRlIEFsbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVsZXRlQWxsKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzRfRGVsZXRlQWxsKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRGVsZXRlQWxsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sRWxlbWVudENvbGxlY3Rpb25fMl80I2lzRGVsZXRlQWxsIDxlbT5EZWxldGUgQWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWxldGUgQWxsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0RlbGV0ZUFsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVsZXRlQWxsKGJvb2xlYW4gdmFsdWUpOwotCi19IC8vIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfNApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzQvWG1sRW50aXR5XzJfNC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzQvWG1sRW50aXR5XzJfNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDdhNDE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml80L1htbEVudGl0eV8yXzQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRW50aXR5IDI0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxFbnRpdHlfMl80I2dldENhY2hlSW5kZXggPGVtPkNhY2hlIEluZGV4PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuRWNsaXBzZUxpbmtPcm1WMl80UGFja2FnZSNnZXRYbWxFbnRpdHlfMl80KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbnRpdHlfMl80IGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhY2hlIEluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYWNoZSBJbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZSBJbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2FjaGVJbmRleChYbWxDYWNoZUluZGV4XzJfNCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlI2dldFhtbEVudGl0eV8yXzRfQ2FjaGVJbmRleCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxDYWNoZUluZGV4XzJfNCBnZXRDYWNoZUluZGV4KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sRW50aXR5XzJfNCNnZXRDYWNoZUluZGV4IDxlbT5DYWNoZSBJbmRleDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgSW5kZXg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhY2hlSW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhY2hlSW5kZXgoWG1sQ2FjaGVJbmRleF8yXzQgdmFsdWUpOwotCi19IC8vIFhtbEVudGl0eV8yXzQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml80L1htbElkXzJfNC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzQvWG1sSWRfMl80LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMTA4YTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzQvWG1sSWRfMl80LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIElkIDI0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxJZF8yXzQjZ2V0Q2FjaGVJbmRleCA8ZW0+Q2FjaGUgSW5kZXg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlI2dldFhtbElkXzJfNCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sSWRfMl80IGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhY2hlIEluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYWNoZSBJbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZSBJbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2FjaGVJbmRleChYbWxDYWNoZUluZGV4XzJfNCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlI2dldFhtbElkXzJfNF9DYWNoZUluZGV4KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbENhY2hlSW5kZXhfMl80IGdldENhY2hlSW5kZXgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxJZF8yXzQjZ2V0Q2FjaGVJbmRleCA8ZW0+Q2FjaGUgSW5kZXg8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlIEluZGV4PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDYWNoZUluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYWNoZUluZGV4KFhtbENhY2hlSW5kZXhfMl80IHZhbHVlKTsKLQotfSAvLyBYbWxJZF8yXzQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml80L1htbE1hcHBlZFN1cGVyY2xhc3NfMl80LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfNC9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjNlNGY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml80L1htbE1hcHBlZFN1cGVyY2xhc3NfMl80LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDI0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfNCNnZXRDYWNoZUluZGV4IDxlbT5DYWNoZSBJbmRleDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzQoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE1hcHBlZFN1cGVyY2xhc3NfMl80IGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhY2hlIEluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYWNoZSBJbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZSBJbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2FjaGVJbmRleChYbWxDYWNoZUluZGV4XzJfNCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl80X0NhY2hlSW5kZXgoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sQ2FjaGVJbmRleF8yXzQgZ2V0Q2FjaGVJbmRleCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LlhtbE1hcHBlZFN1cGVyY2xhc3NfMl80I2dldENhY2hlSW5kZXggPGVtPkNhY2hlIEluZGV4PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZSBJbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2FjaGVJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2FjaGVJbmRleChYbWxDYWNoZUluZGV4XzJfNCB2YWx1ZSk7Ci0KLX0gLy8gWG1sTWFwcGVkU3VwZXJjbGFzc18yXzQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml80L1htbE11bHRpdGVuYW50XzJfNC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzQvWG1sTXVsdGl0ZW5hbnRfMl80LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNzU1YTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzQvWG1sTXVsdGl0ZW5hbnRfMl80LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNdWx0aXRlbmFudCAyNDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sTXVsdGl0ZW5hbnRfMl80I2dldEluY2x1ZGVDcml0ZXJpYSA8ZW0+SW5jbHVkZSBDcml0ZXJpYTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UjZ2V0WG1sTXVsdGl0ZW5hbnRfMl80KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNdWx0aXRlbmFudF8yXzQgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5jbHVkZSBDcml0ZXJpYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5jbHVkZSBDcml0ZXJpYTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmNsdWRlIENyaXRlcmlhPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJbmNsdWRlQ3JpdGVyaWEoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5FY2xpcHNlTGlua09ybVYyXzRQYWNrYWdlI2dldFhtbE11bHRpdGVuYW50XzJfNF9JbmNsdWRlQ3JpdGVyaWEoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0SW5jbHVkZUNyaXRlcmlhKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sTXVsdGl0ZW5hbnRfMl80I2dldEluY2x1ZGVDcml0ZXJpYSA8ZW0+SW5jbHVkZSBDcml0ZXJpYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5jbHVkZSBDcml0ZXJpYTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SW5jbHVkZUNyaXRlcmlhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbmNsdWRlQ3JpdGVyaWEoQm9vbGVhbiB2YWx1ZSk7Ci0KLQlUZXh0UmFuZ2UgZ2V0SW5jbHVkZUNyaXRlcmlhVGV4dFJhbmdlKCk7Ci0KLX0gLy8gWG1sTXVsdGl0ZW5hbnRfMl80CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfNC9YbWxPbmVUb01hbnlfMl80LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfNC9YbWxPbmVUb01hbnlfMl80LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3Y2QzODIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzQvWG1sT25lVG9NYW55XzJfNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBPbmUgVG8gTWFueSAyNDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzQuWG1sT25lVG9NYW55XzJfNCNpc0RlbGV0ZUFsbCA8ZW0+RGVsZXRlIEFsbDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfNCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sT25lVG9NYW55XzJfNCBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWxldGUgQWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWxldGUgQWxsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlbGV0ZSBBbGw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlbGV0ZUFsbChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml80LkVjbGlwc2VMaW5rT3JtVjJfNFBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfNF9EZWxldGVBbGwoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNEZWxldGVBbGwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfNC5YbWxPbmVUb01hbnlfMl80I2lzRGVsZXRlQWxsIDxlbT5EZWxldGUgQWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWxldGUgQWxsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0RlbGV0ZUFsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVsZXRlQWxsKGJvb2xlYW4gdmFsdWUpOwotCi19IC8vIFhtbE9uZVRvTWFueV8yXzQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk5MDIxMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvanBhL3VpLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanN0LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3MzEzNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjAyNGZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDk6MjAgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg4MzQwMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMi4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLkpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5jb21tb247YnVuZGxlLXZlcnNpb249IlsyLjguMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjguMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4xLjEwMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjguMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5kYjtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbjtidW5kbGUtdmVyc2lvbj0iWzIuMS4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuNjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjguMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkudmlld3M7YnVuZGxlLXZlcnNpb249IlszLjYuMTAwLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjIuMTAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWksCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29tbWFuZHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRkbGdlbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGRsZ2VuLndpemFyZHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRpYWxvZ3M7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmVudGl0eS5kYXRhLm1vZGVsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5lbnRpdHkuZGF0YS5vcGVyYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmhhbmRsZXJzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZ2VuZXJhbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UubG9nZ2luZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNleG1sLmRldGFpbHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UuY2FjaGluZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLmxvZ2dpbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2Uub3B0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2VhdmU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLndpemFyZHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLndpemFyZHMuY29udmVyc2lvbi5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzLmdlbjt4LWludGVybmFsOj10cnVlCi1JbXBvcnQtUGFja2FnZTogY29tLmlibS5pY3UudGV4dDt2ZXJzaW9uPSI0LjAuMSIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGE2MmU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmRmZGZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXBsdWdpbk5hbWU9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQgLSBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLWVjbGlwc2VMaW5rV2l6YXJkQ2F0ZWdvcnlOYW1lPUVjbGlwc2VMaW5rCi1uZXdFY2xpcHNlTGlua01hcHBpbmdGaWxlV2l6YXJkTmFtZT1FY2xpcHNlTGluayBPUk0gTWFwcGluZyBGaWxlCi1uZXdFY2xpcHNlTGlua0pwYU1hcHBpbmdGaWxlV2l6YXJkRGVzYz1DcmVhdGUgYW4gRWNsaXBzZUxpbmsgT1JNIG1hcHBpbmcgZmlsZQotbmV3RHluYW1pY0VudGl0eUZyb21UYWJsZVdpemFyZE5hbWU9RHluYW1pYyBFbnRpdGllcyBmcm9tIFRhYmxlcwotbmV3RHluYW1pY0VudGl0eUZyb21UYWJsZVdpemFyZERlc2M9Q3JlYXRlIGR5bmFtaWMgZW50aXRpZXMgZnJvbSBkYXRhYmFzZSB0YWJsZXMKLQotZ2VuZXJhdGVEeW5hbWljRW50aXRpZXM9R2VuZXJhdGUgRHluYW1pYyBFbnRpdGllcyBmcm9tIFRhYmxlcy4uLgotCi1uZXdFY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlOYW1lPUVjbGlwc2VMaW5rIER5bmFtaWMgRW50aXR5Ci1uZXdFY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmREZXNjPUNyZWF0ZSBhbiBFY2xpcHNlTGluayBkeW5hbWljIGVudGl0eQotCi1jb252ZXJ0SmF2YUNvbnZlcnRlcnM9SmF2YSBDb252ZXJ0ZXJzLi4uCi1qcGFOb2RlID0gSlBBCi1lY2xpcHNlTGlua05vZGUgPSBFY2xpcHNlTGluawotCi1hZGRWaXJ0dWFsQXR0cmlidXRlID0gQWRkIFZpcnR1YWwgQXR0cmlidXRlLi4uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9wbHVnaW4ueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzhkNGMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLQotICBDb250cmlidXRvcnM6Ci0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci0KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmpwYVBsYXRmb3JtVWlzIj4KLQkJIAotCQk8anBhUGxhdGZvcm1VaQotCQkJaWQ9Im9yZy5lY2xpcHNlLmVjbGlwc2VsaW5rLnBsYXRmb3JtLnVpIgotCQkJanBhUGxhdGZvcm09Im9yZy5lY2xpcHNlLmVjbGlwc2VsaW5rLnBsYXRmb3JtIgotCQkJZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtLkVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaUZhY3RvcnkiLz4KLQkJCQotCQk8anBhUGxhdGZvcm1VaQotCQkJaWQ9ImVjbGlwc2VsaW5rMV8xLnVpIgotCQkJanBhUGxhdGZvcm09ImVjbGlwc2VsaW5rMV8xIgotCQkJZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtLkVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1VaUZhY3RvcnkiLz4KLQkJCQotCQk8anBhUGxhdGZvcm1VaQotCQkJaWQ9ImVjbGlwc2VsaW5rMV8yLnVpIgotCQkJanBhUGxhdGZvcm09ImVjbGlwc2VsaW5rMV8yIgotCQkJZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtLkVjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1VaUZhY3RvcnkiLz4KLQkJCi0JCTxqcGFQbGF0Zm9ybVVpCi0JCQlpZD0iZWNsaXBzZWxpbmsyXzAudWkiCi0JCQlqcGFQbGF0Zm9ybT0iZWNsaXBzZWxpbmsyXzAiCi0JCQlmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGxhdGZvcm0uRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpRmFjdG9yeSIvPgotCQkKLQkJPGpwYVBsYXRmb3JtVWkKLQkJCWlkPSJlY2xpcHNlbGluazJfMS51aSIKLQkJCWpwYVBsYXRmb3JtPSJlY2xpcHNlbGluazJfMSIKLQkJCWZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybS5FY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtVWlGYWN0b3J5Ii8+Ci0JCQotCQk8anBhUGxhdGZvcm1VaQotCQkJaWQ9ImVjbGlwc2VsaW5rMl8yLnVpIgotCQkJanBhUGxhdGZvcm09ImVjbGlwc2VsaW5rMl8yIgotCQkJZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtLkVjbGlwc2VMaW5rMl8ySnBhUGxhdGZvcm1VaUZhY3RvcnkiLz4KLQkJCi0JCTxqcGFQbGF0Zm9ybVVpCi0JCQlpZD0iZWNsaXBzZWxpbmsyXzMudWkiCi0JCQlqcGFQbGF0Zm9ybT0iZWNsaXBzZWxpbmsyXzMiCi0JCQlmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGxhdGZvcm0uRWNsaXBzZUxpbmsyXzNKcGFQbGF0Zm9ybVVpRmFjdG9yeSIvPgotCQkKLQkJPGpwYVBsYXRmb3JtVWkKLQkJCWlkPSJlY2xpcHNlbGluazJfNC51aSIKLQkJCWpwYVBsYXRmb3JtPSJlY2xpcHNlbGluazJfNCIKLQkJCWZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybS5FY2xpcHNlTGluazJfNEpwYVBsYXRmb3JtVWlGYWN0b3J5Ii8+Ci0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0JCQotCQk8Y2F0ZWdvcnkKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rIgotCQkJbmFtZT0iJWVjbGlwc2VMaW5rV2l6YXJkQ2F0ZWdvcnlOYW1lIgotCQkJcGFyZW50Q2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpwdC5qcGEiLz4KLQkJCi0JCTx3aXphcmQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLndpemFyZC5uZXdFY2xpcHNlTGlua01hcHBpbmdGaWxlIgotCQkJbmFtZT0iJW5ld0VjbGlwc2VMaW5rTWFwcGluZ0ZpbGVXaXphcmROYW1lIgotCQkJaWNvbj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfanBhX2ZpbGVfd2l6LmdpZiIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qcHQuanBhL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsiPgotCQkJPGRlc2NyaXB0aW9uPiVuZXdFY2xpcHNlTGlua0pwYU1hcHBpbmdGaWxlV2l6YXJkRGVzYzwvZGVzY3JpcHRpb24+Ci0JCQk8Y2xhc3MgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5FY2xpcHNlTGlua01hcHBpbmdGaWxlV2l6YXJkIj4gCi0JCQkJPHBhcmFtZXRlciBuYW1lPSJqYXZhZWVhcnRpZmFjdCIgdmFsdWU9InRydWUiLz4gCi0JCQkJPHBhcmFtZXRlciBuYW1lPSJtZW51SW5kZXgiIHZhbHVlPSI0MCIgLz4gCi0JCQkJPHBhcmFtZXRlciBuYW1lPSJqcHRhcnRpZmFjdCIgdmFsdWU9InRydWUiLz4gCi0JCQk8L2NsYXNzPiAKLQkJPC93aXphcmQ+Ci0JCQotCQk8d2l6YXJkCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UuanB0LmpwYS9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5nZW4uR2VuZXJhdGVEeW5hbWljRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkIgotCQkJaWNvbj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfanBhX2ZpbGVfd2l6LmdpZiIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLndpemFyZC5uZXdEeW5hbWljRW50aXRpZXNGcm9tVGFibGVzIgotCQkJbmFtZT0iJW5ld0R5bmFtaWNFbnRpdHlGcm9tVGFibGVXaXphcmROYW1lIj4KLQkJCTxkZXNjcmlwdGlvbj4lbmV3RHluYW1pY0VudGl0eUZyb21UYWJsZVdpemFyZERlc2M8L2Rlc2NyaXB0aW9uPgotCQkJPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIi8+IAotICAgICAgICA8L3dpemFyZD4JCQotCi0gICAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLndpemFyZC5uZXdFY2xpcHNlTGlua0R5bmFtaWNFbnRpdHkiCi0JCQluYW1lPSIlbmV3RWNsaXBzZUxpbmtEeW5hbWljRW50aXR5TmFtZSIKLQkJCWljb249InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3X2VudGl0eV93aXouZ2lmIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpwdC5qcGEvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluayI+Ci0JCQk8ZGVzY3JpcHRpb24+JW5ld0VjbGlwc2VMaW5rRHluYW1pY0VudGl0eVdpemFyZERlc2M8L2Rlc2NyaXB0aW9uPgotCQkJPGNsYXNzIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLndpemFyZHMuRWNsaXBzZUxpbmtEeW5hbWljRW50aXR5V2l6YXJkIj4gCi0JCQkJPHBhcmFtZXRlciBuYW1lPSJqYXZhZWVhcnRpZmFjdCIgdmFsdWU9InRydWUiLz4gCi0JCQkJPHBhcmFtZXRlciBuYW1lPSJtZW51SW5kZXgiIHZhbHVlPSI0MSIgLz4gCi0JCQkJPHBhcmFtZXRlciBuYW1lPSJqcHRhcnRpZmFjdCIgdmFsdWU9InRydWUiLz4gCi0JCQk8L2NsYXNzPiAKLQkJPC93aXphcmQ+Ci0JCSAgICAKLQk8L2V4dGVuc2lvbj4KLQotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLm5hdmlnYXRvckNvbnRlbnQiPgotCQkKLQkJPGNvbW1vbldpemFyZAotCQkJbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkiCi0JCQl0eXBlPSJuZXciCi0JCQl3aXphcmRJZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS53aXphcmQubmV3RWNsaXBzZUxpbmtNYXBwaW5nRmlsZSI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8YW5kPgotCQkJCQk8b3I+Ci0JCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KLSAgICAgICAgICAgICAgICAgICAgCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyIi8+Ci0JCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3QiLz4KLQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ii8+Ci0JCQkJCTwvb3I+Ci0JCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotCQkJCQkJPHRlc3QgCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianB0LmpwYSIKLQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiLz4KLQkJCQkJPC9hZGFwdD4KLQkJCQkJPGFkYXB0IHR5cGUgPSAib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtRGVzY3JpcHRpb24iPgotCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGFQbGF0Zm9ybUdyb3VwIgotCQkJCQkJCXZhbHVlPSJlY2xpcHNlbGluayIvPgotCQkJCQk8L2FkYXB0PgotCQkJCTwvYW5kPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQkJCi0JCTxjb21tb25XaXphcmQKLQkJCW1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpIgotCQkJdHlwZT0ibmV3IgotCQkJd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkud2l6YXJkLm5ld0VjbGlwc2VMaW5rRHluYW1pY0VudGl0eSI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8YW5kPgotCQkJCQk8b3I+Ci0JCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KLQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdCIvPgotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQiLz4KLQkJCQkJPC9vcj4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0JCQkJCQk8dGVzdCAKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqcHQuanBhIgotCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIvPgotCQkJCQk8L2FkYXB0PgotCQkJCQk8YWRhcHQgdHlwZSA9ICJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiI+Ci0JCQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYVBsYXRmb3JtR3JvdXAiCi0JCQkJCQkJdmFsdWU9ImVjbGlwc2VsaW5rIi8+Ci0JCQkJCQk8bm90PiAKLSAgICAgICAgICAgICAgICAgICAgICAgIAk8dGVzdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGFQbGF0Zm9ybSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5lY2xpcHNlbGluay5wbGF0Zm9ybSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9ub3Q+Ci0JCQkJCQk8bm90PiAKLSAgICAgICAgICAgICAgICAgICAgICAgIAk8dGVzdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGFQbGF0Zm9ybSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJlY2xpcHNlbGluazFfMSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9ub3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bm90PiAKLSAgICAgICAgICAgICAgICAgICAgICAgIAk8dGVzdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGFQbGF0Zm9ybSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJlY2xpcHNlbGluazFfMiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9ub3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bm90PiAKLSAgICAgICAgICAgICAgICAgICAgICAgIAk8dGVzdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGFQbGF0Zm9ybSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJlY2xpcHNlbGluazJfMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9ub3Q+IAotCQkJCQk8L2FkYXB0PgotCQkJCTwvYW5kPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KLQkJCi0JCTxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFQZXJzcGVjdGl2ZSI+Ci0JCQk8bmV3V2l6YXJkU2hvcnRjdXQKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS53aXphcmQubmV3RWNsaXBzZUxpbmtNYXBwaW5nRmlsZSI+Ci0JCQk8L25ld1dpemFyZFNob3J0Y3V0PgotCQk8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgotCQkKLQkJPHBlcnNwZWN0aXZlRXh0ZW5zaW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UuanB0LnVpLmpwYVBlcnNwZWN0aXZlIj4KLQkJCTxuZXdXaXphcmRTaG9ydGN1dAotCQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLndpemFyZC5uZXdFY2xpcHNlTGlua0R5bmFtaWNFbnRpdHkiPgotCQkJPC9uZXdXaXphcmRTaG9ydGN1dD4KLQkJPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4KLQkJCi0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLQkJCi0JCTxwYWdlCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5lY2xpcHNlbGlua1Byb2plY3RQcm9wZXJ0aWVzIgotCQkJbmFtZT0iJWVjbGlwc2VMaW5rTm9kZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmpwYVByb2plY3RQcm9wZXJ0aWVzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2VhdmUuRWNsaXBzZWxpbmtQcmVmZXJlbmNlUGFnZSI+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJPHRlc3QKLQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQl2YWx1ZT0ianB0LmpwYSIvPgotCQkJCTwvYWRhcHQ+Ci0JCQk8L2VuYWJsZWRXaGVuPgotCQk8L3BhZ2U+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSAqKioqKiBjb21tYW5kcyAqKioqKiAtLT4KLQotICAJPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotCQkKLQkJPGNvbW1hbmQKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLnBlcnNpc3RlbnRUeXBlQWRkVmlydHVhbEF0dHJpYnV0ZSIKLQkJCW5hbWU9IiVhZGRWaXJ0dWFsQXR0cmlidXRlIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5qcGFTdHJ1Y3R1cmVWaWV3Q29tbWFuZHMiLz4KLQkJCi0JCTxjb21tYW5kCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5jb252ZXJ0SmF2YUNvbnZlcnRlcnMiCi0JCQluYW1lPSIlY29udmVydEphdmFDb252ZXJ0ZXJzIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5qcGFNZXRhZGF0YUNvbnZlcnNpb25Db21tYW5kcyIvPgotCQkKLQkJPGNvbW1hbmQKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmdlbmVyYXRlRHluYW1pY0VudGl0aWVzIgotCQkJbmFtZT0iJWdlbmVyYXRlRHluYW1pY0VudGl0aWVzIi8+Ci0KLSAgCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSAqKioqKiBoYW5kbGVycyAqKioqKiAtLT4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+Ci0JCQotCQk8aGFuZGxlcgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLnBlcnNpc3RlbnRUeXBlQWRkVmlydHVhbEF0dHJpYnV0ZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmhhbmRsZXJzLkFkZFZpcnR1YWxBdHRyaWJ1dGVIYW5kbGVyIj4KLQkJCTxhY3RpdmVXaGVuPgotCQkJCTxhbmQ+Ci0JCQkJCTx3aXRoIHZhcmlhYmxlPSJhY3RpdmVQYXJ0SWQiPgotCQkgICAgCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LnVpLmpwYVN0cnVjdHVyZVZpZXciLz4KLQkJICAgCQkJPC93aXRoPgotCQkJCQk8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLQkJCQkJCTxjb3VudCB2YWx1ZT0iMSIvPgotCQkJCQkJPGl0ZXJhdGUgb3BlcmF0b3I9ImFuZCI+Ci0JCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlIi8+Ci0JCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pc0NvbXBhdGlibGVWZXJzaW9uIiB2YWx1ZT0iJmFwb3M7Mi4xJmFwb3M7Ii8+Ci0JCQkJCQk8L2l0ZXJhdGU+Ci0JCQkJCTwvd2l0aD4KLQkJCQk8L2FuZD4KLQkJCTwvYWN0aXZlV2hlbj4KLQkJPC9oYW5kbGVyPgotCQkKLQkJPGhhbmRsZXIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5jb252ZXJ0SmF2YUNvbnZlcnRlcnMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jb21tYW5kcy5KYXZhQ29udmVydGVyQ29udmVyc2lvbkhhbmRsZXIiPgotCQk8L2hhbmRsZXI+Ci0JCQotCQk8aGFuZGxlcgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmdlbmVyYXRlRHluYW1pY0VudGl0aWVzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29tbWFuZHMuR2VuZXJhdGVEeW5hbWljRW50aXRpZXNIYW5kbGVyIj4KLQkJPC9oYW5kbGVyPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8IS0tICoqKioqIG1lbnVzICoqKioqIC0tPgotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgotCQkKLQkJPCEtLSBjb250cmlidXRpb25zIHRvIHRoZSAiSlBBIFRvb2xzIiBzdWJtZW51IC0tPgotCQk8bWVudUNvbnRyaWJ1dGlvbgotCQkJbG9jYXRpb25VUkk9InBvcHVwOm9yZy5lY2xpcHNlLmpwdC5qcGEudWkubWVudS5KcGFUb29scz9hZnRlcj1nZW5lcmF0ZSI+Ci0JCQkKLQkJCTxjb21tYW5kCi0JCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmdlbmVyYXRlRHluYW1pY0VudGl0aWVzIj4KLQkJCQk8dmlzaWJsZVdoZW4+Ci0JCQkJCTx3aXRoCi0JCQkJCQl2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLQkJCQkJCTxhbmQ+Ci0JCQkJCQkJPGNvdW50IHZhbHVlPSIxIi8+Ci0JCQkJCQkJPGl0ZXJhdGU+Ci0JCQkJCQkJCTxhbmQ+Ci0JCQkJCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJCQkJCTx0ZXN0Ci0JCQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQkJCXZhbHVlPSJqcHQuanBhIi8+Ci0JCQkJCQkJCQk8L2FkYXB0PgotCQkJCQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybURlc2NyaXB0aW9uIj4KLQkJCQkJCQkJCQk8dGVzdCAKLQkJCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGFQbGF0Zm9ybUdyb3VwIgotCQkJCQkJCQkJCQl2YWx1ZT0iZWNsaXBzZWxpbmsiLz4KLQkJCQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCQkJCTwvYW5kPgotCQkJCQkJCTwvaXRlcmF0ZT4KLQkJCQkJCTwvYW5kPgotCQkJCQk8L3dpdGg+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCTwvY29tbWFuZD4KLQkJCQotCQk8L21lbnVDb250cmlidXRpb24+Ci0JCQotCQk8IS0tIGNvbnRyaWJ1dGlvbnMgdG8gb2JqZWN0cyBpbiB0aGUgSlBBIHN0cnVjdHVyZSB2aWV3IC0tPgotCQk8bWVudUNvbnRyaWJ1dGlvbgotCQkJbG9jYXRpb25VUkk9InBvcHVwOm9yZy5lY2xpcHNlLmpwdC51aS5qcGFTdHJ1Y3R1cmVWaWV3Ij4KLQkJCQotCQkJPGNvbW1hbmQKLQkJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkucGVyc2lzdGVudFR5cGVBZGRWaXJ0dWFsQXR0cmlidXRlIj4KLQkJCQk8dmlzaWJsZVdoZW4+Ci0JCQkJCTx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotCQkJCQkJPGNvdW50IHZhbHVlPSIxIi8+Ci0JCQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0iYW5kIj4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUiLz4KLQkJCQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmlzQ29tcGF0aWJsZVZlcnNpb24iIHZhbHVlPSImYXBvczsyLjEmYXBvczsiLz4KLQkJCQkJCTwvaXRlcmF0ZT4KLQkJCQkJPC93aXRoPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQk8L2NvbW1hbmQ+Ci0JCTwvbWVudUNvbnRyaWJ1dGlvbj4KLQkJCi0gICAgICAgIDwhLS0gY29udHJpYnV0aW9ucyB0byAiTW92ZSB0byBYTUwiIHN1Ym1lbnUtLT4KLSAgICAgICAgPG1lbnVDb250cmlidXRpb24KLQkJCWxvY2F0aW9uVVJJPSJwb3B1cDpvcmcuZWNsaXBzZS5qcHQuanBhLnVpLm1lbnUubW92ZVRvWG1sIj4KLQkJCQotCQkJPGNvbW1hbmQKLQkJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuY29udmVydEphdmFDb252ZXJ0ZXJzIj4JCi0JCQkJPHZpc2libGVXaGVuCi0JCQkJCWNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCQk8d2l0aAotCQkJCQkJdmFyaWFibGU9ImFjdGl2ZU1lbnVTZWxlY3Rpb24iPgotCQkJCQkJPGl0ZXJhdGUgCi0JCQkJCQkJaWZFbXB0eT0iZmFsc2UiCi0JCQkJCQkJb3BlcmF0b3I9ImFuZCI+Ci0JCQkJCQkJPGFkYXB0Ci0JCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQkJPHRlc3QKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIAotCQkJCQkJCQkJdmFsdWU9ImpwdC5qcGEiLz4KLQkJCQkJCQk8L2FkYXB0PgotCQkJCQkJCTxhZGFwdCB0eXBlID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybURlc2NyaXB0aW9uIj4KLQkJCQkJCQkJPHRlc3QKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhUGxhdGZvcm1Hcm91cCIKLQkJCQkJCQkJCXZhbHVlPSJlY2xpcHNlbGluayIvPgotCQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCQk8L2l0ZXJhdGU+Ci0JCQkJCTwvd2l0aD4KLQkJCQk8L3Zpc2libGVXaGVuPgotCQkJPC9jb21tYW5kPgotCQkJCi0JCTwvbWVudUNvbnRyaWJ1dGlvbj4KLQkKLQkKLQkgPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvcHJvcGVydHlfZmlsZXMvZWNsaXBzZWxpbmtfdWkucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvcHJvcGVydHlfZmlsZXMvZWNsaXBzZWxpbmtfdWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZjMGIyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3Byb3BlcnR5X2ZpbGVzL2VjbGlwc2VsaW5rX3VpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLU1hcHBpbmdGaWxlV2l6YXJkX3RpdGxlPU5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUKLU1hcHBpbmdGaWxlV2l6YXJkUGFnZV9uZXdGaWxlX3RpdGxlPUVjbGlwc2VMaW5rIG1hcHBpbmcgZmlsZQotTWFwcGluZ0ZpbGVXaXphcmRQYWdlX25ld0ZpbGVfZGVzYz1TcGVjaWZ5IEVjbGlwc2VMaW5rIG1hcHBpbmcgZmlsZSBuYW1lIGFuZCBsb2NhdGlvbgotTWFwcGluZ0ZpbGVXaXphcmRQYWdlX29wdGlvbnNfdGl0bGU9RWNsaXBzZUxpbmsgbWFwcGluZyBmaWxlCi1NYXBwaW5nRmlsZVdpemFyZFBhZ2Vfb3B0aW9uc19kZXNjPVNwZWNpZnkgRWNsaXBzZUxpbmsgbWFwcGluZyBmaWxlIG9wdGlvbnMKLQotUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX25hbWUgPSBOYW1lOgotUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX3Byb3ZpZGVyID0gUHJvdmlkZXI6Ci1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfYnJvd3NlID0gQnJvd3NlLi4uCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZGVzY3JpcHRpb24gPSBEZXNjcmlwdGlvbjoKLQotIyBHZW5lcmFsCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfdGl0bGUgPSBHZW5lcmFsCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZ2VuZXJhbFNlY3Rpb25UaXRsZSA9IEdlbmVyYWwKLVBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9tYXBwZWRDbGFzc2VzU2VjdGlvblRpdGxlID0gTWFuYWdlZCBDbGFzc2VzCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfbWFwcGVkQ2xhc3Nlc1NlY3Rpb25EZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBsaXN0IG9mIGNsYXNzZXMgdG8gYmUgbWFuYWdlZCBpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfeG1sTWFwcGluZ0ZpbGVzU2VjdGlvblRpdGxlID0gWE1MIE1hcHBpbmcgRmlsZXMKLVBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl94bWxNYXBwaW5nRmlsZXNTZWN0aW9uRGVzY3JpcHRpb249U3BlY2lmeSB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgZm9yIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4KLQotUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX25hbWVMYWJlbCA9IE5hbWU6Ci1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfcGVyc2lzdGVuY2VQcm92aWRlckxhYmVsID0gUGVyc2lzdGVuY2UgUHJvdmlkZXI6Ci1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZGVzY3JpcHRpb25MYWJlbCA9IERlc2NyaXB0aW9uOgotCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3Nlcz1FeGNsdWRlIHVubGlzdGVkIGNsYXNzZXMKLVBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9leGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzV2l0aERlZmF1bHQ9RXhjbHVkZSB1bmxpc3RlZCBjbGFzc2VzICh7MH0pCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfbWFwcGVkQ2xhc3Nlc05vTmFtZT08bmFtZSBub3Qgc2V0PgotUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX29wZW49T3BlbgotCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfeG1sTWFwcGluZ0ZpbGVzRGlhbG9nX3RpdGxlPUpQQSBYTUwgTWFwcGluZyBGaWxlIFNlbGVjdGlvbgotUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX3htbE1hcHBpbmdGaWxlc0RpYWxvZ19tZXNzYWdlPUNob29zZSB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgdG8gYmUgYWRkZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfb3JtTm9OYW1lPTxuYW1lIG5vdCBzZXQ+Ci1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZXhjbHVkZUVjbGlwc2VsaW5rT3JtPUV4Y2x1ZGUgdW5saXN0ZWQgRWNsaXBzZUxpbmsgWE1MIG1hcHBpbmcgZmlsZQotUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX2V4Y2x1ZGVFY2xpcHNlbGlua09ybVdpdGhEZWZhdWx0PUV4Y2x1ZGUgdW5saXN0ZWQgRWNsaXBzZUxpbmsgWE1MIG1hcHBpbmcgZmlsZSAoezB9KQotCi0jIENvbm5lY3Rpb24KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl90aXRsZSA9IENvbm5lY3Rpb24KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9zZWN0aW9uVGl0bGUgPSBQZXJzaXN0ZW5jZSBVbml0IENvbm5lY3Rpb24KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9zZWN0aW9uRGVzY3JpcHRpb24gPSBDb25maWd1cmUgdGhlIGRhdGEgc291cmNlIG9yIEpEQkMgY29ubmVjdGlvbiBwcm9wZXJ0aWVzLgotCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfdHJhbnNhY3Rpb25UeXBlTGFiZWwgPSBUcmFuc2FjdGlvbiB0eXBlOgotCi1UcmFuc2FjdGlvblR5cGVDb21wb3NpdGVfanRhID0gSlRBCi1UcmFuc2FjdGlvblR5cGVDb21wb3NpdGVfcmVzb3VyY2VfbG9jYWwgPSBSZXNvdXJjZSBMb2NhbAotCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbmF0aXZlU3FsTGFiZWwgPSBOYXRpdmUgU1FMCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbmF0aXZlU3FsTGFiZWxEZWZhdWx0ID0gTmF0aXZlIFNRTCAoezB9KQotCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfYmF0Y2hXcml0aW5nTGFiZWwgPSBCYXRjaCB3cml0aW5nOgotCi1CYXRjaFdyaXRpbmdDb21wb3NpdGVfbm9uZSA9IE5vbmUKLUJhdGNoV3JpdGluZ0NvbXBvc2l0ZV9qZGJjID0gSkRCQwotQmF0Y2hXcml0aW5nQ29tcG9zaXRlX2J1ZmZlcmVkID0gQnVmZmVyZWQKLUJhdGNoV3JpdGluZ0NvbXBvc2l0ZV9vcmFjbGVfamRiYyA9IE9yYWNsZSBKREJDCi0KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9jYWNoZVN0YXRlbWVudHNMYWJlbCA9IFN0YXRlbWVudCBjYWNoaW5nOgotCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfanRhRGF0YVNvdXJjZUxhYmVsID0gSlRBIGRhdGEgc291cmNlOgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX25vbkp0YURhdGFTb3VyY2VMYWJlbCA9IE5vbi1KVEEgZGF0YSBzb3VyY2U6Ci0KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9kcml2ZXJMYWJlbCA9IERyaXZlcjoKLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl91cmxMYWJlbCA9IFVSTDoKLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl91c2VyTGFiZWwgPSBVc2VyOgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3Bhc3N3b3JkTGFiZWwgPSBQYXNzd29yZDoKLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9iaW5kUGFyYW1ldGVyc0xhYmVsID0gQmluZCBwYXJhbWV0ZXJzCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfYmluZFBhcmFtZXRlcnNMYWJlbERlZmF1bHQgPSBCaW5kIHBhcmFtZXRlcnMgKHswfSkKLQotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc1NoYXJlZExhYmVsID0gU2hhcmVkCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zU2hhcmVkTGFiZWxEZWZhdWx0ID0gU2hhcmVkICh7MH0pCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zU2VjdGlvblRpdGxlID0gUmVhZCBDb25uZWN0aW9uCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zTWluTGFiZWwgPSBNaW5pbXVtOgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc01heExhYmVsID0gTWF4aW11bToKLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl93cml0ZUNvbm5lY3Rpb25zU2VjdGlvblRpdGxlID0gV3JpdGUgQ29ubmVjdGlvbgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3dyaXRlQ29ubmVjdGlvbnNNaW5MYWJlbCA9IE1pbmltdW06Ci1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfd3JpdGVDb25uZWN0aW9uc01heExhYmVsID0gTWF4aW11bToKLQotQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfRGF0YWJhc2VfR3JvdXBCb3ggPSBEYXRhYmFzZQotCi1KZGJjUHJvcGVydGllc0NvbXBvc2l0ZV9FY2xpcHNlTGlua0Nvbm5lY3Rpb25Qb29sX0dyb3VwQm94ID0gRWNsaXBzZUxpbmsgY29ubmVjdGlvbiBwb29sCi0KLUpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9Db25uZWN0aW9uRGlhbG9nX01lc3NhZ2UgPSAmRW50ZXIgY29ubmVjdGlvbiBuYW1lIG9yIHBhdHRlcm4gKCosID8sIG9yIGNhbWVsIGNhc2UpOgotSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX0Nvbm5lY3Rpb25EaWFsb2dfVGl0bGUgPSBDb25uZWN0aW9uIFNlbGVjdGlvbgotCi1KZGJjRXhjbHVzaXZlQ29ubmVjdGlvbnNQcm9wZXJ0aWVzQ29tcG9zaXRlX0dyb3VwQm94ID0gRXhjbHVzaXZlIGNvbm5lY3Rpb25zCi0KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9leGNsdXNpdmVDb25uZWN0aW9uTW9kZUxhYmVsID0gRXhjbHVzaXZlIGNvbm5lY3Rpb24gbW9kZToKLQotSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlX2Fsd2F5cyA9IEFsd2F5cwotSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlX2lzb2xhdGVkID0gSXNvbGF0ZWQKLUpkYmNFeGNsdXNpdmVDb25uZWN0aW9uTW9kZUNvbXBvc2l0ZV90cmFuc2FjdGlvbmFsID0gVHJhbnNhY3Rpb25hbAotCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbGF6eUNvbm5lY3Rpb25MYWJlbCA9IExhenkgY29ubmVjdGlvbiBhY3F1aXNpdGlvbgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2xhenlDb25uZWN0aW9uTGFiZWxEZWZhdWx0ID0gTGF6eSBjb25uZWN0aW9uIGFjcXVpc2l0aW9uICh7MH0pCi0KLSMgU2NoZW1hR2VuZXJhdGlvbgotUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX3RpdGxlID0gU2NoZW1hIEdlbmVyYXRpb24KLVBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9zZWN0aW9uVGl0bGUgPSBQZXJzaXN0ZW5jZSBVbml0IFNjaGVtYSBHZW5lcmF0aW9uCi1QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfc2VjdGlvbkRlc2NyaXB0aW9uID0gQ29uZmlndXJlIHRoZSBFY2xpcHNlTGluayBzY2hlbWEgZ2VuZXJhdGlvbiBwcm9wZXJ0aWVzLgotCi1QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGVmYXVsdERvdCA9IERlZmF1bHQgKC4pCi0KLVBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kZGxHZW5lcmF0aW9uVHlwZUxhYmVsID0gRERMIGdlbmVyYXRpb24gdHlwZToKLVBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9vdXRwdXRNb2RlTGFiZWwgPSBPdXRwdXQgbW9kZToKLVBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9jcmVhdGVEZGxGaWxlTmFtZUxhYmVsID0gQ3JlYXRlIERETCBmaWxlIG5hbWU6Ci1QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZHJvcERkbEZpbGVOYW1lTGFiZWwgPSBEcm9wIERETCBmaWxlIG5hbWU6Ci0KLU91dHB1dE1vZGVDb21wb3NpdGVfYm90aCA9IEJvdGgKLU91dHB1dE1vZGVDb21wb3NpdGVfc3FsX3NjcmlwdCA9IFNxbC1zY3JpcHQKLU91dHB1dE1vZGVDb21wb3NpdGVfZGF0YWJhc2UgPSBEYXRhYmFzZQotCi1EZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZV9ub25lID0gTm9uZQotRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGVfY3JlYXRlX3RhYmxlcyA9IENyZWF0ZSBUYWJsZXMKLURkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlX2Ryb3BfYW5kX2NyZWF0ZV90YWJsZXMgPSBEcm9wIGFuZCBDcmVhdGUgVGFibGVzCi0KLVBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kZGxHZW5lcmF0aW9uTG9jYXRpb25MYWJlbCA9IERETCBnZW5lcmF0aW9uIGxvY2F0aW9uOgotCQotRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ1RpdGxlID0gR2VuZXJhdGlvbiBMb2NhdGlvbgotRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ01lc3NhZ2UgPSBDaG9vc2UgYSBmb2xkZXIgZm9yIHRoZSBnZW5lcmF0ZWQgRERMIGZpbGVzOgotCi0jIENhY2hpbmcKLVBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl90aXRsZSA9IENhY2hpbmcKLVBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zZWN0aW9uVGl0bGUgPSBQZXJzaXN0ZW5jZSBVbml0IENhY2hpbmcKLVBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zZWN0aW9uRGVzY3JpcHRpb24gPSBDb25maWd1cmUgdGhlIHNlc3Npb24gb3IgZW50aXR5IHNwZWNpZmljIEVjbGlwc2VMaW5rIGNhY2hpbmcgcHJvcGVydGllcy4KLQotQ2FjaGVEZWZhdWx0c0NvbXBvc2l0ZV9ncm91cFRpdGxlID0gRGVmYXVsdHMKLQotUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2RlZmF1bHRDYWNoZVR5cGVMYWJlbCA9IERlZmF1bHQgY2FjaGUgdHlwZToKLVBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9jYWNoZVR5cGVMYWJlbCA9IENhY2hlIHR5cGU6Ci0KLVBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9kZWZhdWx0U2hhcmVkQ2FjaGVMYWJlbCA9IFNoYXJlZCBjYWNoZSAoezB9KQotUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NoYXJlZENhY2hlTGFiZWwgPSBTaGFyZWQgY2FjaGUKLQotUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2RlZmF1bHRTaGFyZWRDYWNoZURlZmF1bHRMYWJlbCA9IERlZmF1bHQgc2hhcmVkIGNhY2hlICh7MH0pCi1QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2hhcmVkQ2FjaGVEZWZhdWx0TGFiZWwgPSBEZWZhdWx0IHNoYXJlZCBjYWNoZQotCi1DYWNoZVNpemVDb21wb3NpdGVfY2FjaGVTaXplPUNhY2hlIHNpemU6Ci0KLUNhY2hlVHlwZUNvbXBvc2l0ZV9mdWxsID0gRnVsbAotQ2FjaGVUeXBlQ29tcG9zaXRlX2hhcmRfd2VhayA9IFdlYWsgd2l0aCBIYXJkIFN1YmNhY2hlCi1DYWNoZVR5cGVDb21wb3NpdGVfbm9uZSA9IE5vbmUKLUNhY2hlVHlwZUNvbXBvc2l0ZV9zb2Z0ID0gU29mdAotQ2FjaGVUeXBlQ29tcG9zaXRlX3NvZnRfd2VhayA9IFdlYWsgd2l0aCBTb2Z0IFN1YmNhY2hlCi1DYWNoZVR5cGVDb21wb3NpdGVfd2VhayA9IFdlYWsKLQotRGVmYXVsdENhY2hlU2l6ZUNvbXBvc2l0ZV9kZWZhdWx0Q2FjaGVTaXplPURlZmF1bHQgY2FjaGUgc2l6ZToKLQotRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV9mdWxsID0gRnVsbAotRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV9oYXJkX3dlYWsgPSBXZWFrIFdpdGggSGFyZCBTdWJjYWNoZQotRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV9ub25lID0gTm9uZQotRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV9zb2Z0ID0gU29mdAotRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV9zb2Z0X3dlYWsgPSBXZWFrIHdpdGggU29mdCBTdWJjYWNoZQotRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV93ZWFrID0gV2VhawotCi1FbnRpdHlEaWFsb2dfc2VsZWN0RW50aXR5ID0gU2VsZWN0IGFuIEVudGl0eQotRW50aXR5RGlhbG9nX25hbWUgPSBOYW1lOgotCi1DYWNoaW5nRW50aXR5TGlzdENvbXBvc2l0ZV9ncm91cFRpdGxlID0gRW50aXR5IGNhY2hpbmcKLUNhY2hpbmdFbnRpdHlMaXN0Q29tcG9zaXRlX2VkaXRCdXR0b24gPSBFZGl0Li4uCi0KLUNhY2hpbmdFbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ01lc3NhZ2U9JkVudGVyIHR5cGUgbmFtZSBwcmVmaXggb3IgcGF0dGVybiAoKiwgPywgb3IgY2FtZWwgY2FzZSk6Ci1DYWNoaW5nRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dUaXRsZT1FbnRpdHkgU2VsZWN0aW9uCi0KLVBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9GbHVzaENsZWFyQ2FjaGVMYWJlbCA9IEZsdXNoIGNsZWFyIGNhY2hlOgotCi1GbHVzaENsZWFyQ2FjaGVDb21wb3NpdGVfZHJvcCA9IERyb3AKLUZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZV9kcm9wX2ludmFsaWRhdGUgPSBEcm9wIEludmFsaWRhdGUKLUZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZV9tZXJnZSA9IE1lcmdlCi0KLSMgQ3VzdG9taXphdGlvbgotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3RpdGxlID0gQ3VzdG9taXphdGlvbgotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3NlY3Rpb25UaXRsZSA9IFBlcnNpc3RlbmNlIFVuaXQgQ3VzdG9taXphdGlvbgotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3NlY3Rpb25EZXNjcmlwdGlvbiA9IFNldCBkZWZhdWx0IG9yIGVudGl0eSBzcGVjaWZpYyBFY2xpcHNlTGluayBjdXN0b21pemF0aW9uIGFuZCB2YWxpZGF0aW9uIHByb3BlcnRpZXMuCi0KLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nUHJvcGVydGllc0dyb3VwQm94ID0gV2VhdmluZwotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdMYWJlbCA9IFdlYXZpbmc6Ci0KLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nTGF6eUxhYmVsRGVmYXVsdCA9IExhenkgKHswfSkKLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nTGF6eUxhYmVsID0gTGF6eQotCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ZldGNoR3JvdXBzTGFiZWxEZWZhdWx0ID0gRmV0Y2ggZ3JvdXBzICh7MH0pCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ZldGNoR3JvdXBzTGFiZWwgPSBGZXRjaCBncm91cHMKLQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdJbnRlcm5hbExhYmVsID0gSW50ZXJuYWwKLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nSW50ZXJuYWxMYWJlbERlZmF1bHQgPSBJbnRlcm5hbCAoezB9KQotCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0VhZ2VyTGFiZWwgPSBFYWdlcgotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdFYWdlckxhYmVsRGVmYXVsdCA9IEVhZ2VyICh7MH0pCi0JCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0NoYW5nZVRyYWNraW5nTGFiZWxEZWZhdWx0ID0gQ2hhbmdlIHRyYWNraW5nICh7MH0pCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0NoYW5nZVRyYWNraW5nTGFiZWwgPSBDaGFuZ2UgdHJhY2tpbmcKLQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3ZhbGlkYXRpb25Pbmx5TGFiZWwgPSBWYWxpZGF0aW9uIG9ubHkKLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0aW9uT25seUxhYmVsRGVmYXVsdCA9IFZhbGlkYXRpb24gb25seSAoezB9KQotCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdmFsaWRhdGVTY2hlbWFMYWJlbCA9IE1hcHBpbmcgZmlsZXMgc2NoZW1hIHZhbGlkYXRpb24KLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0ZVNjaGVtYUxhYmVsRGVmYXVsdCA9IE1hcHBpbmcgZmlsZXMgc2NoZW1hIHZhbGlkYXRpb24gKHswfSkKLQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Rocm93RXhjZXB0aW9uc0xhYmVsRGVmYXVsdCA9IFRocm93IGV4Y2VwdGlvbnMgKHswfSkKLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aHJvd0V4Y2VwdGlvbnNMYWJlbCA9IFRocm93IGV4Y2VwdGlvbnMKLQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2V4Y2VwdGlvbkhhbmRsZXJMYWJlbCA9IEV4Y2VwdGlvbiBoYW5kbGVyOgotCi1XZWF2aW5nQ29tcG9zaXRlX3RydWVfID0gV2VhdmUgRHluYW1pY2FsbHkKLVdlYXZpbmdDb21wb3NpdGVfZmFsc2VfID0gTm8gV2VhdmluZwotV2VhdmluZ0NvbXBvc2l0ZV9zdGF0aWNfID0gV2VhdmUgU3RhdGljYWxseQotCi1DdXN0b21pemF0aW9uRW50aXR5TGlzdENvbXBvc2l0ZV9ncm91cFRpdGxlID0gRGVzY3JpcHRvciBjdXN0b21pemVycwotQ3VzdG9taXphdGlvbkVudGl0eUxpc3RDb21wb3NpdGVfZWRpdEJ1dHRvbiA9IEVkaXQuLi4KLQotQ3VzdG9taXphdGlvbkVudGl0eUxpc3RDb21wb3NpdGVfZGlhbG9nTWVzc2FnZT0mRW50ZXIgdHlwZSBuYW1lIHByZWZpeCBvciBwYXR0ZXJuICgqLCA/LCBvciBjYW1lbCBjYXNlKToKLUN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ1RpdGxlPUVudGl0eSBTZWxlY3Rpb24KLQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2N1c3RvbWl6ZXJMYWJlbCA9IEN1c3RvbWl6ZXI6Ci1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfc2Vzc2lvbkN1c3RvbWl6ZXJMYWJlbCA9IFNlc3Npb24gY3VzdG9taXplcnMKLQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX25vTmFtZT08bmFtZSBub3Qgc2V0PgotCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfcHJvZmlsZXJMYWJlbCA9IFByb2ZpbGVyOgotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2Jyb3dzZSA9IEJyb3dzZS4uLgotCi1Qcm9maWxlckNvbXBvc2l0ZV9wZXJmb3JtYW5jZV9wcm9maWxlciA9IFBlcmZvcm1hbmNlIFByb2ZpbGVyCi1Qcm9maWxlckNvbXBvc2l0ZV9xdWVyeV9tb25pdG9yID0gUXVlcnkgTW9uaXRvciAKLVByb2ZpbGVyQ29tcG9zaXRlX25vX3Byb2ZpbGVyID0gTm8gUHJvZmlsZXIKLQotIyBMb2dnaW5nCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGl0bGUgPSBMb2dnaW5nCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2VjdGlvblRpdGxlID0gUGVyc2lzdGVuY2UgVW5pdCBMb2dnaW5nCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2VjdGlvbkRlc2NyaXB0aW9uID0gQ29uZmlndXJlIHRoZSBFY2xpcHNlTGluayBsb2dnaW5nIHByb3BlcnRpZXMuCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZGVmYXVsdFN0ZG91dCA9IERlZmF1bHQgKHN0ZG91dCkKLQotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2NhdGVnb3J5TG9nZ2luZ0xldmVsU2VjdGlvblRpdGxlID0gTG9nZ2luZyBDYXRlZ29yaWVzCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2luZ0xldmVsTGFiZWwgPSBMb2dnaW5nIGxldmVsOgotCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc3FsTG9nZ2luZ0xldmVsTGFiZWwgPSBTUUw6Ci1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdHJhbnNhY3Rpb25Mb2dnaW5nTGV2ZWxMYWJlbCA9IFRyYW5zYWN0aW9uOgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2V2ZW50TG9nZ2luZ0xldmVsTGFiZWwgPSBFdmVudDoKLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9jb25uZWN0aW9uTG9nZ2luZ0xldmVsTGFiZWwgPSBDb25uZWN0aW9uOgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3F1ZXJ5TG9nZ2luZ0xldmVsTGFiZWwgPSBRdWVyeToKLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9jYWNoZUxvZ2dpbmdMZXZlbExhYmVsID0gQ2FjaGU6Ci1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfcHJvcGFnYXRpb25Mb2dnaW5nTGV2ZWxMYWJlbCA9IFByb3BhZ2F0aW9uOgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3NlcXVlbmNpbmdMb2dnaW5nTGV2ZWxMYWJlbCA9IFNlcXVlbmNpbmc6Ci1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZWpiTG9nZ2luZ0xldmVsTGFiZWwgPSBFSkI6Ci1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZG1zTG9nZ2luZ0xldmVsTGFiZWwgPSBETVM6Ci1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZWpiX29yX21ldGFkYXRhTG9nZ2luZ0xldmVsTGFiZWwgPSBFSkIgb3IgbWV0YWRhdGE6Ci1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfanBhX21ldGFtb2RlbExvZ2dpbmdMZXZlbExhYmVsID0gSlBBIG1ldGFtb2RlbDoKLQlQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfd2VhdmVyTG9nZ2luZ0xldmVsTGFiZWwgPSBXZWF2aW5nOgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3Byb3BlcnRpZXNMb2dnaW5nTGV2ZWxMYWJlbCA9IFByb3BlcnRpZXM6Ci1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2VydmVyTG9nZ2luZ0xldmVsTGFiZWwgPSBTZXJ2ZXI6Ci0KLUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9vZmYgPSBPZmYKLUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9zZXZlcmUgPSBTZXZlcmUKLUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV93YXJuaW5nID0gV2FybmluZwotTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2luZm8gPSBJbmZvCi1Mb2dnaW5nTGV2ZWxDb21wb3NpdGVfY29uZmlnID0gQ29uZmlnCi1Mb2dnaW5nTGV2ZWxDb21wb3NpdGVfZmluZSA9IEZpbmUKLUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9maW5lciA9IEZpbmVyCi1Mb2dnaW5nTGV2ZWxDb21wb3NpdGVfZmluZXN0ID0gRmluZXN0Ci1Mb2dnaW5nTGV2ZWxDb21wb3NpdGVfYWxsID0gQWxsCi0KLUVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGVfb2ZmID0gT2ZmCi1FY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlX3NldmVyZSA9IFNldmVyZQotRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV93YXJuaW5nID0gV2FybmluZwotRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9pbmZvID0gSW5mbwotRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9jb25maWcgPSBDb25maWcKLUVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGVfZmluZSA9IEZpbmUKLUVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGVfZmluZXIgPSBGaW5lcgotRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9maW5lc3QgPSBGaW5lc3QKLUVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGVfYWxsID0gQWxsCi0KLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9sb2dnZXJMYWJlbCA9IExvZ2dlcjoKLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9icm93c2UgPSBCcm93c2UuLi4KLUxvZ2dlckNvbXBvc2l0ZV9kZWZhdWx0X2xvZ2dlciA9IERlZmF1bHQgTG9nZ2VyCi1Mb2dnZXJDb21wb3NpdGVfamF2YV9sb2dnZXIgPSBKYXZhIExvZ2dlcgotTG9nZ2VyQ29tcG9zaXRlX3NlcnZlcl9sb2dnZXIgPSBTZXJ2ZXIgTG9nZ2VyCi0KLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aW1lc3RhbXBMYWJlbCA9IFRpbWVzdGFtcAotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RpbWVzdGFtcExhYmVsRGVmYXVsdCA9IFRpbWVzdGFtcCAoezB9KQotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RocmVhZExhYmVsID0gVGhyZWFkCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGhyZWFkTGFiZWxEZWZhdWx0ID0gVGhyZWFkICh7MH0pCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2Vzc2lvbkxhYmVsID0gU2Vzc2lvbgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3Nlc3Npb25MYWJlbERlZmF1bHQgPSBTZXNzaW9uICh7MH0pCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZXhjZXB0aW9uc0xhYmVsID0gRXhjZXB0aW9ucwotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2V4Y2VwdGlvbnNMYWJlbERlZmF1bHQgPSBFeGNlcHRpb25zICh7MH0pCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfY29ubmVjdGlvbkxhYmVsID0gQ29ubmVjdGlvbgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2Nvbm5lY3Rpb25MYWJlbERlZmF1bHQgPSBDb25uZWN0aW9uICh7MH0pCi0KLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9sb2dnZXJzTGFiZWwgPSBMb2dnZXJzOgotCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2luZ0ZpbGVMYWJlbCA9IExvZyBmaWxlOgotCi1Mb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ1RpdGxlID0gQ2hvb3NlIGEgbG9nIGZpbGUKLQotIyBPcHRpb25zCi1QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfdGl0bGUgPSBPcHRpb25zCi1QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2Vzc2lvblNlY3Rpb25UaXRsZSA9IEVjbGlwc2VMaW5rIFNlc3Npb24gT3B0aW9ucwotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3Nlc3Npb25TZWN0aW9uRGVzY3JpcHRpb24gPSBDb25maWd1cmUgdGhlIEVjbGlwc2VMaW5rIHNlc3Npb24gb3B0aW9ucy4KLQotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3Nlc3Npb25OYW1lID0gU2Vzc2lvbiBuYW1lOgotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3Nlc3Npb25zWG1sID0gU2Vzc2lvbnMgWE1MOgotCi1QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzTGFiZWwgPSBJbmNsdWRlIGRlc2NyaXB0b3IgcXVlcmllcwotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2luY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xhYmVsRGVmYXVsdCA9IEluY2x1ZGUgZGVzY3JpcHRvciBxdWVyaWVzICh7MH0pCi0KLVBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9ldmVudExpc3RlbmVyTGFiZWwgPSBFdmVudCBsaXN0ZW5lcjoKLVBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90YXJnZXREYXRhYmFzZUxhYmVsID0gVGFyZ2V0IGRhdGFiYXNlOgotCi1QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfbWlzY2VsbGFuZW91c1NlY3Rpb25UaXRsZSA9IE1pc2NlbGxhbmVvdXMgT3B0aW9ucwotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX21pc2NlbGxhbmVvdXNTZWN0aW9uRGVzY3JpcHRpb24gPSBDb25maWd1cmUgdGhlIG1pc2NlbGxhbmVvdXMgb3B0aW9ucy4KLQotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RlbXBvcmFsTXV0YWJsZUxhYmVsID0gVGVtcG9yYWwgbXV0YWJsZQotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RlbXBvcmFsTXV0YWJsZUxhYmVsRGVmYXVsdCA9IFRlbXBvcmFsIG11dGFibGUgKHswfSkKLQotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX25vTmFtZT08bmFtZSBub3Qgc2V0PgotCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9hdHR1bml0eSA9IEF0dHVuaXR5Ci1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9hdXRvID0gQXV0bwotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfY2xvdWRzY2FwZSA9IENsb3Vkc2NhcGUKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2RhdGFiYXNlID0gRGF0YWJhc2UKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2RiMiA9IERCMgotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfZGIybWFpbmZyYW1lID0gREIyTWFpbmZyYW1lCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9kYmFzZSA9IERCYXNlCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9kZXJieSA9IERlcmJ5Ci1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9oc3FsID0gSFNRTAotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfaW5mb3JtaXggPSBJbmZvcm1peAotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfamF2YWRiID0gSmF2YURCCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9tYXhkYiA9IE1heERCCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9teXNxbCA9IE15U1FMCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9vcmFjbGUgPSBPcmFjbGUKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX29yYWNsZTExID0gT3JhY2xlMTEKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX29yYWNsZTEwID0gT3JhY2xlMTBnCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9vcmFjbGU5ID0gT3JhY2xlOWkKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX29yYWNsZTggPSBPcmFjbGU4aQotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfcG9pbnRiYXNlID0gUG9pbnRCYXNlCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9wb3N0Z3Jlc3FsID0gUG9zdGdyZVNRTAotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfc3FsYW55d2hlcmUgPSBTUUxBbnl3aGVyZQotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfc3Fsc2VydmVyID0gU1FMU2VydmVyCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9zeWJhc2UgPSBTeWJhc2UKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX3N5bWZvd2FyZSA9IFN5bWZvd2FyZQotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfdGltZXN0ZW4gPSBUaW1lc1RlbgotCi1QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfdGFyZ2V0U2VydmVyTGFiZWwgPSBUYXJnZXQgc2VydmVyOgotCi1UYXJnZXRTZXJ2ZXJDb21wb3NpdGVfbm9uZSA9IE5vbmUKLVRhcmdldFNlcnZlckNvbXBvc2l0ZV9vYzRqID0gT0M0SgotVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3N1bmFzOSA9IFN1bkFTOQotVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3dlYnNwaGVyZSA9IFdlYlNwaGVyZQotVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3dlYnNwaGVyZV82XzEgPSBXZWJTcGhlcmUgNi4xCi1UYXJnZXRTZXJ2ZXJDb21wb3NpdGVfd2Vic3BoZXJlXzcgPSBXZWJTcGhlcmUgNwotVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3dlYmxvZ2ljID0gV2ViTG9naWMKLVRhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJsb2dpY185ID0gV2ViTG9naWMgOQotVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3dlYmxvZ2ljXzEwID0gV2ViTG9naWMgMTAKLVRhcmdldFNlcnZlckNvbXBvc2l0ZV9qYm9zcyA9IEpCb3NzCi1UYXJnZXRTZXJ2ZXJDb21wb3NpdGVfbmV0d2VhdmVyXzdfMSA9IFNBUCBOZXRXZWF2ZXIgNy4xCi0KLSMgRERMR2VuZXJhdGlvbgotRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaV9nZW5lcmF0aW5nRERMV2FybmluZ1RpdGxlID0gR2VuZXJhdGluZyBUYWJsZXMKLUVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWlfZ2VuZXJhdGluZ0RETFdhcm5pbmdNZXNzYWdlID0gV2FybmluZzogIEdlbmVyYXRpbmcgdGFibGVzIHdpbGwgRFJPUCBleGlzdGluZyB0YWJsZXMgYW5kezB9Q1JFQVRFIG5ldyB0YWJsZXMgYmFzZWQgb24gdGhlIEVudGl0aWVzIGluIHlvdXIgcHJvamVjdC57MX1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/Ci1FY2xpcHNlTGlua0RETEdlbmVyYXRvclVpX2Vycm9yID0gRXJyb3IKLUVDTElQU0VMSU5LX0dFTkVSQVRFX1RBQkxFU19KT0IgPSBHZW5lcmF0aW5nIFRhYmxlcyBmcm9tIEVudGl0aWVzCi1FQ0xJUFNFTElOS19HRU5FUkFURV9UQUJMRVNfVEFTSyA9IEdlbmVyYXRpbmcKLQotR2VuZXJhdGlvbk91dHB1dE1vZGVXaXphcmRQYWdlX3RpdGxlID0gU2NoZW1hIEdlbmVyYXRpb24KLUdlbmVyYXRpb25PdXRwdXRNb2RlV2l6YXJkUGFnZV9kZXNjID0gU2VsZWN0IERETCBnZW5lcmF0aW9uIGFjdGlvbgotR2VuZXJhdGlvbk91dHB1dE1vZGVXaXphcmRQYWdlX2dlbmVyYXRpb25PdXRwdXRNb2RlID0gR2VuZXJhdGlvbiBPdXRwdXQgTW9kZQotCi0jIE1ldGFkYXRhQ29udmVyc2lvbgotSmF2YU1ldGFkYXRhQ29udmVyc2lvbl9ub0NvbnZlcnRlcnNUb0NvbnZlcnQ9Tm8gSmF2YSBjb252ZXJ0ZXJzIHRvIGNvbnZlcnQKLUphdmFDb252ZXJ0ZXJDb252ZXJzaW9uV2l6YXJkUGFnZV90aXRsZSA9IEphdmEgQ29udmVydGVyIE1ldGFkYXRhIENvbnZlcnNpb24KLUphdmFDb252ZXJ0ZXJDb252ZXJzaW9uV2l6YXJkUGFnZV9kZXNjcmlwdGlvbiA9IE1vdmUgYWxsIHRoZSBhbm5vdGF0ZWQgSlBBIGNvbnZlcnRlcnMgdG8gWE1MIGFzIG1hcHBpbmcgZmlsZSBsZXZlbCBtZXRhZGF0YQotSmF2YU1ldGFkYXRhQ29udmVyc2lvbl9lcXVpdmFsZW50Q29udmVydGVyc1dhcm5pbmdUaXRsZT1FcXVpdmFsZW50IENvbnZlcnRlcnMgRm91bmQKLUphdmFNZXRhZGF0YUNvbnZlcnNpb25fZXF1aXZhbGVudENvbnZlcnRlcnNXYXJuaW5nTWVzc2FnZT1XYXJuaW5nOiBFcXVpdmFsZW50IGNvbnZlcnRlcnMgYXJlIGZvdW5kLiBPbmx5IG9uZSBvZiB0aGVzZSBjb252ZXJ0ZXJzIHdpbGwgYmUgY29udmVydGVkIHdoaWxlIHRoZSByZXN0IHdpbGwgYmUgZGVsZXRlZC4gRG8geW91IHdhbnQgdG8gY29udGludWU/Ci1KYXZhTWV0YWRhdGFDb252ZXJzaW9uX2VxdWl2YWxlbnRHZW5lcmF0b3JzV2FybmluZ1RpdGxlPUVxdWl2YWxlbnQgR2VuZXJhdG9ycyBGb3VuZAotSmF2YU1ldGFkYXRhQ29udmVyc2lvbl9lcXVpdmFsZW50R2VuZXJhdG9yc1dhcm5pbmdNZXNzYWdlPVdhcm5pbmc6IEVxdWl2YWxlbnQgZ2VuZXJhdG9ycyBhcmUgZm91bmQuIE9ubHkgb25lIG9mIHRoZXNlIGdlbmVyYXRvcnMgd2lsbCBiZSBjb252ZXJ0ZWQgd2hpbGUgdGhlIHJlc3Qgd2lsbCBiZSBkZWxldGVkLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLUphdmFNZXRhZGF0YUNvbnZlcnNpb25fZXF1aXZhbGVudFF1ZXJpZXNXYXJuaW5nVGl0bGU9RXF1aXZhbGVudCBRdWVyaWVzIEZvdW5kCi1KYXZhTWV0YWRhdGFDb252ZXJzaW9uX2VxdWl2YWxlbnRRdWVyaWVzV2FybmluZ01lc3NhZ2U9V2FybmluZzogRXF1aXZhbGVudCBxdWVyaWVzIGFyZSBmb3VuZC4gT25seSBvbmUgb2YgdGhlc2UgcXVlcmllcyB3aWxsIGJlIGNvbnZlcnRlZCB3aGlsZSB0aGUgcmVzdCB3aWxsIGJlIGRlbGV0ZWQuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotCi0jIFN0YXRpYyBXZWF2aW5nCi1FY2xpcHNlbGlua1ByZWZlcmVuY2VQYWdlX2Rlc2NyaXB0aW9uID0gQ29uZmlndXJlIEVjbGlwc2VMaW5rIHNwZWNpZmljIHByZWZlcmVuY2VzIGZvciB0aGUgcHJvamVjdDoKLUVjbGlwc2VsaW5rUHJlZmVyZW5jZVBhZ2Vfc3RhdGljV2VhdmluZ0dyb3VwQm94ID0gU3RhdGljIHdlYXZpbmcKLUVjbGlwc2VsaW5rUHJlZmVyZW5jZVBhZ2Vfd2VhdmVDbGFzc2VzT25CdWlsZExhYmVsID0gV2VhdmUgY2xhc3NlcyBvbiBidWlsZAotRWNsaXBzZWxpbmtQcmVmZXJlbmNlUGFnZV9zb3VyY2VMYWJlbCA9IFNvdXJjZSBjbGFzc2VzOgotRWNsaXBzZWxpbmtQcmVmZXJlbmNlUGFnZV9zZWxlY3RTb3VyY2VMYWJlbCA9IFNlbGVjdCBTb3VyY2UgQ2xhc3NlcwotRWNsaXBzZWxpbmtQcmVmZXJlbmNlUGFnZV9zb3VyY2VGb2xkZXJTZWxlY3Rpb25MYWJlbCA9IFNvdXJjZSBjbGFzc2VzIGZvbGRlciBzZWxlY3Rpb24KLUVjbGlwc2VsaW5rUHJlZmVyZW5jZVBhZ2VfdGFyZ2V0TGFiZWwgPSBUYXJnZXQgY2xhc3NlczoKLUVjbGlwc2VsaW5rUHJlZmVyZW5jZVBhZ2Vfc2VsZWN0VGFyZ2V0TGFiZWwgPSBTZWxlY3QgVGFyZ2V0IENsYXNzZXMKLUVjbGlwc2VsaW5rUHJlZmVyZW5jZVBhZ2VfdGFyZ2V0Rm9sZGVyU2VsZWN0aW9uTGFiZWwgPSBUYXJnZXQgY2xhc3NlcyBmb2xkZXIgc2VsZWN0aW9uCi1FY2xpcHNlbGlua1ByZWZlcmVuY2VQYWdlX3BlcnNpc3RlbmNlSW5mb0xhYmVsID0gUGVyc2lzdGVuY2UgWE1MIFJvb3QgKG9wdGlvbmFsKToKLUVjbGlwc2VsaW5rUHJlZmVyZW5jZVBhZ2Vfc2VsZWN0UGVyc2lzdGVuY2VJbmZvTGFiZWwgPSBTZWxlY3QgUGVyc2lzdGVuY2UgWE1MIFJvb3QKLUVjbGlwc2VsaW5rUHJlZmVyZW5jZVBhZ2VfcGVyc2lzdGVuY2VJbmZvRm9sZGVyU2VsZWN0aW9uTGFiZWwgPSBQZXJzaXN0ZW5jZSBYTUwgcm9vdCBmb2xkZXIgc2VsZWN0aW9uCi1FY2xpcHNlbGlua1ByZWZlcmVuY2VQYWdlX2xvZ0xldmVsTGFiZWwgPSBMb2cgbGV2ZWw6Ci1FY2xpcHNlbGlua1ByZWZlcmVuY2VQYWdlX2Jyb3dzZSA9IEJyb3dzZS4uLgotCi0jIE5ldyBEeW5hbWljIEVudGl0eQotRWNsaXBzZUxpbmtEeW5hbWljRW50aXR5V2l6YXJkX2FwcGx5RW1iZWRkZWRJZE1hcHBpbmdJbmZvPUVtYmVkZGVkIElEIG1hcHBpbmcgd2lsbCBiZSBhcHBsaWVkIHdoZW4gbXVsdGlwbGUgSUQgbWFwcGluZ3MgZGVmaW5lZAotRWNsaXBzZUxpbmtEeW5hbWljRW50aXR5V2l6YXJkX2JvdGhJREFuZEVtYmVkZGVkSUREZWZpbmVkRXJyb3I9Qm90aCBJRCBhbmQgRW1iZWRkZWQgSUQgbWFwcGluZyBkZWZpbmVkCi1FY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmRfYnJvd3NlQnR0b25MYWJlbD1Ccm93c2UuLi4KLUVjbGlwc2VMaW5rRHluYW1pY0VudGl0eVdpemFyZF9keW5hbWljVHlwZUV4aXN0c0Vycm9yPUR5bmFtaWMgdHlwZSAnJ3swfScnIGFscmVhZHkgZXhpc3RzCi1FY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmRfZHluYW1pY1R5cGVXaXRoRGlmZkNhc2VFeGlzdHNFcnJvcj1EeW5hbWljIHR5cGUgJyd7MH0nJyBhbHJlYWR5IGV4aXN0cyB3aXRoIHNhbWUgbmFtZSBidXQgZGlmZmVyZW50IGNhc2UKLUVjbGlwc2VMaW5rRHluYW1pY0VudGl0eVdpemFyZF9pbnZhbGlkQXJndW1lbnQ9SW52YWxpZCBhcmd1bWVudCAnJ3swfScnCi1FY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmRfaW52YWxpZFBLVHlwZT0nJ3swfScnIGlzIG5vdCBhIHZhbGlkIHNpbXBsZSBwcmltYXJ5IGtleSB0eXBlCi1FY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmRfbXVsdGlwbGVFbWJlZGRlZElEc0RlZmluZWRFcnJvcj1NdWx0aXBsZSBFbWJlZGRlZCBJRCBtYXBwaW5ncyBkZWZpbmVkCi1FY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmRfcGVyc2lzdGVuY2VVbml0Tm90Rm91bmRFcnJvcj1ObyBwZXJzaXN0ZW5jZSB1bml0IGlzIGZvdW5kCi1FY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmRfdGl0bGU9TmV3IER5bmFtaWMgRW50aXR5Ci1FY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmRfdHlwZUV4aXN0c1dhcm5pbmc9VHlwZSAnJ3swfScnIGFscmVhZHkgZXhpc3RzCi1FY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmRfdHlwZU5vdEluUHJvamVjdENsYXNzcGF0aD0gQXR0cmlidXRlIHR5cGUgJyd7MH0nJyBkb2VzIG5vdCBleGlzdCBvbiB0aGUgcHJvamVjdCBjbGFzc3BhdGgKLUVjbGlwc2VMaW5rRHluYW1pY0VudGl0eVdpemFyZF90eXBlV2l0aERpZmZDYXNlRXhpc3RzV2FybmluZz1UeXBlICcnezB9JycgYWxyZWFkeSBleGlzdHMgd2l0aCBzYW1lIG5hbWUgYnV0IGRpZmZlcmVudCBjYXNlCi0KLUR5bmFtaWNFbnRpdHlDbGFzc1dpemFyZFBhZ2VfY2hvb3NlWE1MRGlhbG9nX21zZz1DaG9vc2UgbWFwcGluZyBYTUwKLUR5bmFtaWNFbnRpdHlDbGFzc1dpemFyZFBhZ2VfY2hvb3NlWE1MRGlhbG9nX3RpdGxlPU1hcHBpbmcgRmlsZQotRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV9jbGFzc05hbWVMYWJlbD1DbGFzcyBuYW1lOgotRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV9kZWZhdWx0UGFja2FnZVdhcm5pbmc9VGhlIHVzYWdlIG9mIHRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgbm90IHJlY29tbWVuZGVkLgotRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV9kZXNjPUNyZWF0ZSBhIG5ldyBkeW5hbWljIGVudGl0eS4gT25seSBKUEEgZW5hYmxlZCBwcm9qZWN0cyBtYXkgYmUgc2VsZWN0ZWQuCi1EeW5hbWljRW50aXR5Q2xhc3NXaXphcmRQYWdlX2VtcHR5U3RyaW5nPSIiCi1EeW5hbWljRW50aXR5Q2xhc3NXaXphcmRQYWdlX2VudGl0eU5hbWU9RW50aXR5IG5hJm1lOgotRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV9pbnZhbGlkWE1MTmFtZT1UaGUgbWFwcGluZyBmaWxlIGRvZXMgbm90IGV4aXN0Ci1EeW5hbWljRW50aXR5Q2xhc3NXaXphcmRQYWdlX2phdmFQYWNrYWdlTGFiZWw9SmF2YSBwYWNrYWdlOgotRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV9wcm9qZWN0TmFtZUxhYmVsPVByb2plY3Q6Ci1EeW5hbWljRW50aXR5Q2xhc3NXaXphcmRQYWdlX3BhY2thZ2VTZWxlY3Rpb25EaWFsb2dfZGVzYz1DaG9vc2UgYSBwYWNrYWdlOgotRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV9wYWNrYWdlU2VsZWN0aW9uRGlhbG9nX21zZz1ObyBwYWNrYWdlcyB0byBjaG9vc2UgZnJvbQotRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV9wYWNrYWdlU2VsZWN0aW9uRGlhbG9nX3RpdGxlPVBhY2thZ2UgU2VsZWN0aW9uCi1EeW5hbWljRW50aXR5Q2xhc3NXaXphcmRQYWdlX3RhYmxlTmFtZT0mVGFibGUgbmFtZToKLUR5bmFtaWNFbnRpdHlDbGFzc1dpemFyZFBhZ2VfdGFibGVOYW1lR3JvdXA9VGFibGUKLUR5bmFtaWNFbnRpdHlDbGFzc1dpemFyZFBhZ2VfdGl0bGU9RW50aXR5IENsYXNzCi1EeW5hbWljRW50aXR5Q2xhc3NXaXphcmRQYWdlX3VzZURlZnVsdD0mVXNlIGRlZmF1bHQKLUR5bmFtaWNFbnRpdHlDbGFzc1dpemFyZFBhZ2VfeG1sR3JvdXA9WE1MIGVudGl0eSBtYXBwaW5ncwotRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV94bWxOYW1lTGFiZWw9TSZhcHBpbmcgZmlsZToKLUR5bmFtaWNFbnRpdHlDbGFzc1dpemFyZFBhZ2VfeG1sTm90TGlzdGVkRXJyb3I9VGhlIHNlbGVjdGVkIG1hcHBpbmcgZmlsZSBoYXMgbm90IGJlZW4gYWRkZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0KLUR5bmFtaWNFbnRpdHlGaWVsZHNXaXphcmRQYWdlX2FkZEJ1dHRvbkxhYmVsPSZBZGQuLi4KLUR5bmFtaWNFbnRpdHlGaWVsZHNXaXphcmRQYWdlX2FkZER5bmFtaWNFbnRpdHlGaWVsZERpYWxvZ190aXRsZT1BZGQgRHluYW1pYyBFbnRpdHkgRmllbGQKLUR5bmFtaWNFbnRpdHlGaWVsZHNXaXphcmRQYWdlX2F0dHJpYnV0ZVR5cGVDb2x1bW5MYWJlbD1BdHRyaWJ1dGUgVHlwZQotRHluYW1pY0VudGl0eUZpZWxkc1dpemFyZFBhZ2VfZGVzYz1TZXQgZHluYW1pYyBlbnRpdHkgZmllbGRzCi1EeW5hbWljRW50aXR5RmllbGRzV2l6YXJkUGFnZV9kdXBsaWNhdGVFbnRpdHlGaWVsZHNFcnJvcj1EdXBsaWNhdGUgZmllbGQgbmFtZXMgZXhpc3QKLUR5bmFtaWNFbnRpdHlGaWVsZHNXaXphcmRQYWdlX2VkaXRCdXR0b25MYWJlbD0mRWRpdC4uLgotRHluYW1pY0VudGl0eUZpZWxkc1dpemFyZFBhZ2VfZW50aXR5RmllbGRHcm91cD1FbnRpdHkgZmllbGQmcwotRHluYW1pY0VudGl0eUZpZWxkc1dpemFyZFBhZ2VfbWFwcGluZ1R5cGVDb2x1bW5MYWJlbD1NYXAgQXMKLUR5bmFtaWNFbnRpdHlGaWVsZHNXaXphcmRQYWdlX25hbWVDb2x1bW5MYWJlbD1OYW1lCi1EeW5hbWljRW50aXR5RmllbGRzV2l6YXJkUGFnZV9ub0pwYVByb2plY3RzPU5vIEpQQSBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlCi1EeW5hbWljRW50aXR5RmllbGRzV2l6YXJkUGFnZV9yZW1vdmVCdXR0b25MYWJlbD0mUmVtb3ZlCi1EeW5hbWljRW50aXR5RmllbGRzV2l6YXJkUGFnZV90aXRsZT1FbnRpdHkgRmllbGRzCi0KLSMgQWRkIFZpcnR1YWwgQXR0cmlidXRlCi1BZGRWaXJ0dWFsQXR0cmlidXRlRGlhbG9nX3RpdGxlPUFkZCBWaXJ0dWFsIEF0dHJpYnV0ZQotQWRkVmlydHVhbEF0dHJpYnV0ZURpYWxvZ19uYW1lTGFiZWw9TmFtZToKLUFkZFZpcnR1YWxBdHRyaWJ1dGVEaWFsb2dfbWFwcGluZ0xhYmVsPU1hcCBhczoKLUFkZFZpcnR1YWxBdHRyaWJ1dGVEaWFsb2dfYXR0cmlidXRlVHlwZUxhYmVsPUF0dHJpYnV0ZSB0eXBlOgotQWRkVmlydHVhbEF0dHJpYnV0ZURpYWxvZ19ub01hcHBpbmdLZXlFcnJvcj1Zb3UgbXVzdCBzcGVjaWZ5IGEgbWFwcGluZyB0eXBlCi1BZGRWaXJ0dWFsQXR0cmlidXRlRGlhbG9nX25vTmFtZUVycm9yPVlvdSBtdXN0IHNwZWNpZnkgYSBuYW1lCi1BZGRWaXJ0dWFsQXR0cmlidXRlRGlhbG9nX25vQXR0cmlidXRlVHlwZUVycm9yPVlvdSBtdXN0IHNwZWNpZnkgYW4gYXR0cmlidXRlIHR5cGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvcHJvcGVydHlfZmlsZXMvZWNsaXBzZWxpbmtfdWlfZGV0YWlscy5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9wcm9wZXJ0eV9maWxlcy9lY2xpcHNlbGlua191aV9kZXRhaWxzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YjQxZjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9wcm9wZXJ0eV9maWxlcy9lY2xpcHNlbGlua191aV9kZXRhaWxzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWwgPSBCYXNpYyBDb2xsZWN0aW9uCi1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbCA9IGJhc2ljIGNvbGxlY3Rpb24KLQotRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsID0gQmFzaWMgTWFwCi1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsID0gYmFzaWMgbWFwCi0KLUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlQcm92aWRlcl9sYWJlbCA9IFRyYW5zZm9ybWF0aW9uCi1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsID0gdHJhbnNmb3JtYXRpb24KLQotRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWwgPSBWYXJpYWJsZSBPbmUgdG8gT25lCi1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWwgPSB2YXJpYWJsZSBvbmUgdG8gb25lCi0KLUVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX2xhYmVsID0gVHlwZToJCi1FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9mdWxsID0gRnVsbAotRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfd2VhayA9IFdlYWsKLUVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX3NvZnQgPSBTb2Z0Ci1FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9zb2Z0X3dlYWsgPSBXZWFrIHdpdGggU29mdCBTdWJjYWNoZQotRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfaGFyZF93ZWFrID0gV2VhayB3aXRoIEhhcmQgU3ViY2FjaGUKLUVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX2NhY2hlID0gQ2FjaGUKLUVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX25vbmUgPSAgTm9uZQotCi1FY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZV9zaXplID0gU2l6ZToKLQotRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGVfbGFiZWwgPSBDb29yZGluYXRpb24gdHlwZToKLUVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX3NlbmRfb2JqZWN0X2NoYW5nZXMgPSBTZW5kIE9iamVjdCBDaGFuZ2VzCi1FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZV9pbnZhbGlkYXRlX2NoYW5nZWRfb2JqZWN0cyA9IEludmFsaWRhdGUgQ2hhbmdlZCBPYmplY3RzCi1FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZV9zZW5kX25ld19vYmplY3RzX3dpdGhfY2hhbmdlcyA9IFNlbmQgTmV3IE9iamVjdHMgd2l0aCBDaGFuZ2VzCi1FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZV9ub25lID0gTm9uZQotCi1FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGVfc2hhcmVkTGFiZWxEZWZhdWx0ID0gU2hhcmVkICh7MH0pCi1FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGVfc2hhcmVkTGFiZWwgPSBTaGFyZWQKLUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZV9hZHZhbmNlZCA9IEFkdmFuY2VkCi0KLUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGVfbGFiZWwgPSBDaGFuZ2UgdHJhY2tpbmc6Ci1FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlX2F0dHJpYnV0ZSA9IEF0dHJpYnV0ZQotRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZV9vYmplY3QgPSBPYmplY3QKLUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGVfZGVmZXJyZWQgPSBEZWZlcnJlZAotRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZV9hdXRvID0gQXV0bwotCi1FY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGVfY29udmVydGVyTmFtZUxhYmVsID0gQ29udmVydGVyIG5hbWU6Ci0KLUVjbGlwc2VMaW5rQ29udmVydGVyQ29tcG9zaXRlX25hbWVUZXh0TGFiZWwgPSBOYW1lOgotRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb21wb3NpdGVfY2xhc3NMYWJlbCA9IENsYXNzOgotCi1FY2xpcHNlTGlua0N1c3RvbWl6ZXJDb21wb3NpdGVfY2xhc3NMYWJlbCA9IEN1c3RvbWl6ZXIgY2xhc3M6Ci0KLUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV9jdXN0b21Db252ZXJ0ZXIgPSBDdXN0b20KLUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV9vYmplY3RUeXBlQ29udmVydGVyID0gT2JqZWN0IHR5cGUKLUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV9zdHJ1Y3RDb252ZXJ0ZXIgPSBTdHJ1Y3QKLUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV90eXBlQ29udmVydGVyID0gVHlwZQotCi1FY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGVfYWx3YXlzUmVmcmVzaERlZmF1bHQgPSBBbHdheXMgcmVmcmVzaCAoezB9KQotRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlX2Fsd2F5c1JlZnJlc2hMYWJlbCA9IEFsd2F5cyByZWZyZXNoCi1FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZV9yZWZyZXNoT25seUlmTmV3ZXJEZWZhdWx0ID0gUmVmcmVzaCBvbmx5IGlmIG5ld2VyICh7MH0pCi1FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZV9yZWZyZXNoT25seUlmTmV3ZXJMYWJlbCA9IFJlZnJlc2ggb25seSBpZiBuZXdlcgotRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZV9kaXNhYmxlSGl0c0RlZmF1bHQgPSBEaXNhYmxlIGhpdHMgKHswfSkKLUVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGVfZGlzYWJsZUhpdHNMYWJlbCA9IERpc2FibGUgaGl0cwotCi1UeXBlU2VjdGlvbl9jb252ZXJ0ZWQgPSBDb252ZXJ0ZWQKLQotRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9hZHZhbmNlZCA9IEFkdmFuY2VkCi1FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NhY2hpbmcgPSBDYWNoaW5nCi1FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NvbnZlcnRlcnMgPSBDb252ZXJ0ZXJzCi1FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX211bHRpdGVuYW5jeSA9IE11bHRpdGVuYW5jeQotCi1FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2xhYmVsID0gRXhpc3RlbmNlIGNoZWNraW5nOgotRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9jaGVja19jYWNoZSA9IENoZWNrIENhY2hlCi1FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2NoZWNrX2RhdGFiYXNlID0gQ2hlY2sgQ2FjaGUgdGhlbiBEYXRhYmFzZQotRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9hc3N1bWVfZXhpc3RlbmNlID0gQXNzdW1lIEV4aXN0ZW5jZQotRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9hc3N1bWVfbm9uX2V4aXN0ZW5jZSA9IEFzc3VtZSBOb24tRXhpc3RlbmNlCi0KLUVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX2V4cGlyeVNlY3Rpb24gPSBFeHBpcnkKLQotRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfbm9FeHBpcnkgPSBObyBleHBpcnkKLUVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX3RpbWVUb0xpdmVFeHBpcnkgPSBUaW1lIHRvIGxpdmUgZXhwaXJ5Ci1FY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV90aW1lVG9MaXZlRXhwaXJ5RXhwaXJlQWZ0ZXIgPSBFeHBpcmUgYWZ0ZXIKLUVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX3RpbWVUb0xpdmVFeHBpcnlNaWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHMKLUVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX2RhaWx5RXhwaXJ5ID0gRGFpbHkgZXhwaXJ5Ci1FY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV90aW1lT2ZEYXlFeHBpcnlFeHBpcmVBdCA9IEV4cGlyZSBhdAotCi0KLUVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlX2xhYmVsID0gSm9pbiBmZXRjaDoKLUVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlX2lubmVyID0gSW5uZXIKLUVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlX291dGVyID0gT3V0ZXIKLQotRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlX211dGFibGVMYWJlbD1NdXRhYmxlCi1FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGVfbXV0YWJsZUxhYmVsRGVmYXVsdD1NdXRhYmxlICh7MH0pCi1FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGVfdHJ1ZT1UcnVlCi1FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGVfZmFsc2U9RmFsc2UKLQotRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2RhdGFUeXBlTGFiZWwgPSBEYXRhIHR5cGU6Ci1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfb2JqZWN0VHlwZUxhYmVsID0gT2JqZWN0IHR5cGU6Ci1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfY29udmVyc2lvblZhbHVlRWRpdCA9IEVkaXQuLi4KLUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9jb252ZXJzaW9uVmFsdWVzRGF0YVZhbHVlQ29sdW1uID0gRGF0YSBWYWx1ZQotRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2NvbnZlcnNpb25WYWx1ZXNPYmplY3RWYWx1ZUNvbHVtbiA9IE9iamVjdCBWYWx1ZQotRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2RlZmF1bHRPYmplY3RWYWx1ZUxhYmVsID0gRGVmYXVsdCBvYmplY3QgdmFsdWU6Ci1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfY29udmVyc2lvblZhbHVlc0dyb3VwVGl0bGUgPSBDb252ZXJzaW9uIHZhbHVlcwotRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfYWRkQ29udmVyc2lvblZhbHVlID0gQWRkIENvbnZlcnNpb24gVmFsdWUKLUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2VkaXRDb252ZXJzaW9uVmFsdWUgPSBFZGl0IENvbnZlcnNpb24gVmFsdWUKLUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2FkZENvbnZlcnNpb25WYWx1ZURlc2NyaXB0aW9uVGl0bGUgPSBDcmVhdGUgbmV3IGNvbnZlcnNpb24gdmFsdWUKLUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2FkZENvbnZlcnNpb25WYWx1ZURlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IGNvbnZlcnNpb24gdmFsdWUgc2V0dGluZyBib3RoIHRoZSAnZGF0YSB2YWx1ZScgYW5kIHRoZSAnb2JqZWN0IHZhbHVlJwotRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfZWRpdENvbnZlcnNpb25WYWx1ZURlc2NyaXB0aW9uVGl0bGUgPSBFZGl0IGNvbnZlcnNpb24gdmFsdWUKLUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2VkaXRDb252ZXJzaW9uVmFsdWVEZXNjcmlwdGlvbiA9IEVkaXQgdGhlIGNvbnZlcnNpb24gdmFsdWUsIGNoYW5naW5nIHRoZSAnZGF0YSB2YWx1ZScgb3IgJ29iamVjdCB2YWx1ZScKLQotRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfZGF0YVZhbHVlID0gRGF0YSB2YWx1ZToKLUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX29iamVjdFZhbHVlID0gT2JqZWN0IHZhbHVlOgotRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdF9kYXRhVmFsdWVNdXN0QmVTcGVjaWZpZWQgPSBBIGRhdGEgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQuCi1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0X29iamVjdFZhbHVlTXVzdEJlU3BlY2lmaWVkID0gQW4gb2JqZWN0IHZhbHVlIG11c3QgYmUgc3BlY2lmaWVkLgotRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdF9kYXRhVmFsdWVBbHJlYWR5RXhpc3RzID0gVGhpcyBkYXRhIHZhbHVlIGlzIGFscmVhZHkgc3BlY2lmaWVkLCBjYW5ub3QgbWFwIG11bHRpcGxlIG9iamVjdCB2YWx1ZXMgdG8gdGhlIHNhbWUgZGF0YSB2YWx1ZS4KLQotCi1FY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZV9wcml2YXRlT3duZWRMYWJlbCA9IFByaXZhdGUgb3duZWQKLUVjbGlwc2VMaW5rUmVhZE9ubHlDb21wb3NpdGVfcmVhZE9ubHlMYWJlbCA9IFJlYWQtb25seQotRWNsaXBzZUxpbmtSZWFkT25seUNvbXBvc2l0ZV9yZWFkT25seVdpdGhEZWZhdWx0ID0gUmVhZC1vbmx5ICh7MH0pCi1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJDb21wb3NpdGVfZGF0YVR5cGVMYWJlbCA9IERhdGEgdHlwZToKLUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9vYmplY3RUeXBlTGFiZWwgPSBPYmplY3QgdHlwZToKLQotRGVmYXVsdEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbD1EZWZhdWx0IChPbmUgdG8gT25lKQotRGVmYXVsdEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsPURlZmF1bHQgKFZhcmlhYmxlIE9uZSB0byBPbmUpCi1EZWZhdWx0RWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcl9sYWJlbD1EZWZhdWx0IChPbmUgdG8gTWFueSkKLURlZmF1bHRFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsPWRlZmF1bHQgKG9uZSB0byBvbmUpCi1EZWZhdWx0RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsPWRlZmF1bHQgKHZhcmlhYmxlIG9uZSB0byBvbmUpCi1EZWZhdWx0RWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw9ZGVmYXVsdCAob25lIHRvIG1hbnkpCi0KLQkKLUVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nX25hbWU9TmFtZToKLUVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nX2NvbnZlcnRlclR5cGU9VHlwZToKLUVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nX2FkZENvbnZlcnRlcj1BZGQgQ29udmVydGVyCi1FY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZ19hZGRDb252ZXJ0ZXJEZXNjcmlwdGlvblRpdGxlPUNyZWF0ZSBuZXcgY29udmVydGVyCi1FY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZ19hZGRDb252ZXJ0ZXJEZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgY29udmVydGVyIHNldHRpbmcgYm90aCB0aGUgJ25hbWUnIGFuZCB0aGUgJ3R5cGUnCi1FY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0X25hbWVFeGlzdHMgPVRoZSBnaXZlbiBuYW1lIGFscmVhZHkgZXhpc3RzLiBUaGlzIGNvbnZlcnRlciBtYXkgb3ZlcnJpZGUgdGhlIGV4aXN0aW5nIG9uZShzKSB3aXRoIHRoZSBzYW1lIG5hbWUuCi1FY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0X25hbWVJc1Jlc2VydmVkID0gVGhlIGdpdmVuIG5hbWUgaXMgYSByZXNlcnZlZCBuYW1lCi1FY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0X25hbWVNdXN0QmVTcGVjaWZpZWQgPSBBIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuCi1FY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0X3R5cGVNdXN0QmVTcGVjaWZpZWQgPSBBIGNvbnZlcnRlciB0eXBlIG11c3QgYmUgc3BlY2lmaWVkLgotCi1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGVfcXVlcmllcz1RdWVyaWVzCi0KLVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zX2dyb3VwTGFiZWw9VGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucwotVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9uYW1lTGFiZWw9TmFtZToKLVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfZGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5OYW1lTGFiZWw9RGVmYXVsdCAoezB9KQotVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV90YWJsZUxhYmVsPVRhYmxlOgotVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9jb250ZXh0UHJvcGVydHlMYWJlbD1Db250ZXh0IHByb3BlcnR5OgotVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9kaXNjcmltaW5hdG9yVHlwZUxhYmVsPURpc2NyaW1pbmF0b3IgdHlwZToKLVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfbGVuZ3RoTGFiZWw9TGVuZ3RoOgotVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9jb2x1bW5EZWZpbml0aW9uTGFiZWw9Q29sdW1uIGRlZmluaXRpb246Ci1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX3ByaW1hcnlLZXlXaXRoRGVmYXVsdD1QcmltYXJ5IGtleSAoezB9KQotVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9wcmltYXJ5S2V5PVByaW1hcnkga2V5Ci0KLUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0NvbXBvc2l0ZV9jb2xsYXBzaWJsZVNlY3Rpb249VGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1ucwotRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3lfb3ZlcnJpZGVEZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnM9T3ZlcnJpZGUgZGVmYXVsdAotCi1FY2xpcHNlTGlua011bHRpdGVuYW5jeUNvbXBvc2l0ZV9zdHJhdGVneT1NdWx0aXRlbmFudCBzdHJhdGVneToKLUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Q29tcG9zaXRlX3NpbmdsZV90YWJsZT1TaW5nbGUgVGFibGUKLUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Q29tcG9zaXRlX3RhYmxlX3Blcl90ZW5hbnQ9VGFibGUgUGVyIFRlbmFudAotRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3lDb21wb3NpdGVfdnBkPVZQRAotRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3lDb21wb3NpdGVfaW5jbHVkZUNyaXRlcmlhPUluY2x1ZGUgY3JpdGVyaWEKLUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Q29tcG9zaXRlX2luY2x1ZGVDcml0ZXJpYVdpdGhEZWZhdWx0PUluY2x1ZGUgY3JpdGVyaWEgKHswfSkKLQotRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlX21heENvbnZlcnRlcnNFcnJvck1lc3NhZ2U9TWF4aW11bSBudW1iZXIgb2YgY29udmVydGVycyBzdXBwb3J0ZWQgb24gdGhpcyBlbGVtZW50IGlzIHswfS4KLQotT3JtQXR0cmlidXRlVHlwZUNvbXBvc2l0ZV9hdHRyaWJ1dGVUeXBlPUF0dHJpYnV0ZSB0eXBlOgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9wcm9wZXJ0eV9maWxlcy9lY2xpcHNlbGlua191aV9keW5hbWljX2VudGl0eV9nZW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvcHJvcGVydHlfZmlsZXMvZWNsaXBzZWxpbmtfdWlfZHluYW1pY19lbnRpdHlfZ2VuLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZWFjN2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9wcm9wZXJ0eV9maWxlcy9lY2xpcHNlbGlua191aV9keW5hbWljX2VudGl0eV9nZW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCi0KLQotR2VuZXJhdGVEeW5hbWljRW50aXRpZXNXaXphcmRfZ2VuZXJhdGVFbnRpdGllcz1HZW5lcmF0ZSBEeW5hbWljIEVudGl0aWVzCi1HZW5lcmF0ZUR5bmFtaWNFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2RvbWFpbkphdmFDbGFzcz1EeW5hbWljIGNsYXNzIGRlZmF1bHRzCi1HZW5lcmF0ZUR5bmFtaWNFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX3htbE1hcHBpbmdGaWxlPVhNTCBNYXBwaW5nIEZpbGU6CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL0pwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2QzMzY1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4KLXsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkiOwotCi0JCi0JLy8gKioqKioqKioqKiBzaW5nbGV0b24gKioqKioqKioqKgotCXByaXZhdGUgc3RhdGljIEpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4gSU5TVEFOQ0U7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gUGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBKcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLSAgICAgICAgbG9nKG1zZywgbnVsbCk7Ci0gICAgfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIG9yIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlsb2codGhyb3dhYmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgdGhyb3dhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGFuZCBleGNlcHRpb24gb3IgZXJyb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCB0aHJvd2FibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBzdGF0dXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBJTlNUQU5DRS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0KLQotCS8vICoqKioqKioqKiogSW1hZ2UgQVBJICoqKioqKioqKioKLQkvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkgewotCQlpZiAoISBrZXkuc3RhcnRzV2l0aCgiaWNvbnMvIikpIHsKLQkJCWtleSA9ICJpY29ucy8iICsga2V5OwotCQl9Ci0JCWlmICghIGtleS5lbmRzV2l0aCgiLmdpZiIpKSB7Ci0JCQlrZXkgPSBrZXkgKyAiLmdpZiI7Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBrZXkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBhbiBpbWFnZSBmb3IgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlcgotCSAqLwotCS8vVE9ETyB3ZSBhcmUgdXNpbmcgdGhlIEltYWdlUmVnaXN0cnkgaGVyZSBhbmQgc3RvcmluZyBhbGwgb3VyIGljb25zIGZvciB0aGUgbGlmZSBvZiB0aGUgcGx1Z2luLCAKLQkvL3doaWNoIG1lYW5zIHVudGlsIHRoZSB3b3Jrc3BhY2UgaXMgY2xvc2VkLiAgVGhpcyBpcyBiZXR0ZXIgdGhhbiBiZWZvcmUgd2hlcmUgd2UgY29uc3RhbnRseSAKLQkvL2NyZWF0ZWQgbmV3IGltYWdlcy4gQnVnIDMwNjQzNyBpcyBhYm91dCBjbGVhbmluZyB0aGlzIHVwIGFuZCB1c2luZyBMb2NhbCBSZXNvdXJjZSBNYW5hZ2VycyAKLQkvL29uIG91ciB2aWV3cyBzbyB0aGF0IGNsb3NpbmcgdGhlIEpQQSBwZXJzcGVjdGl2ZSB3b3VsZCBtZWFuIG91ciBpY29ucyBhcmUgZGlzcG9zZWQuCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IGluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCQlJbWFnZSBpbWFnZSA9IGltYWdlUmVnaXN0cnkuZ2V0KGtleSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlpbWFnZVJlZ2lzdHJ5LnB1dChrZXksIGdldEltYWdlRGVzY3JpcHRvcihrZXkpKTsKLQkJCWltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0KLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChJTlNUQU5DRSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZDRmNWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW47Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIERhbGkgRWNsaXBzZUxpbmsgVUkuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKLSAqIGltcGxlbWVudGVkLgotICogPC9wPgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcyB7Ci0KLQkvL0NvbnRleHRJRCBwcmVmaXgKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBKcHRKcGFVaVBsdWdpbi5QTFVHSU5fSUQgKyAiLiI7Ci0KLQkvL1BlcnNpc3RlbnQgVHlwZSBjb21wb3NpdGVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSElOR19BTFdBWVNfUkVGUkVTSCA9IFBSRUZJWCArICJjYWNoaW5nX2Fsd2F5c1JlZnJlc2giOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hJTkdfQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEUgPSBQUkVGSVggKyAiY2FjaGluZ19jYWNoZUNvb3JkaW5hdGlvblR5cGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hJTkdfQ0FDSEVfVFlQRSA9IFBSRUZJWCArICJjYWNoaW5nX2NhY2hlVHlwZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSElOR19ESVNBQkxFX0hJVFMgPSBQUkVGSVggKyAiY2FjaGluZ19kaXNhYmxlSGl0cyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSElOR19SRUZSRVNIX09OTFlfSUZfTkVXRVIgPSBQUkVGSVggKyAiY2FjaGluZ19yZWZyZXNoT25seUlmTmV3ZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hJTkdfU0hBUkVEID0gUFJFRklYICsgImNhY2hpbmdfc2hhcmVkIjsKLQotCS8vUGVyc2lzdGVuY2UgWG1sIEVkaXRvcgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX0NBQ0hJTkcgPSBQUkVGSVggKyAicGVyc2lzdGVuY2VfY2FjaGluZyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTiA9IFBSRUZJWCArICJwZXJzaXN0ZW5jZV9jdXN0b21pemF0aW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9MT0dHSU5HID0gUFJFRklYICsgInBlcnNpc3RlbmNlX2xvZ2dpbmciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX09QVElPTlMgPSBQUkVGSVggKyAicGVyc2lzdGVuY2Vfb3B0aW9ucyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfU0NIRU1BX0dFTkVSQVRJT04gPSBQUkVGSVggKyAicGVyc2lzdGVuY2Vfc2NoZW1hR2VuZXJhdGlvbiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9DQUNISU5HX0RFRkFVTFRfU0hBUkVEID0gUFJFRklYICsgImNhY2hpbmdfZGVmYXVsdFNoYXJlZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfQ0FDSElOR19ERUZBVUxUX1NJWkUgPSBQUkVGSVggKyAiY2FjaGluZ19kZWZhdWx0U2l6ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfQ0FDSElOR19ERUZBVUxUX1RZUEUgPSBQUkVGSVggKyAiY2FjaGluZ19kZWZhdWx0VHlwZSI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfTE9HR0lOR19FWENFUFRJT05TID0gUFJFRklYICsgImxvZ2dpbmdfZXhjZXB0aW9ucyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfTE9HR0lOR19MRVZFTCA9IFBSRUZJWCArICJsb2dnaW5nX2xldmVsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9MT0dHSU5HX1NFU1NJT04gPSBQUkVGSVggKyAibG9nZ2luZ19zZXNzaW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9MT0dHSU5HX1RIUkVBRCA9IFBSRUZJWCArICJsb2dnaW5nX3RocmVhZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfTE9HR0lOR19USU1FU1RBTVAgPSBQUkVGSVggKyAibG9nZ2luZ190aW1lU3RhbXAiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX09QVElPTlNfU0VTU0lPTl9OQU1FID0gUFJFRklYICsgIm9wdGlvbnNfc2Vzc2lvbk5hbWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX09QVElPTlNfU0VTU0lPTlNfWE1MID0gUFJFRklYICsgIm9wdGlvbnNfc2Vzc2lvbnNYbWwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX09QVElPTlNfVEFSR0VUX0RBVEFCQVNFID0gUFJFRklYICsgIm9wdGlvbnNfdGFyZ2V0RGF0YWJhc2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX09QVElPTlNfVEFSR0VUX1NFUlZFUiA9IFBSRUZJWCArICJvcHRpb25zX3RhcmdldFNlcnZlciI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSVRFTkFOQ1lfU1RSQVRFR1kgPSBQUkVGSVggKyAibXVsdGl0ZW5hbmN5X3N0cmF0ZWd5IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSVRFTkFOQ1lfSU5DTFVERV9DUklURVJJQSA9IFBSRUZJWCArICJtdWx0aXRlbmFuY3lfaW5jbHVkZUNyaXRlcmlhIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSVRFTkFOQ1lfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OUyA9IFBSRUZJWCArICJtdWx0aXRlbmFuY3lfdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9OQU1FID0gUFJFRklYICsgInRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fbmFtZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX1RBQkxFID0gUFJFRklYICsgInRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fdGFibGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9DT05URVhUX1BST1BFUlRZID0gUFJFRklYICsgInRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fY29udGV4dFByb3BlcnR5IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fRElTQ1JJTUlOQVRPUl9UWVBFID0gUFJFRklYICsgInRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5fZGlzY3JpbWluYXRvclR5cGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9QUklNQVJZX0tFWSA9IFBSRUZJWCArICJ0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uX3ByaW1hcnlLZXkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9MRU5HVEggPSBQUkVGSVggKyAidGVuYW50RGlzY3JpbWluYXRvckNvbHVtbl9sZW5ndGgiOwotCi0JLy9EeW5hbWljIEVudGl0eSBXaXphcmQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEWU5BTUlDX0VOVElUWV9DTEFTUyA9IFBSRUZJWCArICJkeW5hbWljRW50aXR5Q2xhc3MiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERZTkFNSUNfRU5USVRZX0ZJRUxEID0gUFJFRklYICsgImR5bmFtaWNFbnRpdHlGaWVsZCI7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0VjbGlwc2VMaW5rVWlNZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9FY2xpcHNlTGlua1VpTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIwOTBjNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0VjbGlwc2VMaW5rVWlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIExvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IEVsaXBzZUxpbmsgVUkuCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1VpTWVzc2FnZXMgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGluZ0ZpbGVXaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGluZ0ZpbGVXaXphcmRQYWdlX25ld0ZpbGVfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGluZ0ZpbGVXaXphcmRQYWdlX25ld0ZpbGVfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBwaW5nRmlsZVdpemFyZFBhZ2Vfb3B0aW9uc190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBwaW5nRmlsZVdpemFyZFBhZ2Vfb3B0aW9uc19kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX3Byb3ZpZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9icm93c2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX2Rlc2NyaXB0aW9uOwotCi0JLy8gR2VuZXJhbAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZ2VuZXJhbFNlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfbWFwcGVkQ2xhc3Nlc1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfbWFwcGVkQ2xhc3Nlc1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfeG1sTWFwcGluZ0ZpbGVzU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl94bWxNYXBwaW5nRmlsZXNTZWN0aW9uRGVzY3JpcHRpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX25hbWVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfcGVyc2lzdGVuY2VQcm92aWRlckxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9kZXNjcmlwdGlvbkxhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9leGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9leGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzV2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX21hcHBlZENsYXNzZXNOb05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX29wZW47Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX3htbE1hcHBpbmdGaWxlc0RpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfeG1sTWFwcGluZ0ZpbGVzRGlhbG9nX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX29ybU5vTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZXhjbHVkZUVjbGlwc2VsaW5rT3JtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9leGNsdWRlRWNsaXBzZWxpbmtPcm1XaXRoRGVmYXVsdDsKLQotCS8vIENvbm5lY3Rpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3RyYW5zYWN0aW9uVHlwZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfRGF0YWJhc2VfR3JvdXBCb3g7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjUHJvcGVydGllc0NvbXBvc2l0ZV9FY2xpcHNlTGlua0Nvbm5lY3Rpb25Qb29sX0dyb3VwQm94OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX0Nvbm5lY3Rpb25EaWFsb2dfTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfQ29ubmVjdGlvbkRpYWxvZ19UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZV9qdGE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlX3Jlc291cmNlX2xvY2FsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX25hdGl2ZVNxbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9uYXRpdmVTcWxMYWJlbERlZmF1bHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfYmF0Y2hXcml0aW5nTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXRjaFdyaXRpbmdDb21wb3NpdGVfbm9uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXRjaFdyaXRpbmdDb21wb3NpdGVfamRiYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXRjaFdyaXRpbmdDb21wb3NpdGVfYnVmZmVyZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmF0Y2hXcml0aW5nQ29tcG9zaXRlX29yYWNsZV9qZGJjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2NhY2hlU3RhdGVtZW50c0xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2p0YURhdGFTb3VyY2VMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbm9uSnRhRGF0YVNvdXJjZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2RyaXZlckxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl91cmxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfdXNlckxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9wYXNzd29yZExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9iaW5kUGFyYW1ldGVyc0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9iaW5kUGFyYW1ldGVyc0xhYmVsRGVmYXVsdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNTaGFyZWRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zU2hhcmVkTGFiZWxEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNTZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc01pbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNNYXhMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfd3JpdGVDb25uZWN0aW9uc1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfd3JpdGVDb25uZWN0aW9uc01pbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl93cml0ZUNvbm5lY3Rpb25zTWF4TGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjRXhjbHVzaXZlQ29ubmVjdGlvbnNQcm9wZXJ0aWVzQ29tcG9zaXRlX0dyb3VwQm94OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9leGNsdXNpdmVDb25uZWN0aW9uTW9kZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9sYXp5Q29ubmVjdGlvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9sYXp5Q29ubmVjdGlvbkxhYmVsRGVmYXVsdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNFeGNsdXNpdmVDb25uZWN0aW9uTW9kZUNvbXBvc2l0ZV9hbHdheXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlX2lzb2xhdGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNFeGNsdXNpdmVDb25uZWN0aW9uTW9kZUNvbXBvc2l0ZV90cmFuc2FjdGlvbmFsOwotCQotCS8vIFNjaGVtYUdlbmVyYXRpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX3NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfc2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kZWZhdWx0RG90OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RkbEdlbmVyYXRpb25UeXBlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX291dHB1dE1vZGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9jcmVhdGVEZGxGaWxlTmFtZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kcm9wRGRsRmlsZU5hbWVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dE1vZGVDb21wb3NpdGVfYm90aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRNb2RlQ29tcG9zaXRlX3NxbF9zY3JpcHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0TW9kZUNvbXBvc2l0ZV9kYXRhYmFzZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlX25vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGVfY3JlYXRlX3RhYmxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZV9kcm9wX2FuZF9jcmVhdGVfdGFibGVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RkbEdlbmVyYXRpb25Mb2NhdGlvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZV9kaWFsb2dNZXNzYWdlOwotCi0JLy8gQ2FjaGluZwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zZWN0aW9uRGVzY3JpcHRpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGVEZWZhdWx0c0NvbXBvc2l0ZV9ncm91cFRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2RlZmF1bHRDYWNoZVR5cGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfY2FjaGVUeXBlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfZGVmYXVsdFNoYXJlZENhY2hlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NoYXJlZENhY2hlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfZGVmYXVsdFNoYXJlZENhY2hlRGVmYXVsdExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zaGFyZWRDYWNoZURlZmF1bHRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY2hlU2l6ZUNvbXBvc2l0ZV9jYWNoZVNpemU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoZVR5cGVDb21wb3NpdGVfZnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoZVR5cGVDb21wb3NpdGVfaGFyZF93ZWFrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY2hlVHlwZUNvbXBvc2l0ZV9ub25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY2hlVHlwZUNvbXBvc2l0ZV9zb2Z0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY2hlVHlwZUNvbXBvc2l0ZV9zb2Z0X3dlYWs7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGVUeXBlQ29tcG9zaXRlX3dlYWs7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlX2RlZmF1bHRDYWNoZVNpemU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlX2Z1bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV9oYXJkX3dlYWs7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV9ub25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGVfc29mdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlX3NvZnRfd2VhazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlX3dlYWs7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlEaWFsb2dfc2VsZWN0RW50aXR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eURpYWxvZ19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGluZ0VudGl0eUxpc3RDb21wb3NpdGVfZ3JvdXBUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoaW5nRW50aXR5TGlzdENvbXBvc2l0ZV9lZGl0QnV0dG9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGluZ0VudGl0eUxpc3RDb21wb3NpdGVfZGlhbG9nTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoaW5nRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9GbHVzaENsZWFyQ2FjaGVMYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGbHVzaENsZWFyQ2FjaGVDb21wb3NpdGVfZHJvcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGbHVzaENsZWFyQ2FjaGVDb21wb3NpdGVfZHJvcF9pbnZhbGlkYXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZV9tZXJnZTsKLQkKLQkvLyBDdXN0b21pemF0aW9uCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9zZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nUHJvcGVydGllc0dyb3VwQm94OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0xhenlMYWJlbERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdMYXp5TGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0NoYW5nZVRyYWNraW5nTGFiZWxEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nQ2hhbmdlVHJhY2tpbmdMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nRmV0Y2hHcm91cHNMYWJlbERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdGZXRjaEdyb3Vwc0xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdJbnRlcm5hbExhYmVsRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ludGVybmFsTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0VhZ2VyTGFiZWxEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nRWFnZXJMYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdGhyb3dFeGNlcHRpb25zTGFiZWxEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aHJvd0V4Y2VwdGlvbnNMYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfZXhjZXB0aW9uSGFuZGxlckxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2VhdmluZ0NvbXBvc2l0ZV90cnVlXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXZWF2aW5nQ29tcG9zaXRlX2ZhbHNlXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXZWF2aW5nQ29tcG9zaXRlX3N0YXRpY187Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDdXN0b21pemF0aW9uRW50aXR5TGlzdENvbXBvc2l0ZV9ncm91cFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2VkaXRCdXR0b247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDdXN0b21pemF0aW9uRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ1RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9jdXN0b21pemVyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Nlc3Npb25DdXN0b21pemVyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX25vTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0aW9uT25seUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0aW9uT25seUxhYmVsRGVmYXVsdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0ZVNjaGVtYUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0ZVNjaGVtYUxhYmVsRGVmYXVsdDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfcHJvZmlsZXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfYnJvd3NlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2ZpbGVyQ29tcG9zaXRlX3BlcmZvcm1hbmNlX3Byb2ZpbGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2ZpbGVyQ29tcG9zaXRlX3F1ZXJ5X21vbml0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvZmlsZXJDb21wb3NpdGVfbm9fcHJvZmlsZXI7Ci0KLQkvLyBMb2dnaW5nCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZGVmYXVsdFN0ZG91dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9jYXRlZ29yeUxvZ2dpbmdMZXZlbFNlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2luZ0xldmVsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3NxbExvZ2dpbmdMZXZlbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90cmFuc2FjdGlvbkxvZ2dpbmdMZXZlbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9ldmVudExvZ2dpbmdMZXZlbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9jb25uZWN0aW9uTG9nZ2luZ0xldmVsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3F1ZXJ5TG9nZ2luZ0xldmVsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2NhY2hlTG9nZ2luZ0xldmVsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3Byb3BhZ2F0aW9uTG9nZ2luZ0xldmVsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3NlcXVlbmNpbmdMb2dnaW5nTGV2ZWxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZWpiTG9nZ2luZ0xldmVsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2Rtc0xvZ2dpbmdMZXZlbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9lamJfb3JfbWV0YWRhdGFMb2dnaW5nTGV2ZWxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfanBhX21ldGFtb2RlbExvZ2dpbmdMZXZlbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl93ZWF2ZXJMb2dnaW5nTGV2ZWxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfcHJvcGVydGllc0xvZ2dpbmdMZXZlbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZXJ2ZXJMb2dnaW5nTGV2ZWxMYWJlbDsKLQkJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2luZ0xldmVsQ29tcG9zaXRlX29mZjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnaW5nTGV2ZWxDb21wb3NpdGVfc2V2ZXJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvZ2dpbmdMZXZlbENvbXBvc2l0ZV93YXJuaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvZ2dpbmdMZXZlbENvbXBvc2l0ZV9pbmZvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvZ2dpbmdMZXZlbENvbXBvc2l0ZV9jb25maWc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2ZpbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2ZpbmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvZ2dpbmdMZXZlbENvbXBvc2l0ZV9maW5lc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2FsbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGVfb2ZmOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGVfc2V2ZXJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGVfd2FybmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlX2luZm87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9jb25maWc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9maW5lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGVfZmluZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9maW5lc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9hbGw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2VyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2Jyb3dzZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvZ2dlckNvbXBvc2l0ZV9kZWZhdWx0X2xvZ2dlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnZXJDb21wb3NpdGVfamF2YV9sb2dnZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2VyQ29tcG9zaXRlX3NlcnZlcl9sb2dnZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGltZXN0YW1wTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RpbWVzdGFtcExhYmVsRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGhyZWFkTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RocmVhZExhYmVsRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2Vzc2lvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZXNzaW9uTGFiZWxEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9leGNlcHRpb25zTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2V4Y2VwdGlvbnNMYWJlbERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2Nvbm5lY3Rpb25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfY29ubmVjdGlvbkxhYmVsRGVmYXVsdDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2Vyc0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9sb2dnaW5nRmlsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2luZ0ZpbGVMb2NhdGlvbkNvbXBvc2l0ZV9kaWFsb2dUaXRsZTsKLQotCS8vIFNlc3Npb24gT3B0aW9ucwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2Vzc2lvblNlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2Vzc2lvblNlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2Vzc2lvbnNYbWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2luY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xhYmVsRGVmYXVsdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9ldmVudExpc3RlbmVyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RhcmdldERhdGFiYXNlTGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX21pc2NlbGxhbmVvdXNTZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX21pc2NlbGxhbmVvdXNTZWN0aW9uRGVzY3JpcHRpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RlbXBvcmFsTXV0YWJsZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90ZW1wb3JhbE11dGFibGVMYWJlbERlZmF1bHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9hdHR1bml0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9hdXRvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2Nsb3Vkc2NhcGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfZGF0YWJhc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfZGIyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2RiMm1haW5mcmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9kYmFzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9kZXJieTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9oc3FsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2luZm9ybWl4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2phdmFkYjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9tYXhkYjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9teXNxbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9vcmFjbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfb3JhY2xlMTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfb3JhY2xlMTA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfb3JhY2xlOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9vcmFjbGU4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX3BvaW50YmFzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9wb3N0Z3Jlc3FsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX3NxbGFueXdoZXJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX3NxbHNlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9zeWJhc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfc3ltZm93YXJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX3RpbWVzdGVuOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RhcmdldFNlcnZlckxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9ub05hbWU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0U2VydmVyQ29tcG9zaXRlX25vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0U2VydmVyQ29tcG9zaXRlX29jNGo7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3N1bmFzOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRTZXJ2ZXJDb21wb3NpdGVfd2Vic3BoZXJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJzcGhlcmVfNl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJzcGhlcmVfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRTZXJ2ZXJDb21wb3NpdGVfd2VibG9naWM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3dlYmxvZ2ljXzk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3dlYmxvZ2ljXzEwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldFNlcnZlckNvbXBvc2l0ZV9qYm9zczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRTZXJ2ZXJDb21wb3NpdGVfbmV0d2VhdmVyXzdfMTsKLQotCS8vIERETCBHZW5lcmF0aW9uCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaV9nZW5lcmF0aW5nRERMV2FybmluZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWlfZ2VuZXJhdGluZ0RETFdhcm5pbmdNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWlfZXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUNMSVBTRUxJTktfR0VORVJBVEVfVEFCTEVTX0pPQjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFQ0xJUFNFTElOS19HRU5FUkFURV9UQUJMRVNfVEFTSzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0aW9uT3V0cHV0TW9kZVdpemFyZFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGlvbk91dHB1dE1vZGVXaXphcmRQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGlvbk91dHB1dE1vZGVXaXphcmRQYWdlX2dlbmVyYXRpb25PdXRwdXRNb2RlOwotCQotCS8vIE1ldGFkYXRhIENvbnZlcnNpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXZhTWV0YWRhdGFDb252ZXJzaW9uX25vQ29udmVydGVyc1RvQ29udmVydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXZhQ29udmVydGVyQ29udmVyc2lvbldpemFyZFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmF2YUNvbnZlcnRlckNvbnZlcnNpb25XaXphcmRQYWdlX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphdmFNZXRhZGF0YUNvbnZlcnNpb25fZXF1aXZhbGVudENvbnZlcnRlcnNXYXJuaW5nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmF2YU1ldGFkYXRhQ29udmVyc2lvbl9lcXVpdmFsZW50Q29udmVydGVyc1dhcm5pbmdNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphdmFNZXRhZGF0YUNvbnZlcnNpb25fZXF1aXZhbGVudEdlbmVyYXRvcnNXYXJuaW5nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmF2YU1ldGFkYXRhQ29udmVyc2lvbl9lcXVpdmFsZW50R2VuZXJhdG9yc1dhcm5pbmdNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphdmFNZXRhZGF0YUNvbnZlcnNpb25fZXF1aXZhbGVudFF1ZXJpZXNXYXJuaW5nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmF2YU1ldGFkYXRhQ29udmVyc2lvbl9lcXVpdmFsZW50UXVlcmllc1dhcm5pbmdNZXNzYWdlOwotCi0JLy8gU3RhdGljIFdlYXZpbmcKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlbGlua1ByZWZlcmVuY2VQYWdlX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VsaW5rUHJlZmVyZW5jZVBhZ2Vfc3RhdGljV2VhdmluZ0dyb3VwQm94OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VsaW5rUHJlZmVyZW5jZVBhZ2Vfd2VhdmVDbGFzc2VzT25CdWlsZExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VsaW5rUHJlZmVyZW5jZVBhZ2Vfc291cmNlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZWxpbmtQcmVmZXJlbmNlUGFnZV9zZWxlY3RTb3VyY2VMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlbGlua1ByZWZlcmVuY2VQYWdlX3NvdXJjZUZvbGRlclNlbGVjdGlvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VsaW5rUHJlZmVyZW5jZVBhZ2VfdGFyZ2V0TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZWxpbmtQcmVmZXJlbmNlUGFnZV9zZWxlY3RUYXJnZXRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlbGlua1ByZWZlcmVuY2VQYWdlX3RhcmdldEZvbGRlclNlbGVjdGlvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VsaW5rUHJlZmVyZW5jZVBhZ2VfcGVyc2lzdGVuY2VJbmZvTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZWxpbmtQcmVmZXJlbmNlUGFnZV9zZWxlY3RQZXJzaXN0ZW5jZUluZm9MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlbGlua1ByZWZlcmVuY2VQYWdlX3BlcnNpc3RlbmNlSW5mb0ZvbGRlclNlbGVjdGlvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VsaW5rUHJlZmVyZW5jZVBhZ2VfbG9nTGV2ZWxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlbGlua1ByZWZlcmVuY2VQYWdlX2Jyb3dzZTsKLQotCS8vIE5ldyBEeW5hbWljIEVudGl0eQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRHluYW1pY0VudGl0eVdpemFyZF9hcHBseUVtYmVkZGVkSWRNYXBwaW5nSW5mbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmRfYm90aElEQW5kRW1iZWRkZWRJRERlZmluZWRFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmRfYnJvd3NlQnR0b25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmRfZHluYW1pY1R5cGVFeGlzdHNFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmRfZHluYW1pY1R5cGVXaXRoRGlmZkNhc2VFeGlzdHNFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmRfaW52YWxpZEFyZ3VtZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRHluYW1pY0VudGl0eVdpemFyZF9pbnZhbGlkUEtUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRHluYW1pY0VudGl0eVdpemFyZF9tdWx0aXBsZUVtYmVkZGVkSURzRGVmaW5lZEVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRHluYW1pY0VudGl0eVdpemFyZF9wZXJzaXN0ZW5jZVVuaXROb3RGb3VuZEVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRHluYW1pY0VudGl0eVdpemFyZF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmRfdHlwZUV4aXN0c1dhcm5pbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtEeW5hbWljRW50aXR5V2l6YXJkX3R5cGVOb3RJblByb2plY3RDbGFzc3BhdGg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtEeW5hbWljRW50aXR5V2l6YXJkX3R5cGVXaXRoRGlmZkNhc2VFeGlzdHNXYXJuaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV9jaG9vc2VYTUxEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV9jaG9vc2VYTUxEaWFsb2dfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIER5bmFtaWNFbnRpdHlDbGFzc1dpemFyZFBhZ2VfY2xhc3NOYW1lTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV9kZWZhdWx0UGFja2FnZVdhcm5pbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIER5bmFtaWNFbnRpdHlDbGFzc1dpemFyZFBhZ2VfZW1wdHlTdHJpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV9lbnRpdHlOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIER5bmFtaWNFbnRpdHlDbGFzc1dpemFyZFBhZ2VfaW52YWxpZFhNTE5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV9qYXZhUGFja2FnZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIER5bmFtaWNFbnRpdHlDbGFzc1dpemFyZFBhZ2VfcGFja2FnZVNlbGVjdGlvbkRpYWxvZ19kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIER5bmFtaWNFbnRpdHlDbGFzc1dpemFyZFBhZ2VfcGFja2FnZVNlbGVjdGlvbkRpYWxvZ19tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV9wYWNrYWdlU2VsZWN0aW9uRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIER5bmFtaWNFbnRpdHlDbGFzc1dpemFyZFBhZ2VfcHJvamVjdE5hbWVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEeW5hbWljRW50aXR5Q2xhc3NXaXphcmRQYWdlX3RhYmxlTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEeW5hbWljRW50aXR5Q2xhc3NXaXphcmRQYWdlX3RhYmxlTmFtZUdyb3VwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIER5bmFtaWNFbnRpdHlDbGFzc1dpemFyZFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV91c2VEZWZ1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV94bWxHcm91cDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEeW5hbWljRW50aXR5Q2xhc3NXaXphcmRQYWdlX3htbE5hbWVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEeW5hbWljRW50aXR5Q2xhc3NXaXphcmRQYWdlX3htbE5vdExpc3RlZEVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHluYW1pY0VudGl0eUZpZWxkc1dpemFyZFBhZ2VfYWRkQnV0dG9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHluYW1pY0VudGl0eUZpZWxkc1dpemFyZFBhZ2VfYWRkRHluYW1pY0VudGl0eUZpZWxkRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIER5bmFtaWNFbnRpdHlGaWVsZHNXaXphcmRQYWdlX2F0dHJpYnV0ZVR5cGVDb2x1bW5MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEeW5hbWljRW50aXR5RmllbGRzV2l6YXJkUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIER5bmFtaWNFbnRpdHlGaWVsZHNXaXphcmRQYWdlX2R1cGxpY2F0ZUVudGl0eUZpZWxkc0Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIER5bmFtaWNFbnRpdHlGaWVsZHNXaXphcmRQYWdlX2VkaXRCdXR0b25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEeW5hbWljRW50aXR5RmllbGRzV2l6YXJkUGFnZV9lbnRpdHlGaWVsZEdyb3VwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIER5bmFtaWNFbnRpdHlGaWVsZHNXaXphcmRQYWdlX21hcHBpbmdUeXBlQ29sdW1uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHluYW1pY0VudGl0eUZpZWxkc1dpemFyZFBhZ2VfbmFtZUNvbHVtbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIER5bmFtaWNFbnRpdHlGaWVsZHNXaXphcmRQYWdlX25vSnBhUHJvamVjdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHluYW1pY0VudGl0eUZpZWxkc1dpemFyZFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHluYW1pY0VudGl0eUZpZWxkc1dpemFyZFBhZ2VfcmVtb3ZlQnV0dG9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRWaXJ0dWFsQXR0cmlidXRlRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFZpcnR1YWxBdHRyaWJ1dGVEaWFsb2dfbmFtZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFZpcnR1YWxBdHRyaWJ1dGVEaWFsb2dfbWFwcGluZ0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFZpcnR1YWxBdHRyaWJ1dGVEaWFsb2dfYXR0cmlidXRlVHlwZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFZpcnR1YWxBdHRyaWJ1dGVEaWFsb2dfbm9NYXBwaW5nS2V5RXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkVmlydHVhbEF0dHJpYnV0ZURpYWxvZ19ub05hbWVFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRWaXJ0dWFsQXR0cmlidXRlRGlhbG9nX25vQXR0cmlidXRlVHlwZUVycm9yOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJlY2xpcHNlbGlua191aSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBFY2xpcHNlTGlua1VpTWVzc2FnZXMuY2xhc3M7Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKLQl9Ci0JCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1VpTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb21tYW5kcy9HZW5lcmF0ZUR5bmFtaWNFbnRpdGllc0hhbmRsZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29tbWFuZHMvR2VuZXJhdGVEeW5hbWljRW50aXRpZXNIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYmIwMWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb21tYW5kcy9HZW5lcmF0ZUR5bmFtaWNFbnRpdGllc0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuUGxhdGZvcm1Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLndpemFyZHMuZ2VuLkdlbmVyYXRlRHluYW1pY0VudGl0aWVzRnJvbVNjaGVtYVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVEeW5hbWljRW50aXRpZXNIYW5kbGVyCi0JCWV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQkKLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl0aGlzLmV4ZWN1dGVfKGV2ZW50KTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVfKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uQ2hlY2tlZChldmVudCk7Ci0JCUpwYVByb2plY3QgcHJvamVjdCA9IFBsYXRmb3JtVG9vbHMuZ2V0QWRhcHRlcihzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCksIEpwYVByb2plY3QuY2xhc3MpOwotCQlHZW5lcmF0ZUR5bmFtaWNFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQgd2l6YXJkID0gbmV3IEdlbmVyYXRlRHluYW1pY0VudGl0aWVzRnJvbVNjaGVtYVdpemFyZChwcm9qZWN0LCBzZWxlY3Rpb24pOwotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhIYW5kbGVyVXRpbC5nZXRBY3RpdmVTaGVsbENoZWNrZWQoZXZlbnQpLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWludCByZXR1cm5Db2RlID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKHJldHVybkNvZGUgIT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NvbW1hbmRzL0phdmFDb252ZXJ0ZXJDb252ZXJzaW9uSGFuZGxlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb21tYW5kcy9KYXZhQ29udmVydGVyQ29udmVyc2lvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkwYzIxMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NvbW1hbmRzL0phdmFDb252ZXJ0ZXJDb252ZXJzaW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtLkVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmNvbW1hbmRzLkFic3RyYWN0SmF2YU1ldGFkYXRhQ29udmVyc2lvbkhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhQ29udmVydGVyQ29udmVyc2lvbkhhbmRsZXIKLQlleHRlbmRzIEFic3RyYWN0SmF2YU1ldGFkYXRhQ29udmVyc2lvbkhhbmRsZXIKLXsKLQlwdWJsaWMgSmF2YUNvbnZlcnRlckNvbnZlcnNpb25IYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbnZlcnRKYXZhTWV0YWRhdGEoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCXRoaXMuZ2V0SnBhUGxhdGZvcm1VaShqcGFQcm9qZWN0KS5jb252ZXJ0SmF2YUNvbnZlcnRlck1ldGFkYXRhVG9HbG9iYWwoanBhUHJvamVjdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaSBnZXRKcGFQbGF0Zm9ybVVpKEpwYVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaSkgc3VwZXIuZ2V0SnBhUGxhdGZvcm1VaShwcm9qZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RkbGdlbi9FY2xpcHNlTGlua0RETEdlbmVyYXRvclVpLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RkbGdlbi9FY2xpcHNlTGlua0RETEdlbmVyYXRvclVpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OTU0ZDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZGxnZW4vRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRkbGdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmRpYWxvZ3MuT3B0aW9uYWxNZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk91dHB1dE1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmRkbGdlbi5FY2xpcHNlTGlua0RETEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLkpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZGxnZW4ud2l6YXJkcy5HZW5lcmF0ZURETFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqICBFY2xpcHNlTGlua0RMTEdlbmVyYXRvclVpIGlzIHVzZWQgYnkgdGhlIEVjbGlwc2VMaW5rUGxhdGZvcm1VaSB0byBpbml0aWF0ZSAKLSAqICB0aGUgZXhlY3V0aW9uIG9mIEVjbGlwc2VMaW5rIERETCBnZW5lcmF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0RETEdlbmVyYXRvclVpCi17Ci0JcHJpdmF0ZSBmaW5hbCBKcGFQcm9qZWN0IHByb2plY3Q7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3RyaW5nVG9vbHMuQ1I7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlKEpwYVByb2plY3QgcHJvamVjdCkgewotCQluZXcgRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaShwcm9qZWN0KS5nZW5lcmF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0RETEdlbmVyYXRvclVpKEpwYVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcigpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlKCkgewotCi0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5pdGVyYXRvcigpLm5leHQoKTsgLy8gVGFrZSB0aGUgZmlyc3QgcGVyc2lzdGVuY2VVbml0Ci0JCVN0cmluZyBwdU5hbWUgPSBwZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpOwotCi0JCUdlbmVyYXRlRERMV2l6YXJkIHdpemFyZCA9IG5ldyBHZW5lcmF0ZURETFdpemFyZCh0aGlzLnByb2plY3QpOwotCQlXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyh0aGlzLmdldEN1cnJlbnRTaGVsbCgpLCB3aXphcmQpOwotCQl3aXphcmREaWFsb2cuY3JlYXRlKCk7Ci0JCWlmKHdpemFyZC5nZXRQYWdlQ291bnQoKSA+IDApIHsKLQkJCWludCByZXR1cm5Db2RlID0gd2l6YXJkRGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZXR1cm5Db2RlID09IFdpbmRvdy5DQU5DRUwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJT3V0cHV0TW9kZSBvdXRwdXRNb2RlID0gd2l6YXJkLmdldE91dHB1dE1vZGUoKTsKLQotCQlpZigob3V0cHV0TW9kZSAhPSBPdXRwdXRNb2RlLnNxbF9zY3JpcHQpICYmICggISB0aGlzLmRpc3BsYXlHZW5lcmF0aW5nRERMV2FybmluZygpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVdvcmtzcGFjZUpvYiBqb2IgPSB0aGlzLmJ1aWxkR2VuZXJhdGVERExKb2IocHVOYW1lLCB0aGlzLnByb2plY3QsIG91dHB1dE1vZGUpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFdvcmtzcGFjZUpvYiBidWlsZEdlbmVyYXRlRERMSm9iKFN0cmluZyBwdU5hbWUsIEpwYVByb2plY3QgcHJvamVjdCwgT3V0cHV0TW9kZSBvdXRwdXRNb2RlKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJhdGVERExKb2IocHVOYW1lLCBwcm9qZWN0LCBvdXRwdXRNb2RlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTaGVsbCBnZXRDdXJyZW50U2hlbGwoKSB7Ci0JICAgIHJldHVybiBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBkaXNwbGF5R2VuZXJhdGluZ0RETFdhcm5pbmcoKSB7Ci0JCWlmICghT3B0aW9uYWxNZXNzYWdlRGlhbG9nLmlzRGlhbG9nRW5hYmxlZChPdmVyd3JpdGVDb25maXJtZXJEaWFsb2cuSUQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCU92ZXJ3cml0ZUNvbmZpcm1lckRpYWxvZyBkaWFsb2cgPSBuZXcgT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nKHRoaXMuZ2V0Q3VycmVudFNoZWxsKCkpOwotCQkJcmV0dXJuIGRpYWxvZy5vcGVuKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQ7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIFBlcnNpc3RlbmNlIFVuaXQgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtIGdldFBsYXRmb3JtKCkgewotCQlyZXR1cm4gdGhpcy5wcm9qZWN0LmdldEpwYVBsYXRmb3JtKCk7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8UGVyc2lzdGVuY2VVbml0PiBnZXRQZXJzaXN0ZW5jZVVuaXRzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2UgZ2V0UGVyc2lzdGVuY2UoKSB7Ci0JCXJldHVybiB0aGlzLnByb2plY3QuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogcnVubmFibGUgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBHZW5lcmF0ZURETEpvYiBleHRlbmRzIFdvcmtzcGFjZUpvYiB7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIHB1TmFtZTsKLQkJcHJpdmF0ZSBmaW5hbCBKcGFQcm9qZWN0IHByb2plY3Q7Ci0JCXByaXZhdGUgZmluYWwgT3V0cHV0TW9kZSBvdXRwdXRNb2RlOwotCi0JCXB1YmxpYyBHZW5lcmF0ZURETEpvYihTdHJpbmcgcHVOYW1lLCBKcGFQcm9qZWN0IHByb2plY3QsIE91dHB1dE1vZGUgb3V0cHV0TW9kZSkgewotCQkJc3VwZXIoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkVDTElQU0VMSU5LX0dFTkVSQVRFX1RBQkxFU19KT0IpOwotCQkJdGhpcy5wdU5hbWUgPSBwdU5hbWU7Ci0JCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCQkJdGhpcy5vdXRwdXRNb2RlID0gb3V0cHV0TW9kZTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSVN0YXR1cyBydW5JbldvcmtzcGFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkVDTElQU0VMSU5LX0dFTkVSQVRFX1RBQkxFU19UQVNLLCAxKTsKLQkJCXRyeSB7Ci0JCQkJdGhpcy5kZGxHZW5lcmF0b3JHZW5lcmF0ZSh0aGlzLnB1TmFtZSwgdGhpcy5wcm9qZWN0LCB0aGlzLm91dHB1dE1vZGUsIHNtLm5ld0NoaWxkKDEpKTsKLQkJCX0gCi0JCQljYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCX0KLQkJCWNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CQkJCQotCQkJCXRoaXMubG9nRXhjZXB0aW9uKHJlKTsKLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgZGRsR2VuZXJhdG9yR2VuZXJhdGUoU3RyaW5nIHB1TmFtZSwgSnBhUHJvamVjdCBwcm9qZWN0LCBPdXRwdXRNb2RlIG91dHB1dE1vZGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJRWNsaXBzZUxpbmtERExHZW5lcmF0b3IuZ2VuZXJhdGUocHVOYW1lLCBwcm9qZWN0LCBvdXRwdXRNb2RlLCBtb25pdG9yKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGxvZ0V4Y2VwdGlvbihSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0JCQlTdHJpbmcgbXNnID0gcmUuZ2V0TWVzc2FnZSgpOwotCQkJU3RyaW5nIG1lc3NhZ2UgPSAobXNnID09IG51bGwpID8gcmUudG9TdHJpbmcoKSA6IG1zZzsKLQkJCXRoaXMuZGlzcGxheUVycm9yKG1lc3NhZ2UpOwotCQkJSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbi5sb2cocmUpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgZGlzcGxheUVycm9yKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCQlTV1RVdGlsLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKAotCQkJCQkJZ2V0U2hlbGwoKSwKLQkJCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlTGlua0RETEdlbmVyYXRvclVpX2Vycm9yLAotCQkJCQkJbWVzc2FnZQotCQkJCQkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFNoZWxsIGdldFNoZWxsKCkgewotCQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCQlTaGVsbCBzaGVsbCA9IChkaXNwbGF5ID09IG51bGwpID8gbnVsbCA6IGRpc3BsYXkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJCWlmIChzaGVsbCA9PSBudWxsICYmIGRpc3BsYXkgIT0gbnVsbCkgewotCQkJCVNoZWxsW10gc2hlbGxzID0gZGlzcGxheS5nZXRTaGVsbHMoKTsKLQkJCQlpZiAoc2hlbGxzLmxlbmd0aCA+IDApCi0JCQkJCXNoZWxsID0gc2hlbGxzWzBdOwotCQkJfQotCQkJcmV0dXJuIHNoZWxsOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBvdmVyd3JpdGUgZGlhbG9nICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBPdmVyd3JpdGVDb25maXJtZXJEaWFsb2cgZXh0ZW5kcyBPcHRpb25hbE1lc3NhZ2VEaWFsb2cgewotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRD0gImRvbnRTaG93T3ZlcndyaXRlRXhpc3RpbmdUYWJsZXNGcm9tQ2xhc3Nlcy53YXJuaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JCU92ZXJ3cml0ZUNvbmZpcm1lckRpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJCXN1cGVyKElELCBwYXJlbnQsCi0JCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlTGlua0RETEdlbmVyYXRvclVpX2dlbmVyYXRpbmdERExXYXJuaW5nVGl0bGUsCi0JCQkJCU5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlTGlua0RETEdlbmVyYXRvclVpX2dlbmVyYXRpbmdERExXYXJuaW5nTWVzc2FnZSwgQ1IsICBDUiArIENSKSwKLQkJCQkJTWVzc2FnZURpYWxvZy5XQVJOSU5HLAotCQkJCQluZXcgU3RyaW5nW10ge0lEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMfSwKLQkJCQkJMSk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXRoaXMuY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQsIElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLCBmYWxzZSk7Ci0JCQl0aGlzLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuTk9fSUQsIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUwsIHRydWUpOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RkbGdlbi93aXphcmRzL0VjbGlwc2VMaW5rMl8wRERMR2VuZXJhdG9yVWkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGRsZ2VuL3dpemFyZHMvRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3JVaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTk3OTYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGRsZ2VuL3dpemFyZHMvRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3JVaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGRsZ2VuLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuT3V0cHV0TW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuZGRsZ2VuLkVjbGlwc2VMaW5rMl8wRERMR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGRsZ2VuLkVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWk7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rMl8wRERMR2VuZXJhdG9yVWkKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wRERMR2VuZXJhdG9yVWkgZXh0ZW5kcyBFY2xpcHNlTGlua0RETEdlbmVyYXRvclVpCi17Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2QgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlKEpwYVByb2plY3QgcHJvamVjdCkgewotCQluZXcgRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3JVaShwcm9qZWN0KS5nZW5lcmF0ZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkKLQlwcml2YXRlIEVjbGlwc2VMaW5rMl8wRERMR2VuZXJhdG9yVWkoSnBhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKHByb2plY3QpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFdvcmtzcGFjZUpvYiBidWlsZEdlbmVyYXRlRERMSm9iKFN0cmluZyBwdU5hbWUsIEpwYVByb2plY3QgcHJvamVjdCwgT3V0cHV0TW9kZSBvdXRwdXRNb2RlKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJhdGUyXzBERExKb2IocHVOYW1lLCBwcm9qZWN0LCBvdXRwdXRNb2RlKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHJ1bm5hYmxlICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgR2VuZXJhdGUyXzBERExKb2IgZXh0ZW5kcyBFY2xpcHNlTGlua0RETEdlbmVyYXRvclVpLkdlbmVyYXRlRERMSm9iIHsKLQotCQlwdWJsaWMgR2VuZXJhdGUyXzBERExKb2IoU3RyaW5nIHB1TmFtZSwgSnBhUHJvamVjdCBwcm9qZWN0LCBPdXRwdXRNb2RlIG91dHB1dE1vZGUpIHsKLQkJCXN1cGVyKHB1TmFtZSwgcHJvamVjdCwgb3V0cHV0TW9kZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGRsR2VuZXJhdG9yR2VuZXJhdGUoU3RyaW5nIHB1TmFtZSwgSnBhUHJvamVjdCBwcm9qZWN0LCBPdXRwdXRNb2RlIG91dHB1dE1vZGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3IuZ2VuZXJhdGUocHVOYW1lLCBwcm9qZWN0LCBvdXRwdXRNb2RlLCBtb25pdG9yKTsKLQkJfQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZGxnZW4vd2l6YXJkcy9HZW5lcmF0ZURETFdpemFyZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZGxnZW4vd2l6YXJkcy9HZW5lcmF0ZURETFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGE5NDA5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGRsZ2VuL3dpemFyZHMvR2VuZXJhdGVERExXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRkbGdlbi53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk91dHB1dE1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5EYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2U7Ci0KLS8qKgotICogIEdlbmVyYXRlRERMV2l6YXJkCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZURETFdpemFyZCBleHRlbmRzIFdpemFyZCB7CQotCi0JcHJpdmF0ZSBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0KLQlwcml2YXRlIERhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZSBkYlNldHRpbmdzUGFnZTsKLQlwcml2YXRlIEdlbmVyYXRpb25PdXRwdXRNb2RlV2l6YXJkUGFnZSBnZW5lcmF0aW9uT3V0cHV0TW9kZVBhZ2U7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXB1YmxpYyBHZW5lcmF0ZURETFdpemFyZChKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJdGhpcy5zZXRXaW5kb3dUaXRsZShKcHRVaU1lc3NhZ2VzLkdlbmVyYXRlRERMV2l6YXJkX3RpdGxlKTsgCi0JfQotCi0JLy8gKioqKioqKioqKiBJV2l6YXJkIGltcGxlbWVudGF0aW9uICAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc3VwZXIuYWRkUGFnZXMoKTsKLQkJaWYodGhpcy5nZXRKcGFQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUoKSA9PSBudWxsKSB7Ci0JCQl0aGlzLmRiU2V0dGluZ3NQYWdlID0gbmV3IERhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZSh0aGlzLmpwYVByb2plY3QpOwotCQkJdGhpcy5hZGRQYWdlKHRoaXMuZGJTZXR0aW5nc1BhZ2UpOwotCQl9Ci0JCXRoaXMuZ2VuZXJhdGlvbk91dHB1dE1vZGVQYWdlID0gbmV3IEdlbmVyYXRpb25PdXRwdXRNb2RlV2l6YXJkUGFnZSgpOwotCQl0aGlzLmFkZFBhZ2UodGhpcy5nZW5lcmF0aW9uT3V0cHV0TW9kZVBhZ2UpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkgIT0gbnVsbCk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotICAgIAlyZXR1cm4gdGhpcy5kYlNldHRpbmdzUGFnZUNhbkZpbmlzaCgpICYmIHRoaXMuZ2VuZXJhdGlvbk91dHB1dE1vZGVQYWdlQ2FuRmluaXNoKCk7Ci0gICAgfQotICAgIAotCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgotICAgIAotICAgIHB1YmxpYyBPdXRwdXRNb2RlIGdldE91dHB1dE1vZGUoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRpb25PdXRwdXRNb2RlUGFnZS5nZXRPdXRwdXRNb2RlKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGJTZXR0aW5nc1BhZ2VDYW5GaW5pc2goKSB7Ci0JCXJldHVybiAodGhpcy5kYlNldHRpbmdzUGFnZSAhPSBudWxsKSA/IHRoaXMuZGJTZXR0aW5nc1BhZ2UuaXNQYWdlQ29tcGxldGUoKSA6IHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRpb25PdXRwdXRNb2RlUGFnZUNhbkZpbmlzaCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGlvbk91dHB1dE1vZGVQYWdlLmlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCQotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0LmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZGxnZW4vd2l6YXJkcy9HZW5lcmF0aW9uT3V0cHV0TW9kZVdpemFyZFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGRsZ2VuL3dpemFyZHMvR2VuZXJhdGlvbk91dHB1dE1vZGVXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZTYwZDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZGxnZW4vd2l6YXJkcy9HZW5lcmF0aW9uT3V0cHV0TW9kZVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZGxnZW4ud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk91dHB1dE1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotCi0vKioKLSAqICBHZW5lcmF0aW9uT3V0cHV0TW9kZVdpemFyZFBhZ2UKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRpb25PdXRwdXRNb2RlV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JR2VuZXJhdGlvbk91dHB1dE1vZGVHcm91cCBvdXRwdXRNb2RlR3JvdXA7Ci0JCi0JcHVibGljIEdlbmVyYXRpb25PdXRwdXRNb2RlV2l6YXJkUGFnZSgpIHsKLQkJc3VwZXIoIkRhdGFiYXNlIFNjaGVtYSIpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuc2V0VGl0bGUoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkdlbmVyYXRpb25PdXRwdXRNb2RlV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXRoaXMuc2V0TWVzc2FnZShFY2xpcHNlTGlua1VpTWVzc2FnZXMuR2VuZXJhdGlvbk91dHB1dE1vZGVXaXphcmRQYWdlX2Rlc2MpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLnNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQkJdGhpcy5zZXRDb250cm9sKHRoaXMuYnVpbGRUb3BMZXZlbENvbnRyb2wocGFyZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkVG9wTGV2ZWxDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXRoaXMub3V0cHV0TW9kZUdyb3VwID0gbmV3IEdlbmVyYXRpb25PdXRwdXRNb2RlR3JvdXAoY29tcG9zaXRlKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIE91dHB1dE1vZGUgZ2V0T3V0cHV0TW9kZSgpIHsKLQkJcmV0dXJuIHRoaXMub3V0cHV0TW9kZUdyb3VwLmdldE91dHB1dE1vZGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogR2VuZXJhdGlvbiBPdXRwdXRNb2RlIEdyb3VwICoqKioqKioqKioKLQotCWNsYXNzIEdlbmVyYXRpb25PdXRwdXRNb2RlR3JvdXAgewotCQlwcml2YXRlIE91dHB1dE1vZGUgb3V0cHV0TW9kZTsKLQkJCi0JCXByaXZhdGUgZmluYWwgQnV0dG9uIGRhdGFiYXNlQnV0dG9uOwotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBzcWxTY3JpcHRCdXR0b247Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIGJvdGhCdXR0b247Ci0JCQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCQlwcml2YXRlIEdlbmVyYXRpb25PdXRwdXRNb2RlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIoKTsKLQkJCUdyb3VwIG91dHB1dE1vZGVHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotCQkJb3V0cHV0TW9kZUdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQkJb3V0cHV0TW9kZUdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJb3V0cHV0TW9kZUdyb3VwLnNldFRleHQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkdlbmVyYXRpb25PdXRwdXRNb2RlV2l6YXJkUGFnZV9nZW5lcmF0aW9uT3V0cHV0TW9kZSk7Ci0JCQkvLyBUT0RPIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5ncm91cCwgSnBhSGVscENvbnRleHRJZHMuWFhYKTsKLQotCQkJU2VsZWN0aW9uTGlzdGVuZXIgb3V0cHV0TW9kZUJ1dHRvbkxpc3RlbmVyID0gdGhpcy5idWlsZE91dHB1dE1vZGVSYWRpb0J1dHRvbkxpc3RlbmVyKCk7Ci0KLQkJCXRoaXMuZGF0YWJhc2VCdXR0b24gPSB0aGlzLmJ1aWxkUmFkaW9CdXR0b24ob3V0cHV0TW9kZUdyb3VwLCAKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuT3V0cHV0TW9kZUNvbXBvc2l0ZV9kYXRhYmFzZSwgb3V0cHV0TW9kZUJ1dHRvbkxpc3RlbmVyLCAzKTsKLQkJCQotCQkJdGhpcy5zcWxTY3JpcHRCdXR0b24gPSB0aGlzLmJ1aWxkUmFkaW9CdXR0b24ob3V0cHV0TW9kZUdyb3VwLCAKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuT3V0cHV0TW9kZUNvbXBvc2l0ZV9zcWxfc2NyaXB0LCBvdXRwdXRNb2RlQnV0dG9uTGlzdGVuZXIsIDMpOwotCQkJCi0JCQl0aGlzLmJvdGhCdXR0b24gPSB0aGlzLmJ1aWxkUmFkaW9CdXR0b24ob3V0cHV0TW9kZUdyb3VwLCAKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuT3V0cHV0TW9kZUNvbXBvc2l0ZV9ib3RoLCBvdXRwdXRNb2RlQnV0dG9uTGlzdGVuZXIsIDMpOwotCi0JCQl0aGlzLmRhdGFiYXNlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCXRoaXMub3V0cHV0TW9kZUJ1dHRvbkNoYW5nZWQoKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogbGlzdGVuZXJzICoqKioqKioqKioKLQkJCi0JCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRPdXRwdXRNb2RlUmFkaW9CdXR0b25MaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXRoaXMud2lkZ2V0U2VsZWN0ZWQoZXZlbnQpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlvdXRwdXRNb2RlQnV0dG9uQ2hhbmdlZCgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJCi0JCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkJcHJpdmF0ZSB2b2lkIG91dHB1dE1vZGVCdXR0b25DaGFuZ2VkKCkgewotCi0JCQlpZih0aGlzLmRhdGFiYXNlQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJdGhpcy5vdXRwdXRNb2RlID0gT3V0cHV0TW9kZS5kYXRhYmFzZTsKLQkJCX0KLQkJCWVsc2UgaWYodGhpcy5zcWxTY3JpcHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQl0aGlzLm91dHB1dE1vZGUgPSBPdXRwdXRNb2RlLnNxbF9zY3JpcHQ7Ci0JCQl9Ci0JCQllbHNlIGlmKHRoaXMuYm90aEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCXRoaXMub3V0cHV0TW9kZSA9IE91dHB1dE1vZGUuYm90aDsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgQnV0dG9uIGJ1aWxkUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyLCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJCUJ1dHRvbiByYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCQlyYWRpb0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCXJhZGlvQnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCQlyYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQlyZXR1cm4gcmFkaW9CdXR0b247Ci0JCX0KLQotCQlwcml2YXRlIE91dHB1dE1vZGUgZ2V0T3V0cHV0TW9kZSgpIHsKLQkJCXJldHVybiB0aGlzLm91dHB1dE1vZGU7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFY2xpcHNlTGlua0FycmF5TWFwcGluZzJfM1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzNVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhMGRkYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFY2xpcHNlTGlua0FycmF5TWFwcGluZzJfM1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFY2xpcHNlTGlua0FycmF5TWFwcGluZzJfM1VpRGVmaW5pdGlvbjxNLCBUIGV4dGVuZHMgRWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzM+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb248TSwgVD4KLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RFY2xpcHNlTGlua0FycmF5TWFwcGluZzJfM1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcHRKcGFVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLkpQQV9DT05URU5UKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuQXJyYXlNYXBwaW5nMl8zX2xhYmVsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuQXJyYXlNYXBwaW5nMl8zX2xpbmtMYWJlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQVJSQVlfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNGJmZWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb248TSwgVCBleHRlbmRzIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4KLQlleHRlbmRzIEFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUPgotewotCXByb3RlY3RlZCBBYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnB0SnBhVWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5KUEFfQ09OVEVOVCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzg0ZWY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQgZXh0ZW5kcyBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZz4KLQlleHRlbmRzIEFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUPgotewotCXByb3RlY3RlZCBBYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcHRKcGFVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLkpQQV9DT05URU5UKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX01BUF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFY2xpcHNlTGlua1N0cnVjdHVyZU1hcHBpbmcyXzNVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5MzUwNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFY2xpcHNlTGlua1N0cnVjdHVyZU1hcHBpbmcyXzNVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdHVyZU1hcHBpbmcyXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfM1VpRGVmaW5pdGlvbjxNLCBUIGV4dGVuZHMgRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zPgotCWV4dGVuZHMgQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQ+Ci17Ci0JcHJvdGVjdGVkIEFic3RyYWN0RWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwdEpwYVVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuSlBBX0NPTlRFTlQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlczJfMC5TdHJ1Y3R1cmVNYXBwaW5nMl8zX2xhYmVsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuU3RydWN0dXJlTWFwcGluZzJfM19saW5rTGFiZWw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLlNUUlVDVFVSRV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ODRiMDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb248TSwgVCBleHRlbmRzIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nPgotCWV4dGVuZHMgQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQ+Ci17Ci0JcHJvdGVjdGVkIEFic3RyYWN0RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwdEpwYVVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuSlBBX0NPTlRFTlQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVFJBTlNGT1JNQVRJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU3YTUxZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUIGV4dGVuZHMgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZz4KLQlleHRlbmRzIEFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUPgotewkKLQlwcm90ZWN0ZWQgQWJzdHJhY3RFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcHRKcGFVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLkpQQV9DT05URU5UKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5WQVJJQUJMRV9PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmsyXzRQcm9qZWN0RmxhZ01vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmsyXzRQcm9qZWN0RmxhZ01vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MjY1ZWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rMl80UHJvamVjdEZsYWdNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci0KLS8qKgotICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIEpQQSBwcm9qZWN0IHN1cHBvcnRzIEVjbGlwc2VMaW5rIDIuNAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzRQcm9qZWN0RmxhZ01vZGVsPFQgZXh0ZW5kcyBKcGFOb2RlPgotCWV4dGVuZHMgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VCwgQm9vbGVhbj4KLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzRQcm9qZWN0RmxhZ01vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxUPiBqcGFQcm9qZWN0TW9kZWwpIHsgCi0JCXN1cGVyKGpwYVByb2plY3RNb2RlbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtXyhUIHZhbHVlKSB7Ci0JCXJldHVybiBCb29sZWFuLnZhbHVlT2YoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLm5vZGVJc0VjbGlwc2VMaW5rMl80Q29tcGF0aWJsZSh2YWx1ZSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5YmQwYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLQotLyoqCi0gKiBUaGlzIGNvbXBvc2l0ZSBzaW1wbHkgc2hvd3MgYSB0cmktc3RhdGUgY2hlY2sgYm94IGZvciB0aGUgQWx3YXlzIFJlZnJlc2ggb3B0aW9uLgotICogCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZwotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua0NhY2hpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PcHRpb25hbENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlX2Fsd2F5c1JlZnJlc2hMYWJlbCwKLQkJCWJ1aWxkQWx3YXlzUmVmcmVzaEhvbGRlcigpLAotCQkJYnVpbGRBbHdheXNSZWZyZXNoU3RyaW5nSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLkNBQ0hJTkdfQUxXQVlTX1JFRlJFU0gKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQWx3YXlzUmVmcmVzaEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEFsd2F5c1JlZnJlc2hTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRBbHdheXNSZWZyZXNoSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGVfYWx3YXlzUmVmcmVzaERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZV9hbHdheXNSZWZyZXNoTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdEFsd2F5c1JlZnJlc2hIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX0FMV0FZU19SRUZSRVNIX1BST1BFUlRZLAotCQkJRWNsaXBzZUxpbmtDYWNoaW5nLkRFRkFVTFRfQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjYjY4ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0FycmF5TWFwcGluZzJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua0FycmF5TWFwcGluZzJfMz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzM+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjRlMjhlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU1hbnlUb09uZU1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZTYxZWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklNYW55VG9PbmVNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI3NTJjMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNlRW51bWVyYXRlZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Mb2JDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZVRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011dGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0QmFzaWNNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5Db2x1bW5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkVudW1UeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGVtcG9yYWxUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ29sdW1uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRW51bVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcHRpb25hbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE11dGFibGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgTG9iQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgQmFzaWNNYXBwaW5nCi0gKiBAc2VlIENvbHVtbkNvbXBvc2l0ZQotICogQHNlZSBFbnVtVHlwZUNvbXBvc2l0ZQotICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKLSAqIEBzZWUgTG9iQ29tcG9zaXRlCi0gKiBAc2VlIE9wdGlvbmFsQ29tcG9zaXRlCi0gKiBAc2VlIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGU8VCBleHRlbmRzIEJhc2ljTWFwcGluZz4gZXh0ZW5kcyBBYnN0cmFjdEJhc2ljTWFwcGluZ0NvbXBvc2l0ZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QmFzaWNNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUJhc2ljTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBFY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQmFzaWNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IENvbHVtbkNvbXBvc2l0ZSh0aGlzLCBidWlsZENvbHVtbkhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNCkpOwotCQluZXcgRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkTXV0YWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVHlwZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkoKEdyaWRMYXlvdXQpIGNvbnRhaW5lci5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDI7Ci0KLQkJLy8gTm8gY29udmVydGVyCi0JCUJ1dHRvbiBub0NvbnZlcnRlckJ1dHRvbiA9IGFkZFJhZGlvQnV0dG9uKAotCQkJY29udGFpbmVyLCAKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX2RlZmF1bHQsIAotCQkJYnVpbGRDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKG51bGwpLCAKLQkJCW51bGwpOwotCQkoKEdyaWREYXRhKSBub0NvbnZlcnRlckJ1dHRvbi5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJCi0JCS8vIExvYgotCQlCdXR0b24gbG9iQnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCi0JCQljb250YWluZXIsIAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fbG9iLCAKLQkJCWJ1aWxkQ29udmVydGVyQm9vbGVhbkhvbGRlcihMb2JDb252ZXJ0ZXIuY2xhc3MpLCAKLQkJCW51bGwpOwotCQkoKEdyaWREYXRhKSBsb2JCdXR0b24uZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIgPSBidWlsZENvbnZlcnRlckhvbGRlcigpOwotCQkvLyBUZW1wb3JhbAotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbnRhaW5lciwgCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl90ZW1wb3JhbCwgCi0JCQlidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKSwgCi0JCQludWxsKTsKLQkJcmVnaXN0ZXJTdWJQYW5lKG5ldyBUZW1wb3JhbFR5cGVDb21wb3NpdGUoYnVpbGRUZW1wb3JhbENvbnZlcnRlckhvbGRlcihjb252ZXJ0ZXJIb2xkZXIpLCBjb250YWluZXIsIGdldFdpZGdldEZhY3RvcnkoKSkpOwotCQkKLQkJCi0JCS8vIEVudW1lcmF0ZWQKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb250YWluZXIsIAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fZW51bWVyYXRlZCwgCi0JCQlidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIuY2xhc3MpLCAKLQkJCW51bGwpOwotCQlyZWdpc3RlclN1YlBhbmUobmV3IEVudW1UeXBlQ29tcG9zaXRlKGJ1aWxkRW51bWVyYXRlZENvbnZlcnRlckhvbGRlcihjb252ZXJ0ZXJIb2xkZXIpLCBjb250YWluZXIsIGdldFdpZGdldEZhY3RvcnkoKSkpOwotCi0JCS8vIEVjbGlwc2VMaW5rIENvbnZlcnRlcgotCQlCdXR0b24gZWxDb252ZXJ0ZXJCdXR0b24gPSBhZGRSYWRpb0J1dHRvbigKLQkJCWNvbnRhaW5lciwgCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX2NvbnZlcnRlZCwgCi0JCQlidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzKSwgCi0JCQludWxsKTsKLQkJKChHcmlkRGF0YSkgZWxDb252ZXJ0ZXJCdXR0b24uZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJUGFuZTxFY2xpcHNlTGlua0NvbnZlcnQ+IGNvbnZlcnRDb21wb3NpdGUgPSBidWlsZENvbnZlcnRDb21wb3NpdGUoYnVpbGRFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcihjb252ZXJ0ZXJIb2xkZXIpLCBjb250YWluZXIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IChHcmlkRGF0YSkgY29udmVydENvbXBvc2l0ZS5nZXRDb250cm9sKCkuZ2V0TGF5b3V0RGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMDsKLQkJcmVnaXN0ZXJTdWJQYW5lKGNvbnZlcnRDb21wb3NpdGUpOwotCX0KLQotCXByb3RlY3RlZCBQYW5lPEVjbGlwc2VMaW5rQ29udmVydD4gYnVpbGRDb252ZXJ0Q29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnQ+IGNvbnZlcnRIb2xkZXIsIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUoY29udmVydEhvbGRlciwgY29udGFpbmVyLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rTXV0YWJsZT4gYnVpbGRNdXRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBFY2xpcHNlTGlua011dGFibGU+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtNdXRhYmxlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSB0aGlzLnN1YmplY3QpLmdldE11dGFibGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnQ+IGJ1aWxkRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyLCBFY2xpcHNlTGlua0NvbnZlcnQ+KGNvbnZlcnRlckhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJ0IHRyYW5zZm9ybV8oQ29udmVydGVyIGNvbnZlcnRlcikgewotCQkJCXJldHVybiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcyA/IChFY2xpcHNlTGlua0NvbnZlcnQpIGNvbnZlcnRlciA6IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfY29udmVydGVycwotCQkpOwotCQlpbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oY29udGFpbmVyLCB0aGlzLmJ1aWxkQ29udmVydGVySG9sZGVyVmFsdWVNb2RlbCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZSh0aGlzLCBjb252ZXJ0ZXJIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXJWYWx1ZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgdGhpcy5zdWJqZWN0KS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiNDdmOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IENvb3JkaW5hdGlvbiBUeXBlOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua0NhY2hpbmc+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2FjaGVUeXBlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZT4gYWRkQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFY2xpcHNlTGlua0NhY2hpbmcuREVGQVVMVF9DT09SRElOQVRJT05fVFlQRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9DT09SRElOQVRJT05fVFlQRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlW10gZ2V0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIHZhbHVlKSB7Ci0JCQkJc3dpdGNoICh2YWx1ZSkgewotCQkJCQljYXNlIElOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX2ludmFsaWRhdGVfY2hhbmdlZF9vYmplY3RzOwotCQkJCQljYXNlIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX3NlbmRfbmV3X29iamVjdHNfd2l0aF9jaGFuZ2VzOwotCQkJCQljYXNlIFNFTkRfT0JKRUNUX0NIQU5HRVMgOgotCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGVfc2VuZF9vYmplY3RfY2hhbmdlczsKLQkJCQkJY2FzZSBOT05FIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX25vbmU7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSh2YWx1ZSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX2xhYmVsLAotCQkJYWRkQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tYm8oY29udGFpbmVyKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuQ0FDSElOR19DQUNIRV9DT09SRElOQVRJT05fVFlQRQotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2FjaGVTaXplQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMWI3NzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2FjaGVTaXplQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkludGVnZXJDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgU2l6ZTogICAgICAgICAgICAgIHwgSSAgICAgICAgIHxJfCAgRGVmYXVsdCAoWFhYKSAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZwotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rQ2FjaGluZz4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DYWNoZVNpemVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVTaXplQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlhZGRTaXplQ29tYm8oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFNpemVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBJbnRlZ2VyQ29tYm88RWNsaXBzZUxpbmtDYWNoaW5nPih0aGlzLCBjb250YWluZXIpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZV9zaXplOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ly9KcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9MRU5HVEg7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX1NJWkVfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX1NJWkVfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRTaXplKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRTaXplKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2M3ZjJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgVHlwZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZwotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rQ2FjaGluZz4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DYWNoZVR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEVjbGlwc2VMaW5rQ2FjaGVUeXBlPiBhZGRDYWNoZVR5cGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPEVjbGlwc2VMaW5rQ2FjaGluZywgRWNsaXBzZUxpbmtDYWNoZVR5cGU+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX1RZUEVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfVFlQRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVUeXBlW10gZ2V0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtDYWNoZVR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRUeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rQ2FjaGVUeXBlIHZhbHVlKSB7Ci0JCQkJc3dpdGNoICh2YWx1ZSkgewotCQkJCQljYXNlIEZVTEwgOgotCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfZnVsbDsKLQkJCQkJY2FzZSBXRUFLIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX3dlYWs7Ci0JCQkJCWNhc2UgU09GVCA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9zb2Z0OwotCQkJCQljYXNlIFNPRlRfV0VBSyA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9zb2Z0X3dlYWs7Ci0JCQkJCWNhc2UgSEFSRF9XRUFLIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX2hhcmRfd2VhazsKLQkJCQkJY2FzZSBDQUNIRSA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9jYWNoZTsKLQkJCQkJY2FzZSBOT05FIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX25vbmU7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoZVR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRUeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoRWNsaXBzZUxpbmtDYWNoZVR5cGUgdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkVHlwZSh2YWx1ZSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX2xhYmVsLAotCQkJYWRkQ2FjaGVUeXBlQ29tYm8oY29udGFpbmVyKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuQ0FDSElOR19DQUNIRV9UWVBFCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWRkOWYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZUhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYW5lIHNob3dzIHRoZSBjYWNoaW5nIG9wdGlvbnMuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgeCBTaGFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIENhY2hlVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICBDYWNoZVNpemVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgPiBBZHZhbmNlZCAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRXhwaXJ5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUFsd2F5c1JlZnJlc2hDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgCQlSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRGlzYWJsZUhpdHNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUNhY2hlQ29vcmRpbmF0aW9uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEV4aXN0ZW5jZVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZTxUIGV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nPiBleHRlbmRzIFBhbmU8VD4KLXsKLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLSAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXIsCi0gICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZWFibGUyXzA+IGNhY2hlYWJsZUhvbGRlciA9IGJ1aWxkQ2FjaGVhYmxlSG9sZGVyKCk7Ci0JCQotCQkvL1NoYXJlZCBDaGVjayBib3gsIHVuY2hlY2sgdGhpcyBhbmQgdGhlIHJlc3Qgb2YgdGhlIHBhbmVsIGlzIGRpc2FibGVkCi0JCWFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCA4KSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkVudGl0eV9jYWNoZWFibGVMYWJlbCwKLQkJCWJ1aWxkU3BlY2lmaWVkQ2FjaGVhYmxlSG9sZGVyKGNhY2hlYWJsZUhvbGRlciksCi0JCQlidWlsZENhY2hlYWJsZVN0cmluZ0hvbGRlcihjYWNoZWFibGVIb2xkZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX0NBQ0hFQUJMRQotCQkpOwotCi0JCUNvbXBvc2l0ZSBzdWJQYW5lID0gYWRkU3ViUGFuZShjb250YWluZXIsIDAsIDE2KTsKLQotCQlDb2xsZWN0aW9uPFBhbmU8Pz4+IHBhbmVzID0gbmV3IEFycmF5TGlzdDxQYW5lPD8+PigpOwotCQkKLQkJdGhpcy5pbml0aWFsaXplVHlwZVNlY3Rpb24oc3ViUGFuZSwgcGFuZXMpOwotCQkKLQkJLy8gQWR2YW5jZWQgc3ViLXBhbmUKLQkJQ29tcG9zaXRlIGFkdmFuY2VkU2VjdGlvbiA9IGFkZENvbGxhcHNpYmxlU3ViU2VjdGlvbigKLQkJCXN1YlBhbmUsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZV9hZHZhbmNlZCwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5GQUxTRSkKLQkJKTsKLQotCQlpbml0aWFsaXplQWR2YW5jZWRQYW5lKGFkZFN1YlBhbmUoYWR2YW5jZWRTZWN0aW9uLCAwLCAxNiksIHBhbmVzKTsKLQkJCQotCQluZXcgUGFuZUVuYWJsZXIoYnVpbGRDYWNoZWFibGVFbmFibGVyKGNhY2hlYWJsZUhvbGRlciksIHBhbmVzKTsKLQkJCi0JCWluaXRpYWxpemVFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZShhZGRTdWJQYW5lKGNvbnRhaW5lciwgOCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlYWJsZTJfMD4gYnVpbGRDYWNoZWFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQ2FjaGVhYmxlMl8wPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhY2hlYWJsZTJfMCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChDYWNoZWFibGVIb2xkZXIyXzApIHRoaXMuc3ViamVjdCkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVR5cGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIENvbGxlY3Rpb248UGFuZTw/Pj4gcGFuZXMpIHsKLQkJcGFuZXMuYWRkKG5ldyBFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpKTsKLQkJcGFuZXMuYWRkKG5ldyBFY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQWR2YW5jZWRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIENvbGxlY3Rpb248UGFuZTw/Pj4gcGFuZXMpIHsKLQkJcGFuZXMuYWRkKG5ldyBFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpKTsKLQkJcGFuZXMuYWRkKG5ldyBFY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGUodGhpcywgY29udGFpbmVyKSk7Ci0JCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUodGhpcywgY29udGFpbmVyKSk7Ci0JCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpKTsKLQkJcGFuZXMuYWRkKG5ldyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZUV4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpOwotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ2FjaGVhYmxlRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGVhYmxlMl8wPiBjYWNoZWFibGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGVhYmxlMl8wLCBCb29sZWFuPigKLQkJCQljYWNoZWFibGVIb2xkZXIsCi0JCQkJQ2FjaGVhYmxlMl8wLlNQRUNJRklFRF9DQUNIRUFCTEVfUFJPUEVSVFksIAotCQkJCUNhY2hlYWJsZTJfMC5ERUZBVUxUX0NBQ0hFQUJMRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0NhY2hlYWJsZSgpKTsKLQkJCX0KLQkJfTsKLQl9CQotCQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFNwZWNpZmllZENhY2hlYWJsZUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGVhYmxlMl8wPiBjYWNoZWFibGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGVhYmxlMl8wLCBCb29sZWFuPihjYWNoZWFibGVIb2xkZXIsIENhY2hlYWJsZTJfMC5TUEVDSUZJRURfQ0FDSEVBQkxFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ2FjaGVhYmxlU3RyaW5nSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZWFibGUyXzA+IGNhY2hlYWJsZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0Q2FjaGVhYmxlSG9sZGVyKGNhY2hlYWJsZUhvbGRlcikpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuRW50aXR5X2NhY2hlYWJsZVdpdGhEZWZhdWx0TGFiZWwsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlczJfMC5FbnRpdHlfY2FjaGVhYmxlTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdENhY2hlYWJsZUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGVhYmxlMl8wPiBjYWNoZWFibGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGVhYmxlMl8wLCBCb29sZWFuPigKLQkJCWNhY2hlYWJsZUhvbGRlciwKLQkJCUNhY2hlYWJsZTJfMC5TUEVDSUZJRURfQ0FDSEVBQkxFX1BST1BFUlRZLAotCQkJQ2FjaGVhYmxlMl8wLkRFRkFVTFRfQ0FDSEVBQkxFX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZDRkNmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcGFuZSBzaG93cyB0aGUgY2FjaGluZyBvcHRpb25zLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IHggU2hhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICBDYWNoZVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgQ2FjaGVTaXplQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgID4gQWR2YW5jZWQgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUV4cGlyeUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIAlBbHdheXNSZWZyZXNoQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIAkJUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCURpc2FibGVIaXRzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIAlDYWNoZUNvb3JkaW5hdGlvbkNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCBFeGlzdGVuY2VUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbnRpdHkKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nCi0gKiBAc2VlIEphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGVTaXplQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZQotICogQHNlZSBFY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZQotICogQHNlZSBFY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGU8VCBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZz4gZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLSAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXIsCi0gICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvL1NoYXJlZCBDaGVjayBib3gsIHVuY2hlY2sgdGhpcyBhbmQgdGhlIHJlc3Qgb2YgdGhlIHBhbmVsIGlzIGRpc2FibGVkCi0JCWFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCA4KSwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlX3NoYXJlZExhYmVsLAotCQkJYnVpbGRTcGVjaWZpZWRTaGFyZWRIb2xkZXIoKSwKLQkJCWJ1aWxkU2hhcmVkU3RyaW5nSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLkNBQ0hJTkdfU0hBUkVECi0JCSk7Ci0KLQkJQ29tcG9zaXRlIHN1YlBhbmUgPSBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgMTYpOwotCi0JCUNvbGxlY3Rpb248UGFuZTw/Pj4gcGFuZXMgPSBuZXcgQXJyYXlMaXN0PFBhbmU8Pz4+KCk7Ci0JCQotCQlwYW5lcy5hZGQobmV3IEVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlKHRoaXMsIHN1YlBhbmUpKTsKLQkJcGFuZXMuYWRkKG5ldyBFY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZSh0aGlzLCBzdWJQYW5lKSk7Ci0JCQotCQkvLyBBZHZhbmNlZCBzdWItcGFuZQotCQlDb21wb3NpdGUgYWR2YW5jZWRTZWN0aW9uID0gYWRkQ29sbGFwc2libGVTdWJTZWN0aW9uKAotCQkJc3ViUGFuZSwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlX2FkdmFuY2VkLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKQotCQkpOwotCi0JCWluaXRpYWxpemVBZHZhbmNlZFBhbmUoYWRkU3ViUGFuZShhZHZhbmNlZFNlY3Rpb24sIDAsIDE2KSwgcGFuZXMpOwotCQkJCi0JCW5ldyBQYW5lRW5hYmxlcihidWlsZFNoYXJlZENhY2hlRW5hYmxlcigpLCBwYW5lcyk7Ci0JCQotCQlpbml0aWFsaXplRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUoYWRkU3ViUGFuZShjb250YWluZXIsIDgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUFkdmFuY2VkUGFuZShDb21wb3NpdGUgY29udGFpbmVyLCBDb2xsZWN0aW9uPFBhbmU8Pz4+IHBhbmVzKSB7Ci0JCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKSk7Ci0JCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcikpOwotCQlwYW5lcy5hZGQobmV3IEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcikpOwotCQlwYW5lcy5hZGQobmV3IEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKSk7Ci0JCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKSk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KTsKLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFNoYXJlZENhY2hlRW5hYmxlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBCb29sZWFuPigKLQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIAotCQkJCUVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfU0hBUkVEX1BST1BFUlRZLCAKLQkJCQlFY2xpcHNlTGlua0NhY2hpbmcuREVGQVVMVF9TSEFSRURfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNTaGFyZWQoKSk7Ci0JCQl9Ci0JCX07Ci0JfQkKLQkKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTcGVjaWZpZWRTaGFyZWRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX1NIQVJFRF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFNoYXJlZCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZFNoYXJlZCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFNoYXJlZFN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFNoYXJlZEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlX3NoYXJlZExhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlX3NoYXJlZExhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRTaGFyZWRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX1NIQVJFRF9QUk9QRVJUWSwKLQkJCUVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX1NIQVJFRF9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFNoYXJlZCgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNTgxMTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgCQkJICAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBDaGFuZ2UgVHJhY2tpbmcgOiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAJCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZwotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZz4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsIAotCQkJCQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoIAotICAgICAgICAgICAgY29udGFpbmVyLAotICAgICAgICAgICAgYWRkTGFiZWwoIAotICAgICAgICAgICAgICAgICBjb250YWluZXIsIAotICAgICAgICAgICAgICAgICBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGVfbGFiZWwpLCAKLSAgICAgICAgICAgIGFkZENoYW5nZVRyYWNraW5nVHlwZUNvbWJvKGNvbnRhaW5lcikuZ2V0Q29udHJvbCgpLCAKLSAgICAgICAgICAgIG51bGwgCi0gICAgICAgKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZywgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGU+IGFkZENoYW5nZVRyYWNraW5nVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZywgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGU+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcuREVGQVVMVF9UWVBFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nLlNQRUNJRklFRF9UWVBFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgdmFsdWUpIHsKLQkJCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQkJCWNhc2UgQVRUUklCVVRFIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGVfYXR0cmlidXRlOwotCQkJCQljYXNlIEFVVE8gOgotCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZV9hdXRvOwotCQkJCQljYXNlIERFRkVSUkVEIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGVfZGVmZXJyZWQ7Ci0JCQkJCWNhc2UgT0JKRUNUIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGVfb2JqZWN0OwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIHZhbHVlKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZFR5cGUodmFsdWUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTNkNDA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5EaWFsb2dQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5WYWxpZGF0aW5nRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQ2xpZW50cyBjYW4gdXNlIHRoaXMgZGlhbG9nIHRvIHByb21wdCB0aGUgdXNlciBmb3IgU2Vjb25kYXJ5VGFibGUgc2V0dGluZ3MuCi0gKiBVc2UgdGhlIGZvbGxvd2luZyBvbmNlIHRoZSBkaWFsb2cgaXMgY2xvc2VkOgotICogICAgIEBzZWUgI2dldFNlbGVjdGVkVGFibGUoKQotICogICAgIEBzZWUgI2dldFNlbGVjdGVkQ2F0YWxvZygpCi0gKiAgICAgQHNlZSAjZ2V0U2VsZWN0ZWRTY2hlbWEoKQotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZyBleHRlbmRzIFZhbGlkYXRpbmdEaWFsb2c8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdD4gewotCi0JLyoqCi0JICogd2hlbiBjcmVhdGluZyBhIG5ldyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSwgJ2NvbnZlcnNpb25WYWx1ZScgd2lsbCBiZSBudWxsCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWU7Ci0KLQlwcml2YXRlIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvYmplY3RUeXBlQ29udmVydGVyOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIG5ldyBjb252ZXJzaW9uIHZhbHVlCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nKFNoZWxsIHBhcmVudCwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9iamVjdFR5cGVDb252ZXJ0ZXIpIHsKLQkJdGhpcyhwYXJlbnQsb2JqZWN0VHlwZUNvbnZlcnRlciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgdG8gZWRpdCBhbiBleGlzdGluZyBjb252ZXJzaW9uIHZhbHVlCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nKFNoZWxsIHBhcmVudCwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9iamVjdFR5cGVDb252ZXJ0ZXIsIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvYmplY3RUeXBlQ29udmVydGVyOwotCQl0aGlzLmNvbnZlcnNpb25WYWx1ZSA9IGNvbnZlcnNpb25WYWx1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdCBidWlsZFN0YXRlT2JqZWN0KCkgewotCQlTdHJpbmcgZGF0YVZhbHVlID0gbnVsbDsKLQkJU3RyaW5nIG9iamVjdFZhbHVlID0gbnVsbDsKLQkJU2V0PFN0cmluZz4gZGF0YVZhbHVlcyA9IENvbGxlY3Rpb25Ub29scy5zZXQodGhpcy5vYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFWYWx1ZXMoKSwgdGhpcy5vYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFWYWx1ZXNTaXplKCkpOwotCQlpZiAoaXNFZGl0RGlhbG9nKCkpIHsKLQkJCWRhdGFWYWx1ZSA9IHRoaXMuY29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpOwotCQkJb2JqZWN0VmFsdWUgPSB0aGlzLmNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpOwotCQkJLy9yZW1vdmUgKnRoaXMqIGRhdGFWYWx1ZSwgZG9uJ3Qgd2FudCBhIGR1cGxpY2F0ZSBkYXRhIHZhbHVlIGVycm9yCi0JCQlkYXRhVmFsdWVzLnJlbW92ZShkYXRhVmFsdWUpOwotCQl9Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdCgKLQkJCWRhdGFWYWx1ZSwgCi0JCQlvYmplY3RWYWx1ZSwgCi0JCQlkYXRhVmFsdWVzKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG9wZW4gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlzaGVsbC5zZXRUZXh0KHRoaXMuZ2V0VGl0bGUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuICh0aGlzLmlzQWRkRGlhbG9nKCkpID8KLQkJCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfYWRkQ29udmVyc2lvblZhbHVlCi0JCQkJCToKLQkJCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfZWRpdENvbnZlcnNpb25WYWx1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uVGl0bGUoKSB7Ci0JCXJldHVybiAodGhpcy5pc0FkZERpYWxvZygpKSA/Ci0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2FkZENvbnZlcnNpb25WYWx1ZURlc2NyaXB0aW9uVGl0bGUKLQkJOgotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19lZGl0Q29udmVyc2lvblZhbHVlRGVzY3JpcHRpb25UaXRsZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICh0aGlzLmlzQWRkRGlhbG9nKCkpID8KLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfYWRkQ29udmVyc2lvblZhbHVlRGVzY3JpcHRpb24KLQkJOgotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19lZGl0Q29udmVyc2lvblZhbHVlRGVzY3JpcHRpb247Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEaWFsb2dQYW5lPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3Q+IGJ1aWxkTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uVmFsdWVEaWFsb2dQYW5lKGNvbnRhaW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0KLQkJQ29udmVyc2lvblZhbHVlRGlhbG9nUGFuZSBwYW5lID0gKENvbnZlcnNpb25WYWx1ZURpYWxvZ1BhbmUpIGdldFBhbmUoKTsKLQkJcGFuZS5zZWxlY3RBbGwoKTsKLQotCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBib29sZWFuIGlzQWRkRGlhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJzaW9uVmFsdWUgPT0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXREaWFsb2coKSB7Ci0JCXJldHVybiAhIHRoaXMuaXNBZGREaWFsb2coKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGEgdmFsdWUgc2V0IGluIHRoZSB0ZXh0IHdpZGdldC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREYXRhVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB2YWx1ZSBzZXQgaW4gdGhlIHRleHQgd2lkZ2V0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VmFsdWUoKSB7Ci0JCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0T2JqZWN0VmFsdWUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBDb252ZXJzaW9uVmFsdWVEaWFsb2dQYW5lIGV4dGVuZHMgRGlhbG9nUGFuZTxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0PiB7Ci0KLQkJcHJpdmF0ZSBUZXh0IGRhdGFWYWx1ZVRleHQ7Ci0JCXByaXZhdGUgVGV4dCBvYmplY3RWYWx1ZVRleHQ7Ci0KLQkJQ29udmVyc2lvblZhbHVlRGlhbG9nUGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZy50aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgcGFyZW50KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCXRoaXMuZGF0YVZhbHVlVGV4dCA9IGFkZExhYmVsZWRUZXh0KAotCQkJCWNvbnRhaW5lciwKLQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2RhdGFWYWx1ZSwKLQkJCQlidWlsZERhdGFWYWx1ZUhvbGRlcigpCi0JCQkpOwotCQkJCi0JCQl0aGlzLm9iamVjdFZhbHVlVGV4dCA9IGFkZExhYmVsZWRUZXh0KAotCQkJCWNvbnRhaW5lciwKLQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX29iamVjdFZhbHVlLAotCQkJCWJ1aWxkT2JqZWN0VmFsdWVIb2xkZXIoKQotCQkJKTsKLQkJfQotCi0JCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGF0YVZhbHVlSG9sZGVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3QuREFUQV9WQUxVRV9QUk9QRVJUWSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGF0YVZhbHVlKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0RGF0YVZhbHVlKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRPYmplY3RWYWx1ZUhvbGRlcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0Lk9CSkVDVF9WQUxVRV9QUk9QRVJUWSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0T2JqZWN0VmFsdWUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRPYmplY3RWYWx1ZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXZvaWQgc2VsZWN0QWxsKCkgewotCQkJdGhpcy5kYXRhVmFsdWVUZXh0LnNlbGVjdEFsbCgpOwotCQkJdGhpcy5vYmplY3RWYWx1ZVRleHQuc2VsZWN0QWxsKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFhZmYzYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLk5ld05hbWVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlLkFic3RyYWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlLlByb2JsZW07Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgc3RhdGUgb2JqZWN0IHVzZWQgYnkgdGhlIDxjb2RlPk5ld05hbWVEaWFsb2c8L2NvZGU+LCB3aGljaCBzdG9yZXMKLSAqIHRoZSBjdXJyZW50IG5hbWUgYW5kIHZhbGlkYXRlcyBpdCB3aGVuIGl0IGlzIG1vZGlmaWVkLgotICoKLSAqIEBzZWUgTmV3TmFtZURpYWxvZwotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLWZpbmFsIGNsYXNzIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3QgZXh0ZW5kcyBBYnN0cmFjdE5vZGUKLXsKLQkvKioKLQkgKiBUaGUgaW5pdGlhbCBkYXRhVmFsdWUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkYXRhVmFsdWU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbGxlY3Rpb24gb2YgZGF0YSB2YWx1ZXMgdGhhdCBjYW4ndCBiZSB1c2VkIG9yIGFuIGVtcHR5IGNvbGxlY3Rpb24KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBkYXRhVmFsdWVzOwotCi0JLyoqCi0JICogVGhlIGluaXRpYWwgb2JqZWN0VmFsdWUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBvYmplY3RWYWx1ZTsKLQotCS8qKgotCSAqIFRoZSA8Y29kZT5WYWxpZGF0b3I8L2NvZGU+IHVzZWQgdG8gdmFsaWRhdGUgdGhpcyBzdGF0ZSBvYmplY3QuCi0JICovCi0JcHJpdmF0ZSBWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0JLyoqCi0JICogTm90aWZpZXMgYSBjaGFuZ2UgaW4gdGhlIGRhdGEgdmFsdWUgcHJvcGVydHkuCi0JICovCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1ZBTFVFX1BST1BFUlRZID0gImRhdGFWYWx1ZSI7Ci0JCi0JLyoqCi0JICogTm90aWZpZXMgYSBjaGFuZ2UgaW4gdGhlIG9iamVjdCB2YWx1ZSBwcm9wZXJ0eS4KLQkgKi8KLQlzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9WQUxVRV9QUk9QRVJUWSA9ICJvYmplY3RWYWx1ZSI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk5ld05hbWVTdGF0ZU9iamVjdDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gbmFtZSBUaGUgaW5pdGlhbCBpbnB1dCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBpbml0aWFsIHZhbHVlIGNhbgotCSAqIGJlIHNwZWNpZmllZAotCSAqIEBwYXJhbSBuYW1lcyBUaGUgY29sbGVjdGlvbiBvZiBuYW1lcyB0aGF0IGNhbid0IGJlIHVzZWQgb3IgYW4gZW1wdHkKLQkgKiBjb2xsZWN0aW9uIGlmIG5vbmUgYXJlIGF2YWlsYWJsZQotCSAqLwotCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3QoU3RyaW5nIGRhdGFWYWx1ZSwgU3RyaW5nIG9iamVjdFZhbHVlLCBDb2xsZWN0aW9uPFN0cmluZz4gZGF0YVZhbHVlcykgewotCQlzdXBlcihudWxsKTsKLQotCQl0aGlzLmRhdGFWYWx1ZSAgPSBkYXRhVmFsdWU7Ci0JCXRoaXMub2JqZWN0VmFsdWUgPSBvYmplY3RWYWx1ZTsKLQkJdGhpcy5kYXRhVmFsdWVzID0gZGF0YVZhbHVlczsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRGF0YVZhbHVlUHJvYmxlbXNUbyhMaXN0PFByb2JsZW0+IGN1cnJlbnRQcm9ibGVtcykgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmRhdGFWYWx1ZSkpIHsKLQkJCWN1cnJlbnRQcm9ibGVtcy5hZGQoYnVpbGRQcm9ibGVtKEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdF9kYXRhVmFsdWVNdXN0QmVTcGVjaWZpZWQsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpKTsKLQkJfQotCQllbHNlIGlmICh0aGlzLmRhdGFWYWx1ZXMuY29udGFpbnModGhpcy5kYXRhVmFsdWUpKSB7Ci0JCQljdXJyZW50UHJvYmxlbXMuYWRkKGJ1aWxkUHJvYmxlbShFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3RfZGF0YVZhbHVlQWxyZWFkeUV4aXN0cywgSU1lc3NhZ2VQcm92aWRlci5FUlJPUikpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE9iamVjdFZhbHVlUHJvYmxlbXNUbyhMaXN0PFByb2JsZW0+IGN1cnJlbnRQcm9ibGVtcykgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLm9iamVjdFZhbHVlKSkgewotCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0X29iamVjdFZhbHVlTXVzdEJlU3BlY2lmaWVkLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7Ci0JCXN1cGVyLmFkZFByb2JsZW1zVG8oY3VycmVudFByb2JsZW1zKTsKLQkJYWRkRGF0YVZhbHVlUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCQlhZGRPYmplY3RWYWx1ZVByb2JsZW1zVG8oY3VycmVudFByb2JsZW1zKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1BhcmVudChOb2RlIHBhcmVudE5vZGUpIHsKLQkJLy9ub3QgcGFyZW50Ci0JfQotCi0JcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlTdHJpbmcgZ2V0RGF0YVZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhVmFsdWU7Ci0JfQotCi0JU3RyaW5nIGdldE9iamVjdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3RWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREYXRhVmFsdWUoU3RyaW5nIGRhdGFWYWx1ZSkgewotCQlTdHJpbmcgb2xkRGF0YVZhbHVlID0gdGhpcy5kYXRhVmFsdWU7Ci0JCXRoaXMuZGF0YVZhbHVlID0gZGF0YVZhbHVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVkFMVUVfUFJPUEVSVFksIG9sZERhdGFWYWx1ZSwgZGF0YVZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RWYWx1ZShTdHJpbmcgb2JqZWN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZE9iamVjdFZhbHVlID0gdGhpcy5vYmplY3RWYWx1ZTsKLQkJdGhpcy5vYmplY3RWYWx1ZSA9IG9iamVjdFZhbHVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9WQUxVRV9QUk9QRVJUWSwgb2xkT2JqZWN0VmFsdWUsIG9iamVjdFZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMudmFsaWRhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmOWVkOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTm9uRW1wdHlTdHJpbmdGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5GaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TZXRDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYU5hbWVkQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IEVudW0gVHlwZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnQKLSAqIEBzZWUgRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlCi0JZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rQ29udmVydD4KLXsKLQotCS8qKgotCSAqIEEga2V5IHVzZWQgdG8gcmVwcmVzZW50IHRoZSBkZWZhdWx0IHZhbHVlLCB0aGlzIGlzIHJlcXVpcmVkIHRvIGNvbnZlcnQKLQkgKiB0aGUgc2VsZWN0ZWQgaXRlbSBmcm9tIGEgY29tYm8gdG8gYW4gZW1wdHkgc3RyaW5nLiBUaGlzIGtleSBpcyBtb3N0Ci0JICogbGlrZWx5IG5ldmVyIHR5cGVkIHRoZSB1c2VyIGFuZCBpdCB3aWxsIGhlbHAgdG8gY29udmVydCB0aGUgdmFsdWUgdG8KLQkgKiBhbiBlbXB0eSBzdHJpbmcgd2hlbiBpdCdzIHRpbWUgdG8gc2V0IHRoZSBuZXcgc2VsZWN0ZWQgdmFsdWUgaW50byB0aGUKLQkgKiBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBERUZBVUxUX0tFWSA9ICI/ISMhPyM/Iz9kZWZhdWx0PyM/ISM/ISM/IjsgLy8kTk9OLU5MUy0xJAotCQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW51bVR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tYm8gY29tYm8gPSBhZGRMYWJlbGVkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX2NvbnZlcnRlck5hbWVMYWJlbCwKLQkJCWJ1aWxkQ29udmVydE5hbWVMaXN0SG9sZGVyKCksCi0JCQlidWlsZENvbnZlcnROYW1lSG9sZGVyKCksCi0JCQlidWlsZE5hbWVDb252ZXJ0ZXIoKSwKLQkJCW51bGwKLQkJKTsKLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKLQkJCi0JCW5ldyBQYW5lRW5hYmxlcihidWlsZEJvb2xlYW5Ib2xkZXIoKSwgdGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb252ZXJ0TmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJ0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDb252ZXJ0LlNQRUNJRklFRF9DT05WRVJURVJfTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkvLyBDb252ZXJ0IHRoZSBkZWZhdWx0IHZhbHVlIHRvIHRoZSBkZWZhdWx0IGNvbnZlcnRlcgotCQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYgKHZhbHVlLnN0YXJ0c1dpdGgoREVGQVVMVF9LRVkpKSkgewotCQkJCQl2YWx1ZSA9IEVjbGlwc2VMaW5rQ29udmVydC5ERUZBVUxUX0NPTlZFUlRFUl9OQU1FOwotCQkJCX0KLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbnZlcnROYW1lTGlzdEhvbGRlcigpIHsKLQkJamF2YS51dGlsLkxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJbGlzdC5hZGQoYnVpbGREZWZhdWx0TmFtZUxpc3RIb2xkZXIoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkUmVzZXJ2ZWRDb252ZXJ0ZXJOYW1lTGlzdEhvbGRlcigpKTsKLQkJbGlzdC5hZGQoYnVpbGRTb3J0ZWRDb252ZXJ0ZXJOYW1lc01vZGVsKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4obGlzdCk7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdE5hbWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQlidWlsZERlZmF1bHROYW1lSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHROYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnQsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NvbnZlcnQuREVGQVVMVF9DT05WRVJURVJfTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCVN0cmluZyBuYW1lID0gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRDb252ZXJ0ZXJOYW1lKCk7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBERUZBVUxUX0tFWTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW5hbWUgPSBERUZBVUxUX0tFWSArIG5hbWU7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZE5hbWVDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCWlmIChnZXRTdWJqZWN0KCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQkJfQotCi0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdENvbnZlcnRlck5hbWUoKTsKLQotCQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQkJdmFsdWUgPSBERUZBVUxUX0tFWSArIHZhbHVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdmFsdWUgPSBERUZBVUxUX0tFWTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICh2YWx1ZS5zdGFydHNXaXRoKERFRkFVTFRfS0VZKSkgewotCQkJCQlTdHJpbmcgZGVmYXVsdE5hbWUgPSB2YWx1ZS5zdWJzdHJpbmcoREVGQVVMVF9LRVkubGVuZ3RoKCkpOwotCi0JCQkJCWlmIChkZWZhdWx0TmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCXZhbHVlID0gTkxTLmJpbmQoCi0JCQkJCQkJSnB0Q29tbW9uVWlNZXNzYWdlcy5EZWZhdWx0V2l0aE9uZVBhcmFtLAotCQkJCQkJCWRlZmF1bHROYW1lCi0JCQkJCQkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdmFsdWUgPSBOTFMuYmluZCgKLQkJCQkJCQlKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJCQkJRWNsaXBzZUxpbmtDb252ZXJ0Lk5PX0NPTlZFUlRFUgotCQkJCQkJKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFJlc2VydmVkQ29udmVydGVyTmFtZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8U3RyaW5nPihFY2xpcHNlTGlua0NvbnZlcnQuUkVTRVJWRURfQ09OVkVSVEVSX05BTUVTKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRTb3J0ZWRDb252ZXJ0ZXJOYW1lc01vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KHRoaXMuYnVpbGRVbmlxdWVDb252ZXJ0ZXJOYW1lc01vZGVsKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFVuaXF1ZUNvbnZlcnRlck5hbWVzTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU2V0Q29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkQ29udmVydGVyTmFtZXNNb2RlbCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbnZlcnRlck5hbWVzTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkQ29udmVydGVyTmFtZXNNb2RlbF8oKSwgTm9uRW1wdHlTdHJpbmdGaWx0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb252ZXJ0ZXJOYW1lc01vZGVsXygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyLCBTdHJpbmc+KHRoaXMuYnVpbGRDb252ZXJ0ZXJzTW9kZWwoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybUl0ZW1fKEVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlcikgewotCQkJCXJldHVybiBjb252ZXJ0ZXIuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlcj4gYnVpbGRDb252ZXJ0ZXJzTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVydGVyPih0aGlzLmJ1aWxkQ29udmVydGVyc01vZGVsXygpLCBKcGFOYW1lZENvbnRleHROb2RlLk5BTUVfUFJPUEVSVFkpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlcj4gYnVpbGRDb252ZXJ0ZXJzTW9kZWxfKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LCBFY2xpcHNlTGlua0NvbnZlcnRlcj4odGhpcy5idWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpLCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdC5DT05WRVJURVJTX0NPTExFQ1RJT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVydGVyPiBnZXRJdGVyYWJsZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbnZlcnRlcnMoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbnZlcnRlcnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IGJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnQsIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0LCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEVjbGlwc2VMaW5rQ29udmVydCB2YWx1ZSkgewotCQkJCWlmIChnZXRTdWJqZWN0KCkgIT0gbnVsbCAmJiBnZXRTdWJqZWN0KCkuZ2V0UGFyZW50KCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7Ci0JCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbHVlICE9IG51bGwpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNiNTc4Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuQ29udHJvbFN3aXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhTmFtZWRDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLS8qKgotICogVGhpcyBwYW5lIHNob3dzIHRoZSBsaXN0IG9mIGN1c3RvbSBjb252ZXJ0ZXJzLCBvYmplY3QgdHlwZSBjb252ZXJ0ZXJzLAotICogc3RydWN0IGNvbnZlcnRlcnMsIGFuZCB0eXBlIGNvbnZlcnRlcnMuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEFkZFJlbW92ZUxpc3RQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ29udmVydGVyQ29tcG9zaXRlIG9yIE9iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IG9yIFN0cnVjdENvbnZlcnRlckNvbXBvc2l0ZSBvciBUeXBlQ29udmVydGVyQ29tcG9zaXRlICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+Ci17Ci0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZTxFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4gbGlzdFBhbmU7Ci0JcHJpdmF0ZSBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlckNvbXBvc2l0ZSBjb252ZXJ0ZXJDb21wb3NpdGU7Ci0JcHJpdmF0ZSBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUgb2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZTsKLQlwcml2YXRlIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQ29tcG9zaXRlIHN0cnVjdENvbnZlcnRlckNvbXBvc2l0ZTsKLQlwcml2YXRlIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZSB0eXBlQ29udmVydGVyQ29tcG9zaXRlOwotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlcj4gc2VsZWN0ZWRDb252ZXJ0ZXJIb2xkZXI7Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlKAotCQlQYW5lPD8+IHBhcmVudFBhbmUsIAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJdGhpcy5zZWxlY3RlZENvbnZlcnRlckhvbGRlciA9IGJ1aWxkU2VsZWN0ZWRDb252ZXJ0ZXJIb2xkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGJ1aWxkU2VsZWN0ZWRDb252ZXJ0ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyPigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIExpc3QgcGFuZQotCQl0aGlzLmxpc3RQYW5lID0gYWRkTGlzdFBhbmUoY29udGFpbmVyKTsKLQkJdGhpcy5pbnN0YWxsUGFuZUVuYWJsZXIoKTsKLQotCQkvLyBQcm9wZXJ0eSBwYW5lCi0JCVBhZ2VCb29rIHBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQl0aGlzLmNvbnZlcnRlckNvbXBvc2l0ZSA9IG5ldyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlckNvbXBvc2l0ZSgKLQkJCWJ1aWxkQ3VzdG9tQ29udmVydGVySG9sZGVyKCksCi0JCQlwYWdlQm9vaywKLQkJCWdldFdpZGdldEZhY3RvcnkoKQotCQkpOwotCQlyZWdpc3RlclN1YlBhbmUodGhpcy5jb252ZXJ0ZXJDb21wb3NpdGUpOwotCQkKLQkJdGhpcy5vYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlID0gbmV3IEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZSgKLQkJCWJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlckhvbGRlcigpLAotCQkJcGFnZUJvb2ssCi0JCQlnZXRXaWRnZXRGYWN0b3J5KCkKLQkJKTsKLQkJcmVnaXN0ZXJTdWJQYW5lKHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZSk7Ci0JCQotCQl0aGlzLnN0cnVjdENvbnZlcnRlckNvbXBvc2l0ZSA9IG5ldyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckNvbXBvc2l0ZSgKLQkJCWJ1aWxkU3RydWN0Q29udmVydGVySG9sZGVyKCksCi0JCQlwYWdlQm9vaywKLQkJCWdldFdpZGdldEZhY3RvcnkoKQotCQkpOwotCQlyZWdpc3RlclN1YlBhbmUodGhpcy5zdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGUpOwotCQkKLQkJdGhpcy50eXBlQ29udmVydGVyQ29tcG9zaXRlID0gbmV3IEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZSgKLQkJCWJ1aWxkVHlwZUNvbnZlcnRlckhvbGRlcigpLAotCQkJcGFnZUJvb2ssCi0JCQlnZXRXaWRnZXRGYWN0b3J5KCkKLQkJKTsKLQkJcmVnaXN0ZXJTdWJQYW5lKHRoaXMudHlwZUNvbnZlcnRlckNvbXBvc2l0ZSk7Ci0KLQkJaW5zdGFsbFBhbmVTd2l0Y2hlcihwYWdlQm9vayk7Ci0JfQotCi0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZTxFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4gYWRkTGlzdFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmU8RWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+KAotCQkJdGhpcywKLQkJCWNvbnRhaW5lciwKLQkJCWJ1aWxkQ29udmVydGVyc0FkYXB0ZXIoKSwKLQkJCWJ1aWxkRGlzcGxheWFibGVDb252ZXJ0ZXJzTGlzdEhvbGRlcigpLAotCQkJdGhpcy5zZWxlY3RlZENvbnZlcnRlckhvbGRlciwKLQkJCWJ1aWxkQ29udmVydGVyc0xpc3RMYWJlbFByb3ZpZGVyKCksCi0JCQludWxsCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxQYW5lU3dpdGNoZXIoUGFnZUJvb2sgcGFnZUJvb2spIHsKLQkJbmV3IENvbnRyb2xTd2l0Y2hlcih0aGlzLnNlbGVjdGVkQ29udmVydGVySG9sZGVyLCBidWlsZFBhbmVUcmFuc2Zvcm1lcigpLCBwYWdlQm9vayk7Ci0JfQotCQotCXByaXZhdGUgQWRhcHRlciBidWlsZENvbnZlcnRlcnNBZGFwdGVyKCkgewotCi0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlhZGRDb252ZXJ0ZXIoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJZm9yIChPYmplY3QgaXRlbSA6IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpKSB7Ci0JCQkJCWlmICgoKEVjbGlwc2VMaW5rQ29udmVydGVyKSBpdGVtKS5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIuY2xhc3MpIHsKLQkJCQkJCWdldFN1YmplY3QoKS5yZW1vdmVDdXN0b21Db252ZXJ0ZXIoKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKSBpdGVtKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICgoKEVjbGlwc2VMaW5rQ29udmVydGVyKSBpdGVtKS5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzKSB7Ci0JCQkJCQlnZXRTdWJqZWN0KCkucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBpdGVtKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICgoKEVjbGlwc2VMaW5rQ29udmVydGVyKSBpdGVtKS5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3MpIHsKLQkJCQkJCWdldFN1YmplY3QoKS5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSBpdGVtKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICgoKEVjbGlwc2VMaW5rQ29udmVydGVyKSBpdGVtKS5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmNsYXNzKSB7Ci0JCQkJCQlnZXRTdWJqZWN0KCkucmVtb3ZlVHlwZUNvbnZlcnRlcigoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSBpdGVtKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ29udmVydGVyKCkgewotCQl0aGlzLmFkZEVjbGlwc2VMaW5rQ29udmVydGVyRnJvbURpYWxvZyh0aGlzLmJ1aWxkRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2coKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nIGJ1aWxkRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2coKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2codGhpcy5nZXRTaGVsbCgpLCB0aGlzLmdldFN1YmplY3QoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRWNsaXBzZUxpbmtDb252ZXJ0ZXJGcm9tRGlhbG9nKEVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nIGRpYWxvZykgewotCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuT0spIHsKLQkJCXJldHVybjsKLQkJfQotCQlDbGFzczw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGNvbnZlcnRlclR5cGUgPSBkaWFsb2cuZ2V0Q29udmVydGVyVHlwZSgpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRlciBjb252ZXJ0ZXI7Ci0JCWlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmNsYXNzKSB7Ci0JCQljb252ZXJ0ZXIgPSB0aGlzLmdldFN1YmplY3QoKS5hZGRDdXN0b21Db252ZXJ0ZXIoZ2V0U3ViamVjdCgpLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnZlcnRlclR5cGUgPT0gRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzKSB7Ci0JCQljb252ZXJ0ZXIgPSB0aGlzLmdldFN1YmplY3QoKS5hZGRPYmplY3RUeXBlQ29udmVydGVyKGdldFN1YmplY3QoKS5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udmVydGVyVHlwZSA9PSBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5jbGFzcykgewotCQkJY29udmVydGVyID0gdGhpcy5nZXRTdWJqZWN0KCkuYWRkU3RydWN0Q29udmVydGVyKGdldFN1YmplY3QoKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJfQotCQllbHNlIGlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5jbGFzcykgewotCQkJY29udmVydGVyID0gdGhpcy5nZXRTdWJqZWN0KCkuYWRkVHlwZUNvbnZlcnRlcihnZXRTdWJqZWN0KCkuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCWNvbnZlcnRlci5zZXROYW1lKGRpYWxvZy5nZXROYW1lKCkpOwotCQl0aGlzLnNlbGVjdGVkQ29udmVydGVySG9sZGVyLnNldFZhbHVlKGNvbnZlcnRlcik7Ly9zbyB0aGF0IGl0IGdldHMgc2VsZWN0ZWQgaW4gdGhlIExpc3QgZm9yIHRoZSB1c2VyIHRvIGVkaXQKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPEVjbGlwc2VMaW5rQ29udmVydGVyLCBDb250cm9sPiBidWlsZFBhbmVUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxFY2xpcHNlTGlua0NvbnZlcnRlciwgQ29udHJvbD4oKSB7Ci0JCQlwdWJsaWMgQ29udHJvbCB0cmFuc2Zvcm0oRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCQkJaWYgKGNvbnZlcnRlciA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCWlmIChjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmNsYXNzKSB7Ci0JCQkJCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUudGhpcy5jb252ZXJ0ZXJDb21wb3NpdGUuZ2V0Q29udHJvbCgpOwotCQkJCX0KLQkJCQlpZiAoY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MpIHsKLQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZS50aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUuZ2V0Q29udHJvbCgpOwotCQkJCX0KLQkJCQlpZiAoY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5jbGFzcykgewotCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlLnRoaXMuc3RydWN0Q29udmVydGVyQ29tcG9zaXRlLmdldENvbnRyb2woKTsKLQkJCQl9Ci0JCQkJaWYgKGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmNsYXNzKSB7Ci0JCQkJCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUudGhpcy50eXBlQ29udmVydGVyQ29tcG9zaXRlLmdldENvbnRyb2woKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyPiBidWlsZERpc3BsYXlhYmxlQ29udmVydGVyc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVydGVyPigKLQkJCWJ1aWxkRWNsaXBzZUxpbmtDb252ZXJ0ZXJzSG9sZGVyKCksCi0JCQlKcGFOYW1lZENvbnRleHROb2RlLk5BTUVfUFJPUEVSVFkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyPiBidWlsZEVjbGlwc2VMaW5rQ29udmVydGVyc0hvbGRlcigpIHsKLQkJTGlzdDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+PigpOwotCQlsaXN0LmFkZChidWlsZEN1c3RvbUNvbnZlcnRlcnNMaXN0SG9sZGVyKCkpOwotCQlsaXN0LmFkZChidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJzTGlzdEhvbGRlcigpKTsKLQkJbGlzdC5hZGQoYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJzTGlzdEhvbGRlcigpKTsKLQkJbGlzdC5hZGQoYnVpbGRUeXBlQ29udmVydGVyc0xpc3RIb2xkZXIoKSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyPiwgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+KGxpc3QpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IGJ1aWxkQ3VzdG9tQ29udmVydGVyc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIsIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyLkNVU1RPTV9DT05WRVJURVJTX0xJU1QpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiBuZXcgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPih0aGlzLnN1YmplY3QuZ2V0Q3VzdG9tQ29udmVydGVycygpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gYnVpbGRPYmplY3RUeXBlQ29udmVydGVyc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lci5PQkpFQ1RfVFlQRV9DT05WRVJURVJTX0xJU1QpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJCQlyZXR1cm4gbmV3IFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+KHRoaXMuc3ViamVjdC5nZXRPYmplY3RUeXBlQ29udmVydGVycygpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIuU1RSVUNUX0NPTlZFUlRFUlNfTElTVCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBnZXRMaXN0SXRlcmFibGUoKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+KHRoaXMuc3ViamVjdC5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBidWlsZFR5cGVDb252ZXJ0ZXJzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyLlRZUEVfQ09OVkVSVEVSU19MSVNUKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBnZXRMaXN0SXRlcmFibGUoKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPih0aGlzLnN1YmplY3QuZ2V0VHlwZUNvbnZlcnRlcnMoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBidWlsZEN1c3RvbUNvbnZlcnRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlciwgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+KHRoaXMuc2VsZWN0ZWRDb252ZXJ0ZXJIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtDb252ZXJ0ZXIgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmNsYXNzID8gKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKSB2YWx1ZSA6IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXIsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4odGhpcy5zZWxlY3RlZENvbnZlcnRlckhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtDb252ZXJ0ZXIgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzcyA/IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpIHZhbHVlIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXIsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPih0aGlzLnNlbGVjdGVkQ29udmVydGVySG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciB0cmFuc2Zvcm1fKEVjbGlwc2VMaW5rQ29udmVydGVyIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5jbGFzcyA/IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgdmFsdWUgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gYnVpbGRUeXBlQ29udmVydGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyLCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+KHRoaXMuc2VsZWN0ZWRDb252ZXJ0ZXJIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciB0cmFuc2Zvcm1fKEVjbGlwc2VMaW5rQ29udmVydGVyIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIuY2xhc3MgPyAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSB2YWx1ZSA6IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZENvbnZlcnRlcnNMaXN0TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0NvbnZlcnRlcikgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsUGFuZUVuYWJsZXIoKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcigKLQkJCXRoaXMuYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpLAotCQkJdGhpcy5saXN0UGFuZQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKHZhbHVlICE9IG51bGwpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDM5YjFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYU5hbWVkQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXJDbGFzc0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgTmFtZTogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ29udmVydGVyCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlckNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+Ci17Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnZlcnRlckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXJDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJYWRkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsIAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckNvbXBvc2l0ZV9uYW1lVGV4dExhYmVsLCAKLQkJCWJ1aWxkTmFtZVRleHRIb2xkZXIoKSk7Ci0JCQotCQlhZGRDbGFzc0Nob29zZXIoY29udGFpbmVyKTsKLQkJCi0JCW5ldyBQYW5lRW5hYmxlcihidWlsZEJvb2xlYW5Ib2xkZXIoKSwgdGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lVGV4dEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIsIFN0cmluZz4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBKcGFOYW1lZENvbnRleHROb2RlLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkKLQlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IGFkZENsYXNzQ2hvb3NlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDbGFzc0Nob29zZXJQYW5lPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVydGVyQ2xhc3NDb252ZXJ0ZXIuQ09OVkVSVEVSX0NMQVNTX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb252ZXJ0ZXJDbGFzcygpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCQl9Ci0KLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRDb252ZXJ0ZXJDbGFzcyh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0Q29udmVydGVyQ2xhc3MoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckNvbXBvc2l0ZV9jbGFzc0xhYmVsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRDb252ZXJ0ZXJDbGFzcyhjbGFzc05hbWUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3VwZXJJbnRlcmZhY2VOYW1lKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5FQ0xJUFNFTElOS19DT05WRVJURVJfQ0xBU1NfTkFNRTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQm9vbGVhbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciB2YWx1ZSkgewotLy8JCQkJaWYgKGdldFN1YmplY3QoKSAhPSBudWxsICYmIGdldFN1YmplY3QoKS5nZXRQYXJlbnQoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpIHsKLS8vCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLS8vCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbHVlICE9IG51bGwpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0N1c3RvbWl6ZXJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0N1c3RvbWl6ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ3NmI1Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDdXN0b21pemVyQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJDb21ib1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ3VzdG9taXplcgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDdXN0b21pemVyQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua0N1c3RvbWl6ZXI+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DdXN0b21pemVyQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbWl6ZXJDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLCAKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0N1c3RvbWl6ZXI+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEN1c3RvbWl6ZXJDbGFzc0Nob29zZXJDb21ib1BhbmUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEN1c3RvbWl6ZXJDbGFzc0Nob29zZXJDb21ib1BhbmUKLQkJZXh0ZW5kcyBDbGFzc0Nob29zZXJDb21ib1BhbmU8RWNsaXBzZUxpbmtDdXN0b21pemVyPgotCXsKLQkJcHVibGljIEN1c3RvbWl6ZXJDbGFzc0Nob29zZXJDb21ib1BhbmUoUGFuZTxFY2xpcHNlTGlua0N1c3RvbWl6ZXI+IHBhcmVudFBhbmUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JCX0JCQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoY2xhc3NOYW1lKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ3VzdG9taXplckNvbXBvc2l0ZV9jbGFzc0xhYmVsOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoKSB7Ci0JCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRTdXBlckludGVyZmFjZU5hbWUoKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtDdXN0b21pemVyLkVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUl9DTEFTU19OQU1FOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBjaGFyIGdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKSB7Ci0JCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEN1c3RvbWl6ZXJDbGFzc0VuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ3VzdG9taXplciwgU3RyaW5nPigKLQkJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCAKLQkJCQkJRWNsaXBzZUxpbmtDdXN0b21pemVyLlNQRUNJRklFRF9DVVNUT01JWkVSX0NMQVNTX1BST1BFUlRZLAotCQkJCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIuREVGQVVMVF9DVVNUT01JWkVSX0NMQVNTX1BST1BFUlRZKSB7Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlTdHJpbmcgdmFsdWUgPSB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCk7Ci0JCQkJCXJldHVybiAodmFsdWUgPT0gbnVsbCkgPyBkZWZhdWx0VGV4dCh0aGlzLnN1YmplY3QpIDogdmFsdWU7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQlpZiAodmFsdWUgPT0gbnVsbCAKLQkJCQkJCQl8fCB2YWx1ZS5sZW5ndGgoKSA9PSAwIAotCQkJCQkJCXx8IHZhbHVlLmVxdWFscyhkZWZhdWx0VGV4dCh0aGlzLnN1YmplY3QpKSkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3ModmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRUZXh0KEVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyKSB7Ci0JCQlTdHJpbmcgZGVmYXVsdENsYXNzTmFtZSA9IGN1c3RvbWl6ZXIuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpOwotCQkJcmV0dXJuIChkZWZhdWx0Q2xhc3NOYW1lID09IG51bGwpID8KLQkJCQkJSnB0Q29tbW9uVWlNZXNzYWdlcy5Ob25lU2VsZWN0ZWQKLQkJCQkJOiBOTFMuYmluZChKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRXaXRoT25lUGFyYW0sIGRlZmF1bHRDbGFzc05hbWUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ2xhc3NMaXN0SG9sZGVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJCW5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDdXN0b21pemVyLCBTdHJpbmc+KAotCQkJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0N1c3RvbWl6ZXIuREVGQVVMVF9DVVNUT01JWkVSX0NMQVNTX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIGRlZmF1bHRUZXh0KHRoaXMuc3ViamVjdCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmFlMzIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBjb21wb3NpdGUgc2ltcGx5IHNob3dzIGEgdHJpLXN0YXRlIGNoZWNrIGJveCBmb3IgdGhlIERpc2FibGUgSGl0cyBvcHRpb24uCi0gKiAKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua0NhY2hpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PcHRpb25hbENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGVfZGlzYWJsZUhpdHNMYWJlbCwKLQkJCWJ1aWxkRGlzYWJsZUhpdHNIb2xkZXIoKSwKLQkJCWJ1aWxkRGlzYWJsZUhpdHNTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuQ0FDSElOR19ESVNBQkxFX0hJVFMKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGlzYWJsZUhpdHNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX0RJU0FCTEVfSElUU19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZERpc2FibGVIaXRzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHModmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREaXNhYmxlSGl0c1N0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdERpc2FibGVIaXRzSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlX2Rpc2FibGVIaXRzRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZV9kaXNhYmxlSGl0c0xhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHREaXNhYmxlSGl0c0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfRElTQUJMRV9ISVRTX1BST1BFUlRZLAotCQkJRWNsaXBzZUxpbmtDYWNoaW5nLkRFRkFVTFRfRElTQUJMRV9ISVRTX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyOGRmMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkFic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlPFQgZXh0ZW5kcyBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+Ci0JZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZTxUPgotewotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJaW5pdGlhbGl6ZUVsZW1lbnRDb2xsZWN0aW9uQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVWYWx1ZUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplS2V5Q29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVPcmRlcmluZ0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfY29udmVydGVycwotCQkpOwotCQlpbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oY29udGFpbmVyLCB0aGlzLmJ1aWxkQ29udmVydGVySG9sZGVyVmFsdWVNb2RlbCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZSh0aGlzLCBjb252ZXJ0ZXJIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXJWYWx1ZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgdGhpcy5zdWJqZWN0KS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rRW1iZWRkYWJsZUFkdmFuY2VkQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtFbWJlZGRhYmxlQWR2YW5jZWRDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM0YjZjZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtFbWJlZGRhYmxlQWR2YW5jZWRDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0VtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtFbWJlZGRhYmxlQWR2YW5jZWRDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVtYmVkZGFibGU+IHsKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtFbWJlZGRhYmxlQWR2YW5jZWRDb21wb3NpdGUoCi0JCQlQYW5lPD8gZXh0ZW5kcyBFbWJlZGRhYmxlPiBwYXJlbnRQYW5lLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgZmFsc2UpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2FkdmFuY2VkCi0JCSk7Ci0JCQotCQluZXcgRWNsaXBzZUxpbmtDdXN0b21pemVyQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ3VzdG9taXplckhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZSh0aGlzLCBidWlsZENoYW5nZVRyYWNraW5nSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ3VzdG9taXplcj4gYnVpbGRDdXN0b21pemVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbWJlZGRhYmxlLCBFY2xpcHNlTGlua0N1c3RvbWl6ZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDdXN0b21pemVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgdGhpcy5zdWJqZWN0KS5nZXRDdXN0b21pemVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc+IGJ1aWxkQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVtYmVkZGFibGUsIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0VtYmVkZGFibGUpIHRoaXMuc3ViamVjdCkuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtFbnRpdHlBZHZhbmNlZENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rRW50aXR5QWR2YW5jZWRDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMyNjJiNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtFbnRpdHlBZHZhbmNlZENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWFkT25seTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0VudGl0eUFkdmFuY2VkQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFbnRpdHk+IHsKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtFbnRpdHlBZHZhbmNlZENvbXBvc2l0ZSgKLQkJCVBhbmU8PyBleHRlbmRzIEVudGl0eT4gcGFyZW50UGFuZSwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9hZHZhbmNlZAotCQkpOwotCQkKLQkJbmV3IEVjbGlwc2VMaW5rUmVhZE9ubHlDb21wb3NpdGUodGhpcywgYnVpbGRSZWFkT25seUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtDdXN0b21pemVyQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ3VzdG9taXplckhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZSh0aGlzLCBidWlsZENoYW5nZVRyYWNraW5nSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUmVhZE9ubHk+IGJ1aWxkUmVhZE9ubHlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eSwgRWNsaXBzZUxpbmtSZWFkT25seT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua1JlYWRPbmx5IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rRW50aXR5KSB0aGlzLnN1YmplY3QpLmdldFJlYWRPbmx5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ3VzdG9taXplcj4gYnVpbGRDdXN0b21pemVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIEVjbGlwc2VMaW5rQ3VzdG9taXplcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0N1c3RvbWl6ZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtFbnRpdHkpIHRoaXMuc3ViamVjdCkuZ2V0Q3VzdG9taXplcigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nPiBidWlsZENoYW5nZVRyYWNraW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0VudGl0eSkgdGhpcy5zdWJqZWN0KS5nZXRDaGFuZ2VUcmFja2luZygpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MmI5NmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1RpbWVPZkRheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtIEV4cGlyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgbyBObyBleHBpcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgCQkJCQktLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBvIFRpbWUgdG8gbGl2ZSBleHBpcnkgICBFeHBpcmUgYWZ0ZXIgfCBJICAgICAgICAgIHxJfCBtaWxsaXNlY29uZHMgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgCQkJCSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICB8IHwKLSAqIHwgfCBvIERhaWx5IGV4cGlyeSAgICAgICAgICBFeHBpcmUgYXQgICAgfCBISDpNTTpTUzpBTS9QTSB8SXwgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgRWNsaXBzZUxpbmtUaW1lT2ZEYXkKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua0NhY2hpbmc+IHsKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHR0bEVuYWJsZWQ7Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogbGF6eSBpbml0IGJlY2F1c2Ugd2UgbmVlZCBpdCB3aGlsZSB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvciBpcwotCSAqIGV4ZWN1dGluZwotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZ2V0VHRsRW5hYmxlZCgpIHsKLQkJaWYgKHRoaXMudHRsRW5hYmxlZCA9PSBudWxsKSB7Ci0JCQl0aGlzLnR0bEVuYWJsZWQgPSB0aGlzLmJ1aWxkVGltZVRvTGl2ZUV4cGlyeUVuYWJsZXIoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy50dGxFbmFibGVkOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkvLyBFeHBpcnkgZ3JvdXAgcGFuZQotCQlHcm91cCBleHBpcnlHcm91cFBhbmUgPSBhZGRUaXRsZWRHcm91cCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfZXhwaXJ5U2VjdGlvbiwKLQkJCTIsCi0JCQludWxsCi0JCSk7Ci0JCQkJCi0JCS8vIE5vIEV4cGlyeSByYWRpbyBidXR0b24KLQkJQnV0dG9uIGJ1dHRvbiA9IGFkZFJhZGlvQnV0dG9uKAotCQkJZXhwaXJ5R3JvdXBQYW5lLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV9ub0V4cGlyeSwKLQkJCWJ1aWxkTm9FeHBpcnlIb2xkZXIoKSwKLQkJCW51bGwKLQkJKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJCi0JCS8vIFRpbWUgVG8gTGl2ZSBFeHBpcnkgcmFkaW8gYnV0dG9uCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJZXhwaXJ5R3JvdXBQYW5lLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV90aW1lVG9MaXZlRXhwaXJ5LAotCQkJYnVpbGRFeHBpcnlIb2xkZXIoKSwKLQkJCW51bGwKLQkJKTsKLQkJCi0JCWFkZFRpbWVUb0xpdmVDb21wb3NpdGUoZXhwaXJ5R3JvdXBQYW5lKTsKLQkJCi0JCS8vIERhaWx5IEV4cGlyeSByYWRpbyBidXR0b24KLQkJYWRkUmFkaW9CdXR0b24oCi0JCQlleHBpcnlHcm91cFBhbmUsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX2RhaWx5RXhwaXJ5LAotCQkJYnVpbGRUaW1lT2ZEYXlFeHBpcnlCb29sZWFuSG9sZGVyKCksCi0JCQludWxsCi0JCSk7Ci0JCQotCQlhZGRUaW1lT2ZEYXlDb21wb3NpdGUoZXhwaXJ5R3JvdXBQYW5lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGltZVRvTGl2ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0aGlzLmFkZFN1YlBhbmUocGFyZW50LCAzLCAwLCAxMCwgMCwgMCk7Ci0KLQkJYWRkTGFiZWwoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX3RpbWVUb0xpdmVFeHBpcnlFeHBpcmVBZnRlciwKLQkJCXRoaXMuZ2V0VHRsRW5hYmxlZCgpCi0JCSk7Ci0JCi0JCUludGVnZXJDb21ibzw/PiBjb21ibyA9IGFkZFRpbWVUb0xpdmVFeHBpcnlDb21ibyhjb250YWluZXIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCWNvbWJvLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCWFkZExhYmVsKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV90aW1lVG9MaXZlRXhwaXJ5TWlsbGlzZWNvbmRzLAotCQkJdGhpcy5nZXRUdGxFbmFibGVkKCkKLQkJKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGltZU9mRGF5Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRoaXMuYWRkU3ViUGFuZShwYXJlbnQsIDIsIDAsIDEwLCAwLCAwKTsKLQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdG9kRW5hYmxlZCA9IHRoaXMuYnVpbGRUaW1lT2ZEYXlFeHBpcnlFbmFibGVyKCk7Ci0JCWFkZExhYmVsKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV90aW1lT2ZEYXlFeHBpcnlFeHBpcmVBdCwKLQkJCXRvZEVuYWJsZWQKLQkJKTsKLQkJCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1RpbWVPZkRheT4gdGltZU9mRGF5RXhwaXJ5SG9sZGVyID0gYnVpbGRUaW1lT2ZEYXlFeHBpcnlIb2xkZXIoKTsKLQkJYWRkRGF0ZVRpbWUoCi0JCQljb250YWluZXIsIAotCQkJYnVpbGRUaW1lT2ZEYXlFeHBpcnlIb3VySG9sZGVyKHRpbWVPZkRheUV4cGlyeUhvbGRlciksIAotCQkJYnVpbGRUaW1lT2ZEYXlFeHBpcnlNaW51dGVIb2xkZXIodGltZU9mRGF5RXhwaXJ5SG9sZGVyKSwKLQkJCWJ1aWxkVGltZU9mRGF5RXhwaXJ5U2Vjb25kSG9sZGVyKHRpbWVPZkRheUV4cGlyeUhvbGRlciksCi0JCQludWxsLAotCQkJdG9kRW5hYmxlZAotCQkpOwotCX0KLQkKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb0V4cGlyeUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBCb29sZWFuPigKLQkJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCAKLQkJCQkJRWNsaXBzZUxpbmtDYWNoaW5nLkVYUElSWV9QUk9QRVJUWSwgCi0JCQkJCUVjbGlwc2VMaW5rQ2FjaGluZy5FWFBJUllfVElNRV9PRl9EQVlfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0RXhwaXJ5KCkgPT0gbnVsbCAmJiB0aGlzLnN1YmplY3QuZ2V0RXhwaXJ5VGltZU9mRGF5KCkgPT0gbnVsbCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RXhwaXJ5KG51bGwpOwotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0RXhwaXJ5VGltZU9mRGF5KCkgIT0gbnVsbCkgewotCQkJCQl0aGlzLnN1YmplY3QucmVtb3ZlRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEV4cGlyeUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBCb29sZWFuPigKLQkJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCAKLQkJCQkJRWNsaXBzZUxpbmtDYWNoaW5nLkVYUElSWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRFeHBpcnkoKSAhPSBudWxsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSA9PSBCb29sZWFuLlRSVUUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldEV4cGlyeShJbnRlZ2VyLnZhbHVlT2YoMCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGltZU9mRGF5RXhwaXJ5Qm9vbGVhbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBCb29sZWFuPigKLQkJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCAKLQkJCQkJRWNsaXBzZUxpbmtDYWNoaW5nLkVYUElSWV9USU1FX09GX0RBWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRFeHBpcnlUaW1lT2ZEYXkoKSAhPSBudWxsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSA9PSBCb29sZWFuLlRSVUUgJiYgdGhpcy5zdWJqZWN0LmdldEV4cGlyeVRpbWVPZkRheSgpID09IG51bGwpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LmFkZEV4cGlyeVRpbWVPZkRheSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBJbnRlZ2VyQ29tYm88RWNsaXBzZUxpbmtDYWNoaW5nPiBhZGRUaW1lVG9MaXZlRXhwaXJ5Q29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEludGVnZXJDb21ibzxFY2xpcHNlTGlua0NhY2hpbmc+KHRoaXMsIGNvbnRhaW5lcikgewotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbWJvIGFkZEludGVnZXJDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYWRkRWRpdGFibGVDb21ibygKLQkJCQkJCWNvbnRhaW5lciwKLQkJCQkJCWJ1aWxkRGVmYXVsdExpc3RIb2xkZXIoKSwKLQkJCQkJCWJ1aWxkU2VsZWN0ZWRJdGVtU3RyaW5nSG9sZGVyKCksCi0JCQkJCQlTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48U3RyaW5nPmluc3RhbmNlKCksCi0JCQkJCQlFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZS50aGlzLmdldFR0bEVuYWJsZWQoKQotCQkJCQkpOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZigwKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ2FjaGluZy5FWFBJUllfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRFeHBpcnkoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCQkJdGhpcy5zdWJqZWN0LnNldEV4cGlyeSh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRpbWVUb0xpdmVFeHBpcnlFbmFibGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDYWNoaW5nLkVYUElSWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRFeHBpcnkoKSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRUaW1lT2ZEYXlFeHBpcnlFbmFibGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDYWNoaW5nLkVYUElSWV9USU1FX09GX0RBWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRFeHBpcnlUaW1lT2ZEYXkoKSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtUaW1lT2ZEYXk+IGJ1aWxkVGltZU9mRGF5RXhwaXJ5SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEVjbGlwc2VMaW5rVGltZU9mRGF5PihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ2FjaGluZy5FWFBJUllfVElNRV9PRl9EQVlfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rVGltZU9mRGF5IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RXhwaXJ5VGltZU9mRGF5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkVGltZU9mRGF5RXhwaXJ5SG91ckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtUaW1lT2ZEYXk+IHRpbWVPZkRheUV4cGlyeUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1RpbWVPZkRheSwgSW50ZWdlcj4oCi0JCQkJCXRpbWVPZkRheUV4cGlyeUhvbGRlciwgCi0JCQkJCUVjbGlwc2VMaW5rVGltZU9mRGF5LkhPVVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRIb3VyKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgaG91cikgewotCQkJCXRoaXMuc3ViamVjdC5zZXRIb3VyKGhvdXIpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFRpbWVPZkRheUV4cGlyeU1pbnV0ZUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtUaW1lT2ZEYXk+IHRpbWVPZkRheUV4cGlyeUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1RpbWVPZkRheSwgSW50ZWdlcj4oCi0JCQkJCXRpbWVPZkRheUV4cGlyeUhvbGRlciwgCi0JCQkJCUVjbGlwc2VMaW5rVGltZU9mRGF5Lk1JTlVURV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE1pbnV0ZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIG1pbnV0ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRNaW51dGUobWludXRlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRUaW1lT2ZEYXlFeHBpcnlTZWNvbmRIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rVGltZU9mRGF5PiB0aW1lT2ZEYXlFeHBpcnlIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtUaW1lT2ZEYXksIEludGVnZXI+KAotCQkJCQl0aW1lT2ZEYXlFeHBpcnlIb2xkZXIsIAotCQkJCQlFY2xpcHNlTGlua1RpbWVPZkRheS5TRUNPTkRfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTZWNvbmQoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciBzZWNvbmQpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U2Vjb25kKHNlY29uZCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzViYTA5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2VUZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdElkTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGVtcG9yYWxUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgSWRNYXBwaW5nPgotCWV4dGVuZHMgQWJzdHJhY3RJZE1hcHBpbmdDb21wb3NpdGU8VD4KLXsKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IENvbHVtbkNvbXBvc2l0ZSh0aGlzLCBidWlsZENvbHVtbkhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkTXV0YWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVR5cGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJKChHcmlkTGF5b3V0KSBjb250YWluZXIuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnMgPSAyOwotCQkKLQkJLy8gTm8gY29udmVydGVyCi0JCUJ1dHRvbiBub0NvbnZlcnRlckJ1dHRvbiA9IGFkZFJhZGlvQnV0dG9uKAotCQkJY29udGFpbmVyLCAKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX2RlZmF1bHQsIAotCQkJYnVpbGRDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKG51bGwpLCAKLQkJCW51bGwpOwotCQkoKEdyaWREYXRhKSBub0NvbnZlcnRlckJ1dHRvbi5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQkKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyID0gYnVpbGRDb252ZXJ0ZXJIb2xkZXIoKTsKLQkJLy8gVGVtcG9yYWwKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb250YWluZXIsIAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fdGVtcG9yYWwsIAotCQkJYnVpbGRDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyksIAotCQkJbnVsbCk7Ci0JCXJlZ2lzdGVyU3ViUGFuZShuZXcgVGVtcG9yYWxUeXBlQ29tcG9zaXRlKGJ1aWxkVGVtcG9yYWxDb252ZXJ0ZXJIb2xkZXIoY29udmVydGVySG9sZGVyKSwgY29udGFpbmVyLCBnZXRXaWRnZXRGYWN0b3J5KCkpKTsKLQotCQkvLyBFY2xpcHNlTGluayBDb252ZXJ0ZXIKLQkJQnV0dG9uIGVsQ29udmVydGVyQnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCi0JCQljb250YWluZXIsIAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl9jb252ZXJ0ZWQsIAotCQkJYnVpbGRDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcyksIAotCQkJbnVsbCk7Ci0JCSgoR3JpZERhdGEpIGVsQ29udmVydGVyQnV0dG9uLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkKLQkJUGFuZTxFY2xpcHNlTGlua0NvbnZlcnQ+IGNvbnZlcnRDb21wb3NpdGUgPSBidWlsZENvbnZlcnRDb21wb3NpdGUoYnVpbGRFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcihjb252ZXJ0ZXJIb2xkZXIpLCBjb250YWluZXIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IChHcmlkRGF0YSkgY29udmVydENvbXBvc2l0ZS5nZXRDb250cm9sKCkuZ2V0TGF5b3V0RGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMDsKLQkJcmVnaXN0ZXJTdWJQYW5lKGNvbnZlcnRDb21wb3NpdGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGFuZTxFY2xpcHNlTGlua0NvbnZlcnQ+IGJ1aWxkQ29udmVydENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0PiBjb252ZXJ0SG9sZGVyLCBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlKGNvbnZlcnRIb2xkZXIsIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnQ+IGJ1aWxkRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyLCBFY2xpcHNlTGlua0NvbnZlcnQ+KGNvbnZlcnRlckhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJ0IHRyYW5zZm9ybV8oQ29udmVydGVyIGNvbnZlcnRlcikgewotCQkJCXJldHVybiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcyA/IChFY2xpcHNlTGlua0NvbnZlcnQpIGNvbnZlcnRlciA6IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtNdXRhYmxlPiBidWlsZE11dGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEVjbGlwc2VMaW5rTXV0YWJsZT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua011dGFibGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtJZE1hcHBpbmcpIHRoaXMuc3ViamVjdCkuZ2V0TXV0YWJsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NvbnZlcnRlcnMKLQkJKTsKLQkJaW5pdGlhbGl6ZUNvbnZlcnRlcnNTZWN0aW9uKGNvbnRhaW5lciwgdGhpcy5idWlsZENvbnZlcnRlckhvbGRlclZhbHVlTW9kZWwoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUodGhpcywgY29udmVydGVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+IGJ1aWxkQ29udmVydGVySG9sZGVyVmFsdWVNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SWRNYXBwaW5nLCBFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0lkTWFwcGluZykgdGhpcy5zdWJqZWN0KS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjE3MTM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkZldGNoYWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNpY01hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgSm9pbiBGZXRjaDogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEZldGNoYWJsZU1hcHBpbmcKLSAqIEBzZWUgQmFzaWNNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqIEBzZWUgSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqIEBzZWUgT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKiBAc2VlIE9ybU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICogQHNlZSBPcm1PbmVUb09uZU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rSm9pbkZldGNoPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpvaW5GZXRjaENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLCAKLQkJCQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0pvaW5GZXRjaD4gc3ViamVjdEhvbGRlciwKLQkJCQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWFkZExhYmVsZWRDb21wb3NpdGUoIAotICAgICAgICAgICAgY29udGFpbmVyLCAKLSAgICAgICAgICAgIGFkZExhYmVsKCAKLSAgICAgICAgICAgICAgICAgY29udGFpbmVyLCAKLSAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZV9sYWJlbCksIAotICAgICAgICAgICAgYWRkSm9pbkZldGNoVHlwZUNvbWJvKGNvbnRhaW5lcikuZ2V0Q29udHJvbCgpLAotICAgICAgICAgICAgbnVsbCAKLSAgICAgICApOwotCX0KLQkKLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0pvaW5GZXRjaCwgRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlPiBhZGRKb2luRmV0Y2hUeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0pvaW5GZXRjaCwgRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFY2xpcHNlTGlua0pvaW5GZXRjaC5WQUxVRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZVtdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIHZhbHVlKSB7Ci0JCQkJc3dpdGNoICh2YWx1ZSkgewotCQkJCQljYXNlIElOTkVSIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlX2lubmVyOwotCQkJCQljYXNlIE9VVEVSIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlX291dGVyOwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBudWxsRGlzcGxheVN0cmluZygpIHsKLQkJCQlyZXR1cm4gSnB0Q29tbW9uVWlNZXNzYWdlcy5Ob25lU2VsZWN0ZWQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFZhbHVlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIHZhbHVlKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldFZhbHVlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI2OTM5Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5NYW55VG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuT3JkZXJpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcmRlcmluZ0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgTWFueVRvTWFueU1hcHBpbmd9Ci0gKiBAc2VlIHtAbGluayBUYXJnZXRFbnRpdHlDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBNYW55VG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZX0KLSAqIEBzZWUge0BsaW5rIEZldGNoVHlwZUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIENhc2NhZGVDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBPcmRlcmluZ0NvbXBvc2l0ZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU8VCBleHRlbmRzIE1hbnlUb01hbnlNYXBwaW5nPiAKLQlleHRlbmRzIEFic3RyYWN0TWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU8VCwgTWFueVRvTWFueVJlbGF0aW9uc2hpcD4KLQlpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTWFueVRvTWFueU1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hbnlUb01hbnlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0pvaW5GZXRjaD4gYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNYW55VG9NYW55TWFwcGluZywgRWNsaXBzZUxpbmtKb2luRmV0Y2g+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKb2luRmV0Y2ggYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSB0aGlzLnN1YmplY3QpLmdldEpvaW5GZXRjaCgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NvbnZlcnRlcnMKLQkJKTsKLQkJaW5pdGlhbGl6ZUNvbnZlcnRlcnNTZWN0aW9uKGNvbnRhaW5lciwgdGhpcy5idWlsZENvbnZlcnRlckhvbGRlclZhbHVlTW9kZWwoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUodGhpcywgY29udmVydGVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+IGJ1aWxkQ29udmVydGVySG9sZGVyVmFsdWVNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TWFueVRvTWFueU1hcHBpbmcsIEVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcpIHRoaXMuc3ViamVjdCkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjAyZjhhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5NYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEpvaW5pbmdTdHJhdGVneUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcHRpb25hbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIHtAbGluayBNYW55VG9PbmVNYXBwaW5nfQotICogQHNlZSB7QGxpbmsgVGFyZ2V0RW50aXR5Q29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZX0KLSAqIEBzZWUge0BsaW5rIEZldGNoVHlwZUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE9wdGlvbmFsQ29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgQ2FzY2FkZUNvbXBvc2l0ZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgTWFueVRvT25lTWFwcGluZz4gCi0JZXh0ZW5kcyBBYnN0cmFjdE1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGU8VCwgTWFueVRvT25lUmVsYXRpb25zaGlwPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+TWFueVRvT25lTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFueVRvT25lU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7CQkKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rSm9pbkZldGNoPiBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEVjbGlwc2VMaW5rSm9pbkZldGNoPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgdGhpcy5zdWJqZWN0KS5nZXRKb2luRmV0Y2goKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQWR2YW5jZWRDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NBZHZhbmNlZENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWRhYzdiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NBZHZhbmNlZENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlYWRPbmx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0FkdmFuY2VkQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxNYXBwZWRTdXBlcmNsYXNzPiB7Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0FkdmFuY2VkQ29tcG9zaXRlKAotCQkJUGFuZTw/IGV4dGVuZHMgTWFwcGVkU3VwZXJjbGFzcz4gcGFyZW50UGFuZSwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9hZHZhbmNlZAotCQkpOwotCQkKLQkJbmV3IEVjbGlwc2VMaW5rUmVhZE9ubHlDb21wb3NpdGUodGhpcywgYnVpbGRSZWFkT25seUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtDdXN0b21pemVyQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ3VzdG9taXplckhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZSh0aGlzLCBidWlsZENoYW5nZVRyYWNraW5nSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUmVhZE9ubHk+IGJ1aWxkUmVhZE9ubHlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1hcHBlZFN1cGVyY2xhc3MsIEVjbGlwc2VMaW5rUmVhZE9ubHk+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtSZWFkT25seSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIHRoaXMuc3ViamVjdCkuZ2V0UmVhZE9ubHkoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDdXN0b21pemVyPiBidWlsZEN1c3RvbWl6ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1hcHBlZFN1cGVyY2xhc3MsIEVjbGlwc2VMaW5rQ3VzdG9taXplcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0N1c3RvbWl6ZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSB0aGlzLnN1YmplY3QpLmdldEN1c3RvbWl6ZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZz4gYnVpbGRDaGFuZ2VUcmFja2luZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TWFwcGVkU3VwZXJjbGFzcywgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZz4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgdGhpcy5zdWJqZWN0KS5nZXRDaGFuZ2VUcmFja2luZygpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua011bHRpdGVuYW5jeUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ODBhMzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5UcmlTdGF0ZUNoZWNrQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5WYWx1ZUxpc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LlJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNDb21wb3NpdGUuVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgIHwKLSAqIHwgTXVsdGl0ZW5hbnQgc3RyYXRlZ3k6ICB8IEVudW1Db21ib1ZpZXdlciAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8ICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSBUZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IHggT3ZlcnJpZGUgRGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICoKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3lDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zPgotewotCXByaXZhdGUgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNDb21wb3NpdGU8RWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzM+IHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQ29tcG9zaXRlOwotCi0JcHVibGljIEVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Q29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMz4gc3ViamVjdEhvbGRlciwKLQkJCQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOwotCi0JCUNvbXBvc2l0ZSBzdWJQYW5lID0gYWRkU3ViUGFuZSgKLQkJCWNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luCi0JCSk7Ci0KLQkJLy8gU3RyYXRlZ3kgd2lkZ2V0cwotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKCAKLQkJCXN1YlBhbmUsIAotICAgICAgICAgICAgYWRkQ2hlY2tCb3goIAotICAgICAgICAgICAgICAgICBjb250YWluZXIsIAotICAgICAgICAgICAgICAgICBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Q29tcG9zaXRlX3N0cmF0ZWd5LCAKLSAgICAgICAgICAgICAgICAgYnVpbE11bHRpdGVuYW50SG9sZGVyKCksIAotICAgICAgICAgICAgICAgICBudWxsIAotICAgICAgICAgICAgKSwgCi0gICAgICAgICAgICBhZGRNdWx0aXRlbmFudFN0cmF0ZWd5Q29tYm8oc3ViUGFuZSkuZ2V0Q29udHJvbCgpLCAKLSAgICAgICAgICAgIEVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuTVVMVElURU5BTkNZX1NUUkFURUdZCi0gICAgICAgICAgICApOwotCi0JCS8vIEluY2x1ZGUgY3JpdGVyaWEgdHJpLXN0YXRlIGNoZWNrIGJveAotCQlUcmlTdGF0ZUNoZWNrQm94IGluY2x1ZGVDcml0ZXJpYUNoZWNrQm94ID0gYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJc3ViUGFuZSwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3lDb21wb3NpdGVfaW5jbHVkZUNyaXRlcmlhLAotCQkJYnVpbGRJbmNsdWRlQ3JpdGVyaWFIb2xkZXIoKSwKLQkJCWJ1aWxkSW5jbHVkZUNyaXRlcmlhU3RyaW5nSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLk1VTFRJVEVOQU5DWV9JTkNMVURFX0NSSVRFUklBKTsKLQotCQlTV1RUb29scy5jb250cm9sVmlzaWJsZVN0YXRlKG5ldyBFY2xpcHNlTGluazJfNFByb2plY3RGbGFnTW9kZWw8RWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzM+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSwgaW5jbHVkZUNyaXRlcmlhQ2hlY2tCb3guZ2V0Q2hlY2tCb3goKSk7Ci0KLQkJLy8gVGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucyBncm91cCBwYW5lCi0JCUdyb3VwIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Hcm91cFBhbmUgPSBhZGRUaXRsZWRHcm91cCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNfZ3JvdXBMYWJlbAotCQkpOwotCi0JCS8vIE92ZXJyaWRlIERlZmF1bHQgVGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1ucyBjaGVjayBib3gKLQkJYWRkQ2hlY2tCb3goCi0JCQlhZGRTdWJQYW5lKHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Hcm91cFBhbmUsIDgpLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua011bHRpdGVuYW5jeV9vdmVycmlkZURlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucywKLQkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcigpLAotCQkJbnVsbAotCQkpOwotCi0JCXRoaXMudGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNDb21wb3NpdGUgPSB0aGlzLmJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNDb21wb3NpdGUodGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkdyb3VwUGFuZSk7Ci0KLQkJdGhpcy50ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0NvbXBvc2l0ZS5pbnN0YWxsTGlzdFBhbmVFbmFibGVyKG5ldyBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uUGFuZUVuYWJsZXJIb2xkZXIoKSk7Ci0JfQotCQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsTXVsdGl0ZW5hbnRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zLlNQRUNJRklFRF9NVUxUSVRFTkFOVF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc1NwZWNpZmllZE11bHRpdGVuYW50KCkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZE11bHRpdGVuYW50KHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPEVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zLCBFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMz4gYWRkTXVsdGl0ZW5hbnRTdHJhdGVneUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMsIEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMy5ERUZBVUxUX1RZUEVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zLlNQRUNJRklFRF9UWVBFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzNbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMgdmFsdWUpIHsKLQkJCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQkJCWNhc2UgU0lOR0xFX1RBQkxFIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Q29tcG9zaXRlX3NpbmdsZV90YWJsZTsKLQkJCQkJY2FzZSBUQUJMRV9QRVJfVEVOQU5UIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Q29tcG9zaXRlX3RhYmxlX3Blcl90ZW5hbnQ7Ci0JCQkJCWNhc2UgVlBEIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Q29tcG9zaXRlX3ZwZDsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMyBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMyB2YWx1ZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRUeXBlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkSW5jbHVkZUNyaXRlcmlhSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMy5TUEVDSUZJRURfSU5DTFVERV9DUklURVJJQV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRJbmNsdWRlQ3JpdGVyaWFTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRJbmNsdWRlQ3JpdGVyaWFIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Q29tcG9zaXRlX2luY2x1ZGVDcml0ZXJpYVdpdGhEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua011bHRpdGVuYW5jeUNvbXBvc2l0ZV9pbmNsdWRlQ3JpdGVyaWE7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdEluY2x1ZGVDcml0ZXJpYUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMsIEJvb2xlYW4+KAotCQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCQlFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMy5TUEVDSUZJRURfSU5DTFVERV9DUklURVJJQV9QUk9QRVJUWSwKLQkJCQlFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMy5ERUZBVUxUX0lOQ0xVREVfQ1JJVEVSSUFfUFJPUEVSVFkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzSW5jbHVkZUNyaXRlcmlhKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0NvbXBvc2l0ZTxFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMz4gIGJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQ29tcG9zaXRlPEVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCWNvbnRhaW5lciwKLQkJCWdldFdpZGdldEZhY3RvcnkoKSwKLQkJCWJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNFZGl0b3IoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zRWRpdG9yPEVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zPiBidWlsZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zRWRpdG9yKCkgewotCQlyZXR1cm4gbmV3IFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zUHJvdmlkZXIoKTsKLQl9Ci0KLQljbGFzcyBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1Byb3ZpZGVyIGltcGxlbWVudHMgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNFZGl0b3I8RWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzM+IHsKLQotCQlwdWJsaWMgdm9pZCBhZGRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIHN1YmplY3QpIHsKLQkJCVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgY29sdW1uID0gc3ViamVjdC5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCQljb2x1bW4uc2V0U3BlY2lmaWVkTmFtZShSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuREVGQVVMVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBMaXN0SXRlcmFibGU8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBnZXREZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgc3ViamVjdCkgewotCQkJcmV0dXJuIG5ldyBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPihzdWJqZWN0LmdldERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZShFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gc3ViamVjdC5nZXREZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yc0xpc3RQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMuREVGQVVMVF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgc3ViamVjdCkgewotCQkJcmV0dXJuIG5ldyBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPihzdWJqZWN0LmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgc3ViamVjdCkgewotCQkJcmV0dXJuIHN1YmplY3QuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JzTGlzdFByb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMy5TUEVDSUZJRURfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OU19MSVNUOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgc3ViamVjdCkgewotCQkJcmV0dXJuIHN1YmplY3QuaGFzU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIHN1YmplY3QsIGludFtdIHNlbGVjdGVkSW5kaWNlcykgewotCQkJZm9yIChpbnQgaW5kZXggPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoOyBpbmRleC0tID4gMDsgKSB7Ci0JCQkJc3ViamVjdC5yZW1vdmVTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKHNlbGVjdGVkSW5kaWNlc1tpbmRleF0pOwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCBzZXRTZWxlY3RlZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4pIHsKLQkJdGhpcy50ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0NvbXBvc2l0ZS5zZXRTZWxlY3RlZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4odGVuYW50RGlzY3JpbWluYXRvckNvbHVtbik7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkT3ZlcnJpZGVEZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBPdmVycmlkZURlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyKCk7Ci0JfQotCi0JTGlzdFZhbHVlTW9kZWw8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBidWlsZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMywgUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPigKLQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zLlNQRUNJRklFRF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJCQlyZXR1cm4gbmV3IFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+KHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgY2xhc3MgT3ZlcnJpZGVEZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkhvbGRlciAKLQkJZXh0ZW5kcyBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPgotCQlpbXBsZW1lbnRzIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gCi0JewotCQlwdWJsaWMgT3ZlcnJpZGVEZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcigpIHsKLQkJCXN1cGVyKGJ1aWxkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNMaXN0SG9sZGVyKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMubGlzdE1vZGVsLnNpemUoKSA+IDApOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSkgewotCQkJdXBkYXRlVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnModmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHVwZGF0ZVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJc2V0UG9wdWxhdGluZyh0cnVlKTsKLQotCQkJdHJ5IHsKLQkJCQlFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBzdWJqZWN0ID0gZ2V0U3ViamVjdCgpOwotCi0JCQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQkJCVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgbmV3VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbiA9IHN1YmplY3QuYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQkJCQluZXdUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLkRFRkFVTFRfTkFNRSk7Ci0JCQkJfQotCQkJCS8vIFJlbW92ZSBhbGwgdGhlIHNwZWNpZmllZCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zCi0JCQkJZWxzZSB7Ci0JCQkJCWZvciAoaW50IGluZGV4ID0gc3ViamVjdC5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKTsgLS1pbmRleCA+PSAwOyApIHsKLQkJCQkJCXN1YmplY3QucmVtb3ZlU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihpbmRleCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gY2xhc3MgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtblBhbmVFbmFibGVySG9sZGVyIAotCQlleHRlbmRzIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zLCBCb29sZWFuPgotCXsKLQkJcHJpdmF0ZSBTdGF0ZUNoYW5nZUxpc3RlbmVyIHN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci0KLQkJVGVuYW50RGlzY3JpbWluYXRvckNvbHVtblBhbmVFbmFibGVySG9sZGVyKCkgewotCQkJc3VwZXIoCi0JCQkJbmV3IFZhbHVlTGlzdEFkYXB0ZXI8RWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzM+KAotCQkJCQluZXcgUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8RWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzM+KGdldFN1YmplY3RIb2xkZXIoKSksIAotCQkJCQlFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMy5TUEVDSUZJRURfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OU19MSVNUCi0JCQkJKQotCQkJKTsKLQkJCXRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCX0KLQotCQlwcml2YXRlIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5QYW5lRW5hYmxlckhvbGRlci50aGlzLnZhbHVlU3RhdGVDaGFuZ2VkKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXZvaWQgdmFsdWVTdGF0ZUNoYW5nZWQoKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy52YWx1ZTsKLQkJCXRoaXMudmFsdWUgPSB0aGlzLnRyYW5zZm9ybSh0aGlzLnZhbHVlTW9kZWwuZ2V0VmFsdWUoKSk7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZCwgdGhpcy52YWx1ZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIHYpIHsKLQkJCXJldHVybiAodiA9PSBudWxsKSA/IEJvb2xlYW4uRkFMU0UgOiBzdXBlci50cmFuc2Zvcm0odik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtXyhFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyB2KSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHYuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkgPiAwKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCQl0aGlzLnZhbHVlTW9kZWwuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLnN0YXRlQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQkJdGhpcy52YWx1ZU1vZGVsLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyKTsKLQkJCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNmMzNmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011dGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBjb21wb3NpdGUgc2ltcGx5IHNob3dzIGEgdHJpLXN0YXRlIGNoZWNrIGJveCBmb3IgdGhlIE11dGFibGUgb3B0aW9uLgotICoKLSAqIEBzZWUgRWNsaXBzZUxpbmtNdXRhYmxlCi0gKiBAc2VlIEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rTXV0YWJsZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk11dGFibGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsIAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rTXV0YWJsZT4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZV9tdXRhYmxlTGFiZWwsCi0JCQlidWlsZE11dGFibGVIb2xkZXIoKSwKLQkJCWJ1aWxkTXV0YWJsZVN0cmluZ0hvbGRlcigpLAotCQkJbnVsbAotCQkpOwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE11dGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rTXV0YWJsZSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua011dGFibGUuU1BFQ0lGSUVEX01VVEFCTEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRNdXRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkTXV0YWJsZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTXV0YWJsZVN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdE11dGFibGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZV9tdXRhYmxlTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGVfbXV0YWJsZUxhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRNdXRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua011dGFibGUsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtNdXRhYmxlLlNQRUNJRklFRF9NVVRBQkxFX1BST1BFUlRZLAotCQkJRWNsaXBzZUxpbmtNdXRhYmxlLkRFRkFVTFRfTVVUQUJMRV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZE11dGFibGUoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MjYzNTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LkNvbHVtbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlVGFibGVQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYU5hbWVkQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgTmFtZTogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ29udmVydGVyCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4KLXsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQotCQlhZGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwgCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyQ29tcG9zaXRlX25hbWVUZXh0TGFiZWwsIAotCQkJYnVpbGROYW1lVGV4dEhvbGRlcigpKTsKLQkJCi0JCWFkZERhdGFUeXBlQ2hvb3Nlcihjb250YWluZXIpOwotCQlhZGRPYmplY3RUeXBlQ2hvb3Nlcihjb250YWluZXIpOwotCQkKLQkJYWRkQ29udmVyc2lvblZhbHVlc1RhYmxlKGNvbnRhaW5lcik7Ci0KLQkJYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9kZWZhdWx0T2JqZWN0VmFsdWVMYWJlbCwKLQkJCWJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlTGlzdEhvbGRlcigpLAotCQkJYnVpbGREZWZhdWx0T2JqZWN0VmFsdWVIb2xkZXIoKSwKLQkJCWJ1aWxkU3RyaW5nQ29udmVydGVyKCksCi0JCQludWxsCi0JCSk7Ci0KLQkJbmV3IFBhbmVFbmFibGVyKGJ1aWxkQm9vbGVhbkhvbGRlcigpLCB0aGlzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVUZXh0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIsIFN0cmluZz4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBKcGFOYW1lZENvbnRleHROb2RlLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gYWRkRGF0YVR5cGVDaG9vc2VyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IENsYXNzQ2hvb3NlclBhbmU8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuREFUQV9UWVBFX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREYXRhVHlwZSgpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCQl9Ci0KLQkJCQkJCXRoaXMuc3ViamVjdC5zZXREYXRhVHlwZSh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGF0YVR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfZGF0YVR5cGVMYWJlbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0RGF0YVR5cGUoY2xhc3NOYW1lKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRGdWxseVF1YWxpZmllZERhdGFUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gYWRkT2JqZWN0VHlwZUNob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5PQkpFQ1RfVFlQRV9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0T2JqZWN0VHlwZSgpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCQl9Ci0KLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRPYmplY3RUeXBlKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRPYmplY3RUeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX29iamVjdFR5cGVMYWJlbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0T2JqZWN0VHlwZShjbGFzc05hbWUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgZ2V0VHlwZURpYWxvZ1N0eWxlKCkgewotCQkJCXJldHVybiBJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFU19BTkRfRU5VTVM7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGNoYXIgZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZENvbnZlcnNpb25WYWx1ZXNUYWJsZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQotCQkvLyBKb2luIENvbHVtbnMgZ3JvdXAgcGFuZQotCQlHcm91cCBjb252ZXJzaW9uVmFsdWVzR3JvdXBQYW5lID0gYWRkVGl0bGVkR3JvdXAoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9jb252ZXJzaW9uVmFsdWVzR3JvdXBUaXRsZQotCQkpOwotCi0JCU1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGNvbnZlcnNpb25WYWx1ZUhvbGRlciA9Ci0JCQlidWlsZENvbnZlcnNpb25WYWx1ZUhvbGRlcigpOwotCQkvLyBDb252ZXJzaW9uIFZhbHVlcyBhZGQvcmVtb3ZlIGxpc3QgcGFuZQotCQluZXcgQWRkUmVtb3ZlVGFibGVQYW5lPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4oCi0JCQl0aGlzLAotCQkJY29udmVyc2lvblZhbHVlc0dyb3VwUGFuZSwKLQkJCWJ1aWxkQ29udmVyc2lvblZhbHVlc0FkYXB0ZXIoKSwKLQkJCWJ1aWxkQ29udmVyc2lvblZhbHVlc0xpc3RNb2RlbCgpLAotCQkJY29udmVyc2lvblZhbHVlSG9sZGVyLAotCQkJYnVpbGRDb252ZXJzaW9uVmFsdWVzTGFiZWxQcm92aWRlcigpLAotCQkJbnVsbC8vVE9ETyBuZWVkIGEgaGVscCBjb250ZXh0IGlkIGZvciB0aGlzCi0JCSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29sdW1uQWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gYnVpbGRDb2x1bW5BZGFwdGVyKCkgewotCQkJCXJldHVybiBuZXcgQ29udmVyc2lvblZhbHVlQ29sdW1uQWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JfQotCi0JcHJvdGVjdGVkIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGJ1aWxkQ29udmVyc2lvblZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWRkUmVtb3ZlTGlzdFBhbmUuQWRhcHRlciBidWlsZENvbnZlcnNpb25WYWx1ZXNBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2cgZGlhbG9nID0gYnVpbGRDb252ZXJzaW9uVmFsdWVEaWFsb2dGb3JBZGQoKTsKLQkJCQlhZGRDb252ZXJzaW9uVmFsdWVGcm9tRGlhbG9nKGRpYWxvZywgbGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbigpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfY29udmVyc2lvblZhbHVlRWRpdDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBvcHRpb25PblNlbGVjdGlvbihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlID0gKEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlKSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpOwotCQkJCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nIGRpYWxvZyA9IG5ldyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZyhnZXRTaGVsbCgpLCBnZXRTdWJqZWN0KCksIGNvbnZlcnNpb25WYWx1ZSk7Ci0JCQkJZWRpdENvbnZlcnNpb25WYWx1ZUZyb21EaWFsb2coZGlhbG9nLCBjb252ZXJzaW9uVmFsdWUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gZ2V0U3ViamVjdCgpOwotCQkJCWludFtdIHNlbGVjdGVkSW5kaWNlcyA9IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZEluZGljZXMoKTsKLQotCQkJCWZvciAoaW50IGluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aDsgLS1pbmRleCA+PSAwOyApIHsKLQkJCQkJY29udmVydGVyLnJlbW92ZUNvbnZlcnNpb25WYWx1ZShzZWxlY3RlZEluZGljZXNbaW5kZXhdKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2cgYnVpbGRDb252ZXJzaW9uVmFsdWVEaWFsb2dGb3JBZGQoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2coZ2V0U2hlbGwoKSwgZ2V0U3ViamVjdCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb252ZXJzaW9uVmFsdWVGcm9tRGlhbG9nKEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nIGRpYWxvZywgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuT0spIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSA9IHRoaXMuZ2V0U3ViamVjdCgpLmFkZENvbnZlcnNpb25WYWx1ZSgpOwotCQljb252ZXJzaW9uVmFsdWUuc2V0RGF0YVZhbHVlKGRpYWxvZy5nZXREYXRhVmFsdWUoKSk7Ci0JCWNvbnZlcnNpb25WYWx1ZS5zZXRPYmplY3RWYWx1ZShkaWFsb2cuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0KLQkJbGlzdFNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoY29udmVyc2lvblZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlZGl0Q29udmVyc2lvblZhbHVlRnJvbURpYWxvZyhFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZyBkaWFsb2csIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSkgewotCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuT0spIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWNvbnZlcnNpb25WYWx1ZS5zZXREYXRhVmFsdWUoZGlhbG9nLmdldERhdGFWYWx1ZSgpKTsKLQkJY29udmVyc2lvblZhbHVlLnNldE9iamVjdFZhbHVlKGRpYWxvZy5nZXRPYmplY3RWYWx1ZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gYnVpbGRDb252ZXJzaW9uVmFsdWVzTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4oYnVpbGRDb252ZXJzaW9uVmFsdWVzTGlzdEhvbGRlcigpLCAKLQkJCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlLkRBVEFfVkFMVUVfUFJPUEVSVFksCi0JCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5PQkpFQ1RfVkFMVUVfUFJPUEVSVFkpOwotCX0JCi0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBidWlsZENvbnZlcnNpb25WYWx1ZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciwgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLkNPTlZFUlNJT05fVkFMVUVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiBuZXcgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPih0aGlzLnN1YmplY3QuZ2V0Q29udmVyc2lvblZhbHVlcygpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q29udmVyc2lvblZhbHVlc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIElUYWJsZUxhYmVsUHJvdmlkZXIgYnVpbGRDb252ZXJzaW9uVmFsdWVzTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZUxhYmVsUHJvdmlkZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0T2JqZWN0VmFsdWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUsIFN0cmluZz4oYnVpbGRDb252ZXJzaW9uVmFsdWVzTGlzdE1vZGVsKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm1JdGVtKEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSkgewotCQkJCXJldHVybiBjb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRPYmplY3RWYWx1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLCBTdHJpbmc+KAotCQkJCWdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLkRFRkFVTFRfT0JKRUNUX1ZBTFVFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKTsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldERlZmF1bHRPYmplY3RWYWx1ZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZFN0cmluZ0NvbnZlcnRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQkJCXJldHVybiAodmFsdWUgPT0gbnVsbCkgPyAiIiA6IHZhbHVlOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciB2YWx1ZSkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUgIT0gbnVsbCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotCQlpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCi0JCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUgPSAoRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUpIGVsZW1lbnQ7Ci0JCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQkJCi0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSBDb252ZXJzaW9uVmFsdWVDb2x1bW5BZGFwdGVyLkRBVEFfVkFMVUVfQ09MVU1OOiB7Ci0JCQkJCXZhbHVlID0gY29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkKLQkJCQljYXNlIENvbnZlcnNpb25WYWx1ZUNvbHVtbkFkYXB0ZXIuT0JKRUNUX1ZBTFVFX0NPTFVNTjogewotCQkJCQl2YWx1ZSA9IGNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbnZlcnNpb25WYWx1ZUNvbHVtbkFkYXB0ZXIgaW1wbGVtZW50cyBDb2x1bW5BZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiB7Ci0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0NPVU5UID0gMjsKLQkJLy9wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RJT05fQ09MVU1OID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREFUQV9WQUxVRV9DT0xVTU4gPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfVkFMVUVfQ09MVU1OID0gMTsKLQotCQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERhdGFWYWx1ZUhvbGRlcihFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSwgU3RyaW5nPihFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5EQVRBX1ZBTFVFX1BST1BFUlRZLCBzdWJqZWN0KSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREYXRhVmFsdWUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXREYXRhVmFsdWUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE9iamVjdFZhbHVlSG9sZGVyKEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIHN1YmplY3QpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlLCBTdHJpbmc+KEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlLk9CSkVDVF9WQUxVRV9QUk9QRVJUWSwgc3ViamVjdCkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0T2JqZWN0VmFsdWUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRPYmplY3RWYWx1ZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXB1YmxpYyBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gY2VsbE1vZGVscyhFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBzdWJqZWN0KSB7Ci0JCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gaG9sZGVycyA9IG5ldyBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W0NPTFVNTl9DT1VOVF07Ci0JCQkvL2hvbGRlcnNbU0VMRUNUSU9OX0NPTFVNTl0gPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4oKTsKLQkJCWhvbGRlcnNbREFUQV9WQUxVRV9DT0xVTU5dICAgICAgPSBidWlsZERhdGFWYWx1ZUhvbGRlcihzdWJqZWN0KTsKLQkJCWhvbGRlcnNbT0JKRUNUX1ZBTFVFX0NPTFVNTl0gICAgID0gYnVpbGRPYmplY3RWYWx1ZUhvbGRlcihzdWJqZWN0KTsKLQkJCXJldHVybiBob2xkZXJzOwotCQl9Ci0KLQkJcHVibGljIGludCBjb2x1bW5Db3VudCgpIHsKLQkJCXJldHVybiBDT0xVTU5fQ09VTlQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGNvbHVtbk5hbWUoaW50IGNvbHVtbkluZGV4KSB7Ci0KLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQljYXNlIENvbnZlcnNpb25WYWx1ZUNvbHVtbkFkYXB0ZXIuREFUQV9WQUxVRV9DT0xVTU46IHsKLQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2NvbnZlcnNpb25WYWx1ZXNEYXRhVmFsdWVDb2x1bW47Ci0JCQkJfQotCi0JCQkJY2FzZSBDb252ZXJzaW9uVmFsdWVDb2x1bW5BZGFwdGVyLk9CSkVDVF9WQUxVRV9DT0xVTU46IHsKLQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2NvbnZlcnNpb25WYWx1ZXNPYmplY3RWYWx1ZUNvbHVtbjsKLQkJCQl9Ci0KLQkJCQlkZWZhdWx0OiB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua09uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua09uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVjYjlmNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUgCi0JZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwPgotewotCXB1YmxpYyBFY2xpcHNlTGlua09uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsIAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcD4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ190aXRsZSwKLQkJCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSkpOwotCQkKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb21wb3NpdGUsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX21hcHBlZEJ5TGFiZWwsCi0JCQlNYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUuYnVpbGRVc2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lIb2xkZXIoZ2V0U3ViamVjdEhvbGRlcigpKSwKLQkJCW51bGwpOwotCi0JCW5ldyBNYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29tcG9zaXRlLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ19qb2luQ29sdW1uSm9pbmluZ0xhYmVsLAotCQkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuYnVpbGRVc2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneUhvbGRlcihnZXRTdWJqZWN0SG9sZGVyKCkpLAotCQkJbnVsbCk7Ci0KLQkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuCi0JCQlidWlsZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lV2l0aEluY2x1ZGVPdmVycmlkZUNoZWNrQm94KHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbXBvc2l0ZSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfam9pblRhYmxlSm9pbmluZ0xhYmVsLAotCQkJSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZS5idWlsZFVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lIb2xkZXIoZ2V0U3ViamVjdEhvbGRlcigpKSwKLQkJCW51bGwpOwotCi0JCW5ldyBKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQlhZGRTdWJQYW5lKGNvbXBvc2l0ZSwgNSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDMyZmE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk9yZGVyaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRWNsaXBzZUxpbmtPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRWNsaXBzZUxpbmt2YXRlT3duZWRDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9yZGVyaW5nQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIE9uZVRvT25lTWFwcGluZwotICogQHNlZSBDYXNjYWRlQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZQotICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKLSAqIEBzZWUgT3JkZXJpbmdDb21wb3NpdGUKLSAqIEBzZWUgVGFyZ2V0RW50aXR5Q29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU8VCBleHRlbmRzIE9uZVRvTWFueU1hcHBpbmc+IAotCWV4dGVuZHMgQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlPFQsIEVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwPgotICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlbGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JT25lVG9NYW55TWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9NYW55U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZSh0aGlzLCBidWlsZFByaXZhdGVPd25hYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKb2luaW5nU3RyYXRlZ3lDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRWNsaXBzZUxpbmtPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGJ1aWxkSm9pbmluZ0hvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQcml2YXRlT3duZWQ+IGJ1aWxkUHJpdmF0ZU93bmFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgdGhpcy5zdWJqZWN0KS5nZXRQcml2YXRlT3duZWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0pvaW5GZXRjaD4gYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBFY2xpcHNlTGlua0pvaW5GZXRjaD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHRoaXMuc3ViamVjdCkuZ2V0Sm9pbkZldGNoKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfY29udmVydGVycwotCQkpOwotCQlpbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oY29udGFpbmVyLCB0aGlzLmJ1aWxkQ29udmVydGVySG9sZGVyVmFsdWVNb2RlbCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZSh0aGlzLCBjb252ZXJ0ZXJIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXJWYWx1ZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPbmVUb01hbnlNYXBwaW5nLCBFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHRoaXMuc3ViamVjdCkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YTY0YzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RPbmVUb09uZU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkNhc2NhZGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuT3B0aW9uYWxDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlPFQgZXh0ZW5kcyBPbmVUb09uZU1hcHBpbmc+Ci0JZXh0ZW5kcyBBYnN0cmFjdE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTxULCBPbmVUb09uZVJlbGF0aW9uc2hpcD4KLQlpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZWxpbmtPbmVUb09uZU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JT25lVG9PbmVNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPbmVUb09uZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlKHRoaXMsIGJ1aWxkUHJpdmF0ZU93bmFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtKb2luRmV0Y2g+IGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgRWNsaXBzZUxpbmtKb2luRmV0Y2g+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKb2luRmV0Y2ggYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpdGhpcy5zdWJqZWN0KS5nZXRKb2luRmV0Y2goKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1ByaXZhdGVPd25lZD4gYnVpbGRQcml2YXRlT3duYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpdGhpcy5zdWJqZWN0KS5nZXRQcml2YXRlT3duZWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAyYzk0Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ByaXZhdGVPd25lZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBjb21wb3NpdGUgc2ltcGx5IHNob3dzIHRoZSBMb2IgY2hlY2sgYm94LgotICoKLSAqIEBzZWUgQmFzaWNNYXBwaW5nCi0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtQcml2YXRlT3duZWQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Qcml2YXRlT3duZWRDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwgCi0JCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtQcml2YXRlT3duZWQsIEJvb2xlYW4+IGJ1aWxkUHJpdmF0ZU93bmVkSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkLlBSSVZBVEVfT1dORURfUFJPUEVSVFkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc1ByaXZhdGVPd25lZCgpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRQcml2YXRlT3duZWQodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlhZGRDaGVja0JveCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGVfcHJpdmF0ZU93bmVkTGFiZWwsCi0JCQlidWlsZFByaXZhdGVPd25lZEhvbGRlcigpLAotCQkJbnVsbAotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1JlYWRPbmx5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtSZWFkT25seUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDM4NDE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1JlYWRPbmx5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlYWRPbmx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgY29tcG9zaXRlIHNpbXBseSBzaG93cyB0aGUgUmVhZCBPbmx5IGNoZWNrIGJveC4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rUmVhZE9ubHkKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUmVhZE9ubHlDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rUmVhZE9ubHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5SZWFkT25seUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtSZWFkT25seUNvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsIAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rUmVhZE9ubHk+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJLy8gcmVhZC1vbmx5IGNoZWNrIGJveAotCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rUmVhZE9ubHlDb21wb3NpdGVfcmVhZE9ubHlMYWJlbCwKLQkJCWJ1aWxkU3BlY2lmaWVkUmVhZE9ubHlIb2xkZXIoKSwKLQkJCWJ1aWxkUmVhZE9ubHlTdHJpbmdIb2xkZXIoKSwKLQkJCW51bGwKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU3BlY2lmaWVkUmVhZE9ubHlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rUmVhZE9ubHksIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtSZWFkT25seS5TUEVDSUZJRURfUkVBRF9PTkxZX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRSZWFkT25seSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFJlYWRPbmx5U3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0UmVhZE9ubHlIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rUmVhZE9ubHlDb21wb3NpdGVfcmVhZE9ubHlXaXRoRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtSZWFkT25seUNvbXBvc2l0ZV9yZWFkT25seUxhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRSZWFkT25seUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtSZWFkT25seSwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua1JlYWRPbmx5LlNQRUNJRklFRF9SRUFEX09OTFlfUFJPUEVSVFksCi0JCQlFY2xpcHNlTGlua1JlYWRPbmx5LkRFRkFVTFRfUkVBRF9PTkxZX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2E2ZGM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgY29tcG9zaXRlIHNpbXBseSBzaG93cyBhIHRyaS1zdGF0ZSBjaGVjayBib3ggZm9yIHRoZSBSZWZyZXNoIE9ubHkgSWYgTmV3ZXIgb3B0aW9uLgotICogCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZwotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rQ2FjaGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9wdGlvbmFsQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlX3JlZnJlc2hPbmx5SWZOZXdlckxhYmVsLAotCQkJYnVpbGRSZWZyZXNoT25seUlmTmV3ZXJIb2xkZXIoKSwKLQkJCWJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VyU3RyaW5nSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLkNBQ0hJTkdfUkVGUkVTSF9PTkxZX0lGX05FV0VSCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFJlZnJlc2hPbmx5SWZOZXdlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfUkVGUkVTSF9PTkxZX0lGX05FV0VSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VyU3RyaW5nSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXJIb2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGVfcmVmcmVzaE9ubHlJZk5ld2VyRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGVfcmVmcmVzaE9ubHlJZk5ld2VyTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfUkVGUkVTSF9PTkxZX0lGX05FV0VSX1BST1BFUlRZLAotCQkJRWNsaXBzZUxpbmtDYWNoaW5nLkRFRkFVTFRfUkVGUkVTSF9PTkxZX0lGX05FV0VSX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDYzZTU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYU5hbWVkQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXJDbGFzc0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgTmFtZTogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ29udmVydGVyCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+Ci17Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlN0cnVjdENvbnZlcnRlckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJYWRkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsIAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckNvbXBvc2l0ZV9uYW1lVGV4dExhYmVsLCAKLQkJCWJ1aWxkTmFtZVRleHRIb2xkZXIoKSk7Ci0JCQotCQlhZGRDbGFzc0Nob29zZXIoY29udGFpbmVyKTsKLQkJCi0JCW5ldyBQYW5lRW5hYmxlcihidWlsZEJvb2xlYW5Ib2xkZXIoKSwgdGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lVGV4dEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIsIFN0cmluZz4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBKcGFOYW1lZENvbnRleHROb2RlLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkKLQlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IGFkZENsYXNzQ2hvb3NlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDbGFzc0Nob29zZXJQYW5lPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVydGVyQ2xhc3NDb252ZXJ0ZXIuQ09OVkVSVEVSX0NMQVNTX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb252ZXJ0ZXJDbGFzcygpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCQl9Ci0KLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRDb252ZXJ0ZXJDbGFzcyh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0Q29udmVydGVyQ2xhc3MoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckNvbXBvc2l0ZV9jbGFzc0xhYmVsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRDb252ZXJ0ZXJDbGFzcyhjbGFzc05hbWUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3VwZXJJbnRlcmZhY2VOYW1lKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5FQ0xJUFNFTElOS19TVFJVQ1RfQ09OVkVSVEVSX0NMQVNTX05BTUU7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGNoYXIgZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRCb29sZWFuSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZWViZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfM0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfM0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YjM4YTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklNYW55VG9PbmVNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjZlOTA0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlclBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFOYW1lZENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgTmFtZTogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ29udmVydGVyCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4KLXsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VHlwZUNvbnZlcnRlckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQotCQlhZGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwgCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyQ29tcG9zaXRlX25hbWVUZXh0TGFiZWwsIAotCQkJYnVpbGROYW1lVGV4dEhvbGRlcigpKTsKLQkJCi0JCWFkZERhdGFUeXBlQ2hvb3Nlcihjb250YWluZXIpOwotCQlhZGRPYmplY3RUeXBlQ2hvb3Nlcihjb250YWluZXIpOwotCQkKLQkJbmV3IFBhbmVFbmFibGVyKGJ1aWxkQm9vbGVhbkhvbGRlcigpLCB0aGlzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVUZXh0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIsIFN0cmluZz4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBKcGFOYW1lZENvbnRleHROb2RlLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkKLQlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBhZGREYXRhVHlwZUNob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5EQVRBX1RZUEVfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERhdGFUeXBlKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCX0KLQotCQkJCQkJdGhpcy5zdWJqZWN0LnNldERhdGFUeXBlKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREYXRhVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9kYXRhVHlwZUxhYmVsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXREYXRhVHlwZShjbGFzc05hbWUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBjaGFyIGdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBhZGRPYmplY3RUeXBlQ2hvb3NlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDbGFzc0Nob29zZXJQYW5lPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLk9CSkVDVF9UWVBFX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRPYmplY3RUeXBlKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCX0KLQotCQkJCQkJdGhpcy5zdWJqZWN0LnNldE9iamVjdFR5cGUodmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldE9iamVjdFR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJDb21wb3NpdGVfb2JqZWN0VHlwZUxhYmVsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRPYmplY3RUeXBlKGNsYXNzTmFtZSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGNoYXIgZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciB2YWx1ZSkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUgIT0gbnVsbCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZmI4N2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgbG9jYWxpemVkIHN0cmluZ3MgdXNlZCBieSB0aGUgbWFwcGluZyBwYW5lcy4KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAxLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfZnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV93ZWFrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX3NvZnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfc29mdF93ZWFrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX2hhcmRfd2VhazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9jYWNoZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9ub25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfYWR2YW5jZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9jYWNoaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfY29udmVydGVyczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX211bHRpdGVuYW5jeTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZV9zaXplOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX3NlbmRfb2JqZWN0X2NoYW5nZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGVfaW52YWxpZGF0ZV9jaGFuZ2VkX29iamVjdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGVfc2VuZF9uZXdfb2JqZWN0c193aXRoX2NoYW5nZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGVfbm9uZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZV9zaGFyZWRMYWJlbERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlX3NoYXJlZExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZV9hZHZhbmNlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGVfYWx3YXlzUmVmcmVzaERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlX2Fsd2F5c1JlZnJlc2hMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZV9yZWZyZXNoT25seUlmTmV3ZXJEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlX3JlZnJlc2hPbmx5SWZOZXdlckxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGVfZGlzYWJsZUhpdHNEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGVfZGlzYWJsZUhpdHNMYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGVfYXR0cmlidXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGVfb2JqZWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGVfZGVmZXJyZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZV9hdXRvOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV9jb252ZXJ0ZXJOYW1lTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRlckNvbXBvc2l0ZV9uYW1lVGV4dExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydGVyQ29tcG9zaXRlX2NsYXNzTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfY3VzdG9tQ29udmVydGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV9vYmplY3RUeXBlQ29udmVydGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV9zdHJ1Y3RDb252ZXJ0ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlX3R5cGVDb252ZXJ0ZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfbWF4Q29udmVydGVyc0Vycm9yTWVzc2FnZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0N1c3RvbWl6ZXJDb21wb3NpdGVfY2xhc3NMYWJlbDsKLQkJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHlwZVNlY3Rpb25fY29udmVydGVkOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9jaGVja19jYWNoZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2NoZWNrX2RhdGFiYXNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfYXNzdW1lX2V4aXN0ZW5jZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2Fzc3VtZV9ub25fZXhpc3RlbmNlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX2V4cGlyeVNlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfbm9FeHBpcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfdGltZVRvTGl2ZUV4cGlyeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV90aW1lVG9MaXZlRXhwaXJ5RXhwaXJlQWZ0ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfdGltZVRvTGl2ZUV4cGlyeU1pbGxpc2Vjb25kczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV9kYWlseUV4cGlyeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV90aW1lT2ZEYXlFeHBpcnlFeHBpcmVBdDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZV9pbm5lcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZV9vdXRlcjsJCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlX211dGFibGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGVfbXV0YWJsZUxhYmVsRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGVfdHJ1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGVfZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2RhdGFUeXBlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX29iamVjdFR5cGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfY29udmVyc2lvblZhbHVlRWRpdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfY29udmVyc2lvblZhbHVlc0RhdGFWYWx1ZUNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfY29udmVyc2lvblZhbHVlc09iamVjdFZhbHVlQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9kZWZhdWx0T2JqZWN0VmFsdWVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfY29udmVyc2lvblZhbHVlc0dyb3VwVGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfYWRkQ29udmVyc2lvblZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2VkaXRDb252ZXJzaW9uVmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfYWRkQ29udmVyc2lvblZhbHVlRGVzY3JpcHRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19lZGl0Q29udmVyc2lvblZhbHVlRGVzY3JpcHRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19hZGRDb252ZXJzaW9uVmFsdWVEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19lZGl0Q29udmVyc2lvblZhbHVlRGVzY3JpcHRpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfZGF0YVZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX29iamVjdFZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3RfZGF0YVZhbHVlTXVzdEJlU3BlY2lmaWVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3Rfb2JqZWN0VmFsdWVNdXN0QmVTcGVjaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdF9kYXRhVmFsdWVBbHJlYWR5RXhpc3RzOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlX3ByaXZhdGVPd25lZExhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rUmVhZE9ubHlDb21wb3NpdGVfcmVhZE9ubHlMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua1JlYWRPbmx5Q29tcG9zaXRlX3JlYWRPbmx5V2l0aERlZmF1bHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlX2RhdGFUeXBlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlX29iamVjdFR5cGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2dfY29udmVydGVyVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZ19hZGRDb252ZXJ0ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2dfYWRkQ29udmVydGVyRGVzY3JpcHRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZ19hZGRDb252ZXJ0ZXJEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0X25hbWVFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdF9uYW1lSXNSZXNlcnZlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0X25hbWVNdXN0QmVTcGVjaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdF90eXBlTXVzdEJlU3BlY2lmaWVkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlX3F1ZXJpZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc19ncm91cExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfbmFtZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfZGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5OYW1lTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV90YWJsZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfY29udGV4dFByb3BlcnR5TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9kaXNjcmltaW5hdG9yVHlwZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfbGVuZ3RoTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9jb2x1bW5EZWZpbml0aW9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9wcmltYXJ5S2V5V2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9wcmltYXJ5S2V5OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0NvbXBvc2l0ZV9jb2xsYXBzaWJsZVNlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3lfb3ZlcnJpZGVEZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua011bHRpdGVuYW5jeUNvbXBvc2l0ZV9zdHJhdGVneTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua011bHRpdGVuYW5jeUNvbXBvc2l0ZV9zaW5nbGVfdGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3lDb21wb3NpdGVfdGFibGVfcGVyX3RlbmFudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua011bHRpdGVuYW5jeUNvbXBvc2l0ZV92cGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3lDb21wb3NpdGVfaW5jbHVkZUNyaXRlcmlhOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Q29tcG9zaXRlX2luY2x1ZGVDcml0ZXJpYVdpdGhEZWZhdWx0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtQXR0cmlidXRlVHlwZUNvbXBvc2l0ZV9hdHRyaWJ1dGVUeXBlOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcygiZWNsaXBzZWxpbmtfdWlfZGV0YWlscyIsIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDkxNGVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKgotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklNYW55VG9PbmVNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGRmODRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0aWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZVRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011dGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGVtcG9yYWxUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ29sdW1uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBNdXRhYmxlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFZlcnNpb25NYXBwaW5nCi0gKiBAc2VlIENvbHVtbkNvbXBvc2l0ZQotICogQHNlZSBUZW1wb3JhbFR5cGVDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdDb21wb3NpdGU8VCBleHRlbmRzIFZlcnNpb25NYXBwaW5nPgotCWV4dGVuZHMgQWJzdHJhY3RWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VmVyc2lvbk1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JVmVyc2lvbk1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWZXJzaW9uU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZSh0aGlzLCBidWlsZE11dGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVR5cGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJKChHcmlkTGF5b3V0KSBjb250YWluZXIuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnMgPSAyOwotCi0JCS8vIE5vIGNvbnZlcnRlcgotCQlCdXR0b24gbm9Db252ZXJ0ZXJCdXR0b24gPSBhZGRSYWRpb0J1dHRvbigKLQkJCWNvbnRhaW5lciwgCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl9kZWZhdWx0LCAKLQkJCWJ1aWxkQ29udmVydGVyQm9vbGVhbkhvbGRlcihudWxsKSwgCi0JCQludWxsKTsKLQkJKChHcmlkRGF0YSkgbm9Db252ZXJ0ZXJCdXR0b24uZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQkJCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlciA9IGJ1aWxkQ29udmVydGVySG9sZGVyKCk7Ci0JCS8vIFRlbXBvcmFsCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29udGFpbmVyLCAKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX3RlbXBvcmFsLCAKLQkJCWJ1aWxkQ29udmVydGVyQm9vbGVhbkhvbGRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpLCAKLQkJCW51bGwpOwotCQlyZWdpc3RlclN1YlBhbmUobmV3IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZShidWlsZFRlbXBvcmFsQ29udmVydGVySG9sZGVyKGNvbnZlcnRlckhvbGRlciksIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKSk7Ci0KLQkJLy8gRWNsaXBzZUxpbmsgQ29udmVydGVyCi0JCUJ1dHRvbiBlbENvbnZlcnRlckJ1dHRvbiA9IGFkZFJhZGlvQnV0dG9uKAotCQkJY29udGFpbmVyLCAKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fY29udmVydGVkLCAKLQkJCWJ1aWxkQ29udmVydGVyQm9vbGVhbkhvbGRlcihFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpLCAKLQkJCW51bGwpOwotCQkoKEdyaWREYXRhKSBlbENvbnZlcnRlckJ1dHRvbi5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQlQYW5lPEVjbGlwc2VMaW5rQ29udmVydD4gY29udmVydENvbXBvc2l0ZSA9IGJ1aWxkQ29udmVydENvbXBvc2l0ZShidWlsZEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyKGNvbnZlcnRlckhvbGRlciksIGNvbnRhaW5lcik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gKEdyaWREYXRhKSBjb252ZXJ0Q29tcG9zaXRlLmdldENvbnRyb2woKS5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQlyZWdpc3RlclN1YlBhbmUoY29udmVydENvbXBvc2l0ZSk7Ci0JfQotCQotCXByb3RlY3RlZCBQYW5lPEVjbGlwc2VMaW5rQ29udmVydD4gYnVpbGRDb252ZXJ0Q29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnQ+IGNvbnZlcnRIb2xkZXIsIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUoY29udmVydEhvbGRlciwgY29udGFpbmVyLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCX0KLQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnQ+IGJ1aWxkRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyLCBFY2xpcHNlTGlua0NvbnZlcnQ+KGNvbnZlcnRlckhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJ0IHRyYW5zZm9ybV8oQ29udmVydGVyIGNvbnZlcnRlcikgewotCQkJCXJldHVybiAoY29udmVydGVyICE9IG51bGwgJiYgY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpID8gKEVjbGlwc2VMaW5rQ29udmVydCkgY29udmVydGVyIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIENvbnZlcnRlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb252ZXJ0ZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb252ZXJ0ZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxCYXNlVGVtcG9yYWxDb252ZXJ0ZXI+IGJ1aWxkVGVtcG9yYWxDb252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyLCBCYXNlVGVtcG9yYWxDb252ZXJ0ZXI+KGNvbnZlcnRlckhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQmFzZVRlbXBvcmFsQ29udmVydGVyIHRyYW5zZm9ybV8oQ29udmVydGVyIGNvbnZlcnRlcikgewotCQkJCXJldHVybiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyA/IChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIGNvbnZlcnRlciA6IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtNdXRhYmxlPiBidWlsZE11dGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEVjbGlwc2VMaW5rTXV0YWJsZT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua011dGFibGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgdGhpcy5zdWJqZWN0KS5nZXRNdXRhYmxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfY29udmVydGVycwotCQkpOwotCQlpbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oY29udGFpbmVyLCB0aGlzLmJ1aWxkQ29udmVydGVySG9sZGVyVmFsdWVNb2RlbCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZSh0aGlzLCBjb252ZXJ0ZXJIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXJWYWx1ZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxWZXJzaW9uTWFwcGluZywgRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgdGhpcy5zdWJqZWN0KS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNjYxNDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3QuU1dUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkNvbWJvUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5UcmlTdGF0ZUNoZWNrQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5TmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlUYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LlJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLkNvbHVtbkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5EYXRhYmFzZU9iamVjdENvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiB7Ci0KLQlwdWJsaWMgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCi0JCS8vIE5hbWUgd2lkZ2V0cwotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJCWNvbnRhaW5lciwKLQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLlRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfbmFtZUxhYmVsLAotCQkJCWFkZE5hbWVDb21ibyhjb250YWluZXIpLAotCQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX05BTUUpOwotCi0JCS8vIFRhYmxlIHdpZGdldHMKLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX3RhYmxlTGFiZWwsCi0JCQkJYWRkVGFibGVDb21ibyhjb250YWluZXIpLAotCQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX1RBQkxFKTsKLQotCQkvLyBDb250ZXh0IHByb3BlcnR5IHdpZGdldHMKLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2NvbnRleHRQcm9wZXJ0eUxhYmVsLAotCQkJCWFkZENvbnRleHRQcm9wZXJ0eUNvbWJvKGNvbnRhaW5lciksCi0JCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5fQ09OVEVYVF9QUk9QRVJUWSk7Ci0KLQkJLy8gRGlzY3JpbWluYXRvciBUeXBlIHdpZGdldHMKLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JUeXBlTGFiZWwsCi0JCQkJYWRkRGlzY3JpbWluYXRvclR5cGVDb21ibyhjb250YWluZXIpLAotCQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX0RJU0NSSU1JTkFUT1JfVFlQRQotCQkpOwotCQkvLyBMZW5ndGggd2lkZ2V0cwotCQlhZGRMZW5ndGhDb21ibyhjb250YWluZXIpOwotCi0JCS8vIENvbHVtbiBEZWZpbml0aW9uIHdpZGdldHMKLQkJYWRkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLlRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfY29sdW1uRGVmaW5pdGlvbkxhYmVsLAotCQkJYnVpbGRDb2x1bW5EZWZpbml0aW9uSG9sZGVyKGdldFN1YmplY3RIb2xkZXIoKSkKLQkJKTsKLQotCQkvLyBQcmltYXJ5IGtleSB0cmktc3RhdGUgY2hlY2sgYm94Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggcGtDaGVja0JveCA9IGFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCA0KSwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9wcmltYXJ5S2V5LAotCQkJYnVpbGRQcmltYXJ5S2V5SG9sZGVyKCksCi0JCQlidWlsZFByaW1hcnlLZXlTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX1BSSU1BUllfS0VZKTsKLQotCQlTV1RUb29scy5jb250cm9sVmlzaWJsZVN0YXRlKG5ldyBFY2xpcHNlTGluazJfNFByb2plY3RGbGFnTW9kZWw8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSksIHBrQ2hlY2tCb3guZ2V0Q2hlY2tCb3goKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2x1bW5Db21ibzxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGFkZE5hbWVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDb2x1bW5Db21ibzxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChSZWFkT25seU5hbWVkQ29sdW1uLkRFRkFVTFRfTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUmVhZE9ubHlOYW1lZENvbHVtbi5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUmVhZE9ubHlUYWJsZUNvbHVtbi5ERUZBVUxUX1RBQkxFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChSZWFkT25seVRhYmxlQ29sdW1uLlNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCQlpZiAocHJvcGVydHlOYW1lID09IFJlYWRPbmx5VGFibGVDb2x1bW4uREVGQVVMVF9UQUJMRV9QUk9QRVJUWSB8fAotCQkJCSAgICBwcm9wZXJ0eU5hbWUgPT0gUmVhZE9ubHlUYWJsZUNvbHVtbi5TUEVDSUZJRURfVEFCTEVfUFJPUEVSVFkpIHsKLQkJCQkJdGhpcy5kb1BvcHVsYXRlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdE5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQkoKFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMpIHRoaXMuZ2V0U3ViamVjdCgpKS5zZXRTcGVjaWZpZWROYW1lKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVGFibGUgZ2V0RGJUYWJsZV8oKSB7Ci0JCQkJUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGNvbHVtbiA9IHRoaXMuZ2V0U3ViamVjdCgpOwotCQkJCXJldHVybiAoY29sdW1uID09IG51bGwpID8gbnVsbCA6IGNvbHVtbi5nZXREYlRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZE5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkTnVsbERlZmF1bHRWYWx1ZUVudHJ5KCkgewotCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuTm9uZVNlbGVjdGVkKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZS5uYW1lQ29tYm8iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQYW5lPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gYWRkVGFibGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBEYXRhYmFzZU9iamVjdENvbWJvPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUmVhZE9ubHlUYWJsZUNvbHVtbi5ERUZBVUxUX1RBQkxFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChSZWFkT25seVRhYmxlQ29sdW1uLlNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERlZmF1bHRUYWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCSgoVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMykgdGhpcy5nZXRTdWJqZWN0KCkpLnNldFNwZWNpZmllZFRhYmxlKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRUYWJsZSgpOwotCQkJfQotCi0JCQkvLyBUT0RPIHdlIG5lZWQgdG8gbGlzdGVuIGZvciB0aGlzIGxpc3QgdG8gY2hhbmdlLi4uCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldFZhbHVlc18oKSB7Ci0JCQkJUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGNvbHVtbiA9IHRoaXMuZ2V0U3ViamVjdCgpOwotCQkJCXJldHVybiAoY29sdW1uICE9IG51bGwpID8gY29sdW1uLmdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz4gaW5zdGFuY2UoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkTnVsbERlZmF1bHRWYWx1ZUVudHJ5KCkgewotCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuTm9uZVNlbGVjdGVkKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZS50YWJsZUNvbWJvIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUGFuZTxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGFkZENvbnRleHRQcm9wZXJ0eUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IENvbWJvUGFuZTxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5ERUZBVUxUX0NPTlRFWFRfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5TUEVDSUZJRURfQ09OVEVYVF9QUk9QRVJUWV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERlZmF1bHRDb250ZXh0UHJvcGVydHkoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQkoKFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMpIHRoaXMuZ2V0U3ViamVjdCgpKS5zZXRTcGVjaWZpZWRDb250ZXh0UHJvcGVydHkodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZENvbnRleHRQcm9wZXJ0eSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldFZhbHVlcygpIHsKLQkJCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS48U3RyaW5nPiBpbnN0YW5jZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGROdWxsRGVmYXVsdFZhbHVlRW50cnkoKSB7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCQkJSnB0Q29tbW9uVWlNZXNzYWdlcy5EZWZhdWx0V2l0aE9uZVBhcmFtLAotCQkJCQkJSnB0Q29tbW9uVWlNZXNzYWdlcy5Ob25lU2VsZWN0ZWQpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlLmNvbnRleHRQcm9wZXJ0eUNvbWJvIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMsIERpc2NyaW1pbmF0b3JUeXBlPiBhZGREaXNjcmltaW5hdG9yVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLCBEaXNjcmltaW5hdG9yVHlwZT4oCi0JCQl0aGlzLAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJY29udGFpbmVyKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFJlYWRPbmx5TmFtZWREaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChSZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5TUEVDSUZJRURfRElTQ1JJTUlOQVRPUl9UWVBFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclR5cGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBEaXNjcmltaW5hdG9yVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclR5cGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKERpc2NyaW1pbmF0b3JUeXBlIHZhbHVlKSB7Ci0JCQkJc3dpdGNoICh2YWx1ZSkgewotCQkJCQljYXNlIENIQVIgOgotCQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkRpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfY2hhcjsKLQkJCQkJY2FzZSBJTlRFR0VSIDoKLQkJCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5EaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2ludGVnZXI7Ci0JCQkJCWNhc2UgU1RSSU5HIDoKLQkJCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5EaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX3N0cmluZzsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgbnVsbERpc3BsYXlTdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIEpwdENvbW1vblVpTWVzc2FnZXMuTm9uZVNlbGVjdGVkOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoRGlzY3JpbWluYXRvclR5cGUgdmFsdWUpIHsKLQkJCQkoKFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMpIHRoaXMuZ2V0U3ViamVjdCgpKS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExlbmd0aENvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEludGVnZXJDb21ibzxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfbGVuZ3RoOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscElkKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9MRU5HVEg7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIFJlYWRPbmx5TmFtZWREaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTEVOR1RIX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMywgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBSZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5TUEVDSUZJRURfTEVOR1RIX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkTGVuZ3RoKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCSgoVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMykgdGhpcy5zdWJqZWN0KS5zZXRTcGVjaWZpZWRMZW5ndGgodmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbHVtbkRlZmluaXRpb25Ib2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMsIFN0cmluZz4oZGlzY3JpbWluYXRvckNvbHVtbkhvbGRlciwgUmVhZE9ubHlOYW1lZENvbHVtbi5DT0xVTU5fREVGSU5JVElPTl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQkoKFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMpIHRoaXMuc3ViamVjdCkuc2V0Q29sdW1uRGVmaW5pdGlvbih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFByaW1hcnlLZXlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJKChUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zKSB0aGlzLnN1YmplY3QpLnNldFNwZWNpZmllZFByaW1hcnlLZXkodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUHJpbWFyeUtleVN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFByaW1hcnlLZXlIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLlRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfcHJpbWFyeUtleVdpdGhEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX3ByaW1hcnlLZXk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFByaW1hcnlLZXlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMywgQm9vbGVhbj4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJCVJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5TUEVDSUZJRURfUFJJTUFSWV9LRVlfUFJPUEVSVFksCi0JCQkJUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLkRFRkFVTFRfUFJJTUFSWV9LRVlfUFJPUEVSVFkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFByaW1hcnlLZXkoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc1ByaW1hcnlLZXkoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YWIwY2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuQ29udHJvbFN3aXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWJzdHJhY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lLkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LlJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotCi0gKgotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0NvbXBvc2l0ZTxUIGV4dGVuZHMgSnBhTm9kZT4gZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JLyoqCi0JICogVGhlIGVkaXRvciB1c2VkIHRvIHBlcmZvcm0gdGhlIGNvbW1vbiBiZWhhdmlvcnMgZGVmaW5lZCBpbiB0aGUgbGlzdCBwYW5lLgotCSAqLwotCVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zRWRpdG9yPFQ+IHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zRWRpdG9yOwotCi0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZTxUPiBsaXN0UGFuZTsKLQlwcml2YXRlIFBhbmU8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uUGFuZTsKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyOwotCi0JcHVibGljIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zRWRpdG9yPFQ+IHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zRWRpdG9yKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQkJdGhpcy50ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0VkaXRvciA9IHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zRWRpdG9yOwotCQlpbml0aWFsaXplTGF5b3V0MigpOwotCX0KLQotCXB1YmxpYyBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0NvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNFZGl0b3I8VD4gdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNFZGl0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cykgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyk7Ci0JCXRoaXMudGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNFZGl0b3IgPSB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0VkaXRvcjsKLQkJaW5pdGlhbGl6ZUxheW91dDIoKTsKLQl9Ci0KLQlwdWJsaWMgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zRWRpdG9yPFQ+IHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zRWRpdG9yKSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy50ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0VkaXRvciA9IHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zRWRpdG9yOwotCQlpbml0aWFsaXplTGF5b3V0MigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJdGhpcy50ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyID0gYnVpbGRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gYnVpbGRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCS8vc2VlIGludGlhaWxpemVMYXlvdXQyKCkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUxheW91dDIoKSB7Ci0JCXRoaXMubGlzdFBhbmUgPSBuZXcgQWRkUmVtb3ZlTGlzdFBhbmU8VD4oCi0JCQl0aGlzLAotCQkJZ2V0Q29udHJvbCgpLAotCQkJYnVpbGRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0FkYXB0ZXIoKSwKLQkJCWJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNMaXN0TW9kZWwoKSwKLQkJCXRoaXMudGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkhvbGRlciwKLQkJCWJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNMaXN0TGFiZWxQcm92aWRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5NVUxUSVRFTkFOQ1lfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OUywKLQkJCWZhbHNlCi0JCSk7Ci0KLQkJLy8gUHJvcGVydHkgcGFuZQotCQlQYWdlQm9vayBwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhnZXRDb250cm9sKCksIFNXVC5OVUxMKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy9UZW5hbnQgRGlzY3JpbWluYXRvciBDb2x1bW4gcHJvcGVydHkgcGFuZQotCQl0aGlzLnRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5QYW5lID0gdGhpcy5idWlsZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGUocGFnZUJvb2spOwotCi0KLQkJaW5zdGFsbFBhbmVTd2l0Y2hlcihwYWdlQm9vayk7Ci0JfQotCi0JcHJvdGVjdGVkIFBhbmU8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBidWlsZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGUoUGFnZUJvb2sgcGFnZUJvb2spIHsKLQkJcmV0dXJuIG5ldyBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCXRoaXMudGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkhvbGRlciwKLQkJCXBhZ2VCb29rCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxQYW5lU3dpdGNoZXIoUGFnZUJvb2sgcGFnZUJvb2spIHsKLQkJbmV3IENvbnRyb2xTd2l0Y2hlcih0aGlzLnRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Ib2xkZXIsIHRoaXMudGVuYW50RGlzY3JpbWluYXRvckNvbHVtblBhbmUuZ2V0Q29udHJvbCgpLCBwYWdlQm9vayk7Ci0JfQotCi0JU3RyaW5nIGJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkxhYmVsKFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKSB7Ci0JCWlmICh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uLmlzVmlydHVhbCgpIHx8IHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLlRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfZGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5OYW1lTGFiZWwsCi0JCQkJdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbi5nZXROYW1lKCkKLQkJCSk7Ci0JCX0KLQkJcmV0dXJuIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4uZ2V0TmFtZSgpOwotCX0KLQotCXByaXZhdGUgQWRhcHRlciBidWlsZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBYnN0cmFjdEFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQ29tcG9zaXRlLnRoaXMudGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNFZGl0b3IuYWRkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihnZXRTdWJqZWN0KCkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGhhc09wdGlvbmFsQnV0dG9uKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNDb21wb3NpdGUudGhpcy50ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0VkaXRvci5yZW1vdmVUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyhnZXRTdWJqZWN0KCksIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZEluZGljZXMoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPihidWlsZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zTGlzdEhvbGRlcigpLAotCQkJUmVhZE9ubHlOYW1lZENvbHVtbi5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSwKLQkJCVJlYWRPbmx5TmFtZWRDb2x1bW4uREVGQVVMVF9OQU1FX1BST1BFUlRZKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gYnVpbGRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0xpc3RIb2xkZXIoKSB7Ci0JCUxpc3Q8TGlzdFZhbHVlTW9kZWw8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPj4oKTsKLQkJbGlzdC5hZGQoYnVpbGREZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkxpc3RIb2xkZXIoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4sIFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4obGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGJ1aWxkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFQsIFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4oZ2V0U3ViamVjdEhvbGRlcigpLCB0aGlzLnRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zRWRpdG9yLmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JzTGlzdFByb3BlcnR5TmFtZSgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBnZXRMaXN0SXRlcmFibGUoKSB7Ci0JCQkJcmV0dXJuIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQ29tcG9zaXRlLnRoaXMudGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNFZGl0b3IuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnModGhpcy5zdWJqZWN0KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0NvbXBvc2l0ZS50aGlzLnRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zRWRpdG9yLmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSh0aGlzLnN1YmplY3QpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBidWlsZERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxULCBSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+KGdldFN1YmplY3RIb2xkZXIoKSwgdGhpcy50ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0VkaXRvci5nZXREZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvcnNMaXN0UHJvcGVydHlOYW1lKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJCQlyZXR1cm4gVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNDb21wb3NpdGUudGhpcy50ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0VkaXRvci5nZXREZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnModGhpcy5zdWJqZWN0KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0NvbXBvc2l0ZS50aGlzLnRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zRWRpdG9yLmdldERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUodGhpcy5zdWJqZWN0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNMaXN0TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gYnVpbGRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uTGFiZWwoKFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMykgZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zdGFsbExpc3RQYW5lRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gcGFuZUVuYWJsZXJIb2xkZXIpIHsKLQkJbmV3IFBhbmVFbmFibGVyKHBhbmVFbmFibGVySG9sZGVyLCB0aGlzLmxpc3RQYW5lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCQlzdXBlci5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOwotCQl0aGlzLmxpc3RQYW5lLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKSB7Ci0JCXRoaXMubGlzdFBhbmUuc2V0U2VsZWN0ZWRJdGVtKHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIFRoZSBlZGl0b3IgaXMgdXNlZCB0byBjb21wbGV0ZSB0aGUgYmVoYXZpb3Igb2YgdGhpcyBwYW5lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zRWRpdG9yPFQ+IHsKLQotCQkvKioKLQkJICogQWRkIGEgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uIHRvIHRoZSBnaXZlbiBzdWJqZWN0Ci0JCSAqLwotCQl2b2lkIGFkZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oVCBzdWJqZWN0KTsKLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIHN1YmplY3QgaGFzIHNwZWNpZmllZCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zCi0JCSAqLwotCQlib29sZWFuIGhhc1NwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKFQgc3ViamVjdCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHRlbmFudCBkaXNjcmltaW5hdG9yIGZyb20gdGhlIGdpdmVuIHN1YmplY3QKLQkJICovCi0JCUxpc3RJdGVyYWJsZTxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKFQgc3ViamVjdCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHNwZWNpZmllZCBqb2luIGNvbHVtbnMgb24gdGhlIGdpdmVuIHN1YmplY3QKLQkJICovCi0JCWludCBnZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoVCBzdWJqZWN0KTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBkZWZhdWx0IHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMgZnJvbSB0aGUgZ2l2ZW4gc3ViamVjdCBvciBudWxsLgotCQkgKi8KLQkJTGlzdEl0ZXJhYmxlPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZ2V0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKFQgc3ViamVjdCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGRlZmF1bHQgdGVuYW50IGRpc2NyaW1pbmF0b3Igb24gdGhlIGdpdmVuIHN1YmplY3QKLQkJICovCi0JCWludCBnZXREZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKFQgc3ViamVjdCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMgbGlzdAotCQkgKi8KLQkJU3RyaW5nIGdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JzTGlzdFByb3BlcnR5TmFtZSgpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIGRlZmF1bHQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucyBsaXN0Ci0JCSAqLwotCQlTdHJpbmcgZ2V0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JzTGlzdFByb3BlcnR5TmFtZSgpOwotCi0JCS8qKgotCQkgKiBSZW1vdmUgdGhlIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMgYXQgdGhlIHNwZWNpZmllZCBpbmRpY2VzIGZyb20gdGhlIHN1YmplY3QKLQkJICovCi0JCXZvaWQgcmVtb3ZlVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoVCBzdWJqZWN0LCBpbnRbXSBzZWxlY3RlZEluZGljZXMpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgTG9jYWxJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4gZXh0ZW5kcyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4gewotCi0JCXB1YmxpYyBMb2NhbEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLCBTdHJpbmcuLi4gcHJvcGVydHlOYW1lcykgewotCQkJc3VwZXIobGlzdEhvbGRlciwgcHJvcGVydHlOYW1lcyk7Ci0JCX0KLQotCQlwdWJsaWMgTG9jYWxJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gY29sbGVjdGlvbkhvbGRlciwgU3RyaW5nW10gcHJvcGVydHlOYW1lcykgewotCQkJc3VwZXIoY29sbGVjdGlvbkhvbGRlciwgcHJvcGVydHlOYW1lcyk7Ci0JCX0KLQotCQkvKioKLQkJICogYnVnIDMxMDcyMAotCQkgKiBPdmVycmlkZSB0byBqdXN0IGZpcmUgYW4gaXRlbVJlcGxhY2VkIGV2ZW50IGluc3RlYWQgb2YgYSBsaXN0Q2hhbmdlZCBldmVudC4KLQkJICogQW4gYXNwZWN0IG9mIHRoZSBpdGVtIGFzIGNoYW5nZWQsIHNvIG5vIHJlYXNvbiB0byBzYXkgdGhhdCB0aGUgZW50aXJlIGxpc3QgaGFzIGNoYW5nZWQuCi0JCSAqIEFkZGVkIGEgTG9jYWxDaGFuZ2VTdXBwb3J0IHNvIHRoYXQgSSBjYW4gZmlyZSBhIExpc3RSZXBsYWNlZEV2ZW50IGZvciBhbiBvbGQgbGlzdAotCQkgKiBhbmQgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgc2FtZSBpdGVtLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGl0ZW1Bc3BlY3RDaGFuZ2VkKEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCQlPYmplY3QgaXRlbSA9IGV2ZW50LmdldFNvdXJjZSgpOwotCQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zUmVwbGFjZWQoCi0JCQkJbmV3IExpc3RSZXBsYWNlRXZlbnQodGhpcywgTElTVF9WQUxVRVMsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKHRoaXMubGlzdEhvbGRlciwgaXRlbSksIGl0ZW0sIGl0ZW0pKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCQlyZXR1cm4gbmV3IExvY2FsQ2hhbmdlU3VwcG9ydCh0aGlzLCBMaXN0Q2hhbmdlTGlzdGVuZXIuY2xhc3MsIExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKTsKLQkJfQotCi0JCXByaXZhdGUgY2xhc3MgTG9jYWxDaGFuZ2VTdXBwb3J0IGV4dGVuZHMgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCB7Ci0JCQlwdWJsaWMgTG9jYWxDaGFuZ2VTdXBwb3J0KE1vZGVsIHNvdXJjZSwgQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZhbGlkTGlzdGVuZXJDbGFzcywgU3RyaW5nIHZhbGlkQXNwZWN0TmFtZSkgewotCQkJCXN1cGVyKHNvdXJjZSwgdmFsaWRMaXN0ZW5lckNsYXNzLCB2YWxpZEFzcGVjdE5hbWUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCQkJaWYgKGV2ZW50LmdldEl0ZW1zU2l6ZSgpICE9IDApIHsKLQkJCQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZF8oZXZlbnQpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0Fic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNDE0YTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtFbWJlZGRhYmxlQWR2YW5jZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVtYmVkZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcGFuZSBkb2VzIG5vdCBoYXZlIGFueSB3aWRnZXRzLgotICoKLSAqIEBzZWUgRW1iZWRkYWJsZQotICogQHNlZSBKYXZhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKiBAc2VlIEVtYmVkZGFibGVVaVByb3ZpZGVyCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGFibGVDb21wb3NpdGU8SmF2YUVtYmVkZGFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW1iZWRkYWJsZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhRW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVBZHZhbmNlZENvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfY29udmVydGVycwotCQkpOwotCQlpbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oY29udGFpbmVyLCB0aGlzLmJ1aWxkQ29udmVydGVySG9sZGVyVmFsdWVNb2RlbCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUodGhpcywgY29udmVydGVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPiBidWlsZENvbnZlcnRlckhvbGRlclZhbHVlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFbWJlZGRhYmxlLCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUpIHRoaXMuc3ViamVjdCkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCQl9CQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQWR2YW5jZWRDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRWNsaXBzZUxpbmtFbWJlZGRhYmxlQWR2YW5jZWRDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbnRpdHkyX3hDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0Fic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW50aXR5Ml94Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNWI3MDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbnRpdHkyX3hDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkdlbmVyYXRvckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5FbnRpdHlOYW1lQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5JZENsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5FbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuR2VuZXJhdGlvbjJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5RdWVyaWVzMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgcGFuZSB1c2VkIGZvciBhbiBFY2xpcHNlTGluayAyLnggSmF2YSBlbnRpdHkuCi0gKgotICogQHNlZSBKYXZhRWNsaXBzZUxpbmtFbnRpdHkKLSAqIEBzZWUgRWNsaXBzZWxpbmtKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW50aXR5Ml94Q29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZTxKYXZhRW50aXR5PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtKYXZhRW50aXR5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SmF2YUVudGl0eTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFFY2xpcHNlTGlua0VudGl0eTJfeENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVudGl0eVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFibGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVudGl0eU5hbWVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsJCi0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVyKCksIGNvbnRhaW5lcik7CQotCQluZXcgSWRDbGFzc0NvbXBvc2l0ZSh0aGlzLCBidWlsZElkQ2xhc3NSZWZlcmVuY2VIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFbnRpdHksIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50VHlwZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBdHRyaWJ1dGVPdmVycmlkZXNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVudGl0eTJfME92ZXJyaWRlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmF0b3JzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhdG9yQ29udGFpbmVyPiBnZW5lcmF0b3JDb250YWluZXJIb2xkZXIpIHsKLQkJbmV3IEdlbmVyYXRpb24yXzBDb21wb3NpdGUodGhpcywgZ2VuZXJhdG9yQ29udGFpbmVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDYWNoaW5nU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4gY2FjaGluZ0hvbGRlcikgewotCQluZXcgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZSh0aGlzLCBjYWNoaW5nSG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVRdWVyaWVzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnlDb250YWluZXI+IHF1ZXJ5Q29udGFpbmVySG9sZGVyKSB7Ci0JCW5ldyBRdWVyaWVzMl8wQ29tcG9zaXRlKHRoaXMsIHF1ZXJ5Q29udGFpbmVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0Fic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9BYnN0cmFjdEphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2M2YmIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0Fic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rRW50aXR5QWR2YW5jZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFJbmhlcml0YW5jZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgcGFuZSB1c2VkIGZvciBhbiBFY2xpcHNlTGluayBKYXZhIGVudGl0eS4KLSAqCi0gKiBAc2VlIEphdmFFY2xpcHNlTGlua0VudGl0eQotICogQHNlZSBFY2xpcHNlbGlua0pwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGU8VCBleHRlbmRzIEphdmFFbnRpdHk+Ci0JZXh0ZW5kcyBBYnN0cmFjdEVudGl0eUNvbXBvc2l0ZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtKYXZhRW50aXR5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SmF2YUVudGl0eTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVFbnRpdHlDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplQ2FjaGluZ0NvbGxhcHNpYmxlU2VjdGlvblBhbmUoY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplUXVlcmllc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVJbmhlcml0YW5jZUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVBdHRyaWJ1dGVPdmVycmlkZXNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplR2VuZXJhdG9yc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNlY29uZGFyeVRhYmxlc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVBZHZhbmNlZENvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ2FjaGluZ0NvbGxhcHNpYmxlU2VjdGlvblBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9jYWNoaW5nKTsKLQkJaW5pdGlhbGl6ZUNhY2hpbmdTZWN0aW9uKGNvbnRhaW5lciwgYnVpbGRDYWNoaW5nSG9sZGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ2FjaGluZ1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua0NhY2hpbmc+IGNhY2hpbmdIb2xkZXIpIHsKLQkJbmV3IEphdmFFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUodGhpcywgY2FjaGluZ0hvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YUVudGl0eSwgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4gYnVpbGRDYWNoaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRW50aXR5LCBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NhY2hpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSB0aGlzLnN1YmplY3QpLmdldENhY2hpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9jb252ZXJ0ZXJzKTsKLQkJdGhpcy5pbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oY29udGFpbmVyLCBidWlsZENvbnZlcnRlckhvbGRlclZhbHVlTW9kZWwoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJ0ZXJzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZSh0aGlzLCBjb252ZXJ0ZXJIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXJWYWx1ZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRW50aXR5LCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgdGhpcy5zdWJqZWN0KS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJCX0JCi0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNlY29uZGFyeVRhYmxlc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSmF2YVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVJbmhlcml0YW5jZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSmF2YUluaGVyaXRhbmNlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUFkdmFuY2VkQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rRW50aXR5QWR2YW5jZWRDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9BYnN0cmFjdEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0Fic3RyYWN0SmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGU0NTI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0Fic3RyYWN0SmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NBZHZhbmNlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEphdmFNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgcGFuZSB1c2VkIGZvciBhbiBFY2xpcHNlTGluayBKYXZhIE1hcHBlZCBTdXBlcmNsYXNzLgotICoKLSAqIEBzZWUgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzCi0gKiBAc2VlIEVjbGlwc2VsaW5rSnBhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0SmF2YU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUKLSAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YU1hcHBlZFN1cGVyY2xhc3M+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZU1hcHBlZFN1cGVyY2xhc3NDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsJCQotCQl0aGlzLmluaXRpYWxpemVDYWNoaW5nQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZVF1ZXJpZXNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplQ29udmVydGVyc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVBZHZhbmNlZENvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDYWNoaW5nQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJCWNvbnRhaW5lciwKLQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfY2FjaGluZyk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNhY2hpbmdTZWN0aW9uKGNvbnRhaW5lciwgYnVpbGRDYWNoaW5nSG9sZGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ2FjaGluZ1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua0NhY2hpbmc+IGNhY2hpbmdIb2xkZXIpIHsKLQkJbmV3IEphdmFFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUodGhpcywgY2FjaGluZ0hvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YU1hcHBlZFN1cGVyY2xhc3MsIEphdmFFY2xpcHNlTGlua0NhY2hpbmc+IGJ1aWxkQ2FjaGluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YU1hcHBlZFN1cGVyY2xhc3MsIEphdmFFY2xpcHNlTGlua0NhY2hpbmc+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSB0aGlzLnN1YmplY3QpLmdldENhY2hpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9jb252ZXJ0ZXJzKTsKLQkJdGhpcy5pbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oY29udGFpbmVyLCBidWlsZENvbnZlcnRlckhvbGRlclZhbHVlTW9kZWwoKSk7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXJWYWx1ZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhTWFwcGVkU3VwZXJjbGFzcywgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSB0aGlzLnN1YmplY3QpLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQkJfQkKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUodGhpcywgY29udmVydGVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBZHZhbmNlZENvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NBZHZhbmNlZENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9EZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGI4ZGRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YU9uZVRvTWFueU1hcHBpbmc+Ci0JaW1wbGVtZW50cyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YU9uZVRvTWFueU1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFPbmVUb01hbnlNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0RWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhnZXREZWZhdWx0S2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODk4NThjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0T25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdE9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFPbmVUb09uZU1hcHBpbmc+Ci0JaW1wbGVtZW50cyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YU9uZVRvT25lTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFPbmVUb09uZU1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0RWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRGVmYXVsdEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0RGVmYXVsdEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9EZWZhdWx0SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTRiMjYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+Ci0JaW1wbGVtZW50cyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJbmV3IERlZmF1bHRKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5WQVJJQUJMRV9PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9CQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwdEpwYVVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuSlBBX0NPTlRFTlQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9FY2xpcHNlTGluazFfMkphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRWNsaXBzZUxpbmsxXzJKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYxMWQ3Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9FY2xpcHNlTGluazFfMkphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuQWJzdHJhY3RKYXZhUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRGVmYXVsdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5EZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFCYXNpY01hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nVURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRW50aXR5VWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFJZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLk51bGxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMV8ySmF2YVJlc291cmNlVWlEZWZpbml0aW9uIGV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VVaURlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGluazFfMkphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVVpRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBFY2xpcHNlTGluazFfMkphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YVVpRmFjdG9yeSBidWlsZEphdmFVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmsxXzJKYXZhVWlGYWN0b3J5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFJZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkZWRJZE1hcHBpbmdVRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFCYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/Pj4gZGVmaW5pdGlvbnMpIHsKLQkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRCYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChEZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoTnVsbEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKExpc3Q8SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9FY2xpcHNlTGluazFfMkphdmFVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rMV8ySmF2YVVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDI1NDRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rMV8ySmF2YVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzJKYXZhVWlGYWN0b3J5IGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhVWlGYWN0b3J5Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rMV8ySmF2YVVpRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKioqKioqKiogamF2YSB0eXBlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU1hcHBlZFN1cGVyY2xhc3M+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMV8yQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhRW50aXR5Q29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtFbnRpdHkxXzJDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbWJlZGRhYmxlQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZTFfMkNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9FY2xpcHNlTGluazJfMEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFiMTUxYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9FY2xpcHNlTGluazJfMEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkFic3RyYWN0SmF2YVJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkRlZmF1bHRCYXNpY01hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFbWJlZGRhYmxlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZ1VEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVudGl0eVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuTnVsbEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVVpRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YVVpRmFjdG9yeSBidWlsZEphdmFVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmsyXzBKYXZhVWlGYWN0b3J5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oCi0JCQlMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkZWRJZE1hcHBpbmdVRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFCYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCi0JCWRlZmluaXRpb25zLmFkZChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8+PiBkZWZpbml0aW9ucykgewotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRCYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChEZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoTnVsbEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVudGl0eVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9FY2xpcHNlTGluazJfMEphdmFVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkMmZlOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9FY2xpcHNlTGluazJfMEphdmFVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkVtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuanBhMi5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rMl8wSnBhVWlGYWN0b3J5Ci0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEphdmFVaUZhY3RvcnkKLQlleHRlbmRzIEVjbGlwc2VMaW5rMV8ySmF2YVVpRmFjdG9yeQotCWltcGxlbWVudHMgSmF2YVVpRmFjdG9yeTJfMAotewotCXB1YmxpYyBFY2xpcHNlTGluazJfMEphdmFVaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogamF2YSB0eXBlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbnRpdHlDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0VudGl0eTJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGphdmEgYXR0cmlidXRlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRlZElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEVtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFPbmVUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9FY2xpcHNlTGluazJfM0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRWNsaXBzZUxpbmsyXzNKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg3ODk3OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9FY2xpcHNlTGluazJfM0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkFic3RyYWN0SmF2YVJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkRlZmF1bHRCYXNpY01hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFbWJlZGRhYmxlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZ1VEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVudGl0eVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuTnVsbEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8zSmF2YVJlc291cmNlVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rMl8zSmF2YVJlc291cmNlVWlEZWZpbml0aW9uKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsyXzNKYXZhUmVzb3VyY2VVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YVVpRmFjdG9yeSBidWlsZEphdmFVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmsyXzNKYXZhVWlGYWN0b3J5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCi0JCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkZWRJZE1hcHBpbmdVRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFCYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfM1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8+PiBkZWZpbml0aW9ucykgewotCi0JCWRlZmluaXRpb25zLmFkZChEZWZhdWx0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE51bGxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0KLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbnRpdHlVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbWJlZGRhYmxlVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rMl8zSmF2YVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRWNsaXBzZUxpbmsyXzNKYXZhVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NGQzMDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRWNsaXBzZUxpbmsyXzNKYXZhVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuanBhMi5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rMl8wSnBhVWlGYWN0b3J5Ci0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfM0phdmFVaUZhY3RvcnkKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wSmF2YVVpRmFjdG9yeQotCWltcGxlbWVudHMgSmF2YVVpRmFjdG9yeTJfMAotewotCXB1YmxpYyBFY2xpcHNlTGluazJfM0phdmFVaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqKioqKioqIGphdmEgdHlwZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbnRpdHlDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0VudGl0eTJfM0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU1hcHBlZFN1cGVyY2xhc3M+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMl8zQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9FY2xpcHNlTGlua0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MyZWIzZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9FY2xpcHNlTGlua0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuQWJzdHJhY3RKYXZhUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRGVmYXVsdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5EZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFCYXNpY01hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nVURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRW50aXR5VWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFJZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLk51bGxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSmF2YVJlc291cmNlVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVVpRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YVVpRmFjdG9yeSBidWlsZEphdmFVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtKYXZhVWlGYWN0b3J5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oCi0JCQlMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChKYXZhSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVtYmVkZGVkSWRNYXBwaW5nVURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKAotCQkJTGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248Pz4+IGRlZmluaXRpb25zKSB7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChOdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChEZWZhdWx0SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKAotCQkJTGlzdDxKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChKYXZhRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9FY2xpcHNlTGlua0phdmFVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rSmF2YVVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODY3ODIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rSmF2YVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5CYXNlSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFVaUZhY3RvcnkgZXh0ZW5kcyBCYXNlSmF2YVVpRmFjdG9yeQotewotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFVaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8vICoqKioqKioqKioqKioqKiogamF2YSB0eXBlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbnRpdHlDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbWJlZGRhYmxlQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGphdmEgYXR0cmlidXRlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUJhc2ljTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhVmVyc2lvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhTWFueVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFPbmVUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzNVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFlZjNlMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzNVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0FycmF5TWFwcGluZzJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFY2xpcHNlTGlua0FycmF5TWFwcGluZzJfM1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0FycmF5TWFwcGluZzJfM1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua0FycmF5TWFwcGluZzJfM1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zPgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248RWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzM+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgSmF2YUVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zVWlEZWZpbml0aW9uKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248RWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzM+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzM+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0FycmF5TWFwcGluZzJfM0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMxNWRjYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4KLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODkyMmNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc+Ci0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTY0NTY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGUgZXh0ZW5kcyBFY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZTxCYXNpY01hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGluazFfMU9ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkJhc2ljTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBCYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWluaXRpYWxpemVCYXNpY0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplVHlwZUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplQ29udmVydGVyc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIyNDE5YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcGFuZSBzaG93cyB0aGUgY2FjaGluZyBvcHRpb25zLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IHggU2hhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICBDYWNoZVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgQ2FjaGVTaXplQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgID4gQWR2YW5jZWQgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUV4cGlyeUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIAlBbHdheXNSZWZyZXNoQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIAkJUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCURpc2FibGVIaXRzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIAlDYWNoZUNvb3JkaW5hdGlvbkNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCBFeGlzdGVuY2VUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbnRpdHkKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nCi0gKiBAc2VlIEphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGVTaXplQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZQotICogQHNlZSBFY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZQotICogQHNlZSBFY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlIGV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlPEphdmFFY2xpcHNlTGlua0NhY2hpbmc+Ci17Ci0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsCi0gICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRWNsaXBzZUxpbmtDYWNoaW5nPiBzdWJqZWN0SG9sZGVyLAotICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQluZXcgSmF2YUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUodGhpcywgcGFyZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTUxNGNlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQ2FjaGVTaXplQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYW5lIHNob3dzIHRoZSBjYWNoaW5nIG9wdGlvbnMuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgeCBTaGFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIENhY2hlVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICBDYWNoZVNpemVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgPiBBZHZhbmNlZCAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRXhwaXJ5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUFsd2F5c1JlZnJlc2hDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgCQlSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRGlzYWJsZUhpdHNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUNhY2hlQ29vcmRpbmF0aW9uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEV4aXN0ZW5jZVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcyXzAKLSAqIEBzZWUgSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUgZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGU8SmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4KLXsKLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLSAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua0NhY2hpbmc+IHN1YmplY3RIb2xkZXIsCi0gICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW5ldyBKYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZSh0aGlzLCBwYXJlbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjdkYjFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0aWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5UYXJnZXRDbGFzc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUKLQlleHRlbmRzIEVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlPEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGluazFfMU9ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkJhc2ljTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbGVtZW50Q29sbGVjdGlvblNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0Q2xhc3NDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZSh0aGlzLCBidWlsZENvbGxlY3Rpb25UYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtKb2luRmV0Y2g+IGJ1aWxkSm9pbkZldGNoSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLCBFY2xpcHNlTGlua0pvaW5GZXRjaD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgdGhpcy5zdWJqZWN0KS5nZXRKb2luRmV0Y2goKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCYXNpY1ZhbHVlVHlwZVNlY3Rpb24oQ29tcG9zaXRlIHR5cGVTZWN0aW9uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVCYXNpY1ZhbHVlVHlwZVNlY3Rpb24odHlwZVNlY3Rpb24pOwotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIgPSBidWlsZENvbnZlcnRlckhvbGRlcigpOwotCi0JCS8vIEVjbGlwc2VMaW5rIENvbnZlcnRlcgotCQlCdXR0b24gZWxDb252ZXJ0ZXJCdXR0b24gPSBhZGRSYWRpb0J1dHRvbigKLQkJCXR5cGVTZWN0aW9uLCAKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fY29udmVydGVkLCAKLQkJCWJ1aWxkQ29udmVydGVyQm9vbGVhbkhvbGRlcihFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpLCAKLQkJCW51bGwpOwotCQkoKEdyaWREYXRhKSBlbENvbnZlcnRlckJ1dHRvbi5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQlQYW5lPEVjbGlwc2VMaW5rQ29udmVydD4gY29udmVydENvbXBvc2l0ZSA9IGJ1aWxkQ29udmVydENvbXBvc2l0ZShidWlsZEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyKGNvbnZlcnRlckhvbGRlciksIHR5cGVTZWN0aW9uKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIGNvbnZlcnRDb21wb3NpdGUuZ2V0Q29udHJvbCgpLmdldExheW91dERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCXJlZ2lzdGVyU3ViUGFuZShjb252ZXJ0Q29tcG9zaXRlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbnZlcnRpYmxlTWFwcGluZywgQ29udmVydGVyPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbnZlcnRpYmxlTWFwcGluZy5DT05WRVJURVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbnZlcnRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbnZlcnRlcigpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ29udmVydGVyQm9vbGVhbkhvbGRlcihmaW5hbCBDbGFzczw/IGV4dGVuZHMgQ29udmVydGVyPiBjb252ZXJ0ZXJUeXBlKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbnZlcnRpYmxlTWFwcGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCUNvbnZlcnRlciBjb252ZXJ0ZXIgPSB0aGlzLnN1YmplY3QuZ2V0Q29udmVydGVyKCk7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IGNvbnZlcnRlclR5cGUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRDb252ZXJ0ZXIoY29udmVydGVyVHlwZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBQYW5lPEVjbGlwc2VMaW5rQ29udmVydD4gYnVpbGRDb252ZXJ0Q29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnQ+IGNvbnZlcnRIb2xkZXIsIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUoY29udmVydEhvbGRlciwgY29udGFpbmVyLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0PiBidWlsZEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlciwgRWNsaXBzZUxpbmtDb252ZXJ0Pihjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ29udmVydCB0cmFuc2Zvcm1fKENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJCQlyZXR1cm4gY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MgPyAoRWNsaXBzZUxpbmtDb252ZXJ0KSBjb252ZXJ0ZXIgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlMV8yQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlMV8yQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMjIyZTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZTFfMkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcGFuZSBkb2VzIG5vdCBoYXZlIGFueSB3aWRnZXRzLgotICoKLSAqIEBzZWUgRW1iZWRkYWJsZQotICogQHNlZSBKYXZhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKiBAc2VlIEVtYmVkZGFibGVVaVByb3ZpZGVyCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlMV8yQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbWJlZGRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUxXzJDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhRW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUVtYmVkZGFibGVDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplQ29udmVydGVyc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVBZHZhbmNlZENvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbWJlZGRhYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVyKCksIGNvbnRhaW5lcik7CQotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YUVtYmVkZGFibGUsIEFjY2Vzc0hvbGRlcj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU1MzBiZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYW5lIGRvZXMgbm90IGhhdmUgYW55IHdpZGdldHMuCi0gKgotICogQHNlZSBFbWJlZGRhYmxlCi0gKiBAc2VlIEphdmFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqIEBzZWUgRW1iZWRkYWJsZVVpUHJvdmlkZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGFibGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFFbWJlZGRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5MV8yQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHkxXzJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQwY2VhZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHkxXzJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRW50aXR5TmFtZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuSWRDbGFzc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBwYW5lIHVzZWQgZm9yIGFuIEVjbGlwc2VMaW5rMS4yIEphdmEgZW50aXR5LgotICoKLSAqIEBzZWUgSmF2YUVjbGlwc2VMaW5rRW50aXR5Ci0gKiBAc2VlIEVjbGlwc2VsaW5rSnBhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtFbnRpdHkxXzJDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlPEphdmFFbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua0phdmFFbnRpdHlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5KYXZhRW50aXR5PC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0VudGl0eTFfMkNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbnRpdHlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhYmxlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFbnRpdHlOYW1lQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CQotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlcigpLCBjb250YWluZXIpOwkKLQkJbmV3IElkQ2xhc3NDb21wb3NpdGUodGhpcywgYnVpbGRJZENsYXNzUmVmZXJlbmNlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRW50aXR5LCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudFR5cGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHkyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VudGl0eTJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmRjNTVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VudGl0eTJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgcGFuZSB1c2VkIGZvciBhbiBFY2xpcHNlTGluayAyLjAgSmF2YSBlbnRpdHkuCi0gKgotICogQHNlZSBKYXZhRWNsaXBzZUxpbmtFbnRpdHkKLSAqIEBzZWUgRWNsaXBzZWxpbmtKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0VudGl0eTJfMENvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbnRpdHkyX3hDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rSmF2YUVudGl0eUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkphdmFFbnRpdHk8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rRW50aXR5Ml8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHkyXzNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VudGl0eTJfM0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjhlYzVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VudGl0eTJfM0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgcGFuZSB1c2VkIGZvciBhbiBFY2xpcHNlTGluayAyLjMgSmF2YSBlbnRpdHkuCi0gKgotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtFbnRpdHkyXzNDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW50aXR5Ml94Q29tcG9zaXRlCi17Ci0JcHVibGljIEphdmFFY2xpcHNlTGlua0VudGl0eTJfM0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVFbnRpdHlDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplQ2FjaGluZ0NvbGxhcHNpYmxlU2VjdGlvblBhbmUoY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplUXVlcmllc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVJbmhlcml0YW5jZUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVBdHRyaWJ1dGVPdmVycmlkZXNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplTXVsdGl0ZW5hbmN5Q29sbGFwc2libGVTZWN0aW9uUGFuZShjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVHZW5lcmF0b3JzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplU2Vjb25kYXJ5VGFibGVzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUFkdmFuY2VkQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU11bHRpdGVuYW5jeUNvbGxhcHNpYmxlU2VjdGlvblBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9tdWx0aXRlbmFuY3kpOwotCQl0aGlzLmluaXRpYWxpemVNdWx0aXRlbmFuY3lTZWN0aW9uKGNvbnRhaW5lciwgYnVpbGRNdWx0aXRlbmFuY3lIb2xkZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU11bHRpdGVuYW5jeVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMz4gbXVsdGl0ZW5hbmN5SG9sZGVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua011bHRpdGVuYW5jeUNvbXBvc2l0ZSh0aGlzLCBtdWx0aXRlbmFuY3lIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YUVudGl0eSwgSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zPiBidWlsZE11bHRpdGVuYW5jeUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YUVudGl0eSwgSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIHRoaXMuc3ViamVjdCkuZ2V0TXVsdGl0ZW5hbmN5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNiNGFhOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIHBhbmUgdXNlZCBmb3IgYW4gRWNsaXBzZUxpbmsgSmF2YSBlbnRpdHkuCi0gKgotICogQHNlZSBKYXZhRWNsaXBzZUxpbmtFbnRpdHkKLSAqIEBzZWUgRWNsaXBzZWxpbmtKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGU8SmF2YUVudGl0eT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rSmF2YUVudGl0eUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkphdmFFbnRpdHk8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcyMGU0NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgaXMgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAJCQkgIAkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHggRXhpc3RlbmNlIENoZWNraW5nOiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgIAkJCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgQ2FjaGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8SmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKCAKLSAgICAgICAgICAgIGNvbnRhaW5lciwgCi0gICAgICAgICAgICBhZGRDaGVja0JveCggCi0gICAgICAgICAgICAgICAgIGNvbnRhaW5lciwgCi0gICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9sYWJlbCwgCi0gICAgICAgICAgICAgICAgIGJ1aWxkRXhpc3RlbmNlQ2hlY2tpbmdIb2xkZXIoKSwgCi0gICAgICAgICAgICAgICAgIG51bGwgCi0gICAgICAgICAgICApLCAKLSAgICAgICAgICAgIGFkZEV4aXN0ZW5jZUNoZWNraW5nVHlwZUNvbWJvKGNvbnRhaW5lcikuZ2V0Q29udHJvbCgpLCAKLSAgICAgICAgICAgIG51bGwgCi0gICAgICAgKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGU+IGFkZEV4aXN0ZW5jZUNoZWNraW5nVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGU+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX0VYSVNURU5DRV9UWVBFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX0VYSVNURU5DRV9UWVBFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlW10gZ2V0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIHZhbHVlKSB7Ci0JCQkJc3dpdGNoICh2YWx1ZSkgewotCQkJCQljYXNlIENIRUNLX0NBQ0hFIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfY2hlY2tfY2FjaGU7Ci0JCQkJCWNhc2UgQ0hFQ0tfREFUQUJBU0UgOgotCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9jaGVja19kYXRhYmFzZTsKLQkJCQkJY2FzZSBBU1NVTUVfRVhJU1RFTkNFIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfYXNzdW1lX2V4aXN0ZW5jZTsKLQkJCQkJY2FzZSBBU1NVTUVfTk9OX0VYSVNURU5DRSA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2Fzc3VtZV9ub25fZXhpc3RlbmNlOwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSh2YWx1ZSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRFeGlzdGVuY2VDaGVja2luZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YUVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nLkVYSVNURU5DRV9DSEVDS0lOR19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0V4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEV4aXN0ZW5jZUNoZWNraW5nKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0lkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOTQzZDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkNvbHVtbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5JZE1hcHBpbmcyXzBNYXBwZWRCeVJlbGF0aW9uc2hpcFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuSWRNYXBwaW5nR2VuZXJhdGlvbjJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBDb21wb3NpdGUKLQlleHRlbmRzIEVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlPEphdmFJZE1hcHBpbmc+Ci17Ci0JcHVibGljIEphdmFFY2xpcHNlTGlua0lkTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUlkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWluaXRpYWxpemVJZENvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplVHlwZUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplQ29udmVydGVyc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplR2VuZXJhdGlvbkNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IElkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZSh0aGlzLCBidWlsZE11dGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9CQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmF0aW9uQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IElkTWFwcGluZ0dlbmVyYXRpb24yXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0lkTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmMyNTA1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0lkTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhSWRNYXBwaW5nVWlEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nMl8wVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBKYXZhSWRNYXBwaW5nVWlEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nMl8wVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nMl8wVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFJZE1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZEZvcihSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgbWFwcGFibGVPYmplY3QpIHsKLQkJLy8gYSBkZWZhdWx0IGVjbGlwc2VsaW5rIDEtMSBtYXBwaW5nIGNhbiBub3QgYmUgbWFwcGVkIGFzIGFuIGlkLCBhcyBtYXBwaW5nIGl0Ci0JCS8vIHRoYXQgd2F5IHdpbGwgYWN0dWFsbHkgcmVzdWx0IGluIGEgZGVmYXVsdCAxLTEgd2l0aCBhbiBpZCBkZXJpdmVkIGlkZW50aXR5Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQoCi0JCQkJbWFwcGFibGVPYmplY3QuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSwgCi0JCQkJTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0N2UxMDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZQotCWV4dGVuZHMgRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGU8SWRNYXBwaW5nPgotewotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWluaXRpYWxpemVJZENvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplVHlwZUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplQ29udmVydGVyc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplR2VuZXJhdGlvbkNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMGExZTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQ2FzY2FkZVBhbmUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT3JkZXJpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUKLQlleHRlbmRzIEVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU8TWFueVRvTWFueU1hcHBpbmc+Ci17Ci0JcHVibGljIEphdmFFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBNYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWluaXRpYWxpemVNYW55VG9NYW55Q29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVKb2luaW5nU3RyYXRlZ3lDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZU9yZGVyaW5nQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hbnlUb01hbnlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCB0aGlzLmJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZVBhbmUyXzAodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9yZGVyaW5nQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9yZGVyaW5nMl8wQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxNYW55VG9NYW55UmVsYXRpb25zaGlwPiBidWlsZEVjbGlwc2VMaW5rSm9pbmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxNYW55VG9NYW55TWFwcGluZywgTWFueVRvTWFueVJlbGF0aW9uc2hpcD4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE1hbnlUb01hbnlSZWxhdGlvbnNoaXAgdHJhbnNmb3JtXyhNYW55VG9NYW55TWFwcGluZyB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjdhMGU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNhc2NhZGVQYW5lMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0TWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTxKYXZhTWFueVRvT25lTWFwcGluZywgSmF2YU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMD4KLXsKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YU1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFueVRvT25lU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZVBhbmUyXzAodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksICBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rSm9pbkZldGNoPiBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFNYW55VG9PbmVNYXBwaW5nLCBFY2xpcHNlTGlua0pvaW5GZXRjaD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0pvaW5GZXRjaE1hcHBpbmcpIHRoaXMuc3ViamVjdCkuZ2V0Sm9pbkZldGNoKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMV8yQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMV8yQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZDQ0ZDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczFfMkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLklkQ2xhc3NDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBwYW5lIHVzZWQgZm9yIGFuIEVjbGlwc2VMaW5rIEphdmEgTWFwcGVkIFN1cGVyY2xhc3MuCi0gKgotICogQHNlZSBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MKLSAqIEBzZWUgRWNsaXBzZWxpbmtKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MxXzJDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMV8yQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYXBwZWRTdXBlcmNsYXNzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVyKCksIGNvbnRhaW5lcik7CQotCQluZXcgSWRDbGFzc0NvbXBvc2l0ZSh0aGlzLCBidWlsZElkQ2xhc3NSZWZlcmVuY2VIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhTWFwcGVkU3VwZXJjbGFzcywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzliNzk1OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLklkQ2xhc3NDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBwYW5lIHVzZWQgZm9yIGFuIEVjbGlwc2VMaW5rIEphdmEgTWFwcGVkIFN1cGVyY2xhc3MuCi0gKgotICogQHNlZSBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MKLSAqIEBzZWUgRWNsaXBzZWxpbmtKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hcHBlZFN1cGVyY2xhc3NTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXIoKSwgY29udGFpbmVyKTsJCi0JCW5ldyBJZENsYXNzQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSWRDbGFzc1JlZmVyZW5jZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YU1hcHBlZFN1cGVyY2xhc3MsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50VHlwZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDYWNoaW5nU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4gY2FjaGluZ0hvbGRlcikgewotCQluZXcgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZSh0aGlzLCBjYWNoaW5nSG9sZGVyLCBjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMl8zQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMl8zQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OGE1NDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfM0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5JZENsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgcGFuZSB1c2VkIGZvciBhbiBFY2xpcHNlTGluayAyLjMgSmF2YSBNYXBwZWQgU3VwZXJjbGFzcy4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcwotICogQHNlZSBFY2xpcHNlbGlua0pwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfM0NvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzNDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZU1hcHBlZFN1cGVyY2xhc3NDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsJCQotCQl0aGlzLmluaXRpYWxpemVDYWNoaW5nQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZVF1ZXJpZXNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplTXVsdGl0ZW5hbmN5Q29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplQWR2YW5jZWRDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFwcGVkU3VwZXJjbGFzc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlcigpLCBjb250YWluZXIpOwkKLQkJbmV3IElkQ2xhc3NDb21wb3NpdGUodGhpcywgYnVpbGRJZENsYXNzUmVmZXJlbmNlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhTWFwcGVkU3VwZXJjbGFzcywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hpbmdTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRWNsaXBzZUxpbmtDYWNoaW5nPiBjYWNoaW5nSG9sZGVyKSB7Ci0JCW5ldyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlKHRoaXMsIGNhY2hpbmdIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU11bHRpdGVuYW5jeUNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX211bHRpdGVuYW5jeSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZU11bHRpdGVuYW5jeVNlY3Rpb24oY29udGFpbmVyLCBidWlsZE11bHRpdGVuYW5jeUhvbGRlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTXVsdGl0ZW5hbmN5U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zPiBtdWx0aXRlbmFuY3lIb2xkZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Q29tcG9zaXRlKHRoaXMsIG11bHRpdGVuYW5jeUhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhTWFwcGVkU3VwZXJjbGFzcywgSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zPiBidWlsZE11bHRpdGVuYW5jeUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YU1hcHBlZFN1cGVyY2xhc3MsIEphdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMz4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgdGhpcy5zdWJqZWN0KS5nZXRNdWx0aXRlbmFuY3koKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2NiMGIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgcGFuZSB1c2VkIGZvciBhbiBFY2xpcHNlTGluayBKYXZhIE1hcHBlZCBTdXBlcmNsYXNzLgotICoKLSAqIEBzZWUgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzCi0gKiBAc2VlIEVjbGlwc2VsaW5rSnBhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YU1hcHBlZFN1cGVyY2xhc3M+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNzQ1NzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNhc2NhZGVQYW5lMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLk9yZGVyaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLk9ycGhhblJlbW92YWwyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZQotCWV4dGVuZHMgRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlPEphdmFPbmVUb01hbnlNYXBwaW5nPgotewotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWluaXRpYWxpemVPbmVUb01hbnlDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZUpvaW5pbmdTdHJhdGVneUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplQ29udmVydGVyc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplT3JkZXJpbmdDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9uZVRvTWFueVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZSh0aGlzLCB0aGlzLmJ1aWxkUHJpdmF0ZU93bmFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ycGhhblJlbW92YWwyXzBDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZE9ycGhhblJlbW92YWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZVBhbmUyXzAodGhpcywgdGhpcy5idWlsZENhc2NhZGVIb2xkZXIoKSwgdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT3JkZXJpbmdDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JkZXJpbmcyXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE9ycGhhblJlbW92YWJsZTJfMD4gYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFPbmVUb01hbnlNYXBwaW5nLCBPcnBoYW5SZW1vdmFibGUyXzA+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPcnBoYW5SZW1vdmFibGUyXzAgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgdGhpcy5zdWJqZWN0KS5nZXRPcnBoYW5SZW1vdmFsKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYjE1NGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ByaXZhdGVPd25lZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQWJzdHJhY3RPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQ2FzY2FkZVBhbmUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT25lVG9PbmVKb2luaW5nU3RyYXRlZ3kyXzBQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLk9ycGhhblJlbW92YWwyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdE9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTxKYXZhT25lVG9PbmVNYXBwaW5nLCBKYXZhT25lVG9PbmVSZWxhdGlvbnNoaXAyXzA+Ci17Ci0JcHVibGljIEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPbmVUb09uZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlKHRoaXMsIGJ1aWxkUHJpdmF0ZU93bmFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ycGhhblJlbW92YWwyXzBDb21wb3NpdGUodGhpcywgYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVQYW5lMl8wKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCAgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWd5Q29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5Ml8wUGFuZSh0aGlzLCBidWlsZEpvaW5pbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9CQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtKb2luRmV0Y2g+IGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YU9uZVRvT25lTWFwcGluZywgRWNsaXBzZUxpbmtKb2luRmV0Y2g+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKb2luRmV0Y2ggYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHRoaXMuc3ViamVjdCkuZ2V0Sm9pbkZldGNoKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQcml2YXRlT3duZWQ+IGJ1aWxkUHJpdmF0ZU93bmFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFPbmVUb09uZU1hcHBpbmcsIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHRoaXMuc3ViamVjdCkuZ2V0UHJpdmF0ZU93bmVkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JwaGFuUmVtb3ZhYmxlMl8wPiBidWlsZE9ycGhhblJlbW92YWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YU9uZVRvT25lTWFwcGluZywgT3JwaGFuUmVtb3ZhYmxlMl8wPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3JwaGFuUmVtb3ZhYmxlMl8wIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKE9ycGhhblJlbW92YWxIb2xkZXIyXzApIHRoaXMuc3ViamVjdCkuZ2V0T3JwaGFuUmVtb3ZhbCgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua1N0cnVjdHVyZU1hcHBpbmcyXzNVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua1N0cnVjdHVyZU1hcHBpbmcyXzNVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2YzJjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfM1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfM1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfMz4KLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfMz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgSmF2YUVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfM1VpRGVmaW5pdGlvbigpOwotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfMz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBKYXZhRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1N0cnVjdHVyZU1hcHBpbmcyXzNDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTgzNTI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc+Ci0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FlZDMzYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+Ci0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDdlYjFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZQotCWV4dGVuZHMgRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTxWZXJzaW9uTWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rT3JtVmVyc2lvbk1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5WZXJzaW9uTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFZlcnNpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpbml0aWFsaXplVmVyc2lvbkNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplVHlwZUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplQ29udmVydGVyc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Fic3RyYWN0RWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Fic3RyYWN0RWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMzNhNWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLkNhdGFsb2dDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuZGIuU2NoZW1hQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5BYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QYWNrYWdlQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVF1ZXJpZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgWG1sUGFja2FnZUNob29zZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBTY2hlbWE6ICAgICAgfCBTY2hlbWFDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBDYXRhbG9nOiAgICAgfCBDYXRhbG9nQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBBY2Nlc3MgVHlwZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcm1HZW5lcmF0b3JzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9ybVF1ZXJpZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ29udmVydGVyc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5TWFwcGluZ3MKLSAqIEBzZWUgQWJzdHJhY3RFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBDYXRhbG9nQ29tYm8KLSAqIEBzZWUgRW51bUZvcm1Db21ib1ZpZXdlcgotICogQHNlZSBFbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGUKLSAqIEBzZWUgT3JtUGFja2FnZUNob29zZXIKLSAqIEBzZWUgT3JtUXVlcmllc0NvbXBvc2l0ZQotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZQotICogQHNlZSBTY2hlbWFDb21ibwotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UgZXh0ZW5kcyBBYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZShDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUVudGl0eU1hcHBpbmdzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUdlbmVyYXRvcnNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplUXVlcmllc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfY29udmVydGVycwotCQkpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZUNvbnZlcnRlcnNTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQl0aGlzLmJ1aWxkQ29udmVydGVySG9sZGVyKCksCi0JCQljb250YWluZXIKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+IGJ1aWxkQ29udmVydGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHlNYXBwaW5ncywgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncykgdGhpcy5zdWJqZWN0KS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Fic3RyYWN0T3JtRWNsaXBzZUxpbmtFbnRpdHkyX3hDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua0VudGl0eTJfeENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzJjMWRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua0VudGl0eTJfeENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5FbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuR2VuZXJhdGlvbjJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5RdWVyaWVzMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtFbnRpdHkyX3hDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlCi17Ci0JcHJvdGVjdGVkIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtFbnRpdHkyX3hDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBdHRyaWJ1dGVPdmVycmlkZXNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVudGl0eTJfME92ZXJyaWRlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmF0b3JzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhdG9yQ29udGFpbmVyPiBnZW5lcmF0b3JDb250YWluZXJIb2xkZXIpIHsKLQkJbmV3IEdlbmVyYXRpb24yXzBDb21wb3NpdGUodGhpcywgZ2VuZXJhdG9yQ29udGFpbmVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDYWNoaW5nU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRWNsaXBzZUxpbmtDYWNoaW5nPiBjYWNoaW5nSG9sZGVyKSB7Ci0JCW5ldyBPcm1FY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUodGhpcywgY2FjaGluZ0hvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUXVlcmllc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5Q29udGFpbmVyPiBxdWVyeUNvbnRhaW5lckhvbGRlcikgewotCQluZXcgUXVlcmllczJfMENvbXBvc2l0ZSh0aGlzLCBxdWVyeUNvbnRhaW5lckhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdE9ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYzYzNzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdE9ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rRW50aXR5QWR2YW5jZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5BYnN0cmFjdE9ybUVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RPcm1FbnRpdHlDb21wb3NpdGUKLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1FY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUVudGl0eUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVDYWNoaW5nQ29sbGFwc2libGVTZWN0aW9uUGFuZShjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVRdWVyaWVzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUluaGVyaXRhbmNlQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUF0dHJpYnV0ZU92ZXJyaWRlc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVHZW5lcmF0b3JzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplU2Vjb25kYXJ5VGFibGVzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUFkdmFuY2VkQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDYWNoaW5nQ29sbGFwc2libGVTZWN0aW9uUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NhY2hpbmcpOwotCQlpbml0aWFsaXplQ2FjaGluZ1NlY3Rpb24oY29udGFpbmVyLCBidWlsZENhY2hpbmdIb2xkZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDYWNoaW5nU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRWNsaXBzZUxpbmtDYWNoaW5nPiBjYWNoaW5nSG9sZGVyKSB7Ci0JCW5ldyBPcm1FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUodGhpcywgY2FjaGluZ0hvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQkKLQlwcml2YXRlIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1FbnRpdHksIE9ybUVjbGlwc2VMaW5rQ2FjaGluZz4gYnVpbGRDYWNoaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1FbnRpdHksIE9ybUVjbGlwc2VMaW5rQ2FjaGluZz4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0NhY2hpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIHRoaXMuc3ViamVjdCkuZ2V0Q2FjaGluZygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udmVydGVyc0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NvbnZlcnRlcnMpOwotCQl0aGlzLmluaXRpYWxpemVDb252ZXJ0ZXJzU2VjdGlvbihjb250YWluZXIsIGJ1aWxkQ29udmVydGVyQ29udGFpbmVyTW9kZWwoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJ0ZXJzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+IGNvbnZlcnRlckhvbGRlcikgewotCQluZXcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlKHRoaXMsIGNvbnZlcnRlckhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+IGJ1aWxkQ29udmVydGVyQ29udGFpbmVyTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybUVudGl0eSwgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIHRoaXMuc3ViamVjdCkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBZHZhbmNlZENvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua0VudGl0eUFkdmFuY2VkQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGUzNGQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQWR2YW5jZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5JZENsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUphdmFDbGFzc0Nob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0TWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTxPcm1NYXBwZWRTdXBlcmNsYXNzPiAKLQlpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCXByb3RlY3RlZCBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZU1hcHBlZFN1cGVyY2xhc3NDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplQ2FjaGluZ0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUFkdmFuY2VkQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYXBwZWRTdXBlcmNsYXNzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcm1KYXZhQ2xhc3NDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IElkQ2xhc3NDb21wb3NpdGUodGhpcywgYnVpbGRJZENsYXNzUmVmZXJlbmNlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBNZXRhZGF0YUNvbXBsZXRlQ29tcG9zaXRlKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ2FjaGluZ0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NhY2hpbmcpOwotCQl0aGlzLmluaXRpYWxpemVDYWNoaW5nU2VjdGlvbihjb250YWluZXIsIGJ1aWxkQ2FjaGluZ0hvbGRlcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hpbmdTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1FY2xpcHNlTGlua0NhY2hpbmc+IGNhY2hpbmdIb2xkZXIpIHsKLQkJbmV3IE9ybUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZSh0aGlzLCBjYWNoaW5nSG9sZGVyLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybU1hcHBlZFN1cGVyY2xhc3MsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50VHlwZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1NYXBwZWRTdXBlcmNsYXNzLCBPcm1FY2xpcHNlTGlua0NhY2hpbmc+IGJ1aWxkQ2FjaGluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtTWFwcGVkU3VwZXJjbGFzcywgT3JtRWNsaXBzZUxpbmtDYWNoaW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ2FjaGluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIHRoaXMuc3ViamVjdCkuZ2V0Q2FjaGluZygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udmVydGVyc0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NvbnZlcnRlcnMpOwotCQl0aGlzLmluaXRpYWxpemVDb252ZXJ0ZXJzU2VjdGlvbihjb250YWluZXIsIGJ1aWxkQ29udmVydGVyQ29udGFpbmVyTW9kZWwoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJ0ZXJzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+IGNvbnZlcnRlckhvbGRlcikgewotCQluZXcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlKHRoaXMsIGNvbnZlcnRlckhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+IGJ1aWxkQ29udmVydGVyQ29udGFpbmVyTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybU1hcHBlZFN1cGVyY2xhc3MsIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgdGhpcy5zdWJqZWN0KS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUFkdmFuY2VkQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0FkdmFuY2VkQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9CYXNlRWNsaXBzZUxpbmtPcm1YbWxVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQmFzZUVjbGlwc2VMaW5rT3JtWG1sVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNDlmOWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9CYXNlRWNsaXBzZUxpbmtPcm1YbWxVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uQmFzZU9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlRWNsaXBzZUxpbmtPcm1YbWxVaUZhY3RvcnkgZXh0ZW5kcyBCYXNlT3JtWG1sVWlGYWN0b3J5Ci17Ci0JLy8gKioqKioqKioqKioqKioqKiBvcm0gdHlwZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVudGl0eUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbWJlZGRhYmxlQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogb3JtIGF0dHJpYnV0ZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUlkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1JZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9CQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtQmFzaWNNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUJhc2ljTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybVZlcnNpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1NYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1PbmVUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1PbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1UcmFuc2llbnRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IFRyYW5zaWVudE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rMl8zUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmsyXzNQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjkxMTBjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmsyXzNQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNDb21wb3NpdGUuVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuZGIuQ2F0YWxvZ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5TY2hlbWFDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5KcHRVaURldGFpbHNPcm1NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5KcGEyXzBGbGFnVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIFBlcnNpc3RlbmNlIFVuaXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IHggWE1MIE1hcHBpbmcgTWV0YWRhdGEgQ29tcGxldGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgeCBDYXNjYWRlIFBlcnNpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgU2NoZW1hOiAgICAgIHwgU2NoZW1hQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQ2F0YWxvZzogICAgIHwgQ2F0YWxvZ0NvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQWNjZXNzIFR5cGU6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhCi0gKiBAc2VlIE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzCi0gKiBAc2VlIEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBDYXRhbG9nQ29tYm8KLSAqIEBzZWUgU2NoZW1hQ29tYm8KLSAqIEBzZWUgRW51bUZvcm1Db21ib1ZpZXdlcgotICoKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzNQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZSBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlCi17Ci0KLQlwcm90ZWN0ZWQgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNDb21wb3NpdGU8T3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM+IHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQ29tcG9zaXRlOwotCi0JcHVibGljIEVjbGlwc2VMaW5rMl8zUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBTZWN0aW9uCi0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX3BlcnNpc3RlbmNlVW5pdFNlY3Rpb24KLQkJKTsKLQotCQkvLyBYTUwgbWFwcGluZyBtZXRhZGF0YSBjb21wbGV0ZSBjaGVjayBib3gKLQkJYWRkQ2hlY2tCb3goCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV94bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUNoZWNrQm94LAotCQkJYnVpbGRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUhvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9YTUwKLQkJKTsKLQotCQkvLyBDYXNjYWRlIFBlcnNpc3QgY2hlY2stYm94Ci0JCWFkZENoZWNrQm94KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfY2FzY2FkZVBlcnNpc3RDaGVja0JveCwKLQkJCWJ1aWxkQ2FzY2FkZVBlcnNpc3RIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9PUk1fQ0FTQ0FERQotCQkpOwotCi0JCS8vIFNjaGVtYSB3aWRnZXRzCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9zY2hlbWEsCi0JCQlhZGRTY2hlbWFDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9TQ0hFTUEKLQkJKTsKLQotCQkvLyBDYXRhbG9nIHdpZGdldHMKLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2NhdGFsb2csCi0JCQlhZGRDYXRhbG9nQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9PUk1fQ0FUQUxPRwotCQkpOwotCi0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHNIb2xkZXIoKSwgY29udGFpbmVyKTsKLQotCQkvLyBEZWxpbWl0ZWQgSWRlbnRpZmllcnMgY2hlY2stYm94Ci0JCUJ1dHRvbiBkaUNoZWNrQm94ID0gdGhpcy5hZGRDaGVja0JveCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2RlbGltaXRlZElkZW50aWZpZXJzQ2hlY2tCb3gsCi0JCQl0aGlzLmJ1aWxkRGVsaW1pdGVkSWRlbnRpZmllcnNIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9PUk1fREVMSU1JVEVEX0lERU5USUZJRVJTCi0JCSk7Ci0KLQkJU1dUVG9vbHMuY29udHJvbFZpc2libGVTdGF0ZShKcGEyXzBGbGFnVHJhbnNmb3JtZXIuY29udmVydFRvRmxhZ01vZGVsKHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSwgZGlDaGVja0JveCk7Ci0KLQotCQkvLyBUZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zIGdyb3VwIHBhbmUKLQkJR3JvdXAgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkdyb3VwUGFuZSA9IGFkZFRpdGxlZEdyb3VwKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc19ncm91cExhYmVsCi0JCSk7Ci0KLQkJdGhpcy50ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0NvbXBvc2l0ZSA9IG5ldyBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0NvbXBvc2l0ZTxPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cz4oCi0JCQlnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0hvbGRlcigpLAotCQkJdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkdyb3VwUGFuZSwKLQkJCWdldFdpZGdldEZhY3RvcnkoKSwKLQkJCWJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNFZGl0b3IoKQotCQkpOwotCi0JCWluc3RhbGxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1BhbmVFbmFibGVyKHRoaXMudGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNDb21wb3NpdGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluc3RhbGxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1BhbmVFbmFibGVyKFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQ29tcG9zaXRlPE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzPiBwYW5lKSB7Ci0JCXBhbmUuaW5zdGFsbExpc3RQYW5lRW5hYmxlcihidWlsZFBhbmVFbmFibGVySG9sZGVyKCkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8T3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMsIEJvb2xlYW4+KGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNFZGl0b3I8T3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM+IGJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNFZGl0b3IoKSB7Ci0JCXJldHVybiBuZXcgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNQcm92aWRlcigpOwotCX0KLQotCWNsYXNzIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zUHJvdmlkZXIgaW1wbGVtZW50cyBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0VkaXRvcjxPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cz4gewotCi0JCXB1YmxpYyB2b2lkIGFkZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgc3ViamVjdCkgewotCQkJT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyBjb2x1bW4gPSAoKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpIHN1YmplY3QpLmFkZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJCWNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMy5ERUZBVUxUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIExpc3RJdGVyYWJsZTxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGdldERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyhPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZShPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JzTGlzdFByb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIExpc3RJdGVyYWJsZTxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHN1YmplY3QpIHsKLQkJCXJldHVybiBuZXcgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4oKChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzKSBzdWJqZWN0KS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHN1YmplY3QpIHsKLQkJCXJldHVybiAoKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpIHN1YmplY3QpLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yc0xpc3RQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyhPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gKChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzKSBzdWJqZWN0KS5oYXNUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgc3ViamVjdCwgaW50W10gc2VsZWN0ZWRJbmRpY2VzKSB7Ci0JCQlmb3IgKGludCBpbmRleCA9IHNlbGVjdGVkSW5kaWNlcy5sZW5ndGg7IGluZGV4LS0gPiAwOyApIHsKLQkJCQkoKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpIHN1YmplY3QpLnJlbW92ZVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oc2VsZWN0ZWRJbmRpY2VzW2luZGV4XSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFkZTg3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRGlhbG9nUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuVmFsaWRhdGluZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0xpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2cKLQlleHRlbmRzIFZhbGlkYXRpbmdEaWFsb2c8RWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdD4KLXsKLQkvKioKLQkgKiBUaGUgYXNzb2NpYXRlZCBjb252ZXJ0ZXIgY29udGFpbmVyCi0JICovCi0JRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgY29udmVydGVyQ29udGFpbmVyOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIHRvIGVkaXQgYW4gZXhpc3RpbmcgY29udmVyc2lvbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZyhTaGVsbCBwYXJlbnQsIEVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGNvbnZlcnRlckNvbnRhaW5lcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lciA9IGNvbnZlcnRlckNvbnRhaW5lcjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdCBidWlsZFN0YXRlT2JqZWN0KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3QodGhpcy5jb252ZXJ0ZXJDb250YWluZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogb3BlbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0JCXNoZWxsLnNldFRleHQodGhpcy5nZXRUaXRsZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZ19hZGRDb252ZXJ0ZXI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvblRpdGxlKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZ19hZGRDb252ZXJ0ZXJEZXNjcmlwdGlvblRpdGxlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZ19hZGRDb252ZXJ0ZXJEZXNjcmlwdGlvbjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERpYWxvZ1BhbmU8RWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdD4gYnVpbGRMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25WYWx1ZURpYWxvZ1BhbmUoY29udGFpbmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotCQlzdXBlci5jcmVhdGUoKTsKLQotCQlDb252ZXJzaW9uVmFsdWVEaWFsb2dQYW5lIHBhbmUgPSAoQ29udmVyc2lvblZhbHVlRGlhbG9nUGFuZSkgZ2V0UGFuZSgpOwotCQlwYW5lLnNlbGVjdEFsbCgpOwotCi0JCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhIHZhbHVlIHNldCBpbiB0aGUgdGV4dCB3aWRnZXQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB2YWx1ZSBzZXQgaW4gdGhlIHRleHQgd2lkZ2V0LgotCSAqLwotCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGdldENvbnZlcnRlclR5cGUoKSB7Ci0JCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0Q29udmVydGVyVHlwZSgpOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIENvbnZlcnNpb25WYWx1ZURpYWxvZ1BhbmUgZXh0ZW5kcyBEaWFsb2dQYW5lPEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3Q+IHsKLQotCQlwcml2YXRlIFRleHQgbmFtZVRleHQ7Ci0KLQkJQ29udmVyc2lvblZhbHVlRGlhbG9nUGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZy50aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgcGFyZW50KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCXRoaXMubmFtZVRleHQgPSBhZGRMYWJlbGVkVGV4dCgKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZ19uYW1lLAotCQkJCWJ1aWxkTmFtZUhvbGRlcigpCi0JCQkpOwotCQkJCi0JCQlhZGRMYWJlbGVkQ29tYm8oCi0JCQkJY29udGFpbmVyLCAKLQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nX2NvbnZlcnRlclR5cGUsIAotCQkJCWJ1aWxkQ29udmVydGVyVHlwZUxpc3RIb2xkZXIoKSwgCi0JCQkJYnVpbGRDb252ZXJ0ZXJUeXBlSG9sZGVyKCksIAotCQkJCWJ1aWxkU3RyaW5nQ29udmVydGVyKCksCi0JCQkJbnVsbCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8Q2xhc3M8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyPj4gYnVpbGRDb252ZXJ0ZXJUeXBlTGlzdEhvbGRlcigpIHsKLQkJCXJldHVybiBuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8Q2xhc3M8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyPj4oRWNsaXBzZUxpbmtDb252ZXJ0ZXIuVFlQRVMpOwotCQl9Ci0JCQotCQlwcml2YXRlIFN0cmluZ0NvbnZlcnRlcjxDbGFzczw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+PiBidWlsZFN0cmluZ0NvbnZlcnRlcigpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPENsYXNzPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRlcj4+KCkgewotCQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKENsYXNzPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRlcj4gdmFsdWUpIHsKLQkJCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJCWlmICh2YWx1ZSA9PSBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5jbGFzcykgewotCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlX2N1c3RvbUNvbnZlcnRlcjsKLQkJCQkJfQotCQkJCQlpZiAodmFsdWUgPT0gRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzKSB7Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfb2JqZWN0VHlwZUNvbnZlcnRlcjsKLQkJCQkJfQotCQkJCQlpZiAodmFsdWUgPT0gRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3MpIHsKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV9zdHJ1Y3RDb252ZXJ0ZXI7Ci0JCQkJCX0KLQkJCQkJaWYgKHZhbHVlID09IEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5jbGFzcykgewotCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlX3R5cGVDb252ZXJ0ZXI7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHZhbHVlLmdldFNpbXBsZU5hbWUoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVIb2xkZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdC5OQU1FX1BST1BFUlRZKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxDbGFzczw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+PiBidWlsZENvbnZlcnRlclR5cGVIb2xkZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0LCBDbGFzczw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+PihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3QuQ09OVkVSVEVSX1RZUEVfUFJPUEVSVFkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgQ2xhc3M8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyPiBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb252ZXJ0ZXJUeXBlKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKENsYXNzPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRlcj4gdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldENvbnZlcnRlclR5cGUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQl2b2lkIHNlbGVjdEFsbCgpIHsKLQkJCXRoaXMubmFtZVRleHQuc2VsZWN0QWxsKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGYxYmYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlLkFic3RyYWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlLlByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHN0YXRlIG9iamVjdCB1c2VkIGJ5IHRoZSA8Y29kZT5FY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZzwvY29kZT4sIHdoaWNoIHN0b3JlcwotICogdGhlIGN1cnJlbnQgbmFtZSBhbmQgdmFsaWRhdGVzIGl0IHdoZW4gaXQgaXMgbW9kaWZpZWQuCi0gKgotICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZwotICoKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDIuMQotICovCi1maW5hbCBjbGFzcyBFY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0IGV4dGVuZHMgQWJzdHJhY3ROb2RlCi17Ci0JLyoqCi0JICogVGhlIGluaXRpYWwgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiBUaGUgaW5pdGlhbCBjb252ZXJ0ZXJUeXBlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBDbGFzczw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGNvbnZlcnRlclR5cGU7Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+VmFsaWRhdG9yPC9jb2RlPiB1c2VkIHRvIHZhbGlkYXRlIHRoaXMgc3RhdGUgb2JqZWN0LgotCSAqLwotCXByaXZhdGUgVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQkKLQkvKioKLQkgKiBUaGUgYXNzb2NpYXRlZCBjb252ZXJ0ZXIgY29udGFpbmVyCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBjb252ZXJ0ZXJDb250YWluZXI7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyBhIGNoYW5nZSBpbiB0aGUgZGF0YSB2YWx1ZSBwcm9wZXJ0eS4KLQkgKi8KLQlzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBOb3RpZmllcyBhIGNoYW5nZSBpbiB0aGUgb2JqZWN0IHZhbHVlIHByb3BlcnR5LgotCSAqLwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVEVSX1RZUEVfUFJPUEVSVFkgPSAiY29udmVydGVyVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdChFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBjb252ZXJ0ZXJDb250YWluZXIpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyID0gY29udmVydGVyQ29udGFpbmVyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhZGROdW1iZXJPZkNvbnZlcnRlcnNQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7Ci0JCWlmICh0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5nZXROdW1iZXJTdXBwb3J0ZWRDb252ZXJ0ZXJzKCkgPD0gdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuZ2V0Q29udmVydGVyc1NpemUoKSkgewotCQkJY3VycmVudFByb2JsZW1zLmFkZCgKLQkJCQlidWlsZFByb2JsZW0oCi0JCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlX21heENvbnZlcnRlcnNFcnJvck1lc3NhZ2UsIAotCQkJCQlJTWVzc2FnZVByb3ZpZGVyLkVSUk9SLAotCQkJCQlJbnRlZ2VyLnZhbHVlT2YodGhpcy5jb252ZXJ0ZXJDb250YWluZXIuZ2V0TnVtYmVyU3VwcG9ydGVkQ29udmVydGVycygpKSkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGROYW1lUHJvYmxlbXNUbyhMaXN0PFByb2JsZW0+IGN1cnJlbnRQcm9ibGVtcykgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLm5hbWUpKSB7Ci0JCQljdXJyZW50UHJvYmxlbXMuYWRkKGJ1aWxkUHJvYmxlbShFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3RfbmFtZU11c3RCZVNwZWNpZmllZCwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUikpOwotCQl9IAotCQllbHNlIGlmIChuYW1lcygpLmNvbnRhaW5zKHRoaXMubmFtZSkpIHsKLQkJCWN1cnJlbnRQcm9ibGVtcy5hZGQoYnVpbGRQcm9ibGVtKEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdF9uYW1lRXhpc3RzLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpKTsKLQkJfSBlbHNlIGlmIChBcnJheVRvb2xzLmNvbnRhaW5zKEVjbGlwc2VMaW5rQ29udmVydC5SRVNFUlZFRF9DT05WRVJURVJfTkFNRVMsIHRoaXMubmFtZSkpIHsKLQkJCWN1cnJlbnRQcm9ibGVtcy5hZGQoYnVpbGRQcm9ibGVtKEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdF9uYW1lSXNSZXNlcnZlZCwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUikpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENvbnZlcnRlclR5cGVQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7Ci0JCWlmICh0aGlzLmNvbnZlcnRlclR5cGUgPT0gbnVsbCkgewotCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0X3R5cGVNdXN0QmVTcGVjaWZpZWQsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpIHsKLQkJc3VwZXIuYWRkUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCQlib29sZWFuIGNvbnRpbnVlVmFsaWRhdGluZyA9IHRoaXMuYWRkTnVtYmVyT2ZDb252ZXJ0ZXJzUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCQlpZiAoY29udGludWVWYWxpZGF0aW5nKSB7Ci0JCQl0aGlzLmFkZE5hbWVQcm9ibGVtc1RvKGN1cnJlbnRQcm9ibGVtcyk7Ci0JCQl0aGlzLmFkZENvbnZlcnRlclR5cGVQcm9ibGVtc1RvKGN1cnJlbnRQcm9ibGVtcyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gbmFtZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBuYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKEVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlciA6IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0QWxsQ29udmVydGVycygpKXsKLQkJCW5hbWVzLmFkZChjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gbmFtZXMgOwotCX0KLQotCXByaXZhdGUgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSB0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1BhcmVudChOb2RlIHBhcmVudE5vZGUpIHsKLQkJLy9ubyBwYXJlbnQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCVN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCUNsYXNzPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRlcj4gZ2V0Q29udmVydGVyVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlclR5cGUoQ2xhc3M8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyPiBuZXdDb252ZXJ0ZXJUeXBlKSB7Ci0JCUNsYXNzPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRlcj4gb2xkQ29udmVydGVyVHlwZSA9IHRoaXMuY29udmVydGVyVHlwZTsKLQkJdGhpcy5jb252ZXJ0ZXJUeXBlID0gbmV3Q29udmVydGVyVHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfVFlQRV9QUk9QRVJUWSwgb2xkQ29udmVydGVyVHlwZSwgbmV3Q29udmVydGVyVHlwZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnZhbGlkYXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmZDQzOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuZGIuQ2F0YWxvZ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5TY2hlbWFDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBhY2thZ2VDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUXVlcmllc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5FbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnMyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybVF1ZXJpZXMyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFhtbFBhY2thZ2VDaG9vc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgU2NoZW1hOiAgICAgIHwgU2NoZW1hQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQ2F0YWxvZzogICAgIHwgQ2F0YWxvZ0NvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQWNjZXNzIFR5cGU6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcm1RdWVyaWVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENvbnZlcnRlcnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eU1hcHBpbmdzCi0gKiBAc2VlIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUGFnZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIENhdGFsb2dDb21ibwotICogQHNlZSBFbnVtRm9ybUNvbWJvVmlld2VyCi0gKiBAc2VlIEVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZQotICogQHNlZSBPcm1QYWNrYWdlQ2hvb3NlcgotICogQHNlZSBPcm1RdWVyaWVzQ29tcG9zaXRlCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlCi0gKiBAc2VlIFNjaGVtYUNvbWJvCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1BhZ2UgZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUGFnZShDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmF0b3JzQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVudGl0eU1hcHBpbmdzR2VuZXJhdG9yczJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVRdWVyaWVzQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9ybVF1ZXJpZXMyXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRjYzlmNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhRGV0YWlsc1BhZ2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSB7QGxpbmsgSnBhRGV0YWlsc1BhZ2VNYW5hZ2VyfQotICogd2hlbiB0aGUgaW5mb3JtYXRpb24gY29tZXMgZnJvbSB0aGUgWE1MIGZpbGUgKGVpdGhlciBmcm9tIHRoZSBwZXJzaXN0ZW5jZQotICogY29uZmlndXJhdGlvbiBvciBmcm9tIHRoZSBNYXBwaW5ncyBEZXNjcmlwdG9yKS4KLSAqCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFEZXRhaWxzUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlcigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFEZXRhaWxzUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHByb3ZpZGVzRGV0YWlscyhKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiByZXNvdXJjZVR5cGUuZXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzJfMF9SRVNPVVJDRV9UWVBFKSB8fAotCQkJcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8yXzFfUkVTT1VSQ0VfVFlQRSkgfHwKLQkJCXJlc291cmNlVHlwZS5lcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMl8yX1JFU09VUkNFX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgSnBhRGV0YWlsc1BhZ2VNYW5hZ2VyPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPiBidWlsZERldGFpbHNQYWdlTWFuYWdlcigKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1BhZ2UocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzNEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8zRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1ZjQzYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzNEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5FbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnMyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybVF1ZXJpZXMyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFhtbFBhY2thZ2VDaG9vc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgU2NoZW1hOiAgICAgIHwgU2NoZW1hQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQ2F0YWxvZzogICAgIHwgQ2F0YWxvZ0NvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQWNjZXNzIFR5cGU6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcm1RdWVyaWVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENvbnZlcnRlcnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzNEZXRhaWxzUGFnZSBleHRlbmRzIEFic3RyYWN0RWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2U8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfM0RldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5pbml0aWFsaXplRW50aXR5TWFwcGluZ3NDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplR2VuZXJhdG9yc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVRdWVyaWVzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplTXVsdGl0ZW5hbmN5Q29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYXRvcnNDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzMl8wQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVF1ZXJpZXNDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JtUXVlcmllczJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFY2xpcHNlTGluazJfM1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWJ1aWxkUGVyc2lzdGVudFVuaXRNZXRhZGF0YUhvbGRlcigpLAotCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDUpCi0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU11bHRpdGVuYW5jeUNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKS5nZXRDb250cm9sKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8zRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzNEZXRhaWxzUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEyZTQ0OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzNEZXRhaWxzUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhRGV0YWlsc1BhZ2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSB7QGxpbmsgSnBhRGV0YWlsc1BhZ2VNYW5hZ2VyfQotICogd2hlbiB0aGUgaW5mb3JtYXRpb24gY29tZXMgZnJvbSB0aGUgWE1MIGZpbGUgKGVpdGhlciBmcm9tIHRoZSBwZXJzaXN0ZW5jZQotICogY29uZmlndXJhdGlvbiBvciBmcm9tIHRoZSBNYXBwaW5ncyBEZXNjcmlwdG9yKS4KLSAqCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzNEZXRhaWxzUHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFEZXRhaWxzUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfM0RldGFpbHNQcm92aWRlcigpOwotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhRGV0YWlsc1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfM0RldGFpbHNQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHByb3ZpZGVzRGV0YWlscyhKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiByZXNvdXJjZVR5cGUuZXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzJfM19SRVNPVVJDRV9UWVBFKSB8fAotCQkJcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8yXzRfUkVTT1VSQ0VfVFlQRSk7Ci0JfQotCi0JcHVibGljIEpwYURldGFpbHNQYWdlTWFuYWdlcjw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4gYnVpbGREZXRhaWxzUGFnZU1hbmFnZXIoCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfM0RldGFpbHNQYWdlKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5Mzk0NDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuZGIuQ2F0YWxvZ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5TY2hlbWFDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBhY2thZ2VDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUXVlcmllc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBYbWxQYWNrYWdlQ2hvb3NlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFNjaGVtYTogICAgICB8IFNjaGVtYUNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IENhdGFsb2c6ICAgICB8IENhdGFsb2dDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IEFjY2VzcyBUeXBlOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9ybUdlbmVyYXRvcnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JtUXVlcmllc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDb252ZXJ0ZXJzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbnRpdHlNYXBwaW5ncwotICogQHNlZSBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBDYXRhbG9nQ29tYm8KLSAqIEBzZWUgRW51bUZvcm1Db21ib1ZpZXdlcgotICogQHNlZSBFbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGUKLSAqIEBzZWUgT3JtUGFja2FnZUNob29zZXIKLSAqIEBzZWUgT3JtUXVlcmllc0NvbXBvc2l0ZQotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZQotICogQHNlZSBTY2hlbWFDb21ibwotICoKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlIGV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMzA1ZDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYURldGFpbHNQYWdlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUge0BsaW5rIEpwYURldGFpbHNQYWdlTWFuYWdlcn0KLSAqIHdoZW4gdGhlIGluZm9ybWF0aW9uIGNvbWVzIGZyb20gdGhlIFhNTCBmaWxlIChlaXRoZXIgZnJvbSB0aGUgcGVyc2lzdGVuY2UKLSAqIGNvbmZpZ3VyYXRpb24gb3IgZnJvbSB0aGUgTWFwcGluZ3MgRGVzY3JpcHRvcikuCi0gKgotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhRGV0YWlsc1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhRGV0YWlsc1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm92aWRlc0RldGFpbHMoSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRSkKLQkJCQl8fCByZXNvdXJjZVR5cGUuZXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMV9SRVNPVVJDRV9UWVBFKQotCQkJCXx8IHJlc291cmNlVHlwZS5lcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8yX1JFU09VUkNFX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgSnBhRGV0YWlsc1BhZ2VNYW5hZ2VyPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPiBidWlsZERldGFpbHNQYWdlTWFuYWdlcigKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NTg0ZDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVmFsdWVMaXN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LlJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNDb21wb3NpdGUuVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFbnRpdHlNYXBwaW5ncz4gewotCi0JcHJpdmF0ZSBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0NvbXBvc2l0ZTxFbnRpdHlNYXBwaW5ncz4gdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNDb21wb3NpdGU7Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEVudGl0eU1hcHBpbmdzPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gdGhpcy5hZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfbXVsdGl0ZW5hbmN5Ci0JCSk7Ci0KLQkJLy8gVGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucyBncm91cCBwYW5lCi0JCUdyb3VwIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Hcm91cFBhbmUgPSBhZGRUaXRsZWRHcm91cCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNfZ3JvdXBMYWJlbAotCQkpOwotCi0JCS8vIE92ZXJyaWRlIERlZmF1bHQgVGVuYW50IERpc2NyaW1pbmF0b3IgQ29sdW1ucyBjaGVjayBib3gKLQkJYWRkQ2hlY2tCb3goCi0JCQlhZGRTdWJQYW5lKHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Hcm91cFBhbmUsIDgpLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua011bHRpdGVuYW5jeV9vdmVycmlkZURlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucywKLQkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcigpLAotCQkJbnVsbAotCQkpOwotCi0JCXRoaXMudGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNDb21wb3NpdGUgPSB0aGlzLmJ1aWxkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNDb21wb3NpdGUodGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkdyb3VwUGFuZSk7Ci0KLQkJdGhpcy50ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0NvbXBvc2l0ZS5pbnN0YWxsTGlzdFBhbmVFbmFibGVyKG5ldyBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uUGFuZUVuYWJsZXJIb2xkZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQ29tcG9zaXRlPEVudGl0eU1hcHBpbmdzPiAgYnVpbGRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNDb21wb3NpdGU8RW50aXR5TWFwcGluZ3M+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJY29udGFpbmVyLAotCQkJZ2V0V2lkZ2V0RmFjdG9yeSgpLAotCQkJYnVpbGRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0VkaXRvcigpKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0VkaXRvcjxFbnRpdHlNYXBwaW5ncz4gYnVpbGRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc0VkaXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1Byb3ZpZGVyKCk7Ci0JfQotCi0JY2xhc3MgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNQcm92aWRlciBpbXBsZW1lbnRzIFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zRWRpdG9yPEVudGl0eU1hcHBpbmdzPiB7Ci0KLQkJcHVibGljIHZvaWQgYWRkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihFbnRpdHlNYXBwaW5ncyBzdWJqZWN0KSB7Ci0JCQlPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIGNvbHVtbiA9ICgoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncykgc3ViamVjdCkuYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQkJY29sdW1uLnNldFNwZWNpZmllZE5hbWUoUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLkRFRkFVTFRfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZ2V0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKEVudGl0eU1hcHBpbmdzIHN1YmplY3QpIHsKLQkJCXJldHVybiBuZXcgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4oKChFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzKSBzdWJqZWN0KS5nZXREZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoRW50aXR5TWFwcGluZ3Mgc3ViamVjdCkgewotCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncykgc3ViamVjdCkuZ2V0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvcnNMaXN0UHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MuREVGQVVMVF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFJlYWRPbmx5VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoRW50aXR5TWFwcGluZ3Mgc3ViamVjdCkgewotCQkJcmV0dXJuIG5ldyBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPigoKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MpIHN1YmplY3QpLmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoRW50aXR5TWFwcGluZ3Mgc3ViamVjdCkgewotCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncykgc3ViamVjdCkuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JzTGlzdFByb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzLlNQRUNJRklFRF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyhFbnRpdHlNYXBwaW5ncyBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gKChFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzKSBzdWJqZWN0KS5oYXNTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoRW50aXR5TWFwcGluZ3Mgc3ViamVjdCwgaW50W10gc2VsZWN0ZWRJbmRpY2VzKSB7Ci0JCQlmb3IgKGludCBpbmRleCA9IHNlbGVjdGVkSW5kaWNlcy5sZW5ndGg7IGluZGV4LS0gPiAwOyApIHsKLQkJCQkoKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MpIHN1YmplY3QpLnJlbW92ZVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oc2VsZWN0ZWRJbmRpY2VzW2luZGV4XSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHNldFNlbGVjdGVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbikgewotCQl0aGlzLnRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zQ29tcG9zaXRlLnNldFNlbGVjdGVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbih0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRPdmVycmlkZURlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IE92ZXJyaWRlRGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Ib2xkZXIoKTsKLQl9Ci0KLQlMaXN0VmFsdWVNb2RlbDxSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IGJ1aWxkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVudGl0eU1hcHBpbmdzLCBSZWFkT25seVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+KAotCQkJCWdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncy5TUEVDSUZJRURfVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiBnZXRMaXN0SXRlcmFibGUoKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI8UmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPigoKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MpIHRoaXMuc3ViamVjdCkuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzKSB0aGlzLnN1YmplY3QpLmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgY2xhc3MgT3ZlcnJpZGVEZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkhvbGRlciAKLQkJZXh0ZW5kcyBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPgotCQlpbXBsZW1lbnRzIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gCi0JewotCQlwdWJsaWMgT3ZlcnJpZGVEZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcigpIHsKLQkJCXN1cGVyKGJ1aWxkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNMaXN0SG9sZGVyKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMubGlzdE1vZGVsLnNpemUoKSA+IDApOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSkgewotCQkJdXBkYXRlVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnModmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHVwZGF0ZVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJc2V0UG9wdWxhdGluZyh0cnVlKTsKLQotCQkJdHJ5IHsKLQkJCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIHN1YmplY3QgPSAoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncykgZ2V0U3ViamVjdCgpOwotCi0JCQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQkJCVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzMgbmV3VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbiA9IHN1YmplY3QuYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQkJCQluZXdUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoUmVhZE9ubHlUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zLkRFRkFVTFRfTkFNRSk7Ci0JCQkJfQotCQkJCS8vIFJlbW92ZSBhbGwgdGhlIHNwZWNpZmllZCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zCi0JCQkJZWxzZSB7Ci0JCQkJCWZvciAoaW50IGluZGV4ID0gc3ViamVjdC5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKTsgLS1pbmRleCA+PSAwOyApIHsKLQkJCQkJCXN1YmplY3QucmVtb3ZlU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihpbmRleCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gY2xhc3MgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtblBhbmVFbmFibGVySG9sZGVyIAotCQlleHRlbmRzIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eU1hcHBpbmdzLCBCb29sZWFuPgotCXsKLQkJcHJpdmF0ZSBTdGF0ZUNoYW5nZUxpc3RlbmVyIHN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci0KLQkJVGVuYW50RGlzY3JpbWluYXRvckNvbHVtblBhbmVFbmFibGVySG9sZGVyKCkgewotCQkJc3VwZXIoCi0JCQkJbmV3IFZhbHVlTGlzdEFkYXB0ZXI8RW50aXR5TWFwcGluZ3M+KAotCQkJCQluZXcgUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8RW50aXR5TWFwcGluZ3M+KGdldFN1YmplY3RIb2xkZXIoKSksIAotCQkJCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzLlNQRUNJRklFRF9URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TX0xJU1QKLQkJCQkpCi0JCQkpOwotCQkJdGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJfQotCi0JCXByaXZhdGUgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJVGVuYW50RGlzY3JpbWluYXRvckNvbHVtblBhbmVFbmFibGVySG9sZGVyLnRoaXMudmFsdWVTdGF0ZUNoYW5nZWQoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJdm9pZCB2YWx1ZVN0YXRlQ2hhbmdlZCgpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLnZhbHVlOwotCQkJdGhpcy52YWx1ZSA9IHRoaXMudHJhbnNmb3JtKHRoaXMudmFsdWVNb2RlbC5nZXRWYWx1ZSgpKTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZCwgdGhpcy52YWx1ZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEVudGl0eU1hcHBpbmdzIHYpIHsKLQkJCXJldHVybiAodiA9PSBudWxsKSAgPyBCb29sZWFuLkZBTFNFIDogc3VwZXIudHJhbnNmb3JtKHYpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybV8oRW50aXR5TWFwcGluZ3MgdikgewotCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZigoKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MpIHYpLmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpID4gMCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQkJdGhpcy52YWx1ZU1vZGVsLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJCXRoaXMudmFsdWVNb2RlbC5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcik7Ci0JCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzE1NTNlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwxXzFVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbVRyZWVTdGF0ZVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLlJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uQWJzdHJhY3RPcm1YbWxSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGFibGVVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVudGl0eVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtWG1sVWlEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwxXzFVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVVpRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1YbWwxXzFVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1YbWxVaUZhY3RvcnkgYnVpbGRPcm1YbWxVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1YbWwxXzFVaUZhY3RvcnkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXNVaShKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiByZXNvdXJjZVR5cGUuZXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMV9SRVNPVVJDRV9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIEl0ZW1UcmVlU3RhdGVQcm92aWRlckZhY3RvcnlQcm92aWRlciBnZXRTdHJ1Y3R1cmVWaWV3RmFjdG9yeVByb3ZpZGVyKCkgewotCQlyZXR1cm4gT3JtWG1sVWlEZWZpbml0aW9uLlNUUlVDVFVSRV9WSUVXX0ZBQ1RPUllfUFJPVklERVI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8T3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1CYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8T3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChPcm1FbnRpdHlVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1NYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMV8xVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMV8xVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NGU3NTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDFfMVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sMV8xVWlGYWN0b3J5IGV4dGVuZHMgQmFzZUVjbGlwc2VMaW5rT3JtWG1sVWlGYWN0b3J5Ci17Ci0JLy8gKioqKioqKioqKioqKioqKiBvcm0gYXR0cmlidXRlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUlkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0lkTWFwcGluZzFfMUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVtYmVkZGVkSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcxXzFDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1CYXNpY01hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nMV8xQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtVmVyc2lvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzFfMUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFueVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcxXzFDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMV8xQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzFfMUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcxXzFDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkZWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rRW1iZWRkZWRNYXBwaW5nMV8xQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDFfMlVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDFfMlVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmQ1NmM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbVRyZWVTdGF0ZVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLlJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uQWJzdHJhY3RPcm1YbWxSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGFibGVVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVudGl0eVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtWG1sVWlEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua09ybVhtbDFfMlVpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVVpRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1YbWxVaUZhY3RvcnkgYnVpbGRPcm1YbWxVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1YbWwxXzFVaUZhY3RvcnkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXNVaShKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiByZXNvdXJjZVR5cGUuZXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMl9SRVNPVVJDRV9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIEl0ZW1UcmVlU3RhdGVQcm92aWRlckZhY3RvcnlQcm92aWRlciBnZXRTdHJ1Y3R1cmVWaWV3RmFjdG9yeVByb3ZpZGVyKCkgewotCQlyZXR1cm4gT3JtWG1sVWlEZWZpbml0aW9uLlNUUlVDVFVSRV9WSUVXX0ZBQ1RPUllfUFJPVklERVI7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oCi0JCQlMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zVG8oCi0JCQlMaXN0PE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGFibGVVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDJfMFVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDJfMFVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODJjYmY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzBVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbVRyZWVTdGF0ZVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLlJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uQWJzdHJhY3RPcm1YbWxSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGFibGVVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVudGl0eVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbDJfMFVpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rT3JtWG1sMl8wVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlVWlEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09ybVhtbDJfMFVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybVhtbFVpRmFjdG9yeSBidWlsZE9ybVhtbFVpRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybVhtbDJfMFVpRmFjdG9yeSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlc1VpKEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIHJlc291cmNlVHlwZS5lcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMl8wX1JFU09VUkNFX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgSXRlbVRyZWVTdGF0ZVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyIGdldFN0cnVjdHVyZVZpZXdGYWN0b3J5UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBPcm1YbWxVaURlZmluaXRpb24uU1RSVUNUVVJFX1ZJRVdfRkFDVE9SWV9QUk9WSURFUjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8T3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1CYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zVG8oCi0JCQlMaXN0PE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGFibGVVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDJfMFVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDJfMFVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTY0MjYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzBVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmpwYTIuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sMl8wVWlGYWN0b3J5IAotCWV4dGVuZHMgQmFzZUVjbGlwc2VMaW5rT3JtWG1sVWlGYWN0b3J5Ci0JaW1wbGVtZW50cyBPcm1YbWxVaUZhY3RvcnkyXzAKLXsKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVudGl0eUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtFbnRpdHkyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU1hcHBlZFN1cGVyY2xhc3M+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCS8vICoqKioqKioqKioqKioqKiogb3JtIGF0dHJpYnV0ZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUlkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1JZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkZWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rRW1iZWRkZWRNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtFbWJlZGRlZElkTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1CYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcxXzFDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1WZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nMV8xQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1PbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8xVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8xVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWM3ZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDJfMVVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtVHJlZVN0YXRlUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5BYnN0cmFjdE9ybVhtbFJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW50aXR5VWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1YbWxVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sMl8xVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbFJlc291cmNlVWlEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VVaURlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtPcm1YbWwyXzFVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtPcm1YbWwyXzFVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1YbWxVaUZhY3RvcnkgYnVpbGRPcm1YbWxVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1YbWwyXzFVaUZhY3RvcnkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXNVaShKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiByZXNvdXJjZVR5cGUuZXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzJfMV9SRVNPVVJDRV9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIEl0ZW1UcmVlU3RhdGVQcm92aWRlckZhY3RvcnlQcm92aWRlciBnZXRTdHJ1Y3R1cmVWaWV3RmFjdG9yeVByb3ZpZGVyKCkgewotCQlyZXR1cm4gT3JtWG1sVWlEZWZpbml0aW9uLlNUUlVDVFVSRV9WSUVXX0ZBQ1RPUllfUFJPVklERVI7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKExpc3Q8T3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVudGl0eVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzFVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzFVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM3ZjdlOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8xVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sMl8xVWlGYWN0b3J5IAotCWV4dGVuZHMgRWNsaXBzZUxpbmtPcm1YbWwyXzBVaUZhY3RvcnkKLXsKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfMUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzJVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzJVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZlYjcxMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8yVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sMl8yVWlEZWZpbml0aW9uIGV4dGVuZHMgRWNsaXBzZUxpbmtPcm1YbWwyXzFVaURlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua09ybVhtbDJfMlVpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVVpRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1YbWwyXzJVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzVWkoSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8yXzJfUkVTT1VSQ0VfVFlQRSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDJfM1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDJfM1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDU5ZGU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzNVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1JZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb247Ci0KLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sMl8zVWlEZWZpbml0aW9uCi0JCWV4dGVuZHMgRWNsaXBzZUxpbmtPcm1YbWwyXzFVaURlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rT3JtWG1sMl8zVWlEZWZpbml0aW9uKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVVpRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rT3JtWG1sMl8zVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1YbWxVaUZhY3RvcnkgYnVpbGRPcm1YbWxVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1YbWwyXzNVaUZhY3RvcnkoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlc1VpKEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIHJlc291cmNlVHlwZS5lcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMl8zX1JFU09VUkNFX1RZUEUpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1CYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCi0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzNVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua1N0cnVjdHVyZU1hcHBpbmcyXzNVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDJfM1VpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDJfM1VpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTBjZTVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzNVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sMl8zVWlGYWN0b3J5IAotCWV4dGVuZHMgRWNsaXBzZUxpbmtPcm1YbWwyXzBVaUZhY3RvcnkKLXsKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVudGl0eUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtFbnRpdHkyXzNDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzNDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl80VWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl80VWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmY2YwYTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDJfNFVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1CYXNpY01hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwyXzRVaURlZmluaXRpb24KLQkJZXh0ZW5kcyBFY2xpcHNlTGlua09ybVhtbDJfMVVpRGVmaW5pdGlvbiB7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua09ybVhtbDJfNFVpRGVmaW5pdGlvbigpOwotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09ybVhtbDJfNFVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtWG1sVWlGYWN0b3J5IGJ1aWxkT3JtWG1sVWlGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtWG1sMl8zVWlGYWN0b3J5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXNVaShKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiByZXNvdXJjZVR5cGUuZXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzJfNF9SRVNPVVJDRV9UWVBFKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKExpc3Q8T3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1JZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1NYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0KLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCi0JCWRlZmluaXRpb25zLmFkZChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua0FycmF5TWFwcGluZzJfM1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfM1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2RhNDE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtVHJlZVN0YXRlUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5BYnN0cmFjdE9ybVhtbFJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW50aXR5VWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1YbWxVaURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rT3JtWG1sVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlVWlEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybVhtbFVpRmFjdG9yeSBidWlsZE9ybVhtbFVpRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybVhtbFVpRmFjdG9yeSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlc1VpKEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIHJlc291cmNlVHlwZS5lcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8wX1JFU09VUkNFX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgSXRlbVRyZWVTdGF0ZVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyIGdldFN0cnVjdHVyZVZpZXdGYWN0b3J5UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBPcm1YbWxVaURlZmluaXRpb24uU1RSVUNUVVJFX1ZJRVdfRkFDVE9SWV9QUk9WSURFUjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8T3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1CYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwkJCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKAotCQkJTGlzdDxPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVudGl0eVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWxVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWxVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZlMzAwYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sVWlGYWN0b3J5IGV4dGVuZHMgQmFzZUVjbGlwc2VMaW5rT3JtWG1sVWlGYWN0b3J5Ci17Ci0JLy9ub3RoaW5nCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUF0dHJpYnV0ZVR5cGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtQXR0cmlidXRlVHlwZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTE5ZjdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtQXR0cmlidXRlVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5yZWZhY3RvcmluZy5jb250ZW50YXNzaXN0LkphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtBY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUF0dHJpYnV0ZVR5cGVDb21wb3NpdGUKLQlleHRlbmRzIENsYXNzQ2hvb3NlclBhbmU8QXR0cmlidXRlTWFwcGluZz4KLXsKLQlwdWJsaWMgT3JtQXR0cmlidXRlVHlwZUNvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXRoaXMocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBidWlsZFZpcnR1YWxBdHRyaWJ1dGVNb2RlbChzdWJqZWN0SG9sZGVyKSk7Ci0JfQotCi0JcHVibGljIE9ybUF0dHJpYnV0ZVR5cGVDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGVuYWJsZWRNb2RlbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvciBidWlsZEphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJcmV0dXJuIG5ldyBKYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3IodHJ1ZSwgdHJ1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLk9ybUF0dHJpYnV0ZVR5cGVDb21wb3NpdGVfYXR0cmlidXRlVHlwZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QXR0cmlidXRlTWFwcGluZywgU3RyaW5nPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwgCi0JCQlPcm1BdHRyaWJ1dGVNYXBwaW5nLkRFRkFVTFRfQVRUUklCVVRFX1RZUEVfUFJPUEVSVFksCi0JCQlPcm1BdHRyaWJ1dGVNYXBwaW5nLlNQRUNJRklFRF9BVFRSSUJVVEVfVFlQRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFR5cGVOYW1lKCk7Ci0JCQkJfQotCQkJCS8vZ2V0IHRoZSBhdHRyaWJ1dGVUeXBlIGluc3RlYWQgb2YgdGhlIHNwZWNpZmllZEF0dHJpYnV0ZVR5cGUuCi0JCQkJLy90aGlzIHdpZGdldCB3aWxsIG9ubHkgYmUgZW5hYmxlZCBpZiB0aGUgbWFwcGluZyBpcyBWSVJUVUFMIGFjY2VzcyAKLQkJCQkvL3NvIHdlIGRvbid0IG5lZWQgdG8gZGlzcGxheSB0aGUgZGVmYXVsdCBkaWZmZXJlbnRseQotCQkJCXJldHVybiAoKE9ybUF0dHJpYnV0ZU1hcHBpbmcpIHRoaXMuc3ViamVjdCkuZ2V0QXR0cmlidXRlVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJLy8gd2UgY2FuIHNhZmVseSBjYXN0IHRvIGFuIG9ybS54bWwgbWFwcGluZyBzaW5jZSBpdCBpcyBub3QgdmlydHVhbAotCQkJCSgoT3JtQXR0cmlidXRlTWFwcGluZykgdGhpcy5zdWJqZWN0KS5zZXRTcGVjaWZpZWRBdHRyaWJ1dGVUeXBlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuICgoT3JtQXR0cmlidXRlTWFwcGluZykgZ2V0U3ViamVjdCgpKS5nZXRBdHRyaWJ1dGVUeXBlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJKChPcm1BdHRyaWJ1dGVNYXBwaW5nKSBnZXRTdWJqZWN0KCkpLnNldFNwZWNpZmllZEF0dHJpYnV0ZVR5cGUoY2xhc3NOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4gbWFwcGluZ0hvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxBdHRyaWJ1dGVNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KG1hcHBpbmdIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRWaXJ0dWFsQXR0cmlidXRlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPiBtYXBwaW5nSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEFjY2Vzc0hvbGRlciwgQm9vbGVhbj4oCi0JCQlidWlsZEFjY2Vzc0hvbGRlckhvbGRlcihtYXBwaW5nSG9sZGVyKSwKLQkJCUFjY2Vzc0hvbGRlci5TUEVDSUZJRURfQUNDRVNTX1BST1BFUlRZLAotCQkJQWNjZXNzSG9sZGVyLkRFRkFVTFRfQUNDRVNTX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlKCkgewotCQkJCQlpZiAodGhpcy5zdWJqZWN0ID09IG51bGwpIHsKLQkJCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQkJCQl9Ci0JCQkJCXJldHVybiB0aGlzLmJ1aWxkVmFsdWVfKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRBY2Nlc3MoKSA9PSBFY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0FycmF5TWFwcGluZzJfM1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0FycmF5TWFwcGluZzJfM1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDAwMGFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzNVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0FycmF5TWFwcGluZzJfM0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0FycmF5TWFwcGluZzJfM1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua0FycmF5TWFwcGluZzJfM1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zPgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxFY2xpcHNlTGlua0FycmF5TWFwcGluZzJfMz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1FY2xpcHNlTGlua0FycmF5TWFwcGluZzJfM1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQluZXcgT3JtRWNsaXBzZUxpbmtBcnJheU1hcHBpbmcyXzNVaURlZmluaXRpb24oKTsKLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE9ybUVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksIAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zPiBzdWJqZWN0SG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQXJyYXlNYXBwaW5nMl8zQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZWZmNzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzFfMUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklNYW55VG9PbmVNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzFfMUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkN2ViNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc+Ci0JaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCU9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmM4Mzk1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICoKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcxXzFDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklNYW55VG9PbmVNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nMV8xQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOwotCX0JCi0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMWJlNWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc+Ci0JaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248RWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZDhkYmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkNvbHVtbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzFfMUNvbXBvc2l0ZSBleHRlbmRzIEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlPEJhc2ljTWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rMV8xT3JtQmFzaWNNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+QmFzaWNNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nMV8xQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpbml0aWFsaXplQmFzaWNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZVR5cGVDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQmFzaWNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IENvbHVtbkNvbXBvc2l0ZSh0aGlzLCBidWlsZENvbHVtbkhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ybUF0dHJpYnV0ZVR5cGVDb21wb3NpdGUodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNCkpOwotCQluZXcgRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkTXV0YWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QmFzaWNNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMWZjMjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkNvbHVtbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlPEJhc2ljTWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rT3JtQmFzaWNNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+QmFzaWNNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCYXNpY1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3JtQXR0cmlidXRlVHlwZUNvbXBvc2l0ZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGFkZFN1YlBhbmUoY29udGFpbmVyLCA0KSk7Ci0JCW5ldyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGUodGhpcywgYnVpbGRNdXRhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDVmM2NlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHBhbmUgc2hvd3MgdGhlIGNhY2hpbmcgb3B0aW9ucy4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCB4IFNoYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgQ2FjaGVUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIENhY2hlU2l6ZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICA+IEFkdmFuY2VkICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIAlFeHBpcnlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJQWx3YXlzUmVmcmVzaENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAJCVJlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIAlEaXNhYmxlSGl0c0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJQ2FjaGVDb29yZGluYXRpb25Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgRXhpc3RlbmNlVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5Ci0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZwotICogQHNlZSBKYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZQotICogQHNlZSBFY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZQotICogQHNlZSBFY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlIGV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlPE9ybUVjbGlwc2VMaW5rQ2FjaGluZz4KLXsKLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLAotICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRWNsaXBzZUxpbmtDYWNoaW5nPiBzdWJqZWN0SG9sZGVyLAotICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQluZXcgT3JtRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZSh0aGlzLCBwYXJlbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwZGQyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYW5lIHNob3dzIHRoZSBjYWNoaW5nIG9wdGlvbnMuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgeCBTaGFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIENhY2hlVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICBDYWNoZVNpemVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgPiBBZHZhbmNlZCAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRXhwaXJ5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUFsd2F5c1JlZnJlc2hDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgCQlSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRGlzYWJsZUhpdHNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUNhY2hlQ29vcmRpbmF0aW9uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEV4aXN0ZW5jZVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZSBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZTxPcm1FY2xpcHNlTGlua0NhY2hpbmc+Ci17Ci0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLSAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVjbGlwc2VMaW5rQ2FjaGluZz4gc3ViamVjdEhvbGRlciwKLSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUV4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbmV3IE9ybUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUodGhpcywgcGFyZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzUzMjUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29udmVydGlibGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5UYXJnZXRDbGFzc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZQotCWV4dGVuZHMgRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGU8RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmsxXzFPcm1CYXNpY01hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5CYXNpY01hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVsZW1lbnRDb2xsZWN0aW9uU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRDbGFzc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ybUF0dHJpYnV0ZVR5cGVDb21wb3NpdGUodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBDb2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGUodGhpcywgYnVpbGRDb2xsZWN0aW9uVGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCwgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQmFzaWNWYWx1ZVR5cGVTZWN0aW9uKENvbXBvc2l0ZSB0eXBlU2VjdGlvbikgewotCQlzdXBlci5pbml0aWFsaXplQmFzaWNWYWx1ZVR5cGVTZWN0aW9uKHR5cGVTZWN0aW9uKTsKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyID0gYnVpbGRDb252ZXJ0ZXJIb2xkZXIoKTsKLQotCQkvLyBFY2xpcHNlTGluayBDb252ZXJ0ZXIKLQkJQnV0dG9uIGVsQ29udmVydGVyQnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCi0JCQl0eXBlU2VjdGlvbiwgCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX2NvbnZlcnRlZCwgCi0JCQlidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzKSwgCi0JCQludWxsKTsKLQkJKChHcmlkRGF0YSkgZWxDb252ZXJ0ZXJCdXR0b24uZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJUGFuZTxFY2xpcHNlTGlua0NvbnZlcnQ+IGNvbnZlcnRDb21wb3NpdGUgPSBidWlsZENvbnZlcnRDb21wb3NpdGUoYnVpbGRFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcihjb252ZXJ0ZXJIb2xkZXIpLCB0eXBlU2VjdGlvbik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gKEdyaWREYXRhKSBjb252ZXJ0Q29tcG9zaXRlLmdldENvbnRyb2woKS5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQlyZWdpc3RlclN1YlBhbmUoY29udmVydENvbXBvc2l0ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IGJ1aWxkQ29udmVydGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb252ZXJ0aWJsZU1hcHBpbmcsIENvbnZlcnRlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb252ZXJ0ZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb252ZXJ0ZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIoZmluYWwgQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gY29udmVydGVyVHlwZSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb252ZXJ0aWJsZU1hcHBpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29udmVydGlibGVNYXBwaW5nLkNPTlZFUlRFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlDb252ZXJ0ZXIgY29udmVydGVyID0gdGhpcy5zdWJqZWN0LmdldENvbnZlcnRlcigpOwotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoY29udmVydGVyLmdldFR5cGUoKSA9PSBjb252ZXJ0ZXJUeXBlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0Q29udmVydGVyKGNvbnZlcnRlclR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGFuZTxFY2xpcHNlTGlua0NvbnZlcnQ+IGJ1aWxkQ29udmVydENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0PiBjb252ZXJ0SG9sZGVyLCBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlKGNvbnZlcnRIb2xkZXIsIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydD4gYnVpbGRFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXIsIEVjbGlwc2VMaW5rQ29udmVydD4oY29udmVydGVySG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NvbnZlcnQgdHJhbnNmb3JtXyhDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCQkJcmV0dXJuIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzID8gKEVjbGlwc2VMaW5rQ29udmVydCkgY29udmVydGVyIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzAyNmYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzFDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29udmVydGlibGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5Db2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuVGFyZ2V0Q2xhc3NDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzFDb21wb3NpdGUKLQlleHRlbmRzIEVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlPEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rMV8xT3JtQmFzaWNNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+QmFzaWNNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8xQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbGVtZW50Q29sbGVjdGlvblNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0Q2xhc3NDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1BdHRyaWJ1dGVUeXBlQ29tcG9zaXRlKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZSh0aGlzLCBidWlsZENvbGxlY3Rpb25UYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtKb2luRmV0Y2g+IGJ1aWxkSm9pbkZldGNoSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAsIEVjbGlwc2VMaW5rSm9pbkZldGNoPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSB0aGlzLnN1YmplY3QpLmdldEpvaW5GZXRjaCgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCYXNpY1ZhbHVlVHlwZVNlY3Rpb24oQ29tcG9zaXRlIHR5cGVTZWN0aW9uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVCYXNpY1ZhbHVlVHlwZVNlY3Rpb24odHlwZVNlY3Rpb24pOwotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIgPSBidWlsZENvbnZlcnRlckhvbGRlcigpOwotCi0JCS8vIEVjbGlwc2VMaW5rIENvbnZlcnRlcgotCQlCdXR0b24gZWxDb252ZXJ0ZXJCdXR0b24gPSBhZGRSYWRpb0J1dHRvbigKLQkJCXR5cGVTZWN0aW9uLCAKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fY29udmVydGVkLCAKLQkJCWJ1aWxkQ29udmVydGVyQm9vbGVhbkhvbGRlcihFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpLCAKLQkJCW51bGwpOwotCQkoKEdyaWREYXRhKSBlbENvbnZlcnRlckJ1dHRvbi5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQlQYW5lPEVjbGlwc2VMaW5rQ29udmVydD4gY29udmVydENvbXBvc2l0ZSA9IGJ1aWxkQ29udmVydENvbXBvc2l0ZShidWlsZEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyKGNvbnZlcnRlckhvbGRlciksIHR5cGVTZWN0aW9uKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIGNvbnZlcnRDb21wb3NpdGUuZ2V0Q29udHJvbCgpLmdldExheW91dERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCXJlZ2lzdGVyU3ViUGFuZShjb252ZXJ0Q29tcG9zaXRlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbnZlcnRpYmxlTWFwcGluZywgQ29udmVydGVyPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbnZlcnRpYmxlTWFwcGluZy5DT05WRVJURVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbnZlcnRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbnZlcnRlcigpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ29udmVydGVyQm9vbGVhbkhvbGRlcihmaW5hbCBDbGFzczw/IGV4dGVuZHMgQ29udmVydGVyPiBjb252ZXJ0ZXJUeXBlKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbnZlcnRpYmxlTWFwcGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCUNvbnZlcnRlciBjb252ZXJ0ZXIgPSB0aGlzLnN1YmplY3QuZ2V0Q29udmVydGVyKCk7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IGNvbnZlcnRlclR5cGUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRDb252ZXJ0ZXIoY29udmVydGVyVHlwZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBQYW5lPEVjbGlwc2VMaW5rQ29udmVydD4gYnVpbGRDb252ZXJ0Q29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnQ+IGNvbnZlcnRIb2xkZXIsIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUoY29udmVydEhvbGRlciwgY29udGFpbmVyLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0PiBidWlsZEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlciwgRWNsaXBzZUxpbmtDb252ZXJ0Pihjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ29udmVydCB0cmFuc2Zvcm1fKENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJCQlyZXR1cm4gY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MgPyAoRWNsaXBzZUxpbmtDb252ZXJ0KSBjb252ZXJ0ZXIgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxMmJjOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0VtYmVkZGFibGVBZHZhbmNlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVtYmVkZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5NZXRhZGF0YUNvbXBsZXRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtSmF2YUNsYXNzQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYW5lIGRvZXMgbm90IGhhdmUgYW55IHdpZGdldHMuCi0gKgotICogQHNlZSBFbWJlZGRhYmxlCi0gKiBAc2VlIEVtYmVkZGFibGVVaVByb3ZpZGVyCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0RW1iZWRkYWJsZUNvbXBvc2l0ZTxPcm1FbWJlZGRhYmxlPgotCWltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbWJlZGRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVFbWJlZGRhYmxlQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVBZHZhbmNlZENvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbWJlZGRhYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcm1KYXZhQ2xhc3NDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE1ldGFkYXRhQ29tcGxldGVDb21wb3NpdGUodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybUVtYmVkZGFibGUsIEFjY2Vzc0hvbGRlcj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfY29udmVydGVycwotCQkpOwotCQlpbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oY29udGFpbmVyLCB0aGlzLmJ1aWxkQ29udmVydGVyQ29udGFpbmVyTW9kZWwoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUodGhpcywgY29udmVydGVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4gYnVpbGRDb252ZXJ0ZXJDb250YWluZXJNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtRW1iZWRkYWJsZSwgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSB0aGlzLnN1YmplY3QpLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQWR2YW5jZWRDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRWNsaXBzZUxpbmtFbWJlZGRhYmxlQWR2YW5jZWRDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGVkSWRNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE1Y2NkYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0VtYmVkZGVkSWRNYXBwaW5nMV8xQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlPEVtYmVkZGVkSWRNYXBwaW5nPgotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0VtYmVkZGVkSWRNYXBwaW5nMV8xQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFbWJlZGRlZElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbWJlZGRlZElkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3JtQXR0cmlidXRlVHlwZUNvbXBvc2l0ZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0KLQkJbmV3IEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZSgKLQkJCQl0aGlzLAotCQkJCWNvbnRhaW5lcik7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVtYmVkZGVkSWRNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbWJlZGRlZElkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MzNmMzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5FbWJlZGRlZElkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0VtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBPcm1FY2xpcHNlTGlua0VtYmVkZGVkSWRNYXBwaW5nMV8xQ29tcG9zaXRlCi17Ci0JcHVibGljIE9ybUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVtYmVkZGVkSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVtYmVkZGVkSWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1BdHRyaWJ1dGVUeXBlQ29tcG9zaXRlKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJCi0JCW5ldyBFbWJlZGRlZElkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBFbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkZWRNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkZWRNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YWYyODQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGVkTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5FbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEVtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVtYmVkZGVkTWFwcGluZwotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtFbWJlZGRlZE1hcHBpbmcxXzFDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0RW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlPEVtYmVkZGVkTWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkVtYmVkZGVkTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0VtYmVkZGVkTWFwcGluZzFfMUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVtYmVkZGVkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW1iZWRkZWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1BdHRyaWJ1dGVUeXBlQ29tcG9zaXRlKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQotCQluZXcgRW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWNvbnRhaW5lcgotCQkpOwotCX0JCi0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbWJlZGRlZE1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbWJlZGRlZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbWJlZGRlZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM1ZjU5OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkZWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuQmFzZUphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuRW1iZWRkZWRNYXBwaW5nMl8wT3ZlcnJpZGVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBFbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbWJlZGRlZE1hcHBpbmcKLSAqIEBzZWUgQmFzZUphdmFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rRW1iZWRkZWRNYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTxFbWJlZGRlZE1hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5FbWJlZGRlZE1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtFbWJlZGRlZE1hcHBpbmcyXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW1iZWRkZWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1BdHRyaWJ1dGVUeXBlQ29tcG9zaXRlKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQotCQluZXcgRW1iZWRkZWRNYXBwaW5nMl8wT3ZlcnJpZGVzQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWNvbnRhaW5lcgotCQkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1iZWRkZWRNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW50aXR5Ml8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW50aXR5Ml8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MGJkMDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VudGl0eTJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0VudGl0eTJfMENvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtFbnRpdHkyX3hDb21wb3NpdGUKLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtFbnRpdHkyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VudGl0eTJfM0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VudGl0eTJfM0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjE5NWEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbnRpdHkyXzNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua011bHRpdGVuYW5jeUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0VudGl0eTJfM0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtFbnRpdHkyX3hDb21wb3NpdGUKLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtFbnRpdHkyXzNDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVFbnRpdHlDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplQ2FjaGluZ0NvbGxhcHNpYmxlU2VjdGlvblBhbmUoY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplUXVlcmllc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVJbmhlcml0YW5jZUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVBdHRyaWJ1dGVPdmVycmlkZXNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplTXVsdGl0ZW5hbmN5Q29sbGFwc2libGVTZWN0aW9uUGFuZShjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVHZW5lcmF0b3JzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplU2Vjb25kYXJ5VGFibGVzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUFkdmFuY2VkQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU11bHRpdGVuYW5jeUNvbGxhcHNpYmxlU2VjdGlvblBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9tdWx0aXRlbmFuY3kpOwotCQlpbml0aWFsaXplTXVsdGl0ZW5hbmN5U2VjdGlvbihjb250YWluZXIsIGJ1aWxkTXVsdGl0ZW5hbmN5SG9sZGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNdWx0aXRlbmFuY3lTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMz4gbXVsdGl0ZW5hbmN5SG9sZGVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua011bHRpdGVuYW5jeUNvbXBvc2l0ZSh0aGlzLCBtdWx0aXRlbmFuY3lIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtRW50aXR5LCBPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMz4gYnVpbGRNdWx0aXRlbmFuY3lIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybUVudGl0eSwgT3JtRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzM+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIHRoaXMuc3ViamVjdCkuZ2V0TXVsdGl0ZW5hbmN5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTY5NDc0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlCi17Ci0JcHVibGljIE9ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1FbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OTA4MWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgCQkJICAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB4IEV4aXN0ZW5jZSBDaGVja2luZzogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAJCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nCi0gKiBAc2VlIENhY2hpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtDYWNoaW5nPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkV4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKCAKLSAgICAgICAgICAgIGNvbnRhaW5lciwgCi0gICAgICAgICAgICBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfbGFiZWwsCi0gICAgICAgICAgICBhZGRFeGlzdGVuY2VDaGVja2luZ1R5cGVDb21ibyhjb250YWluZXIpLmdldENvbnRyb2woKSwgCi0gICAgICAgICAgICBudWxsIAotICAgICAgICk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPEVjbGlwc2VMaW5rQ2FjaGluZywgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlPiBhZGRFeGlzdGVuY2VDaGVja2luZ1R5cGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPEVjbGlwc2VMaW5rQ2FjaGluZywgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFY2xpcHNlTGlua0NhY2hpbmcuREVGQVVMVF9FWElTVEVOQ0VfVFlQRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9FWElTVEVOQ0VfVFlQRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZVtdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSB2YWx1ZSkgewotCQkJCXN3aXRjaCAodmFsdWUpIHsKLQkJCQkJY2FzZSBDSEVDS19DQUNIRSA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2NoZWNrX2NhY2hlOwotCQkJCQljYXNlIENIRUNLX0RBVEFCQVNFIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfY2hlY2tfZGF0YWJhc2U7Ci0JCQkJCWNhc2UgQVNTVU1FX0VYSVNURU5DRSA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2Fzc3VtZV9leGlzdGVuY2U7Ci0JCQkJCWNhc2UgQVNTVU1FX05PTl9FWElTVEVOQ0UgOgotCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9hc3N1bWVfbm9uX2V4aXN0ZW5jZTsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIHZhbHVlKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUodmFsdWUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM1NzZjNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rSWRNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nMV8xQ29tcG9zaXRlCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZTxJZE1hcHBpbmc+Ci17Ci0JcHVibGljIE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nMV8xQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpbml0aWFsaXplSWRDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZVR5cGVDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZUdlbmVyYXRpb25Db2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUlkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7CQkKLQkJbmV3IENvbHVtbkNvbXBvc2l0ZSh0aGlzLCBidWlsZENvbHVtbkhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ybUF0dHJpYnV0ZVR5cGVDb21wb3NpdGUodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkTXV0YWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPElkTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rSWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rSWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMDBiMzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0lkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLklkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5JZE1hcHBpbmdHZW5lcmF0aW9uMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBPcm1FY2xpcHNlTGlua0lkTWFwcGluZzFfMUNvbXBvc2l0ZQotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0lkTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUlkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7CQkKLQkJbmV3IElkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1BdHRyaWJ1dGVUeXBlQ29tcG9zaXRlKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZSh0aGlzLCBidWlsZE11dGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYXRpb25Db2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSWRNYXBwaW5nR2VuZXJhdGlvbjJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNmZTUxMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZTxJZE1hcHBpbmc+Ci17Ci0JcHVibGljIE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVJZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewkJCi0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1BdHRyaWJ1dGVUeXBlQ29tcG9zaXRlKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZSh0aGlzLCBidWlsZE11dGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2VmMDY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk1hbnlUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PcmRlcmluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEpvaW5pbmdTdHJhdGVneUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9yZGVyaW5nQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIHtAbGluayBNYW55VG9NYW55TWFwcGluZ30KLSAqIEBzZWUge0BsaW5rIFRhcmdldEVudGl0eUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE1hbnlUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lfQotICogQHNlZSB7QGxpbmsgRmV0Y2hUeXBlQ29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgQ2FzY2FkZUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE9yZGVyaW5nQ29tcG9zaXRlfQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzFfMUNvbXBvc2l0ZQotCWV4dGVuZHMgRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxPcm1NYW55VG9NYW55TWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU1hbnlUb01hbnlNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcxXzFDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1NYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hbnlUb01hbnlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ybUF0dHJpYnV0ZVR5cGVDb21wb3NpdGUodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNhYTliZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQ2FzY2FkZVBhbmUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT3JkZXJpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZSAKLQlleHRlbmRzIEVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU8T3JtTWFueVRvTWFueU1hcHBpbmc+Ci17Ci0JcHVibGljIE9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybU1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWluaXRpYWxpemVNYW55VG9NYW55Q29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVKb2luaW5nU3RyYXRlZ3lDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZU9yZGVyaW5nQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYW55VG9NYW55U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1BdHRyaWJ1dGVUeXBlQ29tcG9zaXRlKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlUGFuZTJfMCh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9yZGVyaW5nQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9yZGVyaW5nMl8wQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZWNkZGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkNhc2NhZGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk9yZGVyaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgSm9pbmluZ1N0cmF0ZWd5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JkZXJpbmdDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUge0BsaW5rIE1hbnlUb01hbnlNYXBwaW5nfQotICogQHNlZSB7QGxpbmsgVGFyZ2V0RW50aXR5Q29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmV9Ci0gKiBAc2VlIHtAbGluayBGZXRjaFR5cGVDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBDYXNjYWRlQ29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgT3JkZXJpbmdDb21wb3NpdGV9Ci0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlCi0JZXh0ZW5kcyBFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlPE9ybU1hbnlUb01hbnlNYXBwaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTWFueVRvTWFueU1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybU1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFueVRvTWFueVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3JtQXR0cmlidXRlVHlwZUNvbXBvc2l0ZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFjMzYxNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5NYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEpvaW5pbmdTdHJhdGVneUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcHRpb25hbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIHtAbGluayBNYW55VG9PbmVNYXBwaW5nfQotICogQHNlZSB7QGxpbmsgVGFyZ2V0RW50aXR5Q29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZX0KLSAqIEBzZWUge0BsaW5rIEZldGNoVHlwZUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE9wdGlvbmFsQ29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgQ2FzY2FkZUNvbXBvc2l0ZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzFfMUNvbXBvc2l0ZQotCWV4dGVuZHMgRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlPE1hbnlUb09uZU1hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGluazFfMU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5NYW55VG9PbmVNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzFfMUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYW55VG9PbmVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwkJCi0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1hbnlUb09uZU1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODliZDRmOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWFueVRvT25lUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuT3B0aW9uYWxDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5BYnN0cmFjdE1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQ2FzY2FkZVBhbmUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdE1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU8TWFueVRvT25lTWFwcGluZywgTWFueVRvT25lUmVsYXRpb25zaGlwMl8wPgotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFueVRvT25lU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVQYW5lMl8wKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCAgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNYW55VG9PbmVNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rSm9pbkZldGNoPiBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1hbnlUb09uZU1hcHBpbmcsIEVjbGlwc2VMaW5rSm9pbkZldGNoPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rSm9pbkZldGNoTWFwcGluZykgdGhpcy5zdWJqZWN0KS5nZXRKb2luRmV0Y2goKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQxZmI2ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5NYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEpvaW5pbmdTdHJhdGVneUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcHRpb25hbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIHtAbGluayBNYW55VG9PbmVNYXBwaW5nfQotICogQHNlZSB7QGxpbmsgVGFyZ2V0RW50aXR5Q29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZX0KLSAqIEBzZWUge0BsaW5rIEZldGNoVHlwZUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE9wdGlvbmFsQ29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgQ2FzY2FkZUNvbXBvc2l0ZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZQotCWV4dGVuZHMgRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlPE1hbnlUb09uZU1hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGluazFfMU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5NYW55VG9PbmVNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYW55VG9PbmVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwkJCi0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1hbnlUb09uZU1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhhM2Q5OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlCi17Ci0JcHVibGljIE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ2FjaGluZ1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVjbGlwc2VMaW5rQ2FjaGluZz4gY2FjaGluZ0hvbGRlcikgewotCQluZXcgT3JtRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlKHRoaXMsIGNhY2hpbmdIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMl8xQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1OGFmMGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzFDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlF1ZXJpZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMl8xQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZSB7Ci0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMl8xQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1NYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZU1hcHBlZFN1cGVyY2xhc3NDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplQ2FjaGluZ0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVRdWVyaWVzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplQWR2YW5jZWRDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ2FjaGluZ1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVjbGlwc2VMaW5rQ2FjaGluZz4gY2FjaGluZ0hvbGRlcikgewotCQluZXcgT3JtRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlKHRoaXMsIGNhY2hpbmdIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVF1ZXJpZXNDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlX3F1ZXJpZXMpOwotCQl0aGlzLmluaXRpYWxpemVRdWVyaWVzU2VjdGlvbihjb250YWluZXIsIGJ1aWxkUXVlcnlDb250YWluZXJIb2xkZXIoKSk7Ci0JCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVRdWVyaWVzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnlDb250YWluZXI+IHF1ZXJ5Q29udGFpbmVySG9sZGVyKSB7Ci0JCW5ldyBRdWVyaWVzQ29tcG9zaXRlKHRoaXMsIHF1ZXJ5Q29udGFpbmVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5Q29udGFpbmVyPiBidWlsZFF1ZXJ5Q29udGFpbmVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1NYXBwZWRTdXBlcmNsYXNzLCBRdWVyeUNvbnRhaW5lcj4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBRdWVyeUNvbnRhaW5lciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIHRoaXMuc3ViamVjdCkuZ2V0UXVlcnlDb250YWluZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfM0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExOWMzNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfM0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5RdWVyaWVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfM0NvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUgewotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfM0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVNYXBwZWRTdXBlcmNsYXNzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNhY2hpbmdDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplUXVlcmllc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVNdWx0aXRlbmFuY3lDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplQ29udmVydGVyc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVBZHZhbmNlZENvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDYWNoaW5nU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRWNsaXBzZUxpbmtDYWNoaW5nPiBjYWNoaW5nSG9sZGVyKSB7Ci0JCW5ldyBPcm1FY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUodGhpcywgY2FjaGluZ0hvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUXVlcmllc0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGVfcXVlcmllcyk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVF1ZXJpZXNTZWN0aW9uKGNvbnRhaW5lciwgYnVpbGRRdWVyeUNvbnRhaW5lckhvbGRlcigpKTsKLQkJCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVF1ZXJpZXNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeUNvbnRhaW5lcj4gcXVlcnlDb250YWluZXJIb2xkZXIpIHsKLQkJbmV3IFF1ZXJpZXNDb21wb3NpdGUodGhpcywgcXVlcnlDb250YWluZXJIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnlDb250YWluZXI+IGJ1aWxkUXVlcnlDb250YWluZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybU1hcHBlZFN1cGVyY2xhc3MsIFF1ZXJ5Q29udGFpbmVyPigKLQkJCQlnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFF1ZXJ5Q29udGFpbmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgdGhpcy5zdWJqZWN0KS5nZXRRdWVyeUNvbnRhaW5lcigpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNdWx0aXRlbmFuY3lDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9tdWx0aXRlbmFuY3kpOwotCQl0aGlzLmluaXRpYWxpemVNdWx0aXRlbmFuY3lTZWN0aW9uKGNvbnRhaW5lciwgYnVpbGRNdWx0aXRlbmFuY3lIb2xkZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU11bHRpdGVuYW5jeVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zPiBtdWx0aXRlbmFuY3lIb2xkZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Q29tcG9zaXRlKHRoaXMsIG11bHRpdGVuYW5jeUhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1NYXBwZWRTdXBlcmNsYXNzLCBPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMz4gYnVpbGRNdWx0aXRlbmFuY3lIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybU1hcHBlZFN1cGVyY2xhc3MsIE9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgdGhpcy5zdWJqZWN0KS5nZXRNdWx0aXRlbmFuY3koKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFiNmUzZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZQotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybU1hcHBlZFN1cGVyY2xhc3M+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OWRlMjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkNhc2NhZGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMV8xQ29tcG9zaXRlCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU8T25lVG9NYW55TWFwcGluZz4KLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMV8xQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPbmVUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPbmVUb01hbnlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ybUF0dHJpYnV0ZVR5cGVDb21wb3NpdGUodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlKHRoaXMsIGJ1aWxkUHJpdmF0ZU93bmFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T25lVG9NYW55TWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5N2I3ZmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5DYXNjYWRlUGFuZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PcmRlcmluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU8T25lVG9NYW55TWFwcGluZz4KLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPbmVUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJaW5pdGlhbGl6ZU9uZVRvTWFueUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWd5Q29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVPcmRlcmluZ0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9NYW55U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1BdHRyaWJ1dGVUeXBlQ29tcG9zaXRlKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCB0aGlzLmJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZFByaXZhdGVPd25hYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVQYW5lMl8wKHRoaXMsIHRoaXMuYnVpbGRDYXNjYWRlSG9sZGVyKCksIHRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9yZGVyaW5nQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9yZGVyaW5nMl8wQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPbmVUb01hbnlNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JwaGFuUmVtb3ZhYmxlMl8wPiBidWlsZE9ycGhhblJlbW92YWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T25lVG9NYW55TWFwcGluZywgT3JwaGFuUmVtb3ZhYmxlMl8wPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3JwaGFuUmVtb3ZhYmxlMl8wIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKE9ycGhhblJlbW92YWxIb2xkZXIyXzApIHRoaXMuc3ViamVjdCkuZ2V0T3JwaGFuUmVtb3ZhbCgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDMxMTRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZQotCWV4dGVuZHMgRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlPE9uZVRvTWFueU1hcHBpbmc+Ci17Ci0JcHVibGljIE9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9NYW55U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1BdHRyaWJ1dGVUeXBlQ29tcG9zaXRlKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZSh0aGlzLCBidWlsZFByaXZhdGVPd25hYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9uZVRvTWFueU1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg2ZTdhYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkNhc2NhZGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuTWFwcGVkQnlQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWNjZXNzVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcHRpb25hbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgT25lVG9PbmVNYXBwaW5nCi0gKiBAc2VlIEFjY2Vzc1R5cGVDb21wb3NpdGUKLSAqIEBzZWUgQ2FzY2FkZUNvbXBvc2l0ZQotICogQHNlZSBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZQotICogQHNlZSBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZQotICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKLSAqIEBzZWUgTWFwcGVkQnlQYW5lCi0gKiBAc2VlIE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZQotICogQHNlZSBPcHRpb25hbENvbXBvc2l0ZQotICogQHNlZSBUYXJnZXRFbnRpdHlDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMV8xQ29tcG9zaXRlCi1leHRlbmRzIEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlPE9uZVRvT25lTWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VsaW5rMV8xT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU9uZVRvT25lTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzFfMUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9PbmVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGUodGhpcywgYnVpbGRQcml2YXRlT3duYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0JCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T25lVG9PbmVNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNmExMGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT25lVG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuT3B0aW9uYWxDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5BYnN0cmFjdE9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5DYXNjYWRlUGFuZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PbmVUb09uZUpvaW5pbmdTdHJhdGVneTJfMFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU8T25lVG9PbmVNYXBwaW5nLCBPbmVUb09uZVJlbGF0aW9uc2hpcDJfMD4KLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPbmVUb09uZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZSh0aGlzLCBidWlsZFByaXZhdGVPd25hYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlKHRoaXMsIGJ1aWxkT3JwaGFuUmVtb3ZhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlUGFuZTJfMCh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUpvaW5pbmdTdHJhdGVneUNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPbmVUb09uZUpvaW5pbmdTdHJhdGVneTJfMFBhbmUodGhpcywgYnVpbGRKb2luaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPbmVUb09uZU1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtKb2luRmV0Y2g+IGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T25lVG9PbmVNYXBwaW5nLCBFY2xpcHNlTGlua0pvaW5GZXRjaD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgdGhpcy5zdWJqZWN0KS5nZXRKb2luRmV0Y2goKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1ByaXZhdGVPd25lZD4gYnVpbGRQcml2YXRlT3duYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T25lVG9PbmVNYXBwaW5nLCBFY2xpcHNlTGlua1ByaXZhdGVPd25lZD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgdGhpcy5zdWJqZWN0KS5nZXRQcml2YXRlT3duZWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxPcnBoYW5SZW1vdmFibGUyXzA+IGJ1aWxkT3JwaGFuUmVtb3ZhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPbmVUb09uZU1hcHBpbmcsIE9ycGhhblJlbW92YWJsZTJfMD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPcnBoYW5SZW1vdmFibGUyXzAgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgdGhpcy5zdWJqZWN0KS5nZXRPcnBoYW5SZW1vdmFsKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjdlOWQ1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5NYXBwZWRCeVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuT3B0aW9uYWxDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBBY2Nlc3NUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9wdGlvbmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBPbmVUb09uZU1hcHBpbmcKLSAqIEBzZWUgQWNjZXNzVHlwZUNvbXBvc2l0ZQotICogQHNlZSBDYXNjYWRlQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlCi0gKiBAc2VlIEZldGNoVHlwZUNvbXBvc2l0ZQotICogQHNlZSBNYXBwZWRCeVBhbmUKLSAqIEBzZWUgT25lVG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lCi0gKiBAc2VlIE9wdGlvbmFsQ29tcG9zaXRlCi0gKiBAc2VlIFRhcmdldEVudGl0eUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUKLWV4dGVuZHMgRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdDb21wb3NpdGU8T25lVG9PbmVNYXBwaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZWxpbmsxXzFPbmVUb09uZU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JT25lVG9PbmVNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPbmVUb09uZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZSh0aGlzLCBidWlsZFByaXZhdGVPd25hYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQkJCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPbmVUb09uZU1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfM1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDlkNTk2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdHVyZU1hcHBpbmcyXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1N0cnVjdHVyZU1hcHBpbmcyXzNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfM1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfMz4KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248RWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfM1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQluZXcgT3JtRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zVWlEZWZpbml0aW9uKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxFY2xpcHNlTGlua1N0cnVjdHVyZU1hcHBpbmcyXzM+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgT3JtRWNsaXBzZUxpbmtTdHJ1Y3R1cmVNYXBwaW5nMl8zVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksIAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rU3RydWN0dXJlTWFwcGluZzJfMz4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1N0cnVjdHVyZU1hcHBpbmcyXzNDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YmE3OGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc+Ci0JaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmYzYjBkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+Ci0JaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZjliNTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkNvbHVtbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nMV8xQ29tcG9zaXRlCi0JZXh0ZW5kcyBFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlPFZlcnNpb25NYXBwaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtPcm1WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPlZlcnNpb25NYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcxXzFDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBWZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJaW5pdGlhbGl6ZVZlcnNpb25Db2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZVR5cGVDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmVyc2lvblNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewkJCi0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1BdHRyaWJ1dGVUeXBlQ29tcG9zaXRlKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZSh0aGlzLCBidWlsZE11dGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxWZXJzaW9uTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkzNWY2OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUKLQlleHRlbmRzIEVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdDb21wb3NpdGU8VmVyc2lvbk1hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua09ybVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+VmVyc2lvbk1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFZlcnNpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmVyc2lvblNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3JtQXR0cmlidXRlVHlwZUNvbXBvc2l0ZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGUodGhpcywgYnVpbGRNdXRhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGlhbG9ncy9BZGRWaXJ0dWFsQXR0cmlidXRlRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RpYWxvZ3MvQWRkVmlydHVhbEF0dHJpYnV0ZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzgxNzNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGlhbG9ncy9BZGRWaXJ0dWFsQXR0cmlidXRlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5yZWZhY3RvcmluZy5jb250ZW50YXNzaXN0LkNvbnRyb2xDb250ZW50QXNzaXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5yZWZhY3RvcmluZy5jb250ZW50YXNzaXN0LkphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuU3RhdHVzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5KcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzU2VydmljZTsKLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi1wdWJsaWMgY2xhc3MgQWRkVmlydHVhbEF0dHJpYnV0ZURpYWxvZyBleHRlbmRzIFN0YXR1c0RpYWxvZwotewotCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZTsKLQlwcm90ZWN0ZWQgVGV4dCBuYW1lVGV4dDsKLQlwcm90ZWN0ZWQgQ29tYm9WaWV3ZXIgbWFwcGluZ0NvbWJvOwotCQotCXByb3RlY3RlZCBUZXh0IGF0dHJpYnV0ZVR5cGVUZXh0OwotCQotCXByaXZhdGUgQnV0dG9uIGF0dHJpYnV0ZVR5cGVCcm93c2VCdXR0b247Ci0KLQlwcml2YXRlIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkZWRBdHRyaWJ1dGU7Ci0KLQlwdWJsaWMgQWRkVmlydHVhbEF0dHJpYnV0ZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMucGVyc2lzdGVudFR5cGUgPSBwZXJzaXN0ZW50VHlwZTsKLQkJc2V0VGl0bGUoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkFkZFZpcnR1YWxBdHRyaWJ1dGVEaWFsb2dfdGl0bGUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkaWFsb2dBcmVhLCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMSwgRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkFkZFZpcnR1YWxBdHRyaWJ1dGVEaWFsb2dfbmFtZUxhYmVsKTsKLQotCQl0aGlzLm5hbWVUZXh0ID0gY3JlYXRlVGV4dChjb21wb3NpdGUsIDIpOwotCQl0aGlzLm5hbWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKAotCQkJCW5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCQl2YWxpZGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIDEsIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5BZGRWaXJ0dWFsQXR0cmlidXRlRGlhbG9nX21hcHBpbmdMYWJlbCk7Ci0KLQkJdGhpcy5tYXBwaW5nQ29tYm8gPSBuZXcgQ29tYm9WaWV3ZXIoY3JlYXRlQ29tYm8oY29tcG9zaXRlLCAyKSk7Ci0JCXRoaXMubWFwcGluZ0NvbWJvLmdldENvbWJvKCkuc2V0Rm9jdXMoKTsKLQkJdGhpcy5tYXBwaW5nQ29tYm8uc2V0Q29udGVudFByb3ZpZGVyKHRoaXMuYnVpbGRDb21ib0NvbnRlbnRQcm92aWRlcigpKTsKLQkJdGhpcy5tYXBwaW5nQ29tYm8uc2V0TGFiZWxQcm92aWRlcigKLQkJCQluZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCQkJcmV0dXJuICgoTWFwcGluZ1VpRGVmaW5pdGlvbjw/LD8+KSBlbGVtZW50KS5nZXRMYWJlbCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCXRoaXMubWFwcGluZ0NvbWJvLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMubWFwcGluZ0NvbWJvLnNldElucHV0KHRoaXMuZ2V0SnBhUGxhdGZvcm1VaSgpKTsKLQkJCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMSwgRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkFkZFZpcnR1YWxBdHRyaWJ1dGVEaWFsb2dfYXR0cmlidXRlVHlwZUxhYmVsKTsKLQkJCQotCQl0aGlzLmF0dHJpYnV0ZVR5cGVUZXh0ID0gY3JlYXRlQXR0cmlidXRlVHlwZVRleHQoY29tcG9zaXRlKTsKLQkJdGhpcy5hdHRyaWJ1dGVUeXBlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcigKLQkJCQluZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQkJdmFsaWRhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCQotCQl0aGlzLmF0dHJpYnV0ZVR5cGVCcm93c2VCdXR0b24gPSBjcmVhdGVCdXR0b24oY29tcG9zaXRlLCBKcHRVaU1lc3NhZ2VzLkdlbmVyYWxfYnJvd3NlKTsKLQkJdGhpcy5hdHRyaWJ1dGVUeXBlQnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJVHlwZSB0eXBlID0gY2hvb3NlVHlwZSgpOwotCQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQkJYXR0cmlidXRlVHlwZVRleHQuc2V0VGV4dCh0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnJCcpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQotCQl0aGlzLm5hbWVUZXh0LnNldEZvY3VzKCk7Ci0KLQkJYXBwbHlEaWFsb2dGb250KGRpYWxvZ0FyZWEpOwotCi0JCXZhbGlkYXRlKCk7Ci0KLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtVWkgZ2V0SnBhUGxhdGZvcm1VaSgpIHsKLQkJcmV0dXJuIChKcGFQbGF0Zm9ybVVpKSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRKcGFQbGF0Zm9ybSgpLmdldEFkYXB0ZXIoSnBhUGxhdGZvcm1VaS5jbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGJ1aWxkQ29tYm9Db250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiAJbmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQkvL25vdGhpbmcgdG8gZGlzcG9zZQotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCXJldHVybiBBcnJheVRvb2xzLmFycmF5KAotCQkJCQlDb2xsZWN0aW9uVG9vbHMuc29ydCgKLQkJCQkJCSgoSnBhUGxhdGZvcm1VaSkgaW5wdXRFbGVtZW50KS5hdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucyhBZGRWaXJ0dWFsQXR0cmlidXRlRGlhbG9nLnRoaXMuZ2V0SnB0UmVzb3VyY2VUeXBlKCkpLAotCQkJCQkJZ2V0UHJvdmlkZXJzQ29tcGFyYXRvcigpKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJCS8vaW5wdXQgd2lsbCBub3QgY2hhbmdlCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIEpwdFJlc291cmNlVHlwZSBnZXRKcHRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlVHlwZSgpOwotCX0KLQotCXByb3RlY3RlZCBDb21wYXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb248Pyw/Pj4gZ2V0UHJvdmlkZXJzQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb248Pyw/Pj4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoTWFwcGluZ1VpRGVmaW5pdGlvbjw/LD8+IGl0ZW0xLCBNYXBwaW5nVWlEZWZpbml0aW9uPD8sPz4gaXRlbTIpIHsKLQkJCQlTdHJpbmcgZGlzcGxheVN0cmluZzEgPSBpdGVtMS5nZXRMYWJlbCgpOwotCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMiA9IGl0ZW0yLmdldExhYmVsKCk7Ci0JCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShkaXNwbGF5U3RyaW5nMSwgZGlzcGxheVN0cmluZzIpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4sIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4pIHsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoY29udGFpbmVyLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJZ2Qud2lkdGhIaW50ID0gMjUwOwotCQl0ZXh0LnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwcml2YXRlIFRleHQgY3JlYXRlQXR0cmlidXRlVHlwZVRleHQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkvLyBUT0RPIGJ1ZyAxNTYxODUgLSB3aGVuIHRoaXMgaXMgZml4ZWQgdGhlcmUgc2hvdWxkIGJlIGFwaSBmb3IgdGhpcwotCQlKYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3IgamF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yID0gbmV3IEphdmFUeXBlQ29tcGxldGlvblByb2Nlc3Nvcih0cnVlLyplbmFibGVCYXNlVHlwZXMqLywgZmFsc2UpOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwZnIgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7Ci0JCWlmIChwZnIgIT0gbnVsbCkgewotCQkJamF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yLnNldFBhY2thZ2VGcmFnbWVudChwZnIuZ2V0UGFja2FnZUZyYWdtZW50KCIiKSk7Ci0JCX0KLQkJCi0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotCi0JCUNvbnRyb2xDb250ZW50QXNzaXN0SGVscGVyLmNyZWF0ZVRleHRDb250ZW50QXNzaXN0YW50KAotCQkJdGV4dCwKLQkJCWphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvcgotCQkpOwotCQkKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdldEZpZWxkR3JpZERhdGEoKSk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQkKLQlwcm90ZWN0ZWQgR3JpZERhdGEgZ2V0RmllbGRHcmlkRGF0YSgpIHsKLQkJaW50IG1hcmdpbiA9IEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKQotCQkJCS5nZXRNYXhpbXVtRGVjb3JhdGlvbldpZHRoKCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWRhdGEud2lkdGhIaW50ID0gSURpYWxvZ0NvbnN0YW50cy5FTlRSWV9GSUVMRF9XSURUSCArIG1hcmdpbjsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gbWFyZ2luOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlyZXR1cm4gZGF0YTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKClbMF07Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbWJvIGNyZWF0ZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuKSB7Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKGNvbnRhaW5lciwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQljb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQkKLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIHRleHQpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW50VHlwZS5nZXRKcGFQcm9qZWN0KCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlVHlwZVRleHQuZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZVRleHQuZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5tYXBwaW5nQ29tYm8uZ2V0U2VsZWN0aW9uKCk7Ci0JCXJldHVybiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgPyBudWxsIDogKChNYXBwaW5nVWlEZWZpbml0aW9uPD8sPz4pIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSkuZ2V0S2V5KCk7Ci0JfQotCQotCXByb3RlY3RlZCBJVHlwZSBjaG9vc2VUeXBlKCkgewotCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cz0gbmV3IElKYXZhRWxlbWVudFtdIHsgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkgfTsKLQkJSUphdmFTZWFyY2hTY29wZSBzY29wZT0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShlbGVtZW50cyk7Ci0JCUlQcm9ncmVzc1NlcnZpY2Ugc2VydmljZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7Ci0JCQotCQlTZWxlY3Rpb25EaWFsb2cgdHlwZVNlbGVjdGlvbkRpYWxvZzsKLQkJdHJ5IHsKLQkJCXR5cGVTZWxlY3Rpb25EaWFsb2cgPSAKLQkJCQlKYXZhVUkuY3JlYXRlVHlwZURpYWxvZygKLQkJCQkJCWdldFNoZWxsKCksIHNlcnZpY2UsIHNjb3BlLCAKLQkJCQkJCUlKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50cy5DT05TSURFUl9BTExfVFlQRVMsIAotCQkJCQkJZmFsc2UsIGdldEF0dHJpYnV0ZVR5cGUoKSk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luLmxvZyhlKTsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NEaWFsb2dfdGl0bGUpOyAKLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRNZXNzYWdlKEpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2NsYXNzRGlhbG9nX21lc3NhZ2UpOyAKLQotCQlpZiAodHlwZVNlbGVjdGlvbkRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gKElUeXBlKSB0eXBlU2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5nZXRBdHRyaWJ1dGVOYW1lKCkpKSB7Ci0JCQl1cGRhdGVTdGF0dXMoCi0JCQkJbmV3IFN0YXR1cygKLQkJCQkJSVN0YXR1cy5FUlJPUiwgSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5BZGRWaXJ0dWFsQXR0cmlidXRlRGlhbG9nX25vTmFtZUVycm9yKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0TWFwcGluZ0tleSgpID09IG51bGwpIHsKLQkJCXVwZGF0ZVN0YXR1cygKLQkJCQluZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkFkZFZpcnR1YWxBdHRyaWJ1dGVEaWFsb2dfbm9NYXBwaW5nS2V5RXJyb3IpKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmdldEF0dHJpYnV0ZVR5cGUoKSkpIHsKLQkJCXVwZGF0ZVN0YXR1cygKLQkJCQluZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkFkZFZpcnR1YWxBdHRyaWJ1dGVEaWFsb2dfbm9BdHRyaWJ1dGVUeXBlRXJyb3IpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXVwZGF0ZVN0YXR1cyhTdGF0dXMuT0tfU1RBVFVTKTsKLQl9Ci0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCXRoaXMuYWRkZWRBdHRyaWJ1dGUgPSB0aGlzLnBlcnNpc3RlbnRUeXBlLmFkZFZpcnR1YWxBdHRyaWJ1dGUoZ2V0QXR0cmlidXRlTmFtZSgpLCBnZXRNYXBwaW5nS2V5KCksIGdldEF0dHJpYnV0ZVR5cGUoKSk7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9wZW5BbmRSZXR1cm5BdHRyaWJ1dGUoKSB7Ci0JCXN1cGVyLm9wZW4oKTsKLQkJcmV0dXJuIHRoaXMuYWRkZWRBdHRyaWJ1dGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9lbnRpdHkvZGF0YS9tb2RlbC9EeW5hbWljRW50aXR5RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZW50aXR5L2RhdGEvbW9kZWwvRHluYW1pY0VudGl0eURhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNTA4NTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9lbnRpdHkvZGF0YS9tb2RlbC9EeW5hbWljRW50aXR5RGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZW50aXR5LmRhdGEubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvbnZlbnRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmVudGl0eS5kYXRhLm9wZXJhdGlvbi5OZXdEeW5hbWljRW50aXR5Q2xhc3NPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWwuSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVDb21tb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5OZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLXB1YmxpYyBjbGFzcyBEeW5hbWljRW50aXR5RGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET1QgPSAiLiI7IC8vJE5PTi1OTFMtMSQKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgTmV3RHluYW1pY0VudGl0eUNsYXNzT3BlcmF0aW9uKGdldERhdGFNb2RlbCgpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqKioqKiBtb2RlbCBwcm9wZXJ0aWVzICoqKioqKioqKioqKioqKioKLQkvKioKLQkgKiBFeHRlbmRzOiA8Y29kZT5JRGF0YU1vZGVsUHJvdmlkZXIjZ2V0UHJvcGVydHlOYW1lcygpPC9jb2RlPgotCSAqIGFuZCBhZGQgb3duIGRhdGEgbW9kZWwncyBwcm9wZXJ0aWVzIHNwZWNpZmljIGZvciB0aGUgZHluYW1pYyBlbnRpdHkgbW9kZWwKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyI2dldFByb3BlcnR5TmFtZXMoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRQcm9wZXJ0eU5hbWVzKCkgewkJCi0JCVNldDxTdHJpbmc+IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEVOVElUWSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFhNTF9OQU1FKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRU5USVRZX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChUQUJMRV9OQU1FX0RFRkFVTFQpOwkJCi0JCXByb3BlcnR5TmFtZXMuYWRkKFRBQkxFX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChFTlRJVFlfRklFTERTKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUEtfRklFTERTKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyICh3aGljaCBzaG91bGQgcHJlc2VudCBhIHZhbGlkIGRhdGEgbW9kZWwgcHJvcGVydHkpLiAgCi0JICogVGhpcyBtZXRob2QgZG9lcyBub3QgYWNjZXB0IGEgbnVsbCBwYXJhbWV0ZXIuIEl0IG1heSByZXR1cm4gbnVsbC4gCi0JICogCi0JICogQHNlZSBOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlciNnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nKQotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2dldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcpCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEByZXR1cm4gT2JqZWN0IGRlZmF1bHQgdmFsdWUgb2YgcHJvcGVydHkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRU5USVRZKSkgewotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFhNTF9OQU1FKSkgewotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsJCQkKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVOVElUWV9OQU1FKSkgewotCQkJcmV0dXJuIGdldFN0cmluZ1Byb3BlcnR5KENMQVNTX05BTUUpOwkJCQotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVEFCTEVfTkFNRV9ERUZBVUxUKSkgewotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFRBQkxFX05BTUUpKSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nUHJvcGVydHkoQ0xBU1NfTkFNRSk7CQkJCi0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFTlRJVFlfRklFTERTKSkgewotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8RHluYW1pY0VudGl0eUZpZWxkPigpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEtfRklFTERTKSkgewotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8RHluYW1pY0VudGl0eUZpZWxkPigpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSkFWQV9QQUNLQUdFX0ZSQUdNRU5UX1JPT1QpKQotCQkJcmV0dXJuIGdldEphdmFQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCi0JCS8vIE90aGVyd2lzZSBjaGVjayBzdXBlciBmb3IgZGVmYXVsdCB2YWx1ZSBmb3IgcHJvcGVydHkKLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWJvb2xlYW4gb2sgPSBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQlpZiAob2spIHsKLQkJCWlmIChQUk9KRUNUX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkgfHwgWE1MX1NVUFBPUlQuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFhNTF9OQU1FLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwotCQkJfQotCQl9Ci0JCXJldHVybiBvazsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgdGhlIGV4aXN0aW5nIHNvdXJjZSBwYXRoIHJvb3RzIGNyb3NzIHRoZSBzZWxlY3RlZCBwcm9qZWN0Ci0JICogQHJldHVybiBhIHNldCBvZiBJUGFja2FnZUZyYWdtZW50Um9vdCB3aXRoIHRoZSBraW5kIG9mIHNvdXJjZSBwYXRoCi0JICovCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290W10gZ2V0SmF2YVBhY2thZ2VGcmFnbWVudFJvb3RzKCkgewotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBnZXRKcGFQcm9qZWN0KCk7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcGFja1Jvb3RzID0gbmV3IElQYWNrYWdlRnJhZ21lbnRSb290WzBdOwotCQlMaXN0PElQYWNrYWdlRnJhZ21lbnRSb290PiByb290TGlzdCA9IG5ldyBBcnJheUxpc3Q8SVBhY2thZ2VGcmFnbWVudFJvb3Q+KCk7Ci0JCWlmIChqcGFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGpwYVByb2plY3QuZ2V0SmF2YVByb2plY3QoKTsKLQkJCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcGFja1Jvb3RzID0gamF2YVByb2plY3QuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLQkJCQkJZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCByb290IDogcGFja1Jvb3RzKSB7Ci0JCQkJCQlpZiAocm9vdC5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpIHsKLQkJCQkJCQlyb290TGlzdC5hZGQocm9vdCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcGFja1Jvb3RzID0gbmV3IElQYWNrYWdlRnJhZ21lbnRSb290W3Jvb3RMaXN0LnNpemUoKV07Ci0JCQkJCXJvb3RMaXN0LnRvQXJyYXkocGFja1Jvb3RzKTsKLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkvLyBmYWxsIHRocm91Z2gKLQkJCQkJSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBwYWNrUm9vdHM7Ci0JfQotCi0JLy8qKioqKioqKioqKioqKiBtb2RlbCB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSVN0YXR1cyByZXN1bHQgPSBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKQVZBX1BBQ0tBR0UpKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdGVKYXZhUGFja2FnZShnZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhYTUxfTkFNRSkpIHsKLQkJCXJldHVybiB2YWxpZGF0ZVhtbE5hbWUoZ2V0U3RyaW5nUHJvcGVydHkocHJvcGVydHlOYW1lKSk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRU5USVRZX0ZJRUxEUykpIHsKLQkJCXJldHVybiB2YWxpZGF0ZUZpZWxkc0xpc3QoKEFycmF5TGlzdDxEeW5hbWljRW50aXR5RmllbGQ+KSBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQS19GSUVMRFMpKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdGVQcmltYXJ5S2V5RmllbGRzTGlzdCgoQXJyYXlMaXN0PER5bmFtaWNFbnRpdHlGaWVsZD4pIGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7CQkKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIEl0IHdpbGwgYmUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgY29ycmVjdG5lc3MgCi0JICogb2YgZW50aXR5IHBhY2thZ2UgaW4gYWNjb3JkYW5jZSB3aXRoIEphdmEgY29udmVudGlvbiByZXF1aXJlbWVudHMuIAotCSAqIFRoaXMgbWV0aG9kIHdpbGwgYWNjZXB0IGEgbnVsbCBwYXJhbWV0ZXIuIAotCSAqIAotCSAqIEBwYXJhbSBwYWNrTmFtZQotCSAqIEByZXR1cm4gSVN0YXR1cyBpcyB0aGUgcGFja2FnZSBuYW1lIHNhdGlzZmllcyBKYXZhIGNvbnZlbnRpb24gcmVxdWlyZW1lbnRzCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlSmF2YVBhY2thZ2UoU3RyaW5nIHBhY2tOYW1lKSB7CQkKLQkJaWYgKHBhY2tOYW1lID09IG51bGwgfHwgcGFja05hbWUuZXF1YWxzKEVNUFRZX1NUUklORykpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLldBUk5JTkcsIEpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4uUExVR0lOX0lELAotCQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV9kZWZhdWx0UGFja2FnZVdhcm5pbmcpOwotCQl9CQkJCi0JCS8vIFVzZSBzdGFuZGFyZCBqYXZhIGNvbnZlbnRpb25zIHRvIHZhbGlkYXRlIHRoZSBwYWNrYWdlIG5hbWUKLQkJSVN0YXR1cyBqYXZhU3RhdHVzID0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlUGFja2FnZU5hbWUocGFja05hbWUsIEphdmFDb3JlLlZFUlNJT05fMV81LCBKYXZhQ29yZS5WRVJTSU9OXzFfNSk7Ci0JCWlmIChqYXZhU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJU3RyaW5nIG1zZyA9IEoyRUVDb21tb25NZXNzYWdlcy5FUlJfSkFWQV9QQUNBS0dFX05BTUVfSU5WQUxJRCArIGphdmFTdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwotCQl9IGVsc2UgaWYgKGphdmFTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpIHsKLQkJCVN0cmluZyBtc2cgPSBKMkVFQ29tbW9uTWVzc2FnZXMuRVJSX0pBVkFfUEFDS0FHRV9OQU1FX1dBUk5JTkcgKyBqYXZhU3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlV2FybmluZ1N0YXR1cyhtc2cpOwotCQl9CQkKLQkJLy8gamF2YSBwYWNrYWdlIG5hbWUgaXMgdmFsaWQKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBJdCB3aWxsIGJlIHVzZWQgdG8gdmFsaWRhdGUgCi0JICogdGhlIHZhbGlkaXR5IG9mIGEgc3BlY2lmaWVkIG1hcHBpbmcgZmlsZSBhbmQgaWYgYSBzcGVjaWZpZWQgbWFwcGluZyBmaWxlCi0JICogaXMgaW5jbHVkZWQgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICogVGhpcyBtZXRob2Qgd2lsbCBhY2NlcHQgYSBudWxsIHBhcmFtZXRlci4gCi0JICogCi0JICogQHBhcmFtIHhtbE5hbWUKLQkgKiBAcmV0dXJuIElTdGF0dXMgaXMgdGhlIG1hcHBpbmcgZmlsZSBleGlzdHMgb3IgaXMgdGhlIG1hcHBpbmcgZmlsZSBpbmNsdWRlZAotCSAqIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlWG1sTmFtZShTdHJpbmcgeG1sTmFtZSkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5nZXRUYXJnZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCUpwYVhtbFJlc291cmNlIG9ybVhtbFJlc291cmNlID0gU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh4bWxOYW1lKSA/IG51bGwgOiBnZXRPcm1YbWxSZXNvdXJjZSh4bWxOYW1lKTsKLQkJCWlmIChvcm1YbWxSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EeW5hbWljRW50aXR5Q2xhc3NXaXphcmRQYWdlX2ludmFsaWRYTUxOYW1lKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldEpwYUZpbGUob3JtWG1sUmVzb3VyY2UuZ2V0RmlsZSgpKS5nZXRSb290U3RydWN0dXJlTm9kZXNTaXplKCkgPT0gMCkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQkJSVN0YXR1cy5FUlJPUiwgSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV94bWxOb3RMaXN0ZWRFcnJvcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlIGdldE9ybVhtbFJlc291cmNlKFN0cmluZyB4bWxOYW1lKSB7Ci0JCXJldHVybiBnZXRKcGFQcm9qZWN0KCk9PSBudWxsID8gbnVsbCA6IGdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKHhtbE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIEl0IHdpbGwgYmUgdXNlZCB0byB2YWxpZGF0ZQotCSAqIHRoZSBsaXN0IG9mIGNyZWF0ZWQgZHluYW1pYyBlbnRpdHkgZmllbGRzIHRvIGVuc3VyZSB0aGVyZSBhcmUgbm8gZHVwbGljYXRlcywKLQkgKiB0byB2YWxpZGF0ZSB0aGUgdmFsaWRpdHkgYW5kIGV4aXN0ZW5jZSBvZiBhIGZpZWxkJ3MgZ2l2ZW4gYXR0cmlidXRlIHR5cGUsIAotCSAqIGFuZCB0byB2YWxpZGF0ZSB0aGUgdmFsaWRpdHkgb2YgdGhlIG1hcHBpbmcgdHlwZXMgb2YgdGhlIGNyZWF0ZWQgZmllbGRzLgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgYWNjZXB0IGEgbnVsbCBwYXJhbWV0ZXIuIAotCSAqIAotCSAqIEBwYXJhbSBsaXN0IG9mIER5bmFtaWNFbnRpdHlGaWVsZAotCSAqIEByZXR1cm4gSVN0YXR1cyBhcmUgdGhlIGR5bmFtaWMgZW50aXR5IGZpZWxkIG5hbWVzIHVuaXF1ZQotCSAqIAkJCQkgICBvciBpcyB0aGUgZHluYW1pYyBlbnRpdHkgZmllbGQgYXR0cmlidXRlIHR5cGUgdmFsaWQKLQkgKiAJCQkJICAgb3IgYXJlIHRoZSBkeW5hbWljIGVudGl0eSBmaWVsZCBtYXBwaW5nIHR5cGVzIHZhbGlkCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlRmllbGRzTGlzdChBcnJheUxpc3Q8RHluYW1pY0VudGl0eUZpZWxkPiBmaWVsZHMpIHsKLQkJaWYgKGZpZWxkcyAhPSBudWxsICYmICFmaWVsZHMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBFbnN1cmUgdGhlcmUgYXJlIG5vIGR5bmFtaWMgZW50aXR5IGZpZWxkcyB0aGF0IGhhdmUgdGhlIHNhbWUgbmFtZSBpbiB0aGUgdGFibGUKLQkJCWJvb2xlYW4gaGFzRHVwbGljYXRlcyA9IGhhc0R1cGxpY2F0ZXNJbkVudGl0eUZpZWxkcyhmaWVsZHMpOwotCQkJaWYgKGhhc0R1cGxpY2F0ZXMpIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cygKLQkJCQkJCUlTdGF0dXMuRVJST1IsIEpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkR5bmFtaWNFbnRpdHlGaWVsZHNXaXphcmRQYWdlX2R1cGxpY2F0ZUVudGl0eUZpZWxkc0Vycm9yKTsKLQkJCX0KLQkJCS8vIEVuc3VyZSBJRCBhbmQgRW1iZWRkZWRJRCBtYXBwaW5nIGFyZSBub3QgZGVmaW5lZCBhdCB0aGUgc2FtZSB0aW1lCi0JCQkvLyBhbmQgYWxzbyBlbnN1cmUgdGhlcmUncyBubyBtdWx0aXBsZSBFbWJlZGRlZElEIG1hcHBpbmdzIGRlZmluZWQKLQkJCVN0cmluZyBlcnJvck1zZzEgPSBjaGVja0lucHV0RmllbGRzTWFwcGluZ1R5cGVzKGZpZWxkcyk7Ci0JCQlpZiAoZXJyb3JNc2cxICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luLlBMVUdJTl9JRCwgZXJyb3JNc2cxKTsKLQkJCX0KLQkJCS8vIEVuc3VyZSB0aGF0IHRoZSBnaXZlbiB0eXBlIG9mIHRoZSBkeW5hbWljIGVudGl0eSBmaWVsZHMgaW4gdGhlIHRhYmxlIGFyZSB2YWxpZAotCQkJU3RyaW5nIGVycm9yTXNnMiA9IGNoZWNrSW5wdXRGaWVsZHNBdHRyaWJ1dGVUeXBlVmFsaWRpdHkoZmllbGRzKTsKLQkJCWlmIChlcnJvck1zZzIgIT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4uUExVR0lOX0lELCBlcnJvck1zZzIpOwotCQkJfQotCQkJLy8gRW5zdXJlIHRoYXQgdGhlIGdpdmVuIHR5cGUgb2YgdGhlIGR5bmFtaWMgZW50aXR5IGZpZWxkcyBpbiB0aGUgdGFibGUgZXhpc3QKLQkJCVN0cmluZyB3YXJuaW5nTXNnID0gY2hlY2tJbnB1dEZpZWxkc0F0dHJpYnV0ZVR5cGVFeGlzdGVuY2UoZmllbGRzKTsKLQkJCWlmICh3YXJuaW5nTXNnICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4uUExVR0lOX0lELCB3YXJuaW5nTXNnKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjaGVja0lucHV0RmllbGRzTWFwcGluZ1R5cGVzKEFycmF5TGlzdDxEeW5hbWljRW50aXR5RmllbGQ+IGZpZWxkcykgewotCQlJU3RhdHVzIHZhbGlkYXRlRmllbGRNYXBwaW5nVHlwZVN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gbWFwcGluZ0tleXMgPSB0aGlzLmdldE1hcHBpbmdLZXlzKGZpZWxkcyk7Ci0JCWlmIChoYXNJREFuZEVtYmVkZGVkSURNYXBwaW5nRGVmaW5lZChtYXBwaW5nS2V5cykpIHsKLQkJCXZhbGlkYXRlRmllbGRNYXBwaW5nVHlwZVN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0SnBhVWlQbHVnaW4uUExVR0lOX0lELCAKLQkJCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkVjbGlwc2VMaW5rRHluYW1pY0VudGl0eVdpemFyZF9ib3RoSURBbmRFbWJlZGRlZElERGVmaW5lZEVycm9yKTsKLQkJfSBlbHNlIGlmIChoYXNNdWx0aXBsZUVtYmVkZGVkSURNYXBwaW5ncyhtYXBwaW5nS2V5cykpIHsKLQkJCXZhbGlkYXRlRmllbGRNYXBwaW5nVHlwZVN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0SnBhVWlQbHVnaW4uUExVR0lOX0lELCAKLQkJCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkVjbGlwc2VMaW5rRHluYW1pY0VudGl0eVdpemFyZF9tdWx0aXBsZUVtYmVkZGVkSURzRGVmaW5lZEVycm9yKTsKLQkJfQotCQlpZiAoIXZhbGlkYXRlRmllbGRNYXBwaW5nVHlwZVN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybiB2YWxpZGF0ZUZpZWxkTWFwcGluZ1R5cGVTdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBnZXRNYXBwaW5nS2V5cyhBcnJheUxpc3Q8RHluYW1pY0VudGl0eUZpZWxkPiBmaWVsZHMpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPER5bmFtaWNFbnRpdHlGaWVsZCwgU3RyaW5nPihmaWVsZHMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oRHluYW1pY0VudGl0eUZpZWxkIGZpZWxkKSB7Ci0JCQkJcmV0dXJuIGZpZWxkLmdldE1hcHBpbmdUeXBlKCkuZ2V0S2V5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0lEQW5kRW1iZWRkZWRJRE1hcHBpbmdEZWZpbmVkKEl0ZXJhYmxlPFN0cmluZz4gbWFwcGluZ0tleXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhtYXBwaW5nS2V5cywgTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSAKLQkJCQkmJiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMobWFwcGluZ0tleXMsIE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc011bHRpcGxlRW1iZWRkZWRJRE1hcHBpbmdzKEl0ZXJhYmxlPFN0cmluZz4gbWFwcGluZ0tleXMpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBrZXkgOiBtYXBwaW5nS2V5cykgewotCQkJaWYgKGtleSA9PSBNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCQlpKys7Ci0JCQkJaWYgKGkgPiAxKSByZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY2hlY2tJbnB1dEZpZWxkc0F0dHJpYnV0ZVR5cGVWYWxpZGl0eShMaXN0PER5bmFtaWNFbnRpdHlGaWVsZD4gZmllbGRzKSB7Ci0JCUlTdGF0dXMgdmFsaWRhdGVGaWVsZFR5cGVTdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlmb3IgKER5bmFtaWNFbnRpdHlGaWVsZCBmaWVsZDogZmllbGRzKSB7Ci0JCQlpZiAoZmllbGQuaXNLZXkoKSAmJiAhZmllbGQuY291bGRUeXBlQmVQS1R5cGUoKSkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuRWNsaXBzZUxpbmtEeW5hbWljRW50aXR5V2l6YXJkX2ludmFsaWRQS1R5cGUsIG5ldyBPYmplY3RbXXtmaWVsZC5nZXRGcW5UeXBlTmFtZSgpfSk7Ci0JCQkJdmFsaWRhdGVGaWVsZFR5cGVTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCUpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKLQkJCQlicmVhazsJCQkJCi0JCQl9Ci0JCQlTdHJpbmcgc2lnID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc2lnID0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUoZmllbGQuZ2V0RnFuVHlwZU5hbWUoKSwgdHJ1ZSk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkVjbGlwc2VMaW5rRHluYW1pY0VudGl0eVdpemFyZF9pbnZhbGlkQXJndW1lbnQsIG5ldyBPYmplY3RbXXtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pOwotCQkJCXZhbGlkYXRlRmllbGRUeXBlU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoc2lnID09IG51bGwpewotCQkJCXZhbGlkYXRlRmllbGRUeXBlU3RhdHVzID0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSmF2YVR5cGVOYW1lKGZpZWxkLmdldFR5cGUoKSwgSmF2YUNvcmUuVkVSU0lPTl8xXzUsIEphdmFDb3JlLlZFUlNJT05fMV81KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWludCBzaWdUeXBlID0gU2lnbmF0dXJlLmdldFR5cGVTaWduYXR1cmVLaW5kKHNpZyk7Ci0JCQlpZiAoc2lnVHlwZSA9PSBTaWduYXR1cmUuQkFTRV9UWVBFX1NJR05BVFVSRSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSBpZiAoc2lnVHlwZSA9PSBTaWduYXR1cmUuQVJSQVlfVFlQRV9TSUdOQVRVUkUpIHsKLQkJCQlTdHJpbmcgZWxlbWVudFNpZ25hdHVyZSA9IFNpZ25hdHVyZS5nZXRFbGVtZW50VHlwZShzaWcpOwotCQkJCWlmIChTaWduYXR1cmUuZ2V0VHlwZVNpZ25hdHVyZUtpbmQoZWxlbWVudFNpZ25hdHVyZSkgPT0gU2lnbmF0dXJlLkJBU0VfVFlQRV9TSUdOQVRVUkUpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghdmFsaWRhdGVGaWVsZFR5cGVTdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdGVGaWVsZFR5cGVTdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgY2hlY2tJbnB1dEZpZWxkc0F0dHJpYnV0ZVR5cGVFeGlzdGVuY2UoTGlzdDxEeW5hbWljRW50aXR5RmllbGQ+IGZpZWxkcykgewotCQlJU3RhdHVzIHZhbGlkYXRlRmllbGRUeXBlU3RhdHVzPVN0YXR1cy5PS19TVEFUVVM7Ci0JCWZvciAoRHluYW1pY0VudGl0eUZpZWxkIGZpZWxkOiBmaWVsZHMpIHsKLQkJCVN0cmluZyBzaWcgPSBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZShmaWVsZC5nZXRGcW5UeXBlTmFtZSgpICx0cnVlKTsKLQkJCWlmIChzaWcgPT0gbnVsbCkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuRWNsaXBzZUxpbmtEeW5hbWljRW50aXR5V2l6YXJkX3R5cGVOb3RJblByb2plY3RDbGFzc3BhdGgsIG5ldyBPYmplY3RbXXtmaWVsZC5nZXRGcW5UeXBlTmFtZSgpfSk7Ci0JCQkJdmFsaWRhdGVGaWVsZFR5cGVTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWludCBzaWdUeXBlID0gU2lnbmF0dXJlLmdldFR5cGVTaWduYXR1cmVLaW5kKHNpZyk7Ci0JCQlpZiAoc2lnVHlwZSA9PSBTaWduYXR1cmUuQkFTRV9UWVBFX1NJR05BVFVSRSl7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UgaWYgKHNpZ1R5cGUgPT0gU2lnbmF0dXJlLkFSUkFZX1RZUEVfU0lHTkFUVVJFKSB7Ci0JCQkJU3RyaW5nIGVsZW1lbnRTaWduYXR1cmUgPSBTaWduYXR1cmUuZ2V0RWxlbWVudFR5cGUoc2lnKTsKLQkJCQlpZihTaWduYXR1cmUuZ2V0VHlwZVNpZ25hdHVyZUtpbmQoZWxlbWVudFNpZ25hdHVyZSkgPT0gU2lnbmF0dXJlLkJBU0VfVFlQRV9TSUdOQVRVUkUpewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJU3RyaW5nIHF1YWxpZmllZE5hbWUgPSBTaWduYXR1cmUudG9TdHJpbmcoZWxlbWVudFNpZ25hdHVyZSk7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFRhcmdldFByb2plY3QoKTsKLQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQkJSVR5cGUgdHlwZSA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJdHlwZSA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKHF1YWxpZmllZE5hbWUpOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXZhbGlkYXRlRmllbGRUeXBlU3RhdHVzID0gZS5nZXRTdGF0dXMoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSAKLQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkVjbGlwc2VMaW5rRHluYW1pY0VudGl0eVdpemFyZF90eXBlTm90SW5Qcm9qZWN0Q2xhc3NwYXRoLCBuZXcgT2JqZWN0W117ZmllbGQuZ2V0RnFuVHlwZU5hbWUoKX0pOwotCQkJCQl2YWxpZGF0ZUZpZWxkVHlwZVN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlKcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFRhcmdldFByb2plY3QoKTsKLQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQkJSVR5cGUgdHlwZSA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJdHlwZSA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKGZpZWxkLmdldEZxblR5cGVOYW1lKCkpOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXZhbGlkYXRlRmllbGRUeXBlU3RhdHVzID0gZS5nZXRTdGF0dXMoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuRWNsaXBzZUxpbmtEeW5hbWljRW50aXR5V2l6YXJkX3R5cGVOb3RJblByb2plY3RDbGFzc3BhdGgsIG5ldyBPYmplY3RbXXtmaWVsZC5nZXRGcW5UeXBlTmFtZSgpfSk7Ci0JCQkJCXZhbGlkYXRlRmllbGRUeXBlU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKCF2YWxpZGF0ZUZpZWxkVHlwZVN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybiB2YWxpZGF0ZUZpZWxkVHlwZVN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBJdCBwcm92aWRlcyBhIHNpbXBsZSAKLQkgKiBhbGdvcml0aG0gZm9yIGRldGVjdGluZyBkeW5hbWljIGVudGl0eSBmaWVsZHMgdGhhdCBoYXZlIGR1cGxpY2F0ZSBuYW1lcy4gCi0JICogSXQgd2lsbCBhY2NlcHQgYSBudWxsIHBhcmFtZXRlciBhbmQgcmV0dXJuIGJvb2xlYW4uCi0JICogCi0JICogQHBhcmFtIGxpc3Qgb2YgRHluYW1pY0VudGl0eUZpZWxkCi0JICogQHJldHVybiBib29sZWFuIHRydWUgaWYgZHVwbGljYXRlIGZpZWxkcyBleGlzdDsgb3RoZXJ3aXNlLCBmYWxzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNEdXBsaWNhdGVzSW5FbnRpdHlGaWVsZHMoQXJyYXlMaXN0PER5bmFtaWNFbnRpdHlGaWVsZD4gZmllbGRzKSB7Ci0JCWlmIChmaWVsZHMgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBuID0gZmllbGRzLnNpemUoKTsKLQkJLy8gbmVzdGVkIGZvciBsb29wcyB0byBjaGVjayBlYWNoIGVsZW1lbnQgdG8gc2VlIGlmIG90aGVyIGVsZW1lbnRzIGFyZSB0aGUgc2FtZQotCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJRHluYW1pY0VudGl0eUZpZWxkIGZpZWxkID0gZmllbGRzLmdldChpKTsKLQkJCWZvciAoaW50IGogPSBpICsgMTsgaiA8IG47IGorKykgewotCQkJCUR5bmFtaWNFbnRpdHlGaWVsZCBpbnRFbnRpdHkgPSBmaWVsZHMuZ2V0KGopOwotCQkJCWlmIChpbnRFbnRpdHkuZ2V0TmFtZSgpLmVxdWFscyhmaWVsZC5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBJdCB3aWxsIGJlIHVzZWQgdG8gdmFsaWRhdGUgaWYKLQkgKiB0aGVyZSBhcmUgbXVsdGlwbGUgZHluYW1pYyBlbnRpdHkgZmllbGQgd2l0aCBJRCBtYXBwaW5nIHR5cGUgZGVmaW5lZCBhbmQgZ2l2ZQotCSAqIHRoZSBjb3JyZXNwb25kaW5nIGluZm9ybWF0aW9uIGlmIHRoZXJlIGFyZS4KLQkgKiBJdCB3aWxsIGFjY2VwdCBhIG51bGwgcGFyYW1ldGVyLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0IG9mIER5bmFtaWNFbnRpdHlGaWVsZCB3aXRoIElEIG1hcHBpbmcgdHlwZQotCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGR1cGxpY2F0ZSBmaWVsZHMgZXhpc3Q7IG90aGVyd2lzZSwgZmFsc2UKLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVQcmltYXJ5S2V5RmllbGRzTGlzdChBcnJheUxpc3Q8RHluYW1pY0VudGl0eUZpZWxkPiBwa0ZpZWxkcykgewotCQlpZiAocGtGaWVsZHMuc2l6ZSgpID4gMSkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuSU5GTywgSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmRfYXBwbHlFbWJlZGRlZElkTWFwcGluZ0luZm8pOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gdmFsaWRhdGUgaWYgYSB0eXBlIHdpdGggdGhlIHNhbWUgZnVsbCBxdWFsaWZpZWQgbmFtZSBhcyB0aGUgZHluYW1pYwotCSAqIGVudGl0eSBleGlzdHMuIElmIGEgSmF2YSB0eXBlIG9yIGEgc3RhdGljIE9STSB0eXBlIHdpdGggdGhlIGdpdmVuIG5hbWUgZXhpc3RzLCBhIHdhcm5pbmcgaXMgZ2l2ZW47IAotCSAqIGlmIGEgZHluYW1pYyB0eXBlIHdpdGggdGhlIGdpdmVuIG5hbWUgZXhpc3RzLCBhbiBlcnJvciBpcyBnaXZlbi4gRGlmZmVyZW50IG1lc3NhZ2UgaXMgCi0JICogZ2l2ZW4gaWYgdGhlIGdpdmVuIG5hbWUgYW5kIHRoZSBleGlzdGluZyBvbmUgYXJlIHNhbWUgYnV0IHdpdGggZGlmZmVyZW50IGNhc2VzLgotCSAqIAotCSAqIFNpbmNlIHNvdXJjZSBmb2xkZXIgaXMgbm90IGEgY29uc2lkZXJhdGlvbiBvZiBkeW5hbWljIGVudGl0aWVzLCB3ZSB3aWxsIGdpdmUgYSB3YXJuaW5nCi0JICogbWVzc2FnZSBpZiBhIEphdmEgdHlwZSB3aXRoIHRoZSBnaXZlbiBmdWxsIHF1YWxpZmllZCBuYW1lIChwYWNrYWdlIG5hbWUgKyB0eXBlIG5hbWUpIGV4aXN0cwotCSAqIHJlZ2FyZGxlc3Mgd2hpY2ggc291cmNlIGZvbGRlciB0aGUgSmF2YSB0eXBlIGV4aXN0cyBpbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFja2FnZU5hbWUgcGFja2FnZSBuYW1lIHNwZWNpZmllZAotCSAqIAkJICB0eXBlTmFtZSAgICBjbGFzcyBuYW1lIHNwZWNpZmllZAotCSAqIEByZXR1cm4gSVN0YXR1cyBkb2VzIHRoZSB0eXBlIHdpdGggdGhlIGdpdmVuIGZ1bGwgcXVhbGlmaWVkIG5hbWUgZXhpc3RzCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElTdGF0dXMgY2FuQ3JlYXRlVHlwZUluQ2xhc3NwYXRoKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCVN0cmluZyBmdWxseVF1YWxpZmllZE5hbWUgPSBTdHJpbmdUb29scy5FTVBUWV9TVFJJTkc7Ci0JCWlmICghU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShwYWNrYWdlTmFtZSkpIHsKLQkJCWZ1bGx5UXVhbGlmaWVkTmFtZSA9IHBhY2thZ2VOYW1lICsgRE9UICsgdHlwZU5hbWU7Ci0JCX0gZWxzZSB7Ci0JCQlmdWxseVF1YWxpZmllZE5hbWUgPSB0eXBlTmFtZTsKLQkJfQotCQkvL1NpbmNlIHRoZSBleGlzdGVuY2Ugb2YgYSBzdGF0aWMgT1JNIHR5cGUgZGVwZW5kcyBvbiB0aGUgY29ycmVzcG9uZGluZyBKYXZhIHR5cGUsCi0JCS8vdGhlcmUgaXMgbm8gbmVlZCBmb3IgYSBzZXBhcmF0ZSB2YWxpZGF0aW9uIG9mIGl0LgotCQlmb3IgKFN0cmluZyBuYW1lIDogdGhpcy5nZXRKYXZhVHlwZU5hbWVzKCkpIHsKLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwobmFtZSwgZnVsbHlRdWFsaWZpZWROYW1lKSkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoCi0JCQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuRWNsaXBzZUxpbmtEeW5hbWljRW50aXR5V2l6YXJkX3R5cGVFeGlzdHNXYXJuaW5nLCAKLQkJCQkJCW5ldyBPYmplY3RbXSB7IGZ1bGx5UXVhbGlmaWVkTmFtZSB9KTsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKLQotCQkJfSBlbHNlIGlmIChTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKG5hbWUsIGZ1bGx5UXVhbGlmaWVkTmFtZSkpIHsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkVjbGlwc2VMaW5rRHluYW1pY0VudGl0eVdpemFyZF90eXBlV2l0aERpZmZDYXNlRXhpc3RzV2FybmluZywgCi0JCQkJCQluZXcgT2JqZWN0W10geyBmdWxseVF1YWxpZmllZE5hbWUgfSk7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBKcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQkJUGVyc2lzdGVuY2VVbml0IHB1ID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJaWYgKHB1ICE9IG51bGwpIHsKLQkJCWZvciAoU3RyaW5nIG5hbWUgOiAoKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkpLmdldEVjbGlwc2VMaW5rRHluYW1pY1BlcnNpc3RlbnRUeXBlTmFtZXMoKSkgewotCQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwobmFtZSwgZnVsbHlRdWFsaWZpZWROYW1lKSkgewotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmRfZHluYW1pY1R5cGVFeGlzdHNFcnJvciwgCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgZnVsbHlRdWFsaWZpZWROYW1lIH0pOwotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0KLQkJCQl9IGVsc2UgaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UobmFtZSwgZnVsbHlRdWFsaWZpZWROYW1lKSkgewotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmRfZHluYW1pY1R5cGVXaXRoRGlmZkNhc2VFeGlzdHNFcnJvciwgCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgZnVsbHlRdWFsaWZpZWROYW1lIH0pOwotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbi5QTFVHSU5fSUQsIAotCQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuRWNsaXBzZUxpbmtEeW5hbWljRW50aXR5V2l6YXJkX3BlcnNpc3RlbmNlVW5pdE5vdEZvdW5kRXJyb3IpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSBnaXZlbiBsaXN0IG9mIElUeXBlCi0JICovCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFUeXBlTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxJVHlwZSwgU3RyaW5nPih0aGlzLmdldEphdmFUeXBlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKElUeXBlIHR5cGUpIHsKLQkJCQlyZXR1cm4gdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgSmF2YSB0eXBlcyBjcm9zcyB0aGUgc2VsZWN0IHByb2plY3QKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxJVHlwZT4gZ2V0SmF2YVR5cGVzKCkgewotCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHBhY2tSb290cyA9IHRoaXMuZ2V0SmF2YVBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCUxpc3Q8SVR5cGU+IHR5cGVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8SVR5cGU+KCk7Ci0JCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA6IHBhY2tSb290cykgewotCQkJdHJ5IHsKLQkJCQlJSmF2YUVsZW1lbnRbXSBqRWxlbWVudHMgPSByb290LmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChJSmF2YUVsZW1lbnQgakVsZW1lbnQgOiBqRWxlbWVudHMpIHsKLQkJCQkJaWYgKGpFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpIHsKLQkJCQkJCUlDb21waWxhdGlvblVuaXRbXSB1bml0cyA9ICgoSVBhY2thZ2VGcmFnbWVudCkgakVsZW1lbnQpLmdldENvbXBpbGF0aW9uVW5pdHMoKTsKLQkJCQkJCWZvciAoSUNvbXBpbGF0aW9uVW5pdCB1bml0IDogdW5pdHMpIHsKLQkJCQkJCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHR5cGVzTGlzdCwgdW5pdC5nZXRUeXBlcygpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gZmFsbCB0aHJvdWdoCi0JCQkJSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0JCi0JCXJldHVybiB0eXBlc0xpc3Q7Ci0JfQotCi0JLy8gKioqKioqKioqKioqKioqKioqIG1pc2MgKioqKioqKioqKioqKioqKioqKioqKioKLQotCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRUYXJnZXRQcm9qZWN0KCk7Ci0JCXJldHVybiAoKHByb2plY3QgIT0gbnVsbCkgJiYgSnBhRmFjZXQuaXNJbnN0YWxsZWQocHJvamVjdCkpID8KLQkJCQl0aGlzLmdldEpwYVByb2plY3QocHJvamVjdCkgOgotCQkJCQludWxsOwotCX0KLQotCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gKEpwYVByb2plY3QpIHByb2plY3QuZ2V0QWRhcHRlcihKcGFQcm9qZWN0LmNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJUGVyc2lzdGVuY2UgcCA9IHRoaXMuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJaWYgKHAgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTGlzdEl0ZXJhdG9yPFBlcnNpc3RlbmNlVW5pdD4gdW5pdHMgPSBwLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5pdGVyYXRvcigpOwotCQlyZXR1cm4gdW5pdHMuaGFzTmV4dCgpID8gdW5pdHMubmV4dCgpIDogbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2UgZ2V0UGVyc2lzdGVuY2UoKSB7Ci0JCVBlcnNpc3RlbmNlWG1sIHB4bWwgPSB0aGlzLmdldFBlcnNpc3RlbmNlWG1sKCk7Ci0JCXJldHVybiAocHhtbCA9PSBudWxsKSA/IG51bGwgOiBweG1sLmdldFBlcnNpc3RlbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sIGdldFBlcnNpc3RlbmNlWG1sKCkgewotCQlKcGFSb290Q29udGV4dE5vZGUgcmNuID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0Um9vdENvbnRleHROb2RlKCk7Ci0JCXJldHVybiAocmNuID09IG51bGwpID8gbnVsbCA6IHJjbi5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZW50aXR5L2RhdGEvbW9kZWwvRHluYW1pY0VudGl0eUZpZWxkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2VudGl0eS9kYXRhL21vZGVsL0R5bmFtaWNFbnRpdHlGaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWUyZjEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZW50aXR5L2RhdGEvbW9kZWwvRHluYW1pY0VudGl0eUZpZWxkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZW50aXR5LmRhdGEubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBEeW5hbWljRW50aXR5RmllbGQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVCA9ICIuIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQlJBQ0tFVF9TUVVBUkUgPSAnWyc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBCUkFDS0VUX0FOR1VMQVIgPSAnPCc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfSkFWQV9MQU5HID0gImphdmEubGFuZy4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBNYXBwaW5nVWlEZWZpbml0aW9uPD8sPz4gbWFwcGluZ1R5cGU7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgZnFuVHlwZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgYm9vbGVhbiBrZXkgPSBmYWxzZTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIFBLX1RZUEVTID0geyJpbnQiLCAibG9uZyIsICJzaG9ydCIsICJjaGFyIiwgImJvb2xlYW4iLCAiYnl0ZSIsICJkb3VibGUiLCAiZmxvYXQiLCAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCSJqYXZhLmxhbmcuU3RyaW5nIiwgImphdmEuc3FsLkRhdGUiLCAiamF2YS51dGlsLkRhdGUiLCAiamF2YS5sYW5nLkludGVnZXIiLCAiamF2YS5sYW5nLkxvbmciLCAiamF2YS5sYW5nLlNob3J0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQKLQkJImphdmEubGFuZy5DaGFyYWN0ZXIiLCAiamF2YS5sYW5nLkJvb2xlYW4iLCAiamF2YS5sYW5nLkJ5dGUiLCAiamF2YS5sYW5nLkRvdWJsZSIsICJqYXZhLmxhbmcuRmxvYXQifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBQS19UWVBFU19TSE9SVCA9IHsgIlN0cmluZyIsICJJbnRlZ2VyIiwgIkxvbmciLCAiU2hvcnQiLCAiQ2hhcmFjdGVyIiwgIkJvb2xlYW4iLCAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQKLQkJICJCeXRlIiwgIkRvdWJsZSIsICJGbG9hdCIgfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIExpc3Q8U3RyaW5nPiBWQUxJRF9QS19UWVBFUyA9IEFycmF5cy5hc0xpc3QoUEtfVFlQRVMpOwotCXByaXZhdGUgZmluYWwgc3RhdGljIExpc3Q8U3RyaW5nPiBWQUxJRF9QS19UWVBFU19TSE9SVCA9IEFycmF5cy5hc0xpc3QoUEtfVFlQRVNfU0hPUlQpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbWFwcGluZyB0eXBlIG9mIHRoZSBkeW5hbWljIGVudGl0eSBmaWVsZAotCSAqLwotCXB1YmxpYyBNYXBwaW5nVWlEZWZpbml0aW9uPD8sPz4gZ2V0TWFwcGluZ1R5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmdUeXBlOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBnaXZlbiBtYXBwaW5nIHR5cGUgdG8gdGhlIGR5bmFtaWMgZW50aXR5IGZpZWxkCi0JICogCi0JICogQHBhcmFtIG1hcHBpbmdUeXBlIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcHBpbmdUeXBlKE1hcHBpbmdVaURlZmluaXRpb248Pyw/PiBtYXBwaW5nVHlwZSkgewotCQl0aGlzLm1hcHBpbmdUeXBlID0gbWFwcGluZ1R5cGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZHluYW1pYyBlbnRpdHkgZmllbGQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGR5bmFtaWMgZW50aXR5IGZpZWxkCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgdHlwZSAoYXMgYSBzaW1wbGUgbmFtZSkgb2YgdGhlIGR5bmFtaWMgZW50aXR5IGZpZWxkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0eXBlIChhcyBhIHNpbXBsZSBuYW1lKSBvZiB0aGUgZHluYW1pYyBlbnRpdHkgZmllbGQKLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB0eXBlIChhcyBmdWxseSBxdWFsaWZpZWQgbmFtZSkgb2YgdGhlIGR5bmFtaWMgZW50aXR5IGZpZWxkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGcW5UeXBlTmFtZSgpIHsKLQkJcmV0dXJuIGZxblR5cGVOYW1lOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBmdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lIG9mIHRoZSBkeW5hbWljIGVudGl0eSBmaWVsZAotCSAqIAotCSAqIEBwYXJhbSBmcW5UeXBlTmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZxblR5cGVOYW1lKFN0cmluZyBmcW5UeXBlTmFtZSkgewotCQlmcW5UeXBlTmFtZSA9IHJlbW92ZVNwYWNlcyhmcW5UeXBlTmFtZSk7Ci0JCVN0cmluZyBmcW5CYXNpY1R5cGVOYW1lID0gZ2V0QmFzaWNGUU4oZnFuVHlwZU5hbWUpOwotCQlpZiAoZnFuQmFzaWNUeXBlTmFtZS5pbmRleE9mKERPVCkgPT0gLTEpIHsKLQkJCWlmIChWQUxJRF9QS19UWVBFU19TSE9SVC5jb250YWlucyhmcW5CYXNpY1R5cGVOYW1lKSkgewotCQkJCXRoaXMuZnFuVHlwZU5hbWUgPSBQQUNLQUdFX0pBVkFfTEFORyArIGZxblR5cGVOYW1lOwotCQkJCXNldFR5cGUoZnFuVHlwZU5hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmZxblR5cGVOYW1lID0gZnFuVHlwZU5hbWU7Ci0JCQkJc2V0VHlwZShmcW5UeXBlTmFtZSk7Ci0JCQl9CQkJCi0JCX0gZWxzZSB7Ci0JCQl0aGlzLmZxblR5cGVOYW1lID0gZnFuVHlwZU5hbWU7Ci0JCQlzZXRUeXBlKGdldFNpbXBsZU5hbWUoZnFuVHlwZU5hbWUpKTsKLQkJfQkJCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlU3BhY2VzKFN0cmluZyBzdHIpIHsKLQkJc3RyID0gc3RyLnRyaW0oKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzdHIuY2hhckF0KGkpOwotCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKSAKLQkJCQlzYi5hcHBlbmQoYyk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEJhc2ljRlFOKFN0cmluZyBmcW4pIHsKLQkJU3RyaW5nIHJlczsKLQkJaW50IGJzSW5kZXggPSBmcW4uaW5kZXhPZihCUkFDS0VUX1NRVUFSRSk7Ci0JCWludCBiYUluZGV4ID0gZnFuLmluZGV4T2YoQlJBQ0tFVF9BTkdVTEFSKTsKLQkJaWYgKGJzSW5kZXggPT0gLTEpIHsKLQkJCWlmIChiYUluZGV4ID09IC0xKSByZXMgPSBmcW47Ci0JCQllbHNlIHJlcyA9IGZxbi5zdWJzdHJpbmcoMCwgYmFJbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoYmFJbmRleCA9PSAtMSkgcmVzID0gZnFuLnN1YnN0cmluZygwLCBic0luZGV4KTsKLQkJCWVsc2UgcmVzID0gZnFuLnN1YnN0cmluZygwLCBNYXRoLm1heChic0luZGV4LCBiYUluZGV4KSk7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JLyoqCi0JICogRm9yIGludGVybmFsIHB1cnBvc2Ugb25seQotCSAqIENvbnZlcnQgZnVsbHkgcXVhbGlmaWVkIG5hbWUgdG8gdGhlIHNpbXBsZSBvbmUKLQkgKiAKLQkgKiBAcGFyYW0gZnVsbHlOYW1lCi0JICogQHJldHVybiB0aGUgc2ltcGxlIG5hbWUgZm9ybSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgcGFyYW1ldGVyKGxhc3Qgc2VnbWVudCkKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRTaW1wbGVOYW1lKFN0cmluZyBmdWxseU5hbWUpIHsKLQkJcmV0dXJuIGZ1bGx5TmFtZS5zdWJzdHJpbmcoZnVsbHlOYW1lLmxhc3RJbmRleE9mKERPVCkgKyAxKTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBkeW5hbWljIGVudGl0eSBmaWVsZCBpcyBhIHByaW1hcnkga2V5IAotCSAqIG9yIHBhcnQgb2YgY29tcG9zaXRlIHByaW1hcnkga2V5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNLZXkoKSB7Ci0JCXJldHVybiBrZXk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZHluYW1pYyBlbnRpdHkgZmllbGQgdG8gYmUgYSBwcmltYXJ5IGtleSAob3IgcGFydCBvZiBjb21wb3NpdGUgcHJpbWFyeSBrZXkpCi0JICogCi0JICogQHBhcmFtIGtleSAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLZXkoYm9vbGVhbiBrZXkpIHsKLQkJdGhpcy5rZXkgPSBrZXk7Ci0JfQotCQkKLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiB0eXBlIG9mIHRoZSBkeW5hbWljIGVudGl0eSBmaWVsZCBpcyBhbGxvd2VkIHRvIGJlIHVzZWQgYXMgYSB0eXBlIG9mIHByaW1hcnkga2V5LgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gdHlwZSBvZiB0aGUgZmllbGQgY291bGQgYmUgdXNlZCBhcyBhIHR5cGUgb2YgcHJpbWFyeSBrZXkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb3VsZFR5cGVCZVBLVHlwZSgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmVzdWx0ID0gVkFMSURfUEtfVFlQRVMuY29udGFpbnMoZ2V0RnFuVHlwZU5hbWUoKSk7CQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWZpbmFsIGludCBwcmltZSA9IDMxOwotCQlpbnQgcmVzdWx0ID0gMTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQKLQkJCQkrICgoZnFuVHlwZU5hbWUgPT0gbnVsbCkgPyAwIDogZnFuVHlwZU5hbWUuaGFzaENvZGUoKSk7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChuYW1lID09IG51bGwpID8gMCA6IG5hbWUuaGFzaENvZGUoKSk7Ci0JCXJlc3VsdCA9IHByaW1lKiByZXN1bHQgKyAobWFwcGluZ1R5cGUgPT0gbnVsbD8gMCA6IG1hcHBpbmdUeXBlLmhhc2hDb2RlKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogSW1wbGVtZW50IGVxdWFscywgZGVwZW5kaW5nIGZyb20gbmFtZSBvZiB0aGUgZHluYW1pYyBlbnRpdHkgZmllbGQKLQkgKiBhbmQgaXRzIG1hcHBpbmcgYW5kIGF0dHJpYnV0ZSB0eXBlcy4KLQkgKiBUaGUgYXR0cmlidXRlIHR5cGUgaXMgcHJlc2VudGVkIGZyb20gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmaW5hbCBEeW5hbWljRW50aXR5RmllbGQgb3RoZXIgPSAoRHluYW1pY0VudGl0eUZpZWxkKSBvYmo7Ci0JCWlmIChmcW5UeXBlTmFtZSA9PSBudWxsKSB7Ci0JCQlpZiAob3RoZXIuZnFuVHlwZU5hbWUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoIWZxblR5cGVOYW1lLmVxdWFscyhvdGhlci5mcW5UeXBlTmFtZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCWlmIChvdGhlci5uYW1lICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKCFuYW1lLmVxdWFscyhvdGhlci5uYW1lKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG1hcHBpbmdUeXBlID09IG51bGwpIHsKLQkJCWlmIChvdGhlci5tYXBwaW5nVHlwZSAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghbWFwcGluZ1R5cGUuZXF1YWxzKG90aGVyLm1hcHBpbmdUeXBlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9lbnRpdHkvZGF0YS9tb2RlbC9EeW5hbWljRW50aXR5VGVtcGxhdGVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9lbnRpdHkvZGF0YS9tb2RlbC9EeW5hbWljRW50aXR5VGVtcGxhdGVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWVhZWVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZW50aXR5L2RhdGEvbW9kZWwvRHluYW1pY0VudGl0eVRlbXBsYXRlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZW50aXR5LmRhdGEubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm1vZGVsLklFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5JQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBEeW5hbWljRW50aXR5VGVtcGxhdGVNb2RlbCB7Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBkYXRhTW9kZWw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UID0gIi4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLX1NVRkZJWCA9ICJQSyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FTUJFRERFRF9JRF9OQU1FID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RydWN0cyBlbnRpdHkgbW9kZWwgYXMgZXhwYW5zaW9uIG9mIHRoZSBkYXRhIG1vZGVsCi0JICogQHBhcmFtIGRhdGFNb2RlbAotCSAqLwotCXB1YmxpYyBEeW5hbWljRW50aXR5VGVtcGxhdGVNb2RlbChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQl0aGlzLmRhdGFNb2RlbCA9IGRhdGFNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNsYXNzIG5hbWUgb2YgdGhlIGR5bmFtaWMgZW50aXR5Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBnZXRQcm9wZXJ0eShJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5DTEFTU19OQU1FKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBwYWNrYWdlIG5hbWUgd2hlbiB0aGUgZHluYW1pYyBlbnRpdHkgd2lsbCBiZSBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFQYWNrYWdlTmFtZSgpIHsKLQkJcmV0dXJuIGdldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkpBVkFfUEFDS0FHRSkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpIHsKLQkJaWYgKCFnZXRKYXZhUGFja2FnZU5hbWUoKS5lcXVhbHMoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuRU1QVFlfU1RSSU5HKSkgewotCQkJcmV0dXJuIGdldEphdmFQYWNrYWdlTmFtZSgpICsgRE9UICsgZ2V0Q2xhc3NOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGdldENsYXNzTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHByb3BlcnR5Ci0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEByZXR1cm4gc3RyaW5nIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWFwcGluZ1hNTERlZmF1bHQoKSB7Ci0JCWlmIChnZXRNYXBwaW5nWE1MTmFtZSgpLmVxdWFscyhJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTVBUWV9TVFJJTkcpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZ2V0TWFwcGluZ1hNTE5hbWUoKS5lcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ1hNTE5hbWUoKSB7Ci0JCXJldHVybiBkYXRhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuWE1MX05BTUUpLnRyaW0oKTsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0TWFwcGluZ1htbEZpbGUoKSB7Ci0JCUlGaWxlIG9ybUZpbGUgPSBudWxsOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHNvdXJjZUZyYWdtZW50cyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFNvdXJjZUNvbnRhaW5lcnMocHJvamVjdCk7Ci0JCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA6IHNvdXJjZUZyYWdtZW50cykgewotCQkJb3JtRmlsZSA9IHByb2plY3QuZ2V0RmlsZShwYWNrYWdlRnJhZ21lbnRSb290LmdldFJlc291cmNlKCkuZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3IgKyBnZXRNYXBwaW5nWE1MTmFtZSgpKTsKLQkJCWlmIChvcm1GaWxlLmV4aXN0cygpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9ybUZpbGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgZHluYW1pYyBlbnRpdHkgbmFtZSAoY291bGQgYmUgZGlmZmVyZW50IGZyb20gdGhlIGNsYXNzIG5hbWUpCi0JICogU2VlIDxjb2RlPmlzRW50aXR5TmFtZVNldCgpPGNvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbnRpdHlOYW1lKCkgewotCQlyZXR1cm4gZ2V0UHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuRU5USVRZX05BTUUpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGR5bmFtaWMgZW50aXR5IG5hbWUgaXMgZGlmZmVyZW50IHRoYW4gY2xhc3MgbmFtZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW50aXR5TmFtZVNldCgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKCFTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGdldEVudGl0eU5hbWUoKSkgJiYgIWdldENsYXNzTmFtZSgpLmVxdWFscyhnZXRFbnRpdHlOYW1lKCkpKSB7Ci0JCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSB0YWJsZSBuYW1lIGlzIHNwZWNpZmllZCBleHBsaWNpdGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUYWJsZU5hbWVTZXQoKSB7Ci0JCXJldHVybiAhZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5UQUJMRV9OQU1FX0RFRkFVTFQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHRhYmxlIG5hbWUgKGlmIGl0IGlzIHNwZWNpZmllZCkKLQkgKiBTZWUgPGNvZGU+aXNUYWJsZU5hbWVTZXQoKTxjb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0UHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuVEFCTEVfTkFNRSkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gbGlzdCBvZiB0aGUgZHluYW1pYyBlbnRpdHkgZmllbGRzCi0JICovCi0JcHVibGljIExpc3Q8RHluYW1pY0VudGl0eUZpZWxkPiBnZXRFbnRpdHlGaWVsZHMoKSB7Ci0JCUFycmF5TGlzdDxEeW5hbWljRW50aXR5RmllbGQ+IGZpZWxkcyA9IChBcnJheUxpc3Q8RHluYW1pY0VudGl0eUZpZWxkPikgZGF0YU1vZGVsLmdldFByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVOVElUWV9GSUVMRFMpOwotCQlpZiAoZmllbGRzID09IG51bGwpewotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8RHluYW1pY0VudGl0eUZpZWxkPigpOwotCQl9IGVsc2UKLQkJCXJldHVybiBmaWVsZHM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgcHJpbWFyeSBrZXkgaXMgY29tcG9zaXRlIChtb3JlIHRoYW4gb25lIHNldCBhcyBwcmltYXJ5IGtleSBmaWVsZCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBvc2l0ZVBLKCkgewotCQlyZXR1cm4gZ2V0UEtGaWVsZHMoKS5zaXplKCkgPiAxOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gbGlzdCBvZiBwcmltYXJ5IGtleSBmaWVsZHMKLQkgKi8KLQlwdWJsaWMgTGlzdDxEeW5hbWljRW50aXR5RmllbGQ+IGdldFBLRmllbGRzKCkgewotCQlyZXR1cm4gKEFycmF5TGlzdDxEeW5hbWljRW50aXR5RmllbGQ+KSBkYXRhTW9kZWwuZ2V0UHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuUEtfRklFTERTKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGNvbnN0cnVjdGVkIG5hbWUgb2YgdGhlIG1hcHBpbmcgZmlsZSBlbWJlZGRhYmxlIGNsYXNzIChwYWNrYWdlIG5hbWUgKyBlbnRpdHkgbmFtZSArIFBLIGFzIHN1ZmZpeCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVtYmVkZGFibGVDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBnZXRRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkgKyBQS19TVUZGSVg7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb25zdHJ1Y3RlZCB0aGUgZGVmYXVsdCBuYW1lIG9mIHRoZSBlbWJlZGRlZCBpZCBtYXBwaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0RW1iZWRkZWRJZE5hbWUoKSB7Ci0JCXJldHVybiBERUZBVUxUX0VNQkVEREVEX0lEX05BTUU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBJUHJvamVjdCBwcmVzZW50YXRpb24gb2YgSlBBIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gZGF0YU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSk7Ci0JCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9lbnRpdHkvZGF0YS9vcGVyYXRpb24vTmV3RHluYW1pY0VudGl0eUNsYXNzT3BlcmF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2VudGl0eS9kYXRhL29wZXJhdGlvbi9OZXdEeW5hbWljRW50aXR5Q2xhc3NPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQxNzllOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2VudGl0eS9kYXRhL29wZXJhdGlvbi9OZXdEeW5hbWljRW50aXR5Q2xhc3NPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZW50aXR5LmRhdGEub3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtBY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmVudGl0eS5kYXRhLm1vZGVsLkR5bmFtaWNFbnRpdHlGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmVudGl0eS5kYXRhLm1vZGVsLkR5bmFtaWNFbnRpdHlUZW1wbGF0ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5vcGVyYXRpb24uTmV3RW50aXR5Q2xhc3NPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgTmV3RHluYW1pY0VudGl0eUNsYXNzT3BlcmF0aW9uIGV4dGVuZHMgTmV3RW50aXR5Q2xhc3NPcGVyYXRpb24gewotCi0JcHVibGljIE5ld0R5bmFtaWNFbnRpdHlDbGFzc09wZXJhdGlvbihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcihkYXRhTW9kZWwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIGRvRXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmdlbmVyYXRlVXNpbmdUZW1wbGF0ZXMobW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKGUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVVzaW5nVGVtcGxhdGVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBDcmVhdGUgdGhlIGVudGl0eSB0ZW1wbGF0ZSBtb2RlbAotCQlEeW5hbWljRW50aXR5VGVtcGxhdGVNb2RlbCB0ZW1wTW9kZWwgPSBuZXcgRHluYW1pY0VudGl0eVRlbXBsYXRlTW9kZWwodGhpcy5tb2RlbCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSB0aGlzLmdldFRhcmdldFByb2plY3QoKTsKLQkJQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZER5bmFtaWNFbnRpdHlUb1hNTENvbW1hbmQodGVtcE1vZGVsLCBwcm9qZWN0KTsKLQkJdGhpcy5ydW4obmV3IERhbGlSdW5uYWJsZShwcm9qZWN0LmdldFdvcmtzcGFjZSgpLCBjb21tYW5kKSk7Ci0JfQotCi0JLy8gKioqKioqKioqIGFkZCBkeW5hbWljIHR5cGUgbWFwcGluZyB0byBYTUwgY29tbWFuZCAqKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBBZGREeW5hbWljVHlwZU1hcHBpbmdUb1hNTENvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJcHJvdGVjdGVkIGZpbmFsIER5bmFtaWNFbnRpdHlUZW1wbGF0ZU1vZGVsIG1vZGVsOwotCQlwcm90ZWN0ZWQgZmluYWwgSVByb2plY3QgcHJvamVjdDsKLQkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyB0eXBlTWFwcGluZ0tleTsKLQotCQlwcm90ZWN0ZWQgQWRkRHluYW1pY1R5cGVNYXBwaW5nVG9YTUxDb21tYW5kKER5bmFtaWNFbnRpdHlUZW1wbGF0ZU1vZGVsIG1vZGVsLCBJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdHlwZU1hcHBpbmdLZXkpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCQkJdGhpcy50eXBlTWFwcGluZ0tleSA9IHR5cGVNYXBwaW5nS2V5OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCUpwYVhtbFJlc291cmNlIHhtbFJlc291cmNlID0gdGhpcy5nZXRPcm1YbWxSZXNvdXJjZSgpOwotCQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IChFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzKSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRKcGFGaWxlKHhtbFJlc291cmNlLmdldEZpbGUoKSkuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQlFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gKEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUpIGVudGl0eU1hcHBpbmdzLmFkZFBlcnNpc3RlbnRUeXBlKHRoaXMudHlwZU1hcHBpbmdLZXksIHRoaXMubW9kZWwuZ2V0UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpKTsKLQotCQkJdGhpcy51cGRhdGVQZXJzaXN0ZW50VHlwZShlbnRpdHlNYXBwaW5ncywgcGVyc2lzdGVudFR5cGUpOwotCi0JCQl0cnkgewotCQkJCXhtbFJlc291cmNlLnNhdmVJZk5lY2Vzc2FyeSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBlcnNpc3RlbnRUeXBlKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MsIEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUpIHsKLQkJCXRoaXMudXBkYXRlVHlwZU1hcHBpbmcocGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKTsKLQkJCXNldEFjY2Vzc1R5cGUoZW50aXR5TWFwcGluZ3MsIHBlcnNpc3RlbnRUeXBlKTsKLQotCQkJaWYgKHRoaXMubW9kZWwuaXNDb21wb3NpdGVQSygpKSB7Ci0JCQkJRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZSBlbWJlZGRhYmxlID0gKEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUpIGVudGl0eU1hcHBpbmdzLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgdGhpcy5tb2RlbC5nZXRFbWJlZGRhYmxlQ2xhc3NOYW1lKCkpOwotCQkJCXNldEFjY2Vzc1R5cGUoZW50aXR5TWFwcGluZ3MsIGVtYmVkZGFibGUpOwotCQkJCXBlcnNpc3RlbnRUeXBlLmFkZFZpcnR1YWxBdHRyaWJ1dGUodGhpcy5tb2RlbC5nZXREZWZhdWx0RW1iZWRkZWRJZE5hbWUoKSwgTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBlbWJlZGRhYmxlLmdldE5hbWUoKSk7Ci0KLQkJCQlmb3IgKER5bmFtaWNFbnRpdHlGaWVsZCBmaWVsZCA6IHRoaXMubW9kZWwuZ2V0UEtGaWVsZHMoKSkgewotCQkJCQlTdHJpbmcgYXR0cmlidXRlVHlwZSA9IGZpZWxkLmdldEZxblR5cGVOYW1lKCk7Ci0JCQkJCVN0cmluZyBuYW1lID0gZmllbGQuZ2V0TmFtZSgpOwotCQkJCQlTdHJpbmcgbWFwcGluZ1R5cGUgPSBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JCQkJCWVtYmVkZGFibGUuYWRkVmlydHVhbEF0dHJpYnV0ZShuYW1lLCBtYXBwaW5nVHlwZSwgYXR0cmlidXRlVHlwZSk7Ci0JCQkJfQotCi0JCQkJZm9yIChEeW5hbWljRW50aXR5RmllbGQgZmllbGQgOiB0aGlzLm1vZGVsLmdldEVudGl0eUZpZWxkcygpKSB7Ci0JCQkJCWlmIChmaWVsZC5nZXRNYXBwaW5nVHlwZSgpLmdldEtleSgpICE9IE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJCQkJU3RyaW5nIGF0dHJpYnV0ZVR5cGUgPSBmaWVsZC5nZXRGcW5UeXBlTmFtZSgpOwotCQkJCQkJU3RyaW5nIG5hbWUgPSBmaWVsZC5nZXROYW1lKCk7Ci0JCQkJCQlTdHJpbmcgbWFwcGluZ1R5cGUgPSBmaWVsZC5nZXRNYXBwaW5nVHlwZSgpLmdldEtleSgpOwotCQkJCQkJcGVyc2lzdGVudFR5cGUuYWRkVmlydHVhbEF0dHJpYnV0ZShuYW1lLCBtYXBwaW5nVHlwZSwgYXR0cmlidXRlVHlwZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoRHluYW1pY0VudGl0eUZpZWxkIGZpZWxkIDogdGhpcy5tb2RlbC5nZXRFbnRpdHlGaWVsZHMoKSkgewotCQkJCQlTdHJpbmcgYXR0cmlidXRlVHlwZSA9IGZpZWxkLmdldEZxblR5cGVOYW1lKCk7Ci0JCQkJCVN0cmluZyBuYW1lID0gZmllbGQuZ2V0TmFtZSgpOwotCQkJCQlTdHJpbmcgbWFwcGluZ1R5cGUgPSBmaWVsZC5nZXRNYXBwaW5nVHlwZSgpLmdldEtleSgpOwotCQkJCQlwZXJzaXN0ZW50VHlwZS5hZGRWaXJ0dWFsQXR0cmlidXRlKG5hbWUsIG1hcHBpbmdUeXBlLCBhdHRyaWJ1dGVUeXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgc2V0QWNjZXNzVHlwZShFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzLAotCQkJCUVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUpIHsKLQkJCWlmIChlbnRpdHlNYXBwaW5ncy5nZXRBY2Nlc3MoKSAhPSBFY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCkgewotCQkJCXBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhFY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUeXBlTWFwcGluZyhFY2xpcHNlTGlua09ybVR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgZ2V0T3JtWG1sUmVzb3VyY2UoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tb2RlbC5pc01hcHBpbmdYTUxEZWZhdWx0KCkgPwotCQkJCQl0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKSA6Ci0JCQkJCQl0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKHRoaXMubW9kZWwuZ2V0TWFwcGluZ1hNTE5hbWUoKSkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJCXJldHVybiAoSnBhUHJvamVjdCkgdGhpcy5wcm9qZWN0LmdldEFkYXB0ZXIoSnBhUHJvamVjdC5jbGFzcyk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKiogYWRkIGR5bmFtaWMgZW50aXR5IHRvIFhNTCBjb21tYW5kICoqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEFkZER5bmFtaWNFbnRpdHlUb1hNTENvbW1hbmQgZXh0ZW5kcyBBZGREeW5hbWljVHlwZU1hcHBpbmdUb1hNTENvbW1hbmQgewotCQlwcm90ZWN0ZWQgQWRkRHluYW1pY0VudGl0eVRvWE1MQ29tbWFuZChEeW5hbWljRW50aXR5VGVtcGxhdGVNb2RlbCBtb2RlbCwgSVByb2plY3QgcHJvamVjdCkgewotCQkJc3VwZXIobW9kZWwsIHByb2plY3QsIE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUeXBlTWFwcGluZyhFY2xpcHNlTGlua09ybVR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCQlzdXBlci51cGRhdGVUeXBlTWFwcGluZyh0eXBlTWFwcGluZyk7Ci0JCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgdHlwZU1hcHBpbmc7Ci0JCQlpZiAodGhpcy5tb2RlbC5pc0VudGl0eU5hbWVTZXQoKSkgewotCQkJCWVudGl0eS5zZXRTcGVjaWZpZWROYW1lKHRoaXMubW9kZWwuZ2V0RW50aXR5TmFtZSgpKTsKLQkJCX0KLQkJCWlmICh0aGlzLm1vZGVsLmlzVGFibGVOYW1lU2V0KCkpIHsKLQkJCQllbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKHRoaXMubW9kZWwuZ2V0VGFibGVOYW1lKCkpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9oYW5kbGVycy9BZGRWaXJ0dWFsQXR0cmlidXRlSGFuZGxlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9oYW5kbGVycy9BZGRWaXJ0dWFsQXR0cmlidXRlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDdmOWUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQWRkVmlydHVhbEF0dHJpYnV0ZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5QbGF0Zm9ybVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGlhbG9ncy5BZGRWaXJ0dWFsQXR0cmlidXRlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuc2VsZWN0aW9uLkpwYVNlbGVjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLQotLyoqCi0gKiBBZGQgYSB2aXJ0dWFsIGF0dHJpYnV0ZSAobm8gdW5kZXJseWluZyBqYXZhIGF0dHJpYnV0ZSkgdG8gdGhlIHNlbGVjdGVkIHBlcnNpc3RlbnQgdHlwZS4KLSAqIFRoaXMgaGFuZGxlciBpcyBvbmx5IGFjdGl2ZSBpZiA8ZW0+b25lPC9lbT4gRWNsaXBzZUxpbmsgT1JNIHBlcnNpc3RlbnQgdHlwZSBpcyBzZWxlY3RlZC4KLSAqIDxwPgotICogU2VlIDxjb2RlPm9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnhtbDwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRWaXJ0dWFsQXR0cmlidXRlSGFuZGxlcgotCWV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyCi17Ci0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJdGhpcy5leGVjdXRlXyhldmVudCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjdXRlXyhFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gSGFuZGxlclV0aWwuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93Q2hlY2tlZChldmVudCk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbkNoZWNrZWQoZXZlbnQpOwotCQlFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gKEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQlBZGRWaXJ0dWFsQXR0cmlidXRlRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRWaXJ0dWFsQXR0cmlidXRlRGlhbG9nKHdpbmRvdy5nZXRTaGVsbCgpLCBwZXJzaXN0ZW50VHlwZSk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGRpYWxvZy5vcGVuQW5kUmV0dXJuQXR0cmlidXRlKCk7Ci0KLQkJaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQlKcGFTZWxlY3Rpb25NYW5hZ2VyIHNlbGVjdGlvbk1hbmFnZXIgPSBQbGF0Zm9ybVRvb2xzLmdldEFkYXB0ZXIod2luZG93LCBKcGFTZWxlY3Rpb25NYW5hZ2VyLmNsYXNzKTsKLQkJCXNlbGVjdGlvbk1hbmFnZXIuc2V0U2VsZWN0aW9uKGF0dHJpYnV0ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDRiYWZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuU2ltcGxlSXRlbVRyZWVTdGF0ZVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbVRyZWVTdGF0ZVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc3RydWN0dXJlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VTdHJ1Y3R1cmVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLlJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5BYnN0cmFjdFBlcnNpc3RlbmNlWG1sUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc3RydWN0dXJlLlBlcnNpc3RlbmNlU3RydWN0dXJlSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VVaURlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVVpRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5IGJ1aWxkUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlc1VpKEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIHJlc291cmNlVHlwZS5lcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfMV8wX1JFU09VUkNFX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgSXRlbVRyZWVTdGF0ZVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyIGdldFN0cnVjdHVyZVZpZXdGYWN0b3J5UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBTVFJVQ1RVUkVfVklFV19GQUNUT1JZX1BST1ZJREVSOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEl0ZW1UcmVlU3RhdGVQcm92aWRlckZhY3RvcnlQcm92aWRlciBTVFJVQ1RVUkVfVklFV19GQUNUT1JZX1BST1ZJREVSID0KLQkJCW5ldyBTaW1wbGVJdGVtVHJlZVN0YXRlUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXIoCi0JCQkJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VTdHJ1Y3R1cmVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5pbnN0YW5jZSgpLAotCQkJCQlQZXJzaXN0ZW5jZVN0cnVjdHVyZUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5pbnN0YW5jZSgpCi0JCQkJKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMzJlMjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5TY2hlbWFHZW5lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZ2VuZXJhbC5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5sb2dnaW5nLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLm9wdGlvbnMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5QZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlGYWN0b3J5IGltcGxlbWVudHMgUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkKLXsKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKioqKioqKiBwZXJzaXN0ZW5jZSB1bml0IGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SnBhUGFnZUNvbXBvc2l0ZT4gY3JlYXRlUGVyc2lzdGVuY2VVbml0Q29tcG9zaXRlcygKLQkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCi0JCQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJQXJyYXlMaXN0PEpwYVBhZ2VDb21wb3NpdGU+IHBhZ2VzID0gbmV3IEFycmF5TGlzdDxKcGFQYWdlQ29tcG9zaXRlPig4KTsKLQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IGVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SG9sZGVyID0gCi0JCQl0aGlzLmJ1aWxkRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoc3ViamVjdEhvbGRlcik7Ci0KLQkJcGFnZXMuYWRkKHRoaXMuYnVpbGRHZW5lcmFsVGFiKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSkpOwotCQlwYWdlcy5hZGQodGhpcy5idWlsZENvbm5lY3Rpb25UYWIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0JCXBhZ2VzLmFkZCh0aGlzLmJ1aWxkQ3VzdG9taXphdGlvblRhYihlY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0JCXBhZ2VzLmFkZCh0aGlzLmJ1aWxkQ2FjaGluZ1RhYihlY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0JCXBhZ2VzLmFkZCh0aGlzLmJ1aWxkTG9nZ2luZ1RhYihlY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0JCXBhZ2VzLmFkZCh0aGlzLmJ1aWxkT3B0aW9uc1RhYihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQkJcGFnZXMuYWRkKHRoaXMuYnVpbGRTY2hlbWFHZW5lcmF0aW9uVGFiKGVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQkJcGFnZXMuYWRkKHRoaXMuYnVpbGRQcm9wZXJ0aWVzVGFiKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSkpOwotCi0JCXJldHVybiBwYWdlcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHBlcnNpc3RlbmNlIHVuaXQgdGFicyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZSBidWlsZEdlbmVyYWxUYWIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWI8PyBleHRlbmRzIENvbm5lY3Rpb24+IGJ1aWxkQ29ubmVjdGlvblRhYigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxDb25uZWN0aW9uPiBjb25uZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbm5lY3Rpb25Ib2xkZXIoc3ViamVjdEhvbGRlcik7Ci0KLQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWI8Q29ubmVjdGlvbj4oY29ubmVjdGlvbkhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYjw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gYnVpbGRDdXN0b21pemF0aW9uVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q3VzdG9taXphdGlvbj4gY3VzdG9taXphdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDdXN0b21pemF0aW9uSG9sZGVyKHN1YmplY3RIb2xkZXIpOwotCi0JCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiPEN1c3RvbWl6YXRpb24+KGN1c3RvbWl6YXRpb25Ib2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWI8PyBleHRlbmRzIENhY2hpbmc+IGJ1aWxkQ2FjaGluZ1RhYigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IGNhY2hpbmdIb2xkZXIgPSB0aGlzLmJ1aWxkQ2FjaGluZ0hvbGRlcihzdWJqZWN0SG9sZGVyKTsKLQotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYjxDYWNoaW5nPihjYWNoaW5nSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiPD8gZXh0ZW5kcyBMb2dnaW5nPiBidWlsZExvZ2dpbmdUYWIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxMb2dnaW5nPiBsb2dnaW5nSG9sZGVyID0gdGhpcy5idWlsZExvZ2dpbmdIb2xkZXIoc3ViamVjdEhvbGRlcik7Ci0KLQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWI8TG9nZ2luZz4obG9nZ2luZ0hvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYjw/IGV4dGVuZHMgT3B0aW9ucz4gYnVpbGRPcHRpb25zVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9wdGlvbnM+IG9wdGlvbnNIb2xkZXIgPSB0aGlzLmJ1aWxkT3B0aW9uc0hvbGRlcihzdWJqZWN0SG9sZGVyKTsKLQotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYjxPcHRpb25zPihvcHRpb25zSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiIGJ1aWxkU2NoZW1hR2VuZXJhdGlvblRhYigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPFNjaGVtYUdlbmVyYXRpb24+IHNjaGVtYUdlbkhvbGRlciA9IHRoaXMuYnVpbGRTY2hlbWFHZW5lcmF0aW9uSG9sZGVyKHN1YmplY3RIb2xkZXIpOwotCi0JCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiKHNjaGVtYUdlbkhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGUgYnVpbGRQcm9wZXJ0aWVzVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IGJ1aWxkRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdCwgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+KHN1YmplY3RIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHRyYW5zZm9ybV8oUGVyc2lzdGVuY2VVbml0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgdmFsdWU7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENvbm5lY3Rpb24+IGJ1aWxkQ29ubmVjdGlvbkhvbGRlcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0LCBDb25uZWN0aW9uPihzdWJqZWN0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb25uZWN0aW9uIHRyYW5zZm9ybV8oUGVyc2lzdGVuY2VVbml0IHZhbHVlKSB7Ci0KLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCl2YWx1ZSkuZ2V0Q29ubmVjdGlvbigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEN1c3RvbWl6YXRpb24+IGJ1aWxkQ3VzdG9taXphdGlvbkhvbGRlcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgQ3VzdG9taXphdGlvbj4oc3ViamVjdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ3VzdG9taXphdGlvbiB0cmFuc2Zvcm1fKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldEN1c3RvbWl6YXRpb24oKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBidWlsZENhY2hpbmdIb2xkZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQsIENhY2hpbmc+KHN1YmplY3RIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhY2hpbmcgdHJhbnNmb3JtXyhFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRDYWNoaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPExvZ2dpbmc+IGJ1aWxkTG9nZ2luZ0hvbGRlcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgTG9nZ2luZz4oc3ViamVjdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTG9nZ2luZyB0cmFuc2Zvcm1fKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldExvZ2dpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9ucz4gYnVpbGRPcHRpb25zSG9sZGVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQsIE9wdGlvbnM+KHN1YmplY3RIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9wdGlvbnMgdHJhbnNmb3JtXyhQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKLQotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KXZhbHVlKS5nZXRPcHRpb25zKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFNjaGVtYUdlbmVyYXRpb24+IGJ1aWxkU2NoZW1hR2VuZXJhdGlvbkhvbGRlcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgU2NoZW1hR2VuZXJhdGlvbj4oc3ViamVjdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2NoZW1hR2VuZXJhdGlvbiB0cmFuc2Zvcm1fKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldFNjaGVtYUdlbmVyYXRpb24oKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hlRGVmYXVsdHNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoZURlZmF1bHRzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ODE2MWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hlRGVmYXVsdHNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgQ2FjaGVEZWZhdWx0c0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVEZWZhdWx0c0NvbXBvc2l0ZTxUIGV4dGVuZHMgQ2FjaGluZz4gZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHVibGljIENhY2hlRGVmYXVsdHNDb21wb3NpdGUoUGFuZTxUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJdGhpcy5pbml0aWFsaXplQ2FjaGVEZWZhdWx0c1BhbmUocGFyZW50KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hlRGVmYXVsdHNQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgZGVmYXVsdFBhbmUgPSB0aGlzLmFkZFRpdGxlZEdyb3VwKAotCQkJcGFyZW50LAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkNhY2hlRGVmYXVsdHNDb21wb3NpdGVfZ3JvdXBUaXRsZQotCQkpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZUNhY2hlRGVmYXVsdHNDb21wb3NpdGVzKGRlZmF1bHRQYW5lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hlRGVmYXVsdHNDb21wb3NpdGVzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkvLyBEZWZhdWx0IENhY2hlIFR5cGUKLQkJbmV3IERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUodGhpcywgcGFyZW50KTsKLQotCQkvLyBEZWZhdWx0IENhY2hlIFNpemUKLQkJbmV3IERlZmF1bHRDYWNoZVNpemVDb21wb3NpdGU8VD4odGhpcywgcGFyZW50KTsKLQotCQkvLyBEZWZhdWx0IFNoYXJlZCBDYWNoZQotCQluZXcgRGVmYXVsdFNoYXJlZENhY2hlQ29tcG9zaXRlKHRoaXMsIHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hlU2l6ZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hlU2l6ZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGIwYjVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoZVNpemVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5JbnRlZ2VyQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNhY2hpbmdFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBDYWNoZVNpemVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIENhY2hlU2l6ZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8Q2FjaGluZ0VudGl0eT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNhY2hlVHlwZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDYWNoZVNpemVDb21wb3NpdGUoUGFuZTxDYWNoaW5nRW50aXR5PiBwYXJlbnRDb21wb3NpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmFkZENhY2hlU2l6ZUNvbWJvKGNvbnRhaW5lcik7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgYWRkQ2FjaGVTaXplQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSW50ZWdlckNvbWJvPENhY2hpbmdFbnRpdHk+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQ2FjaGVTaXplQ29tcG9zaXRlX2NhY2hlU2l6ZTsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscElkKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0NBQ0hJTkc7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgSW50ZWdlcj4oYnVpbGRDYWNoaW5nSG9sZGVyKCksIENhY2hpbmcuQ0FDSEVfU0laRV9ERUZBVUxUX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCUludGVnZXIgdmFsdWUgPSB0aGlzLnN1YmplY3QuZ2V0Q2FjaGVTaXplRGVmYXVsdCgpOwotCQkJCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJCQl2YWx1ZSA9IHRoaXMuc3ViamVjdC5nZXREZWZhdWx0Q2FjaGVTaXplRGVmYXVsdCgpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIHZhbHVlOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmdFbnRpdHksIEludGVnZXI+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBDYWNoaW5nRW50aXR5LkNBQ0hFX1NJWkVfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIGdldFN1YmplY3RQYXJlbnQoKS5nZXRDYWNoZVNpemVPZihnZXRTdWJqZWN0TmFtZSgpKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCQkJZ2V0U3ViamVjdFBhcmVudCgpLnNldENhY2hlU2l6ZU9mKGdldFN1YmplY3ROYW1lKCksIHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFN1YmplY3ROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkuZ2V0VmFsdWUoKS5nZXROYW1lKCk7Ci0JfQotCQotCXByaXZhdGUgQ2FjaGluZyBnZXRTdWJqZWN0UGFyZW50KCkgewotCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkuZ2V0VmFsdWUoKS5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gYnVpbGRDYWNoaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmdFbnRpdHksIENhY2hpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYWNoaW5nIHRyYW5zZm9ybV8oQ2FjaGluZ0VudGl0eSB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRQYXJlbnQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGVUeXBlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGVUeXBlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YTAxNGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hlVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DYWNoaW5nRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQ2FjaGVUeXBlQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZVR5cGVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPENhY2hpbmdFbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DYWNoZVR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2FjaGVUeXBlQ29tcG9zaXRlKFBhbmU8Q2FjaGluZ0VudGl0eT4gcGFyZW50Q29tcG9zaXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2NhY2hlVHlwZUxhYmVsLAotCQkJbmV3IENhY2hlVHlwZUNvbWJvKGNvbnRhaW5lciksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0NBQ0hJTkcKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIENhY2hlVHlwZUNvbWJvIGV4dGVuZHMgRW51bUZvcm1Db21ib1ZpZXdlcjxDYWNoaW5nRW50aXR5LCBDYWNoZVR5cGU+IHsKLQotCQlwcml2YXRlIENhY2hlVHlwZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKENhY2hlVHlwZUNvbXBvc2l0ZS50aGlzLCBwYXJlbnQpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQlwcm9wZXJ0eU5hbWVzLmFkZChDYWNoaW5nRW50aXR5LkNBQ0hFX1RZUEVfUFJPUEVSVFkpOwotCQl9Ci0KLQkJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gYnVpbGRDYWNoaW5nSG9sZGVyKCkgewotCQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nRW50aXR5LCBDYWNoaW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgQ2FjaGluZyB0cmFuc2Zvcm1fKENhY2hpbmdFbnRpdHkgdmFsdWUpIHsKLQkJCQkJcmV0dXJuIHZhbHVlLmdldFBhcmVudCgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZVR5cGU+IGJ1aWxkRGVmYXVsdENhY2hlVHlwZUhvbGRlcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIENhY2hlVHlwZT4oYnVpbGRDYWNoaW5nSG9sZGVyKCksIENhY2hpbmcuQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIENhY2hlVHlwZSBidWlsZFZhbHVlXygpIHsKLQkJCQkJQ2FjaGVUeXBlIGNhY2hlVHlwZSA9IHN1YmplY3QuZ2V0Q2FjaGVUeXBlRGVmYXVsdCgpOwotCQkJCQlpZiAoY2FjaGVUeXBlID09IG51bGwpIHsKLQkJCQkJCWNhY2hlVHlwZSA9IHN1YmplY3QuZ2V0RGVmYXVsdENhY2hlVHlwZURlZmF1bHQoKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gY2FjaGVUeXBlOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGREZWZhdWx0Q2FjaGluZ1R5cGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcigKLQkJCQlidWlsZERlZmF1bHRDYWNoaW5nVHlwZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkKLQkJCSk7Ci0JCX0KLQotCQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGREZWZhdWx0Q2FjaGluZ1R5cGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJCWlmICgoZS5nZXROZXdWYWx1ZSgpICE9IG51bGwpICYmICFnZXRDb21ibygpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJQ2FjaGVUeXBlQ29tYm8udGhpcy5kb1BvcHVsYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDYWNoZVR5cGVbXSBnZXRDaG9pY2VzKCkgewotCQkJcmV0dXJuIENhY2hlVHlwZS52YWx1ZXMoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2FjaGVUeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCXJldHVybiBnZXRTdWJqZWN0UGFyZW50KCkuZ2V0RGVmYXVsdENhY2hlVHlwZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhDYWNoZVR5cGUgdmFsdWUpIHsKLQkJCXN3aXRjaCAodmFsdWUpIHsKLQkJCQljYXNlIGZ1bGwgOgotCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkNhY2hlVHlwZUNvbXBvc2l0ZV9mdWxsOwotCQkJCWNhc2Ugd2VhayA6Ci0JCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQ2FjaGVUeXBlQ29tcG9zaXRlX3dlYWs7Ci0JCQkJY2FzZSBzb2Z0IDoKLQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DYWNoZVR5cGVDb21wb3NpdGVfc29mdDsKLQkJCQljYXNlIHNvZnRfd2VhayA6Ci0JCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQ2FjaGVUeXBlQ29tcG9zaXRlX3NvZnRfd2VhazsKLQkJCQljYXNlIGhhcmRfd2VhayA6Ci0JCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQ2FjaGVUeXBlQ29tcG9zaXRlX2hhcmRfd2VhazsKLQkJCQljYXNlIG5vbmUgIDoKLQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DYWNoZVR5cGVDb21wb3NpdGVfbm9uZTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJfQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCQkvLyBUaGlzIGlzIHJlcXVpcmVkIHRvIGFsbG93IHRoZSBjbGFzcyBsb2FkZXIgdG8gbGV0IHRoZSBsaXN0ZW5lcgotCQkJLy8gd3JpdHRlbiBhYm92ZSB0byBhY2Nlc3MgdGhpcyBtZXRob2QKLQkJCXN1cGVyLmRvUG9wdWxhdGUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2FjaGVUeXBlIGdldFZhbHVlKCkgewotCQkJcmV0dXJuIGdldFN1YmplY3RQYXJlbnQoKS5nZXRDYWNoZVR5cGVPZihnZXRTdWJqZWN0TmFtZSgpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGVUeXBlPiBkZWZhdWx0Q2FjaGVUeXBlSG9sZGVyID0KLQkJCQlidWlsZERlZmF1bHRDYWNoZVR5cGVIb2xkZXIoKTsKLQotCQkJZGVmYXVsdENhY2hlVHlwZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCQlidWlsZERlZmF1bHRDYWNoaW5nVHlwZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKQotCQkJKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShDYWNoZVR5cGUgdmFsdWUpIHsKLQkJCWdldFN1YmplY3RQYXJlbnQoKS5zZXRDYWNoZVR5cGVPZihnZXRTdWJqZWN0TmFtZSgpLCB2YWx1ZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3ViamVjdE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFN1YmplY3RIb2xkZXIoKS5nZXRWYWx1ZSgpLmdldE5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIENhY2hpbmcgZ2V0U3ViamVjdFBhcmVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLmdldFZhbHVlKCkuZ2V0UGFyZW50KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9EZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRGVmYXVsdENhY2hlU2l6ZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTI4OGQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9EZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5JbnRlZ2VyQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBDYWNoZVNpemVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRDYWNoZVNpemVDb21wb3NpdGU8VCBleHRlbmRzIENhY2hpbmc+IGV4dGVuZHMgUGFuZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2FjaGVUeXBlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIERlZmF1bHRDYWNoZVNpemVDb21wb3NpdGUoUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWFkZERlZmF1bHRDYWNoZVNpemVDb21ibyhjb250YWluZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkRGVmYXVsdENhY2hlU2l6ZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEludGVnZXJDb21ibzxDYWNoaW5nPih0aGlzLCBjb250YWluZXIpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkRlZmF1bHRDYWNoZVNpemVDb21wb3NpdGVfZGVmYXVsdENhY2hlU2l6ZTsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscElkKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0NBQ0hJTkdfREVGQVVMVF9TSVpFOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRDYWNoZVNpemVEZWZhdWx0KCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ2FjaGluZy5DQUNIRV9TSVpFX0RFRkFVTFRfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDYWNoZVNpemVEZWZhdWx0KCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRDYWNoZVNpemVEZWZhdWx0KHZhbHVlKTsKLQkJCQkJfQotCQkJCX07CQkJCi0JCQl9Ci0JCX07Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0RlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9EZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTg3MjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0RlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPENhY2hpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBEZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBDYWNoaW5nPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIoIHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8Q2FjaGluZywgQ2FjaGVUeXBlPiBidWlsZERlZmF1bHRDYWNoZVR5cGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxDYWNoaW5nLCBDYWNoZVR5cGU+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChDYWNoaW5nLkNBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhY2hlVHlwZVtdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIENhY2hlVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBzb3J0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhY2hlVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0Q2FjaGVUeXBlRGVmYXVsdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhDYWNoZVR5cGUgdmFsdWUpIHsKLQkJCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQkJCWNhc2UgZnVsbCA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkNhY2hlVHlwZUNvbXBvc2l0ZV9mdWxsOwotCQkJCQljYXNlIHdlYWsgOgotCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DYWNoZVR5cGVDb21wb3NpdGVfd2VhazsKLQkJCQkJY2FzZSBzb2Z0IDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQ2FjaGVUeXBlQ29tcG9zaXRlX3NvZnQ7Ci0JCQkJCWNhc2Ugc29mdF93ZWFrIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQ2FjaGVUeXBlQ29tcG9zaXRlX3NvZnRfd2VhazsKLQkJCQkJY2FzZSBoYXJkX3dlYWsgOgotCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DYWNoZVR5cGVDb21wb3NpdGVfaGFyZF93ZWFrOwotCQkJCQljYXNlIG5vbmUgIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQ2FjaGVUeXBlQ29tcG9zaXRlX25vbmU7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJCX0KLQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYWNoZVR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRDYWNoZVR5cGVEZWZhdWx0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoQ2FjaGVUeXBlIHZhbHVlKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldENhY2hlVHlwZURlZmF1bHQodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KCBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9kZWZhdWx0Q2FjaGVUeXBlTGFiZWwsCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdENhY2hlVHlwZUNvbWJvKCBjb250YWluZXIpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9DQUNISU5HX0RFRkFVTFRfVFlQRQkKLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRGVmYXVsdFNoYXJlZENhY2hlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRGVmYXVsdFNoYXJlZENhY2hlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YWEyMjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0RlZmF1bHRTaGFyZWRDYWNoZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBEZWZhdWx0U2hhcmVDYWNoZUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFNoYXJlZENhY2hlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDYWNoaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGVmYXVsdFNoYXJlQ2FjaGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRGVmYXVsdFNoYXJlZENhY2hlQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBDYWNoaW5nPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NoYXJlZENhY2hlRGVmYXVsdExhYmVsLAotCQkJdGhpcy5idWlsZERlZmF1bHRTaGFyZWRDYWNoZUhvbGRlcigpLAotCQkJdGhpcy5idWlsZERlZmF1bHRTaGFyZWRDYWNoZVN0cmluZ0hvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9DQUNISU5HX0RFRkFVTFRfU0hBUkVECi0JCSk7Ci0JfQotCQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRTaGFyZWRDYWNoZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDYWNoaW5nLlNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U2hhcmVkQ2FjaGVEZWZhdWx0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U2hhcmVkQ2FjaGVEZWZhdWx0KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0RGVmYXVsdFNoYXJlZENhY2hlSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9kZWZhdWx0U2hhcmVkQ2FjaGVEZWZhdWx0TGFiZWwsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NoYXJlZENhY2hlRGVmYXVsdExhYmVsOwotCQkJfQotCQl9OwotCX0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHREZWZhdWx0U2hhcmVkQ2FjaGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ2FjaGluZy5TSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNoYXJlZENhY2hlRGVmYXVsdCgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFNoYXJlZENhY2hlRGVmYXVsdCgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJjM2RiZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgQ2FjaGluZz4gZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZShQYW5lPFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRoaXMuYWRkU2VjdGlvbigKLQkJCXBhcmVudCwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2VjdGlvblRpdGxlLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zZWN0aW9uRGVzY3JpcHRpb24KLQkJKTsKLQotCQkvLyBEZWZhdWx0cwotCQluZXcgQ2FjaGVEZWZhdWx0c0NvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCQkvLyBFbnRpdGllc0xpc3QKLQkJbmV3IEVudGl0eUxpc3RDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQkJLy8gRmx1c2ggQ2xlYXIgQ2FjaGUKLQkJbmV3IEZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRW50aXR5Q2FjaGluZ1Byb3BlcnR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRW50aXR5Q2FjaGluZ1Byb3BlcnR5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZGI3MDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VudGl0eUNhY2hpbmdQcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DYWNoaW5nRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eUNhY2hpbmdQcm9wZXJ0eUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8Q2FjaGluZ0VudGl0eT4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnRpdHlDYWNoaW5nUHJvcGVydHlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVudGl0eUNhY2hpbmdQcm9wZXJ0eUNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBDYWNoaW5nPiBwYXJlbnRDb21wb3NpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZ0VudGl0eT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gQ2FjaGUgVHlwZQotCQluZXcgQ2FjaGVUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0KLQkJLy8gQ2FjaGUgU2l6ZQotCQluZXcgQ2FjaGVTaXplQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0KLQkJLy8gU2hhcmUgQ2FjaGUKLQkJbmV3IFNoYXJlZENhY2hlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VudGl0eUxpc3RDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9FbnRpdHlMaXN0Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYmMxOTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VudGl0eUxpc3RDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNhY2hpbmdFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5KcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NTZXJ2aWNlOwotCi0vKioKLSAqICBFbnRpdHlMaXN0Q29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlMaXN0Q29tcG9zaXRlPFQgZXh0ZW5kcyBDYWNoaW5nPiBleHRlbmRzIFBhbmU8VD4KLXsKLQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmdFbnRpdHk+IGVudGl0eUhvbGRlcjsKLQkKLQlwdWJsaWMgRW50aXR5TGlzdENvbXBvc2l0ZShQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXRoaXMuZW50aXR5SG9sZGVyID0gdGhpcy5idWlsZEVudGl0eUhvbGRlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IHRoaXMuYWRkVGl0bGVkR3JvdXAoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuQ2FjaGluZ0VudGl0eUxpc3RDb21wb3NpdGVfZ3JvdXBUaXRsZQotCQkpOwotCi0JCS8vIEVudGl0aWVzIGFkZC9yZW1vdmUgbGlzdCBwYW5lCi0JCW5ldyBBZGRSZW1vdmVMaXN0UGFuZTxDYWNoaW5nPigKLQkJCXRoaXMsCi0JCQljb250YWluZXIsCi0JCQl0aGlzLmJ1aWxkRW50aXRpZXNBZGFwdGVyKCksCi0JCQl0aGlzLmJ1aWxkRW50aXRpZXNMaXN0SG9sZGVyKCksCi0JCQl0aGlzLmVudGl0eUhvbGRlciwKLQkJCXRoaXMuYnVpbGRFbnRpdHlMYWJlbFByb3ZpZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0NBQ0hJTkcKLQkJKTsKLQotCQkvLyBFbnRpdHkgQ2FjaGluZyBwcm9wZXJ0eSBwYW5lCi0JCUVudGl0eUNhY2hpbmdQcm9wZXJ0eUNvbXBvc2l0ZSBwYW5lID0gbmV3IEVudGl0eUNhY2hpbmdQcm9wZXJ0eUNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQl0aGlzLmVudGl0eUhvbGRlciwKLQkJCWNvbnRhaW5lcgotCQkpOwotCQl0aGlzLmluc3RhbGxQYW5lRW5hYmxlcih0aGlzLmVudGl0eUhvbGRlciwgcGFuZSk7Ci0JfQotCQotCXByaXZhdGUgQWRkUmVtb3ZlTGlzdFBhbmUuQWRhcHRlciBidWlsZEVudGl0aWVzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlFbnRpdHlMaXN0Q29tcG9zaXRlLnRoaXMuYWRkRW50aXRpZXMobGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJQ2FjaGluZyBjYWNoaW5nID0gZ2V0U3ViamVjdCgpOwotCQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKSkgewotCQkJCQlDYWNoaW5nRW50aXR5IGVudGl0eUNhY2hpbmcgPSAoQ2FjaGluZ0VudGl0eSkgaXRlbTsKLQkJCQkJY2FjaGluZy5yZW1vdmVFbnRpdHkoZW50aXR5Q2FjaGluZy5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEVudGl0aWVzKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQlJVHlwZSB0eXBlID0gdGhpcy5jaG9vc2VFbnRpdHkoKTsKLQotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZW50aXR5TmFtZSA9IHRoaXMuZ2V0RW50aXR5TmFtZSh0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJCWlmIChlbnRpdHlOYW1lID09IG51bGwpIHsKLQkJCQllbnRpdHlOYW1lID0gdHlwZS5nZXRFbGVtZW50TmFtZSgpOwotCQkJfQotCQkJCi0JCQlpZiggISB0aGlzLmdldFN1YmplY3QoKS5lbnRpdHlFeGlzdHMoZW50aXR5TmFtZSkpIHsKLQkJCQl0aGlzLmdldFN1YmplY3QoKS5hZGRFbnRpdHkoZW50aXR5TmFtZSk7Ci0JCQkJaW50IGluZGV4ID0gQ29sbGVjdGlvblRvb2xzLmluZGV4T2YodGhpcy5nZXRTdWJqZWN0KCkuZ2V0RW50aXR5TmFtZXMoKSwgZW50aXR5TmFtZSk7Ci0JCQkJQ2FjaGluZ0VudGl0eSBlbnRpdHkgPSAoQ2FjaGluZ0VudGl0eSkgbGlzdFNlbGVjdGlvbk1vZGVsLmdldExpc3RNb2RlbCgpLmdldEVsZW1lbnRBdChpbmRleCk7Ci0JCQkJbGlzdFNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoZW50aXR5KTsKLQkJCQl0aGlzLmVudGl0eUhvbGRlci5zZXRWYWx1ZShlbnRpdHkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RW50aXR5TmFtZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCi0JCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eSBlbnRpdHkgPSBnZXRTdWJqZWN0KCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RW50aXR5KGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOwotCQlyZXR1cm4gKGVudGl0eSAhPSBudWxsKSA/IGVudGl0eS5nZXROYW1lKCkgOiBudWxsOwotCX0KLQkKLQlwcml2YXRlIElUeXBlIGNob29zZUVudGl0eSgpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoKTsKLQkJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W10geyBqYXZhUHJvamVjdCB9OwotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShlbGVtZW50cyk7Ci0JCUlQcm9ncmVzc1NlcnZpY2Ugc2VydmljZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7Ci0JCVNlbGVjdGlvbkRpYWxvZyB0eXBlU2VsZWN0aW9uRGlhbG9nOwotCi0JCXRyeSB7Ci0JCQl0eXBlU2VsZWN0aW9uRGlhbG9nID0gSmF2YVVJLmNyZWF0ZVR5cGVEaWFsb2coCi0JCQkJZ2V0U2hlbGwoKSwKLQkJCQlzZXJ2aWNlLAotCQkJCXNjb3BlLAotCQkJCUlKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50cy5DT05TSURFUl9DTEFTU0VTLAotCQkJCWZhbHNlLAotCQkJCSIiCi0JCQkpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbi5sb2coZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldFRpdGxlKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DYWNoaW5nRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dUaXRsZSk7Ci0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0TWVzc2FnZShFY2xpcHNlTGlua1VpTWVzc2FnZXMuQ2FjaGluZ0VudGl0eUxpc3RDb21wb3NpdGVfZGlhbG9nTWVzc2FnZSk7Ci0KLQkJaWYgKHR5cGVTZWxlY3Rpb25EaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJcmV0dXJuIChJVHlwZSkgdHlwZVNlbGVjdGlvbkRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKTsKLQl9Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkRW50aXR5TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlDYWNoaW5nRW50aXR5IGVudGl0eUNhY2hpbmcgPSAoQ2FjaGluZ0VudGl0eSkgZWxlbWVudDsKLQkJCQlyZXR1cm4gZW50aXR5Q2FjaGluZy5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmdFbnRpdHk+IGJ1aWxkRW50aXR5SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nRW50aXR5PigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Q2FjaGluZ0VudGl0eT4gYnVpbGRFbnRpdGllc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQ2FjaGluZ0VudGl0eT4oCi0JCQkJCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBDYWNoaW5nLkVOVElUSUVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxDYWNoaW5nRW50aXR5PiBnZXRMaXN0SXRlcmFibGUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRFbnRpdGllcygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RW50aXRpZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxQYW5lRW5hYmxlcihNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmdFbnRpdHk+IGVudGl0eUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNhY2hpbmdQcm9wZXJ0eUNvbXBvc2l0ZSBwYW5lKSB7Ci0KLQkJbmV3IFBhbmVFbmFibGVyKAotCQkJdGhpcy5idWlsZFBhbmVFbmFibGVySG9sZGVyKGVudGl0eUhvbGRlciksCi0JCQlwYW5lCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlckhvbGRlcihNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmdFbnRpdHk+IGVudGl0eUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmdFbnRpdHksIEJvb2xlYW4+KGVudGl0eUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm1fKENhY2hpbmdFbnRpdHkgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZW50aXR5TmFtZUlzVmFsaWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRmx1c2hDbGVhckNhY2hlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRmx1c2hDbGVhckNhY2hlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZjMwNDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0ZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5GbHVzaENsZWFyQ2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBGbHVzaENsZWFyQ2FjaGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8Q2FjaGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRmx1c2hDbGVhckNhY2hlQ29tcG9zaXRlKAotCQkJCVBhbmU8PyBleHRlbmRzIENhY2hpbmc+IHBhcmVudENvbXBvc2l0ZSwgCi0JCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQkJcGFyZW50LAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfRmx1c2hDbGVhckNhY2hlTGFiZWwsCi0JCQkJdGhpcy5hZGRGbHVzaENsZWFyQ2FjaGVDb21ibyhwYXJlbnQpLAotCQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ0FDSElORwotCQkpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxDYWNoaW5nLCBGbHVzaENsZWFyQ2FjaGU+IGFkZEZsdXNoQ2xlYXJDYWNoZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPENhY2hpbmcsIEZsdXNoQ2xlYXJDYWNoZT4odGhpcywgY29udGFpbmVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKENhY2hpbmcuRkxVU0hfQ0xFQVJfQ0FDSEVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBGbHVzaENsZWFyQ2FjaGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBGbHVzaENsZWFyQ2FjaGUudmFsdWVzKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBGbHVzaENsZWFyQ2FjaGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREZWZhdWx0Rmx1c2hDbGVhckNhY2hlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEZsdXNoQ2xlYXJDYWNoZSB2YWx1ZSkgewotCQkJCXN3aXRjaCAodmFsdWUpIHsKLQkJCQkJY2FzZSBkcm9wIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuRmx1c2hDbGVhckNhY2hlQ29tcG9zaXRlX2Ryb3A7Ci0JCQkJCWNhc2UgZHJvcF9pbnZhbGlkYXRlIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuRmx1c2hDbGVhckNhY2hlQ29tcG9zaXRlX2Ryb3BfaW52YWxpZGF0ZTsKLQkJCQkJY2FzZSBtZXJnZSA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZV9tZXJnZTsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBGbHVzaENsZWFyQ2FjaGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldEZsdXNoQ2xlYXJDYWNoZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEZsdXNoQ2xlYXJDYWNoZSB2YWx1ZSkgewotCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldEZsdXNoQ2xlYXJDYWNoZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL1BlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL1BlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGZiZDNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiPFQgZXh0ZW5kcyBDYWNoaW5nPgotCQkJCQkJCQlleHRlbmRzIFBhbmU8VD4KLQkJCQkJCQkJaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlCi17Ci0JcHVibGljIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJbmV3IEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogSnBhUGFnZUNvbXBvc2l0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ0FDSElORzsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VUZXh0KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl90aXRsZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExheW91dCAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKLQkJCi0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBhZGRQYW5lKHBhcmVudCwgbGF5b3V0KTsKLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvU2hhcmVkQ2FjaGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9TaGFyZWRDYWNoZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDYxNDVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9TaGFyZWRDYWNoZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5UcmlTdGF0ZUNoZWNrQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2FjaGluZ0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFNoYXJlZENhY2hlQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBTaGFyZWRDYWNoZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8Q2FjaGluZ0VudGl0eT4KLXsKLQlwcml2YXRlIFRyaVN0YXRlQ2hlY2tCb3ggc2hhcmVkQ2FjaGVDaGVja0JveDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2hhcmVDYWNoZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlciBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgU2hhcmVkQ2FjaGVDb21wb3NpdGUoUGFuZTxDYWNoaW5nRW50aXR5PiBwYXJlbnRDb21wb3NpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBidWlsZENhY2hpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZ0VudGl0eSwgQ2FjaGluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhY2hpbmcgdHJhbnNmb3JtXyhDYWNoaW5nRW50aXR5IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldFBhcmVudCgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdEFuZE5vbkRlZmF1bHRTaGFyZWRDYWNoZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPigKLQkJCWJ1aWxkRGVmYXVsdEFuZE5vbkRlZmF1bHRTaGFyZWRDYWNoZUxpc3RIb2xkZXIoKQotCQkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKLQkJCQkvLyBJZiB0aGUgbnVtYmVyIG9mIExpc3RWYWx1ZU1vZGVsIGVxdWFscyAxLCB0aGF0IG1lYW5zIHRoZSBzaGFyZWQKLQkJCQkvLyBDYWNoZSBwcm9wZXJ0aWVzIGlzIG5vdCBzZXQgKHBhcnRpYWxseSBzZWxlY3RlZCksIHdoaWNoIG1lYW5zIHdlCi0JCQkJLy8gd2FudCB0byBzZWUgdGhlIGRlZmF1bHQgdmFsdWUgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAodGhpcy5saXN0TW9kZWwuc2l6ZSgpID09IDEpIHsKLQkJCQkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmxpc3RNb2RlbC5saXN0SXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0QW5kTm9uRGVmYXVsdFNoYXJlZENhY2hlTGlzdEhvbGRlcigpIHsKLQkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPEJvb2xlYW4+PiBob2xkZXJzID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDxCb29sZWFuPj4oMik7Ci0JCWhvbGRlcnMuYWRkKGJ1aWxkU2hhcmVkQ2FjaGVMaXN0SG9sZGVyKCkpOwotCQlob2xkZXJzLmFkZChidWlsZERlZmF1bHRTaGFyZWRDYWNoZUxpc3RIb2xkZXIoKSk7Ci0KLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDxCb29sZWFuPiwgQm9vbGVhbj4oCi0JCQlob2xkZXJzCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0U2hhcmVkQ2FjaGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEJvb2xlYW4+KGJ1aWxkQ2FjaGluZ0hvbGRlcigpLCBDYWNoaW5nLlNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCUJvb2xlYW4gdmFsdWUgPSB0aGlzLnN1YmplY3QuZ2V0U2hhcmVkQ2FjaGVEZWZhdWx0KCk7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFNoYXJlZENhY2hlRGVmYXVsdCgpOwotCQkJCX0KLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRTaGFyZWRDYWNoZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8Qm9vbGVhbj4oCi0JCQlidWlsZERlZmF1bHRTaGFyZWRDYWNoZUhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU2hhcmVkQ2FjaGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmdFbnRpdHksIEJvb2xlYW4+KAotCQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIENhY2hpbmdFbnRpdHkuU0hBUkVEX0NBQ0hFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0UGFyZW50KCkuZ2V0U2hhcmVkQ2FjaGVPZihnZXRTdWJqZWN0TmFtZSgpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWdldFN1YmplY3RQYXJlbnQoKS5zZXRTaGFyZWRDYWNoZU9mKGdldFN1YmplY3ROYW1lKCksIHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3ViamVjdE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFN1YmplY3RIb2xkZXIoKS5nZXRWYWx1ZSgpLmdldE5hbWUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDYWNoaW5nIGdldFN1YmplY3RQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFN1YmplY3RIb2xkZXIoKS5nZXRWYWx1ZSgpLmdldFBhcmVudCgpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTaGFyZWRDYWNoZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8Qm9vbGVhbj4oCi0JCQlidWlsZFNoYXJlZENhY2hlSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU2hhcmVkQ2FjaGVTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRBbmROb25EZWZhdWx0U2hhcmVkQ2FjaGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2RlZmF1bHRTaGFyZWRDYWNoZUxhYmVsLCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zaGFyZWRDYWNoZUxhYmVsOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuc2hhcmVkQ2FjaGVDaGVja0JveCA9IHRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zaGFyZWRDYWNoZUxhYmVsLAotCQkJdGhpcy5idWlsZFNoYXJlZENhY2hlSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkU2hhcmVkQ2FjaGVTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ0FDSElORwotCQkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQmF0Y2hXcml0aW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQmF0Y2hXcml0aW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MjcyNzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0JhdGNoV3JpdGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQmF0Y2hXcml0aW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQmF0Y2hXcml0aW5nQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXRjaFdyaXRpbmdDb21wb3NpdGU8VCBleHRlbmRzIENvbm5lY3Rpb24+Ci0JCWV4dGVuZHMgUGFuZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QmF0Y2hXcml0aW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBCYXRjaFdyaXRpbmdDb21wb3NpdGUoCi0JCQkJCVBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLCAKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKCBwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPENvbm5lY3Rpb24sIEJhdGNoV3JpdGluZz4gYWRkQmF0Y2hXcml0aW5nQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8Q29ubmVjdGlvbiwgQmF0Y2hXcml0aW5nPih0aGlzLCBjb250YWluZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoQ29ubmVjdGlvbi5CQVRDSF9XUklUSU5HX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQmF0Y2hXcml0aW5nW10gZ2V0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gQmF0Y2hXcml0aW5nLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCYXRjaFdyaXRpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdEJhdGNoV3JpdGluZygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhCYXRjaFdyaXRpbmcgdmFsdWUpIHsKLQkJCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQkJCWNhc2UgYnVmZmVyZWQgOgotCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5CYXRjaFdyaXRpbmdDb21wb3NpdGVfYnVmZmVyZWQ7Ci0JCQkJCWNhc2UgamRiYyA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJhdGNoV3JpdGluZ0NvbXBvc2l0ZV9qZGJjOwotCQkJCQljYXNlIG5vbmUgOgotCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5CYXRjaFdyaXRpbmdDb21wb3NpdGVfbm9uZTsKLQkJCQkJY2FzZSBvcmFjbGVfamRiYyA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJhdGNoV3JpdGluZ0NvbXBvc2l0ZV9vcmFjbGVfamRiYzsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCYXRjaFdyaXRpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRCYXRjaFdyaXRpbmcoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShCYXRjaFdyaXRpbmcgdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0QmF0Y2hXcml0aW5nKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dCggQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfYmF0Y2hXcml0aW5nTGFiZWwsCi0JCQl0aGlzLmFkZEJhdGNoV3JpdGluZ0NvbWJvKCBjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT04KLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ2FjaGVTdGF0ZW1lbnRzUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0NhY2hlU3RhdGVtZW50c1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJiY2I4ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ2FjaGVTdGF0ZW1lbnRzUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIENhY2hlU3RhdGVtZW50c1Byb3BlcnRpZXNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIENhY2hlU3RhdGVtZW50c1Byb3BlcnRpZXNDb21wb3NpdGU8VCBleHRlbmRzIENvbm5lY3Rpb24+IAotCWV4dGVuZHMgUGFuZTxUPgotewotCXB1YmxpYyBDYWNoZVN0YXRlbWVudHNQcm9wZXJ0aWVzQ29tcG9zaXRlKAotCQkJCQkJUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGNhY2hlU3RhdGVtZW50c0hvbGRlciA9IGJ1aWxkQ2FjaGVTdGF0ZW1lbnRzSG9sZGVyKCk7Ci0KLQkJY29udGFpbmVyID0gdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgMywgNSwgMCwgMCwgMCk7Ci0JCQotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3goCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2NhY2hlU3RhdGVtZW50c0xhYmVsLAotCQkJY2FjaGVTdGF0ZW1lbnRzSG9sZGVyLAotCQkJSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT04KLQkJKTsKLQkJSW50ZWdlckNvbWJvPD8+IGNvbWJvID0gYWRkQ2FjaGVTdGF0ZW1lbnRzU2l6ZUNvbWJvKGNvbnRhaW5lcik7Ci0KLQkJdGhpcy5pbnN0YWxsQ29udHJvbEVuYWJsZXIoY2FjaGVTdGF0ZW1lbnRzSG9sZGVyLCBjb21ibyk7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ2FjaGVTdGF0ZW1lbnRzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uQ0FDSEVfU1RBVEVNRU5UU19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENhY2hlU3RhdGVtZW50cygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldENhY2hlU3RhdGVtZW50cyh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCUJvb2xlYW4gb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlCb29sZWFuIG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlZChCb29sZWFuLlRSVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgSW50ZWdlckNvbWJvPENvbm5lY3Rpb24+IGFkZENhY2hlU3RhdGVtZW50c1NpemVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgSW50ZWdlckNvbWJvPENvbm5lY3Rpb24+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb21ibyBhZGRJbnRlZ2VyQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJCXJldHVybiB0aGlzLmFkZEVkaXRhYmxlQ29tYm8oCi0JCQkJCQljb250YWluZXIsCi0JCQkJCQlidWlsZERlZmF1bHRMaXN0SG9sZGVyKCksCi0JCQkJCQlidWlsZFNlbGVjdGVkSXRlbVN0cmluZ0hvbGRlcigpLAotCQkJCQkJU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJcmV0dXJuIEpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRDYWNoZVN0YXRlbWVudHNTaXplKCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5DQUNIRV9TVEFURU1FTlRTX1NJWkVfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDYWNoZVN0YXRlbWVudHNTaXplKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRDYWNoZVN0YXRlbWVudHNTaXplKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxDb250cm9sRW5hYmxlcihNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGNhY2hlU3RhdGVtZW50c0hvbGRlciwgSW50ZWdlckNvbWJvPD8+IGNvbWJvKSB7Ci0KLQkJbmV3IFBhbmVFbmFibGVyKGNhY2hlU3RhdGVtZW50c0hvbGRlciwgY29tYm8pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9Db25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDhhMzcyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9Db25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHVibGljIENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlKAotCQkJCQlQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwgCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYWRkVGl0bGVkR3JvdXAoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfRGF0YWJhc2VfR3JvdXBCb3gKLQkJKTsKLQotCQkvLyBEYXRhIHNvdXJjZQotCQluZXcgRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQkJLy8gRWNsaXBzZUxpbmsgQ29ubmVjdGlvbiBQb29sCi0JCW5ldyBKZGJjUHJvcGVydGllc0NvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCQkvLyBFeGNsdXNpdmUgQ29ubmVjdGlvbnMKLQkJbmV3IEpkYmNFeGNsdXNpdmVDb25uZWN0aW9uc1Byb3BlcnRpZXNDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0RhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQwODBjZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIERhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKLQlleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBEYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZSgKLQkJCQkJCQlQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkSnRhRGF0YVNvdXJjZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBTdHJpbmc+KGJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCksIFBlcnNpc3RlbmNlVW5pdC5KVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEp0YURhdGFTb3VyY2UoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQl0aGlzLnN1YmplY3Quc2V0SnRhRGF0YVNvdXJjZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRKVEFEYXRhU291cmNlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSwgQm9vbGVhbj4oYnVpbGRUcmFuc2FjdGlvblR5cGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnRyYW5zZm9ybTIodmFsdWUpKTsKLQkJCX0KLQkJCXByaXZhdGUgYm9vbGVhbiB0cmFuc2Zvcm0yKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09IFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5KVEE7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROb25KdGFEYXRhU291cmNlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFN0cmluZz4oYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSwgUGVyc2lzdGVuY2VVbml0Lk5PTl9KVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5vbkp0YURhdGFTb3VyY2UoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQl0aGlzLnN1YmplY3Quc2V0Tm9uSnRhRGF0YVNvdXJjZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb25KVEFEYXRhU291cmNlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSwgQm9vbGVhbj4oYnVpbGRUcmFuc2FjdGlvblR5cGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSA9PSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUwpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4gYnVpbGRUcmFuc2FjdGlvblR5cGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlPigKLQkJCQlidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpLCAKLQkJCQlQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFksIAotCQkJCVBlcnNpc3RlbmNlVW5pdC5ERUZBVUxUX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIFBlcnNpc3RlbmNlVW5pdD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCX0KLQkJfTsKLQkJCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWludCBncm91cEJveE1hcmdpbiA9IGdldEdyb3VwQm94TWFyZ2luKCk7Ci0KLQkJY29udGFpbmVyID0gYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbik7Ci0KLQkJLy8gSlRBIERhdGEgU291cmNlCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBqdGFFbmFibGVkID0gdGhpcy5idWlsZEpUQURhdGFTb3VyY2VIb2xkZXIoKTsKLQkJTGFiZWwganRhTGFiZWwgPSBhZGRMYWJlbChjb250YWluZXIsIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfanRhRGF0YVNvdXJjZUxhYmVsLCBqdGFFbmFibGVkKTsKLQkJVGV4dCBqdGFUZXh0ID0gYWRkVGV4dChjb250YWluZXIsIHRoaXMuYnVpbGRKdGFEYXRhU291cmNlSG9sZGVyKCksIHRoaXMuZ2V0SGVscElEKCksIGp0YUVuYWJsZWQpOwotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoY29udGFpbmVyLCBqdGFMYWJlbCwganRhVGV4dCwgdGhpcy5nZXRIZWxwSUQoKSk7Ci0KLQkJLy8gTm9uLUpUQSBEYXRhIFNvdXJjZQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gbm9uSnRhRW5hYmxlZCA9IHRoaXMuYnVpbGROb25KVEFEYXRhU291cmNlSG9sZGVyKCk7Ci0JCUxhYmVsIG5vbkp0YUxhYmVsID0gYWRkTGFiZWwoY29udGFpbmVyLCBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX25vbkp0YURhdGFTb3VyY2VMYWJlbCwgbm9uSnRhRW5hYmxlZCk7Ci0JCVRleHQgbm9uSnRhVGV4dCA9IGFkZFRleHQoY29udGFpbmVyLCBidWlsZE5vbkp0YURhdGFTb3VyY2VIb2xkZXIoKSwgdGhpcy5nZXRIZWxwSUQoKSwgbm9uSnRhRW5hYmxlZCk7Ci0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZShjb250YWluZXIsIG5vbkp0YUxhYmVsLCBub25KdGFUZXh0LCB0aGlzLmdldEhlbHBJRCgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIEpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRWNsaXBzZUxpbmtDb25uZWN0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRWNsaXBzZUxpbmtDb25uZWN0aW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNGMwMDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0VjbGlwc2VMaW5rQ29ubmVjdGlvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBFY2xpcHNlTGlua0Nvbm5lY3Rpb25Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ29ubmVjdGlvbkNvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4KLQlleHRlbmRzIFBhbmU8VD4KLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtDb25uZWN0aW9uQ29tcG9zaXRlKAotCQkJCQlQYW5lPFQ+IHN1YmplY3RIb2xkZXIsCi0JCQkJCUNvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyLCBmYWxzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJaW50IGdyb3VwQm94TWFyZ2luID0gZ2V0R3JvdXBCb3hNYXJnaW4oKSAqIDI7Ci0KLQkJY29udGFpbmVyID0gYWRkU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfc2VjdGlvblRpdGxlLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9zZWN0aW9uRGVzY3JpcHRpb24KLQkJKTsKLQotCQlDb21wb3NpdGUgc3ViUGFuZSA9IGFkZFN1YlBhbmUoCi0JCQljb250YWluZXIsCi0JCQkwLCBncm91cEJveE1hcmdpbiwgMTAsIGdyb3VwQm94TWFyZ2luCi0JCSk7Ci0KLQkJbmV3IFRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZTxUPih0aGlzLCBzdWJQYW5lKTsKLQotCQluZXcgQmF0Y2hXcml0aW5nQ29tcG9zaXRlPFQ+KHRoaXMsIHN1YlBhbmUpOwotCi0JCW5ldyBDYWNoZVN0YXRlbWVudHNQcm9wZXJ0aWVzQ29tcG9zaXRlPFQ+KHRoaXMsIHN1YlBhbmUpOwotCi0JCW5ldyBOYXRpdmVTcWxDb21wb3NpdGU8VD4odGhpcywgc3ViUGFuZSk7Ci0KLQkJbmV3IENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlPFQ+KHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjQmluZFBhcmFtZXRlcnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjQmluZFBhcmFtZXRlcnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkMmZhMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0JpbmRQYXJhbWV0ZXJzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBKZGJjQmluZFBhcmFtZXRlcnNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEpkYmNCaW5kUGFyYW1ldGVyc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8Q29ubmVjdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpkYmNCaW5kUGFyYW1ldGVyc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKZGJjQmluZFBhcmFtZXRlcnNDb21wb3NpdGUoCi0JCQkJCVBhbmU8PyBleHRlbmRzIENvbm5lY3Rpb24+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfYmluZFBhcmFtZXRlcnNMYWJlbCwKLQkJCXRoaXMuYnVpbGRCaW5kUGFyYW1ldGVyc0hvbGRlcigpLAotCQkJdGhpcy5idWlsZEJpbmRQYXJhbWV0ZXJzU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTgotCQkpOwotCX0KLQkKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRCaW5kUGFyYW1ldGVyc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLkJJTkRfUEFSQU1FVEVSU19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEJpbmRQYXJhbWV0ZXJzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0QmluZFBhcmFtZXRlcnModmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRCaW5kUGFyYW1ldGVyc1N0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdEJpbmRQYXJhbWV0ZXJzSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9iaW5kUGFyYW1ldGVyc0xhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfYmluZFBhcmFtZXRlcnNMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0QmluZFBhcmFtZXRlcnNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ29ubmVjdGlvbi5CSU5EX1BBUkFNRVRFUlNfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRCaW5kUGFyYW1ldGVycygpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdEJpbmRQYXJhbWV0ZXJzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTM2ZDhhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5KcHRKcGFEYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkZpbHRlcmVkSXRlbXNTZWxlY3Rpb25EaWFsb2c7Ci0KLS8qKgotICogIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZQotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGU8VCBleHRlbmRzIENvbm5lY3Rpb24+IAotCWV4dGVuZHMgUGFuZTxUPgotewotCS8qKgotCSAqIFRoZSBjb25zdGFudCBJRCB1c2VkIHRvIHJldHJpZXZlIHRoZSBkaWFsb2cgc2V0dGluZ3MuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19TRVRUSU5HUyA9ICJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmRpYWxvZ3MuQ29ubmVjdGlvbkRpYWxvZyI7Ci0KLQlwdWJsaWMgSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlKAotCQkJCQlQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwgCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQYXNzd29yZEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uUEFTU1dPUkRfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRQYXNzd29yZCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0UGFzc3dvcmQodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRQb3B1bGF0ZUZyb21Db25uZWN0aW9uQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXByb21wdENvbm5lY3Rpb24oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFVybEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uVVJMX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VXJsKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRVcmwodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVXNlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uVVNFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFVzZXIoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldFVzZXIodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIFBvcHVsYXRlIGZyb20gQ29ubmVjdGlvbiBoeXBlcmxpbmsKLQkJdGhpcy5hZGRIeXBlcmxpbmsoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX3BvcHVsYXRlRnJvbUNvbm5lY3Rpb25IeXBlckxpbmssCi0JCQlidWlsZFBvcHVsYXRlRnJvbUNvbm5lY3Rpb25BY3Rpb24oKQotCQkpOwotCi0JCS8vIERyaXZlcgotCQluZXcgSmRiY0RyaXZlckNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCi0JCS8vIFVybAotCQl0aGlzLmFkZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl91cmxMYWJlbCwKLQkJCWJ1aWxkVXJsSG9sZGVyKCkKLQkJKTsKLQotCQkvLyBVc2VyCi0JCXRoaXMuYWRkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3VzZXJMYWJlbCwKLQkJCWJ1aWxkVXNlckhvbGRlcigpCi0JCSk7Ci0KLQkJLy8gUGFzc3dvcmQKLQkJdGhpcy5hZGRMYWJlbGVkUGFzc3dvcmRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9wYXNzd29yZExhYmVsLAotCQkJYnVpbGRQYXNzd29yZEhvbGRlcigpCi0JCSk7Ci0KLQkJLy8gQmluZCBQYXJhbWV0ZXJzCi0JCW5ldyBKZGJjQmluZFBhcmFtZXRlcnNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQl2b2lkIHByb21wdENvbm5lY3Rpb24oKSB7Ci0KLQkJQ29ubmVjdGlvblNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgQ29ubmVjdGlvblNlbGVjdGlvbkRpYWxvZygpOwotCi0JCWlmIChkaWFsb2cub3BlbigpICE9IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBuYW1lID0gKFN0cmluZykgZGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShuYW1lKTsKLQotCQlDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBnZXRTdWJqZWN0KCk7Ci0JCWNvbm5lY3Rpb24uc2V0VXJsKChjcCA9PSBudWxsKSA/ICIiIDogY3AuZ2V0VVJMKCkpOwotCQljb25uZWN0aW9uLnNldFVzZXIoKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXRVc2VyTmFtZSgpKTsKLQkJY29ubmVjdGlvbi5zZXRQYXNzd29yZCgoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldFVzZXJQYXNzd29yZCgpKTsKLQkJY29ubmVjdGlvbi5zZXREcml2ZXIoKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXREcml2ZXJDbGFzc05hbWUoKSk7Ci0JfQotCi0JQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5IGdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpIHsKLQkJLy8gd2UgYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0IGFueSBjb25uZWN0aW9uIHByb2ZpbGUgYW5kIHNpbXBseQotCQkvLyB0YWtlIHRoZSBzZXR0aW5ncyBmcm9tIGl0ICh1c2VyLCBwYXNzd29yZCwgZXRjLikgYW5kIGdpdmUgdGhlbQotCQkvLyB0byB0aGUgRWNsaXBzZUxpbmsgY29ubmVjdGlvbiwgc28gd2UgZ28KLQkJLy8gdG8gdGhlIGRiIHBsdWctaW4gZGlyZWN0bHkgdG8gZ2V0IHRoZSBmYWN0b3J5Ci0JCXJldHVybiBKcHRKcGFEYlBsdWdpbi5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKTsKLQl9Ci0KLQkvLyBicm9hZGVuIGFjY2VzcyBhIGJpdAotCVNoZWxsIGdldFNoZWxsXygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2hlbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRpYWxvZyBzaG93cyB0aGUgbGlzdCBvZiBwb3NzaWJsZSBjb25uZWN0aW9uIG5hbWVzIGFuZCBsZXRzIHRoZSB1c2VyCi0JICogdGhlIG9wdGlvbiB0byBmaWx0ZXIgdGhlbSB1c2luZyBhIHNlYXJjaCBmaWVsZC4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgQ29ubmVjdGlvblNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIEZpbHRlcmVkSXRlbXNTZWxlY3Rpb25EaWFsb2cgewotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hcHBpbmdTZWxlY3Rpb25EaWFsb2c8L2NvZGU+LgotCQkgKi8KLQkJcHJvdGVjdGVkIENvbm5lY3Rpb25TZWxlY3Rpb25EaWFsb2coKSB7Ci0JCQlzdXBlcihKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUudGhpcy5nZXRTaGVsbF8oKSwgZmFsc2UpOwotCQkJc2V0TWVzc2FnZShFY2xpcHNlTGlua1VpTWVzc2FnZXMuSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX0Nvbm5lY3Rpb25EaWFsb2dfTWVzc2FnZSk7Ci0JCQlzZXRUaXRsZShFY2xpcHNlTGlua1VpTWVzc2FnZXMuSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX0Nvbm5lY3Rpb25EaWFsb2dfVGl0bGUpOwotCQkJc2V0TGlzdExhYmVsUHJvdmlkZXIoYnVpbGRMYWJlbFByb3ZpZGVyKCkpOwotCQkJc2V0RGV0YWlsc0xhYmVsUHJvdmlkZXIoYnVpbGRMYWJlbFByb3ZpZGVyKCkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKLQkJCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoZWxlbWVudCA9PSBudWxsKSA/ICIiIDogZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRXh0ZW5kZWRDb250ZW50QXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlbXNGaWx0ZXIgY3JlYXRlRmlsdGVyKCkgewotCQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uSXRlbXNGaWx0ZXIoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGVudFByb3ZpZGVyKEFic3RyYWN0Q29udGVudFByb3ZpZGVyIHByb3ZpZGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZW1zRmlsdGVyIGl0ZW1zRmlsdGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCQlJdGVyYWJsZTxTdHJpbmc+IHByb2ZpbGVOYW1lcyA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lcygpOwotCQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwcm9maWxlTmFtZXMpKTsKLQotCQkJLy8gQWRkIHRoZSBjb25uZWN0aW9uIG5hbWVzIHRvIHRoZSBkaWFsb2cKLQkJCWZvciAoU3RyaW5nIG5hbWUgOiBwcm9maWxlTmFtZXMpIHsKLQkJCQlwcm92aWRlci5hZGQobmFtZSwgaXRlbXNGaWx0ZXIpOwotCQkJCXNtLndvcmtlZCgxKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBnZXRDb25uZWN0aW9uUHJvZmlsZU5hbWVzKCkgewotCQkJcmV0dXJuIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS50aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZXMoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotCi0JCQlJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSBKcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luLmluc3RhbmNlKCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGRpYWxvZ1NldHRpbmdzLmdldFNlY3Rpb24oRElBTE9HX1NFVFRJTkdTKTsKLQotCQkJaWYgKHNldHRpbmdzID09IG51bGwpIHsKLQkJCQlzZXR0aW5ncyA9IGRpYWxvZ1NldHRpbmdzLmFkZE5ld1NlY3Rpb24oRElBTE9HX1NFVFRJTkdTKTsKLQkJCX0KLQotCQkJcmV0dXJuIHNldHRpbmdzOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb21wYXJhdG9yPFN0cmluZz4gZ2V0SXRlbXNDb21wYXJhdG9yKCkgewotCQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBpdGVtMSwgU3RyaW5nIGl0ZW0yKSB7Ci0JCQkJCXJldHVybiBpdGVtMS5jb21wYXJlVG8oaXRlbTIpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVJdGVtKE9iamVjdCBpdGVtKSB7Ci0KLQkJCWlmIChpdGVtID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgIiIsIG51bGwpOwotCQkJfQotCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCi0JCS8qKgotCQkgKiBDcmVhdGUgdGhlIGZpbHRlciByZXNwb25zaWJsZSB0byByZW1vdmUgYW55IGNvbm5lY3Rpb24gbmFtZSBiYXNlZCBvbgotCQkgKiB0aGUgcGF0dGVybiBlbnRlcmVkIGluIHRoZSB0ZXh0IGZpZWxkLgotCQkgKi8KLQkJcHJpdmF0ZSBjbGFzcyBDb25uZWN0aW9uSXRlbXNGaWx0ZXIgZXh0ZW5kcyBJdGVtc0ZpbHRlciB7Ci0KLQkJCS8qKgotCQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db25uZWN0aW9uSXRlbXNGaWx0ZXI8L2NvZGU+LgotCQkJICovCi0JCQlDb25uZWN0aW9uSXRlbXNGaWx0ZXIoKSB7Ci0KLQkJCQlzdXBlcigpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoYXQgaWYgdGhlIHBhdHRlcm4gaXMgZW1wdHksIHdlIHNwZWNpZnkgKiBpbiBvcmRlcgotCQkJCS8vIHRvIHNob3cgYWxsIHRoZSBtYXBwaW5nIHR5cGVzCi0JCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZ2V0UGF0dGVybigpKSkgewotCQkJCQlwYXR0ZXJuTWF0Y2hlci5zZXRQYXR0ZXJuKCIqIik7Ci0JCQkJfQotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICovCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGlzQ29uc2lzdGVudEl0ZW0oT2JqZWN0IGl0ZW0pIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqLwotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBtYXRjaEl0ZW0oT2JqZWN0IGl0ZW0pIHsKLQkJCQlyZXR1cm4gbWF0Y2hlcyhpdGVtLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjRHJpdmVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0RyaXZlckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjY1YWMwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjRHJpdmVyQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEpkYmNEcml2ZXJDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEpkYmNEcml2ZXJDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPENvbm5lY3Rpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FdmVudExpc3RlbmVyQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmRiY0RyaXZlckNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBDb25uZWN0aW9uPiBwYXJlbnRQYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPENvbm5lY3Rpb24+IGluaXRpYWxpemVDbGFzc0Nob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxDb25uZWN0aW9uPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBTdHJpbmc+KAotCQkJCQkJCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLkRSSVZFUl9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RHJpdmVyKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCXRoaXMuc3ViamVjdC5zZXREcml2ZXIodmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RHJpdmVyKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfZHJpdmVyTGFiZWw7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQkJdGhpcy5nZXRTdWJqZWN0KCkuc2V0RHJpdmVyKGNsYXNzTmFtZSk7CQkJCQotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFsbG93VHlwZUNyZWF0aW9uKCkgewotCQkJCS8vRG9lcyBub3QgbWFrZSBzZW5zZSB0byBhbGxvdyB0aGUgdXNlciB0byBjcmVhdGUgYSBuZXcgRHJpdmVyIGNsYXNzCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVDbGFzc0Nob29zZXIoY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYzg4ZDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNFeGNsdXNpdmVDb25uZWN0aW9uTW9kZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FeGNsdXNpdmVDb25uZWN0aW9uTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBFeGNsdXNpdmVDb25uZWN0aW9uTW9kZUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPgotCQlleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKZGJjRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGVDb21wb3NpdGUoCi0JCQkJCVBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLCAKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dCggQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfZXhjbHVzaXZlQ29ubmVjdGlvbk1vZGVMYWJlbCwKLQkJCXRoaXMuYWRkRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGVDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT04KLQkJKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8Q29ubmVjdGlvbiwgRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGU+IGFkZEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8Q29ubmVjdGlvbiwgRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGU+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChDb25uZWN0aW9uLkVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFeGNsdXNpdmVDb25uZWN0aW9uTW9kZVtdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERlZmF1bHRFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSB2YWx1ZSkgewotCQkJCXN3aXRjaCAodmFsdWUpIHsKLQkJCQkJY2FzZSBhbHdheXMgOgotCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5KZGJjRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGVDb21wb3NpdGVfYWx3YXlzOwotCQkJCQljYXNlIGlzb2xhdGVkIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlX2lzb2xhdGVkOwotCQkJCQljYXNlIHRyYW5zYWN0aW9uYWwgOgotCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5KZGJjRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGVDb21wb3NpdGVfdHJhbnNhY3Rpb25hbDsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSB2YWx1ZSkgewotCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25zUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNFeGNsdXNpdmVDb25uZWN0aW9uc1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ2Yjc4NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25zUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEpkYmNFeGNsdXNpdmVDb25uZWN0aW9uc1Byb3BlcnRpZXNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEpkYmNFeGNsdXNpdmVDb25uZWN0aW9uc1Byb3BlcnRpZXNDb21wb3NpdGU8VCBleHRlbmRzIENvbm5lY3Rpb24+IAotCWV4dGVuZHMgUGFuZTxUPgotewotCXB1YmxpYyBKZGJjRXhjbHVzaXZlQ29ubmVjdGlvbnNQcm9wZXJ0aWVzQ29tcG9zaXRlKFBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSB0aGlzLmFkZFRpdGxlZEdyb3VwKAotCQkJdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgMTApLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkpkYmNFeGNsdXNpdmVDb25uZWN0aW9uc1Byb3BlcnRpZXNDb21wb3NpdGVfR3JvdXBCb3gKLQkJKTsKLQotCQkvLyBFeGNsdXNpdmUgY29ubmVjdGlvbiBtb2RlCi0JCW5ldyBKZGJjRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGVDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQotCQkvLyBMYXp5IENvbm5lY3Rpb24KLQkJbmV3IEpkYmNMYXp5Q29ubmVjdGlvbkNvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCi0JCXRoaXMuaW5zdGFsbFBhbmVFbmFibGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxQYW5lRW5hYmxlcigpIHsKLQkJbmV3IFBhbmVFbmFibGVyKHRoaXMuYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpLCB0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFBhbmVFbmFibGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSwgQm9vbGVhbj4odGhpcy5idWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUgPT0gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLlJFU09VUkNFX0xPQ0FMOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4gYnVpbGRUcmFuc2FjdGlvblR5cGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlPigKLQkJCXRoaXMuYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSwgCi0JCQlQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFksIAotCQkJUGVyc2lzdGVuY2VVbml0LkRFRkFVTFRfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgUGVyc2lzdGVuY2VVbml0Pih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNMYXp5Q29ubmVjdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNMYXp5Q29ubmVjdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGQ0ZWRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjTGF6eUNvbm5lY3Rpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEpkYmNMYXp5Q29ubmVjdGlvbkNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgSmRiY0xhenlDb25uZWN0aW9uQ29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKLQlleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpkYmNMYXp5Q29ubmVjdGlvbkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKZGJjTGF6eUNvbm5lY3Rpb25Db21wb3NpdGUoCi0JCQkJCQkJCVBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbGF6eUNvbm5lY3Rpb25MYWJlbCwKLQkJCXRoaXMuYnVpbGRMYXp5Q29ubmVjdGlvbkhvbGRlcigpLAotCQkJdGhpcy5idWlsZExhenlDb25uZWN0aW9uU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTgotCQkpOwotCX0KLQkKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRMYXp5Q29ubmVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgQm9vbGVhbj4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uTEFaWV9DT05ORUNUSU9OX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TGF6eUNvbm5lY3Rpb24oKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRMYXp5Q29ubmVjdGlvbih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZExhenlDb25uZWN0aW9uU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4odGhpcy5idWlsZERlZmF1bHRMYXp5Q29ubmVjdGlvbkhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbGF6eUNvbm5lY3Rpb25MYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2xhenlDb25uZWN0aW9uTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdExhenlDb25uZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBCb29sZWFuPigKLQkJCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ29ubmVjdGlvbi5MQVpZX0NPTk5FQ1RJT05fUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRMYXp5Q29ubmVjdGlvbigpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdExhenlDb25uZWN0aW9uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkNDcxZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBKZGJjUHJvcGVydGllc0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgSmRiY1Byb3BlcnRpZXNDb21wb3NpdGU8VCBleHRlbmRzIENvbm5lY3Rpb24+IAotCWV4dGVuZHMgUGFuZTxUPgotewotCXB1YmxpYyBKZGJjUHJvcGVydGllc0NvbXBvc2l0ZShQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSB0aGlzLmFkZFRpdGxlZEdyb3VwKAotCQkJdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgMTApLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkpkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlX0VjbGlwc2VMaW5rQ29ubmVjdGlvblBvb2xfR3JvdXBCb3gKLQkJKTsKLQotCQkvLyBDb25uZWN0aW9uIFByb3BlcnRpZXMKLQkJbmV3IEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCi0JCWNvbnRhaW5lciA9IHRoaXMuYWRkUGFuZShjb250YWluZXIsIG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQotCQkvLyBSZWFkIENvbm5lY3Rpb24KLQkJbmV3IEpkYmNSZWFkQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQkJLy8gV3JpdGUgQ29ubmVjdGlvbgotCQluZXcgSmRiY1dyaXRlQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQkJCi0JCXRoaXMuaW5zdGFsbFBhbmVFbmFibGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxQYW5lRW5hYmxlcigpIHsKLQkJbmV3IFBhbmVFbmFibGVyKHRoaXMuYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpLCB0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFBhbmVFbmFibGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSwgQm9vbGVhbj4odGhpcy5idWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUgPT0gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLlJFU09VUkNFX0xPQ0FMOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4gYnVpbGRUcmFuc2FjdGlvblR5cGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlPigKLQkJCXRoaXMuYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSwgCi0JCQlQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFksIAotCQkJUGVyc2lzdGVuY2VVbml0LkRFRkFVTFRfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgUGVyc2lzdGVuY2VVbml0Pih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQl9Ci0JCX07Ci0JCQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1JlYWRDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzNmU2YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1JlYWRDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEpkYmNSZWFkQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEpkYmNSZWFkQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGU8VCBleHRlbmRzIENvbm5lY3Rpb24+IAotCWV4dGVuZHMgUGFuZTxUPgotewotCXB1YmxpYyBKZGJjUmVhZENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlKAotCQkJCQlQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwgCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IHRoaXMuYWRkQ29sbGFwc2libGVTdWJTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNTZWN0aW9uVGl0bGUsCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSkgLy9leGFwYW5kZWQKLQkJKTsKLQotCQlHcmlkRGF0YSBkYXRhID0gKEdyaWREYXRhKSBjb250YWluZXIuZ2V0TGF5b3V0RGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKLQotCQlkYXRhID0gKEdyaWREYXRhKSBnZXRDb250cm9sKCkuZ2V0TGF5b3V0RGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKLQotCQkvLyBSZWFkIENvbm5lY3Rpb25zIFNoYXJlZAotCQluZXcgSmRiY1JlYWRDb25uZWN0aW9uc1NoYXJlZENvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCi0JCS8vIFJlYWQgQ29ubmVjdGlvbnMgTWluaW11bQotCQluZXcgSmRiY1JlYWRDb25uZWN0aW9uc01pbkNvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCi0JCS8vIFJlYWQgQ29ubmVjdGlvbnMgTWF4aW11bQotCQluZXcgSmRiY1JlYWRDb25uZWN0aW9uc01heENvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1JlYWRDb25uZWN0aW9uc01heENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNNYXhDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc0OGQ0Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1JlYWRDb25uZWN0aW9uc01heENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEpkYmNSZWFkQ29ubmVjdGlvbnNNYXhDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEpkYmNSZWFkQ29ubmVjdGlvbnNNYXhDb21wb3NpdGU8VCBleHRlbmRzIENvbm5lY3Rpb24+IAotCWV4dGVuZHMgUGFuZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SmRiY1JlYWRDb25uZWN0aW9uc01heENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKZGJjUmVhZENvbm5lY3Rpb25zTWF4Q29tcG9zaXRlKAotCQkJCQkJCQlQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlhZGRSZWFkQ29ubmVjdGlvbnNNYXhDb21ibyhjb250YWluZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkUmVhZENvbm5lY3Rpb25zTWF4Q29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSW50ZWdlckNvbWJvPENvbm5lY3Rpb24+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc01heExhYmVsOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJcmV0dXJuIEpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRSZWFkQ29ubmVjdGlvbnNNYXgoKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UmVhZENvbm5lY3Rpb25zTWF4KCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRSZWFkQ29ubmVjdGlvbnNNYXgodmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUmVhZENvbm5lY3Rpb25zTWluQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MmNkZTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkludGVnZXJDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBKZGJjUmVhZENvbm5lY3Rpb25zTWluQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBKZGJjUmVhZENvbm5lY3Rpb25zTWluQ29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKLQlleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpkYmNSZWFkQ29ubmVjdGlvbnNNaW5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmRiY1JlYWRDb25uZWN0aW9uc01pbkNvbXBvc2l0ZSgKLQkJCQkJCQlQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlhZGRSZWFkQ29ubmVjdGlvbnNNaW5Db21ibyhjb250YWluZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkUmVhZENvbm5lY3Rpb25zTWluQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSW50ZWdlckNvbWJvPENvbm5lY3Rpb24+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc01pbkxhYmVsOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJcmV0dXJuIEpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRSZWFkQ29ubmVjdGlvbnNNaW4oKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UmVhZENvbm5lY3Rpb25zTWluKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRSZWFkQ29ubmVjdGlvbnNNaW4odmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNTaGFyZWRDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUmVhZENvbm5lY3Rpb25zU2hhcmVkQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMzQxNzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNTaGFyZWRDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFJlYWRDb25uZWN0aW9uc1NoYXJlZENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgSmRiY1JlYWRDb25uZWN0aW9uc1NoYXJlZENvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5SZWFkQ29ubmVjdGlvbnNTaGFyZWRDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmRiY1JlYWRDb25uZWN0aW9uc1NoYXJlZENvbXBvc2l0ZSgKLQkJCQkJCQkJUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNTaGFyZWRMYWJlbCwKLQkJCXRoaXMuYnVpbGRSZWFkQ29ubmVjdGlvbnNTaGFyZWRIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRSZWFkQ29ubmVjdGlvbnNTaGFyZWRTdHJpbmdIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFJlYWRDb25uZWN0aW9uc1NoYXJlZEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UmVhZENvbm5lY3Rpb25zU2hhcmVkKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0UmVhZENvbm5lY3Rpb25zU2hhcmVkKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUmVhZENvbm5lY3Rpb25zU2hhcmVkU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0UmVhZENvbm5lY3Rpb25zU2hhcmVkSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNTaGFyZWRMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc1NoYXJlZExhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRSZWFkQ29ubmVjdGlvbnNTaGFyZWRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ29ubmVjdGlvbi5SRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFJlYWRDb25uZWN0aW9uc1NoYXJlZCgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFJlYWRDb25uZWN0aW9uc1NoYXJlZCgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjV3JpdGVDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhN2I0MzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBKZGJjV3JpdGVDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZQotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKZGJjV3JpdGVDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHVibGljIEpkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlKAotCQkJCQkJCVBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLCAKLQkJCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSB0aGlzLmFkZENvbGxhcHNpYmxlU3ViU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfd3JpdGVDb25uZWN0aW9uc1NlY3Rpb25UaXRsZSwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKSAvL2V4YXBhbmRlZAotCQkpOwotCi0JCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpIGNvbnRhaW5lci5nZXRMYXlvdXREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOwotCi0JCWRhdGEgPSAoR3JpZERhdGEpIGdldENvbnRyb2woKS5nZXRMYXlvdXREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOwotCi0JCS8vIFRoaXMgd2lsbCBhZGQgc3BhY2UgdG8gaGF2ZSB0aGUgc2FtZSBsYXlvdXQgdGhhbiByZWFkIGNvbm5lY3Rpb24gcG9vbAotCQlCdXR0b24gc3BhY2UgPSB0aGlzLmdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDaGVja0JveChjb250YWluZXIsICJtIik7Ci0JCVBvaW50IHNpemUgPSBzcGFjZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQljb250YWluZXIgPSB0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCBzaXplLnkgKyA1KTsKLQkJc3BhY2UuZGlzcG9zZSgpOwotCi0JCS8vIFdyaXRlIENvbm5lY3Rpb25zIE1pbmltdW0KLQkJbmV3IEpkYmNXcml0ZUNvbm5lY3Rpb25zTWluQ29tcG9zaXRlPFQ+KHRoaXMsIGNvbnRhaW5lcik7Ci0KLQkJLy8gV3JpdGUgQ29ubmVjdGlvbnMgTWF4aW11bQotCQluZXcgSmRiY1dyaXRlQ29ubmVjdGlvbnNNYXhDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1dyaXRlQ29ubmVjdGlvbnNNYXhDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjV3JpdGVDb25uZWN0aW9uc01heENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGVmOGFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjV3JpdGVDb25uZWN0aW9uc01heENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEpkYmNXcml0ZUNvbm5lY3Rpb25zTWF4Q29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBKZGJjV3JpdGVDb25uZWN0aW9uc01heENvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KZGJjV3JpdGVDb25uZWN0aW9uc01heENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKZGJjV3JpdGVDb25uZWN0aW9uc01heENvbXBvc2l0ZSgKLQkJCQkJCQkJUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlhZGRXcml0ZUNvbm5lY3Rpb25zTWF4Q29tYm8oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFdyaXRlQ29ubmVjdGlvbnNNYXhDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBJbnRlZ2VyQ29tYm88Q29ubmVjdGlvbj4odGhpcywgY29udGFpbmVyKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfd3JpdGVDb25uZWN0aW9uc01heExhYmVsOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJcmV0dXJuIEpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRXcml0ZUNvbm5lY3Rpb25zTWF4KCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5XUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRXcml0ZUNvbm5lY3Rpb25zTWF4KCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRXcml0ZUNvbm5lY3Rpb25zTWF4KHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjV3JpdGVDb25uZWN0aW9uc01pbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNXcml0ZUNvbm5lY3Rpb25zTWluQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkM2IzMjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNXcml0ZUNvbm5lY3Rpb25zTWluQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5JbnRlZ2VyQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSmRiY1dyaXRlQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEpkYmNXcml0ZUNvbm5lY3Rpb25zTWluQ29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKLQlleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpkYmNXcml0ZUNvbm5lY3Rpb25zTWluQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEpkYmNXcml0ZUNvbm5lY3Rpb25zTWluQ29tcG9zaXRlKAotCQkJCQkJCQlQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJYWRkV3JpdGVDb25uZWN0aW9uc01pbkNvbWJvKGNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRXcml0ZUNvbm5lY3Rpb25zTWluQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSW50ZWdlckNvbWJvPENvbm5lY3Rpb24+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3dyaXRlQ29ubmVjdGlvbnNNaW5MYWJlbDsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscElkKCkgewotCQkJCXJldHVybiBKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTjsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01pbigpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0V3JpdGVDb25uZWN0aW9uc01pbigpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJCQl0aGlzLnN1YmplY3Quc2V0V3JpdGVDb25uZWN0aW9uc01pbih2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vTmF0aXZlU3FsQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vTmF0aXZlU3FsQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmM2Y5ZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL05hdGl2ZVNxbENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogTmF0aXZlU3FsQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBOYXRpdmVTcWxDb21wb3NpdGU8VCBleHRlbmRzIENvbm5lY3Rpb24+IAotCWV4dGVuZHMgUGFuZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TmF0aXZlU3FsQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE5hdGl2ZVNxbENvbXBvc2l0ZSgKLQkJCQkJUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbmF0aXZlU3FsTGFiZWwsCi0JCQl0aGlzLmJ1aWxkTmF0aXZlU3FsSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkTmF0aXZlU3FsU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTgotCQkpOwotCX0KLQkKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROYXRpdmVTcWxIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5OQVRJVkVfU1FMX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmF0aXZlU3FsKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0TmF0aXZlU3FsKHZhbHVlKTsKLQkJCX0KLQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYXRpdmVTcWxTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHROYXRpdmVTcWxIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX25hdGl2ZVNxbExhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbmF0aXZlU3FsTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdE5hdGl2ZVNxbEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlDb25uZWN0aW9uLk5BVElWRV9TUUxfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXROYXRpdmVTcWwoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHROYXRpdmVTcWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZDE0MzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL1BlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWIKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYjxUIGV4dGVuZHMgQ29ubmVjdGlvbj4KLQlleHRlbmRzIFBhbmU8VD4KLQlpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKLXsKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JcHVibGljIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciwgCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRWNsaXBzZUxpbmtDb25uZWN0aW9uQ29tcG9zaXRlPFQ+KHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKcGFQYWdlQ29tcG9zaXRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGVscElEKCkgewotCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT047Ci0JfQotCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VUZXh0KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl90aXRsZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExheW91dCAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRoaXMuYWRkUGFuZShwYXJlbnQsIGxheW91dCk7Ci0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiN2ZjOGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL1RyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4KLQlleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGUoCi0JCQkJCVBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIoIHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KCBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl90cmFuc2FjdGlvblR5cGVMYWJlbCwKLQkJCXRoaXMuYWRkVHJhbnNhY3Rpb25UeXBlQ29tYm8oIGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTgotCQkpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxQZXJzaXN0ZW5jZVVuaXQsIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4gYWRkVHJhbnNhY3Rpb25UeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8UGVyc2lzdGVuY2VVbml0LCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+KHRoaXMsIHRoaXMuYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSwgY29udGFpbmVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUGVyc2lzdGVuY2VVbml0LkRFRkFVTFRfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZVtdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQkJCWNhc2UgSlRBIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlX2p0YTsKLQkJCQkJY2FzZSBSRVNPVVJDRV9MT0NBTCA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZV9yZXNvdXJjZV9sb2NhbDsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSkgewotCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSh2YWx1ZSk7Ci0KLQkJCQlpZiAodmFsdWUgPT0gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLlJFU09VUkNFX0xPQ0FMKSB7Ci0JCQkJCWNsZWFySlRBUHJvcGVydGllcygpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY2xlYXJSZXNvdXJjZUxvY2FsUHJvcGVydGllcygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IGJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBQZXJzaXN0ZW5jZVVuaXQ+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQl9Ci0JCX07Ci0JCQotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckpUQVByb3BlcnRpZXMoKSB7Ci0JCWdldFN1YmplY3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5zZXRKdGFEYXRhU291cmNlKG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhclJlc291cmNlTG9jYWxQcm9wZXJ0aWVzKCkgewotCQlDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSB0aGlzLmdldFN1YmplY3QoKTsKLQkJY29ubmVjdGlvbi5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5zZXROb25KdGFEYXRhU291cmNlKG51bGwpOwotCQljb25uZWN0aW9uLnNldERyaXZlcihudWxsKTsKLQkJY29ubmVjdGlvbi5zZXRVcmwobnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0VXNlcihudWxsKTsKLQkJY29ubmVjdGlvbi5zZXRQYXNzd29yZChudWxsKTsKLQkJY29ubmVjdGlvbi5zZXRCaW5kUGFyYW1ldGVycyhudWxsKTsKLQkJY29ubmVjdGlvbi5zZXRXcml0ZUNvbm5lY3Rpb25zTWF4KG51bGwpOwotCQljb25uZWN0aW9uLnNldFdyaXRlQ29ubmVjdGlvbnNNaW4obnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0UmVhZENvbm5lY3Rpb25zTWF4KG51bGwpOwotCQljb25uZWN0aW9uLnNldFJlYWRDb25uZWN0aW9uc01pbihudWxsKTsKLQkJY29ubmVjdGlvbi5zZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQobnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUobnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0TGF6eUNvbm5lY3Rpb24obnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0N1c3RvbWl6ZXJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9DdXN0b21pemVyQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0Mjk1ZjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0N1c3RvbWl6ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ3VzdG9taXphdGlvbkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEN1c3RvbWl6ZXJDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbWl6ZXJDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEN1c3RvbWl6YXRpb25FbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DdXN0b21pemVyQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ3VzdG9taXplckNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uRW50aXR5PiBwYXJlbnRQYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPEN1c3RvbWl6YXRpb25FbnRpdHk+IGluaXRpYWxpemVDbGFzc0Nob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxDdXN0b21pemF0aW9uRW50aXR5Pih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uRW50aXR5LCBTdHJpbmc+KAotCQkJCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbkVudGl0eS5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gZ2V0U3ViamVjdFBhcmVudCgpLmdldERlc2NyaXB0b3JDdXN0b21pemVyT2YoZ2V0U3ViamVjdE5hbWUoKSk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCWdldFN1YmplY3RQYXJlbnQoKS5zZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKGdldFN1YmplY3ROYW1lKCksIHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3RQYXJlbnQoKS5nZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKGdldFN1YmplY3ROYW1lKCkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2N1c3RvbWl6ZXJMYWJlbDsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0UGFyZW50KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCQlnZXRTdWJqZWN0UGFyZW50KCkuc2V0RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihnZXRTdWJqZWN0TmFtZSgpLCBjbGFzc05hbWUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3VwZXJJbnRlcmZhY2VOYW1lKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua0N1c3RvbWl6ZXIuRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSX0NMQVNTX05BTUU7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFN1YmplY3ROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkuZ2V0VmFsdWUoKS5nZXROYW1lKCk7Ci0JfQotCQotCXByaXZhdGUgQ3VzdG9taXphdGlvbiBnZXRTdWJqZWN0UGFyZW50KCkgewotCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkuZ2V0VmFsdWUoKS5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5pbml0aWFsaXplQ2xhc3NDaG9vc2VyKGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0VjbGlwc2VMaW5rQ3VzdG9taXphdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0VjbGlwc2VMaW5rQ3VzdG9taXphdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGE3ZmFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FY2xpcHNlTGlua0N1c3RvbWl6YXRpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotCi0vKioKLSAqICBQZXJzaXN0ZW5jZVVuaXRDdXN0b21pemF0aW9uQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25Db21wb3NpdGU8VCBleHRlbmRzIEN1c3RvbWl6YXRpb24+IGV4dGVuZHMgUGFuZTxUPgotewotCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25Db21wb3NpdGUoUGFuZTxUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTZWN0aW9uIHNlY3Rpb24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlU2VjdGlvbihwYXJlbnQsIFNXVC5GTEFUIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIgfCBTZWN0aW9uLkRFU0NSSVBUSU9OKTsKLQkJc2VjdGlvbi5zZXRUZXh0KEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfc2VjdGlvblRpdGxlKTsKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3NlY3Rpb25EZXNjcmlwdGlvbik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRoaXMuYWRkU3ViUGFuZShzZWN0aW9uKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKLQotCQkvLyBEZWZhdWx0IHBhbmUKLQkJaW50IGdyb3VwQm94TWFyZ2luID0gdGhpcy5nZXRHcm91cEJveE1hcmdpbigpOwotCi0JCUNvbXBvc2l0ZSBkZWZhdWx0UGFuZSA9IHRoaXMuYWRkU3ViUGFuZSgKLQkJCWNvbXBvc2l0ZSwKLQkJCTAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbgotCQkpOwotCi0JCS8vIFdlYXZpbmcgR3JvdXAKLQkJbmV3IFdlYXZpbmdQcm9wZXJ0aWVzQ29tcG9zaXRlKHRoaXMsIGRlZmF1bHRQYW5lKTsKLQotCQkvLyBWYWxpZGF0aW9uIE9ubHkKLQkJbmV3IFZhbGlkYXRpb25Pbmx5Q29tcG9zaXRlKHRoaXMsIGRlZmF1bHRQYW5lKTsKLQotCQkvLyBNYXBwaW5nIEZpbGVzIFZhbGlkYXRlIFNjaGVtYQotCQluZXcgVmFsaWRhdGVTY2hlbWFDb21wb3NpdGUodGhpcywgZGVmYXVsdFBhbmUpOwotCi0JCS8vIFRocm93IEV4Y2VwdGlvbnMKLQkJbmV3IFRocm93RXhjZXB0aW9uc0NvbXBvc2l0ZSh0aGlzLCBkZWZhdWx0UGFuZSk7Ci0KLQkJLy8gRXhjZXB0aW9uIEhhbmRsZXIKLQkJbmV3IEV4Y2VwdGlvbkhhbmRsZXJDb21wb3NpdGUodGhpcywgZGVmYXVsdFBhbmUpOwotCi0JCS8vIFNlc3Npb24gQ3VzdG9taXplcgotCQluZXcgU2Vzc2lvbkN1c3RvbWl6ZXJzQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0KLQkJdGhpcy5idWlsZEVudGl0eUxpc3RDb21wb3NpdGUoY29tcG9zaXRlKTsKLQotCQkvLyBQcm9maWxlcjoKLQkJbmV3IFByb2ZpbGVyQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkRW50aXR5TGlzdENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW5ldyBFbnRpdHlMaXN0Q29tcG9zaXRlKHRoaXMsIHBhcmVudCk7IAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZjU5ZDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0VudGl0eUN1c3RvbWl6YXRpb25Qcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DdXN0b21pemF0aW9uRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBFbnRpdHlDdXN0b21pemF0aW9uUHJvcGVydHlDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eUN1c3RvbWl6YXRpb25Qcm9wZXJ0eUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8Q3VzdG9taXphdGlvbkVudGl0eT4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnRpdHlDdXN0b21pemF0aW9uUHJvcGVydHlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVudGl0eUN1c3RvbWl6YXRpb25Qcm9wZXJ0eUNvbXBvc2l0ZShQYW5lPEN1c3RvbWl6YXRpb24+IHBhcmVudENvbXBvc2l0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxDdXN0b21pemF0aW9uRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBDdXN0b21pemVyCi0JCW5ldyBDdXN0b21pemVyQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FbnRpdHlMaXN0Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRW50aXR5TGlzdENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDFhNjk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FbnRpdHlMaXN0Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DdXN0b21pemF0aW9uRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzU2VydmljZTsKLQotLyoqCi0gKiAgRW50aXR5TGlzdENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5TGlzdENvbXBvc2l0ZSBleHRlbmRzIFBhbmU8Q3VzdG9taXphdGlvbj4KLXsKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q3VzdG9taXphdGlvbkVudGl0eT4gZW50aXR5SG9sZGVyOwotCi0JcHVibGljIEVudGl0eUxpc3RDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJdGhpcy5lbnRpdHlIb2xkZXIgPSB0aGlzLmJ1aWxkRW50aXR5SG9sZGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gdGhpcy5hZGRUaXRsZWRHcm91cCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DdXN0b21pemF0aW9uRW50aXR5TGlzdENvbXBvc2l0ZV9ncm91cFRpdGxlCi0JCSk7Ci0KLQkJLy8gRW50aXRpZXMgYWRkL3JlbW92ZSBsaXN0IHBhbmUKLQkJbmV3IEFkZFJlbW92ZUxpc3RQYW5lPEN1c3RvbWl6YXRpb24+KAotCQkJdGhpcywKLQkJCWNvbnRhaW5lciwKLQkJCXRoaXMuYnVpbGRFbnRpdGllc0FkYXB0ZXIoKSwKLQkJCXRoaXMuYnVpbGRFbnRpdGllc0xpc3RIb2xkZXIoKSwKLQkJCXRoaXMuZW50aXR5SG9sZGVyLAotCQkJdGhpcy5idWlsZEVudGl0eUxhYmVsUHJvdmlkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTgotCQkpOwotCi0JCS8vIEVudGl0eSBDdXN0b21pemF0aW9uIHByb3BlcnR5IHBhbmUKLQkJRW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlIHBhbmUgPSBuZXcgRW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlKAotCQkJdGhpcywKLQkJCXRoaXMuZW50aXR5SG9sZGVyLAotCQkJY29udGFpbmVyCi0JCSk7Ci0JCXRoaXMuaW5zdGFsbFBhbmVFbmFibGVyKHRoaXMuZW50aXR5SG9sZGVyLCBwYW5lKTsKLQl9Ci0KLQlwcml2YXRlIEFkZFJlbW92ZUxpc3RQYW5lLkFkYXB0ZXIgYnVpbGRFbnRpdGllc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJRW50aXR5TGlzdENvbXBvc2l0ZS50aGlzLmFkZEVudGl0aWVzKGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCUN1c3RvbWl6YXRpb24gY3VzdG9taXphdGlvbiA9IGdldFN1YmplY3QoKTsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJQ3VzdG9taXphdGlvbkVudGl0eSBlbnRpdHlDdXN0b21pemF0aW9uID0gKEN1c3RvbWl6YXRpb25FbnRpdHkpIGl0ZW07Ci0JCQkJCWN1c3RvbWl6YXRpb24ucmVtb3ZlRW50aXR5KGVudGl0eUN1c3RvbWl6YXRpb24uZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRFbnRpdGllcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0KLQkJSVR5cGUgdHlwZSA9IHRoaXMuY2hvb3NlRW50aXR5KCk7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGVudGl0eU5hbWUgPSB0aGlzLmdldEVudGl0eU5hbWUodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCQlpZiAoZW50aXR5TmFtZSA9PSBudWxsKSB7Ci0JCQkJZW50aXR5TmFtZSA9IHR5cGUuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCX0KLQkJCQotCQkJaWYoICEgdGhpcy5nZXRTdWJqZWN0KCkuZW50aXR5RXhpc3RzKGVudGl0eU5hbWUpKSB7Ci0JCQkJdGhpcy5nZXRTdWJqZWN0KCkuYWRkRW50aXR5KGVudGl0eU5hbWUpOwotCQkJCWludCBpbmRleCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKHRoaXMuZ2V0U3ViamVjdCgpLmdldEVudGl0eU5hbWVzKCksIGVudGl0eU5hbWUpOwotCQkJCUN1c3RvbWl6YXRpb25FbnRpdHkgZW50aXR5ID0gKEN1c3RvbWl6YXRpb25FbnRpdHkpIGxpc3RTZWxlY3Rpb25Nb2RlbC5nZXRMaXN0TW9kZWwoKS5nZXRFbGVtZW50QXQoaW5kZXgpOwotCQkJCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKGVudGl0eSk7Ci0JCQkJdGhpcy5lbnRpdHlIb2xkZXIuc2V0VmFsdWUoZW50aXR5KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRFbnRpdHlOYW1lKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKSB7Ci0KLQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5IGVudGl0eSA9IGdldFN1YmplY3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbnRpdHkoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0JCXJldHVybiBlbnRpdHkgIT0gbnVsbCA/IGVudGl0eS5nZXROYW1lKCkgOiBudWxsOwotCX0KLQkKLQlwcml2YXRlIElUeXBlIGNob29zZUVudGl0eSgpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoKTsKLQkJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W10geyBqYXZhUHJvamVjdCB9OwotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShlbGVtZW50cyk7Ci0JCUlQcm9ncmVzc1NlcnZpY2Ugc2VydmljZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7Ci0JCVNlbGVjdGlvbkRpYWxvZyB0eXBlU2VsZWN0aW9uRGlhbG9nOwotCi0JCXRyeSB7Ci0JCQl0eXBlU2VsZWN0aW9uRGlhbG9nID0gSmF2YVVJLmNyZWF0ZVR5cGVEaWFsb2coCi0JCQkJZ2V0U2hlbGwoKSwKLQkJCQlzZXJ2aWNlLAotCQkJCXNjb3BlLAotCQkJCUlKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50cy5DT05TSURFUl9DTEFTU0VTLAotCQkJCWZhbHNlLAotCQkJCSIiCi0JCQkpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbi5sb2coZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldFRpdGxlKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DdXN0b21pemF0aW9uRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dUaXRsZSk7Ci0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0TWVzc2FnZShFY2xpcHNlTGlua1VpTWVzc2FnZXMuQ3VzdG9taXphdGlvbkVudGl0eUxpc3RDb21wb3NpdGVfZGlhbG9nTWVzc2FnZSk7Ci0KLQkJaWYgKHR5cGVTZWxlY3Rpb25EaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJcmV0dXJuIChJVHlwZSkgdHlwZVNlbGVjdGlvbkRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKTsKLQl9Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkRW50aXR5TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlDdXN0b21pemF0aW9uRW50aXR5IGVudGl0eUN1c3RvbWl6YXRpb24gPSAoQ3VzdG9taXphdGlvbkVudGl0eSkgZWxlbWVudDsKLQkJCQlyZXR1cm4gZW50aXR5Q3VzdG9taXphdGlvbi5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEN1c3RvbWl6YXRpb25FbnRpdHk+IGJ1aWxkRW50aXR5SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxDdXN0b21pemF0aW9uRW50aXR5PigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Q3VzdG9taXphdGlvbkVudGl0eT4gYnVpbGRFbnRpdGllc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQ3VzdG9taXphdGlvbkVudGl0eT4oCi0JCQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uRU5USVRJRVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEN1c3RvbWl6YXRpb25FbnRpdHk+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEVudGl0aWVzKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRFbnRpdGllc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q3VzdG9taXphdGlvbkVudGl0eT4gZW50aXR5SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlIHBhbmUpIHsKLQotCQluZXcgUGFuZUVuYWJsZXIoCi0JCQl0aGlzLmJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoZW50aXR5SG9sZGVyKSwKLQkJCXBhbmUKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFBhbmVFbmFibGVySG9sZGVyKE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q3VzdG9taXphdGlvbkVudGl0eT4gZW50aXR5SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Q3VzdG9taXphdGlvbkVudGl0eSwgQm9vbGVhbj4oZW50aXR5SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybV8oQ3VzdG9taXphdGlvbkVudGl0eSB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5lbnRpdHlOYW1lSXNWYWxpZCgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FeGNlcHRpb25IYW5kbGVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRXhjZXB0aW9uSGFuZGxlckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzIzYWViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FeGNlcHRpb25IYW5kbGVyQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEV4Y2VwdGlvbkhhbmRsZXJDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEV4Y2VwdGlvbkhhbmRsZXJDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FeGNlcHRpb25IYW5kbGVyQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRXhjZXB0aW9uSGFuZGxlckNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBwYXJlbnRQYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPEN1c3RvbWl6YXRpb24+IGluaXRpYWxpemVDbGFzc0Nob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxDdXN0b21pemF0aW9uPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBTdHJpbmc+KAotCQkJCQkJCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBDdXN0b21pemF0aW9uLkVYQ0VQVElPTl9IQU5ETEVSX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRFeGNlcHRpb25IYW5kbGVyKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRFeGNlcHRpb25IYW5kbGVyKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldEV4Y2VwdGlvbkhhbmRsZXIoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9leGNlcHRpb25IYW5kbGVyTGFiZWw7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQkJdGhpcy5nZXRTdWJqZWN0KCkuc2V0RXhjZXB0aW9uSGFuZGxlcihjbGFzc05hbWUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3VwZXJJbnRlcmZhY2VOYW1lKCkgewotCQkJCXJldHVybiBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX0VYQ0VQVElPTl9IQU5ETEVSX0NMQVNTX05BTUU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNsYXNzQ2hvb3Nlcihjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmNzQxNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJJdGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWI8VCBleHRlbmRzIEN1c3RvbWl6YXRpb24+Ci0JCQkJCQkJCWV4dGVuZHMgUGFuZTxUPgotCQkJCQkJCQlpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKLXsKLQlwdWJsaWMgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQotCQl0aGlzLmJ1aWxkRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uQ29tcG9zaXRlKGNvbnRhaW5lcik7Ci0JfQotCQotCS8vICoqKioqKioqKiogSnBhUGFnZUNvbXBvc2l0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTjsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VUZXh0KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aXRsZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExheW91dCAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKLQkJCi0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBhZGRQYW5lKHBhcmVudCwgbGF5b3V0KTsKLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25Db21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uQ29tcG9zaXRlPFQ+KHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1Byb2ZpbGVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vUHJvZmlsZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IwN2NlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vUHJvZmlsZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyQ29tYm9QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlByb2ZpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci0KLS8qKgotICogIFByb2ZpbGVyQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9maWxlckNvbXBvc2l0ZSBleHRlbmRzIENsYXNzQ2hvb3NlckNvbWJvUGFuZTxDdXN0b21pemF0aW9uPgotewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Qcm9maWxlckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgUHJvZmlsZXJDb21wb3NpdGUoCi0JCQkJCQkJCVBhbmU8PyBleHRlbmRzIEN1c3RvbWl6YXRpb24+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBQcm9maWxlci5nZXRQcm9maWxlckNsYXNzTmFtZSh0aGlzLmdldFN1YmplY3QoKS5nZXRQcm9maWxlcigpKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLSAgICAJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfcHJvZmlsZXJMYWJlbDsKLSAgICB9Ci0gICAgCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKTsKLQl9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uUFJPRklMRVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQotCQkJCVN0cmluZyBuYW1lID0gdGhpcy5zdWJqZWN0LmdldFByb2ZpbGVyKCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gUHJvZmlsZXJDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUodGhpcy5zdWJqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGdldERlZmF1bHRWYWx1ZSh0aGlzLnN1YmplY3QpLmVxdWFscyh2YWx1ZSkpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQl0aGlzLnN1YmplY3Quc2V0UHJvZmlsZXIodmFsdWUpOwotCQkJfQotCQl9OwotICAgIH0KLSAgICAKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFByb2ZpbGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBDdXN0b21pemF0aW9uLkRFRkFVTFRfUFJPRklMRVIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gUHJvZmlsZXJDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUodGhpcy5zdWJqZWN0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0UHJvZmlsZXJMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdFByb2ZpbGVySG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERpc3BsYXlTdHJpbmcoU3RyaW5nIHByb2ZpbGVyTmFtZSkgewotCi0JCXN3aXRjaCAoUHJvZmlsZXIudmFsdWVPZihwcm9maWxlck5hbWUpKSB7Ci0JCQljYXNlIG5vX3Byb2ZpbGVyOiB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Qcm9maWxlckNvbXBvc2l0ZV9ub19wcm9maWxlcjsKLQkJCX0KLQkJCWNhc2UgcGVyZm9ybWFuY2VfcHJvZmlsZXI6IHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlByb2ZpbGVyQ29tcG9zaXRlX3BlcmZvcm1hbmNlX3Byb2ZpbGVyOwotCQkJfQotCQkJY2FzZSBxdWVyeV9tb25pdG9yOiB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Qcm9maWxlckNvbXBvc2l0ZV9xdWVyeV9tb25pdG9yOwotCQkJfQotCQkJZGVmYXVsdDogewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPFN0cmluZz4gYnVpbGRQcm9maWxlckNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBwcm9maWxlcjEsIFN0cmluZyBwcm9maWxlcjIpIHsKLQkJCQlwcm9maWxlcjEgPSBidWlsZERpc3BsYXlTdHJpbmcocHJvZmlsZXIxKTsKLQkJCQlwcm9maWxlcjIgPSBidWlsZERpc3BsYXlTdHJpbmcocHJvZmlsZXIyKTsKLQkJCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKHByb2ZpbGVyMSwgcHJvZmlsZXIyKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nQ29udmVydGVyPFN0cmluZz4gYnVpbGRDbGFzc0NvbnZlcnRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQkJCXRyeSB7Ci0JCQkJCVByb2ZpbGVyLnZhbHVlT2YodmFsdWUpOwotCQkJCQl2YWx1ZSA9IGJ1aWxkRGlzcGxheVN0cmluZyh2YWx1ZSk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBJZ25vcmUgc2luY2UgdGhlIHZhbHVlIGlzIG5vdCBhIFByb2ZpbGVyCi0JCQkJfQotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ2xhc3NMaXN0SG9sZGVyKCkgewotCQlBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gaG9sZGVycyA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oMik7Ci0JCWhvbGRlcnMuYWRkKHRoaXMuYnVpbGREZWZhdWx0UHJvZmlsZXJMaXN0SG9sZGVyKCkpOwotCQlob2xkZXJzLmFkZCh0aGlzLmJ1aWxkUHJvZmlsZXJzTGlzdEhvbGRlcigpKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+KGhvbGRlcnMpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZFByb2ZpbGVycygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFByb2ZpbGVyLCBTdHJpbmc+KENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihQcm9maWxlci52YWx1ZXMoKSkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oUHJvZmlsZXIgbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lm5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQcm9maWxlcnNDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oCi0JCQlDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmJ1aWxkUHJvZmlsZXJzKCkpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUHJvZmlsZXJzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCXRoaXMuYnVpbGRQcm9maWxlcnNDb2xsZWN0aW9uSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkUHJvZmlsZXJDb21wYXJhdG9yKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoQ3VzdG9taXphdGlvbiBzdWJqZWN0KSB7Ci0JCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0LmdldERlZmF1bHRQcm9maWxlcigpOwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQlkZWZhdWx0VmFsdWUKLQkJCSk7Ci0JCX0KLQkJcmV0dXJuIEpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdEVtcHR5OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQl0aGlzLmdldFN1YmplY3QoKS5zZXRQcm9maWxlcihjbGFzc05hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN1cGVySW50ZXJmYWNlTmFtZSgpIHsKLQkJcmV0dXJuIEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfU0VTU0lPTl9QUk9GSUxFUl9DTEFTU19OQU1FOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vU2Vzc2lvbkN1c3RvbWl6ZXJzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vU2Vzc2lvbkN1c3RvbWl6ZXJzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMWY4ZTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1Nlc3Npb25DdXN0b21pemVyc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc1NlcnZpY2U7Ci0KLS8qKgotICogIFNlc3Npb25DdXN0b21pemVyc0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgU2Vzc2lvbkN1c3RvbWl6ZXJzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDdXN0b21pemF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2Vzc2lvbkN1c3RvbWl6ZXJDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBTZXNzaW9uQ3VzdG9taXplcnNDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50UGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGFkZFNlc3Npb25DdXN0b21pemVyQ2xhc3MoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCi0JCUlUeXBlIHR5cGUgPSBjaG9vc2VUeXBlKCk7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCckJyk7Ci0JCQlpZiggISB0aGlzLmdldFN1YmplY3QoKS5zZXNzaW9uQ3VzdG9taXplckV4aXN0cyhjbGFzc05hbWUpKSB7Ci0JCQkJCi0JCQkJU3RyaW5nIGNsYXNzUmVmID0gdGhpcy5nZXRTdWJqZWN0KCkuYWRkU2Vzc2lvbkN1c3RvbWl6ZXIoY2xhc3NOYW1lKTsKLQkJCQlsaXN0U2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZShjbGFzc1JlZik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWFkZFNlc3Npb25DdXN0b21pemVyQ2xhc3MobGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJZm9yIChPYmplY3QgaXRlbSA6IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpKSB7Ci0JCQkJCWdldFN1YmplY3QoKS5yZW1vdmVTZXNzaW9uQ3VzdG9taXplcigoU3RyaW5nKSBpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGVsZW1lbnQ7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX25vTmFtZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFNlc3Npb25DdXN0b21pemVycygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0U2Vzc2lvbkN1c3RvbWl6ZXJzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JfQotCi0JLyoqCi0JICogUHJvbXB0cyB0aGUgdXNlciB0aGUgT3BlbiBUeXBlIGRpYWxvZy4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIHRoZSBzZWxlY3RlZCB0eXBlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB1c2VyCi0JICogY2FuY2VsZWQgdGhlIGRpYWxvZwotCSAqLwotCXByaXZhdGUgSVR5cGUgY2hvb3NlVHlwZSgpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoKTsKLQkJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W10geyBqYXZhUHJvamVjdCB9OwotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShlbGVtZW50cyk7Ci0JCUlQcm9ncmVzc1NlcnZpY2Ugc2VydmljZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7Ci0JCVNlbGVjdGlvbkRpYWxvZyB0eXBlU2VsZWN0aW9uRGlhbG9nOwotCi0JCXRyeSB7Ci0JCQl0eXBlU2VsZWN0aW9uRGlhbG9nID0gSmF2YVVJLmNyZWF0ZVR5cGVEaWFsb2coCi0JCQkJZ2V0U2hlbGwoKSwKLQkJCQlzZXJ2aWNlLAotCQkJCXNjb3BlLAotCQkJCUlKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50cy5DT05TSURFUl9DTEFTU0VTLAotCQkJCWZhbHNlLAotCQkJCSIiCi0JCQkpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbi5sb2coZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoSnB0Q29tbW9uVWlNZXNzYWdlcy5DbGFzc0Nob29zZXJQYW5lX2RpYWxvZ1RpdGxlKTsKLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRNZXNzYWdlKEpwdENvbW1vblVpTWVzc2FnZXMuQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dNZXNzYWdlKTsKLQotCQlpZiAodHlwZVNlbGVjdGlvbkRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gKElUeXBlKSB0eXBlU2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCS8vIERlc2NyaXB0aW9uCi0JCWNvbnRhaW5lciA9IGFkZFRpdGxlZEdyb3VwKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9zZXNzaW9uQ3VzdG9taXplckxhYmVsCi0JCSk7Ci0KLQkJLy8gTGlzdCBwYW5lCi0JCW5ldyBBZGRSZW1vdmVMaXN0UGFuZTxDdXN0b21pemF0aW9uPigKLQkJCXRoaXMsCi0JCQljb250YWluZXIsCi0JCQlidWlsZEFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGlzdEhvbGRlcigpLAotCQkJYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVGFibGUoVGFibGUgdGFibGUpIHsKLQkJCQlzdXBlci5pbml0aWFsaXplVGFibGUodGFibGUpOwotCi0JCQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRhYmxlLmdldFBhcmVudCgpOwotCQkJCUdyaWREYXRhIGdyaWREYXRhICAgPSAoR3JpZERhdGEpIGNvbnRhaW5lci5nZXRMYXlvdXREYXRhKCk7Ci0JCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDc1OwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9UaHJvd0V4Y2VwdGlvbnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9UaHJvd0V4Y2VwdGlvbnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZlNWE5My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vVGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRocm93RXhjZXB0aW9uc0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDdXN0b21pemF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFRocm93RXhjZXB0aW9uc0NvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aHJvd0V4Y2VwdGlvbnNMYWJlbCwKLQkJCXRoaXMuYnVpbGRUaHJvd0V4Y2VwdGlvbnNIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRUaHJvd0V4Y2VwdGlvbnNTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTgotCQkpOwotCX0KLQkKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRUaHJvd0V4Y2VwdGlvbnNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5USFJPV19FWENFUFRJT05TX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VGhyb3dFeGNlcHRpb25zKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0VGhyb3dFeGNlcHRpb25zKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGhyb3dFeGNlcHRpb25zU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0VGhyb3dFeGNlcHRpb25zSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aHJvd0V4Y2VwdGlvbnNMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Rocm93RXhjZXB0aW9uc0xhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRUaHJvd0V4Y2VwdGlvbnNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ3VzdG9taXphdGlvbi5USFJPV19FWENFUFRJT05TX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0VGhyb3dFeGNlcHRpb25zKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0VGhyb3dFeGNlcHRpb25zKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1ZhbGlkYXRlU2NoZW1hQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vVmFsaWRhdGVTY2hlbWFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQxZTEyYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vVmFsaWRhdGVTY2hlbWFDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgVmFsaWRhdGVTY2hlbWFDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlU2NoZW1hQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDdXN0b21pemF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VmFsaWRhdGVTY2hlbWFDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGVTY2hlbWFDb21wb3NpdGUoCi0JCQkJCVBhbmU8PyBleHRlbmRzIEN1c3RvbWl6YXRpb24+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdmFsaWRhdGVTY2hlbWFMYWJlbCwKLQkJCXRoaXMuYnVpbGRWYWxpZGF0ZVNjaGVtYUhvbGRlcigpLAotCQkJdGhpcy5idWlsZFZhbGlkYXRlU2NoZW1hU3RyaW5nSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0NVU1RPTUlaQVRJT04KLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVmFsaWRhdGVTY2hlbWFIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5WQUxJREFURV9TQ0hFTUFfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRWYWxpZGF0ZVNjaGVtYSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFZhbGlkYXRlU2NoZW1hKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVmFsaWRhdGVTY2hlbWFTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRWYWxpZGF0ZVNjaGVtYUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdmFsaWRhdGVTY2hlbWFMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3ZhbGlkYXRlU2NoZW1hTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFZhbGlkYXRlU2NoZW1hSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUN1c3RvbWl6YXRpb24uVkFMSURBVEVfU0NIRU1BX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0VmFsaWRhdGVTY2hlbWEoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRWYWxpZGF0ZVNjaGVtYSgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9WYWxpZGF0aW9uT25seUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1ZhbGlkYXRpb25Pbmx5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiY2VhYTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1ZhbGlkYXRpb25Pbmx5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFZhbGlkYXRpb25Pbmx5Q29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uT25seUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8Q3VzdG9taXphdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlZhbGlkYXRpb25Pbmx5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25Pbmx5Q29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3ZhbGlkYXRpb25Pbmx5TGFiZWwsCi0JCQl0aGlzLmJ1aWxkVmFsaWRhdGlvbk9ubHlIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRWYWxpZGF0aW9uT25seVN0cmluZ0hvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9DVVNUT01JWkFUSU9OCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFZhbGlkYXRpb25Pbmx5SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uVkFMSURBVElPTl9PTkxZX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VmFsaWRhdGlvbk9ubHkoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRWYWxpZGF0aW9uT25seSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFZhbGlkYXRpb25Pbmx5U3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0VmFsaWRhdGlvbk9ubHlIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3ZhbGlkYXRpb25Pbmx5TGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0aW9uT25seUxhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRWYWxpZGF0aW9uT25seUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlDdXN0b21pemF0aW9uLlZBTElEQVRJT05fT05MWV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFZhbGlkYXRpb25Pbmx5KCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0VmFsaWRhdGlvbk9ubHkoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMmQ0NWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBXZWF2aW5nQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFdlYXZpbmdDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8Q3VzdG9taXphdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPldlYXZpbmdDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBXZWF2aW5nQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUoCi0JCQkJCVBhbmU8PyBleHRlbmRzIEN1c3RvbWl6YXRpb24+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0NoYW5nZVRyYWNraW5nTGFiZWwsCi0JCQl0aGlzLmJ1aWxkV2VhdmluZ0NoYW5nZVRyYWNraW5nSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkV2VhdmluZ0NoYW5nZVRyYWNraW5nU3RyaW5nSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0NVU1RPTUlaQVRJT04KLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkV2VhdmluZ0NoYW5nZVRyYWNraW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRXZWF2aW5nQ2hhbmdlVHJhY2tpbmdTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRXZWF2aW5nQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdDaGFuZ2VUcmFja2luZ0xhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0NoYW5nZVRyYWNraW5nTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFdlYXZpbmdDaGFuZ2VUcmFja2luZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlDdXN0b21pemF0aW9uLldFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0V2VhdmluZ0NoYW5nZVRyYWNraW5nKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0V2VhdmluZ0NoYW5nZVRyYWNraW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YzVjM2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuV2VhdmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFdlYXZpbmdDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFdlYXZpbmdDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5XZWF2aW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBXZWF2aW5nQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIoIHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8Q3VzdG9taXphdGlvbiwgV2VhdmluZz4gYWRkV2VhdmluZ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPEN1c3RvbWl6YXRpb24sIFdlYXZpbmc+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChDdXN0b21pemF0aW9uLldFQVZJTkdfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXZWF2aW5nW10gZ2V0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gV2VhdmluZy52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV2VhdmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0V2VhdmluZygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhXZWF2aW5nIHZhbHVlKSB7Ci0JCQkJc3dpdGNoICh2YWx1ZSkgewotCQkJCQljYXNlIHRydWVfIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuV2VhdmluZ0NvbXBvc2l0ZV90cnVlXzsKLQkJCQkJY2FzZSBmYWxzZV8gOgotCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5XZWF2aW5nQ29tcG9zaXRlX2ZhbHNlXzsKLQkJCQkJY2FzZSBzdGF0aWNfIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuV2VhdmluZ0NvbXBvc2l0ZV9zdGF0aWNfOwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdlYXZpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRXZWF2aW5nKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoV2VhdmluZyB2YWx1ZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRXZWF2aW5nKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dCggQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0xhYmVsLAotCQkJdGhpcy5hZGRXZWF2aW5nQ29tYm8oIGNvbnRhaW5lciksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0NVU1RPTUlaQVRJT04KLQkJKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nRWFnZXJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nRWFnZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjMWFmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ0VhZ2VyQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFdlYXZpbmdFYWdlckNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgV2VhdmluZ0VhZ2VyQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDdXN0b21pemF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+V2VhdmluZ0VhZ2VyQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFdlYXZpbmdFYWdlckNvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nRWFnZXJMYWJlbCwKLQkJCXRoaXMuYnVpbGRXZWF2aW5nRWFnZXJIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRXZWF2aW5nRWFnZXJTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTgotCQkpOwotCX0KLQkKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRXZWF2aW5nRWFnZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5XRUFWSU5HX0VBR0VSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0V2VhdmluZ0VhZ2VyKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0V2VhdmluZ0VhZ2VyKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkV2VhdmluZ0VhZ2VyU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0V2VhdmluZ0VhZ2VySG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nRWFnZXJMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdFYWdlckxhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRXZWF2aW5nRWFnZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ3VzdG9taXphdGlvbi5XRUFWSU5HX0VBR0VSX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0V2VhdmluZ0VhZ2VyKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0V2VhdmluZ0VhZ2VyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdGZXRjaEdyb3Vwc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdGZXRjaEdyb3Vwc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODc0NzA1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nRmV0Y2hHcm91cHNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogV2VhdmluZ0ZldGNoR3JvdXBzQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWF2aW5nRmV0Y2hHcm91cHNDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5XZWF2aW5nRmV0Y2hHcm91cHNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgV2VhdmluZ0ZldGNoR3JvdXBzQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdGZXRjaEdyb3Vwc0xhYmVsLAotCQkJdGhpcy5idWlsZFdlYXZpbmdGZXRjaEdyb3Vwc0hvbGRlcigpLAotCQkJdGhpcy5idWlsZFdlYXZpbmdGZXRjaEdyb3Vwc1N0cmluZ0hvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9DVVNUT01JWkFUSU9OCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkV2VhdmluZ0ZldGNoR3JvdXBzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uV0VBVklOR19GRVRDSF9HUk9VUFNfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRXZWF2aW5nRmV0Y2hHcm91cHMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRXZWF2aW5nRmV0Y2hHcm91cHModmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRXZWF2aW5nRmV0Y2hHcm91cHNTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRXZWF2aW5nRmV0Y2hHcm91cHNIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdGZXRjaEdyb3Vwc0xhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ZldGNoR3JvdXBzTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFdlYXZpbmdGZXRjaEdyb3Vwc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlDdXN0b21pemF0aW9uLldFQVZJTkdfRkVUQ0hfR1JPVVBTX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0V2VhdmluZ0ZldGNoR3JvdXBzKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0V2VhdmluZ0ZldGNoR3JvdXBzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdJbnRlcm5hbENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdJbnRlcm5hbENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGZjZjQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nSW50ZXJuYWxDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogV2VhdmluZ0ludGVybmFsQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWF2aW5nSW50ZXJuYWxDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5XZWF2aW5nSW50ZXJuYWxDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgV2VhdmluZ0ludGVybmFsQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdJbnRlcm5hbExhYmVsLAotCQkJdGhpcy5idWlsZFdlYXZpbmdJbnRlcm5hbEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFdlYXZpbmdJbnRlcm5hbFN0cmluZ0hvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9DVVNUT01JWkFUSU9OCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFdlYXZpbmdJbnRlcm5hbEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDdXN0b21pemF0aW9uLldFQVZJTkdfSU5URVJOQUxfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRXZWF2aW5nSW50ZXJuYWwoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRXZWF2aW5nSW50ZXJuYWwodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRXZWF2aW5nSW50ZXJuYWxTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRXZWF2aW5nSW50ZXJuYWxIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdJbnRlcm5hbExhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ludGVybmFsTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFdlYXZpbmdJbnRlcm5hbEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlDdXN0b21pemF0aW9uLldFQVZJTkdfSU5URVJOQUxfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRXZWF2aW5nSW50ZXJuYWwoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRXZWF2aW5nSW50ZXJuYWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ0xhenlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nTGF6eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDgwYjM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nTGF6eUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBXZWF2aW5nTGF6eUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgV2VhdmluZ0xhenlDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5XZWF2aW5nTGF6eUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBXZWF2aW5nTGF6eUNvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nTGF6eUxhYmVsLAotCQkJdGhpcy5idWlsZFdlYXZpbmdMYXp5SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkV2VhdmluZ0xhenlTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTgotCQkpOwotCX0KLQkKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRXZWF2aW5nTGF6eUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDdXN0b21pemF0aW9uLldFQVZJTkdfTEFaWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFdlYXZpbmdMYXp5KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0V2VhdmluZ0xhenkodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRXZWF2aW5nTGF6eVN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFdlYXZpbmdMYXp5SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nTGF6eUxhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0xhenlMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0V2VhdmluZ0xhenlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ3VzdG9taXphdGlvbi5XRUFWSU5HX0xBWllfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRXZWF2aW5nTGF6eSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFdlYXZpbmdMYXp5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRkZTRlYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgV2VhdmluZ1Byb3BlcnRpZXNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFdlYXZpbmdQcm9wZXJ0aWVzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDdXN0b21pemF0aW9uPgotewotCXB1YmxpYyBXZWF2aW5nUHJvcGVydGllc0NvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSB3ZWF2aW5nR3JvdXAgPSB0aGlzLmFkZFRpdGxlZEdyb3VwKAotCQkJdGhpcy5hZGRTdWJQYW5lKHBhcmVudCwgMTApLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nUHJvcGVydGllc0dyb3VwQm94Ci0JCSk7Ci0KLQkJLy8gV2VhdmluZwotCQluZXcgV2VhdmluZ0NvbXBvc2l0ZSh0aGlzLCB3ZWF2aW5nR3JvdXApOwotCi0JCS8vIFdlYXZpbmcgTGF6eQotCQluZXcgV2VhdmluZ0xhenlDb21wb3NpdGUodGhpcywgd2VhdmluZ0dyb3VwKTsKLQotCQkvLyBXZWF2aW5nIEZldGNoIEdyb3VwcwotCQluZXcgV2VhdmluZ0ZldGNoR3JvdXBzQ29tcG9zaXRlKHRoaXMsIHdlYXZpbmdHcm91cCk7Ci0KLQkJLy8gV2VhdmluZyBJbnRlcm5hbAotCQluZXcgV2VhdmluZ0ludGVybmFsQ29tcG9zaXRlKHRoaXMsIHdlYXZpbmdHcm91cCk7Ci0KLQkJLy8gV2VhdmluZyBFYWdlcgotCQluZXcgV2VhdmluZ0VhZ2VyQ29tcG9zaXRlKHRoaXMsIHdlYXZpbmdHcm91cCk7Ci0KLQkJLy8gV2VhdmluZyBDaGFuZ2UgVHJhY2tpbmcKLQkJbmV3IFdlYXZpbmdDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZSh0aGlzLCB3ZWF2aW5nR3JvdXApOwotCi0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZ2VuZXJhbC9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZ2VuZXJhbC9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgzYTRiMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2dlbmVyYWwvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZ2VuZXJhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUKLQlleHRlbmRzIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUKLXsKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJCQkJQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkJCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lciwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZU1hcHBlZENsYXNzZXNQYW5lKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUpQQU1hcHBpbmdEZXNjcmlwdG9yc1BhbmUoY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplSmFyRmlsZXNQYW5lKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKUEFNYXBwaW5nRGVzY3JpcHRvcnNQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9qcGFNYXBwaW5nRGVzY3JpcHRvcnMsCi0JCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9qcGFNYXBwaW5nRGVzY3JpcHRvcnNfZGVzY3JpcHRpb24KLQkJKTsKLQotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIpOwotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIuZ2V0UGFyZW50KCkpOwotCi0JCW5ldyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSmFyRmlsZXNQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9qYXJGaWxlcwotCQkpOwotCQkKLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyLmdldFBhcmVudCgpKTsKLQkJCi0JCW5ldyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZ2VuZXJhbC9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2dlbmVyYWwvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWE3NDE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZ2VuZXJhbC9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmdlbmVyYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLkFyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5QZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuQXJjaGl2ZUZpbGVTZWxlY3Rpb25EaWFsb2cuRGVwbG95bWVudFBhdGhDYWxjdWxhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUKLQlleHRlbmRzIFBlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUoCi0JCQlQYW5lPD8gZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXQ+IHBhcmVudFBhbmUsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlcGxveW1lbnRQYXRoQ2FsY3VsYXRvciBidWlsZEphckZpbGVEZXBsb3ltZW50UGF0aENhbGN1bGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtEZXBsb3ltZW50UGF0aENhbGN1bGF0b3IoKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRWNsaXBzZUxpbmtEZXBsb3ltZW50UGF0aENhbGN1bGF0b3IKLQkJZXh0ZW5kcyBBcmNoaXZlRmlsZVNlbGVjdGlvbkRpYWxvZy5Nb2R1bGVEZXBsb3ltZW50UGF0aENhbGN1bGF0b3IKLQl7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGNhbGN1bGF0ZURlcGxveW1lbnRQYXRoKElGaWxlIGZpbGUpIHsKLQkJCVN0cmluZyBiYXNlRGVwbG95bWVudFBhdGggPSBzdXBlci5jYWxjdWxhdGVEZXBsb3ltZW50UGF0aChmaWxlKTsKLQkJCWlmIChKcHRKcGFDb3JlUGx1Z2luLnByb2plY3RIYXNXZWJGYWNldChmaWxlLmdldFByb2plY3QoKSkpIHsKLQkJCQlyZXR1cm4gIi4uLyIgKyBiYXNlRGVwbG95bWVudFBhdGg7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gYmFzZURlcGxveW1lbnRQYXRoOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2dlbmVyYWwvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc1NDU2ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2dlbmVyYWwvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5nZW5lcmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5HZW5lcmFsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5QZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0Ci0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBBZGRSZW1vdmVMaXN0UGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmFkZE1hcHBpbmdGaWxlc0xpc3QoY29udGFpbmVyKTsKLQkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX2V4Y2x1ZGVFY2xpcHNlbGlua09ybSwKLQkJCXRoaXMuYnVpbGRFeGNsdWRlRWNsaXBzZWxpbmtPcm1Ib2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRFeGNsdWRlRWNsaXBzZWxpbmtPcm1TdHJpbmdIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9HRU5FUkFMCi0JCSk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhbFByb3BlcnRpZXM+IGJ1aWxkR2VuZXJhbFByb3BlcnRpZXNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0LCBHZW5lcmFsUHJvcGVydGllcz4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBHZW5lcmFsUHJvcGVydGllcyB0cmFuc2Zvcm1fKFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgcGVyc2lzdGVuY2VVbml0KS5nZXRHZW5lcmFsUHJvcGVydGllcygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRFeGNsdWRlRWNsaXBzZWxpbmtPcm1Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYWxQcm9wZXJ0aWVzLCBCb29sZWFuPigKLQkJCWJ1aWxkR2VuZXJhbFByb3BlcnRpZXNIb2xkZXIoKSwKLQkJCUdlbmVyYWxQcm9wZXJ0aWVzLkVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRXhjbHVkZUVjbGlwc2VsaW5rT3JtU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0RXhjbHVkZUVjbGlwc2VsaW5rT3JtSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9leGNsdWRlRWNsaXBzZWxpbmtPcm1XaXRoRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZXhjbHVkZUVjbGlwc2VsaW5rT3JtOwotCQkJfQotCQl9OwotCX0JCi0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0RXhjbHVkZUVjbGlwc2VsaW5rT3JtSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmFsUHJvcGVydGllcywgQm9vbGVhbj4oCi0JCQlidWlsZEdlbmVyYWxQcm9wZXJ0aWVzSG9sZGVyKCksCi0JCQlHZW5lcmFsUHJvcGVydGllcy5FWENMVURFX0VDTElQU0VMSU5LX09STV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvRWNsaXBzZUxpbmtMb2dnaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvRWNsaXBzZUxpbmtMb2dnaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMTZkZTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0VjbGlwc2VMaW5rTG9nZ2luZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5sb2dnaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rTG9nZ2luZ0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtMb2dnaW5nQ29tcG9zaXRlPFQgZXh0ZW5kcyBMb2dnaW5nPgotCWV4dGVuZHMgUGFuZTxUPgotewotCXB1YmxpYyBFY2xpcHNlTGlua0xvZ2dpbmdDb21wb3NpdGUoCi0JCQkJCVBhbmU8VD4gc3ViamVjdEhvbGRlciwgCi0JCQkJCUNvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyLCBmYWxzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVTZWN0aW9uKHBhcmVudCwgU1dULkZMQVQgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04pOwotCQlzZWN0aW9uLnNldFRleHQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZWN0aW9uVGl0bGUpOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2VjdGlvbkRlc2NyaXB0aW9uKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb21wb3NpdGUpOwotCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbXBvc2l0ZS5nZXRQYXJlbnQoKSk7Ci0JCQotCQkvLyBMb2dnaW5nTGV2ZWw6Ci0JCW5ldyBMb2dnaW5nTGV2ZWxDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQotCQkvLyBCb29sZWFuIHByb3BlcnRpZXMgZ3JvdXAKLQkJdGhpcy5sb2dQcm9wZXJ0aWVzQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gTG9nZ2luZ0ZpbGU6Ci0JCW5ldyBMb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQkvLyBMb2dnZXI6Ci0JCW5ldyBMb2dnZXJDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCXJldHVybjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbG9nUHJvcGVydGllc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gVGltZXN0YW1wOgotCQluZXcgVGltZXN0YW1wQ29tcG9zaXRlKHRoaXMsIHBhcmVudCk7Ci0KLQkJLy8gVGhyZWFkOgotCQluZXcgVGhyZWFkQ29tcG9zaXRlKHRoaXMsIHBhcmVudCk7Ci0KLQkJLy8gU2Vzc2lvbjoKLQkJbmV3IFNlc3Npb25Db21wb3NpdGUodGhpcywgcGFyZW50KTsKLQotCQkvLyBFeGNlcHRpb25zOgotCQluZXcgRXhjZXB0aW9uc0NvbXBvc2l0ZSh0aGlzLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9FeGNlcHRpb25zQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvRXhjZXB0aW9uc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2IwMTA1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9FeGNlcHRpb25zQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEV4Y2VwdGlvbnNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEV4Y2VwdGlvbnNDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPExvZ2dpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FeGNlcHRpb25zQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEV4Y2VwdGlvbnNDb21wb3NpdGUoCi0JCQkJCVBhbmU8PyBleHRlbmRzIExvZ2dpbmc+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZXhjZXB0aW9uc0xhYmVsLAotCQkJdGhpcy5idWlsZEV4Y2VwdGlvbnNIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRFeGNlcHRpb25zU3RyaW5nSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0xPR0dJTkdfRVhDRVBUSU9OUwotCQkpOwotCX0KLQkKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRFeGNlcHRpb25zSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIExvZ2dpbmcuRVhDRVBUSU9OU19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEV4Y2VwdGlvbnMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRFeGNlcHRpb25zKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRXhjZXB0aW9uc1N0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdEV4Y2VwdGlvbnNIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2V4Y2VwdGlvbnNMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2V4Y2VwdGlvbnNMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0RXhjZXB0aW9uc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlMb2dnaW5nLkVYQ0VQVElPTlNfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRFeGNlcHRpb25zKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0RXhjZXB0aW9ucygpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnZXJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJmZTE5Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2VyQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5sb2dnaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyQ29tYm9QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqICBMb2dnZXJDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIExvZ2dlckNvbXBvc2l0ZSBleHRlbmRzIENsYXNzQ2hvb3NlckNvbWJvUGFuZTxMb2dnaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TG9nZ2VyQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBMb2dnZXJDb21wb3NpdGUoCi0JCQkJCQkJCVBhbmU8PyBleHRlbmRzIExvZ2dpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlpZiAodGhpcy5nZXRTdWJqZWN0KCkuZ2V0TG9nZ2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIExvZ2dlci5kZWZhdWx0X2xvZ2dlci5nZXRDbGFzc05hbWUoKTsKLQkJfQotCQlyZXR1cm4gTG9nZ2VyLmdldExvZ2dlckNsYXNzTmFtZSh0aGlzLmdldFN1YmplY3QoKS5nZXRMb2dnZXIoKSk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0gICAgCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2xvZ2dlckxhYmVsOwotICAgIH0KLSAgICAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCX0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN1cGVySW50ZXJmYWNlTmFtZSgpIHsKLSAgICAJcmV0dXJuIExvZ2dpbmcuRUNMSVBTRUxJTktfTE9HR0VSX0NMQVNTX05BTUU7Ci0gICAgfQotICAgIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBMb2dnaW5nLkxPR0dFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCi0JCQkJU3RyaW5nIG5hbWUgPSB0aGlzLnN1YmplY3QuZ2V0TG9nZ2VyKCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gTG9nZ2VyQ29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHRoaXMuc3ViamVjdCk7Ci0JCQkJfQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCWlmIChnZXREZWZhdWx0VmFsdWUodGhpcy5zdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldExvZ2dlcih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRMb2dnZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIExvZ2dpbmcuREVGQVVMVF9MT0dHRVIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gTG9nZ2VyQ29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHRoaXMuc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdExvZ2dlckxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCXRoaXMuYnVpbGREZWZhdWx0TG9nZ2VySG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERpc3BsYXlTdHJpbmcoU3RyaW5nIGxvZ2dlck5hbWUpIHsKLQotCQlzd2l0Y2ggKExvZ2dlci52YWx1ZU9mKGxvZ2dlck5hbWUpKSB7Ci0JCQljYXNlIGRlZmF1bHRfbG9nZ2VyOiB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Mb2dnZXJDb21wb3NpdGVfZGVmYXVsdF9sb2dnZXI7Ci0JCQl9Ci0JCQljYXNlIGphdmFfbG9nZ2VyOiB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Mb2dnZXJDb21wb3NpdGVfamF2YV9sb2dnZXI7Ci0JCQl9Ci0JCQljYXNlIHNlcnZlcl9sb2dnZXI6IHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkxvZ2dlckNvbXBvc2l0ZV9zZXJ2ZXJfbG9nZ2VyOwotCQkJfQotCQkJZGVmYXVsdDogewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPFN0cmluZz4gYnVpbGRMb2dnZXJDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgbG9nZ2VyMSwgU3RyaW5nIGxvZ2dlcjIpIHsKLQkJCQlsb2dnZXIxID0gYnVpbGREaXNwbGF5U3RyaW5nKGxvZ2dlcjEpOwotCQkJCWxvZ2dlcjIgPSBidWlsZERpc3BsYXlTdHJpbmcobG9nZ2VyMik7Ci0JCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShsb2dnZXIxLCBsb2dnZXIyKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nQ29udmVydGVyPFN0cmluZz4gYnVpbGRDbGFzc0NvbnZlcnRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQkJCXRyeSB7Ci0JCQkJCUxvZ2dlci52YWx1ZU9mKHZhbHVlKTsKLQkJCQkJdmFsdWUgPSBidWlsZERpc3BsYXlTdHJpbmcodmFsdWUpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSWdub3JlIHNpbmNlIHRoZSB2YWx1ZSBpcyBub3QgYSBMb2dnZXIKLQkJCQl9Ci0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ2xhc3NMaXN0SG9sZGVyKCkgewotCQlBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gaG9sZGVycyA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oMik7Ci0JCWhvbGRlcnMuYWRkKHRoaXMuYnVpbGREZWZhdWx0TG9nZ2VyTGlzdEhvbGRlcigpKTsKLQkJaG9sZGVycy5hZGQodGhpcy5idWlsZExvZ2dlcnNMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oaG9sZGVycyk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTG9nZ2VycygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPExvZ2dlciwgU3RyaW5nPihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoTG9nZ2VyLnZhbHVlcygpKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShMb2dnZXIgbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lm5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRMb2dnZXJzQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KAotCQkJQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5idWlsZExvZ2dlcnMoKSkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRMb2dnZXJzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCXRoaXMuYnVpbGRMb2dnZXJzQ29sbGVjdGlvbkhvbGRlcigpLAotCQkJdGhpcy5idWlsZExvZ2dlckNvbXBhcmF0b3IoKQotCQkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRWYWx1ZShMb2dnaW5nIHN1YmplY3QpIHsKLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QuZ2V0RGVmYXVsdExvZ2dlcigpOwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQlkZWZhdWx0VmFsdWUKLQkJCSk7Ci0JCX0KLQkJcmV0dXJuIEpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdEVtcHR5OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQl0aGlzLmdldFN1YmplY3QoKS5zZXRMb2dnZXIoY2xhc3NOYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmdGaWxlTG9jYXRpb25Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MmZkZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmdGaWxlTG9jYXRpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkZpbGVDaG9vc2VyQ29tYm9QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgTG9nZ2luZ0ZpbGVMb2NhdGlvbkNvbXBvc2l0ZSAKLSAqLwotcHVibGljIGNsYXNzIExvZ2dpbmdGaWxlTG9jYXRpb25Db21wb3NpdGUgZXh0ZW5kcyBQYW5lPExvZ2dpbmc+Ci17Ci0JcHVibGljIExvZ2dpbmdGaWxlTG9jYXRpb25Db21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgTG9nZ2luZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJbmV3IEZpbGVDaG9vc2VyQ29tYm9QYW5lPExvZ2dpbmc+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIFN0cmluZz4oCi0JCQkJCQkJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBMb2dnaW5nLkxPR19GSUxFX0xPQ0FUSU9OX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCi0JCQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0TG9nRmlsZUxvY2F0aW9uKCk7Ci0JCQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCQkJbmFtZSA9IGRlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBuYW1lOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCQkJaWYgKGRlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQkJfQotCQkJCQkJc3ViamVjdC5zZXRMb2dGaWxlTG9jYXRpb24odmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlKExvZ2dpbmcgc3ViamVjdCkgewotCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0LmdldERlZmF1bHRMb2dGaWxlTG9jYXRpb24oKTsKLQotCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQlKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJCQlkZWZhdWx0VmFsdWUKLQkJCQkJKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiB0aGlzLmdldERlZmF1bHRTdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0U3RyaW5nKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2RlZmF1bHRTdGRvdXQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREaWFsb2dUaXRsZSgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkxvZ2dpbmdGaWxlTG9jYXRpb25Db21wb3NpdGVfZGlhbG9nVGl0bGU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2luZ0ZpbGVMYWJlbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3RQYXRoKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZ0xldmVsQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZ0xldmVsQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZjY1MGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmdMZXZlbENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTG9nZ2luZ0xldmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogTG9nZ2luZ0xldmVsQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnaW5nTGV2ZWxDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPExvZ2dpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Mb2dnaW5nTGV2ZWxDb21wb3NpdGU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIExvZ2dpbmdMZXZlbENvbXBvc2l0ZSgKLQkJCQlQYW5lPD8gZXh0ZW5kcyBMb2dnaW5nPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8TG9nZ2luZywgTG9nZ2luZ0xldmVsPiBhZGRMb2dnaW5nTGV2ZWxDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxMb2dnaW5nLCBMb2dnaW5nTGV2ZWw+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChMb2dnaW5nLkxFVkVMX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTG9nZ2luZ0xldmVsW10gZ2V0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gTG9nZ2luZ0xldmVsLnZhbHVlcygpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTG9nZ2luZ0xldmVsIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdExldmVsKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKExvZ2dpbmdMZXZlbCB2YWx1ZSkgewotCQkJCXN3aXRjaCAodmFsdWUpIHsKLQkJCQkJY2FzZSBhbGwgOgotCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Mb2dnaW5nTGV2ZWxDb21wb3NpdGVfYWxsOwotCQkJCQljYXNlIGNvbmZpZyA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9jb25maWc7Ci0JCQkJCWNhc2UgZmluZSA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9maW5lOwotCQkJCQljYXNlIGZpbmVyIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2ZpbmVyOwotCQkJCQljYXNlIGZpbmVzdCA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9maW5lc3Q7Ci0JCQkJCWNhc2UgaW5mbyA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9pbmZvOwotCQkJCQljYXNlIG9mZiA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9vZmY7Ci0JCQkJCWNhc2Ugc2V2ZXJlIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuTG9nZ2luZ0xldmVsQ29tcG9zaXRlX3NldmVyZTsKLQkJCQkJY2FzZSB3YXJuaW5nIDoKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuTG9nZ2luZ0xldmVsQ29tcG9zaXRlX3dhcm5pbmc7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTG9nZ2luZ0xldmVsIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRMZXZlbCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKExvZ2dpbmdMZXZlbCB2YWx1ZSkgewotCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldExldmVsKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJCWNvbnRhaW5lciwKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2xvZ2dpbmdMZXZlbExhYmVsLAotCQkJCXRoaXMuYWRkTG9nZ2luZ0xldmVsQ29tYm8oY29udGFpbmVyKSwKLQkJCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0xPR0dJTkdfTEVWRUwKLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZWIwMGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL1BlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5sb2dnaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiPFQgZXh0ZW5kcyBMb2dnaW5nPgotCWV4dGVuZHMgUGFuZTxUPgotCWltcGxlbWVudHMgSnBhUGFnZUNvbXBvc2l0ZQotewotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQlwdWJsaWMgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLCAKLQkJCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua0xvZ2dpbmdDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEpwYVBhZ2VDb21wb3NpdGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRIZWxwSUQoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0xPR0dJTkc7Ci0JfQotCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VUZXh0KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aXRsZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExheW91dCAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRoaXMuYWRkUGFuZShwYXJlbnQsIGxheW91dCk7Ci0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvU2Vzc2lvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL1Nlc3Npb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ5ZmJiMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvU2Vzc2lvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBTZXNzaW9uQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXNzaW9uQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxMb2dnaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2Vzc2lvbkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBTZXNzaW9uQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBMb2dnaW5nPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3Nlc3Npb25MYWJlbCwKLQkJCXRoaXMuYnVpbGRTZXNzaW9uSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkU2Vzc2lvblN0cmluZ0hvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9MT0dHSU5HX1NFU1NJT04KLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU2Vzc2lvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBMb2dnaW5nLlNFU1NJT05fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTZXNzaW9uKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U2Vzc2lvbih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFNlc3Npb25TdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRTZXNzaW9uSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZXNzaW9uTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZXNzaW9uTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFNlc3Npb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJTG9nZ2luZy5TRVNTSU9OX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U2Vzc2lvbigpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFNlc3Npb24oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9UaHJlYWRDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9UaHJlYWRDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMTcwZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvVGhyZWFkQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRocmVhZENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVGhyZWFkQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxMb2dnaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGhyZWFkQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFRocmVhZENvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgTG9nZ2luZz4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aHJlYWRMYWJlbCwKLQkJCXRoaXMuYnVpbGRUaHJlYWRIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRUaHJlYWRTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfTE9HR0lOR19USFJFQUQKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGhyZWFkSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIExvZ2dpbmcuVEhSRUFEX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VGhyZWFkKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0VGhyZWFkKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGhyZWFkU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0VGhyZWFkSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aHJlYWRMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RocmVhZExhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRUaHJlYWRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJTG9nZ2luZy5USFJFQURfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRUaHJlYWQoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRUaHJlYWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvVGltZXN0YW1wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvVGltZXN0YW1wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0M2M4ZTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL1RpbWVzdGFtcENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaW1lc3RhbXBDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFRpbWVzdGFtcENvbXBvc2l0ZSBleHRlbmRzIFBhbmU8TG9nZ2luZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRpbWVzdGFtcENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBUaW1lc3RhbXBDb21wb3NpdGUoCi0JCQkJCVBhbmU8PyBleHRlbmRzIExvZ2dpbmc+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGltZXN0YW1wTGFiZWwsCi0JCQl0aGlzLmJ1aWxkVGltZXN0YW1wSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkVGltZXN0YW1wU3RyaW5nSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0xPR0dJTkdfVElNRVNUQU1QCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRpbWVzdGFtcEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBMb2dnaW5nLlRJTUVTVEFNUF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFRpbWVzdGFtcCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFRpbWVzdGFtcCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRpbWVzdGFtcFN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFRpbWVzdGFtcEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGltZXN0YW1wTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aW1lc3RhbXBMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0VGltZXN0YW1wSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUxvZ2dpbmcuVElNRVNUQU1QX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0VGltZXN0YW1wKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0VGltZXN0YW1wKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzk2ZjMwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBFY2xpcHNlTGlua09wdGlvbnNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZTxUIGV4dGVuZHMgT3B0aW9ucz4gZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZSgKLQkJCQkJUGFuZTxUPiBzdWJqZWN0SG9sZGVyLCAKLQkJCQkJQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lciwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmluaXRpYWxpemVTZXNzaW9uT3B0aW9uc1BhbmUocGFyZW50KTsKLQkJdGhpcy5pbml0aWFsaXplTWlzY2VsbGFuZW91c1BhbmUocGFyZW50KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTZXNzaW9uT3B0aW9uc1BhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdGhpcy5hZGRTZWN0aW9uKHBhcmVudCwgCi0JCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uU2VjdGlvblRpdGxlLAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2Vzc2lvblNlY3Rpb25EZXNjcmlwdGlvbik7Ci0JCQotCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbXBvc2l0ZSk7Ci0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29tcG9zaXRlLmdldFBhcmVudCgpKTsKLQotCQluZXcgU2Vzc2lvbk5hbWVDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQotCQluZXcgU2Vzc2lvbnNYbWxDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCW5ldyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJbmV3IFRhcmdldFNlcnZlckNvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJbmV3IEV2ZW50TGlzdGVuZXJDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCW5ldyBJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCXJldHVybjsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBpbml0aWFsaXplTWlzY2VsbGFuZW91c1BhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewkKLQkJCi0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb250YWluZXIuZ2V0UGFyZW50KCkpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRoaXMuYWRkU2VjdGlvbihjb250YWluZXIsIAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfbWlzY2VsbGFuZW91c1NlY3Rpb25UaXRsZSwKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX21pc2NlbGxhbmVvdXNTZWN0aW9uRGVzY3JpcHRpb24pOwotCQkKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb21wb3NpdGUpOwotCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbXBvc2l0ZS5nZXRQYXJlbnQoKSk7Ci0KLQkJbmV3IFRlbXBvcmFsTXV0YWJsZUNvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvRXZlbnRMaXN0ZW5lckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL0V2ZW50TGlzdGVuZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTExN2UxYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvRXZlbnRMaXN0ZW5lckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBFdmVudExpc3RlbmVyQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFdmVudExpc3RlbmVyQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxPcHRpb25zPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RXZlbnRMaXN0ZW5lckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEV2ZW50TGlzdGVuZXJDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgT3B0aW9ucz4gcGFyZW50UGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQ2xhc3NDaG9vc2VyUGFuZTxPcHRpb25zPiBpbml0aWFsaXplQ2xhc3NDaG9vc2VyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IENsYXNzQ2hvb3NlclBhbmU8T3B0aW9ucz4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9ucywgU3RyaW5nPigKLQkJCQkJCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9ucy5TRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRFdmVudExpc3RlbmVyKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRFdmVudExpc3RlbmVyKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldEV2ZW50TGlzdGVuZXIoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9ldmVudExpc3RlbmVyTGFiZWw7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQkJdGhpcy5nZXRTdWJqZWN0KCkuc2V0RXZlbnRMaXN0ZW5lcihjbGFzc05hbWUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3VwZXJJbnRlcmZhY2VOYW1lKCkgewotCQkJCXJldHVybiBPcHRpb25zLkVDTElQU0VMSU5LX0VWRU5UX0xJU1RFTkVSX0NMQVNTX05BTUU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNsYXNzQ2hvb3Nlcihjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9JbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9JbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkNDU3Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxPcHRpb25zPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgT3B0aW9ucz4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNMYWJlbCwKLQkJCXRoaXMuYnVpbGRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfT1BUSU9OUwotCQkpOwotCX0KLQkKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9ucy5TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2luY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJT3B0aW9ucy5TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1BlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1BlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTU4ZjhmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWIKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYjxUIGV4dGVuZHMgT3B0aW9ucz4KLQlleHRlbmRzIFBhbmU8VD4KLQlpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKLXsKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JcHVibGljIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciwgCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogSnBhUGFnZUNvbXBvc2l0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfT1BUSU9OUzsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRleHQoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RpdGxlOwotCX0KLQotCS8vICoqKioqKioqKiogTGF5b3V0ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGFkZENvbnRhaW5lcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luVG9wID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotCQlsYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLQkJbGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE1OwotCQlDb21wb3NpdGUgY29udGFpbmVyID0gdGhpcy5hZGRQYW5lKHBhcmVudCwgbGF5b3V0KTsKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb250YWluZXIpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9TZXNzaW9uTmFtZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1Nlc3Npb25OYW1lQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMDQ1MDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1Nlc3Npb25OYW1lQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgU2Vzc2lvbk5hbWVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25OYW1lQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxPcHRpb25zPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2Vzc2lvbk5hbWVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFNlc3Npb25OYW1lQ29tcG9zaXRlKAotCQkJCQkJCQlQYW5lPD8gZXh0ZW5kcyBPcHRpb25zPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0U2Vzc2lvbk5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuREVGQVVMVF9TRVNTSU9OX05BTUUpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gU2Vzc2lvbk5hbWVDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFNlc3Npb25OYW1lTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJdGhpcy5idWlsZERlZmF1bHRTZXNzaW9uTmFtZUhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRTZXNzaW9uTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9ucywgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9ucy5TRVNTSU9OX05BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQotCQkJCVN0cmluZyBuYW1lID0gc3ViamVjdC5nZXRTZXNzaW9uTmFtZSgpOwotCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJbmFtZSA9IFNlc3Npb25OYW1lQ29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHN1YmplY3QpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQlpZiAoZ2V0RGVmYXVsdFZhbHVlKHN1YmplY3QpLmVxdWFscyh2YWx1ZSkpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldFNlc3Npb25OYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoT3B0aW9ucyBzdWJqZWN0KSB7Ci0JCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0LmdldERlZmF1bHRTZXNzaW9uTmFtZSgpOwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQlkZWZhdWx0VmFsdWUKLQkJCSk7Ci0JCX0KLQkJcmV0dXJuIEpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdEVtcHR5OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUNvbWJvIGNvbWJvID0gYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3Nlc3Npb25OYW1lLAotCQkJdGhpcy5idWlsZERlZmF1bHRTZXNzaW9uTmFtZUxpc3RIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRTZXNzaW9uTmFtZUhvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9PUFRJT05TX1NFU1NJT05fTkFNRQotCQkpOwotCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIoY29tYm8pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9TZXNzaW9uc1htbENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1Nlc3Npb25zWG1sQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNTZjNTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1Nlc3Npb25zWG1sQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgU2Vzc2lvbnNYbWxDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25zWG1sQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxPcHRpb25zPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2Vzc2lvbnNYbWxDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFNlc3Npb25zWG1sQ29tcG9zaXRlKAotCQkJCQkJCQlQYW5lPD8gZXh0ZW5kcyBPcHRpb25zPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0U2Vzc2lvbnNYbWxGaWxlTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9ucywgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9ucy5ERUZBVUxUX1NFU1NJT05TX1hNTCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBTZXNzaW9uc1htbENvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0U2Vzc2lvbnNYbWxGaWxlTmFtZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCXRoaXMuYnVpbGREZWZhdWx0U2Vzc2lvbnNYbWxGaWxlTmFtZUhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRTZXNzaW9uc1htbEZpbGVOYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBPcHRpb25zLlNFU1NJT05TX1hNTF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCi0JCQkJU3RyaW5nIG5hbWUgPSBzdWJqZWN0LmdldFNlc3Npb25zWG1sKCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gU2Vzc2lvbnNYbWxDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQkJfQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCWlmIChnZXREZWZhdWx0VmFsdWUoc3ViamVjdCkuZXF1YWxzKHZhbHVlKSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0U2Vzc2lvbnNYbWwodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRWYWx1ZShPcHRpb25zIHN1YmplY3QpIHsKLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QuZ2V0RGVmYXVsdFNlc3Npb25zWG1sKCk7Ci0KLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJSnB0Q29tbW9uVWlNZXNzYWdlcy5EZWZhdWx0V2l0aE9uZVBhcmFtLAotCQkJCWRlZmF1bHRWYWx1ZQotCQkJKTsKLQkJfQotCQlyZXR1cm4gSnB0Q29tbW9uVWlNZXNzYWdlcy5EZWZhdWx0RW1wdHk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSBhZGRMYWJlbGVkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2Vzc2lvbnNYbWwsCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdFNlc3Npb25zWG1sRmlsZU5hbWVMaXN0SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkU2Vzc2lvbnNYbWxGaWxlTmFtZUhvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9PUFRJT05TX1NFU1NJT05TX1hNTAotCQkpOwotCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIoY29tYm8pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1RhcmdldERhdGFiYXNlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMmRlMWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1RhcmdldERhdGFiYXNlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlRhcmdldERhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8T3B0aW9ucz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRhcmdldERhdGFiYXNlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZSgKLQkJCQkJCQkJUGFuZTw/IGV4dGVuZHMgT3B0aW9ucz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFRhcmdldERhdGFiYXNlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBPcHRpb25zLkRFRkFVTFRfVEFSR0VUX0RBVEFCQVNFKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHN1YmplY3QpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRUYXJnZXREYXRhYmFzZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCXRoaXMuYnVpbGREZWZhdWx0VGFyZ2V0RGF0YWJhc2VIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGlzcGxheVN0cmluZyhTdHJpbmcgdGFyZ2V0RGF0YWJhc2VOYW1lKSB7Ci0JCXN3aXRjaCAoVGFyZ2V0RGF0YWJhc2UudmFsdWVPZih0YXJnZXREYXRhYmFzZU5hbWUpKSB7Ci0JCQljYXNlIGF0dHVuaXR5IDoKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2F0dHVuaXR5OwotCQkJY2FzZSBhdXRvIDoKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2F1dG87Ci0JCQljYXNlIGNsb3Vkc2NhcGUgOgotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfY2xvdWRzY2FwZTsKLQkJCWNhc2UgZGF0YWJhc2UgOgotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfZGF0YWJhc2U7Ci0JCQljYXNlIGRiMiA6Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9kYjI7Ci0JCQljYXNlIGRiMm1haW5mcmFtZSA6Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9kYjJtYWluZnJhbWU7Ci0JCQljYXNlIGRiYXNlIDoKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2RiYXNlOwotCQkJY2FzZSBkZXJieSA6Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9kZXJieTsKLQkJCWNhc2UgaHNxbCA6Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9oc3FsOwotCQkJY2FzZSBpbmZvcm1peCA6Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9pbmZvcm1peDsKLQkJCWNhc2UgamF2YWRiIDoKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2phdmFkYjsKLQkJCWNhc2UgbWF4ZGIgOgotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfbWF4ZGI7Ci0JCQljYXNlIG15c3FsIDoKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlRhcmdldERhdGFiYXNlQ29tcG9zaXRlX215c3FsOwotCQkJY2FzZSBvcmFjbGUgOgotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfb3JhY2xlOwotCQkJY2FzZSBvcmFjbGUxMCA6Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9vcmFjbGUxMDsKLQkJCWNhc2Ugb3JhY2xlMTEgOgotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfb3JhY2xlMTE7Ci0JCQljYXNlIG9yYWNsZTggOgotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfb3JhY2xlODsKLQkJCWNhc2Ugb3JhY2xlOSA6Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9vcmFjbGU5OwotCQkJY2FzZSBwb2ludGJhc2UgOgotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfcG9pbnRiYXNlOwotCQkJY2FzZSBwb3N0Z3Jlc3FsIDoKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlRhcmdldERhdGFiYXNlQ29tcG9zaXRlX3Bvc3RncmVzcWw7Ci0JCQljYXNlIHNxbGFueXdoZXJlIDoKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlRhcmdldERhdGFiYXNlQ29tcG9zaXRlX3NxbGFueXdoZXJlOwotCQkJY2FzZSBzcWxzZXJ2ZXIgOgotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfc3Fsc2VydmVyOwotCQkJY2FzZSBzeWJhc2UgOgotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfc3liYXNlOwotCQkJY2FzZSBzeW1mb3dhcmUgOgotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfc3ltZm93YXJlOwotCQkJY2FzZSB0aW1lc3RlbiA6Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV90aW1lc3RlbjsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0RGF0YWJhc2VDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgdGFyZ2V0RGF0YWJhc2UxLCBTdHJpbmcgdGFyZ2V0RGF0YWJhc2UyKSB7Ci0JCQkJdGFyZ2V0RGF0YWJhc2UxID0gYnVpbGREaXNwbGF5U3RyaW5nKHRhcmdldERhdGFiYXNlMSk7Ci0JCQkJdGFyZ2V0RGF0YWJhc2UyID0gYnVpbGREaXNwbGF5U3RyaW5nKHRhcmdldERhdGFiYXNlMik7Ci0JCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZSh0YXJnZXREYXRhYmFzZTEsIHRhcmdldERhdGFiYXNlMik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZFRhcmdldERhdGFiYXNlQ29udmVydGVyKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJVGFyZ2V0RGF0YWJhc2UudmFsdWVPZih2YWx1ZSk7Ci0JCQkJCXZhbHVlID0gYnVpbGREaXNwbGF5U3RyaW5nKHZhbHVlKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIElnbm9yZSBzaW5jZSB0aGUgdmFsdWUgaXMgbm90IGEgVGFyZ2V0RGF0YWJhc2UKLQkJCQl9Ci0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFyZ2V0RGF0YWJhc2VIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0VGFyZ2V0RGF0YWJhc2UoKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGdldERlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRUYXJnZXREYXRhYmFzZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFyZ2V0RGF0YWJhc2VMaXN0SG9sZGVyKCkgewotCQlBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gaG9sZGVycyA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oMik7Ci0JCWhvbGRlcnMuYWRkKGJ1aWxkRGVmYXVsdFRhcmdldERhdGFiYXNlTGlzdEhvbGRlcigpKTsKLQkJaG9sZGVycy5hZGQoYnVpbGRUYXJnZXREYXRhYmFzZXNMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oaG9sZGVycyk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0RGF0YWJhc2VzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8VGFyZ2V0RGF0YWJhc2UsIFN0cmluZz4oQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKFRhcmdldERhdGFiYXNlLnZhbHVlcygpKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShUYXJnZXREYXRhYmFzZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQubmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRhcmdldERhdGFiYXNlc0NvbGxlY3Rpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPigKLQkJCUNvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGJ1aWxkVGFyZ2V0RGF0YWJhc2VzKCkpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFyZ2V0RGF0YWJhc2VzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCWJ1aWxkVGFyZ2V0RGF0YWJhc2VzQ29sbGVjdGlvbkhvbGRlcigpLAotCQkJYnVpbGRUYXJnZXREYXRhYmFzZUNvbXBhcmF0b3IoKQotCQkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRWYWx1ZShPcHRpb25zIHN1YmplY3QpIHsKLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QuZ2V0RGVmYXVsdFRhcmdldERhdGFiYXNlKCk7Ci0KLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJSnB0Q29tbW9uVWlNZXNzYWdlcy5EZWZhdWx0V2l0aE9uZVBhcmFtLAotCQkJCWRlZmF1bHRWYWx1ZQotCQkJKTsKLQkJfQotCQlyZXR1cm4gSnB0Q29tbW9uVWlNZXNzYWdlcy5EZWZhdWx0RW1wdHk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSBhZGRMYWJlbGVkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfdGFyZ2V0RGF0YWJhc2VMYWJlbCwKLQkJCXRoaXMuYnVpbGRUYXJnZXREYXRhYmFzZUxpc3RIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRUYXJnZXREYXRhYmFzZUhvbGRlcigpLAotCQkJdGhpcy5idWlsZFRhcmdldERhdGFiYXNlQ29udmVydGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX09QVElPTlNfVEFSR0VUX0RBVEFCQVNFCi0JCSk7Ci0KLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvVGFyZ2V0U2VydmVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvVGFyZ2V0U2VydmVyQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MmZhNzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1RhcmdldFNlcnZlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuVGFyZ2V0U2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqICBUYXJnZXRTZXJ2ZXJDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFRhcmdldFNlcnZlckNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8T3B0aW9ucz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRhcmdldFNlcnZlckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVGFyZ2V0U2VydmVyQ29tcG9zaXRlKAotCQkJCQkJCQlQYW5lPD8gZXh0ZW5kcyBPcHRpb25zPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0VGFyZ2V0U2VydmVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBPcHRpb25zLkRFRkFVTFRfVEFSR0VUX1NFUlZFUikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBUYXJnZXRTZXJ2ZXJDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFRhcmdldFNlcnZlckxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCXRoaXMuYnVpbGREZWZhdWx0VGFyZ2V0U2VydmVySG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERpc3BsYXlTdHJpbmcoU3RyaW5nIHRhcmdldFNlcnZlck5hbWUpIHsKLQkJc3dpdGNoIChUYXJnZXRTZXJ2ZXIudmFsdWVPZih0YXJnZXRTZXJ2ZXJOYW1lKSkgewotCQkJY2FzZSBqYm9zcyA6Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5UYXJnZXRTZXJ2ZXJDb21wb3NpdGVfamJvc3M7Ci0JCQljYXNlIG5ldHdlYXZlcl83XzEgOgotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuVGFyZ2V0U2VydmVyQ29tcG9zaXRlX25ldHdlYXZlcl83XzE7Ci0JCQljYXNlIG5vbmUgOgotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuVGFyZ2V0U2VydmVyQ29tcG9zaXRlX25vbmU7Ci0JCQljYXNlIG9jNGogOgotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuVGFyZ2V0U2VydmVyQ29tcG9zaXRlX29jNGo7Ci0JCQljYXNlIHN1bmFzOSA6Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5UYXJnZXRTZXJ2ZXJDb21wb3NpdGVfc3VuYXM5OwotCQkJY2FzZSB3ZWJsb2dpYyA6Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5UYXJnZXRTZXJ2ZXJDb21wb3NpdGVfd2VibG9naWM7Ci0JCQljYXNlIHdlYmxvZ2ljXzEwIDoKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlRhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJsb2dpY18xMDsKLQkJCWNhc2Ugd2VibG9naWNfOSA6Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5UYXJnZXRTZXJ2ZXJDb21wb3NpdGVfd2VibG9naWNfOTsKLQkJCWNhc2Ugd2Vic3BoZXJlIDoKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlRhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJzcGhlcmU7Ci0JCQljYXNlIHdlYnNwaGVyZV82XzEgOgotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3dlYnNwaGVyZV82XzE7Ci0JCQljYXNlIHdlYnNwaGVyZV83IDoKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlRhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJzcGhlcmVfNzsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0U2VydmVyQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHRhcmdldFNlcnZlcjEsIFN0cmluZyB0YXJnZXRTZXJ2ZXIyKSB7Ci0JCQkJdGFyZ2V0U2VydmVyMSA9IGJ1aWxkRGlzcGxheVN0cmluZyh0YXJnZXRTZXJ2ZXIxKTsKLQkJCQl0YXJnZXRTZXJ2ZXIyID0gYnVpbGREaXNwbGF5U3RyaW5nKHRhcmdldFNlcnZlcjIpOwotCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodGFyZ2V0U2VydmVyMSwgdGFyZ2V0U2VydmVyMik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZFRhcmdldFNlcnZlckNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQkJCXRyeSB7Ci0JCQkJCVRhcmdldFNlcnZlci52YWx1ZU9mKHZhbHVlKTsKLQkJCQkJdmFsdWUgPSBidWlsZERpc3BsYXlTdHJpbmcodmFsdWUpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSWdub3JlIHNpbmNlIHRoZSB2YWx1ZSBpcyBub3QgYSBUYXJnZXRTZXJ2ZXIKLQkJCQl9Ci0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFyZ2V0U2VydmVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBPcHRpb25zLlRBUkdFVF9TRVJWRVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQotCQkJCVN0cmluZyBuYW1lID0gc3ViamVjdC5nZXRUYXJnZXRTZXJ2ZXIoKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBUYXJnZXRTZXJ2ZXJDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQkJfQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCWlmIChnZXREZWZhdWx0VmFsdWUoc3ViamVjdCkuZXF1YWxzKHZhbHVlKSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0VGFyZ2V0U2VydmVyKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUYXJnZXRTZXJ2ZXJMaXN0SG9sZGVyKCkgewotCQlBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gaG9sZGVycyA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oMik7Ci0JCWhvbGRlcnMuYWRkKGJ1aWxkRGVmYXVsdFRhcmdldFNlcnZlckxpc3RIb2xkZXIoKSk7Ci0JCWhvbGRlcnMuYWRkKGJ1aWxkVGFyZ2V0U2VydmVyc0xpc3RIb2xkZXIoKSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPiwgU3RyaW5nPihob2xkZXJzKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRUYXJnZXRTZXJ2ZXJzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8VGFyZ2V0U2VydmVyLCBTdHJpbmc+KENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihUYXJnZXRTZXJ2ZXIudmFsdWVzKCkpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFRhcmdldFNlcnZlciBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQubmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRhcmdldFNlcnZlcnNDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oCi0JCQlDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihidWlsZFRhcmdldFNlcnZlcnMoKSkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUYXJnZXRTZXJ2ZXJzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCWJ1aWxkVGFyZ2V0U2VydmVyc0NvbGxlY3Rpb25Ib2xkZXIoKSwKLQkJCWJ1aWxkVGFyZ2V0U2VydmVyQ29tcGFyYXRvcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKE9wdGlvbnMgc3ViamVjdCkgewotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0VGFyZ2V0U2VydmVyKCk7Ci0KLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJSnB0Q29tbW9uVWlNZXNzYWdlcy5EZWZhdWx0V2l0aE9uZVBhcmFtLAotCQkJCWRlZmF1bHRWYWx1ZQotCQkJKTsKLQkJfQotCQlyZXR1cm4gSnB0Q29tbW9uVWlNZXNzYWdlcy5EZWZhdWx0RW1wdHk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbWJvIGNvbWJvID0gYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RhcmdldFNlcnZlckxhYmVsLAotCQkJdGhpcy5idWlsZFRhcmdldFNlcnZlckxpc3RIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRUYXJnZXRTZXJ2ZXJIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRUYXJnZXRTZXJ2ZXJDb252ZXJ0ZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfT1BUSU9OU19UQVJHRVRfU0VSVkVSCi0JCSk7Ci0KLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvVGVtcG9yYWxNdXRhYmxlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvVGVtcG9yYWxNdXRhYmxlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYmZiY2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1RlbXBvcmFsTXV0YWJsZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBUZW1wb3JhbE11dGFibGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFRlbXBvcmFsTXV0YWJsZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8T3B0aW9ucz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRlbXBvcmFsTXV0YWJsZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBUZW1wb3JhbE11dGFibGVDb21wb3NpdGUoCi0JCQkJCVBhbmU8PyBleHRlbmRzIE9wdGlvbnM+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfdGVtcG9yYWxNdXRhYmxlTGFiZWwsCi0JCQl0aGlzLmJ1aWxkVGVtcG9yYWxNdXRhYmxlSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkVGVtcG9yYWxNdXRhYmxlU3RyaW5nSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX09QVElPTlMKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGVtcG9yYWxNdXRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuVEVNUE9SQUxfTVVUQUJMRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFRlbXBvcmFsTXV0YWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFRlbXBvcmFsTXV0YWJsZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRlbXBvcmFsTXV0YWJsZVN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFRlbXBvcmFsTXV0YWJsZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfdGVtcG9yYWxNdXRhYmxlTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90ZW1wb3JhbE11dGFibGVMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0VGVtcG9yYWxNdXRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCU9wdGlvbnMuVEVNUE9SQUxfTVVUQUJMRV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFRlbXBvcmFsTXV0YWJsZSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFRlbXBvcmFsTXV0YWJsZSgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vQ3JlYXRlRGRsRmlsZU5hbWVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vQ3JlYXRlRGRsRmlsZU5hbWVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFiNmRlNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0NyZWF0ZURkbEZpbGVOYW1lQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIENyZWF0ZURkbEZpbGVOYW1lQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8U2NoZW1hR2VuZXJhdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNyZWF0ZURkbEZpbGVOYW1lQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZSgKLQkJCQkJCQkJUGFuZTw/IGV4dGVuZHMgU2NoZW1hR2VuZXJhdGlvbj4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdENyZWF0ZURkbEZpbGVOYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTY2hlbWFHZW5lcmF0aW9uLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBTY2hlbWFHZW5lcmF0aW9uLkRFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fQ1JFQVRFX0ZJTEVfTkFNRSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0Q3JlYXRlRGRsRmlsZU5hbWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdENyZWF0ZURkbEZpbGVOYW1lSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENyZWF0ZURkbEZpbGVOYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTY2hlbWFHZW5lcmF0aW9uLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBTY2hlbWFHZW5lcmF0aW9uLkNSRUFURV9GSUxFX05BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQotCQkJCVN0cmluZyBuYW1lID0gc3ViamVjdC5nZXRDcmVhdGVGaWxlTmFtZSgpOwotCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJbmFtZSA9IENyZWF0ZURkbEZpbGVOYW1lQ29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHN1YmplY3QpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQlpZiAoZ2V0RGVmYXVsdFZhbHVlKHN1YmplY3QpLmVxdWFscyh2YWx1ZSkpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldENyZWF0ZUZpbGVOYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoU2NoZW1hR2VuZXJhdGlvbiBzdWJqZWN0KSB7Ci0JCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0LmdldERlZmF1bHRDcmVhdGVGaWxlTmFtZSgpOwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQlkZWZhdWx0VmFsdWUKLQkJCSk7Ci0JCX0KLQkJcmV0dXJuIEpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdEVtcHR5OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21ibyBjb21ibyA9IGFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9jcmVhdGVEZGxGaWxlTmFtZUxhYmVsLAotCQkJdGhpcy5idWlsZERlZmF1bHRDcmVhdGVEZGxGaWxlTmFtZUxpc3RIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRDcmVhdGVEZGxGaWxlTmFtZUhvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9TQ0hFTUFfR0VORVJBVElPTgotCQkpOwotCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIoY29tYm8pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0RkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGI1NWE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRm9sZGVyQ2hvb3NlckNvbWJvUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlNjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIERkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxTY2hlbWFHZW5lcmF0aW9uPgotewotCXB1YmxpYyBEZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgU2NoZW1hR2VuZXJhdGlvbj4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJbmV3IEZvbGRlckNob29zZXJDb21ib1BhbmU8U2NoZW1hR2VuZXJhdGlvbj4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8U2NoZW1hR2VuZXJhdGlvbiwgU3RyaW5nPigKLQkJCQkJCQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIFNjaGVtYUdlbmVyYXRpb24uQVBQTElDQVRJT05fTE9DQVRJT05fUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQkJCVN0cmluZyBuYW1lID0gc3ViamVjdC5nZXRBcHBsaWNhdGlvbkxvY2F0aW9uKCk7Ci0JCQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCQkJbmFtZSA9IGRlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBuYW1lOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCQkJaWYgKGRlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQkJfQotCQkJCQkJc3ViamVjdC5zZXRBcHBsaWNhdGlvbkxvY2F0aW9uKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZShTY2hlbWFHZW5lcmF0aW9uIHN1YmplY3QpIHsKLQkJCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0QXBwbGljYXRpb25Mb2NhdGlvbigpOwotCi0JCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQkJCWRlZmF1bHRWYWx1ZQotCQkJCQkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdFN0cmluZygpOwotCQkJCX0KLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRTdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGVmYXVsdERvdDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWxvZ01lc3NhZ2UoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGVfZGlhbG9nTWVzc2FnZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWxvZ1RpdGxlKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ1RpdGxlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RkbEdlbmVyYXRpb25Mb2NhdGlvbkxhYmVsOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3YTY1Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0RkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRGRsR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIERkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBEZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZQotCWV4dGVuZHMgUGFuZTxTY2hlbWFHZW5lcmF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIERkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBTY2hlbWFHZW5lcmF0aW9uPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPFNjaGVtYUdlbmVyYXRpb24sIERkbEdlbmVyYXRpb25UeXBlPiBhZGREZGxHZW5lcmF0aW9uVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPFNjaGVtYUdlbmVyYXRpb24sIERkbEdlbmVyYXRpb25UeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoU2NoZW1hR2VuZXJhdGlvbi5ERExfR0VORVJBVElPTl9UWVBFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGRsR2VuZXJhdGlvblR5cGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBEZGxHZW5lcmF0aW9uVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGRsR2VuZXJhdGlvblR5cGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREZWZhdWx0RGRsR2VuZXJhdGlvblR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoRGRsR2VuZXJhdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQkJCWNhc2UgY3JlYXRlX3RhYmxlcyA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkRkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlX2NyZWF0ZV90YWJsZXM7Ci0JCQkJCWNhc2UgZHJvcF9hbmRfY3JlYXRlX3RhYmxlcyA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkRkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlX2Ryb3BfYW5kX2NyZWF0ZV90YWJsZXM7Ci0JCQkJCWNhc2Ugbm9uZSA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkRkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlX25vbmU7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGRsR2VuZXJhdGlvblR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERkbEdlbmVyYXRpb25UeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoRGRsR2VuZXJhdGlvblR5cGUgdmFsdWUpIHsKLQkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXREZGxHZW5lcmF0aW9uVHlwZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kZGxHZW5lcmF0aW9uVHlwZUxhYmVsLAotCQkJYWRkRGRsR2VuZXJhdGlvblR5cGVDb21ibyggY29udGFpbmVyKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfU0NIRU1BX0dFTkVSQVRJT04KLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0Ryb3BEZGxGaWxlTmFtZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9Ecm9wRGRsRmlsZU5hbWVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4ZjFkOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0Ryb3BEZGxGaWxlTmFtZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlNjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBEcm9wRGRsRmlsZU5hbWVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIERyb3BEZGxGaWxlTmFtZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8U2NoZW1hR2VuZXJhdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRyb3BEZGxGaWxlTmFtZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRHJvcERkbEZpbGVOYW1lQ29tcG9zaXRlKAotCQkJCQkJCQlQYW5lPD8gZXh0ZW5kcyBTY2hlbWFHZW5lcmF0aW9uPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0RHJvcERkbEZpbGVOYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTY2hlbWFHZW5lcmF0aW9uLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBTY2hlbWFHZW5lcmF0aW9uLkRFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fRFJPUF9GSUxFX05BTUUpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gRHJvcERkbEZpbGVOYW1lQ29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHN1YmplY3QpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHREcm9wRGRsRmlsZU5hbWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdERyb3BEZGxGaWxlTmFtZUhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREcm9wRGRsRmlsZU5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFNjaGVtYUdlbmVyYXRpb24sIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIFNjaGVtYUdlbmVyYXRpb24uRFJPUF9GSUxFX05BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQotCQkJCVN0cmluZyBuYW1lID0gc3ViamVjdC5nZXREcm9wRmlsZU5hbWUoKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBEcm9wRGRsRmlsZU5hbWVDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQkJfQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCWlmIChEcm9wRGRsRmlsZU5hbWVDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCkuZXF1YWxzKHZhbHVlKSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0RHJvcEZpbGVOYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoU2NoZW1hR2VuZXJhdGlvbiBzdWJqZWN0KSB7Ci0JCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0LmdldERlZmF1bHREcm9wRmlsZU5hbWUoKTsKLQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpOwotCQl9Ci0JCXJldHVybiBKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRFbXB0eTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tYm8gY29tYm8gPSBhZGRMYWJlbGVkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZHJvcERkbEZpbGVOYW1lTGFiZWwsCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdERyb3BEZGxGaWxlTmFtZUxpc3RIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGREcm9wRGRsRmlsZU5hbWVIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfU0NIRU1BX0dFTkVSQVRJT04KLQkJKTsKLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0VjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9FY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3YmEzYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0VjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb25Db21wb3NpdGUKLQlleHRlbmRzIFBhbmU8U2NoZW1hR2VuZXJhdGlvbj4KLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uQ29tcG9zaXRlKAotCQkJCQlQYW5lPFNjaGVtYUdlbmVyYXRpb24+IHN1YmplY3RIb2xkZXIsCi0JCQkJCUNvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyLCBmYWxzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYWRkU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfc2VjdGlvblRpdGxlLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9zZWN0aW9uRGVzY3JpcHRpb24KLQkJKTsKLQotCQkvLyBEREwgR2VuZXJhdGlvbiBUeXBlOgotCQluZXcgRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJLy8gT3V0cHV0IE1vZGU6Ci0JCW5ldyBPdXRwdXRNb2RlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCS8vIERETCBHZW5lcmF0aW9uIExvY2F0aW9uCi0JCW5ldyBEZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJLy8gQ3JlYXRlIERETCBGaWxlIE5hbWU6Ci0JCW5ldyBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQkvLyBEcm9wIERETCBGaWxlIE5hbWU6Ci0JCW5ldyBEcm9wRGRsRmlsZU5hbWVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9PdXRwdXRNb2RlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL091dHB1dE1vZGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNhYTUwNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL091dHB1dE1vZGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5PdXRwdXRNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlNjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBPdXRwdXRNb2RlQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRwdXRNb2RlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxTY2hlbWFHZW5lcmF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3V0cHV0TW9kZUNvbXBvc2l0ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3V0cHV0TW9kZUNvbXBvc2l0ZSgKLQkJCQlQYW5lPD8gZXh0ZW5kcyBTY2hlbWFHZW5lcmF0aW9uPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8U2NoZW1hR2VuZXJhdGlvbiwgT3V0cHV0TW9kZT4gYWRkQnVpbGRPdXRwdXRNb2RlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8U2NoZW1hR2VuZXJhdGlvbiwgT3V0cHV0TW9kZT4odGhpcywgY29udGFpbmVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPdXRwdXRNb2RlW10gZ2V0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gT3V0cHV0TW9kZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3V0cHV0TW9kZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERlZmF1bHRPdXRwdXRNb2RlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKE91dHB1dE1vZGUgdmFsdWUpIHsKLQkJCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQkJCWNhc2UgYm90aCA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLk91dHB1dE1vZGVDb21wb3NpdGVfYm90aDsKLQkJCQkJY2FzZSBkYXRhYmFzZSA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLk91dHB1dE1vZGVDb21wb3NpdGVfZGF0YWJhc2U7Ci0JCQkJCWNhc2Ugc3FsX3NjcmlwdCA6Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLk91dHB1dE1vZGVDb21wb3NpdGVfc3FsX3NjcmlwdDsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPdXRwdXRNb2RlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRPdXRwdXRNb2RlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoT3V0cHV0TW9kZSB2YWx1ZSkgewotCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldE91dHB1dE1vZGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQkJY29udGFpbmVyLAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfb3V0cHV0TW9kZUxhYmVsLAotCQkJCXRoaXMuYWRkQnVpbGRPdXRwdXRNb2RlQ29tYm8oY29udGFpbmVyKSwKLQkJCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1NDSEVNQV9HRU5FUkFUSU9OCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOTYxMzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5TY2hlbWFHZW5lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWIKLQlleHRlbmRzIFBhbmU8U2NoZW1hR2VuZXJhdGlvbj4KLQlpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKLXsKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JcHVibGljIFBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8U2NoZW1hR2VuZXJhdGlvbj4gc3ViamVjdEhvbGRlciwKLQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb25Db21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEpwYVBhZ2VDb21wb3NpdGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRIZWxwSUQoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1NDSEVNQV9HRU5FUkFUSU9OOwotCX0KLQotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0UGFnZUltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYWdlVGV4dCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfdGl0bGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2V4bWwvZGV0YWlscy9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEl0ZW1Db250ZW50UHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2V4bWwvZGV0YWlscy9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2M2U1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNleG1sL2RldGFpbHMvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNleG1sLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBpbmdGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc3RydWN0dXJlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SXRlbUNvbnRlbnRQcm92aWRlci5JbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5QZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyOwotCi0vKioKLSAqIEl0ZW0gY29udGVudCBwcm92aWRlciBmb3IgcHJvamVjdCBleHBsb3Jlci4KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SXRlbUNvbnRlbnRQcm92aWRlciAKLQlleHRlbmRzIFBlcnNpc3RlbmNlVW5pdEl0ZW1Db250ZW50UHJvdmlkZXIKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCwgTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXN1cGVyKHBlcnNpc3RlbmNlVW5pdCwgbWFuYWdlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkcmVuTW9kZWxzVG8oQXJyYXlMaXN0PENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZT4+IGxpc3QpIHsKLQkJc3VwZXIuYWRkQ2hpbGRyZW5Nb2RlbHNUbyhsaXN0KTsKLQkJLy8gYWRkIGFmdGVyIHRoZSBpbXBsaWVkIG1hcHBpbmcgZmlsZQotCQlsaXN0LmFkZCgzLCB0aGlzLmJ1aWxkSW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVzTW9kZWwoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGltcGxpZWQgRWNsaXBzZUxpbmsgbWFwcGluZyBmaWxlICoqKioqKioqKioKLQotCS8qKgotCSAqIE5vIG5lZWQgdG8gZmlsdGVyIHRoaXMgbGlzdCBtb2RlbCBhcyBpdCB3aWxsIGJlIGVtcHR5IGlmIHRoZSB3cmFwcGVkCi0JICogcHJvcGVydHkgbW9kZWwgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPE1hcHBpbmdGaWxlPiBidWlsZEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlc01vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPE1hcHBpbmdGaWxlPih0aGlzLmJ1aWxkSW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVNb2RlbCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE1hcHBpbmdGaWxlPiBidWlsZEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgSW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVNb2RlbCh0aGlzLmJ1aWxkSW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWZNb2RlbCgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlTW9kZWwKLQkJZXh0ZW5kcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TWFwcGluZ0ZpbGVSZWYsIE1hcHBpbmdGaWxlPgotCXsKLQkJcHVibGljIEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPE1hcHBpbmdGaWxlUmVmPiByZWZNb2RlbCkgewotCQkJc3VwZXIocmVmTW9kZWwsIE1hcHBpbmdGaWxlUmVmLk1BUFBJTkdfRklMRV9QUk9QRVJUWSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBNYXBwaW5nRmlsZSBidWlsZFZhbHVlXygpIHsKLQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TWFwcGluZ0ZpbGUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8TWFwcGluZ0ZpbGVSZWY+IGJ1aWxkSW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWZNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZk1vZGVsKChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgdGhpcy5pdGVtKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0Fic3RyYWN0RWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0Fic3RyYWN0RWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YzMzNDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9BYnN0cmFjdEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbVRyZWVTdGF0ZVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5jb252ZXJzaW9uLmphdmEuRWNsaXBzZUxpbmtKYXZhQ29udmVydGVyQ29udmVyc2lvbldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzLmNvbnZlcnNpb24uamF2YS5FY2xpcHNlTGlua0phdmFHZW5lcmF0b3JDb252ZXJzaW9uV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLndpemFyZHMuY29udmVyc2lvbi5qYXZhLkVjbGlwc2VMaW5rSmF2YVF1ZXJ5Q29udmVyc2lvbldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcGFQbGF0Zm9ybVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5iYXNlLkFic3RyYWN0SnBhUGxhdGZvcm1VaTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpCi0JZXh0ZW5kcyBBYnN0cmFjdEpwYVBsYXRmb3JtVWkKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaQotewotCXByb3RlY3RlZCBBYnN0cmFjdEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaSgKLQkJCUl0ZW1UcmVlU3RhdGVQcm92aWRlckZhY3RvcnlQcm92aWRlciBuYXZpZ2F0b3JGYWN0b3J5UHJvdmlkZXIsCi0JCQlKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgcGxhdGZvcm1VaVByb3ZpZGVyCi0JKSB7Ci0JCXN1cGVyKG5hdmlnYXRvckZhY3RvcnlQcm92aWRlciwgcGxhdGZvcm1VaVByb3ZpZGVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1ldGFkYXRhIGNvbnZlcnNpb24gKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIGNvbnZlcnRKYXZhUXVlcnlNZXRhZGF0YVRvR2xvYmFsKEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQl0aGlzLm9wZW5JbkRpYWxvZyhuZXcgRWNsaXBzZUxpbmtKYXZhUXVlcnlDb252ZXJzaW9uV2l6YXJkUGFnZShqcGFQcm9qZWN0KSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNvbnZlcnRKYXZhR2VuZXJhdG9yTWV0YWRhdGFUb0dsb2JhbChKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJdGhpcy5vcGVuSW5EaWFsb2cobmV3IEVjbGlwc2VMaW5rSmF2YUdlbmVyYXRvckNvbnZlcnNpb25XaXphcmRQYWdlKGpwYVByb2plY3QpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb252ZXJ0SmF2YUNvbnZlcnRlck1ldGFkYXRhVG9HbG9iYWwoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCXRoaXMub3BlbkluRGlhbG9nKG5ldyBFY2xpcHNlTGlua0phdmFDb252ZXJ0ZXJDb252ZXJzaW9uV2l6YXJkUGFnZShqcGFQcm9qZWN0KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGluazFfMEpwYVBsYXRmb3JtVWkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmsxXzBKcGFQbGF0Zm9ybVVpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZWNkOTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGluazFfMEpwYVBsYXRmb3JtVWkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbVRyZWVTdGF0ZVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGRsZ2VuLkVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcGFQbGF0Zm9ybVVpUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMEpwYVBsYXRmb3JtVWkKLQlleHRlbmRzIEFic3RyYWN0RWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rMV8wSnBhUGxhdGZvcm1VaSgKLQkJCUl0ZW1UcmVlU3RhdGVQcm92aWRlckZhY3RvcnlQcm92aWRlciBuYXZpZ2F0b3JGYWN0b3J5UHJvdmlkZXIsCi0JCQlKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgcGxhdGZvcm1VaVByb3ZpZGVyCi0JKSB7Ci0JCXN1cGVyKG5hdmlnYXRvckZhY3RvcnlQcm92aWRlciwgcGxhdGZvcm1VaVByb3ZpZGVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIERETCBnZW5lcmF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGdlbmVyYXRlRERMKEpwYVByb2plY3QgcHJvamVjdCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWkuZ2VuZXJhdGUocHJvamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlMGU1Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWlGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVVpRmFjdG9yeQotCWltcGxlbWVudHMgSnBhUGxhdGZvcm1VaUZhY3RvcnkKLXsKLQkvKioKLQkgKiBaZXJvIGFyZyBjb25zdHJ1Y3RvciBmb3IgZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1VaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEpwYVBsYXRmb3JtVWkgYnVpbGRKcGFQbGF0Zm9ybVVpKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rMV8wSnBhUGxhdGZvcm1VaSgKLQkJCQkJRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpRmFjdG9yeS5OQVZJR0FUT1JfRkFDVE9SWV9QUk9WSURFUiwKLQkJCQkJRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuaW5zdGFuY2UoKQotCQkJCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWRjNzY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkVjbGlwc2VMaW5rSmF2YVJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sMV8xVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtWG1sVWlEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVVpUHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1VaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1VaVByb3ZpZGVyKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1VaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGRldGFpbHMgcHJvdmlkZXJzICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXRhaWxzUHJvdmlkZXJzVG8oTGlzdDxKcGFEZXRhaWxzUHJvdmlkZXI+IHByb3ZpZGVycykgewotCQlwcm92aWRlcnMuYWRkKEphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgdWkgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlVWlEZWZpbml0aW9uc1RvKExpc3Q8UmVzb3VyY2VVaURlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWwxXzFVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2M2UzMjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcGFQbGF0Zm9ybVVpRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1VaUZhY3RvcnkKLQlpbXBsZW1lbnRzIEpwYVBsYXRmb3JtVWlGYWN0b3J5Ci17Ci0JLyoqCi0JICogWmVybyBhcmcgY29uc3RydWN0b3IgZm9yIGV4dGVuc2lvbiBwb2ludAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtVWlGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBKcGFQbGF0Zm9ybVVpIGJ1aWxkSnBhUGxhdGZvcm1VaSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGluazFfMEpwYVBsYXRmb3JtVWkoCi0JCQkJCUVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaUZhY3RvcnkuTkFWSUdBVE9SX0ZBQ1RPUllfUFJPVklERVIsCi0JCQkJCUVjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1VaVByb3ZpZGVyLmluc3RhbmNlKCkKLQkJCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVhOWM1NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5FY2xpcHNlTGluazFfMkphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sMV8yVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtWG1sVWlEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlcgotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1VaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1VaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGV0YWlscyBwcm92aWRlcnMgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZERldGFpbHNQcm92aWRlcnNUbyhMaXN0PEpwYURldGFpbHNQcm92aWRlcj4gcHJvdmlkZXJzKSB7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSB1aSBkZWZpbml0aW9ucyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VVaURlZmluaXRpb25zVG8oTGlzdDxSZXNvdXJjZVVpRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rMV8ySmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sMV8yVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUzYWZjOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1UcmVlU3RhdGVQcm92aWRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRkbGdlbi53aXphcmRzLkVjbGlwc2VMaW5rMl8wRERMR2VuZXJhdG9yVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcGFQbGF0Zm9ybVVpUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWkKLQlleHRlbmRzIEFic3RyYWN0RWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaSgKLQkJCUl0ZW1UcmVlU3RhdGVQcm92aWRlckZhY3RvcnlQcm92aWRlciBuYXZpZ2F0b3JGYWN0b3J5UHJvdmlkZXIsCi0JCQlKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgcGxhdGZvcm1VaVByb3ZpZGVyCi0JKSB7Ci0JCXN1cGVyKG5hdmlnYXRvckZhY3RvcnlQcm92aWRlciwgcGxhdGZvcm1VaVByb3ZpZGVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIERETCBnZW5lcmF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGdlbmVyYXRlRERMKEpwYVByb2plY3QgcHJvamVjdCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUVjbGlwc2VMaW5rMl8wRERMR2VuZXJhdG9yVWkuZ2VuZXJhdGUocHJvamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhOGNkYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWlGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpRmFjdG9yeQotCWltcGxlbWVudHMgSnBhUGxhdGZvcm1VaUZhY3RvcnkKLXsKLQkvKioKLQkgKiBaZXJvIGFyZyBjb25zdHJ1Y3RvciBmb3IgZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEpwYVBsYXRmb3JtVWkgYnVpbGRKcGFQbGF0Zm9ybVVpKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaSgKLQkJCQkJRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpRmFjdG9yeS5OQVZJR0FUT1JfRkFDVE9SWV9QUk9WSURFUiwKLQkJCQkJRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuaW5zdGFuY2UoKQotCQkJCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTNlZDExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sMV8xVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbDJfMFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbDJfMFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLlJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5BYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVhtbFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybVhtbDJfMFVpRGVmaW5pdGlvbjsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RKcGFQbGF0Zm9ybVVpUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRldGFpbHMgcHJvdmlkZXJzICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXRhaWxzUHJvdmlkZXJzVG8oTGlzdDxKcGFEZXRhaWxzUHJvdmlkZXI+IHByb3ZpZGVycykgewotCQlwcm92aWRlcnMuYWRkKEphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSB1aSBkZWZpbml0aW9ucyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VVaURlZmluaXRpb25zVG8oTGlzdDxSZXNvdXJjZVVpRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtWG1sMl8wVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sMV8yVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWwyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbDJfMFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU0MWQ0OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1VaUZhY3RvcnkKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaUZhY3RvcnkKLXsKLQkvKioKLQkgKiBaZXJvIGFyZyBjb25zdHJ1Y3RvciBmb3IgZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1VaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYVBsYXRmb3JtVWkgYnVpbGRKcGFQbGF0Zm9ybVVpKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaSgKLQkJCQkJRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpRmFjdG9yeS5OQVZJR0FUT1JfRkFDVE9SWV9QUk9WSURFUiwKLQkJCQkJRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuaW5zdGFuY2UoKQotCQkJCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzQxZjE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sMV8xVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbDJfMFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sMl8xVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5FbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtWG1sMl8wVWlEZWZpbml0aW9uOwotCi0vKioKLSAqICBFY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtVWlQcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlcgotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1VaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1VaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGV0YWlscyBwcm92aWRlcnMgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZERldGFpbHNQcm92aWRlcnNUbyhMaXN0PEpwYURldGFpbHNQcm92aWRlcj4gcHJvdmlkZXJzKSB7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHJlc291cmNlIHVpIGRlZmluaXRpb25zICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZVVpRGVmaW5pdGlvbnNUbyhMaXN0PFJlc291cmNlVWlEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1YbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1YbWwyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sMV8xVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbDJfMFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sMl8xVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzJKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfMkpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMDcwNjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfMkpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWk7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMkpwYVBsYXRmb3JtVWlGYWN0b3J5Ci0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlGYWN0b3J5Ci17Ci0JLyoqCi0JICogWmVybyBhcmcgY29uc3RydWN0b3IgZm9yIGV4dGVuc2lvbiBwb2ludAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGluazJfMkpwYVBsYXRmb3JtVWlGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFQbGF0Zm9ybVVpIGJ1aWxkSnBhUGxhdGZvcm1VaSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWkoCi0JCQkJCUVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaUZhY3RvcnkuTkFWSUdBVE9SX0ZBQ1RPUllfUFJPVklERVIsCi0JCQkJCUVjbGlwc2VMaW5rMl8ySnBhUGxhdGZvcm1VaVByb3ZpZGVyLmluc3RhbmNlKCkKLQkJCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzJKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzJKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRhMmY5YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8ySnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkVjbGlwc2VMaW5rMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sMV8yVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWwyXzBVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbDJfMVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sMl8yVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5FbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtWG1sMl8wVWlEZWZpbml0aW9uOwotCi0vKioKLSAqICBFY2xpcHNlTGluazJfMkpwYVBsYXRmb3JtVWlQcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzJKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlcgotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1VaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rMl8ySnBhUGxhdGZvcm1VaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGluazJfMkpwYVBsYXRmb3JtVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGV0YWlscyBwcm92aWRlcnMgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZERldGFpbHNQcm92aWRlcnNUbyhMaXN0PEpwYURldGFpbHNQcm92aWRlcj4gcHJvdmlkZXJzKSB7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHJlc291cmNlIHVpIGRlZmluaXRpb25zICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZVVpRGVmaW5pdGlvbnNUbyhMaXN0PFJlc291cmNlVWlEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1YbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1YbWwyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sMV8xVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbDJfMFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sMl8xVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWwyXzJVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbDJfMFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfM0pwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8zSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAyNzFlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8zSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8zSnBhUGxhdGZvcm1VaUZhY3RvcnkKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaUZhY3RvcnkKLXsKLQkvKioKLQkgKiBaZXJvIGFyZyBjb25zdHJ1Y3RvciBmb3IgZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rMl8zSnBhUGxhdGZvcm1VaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYVBsYXRmb3JtVWkgYnVpbGRKcGFQbGF0Zm9ybVVpKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaSgKLQkJCQkJRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpRmFjdG9yeS5OQVZJR0FUT1JfRkFDVE9SWV9QUk9WSURFUiwKLQkJCQkJRWNsaXBzZUxpbmsyXzNKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuaW5zdGFuY2UoKQotCQkJCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfM0pwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfM0pwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODc1MTc1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzNKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkVjbGlwc2VMaW5rMl8zSmF2YVJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzNEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWwxXzFVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbDFfMlVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sMl8wVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWwyXzFVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbDJfMlVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sMl8zVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5FbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtWG1sMl8wVWlEZWZpbml0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfM0pwYVBsYXRmb3JtVWlQcm92aWRlcgotCQlleHRlbmRzIEFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmsyXzNKcGFQbGF0Zm9ybVVpUHJvdmlkZXIoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmsyXzNKcGFQbGF0Zm9ybVVpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogZGV0YWlscyBwcm92aWRlcnMgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZERldGFpbHNQcm92aWRlcnNUbyhMaXN0PEpwYURldGFpbHNQcm92aWRlcj4gcHJvdmlkZXJzKSB7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzNEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgdWkgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlVWlEZWZpbml0aW9uc1RvKExpc3Q8UmVzb3VyY2VVaURlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGluazJfM0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybVhtbDJfMFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWwxXzFVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbDFfMlVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sMl8wVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWwyXzFVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbDJfMlVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sMl8zVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzRKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfNEpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MmQ4OTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfNEpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWk7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfNEpwYVBsYXRmb3JtVWlGYWN0b3J5Ci0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlGYWN0b3J5Ci17Ci0JLyoqCi0JICogWmVybyBhcmcgY29uc3RydWN0b3IgZm9yIGV4dGVuc2lvbiBwb2ludAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGluazJfNEpwYVBsYXRmb3JtVWlGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFQbGF0Zm9ybVVpIGJ1aWxkSnBhUGxhdGZvcm1VaSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWkoCi0JCQkJCUVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaUZhY3RvcnkuTkFWSUdBVE9SX0ZBQ1RPUllfUFJPVklERVIsCi0JCQkJCUVjbGlwc2VMaW5rMl80SnBhUGxhdGZvcm1VaVByb3ZpZGVyLmluc3RhbmNlKCkKLQkJCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzRKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzRKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzNjkyOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl80SnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5FY2xpcHNlTGluazJfM0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8zRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sMV8xVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbDJfMFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sMl8xVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWwyXzJVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbDJfM1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sMl80VWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5FbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtWG1sMl8wVWlEZWZpbml0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfNEpwYVBsYXRmb3JtVWlQcm92aWRlcgotCQlleHRlbmRzIEFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyIHsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGluazJfNEpwYVBsYXRmb3JtVWlQcm92aWRlcigpOwotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rMl80SnBhUGxhdGZvcm1VaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZXRhaWxzIHByb3ZpZGVycyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXRhaWxzUHJvdmlkZXJzVG8oTGlzdDxKcGFEZXRhaWxzUHJvdmlkZXI+IHByb3ZpZGVycykgewotCQlwcm92aWRlcnMuYWRkKEphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8zRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSB1aSBkZWZpbml0aW9ucyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZVVpRGVmaW5pdGlvbnNUbyhMaXN0PFJlc291cmNlVWlEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmsyXzNKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1YbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1YbWwyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sMV8xVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbDJfMFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sMl8xVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWwyXzJVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbDJfM1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sMl80VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWJmYjc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcGFQbGF0Zm9ybVVpOwotCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaQotCWV4dGVuZHMgSnBhUGxhdGZvcm1VaQotewotCXZvaWQgY29udmVydEphdmFDb252ZXJ0ZXJNZXRhZGF0YVRvR2xvYmFsKEpwYVByb2plY3QganBhUHJvamVjdCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTJjMjg5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5TaW1wbGVJdGVtVHJlZVN0YXRlUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtVHJlZVN0YXRlUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLkdlbmVyaWNOYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0pwYVBsYXRmb3JtVWlGYWN0b3J5Ci0JaW1wbGVtZW50cyBKcGFQbGF0Zm9ybVVpRmFjdG9yeQotewotCS8qKgotCSAqIFplcm8gYXJnIGNvbnN0cnVjdG9yIGZvciBleHRlbnNpb24gcG9pbnQKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnBhUGxhdGZvcm1VaSBidWlsZEpwYVBsYXRmb3JtVWkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmsxXzBKcGFQbGF0Zm9ybVVpKAotCQkJCQlOQVZJR0FUT1JfRkFDVE9SWV9QUk9WSURFUiwKLQkJCQkJRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuaW5zdGFuY2UoKQotCQkJCSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJdGVtVHJlZVN0YXRlUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXIgTkFWSUdBVE9SX0ZBQ1RPUllfUFJPVklERVIgPQotCQkJbmV3IFNpbXBsZUl0ZW1UcmVlU3RhdGVQcm92aWRlckZhY3RvcnlQcm92aWRlcigKLQkJCQkJRWNsaXBzZUxpbmtOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5pbnN0YW5jZSgpLAotCQkJCQlHZW5lcmljTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Lmluc3RhbmNlKCkKLQkJCQkpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGlua0pwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGlua0pwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTYxNDUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkVjbGlwc2VMaW5rSmF2YVJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLlJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5BYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVhtbFVpRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RKcGFQbGF0Zm9ybVVpUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0pwYVBsYXRmb3JtVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRldGFpbHMgcHJvdmlkZXJzICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXRhaWxzUHJvdmlkZXJzVG8oTGlzdDxKcGFEZXRhaWxzUHJvdmlkZXI+IHByb3ZpZGVycykgewotCQlwcm92aWRlcnMuYWRkKEphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgdWkgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlVWlEZWZpbml0aW9uc1RvKExpc3Q8UmVzb3VyY2VVaURlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rTmF2aWdhdG9ySXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmtOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGM0OGE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmtOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtVHJlZUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZXhtbC5kZXRhaWxzLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuR2VuZXJpY05hdmlnYXRvckl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCWV4dGVuZHMgR2VuZXJpY05hdmlnYXRvckl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlbVRyZWVDb250ZW50UHJvdmlkZXJGYWN0b3J5IElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rTmF2aWdhdG9ySXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVtVHJlZUNvbnRlbnRQcm92aWRlckZhY3RvcnkgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua05hdmlnYXRvckl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVtVHJlZUNvbnRlbnRQcm92aWRlciBidWlsZFByb3ZpZGVyKE9iamVjdCBpdGVtLCBJdGVtVHJlZUNvbnRlbnRQcm92aWRlci5NYW5hZ2VyIG1hbmFnZXIpIHsKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgewotCQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEl0ZW1Db250ZW50UHJvdmlkZXIoKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSBpdGVtLCBtYW5hZ2VyKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuYnVpbGRQcm92aWRlcihpdGVtLCBtYW5hZ2VyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3N0cnVjdHVyZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlU3RydWN0dXJlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VTdHJ1Y3R1cmVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDZjZTE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VTdHJ1Y3R1cmVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1UcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbVRyZWVDb250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc3RydWN0dXJlLlBlcnNpc3RlbmNlU3RydWN0dXJlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlU3RydWN0dXJlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQlleHRlbmRzIFBlcnNpc3RlbmNlU3RydWN0dXJlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVtVHJlZUNvbnRlbnRQcm92aWRlckZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVN0cnVjdHVyZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlbVRyZWVDb250ZW50UHJvdmlkZXJGYWN0b3J5IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVN0cnVjdHVyZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVtVHJlZUNvbnRlbnRQcm92aWRlciBidWlsZFByb3ZpZGVyKE9iamVjdCBpdGVtLCBJdGVtVHJlZUNvbnRlbnRQcm92aWRlci5NYW5hZ2VyIG1hbmFnZXIpIHsKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgewotCQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEl0ZW1Db250ZW50UHJvdmlkZXIoKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSBpdGVtLCBtYW5hZ2VyKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuYnVpbGRQcm92aWRlcihpdGVtLCBtYW5hZ2VyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3N0cnVjdHVyZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEl0ZW1Db250ZW50UHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTljYmQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc3RydWN0dXJlLlBlcnNpc3RlbmNlVW5pdEl0ZW1Db250ZW50UHJvdmlkZXI7Ci0KLS8qKgotICogSXRlbSBjb250ZW50IHByb3ZpZGVyIGZvciBzdHJ1Y3R1cmUgdmlldy4KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SXRlbUNvbnRlbnRQcm92aWRlciAKLQlleHRlbmRzIFBlcnNpc3RlbmNlVW5pdEl0ZW1Db250ZW50UHJvdmlkZXIKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCwgTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXN1cGVyKHBlcnNpc3RlbmNlVW5pdCwgbWFuYWdlcik7Ci0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkcmVuTW9kZWxzVG8oQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPj4gbGlzdCkgewotCQlzdXBlci5hZGRDaGlsZHJlbk1vZGVsc1RvKGxpc3QpOwotCQkvLyBhZGQgYWZ0ZXIgdGhlIGltcGxpZWQgbWFwcGluZyBmaWxlCi0JCWxpc3QuYWRkKDMsIHRoaXMuYnVpbGRJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZnNNb2RlbCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPE1hcHBpbmdGaWxlUmVmPiBidWlsZEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmc01vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPE1hcHBpbmdGaWxlUmVmPih0aGlzLmJ1aWxkSW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWZNb2RlbCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE1hcHBpbmdGaWxlUmVmPiBidWlsZEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgSW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWZNb2RlbCgoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIHRoaXMuaXRlbSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZk1vZGVsCi0JCWV4dGVuZHMgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LCBNYXBwaW5nRmlsZVJlZj4KLQl7Ci0JCXB1YmxpYyBJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZk1vZGVsKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCkgewotCQkJc3VwZXIoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQuSU1QTElFRF9FQ0xJUFNFTElOS19NQVBQSU5HX0ZJTEVfUkVGX1BST1BFUlRZLCBwZXJzaXN0ZW5jZVVuaXQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVSZWYgYnVpbGRWYWx1ZV8oKSB7Ci0JCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmKCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MTA5ODQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTG9nZ2luZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5PcHRpb25zMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmcuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5sb2dnaW5nLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLm9wdGlvbnMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5jYWNoaW5nLlBlcnNpc3RlbmNlWG1sQ2FjaGluZzJfMFRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb24yXzBUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLmxvZ2dpbmcuUGVyc2lzdGVuY2VYbWxMb2dnaW5nMl8wVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5vcHRpb25zLlBlcnNpc3RlbmNlWG1sT3B0aW9uczJfMFRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5IGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeQotewotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHBlcnNpc3RlbmNlIHVuaXQgdGFicyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiPEN1c3RvbWl6YXRpb24+IGJ1aWxkQ3VzdG9taXphdGlvblRhYigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEN1c3RvbWl6YXRpb24+IGN1c3RvbWl6YXRpb25Ib2xkZXIgPSB0aGlzLmJ1aWxkQ3VzdG9taXphdGlvbkhvbGRlcihzdWJqZWN0SG9sZGVyKTsKLQotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvbjJfMFRhYihjdXN0b21pemF0aW9uSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWI8Q2FjaGluZz4gYnVpbGRDYWNoaW5nVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gY2FjaGluZ0hvbGRlciA9IHRoaXMuYnVpbGRDYWNoaW5nSG9sZGVyKHN1YmplY3RIb2xkZXIpOwotCi0JCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nMl8wVGFiKGNhY2hpbmdIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYjw/IGV4dGVuZHMgTG9nZ2luZzJfMD4gYnVpbGRMb2dnaW5nVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8TG9nZ2luZzJfMD4gbG9nZ2luZzJfMEhvbGRlciA9IHRoaXMuYnVpbGRMb2dnaW5nMl8wSG9sZGVyKHN1YmplY3RIb2xkZXIpOwotCi0JCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nMl8wVGFiKGxvZ2dpbmcyXzBIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWI8T3B0aW9uczJfMD4gYnVpbGRPcHRpb25zVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9wdGlvbnMyXzA+IG9wdGlvbnMyXzBIb2xkZXIgPSB0aGlzLmJ1aWxkT3B0aW9uczJfMEhvbGRlcihzdWJqZWN0SG9sZGVyKTsKLQotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlWG1sT3B0aW9uczJfMFRhYihvcHRpb25zMl8wSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8vICoqKioqKioqKiogcHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPExvZ2dpbmcyXzA+IGJ1aWxkTG9nZ2luZzJfMEhvbGRlcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgTG9nZ2luZzJfMD4oc3ViamVjdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTG9nZ2luZzJfMCB0cmFuc2Zvcm1fKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHZhbHVlKSB7Ci0KLQkJCQlyZXR1cm4gKExvZ2dpbmcyXzApIHZhbHVlLmdldExvZ2dpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxPcHRpb25zMl8wPiBidWlsZE9wdGlvbnMyXzBIb2xkZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdCwgT3B0aW9uczJfMD4oc3ViamVjdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3B0aW9uczJfMCB0cmFuc2Zvcm1fKFBlcnNpc3RlbmNlVW5pdCB2YWx1ZSkgewotCi0JCQkJcmV0dXJuIChPcHRpb25zMl8wKSAoKFBlcnNpc3RlbmNlVW5pdDJfMCl2YWx1ZSkuZ2V0T3B0aW9ucygpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbDJfMFVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjAzYzMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1UcmVlU3RhdGVQcm92aWRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5QZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSBidWlsZFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXNVaShKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiByZXNvdXJjZVR5cGUuZXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MXzJfMF9SRVNPVVJDRV9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIEl0ZW1UcmVlU3RhdGVQcm92aWRlckZhY3RvcnlQcm92aWRlciBnZXRTdHJ1Y3R1cmVWaWV3RmFjdG9yeVByb3ZpZGVyKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbi5TVFJVQ1RVUkVfVklFV19GQUNUT1JZX1BST1ZJREVSOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hlRGVmYXVsdHMyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hlRGVmYXVsdHMyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU5MTM2YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoZURlZmF1bHRzMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLmNhY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuU2hhcmVkQ2FjaGVNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hlRGVmYXVsdHNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkRlZmF1bHRDYWNoZVNpemVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkRlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBDYWNoZURlZmF1bHRzMl8wQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZURlZmF1bHRzMl8wQ29tcG9zaXRlIGV4dGVuZHMgQ2FjaGVEZWZhdWx0c0NvbXBvc2l0ZTxDYWNoaW5nPgotewotCXB1YmxpYyBDYWNoZURlZmF1bHRzMl8wQ29tcG9zaXRlKFBhbmU8Q2FjaGluZz4gc3ViamVjdEhvbGRlciwKLSAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5pbml0aWFsaXplQ2FjaGVEZWZhdWx0c0NvbXBvc2l0ZXMocGFyZW50KTsKLQkJdGhpcy5pbnN0YWxsUGFuZUVuYWJsZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ2FjaGVEZWZhdWx0c0NvbXBvc2l0ZXMoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCS8vIERlZmF1bHQgQ2FjaGUgVHlwZQotCQluZXcgRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZSh0aGlzLCBwYXJlbnQpOwotCi0JCS8vIERlZmF1bHQgQ2FjaGUgU2l6ZQotCQluZXcgRGVmYXVsdENhY2hlU2l6ZUNvbXBvc2l0ZTxDYWNoaW5nPih0aGlzLCBwYXJlbnQpOwotCi0JfQotCi0JLy8gKioqKioqKioqKiBwcml2YXRlIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxQYW5lRW5hYmxlcigpIHsKLQkJbmV3IFBhbmVFbmFibGVyKHRoaXMuYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpLCB0aGlzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxTaGFyZWRDYWNoZU1vZGUsIEJvb2xlYW4+KHRoaXMuYnVpbGRTaGFyZWRDYWNoZU1vZGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oU2hhcmVkQ2FjaGVNb2RlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlICE9IFNoYXJlZENhY2hlTW9kZS5OT05FOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFNoYXJlZENhY2hlTW9kZT4gYnVpbGRTaGFyZWRDYWNoZU1vZGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdDJfMCwgU2hhcmVkQ2FjaGVNb2RlPigKLQkJCQkJCQkJdGhpcy5idWlsZFBlcnNpc3RlbmNlVW5pdDJfMEhvbGRlcigpLCAKLQkJCQkJCQkJUGVyc2lzdGVuY2VVbml0Ml8wLlNQRUNJRklFRF9TSEFSRURfQ0FDSEVfTU9ERV9QUk9QRVJUWSwgCi0JCQkJCQkJCVBlcnNpc3RlbmNlVW5pdDJfMC5ERUZBVUxUX1NIQVJFRF9DQUNIRV9NT0RFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTaGFyZWRDYWNoZU1vZGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTaGFyZWRDYWNoZU1vZGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQyXzA+IGJ1aWxkUGVyc2lzdGVuY2VVbml0Ml8wSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBQZXJzaXN0ZW5jZVVuaXQyXzA+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQyXzAgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIChQZXJzaXN0ZW5jZVVuaXQyXzApIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY2FjaGluZy9FY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGJiMWUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5jYWNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUgZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGU8Q2FjaGluZz4KLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlKAotCQkJUGFuZTxDYWNoaW5nPiBzdWJqZWN0SG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU2VjdGlvbiBzZWN0aW9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBTV1QuRkxBVCB8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTik7Ci0JCXNlY3Rpb24uc2V0VGV4dChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NlY3Rpb25UaXRsZSk7Ci0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zZWN0aW9uRGVzY3JpcHRpb24pOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwotCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbXBvc2l0ZSk7Ci0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29tcG9zaXRlLmdldFBhcmVudCgpKTsKLQotCQkvLyBTaGFyZWRDYWNoZU1vZGUKLQkJbmV3IFNoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZSh0aGlzLCB0aGlzLmJ1aWxkUGVyc2lzdGVuY2VVbml0Ml8wSG9sZGVyKCksIGNvbXBvc2l0ZSk7Ci0JCS8vIERlZmF1bHRzCi0JCW5ldyBDYWNoZURlZmF1bHRzMl8wQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCS8vIEZsdXNoIENsZWFyIENhY2hlCi0JCW5ldyBGbHVzaENsZWFyQ2FjaGUyXzBDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQyXzA+IGJ1aWxkUGVyc2lzdGVuY2VVbml0Ml8wSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBQZXJzaXN0ZW5jZVVuaXQyXzA+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQyXzAgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIChQZXJzaXN0ZW5jZVVuaXQyXzApIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0ZsdXNoQ2xlYXJDYWNoZTJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2NhY2hpbmcvRmx1c2hDbGVhckNhY2hlMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNTI4ZjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2NhY2hpbmcvRmx1c2hDbGVhckNhY2hlMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5jYWNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlNoYXJlZENhY2hlTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZy5GbHVzaENsZWFyQ2FjaGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBGbHVzaENsZWFyQ2FjaGUyXzBDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEZsdXNoQ2xlYXJDYWNoZTJfMENvbXBvc2l0ZSBleHRlbmRzIEZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Rmx1c2hDbGVhckNhY2hlMl8wQ29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBGbHVzaENsZWFyQ2FjaGUyXzBDb21wb3NpdGUoCi0JCQkJUGFuZTw/IGV4dGVuZHMgQ2FjaGluZz4gcGFyZW50Q29tcG9zaXRlLCAKLQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmluaXRpYWxpemVMYXlvdXQocGFyZW50KTsKLQotCQl0aGlzLmluc3RhbGxQYW5lRW5hYmxlcigpOwotCX0KLQotCS8vICoqKioqKioqKiogcHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsUGFuZUVuYWJsZXIoKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcih0aGlzLmJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSwgdGhpcyk7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8U2hhcmVkQ2FjaGVNb2RlLCBCb29sZWFuPih0aGlzLmJ1aWxkU2hhcmVkQ2FjaGVNb2RlSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFNoYXJlZENhY2hlTW9kZSB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZSAhPSBTaGFyZWRDYWNoZU1vZGUuTk9ORTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTaGFyZWRDYWNoZU1vZGU+IGJ1aWxkU2hhcmVkQ2FjaGVNb2RlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQyXzAsIFNoYXJlZENhY2hlTW9kZT4oCi0JCQkJCQkJCXRoaXMuYnVpbGRQZXJzaXN0ZW5jZVVuaXQyXzBIb2xkZXIoKSwgCi0JCQkJCQkJCVBlcnNpc3RlbmNlVW5pdDJfMC5TUEVDSUZJRURfU0hBUkVEX0NBQ0hFX01PREVfUFJPUEVSVFksIAotCQkJCQkJCQlQZXJzaXN0ZW5jZVVuaXQyXzAuREVGQVVMVF9TSEFSRURfQ0FDSEVfTU9ERV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2hhcmVkQ2FjaGVNb2RlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U2hhcmVkQ2FjaGVNb2RlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0Ml8wPiBidWlsZFBlcnNpc3RlbmNlVW5pdDJfMEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgUGVyc2lzdGVuY2VVbml0Ml8wPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0Ml8wIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoUGVyc2lzdGVuY2VVbml0Ml8wKSB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2NhY2hpbmcvUGVyc2lzdGVuY2VYbWxDYWNoaW5nMl8wVGFiLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY2FjaGluZy9QZXJzaXN0ZW5jZVhtbENhY2hpbmcyXzBUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2ZGM2NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY2FjaGluZy9QZXJzaXN0ZW5jZVhtbENhY2hpbmcyXzBUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFBlcnNpc3RlbmNlWG1sQ2FjaGluZzJfMFRhYgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxDYWNoaW5nMl8wVGFiIGV4dGVuZHMgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiPENhY2hpbmc+Ci17Ci0JcHVibGljIFBlcnNpc3RlbmNlWG1sQ2FjaGluZzJfMFRhYigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJbmV3IEVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0VjbGlwc2VMaW5rQ3VzdG9taXphdGlvbjJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMGRlOTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5FY2xpcHNlTGlua0N1c3RvbWl6YXRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24yXzBDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbjJfMENvbXBvc2l0ZSBleHRlbmRzIEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbkNvbXBvc2l0ZTxDdXN0b21pemF0aW9uPgotewotCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24yXzBDb21wb3NpdGUoCi0JCVBhbmU8Q3VzdG9taXphdGlvbj4gc3ViamVjdEhvbGRlciwgCi0JCUNvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZEVudGl0eUxpc3RDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uMl8wVGFiLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb24yXzBUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNkYjZkZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb24yXzBUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvbjJfMFRhYgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uMl8wVGFiIGV4dGVuZHMgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiPEN1c3RvbWl6YXRpb24+Ci17Ci0JcHVibGljIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvbjJfMFRhYigKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEN1c3RvbWl6YXRpb24+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0gICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25Db21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uMl8wQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2xvZ2dpbmcvQ29ubmVjdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2xvZ2dpbmcvQ29ubmVjdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjIxMGY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0Nvbm5lY3Rpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkxvZ2dpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIENvbm5lY3Rpb25Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3Rpb25Db21wb3NpdGUgZXh0ZW5kcyBQYW5lPExvZ2dpbmcyXzA+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db25uZWN0aW9uQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIENvbm5lY3Rpb25Db21wb3NpdGUoCi0JCQkJCVBhbmU8PyBleHRlbmRzIExvZ2dpbmcyXzA+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfY29ubmVjdGlvbkxhYmVsLAotCQkJdGhpcy5idWlsZENvbm5lY3Rpb25Ib2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRDb25uZWN0aW9uU3RyaW5nSG9sZGVyKCksCi0JCQludWxsCi0vLwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfTE9HR0lOR19DT05ORUNUSU9OCS8vIFRPRE8KLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ29ubmVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZzJfMCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBMb2dnaW5nMl8wLkNPTk5FQ1RJT05fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb25uZWN0aW9uKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0Q29ubmVjdGlvbih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbm5lY3Rpb25TdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPih0aGlzLmJ1aWxkRGVmYXVsdENvbm5lY3Rpb25Ib2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2Nvbm5lY3Rpb25MYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2Nvbm5lY3Rpb25MYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0Q29ubmVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZzJfMCwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlMb2dnaW5nMl8wLkNPTk5FQ1RJT05fUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRDb25uZWN0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0Q29ubmVjdGlvbigpOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2xvZ2dpbmcvRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2xvZ2dpbmcvRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTkyYjI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0VjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkxvZ2dpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTG9nZ2luZ0xldmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZSBleHRlbmRzIFBhbmU8TG9nZ2luZzJfMD4KLXsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZSgKLQkJCQkJUGFuZTxMb2dnaW5nMl8wPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQluZXcgQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21ib1ZpZXdlcih0aGlzLCBwYXJlbnQsIExvZ2dpbmcyXzAuU1FMX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc3FsTG9nZ2luZ0xldmVsTGFiZWwpOwotCQkKLQkJbmV3IENhdGVnb3J5TG9nZ2luZ0xldmVsQ29tYm9WaWV3ZXIodGhpcywgcGFyZW50LCBMb2dnaW5nMl8wLlRSQU5TQUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfY29ubmVjdGlvbkxvZ2dpbmdMZXZlbExhYmVsKTsKLQkJCi0JCW5ldyBDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbWJvVmlld2VyKHRoaXMsIHBhcmVudCwgTG9nZ2luZzJfMC5FVkVOVF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2V2ZW50TG9nZ2luZ0xldmVsTGFiZWwpOwotCQkKLQkJbmV3IENhdGVnb3J5TG9nZ2luZ0xldmVsQ29tYm9WaWV3ZXIodGhpcywgcGFyZW50LCBMb2dnaW5nMl8wLkNPTk5FQ1RJT05fQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9jb25uZWN0aW9uTG9nZ2luZ0xldmVsTGFiZWwpOwotCQkKLQkJbmV3IENhdGVnb3J5TG9nZ2luZ0xldmVsQ29tYm9WaWV3ZXIodGhpcywgcGFyZW50LCBMb2dnaW5nMl8wLlFVRVJZX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfcXVlcnlMb2dnaW5nTGV2ZWxMYWJlbCk7Ci0JCQotCQluZXcgQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21ib1ZpZXdlcih0aGlzLCBwYXJlbnQsIExvZ2dpbmcyXzAuQ0FDSEVfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9jYWNoZUxvZ2dpbmdMZXZlbExhYmVsKTsKLQkJCi0JCW5ldyBDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbWJvVmlld2VyKHRoaXMsIHBhcmVudCwgTG9nZ2luZzJfMC5QUk9QQUdBVElPTl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3Byb3BhZ2F0aW9uTG9nZ2luZ0xldmVsTGFiZWwpOwotCQkKLQkJbmV3IENhdGVnb3J5TG9nZ2luZ0xldmVsQ29tYm9WaWV3ZXIodGhpcywgcGFyZW50LCBMb2dnaW5nMl8wLlNFUVVFTkNJTkdfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZXF1ZW5jaW5nTG9nZ2luZ0xldmVsTGFiZWwpOwotCQkKLQkJbmV3IENhdGVnb3J5TG9nZ2luZ0xldmVsQ29tYm9WaWV3ZXIodGhpcywgcGFyZW50LCBMb2dnaW5nMl8wLkVKQl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2VqYkxvZ2dpbmdMZXZlbExhYmVsKTsKLQkJCi0JCW5ldyBDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbWJvVmlld2VyKHRoaXMsIHBhcmVudCwgTG9nZ2luZzJfMC5ETVNfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9kbXNMb2dnaW5nTGV2ZWxMYWJlbCk7Ci0JCQotCQluZXcgQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21ib1ZpZXdlcih0aGlzLCBwYXJlbnQsIExvZ2dpbmcyXzAuRUpCX09SX01FVEFEQVRBX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZWpiX29yX21ldGFkYXRhTG9nZ2luZ0xldmVsTGFiZWwpOwotCQkKLQkJbmV3IENhdGVnb3J5TG9nZ2luZ0xldmVsQ29tYm9WaWV3ZXIodGhpcywgcGFyZW50LCBMb2dnaW5nMl8wLk1FVEFNT0RFTF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2pwYV9tZXRhbW9kZWxMb2dnaW5nTGV2ZWxMYWJlbCk7Ci0KLQkJbmV3IENhdGVnb3J5TG9nZ2luZ0xldmVsQ29tYm9WaWV3ZXIodGhpcywgcGFyZW50LCBMb2dnaW5nMl8wLldFQVZFUl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3dlYXZlckxvZ2dpbmdMZXZlbExhYmVsKTsKLQkJCi0JCW5ldyBDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbWJvVmlld2VyKHRoaXMsIHBhcmVudCwgTG9nZ2luZzJfMC5QUk9QRVJUSUVTX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfcHJvcGVydGllc0xvZ2dpbmdMZXZlbExhYmVsKTsKLQkJCi0JCW5ldyBDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbWJvVmlld2VyKHRoaXMsIHBhcmVudCwgTG9nZ2luZzJfMC5TRVJWRVJfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZXJ2ZXJMb2dnaW5nTGV2ZWxMYWJlbCk7Ci0JfQotCQotCi0KLQlwcml2YXRlIGNsYXNzIENhdGVnb3J5TG9nZ2luZ0xldmVsQ29tYm9WaWV3ZXIgZXh0ZW5kcyBQYW5lPExvZ2dpbmcyXzA+Ci0JewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QUk9QRVJUWSA9IExvZ2dpbmcyXzAuQ0FURUdPUklFU19ERUZBVUxUX0xPR0dJTkdfUFJPUEVSVFk7Ci0JCWZpbmFsIHByaXZhdGUgU3RyaW5nIGNhdGVnb3J5OwotCQlmaW5hbCBwcml2YXRlIFN0cmluZyBsYWJlbFN0cmluZzsKLQkJCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlPC9jb2RlPi4KLQkJICogCi0JCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkJICogQHBhcmFtIHBhcmVudAotCQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JCSAqLwotCQlwdWJsaWMgQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21ib1ZpZXdlcigKLQkJCQkJUGFuZTw/IGV4dGVuZHMgTG9nZ2luZzJfMD4gcGFyZW50Q29tcG9zaXRlLCAKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCQkJU3RyaW5nIHByb3BlcnR5LAotCQkJCQlTdHJpbmcgbGFiZWxTdHJpbmcpIHsKLQkJCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQkJCQotCQkJdGhpcy5jYXRlZ29yeSA9IHByb3BlcnR5OwotCQkJdGhpcy5sYWJlbFN0cmluZyA9IGxhYmVsU3RyaW5nOwotCQkJaW5pdGlhbGl6ZUxheW91dDIodGhpcy5nZXRDb250cm9sKCkpOwotCQl9Ci0KLQkJcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPExvZ2dpbmcyXzAsIExvZ2dpbmdMZXZlbD4gYWRkTG9nZ2luZ0xldmVsQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPExvZ2dpbmcyXzAsIExvZ2dpbmdMZXZlbD4odGhpcywgY29udGFpbmVyKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChERUZBVUxUX1BST1BFUlRZKTsKLQkJCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZzJfMC5TUUxfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCQkJCXByb3BlcnR5TmFtZXMuYWRkKExvZ2dpbmcyXzAuVFJBTlNBQ1RJT05fQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCQkJCXByb3BlcnR5TmFtZXMuYWRkKExvZ2dpbmcyXzAuRVZFTlRfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCQkJCXByb3BlcnR5TmFtZXMuYWRkKExvZ2dpbmcyXzAuQ09OTkVDVElPTl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZzJfMC5RVUVSWV9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZzJfMC5DQUNIRV9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZzJfMC5QUk9QQUdBVElPTl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZzJfMC5TRVFVRU5DSU5HX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChMb2dnaW5nMl8wLkVKQl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZzJfMC5ETVNfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCQkJCXByb3BlcnR5TmFtZXMuYWRkKExvZ2dpbmcyXzAuRUpCX09SX01FVEFEQVRBX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChMb2dnaW5nMl8wLk1FVEFNT0RFTF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZzJfMC5XRUFWRVJfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCQkJCXByb3BlcnR5TmFtZXMuYWRkKExvZ2dpbmcyXzAuUFJPUEVSVElFU19DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZzJfMC5TRVJWRVJfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBMb2dnaW5nTGV2ZWxbXSBnZXRDaG9pY2VzKCkgewotCQkJCQlyZXR1cm4gTG9nZ2luZ0xldmVsLnZhbHVlcygpOwotCQkJCX0KLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBzb3J0Q2hvaWNlcygpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgTG9nZ2luZ0xldmVsIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldENhdGVnb3JpZXNEZWZhdWx0TGV2ZWwoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoTG9nZ2luZ0xldmVsIHZhbHVlKSB7Ci0JCQkJCXN3aXRjaCAodmFsdWUpIHsKLQkJCQkJCWNhc2UgYWxsIDoKLQkJCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGVfYWxsOwotCQkJCQkJY2FzZSBjb25maWcgOgotCQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9jb25maWc7Ci0JCQkJCQljYXNlIGZpbmUgOgotCQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9maW5lOwotCQkJCQkJY2FzZSBmaW5lciA6Ci0JCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlX2ZpbmVyOwotCQkJCQkJY2FzZSBmaW5lc3QgOgotCQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9maW5lc3Q7Ci0JCQkJCQljYXNlIGluZm8gOgotCQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9pbmZvOwotCQkJCQkJY2FzZSBvZmYgOgotCQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9vZmY7Ci0JCQkJCQljYXNlIHNldmVyZSA6Ci0JCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlX3NldmVyZTsKLQkJCQkJCWNhc2Ugd2FybmluZyA6Ci0JCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlX3dhcm5pbmc7Ci0JCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgTG9nZ2luZ0xldmVsIGdldFZhbHVlKCkgewotCQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0TGV2ZWwoY2F0ZWdvcnkpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKExvZ2dpbmdMZXZlbCB2YWx1ZSkgewotCQkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXRMZXZlbChjYXRlZ29yeSwgdmFsdWUpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQkJCWlmKCBwcm9wZXJ0eU5hbWUgIT0gY2F0ZWdvcnkgJiYgcHJvcGVydHlOYW1lICE9IERFRkFVTFRfUFJPUEVSVFkpIHJldHVybjsKLQkJCQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCS8vIHNlZSBpbml0aWFsaXplTGF5b3V0MgotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dDIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJCQlwYXJlbnQsCi0JCQkJCXRoaXMubGFiZWxTdHJpbmcsCi0JCQkJCXRoaXMuYWRkTG9nZ2luZ0xldmVsQ29tYm8ocGFyZW50KSwKLQkJCQkJbnVsbAkvLyBUT0RPCi0JCQkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0VjbGlwc2VMaW5rTG9nZ2luZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2xvZ2dpbmcvRWNsaXBzZUxpbmtMb2dnaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MDM2MTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2xvZ2dpbmcvRWNsaXBzZUxpbmtMb2dnaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTG9nZ2luZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmxvZ2dpbmcuRWNsaXBzZUxpbmtMb2dnaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtMb2dnaW5nMl8wQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0xvZ2dpbmcyXzBDb21wb3NpdGUgZXh0ZW5kcyBFY2xpcHNlTGlua0xvZ2dpbmdDb21wb3NpdGU8TG9nZ2luZzJfMD4KLXsKLQotCXB1YmxpYyBFY2xpcHNlTGlua0xvZ2dpbmcyXzBDb21wb3NpdGUoCi0JCQkJCQkJCQlQYW5lPExvZ2dpbmcyXzA+IHN1YmplY3RIb2xkZXIsIAotCQkJCQkJCQkJQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5pbml0aWFsaXplTGF5b3V0KHBhcmVudCk7Ci0KLQkJQ29tcG9zaXRlIGNhdGVnb3J5TG9nZ2luZ1NlY3Rpb24gPSB0aGlzLmFkZENvbGxhcHNpYmxlU3ViU2VjdGlvbigKLQkJCXRoaXMuYWRkU3ViUGFuZShwYXJlbnQsIDAsIDE2KSwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfY2F0ZWdvcnlMb2dnaW5nTGV2ZWxTZWN0aW9uVGl0bGUsCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uRkFMU0UpCi0JCSk7Ci0KLQkJdGhpcy5hZGRDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZShjYXRlZ29yeUxvZ2dpbmdTZWN0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQluZXcgRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZSh0aGlzLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxvZ1Byb3BlcnRpZXNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5sb2dQcm9wZXJ0aWVzQ29tcG9zaXRlKHBhcmVudCk7Ci0JCQotCQkvLyBDb25uZWN0aW9uOgotCQluZXcgQ29ubmVjdGlvbkNvbXBvc2l0ZSh0aGlzLCBwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9sb2dnaW5nL1BlcnNpc3RlbmNlWG1sTG9nZ2luZzJfMFRhYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2xvZ2dpbmcvUGVyc2lzdGVuY2VYbWxMb2dnaW5nMl8wVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNGJjOTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2xvZ2dpbmcvUGVyc2lzdGVuY2VYbWxMb2dnaW5nMl8wVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Mb2dnaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UubG9nZ2luZy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBQZXJzaXN0ZW5jZVhtbExvZ2dpbmcyXzBUYWIKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sTG9nZ2luZzJfMFRhYiBleHRlbmRzIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYjxMb2dnaW5nMl8wPgotewotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQlwdWJsaWMgUGVyc2lzdGVuY2VYbWxMb2dnaW5nMl8wVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxMb2dnaW5nMl8wPiBzdWJqZWN0SG9sZGVyLCAKLQkJCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua0xvZ2dpbmcyXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnMyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9uczJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjUyYmJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9uczJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuT3B0aW9uczJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLm9wdGlvbnMuRWNsaXBzZUxpbmtPcHRpb25zQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtPcHRpb25zMl8wQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09wdGlvbnMyXzBDb21wb3NpdGUgZXh0ZW5kcyBFY2xpcHNlTGlua09wdGlvbnNDb21wb3NpdGU8T3B0aW9uczJfMD4KLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcHRpb25zMl8wQ29tcG9zaXRlKAotCQkJUGFuZTxPcHRpb25zMl8wPiBzdWJqZWN0SG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGluaXRpYWxpemVNaXNjZWxsYW5lb3VzUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuaW5pdGlhbGl6ZU1pc2NlbGxhbmVvdXNQYW5lKGNvbnRhaW5lcik7Ci0KLQkJbmV3IExvY2tpbmdDb25maWd1cmF0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCW5ldyBRdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQkJbmV3IFZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9Mb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL29wdGlvbnMvTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk2NTZmOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9Mb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkludGVnZXJDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuT3B0aW9uczJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIExvY2tpbmdDb25maWd1cmF0aW9uQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxPcHRpb25zMl8wPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGUoCi0JCQkJCVBhbmU8T3B0aW9uczJfMD4gcGFyZW50Q29tcG9zaXRlLCAKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJYWRkTG9ja1RpbWVvdXRDb21ibyhjb250YWluZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkTG9ja1RpbWVvdXRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBJbnRlZ2VyQ29tYm88T3B0aW9uczJfMD4odGhpcywgY29udGFpbmVyKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5Mb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZV9sb2NrVGltZW91dExhYmVsOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJcmV0dXJuIG51bGw7CQkvLyBUT0RPCi0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9uczJfMCwgSW50ZWdlcj4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0TG9ja1RpbWVvdXQoKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9uczJfMCwgSW50ZWdlcj4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMyXzAuTE9DS19USU1FT1VUX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TG9ja1RpbWVvdXQoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCQkJdGhpcy5zdWJqZWN0LnNldExvY2tUaW1lb3V0KHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL1BlcnNpc3RlbmNlWG1sT3B0aW9uczJfMFRhYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL29wdGlvbnMvUGVyc2lzdGVuY2VYbWxPcHRpb25zMl8wVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNTU2ZTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL29wdGlvbnMvUGVyc2lzdGVuY2VYbWxPcHRpb25zMl8wVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5PcHRpb25zMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9ucy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBQZXJzaXN0ZW5jZVhtbE9wdGlvbnMyXzBUYWIKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sT3B0aW9uczJfMFRhYiBleHRlbmRzIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYjxPcHRpb25zMl8wPgotewotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQlwdWJsaWMgUGVyc2lzdGVuY2VYbWxPcHRpb25zMl8wVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcHRpb25zMl8wPiBzdWJqZWN0SG9sZGVyLCAKLQkJCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua09wdGlvbnMyXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL1F1ZXJ5Q29uZmlndXJhdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL29wdGlvbnMvUXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NGRjN2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL29wdGlvbnMvUXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5PcHRpb25zMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBRdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFF1ZXJ5Q29uZmlndXJhdGlvbkNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8T3B0aW9uczJfMD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlF1ZXJ5Q29uZmlndXJhdGlvbkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBRdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUoCi0JCQkJCVBhbmU8T3B0aW9uczJfMD4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmFkZFF1ZXJ5VGltZW91dENvbWJvKGNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRRdWVyeVRpbWVvdXRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBJbnRlZ2VyQ29tYm88T3B0aW9uczJfMD4odGhpcywgY29udGFpbmVyKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5RdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGVfcXVlcnlUaW1lb3V0TGFiZWw7Ci0JCQl9Ci0JCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKLQkJCQlyZXR1cm4gbnVsbDsJCS8vIFRPRE8KLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zMl8wLCBJbnRlZ2VyPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRRdWVyeVRpbWVvdXQoKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9uczJfMCwgSW50ZWdlcj4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMyXzAuUVVFUllfVElNRU9VVF9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFF1ZXJ5VGltZW91dCgpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJCQl0aGlzLnN1YmplY3Quc2V0UXVlcnlUaW1lb3V0KHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL1ZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9WYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzg0N2M0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL1ZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk9wdGlvbnMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5KcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NTZXJ2aWNlOwotCi0vKioKLSAqICBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGUgZXh0ZW5kcyBQYW5lPE9wdGlvbnMyXzA+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WYWxpZGF0aW9uR3JvdXBDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGUoCi0JCQkJCVBhbmU8T3B0aW9uczJfMD4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCS8vIFZhbGlkYXRpb25Nb2RlCi0JCW5ldyBWYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZSh0aGlzLCB0aGlzLmJ1aWxkUGVyc2lzdGVuY2VVbml0Ml8wSG9sZGVyKCksIHBhcmVudCk7Ci0KLQkJLy8gVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdAotCQl0aGlzLmFkZEdyb3VwUHJlUGVyc2lzdExpc3RQYW5lKHBhcmVudCk7Ci0KLQkJLy8gVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlCi0JCXRoaXMuYWRkR3JvdXBQcmVVcGRhdGVMaXN0UGFuZShwYXJlbnQpOwotCi0JCS8vIFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZQotCQl0aGlzLmFkZEdyb3VwUHJlUmVtb3ZlTGlzdFBhbmUocGFyZW50KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzICoqKioqKioqKioKLQkKLQlwcml2YXRlIHZvaWQgYWRkR3JvdXBQcmVQZXJzaXN0TGlzdFBhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZShwYXJlbnQsIAotCQkJSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLlZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlX2dyb3VwUHJlUGVyc2lzdExhYmVsLAotCQkJdGhpcy5hZGRQcmVQZXJzaXN0TGlzdFBhbmUocGFyZW50KSwKLQkJCW51bGwJLy8gVE9ETyBIZWxwCi0JCQkpOwotCX0KLQkKLQlwcml2YXRlIEFkZFJlbW92ZUxpc3RQYW5lPE9wdGlvbnMyXzA+IGFkZFByZVBlcnNpc3RMaXN0UGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gTGlzdCBwYW5lCi0JCUFkZFJlbW92ZUxpc3RQYW5lPE9wdGlvbnMyXzA+IGxpc3RQYW5lID0gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPE9wdGlvbnMyXzA+KAotCQkJdGhpcywKLQkJCXBhcmVudCwKLQkJCXRoaXMuYnVpbGRQcmVQZXJzaXN0QWRhcHRlcigpLAotCQkJdGhpcy5idWlsZFByZVBlcnNpc3RMaXN0SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVGFibGUoVGFibGUgdGFibGUpIHsKLQkJCQlzdXBlci5pbml0aWFsaXplVGFibGUodGFibGUpOwotCi0JCQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRhYmxlLmdldFBhcmVudCgpOwotCQkJCUdyaWREYXRhIGdyaWREYXRhICA9IChHcmlkRGF0YSkgY29udGFpbmVyLmdldExheW91dERhdGEoKTsKLQkJCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNzU7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsaXN0UGFuZTsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRQcmVQZXJzaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlhZGRQcmVQZXJzaXN0Q2xhc3MobGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJZm9yIChPYmplY3QgaXRlbSA6IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpKSB7Ci0JCQkJCWdldFN1YmplY3QoKS5yZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KChTdHJpbmcpIGl0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQcmVQZXJzaXN0TGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxPcHRpb25zMl8wLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFByZVBlcnNpc3RDbGFzcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0KLQkJSVR5cGUgdHlwZSA9IHRoaXMuY2hvb3NlVHlwZSgpOwotCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnJCcpOwotCQkJaWYoICEgdGhpcy5nZXRTdWJqZWN0KCkudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdEV4aXN0cyhjbGFzc05hbWUpKSB7Ci0JCQkJCi0JCQkJU3RyaW5nIGNsYXNzUmVmID0gdGhpcy5nZXRTdWJqZWN0KCkuYWRkVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdChjbGFzc05hbWUpOwotCQkJCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKGNsYXNzUmVmKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSB2b2lkIGFkZEdyb3VwUHJlVXBkYXRlTGlzdFBhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZShwYXJlbnQsIAotCQkJSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLlZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlX2dyb3VwUHJlVXBkYXRlTGFiZWwsCi0JCQl0aGlzLmFkZFByZVVwZGF0ZUxpc3RQYW5lKHBhcmVudCksCi0JCQludWxsCS8vIFRPRE8gSGVscAotCQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZTxPcHRpb25zMl8wPiBhZGRQcmVVcGRhdGVMaXN0UGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gTGlzdCBwYW5lCi0JCUFkZFJlbW92ZUxpc3RQYW5lPE9wdGlvbnMyXzA+IGxpc3RQYW5lID0gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPE9wdGlvbnMyXzA+KAotCQkJdGhpcywKLQkJCXBhcmVudCwKLQkJCXRoaXMuYnVpbGRQcmVVcGRhdGVBZGFwdGVyKCksCi0JCQl0aGlzLmJ1aWxkUHJlVXBkYXRlTGlzdEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJdGhpcy5idWlsZExhYmVsUHJvdmlkZXIoKQotCQkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVRhYmxlKFRhYmxlIHRhYmxlKSB7Ci0JCQkJc3VwZXIuaW5pdGlhbGl6ZVRhYmxlKHRhYmxlKTsKLQotCQkJCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0YWJsZS5nZXRQYXJlbnQoKTsKLQkJCQlHcmlkRGF0YSBncmlkRGF0YSAgPSAoR3JpZERhdGEpIGNvbnRhaW5lci5nZXRMYXlvdXREYXRhKCk7Ci0JCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDc1OwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGlzdFBhbmU7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkUHJlVXBkYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlhZGRQcmVVcGRhdGVDbGFzcyhsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJZ2V0U3ViamVjdCgpLnJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSgoU3RyaW5nKSBpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUHJlVXBkYXRlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxPcHRpb25zMl8wLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFByZVVwZGF0ZUNsYXNzKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQlJVHlwZSB0eXBlID0gdGhpcy5jaG9vc2VUeXBlKCk7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCckJyk7Ci0JCQlpZiggISB0aGlzLmdldFN1YmplY3QoKS52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVFeGlzdHMoY2xhc3NOYW1lKSkgewotCQkJCQotCQkJCVN0cmluZyBjbGFzc1JlZiA9IHRoaXMuZ2V0U3ViamVjdCgpLmFkZFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZShjbGFzc05hbWUpOwotCQkJCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKGNsYXNzUmVmKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSB2b2lkIGFkZEdyb3VwUHJlUmVtb3ZlTGlzdFBhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZShwYXJlbnQsIAotCQkJSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLlZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlX2dyb3VwUHJlUmVtb3ZlTGFiZWwsCi0JCQl0aGlzLmFkZFByZVJlbW92ZUxpc3RQYW5lKHBhcmVudCksCi0JCQludWxsCS8vIFRPRE8gSGVscAotCQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZTxPcHRpb25zMl8wPiBhZGRQcmVSZW1vdmVMaXN0UGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gTGlzdCBwYW5lCi0JCUFkZFJlbW92ZUxpc3RQYW5lPE9wdGlvbnMyXzA+IGxpc3RQYW5lID0gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPE9wdGlvbnMyXzA+KAotCQkJdGhpcywKLQkJCXBhcmVudCwKLQkJCXRoaXMuYnVpbGRQcmVSZW1vdmVBZGFwdGVyKCksCi0JCQl0aGlzLmJ1aWxkUHJlUmVtb3ZlTGlzdEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJdGhpcy5idWlsZExhYmVsUHJvdmlkZXIoKQotCQkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVRhYmxlKFRhYmxlIHRhYmxlKSB7Ci0JCQkJc3VwZXIuaW5pdGlhbGl6ZVRhYmxlKHRhYmxlKTsKLQotCQkJCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0YWJsZS5nZXRQYXJlbnQoKTsKLQkJCQlHcmlkRGF0YSBncmlkRGF0YSAgPSAoR3JpZERhdGEpIGNvbnRhaW5lci5nZXRMYXlvdXREYXRhKCk7Ci0JCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDc1OwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGlzdFBhbmU7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkUHJlUmVtb3ZlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlhZGRQcmVSZW1vdmVDbGFzcyhsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJZ2V0U3ViamVjdCgpLnJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSgoU3RyaW5nKSBpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUHJlUmVtb3ZlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxPcHRpb25zMl8wLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFByZVJlbW92ZUNsYXNzKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQlJVHlwZSB0eXBlID0gdGhpcy5jaG9vc2VUeXBlKCk7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCckJyk7Ci0JCQlpZiggISB0aGlzLmdldFN1YmplY3QoKS52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVFeGlzdHMoY2xhc3NOYW1lKSkgewotCQkJCQotCQkJCVN0cmluZyBjbGFzc1JlZiA9IHRoaXMuZ2V0U3ViamVjdCgpLmFkZFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZShjbGFzc05hbWUpOwotCQkJCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKGNsYXNzUmVmKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcml2YXRlIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGVsZW1lbnQ7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX25vTmFtZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUHJvbXB0cyB0aGUgdXNlciB0aGUgT3BlbiBUeXBlIGRpYWxvZy4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIHRoZSBzZWxlY3RlZCB0eXBlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB1c2VyCi0JICogY2FuY2VsZWQgdGhlIGRpYWxvZwotCSAqLwotCXByaXZhdGUgSVR5cGUgY2hvb3NlVHlwZSgpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtdIHsgamF2YVByb2plY3QgfTsKLQkJSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotCQlJUHJvZ3Jlc3NTZXJ2aWNlIHNlcnZpY2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpOwotCQlTZWxlY3Rpb25EaWFsb2cgdHlwZVNlbGVjdGlvbkRpYWxvZzsKLQotCQl0cnkgewotCQkJdHlwZVNlbGVjdGlvbkRpYWxvZyA9IEphdmFVSS5jcmVhdGVUeXBlRGlhbG9nKAotCQkJCWdldFNoZWxsKCksCi0JCQkJc2VydmljZSwKLQkJCQlzY29wZSwKLQkJCQlJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFUywKLQkJCQlmYWxzZSwKLQkJCQkiIgotCQkJKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4ubG9nKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldFRpdGxlKEpwdENvbW1vblVpTWVzc2FnZXMuQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dUaXRsZSk7Ci0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0TWVzc2FnZShKcHRDb21tb25VaU1lc3NhZ2VzLkNsYXNzQ2hvb3NlclBhbmVfZGlhbG9nTWVzc2FnZSk7Ci0KLQkJaWYgKHR5cGVTZWxlY3Rpb25EaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJcmV0dXJuIChJVHlwZSkgdHlwZVNlbGVjdGlvbkRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdDJfMD4gYnVpbGRQZXJzaXN0ZW5jZVVuaXQyXzBIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9uczJfMCwgUGVyc2lzdGVuY2VVbml0Ml8wPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0Ml8wIHRyYW5zZm9ybV8oT3B0aW9uczJfMCB2YWx1ZSkgewotCQkJCXJldHVybiAoUGVyc2lzdGVuY2VVbml0Ml8wKSB2YWx1ZS5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL29wdGlvbnMvVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL1ZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NjIzYmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL29wdGlvbnMvVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuVmFsaWRhdGlvbk1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8UGVyc2lzdGVuY2VVbml0Ml8wPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VmFsaWRhdGlvbk1vZGVDb21wb3NpdGU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlKAotCQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdDJfMD4gc3ViamVjdEhvbGRlciwKLQkJICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQkJfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCXBhcmVudCwKLQkJCQlKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuVmFsaWRhdGlvbk1vZGVDb21wb3NpdGVfdmFsaWRhdGlvbk1vZGVMYWJlbCwKLQkJCQl0aGlzLmFkZFZhbGlkYXRpb25Nb2RlQ29tYm8ocGFyZW50KSwKLQkJCQludWxsCQkJLy8gVE9ETwotCQkpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxQZXJzaXN0ZW5jZVVuaXQyXzAsIFZhbGlkYXRpb25Nb2RlPiBhZGRWYWxpZGF0aW9uTW9kZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxQZXJzaXN0ZW5jZVVuaXQyXzAsIFZhbGlkYXRpb25Nb2RlPih0aGlzLCB0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgcGFyZW50KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbmNlVW5pdDJfMC5TUEVDSUZJRURfVkFMSURBVElPTl9NT0RFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVmFsaWRhdGlvbk1vZGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBWYWxpZGF0aW9uTW9kZS52YWx1ZXMoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBzb3J0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFZhbGlkYXRpb25Nb2RlIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFZhbGlkYXRpb25Nb2RlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKFZhbGlkYXRpb25Nb2RlIHZhbHVlKSB7Ci0JCQkJc3dpdGNoICh2YWx1ZSkgewotCQkJCQljYXNlIEFVVE8gOgotCQkJCQkJcmV0dXJuIEpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5WYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZV9hdXRvOwotCQkJCQljYXNlIENBTExCQUNLIDoKLQkJCQkJCXJldHVybiBKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuVmFsaWRhdGlvbk1vZGVDb21wb3NpdGVfY2FsbGJhY2s7Ci0JCQkJCWNhc2UgTk9ORSA6Ci0JCQkJCQlyZXR1cm4gSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLlZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlX25vbmU7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVmFsaWRhdGlvbk1vZGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFZhbGlkYXRpb25Nb2RlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoVmFsaWRhdGlvbk1vZGUgdmFsdWUpIHsKLQkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93ZWF2ZS9FY2xpcHNlbGlua1ByZWZlcmVuY2VQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dlYXZlL0VjbGlwc2VsaW5rUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0MTA5ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dlYXZlL0VjbGlwc2VsaW5rUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53ZWF2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmJ1aWxkZXIuRWNsaXBzZUxpbmtTdGF0aWNXZWF2aW5nQnVpbGRlckNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Mb2dnaW5nTGV2ZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZWxpbmtQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7Ci0KLQlwcml2YXRlIEVjbGlwc2VMaW5rU3RhdGljV2VhdmluZ0J1aWxkZXJDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCXByaXZhdGUgU3RhdGljV2VhdmluZ0NvbXBvc2l0ZSBzdGF0aWNXZWF2aW5nQ29tcG9zaXRlOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgRWNsaXBzZWxpbmtQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0RGVzY3JpcHRpb24oRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkVjbGlwc2VsaW5rUHJlZmVyZW5jZVBhZ2VfZGVzY3JpcHRpb24pOwotCX0KLQkKLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXN1cGVyLnBlcmZvcm1PaygpOwotCi0JCWlmKHRoaXMuc3RhdGljV2VhdmVDbGFzc2VzKCkpIHsKLQkJCWlmKCAhIHRoaXMucHJvamVjdEhhc1N0YXRpY1dlYXZpbmdCdWlsZGVyKCkpIHsKLQkJCQl0aGlzLmNvbmZpZ3VyYXRvci5hZGRCdWlsZGVyKCk7Ci0JCQl9Ci0JCQl0aGlzLnVwZGF0ZVByb2plY3RTdGF0aWNXZWF2aW5nUHJlZmVyZW5jZXMoKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuY29uZmlndXJhdG9yLnJlbW92ZUJ1aWxkZXIoKTsKLQkJCXRoaXMucmVtb3ZlUHJvamVjdFN0YXRpY1dlYXZpbmdQcmVmZXJlbmNlcygpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5jb25maWd1cmF0b3IgPSBuZXcgRWNsaXBzZUxpbmtTdGF0aWNXZWF2aW5nQnVpbGRlckNvbmZpZ3VyYXRvcih0aGlzLmdldFByb2plY3QoKSk7Ci0JCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCi0JCXRoaXMubm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLQkJdGhpcy5zdGF0aWNXZWF2aW5nQ29tcG9zaXRlID0gbmV3IFN0YXRpY1dlYXZpbmdDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCS8vICoqKioqKioqKiogcHJlZmVyZW5jZXMgKioqKioqKioqKgotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVQcm9qZWN0U3RhdGljV2VhdmluZ1ByZWZlcmVuY2VzKCkgewotCQlTdHJpbmcgbG9jYXRpb24gPSBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZ2V0U291cmNlRm9sZGVyKCkpID8gdGhpcy5nZXREZWZhdWx0U291cmNlKCkgOiB0aGlzLmdldFNvdXJjZUZvbGRlcigpOwotCQl0aGlzLmNvbmZpZ3VyYXRvci5zZXRTb3VyY2VMb2NhdGlvblByZWZlcmVuY2UobG9jYXRpb24pOwotCQlsb2NhdGlvbiA9IFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5nZXRUYXJnZXRGb2xkZXIoKSkgPyB0aGlzLmdldERlZmF1bHRUYXJnZXQoKSA6IHRoaXMuZ2V0VGFyZ2V0Rm9sZGVyKCk7Ci0JCXRoaXMuY29uZmlndXJhdG9yLnNldFRhcmdldExvY2F0aW9uUHJlZmVyZW5jZShsb2NhdGlvbik7Ci0JCWxvY2F0aW9uID0gU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmdldFBlcnNpc3RlbmNlSW5mbygpKSA/IHRoaXMuZ2V0RGVmYXVsdFBlcnNpc3RlbmNlSW5mbygpIDogdGhpcy5nZXRQZXJzaXN0ZW5jZUluZm8oKTsKLQkJdGhpcy5jb25maWd1cmF0b3Iuc2V0UGVyc2lzdGVuY2VJbmZvUHJlZmVyZW5jZShsb2NhdGlvbik7Ci0JCXRoaXMuY29uZmlndXJhdG9yLnNldExvZ0xldmVsUHJlZmVyZW5jZSh0aGlzLmdldExvZ0xldmVsKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVQcm9qZWN0U3RhdGljV2VhdmluZ1ByZWZlcmVuY2VzKCkgewotCi0JCXRoaXMuY29uZmlndXJhdG9yLnJlbW92ZVNvdXJjZUxvY2F0aW9uUHJlZmVyZW5jZSgpOwotCQl0aGlzLmNvbmZpZ3VyYXRvci5yZW1vdmVUYXJnZXRMb2NhdGlvblByZWZlcmVuY2UoKTsKLQkJdGhpcy5jb25maWd1cmF0b3IucmVtb3ZlTG9nTGV2ZWxQcmVmZXJlbmNlKCk7Ci0JCXRoaXMuY29uZmlndXJhdG9yLnJlbW92ZVBlcnNpc3RlbmNlSW5mb1ByZWZlcmVuY2UoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCQotCXByaXZhdGUgYm9vbGVhbiBwcm9qZWN0SGFzU3RhdGljV2VhdmluZ0J1aWxkZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbmZpZ3VyYXRvci5wcm9qZWN0SGFzU3RhdGljV2VhdmluZ0J1aWxkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0gICAgICAgIElBZGFwdGFibGUgYWRhcHRhYmxlPSB0aGlzLmdldEVsZW1lbnQoKTsKLQkJcmV0dXJuIGFkYXB0YWJsZSA9PSBudWxsID8gbnVsbCA6IChJUHJvamVjdClhZGFwdGFibGUuZ2V0QWRhcHRlcihJUHJvamVjdC5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgbWFrZVJlbGF0aXZlVG9Qcm9qZWN0UGF0aChTdHJpbmcgZmlsZVBhdGgpIHsKLQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoZmlsZVBhdGgpOwotCQlJUGF0aCByZWxhdGl2ZVBhdGggPSBwYXRoLm1ha2VSZWxhdGl2ZVRvKHRoaXMuZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCkpOwotCQlyZXR1cm4gcmVsYXRpdmVQYXRoLnRvT1NTdHJpbmcoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldHRlcnMgKioqKioqKioqCi0JCi0JcHJpdmF0ZSBib29sZWFuIHN0YXRpY1dlYXZlQ2xhc3NlcygpIHsKLQkJcmV0dXJuIHRoaXMuc3RhdGljV2VhdmluZ0NvbXBvc2l0ZS5nZXRTdGF0aWNXZWF2ZUNoZWNrQm94VmFsdWUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U291cmNlRm9sZGVyKCkgewotCQlyZXR1cm4gdGhpcy5zdGF0aWNXZWF2aW5nQ29tcG9zaXRlLmdldFNvdXJjZUZvbGRlcigpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRUYXJnZXRGb2xkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnN0YXRpY1dlYXZpbmdDb21wb3NpdGUuZ2V0VGFyZ2V0Rm9sZGVyKCk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFBlcnNpc3RlbmNlSW5mbygpIHsKLQkJcmV0dXJuIHRoaXMuc3RhdGljV2VhdmluZ0NvbXBvc2l0ZS5nZXRQZXJzaXN0ZW5jZUluZm9Gb2xkZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TG9nTGV2ZWwoKSB7Ci0JCXJldHVybiB0aGlzLnN0YXRpY1dlYXZpbmdDb21wb3NpdGUuZ2V0TG9nTGV2ZWwoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKgotCQotCXByaXZhdGUgU3RyaW5nIGdldFNvdXJjZVByZWZlcmVuY2UoKSB7Ci0JCXJldHVybiB0aGlzLmNvbmZpZ3VyYXRvci5nZXRTb3VyY2VMb2NhdGlvblByZWZlcmVuY2UoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0UHJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29uZmlndXJhdG9yLmdldFRhcmdldExvY2F0aW9uUHJlZmVyZW5jZSgpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRQZXJzaXN0ZW5jZUluZm9QcmVmZXJlbmNlKCkgewotCQlyZXR1cm4gdGhpcy5jb25maWd1cmF0b3IuZ2V0UGVyc2lzdGVuY2VJbmZvUHJlZmVyZW5jZSgpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldExvZ0xldmVsUHJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29uZmlndXJhdG9yLmdldExvZ0xldmVsUHJlZmVyZW5jZSgpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRTb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmNvbmZpZ3VyYXRvci5nZXREZWZhdWx0U291cmNlTG9jYXRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0VGFyZ2V0KCkgewotCQlyZXR1cm4gdGhpcy5jb25maWd1cmF0b3IuZ2V0RGVmYXVsdFRhcmdldExvY2F0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFBlcnNpc3RlbmNlSW5mbygpIHsKLQkJcmV0dXJuIHRoaXMuY29uZmlndXJhdG9yLmdldERlZmF1bHRQZXJzaXN0ZW5jZUluZm8oKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0TG9nTGV2ZWwoKSB7Ci0JCXJldHVybiB0aGlzLmNvbmZpZ3VyYXRvci5nZXREZWZhdWx0TG9nTGV2ZWwoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBTdGF0aWNXZWF2aW5nQ29tcG9zaXRlICoqKioqKioqKioKLQotCWNsYXNzIFN0YXRpY1dlYXZpbmdDb21wb3NpdGUgewotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBzdGF0aWNXZWF2ZUNsYXNzZXNDaGVja0JveDsKLQkJcHJpdmF0ZSBmaW5hbCBMYWJlbCBzb3VyY2VMYWJlbDsKLQkJcHJpdmF0ZSBmaW5hbCBUZXh0IHNvdXJjZUZvbGRlclRleHQ7Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIGJyb3dzZVNvdXJjZUJ1dHRvbjsKLQkJcHJpdmF0ZSBmaW5hbCBMYWJlbCB0YXJnZXRMYWJlbDsKLQkJcHJpdmF0ZSBmaW5hbCBUZXh0IHRhcmdldEZvbGRlclRleHQ7Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIGJyb3dzZVRhcmdldEJ1dHRvbjsKLQkJcHJpdmF0ZSBmaW5hbCBMYWJlbCBwZXJzaXN0ZW5jZUluZm9MYWJlbDsKLQkJcHJpdmF0ZSBmaW5hbCBUZXh0IHBlcnNpc3RlbmNlSW5mb1RleHQ7Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIGJyb3dzZVBlcnNpc3RlbmNlSW5mb0J1dHRvbjsKLQotCQlwcml2YXRlIGZpbmFsIExhYmVsIGxvZ0xldmVsTGFiZWw7Ci0JCXByaXZhdGUgZmluYWwgQ29tYm8gbG9nTGV2ZWxDb21ib0JveDsKLQkJcHJpdmF0ZSBTdHJpbmcgbG9nTGV2ZWw7Ci0KLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkJcHJpdmF0ZSBTdGF0aWNXZWF2aW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQlHcm91cCB3ZWF2aW5nR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmc9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscygwKTsKLQkJCXdlYXZpbmdHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCXdlYXZpbmdHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCXdlYXZpbmdHcm91cC5zZXRUZXh0KEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlbGlua1ByZWZlcmVuY2VQYWdlX3N0YXRpY1dlYXZpbmdHcm91cEJveCk7Ci0JCQkKLQkJCS8vIGNoZWNrYm94Ci0JCQl0aGlzLnN0YXRpY1dlYXZlQ2xhc3Nlc0NoZWNrQm94ID0gdGhpcy5idWlsZFN0YXRpY1dlYXZlQ2hlY2tCb3god2VhdmluZ0dyb3VwLCAKLQkJCQkJCQkJCQkJCQkJCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkVjbGlwc2VsaW5rUHJlZmVyZW5jZVBhZ2Vfd2VhdmVDbGFzc2VzT25CdWlsZExhYmVsLCAKLQkJCQkJCQkJCQkJCQkJCQkJdGhpcy5idWlsZFN0YXRpY1dlYXZlQ2hlY2tCb3hMaXN0ZW5lcigpLCAzKTsKLQkJCS8vIHNvdXJjZQotCQkJdGhpcy5zb3VyY2VMYWJlbCA9IHRoaXMuYnVpbGRMYWJlbCh3ZWF2aW5nR3JvdXAsIDEsIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlbGlua1ByZWZlcmVuY2VQYWdlX3NvdXJjZUxhYmVsKTsKLQkJCXRoaXMuc291cmNlRm9sZGVyVGV4dCA9IHRoaXMuYnVpbGRUZXh0KHdlYXZpbmdHcm91cCwgMSk7Ci0JCQl0aGlzLmJyb3dzZVNvdXJjZUJ1dHRvbiA9IHRoaXMuYnVpbGRCcm93c2VCdXR0b24od2VhdmluZ0dyb3VwLAotCQkJCQkJCQkJdGhpcy5idWlsZEJyb3dzZVNvdXJjZUJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCQkJCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlbGlua1ByZWZlcmVuY2VQYWdlX3NlbGVjdFNvdXJjZUxhYmVsLCAKLQkJCQkJCQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuRWNsaXBzZWxpbmtQcmVmZXJlbmNlUGFnZV9zb3VyY2VGb2xkZXJTZWxlY3Rpb25MYWJlbCkpOwkKLQkJCS8vIHRhcmdldAotCQkJdGhpcy50YXJnZXRMYWJlbCA9IHRoaXMuYnVpbGRMYWJlbCh3ZWF2aW5nR3JvdXAsIDEsIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlbGlua1ByZWZlcmVuY2VQYWdlX3RhcmdldExhYmVsKTsKLQkJCXRoaXMudGFyZ2V0Rm9sZGVyVGV4dCA9IHRoaXMuYnVpbGRUZXh0KHdlYXZpbmdHcm91cCwgMSk7Ci0JCQl0aGlzLmJyb3dzZVRhcmdldEJ1dHRvbiA9IHRoaXMuYnVpbGRCcm93c2VCdXR0b24od2VhdmluZ0dyb3VwLAotCQkJCQkJCQkJdGhpcy5idWlsZEJyb3dzZVRhcmdldEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCQkJCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlbGlua1ByZWZlcmVuY2VQYWdlX3NlbGVjdFRhcmdldExhYmVsLCAKLQkJCQkJCQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuRWNsaXBzZWxpbmtQcmVmZXJlbmNlUGFnZV90YXJnZXRGb2xkZXJTZWxlY3Rpb25MYWJlbCkpOwotCQkJLy8gbG9nIGxldmVsIGNvbWJvLWJveAotCQkJdGhpcy5sb2dMZXZlbExhYmVsID0gdGhpcy5idWlsZExhYmVsKHdlYXZpbmdHcm91cCwgMSwgRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkVjbGlwc2VsaW5rUHJlZmVyZW5jZVBhZ2VfbG9nTGV2ZWxMYWJlbCk7Ci0JCQl0aGlzLmxvZ0xldmVsQ29tYm9Cb3ggPSB0aGlzLmJ1aWxkTG9nTGV2ZWxDb21ib0JveCh3ZWF2aW5nR3JvdXAsIDEpOwotCQkJdGhpcy5idWlsZEZpbGxlcih3ZWF2aW5nR3JvdXApOwotCQkJLy8gcGVyc2lzdGVuY2VJbmZvCi0JCQl0aGlzLnBlcnNpc3RlbmNlSW5mb0xhYmVsID0gdGhpcy5idWlsZExhYmVsKHdlYXZpbmdHcm91cCwgMSwgRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkVjbGlwc2VsaW5rUHJlZmVyZW5jZVBhZ2VfcGVyc2lzdGVuY2VJbmZvTGFiZWwpOwotCQkJdGhpcy5wZXJzaXN0ZW5jZUluZm9UZXh0ID0gdGhpcy5idWlsZFRleHQod2VhdmluZ0dyb3VwLCAxKTsKLQkJCXRoaXMuYnJvd3NlUGVyc2lzdGVuY2VJbmZvQnV0dG9uID0gdGhpcy5idWlsZEJyb3dzZUJ1dHRvbih3ZWF2aW5nR3JvdXAsCi0JCQkJCQkJCQl0aGlzLmJ1aWxkQnJvd3NlUGVyc2lzdGVuY2VJbmZvQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQkJCQkJCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkVjbGlwc2VsaW5rUHJlZmVyZW5jZVBhZ2Vfc2VsZWN0UGVyc2lzdGVuY2VJbmZvTGFiZWwsIAotCQkJCQkJCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlbGlua1ByZWZlcmVuY2VQYWdlX3BlcnNpc3RlbmNlSW5mb0ZvbGRlclNlbGVjdGlvbkxhYmVsKSk7Ci0KLQkJCS8vIGluaXRpYWxpemUgc3RhdGljV2VhdmUgY2hlY2tib3gKLQkJCXRoaXMuc3RhdGljV2VhdmVDbGFzc2VzQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHByb2plY3RIYXNTdGF0aWNXZWF2aW5nQnVpbGRlcigpKTsKLQotCQkJdGhpcy5zdGF0aWNXZWF2ZUNoZWNrQm94Q2hhbmdlZCgpOwotCQl9Ci0JCQotCQkvLyAqKioqKioqKioqIGxpc3RlbmVycyAqKioqKioqKioqCi0JCQotCQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkU3RhdGljV2VhdmVDaGVja0JveExpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJdGhpcy53aWRnZXRTZWxlY3RlZChldmVudCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXN0YXRpY1dlYXZlQ2hlY2tCb3hDaGFuZ2VkKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzdGF0aWNXZWF2ZUNoZWNrQm94Q2hhbmdlZCgpIHsKLQkJCWJvb2xlYW4gZW5hYmxlZCA9IHRoaXMuZ2V0U3RhdGljV2VhdmVDaGVja0JveFZhbHVlKCk7Ci0KLQkJCXRoaXMuc2V0U291cmNlRW5hYmxlZChlbmFibGVkKTsKLQkJCXRoaXMuc2V0VGFyZ2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCXRoaXMuc2V0UGVyc2lzdGVuY2VJbmZvRW5hYmxlZChlbmFibGVkKTsKLQkJCXRoaXMuc2V0TG9nTGV2ZWxFbmFibGVkKGVuYWJsZWQpOwotCQkJCi0JCQlpZih0aGlzLmdldFN0YXRpY1dlYXZlQ2hlY2tCb3hWYWx1ZSgpKSB7Ci0JCQkJdGhpcy5pbml0aWFsaXplRnJvbVByZWZlcmVuY2VzKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmNsZWFyQWxsKCk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkTG9nTGV2ZWxDb21ib0JveFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJLy8gbm90aGluZyBzcGVjaWFsIGZvciAiZGVmYXVsdCIgKGRvdWJsZS1jbGljaz8pCi0JCQkJCXRoaXMud2lkZ2V0U2VsZWN0ZWQoZXZlbnQpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlTdGF0aWNXZWF2aW5nQ29tcG9zaXRlLnRoaXMuc2VsZWN0ZWRMb2dMZXZlbENoYW5nZWQoKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQkJcmV0dXJuICJFY2xpcHNlbGlua1ByZWZlcmVuY2VQYWdlIGxvZ0xldmVsIGNvbWJvLWJveCBzZWxlY3Rpb24gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzZWxlY3RlZExvZ0xldmVsQ2hhbmdlZCgpIHsKLQkJCXRoaXMubG9nTGV2ZWwgPSB0aGlzLmxvZ0xldmVsQ29tYm9Cb3guZ2V0VGV4dCgpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBVSSBjb250cm9scyAqKioqKioqKioqCi0KLQkJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMoKSB7Ci0JCQkvLyBzb3VyY2UKLQkJCXRoaXMuc291cmNlRm9sZGVyVGV4dC5zZXRUZXh0KGdldFNvdXJjZVByZWZlcmVuY2UoKSk7Ci0JCQkvLyB0YXJnZXQKLQkJCXRoaXMudGFyZ2V0Rm9sZGVyVGV4dC5zZXRUZXh0KGdldFRhcmdldFByZWZlcmVuY2UoKSk7Ci0JCQkvLyBwZXJzaXN0ZW5jZUluZm8KLQkJCVN0cmluZyBwZXJzaXN0ZW5jZUluZm8gPSAoZ2V0UGVyc2lzdGVuY2VJbmZvUHJlZmVyZW5jZSgpICE9IG51bGwpID8gZ2V0UGVyc2lzdGVuY2VJbmZvUHJlZmVyZW5jZSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMucGVyc2lzdGVuY2VJbmZvVGV4dC5zZXRUZXh0KHBlcnNpc3RlbmNlSW5mbyk7Ci0JCQkvLyBsb2cgbGV2ZWwKLQkJCXRoaXMubG9nTGV2ZWwgPSBnZXRMb2dMZXZlbFByZWZlcmVuY2UoKTsKLQkJCXRoaXMubG9nTGV2ZWxDb21ib0JveC5zZWxlY3QodGhpcy5sb2dMZXZlbENvbWJvQm94LmluZGV4T2YodGhpcy5sb2dMZXZlbCkpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgY2xlYXJBbGwoKSB7Ci0JCQkvLyBzb3VyY2UKLQkJCXRoaXMuc291cmNlRm9sZGVyVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gdGFyZ2V0Ci0JCQl0aGlzLnRhcmdldEZvbGRlclRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHBlcnNpc3RlbmNlSW5mbwotCQkJdGhpcy5wZXJzaXN0ZW5jZUluZm9UZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBsb2cgbGV2ZWwKLQkJCXRoaXMubG9nTGV2ZWwgPSBnZXREZWZhdWx0TG9nTGV2ZWwoKTsKLQkJCXRoaXMubG9nTGV2ZWxDb21ib0JveC5zZWxlY3QodGhpcy5sb2dMZXZlbENvbWJvQm94LmluZGV4T2YodGhpcy5sb2dMZXZlbCkpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgc2V0U291cmNlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJCXRoaXMuc291cmNlTGFiZWwuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCXRoaXMuc291cmNlRm9sZGVyVGV4dC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJdGhpcy5icm93c2VTb3VyY2VCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIHNldFRhcmdldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCQl0aGlzLnRhcmdldExhYmVsLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQl0aGlzLnRhcmdldEZvbGRlclRleHQuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCXRoaXMuYnJvd3NlVGFyZ2V0QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBzZXRQZXJzaXN0ZW5jZUluZm9FbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQkJdGhpcy5wZXJzaXN0ZW5jZUluZm9MYWJlbC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJdGhpcy5wZXJzaXN0ZW5jZUluZm9UZXh0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQl0aGlzLmJyb3dzZVBlcnNpc3RlbmNlSW5mb0J1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHNldExvZ0xldmVsRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJCXRoaXMubG9nTGV2ZWxMYWJlbC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJdGhpcy5sb2dMZXZlbENvbWJvQm94LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgQnV0dG9uIGJ1aWxkQnJvd3NlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyKSB7Ci0JCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUdyaWRMYXlvdXQgYnV0dG9uTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChidXR0b25MYXlvdXQpOwotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCQkvLyBCcm93c2UgYnV0dG9ucwotCQkJQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCQlicm93c2VCdXR0b24uc2V0VGV4dChFY2xpcHNlTGlua1VpTWVzc2FnZXMuRWNsaXBzZWxpbmtQcmVmZXJlbmNlUGFnZV9icm93c2UpOwotCQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0JCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotCQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJCi0JCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQkJcmV0dXJuIGJyb3dzZUJ1dHRvbjsKLQkJfQotCi0JCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRCcm93c2VTb3VyY2VCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcihmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJCQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQotCQkJCQlTdHJpbmcgZGlyZWN0b3J5ID0gcHJvbXB0Rm9sZGVyKHRpdGxlLCBkZXNjcmlwdGlvbiwgZ2V0U291cmNlRm9sZGVyKCkpOwotCQkJCQlpZiAoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShkaXJlY3RvcnkpKSB7Ci0JCQkJCQlTdGF0aWNXZWF2aW5nQ29tcG9zaXRlLnRoaXMuc291cmNlRm9sZGVyVGV4dC5zZXRUZXh0KG1ha2VSZWxhdGl2ZVRvUHJvamVjdFBhdGgoZGlyZWN0b3J5KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZEJyb3dzZVRhcmdldEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQkJCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCi0JCQkJCVN0cmluZyBkaXJlY3RvcnkgPSBwcm9tcHRGb2xkZXIodGl0bGUsIGRlc2NyaXB0aW9uLCBnZXRUYXJnZXRGb2xkZXIoKSk7Ci0JCQkJCWlmICggISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGRpcmVjdG9yeSkpIHsKLQkJCQkJCVN0YXRpY1dlYXZpbmdDb21wb3NpdGUudGhpcy50YXJnZXRGb2xkZXJUZXh0LnNldFRleHQobWFrZVJlbGF0aXZlVG9Qcm9qZWN0UGF0aChkaXJlY3RvcnkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkQnJvd3NlUGVyc2lzdGVuY2VJbmZvQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0JCQkKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0KLQkJCQkJU3RyaW5nIGRpcmVjdG9yeSA9IHByb21wdEZvbGRlcih0aXRsZSwgZGVzY3JpcHRpb24sIGdldFBlcnNpc3RlbmNlSW5mb0ZvbGRlcigpKTsKLQkJCQkJaWYgKCAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZGlyZWN0b3J5KSkgewotCQkJCQkJU3RhdGljV2VhdmluZ0NvbXBvc2l0ZS50aGlzLnBlcnNpc3RlbmNlSW5mb1RleHQuc2V0VGV4dChtYWtlUmVsYXRpdmVUb1Byb2plY3RQYXRoKGRpcmVjdG9yeSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgQnV0dG9uIGJ1aWxkU3RhdGljV2VhdmVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIsIGludCBob3Jpem9udGFsU3BhbikgewotCQkJQnV0dG9uIHJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJCXJhZGlvQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJcmFkaW9CdXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJCXJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCXJldHVybiByYWRpb0J1dHRvbjsKLQkJfQotCi0JCXByaXZhdGUgVGV4dCBidWlsZFRleHQoQ29tcG9zaXRlIHBhcmVudCwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQkJdGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0KLQkJcHJpdmF0ZSBDb21ibyBidWlsZExvZ0xldmVsQ29tYm9Cb3goQ29tcG9zaXRlIHBhcmVudCwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZSA7Ci0JCQljb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRMb2dMZXZlbENvbWJvQm94U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0KLQkJCXRoaXMucG9wdWxhdGVMb2dMZXZlbENvbWJvQm94KGNvbWJvKTsKLQkJCXJldHVybiBjb21ibzsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGJ1aWxkRmlsbGVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCW5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTG9nTGV2ZWxDb21ib0JveChDb21ibyBjb21ibykgewotCQkJY29tYm8ucmVtb3ZlQWxsKCk7Ci0KLQkJCWZvciAoTG9nZ2luZ0xldmVsIHZhbHVlIDogY29uZmlndXJhdG9yLmdldExvZ0xldmVsVmFsdWVzKCkpIHsKLQkJCQljb21iby5hZGQodmFsdWUuZ2V0UHJvcGVydHlWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSBMYWJlbCBidWlsZExhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzcGFuLCBTdHJpbmcgdGV4dCkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJcmV0dXJuIGxhYmVsOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBnZXR0ZXJzICoqKioqKioqKgotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0U291cmNlRm9sZGVyKCkgewotCQkJcmV0dXJuIHRoaXMuc291cmNlRm9sZGVyVGV4dC5nZXRUZXh0KCk7Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBnZXRUYXJnZXRGb2xkZXIoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXJnZXRGb2xkZXJUZXh0LmdldFRleHQoKTsKLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nIGdldFBlcnNpc3RlbmNlSW5mb0ZvbGRlcigpIHsKLQkJCXJldHVybiB0aGlzLnBlcnNpc3RlbmNlSW5mb1RleHQuZ2V0VGV4dCgpOwotCQl9Ci0JCQotCQlwcml2YXRlIFN0cmluZyBnZXRMb2dMZXZlbCgpIHsKLQkJCXJldHVybiB0aGlzLmxvZ0xldmVsOwotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGdldFN0YXRpY1dlYXZlQ2hlY2tCb3hWYWx1ZSgpIHsKLQkJCXJldHVybiB0aGlzLnN0YXRpY1dlYXZlQ2xhc3Nlc0NoZWNrQm94LmdldFNlbGVjdGlvbigpOwotCQl9Ci0JCQotCQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCQkKLQkJLyoqCi0JCSAqIFRoZSBicm93c2UgYnV0dG9uIHdhcyBjbGlja2VkLCBpdHMgYWN0aW9uIGludm9rZXMgdGhpcyBhY3Rpb24gd2hpY2ggc2hvdWxkCi0JCSAqIHByb21wdCB0aGUgdXNlciB0byBzZWxlY3QgYSBmb2xkZXIgYW5kIHNldCBpdC4KLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIHByb21wdEZvbGRlcihTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbiwgU3RyaW5nIHJlbGF0aXZlTG9jYXRpb24pIHsKLQotCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCQlkaWFsb2cuc2V0VGV4dCh0aXRsZSk7Ci0JCQlkaWFsb2cuc2V0TWVzc2FnZShkZXNjcmlwdGlvbik7Ci0JCQlkaWFsb2cuc2V0RmlsdGVyUGF0aCh0aGlzLmZpbHRlclBhdGgocmVsYXRpdmVMb2NhdGlvbikpOwotCQkJU3RyaW5nIGRpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQlyZXR1cm4gZGlyZWN0b3J5OwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgU3RyaW5nIGZpbHRlclBhdGgoU3RyaW5nIHJlbGF0aXZlTG9jYXRpb24pIHsKLQkJCUlQYXRoIGxvY2F0aW9uID0gZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCk7IAotCQkJaWYoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShyZWxhdGl2ZUxvY2F0aW9uKSkgewotCQkJCWxvY2F0aW9uID0gbG9jYXRpb24uYXBwZW5kKHJlbGF0aXZlTG9jYXRpb24pOwotCQkJfQotCQkJcmV0dXJuIGxvY2F0aW9uLnRvUG9ydGFibGVTdHJpbmcoKTsKLQkJfQotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL0R5bmFtaWNFbnRpdHlDbGFzc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyY2M5OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnZpZXdzdXBwb3J0LklWaWV3UGFydElucHV0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLkpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuamZhY2UuWG1sTWFwcGluZ0ZpbGVWaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLlNlbGVjdE1hcHBpbmdGaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbC5JRW50aXR5RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotCi1wdWJsaWMgY2xhc3MgRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZSBleHRlbmRzIERhdGFNb2RlbFdpemFyZFBhZ2V7Ci0JcHJvdGVjdGVkIFRleHQgcGFja2FnZVRleHQ7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBwYWNrYWdlQnV0dG9uOwotCXByb3RlY3RlZCBMYWJlbCBwYWNrYWdlTGFiZWw7Ci0JcHJvdGVjdGVkIFRleHQgY2xhc3NUZXh0OwotCXByb3RlY3RlZCBMYWJlbCBjbGFzc0xhYmVsOwotCXByb3RlY3RlZCBMYWJlbCBwcm9qZWN0TmFtZUxhYmVsOwotCXByaXZhdGUgQ29tYm8gcHJvamVjdE5hbWVDb21ibzsJCi0JcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWU7Ci0JCi0JcHJpdmF0ZSBUZXh0IGVudGl0eU5hbWVUZXh0OwotCXByaXZhdGUgTGFiZWwgZW50aXR5TmFtZUxhYmVsOwotCXByaXZhdGUgVGV4dCB0YWJsZU5hbWVUZXh0OwotCXByaXZhdGUgQnV0dG9uIHRhYmxlTmFtZUNoZWNrQnV0dG9uOwotCi0JcHJpdmF0ZSBMYWJlbCBvcm1YbWxOYW1lTGFiZWw7Ci0JcHJpdmF0ZSBUZXh0IG9ybVhtbE5hbWVUZXh0OwotCXByaXZhdGUgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQkKLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKi8KLQlwdWJsaWMgRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0RGVzY3JpcHRpb24oRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkR5bmFtaWNFbnRpdHlDbGFzc1dpemFyZFBhZ2VfZGVzYyk7Ci0JCXRoaXMuc2V0VGl0bGUoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkR5bmFtaWNFbnRpdHlDbGFzc1dpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQl0aGlzLnByb2plY3ROYW1lID0gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117SUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCAKLQkJCQlJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSwgCi0JCQkJSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9QQUNLQUdFLAotCQkJCUlOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNMQVNTX05BTUUsCi0JCQkJSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuWE1MX05BTUV9OwotCX0KLQotCQotCXByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIChJUHJvamVjdCkgZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLndpZHRoSGludCA9IDMwMDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJYWRkUHJvamVjdE5hbWVHcm91cChjb21wb3NpdGUpOwotCQlhZGRQYWNrYWdlR3JvdXAoY29tcG9zaXRlKTsKLQkJYWRkQ2xhc3NOYW1lR3JvdXAoY29tcG9zaXRlKTsKLQkJYWRkRW50aXR5TmFtZUdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWFkZEVudGl0eVRhYmxlR3JvdXAoY29tcG9zaXRlKTsKLQkJYWRkTWFwcGluZ1hNTEdyb3VwKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gc2V0IHRoZSBjdXJzb3IgZm9jdXMKLQkJLy8gICAtIHRvIHRoZSAiSmF2YSBwYWNrYWdlIiBpZiBpdCBpcyBlbXB0eQotCQkvLyAgIC0gdG8gdGhlICJDbGFzcyBuYW1lIiAtIG90aGVyd2lzZQotCQlpZiAocGFja2FnZVRleHQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlwYWNrYWdlVGV4dC5zZXRGb2N1cygpOwotCQl9IGVsc2UgewotCQkJY2xhc3NUZXh0LnNldEZvY3VzKCk7Ci0JCX0KLQkJCSAgICAKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuRFlOQU1JQ19FTlRJVFlfQ0xBU1MpOwotCSAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCS8qKgotCSAqIEFkZCBwcm9qZWN0IGdyb3VwIHRvIHRoZSB0b3AgbGV2ZWwgY29tcG9zaXRlCi0JICogVGhpcyBncm91cCBpcyB1c2VkIHRvIHNwZWNpZnkgcHJvamVjdCBmb3IgdGhlIGR5bmFtaWMgZW50aXR5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFByb2plY3ROYW1lR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBzZXQgdXAgcHJvamVjdCBuYW1lIGxhYmVsCi0JCXByb2plY3ROYW1lTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXByb2plY3ROYW1lTGFiZWwuc2V0VGV4dChFY2xpcHNlTGlua1VpTWVzc2FnZXMuRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV9wcm9qZWN0TmFtZUxhYmVsKTsgCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJcHJvamVjdE5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkvLyBzZXQgdXAgcHJvamVjdCBuYW1lIGVudHJ5IGZpZWxkCi0JCXByb2plY3ROYW1lQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlwcm9qZWN0TmFtZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXByb2plY3ROYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lQ29tYm8uZ2V0VGV4dCgpKTsKLQkJCQl2YWxpZGF0ZVByb2plY3RSZXF1aXJlbWVudHMocHJvamVjdCk7Ci0JCQl9Ci0JCX0pOwotCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKHByb2plY3ROYW1lQ29tYm8sIElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgbnVsbCk7Ci0JCWluaXRpYWxpemVQcm9qZWN0TGlzdCgpOwotCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHBhY2thZ2UgZ3JvdXAgdG8gdGhlIHRvcCBsZXZlbCBjb21wb3NpdGUKLQkgKiBUaGlzIGdyb3VwIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGFja2FnZSBmb3IgdGhlIGR5bmFtaWMgZW50aXR5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFBhY2thZ2VHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXBhY2thZ2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJcGFja2FnZUxhYmVsLnNldFRleHQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkR5bmFtaWNFbnRpdHlDbGFzc1dpemFyZFBhZ2VfamF2YVBhY2thZ2VMYWJlbCk7Ci0JCXBhY2thZ2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQlwYWNrYWdlVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlwYWNrYWdlVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KHBhY2thZ2VUZXh0LCBJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX1BBQ0tBR0UsIG51bGwpOwotCQkKLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSBnZXRTZWxlY3RlZFBhY2thZ2VGcmFnbWVudCgpOwotCQlTdHJpbmcgdGFyZ2V0UHJvamVjdCA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSk7IAotCQlpZiAocGFja2FnZUZyYWdtZW50ICE9IG51bGwgJiYgcGFja2FnZUZyYWdtZW50LmV4aXN0cygpICYmIAotCQkJCXBhY2thZ2VGcmFnbWVudC5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHRhcmdldFByb2plY3QpKSB7Ci0JCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdChwYWNrYWdlRnJhZ21lbnQpOwotCQkJbW9kZWwuc2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9QQUNLQUdFLCBwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCX0KLQotCQlwYWNrYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJcGFja2FnZUJ1dHRvbi5zZXRUZXh0KEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmRfYnJvd3NlQnR0b25MYWJlbCk7Ci0JCXBhY2thZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCXBhY2thZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVBhY2thZ2VCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gRG8gbm90aGluZwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIGNsYXNzIG5hbWUgZ3JvdXAgdG8gdGhlIHRvcCBsZXZlbCBjb21wb3NpdGUKLQkgKiBUaGlzIGdyb3VwIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgY2xhc3MgbmFtZSBmb3IgdGhlIGR5bmFtaWMgZW50aXR5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZENsYXNzTmFtZUdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJY2xhc3NMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJY2xhc3NMYWJlbC5zZXRUZXh0KEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EeW5hbWljRW50aXR5Q2xhc3NXaXphcmRQYWdlX2NsYXNzTmFtZUxhYmVsKTsKLQkJY2xhc3NMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQljbGFzc1RleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJY2xhc3NUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQoY2xhc3NUZXh0LCBJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5DTEFTU19OQU1FLCBudWxsKTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGVudGl0eSBuYW1lIGdyb3VwIHRvIHRoZSB0b3AgbGV2ZWwgY29tcG9zaXRlCi0JICogVGhpcyBncm91cCBpcyB1c2VkIHRvIG1hbmFnZSB0aGUgZW50aXR5IG5hbWUgc2V0dGluZ3Mgb2YgdGhlIGR5bmFtaWMgZW50aXR5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEVudGl0eU5hbWVHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWVudGl0eU5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJZW50aXR5TmFtZUxhYmVsLnNldFRleHQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkR5bmFtaWNFbnRpdHlDbGFzc1dpemFyZFBhZ2VfZW50aXR5TmFtZSk7Ci0JCWVudGl0eU5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQllbnRpdHlOYW1lVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQllbnRpdHlOYW1lVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KGVudGl0eU5hbWVUZXh0LCBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTlRJVFlfTkFNRSwgbnVsbCk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogQWRkIGVudGl0eSB0YWJsZSBncm91cCB0byB0aGUgdG9wIGxldmVsIGNvbXBvc2l0ZQotCSAqIFRoaXMgZ3JvdXAgaXMgdXNlZCB0byBtYW5hZ2UgdGhlIHRhYmxlIHNldHRpbmdzIGZvciB0aGUgZHluYW1pYyBlbnRpdHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkRW50aXR5VGFibGVHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAoY29tcG9zaXRlLCBFY2xpcHNlTGlua1VpTWVzc2FnZXMuRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV90YWJsZU5hbWVHcm91cCk7Ci0JCXRhYmxlTmFtZUNoZWNrQnV0dG9uPSBjcmVhdGVUYWJsZU5hbWVDaGVja0J1dHRvbihncm91cCwgRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkR5bmFtaWNFbnRpdHlDbGFzc1dpemFyZFBhZ2VfdXNlRGVmdWx0LCBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5UQUJMRV9OQU1FX0RFRkFVTFQpOwkJCi0JCXRhYmxlTmFtZVRleHQgPSBjcmVhdGVOYW1lR3JvdXAoZ3JvdXAsIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EeW5hbWljRW50aXR5Q2xhc3NXaXphcmRQYWdlX3RhYmxlTmFtZSwgSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuVEFCTEVfTkFNRSk7Ci0JCXRhYmxlTmFtZVRleHQuc2V0RW5hYmxlZCghdGFibGVOYW1lQ2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgbWFwcGluZyBmaWxlIGdyb3VwIHRvIHRoZSB0b3AgbGV2ZWwgY29tcG9zaXRlCi0JICogdGhpcyBncm91cCBpcyB1c2VkIHRvIG1hbmFnZSBlbnRpdHkgbWFwcGluZyByZWdpc3RyYXRpb24KLQkgKiB3aGVyZSB0aGUgZHluYW1pYyBlbnRpdHkgd2lsbCBiZSBjcmVhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE1hcHBpbmdYTUxHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCBFY2xpcHNlTGlua1VpTWVzc2FnZXMuRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV94bWxHcm91cCk7Ci0JCWNyZWF0ZUJyb3dzZUdyb3VwKGdyb3VwLCBFY2xpcHNlTGlua1VpTWVzc2FnZXMuRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV94bWxOYW1lTGFiZWwsIElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlhNTF9OQU1FKTsKLQkJdGhpcy5vcm1YbWxOYW1lVGV4dC5zZXRUZXh0KEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBuYW1lZCBncm91cAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIG1haW4gY29tcG9zaXRlCi0JICogQHBhcmFtIGxhYmVsIHRoZSBuYW1lIG9mIHRoZSBncm91cAotCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcmVsYXRlZCBwcm9wZXJ0eSB0byB3aGljaCB0aGlzIGdyb3VwIHdpbGwgYmUgc3luY2hyb25pemVkCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBncm91cAotCSAqLwotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZU5hbWVHcm91cChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CQotCQlMYWJlbCBuYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCW5hbWVMYWJlbC5zZXRUZXh0KGxhYmVsKTsKLQkJbmFtZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCVRleHQgbmFtZVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJbmFtZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChuYW1lVGV4dCwgcHJvcGVydHksIC8qZGVwZW5kZW50Q29udHJvbHMqL251bGwpOwkJCi0JCXJldHVybiBuYW1lVGV4dDsKLQl9Ci0JCQotCS8qKgotCSAqIENyZWF0ZSBjaGVjayBidXR0b24KLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBtYWluIGNvbXBvc2l0ZSAtIGVudGl0eSB0YWJsZSBncm91cAotCSAqIEBwYXJhbSB0ZXh0IHRoZSBsYWJlbCBvZiB0aGUgYnV0dG9uCi0JICogQHBhcmFtIHByb3BlcnR5IHRoZSByZWxhdGVkIHByb3BlcnR5IHRvIHdoaWNoIHRoaXMgYnV0dG9uIHdpbGwgYmUgc3luY2hyb25pemVkCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBidXR0b24KLQkgKi8JCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlVGFibGVOYW1lQ2hlY2tCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCUdyaWREYXRhIGdyb3VwR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JvdXBHcmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyb3VwR3JpZERhdGEpOwotCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYm9vbGVhbiBpc0NoZWNrZWQgPSBidXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHRhYmxlTmFtZVRleHQgIT0gbnVsbCkgewotCQkJCQl0YWJsZU5hbWVUZXh0LnNldEVuYWJsZWQoIWlzQ2hlY2tlZCk7Ci0JCQkJfQotCQkJfQotCQl9KTsJCQotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGJ1dHRvbiwgcHJvcGVydHksIC8qZGVwZW5kZW50Q29udHJvbHMqLyBudWxsKTsJCQotCQlyZXR1cm4gYnV0dG9uOwotCX0JCQotCQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIG1haW4gY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQgdGhlIG5hbWUvdGl0bGUgb2YgdGhlIGdyb3VwCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBncm91cAotCSAqLwotCXByaXZhdGUgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7CQkKLQkJR3JpZERhdGEgZ3JvdXBHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncm91cEdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShncm91cEdyaWREYXRhKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWdyb3VwLnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBncm91cDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIG1hcHBpbmcgZmlsZSBncm91cAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIG1haW4gY29tcG9zaXRlIC0gbWFwcGluZyBYTUwgZ3JvdXAKLQkgKiBAcGFyYW0gbGFiZWwgdGhlIG5hbWUgb2YgdGhlIGdyb3VwCi0JICogQHBhcmFtIHByb3BlcnR5IHRoZSByZWxhdGVkIHByb3BlcnR5IHRvIHdoaWNoIHRoaXMgZ3JvdXAgd2lsbCBiZSBzeW5jaHJvbml6ZWQKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGdyb3VwCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJyb3dzZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsJCi0KLQkJdGhpcy5vcm1YbWxOYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCXRoaXMub3JtWG1sTmFtZUxhYmVsLnNldFRleHQobGFiZWwpOwotCQl0aGlzLm9ybVhtbE5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCi0JCXRoaXMub3JtWG1sTmFtZVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlNFQVJDSCk7Ci0JCXRoaXMub3JtWG1sTmFtZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJdGhpcy5icm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQl0aGlzLmJyb3dzZUJ1dHRvbi5zZXRUZXh0KEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmRfYnJvd3NlQnR0b25MYWJlbCk7Ci0JCUdyaWREYXRhIGJyb3dzZUJ1dHRvbkRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJYnJvd3NlQnV0dG9uRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCXRoaXMuYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoYnJvd3NlQnV0dG9uRGF0YSk7CQkKLQkJdGhpcy5icm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUNob29zZVhtbEJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0aGlzLnN5bmNoSGVscGVyLnN5bmNoVGV4dCh0aGlzLm9ybVhtbE5hbWVUZXh0LCBwcm9wZXJ0eSwgLypkZXBlbmRlbnRDb250cm9scyovbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFByb2Nlc3MgYnJvd3Npbmcgd2hlbiB0aGUgQnJvd3NlLi4uIGJ1dHRvbiBoYXZlIGJlZW4gcHJlc3NlZC4gCi0JICogQWxsb3cgY2hvb3Npbmcgb2YgRWNsaXBzZUxpbmsgWE1MIGZvciBlbnRpdHkgbWFwcGluZyByZWdpc3RyYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2hvb3NlWG1sQnV0dG9uUHJlc3NlZCgpIHsJCQotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gdGhpcy5nZXRKcGFQcm9qZWN0KHByb2plY3QpOwotCQlpZiAoanBhUHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJVmlld2VyRmlsdGVyIGZpbHRlciA9IGdldERpYWxvZ1ZpZXdlckZpbHRlcihqcGFQcm9qZWN0KTsKLQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpOwotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKTsKLQkJU2VsZWN0TWFwcGluZ0ZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IFNlbGVjdEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVEaWFsb2coZ2V0U2hlbGwoKSwgcHJvamVjdCwgbGFiZWxQcm92aWRlciwgY29udGVudFByb3ZpZGVyKTsKLQkJZGlhbG9nLnNldFRpdGxlKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EeW5hbWljRW50aXR5Q2xhc3NXaXphcmRQYWdlX2Nob29zZVhNTERpYWxvZ190aXRsZSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EeW5hbWljRW50aXR5Q2xhc3NXaXphcmRQYWdlX2Nob29zZVhNTERpYWxvZ19tc2cpOwotCQlkaWFsb2cuYWRkRmlsdGVyKGZpbHRlcik7Ci0JCWRpYWxvZy5zZXRJbnB1dChwcm9qZWN0KTsKLQkJCQotCQlTdHJpbmcgb3JtRmlsZU5hbWUgPSB0aGlzLm9ybVhtbE5hbWVUZXh0LmdldFRleHQoKTsKLQkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSBqcGFQcm9qZWN0LmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UobmV3IFBhdGgob3JtRmlsZU5hbWUpKTsKLQkJSUZpbGUgaW5pdGlhbFNlbGVjdGlvbiA9IChyZXNvdXJjZSAhPSBudWxsKSA/IHJlc291cmNlLmdldEZpbGUoKSA6IG51bGw7Ci0KLQkJaWYgKGluaXRpYWxTZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJZGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb24oaW5pdGlhbFNlbGVjdGlvbik7Ci0JCX0KLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQl0aGlzLm1vZGVsLnNldFByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlhNTF9OQU1FLCBkaWFsb2cuZ2V0Q2hvc2VuTmFtZSgpKTsKLQkJCXRoaXMudmFsaWRhdGVQYWdlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY3JlYXRlIGZpbHRlciBmb3IgdGhlIGJyb3dzZS9hZGQgYWx0ZXJuYXRpdmUgRWNsaXBzZUxpbmsgbWFwcGluZyBYTUwgCi0JICogQHJldHVybiBuZXcgaW5zdGFuY2Ugb2Ygdmlld2VyIGZpbHRlciBmb3IgdGhlIFNlbGVjdEVjbGlwbHNlTGlua01hcHBpbmdGaWxlRGlhbG9nCi0JICovCi0JcHJvdGVjdGVkIFZpZXdlckZpbHRlciBnZXREaWFsb2dWaWV3ZXJGaWx0ZXIoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgWG1sTWFwcGluZ0ZpbGVWaWV3ZXJGaWx0ZXIoanBhUHJvamVjdCwgSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIChKcGFQcm9qZWN0KSBwcm9qZWN0LmdldEFkYXB0ZXIoSnBhUHJvamVjdC5jbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIHByb2plY3QgbGlzdCBpbml0aWFsaXplci4gVGhlIG1ldGhvZCBjaGVja3MgCi0JICogaWYgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGlzIHZhbGlkIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBwcm9qZWN0IGxpc3QuCi0JICogCi0JICogPHA+U3ViY2xhc3NlcyBvZiB0aGlzIHdpemFyZCBwYWdlIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byAKLQkgKiBhZGp1c3QgZmlsdGVyaW5nIG9mIHRoZSBwcm9qZWN0cyB0byB0aGVpciBuZWVkcy4gPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHJlZmVyZW5jZSB0byB0aGUgcHJvamVjdCB0byBiZSBjaGVja2VkCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvamVjdCBpcyBhY2Nlc3NpYmxlIGFuZCBpcyBhbiBFY2xpcHNlTGluayAKLQkgKiBKUEEgcHJvamVjdCB3aXRoIDIuMSBvciBhYm92ZSB2ZXJzaW9uLCA8Y29kZT5mYWxzZTwvY29kZT4gLSBvdGhlcndpc2UuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQcm9qZWN0VmFsaWQoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gKHByb2plY3QuaXNBY2Nlc3NpYmxlKCkgJiYgSnBhRmFjZXQuaXNJbnN0YWxsZWQocHJvamVjdCkgJiYgdGhpcy5nZXRKcGFQbGF0Zm9ybUdyb3VwSWQocHJvamVjdCkuZXF1YWxzKCJlY2xpcHNlbGluayIpCi0JCQkJJiYgdGhpcy5wcm9qZWN0SXNKcGEyXzFDb21wYXRpYmxlKHByb2plY3QpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEpwYVBsYXRmb3JtR3JvdXBJZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUpwYVBsYXRmb3JtRGVzY3JpcHRpb24gZGVzYyA9IChKcGFQbGF0Zm9ybURlc2NyaXB0aW9uKSBwcm9qZWN0LmdldEFkYXB0ZXIoSnBhUGxhdGZvcm1EZXNjcmlwdGlvbi5jbGFzcyk7Ci0JCXJldHVybiBkZXNjLmdldEdyb3VwKCkuZ2V0SWQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHByb2plY3RJc0pwYTJfMUNvbXBhdGlibGUoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLm5vZGVJc0VjbGlwc2VMaW5rVmVyc2lvbkNvbXBhdGlibGUodGhpcy5nZXRKcGFQcm9qZWN0KHByb2plY3QpLCAiMi4xIik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplUHJvamVjdExpc3QoKSB7Ci0JCUlQcm9qZWN0W10gd29ya3NwYWNlUHJvamVjdHMgPSBQcm9qZWN0VXRpbGl0aWVzLmdldEFsbFByb2plY3RzKCk7Ci0JCUxpc3Q8U3RyaW5nPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdvcmtzcGFjZVByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gd29ya3NwYWNlUHJvamVjdHNbaV07Ci0JCQlpZiAoaXNQcm9qZWN0VmFsaWQocHJvamVjdCkpCi0JCQkJaXRlbXMuYWRkKHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJfQotCQlpZiAoaXRlbXMuaXNFbXB0eSgpKSByZXR1cm47Ci0JCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tpdGVtcy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQluYW1lc1tpXSA9IGl0ZW1zLmdldChpKTsKLQkJfQotCQlwcm9qZWN0TmFtZUNvbWJvLnNldEl0ZW1zKG5hbWVzKTsKLQkJSVByb2plY3Qgc2VsZWN0ZWRQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChtb2RlbCAhPW51bGwpIHsKLQkJCQlTdHJpbmcgcHJvamVjdE5hbWVGcm9tTW9kZWwgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSk7Ci0JCQkJaWYgKHByb2plY3ROYW1lRnJvbU1vZGVsIT1udWxsICYmIHByb2plY3ROYW1lRnJvbU1vZGVsLmxlbmd0aCgpPjApCi0JCQkJCXNlbGVjdGVkUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZUZyb21Nb2RlbCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQl0cnkgewotCQkJaWYgKHNlbGVjdGVkUHJvamVjdCA9PSBudWxsKQotCQkJCXNlbGVjdGVkUHJvamVjdCA9IGdldFNlbGVjdGVkUHJvamVjdCgpOwotCQkJaWYgKHNlbGVjdGVkUHJvamVjdCAhPSBudWxsICYmIHNlbGVjdGVkUHJvamVjdC5pc0FjY2Vzc2libGUoKQotCQkJCQkmJiBzZWxlY3RlZFByb2plY3QuaGFzTmF0dXJlKElNb2R1bGVDb25zdGFudHMuTU9EVUxFX05BVFVSRV9JRCkpIHsKLQkJCQlwcm9qZWN0TmFtZUNvbWJvLnNldFRleHQoc2VsZWN0ZWRQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQkJdmFsaWRhdGVQcm9qZWN0UmVxdWlyZW1lbnRzKHNlbGVjdGVkUHJvamVjdCk7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBzZWxlY3RlZFByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy8gSWdub3JlCi0JCX0KLQkJaWYgKHByb2plY3ROYW1lID09IG51bGwgJiYgbmFtZXMubGVuZ3RoID4gMCkKLQkJCXByb2plY3ROYW1lID0gbmFtZXNbMF07Ci0KLQkJaWYgKChwcm9qZWN0TmFtZUNvbWJvLmdldFRleHQoKSA9PSBudWxsIHx8IHByb2plY3ROYW1lQ29tYm8uZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApICYmIHByb2plY3ROYW1lICE9IG51bGwpIHsKLQkJCXByb2plY3ROYW1lQ29tYm8uc2V0VGV4dChwcm9qZWN0TmFtZSk7Ci0JCQl2YWxpZGF0ZVByb2plY3RSZXF1aXJlbWVudHMoUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKSk7Ci0JCQltb2RlbC5zZXRQcm9wZXJ0eShJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb2plY3ROYW1lKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdChJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCkgewotCQlpZiAocGFja2FnZUZyYWdtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAocGFja2FnZUZyYWdtZW50LmdldFBhcmVudCgpIGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkKLQkJCXJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnRSb290KChJUGFja2FnZUZyYWdtZW50KSBwYWNrYWdlRnJhZ21lbnQuZ2V0UGFyZW50KCkpOwotCQllbHNlIGlmIChwYWNrYWdlRnJhZ21lbnQuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkKLQkJCXJldHVybiAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIHBhY2thZ2VGcmFnbWVudC5nZXRQYXJlbnQoKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUHJvY2VzcyBicm93c2luZyB3aGVuIHRoZSBCcm93c2UuLi4gYnV0dG9uIGhhdmUgYmVlbiBwcmVzc2VkLgotCSAqIEFsbG93IGNob29zaW5nIG9mIHBhY2thZ2UgZm9yIHRoZSBkeW5hbWljIGVudGl0eQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVBhY2thZ2VCdXR0b25QcmVzc2VkKCkgewotCQlFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSwgbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigKLQkJCQlKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIuU0hPV19ERUZBVUxUKSk7Ci0JCWRpYWxvZy5zZXRUaXRsZShFY2xpcHNlTGlua1VpTWVzc2FnZXMuRHluYW1pY0VudGl0eUNsYXNzV2l6YXJkUGFnZV9wYWNrYWdlU2VsZWN0aW9uRGlhbG9nX3RpdGxlKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkR5bmFtaWNFbnRpdHlDbGFzc1dpemFyZFBhZ2VfcGFja2FnZVNlbGVjdGlvbkRpYWxvZ19kZXNjKTsKLQkJZGlhbG9nLnNldEVtcHR5TGlzdE1lc3NhZ2UoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkR5bmFtaWNFbnRpdHlDbGFzc1dpemFyZFBhZ2VfcGFja2FnZVNlbGVjdGlvbkRpYWxvZ19tc2cpOwotCQlkaWFsb2cuc2V0RWxlbWVudHModGhpcy5nZXRQYWNrYWdlcygpKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlJUGFja2FnZUZyYWdtZW50IGZyYWdtZW50ID0gKElQYWNrYWdlRnJhZ21lbnQpIGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQkJaWYgKGZyYWdtZW50ICE9IG51bGwpIHsKLQkJCQlwYWNrYWdlVGV4dC5zZXRUZXh0KGZyYWdtZW50LmdldEVsZW1lbnROYW1lKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlwYWNrYWdlVGV4dC5zZXRUZXh0KEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EeW5hbWljRW50aXR5Q2xhc3NXaXphcmRQYWdlX2VtcHR5U3RyaW5nKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBleGlzdGluZyBwYWNrYWdlcyBjcm9zcyB0aGUgc2VsZWN0ZWQgcHJvamVjdAotCSAqIE9ubHkgb25lIG9mIHRoZXNlIHBhY2thZ2VzIHRoYXQgaGF2ZSB0aGUgc2FtZSBuYW1lIHdpbGwgYmUgcmV0dXJuZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUphdmFFbGVtZW50W10gZ2V0UGFja2FnZXMoKSB7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcGFja1Jvb3RzID0gKElQYWNrYWdlRnJhZ21lbnRSb290W10pIG1vZGVsLmdldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkpBVkFfUEFDS0FHRV9GUkFHTUVOVF9ST09UKTsKLQkJaWYgKHBhY2tSb290cy5sZW5ndGggPD0gMCkgcmV0dXJuIG5ldyBJSmF2YUVsZW1lbnRbMF07Ci0JCUlKYXZhRWxlbWVudFtdIHBhY2thZ2VzID0gbmV3IElKYXZhRWxlbWVudFswXTsKLQkJdHJ5IHsKLQkJCUFycmF5TGlzdDxJSmF2YUVsZW1lbnQ+IHBrTGlzdCA9IG5ldyBBcnJheUxpc3Q8SUphdmFFbGVtZW50PigpOwotCQkJZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlUm9vdCA6IHBhY2tSb290cykgewotCQkJCWZvciAoSUphdmFFbGVtZW50IGVsZW1lbnQgOiBwYWNrYWdlUm9vdC5nZXRDaGlsZHJlbigpKSB7Ci0JCQkJCS8vIGVsaW1pbmF0ZSB0aGUgZHVwbGljYXRlIHBhY2thZ2UgbmFtZXMKLQkJCQkJaWYgKCFDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoZ2V0SmF2YUVsZW1lbnROYW1lcyhwa0xpc3QpLCBlbGVtZW50LmdldEVsZW1lbnROYW1lKCkpKSB7Ci0JCQkJCQlwa0xpc3QuYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcGFja2FnZXMgPSBuZXcgSUphdmFFbGVtZW50W3BrTGlzdC5zaXplKCldOwotCQkJcGtMaXN0LnRvQXJyYXkocGFja2FnZXMpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJLy8gRG8gbm90aGluZwotCQl9Ci0JCXJldHVybiBwYWNrYWdlczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIGdpdmVuIGxpc3Qgb2YgZWxlbWVudHMKLQkgKi8KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUVsZW1lbnROYW1lcyhMaXN0PElKYXZhRWxlbWVudD4gZWxlbWVudHMpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPElKYXZhRWxlbWVudCwgU3RyaW5nPihlbGVtZW50cykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCQkJCXJldHVybiBlbGVtZW50LmdldEVsZW1lbnROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgSVByb2plY3QgZ2V0U2VsZWN0ZWRQcm9qZWN0KCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpIAotCQkJcmV0dXJuIG51bGw7Ci0JCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZ2V0SW5pdGlhbEphdmFFbGVtZW50KHNlbGVjdGlvbik7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5nZXRKYXZhUHJvamVjdCgpICE9IG51bGwpCi0JCQlyZXR1cm4gZWxlbWVudC5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3R1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCWlmIChzdHVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkJcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChzdHVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0RXh0ZW5kZWRTZWxlY3RlZFByb2plY3Qoc3R1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJaWYocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvamVjdDsKLQkJfQotCQlpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBUcmVlU2VsZWN0aW9uICYmICgoKFRyZWVTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRQYXRocygpLmxlbmd0aCA+IDApKXsKLQkJCVRyZWVQYXRoIHBhdGggPSAoKChUcmVlU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0UGF0aHMoKVswXSk7Ci0JCQlpZihwYXRoLmdldFNlZ21lbnRDb3VudCgpID4gMCAmJiBwYXRoLmdldFNlZ21lbnQoMCkgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCXJldHVybiAoSVByb2plY3QpIHBhdGguZ2V0U2VnbWVudCgwKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldEV4dGVuZGVkU2VsZWN0ZWRQcm9qZWN0KE9iamVjdCBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IGdldFNlbGVjdGVkUGFja2FnZUZyYWdtZW50KCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGdldEluaXRpYWxKYXZhRWxlbWVudChzZWxlY3Rpb24pOwotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKSB7Ci0JCQkJcmV0dXJuIChJUGFja2FnZUZyYWdtZW50KSBlbGVtZW50OwotCQkJfSBlbHNlIGlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpIHsgCi0JCQkJSUphdmFFbGVtZW50IHBhcmVudCA9ICgoSUNvbXBpbGF0aW9uVW5pdCkgZWxlbWVudCkuZ2V0UGFyZW50KCk7Ci0JCQkJaWYgKHBhcmVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKSB7Ci0JCQkJCXJldHVybiAoSVBhY2thZ2VGcmFnbWVudCkgcGFyZW50OwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7Ci0JCQkJcmV0dXJuICgoSVR5cGUpIGVsZW1lbnQpLmdldFBhY2thZ2VGcmFnbWVudCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRvIGluc3BlY3QgYSBzZWxlY3Rpb24gdG8gZmluZCBhIEphdmEgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBzZWxlY3Rpb24gdG8gYmUgaW5zcGVjdGVkCi0JICogQHJldHVybiBhIEphdmEgZWxlbWVudCB0byBiZSB1c2VkIGFzIHRoZSBpbml0aWFsIHNlbGVjdGlvbiwgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LCBpZiBubyBKYXZhIGVsZW1lbnQgZXhpc3RzIGluIHRoZSBnaXZlbgotCSAqICAgICAgICAgc2VsZWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIElKYXZhRWxlbWVudCBnZXRJbml0aWFsSmF2YUVsZW1lbnQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSUphdmFFbGVtZW50IGplbGVtID0gbnVsbDsKLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWplbGVtID0gZ2V0SmF2YUVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50KTsKLQkJCWlmIChqZWxlbSA9PSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2Uoc2VsZWN0ZWRFbGVtZW50KTsKLQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlJPT1QpIHsKLQkJCQkJd2hpbGUgKGplbGVtID09IG51bGwgJiYgcmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQkJCQlyZXNvdXJjZSA9IHJlc291cmNlLmdldFBhcmVudCgpOwotCQkJCQkJamVsZW0gPSAoSUphdmFFbGVtZW50KSByZXNvdXJjZS5nZXRBZGFwdGVyKElKYXZhRWxlbWVudC5jbGFzcyk7Ci0JCQkJCX0KLQkJCQkJaWYgKGplbGVtID09IG51bGwpIHsKLQkJCQkJCWplbGVtID0gSmF2YUNvcmUuY3JlYXRlKHJlc291cmNlKTsgLy8gamF2YSBwcm9qZWN0Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGplbGVtID09IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93PSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJaWYgKHdpbmRvdyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlUGFydCgpOwotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBDb250ZW50T3V0bGluZSkgewotCQkJCXBhcnQgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJfQotCi0JCQlpZiAocGFydCBpbnN0YW5jZW9mIElWaWV3UGFydElucHV0UHJvdmlkZXIpIHsKLQkJCQlPYmplY3QgZWxlbSA9ICgoSVZpZXdQYXJ0SW5wdXRQcm92aWRlcikgcGFydCkuZ2V0Vmlld1BhcnRJbnB1dCgpOwotCQkJCWlmIChlbGVtIGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7Ci0JCQkJCWplbGVtID0gKElKYXZhRWxlbWVudCkgZWxlbTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoamVsZW0gPT0gbnVsbCB8fCBqZWxlbS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5KQVZBX01PREVMKSB7Ci0JCQl0cnkgewotCQkJCUlKYXZhUHJvamVjdFtdIHByb2plY3RzID0gSmF2YUNvcmUuY3JlYXRlKGdldFdvcmtzcGFjZVJvb3QoKSkuZ2V0SmF2YVByb2plY3RzKCk7Ci0JCQkJaWYgKHByb2plY3RzLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCWplbGVtID0gcHJvamVjdHNbMF07Ci0JCQkJfQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gamVsZW07Ci0JfQotCi0JcHJvdGVjdGVkIElXb3Jrc3BhY2VSb290IGdldFdvcmtzcGFjZVJvb3QoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQl0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQcm9qZWN0UmVxdWlyZW1lbnRzKElQcm9qZWN0IHByb2plY3QpCi0JewotCQkvLyBub3RoaW5nIHRvIGRvIGluIG1vc3QgY2FzZXMKLQl9Ci0JCi0JcHJvdGVjdGVkIElKYXZhRWxlbWVudCBnZXRKYXZhRWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkgCi0JCQlyZXR1cm4gKElKYXZhRWxlbWVudCkgb2JqOwotCQkKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElBZGFwdGFibGUpIAotCQkJcmV0dXJuIChJSmF2YUVsZW1lbnQpICgoSUFkYXB0YWJsZSkgb2JqKS5nZXRBZGFwdGVyKElKYXZhRWxlbWVudC5jbGFzcyk7Ci0JCQkKLQkJcmV0dXJuIChJSmF2YUVsZW1lbnQpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcihvYmosIElKYXZhRWxlbWVudC5jbGFzcyk7Ci0JfQotCQotCXByb3RlY3RlZCBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWlmIChvYmogaW5zdGFuY2VvZiBJUmVzb3VyY2UpIAotCQkJcmV0dXJuIChJUmVzb3VyY2UpIG9iajsKLQkJCi0JCWlmIChvYmogaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSAKLQkJCXJldHVybiAoSVJlc291cmNlKSAoKElBZGFwdGFibGUpIG9iaikuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQkJCi0JCXJldHVybiAoSVJlc291cmNlKSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIob2JqLCBJUmVzb3VyY2UuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9EeW5hbWljRW50aXR5RmllbGRUYWJsZVNlY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9EeW5hbWljRW50aXR5RmllbGRUYWJsZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkwYzBiZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvRHluYW1pY0VudGl0eUZpZWxkVGFibGVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kaWFsb2dzLkFkZFZpcnR1YWxBdHRyaWJ1dGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5lbnRpdHkuZGF0YS5tb2RlbC5EeW5hbWljRW50aXR5RmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm1vZGVsLklFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5JQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBEeW5hbWljRW50aXR5RmllbGRUYWJsZVNlY3Rpb24gZXh0ZW5kcyBDb21wb3NpdGUgewotCi0JcHJpdmF0ZSBJRGF0YU1vZGVsIG1vZGVsOwotCXByaXZhdGUgVGFibGUgbVRhYmxlV2lkZ2V0ID0gbnVsbDsKLQlwcml2YXRlIFRhYmxlVmlld2VyIG1UYWJsZVZpZXdlciA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgTkFNRV9DT0xVTU4gPSAwOwotCXByaXZhdGUgZmluYWwgaW50IE1BUFBJTkdfVFlQRV9DT0xVTU4gPSAxOwotCXByaXZhdGUgZmluYWwgaW50IEFUVFJJQlVURV9UWVBFX0NPTFVNTiA9IDI7Ci0JcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGVkaXRCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQnV0dG9uOwotCXByaXZhdGUgU3RyaW5nIHByb3BlcnR5TmFtZTsKLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIG1haW4gY29tcG9zaXRlIC0gRHluYW1pY0VudGl0eUZpZWxkc1dpemFyZFBhZ2UKLQkgKiBAcGFyYW0gbW9kZWwgdGhlIGRhdGEgbW9kZWwgcmVwcmVzZW50YXRpb24KLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIGRhdGEgcHJvcGVydHkgbmFtZQotCSAqLwotCXB1YmxpYyBEeW5hbWljRW50aXR5RmllbGRUYWJsZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCwgSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsJCi0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7CQkKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDQ7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXRoaXMuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXRoaXMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gdGFibGUgd2lkZ2V0Ci0JCW1UYWJsZVdpZGdldCA9IG5ldyBUYWJsZSh0aGlzLCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSKTsKLQkJbVRhYmxlV2lkZ2V0LnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCW1UYWJsZVdpZGdldC5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS52ZXJ0aWNhbFNwYW4gPSAyOwotCQltVGFibGVXaWRnZXQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlUYWJsZUNvbHVtbiBuYW1lQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKG1UYWJsZVdpZGdldCwgU1dULk5PTkUpOwotCQluYW1lQ29sdW1uLnNldFRleHQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkR5bmFtaWNFbnRpdHlGaWVsZHNXaXphcmRQYWdlX25hbWVDb2x1bW5MYWJlbCk7Ci0KLQkJVGFibGVDb2x1bW4gbWFwcGluZ1R5cGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4obVRhYmxlV2lkZ2V0LCBTV1QuTk9ORSk7Ci0JCW1hcHBpbmdUeXBlQ29sdW1uLnNldFRleHQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkR5bmFtaWNFbnRpdHlGaWVsZHNXaXphcmRQYWdlX21hcHBpbmdUeXBlQ29sdW1uTGFiZWwpOwotCi0JCVRhYmxlQ29sdW1uIGF0dHJUeXBlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKG1UYWJsZVdpZGdldCwgU1dULk5PTkUpOwotCQlhdHRyVHlwZUNvbHVtbi5zZXRUZXh0KEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EeW5hbWljRW50aXR5RmllbGRzV2l6YXJkUGFnZV9hdHRyaWJ1dGVUeXBlQ29sdW1uTGFiZWwpOwotCi0JCW1UYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihtVGFibGVXaWRnZXQpOwotCQltVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBFbnRpdHlSb3dDb250ZW50UHJvdmlkZXIoKSk7Ci0JCW1UYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBFbnRpdHlSb3dMYWJlbFByb3ZpZGVyKCkpOwotCQltVGFibGVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlRWRpdEJ1dHRvblNlbGVjdGVkKCk7Ci0JCQkJdXBkYXRlUHJpbWFyeUtleUZpZWxkUHJvcGVydHkoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gYWRkLCBlZGl0IGFuZCByZW1vdmUgYnV0dG9ucwotCQlmaW5hbCBDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRpb24gPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OVUxMKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWJ1dHRvbkNvbXBvc2l0aW9uLnNldExheW91dChsYXlvdXQpOwotCQlidXR0b25Db21wb3NpdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0KLQkJYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGlvbiwgU1dULlBVU0gpOwotCQlhZGRCdXR0b24uc2V0VGV4dChFY2xpcHNlTGlua1VpTWVzc2FnZXMuRHluYW1pY0VudGl0eUZpZWxkc1dpemFyZFBhZ2VfYWRkQnV0dG9uTGFiZWwpOyAKLQkJYWRkQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQloYW5kbGVBZGRCdXR0b25TZWxlY3RlZCgpOwotCQkJCXVwZGF0ZVByaW1hcnlLZXlGaWVsZFByb3BlcnR5KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkvL0RvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0KLQkJZWRpdEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRpb24sIFNXVC5QVVNIKTsKLQkJZWRpdEJ1dHRvbi5zZXRUZXh0KEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EeW5hbWljRW50aXR5RmllbGRzV2l6YXJkUGFnZV9lZGl0QnV0dG9uTGFiZWwpOwotCQllZGl0QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQllZGl0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlRWRpdEJ1dHRvblNlbGVjdGVkKCk7Ci0JCQkJdXBkYXRlUHJpbWFyeUtleUZpZWxkUHJvcGVydHkoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCS8vRG8gbm90aGluZwotCQkJfQotCQl9KTsKLQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlyZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0aW9uLCBTV1QuUFVTSCk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRUZXh0KEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EeW5hbWljRW50aXR5RmllbGRzV2l6YXJkUGFnZV9yZW1vdmVCdXR0b25MYWJlbCk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlUmVtb3ZlQnV0dG9uU2VsZWN0ZWQoKTsKLQkJCQl1cGRhdGVQcmltYXJ5S2V5RmllbGRQcm9wZXJ0eSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJLy9EbyBub3RoaW5nCi0JCQl9Ci0JCX0pOwotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJbVRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoZWRpdEJ1dHRvbiAhPSBudWxsKSB7Ci0JCQkJCWJvb2xlYW4gZW5hYmxlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuc2l6ZSgpID09IDE7Ci0JCQkJCWVkaXRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCQl9Ci0JCQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoIXNlbGVjdGlvbi5pc0VtcHR5KCkpOwotCQkJfQotCQl9KTsKLQotCQl0aGlzLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29sdW1uQ29udHJvbExpc3RlbmVyKGJ1dHRvbkNvbXBvc2l0aW9uKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBwcm9jZXNzIHRoZSBBZGQuLi4gYnV0dG9uIHByZXNzZWQgZXZlbnQuIAotCSAqIEl0IG9wZW5zIGRpYWxvZyB0byBhZGQgYSBuZXcgZHluYW1pYyBlbnRpdHkgZmllbGQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCUFkZEZpZWxkRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRGaWVsZERpYWxvZyhnZXRTaGVsbCgpLCB0aGlzLmdldEpwYVByb2plY3QoKSk7Ci0JCWludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCQlpZiAocmVzdWx0ID09IFdpbmRvdy5DQU5DRUwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlEeW5hbWljRW50aXR5RmllbGQgZW50aXR5RmllbGQgPSBkaWFsb2cuZ2V0RW50aXR5RmllbGQoKTsKLQkJYWRkRW50aXR5RmllbGQoZW50aXR5RmllbGQpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgZ2l2ZW4gZHluYW1pYyBlbnRpdHkgZmllbGQgdG8gdGhlIHRhYmxlCi0JICogCi0JICogQHBhcmFtIER5bmFtaWNFbnRpdHlGaWVsZAotCSAqIEByZXR1cm4gdGhlIER5bmFtaWNFbnRpdHlGaWVsZCB3aGljaCBpcyB0byBiZSBhZGRlZCB0byB0aGUgdGFibGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkRW50aXR5RmllbGQoRHluYW1pY0VudGl0eUZpZWxkIGZpZWxkKSB7Ci0JCWlmIChmaWVsZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlMaXN0PER5bmFtaWNFbnRpdHlGaWVsZD4gdmFsdWVMaXN0ID0gKEFycmF5TGlzdDxEeW5hbWljRW50aXR5RmllbGQ+KSBtVGFibGVWaWV3ZXIuZ2V0SW5wdXQoKTsJCQotCQlpZiAodmFsdWVMaXN0ID09IG51bGwpCi0JCQl2YWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PER5bmFtaWNFbnRpdHlGaWVsZD4oKTsJCQotCQl2YWx1ZUxpc3QuYWRkKGZpZWxkKTsKLQkJc2V0SW5wdXQodmFsdWVMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBwcm9jZXNzIHRoZSBFZGl0Li4uIGJ1dHRvbiBwcmVzc2VkIGV2ZW50LiAKLQkgKiBJdCBvcGVucyBkaWFsb2cgdG8gZWRpdCBhIGNob3NlbiBkeW5hbWljIGVudGl0eSBmaWVsZAotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVFZGl0QnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCUlTZWxlY3Rpb24gcyA9IG1UYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCEocyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSAhPSAxKQotCQkJcmV0dXJuOwotCi0JCU9iamVjdCBzZWxlY3RlZE9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJRHluYW1pY0VudGl0eUZpZWxkIGZpZWxkRm9yRWRpdCA9IChEeW5hbWljRW50aXR5RmllbGQpIHNlbGVjdGVkT2JqOwotCQlpbnQgaW5kZXggPSBtVGFibGVXaWRnZXQuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQotCQlFZGl0RmllbGREaWFsb2cgZGlhbG9nID0gbmV3IEVkaXRGaWVsZERpYWxvZyhnZXRTaGVsbCgpLCB0aGlzLmdldEpwYVByb2plY3QoKSwgZmllbGRGb3JFZGl0KTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJRHluYW1pY0VudGl0eUZpZWxkIGVudGl0eUZpZWxkID0gZGlhbG9nLmdldEVudGl0eUZpZWxkKCk7Ci0JCWlmIChlbnRpdHlGaWVsZCAhPSBudWxsKSB7CQkJCi0JCQllZGl0RW50aXR5RmllbGQoaW5kZXgsIGVudGl0eUZpZWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEVkaXQgYSBjaG9zZW4gZHluYW1pYyBlbnRpdHkgZmllbGQgZnJvbSB0aGUgdGFibGUKLQkgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBkeW5hbWljIGVudGl0eSBmaWVsZCBpbiB0aGUgdGFibGUKLQkgKiBAcGFyYW0gZmllbGQgdGhlIGVkaXRlZCBkeW5hbWljIGVudGl0eSBmaWVsZAotCSAqLwotCXByaXZhdGUgdm9pZCBlZGl0RW50aXR5RmllbGQoaW50IGluZGV4LCBEeW5hbWljRW50aXR5RmllbGQgZmllbGQpIHsKLQkJaWYgKGZpZWxkID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUxpc3Q8RHluYW1pY0VudGl0eUZpZWxkPiB2YWx1ZUxpc3QgPSAoQXJyYXlMaXN0PER5bmFtaWNFbnRpdHlGaWVsZD4pIG1UYWJsZVZpZXdlci5nZXRJbnB1dCgpOwkJCi0JCWlmICh2YWx1ZUxpc3QgPT0gbnVsbCkgewotCQkJdmFsdWVMaXN0ID0gbmV3IEFycmF5TGlzdDxEeW5hbWljRW50aXR5RmllbGQ+KCk7Ci0JCX0KLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQl2YWx1ZUxpc3QuYWRkKGZpZWxkKTsKLQkJfSBlbHNlIHsKLQkJCXZhbHVlTGlzdC5zZXQoaW5kZXgsIGZpZWxkKTsKLQkJfQotCQlzZXRJbnB1dCh2YWx1ZUxpc3QpOwkJCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcHJvY2VzcyB0aGUgUmVtb3ZlIGJ1dHRvbiBwcmVzc2VkIGV2ZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVSZW1vdmVCdXR0b25TZWxlY3RlZCgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBtVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotCQkJcmV0dXJuOwotCQlMaXN0PER5bmFtaWNFbnRpdHlGaWVsZD4gc2VsZWN0ZWRPYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvTGlzdCgpOwotCQlyZW1vdmVFbnRpdHlGaWVsZChzZWxlY3RlZE9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgc2VsZWN0ZWQgZHluYW1pYyBlbnRpdHkgZmllbGQocykgZnJvbSB0aGUgdGFibGUKLQkgKiBAcGFyYW0gZmllbGRzIGxpc3Qgb2YgZHluYW1pYyBlbnRpdHkgZmllbGRzIHdoaWNoIHNob3VsZCBiZSByZW1vdmVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUVudGl0eUZpZWxkKENvbGxlY3Rpb248RHluYW1pY0VudGl0eUZpZWxkPiBmaWVsZHMpIHsKLQkJTGlzdDxEeW5hbWljRW50aXR5RmllbGQ+IHZhbHVlTGlzdCA9IChBcnJheUxpc3Q8RHluYW1pY0VudGl0eUZpZWxkPikgbVRhYmxlVmlld2VyLmdldElucHV0KCk7Ci0JCXZhbHVlTGlzdC5yZW1vdmVBbGwoZmllbGRzKTsKLQkJc2V0SW5wdXQodmFsdWVMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGlucHV0IG9mIHRoZSB0YWJsZQotCSAqIEBwYXJhbSBpbnB1dCB0aGUgbGlzdCBvZiBkeW5hbWljIGVudGl0eSBmaWVsZHMgd2hpY2ggaGF2ZSB0byBiZSBwcmVzZW50ZWQgaW4gdGhlIHRhYmxlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldElucHV0KExpc3Q8RHluYW1pY0VudGl0eUZpZWxkPiBpbnB1dCkgewotCQltVGFibGVWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCQkvLyBDcmVhdGUgYSBuZXcgbGlzdCB0byB0cmlnZ2VyIHByb3BlcnR5IGNoYW5nZQotCQlBcnJheUxpc3Q8RHluYW1pY0VudGl0eUZpZWxkPiBuZXdJbnB1dCA9IG5ldyBBcnJheUxpc3Q8RHluYW1pY0VudGl0eUZpZWxkPigpOwotCQluZXdJbnB1dC5hZGRBbGwoaW5wdXQpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG5ld0lucHV0KTsJCQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIFRhYmxlVmlld2VyIG9mIHRoZSB0YWJsZQotCSAqLwotCXB1YmxpYyBUYWJsZVZpZXdlciBnZXRUYWJsZVZpZXdlcigpIHsKLQkJcmV0dXJuIG1UYWJsZVZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgUEsgZmllbGRzIHByb3BlcnR5IHdoZW4gYW55IGZpZWxkKHMpIGFkZGVkIHRvLCBlZGl0ZWQgaW4sIG9yIHJlbW92ZWQgZnJvbSB0aGUgZmllbGQgdGFibGUgdmlld2VyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVByaW1hcnlLZXlGaWVsZFByb3BlcnR5KCkgewotCQlMaXN0PER5bmFtaWNFbnRpdHlGaWVsZD4gcGtGaWVsZHMgPSBuZXcgQXJyYXlMaXN0PER5bmFtaWNFbnRpdHlGaWVsZD4oKTsKLQkJVGFibGVJdGVtW10gY2hpbGRyZW4gPSBtVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IGNoaWxkcmVuW2ldOwotCQkJRHluYW1pY0VudGl0eUZpZWxkIGZpZWxkID0gKER5bmFtaWNFbnRpdHlGaWVsZClpdGVtLmdldERhdGEoKTsKLQkJCWlmIChmaWVsZC5nZXRNYXBwaW5nVHlwZSgpLmdldEtleSgpLmVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKSB7Ci0JCQkJZmllbGQuc2V0S2V5KHRydWUpOwotCQkJCXBrRmllbGRzLmFkZChmaWVsZCk7Ci0JCQl9Ci0JCX0KLQkJRHluYW1pY0VudGl0eUZpZWxkVGFibGVTZWN0aW9uLnRoaXMubW9kZWwuc2V0UHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuUEtfRklFTERTLCBwa0ZpZWxkcyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDb250cm9sIGxpc3RlbmVyIGZvciBmaWVsZCBjb2x1bW5zICoqKioqKioqKioqKioqCi0KLQlwcml2YXRlIGZpbmFsIGNsYXNzIENvbHVtbkNvbnRyb2xMaXN0ZW5lciBleHRlbmRzIENvbnRyb2xBZGFwdGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRpb247Ci0KLQkJcHJpdmF0ZSBDb2x1bW5Db250cm9sTGlzdGVuZXIoQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0aW9uKSB7Ci0JCQl0aGlzLmJ1dHRvbkNvbXBvc2l0aW9uID0gYnV0dG9uQ29tcG9zaXRpb247Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCVRhYmxlIHRhYmxlID0gbVRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0JCQlSZWN0YW5nbGUgYXJlYSA9IHRhYmxlLmdldFBhcmVudCgpLmdldENsaWVudEFyZWEoKTsKLQkJCVBvaW50IHByZWZlcnJlZFNpemUgPSB0YWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCQkJUG9pbnQgYnV0dG9uQXJlYSA9IGJ1dHRvbkNvbXBvc2l0aW9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQlpbnQgd2lkdGggPSBhcmVhLndpZHRoIC0gMyAqIHRhYmxlLmdldEJvcmRlcldpZHRoKCk7Ci0JCQlpZiAocHJlZmVycmVkU2l6ZS55ID4gYXJlYS5oZWlnaHQgKyB0YWJsZS5nZXRIZWFkZXJIZWlnaHQoKSkgewotCQkJCS8vIFN1YnRyYWN0IHRoZSBzY3JvbGxiYXIgd2lkdGggZnJvbSB0aGUgdG90YWwgY29sdW1uIHdpZHRoCi0JCQkJLy8gaWYgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIgd2lsbCBiZSByZXF1aXJlZAotCQkJCVBvaW50IHZCYXJTaXplID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCk7Ci0JCQkJd2lkdGggLT0gdkJhclNpemUueDsKLQkJCX0KLQkJCVBvaW50IG9sZFNpemUgPSB0YWJsZS5nZXRTaXplKCk7Ci0JCQlpbnQgY29uc3VtZVdpZHRoID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChvbGRTaXplLnggPiBhcmVhLndpZHRoKSB7Ci0JCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgc21hbGxlciBzbyBtYWtlIHRoZSBjb2x1bW5zCi0JCQkJCS8vIHNtYWxsZXIgZmlyc3QgYW5kIHRoZW4gcmVzaXplIHRoZSB0YWJsZSB0bwotCQkJCQkvLyBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQkJY29uc3VtZVdpZHRoID0gc2V0Q29sdW1udFdpZHRoKHdpZHRoLCBjb2x1bW5zLCBjb25zdW1lV2lkdGgsIGkpOwotCQkJCQl0YWJsZS5zZXRTaXplKGFyZWEud2lkdGggLSBidXR0b25BcmVhLngsIGFyZWEuaGVpZ2h0KTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIGJpZ2dlciBzbyBtYWtlIHRoZSB0YWJsZQotCQkJCQkvLyBiaWdnZXIgZmlyc3QgYW5kIHRoZW4gbWFrZSB0aGUgY29sdW1ucyB3aWRlcgotCQkJCQkvLyB0byBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQkJY29uc3VtZVdpZHRoID0gc2V0Q29sdW1udFdpZHRoKHdpZHRoLCBjb2x1bW5zLCAJY29uc3VtZVdpZHRoLCBpKTsKLQkJCQkJdGFibGUuc2V0U2l6ZShhcmVhLndpZHRoIC0gYnV0dG9uQXJlYS54LCBhcmVhLmhlaWdodCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgc2V0Q29sdW1udFdpZHRoKGludCB3aWR0aCwgVGFibGVDb2x1bW5bXSBjb2x1bW5zLCBpbnQgY29uc3VtZVdpZHRoLCBpbnQgaSkgewotCQkJY29sdW1uc1tpXS5zZXRXaWR0aCh3aWR0aCAvIChjb2x1bW5zLmxlbmd0aCArIDEpKTsKLQkJCWNvbnN1bWVXaWR0aCArPSBjb2x1bW5zW2ldLmdldFdpZHRoKCk7Ci0JCQlyZXR1cm4gY29uc3VtZVdpZHRoOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBQcm92aWRlcnMgZm9yIHRoZSBkeW5hbWljIGVudGl0eSBmaWVsZCB0YWJsZSB2aWV3ZXIgKioqKioqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgdGFibGUgaXRlbXMKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgRW50aXR5Um93Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTGlzdCkgewotCQkJCXJldHVybiAoKExpc3QpIGVsZW1lbnQpLnRvQXJyYXkoKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgYVZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCS8vRGVmYXVsdCBub3RoaW5nCi0JCX0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCS8vRGVmYXVsdCBub3RoaW5nCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbGFiZWwgcHJvdmlkZXIgZm9yIHRoZSB0YWJsZSBpdGVtcwotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBFbnRpdHlSb3dMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJRHluYW1pY0VudGl0eUZpZWxkIGVudGl0eSA9IChEeW5hbWljRW50aXR5RmllbGQpIGVsZW1lbnQ7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gTkFNRV9DT0xVTU4pIHsKLQkJCQlyZXR1cm4gZW50aXR5LmdldE5hbWUoKTsKLQkJCX0KLQkJCWlmIChjb2x1bW5JbmRleCA9PSBNQVBQSU5HX1RZUEVfQ09MVU1OKSB7Ci0JCQkJcmV0dXJuIGVudGl0eS5nZXRNYXBwaW5nVHlwZSgpLmdldExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gQVRUUklCVVRFX1RZUEVfQ09MVU1OKSB7Ci0JCQkJcmV0dXJuIGVudGl0eS5nZXRGcW5UeXBlTmFtZSgpOwotCQkJfQkJCi0JCQlyZXR1cm4gIiI7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCVN0cmluZ1tdIGFycmF5ID0gKFN0cmluZ1tdKSBlbGVtZW50OwotCQkJaWYgKGFycmF5Lmxlbmd0aCA+IDApIHsKLQkJCQlyZXR1cm4gYXJyYXlbMF07Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqIEFkZCBkeW5hbWljIGVudGl0eSBmaWVsZCBkaWFsb2cgKioqKioqKioqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgZGlhbG9nIHdoaWNoIGNvbGxlY3QgdGhlIGluZm9ybWF0aW9uIChuYW1lLCBtYXBwaW5nIHR5cGUsIGFuZCBhdHRyaWJ1dGUgdHlwZSkgZm9yIGEgbmV3IGR5bmFtaWMgZW50aXR5IGZpZWxkCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBBZGRGaWVsZERpYWxvZyBleHRlbmRzIEFkZFZpcnR1YWxBdHRyaWJ1dGVEaWFsb2cgewotCQkKLQkJcHJvdGVjdGVkIER5bmFtaWNFbnRpdHlGaWVsZCBlbnRpdHlGaWVsZDsKLQotCQlwcm90ZWN0ZWQgZmluYWwgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RzIEFkZEZpZWxkRGlhbG9nCi0JCSAqIEBwYXJhbSBzaGVsbAotCQkgKiBAcGFyYW0ganBhUHJvamVjdCB0aGUgc2VsZWN0ZWQganBhUHJvamVjdAotCQkgKi8KLQkJcHVibGljIEFkZEZpZWxkRGlhbG9nKFNoZWxsIHNoZWxsLCBKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJCXN1cGVyKHNoZWxsLCBudWxsKTsKLQkJCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7Ci0JCQlzZXRUaXRsZShFY2xpcHNlTGlua1VpTWVzc2FnZXMuRHluYW1pY0VudGl0eUZpZWxkc1dpemFyZFBhZ2VfYWRkRHluYW1pY0VudGl0eUZpZWxkRGlhbG9nX3RpdGxlKTsKLQkJfQotCi0JCS8qIENyZWF0ZSB0aGUgYXJlYSBvZiBkaWFsb2cKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQl9Ci0KLQkJLyogUHJvY2Vzc2VzIE9LIGJ1dHRvbiBwcmVzc2VkIGV2ZW50LgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI29rUHJlc3NlZCgpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQkJLyoqCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZW50aXR5LmRhdGEubW9kZWwuRHluYW1pY0VudGl0eUZpZWxkCi0JCQkgKi8KLQkJCUR5bmFtaWNFbnRpdHlGaWVsZCBmaWVsZCA9IG5ldyBEeW5hbWljRW50aXR5RmllbGQoKTsKLQkJCWZpZWxkLnNldE1hcHBpbmdUeXBlKHRoaXMuZ2V0TWFwcGluZ1VpRGVmaW5pdGlvbih0aGlzLm1hcHBpbmdDb21ibykpOwotCQkJZmllbGQuc2V0RnFuVHlwZU5hbWUodGhpcy5hdHRyaWJ1dGVUeXBlVGV4dC5nZXRUZXh0KCkpOwotCQkJZmllbGQuc2V0TmFtZSh0aGlzLm5hbWVUZXh0LmdldFRleHQoKSk7Ci0JCQllbnRpdHlGaWVsZCA9IGZpZWxkOwotCi0JCQlzZXRSZXR1cm5Db2RlKE9LKTsKLQkJCWNsb3NlKCk7Ci0JCX0KLQotCQlwcml2YXRlIE1hcHBpbmdVaURlZmluaXRpb248Pyw/PiBnZXRNYXBwaW5nVWlEZWZpbml0aW9uKENvbWJvVmlld2VyIG1hcHBpbmdUeXBlKSB7Ci0JCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBtYXBwaW5nVHlwZS5nZXRTZWxlY3Rpb24oKTsKLQkJCXJldHVybiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgPyBudWxsIDogKE1hcHBpbmdVaURlZmluaXRpb248Pyw/Pikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gdGhlIGR5bmFtaWMgZW50aXR5IGZpZWxkIHJlcHJlc2VudGF0aW9uIHdpdGggdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRoZSBkaWFsb2cKLQkJICovCi0JCXB1YmxpYyBEeW5hbWljRW50aXR5RmllbGQgZ2V0RW50aXR5RmllbGQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbnRpdHlGaWVsZDsKLQkJfQotCi0JCS8vICoqKioqKioqKiogb3ZlcnJpZGUgc3VwZXIgY2xhc3MgbWV0aG9kcyAqKioqKioqKioqKioKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQkJcmV0dXJuIHRoaXMuanBhUHJvamVjdDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSnB0UmVzb3VyY2VUeXBlIGdldEpwdFJlc291cmNlVHlwZSgpIHsKLQkJCVN0cmluZyB4bWxOYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuWE1MX05BTUUpOwotCQkJcmV0dXJuIHRoaXMuZ2V0T3JtWG1sUmVzb3VyY2UoeG1sTmFtZSkuZ2V0UmVzb3VyY2VUeXBlKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgZ2V0T3JtWG1sUmVzb3VyY2UoU3RyaW5nIHhtbE5hbWUpIHsKLQkJCXJldHVybiB0aGlzLmpwYVByb2plY3QgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmpwYVByb2plY3QuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCh4bWxOYW1lKSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKiogRWRpdCBkeW5hbWljIGVudGl0eSBmaWVsZCBkaWFsb2cgKioqKioqKioqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIEVkaXRGaWVsZERpYWxvZyBleHRlbmRzIEFkZEZpZWxkRGlhbG9nIHsKLQotCQlwdWJsaWMgRWRpdEZpZWxkRGlhbG9nKFNoZWxsIHNoZWxsLCBKcGFQcm9qZWN0IGpwYVByb2plY3QsIER5bmFtaWNFbnRpdHlGaWVsZCBmaWVsZCkgewotCQkJc3VwZXIoc2hlbGwsIGpwYVByb2plY3QpOwotCQkJdGhpcy5lbnRpdHlGaWVsZCA9IGZpZWxkOwkJCi0JCX0KLQotCQkvKiBDcmVhdGUgdGhlIGFyZWEgb2YgdGhlIGRpYWxvZwotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQkJdGhpcy5uYW1lVGV4dC5zZXRUZXh0KHRoaXMuZW50aXR5RmllbGQuZ2V0TmFtZSgpKTsKLQkJCXRoaXMubWFwcGluZ0NvbWJvLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0aGlzLmVudGl0eUZpZWxkLmdldE1hcHBpbmdUeXBlKCkpKTsKLQkJCXRoaXMuYXR0cmlidXRlVHlwZVRleHQuc2V0VGV4dCh0aGlzLmVudGl0eUZpZWxkLmdldEZxblR5cGVOYW1lKCkpOwotCi0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQl9Ci0JfQotCi0JLy8qKioqKioqKioqKioqIG1pc2MgKioqKioqKioqKioqKioKLQotCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiAoSnBhUHJvamVjdCkgZ2V0SVByb2plY3QoKS5nZXRBZGFwdGVyKEpwYVByb2plY3QuY2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRJUHJvamVjdCgpIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKTsKLQkJcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9EeW5hbWljRW50aXR5RmllbGRzV2l6YXJkUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL0R5bmFtaWNFbnRpdHlGaWVsZHNXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViN2RhZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL0R5bmFtaWNFbnRpdHlGaWVsZHNXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5KcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWwuSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBEeW5hbWljRW50aXR5RmllbGRzV2l6YXJkUGFnZSBleHRlbmRzIERhdGFNb2RlbFdpemFyZFBhZ2UgewotCi0JcHVibGljIER5bmFtaWNFbnRpdHlGaWVsZHNXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQl0aGlzLnNldFRpdGxlKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EeW5hbWljRW50aXR5RmllbGRzV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXRoaXMuc2V0RGVzY3JpcHRpb24oRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkR5bmFtaWNFbnRpdHlGaWVsZHNXaXphcmRQYWdlX2Rlc2MpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0lFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVOVElUWV9GSUVMRFMsIAotCQkJCQkJCUlFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlBLX0ZJRUxEU307Ci0JfQotCi0JLyogQ3JlYXRlIHRoZSBtYWluIGNvbXBvc2l0ZSBhbmQgYWRkIHRvIGl0IHRoZSBlbnRpdHkgcHJvcGVydGllcwotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IDMwMDsKLQkJZGF0YS5oZWlnaHRIaW50ID0gNDUwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJY29tcG9zaXRlLnBhY2soKTsKLQotCQljcmVhdGVFbnRpdHlGaWVsZHNHcm91cChjb21wb3NpdGUpOwotCi0JCUlTdGF0dXMgcHJvamVjdFN0YXR1cyA9IHZhbGlkYXRlUHJvamVjdE5hbWUoKTsKLQkJaWYgKCFwcm9qZWN0U3RhdHVzLmlzT0soKSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKHByb2plY3RTdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJCWNvbXBvc2l0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5EWU5BTUlDX0VOVElUWV9GSUVMRCk7Ci0JICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFbnRpdHlGaWVsZHNHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwkJCi0JCUdyaWREYXRhIGdyb3VwR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ3JvdXBHcmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZ3JvdXBHcmlkRGF0YSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlncm91cC5zZXRUZXh0KEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EeW5hbWljRW50aXR5RmllbGRzV2l6YXJkUGFnZV9lbnRpdHlGaWVsZEdyb3VwKTsKLQkJbmV3IER5bmFtaWNFbnRpdHlGaWVsZFRhYmxlU2VjdGlvbihncm91cCwgbW9kZWwsIElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVOVElUWV9GSUVMRFMpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgcHJvamVjdCBuYW1lIGNvcnJlY3RuZXNzCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVQcm9qZWN0TmFtZSgpIHsKLQkJLy8gY2hlY2sgZm9yIGVtcHR5Ci0JCWlmIChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpID09IG51bGwgfHwgbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsIEpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4uUExVR0lOX0lELAotCQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuRHluYW1pY0VudGl0eUZpZWxkc1dpemFyZFBhZ2Vfbm9KcGFQcm9qZWN0cyk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL0VjbGlwc2VMaW5rRHluYW1pY0VudGl0eVdpemFyZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL0VjbGlwc2VMaW5rRHluYW1pY0VudGl0eVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTRhNTk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9FY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuUGxhdGZvcm1Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmVudGl0eS5kYXRhLm1vZGVsLkR5bmFtaWNFbnRpdHlEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWwuSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZDsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRHluYW1pY0VudGl0eVdpemFyZCBleHRlbmRzIERhdGFNb2RlbFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmR7Ci0KLQlwcml2YXRlIFN0cmluZyBpbml0aWFsUHJvamVjdE5hbWU7Ci0JcHJpdmF0ZSBEeW5hbWljRW50aXR5Q2xhc3NXaXphcmRQYWdlIHBhZ2UxOwotCXByaXZhdGUgRHluYW1pY0VudGl0eUZpZWxkc1dpemFyZFBhZ2UgcGFnZTI7Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtEeW5hbWljRW50aXR5V2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotICAgICAgICBzZXRXaW5kb3dUaXRsZShFY2xpcHNlTGlua1VpTWVzc2FnZXMuRWNsaXBzZUxpbmtEeW5hbWljRW50aXR5V2l6YXJkX3RpdGxlKTsKLSAgICAgICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSnB0SnBhVWlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKEpwdFVpSWNvbnMuRU5USVRZX1dJWl9CQU5ORVIpKTsKLQl9Ci0KLQkvKioKLQkgKiBFbXB0eSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0R5bmFtaWNFbnRpdHlXaXphcmQoKXsKLSAgICAJdGhpcyhudWxsKTsKLSAgICB9Ci0KLQkvKiBBZGRzIHRoZSB0d28gcGFnZXMgb2YgdGhlIG5ldyBkeW5hbWljIGVudGl0eSB3aXphcmQgCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZCNkb0FkZFBhZ2VzKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQlwYWdlMSA9IG5ldyBEeW5hbWljRW50aXR5Q2xhc3NXaXphcmRQYWdlKGdldERhdGFNb2RlbCgpLCAicGFnZU9uZSIpOwotCQlwYWdlMS5zZXRQcm9qZWN0TmFtZSh0aGlzLmluaXRpYWxQcm9qZWN0TmFtZSk7Ci0JCWFkZFBhZ2UocGFnZTEpOwotCQlwYWdlMiA9IG5ldyBEeW5hbWljRW50aXR5RmllbGRzV2l6YXJkUGFnZShnZXREYXRhTW9kZWwoKSwgInBhZ2VUd28iKTsKLQkJYWRkUGFnZShwYWdlMik7Ci0JfQotCi0JLyoKLQkgKiBXaXphcmQgY2Fubm90IGJlIGZpbmlzaGVkIG9uIHRoZSBmaXJzdCBwYWdlIAotCSAqIFdpemFyZCBjYW4gYmUgZmluaXNoZWQgb24gdGhlIHNlY29uZCBwYWdlIHNpbmNlIGl0J3MgcmVhc29uYWJsZSAKLQkgKiBmb3IgdXNlcnMgdG8gY3JlYXRlIGEgZHluYW1pYyBlbnRpdHkgd2l0aG91dCBhbnkgZmllbGQocykgYW5kIHRoZW4KLQkgKiBhZGQgdmlydHVhbCBhdHRyaWJ1dGVzIG1hbnVhbGx5IG9yIHRocm91Z2ggSlBBIHN0cnVjdHVyZSB2aWV3Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpID09IHBhZ2UxID8gZmFsc2UgOiBwYWdlMi5nZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsOwotCX0KLQotCS8qIFJldHVybiB0aGUgZGVmYXVsdCBkYXRhIG1vZGVsIHByb3ZpZGVyIChEeW5hbWljRW50aXR5RGF0YU1vZGVsUHJvdmlkZXIgaW4gb3VyIGNhc2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZCNnZXREZWZhdWx0UHJvdmlkZXIoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IER5bmFtaWNFbnRpdHlEYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLQotCS8qIAotCSAqIE92ZXJyaWRlIHRoZSBwYXJlbnQgbWV0aG9kIGluIG9yZGVyIHRvIG9wZW4gdGhlIGdlbmVyYXRlZCBkeW5hbWljIGVudGl0eSBpbiBKYXZhIGVkaXRvcgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmQjcG9zdFBlcmZvcm1GaW5pc2goKQotCSAqLwotCUBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHBvc3RQZXJmb3JtRmluaXNoKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgdGhpcy5nZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUKTsKLSAgICAgICAgCUpwYVByb2plY3QganBhUHJvamVjdCA9IChKcGFQcm9qZWN0KShwcm9qZWN0KS5nZXRBZGFwdGVyKEpwYVByb2plY3QuY2xhc3MpOwotICAgICAgICAJU3RyaW5nIHhtbFJ1bnRpbWVQYXRoID0gdGhpcy5nZXREYXRhTW9kZWwoKS5nZXRTdHJpbmdQcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5YTUxfTkFNRSkudHJpbSgpOwotICAgICAgICAJSnBhWG1sUmVzb3VyY2UgeG1sUmVzb3VyY2UgPSBqcGFQcm9qZWN0LmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UobmV3IFBhdGgoeG1sUnVudGltZVBhdGgpKTsKLSAgICAgICAgICAgIG9wZW5FZGl0b3IoeG1sUmVzb3VyY2UpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gY2FudE9wZW4pIHsKLSAgICAgICAgCUpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4ubG9nKGNhbnRPcGVuKTsKLSAgICAgICAgfQotICAgIH0KLQotCS8qCi0JICogT3BlbiB0aGUgRWNsaXBzZUxpbmsgbWFwcGluZyBmaWxlIHdoZXJlIHRoZSBkeW5hbWljIGVudGl0eSBpcyBjcmVhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkVkaXRvcihmaW5hbCBKcGFYbWxSZXNvdXJjZSB4bWxSZXNvdXJjZSkgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlGaWxlIGZpbGUgPSB4bWxSZXNvdXJjZS5nZXRGaWxlKCk7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCXRyeSB7Ci0JCQkJCUlERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUsIHRydWUpOwotCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGlTZWxlY3Rpb24pIHsKLSAgICAJdGhpcy5pbml0aWFsUHJvamVjdE5hbWUgPSBnZXRQcm9qZWN0TmFtZShpU2VsZWN0aW9uKTsKLQkJdGhpcy5nZXREYXRhTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgZXh0cmFjdFByb2plY3QoSVN0cnVjdHVyZWRTZWxlY3Rpb24gaVNlbGVjdGlvbikgewotCQlPYmplY3Qgc2VsZWN0ZWRPYmogPSBpU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoc2VsZWN0ZWRPYmogPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBQbGF0Zm9ybVRvb2xzLmdldEFkYXB0ZXIoc2VsZWN0ZWRPYmosIElSZXNvdXJjZS5jbGFzcyk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQl9Ci0JCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IFBsYXRmb3JtVG9vbHMuZ2V0QWRhcHRlcihzZWxlY3RlZE9iaiwgSUphdmFFbGVtZW50LmNsYXNzKTsKLQkJaWYgKGphdmFFbGVtZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBqYXZhRWxlbWVudC5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJfQotCQlKcGFDb250ZXh0Tm9kZSBub2RlID0gUGxhdGZvcm1Ub29scy5nZXRBZGFwdGVyKHNlbGVjdGVkT2JqLCBKcGFDb250ZXh0Tm9kZS5jbGFzcyk7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXJldHVybiBub2RlLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0TmFtZShJU3RydWN0dXJlZFNlbGVjdGlvbiBpU2VsZWN0aW9uKSB7Ci0gICAgCUlQcm9qZWN0IGlQcm9qZWN0ID0gdGhpcy5leHRyYWN0UHJvamVjdChpU2VsZWN0aW9uKTsKLSAgICAJcmV0dXJuIGlQcm9qZWN0ID09IG51bGw/IAotICAgIAkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EeW5hbWljRW50aXR5Q2xhc3NXaXphcmRQYWdlX2VtcHR5U3RyaW5nIDogCi0gICAgCQkJaVByb2plY3QuZ2V0TmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9FY2xpcHNlTGlua01hcHBpbmdGaWxlV2l6YXJkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDU3MzEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9FY2xpcHNlTGlua01hcHBpbmdGaWxlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMub3JtLk1hcHBpbmdGaWxlTmV3RmlsZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLm9ybS5NYXBwaW5nRmlsZU9wdGlvbnNXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5vcm0uTWFwcGluZ0ZpbGVXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLQotLyoqCi0gKiBUaGlzIGlzIHJlZmVyZW5jZWQgaW4gdGhlIHBsdWdpbi54bWwgYXMgYW4gb3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyBleHRlbnNpb24KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua01hcHBpbmdGaWxlV2l6YXJkCi0JCWV4dGVuZHMgTWFwcGluZ0ZpbGVXaXphcmQgewotCQotCXB1YmxpYyBFY2xpcHNlTGlua01hcHBpbmdGaWxlV2l6YXJkKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVdpemFyZChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcihkYXRhTW9kZWwpOwotCQlzZXRXaW5kb3dUaXRsZShFY2xpcHNlTGlua1VpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRfdGl0bGUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVOZXdGaWxlV2l6YXJkUGFnZSBidWlsZE1hcHBpbmdGaWxlTmV3RmlsZVdpemFyZFBhZ2UoKSB7Ci0JCXJldHVybiBuZXcgTWFwcGluZ0ZpbGVOZXdGaWxlV2l6YXJkUGFnZSgKLQkJCQkiUGFnZV8xIiwgdGhpcy5tdW5nZWRTZWxlY3Rpb24sIGdldERhdGFNb2RlbCgpLAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5NYXBwaW5nRmlsZVdpemFyZFBhZ2VfbmV3RmlsZV90aXRsZSwgCi0JCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkUGFnZV9uZXdGaWxlX2Rlc2MpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVPcHRpb25zV2l6YXJkUGFnZSBidWlsZE1hcHBpbmdGaWxlT3B0aW9uc1dpemFyZFBhZ2UoKSB7Ci0JCXJldHVybiBuZXcgTWFwcGluZ0ZpbGVPcHRpb25zV2l6YXJkUGFnZSgKLQkJCQkiUGFnZV8yIiwgZ2V0RGF0YU1vZGVsKCksCi0JCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkUGFnZV9vcHRpb25zX3RpdGxlLCAKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX29wdGlvbnNfZGVzYyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVBhdGggY3JlYXRlTmV3TWFwcGluZ0ZpbGUoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBTdHJpbmcgeG1sRmlsZU5hbWUpIHsKLQkJRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVdpemFyZCB3aXphcmQgPSBuZXcgRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVdpemFyZCgKLQkJCQlEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKSk7Ci0JCXJldHVybiBNYXBwaW5nRmlsZVdpemFyZC5jcmVhdGVNYXBwaW5nRmlsZShzZWxlY3Rpb24sIHhtbEZpbGVOYW1lLCB3aXphcmQpOwkJCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9FbWJlZGRlZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVXaXphcmQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9FbWJlZGRlZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRhMzEyZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvRW1iZWRkZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMub3JtLk1hcHBpbmdGaWxlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogVGhpcyB3aXphcmQgd2lsbCBjcmVhdGUgYSBuZXcgRWNsaXBzZUxpbmsgbWFwcGluZyBmaWxlIHdpdGhvdXQgb3BlbmluZyBpdAotICogYWZ0ZXJ3YXJkcy4KLSAqIEl0IGNhbiBiZSB1c2VkIHdpdGhpbiBvdGhlciB3aXphcmRzIHdoZXJlIG9wZW5pbmcgdGhlIG1hcHBpbmcgZmlsZSBpcwotICogdW5uZWNlc3NhcnksIG1ha2luZyB0aGUgcHJvY2VzcyBzbW9vdGhlci4KLSAqLwotcHVibGljIGNsYXNzIEVtYmVkZGVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVdpemFyZAotCWV4dGVuZHMgRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVdpemFyZAotewotCXB1YmxpYyBzdGF0aWMgSVBhdGggY3JlYXRlTmV3TWFwcGluZ0ZpbGUoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBjcmVhdGVOZXdNYXBwaW5nRmlsZShzZWxlY3Rpb24sIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVBhdGggY3JlYXRlTmV3TWFwcGluZ0ZpbGUoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBTdHJpbmcgeG1sRmlsZU5hbWUpIHsKLQkJaWYgKHhtbEZpbGVOYW1lID09IG51bGwpIHsKLQkJCXhtbEZpbGVOYW1lID0gREVGQVVMVF9YTUxfRklMRV9OQU1FOwotCQl9IAotCQlFbWJlZGRlZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVXaXphcmQgd2l6YXJkID0gbmV3IEVtYmVkZGVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVdpemFyZChEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKSk7Ci0JCXJldHVybiBNYXBwaW5nRmlsZVdpemFyZC5jcmVhdGVNYXBwaW5nRmlsZShzZWxlY3Rpb24sIHhtbEZpbGVOYW1lLCB3aXphcmQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfWE1MX0ZJTEVfTkFNRSA9ICJlY2xpcHNlbGluay1vcm0ueG1sIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgRW1iZWRkZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlV2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBFbWJlZGRlZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVXaXphcmQoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVNYXBwaW5nRmlsZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9TZWxlY3RFY2xpcHNlTGlua01hcHBpbmdGaWxlRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvU2VsZWN0RWNsaXBzZUxpbmtNYXBwaW5nRmlsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTNiNjRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9TZWxlY3RFY2xpcHNlTGlua01hcHBpbmdGaWxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLlNlbGVjdE1hcHBpbmdGaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIE9ubHkgRWNsaXBzZUxpbmsgbWFwcGluZyBmaWxlIHdpbGwgc2hvdyB1cCBvbiBFY2xpcHNlTGluayBwbGF0Zm9ybSB3aXRoIHRoaXMgZGlhbG9nCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RFY2xpcHNlTGlua01hcHBpbmdGaWxlRGlhbG9nCi0JZXh0ZW5kcyBTZWxlY3RNYXBwaW5nRmlsZURpYWxvZwotewotCXB1YmxpYyBTZWxlY3RFY2xpcHNlTGlua01hcHBpbmdGaWxlRGlhbG9nKFNoZWxsIHBhcmVudCwgSVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcihwYXJlbnQsIHByb2plY3QpOwotCX0KLQotCXB1YmxpYyBTZWxlY3RFY2xpcHNlTGlua01hcHBpbmdGaWxlRGlhbG9nKFNoZWxsIHBhcmVudCwgSVByb2plY3QgcHJvamVjdCwgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwgSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgcHJvamVjdCwgbGFiZWxQcm92aWRlciwgY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBvcGVuTmV3TWFwcGluZ0ZpbGVXaXphcmQoKSB7Ci0JCUlQYXRoIHBhdGggPSBFbWJlZGRlZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVXaXphcmQuY3JlYXRlTmV3TWFwcGluZ0ZpbGUobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc3VwZXIucHJvamVjdCkpOwotCQl0aGlzLnVwZGF0ZURpYWxvZyhwYXRoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvY29udmVyc2lvbi9qYXZhL0VjbGlwc2VMaW5rSmF2YUNvbnZlcnRlckNvbnZlcnNpb25XaXphcmRQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvY29udmVyc2lvbi9qYXZhL0VjbGlwc2VMaW5rSmF2YUNvbnZlcnRlckNvbnZlcnNpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNTFjYjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2NvbnZlcnNpb24vamF2YS9FY2xpcHNlTGlua0phdmFDb252ZXJ0ZXJDb252ZXJzaW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5jb252ZXJzaW9uLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFDb252ZXJ0ZXJDb252ZXJzaW9uV2l6YXJkUGFnZQotCWV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhTWV0YWRhdGFDb252ZXJzaW9uV2l6YXJkUGFnZQotewotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFDb252ZXJ0ZXJDb252ZXJzaW9uV2l6YXJkUGFnZShKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJc3VwZXIoanBhUHJvamVjdCwgRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkphdmFDb252ZXJ0ZXJDb252ZXJzaW9uV2l6YXJkUGFnZV90aXRsZSwgRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkphdmFDb252ZXJ0ZXJDb252ZXJzaW9uV2l6YXJkUGFnZV9kZXNjcmlwdGlvbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzQ29udmVydGlibGVKYXZhTWV0YWRhdGFfKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5oYXNDb252ZXJ0aWJsZUphdmFDb252ZXJ0ZXJzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNaXNzaW5nSmF2YU1ldGFkYXRhV2FybmluZ01lc3NhZ2UoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuSmF2YU1ldGFkYXRhQ29udmVyc2lvbl9ub0NvbnZlcnRlcnNUb0NvbnZlcnQ7Ci0JfQotCi0JLyoqCi0JICogTWFwcGluZyBmaWxlIG11c3QgYmUgYW4gRWNsaXBzZUxpbmsgT1JNIGZpbGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElDb250ZW50VHlwZSBnZXRNYXBwaW5nRmlsZUNvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb252ZXJzaW9uQ29tbWFuZC5TdHJhdGVneSBnZXRDb252ZXJzaW9uQ29tbWFuZFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gQ09OVkVSU0lPTl9DT01NQU5EX1NUUkFURUdZOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29udmVyc2lvbkNvbW1hbmRTdHJhdGVneSBDT05WRVJTSU9OX0NPTU1BTkRfU1RSQVRFR1kgPSBuZXcgQ29udmVyc2lvbkNvbW1hbmRTdHJhdGVneSgpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBDb252ZXJzaW9uQ29tbWFuZFN0cmF0ZWd5Ci0JCWltcGxlbWVudHMgQ29udmVyc2lvbkNvbW1hbmQuU3RyYXRlZ3kKLQl7Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJKChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgZW50aXR5TWFwcGluZ3MuZ2V0UGVyc2lzdGVuY2VVbml0KCkpLmNvbnZlcnRKYXZhQ29udmVydGVycygoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncykgZW50aXR5TWFwcGluZ3MsIG1vbml0b3IpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzQW55RXF1aXZhbGVudEphdmFNZXRhZGF0YV8oKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmhhc0FueUVxdWl2YWxlbnRKYXZhQ29udmVydGVycygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RXF1aXZhbGVudEphdmFNZXRhZGF0YVdhcm5pbmdEaWFsb2dUaXRsZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5KYXZhTWV0YWRhdGFDb252ZXJzaW9uX2VxdWl2YWxlbnRDb252ZXJ0ZXJzV2FybmluZ1RpdGxlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RXF1aXZhbGVudEphdmFNZXRhZGF0YVdhcm5pbmdEaWFsb2dNZXNzYWdlKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkphdmFNZXRhZGF0YUNvbnZlcnNpb25fZXF1aXZhbGVudENvbnZlcnRlcnNXYXJuaW5nTWVzc2FnZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvY29udmVyc2lvbi9qYXZhL0VjbGlwc2VMaW5rSmF2YUdlbmVyYXRvckNvbnZlcnNpb25XaXphcmRQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvY29udmVyc2lvbi9qYXZhL0VjbGlwc2VMaW5rSmF2YUdlbmVyYXRvckNvbnZlcnNpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNzgxNDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2NvbnZlcnNpb24vamF2YS9FY2xpcHNlTGlua0phdmFHZW5lcmF0b3JDb252ZXJzaW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5jb252ZXJzaW9uLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmNvbnZlcnNpb24uamF2YS5HZW5lcmljSmF2YUdlbmVyYXRvckNvbnZlcnNpb25XaXphcmRQYWdlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhR2VuZXJhdG9yQ29udmVyc2lvbldpemFyZFBhZ2UKLQlleHRlbmRzIEVjbGlwc2VMaW5rSmF2YU1ldGFkYXRhQ29udmVyc2lvbldpemFyZFBhZ2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhR2VuZXJhdG9yQ29udmVyc2lvbldpemFyZFBhZ2UoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCXN1cGVyKGpwYVByb2plY3QsIEpwdFVpTWVzc2FnZXMuSmF2YUdlbmVyYXRvckNvbnZlcnNpb25XaXphcmRQYWdlX3RpdGxlLCBKcHRVaU1lc3NhZ2VzLkphdmFHZW5lcmF0b3JDb252ZXJzaW9uV2l6YXJkUGFnZV9kZXNjcmlwdGlvbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzQ29udmVydGlibGVKYXZhTWV0YWRhdGFfKCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZVVuaXQuaGFzQ29udmVydGlibGVKYXZhR2VuZXJhdG9ycygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWlzc2luZ0phdmFNZXRhZGF0YVdhcm5pbmdNZXNzYWdlKCkgewotCQlyZXR1cm4gSnB0VWlNZXNzYWdlcy5KYXZhTWV0YWRhdGFDb252ZXJzaW9uX25vR2VuZXJhdG9yc1RvQ29udmVydDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udmVyc2lvbkNvbW1hbmQuU3RyYXRlZ3kgZ2V0Q29udmVyc2lvbkNvbW1hbmRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIEdlbmVyaWNKYXZhR2VuZXJhdG9yQ29udmVyc2lvbldpemFyZFBhZ2UuQ09OVkVSU0lPTl9DT01NQU5EX1NUUkFURUdZOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGhhc0FueUVxdWl2YWxlbnRKYXZhTWV0YWRhdGFfKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5oYXNBbnlFcXVpdmFsZW50SmF2YUdlbmVyYXRvcnMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEVxdWl2YWxlbnRKYXZhTWV0YWRhdGFXYXJuaW5nRGlhbG9nVGl0bGUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuSmF2YU1ldGFkYXRhQ29udmVyc2lvbl9lcXVpdmFsZW50R2VuZXJhdG9yc1dhcm5pbmdUaXRsZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEVxdWl2YWxlbnRKYXZhTWV0YWRhdGFXYXJuaW5nRGlhbG9nTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5KYXZhTWV0YWRhdGFDb252ZXJzaW9uX2VxdWl2YWxlbnRHZW5lcmF0b3JzV2FybmluZ01lc3NhZ2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2NvbnZlcnNpb24vamF2YS9FY2xpcHNlTGlua0phdmFNZXRhZGF0YUNvbnZlcnNpb25XaXphcmRQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvY29udmVyc2lvbi9qYXZhL0VjbGlwc2VMaW5rSmF2YU1ldGFkYXRhQ29udmVyc2lvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3ZDRjNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvY29udmVyc2lvbi9qYXZhL0VjbGlwc2VMaW5rSmF2YU1ldGFkYXRhQ29udmVyc2lvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzLmNvbnZlcnNpb24uamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5kaWFsb2dzLk9wdGlvbmFsTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5FbWJlZGRlZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzLlNlbGVjdEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qZmFjZS5YbWxNYXBwaW5nRmlsZVZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuU2VsZWN0TWFwcGluZ0ZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmNvbnZlcnNpb24uamF2YS5KYXZhTWV0YWRhdGFDb252ZXJzaW9uV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFY2xpcHNlTGlua0phdmFNZXRhZGF0YUNvbnZlcnNpb25XaXphcmRQYWdlCi0JZXh0ZW5kcyBKYXZhTWV0YWRhdGFDb252ZXJzaW9uV2l6YXJkUGFnZQotewotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFNZXRhZGF0YUNvbnZlcnNpb25XaXphcmRQYWdlKEpwYVByb2plY3QganBhUHJvamVjdCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIoanBhUHJvamVjdCwgdGl0bGUsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVmlld2VyRmlsdGVyIGJ1aWxkU2VsZWN0TWFwcGluZ0ZpbGVEaWFsb2dWaWV3ZXJGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgWG1sTWFwcGluZ0ZpbGVWaWV3ZXJGaWx0ZXIodGhpcy5qcGFQcm9qZWN0LCBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUGF0aCBvcGVuTmV3TWFwcGluZ0ZpbGVXaXphcmQoKSB7Ci0JCXJldHVybiBFbWJlZGRlZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVXaXphcmQuY3JlYXRlTmV3TWFwcGluZ0ZpbGUobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGhpcy5qcGFQcm9qZWN0LmdldFByb2plY3QoKSkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTZWxlY3RNYXBwaW5nRmlsZURpYWxvZyBidWlsZFNlbGVjdE1hcHBpbmdGaWxlRGlhbG9nKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVEaWFsb2codGhpcy5nZXRTaGVsbCgpLCB0aGlzLmpwYVByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSB0aGlzLnBlcnNpc3RlbmNlVW5pdDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElQYXRoIGdldERlZmF1bHRNYXBwaW5nRmlsZVJ1bnRpbVBhdGgoKSB7Ci0JCXJldHVybiBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX1JVTlRJTUVfUEFUSDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUNvbnRlbnRUeXBlIGdldE1hcHBpbmdGaWxlQ29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZpbmlzaCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc09LVG9Db252ZXJ0KCkgewotCQlpZiAodGhpcy5oYXNBbnlFcXVpdmFsZW50SmF2YU1ldGFkYXRhKCkpIHsKLQkJCXJldHVybiB0aGlzLnVzZXJXYW50c1RvQ29udGludWVXaXRoRXF1aXZhbGVudEphdmFNZXRhZGF0YSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc09LVG9Db252ZXJ0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaGFzQW55RXF1aXZhbGVudEphdmFNZXRhZGF0YSgpIHsKLQkJcmV0dXJuICh0aGlzLnBlcnNpc3RlbmNlVW5pdCAhPSBudWxsKSAmJiB0aGlzLmhhc0FueUVxdWl2YWxlbnRKYXZhTWV0YWRhdGFfKCk7Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogdGhlIHtAbGluayAjcGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlIHVuaXR9Ci0JICogaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGhhc0FueUVxdWl2YWxlbnRKYXZhTWV0YWRhdGFfKCk7Ci0KLQotCS8vICoqKioqKioqKiogZXF1aXZhbGVudCBKYXZhIG1ldGFkYXRhIHdhcm5pbmcgZGlhbG9nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB1c2VyIHdhbnRzIHRvIGNvbnRpbnVlIHRoZSBjb252ZXJzaW9uIGV2ZW4gdGhvdWdoCi0JICogdGhlIHBlcnNpc3RlbmNlIHVuaXQgY29udGFpbnMgImVxdWl2YWxlbnQiIEphdmEgbWV0YWRhdGEgKGUuZy4gb25lIG9yCi0JICogbW9yZSBvZiB0aGUgSmF2YSBxdWVyaWVzIGFyZSAiZXF1aXZhbGVudCIpLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVzZXJXYW50c1RvQ29udGludWVXaXRoRXF1aXZhbGVudEphdmFNZXRhZGF0YSgpIHsKLQkJaWYgKCAhIE9wdGlvbmFsTWVzc2FnZURpYWxvZy5pc0RpYWxvZ0VuYWJsZWQoRXF1aXZhbGVudEphdmFNZXRhZGF0YVdhcm5pbmdEaWFsb2cuSUQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsgIC8vID8KLQkJfQotCQlNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IHRoaXMuYnVpbGRFcXVpdmFsZW50SmF2YU1ldGFkYXRhV2FybmluZ0RpYWxvZygpOwotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKSA9PSBJRGlhbG9nQ29uc3RhbnRzLllFU19JRDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWVzc2FnZURpYWxvZyBidWlsZEVxdWl2YWxlbnRKYXZhTWV0YWRhdGFXYXJuaW5nRGlhbG9nKCkgewotCQlyZXR1cm4gbmV3IEVxdWl2YWxlbnRKYXZhTWV0YWRhdGFXYXJuaW5nRGlhbG9nKHRoaXMuZ2V0U2hlbGwoKSwgdGhpcy5nZXRFcXVpdmFsZW50SmF2YU1ldGFkYXRhV2FybmluZ0RpYWxvZ1RpdGxlKCksIHRoaXMuZ2V0RXF1aXZhbGVudEphdmFNZXRhZGF0YVdhcm5pbmdEaWFsb2dNZXNzYWdlKCkpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RXF1aXZhbGVudEphdmFNZXRhZGF0YVdhcm5pbmdEaWFsb2dUaXRsZSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRFcXVpdmFsZW50SmF2YU1ldGFkYXRhV2FybmluZ0RpYWxvZ01lc3NhZ2UoKTsKLQotCi0JLyogQ1UgcHJpdmF0ZSAqLyBzdGF0aWMgY2xhc3MgRXF1aXZhbGVudEphdmFNZXRhZGF0YVdhcm5pbmdEaWFsb2cKLQkJZXh0ZW5kcyBPcHRpb25hbE1lc3NhZ2VEaWFsb2cKLQl7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiZG9udFNob3dFcXVpdmFsZW50TWV0YWRhdGFFeGlzdGluZy53YXJuaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JCUVxdWl2YWxlbnRKYXZhTWV0YWRhdGFXYXJuaW5nRGlhbG9nKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotCQkJc3VwZXIoSUQsIHBhcmVudCwgdGl0bGUsIG1lc3NhZ2UsIE1lc3NhZ2VEaWFsb2cuV0FSTklORywKLQkJCQkJbmV3IFN0cmluZ1tdIHtJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTH0sCi0JCQkJCTEpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJdGhpcy5jcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLllFU19JRCwgSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsIGZhbHNlKTsKLQkJCXRoaXMuY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5OT19JRCwgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwgdHJ1ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvY29udmVyc2lvbi9qYXZhL0VjbGlwc2VMaW5rSmF2YVF1ZXJ5Q29udmVyc2lvbldpemFyZFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9jb252ZXJzaW9uL2phdmEvRWNsaXBzZUxpbmtKYXZhUXVlcnlDb252ZXJzaW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTJjZTY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9jb252ZXJzaW9uL2phdmEvRWNsaXBzZUxpbmtKYXZhUXVlcnlDb252ZXJzaW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5jb252ZXJzaW9uLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmNvbnZlcnNpb24uamF2YS5HZW5lcmljSmF2YVF1ZXJ5Q29udmVyc2lvbldpemFyZFBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFRdWVyeUNvbnZlcnNpb25XaXphcmRQYWdlCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFNZXRhZGF0YUNvbnZlcnNpb25XaXphcmRQYWdlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rSmF2YVF1ZXJ5Q29udmVyc2lvbldpemFyZFBhZ2UoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCXN1cGVyKGpwYVByb2plY3QsIEpwdFVpTWVzc2FnZXMuSmF2YVF1ZXJ5Q29udmVyc2lvbldpemFyZFBhZ2VfdGl0bGUsIEpwdFVpTWVzc2FnZXMuSmF2YVF1ZXJ5Q29udmVyc2lvbldpemFyZFBhZ2VfZGVzY3JpcHRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGhhc0NvbnZlcnRpYmxlSmF2YU1ldGFkYXRhXygpIHsKLQkJcmV0dXJuIHRoaXMucGVyc2lzdGVuY2VVbml0Lmhhc0NvbnZlcnRpYmxlSmF2YVF1ZXJpZXMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1pc3NpbmdKYXZhTWV0YWRhdGFXYXJuaW5nTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwdFVpTWVzc2FnZXMuSmF2YU1ldGFkYXRhQ29udmVyc2lvbl9ub1F1ZXJpZXNUb0NvbnZlcnQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnZlcnNpb25Db21tYW5kLlN0cmF0ZWd5IGdldENvbnZlcnNpb25Db21tYW5kU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBHZW5lcmljSmF2YVF1ZXJ5Q29udmVyc2lvbldpemFyZFBhZ2UuQ09OVkVSU0lPTl9DT01NQU5EX1NUUkFURUdZOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGhhc0FueUVxdWl2YWxlbnRKYXZhTWV0YWRhdGFfKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5oYXNBbnlFcXVpdmFsZW50SmF2YVF1ZXJpZXMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEVxdWl2YWxlbnRKYXZhTWV0YWRhdGFXYXJuaW5nRGlhbG9nVGl0bGUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuSmF2YU1ldGFkYXRhQ29udmVyc2lvbl9lcXVpdmFsZW50UXVlcmllc1dhcm5pbmdUaXRsZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEVxdWl2YWxlbnRKYXZhTWV0YWRhdGFXYXJuaW5nRGlhbG9nTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5KYXZhTWV0YWRhdGFDb252ZXJzaW9uX2VxdWl2YWxlbnRRdWVyaWVzV2FybmluZ01lc3NhZ2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9EeW5hbWljRGVmYXVsdFRhYmxlR2VuZXJhdGlvbldpemFyZFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vRHluYW1pY0RlZmF1bHRUYWJsZUdlbmVyYXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YzM4ZjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9EeW5hbWljRGVmYXVsdFRhYmxlR2VuZXJhdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzLlNlbGVjdEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qZmFjZS5YbWxNYXBwaW5nRmlsZVZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuU2VsZWN0TWFwcGluZ0ZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5FbnRpdHlXaXphcmRNc2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmdlbi5EZWZhdWx0VGFibGVHZW5lcmF0aW9uV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgRHluYW1pY0RlZmF1bHRUYWJsZUdlbmVyYXRpb25XaXphcmRQYWdlIGV4dGVuZHMKLQkJRGVmYXVsdFRhYmxlR2VuZXJhdGlvbldpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBMYWJlbCB4bWxNYXBwaW5nRmlsZUxhYmVsOwotCXByaXZhdGUgVGV4dCB4bWxNYXBwaW5nRmlsZVRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24geG1sTWFwcGluZ0ZpbGVCcm93c2VCdXR0b247Ci0KLQlwdWJsaWMgRHluYW1pY0RlZmF1bHRUYWJsZUdlbmVyYXRpb25XaXphcmRQYWdlKEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlzdXBlcihqcGFQcm9qZWN0KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJaW50IG5Db2x1bW5zPSA0CQk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBuQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQl0aGlzLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSnBhSGVscENvbnRleHRJZHMuR0VORVJBVEVfRU5USVRJRVNfV0laQVJEX0NVU1RPTUlaRV9ERUZBVUxUX0VOVElUWV9HRU5FUkFUSU9OKTsKLQotCQljcmVhdGVYbWxNYXBwaW5nRmlsZUdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZURvbWFpbkphdmFDbGFzc2VzUHJvcGVydGllc0dyb3VwKGNvbXBvc2l0ZSwgNCk7Ci0JCWRlZmF1bHRUYWJsZUdlblBhbmVsID0gbmV3IER5bmFtaWNUYWJsZUdlblBhbmVsKGNvbXBvc2l0ZSwgNCwgdHJ1ZSwgdGhpcyk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCQkKLQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoIHRydWUgKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEb21haW5KYXZhQ2xhc3Nlc1Byb3BlcnRpZXNHcm91cChDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgY29sdW1ucykgewotCQlHcm91cCBwYXJlbnQgPSBuZXcgR3JvdXAoIGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0VGV4dCggSnB0SnBhRWNsaXBzZUxpbmtVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRHluYW1pY0VudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfZG9tYWluSmF2YUNsYXNzKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCggY29sdW1ucywgZmFsc2UpKTsKLQkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxTcGFuID0gY29sdW1uczsKLQkJbGF5b3V0RGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJbGF5b3V0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJbGF5b3V0RGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQotCQljcmVhdGVQYWNrYWdlQ29udHJvbHMocGFyZW50LCBjb2x1bW5zKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVhtbE1hcHBpbmdGaWxlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CQotCi0JCXRoaXMueG1sTWFwcGluZ0ZpbGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJdGhpcy54bWxNYXBwaW5nRmlsZUxhYmVsLnNldFRleHQoSnB0SnBhRWNsaXBzZUxpbmtVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRHluYW1pY0VudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfeG1sTWFwcGluZ0ZpbGUpOwotCQl0aGlzLnhtbE1hcHBpbmdGaWxlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotCQl0aGlzLnhtbE1hcHBpbmdGaWxlVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQl0aGlzLnhtbE1hcHBpbmdGaWxlVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCi0JCXRoaXMueG1sTWFwcGluZ0ZpbGVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaGFuZGxlWG1sTWFwcGluZ0ZpbGVUZXh0TW9kaWZpZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0aGlzLnhtbE1hcHBpbmdGaWxlQnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJdGhpcy54bWxNYXBwaW5nRmlsZUJyb3dzZUJ1dHRvbi5zZXRUZXh0KEVudGl0eVdpemFyZE1zZy5CUk9XU0VfQlVUVE9OX0xBQkVMKTsKLQkJR3JpZERhdGEgYnJvd3NlQnV0dG9uRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlicm93c2VCdXR0b25EYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJdGhpcy54bWxNYXBwaW5nRmlsZUJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGJyb3dzZUJ1dHRvbkRhdGEpOwkJCi0JCXRoaXMueG1sTWFwcGluZ0ZpbGVCcm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVhtbE1hcHBpbmdGaWxlQnV0dG9uUHJlc3NlZCgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVhtbE1hcHBpbmdGaWxlVGV4dE1vZGlmaWVkKCkgewotCQl0aGlzLmdldEN1c3RvbWl6ZXIoKS5zZXRYbWxNYXBwaW5nRmlsZSh0aGlzLnhtbE1hcHBpbmdGaWxlVGV4dC5nZXRUZXh0KCkpOwotLy8JCXZhbGlkYXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVhtbE1hcHBpbmdGaWxlQnV0dG9uUHJlc3NlZCgpIHsJCQotCi0JCVZpZXdlckZpbHRlciBmaWx0ZXIgPSBnZXREaWFsb2dWaWV3ZXJGaWx0ZXIodGhpcy5qcGFQcm9qZWN0KTsKLQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpOwotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKTsKLQkJU2VsZWN0TWFwcGluZ0ZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IFNlbGVjdEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVEaWFsb2coZ2V0U2hlbGwoKSwgdGhpcy5qcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbGFiZWxQcm92aWRlciwgY29udGVudFByb3ZpZGVyKTsKLQkJZGlhbG9nLnNldFRpdGxlKEpwdFVpTWVzc2FnZXMuU2VsZWN0TWFwcGluZ0ZpbGVEaWFsb2dfdGl0bGUpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShKcHRVaU1lc3NhZ2VzLlNlbGVjdE1hcHBpbmdGaWxlRGlhbG9nX21lc3NhZ2UpOwotCQlkaWFsb2cuYWRkRmlsdGVyKGZpbHRlcik7Ci0JCQkKLQkJU3RyaW5nIG9ybUZpbGVOYW1lID0gdGhpcy54bWxNYXBwaW5nRmlsZVRleHQuZ2V0VGV4dCgpOwotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IGpwYVByb2plY3QuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aChvcm1GaWxlTmFtZSkpOwotCQlJRmlsZSBpbml0aWFsU2VsZWN0aW9uID0gKHJlc291cmNlICE9IG51bGwpID8gcmVzb3VyY2UuZ2V0RmlsZSgpIDogbnVsbDsKLQkJZGlhbG9nLnNldElucHV0KHRoaXMuanBhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCi0JCWlmIChpbml0aWFsU2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCWRpYWxvZy5zZXRJbml0aWFsU2VsZWN0aW9uKGluaXRpYWxTZWxlY3Rpb24pOwotCQl9Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJU3RyaW5nIGNob3Nlbk5hbWUgPSBkaWFsb2cuZ2V0Q2hvc2VuTmFtZSgpOwotCQkJdGhpcy54bWxNYXBwaW5nRmlsZVRleHQuc2V0VGV4dChjaG9zZW5OYW1lKTsKLQkJCXRoaXMuZ2V0Q3VzdG9taXplcigpLnNldFhtbE1hcHBpbmdGaWxlKGNob3Nlbk5hbWUpOwotCQl9Ci0vLwkJdmFsaWRhdGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFZpZXdlckZpbHRlciBnZXREaWFsb2dWaWV3ZXJGaWx0ZXIoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgWG1sTWFwcGluZ0ZpbGVWaWV3ZXJGaWx0ZXIoanBhUHJvamVjdCwgSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZih2aXNpYmxlKXsKLQkJCXRoaXMueG1sTWFwcGluZ0ZpbGVUZXh0LnNldFRleHQodGhpcy5nZXRDdXN0b21pemVyKCkuZ2V0WG1sTWFwcGluZ0ZpbGUoKSk7Ci0vLwkJCXZhbGlkYXRlKCk7Ci0JCX0KLQl9Ci0JCi0vLwlwcml2YXRlIHZvaWQgdmFsaWRhdGUoKSB7Ci0vLwkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0vLwkJSnBhWG1sUmVzb3VyY2Ugb3JtWG1sUmVzb3VyY2UgPSBnZXRPcm1YbWxSZXNvdXJjZSgpOwotLy8JCWlmIChvcm1YbWxSZXNvdXJjZSA9PSBudWxsKSB7Ci0vLwkJCWVycm9yTWVzc2FnZSA9IEpwdFVpTWVzc2FnZXMuSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX21hcHBpbmdGaWxlRG9lc05vdEV4aXN0RXJyb3I7Ci0vLwkJfQotLy8JCXNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotLy8JCXNldFBhZ2VDb21wbGV0ZShlcnJvck1lc3NhZ2UgPT0gbnVsbCk7Ci0vLwl9Ci0JCi0JcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlIGdldE9ybVhtbFJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0LmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UobmV3IFBhdGgodGhpcy54bWxNYXBwaW5nRmlsZVRleHQuZ2V0VGV4dCgpKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9EeW5hbWljVGFibGVHZW5QYW5lbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9EeW5hbWljVGFibGVHZW5QYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWNjMzU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vRHluYW1pY1RhYmxlR2VuUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5nZW4uSnB0VWlFbnRpdHlHZW5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZ2VuLlRhYmxlR2VuUGFuZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci0KLQotcHVibGljIGNsYXNzIER5bmFtaWNUYWJsZUdlblBhbmVsIGV4dGVuZHMgVGFibGVHZW5QYW5lbCB7Ci0JCi0JcHVibGljIER5bmFtaWNUYWJsZUdlblBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW5zICwgYm9vbGVhbiBpc0RlZmF1bHRUYWJsZSwgV2l6YXJkUGFnZSB3aXphcmRQYWdlKXsKLQkJc3VwZXIocGFyZW50LCBjb2x1bW5zLCBpc0RlZmF1bHRUYWJsZSwgd2l6YXJkUGFnZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGVNYXBwaW5nUHJvcGVydGllc0dyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBjb2x1bW5zKSB7Ci0JCUdyb3VwIHBhcmVudCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FICk7Ci0JCXBhcmVudC5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV90YWJsZU1hcHBpbmcpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KGNvbHVtbnMsIGZhbHNlKSk7Ci0JCUdyaWREYXRhIGxheW91dERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJbGF5b3V0RGF0YS5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbnM7Ci0JCWxheW91dERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJbGF5b3V0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWxheW91dERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWxheW91dERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSBmYWxzZTsKLQkJcGFyZW50LnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCQotCQljcmVhdGVDbGFzc05hbWVDb250cm9sKHBhcmVudCwgY29sdW1ucyk7Ci0JCQotCQljcmVhdGVJZEdlbmVyYXRvckNvbnRyb2xzKHBhcmVudCwgY29sdW1ucyk7Ci0JCQotCQkvL0Fzc29jaWF0aW9uRmV0Y2ggYW5kIENvbGxlY3Rpb25UeXBlIG9ubHkgYXZhaWxhYmxlIGZvciBkZWZhdWx0IHRhYmxlIGdlbmVyYXRpb24KLQkJaWYgKCBpc0RlZmF1bHRUYWJsZSApIHsKLQkJCWNyZWF0ZUFzc29jaWF0aW9uRmV0Y2hDb250cm9scyhwYXJlbnQsIGNvbHVtbnMpOwotCQkJY3JlYXRlQ29sbGVjdGlvblR5cGVDb250cm9scyhwYXJlbnQsIGNvbHVtbnMpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUFjY2Vzc0NvbnRyb2xzKCl7Ci0JCS8vZG8gbm90aGluZywgbm90IGFwcGxpY2FibGUgZm9yIER5bmFtaWMKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlR2VuZXJhdGVPcHRpb25hbEFubm90YXRpb25Db250cm9scygpewotCQkvL2RvIG5vdGhpbmcsIG5vdCBhcHBsaWNhYmxlIGZvciBEeW5hbWljCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0R5bmFtaWNUYWJsZXNBbmRDb2x1bW5zQ3VzdG9taXphdGlvbldpemFyZFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vRHluYW1pY1RhYmxlc0FuZENvbHVtbnNDdXN0b21pemF0aW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTc3ZDMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vRHluYW1pY1RhYmxlc0FuZENvbHVtbnNDdXN0b21pemF0aW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC5PUk1HZW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwuT1JNR2VuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmdlbi5Db2x1bW5HZW5QYW5lbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZ2VuLlRhYmxlc0FuZENvbHVtbnNDdXN0b21pemF0aW9uV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBEeW5hbWljVGFibGVzQW5kQ29sdW1uc0N1c3RvbWl6YXRpb25XaXphcmRQYWdlIGV4dGVuZHMKLQkJVGFibGVzQW5kQ29sdW1uc0N1c3RvbWl6YXRpb25XaXphcmRQYWdlIHsKLQotCXB1YmxpYyBEeW5hbWljVGFibGVzQW5kQ29sdW1uc0N1c3RvbWl6YXRpb25XaXphcmRQYWdlKEpwYVByb2plY3QganBhUHJvamVjdCwgUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcikgewotCQlzdXBlcihqcGFQcm9qZWN0LCByZXNvdXJjZU1hbmFnZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUYWJlbEdlbkRldGFpbChPUk1HZW5UYWJsZSB0YWJsZSkgewotCQl0aGlzLnNlbGVjdGVkVGFibGUgPSB0YWJsZTsKLQkJaWYodGFibGVHZW5EZXRhdGlsR3JvdXA9PW51bGwpewotCQkJdGFibGVHZW5EZXRhdGlsR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGRldGFpbFBhbmVsLCBTV1QuTk9ORSk7Ci0JCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gNDsKLQkJCXRhYmxlR2VuRGV0YXRpbEdyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJCQotCQkJdGhpcy50YWJsZUdlblBhbmVsID0gbmV3IER5bmFtaWNUYWJsZUdlblBhbmVsKHRhYmxlR2VuRGV0YXRpbEdyb3VwLCA0ICwgZmFsc2UsIHRoaXMgKTsKLQotCQl9Ci0JCXRoaXMudGFibGVHZW5QYW5lbC5zZXRPUk1HZW5UYWJsZSh0YWJsZSk7Ci0JCXRoaXMudGFibGVHZW5QYW5lbC51cGRhdGVDb250cm9scygpOwotCQkKLQkJdGhpcy5kZXRhaWxQYW5lbFN0YXRja0xheW91dC50b3BDb250cm9sID0gdGFibGVHZW5EZXRhdGlsR3JvdXA7Ci0JCXRoaXMuZGV0YWlsUGFuZWwubGF5b3V0KCk7CQkKLQotCQlTdHJpbmcgYmFzZUNsYXNzID0gU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0YWJsZS5nZXRFeHRlbmRzKCkpID8gIiIgOiB0YWJsZS5nZXRFeHRlbmRzKCk7Ci0JCXNldFN1cGVyQ2xhc3MoYmFzZUNsYXNzLCB0cnVlKTsJCQkKLQkJc2V0U3VwZXJJbnRlcmZhY2VzKHRhYmxlLmdldEltcGxlbWVudHMoKSwgdHJ1ZSk7Ci0JCQotCQlkZXRhaWxQYW5lbC5nZXRQYXJlbnQoKS5sYXlvdXQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb2x1bW5HZW5EZXRhaWwoT1JNR2VuQ29sdW1uIGNvbHVtbikgewotCQlpZihjb2x1bW5HZW5EZXRhdGlsR3JvdXA9PW51bGwpewotCQkJY29sdW1uR2VuRGV0YXRpbEdyb3VwID0gbmV3IENvbXBvc2l0ZShkZXRhaWxQYW5lbCwgU1dULk5PTkUpOwotCQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDQ7Ci0JCQljb2x1bW5HZW5EZXRhdGlsR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQkJdGhpcy5jb2x1bW5HZW5QYW5lbCA9IG5ldyBDb2x1bW5HZW5QYW5lbChjb2x1bW5HZW5EZXRhdGlsR3JvdXAsIDQsIGdldEN1c3RvbWl6ZXIoKSAsIHRoaXMsIHRydWUpOwotCQl9Ci0JCWNvbHVtbkdlblBhbmVsLnNldENvbHVtbihjb2x1bW4pOwotCQl0aGlzLmRldGFpbFBhbmVsU3RhdGNrTGF5b3V0LnRvcENvbnRyb2wgPSBjb2x1bW5HZW5EZXRhdGlsR3JvdXA7Ci0JCXRoaXMuZGV0YWlsUGFuZWwubGF5b3V0KCk7CQkKLQkJZGV0YWlsUGFuZWwuZ2V0UGFyZW50KCkubGF5b3V0KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRHluYW1pYygpewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0dlbmVyYXRlRHluYW1pY0VudGl0aWVzRnJvbVNjaGVtYVdpemFyZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9HZW5lcmF0ZUR5bmFtaWNFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlhZjI1Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0dlbmVyYXRlRHluYW1pY0VudGl0aWVzRnJvbVNjaGVtYVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUnVsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLlByb2plY3RSZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5wbGF0Zm9ybS5FY2xpcHNlTGlua1BsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC5PUk1HZW5DdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmdlbi5HZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZ2VuLlByb21wdEpQQVByb2plY3RXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5nZW4uVGFibGVBc3NvY2lhdGlvbnNXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5nZW4uVGFibGVzU2VsZWN0b3JXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZUR5bmFtaWNFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQgZXh0ZW5kcyBHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCAKLQlpbXBsZW1lbnRzIElOZXdXaXphcmQgIHsJCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVMUF9DT05URVhUX0lEID0gSnB0SnBhVWlQbHVnaW4uUExVR0lOX0lEICsgIi5HZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHVibGljIEdlbmVyYXRlRHluYW1pY0VudGl0aWVzRnJvbVNjaGVtYVdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZXRXaW5kb3dUaXRsZShKcHRKcGFFY2xpcHNlTGlua1VpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVEeW5hbWljRW50aXRpZXNXaXphcmRfZ2VuZXJhdGVFbnRpdGllcyk7Ci0JfQotCQotCXB1YmxpYyBHZW5lcmF0ZUR5bmFtaWNFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQoIEpwYVByb2plY3QganBhUHJvamVjdCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKGpwYVByb2plY3QsIHNlbGVjdGlvbik7Ci0JCXRoaXMuc2V0V2luZG93VGl0bGUoSnB0SnBhRWNsaXBzZUxpbmtVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRHluYW1pY0VudGl0aWVzV2l6YXJkX2dlbmVyYXRlRW50aXRpZXMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZE1haW5QYWdlcygpIHsKLQkJdGhpcy50YWJsZXNTZWxlY3RvclBhZ2UgPSBuZXcgVGFibGVzU2VsZWN0b3JXaXphcmRQYWdlKHRoaXMuanBhUHJvamVjdCwgdGhpcy5yZXNvdXJjZU1hbmFnZXIsIHRydWUpOwotCQl0aGlzLmFkZFBhZ2UodGhpcy50YWJsZXNTZWxlY3RvclBhZ2UpOwotCQkKLQkJdGhpcy50YWJsZUFzc29jaWF0aW9uc1BhZ2UgPSBuZXcgVGFibGVBc3NvY2lhdGlvbnNXaXphcmRQYWdlKHRoaXMuanBhUHJvamVjdCwgdGhpcy5yZXNvdXJjZU1hbmFnZXIpOwotCQl0aGlzLmFkZFBhZ2UodGhpcy50YWJsZUFzc29jaWF0aW9uc1BhZ2UpOwotCi0JCXRoaXMuZGVmYXVsdFRhYmxlR2VuZXJhdGlvblBhZ2UgPSBuZXcgRHluYW1pY0RlZmF1bHRUYWJsZUdlbmVyYXRpb25XaXphcmRQYWdlKHRoaXMuanBhUHJvamVjdCk7Ci0JCXRoaXMuYWRkUGFnZSh0aGlzLmRlZmF1bHRUYWJsZUdlbmVyYXRpb25QYWdlKTsKLQkJdGhpcy5kZWZhdWx0VGFibGVHZW5lcmF0aW9uUGFnZS5pbml0KHRoaXMuc2VsZWN0aW9uKTsKLQkJCi0JCXRoaXMudGFibGVzQW5kQ29sdW1uc0N1c3RvbWl6YXRpb25QYWdlID0gbmV3IER5bmFtaWNUYWJsZXNBbmRDb2x1bW5zQ3VzdG9taXphdGlvbldpemFyZFBhZ2UodGhpcy5qcGFQcm9qZWN0LCB0aGlzLnJlc291cmNlTWFuYWdlcik7Ci0JCXRoaXMuYWRkUGFnZSh0aGlzLnRhYmxlc0FuZENvbHVtbnNDdXN0b21pemF0aW9uUGFnZSk7Ci0JCXRoaXMudGFibGVzQW5kQ29sdW1uc0N1c3RvbWl6YXRpb25QYWdlLmluaXQodGhpcy5zZWxlY3Rpb24pOwkJCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9taXphdGlvbkZpbGVOYW1lKCkgewotCQlDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlID0gZ2V0UHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCVN0cmluZyBjb25uZWN0aW9uID0gcHJvZmlsZSA9PSBudWxsID8gIiIgOiBwcm9maWxlLmdldE5hbWUoKTsKLQkJU3RyaW5nIG5hbWUgPSAib3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uZHluYW1pYy4iICsgKGNvbm5lY3Rpb24gPT0gbnVsbCA/ICIiIDpjb25uZWN0aW9uLnJlcGxhY2UoJyAnLCAnLScpKTsgIC8vJE5PTi1OTFMtMSQKLQkJU2NoZW1hIHNjaGVtYSA9IGdldERlZmF1bHRTY2hlbWEoKTsKLQkJaWYgKCBzY2hlbWEhPSBudWxsICApIHsKLQkJCW5hbWUgKz0gIi4iICsgc2NoZW1hLmdldE5hbWUoKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2NoZWR1bGVHZW5lcmF0ZUVudGl0aWVzSm9iKAotCQkJT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lcikgewotCQlXb3Jrc3BhY2VKb2IgZ2VuRW50aXRpZXNKb2IgPSBuZXcgR2VuZXJhdGVFbnRpdGllc0pvYih0aGlzLmpwYVByb2plY3QsIGdldEN1c3RvbWl6ZXIoKSwgb3ZlcndyaXRlQ29uZmlybWVyLCB0cnVlKTsKLQkJZ2VuRW50aXRpZXNKb2Iuc2NoZWR1bGUoKTsKLQkJCi0JCS8vb3BlbiBmaWxlIGFmdGVyIGdlbmVyYXRpb24KLQkJU3RyaW5nIHhtbE1hcHBpbmdGaWxlTG9jYXRpb24gPSBnZXRDdXN0b21pemVyKCkuZ2V0WG1sTWFwcGluZ0ZpbGUoKTsKLQkJSnBhWG1sUmVzb3VyY2UganBhWG1sUmVzb3VyY2UgPSB0aGlzLmpwYVByb2plY3QuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCh4bWxNYXBwaW5nRmlsZUxvY2F0aW9uKSk7Ci0JCUlGaWxlIG1hcHBpbmdGaWxlOwotCQlpZihqcGFYbWxSZXNvdXJjZSE9bnVsbCl7Ci0JCQltYXBwaW5nRmlsZSA9IGpwYVhtbFJlc291cmNlLmdldEZpbGUoKTsKLQkJfQotCQllbHNlewotCQkJSVByb2plY3QgcHJvamVjdCA9IGpwYVByb2plY3QuZ2V0UHJvamVjdCgpOwotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSAoKFByb2plY3RSZXNvdXJjZUxvY2F0b3IpIHByb2plY3QuZ2V0QWRhcHRlcihQcm9qZWN0UmVzb3VyY2VMb2NhdG9yLmNsYXNzKSkuZ2V0RGVmYXVsdFJlc291cmNlTG9jYXRpb24oKTsKLQkJCW1hcHBpbmdGaWxlID0gY29udGFpbmVyLmdldEZpbGUobmV3IFBhdGgoeG1sTWFwcGluZ0ZpbGVMb2NhdGlvbi5zdWJzdHJpbmcoeG1sTWFwcGluZ0ZpbGVMb2NhdGlvbi5sYXN0SW5kZXhPZigiLyIpKSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJT3BlblhtbE1hcHBpbmdGaWxlSm9iIG9wZW5YbWxNYXBwaW5nRmlsZUpvYiA9IG5ldyBPcGVuWG1sTWFwcGluZ0ZpbGVKb2IodGhpcy5qcGFQcm9qZWN0LCBtYXBwaW5nRmlsZSk7Ci0JCW9wZW5YbWxNYXBwaW5nRmlsZUpvYi5zY2hlZHVsZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlci5pbml0KHdvcmtiZW5jaCwgc2VsZWN0aW9uKTsKLQkJCi0JCXRoaXMuc2V0V2luZG93VGl0bGUoSnB0SnBhRWNsaXBzZUxpbmtVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRHluYW1pY0VudGl0aWVzV2l6YXJkX2dlbmVyYXRlRW50aXRpZXMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9tcHRKUEFQcm9qZWN0V2l6YXJkUGFnZSBidWlsZFByb2plY3RXaXphcmRQYWdlKCkgewotCQlyZXR1cm4gbmV3IFByb21wdEVjbGlwc2VMaW5rUHJvamVjdFdpemFyZFBhZ2UoSEVMUF9DT05URVhUX0lEKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9qZWN0SXNWYWxpZFNlbGVjdGlvbihKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJaWYoanBhUHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGpwYVByb2plY3QuZ2V0SnBhUGxhdGZvcm0oKS5nZXREZXNjcmlwdGlvbigpLmdldEdyb3VwKCkuZ2V0SWQoKS4KLQkJCWVxdWFscyhFY2xpcHNlTGlua1BsYXRmb3JtLkdST1VQLmdldElkKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT1JNR2VuQ3VzdG9taXplciBjcmVhdGVPUk1HZW5DdXN0b21pemVyKFNjaGVtYSBzY2hlbWEpIHsKLQkJT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyID0gc3VwZXIuY3JlYXRlT1JNR2VuQ3VzdG9taXplcihzY2hlbWEpOwotCQljdXN0b21pemVyLnNldFBsYXRmb3JtVmVyc2lvbihnZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKS5nZXRKcGFWZXJzaW9uKCkuZ2V0VmVyc2lvbigpKTsKLQkJcmV0dXJuIGN1c3RvbWl6ZXI7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogb3BlbiB4bWwgbWFwcGluZyBmaWxlIGpvYiAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBPcGVuWG1sTWFwcGluZ0ZpbGVKb2IgZXh0ZW5kcyBXb3Jrc3BhY2VKb2IgewotCQlwcml2YXRlIGZpbmFsIEpwYVByb2plY3QganBhUHJvamVjdDsKLQkJcHJpdmF0ZSBmaW5hbCBJRmlsZSBtYXBwaW5nRmlsZTsKLQotCQlwdWJsaWMgT3BlblhtbE1hcHBpbmdGaWxlSm9iKEpwYVByb2plY3QganBhUHJvamVjdCwgSUZpbGUgbWFwcGluZ0ZpbGUpIHsKLQkJCXN1cGVyKCJPcGVuIFhNTCBGaWxlIik7Ci0JCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCQkJdGhpcy5tYXBwaW5nRmlsZSA9IG1hcHBpbmdGaWxlOwotCQkJSVJlc291cmNlUnVsZUZhY3RvcnkgcnVsZUZhY3RvcnkgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKTsKLQkJCXRoaXMuc2V0UnVsZShydWxlRmFjdG9yeS5tb2RpZnlSdWxlKGpwYVByb2plY3QuZ2V0UHJvamVjdCgpKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQl0cnkgewotCQkJCXBvc3RHZW5lcmF0aW9uKHRoaXMuanBhUHJvamVjdCx0aGlzLm1hcHBpbmdGaWxlKTsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbi5QTFVHSU5fSUQsICJlcnJvciIsIGUpKTsKLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgcG9zdEdlbmVyYXRpb24oSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJRmlsZSBtYXBwaW5nRmlsZSkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJdHJ5IHsKLQkJCQlvcGVuRWRpdG9yKG1hcHBpbmdGaWxlKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gY2FudE9wZW4pIHsKLQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihjYW50T3Blbik7Ci0JCQl9IAotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcihmaW5hbCBJRmlsZSBmaWxlKSB7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJU1dUVXRpbC5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlLCB0cnVlKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJSnB0SnBhVWlQbHVnaW4ubG9nKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0pwdEpwYUVjbGlwc2VMaW5rVWlFbnRpdHlHZW5NZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9KcHRKcGFFY2xpcHNlTGlua1VpRW50aXR5R2VuTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQzNDY5OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0pwdEpwYUVjbGlwc2VMaW5rVWlFbnRpdHlHZW5NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEpwdEpwYUVjbGlwc2VMaW5rVWlFbnRpdHlHZW5NZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImVjbGlwc2VsaW5rX3VpX2R5bmFtaWNfZW50aXR5X2dlbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBKcHRKcGFFY2xpcHNlTGlua1VpRW50aXR5R2VuTWVzc2FnZXMuY2xhc3M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUR5bmFtaWNFbnRpdGllc1dpemFyZF9nZW5lcmF0ZUVudGl0aWVzOwotCQotCS8vRGVmYXVsdCB0YWJsZSBnZW4gcHJvcGVydGllcwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRHluYW1pY0VudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfZG9tYWluSmF2YUNsYXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRHluYW1pY0VudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfeG1sTWFwcGluZ0ZpbGU7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBCVU5ETEVfQ0xBU1MpOwotCX0KLQotCXByaXZhdGUgSnB0SnBhRWNsaXBzZUxpbmtVaUVudGl0eUdlbk1lc3NhZ2VzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vUHJvbXB0RWNsaXBzZUxpbmtQcm9qZWN0V2l6YXJkUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9Qcm9tcHRFY2xpcHNlTGlua1Byb2plY3RXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OTM4MmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9Qcm9tcHRFY2xpcHNlTGlua1Byb2plY3RXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5wbGF0Zm9ybS5FY2xpcHNlTGlua1BsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5nZW4uUHJvbXB0SlBBUHJvamVjdFdpemFyZFBhZ2U7Ci0KLS8qKgotICogIFByb21wdEVjbGlwc2VMaW5rUHJvamVjdFdpemFyZFBhZ2UKLSAqLwotcHVibGljIGNsYXNzIFByb21wdEVjbGlwc2VMaW5rUHJvamVjdFdpemFyZFBhZ2UgZXh0ZW5kcyBQcm9tcHRKUEFQcm9qZWN0V2l6YXJkUGFnZQotewotCi0JcHVibGljIFByb21wdEVjbGlwc2VMaW5rUHJvamVjdFdpemFyZFBhZ2UoU3RyaW5nIGhlbHBDb250ZXh0SWQpIHsKLQkJc3VwZXIoaGVscENvbnRleHRJZCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvamVjdElzVmFsaWRTZWxlY3Rpb24oSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCWlmKGpwYVByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBqcGFQcm9qZWN0LmdldEpwYVBsYXRmb3JtKCkuZ2V0RGVzY3JpcHRpb24oKS5nZXRHcm91cCgpLmdldElkKCkuCi0JCQkJCQkJZXF1YWxzKEVjbGlwc2VMaW5rUGxhdGZvcm0uR1JPVVAuZ2V0SWQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NGExN2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudWk8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLnVpPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3NzUxZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnV0aWxpdHk8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkgYW5kIG1vdmVkIHRvIGNvbW1vbiBjb21wb25lbnQ8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVjYTM1Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjUyZmQ0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byByZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0czwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8ucHJvamVjdCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZmZiMWQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PnJlbmFtZWQgdG8gb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0czwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8ucHJvamVjdCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFhZWY3MS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PnJlbmFtZWQgdG8gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvLnByb2plY3QgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzZDg4Ny4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLmNsYXNzcGF0aCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlM2UwM2IuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvanBhL3VpLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5jdnNpZ25vcmUgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NzgzYTUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM5YThjZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVHVlIE1hciAwOCAxMjowODozNCBFU1QgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYmFkODUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAzLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuRXh0ZW5zaW9uVGVzdFBsdWdpbgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIsCi0gb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwsCi0gb3JnLmVjbGlwc2Uuc3d0LAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWksCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvYWJvdXQuaHRtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExMTYzYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTU4Nzg5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFeHRlbnNpb24gVGVzdHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9wbHVnaW4ueG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ3YThkMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvRXh0ZW5zaW9uVGVzdFBsdWdpbi5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvRXh0ZW5zaW9uVGVzdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTVjZDZlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0V4dGVuc2lvblRlc3RQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25UZXN0UGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgRXh0ZW5zaW9uVGVzdFBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEV4dGVuc2lvblRlc3RQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBFeHRlbnNpb25UZXN0UGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQwOTk0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPEFubm90YXRpb24+Ci17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAidGVzdEF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FUVFJJQlVURV9BTk5PVEFUSU9OX05BTUUgPSAidGVzdC5UZXN0QXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLlRFU1RfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcuVEVTVF9BVFRSSUJVVEVfQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBiYThkYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLlRFU1RfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcuVEVTVF9BVFRSSUJVVEVfQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKFRlc3RKcGFGYWN0b3J5KSBmYWN0b3J5KS5idWlsZEphdmFUZXN0QXR0cmlidXRlTWFwcGluZyhwZXJzaXN0ZW50QXR0cmlidXRlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdFR5cGVNYXBwaW5nLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdFR5cGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MGRhMzMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RUeXBlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YVR5cGVNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgSmF2YVRlc3RUeXBlTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmc8QW5ub3RhdGlvbj4KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RZUEVfTUFQUElOR19LRVkgPSAidGVzdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RZUEVfQU5OT1RBVElPTl9OQU1FID0gInRlc3QuVGVzdCI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIEphdmFUZXN0VHlwZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gVEVTVF9UWVBFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0SWRDbGFzcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNYXBwZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UXVlcnk+IGdldFF1ZXJpZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RUeXBlTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0VHlwZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMGJlMjYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RUeXBlTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YVRlc3RUeXBlTWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEphdmFUZXN0VHlwZU1hcHBpbmcuVEVTVF9UWVBFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKYXZhVGVzdFR5cGVNYXBwaW5nLlRFU1RfVFlQRV9BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVRlc3RUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlLCBBbm5vdGF0aW9uIGFubm90YXRpb24sIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gKChUZXN0SnBhRmFjdG9yeSkgZmFjdG9yeSkuYnVpbGRKYXZhVGVzdFR5cGVNYXBwaW5nKHBlcnNpc3RlbnRUeXBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SmF2YUJhc2ljTWFwcGluZy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEphdmFCYXNpY01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhZGU0MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SmF2YUJhc2ljTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQmFzaWNNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgVGVzdEphdmFCYXNpY01hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0SmF2YUJhc2ljTWFwcGluZwotewotCXB1YmxpYyBUZXN0SmF2YUJhc2ljTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SmF2YUVudGl0eS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEphdmFFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlZTYzYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SmF2YUVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnRpdHlBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGVzdEphdmFFbnRpdHkKLQlleHRlbmRzIEFic3RyYWN0SmF2YUVudGl0eQotewotCXByb3RlY3RlZCBUZXN0SmF2YUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50LCBFbnRpdHlBbm5vdGF0aW9uIG1hcHBpbmdBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWFwcGluZ0Fubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBKYXZhQ2FjaGVhYmxlMl8wIGdldENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhRmFjdG9yeS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZiM2UwOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW50aXR5QW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIFRlc3RKcGFGYWN0b3J5Ci0JZXh0ZW5kcyBBYnN0cmFjdEpwYUZhY3RvcnkKLXsKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUVudGl0eSBidWlsZEphdmFFbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgRW50aXR5QW5ub3RhdGlvbiBlbnRpdHlBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgVGVzdEphdmFFbnRpdHkocGFyZW50LCBlbnRpdHlBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFCYXNpY01hcHBpbmcgYnVpbGRKYXZhQmFzaWNNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IFRlc3RKYXZhQmFzaWNNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhVGVzdFR5cGVNYXBwaW5nIGJ1aWxkSmF2YVRlc3RUeXBlTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSmF2YVRlc3RUeXBlTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFUZXN0QXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE0OGRkYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybVZhcmlhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhUGxhdGZvcm1GYWN0b3J5LlNpbXBsZVZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5wYXJzZXIuRGVmYXVsdEpQUUxHcmFtbWFyOwotCi0vKioKLSAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIEpQQSBwbGF0Zm9ybSBzaG91bGQgYmUgInN0YXRpYyIgKGkuZS4gdW5jaGFuZ2luZyBvbmNlCi0gKiBpdCBpcyBpbml0aWFsaXplZCkuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRlc3RKcGFQbGF0Zm9ybUZhY3RvcnkKLQlpbXBsZW1lbnRzIEpwYVBsYXRmb3JtRmFjdG9yeQotewotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgVGVzdEpwYVBsYXRmb3JtRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnBhUGxhdGZvcm0gYnVpbGRKcGFQbGF0Zm9ybShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhUGxhdGZvcm0oCi0JCQlpZCwKLQkJCWJ1aWxkSnBhVmVyc2lvbigpLAotCQkJbmV3IFRlc3RKcGFGYWN0b3J5KCksCi0JCQluZXcgSnBhQW5ub3RhdGlvblByb3ZpZGVyKEdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCkpLAotCQkJVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCWJ1aWxkSnBhUGxhdGZvcm1WYXJpYXRpb24oKSwKLQkJCURlZmF1bHRKUFFMR3JhbW1hci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEpwYVBsYXRmb3JtLlZlcnNpb24gYnVpbGRKcGFWZXJzaW9uKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVZlcnNpb24oSnBhRmFjZXQuVkVSU0lPTl8xXzAuZ2V0VmVyc2lvblN0cmluZygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJCQlyZXR1cm4gIkJPT09ZQUghIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1WYXJpYXRpb24gYnVpbGRKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKLQkJCXB1YmxpYyBTdXBwb3J0ZWQgZ2V0VGFibGVQZXJDb25jcmV0ZUNsYXNzSW5oZXJpdGFuY2VJc1N1cHBvcnRlZCgpIHsKLQkJCQlyZXR1cm4gU3VwcG9ydGVkLk1BWUJFOwotCQkJfQotCQkJcHVibGljIGJvb2xlYW4gaXNKb2luVGFibGVPdmVycmlkYWJsZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlwdWJsaWMgQWNjZXNzVHlwZVtdIGdldFN1cHBvcnRlZEFjY2Vzc1R5cGVzKEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJCQlyZXR1cm4gR0VORVJJQ19TVVBQT1JURURfQUNDRVNTX1RZUEVTOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwNzJiZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLlJlc291cmNlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkphclJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSmF2YVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5QZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVudGl0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5wZXJzaXN0ZW5jZS5HZW5lcmljUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEpwYVBsYXRmb3JtUHJvdmlkZXIKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJjb3JlLnRlc3RKcGFQbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIoKTsKLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybVByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIG1vZGVscyAqKioqKioqKioqCi0KLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCWlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb21tb25Db3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVJfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MXzFfMF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRKcGFDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY29udGVudFR5cGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzVG8oQXJyYXlMaXN0PEpwYVJlc291cmNlTW9kZWxQcm92aWRlcj4gcHJvdmlkZXJzKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwocHJvdmlkZXJzLCBSRVNPVVJDRV9NT0RFTF9QUk9WSURFUlMpOwotCX0KLQotCS8vIG9yZGVyIHNob3VsZCBub3QgYmUgaW1wb3J0YW50IGhlcmUKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEpwYVJlc291cmNlTW9kZWxQcm92aWRlcltdIFJFU09VUkNFX01PREVMX1BST1ZJREVSUyA9IG5ldyBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXJbXSB7Ci0JCUphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJSmFyUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCVBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCU9ybVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpCi0JfTsKLQotCi0JLy8gKioqKioqKioqKiBKYXZhIHR5cGUgbWFwcGluZ3MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgSkFWQV9UWVBFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8vIG9yZGVyIG1hdGNoZXMgdGhhdCB1c2VkIGJ5IHRoZSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24gKEVjbGlwc2VMaW5rKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIEpBVkFfVFlQRV9NQVBQSU5HX0RFRklOSVRJT05TID0gbmV3IEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCUphdmFFbnRpdHlEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFbWJlZGRhYmxlRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YVRlc3RUeXBlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSAgLy8gYWRkZWQKLQl9OwotCi0KLQkvLyAqKioqKioqKioqIEphdmEgYXR0cmlidXRlIG1hcHBpbmdzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIERFRkFVTFRfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLy8gb3JkZXIgbWF0Y2hlcyB0aGF0IHVzZWQgYnkgdGhlIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiAoRWNsaXBzZUxpbmspCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gREVGQVVMVF9KQVZBX0FUVFJJQlVURV9NQVBQSU5HX0RFRklOSVRJT05TID0gbmV3IERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBTUEVDSUZJRURfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLy8gb3JkZXIgbWF0Y2hlcyB0aGF0IHVzZWQgYnkgdGhlIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiAoRWNsaXBzZUxpbmspCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBTUEVDSUZJRURfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCUphdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFUZXN0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSAvLyBhZGRlZAotCX07Ci0KLQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxSZXNvdXJjZURlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIFJFU09VUkNFX0RFRklOSVRJT05TKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJlc291cmNlRGVmaW5pdGlvbltdIFJFU09VUkNFX0RFRklOSVRJT05TID0gbmV3IFJlc291cmNlRGVmaW5pdGlvbltdIHsKLQkJR2VuZXJpY1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlHZW5lcmljT3JtWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpCi0JfTsKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZGY3ZjkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcGFQbGF0Zm9ybVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkdlbmVyaWNKcGFQbGF0Zm9ybVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLkdlbmVyaWNKcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5HZW5lcmljSnBhUGxhdGZvcm1VaUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0SnBhUGxhdGZvcm1VaUZhY3RvcnkKLQlpbXBsZW1lbnRzIEpwYVBsYXRmb3JtVWlGYWN0b3J5Ci17Ci0JLyoqCi0JICogWmVybyBhcmcgY29uc3RydWN0b3IgZm9yIGV4dGVuc2lvbiBwb2ludAotCSAqLwotCXB1YmxpYyBUZXN0SnBhUGxhdGZvcm1VaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEpwYVBsYXRmb3JtVWkgYnVpbGRKcGFQbGF0Zm9ybVVpKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFQbGF0Zm9ybVVpKAotCQkJCQlHZW5lcmljSnBhUGxhdGZvcm1VaUZhY3RvcnkuTkFWSUdBVE9SX0ZBQ1RPUllfUFJPVklERVIsCi0JCQkJCUdlbmVyaWNKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuaW5zdGFuY2UoKQotCQkJCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy8uY2xhc3NwYXRoIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmNhMmQ1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qc3QvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvLmN2c2lnbm9yZSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvLnByb2plY3QgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjRmMjA1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwNzBiMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNUdWUgTWFyIDA4IDEyOjA4OjI3IEVTVCAyMDExCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OTI5YzIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMy4yLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4xMDAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cztidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4wLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlO2J1bmRsZS12ZXJzaW9uPSJbMy4wLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cztidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSJbNC4wLjAsNS4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwubWV0YWRhdGE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwubW9kZWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucGxhdGZvcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTt4LWludGVybmFsOj10cnVlCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuSnB0SnBhQ29yZVRlc3RzUGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9hYm91dC5odG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMjI3Y2UuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMzQ1M2EuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIENvcmUgVGVzdHMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL0pwdEpwYUNvcmVUZXN0c1BsdWdpbi5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL0pwdEpwYUNvcmVUZXN0c1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2I5NmIzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9KcHRKcGFDb3JlVGVzdHNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnByZWZzLkpwYVByZWZlcmVuY2VzTWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBDb25maWd1cmUgdGhlIGNvcmUgZm9yIHRlc3Rpbmc6PHVsPgotICogPGxpPmhhbmRsZSBldmVudHMgc3luY2hyb25vdXNseQotICogPGxpPmRvIG5vdCBmbHVzaCBwcmVmZXJlbmNlcwotICogPC91bD4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSnB0SnBhQ29yZVRlc3RzUGx1Z2luCi0JZXh0ZW5kcyBQbHVnaW4KLXsJCi0JcHJpdmF0ZSBzdGF0aWMgSnB0SnBhQ29yZVRlc3RzUGx1Z2luIElOU1RBTkNFOwotCi0JcHVibGljIHN0YXRpYyBKcHRKcGFDb3JlVGVzdHNQbHVnaW4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcGx1Zy1pbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSnB0SnBhQ29yZVRlc3RzUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoSU5TVEFOQ0UgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIHRoaXMgY29udmVudGlvbiBpcyAqd2FjayouLi4gIH5ianYKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCUpwYVByb2plY3RNYW5hZ2VyIGpwYVByb2plY3RNYW5hZ2VyID0gdGhpcy5nZXRKcGFQcm9qZWN0TWFuYWdlcigpOwotCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChqcGFQcm9qZWN0TWFuYWdlciwgImV4ZWN1dGVDb21tYW5kc1N5bmNocm9ub3VzbHkiKTsKLQkJUmVmbGVjdGlvblRvb2xzLnNldEZpZWxkVmFsdWUoanBhUHJvamVjdE1hbmFnZXIsICJ0ZXN0IiwgQm9vbGVhbi5UUlVFKTsKLQkJUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVTdGF0aWNNZXRob2QoSnBhUHJlZmVyZW5jZXNNYW5hZ2VyLmNsYXNzLCAiZG9Ob3RGbHVzaFByZWZlcmVuY2VzIik7Ci0JfQotCi0JcHJpdmF0ZSBKcGFQcm9qZWN0TWFuYWdlciBnZXRKcGFQcm9qZWN0TWFuYWdlcigpIHsKLQkJcmV0dXJuIChKcGFQcm9qZWN0TWFuYWdlcikgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldEFkYXB0ZXIoSnBhUHJvamVjdE1hbmFnZXIuY2xhc3MpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvTWlzY1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvTWlzY1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwY2U4NTAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL01pc2NUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTWlzY1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIE1pc2NUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RKb2JzQW5kTG9ja3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUxvY2sgbG9jayA9IEpvYi5nZXRKb2JNYW5hZ2VyKCkubmV3TG9jaygpOwotCQlKb2IgdGVzdEpvYiA9IG5ldyBUZXN0Sm9iKGxvY2spOwotCQl0ZXN0Sm9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JY2xhc3MgVGVzdEpvYiBleHRlbmRzIEpvYiB7Ci0JCXByaXZhdGUgZmluYWwgSUxvY2sgbG9jazsKLQkJVGVzdEpvYihJTG9jayBsb2NrKSB7Ci0JCQlzdXBlcigidGVzdCBqb2IiKTsKLQkJCXRoaXMubG9jayA9IGxvY2s7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXRoaXMucnVuKCk7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlwcml2YXRlIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQl0aGlzLmxvY2suYWNxdWlyZSgpOwotCQkJCU1pc2NUZXN0cy5zbGVlcCgxMDApOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl0aGlzLmxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0JfQotCi0Jc3RhdGljIHZvaWQgc2xlZXAobG9uZyBtaWxsaXMpIHsKLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcChtaWxsaXMpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvSnB0SnBhQ29yZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvSnB0SnBhQ29yZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZTBjMWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL0pwdEpwYUNvcmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5KcHRKcGFDb3JlQ29udGV4dE1vZGVsVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLm1ldGFkYXRhLkpwdEpwYUNvcmVNZXRhZGF0YVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5KcHRKcGFDb3JlTW9kZWxUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLkpwdEpwYUNvcmVSZXNvdXJjZU1vZGVsVGVzdHM7Ci0KLS8qKgotICogZGVjZW50cmFsaXplIHRlc3QgY3JlYXRpb24gY29kZQotICogCi0gKiBSZXF1aXJlZCBKYXZhIHN5c3RlbSBwcm9wZXJ0eToKLSAqICAgIC1Eb3JnLmVjbGlwc2UuanB0LmpwYS5qYXI9PGpwYS5qYXIgcGF0aD4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSnB0SnBhQ29yZVRlc3RzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX0pBUl9QUk9QRVJUWSA9IFRlc3RKcGFQcm9qZWN0LkpQQV9KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFk7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0SnBhQ29yZVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQkvLyoqKipJZiB5b3UgYWRkIGEgbmV3IHN1aXRlLCB5b3UgbXVzdCB1cGRhdGUgdGVzdC54bWwgd2hlcmUgdGhleSBhcmUgaW5kaXZpZHVhbGx5IGxpc3RlZC4KLQkJc3VpdGUuYWRkVGVzdChKcHRKcGFDb3JlTW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRKcGFDb3JlUmVzb3VyY2VNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdEpwYUNvcmVDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRKcGFDb3JlTWV0YWRhdGFUZXN0cy5zdWl0ZSgpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVxdWlyZWRKYXJzRXhpc3RzKCkgewotCQlyZXR1cm4ganBhSmFyUHJvcGVydHlFeGlzdHMoKSAmJiBqcGFKYXJGaWxlRXhpc3RzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGpwYUphclByb3BlcnR5RXhpc3RzKCkgewotCQlyZXR1cm4gZ2V0U3lzdGVtUHJvcGVydHkoSlBBX0pBUl9QUk9QRVJUWSkgIT0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGpwYUphckZpbGVFeGlzdHMoKSB7Ci0JCXJldHVybiAobmV3IEZpbGUoZ2V0U3lzdGVtUHJvcGVydHkoSlBBX0pBUl9QUk9QRVJUWSkpKS5leGlzdHMoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZE1pc3NpbmdKYXJFcnJvck1lc3NhZ2UoKSB7Ci0JCWlmKCAhIGpwYUphclByb3BlcnR5RXhpc3RzKCkpIHsKLQkJCXJldHVybiBlcnJvck1pc3NpbmdQcm9wZXJ0eShKUEFfSkFSX1BST1BFUlRZKTsKLQkJfQotCQlyZXR1cm4gZXJyb3JKYXJGaWxlRG9lc05vdEV4aXN0KGdldFN5c3RlbVByb3BlcnR5KEpQQV9KQVJfUFJPUEVSVFkpKTsKLQl9Ci0KLQkvKioqKioqKioqKiogcHJpdmF0ZSAqKioqKioqKioqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBlcnJvck1pc3NpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiAibWlzc2luZyBKYXZhIHN5c3RlbSBwcm9wZXJ0eTogXCIiICsgcHJvcGVydHlOYW1lICsgIlwiIjsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXJyb3JKYXJGaWxlRG9lc05vdEV4aXN0KFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0JCXJldHVybiAiSkFSIGZpbGUgZG9lc24ndCBleGlzdDogXCIiICsgcHJvcGVydHlWYWx1ZSArICJcIiI7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN5c3RlbVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlwcml2YXRlIEpwdEpwYUNvcmVUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0NvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3OWVmNDMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwaW5nRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucHJlZnMuSnBhUHJlZmVyZW5jZXNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5HZW5lcmljUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRleHRNb2RlbFRlc3RDYXNlIGV4dGVuZHMgQW5ub3RhdGlvblRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9QUk9KRUNUX05BTUUgPSAiQ29udGV4dE1vZGVsVGVzdFByb2plY3QiOwotCQotCXByb3RlY3RlZCBKcGFYbWxSZXNvdXJjZSBwZXJzaXN0ZW5jZVhtbFJlc291cmNlOwotCQotCXByb3RlY3RlZCBKcGFYbWxSZXNvdXJjZSBvcm1YbWxSZXNvdXJjZTsKLQkKLQkKLQlwcm90ZWN0ZWQgQ29udGV4dE1vZGVsVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMucGVyc2lzdGVuY2VYbWxSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCk7Ci0JCXRoaXMub3JtWG1sUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCXRoaXMud2FpdEZvcldvcmtzcGFjZUpvYnNUb0ZpbmlzaCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnBlcnNpc3RlbmNlWG1sUmVzb3VyY2UgPSBudWxsOwotCQl0aGlzLm9ybVhtbFJlc291cmNlID0gbnVsbDsKLQkJSnBhUHJlZmVyZW5jZXNNYW5hZ2VyLmNsZWFyV29ya3NwYWNlUHJlZmVyZW5jZXMoKTsKLQkJdGhpcy53YWl0Rm9yV29ya3NwYWNlSm9ic1RvRmluaXNoKCk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUZXN0SmF2YVByb2plY3QgYnVpbGRKYXZhUHJvamVjdChib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBidWlsZEpwYVByb2plY3QoQkFTRV9QUk9KRUNUX05BTUUsIGF1dG9CdWlsZCwgYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBUZXN0SnBhUHJvamVjdCBidWlsZEpwYVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCwgSURhdGFNb2RlbCBqcGFDb25maWcpIAotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBUZXN0SnBhUHJvamVjdC5idWlsZEpwYVByb2plY3QocHJvamVjdE5hbWUsIGF1dG9CdWlsZCwganBhQ29uZmlnKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyKCkpOwkJCi0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSLCB0aGlzLmdldEpwYUZhY2V0VmVyc2lvblN0cmluZygpKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5QTEFURk9STSwgdGhpcy5nZXRKcGFQbGF0Zm9ybURlc2NyaXB0aW9uKCkpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfT1JNX1hNTCwgQm9vbGVhbi52YWx1ZU9mKHRoaXMuY3JlYXRlT3JtWG1sKCkpKTsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0KLQkvLyBkZWZhdWx0IGZhY2V0IHZlcnNpb24gaXMgMi4wIC0gbW9zdCB0ZXN0cyB1c2UgMS4wCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRKcGFGYWNldFZlcnNpb25TdHJpbmcoKSB7Ci0JCXJldHVybiBKcGFGYWNldC5WRVJTSU9OXzFfMC5nZXRWZXJzaW9uU3RyaW5nKCk7Ci0JfQotCQotCS8vIG1vc3QgdGVzdHMgdXNlIHRoZSBiYXNpYyBnZW5lcmljIHBsYXRmb3JtCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0SnBhUGxhdGZvcm1EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEdlbmVyaWNQbGF0Zm9ybS5WRVJTSU9OXzFfMDsKLQl9Ci0KLQkvLyBtb3N0IHRlc3RzIGRvIHVzZSBhbiBvcm0ueG1sCi0JcHJvdGVjdGVkIGJvb2xlYW4gY3JlYXRlT3JtWG1sKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gZ2V0SmF2YVByb2plY3QoKS5nZXRKcGFQcm9qZWN0KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHdhaXRGb3JXb3Jrc3BhY2VKb2JzVG9GaW5pc2goKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkvLyBUaGlzIGpvYiB3aWxsIG5vdCBzdGFydCBydW5uaW5nIHVudGlsIGFsbCB0aGUgb3RoZXIgd29ya3NwYWNlIGpvYnMgYXJlIGRvbmUKLQkJSm9iIHdhaXRKb2IgPSBuZXcgSm9iKCJXYWl0IGpvYiIpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KLQkJCX07Ci0JCXdhaXRKb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJd2FpdEpvYi5zY2hlZHVsZSgpOwotCQl3YWl0Sm9iLmpvaW4oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlIGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLnBlcnNpc3RlbmNlWG1sUmVzb3VyY2U7Ci0JfQotCQotCXByb3RlY3RlZCBKcGFYbWxSZXNvdXJjZSBnZXRPcm1YbWxSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMub3JtWG1sUmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogSXQncyBuaWNlIHRvIGJlIGFibGUgdG8gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHRoZSBkZWJ1Z2dlciwKLQkgKiB0byBmb3JjZSB0aGUgWE1MIGZpbGVzIHRvIGJlIHdyaXR0ZW4gb3V0IHNvIHlvdSBjYW4gc2VlIHRoZWlyIGN1cnJlbnQgc3RhdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVhtbEZpbGVzKCkgewotCQl0cnkgewotCQkJdGhpcy5zYXZlWG1sRmlsZXNfKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNhdmVYbWxGaWxlc18oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5wZXJzaXN0ZW5jZVhtbFJlc291cmNlLnNhdmVJZk5lY2Vzc2FyeSgpOwotCQl0aGlzLm9ybVhtbFJlc291cmNlLnNhdmVJZk5lY2Vzc2FyeSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sRW50aXR5TWFwcGluZ3MgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoWG1sRW50aXR5TWFwcGluZ3MpIGdldE9ybVhtbFJlc291cmNlKCkuZ2V0Um9vdE9iamVjdCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2UgZ2V0WG1sUGVyc2lzdGVuY2UoKSB7Ci0JCXJldHVybiAoWG1sUGVyc2lzdGVuY2UpIGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5nZXRSb290T2JqZWN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcHBpbmdGaWxlIGdldE1hcHBpbmdGaWxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZVJlZnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nRmlsZSgpOwotCX0KLQotCXByb3RlY3RlZCBFbnRpdHlNYXBwaW5ncyBnZXRFbnRpdHlNYXBwaW5ncygpIHsKLQkJTWFwcGluZ0ZpbGUgbWFwcGluZ0ZpbGUgPSB0aGlzLmdldE1hcHBpbmdGaWxlKCk7Ci0JCXJldHVybiAobWFwcGluZ0ZpbGUgPT0gbnVsbCkgPyBudWxsIDogKEVudGl0eU1hcHBpbmdzKSBtYXBwaW5nRmlsZS5nZXRSb290KCk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZVVuaXQgZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkgewotCQlyZXR1cm4gZ2V0WG1sUGVyc2lzdGVuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuZ2V0KDApOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIGdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JfQotCQotCXByb3RlY3RlZCBDbGFzc1JlZiBnZXRTcGVjaWZpZWRDbGFzc1JlZigpIHsKLQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIGdldFNwZWNpZmllZENsYXNzUmVmKCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhRW50aXR5IGdldEphdmFFbnRpdHkoKSB7Ci0JCXJldHVybiAoSmF2YUVudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxDbGFzc1JlZihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCVhtbEphdmFDbGFzc1JlZiB4bWxDbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7Ci0JCXhtbENsYXNzUmVmLnNldEphdmFDbGFzcyhjbGFzc05hbWUpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmFkZCh4bWxDbGFzc1JlZik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbENsYXNzUmVmKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlYbWxKYXZhQ2xhc3NSZWYgeG1sSmF2YUNsYXNzUmVmVG9SZW1vdmUgID0gbnVsbDsKLQkJZm9yIChYbWxKYXZhQ2xhc3NSZWYgeG1sSmF2YUNsYXNzUmVmIDogeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKSkgewotCQkJaWYgKHhtbEphdmFDbGFzc1JlZi5nZXRKYXZhQ2xhc3MoKS5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCXhtbEphdmFDbGFzc1JlZlRvUmVtb3ZlID0geG1sSmF2YUNsYXNzUmVmOwotCQkJfQotCQl9Ci0JCWlmICh4bWxKYXZhQ2xhc3NSZWZUb1JlbW92ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5yZW1vdmUoeG1sSmF2YUNsYXNzUmVmVG9SZW1vdmUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxNYXBwaW5nRmlsZVJlZihTdHJpbmcgZmlsZU5hbWUpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgeG1sTWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCXhtbE1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKGZpbGVOYW1lKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmFkZCh4bWxNYXBwaW5nRmlsZVJlZik7Ci0JfQotCi0JcHJvdGVjdGVkIEpwYVJvb3RDb250ZXh0Tm9kZSBnZXRSb290Q29udGV4dE5vZGUoKSB7Ci0JCXJldHVybiBnZXRKYXZhUHJvamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRSb290Q29udGV4dE5vZGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gKFRlc3RKcGFQcm9qZWN0KSBzdXBlci5nZXRKYXZhUHJvamVjdCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5kZWxldGVSZXNvdXJjZShyZXNvdXJjZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvSnBhRmlsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcGFGaWxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFmNzFmNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcGFGaWxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKcGFGaWxlVGVzdHMKLQlleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEpwYUZpbGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9CQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIEpwYUZpbGUgZ2V0SnBhRmlsZShJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcGFGaWxlIGdldEpwYUZpbGUoSUZpbGUgZmlsZSkgewotCQl0cnkgewotCQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmlsZV8oZmlsZSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOwotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSnBhRmlsZSBnZXRKcGFGaWxlXyhJRmlsZSBmaWxlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGaWxlUmVmZXJlbmNlKGZpbGUpLmdldFZhbHVlKCk7Ci0JfQotCQotCXByaXZhdGUgSnBhRmlsZS5SZWZlcmVuY2UgZ2V0SnBhRmlsZVJlZmVyZW5jZShJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiAoSnBhRmlsZS5SZWZlcmVuY2UpIGZpbGUuZ2V0QWRhcHRlcihKcGFGaWxlLlJlZmVyZW5jZS5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Um9vdFN0cnVjdHVyZU5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJRmlsZSBmaWxlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKS5nZXRGaWxlKCk7Ci0JCUpwYUZpbGUgb3JtWG1sSnBhRmlsZSA9IHRoaXMuZ2V0SnBhRmlsZShmaWxlKTsKLQkJCi0JCWFzc2VydEVxdWFscyhnZXRFbnRpdHlNYXBwaW5ncygpLCBvcm1YbWxKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCi0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKcGFGaWxlIGphdmFKcGFGaWxlID0gdGhpcy5nZXRKcGFGaWxlKGN1KTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJLy92ZXJpZnkgdGhlIG1hcHBpbmcgZmlsZSByZWZlcmVuY2UgIndpbnMiIGFzIHRoZSByb290IHN0cnVjdHVyZSBub2RlIHdoZW4gYm90aAotCQkvL3BlcnNpc3RlbmNlLnhtbCA8Y2xhc3M+IHRhZyBhbmQgbWFwcGluZyBmaWxlIDxlbnRpdHk+IHRhZyBleGlzdCBmb3IgYSBwYXJ0aWN1bGFyeSBqYXZhIGNsYXNzCi0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkucmVtb3ZlUGVyc2lzdGVudFR5cGUob3JtUGVyc2lzdGVudFR5cGUpOwotCi0JCWFzc2VydEVxdWFscyhnZXRKYXZhRW50aXR5KCkuZ2V0UGVyc2lzdGVudFR5cGUoKSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCW9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW50aXR5TWFwcGluZ3NSb290U3RydWN0dXJlTm9kZVJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IGdldE9ybVhtbFJlc291cmNlKCkuZ2V0RmlsZSgpOwotCQlKcGFGaWxlIG9ybVhtbEpwYUZpbGUgPSB0aGlzLmdldEpwYUZpbGUoZmlsZSk7Ci0JCWFzc2VydEVxdWFscyhnZXRFbnRpdHlNYXBwaW5ncygpLCBvcm1YbWxKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCi0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gKEpwYVhtbFJlc291cmNlKSBvcm1YbWxKcGFGaWxlLmdldFJlc291cmNlTW9kZWwoKTsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUocmVzb3VyY2UuZ2V0Um9vdE9iamVjdCgpKTsKLQkJCi0JCWFzc2VydEZhbHNlKG9ybVhtbEpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBsaWVkRW50aXR5TWFwcGluZ3NSb290U3RydWN0dXJlTm9kZVJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IGdldE9ybVhtbFJlc291cmNlKCkuZ2V0RmlsZSgpOwotCQlKcGFGaWxlIG9ybVhtbEpwYUZpbGUgPSB0aGlzLmdldEpwYUZpbGUoZmlsZSk7Ci0JCQotCQlhc3NlcnROdWxsKGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpKTsKLQkJCi0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0Tm90TnVsbChnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JCWFzc2VydEVxdWFscyhnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKS5nZXRNYXBwaW5nRmlsZSgpLmdldFJvb3QoKSwgb3JtWG1sSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IChKcGFYbWxSZXNvdXJjZSkgb3JtWG1sSnBhRmlsZS5nZXRSZXNvdXJjZU1vZGVsKCk7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkucmVtb3ZlKHJlc291cmNlLmdldFJvb3RPYmplY3QoKSk7Ci0JCQotCQlhc3NlcnRGYWxzZShvcm1YbWxKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVudGl0eU1hcHBpbmdzUm9vdFN0cnVjdHVyZU5vZGVSZW1vdmVkRnJvbVJlc291cmNlTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IGdldE9ybVhtbFJlc291cmNlKCkuZ2V0RmlsZSgpOwotCQlKcGFGaWxlIG9ybVhtbEpwYUZpbGUgPSB0aGlzLmdldEpwYUZpbGUoZmlsZSk7Ci0JCWFzc2VydEVxdWFscyhnZXRFbnRpdHlNYXBwaW5ncygpLCBvcm1YbWxKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCi0JCWdldE9ybVhtbFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5yZW1vdmUoZ2V0T3JtWG1sUmVzb3VyY2UoKS5nZXRSb290T2JqZWN0KCkpOwotCQkKLQkJYXNzZXJ0RmFsc2Uob3JtWG1sSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVBlcnNpc3RlbmNlUm9vdFN0cnVjdHVyZU5vZGVQZXJzaXN0ZW5jZVJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5nZXRGaWxlKCk7Ci0JCUpwYUZpbGUgcGVyc2lzdGVuY2VYbWxKcGFGaWxlID0gdGhpcy5nZXRKcGFGaWxlKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpLCBwZXJzaXN0ZW5jZVhtbEpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkKLQkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSAoSnBhWG1sUmVzb3VyY2UpIHBlcnNpc3RlbmNlWG1sSnBhRmlsZS5nZXRSZXNvdXJjZU1vZGVsKCk7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkucmVtb3ZlKHJlc291cmNlLmdldFJvb3RPYmplY3QoKSk7Ci0JCQotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVhtbEpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlT3JtSmF2YVJvb3RTdHJ1Y3R1cmVOb2RlUGVyc2lzdGVuY2VSZW1vdmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJSUZpbGUgZmlsZSA9IGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5nZXRGaWxlKCk7Ci0JCUpwYUZpbGUgcGVyc2lzdGVuY2VYbWxKcGFGaWxlID0gdGhpcy5nZXRKcGFGaWxlKGZpbGUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IHRoaXMuZ2V0SnBhRmlsZShjdSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCksIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCi0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gKEpwYVhtbFJlc291cmNlKSBwZXJzaXN0ZW5jZVhtbEpwYUZpbGUuZ2V0UmVzb3VyY2VNb2RlbCgpOwotCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLnJlbW92ZShyZXNvdXJjZS5nZXRSb290T2JqZWN0KCkpOwotCQkKLQkJYXNzZXJ0RmFsc2UoamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSmF2YVJvb3RTdHJ1Y3R1cmVOb2RlUGVyc2lzdGVuY2VSZW1vdmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJSUZpbGUgZmlsZSA9IGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5nZXRGaWxlKCk7Ci0JCUpwYUZpbGUgcGVyc2lzdGVuY2VYbWxKcGFGaWxlID0gdGhpcy5nZXRKcGFGaWxlKGZpbGUpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUpwYUZpbGUgamF2YUpwYUZpbGUgPSB0aGlzLmdldEpwYUZpbGUoY3UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IChKcGFYbWxSZXNvdXJjZSkgcGVyc2lzdGVuY2VYbWxKcGFGaWxlLmdldFJlc291cmNlTW9kZWwoKTsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUocmVzb3VyY2UuZ2V0Um9vdE9iamVjdCgpKTsKLQkJCi0JCWFzc2VydEZhbHNlKGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGVyc2lzdGVuY2VSb290U3RydWN0dXJlTm9kZVJlbW92ZWRGcm9tUmVzb3VyY2VNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJRmlsZSBmaWxlID0gZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLmdldEZpbGUoKTsKLQkJSnBhRmlsZSBwZXJzaXN0ZW5jZVhtbEpwYUZpbGUgPSB0aGlzLmdldEpwYUZpbGUoZmlsZSk7Ci0JCWdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJYXNzZXJ0RXF1YWxzKGdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKSwgcGVyc2lzdGVuY2VYbWxKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5nZXRDb250ZW50cygpLnJlbW92ZShnZXRYbWxQZXJzaXN0ZW5jZSgpKTsKLQkJCi0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlWG1sSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPcm1KYXZhUm9vdFN0cnVjdHVyZU5vZGVQZXJzaXN0ZW5jZVhtbFJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IHRoaXMuZ2V0SnBhRmlsZShjdSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCksIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5nZXRDb250ZW50cygpLnJlbW92ZShnZXRYbWxQZXJzaXN0ZW5jZSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSmF2YVJvb3RTdHJ1Y3R1cmVOb2RlUGVyc2lzdGVuY2VYbWxSZW1vdmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKcGFGaWxlIGphdmFKcGFGaWxlID0gdGhpcy5nZXRKcGFGaWxlKGN1KTsKLQkJCi0JCWFzc2VydEVxdWFscyhnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkucmVtb3ZlKGdldFhtbFBlcnNpc3RlbmNlKCkpOwotCQlhc3NlcnRGYWxzZShqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPcm1KYXZhUGVyc2lzdGVudFR5cGVSb290U3RydWN0dXJlTm9kZVJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUpwYUZpbGUgamF2YUpwYUZpbGUgPSB0aGlzLmdldEpwYUZpbGUoY3UpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJSnBhTm9kZSBub2RlID0gKEpwYU5vZGUpIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRUcnVlKG5vZGUuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBPcm1QZXJzaXN0ZW50VHlwZSk7Ci0JCQotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVQZXJzaXN0ZW50VHlwZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXNTaXplKCkpOwotCQlub2RlID0gKEpwYU5vZGUpIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRUcnVlKG5vZGUuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBDbGFzc1JlZik7Ci0JCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPcm1KYXZhUGVyc2lzdGVudFR5cGVSb290U3RydWN0dXJlTm9kZVJlbW92ZWRGcm9tUmVzb3VyY2VNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IHRoaXMuZ2V0SnBhRmlsZShjdSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJSnBhTm9kZSBub2RlID0gKEpwYU5vZGUpIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRUcnVlKG5vZGUuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBPcm1QZXJzaXN0ZW50VHlwZSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2Rlc1NpemUoKSk7Ci0JCW5vZGUgPSAoSnBhTm9kZSkgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydFRydWUobm9kZS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIENsYXNzUmVmKTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YVBlcnNpc3RlbnRUeXBlUm9vdFN0cnVjdHVyZU5vZGVSZW1vdmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUpwYUZpbGUgamF2YUpwYUZpbGUgPSB0aGlzLmdldEpwYUZpbGUoY3UpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlKcGFOb2RlIG5vZGUgPSAoSnBhTm9kZSkgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCkubmV4dCgpLCBub2RlLmdldFBhcmVudCgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkucmVtb3ZlU3BlY2lmaWVkQ2xhc3NSZWYoMCk7Ci0JCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCW5vZGUgPSAoSnBhTm9kZSkgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEltcGxpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpLm5leHQoKSwgbm9kZS5nZXRQYXJlbnQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhUGVyc2lzdGVudFR5cGVSb290U3RydWN0dXJlTm9kZVJlbW92ZWRGcm9tUmVzb3VyY2VNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKcGFGaWxlIGphdmFKcGFGaWxlID0gdGhpcy5nZXRKcGFGaWxlKGN1KTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUl0ZXJhdG9yPEpwYVN0cnVjdHVyZU5vZGU+IHJvb3RTdHJ1Y3R1cmVOb2RlcyA9IGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCk7Ci0JCUpwYVN0cnVjdHVyZU5vZGUgcm9vdFN0cnVjdHVyZU5vZGUgPSByb290U3RydWN0dXJlTm9kZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLCByb290U3RydWN0dXJlTm9kZSk7Ci0JCWFzc2VydEVxdWFscyhnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCkubmV4dCgpLCAoKEpwYU5vZGUpIHJvb3RTdHJ1Y3R1cmVOb2RlKS5nZXRQYXJlbnQoKSk7Ci0JCWFzc2VydEZhbHNlKHJvb3RTdHJ1Y3R1cmVOb2Rlcy5oYXNOZXh0KCkpOwotCQkKLQkJcmVtb3ZlWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCUpwYU5vZGUgbm9kZSA9IChKcGFOb2RlKSBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZENsYXNzUmVmcygpLml0ZXJhdG9yKCkubmV4dCgpLCBub2RlLmdldFBhcmVudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW1wbGllZEphdmFQZXJzaXN0ZW50VHlwZVJvb3RTdHJ1Y3R1cmVOb2RlUmVtb3ZlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlnZXRKcGFQcm9qZWN0KCkuc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3Nlcyh0cnVlKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IHRoaXMuZ2V0SnBhRmlsZShjdSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZENsYXNzUmVmcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQotCQlqYXZhUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJYXNzZXJ0RmFsc2UoamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YVJvb3RTdHJ1Y3R1cmVOb2Rlc0VudGl0eU1hcHBpbmdzUmVtb3ZlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IHRoaXMuZ2V0SnBhRmlsZShjdSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCi0JCWdldE9ybVhtbFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5yZW1vdmUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKSk7Ci0JCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXNTaXplKCkpOwotCQlKcGFOb2RlIG5vZGUgPSAoSnBhTm9kZSkgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRJbXBsaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKS5uZXh0KCksIG5vZGUuZ2V0UGFyZW50KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YVJvb3RTdHJ1Y3R1cmVOb2Rlc1BlcnNpc3RlbmNlVW5pdFJlbW92ZWRGcm9tUmVzb3VyY2VNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IHRoaXMuZ2V0SnBhRmlsZShjdSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCi0JCWdldFhtbFBlcnNpc3RlbmNlKCkuZ2V0UGVyc2lzdGVuY2VVbml0cygpLnJlbW92ZSgwKTsKLQotCQlhc3NlcnRGYWxzZShqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YVJvb3RTdHJ1Y3R1cmVOb2Rlc1BlcnNpc3RlbmNlVW5pdFJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUpwYUZpbGUgamF2YUpwYUZpbGUgPSB0aGlzLmdldEpwYUZpbGUoY3UpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQotCQlnZXRKcGFQcm9qZWN0KCkuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpLnJlbW92ZVBlcnNpc3RlbmNlVW5pdCgwKTsKLQotCQlhc3NlcnRGYWxzZShqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhUm9vdFN0cnVjdHVyZU5vZGVzT3JtUGVyc2lzdGVudFR5cGVSZW1vdmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKcGFGaWxlIGphdmFKcGFGaWxlID0gdGhpcy5nZXRKcGFGaWxlKGN1KTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVQZXJzaXN0ZW50VHlwZSgwKTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2Rlc1NpemUoKSk7Ci0JCUpwYU5vZGUgbm9kZSA9IChKcGFOb2RlKSBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZENsYXNzUmVmcygpLml0ZXJhdG9yKCkubmV4dCgpLCBub2RlLmdldFBhcmVudCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEphdmFSb290U3RydWN0dXJlTm9kZXNPcm1UeXBlTWFwcGluZ01vcnBoZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUpwYUZpbGUgamF2YUpwYUZpbGUgPSB0aGlzLmdldEpwYUZpbGUoY3UpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2Rlc1NpemUoKSk7Ci0JCWphdmFQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkucmVtb3ZlUGVyc2lzdGVudFR5cGUoMCk7Ci0JCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXNTaXplKCkpOwotCQlKcGFOb2RlIG5vZGUgPSAoSnBhTm9kZSkgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEltcGxpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpLm5leHQoKSwgbm9kZS5nZXRQYXJlbnQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPcm1KYXZhUm9vdFN0cnVjdHVyZU5vZGVNYXBwaW5nRmlsZVJlZkNoYW5nZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IHRoaXMuZ2V0SnBhRmlsZShjdSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCksIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCi0JCU1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVSZWZzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKCJmb28iKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlID0gKChFbnRpdHlNYXBwaW5ncykgZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkuZ2V0TWFwcGluZ0ZpbGUoKS5nZXRSb290KCkpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCksIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCi0JCUlGaWxlIGZpbGUgPSBnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuZ2V0RmlsZSgpOwotCQlKcGFGaWxlIG9ybVhtbEpwYUZpbGUgPSB0aGlzLmdldEpwYUZpbGUoZmlsZSk7CQkKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1YbWxKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2Rlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKYXZhUm9vdFN0cnVjdHVyZU5vZGVNYXBwaW5nRmlsZVJlZkNoYW5nZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUpwYUZpbGUgamF2YUpwYUZpbGUgPSB0aGlzLmdldEpwYUZpbGUoY3UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQotCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlUmVmcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscyhnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKYXZhUm9vdFN0cnVjdXRyZU5vZGVEZWxldGVPcm1SZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IHRoaXMuZ2V0SnBhRmlsZShjdSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQotCQkKLQkJZGVsZXRlUmVzb3VyY2UoZ2V0T3JtWG1sUmVzb3VyY2UoKSk7Ci0JCQotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpKTsKLQkJSnBhTm9kZSBub2RlID0gKEpwYU5vZGUpIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZENsYXNzUmVmcygpLml0ZXJhdG9yKCkubmV4dCgpLCBub2RlLmdldFBhcmVudCgpKTsKLQl9Ci0JLy9UT0RPIHRlc3Qgcm9vdFN0cnVjdHVyZU5vZGVzIHdpdGggYSBzdGF0aWMgaW5uZXIgY2xhc3MKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcGFQcm9qZWN0VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwYVByb2plY3RUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDE2MWE2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwYVByb2plY3RUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uR2VuZXJpY1BsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpwYVByb2plY3RUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX1BST0pFQ1RfTkFNRSA9IEpwYVByb2plY3RUZXN0cy5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0JCi0JVGVzdEpwYVByb2plY3QganBhUHJvamVjdDsKLQotCQotCXB1YmxpYyBKcGFQcm9qZWN0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0gVGVzdEpwYVByb2plY3QuYnVpbGRKcGFQcm9qZWN0KEJBU0VfUFJPSkVDVF9OQU1FLCBmYWxzZSwgYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKSk7IC8vIGZhbHNlID0gbm8gYXV0by1idWlsZAotCX0KLQkKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIoKSk7CQkKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTl9TVFIsIEpwYUZhY2V0LlZFUlNJT05fMV8wLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuUExBVEZPUk0sIEdlbmVyaWNQbGF0Zm9ybS5WRVJTSU9OXzFfMCk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNSRUFURV9PUk1fWE1MLCBCb29sZWFuLlRSVUUpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0gbnVsbDsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuanBhUHJvamVjdC5nZXRKcGFQcm9qZWN0KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkvL2RlbGV0ZSB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkvL2FkZCB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUgYmFjawotCQljcmVhdGVQZXJzaXN0ZW5jZVhtbEZpbGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVBlcnNpc3RlbmNlWG1sRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGNvbmZpZyA9Ci0JCQlEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEFJTkVSX1BBVEgsIAotCQkJCWdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJzcmMvTUVUQS1JTkYiKS5nZXRGdWxsUGF0aCgpKTsKLQkJY29uZmlnLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkKLQkJLy9kZWxldGUgdGhlIG9ybS54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpCi0JCXJlc291cmNlLmRlbGV0ZShudWxsKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkvL2FkZCB0aGUgZGVmYXVsdCBvcm0ueG1sIGZpbGUgYmFjawotCQljcmVhdGVEZWZhdWx0T3JtWG1sRmlsZSgpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgY29uZmlnID0KLQkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEFJTkVSX1BBVEgsIAotCQkJCWdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJzcmMvTUVUQS1JTkYiKS5nZXRGdWxsUGF0aCgpKTsKLQkJY29uZmlnLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsIG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlT3JtWG1sRmlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGNvbmZpZyA9Ci0JCQlEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QQVRILCAKLQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjL01FVEEtSU5GIikuZ2V0RnVsbFBhdGgoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfTkFNRSwgZmlsZU5hbWUpOwotCQljb25maWcuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdGaWxlUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkKLQkJLy9kZWxldGUgdGhlIG9ybS54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldE1hcHBpbmdGaWxlUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCS8vYWRkIHRoZSAgb3JtLnhtbCBmaWxlIGJhY2sKLQkJY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZ0ZpbGVSZXNvdXJjZURpZmZlcmVudGx5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UobmV3IFBhdGgoIk1FVEEtSU5GL29ybTIueG1sIikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQotCQkvL2NyZWF0ZSB0aGUgb3JtMi54bWwgZmlsZQotCQljcmVhdGVPcm1YbWxGaWxlKCJvcm0yLnhtbCIpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UobmV3IFBhdGgoIk1FVEEtSU5GL29ybTIueG1sIikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0yLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtMi54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldE1hcHBpbmdGaWxlUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJLy9hZGQgdGhlIG9ybTIueG1sIGZpbGUgYmFjawotCQljcmVhdGVPcm1YbWxGaWxlKCJvcm0yLnhtbCIpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UobmV3IFBhdGgoIk1FVEEtSU5GL29ybTIueG1sIikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0yLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvSnB0SnBhQ29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcHRKcGFDb3JlQ29udGV4dE1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJjMzA0Mi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcHRKcGFDb3JlQ29udGV4dE1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuSnB0SnBhQ29yZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmEuSnB0Q29yZUNvbnRleHRKYXZhTW9kZWxUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm0uSnB0Q29yZU9ybUNvbnRleHRNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkpwdENvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5HZW5lcmljMl8wSmF2YUNvbnRleHRNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkdlbmVyaWMyXzBPcm1Db250ZXh0TW9kZWxUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWMyXzBQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzOwotCi0vKioKLSAqIFJlcXVpcmVkIEphdmEgc3lzdGVtIHByb3BlcnR5OgotICogICAtRG9yZy5lY2xpcHNlLmpwdC5qcGEuamFyPTxqcGEuamFyIHBhdGg+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKcHRKcGFDb3JlQ29udGV4dE1vZGVsVGVzdHMKLQlleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEpwYUNvcmVDb250ZXh0TW9kZWxUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlpZiAoSnB0SnBhQ29yZVRlc3RzLnJlcXVpcmVkSmFyc0V4aXN0cygpKSB7Ci0JCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSnBhUHJvamVjdFRlc3RzLmNsYXNzKTsKLQkJCXN1aXRlLmFkZFRlc3RTdWl0ZShKcGFGaWxlVGVzdHMuY2xhc3MpOwotCQkJc3VpdGUuYWRkVGVzdChKcHRDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJCXN1aXRlLmFkZFRlc3QoSnB0Q29yZU9ybUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQkJc3VpdGUuYWRkVGVzdChKcHRDb3JlQ29udGV4dEphdmFNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQkJc3VpdGUuYWRkVGVzdChHZW5lcmljMl8wSmF2YUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQkJc3VpdGUuYWRkVGVzdChHZW5lcmljMl8wT3JtQ29udGV4dE1vZGVsVGVzdHMuc3VpdGUoKSk7Ci0JCQlzdWl0ZS5hZGRUZXN0KEdlbmVyaWMyXzBQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQl9IGVsc2UgewotCQkJc3VpdGUuYWRkVGVzdChUZXN0U3VpdGUud2FybmluZyhKcHRKcGFDb3JlVGVzdHMuYnVpbGRNaXNzaW5nSmFyRXJyb3JNZXNzYWdlKCkpKTsKLQkJfQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRKcGFDb3JlQ29udGV4dE1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNiZjQyNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCQotCXB1YmxpYyBHZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhSWRNYXBwaW5nKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkobnVsbCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhQmFzaWNNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhSWRNYXBwaW5nKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkobnVsbCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTWFwcGluZ051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwcGluZ0tleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRNYXBwaW5nS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE1hcHBpbmdLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFFbWJlZGRlZE1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkTWFwcGluZ0tleTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhRW1iZWRkZWRNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkTWFwcGluZ0tleU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdLZXlNYXBwaW5nQ2hhbmdlSW5SZXNvdXJjZU1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUF0dHJpYnV0ZS5zZXRQcmltYXJ5QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdLZXlNYXBwaW5nQ2hhbmdlSW5SZXNvdXJjZU1vZGVsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlQXR0cmlidXRlLnNldFByaW1hcnlBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc1Byb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uUmVzb2x2aW5nRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOb25SZXNvbHZpbmdGaWVsZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImZvbyIpOwotCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZS5pc0ZvcihyZXNvdXJjZUZpZWxkKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc1BlcnNpc3RhYmxlTWV0aG9kMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5vblJlc29sdmluZ01ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTWV0aG9kPiBtZXRob2RzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldE1ldGhvZHMoKS5pdGVyYXRvcigpOwotCQkKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlR2V0dGVyID0gbWV0aG9kcy5uZXh0KCk7Ci0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZVNldHRlciA9IG1ldGhvZHMubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiZm9vIik7Ci0JCi0JCWFzc2VydFRydWUoYXR0cmlidXRlLmlzRm9yKHJlc291cmNlR2V0dGVyLCByZXNvdXJjZVNldHRlcikpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhOb25SZXNvbHZpbmdGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgicHJpdmF0ZSBGb28gZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTm9uUmVzb2x2aW5nTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoInByaXZhdGUgRm9vIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgRm9vIGdldEZvbygpIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICAgICByZXR1cm4gdGhpcy5mb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIHZvaWQgc2V0Rm9vKEZvbyBmb28pIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICAgICB0aGlzLmZvbyA9IGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYmM3MWYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5GaWVsZEFjY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuUHJvcGVydHlBY2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnRpdHlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkJCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkQW5kTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEV4dGVuZHNJbXBsZW1lbnRzVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTdWJUeXBlV2l0aEZpZWxkQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgbmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEV4dGVuZHNJbXBsZW1lbnRzVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U3ViVHlwZVdpdGhNZXRob2RBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U3ViVHlwZU5vblBlcnNpc3RlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFN1YlR5cGVQZXJzaXN0ZW50RXh0ZW5kc05vblBlcnNpc3RlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQyLmphdmEiLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQyIiwgbmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEV4dGVuZHNJbXBsZW1lbnRzVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCAiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkQ29uc3RydWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgIiArIFRZUEVfTkFNRSArICIoKSB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgICAgc3VwZXIoKTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkJCi0JcHVibGljIEdlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc05vdGhpbmdBbm5vdGF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NGaWVsZEFuZE1ldGhvZEFubm90YXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRBbmRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzSW5oZXJpdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzSW5oZXJpdGFuY2UyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQkKLQkJCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc0luaGVyaXRhbmNlMygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGVXaXRoTWV0aG9kQW5ub3RhdGlvbigpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQkKLQkJCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc0luaGVyaXRhbmNlNCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlV2l0aEZpZWxkQW5ub3RhdGlvbigpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCS8vaW5oZXJpdGVkIGNsYXNzIGhhdmluZyBhbm5vdGF0aW9ucyBzZXQgd2lucyBvdmVyIHRoZSBkZWZhdWx0IGFjY2VzcyBzZXQgb24gcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cwotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NJbmhlcml0YW5jZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbE5vQWNjZXNzTm9Bbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0KLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NYbWxFbnRpdHlBY2Nlc3NOb0Fubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKLQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0FjY2Vzc05vQW5ub3RhdGlvbnMoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sRW50aXR5UHJvcGVydHlBY2Nlc3NBbmRGaWVsZEFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8veG1sIGFjY2VzcyBzZXQgdG8gcHJvcGVydHksIGZpZWxkIGFubm90YXRpb25zLCBKYXZhUGVyc2lzdGVudFR5cGUgYWNjZXNzIGlzIGZpZWxkCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NYbWxFbnRpdHlGaWVsZEFjY2Vzc0FuZFByb3BlcnR5QW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy94bWwgYWNjZXNzIHNldCB0byBmaWVsZCwgcHJvcGVydHkgYW5ub3RhdGlvbnMsIEphdmFQZXJzaXN0ZW50VHlwZSBhY2Nlc3MgaXMgcHJvcGVydHkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0FjY2Vzc0ZpZWxkQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCi0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0KLQkvL2luaGVyaXRhbmNlIHdpbnMgb3ZlciBlbnRpdHktbWFwcGluZ3Mgc3BlY2lmaWVkIGFjY2VzcwotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NYbWxFbnRpdHlNYXBwaW5nc0FjY2Vzc1dpdGhJbmhlcml0YW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjaGlsZEVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQkKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUgPSBjaGlsZEVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sTWV0YWRhdGFDb21wbGV0ZUZpZWxkQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy94bWwgYWNjZXNzIHNldCB0byBwcm9wZXJ0eSwgamF2YSBoYXMgZmllbGQgYW5ub3RhdGlvbnMgc28gdGhlIGFjY2VzcyBzaG91bGQgYmUgZmllbGQKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCi0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc05vWG1sQWNjZXNzWG1sTWV0ZGF0YUNvbXBsZXRlUHJvcGVydHlBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQkvL3htbCBhY2Nlc3Mgbm90IHNldCwgbWV0YWRhdGEgY29tcGxldGUgc2V0LiAgSmF2YVBlcnNpc3RlbnRUeXBlIGFjY2VzcyBpcyBwcm9wZXJ0eSBiZWNhdXNlIHByb3BlcnRpZXMgYXJlIGFubm90YXRlZAotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCi0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN1cGVyUGVyc2lzdGVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZVdpdGhGaWVsZEFubm90YXRpb24oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCUNsYXNzUmVmIGNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJvb3RKYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMocm9vdEphdmFQZXJzaXN0ZW50VHlwZSwgY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChyb290SmF2YVBlcnNpc3RlbnRUeXBlLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTdXBlclBlcnNpc3RlbnRUeXBlMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlV2l0aEZpZWxkQW5ub3RhdGlvbigpOwotCQkKLQkJLy9zdXBlciBpcyBub3QgYWRkZWQgdG8gdGhlIHBlcnNpc3RlbmNlVW5pdCwgYnV0IGl0IHNob3VsZCBzdGlsbCBiZSBmb3VuZAotCQkvL2FzIHRoZSBzdXBlclBlcnNpc3RlbnRUeXBlIGJlY2F1c2Ugb2YgaW1wbGllZENsYXNzUmVmcyBhbmQgY2hhbmdlcyBmb3IgYnVnIDE5MDMxNwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpKTsKLQl9CQotCQotCS8vRW50aXR5IGV4dGVuZHMgTm9uLUVudGl0eSBleHRlbmRzIEVudGl0eSAKLQlwdWJsaWMgdm9pZCB0ZXN0U3VwZXJQZXJzaXN0ZW50VHlwZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZU5vblBlcnNpc3RlbnQoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGVQZXJzaXN0ZW50RXh0ZW5kc05vblBlcnNpc3RlbnQoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkMiIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSByb290SmF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQljbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHJvb3RKYXZhUGVyc2lzdGVudFR5cGUsIGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKSk7Ci0JCWFzc2VydE51bGwocm9vdEphdmFQZXJzaXN0ZW50VHlwZS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW5oZXJpdGFuY2VIaWVyYXJjaHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZU5vblBlcnNpc3RlbnQoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGVQZXJzaXN0ZW50RXh0ZW5kc05vblBlcnNpc3RlbnQoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkMiIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgcm9vdEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlJdGVyYXRvcjxQZXJzaXN0ZW50VHlwZT4gaW5oZXJpdGFuY2VIaWVyYXJjaHkgPSBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZS5nZXRJbmhlcml0YW5jZUhpZXJhcmNoeSgpLml0ZXJhdG9yKCk7CQotCQkKLQkJYXNzZXJ0RXF1YWxzKGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlLCBpbmhlcml0YW5jZUhpZXJhcmNoeS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocm9vdEphdmFQZXJzaXN0ZW50VHlwZSwgaW5oZXJpdGFuY2VIaWVyYXJjaHkubmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEluaGVyaXRhbmNlSGllcmFyY2h5MigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlTm9uUGVyc2lzdGVudCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZVBlcnNpc3RlbnRFeHRlbmRzTm9uUGVyc2lzdGVudCgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZDIiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSByb290SmF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCUl0ZXJhdG9yPFBlcnNpc3RlbnRUeXBlPiBpbmhlcml0YW5jZUhpZXJhcmNoeSA9IGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlLmdldEluaGVyaXRhbmNlSGllcmFyY2h5KCkuaXRlcmF0b3IoKTsJCi0JCQotCQlhc3NlcnRFcXVhbHMoY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUsIGluaGVyaXRhbmNlSGllcmFyY2h5Lm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhyb290SmF2YVBlcnNpc3RlbnRUeXBlLCBpbmhlcml0YW5jZUhpZXJhcmNoeS5uZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBwaW5nS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwcGluZ0tleU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHBpbmdLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCi0JCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwcGluZ0tleTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCi0JCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRW1iZWRkYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBwaW5nS2V5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCi0JCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwaW5nS2V5TWFwcGluZ0NoYW5nZUluUmVzb3VyY2VNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlyZXNvdXJjZVR5cGUuc2V0UHJpbWFyeUFubm90YXRpb24oRW1iZWRkYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwaW5nS2V5TWFwcGluZ0NoYW5nZUluUmVzb3VyY2VNb2RlbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJcmVzb3VyY2VUeXBlLnNldFByaW1hcnlBbm5vdGF0aW9uKEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc01hcHBlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydFRydWUoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuaXNNYXBwZWQoKSk7Ci0JCQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSk7CQotCQlhc3NlcnRGYWxzZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5pc01hcHBlZCgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkQW5kTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZS5nZXRBY2Nlc3NvcigpIGluc3RhbmNlb2YgRmllbGRBY2Nlc3Nvcik7Ci0JCWF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdHRyaWJ1dGUuZ2V0QWNjZXNzb3IoKSBpbnN0YW5jZW9mIEZpZWxkQWNjZXNzb3IpOwotCQlhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZS5nZXRBY2Nlc3NvcigpIGluc3RhbmNlb2YgUHJvcGVydHlBY2Nlc3Nvcik7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlc1NpemUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZEFuZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVOYW1lZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm5hbWUiKSk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImZvbyIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU5hbWVkMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibmFtZSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJmb28iKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW5hbWVBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCB0ZXN0VHlwZSA9IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGlkQXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5hbWVBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJCi0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgaWRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgbmFtZUF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQkKLQkJSUZpZWxkIGlkRmllbGQgPSB0ZXN0VHlwZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGaWVsZCgiaWQiKTsKLQkJaWRGaWVsZC5yZW5hbWUoImlkMiIsIGZhbHNlLCBudWxsKTsKLQkJCi0JCWF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmFtZUF0dHJpYnV0ZTIgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgaWQyQXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0KLQkJYXNzZXJ0Tm90U2FtZShpZEF0dHJpYnV0ZSwgaWQyQXR0cmlidXRlKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZDIiLCBpZDJBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVBdHRyaWJ1dGUsIG5hbWVBdHRyaWJ1dGUyKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgbmFtZUF0dHJpYnV0ZTIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdXBlclBlcnNpc3RlbnRUeXBlR2VuZXJpYygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0R2VuZXJpY0VudGl0eSgpOwotCQljcmVhdGVUZXN0R2VuZXJpY01hcHBlZFN1cGVyY2xhc3MoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuRW50aXR5MSIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkVudGl0eTIiKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkVudGl0eTEiLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygidGVzdC5FbnRpdHkyIiwgamF2YVBlcnNpc3RlbnRUeXBlLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKS5nZXROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0R2VuZXJpY0VudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzIEVudGl0eTEgIik7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzIEVudGl0eTI8SW50ZWdlcj4ge30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJFbnRpdHkxLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEdlbmVyaWNNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgRW50aXR5MjxLPiB7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkVudGl0eTIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzTm9BdHRyaWJ1dGVzQW5ub3RhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoamF2YVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc0ZpZWxkc0Fubm90YXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoamF2YVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc01ldGhvZHNBbm5vdGF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzRmllbGRzQW5kTWV0aG9kc0Fubm90YXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRBbmRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoamF2YVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc05vblBlcnNpc3RhYmxlTWV0aG9kQW5ub3RhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWROb25QZXJzaXN0YWJsZU1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzUGVyc2lzdGFibGVNZXRob2RBbmROb25QZXJzaXN0YWJsZUZpZWxkQW5ub3RhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRQZXJzaXN0YWJsZU1ldGhvZE5vblBlcnNpc3RhYmxlRmllbGQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoamF2YVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc05vUGVyc2lzdGFibGVGaWVsZHNBbm5vdGF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU5vUGVyc2lzdGFibGVGaWVsZHMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoamF2YVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQl9Ci0KLQkvL3RoaXMgaXMgaW52YWxpZCBhbmQgY292ZXJlZCBieSB2YWxpZGF0aW9uIChidWcgMzYwMDAyKQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NDb25zdHJ1Y3RvckFubm90YXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkQ29uc3RydWN0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoamF2YVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWROb25QZXJzaXN0YWJsZU1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldE5hbWVNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZFBlcnNpc3RhYmxlTWV0aG9kTm9uUGVyc2lzdGFibGVGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbHVtbiIpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgdHJhbnNpZW50IGludCBub3RQZXJzaXN0YWJsZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0KLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbHVtbiIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU5vUGVyc2lzdGFibGVGaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kTWVtYmVyVHlwZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5kZWxldGUoc2IuaW5kZXhPZigicHJpdmF0ZSBpbnQgaWQ7IiksIHNiLmluZGV4T2YoInByaXZhdGUgaW50IGlkOyIpICsgInByaXZhdGUgaW50IGlkOyIubGVuZ3RoKCkpOwotCQkJCXNiLmRlbGV0ZShzYi5pbmRleE9mKCJwcml2YXRlIFN0cmluZyBuYW1lOyIpLCBzYi5pbmRleE9mKCJwcml2YXRlIFN0cmluZyBuYW1lOyIpICsgInByaXZhdGUgU3RyaW5nIG5hbWU7Ii5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZTBkZjguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgPSAiTVlfQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSI7Ci0KLQkJCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgSlBBLk9ORV9UT19PTkUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQXNzb2NpYXRpb25PdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCi0JCQotCXB1YmxpYyBKYXZhQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUVfICsgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbE92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbE92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIEtpbmQuVFlQRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBLaW5kLlRZUEUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUob3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlKYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbE92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRPdmVycmlkZSA9IHZpcnR1YWxPdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSBzcGVjaWZpZWRPdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBLaW5kLlRZUEUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQotCQkKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbjEgPSBqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbjEuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uMiA9IGpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IGpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBhc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLmpvaW5Db2x1bW5BdCgzKS5nZXROYW1lKCkpOyAgLy8gdGhlIG9sZCBkZWZhdWx0IGpvaW4gY29sdW1uCi0JCQotCQlhc3NlcnRFcXVhbHMoNCwgam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMiwgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4zLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjEsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCQotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOyAgLy8gdGhlIG9sZCBkZWZhdWx0IGpvaW4gY29sdW1uCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRPdmVycmlkZSA9IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSA9IHNwZWNpZmllZE92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIEtpbmQuVFlQRSk7Ci0JQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0KLQkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJam9pbmluZ1N0cmF0ZWd5LnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygzLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0KLQkJam9pbmluZ1N0cmF0ZWd5LnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWpvaW5pbmdTdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCWpvaW5pbmdTdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRPdmVycmlkZSA9IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSA9IHNwZWNpZmllZE92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIEtpbmQuVFlQRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJCi0JCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscyg0LCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJCi0JCWpvaW5pbmdTdHJhdGVneS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCWpvaW5pbmdTdHJhdGVneS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkT3ZlcnJpZGUgPSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSBzcGVjaWZpZWRPdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBLaW5kLlRZUEUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCi0JCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5hZGRKb2luQ29sdW1uKDApOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuYWRkSm9pbkNvbHVtbigxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmFkZEpvaW5Db2x1bW4oMik7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLnNldE5hbWUoIkZPTyIpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLnNldE5hbWUoIkJBUiIpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLm1vdmVKb2luQ29sdW1uKDIsIDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UubW92ZUpvaW5Db2x1bW4oMCwgMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5yZW1vdmVKb2luQ29sdW1uKDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UucmVtb3ZlSm9pbkNvbHVtbigxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UucmVtb3ZlSm9pbkNvbHVtbigwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLnJlbW92ZUpvaW5Db2x1bW4oMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGVudGl0eS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGVudGl0eS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShhc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFBdHRyaWJ1dGVPdmVycmlkZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFBdHRyaWJ1dGVPdmVycmlkZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YmI5NzAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQXR0cmlidXRlT3ZlcnJpZGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSA9ICJNWV9BVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSA9ICJNWV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX05BTUUiOwotCQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIsIGNvbHVtbj1AQ29sdW1uKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9OQU1FICsgIlwiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0KLQkJCi0JcHVibGljIEphdmFBdHRyaWJ1dGVPdmVycmlkZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEF0dHJpYnV0ZU92ZXJyaWRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhBdHRyaWJ1dGVPdmVycmlkZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX05BTUUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uR2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEF0dHJpYnV0ZU92ZXJyaWRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbiBjb2x1bW4gPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW5SZXNvdXJjZSA9IGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UuZ2V0Q29sdW1uKCk7Ci0JCWNvbHVtblJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCQotCQljb2x1bW4gPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbHVtblNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhBdHRyaWJ1dGVPdmVycmlkZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW4gY29sdW1uID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJY29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtblJlc291cmNlID0gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZS5nZXRDb2x1bW4oKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbHVtblJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQljb2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLmdldENvbHVtbigpKTsKLQkJYXNzZXJ0Tm90TnVsbChzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb2x1bW5EZWZhdWx0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgZW50aXR5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgbWFwcGVkU3VwZXJjbGFzcyA9IENvbGxlY3Rpb25Ub29scy5saXN0KGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpKS5nZXQoMSkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbHVtbkRlZmF1bHRUYWJsZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGVudGl0eS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCi0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgbWFwcGVkU3VwZXJjbGFzcyA9IENvbGxlY3Rpb25Ub29scy5saXN0KGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpKS5nZXQoMSkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgZW50aXR5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGVudGl0eS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBLaW5kLlRZUEUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUJhc2ljTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFCYXNpY01hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Njc1YTYwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUJhc2ljTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNlRW51bWVyYXRlZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkxvYkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZVRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtZXJhdGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkxvYkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEphdmFCYXNpY01hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZ0ZldGNoT3B0aW9uYWxTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMsIEpQQS5GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyhmZXRjaD1GZXRjaFR5cGUuRUFHRVIsIG9wdGlvbmFsPWZhbHNlKSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aExvYigpIHRocm93cyBFeGNlcHRpb24gewkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5MT0IpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQExvYiIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuRU5VTUVSQVRFRCwgSlBBLkVOVU1fVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW51bWVyYXRlZChFbnVtVHlwZS5TVFJJTkcpIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlRFTVBPUkFMLCBKUEEuVEVNUE9SQUxfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCQotCXB1YmxpYyBKYXZhQmFzaWNNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QmFzaWNHZXREZWZhdWx0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBiYXNpY01hcHBpbmcuZ2V0RGVmYXVsdEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQmFzaWNHZXREZWZhdWx0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgYmFzaWNNYXBwaW5nLmdldERlZmF1bHRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgYmFzaWNNYXBwaW5nLmdldEZldGNoKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsJCQotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIGJhc2ljTWFwcGluZy5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNBbm5vdGF0aW9uIGJhc2ljID0gKEJhc2ljQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQyk7Ci0JCWJhc2ljLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIGJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZEZldGNoMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZ0ZldGNoT3B0aW9uYWxTcGVjaWZpZWQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQkFTSUMpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZLCBiYXNpYy5nZXRGZXRjaCgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkJBU0lDKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRGZXRjaDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWNyZWF0ZU9ybVhtbEZpbGUoKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydFRydWUoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSByZXNvdXJjZVR5cGUuZ2V0TWV0aG9kcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkxBWlksIGJhc2ljLmdldEZldGNoKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCi0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQykpOwotCQkKLQkJYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU9ybVhtbEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEJhc2ljVG9EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlhc3NlcnROb3RTYW1lKGJhc2ljTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRUcnVlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9EZWZhdWx0QmFzaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRFbnVtVHlwZShFbnVtVHlwZS5TVFJJTkcpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb252ZXJ0ZXIoKSkuZ2V0RW51bVR5cGUoKSk7Ci0JCQotCQlhc3NlcnROdWxsKCgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSAoKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb1ZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgKChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvRW1iZWRkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9FbWJlZGRlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvVHJhbnNpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvT25lVG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCQotLy9UT0RPCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKElPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgKChJT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9PbmVUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJCi0vL1RPRE8JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoSU9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLS8vCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQubWFwcGluZ0Fubm90YXRpb24oT25lVG9NYW55LkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9NYW55VG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJCi0vL1RPRE8JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoSU1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgKChJTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9NYW55VG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJCi0vL1RPRE8JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoSU1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0vLwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLm1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb01hbnkuQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJhc2ljR2V0RGVmYXVsdE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGJhc2ljTWFwcGluZy5pc0RlZmF1bHRPcHRpb25hbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEJhc2ljR2V0RGVmYXVsdE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBiYXNpY01hcHBpbmcuaXNEZWZhdWx0T3B0aW9uYWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyh0cnVlLCBiYXNpY01hcHBpbmcuaXNPcHRpb25hbCgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYmFzaWNNYXBwaW5nLmlzT3B0aW9uYWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQkFTSUMpOwotCQliYXNpYy5zZXRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3B0aW9uYWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nRmV0Y2hPcHRpb25hbFNwZWNpZmllZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNBbm5vdGF0aW9uIGJhc2ljID0gKEJhc2ljQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYmFzaWMuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkT3B0aW9uYWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydFRydWUoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLlRSVUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNBbm5vdGF0aW9uIGJhc2ljID0gKEJhc2ljQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpYy5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0KLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQkFTSUMpKTsKLQkJCi0JCWJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRPcHRpb25hbFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQkFTSUMpOwotCQliYXNpYy5zZXRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQkKLQkJYmFzaWMuc2V0T3B0aW9uYWwobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZShiYXNpY01hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQkJCi0JCWJhc2ljLnNldE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlyZXNvdXJjZUZpZWxkLnNldFByaW1hcnlBbm5vdGF0aW9uKG51bGwsIEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuaXNPcHRpb25hbCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdElzTG9iKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkgPT0gTG9iQ29udmVydGVyLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzTG9iMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aExvYigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRUcnVlKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkgPT0gTG9iQ29udmVydGVyLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldExvYigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKExvYkNvbnZlcnRlci5jbGFzcyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzTG9iVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkgPT0gTG9iQ29udmVydGVyLmNsYXNzKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpID09IExvYkNvbnZlcnRlci5jbGFzcyk7Ci0JCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBMb2JDb252ZXJ0ZXIuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJhc2ljR2V0RGVmYXVsdENvbnZlcnRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRCYXNpY0dldERlZmF1bHRDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbnVtZXJhdGVkQW5ub3RhdGlvbiBlbnVtZXJhdGVkQW5ub3RhdGlvbiA9IChFbnVtZXJhdGVkQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXREZWZhdWx0RW51bVR5cGUoKSk7Ci0JCQotCQllbnVtZXJhdGVkQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZS5TVFJJTkcpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCAoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVudW1lcmF0ZWQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCAoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyLmNsYXNzKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVudW1lcmF0ZWRBbm5vdGF0aW9uIGVudW1lcmF0ZWQgPSAoRW51bWVyYXRlZEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChlbnVtZXJhdGVkKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVudW1lcmF0ZWQuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKEVudW1UeXBlLlNUUklORyk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZS5TVFJJTkcsIGVudW1lcmF0ZWQuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRFbnVtZXJhdGVkVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbnVtZXJhdGVkQW5ub3RhdGlvbiBlbnVtZXJhdGVkID0gKEVudW1lcmF0ZWRBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZW51bWVyYXRlZC5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZS5TVFJJTkcpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCQotCQllbnVtZXJhdGVkLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZShiYXNpY01hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MsIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGVtcG9yYWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGVtcG9yYWwoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzLCBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRlbXBvcmFsQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChUZW1wb3JhbEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUZW1wb3JhbFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGVtcG9yYWxBbm5vdGF0aW9uIHRlbXBvcmFsID0gKFRlbXBvcmFsQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0ZW1wb3JhbC5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuREFURSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcywgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFNhbWUoYmFzaWNNYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJY29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQ2FzY2FkZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFDYXNjYWRlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJmZTYwOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFDYXNjYWRlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFDYXNjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhQ2FzY2FkZVRlc3RzCi0JZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCQotCXB1YmxpYyBKYXZhQ2FzY2FkZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FzY2FkZUFsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFDYXNjYWRlIGNhc2NhZGUgPSBtYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGFubm90YXRpb24uaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJLy9zZXQgYWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlhbm5vdGF0aW9uLnNldENhc2NhZGVBbGwodHJ1ZSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNDYXNjYWRlQWxsKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCQotCQkvL3NldCBhbGwgdG8gZmFsc2UgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWFubm90YXRpb24uc2V0Q2FzY2FkZUFsbChmYWxzZSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uLmlzQ2FzY2FkZUFsbCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0FsbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBtYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhQ2FzY2FkZSBjYXNjYWRlID0gbWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uLmlzQ2FzY2FkZUFsbCgpKTsKLQkJCQkJCi0JCS8vc2V0IGFsbCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJY2FzY2FkZS5zZXRBbGwodHJ1ZSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc0Nhc2NhZGVBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0FsbCgpKTsKLQkJCi0JCS8vc2V0IGFsbCB0byBmYWxzZSBpbiB0aGUgY29udGV4dCBtb2RlbAotCQljYXNjYWRlLnNldEFsbChmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKGFubm90YXRpb24uaXNDYXNjYWRlQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBtYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhQ2FzY2FkZSBjYXNjYWRlID0gbWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbi5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQkKLQkJLy9zZXQgcGVyc2lzdCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYW5ub3RhdGlvbi5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQkKLQkJLy9zZXQgcGVyc2lzdCB0byBmYWxzZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYW5ub3RhdGlvbi5zZXRDYXNjYWRlUGVyc2lzdChmYWxzZSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBtYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhQ2FzY2FkZSBjYXNjYWRlID0gbWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbi5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQkJCQkKLQkJLy9zZXQgcGVyc2lzdCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJY2FzY2FkZS5zZXRQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJCi0JCS8vc2V0IHBlcnNpc3QgdG8gZmFsc2UgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJY2FzY2FkZS5zZXRQZXJzaXN0KGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbi5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhc2NhZGVNZXJnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFDYXNjYWRlIGNhc2NhZGUgPSBtYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbi5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJCi0JCS8vc2V0IG1lcmdlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlhbm5vdGF0aW9uLnNldENhc2NhZGVNZXJnZSh0cnVlKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCQotCQkvL3NldCBtZXJnZSB0byBmYWxzZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYW5ub3RhdGlvbi5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbi5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZU1lcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFPbmVUb09uZU1hcHBpbmcgbWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YUNhc2NhZGUgY2FzY2FkZSA9IG1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQkKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkJCQkKLQkJLy9zZXQgbWVyZ2UgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCWNhc2NhZGUuc2V0TWVyZ2UodHJ1ZSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCQotCQkvL3NldCBtZXJnZSB0byBmYWxzZSBpbiB0aGUgY29udGV4dCBtb2RlbAotCQljYXNjYWRlLnNldE1lcmdlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbi5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FzY2FkZVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFDYXNjYWRlIGNhc2NhZGUgPSBtYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGFubm90YXRpb24uaXNDYXNjYWRlUmVtb3ZlKCkpOwotCQkKLQkJLy9zZXQgcmVtb3ZlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlhbm5vdGF0aW9uLnNldENhc2NhZGVSZW1vdmUodHJ1ZSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNDYXNjYWRlUmVtb3ZlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCQotCQkvL3NldCByZW1vdmUgdG8gZmFsc2UgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWFubm90YXRpb24uc2V0Q2FzY2FkZVJlbW92ZShmYWxzZSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBtYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhQ2FzY2FkZSBjYXNjYWRlID0gbWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkJCQkJCi0JCS8vc2V0IHJlbW92ZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJY2FzY2FkZS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJCi0JCS8vc2V0IHJlbW92ZSB0byBmYWxzZSBpbiB0aGUgY29udGV4dCBtb2RlbAotCQljYXNjYWRlLnNldFJlbW92ZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKGFubm90YXRpb24uaXNDYXNjYWRlUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBtYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhQ2FzY2FkZSBjYXNjYWRlID0gbWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbi5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCQkKLQkJLy9zZXQgcmVmcmVzaCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYW5ub3RhdGlvbi5zZXRDYXNjYWRlUmVmcmVzaCh0cnVlKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQkKLQkJLy9zZXQgcmVmcmVzaCB0byBmYWxzZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYW5ub3RhdGlvbi5zZXRDYXNjYWRlUmVmcmVzaChmYWxzZSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uLmlzQ2FzY2FkZVJlZnJlc2goKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBtYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhQ2FzY2FkZSBjYXNjYWRlID0gbWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbi5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCQkJCQkKLQkJLy9zZXQgcmVmcmVzaCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJY2FzY2FkZS5zZXRSZWZyZXNoKHRydWUpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJCi0JCS8vc2V0IHJlZnJlc2ggdG8gZmFsc2UgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJY2FzY2FkZS5zZXRSZWZyZXNoKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbi5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFDb2x1bW5UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQ29sdW1uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRmMzU5My4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFDb2x1bW5UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmF2YUNvbHVtblRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05BTUUgPSAiTVlfQ09MVU1OIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJNWV9UQUJMRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9ERUZJTklUSU9OID0gIk1ZX0NPTFVNTl9ERUZJTklUSU9OIjsKLQkKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRCYXNpY0NvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lPVwiIiArIENPTFVNTl9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtblRhYmxlU2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpOwotCQkJCXNiLmFwcGVuZCgiQENvbHVtbih0YWJsZT1cIiIgKyBUQUJMRV9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5Db2x1bW5EZWZpbml0aW9uU2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpOwotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihjb2x1bW5EZWZpbml0aW9uPVwiIiArIENPTFVNTl9ERUZJTklUSU9OICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIEphdmFDb2x1bW5UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdEJhc2ljQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHROYW1lU3BlY2lmaWVkTmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoYmFzaWNNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROYW1lKCksIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0QmFzaWNDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWVTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0QmFzaWNDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkTmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0QmFzaWNDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZVVwZGF0ZXNGcm9tUmVzb3VyY2VDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uQW5ub3RhdGlvbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJY29sdW1uQW5ub3RhdGlvbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQljb2x1bW5Bbm5vdGF0aW9uLnNldE5hbWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkVGFibGVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtblRhYmxlU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRUYWJsZVNwZWNpZmllZFRhYmxlTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygoKEVudGl0eSkgYmFzaWNNYXBwaW5nLmdldFR5cGVNYXBwaW5nKCkpLmdldE5hbWUoKSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdEJhc2ljQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtblRhYmxlU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb2x1bW4uZ2V0VGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRUYWJsZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtblRhYmxlU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGVVcGRhdGVzRnJvbVJlc291cmNlQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCi0JCWNvbHVtbi5zZXRUYWJsZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQljb2x1bW4uc2V0VGFibGUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9ERUZJTklUSU9OLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtblRhYmxlU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJmb28iKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbHVtbkRlZmluaXRpb25VcGRhdGVzRnJvbVJlc291cmNlQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNTUpKTsKLQkJYXNzZXJ0RXF1YWxzKDU1LCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDU1KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9MRU5HVEgsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbkFubm90YXRpb24gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQljb2x1bW5Bbm5vdGF0aW9uLnNldExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNjYpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDY2KSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDY2LCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQkKLQkJY29sdW1uQW5ub3RhdGlvbi5zZXRMZW5ndGgobnVsbCk7CQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7CQotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDEwMCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW5Bbm5vdGF0aW9uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTAwKSwgY29sdW1uQW5ub3RhdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoY29sdW1uQW5ub3RhdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UHJlY2lzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNTUpKTsKLQkJYXNzZXJ0RXF1YWxzKDU1LCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFByZWNpc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDU1KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFByZWNpc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbkFubm90YXRpb24gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQljb2x1bW5Bbm5vdGF0aW9uLnNldFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNjYpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDY2KSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDY2LCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQkKLQkJY29sdW1uQW5ub3RhdGlvbi5zZXRQcmVjaXNpb24obnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwkKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRQcmVjaXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZigxMDApKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uQW5ub3RhdGlvbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwMCksIGNvbHVtbkFubm90YXRpb24uZ2V0UHJlY2lzaW9uKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24obnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbHVtbkFubm90YXRpb24uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTY2FsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9TQ0FMRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDU1KSk7Ci0JCWFzc2VydEVxdWFscyg1NSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFNjYWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5Db2x1bW5EZWZpbml0aW9uU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0U2NhbGUoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNTUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1NDQUxFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFNjYWxlKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFNjYWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW5Bbm5vdGF0aW9uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJY29sdW1uQW5ub3RhdGlvbi5zZXRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNjYpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDY2KSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNjYsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCWNvbHVtbkFubm90YXRpb24uc2V0U2NhbGUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkU2NhbGUoKSk7CQotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFNjYWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5Db2x1bW5EZWZpbml0aW9uU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDEwMCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW5Bbm5vdGF0aW9uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTAwKSwgY29sdW1uQW5ub3RhdGlvbi5nZXRTY2FsZSgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbHVtbkFubm90YXRpb24uZ2V0U2NhbGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlCYXNlQ29sdW1uLkRFRkFVTFRfVU5JUVVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlCYXNlQ29sdW1uLkRFRkFVTFRfVU5JUVVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNEZWZhdWx0VW5pcXVlKCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlCYXNlQ29sdW1uLkRFRkFVTFRfVU5JUVVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNEZWZhdWx0VW5pcXVlKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbkFubm90YXRpb24gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQljb2x1bW5Bbm5vdGF0aW9uLnNldFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCQotCQljb2x1bW5Bbm5vdGF0aW9uLnNldFVuaXF1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7CQotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbkFubm90YXRpb24gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbkFubm90YXRpb24uZ2V0VW5pcXVlKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbHVtbkFubm90YXRpb24uZ2V0VW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlCYXNlQ29sdW1uLkRFRkFVTFRfSU5TRVJUQUJMRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0SW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhSZWFkT25seUJhc2VDb2x1bW4uREVGQVVMVF9JTlNFUlRBQkxFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhSZWFkT25seUJhc2VDb2x1bW4uREVGQVVMVF9JTlNFUlRBQkxFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbkFubm90YXRpb24gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQljb2x1bW5Bbm5vdGF0aW9uLnNldEluc2VydGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCQotCQljb2x1bW5Bbm5vdGF0aW9uLnNldEluc2VydGFibGUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsJCi0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uQW5ub3RhdGlvbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uQW5ub3RhdGlvbi5nZXRJbnNlcnRhYmxlKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChjb2x1bW5Bbm5vdGF0aW9uLmdldEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhSZWFkT25seUJhc2VDb2x1bW4uREVGQVVMVF9OVUxMQUJMRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0TnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlCYXNlQ29sdW1uLkRFRkFVTFRfTlVMTEFCTEUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5pc0RlZmF1bHROdWxsYWJsZSgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlCYXNlQ29sdW1uLkRFRkFVTFRfTlVMTEFCTEUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5pc0RlZmF1bHROdWxsYWJsZSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWROdWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uQW5ub3RhdGlvbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCWNvbHVtbkFubm90YXRpb24uc2V0TnVsbGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJCi0JCWNvbHVtbkFubm90YXRpb24uc2V0TnVsbGFibGUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7CQotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5Db2x1bW5EZWZpbml0aW9uU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbkFubm90YXRpb24gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbkFubm90YXRpb24uZ2V0TnVsbGFibGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChjb2x1bW5Bbm5vdGF0aW9uLmdldE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5QmFzZUNvbHVtbi5ERUZBVUxUX1VQREFUQUJMRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0VXBkYXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5Db2x1bW5EZWZpbml0aW9uU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5QmFzZUNvbHVtbi5ERUZBVUxUX1VQREFUQUJMRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmlzRGVmYXVsdFVwZGF0YWJsZSgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5QmFzZUNvbHVtbi5ERUZBVUxUX1VQREFUQUJMRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmlzRGVmYXVsdFVwZGF0YWJsZSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW5Bbm5vdGF0aW9uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJY29sdW1uQW5ub3RhdGlvbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQkKLQkJY29sdW1uQW5ub3RhdGlvbi5zZXRVcGRhdGFibGUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwkKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW5Bbm5vdGF0aW9uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW5Bbm5vdGF0aW9uLmdldFVwZGF0YWJsZSgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChjb2x1bW5Bbm5vdGF0aW9uLmdldFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YURpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRGlzY3JpbWluYXRvckNvbHVtblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZGFjYWUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRGlzY3JpbWluYXRvckNvbHVtblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmF2YURpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NSSU1JTkFUT1JfQ09MVU1OX05BTUUgPSAiTVlfRElTQ1JJTUlOQVRPUl9DT0xVTU4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fREVGSU5JVElPTiA9ICJNWV9DT0xVTU5fREVGSU5JVElPTiI7Ci0JCi0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQERpc2NyaW1pbmF0b3JDb2x1bW4obmFtZT1cIiIgKyBESVNDUklNSU5BVE9SX0NPTFVNTl9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGFic3RyYWN0IGNsYXNzICIpLmFwcGVuZChUWVBFX05BTUUpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIEZJTEVfTkFNRSwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JCQotCXB1YmxpYyBKYXZhRGlzY3JpbWluYXRvckNvbHVtblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhESVNDUklNSU5BVE9SX0NPTFVNTl9OQU1FLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0TmFtZVNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJEVFlQRSIsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCi0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkRUWVBFIiwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiRFRZUEUiLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZVNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiRFRZUEUiLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhESVNDUklNSU5BVE9SX0NPTFVNTl9OQU1FLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yQ29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBkaXNjcmltaW5hdG9yQ29sdW1uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yQ29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQotCQlhc3NlcnROdWxsKGRpc2NyaW1pbmF0b3JDb2x1bW4pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLlNUUklORywgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREaXNjcmltaW5hdG9yVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5TVFJJTkcsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0KLQkJZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS5DSEFSKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLkNIQVIsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gZGlzY3JpbWluYXRvckNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJZGlzY3JpbWluYXRvckNvbHVtbi5zZXREaXNjcmltaW5hdG9yVHlwZShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVHlwZS5DSEFSKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvclR5cGUuQ0hBUiwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUuQ0hBUik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yQ29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JUeXBlLkNIQVIsIGRpc2NyaW1pbmF0b3JDb2x1bW4uZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCQotCQlnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREaXNjcmltaW5hdG9yVHlwZVVwZGF0ZXNGcm9tUmVzb3VyY2VDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0KLQkJY29sdW1uLnNldERpc2NyaW1pbmF0b3JUeXBlKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JUeXBlLklOVEVHRVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLklOVEVHRVIsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5JTlRFR0VSLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJY29sdW1uLnNldERpc2NyaW1pbmF0b3JUeXBlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0RJU0NSSU1JTkFUT1JfVFlQRSwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCQotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTEVOR1RILCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDU1KSk7Ci0JCWFzc2VydEVxdWFscyg1NSwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCi0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCi0JCWdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1NSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEgsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yQ29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQlkaXNjcmltaW5hdG9yQ29sdW1uLnNldExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNjYpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDY2KSwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2NiwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CQkKLQkJZGlzY3JpbWluYXRvckNvbHVtbi5zZXROYW1lKG51bGwpOwotCQlkaXNjcmltaW5hdG9yQ29sdW1uLnNldExlbmd0aChudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwkKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCQotCQlnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoMTAwKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yQ29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMDApLCBkaXNjcmltaW5hdG9yQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRMZW5ndGhVcGRhdGVzRnJvbVJlc291cmNlQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQotCQljb2x1bW4uc2V0TGVuZ3RoKEludGVnZXIudmFsdWVPZig3OCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3OCksIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNzgsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQkKLQkJY29sdW1uLnNldExlbmd0aChudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldExlbmd0aCgpKTsKLQotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEgsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oQ09MVU1OX0RFRklOSVRJT04pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhDT0xVTU5fREVGSU5JVElPTiwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0KLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJmb28iKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQlnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLiIgKyAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFFbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFbnRpdHkgY2hpbGRFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJLy90ZXN0IGRlZmF1bHRzIHdpdGggc2luZ2xlLXRhYmxlIGluaGVyaXRhbmNlLCBubyBzcGVjaWZpZWQgZGlzY3JpbWluYXRvciBjb2x1bW4gc2V0Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBhYnN0cmFjdEVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9OQU1FLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTEVOR1RILCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9ESVNDUklNSU5BVE9SX1RZUEUsIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTkFNRSwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCi0JCQotCQkvL3Rlc3QgZGVmYXVsdHMgd2l0aCBzaW5nbGUtdGFibGUgaW5oZXJpdGFuY2UsIHNwZWNpZmllZCBkaXNjcmltaW5hdG9yIGNvbHVtbiBzZXQgb24gcm9vdAotCQlhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRFRZUEUyIik7Ci0JCWFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlLkNIQVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGFic3RyYWN0RW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX05BTUUsIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEgsIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0RJU0NSSU1JTkFUT1JfVFlQRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJEVFlQRTIiLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLkNIQVIsIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBjaGlsZEVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJEVFlQRTIiLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLkNIQVIsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCQotCQkKLQkJLy90ZXN0IGRlZmF1bHRzIHdpdGggdGFibGUtcGVyLWNsYXNzIGluaGVyaXRhbmNlLCBkaXNjcmltaW5hdG9yIGNvbHVtbiBkb2VzIG5vdCBhcHBseQotCQlhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChudWxsKTsKLQkJYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKG51bGwpOwotCQlhYnN0cmFjdEVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGFic3RyYWN0RW50aXR5LmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbWJlZGRhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5NjkyMC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbWJlZGRhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU51bGxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEphdmFFbWJlZGRhYmxlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCi0JcHVibGljIEphdmFFbWJlZGRhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbnRpdHkpOwotCQkKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYXBwZWRTdXBlcmNsYXNzKTsKLQkJCi0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFbWJlZGRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9OdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFOdWxsVHlwZU1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRhYmxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IGVtYmVkZGFibGUuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSwgImlkIik7Ci0JCWFzc2VydEVxdWFscyhvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSwgIm5hbWUiKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gZW1iZWRkYWJsZS5nZXRPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlTmFtZUlzSW52YWxpZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEZhbHNlKGVtYmVkZGFibGUudGFibGVOYW1lSXNJbnZhbGlkKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkYWJsZS50YWJsZU5hbWVJc0ludmFsaWQoIkZPTyIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUoZW1iZWRkYWJsZS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbWJlZGRhYmxlLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkYWJsZS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkYWJsZS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkYWJsZS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkYWJsZS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRhYmxlLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGFibGUuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGFibGUuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGFibGUuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0ZWRUYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRGYWxzZShlbWJlZGRhYmxlLmdldEFzc29jaWF0ZWRUYWJsZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0ZWRUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRGYWxzZShlbWJlZGRhYmxlLmdldEFsbEFzc29jaWF0ZWRUYWJsZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGVkVGFibGVOYW1lc0luY2x1ZGluZ0luaGVyaXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEZhbHNlKGVtYmVkZGFibGUuZ2V0QWxsQXNzb2NpYXRlZFRhYmxlTmFtZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCS8vVE9ETyBuZWVkIHRvIGNyZWF0ZSBhIHN1YmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgYW5kIHRlc3QgdGhpcwotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMgPSBlbWJlZGRhYmxlLmdldE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5oYXNOZXh0KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRJZE1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRJZE1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzUyMTY4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkSWRNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhRW1iZWRkZWRJZE1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERBQkxFX1RZUEVfTkFNRSA9ICJNeUVtYmVkZGFibGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIEVNQkVEREFCTEVfVFlQRV9OQU1FOwotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuRU1CRURERURfSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGVkSWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgRU1CRUREQUJMRV9UWVBFX05BTUUgKyIgbXlFbWJlZGRlZElkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVtYmVkZGFibGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZChFTUJFRERBQkxFX1RZUEVfTkFNRSkuYXBwZW5kKCIgeyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgRU1CRUREQUJMRV9UWVBFX05BTUUgKyAiLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQotCXB1YmxpYyBKYXZhRW1iZWRkZWRJZE1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKCgoSmF2YUVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0T3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRFbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBHZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBWZXJzaW9uTWFwcGluZyk7Ci0JCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBJZE1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZElkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWRJZCIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUVtYmVkZGVkSWQiLCByZXNvdXJjZUZpZWxkLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgY2l0eU1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBlbWJlZGRhYmxlLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImNpdHkiKS5nZXRNYXBwaW5nKCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlFbWJlZGRlZElkIiwgcmVzb3VyY2VGaWVsZC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUobnVsbCk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFubm90YXRpb24uc2V0TmFtZSgiY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkSWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRJZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZElkIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkSWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCi0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJjaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgic3RhdGUiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCUphdmFFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkSWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZElkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygic3RhdGUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkSWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMSwgMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZGJjMzAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhRW1iZWRkZWRNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1CRUREQUJMRV9UWVBFX05BTUUgPSAiTXlFbWJlZGRhYmxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBFTUJFRERBQkxFX1RZUEVfTkFNRTsKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkVNQkVEREVEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgRU1CRUREQUJMRV9UWVBFX05BTUUgKyAiIG15RW1iZWRkZWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW1iZWRkYWJsZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZChFTUJFRERBQkxFX1RZUEVfTkFNRSkuYXBwZW5kKCIgeyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgRU1CRUREQUJMRV9UWVBFX05BTUUgKyAiLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eUN1c3RvbWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJDdXN0b21lciIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQ3VzdG9tZXIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHN0cmVldDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBaaXBDb2RlIHppcENvZGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlppcENvZGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBwbHVzZm91cjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlppcENvZGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCi0JcHVibGljIEphdmFFbWJlZGRlZE1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKCgoRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRFbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBHZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0RW1iZWRkZWRNYXBwaW5nR2VuZXJpY0VtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0RW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RHZW5lcmljRW1iZWRkYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkVudGl0eTEiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5FbWJlZGRhYmxlMSIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0RW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgRW50aXR5MSB7ICIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwcml2YXRlIEVtYmVkZGFibGUxPEludGVnZXI+IG15RW1iZWRkYWJsZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkVudGl0eTEuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0R2VuZXJpY0VtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzIEVtYmVkZGFibGUxPFQ+IHt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRW1iZWRkYWJsZTEuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm15RW1iZWRkZWQiLCByZXNvdXJjZUZpZWxkLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgY2l0eU1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBlbWJlZGRhYmxlLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImNpdHkiKS5nZXRNYXBwaW5nKCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlFbWJlZGRlZCIsIHJlc291cmNlRmllbGQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0KLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24obnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKG51bGwpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhbm5vdGF0aW9uLnNldE5hbWUoImNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJzdGF0ZSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8PyBleHRlbmRzIFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigxLCAwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCi0JCWFzc2VydEVxdWFscygic3RhdGUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQkvLzEuMCBwcm9qZWN0cyBkbyBub3Qgc3VwcG9ydCBkb3Qtbm90YXRpb24sIHRoaXMgdGVzdHMgdG8gbWFrZSBzdXJlIHRoYXQgc3VwcG9ydCBkb2VzIG5vdCBleGlzdAotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlQZXJzaXN0ZW50VHlwZSBjdXN0b21lclBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RyZWV0IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUVtYmVkZGVkTWFwcGluZyBuZXN0ZWRFbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbmVzdGVkRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygyLCBuZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCVBlcnNpc3RlbnRUeXBlIHppcENvZGVQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUJhc2ljTWFwcGluZyBwbHVzRm91ck1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSB6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikuZ2V0TWFwcGluZygpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEUiKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCi0JCS8vY2hlY2sgdGhlIG5lc3RlZCBlbWJlZGRlZCAoQWRkcmVzcy56aXBDb2RlKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IGl0IGlzIGdldHRpbmcgc2V0dGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvbiBaaXBjb2RlLnBsdXNmb3VyCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9ICgoRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0T3ZlcnJpZGVOYW1lZCgicGx1c2ZvdXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0KLQkJLy9jaGVjayB0aGUgdG9wLWxldmVsIGVtYmVkZGVkIChDdXN0b21lci5hZGRyZXNzKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IHRoZXJlIGlzIG5vIGF0dHJpYnV0ZSBvdmVycmlkZSBuYW1lZCB6aXBDb2RlLnBsdXNmb3VyCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9ICgoRW1iZWRkZWRNYXBwaW5nKSBjdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlTmFtZWQoInppcENvZGUucGx1c2ZvdXIiKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVudGl0eVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbnRpdHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWQxZDFiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVudGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5OYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU51bGxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnRpdHlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQ2xhc3NBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTmFtZWRRdWVyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmF2YUVudGl0eVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX05BTUUgPSAiZW50aXR5TmFtZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAiTVlfVEFCTEUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDUklNSU5BVE9SX1ZBTFVFID0gIk1ZX0RJU0NSSU1JTkFUT1JfVkFMVUUiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQl9UWVBFX05BTUUgPSAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FID0gUEFDS0FHRV9OQU1FICsgIi4iICsgU1VCX1RZUEVfTkFNRTsKLQkKLQkKLQlwdWJsaWMgSmF2YUVudGl0eVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5SW52YWxpZE5hbWVkUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEuTkFNRURfUVVFUklFUywgSlBBLk5BTUVEX1FVRVJZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZFF1ZXJpZXModmFsdWU9e0BOYW1lZFF1ZXJ5KHF1ZXJ5PVwiYXNkZlwiLCBuYW1lPVwiZm9vXCIpLCBATmFtZWRRdWVyfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBhYnN0cmFjdCBjbGFzcyAiKS5hcHBlbmQoVFlQRV9OQU1FKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCBGSUxFX05BTUUsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0aW9uT25Qcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KAotCQkJCQlKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIAotCQkJCQlKUEEuQkFTSUMsCi0JCQkJCUpQQS5WRVJTSU9OLAotCQkJCQlKUEEuVFJBTlNJRU5ULAotCQkJCQlKUEEuRU1CRURERUQsCi0JCQkJCUpQQS5FTUJFRERFRF9JRCwKLQkJCQkJSlBBLk9ORV9UT19PTkUsCi0JCQkJCUpQQS5PTkVfVE9fTUFOWSwKLQkJCQkJSlBBLk1BTllfVE9fT05FLAotCQkJCQlKUEEuTUFOWV9UT19NQU5ZLAotCQkJCQlKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBCYXNpYyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYmFzaWM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBWZXJzaW9uIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB2ZXJzaW9uOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAVHJhbnNpZW50Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB0cmFuc2llbnQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgZW1iZWRkZWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZElkIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBlbWJlZGRlZElkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgIiArIFNVQl9UWVBFX05BTUUgKyAiIG9uZVRvT25lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBvbmVUb01hbnk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IG1hbnlUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IG1hbnlUb01hbnk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JTkhFUklUQU5DRSwgSlBBLklOSEVSSVRBTkNFX1RZUEUsIEpQQS5PTkVfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBJbmhlcml0YW5jZShzdHJhdGVneT1Jbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKSIpOwotCQkJCXNiLmFwcGVuZCgiYWJzdHJhY3QiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eShuYW1lPVwiIiArIEVOVElUWV9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5UQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGUobmFtZT1cIiIgKyBUQUJMRV9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhJbmhlcml0YW5jZSgpIHRocm93cyBFeGNlcHRpb24gewkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JTkhFUklUQU5DRSwgSlBBLklOSEVSSVRBTkNFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5ESVNDUklNSU5BVE9SX1ZBTFVFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBEaXNjcmltaW5hdG9yVmFsdWUodmFsdWU9XCIiICsgRElTQ1JJTUlOQVRPUl9WQUxVRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZShuYW1lPVwiZm9vXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWU9XCJmb29cIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiYmFyXCIpfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUFic3RyYWN0VGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklOSEVSSVRBTkNFLCBKUEEuSU5IRVJJVEFOQ0VfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJASW5oZXJpdGFuY2Uoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUykiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiYWJzdHJhY3QiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0SWRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiVGVzdFR5cGVJZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJUZXN0VHlwZUlkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVudGl0eSBlbnRpdHkgPSAoSmF2YUVudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQllbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQllbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCXJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgiYXNkZiIpOwotCQllbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQllbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJZW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWVudGl0eS5nZXRJZENsYXNzUmVmZXJlbmNlKCkuc2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoIm15SWRDbGFzcyIpOwotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwotCQkKLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYXBwZWRTdXBlcmNsYXNzKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEluaGVyaXRhbmNlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW50aXR5IGVudGl0eSA9IChKYXZhRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQllbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCWVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCXJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCJhc2RmIik7Ci0JCWVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQllbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJZW50aXR5LmdldElkQ2xhc3NSZWZlcmVuY2UoKS5zZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgibXlJZENsYXNzIik7Ci0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7Ci0JCQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkYWJsZSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJbmhlcml0YW5jZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVudGl0eSBlbnRpdHkgPSAoSmF2YUVudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQllbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQllbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCXJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgiYXNkZiIpOwotCQllbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQllbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJZW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWVudGl0eS5nZXRJZENsYXNzUmVmZXJlbmNlKCkuc2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoIm15SWRDbGFzcyIpOwotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwotCQkKLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFOdWxsVHlwZU1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKFRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSW5oZXJpdGFuY2VBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzTm9Bbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NBbm5vdGF0aW9uc09uU3VwZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRpb25PblByb3BlcnR5KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRV8gKyAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNoaWxkUGVyc2lzdGVudFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJUGVyc2lzdGVudFR5cGUgc3VwZXJQZXJzaXN0ZW50VHlwZSA9IGNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIHN1cGVyUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CQkKLQkJCi0JCSgoSWRNYXBwaW5nKSBzdXBlclBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUuZ2V0TWV0aG9kcygpLml0ZXJhdG9yKCkubmV4dCgpLnJlbW92ZUFubm90YXRpb24oSlBBLklEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCS8vbm8gbWFwcGluZyhJZCkgYW5ub3RhdGlvbiwgYnV0IHN0aWxsIGEgQ29sdW1uIGFubm90YXRpb24sIHNvIGFjY2VzcyBzaG91bGQgc3RpbGwgYmUgcHJvcGVydHkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIHN1cGVyUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0KLQkJKChCYXNpY01hcHBpbmcpIHN1cGVyUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgc3VwZXJQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBjaGlsZFBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIHN1cGVyUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJLy9zdGlsbCBhY2Nlc3NUeXBlIG9mIFBST1BFUlRZIGJlY2F1c2UgdGhlIGphdmEgY2xhc3MgaXMgbm90IHNwZWNpZmllZCBpbiB0aGlzIG9ybS54bWwKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIHN1cGVyUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlyZW1vdmVYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJLy9vbmx5IHBhcmVudCBzcGVjaWZpZWQgaW4gb3JtLnhtbCwgaSB0aGluayB0aGlzIG91dGNvbWUgaXMgcmlnaHQ/PwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJcmVtb3ZlWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQkvL2JvdGggcGFyZW50IGFuZCBjaGlsZCBzcGVjaWZpZWQgaW4gb3JtLnhtbAotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NXaXRoWG1sU2V0dGluZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRpb25PblByb3BlcnR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCQkJCi0JCSgoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQkKLQkJcmVzb3VyY2VUeXBlLmdldE1ldGhvZHMoKS5pdGVyYXRvcigpLm5leHQoKS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5JRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkvL25vIG1hcHBpbmcoSWQpIGFubm90YXRpb24sIGJ1dCBzdGlsbCBhIENvbHVtbiBhbm5vdGF0aW9uLCBzbyBhY2Nlc3Mgc2hvdWxkIHN0aWxsIGJlIHByb3BlcnR5Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkoKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQkvL3N0aWxsIGFjY2Vzc1R5cGUgb2YgUFJPUEVSVFkgYmVjYXVzZSB0aGUgamF2YSBjbGFzcyBpcyBub3Qgc3BlY2lmaWVkIGluIHRoaXMgb3JtLnhtbAotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCS8vbm93IGNsYXNzIGlzIHNwZWNpZmllZCBpbiBvcm0ueG1sLCBzbyBlbnRpdHlNYXBwaW5ncyBhY2Nlc3Mgc2V0dGluZyB3aW5zIG92ZXIgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQkKLQkJLy9hY2Nlc3NUeXBlIHNob3VsZCBiZSBQUk9QRVJUWSBub3csIGphdmEgZ2V0cyB0aGUgYWNjZXNzIGZyb20geG1sIGVudGl0eSBpZiBpdCBpcyBzcGVjaWZpZWQKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhFTlRJVFlfTkFNRSwgZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0TmFtZVNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGdldEphdmFFbnRpdHkoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWVTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgZ2V0SmF2YUVudGl0eSgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFTlRJVFlfTkFNRSwgZ2V0SmF2YUVudGl0eSgpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlnZXRKYXZhRW50aXR5KCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFbnRpdHlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJZ2V0SmF2YUVudGl0eSgpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJCi0JCWFzc2VydE51bGwoKChFbnRpdHlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVGcm9tU3BlY2lmaWVkTmFtZUNoYW5nZUluUmVzb3VyY2VNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFbnRpdHlBbm5vdGF0aW9uIGVudGl0eSA9IChFbnRpdHlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWVudGl0eS5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYWJsZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZSgpOwotCQotCQlhc3NlcnRFcXVhbHMoRU5USVRZX05BTUUsIGdldEphdmFFbnRpdHkoKS5nZXRQcmltYXJ5VGFibGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGVOYW1lMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBnZXRKYXZhRW50aXR5KCkuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRhYmxlTmFtZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIGdldEphdmFFbnRpdHkoKS5nZXRQcmltYXJ5VGFibGVOYW1lKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRhYmxlTmFtZVdpdGhOdWxsVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCVRhYmxlIHRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGUiLCBjdSk7Ci0JCQotCQl0YWJsZS5zZXRTcGVjaWZpZWROYW1lKFRBQkxFX05BTUUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKG5hbWUgPSBcIiIgKyBUQUJMRV9OQU1FICsgIlwiKSIsIGN1KTsKLQkJCi0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCBnZXRKYXZhRW50aXR5KCkuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIHRhYmxlLmdldE5hbWUoKSk7Ci0KLQkJdGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZyhUQUJMRV9OQU1FKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSW5oZXJpdGFuY2UoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGdldEphdmFFbnRpdHkoKS5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkJCi0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IHNwZWNpZmllZENsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCUVudGl0eSBjaGlsZEVudGl0eSA9IChFbnRpdHkpIHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFbnRpdHkgcm9vdEVudGl0eSA9IChFbnRpdHkpIHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0Tm90U2FtZShjaGlsZEVudGl0eSwgcm9vdEVudGl0eSk7Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBjaGlsZEVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJCi0JCS8vY2hhbmdlIHJvb3QgaW5oZXJpdGFuY2Ugc3RyYXRlZ3ksIHZlcmlmeSBkZWZhdWx0IGlzIGNoYW5nZWQgZm9yIGNoaWxkIGVudGl0eQotCQlyb290RW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIHJvb3RFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTLCBjaGlsZEVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGNoaWxkRW50aXR5LmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydE51bGwoY2hpbGRFbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJbmhlcml0YW5jZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSW5oZXJpdGFuY2VBbm5vdGF0aW9uIGluaGVyaXRhbmNlID0gKEluaGVyaXRhbmNlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSW5oZXJpdGFuY2VBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJaW5oZXJpdGFuY2Uuc2V0U3RyYXRlZ3kob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5KT0lORUQsIGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQkKLQkJaW5oZXJpdGFuY2Uuc2V0U3RyYXRlZ3kobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJbmhlcml0YW5jZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCi0JCWdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5KT0lORUQsIGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSW5oZXJpdGFuY2VBbm5vdGF0aW9uIGluaGVyaXRhbmNlID0gKEluaGVyaXRhbmNlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSW5oZXJpdGFuY2VBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZVR5cGUuSk9JTkVELCBpbmhlcml0YW5jZS5nZXRTdHJhdGVneSgpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREaXNjcmltaW5hdG9yVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKERJU0NSSU1JTkFUT1JfVkFMVUUsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yVmFsdWUoKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2V0SmF2YUVudGl0eSgpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JCQotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZ2V0SmF2YUVudGl0eSgpLmdldE5hbWUoKSwgZ2V0SmF2YUVudGl0eSgpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0KLQkJZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS5JTlRFR0VSKTsKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoRElTQ1JJTUlOQVRPUl9WQUxVRSwgZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIGRpc2NyaW1pbmF0b3JWYWx1ZSA9IChEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJZGlzY3JpbWluYXRvclZhbHVlLnNldFZhbHVlKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JCQotCQlkaXNjcmltaW5hdG9yVmFsdWUuc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoRElTQ1JJTUlOQVRPUl9WQUxVRSwgZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQotCQlnZXRKYXZhRW50aXR5KCkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCURpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24gZGlzY3JpbWluYXRvclZhbHVlID0gKERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBkaXNjcmltaW5hdG9yVmFsdWUuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlY29uZGFyeVRhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRUcnVlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZWNvbmRhcnlUYWJsZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5LmdldFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0KLQkJKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJGT08iKTsKLQkJKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDIsIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5LmdldFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZXMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YVNlY29uZGFyeVRhYmxlPiBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydFRydWUoc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0KLQkJKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJGT08iKTsKLQkJKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDIsIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBzZWNvbmRhcnlUYWJsZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBzZWNvbmRhcnlUYWJsZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVQcmVzZXJ2ZVBrSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIHNwZWNpZmllZFNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQ0FUQUxPRyIpOwotCQlzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoIlNDSEVNQSIpOwotCQlzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJQS19OQU1FIik7Ci0JCQotCQkvL2FkZCBhbm90aGVyIHNwZWNpZmllZCBzZWNvbmRhcnkgdGFibGUsIHBrSm9pbkNvbHVtbnMgZnJvbSBmaXJzdCBzaG91bGQgYmUgc2F2ZWQuCi0JCVNlY29uZGFyeVRhYmxlIHNwZWNpZmllZFNlY29uZGFyeVRhYmxlMiA9IGdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgxKTsKLQkJc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUyLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJCi0JCUl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZGFyeVRhYmxlLCBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDQVRBTE9HIiwgc2Vjb25kYXJ5VGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTQ0hFTUEiLCBzZWNvbmRhcnlUYWJsZS5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gPSBzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJQS19OQU1FIiwgcGtKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmRhcnlUYWJsZSwgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUyKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCWdldEphdmFFbnRpdHkoKS5yZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgxKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHNlY29uZGFyeVRhYmxlUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKLQkKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5yZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgxKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJc2Vjb25kYXJ5VGFibGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJZ2V0SmF2YUVudGl0eSgpLnJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCQlzZWNvbmRhcnlUYWJsZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSk7Ci0KLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCi0JCWVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQllbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFTZWNvbmRhcnlUYWJsZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFTZWNvbmRhcnlUYWJsZXMpKTsKLQkJCi0JCQotCQllbnRpdHkubW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8SmF2YVNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUYWJsZXMgPSBlbnRpdHkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQlqYXZhU2Vjb25kYXJ5VGFibGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIGphdmFTZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBqYXZhU2Vjb25kYXJ5VGFibGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgamF2YVNlY29uZGFyeVRhYmxlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQotCQllbnRpdHkubW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDAsIDEpOwotCQlzZWNvbmRhcnlUYWJsZXMgPSBlbnRpdHkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQlqYXZhU2Vjb25kYXJ5VGFibGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIGphdmFTZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBqYXZhU2Vjb25kYXJ5VGFibGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgamF2YVNlY29uZGFyeVRhYmxlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQotCQkoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOwotCQkoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMiwgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8SmF2YVNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUYWJsZXMgPSBlbnRpdHkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMiwgMCwgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzZWNvbmRhcnlUYWJsZXMgPSBlbnRpdHkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigwLCAxLCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNlY29uZGFyeVRhYmxlcyA9IGVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc2Vjb25kYXJ5VGFibGVzID0gZW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNlY29uZGFyeVRhYmxlcyA9IGVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCAgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzZWNvbmRhcnlUYWJsZXMgPSBlbnRpdHkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGVkVGFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGVkVGFibGVzKCkpKTsKLQkJSXRlcmF0b3I8UmVhZE9ubHlUYWJsZT4gYXNzb2NpYXRlZFRhYmxlcyA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGVkVGFibGVzKCkuaXRlcmF0b3IoKTsKLQkJUmVhZE9ubHlUYWJsZSB0YWJsZTEgPSBhc3NvY2lhdGVkVGFibGVzLm5leHQoKTsKLQkJU2Vjb25kYXJ5VGFibGUgdGFibGUyID0gKFNlY29uZGFyeVRhYmxlKSBhc3NvY2lhdGVkVGFibGVzLm5leHQoKTsKLQkJU2Vjb25kYXJ5VGFibGUgdGFibGUzID0gKFNlY29uZGFyeVRhYmxlKSBhc3NvY2lhdGVkVGFibGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgdGFibGUxLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGFibGUyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGFibGUzLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGVkVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IHNwZWNpZmllZENsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCUVudGl0eSBjaGlsZEVudGl0eSA9IChFbnRpdHkpIHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFbnRpdHkgcm9vdEVudGl0eSA9IChFbnRpdHkpIHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyb290RW50aXR5LmdldEFsbEFzc29jaWF0ZWRUYWJsZXMoKSkpOwotCQlJdGVyYXRvcjxSZWFkT25seVRhYmxlPiBhc3NvY2lhdGVkVGFibGVzID0gcm9vdEVudGl0eS5nZXRBbGxBc3NvY2lhdGVkVGFibGVzKCkuaXRlcmF0b3IoKTsKLQkJUmVhZE9ubHlUYWJsZSB0YWJsZTEgPSBhc3NvY2lhdGVkVGFibGVzLm5leHQoKTsKLQkJU2Vjb25kYXJ5VGFibGUgdGFibGUyID0gKFNlY29uZGFyeVRhYmxlKSBhc3NvY2lhdGVkVGFibGVzLm5leHQoKTsKLQkJU2Vjb25kYXJ5VGFibGUgdGFibGUzID0gKFNlY29uZGFyeVRhYmxlKSBhc3NvY2lhdGVkVGFibGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgdGFibGUxLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGFibGUyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGFibGUzLmdldE5hbWUoKSk7Ci0KLQkJLy9UT0RPIHByb2JhYmx5IHdhbnQgdGhpcyB0byBiZSAzLCBzaW5jZSBpbiB0aGlzIGNhc2UgdGhlIGNoaWxkIGRlc2NyaXB0b3IgcmVhbGx5IHVzZXMgdGhlCi0JCS8vcGFyZW50IHRhYmxlIGJlY2F1c2UgaXQgaXMgc2luZ2xlIHRhYmxlIGluaGVyaXRhbmNlIHN0cmF0ZWd5LiAgTm90IHN1cmUgeWV0IGhvdyB0byBkZWFsIHdpdGggdGhpcy4KLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5zaXplKGNoaWxkRW50aXR5LmdldEFsbEFzc29jaWF0ZWRUYWJsZXMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRlZFRhYmxlTmFtZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZXMoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJRW50aXR5IGNoaWxkRW50aXR5ID0gKEVudGl0eSkgc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVudGl0eSByb290RW50aXR5ID0gKEVudGl0eSkgc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUocm9vdEVudGl0eS5nZXRBbGxBc3NvY2lhdGVkVGFibGVOYW1lcygpKSk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gYXNzb2NpYXRlZFRhYmxlcyA9IHJvb3RFbnRpdHkuZ2V0QWxsQXNzb2NpYXRlZFRhYmxlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlTdHJpbmcgdGFibGUxID0gYXNzb2NpYXRlZFRhYmxlcy5uZXh0KCk7Ci0JCVN0cmluZyB0YWJsZTIgPSBhc3NvY2lhdGVkVGFibGVzLm5leHQoKTsKLQkJU3RyaW5nIHRhYmxlMyA9IGFzc29jaWF0ZWRUYWJsZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCB0YWJsZTEpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRhYmxlMik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGFibGUzKTsKLQkJCi0JCS8vVE9ETyBwcm9iYWJseSB3YW50IHRoaXMgdG8gYmUgMywgc2luY2UgaW4gdGhpcyBjYXNlIHRoZSBjaGlsZCBkZXNjcmlwdG9yIHJlYWxseSB1c2VzIHRoZQotCQkvL3BhcmVudCB0YWJsZSBiZWNhdXNlIGl0IGlzIHNpbmdsZSB0YWJsZSBpbmhlcml0YW5jZSBzdHJhdGVneS4gIE5vdCBzdXJlIHlldCBob3cgdG8gZGVhbCB3aXRoIHRoaXMuCi0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShjaGlsZEVudGl0eS5nZXRBbGxBc3NvY2lhdGVkVGFibGVOYW1lcygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTZWNvbmRhcnlUYWJsZVRvUmVzb3VyY2VNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJc2Vjb25kYXJ5VGFibGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZTIgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJc2Vjb25kYXJ5VGFibGUyLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBnZXRKYXZhRW50aXR5KCkuZ2V0U2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUzID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCXNlY29uZGFyeVRhYmxlMy5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCXNlY29uZGFyeVRhYmxlcyA9IGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU2Vjb25kYXJ5VGFibGVGcm9tUmVzb3VyY2VNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgyKS5zZXRTcGVjaWZpZWROYW1lKCJiYXoiKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBnZXRKYXZhRW50aXR5KCkuZ2V0U2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJc2Vjb25kYXJ5VGFibGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygxLCBnZXRKYXZhRW50aXR5KCkuZ2V0U2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygwLCBnZXRKYXZhRW50aXR5KCkuZ2V0U2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2VxdWVuY2VHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0SmF2YUVudGl0eSgpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZ2V0SmF2YUVudGl0eSgpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCQkKLQkJZ2V0SmF2YUVudGl0eSgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygxLCBnZXRKYXZhRW50aXR5KCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTZXF1ZW5jZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKSk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQkKLQkJLy90cnkgYWRkaW5nIGFub3RoZXIgc2VxdWVuY2UgZ2VuZXJhdG9yLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCQl0cnkgewotCQkJZ2V0SmF2YUVudGl0eSgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlyZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlnZXRKYXZhRW50aXR5KCkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpKTsKLQotCQkvL3RyeSByZW1vdmluZyB0aGUgc2VxdWVuY2UgZ2VuZXJhdG9yIGFnYWluLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCQl0cnkgewotCQkJZ2V0SmF2YUVudGl0eSgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCk7CQkKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0SmF2YUVudGl0eSgpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlyZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsJCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGdldEphdmFFbnRpdHkoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgZ2V0SmF2YUVudGl0eSgpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQkKLQkJZ2V0SmF2YUVudGl0eSgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpKTsKLQkJYXNzZXJ0Tm90TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCQotCQkvL3RyeSBhZGRpbmcgYW5vdGhlciB0YWJsZSBnZW5lcmF0b3IsIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlnZXRKYXZhRW50aXR5KCkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsJCQotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVUYWJsZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCXJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5yZW1vdmVUYWJsZUdlbmVyYXRvcigpOwotCQkKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUikpOwotCQkKLQkJLy90cnkgcmVtb3ZpbmcgdGhlIHRhYmxlIGdlbmVyYXRvciBhZ2Fpbiwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCWdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5yZW1vdmVUYWJsZUdlbmVyYXRvcigpOwkJCi0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQljb2x1bW4uc2V0TmFtZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IHNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcGtKb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJcGtKb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1ucyA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXBrSm9pbkNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCXBrSm9pbkNvbHVtbi5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0KLQkJcGtKb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJcGtKb2luQ29sdW1uLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1ucyA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1ucyA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1ucyA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkKLQkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJLy9qdXN0IHRoZSBkZWZhdWx0IHBrSm9pbkNvbHVtbiwgc28gMQotCQlhc3NlcnRFcXVhbHMoMSwgZ2V0SmF2YUVudGl0eSgpLmdldFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JCi0JCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQkvL29ubHkgdGhlIHNwZWNpZmllZCBwa0pvaW5Db2x1bW5zLCAzCi0JCWFzc2VydEVxdWFscygzLCBnZXRKYXZhRW50aXR5KCkuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGdldEphdmFFbnRpdHkoKS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCi0JCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gcGtKb2luQ29sdW1ucyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcGtKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHBrSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBwa0pvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBwa0pvaW5Db2x1bW5zID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBwa0pvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcGtKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHBrSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJZ2V0SmF2YUVudGl0eSgpLnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBwa0pvaW5Db2x1bW5SZXNvdXJjZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcGtKb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBwa0pvaW5Db2x1bW5SZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwa0pvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcGtKb2luQ29sdW1ucyA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCQotCQlnZXRKYXZhRW50aXR5KCkucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSk7Ci0JCXBrSm9pbkNvbHVtblJlc291cmNlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBwa0pvaW5Db2x1bW5SZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEZhbHNlKHBrSm9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCXBrSm9pbkNvbHVtbnMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJCi0JCWdldEphdmFFbnRpdHkoKS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJcGtKb2luQ29sdW1uUmVzb3VyY2VzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHBrSm9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwotCQlwa0pvaW5Db2x1bW5zID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCi0JCWVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQllbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnMpKTsKLQkJCi0JCQotCQllbnRpdHkubW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBlbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQlqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgamF2YVByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQotCQllbnRpdHkubW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDAsIDEpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBlbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQlqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgamF2YVByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQotCQkoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOwotCQkoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMiwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBlbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMiwgMCwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBlbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigwLCAxLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IGVudGl0eS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gZW50aXR5LmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IGVudGl0eS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCAgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBlbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbklzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhRW50aXR5KCkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkuaXNWaXJ0dWFsKCkpOwotCi0JCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW4uaXNWaXJ0dWFsKCkpOwotCQkKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGVOYW1lSXNJbnZhbGlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RmFsc2UoZ2V0SmF2YUVudGl0eSgpLnRhYmxlTmFtZUlzSW52YWxpZChUWVBFX05BTUUpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhRW50aXR5KCkudGFibGVOYW1lSXNJbnZhbGlkKCJGT08iKSk7Ci0JCQotCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRGYWxzZShnZXRKYXZhRW50aXR5KCkudGFibGVOYW1lSXNJbnZhbGlkKCJCQVIiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlnZXRKYXZhRW50aXR5KCkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJCi0JCW92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGdldEphdmFFbnRpdHkoKS5nZXRPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlnZXRKYXZhRW50aXR5KCkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJCi0JCW92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFFbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCW92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGFic3RyYWN0RW50aXR5LmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7Ci0JCQotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKEphdmFFbnRpdHkpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IGFic3RyYWN0RW50aXR5LmdldEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXNNYXBwZWRTdXBlcmNsYXNzSW5Pcm1YbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IGdldEphdmFFbnRpdHkoKS5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbiIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVEZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBqYXZhRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDUsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0KLQkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBmb29NYXBwaW5nID0gKEJhc2ljTWFwcGluZykgbWFwcGVkU3VwZXJjbGFzcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJmb28iKS5nZXRNYXBwaW5nKCk7Ci0JCWZvb01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWZvb01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQlmb29NYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlmb29NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlmb29NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWZvb01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWZvb01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOwotCQlmb29NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShudWxsKTsKLQkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCWZvb01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUobnVsbCk7Ci0JCWZvb01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKG51bGwpOwotCQlmb29NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihudWxsKTsKLQkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzRW50aXR5SGllcmFjaHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBqYXZhRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0KLQkJSmF2YUVudGl0eSBzdXBlcmNsYXNzID0gKEphdmFFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBpZE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBzdXBlcmNsYXNzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgcmVzb3VyY2VUeXBlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDUsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscyg1LCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoNSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJiYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKDYsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYmFzaWMiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWxUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygidmVyc2lvbiIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygidmVyc2lvbiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbiIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YUF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoNCwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUF0dHJpYnV0ZU92ZXJyaWRlcykpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQotCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbiIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkKLQkJKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJGT08iKTsKLQkJKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDIsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMiwgMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLm1vdmVBbm5vdGF0aW9uKDAsIDEsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsICBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZUlzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCi0JCUphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcyA9IGdldEphdmFFbnRpdHkoKS5nZXRBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IGdldEphdmFFbnRpdHkoKS5nZXRBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOwotCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zTWFwcGVkU3VwZXJjbGFzc0luT3JtWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLS8vCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotLy8JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLS8vCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCQotLy8JCUl0ZXJhdG9yPFJlbGF0aW9uc2hpcE1hcHBpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gZ2V0SmF2YUVudGl0eSgpLmFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKLS8vCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBqYXZhRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSA9ICgoUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwKSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJUmVhZE9ubHlKb2luQ29sdW1uIHZpcnR1YWxKb2luQ29sdW1uID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmVfaWQiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCQotCi0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fQ09MVU1OIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIk1ZX1JFRkVSRU5DRV9DT0xVTU4iKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWpvaW5pbmdTdHJhdGVneSA9ICgoUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwKSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXZpcnR1YWxKb2luQ29sdW1uID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1JFRkVSRU5DRV9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc051bGxhYmxlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX0NPTFVNTiIsIGpvaW5pbmdTdHJhdGVneS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCQotCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotLy8JCS8vVE9ETyBqb2luQ29sdW1ucyBmb3IgZGVmYXVsdCBhc3NvY2lhdGlvbiBvdmVycmlkZXMKLS8vLy8JSUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW4gPSBkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1ucygpLm5leHQoKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0vLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLS8vLy8JCi0vLy8vCi0vLy8vCUlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoSU1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLS8vLy8JCi0vLy8vCUlPbmVUb09uZU1hcHBpbmcgYWRkcmVzc01hcHBpbmcgPSAoSU9uZVRvT25lTWFwcGluZykgbWFwcGVkU3VwZXJjbGFzcy5wZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpOwotLy8vLwlJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gYWRkcmVzc01hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiQkFSIik7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIkJBWiIpOwotLy8vLwkKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGUuQU5OT1RBVElPTl9OQU1FKSk7Ci0vLy8vCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXMuQU5OT1RBVElPTl9OQU1FKSk7Ci0vLy8vCi0vLy8vCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpKSk7Ci0vLy8vCWRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlID0gamF2YUVudGl0eS5kZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7Ci0vLy8vCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydEVxdWFscygiRk9PIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJCQVIiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJCQVoiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLS8vLy8KLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKG51bGwpOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgcmVzb3VyY2VUeXBlLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZS5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8JYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlcy5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8KLS8vLy8JZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0vLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLS8vLy8JCi0vLy8vCWphdmFFbnRpdHkuYWRkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgwKS5zZXROYW1lKCJhZGRyZXNzIik7Ci0vLy8vCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJiYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCUl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMpKTsKLQkJCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMSwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQotCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgwLCAxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCi0JCSgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMiwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLm1vdmVBbm5vdGF0aW9uKDIsIDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigwLCAxLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigxLCAgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCAgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZUlzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCi0JCUphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZE5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQkKLQkJTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5MSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7Ci0JCW5hbWVkUXVlcnkxLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU5hbWVkUXVlcnkgbmFtZWRRdWVyeTIgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwotCQluYW1lZFF1ZXJ5Mi5zZXROYW1lKCJCQVIiKTsKLQkJCi0JCWphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTmFtZWRRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTmFtZWRRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQkKLQkJTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5MyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMSk7Ci0JCW5hbWVkUXVlcnkzLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJamF2YU5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZFF1ZXJ5MiwgbmFtZWRRdWVyaWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZFF1ZXJ5MywgbmFtZWRRdWVyaWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZFF1ZXJ5MSwgbmFtZWRRdWVyaWVzLm5leHQoKSk7Ci0JCQotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKS5zZXROYW1lKCJmb28iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWROYW1lZFF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUludmFsaWROYW1lZFF1ZXJpZXMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwotCQkKLQkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkucmVtb3ZlTmFtZWRRdWVyeSgwKTsKLQkJamF2YU5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhTmFtZWRRdWVyaWVzKSk7Ci0JCWphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTmFtZWRRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoTmFtZWRRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkUXVlcnkoMCk7Ci0JCWphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwotCQlqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkUXVlcnkoMCk7Ci0JCWphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTmFtZWROYXRpdmVRdWVyeVdpdGhOYW1lZFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hdGl2ZVF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJbmF0aXZlUXVlcnkuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhTmFtZWROYXRpdmVRdWVyeT4gbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGROYW1lZFF1ZXJ5V2l0aE5hbWVkTmF0aXZlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJbmFtZWRRdWVyeS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFOYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZU5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwotCQkKLQkJCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm1vdmVOYW1lZFF1ZXJ5KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8SmF2YU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJamF2YU5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5tb3ZlTmFtZWRRdWVyeSgwLCAxKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWVkUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCQkKLQkJKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiRk9PIik7Ci0JCSgoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOwotCQkoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigyLCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBlbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMiwgMCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCW5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLm1vdmVBbm5vdGF0aW9uKDAsIDEsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5hbWVkUXVlcmllc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzU2l6ZSgpKTsKLQotCQkoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJGT08iKTsKLQkJKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFSIik7Ci0JCSgoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDIsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygzLCBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTmFtZWROYXRpdmVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQluYW1lZE5hdGl2ZVF1ZXJ5LnNldE5hbWUoIkZPTyIpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeTIgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQluYW1lZE5hdGl2ZVF1ZXJ5Mi5zZXROYW1lKCJCQVIiKTsKLQkJCi0JCWphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5MyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMSk7Ci0JCW5hbWVkTmF0aXZlUXVlcnkzLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJamF2YU5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZE5hdGl2ZVF1ZXJ5MiwgbmFtZWRRdWVyaWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZE5hdGl2ZVF1ZXJ5MywgbmFtZWRRdWVyaWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZE5hdGl2ZVF1ZXJ5LCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKLQkJCi0JCW5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFOYW1lZFF1ZXJpZXMpKTsKLQkJCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCWphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwotCQlqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5yZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQlqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFOYW1lZFF1ZXJpZXMpKTsKLQkJamF2YU5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCQotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5yZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQlqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFOYW1lZFF1ZXJpZXMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFOYW1lZFF1ZXJpZXMpKTsKLQkJCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8SmF2YU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJamF2YU5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5tb3ZlTmFtZWROYXRpdmVRdWVyeSgwLCAxKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWVkTmF0aXZlUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCQkKLQkJKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiRk9PIik7Ci0JCSgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOwotCQkoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigyLCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlMaXN0SXRlcmF0b3I8SmF2YU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLm1vdmVBbm5vdGF0aW9uKDIsIDAsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigwLCAxLCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigxLCAgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCW5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigxLCAgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCW5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsICBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCi0JCWFzc2VydEVxdWFscygwLCBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXNTaXplKCkpOwotCi0JCSgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMiwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUlkQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQljcmVhdGVUZXN0SWRDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRJZENsYXNzUmVmZXJlbmNlKCkuZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5nZXRJZENsYXNzKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJSWRDbGFzc0Fubm90YXRpb24gaWRDbGFzc0Fubm90YXRpb24gPSAoSWRDbGFzc0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJLy8gdGVzdCBzZXR0aW5nIGlkIGNsYXNzIG5hbWUgdG8gbm9uZXhpc3RlbnQgY2xhc3MuICB0ZXN0IGNsYXNzIG5hbWUgaXMgc2V0LCBidXQgY2xhc3MgaXMgbnVsbAotCQlTdHJpbmcgbm9uRXhpc3RlbnRJZENsYXNzTmFtZSA9IFBBQ0tBR0VfTkFNRSArICIuRm9vIjsKLQkJaWRDbGFzc0Fubm90YXRpb24uc2V0VmFsdWUobm9uRXhpc3RlbnRJZENsYXNzTmFtZSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobm9uRXhpc3RlbnRJZENsYXNzTmFtZSwgZ2V0SmF2YUVudGl0eSgpLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5vbkV4aXN0ZW50SWRDbGFzc05hbWUsICgoSWRDbGFzc0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRJZENsYXNzUmVmZXJlbmNlKCkuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCS8vIHRlc3Qgc2V0dGluZyBpZCBjbGFzcyBuYW1lIHRvIGV4aXN0ZW50IGNsYXNzLiAgdGVzdCBjbGFzcyBuYW1lIGlzIHNldCBhbmQgY2xhc3MgaXMgbm90IG51bGwKLQkJU3RyaW5nIGV4aXN0ZW50SWRDbGFzc05hbWUgPSBQQUNLQUdFX05BTUUgKyAiLlRlc3RUeXBlSWQiOwotCQlpZENsYXNzQW5ub3RhdGlvbi5zZXRWYWx1ZShleGlzdGVudElkQ2xhc3NOYW1lKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhleGlzdGVudElkQ2xhc3NOYW1lLCBnZXRKYXZhRW50aXR5KCkuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhpc3RlbnRJZENsYXNzTmFtZSwgKChJZENsYXNzQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5nZXRJZENsYXNzKCkpOwotCQkKLQkJLy90ZXN0IHNldHRpbmcgIEBJZENsYXNzIHZhbHVlIHRvIG51bGwKLQkJaWRDbGFzc0Fubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRJZENsYXNzUmVmZXJlbmNlKCkuZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5nZXRJZENsYXNzKCkpOwotCQkKLQkJLy9yZXNldCBASWRDbGFzcyB2YWx1ZSBhbmQgdGhlbiByZW1vdmUgQElkQ2xhc3MKLQkJaWRDbGFzc0Fubm90YXRpb24gPSAoSWRDbGFzc0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQotCQlpZENsYXNzQW5ub3RhdGlvbi5zZXRWYWx1ZShleGlzdGVudElkQ2xhc3NOYW1lKTsKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLmdldElkQ2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdElkQ2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRJZENsYXNzUmVmZXJlbmNlKCkuZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5nZXRJZENsYXNzKCkpOwotCQkKLQkJU3RyaW5nIG5vbkV4aXN0ZW50SWRDbGFzc05hbWUgPSBQQUNLQUdFX05BTUVfICsgIkZvbyI7Ci0JCWdldEphdmFFbnRpdHkoKS5nZXRJZENsYXNzUmVmZXJlbmNlKCkuc2V0U3BlY2lmaWVkSWRDbGFzc05hbWUobm9uRXhpc3RlbnRJZENsYXNzTmFtZSk7Ci0JCWFzc2VydEVxdWFscyhub25FeGlzdGVudElkQ2xhc3NOYW1lLCAoKElkQ2xhc3NBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5vbkV4aXN0ZW50SWRDbGFzc05hbWUsIGdldEphdmFFbnRpdHkoKS5nZXRJZENsYXNzUmVmZXJlbmNlKCkuZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5nZXRJZENsYXNzKCkpOwotCQkKLQkJU3RyaW5nIGV4aXN0ZW50SWRDbGFzc05hbWUgPSBQQUNLQUdFX05BTUVfICsgIlRlc3RUeXBlSWQiOwotCQlnZXRKYXZhRW50aXR5KCkuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLnNldFNwZWNpZmllZElkQ2xhc3NOYW1lKGV4aXN0ZW50SWRDbGFzc05hbWUpOwotCQlhc3NlcnRFcXVhbHMoZXhpc3RlbnRJZENsYXNzTmFtZSwgKChJZENsYXNzQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhleGlzdGVudElkQ2xhc3NOYW1lLCBnZXRKYXZhRW50aXR5KCkuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRJZENsYXNzUmVmZXJlbmNlKCkuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5nZXRJZENsYXNzUmVmZXJlbmNlKCkuc2V0U3BlY2lmaWVkSWRDbGFzc05hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLmdldElkQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFByaW1hcnlLZXlDb2x1bW5OYW1lV2l0aEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGphdmFFbnRpdHkuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKSk7Ci0JCQotCQkoKEphdmFJZE1hcHBpbmcpIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0lEIik7Ci0JCWFzc2VydEVxdWFscygiTVlfSUQiLCBqYXZhRW50aXR5LmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBqYXZhRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCUphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXZpcnR1YWxPdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJJRCIpOwotCQlhc3NlcnRFcXVhbHMoIklEIiwgamF2YUVudGl0eS5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkQ29uY3JldGVDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnRUcnVlKGdldEphdmFFbnRpdHkoKS5kaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpKTsKLQkJCi0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0SmF2YUVudGl0eSgpLmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWRBYnN0cmFjdENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhRW50aXR5KCkuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKSk7Ci0JCQotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFzc2VydFRydWUoZ2V0SmF2YUVudGl0eSgpLmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVBYnN0cmFjdFRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJRW50aXR5IGNvbmNyZXRlRW50aXR5ID0gKEVudGl0eSkgc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBjb25jcmV0ZUVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKEVudGl0eSkgc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGFic3RyYWN0RW50aXR5LmdldE5hbWUoKSk7Ci0KLQkJLy90YWJsZS1wZXItY2xhc3MsIG5vIGRpc2NyaW1pbmF0b3IgY29sdW1uIGFsbG93ZWQKLQkJYXNzZXJ0RmFsc2UoY29uY3JldGVFbnRpdHkuc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpKTsKLQkJYXNzZXJ0RmFsc2UoYWJzdHJhY3RFbnRpdHkuc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpKTsKLQotCQkKLQkJLy9zaW5nbGUtdGFibGUsIGRpc2NyaW1pbmF0b3IgY29sdW1uIGFsbG93ZWQgb24gcm9vdCBlbnRpdHkKLQkJYWJzdHJhY3RFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShudWxsKTsKLQkJYXNzZXJ0RmFsc2UoY29uY3JldGVFbnRpdHkuc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpKTsKLQkJYXNzZXJ0VHJ1ZShhYnN0cmFjdEVudGl0eS5zcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RFbnRpdHlHZXREZWZhdWx0RGlzY3JpbWluYXRvckNvbHVtbk5hbWVUYWJsZVBlckNsYXNzSW5oZXJpdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQWJzdHJhY3RUZXN0RW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlFbnRpdHkgY29uY3JldGVFbnRpdHkgPSAoRW50aXR5KSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGNvbmNyZXRlRW50aXR5LmdldE5hbWUoKSk7Ci0JCQotCQlFbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoRW50aXR5KSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgYWJzdHJhY3RFbnRpdHkuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgYWJzdHJhY3RFbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbmNyZXRlRW50aXR5LmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTLCBjb25jcmV0ZUVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJCi0JCQotCQlhc3NlcnRUcnVlKGFic3RyYWN0RW50aXR5LmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkpOwotCQlhc3NlcnRGYWxzZShjb25jcmV0ZUVudGl0eS5zcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29uY3JldGVFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShhYnN0cmFjdEVudGl0eS5kaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFic3RyYWN0RW50aXR5LmdldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JCWFzc2VydFRydWUoY29uY3JldGVFbnRpdHkuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb25jcmV0ZUVudGl0eS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUdlbmVyYXRlZFZhbHVlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUdlbmVyYXRlZFZhbHVlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RmNjc1ZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFHZW5lcmF0ZWRWYWx1ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEphdmFHZW5lcmF0ZWRWYWx1ZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SID0gIk1ZX0dFTkVSQVRPUiI7Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmF0ZWRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5HRU5FUkFURURfVkFMVUUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBHZW5lcmF0ZWRWYWx1ZShnZW5lcmF0b3I9XCIiICsgR0VORVJBVE9SICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCQotCXB1YmxpYyBKYXZhR2VuZXJhdGVkVmFsdWVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1IsIGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpLmdldEdlbmVyYXRvcigpKTsKLQotCQkvL2NoYW5nZSByZXNvdXJjZSBtb2RlbCBzZXF1ZW5jZUdlbmVyYXRvciBuYW1lLCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUgPSAoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkdFTkVSQVRFRF9WQUxVRSk7Ci0JCQotCQlnZW5lcmF0ZWRWYWx1ZS5zZXRHZW5lcmF0b3IoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0R2VuZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmF0ZWRWYWx1ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKS5nZXRHZW5lcmF0b3IoKSk7Ci0KLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuc2V0U3BlY2lmaWVkR2VuZXJhdG9yKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0R2VuZXJhdG9yKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uIGdlbmVyYXRlZFZhbHVlID0gKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5HRU5FUkFURURfVkFMVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1IsIGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpLmdldEdlbmVyYXRvcigpKTsKLQotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKS5zZXRTcGVjaWZpZWRHZW5lcmF0b3IobnVsbCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZSA9IChHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuR0VORVJBVEVEX1ZBTFVFKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoZ2VuZXJhdGVkVmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmF0ZWRWYWx1ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoR2VuZXJhdGVkVmFsdWUuREVGQVVMVF9TVFJBVEVHWSwgaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0U3RyYXRlZ3koKSk7Ci0KLQkJLy9jaGFuZ2UgcmVzb3VyY2UgbW9kZWwgc2VxdWVuY2VHZW5lcmF0b3IgbmFtZSwgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uIGdlbmVyYXRlZFZhbHVlID0gKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5HRU5FUkFURURfVkFMVUUpOwotCQkKLQkJZ2VuZXJhdGVkVmFsdWUuc2V0U3RyYXRlZ3kob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGUuSURFTlRJVFkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhHZW5lcmF0aW9uVHlwZS5JREVOVElUWSwgaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhHZW5lcmF0ZWRWYWx1ZS5ERUZBVUxUX1NUUkFURUdZLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKS5nZXREZWZhdWx0U3RyYXRlZ3koKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJhdGVkVmFsdWUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEdlbmVyYXRlZFZhbHVlLkRFRkFVTFRfU1RSQVRFR1ksIGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpLmdldFN0cmF0ZWd5KCkpOwotCi0JCWlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpLnNldFNwZWNpZmllZFN0cmF0ZWd5KEdlbmVyYXRpb25UeXBlLklERU5USVRZKTsKLQkJCi0JCWFzc2VydEVxdWFscyhHZW5lcmF0aW9uVHlwZS5JREVOVElUWSwgaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0U3RyYXRlZ3koKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUgPSAoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkdFTkVSQVRFRF9WQUxVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGUuSURFTlRJVFksIGdlbmVyYXRlZFZhbHVlLmdldFN0cmF0ZWd5KCkpOwotCQkKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuc2V0U3BlY2lmaWVkU3RyYXRlZ3kobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoR2VuZXJhdGVkVmFsdWUuREVGQVVMVF9TVFJBVEVHWSwgaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0U3RyYXRlZ3koKSk7Ci0JCWdlbmVyYXRlZFZhbHVlID0gKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5HRU5FUkFURURfVkFMVUUpOwotCQlhc3NlcnROb3ROdWxsKGdlbmVyYXRlZFZhbHVlKTsKLQkJYXNzZXJ0TnVsbChnZW5lcmF0ZWRWYWx1ZS5nZXRTdHJhdGVneSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFJZE1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhSWRNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IyNGRhYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFJZE1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2VUZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhSWRNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLlRFTVBPUkFMLCBKUEEuVEVNUE9SQUxfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FU1RBTVApIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZ0dlbmVyYXRlZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEuR0VORVJBVEVEX1ZBTFVFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAR2VuZXJhdGVkVmFsdWUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIEphdmFJZE1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpICgoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlpZE1hcHBpbmcuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRlbXBvcmFsKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRlbXBvcmFsQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChUZW1wb3JhbEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUZW1wb3JhbFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGVtcG9yYWxBbm5vdGF0aW9uIHRlbXBvcmFsID0gKFRlbXBvcmFsQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0ZW1wb3JhbC5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuREFURSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCAoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZShpZE1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGlkTWFwcGluZy5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGlkTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2VxdWVuY2VHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBpZE1hcHBpbmcuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgaWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCQkKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgaWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU2VxdWVuY2VHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQkKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKSk7Ci0JCWFzc2VydE5vdE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQkKLQkJLy90cnkgYWRkaW5nIGFub3RoZXIgc2VxdWVuY2UgZ2VuZXJhdG9yLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCQl0cnkgewotCQkJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQkKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUikpOwotCi0JCS8vdHJ5IHJlbW92aW5nIHRoZSBzZXF1ZW5jZSBnZW5lcmF0b3IgYWdhaW4sIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsJCQotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYWJsZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQkKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKSk7Ci0JCWFzc2VydE5vdE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQkKLQkJLy90cnkgYWRkaW5nIGFub3RoZXIgdGFibGUgZ2VuZXJhdG9yLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCQl0cnkgewotCQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7CQkKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJCi0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5yZW1vdmVUYWJsZUdlbmVyYXRvcigpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpKTsKLQkJCi0JCS8vdHJ5IHJlbW92aW5nIHRoZSB0YWJsZSBnZW5lcmF0b3IgYWdhaW4sIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkucmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsJCQotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRHZW5lcmF0ZWRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLkdFTkVSQVRFRF9WQUxVRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0R2VuZXJhdGVkVmFsdWUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZ0dlbmVyYXRlZFZhbHVlKCk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEdlbmVyYXRlZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkdFTkVSQVRFRF9WQUxVRSkpOwotCQlhc3NlcnROb3ROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJCi0JCS8vdHJ5IGFkZGluZyBhbm90aGVyIGdlbmVyYXRlZCB2YWx1ZSwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwkJCi0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUdlbmVyYXRlZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5HRU5FUkFURURfVkFMVUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWlkTWFwcGluZy5yZW1vdmVHZW5lcmF0ZWRWYWx1ZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5HRU5FUkFURURfVkFMVUUpKTsKLQkJCi0JCS8vdHJ5IHJlbW92aW5nIHRoZSBnZW5lcmF0ZWRWYWx1ZSBhZ2Fpbiwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCWlkTWFwcGluZy5yZW1vdmVHZW5lcmF0ZWRWYWx1ZSgpOwkJCi0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFKb2luQ29sdW1uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUpvaW5Db2x1bW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTAxYjVmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUpvaW5Db2x1bW5UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhSm9pbkNvbHVtblRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgSmF2YUpvaW5Db2x1bW5UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzIFByb2plY3QgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHByb2pfaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcm9qZWN0LmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQW5ub3RhdGlvbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5Bbm5vdGF0aW9uKTsKLQkJCi0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlqb2luQ29sdW1uQW5ub3RhdGlvbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWpvaW5Db2x1bW5Bbm5vdGF0aW9uLnNldE5hbWUoIkZPTyIpOwkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwsIGFubm90YXRpb24gaXMgTk9UIHJlbW92ZWQKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlqb2luQ29sdW1uQW5ub3RhdGlvbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbkFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJCi0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbkFubm90YXRpb24gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luQ29sdW1uQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWpvaW5Db2x1bW5Bbm5vdGF0aW9uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCX0KLQkKLQkvLyA8YXR0cmlidXRlIG5hbWU+XzxyZWZlcmVuY2VkIGNvbHVtbiBuYW1lPgotCS8vICAgICBvcgotCS8vIDx0YXJnZXQgZW50aXR5IG5hbWU+XzxyZWZlcmVuY2VkIGNvbHVtbiBuYW1lPgkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lKCk7Ci0JCWNyZWF0ZVRhcmdldEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCQotLy8JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotLy8JCUphdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKLS8vCQlKYXZhSm9pbkNvbHVtbiBkZWZhdWx0SmF2YUpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5nZXREZWZhdWx0Sm9pbkNvbHVtbigpOwotLy8JCi0vLwkJYXNzZXJ0TnVsbChkZWZhdWx0SmF2YUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vL1RPRE8gdGVzdCBkZWZhdWx0IGpvaW4gY29sdW1uIG5hbWUKLS8vCQkvL2FkZCB0YXJnZXQgZW50aXR5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LCBub3cgam9pbiB0YWJsZSBuYW1lIGlzIFt0YWJsZSBuYW1lXV9bdGFyZ2V0IHRhYmxlIG5hbWVdCi0vLwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9qZWN0Iik7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfUHJvamVjdCIsIGpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQkKLS8vCQlKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuamF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJSmF2YVBlcnNpc3RlbnRyZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLS8vCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuYW5ub3RhdGlvbihKb2luVGFibGUuQU5OT1RBVElPTl9OQU1FKSk7Ci0vLwkKLS8vCQkvL3RhcmdldCBlbnRpdHkgZG9lcyBub3QgcmVzb2x2ZSwgZGVmYXVsdCBuYW1lIGlzIG51bGwKLS8vCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIkZvbyIpOwotLy8JCWFzc2VydE51bGwoam9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotLy8KLS8vCQkvL2RlZmF1bHQgdGFyZ2V0IGVudGl0eSBkb2VzIHJlc29sdmUsIHNvIGRlZmF1bHQgbmFtZSBpcyBhZ2FpbiBbdGFibGUgbmFtZV1fW3RhcmdldCB0YWJsZSBuYW1lXQotLy8JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9Qcm9qZWN0Iiwgam9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotLy8KLS8vCQkvL2FkZCB0aGUgam9pbiB0YWJsZSBhbm5vdGF0aW9uLCB2ZXJpZnkgZGVmYXVsdCBqb2luIHRhYmxlIG5hbWUgaXMgdGhlIHNhbWUKLS8vCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSm9pblRhYmxlLkFOTk9UQVRJT05fTkFNRSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfUHJvamVjdCIsIGpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuYW5ub3RhdGlvbihKb2luVGFibGUuQU5OT1RBVElPTl9OQU1FKSk7Ci0vLwkJCi0vLwkJLy9zZXQgYSB0YWJsZSBvbiB0aGUgdGFyZ2V0IGVudGl0eSwgdmVyeSBkZWZhdWx0IGpvaW4gdGFibGUgbmFtZSB1cGRhdGVzCi0vLwkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0ZPTyIsIGpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQkKLS8vCQkvL3NldCBhIHRhYmxlIG9uIHRoZSBvd25pbmcgZW50aXR5LCB2ZXJ5IGRlZmF1bHQgam9pbiB0YWJsZSBuYW1lIHVwZGF0ZXMKLS8vCQlqYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCBqb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlhc3NlcnRFcXVhbHMoMCwgam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQkKLQkJLy9zZXQgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gamF2YUpvaW5Db2x1bW4gPSAKLQkJCQkoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsJCi0JCWphdmFKb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YUpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCi0JCS8vc2V0IHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIAotCQlqYXZhSm9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCgiQkFSIiwgamF2YUpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQkvL3NldCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiQkFSIik7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqYXZhSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCS8vc2V0IHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkvL1RPRE8gdGVzdCBkZWZhdWx0IGpvaW4gY29sdW1uIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlhc3NlcnRFcXVhbHMoMCwgam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQkKLQkJLy9zZXQgdGFibGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGphdmFKb2luQ29sdW1uID0gCi0JCQkJKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7CQotCQlqYXZhSm9pbkNvbHVtbi5zZXRUYWJsZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotCQotCQkvL3NldCB0YWJsZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgCi0JCWphdmFKb2luQ29sdW1uLnNldFRhYmxlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKCJCQVIiLCBqYXZhSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCQotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJLy9zZXQgdGFibGUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGphdmFKb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJLy9zZXQgdGFibGUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkvL1RPRE8gdGVzdCBkZWZhdWx0IGpvaW4gY29sdW1uIHRhYmxlCi0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJCi0JCS8vc2V0IHVuaXF1ZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gamF2YUpvaW5Db2x1bW4gPSAKLQkJCQkoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsJCi0JCWphdmFKb2luQ29sdW1uLnNldFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBqYXZhSm9pbkNvbHVtbi5nZXRVbmlxdWUoKSk7Ci0JCi0JCS8vc2V0IHVuaXF1ZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgCi0JCWphdmFKb2luQ29sdW1uLnNldFVuaXF1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5Db2x1bW4uZ2V0VW5pcXVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCQotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJLy9zZXQgdW5pcXVlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGphdmFKb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGphdmFKb2luQ29sdW1uLmdldFVuaXF1ZSgpKTsKLQkJCi0JCS8vc2V0IHVuaXF1ZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKG51bGwpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKGphdmFKb2luQ29sdW1uLmdldFVuaXF1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGphdmFKb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5Db2x1bW4pOwotCQkKLQkJCi0JCS8vc2V0IG51bGxhYmxlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWphdmFKb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwkKLQkJamF2YUpvaW5Db2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqYXZhSm9pbkNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQkKLQkJLy9zZXQgbnVsbGFibGUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIAotCQlqYXZhSm9pbkNvbHVtbi5zZXROdWxsYWJsZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pbkNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCQotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJLy9zZXQgbnVsbGFibGUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGphdmFKb2luQ29sdW1uLmdldE51bGxhYmxlKCkpOwotCQkKLQkJLy9zZXQgbnVsbGFibGUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5Db2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pbkNvbHVtbik7Ci0JCQotCQkKLQkJLy9zZXQgaW5zZXJ0YWJsZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsJCi0JCWphdmFKb2luQ29sdW1uLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGphdmFKb2luQ29sdW1uLmdldEluc2VydGFibGUoKSk7Ci0JCi0JCS8vc2V0IGluc2VydGFibGUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIAotCQlqYXZhSm9pbkNvbHVtbi5zZXRJbnNlcnRhYmxlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5Db2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJCi0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQkvL3NldCBpbnNlcnRhYmxlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgamF2YUpvaW5Db2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQkJCi0JCS8vc2V0IGluc2VydGFibGUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGphdmFKb2luQ29sdW1uLmdldEluc2VydGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlhc3NlcnRFcXVhbHMoMCwgam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQkvL3NldCB1cGRhdGFibGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGphdmFKb2luQ29sdW1uID0gCi0JCQkJKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7CQotCQlqYXZhSm9pbkNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgamF2YUpvaW5Db2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCQotCQkvL3NldCB1cGRhdGFibGUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIAotCQlqYXZhSm9pbkNvbHVtbi5zZXRVcGRhdGFibGUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGphdmFKb2luQ29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCS8vc2V0IHVwZGF0YWJsZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqYXZhSm9pbkNvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0JCQotCQkvL3NldCB1cGRhdGFibGUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pbkNvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhSm9pblRhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUpvaW5UYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ODA4NjEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhSm9pblRhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luVGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhSm9pblRhYmxlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBKYXZhSm9pblRhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxQcm9qZWN0PiBwcm9qZWN0czsiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyBQcm9qZWN0IHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBwcm9qX2lkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJvamVjdC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFyZ2V0RW50aXR5V2l0aEJhY2tQb2ludGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgUHJvamVjdCB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgcHJval9pZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55KG1hcHBlZEJ5PVwicHJvamVjdHNcIiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjwiICsgVFlQRV9OQU1FICsgIj4gZW1wbG95ZWVzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJvamVjdC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIGphdmFKb2luVGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoam9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5UYWJsZSk7Ci0JCQotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJamF2YUpvaW5UYWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqYXZhSm9pblRhYmxlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJamF2YUpvaW5UYWJsZS5zZXROYW1lKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQlqYXZhSm9pblRhYmxlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoam9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlQW5ub3RhdGlvbik7Ci0JCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlqb2luVGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWpvaW5UYWJsZUFubm90YXRpb24gPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luVGFibGVBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJam9pblRhYmxlLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWpvaW5UYWJsZUFubm90YXRpb24gPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGVBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCS8vam9pblRhYmxlIGRlZmF1bHQgbmFtZSBpcyBudWxsIGJlY2F1c2UgdGFyZ2V0RW50aXR5IGlzIG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlhc3NlcnROdWxsKGpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkvL2FkZCB0YXJnZXQgZW50aXR5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LCBub3cgam9pbiB0YWJsZSBuYW1lIGlzIFt0YWJsZSBuYW1lXV9bdGFyZ2V0IHRhYmxlIG5hbWVdCi0JCWNyZWF0ZVRhcmdldEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb2plY3QiKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfUHJvamVjdCIsIGpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCi0JCS8vdGFyZ2V0IGVudGl0eSBkb2VzIG5vdCByZXNvbHZlLCBkZWZhdWx0IG5hbWUgaXMgbnVsbAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIkZvbyIpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkvL2RlZmF1bHQgdGFyZ2V0IGVudGl0eSBkb2VzIHJlc29sdmUsIHNvIGRlZmF1bHQgbmFtZSBpcyBhZ2FpbiBbdGFibGUgbmFtZV1fW3RhcmdldCB0YWJsZSBuYW1lXQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX1Byb2plY3QiLCBqb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJLy9hZGQgdGhlIGpvaW4gdGFibGUgYW5ub3RhdGlvbiwgdmVyaWZ5IGRlZmF1bHQgam9pbiB0YWJsZSBuYW1lIGlzIHRoZSBzYW1lCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX1Byb2plY3QiLCBqb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQkvL3NldCBhIHRhYmxlIG9uIHRoZSB0YXJnZXQgZW50aXR5LCB2ZXJ5IGRlZmF1bHQgam9pbiB0YWJsZSBuYW1lIHVwZGF0ZXMKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9GT08iLCBqb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQkvL3NldCBhIHRhYmxlIG9uIHRoZSBvd25pbmcgZW50aXR5LCB2ZXJ5IGRlZmF1bHQgam9pbiB0YWJsZSBuYW1lIHVwZGF0ZXMKLQkJZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIGpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5UYWJsZS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gam9pblRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJLy9qb2luVGFibGUgZGVmYXVsdCBuYW1lIGlzIG51bGwgYmVjYXVzZSB0YXJnZXRFbnRpdHkgaXMgbm90IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJLy9hZGQgdGFyZ2V0IGVudGl0eSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCwgam9pbiBjb2x1bW4gZGVmYXVsdCBuYW1lIGFuZCByZWZlcmVuY2VkIGNvbHVtbiBzdGlsbCBudWxsIGJlY2F1c2Ugb3duaW5nIGVudGl0eSBoYXMgbm8gcHJpbWFyeSBrZXkKLQkJY3JlYXRlVGFyZ2V0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvamVjdCIpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJvamVjdHNfcHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQkvL2NyZWF0ZSBwcmltYXJ5IGtleSAgaW4gb3duaW5nIGVudGl0eQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2lkIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2plY3RzX3Byb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCS8vc2V0IHNwZWNpZmllZCBjb2x1bW4gbmFtZSBvbiBwcmltYXJ5IGtleSBpbiBvd25pbmcgZW50aXR5Ci0JCSgoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0lEIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX01ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9JRCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2plY3RzX3Byb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkKLQkJLy90YXJnZXQgZW50aXR5IGRvZXMgbm90IHJlc29sdmUsIGludmVyc2Ugam9pbiBjb2x1bW4gbmFtZSBhbmQgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBpcyBudWxsCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX01ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9JRCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQkvL2RlZmF1bHQgdGFyZ2V0IGVudGl0eSBkb2VzIHJlc29sdmUsIHNvIGRlZmF1bHRzIGZvciBqb2luIGNvbHVtbiBhcmUgYmFjawotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX01ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9JRCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2plY3RzX3Byb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCS8vYWRkIHRoZSBqb2luIHRhYmxlIGFubm90YXRpb24sIHZlcmlmeSBkZWZhdWx0IGpvaW4gdGFibGUgbmFtZSBpcyB0aGUgc2FtZQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9NWV9JRCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qZWN0c19wcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEpvaW5Db2x1bW5zQmlkaXJlY3Rpb25hbFJlbGF0aW9uc2hpcCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQkvL2pvaW5UYWJsZSBkZWZhdWx0IG5hbWUgaXMgbnVsbCBiZWNhdXNlIHRhcmdldEVudGl0eSBpcyBub3QgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQkvL2FkZCB0YXJnZXQgZW50aXR5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LCBqb2luIGNvbHVtbiBkZWZhdWx0IG5hbWUgYW5kIHJlZmVyZW5jZWQgY29sdW1uIHN0aWxsIG51bGwgYmVjYXVzZSBvd25pbmcgZW50aXR5IGhhcyBubyBwcmltYXJ5IGtleQotCQljcmVhdGVUYXJnZXRFbnRpdHlXaXRoQmFja1BvaW50ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9qZWN0Iik7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qZWN0c19wcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCS8vY3JlYXRlIHByaW1hcnkga2V5ICBpbiBvd25pbmcgZW50aXR5Ci0JCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZXNfaWQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJvamVjdHNfcHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJLy9zZXQgc3BlY2lmaWVkIGNvbHVtbiBuYW1lIG9uIHByaW1hcnkga2V5IGluIG93bmluZyBlbnRpdHkKLQkJKChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSUQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZXNfTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJvamVjdHNfcHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQotCQkvL3RhcmdldCBlbnRpdHkgZG9lcyBub3QgcmVzb2x2ZSwgaW52ZXJzZSBqb2luIGNvbHVtbiBuYW1lIGFuZCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGlzIG51bGwKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCS8vZGVmYXVsdCB0YXJnZXQgZW50aXR5IGRvZXMgcmVzb2x2ZSwgc28gZGVmYXVsdHMgZm9yIGpvaW4gY29sdW1uIGFyZSBiYWNrCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZXNfTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJvamVjdHNfcHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJLy9hZGQgdGhlIGpvaW4gdGFibGUgYW5ub3RhdGlvbiwgdmVyaWZ5IGRlZmF1bHQgam9pbiB0YWJsZSBuYW1lIGlzIHRoZSBzYW1lCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiZW1wbG95ZWVzX01ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9JRCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2plY3RzX3Byb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqYXZhSm9pblRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5UYWJsZSk7Ci0JCQotCQkKLQkJLy9zZXQgc2NoZW1hIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqYXZhSm9pblRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWphdmFKb2luVGFibGUuc2V0U2NoZW1hKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhSm9pblRhYmxlLmdldFNjaGVtYSgpKTsKLQkKLQkJLy9zZXQgc2NoZW1hIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWphdmFKb2luVGFibGUuc2V0U2NoZW1hKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGphdmFKb2luVGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJamF2YUpvaW5UYWJsZS5zZXRTY2hlbWEoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFKb2luVGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZUFubm90YXRpb24pOwotCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlqb2luVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJmb28iKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbiA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgam9pblRhYmxlQW5ub3RhdGlvbi5nZXRTY2hlbWEoKSk7Ci0JCQotCQkvL3NldCBzY2hlbWEgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlqb2luVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWpvaW5UYWJsZUFubm90YXRpb24gPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGVBbm5vdGF0aW9uLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIGphdmFKb2luVGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoam9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5UYWJsZSk7Ci0JCQotCQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJamF2YUpvaW5UYWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqYXZhSm9pblRhYmxlLnNldENhdGFsb2coIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhSm9pblRhYmxlLmdldENhdGFsb2coKSk7Ci0JCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJamF2YUpvaW5UYWJsZS5zZXRDYXRhbG9nKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pblRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQlqYXZhSm9pblRhYmxlLnNldENhdGFsb2coIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhSm9pblRhYmxlLmdldENhdGFsb2coKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoam9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlQW5ub3RhdGlvbik7Ci0JCi0JCS8vc2V0IGNhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlqb2luVGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZygiZm9vIik7Ci0JCWpvaW5UYWJsZUFubm90YXRpb24gPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luVGFibGVBbm5vdGF0aW9uLmdldENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJam9pblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWpvaW5UYWJsZUFubm90YXRpb24gPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGVBbm5vdGF0aW9uLmdldENhdGFsb2coKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVSZXNvdXJjZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4yID0gam9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbjMgPSBqb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtbjMuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMiwgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4zLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbiwgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCi0JCWpvaW5Db2x1bW5zID0gam9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlqb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVBbm5vdGF0aW9uLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCWpvaW5UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgam9pblRhYmxlQW5ub3RhdGlvbi5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlQW5ub3RhdGlvbi5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVBbm5vdGF0aW9uLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCi0JCWpvaW5UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlQW5ub3RhdGlvbi5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlQW5ub3RhdGlvbi5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWpvaW5UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgam9pblRhYmxlQW5ub3RhdGlvbi5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlqb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVSZXNvdXJjZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMywgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJCi0JCWpvaW5UYWJsZS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCWpvaW5UYWJsZS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVSZXNvdXJjZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5hZGRKb2luQ29sdW1uKDApOwotCQlqb2luVGFibGVSZXNvdXJjZS5hZGRKb2luQ29sdW1uKDEpOwotCQlqb2luVGFibGVSZXNvdXJjZS5hZGRKb2luQ29sdW1uKDIpOwotCQkKLQkJam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLnNldE5hbWUoIkZPTyIpOwotCQlqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCi0JCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBqb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJam9pblRhYmxlUmVzb3VyY2UubW92ZUpvaW5Db2x1bW4oMiwgMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZVJlc291cmNlLm1vdmVKb2luQ29sdW1uKDAsIDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5yZW1vdmVKb2luQ29sdW1uKDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5yZW1vdmVKb2luQ29sdW1uKDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJam9pblRhYmxlUmVzb3VyY2UucmVtb3ZlSm9pbkNvbHVtbigwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBqb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJam9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBqb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1uc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCWpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCWpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgam9pblRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQotCQlqb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCi0JCS8vIGRlZmF1bHQgY29sdW1ucwotCQlhc3NlcnROb3ROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzQXR0cmlidXRlID0gdGhpcy5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLnJlbW92ZVN0cmF0ZWd5KCk7Ci0JCS8vIGRlZmF1bHQgam9pbiB0YWJsZQotCQlhc3NlcnROb3ROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc0F0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQkvL2lmIG5vbi1vd25pbmcgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIHRoZW4gbm8gZGVmYXVsdCBqb2luIHRhYmxlCi0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgiZm9vIik7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJCi0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBqb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQkJCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZVJlc291cmNlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uMiA9IGpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2UuaW52ZXJzZUpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQkKLQkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbjMgPSBqb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMSk7Ci0JCWludmVyc2VKb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2UuaW52ZXJzZUpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmludmVyc2VKb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGludmVyc2VKb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoaW52ZXJzZUpvaW5Db2x1bW4yLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGludmVyc2VKb2luQ29sdW1uMywgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhpbnZlcnNlSm9pbkNvbHVtbiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCQotCQlpbnZlcnNlSm9pbkNvbHVtbnMgPSBqb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlUmVzb3VyY2UgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlqb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmludmVyc2VKb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0KLQkJam9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlqb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCWpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZVJlc291cmNlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJCi0JCWpvaW5UYWJsZS5tb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gaW52ZXJzZUpvaW5Db2x1bW5zID0gam9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2UuaW52ZXJzZUpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmludmVyc2VKb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCWpvaW5UYWJsZS5tb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCwgMSk7Ci0JCWludmVyc2VKb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2UuaW52ZXJzZUpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmludmVyc2VKb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVJbnZlcnNlSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlUmVzb3VyY2UgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkKLQkJam9pblRhYmxlUmVzb3VyY2UuYWRkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmFkZEludmVyc2VKb2luQ29sdW1uKDEpOwotCQlqb2luVGFibGVSZXNvdXJjZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigyKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLmludmVyc2VKb2luQ29sdW1uQXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmludmVyc2VKb2luQ29sdW1uQXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmludmVyc2VKb2luQ29sdW1uQXQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQotCQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGludmVyc2VKb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShpbnZlcnNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLm1vdmVJbnZlcnNlSm9pbkNvbHVtbigyLCAwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWludmVyc2VKb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShpbnZlcnNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlUmVzb3VyY2UubW92ZUludmVyc2VKb2luQ29sdW1uKDAsIDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW5zID0gam9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5yZW1vdmVJbnZlcnNlSm9pbkNvbHVtbigxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWludmVyc2VKb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5yZW1vdmVJbnZlcnNlSm9pbkNvbHVtbigxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWludmVyc2VKb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaW52ZXJzZUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5yZW1vdmVJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpIHsKLQkJLy9UT0RPCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlqb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBqb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCWpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgam9pblRhYmxlLmdldEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0KLQkJam9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlqb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCS8vaWYgbm9uLW93bmluZyBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgdGhlbiBubyBkZWZhdWx0IGpvaW4gdGFibGUKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiZm9vIik7Ci0JCWpvaW5UYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJiYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50cyA9IGpvaW5UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsICBqb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiZm9vIik7Ci0JCWpvaW5UYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJiYXIiKTsKLQkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgIGpvaW5UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlqb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJam9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50cyA9IGpvaW5UYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlqb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJam9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCWpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJam9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCWpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlqb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCi0JCWpvaW5UYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSBqb2luVGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCQotCQlqb2luVGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gam9pblRhYmxlQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwkJCi0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5oYXNOZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJam9pblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IGpvaW5UYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlqb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJam9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQkJCi0JCQotCQlqb2luVGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gam9pblRhYmxlQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0KLQotCQlqb2luVGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSBqb2luVGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQotCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCWpvaW5UYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKCJCQVIiKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZUFubm90YXRpb24ucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlqb2luVGFibGVBbm5vdGF0aW9uLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IGpvaW5UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzN2ZiMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luVGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PcmRlckJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQsICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIENvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbGxlY3Rpb25NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklELCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhOb25Db2xsZWN0aW9uTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPFN0cmluZywgQWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXAgYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3REZXBhcnRtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuRU5USVRZKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5JRCkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0IGphdmEudXRpbC5NYXA7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuTUFOWV9UT19NQU5ZKS5hcHBlbmQoIjsiKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiRGVwYXJ0bWVudCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBNYXA8SW50ZWdlciwgRW1wbG95ZWU+IGVtcGxveWVlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJEZXBhcnRtZW50LmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1wbG95ZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJFbXBsb3llZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGVtcElkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkVtcGxveWVlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyBKYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55QW5ub3RhdGlvbiA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55QW5ub3RhdGlvbi5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnlBbm5vdGF0aW9uLnNldFRhcmdldEVudGl0eSgibmV3VGFyZ2V0RW50aXR5Iik7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5IiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb01hbnlBbm5vdGF0aW9uLmdldFRhcmdldEVudGl0eSgpKTsKLQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYW55VG9NYW55QW5ub3RhdGlvbi5zZXRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlBbm5vdGF0aW9uLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkJCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIm5ld1RhcmdldEVudGl0eSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBtYW55VG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRGZXRjaCgpKTsKLQkJCQkKLQkJLy9zZXQgZmV0Y2ggaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnkuc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkVBR0VSKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkVBR0VSLCBtYW55VG9NYW55LmdldEZldGNoKCkpOwotCQotCQltYW55VG9NYW55LnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSwgbWFueVRvTWFueS5nZXRGZXRjaCgpKTsKLQotCQkKLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvTWFueS5zZXRGZXRjaChudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuRUFHRVIsIG1hbnlUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSwgbWFueVRvTWFueS5nZXRGZXRjaCgpKTsKLQkJCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRGZXRjaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQkJCQotCQkvL3NldCBtYXBwZWRCeUpvaW5pbmdTdHJhdGVneSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueS5zZXRNYXBwZWRCeSgibmV3TWFwcGVkQnkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQotCQkvL3NldCBtYXBwZWRCeUpvaW5pbmdTdHJhdGVneSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYW55VG9NYW55LnNldE1hcHBlZEJ5KG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibmV3VGFyZ2V0RW50aXR5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5IiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCi0JCS8vc2V0IG1hcHBlZEJ5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJTWFueVRvTWFueVJlbGF0aW9uc2hpcCByZWwgPSBtYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlNYW55VG9NYW55UmVsYXRpb25zaGlwIHJlbCA9IG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gCi0JCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0KLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKLQkJYXNzZXJ0TnVsbChzdGF0ZUZvb01hcHBpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCS8vdGFyZ2V0RW50aXR5IG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCwgZGVmYXVsdCBzdGlsbCBzZXQsIGhhbmRsZWQgYnkgdmFsaWRhdGlvbgotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCS8vYWRkIHRhcmdldEVudGl0eSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0KLQkJLy90ZXN0IGRlZmF1bHQgc3RpbGwgdGhlIHNhbWUgd2hlbiBzcGVjaWZpZWQgdGFyZ2V0IGVudGl0eSBpdCBzZXQKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGFkZHJlc3NDbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBhZGRyZXNzQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0KLQkJLy90ZXN0IHRhcmdldCBpcyBub3QgYW4gRW50aXR5LCBkZWZhdWx0IHRhcmdldCBlbnRpdHkgc3RpbGwgZXhpc3RzLCB0aGlzIGNhc2UgaGFuZGxlZCB3aXRoIHZhbGlkYXRpb24KLQkJYWRkcmVzc1BlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0RW50aXR5Q29sbGVjdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb2xsZWN0aW9uTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0RW50aXR5Tm9uQ29sbGVjdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOb25Db2xsZWN0aW9uTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlc29sdmVkVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCS8vdGFyZ2V0RW50aXR5IG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJLy9hZGQgdGFyZ2V0RW50aXR5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LCBub3cgdGFyZ2V0IGVudGl0eSBzaG91bGQgcmVzb2x2ZQotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBhZGRyZXNzQ2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQlUeXBlTWFwcGluZyBhZGRyZXNzVHlwZU1hcHBpbmcgPSBhZGRyZXNzQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoYWRkcmVzc1R5cGVNYXBwaW5nLCBtYW55VG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpKTsKLQotCQkvL3Rlc3QgZGVmYXVsdCBzdGlsbCB0aGUgc2FtZSB3aGVuIHNwZWNpZmllZCB0YXJnZXQgZW50aXR5IGl0IHNldAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKGFkZHJlc3NUeXBlTWFwcGluZywgbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGFkZHJlc3NUeXBlTWFwcGluZywgbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCU1hcEtleUFubm90YXRpb24gbWFwS2V5ID0gKE1hcEtleUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwobWFwS2V5KTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hcEtleS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hcEtleS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFwS2V5LnNldE5hbWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXkuZ2V0TmFtZSgpKTsKLQkJCi0JCW1hcEtleS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkJCQkKLQkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJteU1hcEtleSIpOwotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleUFubm90YXRpb24gPSAoTWFwS2V5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hcEtleUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJbWFwS2V5QW5ub3RhdGlvbiA9IChNYXBLZXlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG1hcEtleUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0Tm9NYXBLZXkodHJ1ZSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YU1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gCi0JCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIGphdmFNYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IGphdmFNYW55VG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IGphdmFNYW55VG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlT3JkZXJCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkKLQkJLy9zZXQgb3JkZXJCeSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCU9yZGVyQnlBbm5vdGF0aW9uIG9yZGVyQnkgPSAoT3JkZXJCeUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlvcmRlckJ5LnNldFZhbHVlKCJuZXdPcmRlckJ5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvcmRlckJ5LmdldFZhbHVlKCkpOwotCQotCQkvL3NldCBvcmRlckJ5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU9yZGVyQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcHBlZEJ5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJuZXdPcmRlckJ5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JCU9yZGVyQnlBbm5vdGF0aW9uIG9yZGVyQnkgPSAoT3JkZXJCeUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvcmRlckJ5LmdldFZhbHVlKCkpOwotCQotCQkvL3NldCBtYXBwZWRCeSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOb09yZGVyaW5nKCkgIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkJCQotCQkvL3NldCBvcmRlckJ5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzTm9PcmRlcmluZygpKTsKLQkJCi0JCU9yZGVyQnlBbm5vdGF0aW9uIG9yZGVyQnkgPSAoT3JkZXJCeUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlvcmRlckJ5LnNldFZhbHVlKCJuZXdPcmRlckJ5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JCi0JCS8vc2V0IG9yZGVyQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzTm9PcmRlcmluZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOb09yZGVyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzTm9PcmRlcmluZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCi0vLwkJbWFueVRvTWFueU1hcHBpbmcuc2V0Tm9PcmRlcmluZyhmYWxzZSk7IC8vdGhpcyBkb2VzIG5vdGhpbmcKLS8vCQkvL3NldCBtYXBwZWRCeSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLS8vCQltYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJuZXdPcmRlckJ5Iik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJuZXdPcmRlckJ5IiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJCeSgpKTsKLS8vCQlPcmRlckJ5IG9yZGVyQnkgPSAoT3JkZXJCeSkgcmVzb3VyY2VGaWVsZC5hbm5vdGF0aW9uKE9yZGVyQnkuQU5OT1RBVElPTl9OQU1FKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvcmRlckJ5LmdldFZhbHVlKCkpOwotLy8JCi0vLwkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotLy8JCW1hbnlUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkobnVsbCk7Ci0vLwkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRPcmRlckJ5KCkpOwotLy8JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5hbm5vdGF0aW9uKE9yZGVyQnkuQU5OT1RBVElPTl9OQU1FKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVBrT3JkZXJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzUGtPcmRlcmluZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCi0JCS8vc2V0IG9yZGVyQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc1BrT3JkZXJpbmcoKSk7Ci0JCQotCQlPcmRlckJ5QW5ub3RhdGlvbiBvcmRlckJ5ID0gKE9yZGVyQnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJb3JkZXJCeS5zZXRWYWx1ZSgibmV3T3JkZXJCeSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNQa09yZGVyaW5nKCkpOwotCQotCQkvL3NldCBvcmRlckJ5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNQa09yZGVyaW5nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ3VzdG9tT3JkZXJpbmcoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkKLQkJLy9zZXQgb3JkZXJCeSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzQ3VzdG9tT3JkZXJpbmcoKSk7Ci0JCQotCQlPcmRlckJ5QW5ub3RhdGlvbiBvcmRlckJ5ID0gKE9yZGVyQnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJb3JkZXJCeS5zZXRWYWx1ZSgibmV3T3JkZXJCeSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCQotCQkvL3NldCBvcmRlckJ5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNDdXN0b21PcmRlcmluZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0RW50aXR5Rm9yTWFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbXBsb3llZSgpOwotCQljcmVhdGVUZXN0RGVwYXJ0bWVudCgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkRlcGFydG1lbnQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5FbXBsb3llZSIpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlNYW55VG9NYW55TWFwcGluZyBlbXBsb3llZXNNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuRW1wbG95ZWUiLCBlbXBsb3llZXNNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjEwNzFkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbGxlY3Rpb25NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY2l6ZWRDb2xsZWN0aW9uTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEuSUQsICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIEphdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBWZXJzaW9uTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb09uZS5zZXRUYXJnZXRFbnRpdHkoIm5ld1RhcmdldEVudGl0eSIpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvT25lLnNldFRhcmdldEVudGl0eShudWxsKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIm5ld1RhcmdldEVudGl0eSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJbWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IG9wdGlvbmFsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9PbmUuc2V0T3B0aW9uYWwoQm9vbGVhbi5UUlVFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCW1hbnlUb09uZS5zZXRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFueVRvT25lLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJLy9zZXQgb3B0aW9uYWwgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvT25lLnNldE9wdGlvbmFsKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IG9wdGlvbmFsIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQltYW55VG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkKLQkJbWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0KLQkJCi0JCS8vc2V0IG9wdGlvbmFsIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJbWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBKb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0KLQkJam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEpvaW5Db2x1bW5zID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEpvaW5Db2x1bW5zID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRKb2luKCkgewotCQkvL1RPRE8KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJam9pbkNvbHVtbnMucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5Db2x1bW5zLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luQ29sdW1ucy5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgam9pbkNvbHVtbnMuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCi0JCWpvaW5Db2x1bW5zLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW5zLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luQ29sdW1ucy5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqb2luQ29sdW1uc0l0ZXJhdG9yID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGpvaW5Db2x1bW5zSXRlcmF0b3IgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCi0JCWpvaW5Db2x1bW5zLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMSk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGpvaW5Db2x1bW5SZXNvdXJjZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5SZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gam9pbkNvbHVtbnNJdGVyYXRvciA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQotCQkKLQkJam9pbkNvbHVtbnMucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtblJlc291cmNlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkpPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5SZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQkKLQkJam9pbkNvbHVtbnMucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtblJlc291cmNlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkpPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YUpvaW5Db2x1bW5zID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhSm9pbkNvbHVtbnMpKTsKLQkJCi0JCWpvaW5Db2x1bW5zLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQlqYXZhSm9pbkNvbHVtbnMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQotCi0JCWpvaW5Db2x1bW5zLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDAsIDEpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJamF2YUpvaW5Db2x1bW5zID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQkoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSkuc2V0TmFtZSgiRk9PIik7Ci0JCSgoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigxLCBKUEEuSk9JTl9DT0xVTU4pKS5zZXROYW1lKCJCQVIiKTsKLQkJKChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDIsIEpQQS5KT0lOX0NPTFVNTikpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zSXRlcmF0b3IgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMiwgMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigwLCAxLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnNJdGVyYXRvciA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMSwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnNJdGVyYXRvciA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5Jc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlhc3NlcnRUcnVlKGpvaW5Db2x1bW5zLmdldERlZmF1bHRKb2luQ29sdW1uKCkuaXNWaXJ0dWFsKCkpOwotCQkKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJSm9pbkNvbHVtbiBzcGVjaWZpZWRKb2luQ29sdW1uID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbi5pc1ZpcnR1YWwoKSk7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5zLmdldERlZmF1bHRKb2luQ29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU1hbnlUb09uZVJlbGF0aW9uc2hpcCByZWwgPSBtYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU1hbnlUb09uZVJlbGF0aW9uc2hpcCByZWwgPSBtYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCS8vdGFyZ2V0RW50aXR5IG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCwgZGVmYXVsdCBzdGlsbCBzZXQsIGhhbmRsZWQgYnkgdmFsaWRhdGlvbgotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgbWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJLy9hZGQgdGFyZ2V0RW50aXR5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgbWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCi0JCS8vdGVzdCBkZWZhdWx0IHN0aWxsIHRoZSBzYW1lIHdoZW4gc3BlY2lmaWVkIHRhcmdldCBlbnRpdHkgaXQgc2V0Ci0JCW1hbnlUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG1hbnlUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJQ2xhc3NSZWYgYWRkcmVzc0NsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IGFkZHJlc3NDbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQotCQkvL3Rlc3QgdGFyZ2V0IGlzIG5vdCBhbiBFbnRpdHksIGRlZmF1bHQgdGFyZ2V0IGVudGl0eSBzdGlsbCBleGlzdHMsIHRoaXMgY2FzZSBoYW5kbGVkIHdpdGggdmFsaWRhdGlvbgotCQlhZGRyZXNzUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgbWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRhcmdldEVudGl0eUNvbGxlY3Rpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29sbGVjdGlvbk1hbnlUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKG1hbnlUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRFbnRpdHlHZW5lcmljaXplZENvbGxlY3Rpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY2l6ZWRDb2xsZWN0aW9uTWFueVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBtYW55VG9PbmVNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQotCQltYW55VG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFueVRvT25lTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQltYW55VG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG1hbnlUb09uZU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQkvL3RhcmdldEVudGl0eSBub3QgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJLy9hZGQgdGFyZ2V0RW50aXR5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LCBub3cgdGFyZ2V0IGVudGl0eSBzaG91bGQgcmVzb2x2ZQotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBhZGRyZXNzQ2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQlUeXBlTWFwcGluZyBhZGRyZXNzVHlwZU1hcHBpbmcgPSBhZGRyZXNzQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoYWRkcmVzc1R5cGVNYXBwaW5nLCBtYW55VG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCi0JCS8vdGVzdCBkZWZhdWx0IHN0aWxsIHRoZSBzYW1lIHdoZW4gc3BlY2lmaWVkIHRhcmdldCBlbnRpdHkgaXQgc2V0Ci0JCW1hbnlUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJCi0JCW1hbnlUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoYWRkcmVzc1R5cGVNYXBwaW5nLCBtYW55VG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCQkKLQotCQltYW55VG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGFkZHJlc3NUeXBlTWFwcGluZywgbWFueVRvT25lTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNzg4MTguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTnVsbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQ2xhc3NBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEphdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJUZXN0VHlwZUlkIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlRlc3RUeXBlSWQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5zZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgibXlJZENsYXNzIik7Ci0JCQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbnRpdHkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCW1hcHBlZFN1cGVyY2xhc3MuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLnNldFNwZWNpZmllZElkQ2xhc3NOYW1lKCJteUlkQ2xhc3MiKTsKLQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkYWJsZSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCW1hcHBlZFN1cGVyY2xhc3MuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLnNldFNwZWNpZmllZElkQ2xhc3NOYW1lKCJteUlkQ2xhc3MiKTsKLQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSmF2YU51bGxUeXBlTWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYXBwZWRTdXBlcmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlTmFtZUlzSW52YWxpZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEZhbHNlKG1hcHBlZFN1cGVyY2xhc3MudGFibGVOYW1lSXNJbnZhbGlkKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKLQkJYXNzZXJ0RmFsc2UobWFwcGVkU3VwZXJjbGFzcy50YWJsZU5hbWVJc0ludmFsaWQoIkZPTyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRlZFRhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEZhbHNlKG1hcHBlZFN1cGVyY2xhc3MuZ2V0QXNzb2NpYXRlZFRhYmxlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRlZFRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEZhbHNlKG1hcHBlZFN1cGVyY2xhc3MuZ2V0QWxsQXNzb2NpYXRlZFRhYmxlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0ZWRUYWJsZU5hbWVzSW5jbHVkaW5nSW5oZXJpdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RmFsc2UobWFwcGVkU3VwZXJjbGFzcy5nZXRBbGxBc3NvY2lhdGVkVGFibGVOYW1lcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQkvL1RPRE8gbmVlZCB0byBjcmVhdGUgYSBzdWJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzIGFuZCB0ZXN0IHRoaXMKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUobWFwcGVkU3VwZXJjbGFzcy5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwZWRTdXBlcmNsYXNzLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKG1hcHBlZFN1cGVyY2xhc3MuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUobWFwcGVkU3VwZXJjbGFzcy5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwZWRTdXBlcmNsYXNzLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUobWFwcGVkU3VwZXJjbGFzcy5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUobWFwcGVkU3VwZXJjbGFzcy5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKG1hcHBlZFN1cGVyY2xhc3MuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUobWFwcGVkU3VwZXJjbGFzcy5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwZWRTdXBlcmNsYXNzLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSWRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0SWRDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUlkQ2xhc3NSZWZlcmVuY2UgaWRDbGFzc1JlZiA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCUlkQ2xhc3NBbm5vdGF0aW9uIGlkQ2xhc3NBbm5vdGF0aW9uID0gKElkQ2xhc3NBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCS8vIHRlc3Qgc2V0dGluZyBpZCBjbGFzcyBuYW1lIHRvIG5vbmV4aXN0ZW50IGNsYXNzLiAgdGVzdCBjbGFzcyBuYW1lIGlzIHNldCwgYnV0IGNsYXNzIGlzIG51bGwKLQkJU3RyaW5nIG5vbkV4aXN0ZW50SWRDbGFzc05hbWUgPSBQQUNLQUdFX05BTUUgKyAiLkZvbyI7Ci0JCWlkQ2xhc3NBbm5vdGF0aW9uLnNldFZhbHVlKG5vbkV4aXN0ZW50SWRDbGFzc05hbWUpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobm9uRXhpc3RlbnRJZENsYXNzTmFtZSwgKChJZENsYXNzQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhub25FeGlzdGVudElkQ2xhc3NOYW1lLCBpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCS8vIHRlc3Qgc2V0dGluZyBpZCBjbGFzcyBuYW1lIHRvIGV4aXN0ZW50IGNsYXNzLiAgdGVzdCBjbGFzcyBuYW1lIGlzIHNldCBhbmQgY2xhc3MgaXMgbm90IG51bGwKLQkJU3RyaW5nIGV4aXN0ZW50SWRDbGFzc05hbWUgPSBQQUNLQUdFX05BTUUgKyAiLlRlc3RUeXBlSWQiOwotCQlpZENsYXNzQW5ub3RhdGlvbi5zZXRWYWx1ZShleGlzdGVudElkQ2xhc3NOYW1lKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKGV4aXN0ZW50SWRDbGFzc05hbWUsICgoSWRDbGFzc0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhpc3RlbnRJZENsYXNzTmFtZSwgaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JCQotCQkvL3Rlc3Qgc2V0dGluZyAgQElkQ2xhc3MgdmFsdWUgdG8gbnVsbCwgSWRDbGFzcyBhbm5vdGF0aW9uIGlzIHJlbW92ZWQKLQkJaWRDbGFzc1JlZi5zZXRTcGVjaWZpZWRJZENsYXNzTmFtZShudWxsKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCS8vcmVzZXQgQElkQ2xhc3MgdmFsdWUgYW5kIHRoZW4gcmVtb3ZlIEBJZENsYXNzCi0JCWlkQ2xhc3NBbm5vdGF0aW9uID0gKElkQ2xhc3NBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkKLQkJaWRDbGFzc0Fubm90YXRpb24uc2V0VmFsdWUoZXhpc3RlbnRJZENsYXNzTmFtZSk7Ci0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRJZENsYXNzKCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RJZENsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSWRDbGFzc1JlZmVyZW5jZSBpZENsYXNzUmVmID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRJZENsYXNzUmVmZXJlbmNlKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRJZENsYXNzKCkpOwotCQkKLQkJU3RyaW5nIG5vbkV4aXN0ZW50SWRDbGFzc05hbWUgPSBQQUNLQUdFX05BTUUgKyAiLkZvbyI7Ci0JCWlkQ2xhc3NSZWYuc2V0U3BlY2lmaWVkSWRDbGFzc05hbWUobm9uRXhpc3RlbnRJZENsYXNzTmFtZSk7Ci0JCWFzc2VydEVxdWFscyhub25FeGlzdGVudElkQ2xhc3NOYW1lLCAoKElkQ2xhc3NBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5vbkV4aXN0ZW50SWRDbGFzc05hbWUsIGlkQ2xhc3NSZWYuZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRJZENsYXNzKCkpOwotCQkKLQkJU3RyaW5nIGV4aXN0ZW50SWRDbGFzc05hbWUgPSBQQUNLQUdFX05BTUUgKyAiLlRlc3RUeXBlSWQiOwotCQlpZENsYXNzUmVmLnNldFNwZWNpZmllZElkQ2xhc3NOYW1lKGV4aXN0ZW50SWRDbGFzc05hbWUpOwotCQlhc3NlcnRFcXVhbHMoZXhpc3RlbnRJZENsYXNzTmFtZSwgKChJZENsYXNzQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhleGlzdGVudElkQ2xhc3NOYW1lLCBpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCWlkQ2xhc3NSZWYuc2V0U3BlY2lmaWVkSWRDbGFzc05hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTmFtZWROYXRpdmVRdWVyeVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFOYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY0Mzc4OC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFOYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhTmFtZWROYXRpdmVRdWVyeVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfTkFNRSA9ICJRVUVSWV9OQU1FIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfUVVFUlkgPSAiTVlfUVVFUlkiOwotCQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZE5hdGl2ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWU9XCIiICsgUVVFUllfTkFNRSArICJcIiwgcXVlcnk9XCIiICsgUVVFUllfUVVFUlkgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCi0JCQotCXB1YmxpYyBKYXZhTmFtZWROYXRpdmVRdWVyeVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkTmF0aXZlUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWROYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoUVVFUllfTkFNRSwgamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX05BTUUsIG5hbWVkTmF0aXZlUXVlcnkuZ2V0TmFtZSgpKTsKLQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWphdmFOYW1lZE5hdGl2ZVF1ZXJ5LnNldE5hbWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWROYXRpdmVRdWVyeS5nZXROYW1lKCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWphdmFOYW1lZE5hdGl2ZVF1ZXJ5LnNldE5hbWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkTmF0aXZlUXVlcnkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gamF2YU5hbWVkTmF0aXZlUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX05BTUUsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9OQU1FLCBuYW1lZE5hdGl2ZVF1ZXJ5LmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQluYW1lZE5hdGl2ZVF1ZXJ5LnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5LmdldE5hbWUoKSk7Ci0KLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbmFtZWROYXRpdmVRdWVyeS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkTmF0aXZlUXVlcnkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWROYXRpdmVRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWROYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoUVVFUllfUVVFUlksIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUVVFUlksIG5hbWVkTmF0aXZlUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJamF2YU5hbWVkTmF0aXZlUXVlcnkuc2V0UXVlcnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnROdWxsKG5hbWVkTmF0aXZlUXVlcnkuZ2V0UXVlcnkoKSk7Ci0KLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJamF2YU5hbWVkTmF0aXZlUXVlcnkuc2V0UXVlcnkoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZE5hdGl2ZVF1ZXJ5LmdldFF1ZXJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gamF2YU5hbWVkTmF0aXZlUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCi0JCWFzc2VydEVxdWFscyhRVUVSWV9RVUVSWSwgamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9RVUVSWSwgbmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW5hbWVkTmF0aXZlUXVlcnkuc2V0UXVlcnkobnVsbCk7Ci0JCWFzc2VydE51bGwoamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCWFzc2VydE51bGwobmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKLQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQluYW1lZE5hdGl2ZVF1ZXJ5LnNldFF1ZXJ5KCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZE5hdGl2ZVF1ZXJ5LmdldFF1ZXJ5KCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkTmF0aXZlUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWROYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkKLQkJCi0JCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBuYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCXF1ZXJ5SGludC5zZXROYW1lKCJGT08iKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQkKLQkJUXVlcnlIaW50IHF1ZXJ5SGludDIgPSBuYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCXF1ZXJ5SGludDIuc2V0TmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQkKLQkJUXVlcnlIaW50IHF1ZXJ5SGludDMgPSBuYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMSk7Ci0JCXF1ZXJ5SGludDMuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBRdWVyeUhpbnQ+IGhpbnRzID0gbmFtZWROYXRpdmVRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhxdWVyeUhpbnQyLCBoaW50cy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocXVlcnlIaW50MywgaGludHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHF1ZXJ5SGludCwgaGludHMubmV4dCgpKTsKLQkJCi0JCWhpbnRzID0gbmFtZWROYXRpdmVRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWROYXRpdmVRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCi0JCW5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJGT08iKTsKLQkJbmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDEpLnNldE5hbWUoIkJBUiIpOwotCQluYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQkKLQkJbmFtZWROYXRpdmVRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCi0JCW5hbWVkTmF0aXZlUXVlcnkucmVtb3ZlSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW5hbWVkTmF0aXZlUXVlcnkucmVtb3ZlSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWROYXRpdmVRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCi0JCW5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJGT08iKTsKLQkJbmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDEpLnNldE5hbWUoIkJBUiIpOwotCQluYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQkKLQkJCi0JCW5hbWVkTmF0aXZlUXVlcnkubW92ZUhpbnQoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgUXVlcnlIaW50PiBoaW50cyA9IG5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQluYW1lZE5hdGl2ZVF1ZXJ5Lm1vdmVIaW50KDAsIDEpOwotCQloaW50cyA9IG5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVIaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkTmF0aXZlUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBxdWVyeUFubm90YXRpb24gPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlxdWVyeUFubm90YXRpb24uYWRkSGludCgwKS5zZXROYW1lKCJGT08iKTsKLQkJcXVlcnlBbm5vdGF0aW9uLmFkZEhpbnQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCXF1ZXJ5QW5ub3RhdGlvbi5hZGRIaW50KDIpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBRdWVyeUhpbnQ+IGhpbnRzID0gbmFtZWROYXRpdmVRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGhpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlxdWVyeUFubm90YXRpb24ubW92ZUhpbnQoMiwgMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQloaW50cyA9IG5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCQotCQlxdWVyeUFubm90YXRpb24ubW92ZUhpbnQoMCwgMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQloaW50cyA9IG5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCQotCQlxdWVyeUFubm90YXRpb24ucmVtb3ZlSGludCgxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWhpbnRzID0gbmFtZWROYXRpdmVRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGhpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXF1ZXJ5QW5ub3RhdGlvbi5yZW1vdmVIaW50KDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJaGludHMgPSBuYW1lZE5hdGl2ZVF1ZXJ5LmdldEhpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaGludHMuaGFzTmV4dCgpKTsKLQkJCi0JCXF1ZXJ5QW5ub3RhdGlvbi5yZW1vdmVIaW50KDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWROYXRpdmVRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWROYXRpdmVRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgbmFtZWROYXRpdmVRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWROYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCQotCQlqYXZhTmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQkKLQkJamF2YU5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygyLCBuYW1lZE5hdGl2ZVF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJCi0JCWphdmFOYW1lZE5hdGl2ZVF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWphdmFOYW1lZE5hdGl2ZVF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgbmFtZWROYXRpdmVRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZXN1bHRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkTmF0aXZlUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gcXVlcnlBbm5vdGF0aW9uID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHF1ZXJ5QW5ub3RhdGlvbi5nZXRSZXN1bHRDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0KLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcXVlcnlBbm5vdGF0aW9uLnNldFJlc3VsdENsYXNzKCJmb28iKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBxdWVyeUFubm90YXRpb24uZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcXVlcnlBbm5vdGF0aW9uLnNldFJlc3VsdENsYXNzKG51bGwpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHF1ZXJ5QW5ub3RhdGlvbi5nZXRSZXN1bHRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UmVzdWx0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gamF2YU5hbWVkTmF0aXZlUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBuYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQluYW1lZE5hdGl2ZVF1ZXJ5LnNldFJlc3VsdENsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQluYW1lZE5hdGl2ZVF1ZXJ5LnNldFJlc3VsdENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZXN1bHRTZXRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWROYXRpdmVRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWROYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWphdmFOYW1lZE5hdGl2ZVF1ZXJ5LnNldFJlc3VsdFNldE1hcHBpbmcoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJamF2YU5hbWVkTmF0aXZlUXVlcnkuc2V0UmVzdWx0U2V0TWFwcGluZyhudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlSZXN1bHRTZXRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWROYXRpdmVRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBuYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0KLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbmFtZWROYXRpdmVRdWVyeS5zZXRSZXN1bHRTZXRNYXBwaW5nKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQluYW1lZE5hdGl2ZVF1ZXJ5LnNldFJlc3VsdFNldE1hcHBpbmcobnVsbCk7Ci0JCWFzc2VydE51bGwoamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFOYW1lZFF1ZXJ5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU5hbWVkUXVlcnlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDk1YzI4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU5hbWVkUXVlcnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5OYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTmFtZWRRdWVyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEphdmFOYW1lZFF1ZXJ5VGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9OQU1FID0gIlFVRVJZX05BTUUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9RVUVSWSA9ICJNWV9RVUVSWSI7Ci0JCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWRRdWVyeShuYW1lPVwiIiArIFFVRVJZX05BTUUgKyAiXCIsIHF1ZXJ5PVwiIiArIFFVRVJZX1FVRVJZICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQotCQkKLQlwdWJsaWMgSmF2YU5hbWVkUXVlcnlUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZFF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX05BTUUsIGphdmFOYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9OQU1FLCBuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJamF2YU5hbWVkUXVlcnkuc2V0TmFtZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoamF2YU5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0KLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJamF2YU5hbWVkUXVlcnkuc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFOYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhRVUVSWV9OQU1FLCBqYXZhTmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfTkFNRSwgbmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJbmFtZWRRdWVyeS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGphdmFOYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW5hbWVkUXVlcnkuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YU5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gamF2YU5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoUVVFUllfUVVFUlksIGphdmFOYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUVVFUlksIG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJamF2YU5hbWVkUXVlcnkuc2V0UXVlcnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGphdmFOYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0KLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJamF2YU5hbWVkUXVlcnkuc2V0UXVlcnkoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhTmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZFF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gamF2YU5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoUVVFUllfUVVFUlksIGphdmFOYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUVVFUlksIG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQluYW1lZFF1ZXJ5LnNldFF1ZXJ5KG51bGwpOwotCQlhc3NlcnROdWxsKGphdmFOYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0KLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbmFtZWRRdWVyeS5zZXRRdWVyeSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YU5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZFF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkKLQkJCi0JCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBuYW1lZFF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCXF1ZXJ5SGludC5zZXROYW1lKCJGT08iKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQkKLQkJUXVlcnlIaW50IHF1ZXJ5SGludDIgPSBuYW1lZFF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCXF1ZXJ5SGludDIuc2V0TmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQkKLQkJUXVlcnlIaW50IHF1ZXJ5SGludDMgPSBuYW1lZFF1ZXJ5LmFkZEhpbnQoMSk7Ci0JCXF1ZXJ5SGludDMuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBRdWVyeUhpbnQ+IGhpbnRzID0gbmFtZWRRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhxdWVyeUhpbnQyLCBoaW50cy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocXVlcnlIaW50MywgaGludHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHF1ZXJ5SGludCwgaGludHMubmV4dCgpKTsKLQkJCi0JCWhpbnRzID0gbmFtZWRRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWRRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCi0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJGT08iKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDEpLnNldE5hbWUoIkJBUiIpOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgamF2YU5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQkKLQkJbmFtZWRRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMiwgamF2YU5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCi0JCW5hbWVkUXVlcnkucmVtb3ZlSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGphdmFOYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqYXZhTmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW5hbWVkUXVlcnkucmVtb3ZlSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGphdmFOYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWRRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCi0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJGT08iKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDEpLnNldE5hbWUoIkJBUiIpOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgamF2YU5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQkKLQkJCi0JCW5hbWVkUXVlcnkubW92ZUhpbnQoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgUXVlcnlIaW50PiBoaW50cyA9IG5hbWVkUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YU5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YU5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQluYW1lZFF1ZXJ5Lm1vdmVIaW50KDAsIDEpOwotCQloaW50cyA9IG5hbWVkUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YU5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YU5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVIaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5QW5ub3RhdGlvbiA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCW5hbWVkUXVlcnlBbm5vdGF0aW9uLmFkZEhpbnQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW5hbWVkUXVlcnlBbm5vdGF0aW9uLmFkZEhpbnQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCW5hbWVkUXVlcnlBbm5vdGF0aW9uLmFkZEhpbnQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgUXVlcnlIaW50PiBoaW50cyA9IG5hbWVkUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJbmFtZWRRdWVyeUFubm90YXRpb24ubW92ZUhpbnQoMiwgMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQloaW50cyA9IG5hbWVkUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCQotCQluYW1lZFF1ZXJ5QW5ub3RhdGlvbi5tb3ZlSGludCgwLCAxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWhpbnRzID0gbmFtZWRRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGhpbnRzLmhhc05leHQoKSk7Ci0JCi0JCW5hbWVkUXVlcnlBbm5vdGF0aW9uLnJlbW92ZUhpbnQoMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQloaW50cyA9IG5hbWVkUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCQotCQluYW1lZFF1ZXJ5QW5ub3RhdGlvbi5yZW1vdmVIaW50KDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJaGludHMgPSBuYW1lZFF1ZXJ5LmdldEhpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaGludHMuaGFzTmV4dCgpKTsKLQkJCi0JCW5hbWVkUXVlcnlBbm5vdGF0aW9uLnJlbW92ZUhpbnQoMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJ5LmdldEhpbnRzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SGludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWRRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJCi0JCU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCQotCQlqYXZhTmFtZWRRdWVyeS5hZGRIaW50KDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQkKLQkJamF2YU5hbWVkUXVlcnkuYWRkSGludCgwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygyLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJCi0JCWphdmFOYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWphdmFOYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FlYTNlNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luVGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PcmRlckJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiU3RhdGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbGxlY3Rpb25PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhOb25Db2xsZWN0aW9uT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPFN0cmluZywgQWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXAgYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RGVwYXJ0bWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLkVOVElUWSkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuSUQpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCBqYXZhLnV0aWwuTWFwOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLk9ORV9UT19NQU5ZKS5hcHBlbmQoIjsiKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiRGVwYXJ0bWVudCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBFbXBsb3llZT4gZW1wbG95ZWVzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkRlcGFydG1lbnQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbXBsb3llZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLkVOVElUWSkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuSUQpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkVtcGxveWVlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgZW1wSWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRW1wbG95ZWUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXB1YmxpYyBKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueUFubm90YXRpb24gPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55QW5ub3RhdGlvbi5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueUFubm90YXRpb24uc2V0VGFyZ2V0RW50aXR5KCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb01hbnlBbm5vdGF0aW9uLmdldFRhcmdldEVudGl0eSgpKTsKLQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb01hbnlBbm5vdGF0aW9uLnNldFRhcmdldEVudGl0eShudWxsKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlBbm5vdGF0aW9uLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnkuc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkVBR0VSKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuRUFHRVIsIG9uZVRvTWFueS5nZXRGZXRjaCgpKTsKLQkKLQkJb25lVG9NYW55LnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZLCBvbmVUb01hbnkuZ2V0RmV0Y2goKSk7Ci0KLQkJCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvTWFueS5zZXRGZXRjaChudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSwgb25lVG9NYW55LmdldEZldGNoKCkpOwotCQkKLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldEZldGNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueS5zZXRNYXBwZWRCeSgibmV3TWFwcGVkQnkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdNYXBwZWRCeSIsIG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkKLQkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9NYW55LnNldE1hcHBlZEJ5KG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCi0JCS8vc2V0IG1hcHBlZEJ5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQkvL1RPRE8gdGhpcyBuZWVkcyB0byByZXR1cm4gbnVsbCBmb3IgMS4wIG1hcHBpbmdzLiAgd2Ugd2FudCB0aGUgdmFsaWRhdGlvbiBlcnJvciBmb3IgZG90LW5vdGF0aW9uIHNpbmNlIHRoaXMgaXMgb25seSBzdXBwb3J0ZWQgaW4gMi4wCi0JCS8vVE9ETyBuZWVkIHRvIGNvcHkgdGhpcyB0byBhbGwgdGhlIG90aGVyIG1hcHBlZCBieSB0ZXN0cy4KLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBvbmVUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnROdWxsKHN0YXRlRm9vTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBtYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPbmVUb01hbnlSZWxhdGlvbnNoaXAgcmVsID0gbWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgbWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT25lVG9NYW55UmVsYXRpb25zaGlwIHJlbCA9IG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQkvL3RhcmdldEVudGl0eSBub3QgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIGRlZmF1bHQgc3RpbGwgc2V0LCBoYW5kbGVkIGJ5IHZhbGlkYXRpb24KLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCS8vYWRkIHRhcmdldEVudGl0eSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQotCQkvL3Rlc3QgZGVmYXVsdCBzdGlsbCB0aGUgc2FtZSB3aGVuIHNwZWNpZmllZCB0YXJnZXQgZW50aXR5IGl0IHNldAotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBvbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGFkZHJlc3NDbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBhZGRyZXNzQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0KLQkJLy90ZXN0IHRhcmdldCBpcyBub3QgYW4gRW50aXR5LCBkZWZhdWx0IHRhcmdldCBlbnRpdHkgc3RpbGwgZXhpc3RzLCB0aGlzIGNhc2UgaGFuZGxlZCB3aXRoIHZhbGlkYXRpb24KLQkJYWRkcmVzc1BlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRFbnRpdHlDb2xsZWN0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbGxlY3Rpb25PbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0RW50aXR5Tm9uQ29sbGVjdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOb25Db2xsZWN0aW9uT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnlNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgb25lVG9NYW55TWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCS8vdGFyZ2V0RW50aXR5IG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQkvL2FkZCB0YXJnZXRFbnRpdHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIG5vdyB0YXJnZXQgZW50aXR5IHNob3VsZCByZXNvbHZlCi0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGFkZHJlc3NDbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCVR5cGVNYXBwaW5nIGFkZHJlc3NUeXBlTWFwcGluZyA9IGFkZHJlc3NDbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhhZGRyZXNzVHlwZU1hcHBpbmcsIG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0KLQkJLy90ZXN0IGRlZmF1bHQgc3RpbGwgdGhlIHNhbWUgd2hlbiBzcGVjaWZpZWQgdGFyZ2V0IGVudGl0eSBpdCBzZXQKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscyhhZGRyZXNzVHlwZU1hcHBpbmcsIG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnRFcXVhbHMoYWRkcmVzc1R5cGVNYXBwaW5nLCBvbmVUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IChNYXBLZXlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKG1hcEtleSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYXBLZXkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hcEtleS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFwS2V5LnNldE5hbWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hcEtleS5nZXROYW1lKCkpOwotCQkKLQkJbWFwS2V5LnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibXlNYXBLZXkiKTsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXlBbm5vdGF0aW9uID0gKE1hcEtleUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hcEtleUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCW1hcEtleUFubm90YXRpb24gPSAoTWFwS2V5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXlBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0Tm9NYXBLZXkodHJ1ZSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSAKLQkJCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IGphdmFPbmVUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJ0ZXN0LkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSBqYXZhT25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPcmRlckJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkKLQkJLy9zZXQgb3JkZXJCeSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCU9yZGVyQnlBbm5vdGF0aW9uIG9yZGVyQnkgPSAoT3JkZXJCeUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlvcmRlckJ5LnNldFZhbHVlKCJuZXdPcmRlckJ5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9yZGVyQnkuZ2V0VmFsdWUoKSk7Ci0JCi0JCS8vc2V0IG9yZGVyQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlPcmRlckJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgibmV3T3JkZXJCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JCU9yZGVyQnlBbm5vdGF0aW9uIG9yZGVyQnkgPSAoT3JkZXJCeUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvcmRlckJ5LmdldFZhbHVlKCkpOwotCQotCQkvL3NldCBtYXBwZWRCeSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTm9PcmRlcmluZygpICB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzTm9PcmRlcmluZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCi0JCS8vc2V0IG9yZGVyQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JCQotCQlPcmRlckJ5QW5ub3RhdGlvbiBvcmRlckJ5ID0gKE9yZGVyQnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJb3JkZXJCeS5zZXRWYWx1ZSgibmV3T3JkZXJCeSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JCi0JCS8vc2V0IG9yZGVyQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVBrT3JkZXJpbmcoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNQa09yZGVyaW5nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkKLQkJLy9zZXQgb3JkZXJCeSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNQa09yZGVyaW5nKCkpOwotCQkKLQkJT3JkZXJCeUFubm90YXRpb24gb3JkZXJCeSA9IChPcmRlckJ5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCW9yZGVyQnkuc2V0VmFsdWUoIm5ld09yZGVyQnkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNQa09yZGVyaW5nKCkpOwotCQotCQkvL3NldCBvcmRlckJ5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc1BrT3JkZXJpbmcoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDdXN0b21PcmRlcmluZygpICB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkKLQkJLy9zZXQgb3JkZXJCeSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNDdXN0b21PcmRlcmluZygpKTsKLQkJCi0JCU9yZGVyQnlBbm5vdGF0aW9uIG9yZGVyQnkgPSAoT3JkZXJCeUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlvcmRlckJ5LnNldFZhbHVlKCJuZXdPcmRlckJ5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNDdXN0b21PcmRlcmluZygpKTsKLQkKLQkJLy9zZXQgb3JkZXJCeSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNDdXN0b21PcmRlcmluZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0RW50aXR5Rm9yTWFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbXBsb3llZSgpOwotCQljcmVhdGVUZXN0RGVwYXJ0bWVudCgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkRlcGFydG1lbnQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5FbXBsb3llZSIpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlPbmVUb01hbnlNYXBwaW5nIGVtcGxveWVlc01hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkVtcGxveWVlIiwgZW1wbG95ZWVzTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNWVhOWYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb2xsZWN0aW9uT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSwgSlBBLklELCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbiBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNpemVkQ29sbGVjdGlvbk9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIENvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmVBbm5vdGF0aW9uID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lQW5ub3RhdGlvbi5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvT25lQW5ub3RhdGlvbi5zZXRUYXJnZXRFbnRpdHkoIm5ld1RhcmdldEVudGl0eSIpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb25lVG9PbmVBbm5vdGF0aW9uLmdldFRhcmdldEVudGl0eSgpKTsKLQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb09uZUFubm90YXRpb24uc2V0VGFyZ2V0RW50aXR5KG51bGwpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmVBbm5vdGF0aW9uLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgibmV3VGFyZ2V0RW50aXR5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneSBtYXBwZWRCeSA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKG1hcHBlZEJ5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCQkJCQotCQkvL3NldCBtYXBwZWRCeSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmUuc2V0TWFwcGVkQnkoIm5ld01hcHBlZEJ5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5IiwgbWFwcGVkQnkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQkKLQkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9PbmUuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG1hcHBlZEJ5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneSBtYXBwZWRCeSA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKG1hcHBlZEJ5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCQkJCQotCQkvL3NldCBtYXBwZWRCeUpvaW5pbmdTdHJhdGVneSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbWFwcGVkQnkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIm5ld1RhcmdldEVudGl0eSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hcHBlZEJ5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCQotCQkvL3NldCBtYXBwZWRCeUpvaW5pbmdTdHJhdGVneSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW1hcHBlZEJ5LnNldE1hcHBlZEJ5QXR0cmlidXRlKG51bGwpOwotCQlhc3NlcnROdWxsKG1hcHBlZEJ5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IG9wdGlvbmFsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb09uZS5zZXRPcHRpb25hbChCb29sZWFuLlRSVUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkKLQkJb25lVG9PbmUuc2V0T3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb25lVG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0KLQkJCi0JCS8vc2V0IG9wdGlvbmFsIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvT25lLnNldE9wdGlvbmFsKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IG9wdGlvbmFsIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9uZVRvT25lLmdldE9wdGlvbmFsKCkpOwotCi0JCQotCQkvL3NldCBvcHRpb25hbCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb09uZS5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuRUFHRVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb09uZS5nZXRGZXRjaCgpKTsKLQkJCi0JCW9uZVRvT25lLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkxBWlksIG9uZVRvT25lLmdldEZldGNoKCkpOwotCQkKLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9PbmUuc2V0RmV0Y2gobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRGZXRjaCgpKTsKLQkJCQkKLQkJLy9zZXQgZmV0Y2ggaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuRUFHRVIsIG9uZVRvT25lLmdldEZldGNoKCkpOwotCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZLCBvbmVUb09uZS5nZXRGZXRjaCgpKTsKLQkJCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCi0JCWpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEpvaW5Db2x1bW5zID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0Sm9pbigpIHsKLQkJLy9UT0RPCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlqb2luQ29sdW1ucy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1uc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5Db2x1bW5zLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luQ29sdW1ucy5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgam9pbkNvbHVtbnMuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCi0JCWpvaW5Db2x1bW5zLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW5zLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luQ29sdW1ucy5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQkvL2lmIG5vbi1vd25pbmcgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIHRoZW4gbm8gZGVmYXVsdCBqb2luIGNvbHVtbgotCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5Db2x1bW5zLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqb2luQ29sdW1uc0l0ZXJhdG9yID0gCi0JCQlyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGpvaW5Db2x1bW5zSXRlcmF0b3IgPSAKLQkJCXJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkpPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQotCQlqb2luQ29sdW1ucy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDEpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqb2luQ29sdW1uUmVzb3VyY2VzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zSXRlcmF0b3IgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkKLQkJCi0JCWpvaW5Db2x1bW5zLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW5SZXNvdXJjZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJam9pbkNvbHVtbnNJdGVyYXRvciA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJCi0JCWpvaW5Db2x1bW5zLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW5SZXNvdXJjZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhSm9pbkNvbHVtbnMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFKb2luQ29sdW1ucykpOwotCQkKLQkJCi0JCWpvaW5Db2x1bW5zLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQlqYXZhSm9pbkNvbHVtbnMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQotCi0JCWpvaW5Db2x1bW5zLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDAsIDEpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJamF2YUpvaW5Db2x1bW5zID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCSgoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKS5zZXROYW1lKCJGT08iKTsKLQkJKChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQS5KT0lOX0NPTFVNTikpLnNldE5hbWUoIkJBUiIpOwotCQkoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMiwgSlBBLkpPSU5fQ09MVU1OKSkuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkJCi0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gam9pbkNvbHVtbnNJdGVyYXRvciA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigyLCAwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnNJdGVyYXRvciA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDAsIDEsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnNJdGVyYXRvciA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnNJdGVyYXRvciA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbklzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlhc3NlcnRUcnVlKGpvaW5Db2x1bW5zLmdldERlZmF1bHRKb2luQ29sdW1uKCkuaXNWaXJ0dWFsKCkpOwotCi0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCUpvaW5Db2x1bW4gc3BlY2lmaWVkSm9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW4uaXNWaXJ0dWFsKCkpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1ucy5nZXREZWZhdWx0Sm9pbkNvbHVtbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gb25lVG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnROdWxsKHN0YXRlRm9vTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCS8vdGFyZ2V0RW50aXR5IG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCwgZGVmYXVsdCBzdGlsbCBzZXQsIGhhbmRsZWQgYnkgdmFsaWRhdGlvbgotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgb25lVG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQkvL2FkZCB0YXJnZXRFbnRpdHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBvbmVUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQotCQkvL3Rlc3QgZGVmYXVsdCBzdGlsbCB0aGUgc2FtZSB3aGVuIHNwZWNpZmllZCB0YXJnZXQgZW50aXR5IGl0IHNldAotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG9uZVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBhZGRyZXNzQ2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gYWRkcmVzc0NsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCi0JCS8vdGVzdCB0YXJnZXQgaXMgbm90IGFuIEVudGl0eSwgZGVmYXVsdCB0YXJnZXQgZW50aXR5IHN0aWxsIGV4aXN0cywgdGhpcyBjYXNlIGhhbmRsZWQgd2l0aCB2YWxpZGF0aW9uCi0JCWFkZHJlc3NQZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBvbmVUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRFbnRpdHlDb2xsZWN0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbGxlY3Rpb25PbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKG9uZVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRhcmdldEVudGl0eUdlbmVyaWNpemVkQ29sbGVjdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljaXplZENvbGxlY3Rpb25PbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKG9uZVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgb25lVG9PbmVNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb09uZU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG9uZVRvT25lTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJLy90YXJnZXRFbnRpdHkgbm90IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJLy9hZGQgdGFyZ2V0RW50aXR5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LCBub3cgdGFyZ2V0IGVudGl0eSBzaG91bGQgcmVzb2x2ZQotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBhZGRyZXNzQ2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQlUeXBlTWFwcGluZyBhZGRyZXNzVHlwZU1hcHBpbmcgPSBhZGRyZXNzQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoYWRkcmVzc1R5cGVNYXBwaW5nLCBvbmVUb09uZU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0KLQkJLy90ZXN0IGRlZmF1bHQgc3RpbGwgdGhlIHNhbWUgd2hlbiBzcGVjaWZpZWQgdGFyZ2V0IGVudGl0eSBpdCBzZXQKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscyhhZGRyZXNzVHlwZU1hcHBpbmcsIG9uZVRvT25lTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpKTsKLQkJCi0KLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGFkZHJlc3NUeXBlTWFwcGluZywgb25lVG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgc3RyYXRlZ3kgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCUl0ZXJhdG9yPD8gZXh0ZW5kcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gc3RyYXRlZ3kuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWpvaW5Db2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCi0JCWpvaW5Db2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gc3RyYXRlZ3kuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5ID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHN0cmF0ZWd5LmdldFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlzdHJhdGVneS5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHN0cmF0ZWd5LmdldFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlzdHJhdGVneS5yZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHN0cmF0ZWd5LmdldFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgc3RyYXRlZ3kgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlzdHJhdGVneS5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJc3RyYXRlZ3kuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCXN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFByaW1hcnlLZXlKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5ID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJc3RyYXRlZ3kuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlzdHJhdGVneS5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gam9pbkNvbHVtbnMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5ID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJc3RyYXRlZ3kuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlzdHJhdGVneS5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0KLQkJc3RyYXRlZ3kucmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oMSk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGpvaW5Db2x1bW5SZXNvdXJjZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPD8gZXh0ZW5kcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCQotCQlzdHJhdGVneS5yZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtblJlc291cmNlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJam9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCQotCQlzdHJhdGVneS5yZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtblJlc291cmNlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCWpvaW5Db2x1bW5zID0gc3RyYXRlZ3kuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5ID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJc3RyYXRlZ3kuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlzdHJhdGVneS5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFKb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUpvaW5Db2x1bW5zKSk7Ci0JCQotCQkKLQkJc3RyYXRlZ3kubW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWphdmFKb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCi0KLQkJc3RyYXRlZ3kubW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDAsIDEpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWphdmFKb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgc3RyYXRlZ3kgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQkoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpLnNldE5hbWUoIkZPTyIpOwotCQkoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpLnNldE5hbWUoIkJBUiIpOwotCQkoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDIsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDIsIDAsIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDAsIDEsIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMSwgIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigxLCAgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gc3RyYXRlZ3kuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCAgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gc3RyYXRlZ3kuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBtYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9uZVRvT25lUmVsYXRpb25zaGlwIHJlbCA9IG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgbWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPbmVUb09uZVJlbGF0aW9uc2hpcCByZWwgPSBtYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCWFubm90YXRpb24uc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjI5MGY4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUUgPSAiTVlfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fREVGSU5JVElPTiA9ICJNWV9DT0xVTU5fREVGSU5JVElPTiI7Ci0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiIiArIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQkKLQlwdWJsaWMgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fTkFNRSwgc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHBrSm9pbkNvbHVtblJlc291cmNlID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJCi0JCXBrSm9pbkNvbHVtblJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE5hbWVOb1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uID0gZ2V0SmF2YUVudGl0eSgpLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgcGtKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQkKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJLy9yZW1vdmUgQElkIGFubm90YXRpb24KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBpZEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlpZEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQotCQlhc3NlcnROdWxsKHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUUsIHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbkFubm90YXRpb24gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb2x1bW5Bbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCQotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJY29sdW1uQW5ub3RhdGlvbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWFzc2VydE51bGwoY29sdW1uQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKENPTFVNTl9ERUZJTklUSU9OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX0RFRklOSVRJT04sIHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oImZvbyIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwa0pvaW5Db2x1bW5SZXNvdXJjZSA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCQotCQlwa0pvaW5Db2x1bW5SZXNvdXJjZS5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lTm9TcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA9IGdldEphdmFFbnRpdHkoKS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHBrSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQkKLQkJLy9yZW1vdmUgQElkIGFubm90YXRpb24KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBpZEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlpZEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQotCQlhc3NlcnROdWxsKHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHBrSm9pbkNvbHVtblJlc291cmNlID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJCi0JCXBrSm9pbkNvbHVtblJlc291cmNlLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbkFubm90YXRpb24gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb2x1bW5Bbm5vdGF0aW9uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWNvbHVtbkFubm90YXRpb24gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlhc3NlcnROdWxsKGNvbHVtbkFubm90YXRpb24uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbi5pc1ZpcnR1YWwoKSk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWdldEphdmFFbnRpdHkoKS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhRW50aXR5KCkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkuaXNWaXJ0dWFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNSZWZlcmVuY2VkQ29sdW1uUmVzb2x2ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKCgoQm9vbGVhbikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2Qoc3BlY2lmaWVkUGtKb2luQ29sdW1uLCAicmVmZXJlbmNlZENvbHVtbklzUmVzb2x2ZWQiKSkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGJDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbi5pc1Jlc29sdmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGJSZWZlcmVuY2VkQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZSgoKEJvb2xlYW4pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKHNwZWNpZmllZFBrSm9pbkNvbHVtbiwgInJlZmVyZW5jZWRDb2x1bW5Jc1Jlc29sdmVkIikpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERiVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldERiVGFibGUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFRdWVyeUhpbnRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhUXVlcnlIaW50VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQxYmE3MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFRdWVyeUhpbnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUXVlcnlIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5RdWVyeUhpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhUXVlcnlIaW50VGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9OQU1FID0gIlFVRVJZX05BTUUiOwotCQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTkFNRURfUVVFUlksIEpQQS5RVUVSWV9ISU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZFF1ZXJ5KG5hbWU9XCIiICsgUVVFUllfTkFNRSArICJcIiwgaGludHM9QFF1ZXJ5SGludCgpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQotCQkKLQlwdWJsaWMgSmF2YVF1ZXJ5SGludFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlRdWVyeUhpbnQgcXVlcnlIaW50ID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0SGludHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBxdWVyeUFubm90YXRpb24gPSAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJUXVlcnlIaW50QW5ub3RhdGlvbiBxdWVyeUhpbnRBbm5vdGF0aW9uID0gcXVlcnlBbm5vdGF0aW9uLmdldEhpbnRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKHF1ZXJ5SGludEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChxdWVyeUhpbnQuZ2V0TmFtZSgpKTsKLQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlxdWVyeUhpbnRBbm5vdGF0aW9uLnNldE5hbWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBxdWVyeUhpbnRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcXVlcnlIaW50LmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXF1ZXJ5SGludEFubm90YXRpb24uc2V0TmFtZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocXVlcnlIaW50LmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWRRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRIaW50cygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIHF1ZXJ5QW5ub3RhdGlvbiA9ICgoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlRdWVyeUhpbnRBbm5vdGF0aW9uIHF1ZXJ5SGludEFubm90YXRpb24gPSBxdWVyeUFubm90YXRpb24uZ2V0SGludHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwocXVlcnlIaW50QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHF1ZXJ5SGludC5nZXROYW1lKCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCXF1ZXJ5SGludC5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBxdWVyeUhpbnRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcXVlcnlIaW50LmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcXVlcnlIaW50LnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwocXVlcnlIaW50QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHF1ZXJ5SGludC5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZFF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJUXVlcnlIaW50IHF1ZXJ5SGludCA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldEhpbnRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gcXVlcnlBbm5vdGF0aW9uID0gKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCVF1ZXJ5SGludEFubm90YXRpb24gcXVlcnlIaW50QW5ub3RhdGlvbiA9IHF1ZXJ5QW5ub3RhdGlvbi5nZXRIaW50cygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChxdWVyeUhpbnRBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHF1ZXJ5SGludC5nZXRWYWx1ZSgpKTsKLQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlxdWVyeUhpbnRBbm5vdGF0aW9uLnNldFZhbHVlKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcXVlcnlIaW50QW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBxdWVyeUhpbnQuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXF1ZXJ5SGludEFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHF1ZXJ5SGludC5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWRRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRIaW50cygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIHF1ZXJ5QW5ub3RhdGlvbiA9ICgoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlRdWVyeUhpbnRBbm5vdGF0aW9uIHF1ZXJ5SGludEFubm90YXRpb24gPSBxdWVyeUFubm90YXRpb24uZ2V0SGludHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwocXVlcnlIaW50QW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChxdWVyeUhpbnQuZ2V0VmFsdWUoKSk7Ci0KLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJcXVlcnlIaW50LnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBxdWVyeUhpbnRBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHF1ZXJ5SGludC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlxdWVyeUhpbnQuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwocXVlcnlIaW50QW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChxdWVyeUhpbnQuZ2V0VmFsdWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhU2Vjb25kYXJ5VGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhU2Vjb25kYXJ5VGFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmNlNmJhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVNlY29uZGFyeVRhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEphdmFTZWNvbmRhcnlUYWJsZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJNWV9UQUJMRSI7Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZShuYW1lPVwiIiArIFRBQkxFX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lPVwiZm9vXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZT1cImJhclwiKX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCi0KLQkJCi0JcHVibGljIEphdmFTZWNvbmRhcnlUYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCBzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoVEFCTEVfTkFNRSwgc2Vjb25kYXJ5VGFibGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgdGFibGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUZyb21TcGVjaWZpZWROYW1lQ2hhbmdlSW5SZXNvdXJjZU1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJdGFibGUuc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBnZXRKYXZhRW50aXR5KCkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUZyb21TcGVjaWZpZWRDYXRhbG9nQ2hhbmdlSW5SZXNvdXJjZU1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBzZWNvbmRhcnlUYWJsZVJlc291cmNlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuU0VDT05EQVJZX1RBQkxFKS5pdGVyYXRvcigpOwotCQkoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMubmV4dCgpKS5zZXRDYXRhbG9nKCJmb28iKTsKLQkJKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHNlY29uZGFyeVRhYmxlUmVzb3VyY2VzLm5leHQoKSkuc2V0Q2F0YWxvZygiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VHNibGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc2Vjb25kYXJ5VHNibGVzLm5leHQoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHNlY29uZGFyeVRzYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUZyb21TcGVjaWZpZWRTY2hlbWFDaGFuZ2VJblJlc291cmNlTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZXMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IHNlY29uZGFyeVRhYmxlUmVzb3VyY2VzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5TRUNPTkRBUllfVEFCTEUpLml0ZXJhdG9yKCk7Ci0JCSgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZVJlc291cmNlcy5uZXh0KCkpLnNldFNjaGVtYSgiZm9vIik7Ci0JCSgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZVJlc291cmNlcy5uZXh0KCkpLnNldFNjaGVtYSgiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VHNibGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc2Vjb25kYXJ5VHNibGVzLm5leHQoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgc2Vjb25kYXJ5VHNibGVzLm5leHQoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkKLQkJdGFibGUuc2V0Q2F0YWxvZygibXlDYXRhbG9nIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteUNhdGFsb2ciLCBnZXRKYXZhRW50aXR5KCkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNhdGFsb2ciLCBnZXRKYXZhRW50aXR5KCkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJteUNhdGFsb2ciKTsKLQkJCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlTZWNvbmRhcnlUYWJsZSB0YWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJdGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZygibXlDYXRhbG9nIik7Ci0JCXRhYmxlLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGVBbm5vdGF0aW9uID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWFzc2VydEVxdWFscygibXlDYXRhbG9nIiwgdGFibGVBbm5vdGF0aW9uLmdldENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZVJlc291cmNlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQotCQl0YWJsZVJlc291cmNlLnNldFNjaGVtYSgibXlTY2hlbWEiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm15U2NoZW1hIiwgZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVNjaGVtYSIsIGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpLnNldFNwZWNpZmllZFNjaGVtYSgibXlTY2hlbWEiKTsKLQkJCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJU2Vjb25kYXJ5VGFibGUgdGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgibXlTY2hlbWEiKTsKLQkJdGFibGUuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZUFubm90YXRpb24gPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVNjaGVtYSIsIHRhYmxlQW5ub3RhdGlvbi5nZXRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcGtKb2luQ29sdW1uID0gdGFibGVSZXNvdXJjZS5hZGRQa0pvaW5Db2x1bW4oMCk7Ci0JCXBrSm9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXBrSm9pbkNvbHVtbiA9IHRhYmxlUmVzb3VyY2UuYWRkUGtKb2luQ29sdW1uKDApOwotCQlwa0pvaW5Db2x1bW4uc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXRhYmxlUmVzb3VyY2UubW92ZVBrSm9pbkNvbHVtbigxLCAwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJdGFibGVSZXNvdXJjZS5yZW1vdmVQa0pvaW5Db2x1bW4oMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJdGFibGVSZXNvdXJjZS5yZW1vdmVQa0pvaW5Db2x1bW4oMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JCi0JCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCS8vanVzdCB0aGUgZGVmYXVsdCBwa0pvaW5Db2x1bW4sIHNvIDEKLQkJYXNzZXJ0RXF1YWxzKDEsIHNlY29uZGFyeVRhYmxlLmdldFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JCi0JCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQkvL29ubHkgdGhlIHNwZWNpZmllZCBwa0pvaW5Db2x1bW5zLCAzCi0JCWFzc2VydEVxdWFscygzLCBzZWNvbmRhcnlUYWJsZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROb3ROdWxsKHNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydE51bGwoc2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uIGRlZmF1bHRQa0pvaW5Db2x1bW4gPSBzZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsgCi0JCWFzc2VydE5vdE51bGwoZGVmYXVsdFBrSm9pbkNvbHVtbik7CQotCQlhc3NlcnRFcXVhbHMoImlkIiwgZGVmYXVsdFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGRlZmF1bHRQa0pvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhRW50aXR5KCkuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRQa0pvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZGVmYXVsdFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGRlZmF1bHRQa0pvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBkZWZhdWx0UGtKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gc3BlY2lmaWVkUGtKb2luQ29sdW1ucyA9IHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZVJlc291cmNlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCUl0ZXJhdG9yPFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4gcGtKb2luQ29sdW1ucyA9IHRhYmxlUmVzb3VyY2UuZ2V0UGtKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlJdGVyYXRvcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IHBrSm9pbkNvbHVtbnMgPSB0YWJsZVJlc291cmNlLmdldFBrSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZVJlc291cmNlLmdldFBrSm9pbkNvbHVtbnNTaXplKCkpOwotCi0JCXNlY29uZGFyeVRhYmxlLnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpOwotCQkKLQkJSXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBwa0pvaW5Db2x1bW5SZXNvdXJjZXMgPSB0YWJsZVJlc291cmNlLmdldFBrSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHBrSm9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHBrSm9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IHBrSm9pbkNvbHVtbnMgPSBzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCQotCQlzZWNvbmRhcnlUYWJsZS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKTsKLQkJcGtKb2luQ29sdW1uUmVzb3VyY2VzID0gdGFibGVSZXNvdXJjZS5nZXRQa0pvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwa0pvaW5Db2x1bW5SZXNvdXJjZXMubmV4dCgpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJcGtKb2luQ29sdW1ucyA9IHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCQotCQlzZWNvbmRhcnlUYWJsZS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJcGtKb2luQ29sdW1uUmVzb3VyY2VzID0gdGFibGVSZXNvdXJjZS5nZXRQa0pvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCXBrSm9pbkNvbHVtbnMgPSBzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShwa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlUmVzb3VyY2UuZ2V0UGtKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gc3BlY2lmaWVkUGtKb2luQ29sdW1ucyA9IHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJSXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBwa0pvaW5Db2x1bW5zID0gdGFibGVSZXNvdXJjZS5nZXRQa0pvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgcGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJCi0JCXNlY29uZGFyeVRhYmxlLm1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyLCAwKTsKLQkJcGtKb2luQ29sdW1ucyA9IHRhYmxlUmVzb3VyY2UuZ2V0UGtKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByaW1hcnlLZXlKb2luQ29sdW1uR2V0RGVmYXVsdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBkZWZhdWx0UGtKb2luQ29sdW1uID0gc2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBkZWZhdWx0UGtKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCi0JCQotCQkvL3JlbW92ZSBASWQgYW5ub3RhdGlvbgotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGlkQXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWlkQXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCWFzc2VydE51bGwoZGVmYXVsdFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFByaW1hcnlLZXlKb2luQ29sdW1uR2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gZGVmYXVsdFBrSm9pbkNvbHVtbiA9IHNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgZGVmYXVsdFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQkvL3JlbW92ZSBASWQgYW5ub3RhdGlvbgotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGlkQXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWlkQXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCWFzc2VydE51bGwoZGVmYXVsdFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbklzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydFRydWUoc2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkuaXNWaXJ0dWFsKCkpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW4uaXNWaXJ0dWFsKCkpOwotCQkKLQkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24gPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiZm9vIik7Ci0JCXNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsICBzZWNvbmRhcnlUYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlzZWNvbmRhcnlUYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJmb28iKTsKLQkJc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiYmFyIik7Ci0JCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsICBzZWNvbmRhcnlUYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludHMgPSBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24gPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCi0JCXNlY29uZGFyeVRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCQotCQlzZWNvbmRhcnlUYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50cyA9IHNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJc2Vjb25kYXJ5VGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24gPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJCi0JCXNlY29uZGFyeVRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQotCi0JCXNlY29uZGFyeVRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQotCQlzZWNvbmRhcnlUYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgiQkFSIik7Ci0JCXNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQlzZWNvbmRhcnlUYWJsZUFubm90YXRpb24ubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQlzZWNvbmRhcnlUYWJsZUFubm90YXRpb24ucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBzZWNvbmRhcnlUYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhU2VxdWVuY2VHZW5lcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhU2VxdWVuY2VHZW5lcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjQ5NWQ3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVNlcXVlbmNlR2VuZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhU2VxdWVuY2VHZW5lcmF0b3JUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUVVFTkNFX0dFTkVSQVRPUl9OQU1FID0gIk1ZX1NFUVVFTkNFX0dFTkVSQVRPUiI7Ci0JCi0KLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuU0VRVUVOQ0VfR0VORVJBVE9SLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAU2VxdWVuY2VHZW5lcmF0b3IobmFtZT1cIiIgKyBTRVFVRU5DRV9HRU5FUkFUT1JfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQkKLQlwdWJsaWMgSmF2YVNlcXVlbmNlR2VuZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoU0VRVUVOQ0VfR0VORVJBVE9SX05BTUUsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldE5hbWUoKSk7Ci0KLQkJLy9jaGFuZ2UgcmVzb3VyY2UgbW9kZWwgc2VxdWVuY2VHZW5lcmF0b3IgbmFtZSwgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKFNFUVVFTkNFX0dFTkVSQVRPUl9OQU1FLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXROYW1lKCkpOwotCi0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW5pdGlhbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFNlcXVlbmNlR2VuZXJhdG9yLkRFRkFVTFRfSU5JVElBTF9WQUxVRSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7CQotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0SW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZig4MikpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg4MiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgyKSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEluaXRpYWxWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoU2VxdWVuY2VHZW5lcmF0b3IuREVGQVVMVF9JTklUSUFMX1ZBTFVFLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXREZWZhdWx0SW5pdGlhbFZhbHVlKCkpOwotCQkKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZig4MikpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFNlcXVlbmNlR2VuZXJhdG9yLkRFRkFVTFRfSU5JVElBTF9WQUxVRSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdEluaXRpYWxWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4MiksIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZigyMCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIGdlbmVyYXRvckFubm90YXRpb24gPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7CQotCQkKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyMCksIGdlbmVyYXRvckFubm90YXRpb24uZ2V0SW5pdGlhbFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsb2NhdGlvblNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoR2VuZXJhdG9yLkRFRkFVTFRfQUxMT0NBVElPTl9TSVpFLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7CQotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDIwKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIwLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyMCksIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhHZW5lcmF0b3IuREVGQVVMVF9BTExPQ0FUSU9OX1NJWkUsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKEludGVnZXIudmFsdWVPZigyMCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEdlbmVyYXRvci5ERUZBVUxUX0FMTE9DQVRJT05fU0laRSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDIwKSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDI1KSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gZ2VuZXJhdG9yQW5ub3RhdGlvbiA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsJCi0JCQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDI1KSwgZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQl9Ci0JCi0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2VxdWVuY2VOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRTZXF1ZW5jZU5hbWUoKSk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsJCi0JCQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTZXF1ZW5jZU5hbWUoIm15U2VxdWVuY2VOYW1lIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteVNlcXVlbmNlTmFtZSIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldFNlcXVlbmNlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVNlcXVlbmNlTmFtZSIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRTZXF1ZW5jZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXREZWZhdWx0U2VxdWVuY2VOYW1lKCkpOwotCQkKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCJteVNlcXVlbmNlTmFtZSIpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXREZWZhdWx0U2VxdWVuY2VOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U2VxdWVuY2VOYW1lIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoIm15U2VxdWVuY2VOYW1lIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gZ2VuZXJhdG9yQW5ub3RhdGlvbiA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsJCi0JCQotCQlhc3NlcnRFcXVhbHMoIm15U2VxdWVuY2VOYW1lIiwgZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRTZXF1ZW5jZU5hbWUoKSk7Ci0JCQotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXROYW1lKG51bGwpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUobnVsbCk7Ci0JCWdlbmVyYXRvckFubm90YXRpb24gPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWFzc2VydE51bGwoZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVGFibGVHZW5lcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVGFibGVHZW5lcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzY5MjlhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVRhYmxlR2VuZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmF2YVRhYmxlR2VuZXJhdG9yVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9HRU5FUkFUT1JfTkFNRSA9ICJNWV9UQUJMRV9HRU5FUkFUT1IiOwotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5UQUJMRV9HRU5FUkFUT1IsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZUdlbmVyYXRvcihuYW1lPVwiIiArIFRBQkxFX0dFTkVSQVRPUl9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCQotCXB1YmxpYyBKYXZhVGFibGVHZW5lcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhUQUJMRV9HRU5FUkFUT1JfTkFNRSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0TmFtZSgpKTsKLQotCQkvL2NoYW5nZSByZXNvdXJjZSBtb2RlbCB0YWJsZUdlbmVyYXRvciBuYW1lLCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoVEFCTEVfR0VORVJBVE9SX05BTUUsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldE5hbWUoKSk7Ci0KLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0TmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRhYmxlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRDYXRhbG9nKCkpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQkKLQkJdGFibGVHZW5lcmF0b3Iuc2V0Q2F0YWxvZygibXlDYXRhbG9nIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteUNhdGFsb2ciLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q2F0YWxvZyIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygibXlDYXRhbG9nIik7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q2F0YWxvZyIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJteUNhdGFsb2ciKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiBnZW5lcmF0b3JBbm5vdGF0aW9uID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCWFzc2VydEVxdWFscygibXlDYXRhbG9nIiwgZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRDYXRhbG9nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNjaGVtYSgpKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFNjaGVtYSgibXlTY2hlbWEiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm15U2NoZW1hIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U2NoZW1hIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIm15U2NoZW1hIik7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTY2hlbWEiLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hRnJvbVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0KLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpICBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZFNjaGVtYSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZFNjaGVtYSgiWE1MX1NDSEVNQSIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVQZXJzaXN0ZW50VHlwZSgwKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCS8vZGVmYXVsdCBzY2hlbWEgdGFrZW4gZnJvbSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIG5vdCBlbnRpdHktbWFwcGluZ3Mgc2luY2UgdGhlIGVudGl0eSBpcyBub3QgaW4gYW4gb3JtLnhtbCBmaWxlCi0JCWFzc2VydEVxdWFscygiRk9PIiwgKChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFNjaGVtYSgibXlTY2hlbWEiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiBnZW5lcmF0b3JBbm5vdGF0aW9uID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCWFzc2VydEVxdWFscygibXlTY2hlbWEiLCBnZW5lcmF0b3JBbm5vdGF0aW9uLmdldFNjaGVtYSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFBrQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0UGtDb2x1bW5OYW1lKCkpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQkKLQkJdGFibGVHZW5lcmF0b3Iuc2V0UGtDb2x1bW5OYW1lKCJteVBrQ29sdW1uTmFtZSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlQa0NvbHVtbk5hbWUiLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRQa0NvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlQa0NvbHVtbk5hbWUiLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0UGtDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFBrQ29sdW1uTmFtZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgibXlQa0NvbHVtbk5hbWUiKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFBrQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVBrQ29sdW1uTmFtZSIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKCJteVBrQ29sdW1uTmFtZSIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIGdlbmVyYXRvckFubm90YXRpb24gPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteVBrQ29sdW1uTmFtZSIsIGdlbmVyYXRvckFubm90YXRpb24uZ2V0UGtDb2x1bW5OYW1lKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0VmFsdWVDb2x1bW5OYW1lKCkpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQkKLQkJdGFibGVHZW5lcmF0b3Iuc2V0VmFsdWVDb2x1bW5OYW1lKCJteVZhbHVlQ29sdW1uTmFtZSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlWYWx1ZUNvbHVtbk5hbWUiLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlWYWx1ZUNvbHVtbk5hbWUiLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0VmFsdWVDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFZhbHVlQ29sdW1uTmFtZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgibXlWYWx1ZUNvbHVtbk5hbWUiKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFZhbHVlQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVZhbHVlQ29sdW1uTmFtZSIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCJteVZhbHVlQ29sdW1uTmFtZSIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIGdlbmVyYXRvckFubm90YXRpb24gPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteVZhbHVlQ29sdW1uTmFtZSIsIGdlbmVyYXRvckFubm90YXRpb24uZ2V0VmFsdWVDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UGtDb2x1bW5WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFBrQ29sdW1uVmFsdWUoIm15UGtDb2x1bW5WYWx1ZSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlQa0NvbHVtblZhbHVlIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVBrQ29sdW1uVmFsdWUiLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFBrQ29sdW1uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0UGtDb2x1bW5WYWx1ZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoIm15UGtDb2x1bW5WYWx1ZSIpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0UGtDb2x1bW5WYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVBrQ29sdW1uVmFsdWUiLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgibXlQa0NvbHVtblZhbHVlIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gZ2VuZXJhdG9yQW5ub3RhdGlvbiA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsJCi0JCQotCQlhc3NlcnRFcXVhbHMoIm15UGtDb2x1bW5WYWx1ZSIsIGdlbmVyYXRvckFubm90YXRpb24uZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEluaXRpYWxWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUYWJsZUdlbmVyYXRvci5ERUZBVUxUX0lOSVRJQUxfVkFMVUUsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldEluaXRpYWxWYWx1ZSgpKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoODIpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoODIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldEluaXRpYWxWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4MiksIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfSU5JVElBTF9WQUxVRSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdEluaXRpYWxWYWx1ZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoODIpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUYWJsZUdlbmVyYXRvci5ERUZBVUxUX0lOSVRJQUxfVkFMVUUsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRJbml0aWFsVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODIpLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoMjApKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiBnZW5lcmF0b3JBbm5vdGF0aW9uID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjApLCBnZW5lcmF0b3JBbm5vdGF0aW9uLmdldEluaXRpYWxWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEdlbmVyYXRvci5ERUZBVUxUX0FMTE9DQVRJT05fU0laRSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldEFsbG9jYXRpb25TaXplKEludGVnZXIudmFsdWVPZigyMCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygyMCwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjApLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoR2VuZXJhdG9yLkRFRkFVTFRfQUxMT0NBVElPTl9TSVpFLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0QWxsb2NhdGlvblNpemUoKSk7Ci0JCQotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoMjApKTsKLQkJCi0JCWFzc2VydEVxdWFscyhHZW5lcmF0b3IuREVGQVVMVF9BTExPQ0FUSU9OX1NJWkUsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyMCksIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKEludGVnZXIudmFsdWVPZigyNSkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIGdlbmVyYXRvckFubm90YXRpb24gPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQkKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyNSksIGdlbmVyYXRvckFubm90YXRpb24uZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPShKYXZhVGFibGVHZW5lcmF0b3IpICgoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCk7Ci0KLQkJSXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvckFubm90YXRpb24gPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQl0YWJsZUdlbmVyYXRvckFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJmb28iKTsKLQkJdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9ICgoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsICB0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsJCi0JCXRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImZvbyIpOwotCQl0YWJsZUdlbmVyYXRvckFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJiYXIiKTsKLQkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgIHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSAoKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsJCi0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvckFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9ICgoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCk7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSAoKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsJCi0JCQotCQlhc3NlcnRFcXVhbHMoMywgdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQotCQl0YWJsZUdlbmVyYXRvci5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSB0YWJsZUdlbmVyYXRvckFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCQotCQl0YWJsZUdlbmVyYXRvci5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSB0YWJsZUdlbmVyYXRvckFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJdGFibGVHZW5lcmF0b3IucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gKChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKTsKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvckFubm90YXRpb24gPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JCQotCQkKLQkJdGFibGVHZW5lcmF0b3IubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCUl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQotCi0JCXRhYmxlR2VuZXJhdG9yLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSB0YWJsZUdlbmVyYXRvckFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9ICgoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvckFubm90YXRpb24gPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQotCQl0YWJsZUdlbmVyYXRvckFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgiQkFSIik7Ci0JCXRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCUl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQl0YWJsZUdlbmVyYXRvckFubm90YXRpb24ucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFUYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFUYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNTY5MTUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVGFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEphdmFUYWJsZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJNWV9UQUJMRSI7Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlRBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZShuYW1lPVwiIiArIFRBQkxFX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgbmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVBYnN0cmFjdFRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JTkhFUklUQU5DRSwgSlBBLklOSEVSSVRBTkNFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoImFic3RyYWN0Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQkKLQlwdWJsaWMgSmF2YVRhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0TmFtZVNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJLy90ZXN0IHRoYXQgc2V0dGluZyB0aGUgamF2YSBlbnRpdHkgbmFtZSB3aWxsIGNoYW5nZSB0aGUgdGFibGUgZGVmYXVsdCBuYW1lCi0JCWdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHROYW1lU2luZ2xlVGFibGVJbmhlcml0YW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlFbnRpdHkgY2hpbGRFbnRpdHkgPSAoRW50aXR5KSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRW50aXR5IHJvb3RFbnRpdHkgPSAoRW50aXR5KSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE5vdFNhbWUoZ2V0SmF2YUVudGl0eSgpLCByb290RW50aXR5KTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgY2hpbGRFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgcm9vdEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJLy90ZXN0IHRoYXQgc2V0dGluZyB0aGUgcm9vdCBqYXZhIGVudGl0eSBuYW1lIHdpbGwgY2hhbmdlIHRoZSB0YWJsZSBkZWZhdWx0IG5hbWUgb2YgdGhlIGNoaWxkCi0JCXJvb3RFbnRpdHkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY2hpbGRFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFNjaGVtYUZyb21QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCi0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IG9ybUVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJYTUxfU0NIRU1BIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVQZXJzaXN0ZW50VHlwZSgwKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCS8vZGVmYXVsdCBzY2hlbWEgdGFrZW4gZnJvbSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIG5vdCBlbnRpdHktbWFwcGluZ3Mgc2luY2UgdGhlIGVudGl0eSBpcyBub3QgaW4gYW4gb3JtLnhtbCBmaWxlCi0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQotCQlJRmlsZSBmaWxlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKS5nZXRGaWxlKCk7Ci0JCS8vcmVtb3ZlIHRoZSBtYXBwaW5nIGZpbGUgcmVmZXJlbmNlIGZyb20gdGhlIHBlcnNpc3RlbmNlLnhtbC4gIGRlZmF1bHQgc2NoZW1hIAotCQkvL3Nob3VsZCBzdGlsbCBjb21lIGZyb20gcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBiZWNhdXNlIG9mIGltcGxpZWQgbWFwcGVkLWZpbGUtcmVmCi0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLnJlbW92ZShtYXBwaW5nRmlsZVJlZik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkKLQkJZmlsZS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWVTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0YWJsZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkTmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkKLQkJYXNzZXJ0TnVsbCh0YWJsZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVGcm9tU3BlY2lmaWVkTmFtZUNoYW5nZUluUmVzb3VyY2VNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJdGFibGUuc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCQotCQl0YWJsZS5zZXRDYXRhbG9nKCJteUNhdGFsb2ciKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm15Q2F0YWxvZyIsIGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygibXlDYXRhbG9nIiwgZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygibXlDYXRhbG9nIik7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdENhdGFsb2dGcm9tUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSBvcm1FbnRpdHkuZ2V0SmF2YVR5cGVNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZENhdGFsb2coIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiWE1MX0NBVEFMT0ciKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqYXZhRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVQZXJzaXN0ZW50VHlwZSgwKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCS8vZGVmYXVsdCBjYXRhbG9nIHRha2VuIGZyb20gcGVyc2lzdGVuY2UtdW5pdGUtZGVmYXVsdHMgbm90IGVudGl0eS1tYXBwaW5ncyBzaW5jZSB0aGUgZW50aXR5IGlzIG5vdCBpbiBhbiBvcm0ueG1sIGZpbGUKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQotCQlJRmlsZSBmaWxlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKS5nZXRGaWxlKCk7Ci0JCS8vcmVtb3ZlIHRoZSBtYXBwaW5nIGZpbGUgcmVmZXJlbmNlIGZyb20gdGhlIHBlcnNpc3RlbmNlLnhtbC4gIGRlZmF1bHQgc2NoZW1hIAotCQkvL3Nob3VsZCBzdGlsbCBjb21lIGZyb20gcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBiZWNhdXNlIG9mIGltcGxpZWQgbWFwcGVkLWZpbGUtcmVmCi0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLnJlbW92ZShtYXBwaW5nRmlsZVJlZik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCi0JCWZpbGUuZGVsZXRlKHRydWUsIG51bGwpOwotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVRhYmxlIHRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coIm15Q2F0YWxvZyIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlUmVzb3VyY2UgPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteUNhdGFsb2ciLCB0YWJsZVJlc291cmNlLmdldENhdGFsb2coKSk7Ci0JCQotCQl0YWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkKLQkJdGFibGUuc2V0U2NoZW1hKCJteVNjaGVtYSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlTY2hlbWEiLCBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTY2hlbWEiLCBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIm15U2NoZW1hIik7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJVGFibGUgdGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKTsKLQkJdGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJteVNjaGVtYSIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlUmVzb3VyY2UgPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteVNjaGVtYSIsIHRhYmxlUmVzb3VyY2UuZ2V0U2NoZW1hKCkpOwotCQkKLQkJdGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlUYWJsZUFubm90YXRpb24gdGFibGVBbm5vdGF0aW9uID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJdGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiZm9vIik7Ci0JCXRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsICBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlQW5ub3RhdGlvbiA9IChUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCXRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImZvbyIpOwotCQl0YWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJiYXIiKTsKLQkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgIGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJVGFibGUgdGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZUFubm90YXRpb24gPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJVGFibGUgdGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZUFubm90YXRpb24gPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhVGFibGUgdGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZUFubm90YXRpb24gPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0KLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gdGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IHRhYmxlQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwkJCi0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5oYXNOZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCi0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSB0YWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVRhYmxlIHRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCk7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlUYWJsZUFubm90YXRpb24gdGFibGVBbm5vdGF0aW9uID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJCi0JCXRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gdGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQotCi0JCXRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSB0YWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhVGFibGUgdGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlQW5ub3RhdGlvbiA9IChUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCi0JCXRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkZPTyIpOwotCQl0YWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKCJCQVIiKTsKLQkJdGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCXRhYmxlQW5ub3RhdGlvbi5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQl0YWJsZUFubm90YXRpb24ubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJdGFibGVBbm5vdGF0aW9uLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQl0YWJsZUFubm90YXRpb24ucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCXRhYmxlQW5ub3RhdGlvbi5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdEVudGl0eUdldERlZmF1bHROYW1lVGFibGVQZXJDbGFzc0luaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUFic3RyYWN0VGVzdEVudGl0eSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJRW50aXR5IGNvbmNyZXRlRW50aXR5ID0gKEVudGl0eSkgc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBjb25jcmV0ZUVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKEVudGl0eSkgc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGFic3RyYWN0RW50aXR5LmdldE5hbWUoKSk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGFic3RyYWN0RW50aXR5LmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb25jcmV0ZUVudGl0eS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgY29uY3JldGVFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFic3RyYWN0RW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYWJzdHJhY3RFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBjb25jcmV0ZUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29uY3JldGVFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbmNyZXRlRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVRyYW5zaWVudE1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZDQ4YzguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhVHJhbnNpZW50TWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5UUkFOU0lFTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRyYW5zaWVudCIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkJCi0JcHVibGljIEphdmFUcmFuc2llbnRNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVHJhbnNpZW50TWFwcGluZyB0cmFuc2llbnRNYXBwaW5nID0gKFRyYW5zaWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh0cmFuc2llbnRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVHJhbnNpZW50TWFwcGluZyB0cmFuc2llbnRNYXBwaW5nID0gKFRyYW5zaWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh0cmFuc2llbnRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVHJhbnNpZW50TWFwcGluZyB0cmFuc2llbnRNYXBwaW5nID0gKFRyYW5zaWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh0cmFuc2llbnRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROb3ROdWxsKHRyYW5zaWVudE1hcHBpbmcpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVmVyc2lvbk1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVmVyc2lvbk1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzQyZTAxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVZlcnNpb25NYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNlVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmF2YVZlcnNpb25NYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlZFUlNJT04pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFZlcnNpb24iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5WRVJTSU9OLCBKUEEuVEVNUE9SQUwsIEpQQS5URU1QT1JBTF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBWZXJzaW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRVNUQU1QKSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkJCi0JcHVibGljIEphdmFWZXJzaW9uTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSAoKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGVtcG9yYWwoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbCh2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRlbXBvcmFsQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChUZW1wb3JhbEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRlbXBvcmFsVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGVtcG9yYWxBbm5vdGF0aW9uIHRlbXBvcmFsID0gKFRlbXBvcmFsQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0ZW1wb3JhbC5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuREFURSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCAoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZSh2ZXJzaW9uTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwodmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSnB0Q29yZUNvbnRleHRKYXZhTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KcHRDb3JlQ29udGV4dEphdmFNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MWQyOGIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KcHRDb3JlQ29udGV4dEphdmFNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdENvcmVDb250ZXh0SmF2YU1vZGVsVGVzdHMKLQlleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdENvcmVDb250ZXh0SmF2YU1vZGVsVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFBdHRyaWJ1dGVPdmVycmlkZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFCYXNpY01hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhQ2FzY2FkZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFDb2x1bW5UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhRGlzY3JpbWluYXRvckNvbHVtblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFFbWJlZGRhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YUVtYmVkZGVkSWRNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YUVtYmVkZGVkTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFFbnRpdHlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhR2VuZXJhdGVkVmFsdWVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhSWRNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YUpvaW5Db2x1bW5UZXN0cy5jbGFzcyk7CQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YUpvaW5UYWJsZVRlc3RzLmNsYXNzKTsJCQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFOYW1lZFF1ZXJ5VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YU5hbWVkTmF0aXZlUXVlcnlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhUXVlcnlIaW50VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFTZWNvbmRhcnlUYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFTZXF1ZW5jZUdlbmVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFUYWJsZUdlbmVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFUYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFUcmFuc2llbnRNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YVZlcnNpb25NYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRDb3JlQ29udGV4dEphdmFNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRW50aXR5TWFwcGluZ3NUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VudGl0eU1hcHBpbmdzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhlMWM1MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRW50aXR5TWFwcGluZ3NUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVudGl0eU1hcHBpbmdzVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFbnRpdHlNYXBwaW5nc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRWZXJzaW9uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVzY3JpcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlc2NyaXB0aW9uKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQotCQkvL3NldCBkZXNjcmlwdGlvbiBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXREZXNjcmlwdGlvbigibmV3RGVzY3JpcHRpb24iKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdEZXNjcmlwdGlvbiIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygibmV3RGVzY3JpcHRpb24iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldERlc2NyaXB0aW9uKCkpOwotCQotCQkvL3NldCBkZXNjcmlwdGlvbiB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldERlc2NyaXB0aW9uKG51bGwpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeURlc2NyaXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldERlc2NyaXB0aW9uKCkpOwotCQkKLQkJLy9zZXQgZGVzY3JpcHRpb24gaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldERlc2NyaXB0aW9uKCJuZXdEZXNjcmlwdGlvbiIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld0Rlc2NyaXB0aW9uIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdEZXNjcmlwdGlvbiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQotCQkvL3NldCBkZXNjcmlwdGlvbiB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0RGVzY3JpcHRpb24obnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldERlc2NyaXB0aW9uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUGFja2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBhY2thZ2UoKSk7Ci0JCQotCQkvL3NldCBwYWNrYWdlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBhY2thZ2UoImZvby5tb2RlbCIpOwotCQlhc3NlcnRFcXVhbHMoImZvby5tb2RlbCIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28ubW9kZWwiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBhY2thZ2UoKSk7Ci0JCQotCQkvL3NldCBwYWNrYWdlIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGFja2FnZShudWxsKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBhY2thZ2UoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQYWNrYWdlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UGFja2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBhY2thZ2UoKSk7Ci0JCQotCQkvL3NldCBwYWNrYWdlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQYWNrYWdlKCJmb28ubW9kZWwiKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28ubW9kZWwiLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBhY2thZ2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vLm1vZGVsIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQYWNrYWdlKCkpOwotCi0JCS8vc2V0IHBhY2thZ2UgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFBhY2thZ2UobnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQYWNrYWdlKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7Ci0JCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0U2NoZW1hKCJNWV9TQ0hFTUEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKLQotCQkvL3NldCBzY2hlbWEgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJNWV9TQ0hFTUEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKLQotCQkvL3NldCBzY2hlbWEgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBjYXRhbG9nIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldENhdGFsb2coIk1ZX0NBVEFMT0ciKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0KLQkJLy9zZXQgY2F0YWxvZyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7Ci0JCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpOwotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTY2hlbWEoIk1ZX1NDSEVNQSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7Ci0JCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFNjaGVtYSgiTVlfU0NIRU1BIik7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNjaGVtYSgiREVGQVVMVF9TQ0hFTUEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJERUZBVUxUX1NDSEVNQSIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJERUZBVUxUX1NDSEVNQSIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZENhdGFsb2coIk1ZX0NBVEFMT0ciKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyk7Ci0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhdGFsb2coIk1ZX0NBVEFMT0ciKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwotCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0JCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0Q2F0YWxvZygiTVlfQ0FUQUxPRyIpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJERUZBVUxUX0NBVEFMT0ciKTsKLQkJYXNzZXJ0RXF1YWxzKCJERUZBVUxUX0NBVEFMT0ciLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkRFRkFVTFRfQ0FUQUxPRyIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKTsKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxELCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0QWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JfQkKLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPcm1QZXJzaXN0ZW50VHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOwotCQkKLQkJLy9hZGQgZW1iZWRkYWJsZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRW1iZWRkYWJsZSgpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuYWRkKGVtYmVkZGFibGUpOwotCQllbWJlZGRhYmxlLnNldENsYXNzTmFtZSgibW9kZWwuRm9vIik7Ci0JCWFzc2VydFRydWUoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL2FkZCBlbnRpdHkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCVhtbEVudGl0eSBlbnRpdHkgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbnRpdHkoKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmFkZChlbnRpdHkpOwotCQllbnRpdHkuc2V0Q2xhc3NOYW1lKCJtb2RlbC5Gb28yIik7Ci0JCWFzc2VydFRydWUoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vMiIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28yIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0KLQkJLy9hZGQgbWFwcGVkLXN1cGVyY2xhc3MgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5hZGQobWFwcGVkU3VwZXJjbGFzcyk7Ci0JCW1hcHBlZFN1cGVyY2xhc3Muc2V0Q2xhc3NOYW1lKCJtb2RlbC5Gb28zIik7Ci0JCWFzc2VydFRydWUoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vMyIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vMyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEFkZE9ybVBlcnNpc3RlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLQkJCi0JCS8vYWRkIGVtYmVkZGFibGUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlhc3NlcnRUcnVlKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0KLQkJLy9hZGQgZW50aXR5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzIiKTsKLQkJYXNzZXJ0VHJ1ZShnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28yIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28yIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0KLQkJLy9hZGQgbWFwcGVkLXN1cGVyY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28zIik7Ci0JCWFzc2VydFRydWUoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vMyIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vMyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU9ybVBlcnNpc3RlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzMiKTsKLQkJCi0JCS8vcmVtb3ZlIG9ybVBlcnNpc3RlbnRUeXBlIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnJlbW92ZVBlcnNpc3RlbnRUeXBlKDEpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVQZXJzaXN0ZW50VHlwZSgxKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVQZXJzaXN0ZW50VHlwZSgwKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUYWJsZUdlbmVyYXRvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVGFibGVHZW5lcmF0b3IoKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5hZGQodGFibGVHZW5lcmF0b3JSZXNvdXJjZSk7Ci0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlMiA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuYWRkKDAsIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UyKTsKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZTIuc2V0TmFtZSgiQkFSIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtVGFibGVHZW5lcmF0b3I+IHRhYmxlR2VuZXJhdG9ycyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0YWJsZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlMyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuYWRkKDEsIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UzKTsKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZTMuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQl0YWJsZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGVHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRhYmxlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRhYmxlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMywgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkubW92ZSgyLCAwKTsKLQkJdGFibGVHZW5lcmF0b3JzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRhYmxlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGVHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0YWJsZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLnJlbW92ZSgwKTsKLQkJdGFibGVHZW5lcmF0b3JzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRhYmxlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkucmVtb3ZlKDEpOwotCQl0YWJsZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0YWJsZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmNsZWFyKCk7Ci0JCXRhYmxlR2VuZXJhdG9ycyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodGFibGVHZW5lcmF0b3JzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCkuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVRhYmxlR2VuZXJhdG9yPiB0YWJsZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGVHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGFibGVHZW5lcmF0b3JzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVUYWJsZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQkKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwotCQl0YWJsZUdlbmVyYXRvci5zZXROYW1lKCJGT08iKTsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IyID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigxKTsKLQkJdGFibGVHZW5lcmF0b3IyLnNldE5hbWUoIkJBUiIpOwotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcjMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDIpOwotCQl0YWJsZUdlbmVyYXRvcjMuc2V0TmFtZSgiQkFaIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLnNpemUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnJlbW92ZVRhYmxlR2VuZXJhdG9yKDApOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1UYWJsZUdlbmVyYXRvcj4gdGFibGVHZW5lcmF0b3JzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5pdGVyYXRvcigpOwotCQlPcm1UYWJsZUdlbmVyYXRvciB4bWxUYWJsZUdlbmVyYXRvciA9IHRhYmxlR2VuZXJhdG9ycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgeG1sVGFibGVHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRhYmxlR2VuZXJhdG9yMiwgeG1sVGFibGVHZW5lcmF0b3IpOwotCQl4bWxUYWJsZUdlbmVyYXRvciA9IHRhYmxlR2VuZXJhdG9ycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgeG1sVGFibGVHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRhYmxlR2VuZXJhdG9yMywgeG1sVGFibGVHZW5lcmF0b3IpOwotCQlhc3NlcnRGYWxzZSh0YWJsZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKLQotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVUYWJsZUdlbmVyYXRvcigxKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQl0YWJsZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLml0ZXJhdG9yKCk7Ci0JCXhtbFRhYmxlR2VuZXJhdG9yID0gdGFibGVHZW5lcmF0b3JzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxUYWJsZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGFibGVHZW5lcmF0b3IyLCB4bWxUYWJsZUdlbmVyYXRvcik7Ci0JCWFzc2VydEZhbHNlKHRhYmxlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCi0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnJlbW92ZVRhYmxlR2VuZXJhdG9yKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQl0YWJsZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHRhYmxlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsKLQkJdGFibGVHZW5lcmF0b3Iuc2V0TmFtZSgiRk9PIik7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yMiA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMSk7Ci0JCXRhYmxlR2VuZXJhdG9yMi5zZXROYW1lKCJCQVIiKTsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigyKTsKLQkJdGFibGVHZW5lcmF0b3IzLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5tb3ZlVGFibGVHZW5lcmF0b3IoMiwgMCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLnNpemUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLm1vdmVUYWJsZUdlbmVyYXRvcigwLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlR2VuZXJhdG9yc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7Ci0JCXRhYmxlR2VuZXJhdG9yLnNldE5hbWUoIkZPTyIpOwotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcjIgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDEpOwotCQl0YWJsZUdlbmVyYXRvcjIuc2V0TmFtZSgiQkFSIik7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yMyA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMik7Ci0JCXRhYmxlR2VuZXJhdG9yMy5zZXROYW1lKCJCQVoiKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTZXF1ZW5jZUdlbmVyYXRvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JCQotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5hZGQoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSk7Ci0JCXNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JCQotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlMiA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuYWRkKDAsIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UyKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZTIuc2V0TmFtZSgiQkFSIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtU2VxdWVuY2VHZW5lcmF0b3I+IHNlcXVlbmNlR2VuZXJhdG9ycyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzZXF1ZW5jZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JCQotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlMyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuYWRkKDEsIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UzKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZTMuc2V0TmFtZSgiQkFaIik7Ci0KLQkJc2VxdWVuY2VHZW5lcmF0b3JzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzZXF1ZW5jZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLm1vdmUoMiwgMCk7Ci0JCXNlcXVlbmNlR2VuZXJhdG9ycyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2VxdWVuY2VHZW5lcmF0b3JzLmhhc05leHQoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLnJlbW92ZSgwKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3JzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlcXVlbmNlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLnJlbW92ZSgxKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3JzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2VxdWVuY2VHZW5lcmF0b3JzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5jbGVhcigpOwotCQlzZXF1ZW5jZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHNlcXVlbmNlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLnNpemUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLnNpemUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtU2VxdWVuY2VHZW5lcmF0b3I+IHNlcXVlbmNlR2VuZXJhdG9ycyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzZXF1ZW5jZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLnNpemUoKSk7Ci0JCQotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7Ci0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldE5hbWUoIkZPTyIpOwotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcjIgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDEpOwotCQlzZXF1ZW5jZUdlbmVyYXRvcjIuc2V0TmFtZSgiQkFSIik7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yMyA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMik7Ci0JCXNlcXVlbmNlR2VuZXJhdG9yMy5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoMCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVNlcXVlbmNlR2VuZXJhdG9yPiBzZXF1ZW5jZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLml0ZXJhdG9yKCk7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yIHhtbFNlcXVlbmNlR2VuZXJhdG9yID0gc2VxdWVuY2VHZW5lcmF0b3JzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxTZXF1ZW5jZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoc2VxdWVuY2VHZW5lcmF0b3IyLCB4bWxTZXF1ZW5jZUdlbmVyYXRvcik7Ci0JCXhtbFNlcXVlbmNlR2VuZXJhdG9yID0gc2VxdWVuY2VHZW5lcmF0b3JzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB4bWxTZXF1ZW5jZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoc2VxdWVuY2VHZW5lcmF0b3IzLCB4bWxTZXF1ZW5jZUdlbmVyYXRvcik7Ci0JCWFzc2VydEZhbHNlKHNlcXVlbmNlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCi0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKDEpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCXNlcXVlbmNlR2VuZXJhdG9ycyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuaXRlcmF0b3IoKTsKLQkJeG1sU2VxdWVuY2VHZW5lcmF0b3IgPSBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHhtbFNlcXVlbmNlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhzZXF1ZW5jZUdlbmVyYXRvcjIsIHhtbFNlcXVlbmNlR2VuZXJhdG9yKTsKLQkJYXNzZXJ0RmFsc2Uoc2VxdWVuY2VHZW5lcmF0b3JzLmhhc05leHQoKSk7Ci0KLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLnNpemUoKSk7Ci0JCXNlcXVlbmNlR2VuZXJhdG9ycyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoc2VxdWVuY2VHZW5lcmF0b3JzLmhhc05leHQoKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQkKLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApOwotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXROYW1lKCJGT08iKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IyID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigxKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3IyLnNldE5hbWUoIkJBUiIpOwotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcjMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDIpOwotCQlzZXF1ZW5jZUdlbmVyYXRvcjMuc2V0TmFtZSgiQkFaIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLnNpemUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLm1vdmVTZXF1ZW5jZUdlbmVyYXRvcigyLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkubW92ZVNlcXVlbmNlR2VuZXJhdG9yKDAsIDIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7Ci0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldE5hbWUoIkZPTyIpOwotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcjIgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDEpOwotCQlzZXF1ZW5jZUdlbmVyYXRvcjIuc2V0TmFtZSgiQkFSIik7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yMyA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMik7Ci0JCXNlcXVlbmNlR2VuZXJhdG9yMy5zZXROYW1lKCJCQVoiKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnNTaXplKCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGROYW1lZFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwotCQluYW1lZFF1ZXJ5LnNldE5hbWUoIkZPTyIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkyID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7Ci0JCW5hbWVkUXVlcnkyLnNldE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMSk7Ci0JCW5hbWVkUXVlcnkzLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1OYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVkUXVlcnkyLCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVkUXVlcnkzLCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVkUXVlcnksIG5hbWVkUXVlcmllcy5uZXh0KCkpOwotCQkKLQkJbmFtZWRRdWVyaWVzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOYW1lZFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5zaXplKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkUXVlcnkoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5yZW1vdmVOYW1lZFF1ZXJ5KDApOwotCQlhc3NlcnRFcXVhbHMoMSwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkucmVtb3ZlTmFtZWRRdWVyeSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVOYW1lZFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5zaXplKCkpOwotCQkKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5tb3ZlTmFtZWRRdWVyeSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkubW92ZU5hbWVkUXVlcnkoMCwgMSk7Ci0JCW5hbWVkUXVlcmllcyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lZFF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZFF1ZXJ5KCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZFF1ZXJ5KCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZFF1ZXJ5KCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1OYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5tb3ZlKDIsIDApOwotCQluYW1lZFF1ZXJpZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLm1vdmUoMCwgMSk7Ci0JCW5hbWVkUXVlcmllcyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkucmVtb3ZlKDEpOwotCQluYW1lZFF1ZXJpZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLnJlbW92ZSgxKTsKLQkJbmFtZWRRdWVyaWVzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGROYW1lZE5hdGl2ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQluYW1lZE5hdGl2ZVF1ZXJ5LnNldE5hbWUoIkZPTyIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkyID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCW5hbWVkTmF0aXZlUXVlcnkyLnNldE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMSk7Ci0JCW5hbWVkTmF0aXZlUXVlcnkzLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1OYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVkTmF0aXZlUXVlcnkyLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVkTmF0aXZlUXVlcnkzLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVkTmF0aXZlUXVlcnksIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkpOwotCQkKLQkJbmFtZWROYXRpdmVRdWVyaWVzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5zaXplKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5yZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQlhc3NlcnRFcXVhbHMoMSwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5zaXplKCkpOwotCQkKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5tb3ZlTmFtZWROYXRpdmVRdWVyeSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllcyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkubW92ZU5hbWVkTmF0aXZlUXVlcnkoMCwgMSk7Ci0JCW5hbWVkTmF0aXZlUXVlcmllcyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lZE5hdGl2ZVF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZE5hdGl2ZVF1ZXJ5KCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZE5hdGl2ZVF1ZXJ5KCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZE5hdGl2ZVF1ZXJ5KCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1OYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWROYXRpdmVRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5tb3ZlKDIsIDApOwotCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWROYXRpdmVRdWVyaWVzLmhhc05leHQoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLm1vdmUoMCwgMSk7Ci0JCW5hbWVkTmF0aXZlUXVlcmllcyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZE5hdGl2ZVF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkucmVtb3ZlKDEpOwotCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZE5hdGl2ZVF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnJlbW92ZSgxKTsKLQkJbmFtZWROYXRpdmVRdWVyaWVzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZE5hdGl2ZVF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDUwN2I0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBHZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4obmFtZT1cIkZPT1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZVNwZWNpZmllZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9YbWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3BlY2lmaWVkQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHNwZWNpZmllZEF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZVNwZWNpZmllZE1hcHBpbmdLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVOdWxsQXR0cmlidXRlTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCS8vdGFrZSBhIHZpcnR1YWwgbWFwcGluZyB3aXRoIGEgbWFwcGluZyB0eXBlIGFuZCBtYWtlIGl0IHNwZWNpZmllZAotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9YbWwoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydFRydWUoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBHZW5lcmljT3JtT25lVG9PbmVNYXBwaW5nKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRUcnVlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgR2VuZXJpY09ybUlkTWFwcGluZyk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuYWRkVG9YbWwoKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5hZGRUb1htbCgpOwotCi0JCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUucmVtb3ZlRnJvbVhtbCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLnJlbW92ZUZyb21YbWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJSXRlcmF0b3I8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiB2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsJCQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlVmlydHVhbE5vVW5kZXJseWluZ0phdmFBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmFkZFRvWG1sKCk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuYWRkVG9YbWwoKTsKLQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKS5zZXROYW1lKCJub0phdmFBdHRyaWJ1dGUiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5yZW1vdmVGcm9tWG1sKCk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdUeXBlV2hlbk1ldGFkYXRhQ29tcGxldGUoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgKChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdUeXBlV2hlbk1ldGFkYXRhQ29tcGxldGUyKCkgIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5T25lVG9PbmVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCQkKLQkJLy92aXJ0dWFsIG9ybSBhdHRyaWJ1dGUsIGFjY2VzcyB0eXBlIG1hdGNoZXMgamF2YSA6IEZJRUxELCBuYW1lIG1hdGNoZXMgamF2YQotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgamF2YVJlc291cmNlQXR0cmlidXRlID0gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBqYXZhUmVzb3VyY2VBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCksIGphdmFSZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQkKLQkJLy9zcGVjaWZpZWQgb3JtIGF0dHJpYnV0ZSwgYWNjZXNzIHR5cGUgbWF0Y2hlcyBqYXZhIDogRklFTEQsIG5hbWUgbWF0Y2hlcyBqYXZhCi0JCS8vamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgc2hvdWxkIGJlID09IHRvIGphdmEgY29udGV4dCBtb2RlbCBvYmplY3QKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCi0JCQotCQkvL3ZpcnR1YWwgb3JtIGF0dHJpYnV0ZSwgamF2YSBhY2Nlc3MgdHlwZSBGSUVMRCwgb3JtIGFjY2VzcyB0eXBlIFBST1BFUlRZLCBuYW1lIG1hdGNoZXMgamF2YQotCQkvL3ZlcmlmeSBib3RoIHRoZSBwcm9wZXJ0eSBqYXZhIHJlc291cmNlIGF0dHJpYnV0ZSBhbmQgdGhlIGZpZWxkIGphdmEgcmVzb3VyY2UgYXR0cmlidXRlIGFyZSB1c2VkIGluIG9ybQotCQkvL2JlY2F1c2UgdGhlIGZpZWxkIGlzIGFubm90YXRlZCBhbmQgcHJvcGVydHkgaXMgc3BlY2lmaWVkCi0JCSgoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkucmVtb3ZlRnJvbVhtbCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlMaXN0SXRlcmF0b3I8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBpZEZpZWxkQXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBpZFByb3BlcnR5QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBpZEZpZWxkQXR0cmlidXRlKTsKLQkJYXNzZXJ0Tm90U2FtZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBpZFByb3BlcnR5QXR0cmlidXRlKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGlkUHJvcGVydHlBdHRyaWJ1dGU7Ci0JCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgaWRGaWVsZEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKLQkJamF2YVJlc291cmNlQXR0cmlidXRlID0gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBqYXZhUmVzb3VyY2VBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0TWV0aG9kcygpLml0ZXJhdG9yKCkubmV4dCgpLCBqYXZhUmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsvL2RlZmF1bHQgYWNjZXNzIHdpbGwgYmUgZmllbGQKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmFkZFRvWG1sKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKS5zZXROYW1lKCJpZDIiKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCkuc2V0TmFtZSgiaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM5NDIwYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZVRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTF9UWVBFX05BTUUgPSAiTW9kZWwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9NT0RFTF9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBNT0RFTF9UWVBFX05BTUU7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QTE9ZRUVfVFlQRV9OQU1FID0gIkVtcGxveWVlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfRU1QTE9ZRUVfVFlQRV9OQU1FID0gUEFDS0FHRV9OQU1FICsgIi4iICsgRU1QTE9ZRUVfVFlQRV9OQU1FOwotCi0JCi0JcHVibGljIEdlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVNb2RlbFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBhYnN0cmFjdCBjbGFzcyAiKS5hcHBlbmQoTU9ERUxfVFlQRV9OQU1FKS5hcHBlbmQoIiB7Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCBNT0RFTF9UWVBFX05BTUUgKyAiLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW1wbG95ZWVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKEVNUExPWUVFX1RZUEVfTkFNRSkuYXBwZW5kKCIgZXh0ZW5kcyAiKS5hcHBlbmQoTU9ERUxfVFlQRV9OQU1FKS5hcHBlbmQoIiB7Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBkZXBhcnRtZW50OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5EYXRlIHN0YXJ0RGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCBFTVBMT1lFRV9UWVBFX05BTUUgKyAiLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLS8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxUeXBlTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWFzc2VydEZhbHNlKGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkuaGFzTmV4dCgpKTsKLS8vCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotLy8JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLS8vCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7Ci0vLwkJCi0vLwkJLy9hZGQgZW1iZWRkYWJsZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLS8vCQlFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFbWJlZGRhYmxlKCk7Ci0vLwkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuYWRkKGVtYmVkZGFibGUpOwotLy8JCWVtYmVkZGFibGUuc2V0Q2xhc3NOYW1lKCJtb2RlbC5Gb28iKTsKLS8vCQlhc3NlcnRUcnVlKGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkuaGFzTmV4dCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKS5nZXRDbGFzc18oKSk7Ci0vLwkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLS8vCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0vLwkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0vLwkJCi0vLwkJLy9hZGQgZW50aXR5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotLy8JCUVudGl0eSBlbnRpdHkgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFbnRpdHkoKTsKLS8vCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5hZGQoZW50aXR5KTsKLS8vCQllbnRpdHkuc2V0Q2xhc3NOYW1lKCJtb2RlbC5Gb28yIik7Ci0vLwkJYXNzZXJ0VHJ1ZShlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpLmhhc05leHQoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28yIiwgZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpLmdldENsYXNzXygpKTsKLS8vCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotLy8JCWFzc2VydEZhbHNlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0vLwkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbzIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotLy8KLS8vCQkvL2FkZCBtYXBwZWQtc3VwZXJjbGFzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLS8vCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNYXBwZWRTdXBlcmNsYXNzKCk7Ci0vLwkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmFkZChtYXBwZWRTdXBlcmNsYXNzKTsKLS8vCQltYXBwZWRTdXBlcmNsYXNzLnNldENsYXNzTmFtZSgibW9kZWwuRm9vMyIpOwotLy8JCWFzc2VydFRydWUoZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOwotLy8JCWFzc2VydEVxdWFscygibW9kZWwuRm9vMyIsIGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKS5nZXRDbGFzc18oKSk7Ci0vLwkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0vLwkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLS8vCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOwotLy8JCWFzc2VydEVxdWFscygibW9kZWwuRm9vMyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotLy8JfQotLy8JCi0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoWG1sVHlwZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28zIik7Ci0JCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZSwgb3JtUGVyc2lzdGVudFR5cGUpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuc2l6ZSgpKTsKLQkJCi0JCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRUeXBlPiBvcm1QZXJzaXN0ZW50VHlwZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCk7Ci0JCS8vdGhlIHNhbWUgT3JtUGVyc2lzdGVudFR5cGVzIHNob3VsZCBzdGlsbCBiZSBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudFR5cGVzLm5leHQoKSwgZW50aXR5UGVyc2lzdGVudFR5cGUpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudFR5cGVzLm5leHQoKSwgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRUeXBlcy5uZXh0KCksIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbzMiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDEpLmdldENsYXNzTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlYbWxFbnRpdHkgZW50aXR5ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQotCQkoKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpKS5yZW1vdmVGcm9tWG1sKCk7Ci0JCWFzc2VydE51bGwoZW50aXR5LmdldEF0dHJpYnV0ZXMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCYXNpYygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJWG1sRW50aXR5IGVudGl0eSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0KLQkJKChPcm1QZXJzaXN0ZW50QXR0cmlidXRlKSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSkucmVtb3ZlRnJvbVhtbCgpOwotCQlhc3NlcnROdWxsKGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlYbWxFbnRpdHkgZW50aXR5ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCi0JCSgoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikpLnJlbW92ZUZyb21YbWwoKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0QXR0cmlidXRlcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVtYmVkZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlYbWxFbnRpdHkgZW50aXR5ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQotCQkoKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpKS5yZW1vdmVGcm9tWG1sKCk7Ci0JCWFzc2VydE51bGwoZW50aXR5LmdldEF0dHJpYnV0ZXMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVUcmFuc2llbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwoZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlYbWxFbnRpdHkgZW50aXR5ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRUcmFuc2llbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0KLQkJKChPcm1QZXJzaXN0ZW50QXR0cmlidXRlKSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSkucmVtb3ZlRnJvbVhtbCgpOwotCQlhc3NlcnROdWxsKGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCVhtbEVudGl0eSBlbnRpdHkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCWVudGl0eS5zZXRBdHRyaWJ1dGVzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUF0dHJpYnV0ZXMoKSk7Ci0JCVhtbEJhc2ljIGJhc2ljID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQmFzaWMoKTsKLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5hZGQoYmFzaWMpOwotCQliYXNpYy5zZXROYW1lKCJiYXNpY0F0dHJpYnV0ZSIpOwotCQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCQotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZCA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEVtYmVkZGVkKCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuYWRkKGVtYmVkZGVkKTsKLQkJZW1iZWRkZWQuc2V0TmFtZSgiZW1iZWRkZWRBdHRyaWJ1dGUiKTsKLQkJCi0JCUl0ZXJhdG9yPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWNBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkKLQkJWG1sVmVyc2lvbiB2ZXJzaW9uID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVmVyc2lvbigpOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuYWRkKHZlcnNpb24pOwotCQl2ZXJzaW9uLnNldE5hbWUoInZlcnNpb25BdHRyaWJ1dGUiKTsKLQkJCi0JCWF0dHJpYnV0ZXMgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQlYbWxJZCBpZCA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbElkKCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuYWRkKGlkKTsKLQkJaWQuc2V0TmFtZSgiaWRBdHRyaWJ1dGUiKTsKLQkJCi0JCWF0dHJpYnV0ZXMgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQlYbWxUcmFuc2llbnQgdHJhbnNpZW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUcmFuc2llbnQoKTsKLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRUcmFuc2llbnRzKCkuYWRkKHRyYW5zaWVudFJlc291cmNlKTsKLQkJdHJhbnNpZW50UmVzb3VyY2Uuc2V0TmFtZSgidHJhbnNpZW50QXR0cmlidXRlIik7Ci0JCQotCQlhdHRyaWJ1dGVzID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWNBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb25BdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJWG1sTWFueVRvT25lIG1hbnlUb09uZVJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFueVRvT25lKCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmFkZChtYW55VG9PbmVSZXNvdXJjZSk7Ci0JCW1hbnlUb09uZVJlc291cmNlLnNldE5hbWUoIm1hbnlUb09uZUF0dHJpYnV0ZSIpOwotCQkKLQkJYXR0cmlidXRlcyA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueVJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFueVRvTWFueSgpOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuYWRkKG1hbnlUb01hbnlSZXNvdXJjZSk7Ci0JCW1hbnlUb01hbnlSZXNvdXJjZS5zZXROYW1lKCJtYW55VG9NYW55QXR0cmlidXRlIik7Ci0JCQotCQlhdHRyaWJ1dGVzID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWNBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb25BdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvT25lQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9NYW55QXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueVJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT25lVG9NYW55KCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmFkZChvbmVUb01hbnlSZXNvdXJjZSk7Ci0JCW9uZVRvTWFueVJlc291cmNlLnNldE5hbWUoIm9uZVRvTWFueUF0dHJpYnV0ZSIpOwotCQkKLQkJYXR0cmlidXRlcyA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygib25lVG9NYW55QXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9NYW55QXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPbmVUb09uZSgpOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmFkZChvbmVUb09uZVJlc291cmNlKTsKLQkJb25lVG9PbmVSZXNvdXJjZS5zZXROYW1lKCJvbmVUb09uZUF0dHJpYnV0ZSIpOwotCQkKLQkJYXR0cmlidXRlcyA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygib25lVG9NYW55QXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9NYW55QXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0KLQkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkUmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbWJlZGRlZElkKCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5hZGQoZW1iZWRkZWRJZFJlc291cmNlKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLnNldE5hbWUoImVtYmVkZGVkSWRBdHRyaWJ1dGUiKTsKLQkJCi0JCWF0dHJpYnV0ZXMgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZElkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmVBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvTWFueUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmVBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvTWFueUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLnJlbW92ZSgwKTsKLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5yZW1vdmUoMCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VHJhbnNpZW50cygpLnJlbW92ZSgwKTsKLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5yZW1vdmUoMCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5yZW1vdmUoMCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLnJlbW92ZSgwKTsKLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLnJlbW92ZSgwKTsKLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkucmVtb3ZlKDApOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLnJlbW92ZSgwKTsKLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2UoZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChlbnRpdHkuZ2V0QXR0cmlidXRlcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5oZXJpdGVkQXR0cmlidXRlc1Jlc29sdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlTW9kZWxUeXBlKCk7Ci0JCWNyZWF0ZUVtcGxveWVlVHlwZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW1wbG95ZWVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9FTVBMT1lFRV9UWVBFX05BTUUpOwotCi0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGVtcGxveWVlUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwoZW1wbG95ZWVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgic3RhcnREYXRlIiksIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuc2V0TmFtZSgiaWQiKTsKLQkJYXR0cmlidXRlID0gZW1wbG95ZWVQZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChlbXBsb3llZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJzdGFydERhdGUiKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXR0cmlidXRlLmdldE1hcHBpbmcoKS5zZXROYW1lKCJuYW1lIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3RhcnREYXRlQXR0cmlidXRlID0gZW1wbG95ZWVQZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChlbXBsb3llZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJzdGFydERhdGUiKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJKChPcm1CYXNpY01hcHBpbmcpIHN0YXJ0RGF0ZUF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgKChPcm1CYXNpY01hcHBpbmcpIHN0YXJ0RGF0ZUF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLkRBVEUpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGlkQXR0cmlidXRlID0gZW1wbG95ZWVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBpZEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlhc3NlcnROb3ROdWxsKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5FbXBsb3llZSIsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE93bmluZ1BlcnNpc3RlbnRUeXBlKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0Lk1vZGVsIiwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRQYXJlbnQoKS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vSnB0Q29yZU9ybUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vSnB0Q29yZU9ybUNvbnRleHRNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTg2ZTIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0pwdENvcmVPcm1Db250ZXh0TW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdENvcmVPcm1Db250ZXh0TW9kZWxUZXN0cwotCWV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0Q29yZU9ybUNvbnRleHRNb2RlbFRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtWG1sVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW50aXR5TWFwcGluZ3NUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljT3JtUGVyc2lzdGVudFR5cGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtQXR0cmlidXRlT3ZlcnJpZGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1CYXNpY01hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1DYXNjYWRlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtQ29sdW1uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtRGlzY3JpbWluYXRvckNvbHVtblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybUlkTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybUVtYmVkZGFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1FbWJlZGRlZE1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1FbWJlZGRlZElkTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybUVudGl0eVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybUdlbmVyYXRlZFZhbHVlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtSm9pbkNvbHVtblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybUpvaW5UYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybU1hbnlUb09uZU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1OYW1lZFF1ZXJ5VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtTmFtZWROYXRpdmVRdWVyeVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybU9uZVRvTWFueU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybVF1ZXJ5SGludFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybVNlY29uZGFyeVRhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtU2VxdWVuY2VHZW5lcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1UYWJsZUdlbmVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybVRhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybVZlcnNpb25NYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXByaXZhdGUgSnB0Q29yZU9ybUNvbnRleHRNb2RlbFRlc3RzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOGRhMTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUFzc29jaWF0aW9uT3ZlcnJpZGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuaXNFbXB0eSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuaXNFbXB0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlhc3NlcnROdWxsKG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgb3JtQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gb3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMiA9IGpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbjMgPSBqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtbjMuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgb3JtQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gb3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwotCQkKLQkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJCi0JCWpvaW5pbmdTdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlqb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWpvaW5pbmdTdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgb3JtQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gb3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwotCi0JCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQkKLQkJam9pbmluZ1N0cmF0ZWd5Lm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlqb2luaW5nU3RyYXRlZ3kubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSA9IG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKTsKLQkKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5tb3ZlKDIsIDApOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLm1vdmUoMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDEpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQXR0cmlidXRlT3ZlcnJpZGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUF0dHJpYnV0ZU92ZXJyaWRlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4NzljNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQXR0cmlidXRlT3ZlcnJpZGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JtQXR0cmlidXRlT3ZlcnJpZGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybUF0dHJpYnV0ZU92ZXJyaWRlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJWG1sQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUob3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRGYWxzZShlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5pc0VtcHR5KCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmlzRW1wdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQlYbWxBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCWFzc2VydE51bGwob3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1CYXNpY01hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUJhc2ljTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNDY3ZTEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUJhc2ljTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2VFbnVtZXJhdGVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTG9iQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZVRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JtQmFzaWNNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1CYXNpY01hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9CQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUJhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBKUEEuRkVUQ0hfVFlQRSwgSlBBLkNPTFVNTiwgSlBBLkxPQiwgSlBBLlRFTVBPUkFMLCBKUEEuVEVNUE9SQUxfVFlQRSwgSlBBLkVOVU1FUkFURUQsIEpQQS5FTlVNX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyhmZXRjaD1GZXRjaFR5cGUuTEFaWSwgb3B0aW9uYWw9ZmFsc2UpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQ29sdW1uKG5hbWU9XCJNWV9DT0xVTU5cIiwgdW5pcXVlPXRydWUsIG51bGxhYmxlPWZhbHNlLCBpbnNlcnRhYmxlPWZhbHNlLCB1cGRhdGFibGU9ZmFsc2UsIGNvbHVtbkRlZmluaXRpb249XCJDT0xVTU5fREVGSU5JVElPTlwiLCB0YWJsZT1cIk1ZX1RBQkxFXCIsIGxlbmd0aD01LCBwcmVjaXNpb249Niwgc2NhbGU9NykiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBMb2IiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRVNUQU1QKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVudW1lcmF0ZWQoRW51bVR5cGUuU1RSSU5HKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1CYXNpY01hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGJhc2ljUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYmFzaWNSZXNvdXJjZS5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybUJhc2ljTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBiYXNpY1Jlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYmFzaWNSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1CYXNpY01hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGJhc2ljUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQmFzaWNNYXBwaW5nLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtQmFzaWNNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIGJhc2ljUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUJhc2ljTWFwcGluZy5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpY1Jlc291cmNlLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIsIGJhc2ljUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCi0JCWJhc2ljUmVzb3VyY2Uuc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSwgYmFzaWNSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQotCQkvL3NldCBmZXRjaCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpY1Jlc291cmNlLnNldEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1CYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkVBR0VSLCBiYXNpY1Jlc291cmNlLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5MQVpZLCBiYXNpY1Jlc291cmNlLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQotCQkvL3NldCBmZXRjaCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRFbnVtZXJhdGVkKCkpOwotCQkJCQotCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpY1Jlc291cmNlLnNldEVudW1lcmF0ZWQob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5PUkRJTkFMKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLk9SRElOQUwsICgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLk9SRElOQUwsIGJhc2ljUmVzb3VyY2UuZ2V0RW51bWVyYXRlZCgpKTsKLQkKLQkJYmFzaWNSZXNvdXJjZS5zZXRFbnVtZXJhdGVkKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuU1RSSU5HKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuU1RSSU5HLCBiYXNpY1Jlc291cmNlLmdldEVudW1lcmF0ZWQoKSk7Ci0KLQkJLy9zZXQgZW51bWVyYXRlZCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpY1Jlc291cmNlLnNldEVudW1lcmF0ZWQobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRFbnVtZXJhdGVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkRW51bWVyYXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxCYXNpYyBiYXNpY1Jlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldEVudW1lcmF0ZWQoKSk7Ci0JCQkJCi0JCS8vc2V0IGVudW1lcmF0ZWQgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKEVudW1UeXBlLk9SRElOQUwpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5PUkRJTkFMLCBiYXNpY1Jlc291cmNlLmdldEVudW1lcmF0ZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5PUkRJTkFMLCAoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwotCQotCQkoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKEVudW1UeXBlLlNUUklORyk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLlNUUklORywgYmFzaWNSZXNvdXJjZS5nZXRFbnVtZXJhdGVkKCkpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCAoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwotCi0JCS8vc2V0IGVudW1lcmF0ZWQgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1CYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0RW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQkJCQotCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpY1Jlc291cmNlLnNldE9wdGlvbmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWNSZXNvdXJjZS5nZXRPcHRpb25hbCgpKTsKLQkKLQkJYmFzaWNSZXNvdXJjZS5zZXRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGJhc2ljUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0KLQkJLy9zZXQgZW51bWVyYXRlZCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpY1Jlc291cmNlLnNldE9wdGlvbmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IGVudW1lcmF0ZWQgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpY1Jlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGJhc2ljUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0KLQkJLy9zZXQgZW51bWVyYXRlZCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChudWxsKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZExvYigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxCYXNpYyBiYXNpY1Jlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNSZXNvdXJjZS5pc0xvYigpKTsKLQkJCQkKLQkJLy9zZXQgbG9iIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpY1Jlc291cmNlLnNldExvYih0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKExvYkNvbnZlcnRlci5jbGFzcywgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydFRydWUoYmFzaWNSZXNvdXJjZS5pc0xvYigpKTsKLQotCQkvL3NldCBsb2IgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYmFzaWNSZXNvdXJjZS5zZXRMb2IoZmFsc2UpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRGYWxzZShiYXNpY1Jlc291cmNlLmlzTG9iKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTG9iKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0JCi0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljUmVzb3VyY2UuaXNMb2IoKSk7Ci0JCQkJCi0JCS8vc2V0IGxvYiBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihMb2JDb252ZXJ0ZXIuY2xhc3MpOwotCQlhc3NlcnRUcnVlKGJhc2ljUmVzb3VyY2UuaXNMb2IoKSk7Ci0JCWFzc2VydEVxdWFscyhMb2JDb252ZXJ0ZXIuY2xhc3MsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQotCQkvL3NldCBsb2IgdG8gZmFsc2UgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNSZXNvdXJjZS5pc0xvYigpKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IHRlbXBvcmFsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpY1Jlc291cmNlLnNldFRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLkRBVEUpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLkRBVEUsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLkRBVEUsIGJhc2ljUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCi0JCWJhc2ljUmVzb3VyY2Uuc2V0VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgYmFzaWNSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQotCQliYXNpY1Jlc291cmNlLnNldFRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRVNUQU1QLCAoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVAsIGJhc2ljUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0KLQkJLy9zZXQgdGVtcG9yYWwgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYmFzaWNSZXNvdXJjZS5zZXRUZW1wb3JhbChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJCQkKLQkJLy9zZXQgdGVtcG9yYWwgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5EQVRFKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLkRBVEUsIGJhc2ljUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgYmFzaWNSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0KLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FU1RBTVApOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRVNUQU1QLCBiYXNpY1Jlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCi0JCS8vc2V0IHRlbXBvcmFsIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCX0KLQkKLQkvL1RPRE8gdGVzdCBkZWZhdWx0cwotCS8vVE9ETyB0ZXN0IG92ZXJyaWRpbmcgamF2YSBtYXBwaW5nIHdpdGggYSBkaWZmZXJlbnQgbWFwcGluZyB0eXBlIGluIHhtbAotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNYXBwaW5nTm9VbmRlcnlsaW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QmFzaWNNYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb3JtQmFzaWNNYXBwaW5nLnNldE5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1CYXNpY01hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1CYXNpY01hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1CYXNpY01hcHBpbmcuaXNPcHRpb25hbCgpKTsKLQotCQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29sdW1uLmdldERlZmF1bHRTY2FsZSgpKTsKLQl9Ci0JCi0JLy9AQmFzaWMoZmV0Y2g9RmV0Y2hUeXBlLkxBWlksIG9wdGlvbmFsPWZhbHNlKQotCS8vQENvbHVtbihuYW1lPSJNWV9DT0xVTU4iLCB1bmlxdWU9dHJ1ZSwgbnVsbGFibGU9ZmFsc2UsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSwgCi0JLy8gICAgY29sdW1uRGVmaW5pdGlvbj0iQ09MVU1OX0RFRklOSVRJT04iLCB0YWJsZT0iTVlfVEFCTEUiLCBsZW5ndGg9NSwgcHJlY2lzaW9uPTYsIHNjYWxlPTcpIik7Ci0JLy9AQ29sdW1uKAotCS8vQExvYgotCS8vQFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FU1RBTVApCi0JLy9ARW51bWVyYXRlZChFbnVtVHlwZS5TVFJJTkcpCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlCYXNpY01hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImlkIiwgYmFzaWNNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCYXNlRW51bWVyYXRlZENvbnZlcnRlci5jbGFzcywgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0RW51bVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQkKLQkJQ29sdW1uIGNvbHVtbiA9IGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCBjb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFIiwgY29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCBjb2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDYpLCBjb2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDcpLCBjb2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlCYXNpY01hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImlkIiwgYmFzaWNNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIGJhc2ljTWFwcGluZy5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0VHJ1ZShiYXNpY01hcHBpbmcuaXNPcHRpb25hbCgpKTsKLQkJCi0JCUNvbHVtbiBjb2x1bW4gPSBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRUcnVlKGNvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBjb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgY29sdW1uLmdldFNjYWxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QmFzaWNNYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1CYXNpY01hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1CYXNpY01hcHBpbmcuZ2V0RGVmYXVsdEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQmFzaWNNYXBwaW5nLmlzRGVmYXVsdE9wdGlvbmFsKCkpOwotCQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIG9ybUNvbHVtbi5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29sdW1uLmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOwotCi0JfQotCS8vMyB0aGluZ3MgdGVzdGVkIGFib3ZlCi0JLy8xLiB2aXJ0dWFsIG1hcHBpbmcgbWV0YWRhdGEgY29tcGxldGU9ZmFsc2UgLSBkZWZhdWx0cyBhcmUgdGFrZW4gZnJvbSB0aGUgamF2YSBhbm5vdGF0aW9ucwotCS8vMi4gdmlydHVhbCBtYXBwaW5nIG1ldGFkYXRhIGNvbXBsZXRlPXRydWUgLSBkZWZhdWx0cyBhcmUgdGFrZW4gZnJvbSBqYXZhIGRlZmF1bHRzLGFubm90YXRpb25zIGlnbm9yZWQKLQkvLzMuIHNwZWNpZmllZCBtYXBwaW5nIChtZXRhZGF0YSBjb21wbGV0ZT10cnVlL2ZhbHNlIC0gZGVmYXVsdHMgYXJlIHRha2VuIGZyb20gamF2YSBhbm5vdGF0aW9ucwotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUJhc2ljTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlCYXNpY01hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlCYXNpY01hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlCYXNpY01hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlCYXNpY01hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlCYXNpY01hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QmFzaWNNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QmFzaWNNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUJhc2ljTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQ2FzY2FkZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQ2FzY2FkZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMjU2NmMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUNhc2NhZGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9ybUNhc2NhZGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybUNhc2NhZGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYXNjYWRlQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmUgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCUNhc2NhZGUgY2FzY2FkZSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKLQkJCi0JCS8vc2V0IGNhc2NhZGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXNjYWRlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnROb3ROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JCQkJCi0JCS8vc2V0IGFsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLnNldENhc2NhZGVBbGwodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZUFsbCgpKTsKLQkJCi0JCS8vc2V0IGFsbCB0byBmYWxzZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLnNldENhc2NhZGVBbGwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZUFsbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCUNhc2NhZGUgY2FzY2FkZSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKLQkJCQkJCi0JCS8vc2V0IGFsbCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJY2FzY2FkZS5zZXRBbGwodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZUFsbCgpKTsKLQkKLQkJLy9zZXQgYWxsIHRvIGZhbHNlIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWNhc2NhZGUuc2V0QWxsKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYXNjYWRlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwotCQkKLQkJLy9zZXQgY2FzY2FkZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlvbmVUb09uZS5zZXRDYXNjYWRlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhc2NhZGVUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnROb3ROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JCQkJCi0JCS8vc2V0IFBlcnNpc3QgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvT25lLmdldENhc2NhZGUoKS5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCQotCQkvL3NldCBQZXJzaXN0IHRvIGZhbHNlIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb09uZS5nZXRDYXNjYWRlKCkuc2V0Q2FzY2FkZVBlcnNpc3QoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9uZVRvT25lLmdldENhc2NhZGUoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCUNhc2NhZGUgY2FzY2FkZSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JCQkJCQotCQkvL3NldCBQZXJzaXN0IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQljYXNjYWRlLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9uZVRvT25lLmdldENhc2NhZGUoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQotCQkvL3NldCBQZXJzaXN0IHRvIGZhbHNlIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWNhc2NhZGUuc2V0UGVyc2lzdChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhc2NhZGVNZXJnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKLQkJCi0JCS8vc2V0IGNhc2NhZGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXNjYWRlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydE5vdE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKLQkJCQkKLQkJLy9zZXQgTWVyZ2UgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvT25lLmdldENhc2NhZGUoKS5zZXRDYXNjYWRlTWVyZ2UodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvbmVUb09uZS5nZXRDYXNjYWRlKCkuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQkvL3NldCBNZXJnZSB0byBmYWxzZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9uZVRvT25lLmdldENhc2NhZGUoKS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVNZXJnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JCQkJCQotCQkvL3NldCBNZXJnZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJY2FzY2FkZS5zZXRNZXJnZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9uZVRvT25lLmdldENhc2NhZGUoKS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkKLQkJLy9zZXQgTWVyZ2UgdG8gZmFsc2UgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJY2FzY2FkZS5zZXRNZXJnZShmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYXNjYWRlUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmUgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCUNhc2NhZGUgY2FzY2FkZSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKLQkJCi0JCS8vc2V0IGNhc2NhZGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXNjYWRlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnROb3ROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JCQkJCi0JCS8vc2V0IFJlbW92ZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLnNldENhc2NhZGVSZW1vdmUodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkJCi0JCS8vc2V0IFJlbW92ZSB0byBmYWxzZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLnNldENhc2NhZGVSZW1vdmUoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCUNhc2NhZGUgY2FzY2FkZSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKLQkJCQkJCi0JCS8vc2V0IFJlbW92ZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJY2FzY2FkZS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkKLQkJLy9zZXQgUmVtb3ZlIHRvIGZhbHNlIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWNhc2NhZGUuc2V0UmVtb3ZlKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYXNjYWRlUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwotCQkKLQkJLy9zZXQgY2FzY2FkZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlvbmVUb09uZS5zZXRDYXNjYWRlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhc2NhZGVUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnROb3ROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JCQkJCi0JCS8vc2V0IFJlZnJlc2ggaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvT25lLmdldENhc2NhZGUoKS5zZXRDYXNjYWRlUmVmcmVzaCh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZVJlZnJlc2goKSk7Ci0JCQotCQkvL3NldCBSZWZyZXNoIHRvIGZhbHNlIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb09uZS5nZXRDYXNjYWRlKCkuc2V0Q2FzY2FkZVJlZnJlc2goZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9uZVRvT25lLmdldENhc2NhZGUoKS5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCUNhc2NhZGUgY2FzY2FkZSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JCQkJCQotCQkvL3NldCBSZWZyZXNoIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQljYXNjYWRlLnNldFJlZnJlc2godHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9uZVRvT25lLmdldENhc2NhZGUoKS5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCQotCQkvL3NldCBSZWZyZXNoIHRvIGZhbHNlIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWNhc2NhZGUuc2V0UmVmcmVzaChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUNvbHVtblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQ29sdW1uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkwM2QzNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQ29sdW1uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JtQ29sdW1uVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1Db2x1bW5UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpYy5zZXRDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uKCkpOwotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWJhc2ljLmdldENvbHVtbigpLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWJhc2ljLmdldENvbHVtbigpLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGJhc2ljLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0KLQkJYmFzaWMuc2V0Q29sdW1uKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpYy5zZXRDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uKCkpOwotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWJhc2ljLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCWJhc2ljLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGJhc2ljLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0KLQkJYmFzaWMuc2V0Q29sdW1uKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYmFzaWMuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbigpKTsKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0VGFibGUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRUYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRUYWJsZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGJhc2ljLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCi0JCWJhc2ljLnNldENvbHVtbihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYmFzaWMuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbigpKTsKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0TnVsbGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXROdWxsYWJsZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXROdWxsYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0TnVsbGFibGUoKSk7Ci0JCQotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGJhc2ljLmdldENvbHVtbigpLmdldE51bGxhYmxlKCkpOwotCi0JCWJhc2ljLnNldENvbHVtbihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0TnVsbGFibGUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpYy5zZXRDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uKCkpOwotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRVcGRhdGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0VXBkYXRhYmxlKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWJhc2ljLmdldENvbHVtbigpLnNldFVwZGF0YWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpLmdldFVwZGF0YWJsZSgpKTsKLQkJCi0JCWJhc2ljLmdldENvbHVtbigpLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRVcGRhdGFibGUoKSk7Ci0KLQkJYmFzaWMuc2V0Q29sdW1uKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVXBkYXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGJhc2ljLmdldENvbHVtbigpLmdldFVwZGF0YWJsZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRJbnNlcnRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpYy5zZXRDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uKCkpOwotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRJbnNlcnRhYmxlKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWJhc2ljLmdldENvbHVtbigpLnNldEluc2VydGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0SW5zZXJ0YWJsZSgpKTsKLQkJCi0JCWJhc2ljLmdldENvbHVtbigpLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGJhc2ljLmdldENvbHVtbigpLmdldEluc2VydGFibGUoKSk7Ci0KLQkJYmFzaWMuc2V0Q29sdW1uKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0SW5zZXJ0YWJsZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYmFzaWMuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbigpKTsKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0VW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGJhc2ljLmdldENvbHVtbigpLmdldFVuaXF1ZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRVbmlxdWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKS5nZXRVbmlxdWUoKSk7Ci0JCQotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0VW5pcXVlKCkpOwotCi0JCWJhc2ljLnNldENvbHVtbihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRVbmlxdWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpYy5zZXRDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uKCkpOwotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4KSwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWJhc2ljLmdldENvbHVtbigpLnNldExlbmd0aChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJCi0JCWJhc2ljLmdldENvbHVtbigpLnNldExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoMTEpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMSksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTEpLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0KLQkJYmFzaWMuc2V0Q29sdW1uKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig3KSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNyksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNyksIGJhc2ljLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkTGVuZ3RoKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkUHJlY2lzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWJhc2ljLnNldENvbHVtbihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW4oKSk7Ci0JCWJhc2ljLmdldENvbHVtbigpLnNldFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoOCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgpLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0UHJlY2lzaW9uKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQkKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0UHJlY2lzaW9uKEludGVnZXIudmFsdWVPZigxMSkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDExKSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMSksIGJhc2ljLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQotCQliYXNpYy5zZXRDb2x1bW4obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRQcmVjaXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUNvbHVtbi5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDcpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUNvbHVtbi5zZXRTcGVjaWZpZWRQcmVjaXNpb24obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTY2FsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpYy5zZXRDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uKCkpOwotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoOCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoOCksIGJhc2ljLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWJhc2ljLmdldENvbHVtbigpLnNldFNjYWxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoMTEpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMSksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMSksIGJhc2ljLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCWJhc2ljLnNldENvbHVtbihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFNjYWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDcpLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkU2NhbGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUl0ZXJhdG9yPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXR0cmlidXRlcy5uZXh0KCk7CQotCQkKLQkJLy92aXJ0dWFsIGF0dHJpYnV0ZSBpbiBvcm0ueG1sLCBqYXZhIGF0dHJpYnV0ZSBoYXMgbm8gQ29sdW1uIGFubm90YXRpb24KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG5hbWVQZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBuYW1lVmlydHVhbE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBuYW1lUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQkKLQkJQ29sdW1uIHZpcnR1YWxDb2x1bW4gPSBuYW1lVmlydHVhbE1hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxDb2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgdmlydHVhbENvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgdmlydHVhbENvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1NDQUxFLCB2aXJ0dWFsQ29sdW1uLmdldFNjYWxlKCkpOwotCQotCQkvL3NldCBDb2x1bW4gYW5ub3RhdGlvbiBpbiBKYXZhCi0JCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibmFtZSIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUNvbHVtbiBqYXZhQ29sdW1uID0gamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJGT09fVEFCTEUiKTsKLQkJamF2YUNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFDb2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDQ1KSk7Ci0JCWphdmFDb2x1bW4uc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJbmFtZVZpcnR1YWxNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgbmFtZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkJCi0JCXZpcnR1YWxDb2x1bW4gPSBuYW1lVmlydHVhbE1hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbENvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPT19UQUJMRSIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxDb2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQ1LCB2aXJ0dWFsQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQ2LCB2aXJ0dWFsQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDQ3LCB2aXJ0dWFsQ29sdW1uLmdldFNjYWxlKCkpOwotCi0JCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlLCBvcm0ueG1sIHZpcnR1YWwgY29sdW1uIGlnbm9yZXMgamF2YSBjb2x1bW4gYW5ub3RhdGlvbgotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQluYW1lVmlydHVhbE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBuYW1lUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQkKLQkJdmlydHVhbENvbHVtbiA9IG5hbWVWaXJ0dWFsTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbENvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxDb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbENvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfTEVOR1RILCB2aXJ0dWFsQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCB2aXJ0dWFsQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIHZpcnR1YWxDb2x1bW4uZ2V0U2NhbGUoKSk7Ci0JCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCW5hbWVWaXJ0dWFsTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG5hbWVQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQl2aXJ0dWFsQ29sdW1uID0gbmFtZVZpcnR1YWxNYXBwaW5nLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9MRU5HVEgsIHZpcnR1YWxDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIHZpcnR1YWxDb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9TQ0FMRSwgdmlydHVhbENvbHVtbi5nZXRTY2FsZSgpKTsKLQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCW5hbWVWaXJ0dWFsTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG5hbWVQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQl2aXJ0dWFsQ29sdW1uID0gbmFtZVZpcnR1YWxNYXBwaW5nLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9MRU5HVEgsIHZpcnR1YWxDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIHZpcnR1YWxDb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9TQ0FMRSwgdmlydHVhbENvbHVtbi5nZXRTY2FsZSgpKTsKLQkJCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlIGZhbHNlLCBvcm0ueG1sIHZpcnR1YWwgY29sdW1uIGdldHMgc2V0dGluZyBmcm9tIGphdmEgYW5ub3RhdGlvbgotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQluYW1lVmlydHVhbE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBuYW1lUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQkKLQkJdmlydHVhbENvbHVtbiA9IG5hbWVWaXJ0dWFsTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PX1RBQkxFIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxDb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbENvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxDb2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxDb2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoNDUsIHZpcnR1YWxDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNDYsIHZpcnR1YWxDb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNDcsIHZpcnR1YWxDb2x1bW4uZ2V0U2NhbGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmFtZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibmFtZSIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCU9ybUJhc2ljTWFwcGluZyBuYW1lVmlydHVhbE1hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBuYW1lUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG5hbWVWaXJ0dWFsTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkKLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoSmF2YUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm5hbWUiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFDb2x1bW4gamF2YUNvbHVtbiA9IGphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCWphdmFDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CQkKLQkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFDb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFDb2x1bW4uc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig0NSkpOwotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNDYpKTsKLQkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNDcpKTsKLQotCQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfTEVOR1RILCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXREZWZhdWx0U2NhbGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbENvbHVtblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJLy92aXJ0dWFsIGF0dHJpYnV0ZSBpbiBvcm0ueG1sLCBqYXZhIGF0dHJpYnV0ZSBoYXMgbm8gQ29sdW1uIGFubm90YXRpb24KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG5hbWVPcm1BdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibmFtZSIpOwotCQlCYXNpY01hcHBpbmcgbmFtZVZpcnR1YWxNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgbmFtZU9ybUF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlDb2x1bW4gdmlydHVhbENvbHVtbiA9IG5hbWVWaXJ0dWFsTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCS8vc2V0IENvbHVtbiB0YWJsZSBlbGVtZW50IGluIEphdmEKLQkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIikuZ2V0TWFwcGluZygpOwotCQlqYXZhQmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJKQVZBX1RBQkxFIik7CQotCQluYW1lVmlydHVhbE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBuYW1lT3JtQXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCXZpcnR1YWxDb2x1bW4gPSBuYW1lVmlydHVhbE1hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9UQUJMRSIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQkvL21ha2UgbmFtZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBub3QgZGVmYXVsdAotCQluYW1lT3JtQXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm5hbWUiKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJQmFzaWNNYXBwaW5nIG5hbWVTcGVjaWZpZWRNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgbmFtZU9ybUF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlDb2x1bW4gc3BlY2lmaWVkQ29sdW1uID0gbmFtZVNwZWNpZmllZE1hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydE51bGwoc3BlY2lmaWVkQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9UQUJMRSIsIHNwZWNpZmllZENvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFIiwgc3BlY2lmaWVkQ29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQotLy9wdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVOb0phdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLS8vCQotLy8JT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotLy8JWG1sRW50aXR5IHhtbEVudGl0eSA9IChYbWxFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCWFzc2VydEVxdWFscygiRm9vIiwgeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vL30KLS8vCi0vL3B1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZUZyb21QYXJlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLS8vCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0vLwkKLS8vCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0vLwlYbWxFbnRpdHkgcGFyZW50WG1sRW50aXR5ID0gKFhtbEVudGl0eSkgcGFyZW50T3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JWG1sRW50aXR5IGNoaWxkWG1sRW50aXR5ID0gKFhtbEVudGl0eSkgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0vLwkKLS8vCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQotLy8JcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0vLwlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCWFzc2VydEVxdWFscygiRk9PIiwgY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCi0vLwlwYXJlbnRYbWxFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLS8vCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGNoaWxkWG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vL30KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1EaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1EaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1MmFhMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRGlzY3JpbWluYXRvckNvbHVtblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1EaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9ybURpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybURpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBhYnN0cmFjdCBjbGFzcyAiKS5hcHBlbmQoVFlQRV9OQU1FKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCBGSUxFX05BTUUsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRGlzY3JpbWluYXRvckNvbHVtbiBvcm1Db2x1bW4gPSBvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1EaXNjcmltaW5hdG9yQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQl9Ci0JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tSmF2YVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCQotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCVhtbEVudGl0eSBvcm1FbnRpdHkgPSAoWG1sRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJCi0vLwkJb3JtRW50aXR5LmphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZvbyIpOwotLy8JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJCi0vLwkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCi0vLwkJb3JtRW50aXR5LmVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLS8vCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQotLy8JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JCQotLy8JCW9ybUVudGl0eS5lbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotLy8JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJCi0vLwkJb3JtRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQmFyIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZU5vSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLS8vCQkKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0vLwkJWG1sRW50aXR5IG9ybUVudGl0eSA9IChYbWxFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JfQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tUGFyZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0vLwkJCi0vLwkJT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50T3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0vLwkJWG1sRW50aXR5IHBhcmVudFhtbEVudGl0eSA9IChYbWxFbnRpdHkpIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQlYbWxFbnRpdHkgY2hpbGRYbWxFbnRpdHkgPSAoWG1sRW50aXR5KSBjaGlsZE9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JCQotLy8JCXBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCi0vLwkJcGFyZW50WG1sRW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGNoaWxkWG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRGlzY3JpbWluYXRvckNvbHVtbiBvcm1Db2x1bW4gPSBvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLnNldERpc2NyaW1pbmF0b3JDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoOCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgpLCBlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRMZW5ndGgobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoMTEpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMSksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTEpLCBlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCi0JCWVudGl0eVJlc291cmNlLnNldERpc2NyaW1pbmF0b3JDb2x1bW4obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1EaXNjcmltaW5hdG9yQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUNvbHVtbi5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkTGVuZ3RoKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRGlzY3JpbWluYXRvckNvbHVtbiBvcm1Db2x1bW4gPSBvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1EaXNjcmltaW5hdG9yQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1EaXNjcmltaW5hdG9yQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBkaXNjcmltaW5hdG9yIHR5cGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLnNldERpc2NyaW1pbmF0b3JDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldERpc2NyaW1pbmF0b3JUeXBlKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUuU1RSSU5HKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLlNUUklORywgb3JtQ29sdW1uLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5EaXNjcmltaW5hdG9yVHlwZS5TVFJJTkcsIGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQkKLQkJLy9zZXQgZGlzY3JpbWluYXRvciB0eXBlIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXREaXNjcmltaW5hdG9yVHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldERpc2NyaW1pbmF0b3JUeXBlKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUuQ0hBUik7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5DSEFSLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkRpc2NyaW1pbmF0b3JUeXBlLkNIQVIsIGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybURpc2NyaW1pbmF0b3JDb2x1bW4gb3JtQ29sdW1uID0gb3JtRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQkJCi0JCS8vc2V0IGRpc2NyaW1pbmF0b3IgdHlwZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUNvbHVtbi5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS5TVFJJTkcpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvclR5cGUuU1RSSU5HLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkRpc2NyaW1pbmF0b3JUeXBlLlNUUklORywgZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJLy9zZXQgZGlzY3JpbWluYXRvciB0eXBlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdHNOb0Rpc2NyaW1pbmF0b3JDb2x1bW5JbkphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBhYnN0cmFjdEVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBjaGlsZFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi4iICsgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCU9ybUVudGl0eSBjaGlsZEVudGl0eSA9IChPcm1FbnRpdHkpIGNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCi0JCS8vdGVzdCBkZWZhdWx0cyB3aXRoIHNpbmdsZS10YWJsZSBpbmhlcml0YW5jZSwgbm8gc3BlY2lmaWVkIGRpc2NyaW1pbmF0b3IgY29sdW1uIHNldAotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTkFNRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGNoaWxkRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX05BTUUsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEgsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0RJU0NSSU1JTkFUT1JfVFlQRSwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQotCQkKLQkJLy90ZXN0IGRlZmF1bHRzIHdpdGggc2luZ2xlLXRhYmxlIGluaGVyaXRhbmNlLCBzcGVjaWZpZWQgZGlzY3JpbWluYXRvciBjb2x1bW4gc2V0IG9uIHJvb3QKLQkJYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkRUWVBFMiIpOwotCQlhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS5DSEFSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBhYnN0cmFjdEVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9OQU1FLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTEVOR1RILCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9ESVNDUklNSU5BVE9SX1RZUEUsIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiRFRZUEUyIiwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5DSEFSLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscygiRFRZUEUyIiwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5DSEFSLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJCi0JCS8vdGVzdCBkZWZhdWx0cyB3aXRoIHRhYmxlLXBlci1jbGFzcyBpbmhlcml0YW5jZSwgZGlzY3JpbWluYXRvciBjb2x1bW4gZG9lcyBub3QgYXBwbHkKLQkJYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7Ci0JCWFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShudWxsKTsKLQkJYWJzdHJhY3RFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJCi0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTLCBhYnN0cmFjdEVudGl0eS5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGNoaWxkRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdHNEaXNjcmltaW5hdG9yQ29sdW1uSW5KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuIiArICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlPcm1FbnRpdHkgY2hpbGRFbnRpdHkgPSAoT3JtRW50aXR5KSBjaGlsZFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCSgoRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJKChFbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQkoKEVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUuQ0hBUik7Ci0JCQotCQkvL3Rlc3QgZGVmYXVsdHMgd2l0aCBzaW5nbGUtdGFibGUgaW5oZXJpdGFuY2UsIHNwZWNpZmllZCBkaXNjcmltaW5hdG9yIGNvbHVtbiBzZXQgaW4gamF2YQotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5DSEFSLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGNoaWxkRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvclR5cGUuQ0hBUiwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQotCQkKLQkJLy90ZXN0IGRlZmF1bHRzIHdpdGggc2luZ2xlLXRhYmxlIGluaGVyaXRhbmNlLCBzcGVjaWZpZWQgZGlzY3JpbWluYXRvciBjb2x1bW4gc2V0IGluIGphdmEsIG1ldGFkYXRhLWNvbXBsZXRlIHRydWUKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTkFNRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGNoaWxkRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX05BTUUsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEgsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0RJU0NSSU1JTkFUT1JfVFlQRSwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQkJCi0JCQotCQkvL3Rlc3QgZGVmYXVsdHMgd2l0aCBzaW5nbGUtdGFibGUgaW5oZXJpdGFuY2UsIHNwZWNpZmllZCBkaXNjcmltaW5hdG9yIGNvbHVtbiBzZXQgaW4gb3JtCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQlhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTkFNRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGNoaWxkRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUiwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmOTYzYzMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JtRW1iZWRkYWJsZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtRW1iZWRkYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbWJlZGRhYmxlIG9ybUVtYmVkZGFibGUgPSAoT3JtRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtRW1iZWRkYWJsZS5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZW1iZWRkYWJsZVJlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQkJCi0JCS8vc2V0IGNsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbWJlZGRhYmxlUmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKCJjb20uQmFyIik7Ci0JCWFzc2VydEVxdWFscygiY29tLkJhciIsIG9ybUVtYmVkZGFibGUuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoImNvbS5CYXIiLCBlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCQotCQkvL3NldCBjbGFzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbWJlZGRhYmxlUmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVtYmVkZGFibGUuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVtYmVkZGFibGUgb3JtRW1iZWRkYWJsZSA9IChPcm1FbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1FbWJlZGRhYmxlLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJLy9zZXQgY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1FbWJlZGRhYmxlLnNldENsYXNzKCJjb20uQmFyIik7Ci0JCWFzc2VydEVxdWFscygiY29tLkJhciIsIG9ybUVtYmVkZGFibGUuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoImNvbS5CYXIiLCBlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJLy9zZXQgY2xhc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbWJlZGRhYmxlLnNldENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVtYmVkZGFibGUuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JfQotCS8vVE9ETyBhZGQgdGVzdHMgZm9yIHNldHRpbmcgdGhlIGNsYXNzTmFtZSB3aGVuIHRoZSBwYWNrYWdlIGlzIHNldCBvbiBlbnRpdHktbWFwcGluZ3MKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbWJlZGRhYmxlUmVzb3VyY2Uuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQsIGVtYmVkZGFibGVSZXNvdXJjZS5nZXRBY2Nlc3MoKSk7Ci0JCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbWJlZGRhYmxlUmVzb3VyY2Uuc2V0QWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCX0KLQkvL1RPRE8gdGVzdCBkZWZhdWx0IGFjY2VzcyBmcm9tCi0JCS8vdW5kZXJseWluZyBqYXZhCi0JCS8vcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cwotCQkvL2VudGl0eS1tYXBwaW5ncwotCQkvL3dpdGggeG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUgc2V0Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbWJlZGRhYmxlIG9ybUVtYmVkZGFibGUgPSAoT3JtRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwoZW1iZWRkYWJsZVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW1iZWRkYWJsZVJlc291cmNlLnNldE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkKLQkJLy9zZXQgYWNjZXNzIHRvIGZhbHNlIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbWJlZGRhYmxlUmVzb3VyY2Uuc2V0TWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJZW1iZWRkYWJsZVJlc291cmNlLnNldE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVtYmVkZGFibGUgb3JtRW1iZWRkYWJsZSA9IChPcm1FbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUVtYmVkZGFibGUuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtRW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgZW1iZWRkYWJsZVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQlvcm1FbWJlZGRhYmxlLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbWJlZGRhYmxlIG9ybUVtYmVkZGFibGUgPSAoT3JtRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRGYWxzZShvcm1FbWJlZGRhYmxlLmlzT3ZlcnJpZGVNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRUcnVlKG9ybUVtYmVkZGFibGUuaXNPdmVycmlkZU1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJYXNzZXJ0TnVsbChvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUVtYmVkZGFibGUuaXNPdmVycmlkZU1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZW1iZWRkYWJsZVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW1iZWRkYWJsZSBvcm1FbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW1iZWRkYWJsZS5pc01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZW1iZWRkYWJsZVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCWFzc2VydFRydWUob3JtRW1iZWRkYWJsZS5pc01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW1iZWRkYWJsZS5pc01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZUVtYmVkZGFibGVFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWVtYmVkZGFibGUuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQotCQllbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbnRpdHkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHkuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW50aXR5LmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtRW50aXR5LmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBlbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQkJCi0JLy90ZXN0IHdpdGggMiBFbWJlZGRhYmxlcywgbWFrZSB0aGUgc2Vjb25kIG9uZSBhbiBFbnRpdHkgc28gaXQgaGFzIHRvIG1vdmUgdG8gdGhlIGZyb250IG9mIHRoZSBsaXN0Ci0JcHVibGljIHZvaWQgdGVzdE1ha2VFbWJlZGRhYmxlRW50aXR5MigpIHRocm93cyBFeGNlcHRpb24gewotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzIiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWVtYmVkZGFibGUuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQotCQllbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbnRpdHkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHkuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW50aXR5LmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtRW50aXR5LmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBlbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRUeXBlPiBwZXJzaXN0ZW50VHlwZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudFR5cGVzLm5leHQoKS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50VHlwZXMubmV4dCgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlRW1iZWRkYWJsZU1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWVtYmVkZGFibGUuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQotCQllbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgIG1hcHBlZFN1cGVyY2xhc3MgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBtYXBwZWRTdXBlcmNsYXNzLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGVkU3VwZXJjbGFzcy5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBtYXBwZWRTdXBlcmNsYXNzLmdldEFjY2VzcygpKTsKLQkKLQkJT3JtTWFwcGVkU3VwZXJjbGFzcyBvcm1NYXBwZWRTdXBlcmNsYXNzID0gKE9ybU1hcHBlZFN1cGVyY2xhc3MpIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JfQotCQotCS8vdGVzdCB3aXRoIDIgRW1iZWRkYWJsZXMsIG1ha2UgdGhlIHNlY29uZCBvbmUgYSBNYXBwZWRTdXBlcmNsYXNzIHNvIGl0IGhhcyB0byBtb3ZlIHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdAotCXB1YmxpYyB2b2lkIHRlc3RNYWtlRW1iZWRkYWJsZU1hcHBlZFN1cGVyY2xhc3MyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoT3JtRW1iZWRkYWJsZSkgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJZW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCi0JCWVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyAgbWFwcGVkU3VwZXJjbGFzcyA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwZWRTdXBlcmNsYXNzLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIG1hcHBlZFN1cGVyY2xhc3MuZ2V0QWNjZXNzKCkpOwotCQotCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1NYXBwZWRTdXBlcmNsYXNzLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gcGVyc2lzdGVudFR5cGVzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudFR5cGVzLm5leHQoKS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50VHlwZXMubmV4dCgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkSWRNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZDAxNWQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkSWRNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1FbWJlZGRlZElkTWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX05BTUUgPSAiY2l0eSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSA9ICJFX0NJVFkiOwotCi0JcHVibGljIE9ybUVtYmVkZGVkSWRNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuRU1CRURERURfSUQsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZElkIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIiwgY29sdW1uPUBDb2x1bW4obmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX05BTUUgKyAiXCIpKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuQ09MVU1OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQENvbHVtbihuYW1lPVwiQV9TVEFURVwiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9CQotCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlYbWxQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKElNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZElkTWFwcGluZyIpOwotLy8JCVhtbEVtYmVkZGVkSWRNYXBwaW5nIHhtbEVtYmVkZGVkSWRNYXBwaW5nID0gKFhtbEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLS8vCQlFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZElkTWFwcGluZyIsIHhtbEVtYmVkZGVkSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZElkTWFwcGluZyIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXROYW1lKCkpOwotLy8JCQkJCi0vLwkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLS8vCQllbWJlZGRlZElkUmVzb3VyY2Uuc2V0TmFtZSgibmV3TmFtZSIpOwotLy8JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIHhtbEVtYmVkZGVkSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgZW1iZWRkZWRJZFJlc291cmNlLmdldE5hbWUoKSk7Ci0vLwkKLS8vCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0vLwkJZW1iZWRkZWRJZFJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0vLwkJYXNzZXJ0TnVsbCh4bWxFbWJlZGRlZElkTWFwcGluZy5nZXROYW1lKCkpOwotLy8JCWFzc2VydE51bGwoZW1iZWRkZWRJZFJlc291cmNlLmdldE5hbWUoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotLy8JCVhtbFBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoSU1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkSWRNYXBwaW5nIik7Ci0vLwkJWG1sRW1iZWRkZWRJZE1hcHBpbmcgeG1sRW1iZWRkZWRJZE1hcHBpbmcgPSAoWG1sRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotLy8JCUVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkSWRNYXBwaW5nIiwgeG1sRW1iZWRkZWRJZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkSWRNYXBwaW5nIiwgZW1iZWRkZWRJZFJlc291cmNlLmdldE5hbWUoKSk7Ci0vLwkJCQkKLS8vCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotLy8JCXhtbEVtYmVkZGVkSWRNYXBwaW5nLnNldE5hbWUoIm5ld05hbWUiKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCB4bWxFbWJlZGRlZElkTWFwcGluZy5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXROYW1lKCkpOwotLy8JCi0vLwkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0vLwkJeG1sRW1iZWRkZWRJZE1hcHBpbmcuc2V0TmFtZShudWxsKTsKLS8vCQlhc3NlcnROdWxsKHhtbEVtYmVkZGVkSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0TnVsbChlbWJlZGRlZElkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotLy8JCVhtbFBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoSU1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkSWRNYXBwaW5nIik7Ci0vLwkJWG1sRW1iZWRkZWRJZE1hcHBpbmcgeG1sRW1iZWRkZWRJZE1hcHBpbmcgPSAoWG1sRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotLy8JCUVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLS8vCQkKLS8vCQlYbWxBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IHhtbEVtYmVkZGVkSWRNYXBwaW5nLmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDApOwotLy8JCW9ybVJlc291cmNlKCkuc2F2ZShudWxsKTsKLS8vCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLS8vCQlvcm1SZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0vLwkJCQkKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQlYbWxBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZTIgPSB4bWxFbWJlZGRlZElkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKTsKLS8vCQlvcm1SZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0vLwkJYXR0cmlidXRlT3ZlcnJpZGUyLnNldE5hbWUoIkJBUiIpOwotLy8JCW9ybVJlc291cmNlKCkuc2F2ZShudWxsKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQlYbWxBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZTMgPSB4bWxFbWJlZGRlZElkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgxKTsKLS8vCQlvcm1SZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0vLwkJYXR0cmlidXRlT3ZlcnJpZGUzLnNldE5hbWUoIkJBWiIpOwotLy8JCW9ybVJlc291cmNlKCkuc2F2ZShudWxsKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQlMaXN0SXRlcmF0b3I8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHhtbEVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscyhhdHRyaWJ1dGVPdmVycmlkZTIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpOwotLy8JCWFzc2VydEVxdWFscyhhdHRyaWJ1dGVPdmVycmlkZTMsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpOwotLy8JCWFzc2VydEVxdWFscyhhdHRyaWJ1dGVPdmVycmlkZSwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSk7Ci0vLwkJCi0vLwkJYXR0cmlidXRlT3ZlcnJpZGVzID0geG1sRW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlYbWxQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKElNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZElkTWFwcGluZyIpOwotLy8JCVhtbEVtYmVkZGVkSWRNYXBwaW5nIHhtbEVtYmVkZGVkSWRNYXBwaW5nID0gKFhtbEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLS8vCQlFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0vLwotLy8JCXhtbEVtYmVkZGVkSWRNYXBwaW5nLmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDApLnNldE5hbWUoIkZPTyIpOwotLy8JCXhtbEVtYmVkZGVkSWRNYXBwaW5nLmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDEpLnNldE5hbWUoIkJBUiIpOwotLy8JCXhtbEVtYmVkZGVkSWRNYXBwaW5nLmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDIpLnNldE5hbWUoIkJBWiIpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscygzLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLS8vCQkKLS8vCQl4bWxFbWJlZGRlZElkTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKTsKLS8vCQlhc3NlcnRFcXVhbHMoMiwgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0vLwotLy8JCXhtbEVtYmVkZGVkSWRNYXBwaW5nLnJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDApOwotLy8JCWFzc2VydEVxdWFscygxLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQl4bWxFbWJlZGRlZElkTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKTsKLS8vCQlhc3NlcnRFcXVhbHMoMCwgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0vLwkJWG1sUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShJTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRJZE1hcHBpbmciKTsKLS8vCQlYbWxFbWJlZGRlZElkTWFwcGluZyB4bWxFbWJlZGRlZElkTWFwcGluZyA9IChYbWxFbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0vLwkJRW1iZWRkZWRJZCBlbWJlZGRlZElkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOwotLy8KLS8vCQl4bWxFbWJlZGRlZElkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKS5zZXROYW1lKCJGT08iKTsKLS8vCQl4bWxFbWJlZGRlZElkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgxKS5zZXROYW1lKCJCQVIiKTsKLS8vCQl4bWxFbWJlZGRlZElkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgyKS5zZXROYW1lKCJCQVoiKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoMywgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwkJCi0vLwkJCi0vLwkJeG1sRW1iZWRkZWRJZE1hcHBpbmcubW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDIsIDApOwotLy8JCUxpc3RJdGVyYXRvcjxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0geG1sRW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotLy8KLS8vCi0vLwkJeG1sRW1iZWRkZWRJZE1hcHBpbmcubW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDAsIDEpOwotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHhtbEVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8KLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlYbWxQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKElNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZElkTWFwcGluZyIpOwotLy8JCVhtbEVtYmVkZGVkSWRNYXBwaW5nIHhtbEVtYmVkZGVkSWRNYXBwaW5nID0gKFhtbEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLS8vCQlFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0vLwkJCi0vLwkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLS8vCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotLy8JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0vLwkJCi0vLwkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLS8vCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotLy8JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0vLwotLy8JCUxpc3RJdGVyYXRvcjxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0geG1sRW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0vLwkJCi0vLwkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMiwgMCk7Ci0vLwkJYXR0cmlidXRlT3ZlcnJpZGVzID0geG1sRW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0vLwotLy8JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDAsIDEpOwotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHhtbEVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotLy8KLS8vCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHhtbEVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotLy8KLS8vCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHhtbEVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotLy8JCQotLy8JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0vLwkJYXNzZXJ0RmFsc2UoeG1sRW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKLS8vCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRJZE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRJZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZElkTW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkSWRNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRJZE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRJZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZElkTW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygib3ZlcnJpZGUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk9WRVJSSURFX0NPTFVNTiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZElkTW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRJZE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkSWRNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZElkTW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRW1iZWRkZWRJZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBlbWJlZGRlZFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVtYmVkZGVkUmVzb3VyY2Uuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVtYmVkZGVkUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRlZFJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbWJlZGRlZElkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtRW1iZWRkZWRNYXBwaW5nLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVtYmVkZGVkTWFwcGluZy5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGVkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRW1iZWRkZWRJZE1hcHBpbmcgb3JtRW1iZWRkZWRJZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9ybUVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCVhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0KLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJCi0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7CQkKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMCwgMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRW1iZWRkZWRJZE1hcHBpbmcgb3JtRW1iZWRkZWRJZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9ybUVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCVhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0JCQotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQkKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMiwgMCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDAsIDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkTWFwcGluZ05vVW5kZXJ5bGluZ0phdmFBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKSwgTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT3JtRW1iZWRkZWRJZE1hcHBpbmcgb3JtRW1iZWRkZWRJZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvcm1FbWJlZGRlZElkTWFwcGluZy5zZXROYW1lKCJmb28iKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1FbWJlZGRlZElkTWFwcGluZy5nZXROYW1lKCkpOwotCi0JCQotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW1iZWRkYWJsZUFkZHJlc3NUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRV8gKyAiQWRkcmVzcyIpOwotCQkKLQkJLy9lbWJlZGRlZCBtYXBwaW5nIGlzIHZpcnR1YWwsIGF0dHJpYnV0ZSBvdmVycmlkZXMgc2hvdWxkIGV4aXN0Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQotCQlMaXN0SXRlcmF0b3I8SmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGphdmFFbWJlZGRlZElkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUucmVzb2x2ZUphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TWFwcGluZygpOwotCQlDb2x1bW4gamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uID0gamF2YUVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0Q29sdW1uKCk7Ci0JCQotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PX0NPTFVNTiIpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQotCQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoSmF2YUJhc2ljTWFwcGluZykgZW1iZWRkYWJsZUFkZHJlc3NUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJzdGF0ZSIpLmdldE1hcHBpbmcoKTsKLQkJamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9TVEFURV9DT0xVTU4iKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fQ09MVU1OIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fVEFCTEUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU1RBVEVfQ09MVU1OIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJCi0JCQotCQkvL2VtYmVkZGVkIG1hcHBpbmcgaXMgc3BlY2lmaWVkLCB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZXMgc2hvdWxkIGV4aXN0Ci0JCXBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuYWRkVG9YbWwoKTsKLQkJT3JtRW1iZWRkZWRJZE1hcHBpbmcgb3JtTWFwcGluZyA9IChPcm1FbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG9ybU92ZXJyaWRlQ29udGFpbmVyID0gb3JtTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoNCwgb3JtT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG9ybU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gb3JtT3ZlcnJpZGVzID0gb3JtT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCU9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSBvcm1PdmVycmlkZSA9IG9ybU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1PdmVycmlkZS5nZXROYW1lKCkpOwotCQlvcm1PdmVycmlkZSA9IG9ybU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG9ybU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG9ybU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1PdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1PdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1PdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBvcm1PdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1PdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1PdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJb3JtT3ZlcnJpZGUgPSBvcm1PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgb3JtT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TVEFURV9DT0xVTU4iLCBvcm1PdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlvcm1PdmVycmlkZSA9IG9ybU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgb3JtT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG9uZSBvZiB0aGUgdmlydHVhbCBhdHRyaWJ1dGUgb3ZlcnJpZGVzIHRvIHNwZWNpZmllZCwgdmVyaWZ5IG90aGVycyBhcmUgc3RpbGwgdmlydHVhbAotCQlvcm1PdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgb3JtT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1PdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCW9ybU92ZXJyaWRlcyA9IG9ybU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlvcm1PdmVycmlkZSA9IG9ybU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG9ybU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCW9ybU92ZXJyaWRlID0gb3JtT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG9ybU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCW9ybU92ZXJyaWRlID0gb3JtT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBvcm1PdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUVfICsgIkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlKYXZhRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGVtYmVkZGVkSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX05BTUUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCUNvbHVtbiBjb2x1bW4gPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSwgY29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJdGhpcy5vcm1YbWxSZXNvdXJjZS5zYXZlSWZOZWNlc3NhcnkoKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlKYXZhVmlydHVhbENvbHVtbiB2aXJ0dWFsQ29sdW1uID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbENvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQ29sdW1uID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIkFfU1RBVEUiLCB2aXJ0dWFsQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQV9TVEFURSIsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBX1NUQVRFIiwgdmlydHVhbENvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbENvbHVtbiA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQotCQkvL3dpbGwgYmUgYW4gT3JtRW1iZWRkZWRNYXBwaW5nIGluc3RlYWQgb2YgT3JtRW1iZWRkZWRJZE1hcHBpbmcgc2luY2UgdGhhdCBpcyB0aGUgZGVmYXVsdAotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwotCi0JCS8vVE9ETwotLy8JCWFzc2VydEVxdWFscyg0LCBvcm1FbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotLy8JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShvcm1FbWJlZGRlZElkTWFwcGluZy5kZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCkpKTsKLS8vCQlMaXN0SXRlcmF0b3I8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8KLS8vCQlYbWxBdHRyaWJ1dGVPdmVycmlkZSBvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9OQU1FLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCVhtbENvbHVtbiB4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgeG1sQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFIiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNiksIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDcpLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0vLwkJCi0vLwkJb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCXhtbENvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCi0vLwkJb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygic3RhdGUiLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCXhtbENvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotLy8JCWFzc2VydEVxdWFscygic3RhdGUiLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCi0vLwkJb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiemlwIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoInppcCIsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIiksIE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybUVtYmVkZGVkSWRNYXBwaW5nIG9ybUVtYmVkZGVkSWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUVtYmVkZGVkSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJLy9UT0RPCi0vLwkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUVtYmVkZGVkSWRNYXBwaW5nLmRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXMoKSkpOwotLy8JCUxpc3RJdGVyYXRvcjxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gb3JtQXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW1iZWRkZWRJZE1hcHBpbmcuZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8KLS8vCQlYbWxBdHRyaWJ1dGVPdmVycmlkZSBvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9OQU1FLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCVhtbENvbHVtbiB4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB4bWxDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHhtbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDYpLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotLy8JCQotLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgeG1sQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotLy8KLS8vCQlvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJeG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIHhtbENvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCi0vLwkJb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiemlwIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoInppcCIsIHhtbENvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZE1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTgwOWNiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZE1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9ybUVtYmVkZGVkTWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX05BTUUgPSAiY2l0eSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSA9ICJFX0NJVFkiOwotCi0JcHVibGljIE9ybUVtYmVkZGVkTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuRU1CRURERUQsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIsIGNvbHVtbj1AQ29sdW1uKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9OQU1FICsgIlwiKSkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuQ09MVU1OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQENvbHVtbihuYW1lPVwiQV9TVEFURVwiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9CQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5Q3VzdG9tZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkN1c3RvbWVyIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJDdXN0b21lci5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzMigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHN0cmVldDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBaaXBDb2RlIHppcENvZGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlppcENvZGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBwbHVzZm91cjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlppcENvZGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVtYmVkZGVkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW1iZWRkZWRSZXNvdXJjZS5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBlbWJlZGRlZFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW1iZWRkZWRSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGVkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVtYmVkZGVkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtRW1iZWRkZWRNYXBwaW5nLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVtYmVkZGVkTWFwcGluZy5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGVkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkTWFwcGluZyIpOwotLy8JCU9ybUVtYmVkZGVkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLS8vCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0vLwkJCi0vLwkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1FbWJlZGRlZE1hcHBpbmcuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7Ci0vLwkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0vLwkJCQkKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUyID0gb3JtRW1iZWRkZWRNYXBwaW5nLmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDApOwotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlMi5zZXROYW1lKCJCQVIiKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotLy8JCQotLy8JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlMyA9IG9ybUVtYmVkZGVkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgxKTsKLS8vCQlhdHRyaWJ1dGVPdmVycmlkZTMuc2V0TmFtZSgiQkFaIik7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKGF0dHJpYnV0ZU92ZXJyaWRlMiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKGF0dHJpYnV0ZU92ZXJyaWRlMywgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKGF0dHJpYnV0ZU92ZXJyaWRlLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKTsKLS8vCQkKLS8vCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotLy8JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRNYXBwaW5nIik7Ci0vLwkJT3JtRW1iZWRkZWRNYXBwaW5nIG9ybUVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotLy8JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLS8vCi0vLwkJb3JtRW1iZWRkZWRNYXBwaW5nLmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDApLnNldE5hbWUoIkZPTyIpOwotLy8JCW9ybUVtYmVkZGVkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgxKS5zZXROYW1lKCJCQVIiKTsKLS8vCQlvcm1FbWJlZGRlZE1hcHBpbmcuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMikuc2V0TmFtZSgiQkFaIik7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKDMsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLS8vCQkKLS8vCQlvcm1FbWJlZGRlZE1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotLy8KLS8vCQlvcm1FbWJlZGRlZE1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDEsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJb3JtRW1iZWRkZWRNYXBwaW5nLnJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDApOwotLy8JCWFzc2VydEVxdWFscygwLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRW1iZWRkZWRNYXBwaW5nIG9ybUVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9ybUVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCi0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCQotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsJCQotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCQotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQkKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDIsIDApOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMCwgMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNYXBwaW5nTm9VbmRlcnlsaW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKSwgTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT3JtRW1iZWRkZWRNYXBwaW5nIG9ybUVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvcm1FbWJlZGRlZE1hcHBpbmcuc2V0TmFtZSgiZm9vIik7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwotCi0JCQotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlMiA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUVfICsgIkFkZHJlc3MiKTsKLQkJCi0JCS8vZW1iZWRkZWQgbWFwcGluZyBpcyB2aXJ0dWFsLCBKYXZhIGF0dHJpYnV0ZSBvdmVycmlkZXMgc2hvdWxkIGV4aXN0Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJSmF2YUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJSmF2YUVtYmVkZGVkTWFwcGluZyBqYXZhRW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbHVtbiBqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4gPSBqYXZhRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0Q29sdW1uKCk7Ci0JCQotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PX0NPTFVNTiIpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQotCQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoSmF2YUJhc2ljTWFwcGluZykgcGVyc2lzdGVudFR5cGUyLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJzdGF0ZSIpLmdldE1hcHBpbmcoKTsKLQkJamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9TVEFURV9DT0xVTU4iKTsKLQkJZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPT19DT0xVTU4iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPT19UQUJMRSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TVEFURV9DT0xVTU4iLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQkKLQkJLy9lbWJlZGRlZCBtYXBwaW5nIGlzIHNwZWNpZmllZCwgdmlydHVhbCBhdHRyaWJ1dGUgb3ZlcnJpZGVzIHNob3VsZCBleGlzdAotCQlwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmFkZFRvWG1sKCk7Ci0JCU9ybUVtYmVkZGVkTWFwcGluZyBvcm1NYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG9ybU92ZXJyaWRlQ29udGFpbmVyID0gb3JtTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoNCwgb3JtT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG9ybU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gb3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgb3JtVmlydHVhbE92ZXJyaWRlID0gb3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1WaXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJb3JtVmlydHVhbE92ZXJyaWRlID0gb3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG9ybVZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBvcm1WaXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtVmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtVmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1WaXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtVmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybVZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybVZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBvcm1WaXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtVmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJb3JtVmlydHVhbE92ZXJyaWRlID0gb3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBvcm1WaXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TVEFURV9DT0xVTU4iLCBvcm1WaXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybVZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCW9ybVZpcnR1YWxPdmVycmlkZSA9IG9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG9ybVZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgb25lIG9mIHRoZSB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZXMgdG8gc3BlY2lmaWVkLCB2ZXJpZnkgb3RoZXJzIGFyZSBzdGlsbCB2aXJ0dWFsCi0JCW9ybU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBvcm1PdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJb3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlvcm1WaXJ0dWFsT3ZlcnJpZGUgPSBvcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgb3JtVmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCW9ybVZpcnR1YWxPdmVycmlkZSA9IG9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgb3JtVmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCW9ybVZpcnR1YWxPdmVycmlkZSA9IG9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG9ybVZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBlbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX05BTUUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCUNvbHVtbiBjb2x1bW4gPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSwgY29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlWaXJ0dWFsQ29sdW1uIHZpcnR1YWxDb2x1bW4gPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQ29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbENvbHVtbiA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJBX1NUQVRFIiwgdmlydHVhbENvbHVtbi5nZXROYW1lKCkpOwotCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQ29sdW1uID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxDb2x1bW4uZ2V0TmFtZSgpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBlbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQotCQkvL1RPRE8KLS8vCQlhc3NlcnRFcXVhbHMoNCwgb3JtRW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUVtYmVkZGVkTWFwcGluZy5kZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCkpKTsKLS8vCQlMaXN0SXRlcmF0b3I8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLS8vCi0vLwkJWG1sQXR0cmlidXRlT3ZlcnJpZGUgb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQlYbWxDb2x1bW4geG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHhtbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDYpLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotLy8JCQotLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwotLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwotLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoInppcCIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJeG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKSwgTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT3JtRW1iZWRkZWRNYXBwaW5nIG9ybUVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCS8vVE9ETwotLy8JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShvcm1FbWJlZGRlZE1hcHBpbmcuZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlcygpKSk7Ci0vLwkJTGlzdEl0ZXJhdG9yPFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBvcm1BdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZE1hcHBpbmcuZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8KLS8vCQlYbWxBdHRyaWJ1dGVPdmVycmlkZSBvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9OQU1FLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCVhtbENvbHVtbiB4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB4bWxDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHhtbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDYpLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotLy8JCQotLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgeG1sQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotLy8KLS8vCQlvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJeG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIHhtbENvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCi0vLwkJb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiemlwIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoInppcCIsIHhtbENvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkTW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkTW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9ICgoRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm92ZXJyaWRlIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPVkVSUklERV9DT0xVTU4iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkTW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvLzEuMCBwcm9qZWN0cyBkbyBub3Qgc3VwcG9ydCBkb3Qtbm90YXRpb24sIHRoaXMgdGVzdHMgdG8gbWFrZSBzdXJlIHRoYXQgc3VwcG9ydCBkb2VzIG5vdCBleGlzdAotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MyKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgY3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQ3VzdG9tZXIiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSB6aXBDb2RlUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7Ci0KLQkJY3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmFkZFRvWG1sKCk7Ci0JCU9ybUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBjdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8T3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCU9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdHJlZXQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5hZGRUb1htbCgpOwotCQlPcm1FbWJlZGRlZE1hcHBpbmcgbmVzdGVkRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBuZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG5lc3RlZEVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMiwgbmVzdGVkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBuZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQl6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikuYWRkVG9YbWwoKTsKLQkJQmFzaWNNYXBwaW5nIHBsdXNGb3VyTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHppcENvZGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicGx1c2ZvdXIiKS5nZXRNYXBwaW5nKCk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRSIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0KLQkJLy9jaGVjayB0aGUgbmVzdGVkIGVtYmVkZGVkIChBZGRyZXNzLnppcENvZGUpIGF0dHJpYnV0ZSBvdmVycmlkZSB0byB2ZXJpZnkgaXQgaXMgZ2V0dGluZyBzZXR0aW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgY29sdW1uIG9uIFppcGNvZGUucGx1c2ZvdXIKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgKChPcm1FbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRPdmVycmlkZU5hbWVkKCJwbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQkvL2NoZWNrIHRoZSB0b3AtbGV2ZWwgZW1iZWRkZWQgKEN1c3RvbWVyLmFkZHJlc3MpIGF0dHJpYnV0ZSBvdmVycmlkZSB0byB2ZXJpZnkgdGhlcmUgaXMgbm8gYXR0cmlidXRlIG92ZXJyaWRlIG5hbWVkIHppcENvZGUucGx1c2ZvdXIKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgKChPcm1FbWJlZGRlZE1hcHBpbmcpIGN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0T3ZlcnJpZGVOYW1lZCgiemlwQ29kZS5wbHVzZm91ciIpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbnRpdHlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVudGl0eVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjk3ZjEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVudGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkQ2xhc3NSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WaXJ0dWFsSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9ybUVudGl0eVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDSElMRF9UWVBFX05BTUUgPSAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9DSElMRF9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBDSElMRF9UWVBFX05BTUU7Ci0JCi0JCi0JcHVibGljIE9ybUVudGl0eVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlEZWZhdWx0RmllbGRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5RmllbGRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoQ0hJTERfVFlQRV9OQU1FKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIikuYXBwZW5kKFRZUEVfTkFNRSkuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGVVbm1hcHBlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZChDSElMRF9UWVBFX05BTUUpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiKS5hcHBlbmQoVFlQRV9OQU1FKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oCi0JCQkJCUpQQS5NQVBQRURfU1VQRVJDTEFTUywgCi0JCQkJCUpQQS5CQVNJQywKLQkJCQkJSlBBLlZFUlNJT04sCi0JCQkJCUpQQS5UUkFOU0lFTlQsCi0JCQkJCUpQQS5FTUJFRERFRCwKLQkJCQkJSlBBLkVNQkVEREVEX0lELAotCQkJCQlKUEEuT05FX1RPX09ORSwKLQkJCQkJSlBBLk9ORV9UT19NQU5ZLAotCQkJCQlKUEEuTUFOWV9UT19PTkUsCi0JCQkJCUpQQS5NQU5ZX1RPX01BTlksCi0JCQkJCUpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoInByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEJhc2ljIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBiYXNpYzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFZlcnNpb24iKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHZlcnNpb247IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBUcmFuc2llbnQiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHRyYW5zaWVudDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBlbWJlZGRlZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkSWQiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGVtYmVkZGVkSWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgQ0hJTERfVFlQRV9OQU1FICsgIiBvbmVUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgb25lVG9NYW55OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBtYW55VG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBtYW55VG9NYW55OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0QWJzdHJhY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgIikuYXBwZW5kKFRZUEVfTkFNRSkuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgRklMRV9OQU1FLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVBYnN0cmFjdFRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JTkhFUklUQU5DRSwgSlBBLklOSEVSSVRBTkNFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoImFic3RyYWN0Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklOSEVSSVRBTkNFLCBKUEEuSU5IRVJJVEFOQ0VfVFlQRSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpIik7Ci0JCQkJc2IuYXBwZW5kKCJhYnN0cmFjdCIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoInByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJUZXN0VHlwZUlkIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlRlc3RUeXBlSWQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVudGl0eVJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtRW50aXR5LmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RmllbGRBY2Nlc3MoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKS5zZXRTcGVjaWZpZWROYW1lKCJGb28iKTsKLQkJLy94bWwgZGVmYXVsdCBlbnRpdHkgbmFtZSBjb21lcyBmcm9tIGphdmEKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQkvL3NldCBjbGFzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKCJjb20uQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgb3JtRW50aXR5LmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJLy9zZXQgY2xhc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW50aXR5UmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLnNldENsYXNzTmFtZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWVudGl0eVJlc291cmNlLnNldE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEphdmFUeXBlTWFwcGluZygpLnNldFNwZWNpZmllZE5hbWUoIkZvbzEiKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2Uuc2V0TWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28xIiwgb3JtRW50aXR5LmdldERlZmF1bHROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IGNsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5zZXRDbGFzc05hbWUoImNvbS5CYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBvcm1FbnRpdHkuZ2V0TmFtZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLnNldE5hbWUoIkJheiIpOwotCQlhc3NlcnRFcXVhbHMoIkJheiIsIG9ybUVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgY2xhc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW50aXR5UmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoIkJheiIsIG9ybUVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtRW50aXR5LmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL3NldCBjbGFzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKCJjb20uQmFyIik7Ci0JCWFzc2VydEVxdWFscygiY29tLkJhciIsIG9ybUVudGl0eS5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscygiY29tLkJhciIsIGVudGl0eVJlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQkKLQkJLy9zZXQgY2xhc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW50aXR5UmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtRW50aXR5LmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL3NldCBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUVudGl0eS5zZXRDbGFzcygiY29tLkJhciIpOwotCQlhc3NlcnRFcXVhbHMoImNvbS5CYXIiLCBvcm1FbnRpdHkuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoImNvbS5CYXIiLCBlbnRpdHlSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL3NldCBjbGFzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVudGl0eS5zZXRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQl9Ci0JLy9UT0RPIGFkZCB0ZXN0cyBmb3Igc2V0dGluZyB0aGUgY2xhc3NOYW1lIHdoZW4gdGhlIHBhY2thZ2UgaXMgc2V0IG9uIGVudGl0eS1tYXBwaW5ncwotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2Uuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQsIGVudGl0eVJlc291cmNlLmdldEFjY2VzcygpKTsKLQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVudGl0eVJlc291cmNlLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIGVudGl0eVJlc291cmNlLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdEFjY2Vzc0Zyb21QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEFjY2VzcygpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEFjY2VzcygpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRBY2Nlc3NGcm9tSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RGVmYXVsdEZpZWxkQWNjZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJLy9qYXZhIGhhcyBubyBhbm5vdGF0aW9ucywgZGVmYXVsdEFjY2VzcyBpbiB4bWwgaXMgRklFTEQgYW55d2F5Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsJCQotCQkvL2VudGl0eU1hcHBpbmdzIGFjY2VzcyB3aW5zIG92ZXIgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBhY2Nlc3MKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsJCQotCQkvL3BlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgYWNjZXNzIHVzZWQgbm93Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJLy9qYXZhIGhhcyBhbm5vdGF0aW9ucyBvbiBmaWVsZHMgbm93LCB0aGF0IHNob3VsZCB3aW4gaW4gYWxsIGNhc2VzCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0KLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0QWNjZXNzRnJvbUphdmFGaWVsZEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RmllbGRBY2Nlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQkKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCQotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRBY2Nlc3NGcm9tSmF2YVByb3BlcnR5QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUFjY2VzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQkKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCQotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdEFjY2Vzc05vVW5kZXJseWluZ0phdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5zZXRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHlSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQotCQkvL3NldCBhY2Nlc3MgdG8gZmFsc2UgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVudGl0eVJlc291cmNlLnNldE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5zZXRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRUcnVlKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5pc092ZXJyaWRlTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRUcnVlKG9ybUVudGl0eS5pc092ZXJyaWRlTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmlzT3ZlcnJpZGVNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydFRydWUob3JtRW50aXR5LmlzT3ZlcnJpZGVNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRUcnVlKG9ybUVudGl0eS5pc01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5pc01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShvcm1FbnRpdHkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShvcm1FbnRpdHkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVJbmhlcml0YW5jZVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgb3JtRW50aXR5LmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0SW5oZXJpdGFuY2UoKSk7Ci0KLQkJLy9zZXQgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLnNldEluaGVyaXRhbmNlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluaGVyaXRhbmNlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRJbmhlcml0YW5jZSgpLnNldFN0cmF0ZWd5KG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgb3JtRW50aXR5LmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgZW50aXR5UmVzb3VyY2UuZ2V0SW5oZXJpdGFuY2UoKS5nZXRTdHJhdGVneSgpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3lGcm9tSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RGVmYXVsdEZpZWxkQWNjZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJLy9ubyBpbmhlcml0YW5jZSBzdHJhdGVneSBzcGVjaWZpZWQgaW4gamF2YSBzbyBzaW5nbGUtdGFibGUgaXMgZGVmYXVsdAotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgb3JtRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEphdmFUeXBlTWFwcGluZygpLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuSk9JTkVELCBvcm1FbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCQkKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUyk7Ci0JCS8vaW5oZXJpdGFuY2UgdGFnIGV4aXN0cyBpbiB4bWwsIHNvIGl0IG92ZXJyaWRlcyBhbnl0aGluZyBpbiBqYXZhCi0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBvcm1FbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0KLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3kobnVsbCk7CQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5KT0lORUQsIG9ybUVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgb3JtRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQkKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuSk9JTkVELCBvcm1FbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCS8vdGhpcyBzZXR0aW5nIG92ZXJyaWRlcyB0aGUgZmFsc2UgbWV0YS1kYXRhIGNvbXBsZXRlIGZvdW5kIG9uIG9ybUVudGl0eQotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgb3JtRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3lGcm9tUGFyZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlEZWZhdWx0RmllbGRBY2Nlc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgc3VwZXJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBzdWJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJT3JtRW50aXR5IHBhcmVudFhtbEVudGl0eSA9IChPcm1FbnRpdHkpIHN1cGVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FbnRpdHkgY2hpbGRYbWxFbnRpdHkgPSAoT3JtRW50aXR5KSBzdWJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMocGFyZW50WG1sRW50aXR5LCBjaGlsZFhtbEVudGl0eS5nZXRQYXJlbnRFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBjaGlsZFhtbEVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJCi0JCS8vY2hhbmdlIHJvb3QgaW5oZXJpdGFuY2Ugc3RyYXRlZ3ksIHZlcmlmeSBkZWZhdWx0IGlzIGNoYW5nZWQgZm9yIGNoaWxkIGVudGl0eQotCQlwYXJlbnRYbWxFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIHBhcmVudFhtbEVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGNoaWxkWG1sRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnROdWxsKGNoaWxkWG1sRW50aXR5LmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0KLQkJLy9zZXQgc3BlY2lmaWVkIGluaGVyaXRhbmNlIHN0cmF0ZWd5IGluIGphdmEgYW5kIHZlcmlmeSBkZWZhdWx0cyBpbiB4bWwgYXJlIGNvcnJlY3QKLQkJcGFyZW50WG1sRW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3kobnVsbCk7Ci0JCXBhcmVudFhtbEVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCwgcGFyZW50WG1sRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCwgY2hpbGRYbWxFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydE51bGwocGFyZW50WG1sRW50aXR5LmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydE51bGwoY2hpbGRYbWxFbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIHBhcmVudFhtbEVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGNoaWxkWG1sRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEluaGVyaXRhbmNlKCkpOwotCQkKLQkJLy9zZXQgc3RyYXRlZ3kgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLnNldEluaGVyaXRhbmNlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluaGVyaXRhbmNlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRJbmhlcml0YW5jZSgpLnNldFN0cmF0ZWd5KG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuSk9JTkVELCBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCwgZW50aXR5UmVzb3VyY2UuZ2V0SW5oZXJpdGFuY2UoKS5nZXRTdHJhdGVneSgpKTsKLQkKLQkJLy9zZXQgc3RyYXRlZ3kgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW50aXR5UmVzb3VyY2UuZ2V0SW5oZXJpdGFuY2UoKS5zZXRTdHJhdGVneShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRJbmhlcml0YW5jZSgpLmdldFN0cmF0ZWd5KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0SW5oZXJpdGFuY2UoKS5zZXRTdHJhdGVneShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgb3JtRW50aXR5LmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGVudGl0eVJlc291cmNlLmdldEluaGVyaXRhbmNlKCkuZ2V0U3RyYXRlZ3koKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2Uuc2V0SW5oZXJpdGFuY2UobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0SW5oZXJpdGFuY2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEluaGVyaXRhbmNlKCkpOwotCQkKLQkJLy9zZXQgc3RyYXRlZ3kgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIG9ybUVudGl0eS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTLCBlbnRpdHlSZXNvdXJjZS5nZXRJbmhlcml0YW5jZSgpLmdldFN0cmF0ZWd5KCkpOwotCQkKLQkJLy9zZXQgc3RyYXRlZ3kgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRJbmhlcml0YW5jZSgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCU9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlMiA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJc2Vjb25kYXJ5VGFibGUyLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlMyA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgxKTsKLQkJc2Vjb25kYXJ5VGFibGUzLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmRhcnlUYWJsZTIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kYXJ5VGFibGUzLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZGFyeVRhYmxlLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlcyA9IG9ybUVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnNpemUoKSk7Ci0JCQotCQlvcm1FbnRpdHkucmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCW9ybUVudGl0eS5yZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlvcm1FbnRpdHkucmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0KLQkJb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygzLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5zaXplKCkpOwotCQkKLQkJCi0JCW9ybUVudGl0eS5tb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW9ybUVudGl0eS5tb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCwgMSk7Ci0JCXNlY29uZGFyeVRhYmxlcyA9IG9ybUVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTZWNvbmRhcnlUYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZWNvbmRhcnlUYWJsZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlY29uZGFyeVRhYmxlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU2Vjb25kYXJ5VGFibGUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkubW92ZSgyLCAwKTsKLQkJc2Vjb25kYXJ5VGFibGVzID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLm1vdmUoMCwgMSk7Ci0JCXNlY29uZGFyeVRhYmxlcyA9IG9ybUVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5yZW1vdmUoMSk7Ci0JCXNlY29uZGFyeVRhYmxlcyA9IG9ybUVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnJlbW92ZSgxKTsKLQkJc2Vjb25kYXJ5VGFibGVzID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZpZWxkQWNjZXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHN1cGVyUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgc3ViUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCU9ybUVudGl0eSBwYXJlbnRPcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBzdXBlclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRW50aXR5IGNoaWxkT3JtRW50aXR5ID0gKE9ybUVudGl0eSkgc3ViUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSBjaGlsZE9ybUVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKTsKLQkJCi0JCUphdmFTZWNvbmRhcnlUYWJsZSBqYXZhU2Vjb25kYXJ5VGFibGVGb28gPSBqYXZhRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlqYXZhU2Vjb25kYXJ5VGFibGVGb28uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCU9ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZSB2aXJ0dWFsU2Vjb25kYXJ5VGFibGVGb28gPSBjaGlsZE9ybUVudGl0eS5nZXRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY2hpbGRPcm1FbnRpdHkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsU2Vjb25kYXJ5VGFibGVGb28uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxTZWNvbmRhcnlUYWJsZUZvby5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbFNlY29uZGFyeVRhYmxlRm9vLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbFNlY29uZGFyeVRhYmxlRm9vLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBjaGlsZE9ybUVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2hpbGRPcm1FbnRpdHkuZ2V0VmlydHVhbFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBjaGlsZE9ybUVudGl0eS5nZXRTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQkKLQkJamF2YUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZT4gdmlydHVhbFNlY29uZGFyeVRhYmxlcyA9IGNoaWxkT3JtRW50aXR5LmdldFZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlMaXN0SXRlcmF0b3I8UmVhZE9ubHlTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gY2hpbGRPcm1FbnRpdHkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsU2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxTZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNoaWxkT3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjaGlsZE9ybUVudGl0eS5nZXRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGNoaWxkT3JtRW50aXR5LmdldFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCQotCQljaGlsZE9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygwLCBjaGlsZE9ybUVudGl0eS5nZXRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJCi0JCWNoaWxkT3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscygyLCBjaGlsZE9ybUVudGl0eS5nZXRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJCi0JCQotCQljaGlsZE9ybUVudGl0eS5zZXRTZWNvbmRhcnlUYWJsZXNBcmVEZWZpbmVkSW5YbWwodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscygwLCBjaGlsZE9ybUVudGl0eS5nZXRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGNoaWxkT3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjaGlsZE9ybUVudGl0eS5nZXRTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+IHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcyA9IGNoaWxkT3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlPcm1TZWNvbmRhcnlUYWJsZSBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZUZvbyA9IHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVGb28uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZFNlY29uZGFyeVRhYmxlRm9vLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZUZvby5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZFNlY29uZGFyeVRhYmxlRm9vLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCQotCQljaGlsZE9ybUVudGl0eS5yZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNoaWxkT3JtRW50aXR5LmdldFZpcnR1YWxTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2hpbGRPcm1FbnRpdHkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNoaWxkT3JtRW50aXR5LmdldFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY2hpbGRPcm1FbnRpdHkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCi0JCWNoaWxkT3JtRW50aXR5LnJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgY2hpbGRPcm1FbnRpdHkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGNoaWxkT3JtRW50aXR5LmdldFZpcnR1YWxTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgY2hpbGRPcm1FbnRpdHkuZ2V0U2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJdmlydHVhbFNlY29uZGFyeVRhYmxlcyA9IGNoaWxkT3JtRW50aXR5LmdldFZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHZpcnR1YWxTZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbFNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQkvL2FkZCBhIHNwZWNpZmllZCBzZWNvbmRhcnkgdGFibGUgdG8gdGhlIHBhcmVudCwgdGhpcyB3aWxsIG5vdCBhZmZlY3QgdmlydHVhbCBzZWNvbmRhcnlUYWJsZXMgaW4gY2hpbGQKLQkJcGFyZW50T3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApLnNldFNwZWNpZmllZE5hbWUoIlBBUkVOVF9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoMiwgY2hpbGRPcm1FbnRpdHkuZ2V0VmlydHVhbFNlY29uZGFyeVRhYmxlc1NpemUoKSk7CQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGVkVGFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGaWVsZEFjY2VzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eS5nZXRBc3NvY2lhdGVkVGFibGVzKCkpKTsKLQkJCi0JCWVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eS5nZXRBc3NvY2lhdGVkVGFibGVzKCkpKTsKLQkKLQkJZW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5LmdldEFzc29jaWF0ZWRUYWJsZXMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRlZFRhYmxlTmFtZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gVE9ETwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGVOYW1lSXNJbnZhbGlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ha2VFbnRpdHlFbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoIkRJU0NfVkFMVUUiKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWROYW1lKCJFTlRJVFlfTkFNRSIpOwotCQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIGVtYmVkZGFibGUuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbWJlZGRhYmxlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIGVtYmVkZGFibGUuZ2V0QWNjZXNzKCkpOwotCQkKLQkJT3JtRW1iZWRkYWJsZSBvcm1FbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1FbWJlZGRhYmxlLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQkKLQkvL1RPRE8gdGVzdCB0aGF0IGF0dHJpYnV0ZSBtYXBwaW5ncyBhcmUgbm90IHJlbW92ZWQgd2hlbiBjaGFuZ2luZyB0eXBlIG1hcHBpbmcuCi0JcHVibGljIHZvaWQgdGVzdE1ha2VFbnRpdHlFbWJlZGRhYmxlMigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzIiKTsKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCJESVNDX1ZBTFVFIik7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkTmFtZSgiRU5USVRZX05BTUUiKTsKLS8vCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKElNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbWJlZGRhYmxlLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW1iZWRkYWJsZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBlbWJlZGRhYmxlLmdldEFjY2VzcygpKTsKLS8vCQlhc3NlcnRFcXVhbHMoImJhc2ljTWFwcGluZyIsIGVtYmVkZGFibGUuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtRW1iZWRkYWJsZSBvcm1FbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1FbWJlZGRhYmxlLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotLy8JCWFzc2VydEVxdWFscygiYmFzaWNNYXBwaW5nIiwgb3JtRW1iZWRkYWJsZS5wZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ha2VFbnRpdHlNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoIkRJU0NfVkFMVUUiKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWROYW1lKCJFTlRJVFlfTkFNRSIpOwotCQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgbWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBlZFN1cGVyY2xhc3MuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgbWFwcGVkU3VwZXJjbGFzcy5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlRW50aXR5TWFwcGVkU3VwZXJjbGFzczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzIiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBlbnRpdHkgPSAoT3JtRW50aXR5KSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgiRElTQ19WQUxVRSIpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZE5hbWUoIkVOVElUWV9OQU1FIik7Ci0JCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBtYXBwZWRTdXBlcmNsYXNzLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGVkU3VwZXJjbGFzcy5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBtYXBwZWRTdXBlcmNsYXNzLmdldEFjY2VzcygpKTsKLQkJCi0JCU9ybU1hcHBlZFN1cGVyY2xhc3Mgb3JtTWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU2VxdWVuY2VHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCQkJCi0JCS8vdHJ5IGFkZGluZyBhbm90aGVyIHNlcXVlbmNlIGdlbmVyYXRvciwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCW9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCi0JCW9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlhc3NlcnROb3ROdWxsKGVudGl0eVJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROb3ROdWxsKG9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQotCQlvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCi0JCS8vdHJ5IHJlbW92aW5nIHRoZSBzZXF1ZW5jZSBnZW5lcmF0b3IgYWdhaW4sIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsJCQotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5zZXRTZXF1ZW5jZUdlbmVyYXRvcihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJCQkKLQkJYXNzZXJ0Tm90TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXRTZXF1ZW5jZUdlbmVyYXRvcihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRUYWJsZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROb3ROdWxsKG9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJCQkKLQkJLy90cnkgYWRkaW5nIGFub3RoZXIgdGFibGUgZ2VuZXJhdG9yLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCQl0cnkgewotCQkJb3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVRhYmxlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0KLQkJb3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydE5vdE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwob3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCi0JCW9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5yZW1vdmVUYWJsZUdlbmVyYXRvcigpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0KLQkJLy90cnkgcmVtb3ZpbmcgdGhlIHRhYmxlIGdlbmVyYXRvciBhZ2Fpbiwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCW9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5yZW1vdmVUYWJsZUdlbmVyYXRvcigpOwkJCi0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVRhYmxlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5zZXRUYWJsZUdlbmVyYXRvcihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZUdlbmVyYXRvcigpKTsKLQkJCQkKLQkJYXNzZXJ0Tm90TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0KLQkJb3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5zZXRUYWJsZUdlbmVyYXRvcihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEaXNjcmltaW5hdG9yQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldE5hbWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKG51bGwpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURpc2NyaW1pbmF0b3JWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2Uuc2V0RGlzY3JpbWluYXRvclZhbHVlKCJGT08iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtRW50aXR5LmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yVmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RGlzY3JpbWluYXRvclZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCJGT08iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtRW50aXR5LmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JCQotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZpZWxkQWNjZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1FbnRpdHkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfQ0hJTERfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybUVudGl0eS5nZXROYW1lKCksIG9ybUVudGl0eS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCQotCQlqYXZhRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS5JTlRFR0VSKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJCi0JCWphdmFFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKG51bGwpOwotCQlqYXZhRW50aXR5LnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUVudGl0eS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhvcm1FbnRpdHkuZ2V0TmFtZSgpLCBvcm1FbnRpdHkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4gPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4yID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4zID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbjMuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKHByaW1hcnlLZXlKb2luQ29sdW1uMiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhwcmltYXJ5S2V5Sm9pbkNvbHVtbjMsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocHJpbWFyeUtleUpvaW5Db2x1bW4sIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCi0JCW9ybUVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb3JtRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQkJb3JtRW50aXR5LnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybUVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3JtRW50aXR5Lm1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3JtRW50aXR5Lm1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwLCAxKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByaW1hcnlLZXlKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5tb3ZlKDIsIDApOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubW92ZSgwLCAxKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKDEpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlVW5tYXBwZWQoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfQ0hJTERfVFlQRV9OQU1FKTsKLQkJY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5hZGRUb1htbChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJKChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJCi0JCU9ybUVudGl0eSBjaGlsZEVudGl0eSA9IChPcm1FbnRpdHkpIGNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0VHJ1ZShjaGlsZEVudGl0eS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCWNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCXBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShjaGlsZEVudGl0eS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGNoaWxkRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRGYWxzZShjaGlsZEVudGl0eS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJLy9yZW1vdmUgdGhlIHBrSm9pbkNvbHVtbiBmcm9tIHRoZSBjb250ZXh0IG1vZGUsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGhhcyBhIGRlZmF1bHQgcGtKb2luQ29sdW1uCi0JCWNoaWxkRW50aXR5LnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRUcnVlKGNoaWxkRW50aXR5LmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBjaGlsZEVudGl0eS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBjaGlsZEVudGl0eS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCQotCQljaGlsZFBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKLQkJcGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gY2hpbGRFbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJCQVIiKTsJCQotCQlhc3NlcnRGYWxzZShjaGlsZEVudGl0eS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkvL25vdyByZW1vdmUgdGhlIHBrSm9pbkNvbHVtbiBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlcyBhbmQgaGFzIGEgZGVmYXVsdCBwa0pvaW5Db2x1bW4KLQkJY2hpbGRFbnRpdHkuZ2V0WG1sVHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydFRydWUoY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGNoaWxkRW50aXR5LmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGNoaWxkRW50aXR5LmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zRnJvbUphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZpZWxkQWNjZXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjaGlsZFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX0NISUxEX1RZUEVfTkFNRSk7Ci0JCQotCQkKLQkJKChKYXZhRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCQotCQlPcm1FbnRpdHkgY2hpbGRFbnRpdHkgPSAoT3JtRW50aXR5KSBjaGlsZFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydFRydWUoY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGNoaWxkRW50aXR5LmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGNoaWxkRW50aXR5LmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gPSBqYXZhRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiQkFSIik7Ci0JCQotCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gamF2YVByaW1hcnlLZXlKb2luQ29sdW1uMiA9IGphdmFFbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSk7Ci0JCWphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiRk9PMiIpOwotCQlqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4yLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJCQVIyIik7Ci0JCQotCQljaGlsZFBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOwotCQlwZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uPiBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zID0gY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCVJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW4gZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID0gZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID0gZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PMiIsIGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUjIiLCBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWNoaWxkRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucyA9IGNoaWxkRW50aXR5LmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPSBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlhc3NlcnRGYWxzZShkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDAsIDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDIsIDApOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDAsIDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfQ0hJTERfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUyID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCQotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDUsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8T3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCU9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbiIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQ0hJTERfVFlQRV9OQU1FLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQllbnRpdHkuZ2V0SmF2YVR5cGVNYXBwaW5nKCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUphdmFDb2x1bW4gamF2YUNvbHVtbiA9IGVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldENvbHVtbigpOwotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJamF2YUNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWphdmFDb2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWphdmFDb2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWphdmFDb2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWphdmFDb2x1bW4uc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig3KSk7Ci0JCWphdmFDb2x1bW4uc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig4KSk7Ci0JCWphdmFDb2x1bW4uc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDkpKTsKLQkJCi0JCWFzc2VydEVxdWFscyg1LCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4KSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig5KSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCQkKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbiIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlwZXJzaXN0ZW50VHlwZTIuZ2V0QXR0cmlidXRlTmFtZWQoImJhc2ljIikuYWRkVG9YbWwoKTsKLQkJT3JtQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRUeXBlMi5nZXRBdHRyaWJ1dGVOYW1lZCgiYmFzaWMiKS5nZXRNYXBwaW5nKCk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9OQU1FIik7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCi0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKDUsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOy8vVE9ETyBzcGVjaWZpZWQgb3IgZGVmYXVsdD8KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDcpLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgpLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDkpLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0KLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9OQU1FIiwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzTm9KYXZhRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX0NISUxEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQkKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCXBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8T3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCU9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfQ0hJTERfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCQotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENISUxEX1RZUEVfTkFNRSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQkKLQkJKChKYXZhRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQkKLQkJZW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENISUxEX1RZUEVfTkFNRSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQkKLQkJZW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uRGVmYXVsdHNOb0phdmFBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZVVubWFwcGVkKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkVHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9DSElMRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJT3JtRW50aXR5IGNoaWxkRW50aXR5ID0gKE9ybUVudGl0eSkgY2hpbGRUeXBlLmdldE1hcHBpbmcoKTsJCi0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGNoaWxkT3ZlcnJpZGVDb250YWluZXIgPSBjaGlsZEVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlPcm1SZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gY2hpbGRPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCSgoT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlKSBjaGlsZFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpKS5hZGRUb1htbCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgKChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGNoaWxkVHlwZS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikpLmdldE1hcHBpbmcoKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0NPTFVNTiIpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0KLQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IGNoaWxkT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NPTFVNTiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eURlZmF1bHRGaWVsZEFjY2VzcygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCWVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCQkKLQkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZW50aXR5LmdldE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlEZWZhdWx0RmllbGRBY2Nlc3MoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5nZXRPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCQotCQllbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJCi0JCW92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBlbnRpdHkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfQ0hJTERfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsJCQotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGVudGl0eS5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlc1RhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9DSElMRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBhYnN0cmFjdFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CQkKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKE9ybUVudGl0eSkgYWJzdHJhY3RQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZW50aXR5LmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBhYnN0cmFjdEVudGl0eS5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzRW50aXR5SGllcmFjaHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgYWJzdHJhY3RQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb25jcmV0ZVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX0NISUxEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBjb25jcmV0ZUVudGl0eSA9IChPcm1FbnRpdHkpIGNvbmNyZXRlUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGNvbmNyZXRlRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCU9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQ0hJTERfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQkKLQkJYWJzdHJhY3RQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5hZGRUb1htbCgpOwotCQlCYXNpY01hcHBpbmcgaWRNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgYWJzdHJhY3RQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJCi0KLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0KLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQ0hJTERfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgwLCAxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm1vdmUoMiwgMCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm1vdmUoMCwgMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX0NISUxEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlMiA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQkKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbE92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsT3ZlcnJpZGVzLm5leHQoKTsKLQkJT3JtVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSAoKE9ybVZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwKSB2aXJ0dWFsT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJT3JtVmlydHVhbEpvaW5Db2x1bW4gdmlydHVhbEpvaW5Db2x1bW4gPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZV9pZCIsIHZpcnR1YWxKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENISUxEX1RZUEVfTkFNRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc051bGxhYmxlKCkpOwotCQkKLQkJCi0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCW9ybUVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9IG9ybUVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgamF2YUpvaW5pbmdTdHJhdGVneSA9IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlKYXZhSm9pbkNvbHVtbiBqYXZhSm9pbkNvbHVtbiA9IGphdmFKb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZFUkVOQ0UiKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxPdmVycmlkZXMubmV4dCgpOwotCQlqb2luaW5nU3RyYXRlZ3kgPSB2aXJ0dWFsT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJT3JtVmlydHVhbEpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSRUZFUkVOQ0UiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIG9ybUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCQotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsT3ZlcnJpZGVzLm5leHQoKTsKLQkJam9pbmluZ1N0cmF0ZWd5ID0gdmlydHVhbE92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJCi0JCXBlcnNpc3RlbnRUeXBlMi5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIikuYWRkVG9YbWwoKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRUeXBlMi5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIikuZ2V0TWFwcGluZygpOwotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiTVlfTkFNRSIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJNWV9SRUZFUk5DRV9OQU1FIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIkJBUjIiKTsKLQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGMiIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCi0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbE92ZXJyaWRlcy5uZXh0KCk7Ci0JCWpvaW5pbmdTdHJhdGVneSA9IHZpcnR1YWxPdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQlvcm1Kb2luQ29sdW1uID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJFRkVSRU5DRSIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgb3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJCi0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxPdmVycmlkZXMubmV4dCgpOwotCQlqb2luaW5nU3RyYXRlZ3kgPSB2aXJ0dWFsT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCW9ybUpvaW5Db2x1bW4gPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9OQU1FIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1JFRkVSTkNFX05BTUUiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUjIiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYyIiwgb3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQl9Ci0vL1RPRE8KLS8vCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNOb0phdmFFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotLy8JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfQ0hJTERfVFlQRV9OQU1FKTsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZTIgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCQotLy8JCXBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKLS8vCQlwZXJzaXN0ZW50VHlwZTIuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwotLy8JCQotLy8JCXBlcnNpc3RlbnRUeXBlMi5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLS8vCQlwZXJzaXN0ZW50VHlwZTIuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLS8vCQkJCi0vLwkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0vLwkJTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLS8vCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDEsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnNTaXplKCkpOwotLy8JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZV9pZCIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQ0hJTERfVFlQRV9OQU1FLCBqb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscyhudWxsLCBqb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKHRydWUsIGpvaW5Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscyh0cnVlLCBqb2luQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgam9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgam9pbkNvbHVtbi5pc051bGxhYmxlKCkpOwotLy8JCQotLy8JCQotLy8JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEZhbHNlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotLy8KLS8vCQkKLS8vCQllbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscygxLCBlbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKLS8vCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBlbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0vLwkJYXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJZW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLS8vCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0vLwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotLy8JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCQotLy8JCWVudGl0eS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOwotLy8JCWVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotLy8JCWVudGl0eS5nZXRKYXZhRW50aXR5KCkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotLy8JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5LmdldEphdmFFbnRpdHkoKS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLS8vCQlKYXZhSm9pbkNvbHVtbiBqYXZhSm9pbkNvbHVtbiA9IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0vLwkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0vLwkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRkVSRU5DRSIpOwotLy8JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLS8vCQlqYXZhSm9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0vLwkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLS8vCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0vLwkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0vLwkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwotLy8JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLS8vCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCU9ybUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJSRUZFUkVOQ0UiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCBvcm1Kb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0vLwkJCi0vLwkJYXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKG51bGwsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCQkKLS8vCQlwZXJzaXN0ZW50VHlwZTIuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpLm1ha2VTcGVjaWZpZWQoKTsKLS8vCQlPcm1NYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudFR5cGUyLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKS5nZXRNYXBwaW5nKCk7Ci0vLwkJam9pbkNvbHVtbiA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0vLwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJNWV9OQU1FIik7Ci0vLwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiTVlfUkVGRVJOQ0VfTkFNRSIpOwotLy8JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIkJBUjIiKTsKLS8vCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYyIik7Ci0vLwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotLy8JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotLy8JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0vLwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLS8vCi0vLwkJCi0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwotLy8JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCW9ybUpvaW5Db2x1bW4gPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zKCkubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiUkVGRVJFTkNFIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgb3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotLy8KLS8vCQkKLS8vCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLS8vCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQlvcm1Kb2luQ29sdW1uID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1ucygpLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIk1ZX05BTUUiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJNWV9SRUZFUk5DRV9OQU1FIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUjIiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRjIiLCBvcm1Kb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0vLwl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZE5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQlPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwotCQluYW1lZFF1ZXJ5LnNldE5hbWUoIkZPTyIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5MiA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7Ci0JCW5hbWVkUXVlcnkyLnNldE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybU5hbWVkUXVlcnkgbmFtZWRRdWVyeTMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDEpOwotCQluYW1lZFF1ZXJ5My5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVkUXVlcnkyLCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVkUXVlcnkzLCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVkUXVlcnksIG5hbWVkUXVlcmllcy5uZXh0KCkpOwotCQkKLQkJbmFtZWRRdWVyaWVzID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOwotCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLnNpemUoKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5yZW1vdmVOYW1lZFF1ZXJ5KDApOwotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5yZW1vdmVOYW1lZFF1ZXJ5KDApOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkUXVlcnkoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZU5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOwotCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubW92ZU5hbWVkUXVlcnkoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1OYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5tb3ZlTmFtZWRRdWVyeSgwLCAxKTsKLQkJbmFtZWRRdWVyaWVzID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZWRRdWVyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkUXVlcnkoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZFF1ZXJ5KCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWRRdWVyeSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1OYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLm1vdmUoMiwgMCk7Ci0JCW5hbWVkUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkubW92ZSgwLCAxKTsKLQkJbmFtZWRRdWVyaWVzID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5yZW1vdmUoMSk7Ci0JCW5hbWVkUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5yZW1vdmUoMSk7Ci0JCW5hbWVkUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTmFtZWROYXRpdmVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCW5hbWVkTmF0aXZlUXVlcnkuc2V0TmFtZSgiRk9PIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkyID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJbmFtZWROYXRpdmVRdWVyeTIuc2V0TmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5MyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMSk7Ci0JCW5hbWVkTmF0aXZlUXVlcnkzLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1OYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMobmFtZWROYXRpdmVRdWVyeTIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMobmFtZWROYXRpdmVRdWVyeTMsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMobmFtZWROYXRpdmVRdWVyeSwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKSk7Ci0JCQotCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTmFtZWROYXRpdmVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCi0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuc2l6ZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCWFzc2VydEVxdWFscygxLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTmFtZWROYXRpdmVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCi0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5tb3ZlTmFtZWROYXRpdmVRdWVyeSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDAsIDEpOwotCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lZE5hdGl2ZVF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWROYXRpdmVRdWVyeSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkTmF0aXZlUXVlcnkoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZE5hdGl2ZVF1ZXJ5KCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWROYXRpdmVRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5tb3ZlKDIsIDApOwotCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZE5hdGl2ZVF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLm1vdmUoMCwgMSk7Ci0JCW5hbWVkTmF0aXZlUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkTmF0aXZlUXVlcmllcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkucmVtb3ZlKDEpOwotCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkTmF0aXZlUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkucmVtb3ZlKDEpOwotCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWROYXRpdmVRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUlkQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdElkQ2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSAKLQkJCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUlkQ2xhc3NSZWZlcmVuY2UgaWRDbGFzc1JlZiA9IG9ybUVudGl0eS5nZXRJZENsYXNzUmVmZXJlbmNlKCk7Ci0JCQotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5zZXRJZENsYXNzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENsYXNzUmVmZXJlbmNlKCkpOwotCQlhc3NlcnROb3ROdWxsKGVudGl0eVJlc291cmNlLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JCQotCQlTdHJpbmcgbm9uRXhpc3RlbnRJZENsYXNzTmFtZSA9IFBBQ0tBR0VfTkFNRSArICIuRm9vIjsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0SWRDbGFzcygpLnNldENsYXNzTmFtZShub25FeGlzdGVudElkQ2xhc3NOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKG5vbkV4aXN0ZW50SWRDbGFzc05hbWUsIGVudGl0eVJlc291cmNlLmdldElkQ2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhub25FeGlzdGVudElkQ2xhc3NOYW1lLCBpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCVN0cmluZyBleGlzdGVudElkQ2xhc3NOYW1lID0gUEFDS0FHRV9OQU1FICsgIi5UZXN0VHlwZUlkIjsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0SWRDbGFzcygpLnNldENsYXNzTmFtZShleGlzdGVudElkQ2xhc3NOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKGV4aXN0ZW50SWRDbGFzc05hbWUsIGVudGl0eVJlc291cmNlLmdldElkQ2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhleGlzdGVudElkQ2xhc3NOYW1lLCBpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCS8vdGVzdCBzZXR0aW5nICBASWRDbGFzcyB2YWx1ZSB0byBudWxsLCBpZC1jbGFzcyB0YWcgaXMgbm90IHJlbW92ZWQKLQkJZW50aXR5UmVzb3VyY2UuZ2V0SWRDbGFzcygpLnNldENsYXNzTmFtZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRJZENsYXNzKCkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRJZENsYXNzKCkpOwotCQkKLQkJLy9yZXNldCBASWRDbGFzcyB2YWx1ZSBhbmQgdGhlbiByZW1vdmUgaWQtY2xhc3MgdGFnCi0JCWVudGl0eVJlc291cmNlLnNldElkQ2xhc3MoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2xhc3NSZWZlcmVuY2UoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldElkQ2xhc3MoKS5zZXRDbGFzc05hbWUoIm1vZGVsLkZvbyIpOwotCQllbnRpdHlSZXNvdXJjZS5zZXRJZENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RJZENsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gCi0JCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlJZENsYXNzUmVmZXJlbmNlIGlkQ2xhc3NSZWYgPSBvcm1FbnRpdHkuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRJZENsYXNzKCkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRJZENsYXNzKCkpOwotCQkKLQkJU3RyaW5nIG5vbkV4aXN0ZW50SWRDbGFzc05hbWUgPSBQQUNLQUdFX05BTUUgKyAiLkZvbyI7Ci0JCWlkQ2xhc3NSZWYuc2V0U3BlY2lmaWVkSWRDbGFzc05hbWUobm9uRXhpc3RlbnRJZENsYXNzTmFtZSk7Ci0JCWFzc2VydEVxdWFscyhub25FeGlzdGVudElkQ2xhc3NOYW1lLCBlbnRpdHlSZXNvdXJjZS5nZXRJZENsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobm9uRXhpc3RlbnRJZENsYXNzTmFtZSwgaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JCQotCQlTdHJpbmcgZXhpc3RlbnRJZENsYXNzTmFtZSA9IFBBQ0tBR0VfTkFNRSArICIuVGVzdFR5cGVJZCI7Ci0JCWlkQ2xhc3NSZWYuc2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoZXhpc3RlbnRJZENsYXNzTmFtZSk7Ci0JCWFzc2VydEVxdWFscyhleGlzdGVudElkQ2xhc3NOYW1lLCBlbnRpdHlSZXNvdXJjZS5nZXRJZENsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhpc3RlbnRJZENsYXNzTmFtZSwgaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JCQotCQlpZENsYXNzUmVmLnNldFNwZWNpZmllZElkQ2xhc3NOYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFByaW1hcnlLZXlDb2x1bW5OYW1lV2l0aEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHN1cGVyUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBzdWJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJT3JtRW50aXR5IGNoaWxkWG1sRW50aXR5ID0gKE9ybUVudGl0eSkgc3ViUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJc3VwZXJQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5hZGRUb1htbChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgY2hpbGRYbWxFbnRpdHkuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKSk7Ci0JCQotCQkoKE9ybUlkTWFwcGluZykgc3VwZXJQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0lEIik7Ci0JCWFzc2VydEVxdWFscygiTVlfSUQiLCBjaGlsZFhtbEVudGl0eS5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpKTsKLQotCQkvL1RPRE8gb25jZSBidWcgMjI4NzE4IGlzIGZpeGVkCi0JCU9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSBvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IGNoaWxkWG1sRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIklEIik7Ci0JCWFzc2VydEVxdWFscygiSUQiLCBjaGlsZFhtbEVudGl0eS5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWRDb25jcmV0ZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBlbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkpOwotCQkKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX0NISUxEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGVudGl0eS5kaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkQWJzdHJhY3RDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBlbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkpOwotCQkKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX0NISUxEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVBYnN0cmFjdFRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29uY3JldGVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgYWJzdHJhY3RQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRW50aXR5IGNvbmNyZXRlRW50aXR5ID0gKEVudGl0eSkgY29uY3JldGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBjb25jcmV0ZUVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKEVudGl0eSkgYWJzdHJhY3RQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGFic3RyYWN0RW50aXR5LmdldE5hbWUoKSk7Ci0KLQkJCi0JCS8vdGFibGUtcGVyLWNsYXNzLCBubyBkaXNjcmltaW5hdG9yIGNvbHVtbiBhbGxvd2VkCi0JCWFzc2VydEZhbHNlKGNvbmNyZXRlRW50aXR5LnNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKGFic3RyYWN0RW50aXR5LnNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKSk7Ci0KLQkJCi0JCS8vc2luZ2xlLXRhYmxlLCBkaXNjcmltaW5hdG9yIGNvbHVtbiBhbGxvd2VkIG9uIHJvb3QgZW50aXR5Ci0JCSgoSmF2YUVudGl0eSkgYWJzdHJhY3RQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3kobnVsbCk7Ci0JCWFzc2VydEZhbHNlKGNvbmNyZXRlRW50aXR5LnNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKSk7Ci0JCWFzc2VydFRydWUoYWJzdHJhY3RFbnRpdHkuc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0RW50aXR5R2V0RGVmYXVsdERpc2NyaW1pbmF0b3JDb2x1bW5OYW1lVGFibGVQZXJDbGFzc0luaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUFic3RyYWN0VGVzdEVudGl0eSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29uY3JldGVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgYWJzdHJhY3RQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRW50aXR5IGNvbmNyZXRlRW50aXR5ID0gKEVudGl0eSkgY29uY3JldGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBjb25jcmV0ZUVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKEVudGl0eSkgYWJzdHJhY3RQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGFic3RyYWN0RW50aXR5LmdldE5hbWUoKSk7Ci0KLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29uY3JldGVFbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGFic3RyYWN0RW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgY29uY3JldGVFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCQotCQkKLQkJYXNzZXJ0VHJ1ZShhYnN0cmFjdEVudGl0eS5kaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29uY3JldGVFbnRpdHkuc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbmNyZXRlRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFRydWUoYWJzdHJhY3RFbnRpdHkuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKGNvbmNyZXRlRW50aXR5LmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29uY3JldGVFbnRpdHkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUdlbmVyYXRlZFZhbHVlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1HZW5lcmF0ZWRWYWx1ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYjM4NDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUdlbmVyYXRlZFZhbHVlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1HZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpcHVibGljIGNsYXNzIE9ybUdlbmVyYXRlZFZhbHVlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1HZW5lcmF0ZWRWYWx1ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtR2VuZXJhdGVkVmFsdWUgb3JtR2VuZXJhdGVkVmFsdWUgPSBvcm1JZE1hcHBpbmcuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJWG1sR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWVSZXNvdXJjZSA9IGlkUmVzb3VyY2UuZ2V0R2VuZXJhdGVkVmFsdWUoKTsKLQkJCi0JCS8vc2V0IGdlbmVyYXRvciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZ2VuZXJhdGVkVmFsdWVSZXNvdXJjZS5zZXRHZW5lcmF0b3IoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUdlbmVyYXRlZFZhbHVlLmdldFNwZWNpZmllZEdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZW5lcmF0ZWRWYWx1ZVJlc291cmNlLmdldEdlbmVyYXRvcigpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlnZW5lcmF0ZWRWYWx1ZVJlc291cmNlLnNldEdlbmVyYXRvcihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1HZW5lcmF0ZWRWYWx1ZS5nZXRTcGVjaWZpZWRHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoZ2VuZXJhdGVkVmFsdWVSZXNvdXJjZS5nZXRHZW5lcmF0b3IoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUdlbmVyYXRlZFZhbHVlIG9ybUdlbmVyYXRlZFZhbHVlID0gb3JtSWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCVhtbElkIGlkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCVhtbEdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlUmVzb3VyY2UgPSBpZFJlc291cmNlLmdldEdlbmVyYXRlZFZhbHVlKCk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtR2VuZXJhdGVkVmFsdWUuc2V0U3BlY2lmaWVkR2VuZXJhdG9yKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZW5lcmF0ZWRWYWx1ZVJlc291cmNlLmdldEdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1HZW5lcmF0ZWRWYWx1ZS5nZXRTcGVjaWZpZWRHZW5lcmF0b3IoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtR2VuZXJhdGVkVmFsdWUuc2V0U3BlY2lmaWVkR2VuZXJhdG9yKG51bGwpOwotCQlhc3NlcnROdWxsKGdlbmVyYXRlZFZhbHVlUmVzb3VyY2UuZ2V0R2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKG9ybUdlbmVyYXRlZFZhbHVlLmdldFNwZWNpZmllZEdlbmVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdHNGcm9tSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtSWRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKElkTWFwcGluZykgb3JtSWRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQkKLQkJSWRNYXBwaW5nIGphdmFJZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlHZW5lcmF0ZWRWYWx1ZSBqYXZhR2VuZXJhdGVkVmFsdWUgPSBqYXZhSWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWphdmFHZW5lcmF0ZWRWYWx1ZS5zZXRTcGVjaWZpZWRHZW5lcmF0b3IoIkZvbyIpOwotCQlqYXZhR2VuZXJhdGVkVmFsdWUuc2V0U3BlY2lmaWVkU3RyYXRlZ3koR2VuZXJhdGlvblR5cGUuU0VRVUVOQ0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKS5nZXRTcGVjaWZpZWRHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyhHZW5lcmF0aW9uVHlwZS5TRVFVRU5DRSwgb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0U3BlY2lmaWVkU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgamF2YUdlbmVyYXRlZFZhbHVlLmdldFNwZWNpZmllZEdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKEdlbmVyYXRpb25UeXBlLlNFUVVFTkNFLCBqYXZhR2VuZXJhdGVkVmFsdWUuZ2V0U3BlY2lmaWVkU3RyYXRlZ3koKSk7Ci0JCQotCQlvcm1JZEF0dHJpYnV0ZS5hZGRUb1htbCgpOwotCQlvcm1JZEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJb3JtSWRNYXBwaW5nID0gKElkTWFwcGluZykgb3JtSWRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGphdmFHZW5lcmF0ZWRWYWx1ZS5nZXRTcGVjaWZpZWRHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyhHZW5lcmF0aW9uVHlwZS5TRVFVRU5DRSwgamF2YUdlbmVyYXRlZFZhbHVlLmdldFNwZWNpZmllZFN0cmF0ZWd5KCkpOwotCQkKLQkJKChPcm1QZXJzaXN0ZW50QXR0cmlidXRlKSBvcm1JZEF0dHJpYnV0ZSkucmVtb3ZlRnJvbVhtbCgpOwotCQlvcm1JZEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlvcm1JZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1JZEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0U3BlY2lmaWVkR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoR2VuZXJhdGlvblR5cGUuU0VRVUVOQ0UsIG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpLmdldFNwZWNpZmllZFN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGphdmFHZW5lcmF0ZWRWYWx1ZS5nZXRTcGVjaWZpZWRHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyhHZW5lcmF0aW9uVHlwZS5TRVFVRU5DRSwgamF2YUdlbmVyYXRlZFZhbHVlLmdldFNwZWNpZmllZFN0cmF0ZWd5KCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSWRNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1JZE1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjhlNmE4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1JZE1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5HZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5HZW5lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNlVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JtSWRNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1JZE1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLkNPTFVNTiwgSlBBLlRFTVBPUkFMLCBKUEEuVEVNUE9SQUxfVFlQRSwgSlBBLkdFTkVSQVRFRF9WQUxVRSwgSlBBLkdFTkVSQVRJT05fVFlQRSwgSlBBLlRBQkxFX0dFTkVSQVRPUiwgSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQ29sdW1uKG5hbWU9XCJNWV9DT0xVTU5cIiwgdW5pcXVlPXRydWUsIG51bGxhYmxlPWZhbHNlLCBpbnNlcnRhYmxlPWZhbHNlLCB1cGRhdGFibGU9ZmFsc2UsIGNvbHVtbkRlZmluaXRpb249XCJDT0xVTU5fREVGSU5JVElPTlwiLCB0YWJsZT1cIk1ZX1RBQkxFXCIsIGxlbmd0aD01LCBwcmVjaXNpb249Niwgc2NhbGU9NykiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRVNUQU1QKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5PUdlbmVyYXRpb25UeXBlLlRBQkxFLCBnZW5lcmF0b3I9XCJteVRhYmxlR2VuZXJhdG9yXCIpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAVGFibGVHZW5lcmF0b3IobmFtZT1cIm15VGFibGVHZW5lcmF0b3JcIiwgdGFibGU9XCJteVRhYmxlXCIsIGNhdGFsb2c9XCJteUNhdGFsb2dcIiwgc2NoZW1hPVwibXlTY2hlbWFcIiwgcGtDb2x1bW5OYW1lPVwibXlQa0NvbHVtbk5hbWVcIiwgdmFsdWVDb2x1bW5OYW1lPVwibXlWYWx1ZUNvbHVtbk5hbWVcIiwgcGtDb2x1bW5WYWx1ZT1cIm15UGtDb2x1bW5WYWx1ZVwiLCBpbml0aWFsVmFsdWU9MSwgYWxsb2NhdGlvblNpemU9MSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBTZXF1ZW5jZUdlbmVyYXRvcihuYW1lPVwibXlTZXF1ZW5jZUdlbmVyYXRvclwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1JZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGlkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJaWRSZXNvdXJjZS5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybUlkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBpZFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJaWRSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1JZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGlkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtSWRNYXBwaW5nLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIGlkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUlkTWFwcGluZy5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGlkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IHRlbXBvcmFsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlpZFJlc291cmNlLnNldFRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLkRBVEUpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLkRBVEUsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLkRBVEUsIGlkUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCi0JCWlkUmVzb3VyY2Uuc2V0VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgaWRSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQotCQlpZFJlc291cmNlLnNldFRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRVNUQU1QLCAoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVAsIGlkUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0KLQkJLy9zZXQgdGVtcG9yYWwgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJaWRSZXNvdXJjZS5zZXRUZW1wb3JhbChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJCQkKLQkJLy9zZXQgdGVtcG9yYWwgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5EQVRFKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLkRBVEUsIGlkUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgaWRSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0KLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FU1RBTVApOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRVNUQU1QLCBpZFJlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCi0JCS8vc2V0IHRlbXBvcmFsIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtSWRNYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCX0KLQkKLQkvL1RPRE8gdGVzdCBkZWZhdWx0cwotCS8vVE9ETyB0ZXN0IG92ZXJyaWRpbmcgamF2YSBtYXBwaW5nIHdpdGggYSBkaWZmZXJlbnQgbWFwcGluZyB0eXBlIGluIHhtbAotCi0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGlkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQkKLQkJb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGlkUmVzb3VyY2UuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQkJCQotCQkvL3RyeSBhZGRpbmcgYW5vdGhlciBzZXF1ZW5jZSBnZW5lcmF0b3IsIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0KLQkJb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydE5vdE51bGwoaWRSZXNvdXJjZS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0KLQkJb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCi0JCS8vdHJ5IHJlbW92aW5nIHRoZSBzZXF1ZW5jZSBnZW5lcmF0b3IgYWdhaW4sIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsJCQotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGlkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtSWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCQkKLQkJaWRSZXNvdXJjZS5zZXRTZXF1ZW5jZUdlbmVyYXRvcihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwoaWRSZXNvdXJjZS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCW9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtSWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCQkJCQotCQlpZFJlc291cmNlLnNldFNlcXVlbmNlR2VuZXJhdG9yKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtSWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCQotCQlvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoaWRSZXNvdXJjZS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCQkJCi0JCS8vdHJ5IGFkZGluZyBhbm90aGVyIHRhYmxlIGdlbmVyYXRvciwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCW9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVUYWJsZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxJZCBpZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQotCQlvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0Tm90TnVsbChpZFJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROb3ROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQotCQlvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkucmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0KLQkJLy90cnkgcmVtb3ZpbmcgdGhlIHRhYmxlIGdlbmVyYXRvciBhZ2Fpbiwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCW9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5yZW1vdmVUYWJsZUdlbmVyYXRvcigpOwkJCi0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVRhYmxlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGlkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtSWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCQkKLQkJaWRSZXNvdXJjZS5zZXRUYWJsZUdlbmVyYXRvcihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZUdlbmVyYXRvcigpKTsJCQotCQlhc3NlcnROb3ROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChpZFJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtSWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCQkKLQkJb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0KLQkJaWRSZXNvdXJjZS5zZXRUYWJsZUdlbmVyYXRvcihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkR2VuZXJhdGVkVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCQotCQlvcm1JZE1hcHBpbmcuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoaWRSZXNvdXJjZS5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCQkJCi0JCS8vdHJ5IGFkZGluZyBhbm90aGVyIHNlcXVlbmNlIGdlbmVyYXRvciwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCW9ybUlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVHZW5lcmF0ZWRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxJZCBpZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQotCQlvcm1JZE1hcHBpbmcuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChpZFJlc291cmNlLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQlhc3NlcnROb3ROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQotCQlvcm1JZE1hcHBpbmcucmVtb3ZlR2VuZXJhdGVkVmFsdWUoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0KLQkJLy90cnkgcmVtb3ZpbmcgdGhlIHNlcXVlbmNlIGdlbmVyYXRvciBhZ2Fpbiwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCW9ybUlkTWFwcGluZy5yZW1vdmVHZW5lcmF0ZWRWYWx1ZSgpOwkJCi0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlR2VuZXJhdGVkVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCQotCQlpZFJlc291cmNlLnNldEdlbmVyYXRlZFZhbHVlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEdlbmVyYXRlZFZhbHVlKCkpOwotCQkJCQotCQlhc3NlcnROb3ROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChpZFJlc291cmNlLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQkJCQotCQlpZFJlc291cmNlLnNldEdlbmVyYXRlZFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SWRNYXBwaW5nTm9VbmRlcnlsaW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb3JtSWRNYXBwaW5nLnNldE5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1JZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQotCQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUlkTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29sdW1uLmdldERlZmF1bHRTY2FsZSgpKTsKLQl9Ci0JCi0JLy9AQmFzaWMoZmV0Y2g9RmV0Y2hUeXBlLkxBWlksIG9wdGlvbmFsPWZhbHNlKQotCS8vQENvbHVtbihuYW1lPSJNWV9DT0xVTU4iLCB1bmlxdWU9dHJ1ZSwgbnVsbGFibGU9ZmFsc2UsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSwgCi0JLy8gICAgY29sdW1uRGVmaW5pdGlvbj0iQ09MVU1OX0RFRklOSVRJT04iLCB0YWJsZT0iTVlfVEFCTEUiLCBsZW5ndGg9NSwgcHJlY2lzaW9uPTYsIHNjYWxlPTcpIik7Ci0JLy9AQ29sdW1uKAotCS8vQExvYgotCS8vQFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FU1RBTVApCi0JLy9ARW51bWVyYXRlZChFbnVtVHlwZS5TVFJJTkcpCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImlkIiwgaWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MsIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQkKLQkJQ29sdW1uIGNvbHVtbiA9IGlkTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCBjb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFIiwgY29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCBjb2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDYpLCBjb2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDcpLCBjb2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JCQotCQlHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZSA9IGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoIm15VGFibGVHZW5lcmF0b3IiLCBnZW5lcmF0ZWRWYWx1ZS5nZXRTcGVjaWZpZWRHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyhHZW5lcmF0aW9uVHlwZS5UQUJMRSwgZ2VuZXJhdGVkVmFsdWUuZ2V0U3BlY2lmaWVkU3RyYXRlZ3koKSk7Ci0KLS8vID4+PiBJJ20gZ29pbmcgdG8gYXJndWUgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhICJ2aXJ0dWFsIiBnZW5lcmF0b3IsCi0vLyBzaW5jZSBhIEphdmEgZ2VuZXJhdG9yIGlzICpub3QqIG92ZXJyaWRkZW4gd2hlbiBpdHMgSUQgbWFwcGluZyAob3IgZW50aXR5KQotLy8gaXMgb3ZlcnJpZGRlbiBpbiB0aGUgb3JtLnhtbCBmaWxlIC0gYm90aCB0aGUgb3JtLnhtbCBJRCBtYXBwaW5nIGFuZCB0aGUKLS8vIEphdmEgbWFwcGluZyBjYW4gZGVmaW5lIGFuICJhY3RpdmUiIGdlbmVyYXRvciBhcyBsb25nIGFzIHRoZXkgaGF2ZSBkaWZmZXJlbnQKLS8vIG5hbWVzICB+Ymp2Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IpOwotLy8JCWFzc2VydEVxdWFscygibXlUYWJsZUdlbmVyYXRvciIsIHRhYmxlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJteVRhYmxlIiwgdGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJteUNhdGFsb2ciLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotLy8JCWFzc2VydEVxdWFscygibXlTY2hlbWEiLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJteVBrQ29sdW1uTmFtZSIsIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm15UGtDb2x1bW5WYWx1ZSIsIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJteVZhbHVlQ29sdW1uTmFtZSIsIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEpLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgdGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7Ci0KLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvcik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJteVNlcXVlbmNlR2VuZXJhdG9yIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCQotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRGYWxzZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUlkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUlkTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbHVtbi5pc0RlZmF1bHRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgb3JtQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Db2x1bW4uZ2V0U2NhbGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUlkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUlkTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIG9ybUNvbHVtbi5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29sdW1uLmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOwotCX0KLQkKLQkvLzMgdGhpbmdzIHRlc3RlZCBhYm92ZQotCS8vMS4gdmlydHVhbCBtYXBwaW5nIG1ldGFkYXRhIGNvbXBsZXRlPWZhbHNlIC0gZGVmYXVsdHMgYXJlIHRha2VuIGZyb20gdGhlIGphdmEgYW5ub3RhdGlvbnMKLQkvLzIuIHZpcnR1YWwgbWFwcGluZyBtZXRhZGF0YSBjb21wbGV0ZT10cnVlIC0gZGVmYXVsdHMgYXJlIHRha2VuIGZyb20gamF2YSBkZWZhdWx0cyxhbm5vdGF0aW9ucyBpZ25vcmVkCi0JLy8zLiBzcGVjaWZpZWQgbWFwcGluZyAobWV0YWRhdGEgY29tcGxldGU9dHJ1ZS9mYWxzZSAtIGRlZmF1bHRzIGFyZSB0YWtlbiBmcm9tIGphdmEgYW5ub3RhdGlvbnMKLQotCXB1YmxpYyB2b2lkIHRlc3RJZE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElkTW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElkTW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJZE1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SWRNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJZE1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJZE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJZE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJZE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSm9pbkNvbHVtblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSm9pbkNvbHVtblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYTNjMTEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUpvaW5Db2x1bW5UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1Kb2luQ29sdW1uVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1Kb2luQ29sdW1uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0JCQkJCi0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJam9pbkNvbHVtblJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXROYW1lKCkpOwotCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUoam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0JCQkJCi0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsJCQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uUmVzb3VyY2UgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKTsKLQkJCQkKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJam9pbkNvbHVtblJlc291cmNlLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uUmVzb3VyY2UuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtblJlc291cmNlLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUoam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCQkJCQotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtblJlc291cmNlLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uUmVzb3VyY2UuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXRDb2x1bW5EZWZpbml0aW9uKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtblJlc291cmNlLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJam9pbkNvbHVtblJlc291cmNlLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJam9pbkNvbHVtblJlc291cmNlLnNldENvbHVtbkRlZmluaXRpb24oIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtblJlc291cmNlLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uUmVzb3VyY2UuZ2V0VGFibGUoKSk7Ci0JCQotCQkvL3NldCB0YWJsZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJam9pbkNvbHVtblJlc291cmNlLnNldFRhYmxlKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQkKLQkJLy9zZXQgdGFibGUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJam9pbkNvbHVtblJlc291cmNlLnNldFRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldFRhYmxlKCkpOwotCQkKLQkJam9pbkNvbHVtblJlc291cmNlLnNldFRhYmxlKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsJCQotCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uUmVzb3VyY2UgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldFRhYmxlKCkpOwotCQkKLQkJLy9zZXQgdGFibGUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Kb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQkJCi0JCS8vc2V0IHRhYmxlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROdWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CQkKLQkJT3JtSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXROdWxsYWJsZSgpKTsKLQkJCi0JCS8vc2V0IG51bGxhYmxlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0TnVsbGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgam9pbkNvbHVtblJlc291cmNlLmdldE51bGxhYmxlKCkpOwotCQotCQkvL3NldCBudWxsYWJsZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0TnVsbGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uUmVzb3VyY2UuZ2V0TnVsbGFibGUoKSk7Ci0JCQotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtblJlc291cmNlLmdldE51bGxhYmxlKCkpOwotCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUoam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uUmVzb3VyY2UuZ2V0TnVsbGFibGUoKSk7Ci0JCQotCQkvL3NldCBudWxsYWJsZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtblJlc291cmNlLmdldE51bGxhYmxlKCkpOwotCQkKLQkJLy9zZXQgbnVsbGFibGUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Kb2luQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TnVsbGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CQkKLQkJT3JtSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uUmVzb3VyY2UuZ2V0VXBkYXRhYmxlKCkpOwotCQkKLQkJLy9zZXQgdXBkYXRhYmxlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0VXBkYXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0VXBkYXRhYmxlKCkpOwotCQotCQkvL3NldCB1cGRhdGFibGUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJam9pbkNvbHVtblJlc291cmNlLnNldFVwZGF0YWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uUmVzb3VyY2UuZ2V0VXBkYXRhYmxlKCkpOwotCQkKLQkJam9pbkNvbHVtblJlc291cmNlLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtblJlc291cmNlLmdldFVwZGF0YWJsZSgpKTsKLQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CQkKLQkJT3JtSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uUmVzb3VyY2UuZ2V0VXBkYXRhYmxlKCkpOwotCQkKLQkJLy9zZXQgdXBkYXRhYmxlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRVcGRhdGFibGUoKSk7Ci0JCQotCQkvL3NldCB1cGRhdGFibGUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Kb2luQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXRVcGRhdGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRJbnNlcnRhYmxlKCkpOwotCQkKLQkJLy9zZXQgaW5zZXJ0YWJsZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJam9pbkNvbHVtblJlc291cmNlLnNldEluc2VydGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0SW5zZXJ0YWJsZSgpKTsKLQkKLQkJLy9zZXQgaW5zZXJ0YWJsZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0SW5zZXJ0YWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldEluc2VydGFibGUoKSk7Ci0JCQotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRJbnNlcnRhYmxlKCkpOwotCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUoam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkSW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CQkKLQkJT3JtSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldEluc2VydGFibGUoKSk7Ci0JCQotCQkvL3NldCBpbnNlcnRhYmxlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtblJlc291cmNlLmdldEluc2VydGFibGUoKSk7Ci0JCQotCQkvL3NldCBpbnNlcnRhYmxlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXRJbnNlcnRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsJCQotCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uUmVzb3VyY2UgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRVbmlxdWUoKSk7Ci0JCQotCQkvL3NldCB1bmlxdWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRVbmlxdWUoKSk7Ci0JCi0JCS8vc2V0IHVuaXF1ZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0VW5pcXVlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRVbmlxdWUoKSk7Ci0JCQotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0VW5pcXVlKCkpOwotCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUoam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsJCQotCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uUmVzb3VyY2UgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRVbmlxdWUoKSk7Ci0JCQotCQkvL3NldCB1bmlxdWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Kb2luQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtblJlc291cmNlLmdldFVuaXF1ZSgpKTsKLQkJCi0JCS8vc2V0IHVuaXF1ZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldFVuaXF1ZSgpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSm9pblRhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1Kb2luVGFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjg5ZGMyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1Kb2luVGFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1Kb2luVGFibGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybUpvaW5UYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklELCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxQcm9qZWN0PiBwcm9qZWN0czsiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgUHJvamVjdCB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgcHJval9pZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9Iik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByb2plY3QuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhcmdldEVudGl0eVdpdGhCYWNrUG9pbnRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzIFByb2plY3QgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHByb2pfaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueShtYXBwZWRCeT1cInByb2plY3RzXCIiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248IiArIFRZUEVfTkFNRSArICI+IGVtcGxveWVlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9Iik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByb2plY3QuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKLQkJCi0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCW1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbWFueVRvTWFueS5nZXRKb2luVGFibGUoKS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLmdldE5hbWUoKSk7Ci0JCQotCQltYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkuZ2V0TmFtZSgpKTsKLQotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Kb2luVGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFueVRvTWFueS5nZXRKb2luVGFibGUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUpvaW5UYWJsZS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEpvaW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwcm9qZWN0cyIpOwotCQlNYW55VG9NYW55TWFwcGluZyB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgdmlydHVhbEpvaW5UYWJsZSA9IHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQljcmVhdGVUYXJnZXRFbnRpdHkoKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FXyArICJQcm9qZWN0Iik7Ci0KLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfUHJvamVjdCIsIHZpcnR1YWxKb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gdmlydHVhbEpvaW5UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpOwotLy9UT0RPIG5lZWQgdG8gdGVzdCBqb2luQ29sdW1uIGRlZmF1bHRzIGhlcmUgYXMgd2VsbCBhcyBpbiBqYXZhIGFuZCBhbGwgdGhlIHJlbGF0aW9uc2hpcCBtYXBwaW5nIHR5cGVzCi0vLwkJYXNzZXJ0RXF1YWxzKCJpZF9wcm9qZWN0X2lkIiwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkX3Byb2plY3RfaWQiLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJSm9pbkNvbHVtbiBpbnZlcnNlT3JtSm9pbkNvbHVtbiA9IHZpcnR1YWxKb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZF9wcm9qZWN0X2lkIiwgaW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZF9wcm9qZWN0X2lkIiwgaW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIGphdmFNYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YUpvaW5UYWJsZSBqYXZhSm9pblRhYmxlID0gamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWphdmFKb2luVGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWphdmFKb2luVGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQ0FUQUxPRyIpOwotCQlqYXZhSm9pblRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgiU0NIRU1BIik7Ci0JCUphdmFKb2luQ29sdW1uIGphdmFKb2luQ29sdW1uID0gamF2YUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJOQU1FIik7Ci0JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZFUkVOQ0VEX05BTUUiKTsKLQkJSmF2YUpvaW5Db2x1bW4gaW52ZXJzZUphdmFKb2luQ29sdW1uID0gamF2YUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIklOVkVSU0VfTkFNRSIpOwotCQlpbnZlcnNlSmF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIklOVkVSU0VfUkVGRVJFTkNFRF9OQU1FIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDQVRBTE9HIiwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlNDSEVNQSIsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCW9ybUpvaW5Db2x1bW4gPSB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTkFNRSIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSRUZFUkVOQ0VEX05BTUUiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlpbnZlcnNlT3JtSm9pbkNvbHVtbiA9IHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiSU5WRVJTRV9OQU1FIiwgaW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlZFUlNFX1JFRkVSRU5DRURfTkFNRSIsIGludmVyc2VPcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tSmF2YVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55KCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwcm9qZWN0cyIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQljcmVhdGVUYXJnZXRFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgdGFyZ2V0UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByb2plY3QiKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfUHJvamVjdCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkKLQkJKChKYXZhRW50aXR5KSB0YXJnZXRQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCSgoSmF2YUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicHJvamVjdHMiKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YU1hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInByb2plY3RzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJKQVZBX0pPSU5fVEFCTEUiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgdG8gdHJ1ZSwgd2lsbCBpZ25vcmUgamF2YSBhbm5vdGF0aW9uIHNldHRpbmdzCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJLy9vcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9Qcm9qZWN0Iiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCS8vcmVtb3ZlIG0tbSBtYXBwaW5nIGZyb20gdGhlIG9ybS54bWwgZmlsZQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnJlbW92ZUZyb21YbWwoKTsKLQkJLy9vcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInByb2plY3RzIik7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgdmlydHVhbEpvaW5UYWJsZSA9IHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX0pPSU5fVEFCTEUiLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ly9zcGVjaWZpZWROYW1lIHNpbmNlIHRoaXMgaXMgYSB2aXJ0dWFsIG1hcHBpbmcgbm93Ci0JCQotCQlqYXZhTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlqYXZhTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVJfRk9PIiwgdmlydHVhbEpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBQkxFX05BTUUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fVEFCTEVfTkFNRV9GT08iLCB2aXJ0dWFsSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJKChPcm1FbnRpdHkpIHRhcmdldFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fVEFSR0VUIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX05BTUVfT1JNX1RBUkdFVCIsIHZpcnR1YWxKb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRKb2luVGFibGUoKSk7Ci0JCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpKTsKLQkJbWFueVRvTWFueS5nZXRKb2luVGFibGUoKS5zZXRTY2hlbWEoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbWFueVRvTWFueS5nZXRKb2luVGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0JCi0JCS8vc2V0IFNjaGVtYSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJbWFueVRvTWFueS5nZXRKb2luVGFibGUoKS5zZXRTY2hlbWEoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbWFueVRvTWFueS5nZXRKb2luVGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0KLQkJbWFueVRvTWFueS5zZXRKb2luVGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKLQl9Ci0JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFNjaGVtYUZyb21KYXZhVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0vLwkJCi0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJWG1sRW50aXR5IHhtbEVudGl0eSA9IChYbWxFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQlhc3NlcnROdWxsKHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwkJCi0vLwkJeG1sRW50aXR5LmphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZFNjaGVtYSgiRm9vIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGb28iLCB4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8JCQotLy8JCXhtbEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0vLwkJYXNzZXJ0TnVsbCh4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8KLS8vCQl4bWxFbnRpdHkuZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotLy8JCXhtbEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotLy8JCWFzc2VydE51bGwoeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLS8vCQotLy8JCXhtbEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotLy8JCWFzc2VydE51bGwoeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLS8vCQkKLS8vCQl4bWxFbnRpdHkuZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwkJCi0vLwkJeG1sRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQmFyIik7Ci0vLwkJYXNzZXJ0TnVsbCh4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8JfQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFNjaGVtYU5vSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLS8vCQkKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0vLwkJWG1sRW50aXR5IHhtbEVudGl0eSA9IChYbWxFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQlhc3NlcnROdWxsKHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hRnJvbVBhcmVudCgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLS8vCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotLy8JCQotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotLy8JCVhtbEVudGl0eSBwYXJlbnRYbWxFbnRpdHkgPSAoWG1sRW50aXR5KSBwYXJlbnRPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0vLwkJWG1sRW50aXR5IGNoaWxkWG1sRW50aXR5ID0gKFhtbEVudGl0eSkgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0vLwkJCi0vLwkJYXNzZXJ0TnVsbChwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8JCWFzc2VydE51bGwoY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8JCQotLy8JCXBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZFNjaGVtYSgiRk9PIik7Ci0vLwkJYXNzZXJ0TnVsbChwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8KLS8vCQlwYXJlbnRYbWxFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLS8vCQlhc3NlcnROdWxsKHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwkJYXNzZXJ0TnVsbChjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hRnJvbVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCQotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCVhtbEVudGl0eSB4bWxFbnRpdHkgPSAoWG1sRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0vLwkJYXNzZXJ0TnVsbCh4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8JCQotLy8JCXhtbEVudGl0eS5lbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTY2hlbWEoIkZPTyIpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLS8vCQkKLS8vCQl4bWxFbnRpdHkuZW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkJBUiIpOwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLS8vCQkKLS8vCQl4bWxFbnRpdHkuamF2YUVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJKQVZBX1NDSEVNQSIpOwotLy8JCWFzc2VydEVxdWFscygiSkFWQV9TQ0hFTUEiLCB4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8JCQotLy8JCXhtbEVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkJMQUgiKTsKLS8vCQkvL3htbCBlbnRpdHkgbm93IGhhcyBhIHRhYmxlIGVsZW1lbnQgc28gZGVmYXVsdCBzY2hlbWEgaXMgbm90IHRha2VuIGZyb20gamF2YQotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLS8vCi0vLwkJCi0vLwkJeG1sRW50aXR5LmVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLS8vCi0vLwkJeG1sRW50aXR5LmVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNjaGVtYShudWxsKTsKLS8vCQlhc3NlcnROdWxsKHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwkJCi0vLwkJeG1sRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkpBVkFfU0NIRU1BIiwgeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLS8vCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkpOwotCQkKLQkJLy9zZXQgU2NoZW1hIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtSm9pblRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLmdldFNjaGVtYSgpKTsKLQkJCi0JCS8vc2V0IFNjaGVtYSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUpvaW5UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKLQkJCi0JCS8vc2V0IENhdGFsb2cgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpKTsKLQkJbWFueVRvTWFueS5nZXRKb2luVGFibGUoKS5zZXRDYXRhbG9nKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLmdldENhdGFsb2coKSk7Ci0JCi0JCS8vc2V0IENhdGFsb2cgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvTWFueS5nZXRKb2luVGFibGUoKS5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCW1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkuc2V0Q2F0YWxvZygiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbWFueVRvTWFueS5nZXRKb2luVGFibGUoKS5nZXRDYXRhbG9nKCkpOwotCi0JCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkpOwotCQkKLQkJLy9zZXQgQ2F0YWxvZyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUpvaW5UYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLmdldENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBDYXRhbG9nIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtSm9pblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRKb2luVGFibGUoKSk7Ci0JfQotCQotLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRDYXRhbG9nRnJvbUphdmFUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLS8vCQkKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLS8vCQlYbWxFbnRpdHkgeG1sRW50aXR5ID0gKFhtbEVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCWFzc2VydE51bGwoeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwkJCi0vLwkJeG1sRW50aXR5LmphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZENhdGFsb2coIkZvbyIpOwotLy8JCWFzc2VydEVxdWFscygiRm9vIiwgeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwkJCi0vLwkJeG1sRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLS8vCQlhc3NlcnROdWxsKHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotLy8KLS8vCQl4bWxFbnRpdHkuZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotLy8JCXhtbEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotLy8JCWFzc2VydE51bGwoeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwkKLS8vCQl4bWxFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLS8vCQlhc3NlcnROdWxsKHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotLy8JCQotLy8JCXhtbEVudGl0eS5lbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotLy8JCWFzc2VydEVxdWFscygiRm9vIiwgeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwkJCi0vLwkJeG1sRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQmFyIik7Ci0vLwkJYXNzZXJ0TnVsbCh4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRDYXRhbG9nTm9KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCQotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlYbWxFbnRpdHkgeG1sRW50aXR5ID0gKFhtbEVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCWFzc2VydE51bGwoeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Q2F0YWxvZ0Zyb21QYXJlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0vLwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLS8vCQkKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnRPcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBjaGlsZE9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLS8vCQlYbWxFbnRpdHkgcGFyZW50WG1sRW50aXR5ID0gKFhtbEVudGl0eSkgcGFyZW50T3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCVhtbEVudGl0eSBjaGlsZFhtbEVudGl0eSA9IChYbWxFbnRpdHkpIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCQotLy8JCWFzc2VydE51bGwocGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwkJYXNzZXJ0TnVsbChjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotLy8JCQotLy8JCXBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZENhdGFsb2coIkZPTyIpOwotLy8JCWFzc2VydE51bGwocGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotLy8KLS8vCQlwYXJlbnRYbWxFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLS8vCQlhc3NlcnROdWxsKHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotLy8JCWFzc2VydE51bGwoY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRDYXRhbG9nRnJvbVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCQotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCVhtbEVudGl0eSB4bWxFbnRpdHkgPSAoWG1sRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0vLwkJYXNzZXJ0TnVsbCh4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLS8vCQkKLS8vCQl4bWxFbnRpdHkuZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2F0YWxvZygiRk9PIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLS8vCQkKLS8vCQl4bWxFbnRpdHkuZW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJCQVIiKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotLy8JCQotLy8JCXhtbEVudGl0eS5qYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJKQVZBX0NBVEFMT0ciKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkpBVkFfQ0FUQUxPRyIsIHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotLy8JCQotLy8JCXhtbEVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkJMQUgiKTsKLS8vCQkvL3htbCBlbnRpdHkgbm93IGhhcyBhIHRhYmxlIGVsZW1lbnQgc28gZGVmYXVsdCBzY2hlbWEgaXMgbm90IHRha2VuIGZyb20gamF2YQotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwotLy8JCQotLy8JCXhtbEVudGl0eS5lbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLS8vCi0vLwkJeG1sRW50aXR5LmVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhdGFsb2cobnVsbCk7Ci0vLwkJYXNzZXJ0TnVsbCh4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLS8vCQkKLS8vCQl4bWxFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotLy8JCWFzc2VydEVxdWFscygiSkFWQV9DQVRBTE9HIiwgeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vL30KLQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlYbWxFbnRpdHkgeG1sRW50aXR5ID0gKFhtbEVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCUVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHhtbEVudGl0eS5nZXROYW1lKCkpOwotLy8JCQotLy8JCS8vc2V0IGNsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotLy8JCWVudGl0eVJlc291cmNlLnNldENsYXNzTmFtZSgiY29tLkJhciIpOwotLy8JCWFzc2VydEVxdWFscygiQmFyIiwgeG1sRW50aXR5LmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJZW50aXR5UmVzb3VyY2Uuc2V0TmFtZSgiQmF6Iik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCYXoiLCB4bWxFbnRpdHkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQkvL3NldCBjbGFzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotLy8JCWVudGl0eVJlc291cmNlLnNldENsYXNzTmFtZShudWxsKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJheiIsIHhtbEVudGl0eS5nZXROYW1lKCkpOwotLy8JCQotLy8JCWVudGl0eVJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0vLwkJYXNzZXJ0TnVsbCh4bWxFbnRpdHkuZ2V0TmFtZSgpKTsKLS8vCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbjIgPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbjMgPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtbjMuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJCi0JCW9ybUpvaW5UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlvcm1Kb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJb3JtSm9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1Kb2luVGFibGUubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW9ybUpvaW5UYWJsZS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVJbnZlcnNlSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkubW92ZSgyLCAwKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5tb3ZlKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbjIgPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbjMgPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW4zLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjIsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMywgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4sIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCQotCQlqb2luQ29sdW1ucyA9IG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQkKLQkJb3JtSm9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlvcm1Kb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJb3JtSm9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3JtSm9pblRhYmxlLm1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW9ybUpvaW5UYWJsZS5tb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJbWFueVRvTWFueS5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlKCkpOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQkKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5tb3ZlKDIsIDApOwotCQlqb2luQ29sdW1ucyA9IG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5tb3ZlKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Kb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiZm9vIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiYmFyIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUpvaW5UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJbWFueVRvTWFueS5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlKCkpOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsICBvcm1Kb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiZm9vIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDEsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiYmFyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgIG9ybUpvaW5UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlvcm1Kb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJb3JtSm9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCW9ybUpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0KLQkJb3JtSm9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCW9ybUpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlvcm1Kb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpKTsKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCW9ybUpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlvcm1Kb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJb3JtSm9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5zaXplKCkpOwotCi0JCW9ybUpvaW5UYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Kb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJCi0JCW9ybUpvaW5UYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtSm9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJb3JtSm9pblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtSm9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJbWFueVRvTWFueS5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlKCkpOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQkKLQkJb3JtSm9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCW9ybUpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlvcm1Kb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3JtSm9pblRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Kb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQotCi0JCW9ybUpvaW5UYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Kb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCi0JCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkZPTyIpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMSwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJCQVIiKTsKLQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiQkFaIik7Ci0KLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IG9ybUpvaW5UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLm1vdmUoMiwgMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtSm9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5tb3ZlKDAsIDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUpvaW5UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkucmVtb3ZlKDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUpvaW5UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtSm9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnJlbW92ZSgwKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Kb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50c0Zyb21KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSB2aXJ0dWFsQXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIHZpcnR1YWxKb2luVGFibGUgPSB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdmlydHVhbEpvaW5UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0KLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIGphdmFNYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFKb2luVGFibGUgamF2YUpvaW5UYWJsZSA9IGphdmFNYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJamF2YUpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlqYXZhSm9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCWphdmFKb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQotCQl1bmlxdWVDb25zdHJhaW50cyA9IHZpcnR1YWxKb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlPcm1NYW55VG9NYW55TWFwcGluZyBzcGVjaWZpZWRNYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgKChWaXJ0dWFsT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgdmlydHVhbEF0dHJpYnV0ZSkuYWRkVG9YbWwoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygwLCAgc3BlY2lmaWVkTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInByb2plY3RzIikuYWRkVG9YbWwoKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwcm9qZWN0cyIpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQkvL2pvaW5UYWJsZSBkZWZhdWx0IG5hbWUgaXMgbnVsbCBiZWNhdXNlIHRhcmdldEVudGl0eSBpcyBub3QgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJLy9hZGQgdGFyZ2V0IGVudGl0eSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCwgbm93IGpvaW4gdGFibGUgbmFtZSBpcyBbdGFibGUgbmFtZV1fW3RhcmdldCB0YWJsZSBuYW1lXQotCQljcmVhdGVUYXJnZXRFbnRpdHkoKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Qcm9qZWN0Iik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX1Byb2plY3QiLCBqb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKLQkKLQkJLy90YXJnZXQgZW50aXR5IGRvZXMgbm90IHJlc29sdmUsIGRlZmF1bHQgbmFtZSBpcyBudWxsCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiRm9vIik7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCS8vZGVmYXVsdCB0YXJnZXQgZW50aXR5IGRvZXMgcmVzb2x2ZSwgc28gZGVmYXVsdCBuYW1lIGlzIGFnYWluIFt0YWJsZSBuYW1lXV9bdGFyZ2V0IHRhYmxlIG5hbWVdCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfUHJvamVjdCIsIGpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkvL2FkZCB0aGUgam9pbiB0YWJsZSB4bWwgZWxlbWVudCwgdmVyaWZ5IGRlZmF1bHQgam9pbiB0YWJsZSBuYW1lIGlzIHRoZSBzYW1lCi0JCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfUHJvamVjdCIsIGpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKLQkJCi0JCS8vc2V0IGEgdGFibGUgb24gdGhlIHRhcmdldCBlbnRpdHksIHZlcnkgZGVmYXVsdCBqb2luIHRhYmxlIG5hbWUgdXBkYXRlcwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0ZPTyIsIGpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IGEgdGFibGUgb24gdGhlIG93bmluZyBlbnRpdHksIHZlcnkgZGVmYXVsdCBqb2luIHRhYmxlIG5hbWUgdXBkYXRlcwotCQkoKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCBqb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInByb2plY3RzIikuYWRkVG9YbWwoKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwcm9qZWN0cyIpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5UYWJsZS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gam9pblRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJLy9qb2luVGFibGUgZGVmYXVsdCBuYW1lIGlzIG51bGwgYmVjYXVzZSB0YXJnZXRFbnRpdHkgaXMgbm90IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJLy9hZGQgdGFyZ2V0IGVudGl0eSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCwgam9pbiBjb2x1bW4gZGVmYXVsdCBuYW1lIGFuZCByZWZlcmVuY2VkIGNvbHVtbiBzdGlsbCBudWxsIGJlY2F1c2Ugb3duaW5nIGVudGl0eSBoYXMgbm8gcHJpbWFyeSBrZXkKLQkJY3JlYXRlVGFyZ2V0RW50aXR5KCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJvamVjdCIpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJvamVjdHNfcHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQkvL2NyZWF0ZSBwcmltYXJ5IGtleSAgaW4gb3duaW5nIGVudGl0eQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2lkIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2plY3RzX3Byb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCS8vc2V0IHNwZWNpZmllZCBjb2x1bW4gbmFtZSBvbiBwcmltYXJ5IGtleSBpbiBvd25pbmcgZW50aXR5Ci0JCSgoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0lEIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX01ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9JRCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2plY3RzX3Byb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRKb2luVGFibGUoKSk7Ci0JCi0JCS8vdGFyZ2V0IGVudGl0eSBkb2VzIG5vdCByZXNvbHZlLCBpbnZlcnNlIGpvaW4gY29sdW1uIG5hbWUgYW5kIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgaXMgbnVsbAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9NWV9JRCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJLy9kZWZhdWx0IHRhcmdldCBlbnRpdHkgZG9lcyByZXNvbHZlLCBzbyBkZWZhdWx0cyBmb3Igam9pbiBjb2x1bW4gYXJlIGJhY2sKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9NWV9JRCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qZWN0c19wcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQkvL2FkZCB0aGUgam9pbiB0YWJsZSB4bWwgZWxlbWVudCwgdmVyaWZ5IGRlZmF1bHQgam9pbiBjb2x1bW4gZGVmYXVsdHMgYXJlIHRoZSBzYW1lCi0JCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJvamVjdHNfcHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwobWFueVRvTWFueS5nZXRKb2luVGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRKb2luQ29sdW1uc0JpZGlyZWN0aW9uYWxSZWxhdGlvbnNoaXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwcm9qZWN0cyIpLmFkZFRvWG1sKCk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicHJvamVjdHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbiA9IGpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCS8vam9pblRhYmxlIGRlZmF1bHQgbmFtZSBpcyBudWxsIGJlY2F1c2UgdGFyZ2V0RW50aXR5IGlzIG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCS8vYWRkIHRhcmdldCBlbnRpdHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIGpvaW4gY29sdW1uIGRlZmF1bHQgbmFtZSBhbmQgcmVmZXJlbmNlZCBjb2x1bW4gc3RpbGwgbnVsbCBiZWNhdXNlIG93bmluZyBlbnRpdHkgaGFzIG5vIHByaW1hcnkga2V5Ci0JCWNyZWF0ZVRhcmdldEVudGl0eVdpdGhCYWNrUG9pbnRlcigpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByb2plY3QiKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2plY3RzX3Byb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJLy9jcmVhdGUgcHJpbWFyeSBrZXkgIGluIG93bmluZyBlbnRpdHkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlc19pZCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBqb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qZWN0c19wcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQkvL3NldCBzcGVjaWZpZWQgY29sdW1uIG5hbWUgb24gcHJpbWFyeSBrZXkgaW4gb3duaW5nIGVudGl0eQotCQkoKElkTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9JRCIpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlc19NWV9JRCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qZWN0c19wcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkpOwotCQotCQkvL3RhcmdldCBlbnRpdHkgZG9lcyBub3QgcmVzb2x2ZSwgaW52ZXJzZSBqb2luIGNvbHVtbiBuYW1lIGFuZCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGlzIG51bGwKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCS8vZGVmYXVsdCB0YXJnZXQgZW50aXR5IGRvZXMgcmVzb2x2ZSwgc28gZGVmYXVsdHMgZm9yIGpvaW4gY29sdW1uIGFyZSBiYWNrCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZXNfTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJvamVjdHNfcHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJLy9hZGQgdGhlIGpvaW4gdGFibGUgeG1sIGVsZW1lbnQsIHZlcmlmeSBkZWZhdWx0IGpvaW4gY29sdW1uIGRlZmF1bHRzIGFyZSB0aGUgc2FtZQotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wbG95ZWVzX01ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9JRCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2plY3RzX3Byb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODNjYTVjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5DYXNjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklELCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlmb3IgKE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQllYWNoLmFkZFRvWG1sKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPFN0cmluZywgQWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxTdHJpbmcsIEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBhYmJyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5TWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5GRVRDSF9UWVBFLCBKUEEuQ0FTQ0FERV9UWVBFLCBKUEEuT1JERVJfQlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55KGZldGNoPUZldGNoVHlwZS5FQUdFUiwgdGFyZ2V0RW50aXR5PUFkZHJlc3MuY2xhc3MsIGNhc2NhZGU9e0Nhc2NhZGVUeXBlLkFMTCwgQ2FzY2FkZVR5cGUuUEVSU0lTVCwgQ2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRSwgQ2FzY2FkZVR5cGUuUkVGUkVTSH0pIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT3JkZXJCeShcImNpdHlcIiIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hbnlUb01hbnkuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueS5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG1hbnlUb01hbnkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYW55VG9NYW55LnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFueVRvTWFueS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG1hbnlUb01hbnkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnkuc2V0VGFyZ2V0RW50aXR5KCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5IiwgbWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvTWFueS5zZXRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkJCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIm5ld1RhcmdldEVudGl0eSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBtYW55VG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueVJlc291cmNlLmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueVJlc291cmNlLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5FQUdFUiwgbWFueVRvTWFueVJlc291cmNlLmdldEZldGNoKCkpOwotCQotCQltYW55VG9NYW55UmVzb3VyY2Uuc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5MQVpZLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0KLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvTWFueVJlc291cmNlLnNldEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlksIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQotCQkvL3NldCBmZXRjaCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneSBzdHJhdGVneSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKHN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcHBlZEJ5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55LnNldE1hcHBlZEJ5KCJuZXdNYXBwZWRCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5Iiwgc3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQotCQkvL3NldG1hcHBlZEJ5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnkuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWFzc2VydE51bGwoc3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1NYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5ID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwoc3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCXN0cmF0ZWd5LnNldE1hcHBlZEJ5QXR0cmlidXRlKCJuZXdNYXBwZWRCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5Iiwgc3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQotCQkvL3NldCBtYXBwZWRCeSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXN0cmF0ZWd5LnNldE1hcHBlZEJ5QXR0cmlidXRlKG51bGwpOwotCQlhc3NlcnROdWxsKHN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1NYW55VG9NYW55UmVsYXRpb25zaGlwIHJlbCA9IGNvbnRleHRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU1hbnlUb01hbnlSZWxhdGlvbnNoaXAgcmVsID0gY29udGV4dE1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwcGVkQnkoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBwZWRCeShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0Sm9pblRhYmxlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQltYW55VG9NYW55LnNldE1hcEtleShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROb3ROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueS5nZXRNYXBLZXkoKS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Iiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFueVRvTWFueS5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvTWFueS5nZXRNYXBLZXkoKS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JCQotCQltYW55VG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCW1hbnlUb01hbnkuc2V0TWFwS2V5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleSgpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibXlNYXBLZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0Tm9NYXBLZXkodHJ1ZSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWaXJ0dWFsTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJTWFueVRvTWFueU1hcHBpbmcgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YU1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JCQotCQkvL3NldCBwayBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLnNldFBrTWFwS2V5KHRydWUpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQkJCi0JCQotCQkvL3NldCBjdXN0b20gc3BlY2lmaWVkIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuc2V0Q3VzdG9tTWFwS2V5KHRydWUpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJjaXR5Iik7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPcmRlckJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE9yZGVyQnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG9yZGVyQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnkuc2V0T3JkZXJCeSgibmV3T3JkZXJCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBtYW55VG9NYW55LmdldE9yZGVyQnkoKSk7Ci0JCi0JCS8vc2V0IG9yZGVyQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvTWFueS5zZXRPcmRlckJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRPcmRlckJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5T3JkZXJCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRPcmRlckJ5KCkpOwotCQkJCQotCQkvL3NldCBtYXBwZWRCeSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgibmV3T3JkZXJCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBtYW55VG9NYW55LmdldE9yZGVyQnkoKSk7Ci0JCi0JCS8vc2V0IG1hcHBlZEJ5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0T3JkZXJCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzTm9PcmRlcmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydFRydWUob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNOb09yZGVyaW5nKCkpOwotCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImZvbyIpOwotCQlhc3NlcnRGYWxzZShvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JCQotCQlvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KG51bGwpOwotCQlhc3NlcnRUcnVlKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzTm9PcmRlcmluZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5vT3JkZXJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRUcnVlKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzTm9PcmRlcmluZygpKTsKLQotCQlvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJmb28iKTsKLQkJYXNzZXJ0RmFsc2Uob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNOb09yZGVyaW5nKCkpOwotCQkKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0Tm9PcmRlcmluZyh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQl9Ci0vL1RPRE8KLS8vCXB1YmxpYyBib29sZWFuIGlzT3JkZXJCeVBrKCkgewotLy8JCXJldHVybiAiIi5lcXVhbHMoZ2V0T3JkZXJCeSgpKTsKLS8vCX0KLS8vCi0vLwlwdWJsaWMgdm9pZCBzZXRPcmRlckJ5UGsoKSB7Ci0vLwkJc2V0T3JkZXJCeSgiIik7Ci0vLwl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDdXN0b21PcmRlcmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEZhbHNlKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzQ3VzdG9tT3JkZXJpbmcoKSk7Ci0KLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiZm9vIik7Ci0JCWFzc2VydFRydWUob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNDdXN0b21PcmRlcmluZygpKTsKLQkJCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkobnVsbCk7Ci0JCWFzc2VydEZhbHNlKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzQ3VzdG9tT3JkZXJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYW55VG9NYW55TW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJtYXBLZXkiKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYW55VG9NYW55TW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJjdXN0b21PcmRlciIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm1hcEtleSIpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYW55VG9NYW55TW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibWFwS2V5Iik7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYW55VG9NYW55TW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJtYXBLZXkiKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYW55VG9NYW55TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJjdXN0b21PcmRlciIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm1hcEtleSIpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFueVRvTWFueU1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibWFwS2V5Iik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibWFwcGVkQnkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldEFsbCh0cnVlKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlZnJlc2godHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygiVGFyZ2V0RW50aXR5IiwgKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibWFwcGVkQnkiLCAoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc0FsbCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKCgoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydFRydWUoKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNSZW1vdmUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYW55VG9NYW55TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibWFwS2V5Iik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiaW52ZXJzZU5hbWUiKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImludmVyc2VSZWZlcmVuY2VOYW1lIik7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygiVGFyZ2V0RW50aXR5IiwgKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRUcnVlKCgoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc0FsbCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKCgoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydFRydWUoKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUmVtb3ZlKCkpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX1RBQkxFIiwgam9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGpvaW5UYWJsZS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicmVmZXJlbmNlTmFtZSIsIGpvaW5UYWJsZS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImludmVyc2VOYW1lIiwgam9pblRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW52ZXJzZVJlZmVyZW5jZU5hbWUiLCBqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYW55VG9NYW55TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibWFwS2V5Iik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIlRhcmdldEVudGl0eSIsICgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRUcnVlKCgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlbW92ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hbnlUb01hbnlNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJjdXN0b21PcmRlciIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm1hcEtleSIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRQZXJzaXN0KHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlbW92ZSh0cnVlKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0vL1RPRE8JYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChJQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gCi0JCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnROdWxsKHN0YXRlRm9vTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCU1hbnlUb01hbnlNYXBwaW5nIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJTWFueVRvTWFueU1hcHBpbmcgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YU1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuYWRkVG9YbWwoKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgc3BlY2lmaWVkTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCW1hcEtleU5hbWVzID0gc3BlY2lmaWVkTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlzcGVjaWZpZWRNYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IHNwZWNpZmllZE1hbnlUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlzcGVjaWZpZWRNYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlN0cmluZyIpOwotCQltYXBLZXlOYW1lcyA9IHNwZWNpZmllZE1hbnlUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCU1hbnlUb01hbnlNYXBwaW5nIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuCi0JCQlnZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0KLQkJQ2FzY2FkZSBjYXNjYWRlID0gdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCi0JCWFzc2VydFRydWUodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzQ3VzdG9tT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZLCB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQotCQl2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbChNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkFkZHJlc3MiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCi0JCUNhc2NhZGUgY2FzY2FkZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YzE5ZTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5TWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5GRVRDSF9UWVBFLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lKGZldGNoPUZldGNoVHlwZS5MQVpZLCBvcHRpb25hbD1mYWxzZSwgdGFyZ2V0RW50aXR5PUFkZHJlc3MuY2xhc3MsIGNhc2NhZGU9e0Nhc2NhZGVUeXBlLkFMTCwgQ2FzY2FkZVR5cGUuUEVSU0lTVCwgQ2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRSwgQ2FzY2FkZVR5cGUuUkVGUkVTSH0pIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASm9pbkNvbHVtbihuYW1lPVwiTVlfQ09MVU1OXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lPVwiTVlfUkVGRVJFTkNFRF9DT0xVTU5cIiwgdW5pcXVlPXRydWUsIG51bGxhYmxlPWZhbHNlLCBpbnNlcnRhYmxlPWZhbHNlLCB1cGRhdGFibGU9ZmFsc2UsIGNvbHVtbkRlZmluaXRpb249XCJDT0xVTU5fREVGSU5JVElPTlwiLCB0YWJsZT1cIk1ZX1RBQkxFXCIpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCQotCQkJfQotCQl9KTsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWZvciAoT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCWVhY2guYWRkVG9YbWwoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvT25lIG1hbnlUb09uZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFueVRvT25lLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb09uZS5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgbWFueVRvT25lLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvT25lLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYW55VG9PbmUuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTWFueVRvT25lTWFwcGluZy5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgbWFueVRvT25lLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1NYW55VG9PbmVNYXBwaW5nLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nIG9ybU1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb09uZSBtYW55VG9PbmUgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkJCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9PbmUuc2V0VGFyZ2V0RW50aXR5KCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb09uZS5zZXRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIm5ld1RhcmdldEVudGl0eSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1NYW55VG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvT25lIG1hbnlUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQkJCQkKLQkJLy9zZXQgZmV0Y2ggaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb09uZVJlc291cmNlLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkVBR0VSLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQkKLQkJbWFueVRvT25lUmVzb3VyY2Uuc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlksIG1hbnlUb09uZVJlc291cmNlLmdldEZldGNoKCkpOwotCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb09uZVJlc291cmNlLnNldEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZVJlc291cmNlLmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIsIG1hbnlUb09uZVJlc291cmNlLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQotCQlvcm1NYW55VG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlksIG1hbnlUb09uZVJlc291cmNlLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0KLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1NYW55VG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZVJlc291cmNlLmdldEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZVJlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQkJCQotCQkvL3NldCBvcHRpb25hbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvT25lUmVzb3VyY2Uuc2V0T3B0aW9uYWwoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFueVRvT25lUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JCi0JCW1hbnlUb09uZVJlc291cmNlLnNldE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hbnlUb09uZVJlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCi0JCS8vc2V0IG9wdGlvbmFsIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb09uZVJlc291cmNlLnNldE9wdGlvbmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZVJlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQkJCQotCQkvL3NldCBvcHRpb25hbCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkKLQkJb3JtTWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hbnlUb09uZVJlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQotCQkvL3NldCBvcHRpb25hbCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hbnlUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5ID0gb3JtTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJWG1sTWFueVRvT25lIG1hbnlUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHN0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbjIgPSBzdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IHN0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW4zLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG1hbnlUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nIG9ybU1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBzdHJhdGVneSA9IG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCVhtbE1hbnlUb09uZSBtYW55VG9PbmVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0KLQkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQlzdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG1hbnlUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlzdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG1hbnlUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlzdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZyBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtTWFueVRvT25lUmVsYXRpb25zaGlwIHJlbCA9IGNvbnRleHRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFueVRvT25lIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZyBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtTWFueVRvT25lUmVsYXRpb25zaGlwIHJlbCA9IGNvbnRleHRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFueVRvT25lIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nIG9ybU1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBzdHJhdGVneSA9IG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCVhtbE1hbnlUb09uZSBtYW55VG9PbmVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0KLQkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQkKLQkJc3RyYXRlZ3kubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG1hbnlUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJc3RyYXRlZ3kubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gc3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG1hbnlUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYW55VG9PbmVNYXBwaW5nTm9VbmRlcnlsaW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5TWFueVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nIG9ybU1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9ybU1hbnlUb09uZU1hcHBpbmcuc2V0TmFtZSgiZm9vIik7Ci0JCU9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBzdHJhdGVneSA9IG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybU1hbnlUb09uZU1hcHBpbmcuaXNPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQotCQkKLQkJYXNzZXJ0RmFsc2Uoc3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCS8vVE9ETyBkZWZhdWx0IGpvaW5Db2x1bW5zCi0JCS8vYXNzZXJ0VHJ1ZShvcm1NYW55VG9PbmVNYXBwaW5nLmRlZmF1bHRKb2luQ29sdW1ucygpLmhhc05leHQoKSk7Ci0JCi0JCi0JCUNhc2NhZGUgY2FzY2FkZSA9IG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgbWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCBtYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ09MVU1OIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1JFRkVSRU5DRURfQ09MVU1OIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCBqb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEUiLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCi0JCUNhc2NhZGUgY2FzY2FkZSA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmFkZFRvWG1sKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCU9ybU1hbnlUb09uZU1hcHBpbmcgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1NYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdE9wdGlvbmFsKCkpOwotCQkvL1RPRE8gaG1tLCBpcyB0aGlzIGNvcnJlY3Q/Ci0JCWFzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJLy9UT0RPIGRlZmF1bHQgam9pbiBjb2x1bW5zIGluIHhtbCBvbmUtdG8tb25lCi0vLwkJWG1sSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtTWFueVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKLS8vCQkvL1RPRE8gamF2YSBkZWZhdWx0IGNvbHVtbnMgbmFtZSBpbiBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5Kb2luQ29sdW1uT3duZXIKLS8vCQkvL2Fzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCQkvL2Fzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0KLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtTWFueVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5TWFueVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1NYW55VG9PbmVNYXBwaW5nLmlzT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJYXNzZXJ0RmFsc2Uob3JtTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJCi0JCS8vVE9ETyBkZWZhdWx0IGpvaW4gY29sdW1ucyBmb3Igc3BlY2lmaWVkIHhtbE1hbnlUb09uZSBtYXBwaW5nCi0vLwkJWG1sSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtTWFueVRvT25lTWFwcGluZy5kZWZhdWx0Sm9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFVuaXF1ZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHROdWxsYWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRJbnNlcnRhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFVwZGF0YWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCi0JCUNhc2NhZGUgY2FzY2FkZSA9IG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQl9Ci0JCi0JLy8zIHRoaW5ncyB0ZXN0ZWQgYWJvdmUKLQkvLzEuIHZpcnR1YWwgbWFwcGluZyBtZXRhZGF0YSBjb21wbGV0ZT1mYWxzZSAtIGRlZmF1bHRzIGFyZSB0YWtlbiBmcm9tIHRoZSBqYXZhIGFubm90YXRpb25zCi0JLy8yLiB2aXJ0dWFsIG1hcHBpbmcgbWV0YWRhdGEgY29tcGxldGU9dHJ1ZSAtIGRlZmF1bHRzIGFyZSB0YWtlbiBmcm9tIGphdmEgZGVmYXVsdHMsYW5ub3RhdGlvbnMgaWdub3JlZAotCS8vMy4gc3BlY2lmaWVkIG1hcHBpbmcgKG1ldGFkYXRhIGNvbXBsZXRlPXRydWUvZmFsc2UgLSBkZWZhdWx0cyBhcmUgdGFrZW4gZnJvbSBqYXZhIGFubm90YXRpb25zCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NzhkYzMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdElkQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlRlc3RUeXBlSWQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiVGVzdFR5cGVJZC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybU1hcHBlZFN1cGVyY2xhc3Mgb3JtTWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQkJCi0JCS8vc2V0IGNsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKCJjb20uQmFyIik7Ci0JCWFzc2VydEVxdWFscygiY29tLkJhciIsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoImNvbS5CYXIiLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCQotCQkvL3NldCBjbGFzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnROdWxsKG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL3NldCBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2xhc3MoImNvbS5CYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJjb20uQmFyIiwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscygiY29tLkJhciIsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL3NldCBjbGFzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQl9Ci0JLy9UT0RPIGFkZCB0ZXN0cyBmb3Igc2V0dGluZyB0aGUgY2xhc3NOYW1lIHdoZW4gdGhlIHBhY2thZ2UgaXMgc2V0IG9uIGVudGl0eS1tYXBwaW5ncwotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxELCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCQotCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCX0KLQkvL1RPRE8gdGVzdCBkZWZhdWx0IGFjY2VzcyBmcm9tCi0JCS8vdW5kZXJseWluZyBqYXZhCi0JCS8vcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cwotCQkvL2VudGl0eS1tYXBwaW5ncwotCQkvL3dpdGggeG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUgc2V0Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtTWFwcGVkU3VwZXJjbGFzcyBvcm1NYXBwZWRTdXBlcmNsYXNzID0gKE9ybU1hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkKLQkJLy9zZXQgYWNjZXNzIHRvIGZhbHNlIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2Uuc2V0TWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwkJYXNzZXJ0TnVsbChvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1NYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJb3JtTWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybU1hcHBlZFN1cGVyY2xhc3Mgb3JtTWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtTWFwcGVkU3VwZXJjbGFzcy5pc092ZXJyaWRlTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShvcm1NYXBwZWRTdXBlcmNsYXNzLmlzT3ZlcnJpZGVNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRGYWxzZShvcm1NYXBwZWRTdXBlcmNsYXNzLmlzT3ZlcnJpZGVNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWV0YWRhdGFDb21wbGV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybU1hcHBlZFN1cGVyY2xhc3MuaXNNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRUcnVlKG9ybU1hcHBlZFN1cGVyY2xhc3MuaXNNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG9ybU1hcHBlZFN1cGVyY2xhc3MuaXNNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZU1hcHBlZFN1cGVyY2xhc3NFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQltYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQltYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkKLQkJbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZW50aXR5LmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5LmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIGVudGl0eS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5LmdldERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybUVudGl0eS5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQl9Ci0JCQotCS8vdGVzdCB3aXRoIDIgTWFwcGVkU3VwZXJjbGFzc2VzLCBtYWtlIHRoZSBmaXJzdCBvbmUgYW4gRW50aXR5IHNvIGl0IGhhcyB0byBtb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZU1hcHBlZFN1cGVyY2xhc3NFbnRpdHkyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCU9ybU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQltYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQltYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkKLQkJbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZW50aXR5LmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5LmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIGVudGl0eS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5LmdldERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybUVudGl0eS5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gcGVyc2lzdGVudFR5cGVzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudFR5cGVzLm5leHQoKS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRUeXBlcy5uZXh0KCkuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ha2VNYXBwZWRTdXBlcmNsYXNzRW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE9ybU1hcHBlZFN1cGVyY2xhc3MpIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCW1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCW1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQotCQltYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbWJlZGRhYmxlLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW1iZWRkYWJsZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBlbWJlZGRhYmxlLmdldEFjY2VzcygpKTsKLQkJCi0JCU9ybUVtYmVkZGFibGUgb3JtRW1iZWRkYWJsZSA9IChPcm1FbWJlZGRhYmxlKSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybUVtYmVkZGFibGUuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQkvL3Rlc3Qgd2l0aCAyIE1hcHBlZFN1cGVyY2xhc3NlcywgbWFrZSB0aGUgZmlyc3Qgb25lIGFuIEVtYmVkZGFibGUgc28gaXQgaGFzIHRvIG1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdAotCXB1YmxpYyB2b2lkIHRlc3RNYWtlTWFwcGVkU3VwZXJjbGFzc0VtYmVkZGFibGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCU9ybU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQltYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQltYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkKLQkJbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCVhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZW1iZWRkYWJsZS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVtYmVkZGFibGUuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW1iZWRkYWJsZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlPcm1FbWJlZGRhYmxlIG9ybUVtYmVkZGFibGUgPSAoT3JtRW1iZWRkYWJsZSkgbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1FbWJlZGRhYmxlLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gcGVyc2lzdGVudFR5cGVzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudFR5cGVzLm5leHQoKS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50VHlwZXMubmV4dCgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RJZENsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCQotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlJZENsYXNzUmVmZXJlbmNlIGlkQ2xhc3NSZWYgPSBvcm1NYXBwZWRTdXBlcmNsYXNzLmdldElkQ2xhc3NSZWZlcmVuY2UoKTsKLQkJCi0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JCQotCQltYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2Uuc2V0SWRDbGFzcyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDbGFzc1JlZmVyZW5jZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0SWRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCVN0cmluZyBub25FeGlzdGVudElkQ2xhc3NOYW1lID0gUEFDS0FHRV9OQU1FICsgIi5Gb28iOwotCQltYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0SWRDbGFzcygpLnNldENsYXNzTmFtZShub25FeGlzdGVudElkQ2xhc3NOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKG5vbkV4aXN0ZW50SWRDbGFzc05hbWUsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRJZENsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobm9uRXhpc3RlbnRJZENsYXNzTmFtZSwgaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JCQotCQlTdHJpbmcgZXhpc3RlbnRJZENsYXNzTmFtZSA9IFBBQ0tBR0VfTkFNRSArICIuVGVzdFR5cGVJZCI7Ci0JCW1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRJZENsYXNzKCkuc2V0Q2xhc3NOYW1lKGV4aXN0ZW50SWRDbGFzc05hbWUpOwotCQlhc3NlcnRFcXVhbHMoZXhpc3RlbnRJZENsYXNzTmFtZSwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldElkQ2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhleGlzdGVudElkQ2xhc3NOYW1lLCBpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCS8vdGVzdCBzZXR0aW5nICBASWRDbGFzcyB2YWx1ZSB0byBudWxsLCBpZC1jbGFzcyB0YWcgaXMgbm90IHJlbW92ZWQKLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldElkQ2xhc3MoKS5zZXRDbGFzc05hbWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JCQotCQkvL3Jlc2V0IEBJZENsYXNzIHZhbHVlIGFuZCB0aGVuIHJlbW92ZSBpZC1jbGFzcyB0YWcKLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldElkQ2xhc3MoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2xhc3NSZWZlcmVuY2UoKSk7Ci0JCW1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRJZENsYXNzKCkuc2V0Q2xhc3NOYW1lKCJtb2RlbC5Gb28iKTsKLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldElkQ2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RJZENsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCQotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlJZENsYXNzUmVmZXJlbmNlIGlkQ2xhc3NSZWYgPSBvcm1NYXBwZWRTdXBlcmNsYXNzLmdldElkQ2xhc3NSZWZlcmVuY2UoKTsKLQkJCi0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JCQotCQlTdHJpbmcgbm9uRXhpc3RlbnRJZENsYXNzTmFtZSA9IFBBQ0tBR0VfTkFNRSArICIuRm9vIjsKLQkJaWRDbGFzc1JlZi5zZXRTcGVjaWZpZWRJZENsYXNzTmFtZShub25FeGlzdGVudElkQ2xhc3NOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKG5vbkV4aXN0ZW50SWRDbGFzc05hbWUsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRJZENsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobm9uRXhpc3RlbnRJZENsYXNzTmFtZSwgaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JCQotCQlTdHJpbmcgZXhpc3RlbnRJZENsYXNzTmFtZSA9IFBBQ0tBR0VfTkFNRSArICIuVGVzdFR5cGVJZCI7Ci0JCWlkQ2xhc3NSZWYuc2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoZXhpc3RlbnRJZENsYXNzTmFtZSk7Ci0JCWFzc2VydEVxdWFscyhleGlzdGVudElkQ2xhc3NOYW1lLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0SWRDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4aXN0ZW50SWRDbGFzc05hbWUsIGlkQ2xhc3NSZWYuZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwoaWRDbGFzc1JlZi5nZXRJZENsYXNzKCkpOwotCQkKLQkJaWRDbGFzc1JlZi5zZXRTcGVjaWZpZWRJZENsYXNzTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0SWRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU5hbWVkTmF0aXZlUXVlcnlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU5hbWVkTmF0aXZlUXVlcnlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWJjYmUwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1OYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JtTmFtZWROYXRpdmVRdWVyeVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtTmFtZWROYXRpdmVRdWVyeVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJCi0JCVhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQluYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG9ybU5hbWVkTmF0aXZlUXVlcnkgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQkKLQkJWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTmFtZWROYXRpdmVRdWVyeS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1OYW1lZE5hdGl2ZVF1ZXJ5LnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU5hbWVkTmF0aXZlUXVlcnkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJCi0JCVhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCWFzc2VydE51bGwobmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFF1ZXJ5KCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQluYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2Uuc2V0UXVlcnkoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFF1ZXJ5KCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5zZXRRdWVyeShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnROdWxsKG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRRdWVyeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG9ybU5hbWVkTmF0aXZlUXVlcnkgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQkKLQkJWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0UXVlcnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU5hbWVkTmF0aXZlUXVlcnkuc2V0UXVlcnkoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFF1ZXJ5KCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTmFtZWROYXRpdmVRdWVyeS5zZXRRdWVyeShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnROdWxsKG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRRdWVyeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOwotCi0JCU9ybVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCXF1ZXJ5SGludC5zZXROYW1lKCJGT08iKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybVF1ZXJ5SGludCBxdWVyeUhpbnQyID0gb3JtTmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDApOwotCQlxdWVyeUhpbnQyLnNldE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybVF1ZXJ5SGludCBxdWVyeUhpbnQzID0gb3JtTmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDEpOwotCQlxdWVyeUhpbnQzLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1RdWVyeUhpbnQ+IHF1ZXJ5SGludHMgPSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldEhpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKHF1ZXJ5SGludDIsIHF1ZXJ5SGludHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHF1ZXJ5SGludDMsIHF1ZXJ5SGludHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHF1ZXJ5SGludCwgcXVlcnlIaW50cy5uZXh0KCkpOwotCQkKLQkJcXVlcnlIaW50cyA9IG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHF1ZXJ5SGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcXVlcnlIaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBxdWVyeUhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJCi0JCVhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7Ci0KLQkJb3JtTmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkZPTyIpOwotCQlvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCW9ybU5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5zaXplKCkpOwotCQkKLQkJb3JtTmFtZWROYXRpdmVRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMiwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlvcm1OYW1lZE5hdGl2ZVF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygxLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJb3JtTmFtZWROYXRpdmVRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMCwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG9ybU5hbWVkTmF0aXZlUXVlcnkgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQkKLQkJWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKTsKLQotCQlvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW9ybU5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJb3JtTmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3JtTmFtZWROYXRpdmVRdWVyeS5tb3ZlSGludCgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVF1ZXJ5SGludD4gaGludHMgPSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldEhpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3JtTmFtZWROYXRpdmVRdWVyeS5tb3ZlSGludCgwLCAxKTsKLQkJaGludHMgPSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldEhpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSGludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOwotCi0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxRdWVyeUhpbnQoKSk7Ci0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxRdWVyeUhpbnQoKSk7Ci0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxRdWVyeUhpbnQoKSk7Ci0JCQotCQluYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1RdWVyeUhpbnQ+IGhpbnRzID0gb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGhpbnRzLmhhc05leHQoKSk7Ci0JCQotCQluYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5tb3ZlKDIsIDApOwotCQloaW50cyA9IG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCi0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLm1vdmUoMCwgMSk7Ci0JCWhpbnRzID0gb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGhpbnRzLmhhc05leHQoKSk7Ci0KLQkJbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldEhpbnRzKCkucmVtb3ZlKDEpOwotCQloaW50cyA9IG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCi0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLnJlbW92ZSgxKTsKLQkJaGludHMgPSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldEhpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaGludHMuaGFzTmV4dCgpKTsKLQkJCi0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtTmFtZWROYXRpdmVRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVJlc3VsdFNldE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5zZXRSZXN1bHRTZXRNYXBwaW5nKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5zZXRSZXN1bHRTZXRNYXBwaW5nKG51bGwpOwotCQlhc3NlcnROdWxsKG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQlhc3NlcnROdWxsKG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVJlc3VsdFNldE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU5hbWVkTmF0aXZlUXVlcnkuc2V0UmVzdWx0U2V0TWFwcGluZygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU5hbWVkTmF0aXZlUXVlcnkuc2V0UmVzdWx0U2V0TWFwcGluZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZXN1bHRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJCi0JCVhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFJlc3VsdENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQluYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2Uuc2V0UmVzdWx0Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQluYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2Uuc2V0UmVzdWx0Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwobmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFJlc3VsdENsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlSZXN1bHRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJCi0JCVhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFJlc3VsdENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1OYW1lZE5hdGl2ZVF1ZXJ5LnNldFJlc3VsdENsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1OYW1lZE5hdGl2ZVF1ZXJ5LnNldFJlc3VsdENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTmFtZWRRdWVyeVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTmFtZWRRdWVyeVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYzMxMjYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU5hbWVkUXVlcnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1OYW1lZFF1ZXJ5VGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1OYW1lZFF1ZXJ5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZFF1ZXJ5IG9ybU5hbWVkUXVlcnkgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwotCQkKLQkJWG1sTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkUXVlcmllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnlSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQluYW1lZFF1ZXJ5UmVzb3VyY2Uuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1OYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW5hbWVkUXVlcnlSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkUXVlcnkgb3JtTmFtZWRRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZFF1ZXJ5IG5hbWVkUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU5hbWVkUXVlcnkuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1OYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTmFtZWRRdWVyeS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZFF1ZXJ5IG9ybU5hbWVkUXVlcnkgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwotCQkKLQkJWG1sTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkUXVlcmllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0UXVlcnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW5hbWVkUXVlcnlSZXNvdXJjZS5zZXRRdWVyeSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1OYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0UXVlcnkoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbmFtZWRRdWVyeVJlc291cmNlLnNldFF1ZXJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeVJlc291cmNlLmdldFF1ZXJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkUXVlcnkgb3JtTmFtZWRRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZFF1ZXJ5IG5hbWVkUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRRdWVyeSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTmFtZWRRdWVyeS5zZXRRdWVyeSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1OYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0UXVlcnkoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1OYW1lZFF1ZXJ5LnNldFF1ZXJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeVJlc291cmNlLmdldFF1ZXJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWRRdWVyeSBvcm1OYW1lZFF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKTsKLQkJCi0JCVhtbE5hbWVkUXVlcnkgbmFtZWRRdWVyeVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCk7Ci0KLQkJT3JtUXVlcnlIaW50IHF1ZXJ5SGludCA9IG9ybU5hbWVkUXVlcnkuYWRkSGludCgwKTsKLQkJcXVlcnlIaW50LnNldE5hbWUoIkZPTyIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtUXVlcnlIaW50IHF1ZXJ5SGludDIgPSBvcm1OYW1lZFF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCXF1ZXJ5SGludDIuc2V0TmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtUXVlcnlIaW50IHF1ZXJ5SGludDMgPSBvcm1OYW1lZFF1ZXJ5LmFkZEhpbnQoMSk7Ci0JCXF1ZXJ5SGludDMuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVF1ZXJ5SGludD4gcXVlcnlIaW50cyA9IG9ybU5hbWVkUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMocXVlcnlIaW50MiwgcXVlcnlIaW50cy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocXVlcnlIaW50MywgcXVlcnlIaW50cy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocXVlcnlIaW50LCBxdWVyeUhpbnRzLm5leHQoKSk7Ci0JCQotCQlxdWVyeUhpbnRzID0gb3JtTmFtZWRRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcXVlcnlIaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBxdWVyeUhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHF1ZXJ5SGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZFF1ZXJ5IG9ybU5hbWVkUXVlcnkgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwotCQkKLQkJWG1sTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkUXVlcmllcygpLmdldCgwKTsKLQotCQlvcm1OYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW9ybU5hbWVkUXVlcnkuYWRkSGludCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJb3JtTmFtZWRRdWVyeS5hZGRIaW50KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLnNpemUoKSk7Ci0JCQotCQlvcm1OYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCW9ybU5hbWVkUXVlcnkucmVtb3ZlSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlvcm1OYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkUXVlcnkgb3JtTmFtZWRRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZFF1ZXJ5IG5hbWVkUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApOwotCi0JCW9ybU5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJGT08iKTsKLQkJb3JtTmFtZWRRdWVyeS5hZGRIaW50KDEpLnNldE5hbWUoIkJBUiIpOwotCQlvcm1OYW1lZFF1ZXJ5LmFkZEhpbnQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1OYW1lZFF1ZXJ5Lm1vdmVIaW50KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtUXVlcnlIaW50PiBoaW50cyA9IG9ybU5hbWVkUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlvcm1OYW1lZFF1ZXJ5Lm1vdmVIaW50KDAsIDEpOwotCQloaW50cyA9IG9ybU5hbWVkUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVIaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWRRdWVyeSBvcm1OYW1lZFF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKTsKLQkJCi0JCVhtbE5hbWVkUXVlcnkgbmFtZWRRdWVyeVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCk7Ci0KLQkJbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFF1ZXJ5SGludCgpKTsKLQkJbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFF1ZXJ5SGludCgpKTsKLQkJbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFF1ZXJ5SGludCgpKTsKLQkJCi0JCW5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQluYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybVF1ZXJ5SGludD4gaGludHMgPSBvcm1OYW1lZFF1ZXJ5LmdldEhpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaGludHMuaGFzTmV4dCgpKTsKLQkJCi0JCW5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLm1vdmUoMiwgMCk7Ci0JCWhpbnRzID0gb3JtTmFtZWRRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGhpbnRzLmhhc05leHQoKSk7Ci0KLQkJbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkubW92ZSgwLCAxKTsKLQkJaGludHMgPSBvcm1OYW1lZFF1ZXJ5LmdldEhpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaGludHMuaGFzTmV4dCgpKTsKLQotCQluYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5yZW1vdmUoMSk7Ci0JCWhpbnRzID0gb3JtTmFtZWRRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGhpbnRzLmhhc05leHQoKSk7Ci0KLQkJbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkucmVtb3ZlKDEpOwotCQloaW50cyA9IG9ybU5hbWVkUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1OYW1lZFF1ZXJ5LmdldEhpbnRzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MTAwMGEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlmb3IgKE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDpvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCWVhY2guYWRkVG9YbWwoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8U3RyaW5nLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgYWJicjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9CQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5GRVRDSF9UWVBFLCBKUEEuQ0FTQ0FERV9UWVBFLCBKUEEuT1JERVJfQlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkoZmV0Y2g9RmV0Y2hUeXBlLkVBR0VSLCB0YXJnZXRFbnRpdHk9QWRkcmVzcy5jbGFzcywgY2FzY2FkZT17Q2FzY2FkZVR5cGUuQUxMLCBDYXNjYWRlVHlwZS5QRVJTSVNULCBDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFLCBDYXNjYWRlVHlwZS5SRUZSRVNIfSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPcmRlckJ5KFwiY2l0eVwiIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQkKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvbmVUb01hbnkuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55LnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvbmVUb01hbnkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb01hbnkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9uZVRvTWFueS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvbmVUb01hbnkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueS5zZXRUYXJnZXRFbnRpdHkoIm5ld1RhcmdldEVudGl0eSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9NYW55LnNldFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkJCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgibmV3VGFyZ2V0RW50aXR5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb25lVG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueVJlc291cmNlLmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIsIG9uZVRvTWFueVJlc291cmNlLmdldEZldGNoKCkpOwotCQotCQlvbmVUb01hbnlSZXNvdXJjZS5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5MQVpZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0KLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0RmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5FQUdFUiwgb25lVG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQotCQkvL3NldCBmZXRjaCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kgc3RyYXRlZ3kgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKHN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueS5zZXRNYXBwZWRCeSgibmV3TWFwcGVkQnkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdNYXBwZWRCeSIsIHN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5Iiwgb25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQotCQkvL3NldG1hcHBlZEJ5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvTWFueS5zZXRNYXBwZWRCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChzdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1NYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5ID0gb3JtT25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChzdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcHBlZEJ5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlzdHJhdGVneS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibmV3TWFwcGVkQnkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdNYXBwZWRCeSIsIHN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5Iiwgb25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQotCQkvL3NldCBtYXBwZWRCeSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXN0cmF0ZWd5LnNldE1hcHBlZEJ5QXR0cmlidXRlKG51bGwpOwotCQlhc3NlcnROdWxsKHN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcCByZWwgPSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBjb250ZXh0TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtT25lVG9NYW55UmVsYXRpb25zaGlwIHJlbCA9IGNvbnRleHRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBwZWRCeSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHBlZEJ5KG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRKb2luVGFibGUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCW9uZVRvTWFueS5zZXRNYXBLZXkoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROb3ROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Iiwgb25lVG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9uZVRvTWFueS5nZXRNYXBLZXkoKS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlvbmVUb01hbnkuc2V0TWFwS2V5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWaXJ0dWFsTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQotCQlPbmVUb01hbnlNYXBwaW5nIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmlzUGtNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JCQotCQkvL3NldCBwayBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuc2V0UGtNYXBLZXkodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JCQotCQkKLQkJLy9zZXQgY3VzdG9tIHNwZWNpZmllZCBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuc2V0Q3VzdG9tTWFwS2V5KHRydWUpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoImNpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmlzUGtNYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibXlNYXBLZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Iiwgb25lVG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0Tm9NYXBLZXkodHJ1ZSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlT3JkZXJCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRPcmRlckJ5KCkpOwotCQkJCQotCQkvL3NldCBvcmRlckJ5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnkuc2V0T3JkZXJCeSgibmV3T3JkZXJCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9uZVRvTWFueS5nZXRPcmRlckJ5KCkpOwotCQotCQkvL3NldCBvcmRlckJ5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvTWFueS5zZXRPcmRlckJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0T3JkZXJCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU9yZGVyQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0T3JkZXJCeSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgibmV3T3JkZXJCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9uZVRvTWFueS5nZXRPcmRlckJ5KCkpOwotCQotCQkvL3NldCBtYXBwZWRCeSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE9yZGVyQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc05vT3JkZXJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0KLQkJb3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJmb28iKTsKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JCQotCQlvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkobnVsbCk7Ci0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROb09yZGVyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRUcnVlKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNOb09yZGVyaW5nKCkpOwotCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNOb09yZGVyaW5nKCkpOwotCQkKLQkJb3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXROb09yZGVyaW5nKHRydWUpOwotCQlhc3NlcnRUcnVlKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQl9Ci0vL1RPRE8KLS8vCXB1YmxpYyBib29sZWFuIGlzT3JkZXJCeVBrKCkgewotLy8JCXJldHVybiAiIi5lcXVhbHMoZ2V0T3JkZXJCeSgpKTsKLS8vCX0KLS8vCi0vLwlwdWJsaWMgdm9pZCBzZXRPcmRlckJ5UGsoKSB7Ci0vLwkJc2V0T3JkZXJCeSgiIik7Ci0vLwl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDdXN0b21PcmRlcmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiZm9vIik7Ci0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCQkKLQkJb3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KG51bGwpOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzQ3VzdG9tT3JkZXJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPbmVUb01hbnlNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm1hcEtleSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibWFwcGVkQnkiKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBJZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvTWFueU1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJtYXBLZXkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7Ci0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImludmVyc2VOYW1lIik7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJpbnZlcnNlUmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvTWFueU1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm1hcEtleSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibWFwcGVkQnkiKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9NYW55TW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJtYXBLZXkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7Ci0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImludmVyc2VOYW1lIik7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJpbnZlcnNlUmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9NYW55TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm1hcEtleSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibWFwcGVkQnkiKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9NYW55TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJtYXBLZXkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIm1hcHBlZEJ5Iik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldEFsbCh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlZnJlc2godHJ1ZSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlbW92ZSh0cnVlKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIlRhcmdldEVudGl0eSIsICgoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hcHBlZEJ5IiwgKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydFRydWUoKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRUcnVlKCgoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUmVtb3ZlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9NYW55TW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm1hcEtleSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRQZXJzaXN0KHRydWUpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJpbnZlcnNlTmFtZSIpOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiaW52ZXJzZVJlZmVyZW5jZU5hbWUiKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIlRhcmdldEVudGl0eSIsICgoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc0FsbCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlbW92ZSgpKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9ICgoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fVEFCTEUiLCBqb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgam9pblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJyZWZlcmVuY2VOYW1lIiwgam9pblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW52ZXJzZU5hbWUiLCBqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZlcnNlUmVmZXJlbmNlTmFtZSIsIGpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvTWFueU1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm1hcEtleSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibWFwcGVkQnkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygiVGFyZ2V0RW50aXR5IiwgKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRUcnVlKCgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc0FsbCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKCgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUmVtb3ZlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9NYW55TW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJtYXBLZXkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIm1hcHBlZEJ5Iik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldEFsbCh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlZnJlc2godHJ1ZSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlbW92ZSh0cnVlKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwotLy9UT0RPCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoSUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIiksIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0KLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0KLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBvbmVUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnROdWxsKHN0YXRlRm9vTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJT25lVG9NYW55TWFwcGluZyB2aXJ0dWFsT25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsQXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQlPbmVUb01hbnlNYXBwaW5nIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZyBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlPcm1PbmVUb01hbnlNYXBwaW5nIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgdmlydHVhbEF0dHJpYnV0ZS5hZGRUb1htbCgpLmdldE1hcHBpbmcoKTsKLQkJbWFwS2V5TmFtZXMgPSBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJTdHJpbmciKTsKLQkJbWFwS2V5TmFtZXMgPSBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJT25lVG9NYW55TWFwcGluZyB2aXJ0dWFsT25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLgotCQkJZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCi0JCUNhc2NhZGUgY2FzY2FkZSA9IHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCi0JCWFzc2VydFRydWUodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNDdXN0b21PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZLCB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmFkZFRvWG1sKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0KLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0KLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCi0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YjVmMzMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1PbmVUb09uZU1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybU9uZVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5GRVRDSF9UWVBFLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUoZmV0Y2g9RmV0Y2hUeXBlLkxBWlksIG9wdGlvbmFsPWZhbHNlLCB0YXJnZXRFbnRpdHk9QWRkcmVzcy5jbGFzcywgY2FzY2FkZT17Q2FzY2FkZVR5cGUuQUxMLCBDYXNjYWRlVHlwZS5QRVJTSVNULCBDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFLCBDYXNjYWRlVHlwZS5SRUZSRVNIfSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luQ29sdW1uKG5hbWU9XCJNWV9DT0xVTU5cIiwgcmVmZXJlbmNlZENvbHVtbk5hbWU9XCJNWV9SRUZFUkVOQ0VEX0NPTFVNTlwiLCB1bmlxdWU9dHJ1ZSwgbnVsbGFibGU9ZmFsc2UsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSwgY29sdW1uRGVmaW5pdGlvbj1cIkNPTFVNTl9ERUZJTklUSU9OXCIsIHRhYmxlPVwiTVlfVEFCTEVcIikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5hZGRUb1htbCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb25lVG9PbmUuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmUuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb25lVG9PbmUuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb09uZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmUgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvbmVUb09uZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb09uZU1hcHBpbmcuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb25lVG9PbmUuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvT25lTWFwcGluZy5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvT25lLnNldFRhcmdldEVudGl0eSgibmV3VGFyZ2V0RW50aXR5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9PbmUuc2V0VGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmUgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkJCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZVJlc291cmNlLmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmVSZXNvdXJjZS5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb09uZVJlc291cmNlLmdldEZldGNoKCkpOwotCQotCQlvbmVUb09uZVJlc291cmNlLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlksIG9uZVRvT25lUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0KLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9PbmVSZXNvdXJjZS5zZXRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmVSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb09uZVJlc291cmNlLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCi0JCW9ybU9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5MQVpZLCBvbmVUb09uZVJlc291cmNlLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQotCQkvL3NldCBmZXRjaCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZVJlc291cmNlLmdldEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5ID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmUgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKHN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCQkJCQotCQkvL3NldCBtYXBwZWRCeSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmUuc2V0TWFwcGVkQnkoIm5ld01hcHBlZEJ5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBzdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdNYXBwZWRCeSIsIG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCQotCQkvL3NldCBtYXBwZWRCeSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb09uZS5zZXRNYXBwZWRCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChzdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneSBzdHJhdGVneSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChzdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCXN0cmF0ZWd5LnNldE1hcHBlZEJ5QXR0cmlidXRlKCJuZXdNYXBwZWRCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5Iiwgc3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQkKLQkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlzdHJhdGVneS5zZXRNYXBwZWRCeUF0dHJpYnV0ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChzdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9uZVRvT25lUmVsYXRpb25zaGlwIHJlbCA9IGNvbnRleHRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9uZVRvT25lUmVsYXRpb25zaGlwIHJlbCA9IGNvbnRleHRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBwZWRCeSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IG9wdGlvbmFsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb09uZVJlc291cmNlLnNldE9wdGlvbmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmVSZXNvdXJjZS5nZXRPcHRpb25hbCgpKTsKLQkKLQkJb25lVG9PbmVSZXNvdXJjZS5zZXRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9uZVRvT25lUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0KLQkJLy9zZXQgb3B0aW9uYWwgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9PbmVSZXNvdXJjZS5zZXRPcHRpb25hbChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmVSZXNvdXJjZS5nZXRPcHRpb25hbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IG9wdGlvbmFsIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmVSZXNvdXJjZS5nZXRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQotCQlvcm1PbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvbmVUb09uZVJlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCi0JCS8vc2V0IG9wdGlvbmFsIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtT25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBzdHJhdGVneSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHN0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMiA9IHN0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IHN0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW4zLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5ID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCi0JCXN0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXN0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCXN0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQlzdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlzdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJc3RyYXRlZ3kucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9uZVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgc3RyYXRlZ3kgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0KLQkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlzdHJhdGVneS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gc3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlzdHJhdGVneS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvT25lTWFwcGluZ05vVW5kZXJ5bGluZ0phdmFBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb3JtT25lVG9PbmVNYXBwaW5nLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCi0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1PbmVUb09uZU1hcHBpbmcuaXNPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCi0JCQotCQlhc3NlcnRUcnVlKG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5nZXRKb2luQ29sdW1uc1NpemUoKSA+IDApOwotCQkvL1RPRE8gZGVmYXVsdCBqb2luQ29sdW1ucwotCQkvL2Fzc2VydFRydWUob3JtT25lVG9PbmVNYXBwaW5nLmRlZmF1bHRKb2luQ29sdW1ucygpLmhhc05leHQoKSk7Ci0JCi0JCi0JCUNhc2NhZGUgY2FzY2FkZSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgb25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuCi0JCQlnZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0KLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfUkVGRVJFTkNFRF9DT0xVTU4iLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIGpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0KLQkJQ2FzY2FkZSBjYXNjYWRlID0gb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5T25lVG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbChNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtT25lVG9PbmVNYXBwaW5nLmlzT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCi0JCS8vVE9ETyBkZWZhdWx0IGpvaW4gY29sdW1ucyBpbiB4bWwgb25lLXRvLW9uZQotLy8JCVhtbEpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybU9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKLS8vCQkvL1RPRE8gamF2YSBkZWZhdWx0IGNvbHVtbnMgbmFtZSBpbiBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5Kb2luQ29sdW1uT3duZXIKLS8vCQkvL2Fzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCQkvL2Fzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0KLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1PbmVUb09uZU1hcHBpbmcuaXNPcHRpb25hbCgpKTsKLQkJLy9UT0RPIGRlZmF1bHQgdGFyZ2V0IGVudGl0eSBpbiB4bWwKLQkJLy9hc3NlcnRFcXVhbHMoInRlc3QuQWRkcmVzcyIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuZ2V0Sm9pbkNvbHVtbnNTaXplKCkgPiAwKTsKLQkJCi0JCS8vVE9ETyBkZWZhdWx0IGpvaW4gY29sdW1ucyBmb3Igc3BlY2lmaWVkIHhtbE9uZVRvT25lIG1hcHBpbmcKLS8vCQlYbWxKb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1PbmVUb09uZU1hcHBpbmcuZGVmYXVsdEpvaW5Db2x1bW5zKCkubmV4dCgpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLS8vCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLS8vCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRVbmlxdWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0TnVsbGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRVcGRhdGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvT25lTW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIm1hcHBlZEJ5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPbmVUb09uZU1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIm1hcHBlZEJ5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBWZXJzaW9uTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9PbmVNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJtYXBwZWRCeSIpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldEFsbCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRQZXJzaXN0KHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlZnJlc2godHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPbmVUb09uZU1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibWFwcGVkQnkiKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlbW92ZSh0cnVlKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvT25lTW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibWFwcGVkQnkiKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlbW92ZSh0cnVlKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9PbmVNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJtYXBwZWRCeSIpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldEFsbCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRQZXJzaXN0KHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlZnJlc2godHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygiVGFyZ2V0RW50aXR5IiwgKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYXBwZWRCeSIsICgoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc0FsbCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlbW92ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvT25lTW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJtYXBwZWRCeSIpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldEFsbCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRQZXJzaXN0KHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlZnJlc2godHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygiVGFyZ2V0RW50aXR5IiwgKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hcHBlZEJ5IiwgKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnRUcnVlKCgoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc0FsbCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKCgoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydFRydWUoKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUmVtb3ZlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9PbmVNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIm1hcHBlZEJ5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUYXJnZXRFbnRpdHkiLCAoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzQWxsKCkpOwotCQlhc3NlcnRUcnVlKCgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKCgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNSZW1vdmUoKSk7Ci0JCQotCQlqb2luQ29sdW1uID0gKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygicmVmZXJlbmNlTmFtZSIsIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvT25lTW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIm1hcHBlZEJ5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0vL1RPRE8JYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChJQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQotCQotCQotCQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgc3RyYXRlZ3kgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uMiA9IHN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbjMgPSBzdHJhdGVneS5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtbjMuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMiwgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4zLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbiwgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCi0JCWpvaW5Db2x1bW5zID0gc3RyYXRlZ3kuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBzdHJhdGVneSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0KLQkJc3RyYXRlZ3kuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlzdHJhdGVneS5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQlzdHJhdGVneS5yZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQkJc3RyYXRlZ3kucmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXN0cmF0ZWd5LnJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgb25lVG9PbmVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBzdHJhdGVneSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0KLQkJc3RyYXRlZ3kuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlzdHJhdGVneS5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQkKLQkJc3RyYXRlZ3kubW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gc3RyYXRlZ3kuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJc3RyYXRlZ3kubW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIiksIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKLQkJYXNzZXJ0TnVsbChzdGF0ZUZvb01hcHBpbmcpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5MTI1ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5nZXROYW1lKCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIG9ybVByaW1hcnlLZXlKb2luQ29sdW1uID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwocHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2Uuc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybVByaW1hcnlLZXlKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybVByaW1hcnlLZXlKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLS8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZUZyb21KYXZhVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0vLwkJCi0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJWG1sRW50aXR5IG9ybUVudGl0eSA9IChYbWxFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQkKLS8vCQlvcm1FbnRpdHkuamF2YUVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRm9vIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQkKLS8vCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8KLS8vCQlvcm1FbnRpdHkuZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotLy8JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JCi0vLwkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJCi0vLwkJb3JtRW50aXR5LmVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQkKLS8vCQlvcm1FbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCYXIiKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHROYW1lTm9KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCQotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlYbWxFbnRpdHkgb3JtRW50aXR5ID0gKFhtbEVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZUZyb21QYXJlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0vLwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLS8vCQkKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnRPcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBjaGlsZE9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLS8vCQlYbWxFbnRpdHkgcGFyZW50WG1sRW50aXR5ID0gKFhtbEVudGl0eSkgcGFyZW50T3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCVhtbEVudGl0eSBjaGlsZFhtbEVudGl0eSA9IChYbWxFbnRpdHkpIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGNoaWxkWG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJCi0vLwkJcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8KLS8vCQlwYXJlbnRYbWxFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCX0KLQkKLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwocHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5zZXRDb2x1bW5EZWZpbml0aW9uKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLnNldENvbHVtbkRlZmluaXRpb24oIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQ29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1RdWVyeUhpbnRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVF1ZXJ5SGludFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOTZkMTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVF1ZXJ5SGludFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JtUXVlcnlIaW50VGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1RdWVyeUhpbnRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVF1ZXJ5SGludCBvcm1RdWVyeUhpbnQgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApLmFkZEhpbnQoMCk7Ci0JCQotCQlYbWxRdWVyeUhpbnQgcXVlcnlIaW50UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXRIaW50cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtUXVlcnlIaW50LmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocXVlcnlIaW50UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcXVlcnlIaW50UmVzb3VyY2Uuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1RdWVyeUhpbnQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgcXVlcnlIaW50UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlxdWVyeUhpbnRSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVF1ZXJ5SGludC5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHF1ZXJ5SGludFJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1RdWVyeUhpbnQgb3JtUXVlcnlIaW50ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKS5hZGRIaW50KDApOwotCQkKLQkJWG1sUXVlcnlIaW50IHF1ZXJ5SGludFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0SGludHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybVF1ZXJ5SGludC5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHF1ZXJ5SGludFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybVF1ZXJ5SGludC5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybVF1ZXJ5SGludC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBxdWVyeUhpbnRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtUXVlcnlIaW50LnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtUXVlcnlIaW50LmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocXVlcnlIaW50UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1RdWVyeUhpbnQgb3JtUXVlcnlIaW50ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKS5hZGRIaW50KDApOwotCQkKLQkJWG1sUXVlcnlIaW50IHF1ZXJ5SGludFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0SGludHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybVF1ZXJ5SGludC5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChxdWVyeUhpbnRSZXNvdXJjZS5nZXRWYWx1ZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcXVlcnlIaW50UmVzb3VyY2Uuc2V0VmFsdWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtUXVlcnlIaW50LmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBxdWVyeUhpbnRSZXNvdXJjZS5nZXRWYWx1ZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlxdWVyeUhpbnRSZXNvdXJjZS5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1RdWVyeUhpbnQuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocXVlcnlIaW50UmVzb3VyY2UuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtUXVlcnlIaW50IG9ybVF1ZXJ5SGludCA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCkuYWRkSGludCgwKTsKLQkJCi0JCVhtbFF1ZXJ5SGludCBxdWVyeUhpbnRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldEhpbnRzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1RdWVyeUhpbnQuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocXVlcnlIaW50UmVzb3VyY2UuZ2V0VmFsdWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybVF1ZXJ5SGludC5zZXRWYWx1ZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1RdWVyeUhpbnQuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIHF1ZXJ5SGludFJlc291cmNlLmdldFZhbHVlKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtUXVlcnlIaW50LnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVF1ZXJ5SGludC5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChxdWVyeUhpbnRSZXNvdXJjZS5nZXRWYWx1ZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVNlY29uZGFyeVRhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1TZWNvbmRhcnlUYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YzI5YjIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVNlY29uZGFyeVRhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbFNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9ybVNlY29uZGFyeVRhYmxlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1TZWNvbmRhcnlUYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU2Vjb25kYXJ5VGFibGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJT3JtU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJT3JtU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5yZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnNpemUoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tSmF2YVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0SmF2YVR5cGVNYXBwaW5nKCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0KLQkJUmVhZE9ubHlTZWNvbmRhcnlUYWJsZSBvcm1TZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5nZXRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtU2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvcm1TZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQkKLQkJb3JtRW50aXR5LnNldFNlY29uZGFyeVRhYmxlc0FyZURlZmluZWRJblhtbCh0cnVlKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkJCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZWNvbmRhcnlUYWJsZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLnNldFNjaGVtYSgiRk9PIik7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0U2NoZW1hKCkpOwotCQotCQkvL3NldCBzY2hlbWEgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldFNjaGVtYSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCU9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldFNjaGVtYSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldFNjaGVtYSgpKTsKLQkJCi0JCW9ybUVudGl0eS5yZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnNpemUoKSk7CQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hRnJvbUphdmFUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIGphdmFTZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJamF2YVNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhU2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJCQVIiKTsKLQkJCi0JCU9ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZSBvcm1TZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5nZXRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtU2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQkKLQkJamF2YVNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgiQkFaIik7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtU2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCi0JCQotCQlvcm1FbnRpdHkuc2V0U2Vjb25kYXJ5VGFibGVzQXJlRGVmaW5lZEluWG1sKHRydWUpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9ybUVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWFGcm9tUGFyZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCU9ybUVudGl0eSBwYXJlbnRPcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwYXJlbnRPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVudGl0eSBjaGlsZE9ybUVudGl0eSA9IChPcm1FbnRpdHkpIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChwYXJlbnRPcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGNoaWxkT3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCXBhcmVudE9ybUVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydE51bGwocGFyZW50T3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjaGlsZE9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0KLQkJcGFyZW50T3JtRW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWFzc2VydE51bGwocGFyZW50T3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChjaGlsZE9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hRnJvbVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlvcm1TZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0TnVsbChvcm1TZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1TZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBqYXZhU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuZ2V0SmF2YVR5cGVNYXBwaW5nKCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCWphdmFTZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YVNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgiSkFWQV9TQ0hFTUEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1TZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0U2NoZW1hKCkpOyAvL3NjaGVtYSBpcyBub3QgZGVmYXVsdGVkIGZyb20gdW5kZXJseWluZyBqYXZhCi0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1TZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1TZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlY29uZGFyeVRhYmxlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuc2V0Q2F0YWxvZygiRk9PIik7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldENhdGFsb2coKSk7Ci0JCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwoc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCU9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldENhdGFsb2coKSk7Ci0JCQotCQlvcm1FbnRpdHkucmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5zaXplKCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRDYXRhbG9nRnJvbUphdmFUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIGphdmFTZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJamF2YVNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhU2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQkFSIik7Ci0JCQotCQlPcm1WaXJ0dWFsU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuZ2V0VmlydHVhbFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCQotCQlqYXZhU2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQkFaIik7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtU2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJCi0JCW9ybUVudGl0eS5zZXRTZWNvbmRhcnlUYWJsZXNBcmVEZWZpbmVkSW5YbWwodHJ1ZSk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9ybUVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Q2F0YWxvZ0Zyb21QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1TZWNvbmRhcnlUYWJsZSBvcm1TZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJb3JtU2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydE51bGwob3JtU2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1TZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtU2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBqYXZhU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuZ2V0SmF2YVR5cGVNYXBwaW5nKCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCWphdmFTZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YVNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coIkpBVkFfQ0FUQUxPRyIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRDYXRhbG9nKCkpOyAvL3NjaGVtYSBpcyBub3QgZGVmYXVsdGVkIGZyb20gdW5kZXJseWluZyBqYXZhCi0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtU2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1TZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApOwotCQkKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4gPSBvcm1TZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uMiA9IG9ybVNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uMyA9IG9ybVNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbjMuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1TZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMocHJpbWFyeUtleUpvaW5Db2x1bW4yLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHByaW1hcnlLZXlKb2luQ29sdW1uMywgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhwcmltYXJ5S2V5Sm9pbkNvbHVtbiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCQotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1TZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCk7Ci0KLQkJb3JtU2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybVNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQlvcm1TZWNvbmRhcnlUYWJsZS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQkJb3JtU2Vjb25kYXJ5VGFibGUucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybVNlY29uZGFyeVRhYmxlLnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApOwotCi0JCW9ybVNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtU2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQkKLQkJCi0JCW9ybVNlY29uZGFyeVRhYmxlLm1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1TZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlvcm1TZWNvbmRhcnlUYWJsZS5tb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCwgMSk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9ybVNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByaW1hcnlLZXlKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1TZWNvbmRhcnlUYWJsZSBvcm1TZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm1vdmUoMiwgMCk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9ybVNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubW92ZSgwLCAxKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9ybVNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9ybVNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1TZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJmb28iKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImJhciIpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1TZWNvbmRhcnlUYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsICBvcm1TZWNvbmRhcnlUYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JCQotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImZvbyIpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDEsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiYmFyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgIG9ybVNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1TZWNvbmRhcnlUYWJsZSBvcm1TZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKTsKLQkJCi0JCW9ybVNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCW9ybVNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCW9ybVNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8WG1sVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5zaXplKCkpOwotCi0JCW9ybVNlY29uZGFyeVRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8WG1sVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludFJlc291cmNlcyA9IHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJCi0JCW9ybVNlY29uZGFyeVRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwkJCi0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybVNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJb3JtU2Vjb25kYXJ5VGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlcyA9IHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5oYXNOZXh0KCkpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybVNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApOwotCQkKLQkJb3JtU2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJb3JtU2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJb3JtU2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1TZWNvbmRhcnlUYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCi0KLQkJb3JtU2Vjb25kYXJ5VGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1TZWNvbmRhcnlUYWJsZSBvcm1TZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKTsKLQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJGT08iKTsKLQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMSwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJCQVIiKTsKLQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJCQVoiKTsKLQotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLm1vdmUoMiwgMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubW92ZSgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1TZWNvbmRhcnlUYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNGcm9tSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSAoSmF2YUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhU2Vjb25kYXJ5VGFibGUgamF2YVNlY29uZGFyeVRhYmxlID0gamF2YUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgpOwotCQlqYXZhU2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiU0VDT05EQVJZIik7Ci0JCQotCQlSZWFkT25seVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRUcnVlKG9ybVNlY29uZGFyeVRhYmxlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0KLQkJCi0JCWphdmFTZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCWphdmFTZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KCkuYWRkQ29sdW1uTmFtZSgiQkFSIik7Ci0JCWphdmFTZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KCkuYWRkQ29sdW1uTmFtZSgiQkFaIik7Ci0KLQkJTGlzdDxSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gQ29sbGVjdGlvblRvb2xzLmxpc3Qob3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB1bmlxdWVDb25zdHJhaW50cy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLmdldCgwKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5nZXQoMSkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMuZ2V0KDIpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkKLQkJb3JtRW50aXR5LnNldFNlY29uZGFyeVRhYmxlc0FyZURlZmluZWRJblhtbCh0cnVlKTsKLQkJT3JtU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUyID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlvcm1TZWNvbmRhcnlUYWJsZTIuc2V0U3BlY2lmaWVkTmFtZSgiU0VDT05EQVJZIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIlNFQ09OREFSWSIsIG9ybVNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybVNlY29uZGFyeVRhYmxlMi5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1TZWNvbmRhcnlUYWJsZTIuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtU2VxdWVuY2VHZW5lcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVNlcXVlbmNlR2VuZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0NTI0OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtU2VxdWVuY2VHZW5lcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JtU2VxdWVuY2VHZW5lcmF0b3JUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybVNlcXVlbmNlR2VuZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7CQkKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKTsJCQotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFNlcXVlbmNlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7CQkKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5zZXRTZXF1ZW5jZU5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldFNlcXVlbmNlTmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLnNldFNlcXVlbmNlTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKSk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRTZXF1ZW5jZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0U2VxdWVuY2VOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRTZXF1ZW5jZU5hbWUoKSk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IGluaXRpYWwgdmFsdWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0SW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZigxMCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwKSwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwKSwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCi0JCS8vc2V0IGluaXRpYWwgdmFsdWUgdG8gMSwgd2hpY2ggaGFwcGVucyB0byBiZSB0aGUgZGVmYXVsdCwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0SW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZigxKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMSksIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCi0JCS8vc2V0IGluaXRpYWwgdmFsdWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5zZXRJbml0aWFsVmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKTsJCQotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBpbml0aWFsIHZhbHVlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZigxMCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwKSwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTApLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSk7Ci0JCQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoSW50ZWdlci52YWx1ZU9mKDEpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMSksIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKLQotCQkvL3NldCBpbml0aWFsIHZhbHVlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKTsJCQotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBhbGxvY2F0aW9uIHNpemUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDEwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTApLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMCksIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCi0JCS8vc2V0IGFsbG9jYXRpb24gc2l6ZSB0byA1MCwgd2hpY2ggaGFwcGVucyB0byBiZSB0aGUgZGVmYXVsdCwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDEpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMSksIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCi0JCS8vc2V0IGFsbG9jYXRpb24gc2l6ZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLnNldEFsbG9jYXRpb25TaXplKG51bGwpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7CQkKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgYWxsb2NhdGlvbiBzaXplIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDEwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTApLCBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldEFsbG9jYXRpb25TaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwKSwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7Ci0JCQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoNTApKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1MCksIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTApLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpKTsKLQotCQkvL3NldCBhbGxvY2F0aW9uIHNpemUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldEFsbG9jYXRpb25TaXplKCkpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVGFibGVHZW5lcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRhYmxlR2VuZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA2Mzk0OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVGFibGVHZW5lcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1UYWJsZUdlbmVyYXRvclRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtVGFibGVHZW5lcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQl0YWJsZUdlbmVyYXRvci5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQl0YWJsZUdlbmVyYXRvci5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IGluaXRpYWwgdmFsdWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0SW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZigxMCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwKSwgdGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwKSwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCi0JCS8vc2V0IGluaXRpYWwgdmFsdWUgdG8gMSwgd2hpY2ggaGFwcGVucyB0byBiZSB0aGUgZGVmYXVsdCwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0SW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZigxKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMSksIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCi0JCS8vc2V0IGluaXRpYWwgdmFsdWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXRJbml0aWFsVmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBpbml0aWFsIHZhbHVlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJdGFibGVHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZigxMCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwKSwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTApLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoSW50ZWdlci52YWx1ZU9mKDEpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMSksIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKLQotCQkvL3NldCBpbml0aWFsIHZhbHVlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJdGFibGVHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBhbGxvY2F0aW9uIHNpemUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDEwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTApLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMCksIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCi0JCS8vc2V0IGFsbG9jYXRpb24gc2l6ZSB0byA1MCwgd2hpY2ggaGFwcGVucyB0byBiZSB0aGUgZGVmYXVsdCwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDEpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgdGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMSksIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCi0JCS8vc2V0IGFsbG9jYXRpb24gc2l6ZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldEFsbG9jYXRpb25TaXplKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgYWxsb2NhdGlvbiBzaXplIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJdGFibGVHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDEwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTApLCB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldEFsbG9jYXRpb25TaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwKSwgdGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoNTApKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1MCksIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTApLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpKTsKLQotCQkvL3NldCBhbGxvY2F0aW9uIHNpemUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldEFsbG9jYXRpb25TaXplKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0VGFibGUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VGFibGUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXRUYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0U2NoZW1hKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRTY2hlbWEoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0U2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJdGFibGVHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkU2NoZW1hKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJdGFibGVHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWFGcm9tUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCQotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZFNjaGVtYSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGVHZW5lcmF0b3IuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXRDYXRhbG9nKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0Q2F0YWxvZygpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJdGFibGVHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkQ2F0YWxvZygiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJdGFibGVHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFBrQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXRQa0NvbHVtbk5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFBrQ29sdW1uTmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldFBrQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRQa0NvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0UGtDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRQa0NvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldFZhbHVlQ29sdW1uTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VmFsdWVDb2x1bW5OYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0VmFsdWVDb2x1bW5OYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFZhbHVlQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXRhYmxlR2VuZXJhdG9yLnNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXRhYmxlR2VuZXJhdG9yLnNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFZhbHVlQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldFBrQ29sdW1uVmFsdWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRQa0NvbHVtblZhbHVlKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0UGtDb2x1bW5WYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFBrQ29sdW1uVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCkpOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1UYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJSXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImZvbyIpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiYmFyIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50c1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCAgdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJmb28iKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgxLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImJhciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsICB0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQkJCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0KLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKLQotCQl0YWJsZUdlbmVyYXRvci5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCQotCQl0YWJsZUdlbmVyYXRvci5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwkJCi0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0KLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCi0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnNpemUoKSk7Ci0JCQotCQkKLQkJdGFibGVHZW5lcmF0b3IubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCUl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCi0KLQkJdGFibGVHZW5lcmF0b3IubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkZPTyIpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgxLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkJBUiIpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgyLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkJBWiIpOwotCi0JCQotCQlJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5tb3ZlKDIsIDApOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLm1vdmUoMCwgMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkucmVtb3ZlKDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkucmVtb3ZlKDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkucmVtb3ZlKDApOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzRnJvbUphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsQXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgdmlydHVhbElkTWFwcGluZyA9IChJZE1hcHBpbmcpIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUphdmFJZE1hcHBpbmcgamF2YUlkTWFwcGluZyA9IChKYXZhSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhVGFibGVHZW5lcmF0b3IgamF2YVRhYmxlR2VuZXJhdG9yID0gamF2YUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlqYXZhVGFibGVHZW5lcmF0b3Iuc2V0TmFtZSgiVEFCTEVfR0VORVJBVE9SIik7Ci0JCQotLy8gPj4+IEknbSBnb2luZyB0byBhcmd1ZSB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIGEgInZpcnR1YWwiIGdlbmVyYXRvciwKLS8vIHNpbmNlIGEgSmF2YSBnZW5lcmF0b3IgaXMgKm5vdCogb3ZlcnJpZGRlbiB3aGVuIGl0cyBJRCBtYXBwaW5nIChvciBlbnRpdHkpCi0vLyBpcyBvdmVycmlkZGVuIGluIHRoZSBvcm0ueG1sIGZpbGUgLSBib3RoIHRoZSBvcm0ueG1sIElEIG1hcHBpbmcgYW5kIHRoZQotLy8gSmF2YSBtYXBwaW5nIGNhbiBkZWZpbmUgYW4gImFjdGl2ZSIgZ2VuZXJhdG9yIGFzIGxvbmcgYXMgdGhleSBoYXZlIGRpZmZlcmVudAotLy8gbmFtZXMgIH5ianYKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSB2aXJ0dWFsSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IpOwotLy8JCUl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotLy8JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlqYXZhVGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgpLmFkZENvbHVtbk5hbWUoIkZPTyIpOwotCQlqYXZhVGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgpLmFkZENvbHVtbk5hbWUoIkJBUiIpOwotCQlqYXZhVGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgpLmFkZENvbHVtbk5hbWUoIkJBWiIpOwotCi0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IpOwotLy8JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotLy8JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLS8vCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIHZpcnR1YWxBdHRyaWJ1dGUuYWRkVG9YbWwoKS5nZXRNYXBwaW5nKCk7Ci0JCi0JCU9ybVRhYmxlR2VuZXJhdG9yIG9ybVRhYmxlR2VuZXJhdG9yMiA9IG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlvcm1UYWJsZUdlbmVyYXRvcjIuc2V0TmFtZSgiVEFCTEVfR0VORVJBVE9SIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtVGFibGVHZW5lcmF0b3IyLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5ZDA2ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVGFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JtVGFibGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybVRhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUFic3RyYWN0VGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklOSEVSSVRBTkNFLCBKUEEuSU5IRVJJVEFOQ0VfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJASW5oZXJpdGFuY2Uoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUykiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiYWJzdHJhY3QiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1UYWJsZSBvcm1UYWJsZSA9IG9ybUVudGl0eS5nZXRUYWJsZSgpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybVRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5zZXRUYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpLmdldE5hbWUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5nZXROYW1lKCkpOwotCi0JCWVudGl0eVJlc291cmNlLnNldFRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1UYWJsZSBvcm1UYWJsZSA9ICgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1UYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1UYWJsZS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZUZyb21KYXZhVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0SmF2YVR5cGVNYXBwaW5nKCkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQmFyIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVOb0phdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZUZyb21FbnRpdHlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tUGFyZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCU9ybUVudGl0eSBwYXJlbnRYbWxFbnRpdHkgPSAoT3JtRW50aXR5KSBwYXJlbnRPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVudGl0eSBjaGlsZFhtbEVudGl0eSA9IChPcm1FbnRpdHkpIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGNoaWxkWG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQlwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQlwYXJlbnRYbWxFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVRhYmxlIG9ybVRhYmxlID0gb3JtRW50aXR5LmdldFRhYmxlKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkpOwotCQkKLQkJLy9zZXQgc2NoZW1hIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5zZXRUYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5zZXRTY2hlbWEoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpLmdldFNjaGVtYSgpKTsKLQkKLQkJLy9zZXQgU2NoZW1hIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVudGl0eVJlc291cmNlLmdldFRhYmxlKCkuc2V0U2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpLmdldFNjaGVtYSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldFRhYmxlKCkuc2V0U2NoZW1hKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2Uuc2V0VGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFNjaGVtYUZyb21KYXZhVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEphdmFUeXBlTWFwcGluZygpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkJhciIpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hTm9KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hRnJvbVBhcmVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnRPcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjaGlsZE9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlPcm1FbnRpdHkgcGFyZW50WG1sRW50aXR5ID0gKE9ybUVudGl0eSkgcGFyZW50T3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FbnRpdHkgY2hpbGRYbWxFbnRpdHkgPSAoT3JtRW50aXR5KSBjaGlsZE9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwocGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkZPTyIpOwotCQlhc3NlcnROdWxsKHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCi0JCXBhcmVudFhtbEVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotCQlhc3NlcnROdWxsKHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFNjaGVtYUZyb21QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZFNjaGVtYSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZFNjaGVtYSgiSkFWQV9TQ0hFTUEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX1NDSEVNQSIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIIik7Ci0JCS8veG1sIGVudGl0eSBub3cgaGFzIGEgdGFibGUgZWxlbWVudCBzbyBkZWZhdWx0IHNjaGVtYSBpcyBub3QgdGFrZW4gZnJvbSBqYXZhCi0JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9TQ0hFTUEiLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVRhYmxlIG9ybVRhYmxlID0gb3JtRW50aXR5LmdldFRhYmxlKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkpOwotCQkKLQkJLy9zZXQgU2NoZW1hIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0JCQotCQkvL3NldCBTY2hlbWEgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtVGFibGUgb3JtVGFibGUgPSBvcm1FbnRpdHkuZ2V0VGFibGUoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChvcm1UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkpOwotCQkKLQkJLy9zZXQgQ2F0YWxvZyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2Uuc2V0VGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVGFibGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldFRhYmxlKCkuc2V0Q2F0YWxvZygiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpLmdldENhdGFsb2coKSk7Ci0JCi0JCS8vc2V0IENhdGFsb2cgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5zZXRDYXRhbG9nKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkuZ2V0Q2F0YWxvZygpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXRUYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtVGFibGUgb3JtVGFibGUgPSBvcm1FbnRpdHkuZ2V0VGFibGUoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChvcm1UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkpOwotCQkKLQkJLy9zZXQgQ2F0YWxvZyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybVRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJLy9zZXQgQ2F0YWxvZyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybVRhYmxlLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRDYXRhbG9nRnJvbUphdmFUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEphdmFUeXBlTWFwcGluZygpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCQotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkJhciIpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdENhdGFsb2dOb0phdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Q2F0YWxvZ0Zyb21QYXJlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50T3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJT3JtRW50aXR5IHBhcmVudFhtbEVudGl0eSA9IChPcm1FbnRpdHkpIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRW50aXR5IGNoaWxkWG1sRW50aXR5ID0gKE9ybUVudGl0eSkgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGNoaWxkWG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCQotCQlwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJGT08iKTsKLQkJYXNzZXJ0TnVsbChwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCi0JCXBhcmVudFhtbEVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotCQlhc3NlcnROdWxsKHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGNoaWxkWG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Q2F0YWxvZ0Zyb21QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZENhdGFsb2coIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEphdmFUeXBlTWFwcGluZygpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiSkFWQV9DQVRBTE9HIik7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9DQVRBTE9HIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIIik7Ci0JCS8veG1sIGVudGl0eSBub3cgaGFzIGEgdGFibGUgZWxlbWVudCBzbyBkZWZhdWx0IHNjaGVtYSBpcyBub3QgdGFrZW4gZnJvbSBqYXZhCi0JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0KLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX0NBVEFMT0ciLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLX0KLQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlYbWxFbnRpdHkgb3JtRW50aXR5ID0gKFhtbEVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCUVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUVudGl0eS5nZXROYW1lKCkpOwotLy8JCQotLy8JCS8vc2V0IGNsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotLy8JCWVudGl0eVJlc291cmNlLnNldENsYXNzTmFtZSgiY29tLkJhciIpOwotLy8JCWFzc2VydEVxdWFscygiQmFyIiwgb3JtRW50aXR5LmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJZW50aXR5UmVzb3VyY2Uuc2V0TmFtZSgiQmF6Iik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCYXoiLCBvcm1FbnRpdHkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQkvL3NldCBjbGFzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotLy8JCWVudGl0eVJlc291cmNlLnNldENsYXNzTmFtZShudWxsKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJheiIsIG9ybUVudGl0eS5nZXROYW1lKCkpOwotLy8JCQotLy8JCWVudGl0eVJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0TmFtZSgpKTsKLS8vCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFRhYmxlIHRhYmxlUmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZSgpOwotCQllbnRpdHlSZXNvdXJjZS5zZXRUYWJsZSh0YWJsZVJlc291cmNlKTsKLQkJCi0JCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQl0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiZm9vIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJiYXIiKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsICBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sVGFibGUgdGFibGVSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlKCk7Ci0JCWVudGl0eVJlc291cmNlLnNldFRhYmxlKHRhYmxlUmVzb3VyY2UpOwotCQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJmb28iKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgxLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImJhciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsICBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCU9ybVRhYmxlIHRhYmxlID0gb3JtRW50aXR5LmdldFRhYmxlKCk7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxUYWJsZSB0YWJsZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJT3JtVGFibGUgdGFibGUgPSBvcm1FbnRpdHkuZ2V0VGFibGUoKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFRhYmxlIHRhYmxlUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCU9ybVRhYmxlIHRhYmxlID0gb3JtRW50aXR5LmdldFRhYmxlKCk7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxUYWJsZSB0YWJsZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKLQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSB0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwkJCi0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0KLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSB0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJT3JtVGFibGUgdGFibGUgPSBvcm1FbnRpdHkuZ2V0VGFibGUoKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFRhYmxlIHRhYmxlUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5zaXplKCkpOwotCQkKLQkJCi0JCXRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSB0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0KLQotCQl0YWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0KLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlcyA9IHRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlPcm1UYWJsZSB0YWJsZSA9IG9ybUVudGl0eS5nZXRUYWJsZSgpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sVGFibGUgdGFibGVSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlKCk7Ci0JCWVudGl0eVJlc291cmNlLnNldFRhYmxlKHRhYmxlUmVzb3VyY2UpOwotCQotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkZPTyIpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgxLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkJBUiIpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgyLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkJBWiIpOwotCi0JCQotCQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQl0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubW92ZSgyLCAwKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5tb3ZlKDAsIDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnJlbW92ZSgxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnJlbW92ZSgxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnJlbW92ZSgwKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCi0vL1RPRE8gbm90IHlldCBzdXBwb3J0aW5nIHVuaXF1ZSBjb25zdHJpYW50cyBmcm9tIGphdmEKLS8vCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50c0Zyb21KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCQotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQkJCQotLy8JCUxpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IG9ybUVudGl0eS5nZXRUYWJsZSgpLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0vLwkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLS8vCi0vLwkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gKEphdmFFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLS8vCQlqYXZhRW50aXR5LmdldFRhYmxlKCkuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLS8vCQlqYXZhRW50aXR5LmdldFRhYmxlKCkuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLS8vCQlqYXZhRW50aXR5LmdldFRhYmxlKCkuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLS8vCQkKLS8vCQkKLS8vCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0vLwkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpKTsKLS8vCi0vLwkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1FbnRpdHkuZ2V0VGFibGUoKS51bmlxdWVDb25zdHJhaW50cygpOwotLy8JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLS8vCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotLy8JCQotLy8JCWVudGl0eVJlc291cmNlLnNldFRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscygwLCAgb3JtRW50aXR5LmdldFRhYmxlKCkudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotLy8JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdEVudGl0eUdldERlZmF1bHROYW1lVGFibGVQZXJDbGFzc0luaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUFic3RyYWN0VGVzdEVudGl0eSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBhYnN0cmFjdFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBhYnN0cmFjdEVudGl0eSA9IChPcm1FbnRpdHkpIGFic3RyYWN0UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb25jcmV0ZVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlPcm1FbnRpdHkgY29uY3JldGVFbnRpdHkgPSAoT3JtRW50aXR5KSBjb25jcmV0ZVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsJCQotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFic3RyYWN0RW50aXR5LmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTLCBhYnN0cmFjdEVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbmNyZXRlRW50aXR5LmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTLCBjb25jcmV0ZUVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgYWJzdHJhY3RFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFic3RyYWN0RW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQkKLQkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGNvbmNyZXRlRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb25jcmV0ZUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29uY3JldGVFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJLy9tZXRhLWRhdGEgY29tcGxldGUgdHJ1ZSwgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kgbm8gc2luZ2xlLXRhYmxlCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgYWJzdHJhY3RFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFic3RyYWN0RW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7CQotCQkKLQkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGUiLCBjb25jcmV0ZUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29uY3JldGVFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbmNyZXRlRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCQotCQkvL3NldCBpbmhlcml0YW5jZSBzdHJhdGVneSB0byB0YWJsZS1wZXItY2xhc3MgaW4gb3JtLnhtbAotCQlhYnN0cmFjdEVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYWJzdHJhY3RFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFic3RyYWN0RW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQkKLQkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGNvbmNyZXRlRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb25jcmV0ZUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29uY3JldGVFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U4OTRjNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5UUkFOU0lFTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUcmFuc2llbnQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1UcmFuc2llbnRNYXBwaW5nIHhtbFRyYW5zaWVudE1hcHBpbmcgPSAoT3JtVHJhbnNpZW50TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbFRyYW5zaWVudCB0cmFuc2llbnRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFRyYW5zaWVudHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgeG1sVHJhbnNpZW50TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdHJhbnNpZW50UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJdHJhbnNpZW50UmVzb3VyY2Uuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCB4bWxUcmFuc2llbnRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIHRyYW5zaWVudFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJdHJhbnNpZW50UmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxUcmFuc2llbnRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodHJhbnNpZW50UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1UcmFuc2llbnRNYXBwaW5nIHhtbFRyYW5zaWVudG5NYXBwaW5nID0gKE9ybVRyYW5zaWVudE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxUcmFuc2llbnQgdHJhbnNpZW50UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRUcmFuc2llbnRzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHhtbFRyYW5zaWVudG5NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB0cmFuc2llbnRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQl4bWxUcmFuc2llbnRuTWFwcGluZy5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIHhtbFRyYW5zaWVudG5NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIHRyYW5zaWVudFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQl4bWxUcmFuc2llbnRuTWFwcGluZy5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHhtbFRyYW5zaWVudG5NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodHJhbnNpZW50UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zaWVudE1hcHBpbmdOb1VuZGVyeWxpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybVRyYW5zaWVudE1hcHBpbmcgb3JtVHJhbnNpZW50TWFwcGluZyA9IChPcm1UcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb3JtVHJhbnNpZW50TWFwcGluZy5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1UcmFuc2llbnRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCQotCS8vQEJhc2ljKGZldGNoPUZldGNoVHlwZS5MQVpZLCBvcHRpb25hbD1mYWxzZSkKLQkvL0BDb2x1bW4obmFtZT0iTVlfQ09MVU1OIiwgdW5pcXVlPXRydWUsIG51bGxhYmxlPWZhbHNlLCBpbnNlcnRhYmxlPWZhbHNlLCB1cGRhdGFibGU9ZmFsc2UsIAotCS8vICAgIGNvbHVtbkRlZmluaXRpb249IkNPTFVNTl9ERUZJTklUSU9OIiwgdGFibGU9Ik1ZX1RBQkxFIiwgbGVuZ3RoPTUsIHByZWNpc2lvbj02LCBzY2FsZT03KSIpOwotCS8vQENvbHVtbigKLQkvL0BMb2IKLQkvL0BUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRVNUQU1QKQotCS8vQEVudW1lcmF0ZWQoRW51bVR5cGUuU1RSSU5HKQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5VHJhbnNpZW50TWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiaWQiLCB0cmFuc2llbnRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9YbWwoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQotCQlPcm1UcmFuc2llbnRNYXBwaW5nIG9ybVRyYW5zaWVudE1hcHBpbmcgPSAoT3JtVHJhbnNpZW50TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtVHJhbnNpZW50TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybVRyYW5zaWVudE1hcHBpbmcgb3JtVHJhbnNpZW50TWFwcGluZyA9IChPcm1UcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1UcmFuc2llbnRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2llbnRNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNpZW50TW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zaWVudE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2llbnRNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNpZW50TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zaWVudE1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJVHJhbnNpZW50TWFwcGluZyB0cmFuc2llbnRNYXBwaW5nID0gKFRyYW5zaWVudE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh0cmFuc2llbnRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zaWVudE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zaWVudE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zaWVudE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5VHJhbnNpZW50TWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVZlcnNpb25NYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1WZXJzaW9uTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYjM2NDcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVZlcnNpb25NYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZVRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9ybVZlcnNpb25NYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1WZXJzaW9uTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVkVSU0lPTiwgSlBBLkNPTFVNTiwgSlBBLlRFTVBPUkFMLCBKUEEuVEVNUE9SQUxfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFZlcnNpb24iKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDb2x1bW4obmFtZT1cIk1ZX0NPTFVNTlwiLCB1bmlxdWU9dHJ1ZSwgbnVsbGFibGU9ZmFsc2UsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSwgY29sdW1uRGVmaW5pdGlvbj1cIkNPTFVNTl9ERUZJTklUSU9OXCIsIHRhYmxlPVwiTVlfVEFCTEVcIiwgbGVuZ3RoPTUsIHByZWNpc2lvbj02LCBzY2FsZT03KSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FU1RBTVApIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1WZXJzaW9uTWFwcGluZyBvcm1WZXJzaW9uTWFwcGluZyA9IChPcm1WZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbFZlcnNpb24gdmVyc2lvblJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZlcnNpb25SZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQl2ZXJzaW9uUmVzb3VyY2Uuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1WZXJzaW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCB2ZXJzaW9uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQl2ZXJzaW9uUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHZlcnNpb25SZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1WZXJzaW9uTWFwcGluZyBvcm1WZXJzaW9uTWFwcGluZyA9IChPcm1WZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbFZlcnNpb24gdmVyc2lvblJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZlcnNpb25SZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1WZXJzaW9uTWFwcGluZy5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybVZlcnNpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIHZlcnNpb25SZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtVmVyc2lvbk1hcHBpbmcuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHZlcnNpb25SZXNvdXJjZS5nZXROYW1lKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybVZlcnNpb25NYXBwaW5nIG9ybVZlcnNpb25NYXBwaW5nID0gKE9ybVZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sVmVyc2lvbiB2ZXJzaW9uUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbCh2ZXJzaW9uUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IHRlbXBvcmFsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQl2ZXJzaW9uUmVzb3VyY2Uuc2V0VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFLCB2ZXJzaW9uUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCi0JCXZlcnNpb25SZXNvdXJjZS5zZXRUZW1wb3JhbChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUsIHZlcnNpb25SZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQotCQl2ZXJzaW9uUmVzb3VyY2Uuc2V0VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRVNUQU1QKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRVNUQU1QLCB2ZXJzaW9uUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0KLQkJLy9zZXQgdGVtcG9yYWwgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJdmVyc2lvblJlc291cmNlLnNldFRlbXBvcmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwodmVyc2lvblJlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtVmVyc2lvbk1hcHBpbmcgb3JtVmVyc2lvbk1hcHBpbmcgPSAoT3JtVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxWZXJzaW9uIHZlcnNpb25SZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKHZlcnNpb25SZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJCQkKLQkJLy9zZXQgdGVtcG9yYWwgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybVZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuREFURSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFLCB2ZXJzaW9uUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCi0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUsIHZlcnNpb25SZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRVNUQU1QKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgdmVyc2lvblJlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0KLQkJLy9zZXQgdGVtcG9yYWwgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1WZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwodmVyc2lvblJlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCS8vVE9ETyB0ZXN0IGRlZmF1bHRzCi0JLy9UT0RPIHRlc3Qgb3ZlcnJpZGluZyBqYXZhIG1hcHBpbmcgd2l0aCBhIGRpZmZlcmVudCBtYXBwaW5nIHR5cGUgaW4geG1sCi0JCi0JcHVibGljIHZvaWQgdGVzdFZlcnNpb25NYXBwaW5nTm9VbmRlcnlsaW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1WZXJzaW9uTWFwcGluZyBvcm1WZXJzaW9uTWFwcGluZyA9IChPcm1WZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9ybVZlcnNpb25NYXBwaW5nLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybVZlcnNpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQotCQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybVZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIG9ybUNvbHVtbi5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29sdW1uLmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOwotCX0KLQkKLQkvL0BCYXNpYyhmZXRjaD1GZXRjaFR5cGUuTEFaWSwgb3B0aW9uYWw9ZmFsc2UpCi0JLy9AQ29sdW1uKG5hbWU9Ik1ZX0NPTFVNTiIsIHVuaXF1ZT10cnVlLCBudWxsYWJsZT1mYWxzZSwgaW5zZXJ0YWJsZT1mYWxzZSwgdXBkYXRhYmxlPWZhbHNlLCAKLQkvLyAgICBjb2x1bW5EZWZpbml0aW9uPSJDT0xVTU5fREVGSU5JVElPTiIsIHRhYmxlPSJNWV9UQUJMRSIsIGxlbmd0aD01LCBwcmVjaXNpb249Niwgc2NhbGU9NykiKTsKLQkvL0BDb2x1bW4oCi0JLy9ATG9iCi0JLy9AVGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCkKLQkvL0BFbnVtZXJhdGVkKEVudW1UeXBlLlNUUklORykKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZlcnNpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MsIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRVNUQU1QLCAoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJCi0JCUNvbHVtbiBjb2x1bW4gPSB2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCBjb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFIiwgY29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCBjb2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDYpLCBjb2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDcpLCBjb2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlWZXJzaW9uTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmFkZFRvWG1sKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZT0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0KLQkJT3JtVmVyc2lvbk1hcHBpbmcgb3JtVmVyc2lvbk1hcHBpbmcgPSAoT3JtVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVZlcnNpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnROdWxsKG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIG9ybUNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Db2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29sdW1uLmdldFNjYWxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1WZXJzaW9uTWFwcGluZyBvcm1WZXJzaW9uTWFwcGluZyA9IChPcm1WZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybVZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbHVtbi5pc0RlZmF1bHRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgb3JtQ29sdW1uLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbHVtbi5nZXREZWZhdWx0U2NhbGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uTW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBJZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uTW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uTW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZlcnNpb25Nb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlWZXJzaW9uTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbk1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbk1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZlcnNpb25Nb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbk1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlWZXJzaW9uTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZlcnNpb25Nb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVhtbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtWG1sVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNiYjkxYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtWG1sVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1YbWxUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybVhtbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5zZXROYW1lKCJmb28iKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCBPcm1YbWwgZ2V0T3JtWG1sKCkgewotCQlyZXR1cm4gKE9ybVhtbCkgZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVSZWZzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZ0ZpbGUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFkZEVudGl0eU1hcHBpbmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygyLCBnZXRKcGFQcm9qZWN0KCkuZ2V0SnBhRmlsZXNTaXplKCkpOwotCQlKcGFYbWxSZXNvdXJjZSBvcm1SZXNvdXJjZSA9IGdldE9ybVhtbFJlc291cmNlKCk7Ci0JCW9ybVJlc291cmNlLmdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJb3JtUmVzb3VyY2Uuc2F2ZShudWxsKTsKLQkJCi0JCS8vdGhlIENvbnRlbnRUeXBlIG9mIHRoZSBvcm0ueG1sIGZpbGUgaXMgbm8gbG9uZ2VyIG9ybSwgc28gdGhlIGpwYSBmaWxlIGlzIHJlbW92ZWQKLQkJYXNzZXJ0TnVsbChnZXRPcm1YbWwoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBnZXRKcGFQcm9qZWN0KCkuZ2V0SnBhRmlsZXNTaXplKCkpOyAvL3Nob3VsZCBvbmx5IGJlIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZQotCQkKLQkJWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3MgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbnRpdHlNYXBwaW5ncygpOwotCQl4bWxFbnRpdHlNYXBwaW5ncy5zZXRWZXJzaW9uKCIxLjAiKTsKLQkJb3JtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoeG1sRW50aXR5TWFwcGluZ3MpOwotCQlvcm1SZXNvdXJjZS5zYXZlKG51bGwpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChnZXRPcm1YbWwoKS5nZXRSb290KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZ2V0SnBhUHJvamVjdCgpLmdldEpwYUZpbGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVJlbW92ZUVudGl0eU1hcHBpbmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIG9ybVJlc291cmNlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoZ2V0T3JtWG1sKCkuZ2V0Um9vdCgpKTsKLQkJCi0JCW9ybVJlc291cmNlLmdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJYXNzZXJ0TnVsbChnZXRPcm1YbWwoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9QZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZTI1YzMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCBPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHsKLQkJcmV0dXJuIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNBbGxGZWF0dXJlc1Vuc2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNVbnNldCgpKTsKLQkJCi0JCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCXBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2Uuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2Uuc2V0Q2FzY2FkZVBlcnNpc3QoZmFsc2UpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2Uuc2V0U2NoZW1hKCJhc2RmIik7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2Uuc2V0U2NoZW1hKG51bGwpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2Uuc2V0Q2F0YWxvZygiYXNkZiIpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2Uuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2Uuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2Uuc2V0QWNjZXNzKG51bGwpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTY2hlbWEoIk1ZX1NDSEVNQSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7Ci0JCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNjaGVtYSgiTVlfU0NIRU1BIik7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNjaGVtYTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgc2NoZW1hIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkU2NoZW1hKCJNWV9TQ0hFTUEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgc28gaXQgZG9lc24ndCBnZXQgcmVtb3ZlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U2NoZW1hMygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IHNvIG9ubHkgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IGdldHMgcmVtb3ZlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRTY2hlbWEoIk1ZX1NDSEVNQSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7Ci0JCQotCQkvL3NldCBzY2hlbWEgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2F0YWxvZygiTVlfQ0FUQUxPRyIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwotCQotCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBjYXRhbG9nIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQ2F0YWxvZygiTVlfQ0FUQUxPRyIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJLy9zZXQgY2F0YWxvZyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2F0YWxvZzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNjaGVtYSgiTVlfU0NIRU1BIik7Ci0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhdGFsb2czKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IHNvIG9ubHkgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IGdldHMgcmVtb3ZlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCQotCQkvL3NldCBjYXRhbG9nIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQ2F0YWxvZygiTVlfQ0FUQUxPRyIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJLy9zZXQgY2F0YWxvZyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYXNjYWRlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGNhc2NhZGVQZXJzaXN0IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkKLQkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgdGFnIG5vdCByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhc2NhZGVQZXJzaXN0KGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBjYXNjYWRlUGVyc2lzdCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJCi0JCS8vc2V0IGNhc2NhZGVQZXJzaXN0IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYXNjYWRlUGVyc2lzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBjYXNjYWRlUGVyc2lzdCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJCi0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IHNvIGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2F0YWxvZygiTVlfQ0FUQUxPRyIpOwotCQkvL3NldCBjYXNjYWRlUGVyc2lzdCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhc2NhZGVQZXJzaXN0KGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVQZXJzaXN0MygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgc28gb25seSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgZ2V0cyByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJCi0JCS8vc2V0IGNhc2NhZGVQZXJzaXN0IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQkKLQkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRDYXNjYWRlUGVyc2lzdChmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCQotCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUFjY2VzczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxELCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUFjY2VzczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBzbyBvbmx5IHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBnZXRzIHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxELCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJkNmM4Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSB7Ci0JCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0FsbEZlYXR1cmVzVW5zZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzVW5zZXQoKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwkJCi0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQotCQkvL3NldCB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCS8vc2V0IHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCS8vc2V0IHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgc28gaXQgZG9lc24ndCBnZXQgcmVtb3ZlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCXBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0NsYXNzUmVmVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0NsYXNzUmVmVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc0YjE4OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9DbGFzc1JlZlRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2xhc3NSZWZUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIENsYXNzUmVmVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDbGFzc05hbWUoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gYWRkIGNsYXNzIHJlZgotCQlYbWxKYXZhQ2xhc3NSZWYgeG1sQ2xhc3NSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEphdmFDbGFzc1JlZigpOwotCQl4bWxDbGFzc1JlZi5zZXRKYXZhQ2xhc3MoImNvbS5mb28uQmFyIik7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuYWRkKHhtbENsYXNzUmVmKTsKLQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgY2xhc3MgbmFtZXMgYXJlIGluaXRpYWxseSBlcXVhbAotCQlhc3NlcnRFcXVhbHMoY2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCksIHhtbENsYXNzUmVmLmdldEphdmFDbGFzcygpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2xhc3MgbmFtZSB0byBkaWZmZXJlbnQgbmFtZSwgdGVzdCBlcXVhbGl0eQotCQl4bWxDbGFzc1JlZi5zZXRKYXZhQ2xhc3MoImNvbS5iYXIuRm9vIik7Ci0JCQotCQljbGFzc1JlZiA9IHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKGNsYXNzUmVmLmdldENsYXNzTmFtZSgpLCB4bWxDbGFzc1JlZi5nZXRKYXZhQ2xhc3MoKSk7Ci0JCQotCQkvLyBzZXQgY2xhc3MgbmFtZSB0byBlbXB0eSBzdHJpbmcsIHRlc3QgZXF1YWxpdHkKLQkJeG1sQ2xhc3NSZWYuc2V0SmF2YUNsYXNzKCIiKTsKLQkJCi0JCWNsYXNzUmVmID0gcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoY2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCksIHhtbENsYXNzUmVmLmdldEphdmFDbGFzcygpKTsKLQkJCi0JCS8vIHNldCBuYW1lIGJhY2sgdG8gbm9uIGVtcHR5IHN0cmluZywgdGVzdCBlcXVhbGl0eQotCQl4bWxDbGFzc1JlZi5zZXRKYXZhQ2xhc3MoImNvbS5mb28uQmFyIik7Ci0JCQotCQljbGFzc1JlZiA9IHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKGNsYXNzUmVmLmdldENsYXNzTmFtZSgpLCB4bWxDbGFzc1JlZi5nZXRKYXZhQ2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDbGFzc05hbWUoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gYWRkIGNsYXNzIHJlZgotCQlYbWxKYXZhQ2xhc3NSZWYgeG1sQ2xhc3NSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEphdmFDbGFzc1JlZigpOwotCQl4bWxDbGFzc1JlZi5zZXRKYXZhQ2xhc3MoImNvbS5mb28uQmFyIik7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuYWRkKHhtbENsYXNzUmVmKTsKLQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgY2xhc3MgbmFtZXMgYXJlIGluaXRpYWxseSBlcXVhbAotCQlhc3NlcnRFcXVhbHMoY2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCksIHhtbENsYXNzUmVmLmdldEphdmFDbGFzcygpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNsYXNzIG5hbWUgdG8gZGlmZmVyZW50IG5hbWUsIHRlc3QgZXF1YWxpdHkKLQkJY2xhc3NSZWYuc2V0Q2xhc3NOYW1lKCJjb20uYmFyLkZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGNsYXNzUmVmLmdldENsYXNzTmFtZSgpLCB4bWxDbGFzc1JlZi5nZXRKYXZhQ2xhc3MoKSk7Ci0JCQotCQkvLyBzZXQgY2xhc3MgbmFtZSB0byBlbXB0eSBzdHJpbmcsIHRlc3QgZXF1YWxpdHkKLQkJY2xhc3NSZWYuc2V0Q2xhc3NOYW1lKCIiKTsKLQkJCi0JCWFzc2VydEVxdWFscyhjbGFzc1JlZi5nZXRDbGFzc05hbWUoKSwgeG1sQ2xhc3NSZWYuZ2V0SmF2YUNsYXNzKCkpOwotCQkKLQkJLy8gc2V0IGNsYXNzIG5hbWUgdG8gbnVsbCwgdGVzdCBlcXVhbGl0eQotCQljbGFzc1JlZi5zZXRDbGFzc05hbWUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoY2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCksIHhtbENsYXNzUmVmLmdldEphdmFDbGFzcygpKTsKLQkJCi0JCS8vIHNldCBuYW1lIGJhY2sgdG8gbm9uLW51bGwsIHRlc3QgZXF1YWxpdHkKLQkJY2xhc3NSZWYuc2V0Q2xhc3NOYW1lKCJjb20uZm9vLkJhciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGNsYXNzUmVmLmdldENsYXNzTmFtZSgpLCB4bWxDbGFzc1JlZi5nZXRKYXZhQ2xhc3MoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQZXJzaXN0ZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQkKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJWG1sSmF2YUNsYXNzUmVmIHhtbENsYXNzUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKYXZhQ2xhc3NSZWYoKTsKLQkJeG1sQ2xhc3NSZWYuc2V0SmF2YUNsYXNzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmFkZCh4bWxDbGFzc1JlZik7Ci0JCQotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGdldFNwZWNpZmllZENsYXNzUmVmKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vdGVzdCBzZXR0aW5nIHRvIGEgY2xhc3MgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgcHJvamVjdAotCQl4bWxDbGFzc1JlZi5zZXRKYXZhQ2xhc3MoImNvbS5mb28uQmFyIik7Ci0JCQotCQljbGFzc1JlZiA9IGdldFNwZWNpZmllZENsYXNzUmVmKCk7CQkKLQkJYXNzZXJ0TnVsbChjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKSk7CQkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9KcHRDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvSnB0Q29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY0NTZhZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9KcHRDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSnB0Q29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMKLQlleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdENvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUm9vdENvbnRleHROb2RlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGVyc2lzdGVuY2VYbWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQZXJzaXN0ZW5jZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBlcnNpc3RlbmNlVW5pdFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1hcHBpbmdGaWxlUmVmVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xhc3NSZWZUZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcHRDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvTWFwcGluZ0ZpbGVSZWZUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvTWFwcGluZ0ZpbGVSZWZUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODgxMDkwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL01hcHBpbmdGaWxlUmVmVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTWFwcGluZ0ZpbGVSZWZUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE1hcHBpbmdGaWxlUmVmVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZigpIHsKLQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlUmVmcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRmlsZU5hbWUoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gYWRkIG1hcHBpbmcgZmlsZSByZWYKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgeG1sRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJeG1sRmlsZVJlZi5zZXRGaWxlTmFtZSgiZm9vLnhtbCIpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKHhtbEZpbGVSZWYpOwotCQlNYXBwaW5nRmlsZVJlZiBmaWxlUmVmID0gcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJLy8gdGVzdCB0aGF0IGZpbGUgbmFtZXMgYXJlIGluaXRpYWxseSBlcXVhbAotCQlhc3NlcnRFcXVhbHMoZmlsZVJlZi5nZXRGaWxlTmFtZSgpLCB4bWxGaWxlUmVmLmdldEZpbGVOYW1lKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0byBkaWZmZXJlbnQgZmlsZSBuYW1lLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbEZpbGVSZWYuc2V0RmlsZU5hbWUoImJhci54bWwiKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmaWxlUmVmLmdldEZpbGVOYW1lKCksIHhtbEZpbGVSZWYuZ2V0RmlsZU5hbWUoKSk7Ci0JCQotCQkvLyBzZXQgZmlsZSBuYW1lIHRvIGVtcHR5IHN0cmluZywgdGVzdCBlcXVhbGl0eQotCQl4bWxGaWxlUmVmLnNldEZpbGVOYW1lKCIiKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmaWxlUmVmLmdldEZpbGVOYW1lKCksIHhtbEZpbGVSZWYuZ2V0RmlsZU5hbWUoKSk7Ci0JCQotCQkvLyBzZXQgZmlsZSBuYW1lIHRvIG51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sRmlsZVJlZi5zZXRGaWxlTmFtZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmaWxlUmVmLmdldEZpbGVOYW1lKCksIHhtbEZpbGVSZWYuZ2V0RmlsZU5hbWUoKSk7Ci0JCQotCQkvLyBzZXQgZmlsZSBuYW1lIGJhY2sgdG8gbm9uLW51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sRmlsZVJlZi5zZXRGaWxlTmFtZSgiYmF6LnhtbCIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZpbGVSZWYuZ2V0RmlsZU5hbWUoKSwgeG1sRmlsZVJlZi5nZXRGaWxlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUZpbGVOYW1lKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIGFkZCBtYXBwaW5nIGZpbGUgcmVmCi0JCVhtbE1hcHBpbmdGaWxlUmVmIHhtbEZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCXhtbEZpbGVSZWYuc2V0RmlsZU5hbWUoImZvby54bWwiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmFkZCh4bWxGaWxlUmVmKTsKLQkJTWFwcGluZ0ZpbGVSZWYgZmlsZVJlZiA9IHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCBmaWxlIG5hbWVzIGFyZSBpbml0aWFsbHkgZXF1YWwKLQkJYXNzZXJ0RXF1YWxzKGZpbGVSZWYuZ2V0RmlsZU5hbWUoKSwgeG1sRmlsZVJlZi5nZXRGaWxlTmFtZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IHRvIGRpZmZlcmVudCBmaWxlIG5hbWUsIHRlc3QgZXF1YWxpdHkKLQkJZmlsZVJlZi5zZXRGaWxlTmFtZSgiYmFyLnhtbCIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZpbGVSZWYuZ2V0RmlsZU5hbWUoKSwgeG1sRmlsZVJlZi5nZXRGaWxlTmFtZSgpKTsKLQkJCi0JCS8vIHNldCBmaWxlIG5hbWUgdG8gZW1wdHkgc3RyaW5nLCB0ZXN0IGVxdWFsaXR5Ci0JCWZpbGVSZWYuc2V0RmlsZU5hbWUoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZpbGVSZWYuZ2V0RmlsZU5hbWUoKSwgeG1sRmlsZVJlZi5nZXRGaWxlTmFtZSgpKTsKLQkJCi0JCS8vIHNldCBmaWxlIG5hbWUgdG8gbnVsbCwgdGVzdCBlcXVhbGl0eQotCQlmaWxlUmVmLnNldEZpbGVOYW1lKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZpbGVSZWYuZ2V0RmlsZU5hbWUoKSwgeG1sRmlsZVJlZi5nZXRGaWxlTmFtZSgpKTsKLQkJCi0JCS8vIHNldCBmaWxlIG5hbWUgYmFjayB0byBub24tbnVsbCwgdGVzdCBlcXVhbGl0eQotCQlmaWxlUmVmLnNldEZpbGVOYW1lKCJiYXoueG1sIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmlsZVJlZi5nZXRGaWxlTmFtZSgpLCB4bWxGaWxlUmVmLmdldEZpbGVOYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJmMjU4ZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBQZXJzaXN0ZW5jZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UoKSB7Ci0JCXJldHVybiBnZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBZGRQZXJzaXN0ZW5jZVVuaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UgPSBnZXRYbWxQZXJzaXN0ZW5jZSgpOwotCQlQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZSA9IGdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBwZXJzaXN0ZW5jZSB1bml0cywgdGVzdCB0aGF0IGl0J3MgY2xlYXIgaW4gY29udGV4dAotCQl4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuY2xlYXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpKTsKLQkJCi0JCS8vIGFkZCB4bWwgcGVyc2lzdGVuY2UgdW5pdCwgdGVzdCB0aGF0IGl0J3MgYWRkZWQgdG8gY29udGV4dAotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldE5hbWUoInRlc3QiKTsKLQkJeG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLmFkZCh4bWxQZXJzaXN0ZW5jZVVuaXQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHNTaXplKCkpOwotCQkKLQkJLy8gYWRkIGFub3RoZXIsIHRlc3QgdGhhdCBpdCAqaXNuJ3QqIGFkZCB0byBjb250ZXh0Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXROYW1lKCJ0ZXN0MiIpOwotCQl4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuYWRkKHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlBZGRQZXJzaXN0ZW5jVW5pdCgpIHsKLQkJWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UgPSBnZXRYbWxQZXJzaXN0ZW5jZSgpOwotCQlQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZSA9IHBlcnNpc3RlbmNlKCk7Ci0JCQotCQkvLyBjbGVhciB4bWwgcGVyc2lzdGVuY2UgdW5pdHMsIHRlc3QgdGhhdCBpdCdzIGNsZWFyIGluIGNvbnRleHQKLQkJeG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLmNsZWFyKCk7Ci0JCWFzc2VydEVxdWFscygwLCBwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpKTsKLQkJCi0JCS8vIGFkZCBwZXJzaXN0ZW5jZSB1bml0LCB0ZXN0IHRoYXQgaXQncyBhZGRlZCB0byByZXNvdXJjZQotCQlwZXJzaXN0ZW5jZS5hZGRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpKTsKLQkJCi0JCS8vIGFkZCBhbm90aGVyLCB0ZXN0IHRoYXQgd2UgZ2V0IGFuIGV4Y2VwdGlvbgotCQlib29sZWFuIGV4Y2VwdGlvbiA9IGZhbHNlOwotCQl0cnkgewotCQkJcGVyc2lzdGVuY2UuYWRkUGVyc2lzdGVuY2VVbml0KCk7Ci0JCX0KLQkJY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJZXhjZXB0aW9uID0gdHJ1ZTsKLQkJfQotCQkKLQkJYXNzZXJ0VHJ1ZShleGNlcHRpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUmVtb3ZlUGVyc2lzdGVuY2VVbml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhtbFBlcnNpc3RlbmNlIHhtbFBlcnNpc3RlbmNlID0gZ2V0WG1sUGVyc2lzdGVuY2UoKTsKLQkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSBnZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCk7Ci0JCQotCQkvLyBhZGQgYSBwZXJzaXN0ZW5jZSB1bml0IGFuZCB0ZXN0IHRoYXQgdGhlcmUgYXJlIHR3byBleGlzdGluZyB4bWwgYW5kIAotCQkvLyBvbmUgY29udGV4dCBwZXJzaXN0ZW5jZSB1bml0Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0TmFtZSgidGVzdCIpOwotCQl4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuYWRkKHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBwZXJzaXN0ZW5jZSB1bml0IGZyb20geG1sLCB0ZXN0IHRoYXQgY29udGV4dCByZW1haW5zIHVuY2hhbmdlZAotCQl4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuZ2V0KDApOwotCQl4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkucmVtb3ZlKHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgeG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm90aGVyIG9uZSBmcm9tIHhtbCwgdGV4dCB0aGF0IGl0J3Mgbm93IHJlbW92ZWQgZnJvbSBjb250ZXh0Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCA9IHhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5nZXQoMCk7Ci0JCXhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5yZW1vdmUoeG1sUGVyc2lzdGVuY2VVbml0KTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCB4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UmVtb3ZlUGVyc2lzdGVuY2VVbml0KCkgewotCQlYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZSA9IGdldFhtbFBlcnNpc3RlbmNlKCk7Ci0JCVBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2UoKTsKLQkJCi0JCS8vIGFkZCBhIHBlcnNpc3RlbmNlIHVuaXQgYW5kIHRlc3QgdGhhdCB0aGVyZSBhcmUgdHdvIGV4aXN0aW5nIHhtbCBhbmQgCi0JCS8vIG9uZSBjb250ZXh0IHBlcnNpc3RlbmNlIHVuaXQKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXROYW1lKCJ0ZXN0Iik7Ci0JCXhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5hZGQoeG1sUGVyc2lzdGVuY2VVbml0KTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHNTaXplKCkpOwotCQkKLQkJLy8gcmVtb3ZlIHBlcnNpc3RlbmNlIHVuaXQsIHRlc3QgdGhhdCBpdCdzIHJlbW92ZWQgZnJvbSByZXNvdXJjZSBhbmQgdGhhdAotCQkvLyBhICpuZXcqIHBlcnNpc3RlbmNlIHVuaXQgcmVwcmVzZW50aW5nIHRoZSBwcmV2aW91c2x5IHVucmVwcmVzZW50ZWQgb25lCi0JCS8vIGlzIHByZXNlbnQKLQkJcGVyc2lzdGVuY2UucmVtb3ZlUGVyc2lzdGVuY2VVbml0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0c1NpemUoKSk7Ci0JCQotCQkvLyByZW1vdmUgbmV3IHBlcnNpc3RlbmNlIHVuaXQsIHRlc3QgdGhhdCBpdCdzIHJlbW92ZWQgZnJvbSByZXNvdXJjZSBhbmQgCi0JCS8vIGNvbnRleHQKLQkJcGVyc2lzdGVuY2UucmVtb3ZlUGVyc2lzdGVuY2VVbml0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0c1NpemUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VVbml0VGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNGQwMzUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VVbml0VGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxFbnVtVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotLyoqCi0gKiAgUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGVyc2lzdGVuY2VVbml0VGVzdENhc2UgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUV2ZW50IHByb3BlcnR5Q2hhbmdlZEV2ZW50OwotCi0JcHJvdGVjdGVkIGludCBwcm9wZXJ0eUNoYW5nZWRFdmVudENvdW50OwotCi0JcHJvdGVjdGVkIGludCBwcm9wZXJ0aWVzVG90YWw7Ci0KLQlwcm90ZWN0ZWQgaW50IG1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQotCXByb3RlY3RlZCBpbnQgbW9kZWxQcm9wZXJ0aWVzU2l6ZTsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8vICoqKioqKiBhYnN0cmFjdCBtZXRob2RzICoqKioqKioKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuIENhbm5vdCB1c2UKLQkgKiBQcm9wZXJ0eSBIb2xkZXIgdG8gaW5pdGlhbGl6ZSBiZWNhdXNlIGl0IGlzIG5vdCBjcmVhdGVkIHlldAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHBvcHVsYXRlUHUoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIG1vZGVsJ3MgcHJvcGVydHkgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gcHJvcGVydHlOYW1lLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIG5hbWUgb2YgcHJvcGVydHkgdG8gZ2V0Ci0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBFeGNlcHRpb247Ci0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGVsJ3MgcHJvcGVydHkgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gcHJvcGVydHlOYW1lLgotCSAqIFVzZWQgaW4gdmVyaWZ5U2V0UHJvcGVydHkoKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIG5hbWUgb2YgcHJvcGVydHkgdG8gYmUgc2V0Ci0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICB2YWx1ZSBvZiBwcm9wZXJ0eQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JCi0JLy8gKioqKioqIGNvbnZlbmllbmNlIHRlc3QgbWV0aG9kcyAqKioqKioqCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCS8vVE9ETyB5ZXMsIEkga25vdywgYW4gaW5zdGFuY2VvZiBjaGVjaywgdGhpcyBpcyBhIExPVCBvZiB3b3JrIHRvIGdldCByaWQgb2YgaW4gdGhlIHRlc3RzCi0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlWG1sRW51bVZhbHVlKSB7Ci0JCQlyZXR1cm4gKChQZXJzaXN0ZW5jZVhtbEVudW1WYWx1ZSkgdmFsdWUpLmdldFByb3BlcnR5VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IEUgZ2V0Rmlyc3RFbGVtZW50KEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKSB7Ci0JCWlmKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJcmV0dXJuIGl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBQdXQgaW50byBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydGllcy4gRG8gbm90IGFsbG93cyB0byBwdXQgZHVwbGljYXRlIGVudHJ5LgotCSAqIAotCSAqIEBwYXJhbSBrZXkgLQotCSAqICAgICAgICAgICAgUGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IGtleQotCSAqIEBwYXJhbSB2YWx1ZSAtCi0JICogICAgICAgICAgICBwcm9wZXJ0eSB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotCQkKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgga2V5LCB2YWx1ZSwgZmFsc2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gYWxsb3dEdXBsaWNhdGVzKSB7Ci0JCWlmIChrZXkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IGtleSBjYW5ub3QgYmUgbnVsbCIpOwotCQl9Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJdGhpcy5zZXROdWxsUHJvcGVydHkoa2V5KTsKLQkJZWxzZQotCQkJdGhpcy5wdXRQcm9wZXJ0eV8oa2V5LCB2YWx1ZSwgYWxsb3dEdXBsaWNhdGVzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHV0UHJvcGVydHlfKFN0cmluZyBwdUtleSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIGFsbG93RHVwbGljYXRlcykgewotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5zZXRQcm9wZXJ0eShwdUtleSwgdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YodmFsdWUpLCBhbGxvd0R1cGxpY2F0ZXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE51bGxQcm9wZXJ0eShTdHJpbmcgcHVLZXkpIHsKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0UHJvcGVydHkocHVLZXksIG51bGwsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhckV2ZW50KCkgewotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudENvdW50ID0gMDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdGhyb3dNaXNzaW5nRGVmaW5pdGlvbihTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vU3VjaEZpZWxkRXhjZXB0aW9uKCJNaXNzaW5nIERlZmluaXRpb24gZm9yOiAiICsgbWV0aG9kTmFtZSArICIoICIgKyBwcm9wZXJ0eU5hbWUgKyAiKSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTGlzdEV2ZW50IGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUuZ2V0TGlzdE5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlLnRoaXMucHJvcGVydHlDaGFuZ2VkRXZlbnQgPSBldmVudDsKLQkJCQlQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZS50aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50Q291bnQrKzsKLQkJCX0KLQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIlBlcnNpc3RlbmNlVW5pdCBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmeSBpZiB0aGUgcHJvcGVydHkgZXhpc3RzIGluIHRoZSBwZXNpc3RlbmNlLnhtbAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByb3BlcnR5RXhpc3RzKFN0cmluZyBwdVByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShwdVByb3BlcnR5TmFtZSkgIT0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9wZXJ0eVZhbHVlRXF1YWxzKFN0cmluZyBwdVByb3BlcnR5TmFtZSwgU3RyaW5nIHByb3BlcnR5VmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkocHVQcm9wZXJ0eU5hbWUpLmdldFZhbHVlKCkuZXF1YWxzKHByb3BlcnR5VmFsdWUpOwotCX0KLQkKLQkvLyAqKioqKiogdmVyaWZ5IFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzICoqKioqKioKLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5QUFWYWx1ZShCb29sZWFuIGV4cGVjdGVkVmFsdWUsIEJvb2xlYW4gc3ViamVjdFZhbHVlLCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYWEsIFN0cmluZyBwZXJzaXN0ZW5jZVhtbEtleSkgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgc3ViamVjdFZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIGFhLmdldFZhbHVlKCkpOwotCQlpZiAoZXhwZWN0ZWRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlhc3NlcnRUcnVlKCJQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWUgbm90IGVxdWFscyIsIHRoaXMucHJvcGVydHlWYWx1ZUVxdWFscyhwZXJzaXN0ZW5jZVhtbEtleSwgZXhwZWN0ZWRWYWx1ZS50b1N0cmluZygpKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgRW51bTxUPj4gdm9pZCB2ZXJpZnlBQVZhbHVlKFQgZXhwZWN0ZWRWYWx1ZSwgVCBzdWJqZWN0VmFsdWUsIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRW51bTxUPj4gYWEsIFN0cmluZyBwdUtleSkgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgc3ViamVjdFZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIGFhLmdldFZhbHVlKCkpOwotCQlpZiAoZXhwZWN0ZWRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlhc3NlcnRUcnVlKCJQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWUgbm90IGVxdWFscyIsIHRoaXMucHJvcGVydHlWYWx1ZUVxdWFscyhwdUtleSwgdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoZXhwZWN0ZWRWYWx1ZSkpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgdGVzdHM6PGJyPgotCSAqIDEuIHZlcmlmeSB0b3RhbCBudW1iZXIgb2YgUGVyc2lzdGVuY2VVbml0IHByb3BlcnRpZXM8YnI+Ci0JICogMi4gdmVyaWZ5IFBVIGhhcyB0aGUgZ2l2ZW4gcHJvcGVydHlOYW1lPGJyPgotCSAqIDMuIHZlcmlmeSBsaXN0ZW5pbmcgdG8gcHJvcGVydHlMaXN0QWRhcHRlcjxicj4KLQkgKiA0LiB2ZXJpZnkgdGhhdCB0aGUgbW9kZWwgY2FuIGlkZW50aWZ5IHByb3BlcnR5TmFtZTxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlJbml0aWFsU3RhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHB1S2V5LCBMaXN0VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IHByb3BlcnR5TGlzdEFkYXB0ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoIlRvdGFsIG5vdCB1cGRhdGVkIGluIHBvcHVsYXRlUHUoKTogIiwgcHJvcGVydHlMaXN0QWRhcHRlci5zaXplKCksIHRoaXMucHJvcGVydGllc1RvdGFsKTsKLQkJdGhpcy52ZXJpZnlQdUhhc1Byb3BlcnR5KHB1S2V5LCAiUHJvcGVydHkgbm90IGFkZGVkIHRvIHBvcHVsYXRlUHUoKSIpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhwcm9wZXJ0eUxpc3RBZGFwdGVyKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5nZXRNb2RlbCgpLCBwcm9wZXJ0eU5hbWUpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5ID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShwdUtleSk7Ci0JCWFzc2VydFRydWUoIm1vZGVsLml0ZW1Jc1Byb3BlcnR5KCkgaXMgZmFsc2U6ICIsIHRoaXMuZ2V0TW9kZWwoKS5pdGVtSXNQcm9wZXJ0eShwcm9wZXJ0eSkpOwotCQlhc3NlcnRFcXVhbHMoInByb3BlcnR5SWRGb3IoKSBub3QgdXBkYXRlZDogIiwgcHJvcGVydHlOYW1lLCB0aGlzLmdldE1vZGVsKCkucHJvcGVydHlJZE9mKHByb3BlcnR5KSk7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCB0aGUgcGVyc2lzdGVuY2UgdW5pdCBpcyBwb3B1bGF0ZWQsIGFuZCB0aGF0IHRoZSBtb2RlbCBmb3IKLQkgKiB0aGUgdGVzdGVkIFByb3BlcnR5IGlzIGluaXRpYWxpemVkIHdpdGggdGhlIHZhbHVlIGZyb20gdGhlIHBlcnNpc3RlbmNlCi0JICogdW5pdC4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlNb2RlbEluaXRpYWxpemVkKFN0cmluZyBwdUtleSwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KHB1S2V5KTsKLQkJYXNzZXJ0VHJ1ZSgibW9kZWwuaXRlbUlzUHJvcGVydHkoKSBpcyBmYWxzZTogIiwgdGhpcy5nZXRNb2RlbCgpLml0ZW1Jc1Byb3BlcnR5KHByb3BlcnR5KSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiUGVyc2lzdGVuY2VVbml0IG5vdCBwb3B1bGF0ZWQgLSBwb3B1bGF0ZWRQdSgpIiwgdGhpcy5wcm9wZXJ0eVZhbHVlRXF1YWxzKHB1S2V5LCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihleHBlY3RlZFZhbHVlKSkpOwotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZXRNb2RlbCgpLnByb3BlcnR5SWRPZihwcm9wZXJ0eSk7Ci0JCU9iamVjdCBtb2RlbFZhbHVlID0gdGhpcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiTW9kZWwgbm90IGluaXRpYWxpemVkIC0gbW9kZWwuaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSAtIG1vZGVsVmFsdWUgPSAiICsgbW9kZWxWYWx1ZSwgCi0JCQlleHBlY3RlZFZhbHVlLCAKLQkJCW1vZGVsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyB3aXRoIHRoZSBwcm9wZXJ0eTo8YnI+Ci0JICogMS4gdmVyaWZpZXMgdGhlIGluaXRpYWwgc3RhdGU8YnI+Ci0JICogMi4gcGVyc2lzdGVuY2VVbml0IHB1dFByb3BlcnR5PGJyPgotCSAqIDMuIGFkYXB0ZXIgc2V0UHJvcGVydHk8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2V0UHJvcGVydHkoU3RyaW5nIHB1S2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KHB1S2V5KTsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0TW9kZWwoKS5wcm9wZXJ0eUlkT2YocHJvcGVydHkpOwotCi0JCS8vIFJlcGxhY2UKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShwdUtleSwgdGVzdFZhbHVlMik7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUyKTsKLQkJCi0JCS8vIFJlcGxhY2UgYnkgc2V0dGluZyBtb2RlbCBvYmplY3QKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUxKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTEpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyB3aXRoIHRoZSBwcm9wZXJ0eTo8YnI+Ci0JICogMS4gcGVyZm9ybXMgYSByZW1vdmUgb24gdGhlIFBVPGJyPgotCSAqIDIuIHBlcmZvcm1zIGEgYWRkIHdpdGggcHV0UHJvcGVydHk8YnI+Ci0JICogMy4gcGVyZm9ybXMgYSByZXBsYWNlIHdpdGggcHV0UHJvcGVydHk8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoU3RyaW5nIHB1S2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KHB1S2V5KTsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0TW9kZWwoKS5wcm9wZXJ0eUlkT2YocHJvcGVydHkpOwotCi0JCS8vIFJlbW92ZQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJLS10aGlzLnByb3BlcnRpZXNUb3RhbDsKLQkJLS10aGlzLm1vZGVsUHJvcGVydGllc1NpemU7Ci0JCXRoaXMudmVyaWZ5UHVIYXNQcm9wZXJ0eShwdUtleSwgICJwZXJzaXN0ZW5jZVVuaXQucHJvcGVydGllcyBkb2Vzbid0IGNvbnRhaW5zOiAiKTsKLQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5yZW1vdmVQcm9wZXJ0eShwdUtleSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShwdUtleSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb2RlbFByb3BlcnRpZXNTaXplLCB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCAtIDEpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JCQotCQkvLyBBZGQgb3JpZ2luYWwgQ2FjaGVUeXBlRGVmYXVsdAotCQkrK3RoaXMucHJvcGVydGllc1RvdGFsOwotCQkrK3RoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShwdUtleSwgdGVzdFZhbHVlMSk7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUxKTsKLQkJCi0JCS8vIFJlcGxhY2UKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShwdUtleSwgdGVzdFZhbHVlMik7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUyKTsKLQl9Ci0JCi0JLyoqCi0JICogVmVyaWZpZXMgdGhlIG1vZGVsJ3MgcHJvcGVydHkgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gcHJvcGVydHlOYW1lCi0JICogVXNlZCBpbiB2ZXJpZnlTZXRQcm9wZXJ0eSgpIGFuZCB2ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIG5hbWUgb2YgcHJvcGVydHkgdG8gYmUgdmVyaWZpZWQKLQkgKiBAcGFyYW0gZXhwZWN0ZWRWYWx1ZQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UHV0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXRoaXMudmVyaWZ5UHV0RXZlbnQocHJvcGVydHlOYW1lLCB0aGlzLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSksIGV4cGVjdGVkVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFZlcmlmaWVzIHRoZSBldmVudCBvZiB0aGUgcHV0KCkgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIG5hbWUgb2YgcHJvcGVydHkgdG8gYmUgdmVyaWZpZWQKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZQotCSAqICAgICAgICAgICAgdmFsdWUgb2YgcHJvcGVydHkKLQkgKiBAcGFyYW0gZXhwZWN0ZWRWYWx1ZQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UHV0RXZlbnQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB7Ci0JCQotCQl0aGlzLnZlcmlmeUV2ZW50KHByb3BlcnR5TmFtZSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnRWYWx1ZShwcm9wZXJ0eVZhbHVlLCBleHBlY3RlZFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIHRlc3RzOjxicj4KLQkgKiAxLiB2ZXJpZmllcyB0aGUgbmV3IHZhbHVlIG9mIHRoaXMucHJvcGVydHlDaGFuZ2VkRXZlbnQ8YnI+Ci0JICogMi4gdmVyaWZpZXMgdGhlIGdpdmVuIHZhbHVlPGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUV2ZW50VmFsdWUoT2JqZWN0IHZhbHVlLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotCQkvLyB2ZXJpZnkgZXZlbnQgdmFsdWUKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIHRoaXMucHJvcGVydHlDaGFuZ2VkRXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGZvbGxvd2luZyB0ZXN0czo8YnI+Ci0JICogMS4gdmVyaWZpZXMgdGhhdCBhbiBldmVudCBpcyBmaXJlZDxicj4KLQkgKiAyLiB2ZXJpZmllcyB0aGF0IGl0IGlzIHRoZSBjb3JyZWN0IGV2ZW50PGJyPgotCSAqIDMuIHZlcmlmaWVzIHRoYXQgYSBzaW5nbGUgZXZlbnQgaXMgZmlyZWQ8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5RXZlbnQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkvLyB2ZXJpZnkgZXZlbnQgcmVjZWl2ZWQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gRXZlbnQgRmlyZWQuIiwgdGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudCk7Ci0JCS8vIHZlcmlmeSBldmVudCBmb3IgdGhlIGV4cGVjdGVkIHByb3BlcnR5Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgRXZlbnQuIiwgdGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudC5nZXRQcm9wZXJ0eU5hbWUoKSwgcHJvcGVydHlOYW1lKTsKLQkJLy8gdmVyaWZ5IGV2ZW50IG9jY3VycmVuY2UKLQkJYXNzZXJ0VHJ1ZSgiTm8gRXZlbnQgUmVjZWl2ZWQuIiwgdGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudENvdW50ID4gMCk7Ci0JCWFzc2VydFRydWUoIk11bHRpcGxlIEV2ZW50IFJlY2VpdmVkICgiICsgIHRoaXMucHJvcGVydHlDaGFuZ2VkRXZlbnRDb3VudCArICIpIiwKLQkJCXRoaXMucHJvcGVydHlDaGFuZ2VkRXZlbnRDb3VudCA8IDIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RWYWx1ZU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIGxpc3RWYWx1ZU1vZGVsKS5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBtb2RlbCwgU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCBhZGRlZCBpbiBzZXRVcCgpIC0gIiArIHByb3BlcnR5TmFtZSwgKChBYnN0cmFjdE1vZGVsKSBtb2RlbCkuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMocHJvcGVydHlOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbDw/PiBwdm0sIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgcHZtKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhwcm9wZXJ0eU5hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQdUhhc1Byb3BlcnR5KFN0cmluZyBwdVByb3BlcnR5TmFtZSwgU3RyaW5nIG1zZykgewotCQlhc3NlcnRUcnVlKG1zZyArICIgLSAiICsgcHVQcm9wZXJ0eU5hbWUsIHRoaXMucHJvcGVydHlFeGlzdHMocHVQcm9wZXJ0eU5hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQdUhhc05vdFByb3BlcnR5KFN0cmluZyBwdVByb3BlcnR5TmFtZSwgU3RyaW5nIG1zZykgewotCQlhc3NlcnRGYWxzZShtc2cgKyAiIC0gIiArIHB1UHJvcGVydHlOYW1lLCB0aGlzLnByb3BlcnR5RXhpc3RzKHB1UHJvcGVydHlOYW1lKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVVuaXRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VVbml0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI5OTI4Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVVuaXRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ORVJfQ0xBU1NfTkFNRSA9ICJJbm5lckFubm90YXRpb25UZXN0VHlwZSI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX0lOTkVSX0NMQVNTX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBUWVBFX05BTUUgKyAiLiIgKyBJTk5FUl9DTEFTU19OQU1FOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1RIRVJfVFlQRV9OQU1FID0gIk90aGVyVGVzdFR5cGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9PVEhFUl9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBPVEhFUl9UWVBFX05BTUU7Ci0KLQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCBuYW1lcyBhcmUgaW5pdGlhbGx5IGVxdWFsCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIHNldCBuYW1lIHRvIGRpZmZlcmVudCBuYW1lLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldE5hbWUoKSwgcGVyc2lzdGVuY2VVbml0LmdldE5hbWUoKSk7Ci0JCQotCQkvLyBzZXQgbmFtZSB0byBlbXB0eSBzdHJpbmcsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldE5hbWUoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCksIHBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCkpOwotCQkKLQkJLy8gc2V0IG5hbWUgdG8gbnVsbCwgdGVzdCBlcXVhbGl0eQotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0TmFtZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIHNldCBuYW1lIGJhY2sgdG8gbm9uLW51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldE5hbWUoIm5ld05hbWUiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gdGVzdCB0aGF0IG5hbWVzIGFyZSBpbml0aWFsbHkgZXF1YWwKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCksIHBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCkpOwotCQkKLQkJLy8gc2V0IG5hbWUgdG8gZGlmZmVyZW50IG5hbWUsIHRlc3QgZXF1YWxpdHkKLQkJcGVyc2lzdGVuY2VVbml0LnNldE5hbWUoIm5ld05hbWUiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIHNldCBuYW1lIHRvIGVtcHR5IHN0cmluZywgdGVzdCBlcXVhbGl0eQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0TmFtZSgiIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldE5hbWUoKSwgcGVyc2lzdGVuY2VVbml0LmdldE5hbWUoKSk7Ci0JCQotCQkvLyBzZXQgbmFtZSB0byBudWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXROYW1lKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCksIHBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCkpOwotCQkKLQkJLy8gc2V0IG5hbWUgYmFjayB0byBub24tbnVsbCwgdGVzdCBlcXVhbGl0eQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0TmFtZSgibmV3TmFtZSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCksIHBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVHJhbnNhY3Rpb25UeXBlKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIDEgLSBpbml0aWFsIHZhbHVlIGlzIGRlZmF1bHQKLQkJYXNzZXJ0TnVsbCh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0VHJhbnNhY3Rpb25UeXBlKCkpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoKSk7Ci0JCQotCQkvLyAyIC0gc2V0IHZhbHVlLCBjb250ZXh0IGNoYW5nZWQKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldFRyYW5zYWN0aW9uVHlwZShYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBKTsKLQkJCi0JCWFzc2VydEVxdWFscyhQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKCkpOwotCQkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldFRyYW5zYWN0aW9uVHlwZShYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5SRVNPVVJDRV9MT0NBTCwgcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSgpKTsKLQkJCi0JCS8vIDMgLSB1bnNldCB2YWx1ZSwgY29udGV4dCBjaGFuZ2VkCi0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXRUcmFuc2FjdGlvblR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlUcmFuc2FjdGlvblR5cGUoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gMSAtIGluaXRpYWwgdmFsdWUgaXMgZGVmYXVsdAotCQlhc3NlcnROdWxsKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRUcmFuc2FjdGlvblR5cGUoKSk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSgpKTsKLQkJCi0JCS8vIDIgLSBzZXQgY29udGV4dCB2YWx1ZSwgcmVzb3VyY2UgY2hhbmdlZAotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5KVEEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5KVEEsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRUcmFuc2FjdGlvblR5cGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5SRVNPVVJDRV9MT0NBTCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLlJFU09VUkNFX0xPQ0FMLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0VHJhbnNhY3Rpb25UeXBlKCkpOwotCQkKLQkJLy8gMyAtIHNldCBjb250ZXh0IHZhbHVlIHRvIGRlZmF1bHQsIHJlc291cmNlIHVuc2V0Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoKSk7Ci0JCWFzc2VydE51bGwoeG1sUGVyc2lzdGVuY2VVbml0LmdldFRyYW5zYWN0aW9uVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlc2NyaXB0aW9uKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCBkZXNjcmlwdGlvbnMgYXJlIGluaXRpYWxseSBlcXVhbAotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCksIHBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCi0JCS8vIHNldCBkZXNjcmlwdGlvbiB0byBkaWZmZXJlbnQgZGVzY3JpcHRpb24sIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldERlc2NyaXB0aW9uKCJuZXdEZXNjcmlwdGlvbiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQotCQkvLyBzZXQgZGVzY3JpcHRpb24gdG8gZW1wdHkgc3RyaW5nLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXREZXNjcmlwdGlvbigiIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCksIHBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCi0JCS8vIHNldCBkZXNjcmlwdGlvbiB0byBudWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXREZXNjcmlwdGlvbihudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSwgcGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCkpOwotCQkKLQkJLy8gc2V0IGRlc2NyaXB0aW9uIGJhY2sgdG8gbm9uLW51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldERlc2NyaXB0aW9uKCJuZXdEZXNjcmlwdGlvbiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlEZXNjcmlwdGlvbigpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgZGVzY3JpcHRpb25zIGFyZSBpbml0aWFsbHkgZXF1YWwKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQotCQkvLyBzZXQgZGVzY3JpcHRpb24gdG8gZGlmZmVyZW50IGRlc2NyaXB0aW9uLCB0ZXN0IGVxdWFsaXR5Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXREZXNjcmlwdGlvbigibmV3RGVzY3JpcHRpb24iKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSwgcGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCkpOwotCQkKLQkJLy8gc2V0IGRlc2NyaXB0aW9uIHRvIGVtcHR5IHN0cmluZywgdGVzdCBlcXVhbGl0eQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0RGVzY3JpcHRpb24oIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQotCQkvLyBzZXQgZGVzY3JpcHRpb24gdG8gbnVsbCwgdGVzdCBlcXVhbGl0eQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0RGVzY3JpcHRpb24obnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCksIHBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCi0JCS8vIHNldCBkZXNjcmlwdGlvbiBiYWNrIHRvIG5vbi1udWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXREZXNjcmlwdGlvbigibmV3RGVzY3JpcHRpb24iKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSwgcGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJvdmlkZXIoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gdGVzdCB0aGF0IHByb3ZpZGVycyBhcmUgaW5pdGlhbGx5IGVxdWFsCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKSwgcGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCkpOwotCQkKLQkJLy8gc2V0IHByb3ZpZGVyIHRvIGRpZmZlcmVudCBwcm92aWRlciwgdGVzdCBlcXVhbGl0eQotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0UHJvdmlkZXIoIm5ld1Byb3ZpZGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpKTsKLQkJCi0JCS8vIHNldCBwcm92aWRlciB0byBlbXB0eSBzdHJpbmcsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldFByb3ZpZGVyKCIiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKSwgcGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCkpOwotCQkKLQkJLy8gc2V0IHByb3ZpZGVyIHRvIG51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldFByb3ZpZGVyKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKSk7Ci0JCQotCQkvLyBzZXQgcHJvdmlkZXIgYmFjayB0byBub24tbnVsbCwgdGVzdCBlcXVhbGl0eQotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0UHJvdmlkZXIoIm5ld1Byb3ZpZGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByb3ZpZGVyKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCBwcm92aWRlcnMgYXJlIGluaXRpYWxseSBlcXVhbAotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpKTsKLQkJCi0JCS8vIHNldCBwcm92aWRlciB0byBkaWZmZXJlbnQgcHJvdmlkZXIsIHRlc3QgZXF1YWxpdHkKLQkJcGVyc2lzdGVuY2VVbml0LnNldFByb3ZpZGVyKCJuZXdQcm92aWRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKSk7Ci0JCQotCQkvLyBzZXQgcHJvdmlkZXIgdG8gZW1wdHkgc3RyaW5nLCB0ZXN0IGVxdWFsaXR5Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXRQcm92aWRlcigiIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpKTsKLQkJCi0JCS8vIHNldCBwcm92aWRlciB0byBudWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXRQcm92aWRlcihudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKSwgcGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCkpOwotCQkKLQkJLy8gc2V0IHByb3ZpZGVyIGJhY2sgdG8gbm9uLW51bGwsIHRlc3QgZXF1YWxpdHkKLQkJcGVyc2lzdGVuY2VVbml0LnNldFByb3ZpZGVyKCJuZXdQcm92aWRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKdGFEYXRhU291cmNlKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCBqdGFEYXRhU291cmNlcyBhcmUgaW5pdGlhbGx5IGVxdWFsCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpKTsKLQkJCi0JCS8vIHNldCBqdGFEYXRhU291cmNlIHRvIGRpZmZlcmVudCBqdGFEYXRhU291cmNlLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXRKdGFEYXRhU291cmNlKCJuZXdKdGFEYXRhU291cmNlIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKSwgcGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKSk7Ci0JCQotCQkvLyBzZXQganRhRGF0YVNvdXJjZSB0byBlbXB0eSBzdHJpbmcsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldEp0YURhdGFTb3VyY2UoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCkpOwotCQkKLQkJLy8gc2V0IGp0YURhdGFTb3VyY2UgdG8gbnVsbCwgdGVzdCBlcXVhbGl0eQotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0SnRhRGF0YVNvdXJjZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpKTsKLQkJCi0JCS8vIHNldCBqdGFEYXRhU291cmNlIGJhY2sgdG8gbm9uLW51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldEp0YURhdGFTb3VyY2UoIm5ld0p0YURhdGFTb3VyY2UiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUp0YURhdGFTb3VyY2UoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gdGVzdCB0aGF0IGp0YURhdGFTb3VyY2VzIGFyZSBpbml0aWFsbHkgZXF1YWwKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCkpOwotCQkKLQkJLy8gc2V0IGp0YURhdGFTb3VyY2UgdG8gZGlmZmVyZW50IGp0YURhdGFTb3VyY2UsIHRlc3QgZXF1YWxpdHkKLQkJcGVyc2lzdGVuY2VVbml0LnNldEp0YURhdGFTb3VyY2UoIm5ld0p0YURhdGFTb3VyY2UiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpKTsKLQkJCi0JCS8vIHNldCBqdGFEYXRhU291cmNlIHRvIGVtcHR5IHN0cmluZywgdGVzdCBlcXVhbGl0eQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0SnRhRGF0YVNvdXJjZSgiIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKSwgcGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKSk7Ci0JCQotCQkvLyBzZXQganRhRGF0YVNvdXJjZSB0byBudWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXRKdGFEYXRhU291cmNlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCkpOwotCQkKLQkJLy8gc2V0IGp0YURhdGFTb3VyY2UgYmFjayB0byBub24tbnVsbCwgdGVzdCBlcXVhbGl0eQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0SnRhRGF0YVNvdXJjZSgibmV3SnRhRGF0YVNvdXJjZSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTm9uSnRhRGF0YVNvdXJjZSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgbm9uSnRhRGF0YVNvdXJjZXMgYXJlIGluaXRpYWxseSBlcXVhbAotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSwgcGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSk7Ci0JCQotCQkvLyBzZXQgbm9uSnRhRGF0YVNvdXJjZSB0byBkaWZmZXJlbnQgbm9uSnRhRGF0YVNvdXJjZSwgdGVzdCBlcXVhbGl0eQotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0Tm9uSnRhRGF0YVNvdXJjZSgibmV3Tm9uSnRhRGF0YVNvdXJjZSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXROb25KdGFEYXRhU291cmNlKCksIHBlcnNpc3RlbmNlVW5pdC5nZXROb25KdGFEYXRhU291cmNlKCkpOwotCQkKLQkJLy8gc2V0IG5vbkp0YURhdGFTb3VyY2UgdG8gZW1wdHkgc3RyaW5nLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXROb25KdGFEYXRhU291cmNlKCIiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpKTsKLQkJCi0JCS8vIHNldCBub25KdGFEYXRhU291cmNlIHRvIG51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldE5vbkp0YURhdGFTb3VyY2UobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSwgcGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSk7Ci0JCQotCQkvLyBzZXQgbm9uSnRhRGF0YVNvdXJjZSBiYWNrIHRvIG5vbi1udWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXROb25KdGFEYXRhU291cmNlKCJuZXdOb25KdGFEYXRhU291cmNlIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSwgcGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOb25KdGFEYXRhU291cmNlKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCBub25KdGFEYXRhU291cmNlcyBhcmUgaW5pdGlhbGx5IGVxdWFsCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpKTsKLQkJCi0JCS8vIHNldCBub25KdGFEYXRhU291cmNlIHRvIGRpZmZlcmVudCBub25KdGFEYXRhU291cmNlLCB0ZXN0IGVxdWFsaXR5Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXROb25KdGFEYXRhU291cmNlKCJuZXdOb25KdGFEYXRhU291cmNlIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSwgcGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSk7Ci0JCQotCQkvLyBzZXQgbm9uSnRhRGF0YVNvdXJjZSB0byBlbXB0eSBzdHJpbmcsIHRlc3QgZXF1YWxpdHkKLQkJcGVyc2lzdGVuY2VVbml0LnNldE5vbkp0YURhdGFTb3VyY2UoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXROb25KdGFEYXRhU291cmNlKCksIHBlcnNpc3RlbmNlVW5pdC5nZXROb25KdGFEYXRhU291cmNlKCkpOwotCQkKLQkJLy8gc2V0IG5vbkp0YURhdGFTb3VyY2UgdG8gbnVsbCwgdGVzdCBlcXVhbGl0eQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0Tm9uSnRhRGF0YVNvdXJjZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpKTsKLQkJCi0JCS8vIHNldCBub25KdGFEYXRhU291cmNlIGJhY2sgdG8gbm9uLW51bGwsIHRlc3QgZXF1YWxpdHkKLQkJcGVyc2lzdGVuY2VVbml0LnNldE5vbkp0YURhdGFTb3VyY2UoIm5ld05vbkp0YURhdGFTb3VyY2UiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUphckZpbGVSZWZzMSgpIHsKLQkJLy8gVE9ETwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSmFyRmlsZVJlZnMyKCkgewotCQkvLyBUT0RPCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVJbXBsaWVkTWFwcGluZ0ZpbGVSZWYxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCB0aGVyZSBpcyBvbmUgaW5pdGlhbGx5Ci0JCUpwYVhtbFJlc291cmNlIG9ybVJlc291cmNlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZS5maWxlRXhpc3RzKCkpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JCQotCQkvLyByZW1vdmUgb3JtLnhtbAotCQlkZWxldGVSZXNvdXJjZShvcm1SZXNvdXJjZSk7Ci0JCQotCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZS5maWxlRXhpc3RzKCkpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVJbXBsaWVkTWFwcGluZ0ZpbGVSZWYyKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCB0aGVyZSBpcyBvbmUgaW5pdGlhbGx5Ci0JCUpwYVhtbFJlc291cmNlIG9ybVJlc291cmNlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZS5maWxlRXhpc3RzKCkpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JCQotCQkvLyBhZGQgc3BlY2lmaWVkIG9ybS54bWwKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgeG1sTWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCXhtbE1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKCJNRVRBLUlORi9vcm0ueG1sIik7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5hZGQoeG1sTWFwcGluZ0ZpbGVSZWYpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnNTaXplKCkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZS5maWxlRXhpc3RzKCkpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMxKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhlcmUgYXJlIG5vbmUgaW5pdGlhbGx5Ci0JCWFzc2VydEVxdWFscygwLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnNTaXplKCkpOwotCQkKLQkJLy8gYWRkIG1hcHBpbmcgZmlsZSByZWYsIHRlc3QgdGhhdCBpdCdzIGFkZGVkIHRvIGNvbnRleHQKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgeG1sTWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCXhtbE1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKCJvcm0ueG1sIik7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5hZGQoeG1sTWFwcGluZ0ZpbGVSZWYpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnNTaXplKCkpOwotCQkKLQkJLy8gYWRkIGFub3RoZXIgLi4uCi0JCXhtbE1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQl4bWxNYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZSgib3JtMi54bWwiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmFkZCh4bWxNYXBwaW5nRmlsZVJlZik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMyKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIGFkZCB0d28gbWFwcGluZyBmaWxlIHJlZnMgYW5kIHRlc3QgdGhhdCB0aGVyZSBhcmUgdHdvIGV4aXN0aW5nIGluIHhtbCBhbmQgY29udGV4dAotCQlYbWxNYXBwaW5nRmlsZVJlZiB4bWxNYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJeG1sTWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoIm9ybS54bWwiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmFkZCh4bWxNYXBwaW5nRmlsZVJlZik7Ci0JCXhtbE1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQl4bWxNYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZSgib3JtMi54bWwiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmFkZCh4bWxNYXBwaW5nRmlsZVJlZik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLnNpemUoKSwgMik7Ci0JCWFzc2VydEVxdWFscygyLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBtYXBwaW5nIGZpbGUgcmVmIGZyb20geG1sLCB0ZXN0IHRoYXQgaXQncyByZW1vdmVkIGZyb20gY29udGV4dAotCQl4bWxNYXBwaW5nRmlsZVJlZiA9IHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5nZXQoMCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5yZW1vdmUoeG1sTWFwcGluZ0ZpbGVSZWYpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnNTaXplKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGFub3RoZXIgb25lIC4uLgotCQl4bWxNYXBwaW5nRmlsZVJlZiA9IHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5nZXQoMCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5yZW1vdmUoeG1sTWFwcGluZ0ZpbGVSZWYpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzMSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoZXJlIGFyZSBub25lIGluaXRpYWxseQotCQlhc3NlcnRFcXVhbHMoMCwgeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpKTsKLQkJCi0JCS8vIGFkZCBtYXBwaW5nIGZpbGUgcmVmLCB0ZXN0IHRoYXQgaXQncyBhZGRlZCB0byByZXNvdXJjZQotCQlwZXJzaXN0ZW5jZVVuaXQuYWRkU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5nZXQoMCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCQotCQkvLyBhZGQgYW5vdGhlciAuLi4KLQkJcGVyc2lzdGVuY2VVbml0LmFkZFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuZ2V0KDApLmdldEZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5nZXQoMSkuZ2V0RmlsZU5hbWUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLnNpemUoKSk7Ci0JCQotCQkvLyBhZGQgYW5vdGhlciwgdGVzdGluZyBvcmRlcgotCQlwZXJzaXN0ZW5jZVVuaXQuYWRkU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoMCwgImJheiIpOwotCQlhc3NlcnRFcXVhbHMoMywgeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmdldCgwKS5nZXRGaWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuZ2V0KDEpLmdldEZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5nZXQoMikuZ2V0RmlsZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMyKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIGFkZCB0d28gbWFwcGluZyBmaWxlIHJlZnMgYW5kIHRlc3QgdGhhdCB0aGVyZSBhcmUgdHdvIGV4aXN0aW5nIGluIHhtbCBhbmQgY29udGV4dAotCQlYbWxNYXBwaW5nRmlsZVJlZiB4bWxNYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJeG1sTWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoIm9ybS54bWwiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmFkZCh4bWxNYXBwaW5nRmlsZVJlZik7Ci0JCXhtbE1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQl4bWxNYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZSgib3JtMi54bWwiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmFkZCh4bWxNYXBwaW5nRmlsZVJlZik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBtYXBwaW5nIGZpbGUgcmVmIGZyb20gY29udGV4dCwgdGVzdCB0aGF0IGl0J3MgcmVtb3ZlZCBmcm9tIHhtbAotCQlwZXJzaXN0ZW5jZVVuaXQucmVtb3ZlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLnNpemUoKSk7Ci0JCQkKLQkJLy8gcmVtb3ZlIGFub3RoZXIgb25lIC4uLgotCQlwZXJzaXN0ZW5jZVVuaXQucmVtb3ZlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDbGFzc1JlZnMxKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhlcmUgYXJlIG5vbmUgaW5pdGlhbGx5Ci0JCWFzc2VydEVxdWFscygwLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzU2l6ZSgpKTsKLQkJCi0JCS8vIGFkZCBtYXBwaW5nIGZpbGUgcmVmLCB0ZXN0IHRoYXQgaXQncyBhZGRlZCB0byBjb250ZXh0Ci0JCVhtbEphdmFDbGFzc1JlZiB4bWxDbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7Ci0JCXhtbENsYXNzUmVmLnNldEphdmFDbGFzcygiY29tLmZvby5CYXIiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5hZGQoeG1sQ2xhc3NSZWYpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRDbGFzc1JlZnNTaXplKCkpOwotCQkKLQkJLy8gYWRkIGFub3RoZXIgLi4uCi0JCXhtbENsYXNzUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKYXZhQ2xhc3NSZWYoKTsKLQkJeG1sQ2xhc3NSZWYuc2V0SmF2YUNsYXNzKCJjb20uZm9vLkJheiIpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmFkZCh4bWxDbGFzc1JlZik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZENsYXNzUmVmc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDbGFzc1JlZnMyKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIGFkZCB0d28gY2xhc3MgcmVmcyBhbmQgdGVzdCB0aGF0IHRoZXJlIGFyZSB0d28gZXhpc3RpbmcgaW4geG1sIGFuZCBjb250ZXh0Ci0JCVhtbEphdmFDbGFzc1JlZiB4bWxDbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7Ci0JCXhtbENsYXNzUmVmLnNldEphdmFDbGFzcygiY29tLmZvby5CYXIiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5hZGQoeG1sQ2xhc3NSZWYpOwotCQl4bWxDbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7Ci0JCXhtbENsYXNzUmVmLnNldEphdmFDbGFzcygiY29tLmZvby5CYXoiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5hZGQoeG1sQ2xhc3NSZWYpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRDbGFzc1JlZnNTaXplKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGNsYXNzIHJlZiBmcm9tIHhtbCwgdGVzdCB0aGF0IGl0J3MgcmVtb3ZlZCBmcm9tIGNvbnRleHQKLQkJeG1sQ2xhc3NSZWYgPSB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmdldCgwKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5yZW1vdmUoeG1sQ2xhc3NSZWYpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRDbGFzc1JlZnNTaXplKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGFub3RoZXIgb25lIC4uLgotCQl4bWxDbGFzc1JlZiA9IHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuZ2V0KDApOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLnJlbW92ZSh4bWxDbGFzc1JlZik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZENsYXNzUmVmc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDbGFzc1JlZnMxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gdGVzdCB0aGVyZSBhcmUgbm9uZSBpbml0aWFsbHkKLQkJYXNzZXJ0RXF1YWxzKDAsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRDbGFzc1JlZnNTaXplKCkpOwotCQkKLQkJLy8gYWRkIGNsYXNzIHJlZiwgdGVzdCB0aGF0IGl0J3MgYWRkZWQgdG8gY29udGV4dAotCQlwZXJzaXN0ZW5jZVVuaXQuYWRkU3BlY2lmaWVkQ2xhc3NSZWYoIkZvbyIpOwotCQkKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygxLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5nZXQoMCkuZ2V0SmF2YUNsYXNzKCkpOwotCQotCQkvLyBhZGQgYW5vdGhlciAuLi4KLQkJcGVyc2lzdGVuY2VVbml0LmFkZFNwZWNpZmllZENsYXNzUmVmKCJCYXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5nZXQoMCkuZ2V0SmF2YUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuZ2V0KDEpLmdldEphdmFDbGFzcygpKTsKLQkKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdC5hZGRTcGVjaWZpZWRDbGFzc1JlZigwLCAiQmF6Iik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJheiIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuZ2V0KDApLmdldEphdmFDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmdldCgxKS5nZXRKYXZhQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5nZXQoMikuZ2V0SmF2YUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2xhc3NSZWZzMigpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyBhZGQgdHdvIGNsYXNzIHJlZnMgYW5kIHRlc3QgdGhhdCB0aGVyZSBhcmUgdHdvIGV4aXN0aW5nIGluIHhtbCBhbmQgY29udGV4dAotCQlYbWxKYXZhQ2xhc3NSZWYgeG1sQ2xhc3NSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEphdmFDbGFzc1JlZigpOwotCQl4bWxDbGFzc1JlZi5zZXRKYXZhQ2xhc3MoImNvbS5mb28uQmFyIik7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuYWRkKHhtbENsYXNzUmVmKTsKLQkJeG1sQ2xhc3NSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEphdmFDbGFzc1JlZigpOwotCQl4bWxDbGFzc1JlZi5zZXRKYXZhQ2xhc3MoImNvbS5mb28uQmF6Iik7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuYWRkKHhtbENsYXNzUmVmKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzU2l6ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBjbGFzcyByZWYgZnJvbSBjb250ZXh0LCB0ZXN0IHRoYXQgaXQncyByZW1vdmVkIGZyb20geG1sCi0JCXBlcnNpc3RlbmNlVW5pdC5yZW1vdmVTcGVjaWZpZWRDbGFzc1JlZigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLnNpemUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYW5vdGhlciBvbmUgLi4uCi0JCXBlcnNpc3RlbmNlVW5pdC5yZW1vdmVTcGVjaWZpZWRDbGFzc1JlZigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEltcGxpZWRDbGFzc1JlZnMxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUGVyc2lzdGVudElubmVyQ2xhc3MoKTsKLQkJCi0JCWdldEpwYVByb2plY3QoKS5zZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKGZhbHNlKTsKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyhCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZENsYXNzUmVmc1NpemUoKSk7Ci0JCQotCQlnZXRKcGFQcm9qZWN0KCkuc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3Nlcyh0cnVlKTsKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyhCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEltcGxpZWRDbGFzc1JlZnNTaXplKCkpOwotCQl0aGlzLnZlcmlmeVZpcnR1YWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJdGhpcy52ZXJpZnlWaXJ0dWFsQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0lOTkVSX0NMQVNTX05BTUUpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydEVxdWFscygxLCBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRJbXBsaWVkQ2xhc3NSZWZzU2l6ZSgpKTsKLQkJdGhpcy52ZXJpZnlWaXJ0dWFsQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0lOTkVSX0NMQVNTX05BTUUpOwotCQkKLQkJcmVtb3ZlWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydEVxdWFscygyLCBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRJbXBsaWVkQ2xhc3NSZWZzU2l6ZSgpKTsKLQkJdGhpcy52ZXJpZnlWaXJ0dWFsQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCXRoaXMudmVyaWZ5VmlydHVhbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9JTk5FUl9DTEFTU19OQU1FKTsKLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEltcGxpZWRDbGFzc1JlZnNTaXplKCkpOwotCQl0aGlzLnZlcmlmeVZpcnR1YWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfSU5ORVJfQ0xBU1NfTkFNRSk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfSU5ORVJfQ0xBU1NfTkFNRSk7Ci0JCWFzc2VydEVxdWFscygwLCBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRJbXBsaWVkQ2xhc3NSZWZzU2l6ZSgpKTsKLQkJCi0JCXJlbW92ZVhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9JTk5FUl9DTEFTU19OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEltcGxpZWRDbGFzc1JlZnNTaXplKCkpOwotCQl0aGlzLnZlcmlmeVZpcnR1YWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfSU5ORVJfQ0xBU1NfTkFNRSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX0lOTkVSX0NMQVNTX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZENsYXNzUmVmc1NpemUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5VmlydHVhbENsYXNzUmVmKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKHRoaXMuZ2V0VmlydHVhbENsYXNzUmVmKGNsYXNzTmFtZSkgPT0gbnVsbCkgewotCQkJZmFpbCgibWlzc2luZyB2aXJ0dWFsIGNsYXNzIHJlZjogIiArIGNsYXNzTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIENsYXNzUmVmIGdldFZpcnR1YWxDbGFzc1JlZihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWZvciAoQ2xhc3NSZWYgcmVmIDogdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRJbXBsaWVkQ2xhc3NSZWZzKCkpIHsKLQkJCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbChyZWYuZ2V0Q2xhc3NOYW1lKCksIGNsYXNzTmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVmOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW1wbGllZENsYXNzUmVmczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlnZXRKcGFQcm9qZWN0KCkuc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3Nlcyh0cnVlKTsKLQkJSmF2YVJlc291cmNlVHlwZSBqYXZhVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRJbXBsaWVkQ2xhc3NSZWZzKCkpKTsKLQkJCi0JCWphdmFUeXBlLnJlbW92ZUFubm90YXRpb24oSlBBLkVOVElUWSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZENsYXNzUmVmc1NpemUoKSk7Ci0JCQotCQlqYXZhVHlwZS5hZGRBbm5vdGF0aW9uKEpQQS5FTUJFRERBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygxLCBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRJbXBsaWVkQ2xhc3NSZWZzU2l6ZSgpKTsKLQkJCi0JCWphdmFUeXBlLnJlbW92ZUFubm90YXRpb24oSlBBLkVNQkVEREFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEltcGxpZWRDbGFzc1JlZnNTaXplKCkpOwotCQkKLQkJamF2YVR5cGUuYWRkQW5ub3RhdGlvbihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEltcGxpZWRDbGFzc1JlZnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVuYW1lUGVyc2lzdGVudFR5cGVJbXBsaWVkQ2xhc3NSZWZzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWdldEphdmFQcm9qZWN0KCkuZ2V0SnBhUHJvamVjdCgpLnNldERpc2NvdmVyc0Fubm90YXRlZENsYXNzZXModHJ1ZSk7Ci0JCUlDb21waWxhdGlvblVuaXQgdGVzdFR5cGUgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCQlJQ29tcGlsYXRpb25Vbml0IG90aGVyVGVzdFR5cGUgPSB0aGlzLmNyZWF0ZVRlc3RPdGhlclR5cGVFbnRpdHkoKTsKLQkJCi0JCUNsYXNzUmVmIHRlc3RUeXBlQ2xhc3NSZWYgPSB0aGlzLmdldFZpcnR1YWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQ2xhc3NSZWYgb3RoZXJUZXN0VHlwZUNsYXNzUmVmID0gdGhpcy5nZXRWaXJ0dWFsQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX09USEVSX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHRlc3RUeXBlQ2xhc3NSZWYpOwotCQlhc3NlcnROb3ROdWxsKG90aGVyVGVzdFR5cGVDbGFzc1JlZik7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgdGVzdEphdmFQZXJzaXN0ZW50VHlwZSA9IHRlc3RUeXBlQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBvdGhlclRlc3RKYXZhUGVyc2lzdGVudFR5cGUgPSBvdGhlclRlc3RUeXBlQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQl0ZXN0VHlwZS5maW5kUHJpbWFyeVR5cGUoKS5yZW5hbWUoIlRlc3RUeXBlMiIsIGZhbHNlLCBudWxsKTsKLQkJCi0JCXRlc3RUeXBlQ2xhc3NSZWYgPSB0aGlzLmdldFZpcnR1YWxDbGFzc1JlZigidGVzdC5UZXN0VHlwZTIiKTsKLQkJb3RoZXJUZXN0VHlwZUNsYXNzUmVmID0gdGhpcy5nZXRWaXJ0dWFsQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX09USEVSX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHRlc3RUeXBlQ2xhc3NSZWYpOwotCQlhc3NlcnROb3ROdWxsKG90aGVyVGVzdFR5cGVDbGFzc1JlZik7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3RoZXJUZXN0SmF2YVBlcnNpc3RlbnRUeXBlLCBvdGhlclRlc3RUeXBlQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkpOwotCQlhc3NlcnROb3RTYW1lKHRlc3RKYXZhUGVyc2lzdGVudFR5cGUsIHRlc3RUeXBlQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIDEgLSBpbml0aWFsIHZhbHVlIGlzIGRlZmF1bHQKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0LmV4Y2x1ZGVzVW5saXN0ZWRDbGFzc2VzKCkpOwotCQlhc3NlcnROdWxsKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwotCQkKLQkJLy8gMiAtIHNldCB2YWx1ZSwgY29udGV4dCBjaGFuZ2VkCi0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXQuZXhjbHVkZXNVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwotCQkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdC5leGNsdWRlc1VubGlzdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwotCQkKLQkJLy8gMyAtIHVuc2V0IHZhbHVlLCBjb250ZXh0IGNoYW5nZWQKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXQuZXhjbHVkZXNVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCWFzc2VydE51bGwoeG1sUGVyc2lzdGVuY2VVbml0LmdldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIDEgLSBpbml0aWFsIHZhbHVlIGlzIGRlZmF1bHQKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0LmV4Y2x1ZGVzVW5saXN0ZWRDbGFzc2VzKCkpOwotCQlhc3NlcnROdWxsKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwotCQkKLQkJLy8gMiAtIHNldCB2YWx1ZSwgcmVzb3VyY2UgY2hhbmdlZAotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyhCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0LmV4Y2x1ZGVzVW5saXN0ZWRDbGFzc2VzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXQuZXhjbHVkZXNVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJCi0JCS8vIDMgLSBzZXQgY29udGV4dCB0byBkZWZhdWx0LCByZXNvdXJjZSB1bnNldAotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyhudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdC5leGNsdWRlc1VubGlzdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0TnVsbCh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByb3BlcnRpZXMxKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhlcmUgYXJlIG5vbmUgaW5pdGlhbGx5Ci0JCWFzc2VydE51bGwoeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllc1NpemUoKSk7Ci0JCQotCQkvLyBhZGQgInByb3BlcnRpZXMiLCB0ZXN0IHRoYXQgdGhlcmUncyBubyByZWFsIGNoYW5nZSB0byBjb250ZXh0Ci0JCVhtbFByb3BlcnRpZXMgeG1sUHJvcGVydGllcyA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJvcGVydGllcygpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydGllcyh4bWxQcm9wZXJ0aWVzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzU2l6ZSgpKTsKLQkJCi0JCS8vIGFkZCBwcm9wZXJ0eSwgdGVzdCB0aGF0IGl0J3MgYWRkZWQgdG8gY29udGV4dAotCQlYbWxQcm9wZXJ0eSB4bWxQcm9wZXJ0eSA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJvcGVydHkoKTsKLQkJeG1sUHJvcGVydHkuc2V0TmFtZSgiZm9vIik7Ci0JCXhtbFByb3BlcnR5LnNldFZhbHVlKCJiYXIiKTsKLQkJeG1sUHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuYWRkKHhtbFByb3BlcnR5KTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllc1NpemUoKSk7Ci0JCQotCQkvLyBhZGQgYW5vdGhlciAuLi4KLQkJeG1sUHJvcGVydHkgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnR5KCk7Ci0JCXhtbFByb3BlcnR5LnNldE5hbWUoIkZPTyIpOwotCQl4bWxQcm9wZXJ0eS5zZXRWYWx1ZSgiQkFSIik7Ci0JCXhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmFkZCh4bWxQcm9wZXJ0eSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJvcGVydGllczIoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gYWRkIHR3byBwcm9wZXJ0aWVzIGFuZCB0ZXN0IHRoYXQgdGhlcmUgYXJlIHR3byBleGlzdGluZyBpbiB4bWwgYW5kIGNvbnRleHQKLQkJWG1sUHJvcGVydGllcyB4bWxQcm9wZXJ0aWVzID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcm9wZXJ0aWVzKCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXRQcm9wZXJ0aWVzKHhtbFByb3BlcnRpZXMpOwotCQlYbWxQcm9wZXJ0eSB4bWxQcm9wZXJ0eSA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJvcGVydHkoKTsKLQkJeG1sUHJvcGVydHkuc2V0TmFtZSgiZm9vIik7Ci0JCXhtbFByb3BlcnR5LnNldFZhbHVlKCJiYXIiKTsKLQkJeG1sUHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuYWRkKHhtbFByb3BlcnR5KTsKLQkJeG1sUHJvcGVydHkgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnR5KCk7Ci0JCXhtbFByb3BlcnR5LnNldE5hbWUoIkZPTyIpOwotCQl4bWxQcm9wZXJ0eS5zZXRWYWx1ZSgiQkFSIik7Ci0JCXhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmFkZCh4bWxQcm9wZXJ0eSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzU2l6ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBwcm9wZXJ0eSBmcm9tIHhtbCwgdGVzdCB0aGF0IGl0J3MgcmVtb3ZlZCBmcm9tIGNvbnRleHQKLQkJeG1sUHJvcGVydHkgPSB4bWxQcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5nZXQoMCk7Ci0JCXhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLnJlbW92ZSh4bWxQcm9wZXJ0eSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXNTaXplKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGFub3RoZXIgb25lIC4uLgotCQl4bWxQcm9wZXJ0eSA9IHhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmdldCgwKTsKLQkJeG1sUHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKHhtbFByb3BlcnR5KTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcm9wZXJ0aWVzMSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoZXJlIGFyZSBub25lIGluaXRpYWxseQotCQlhc3NlcnROdWxsKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXNTaXplKCkpOwotCQkKLQkJLy8gYWRkIHByb3BlcnR5LCB0ZXN0IHRoYXQgaXQncyBhZGRlZCB0byByZXNvdXJjZQotCQlwZXJzaXN0ZW5jZVVuaXQuYWRkUHJvcGVydHkoKS5zZXROYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKSk7Ci0JCWFzc2VydEVxdWFscygxLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJLy8gYWRkIGFub3RoZXIgLi4uCi0JCXBlcnNpc3RlbmNlVW5pdC5hZGRQcm9wZXJ0eSgpLnNldE5hbWUoImJhciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQkJLy8gYWRkIGFub3RoZXIgdGVzdGluZyBvcmRlcgotCQlwZXJzaXN0ZW5jZVVuaXQuYWRkUHJvcGVydHkoMCkuc2V0TmFtZSgiYmF6Iik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByb3BlcnRpZXMyKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIGFkZCB0d28gcHJvcGVydGllcyBhbmQgdGVzdCB0aGF0IHRoZXJlIGFyZSB0d28gZXhpc3RpbmcgaW4geG1sIGFuZCBjb250ZXh0Ci0JCVhtbFByb3BlcnRpZXMgeG1sUHJvcGVydGllcyA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJvcGVydGllcygpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydGllcyh4bWxQcm9wZXJ0aWVzKTsKLQkJWG1sUHJvcGVydHkgeG1sUHJvcGVydHkgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnR5KCk7Ci0JCXhtbFByb3BlcnR5LnNldE5hbWUoImZvbyIpOwotCQl4bWxQcm9wZXJ0eS5zZXRWYWx1ZSgiYmFyIik7Ci0JCXhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmFkZCh4bWxQcm9wZXJ0eSk7Ci0JCXhtbFByb3BlcnR5ID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcm9wZXJ0eSgpOwotCQl4bWxQcm9wZXJ0eS5zZXROYW1lKCJGT08iKTsKLQkJeG1sUHJvcGVydHkuc2V0VmFsdWUoIkJBUiIpOwotCQl4bWxQcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5hZGQoeG1sUHJvcGVydHkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllc1NpemUoKSk7Ci0JCQotCQkvLyByZW1vdmUgcHJvcGVydHkgZnJvbSBjb250ZXh0LCB0ZXN0IHRoYXQgaXQncyByZW1vdmVkIGZyb20gcmVzb3VyY2UKLQkJcGVyc2lzdGVuY2VVbml0LnJlbW92ZVByb3BlcnR5KCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGFub3RoZXIgb25lLiAgdGVzdCB0aGF0IHByb3BlcnRpZXMgb2JqZWN0IGlzIG51bGxlZAotCQlwZXJzaXN0ZW5jZVVuaXQucmVtb3ZlUHJvcGVydHkoIkZPTyIsICJCQVIiKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcm9wZXJ0aWVzMygpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyBhZGQgdHdvIHByb3BlcnRpZXMgYW5kIHRlc3QgdGhhdCB0aGVyZSBhcmUgdHdvIGV4aXN0aW5nIGluIHhtbCBhbmQgY29udGV4dAotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydHkoImZvbyIsICJiYXIiLCBmYWxzZSk7Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXRQcm9wZXJ0eSgiRk9PIiwgIkJBUiIsIGZhbHNlKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXNTaXplKCkpOwotCQkKLQkJLy8gcmVtb3ZlIHByb3BlcnR5IGZyb20gY29udGV4dCwgdGVzdCB0aGF0IGl0J3MgcmVtb3ZlZCBmcm9tIHJlc291cmNlCi0JCXBlcnNpc3RlbmNlVW5pdC5yZW1vdmVQcm9wZXJ0eSgiZm9vIiwgImJhciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYW5vdGhlciBvbmUsIHRlc3QgdGhhdCBwcm9wZXJ0aWVzIG9iamVjdCBpcyBudWxsZWQKLQkJcGVyc2lzdGVuY2VVbml0LnJlbW92ZVByb3BlcnR5KCJGT08iKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcm9wZXJ0aWVzNCgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyBhZGQgdHdvIHByb3BlcnRpZXMgYW5kIHRlc3QgdGhhdCB0aGVyZSBhcmUgdHdvIGV4aXN0aW5nIGluIHhtbCBhbmQgY29udGV4dAotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydHkoImZvbyIsICJiYXIiLCBmYWxzZSk7Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXRQcm9wZXJ0eSgiRk9PIiwgIkJBUiIsIGZhbHNlKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXNTaXplKCkpOwotCQkKLQkJLy8gbW9kaWZ5IGEgcHJvcGVydHksIHRlc3QgaXRzIHZhbHVlCi0JCXBlcnNpc3RlbmNlVW5pdC5zZXRQcm9wZXJ0eSgiZm9vIiwgIiIsIGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydHkoImZvbyIpLmdldFZhbHVlKCkpOwotCi0JCXBlcnNpc3RlbmNlVW5pdC5zZXRQcm9wZXJ0eSgiZm9vIiwgIkJBUiIsIGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydHkoImZvbyIpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIHByb3BlcnR5IGZyb20gY29udGV4dCwgdGVzdCB0aGF0IGl0J3MgcmVtb3ZlZCBmcm9tIHJlc291cmNlCi0JCXBlcnNpc3RlbmNlVW5pdC5yZW1vdmVQcm9wZXJ0eSgiRk9PIik7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnR5KCJGT08iKSk7Ci0JCWFzc2VydEVxdWFscygxLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOwotCi0JCS8vIHJlbW92ZSBieSBzZXR0aW5nIHZhbHVlIHRvIG51bGwsIHRlc3QgdGhhdCBwcm9wZXJ0aWVzIG9iamVjdCBpcyBudWxsZWQKLQkJcGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnR5KCJub3RFeGlzdCIsIG51bGwsIGZhbHNlKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydHkoIm5vdEV4aXN0IikpOwotCi0JCXBlcnNpc3RlbmNlVW5pdC5zZXRQcm9wZXJ0eSgiZm9vIiwgbnVsbCwgZmFsc2UpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0eSgiZm9vIikpOwotCQlhc3NlcnROdWxsKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJvcGVydGllczUoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gdGVzdGluZyBkdXBsaWNhdGUga2V5cywgYWRkIGZvdXIgcHJvcGVydGllcyBhbmQgdGVzdCB0aGF0IHRoZXJlIGFyZSBmb3VyIGV4aXN0aW5nIGluIHhtbCBhbmQgY29udGV4dAotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydHkoIkZPTyIsICJCQVIiLCBmYWxzZSk7Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXRQcm9wZXJ0eSgiZm9vIiwgImJhciAzIiwgdHJ1ZSk7Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXRQcm9wZXJ0eSgiZm9vIiwgImJhciAyIiwgdHJ1ZSk7Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXRQcm9wZXJ0eSgiZm9vIiwgImJhciAxIiwgdHJ1ZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzU2l6ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhIHByb3BlcnR5LCB0ZXN0IHRoYXQgdGhlcmUgYXJlIGZvdXIgZXhpc3RpbmcgaW4geG1sIGFuZCBjb250ZXh0Ci0JCXBlcnNpc3RlbmNlVW5pdC5yZW1vdmVQcm9wZXJ0eSgiZm9vIiwgImJhciAxIik7Ci0JCWFzc2VydEVxdWFscygzLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgcGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzUHJvcGVydHkoKSB7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIGFkZCB0d28gcHJvcGVydGllcyBhbmQgdHJ5IHRvIGFjY2VzcyBpdC4KLQkJcGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnR5KCJmb28iLCAiYmFyIiwgZmFsc2UpOwotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydHkoIkZPTyIsICJCQVIiLCBmYWxzZSk7Ci0JCQotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydHkoImZvbyIpOwotCQlhc3NlcnROb3ROdWxsKHByb3BlcnR5KTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBwcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydHkoIkZPTyIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydHkoIkZPTyIpLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0eSgibm90RXhpc3QiKSk7Ci0JfQotCQotCXByaXZhdGUgUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHBlcnNpc3RlbmNlVW5pdEZpcnN0UHJvcGVydHkoKSB7Ci0JCXJldHVybiBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0aWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByb3BlcnR5TmFtZSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gYWRkIHByb3BlcnR5IGZvciB0ZXN0aW5nCi0JCVhtbFByb3BlcnRpZXMgeG1sUHJvcGVydGllcyA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJvcGVydGllcygpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydGllcyh4bWxQcm9wZXJ0aWVzKTsKLQkJWG1sUHJvcGVydHkgeG1sUHJvcGVydHkgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnR5KCk7Ci0JCXhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmFkZCh4bWxQcm9wZXJ0eSk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgbmFtZXMgYXJlIGluaXRpYWxseSBlcXVhbAotCQlhc3NlcnRFcXVhbHMoeG1sUHJvcGVydHkuZ2V0TmFtZSgpLCBwZXJzaXN0ZW5jZVVuaXRGaXJzdFByb3BlcnR5KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIHNldCBuYW1lIHRvIGRpZmZlcmVudCBuYW1lLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFByb3BlcnR5LnNldE5hbWUoIm5ld05hbWUiKTsKLQotCQlhc3NlcnRFcXVhbHMoeG1sUHJvcGVydHkuZ2V0TmFtZSgpLCBwZXJzaXN0ZW5jZVVuaXRGaXJzdFByb3BlcnR5KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIHNldCBuYW1lIHRvIGVtcHR5IHN0cmluZywgdGVzdCBlcXVhbGl0eQotCQl4bWxQcm9wZXJ0eS5zZXROYW1lKCIiKTsKLQotCQlhc3NlcnRFcXVhbHMoeG1sUHJvcGVydHkuZ2V0TmFtZSgpLCBwZXJzaXN0ZW5jZVVuaXRGaXJzdFByb3BlcnR5KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIHNldCBuYW1lIGJhY2sgdG8gbm9uLW51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUHJvcGVydHkuc2V0TmFtZSgibmV3TmFtZSIpOwotCi0JCWFzc2VydEVxdWFscyh4bWxQcm9wZXJ0eS5nZXROYW1lKCksIHBlcnNpc3RlbmNlVW5pdEZpcnN0UHJvcGVydHkoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJvcGVydHlWYWx1ZSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gYWRkIHByb3BlcnR5IGZvciB0ZXN0aW5nCi0JCVhtbFByb3BlcnRpZXMgeG1sUHJvcGVydGllcyA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJvcGVydGllcygpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydGllcyh4bWxQcm9wZXJ0aWVzKTsKLQkJWG1sUHJvcGVydHkgeG1sUHJvcGVydHkgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnR5KCk7Ci0JCXhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmFkZCh4bWxQcm9wZXJ0eSk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgdmFsdWVzIGFyZSBpbml0aWFsbHkgZXF1YWwKLQkJYXNzZXJ0RXF1YWxzKHhtbFByb3BlcnR5LmdldFZhbHVlKCksIHBlcnNpc3RlbmNlVW5pdEZpcnN0UHJvcGVydHkoKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCB2YWx1ZSB0byBkaWZmZXJlbnQgdmFsdWUsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUHJvcGVydHkuc2V0VmFsdWUoIm5ld1ZhbHVlIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUHJvcGVydHkuZ2V0VmFsdWUoKSwgcGVyc2lzdGVuY2VVbml0Rmlyc3RQcm9wZXJ0eSgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IHZhbHVlIHRvIGVtcHR5IHN0cmluZywgdGVzdCBlcXVhbGl0eQotCQl4bWxQcm9wZXJ0eS5zZXRWYWx1ZSgiIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUHJvcGVydHkuZ2V0VmFsdWUoKSwgcGVyc2lzdGVuY2VVbml0Rmlyc3RQcm9wZXJ0eSgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IHZhbHVlIHRvIG51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUHJvcGVydHkuc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUHJvcGVydHkuZ2V0VmFsdWUoKSwgcGVyc2lzdGVuY2VVbml0Rmlyc3RQcm9wZXJ0eSgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IHZhbHVlIGJhY2sgdG8gbm9uLW51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUHJvcGVydHkuc2V0VmFsdWUoIm5ld1ZhbHVlIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUHJvcGVydHkuZ2V0VmFsdWUoKSwgcGVyc2lzdGVuY2VVbml0Rmlyc3RQcm9wZXJ0eSgpLmdldFZhbHVlKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYWRkWG1sTWFwcGluZ0ZpbGVSZWYoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQljcmVhdGVPcm0yWG1sRmlsZSgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCUxpc3RJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gbWFwcGluZ0ZpbGVSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVSZWZzKCkuaXRlcmF0b3IoKTsKLQkJT3JtWG1sIG9ybU1hcHBpbmdGaWxlID0gKE9ybVhtbCkgbWFwcGluZ0ZpbGVSZWZzLm5leHQoKS5nZXRNYXBwaW5nRmlsZSgpOwotCQlPcm1YbWwgb3JtMk1hcHBpbmdGaWxlID0gKE9ybVhtbCkgbWFwcGluZ0ZpbGVSZWZzLm5leHQoKS5nZXRNYXBwaW5nRmlsZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHBlcnNpc3RlbmNlVW5pdC5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQkKLQkJb3JtTWFwcGluZ0ZpbGUuZ2V0Um9vdCgpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIHBlcnNpc3RlbmNlVW5pdC5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQkKLQkJb3JtTWFwcGluZ0ZpbGUuZ2V0Um9vdCgpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7CQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgcGVyc2lzdGVuY2VVbml0LmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCQotCQlvcm1NYXBwaW5nRmlsZS5nZXRSb290KCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsJCi0JCWFzc2VydEZhbHNlKG9ybU1hcHBpbmdGaWxlLmdldFJvb3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnJlc291cmNlRXhpc3RzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcGVyc2lzdGVuY2VVbml0LmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCQkJCi0JCW9ybTJNYXBwaW5nRmlsZS5nZXRSb290KCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYWRkWG1sTWFwcGluZ0ZpbGVSZWYoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQljcmVhdGVPcm0yWG1sRmlsZSgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCUxpc3RJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gbWFwcGluZ0ZpbGVSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVSZWZzKCkuaXRlcmF0b3IoKTsKLQkJT3JtWG1sIG9ybU1hcHBpbmdGaWxlID0gKE9ybVhtbCkgbWFwcGluZ0ZpbGVSZWZzLm5leHQoKS5nZXRNYXBwaW5nRmlsZSgpOwotCQlPcm1YbWwgb3JtMk1hcHBpbmdGaWxlID0gKE9ybVhtbCkgbWFwcGluZ0ZpbGVSZWZzLm5leHQoKS5nZXRNYXBwaW5nRmlsZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHBlcnNpc3RlbmNlVW5pdC5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJb3JtTWFwcGluZ0ZpbGUuZ2V0Um9vdCgpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkZPTyIpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgcGVyc2lzdGVuY2VVbml0LmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlvcm1NYXBwaW5nRmlsZS5nZXRSb290KCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsJCi0JCWFzc2VydEZhbHNlKG9ybU1hcHBpbmdGaWxlLmdldFJvb3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnJlc291cmNlRXhpc3RzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcGVyc2lzdGVuY2VVbml0LmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQkJCi0JCW9ybTJNYXBwaW5nRmlsZS5nZXRSb290KCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNjaGVtYSgiQkFSIik7CQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHBlcnNpc3RlbmNlVW5pdC5nZXREZWZhdWx0U2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYWRkWG1sTWFwcGluZ0ZpbGVSZWYoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQljcmVhdGVPcm0yWG1sRmlsZSgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCUxpc3RJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gbWFwcGluZ0ZpbGVSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVSZWZzKCkuaXRlcmF0b3IoKTsKLQkJT3JtWG1sIG9ybU1hcHBpbmdGaWxlID0gKE9ybVhtbCkgbWFwcGluZ0ZpbGVSZWZzLm5leHQoKS5nZXRNYXBwaW5nRmlsZSgpOwotCQlPcm1YbWwgb3JtMk1hcHBpbmdGaWxlID0gKE9ybVhtbCkgbWFwcGluZ0ZpbGVSZWZzLm5leHQoKS5nZXRNYXBwaW5nRmlsZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHBlcnNpc3RlbmNlVW5pdC5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCi0JCW9ybU1hcHBpbmdGaWxlLmdldFJvb3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiRk9PIik7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCQotCQlvcm1NYXBwaW5nRmlsZS5nZXRSb290KCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7CQotCQlhc3NlcnRGYWxzZShvcm1NYXBwaW5nRmlsZS5nZXRSb290KCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5yZXNvdXJjZUV4aXN0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHBlcnNpc3RlbmNlVW5pdC5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCQkKLQkJb3JtMk1hcHBpbmdGaWxlLmdldFJvb3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQkFSIik7CQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHBlcnNpc3RlbmNlVW5pdC5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3JtMlhtbEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBjb25maWcgPQotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT05UQUlORVJfUEFUSCwgCi0JCQkJZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYy9NRVRBLUlORiIpLmdldEZ1bGxQYXRoKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX05BTUUsICJvcm0yLnhtbCIpOwotCQljb25maWcuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JCQotCQlhZGRYbWxNYXBwaW5nRmlsZVJlZigiTUVUQS1JTkYvb3JtMi54bWwiKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPdGhlclR5cGVFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUoUEFDS0FHRV9OQU1FLCBPVEhFUl9UWVBFX05BTUUgKyAiLmphdmEiLCBPVEhFUl9UWVBFX05BTUUsIG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFBlcnNpc3RlbnRJbm5lckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRNZW1iZXJUeXBlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgIiArIElOTkVSX0NMQVNTX05BTUUgKyAiIHt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBlcnNpc3RlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWdldEpwYVByb2plY3QoKS5zZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKGZhbHNlKTsJCi0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJLy9wZXJzaXN0ZW50VHlwZSBub3QgbGlzdGVkIGluIHBlcnNpc3RlbmNlLnhtbCBhbmQgZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzIGlzIGZhbHNlCi0JCS8vc3RpbGwgZmluZCB0aGUgcGVyc2lzdGVudFR5cGUgYmVjYXVzZSBvZiBjaGFuZ2VzIGZvciBidWcgMTkwMzE3Ci0JCWFzc2VydEZhbHNlKGdldEpwYVByb2plY3QoKS5kaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKCkpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSk7Ci0JCQotCQkvL3Rlc3QgcGVyc2lzdGVudFR5cGUgbm90IGxpc3RlZCBpbiBwZXJzaXN0ZW5jZS54bWwsIGRpc2NvdmVyIGFubm90YXRlZCBjbGFzc2VzIHNldCB0byB0cnVlCi0JCWdldEpwYVByb2plY3QoKS5zZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKHRydWUpOwkKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwotCQkKLQkJLy90ZXN0IHBlcnNpc3RlbnRUeXBlIGxpc3QgYXMgY2xhc3MgaW4gcGVyc2lzdGVuY2UueG1sCi0JCWdldEpwYVByb2plY3QoKS5zZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKGZhbHNlKTsKLQkJWG1sSmF2YUNsYXNzUmVmIGNsYXNzUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKYXZhQ2xhc3NSZWYoKTsKLQkJY2xhc3NSZWYuc2V0SmF2YUNsYXNzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRDbGFzc2VzKCkuYWRkKGNsYXNzUmVmKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwotCi0JCQotCQkvL3Rlc3QgcGVyc2lzdGVudFR5cGUgZnJvbSBvcm0ueG1sIGZpbGUgdGhhdCBpcyBzcGVjaWZpZWQgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbAotCQlhZGRYbWxNYXBwaW5nRmlsZVJlZihKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRQZXJzaXN0ZW50VHlwZSgibW9kZWwuRm9vIikpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudFR5cGUsIHBlcnNpc3RlbmNlVW5pdC5nZXRQZXJzaXN0ZW50VHlwZSgibW9kZWwuRm9vIikpOwotCi0JCS8vdGVzdCBwZXJzaXN0ZW50VHlwZSBmcm9tIG9ybS54bWwgZmlsZSB0aGF0IGlzIGltcGxpZWQobm90IHNwZWNpZmllZCkgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbAotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldFBlcnNpc3RlbnRUeXBlKCJtb2RlbC5Gb28iKSk7Ci0JfQotCQotLy9UT0RPCi0vLwlTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpOwotLy8JU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCk7Ci0vLwlBY2Nlc3NUeXBlIGdldERlZmF1bHRBY2Nlc3MoKTsKLS8vCWJvb2xlYW4gZ2V0RGVmYXVsdENhc2NhZGVQZXJzaXN0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiZDMwYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIFBlcnNpc3RlbmNlWG1sVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbCBnZXRQZXJzaXN0ZW5jZVhtbCgpIHsKLQkJcmV0dXJuIGdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBZGRQZXJzaXN0ZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMiwgZ2V0SnBhUHJvamVjdCgpLmdldEpwYUZpbGVzU2l6ZSgpKTsKLQkJSnBhWG1sUmVzb3VyY2UgcHJtID0gZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpOwotCQlwcm0uZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQlwcm0uc2F2ZShudWxsKTsKLQkJCi0JCS8vdGhlIENvbnRlbnRUeXBlIG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSBpcyBubyBsb25nZXIgcGVyc2lzdGVuY2UsIHNvIHRoZSBqcGEgZmlsZSBpcyByZW1vdmVkCi0JCWFzc2VydE51bGwoZ2V0UGVyc2lzdGVuY2VYbWwoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBnZXRKcGFQcm9qZWN0KCkuZ2V0SnBhRmlsZXNTaXplKCkpOyAvL3Nob3VsZCBvbmx5IGJlIHRoZSBvcm0ueG1sIGZpbGUKLQkJCi0JCVhtbFBlcnNpc3RlbmNlIHhtbFBlcnNpc3RlbmNlID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZSgpOwotCQl4bWxQZXJzaXN0ZW5jZS5zZXRWZXJzaW9uKCIxLjAiKTsKLQkJcHJtLmdldENvbnRlbnRzKCkuYWRkKHhtbFBlcnNpc3RlbmNlKTsKLQkJcHJtLnNhdmUobnVsbCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBnZXRKcGFQcm9qZWN0KCkuZ2V0SnBhRmlsZXNTaXplKCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVJlbW92ZVBlcnNpc3RlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHBybSA9IGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpKTsKLQkJCi0JCXBybS5nZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCWFzc2VydE51bGwoZ2V0UGVyc2lzdGVuY2VYbWwoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvUm9vdENvbnRleHROb2RlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1Jvb3RDb250ZXh0Tm9kZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMzU0ZmYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvUm9vdENvbnRleHROb2RlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5KcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5QZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUm9vdENvbnRleHROb2RlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBSb290Q29udGV4dE5vZGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFkZFBlcnNpc3RlbmNlWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWRlbGV0ZVJlc291cmNlKGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKSk7Ci0JCUpwYVJvb3RDb250ZXh0Tm9kZSBiYXNlSnBhQ29udGVudCA9IGdldEphdmFQcm9qZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldFJvb3RDb250ZXh0Tm9kZSgpOwotCQkKLQkJYXNzZXJ0RmFsc2UoZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLmZpbGVFeGlzdHMoKSk7Ci0JCWFzc2VydE51bGwoYmFzZUpwYUNvbnRlbnQuZ2V0UGVyc2lzdGVuY2VYbWwoKSk7Ci0JCQotCQlJRGF0YU1vZGVsIGNvbmZpZyA9Ci0JCQlEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEFJTkVSX1BBVEgsIAotCQkJCWdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJzcmMvTUVUQS1JTkYiKS5nZXRGdWxsUGF0aCgpKTsKLQkJY29uZmlnLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsIG51bGwpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChiYXNlSnBhQ29udGVudC5nZXRQZXJzaXN0ZW5jZVhtbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVJlbW92ZVBlcnNpc3RlbmNlWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHByID0gZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpOwotCQlKcGFSb290Q29udGV4dE5vZGUgYmFzZUpwYUNvbnRlbnQgPSBnZXRKYXZhUHJvamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRSb290Q29udGV4dE5vZGUoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoYmFzZUpwYUNvbnRlbnQuZ2V0UGVyc2lzdGVuY2VYbWwoKSk7Ci0JCQotCQlkZWxldGVSZXNvdXJjZShwcik7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2VKcGFDb250ZW50LmdldFBlcnNpc3RlbmNlWG1sKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L0dlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmM2YTc3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtLkdlbmVyaWNQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByb3RlY3RlZCBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSLCBKcGFGYWNldC5WRVJTSU9OXzJfMC5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlBMQVRGT1JNLCBHZW5lcmljUGxhdGZvcm0uVkVSU0lPTl8yXzApOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfT1JNX1hNTCwgQm9vbGVhbi5UUlVFKTsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEpwYUZhY2V0VmVyc2lvblN0cmluZygpIHsKLQkJcmV0dXJuIEpwYUZhY2V0LlZFUlNJT05fMl8wLmdldFZlcnNpb25TdHJpbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXRKcGFQbGF0Zm9ybURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gR2VuZXJpY1BsYXRmb3JtLlZFUlNJT05fMl8wOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljMl8wSmF2YUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpYzJfMEphdmFDb250ZXh0TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjgwY2ZlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljMl8wSmF2YUNvbnRleHRNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpYzJfMEphdmFDb250ZXh0TW9kZWxUZXN0cwotCWV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoR2VuZXJpYzJfMEphdmFDb250ZXh0TW9kZWxUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZTJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhQmFzaWNNYXBwaW5nMl8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFDYXNjYWRlMl8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFDb2xsZWN0aW9uVGFibGUyXzBUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhRW50aXR5Ml8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFFbWJlZGRlZE1hcHBpbmcyXzBUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YUVtYmVkZGVkSWRNYXBwaW5nMl8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFJZE1hcHBpbmcyXzBUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFNYW55VG9PbmVNYXBwaW5nMl8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFPbmVUb01hbnlNYXBwaW5nMl8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcyXzBUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzBUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlMl8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhVmVyc2lvbk1hcHBpbmcyXzBUZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEdlbmVyaWMyXzBKYXZhQ29udGV4dE1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZTJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMGZmNmUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZTJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5WaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZTJfMFRlc3RzIGV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgPSAiTVlfQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSI7Ci0KLQkJCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgSlBBLk9ORV9UT19PTkUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc01hbnlUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZD4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCi0JCQotCXB1YmxpYyBHZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoKFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZSkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgS2luZC5UWVBFKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUob3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIEtpbmQuVFlQRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSA9IHNwZWNpZmllZE92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBLaW5kLlRZUEUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0KLQkJCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbjIgPSBqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4zID0gam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW4zLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjIsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMywgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4sIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCQotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBLaW5kLlRZUEUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQotCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlqb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlqb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQkKLQkJam9pbmluZ1N0cmF0ZWd5LnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJam9pbmluZ1N0cmF0ZWd5LnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSA9IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIEtpbmQuVFlQRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJCi0JCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscyg0LCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJCi0JCWpvaW5pbmdTdHJhdGVneS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCWpvaW5pbmdTdHJhdGVneS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlKYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIEtpbmQuVFlQRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5hZGRKb2luQ29sdW1uKDApOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuYWRkSm9pbkNvbHVtbigxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmFkZEpvaW5Db2x1bW4oMik7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLnNldE5hbWUoIkZPTyIpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLnNldE5hbWUoIkJBUiIpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLm1vdmVKb2luQ29sdW1uKDIsIDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UubW92ZUpvaW5Db2x1bW4oMCwgMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5yZW1vdmVKb2luQ29sdW1uKDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UucmVtb3ZlSm9pbkNvbHVtbigxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CQkKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UucmVtb3ZlSm9pbkNvbHVtbigwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBlbnRpdHkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGVudGl0eS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShhc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNldEpvaW5UYWJsZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NNYW55VG9NYW55KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoKFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZSkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSA9ICgoT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzApIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIEtpbmQuVFlQRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQotCQkKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKTsKLQkJam9pblRhYmxlLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXRKb2luVGFibGUoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSm9pblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzTWFueVRvTWFueSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gKChWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSkgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSAoKE92ZXJyaWRlUmVsYXRpb25zaGlwMl8wKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBLaW5kLlRZUEUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXRKb2luVGFibGUoKS5zZXROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fVEFCTEUiLCBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pblRhYmxlKCkucmVtb3ZlSm9pbkNvbHVtbigwKTsgIC8vIHJlbW92ZSBkZWZhdWx0Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXRKb2luVGFibGUoKS5hZGRKb2luQ29sdW1uKDApOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pblRhYmxlKCkuYWRkSm9pbkNvbHVtbigxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldEpvaW5UYWJsZSgpLmFkZEpvaW5Db2x1bW4oMik7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pblRhYmxlKCkuam9pbkNvbHVtbkF0KDApLnNldE5hbWUoIkZPTyIpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pblRhYmxlKCkuam9pbkNvbHVtbkF0KDEpLnNldE5hbWUoIkJBUiIpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pblRhYmxlKCkuam9pbkNvbHVtbkF0KDIpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5UYWJsZSgpLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXRKb2luVGFibGUoKS5tb3ZlSm9pbkNvbHVtbigyLCAwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5UYWJsZSgpLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pblRhYmxlKCkubW92ZUpvaW5Db2x1bW4oMCwgMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldEpvaW5UYWJsZSgpLnJlbW92ZUpvaW5Db2x1bW4oMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldEpvaW5UYWJsZSgpLnJlbW92ZUpvaW5Db2x1bW4oMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pblRhYmxlKCkucmVtb3ZlSm9pbkNvbHVtbigwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKGpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0Sm9pblRhYmxlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc01hbnlUb01hbnkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlWaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAgcmVsID0gKFZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCkgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCVZpcnR1YWxKb2luVGFibGUgam9pblRhYmxlID0gcmVsLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkX0Fubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgam9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQkKLQkJZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PX0ZPTyIsIGpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQkKLQkJUGVyc2lzdGVudFR5cGUgbWFwcGVkU3VwZXJjbGFzcyA9IGdldEphdmFFbnRpdHkoKS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIG1hcHBlZFN1cGVyY2xhc3MuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGUuZ2V0TmFtZSgpKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQmFzaWNNYXBwaW5nMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUJhc2ljTWFwcGluZzJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MzdmNWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQmFzaWNNYXBwaW5nMl8wVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNlRW51bWVyYXRlZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNlVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5BY2Nlc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtZXJhdGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkxvYkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFCYXNpY01hcHBpbmcyXzBUZXN0cyBleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkJCi0JcHVibGljIEdlbmVyaWNKYXZhQmFzaWNNYXBwaW5nMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvRGVmYXVsdEJhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihCYXNlRW51bWVyYXRlZENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkRW51bVR5cGUoRW51bVR5cGUuU1RSSU5HKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29udmVydGVyKCkpLmdldEVudW1UeXBlKCkpOwotCQkKLQkJYXNzZXJ0TnVsbCgoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKCgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgKChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9WZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpICgoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb0VtYmVkZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvRW1iZWRkZWRJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb1RyYW5zaWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb09uZVRvT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQkKLS8vVE9ETwlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCAoKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvT25lVG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7Ci0JCQotLy9UT0RPCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9NYW55VG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJCi0vL1RPRE8JYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsICgoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9NYW55VG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJCi0vLwkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKTsKLQkJCi0vLwkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFDYXNjYWRlMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUNhc2NhZGUyXzBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzg1OGFhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUNhc2NhZGUyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFDYXNjYWRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuT25lVG9PbmUyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhQ2FzY2FkZTJfMFRlc3RzCi0JZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFDYXNjYWRlMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYXNjYWRlRGV0YWNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmUyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoT25lVG9PbmUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFPbmVUb09uZU1hcHBpbmcyXzAgbWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YUNhc2NhZGUyXzAgY2FzY2FkZSA9IChKYXZhQ2FzY2FkZTJfMCkgbWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzRGV0YWNoKCkpOwotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uLmlzQ2FzY2FkZURldGFjaCgpKTsKLQkJCi0JCS8vc2V0IGRldGFjaCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYW5ub3RhdGlvbi5zZXRDYXNjYWRlRGV0YWNoKHRydWUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzQ2FzY2FkZURldGFjaCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzRGV0YWNoKCkpOwotCQkKLQkJLy9zZXQgZGV0YWNoIHRvIGZhbHNlIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlhbm5vdGF0aW9uLnNldENhc2NhZGVEZXRhY2goZmFsc2UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbi5pc0Nhc2NhZGVEZXRhY2goKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNEZXRhY2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYXNjYWRlRGV0YWNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmUyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoT25lVG9PbmUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFPbmVUb09uZU1hcHBpbmcyXzAgbWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YUNhc2NhZGUyXzAgY2FzY2FkZSA9IChKYXZhQ2FzY2FkZTJfMCkgbWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzRGV0YWNoKCkpOwotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uLmlzQ2FzY2FkZURldGFjaCgpKTsKLQkJCQkJCi0JCS8vc2V0IGRldGFjaCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJY2FzY2FkZS5zZXREZXRhY2godHJ1ZSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc0Nhc2NhZGVEZXRhY2goKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0RldGFjaCgpKTsKLQkJCi0JCS8vc2V0IGRldGFjaCB0byBmYWxzZSBpbiB0aGUgY29udGV4dCBtb2RlbAotCQljYXNjYWRlLnNldERldGFjaChmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKGFubm90YXRpb24uaXNDYXNjYWRlRGV0YWNoKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzRGV0YWNoKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUNvbGxlY3Rpb25UYWJsZTJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFDb2xsZWN0aW9uVGFibGUyXzBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGEyYjhmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUNvbGxlY3Rpb25UYWJsZTJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUNvbGxlY3Rpb25UYWJsZTJfMFRlc3RzIGV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEdlbmVyaWNKYXZhQ29sbGVjdGlvblRhYmxlMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbGVtZW50Q29sbGVjdGlvbiIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gcHJvamVjdHM7IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSk7Ci0JCQotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuc2V0TmFtZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXROYW1lKCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZTMgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VDb2xsZWN0aW9uVGFibGUzKTsKLQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUzID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUzLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJY29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX3Byb2plY3RzIiwgY29sbGVjdGlvblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJLy9hZGQgdGhlIGNvbGxlY3Rpb24gdGFibGUgYW5ub3RhdGlvbiwgdmVyaWZ5IGRlZmF1bHQgY29sbGVjdGlvbiB0YWJsZSBuYW1lIGlzIHRoZSBzYW1lCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX3Byb2plY3RzIiwgY29sbGVjdGlvblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJLy9zZXQgdGhlIGVudGl0eSBuYW1lLCB2ZXJpZnkgZGVmYXVsdCBjb2xsZWN0aW9uIHRhYmxlIG5hbWUgdXBkYXRlcwotCQlnZXRKYXZhRW50aXR5KCkuc2V0U3BlY2lmaWVkTmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vX3Byb2plY3RzIiwgY29sbGVjdGlvblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSk7Ci0JCQotCQkKLQkJLy9zZXQgc2NoZW1hIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5zZXRTY2hlbWEoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFNjaGVtYSgpKTsKLQkKLQkJLy9zZXQgc2NoZW1hIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLnNldFNjaGVtYShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5zZXRTY2hlbWEoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFNjaGVtYSgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VDb2xsZWN0aW9uVGFibGUpOwotCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQljb2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJmb28iKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFNjaGVtYSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQ29sbGVjdGlvblRhYmxlKTsKLQkJCi0JCQotCQkvL3NldCBjYXRhbG9nIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5zZXRDYXRhbG9nKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkKLQkJLy9zZXQgY2F0YWxvZyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5zZXRDYXRhbG9nKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuc2V0Q2F0YWxvZygiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldENhdGFsb2coKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQ29sbGVjdGlvblRhYmxlKTsKLQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJmb28iKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJLy9zZXQgY2F0YWxvZyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQkKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gY29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlUmVzb3VyY2UgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQkKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uMiA9IGNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4zID0gY29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW4zLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjIsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMywgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4sIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCQotCQlqb2luQ29sdW1ucyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJY29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlUmVzb3VyY2UgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCWNvbGxlY3Rpb25UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCi0JCWNvbGxlY3Rpb25UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQkKLQkJY29sbGVjdGlvblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQljb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVSZXNvdXJjZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMywgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJCi0JCWNvbGxlY3Rpb25UYWJsZS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCWNvbGxlY3Rpb25UYWJsZS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVSZXNvdXJjZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5hZGRKb2luQ29sdW1uKDApOwotCQlqb2luVGFibGVSZXNvdXJjZS5hZGRKb2luQ29sdW1uKDEpOwotCQlqb2luVGFibGVSZXNvdXJjZS5hZGRKb2luQ29sdW1uKDIpOwotCQkKLQkJam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLnNldE5hbWUoIkZPTyIpOwotCQlqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCi0JCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJam9pblRhYmxlUmVzb3VyY2UubW92ZUpvaW5Db2x1bW4oMiwgMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZVJlc291cmNlLm1vdmVKb2luQ29sdW1uKDAsIDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5yZW1vdmVKb2luQ29sdW1uKDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5yZW1vdmVKb2luQ29sdW1uKDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJam9pblRhYmxlUmVzb3VyY2UucmVtb3ZlSm9pbkNvbHVtbigwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRKb2luQ29sdW1uKCkgewotCQkvL1RPRE8KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJY29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJY29sbGVjdGlvblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImZvbyIpOwotCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCAgY29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImZvbyIpOwotCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiYmFyIik7Ci0JCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsICBjb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQotCQljb2xsZWN0aW9uVGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gam9pblRhYmxlQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQkKLQkJY29sbGVjdGlvblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IGpvaW5UYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwkJCi0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0KLQkJCi0JCWNvbGxlY3Rpb25UYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSBqb2luVGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJCi0JCWNvbGxlY3Rpb25UYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSBqb2luVGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQotCi0JCWNvbGxlY3Rpb25UYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IGpvaW5UYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCi0JCWpvaW5UYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoIkJBUiIpOwotCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZUFubm90YXRpb24ubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZUFubm90YXRpb24ubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZUFubm90YXRpb24ucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVBbm5vdGF0aW9uLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhMzUwZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2VFbnVtZXJhdGVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2VUZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW51bVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJDb2x1bW4yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlcmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5BY2Nlc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERBQkxFX1RZUEVfTkFNRSA9ICJBZGRyZXNzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBFTUJFRERBQkxFX1RZUEVfTkFNRTsKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljQmFzaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPFN0cmluZz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE5vbkdlbmVyaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uIGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxJbnRlZ2VyLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXAgYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBhYmJyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlBbmRWYWx1ZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxBZGRyZXNzLCBQcm9wZXJ0eUluZm8+IHBhcmNlbHM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbnRpdHlLZXlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8QWRkcmVzcywgUHJvcGVydHlJbmZvPiBwYXJjZWxzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlByb3BlcnR5SW5mbyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEludGVnZXIgcGFyY2VsTnVtYmVyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEludGVnZXIgc2l6ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLm1hdGguQmlnRGVjaW1hbCB0YXg7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJvcGVydHlJbmZvLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWxmUmVmZXJlbnRpYWxFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiRm9vIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDxGb28+IGVsZW1lbnRDb2xsZWN0aW9uOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkZvby5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBWZXJzaW9uTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uIGVsZW1lbnRDb2xsZWN0aW9uQW5ub3RhdGlvbiA9IChFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uQW5ub3RhdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGNsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbkFubm90YXRpb24uc2V0VGFyZ2V0Q2xhc3MoIm5ld1RhcmdldENsYXNzIik7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0Q2xhc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0Q2xhc3MiLCBlbGVtZW50Q29sbGVjdGlvbkFubm90YXRpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBjbGFzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbGVtZW50Q29sbGVjdGlvbkFubm90YXRpb24uc2V0VGFyZ2V0Q2xhc3MobnVsbCk7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uQW5ub3RhdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFRhcmdldENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoIm5ld1RhcmdldENsYXNzIik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0Q2xhc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0Q2xhc3MiLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQkKLQkJLy9zZXQgdGFyZ2V0IGNsYXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCS8vdGFyZ2V0RW50aXR5IG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCwgZGVmYXVsdCBzdGlsbCBzZXQsIGhhbmRsZWQgYnkgdmFsaWRhdGlvbgotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRUYXJnZXRDbGFzcygpKTsKLQkJCi0JCS8vYWRkIHRhcmdldEVudGl0eSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSk7Ci0KLQkJLy90ZXN0IGRlZmF1bHQgc3RpbGwgdGhlIHNhbWUgd2hlbiBzcGVjaWZpZWQgdGFyZ2V0IGVudGl0eSBpdCBzZXQKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGFkZHJlc3NDbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBhZGRyZXNzQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0KLQkJLy90ZXN0IHRhcmdldCBpcyBub3QgYW4gRW1iZWRkYWJsZSwgZGVmYXVsdCB0YXJnZXQgZW50aXR5IHN0aWxsIGV4aXN0cywgdGhpcyBjYXNlIGhhbmRsZWQgd2l0aCB2YWxpZGF0aW9uCi0JCWFkZHJlc3NQZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldENsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRhcmdldENsYXNzTm9uR2VuZXJpY0NvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOb25HZW5lcmljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRUYXJnZXRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRDbGFzc0dlbmVyaWNDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRDbGFzc05vbkdlbmVyaWNNYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldENsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRhcmdldENsYXNzR2VuZXJpY01hcCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRUYXJnZXRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRhcmdldENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRUYXJnZXRDbGFzcygpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRUYXJnZXRDbGFzcygpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRUYXJnZXRDbGFzcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVtYmVkZGFibGUgZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBtYXBwaW5nKSB7Ci0JCXJldHVybiAoRW1iZWRkYWJsZSkgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QobWFwcGluZywgImdldFJlc29sdmVkVGFyZ2V0RW1iZWRkYWJsZSIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQkvL3RhcmdldCBlbWJlZGRhYmxlIG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZykpOwotCQkKLQkJLy9hZGQgdGFyZ2V0IGVtYmVkZGFibGUgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIG5vdyB0YXJnZXQgZW1iZWRkYWJsZSBzaG91bGQgcmVzb2x2ZQotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJQ2xhc3NSZWYgYWRkcmVzc0NsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJVHlwZU1hcHBpbmcgYWRkcmVzc1R5cGVNYXBwaW5nID0gYWRkcmVzc0NsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKGFkZHJlc3NUeXBlTWFwcGluZywgdGhpcy5nZXRSZXNvbHZlZFRhcmdldEVtYmVkZGFibGUoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKSk7Ci0KLQkJLy90ZXN0IGRlZmF1bHQgc3RpbGwgdGhlIHNhbWUgd2hlbiBzcGVjaWZpZWQgdGFyZ2V0IGVudGl0eSBpdCBzZXQKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJmb28iKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldFJlc29sdmVkVGFyZ2V0RW1iZWRkYWJsZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcpKTsKLQkJCi0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscyhhZGRyZXNzVHlwZU1hcHBpbmcsIHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZykpOwotCQkKLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhhZGRyZXNzVHlwZU1hcHBpbmcsIHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlV2l0aEJhc2ljVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCS8vdGFyZ2V0IGlzIGEgYmFzaWMgdHlwZSwgc28gcmVzb2x2ZWQgdGFyZ2V0IGVtYmVkZGFibGUgaXMgbnVsbAotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuRUFHRVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkVBR0VSLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQkKLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0RmV0Y2gobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJCQkKLQkJLy9zZXQgZmV0Y2ggaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuRUFHRVIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlVHlwZUVtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGUuRU1CRUREQUJMRV9UWVBFLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVUeXBlTm9uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5vbkdlbmVyaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlLk5PX1RZUEUsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZVR5cGUoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoIkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlLkVNQkVEREFCTEVfVFlQRSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlVHlwZUJhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuVHlwZS5CQVNJQ19UWVBFLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXkgPSAoTWFwS2V5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBLZXkpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFwS2V5LnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYXBLZXkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hcEtleS5zZXROYW1lKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hcEtleS5nZXROYW1lKCkpOwotCQkKLQkJbWFwS2V5LnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJteU1hcEtleSIpOwotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleUFubm90YXRpb24gPSAoTWFwS2V5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYXBLZXlBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJbWFwS2V5QW5ub3RhdGlvbiA9IChNYXBLZXlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG1hcEtleUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldE5vTWFwS2V5KHRydWUpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gCi0JCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygiQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoIlN0cmluZyIpOwotCQltYXBLZXlOYW1lcyA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlNYXBLZXlDbGFzczJfMEFubm90YXRpb24gbWFwS2V5Q2xhc3MgPSAoTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwobWFwS2V5Q2xhc3MpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFwS2V5Q2xhc3Muc2V0VmFsdWUoIm15TWFwS2V5Q2xhc3MiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleUNsYXNzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Q2xhc3MiLCBtYXBLZXlDbGFzcy5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hcEtleUNsYXNzLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXlDbGFzcy5nZXRWYWx1ZSgpKTsKLQkJCi0JCW1hcEtleUNsYXNzLnNldFZhbHVlKCJteU1hcEtleUNsYXNzIik7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiU3RyaW5nIik7Ci0JCU1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbiBtYXBLZXlDbGFzcyA9IChNYXBLZXlDbGFzczJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgbWFwS2V5Q2xhc3MuZ2V0VmFsdWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0KLQkJLy90ZXN0IGRlZmF1bHQgc3RpbGwgdGhlIHNhbWUgd2hlbiBzcGVjaWZpZWQgdGFyZ2V0IGVudGl0eSBpdCBzZXQKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TWFwS2V5Q2xhc3NDb2xsZWN0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPcmRlckNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlPcmRlcmFibGUyXzAgb3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCQotCQlvcmRlcmFibGUuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJT3JkZXJDb2x1bW4yXzAgb3JkZXJDb2x1bW4gPSBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19PUkRFUiIsIG9yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCW9yZGVyQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2lkIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIHJlc291cmNlRmllbGQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArIl9hZGRyZXNzZXMiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGNpdHlNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZW1iZWRkYWJsZS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJjaXR5IikuZ2V0TWFwcGluZygpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIHJlc291cmNlRmllbGQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUobnVsbCk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX2FkZHJlc3NlcyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJjaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJjaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJjaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgic3RhdGUubmFtZSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRV8gKyAiU3RhdGUiKTsKLQkJCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPD8gZXh0ZW5kcyBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMSwgMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJRW1iZWRkZWRNYXBwaW5nIG5lc3RlZEVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgic3RhdGUiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbmVzdGVkRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygyLCBuZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFiYnIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCVBlcnNpc3RlbnRUeXBlIHN0YXRlUGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlCYXNpY01hcHBpbmcgYWJick1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBzdGF0ZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhYmJyIikuZ2V0TWFwcGluZygpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIIik7Ci0JCWFiYnJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFIik7Ci0JCWFiYnJNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCWFiYnJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFiYnJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYWJick1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWFiYnJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJYWJick1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCWFiYnJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0KLQkJLy9jaGVjayB0aGUgbmVzdGVkIGVtYmVkZGVkIChBZGRyZXNzLnN0YXRlKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IGl0IGlzIGdldHRpbmcgc2V0dGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvbiBTdGF0ZS5hYmJyCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9ICgoRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInN0YXRlIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlTmFtZWQoImFiYnIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYmJyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5Q29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOy8vY29sbGVjdGlvbiB0YWJsZSBuYW1lCi0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfQ09MTEVDVElPTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NPTExFQ1RJT05fVEFCTEUiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQkJY29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5QW5kVmFsdWVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgidmFsdWUuQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CTEFIIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5QW5kVmFsdWVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbHMiLCByZXNvdXJjZUZpZWxkLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyJfcGFyY2VscyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlFbWJlZGRhYmxlIGFkZHJlc3NFbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGNpdHlNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgYWRkcmVzc0VtYmVkZGFibGUuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiY2l0eSIpLmdldE1hcHBpbmcoKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxzIiwgcmVzb3VyY2VGaWVsZC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShudWxsKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyJfcGFyY2VscyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJrZXkuY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyJfcGFyY2VscyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQljbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlFbWJlZGRhYmxlIHByb3BlcnR5SW5mb0VtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgcGFyY2VsTnVtYmVyTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHByb3BlcnR5SW5mb0VtYmVkZGFibGUuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VsTnVtYmVyIikuZ2V0TWFwcGluZygpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTzEiKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSMSIpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYxIik7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQkJCi0JCWFzc2VydEVxdWFscygicGFyY2VscyIsIHJlc291cmNlRmllbGQuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTzEiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIxIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYxIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUobnVsbCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG51bGwpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShudWxsKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShudWxsKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKG51bGwpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKG51bGwpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyJfcGFyY2VscyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlhbm5vdGF0aW9uID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhbm5vdGF0aW9uLnNldE5hbWUoInZhbHVlLnBhcmNlbE51bWJlciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleUFuZFZhbHVlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CQVIiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInZhbHVlLkZPTzIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5QW5kVmFsdWVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CQVIiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInZhbHVlLkZPTzIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDUsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleUFuZFZhbHVlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCi0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LmNpdHkiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInZhbHVlLnBhcmNlbE51bWJlciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuc3RhdGUubmFtZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgic2l6ZSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5QW5kVmFsdWVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUVfICsgIlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUVfICsgIlN0YXRlIik7Ci0JCQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgdmFsdWVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCXZhbHVlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQltYXBLZXlPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCXZhbHVlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQltYXBLZXlPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IG92ZXJyaWRlQW5ub3RhdGlvbnMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInZhbHVlLnBhcmNlbE51bWJlciIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBvdmVycmlkZUFubm90YXRpb25zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBvdmVycmlkZUFubm90YXRpb25zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5zaXplIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIG92ZXJyaWRlQW5ub3RhdGlvbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5zdGF0ZS5uYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIG92ZXJyaWRlQW5ub3RhdGlvbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkZUFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCQotCQl2YWx1ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJbWFwS2V5T3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlvdmVycmlkZUFubm90YXRpb25zID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLnNpemUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgb3ZlcnJpZGVBbm5vdGF0aW9ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygia2V5LnN0YXRlLm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgb3ZlcnJpZGVBbm5vdGF0aW9ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRlQW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgdmFsdWVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHZhbHVlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbWFwS2V5T3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQl2YWx1ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJbWFwS2V5T3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlvdmVycmlkZUFubm90YXRpb25zID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkZUFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjw/IGV4dGVuZHMgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gdmFsdWVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxOdW1iZXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInNpemUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInRheCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB2YWx1ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlTW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleUFuZFZhbHVlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCXZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZE92ZXJyaWRlcyA9IHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxOdW1iZXIiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic2l6ZSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlzcGVjaWZpZWRPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMSwgMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gb3ZlcnJpZGVBbm5vdGF0aW9ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRFcXVhbHMoInZhbHVlLnNpemUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgb3ZlcnJpZGVBbm5vdGF0aW9ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUucGFyY2VsTnVtYmVyIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIG92ZXJyaWRlQW5ub3RhdGlvbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5jaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIG92ZXJyaWRlQW5ub3RhdGlvbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5zdGF0ZS5uYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIG92ZXJyaWRlQW5ub3RhdGlvbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkZUFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCQotCQlzcGVjaWZpZWRPdmVycmlkZXMgPSB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygic2l6ZSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxOdW1iZXIiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMywgMiwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJb3ZlcnJpZGVBbm5vdGF0aW9ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRFcXVhbHMoInZhbHVlLnNpemUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgb3ZlcnJpZGVBbm5vdGF0aW9ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUucGFyY2VsTnVtYmVyIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIG92ZXJyaWRlQW5ub3RhdGlvbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5zdGF0ZS5uYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIG92ZXJyaWRlQW5ub3RhdGlvbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5jaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIG92ZXJyaWRlQW5ub3RhdGlvbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkZUFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCQotCQlzcGVjaWZpZWRPdmVycmlkZXMgPSB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygic2l6ZSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxOdW1iZXIiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZWxmUmVmZXJlbnRpYWxFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVTZWxmUmVmZXJlbnRpYWxFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkZvbyIpOwotCQkKLQkJLy9JZiB0aGVyZSBpcyBhIFN0YWNrT3ZlcmZsb3dFcnJvciB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBnZXQgdGhlIG1hcHBpbmcKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImVsZW1lbnRDb2xsZWN0aW9uIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nTmFtZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE1hcEtleUVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIuY2xhc3MpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24gZW51bWVyYXRlZCA9IChNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGVudW1lcmF0ZWQpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZW51bWVyYXRlZC5nZXRWYWx1ZSgpKTsKLQkJCi0JCSgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkRW51bVR5cGUoRW51bVR5cGUuU1RSSU5HKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlLlNUUklORywgZW51bWVyYXRlZC5nZXRWYWx1ZSgpKTsKLQkJCi0JCSgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkRW51bVR5cGUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGVudW1lcmF0ZWQuZ2V0VmFsdWUoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE1hcEtleUVudW1lcmF0ZWRVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uIGVudW1lcmF0ZWQgPSAoTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQllbnVtZXJhdGVkLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlLlNUUklORyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJCi0JCWVudW1lcmF0ZWQuc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCgoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRTYW1lKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBLZXlUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uIHRlbXBvcmFsID0gKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh0ZW1wb3JhbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0ZW1wb3JhbC5nZXRWYWx1ZSgpKTsKLQkJCi0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcEtleVRlbXBvcmFsVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24gdGVtcG9yYWwgPSAoTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXRlbXBvcmFsLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5USU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJCi0JCXRlbXBvcmFsLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKCgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBKb2luQ29sdW1uPiBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucyA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0KLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlqb2luQ29sdW1uID0gKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQotCQlqb2luQ29sdW1uID0gKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucyA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0KLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlKb2luQ29sdW1uc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbnRpdHlLZXlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygxLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0KLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gam9pbkNvbHVtbnNJdGVyYXRvciA9IAotCQkJcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqb2luQ29sdW1uc0l0ZXJhdG9yID0gCi0JCQlyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKSk7Ci0KLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMSk7Ci0KLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqb2luQ29sdW1uUmVzb3VyY2VzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGpvaW5Db2x1bW5SZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJSXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zSXRlcmF0b3IgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtblJlc291cmNlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uUmVzb3VyY2VzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFKb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhSm9pbkNvbHVtbnMpKTsKLQotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5tb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJamF2YUpvaW5Db2x1bW5zID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5tb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWphdmFKb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCSgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikpLnNldE5hbWUoIkZPTyIpOwotCQkoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMSwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pKS5zZXROYW1lKCJCQVIiKTsKLQkJKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDIsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKSkuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gam9pbkNvbHVtbnNJdGVyYXRvciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDIsIDAsIE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMCwgMSwgTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleUpvaW5Db2x1bW5Jc0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbnRpdHlLZXlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydFRydWUoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRNYXBLZXlKb2luQ29sdW1uKCkuaXNWaXJ0dWFsKCkpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlKb2luQ29sdW1uIHNwZWNpZmllZEpvaW5Db2x1bW4gPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbi5pc1ZpcnR1YWwoKSk7Ci0KLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUpvaW5Db2x1bW4oKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW1iZWRkZWRJZE1hcHBpbmcyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW1iZWRkZWRJZE1hcHBpbmcyXzBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDZiYTFmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVtYmVkZGVkSWRNYXBwaW5nMl8wVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLk1hcHBpbmdLZXlzMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQWNjZXNzMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFFbWJlZGRlZElkTWFwcGluZzJfMFRlc3RzIGV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERBQkxFX1RZUEVfTkFNRSA9ICJNeUVtYmVkZGFibGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIEVNQkVEREFCTEVfVFlQRV9OQU1FOwotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuRU1CRURERURfSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGVkSWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgRU1CRUREQUJMRV9UWVBFX05BTUUgKyIgbXlFbWJlZGRlZElkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVtYmVkZGFibGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZChFTUJFRERBQkxFX1RZUEVfTkFNRSkuYXBwZW5kKCIgeyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgRU1CRUREQUJMRV9UWVBFX05BTUUgKyAiLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQotCXB1YmxpYyBHZW5lcmljSmF2YUVtYmVkZGVkSWRNYXBwaW5nMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZSgoKEphdmFFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0RW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZyk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVtYmVkZGVkTWFwcGluZzJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbWJlZGRlZE1hcHBpbmcyXzBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmQ1ZmYxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVtYmVkZGVkTWFwcGluZzJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5WaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5BY2Nlc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUVtYmVkZGVkTWFwcGluZzJfMFRlc3RzIGV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERBQkxFX1RZUEVfTkFNRSA9ICJNeUVtYmVkZGFibGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIEVNQkVEREFCTEVfVFlQRV9OQU1FOwotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuRU1CRURERUQsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBFTUJFRERBQkxFX1RZUEVfTkFNRSArICIgbXlFbWJlZGRlZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbWJlZGRhYmxlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk9ORV9UT19PTkUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuT05FX1RPX01BTlkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoRU1CRUREQUJMRV9UWVBFX05BTUUpLmFwcGVuZCgiIHsiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCBFTUJFRERBQkxFX1RZUEVfTkFNRSArICIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVBZGRyZXNzRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgQWRkcmVzcyB7Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlDdXN0b21lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkN1c3RvbWVyIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJDdXN0b21lci5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHN0cmVldDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBaaXBDb2RlIHppcENvZGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJaaXBDb2RlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgcGx1c2ZvdXI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJaaXBDb2RlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyBHZW5lcmljSmF2YUVtYmVkZGVkTWFwcGluZzJfMFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIik7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpOwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUoKChKYXZhRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0RW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKTsKLQkJSmF2YUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZyk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRFbWJlZGRlZE1hcHBpbmdHZW5lcmljRW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEdlbmVyaWNFbWJlZGRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuRW50aXR5MSIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkVtYmVkZGFibGUxIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRhYmxlIik7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdEVtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzIEVudGl0eTEgeyAiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHJpdmF0ZSBFbWJlZGRhYmxlMTxJbnRlZ2VyPiBteUVtYmVkZGFibGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJFbnRpdHkxLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEdlbmVyaWNFbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyBFbWJlZGRhYmxlMTxUPiB7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkVtYmVkZGFibGUxLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWxmUmVmZXJlbnRpYWxFbWJlZGRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJGb28iKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEZvbyBlbWJlZGRlZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJGb28uamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIik7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpOwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpOwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIik7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpOwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpOwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIik7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpOwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKTsKLQkJSmF2YUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUVtYmVkZGVkIiwgcmVzb3VyY2VGaWVsZC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGNpdHlNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZW1iZWRkYWJsZS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJjaXR5IikuZ2V0TWFwcGluZygpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm15RW1iZWRkZWQiLCByZXNvdXJjZUZpZWxkLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24obnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKG51bGwpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhbm5vdGF0aW9uLnNldE5hbWUoImNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJzdGF0ZSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCUphdmFFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFKS5pdGVyYXRvcigpOwotCi0JCWFzc2VydEVxdWFscygic3RhdGUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gKChWaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcCkgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJVmlydHVhbEpvaW5Db2x1bW4gdmlydHVhbEpvaW5Db2x1bW4gPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhRW1iZWRkYWJsZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgamF2YUVtYmVkZGFibGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fQ09MVU1OIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIk1ZX1JFRkVSRU5DRV9DT0xVTU4iKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJam9pbmluZ1N0cmF0ZWd5ID0gKChWaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcCkgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXZpcnR1YWxKb2luQ29sdW1uID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1JFRkVSRU5DRV9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc051bGxhYmxlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX0NPTFVNTiIsIGpvaW5pbmdTdHJhdGVneS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJSmF2YUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFubm90YXRpb24uc2V0TmFtZSgiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJSmF2YUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlMaXN0SXRlcmF0b3I8SmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKS5pdGVyYXRvcigpKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCUl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0KLQkJCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcykpOwotCQkKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgxLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQotCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMCwgMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCSgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpKS5zZXROYW1lKCJGT08iKTsKLQkJKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkpLnNldE5hbWUoIkJBUiIpOwotCQkoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMiwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKSkuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigyLCAwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDAsIDEsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigxLCAgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDEsICBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsICBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSXNWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUxpc3RJdGVyYXRvcjxKYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkKLQkJUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0KLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKSwgMSk7Ci0JCVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSAoKFZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCkgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCk7Ci0JCVZpcnR1YWxKb2luVGFibGUgam9pblRhYmxlID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlX0FkZHJlc3MiLCBqb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCVZpcnR1YWxKb2luQ29sdW1uIHZpcnR1YWxKb2luQ29sdW1uID0gam9pblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlX2lkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZV9BZGRyZXNzIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc051bGxhYmxlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQlWaXJ0dWFsSm9pbkNvbHVtbiB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4gPSBqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX2lkIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlX0FkZHJlc3MiLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhRW1iZWRkYWJsZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgamF2YUVtYmVkZGFibGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pblRhYmxlU3RyYXRlZ3kgPSBvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCk7Ci0JCWpvaW5UYWJsZVN0cmF0ZWd5LmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pblRhYmxlU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX0NPTFVNTiIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJNWV9SRUZFUkVOQ0VfQ09MVU1OIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBqb2luVGFibGVTdHJhdGVneS5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiTVlfSU5WRVJTRV9KT0lOX0NPTFVNTiIpOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiTVlfSU5WRVJTRV9SRUZFUkVOQ0VfQ09MVU1OIik7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJJTlZFUlNFX0JBUiIpOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJJTlZFUlNFX0NPTFVNTl9ERUYiKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gQ29sbGVjdGlvblRvb2xzLmdldChvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCksIDEpOwotCQlqb2luaW5nU3RyYXRlZ3kgPSAoKFZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCkgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCk7Ci0JCWpvaW5UYWJsZSA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJdmlydHVhbEpvaW5Db2x1bW4gPSBqb2luVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX0NPTFVNTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfUkVGRVJFTkNFX0NPTFVNTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxKb2luQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxKb2luQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlLmdldEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCXZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbiA9IGpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9JTlZFUlNFX0pPSU5fQ09MVU1OIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfSU5WRVJTRV9SRUZFUkVOQ0VfQ09MVU1OIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIklOVkVSU0VfQkFSIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIklOVkVSU0VfQ09MVU1OX0RFRiIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5pc051bGxhYmxlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlQZXJzaXN0ZW50VHlwZSBjdXN0b21lclBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZykgY3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdHJlZXQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXBDb2RlLnppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0KLQkJCi0JCVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmcgbmVzdGVkRW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbmVzdGVkRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygyLCBuZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCVBlcnNpc3RlbnRUeXBlIHppcENvZGVQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUJhc2ljTWFwcGluZyBwbHVzRm91ck1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSB6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikuZ2V0TWFwcGluZygpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEUiKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCi0JCS8vY2hlY2sgdGhlIG5lc3RlZCBlbWJlZGRlZCAoQWRkcmVzcy56aXBDb2RlKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IGl0IGlzIGdldHRpbmcgc2V0dGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvbiBaaXBjb2RlLnBsdXNmb3VyCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpICgoSmF2YUVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlTmFtZWQoInBsdXNmb3VyIik7Ci0JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCS8vY2hlY2sgdGhlIHRvcC1sZXZlbCBlbWJlZGRlZCAoQ3VzdG9tZXIuYWRkcmVzcykgYXR0cmlidXRlIG92ZXJyaWRlIHRvIHZlcmlmeSBpdCBpcyBnZXR0aW5nIHNldHRpbmdzIGZyb20gdGhlIHNwZWNpZmllZCBjb2x1bW4gb24gWmlwY29kZS5wbHVzZm91cgotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSAoKEphdmFFbWJlZGRlZE1hcHBpbmcpIGN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0T3ZlcnJpZGVOYW1lZCgiemlwQ29kZS5wbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoInppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJLy9zZXQgYW4gYXR0cmlidXRlIG92ZXJyaWRlIG9uIEFkZHJlc3MuemlwQ29kZSBlbWJlZGRlZCBtYXBwaW5nCi0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gKChWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpICgoSmF2YUVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlTmFtZWQoInBsdXNmb3VyIikpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIik7Ci0JCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpICgoSmF2YUVtYmVkZGVkTWFwcGluZykgY3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRPdmVycmlkZU5hbWVkKCJ6aXBDb2RlLnBsdXNmb3VyIik7Ci0JCWFzc2VydEVxdWFscygiemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwQ29kZS5wbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCS8vVE9ETyBJIGhhdmUgdGhlIGRlZmF1bHQgd3JvbmcgaW4gdGhpcyBjYXNlLCBidXQgdGhpcyB3YXMgd3JvbmcgYmVmb3JlIGFzIHdlbGwuICBOZWVkIHRvIGZpeCB0aGlzIGxhdGVyCi0vLwkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQ3VzdG9tZXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEVfT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VsZlJlZmVyZW50aWFsRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVNlbGZSZWZlcmVudGlhbEVtYmVkZGVkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuRm9vIik7Ci0JCQotCQkvL0lmIHRoZXJlIGlzIGEgU3RhY2tPdmVyZmxvd0Vycm9yIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGdldCB0aGUgbWFwcGluZwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnRpdHkyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW50aXR5Ml8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4ZDE2Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnRpdHkyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLk1hcHBpbmdLZXlzMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTG9ja01vZGVUeXBlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTmFtZWRRdWVyeTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkNhY2hlYWJsZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUVudGl0eTJfMFRlc3RzIGV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCX1RZUEVfTkFNRSA9ICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBTVUJfVFlQRV9OQU1FOwotCQotCQotCXB1YmxpYyBHZW5lcmljSmF2YUVudGl0eTJfMFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEpQQS5PTkVfVE9fT05FLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5PTkVfVE9fTUFOWSwgSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JTkhFUklUQU5DRSwgSlBBLklOSEVSSVRBTkNFX1RZUEUsIEpQQS5PTkVfVE9fT05FLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5PTkVfVE9fTUFOWSwgSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJASW5oZXJpdGFuY2Uoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUykiKTsKLQkJCQlzYi5hcHBlbmQoImFic3RyYWN0Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgicHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQ3VzdG9tZXIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJDdXN0b21lci5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXJXaXRoRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQ3VzdG9tZXIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQ3VzdG9tZXIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkxvbmdUaW1lQ3VzdG9tZXIgZXh0ZW5kcyBDdXN0b21lciAiKTsKLQkJCQlzYi5hcHBlbmQoInt9Iik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiTG9uZ1RpbWVDdXN0b21lci5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuT05FX1RPX09ORSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdHJlZXQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFppcENvZGUgemlwQ29kZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiWmlwQ29kZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHBsdXNmb3VyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiWmlwQ29kZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhBc3NvY2lhdGlvbk92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkpPSU5fVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCJhXCIsIGpvaW5UYWJsZT1ASm9pblRhYmxlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwcml2YXRlIExvY2tNb2RlVHlwZTJfMCBsb2NrTW9kZU9mKE5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uIHJlc291cmNlUXVlcnkpIHsKLQkJcmV0dXJuIHJlc291cmNlUXVlcnkgPT0gbnVsbCA/IG51bGwgOiBMb2NrTW9kZVR5cGUyXzAuZnJvbUphdmFSZXNvdXJjZU1vZGVsKHJlc291cmNlUXVlcnkuZ2V0TG9ja01vZGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGROYW1lZFF1ZXJ5Ml8wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlKYXZhRW50aXR5IGVudGl0eSA9IHRoaXMuZ2V0SmF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlOYW1lZFF1ZXJ5Ml8wIG5hbWVkUXVlcnkxID0gKE5hbWVkUXVlcnkyXzApIGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7Ci0JCQluYW1lZFF1ZXJ5MS5zZXROYW1lKCJGT08iKTsKLQkJCW5hbWVkUXVlcnkxLnNldFNwZWNpZmllZExvY2tNb2RlKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YU5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuTkFNRURfUVVFUlkpLml0ZXJhdG9yKCk7Ci0JCU5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uIHF1ZXJ5QW5ub3RhdGlvbiA9IChOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHF1ZXJ5QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDLCB0aGlzLmxvY2tNb2RlT2YocXVlcnlBbm5vdGF0aW9uKSk7Ci0KLQkJTmFtZWRRdWVyeTJfMCBuYW1lZFF1ZXJ5MiA9IChOYW1lZFF1ZXJ5Ml8wKSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwotCQkJbmFtZWRRdWVyeTIuc2V0TmFtZSgiQkFSIik7Ci0JCQluYW1lZFF1ZXJ5Mi5zZXRTcGVjaWZpZWRMb2NrTW9kZShMb2NrTW9kZVR5cGUyXzAuUkVBRCk7Ci0JCQotCQlqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5OQU1FRF9RVUVSWSkuaXRlcmF0b3IoKTsKLQkJcXVlcnlBbm5vdGF0aW9uID0gKE5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygiQkFSIiwgcXVlcnlBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoTG9ja01vZGVUeXBlMl8wLlJFQUQsIHRoaXMubG9ja01vZGVPZihxdWVyeUFubm90YXRpb24pKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU5hbWVkUXVlcnkyXzAgbmFtZWRRdWVyeTMgPSAoTmFtZWRRdWVyeTJfMCkgZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgxKTsKLQkJCW5hbWVkUXVlcnkzLnNldE5hbWUoIkJBWiIpOwotCQkJbmFtZWRRdWVyeTMuc2V0U3BlY2lmaWVkTG9ja01vZGUoTG9ja01vZGVUeXBlMl8wLldSSVRFKTsKLQkJCi0JCWphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLk5BTUVEX1FVRVJZKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTmFtZWRRdWVyeTJfMEFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlxdWVyeUFubm90YXRpb24gPSAoTmFtZWRRdWVyeTJfMEFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBxdWVyeUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuV1JJVEUsIHRoaXMubG9ja01vZGVPZihxdWVyeUFubm90YXRpb24pKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVkUXVlcnkyLCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVkUXVlcnkzLCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVkUXVlcnkxLCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKLQkJCi0JCW5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCQotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApLnNldE5hbWUoImZvbyIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTmFtZWRRdWVyeTJfMCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0KLQkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKS5zZXROYW1lKCJGT08iKTsKLQkJTmFtZWRRdWVyeTJfMCBuYW1lZFF1ZXJ5MSA9IChOYW1lZFF1ZXJ5Ml8wKSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDEpOwotCQkJbmFtZWRRdWVyeTEuc2V0TmFtZSgiQkFSIik7Ci0JCQluYW1lZFF1ZXJ5MS5zZXRTcGVjaWZpZWRMb2NrTW9kZShMb2NrTW9kZVR5cGUyXzAuUkVBRCk7Ci0JCQotCQlOYW1lZFF1ZXJ5Ml8wIG5hbWVkUXVlcnkyID0gKE5hbWVkUXVlcnkyXzApIGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMik7Ci0JCQluYW1lZFF1ZXJ5Mi5zZXROYW1lKCJCQVoiKTsKLQkJCW5hbWVkUXVlcnkyLnNldFNwZWNpZmllZExvY2tNb2RlKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YU5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuTkFNRURfUVVFUlkpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhTmFtZWRRdWVyaWVzKSk7Ci0JCQotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5yZW1vdmVOYW1lZFF1ZXJ5KDApOwotCQlqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5OQU1FRF9RVUVSWSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFOYW1lZFF1ZXJpZXMpKTsKLQkJamF2YU5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuTkFNRURfUVVFUlkpLml0ZXJhdG9yKCk7Ci0JCU5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uIGFubm90YXRpb24xID0gKE5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygiQkFSIiwgYW5ub3RhdGlvbjEuZ2V0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuUkVBRCwgdGhpcy5sb2NrTW9kZU9mKGFubm90YXRpb24xKSk7Ci0JCQotCQlOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uMiA9IChOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFubm90YXRpb24yLmdldE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoTG9ja01vZGVUeXBlMl8wLk9QVElNSVNUSUMsIHRoaXMubG9ja01vZGVPZihhbm5vdGF0aW9uMikpOwotCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkUXVlcnkoMCk7Ci0JCWphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLk5BTUVEX1FVRVJZKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwotCQlqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5OQU1FRF9RVUVSWSkuaXRlcmF0b3IoKTsKLQkJYW5ub3RhdGlvbjIgPSAoTmFtZWRRdWVyeTJfMEFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhbm5vdGF0aW9uMi5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDLCB0aGlzLmxvY2tNb2RlT2YoYW5ub3RhdGlvbjIpKTsKLQkJCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkUXVlcnkoMCk7Ci0JCWphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLk5BTUVEX1FVRVJZKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTmFtZWRRdWVyeTJfMCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0KLQkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKS5zZXROYW1lKCJGT08iKTsKLQkJTmFtZWRRdWVyeTJfMCBuYW1lZFF1ZXJ5MSA9IChOYW1lZFF1ZXJ5Ml8wKSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDEpOwotCQkJbmFtZWRRdWVyeTEuc2V0TmFtZSgiQkFSIik7Ci0JCQluYW1lZFF1ZXJ5MS5zZXRTcGVjaWZpZWRMb2NrTW9kZShMb2NrTW9kZVR5cGUyXzAuT1BUSU1JU1RJQyk7Ci0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLk5BTUVEX1FVRVJZKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwotCQkKLQkJCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm1vdmVOYW1lZFF1ZXJ5KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8SmF2YU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCW5hbWVkUXVlcnkxID0gKE5hbWVkUXVlcnkyXzApIG5hbWVkUXVlcmllcy5uZXh0KCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkxLmdldE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoTG9ja01vZGVUeXBlMl8wLk9QVElNSVNUSUMsIG5hbWVkUXVlcnkxLmdldExvY2tNb2RlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJamF2YU5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuTkFNRURfUVVFUlkpLml0ZXJhdG9yKCk7Ci0JCU5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uIGFubm90YXRpb24xID0gKE5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygiQkFSIiwgYW5ub3RhdGlvbjEuZ2V0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuT1BUSU1JU1RJQywgdGhpcy5sb2NrTW9kZU9mKGFubm90YXRpb24xKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5tb3ZlTmFtZWRRdWVyeSgwLCAxKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCW5hbWVkUXVlcnkxID0gKE5hbWVkUXVlcnkyXzApIG5hbWVkUXVlcmllcy5uZXh0KCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkxLmdldE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoTG9ja01vZGVUeXBlMl8wLk9QVElNSVNUSUMsIG5hbWVkUXVlcnkxLmdldExvY2tNb2RlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5OQU1FRF9RVUVSWSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYW5ub3RhdGlvbjEgPSAoTmFtZWRRdWVyeTJfMEFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhbm5vdGF0aW9uMS5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDLCB0aGlzLmxvY2tNb2RlT2YoYW5ub3RhdGlvbjEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWVkUXVlcmllczJfMCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCQkKLQkJKChOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKSkuc2V0TmFtZSgiRk9PIik7Ci0JCSgoTmFtZWRRdWVyeTJfMEFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5OQU1FRF9RVUVSWSkpLnNldE5hbWUoIkJBUiIpOwotCQlOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uMSA9IChOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJCWFubm90YXRpb24xLnNldE5hbWUoIkJBWiIpOwotCQkJYW5ub3RhdGlvbjEuc2V0TG9ja01vZGUob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5Mb2NrTW9kZVR5cGVfMl8wLk9QVElNSVNUSUMpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCU5hbWVkUXVlcnkyXzAgbmFtZWRRdWVyeTEgPSAoTmFtZWRRdWVyeTJfMCkgbmFtZWRRdWVyaWVzLm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeTEuZ2V0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuT1BUSU1JU1RJQywgbmFtZWRRdWVyeTEuZ2V0TG9ja01vZGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigyLCAwLCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJbmFtZWRRdWVyeTEgPSAoTmFtZWRRdWVyeTJfMCkgbmFtZWRRdWVyaWVzLm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeTEuZ2V0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuT1BUSU1JU1RJQywgbmFtZWRRdWVyeTEuZ2V0TG9ja01vZGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMCwgMSwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCW5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQluYW1lZFF1ZXJ5MSA9IChOYW1lZFF1ZXJ5Ml8wKSBuYW1lZFF1ZXJpZXMubmV4dCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5MS5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDLCBuYW1lZFF1ZXJ5MS5nZXRMb2NrTW9kZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBlbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCAgSlBBLk5BTUVEX1FVRVJZKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCW5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZWRRdWVyaWVzMl8wU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCi0JCWFzc2VydEVxdWFscygwLCBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXNTaXplKCkpOwotCi0JCSgoTmFtZWRRdWVyeTJfMEFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKE5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuTkFNRURfUVVFUlkpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMiwgSlBBLk5BTUVEX1FVRVJZKSkuc2V0TmFtZSgiQkFaIik7Ci0KLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCQkKLQkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IGdldEphdmFFbnRpdHkoKS5nZXRPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCQkKLQkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IGdldEphdmFFbnRpdHkoKS5nZXRPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGdldEphdmFFbnRpdHkoKS5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXNUYWJsZVBlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YUVudGl0eSBhYnN0cmFjdEVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gYWJzdHJhY3RFbnRpdHkuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbnNUYWJsZVBlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IGdldEphdmFFbnRpdHkoKS5nZXRBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YUVudGl0eSBhYnN0cmFjdEVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBhYnN0cmFjdEVudGl0eS5nZXRBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXNNYXBwZWRTdXBlcmNsYXNzSW5Pcm1YbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IGdldEphdmFFbnRpdHkoKS5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBqYXZhRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0KLQkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBpZE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgcmVzb3VyY2VUeXBlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzRW50aXR5SGllcmFjaHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBqYXZhRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0KLQkJSmF2YUVudGl0eSBzdXBlcmNsYXNzID0gKEphdmFFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBpZE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBzdXBlcmNsYXNzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgcmVzb3VyY2VUeXBlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFubm90YXRpb24uc2V0TmFtZSgiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkJCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKSkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjw/IGV4dGVuZHMgQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0KLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhQXR0cmlidXRlT3ZlcnJpZGVzKSk7Ci0JCQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQotCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JfQotLy8JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQotCQkoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSkpLnNldE5hbWUoIkJBUiIpOwotCQkoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMiwgSlBBLkFUVFJJQlVURV9PVkVSUklERSkpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigyLCAwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMCwgMSwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlSXNWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCi0JCUphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gZ2V0SmF2YUVudGl0eSgpLmdldE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gZ2V0SmF2YUVudGl0eSgpLmdldE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLS8vCS8vVE9ETyBhZGQgYWxsIG1hcHBpbmcgdHlwZXMgdG8gdGhlIG1hcHBlZCBzdXBlcmNsYXNzIHRvIHRlc3Qgd2hpY2ggb25lcyBhcmUgb3ZlcnJpZGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zTWFwcGVkU3VwZXJjbGFzc0luT3JtWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEFzc29jaWF0aW9uT3ZlcnJpZGU+IHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGphdmFFbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgcmVzb3VyY2VUeXBlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0KLQkJLy9NYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkvL0Jhc2ljTWFwcGluZyBpZE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLnBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0vLwkJLy9UT0RPIGpvaW5Db2x1bW5zIGZvciBkZWZhdWx0IGFzc29jaWF0aW9uIG92ZXJyaWRlcwotLy8vLwlJSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IGRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwkKLS8vLy8KLS8vLy8JSU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChJTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotLy8vLwkKLS8vLy8JSU9uZVRvT25lTWFwcGluZyBhZGRyZXNzTWFwcGluZyA9IChJT25lVG9PbmVNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLnBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0vLy8vCUlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBhZGRyZXNzTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJCQVIiKTsKLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFaIik7Ci0vLy8vCQotLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgcmVzb3VyY2VUeXBlLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZS5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8JYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlcy5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8KLS8vLy8JYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKLS8vLy8JZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkJBWiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0vLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwotLy8vLwlkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwkKLS8vLy8JamF2YUVudGl0eS5hZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDApLnNldE5hbWUoImFkZHJlc3MiKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhbm5vdGF0aW9uLnNldE5hbWUoImJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpLml0ZXJhdG9yKCkpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCUl0ZXJhdG9yPD8gZXh0ZW5kcyBBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcykpOwotCQkKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgxLCAwKTsKLQkJSXRlcmF0b3I8PyBleHRlbmRzIEFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQotCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgwLCAxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQotCQkoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpKS5zZXROYW1lKCJGT08iKTsKLQkJKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKSkuc2V0TmFtZSgiQkFSIik7Ci0JCSgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDIsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigyLCAwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMCwgMSwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVJc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQotCQlKYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0IiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7Ci0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKTsKLQkJUGVyc2lzdGVudFR5cGUgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsJCQotCQlQZXJzaXN0ZW50VHlwZSB6aXBDb2RlUGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChFbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Muc3RyZWV0IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUuemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxvbmdUaW1lQ3VzdG9tZXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQkKLQkJQmFzaWNNYXBwaW5nIHBsdXNGb3VyTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHppcENvZGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicGx1c2ZvdXIiKS5nZXRNYXBwaW5nKCk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRSIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJLy9jaGVjayB0aGUgdG9wLWxldmVsIGVtYmVkZGVkIChDdXN0b21lci5hZGRyZXNzKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IGl0IGlzIGdldHRpbmcgc2V0dGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvbiBaaXBjb2RlLnBsdXNmb3VyCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlTmFtZWQoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkvL3NldCBhbiBhdHRyaWJ1dGUgb3ZlcnJpZGUgb24gQWRkcmVzcy56aXBDb2RlIGVtYmVkZGVkIG1hcHBpbmcKLQkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSAoKFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgKChFbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRPdmVycmlkZU5hbWVkKCJwbHVzZm91ciIpKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSF9PVkVSUklERSIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRV9PVkVSUklERSIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVOYW1lZCgiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEVfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkvL1RPRE8gSSBoYXZlIHRoZSBkZWZhdWx0IHdyb25nIGluIHRoaXMgY2FzZSwgYnV0IHRoaXMgd2FzIHdyb25nIGJlZm9yZSBhcyB3ZWxsLiAgTmVlZCB0byBmaXggdGhpcyBsYXRlcgotLy8JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkN1c3RvbWVyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcldpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQljcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7Ci0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKTsKLQkJUGVyc2lzdGVudFR5cGUgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsJCQotCQlQZXJzaXN0ZW50VHlwZSB6aXBDb2RlUGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg2LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdHJlZXQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5jaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS56aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMb25nVGltZUN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCQotCQlCYXNpY01hcHBpbmcgcGx1c0ZvdXJNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgemlwQ29kZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwbHVzZm91ciIpLmdldE1hcHBpbmcoKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUgiKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkvL2NoZWNrIHRoZSB0b3AtbGV2ZWwgZW1iZWRkZWQgKEN1c3RvbWVyLmFkZHJlc3MpIGF0dHJpYnV0ZSBvdmVycmlkZSB0byB2ZXJpZnkgaXQgaXMgZ2V0dGluZyBzZXR0aW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgY29sdW1uIG9uIFppcGNvZGUucGx1c2ZvdXIKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVOYW1lZCgiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCS8vc2V0IGFuIGF0dHJpYnV0ZSBvdmVycmlkZSBvbiBBZGRyZXNzLnppcENvZGUgZW1iZWRkZWQgbWFwcGluZwotCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9ICgoVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSAoKEVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlTmFtZWQoInBsdXNmb3VyIikpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIik7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZU5hbWVkKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRV9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCS8vVE9ETyBJIGhhdmUgdGhlIGRlZmF1bHQgd3JvbmcgaW4gdGhpcyBjYXNlLCBidXQgdGhpcyB3YXMgd3JvbmcgYmVmb3JlIGFzIHdlbGwuICBOZWVkIHRvIGZpeCB0aGlzIGxhdGVyCi0vLwkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQ3VzdG9tZXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEVfT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5DdXN0b21lciIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkxvbmdUaW1lQ3VzdG9tZXIiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuWmlwQ29kZSIpOwotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IHNwZWNpZmllZENsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCXNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCk7Ci0JCVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0KLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBhc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyID0gKChFbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBhc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdGF0ZSIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc0VsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXJXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5DdXN0b21lciIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkxvbmdUaW1lQ3VzdG9tZXIiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuWmlwQ29kZSIpOwotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IHNwZWNpZmllZENsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCXNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCk7Ci0JCVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0KLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBhc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyID0gKChFbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBhc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdGF0ZSIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0SmF2YUVudGl0eSgpKS5nZXRDYWNoZWFibGUoKTsKLQkJQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbiBjYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24pOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsJCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlKGZhbHNlKSIsIGN1KTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsJCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUiLCBjdSk7Ci0JCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKG51bGwpOwotCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGVhYmxlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRKYXZhRW50aXR5KCkpLmdldENhY2hlYWJsZSgpOwotCQlDYWNoZWFibGUyXzBBbm5vdGF0aW9uIGNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7Ci0JCQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuYWRkQW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSIsIGN1KTsKLQotCQljYWNoZWFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZShmYWxzZSkiLCBjdSk7Ci0JCQotCQljYWNoZWFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uVFJVRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSh0cnVlKSIsIGN1KTsKLQkJCi0JCWNhY2hlYWJsZUFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUiLCBjdSk7Ci0KLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLnJlbW92ZUFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGVhYmxlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFFbnRpdHkoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSAoUGVyc2lzdGVuY2VVbml0Ml8wKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJYXNzZXJ0RXF1YWxzKFNoYXJlZENhY2hlTW9kZS5VTlNQRUNJRklFRCwgcGVyc2lzdGVuY2VVbml0Ml8wLmdldFNoYXJlZENhY2hlTW9kZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuQUxMKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0KLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEluaGVyaXRlZElzRGVmYXVsdENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFFbnRpdHkoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0SmF2YUVudGl0eSgpLmdldFBhcmVudEVudGl0eSgpKS5nZXRDYWNoZWFibGUoKTsKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IChQZXJzaXN0ZW5jZVVuaXQyXzApIGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JLy9UaGlzIGlzIGEgdGVzdCBmb3IgYnVnIDMwMTg5MgotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlVXBkYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImEiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhbm5vdGF0aW9uLmdldEpvaW5UYWJsZSgpLnNldE5hbWUoIkZPTyIpOwotCQlhbm5vdGF0aW9uLmdldEpvaW5UYWJsZSgpLmFkZEludmVyc2VKb2luQ29sdW1uKDApLnNldE5hbWUoIkJBUiIpOwotCQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZSA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYSIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9ICgoSmF2YU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wKSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUlkTWFwcGluZzJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFJZE1hcHBpbmcyXzBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDEwNzM2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUlkTWFwcGluZzJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNlVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5BY2Nlc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhSWRNYXBwaW5nMl8wVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFJZE1hcHBpbmcyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpICgoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOy8vT25lVG9PbmUgd2l0aCBJZCBhbm5vdGF0aW9uIGlzIHZhbGlkIGluIEpQQSAyLjAKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlpZE1hcHBpbmcuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ly9NYW55VG9PbmUgd2l0aCBJZCBhbm5vdGF0aW9uIGlzIHZhbGlkIGluIEpQQSAyLjAKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYW55VG9NYW55TWFwcGluZzJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYW55VG9NYW55TWFwcGluZzJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOWNhZjYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvTWFueU1hcHBpbmcyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW51bVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZVRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5NYXBwaW5nS2V5czJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJDb2x1bW4yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlcmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFjY2VzczJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5FbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDbGFzczJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYXBLZXlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9yZGVyQnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhTWFueVRvTWFueU1hcHBpbmcyXzBUZXN0cwotCWV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEdlbmVyaWNKYXZhTWFueVRvTWFueU1hcHBpbmcyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklELCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8SW50ZWdlciwgQWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXAgYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFubm90YXRpb25UZXN0VHlwZT4gZW1wbG95ZWVzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzc1dpdGhFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPFN0YXRlPiBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5TWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxBZGRyZXNzLCBQcm9wZXJ0eUluZm8+IHBhcmNlbHM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbnRpdHlLZXlNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPEFkZHJlc3MsIFByb3BlcnR5SW5mbz4gcGFyY2VsczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJQcm9wZXJ0eUluZm8iKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBJbnRlZ2VyIHBhcmNlbE51bWJlcjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBJbnRlZ2VyIHNpemU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS5tYXRoLkJpZ0RlY2ltYWwgdGF4OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByb3BlcnR5SW5mby5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBJZE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0KLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdGF0ZUZvb01hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXNFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3NXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQotCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0YXRlRm9vTWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IChNYXBLZXlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKG1hcEtleSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYXBLZXkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFwS2V5LmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYXBLZXkuc2V0TmFtZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXkuZ2V0TmFtZSgpKTsKLQkJCi0JCW1hcEtleS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibXlNYXBLZXkiKTsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXkgPSAoTWFwS2V5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hcEtleS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQltYXBLZXkgPSAoTWFwS2V5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcyXzAgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nMl8wLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZXMiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcyXzAgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSBtYW55VG9NYW55TWFwcGluZzJfMC5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nMl8wLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IG1hbnlUb01hbnlNYXBwaW5nMl8wLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZXMiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcyXzAuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJTdHJpbmciKTsKLQkJbWFwS2V5TmFtZXMgPSBtYW55VG9NYW55TWFwcGluZzJfMC5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCU1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbiBtYXBLZXlDbGFzc0Fubm90YXRpb24gPSAoTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwobWFwS2V5Q2xhc3NBbm5vdGF0aW9uKTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hcEtleUNsYXNzQW5ub3RhdGlvbi5zZXRWYWx1ZSgibXlNYXBLZXlDbGFzcyIpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Q2xhc3MiLCBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleUNsYXNzIiwgbWFwS2V5Q2xhc3NBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFwS2V5Q2xhc3NBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG1hcEtleUNsYXNzQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCW1hcEtleUNsYXNzQW5ub3RhdGlvbi5zZXRWYWx1ZSgibXlNYXBLZXlDbGFzcyIpOwotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiU3RyaW5nIik7Ci0JCU1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbiBtYXBLZXlDbGFzcyA9IChNYXBLZXlDbGFzczJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBtYXBLZXlDbGFzcy5nZXRWYWx1ZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkludGVnZXIiLCBtYW55VG9NYW55TWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0KLQkJLy90ZXN0IGRlZmF1bHQgc3RpbGwgdGhlIHNhbWUgd2hlbiBzcGVjaWZpZWQgdGFyZ2V0IGVudGl0eSBpdCBzZXQKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE1hcEtleUNsYXNzQ29sbGVjdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0KLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkludGVnZXIiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3JkZXJDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRRdWV1ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJpbnRRdWV1ZSIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByaW50Sm9iIik7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBwcmludFF1ZXVlUGVyc2lzdGVudFR5cGUgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQZXJzaXN0ZW50VHlwZSgidGVzdC5QcmludFF1ZXVlIik7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIGpvYnNNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwcmludFF1ZXVlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImpvYnMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBwcmludEpvYlBlcnNpc3RlbnRUeXBlID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UGVyc2lzdGVudFR5cGUoInRlc3QuUHJpbnRKb2IiKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgcXVldWVzTWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcHJpbnRKb2JQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicXVldWVzIikuZ2V0TWFwcGluZygpOwotCi0JCU9yZGVyYWJsZTJfMCBqb2JzT3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIGpvYnNNYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJT3JkZXJDb2x1bW4yXzAgam9ic09yZGVyQ29sdW1uID0gam9ic09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgam9ic09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBqb2JzT3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgam9ic09yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7IC8vdGhlIGpvaW4gdGFibGUgbmFtZQotCQlPcmRlcmFibGUyXzAgcXVldWVzT3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIHF1ZXVlc01hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlPcmRlckNvbHVtbjJfMCBxdWV1ZXNPcmRlckNvbHVtbiA9IHF1ZXVlc09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcXVldWVzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicXVldWVzX09SREVSIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJam9ic09yZGVyQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvYnNPcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImpvYnNfT1JERVIiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIGpvYnNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJcXVldWVzT3JkZXJDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJxdWV1ZXNfT1JERVIiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQkoKEVudGl0eSkgcHJpbnRKb2JQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRV9QcmludFF1ZXVlIiwgam9ic09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFX1ByaW50UXVldWUiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCSgoRW50aXR5KSBwcmludFF1ZXVlUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9USEVSX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEVfT1RIRVJfVEFCTEUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEVfT1RIRVJfVEFCTEUiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCXF1ZXVlc01hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9UQUJMRSIsIGpvYnNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX1RBQkxFIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJpbnRRdWV1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJQcmludFF1ZXVlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkobWFwcGVkQnk9XCJxdWV1ZXNcIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPcmRlckNvbHVtbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDxQcmludEpvYj4gam9iczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcmludFF1ZXVlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVByaW50Sm9iKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlByaW50Sm9iIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT3JkZXJDb2x1bW4iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkxpc3Q8UHJpbnRRdWV1ZT4gcXVldWVzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByaW50Sm9iLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBLZXlDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOy8vam9pbiB0YWJsZSBuYW1lCi0JCQotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX1BSSU1BUllfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9QUklNQVJZX1RBQkxFIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQkJY29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5Q29sdW1uTWFwcGVkQnlTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJlbXBsb3llZXMiKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzXyIgKyBUWVBFX05BTUUsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOy8vam9pbiB0YWJsZSBuYW1lIG9mIG93bmluZyBtYW55LXRvLW1hbnkKLQkJCi0JCVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UGVyc2lzdGVudFR5cGUoInRlc3QuQWRkcmVzcyIpOwotCQlNYW55VG9NYW55TWFwcGluZyBvd25pbmdNYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpLmdldE1hcHBpbmcoKTsKLQkJKChKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSkgb3duaW5nTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0U3RyYXRlZ3koKSkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fVEFCTEUiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBLZXlDb2x1bW5Kb2luVGFibGVTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ly9qb2luIHRhYmxlIG5hbWUKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fVEFCTEUiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgidmFsdWUuQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CTEFIIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkxBSCIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkxBSCIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbHMiLCByZXNvdXJjZUZpZWxkLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyJfUHJvcGVydHlJbmZvIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUVtYmVkZGFibGUgYWRkcmVzc0VtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgY2l0eU1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBhZGRyZXNzRW1iZWRkYWJsZS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJjaXR5IikuZ2V0TWFwcGluZygpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInBhcmNlbHMiLCByZXNvdXJjZUZpZWxkLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24obnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKG51bGwpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArIl9Qcm9wZXJ0eUluZm8iLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFubm90YXRpb24uc2V0TmFtZSgia2V5LmNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygzLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBUiIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgidmFsdWUuRk9PMiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CQVIiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInZhbHVlLkZPTzIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDcsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LnN0YXRlLmZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5zdGF0ZS5mb28iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInNpemUiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygyLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5zdGF0ZS5mb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuc3RhdGUuZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigxLCAwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRFcXVhbHMoImtleS5zdGF0ZS5mb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXNwZWNpZmllZE92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRNYXBLZXlFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIuY2xhc3MpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24gZW51bWVyYXRlZCA9IChNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGVudW1lcmF0ZWQpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZW51bWVyYXRlZC5nZXRWYWx1ZSgpKTsKLQkJCi0JCSgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRFbnVtVHlwZShFbnVtVHlwZS5TVFJJTkcpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGUuU1RSSU5HLCBlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCQkKLQkJKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE1hcEtleUVudW1lcmF0ZWRVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uIGVudW1lcmF0ZWQgPSAoTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQllbnVtZXJhdGVkLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlLlNUUklORyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwotCQkKLQkJZW51bWVyYXRlZC5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKCgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRTYW1lKG1hbnlUb01hbnlNYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcEtleVRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE5vdE51bGwodGVtcG9yYWwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5VGVtcG9yYWxVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJdGVtcG9yYWwuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQl0ZW1wb3JhbC5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCgoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRTYW1lKG1hbnlUb01hbnlNYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW50aXR5S2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBKb2luQ29sdW1uPiBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucyA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSAoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucyA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJam9pbkNvbHVtbiA9IChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQotCQlqb2luQ29sdW1uID0gKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMgPSBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMSwgMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMgPSBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMgPSBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMgPSBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucyA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbnRpdHlLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCi0JCW1hbnlUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0KLQkJbWFueVRvTWFueU1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5Sm9pbkNvbHVtbnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW50aXR5S2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygxLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0KLQkJbWFueVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQotCQltYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCi0JCW1hbnlUb01hbnlNYXBwaW5nLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbnRpdHlLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQltYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQltYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQltYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gam9pbkNvbHVtbnNJdGVyYXRvciA9IAotCQkJcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW50aXR5S2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJbWFueVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGpvaW5Db2x1bW5zSXRlcmF0b3IgPSAKLQkJCXJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW50aXR5S2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJbWFueVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCWFzc2VydEVxdWFscygzLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikpOwotCi0JCW1hbnlUb01hbnlNYXBwaW5nLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMSk7Ci0KLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqb2luQ29sdW1uUmVzb3VyY2VzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGpvaW5Db2x1bW5SZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJSXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zSXRlcmF0b3IgPSBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCi0JCW1hbnlUb01hbnlNYXBwaW5nLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW5SZXNvdXJjZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGpvaW5Db2x1bW5SZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCi0JCW1hbnlUb01hbnlNYXBwaW5nLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW5SZXNvdXJjZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVudGl0eUtleU1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCW1hbnlUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFKb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhSm9pbkNvbHVtbnMpKTsKLQotCi0JCW1hbnlUb01hbnlNYXBwaW5nLm1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWphdmFKb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQotCQltYW55VG9NYW55TWFwcGluZy5tb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJamF2YUpvaW5Db2x1bW5zID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbnRpdHlLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pKS5zZXROYW1lKCJGT08iKTsKLQkJKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKSkuc2V0TmFtZSgiQkFSIik7Ci0JCSgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigyLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zSXRlcmF0b3IgPSBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDIsIDAsIE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigwLCAxLCBNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnNJdGVyYXRvciA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnNJdGVyYXRvciA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlKb2luQ29sdW1uSXNEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW50aXR5S2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydFRydWUobWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUpvaW5Db2x1bW4oKS5pc1ZpcnR1YWwoKSk7Ci0KLQkJbWFueVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJSm9pbkNvbHVtbiBzcGVjaWZpZWRKb2luQ29sdW1uID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbi5pc1ZpcnR1YWwoKSk7Ci0KLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hbnlUb09uZU1hcHBpbmcyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvT25lTWFwcGluZzJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNjk2ODkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvT25lTWFwcGluZzJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWFueVRvT25lUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRGVyaXZlZElkZW50aXR5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFjY2VzczJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5FbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBzSWQyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhTWFueVRvT25lTWFwcGluZzJfMFRlc3RzCi0JZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgR2VuZXJpY0phdmFNYW55VG9PbmVNYXBwaW5nMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBtYW55VG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEyXzAuTUFQU19JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIEBNYXBzSWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBUWVBFX05BTUUgKyAiIG1hbnlUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5hZGRUb1htbCgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBWZXJzaW9uTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQlKYXZhTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oSlBBLklEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLklEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7Ci0JCUphdmFNYW55VG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRWYWx1ZShmYWxzZSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0VmFsdWUodHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJSmF2YU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCU1hcHNJZDJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWFubm90YXRpb24uc2V0VmFsdWUoImJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7Ci0JCUphdmFNYW55VG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgiZm9vIik7Ci0JCU1hcHNJZDJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQlKYXZhTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFEZXJpdmVkSWRlbnRpdHkyXzAgZGVyaXZlZElkZW50aXR5ID0gY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShkZXJpdmVkSWRlbnRpdHkudXNlc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oSlBBLklEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFByZWRvbWluYW50RGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJSmF2YU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhRGVyaXZlZElkZW50aXR5Ml8wIGRlcml2ZWRJZGVudGl0eSA9IGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJCi0JCWRlcml2ZWRJZGVudGl0eS5zZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZShkZXJpdmVkSWRlbnRpdHkudXNlc01hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQkKLQkJZGVyaXZlZElkZW50aXR5LnNldE51bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQkKLQkJZGVyaXZlZElkZW50aXR5LnNldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoKChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbCgoKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoKChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoKChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbCgoKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhSWRNYXBwaW5nKTsKLQkJCi0JCWNvbnRleHRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKTsJCi0JCQotCQljb250ZXh0QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhQmFzaWNNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nMl8wIG1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCByZWwgPSAoTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBtYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCi0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nMl8wIG1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCByZWwgPSAoTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBtYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCi0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9uZVRvTWFueU1hcHBpbmcyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT25lVG9NYW55TWFwcGluZzJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMmI4MzUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT25lVG9NYW55TWFwcGluZzJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW51bVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNlVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5BY2Nlc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5PbmVUb01hbnkyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hcEtleUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT3JkZXJCeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFPbmVUb01hbnlNYXBwaW5nMl8wVGVzdHMKLQlleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBHZW5lcmljSmF2YU9uZVRvTWFueU1hcHBpbmcyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklELCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIENvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmdPcnBoYW5SZW1vdmFsU3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55KG9ycGhhblJlbW92YWw9ZmFsc2UpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIENvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxJbnRlZ2VyLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BTllfVE9fT05FKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQW5ub3RhdGlvblRlc3RUeXBlIGVtcGxveWVlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzc1dpdGhFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPFN0YXRlPiBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5T25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxBZGRyZXNzLCBQcm9wZXJ0eUluZm8+IHBhcmNlbHM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbnRpdHlLZXlPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPEFkZHJlc3MsIFByb3BlcnR5SW5mbz4gcGFyY2VsczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJQcm9wZXJ0eUluZm8iKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBJbnRlZ2VyIHBhcmNlbE51bWJlcjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBJbnRlZ2VyIHNpemU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS5tYXRoLkJpZ0RlY2ltYWwgdGF4OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByb3BlcnR5SW5mby5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBWZXJzaW9uTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSAoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0KLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBvbmVUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0YXRlRm9vTWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lc0VsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSAoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gb25lVG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdGF0ZUZvb01hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWxPZihPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcpIHsKLQkJcmV0dXJuICgoSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzApIG9uZVRvTWFueU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvTWFueUdldERlZmF1bHRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpLmlzRGVmYXVsdE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRPbmVUb01hbnlHZXREZWZhdWx0T3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKS5pc0RlZmF1bHRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0T3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKLQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5pc09ycGhhblJlbW92YWwoKSk7Ci0JCQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmlzT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9NYW55TWFwcGluZyk7Ci0KLQkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55Ml8wQW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55Ml8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCW9uZVRvTWFueS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE9ycGhhblJlbW92YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmdPcnBoYW5SZW1vdmFsU3BlY2lmaWVkKCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOwotCQkKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnkyXzBBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnkyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvTWFueS5nZXRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSkpOyAJLy8gLmdldEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOwotCQkKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnkyXzBBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnkyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvTWFueS5nZXRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0KLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKLQotCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55Ml8wQW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55Ml8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCW9uZVRvTWFueS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0T3JwaGFuUmVtb3ZhbChudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydFNhbWUob25lVG9NYW55TWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwotCQkKLQkJb25lVG9NYW55LnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7Ci0JCXJlc291cmNlRmllbGQuc2V0UHJpbWFyeUFubm90YXRpb24obnVsbCwgRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCU1hcEtleUFubm90YXRpb24gbWFwS2V5ID0gKE1hcEtleUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwobWFwS2V5KTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hcEtleS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFwS2V5LmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYXBLZXkuc2V0TmFtZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hcEtleS5nZXROYW1lKCkpOwotCQkKLQkJbWFwS2V5LnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibXlNYXBLZXkiKTsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXlBbm5vdGF0aW9uID0gKE1hcEtleUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hcEtleUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCW1hcEtleUFubm90YXRpb24gPSAoTWFwS2V5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXlBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nMl8wID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcyXzAuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nMl8wID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSBvbmVUb01hbnlNYXBwaW5nMl8wLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZzJfMC5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSBvbmVUb01hbnlNYXBwaW5nMl8wLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nMl8wLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiU3RyaW5nIik7Ci0JCW1hcEtleU5hbWVzID0gb25lVG9NYW55TWFwcGluZzJfMC5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIG1hcEtleUNsYXNzQW5ub3RhdGlvbiA9IChNYXBLZXlDbGFzczJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBLZXlDbGFzc0Fubm90YXRpb24pOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFwS2V5Q2xhc3NBbm5vdGF0aW9uLnNldFZhbHVlKCJteU1hcEtleUNsYXNzIik7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXlDbGFzcyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXlDbGFzcyIsIG1hcEtleUNsYXNzQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hcEtleUNsYXNzQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG1hcEtleUNsYXNzQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCW1hcEtleUNsYXNzQW5ub3RhdGlvbi5zZXRWYWx1ZSgibXlNYXBLZXlDbGFzcyIpOwotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoIlN0cmluZyIpOwotCQlNYXBLZXlDbGFzczJfMEFubm90YXRpb24gbWFwS2V5Q2xhc3MgPSAoTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBtYXBLZXlDbGFzcy5nZXRWYWx1ZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkludGVnZXIiLCBvbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQotCQkvL3Rlc3QgZGVmYXVsdCBzdGlsbCB0aGUgc2FtZSB3aGVuIHNwZWNpZmllZCB0YXJnZXQgZW50aXR5IGl0IHNldAotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE1hcEtleUNsYXNzQ29sbGVjdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9yZGVyQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50UXVldWUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50Sm9iKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByaW50UXVldWUiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5QcmludEpvYiIpOwotCQkKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJqb2JzIikuZ2V0TWFwcGluZygpOwotCi0JCU9yZGVyYWJsZTJfMCBvcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCU9yZGVyQ29sdW1uMl8wIG9yZGVyQ29sdW1uID0gb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2IiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCW9yZGVyQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiam9ic19PUkRFUiIsIG9yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgcHJpbnRKb2JQZXJzaXN0ZW50VHlwZSA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKCJ0ZXN0LlByaW50Sm9iIik7Ci0JCSgoRW50aXR5KSBwcmludEpvYlBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9UQUJMRSIpOwotCi0JCWFzc2VydEVxdWFscygiTVlfVEFCTEUiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlQcmludFF1ZXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJpbnRRdWV1ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkobWFwcGVkQnk9XCJxdWV1ZVwiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9yZGVyQ29sdW1uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5MaXN0PFByaW50Sm9iPiBqb2JzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByaW50UXVldWUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BTllfVE9fT05FKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlByaW50Sm9iIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgUHJpbnRRdWV1ZSBxdWV1ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcmludEpvYi5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5Q29sdW1uTWFwcGVkQnlTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJlbXBsb3llZSIpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL293aW5nIGVudGl0eSB0YWJsZSBuYW1lCi0JCQotCQlFbnRpdHkgYWRkcmVzc0VudGl0eSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCWFkZHJlc3NFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfUFJJTUFSWV9UQUJMRSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5Q29sdW1uSm9pblRhYmxlU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ly9qb2luIHRhYmxlIG5hbWUKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfUFJJTUFSWV9UQUJMRSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXRGb3JlaWduS2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCSgoSm9pbkNvbHVtblJlbGF0aW9uc2hpcCkgb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoKEpvaW5Db2x1bW5SZWxhdGlvbnNoaXApIG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfaWQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCBqb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJRW50aXR5IGFkZHJlc3NFbnRpdHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQlhZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0KLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfaWQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBRERSRVNTX1BSSU1BUllfVEFCTEUiLCBqb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQl9Ci0KLQkvL3RhcmdldCBmb3JlaWduIGtleSBjYXNlCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcEtleUNvbHVtbkpvaW5Db2x1bW5TdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkoKEpvaW5Db2x1bW5SZWxhdGlvbnNoaXApIG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJRW50aXR5IGFkZHJlc3NFbnRpdHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQlhZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBRERSRVNTX1BSSU1BUllfVEFCTEUiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKLQl9Ci0KLQkvL3RhcmdldCBmb3JlaWduIGtleSBjYXNlCi0JcHVibGljIHZvaWQgdGVzdE9yZGVyQ29sdW1uRGVmYXVsdHNKb2luQ29sdW1uU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJKChKb2luQ29sdW1uUmVsYXRpb25zaGlwKSBvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQkoKE9yZGVyYWJsZTJfMCkgb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSkuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJT3JkZXJDb2x1bW4yXzAgb3JkZXJDb2x1bW4gPSAoKE9yZGVyYWJsZTJfMCkgb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSkuZ2V0T3JkZXJDb2x1bW4oKTsKLQotCi0JCWFzc2VydE51bGwob3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJRW50aXR5IGFkZHJlc3NFbnRpdHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQlhZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgbWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT25lVG9NYW55UmVsYXRpb25zaGlwMl8wIHJlbCA9IChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgbWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT25lVG9NYW55UmVsYXRpb25zaGlwMl8wIHJlbCA9IChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRNYXBwZWRCeSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCWFubm90YXRpb24uc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5CQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJMQUgiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VscyIsIHJlc291cmNlRmllbGQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArIl9Qcm9wZXJ0eUluZm8iLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJRW1iZWRkYWJsZSBhZGRyZXNzRW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBjaXR5TWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGFkZHJlc3NFbWJlZGRhYmxlLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImNpdHkiKS5nZXRNYXBwaW5nKCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQkJCi0JCWFzc2VydEVxdWFscygicGFyY2VscyIsIHJlc291cmNlRmllbGQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUobnVsbCk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX1Byb3BlcnR5SW5mbyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJrZXkuY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFSIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5GT08yIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygzLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBUiIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgidmFsdWUuRk9PMiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoNywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJjaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuc3RhdGUuZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5jaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LnN0YXRlLmZvbyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgic2l6ZSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkJCQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImtleS5jaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygia2V5LnN0YXRlLmZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImtleS5zdGF0ZS5mb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZU1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFKS5pdGVyYXRvcigpOwotCi0JCWFzc2VydEVxdWFscygia2V5LnN0YXRlLmZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5jaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE1hcEtleUVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihCYXNlRW51bWVyYXRlZENvbnZlcnRlci5jbGFzcyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbiBlbnVtZXJhdGVkID0gKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoZW51bWVyYXRlZCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCQkKLQkJKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkRW51bVR5cGUoRW51bVR5cGUuU1RSSU5HKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlLlNUUklORywgZW51bWVyYXRlZC5nZXRWYWx1ZSgpKTsKLQkJCi0JCSgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTWFwS2V5RW51bWVyYXRlZFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uIGVudW1lcmF0ZWQgPSAoTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQllbnVtZXJhdGVkLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlLlNUUklORyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCQotCQllbnVtZXJhdGVkLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRTYW1lKG9uZVRvTWFueU1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwS2V5VGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uIHRlbXBvcmFsID0gKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh0ZW1wb3JhbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0ZW1wb3JhbC5nZXRWYWx1ZSgpKTsKLQkJCi0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlLlRJTUUsIHRlbXBvcmFsLmdldFZhbHVlKCkpOwotCQkKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5VGVtcG9yYWxVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24gdGVtcG9yYWwgPSAoTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXRlbXBvcmFsLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5USU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQl0ZW1wb3JhbC5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCgoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZShvbmVUb01hbnlNYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW50aXR5S2V5T25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zID0gb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0KLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMgPSBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJam9pbkNvbHVtbiA9IChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zID0gb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCi0JCWpvaW5Db2x1bW4gPSAoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucyA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zID0gb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMgPSBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucyA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMgPSBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbnRpdHlLZXlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygwLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQotCQlvbmVUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQotCQlvbmVUb01hbnlNYXBwaW5nLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5Sm9pbkNvbHVtbnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW50aXR5S2V5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCi0JCW9uZVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCi0JCW9uZVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCi0JCW9uZVRvTWFueU1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJb25lVG9NYW55TWFwcGluZy5yZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbnRpdHlLZXlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCW9uZVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb25lVG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqb2luQ29sdW1uc0l0ZXJhdG9yID0gCi0JCQlyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbnRpdHlLZXlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCW9uZVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb25lVG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqb2luQ29sdW1uc0l0ZXJhdG9yID0gCi0JCQlyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVudGl0eUtleU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJb25lVG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCWFzc2VydEVxdWFscygzLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikpOwotCi0JCW9uZVRvTWFueU1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigxKTsKLQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGpvaW5Db2x1bW5SZXNvdXJjZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGpvaW5Db2x1bW5SZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQotCQlJdGVyYXRvcjw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gam9pbkNvbHVtbnNJdGVyYXRvciA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQotCQlvbmVUb01hbnlNYXBwaW5nLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW5SZXNvdXJjZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGpvaW5Db2x1bW5SZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0KLQkJb25lVG9NYW55TWFwcGluZy5yZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uUmVzb3VyY2VzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVudGl0eUtleU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJb25lVG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YUpvaW5Db2x1bW5zID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFKb2luQ29sdW1ucykpOwotCi0KLQkJb25lVG9NYW55TWFwcGluZy5tb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWphdmFKb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQotCQlvbmVUb01hbnlNYXBwaW5nLm1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWphdmFKb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW50aXR5S2V5T25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pKS5zZXROYW1lKCJGT08iKTsKLQkJKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKSkuc2V0TmFtZSgiQkFSIik7Ci0JCSgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigyLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zSXRlcmF0b3IgPSBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMiwgMCwgTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMCwgMSwgTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlKb2luQ29sdW1uSXNEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW50aXR5S2V5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0VHJ1ZShvbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlKb2luQ29sdW1uKCkuaXNWaXJ0dWFsKCkpOwotCi0JCW9uZVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJSm9pbkNvbHVtbiBzcGVjaWZpZWRKb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1uLmlzVmlydHVhbCgpKTsKLQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUpvaW5Db2x1bW4oKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT25lVG9PbmVNYXBwaW5nMl8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1ZmRjNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YURlcml2ZWRJZGVudGl0eTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQWNjZXNzMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcHNJZDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5PbmVUb09uZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcyXzBUZXN0cwotCWV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEdlbmVyaWNKYXZhT25lVG9PbmVNYXBwaW5nMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgIiArIFRZUEVfTkFNRSArICIgb25lVG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQTJfMC5NQVBTX0lEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSBATWFwc0lkIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBvbmVUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5hZGRUb1htbCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmdPcnBoYW5SZW1vdmFsU3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZShvcnBoYW5SZW1vdmFsPWZhbHNlKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248U3RhdGU+IHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBWZXJzaW9uTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIik7Ci0JCUphdmFPbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oSlBBLklEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLklEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRWYWx1ZShmYWxzZSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0VmFsdWUodHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCU1hcHNJZDJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWFubm90YXRpb24uc2V0VmFsdWUoImJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgiZm9vIik7Ci0JCU1hcHNJZDJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhRGVyaXZlZElkZW50aXR5Ml8wIGRlcml2ZWRJZGVudGl0eSA9IGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuSUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShkZXJpdmVkSWRlbnRpdHkudXNlc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEpQQS5JRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UHJlZG9taW5hbnREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhRGVyaXZlZElkZW50aXR5Ml8wIGRlcml2ZWRJZGVudGl0eSA9IGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJCi0JCWRlcml2ZWRJZGVudGl0eS5zZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc01hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCQotCQlkZXJpdmVkSWRlbnRpdHkuc2V0TnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc01hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUoZGVyaXZlZElkZW50aXR5LnVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCQotCQlkZXJpdmVkSWRlbnRpdHkuc2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQkKLQkJKChNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKS5zZXRWYWx1ZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydEZhbHNlKCgoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKE1hcHNJZDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEZhbHNlKCgoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRGYWxzZSgoKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdGF0ZUZvb01hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXNFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSAoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gb25lVG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0YXRlRm9vTWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQkKLQlwcml2YXRlIEphdmFPcnBoYW5SZW1vdmFibGUyXzAgZ2V0T3JwaGFuUmVtb3ZhbE9mKE9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcpIHsKLQkJcmV0dXJuICgoSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzApIG9uZVRvT25lTWFwcGluZykuZ2V0T3JwaGFuUmVtb3ZhbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9PbmVHZXREZWZhdWx0T3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZykuaXNEZWZhdWx0T3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE9uZVRvT25lR2V0RGVmYXVsdE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb09uZU1hcHBpbmcpLmlzRGVmYXVsdE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmlzT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBtYXBwaW5nc09ycGhhblJlbW92YWwuaXNPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkgSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb09uZU1hcHBpbmcpOwotCi0JCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lMl8wQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCW9uZVRvT25lLnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nT3JwaGFuUmVtb3ZhbFNwZWNpZmllZCgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZykuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkgSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb09uZU1hcHBpbmcpOwotCQkgCi0JCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOwotCQkKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZTJfMEFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmUuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSkpOyAJLy8gLmdldEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJIEphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKTsKLQkJIAotCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmUyXzBBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0KLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE9ycGhhblJlbW92YWxVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJIEphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKTsKLQotCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmUyXzBBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJb25lVG9PbmUuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJb25lVG9PbmUuc2V0T3JwaGFuUmVtb3ZhbChudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydFNhbWUob25lVG9PbmVNYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOwotCQlyZXNvdXJjZUZpZWxkLnNldFByaW1hcnlBbm5vdGF0aW9uKG51bGwsIEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgbWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCByZWwgPSAoT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCBtYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9uZVRvT25lUmVsYXRpb25zaGlwMl8wIHJlbCA9IChPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgbWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJCi0JCWFubm90YXRpb24uc2V0TWFwcGVkQnkoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsJCi0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNGVjYWMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUZvckRlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLk9ORV9UT19PTkUsIEpQQS5NQU5ZX1RPX09ORSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVNwZWNpZmllZEFjY2Vzc0ZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5CQVNJQywgSlBBLlRSQU5TSUVOVCwgSlBBMl8wLkFDQ0VTUywgSlBBMl8wLkFDQ0VTU19UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZE5hbWVGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJ0cmFuc2llbnQiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5U3BlY2lmaWVkQWNjZXNzUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLkJBU0lDLCBKUEEyXzAuQUNDRVNTLCBKUEEyXzAuQUNDRVNTX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kTmFtZUZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpOwotCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCQotCXB1YmxpYyBHZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc0ZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlTcGVjaWZpZWRBY2Nlc3NGaWVsZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmFtZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgbmFtZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgbmFtZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG5hbWVQZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgaWRQZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIGlkUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgaWRQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGlkUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgaWRQZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc1Byb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlTcGVjaWZpZWRBY2Nlc3NQcm9wZXJ0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmFtZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgbmFtZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgbmFtZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG5hbWVQZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgaWRQZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIGlkUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgaWRQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGlkUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgaWRQZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlcml2ZWRJZE1hcHBpbmdJbml0aWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yRGVyaXZlZElkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgaWQgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKGlkLmdldE1hcHBpbmdLZXkoKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCWlkLmdldFJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihKUEEuSUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKGlkLmdldE1hcHBpbmdLZXkoKSwgTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCWlkLmdldFJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoaWQuZ2V0TWFwcGluZ0tleSgpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydE5vdE51bGwoaWQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQkKLQkJaWQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhpZC5nZXRNYXBwaW5nS2V5KCksIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlpZC5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhpZC5nZXRNYXBwaW5nS2V5KCksIE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydE5vdE51bGwoaWQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQkKLQkJaWQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoaWQuZ2V0TWFwcGluZ0tleSgpLCBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJaWQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5zZXRQcmltYXJ5QW5ub3RhdGlvbihudWxsLCBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoaWQuZ2V0TWFwcGluZ0tleSgpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZTJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZTJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OTk3YTcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRmllbGRBY2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLlByb3BlcnR5QWNjZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW50aXR5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZTJfMFRlc3RzIGV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZEFuZE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRQcm9wZXJ0eVNwZWNpZmllZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBKUEEuSUQsIEpQQTJfMC5BQ0NFU1MsIEpQQTJfMC5BQ0NFU1NfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpIik7Ci0JCQl9Ci0JCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZE5hbWVGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkUHJvcGVydHlGaWVsZFNwZWNpZmllZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEyXzAuQUNDRVNTLCBKUEEyXzAuQUNDRVNTX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCkiKTsKLQkJCX0KLQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFN1YlR5cGVXaXRoRmllbGRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTdWJUeXBlV2l0aE1ldGhvZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTdWJUeXBlTm9uUGVyc2lzdGVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgbmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U3ViVHlwZVBlcnNpc3RlbnRFeHRlbmRzTm9uUGVyc2lzdGVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZDIuamF2YSIsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZDIiLCBuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzIEFubm90YXRpb25UZXN0VHlwZUNoaWxkICIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQkKLQlwdWJsaWMgR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZTJfMFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzTm90aGluZ0Fubm90YXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc1Byb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc0ZpZWxkQW5kTWV0aG9kQW5ub3RhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZEFuZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzRmllbGRBbm5vdGF0ZWRQcm9wZXJ0eVNwZWNpZmllZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRQcm9wZXJ0eVNwZWNpZmllZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCi0JCWphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzUHJvcGVydHlBbm5vdGF0ZWRGaWVsZFNwZWNpZmllZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkUHJvcGVydHlGaWVsZFNwZWNpZmllZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQotCQlqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCi0JCWphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhdHRyaWJ1dGVzLm5leHQoKS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLnNldFByaW1hcnlBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQotCQlqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCi0JCWphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc0luaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc0luaGVyaXRhbmNlMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0JCi0JCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NJbmhlcml0YW5jZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlV2l0aE1ldGhvZEFubm90YXRpb24oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0JCi0JCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NJbmhlcml0YW5jZTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZVdpdGhGaWVsZEFubm90YXRpb24oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQkvL2luaGVyaXRlZCBjbGFzcyBoYXZpbmcgYW5ub3RhdGlvbnMgc2V0IHdpbnMgb3ZlciB0aGUgZGVmYXVsdCBhY2Nlc3Mgc2V0IG9uIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzSW5oZXJpdGFuY2VQZXJzaXN0ZW5jZVVuaXREZWZhdWx0QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NYbWxOb0FjY2Vzc05vQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sRW50aXR5QWNjZXNzTm9Bbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCi0KLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNBY2Nlc3NOb0Fubm90YXRpb25zKCkgIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCi0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sRW50aXR5UHJvcGVydHlBY2Nlc3NBbmRGaWVsZEFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8veG1sIGFjY2VzcyBzZXQgdG8gcHJvcGVydHksIGZpZWxkIGFubm90YXRpb25zLCBKYXZhUGVyc2lzdGVudFR5cGUgYWNjZXNzIGlzIGZpZWxkCi0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NYbWxFbnRpdHlGaWVsZEFjY2Vzc0FuZFByb3BlcnR5QW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy94bWwgYWNjZXNzIHNldCB0byBmaWVsZCwgcHJvcGVydHkgYW5ub3RhdGlvbnMsIEphdmFQZXJzaXN0ZW50VHlwZSBhY2Nlc3MgaXMgcHJvcGVydHkKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0FjY2Vzc0ZpZWxkQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCi0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0KLQkvL2luaGVyaXRhbmNlIHdpbnMgb3ZlciBlbnRpdHktbWFwcGluZ3Mgc3BlY2lmaWVkIGFjY2VzcwotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NYbWxFbnRpdHlNYXBwaW5nc0FjY2Vzc1dpdGhJbmhlcml0YW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjaGlsZEVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQkKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUgPSBjaGlsZEVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sTWV0YWRhdGFDb21wbGV0ZUZpZWxkQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy94bWwgYWNjZXNzIHNldCB0byBwcm9wZXJ0eSwgamF2YSBoYXMgZmllbGQgYW5ub3RhdGlvbnMgc28gdGhlIGFjY2VzcyBzaG91bGQgYmUgZmllbGQKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCi0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc05vWG1sQWNjZXNzWG1sTWV0ZGF0YUNvbXBsZXRlUHJvcGVydHlBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQkvL3htbCBhY2Nlc3Mgbm90IHNldCwgbWV0YWRhdGEgY29tcGxldGUgc2V0LiAgSmF2YVBlcnNpc3RlbnRUeXBlIGFjY2VzcyBpcyBwcm9wZXJ0eSBiZWNhdXNlIHByb3BlcnRpZXMgYXJlIGFubm90YXRlZAotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCi0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN1cGVyUGVyc2lzdGVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZVdpdGhGaWVsZEFubm90YXRpb24oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCUNsYXNzUmVmIGNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJvb3RKYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMocm9vdEphdmFQZXJzaXN0ZW50VHlwZSwgY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChyb290SmF2YVBlcnNpc3RlbnRUeXBlLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTdXBlclBlcnNpc3RlbnRUeXBlMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlV2l0aEZpZWxkQW5ub3RhdGlvbigpOwotCQkKLQkJLy9zdXBlciBpcyBub3QgYWRkZWQgdG8gdGhlIGdldFBlcnNpc3RlbmNlVW5pdCwgYnV0IGl0IHNob3VsZCBzdGlsbCBiZSBmb3VuZAotCQkvL2FzIHRoZSBzdXBlclBlcnNpc3RlbnRUeXBlIGJlY2F1c2Ugb2YgaW1wbGllZENsYXNzUmVmcyBhbmQgY2hhbmdlcyBmb3IgYnVnIDE5MDMxNwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpKTsKLQl9CQotCQotCS8vRW50aXR5IGV4dGVuZHMgTm9uLUVudGl0eSBleHRlbmRzIEVudGl0eSAKLQlwdWJsaWMgdm9pZCB0ZXN0U3VwZXJQZXJzaXN0ZW50VHlwZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZU5vblBlcnNpc3RlbnQoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGVQZXJzaXN0ZW50RXh0ZW5kc05vblBlcnNpc3RlbnQoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkMiIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSByb290SmF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQljbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHJvb3RKYXZhUGVyc2lzdGVudFR5cGUsIGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKSk7Ci0JCWFzc2VydE51bGwocm9vdEphdmFQZXJzaXN0ZW50VHlwZS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW5oZXJpdGFuY2VIaWVyYXJjaHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZU5vblBlcnNpc3RlbnQoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGVQZXJzaXN0ZW50RXh0ZW5kc05vblBlcnNpc3RlbnQoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkMiIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgcm9vdEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlJdGVyYXRvcjxQZXJzaXN0ZW50VHlwZT4gaW5oZXJpdGFuY2VIaWVyYXJjaHkgPSBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZS5nZXRJbmhlcml0YW5jZUhpZXJhcmNoeSgpLml0ZXJhdG9yKCk7CQotCQkKLQkJYXNzZXJ0RXF1YWxzKGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlLCBpbmhlcml0YW5jZUhpZXJhcmNoeS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocm9vdEphdmFQZXJzaXN0ZW50VHlwZSwgaW5oZXJpdGFuY2VIaWVyYXJjaHkubmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEluaGVyaXRhbmNlSGllcmFyY2h5MigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlTm9uUGVyc2lzdGVudCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZVBlcnNpc3RlbnRFeHRlbmRzTm9uUGVyc2lzdGVudCgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZDIiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSByb290SmF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCUl0ZXJhdG9yPFBlcnNpc3RlbnRUeXBlPiBpbmhlcml0YW5jZUhpZXJhcmNoeSA9IGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlLmdldEluaGVyaXRhbmNlSGllcmFyY2h5KCkuaXRlcmF0b3IoKTsJCi0JCQotCQlhc3NlcnRFcXVhbHMoY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUsIGluaGVyaXRhbmNlSGllcmFyY2h5Lm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhyb290SmF2YVBlcnNpc3RlbnRUeXBlLCBpbmhlcml0YW5jZUhpZXJhcmNoeS5uZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBwaW5nS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwcGluZ0tleU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHBpbmdLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCi0JCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwcGluZ0tleTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCi0JCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRW1iZWRkYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBwaW5nS2V5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCi0JCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwaW5nS2V5TWFwcGluZ0NoYW5nZUluUmVzb3VyY2VNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlyZXNvdXJjZVR5cGUuc2V0UHJpbWFyeUFubm90YXRpb24oRW1iZWRkYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdLZXlNYXBwaW5nQ2hhbmdlSW5SZXNvdXJjZU1vZGVsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlyZXNvdXJjZVR5cGUuc2V0UHJpbWFyeUFubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTWFwcGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5pc01hcHBlZCgpKTsKLQkJCi0JCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsJCi0JCWFzc2VydEZhbHNlKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmlzTWFwcGVkKCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRBbmRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYXR0cmlidXRlLmdldEFjY2Vzc29yKCkgaW5zdGFuY2VvZiBGaWVsZEFjY2Vzc29yKTsKLQkJYXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZS5nZXRBY2Nlc3NvcigpIGluc3RhbmNlb2YgRmllbGRBY2Nlc3Nvcik7Ci0JCWF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYXR0cmlidXRlLmdldEFjY2Vzc29yKCkgaW5zdGFuY2VvZiBQcm9wZXJ0eUFjY2Vzc29yKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVzU2l6ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkQW5kTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscygzLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU5hbWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibmFtZSIpKTsKLQkJYXNzZXJ0TnVsbChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiZm9vIikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlTmFtZWQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydE51bGwoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImZvbyIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbmFtZUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHRlc3RUeXBlID0gY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgaWRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmFtZUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBpZEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBuYW1lQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQotCQlJRmllbGQgaWRGaWVsZCA9IHRlc3RUeXBlLmZpbmRQcmltYXJ5VHlwZSgpLmdldEZpZWxkKCJpZCIpOwotCQlpZEZpZWxkLnJlbmFtZSgiaWQyIiwgZmFsc2UsIG51bGwpOwotCQkKLQkJYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBuYW1lQXR0cmlidXRlMiA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpZDJBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQotCQlhc3NlcnROb3RTYW1lKGlkQXR0cmlidXRlLCBpZDJBdHRyaWJ1dGUpOwotCQlhc3NlcnRFcXVhbHMoImlkMiIsIGlkMkF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobmFtZUF0dHJpYnV0ZSwgbmFtZUF0dHJpYnV0ZTIpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBuYW1lQXR0cmlidXRlMi5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1cGVyUGVyc2lzdGVudFR5cGVHZW5lcmljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RHZW5lcmljRW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RHZW5lcmljTWFwcGVkU3VwZXJjbGFzcygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5FbnRpdHkxIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuRW50aXR5MiIpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QuRW50aXR5MSIsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKGphdmFQZXJzaXN0ZW50VHlwZS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkVudGl0eTIiLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RHZW5lcmljRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgRW50aXR5MSAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgRW50aXR5MjxJbnRlZ2VyPiB7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkVudGl0eTEuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0R2VuZXJpY01hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyBFbnRpdHkyPEs+IHt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRW50aXR5Mi5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MzIyNDQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLS8qKgotICogIEdlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IyXzBUZXN0cwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yMl8wVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VRVUVOQ0VfR0VORVJBVE9SX05BTUUgPSAiVEVTVF9TRVFVRU5DRV9HRU5FUkFUT1IiOwotCi0JcHVibGljIEdlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBjYXRhbG9nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3IyXzAgc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3IyXzApIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQkKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvci5nZXRDYXRhbG9nKCkpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwkKLQkJCi0JCWFubm90YXRpb24uc2V0Q2F0YWxvZygidGVzdENhdGFsb2ciKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInRlc3RDYXRhbG9nIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0Q2F0YWxvZyIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yMl8wIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yMl8wKSBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKLQotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkQ2F0YWxvZygidGVzdENhdGFsb2ciKTsKLQkJCi0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdENhdGFsb2ciLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yMl8wIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yMl8wKSBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKLQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRDYXRhbG9nKCJ0ZXN0Q2F0YWxvZyIpOwotCQkKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsJCi0JCWFzc2VydEVxdWFscygidGVzdENhdGFsb2ciLCBhbm5vdGF0aW9uLmdldENhdGFsb2coKSk7Ci0JCQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0Q2F0YWxvZygpKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBzY2hlbWEgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEdldFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSB0aGlzLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3IyXzAgc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3IyXzApIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCi0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U2NoZW1hKCkpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwkKLQkJCi0JCWFubm90YXRpb24uc2V0U2NoZW1hKCJ0ZXN0U2NoZW1hIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0U2NoZW1hIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RTY2hlbWEiLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMCBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0KLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvci5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkU2NoZW1hKCJ0ZXN0U2NoZW1hIik7Ci0JCQotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFNjaGVtYSIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWFGcm9tUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpICBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yMl8wIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yMl8wKSBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCi0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCXRoaXMuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJdGhpcy5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZFNjaGVtYSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZFNjaGVtYSgiWE1MX1NDSEVNQSIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0KLQkJdGhpcy5nZXRFbnRpdHlNYXBwaW5ncygpLnJlbW92ZVBlcnNpc3RlbnRUeXBlKDApOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkvL2RlZmF1bHQgc2NoZW1hIHRha2VuIGZyb20gcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBub3QgZW50aXR5LW1hcHBpbmdzIHNpbmNlIHRoZSBlbnRpdHkgaXMgbm90IGluIGFuIG9ybS54bWwgZmlsZQotCQlpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCXNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yMl8wKSBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXREZWZhdWx0U2NoZW1hKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMCBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRTY2hlbWEoInRlc3RTY2hlbWEiKTsKLQkJCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7CQotCQlhc3NlcnRFcXVhbHMoInRlc3RTY2hlbWEiLCBhbm5vdGF0aW9uLmdldFNjaGVtYSgpKTsKLQkJCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldFNjaGVtYSgpKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB1dGlsaXR5ICoqKioqKioqKioKLQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBTZXF1ZW5jZUdlbmVyYXRvcihuYW1lPVwiIiArIFNFUVVFTkNFX0dFTkVSQVRPUl9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFWZXJzaW9uTWFwcGluZzJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFWZXJzaW9uTWFwcGluZzJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNTQzNGYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVmVyc2lvbk1hcHBpbmcyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZVRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLk1hcHBpbmdLZXlzMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQWNjZXNzMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVZlcnNpb25NYXBwaW5nMl8wVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5WRVJTSU9OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBWZXJzaW9uIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQkKLQlwdWJsaWMgR2VuZXJpY0phdmFWZXJzaW9uTWFwcGluZzJfMFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSAoKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWMyXzBPcm1Db250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpYzJfME9ybUNvbnRleHRNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYmY3ZGUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpYzJfME9ybUNvbnRleHRNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljMl8wT3JtQ29udGV4dE1vZGVsVGVzdHMKLQlleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEdlbmVyaWMyXzBPcm1Db250ZXh0TW9kZWxUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY09ybUNhc2NhZGUyXzBUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljT3JtQ29sbGVjdGlvblRhYmxlMl8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNPcm1FbnRpdHkyXzBUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nMl8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY09ybU1hbnlUb01hbnlNYXBwaW5nMl8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY09ybU1hbnlUb09uZU1hcHBpbmcyXzBUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljT3JtT25lVG9NYW55TWFwcGluZzJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmcyXzBUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZTJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMFRlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgR2VuZXJpYzJfME9ybUNvbnRleHRNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZTJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZTJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZmEzYWYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5WaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBKUEEuT05FX1RPX09ORSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFubm90YXRpb25UZXN0VHlwZUNoaWxkIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzTWFueVRvTWFueSgpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFubm90YXRpb25UZXN0VHlwZUNoaWxkPiBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0KLQkJCi0JcHVibGljIEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgb3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQotCQlvcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5pc0VtcHR5KCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCU9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuaXNFbXB0eSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCU9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCi0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkT3ZlcnJpZGUgPSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlPcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gc3BlY2lmaWVkT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCk7Ci0KLQkJCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbjIgPSBqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4zID0gam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW4zLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMiwgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4zLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbiwgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCi0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZE92ZXJyaWRlID0gb3JtQXNzb2NpYXRpb25PdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSA9IHNwZWNpZmllZE92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCi0JCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQlqb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQkJam9pbmluZ1N0cmF0ZWd5LnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlqb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQkKLQkJam9pbmluZ1N0cmF0ZWd5LnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgb3JtQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRPdmVycmlkZSA9IG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCU9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSBzcGVjaWZpZWRPdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKTsKLQkJCi0JCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscyg0LCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlqb2luaW5nU3RyYXRlZ3kubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCWpvaW5pbmdTdHJhdGVneS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCU9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCi0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkT3ZlcnJpZGUgPSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlPcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gc3BlY2lmaWVkT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmFkZCgwLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuYWRkKDEsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoMiwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0KLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5tb3ZlKDIsIDApOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5tb3ZlKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsJCQotCQkKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBvcm1FbnRpdHkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydFRydWUoYXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRKb2luVGFibGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbE92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCSgoT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzApIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gKChPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCkgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwotCi0JCQotCQlKb2luVGFibGUgam9pblRhYmxlID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5UYWJsZSgpOwotCQlqb2luVGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSm9pblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbE92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCSgoT3JtT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzApIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJT3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gKChPcm1PdmVycmlkZVJlbGF0aW9uc2hpcDJfMCkgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwotCQotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpLnNldE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX1RBQkxFIiwgam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5UYWJsZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCkuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCkuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCkuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCkuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5UYWJsZSgpLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCkuZ2V0Sm9pbkNvbHVtbnMoKS5tb3ZlKDIsIDApOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKS5nZXRKb2luQ29sdW1ucygpLm1vdmUoMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5UYWJsZSgpLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDEpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5UYWJsZSgpLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRKb2luVGFibGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzTWFueVRvTWFueSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlWaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gKChWaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzApIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCk7Ci0KLQkJVmlydHVhbEpvaW5UYWJsZSBqb2luVGFibGUgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkX0Fubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgam9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQkKLQkJb3JtRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PX0ZPTyIsIGpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQkKLQkJUGVyc2lzdGVudFR5cGUgbWFwcGVkU3VwZXJjbGFzcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKTsKLQkJKChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUpICBtYXBwZWRTdXBlcmNsYXNzLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikpLmFkZFRvWG1sKCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuZ2V0TmFtZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtQ2FzY2FkZTJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtQ2FzY2FkZTJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkM2EyNDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUNhc2NhZGUyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYXNjYWRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtQ2FzY2FkZTJfMFRlc3RzIGV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEdlbmVyaWNPcm1DYXNjYWRlMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FzY2FkZURldGFjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQlDYXNjYWRlMl8wIGNhc2NhZGUgPSAoQ2FzY2FkZTJfMCkgb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc0RldGFjaCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwotCQkKLQkJLy9zZXQgY2FzY2FkZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlvbmVUb09uZS5zZXRDYXNjYWRlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhc2NhZGVUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNEZXRhY2goKSk7Ci0JCWFzc2VydE5vdE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKLQkJCi0JCS8vc2V0IGRldGFjaCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLnNldENhc2NhZGVEZXRhY2godHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYXNjYWRlLmlzRGV0YWNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZURldGFjaCgpKTsKLQkJCi0JCS8vc2V0IGRldGFjaCB0byBmYWxzZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLnNldENhc2NhZGVEZXRhY2goZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNEZXRhY2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZURldGFjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVEZXRhY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCUNhc2NhZGUyXzAgY2FzY2FkZSA9IChDYXNjYWRlMl8wKSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzRGV0YWNoKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JCQotCQkvL3NldCBkZXRhY2ggaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCWNhc2NhZGUuc2V0RGV0YWNoKHRydWUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FzY2FkZS5pc0RldGFjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9uZVRvT25lLmdldENhc2NhZGUoKS5pc0Nhc2NhZGVEZXRhY2goKSk7Ci0JCQotCQkvL3NldCBkZXRhY2ggdG8gZmFsc2UgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJY2FzY2FkZS5zZXREZXRhY2goZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNEZXRhY2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtQ29sbGVjdGlvblRhYmxlMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Db2xsZWN0aW9uVGFibGUyXzBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzIwZTBhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Db2xsZWN0aW9uVGFibGUyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5NYXBwaW5nS2V5czJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1Db2xsZWN0aW9uVGFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2xsZWN0aW9uVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1Db2xsZWN0aW9uVGFibGUyXzBUZXN0cyBleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBHZW5lcmljT3JtQ29sbGVjdGlvblRhYmxlMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLklELCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBwcm9qZWN0czsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCQkKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXROYW1lKCkpOwotCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQ29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxDb2xsZWN0aW9uVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInByb2plY3RzIik7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlID0gdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX3Byb2plY3RzIiwgdmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlKb2luQ29sdW1uIHZpcnR1YWxKb2luQ29sdW1uID0gdmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9pZCIsIHZpcnR1YWxKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YUNvbGxlY3Rpb25UYWJsZTJfMCBqYXZhQ29sbGVjdGlvblRhYmxlID0gamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJamF2YUNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YUNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJDQVRBTE9HIik7Ci0JCWphdmFDb2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJTQ0hFTUEiKTsKLQkJSmF2YUpvaW5Db2x1bW4gamF2YUpvaW5Db2x1bW4gPSBqYXZhQ29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIk5BTUUiKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRkVSRU5DRURfTkFNRSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ0FUQUxPRyIsIHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTQ0hFTUEiLCB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQl2aXJ0dWFsSm9pbkNvbHVtbiA9IHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJOQU1FIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSRUZFUkVOQ0VEX05BTUUiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHROYW1lRnJvbUphdmFUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkRWxlbWVudENvbGxlY3Rpb24oKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInByb2plY3RzIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9wcm9qZWN0cyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkoKEphdmFFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuc2V0U3BlY2lmaWVkTmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vX3Byb2plY3RzIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJKChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuc2V0U3BlY2lmaWVkTmFtZSgiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyX3Byb2plY3RzIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwcm9qZWN0cyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJKQVZBX0NPTExFQ1RJT05fVEFCTEUiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQmFyX3Byb2plY3RzIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSB0byB0cnVlLCB3aWxsIGlnbm9yZSBqYXZhIGFubm90YXRpb24gc2V0dGluZ3MKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoIkJhcl9wcm9qZWN0cyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQkvL3JlbW92ZSBlbGVtZW50IGNvbGxlY3Rpb24gbWFwcGluZyBmcm9tIHRoZSBvcm0ueG1sIGZpbGUKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5yZW1vdmVGcm9tWG1sKCk7Ci0JCS8vb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwcm9qZWN0cyIpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIHZpcnR1YWxDb2xsZWN0aW9uVGFibGUgPSB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX0NPTExFQ1RJT05fVEFCTEUiLCB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ly9zcGVjaWZpZWROYW1lIHNpbmNlIHRoaXMgaXMgYSB2aXJ0dWFsIG1hcHBpbmcgbm93Ci0JCQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiQmFyX3Byb2plY3RzIiwgdmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJhcl9wcm9qZWN0cyIsIHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCkpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldFNjaGVtYSgpKTsKLQkKLQkJLy9zZXQgU2NoZW1hIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0U2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0JCQotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldFNjaGVtYSgpKTsKLQotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCQotCQkvL3NldCBTY2hlbWEgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJLy9zZXQgU2NoZW1hIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCQotCQkvL3NldCBDYXRhbG9nIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0Q2F0YWxvZygiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXRDYXRhbG9nKCkpOwotCQotCQkvL3NldCBDYXRhbG9nIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0Q2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldENhdGFsb2coKSk7Ci0JCQotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldENhdGFsb2coIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0Q2F0YWxvZygpKTsKLQotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCQkKLQkJLy9zZXQgQ2F0YWxvZyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBDYXRhbG9nIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvcm1Db2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMiA9IG9ybUNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjIsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMywgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4sIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCQotCQlqb2luQ29sdW1ucyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCVhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygzLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQkJb3JtQ29sbGVjdGlvblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCkpOwotCQlYbWxDb2xsZWN0aW9uVGFibGUgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5tb3ZlKDIsIDApOwotCQlqb2luQ29sdW1ucyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5tb3ZlKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJmb28iKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJiYXIiKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50c1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCAgb3JtQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQkJCi0JCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImZvbyIpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgxLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImJhciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsICBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCVhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCVhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKLQotCQlvcm1Db2xsZWN0aW9uVGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlcyA9IHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwkJCi0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwkJCi0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0KLQkJCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5oYXNOZXh0KCkpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCkpOwotCQlYbWxDb2xsZWN0aW9uVGFibGUgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3JtQ29sbGVjdGlvblRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQotCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiRk9PIik7Ci0KLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgxLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkJBUiIpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJCQVoiKTsKLQotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubW92ZSgyLCAwKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLm1vdmUoMCwgMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnJlbW92ZSgxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkucmVtb3ZlKDApOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzRnJvbUphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgdmlydHVhbEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlID0gdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUNvbGxlY3Rpb25UYWJsZTJfMCBqYXZhQ29sbGVjdGlvblRhYmxlID0gamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWphdmFDb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJamF2YUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlqYXZhQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0KLQkJdW5pcXVlQ29uc3RyYWludHMgPSB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZS5hZGRUb1htbCgpOwotCQkKLQkJdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygwLCAgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5NGJiYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNlRW51bWVyYXRlZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZVRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlckNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBUZXN0cyBleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSA9ICJjaXR5IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9OQU1FID0gIkVfQ0lUWSI7Ci0JCi0JcHVibGljIEdlbmVyaWNPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLkZFVENIX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbih0YXJnZXRDbGFzcz1TdHJpbmcuY2xhc3MsIGZldGNoPUZldGNoVHlwZS5FQUdFUikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCQotCQkJfQotCQl9KTsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuRkVUQ0hfVFlQRSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIiwgY29sdW1uPUBDb2x1bW4obmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX05BTUUgKyAiXCIpKSIpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTm9uR2VuZXJpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb24gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248U3RyaW5nPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9CQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPFN0cmluZywgQWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgYWJicjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9CQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2VsZlJlZmVyZW50aWFsRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkZvbyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkxpc3Q8Rm9vPiBlbGVtZW50Q29sbGVjdGlvbjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJGb28uamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcHBpbmdOb1VuZGVyeWxpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmFkZFRvWG1sKCk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBzcGVjaWZpZWRFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgc3BlY2lmaWVkRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIHNwZWNpZmllZEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBzcGVjaWZpZWRFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBzcGVjaWZpZWRFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldENsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmFkZFRvWG1sKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldEZldGNoKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLS8vVE9ETwlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKElCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5FQUdFUiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5FQUdFUiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQotCQkvL3NldCBmZXRjaCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCBlbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldFRhcmdldENsYXNzKCkpOwotCQkJCQotCQkvL3NldCB0YXJnZXQgY2xhc3MgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldFRhcmdldENsYXNzKCJuZXdUYXJnZXRDbGFzcyIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBjbGFzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRUYXJnZXRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRUYXJnZXRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJuZXdUYXJnZXRDbGFzcyIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBjbGFzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlVHlwZUVtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQWRkcmVzcyIpOwotCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGUuRU1CRUREQUJMRV9UWVBFLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVUeXBlRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQWRkcmVzcyIpOwotCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGUuQkFTSUNfVFlQRSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlVHlwZU5vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOb25HZW5lcmljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQWRkcmVzcyIpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuVHlwZS5OT19UWVBFLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVUeXBlKCkpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygidGVzdC5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscyhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuVHlwZS5FTUJFRERBQkxFX1RZUEUsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZVR5cGVCYXNpYygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQWRkcmVzcyIpOwotCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGUuQkFTSUNfVFlQRSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlVHlwZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRNYXBLZXkoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE5vdE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5KCkpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5KCkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5KCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXkoKS5zZXROYW1lKCJteU1hcEtleSIpOwotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWaXJ0dWFsTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQkJCi0JCS8vc2V0IHBrIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFBrTWFwS2V5KHRydWUpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXkoKSk7Ly9ubyBwcmltYXJ5IGtleSBvbiBhbiBlbWJlZGRhYmxlCi0JCWFzc2VydFRydWUodmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JCQotCQkKLQkJLy9zZXQgY3VzdG9tIHNwZWNpZmllZCBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRDdXN0b21NYXBLZXkodHJ1ZSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJjaXR5Iik7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHhtbEVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleSgpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm15TWFwS2V5Iik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgeG1sRWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoInRlc3QuQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmFkZFRvWG1sKCk7Ci0JCXZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQltYXBLZXlOYW1lcyA9IHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQl2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJ0ZXN0LkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoIlN0cmluZyIpOwotCQltYXBLZXlOYW1lcyA9IHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRNYXBLZXlDbGFzcyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDbGFzc1JlZmVyZW5jZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE5vdE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpLnNldENsYXNzTmFtZSgiU3RyaW5nIik7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleUNsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKS5zZXRDbGFzc05hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleUNsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKS5zZXRDbGFzc05hbWUoIlN0cmluZyIpOwotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWaXJ0dWFsTWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0JCQotCQkvL3NldCBwayBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiSW50ZWdlciIpOwotCQlhc3NlcnRFcXVhbHMoIkludGVnZXIiLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIkludGVnZXIiLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleUNsYXNzKCkpOwotCQkJCQkKLQkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJTdHJpbmciKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPcmRlckNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlPcmRlcmFibGUyXzAgb3JkZXJhYmxlID0gKE9yZGVyYWJsZTJfMCkgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE9yZGVyYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQkKLQkJb3JkZXJhYmxlLnNldE9yZGVyQ29sdW1uT3JkZXJpbmcodHJ1ZSk7Ci0JCU9yZGVyQ29sdW1uMl8wIG9yZGVyQ29sdW1uID0gb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlvcmRlckNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19PUkRFUiIsIG9yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxPcmRlckNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJT3JkZXJhYmxlMl8wIG9yZGVyYWJsZSA9IChPcmRlcmFibGUyXzApIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRPcmRlcmFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TWFwcGluZygpOwotCQkoKE9yZGVyYWJsZTJfMCkgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRPcmRlcmFibGUoKSkuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnJlbW92ZUZyb21YbWwoKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCB2aXJ0dWFsQ29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCW9yZGVyYWJsZSA9IChPcmRlcmFibGUyXzApIHZpcnR1YWxDb2xsZWN0aW9uTWFwcGluZy5nZXRPcmRlcmFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX09SREVSIiwgb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCSgoT3JkZXJhYmxlMl8wKSBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5nZXRPcmRlckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsVmFsdWVDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQkvL3ZpcnR1YWwgYXR0cnVidGUgaW4gb3JtLnhtbCwgamF2YSBhdHRyaWJ1dGUgaGFzIG5vIHZhbHVlIENvbHVtbiBhbm5vdGF0aW9uCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlDb2x1bW4gdmlydHVhbENvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldFZhbHVlQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgdmlydHVhbENvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9MRU5HVEgsIHZpcnR1YWxDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIHZpcnR1YWxDb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9TQ0FMRSwgdmlydHVhbENvbHVtbi5nZXRTY2FsZSgpKTsKLQkKLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwkJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig0NSkpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDQ3KSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PX1RBQkxFIiwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxDb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDUpLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NiksIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ3KSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQotCQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSwgb3JtLnhtbCB2aXJ0dWFsIGNvbHVtbiBpZ25vcmVzIGphdmEgY29sdW1uIGFubm90YXRpb24KLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJLy9ubyBsb25nZXIgYW4gZWxlbWVudCBjb2xsZWN0aW9uIG1hcHBpbmcKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljQmFzaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkJCi0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpOwotCQotCQkvL3NldCBDb2x1bW4gYW5ub3RhdGlvbiBpbiBKYXZhCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CQkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJGT09fVEFCTEUiKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDQ1KSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDQ2KSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNDcpKTsKLQotCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIG9ybUNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgb3JtQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9MRU5HVEgsIG9ybUNvbHVtbi5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIG9ybUNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9TQ0FMRSwgb3JtQ29sdW1uLmdldERlZmF1bHRTY2FsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsVmFsdWVDb2x1bW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQkvL3ZpcnR1YWwgYXR0cmlidXRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJQ29sdW1uIHZpcnR1YWxDb2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkKLQkJLy9lbnRpdHkgdGFibGUgc2hvdWxkIGhhdmUgbm8gYWZmZWN0IG9uIHRoZSBjb2xsZWN0aW9uIHRhYmxlIGRlZmF1bHQgbmFtZQotCQkoKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9STV9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJLy9zZXQgQ29sdW1uIHRhYmxlIGVsZW1lbnQgaW4gSmF2YQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJKQVZBX0NPTExFQ1RJT05fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX0NPTExFQ1RJT05fVEFCTEUiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkpBVkFfVEFCTEUiKTsJCi0JCWFzc2VydEVxdWFscygiSkFWQV9UQUJMRSIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQkvL21ha2UgbmFtZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBub3QgZGVmYXVsdAotCQlhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCXZpcnR1YWxDb2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIHZpcnR1YWxDb2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwkJCi0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDAsIDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDIsIDApOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMCwgMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdOb1VuZGVyeWxpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldE5hbWUoImZvbyIpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCi0JCQotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZTIgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlMyA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQkvL2VtYmVkZGVkIG1hcHBpbmcgaXMgdmlydHVhbCwgc3BlY2lmaWVkIGF0dHJpYnV0ZSBvdmVycmlkZXMgc2hvdWxkIGV4aXN0Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbE92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJQ29sdW1uIGphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbiA9IGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldENvbHVtbigpOwotCQkKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPT19DT0xVTU4iKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJGT09fVEFCTEUiKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0KLQkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRUeXBlMy5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibmFtZSIpLmdldE1hcHBpbmcoKTsKLQkJamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9TVEFURV9DT0xVTU4iKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fQ09MVU1OIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fVEFCTEUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0KLQkJdmlydHVhbE92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NUQVRFX0NPTFVNTiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbE92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbE92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQkKLQkJLy9lbWJlZGRlZCBtYXBwaW5nIGlzIHNwZWNpZmllZCwgdmlydHVhbCBhdHRyaWJ1dGUgb3ZlcnJpZGVzIHNob3VsZCBleGlzdAotCQlwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuYWRkVG9YbWwoKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NUQVRFX0NPTFVNTiIsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgb25lIG9mIHRoZSB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZXMgdG8gc3BlY2lmaWVkLCB2ZXJpZnkgb3RoZXJzIGFyZSBzdGlsbCB2aXJ0dWFsCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcEtleUNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJLy92aXJ0dWFsIGF0dHJpYnV0ZSBpbiBvcm0ueG1sLCBqYXZhIGF0dHJpYnV0ZSBoYXMgbm8gdmFsdWUgQ29sdW1uIGFubm90YXRpb24KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkJCi0JCUNvbHVtbiB2aXJ0dWFsQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIHZpcnR1YWxDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxDb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbENvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfTEVOR1RILCB2aXJ0dWFsQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCB2aXJ0dWFsQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIHZpcnR1YWxDb2x1bW4uZ2V0U2NhbGUoKSk7Ci0JCi0JCS8vc2V0IENvbHVtbiBhbm5vdGF0aW9uIGluIEphdmEKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CQkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig0NSkpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNDYpKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNDcpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fVEFCTEUiLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NSksIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ2KSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDcpLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCi0JCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlLCBvcm0ueG1sIHZpcnR1YWwgY29sdW1uIGlnbm9yZXMgamF2YSBjb2x1bW4gYW5ub3RhdGlvbgotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQkvL25vIGxvbmdlciBhbiBlbGVtZW50IGNvbGxlY3Rpb24gbWFwcGluZwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE51bGxNYXBLZXlDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlDb2x1bW4gb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0KLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJGT09fVEFCTEUiKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDQ1KSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb3JtQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbHVtbi5pc0RlZmF1bHRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgb3JtQ29sdW1uLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgb3JtQ29sdW1uLmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1NDQUxFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBLZXlDb2x1bW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQkvL3ZpcnR1YWwgYXR0cmlidXRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJQ29sdW1uIHZpcnR1YWxDb2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJLy9lbnRpdHkgdGFibGUgc2hvdWxkIGhhdmUgbm8gYWZmZWN0IG9uIHRoZSBjb2xsZWN0aW9uIHRhYmxlIGRlZmF1bHQgbmFtZQotCQkoKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9STV9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCi0JCS8vc2V0IENvbHVtbiB0YWJsZSBlbGVtZW50IGluIEphdmEKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiSkFWQV9DT0xMRUNUSU9OX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9DT0xMRUNUSU9OX1RBQkxFIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiSkFWQV9UQUJMRSIpOwkKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX1RBQkxFIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQkvL21ha2UgbmFtZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBub3QgZGVmYXVsdAotCQlhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCXZpcnR1YWxDb2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCB2aXJ0dWFsQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VsZlJlZmVyZW50aWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVNlbGZSZWZlcmVudGlhbEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRm9vIik7Ci0KLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZWxlbWVudENvbGxlY3Rpb24iKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG1hcHBpbmcuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nTmFtZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCQkJCQotCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLnNldE1hcEtleUVudW1lcmF0ZWQob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5PUkRJTkFMKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLk9SRElOQUwsICgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLk9SRElOQUwsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5zZXRNYXBLZXlFbnVtZXJhdGVkKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuU1RSSU5HKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuU1RSSU5HLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0KLQkJLy9zZXQgZW51bWVyYXRlZCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLnNldE1hcEtleUVudW1lcmF0ZWQobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkRW51bWVyYXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihCYXNlRW51bWVyYXRlZENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkRW51bVR5cGUoRW51bVR5cGUuT1JESU5BTCk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLk9SRElOQUwsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLk9SRElOQUwsICgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCi0JCSgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkRW51bVR5cGUoRW51bVR5cGUuU1RSSU5HKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuU1RSSU5HLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0KLQkJLy9zZXQgZW51bWVyYXRlZCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQkJCQotCQkvL3NldCB0ZW1wb3JhbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5zZXRNYXBLZXlUZW1wb3JhbChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCAoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLnNldE1hcEtleVRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLnNldE1hcEtleVRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRVNUQU1QLCAoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVAsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0KLQkJLy9zZXQgdGVtcG9yYWwgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5zZXRNYXBLZXlUZW1wb3JhbChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQkJCQotCQkvL3NldCB0ZW1wb3JhbCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLkRBVEUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCAoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCi0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQotCQkvL3NldCB0ZW1wb3JhbCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4yID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcubW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcubW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXlKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLm1vdmUoMiwgMCk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkubW92ZSgwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUVtYmVkZGVkTWFwcGluZzJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nMl8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODczMGYyMC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nMl8wVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuUmVhZE9ubHlPdmVycmlkZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LlZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nMl8wVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX05BTUUgPSAiY2l0eSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSA9ICJFX0NJVFkiOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERBQkxFX1RZUEVfTkFNRSA9ICJNeUVtYmVkZGFibGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBFTUJFRERBQkxFX1RZUEVfTkFNRTsKLQotCXB1YmxpYyBHZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuRU1CRURERUQsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIsIGNvbHVtbj1AQ29sdW1uKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9OQU1FICsgIlwiKSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkVNQkVEREVELCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgRU1CRUREQUJMRV9UWVBFX05BTUUgKyAiIG15RW1iZWRkZWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW1iZWRkYWJsZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5PTkVfVE9fT05FKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk9ORV9UT19NQU5ZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKEVNQkVEREFCTEVfVFlQRV9OQU1FKS5hcHBlbmQoIiB7Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgRU1CRUREQUJMRV9UWVBFX05BTUUgKyAiLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQWRkcmVzc0VudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzIEFkZHJlc3MgeyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5DT0xVTU4pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQ29sdW1uKG5hbWU9XCJBX1NUQVRFXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eUN1c3RvbWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQ3VzdG9tZXIiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkN1c3RvbWVyLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHN0cmVldDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBaaXBDb2RlIHppcENvZGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJaaXBDb2RlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgcGx1c2ZvdXI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJaaXBDb2RlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWxmUmVmZXJlbnRpYWxFbWJlZGRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJGb28iKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEZvbyBlbWJlZGRlZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJGb28uamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVtYmVkZGVkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW1iZWRkZWRSZXNvdXJjZS5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBlbWJlZGRlZFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW1iZWRkZWRSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGVkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVtYmVkZGVkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtRW1iZWRkZWRNYXBwaW5nLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVtYmVkZGVkTWFwcGluZy5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGVkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkTWFwcGluZyIpOwotLy8JCU9ybUVtYmVkZGVkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLS8vCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0vLwkJCi0vLwkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1FbWJlZGRlZE1hcHBpbmcuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7Ci0vLwkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0vLwkJCQkKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUyID0gb3JtRW1iZWRkZWRNYXBwaW5nLmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDApOwotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlMi5zZXROYW1lKCJCQVIiKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotLy8JCQotLy8JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlMyA9IG9ybUVtYmVkZGVkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgxKTsKLS8vCQlhdHRyaWJ1dGVPdmVycmlkZTMuc2V0TmFtZSgiQkFaIik7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKGF0dHJpYnV0ZU92ZXJyaWRlMiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKGF0dHJpYnV0ZU92ZXJyaWRlMywgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKGF0dHJpYnV0ZU92ZXJyaWRlLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKTsKLS8vCQkKLS8vCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotLy8JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRNYXBwaW5nIik7Ci0vLwkJT3JtRW1iZWRkZWRNYXBwaW5nIG9ybUVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotLy8JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLS8vCi0vLwkJb3JtRW1iZWRkZWRNYXBwaW5nLmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDApLnNldE5hbWUoIkZPTyIpOwotLy8JCW9ybUVtYmVkZGVkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgxKS5zZXROYW1lKCJCQVIiKTsKLS8vCQlvcm1FbWJlZGRlZE1hcHBpbmcuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMikuc2V0TmFtZSgiQkFaIik7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKDMsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLS8vCQkKLS8vCQlvcm1FbWJlZGRlZE1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotLy8KLS8vCQlvcm1FbWJlZGRlZE1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDEsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJb3JtRW1iZWRkZWRNYXBwaW5nLnJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDApOwotLy8JCWFzc2VydEVxdWFscygwLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRW1iZWRkZWRNYXBwaW5nIG9ybUVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9ybUVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCi0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCQotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsJCQotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCQotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQkKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDIsIDApOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMCwgMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNYXBwaW5nTm9VbmRlcnlsaW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKSwgTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT3JtRW1iZWRkZWRNYXBwaW5nIG9ybUVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvcm1FbWJlZGRlZE1hcHBpbmcuc2V0TmFtZSgiZm9vIik7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwotCi0JCQotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmdBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlMiA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJCi0JCS8vZW1iZWRkZWQgbWFwcGluZyBpcyB2aXJ0dWFsLCBzcGVjaWZpZWQgYXR0cmlidXRlIG92ZXJyaWRlcyBzaG91bGQgZXhpc3QKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGphdmFFbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJQ29sdW1uIGphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbiA9IGphdmFFbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRDb2x1bW4oKTsKLQkJCi0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT09fQ09MVU1OIik7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCi0JCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50VHlwZTIuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInN0YXRlIikuZ2V0TWFwcGluZygpOwotCQlqYXZhQmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk1ZX1NUQVRFX0NPTFVNTiIpOwotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPT19DT0xVTU4iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPT19UQUJMRSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TVEFURV9DT0xVTU4iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQkKLQkJCi0JCS8vZW1iZWRkZWQgbWFwcGluZyBpcyBzcGVjaWZpZWQsIHZpcnR1YWwgYXR0cmlidXRlIG92ZXJyaWRlcyBzaG91bGQgZXhpc3QKLQkJcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5hZGRUb1htbCgpOwotCQllbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NUQVRFX0NPTFVNTiIsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBvbmUgb2YgdGhlIHZpcnR1YWwgYXR0cmlidXRlIG92ZXJyaWRlcyB0byBzcGVjaWZpZWQsIHZlcmlmeSBvdGhlcnMgYXJlIHN0aWxsIHZpcnR1YWwKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmdBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyB2aXJ0dWFsRW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IHZpcnR1YWxFbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQotCQlSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlIG92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9OQU1FLCBvdmVycmlkZS5nZXROYW1lKCkpOwotCQlSZWFkT25seUNvbHVtbiBjb2x1bW4gPSBvdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSwgY29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCW92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkZS5nZXROYW1lKCkpOwotCQljb2x1bW4gPSBvdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGNvbHVtbi5nZXROYW1lKCkpOwotCi0JCW92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBvdmVycmlkZS5nZXROYW1lKCkpOwotCQljb2x1bW4gPSBvdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJBX1NUQVRFIiwgY29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJb3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBvdmVycmlkZS5nZXROYW1lKCkpOwotCQljb2x1bW4gPSBvdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgdmlydHVhbEVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwotCi0JCS8vVE9ETwotLy8JCWFzc2VydEVxdWFscyg0LCBvcm1FbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtRW1iZWRkZWRNYXBwaW5nLmRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXMoKSkpOwotLy8JCUxpc3RJdGVyYXRvcjxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gb3JtQXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8KLS8vCQlYbWxBdHRyaWJ1dGVPdmVycmlkZSBvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9OQU1FLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCVhtbENvbHVtbiB4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgeG1sQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFIiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNiksIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDcpLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0vLwkJCi0vLwkJb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCXhtbENvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCi0vLwkJb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygic3RhdGUiLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCXhtbENvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotLy8JCWFzc2VydEVxdWFscygic3RhdGUiLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCi0vLwkJb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiemlwIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoInppcCIsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJLy9UT0RPCi0vLwkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUVtYmVkZGVkTWFwcGluZy5kZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCkpKTsKLS8vCQlMaXN0SXRlcmF0b3I8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkTWFwcGluZy5kZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0vLwotLy8JCVhtbEF0dHJpYnV0ZU92ZXJyaWRlIG9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX05BTUUsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJWG1sQ29sdW1uIHhtbENvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotLy8JCWFzc2VydEVxdWFscygiY2l0eSIsIHhtbENvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgeG1sQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFIiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNiksIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDcpLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0vLwkJCi0vLwkJb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCXhtbENvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCB4bWxDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwotLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgeG1sQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotLy8KLS8vCQlvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCXhtbENvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotLy8JCWFzc2VydEVxdWFscygiemlwIiwgeG1sQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmdBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkTW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZ0F0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmdBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKChFbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygib3ZlcnJpZGUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk9WRVJSSURFX0NPTFVNTiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZ0F0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkTW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZ0F0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIiksIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMSwgYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0KLQkJYXNzb2NpYXRpb25PdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgwLCBhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVoiKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm1vdmUoMSwgMCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQllbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSAoKFZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwKSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlWaXJ0dWFsSm9pbkNvbHVtbiB2aXJ0dWFsSm9pbkNvbHVtbiA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHZpcnR1YWxKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxKb2luQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJCi0KLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFFbWJlZGRhYmxlID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgamF2YUVtYmVkZGFibGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fQ09MVU1OIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIk1ZX1JFRkVSRU5DRV9DT0xVTU4iKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWpvaW5pbmdTdHJhdGVneSA9ICgoVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXApIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5pbmdTdHJhdGVneS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQl2aXJ0dWFsSm9pbkNvbHVtbiA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fQ09MVU1OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9SRUZFUkVOQ0VfQ09MVU1OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxKb2luQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNOdWxsYWJsZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fQ09MVU1OIiwgam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQllbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQllbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDAsIGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJCi0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0KLQkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQllbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoImJhciIpOwkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIiksIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIiksIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBlbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBlbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7Ci0KLQkJSXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIiksIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0KLQkJCi0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBlbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMSwgMCk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0KLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDAsIDEpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCBlbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIiksIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkKLQkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQllbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDAsIGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQllbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDEsIGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQllbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDIsIGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOwotCQkJCi0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm1vdmUoMiwgMCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm1vdmUoMCwgMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQllbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVJc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKSwgTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZURlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FXyArICJBZGRyZXNzIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIiksIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IENvbGxlY3Rpb25Ub29scy5nZXQob3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLCAxKTsKLQkJVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSA9ICgoVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwMl8wKSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKTsKLQkJUmVhZE9ubHlKb2luVGFibGUgam9pblRhYmxlID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlX0FkZHJlc3MiLCBqb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCVJlYWRPbmx5Sm9pbkNvbHVtbiB2aXJ0dWFsSm9pbkNvbHVtbiA9IGpvaW5UYWJsZS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZV9pZCIsIHZpcnR1YWxKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVfQWRkcmVzcyIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxKb2luQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJUmVhZE9ubHlKb2luQ29sdW1uIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbiA9IGpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfaWQiLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVfQWRkcmVzcyIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhRW1iZWRkYWJsZSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIGphdmFFbWJlZGRhYmxlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5UYWJsZVN0cmF0ZWd5ID0gb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpOwotCQlqb2luVGFibGVTdHJhdGVneS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5UYWJsZVN0cmF0ZWd5LmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9DT0xVTU4iKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiTVlfUkVGRVJFTkNFX0NPTFVNTiIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gam9pblRhYmxlU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIk1ZX0lOVkVSU0VfSk9JTl9DT0xVTU4iKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIk1ZX0lOVkVSU0VfUkVGRVJFTkNFX0NPTFVNTiIpOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiSU5WRVJTRV9CQVIiKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiSU5WRVJTRV9DT0xVTU5fREVGIik7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IENvbGxlY3Rpb25Ub29scy5nZXQob3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLCAxKTsKLQkJam9pbmluZ1N0cmF0ZWd5ID0gKChWaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzApIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpOwotCQlqb2luVGFibGUgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCXZpcnR1YWxKb2luQ29sdW1uID0gam9pblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1JFRkVSRU5DRV9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc051bGxhYmxlKCkpOwotCi0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJdmlydHVhbEludmVyc2VKb2luQ29sdW1uID0gam9pblRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0lOVkVSU0VfSk9JTl9DT0xVTU4iLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9JTlZFUlNFX1JFRkVSRU5DRV9DT0xVTU4iLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiSU5WRVJTRV9CQVIiLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiSU5WRVJTRV9DT0xVTU5fREVGIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0KLQkJCi0JCS8vYWRkIHRoZSBqYXZhIGFzc29jaWF0aW9uIG92ZXJyaWRlIGFuZCBtYWtlIHN1cmUgdGhlIHNldHRpbmdzIGFyZSBub3QgdXNlZCBpbiBkZXRlcm1pbmluZyB0aGUgYXNzb2NpYXRpb24gb3ZlcnJpZGUgZGVmYXVsdHMgaW4gdGhlIHNwZWNpZmllZCBvcm0gZW1iZWRkZWQgbWFwcGluZwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nMl8wIGphdmFFbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlPiBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMgPSBqYXZhRW1iZWRkZWRNYXBwaW5nLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKS5nZXRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9ICgoSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlKYXZhSm9pblRhYmxlIGphdmFKb2luVGFibGUgPSAoKEphdmFPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCkgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWphdmFKb2luVGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiSkFWQV9GT08iKTsKLQkJSmF2YUpvaW5Db2x1bW4gamF2YUpvaW5Db2x1bW4gPSBqYXZhSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkpBVkFfSk9JTl9DT0xVTU5fTkFNRSIpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiSkFWQV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX05BTUUiKTsKLQkJSmF2YUpvaW5Db2x1bW4gamF2YUludmVyc2VKb2luQ29sdW1uID0gamF2YUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJamF2YUludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkpBVkFfSU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FIik7Ci0JCWphdmFJbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiSkFWQV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfTkFNRSIpOwotCQkKLQotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IENvbGxlY3Rpb25Ub29scy5nZXQob3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLCAxKTsKLQkJam9pbmluZ1N0cmF0ZWd5ID0gKChWaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzApIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpOwotCQlqb2luVGFibGUgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX1RBQkxFIiwgam9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQl2aXJ0dWFsSm9pbkNvbHVtbiA9IGpvaW5UYWJsZS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX0NPTFVNTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfUkVGRVJFTkNFX0NPTFVNTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxKb2luQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxKb2luQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQl2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4gPSBqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTVlfSU5WRVJTRV9KT0lOX0NPTFVNTiIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0lOVkVSU0VfUkVGRVJFTkNFX0NPTFVNTiIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlZFUlNFX0JBUiIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlZFUlNFX0NPTFVNTl9ERUYiLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJCi0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5yZW1vdmVGcm9tWG1sKCk7Ci0JCUVtYmVkZGVkTWFwcGluZzJfMCB2aXJ0dWFsRW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyID0gdmlydHVhbEVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBzdHJhdGVneSA9ICgoUmVhZE9ubHlPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCkgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKTsKLQkJam9pblRhYmxlID0gc3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9GT08iLCBqb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGpvaW5UYWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgUmVhZE9ubHlKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxKb2luQ29sdW1uID0gam9pbkNvbHVtbnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfSk9JTl9DT0xVTU5fTkFNRSIsIHZpcnR1YWxKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX05BTUUiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX0ZPTyIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotCQl2aXJ0dWFsSm9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX0NPTFVNTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfUkVGRVJFTkNFX0NPTFVNTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotCi0JCWFzc2VydEVxdWFscygyLCBqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBSZWFkT25seUpvaW5Db2x1bW4+IGludmVyc2VKb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4gPSBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfSU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfTkFNRSIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX0ZPTyIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJdmlydHVhbEludmVyc2VKb2luQ29sdW1uID0gaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9JTlZFUlNFX0pPSU5fQ09MVU1OIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfSU5WRVJTRV9SRUZFUkVOQ0VfQ09MVU1OIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIklOVkVSU0VfQkFSIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MyKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgY3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQ3VzdG9tZXIiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSB6aXBDb2RlUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7Ci0KLQkJY3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmFkZFRvWG1sKCk7Ci0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBjdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDUsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RyZWV0IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiemlwQ29kZS56aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCQotCQlhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5hZGRUb1htbCgpOwotCQlFbWJlZGRlZE1hcHBpbmcgbmVzdGVkRW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBuZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG5lc3RlZEVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMiwgbmVzdGVkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBuZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQl6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikuYWRkVG9YbWwoKTsKLQkJQmFzaWNNYXBwaW5nIHBsdXNGb3VyTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHppcENvZGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicGx1c2ZvdXIiKS5nZXRNYXBwaW5nKCk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRSIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0KLQkJLy9jaGVjayB0aGUgbmVzdGVkIGVtYmVkZGVkIChBZGRyZXNzLnppcENvZGUpIGF0dHJpYnV0ZSBvdmVycmlkZSB0byB2ZXJpZnkgaXQgaXMgZ2V0dGluZyBzZXR0aW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgY29sdW1uIG9uIFppcGNvZGUucGx1c2ZvdXIKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgKChFbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRPdmVycmlkZU5hbWVkKCJwbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQkvL2NoZWNrIHRoZSB0b3AtbGV2ZWwgZW1iZWRkZWQgKEN1c3RvbWVyLmFkZHJlc3MpIGF0dHJpYnV0ZSBvdmVycmlkZSB0byB2ZXJpZnkgaXQgaXMgZ2V0dGluZyBzZXR0aW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgY29sdW1uIG9uIFppcGNvZGUucGx1c2ZvdXIKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgKChFbWJlZGRlZE1hcHBpbmcpIGN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0T3ZlcnJpZGVOYW1lZCgiemlwQ29kZS5wbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoInppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJLy9zZXQgYW4gYXR0cmlidXRlIG92ZXJyaWRlIG9uIEFkZHJlc3MuemlwQ29kZSBlbWJlZGRlZCBtYXBwaW5nCi0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gKChWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpICgoRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0T3ZlcnJpZGVOYW1lZCgicGx1c2ZvdXIiKSkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUhfT1ZFUlJJREUiKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEVfT1ZFUlJJREUiKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiKTsKLQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgKChFbWJlZGRlZE1hcHBpbmcpIGN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0T3ZlcnJpZGVOYW1lZCgiemlwQ29kZS5wbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoInppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRV9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoInppcENvZGUucGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkvL1RPRE8gSSBoYXZlIHRoZSBkZWZhdWx0IHdyb25nIGluIHRoaXMgY2FzZSwgYnV0IHRoaXMgd2FzIHdyb25nIGJlZm9yZSBhcyB3ZWxsLiAgTmVlZCB0byBmaXggdGhpcyBsYXRlcgotLy8JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkN1c3RvbWVyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlbGZSZWZlcmVudGlhbEVtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVTZWxmUmVmZXJlbnRpYWxFbWJlZGRlZCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkZvbyIpOwotCi0JCUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nMl8wKSBwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUVudGl0eTJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRW50aXR5Ml8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5NTViOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRW50aXR5Ml8wVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZUhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkxvY2tNb2RlVHlwZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1OYW1lZFF1ZXJ5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1FbnRpdHkyXzBUZXN0cyBleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQl9UWVBFX05BTUUgPSAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FID0gUEFDS0FHRV9OQU1FICsgIi4iICsgU1VCX1RZUEVfTkFNRTsKLQkKLQkKLQlwdWJsaWMgR2VuZXJpY09ybUVudGl0eTJfMFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEpQQS5PTkVfVE9fT05FLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5PTkVfVE9fTUFOWSwgSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JTkhFUklUQU5DRSwgSlBBLklOSEVSSVRBTkNFX1RZUEUsIEpQQS5PTkVfVE9fT05FLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5PTkVfVE9fTUFOWSwgSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJASW5oZXJpdGFuY2Uoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUykiKTsKLQkJCQlzYi5hcHBlbmQoImFic3RyYWN0Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgicHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQ3VzdG9tZXIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJDdXN0b21lci5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXJXaXRoRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQ3VzdG9tZXIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQ3VzdG9tZXIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkxvbmdUaW1lQ3VzdG9tZXIgZXh0ZW5kcyBDdXN0b21lciAiKTsKLQkJCQlzYi5hcHBlbmQoInt9Iik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiTG9uZ1RpbWVDdXN0b21lci5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuT05FX1RPX09ORSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHN0cmVldDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgWmlwQ29kZSB6aXBDb2RlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiWmlwQ29kZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHBsdXNmb3VyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiWmlwQ29kZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMb2NrTW9kZVR5cGUyXzAgbG9ja01vZGVPZihYbWxOYW1lZFF1ZXJ5IHJlc291cmNlUXVlcnkpIHsKLQkJcmV0dXJuIHJlc291cmNlUXVlcnkgPT0gbnVsbCA/IG51bGwgOiBMb2NrTW9kZVR5cGUyXzAuZnJvbU9ybVJlc291cmNlTW9kZWwocmVzb3VyY2VRdWVyeS5nZXRMb2NrTW9kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTmFtZWRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCU9ybU5hbWVkUXVlcnkyXzAgbmFtZWRRdWVyeSA9IChPcm1OYW1lZFF1ZXJ5Ml8wKSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwotCQkJbmFtZWRRdWVyeS5zZXROYW1lKCJGT08iKTsKLQkJCW5hbWVkUXVlcnkuc2V0U3BlY2lmaWVkTG9ja01vZGUoTG9ja01vZGVUeXBlMl8wLk9QVElNSVNUSUMpOwotCQkJCi0JCVhtbE5hbWVkUXVlcnkgcmVzb3VyY2VRdWVyeSA9IGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgwKTsKLQkJCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VRdWVyeS5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDLCB0aGlzLmxvY2tNb2RlT2YocmVzb3VyY2VRdWVyeSkpOwotCQkKLQkJT3JtTmFtZWRRdWVyeTJfMCBuYW1lZFF1ZXJ5MiA9IChPcm1OYW1lZFF1ZXJ5Ml8wKSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwotCQkJbmFtZWRRdWVyeTIuc2V0TmFtZSgiQkFSIik7Ci0JCQluYW1lZFF1ZXJ5Mi5zZXRTcGVjaWZpZWRMb2NrTW9kZShMb2NrTW9kZVR5cGUyXzAuUkVBRCk7Ci0KLQkJcmVzb3VyY2VRdWVyeSA9IGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgwKTsKLQkJCWFzc2VydEVxdWFscygiQkFSIiwgcmVzb3VyY2VRdWVyeS5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKExvY2tNb2RlVHlwZTJfMC5SRUFELCB0aGlzLmxvY2tNb2RlT2YocmVzb3VyY2VRdWVyeSkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtTmFtZWRRdWVyeTJfMCBuYW1lZFF1ZXJ5MyA9IChPcm1OYW1lZFF1ZXJ5Ml8wKSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDEpOwotCQkJbmFtZWRRdWVyeTMuc2V0TmFtZSgiQkFaIik7Ci0JCQluYW1lZFF1ZXJ5My5zZXRTcGVjaWZpZWRMb2NrTW9kZShMb2NrTW9kZVR5cGUyXzAuV1JJVEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJcmVzb3VyY2VRdWVyeSA9IGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgxKTsKLQkJCWFzc2VydEVxdWFscygiQkFaIiwgcmVzb3VyY2VRdWVyeS5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKExvY2tNb2RlVHlwZTJfMC5XUklURSwgdGhpcy5sb2NrTW9kZU9mKHJlc291cmNlUXVlcnkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1OYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMobmFtZWRRdWVyeTIsIG5hbWVkUXVlcmllcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMobmFtZWRRdWVyeTMsIG5hbWVkUXVlcmllcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMobmFtZWRRdWVyeSwgbmFtZWRRdWVyaWVzLm5leHQoKSk7Ci0JCQotCQluYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTmFtZWRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCi0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCU9ybU5hbWVkUXVlcnkyXzAgbmFtZWRRdWVyeTEgPSAoT3JtTmFtZWRRdWVyeTJfMCkgb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgxKTsKLQkJCW5hbWVkUXVlcnkxLnNldE5hbWUoIkJBUiIpOwotCQkJbmFtZWRRdWVyeTEuc2V0U3BlY2lmaWVkTG9ja01vZGUoTG9ja01vZGVUeXBlMl8wLlJFQUQpOwotCQotCQkJT3JtTmFtZWRRdWVyeTJfMCBuYW1lZFF1ZXJ5MiA9IChPcm1OYW1lZFF1ZXJ5Ml8wKSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDIpOwotCQkJbmFtZWRRdWVyeTIuc2V0TmFtZSgiQkFaIik7Ci0JCQluYW1lZFF1ZXJ5Mi5zZXRTcGVjaWZpZWRMb2NrTW9kZShMb2NrTW9kZVR5cGUyXzAuT1BUSU1JU1RJQyk7Ci0JCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygzLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5zaXplKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkucmVtb3ZlTmFtZWRRdWVyeSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLnNpemUoKSk7Ci0JCVhtbE5hbWVkUXVlcnkgeG1sUXVlcnkwID0gZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApOwotCQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxRdWVyeTAuZ2V0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuUkVBRCwgdGhpcy5sb2NrTW9kZU9mKHhtbFF1ZXJ5MCkpOwotCQotCQlYbWxOYW1lZFF1ZXJ5IHhtbFF1ZXJ5MSA9IGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgxKTsKLQkJCWFzc2VydEVxdWFscygiQkFaIiwgeG1sUXVlcnkxLmdldE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoTG9ja01vZGVUeXBlMl8wLk9QVElNSVNUSUMsIHRoaXMubG9ja01vZGVPZih4bWxRdWVyeTEpKTsKLQotCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5yZW1vdmVOYW1lZFF1ZXJ5KDApOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJeG1sUXVlcnkwID0gZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApOwotCQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB4bWxRdWVyeTAuZ2V0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuT1BUSU1JU1RJQywgdGhpcy5sb2NrTW9kZU9mKHhtbFF1ZXJ5MCkpOwotCQkKLQkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkucmVtb3ZlTmFtZWRRdWVyeSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTmFtZWRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCi0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCU9ybU5hbWVkUXVlcnkyXzAgbmFtZWRRdWVyeTEgPSAoT3JtTmFtZWRRdWVyeTJfMCkgb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgxKTsKLQkJCW5hbWVkUXVlcnkxLnNldE5hbWUoIkJBUiIpOwotCQkJbmFtZWRRdWVyeTEuc2V0U3BlY2lmaWVkTG9ja01vZGUoTG9ja01vZGVUeXBlMl8wLk9QVElNSVNUSUMpOwotCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubW92ZU5hbWVkUXVlcnkoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1OYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQluYW1lZFF1ZXJ5MSA9IChPcm1OYW1lZFF1ZXJ5Ml8wKSBuYW1lZFF1ZXJpZXMubmV4dCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5MS5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDLCBuYW1lZFF1ZXJ5MS5nZXRMb2NrTW9kZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCVhtbE5hbWVkUXVlcnkgeG1sUXVlcnkwID0gZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApOwotCQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxRdWVyeTAuZ2V0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuT1BUSU1JU1RJQywgdGhpcy5sb2NrTW9kZU9mKHhtbFF1ZXJ5MCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubW92ZU5hbWVkUXVlcnkoMCwgMSk7Ci0JCW5hbWVkUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQluYW1lZFF1ZXJ5MSA9IChPcm1OYW1lZFF1ZXJ5Ml8wKSBuYW1lZFF1ZXJpZXMubmV4dCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5MS5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDLCBuYW1lZFF1ZXJ5MS5nZXRMb2NrTW9kZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJWG1sTmFtZWRRdWVyeSB4bWxRdWVyeTEgPSBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSk7Ci0JCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHhtbFF1ZXJ5MS5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDLCB0aGlzLmxvY2tNb2RlT2YoeG1sUXVlcnkxKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lZFF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWRRdWVyeSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkUXVlcnkoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZFF1ZXJ5KCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJWG1sTmFtZWRRdWVyeSB4bWxRdWVyeSA9IGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgyKTsKLQkJCXhtbFF1ZXJ5LnNldE5hbWUoIkJBWiIpOwotCQkJeG1sUXVlcnkuc2V0TG9ja01vZGUob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkxvY2tNb2RlVHlwZV8yXzAuT1BUSU1JU1RJQyk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlPcm1OYW1lZFF1ZXJ5Ml8wIG5hbWVkUXVlcnkxID0gKE9ybU5hbWVkUXVlcnkyXzApIG5hbWVkUXVlcmllcy5uZXh0KCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkxLmdldE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoTG9ja01vZGVUeXBlMl8wLk9QVElNSVNUSUMsIG5hbWVkUXVlcnkxLmdldExvY2tNb2RlKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLm1vdmUoMiwgMCk7Ci0JCW5hbWVkUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQluYW1lZFF1ZXJ5MSA9IChPcm1OYW1lZFF1ZXJ5Ml8wKSBuYW1lZFF1ZXJpZXMubmV4dCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5MS5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDLCBuYW1lZFF1ZXJ5MS5nZXRMb2NrTW9kZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkubW92ZSgwLCAxKTsKLQkJbmFtZWRRdWVyaWVzID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJbmFtZWRRdWVyeTEgPSAoT3JtTmFtZWRRdWVyeTJfMCkgbmFtZWRRdWVyaWVzLm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeTEuZ2V0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuT1BUSU1JU1RJQywgbmFtZWRRdWVyeTEuZ2V0TG9ja01vZGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5yZW1vdmUoMSk7Ci0JCW5hbWVkUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCW5hbWVkUXVlcnkxID0gKE9ybU5hbWVkUXVlcnkyXzApIG5hbWVkUXVlcmllcy5uZXh0KCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkxLmdldE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoTG9ja01vZGVUeXBlMl8wLk9QVElNSVNUSUMsIG5hbWVkUXVlcnkxLmdldExvY2tNb2RlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5yZW1vdmUoMSk7Ci0JCW5hbWVkUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCW5hbWVkUXVlcnkxID0gKE9ybU5hbWVkUXVlcnkyXzApIG5hbWVkUXVlcmllcy5uZXh0KCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkxLmdldE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoTG9ja01vZGVUeXBlMl8wLk9QVElNSVNUSUMsIG5hbWVkUXVlcnkxLmdldExvY2tNb2RlKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCU9ybUVudGl0eSBlbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGVudGl0eS5nZXRPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQkKLQkJZW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUyk7Ci0JCQotCQlvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBlbnRpdHkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBlbnRpdHkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQllbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJCi0JCW92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBlbnRpdHkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gb3JtRW50aXR5LmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlPcm1FbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1FbnRpdHkuZ2V0UGFyZW50RW50aXR5KCk7Ci0JCW92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGFic3RyYWN0RW50aXR5LmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBvcm1FbnRpdHkuZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlPcm1FbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1FbnRpdHkuZ2V0UGFyZW50RW50aXR5KCk7Ci0JCW92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gYWJzdHJhY3RFbnRpdHkuZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKLQl9Ci0vL1RPRE8KLS8vCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXNNYXBwZWRTdXBlcmNsYXNzSW5Pcm1YbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotLy8JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0vLwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotLy8JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJCi0vLwkJSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLmFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotLy8JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBvcm1FbnRpdHkuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDEsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZCgwLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkJBWiIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMSwgMCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0KLQkJT3JtTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE9ybU1hcHBlZFN1cGVyY2xhc3MpIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQltYXBwZWRTdXBlcmNsYXNzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuYWRkVG9YbWwoKTsKLQkJQmFzaWNNYXBwaW5nIGlkTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG1hcHBlZFN1cGVyY2xhc3MuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCi0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXNFbnRpdHlIaWVyYWNoeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0KLQkJT3JtRW50aXR5IHN1cGVyY2xhc3MgPSAoT3JtRW50aXR5KSBvcm1FbnRpdHkuZ2V0UGFyZW50RW50aXR5KCk7Ci0JCQotCQlzdXBlcmNsYXNzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuYWRkVG9YbWwoKTsKLQkJQmFzaWNNYXBwaW5nIGlkTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHN1cGVyY2xhc3MuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCi0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygzLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygibmFtZSIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCQkKLQkJSXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCQkKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygibmFtZSIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMCwgMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZCgxLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoMiwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgyLCAwKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMCwgMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVJc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkKLQkJT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gZW50aXR5LmdldE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLS8vCS8vVE9ETyBhZGQgYWxsIG1hcHBpbmcgdHlwZXMgdG8gdGhlIG1hcHBlZCBzdXBlcmNsYXNzIHRvIHRlc3Qgd2hpY2ggb25lcyBhcmUgb3ZlcnJpZGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcyA9IG9ybUVudGl0eS5nZXRBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBvcm1FbnRpdHkuZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMCwgeG1sQXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDEsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDAsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm1vdmUoMSwgMCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgZW50aXR5UmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRUcnVlKGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuaXNFbXB0eSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotLy8KLS8vCQkvL01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0vLwkJLy9CYXNpY01hcHBpbmcgaWRNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgbWFwcGVkU3VwZXJjbGFzcy5wZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLS8vCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLS8vCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGVudGl0eVJlc291cmNlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLS8vCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCi0vLwkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLS8vCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLS8vCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLS8vCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJCi0vLwkJLy9UT0RPIGpvaW5Db2x1bW5zIGZvciBkZWZhdWx0IGFzc29jaWF0aW9uIG92ZXJyaWRlcwotLy8vLwlJSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IGRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwkKLS8vLy8KLS8vLy8JSU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChJTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotLy8vLwkKLS8vLy8JSU9uZVRvT25lTWFwcGluZyBhZGRyZXNzTWFwcGluZyA9IChJT25lVG9PbmVNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLnBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0vLy8vCUlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBhZGRyZXNzTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJCQVIiKTsKLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFaIik7Ci0vLy8vCQotLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydE51bGwodHlwZVJlc291cmNlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZS5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8JYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlcy5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8KLS8vLy8JYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKLS8vLy8JZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkJBWiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0vLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwotLy8vLwlkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwkKLS8vLy8JamF2YUVudGl0eS5hZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDApLnNldE5hbWUoImFkZHJlc3MiKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJLy9hZGQgdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscyg1LCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQotCQlJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDEsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0KLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDAsIDEpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgxLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMiwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubW92ZSgyLCAwKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm1vdmUoMCwgMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVJc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCi0JCU9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0KLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Mb25nVGltZUN1c3RvbWVyIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgemlwQ29kZVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuWmlwQ29kZSIpOwotCi0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChPcm1FbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdHJlZXQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5jaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS56aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMb25nVGltZUN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCQotCQl6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikuYWRkVG9YbWwoKTsKLQkJQmFzaWNNYXBwaW5nIHBsdXNGb3VyTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHppcENvZGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicGx1c2ZvdXIiKS5nZXRNYXBwaW5nKCk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRSIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKE9ybUVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJLy9jaGVjayB0aGUgdG9wLWxldmVsIGVtYmVkZGVkIChDdXN0b21lci5hZGRyZXNzKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IGl0IGlzIGdldHRpbmcgc2V0dGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvbiBaaXBjb2RlLnBsdXNmb3VyCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlTmFtZWQoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkvL3NldCBhbiBhdHRyaWJ1dGUgb3ZlcnJpZGUgb24gQWRkcmVzcy56aXBDb2RlIGVtYmVkZGVkIG1hcHBpbmcKLQkJYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuYWRkVG9YbWwoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSAoKE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgKChPcm1FbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRPdmVycmlkZU5hbWVkKCJwbHVzZm91ciIpKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSF9PVkVSUklERSIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRV9PVkVSUklERSIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKE9ybUVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVOYW1lZCgiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEVfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkvL1RPRE8gSSBoYXZlIHRoZSBkZWZhdWx0IHdyb25nIGluIHRoaXMgY2FzZSwgYnV0IHRoaXMgd2FzIHdyb25nIGJlZm9yZSBhcyB3ZWxsLiAgTmVlZCB0byBmaXggdGhpcyBsYXRlcgotLy8JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkN1c3RvbWVyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcldpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQljcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBjdXN0b21lclBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHppcENvZGVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoT3JtRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDYsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8T3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCU9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Muc3RyZWV0IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUuemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxvbmdUaW1lQ3VzdG9tZXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQkKLQkJemlwQ29kZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwbHVzZm91ciIpLmFkZFRvWG1sKCk7Ci0JCUJhc2ljTWFwcGluZyBwbHVzRm91ck1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSB6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikuZ2V0TWFwcGluZygpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEUiKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChPcm1FbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCS8vY2hlY2sgdGhlIHRvcC1sZXZlbCBlbWJlZGRlZCAoQ3VzdG9tZXIuYWRkcmVzcykgYXR0cmlidXRlIG92ZXJyaWRlIHRvIHZlcmlmeSBpdCBpcyBnZXR0aW5nIHNldHRpbmdzIGZyb20gdGhlIHNwZWNpZmllZCBjb2x1bW4gb24gWmlwY29kZS5wbHVzZm91cgotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZU5hbWVkKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJLy9zZXQgYW4gYXR0cmlidXRlIG92ZXJyaWRlIG9uIEFkZHJlc3MuemlwQ29kZSBlbWJlZGRlZCBtYXBwaW5nCi0JCWFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmFkZFRvWG1sKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gKChPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpICgoT3JtRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0T3ZlcnJpZGVOYW1lZCgicGx1c2ZvdXIiKSkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUhfT1ZFUlJJREUiKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEVfT1ZFUlJJREUiKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiKTsKLQotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChPcm1FbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlTmFtZWQoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJLy9UT0RPIEkgaGF2ZSB0aGUgZGVmYXVsdCB3cm9uZyBpbiB0aGlzIGNhc2UsIGJ1dCB0aGlzIHdhcyB3cm9uZyBiZWZvcmUgYXMgd2VsbC4gIE5lZWQgdG8gZml4IHRoaXMgbGF0ZXIKLS8vCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJDdXN0b21lciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRV9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQ3VzdG9tZXIiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Mb25nVGltZUN1c3RvbWVyIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuWmlwQ29kZSIpOwotCi0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKE9ybUVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8T3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdGF0ZSIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc0VsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXJXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gKChPcm1FbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Muc3RhdGUiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVudGl0eVJlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVudGl0eVJlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2Uuc2V0Q2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVudGl0eVJlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2Uuc2V0Q2FjaGVhYmxlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVudGl0eVJlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSAoUGVyc2lzdGVuY2VVbml0Ml8wKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJYXNzZXJ0RXF1YWxzKFNoYXJlZENhY2hlTW9kZS5VTlNQRUNJRklFRCwgcGVyc2lzdGVuY2VVbml0Ml8wLmdldFNoYXJlZENhY2hlTW9kZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuQUxMKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0KLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZUZyb21TdXBlclR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBzdWJPcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBzdWJDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgc3ViT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlQZXJzaXN0ZW5jZVVuaXQyXzAgcGVyc2lzdGVuY2VVbml0Ml8wID0gKFBlcnNpc3RlbmNlVW5pdDJfMCkgZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkJCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlRnJvbUphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBzdWJPcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBzdWJDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgc3ViT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGphdmFDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IChQZXJzaXN0ZW5jZVVuaXQyXzApIGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCQkKLQkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JLy9UaGlzIGlzIGEgdGVzdCBmb3IgYnVnIDMwMTg5MgotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlVXBkYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBlbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAgcmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQlyZXNvdXJjZUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgoWG1sQXNzb2NpYXRpb25PdmVycmlkZSkgcmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJKChYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKSByZXNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGUpLnNldE5hbWUoImEiKTsKLQkJCi0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYSIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCVhtbEpvaW5UYWJsZSByZXNvdXJjZUpvaW5UYWJsZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpOwotCQlyZXNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0Sm9pblRhYmxlKHJlc291cmNlSm9pblRhYmxlKTsKLQkJcmVzb3VyY2VKb2luVGFibGUuc2V0TmFtZSgiRk9PIik7Ci0JCVhtbEpvaW5Db2x1bW4gcmVzb3VyY2VKb2luQ29sdW1uID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpOwotCQlyZXNvdXJjZUpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5hZGQocmVzb3VyY2VKb2luQ29sdW1uKTsKLQkJcmVzb3VyY2VKb2luQ29sdW1uLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSBlbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImEiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSAoKE9ybU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wKSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYW55VG9NYW55TWFwcGluZzJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFueVRvTWFueU1hcHBpbmcyXzBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDhhNTA1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYW55VG9NYW55TWFwcGluZzJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2VFbnVtZXJhdGVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Q29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNlVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLk51bGxPcm1Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYXNjYWRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlckNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybU1hbnlUb01hbnlNYXBwaW5nMl8wVGVzdHMKLQlleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBHZW5lcmljT3JtTWFueVRvTWFueU1hcHBpbmcyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3NXaXRoRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxTdGF0ZT4gc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8U3RyaW5nLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiU3RhdGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5TWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5GRVRDSF9UWVBFLCBKUEEuQ0FTQ0FERV9UWVBFLCBKUEEuT1JERVJfQlksIEpQQTJfMC5NQVBfS0VZX0VOVU1FUkFURUQsIEpQQS5FTlVNX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55KGZldGNoPUZldGNoVHlwZS5FQUdFUiwgdGFyZ2V0RW50aXR5PUFkZHJlc3MuY2xhc3MsIGNhc2NhZGU9e0Nhc2NhZGVUeXBlLkFMTCwgQ2FzY2FkZVR5cGUuUEVSU0lTVCwgQ2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRSwgQ2FzY2FkZVR5cGUuUkVGUkVTSCwgQ2FzY2FkZVR5cGUuREVUQUNIfSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPcmRlckJ5KFwiY2l0eVwiIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFwS2V5RW51bWVyYXRlZChFbnVtVHlwZS5TVFJJTkcpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8U3RyaW5nLCBBZGRyZXNzPiBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXNFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3NXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJbWFueVRvTWFueS5zZXRNYXBLZXkoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChtYW55VG9NYW55LmdldE1hcEtleSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwotCQkKLQkJbWFueVRvTWFueS5nZXRNYXBLZXkoKS5zZXROYW1lKCJteU1hcEtleSIpOwotCQltYW55VG9NYW55LnNldE1hcEtleShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWaXJ0dWFsTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJTWFueVRvTWFueU1hcHBpbmcgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YU1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JCQotCQkvL3NldCBwayBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLnNldFBrTWFwS2V5KHRydWUpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQkJCi0JCQotCQkvL3NldCBjdXN0b20gc3BlY2lmaWVkIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuc2V0Q3VzdG9tTWFwS2V5KHRydWUpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJjaXR5Iik7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgeG1sTWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwoeG1sTWFueVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm15TWFwS2V5Iik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCB4bWxNYW55VG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwoeG1sTWFueVRvTWFueS5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlNYW55VG9NYW55TWFwcGluZyB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlNYW55VG9NYW55TWFwcGluZyB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFNYW55VG9NYW55TWFwcGluZyBqYXZhTWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJ0ZXN0LkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmFkZFRvWG1sKCk7Ci0JCXZpcnR1YWxNYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJbWFwS2V5TmFtZXMgPSB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQl2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJ0ZXN0LkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiU3RyaW5nIik7Ci0JCW1hcEtleU5hbWVzID0gdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZzJfMCBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleUNsYXNzKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCW1hbnlUb01hbnkuc2V0TWFwS2V5Q2xhc3MoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2xhc3NSZWZlcmVuY2UoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE5vdE51bGwobWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKS5zZXRDbGFzc05hbWUoIlN0cmluZyIpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG1hbnlUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYW55VG9NYW55LmdldE1hcEtleUNsYXNzKCkuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQltYW55VG9NYW55LmdldE1hcEtleUNsYXNzKCkuc2V0Q2xhc3NOYW1lKCJTdHJpbmciKTsKLQkJbWFueVRvTWFueS5zZXRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmlydHVhbE1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgamF2YU1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCS8vc2V0IHBrIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoIkludGVnZXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbnRlZ2VyIiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIkludGVnZXIiLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nMl8wIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiU3RyaW5nIik7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgbWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3JkZXJDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRRdWV1ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBwcmludFF1ZXVlUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByaW50UXVldWUiKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBqb2JzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHByaW50UXVldWVQZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChwcmludFF1ZXVlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImpvYnMiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIGpvYnNNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBqb2JzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWpvYnNNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLnNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpOwotCQlqb2JzTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoInF1ZXVlcyIpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHByaW50Sm9iUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByaW50Sm9iIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcXVldWVzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHByaW50Sm9iUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwocHJpbnRKb2JQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicXVldWVzIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBxdWV1ZXNNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBxdWV1ZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlPcmRlcmFibGUyXzAgam9ic09yZGVyYWJsZSA9ICgoT3JkZXJhYmxlMl8wKSBqb2JzTWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCU9yZGVyQ29sdW1uMl8wIGpvYnNPcmRlckNvbHVtbiA9IGpvYnNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2JzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGpvYnNPcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQlPcmRlcmFibGUyXzAgcXVldWVzT3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIHF1ZXVlc01hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlPcmRlckNvbHVtbjJfMCBxdWV1ZXNPcmRlckNvbHVtbiA9IHF1ZXVlc09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHF1ZXVlc09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBxdWV1ZXNPcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCi0JCQotCQlqb2JzT3JkZXJhYmxlLnNldE9yZGVyQ29sdW1uT3JkZXJpbmcodHJ1ZSk7Ci0JCWpvYnNPcmRlckNvbHVtbiA9IGpvYnNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGpvYnNPcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgam9ic09yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiam9ic19PUkRFUiIsIGpvYnNPcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgam9ic09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQlxdWV1ZXNPcmRlcmFibGUuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJcXVldWVzT3JkZXJDb2x1bW4gPSBxdWV1ZXNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHF1ZXVlc09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInF1ZXVlc19PUkRFUiIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCWpvYnNPcmRlckNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2JzT3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgam9ic09yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCXF1ZXVlc09yZGVyQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicXVldWVzX09SREVSIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJCi0JCSgoRW50aXR5KSBwcmludEpvYlBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFX1ByaW50UXVldWUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEVfUHJpbnRRdWV1ZSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJKChFbnRpdHkpIHByaW50UXVldWVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1RIRVJfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRV9PVEhFUl9UQUJMRSIsIGpvYnNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRV9PVEhFUl9UQUJMRSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJcXVldWVzTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX1RBQkxFIiwgam9ic09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fVEFCTEUiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxPcmRlckNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRRdWV1ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBwcmludFF1ZXVlUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByaW50UXVldWUiKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBqb2JzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHByaW50UXVldWVQZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChwcmludFF1ZXVlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImpvYnMiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIGpvYnNNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBqb2JzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgcHJpbnRKb2JQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJpbnRKb2IiKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBxdWV1ZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gcHJpbnRKb2JQZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChwcmludEpvYlBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJxdWV1ZXMiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIHF1ZXVlc01hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIHF1ZXVlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCU9yZGVyYWJsZTJfMCBqb2JzT3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIGpvYnNNYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2JzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGpvYnNPcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQlPcmRlcmFibGUyXzAgcXVldWVzT3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIHF1ZXVlc01hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHF1ZXVlc09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBxdWV1ZXNPcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIGphdmFKb2JzTWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqb2JzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJKChPcmRlcmFibGUyXzApIGphdmFKb2JzTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLnNldE9yZGVyQ29sdW1uT3JkZXJpbmcodHJ1ZSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgam9ic09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqb2JzT3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBxdWV1ZXNPcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcXVldWVzT3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQotCQlqb2JzUGVyc2lzdGVudEF0dHJpYnV0ZS5yZW1vdmVGcm9tWG1sKCk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGpvYnNQZXJzaXN0ZW50QXR0cmlidXRlMiA9IHByaW50UXVldWVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiam9icyIpOwotCQlNYW55VG9NYW55TWFwcGluZyB2aXJ0dWFsSm9ic01hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIGpvYnNQZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCWpvYnNPcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgdmlydHVhbEpvYnNNYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGpvYnNPcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvYnNPcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBqb2JzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiam9ic19PUkRFUiIsIGpvYnNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlxdWV1ZXNQZXJzaXN0ZW50QXR0cmlidXRlLnJlbW92ZUZyb21YbWwoKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcXVldWVzUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBwcmludEpvYlBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJxdWV1ZXMiKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgdmlydHVhbFF1ZXVlc01hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHF1ZXVlc1BlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJcXVldWVzT3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIHZpcnR1YWxRdWV1ZXNNYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHF1ZXVlc09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcXVldWVzT3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgcXVldWVzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygicXVldWVzX09SREVSIiwgcXVldWVzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCSgoT3JkZXJhYmxlMl8wKSBqYXZhSm9ic01hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5nZXRPcmRlckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBqb2JzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9ic09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIHF1ZXVlc09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoInF1ZXVlc19PUkRFUiIsIHF1ZXVlc09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YVF1ZXVlc01hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgcXVldWVzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJamF2YVF1ZXVlc01hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiSk9JTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIkpPSU5fVEFCTEUiLCBqb2JzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9ic09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiSk9JTl9UQUJMRSIsIHF1ZXVlc09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoInF1ZXVlc19PUkRFUiIsIHF1ZXVlc09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJpbnRRdWV1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJQcmludFF1ZXVlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkobWFwcGVkQnk9XCJxdWV1ZXNcIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPcmRlckNvbHVtbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDx0ZXN0LlByaW50Sm9iPiBqb2JzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByaW50UXVldWUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJpbnRKb2IiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPcmRlckNvbHVtbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDx0ZXN0LlByaW50UXVldWU+IHF1ZXVlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcmludEpvYi5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcEtleUNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCS8vdmlydHVhbCBhdHRyaWJ1dGUgaW4gb3JtLnhtbCwgamF2YSBhdHRyaWJ1dGUgaGFzIG5vIHZhbHVlIENvbHVtbiBhbm5vdGF0aW9uCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQkKLQkJQ29sdW1uIG9ybUNvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvcm1Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9ybUNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgb3JtQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBvcm1Db2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9TQ0FMRSwgb3JtQ29sdW1uLmdldFNjYWxlKCkpOwotCi0JCS8vc2V0IENvbHVtbiBhbm5vdGF0aW9uIGluIEphdmEKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIGphdmFNYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNDUpKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNDYpKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PX1RBQkxFIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDUpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ2KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NyksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQotCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlLCBvcm0ueG1sIHZpcnR1YWwgY29sdW1uIGlnbm9yZXMgamF2YSBjb2x1bW4gYW5ub3RhdGlvbgotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQkvL25vIGxvbmdlciBhbiBlbGVtZW50IGNvbGxlY3Rpb24gbWFwcGluZwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE51bGxNYXBLZXlDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQotCQlPcm1NYW55VG9NYW55TWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQkKLQkJQ29sdW1uIG9ybUNvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCi0JCS8vc2V0IENvbHVtbiBhbm5vdGF0aW9uIGluIEphdmEKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIGphdmFNYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNDUpKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNDYpKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb3JtQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb3JtQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9MRU5HVEgsIG9ybUNvbHVtbi5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIG9ybUNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9TQ0FMRSwgb3JtQ29sdW1uLmdldERlZmF1bHRTY2FsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwS2V5Q29sdW1uVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJLy92aXJ0dWFsIGF0dHJpYnV0ZSBpbiBvcm0ueG1sLCBqYXZhIGF0dHJpYnV0ZSBoYXMgbm8gQ29sdW1uIGFubm90YXRpb24KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlDb2x1bW4gY29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIGNvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQkvL2VudGl0eSB0YWJsZSBjaGFuZ2VzIHRoZSBqb2luIHRhYmxlIGRlZmF1bHQgbmFtZQotCQkoKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9STV9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9UQUJMRV9BZGRyZXNzIiwgY29sdW1uLmdldFRhYmxlKCkpOwotCi0JCS8vc2V0IENvbHVtbiB0YWJsZSBlbGVtZW50IGluIEphdmEKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIGphdmFNYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkpBVkFfSk9JTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfSk9JTl9UQUJMRSIsIGNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJKQVZBX1RBQkxFIik7CQotCQlhc3NlcnRFcXVhbHMoIkpBVkFfVEFCTEUiLCBjb2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJLy9tYWtlIG5hbWUgcGVyc2lzdGVudCBhdHRyaWJ1dGUgbm90IGRlZmF1bHQKLQkJYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWNvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fVEFCTEVfQWRkcmVzcyIsIGNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsQXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlNYW55VG9NYW55TWFwcGluZzJfMCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCAoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldEVudW1UeXBlKCkpOwotCi0JCUNhc2NhZGUyXzAgY2FzY2FkZSA9IChDYXNjYWRlMl8wKSB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0RldGFjaCgpKTsKLQotCQlhc3NlcnRUcnVlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCXZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZLCB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9YbWwoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkFkZHJlc3MiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnRUcnVlKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpIGluc3RhbmNlb2YgTnVsbE9ybUNvbnZlcnRlcik7Ci0KLQkJQ2FzY2FkZTJfMCBjYXNjYWRlID0gKENhc2NhZGUyXzApIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNEZXRhY2goKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkRW51bWVyYXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nMl8wIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueV8yXzAgbWFueVRvTWFueVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JCQkJCi0JCS8vc2V0IGVudW1lcmF0ZWQgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnlSZXNvdXJjZS5zZXRNYXBLZXlFbnVtZXJhdGVkKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuT1JESU5BTCk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5PUkRJTkFMLCAoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLk9SRElOQUwsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCQotCQltYW55VG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5RW51bWVyYXRlZChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLlNUUklORyk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuU1RSSU5HLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnlSZXNvdXJjZS5zZXRNYXBLZXlFbnVtZXJhdGVkKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcyXzAgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55XzJfMCBtYW55VG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKEVudW1UeXBlLk9SRElOQUwpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5PUkRJTkFMLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLk9SRElOQUwsICgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkKLQkJKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKEVudW1UeXBlLlNUUklORyk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLlNUUklORywgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nMl8wIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueV8yXzAgbWFueVRvTWFueVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQkJCQotCQkvL3NldCB0ZW1wb3JhbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueVJlc291cmNlLnNldE1hcEtleVRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLkRBVEUpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLkRBVEUsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSwgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQotCQltYW55VG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCQotCQltYW55VG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRVNUQU1QKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRVNUQU1QLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0KLQkJLy9zZXQgdGVtcG9yYWwgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvTWFueVJlc291cmNlLnNldE1hcEtleVRlbXBvcmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZzJfMCBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnlfMl8wIG1hbnlUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQkJCQkKLQkJLy9zZXQgdGVtcG9yYWwgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuREFURSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCi0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQotCQkvL3NldCB0ZW1wb3JhbCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBvcm1NYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnlfMl8wIG1hbnlUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb3JtTWFueVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbjIgPSBvcm1NYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4zID0gb3JtTWFueVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtbjMuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55XzJfMCBtYW55VG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlvcm1NYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1NYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1NYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQlvcm1NYW55VG9NYW55TWFwcGluZy5yZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlvcm1NYW55VG9NYW55TWFwcGluZy5yZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBvcm1NYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnlfMl8wIG1hbnlUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1NYW55VG9NYW55TWFwcGluZy5tb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3JtTWFueVRvTWFueU1hcHBpbmcubW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55XzJfMCBtYW55VG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkKLQkJbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCW1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQltYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJCi0JCW1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQltYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLm1vdmUoMiwgMCk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCW1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLm1vdmUoMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCW1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFueVRvT25lTWFwcGluZzJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFueVRvT25lTWFwcGluZzJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYWZkZmQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hbnlUb09uZU1hcHBpbmcyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYXNjYWRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRGVyaXZlZElkZW50aXR5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTWFueVRvT25lUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHNJZF8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1NYW55VG9PbmVNYXBwaW5nMl8wVGVzdHMKLQlleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBHZW5lcmljT3JtTWFueVRvT25lTWFwcGluZzJfMFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBUWVBFX05BTUUgKyAiIG1hbnlUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5hZGRUb1htbCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEyXzAuTUFQU19JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIEBNYXBzSWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBUWVBFX05BTUUgKyAiIG1hbnlUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5hZGRUb1htbCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5hZGRUb1htbCgpOwotCQl9Ci0JfQotCQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU1hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSwgSlBBLkpPSU5fQ09MVU1OLCBKUEEuRkVUQ0hfVFlQRSwgSlBBLkNBU0NBREVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZShmZXRjaD1GZXRjaFR5cGUuTEFaWSwgb3B0aW9uYWw9ZmFsc2UsIHRhcmdldEVudGl0eT1BZGRyZXNzLmNsYXNzLCBjYXNjYWRlPXtDYXNjYWRlVHlwZS5BTEwsIENhc2NhZGVUeXBlLlBFUlNJU1QsIENhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5SRU1PVkUsIENhc2NhZGVUeXBlLlJFRlJFU0gsIENhc2NhZGVUeXBlLkRFVEFDSH0pIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASm9pbkNvbHVtbihuYW1lPVwiTVlfQ09MVU1OXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lPVwiTVlfUkVGRVJFTkNFRF9DT0xVTU5cIiwgdW5pcXVlPXRydWUsIG51bGxhYmxlPWZhbHNlLCBpbnNlcnRhYmxlPWZhbHNlLCB1cGRhdGFibGU9ZmFsc2UsIGNvbHVtbkRlZmluaXRpb249XCJDT0xVTU5fREVGSU5JVElPTlwiLCB0YWJsZT1cIk1ZX1RBQkxFXCIpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCQotCQkJfQotCQl9KTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbERlcml2ZWRJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldElkKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0SWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRJZChudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldERlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxEZXJpdmVkSWRfMl8wIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRWYWx1ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFZhbHVlKGZhbHNlKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFwc0lkXzJfMCByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwc0lkKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHNJZCgiIik7Ci0JCWFzc2VydEVxdWFscygiIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFwc0lkXzJfMCByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgiIik7Ci0JCWFzc2VydEVxdWFscygiIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcmVkb21pbmFudERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybURlcml2ZWRJZGVudGl0eTJfMCBkZXJpdmVkSWRlbnRpdHkgPSBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb09uZSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQoImZvbyIpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0SWQoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0VHJ1ZShkZXJpdmVkSWRlbnRpdHkudXNlc01hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHNJZChudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShkZXJpdmVkSWRlbnRpdHkudXNlc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldElkKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc01hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUoZGVyaXZlZElkZW50aXR5LnVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRQcmVkb21pbmFudERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybURlcml2ZWRJZGVudGl0eTJfMCBkZXJpdmVkSWRlbnRpdHkgPSBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb09uZSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJCi0JCWRlcml2ZWRJZGVudGl0eS5zZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCQotCQlkZXJpdmVkSWRlbnRpdHkuc2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc01hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCQotCQlkZXJpdmVkSWRlbnRpdHkuc2V0TnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IChPcm1QZXJzaXN0ZW50QXR0cmlidXRlKSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQkKLQkJWG1sTWFueVRvT25lIHJlc291cmNlTWFueVRvT25lID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0JCXJlc291cmNlTWFueVRvT25lLnNldE1hcHNJZCgiZm9vIik7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9PbmUuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKCgoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hbnlUb09uZS5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlYbWxPbmVUb09uZSByZXNvdXJjZU9uZVRvT25lID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvT25lLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZSgoKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU9uZVRvT25lLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCXJlc291cmNlTWFueVRvT25lID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9PbmUuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKCgoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hbnlUb09uZS5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb09uZU1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJSmF2YU1hbnlUb09uZU1hcHBpbmcyXzAgamF2YU1hbnlUb09uZU1hcHBpbmcgPSAoKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TWFwcGluZygpKTsKLQkJTWFueVRvT25lTWFwcGluZzJfMCB2aXJ0dWFsTWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJKChNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIGphdmFNYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCUpvaW5UYWJsZSB2aXJ0dWFsSm9pblRhYmxlID0gKChNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgdmlydHVhbEpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQlKb2luQ29sdW1uIHZpcnR1YWxKb2luQ29sdW1uID0gdmlydHVhbEpvaW5UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9pZCIsIHZpcnR1YWxKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlKb2luQ29sdW1uIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbiA9IHZpcnR1YWxKb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCUphdmFKb2luVGFibGUgamF2YUpvaW5UYWJsZSA9ICgoSmF2YU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgamF2YU1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWphdmFKb2luVGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWphdmFKb2luVGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQ0FUQUxPRyIpOwotCQlqYXZhSm9pblRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgiU0NIRU1BIik7Ci0JCUphdmFKb2luQ29sdW1uIGphdmFKb2luQ29sdW1uID0gamF2YUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJOQU1FIik7Ci0JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZFUkVOQ0VEX05BTUUiKTsKLQkJSmF2YUpvaW5Db2x1bW4gaW52ZXJzZUphdmFKb2luQ29sdW1uID0gamF2YUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIklOVkVSU0VfTkFNRSIpOwotCQlpbnZlcnNlSmF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIklOVkVSU0VfUkVGRVJFTkNFRF9OQU1FIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ0FUQUxPRyIsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTQ0hFTUEiLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQl2aXJ0dWFsSm9pbkNvbHVtbiA9IHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJOQU1FIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSRUZFUkVOQ0VEX05BTUUiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJdmlydHVhbEludmVyc2VKb2luQ29sdW1uID0gdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlZFUlNFX05BTUUiLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlZFUlNFX1JFRkVSRU5DRURfTkFNRSIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tSmF2YVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9PbmVNYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nMl8wIG9ybU1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCSgoTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBvcm1NYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSAoKE9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgb3JtTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSB0YXJnZXRQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0KLQkJKChKYXZhRW50aXR5KSB0YXJnZXRQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkoKEphdmFFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVJfRk9PIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCUphdmFNYW55VG9PbmVNYXBwaW5nMl8wIGphdmFNYW55VG9PbmVNYXBwaW5nID0gKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKTsKLQkJKChNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIGphdmFNYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCSgoTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJKQVZBX0pPSU5fVEFCTEUiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSB0byB0cnVlLCB3aWxsIGlnbm9yZSBqYXZhIGFubm90YXRpb24gc2V0dGluZ3MKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQkvL29ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQkvL3JlbW92ZSBtLW0gbWFwcGluZyBmcm9tIHRoZSBvcm0ueG1sIGZpbGUKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5yZW1vdmVGcm9tWG1sKCk7Ci0JCS8vb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCU1hbnlUb09uZU1hcHBpbmcyXzAgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZzJfMCkgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgdmlydHVhbEpvaW5UYWJsZSA9ICgoTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSB2aXJ0dWFsTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9KT0lOX1RBQkxFIiwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOy8vc3BlY2lmaWVkTmFtZSBzaW5jZSB0aGlzIGlzIGEgdmlydHVhbCBtYXBwaW5nIG5vdwotCi0JCSgoTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5yZW1vdmVTdHJhdGVneSgpOwotCQl2aXJ0dWFsSm9pblRhYmxlID0gKChNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxKb2luVGFibGUpOwotCQkoKE1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgamF2YU1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJdmlydHVhbEpvaW5UYWJsZSA9ICgoTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSB2aXJ0dWFsTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIHZpcnR1YWxKb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJKChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fVEFCTEVfTkFNRSIpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9UQUJMRV9OQU1FX0ZPTyIsIHZpcnR1YWxKb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJKChPcm1FbnRpdHkpIHRhcmdldFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fVEFSR0VUIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX05BTUVfT1JNX1RBUkdFVCIsIHZpcnR1YWxKb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCByZWwgPSAoT3JtTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb09uZSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCByZWwgPSAoT3JtTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb09uZSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5TWFueVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJTWFueVRvT25lTWFwcGluZyB2aXJ0dWFsTWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsTWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscygiQWRkcmVzcyIsIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQotCQlKb2luQ29sdW1uIHZpcnR1YWxKb2luQ29sdW1uID0gdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1JFRkVSRU5DRURfQ09MVU1OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEUiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQotCQlDYXNjYWRlMl8wIGNhc2NhZGUgPSAoQ2FzY2FkZTJfMCkgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0RldGFjaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5TWFueVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZLCB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQotCQl2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbChNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlPcm1NYW55VG9PbmVNYXBwaW5nIG9ybU1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtTWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkFkZHJlc3MiLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0KLQkJQ2FzY2FkZTJfMCBjYXNjYWRlID0gKENhc2NhZGUyXzApIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0RldGFjaCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtT25lVG9NYW55TWFwcGluZzJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtT25lVG9NYW55TWFwcGluZzJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1N2MwMWMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvTWFueU1hcHBpbmcyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNlRW51bWVyYXRlZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Q29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNlVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uTnVsbE9ybUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhc2NhZGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT25lVG9NYW55UmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJDb2x1bW4yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlcmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUNvbHVtbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybU9uZVRvTWFueU1hcHBpbmcyXzBUZXN0cwotCWV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEdlbmVyaWNPcm1PbmVUb01hbnlNYXBwaW5nMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248U3RhdGU+IHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlmb3IgKE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQllYWNoLmFkZFRvWG1sKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPFN0cmluZywgQWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXAgYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBhYmJyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPFN0cmluZywgQWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5GRVRDSF9UWVBFLCBKUEEuQ0FTQ0FERV9UWVBFLCBKUEEuT1JERVJfQlksIEpQQTJfMC5NQVBfS0VZX0VOVU1FUkFURUQsIEpQQS5FTlVNX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkoZmV0Y2g9RmV0Y2hUeXBlLkVBR0VSLCB0YXJnZXRFbnRpdHk9QWRkcmVzcy5jbGFzcywgb3JwaGFuUmVtb3ZhbCA9IHRydWUsIGNhc2NhZGU9e0Nhc2NhZGVUeXBlLkFMTCwgQ2FzY2FkZVR5cGUuUEVSU0lTVCwgQ2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRSwgQ2FzY2FkZVR5cGUuUkVGUkVTSCwgQ2FzY2FkZVR5cGUuREVUQUNIfSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPcmRlckJ5KFwiY2l0eVwiIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFwS2V5RW51bWVyYXRlZChFbnVtVHlwZS5TVFJJTkcpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBvbmVUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLm5hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXNFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzc1dpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIiksIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0KLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUubmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBzdGF0ZUZvb01hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0JcHJpdmF0ZSBPcm1PcnBoYW5SZW1vdmFibGUyXzAgZ2V0T3JwaGFuUmVtb3ZhbE9mKE9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZykgewotCQlyZXR1cm4gKChPcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSBvbmVUb01hbnlNYXBwaW5nKS5nZXRPcnBoYW5SZW1vdmFsKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvcm1PbmVUb01hbnlNYXBwaW5nKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9uZVRvTWFueVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCQkJCi0JCS8vc2V0IGVudW1lcmF0ZWQgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueVJlc291cmNlLnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvTWFueVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCi0JCW9uZVRvTWFueVJlc291cmNlLnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9uZVRvTWFueVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvcm1PbmVUb01hbnlNYXBwaW5nKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9uZVRvTWFueVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCQkJCi0JCS8vc2V0IGVudW1lcmF0ZWQgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvTWFueVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9uZVRvTWFueVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJb25lVG9NYW55LnNldE1hcEtleShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE5vdE51bGwob25lVG9NYW55LmdldE1hcEtleSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueS5nZXRNYXBLZXkoKS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Iiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvbmVUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvTWFueS5nZXRNYXBLZXkoKS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwotCQkKLQkJb25lVG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCW9uZVRvTWFueS5zZXRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZpcnR1YWxNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCi0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZyBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKG9uZVRvTWFueU1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQkJCi0JCS8vc2V0IHBrIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5zZXRQa01hcEtleSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKG9uZVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCQkKLQkJCi0JCS8vc2V0IGN1c3RvbSBzcGVjaWZpZWQgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLnNldEN1c3RvbU1hcEtleSh0cnVlKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJjaXR5Iik7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKG9uZVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleSgpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJteU1hcEtleSIpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Iiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvbmVUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5hZGRUb1htbCgpOwotCQlvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCW1hcEtleU5hbWVzID0gb25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJ0ZXN0LkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSBvbmVUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiU3RyaW5nIik7Ci0JCW1hcEtleU5hbWVzID0gb25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0KLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCW9uZVRvTWFueS5zZXRNYXBLZXlDbGFzcyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDbGFzc1JlZmVyZW5jZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROb3ROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkuc2V0Q2xhc3NOYW1lKCJTdHJpbmciKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKS5zZXRDbGFzc05hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0KLQkJb25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkuc2V0Q2xhc3NOYW1lKCJTdHJpbmciKTsKLQkJb25lVG9NYW55LnNldE1hcEtleUNsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmlydHVhbE1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgb25lVG9NYW55TWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0KLQkJLy9zZXQgcGsgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJJbnRlZ2VyIik7Ci0JCWFzc2VydEVxdWFscygiSW50ZWdlciIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiSW50ZWdlciIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQkKLQkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiU3RyaW5nIik7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBvbmVUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0KLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE9yZGVyQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50UXVldWUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50Sm9iKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByaW50UXVldWUiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5QcmludEpvYiIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiam9icyIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJxdWV1ZSIpOwotCi0JCU9yZGVyYWJsZTJfMCBvcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCQotCQlvcmRlcmFibGUuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJT3JkZXJDb2x1bW4yXzAgb3JkZXJDb2x1bW4gPSBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImpvYnNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYiIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJb3JkZXJDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2IiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHByaW50Sm9iUGVyc2lzdGVudFR5cGUgPSAoT3JtUGVyc2lzdGVudFR5cGUpIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKCJ0ZXN0LlByaW50Sm9iIik7Ci0JCSgoRW50aXR5KSBwcmludEpvYlBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9UQUJMRSIpOwotCi0JCWFzc2VydEVxdWFscygiTVlfVEFCTEUiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxPcmRlckNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRRdWV1ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJpbnRRdWV1ZSIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByaW50Sm9iIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJqb2JzIiksIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlPcmRlcmFibGUyXzAgb3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQkKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCk7Ci0JCSgoT3JkZXJhYmxlMl8wKSBqYXZhT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSkuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnJlbW92ZUZyb21YbWwoKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiam9icyIpOwotCQlvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJb3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iIiwgb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiam9ic19PUkRFUiIsIG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQkoKE9yZGVyYWJsZTJfMCkgamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLmdldE9yZGVyQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2IiLCBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXROYW1lKCkpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVByaW50UXVldWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk9ORV9UT19NQU5ZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJQcmludFF1ZXVlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueShtYXBwZWRCeT1cInF1ZXVlXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT3JkZXJDb2x1bW4iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkxpc3Q8UHJpbnRKb2I+IGpvYnM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJpbnRRdWV1ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlQcmludEpvYigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFOWV9UT19PTkUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJpbnRKb2IiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBQcmludFF1ZXVlIHF1ZXVlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByaW50Sm9iLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwS2V5Q29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQkvL3ZpcnR1YWwgYXR0cmlidXRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyB2YWx1ZSBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCB2aXJ0dWFsQWRkcmVzc2VzTWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlDb2x1bW4gdmlydHVhbENvbHVtbiA9IHZpcnR1YWxBZGRyZXNzZXNNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCB2aXJ0dWFsQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxDb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbENvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfTEVOR1RILCB2aXJ0dWFsQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCB2aXJ0dWFsQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIHZpcnR1YWxDb2x1bW4uZ2V0U2NhbGUoKSk7Ci0KLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CQkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNDUpKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNDcpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fVEFCTEUiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbENvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbENvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyg0NSwgdmlydHVhbENvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg0NiwgdmlydHVhbENvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg0NywgdmlydHVhbENvbHVtbi5nZXRTY2FsZSgpKTsKLQotCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlLCBvcm0ueG1sIHZpcnR1YWwgY29sdW1uIGlnbm9yZXMgamF2YSBjb2x1bW4gYW5ub3RhdGlvbgotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQkvL25vIGxvbmdlciBhbiBlbGVtZW50IGNvbGxlY3Rpb24gbWFwcGluZwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE51bGxNYXBLZXlDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIiksIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0KLQkJT3JtT25lVG9NYW55TWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlDb2x1bW4gb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0KLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CQkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNDUpKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNDcpKTsKLQotCi0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9ybUNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfTEVOR1RILCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXREZWZhdWx0U2NhbGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcEtleUNvbHVtblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJLy92aXJ0dWFsIGF0dHJpYnV0ZSBpbiBvcm0ueG1sLCBqYXZhIGF0dHJpYnV0ZSBoYXMgbm8gQ29sdW1uIGFubm90YXRpb24KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIHZpcnR1YWxBZGRyZXNzZXNNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJQ29sdW1uIHZpcnR1YWxDb2x1bW4gPSB2aXJ0dWFsQWRkcmVzc2VzTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCi0JCS8vZW50aXR5IHRhYmxlIGNoYW5nZXMgdGhlIGpvaW4gdGFibGUgZGVmYXVsdCBuYW1lCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX0FkZHJlc3MiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCi0JCS8vc2V0IENvbHVtbiB0YWJsZSBlbGVtZW50IGluIEphdmEKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiSkFWQV9KT0lOX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9KT0lOX1RBQkxFIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkpBVkFfVEFCTEUiKTsJCi0JCWFzc2VydEVxdWFscygiSkFWQV9UQUJMRSIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJLy9tYWtlIG5hbWUgcGVyc2lzdGVudCBhdHRyaWJ1dGUgbm90IGRlZmF1bHQKLQkJYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKSwgTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBzcGVjaWZpZWRBZGRyZXNzZXNNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJQ29sdW1uIHNwZWNpZmllZENvbHVtbiA9IHNwZWNpZmllZEFkZHJlc3Nlc01hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0JCWFzc2VydE51bGwoc3BlY2lmaWVkQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9UQUJMRV9BZGRyZXNzIiwgc3BlY2lmaWVkQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCByZWwgPSAoT3JtT25lVG9NYW55UmVsYXRpb25zaGlwMl8wKSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCByZWwgPSAoT3JtT25lVG9NYW55UmVsYXRpb25zaGlwMl8wKSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHBlZEJ5KG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldEpvaW5UYWJsZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0Rm9yZWlnbktleUpvaW5Db2x1bW5TdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtVGFyZ2V0UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQkvL3Rlc3QgdmlydHVhbCBvcm0gbWFwcGluZywgc2V0dGluZyB0aGUgam9pbiBjb2x1bW4gb24gdGhlIGphdmEgbWFwcGluZwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJT25lVG9NYW55UmVsYXRpb25zaGlwMl8wIHJyID0gKE9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCkgamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCXJyLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0KLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gcnIuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsJCQotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19pZCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQWRkcmVzcyIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOy8vdGFyZ2V0IHRhYmxlIG5hbWUKLQotCQlKYXZhRW50aXR5IGFkZHJlc3NFbnRpdHkgPSAoSmF2YUVudGl0eSkgb3JtVGFyZ2V0UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlhZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0KLQkJLy9vdmVycmlkZSB0aGUgbWFwcGluZyBpbiBvcm0ueG1sCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9YbWwoKTsKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJb25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCXJyID0gKE9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCkgb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJYXNzZXJ0RmFsc2UocnIuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0KLQkJcnIuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQkJam9pbkNvbHVtbiA9IHJyLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7CQkKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX2lkIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBRERSRVNTX1BSSU1BUllfVEFCTEUiLCBqb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJT3JtRW50aXR5IG9ybUFkZHJlc3NFbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1UYXJnZXRQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCW9ybUFkZHJlc3NFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX0FERFJFU1NfUFJJTUFSWV9UQUJMRSIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX2lkIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiT1JNX0FERFJFU1NfUFJJTUFSWV9UQUJMRSIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCX0KLQotCS8vdGFyZ2V0IGZvcmVpZ24ga2V5IGNhc2UKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5Q29sdW1uSm9pbkNvbHVtblN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1UYXJnZXRQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCS8vdGVzdCB2aXJ0dWFsIG9ybSBtYXBwaW5nLCBzZXR0aW5nIHRoZSBqb2luIGNvbHVtbiBvbiB0aGUgamF2YSBtYXBwaW5nCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TWFwcGluZygpOwotCQlPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAgcnIgPSAoT25lVG9NYW55UmVsYXRpb25zaGlwMl8wKSBqYXZhT25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJcnIuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOy8vdGFyZ2V0IHRhYmxlIG5hbWUKLQotCQlKYXZhRW50aXR5IGFkZHJlc3NFbnRpdHkgPSAoSmF2YUVudGl0eSkgb3JtVGFyZ2V0UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlhZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQkJY29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0KLQkJLy9vdmVycmlkZSB0aGUgbWFwcGluZyBpbiBvcm0ueG1sCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9YbWwoKTsKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJb25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCXJyID0gKE9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCkgb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJYXNzZXJ0RmFsc2UocnIuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0KLQkJcnIuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFERFJFU1NfUFJJTUFSWV9UQUJMRSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ly90YXJnZXQgdGFibGUgbmFtZQotCi0JCU9ybUVudGl0eSBvcm1BZGRyZXNzRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtVGFyZ2V0UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlvcm1BZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX0FERFJFU1NfUFJJTUFSWV9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiT1JNX0FERFJFU1NfUFJJTUFSWV9UQUJMRSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ly90YXJnZXQgdGFibGUgbmFtZQotCi0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9BRERSRVNTX1BSSU1BUllfVEFCTEUiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKLQl9Ci0KLQkvL3RhcmdldCBmb3JlaWduIGtleSBjYXNlCi0JcHVibGljIHZvaWQgdGVzdE9yZGVyQ29sdW1uRGVmYXVsdHNKb2luQ29sdW1uU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVRhcmdldFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJLy90ZXN0IHZpcnR1YWwgb3JtIG1hcHBpbmcsIHNldHRpbmcgdGhlIGpvaW4gY29sdW1uIG9uIHRoZSBqYXZhIG1hcHBpbmcKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCk7Ci0JCU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCByciA9IChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIGphdmFPbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlyci5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQkoKE9yZGVyYWJsZTJfMCkgamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLnNldE9yZGVyQ29sdW1uT3JkZXJpbmcodHJ1ZSk7Ci0JCU9yZGVyQ29sdW1uMl8wIG9yZGVyQ29sdW1uID0gKChPcmRlcmFibGUyXzApIG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLmdldE9yZGVyQ29sdW1uKCk7Ci0KLQkJYXNzZXJ0TnVsbChvcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19PUkRFUiIsIG9yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJSmF2YUVudGl0eSBhZGRyZXNzRW50aXR5ID0gKEphdmFFbnRpdHkpIG9ybVRhcmdldFBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJYWRkcmVzc0VudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkFERFJFU1NfUFJJTUFSWV9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIkFERFJFU1NfUFJJTUFSWV9UQUJMRSIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCi0JCS8vb3ZlcnJpZGUgdGhlIG1hcHBpbmcgaW4gb3JtLnhtbAotCQlwZXJzaXN0ZW50QXR0cmlidXRlLmFkZFRvWG1sKCk7Ci0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlyciA9IChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCWFzc2VydEZhbHNlKHJyLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCi0JCXJyLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydEZhbHNlKCgoT3JkZXJhYmxlMl8wKSBvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCSgoT3JkZXJhYmxlMl8wKSBvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5zZXRPcmRlckNvbHVtbk9yZGVyaW5nKHRydWUpOwotCQlvcmRlckNvbHVtbiA9ICgoT3JkZXJhYmxlMl8wKSBvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5nZXRPcmRlckNvbHVtbigpOwotCi0JCWFzc2VydE51bGwob3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFERFJFU1NfUFJJTUFSWV9UQUJMRSIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOy8vdGFyZ2V0IHRhYmxlIG5hbWUKLQotCQlPcm1FbnRpdHkgb3JtQWRkcmVzc0VudGl0eSA9IChPcm1FbnRpdHkpIG9ybVRhcmdldFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJb3JtQWRkcmVzc0VudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9STV9BRERSRVNTX1BSSU1BUllfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9BRERSRVNTX1BSSU1BUllfVEFCTEUiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlPbmVUb01hbnlNYXBwaW5nMl8wIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuCi0JCQlnZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRFbnVtVHlwZSgpKTsKLQotCQlDYXNjYWRlMl8wIGNhc2NhZGUgPSAoQ2FzY2FkZTJfMCkgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0RldGFjaCgpKTsKLQotCQlhc3NlcnRUcnVlKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzQ3VzdG9tT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgoKE9ycGhhblJlbW92YWxIb2xkZXIyXzApIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nKS5nZXRPcnBoYW5SZW1vdmFsKCkuaXNPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCi0JCXZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmFkZFRvWG1sKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QuQWRkcmVzcyIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnRUcnVlKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkgaW5zdGFuY2VvZiBOdWxsT3JtQ29udmVydGVyKTsKLQotCQlDYXNjYWRlMl8wIGNhc2NhZGUgPSAoQ2FzY2FkZTJfMCkgb3JtT25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzRGV0YWNoKCkpOwotCi0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoKChPcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSBvcm1PbmVUb01hbnlNYXBwaW5nKS5nZXRPcnBoYW5SZW1vdmFsKCkuaXNPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueV8yXzAgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5RW51bWVyYXRlZChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLk9SRElOQUwpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLk9SRElOQUwsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JCi0JCW9uZVRvTWFueVJlc291cmNlLnNldE1hcEtleUVudW1lcmF0ZWQob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5TVFJJTkcpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCAoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuU1RSSU5HLCBvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCi0JCS8vc2V0IGVudW1lcmF0ZWQgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5RW51bWVyYXRlZChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55XzJfMCBvbmVUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCQkJCQotCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihCYXNlRW51bWVyYXRlZENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKEVudW1UeXBlLk9SRElOQUwpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5PUkRJTkFMLCBvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCi0JCSgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKEVudW1UeXBlLlNUUklORyk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLlNUUklORywgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0KLQkJLy9zZXQgZW51bWVyYXRlZCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55XzJfMCBvbmVUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQkJCQkKLQkJLy9zZXQgdGVtcG9yYWwgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueVJlc291cmNlLnNldE1hcEtleVRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLkRBVEUpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLkRBVEUsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFLCBvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQkKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQkKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRVNUQU1QKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVAsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCi0JCS8vc2V0IHRlbXBvcmFsIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvTWFueVJlc291cmNlLnNldE1hcEtleVRlbXBvcmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueV8yXzAgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IHRlbXBvcmFsIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5EQVRFKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLkRBVEUsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLkRBVEUsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCi0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQotCQkvL3NldCB0ZW1wb3JhbCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb3JtT25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55XzJfMCBvbmVUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvcm1PbmVUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbjIgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4zID0gb3JtT25lVG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMiwgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4zLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbiwgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCi0JCWpvaW5Db2x1bW5zID0gb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueV8yXzAgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb3JtT25lVG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1PbmVUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQkKLQkJb3JtT25lVG9NYW55TWFwcGluZy5yZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueV8yXzAgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb3JtT25lVG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1PbmVUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQkKLQkJCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcubW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3JtT25lVG9NYW55TWFwcGluZy5tb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXlKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnlfMl8wIG9uZVRvTWFueVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkKLQkJb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJCi0JCW9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQlvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5tb3ZlKDIsIDApOwotCQlqb2luQ29sdW1ucyA9IG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCW9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkubW92ZSgwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmcyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvT25lTWFwcGluZzJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZTJhZGUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvT25lTWFwcGluZzJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FzY2FkZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvT25lUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybURlcml2ZWRJZGVudGl0eTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHNJZF8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmcyXzBUZXN0cwotCWV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEdlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmcyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgIiArIFRZUEVfTkFNRSArICIgb25lVG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWZvciAoT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCWVhY2guYWRkVG9YbWwoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEyXzAuTUFQU19JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUgQE1hcHNJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgIiArIFRZUEVfTkFNRSArICIgb25lVG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWZvciAoT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCWVhY2guYWRkVG9YbWwoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248U3RhdGU+IHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlmb3IgKE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQllYWNoLmFkZFRvWG1sKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5GRVRDSF9UWVBFLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUoZmV0Y2g9RmV0Y2hUeXBlLkxBWlksIG9wdGlvbmFsPWZhbHNlLCB0YXJnZXRFbnRpdHk9QWRkcmVzcy5jbGFzcywgb3JwaGFuUmVtb3ZhbCA9IHRydWUsIGNhc2NhZGU9e0Nhc2NhZGVUeXBlLkFMTCwgQ2FzY2FkZVR5cGUuUEVSU0lTVCwgQ2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRSwgQ2FzY2FkZVR5cGUuUkVGUkVTSCwgQ2FzY2FkZVR5cGUuREVUQUNIfSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luQ29sdW1uKG5hbWU9XCJNWV9DT0xVTU5cIiwgcmVmZXJlbmNlZENvbHVtbk5hbWU9XCJNWV9SRUZFUkVOQ0VEX0NPTFVNTlwiLCB1bmlxdWU9dHJ1ZSwgbnVsbGFibGU9ZmFsc2UsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSwgY29sdW1uRGVmaW5pdGlvbj1cIkNPTFVNTl9ERUZJTklUSU9OXCIsIHRhYmxlPVwiTVlfVEFCTEVcIikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxEZXJpdmVkSWRfMl8wIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldElkKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0SWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRJZChudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbERlcml2ZWRJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0VmFsdWUodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRWYWx1ZShmYWxzZSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE1hcHNJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwc0lkKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHNJZCgiIik7Ci0JCWFzc2VydEVxdWFscygiIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFwc0lkXzJfMCByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCIiKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50RGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1EZXJpdmVkSWRlbnRpdHkyXzAgZGVyaXZlZElkZW50aXR5ID0gY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxPbmVUb09uZSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldElkKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQoImZvbyIpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0SWQobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydFRydWUoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFByZWRvbWluYW50RGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1EZXJpdmVkSWRlbnRpdHkyXzAgZGVyaXZlZElkZW50aXR5ID0gY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxPbmVUb09uZSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQkKLQkJZGVyaXZlZElkZW50aXR5LnNldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShkZXJpdmVkSWRlbnRpdHkudXNlc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQkKLQkJZGVyaXZlZElkZW50aXR5LnNldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydFRydWUoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJCi0JCWRlcml2ZWRJZGVudGl0eS5zZXROdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIik7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQkKLQkJWG1sT25lVG9PbmUgcmVzb3VyY2VPbmVUb09uZSA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCXJlc291cmNlT25lVG9PbmUuc2V0SWQoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VPbmVUb09uZS5nZXRJZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvT25lLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbCgoKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCVhtbE1hbnlUb09uZSByZXNvdXJjZU1hbnlUb09uZSA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hbnlUb09uZS5nZXRJZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9PbmUuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKCgoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJcmVzb3VyY2VPbmVUb09uZSA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlT25lVG9PbmUuZ2V0SWQoKSk7Ci0JCWFzc2VydFRydWUoKChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb09uZS5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE51bGwoKChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdGF0ZUZvb01hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lc0VsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3NXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCXByaXZhdGUgT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWxPZihPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nKSB7Ci0JCXJldHVybiAoKE9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzApIG9uZVRvT25lTWFwcGluZykuZ2V0T3JwaGFuUmVtb3ZhbCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvcm1PbmVUb09uZU1hcHBpbmcpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb25lVG9PbmVSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOwotCQkJCQotCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb09uZVJlc291cmNlLnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lUmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkKLQkJb25lVG9PbmVSZXNvdXJjZS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvbmVUb09uZVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvT25lTWFwcGluZzJfMCBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9ybU9uZVRvT25lTWFwcGluZyk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvbmVUb09uZVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0KLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmVSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvbmVUb09uZVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEpvaW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZzJfMCBqYXZhT25lVG9PbmVNYXBwaW5nID0gKChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TWFwcGluZygpKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZzJfMCB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkoKE9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCUpvaW5UYWJsZSB2aXJ0dWFsSm9pblRhYmxlID0gKChPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgdmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCWFzc2VydE51bGwodmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgdmlydHVhbEpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gdmlydHVhbEpvaW5UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2lkIiwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlKb2luQ29sdW1uIGludmVyc2VPcm1Kb2luQ29sdW1uID0gdmlydHVhbEpvaW5UYWJsZS5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIGludmVyc2VPcm1Kb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgaW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBpbnZlcnNlT3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJSmF2YUpvaW5UYWJsZSBqYXZhSm9pblRhYmxlID0gKChKYXZhT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIGphdmFPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWphdmFKb2luVGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWphdmFKb2luVGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQ0FUQUxPRyIpOwotCQlqYXZhSm9pblRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgiU0NIRU1BIik7Ci0JCUphdmFKb2luQ29sdW1uIGphdmFKb2luQ29sdW1uID0gamF2YUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJOQU1FIik7Ci0JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZFUkVOQ0VEX05BTUUiKTsKLQkJSmF2YUpvaW5Db2x1bW4gaW52ZXJzZUphdmFKb2luQ29sdW1uID0gamF2YUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIklOVkVSU0VfTkFNRSIpOwotCQlpbnZlcnNlSmF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIklOVkVSU0VfUkVGRVJFTkNFRF9OQU1FIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ0FUQUxPRyIsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTQ0hFTUEiLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQlvcm1Kb2luQ29sdW1uID0gdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk5BTUUiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUkVGRVJFTkNFRF9OQU1FIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJaW52ZXJzZU9ybUpvaW5Db2x1bW4gPSB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIklOVkVSU0VfTkFNRSIsIGludmVyc2VPcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiSU5WRVJTRV9SRUZFUkVOQ0VEX05BTUUiLCBpbnZlcnNlT3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tSmF2YVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0KLQkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkoKE9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9ICgoT3JtT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSB0YXJnZXRQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0KLQkJKChKYXZhRW50aXR5KSB0YXJnZXRQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkoKEphdmFFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVJfRk9PIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCUphdmFPbmVUb09uZU1hcHBpbmcyXzAgamF2YU9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKTsKLQkJKChPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgamF2YU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQkoKE9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkpBVkFfSk9JTl9UQUJMRSIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlIHRvIHRydWUsIHdpbGwgaWdub3JlIGphdmEgYW5ub3RhdGlvbiBzZXR0aW5ncwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCS8vb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCS8vcmVtb3ZlIG0tbSBtYXBwaW5nIGZyb20gdGhlIG9ybS54bWwgZmlsZQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnJlbW92ZUZyb21YbWwoKTsKLQkJLy9vcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgdmlydHVhbE9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgdmlydHVhbEpvaW5UYWJsZSA9ICgoT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9KT0lOX1RBQkxFIiwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOy8vc3BlY2lmaWVkTmFtZSBzaW5jZSB0aGlzIGlzIGEgdmlydHVhbCBtYXBwaW5nIG5vdwotCi0JCSgoT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIGphdmFPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkucmVtb3ZlU3RyYXRlZ3koKTsKLQkJdmlydHVhbEpvaW5UYWJsZSA9ICgoT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydE51bGwodmlydHVhbEpvaW5UYWJsZSk7Ci0JCSgoT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIGphdmFPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJdmlydHVhbEpvaW5UYWJsZSA9ICgoT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIHZpcnR1YWxKb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIHZpcnR1YWxKb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJKChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fVEFCTEVfTkFNRSIpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9UQUJMRV9OQU1FX0ZPTyIsIHZpcnR1YWxKb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJKChPcm1FbnRpdHkpIHRhcmdldFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fVEFSR0VUIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX05BTUVfT1JNX1RBUkdFVCIsIHZpcnR1YWxKb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9uZVRvT25lUmVsYXRpb25zaGlwMl8wIHJlbCA9IChPcm1PbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgY29udGV4dE1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxPbmVUb09uZSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9QcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7CQotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtT25lVG9PbmVSZWxhdGlvbnNoaXAyXzAgcmVsID0gKE9ybU9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0Sm9pblRhYmxlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCU9uZVRvT25lTWFwcGluZzJfMCB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLgotCQkJZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCi0JCUpvaW5Db2x1bW4gdmlydHVhbEpvaW5Db2x1bW4gPSAKLQkJCXZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1JFRkVSRU5DRURfQ09MVU1OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEUiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQotCQlDYXNjYWRlMl8wIGNhc2NhZGUgPSAoQ2FzY2FkZTJfMCkgdmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzRGV0YWNoKCkpOwotCi0JCWFzc2VydFRydWUoKChPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nKS5nZXRPcnBoYW5SZW1vdmFsKCkuaXNPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0KLQkJdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9YbWwoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJT25lVG9PbmVNYXBwaW5nMl8wIG9ybU9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybU9uZVRvT25lTWFwcGluZy5pc09wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QuQWRkcmVzcyIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQotCQkvL1RPRE8gZGVmYXVsdCBqb2luIGNvbHVtbnMgaW4geG1sIG9uZS10by1vbmUKLS8vCQlYbWxKb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1PbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0vLwkJLy9UT0RPIGphdmEgZGVmYXVsdCBjb2x1bW5zIG5hbWUgaW4gSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuSm9pbkNvbHVtbk93bmVyCi0vLwkJLy9hc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwkJLy9hc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLS8vCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCi0JCUNhc2NhZGUyXzAgY2FzY2FkZSA9IChDYXNjYWRlMl8wKSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0RldGFjaCgpKTsKLQotCQlhc3NlcnRGYWxzZSgoKE9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzApIG9ybU9uZVRvT25lTWFwcGluZykuZ2V0T3JwaGFuUmVtb3ZhbCgpLmlzT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4Nzg2ZmIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTJfMFRlc3RzCi0JZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXB1YmxpYyBHZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTJfMFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZU51bGxBdHRyaWJ1dGVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsJCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uKG5hbWU9XCJGT09cIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nUHJvcGVydHlBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4obmFtZT1cIkZPT1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRQcm9wZXJ0eVNwZWNpZmllZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBKUEEuSUQsIEpQQTJfMC5BQ0NFU1MsIEpQQTJfMC5BQ0NFU1NfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKSIpOwotCQkJfQotCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmROYW1lRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIik7Ci0JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZVNwZWNpZmllZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9YbWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3BlY2lmaWVkQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHNwZWNpZmllZEF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZVNwZWNpZmllZFdpdGhBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkUHJvcGVydHlTcGVjaWZpZWQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQob3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKSwgMSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9YbWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9YbWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3BlY2lmaWVkQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlU3BlY2lmaWVkTWFwcGluZ0tleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZU51bGxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJLy90YWtlIGEgdmlydHVhbCBtYXBwaW5nIHdpdGggYSBtYXBwaW5nIHR5cGUgYW5kIG1ha2UgaXQgc3BlY2lmaWVkCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZyk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9YbWwoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydFRydWUoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPcm1PbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmFkZFRvWG1sKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHNwZWNpZmllZEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydFRydWUoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPcm1JZE1hcHBpbmcpOwotCQkKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHNwZWNpZmllZEF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZVZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmFkZFRvWG1sKCk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuYWRkVG9YbWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLnJlbW92ZUZyb21YbWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5yZW1vdmVGcm9tWG1sKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCUl0ZXJhdG9yPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gdmlydHVhbEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsQXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwkJCi0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZVZpcnR1YWxOb1VuZGVybHlpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5hZGRUb1htbCgpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmFkZFRvWG1sKCk7Ci0KLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCkuc2V0TmFtZSgibm9KYXZhQXR0cmlidXRlIik7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUucmVtb3ZlRnJvbVhtbCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nVHlwZVdoZW5NZXRhZGF0YUNvbXBsZXRlKCkgIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0KLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCAoKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ1R5cGVXaGVuTWV0YWRhdGFDb21wbGV0ZTIoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJCQotCQkvL3ZpcnR1YWwgb3JtIGF0dHJpYnV0ZSwgYWNjZXNzIHR5cGUgbWF0Y2hlcyBqYXZhIDogRklFTEQsIG5hbWUgbWF0Y2hlcyBqYXZhCi0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSBqYXZhUmVzb3VyY2VBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUmVzb3VyY2VBdHRyaWJ1dGUuZ2V0S2luZCgpID09IEtpbmQuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YVJlc291cmNlQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpLCBqYXZhUmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJCi0JCS8vc3BlY2lmaWVkIG9ybSBhdHRyaWJ1dGUsIGFjY2VzcyB0eXBlIG1hdGNoZXMgamF2YSA6IEZJRUxELCBuYW1lIG1hdGNoZXMgamF2YQotCQkvL2phdmFQZXJzaXN0ZW50QXR0cmlidXRlIHNob3VsZCBiZSA9PSB0byBqYXZhIGNvbnRleHQgbW9kZWwgb2JqZWN0Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9YbWwoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRGYWxzZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQotCQkKLQkJLy92aXJ0dWFsIG9ybSBhdHRyaWJ1dGUsIGphdmEgYWNjZXNzIHR5cGUgRklFTEQsIG9ybSBhY2Nlc3MgdHlwZSBQUk9QRVJUWSwgbmFtZSBtYXRjaGVzIGphdmEKLQkJLy92ZXJpZnkgYm90aCB0aGUgcHJvcGVydHkgamF2YSByZXNvdXJjZSBhdHRyaWJ1dGUgYW5kIHRoZSBmaWVsZCBqYXZhIHJlc291cmNlIGF0dHJpYnV0ZSBhcmUgdXNlZCBpbiBvcm0KLQkJLy9iZWNhdXNlIHRoZSBmaWVsZCBpcyBhbm5vdGF0ZWQgYW5kIHByb3BlcnR5IGlzIHNwZWNpZmllZAotCQkoKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpLnJlbW92ZUZyb21YbWwoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgaWRGaWVsZEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgaWRQcm9wZXJ0eUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgaWRGaWVsZEF0dHJpYnV0ZSk7Ci0JCWFzc2VydE5vdFNhbWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgaWRQcm9wZXJ0eUF0dHJpYnV0ZSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBpZFByb3BlcnR5QXR0cmlidXRlOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGlkRmllbGRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCWphdmFSZXNvdXJjZUF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YVJlc291cmNlQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldE1ldGhvZHMoKS5pdGVyYXRvcigpLm5leHQoKSwgamF2YVJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MobnVsbCk7Ly9kZWZhdWx0IGFjY2VzcyB3aWxsIGJlIGZpZWxkCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsJCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCkuc2V0TmFtZSgiaWQyIik7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0KLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpLnNldE5hbWUoImlkIik7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0KLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZU1peGVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1GaWVsZEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUHJvcGVydHlBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtRmllbGRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUHJvcGVydHlBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0T3duaW5nUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUob3JtRmllbGRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRUcnVlKG9ybVByb3BlcnR5QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUHJvcGVydHlBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybUZpZWxkQXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVByb3BlcnR5QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQkKLQkJb3JtUHJvcGVydHlBdHRyaWJ1dGUuYWRkVG9YbWwoKTsKLQkJb3JtUHJvcGVydHlBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUHJvcGVydHlBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUHJvcGVydHlBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1Qcm9wZXJ0eUF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Qcm9wZXJ0eUF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuTUVUSE9EKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLkZJRUxEKTsKLQkJCi0JCSgoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgb3JtUHJvcGVydHlBdHRyaWJ1dGUpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJb3JtUHJvcGVydHlBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUHJvcGVydHlBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUHJvcGVydHlBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVByb3BlcnR5QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQlhc3NlcnRUcnVlKG9ybVByb3BlcnR5QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5GSUVMRCk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5GSUVMRCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJCi0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5GSUVMRCk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuRklFTEQpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5GSUVMRCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NQcm9wZXJ0eUluSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nUHJvcGVydHlBY2Nlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCQotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuTUVUSE9EKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLk1FVEhPRCk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuTUVUSE9EKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLk1FVEhPRCk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5NRVRIT0QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NQcm9wZXJ0eUluSmF2YTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkUHJvcGVydHlTcGVjaWZpZWQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCQotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuTUVUSE9EKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLk1FVEhPRCk7Ci0KLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBuYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIik7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5hbWVKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibmFtZSIpOwotCQkKLQkJYXNzZXJ0VHJ1ZShuYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBuYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUobmFtZU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG5hbWVKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUobmFtZUphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuRklFTEQpOwotCi0JCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuTUVUSE9EKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLk1FVEhPRCk7Ci0JCQotCQluYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbCgpOwotCQluYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIik7Ci0JCWFzc2VydEZhbHNlKG5hbWVPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG5hbWVPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG5hbWVPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKG5hbWVPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBuYW1lSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKG5hbWVKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgbmFtZU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRGYWxzZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLk1FVEhPRCk7Ci0KLQkJYXNzZXJ0RmFsc2UobmFtZU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgbmFtZU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBuYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG5hbWVPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgbmFtZUphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShuYW1lSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5GSUVMRCk7Ci0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudFR5cGUyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlMl8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI5MDFhNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudFR5cGUyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlMl8wVGVzdHMKLQlleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewkKLQotCXB1YmxpYyBHZW5lcmljT3JtUGVyc2lzdGVudFR5cGUyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uKG5hbWU9XCJGT09cIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRQcm9wZXJ0eVNwZWNpZmllZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBKUEEuSUQsIEpQQTJfMC5BQ0NFU1MsIEpQQTJfMC5BQ0NFU1NfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKSIpOwotCQkJfQotCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmROYW1lRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIik7Ci0JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUZpZWxkU3BlY2lmaWVkUHJvcGVydHlBbm5vdGF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgSlBBLklELCBKUEEyXzAuQUNDRVNTLCBKUEEyXzAuQUNDRVNTX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eVNwZWNpZmllZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkFDQ0VTUywgSlBBMl8wLkFDQ0VTU19UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NXaXRoSmF2YUFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQkKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9YbWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc1dpdGhKYXZhQW5ub3RhdGlvbnNQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRQcm9wZXJ0eVNwZWNpZmllZCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCQotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbCgpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZFByb3BlcnR5U3BlY2lmaWVkKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJdGVyYXRvcjxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQkKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eVNwZWNpZmllZCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSXRlcmF0b3I8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiB2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJCi0JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQl2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQkKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQl2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQkKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVzMygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RmllbGRTcGVjaWZpZWRQcm9wZXJ0eUFubm90YXRlZCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSXRlcmF0b3I8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiB2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCB2aXJ0dWFsQXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCi0JCXZpcnR1YWxBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCB2aXJ0dWFsQXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGUuYWRkVG9YbWwoKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCB2aXJ0dWFsQXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQotCQl2aXJ0dWFsQXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgdmlydHVhbEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkQXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBzcGVjaWZpZWRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQkKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKS5hZGRUb1htbCgpOwotCQl2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgdmlydHVhbEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlTcGVjaWZpZWQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCQotCQlqYXZhUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJCi0JCWphdmFQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yMl8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI3ZTEzMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0vKioKLSAqICBHZW5lcmljMl8wT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzBUZXN0cwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzBUZXN0cwotCWV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwdWJsaWMgR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogY2F0YWxvZyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMCBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKTsJCQotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0KLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5zZXRDYXRhbG9nKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0Q2F0YWxvZygpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yMl8wIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yMl8wKSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldFNwZWNpZmllZENhdGFsb2coIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogc2NoZW1hICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2VxdWVuY2VHZW5lcmF0b3IyXzAgc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3IyXzApIGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7CQkKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0U2NoZW1hKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRTY2hlbWEoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0U2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yMl8wIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yMl8wKSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldFNwZWNpZmllZFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpYzJfMENvbm5lY3Rpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljMl8wQ29ubmVjdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MTNiOWUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljMl8wQ29ubmVjdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5KcGFDb25uZWN0aW9uMl8wOwotCi0vKioKLSAqICBHZW5lcmljQ29ubmVjdGlvbjJfMFRlc3RzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWMyXzBDb25uZWN0aW9uVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wUGVyc2lzdGVuY2VVbml0VGVzdHMKLXsKLQlwcml2YXRlIEpwYUNvbm5lY3Rpb24yXzAgY29ubmVjdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSSVZFUl9LRVkgPSBKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfRFJJVkVSOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSSVZFUl9URVNUX1ZBTFVFID0gInRlc3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSSVZFUl9URVNUX1ZBTFVFXzIgPSAidGVzdF8yIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfS0VZID0gSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VSTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfVEVTVF9WQUxVRSA9ICJ0ZXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfVEVTVF9WQUxVRV8yID0gInRlc3RfMiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0tFWSA9IEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19VU0VSOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfVEVTVF9WQUxVRSA9ICJ0ZXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzIiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkRfS0VZID0gSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1BBU1NXT1JEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEX1RFU1RfVkFMVUUgPSAidGVzdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkRfVEVTVF9WQUxVRV8yID0gInRlc3RfMiI7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEdlbmVyaWMyXzBDb25uZWN0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5jb25uZWN0aW9uID0gKEpwYUNvbm5lY3Rpb24yXzApIHRoaXMuc3ViamVjdC5nZXRDb25uZWN0aW9uKCk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSnBhQ29ubmVjdGlvbjJfMC5EUklWRVJfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihKcGFDb25uZWN0aW9uMl8wLlVSTF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEpwYUNvbm5lY3Rpb24yXzAuVVNFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEpwYUNvbm5lY3Rpb24yXzAuUEFTU1dPUkRfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gNDsgLy8gUGVyc2lzdGVuY2VVbml0IHByb3BlcnRpZXMKLQkJdGhpcy5wcm9wZXJ0aWVzVG90YWwgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCArIDE7IC8vIDEgbWlzYyBwcm9wZXJ0aWVzCi0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsOwotCQkKLQkJLy8gSW5pdGlhbGl6ZXMgUGVyc2lzdGVuY2VVbml0IHByb3BlcnRpZXMKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4xIiwgInZhbHVlLjEiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShEUklWRVJfS0VZLCBEUklWRVJfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShVUkxfS0VZLCBVUkxfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShVU0VSX0tFWSwgVVNFUl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFBBU1NXT1JEX0tFWSwgUEFTU1dPUkRfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJT2JqZWN0IG1vZGVsVmFsdWUgPSBudWxsOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFDb25uZWN0aW9uMl8wLkRSSVZFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldERyaXZlcigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYUNvbm5lY3Rpb24yXzAuVVJMX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0VXJsKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhQ29ubmVjdGlvbjJfMC5VU0VSX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0VXNlcigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYUNvbm5lY3Rpb24yXzAuUEFTU1dPUkRfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRQYXNzd29yZCgpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImdldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIG1vZGVsVmFsdWU7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFDb25uZWN0aW9uMl8wLkRSSVZFUl9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0RHJpdmVyKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFDb25uZWN0aW9uMl8wLlVSTF9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0VXJsKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFDb25uZWN0aW9uMl8wLlVTRVJfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFVzZXIoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYUNvbm5lY3Rpb24yXzAuUEFTU1dPUkRfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFBhc3N3b3JkKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBEcml2ZXIgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXREcml2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJRFJJVkVSX0tFWSwKLQkJCURSSVZFUl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCURSSVZFUl9LRVksCi0JCQlEUklWRVJfVEVTVF9WQUxVRSwKLQkJCURSSVZFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVEcml2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCURSSVZFUl9LRVksCi0JCQlEUklWRVJfVEVTVF9WQUxVRSwKLQkJCURSSVZFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVXJsIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VXJsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVVSTF9LRVksCi0JCQlVUkxfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlVUkxfS0VZLAotCQkJVVJMX1RFU1RfVkFMVUUsCi0JCQlVUkxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVXJsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlVUkxfS0VZLAotCQkJVVJMX1RFU1RfVkFMVUUsCi0JCQlVUkxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFVzZXIgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVVTRVJfS0VZLAotCQkJVVNFUl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVVTRVJfS0VZLAotCQkJVVNFUl9URVNUX1ZBTFVFLAotCQkJVVNFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlVU0VSX0tFWSwKLQkJCVVTRVJfVEVTVF9WQUxVRSwKLQkJCVVTRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFBhc3N3b3JkIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UGFzc3dvcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJUEFTU1dPUkRfS0VZLAotCQkJUEFTU1dPUkRfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlQQVNTV09SRF9LRVksCi0JCQlQQVNTV09SRF9URVNUX1ZBTFVFLAotCQkJUEFTU1dPUkRfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUGFzc3dvcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVBBU1NXT1JEX0tFWSwKLQkJCVBBU1NXT1JEX1RFU1RfVkFMVUUsCi0JCQlQQVNTV09SRF9URVNUX1ZBTFVFXzIpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpYzJfMEpwYU1ldGFkYXRhQ29udmVyc2lvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBKcGFNZXRhZGF0YUNvbnZlcnNpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTg0ZGEzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpYzJfMEpwYU1ldGFkYXRhQ29udmVyc2lvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYU5hbWVkQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUXVlcnlIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkdlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkxvY2tNb2RlVHlwZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1OYW1lZFF1ZXJ5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpYzJfMEpwYU1ldGFkYXRhQ29udmVyc2lvblRlc3RzIGV4dGVuZHMKLQkJR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlIHsKLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3I7Ci0KLQlwdWJsaWMgR2VuZXJpYzJfMEpwYU1ldGFkYXRhQ29udmVyc2lvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnByb2dyZXNzTW9uaXRvciA9IG5ldyBJUHJvZ3Jlc3NNb25pdG9yKCkgewotCQkJcHVibGljIHZvaWQgd29ya2VkKGludCB3b3JrKSB7fQotCQkJcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkge30KLQkJCXB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyBuYW1lKSB7fQotCQkJcHVibGljIHZvaWQgc2V0Q2FuY2VsZWQoYm9vbGVhbiB2YWx1ZSkge30KLQkJCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7cmV0dXJuIGZhbHNlO30KLQkJCXB1YmxpYyB2b2lkIGludGVybmFsV29ya2VkKGRvdWJsZSB3b3JrKSB7fQotCQkJcHVibGljIHZvaWQgZG9uZSgpIHt9Ci0JCQlwdWJsaWMgdm9pZCBiZWdpblRhc2soU3RyaW5nIG5hbWUsIGludCB0b3RhbFdvcmspIHt9Ci0JCX0gOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCS8vICoqKioqKioqKioqKiBlbnRpdHkgd2l0aCBxdWVyaWVzKioqKioqKioqKioqKgotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk5BTUVEX1FVRVJJRVMsIEpQQS5OQU1FRF9RVUVSWSwgSlBBLlFVRVJZX0hJTlQsIEpQQTJfMC5MT0NLX01PREVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWRRdWVyaWVzKHsiICsKLQkJCQkJCQkiQE5hbWVkUXVlcnkobmFtZT1cIm5xMVwiLCBxdWVyeT1cImFiY2RcIiwgbG9ja01vZGU9TG9ja01vZGVUeXBlLk9QVElNSVNUSUMsICIgKwotCQkJCQkJCQkJCSJoaW50cz17QFF1ZXJ5SGludChuYW1lPVwibnExaGludDFcIiwgdmFsdWUgPSBcImFhYVwiKSwgIiArCi0JCQkJCQkJCQkJCQkiQFF1ZXJ5SGludChuYW1lPVwibnExaGludDJcIiwgdmFsdWU9XCJiYmJcIil9KSwgIiArCi0JCQkJCQkJIkBOYW1lZFF1ZXJ5KG5hbWU9XCJucTJcIiwgcXVlcnk9XCJlZmdoXCIsIGxvY2tNb2RlPUxvY2tNb2RlVHlwZS5SRUFELCAiICsKLQkJCQkJCQkJCQkiaGludHM9QFF1ZXJ5SGludChuYW1lPVwibnEyaGludDFcIiwgdmFsdWU9XCJjY2NcIikpfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkTmF0aXZlUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZLCBKUEEuUVVFUllfSElOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWROYXRpdmVRdWVyaWVzKHsiICsKLQkJCQkJCQkiQE5hbWVkTmF0aXZlUXVlcnkobmFtZT1cIm5ucTFcIiwgcXVlcnk9XCJhYmNkXCIsIHJlc3VsdENsYXNzPWZvbzEuY2xhc3MsIHJlc3VsdFNldE1hcHBpbmc9XCJiYXIxXCIsICIgKwotCQkJCQkJCQkJCSJoaW50cz17QFF1ZXJ5SGludChuYW1lPVwibm5xMWhpbnQxXCIsIHZhbHVlID0gXCJhYWFcIiksICIgKwotCQkJCQkJCQkJCQkJIkBRdWVyeUhpbnQobmFtZT1cIm5ucTFoaW50MlwiLCB2YWx1ZT1cImJiYlwiKX0pLCAiICsKLQkJCQkJCQkiQE5hbWVkTmF0aXZlUXVlcnkobmFtZT1cIm5ucTJcIiwgcXVlcnk9XCJlZmdoXCIsIHJlc3VsdENsYXNzPWZvbzIuY2xhc3MsIHJlc3VsdFNldE1hcHBpbmc9XCJiYXIyXCIsICIgKwotCQkJCQkJCQkJCSJoaW50cz1AUXVlcnlIaW50KG5hbWU9XCJubnEyaGludDFcIiwgdmFsdWU9XCJjY2NcIikpfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aER1cGxpY2F0ZVF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLk5BTUVEX1FVRVJZLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE5hbWVkUXVlcnkobmFtZT1cInF1ZXJ5XCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZE5hdGl2ZVF1ZXJpZXMoe0BOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWU9XCJxdWVyeVwiKSwgQE5hbWVkTmF0aXZlUXVlcnkobmFtZT1cIm5ucVwiKX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhRdWVyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5OQU1FRF9RVUVSSUVTLCBKUEEuTkFNRURfUVVFUlksIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE5hbWVkUXVlcmllcyh7QE5hbWVkUXVlcnkobmFtZT1cIm5xXCIpLCBATmFtZWRRdWVyeShuYW1lPVwicXVlcnlcIil9KSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWROYXRpdmVRdWVyeShuYW1lPVwibm5xXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyV2l0aE5hbWVkUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBKUEEuTkFNRURfUVVFUklFUywgSlBBLk5BTUVEX1FVRVJZLCBKUEEuUVVFUllfSElOVCwgSlBBMl8wLkxPQ0tfTU9ERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWRRdWVyaWVzKHsiICsKLQkJCQkJCQkiQE5hbWVkUXVlcnkobmFtZT1cIm5xMVwiLCBxdWVyeT1cImFiY2RcIiwgbG9ja01vZGU9TG9ja01vZGVUeXBlLk9QVElNSVNUSUMsICIgKwotCQkJCQkJCQkJCSJoaW50cz17QFF1ZXJ5SGludChuYW1lPVwibnExaGludDFcIiwgdmFsdWUgPSBcImFhYVwiKSwgIiArCi0JCQkJCQkJCQkJCQkiQFF1ZXJ5SGludChuYW1lPVwibnExaGludDJcIiwgdmFsdWU9XCJiYmJcIil9KSwgIiArCi0JCQkJCQkJIkBOYW1lZFF1ZXJ5KG5hbWU9XCJucTJcIiwgcXVlcnk9XCJlZmdoXCIsIGxvY2tNb2RlPUxvY2tNb2RlVHlwZS5SRUFELCAiICsKLQkJCQkJCQkJCQkiaGludHM9QFF1ZXJ5SGludChuYW1lPVwibnEyaGludDFcIiwgdmFsdWU9XCJjY2NcIikpfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhOYW1lZE5hdGl2ZVF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZLCBKUEEuUVVFUllfSElOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE5hbWVkTmF0aXZlUXVlcmllcyh7IiArCi0JCQkJCQkJIkBOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWU9XCJubnExXCIsIHF1ZXJ5PVwiYWJjZFwiLCByZXN1bHRDbGFzcz1mb28xLmNsYXNzLCByZXN1bHRTZXRNYXBwaW5nPVwiYmFyMVwiLCAiICsKLQkJCQkJCQkJCQkiaGludHM9e0BRdWVyeUhpbnQobmFtZT1cIm5ucTFoaW50MVwiLCB2YWx1ZSA9IFwiYWFhXCIpLCAiICsKLQkJCQkJCQkJCQkJCSJAUXVlcnlIaW50KG5hbWU9XCJubnExaGludDJcIiwgdmFsdWU9XCJiYmJcIil9KSwgIiArCi0JCQkJCQkJIkBOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWU9XCJubnEyXCIsIHF1ZXJ5PVwiZWZnaFwiLCByZXN1bHRDbGFzcz1mb28yLmNsYXNzLCByZXN1bHRTZXRNYXBwaW5nPVwiYmFyMlwiLCAiICsKLQkJCQkJCQkJCQkiaGludHM9QFF1ZXJ5SGludChuYW1lPVwibm5xMmhpbnQxXCIsIHZhbHVlPVwiY2NjXCIpKX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydE5hbWVkUXVlcmllc09uRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWRRdWVyaWVzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCWFkZFhtbE1hcHBpbmdGaWxlUmVmKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQuY29udmVydEphdmFRdWVyaWVzKGVudGl0eU1hcHBpbmdzLCBwcm9ncmVzc01vbml0b3IpOwotCQkKLQkJLy8gdGVzdCBKYXZhIHF1ZXJpZXMgYXJlIGNvbnZlcnRlZCB0byBvcm0ueG1sIGFuZCByZW1vdmVkIGZyb20gdGhlIEphdmEgZW50aXR5Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlNYXBwaW5ncy5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXNTaXplKCkpOwotCQkKLQkJLy8gdGVzdCB0aGUgbWFwcGluZyBmaWxlIHF1ZXJpZXMgaGF2ZSBjb3JyZWN0IHZhbHVlcwotCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzPSBlbnRpdHlNYXBwaW5ncy5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCU9ybU5hbWVkUXVlcnkgbnExID0gbmFtZWRRdWVyaWVzLm5leHQoKTsKLQkJCi0JCS8vIHRlc3QgdGhlIGZpcnN0IG1hcHBpbmcgZmlsZSBxdWVyeQotCQlhc3NlcnRFcXVhbHMoIm5xMSIsIChucTEuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygiYWJjZCIsIChucTEuZ2V0UXVlcnkoKSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgKG5xMS5nZXRIaW50c1NpemUoKSkpOwotCQkKLQkJLy8gdGVzdCB0aGUgcXVlcnkgaGludHMgb2YgdGhlIGZpcnN0IG1hcHBpbmcgZmlsZSBxdWVyeSBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlCi0JCUxpc3RJdGVyYXRvcjxPcm1RdWVyeUhpbnQ+IG5xMWhpbnRzID0gbnExLmdldEhpbnRzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCS8vIHRlc3QgdGhlIGZpcnN0IHF1ZXJ5IGhpbnQgb2YgdGhlIGZpcnN0IG1hcHBpbmcgZmlsZSBxdWVyeQotCQlPcm1RdWVyeUhpbnQgbnExaGludDEgPSBucTFoaW50cy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibnExaGludDEiLCBucTFoaW50MS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFhYSIsIG5xMWhpbnQxLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gdGVzdCB0aGUgc2Vjb25kIHF1ZXJ5IGhpbnQgb2YgdGhlIGZpcnN0IG1hcHBpbmcgZmlsZSBxdWVyeQotCQlPcm1RdWVyeUhpbnQgbnExaGludDIgPSBucTFoaW50cy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibnExaGludDIiLCBucTFoaW50Mi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJiYiIsIG5xMWhpbnQyLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gdGVzdCB0aGUgc2Vjb25kIG1hcHBpbmcgZmlsZSBxdWVyeQotCQlPcm1OYW1lZFF1ZXJ5IG5xMiA9IG5hbWVkUXVlcmllcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibnEyIiwgKG5xMi5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlZmdoIiwgKG5xMi5nZXRRdWVyeSgpKSk7Ci0JCWFzc2VydEVxdWFscygxLCAobnEyLmdldEhpbnRzU2l6ZSgpKSk7Ci0JCQotCQkvLyB0ZXN0IHRoZSBxdWVyeSBoaW50cyBvZiB0aGUgc2Vjb25kIG1hcHBpbmcgZmlsZSBxdWVyeSBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlCi0JCU9ybVF1ZXJ5SGludCBucTJoaW50MSA9IG5xMi5nZXRIaW50cygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJLy8gdGVzdCB0aGUgcXVlcnkgaGludCBvZiB0aGUgc2Vjb25kIG1hcHBpbmcgZmlsZSBxdWVyeQotCQlhc3NlcnRFcXVhbHMoIm5xMmhpbnQxIiwgbnEyaGludDEuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjY2MiLCBucTJoaW50MS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuT1BUSU1JU1RJQywgKChPcm1OYW1lZFF1ZXJ5Ml8wKW5xMSkuZ2V0TG9ja01vZGUoKSk7Ci0JCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuUkVBRCwgKChPcm1OYW1lZFF1ZXJ5Ml8wKW5xMikuZ2V0TG9ja01vZGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0TmFtZWROYXRpdmVRdWVyaWVzT25FbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJYWRkWG1sTWFwcGluZ0ZpbGVSZWYoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCQotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCXBlcnNpc3RlbmNlVW5pdC5jb252ZXJ0SmF2YVF1ZXJpZXMoZW50aXR5TWFwcGluZ3MsIHByb2dyZXNzTW9uaXRvcik7Ci0JCQotCQkvLyB0ZXN0IEphdmEgcXVlcmllcyBhcmUgY29udmVydGVkIHRvIG9ybS54bWwgYW5kIHJlbW92ZWQgZnJvbSB0aGUgSmF2YSBlbnRpdHkKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eU1hcHBpbmdzLmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllc1NpemUoKSk7Ci0JCQotCQkvLyB0ZXN0IHRoZSBtYXBwaW5nIGZpbGUgcXVlcmllcyBoYXZlIGNvcnJlY3QgdmFsdWVzCi0JCUNvbGxlY3Rpb248T3JtTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oZW50aXR5TWFwcGluZ3MuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKSk7Ci0KLQkJLy8gdGVzdCB0aGUgZmlyc3QgbWFwcGluZyBmaWxlIHF1ZXJ5Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgbm5xMSA9IHNlbGVjdE5vZGVOYW1lZChuYW1lZE5hdGl2ZVF1ZXJpZXMsICJubnExIik7Ci0JCWFzc2VydEVxdWFscygibm5xMSIsIChubnExLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoImFiY2QiLCAobm5xMS5nZXRRdWVyeSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMSIsIG5ucTEuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMSIsIG5ucTEuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIChubnExLmdldEhpbnRzU2l6ZSgpKSk7Ci0JCQotCQkvLyB0ZXN0IHRoZSBxdWVyeSBoaW50cyBvZiB0aGUgZmlyc3QgbWFwcGluZyBmaWxlIHF1ZXJ5IGhhdmUgdGhlIGNvcnJlY3QgdmFsdWUKLQkJTGlzdEl0ZXJhdG9yPE9ybVF1ZXJ5SGludD4gbnExaGludHMgPSBubnExLmdldEhpbnRzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCS8vIHRlc3QgdGhlIGZpcnN0IHF1ZXJ5IGhpbnQgb2YgdGhlIGZpcnN0IG1hcHBpbmcgZmlsZSBxdWVyeQotCQlPcm1RdWVyeUhpbnQgbm5xMWhpbnQxID0gbnExaGludHMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5ucTFoaW50MSIsIG5ucTFoaW50MS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFhYSIsIG5ucTFoaW50MS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHRlc3QgdGhlIHNlY29uZCBxdWVyeSBoaW50IG9mIHRoZSBmaXJzdCBtYXBwaW5nIGZpbGUgcXVlcnkKLQkJT3JtUXVlcnlIaW50IG5ucTFoaW50MiA9IG5xMWhpbnRzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJubnExaGludDIiLCBubnExaGludDIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYmIiLCBubnExaGludDIuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyB0ZXN0IHRoZSBzZWNvbmQgbWFwcGluZyBmaWxlIHF1ZXJ5Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgbm5xMiA9IHNlbGVjdE5vZGVOYW1lZChuYW1lZE5hdGl2ZVF1ZXJpZXMsICJubnEyIik7Ci0JCWFzc2VydEVxdWFscygibm5xMiIsIChubnEyLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoImVmZ2giLCAobm5xMi5nZXRRdWVyeSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIG5ucTIuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIG5ucTIuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIChubnEyLmdldEhpbnRzU2l6ZSgpKSk7Ci0JCQotCQkvLyB0ZXN0IHRoZSBxdWVyeSBoaW50cyBvZiB0aGUgc2Vjb25kIG1hcHBpbmcgZmlsZSBxdWVyeSBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlCi0JCU9ybVF1ZXJ5SGludCBubnEyaGludDEgPSBubnEyLmdldEhpbnRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoZSBxdWVyeSBoaW50IG9mIHRoZSBzZWNvbmQgbWFwcGluZyBmaWxlIHF1ZXJ5Ci0JCWFzc2VydEVxdWFscygibm5xMmhpbnQxIiwgbm5xMmhpbnQxLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2NjIiwgbm5xMmhpbnQxLmdldFZhbHVlKCkpOwotCQkKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIDxOIGV4dGVuZHMgSnBhTmFtZWRDb250ZXh0Tm9kZT4gTiBzZWxlY3ROb2RlTmFtZWQoSXRlcmFibGU8Tj4gbm9kZXMsIFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoTiBub2RlIDogbm9kZXMpIHsKLQkJCWlmIChub2RlLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydE92ZXJyaWRkZW5RdWVyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUXVlcmllcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCWFkZFhtbE1hcHBpbmdGaWxlUmVmKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5ucSA9IGVudGl0eU1hcHBpbmdzLmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgpOwotCQlubnEuc2V0TmFtZSgibnEiKTsKLQkJT3JtTmFtZWRRdWVyeSBucSA9IGVudGl0eU1hcHBpbmdzLmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgpOwotCQlucS5zZXROYW1lKCJubnEiKTsKLQkJCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlwZXJzaXN0ZW5jZVVuaXQuY29udmVydEphdmFRdWVyaWVzKGVudGl0eU1hcHBpbmdzLCBwcm9ncmVzc01vbml0b3IpOwotCQkKLQkJLy8gdGVzdCBvdmVycmlkZGVuIEphdmEgcXVlcmllcyBhcmUgbm90IGNvbnZlcnRlZCB0byBvcm0ueG1sIGFuZCBub3QgCi0JCS8vIHJlbW92ZWQgZnJvbSB0aGUgSmF2YSBlbnRpdHksIGJ1dCB1bmlxdWUgcXVlcnkgaXMKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5TWFwcGluZ3MuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5TWFwcGluZ3MuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydER1cGxpY2F0ZVF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEdXBsaWNhdGVRdWVyaWVzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJYWRkWG1sTWFwcGluZ0ZpbGVSZWYoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCXBlcnNpc3RlbmNlVW5pdC5jb252ZXJ0SmF2YVF1ZXJpZXMoZW50aXR5TWFwcGluZ3MsIHByb2dyZXNzTW9uaXRvcik7Ci0KLQkJSmF2YUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCQotCQkvLyB0ZXN0IGR1cGxpY2F0ZSBKYXZhIHF1ZXJpZXMgYXJlIG5vdCBjb252ZXJ0ZWQgdG8gb3JtLnhtbCBhbmQgCi0JCS8vIG5vdCByZW1vdmVkIGZyb20gdGhlIEphdmEgZW50aXR5LCBidXQgdW5pcXVlIHF1ZXJ5IGlzIAotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlNYXBwaW5ncy5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBlbnRpdHlNYXBwaW5ncy5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0TmFtZWRRdWVyaWVzT25NYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcldpdGhOYW1lZFF1ZXJpZXMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEphdmFNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFkZFhtbE1hcHBpbmdGaWxlUmVmKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQuY29udmVydEphdmFRdWVyaWVzKGVudGl0eU1hcHBpbmdzLCBwcm9ncmVzc01vbml0b3IpOwotCQkKLQkJLy8gdGVzdCBKYXZhIHF1ZXJpZXMgYXJlIGNvbnZlcnRlZCB0byBvcm0ueG1sIGFuZCByZW1vdmVkIGZyb20gdGhlIEphdmEgZW50aXR5Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlNYXBwaW5ncy5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBtYXBwZWRTdXBlcmNsYXNzLmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCS8vIHRlc3QgdGhlIG1hcHBpbmcgZmlsZSBxdWVyaWVzIGhhdmUgY29ycmVjdCB2YWx1ZXMKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcz0gZW50aXR5TWFwcGluZ3MuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlPcm1OYW1lZFF1ZXJ5IG5xMSA9IG5hbWVkUXVlcmllcy5uZXh0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoZSBmaXJzdCBtYXBwaW5nIGZpbGUgcXVlcnkKLQkJYXNzZXJ0RXF1YWxzKCJucTEiLCAobnExLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoImFiY2QiLCAobnExLmdldFF1ZXJ5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIChucTEuZ2V0SGludHNTaXplKCkpKTsKLQkJCi0JCS8vIHRlc3QgdGhlIHF1ZXJ5IGhpbnRzIG9mIHRoZSBmaXJzdCBtYXBwaW5nIGZpbGUgcXVlcnkgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZQotCQlMaXN0SXRlcmF0b3I8T3JtUXVlcnlIaW50PiBucTFoaW50cyA9IG5xMS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCQotCQkvLyB0ZXN0IHRoZSBmaXJzdCBxdWVyeSBoaW50IG9mIHRoZSBmaXJzdCBtYXBwaW5nIGZpbGUgcXVlcnkKLQkJT3JtUXVlcnlIaW50IG5xMWhpbnQxID0gbnExaGludHMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5xMWhpbnQxIiwgbnExaGludDEuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYWEiLCBucTFoaW50MS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHRlc3QgdGhlIHNlY29uZCBxdWVyeSBoaW50IG9mIHRoZSBmaXJzdCBtYXBwaW5nIGZpbGUgcXVlcnkKLQkJT3JtUXVlcnlIaW50IG5xMWhpbnQyID0gbnExaGludHMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5xMWhpbnQyIiwgbnExaGludDIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYmIiLCBucTFoaW50Mi5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHRlc3QgdGhlIHNlY29uZCBtYXBwaW5nIGZpbGUgcXVlcnkKLQkJT3JtTmFtZWRRdWVyeSBucTIgPSBuYW1lZFF1ZXJpZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5xMiIsIChucTIuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZWZnaCIsIChucTIuZ2V0UXVlcnkoKSkpOwotCQlhc3NlcnRFcXVhbHMoMSwgKG5xMi5nZXRIaW50c1NpemUoKSkpOwotCQkKLQkJLy8gdGVzdCB0aGUgcXVlcnkgaGludHMgb2YgdGhlIHNlY29uZCBtYXBwaW5nIGZpbGUgcXVlcnkgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZQotCQlPcm1RdWVyeUhpbnQgbnEyaGludDEgPSBucTIuZ2V0SGludHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCS8vIHRlc3QgdGhlIHF1ZXJ5IGhpbnQgb2YgdGhlIHNlY29uZCBtYXBwaW5nIGZpbGUgcXVlcnkKLQkJYXNzZXJ0RXF1YWxzKCJucTJoaW50MSIsIG5xMmhpbnQxLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2NjIiwgbnEyaGludDEuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTG9ja01vZGVUeXBlMl8wLk9QVElNSVNUSUMsICgoT3JtTmFtZWRRdWVyeTJfMClucTEpLmdldExvY2tNb2RlKCkpOwotCQlhc3NlcnRFcXVhbHMoTG9ja01vZGVUeXBlMl8wLlJFQUQsICgoT3JtTmFtZWRRdWVyeTJfMClucTIpLmdldExvY2tNb2RlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydE5hbWVkTmF0aXZlUXVlcmllc09uTWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhOYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEphdmFNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFkZFhtbE1hcHBpbmdGaWxlUmVmKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQuY29udmVydEphdmFRdWVyaWVzKGVudGl0eU1hcHBpbmdzLCBwcm9ncmVzc01vbml0b3IpOwotCQkKLQkJLy8gdGVzdCBKYXZhIHF1ZXJpZXMgYXJlIGNvbnZlcnRlZCB0byBvcm0ueG1sIGFuZCByZW1vdmVkIGZyb20gdGhlIEphdmEgZW50aXR5Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlNYXBwaW5ncy5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBtYXBwZWRTdXBlcmNsYXNzLmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCS8vIHRlc3QgdGhlIG1hcHBpbmcgZmlsZSBxdWVyaWVzIGhhdmUgY29ycmVjdCB2YWx1ZXMKLQkJQ29sbGVjdGlvbjxPcm1OYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihlbnRpdHlNYXBwaW5ncy5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpKTsKLQotCQkvLyB0ZXN0IHRoZSBmaXJzdCBtYXBwaW5nIGZpbGUgcXVlcnkKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBubnExID0gc2VsZWN0Tm9kZU5hbWVkKG5hbWVkTmF0aXZlUXVlcmllcywgIm5ucTEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJubnExIiwgKG5ucTEuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygiYWJjZCIsIChubnExLmdldFF1ZXJ5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xIiwgbm5xMS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIxIiwgbm5xMS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgKG5ucTEuZ2V0SGludHNTaXplKCkpKTsKLQkJCi0JCS8vIHRlc3QgdGhlIHF1ZXJ5IGhpbnRzIG9mIHRoZSBmaXJzdCBtYXBwaW5nIGZpbGUgcXVlcnkgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZQotCQlMaXN0SXRlcmF0b3I8T3JtUXVlcnlIaW50PiBucTFoaW50cyA9IG5ucTEuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQkKLQkJLy8gdGVzdCB0aGUgZmlyc3QgcXVlcnkgaGludCBvZiB0aGUgZmlyc3QgbWFwcGluZyBmaWxlIHF1ZXJ5Ci0JCU9ybVF1ZXJ5SGludCBubnExaGludDEgPSBucTFoaW50cy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibm5xMWhpbnQxIiwgbm5xMWhpbnQxLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWFhIiwgbm5xMWhpbnQxLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gdGVzdCB0aGUgc2Vjb25kIHF1ZXJ5IGhpbnQgb2YgdGhlIGZpcnN0IG1hcHBpbmcgZmlsZSBxdWVyeQotCQlPcm1RdWVyeUhpbnQgbm5xMWhpbnQyID0gbnExaGludHMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5ucTFoaW50MiIsIG5ucTFoaW50Mi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJiYiIsIG5ucTFoaW50Mi5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHRlc3QgdGhlIHNlY29uZCBtYXBwaW5nIGZpbGUgcXVlcnkKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBubnEyID0gc2VsZWN0Tm9kZU5hbWVkKG5hbWVkTmF0aXZlUXVlcmllcywgIm5ucTIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJubnEyIiwgKG5ucTIuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZWZnaCIsIChubnEyLmdldFF1ZXJ5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgbm5xMi5nZXRSZXN1bHRDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIyIiwgbm5xMi5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgKG5ucTIuZ2V0SGludHNTaXplKCkpKTsKLQkJCi0JCS8vIHRlc3QgdGhlIHF1ZXJ5IGhpbnRzIG9mIHRoZSBzZWNvbmQgbWFwcGluZyBmaWxlIHF1ZXJ5IGhhdmUgdGhlIGNvcnJlY3QgdmFsdWUKLQkJT3JtUXVlcnlIaW50IG5ucTJoaW50MSA9IG5ucTIuZ2V0SGludHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCS8vIHRlc3QgdGhlIHF1ZXJ5IGhpbnQgb2YgdGhlIHNlY29uZCBtYXBwaW5nIGZpbGUgcXVlcnkKLQkJYXNzZXJ0RXF1YWxzKCJubnEyaGludDEiLCBubnEyaGludDEuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjY2MiLCBubnEyaGludDEuZ2V0VmFsdWUoKSk7Ci0JCQotCX0KLQkKLQotCS8vICoqKioqKioqKioqKiBlbnRpdHkgd2l0aCBnZW5lcmF0b3JzKioqKioqKioqKioqKgotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyYXRvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLlRBQkxFX0dFTkVSQVRPUiwgSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGVHZW5lcmF0b3IobmFtZT1cInRnZW5cIiwgdGFibGU9XCJJRF9HRU5cIiwgc2NoZW1hPVwiQVBQXCIsIGNhdGFsb2c9XCJGT09cIiwiICsKLQkJCQkJCSJwa0NvbHVtbk5hbWU9XCJHRU5fTkFNRVwiLCB2YWx1ZUNvbHVtbk5hbWU9XCJHRU5fVkFMVUVcIiwgcGtDb2x1bW5WYWx1ZT1cIlRHRU5cIiwiICsKLQkJCQkJCSJhbGxvY2F0aW9uU2l6ZT01MCwgaW5pdGlhbFZhbHVlPTEwMCkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFNlcXVlbmNlR2VuZXJhdG9yKG5hbWU9XCJzZ2VuXCIsIHNlcXVlbmNlTmFtZT1cIkZvb19TZXFcIiwgc2NoZW1hPVwiU1lTXCIsIGNhdGFsb2c9XCJCQVJcIiwiICsKLQkJCQkJCSJhbGxvY2F0aW9uU2l6ZT01LCBpbml0aWFsVmFsdWU9MTApIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmF0b3JzT25JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLlRBQkxFX0dFTkVSQVRPUiwgSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFRhYmxlR2VuZXJhdG9yKG5hbWU9XCJ0Z2VuXCIsIHRhYmxlPVwiSURfR0VOXCIsIHNjaGVtYT1cIkFQUFwiLCBjYXRhbG9nPVwiRk9PXCIsIiArCi0JCQkJCQkicGtDb2x1bW5OYW1lPVwiR0VOX05BTUVcIiwgdmFsdWVDb2x1bW5OYW1lPVwiR0VOX1ZBTFVFXCIsIHBrQ29sdW1uVmFsdWU9XCJUR0VOXCIsIiArCi0JCQkJCQkiYWxsb2NhdGlvblNpemU9NTAsIGluaXRpYWxWYWx1ZT0xMDApIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBTZXF1ZW5jZUdlbmVyYXRvcihuYW1lPVwic2dlblwiLCBzZXF1ZW5jZU5hbWU9XCJGb29fU2VxXCIsIHNjaGVtYT1cIlNZU1wiLCBjYXRhbG9nPVwiQkFSXCIsIiArCi0JCQkJCQkiYWxsb2NhdGlvblNpemU9NSwgaW5pdGlhbFZhbHVlPTEwKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRHVwbGljYXRlR2VuZXJhdG9ycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEuVEFCTEVfR0VORVJBVE9SLCBKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZUdlbmVyYXRvcihuYW1lPVwiZ2VuXCIsIHRhYmxlPVwiSURfR0VOXCIsIHNjaGVtYT1cIkFQUFwiLCBjYXRhbG9nPVwiRk9PXCIsIiArCi0JCQkJCQkicGtDb2x1bW5OYW1lPVwiR0VOX05BTUVcIiwgdmFsdWVDb2x1bW5OYW1lPVwiR0VOX1ZBTFVFXCIsIHBrQ29sdW1uVmFsdWU9XCJUR0VOXCIsIiArCi0JCQkJCQkiYWxsb2NhdGlvblNpemU9NTAsIGluaXRpYWxWYWx1ZT0xMDApIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBTZXF1ZW5jZUdlbmVyYXRvcihuYW1lPVwiZ2VuXCIsIHNlcXVlbmNlTmFtZT1cIkZvb19TZXFcIiwgc2NoZW1hPVwiU1lTXCIsIGNhdGFsb2c9XCJCQVJcIiwiICsKLQkJCQkJCSJhbGxvY2F0aW9uU2l6ZT01LCBpbml0aWFsVmFsdWU9MTApIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFRhYmxlR2VuZXJhdG9yKG5hbWU9XCJ0Z2VuXCIsIHRhYmxlPVwiSURfR0VOXCIsIHNjaGVtYT1cIkFQUFwiLCBjYXRhbG9nPVwiRk9PXCIsIiArCi0JCQkJCQkicGtDb2x1bW5OYW1lPVwiR0VOX05BTUVcIiwgdmFsdWVDb2x1bW5OYW1lPVwiR0VOX1ZBTFVFXCIsIHBrQ29sdW1uVmFsdWU9XCJUR0VOXCIsIiArCi0JCQkJCQkiYWxsb2NhdGlvblNpemU9NTAsIGluaXRpYWxWYWx1ZT0xMDApIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBTZXF1ZW5jZUdlbmVyYXRvcihuYW1lPVwiZ2VuXCIsIHNlcXVlbmNlTmFtZT1cIkZvb19TZXFcIiwgc2NoZW1hPVwiU1lTXCIsIGNhdGFsb2c9XCJCQVJcIiwiICsKLQkJCQkJCSJhbGxvY2F0aW9uU2l6ZT01LCBpbml0aWFsVmFsdWU9MTApIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUZXN0Q29udmVydEdlbmVyYXRvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmF0b3JzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCWFkZFhtbE1hcHBpbmdGaWxlUmVmKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQuY29udmVydEphdmFHZW5lcmF0b3JzKGVudGl0eU1hcHBpbmdzLCBwcm9ncmVzc01vbml0b3IpOwotCQkKLQkJLy8gdGVzdCBKYXZhIGdlbmVyYXRvcnMgYXJlIGNvbnZlcnRlZCB0byBvcm0ueG1sIGFuZCByZW1vdmVkIGZyb20gdGhlIEphdmEgZW50aXR5Ci0JCWFzc2VydEVxdWFscygxLCBlbnRpdHlNYXBwaW5ncy5nZXRTZXF1ZW5jZUdlbmVyYXRvcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5TWFwcGluZ3MuZ2V0VGFibGVHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQkKLQkJLy8gdGVzdCB0aGUgbWFwcGluZyBmaWxlIGdlbmVyYXRvcnMgaGF2ZSBjb3JyZWN0IHZhbHVlcwotCQlPcm1UYWJsZUdlbmVyYXRvciB0YWJsZUdlbiA9IGVudGl0eU1hcHBpbmdzLmdldFRhYmxlR2VuZXJhdG9ycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInRnZW4iLCB0YWJsZUdlbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIklEX0dFTiIsIHRhYmxlR2VuLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFQUCIsIHRhYmxlR2VuLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbi5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkdFTl9OQU1FIiwgdGFibGVHZW4uZ2V0UGtDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkdFTl9WQUxVRSIsIHRhYmxlR2VuLmdldFZhbHVlQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUR0VOIiwgdGFibGVHZW4uZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCB0YWJsZUdlbi5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgdGFibGVHZW4uZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQkKLQkJT3JtU2VxdWVuY2VHZW5lcmF0b3Igc2VxR2VuID0gZW50aXR5TWFwcGluZ3MuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic2dlbiIsIHNlcUdlbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvb19TZXEiLCBzZXFHZW4uZ2V0U2VxdWVuY2VOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgc2VxR2VuLmdldEFsbG9jYXRpb25TaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHNlcUdlbi5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIlNZUyIsICgoR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yMl8wKXNlcUdlbikuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yMl8wKXNlcUdlbikuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGVzdENvbnZlcnRHZW5lcmF0b3JzT25JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmF0b3JzT25JZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJYWRkWG1sTWFwcGluZ0ZpbGVSZWYoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCQotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCXBlcnNpc3RlbmNlVW5pdC5jb252ZXJ0SmF2YUdlbmVyYXRvcnMoZW50aXR5TWFwcGluZ3MsIHByb2dyZXNzTW9uaXRvcik7Ci0JCQotCQkvLyB0ZXN0IEphdmEgZ2VuZXJhdG9ycyBhcmUgY29udmVydGVkIHRvIG9ybS54bWwgYW5kIHJlbW92ZWQgZnJvbSB0aGUgSmF2YSBlbnRpdHkKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eU1hcHBpbmdzLmdldFNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBlbnRpdHlNYXBwaW5ncy5nZXRUYWJsZUdlbmVyYXRvcnNTaXplKCkpOwotCQkKLQkJSmF2YUlkTWFwcGluZyBtYXBwaW5nID0gKEphdmFJZE1hcHBpbmcpZW50aXR5LmdldElkQXR0cmlidXRlKCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJCi0JCS8vIHRlc3QgdGhlIG1hcHBpbmcgZmlsZSBnZW5lcmF0b3JzIGhhdmUgY29ycmVjdCB2YWx1ZXMKLQkJT3JtVGFibGVHZW5lcmF0b3IgdGFibGVHZW4gPSBlbnRpdHlNYXBwaW5ncy5nZXRUYWJsZUdlbmVyYXRvcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0Z2VuIiwgdGFibGVHZW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJRF9HRU4iLCB0YWJsZUdlbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBUFAiLCB0YWJsZUdlbi5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW4uZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJHRU5fTkFNRSIsIHRhYmxlR2VuLmdldFBrQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJHRU5fVkFMVUUiLCB0YWJsZUdlbi5nZXRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVEdFTiIsIHRhYmxlR2VuLmdldFBrQ29sdW1uVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgdGFibGVHZW4uZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIHRhYmxlR2VuLmdldEluaXRpYWxWYWx1ZSgpKTsKLQkJCi0JCU9ybVNlcXVlbmNlR2VuZXJhdG9yIHNlcUdlbiA9IGVudGl0eU1hcHBpbmdzLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInNnZW4iLCBzZXFHZW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29fU2VxIiwgc2VxR2VuLmdldFNlcXVlbmNlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHNlcUdlbi5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBzZXFHZW4uZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJTWVMiLCAoKEdlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMClzZXFHZW4pLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKEdlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMClzZXFHZW4pLmdldENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0T3ZlcnJpZGVuR2VuZXJhdG9ycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aER1cGxpY2F0ZUdlbmVyYXRvcnMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQlhZGRYbWxNYXBwaW5nRmlsZVJlZihKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCUVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQkJT3JtU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2UgPSBlbnRpdHlNYXBwaW5ncy5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlzZXF1ZW5jZS5zZXROYW1lKCJnZW4iKTsKLQkJCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCi0JCUphdmFJZE1hcHBpbmcgbWFwcGluZyA9IChKYXZhSWRNYXBwaW5nKWVudGl0eS5nZXRJZEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdC5jb252ZXJ0SmF2YUdlbmVyYXRvcnMoZW50aXR5TWFwcGluZ3MsIHByb2dyZXNzTW9uaXRvcik7Ci0JCQotCQkvLyB0ZXN0IG92ZXJyaWRlbiBKYXZhIGdlbmVyYXRvcnMgYXJlIG5vdCBjb252ZXJ0ZWQgdG8gb3JtLnhtbCBhbmQgbm90IAotCQkvLyByZW1vdmVkIGZyb20gdGhlIEphdmEgZW50aXR5LCBidXQgdW5pcXVlIGdlbmVyYXRvciBpcwotCQlhc3NlcnROb3ROdWxsKGVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChlbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBlbnRpdHlNYXBwaW5ncy5nZXRTZXF1ZW5jZUdlbmVyYXRvcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5TWFwcGluZ3MuZ2V0VGFibGVHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0RHVwbGljYXRlR2VuZXJhdG9ycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aER1cGxpY2F0ZUdlbmVyYXRvcnMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCi0JCUphdmFJZE1hcHBpbmcgbWFwcGluZyA9IChKYXZhSWRNYXBwaW5nKWVudGl0eS5nZXRJZEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFkZFhtbE1hcHBpbmdGaWxlUmVmKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlwZXJzaXN0ZW5jZVVuaXQuY29udmVydEphdmFHZW5lcmF0b3JzKGVudGl0eU1hcHBpbmdzLCBwcm9ncmVzc01vbml0b3IpOwotCQkKLQkJLy8gdGVzdCBvdmVycmlkZW4gSmF2YSBnZW5lcmF0b3JzIGFyZSBub3QgY29udmVydGVkIHRvIG9ybS54bWwgYW5kIG5vdCAKLQkJLy8gcmVtb3ZlZCBmcm9tIHRoZSBKYXZhIGVudGl0eSwgYnV0IHVuaXF1ZSBnZW5lcmF0b3IgaXMKLQkJYXNzZXJ0Tm90TnVsbChlbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwoZW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5TWFwcGluZ3MuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eU1hcHBpbmdzLmdldFRhYmxlR2VuZXJhdG9yc1NpemUoKSk7Ci0JCWFzc2VydE5vdE51bGwobWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpYzJfME9wdGlvbnNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljMl8wT3B0aW9uc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZWEwN2UuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljMl8wT3B0aW9uc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuSnBhT3B0aW9uczJfMDsKLQotLyoqCi0gKiAgR2VuZXJpY09wdGlvbnMyXzBUZXN0cwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljMl8wT3B0aW9uc1Rlc3RzIGV4dGVuZHMgR2VuZXJpYzJfMFBlcnNpc3RlbmNlVW5pdFRlc3RzCi17Ci0JcHJpdmF0ZSBKcGFPcHRpb25zMl8wIG9wdGlvbnM7Ci0JcHJpdmF0ZSBMaXN0Q2hhbmdlRXZlbnQgcHJlUGVyc2lzdEV2ZW50OwotCXByaXZhdGUgTGlzdENoYW5nZUV2ZW50IHByZVVwZGF0ZUV2ZW50OwotCXByaXZhdGUgTGlzdENoYW5nZUV2ZW50IHByZVJlbW92ZUV2ZW50OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DS19USU1FT1VUX0tFWSA9IEpwYU9wdGlvbnMyXzAuUEVSU0lTVEVOQ0VfTE9DS19USU1FT1VUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBMT0NLX1RJTUVPVVRfVEVTVF9WQUxVRSA9IDEwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgTE9DS19USU1FT1VUX1RFU1RfVkFMVUVfMiA9IDIwMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1RJTUVPVVRfS0VZID0gSnBhT3B0aW9uczJfMC5QRVJTSVNURU5DRV9RVUVSWV9USU1FT1VUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUUgPSAxMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFFVRVJZX1RJTUVPVVRfVEVTVF9WQUxVRV8yID0gMjAwOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfS0VZID0gSnBhT3B0aW9uczJfMC5QRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRSA9ICJ0ZXN0X3ByZS1wZXJzaXN0X2dyb3VwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzJfcHJlLXBlcnNpc3RfZ3JvdXAiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9LRVkgPSBKcGFPcHRpb25zMl8wLlBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRSA9ICJ0ZXN0X3ByZS11cGRhdGVfZ3JvdXAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFXzIgPSAidGVzdF8yX3ByZS11cGRhdGVfZ3JvdXAiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9LRVkgPSBKcGFPcHRpb25zMl8wLlBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRSA9ICJ0ZXN0X3ByZS1yZW1vdmVfZ3JvdXAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFXzIgPSAidGVzdF8yX3ByZS1yZW1vdmVfZ3JvdXAiOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBHZW5lcmljMl8wT3B0aW9uc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMub3B0aW9ucyA9IChKcGFPcHRpb25zMl8wKSB0aGlzLnN1YmplY3QuZ2V0T3B0aW9ucygpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCi0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEpwYU9wdGlvbnMyXzAuTE9DS19USU1FT1VUX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSnBhT3B0aW9uczJfMC5RVUVSWV9USU1FT1VUX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJTGlzdENoYW5nZUxpc3RlbmVyIHZhbGlkYXRpb25Hcm91cExpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWxpZGF0aW9uR3JvdXBMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5vcHRpb25zLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfTElTVCwgdmFsaWRhdGlvbkdyb3VwTGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5vcHRpb25zLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9MSVNULCB2YWxpZGF0aW9uR3JvdXBMaXN0Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLm9wdGlvbnMuYWRkTGlzdENoYW5nZUxpc3RlbmVyKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0xJU1QsIHZhbGlkYXRpb25Hcm91cExpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUGVyc2lzdGVuY2VVbml0IHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgPSA1OyAvLyBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydGllcwotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsICsgMTsgLy8gMSBtaXNjIHByb3BlcnRpZXMKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7Ci0JCQotCQkvLyBJbml0aWFsaXplcyBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydGllcwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KExPQ0tfVElNRU9VVF9LRVksIExPQ0tfVElNRU9VVF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFFVRVJZX1RJTUVPVVRfS0VZLCBRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMyIsICJ2YWx1ZS4zIik7Ci0KLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0tFWSwgVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfS0VZLCBWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0tFWSwgVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25zOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJT2JqZWN0IG1vZGVsVmFsdWUgPSBudWxsOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLkxPQ0tfVElNRU9VVF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldExvY2tUaW1lb3V0KCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhT3B0aW9uczJfMC5RVUVSWV9USU1FT1VUX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLm9wdGlvbnMuZ2V0UXVlcnlUaW1lb3V0KCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZKSkgewotCQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLm9wdGlvbnMuZ2V0VmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHMoKS5pdGVyYXRvcigpOwotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuZ2V0Rmlyc3RFbGVtZW50KGl0ZXJhdG9yKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZKSkgewotCQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLm9wdGlvbnMuZ2V0VmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcygpLml0ZXJhdG9yKCk7Ci0JCQltb2RlbFZhbHVlID0gdGhpcy5nZXRGaXJzdEVsZW1lbnQoaXRlcmF0b3IpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFkpKSB7Ci0JCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMub3B0aW9ucy5nZXRWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzKCkuaXRlcmF0b3IoKTsKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmdldEZpcnN0RWxlbWVudChpdGVyYXRvcik7Ci0JCX0KLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBtb2RlbFZhbHVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLkxPQ0tfVElNRU9VVF9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMuc2V0TG9ja1RpbWVvdXQoKEludGVnZXIpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLlFVRVJZX1RJTUVPVVRfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLnNldFF1ZXJ5VGltZW91dCgoSW50ZWdlcikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMuYWRkVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLmFkZFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLmFkZFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIExvY2tUaW1lb3V0IHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TG9ja1RpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJTE9DS19USU1FT1VUX0tFWSwKLQkJCUxPQ0tfVElNRU9VVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUxPQ0tfVElNRU9VVF9LRVksCi0JCQlMT0NLX1RJTUVPVVRfVEVTVF9WQUxVRSwKLQkJCUxPQ0tfVElNRU9VVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVMb2NrVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJTE9DS19USU1FT1VUX0tFWSwKLQkJCUxPQ0tfVElNRU9VVF9URVNUX1ZBTFVFLAotCQkJTE9DS19USU1FT1VUX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogUXVlcnlUaW1lb3V0IHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UXVlcnlUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVFVRVJZX1RJTUVPVVRfS0VZLAotCQkJUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVFVRVJZX1RJTUVPVVRfS0VZLAotCQkJUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFLAotCQkJUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVRdWVyeVRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVFVRVJZX1RJTUVPVVRfS0VZLAotCQkJUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFLAotCQkJUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFZhbGlkYXRpb25Hcm91cFByb3BlcnR5KAotCQkJSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcm9wZXJ0eSgKLQkJCUpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0Q29tcG9zaXRlVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRDb21wb3NpdGVWYWx1ZSgKLQkJCUpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0Q29tcG9zaXRlVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVDb21wb3NpdGVWYWx1ZSgKLQkJCUpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0VmFsaWRhdGlvbkdyb3VwUHJvcGVydHkoCi0JCQlKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcm9wZXJ0eSgKLQkJCUpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZUNvbXBvc2l0ZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkQ29tcG9zaXRlVmFsdWUoCi0JCQlKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVDb21wb3NpdGVWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVJlbW92ZUNvbXBvc2l0ZVZhbHVlKAotCQkJSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFZhbGlkYXRpb25Hcm91cFByb3BlcnR5KAotCQkJSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJvcGVydHkoCi0JCQlKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVDb21wb3NpdGVWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZENvbXBvc2l0ZVZhbHVlKAotCQkJSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlQ29tcG9zaXRlVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVDb21wb3NpdGVWYWx1ZSgKLQkJCUpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBzIGxpc3QgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0aW9uR3JvdXBzTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUxpc3RFdmVudHMoCi0JCQlKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUVfMiwKLQkJCUpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9MSVNUKTsKLQkJCi0JCXRoaXMudmVyaWZ5TGlzdEV2ZW50cygKLQkJCUpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUVfMiwKLQkJCUpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0xJU1QpOwotCQkKLQkJdGhpcy52ZXJpZnlMaXN0RXZlbnRzKAotCQkJSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRV8yLAotCQkJSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfTElTVCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjbGVhckV2ZW50KCkgewotCQlzdXBlci5jbGVhckV2ZW50KCk7Ci0JCXRoaXMucHJlUGVyc2lzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcmVVcGRhdGVFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJlUmVtb3ZlRXZlbnQgPSBudWxsOwotCX0KLQotCS8vICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKLQotCS8vICoqKioqKioqKiogdmVyaWZ5IFZhbGlkYXRpb25Hcm91cCBwcm9wZXJ0eSAqKioqKioqKioqCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2V0VmFsaWRhdGlvbkdyb3VwUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGtleSwgT2JqZWN0IHRlc3RWYWx1ZTEsIE9iamVjdCB0ZXN0VmFsdWUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gUmVwbGFjZQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KGtleSwgdGVzdFZhbHVlMiwgdHJ1ZSk7IAotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCsrOwotCQl0aGlzLnZlcmlmeVB1dFZhbGlkYXRpb25Hcm91cFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5QWRkUmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGtleSwgT2JqZWN0IHRlc3RWYWx1ZTEsIE9iamVjdCB0ZXN0VmFsdWUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnZhbGlkYXRpb25Hcm91cFZhbHVlRXhpc3RzKHByb3BlcnR5TmFtZSwgKFN0cmluZyl0ZXN0VmFsdWUxKSk7Ci0JCS8vIFJlbW92ZQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJLS10aGlzLnByb3BlcnRpZXNUb3RhbDsKLQkJLS10aGlzLm1vZGVsUHJvcGVydGllc1NpemU7Ci0JCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkucmVtb3ZlUHJvcGVydHkoa2V5LCAoU3RyaW5nKXRlc3RWYWx1ZTEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnZhbGlkYXRpb25Hcm91cFZhbHVlRXhpc3RzKHByb3BlcnR5TmFtZSwgKFN0cmluZyl0ZXN0VmFsdWUxKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vZGVsUHJvcGVydGllc1NpemUsIHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsIC0gMSk7Ci0JCQotCQkvLyBBZGQgb3JpZ2luYWwgUHJvcGVydHkKLQkJKyt0aGlzLnByb3BlcnRpZXNUb3RhbDsKLQkJKyt0aGlzLm1vZGVsUHJvcGVydGllc1NpemU7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCB0ZXN0VmFsdWUxLCB0cnVlKTsgCi0JCXRoaXMudmVyaWZ5UHV0VmFsaWRhdGlvbkdyb3VwUHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUxKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlBZGRDb21wb3NpdGVWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgc3RyaW5nVGVzdFZhbHVlMSA9IChTdHJpbmcpdGVzdFZhbHVlMTsKLQkJU3RyaW5nIHN0cmluZ1Rlc3RWYWx1ZTIgPSAoU3RyaW5nKXRlc3RWYWx1ZTI7Ci0JCWFzc2VydFRydWUodGhpcy52YWxpZGF0aW9uR3JvdXBWYWx1ZUV4aXN0cyhwcm9wZXJ0eU5hbWUsIHN0cmluZ1Rlc3RWYWx1ZTEpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZ2V0VmFsaWRhdGlvbkdyb3VwU2l6ZShwcm9wZXJ0eU5hbWUpLCAxKTsKLQkJdGhpcy5hZGRWYWxpZGF0aW9uR3JvdXBWYWx1ZShwcm9wZXJ0eU5hbWUsIHN0cmluZ1Rlc3RWYWx1ZTIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5nZXRWYWxpZGF0aW9uR3JvdXBTaXplKHByb3BlcnR5TmFtZSksIDIpOwotCi0JCWFzc2VydFRydWUodGhpcy52YWxpZGF0aW9uR3JvdXBWYWx1ZUV4aXN0cyhwcm9wZXJ0eU5hbWUsIHN0cmluZ1Rlc3RWYWx1ZTEpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnZhbGlkYXRpb25Hcm91cFZhbHVlRXhpc3RzKHByb3BlcnR5TmFtZSwgc3RyaW5nVGVzdFZhbHVlMikpOwotCi0JCVN0cmluZyBwcm9wZXJ0eVZhbHVlID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShrZXkpLmdldFZhbHVlKCk7Ci0JCWFzc2VydFRydWUocHJvcGVydHlWYWx1ZS5pbmRleE9mKHN0cmluZ1Rlc3RWYWx1ZTEpICE9IC0xKTsKLQkJYXNzZXJ0VHJ1ZShwcm9wZXJ0eVZhbHVlLmluZGV4T2Yoc3RyaW5nVGVzdFZhbHVlMikgIT0gLTEpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVJlbW92ZUNvbXBvc2l0ZVZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBrZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzdHJpbmdUZXN0VmFsdWUxID0gKFN0cmluZyl0ZXN0VmFsdWUxOwotCQlTdHJpbmcgc3RyaW5nVGVzdFZhbHVlMiA9IChTdHJpbmcpdGVzdFZhbHVlMjsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnZhbGlkYXRpb25Hcm91cFZhbHVlRXhpc3RzKHByb3BlcnR5TmFtZSwgc3RyaW5nVGVzdFZhbHVlMSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5nZXRWYWxpZGF0aW9uR3JvdXBTaXplKHByb3BlcnR5TmFtZSksIDEpOwotCQl0aGlzLmFkZFZhbGlkYXRpb25Hcm91cFZhbHVlKHByb3BlcnR5TmFtZSwgc3RyaW5nVGVzdFZhbHVlMik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmdldFZhbGlkYXRpb25Hcm91cFNpemUocHJvcGVydHlOYW1lKSwgMik7Ci0KLQkJdGhpcy5yZW1vdmVWYWxpZGF0aW9uR3JvdXBWYWx1ZShwcm9wZXJ0eU5hbWUsIHN0cmluZ1Rlc3RWYWx1ZTIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5nZXRWYWxpZGF0aW9uR3JvdXBTaXplKHByb3BlcnR5TmFtZSksIDEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnZhbGlkYXRpb25Hcm91cFZhbHVlRXhpc3RzKHByb3BlcnR5TmFtZSwgc3RyaW5nVGVzdFZhbHVlMikpOwotCQlTdHJpbmcgcHJvcGVydHlWYWx1ZSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoa2V5KS5nZXRWYWx1ZSgpOwotCQlhc3NlcnRUcnVlKHByb3BlcnR5VmFsdWUuaW5kZXhPZihzdHJpbmdUZXN0VmFsdWUxKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocHJvcGVydHlWYWx1ZS5pbmRleE9mKHN0cmluZ1Rlc3RWYWx1ZTIpID09IC0xKTsKLQkJCi0JCXRoaXMucmVtb3ZlVmFsaWRhdGlvbkdyb3VwVmFsdWUocHJvcGVydHlOYW1lLCBzdHJpbmdUZXN0VmFsdWUyKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZ2V0VmFsaWRhdGlvbkdyb3VwU2l6ZShwcm9wZXJ0eU5hbWUpLCAxKTsKLQkJCi0JCXRoaXMucmVtb3ZlVmFsaWRhdGlvbkdyb3VwVmFsdWUocHJvcGVydHlOYW1lLCBzdHJpbmdUZXN0VmFsdWUxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZ2V0VmFsaWRhdGlvbkdyb3VwU2l6ZShwcm9wZXJ0eU5hbWUpLCAwKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy52YWxpZGF0aW9uR3JvdXBWYWx1ZUV4aXN0cyhwcm9wZXJ0eU5hbWUsIHN0cmluZ1Rlc3RWYWx1ZTEpKTsKLQkJCi0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShrZXkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlMaXN0RXZlbnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB0ZXN0VmFsdWUsIFN0cmluZyBsaXN0TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIGFkZAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5hZGRWYWxpZGF0aW9uR3JvdXBWYWx1ZShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZSk7Ci0JCQotCQkvLyB2ZXJpZnkgZXZlbnQgcmVjZWl2ZWQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gRXZlbnQgRmlyZWQuIiwgdGhpcy5nZXRFdmVudEZvcihwcm9wZXJ0eU5hbWUpKTsKLQkJLy8gdmVyaWZ5IGV2ZW50IGZvciB0aGUgZXhwZWN0ZWQgcHJvcGVydHkKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBFdmVudC4iLCB0aGlzLmdldEV2ZW50Rm9yKHByb3BlcnR5TmFtZSkuZ2V0TGlzdE5hbWUoKSwgbGlzdE5hbWUpOwotCi0JCS8vIHJlbW92ZQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJCi0JCXRoaXMucmVtb3ZlVmFsaWRhdGlvbkdyb3VwVmFsdWUocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUpOwotCQkvLyB2ZXJpZnkgZXZlbnQgcmVjZWl2ZWQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gRXZlbnQgRmlyZWQuIiwgdGhpcy5nZXRFdmVudEZvcihwcm9wZXJ0eU5hbWUpKTsKLQkJLy8gdmVyaWZ5IGV2ZW50IGZvciB0aGUgZXhwZWN0ZWQgcHJvcGVydHkKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBFdmVudC4iLCB0aGlzLmdldEV2ZW50Rm9yKHByb3BlcnR5TmFtZSkuZ2V0TGlzdE5hbWUoKSwgbGlzdE5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQdXRWYWxpZGF0aW9uR3JvdXBQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAotCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLmdldEV2ZW50Rm9yKHByb3BlcnR5TmFtZSkpOwotCQkvLyB2ZXJpZnkgZXZlbnQgdmFsdWUKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnZhbGlkYXRpb25Hcm91cFZhbHVlRXhpc3RzKHByb3BlcnR5TmFtZSwgKFN0cmluZykgZXhwZWN0ZWRWYWx1ZSkpOwotCQkgcmV0dXJuOwotCX0KLQkKLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZCAqKioqKioqKioqCi0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbGlkYXRpb25Hcm91cExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQkJR2VuZXJpYzJfME9wdGlvbnNUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJCUdlbmVyaWMyXzBPcHRpb25zVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCUdlbmVyaWMyXzBPcHRpb25zVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCUdlbmVyaWMyXzBPcHRpb25zVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQkJR2VuZXJpYzJfME9wdGlvbnNUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJCi0JCQkJR2VuZXJpYzJfME9wdGlvbnNUZXN0cy50aGlzLnZhbGlkYXRpb25Hcm91cENoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRpb25Hcm91cENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJU3RyaW5nIGxpc3ROYW1lID0gZS5nZXRMaXN0TmFtZSgpOwotCQkKLQkJaWYgKGxpc3ROYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfTElTVCkpCi0JCQl0aGlzLnByZVBlcnNpc3RFdmVudCA9IGU7Ci0JCWVsc2UgaWYgKGxpc3ROYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9MSVNUKSkKLQkJCXRoaXMucHJlVXBkYXRlRXZlbnQgPSBlOwotCQllbHNlIGlmIChsaXN0TmFtZS5lcXVhbHMoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfTElTVCkpCi0JCQl0aGlzLnByZVJlbW92ZUV2ZW50ID0gZTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRWYWxpZGF0aW9uR3JvdXBWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5hZGRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KHByb3BlcnR5VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5hZGRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUocHJvcGVydHlWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLmFkZFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZShwcm9wZXJ0eVZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJhZGRWYWxpZGF0aW9uR3JvdXBWYWx1ZSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVZhbGlkYXRpb25Hcm91cFZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLnJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QocHJvcGVydHlWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLnJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZShwcm9wZXJ0eVZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMucmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKHByb3BlcnR5VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInJlbW92ZVZhbGlkYXRpb25Hcm91cFZhbHVlIiwgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGlvbkdyb3VwVmFsdWVFeGlzdHMoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHByb3BlcnR5VmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSkpCi0JCQlyZXN1bHQgPSB0aGlzLm9wdGlvbnMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdEV4aXN0cyhwcm9wZXJ0eVZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSkpCi0JCQlyZXN1bHQgPSB0aGlzLm9wdGlvbnMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlRXhpc3RzKHByb3BlcnR5VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZKSkKLQkJCXJlc3VsdCA9IHRoaXMub3B0aW9ucy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVFeGlzdHMocHJvcGVydHlWYWx1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigidmVyaWZ5VmFsaWRhdGlvbkdyb3VwVmFsdWVFeGlzdHMiLCBwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgaW50IGdldFZhbGlkYXRpb25Hcm91cFNpemUoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSkpCi0JCQlyZXN1bHQgPSAgdGhpcy5vcHRpb25zLmdldFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzU2l6ZSgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZKSkKLQkJCXJlc3VsdCA9ICB0aGlzLm9wdGlvbnMuZ2V0VmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlc1NpemUoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSkpCi0JCQlyZXN1bHQgPSAgdGhpcy5vcHRpb25zLmdldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXNTaXplKCk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigidmVyaWZ5VmFsaWRhdGlvbkdyb3VwU2l6ZSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgTGlzdENoYW5nZUV2ZW50IGdldEV2ZW50Rm9yKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCUxpc3RDaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSkpCi0JCQlldmVudCA9IHRoaXMucHJlUGVyc2lzdEV2ZW50OwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZKSkKLQkJCWV2ZW50ID0gdGhpcy5wcmVVcGRhdGVFdmVudDsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSkpCi0JCQlldmVudCA9IHRoaXMucHJlUmVtb3ZlRXZlbnQ7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigiZ2V0RXZlbnRGb3IiLCBwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gZXZlbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZmQwZGQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljMl8wUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljMl8wUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cwotCWV4dGVuZHMgVGVzdENhc2UKLXsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShHZW5lcmljMl8wQ29ubmVjdGlvblRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpYzJfME9wdGlvbnNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljMl8wSnBhTWV0YWRhdGFDb252ZXJzaW9uVGVzdHMuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBHZW5lcmljMl8wUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljMl8wUGVyc2lzdGVuY2VVbml0VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpYzJfMFBlcnNpc3RlbmNlVW5pdFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMTU4YTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljMl8wUGVyc2lzdGVuY2VVbml0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5HZW5lcmljUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqICBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wVGVzdHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyaWMyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0cyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdDJfMCBzdWJqZWN0OwotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQyXzA+IHN1YmplY3RIb2xkZXI7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHJvdGVjdGVkIEdlbmVyaWMyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnN1YmplY3QgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQl0aGlzLnN1YmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdDJfMD4odGhpcy5zdWJqZWN0KTsKLQkJdGhpcy5wb3B1bGF0ZVB1KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSLCBKcGFGYWNldC5WRVJTSU9OXzJfMC5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlBMQVRGT1JNLCBHZW5lcmljUGxhdGZvcm0uVkVSU0lPTl8yXzApOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfT1JNX1hNTCwgQm9vbGVhbi5UUlVFKTsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdDJfMCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB7Ci0JCXJldHVybiAoUGVyc2lzdGVuY2VVbml0Ml8wKSBzdXBlci5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0FjY2VzczJfMEFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9BY2Nlc3MyXzBBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDllNTA5NS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0FjY2VzczJfMEFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQWNjZXNzMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BY2Nlc3NUeXBlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBBY2Nlc3MyXzBBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgQWNjZXNzMl8wQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QWNjZXNzT25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuQUNDRVNTLCBKUEEyXzAuQUNDRVNTX1RZUEUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFjY2Vzc09uRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5BQ0NFU1MsIEpQQTJfMC5BQ0NFU1NfVFlQRSk7Ci0JCQl9Ci0JCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBY2Nlc3NPblByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuQUNDRVNTLCBKUEEyXzAuQUNDRVNTX1RZUEUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc09uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QWNjZXNzT25UeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlBY2Nlc3MyXzBBbm5vdGF0aW9uIGFjY2VzcyA9IChBY2Nlc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQUNDRVNTKTsKLQkJYXNzZXJ0Tm90TnVsbChhY2Nlc3MpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgYWNjZXNzLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRBY2Nlc3NPblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCUFjY2VzczJfMEFubm90YXRpb24gYWNjZXNzID0gKEFjY2VzczJfMEFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5BQ0NFU1MpOwotCQlhc3NlcnROdWxsKGFjY2Vzcyk7Ci0JCQotCQlyZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihKUEEyXzAuQUNDRVNTKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBY2Nlc3MiLCBjdSk7Ci0KLQkJYWNjZXNzID0gKEFjY2VzczJfMEFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5BQ0NFU1MpOwotCQlhc3NlcnROb3ROdWxsKGFjY2Vzcyk7Ci0JCQotCQlhY2Nlc3Muc2V0VmFsdWUoQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBhY2Nlc3MuZ2V0VmFsdWUoKSk7CQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBY2Nlc3MoRklFTEQpIiwgY3UpOwotCQkKLQkJYWNjZXNzLnNldFZhbHVlKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgYWNjZXNzLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFjY2VzcyhQUk9QRVJUWSkiLCBjdSk7Ci0JCQotCQlhY2Nlc3Muc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQWNjZXNzKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc09uRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFjY2Vzc09uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUFjY2VzczJfMEFubm90YXRpb24gYWNjZXNzID0gKEFjY2VzczJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQUNDRVNTKTsKLQkJYXNzZXJ0Tm90TnVsbChhY2Nlc3MpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgYWNjZXNzLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRBY2Nlc3NPbkZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlBY2Nlc3MyXzBBbm5vdGF0aW9uIGFjY2VzcyA9IChBY2Nlc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkFDQ0VTUyk7Ci0JCWFzc2VydE51bGwoYWNjZXNzKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEyXzAuQUNDRVNTKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBY2Nlc3MiLCBjdSk7Ci0KLQkJYWNjZXNzID0gKEFjY2VzczJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQUNDRVNTKTsKLQkJYXNzZXJ0Tm90TnVsbChhY2Nlc3MpOwotCQkKLQkJYWNjZXNzLnNldFZhbHVlKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgYWNjZXNzLmdldFZhbHVlKCkpOwkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQWNjZXNzKEZJRUxEKSIsIGN1KTsKLQkJCi0JCWFjY2Vzcy5zZXRWYWx1ZShBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGFjY2Vzcy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBY2Nlc3MoUFJPUEVSVFkpIiwgY3UpOwotCQkKLQkJYWNjZXNzLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEFjY2VzcygiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NPblByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBY2Nlc3NPblByb3BlcnR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldE1ldGhvZHMoKSwgMCk7Ci0JCQotCQlBY2Nlc3MyXzBBbm5vdGF0aW9uIGFjY2VzcyA9IChBY2Nlc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5BQ0NFU1MpOwotCQlhc3NlcnROb3ROdWxsKGFjY2Vzcyk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBhY2Nlc3MuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEFjY2Vzc09uUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0TWV0aG9kcygpLCAwKTsKLQkJCi0JCUFjY2VzczJfMEFubm90YXRpb24gYWNjZXNzID0gKEFjY2VzczJfMEFubm90YXRpb24pIHJlc291cmNlTWV0aG9kLmdldEFubm90YXRpb24oSlBBMl8wLkFDQ0VTUyk7Ci0JCWFzc2VydE51bGwoYWNjZXNzKTsKLQkJCi0JCXJlc291cmNlTWV0aG9kLmFkZEFubm90YXRpb24oSlBBMl8wLkFDQ0VTUyk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQWNjZXNzIiwgY3UpOwotCi0JCWFjY2VzcyA9IChBY2Nlc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5BQ0NFU1MpOwotCQlhc3NlcnROb3ROdWxsKGFjY2Vzcyk7Ci0JCQotCQlhY2Nlc3Muc2V0VmFsdWUoQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBhY2Nlc3MuZ2V0VmFsdWUoKSk7CQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBY2Nlc3MoRklFTEQpIiwgY3UpOwotCQkKLQkJYWNjZXNzLnNldFZhbHVlKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgYWNjZXNzLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFjY2VzcyhQUk9QRVJUWSkiLCBjdSk7Ci0JCQotCQlhY2Nlc3Muc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQWNjZXNzKCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGUyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFiNWVhYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGUyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsMl8wVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FID0gIk1ZX0FTU09DSUFUSU9OX09WRVJSSURFIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9JTl9UQUJMRV9OQU1FID0gIk1ZX0pPSU5fVEFCTEUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRBTE9HX05BTUUgPSAiTVlfQ0FUQUxPRyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9OQU1FID0gIk1ZX1NDSEVNQSI7Ci0JCi0JcHVibGljIEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBKb2luQ29sdW1ufSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkpPSU5fVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKG5hbWUgPSBcIiIgKyBKT0lOX1RBQkxFX05BTUUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkpPSU5fVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGNhdGFsb2cgPSBcIiIgKyBDQVRBTE9HX05BTUUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuSk9JTl9UQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoc2NoZW1hID0gXCIiICsgU0NIRU1BX05BTUUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5KT0lOX1RBQkxFLCBKUEEuVU5JUVVFX0NPTlNUUkFJTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSl9KSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuSk9JTl9UQUJMRSwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBKb2luQ29sdW1ufSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSW52ZXJzZUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5KT0lOX1RBQkxFLCBKUEEuSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGludmVyc2VKb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBKb2luQ29sdW1ufSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZUF0KGludCBpbmRleCwgSmF2YVJlc291cmNlTWVtYmVyIHJlc291cmNlTWVtYmVyKSB7Ci0JCXJldHVybiAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIHJlc291cmNlTWVtYmVyLmdldEFubm90YXRpb24oaW5kZXgsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnROb3ROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQlhc3NlcnRFcXVhbHMoQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJYXNzZXJ0RXF1YWxzKEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIpIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUiLCBjdSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5zMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygyLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5zMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlRmllbGQpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlRmllbGQpOwotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJSXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGpvaW5Db2x1bW5zID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUucmVtb3ZlSm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtbnMgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnJlbW92ZUpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW5zID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKSIsIGN1KTsKLQotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKG51bGwpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnJlbW92ZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQXNzb2NpYXRpb25PdmVycmlkZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlRmllbGQpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCk7Ci0JCWpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRl9OQU1FIik7Ci0JCWpvaW5Db2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJam9pbkNvbHVtbi5zZXRUYWJsZSgiVEFCTEUiKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUubW92ZUpvaW5Db2x1bW4oMiwgMCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCk7Ci0JCWpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRl9OQU1FIik7Ci0JCWpvaW5Db2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJam9pbkNvbHVtbi5zZXRUYWJsZSgiVEFCTEUiKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUubW92ZUpvaW5Db2x1bW4oMCwgMik7Ci0JCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Sm9pbkNvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlqb2luQ29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiZm9vXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGxKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPblR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlR2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKEpPSU5fVEFCTEVfTkFNRSwgam9pblRhYmxlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoSk9JTl9UQUJMRV9OQU1FLCBqb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWpvaW5UYWJsZS5zZXROYW1lKCJGb28iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShuYW1lID0gXCJGb29cIikpIiwgY3UpOwotCQkKLQkJam9pblRhYmxlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSm9pblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25UeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlKTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pblRhYmxlKCk7Ci0JCWpvaW5UYWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydE5vdE51bGwoam9pblRhYmxlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUpvaW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVHZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aENhdGFsb2coKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKENBVEFMT0dfTkFNRSwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlU2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRDYXRhbG9nKCkpOwotCi0JCXRhYmxlLnNldENhdGFsb2coIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUobmFtZSA9IFwiTVlfSk9JTl9UQUJMRVwiLCBjYXRhbG9nID0gXCJGb29cIikpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlU2V0Q2F0YWxvZ051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoQ2F0YWxvZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhDQVRBTE9HX05BTUUsIHRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQl0YWJsZS5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5UYWJsZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVHZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydEVxdWFscyhTQ0hFTUFfTkFNRSwgdGFibGUuZ2V0U2NoZW1hKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVTZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCXRhYmxlLnNldFNjaGVtYSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgdGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKG5hbWUgPSBcIk1ZX0pPSU5fVEFCTEVcIiwgc2NoZW1hID0gXCJGb29cIikpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlU2V0U2NoZW1hTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoU0NIRU1BX05BTUUsIHRhYmxlLmdldFNjaGVtYSgpKTsKLQkJCi0JCXRhYmxlLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5UYWJsZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVVuaXF1ZUNvbnN0cmFpbnRzMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCi0JCQotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVVuaXF1ZUNvbnN0cmFpbnRzMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVBZGRVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkZPTyIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuZ2V0Q29sdW1uTmFtZXNTaXplKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShuYW1lID0gXCJNWV9KT0lOX1RBQkxFXCIsIHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJCQVJcIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkZPT1wiKSwgQFVuaXF1ZUNvbnN0cmFpbnR9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7CQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkpIiwgY3UpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSkpKSIsIGN1KTsKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7CQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luVGFibGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlTW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KX0pKSIsIGN1KTsKLQkJCi0JCXRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KX0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZU1vdmVVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkpIiwgY3UpOwotCQkKLQkJdGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pfSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZUpvaW5Db2x1bW5zMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCi0JCQotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApOwotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZUpvaW5Db2x1bW5zMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVBZGRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDEpOwotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShuYW1lID0gXCJNWV9KT0lOX1RBQkxFXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSxASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlUmVtb3ZlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCXRhYmxlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJdGFibGUucmVtb3ZlSm9pbkNvbHVtbigxKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7Ci0KLQkJdGFibGUucmVtb3ZlSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4pKSIsIGN1KTsKLQotCQkKLQkJdGFibGUucmVtb3ZlSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luVGFibGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlTW92ZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUuam9pbkNvbHVtbkF0KDApOwotCQlqb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZfTkFNRSIpOwotCQlqb2luQ29sdW1uLnNldFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWpvaW5Db2x1bW4uc2V0VGFibGUoIlRBQkxFIik7Ci0JCXRhYmxlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7Ci0KLQkJdGFibGUubW92ZUpvaW5Db2x1bW4oMiwgMCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZU1vdmVKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUuam9pbkNvbHVtbkF0KDApOwotCQlqb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZfTkFNRSIpOwotCQlqb2luQ29sdW1uLnNldFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWpvaW5Db2x1bW4uc2V0VGFibGUoIlRBQkxFIik7Ci0JCQotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCi0KLQkJdGFibGUubW92ZUpvaW5Db2x1bW4oMCwgMik7Ci0JCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKX0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVNldEpvaW5Db2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSB0YWJsZS5qb2luQ29sdW1uQXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcImZvb1wiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbnZlcnNlSm9pbkNvbHVtbnMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0KLQkJCi0JCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDApOwotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5zMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJdGFibGUuYWRkSW52ZXJzZUpvaW5Db2x1bW4oMSk7Ci0JCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDApLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuaW52ZXJzZUpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmludmVyc2VKb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShuYW1lID0gXCJNWV9KT0lOX1RBQkxFXCIsIGludmVyc2VKb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVJlbW92ZUludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEludmVyc2VKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDIpLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJSXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJdGFibGUucmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oMSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIil9KSkiLCBjdSk7Ci0JCWludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaW52ZXJzZUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJdGFibGUucmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIikpKSIsIGN1KTsKLQkJaW52ZXJzZUpvaW5Db2x1bW5zID0gdGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJdGFibGUucmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pblRhYmxlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZU1vdmVJbnZlcnNlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCUl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQkKLQkJdGFibGUubW92ZUludmVyc2VKb2luQ29sdW1uKDIsIDApOwotCQlpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGludmVyc2VKb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIil9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVNb3ZlSW52ZXJzZUpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEludmVyc2VKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDEpLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJSXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCQotCQl0YWJsZS5tb3ZlSW52ZXJzZUpvaW5Db2x1bW4oMCwgMik7Ci0JCWludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGludmVyc2VKb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIil9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVTZXRJbnZlcnNlSm9pbkNvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUuaW52ZXJzZUpvaW5Db2x1bW5BdCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcImZvb1wiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVzMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZXMyXzBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTA2MDBkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZXMyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEFzc29jaWF0aW9uT3ZlcnJpZGVzMl8wVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSA9ICJNWV9BU1NPQ0lBVElPTl9PVkVSUklERSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpPSU5fVEFCTEVfTkFNRSA9ICJNWV9KT0lOX1RBQkxFIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUQUxPR19OQU1FID0gIk1ZX0NBVEFMT0ciOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfTkFNRSA9ICJNWV9TQ0hFTUEiOwotCQotCXB1YmxpYyBBc3NvY2lhdGlvbk92ZXJyaWRlczJfMFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTLCBKUEEuSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbn0pKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJGT09cIiwgam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJCQVpcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUywgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUywgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuSk9JTl9UQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKG5hbWUgPSBcIiIgKyBKT0lOX1RBQkxFX05BTUUgKyAiXCIpKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5KT0lOX1RBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoY2F0YWxvZyA9IFwiIiArIENBVEFMT0dfTkFNRSArICJcIikpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUywgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuSk9JTl9UQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKHNjaGVtYSA9IFwiIiArIFNDSEVNQV9OQU1FICsgIlwiKSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkpPSU5fVEFCTEUsIEpQQS5VTklRVUVfQ09OU1RSQUlOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSl9KSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkpPSU5fVEFCTEUsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW59KSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSW52ZXJzZUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5KT0lOX1RBQkxFLCBKUEEuSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbn0pKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCi0JcHJpdmF0ZSBBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoaW50IGluZGV4LCBKYXZhUmVzb3VyY2VNZW1iZXIgcmVzb3VyY2VNZW1iZXIpIHsKLQkJcmV0dXJuIChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VNZW1iZXIuZ2V0QW5ub3RhdGlvbihpbmRleCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnROb3ROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQlhc3NlcnRFcXVhbHMoQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJYXNzZXJ0RXF1YWxzKEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJGb29cIikpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJYXNzZXJ0RXF1YWxzKEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIpIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBc3NvY2lhdGlvbk92ZXJyaWRlQ29weUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyh7IjsKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJGT09cIiwgam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJCQVpcIikpLCI7Ci0JCVN0cmluZyBleHBlY3RlZDMgPSAiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiQkFSXCIpIH0pIjsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBc3NvY2lhdGlvbk92ZXJyaWRlVG9CZWdpbm5pbmdPZkxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVN0cmluZyBleHBlY3RlZDEgPSAiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKHsiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiLCBqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIkJBWlwiKSksIjsKLQkJU3RyaW5nIGV4cGVjdGVkMyA9ICJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJCQVJcIikgfSkiOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQkJCi0JCWV4cGVjdGVkMiA9ICJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJCQVpcIiksIjsKLQkJZXhwZWN0ZWQzID0gIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiLCBqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIkJBWlwiKSksIEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKSB9KSI7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7Ci0KLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0KLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKSk7Ci0JCWFzc2VydEVxdWFscygzLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBc3NvY2lhdGlvbk92ZXJyaWRlQ29weUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyh7IjsKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJGT09cIiwgam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJCQVpcIikpLCI7Ci0JCVN0cmluZyBleHBlY3RlZDMgPSAiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiQkFSXCIpIH0pIjsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0JCQotCQlleHBlY3RlZDIgPSAiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIsIGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiQkFaXCIpKSI7Ci0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEFzc29jaWF0aW9uT3ZlcnJpZGVzIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlRmllbGQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbnMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbnMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlRmllbGQpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDEpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiQkFSIik7Ci0KLQotCQlJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gam9pbkNvbHVtbnMgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlRmllbGQpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gam9pbkNvbHVtbnMgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnJlbW92ZUpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW5zID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnJlbW92ZUpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW5zID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbikpIiwgY3UpOwotCi0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUobnVsbCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUucmVtb3ZlSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBBc3NvY2lhdGlvbk92ZXJyaWRlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlRmllbGQpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCk7Ci0JCWpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRl9OQU1FIik7Ci0JCWpvaW5Db2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJam9pbkNvbHVtbi5zZXRUYWJsZSgiVEFCTEUiKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLm1vdmVKb2luQ29sdW1uKDIsIDApOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCk7Ci0JCWpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRl9OQU1FIik7Ci0JCWpvaW5Db2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJam9pbkNvbHVtbi5zZXRUYWJsZSgiVEFCTEUiKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUubW92ZUpvaW5Db2x1bW4oMCwgMik7Ci0JCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIil9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRKb2luQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlqb2luQ29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcImZvb1wiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbEpvaW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlR2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhKT0lOX1RBQkxFX05BTUUsIGpvaW5UYWJsZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlU2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhKT0lOX1RBQkxFX05BTUUsIGpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQkKLQkJam9pblRhYmxlLnNldE5hbWUoIkZvbyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKG5hbWUgPSBcIkZvb1wiKSkiLCBjdSk7Ci0JCQotCQlqb2luVGFibGUuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPblR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlKTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pblRhYmxlKCk7Ci0JCWpvaW5UYWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydE5vdE51bGwoam9pblRhYmxlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUpvaW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlR2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhDYXRhbG9nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnRFcXVhbHMoQ0FUQUxPR19OQU1FLCB0YWJsZS5nZXRDYXRhbG9nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVTZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRDYXRhbG9nKCkpOwotCi0JCXRhYmxlLnNldENhdGFsb2coIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUobmFtZSA9IFwiTVlfSk9JTl9UQUJMRVwiLCBjYXRhbG9nID0gXCJGb29cIikpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlU2V0Q2F0YWxvZ051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoQ2F0YWxvZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoQ0FUQUxPR19OQU1FLCB0YWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJdGFibGUuc2V0Q2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luVGFibGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlR2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKFNDSEVNQV9OQU1FLCB0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVNldFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCXRhYmxlLnNldFNjaGVtYSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgdGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKG5hbWUgPSBcIk1ZX0pPSU5fVEFCTEVcIiwgc2NoZW1hID0gXCJGb29cIikpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlU2V0U2NoZW1hTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKFNDSEVNQV9OQU1FLCB0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQl0YWJsZS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luVGFibGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlVW5pcXVlQ29uc3RyYWludHMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCi0JCQotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVVuaXF1ZUNvbnN0cmFpbnRzMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlQWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5nZXRDb2x1bW5OYW1lc1NpemUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKG5hbWUgPSBcIk1ZX0pPSU5fVEFCTEVcIiwgdW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkJBUlwiKSxAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiRk9PXCIpLCBAVW5pcXVlQ29uc3RyYWludH0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7CQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkpIiwgY3UpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSkpKSIsIGN1KTsKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7CQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luVGFibGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlTW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSl9KSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSl9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVNb3ZlVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSl9KSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAyKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSl9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZUpvaW5Db2x1bW5zMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQotCQkKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigwKTsKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVKb2luQ29sdW1uczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZUFkZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDEpOwotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShuYW1lID0gXCJNWV9KT0lOX1RBQkxFXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSxASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlUmVtb3ZlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCXRhYmxlLnJlbW92ZUpvaW5Db2x1bW4oMSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCi0JCXRhYmxlLnJlbW92ZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKSkiLCBjdSk7Ci0KLQkJCi0JCXRhYmxlLnJlbW92ZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pblRhYmxlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZU1vdmVKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSB0YWJsZS5qb2luQ29sdW1uQXQoMCk7Ci0JCWpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRl9OQU1FIik7Ci0JCWpvaW5Db2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJam9pbkNvbHVtbi5zZXRUYWJsZSgiVEFCTEUiKTsKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKLQotCQl0YWJsZS5tb3ZlSm9pbkNvbHVtbigyLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlTW92ZUpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUuam9pbkNvbHVtbkF0KDApOwotCQlqb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZfTkFNRSIpOwotCQlqb2luQ29sdW1uLnNldFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWpvaW5Db2x1bW4uc2V0VGFibGUoIlRBQkxFIik7Ci0JCQotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCi0KLQkJdGFibGUubW92ZUpvaW5Db2x1bW4oMCwgMik7Ci0JCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKX0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVNldEpvaW5Db2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUuam9pbkNvbHVtbkF0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlqb2luQ29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJmb29cIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEludmVyc2VKb2luQ29sdW1uczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0KLQkJCi0JCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDApOwotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5zMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnZlcnNlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigxKTsKLQkJdGFibGUuYWRkSW52ZXJzZUpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuaW52ZXJzZUpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmludmVyc2VKb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKG5hbWUgPSBcIk1ZX0pPSU5fVEFCTEVcIiwgaW52ZXJzZUpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSxASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlUmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDIpLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJSXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJdGFibGUucmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oMSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIil9KSkiLCBjdSk7Ci0JCWludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaW52ZXJzZUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJdGFibGUucmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIikpKSIsIGN1KTsKLQkJaW52ZXJzZUpvaW5Db2x1bW5zID0gdGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJdGFibGUucmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pblRhYmxlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZU1vdmVJbnZlcnNlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJdGFibGUuYWRkSW52ZXJzZUpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gaW52ZXJzZUpvaW5Db2x1bW5zID0gdGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXRhYmxlLm1vdmVJbnZlcnNlSm9pbkNvbHVtbigyLCAwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW5zID0gdGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlTW92ZUludmVyc2VKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJdGFibGUuYWRkSW52ZXJzZUpvaW5Db2x1bW4oMSkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gaW52ZXJzZUpvaW5Db2x1bW5zID0gdGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXRhYmxlLm1vdmVJbnZlcnNlSm9pbkNvbHVtbigwLCAyKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW5zID0gdGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVNldEludmVyc2VKb2luQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUuaW52ZXJzZUpvaW5Db2x1bW5BdCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcImZvb1wiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9DYWNoZWFibGUyXzBBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvQ2FjaGVhYmxlMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxOGJlNWMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9DYWNoZWFibGUyXzBBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkNhY2hlYWJsZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENhY2hlYWJsZTJfMEFubm90YXRpb25UZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsMl8wVGVzdENhc2UgewotCQotCXB1YmxpYyBDYWNoZWFibGUyXzBBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5DQUNIRUFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZWFibGUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2FjaGVhYmxlV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuQ0FDSEVBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGVhYmxlKHZhbHVlPXRydWUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYWNoZWFibGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZWFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7CQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZWFibGVXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCUNhY2hlYWJsZTJfMEFubm90YXRpb24gY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlYWJsZVdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbiBjYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSh2YWx1ZT1mYWxzZSkiLCBjdSk7Ci0JCQotCQljYWNoZWFibGVBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQljYWNoZWFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZShmYWxzZSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlYWJsZVdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQotCQlDYWNoZWFibGUyXzBBbm5vdGF0aW9uIGNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQljYWNoZWFibGVBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInZhbHVlIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9Db2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5Y2RkOWMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9Db2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb25UZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsMl8wVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FID0gIk1ZX1RBQkxFIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX05BTUUgPSAiTVlfU0NIRU1BIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUQUxPR19OQU1FID0gIk1ZX0NBVEFMT0ciOwotCQotCXB1YmxpYyBDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29sbGVjdGlvblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbGxlY3Rpb25UYWJsZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGVXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLkNPTExFQ1RJT05fVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb2xsZWN0aW9uVGFibGUobmFtZSA9IFwiIiArIFRBQkxFX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZVdpdGhTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb2xsZWN0aW9uVGFibGUoc2NoZW1hID0gXCIiICsgU0NIRU1BX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZVdpdGhDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbGxlY3Rpb25UYWJsZShjYXRhbG9nID0gXCIiICsgQ0FUQUxPR19OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFLCBKUEEuVU5JUVVFX0NPTlNUUkFJTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb2xsZWN0aW9uVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZVdpdGhKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLkNPTExFQ1RJT05fVEFCTEUsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbGxlY3Rpb25UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBKb2luQ29sdW1ufSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZVdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnRFcXVhbHMoVEFCTEVfTkFNRSwgdGFibGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiB0YWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkNPTExFQ1RJT05fVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXROYW1lKCkpOwotCi0JCXRhYmxlLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbGxlY3Rpb25UYWJsZShuYW1lID0gXCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sbGVjdGlvblRhYmxlV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gdGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIHRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQl0YWJsZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENvbGxlY3Rpb25UYWJsZSgiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZVdpdGhDYXRhbG9nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnRFcXVhbHMoQ0FUQUxPR19OQU1FLCB0YWJsZS5nZXRDYXRhbG9nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gdGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0Q2F0YWxvZygpKTsKLQotCQl0YWJsZS5zZXRDYXRhbG9nKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB0YWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2xsZWN0aW9uVGFibGUoY2F0YWxvZyA9IFwiRm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2F0YWxvZ051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZVdpdGhDYXRhbG9nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhDQVRBTE9HX05BTUUsIHRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQl0YWJsZS5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENvbGxlY3Rpb25UYWJsZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZVdpdGhTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gdGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydEVxdWFscyhTQ0hFTUFfTkFNRSwgdGFibGUuZ2V0U2NoZW1hKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiB0YWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkNPTExFQ1RJT05fVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRTY2hlbWEoKSk7Ci0KLQkJdGFibGUuc2V0U2NoZW1hKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbGxlY3Rpb25UYWJsZShzY2hlbWEgPSBcIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNjaGVtYU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZVdpdGhTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gdGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKFNDSEVNQV9OQU1FLCB0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQl0YWJsZS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDb2xsZWN0aW9uVGFibGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiB0YWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkNPTExFQ1RJT05fVEFCTEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSk7Ci0KLQkJCi0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gdGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiB0YWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkNPTExFQ1RJT05fVEFCTEUpOwotCQkKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDIpLmdldENvbHVtbk5hbWVzU2l6ZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbGxlY3Rpb25UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiQkFSXCIpLEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJGT09cIiksIEBVbmlxdWVDb25zdHJhaW50fSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gdGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7CQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2xsZWN0aW9uVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSl9KSIsIGN1KTsKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7CQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2xsZWN0aW9uVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSkpIiwgY3UpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsJCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENvbGxlY3Rpb25UYWJsZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sbGVjdGlvblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sbGVjdGlvblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSl9KSIsIGN1KTsKLQkJCi0JCXRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbGxlY3Rpb25UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiB0YWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkNPTExFQ1RJT05fVEFCTEUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbGxlY3Rpb25UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAyKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2xsZWN0aW9uVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiB0YWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkNPTExFQ1RJT05fVEFCTEUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbnMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gdGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFKTsKLQotCQkKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigwKTsKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1uczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiB0YWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkNPTExFQ1RJT05fVEFCTEUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSk7Ci0JCQotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDEpOwotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sbGVjdGlvblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSxASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gdGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFKTsKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVKb2luQ29sdW1uKDEpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbGxlY3Rpb25UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0KLQkJdGFibGUucmVtb3ZlSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2xsZWN0aW9uVGFibGUoam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbikiLCBjdSk7Ci0KLQkJCi0JCXRhYmxlLnJlbW92ZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ29sbGVjdGlvblRhYmxlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gdGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLmpvaW5Db2x1bW5BdCgwKTsKLQkJam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGX05BTUUiKTsKLQkJam9pbkNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqb2luQ29sdW1uLnNldFRhYmxlKCJUQUJMRSIpOwotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2xsZWN0aW9uVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQotCQl0YWJsZS5tb3ZlSm9pbkNvbHVtbigyLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2xsZWN0aW9uVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sbGVjdGlvblRhYmxlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSk7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUuam9pbkNvbHVtbkF0KDApOwotCQlqb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZfTkFNRSIpOwotCQlqb2luQ29sdW1uLnNldFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWpvaW5Db2x1bW4uc2V0VGFibGUoIlRBQkxFIik7Ci0JCQotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2xsZWN0aW9uVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQotCi0JCXRhYmxlLm1vdmVKb2luQ29sdW1uKDAsIDIpOwotCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbGxlY3Rpb25UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Sm9pbkNvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiB0YWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkNPTExFQ1RJT05fVEFCTEUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLmpvaW5Db2x1bW5BdCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbGxlY3Rpb25UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJmb29cIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9FbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9FbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmY5NjUzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbGVtZW50Q29sbGVjdGlvbiIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbGVtZW50Q29sbGVjdGlvbldpdGhGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLkZFVENIX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbGVtZW50Q29sbGVjdGlvbihmZXRjaCA9IEZldGNoVHlwZS5FQUdFUikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbGVtZW50Q29sbGVjdGlvbldpdGhUYXJnZXRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVsZW1lbnRDb2xsZWN0aW9uKHRhcmdldENsYXNzID0gQW5ub3RhdGlvblRlc3RUeXBlLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCWFzc2VydE5vdE51bGwoZWxlbWVudENvbGxlY3Rpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVsZW1lbnRDb2xsZWN0aW9uV2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RWxlbWVudENvbGxlY3Rpb25XaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IChFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEVsZW1lbnRDb2xsZWN0aW9uKGZldGNoID0gTEFaWSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVsZW1lbnRDb2xsZWN0aW9uV2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0RmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEVsZW1lbnRDb2xsZWN0aW9uIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiZmV0Y2giLCBjdSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYXJnZXRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RWxlbWVudENvbGxlY3Rpb25XaXRoVGFyZ2V0Q2xhc3MoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IChFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYXJnZXRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RWxlbWVudENvbGxlY3Rpb25XaXRoVGFyZ2V0Q2xhc3MoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IChFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRUYXJnZXRDbGFzcygiRm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEVsZW1lbnRDb2xsZWN0aW9uKHRhcmdldENsYXNzID0gRm9vLmNsYXNzKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRhcmdldENsYXNzTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RWxlbWVudENvbGxlY3Rpb25XaXRoVGFyZ2V0Q2xhc3MoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IChFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRUYXJnZXRDbGFzcyhudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARWxlbWVudENvbGxlY3Rpb24iLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJ0YXJnZXRDbGFzcyIsIGN1KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVsZW1lbnRDb2xsZWN0aW9uV2l0aFRhcmdldENsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRGdWxseVF1YWxpZmllZFRhcmdldENsYXNzTmFtZSgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldFRhcmdldENsYXNzKCJGb28iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARWxlbWVudENvbGxlY3Rpb24odGFyZ2V0Q2xhc3MgPSBGb28uY2xhc3MpIiwgY3UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRDbGFzc05hbWUoKSk7IC8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZTJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZTJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNzRmNDMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2UyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEphdmFSZXNvdXJjZTJfMFRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKYXZhUmVzb3VyY2UyXzBUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBY2Nlc3MyXzBBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXNzb2NpYXRpb25PdmVycmlkZTJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFzc29jaWF0aW9uT3ZlcnJpZGVzMl8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNYW55VG9NYW55Ml8wQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1hbnlUb09uZTJfMEFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNYXBLZXlDbGFzczJfMEFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1hcEtleUpvaW5Db2x1bW5zMl8wQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1hcHNJZDJfMEFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPbmVUb01hbnkyXzBBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT25lVG9PbmUyXzBBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZTJfMFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzM2Q1YzEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5KcGFBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuR2VuZXJpYzJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmEuSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIEphdmFSZXNvdXJjZU1vZGVsMl8wVGVzdENhc2UgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlCi17CQotCQotCXB1YmxpYyBKYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBbm5vdGF0aW9uUHJvdmlkZXIgYnVpbGRBbm5vdGF0aW9uUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSnBhQW5ub3RhdGlvblByb3ZpZGVyKAotCQkJR2VuZXJpYzJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYW55VG9NYW55Ml8wQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hbnlUb01hbnkyXzBBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlZmMzOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hbnlUb01hbnkyXzBBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFueVRvTWFueTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTWFueVRvTWFueTJfMEFubm90YXRpb25UZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsMl8wVGVzdENhc2UgewotCQotCXB1YmxpYyBNYW55VG9NYW55Ml8wQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvTWFueSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvTWFueVdpdGhGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BTllfVE9fTUFOWSwgSlBBLkZFVENIX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55KGZldGNoID0gRmV0Y2hUeXBlLkVBR0VSKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkodGFyZ2V0RW50aXR5ID0gQW5ub3RhdGlvblRlc3RUeXBlLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aE1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueShtYXBwZWRCeSA9IFwiZm9vXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BTllfVE9fTUFOWSwgSlBBLkNBU0NBREVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkoY2FzY2FkZSA9IENhc2NhZGVUeXBlLkFMTCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvTWFueVdpdGhNdWx0aXBsZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX01BTlksIEpQQS5DQVNDQURFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55KGNhc2NhZGUgPSB7Q2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoRHVwbGljYXRlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BTllfVE9fTUFOWSwgSlBBLkNBU0NBREVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkoY2FzY2FkZSA9IHtDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuTUVSR0V9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFueVRvTWFueSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnROb3ROdWxsKG1hbnlUb01hbnkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgbWFueVRvTWFueS5nZXRGZXRjaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgbWFueVRvTWFueS5nZXRGZXRjaCgpKTsKLQkJCi0JCW1hbnlUb01hbnkuc2V0RmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG1hbnlUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoZmV0Y2ggPSBMQVpZKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEZldGNoTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueVdpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBtYW55VG9NYW55LmdldEZldGNoKCkpOwotCQkKLQkJbWFueVRvTWFueS5zZXRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEZldGNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiZmV0Y2giLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBtYW55VG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCW1hbnlUb01hbnkuc2V0VGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueSh0YXJnZXRFbnRpdHkgPSBGb28uY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFyZ2V0RW50aXR5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgbWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQltYW55VG9NYW55LnNldFRhcmdldEVudGl0eShudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInRhcmdldEVudGl0eSIsIGN1KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgbWFueVRvTWFueS5nZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSgpKTsKLQkJCi0JCW1hbnlUb01hbnkuc2V0VGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueSh0YXJnZXRFbnRpdHkgPSBGb28uY2xhc3MpIiwgY3UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBtYW55VG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgbWFueVRvTWFueS5nZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSgpKTsgLy9idWcgMTk2MjAwIGNoYW5nZWQgdGhpcwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoTWFwcGVkQnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwZWRCeU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJbWFueVRvTWFueS5zZXRNYXBwZWRCeSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgbWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueShtYXBwZWRCeSA9IFwiYmFyXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwcGVkQnlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aE1hcHBlZEJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JCW1hbnlUb01hbnkuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm1hcHBlZEJ5IiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZUFsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlQWxsKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoY2FzY2FkZSA9IEFMTCkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZU1lcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnkuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCi0JCW1hbnlUb01hbnkuc2V0Q2FzY2FkZU1lcmdlKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoY2FzY2FkZSA9IE1FUkdFKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUobWFueVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KGNhc2NhZGUgPSBQRVJTSVNUKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUobWFueVRvTWFueS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55LmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlUmVtb3ZlKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoY2FzY2FkZSA9IFJFTU9WRSkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlUmVtb3ZlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55LmlzQ2FzY2FkZVJlZnJlc2goKSk7Ci0JCi0JCW1hbnlUb01hbnkuc2V0Q2FzY2FkZVJlZnJlc2godHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueShjYXNjYWRlID0gUkVGUkVTSCkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZURldGFjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueTJfMEFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55Ml8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55LmlzQ2FzY2FkZURldGFjaCgpKTsKLQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlRGV0YWNoKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoY2FzY2FkZSA9IERFVEFDSCkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlRGV0YWNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXNjYWRlTW9yZVRoYW5PbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aENhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQkJCi0JCW1hbnlUb01hbnkuc2V0Q2FzY2FkZUFsbCh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQkJLy9hIHNlY29uZCBDYXNjYWRlVHlwZS5BbGwgc2hvdWxkIG5vdCBoYXZlIGJlZW4gYWRkZWQKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KGNhc2NhZGUgPSBDYXNjYWRlVHlwZS5BTEwpIiwgY3UpOwotCQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlQWxsKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQkJCi0JCS8vdGVzdCBzZXR0aW5nIGNhc2NhZGVBbGwgdG8gZmFsc2UgYWdhaW4sIHNob3VsZCBqdXN0IGRvIG5vdGhpbmcKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlQWxsKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoRHVwbGljYXRlQ2FzY2FkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQltYW55VG9NYW55LnNldENhc2NhZGVNZXJnZShmYWxzZSk7IC8vVE9ETyBzaG91bGQgdGhlIHJlc291cmNlIG1vZGVsIGhhbmRsZSB0aGlzIGFuZCByZW1vdmUgYm90aCBNRVJHRSAKLQkJCQkJCQkJCQkgIC8vc2V0dGluZ3MgaW5zdGVhZCBvZiBoYXZpbmcgdG8gc2V0IGl0IGZhbHNlIHR3aWNlPwotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQltYW55VG9NYW55LnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnkuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueVdpdGhNdWx0aXBsZUNhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlUmVtb3ZlKCkpOwotCQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoY2FzY2FkZSA9IFJFTU9WRSkiLCBjdSk7Ci0JCQotCQltYW55VG9NYW55LnNldENhc2NhZGVSZW1vdmUoZmFsc2UpOwkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFueVRvT25lMl8wQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hbnlUb09uZTJfMEFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTIwYTFhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFueVRvT25lMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNYW55VG9PbmUyXzBBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgTWFueVRvT25lMl8wQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvT25lV2l0aEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19PTkUsIEpQQS5GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lKGZldGNoID0gRmV0Y2hUeXBlLkVBR0VSKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb09uZSh0YXJnZXRFbnRpdHkgPSBBbm5vdGF0aW9uVGVzdFR5cGUuY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvT25lV2l0aE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUob3B0aW9uYWwgPSB0cnVlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BTllfVE9fT05FLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lKGNhc2NhZGUgPSBDYXNjYWRlVHlwZS5BTEwpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhNdWx0aXBsZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX09ORSwgSlBBLkNBU0NBREVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb09uZShjYXNjYWRlID0ge0Nhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5SRU1PVkV9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoRHVwbGljYXRlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BTllfVE9fT05FLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lKGNhc2NhZGUgPSB7Q2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLk1FUkdFfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hbnlUb09uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0Tm90TnVsbChtYW55VG9PbmUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG1hbnlUb09uZS5nZXRGZXRjaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG1hbnlUb09uZS5nZXRGZXRjaCgpKTsKLQkJCi0JCW1hbnlUb09uZS5zZXRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgbWFueVRvT25lLmdldEZldGNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUoZmV0Y2ggPSBMQVpZKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEZldGNoTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lV2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgbWFueVRvT25lLmdldEZldGNoKCkpOwotCQkKLQkJbWFueVRvT25lLnNldEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZS5nZXRGZXRjaCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiZmV0Y2giLCBjdSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgbWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCW1hbnlUb09uZS5zZXRUYXJnZXRFbnRpdHkoIkZvbyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUodGFyZ2V0RW50aXR5ID0gRm9vLmNsYXNzKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRhcmdldEVudGl0eU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJbWFueVRvT25lLnNldFRhcmdldEVudGl0eShudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigidGFyZ2V0RW50aXR5IiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgbWFueVRvT25lLmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lKCkpOwotCQkKLQkJbWFueVRvT25lLnNldFRhcmdldEVudGl0eSgiRm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZSh0YXJnZXRFbnRpdHkgPSBGb28uY2xhc3MpIiwgY3UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBtYW55VG9PbmUuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHlDbGFzc05hbWUoKSk7Ly9idWcgMTk2MjAwIGNoYW5nZWQgdGhpcwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0T3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhPcHRpb25hbCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhPcHRpb25hbCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCW1hbnlUb09uZS5zZXRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKG9wdGlvbmFsID0gZmFsc2UpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T3B0aW9uYWxOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQltYW55VG9PbmUuc2V0T3B0aW9uYWwobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJvcHRpb25hbCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZUFsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVBbGwodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKGNhc2NhZGUgPSBBTEwpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlQWxsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZU1lcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmUuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlTWVyZ2UodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKGNhc2NhZGUgPSBNRVJHRSkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG1hbnlUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmUuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShjYXNjYWRlID0gUEVSU0lTVCkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG1hbnlUb09uZS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVSZW1vdmUodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKGNhc2NhZGUgPSBSRU1PVkUpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlUmVtb3ZlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZVJlZnJlc2goKSk7Ci0JCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlUmVmcmVzaCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUoY2FzY2FkZSA9IFJFRlJFU0gpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZURldGFjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmUyXzBBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZURldGFjaCgpKTsKLQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVEZXRhY2godHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKGNhc2NhZGUgPSBERVRBQ0gpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlRGV0YWNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXNjYWRlTW9yZVRoYW5PbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoQ2FzY2FkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQkJCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlQWxsKHRydWUpOwotCQlhc3NlcnRUcnVlKG1hbnlUb09uZS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCS8vYSBzZWNvbmQgQ2FzY2FkZVR5cGUuQWxsIHNob3VsZCBub3QgaGF2ZSBiZWVuIGFkZGVkCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKGNhc2NhZGUgPSBDYXNjYWRlVHlwZS5BTEwpIiwgY3UpOwotCQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVBbGwoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmUuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JCQotCQkvL3Rlc3Qgc2V0dGluZyBjYXNjYWRlQWxsIHRvIGZhbHNlIGFnYWluLCBzaG91bGQganVzdCBkbyBub3RoaW5nCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlQWxsKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lV2l0aER1cGxpY2F0ZUNhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRUcnVlKG1hbnlUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOy8vVE9ETyBzaG91bGQgdGhlIHJlc291cmNlIG1vZGVsIGhhbmRsZSB0aGlzIGFuZCByZW1vdmUgYm90aCBNRVJHRSAKLQkJCQkJCQkJCQkvL3NldHRpbmdzIGluc3RlYWQgb2YgaGF2aW5nIHRvIHNldCBpdCBmYWxzZSB0d2ljZT8KLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQltYW55VG9PbmUuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhNdWx0aXBsZUNhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRUcnVlKG1hbnlUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlUmVtb3ZlKCkpOwotCQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKGNhc2NhZGUgPSBSRU1PVkUpIiwgY3UpOwotCQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVSZW1vdmUoZmFsc2UpOwkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ2NDYzOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleUNsYXNzMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBfS0VZX0NMQVNTX1ZBTFVFID0gIk15Q2xhc3MiOwotCQotCXB1YmxpYyBNYXBLZXlDbGFzczJfMEFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk1BUF9LRVlfQ0xBU1MpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBLZXlDbGFzcyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBLZXlDbGFzc1dpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk1BUF9LRVlfQ0xBU1MpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBLZXlDbGFzcygiICsgTUFQX0tFWV9DTEFTU19WQUxVRSArICIuY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFwS2V5Q2xhc3MoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQotCQlNYXBLZXlDbGFzczJfMEFubm90YXRpb24gbWFwS2V5Q2xhc3MgPSAoTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ0xBU1MpOwotCQlhc3NlcnROb3ROdWxsKG1hcEtleUNsYXNzKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXlDbGFzcy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hcEtleUNsYXNzV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0KLQkJTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIG1hcEtleUNsYXNzID0gKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NMQVNTKTsKLQkJYXNzZXJ0RXF1YWxzKE1BUF9LRVlfQ0xBU1NfVkFMVUUsIG1hcEtleUNsYXNzLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFwS2V5Q2xhc3NXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQotCQlNYXBLZXlDbGFzczJfMEFubm90YXRpb24gbWFwS2V5Q2xhc3MgPSAoTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ0xBU1MpOwotCQlhc3NlcnRFcXVhbHMoTUFQX0tFWV9DTEFTU19WQUxVRSwgbWFwS2V5Q2xhc3MuZ2V0VmFsdWUoKSk7Ci0JCQotCQltYXBLZXlDbGFzcy5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFwS2V5Q2xhc3MuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUNsYXNzKGZvby5jbGFzcykiLCBjdSk7Ci0JCQotCQltYXBLZXlDbGFzcy5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5Q2xhc3MoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RnVsbHlRdWFsaWZpZWRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFwS2V5Q2xhc3NXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQotCQlNYXBLZXlDbGFzczJfMEFubm90YXRpb24gbWFwS2V5Q2xhc3MgPSAoTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ0xBU1MpOwotCQlhc3NlcnROb3ROdWxsKG1hcEtleUNsYXNzLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk15Q2xhc3MiLCBtYXBLZXlDbGFzcy5nZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpKTsgLy9idWcgMTk2MjAwIGNoYW5nZWQgdGhpcwotCi0KLQkJbWFwS2V5Q2xhc3Muc2V0VmFsdWUoVFlQRV9OQU1FKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIG1hcEtleUNsYXNzLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKCkpOwkJCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlDbGFzcygiICsgVFlQRV9OQU1FICsgIi5jbGFzcykiLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleUNvbHVtbjJfMEFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y2Y2FlOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleUNvbHVtbjJfMEFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05BTUUgPSAiTVlfQ09MVU1OIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX1RBQkxFID0gIk1ZX1RBQkxFIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OID0gIkNPTFVNTl9ERUZJTklUSU9OIjsKLQkKLQlwdWJsaWMgTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBLZXlDb2x1bW4iKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29sdW1uV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcEtleUNvbHVtbihuYW1lID0gXCIiICsgQ09MVU1OX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbHVtbldpdGhUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwS2V5Q29sdW1uKHRhYmxlID0gXCIiICsgQ09MVU1OX1RBQkxFICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb2x1bW5XaXRoQ29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwS2V5Q29sdW1uKGNvbHVtbkRlZmluaXRpb24gPSBcIiIgKyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbHVtbldpdGhCb29sZWFuRWxlbWVudChmaW5hbCBTdHJpbmcgYm9vbGVhbkVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwS2V5Q29sdW1uKCIgKyBib29sZWFuRWxlbWVudCArICIgPSB0cnVlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb2x1bW5XaXRoSW50RWxlbWVudChmaW5hbCBTdHJpbmcgaW50RWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBLZXlDb2x1bW4oIiArIGludEVsZW1lbnQgKyAiID0gNSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW5XaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVuaXF1ZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQotCQljb2x1bW4uc2V0TmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUNvbHVtbihuYW1lID0gXCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbHVtbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNYXBLZXlDb2x1bW4oIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9UQUJMRSwgY29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldFRhYmxlKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUNvbHVtbih0YWJsZSA9IFwiRm9vXCIpIiwgY3UpOwotCi0JCQotCQljb2x1bW4uc2V0VGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5Q29sdW1uKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04sIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCi0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwS2V5Q29sdW1uKGNvbHVtbkRlZmluaXRpb24gPSBcIkZvb1wiKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5Q29sdW1uKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoInVuaXF1ZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb2x1bW4uZ2V0VW5pcXVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVbmlxdWUoKSk7Ci0KLQkJY29sdW1uLnNldFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRVbmlxdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUNvbHVtbih1bmlxdWUgPSBmYWxzZSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0VW5pcXVlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleUNvbHVtbigiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJudWxsYWJsZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROdWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldE51bGxhYmxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlDb2x1bW4obnVsbGFibGUgPSBmYWxzZSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0TnVsbGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5Q29sdW1uKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJpbnNlcnRhYmxlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQotCQljb2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlDb2x1bW4oaW5zZXJ0YWJsZSA9IGZhbHNlKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXRJbnNlcnRhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleUNvbHVtbigiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhCb29sZWFuRWxlbWVudCgidXBkYXRhYmxlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQotCQljb2x1bW4uc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwS2V5Q29sdW1uKHVwZGF0YWJsZSA9IGZhbHNlKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXRVcGRhdGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5Q29sdW1uKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW5XaXRoSW50RWxlbWVudCgibGVuZ3RoIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldExlbmd0aCgpKTsKLQotCQljb2x1bW4uc2V0TGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUNvbHVtbihsZW5ndGggPSA1KSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXRMZW5ndGgobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5Q29sdW1uKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UHJlY2lzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW5XaXRoSW50RWxlbWVudCgicHJlY2lzaW9uIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGNvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRQcmVjaXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCi0JCWNvbHVtbi5zZXRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgY29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwS2V5Q29sdW1uKHByZWNpc2lvbiA9IDUpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldFByZWNpc2lvbihudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNYXBLZXlDb2x1bW4oIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTY2FsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uV2l0aEludEVsZW1lbnQoInNjYWxlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGNvbHVtbi5nZXRTY2FsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNjYWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRTY2FsZSgpKTsKLQotCQljb2x1bW4uc2V0U2NhbGUoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgY29sdW1uLmdldFNjYWxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlDb2x1bW4oc2NhbGUgPSA1KSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXRTY2FsZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNYXBLZXlDb2x1bW4oIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZDY4ZDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlIHsKLQotCXB1YmxpYyBNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwS2V5RW51bWVyYXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk1BUF9LRVlfRU5VTUVSQVRFRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcEtleUVudW1lcmF0ZWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwS2V5RW51bWVyYXRlZFdpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk1BUF9LRVlfRU5VTUVSQVRFRCwgSlBBLkVOVU1fVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcEtleUVudW1lcmF0ZWQoRW51bVR5cGUuT1JESU5BTCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleUVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hcEtleUVudW1lcmF0ZWQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uIGVudW1lcmF0ZWQgPSAoTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9FTlVNRVJBVEVEKTsKLQkJYXNzZXJ0Tm90TnVsbChlbnVtZXJhdGVkKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYXBLZXlFbnVtZXJhdGVkV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbiBlbnVtZXJhdGVkID0gKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfRU5VTUVSQVRFRCk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5PUkRJTkFMLCBlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hcEtleUVudW1lcmF0ZWQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQotCQlNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbiBlbnVtZXJhdGVkID0gKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfRU5VTUVSQVRFRCk7Ci0KLQkJZW51bWVyYXRlZC5zZXRWYWx1ZShFbnVtVHlwZS5TVFJJTkcpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlFbnVtZXJhdGVkKFNUUklORykiLCBjdSk7Ci0JCQotCQllbnVtZXJhdGVkLnNldFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNYXBLZXlFbnVtZXJhdGVkKCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlFbnVtZXJhdGVkIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdiNzAyZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OQU1FID0gIk1ZX0NPTFVNTiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9UQUJMRSA9ICJNWV9UQUJMRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiA9ICJDT0xVTU5fREVGSU5JVElPTiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FID0gIk1ZX1JFRl9DT0xVTU5fTkFNRSI7Ci0JCi0JcHVibGljIE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcEtleUpvaW5Db2x1bW4iKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcEtleUpvaW5Db2x1bW4obmFtZSA9IFwiIiArIENPTFVNTl9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcEtleUpvaW5Db2x1bW4odGFibGUgPSBcIiIgKyBDT0xVTU5fVEFCTEUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwS2V5Sm9pbkNvbHVtbihyZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiIiArIENPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwS2V5Sm9pbkNvbHVtbihjb2x1bW5EZWZpbml0aW9uID0gXCIiICsgQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KGZpbmFsIFN0cmluZyBib29sZWFuRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcEtleUpvaW5Db2x1bW4oIiArIGJvb2xlYW5FbGVtZW50ICsgIiA9IHRydWUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIG1hcEtleUpvaW5Db2x1bW5BdChpbnQgaW5kZXgsIEphdmFSZXNvdXJjZU1lbWJlciByZXNvdXJjZU1lbWJlcikgewotCQlyZXR1cm4gKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZU1lbWJlci5nZXRBbm5vdGF0aW9uKGluZGV4LCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQotCQljb2x1bW4uc2V0TmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUpvaW5Db2x1bW4obmFtZSA9IFwiRm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJY29sdW1uLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleUpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gdGhpcy5tYXBLZXlKb2luQ29sdW1uQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fVEFCTEUsIGNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gdGhpcy5tYXBLZXlKb2luQ29sdW1uQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQljb2x1bW4uc2V0VGFibGUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwS2V5Sm9pbkNvbHVtbih0YWJsZSA9IFwiRm9vXCIpIiwgY3UpOwotCi0JCQotCQljb2x1bW4uc2V0VGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5Sm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJY29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUpvaW5Db2x1bW4ocmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIkZvb1wiKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleUpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gdGhpcy5tYXBLZXlKb2luQ29sdW1uQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04sIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUpvaW5Db2x1bW4oY29sdW1uRGVmaW5pdGlvbiA9IFwiRm9vXCIpIiwgY3UpOwotCi0JCQotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNYXBLZXlKb2luQ29sdW1uKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJ1bmlxdWUiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gdGhpcy5tYXBLZXlKb2luQ29sdW1uQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldFVuaXF1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVuaXF1ZSgpKTsKLQotCQljb2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldFVuaXF1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwS2V5Sm9pbkNvbHVtbih1bmlxdWUgPSBmYWxzZSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0VW5pcXVlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleUpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoIm51bGxhYmxlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldE51bGxhYmxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlKb2luQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldE51bGxhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleUpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbnNlcnRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJpbnNlcnRhYmxlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldEluc2VydGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwS2V5Sm9pbkNvbHVtbihpbnNlcnRhYmxlID0gZmFsc2UpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldEluc2VydGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5Sm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoInVwZGF0YWJsZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VXBkYXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlKb2luQ29sdW1uKHVwZGF0YWJsZSA9IGZhbHNlKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXRVcGRhdGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5Sm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlKb2luQ29sdW1uczJfMEFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlKb2luQ29sdW1uczJfMEFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTgwOGRiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5Sm9pbkNvbHVtbnMyXzBBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNYXBLZXlKb2luQ29sdW1uczJfMEFubm90YXRpb25UZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsMl8wVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fTkFNRSA9ICJNWV9DT0xVTU4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fVEFCTEUgPSAiTVlfVEFCTEUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gPSAiQ09MVU1OX0RFRklOSVRJT04iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9ICJNWV9SRUZfQ09MVU1OX05BTUUiOwotCQotCXB1YmxpYyBNYXBLZXlKb2luQ29sdW1uczJfMEFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTiwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU5TKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwS2V5Sm9pbkNvbHVtbnMoQE1hcEtleUpvaW5Db2x1bW4pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4sIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcEtleUpvaW5Db2x1bW5zKEBNYXBLZXlKb2luQ29sdW1uKG5hbWUgPSBcIiIgKyBDT0xVTU5fTkFNRSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBLZXlKb2luQ29sdW1ucyhATWFwS2V5Sm9pbkNvbHVtbih0YWJsZSA9IFwiIiArIENPTFVNTl9UQUJMRSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBLZXlKb2luQ29sdW1ucyhATWFwS2V5Sm9pbkNvbHVtbihyZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiIiArIENPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FICsgIlwiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTiwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU5TKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwS2V5Sm9pbkNvbHVtbnMoQE1hcEtleUpvaW5Db2x1bW4oY29sdW1uRGVmaW5pdGlvbiA9IFwiIiArIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoZmluYWwgU3RyaW5nIGJvb2xlYW5FbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBLZXlKb2luQ29sdW1ucyhATWFwS2V5Sm9pbkNvbHVtbigiICsgYm9vbGVhbkVsZW1lbnQgKyAiID0gdHJ1ZSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4sIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcEtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gbWFwS2V5Sm9pbkNvbHVtbkF0KGludCBpbmRleCwgSmF2YVJlc291cmNlTWVtYmVyIHJlc291cmNlTWVtYmVyKSB7Ci0JCXJldHVybiAoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlTWVtYmVyLmdldEFubm90YXRpb24oaW5kZXgsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQotCQljb2x1bW4uc2V0TmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUpvaW5Db2x1bW5zKEBNYXBLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZvb1wiKSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQljb2x1bW4uc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5Sm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9UQUJMRSwgY29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gdGhpcy5tYXBLZXlKb2luQ29sdW1uQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQljb2x1bW4uc2V0VGFibGUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwS2V5Sm9pbkNvbHVtbnMoQE1hcEtleUpvaW5Db2x1bW4odGFibGUgPSBcIkZvb1wiKSkiLCBjdSk7Ci0KLQkJCi0JCWNvbHVtbi5zZXRUYWJsZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNYXBLZXlKb2luQ29sdW1uKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUUsIGNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJY29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUpvaW5Db2x1bW5zKEBNYXBLZXlKb2luQ29sdW1uKHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJGb29cIikpIiwgY3UpOwotCi0JCQotCQljb2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5Sm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQ29sdW1uRGVmaW5pdGlvbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUpvaW5Db2x1bW5zKEBNYXBLZXlKb2luQ29sdW1uKGNvbHVtbkRlZmluaXRpb24gPSBcIkZvb1wiKSkiLCBjdSk7Ci0KLQkJCi0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleUpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoInVuaXF1ZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnRUcnVlKGNvbHVtbi5nZXRVbmlxdWUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VW5pcXVlKCkpOwotCi0JCWNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKGNvbHVtbi5nZXRVbmlxdWUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUpvaW5Db2x1bW5zKEBNYXBLZXlKb2luQ29sdW1uKHVuaXF1ZSA9IGZhbHNlKSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0VW5pcXVlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleUpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoIm51bGxhYmxlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydFRydWUoY29sdW1uLmdldE51bGxhYmxlKCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShjb2x1bW4uZ2V0TnVsbGFibGUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUpvaW5Db2x1bW5zKEBNYXBLZXlKb2luQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXROdWxsYWJsZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNYXBLZXlKb2luQ29sdW1uKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhCb29sZWFuRWxlbWVudCgiaW5zZXJ0YWJsZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnRUcnVlKGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gdGhpcy5tYXBLZXlKb2luQ29sdW1uQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwS2V5Sm9pbkNvbHVtbnMoQE1hcEtleUpvaW5Db2x1bW4oaW5zZXJ0YWJsZSA9IGZhbHNlKSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0SW5zZXJ0YWJsZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNYXBLZXlKb2luQ29sdW1uKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhCb29sZWFuRWxlbWVudCgidXBkYXRhYmxlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydFRydWUoY29sdW1uLmdldFVwZGF0YWJsZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gdGhpcy5tYXBLZXlKb2luQ29sdW1uQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoY29sdW1uLmdldFVwZGF0YWJsZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwS2V5Sm9pbkNvbHVtbnMoQE1hcEtleUpvaW5Db2x1bW4odXBkYXRhYmxlID0gZmFsc2UpKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXRVcGRhdGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5Sm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRKb2luQ29sdW1uQ29weUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJATWFwS2V5Sm9pbkNvbHVtbnMoeyI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQE1hcEtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIjsKLQkJU3RyaW5nIGV4cGVjdGVkMyA9ICJATWFwS2V5Sm9pbkNvbHVtbihuYW1lID0gXCJGT09cIikgfSkiOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMSwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU5TKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSm9pbkNvbHVtblRvQmVnaW5uaW5nT2ZMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJATWFwS2V5Sm9pbkNvbHVtbnMoeyI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQE1hcEtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIjsKLQkJU3RyaW5nIGV4cGVjdGVkMyA9ICJATWFwS2V5Sm9pbkNvbHVtbihuYW1lID0gXCJGT09cIikgfSkiOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMSwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCQkJCQotCQlleHBlY3RlZDIgPSAiQE1hcEtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFaXCIpLCI7Ci0JCWV4cGVjdGVkMyA9ICJATWFwS2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQE1hcEtleUpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpIH0pIjsKLQkJam9pbkNvbHVtbiA9IChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGpvaW5Db2x1bW5zID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OUykpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnRFcXVhbHMoMywgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKb2luQ29sdW1uQ29weUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJATWFwS2V5Sm9pbkNvbHVtbnMoeyI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQE1hcEtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIjsKLQkJU3RyaW5nIGV4cGVjdGVkMyA9ICJATWFwS2V5Sm9pbkNvbHVtbihuYW1lID0gXCJGT09cIikgfSkiOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMSwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCQkKLQkJZXhwZWN0ZWQyID0gIkBNYXBLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpIjsKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5Sm9pbkNvbHVtbnMiLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMjRmZjMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb25UZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsMl8wVGVzdENhc2UgewotCi0JcHVibGljIE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5NQVBfS0VZX1RFTVBPUkFMKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwS2V5VGVtcG9yYWwiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGVtcG9yYWxXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5NQVBfS0VZX1RFTVBPUkFMLCBKUEEuVEVNUE9SQUxfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcEtleVRlbXBvcmFsKFRlbXBvcmFsVHlwZS5EQVRFKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRlbXBvcmFsKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24gdGVtcG9yYWwgPSAoTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfVEVNUE9SQUwpOwotCQlhc3NlcnROb3ROdWxsKHRlbXBvcmFsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUZW1wb3JhbFdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uIHRlbXBvcmFsID0gKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX1RFTVBPUkFMKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCB0ZW1wb3JhbC5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUZW1wb3JhbCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCi0JCU1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9URU1QT1JBTCk7Ci0KLQkJdGVtcG9yYWwuc2V0VmFsdWUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlUZW1wb3JhbChUSU1FKSIsIGN1KTsKLQkJCi0JCXRlbXBvcmFsLnNldFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNYXBLZXlUZW1wb3JhbCgiLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcHNJZDJfMEFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBzSWQyXzBBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWExOWU1NC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcHNJZDJfMEFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBzSWQyXzBBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNYXBzSWQyXzBBbm5vdGF0aW9uVGVzdHMKLQlleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsMl8wVGVzdENhc2UKLXsKLQlwdWJsaWMgTWFwc0lkMl8wQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk1BUFNfSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBzSWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwc0lkV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuTUFQU19JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHNJZChcImZvb1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFwc0lkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYXBzSWQyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYXBzSWRXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hcHNJZDJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFwc0lkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0KLQkJTWFwc0lkMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE1hcHNJZDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCk7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcHNJZChcImZvb1wiKSIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwc0lkIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvT25lVG9NYW55Ml8wQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL09uZVRvTWFueTJfMEFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjQ1YjEyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvT25lVG9NYW55Ml8wQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPbmVUb01hbnkyXzBBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgT25lVG9NYW55Ml8wQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9NYW55V2l0aEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX01BTlksIEpQQS5GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55KGZldGNoID0gRmV0Y2hUeXBlLkVBR0VSKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkodGFyZ2V0RW50aXR5ID0gQW5ub3RhdGlvblRlc3RUeXBlLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoTWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueShtYXBwZWRCeSA9IFwiZm9vXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX01BTlksIEpQQS5DQVNDQURFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkoY2FzY2FkZSA9IENhc2NhZGVUeXBlLkFMTCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9NYW55V2l0aE11bHRpcGxlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19NQU5ZLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55KGNhc2NhZGUgPSB7Q2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhEdXBsaWNhdGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX01BTlksIEpQQS5DQVNDQURFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkoY2FzY2FkZSA9IHtDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuTUVSR0V9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnROb3ROdWxsKG9uZVRvTWFueSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb25lVG9NYW55LmdldEZldGNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb25lVG9NYW55LmdldEZldGNoKCkpOwotCQkKLQkJb25lVG9NYW55LnNldEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvbmVUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueShmZXRjaCA9IExBWlkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2hOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0RmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldEZldGNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJmZXRjaCIsIGN1KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJb25lVG9NYW55LnNldFRhcmdldEVudGl0eSgiRm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueSh0YXJnZXRFbnRpdHkgPSBGb28uY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFyZ2V0RW50aXR5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0VGFyZ2V0RW50aXR5KG51bGwpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJ0YXJnZXRFbnRpdHkiLCBjdSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBvbmVUb01hbnkuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHlDbGFzc05hbWUoKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0VGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KHRhcmdldEVudGl0eSA9IEZvby5jbGFzcykiLCBjdSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9uZVRvTWFueS5nZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSgpKTsgLy9idWcgMTk2MjAwIGNoYW5nZWQgdGhpcwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhNYXBwZWRCeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBlZEJ5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQlvbmVUb01hbnkuc2V0TWFwcGVkQnkoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KG1hcHBlZEJ5ID0gXCJiYXJcIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBwZWRCeU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhNYXBwZWRCeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJb25lVG9NYW55LnNldE1hcHBlZEJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigibWFwcGVkQnkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwotCQotCQlvbmVUb01hbnkuc2V0Q2FzY2FkZUFsbCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoY2FzY2FkZSA9IEFMTCkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVBbGwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlTWVyZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVNZXJnZSh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoY2FzY2FkZSA9IE1FUkdFKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQotCQlvbmVUb01hbnkuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KGNhc2NhZGUgPSBQRVJTSVNUKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnkuaXNDYXNjYWRlUmVtb3ZlKCkpOwotCQotCQlvbmVUb01hbnkuc2V0Q2FzY2FkZVJlbW92ZSh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoY2FzY2FkZSA9IFJFTU9WRSkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnkuaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVSZWZyZXNoKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueShjYXNjYWRlID0gUkVGUkVTSCkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlRGV0YWNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueTJfMEFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnkuaXNDYXNjYWRlRGV0YWNoKCkpOwotCQotCQlvbmVUb01hbnkuc2V0Q2FzY2FkZURldGFjaCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoY2FzY2FkZSA9IERFVEFDSCkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVEZXRhY2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhc2NhZGVNb3JlVGhhbk9uY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhDYXNjYWRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0VHJ1ZShvbmVUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVBbGwodHJ1ZSk7Ci0JCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQkJLy9hIHNlY29uZCBDYXNjYWRlVHlwZS5BbGwgc2hvdWxkIG5vdCBoYXZlIGJlZW4gYWRkZWQKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoY2FzY2FkZSA9IENhc2NhZGVUeXBlLkFMTCkiLCBjdSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0Q2FzY2FkZUFsbChmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQkJCi0JCS8vdGVzdCBzZXR0aW5nIGNhc2NhZGVBbGwgdG8gZmFsc2UgYWdhaW4sIHNob3VsZCBqdXN0IGRvIG5vdGhpbmcKLQkJb25lVG9NYW55LnNldENhc2NhZGVBbGwoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoRHVwbGljYXRlQ2FzY2FkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ly9UT0RPIHNob3VsZCB0aGUgcmVzb3VyY2UgbW9kZWwgaGFuZGxlIHRoaXMgYW5kIHJlbW92ZSBib3RoIE1FUkdFIAotCQkJCQkJCQkJCS8vc2V0dGluZ3MgaW5zdGVhZCBvZiBoYXZpbmcgdG8gc2V0IGl0IGZhbHNlIHR3aWNlPwotCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJCi0JCW9uZVRvTWFueS5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnkuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aE11bHRpcGxlQ2FzY2FkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoY2FzY2FkZSA9IFJFTU9WRSkiLCBjdSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0Q2FzY2FkZVJlbW92ZShmYWxzZSk7CQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL09uZVRvT25lMl8wQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL09uZVRvT25lMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YjhiZWQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9PbmVUb09uZTJfMEFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5PbmVUb09uZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9uZVRvT25lMl8wQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIE9uZVRvT25lMl8wQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9PbmVXaXRoRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fT05FLCBKUEEuRkVUQ0hfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lKGZldGNoID0gRmV0Y2hUeXBlLkVBR0VSKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvT25lV2l0aFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZSh0YXJnZXRFbnRpdHkgPSBBbm5vdGF0aW9uVGVzdFR5cGUuY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9PbmVXaXRoT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUob3B0aW9uYWwgPSB0cnVlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb09uZVdpdGhNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZShtYXBwZWRCeSA9IFwiZm9vXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvT25lV2l0aENhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fT05FLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUoY2FzY2FkZSA9IENhc2NhZGVUeXBlLkFMTCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9PbmVXaXRoTXVsdGlwbGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX09ORSwgSlBBLkNBU0NBREVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lKGNhc2NhZGUgPSB7Q2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvT25lV2l0aER1cGxpY2F0ZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fT05FLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUoY2FzY2FkZSA9IHtDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuTUVSR0V9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnROb3ROdWxsKG9uZVRvT25lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb25lVG9PbmUuZ2V0RmV0Y2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb25lVG9PbmUuZ2V0RmV0Y2goKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb25lVG9PbmUuZ2V0RmV0Y2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGZldGNoID0gTEFaWSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb09uZS5nZXRGZXRjaCgpKTsKLQkJCi0JCW9uZVRvT25lLnNldEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldEZldGNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImZldGNoIiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRUYXJnZXRFbnRpdHkoIkZvbyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZSh0YXJnZXRFbnRpdHkgPSBGb28uY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFyZ2V0RW50aXR5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigidGFyZ2V0RW50aXR5IiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBvbmVUb09uZS5nZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSgpKTsKLQkJCi0JCW9uZVRvT25lLnNldFRhcmdldEVudGl0eSgiRm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKHRhcmdldEVudGl0eSA9IEZvby5jbGFzcykiLCBjdSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgb25lVG9PbmUuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHlDbGFzc05hbWUoKSk7IC8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhPcHRpb25hbCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhPcHRpb25hbCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9uZVRvT25lLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShvcHRpb25hbCA9IGZhbHNlKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE9wdGlvbmFsTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJb25lVG9PbmUuc2V0T3B0aW9uYWwobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigib3B0aW9uYWwiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoTWFwcGVkQnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9PbmUuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBlZEJ5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCQlvbmVUb09uZS5zZXRNYXBwZWRCeSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb25lVG9PbmUuZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKG1hcHBlZEJ5ID0gXCJiYXJcIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBwZWRCeU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aE1hcHBlZEJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJb25lVG9PbmUuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigibWFwcGVkQnkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCi0JCW9uZVRvT25lLnNldENhc2NhZGVBbGwodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUoY2FzY2FkZSA9IEFMTCkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVNZXJnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlTWVyZ2UodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUoY2FzY2FkZSA9IE1FUkdFKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUob25lVG9PbmUuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCi0JCW9uZVRvT25lLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGNhc2NhZGUgPSBQRVJTSVNUKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUob25lVG9PbmUuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZS5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JCi0JCW9uZVRvT25lLnNldENhc2NhZGVSZW1vdmUodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUoY2FzY2FkZSA9IFJFTU9WRSkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZS5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlUmVmcmVzaCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShjYXNjYWRlID0gUkVGUkVTSCkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZVJlZnJlc2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVEZXRhY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZTJfMEFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZS5pc0Nhc2NhZGVEZXRhY2goKSk7Ci0JCi0JCW9uZVRvT25lLnNldENhc2NhZGVEZXRhY2godHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUoY2FzY2FkZSA9IERFVEFDSCkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZURldGFjaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FzY2FkZU1vcmVUaGFuT25jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoQ2FzY2FkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlQWxsKHRydWUpOwotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQkJLy9hIHNlY29uZCBDYXNjYWRlVHlwZS5BbGwgc2hvdWxkIG5vdCBoYXZlIGJlZW4gYWRkZWQKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShjYXNjYWRlID0gQ2FzY2FkZVR5cGUuQUxMKSIsIGN1KTsKLQkJCi0JCW9uZVRvT25lLnNldENhc2NhZGVBbGwoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQkJCi0JCS8vdGVzdCBzZXR0aW5nIGNhc2NhZGVBbGwgdG8gZmFsc2UgYWdhaW4sIHNob3VsZCBqdXN0IGRvIG5vdGhpbmcKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZUFsbChmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoRHVwbGljYXRlQ2FzY2FkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJCi0JCW9uZVRvT25lLnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ly9UT0RPIHNob3VsZCB0aGUgcmVzb3VyY2UgbW9kZWwgaGFuZGxlIHRoaXMgYW5kIHJlbW92ZSBib3RoIE1FUkdFIAotCQkJCQkJCQkJCS8vc2V0dGluZ3MgaW5zdGVhZCBvZiBoYXZpbmcgdG8gc2V0IGl0IGZhbHNlIHR3aWNlPwotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmUuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoTXVsdGlwbGVDYXNjYWRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkJCi0JCW9uZVRvT25lLnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUoY2FzY2FkZSA9IFJFTU9WRSkiLCBjdSk7Ci0JCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlUmVtb3ZlKGZhbHNlKTsJCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL09yZGVyQ29sdW1uMl8wQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL09yZGVyQ29sdW1uMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YWFjYTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9PcmRlckNvbHVtbjJfMEFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5PcmRlckNvbHVtbjJfMEFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OQU1FID0gIk1ZX0NPTFVNTiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiA9ICJDT0xVTU5fREVGSU5JVElPTiI7Ci0JCi0JcHVibGljIE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T3JkZXJDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPcmRlckNvbHVtbiIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPcmRlckNvbHVtbldpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT3JkZXJDb2x1bW4obmFtZSA9IFwiIiArIENPTFVNTl9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPcmRlckNvbHVtbldpdGhDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT3JkZXJDb2x1bW4oY29sdW1uRGVmaW5pdGlvbiA9IFwiIiArIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T3JkZXJDb2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoZmluYWwgU3RyaW5nIGJvb2xlYW5FbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPcmRlckNvbHVtbigiICsgYm9vbGVhbkVsZW1lbnQgKyAiID0gdHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPcmRlckNvbHVtbldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T3JkZXJDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChPcmRlckNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPcmRlckNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlPcmRlckNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQotCQljb2x1bW4uc2V0TmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9yZGVyQ29sdW1uKG5hbWUgPSBcIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPcmRlckNvbHVtbldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbHVtbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJY29sdW1uID0gKE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT3JkZXJDb2x1bW4iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9yZGVyQ29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChPcmRlckNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9yZGVyQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCi0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT3JkZXJDb2x1bW4oY29sdW1uRGVmaW5pdGlvbiA9IFwiRm9vXCIpIiwgY3UpOwotCi0JCQotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJY29sdW1uID0gKE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT3JkZXJDb2x1bW4iLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T3JkZXJDb2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoIm51bGxhYmxlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldE51bGxhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9yZGVyQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQotCQljb2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9yZGVyQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldE51bGxhYmxlKG51bGwpOwotCQljb2x1bW4gPSAoT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPcmRlckNvbHVtbiIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T3JkZXJDb2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoImluc2VydGFibGUiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChPcmRlckNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9yZGVyQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldEluc2VydGFibGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9yZGVyQ29sdW1uKGluc2VydGFibGUgPSBmYWxzZSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0SW5zZXJ0YWJsZShudWxsKTsKLQkJY29sdW1uID0gKE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT3JkZXJDb2x1bW4iLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9yZGVyQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJ1cGRhdGFibGUiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChPcmRlckNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VXBkYXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPcmRlckNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlPcmRlckNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPcmRlckNvbHVtbih1cGRhdGFibGUgPSBmYWxzZSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0VXBkYXRhYmxlKG51bGwpOwotCQkKLQkJY29sdW1uID0gKE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT3JkZXJDb2x1bW4iLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL1NlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL1NlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MWIzMWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLS8qKgotICogIFNlcXVlbmNlR2VuZXJhdG9yMl8wVGVzdHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUT1JfQ0FUQUxPRyA9ICJURVNUX0NBVEFMT0ciOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUT1JfU0NIRU1BID0gIlRFU1RfU0NIRU1BIjsKLQotCXB1YmxpYyBTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNhdGFsb2cgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEdldENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aENhdGFsb2coKTsJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gdGhpcy5idWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9DQVRBTE9HLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRDYXRhbG9nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhDYXRhbG9nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gdGhpcy5idWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX0NBVEFMT0csIHNlcXVlbmNlR2VuZXJhdG9yLmdldENhdGFsb2coKSk7Ci0JCQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRDYXRhbG9nKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRDYXRhbG9nKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZXF1ZW5jZUdlbmVyYXRvcihjYXRhbG9nID0gXCJmb29cIikiLCBjdSk7Ci0JCQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldENhdGFsb2coKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlcXVlbmNlR2VuZXJhdG9yKCIsIGN1KTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBzY2hlbWEgKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IHRoaXMuYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9TQ0hFTUEsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSB0aGlzLmJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfU0NIRU1BLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTY2hlbWEoKSk7Ci0JCQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTY2hlbWEoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNjaGVtYSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2VxdWVuY2VHZW5lcmF0b3Ioc2NoZW1hID0gXCJmb29cIikiLCBjdSk7Ci0JCQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U2NoZW1hKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZXF1ZW5jZUdlbmVyYXRvcigiLCBjdSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdXRpbGl0eSAqKioqKioqKioqCi0JCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhTdHJpbmdFbGVtZW50KGZpbmFsIFN0cmluZyBlbGVtZW50TmFtZSwgZmluYWwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZXF1ZW5jZUdlbmVyYXRvcigiICsgZWxlbWVudE5hbWUgKyAiID0gXCIiICsgdmFsdWUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aFN0cmluZ0VsZW1lbnQoImNhdGFsb2ciLCBHRU5FUkFUT1JfQ0FUQUxPRyk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aFN0cmluZ0VsZW1lbnQoInNjaGVtYSIsIEdFTkVSQVRPUl9TQ0hFTUEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9tZXRhZGF0YS9KcGFFbnRpdHlHZW5NZXRhZGF0YVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvbWV0YWRhdGEvSnBhRW50aXR5R2VuTWV0YWRhdGFUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjFjOTAyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9tZXRhZGF0YS9KcGFFbnRpdHlHZW5NZXRhZGF0YVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLm1ldGFkYXRhOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wcmVmcy5KcGFFbnRpdHlHZW5QcmVmZXJlbmNlc01hbmFnZXI7Ci0KLS8qKgotICogIEpwYUVudGl0eUdlbk1ldGFkYXRhVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEpwYUVudGl0eUdlbk1ldGFkYXRhVGVzdHMgZXh0ZW5kcyBKcGFNZXRhZGF0YVRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUEFDS0FHRV9QUkVGX0tFWSA9ICJlbnRpdHlnZW4uREVGQVVMVF9QQUNLQUdFIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUEFDS0FHRV9URVNUX1ZBTFVFID0gInRlc3QubW9kZWwiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgSnBhRW50aXR5R2VuUHJlZmVyZW5jZXNNYW5hZ2VyIHByb2plY3RQcmVmc01hbmFnZXI7Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgSnBhRW50aXR5R2VuTWV0YWRhdGFUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCi0JCXRoaXMucHJvamVjdFByZWZzTWFuYWdlciA9IG5ldyBKcGFFbnRpdHlHZW5QcmVmZXJlbmNlc01hbmFnZXIodGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKHRoaXMucHJvamVjdFByZWZzTWFuYWdlcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiB0ZXN0cyAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRQYWNrYWdlV29ya3NwYWNlTWV0YWRhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSnBhRW50aXR5R2VuUHJlZmVyZW5jZXNNYW5hZ2VyLnNldERlZmF1bHRQYWNrYWdlV29ya3NwYWNlUHJlZmVyZW5jZShERUZBVUxUX1BBQ0tBR0VfVEVTVF9WQUxVRSk7Ci0JCUpwYUVudGl0eUdlblByZWZlcmVuY2VzTWFuYWdlci5nZXRMZWdhY3lXb3Jrc3BhY2VQcmVmZXJlbmNlcygpLmZsdXNoKCk7Ci0KLQkJU3RyaW5nIHZhbHVlID0gdGhpcy5nZXRXb3Jrc3BhY2VQcmVmcygpLmdldChERUZBVUxUX1BBQ0tBR0VfUFJFRl9LRVkpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKERFRkFVTFRfUEFDS0FHRV9URVNUX1ZBTFVFLmVxdWFscyh2YWx1ZSkpOwotCQkKLQkJSnBhRW50aXR5R2VuUHJlZmVyZW5jZXNNYW5hZ2VyLnJlbW92ZUxlZ2FjeVdvcmtzcGFjZVByZWZlcmVuY2UoREVGQVVMVF9QQUNLQUdFX1BSRUZfS0VZKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRQYWNrYWdlUHJvamVjdE1ldGFkYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJdGhpcy5wcm9qZWN0UHJlZnNNYW5hZ2VyLnNldERlZmF1bHRQYWNrYWdlUHJlZmVyZW5jZShERUZBVUxUX1BBQ0tBR0VfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucHJvamVjdFByZWZzTWFuYWdlci5nZXRMZWdhY3lQcm9qZWN0UHJlZmVyZW5jZXMoKS5mbHVzaCgpOwotCQkKLQkJU3RyaW5nIHZhbHVlID0gdGhpcy5nZXRQcm9qZWN0UHJlZnMoKS5nZXQoREVGQVVMVF9QQUNLQUdFX1BSRUZfS0VZKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwodmFsdWUpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShERUZBVUxUX1BBQ0tBR0VfVEVTVF9WQUxVRS5lcXVhbHModmFsdWUpKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvbWV0YWRhdGEvSnBhSnBxbE1ldGFkYXRhVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9tZXRhZGF0YS9KcGFKcHFsTWV0YWRhdGFUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjFkYWVhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9tZXRhZGF0YS9KcGFKcHFsTWV0YWRhdGFUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5tZXRhZGF0YTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucHJlZnMuSnBhRW50aXR5R2VuUHJlZmVyZW5jZXNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wcmVmcy5KcGFKcHFsUHJlZmVyZW5jZXNNYW5hZ2VyOwotCi0vKioKLSAqICBKcGFKcHFsTWV0YWRhdGFUZXN0cwotICovCi1wdWJsaWMgY2xhc3MgSnBhSnBxbE1ldGFkYXRhVGVzdHMgZXh0ZW5kcyBKcGFNZXRhZGF0YVRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU0VfUFJFRl9LRVkgPSAianBxbElkZW50aWZpZXIuQ0FTRSI7IAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BVENIX0ZJUlNUX0NIQVJBQ1RFUl9DQVNFX1BSRUZfS0VZID0gImpwcWxJZGVudGlmaWVyLk1BVENIX0ZJUlNUX0NIQVJBQ1RFUl9DQVNFIjsgCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FTRV9URVNUX1ZBTFVFID0gSnBhSnBxbFByZWZlcmVuY2VzTWFuYWdlci5KUFFMX0lERU5USUZJRVJfVVBQRVJDQVNFX1BSRUZfVkFMVUU7IAotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBNQVRDSF9GSVJTVF9DSEFSQUNURVJfQ0FTRV9URVNUX1ZBTFVFID0gISBKcGFKcHFsUHJlZmVyZW5jZXNNYW5hZ2VyLkRFRkFVTFRfTUFUQ0hfRklSU1RfQ0hBUkFDVEVSX0NBU0U7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXB1YmxpYyBKcGFKcHFsTWV0YWRhdGFUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHRlc3RzICoqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpZmllcnNDYXNlV29ya3NwYWNlTWV0YWRhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSnBhSnBxbFByZWZlcmVuY2VzTWFuYWdlci5zZXRJZGVudGlmaWVyc0Nhc2VXb3Jrc3BhY2VQcmVmZXJlbmNlKENBU0VfVEVTVF9WQUxVRSk7Ci0JCUpwYUpwcWxQcmVmZXJlbmNlc01hbmFnZXIuZ2V0TGVnYWN5V29ya3NwYWNlUHJlZmVyZW5jZXMoKS5mbHVzaCgpOwotCi0JCVN0cmluZyB2YWx1ZSA9IHRoaXMuZ2V0V29ya3NwYWNlUHJlZnMoKS5nZXQoQ0FTRV9QUkVGX0tFWSk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKHZhbHVlKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoQ0FTRV9URVNUX1ZBTFVFLmVxdWFscyh2YWx1ZSkpOwotCQkKLQkJSnBhRW50aXR5R2VuUHJlZmVyZW5jZXNNYW5hZ2VyLnJlbW92ZUxlZ2FjeVdvcmtzcGFjZVByZWZlcmVuY2UoQ0FTRV9QUkVGX0tFWSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hdGNoRmlyc3RDaGFyYWN0ZXJDYXNlV29ya3NwYWNlTWV0YWRhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSnBhSnBxbFByZWZlcmVuY2VzTWFuYWdlci5zZXRNYXRjaEZpcnN0Q2hhcmFjdGVyQ2FzZVdvcmtzcGFjZVByZWZlcmVuY2UoTUFUQ0hfRklSU1RfQ0hBUkFDVEVSX0NBU0VfVEVTVF9WQUxVRSk7Ci0JCUpwYUpwcWxQcmVmZXJlbmNlc01hbmFnZXIuZ2V0TGVnYWN5V29ya3NwYWNlUHJlZmVyZW5jZXMoKS5mbHVzaCgpOwotCi0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IHRoaXMuZ2V0V29ya3NwYWNlUHJlZnMoKS5nZXQoTUFUQ0hfRklSU1RfQ0hBUkFDVEVSX0NBU0VfUFJFRl9LRVkpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbChzdHJpbmdWYWx1ZSk7Ci0JCWJvb2xlYW4gdmFsdWUgPSBCb29sZWFuLnZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSh2YWx1ZSA9PSBNQVRDSF9GSVJTVF9DSEFSQUNURVJfQ0FTRV9URVNUX1ZBTFVFKTsKLQkJCi0JCUpwYUVudGl0eUdlblByZWZlcmVuY2VzTWFuYWdlci5yZW1vdmVMZWdhY3lXb3Jrc3BhY2VQcmVmZXJlbmNlKE1BVENIX0ZJUlNUX0NIQVJBQ1RFUl9DQVNFX1BSRUZfS0VZKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvbWV0YWRhdGEvSnBhTWV0YWRhdGFUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL21ldGFkYXRhL0pwYU1ldGFkYXRhVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk5N2M0MS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvbWV0YWRhdGEvSnBhTWV0YWRhdGFUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwubWV0YWRhdGE7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGlvblRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotCi0vKioKLSAqICBKcGFNZXRhZGF0YVRlc3RzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKcGFNZXRhZGF0YVRlc3RzIGV4dGVuZHMgQW5ub3RhdGlvblRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUVElOR1NfRElSID0gIi5zZXR0aW5ncy8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFX0NPUkVfU0VUVElOR1NfRElSID0gIi5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvIiArIFNFVFRJTkdTX0RJUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19GSUxFX05BTUUgPSBKcHRKcGFDb3JlUGx1Z2luLkxFR0FDWV9QTFVHSU5fSUQgKyAiLnByZWZzIjsKLQkKLQlwcm90ZWN0ZWQgSUVjbGlwc2VQcmVmZXJlbmNlcyB3b3Jrc3BhY2VQcmVmZXJlbmNlczsKLQlwcml2YXRlIFN0cmluZyBlY2xpcHNlQ29yZVNldHRpbmdzRGlyOwotCXByaXZhdGUgU3RyaW5nIHByb2plY3RTZXR0aW5nc0RpcjsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEpwYU1ldGFkYXRhVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQotCQlJUGF0aCB3b3Jrc3BhY2VQYXRoID0gdGhpcy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0TG9jYXRpb24oKTsKLQkJdGhpcy5lY2xpcHNlQ29yZVNldHRpbmdzRGlyID0gd29ya3NwYWNlUGF0aCArICIvIiArIEVDTElQU0VfQ09SRV9TRVRUSU5HU19ESVI7Ci0KLQkJSVBhdGggcHJvamVjdFBhdGggPSB0aGlzLmphdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRMb2NhdGlvbigpOwotCQl0aGlzLnByb2plY3RTZXR0aW5nc0RpciA9IHByb2plY3RQYXRoICsgIi8iICsgU0VUVElOR1NfRElSOwotCX0KLQotCS8vICoqKioqKioqKiogcHJlZmVyZW5jZXMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFdvcmtzcGFjZVByZWZzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTZXR0aW5ncyh0aGlzLmVjbGlwc2VDb3JlU2V0dGluZ3NEaXIgKyBQUkVGU19GSUxFX05BTUUpOyAKLQl9Ci0JCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UHJvamVjdFByZWZzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTZXR0aW5ncyh0aGlzLnByb2plY3RTZXR0aW5nc0RpciArIFBSRUZTX0ZJTEVfTkFNRSk7IAotCX0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBJV29ya3NwYWNlUm9vdCBnZXRXb3Jrc3BhY2VSb290KCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFNldHRpbmdzKFN0cmluZyBzZXR0aW5nc1BhdGgpIHsKLQkJU2V0PEVudHJ5PE9iamVjdCwgT2JqZWN0Pj4gc2V0dGluZ3NTZXQgPSBudWxsOwotCQl0cnkgewotCQkJc2V0dGluZ3NTZXQgPSB0aGlzLmxvYWRNZXRhZGF0YShzZXR0aW5nc1BhdGgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTWlzc2luZzogIiArIHNldHRpbmdzUGF0aCwgZSk7Ci0JCX0KLQotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHNldHRpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCWZvcihFbnRyeTxPYmplY3QsIE9iamVjdD4gcHJvcGVydHkgOiBzZXR0aW5nc1NldCkgewotCQkJc2V0dGluZ3MucHV0KChTdHJpbmcpcHJvcGVydHkuZ2V0S2V5KCksIChTdHJpbmcpcHJvcGVydHkuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHNldHRpbmdzOwotCX0KLQotICAgIHByaXZhdGUgU2V0PEVudHJ5PE9iamVjdCwgT2JqZWN0Pj4gbG9hZE1ldGFkYXRhKFN0cmluZyBtZXRhZGF0YVBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG1ldGFkYXRhUGF0aCk7Ci0gICAgICAgIAotICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBwcm9wZXJ0aWVzLmxvYWQoc3RyZWFtKTsKLSAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcHJvcGVydGllcy5lbnRyeVNldCgpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9tZXRhZGF0YS9KcGFWYWxpZGF0aW9uTWV0YWRhdGFUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL21ldGFkYXRhL0pwYVZhbGlkYXRpb25NZXRhZGF0YVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMzk0ZTEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL21ldGFkYXRhL0pwYVZhbGlkYXRpb25NZXRhZGF0YVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLm1ldGFkYXRhOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucHJlZnMuSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzTWFuYWdlcjsKLQotLyoqCi0gKiAgSnBhVmFsaWRhdGlvbk1ldGFkYXRhVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEpwYVZhbGlkYXRpb25NZXRhZGF0YVRlc3RzIGV4dGVuZHMgSnBhTWV0YWRhdGFUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLU1BBQ0VfT1ZFUlJJREVOX1BSRUZfS0VZID0gIndvcmtzcGFjZV9wcmVmZXJlbmNlc19vdmVycmlkZW4iOyAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9OT19QRVJTSVNURU5DRV9VTklUX1BSRUZfS0VZID0gInByb2JsZW0uIiArIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9OT19QRVJTSVNURU5DRV9VTklUOyAKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gV09SS1NQQUNFX09WRVJSSURFTl9URVNUX1ZBTFVFID0gdHJ1ZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9OT19QRVJTSVNURU5DRV9VTklUX1RFU1RfVkFMVUUgPSBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXNNYW5hZ2VyLklORk87IAotCi0JcHJvdGVjdGVkIEpwYVZhbGlkYXRpb25QcmVmZXJlbmNlc01hbmFnZXIgcHJvamVjdFByZWZzTWFuYWdlcjsKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXB1YmxpYyBKcGFWYWxpZGF0aW9uTWV0YWRhdGFUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCi0JCXRoaXMucHJvamVjdFByZWZzTWFuYWdlciA9IG5ldyBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXNNYW5hZ2VyKHRoaXMuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCh0aGlzLnByb2plY3RQcmVmc01hbmFnZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogdGVzdHMgKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIHRlc3RXb3Jrc3BhY2VMZXZlbFByb2JsZW1NZXRhZGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXNNYW5hZ2VyLnNldFdvcmtzcGFjZUxldmVsUHJvYmxlbVByZWZlcmVuY2UoCi0JCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9OT19QRVJTSVNURU5DRV9VTklULAotCQkJCQkJCQlQRVJTSVNURU5DRV9OT19QRVJTSVNURU5DRV9VTklUX1RFU1RfVkFMVUUpOwotCQlKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXNNYW5hZ2VyLmdldExlZ2FjeVdvcmtzcGFjZVByZWZlcmVuY2VzKCkuZmx1c2goKTsKLQkJCi0JCVN0cmluZyB2YWx1ZSA9IHRoaXMuZ2V0V29ya3NwYWNlUHJlZnMoKS5nZXQoUEVSU0lTVEVOQ0VfTk9fUEVSU0lTVEVOQ0VfVU5JVF9QUkVGX0tFWSk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKHZhbHVlKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoUEVSU0lTVEVOQ0VfTk9fUEVSU0lTVEVOQ0VfVU5JVF9URVNUX1ZBTFVFLmVxdWFscyh2YWx1ZSkpOwotCQkKLQkJSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzTWFuYWdlci5yZW1vdmVMZWdhY3lXb3Jrc3BhY2VQcmVmZXJlbmNlKFBFUlNJU1RFTkNFX05PX1BFUlNJU1RFTkNFX1VOSVRfUFJFRl9LRVkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0SGFzU3BlY2lmaWNPcHRpb25zTWV0YWRhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQl0aGlzLnByb2plY3RQcmVmc01hbmFnZXIuc2V0UHJvamVjdEhhc1NwZWNpZmljT3B0aW9ucyhXT1JLU1BBQ0VfT1ZFUlJJREVOX1RFU1RfVkFMVUUpOwotCQl0aGlzLnByb2plY3RQcmVmc01hbmFnZXIuZ2V0TGVnYWN5UHJvamVjdFByZWZlcmVuY2VzKCkuZmx1c2goKTsKLQotCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSB0aGlzLmdldFByb2plY3RQcmVmcygpLmdldChXT1JLU1BBQ0VfT1ZFUlJJREVOX1BSRUZfS0VZKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoc3RyaW5nVmFsdWUpOwotCQlib29sZWFuIHZhbHVlID0gQm9vbGVhbi52YWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUodmFsdWUgPT0gV09SS1NQQUNFX09WRVJSSURFTl9URVNUX1ZBTFVFKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdExldmVsUHJvYmxlbU1ldGFkYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJdGhpcy5wcm9qZWN0UHJlZnNNYW5hZ2VyLnNldFByb2plY3RMZXZlbFByb2JsZW1QcmVmZXJlbmNlKAotCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfTk9fUEVSU0lTVEVOQ0VfVU5JVCwKLQkJCQkJCQkJUEVSU0lTVEVOQ0VfTk9fUEVSU0lTVEVOQ0VfVU5JVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wcm9qZWN0UHJlZnNNYW5hZ2VyLmdldExlZ2FjeVByb2plY3RQcmVmZXJlbmNlcygpLmZsdXNoKCk7Ci0KLQkJU3RyaW5nIHZhbHVlID0gdGhpcy5nZXRQcm9qZWN0UHJlZnMoKS5nZXQoUEVSU0lTVEVOQ0VfTk9fUEVSU0lTVEVOQ0VfVU5JVF9QUkVGX0tFWSk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKHZhbHVlKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoUEVSU0lTVEVOQ0VfTk9fUEVSU0lTVEVOQ0VfVU5JVF9URVNUX1ZBTFVFLmVxdWFscyh2YWx1ZSkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvbWV0YWRhdGEvSnB0SnBhQ29yZU1ldGFkYXRhVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9tZXRhZGF0YS9KcHRKcGFDb3JlTWV0YWRhdGFUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWJhNjQ0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9tZXRhZGF0YS9KcHRKcGFDb3JlTWV0YWRhdGFUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5tZXRhZGF0YTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogIEpwdEpwYUNvcmVNZXRhZGF0YVRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRKcGFDb3JlTWV0YWRhdGFUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0SnBhQ29yZU1ldGFkYXRhVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKcGFFbnRpdHlHZW5NZXRhZGF0YVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpwYUpwcWxNZXRhZGF0YVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpwYVZhbGlkYXRpb25NZXRhZGF0YVRlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0SnBhQ29yZU1ldGFkYXRhVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9KcGFQcm9qZWN0TWFuYWdlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvbW9kZWwvSnBhUHJvamVjdE1hbmFnZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmExNzg4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9KcGFQcm9qZWN0TWFuYWdlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0UGxhdGZvcm1Qcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3RNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKcGFQcm9qZWN0TWFuYWdlclRlc3RzCi0JZXh0ZW5kcyBUZXN0Q2FzZQotewotCS8qKiBjYXJyaWFnZSByZXR1cm4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotCXByaXZhdGUgVGVzdEZhY2V0ZWRQcm9qZWN0IHRlc3RQcm9qZWN0SGFybmVzczsKLQotCi0JcHVibGljIEpwYVByb2plY3RNYW5hZ2VyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJaWYgKHRoaXMuZGVidWcoKSkgewotCQkJdGhpcy5wcmludE5hbWUoKTsKLQkJfQotCQl0aGlzLnRlc3RQcm9qZWN0SGFybmVzcyA9IHRoaXMuYnVpbGRUZXN0UHJvamVjdEhhcm5lc3MoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVidWcoKSB7Ci0JCUJvb2xlYW4gZGVidWcgPSAoQm9vbGVhbikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVTdGF0aWNNZXRob2QodGhpcy5nZXRHZW5lcmljSnBhUHJvamVjdE1hbmFnZXJDbGFzcygpLCAiZGVidWciKTsKLQkJcmV0dXJuIGRlYnVnLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8vIEludGVybmFsSnBhUHJvamVjdE1hbmFnZXIgaXMgcGFja2FnZS1wcml2YXRlCi0JcHJpdmF0ZSBDbGFzczw/PiBnZXRHZW5lcmljSnBhUHJvamVjdE1hbmFnZXJDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdE1hbmFnZXIoKS5nZXRDbGFzcygpOwotCX0KLQotCXByb3RlY3RlZCBKcGFQcm9qZWN0TWFuYWdlciBnZXRKcGFQcm9qZWN0TWFuYWdlcigpIHsKLQkJcmV0dXJuIChKcGFQcm9qZWN0TWFuYWdlcikgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldEFkYXB0ZXIoSnBhUHJvamVjdE1hbmFnZXIuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gdGhpcy5nZXROYW1lKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJdGhpcy5wcmludE5hbWVCb3JkZXIobmFtZSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihuYW1lKTsKLQkJdGhpcy5wcmludE5hbWVCb3JkZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50TmFtZUJvcmRlcihTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gbmFtZS5sZW5ndGgoKTsgaS0tID4gMDsgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCc9Jyk7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy50ZXN0UHJvamVjdEhhcm5lc3MuZ2V0UHJvamVjdCgpLmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJdGhpcy50ZXN0UHJvamVjdEhhcm5lc3MgPSBudWxsOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByaXZhdGUgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0KHRoaXMuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQlwcml2YXRlIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0Xyhwcm9qZWN0KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0XyhJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0UmVmZXJlbmNlKHByb2plY3QpLmdldFZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSBKcGFQcm9qZWN0LlJlZmVyZW5jZSBnZXRKcGFQcm9qZWN0UmVmZXJlbmNlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIChKcGFQcm9qZWN0LlJlZmVyZW5jZSkgcHJvamVjdC5nZXRBZGFwdGVyKEpwYVByb2plY3QuUmVmZXJlbmNlLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLnRlc3RQcm9qZWN0SGFybmVzcy5nZXRQcm9qZWN0KCk7Ci0JfQotCi0JLyoqIAotCSAqIEJ1aWxkcyBhIHByb2plY3Qgd2l0aCB0aGUgamF2YSBhbmQgdXRpbGl0eSBmYWNldHMgaW5zdGFsbGVkLCBhbmQgd2l0aAotCSAqIHByZS1leGlzdGluZyBlbnRpdGllcyBhZGRlZC4KLQkgKi8KLQlwcml2YXRlIFRlc3RGYWNldGVkUHJvamVjdCBidWlsZFRlc3RQcm9qZWN0SGFybmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0SmF2YVByb2plY3QgdGpwID0gVGVzdEphdmFQcm9qZWN0LmJ1aWxkSmF2YVByb2plY3QodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgdHJ1ZSk7Ci0JCXRqcC5jcmVhdGVDb21waWxhdGlvblVuaXQoInRlc3QucGtnIiwgIlRlc3RFbnRpdHkuamF2YSIsICJARW50aXR5IHB1YmxpYyBjbGFzcyBUZXN0RW50aXR5IHt9Iik7Ci0JCXRqcC5jcmVhdGVDb21waWxhdGlvblVuaXQoInRlc3QucGtnIiwgIlRlc3RFbnRpdHkyLmphdmEiLCAiQEVudGl0eSBwdWJsaWMgY2xhc3MgVGVzdEVudGl0eTIge30iKTsKLQkJcmV0dXJuIHRqcDsKLQl9CQotCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKFRlc3RQbGF0Zm9ybVByb2plY3QgcCwgU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIHAuZ2V0UHJvamVjdCgpLmdldEZpbGUobmV3IFBhdGgocGF0aCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKcGFQcm9qZWN0TWFuYWdlcigpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldEpwYVByb2plY3RNYW5hZ2VyKCkpOwotCX0KLQkKLQlwcml2YXRlIElEYXRhTW9kZWwgYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfT1JNX1hNTCwgQm9vbGVhbi5UUlVFKTsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdENsb3NlUmVvcGVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudGVzdFByb2plY3RIYXJuZXNzLmluc3RhbGxGYWNldChKcGFGYWNldC5JRCwgIjEuMCIsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkpOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSB0aGlzLmdldEpwYVByb2plY3QoKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLQotCQl0aGlzLnRlc3RQcm9qZWN0SGFybmVzcy5nZXRQcm9qZWN0KCkuY2xvc2UobnVsbCk7Ci0JCWFzc2VydEZhbHNlKCJQcm9qZWN0IGlzIG5vdCBjbG9zZWQiLCB0aGlzLnRlc3RQcm9qZWN0SGFybmVzcy5nZXRQcm9qZWN0KCkuaXNPcGVuKCkpOwotCQlqcGFQcm9qZWN0ID0gdGhpcy5nZXRKcGFQcm9qZWN0KCk7Ci0JCWFzc2VydE51bGwoIkpwYVByb2plY3QgaXMgbm90IG51bGwiLCBqcGFQcm9qZWN0KTsKLQotCQl0aGlzLnRlc3RQcm9qZWN0SGFybmVzcy5nZXRQcm9qZWN0KCkub3BlbihudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RQcm9qZWN0SGFybmVzcy5nZXRQcm9qZWN0KCkuaXNPcGVuKCkpOwotCQlqcGFQcm9qZWN0ID0gdGhpcy5nZXRKcGFQcm9qZWN0KCk7Ci0JCWFzc2VydE5vdE51bGwoIkpwYVByb2plY3QgaXMgbnVsbCIsIGpwYVByb2plY3QpOwotCQlhc3NlcnRFcXVhbHMoNCwganBhUHJvamVjdC5nZXRKcGFGaWxlc1NpemUoKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0SGFybmVzcywgInNyYy90ZXN0L3BrZy9UZXN0RW50aXR5LmphdmEiKSkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuZ2V0SnBhRmlsZSh0aGlzLmdldEZpbGUodGhpcy50ZXN0UHJvamVjdEhhcm5lc3MsICJzcmMvdGVzdC9wa2cvVGVzdEVudGl0eTIuamF2YSIpKSk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3RIYXJuZXNzLCAic3JjL01FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbCIpKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0SGFybmVzcywgInNyYy9NRVRBLUlORi9vcm0ueG1sIikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdERlbGV0ZVJlaW1wb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudGVzdFByb2plY3RIYXJuZXNzLmluc3RhbGxGYWNldChKcGFGYWNldC5JRCwgIjEuMCIsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkpOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSB0aGlzLmdldEpwYVByb2plY3QoKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuZ2V0SnBhUHJvamVjdE1hbmFnZXIoKS53YWl0VG9HZXRKcGFQcm9qZWN0cygpKSk7Ci0KLQkJdGhpcy50ZXN0UHJvamVjdEhhcm5lc3MuZ2V0UHJvamVjdCgpLmRlbGV0ZShmYWxzZSwgdHJ1ZSwgbnVsbCk7Ci0JCWpwYVByb2plY3QgPSB0aGlzLmdldEpwYVByb2plY3QoKTsKLQkJYXNzZXJ0TnVsbChqcGFQcm9qZWN0KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuZ2V0SnBhUHJvamVjdE1hbmFnZXIoKS53YWl0VG9HZXRKcGFQcm9qZWN0cygpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCkubGVuZ3RoKTsKLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHRoaXMudGVzdFByb2plY3RIYXJuZXNzLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQlwcm9qZWN0LmNyZWF0ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKS5sZW5ndGgpOwotCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0KLQkJYXNzZXJ0VHJ1ZShwcm9qZWN0LmlzT3BlbigpKTsKLQkJYXNzZXJ0VHJ1ZShKcGFGYWNldC5pc0luc3RhbGxlZChwcm9qZWN0KSk7Ci0JCWpwYVByb2plY3QgPSB0aGlzLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0JCWFzc2VydEVxdWFscyg0LCBqcGFQcm9qZWN0LmdldEpwYUZpbGVzU2l6ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3RIYXJuZXNzLCAic3JjL3Rlc3QvcGtnL1Rlc3RFbnRpdHkuamF2YSIpKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0SGFybmVzcywgInNyYy90ZXN0L3BrZy9UZXN0RW50aXR5Mi5qYXZhIikpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3RIYXJuZXNzLCAic3JjL01FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbCIpKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0SGFybmVzcywgInNyYy9NRVRBLUlORi9vcm0ueG1sIikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmFjZXRJbnN0YWxsVW5pbnN0YWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRKcGFQcm9qZWN0KCkpOwotCi0JCXRoaXMudGVzdFByb2plY3RIYXJuZXNzLmluc3RhbGxGYWNldChKcGFGYWNldC5JRCwgIjEuMCIsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5nZXRKcGFQcm9qZWN0TWFuYWdlcigpLndhaXRUb0dldEpwYVByb2plY3RzKCkpKTsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gdGhpcy5nZXRKcGFQcm9qZWN0KCk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0JCWFzc2VydEVxdWFscyg0LCBqcGFQcm9qZWN0LmdldEpwYUZpbGVzU2l6ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3RIYXJuZXNzLCAic3JjL3Rlc3QvcGtnL1Rlc3RFbnRpdHkuamF2YSIpKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0SGFybmVzcywgInNyYy90ZXN0L3BrZy9UZXN0RW50aXR5Mi5qYXZhIikpKTsKLQotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuZ2V0SnBhRmlsZSh0aGlzLmdldEZpbGUodGhpcy50ZXN0UHJvamVjdEhhcm5lc3MsICJzcmMvTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sIikpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3RIYXJuZXNzLCAic3JjL01FVEEtSU5GL29ybS54bWwiKSkpOwotCi0JCXRoaXMudGVzdFByb2plY3RIYXJuZXNzLnVuaW5zdGFsbEZhY2V0KEpwYUZhY2V0LklELCAiMS4wIik7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLmdldEpwYVByb2plY3RNYW5hZ2VyKCkud2FpdFRvR2V0SnBhUHJvamVjdHMoKSkpOwotCQlqcGFQcm9qZWN0ID0gdGhpcy5nZXRKcGFQcm9qZWN0KCk7Ci0JCWFzc2VydE51bGwoanBhUHJvamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVkaXRGYWNldFNldHRpbmdzRmlsZUFkZFRoZW5SZW1vdmVKcGFGYWNldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKHRoaXMuZ2V0SnBhUHJvamVjdCgpKTsKLQotCQkvLyBhZGQgdGhlIEpQQSBmYWNldCBieSBtb2RpZnlpbmcgdGhlIGZhY2V0IHNldHRpbmdzIGZpbGUgZGlyZWN0bHkKLQkJSUZpbGUgZmFjZXRTZXR0aW5nc0ZpbGUgPSB0aGlzLmdldEZpbGUodGhpcy50ZXN0UHJvamVjdEhhcm5lc3MsICIuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUueG1sIik7Ci0JCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZmFjZXRTZXR0aW5nc0ZpbGUuZ2V0Q29udGVudHMoKSk7Ci0JCWludCBmaWxlU2l6ZSA9IGluU3RyZWFtLmF2YWlsYWJsZSgpOwotCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbZmlsZVNpemVdOwotCQlpblN0cmVhbS5yZWFkKGJ1Zik7Ci0JCWluU3RyZWFtLmNsb3NlKCk7Ci0KLQkJU3RyaW5nIG9sZERvY3VtZW50ID0gbmV3IFN0cmluZyhidWYpOwotCQlTdHJpbmcgb2xkU3RyaW5nID0gIjxpbnN0YWxsZWQgZmFjZXQ9XCJqYXZhXCIgdmVyc2lvbj1cIjEuNVwiLz4iOwotCQlTdHJpbmcgbmV3U3RyaW5nID0gb2xkU3RyaW5nICsgQ1IgKyAiICAiICsgIjxpbnN0YWxsZWQgZmFjZXQ9XCJqcHQuanBhXCIgdmVyc2lvbj1cIjEuMFwiLz4iOwotCQlTdHJpbmcgbmV3RG9jdW1lbnQgPSBvbGREb2N1bWVudC5yZXBsYWNlQWxsKG9sZFN0cmluZywgbmV3U3RyaW5nKTsKLQotCQlmYWNldFNldHRpbmdzRmlsZS5zZXRDb250ZW50cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3RG9jdW1lbnQuZ2V0Qnl0ZXMoKSksIGZhbHNlLCBmYWxzZSwgbnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuZ2V0SnBhUHJvamVjdE1hbmFnZXIoKS53YWl0VG9HZXRKcGFQcm9qZWN0cygpKSk7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwotCQkvLyBwZXJzaXN0ZW5jZS54bWwgYW5kIG9ybS54bWwgZG8gbm90IGdldCBjcmVhdGVkIGluIHRoaXMgc2l0dWF0aW9uICg/KQotCQlhc3NlcnRFcXVhbHMoMiwganBhUHJvamVjdC5nZXRKcGFGaWxlc1NpemUoKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0SGFybmVzcywgInNyYy90ZXN0L3BrZy9UZXN0RW50aXR5LmphdmEiKSkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuZ2V0SnBhRmlsZSh0aGlzLmdldEZpbGUodGhpcy50ZXN0UHJvamVjdEhhcm5lc3MsICJzcmMvdGVzdC9wa2cvVGVzdEVudGl0eTIuamF2YSIpKSk7Ci0vLwkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3QsICJzcmMvTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sIikpKTsKLS8vCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuZ2V0SnBhRmlsZSh0aGlzLmdldEZpbGUodGhpcy50ZXN0UHJvamVjdCwgInNyYy9NRVRBLUlORi9vcm0ueG1sIikpKTsKLQotCi0JCS8vIG5vdyByZW1vdmUgdGhlIEpQQSBmYWNldAotCQlmYWNldFNldHRpbmdzRmlsZS5zZXRDb250ZW50cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob2xkRG9jdW1lbnQuZ2V0Qnl0ZXMoKSksIGZhbHNlLCBmYWxzZSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLmdldEpwYVByb2plY3RNYW5hZ2VyKCkud2FpdFRvR2V0SnBhUHJvamVjdHMoKSkpOwotCQlqcGFQcm9qZWN0ID0gdGhpcy5nZXRKcGFQcm9qZWN0KCk7Ci0JCWFzc2VydE51bGwoanBhUHJvamVjdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFZGl0RmFjZXRTZXR0aW5nc0ZpbGVSZW1vdmVUaGVuQWRkSnBhRmFjZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy50ZXN0UHJvamVjdEhhcm5lc3MuaW5zdGFsbEZhY2V0KEpwYUZhY2V0LklELCAiMS4wIiwgYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKSk7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwotCi0JCS8vIHJlbW92ZSB0aGUgSlBBIGZhY2V0IGJ5IG1vZGlmeWluZyB0aGUgZmFjZXQgc2V0dGluZ3MgZmlsZSBkaXJlY3RseQotCQlJRmlsZSBmYWNldFNldHRpbmdzRmlsZSA9IHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0SGFybmVzcywgIi5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS54bWwiKTsKLQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShmYWNldFNldHRpbmdzRmlsZS5nZXRDb250ZW50cygpKTsKLQkJaW50IGZpbGVTaXplID0gaW5TdHJlYW0uYXZhaWxhYmxlKCk7Ci0JCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtmaWxlU2l6ZV07Ci0JCWluU3RyZWFtLnJlYWQoYnVmKTsKLQkJaW5TdHJlYW0uY2xvc2UoKTsKLQotCQlTdHJpbmcgb2xkRG9jdW1lbnQgPSBuZXcgU3RyaW5nKGJ1Zik7Ci0JCVN0cmluZyBvbGRTdHJpbmcgPSAiPGluc3RhbGxlZCBmYWNldD1cImphdmFcIiB2ZXJzaW9uPVwiMS41XCIvPiIgKyBDUiArICIgICIgKyAiPGluc3RhbGxlZCBmYWNldD1cImpwdC5qcGFcIiB2ZXJzaW9uPVwiMS4wXCIvPiI7Ci0JCVN0cmluZyBuZXdTdHJpbmcgPSAiPGluc3RhbGxlZCBmYWNldD1cImphdmFcIiB2ZXJzaW9uPVwiMS41XCIvPiI7Ci0JCVN0cmluZyBuZXdEb2N1bWVudCA9IG9sZERvY3VtZW50LnJlcGxhY2VBbGwob2xkU3RyaW5nLCBuZXdTdHJpbmcpOwotCi0JCWZhY2V0U2V0dGluZ3NGaWxlLnNldENvbnRlbnRzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXdEb2N1bWVudC5nZXRCeXRlcygpKSwgZmFsc2UsIGZhbHNlLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuZ2V0SnBhUHJvamVjdE1hbmFnZXIoKS53YWl0VG9HZXRKcGFQcm9qZWN0cygpKSk7Ci0JCWpwYVByb2plY3QgPSB0aGlzLmdldEpwYVByb2plY3QoKTsKLQkJYXNzZXJ0TnVsbChqcGFQcm9qZWN0KTsKLQotCQkvLyBub3cgYWRkIHRoZSBKUEEgZmFjZXQgYmFjawotCQlmYWNldFNldHRpbmdzRmlsZS5zZXRDb250ZW50cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob2xkRG9jdW1lbnQuZ2V0Qnl0ZXMoKSksIGZhbHNlLCBmYWxzZSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLmdldEpwYVByb2plY3RNYW5hZ2VyKCkud2FpdFRvR2V0SnBhUHJvamVjdHMoKSkpOwotCQlqcGFQcm9qZWN0ID0gdGhpcy5nZXRKcGFQcm9qZWN0KCk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0JCWFzc2VydEVxdWFscyg0LCBqcGFQcm9qZWN0LmdldEpwYUZpbGVzU2l6ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3RIYXJuZXNzLCAic3JjL3Rlc3QvcGtnL1Rlc3RFbnRpdHkuamF2YSIpKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0SGFybmVzcywgInNyYy90ZXN0L3BrZy9UZXN0RW50aXR5Mi5qYXZhIikpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3RIYXJuZXNzLCAic3JjL01FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbCIpKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0SGFybmVzcywgInNyYy9NRVRBLUlORi9vcm0ueG1sIikpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvbW9kZWwvSnB0SnBhQ29yZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9KcHRKcGFDb3JlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDZkZTI5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9KcHRKcGFDb3JlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSnB0SnBhQ29yZU1vZGVsVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEpwYUNvcmVNb2RlbFRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSnBhUHJvamVjdE1hbmFnZXJUZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEpwYUNvcmVNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9CYXNlSnBhUGxhdGZvcm1UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0Jhc2VKcGFQbGF0Zm9ybVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMmMzNTguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0Jhc2VKcGFQbGF0Zm9ybVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpwYVByb2plY3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEJhc2VKcGFQbGF0Zm9ybVRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgVGVzdEpwYVByb2plY3QganBhUHJvamVjdDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJQbGF0Zm9ybVRlc3RQcm9qZWN0IjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAicGxhdGZvcm0udGVzdCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfWE1MX0xPQ0FUSU9OID0gInNyYy9NRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9STV9YTUxfTE9DQVRJT04gPSAic3JjL01FVEEtSU5GL29ybS54bWwiOwotCQotCQotCXB1YmxpYyBCYXNlSnBhUGxhdGZvcm1UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmpwYVByb2plY3QgPSB0aGlzLmJ1aWxkSnBhUHJvamVjdChQUk9KRUNUX05BTUUsIGZhbHNlKTsgIC8vIGZhbHNlID0gbm8gYXV0by1idWlsZAotCX0KLQotCXByb3RlY3RlZCBUZXN0SnBhUHJvamVjdCBidWlsZEpwYVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgVGVzdEpwYVByb2plY3QocHJvamVjdE5hbWUsIGF1dG9CdWlsZCk7ICAvLyBmYWxzZSA9IG5vIGF1dG8tYnVpbGQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0gbnVsbDsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0UGVyc2lzdGVudFR5cGVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLS8vCQlJRmlsZSBwZXJzaXN0ZW5jZVhtbElGaWxlID0ganBhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RmlsZShQRVJTSVNURU5DRV9YTUxfTE9DQVRJT04pOwotLy8JCUlKcGFGaWxlIHBlcnNpc3RlbmNlWG1sSnBhRmlsZSA9IGpwYVByb2plY3QuZ2V0SnBhUHJvamVjdCgpLmdldEpwYUZpbGUocGVyc2lzdGVuY2VYbWxJRmlsZSk7Ci0vLwkJUGVyc2lzdGVuY2VYbWxSb290Q29udGVudE5vZGUgcGVyc2lzdGVuY2VSb290ID0gKFBlcnNpc3RlbmNlWG1sUm9vdENvbnRlbnROb2RlKSBwZXJzaXN0ZW5jZVhtbEpwYUZpbGUuZ2V0Q29udGVudCgpOwotLy8JCVhtbFBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2VSb290LmdldFBlcnNpc3RlbmNlKCk7Ci0vLwkJCi0vLwkJSUZpbGUgb3JtWG1sSUZpbGUgPSBqcGFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGaWxlKE9STV9YTUxfTE9DQVRJT04pOwotLy8JCUlKcGFGaWxlIG9ybVhtbEpwYUZpbGUgPSBqcGFQcm9qZWN0LmdldEpwYVByb2plY3QoKS5nZXRKcGFGaWxlKG9ybVhtbElGaWxlKTsKLS8vCQlYbWxSb290Q29udGVudE5vZGUgb3JtUm9vdCA9IChYbWxSb290Q29udGVudE5vZGUpIG9ybVhtbEpwYUZpbGUuZ2V0Q29udGVudCgpOwotLy8JCUVudGl0eU1hcHBpbmdzSW50ZXJuYWwgZW50aXR5TWFwcGluZ3MgPSBvcm1Sb290LmdldEVudGl0eU1hcHBpbmdzKCk7Ci0vLwkJCi0vLwkJLy8gYWRkIHhtbCBwZXJzaXN0ZW50IHR5cGUKLS8vCQlYbWxFbnRpdHlJbnRlcm5hbCB4bWxFbnRpdHkgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbnRpdHlJbnRlcm5hbCgpOwotLy8JCXhtbEVudGl0eS5zZXRTcGVjaWZpZWROYW1lKCJYbWxFbnRpdHkiKTsKLS8vCQllbnRpdHlNYXBwaW5ncy5nZXRUeXBlTWFwcGluZ3MoKS5hZGQoeG1sRW50aXR5KTsKLS8vCQllbnRpdHlNYXBwaW5ncy5lUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotLy8JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqcGFQcm9qZWN0LmdldEpwYVByb2plY3QoKS5nZXRQbGF0Zm9ybSgpLnBlcnNpc3RlbnRUeXBlcyhQUk9KRUNUX05BTUUpKSk7Ci0vLwkJCi0vLwkJLy8gYWRkIGphdmEgcGVyc2lzdGVudCB0eXBlCi0vLwkJanBhUHJvamVjdC5jcmVhdGVUeXBlKFBBQ0tBR0VfTkFNRSwgIkphdmFFbnRpdHkuamF2YSIsIAotLy8JCQkJIkBFbnRpdHkgcHVibGljIGNsYXNzIEphdmFFbnRpdHkge30iCi0vLwkJCSk7Ci0vLwkJWG1sSmF2YUNsYXNzUmVmIGphdmFDbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YUNsYXNzUmVmKCk7Ci0vLwkJamF2YUNsYXNzUmVmLnNldEphdmFDbGFzcyhQQUNLQUdFX05BTUUgKyAiLkphdmFFbnRpdHkiKTsKLS8vCQlwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuZ2V0KDApLmdldENsYXNzZXMoKS5hZGQoamF2YUNsYXNzUmVmKTsKLS8vCQlwZXJzaXN0ZW5jZS5lUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqcGFQcm9qZWN0LmdldEpwYVByb2plY3QoKS5nZXRQbGF0Zm9ybSgpLnBlcnNpc3RlbnRUeXBlcyhQUk9KRUNUX05BTUUpKSk7Ci0vLwl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1FeHRlbnNpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtRXh0ZW5zaW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM4N2M0Ni4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1FeHRlbnNpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5FeHRlbnNpb25UZXN0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQWN0aW9uQ29uZmlnRmFjdG9yeTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSnBhUGxhdGZvcm1FeHRlbnNpb25UZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTEFURk9STV9JRCA9IFRlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyLklEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBURVNUX1BMQVRGT1JNX0RFU0MgPSAKLQkJCUpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SnBhUGxhdGZvcm0oVEVTVF9QTEFURk9STV9JRCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTEFURk9STV9MQUJFTCA9ICJUZXN0IEpwYSBQbGF0Zm9ybSI7Ci0JCi0JcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0IHRlc3RQcm9qZWN0OwotCi0JcHVibGljIEpwYVBsYXRmb3JtRXh0ZW5zaW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdmVyaWZ5RXh0ZW5zaW9uVGVzdFByb2plY3RFeGlzdHMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRlc3RKYXZhUHJvamVjdCBidWlsZEphdmFQcm9qZWN0KGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN1cGVyLmJ1aWxkSnBhUHJvamVjdChQUk9KRUNUX05BTUUsIGF1dG9CdWlsZCwgdGhpcy5idWlsZENvbmZpZygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZENvbmZpZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQWN0aW9uQ29uZmlnRmFjdG9yeSBjb25maWdGYWN0b3J5ID0gbmV3IEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyKCk7Ci0JCUlEYXRhTW9kZWwgY29uZmlnID0gKElEYXRhTW9kZWwpIGNvbmZpZ0ZhY3RvcnkuY3JlYXRlKCk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSLCBKcGFGYWNldC5WRVJTSU9OXzFfMC5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlBMQVRGT1JNLCBURVNUX1BMQVRGT1JNX0RFU0MpOwotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlFeHRlbnNpb25UZXN0UHJvamVjdEV4aXN0cygpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gCi0JCQlyZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChKcHRKcGFDb3JlUGx1Z2luLlBMVUdJTl9JRCwgImpwYVBsYXRmb3JtIik7Ci0JCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQlib29sZWFuIGV4dGVuc2lvbkZvdW5kID0gZmFsc2U7Ci0JCWZvciAoSUV4dGVuc2lvbiBleHRlbnNpb24gOiBleHRlbnNpb25zKSB7Ci0JCQlpZiAoZXh0ZW5zaW9uLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpLmVxdWFscyhFeHRlbnNpb25UZXN0UGx1Z2luLlBMVUdJTl9JRCkpIHsKLQkJCQlleHRlbnNpb25Gb3VuZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFleHRlbnNpb25Gb3VuZCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk1pc3NpbmcgRXh0ZW5zaW9uICIgKyBURVNUX1BMQVRGT1JNX0lEICsgIi4gVGhlIEV4dGVuc2lvblRlc3RQcm9qZWN0IHBsdWdpbiBtdXN0IGJlIGluIHlvdXIgdGVzdGluZyB3b3Jrc3BhY2UuIik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbEpwYVBsYXRmb3JtSWRzKCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5zaXplKEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SnBhUGxhdGZvcm1zKCkpID49IDIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SnBhUGxhdGZvcm1MYWJlbCgpIHsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfUExBVEZPUk1fTEFCRUwsIEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SnBhUGxhdGZvcm0oVEVTVF9QTEFURk9STV9JRCkuZ2V0TGFiZWwoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SnBhUGxhdGZvcm0oKSB7Ci0JCWFzc2VydE5vdE51bGwoSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybU1hbmFnZXIoKS5idWlsZEpwYVBsYXRmb3JtSW1wbGVtZW50YXRpb24odGhpcy50ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpKTsJCQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzY2Y2MxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuRXh0ZW5zaW9uVGVzdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLkphdmFUZXN0QXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLkphdmFUZXN0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5KYXZhVGVzdFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuSmF2YVRlc3RUeXBlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5UZXN0SmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLlRlc3RKYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuVGVzdEpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5UZXN0SnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25Db25maWdGYWN0b3J5OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKcGFQbGF0Zm9ybVRlc3RzCi0JZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByb3RlY3RlZCBUZXN0SnBhUHJvamVjdCB0ZXN0UHJvamVjdDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMVUdJTl9DTEFTUyA9IEV4dGVuc2lvblRlc3RQbHVnaW4uY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTEFURk9STV9DTEFTU19OQU1FID0gVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIuY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExBVEZPUk1fTEFCRUwgPSAiVGVzdCBKcGEgUGxhdGZvcm0iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfSlBBX0ZBQ1RPUlkgPSBUZXN0SnBhRmFjdG9yeS5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9UWVBFX01BUFBJTkdfUFJPVklERVJfQ0xBU1MgPSBKYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbi5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BVFRSSUJVVEVfTUFQUElOR19QUk9WSURFUl9DTEFTUyA9IEphdmFUZXN0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uY2xhc3MuZ2V0TmFtZSgpOwotCQotCXB1YmxpYyBKcGFQbGF0Zm9ybVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCUpwYVBsYXRmb3JtRXh0ZW5zaW9uVGVzdHMudmVyaWZ5RXh0ZW5zaW9uVGVzdFByb2plY3RFeGlzdHMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGVzdEphdmFQcm9qZWN0IGJ1aWxkSmF2YVByb2plY3QoYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXIuYnVpbGRKcGFQcm9qZWN0KFBST0pFQ1RfTkFNRSwgYXV0b0J1aWxkLCB0aGlzLmJ1aWxkQ29uZmlnKCkpOwotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkQ29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlBY3Rpb25Db25maWdGYWN0b3J5IGNvbmZpZ0ZhY3RvcnkgPSBuZXcgSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIoKTsKLQkJSURhdGFNb2RlbCBjb25maWcgPSAoSURhdGFNb2RlbCkgY29uZmlnRmFjdG9yeS5jcmVhdGUoKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTl9TVFIsIEpwYUZhY2V0LlZFUlNJT05fMV8wLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eSgKLQkJCQkJSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlBMQVRGT1JNLCAKLQkJCQkJSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKcGFQbGF0Zm9ybShUZXN0SnBhUGxhdGZvcm1Qcm92aWRlci5JRCkpOwotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtIGpwYVBsYXRmb3JtKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SnBhRmFjdG9yeSgpIHsKLQkJYXNzZXJ0VHJ1ZShqcGFQbGF0Zm9ybSgpLmdldEpwYUZhY3RvcnkoKS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoVEVTVF9KUEFfRkFDVE9SWSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QnVpbGRKYXZhVHlwZU1hcHBpbmdGcm9tTWFwcGluZ0tleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJdGhpcy5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KEphdmFUZXN0VHlwZU1hcHBpbmcuVEVTVF9UWVBFX01BUFBJTkdfS0VZKTsKLQkJSmF2YVR5cGVNYXBwaW5nIG1hcHBpbmcgPSB0aGlzLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwaW5nIGluc3RhbmNlb2YgSmF2YVRlc3RUeXBlTWFwcGluZyk7Ci0JCQotCQl0aGlzLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOwotCQltYXBwaW5nID0gdGhpcy5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUobWFwcGluZyBpbnN0YW5jZW9mIFRlc3RKYXZhRW50aXR5KTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCdWlsZEphdmFBdHRyaWJ1dGVNYXBwaW5nRnJvbU1hcHBpbmdLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFBdHRyaWJ1dGUgPSB0aGlzLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIik7Ci0JCWphdmFBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcuVEVTVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlKYXZhQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gamF2YUF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUobWFwcGluZyBpbnN0YW5jZW9mIEphdmFUZXN0QXR0cmlidXRlTWFwcGluZyk7Ci0JCQotCQlqYXZhQXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJbWFwcGluZyA9IGphdmFBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRUcnVlKG1hcHBpbmcgaW5zdGFuY2VvZiBUZXN0SmF2YUJhc2ljTWFwcGluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RKcGFQcm9qZWN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEpwYVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVhMzljYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEpwYVByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGJ1aWxkcyBhbmQgaG9sZHMgYSAiSlBBIiBwcm9qZWN0LgotICogU3VwcG9ydCBmb3IgYWRkaW5nIHBhY2thZ2VzIGFuZCB0eXBlcy4KLSAqIAotICogVGhlIEpQQSBwcm9qZWN0J3Mgc2V0dGluZ3MgKHBsYXRmb3JtLCBkYXRhYmFzZSBjb25uZWN0aW9uLCBldGMuKSBjYW4gYmUKLSAqIGNvbnRyb2xsZWQgYnkgYnVpbGRpbmcgYSBkYXRhIG1vZGVsIGFuZCBwYXNzaW5nIGl0IGludG8gdGhlIGNvbnN0cnVjdG9yLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUZXN0SnBhUHJvamVjdAotCWV4dGVuZHMgVGVzdEphdmFQcm9qZWN0Ci17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWSA9ICJvcmcuZWNsaXBzZS5qcHQuanBhLmphciI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZID0gIm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5qYXIiOwotCi0KLQkvLyAqKioqKioqKioqIGJ1aWxkZXJzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVGVzdEpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KFN0cmluZyBiYXNlUHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkLCBJRGF0YU1vZGVsIGpwYUNvbmZpZykKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBUZXN0SnBhUHJvamVjdChiYXNlUHJvamVjdE5hbWUsIGF1dG9CdWlsZCwganBhQ29uZmlnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3RKcGFQcm9qZWN0IGJ1aWxkSnBhUHJvamVjdChTdHJpbmcgYmFzZVByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGJ1aWxkSnBhUHJvamVjdChiYXNlUHJvamVjdE5hbWUsIGF1dG9CdWlsZCwgbnVsbCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRlc3RKcGFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzKHByb2plY3ROYW1lLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIFRlc3RKcGFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhpcyhwcm9qZWN0TmFtZSwgYXV0b0J1aWxkLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgVGVzdEpwYVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCwgSURhdGFNb2RlbCBqcGFDb25maWcpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIocHJvamVjdE5hbWUsIGF1dG9CdWlsZCk7Ci0JCVN0cmluZyBqcGFGYWNldFZlcnNpb24gPSBKcGFGYWNldC5WRVJTSU9OXzFfMC5nZXRWZXJzaW9uU3RyaW5nKCk7Ci0JCWlmIChqcGFDb25maWcgIT0gbnVsbCkgewotCQkJanBhRmFjZXRWZXJzaW9uID0ganBhQ29uZmlnLmdldFN0cmluZ1Byb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTl9TVFIpOwotCQl9Ci0JCXRoaXMuaW5zdGFsbEZhY2V0KCJqc3QudXRpbGl0eSIsICIxLjAiKTsKLQkJdGhpcy5pbnN0YWxsRmFjZXQoSnBhRmFjZXQuSUQsIGpwYUZhY2V0VmVyc2lvbiwganBhQ29uZmlnKTsKLQkJdGhpcy5hZGRKYXIoanBhSmFyTmFtZSgpKTsKLQkJaWYgKGVjbGlwc2VMaW5rSmFyTmFtZSgpICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkSmFyKGVjbGlwc2VMaW5rSmFyTmFtZSgpKTsKLQkJfQotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKHRydWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpwYUphck5hbWUoKSB7Ci0JCXJldHVybiBnZXRTeXN0ZW1Qcm9wZXJ0eShKUEFfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlY2xpcHNlTGlua0phck5hbWUoKSB7Ci0JCXJldHVybiBnZXRTeXN0ZW1Qcm9wZXJ0eShFQ0xJUFNFTElOS19KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTeXN0ZW1Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmdldEpwYVByb2plY3RfKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdF8oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0UmVmZXJlbmNlKCkuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIEpwYVByb2plY3QuUmVmZXJlbmNlIGdldEpwYVByb2plY3RSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoSnBhUHJvamVjdC5SZWZlcmVuY2UpIHRoaXMuZ2V0UHJvamVjdCgpLmdldEFkYXB0ZXIoSnBhUHJvamVjdC5SZWZlcmVuY2UuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9KcHRKcGFDb3JlUmVzb3VyY2VNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvSnB0SnBhQ29yZVJlc291cmNlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTY5MjVkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9KcHRKcGFDb3JlUmVzb3VyY2VNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5KcHRKcGFDb3JlVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2UyXzBUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5KcHRKYXZhUmVzb3VyY2VUZXN0czsKLQotLyoqCi0gKiBSZXF1aXJlZCBKYXZhIHN5c3RlbSBwcm9wZXJ0eToKLSAqICAgLURvcmcuZWNsaXBzZS5qcHQuanBhLmphcj08anBhLmphciBwYXRoPgotICovCi1wdWJsaWMgY2xhc3MgSnB0SnBhQ29yZVJlc291cmNlTW9kZWxUZXN0cwotCWV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0SnBhQ29yZVJlc291cmNlTW9kZWxUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlpZiAoSnB0SnBhQ29yZVRlc3RzLnJlcXVpcmVkSmFyc0V4aXN0cygpKSB7Ci0JCQlzdWl0ZS5hZGRUZXN0KEpwdEphdmFSZXNvdXJjZVRlc3RzLnN1aXRlKCkpOwotCQkJc3VpdGUuYWRkVGVzdChKYXZhUmVzb3VyY2UyXzBUZXN0cy5zdWl0ZSgpKTsKLQkJfSBlbHNlIHsKLQkJCXN1aXRlLmFkZFRlc3QoVGVzdFN1aXRlLndhcm5pbmcoSnB0SnBhQ29yZVRlc3RzLmJ1aWxkTWlzc2luZ0phckVycm9yTWVzc2FnZSgpKSk7Ci0JCX0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0SnBhQ29yZVJlc291cmNlTW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI4ODMxYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBBc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSA9ICJNWV9BU1NPQ0lBVElPTl9PVkVSUklERSI7Ci0JCi0JcHVibGljIEFzc29jaWF0aW9uT3ZlcnJpZGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBKb2luQ29sdW1ufSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkF0KEphdmFSZXNvdXJjZU1lbWJlciByZXNvdXJjZU1lbWJlciwgaW50IGluZGV4KSB7Ci0JCXJldHVybiAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlTWVtYmVyLmdldEFubm90YXRpb24oaW5kZXgsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJYXNzZXJ0RXF1YWxzKEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQlhc3NlcnROb3ROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQlhc3NlcnRFcXVhbHMoQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiRm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIpIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUiLCBjdSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5zMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygyLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5zMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJSXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGpvaW5Db2x1bW5zID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUucmVtb3ZlSm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtbnMgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnJlbW92ZUpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW5zID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKSIsIGN1KTsKLQotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKG51bGwpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnJlbW92ZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pbkNvbHVtbiIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgwKTsKLQkJam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGX05BTUUiKTsKLQkJam9pbkNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqb2luQ29sdW1uLnNldFRhYmxlKCJUQUJMRSIpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZS5tb3ZlSm9pbkNvbHVtbigyLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSm9pbkNvbHVtbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQkJCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgwKTsKLQkJam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGX05BTUUiKTsKLQkJam9pbkNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqb2luQ29sdW1uLnNldFRhYmxlKCJUQUJMRSIpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZS5tb3ZlSm9pbkNvbHVtbigwLCAyKTsKLQkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRKb2luQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJmb29cIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZXNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZXNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDQzNGFiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZXNUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FID0gIk1ZX0FTU09DSUFUSU9OX09WRVJSSURFIjsKLQkKLQlwdWJsaWMgQXNzb2NpYXRpb25PdmVycmlkZXNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUywgSlBBLkpPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW59KSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIsIGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiQkFaXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGdldEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQXQoSmF2YVJlc291cmNlTWVtYmVyIHJlc291cmNlTWVtYmVyLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VNZW1iZXIuZ2V0QW5ub3RhdGlvbihpbmRleCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQlhc3NlcnROb3ROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQlhc3NlcnRFcXVhbHMoQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCi0JCWFzc2VydE5vdE51bGwoYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCWFzc2VydEVxdWFscyhBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiRm9vXCIpKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCQlhc3NlcnRFcXVhbHMoQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIikiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEFzc29jaWF0aW9uT3ZlcnJpZGVDb3B5RXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJAQXNzb2NpYXRpb25PdmVycmlkZXMoeyI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIsIGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiQkFaXCIpKSwiOwotCQlTdHJpbmcgZXhwZWN0ZWQzID0gIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKSB9KSI7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQXNzb2NpYXRpb25PdmVycmlkZVRvQmVnaW5uaW5nT2ZMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyh7IjsKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJGT09cIiwgam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJCQVpcIikpLCI7Ci0JCVN0cmluZyBleHBlY3RlZDMgPSAiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiQkFSXCIpIH0pIjsKLQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCQkKLQkJZXhwZWN0ZWQyID0gIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkJBWlwiKSwiOwotCQlleHBlY3RlZDMgPSAiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIsIGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiQkFaXCIpKSwgQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiQkFSXCIpIH0pIjsKLQkJYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFzc29jaWF0aW9uT3ZlcnJpZGVDb3B5RXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJAQXNzb2NpYXRpb25PdmVycmlkZXMoeyI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIsIGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiQkFaXCIpKSwiOwotCQlTdHJpbmcgZXhwZWN0ZWQzID0gIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKSB9KSI7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCQkKLQkJZXhwZWN0ZWQyID0gIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiLCBqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIkJBWlwiKSkiOwotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5zMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5zMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkJBUiIpOwotCi0KLQkJSXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGpvaW5Db2x1bW5zID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSxASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJSXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGpvaW5Db2x1bW5zID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5yZW1vdmVKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1ucyA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1ucyA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4pKSIsIGN1KTsKLQotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKG51bGwpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnJlbW92ZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pbkNvbHVtbiIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCk7Ci0JCWpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRl9OQU1FIik7Ci0JCWpvaW5Db2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJam9pbkNvbHVtbi5zZXRUYWJsZSgiVEFCTEUiKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLm1vdmVKb2luQ29sdW1uKDIsIDApOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDApOwotCQlqb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZfTkFNRSIpOwotCQlqb2luQ29sdW1uLnNldFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWpvaW5Db2x1bW4uc2V0VGFibGUoIlRBQkxFIik7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLm1vdmVKb2luQ29sdW1uKDAsIDIpOwotCQlhc3NlcnROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpfSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Sm9pbkNvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygyLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJmb29cIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0F0dHJpYnV0ZU92ZXJyaWRlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0F0dHJpYnV0ZU92ZXJyaWRlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVjMGNmMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlT3ZlcnJpZGVUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fTkFNRSA9ICJNWV9DT0xVTU4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSA9ICJNWV9BVFRSSUJVVEVfT1ZFUlJJREUiOwotCQotCXB1YmxpYyBBdHRyaWJ1dGVPdmVycmlkZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGVPbkZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFUVFJJQlVURV9PVkVSUklERV9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZVdpdGhDb2x1bW5PbkZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFUVFJJQlVURV9PVkVSUklERV9OQU1FICsgIlwiLCBjb2x1bW4gPSBAQ29sdW1uKG5hbWUgPSBcIiIgKyBDT0xVTU5fTkFNRSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGdldEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkF0KEphdmFSZXNvdXJjZU1lbWJlciByZXNvdXJjZU1lbWJlciwgaW50IGluZGV4KSB7Ci0JCXJldHVybiAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZU1lbWJlci5nZXRBbm5vdGF0aW9uKGluZGV4LCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSB0aGlzLmdldEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCi0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlT3ZlcnJpZGUpOwotCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX05BTUUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGxDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSB0aGlzLmdldEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gdGhpcy5nZXRBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9OQU1FLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiRm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSB0aGlzLmdldEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCi0JCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIikiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb2x1bW5HZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZVdpdGhDb2x1bW5PbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IHRoaXMuZ2V0QXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb2x1bW5TZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZVdpdGhDb2x1bW5PbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IHRoaXMuZ2V0QXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQljb2x1bW4uc2V0TmFtZSgiRm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIiwgY29sdW1uID0gQENvbHVtbihuYW1lID0gXCJGb29cIikpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUucmVtb3ZlQ29sdW1uKCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSB0aGlzLmdldEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotCQlhc3NlcnROdWxsKGNvbHVtbik7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZS5hZGRDb2x1bW4oKTsKLQkJY29sdW1uID0gYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIsIGNvbHVtbiA9IEBDb2x1bW4pIiwgY3UpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSB0aGlzLmdldEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotCQlhc3NlcnROdWxsKGNvbHVtbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZXNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzMTI3Ni4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZXNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZU92ZXJyaWRlc1Rlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OQU1FID0gIk1ZX0NPTFVNTiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9OQU1FID0gIk1ZX0FUVFJJQlVURV9PVkVSUklERSI7Ci0JCi0JcHVibGljIEF0dHJpYnV0ZU92ZXJyaWRlc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGVPbkZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUywgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEF0dHJpYnV0ZU92ZXJyaWRlcyhAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFUVFJJQlVURV9PVkVSUklERV9OQU1FICsgIlwiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGVXaXRoQ29sdW1uT25GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBdHRyaWJ1dGVPdmVycmlkZXMoQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIiwgY29sdW1uID0gQENvbHVtbihuYW1lID0gXCIiICsgQ09MVU1OX05BTUUgKyAiXCIpKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiLCBjb2x1bW4gPSBAQ29sdW1uKG5hbWUgPSBcIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJCQVJcIiwgdGFibGUgPSBcIkJBWlwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMSwgcHJlY2lzaW9uID0gMSwgc2NhbGUgPSAxKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gZ2V0QXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uQXQoSmF2YVJlc291cmNlTWVtYmVyIHJlc291cmNlTWVtYmVyLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlTWVtYmVyLmdldEFubm90YXRpb24oaW5kZXgsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gdGhpcy5nZXRBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9OQU1FLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gdGhpcy5nZXRBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gdGhpcy5nZXRBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9OQU1FLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGb29cIikpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSB0aGlzLmdldEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCi0JCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIikiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uR2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGVXaXRoQ29sdW1uT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSB0aGlzLmdldEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCi0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb2x1bW5TZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZVdpdGhDb2x1bW5PbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IHRoaXMuZ2V0QXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0KLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJCi0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQljb2x1bW4uc2V0TmFtZSgiRm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyhAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFUVFJJQlVURV9PVkVSUklERV9OQU1FICsgIlwiLCBjb2x1bW4gPSBAQ29sdW1uKG5hbWUgPSBcIkZvb1wiKSkpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUucmVtb3ZlQ29sdW1uKCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBdHRyaWJ1dGVPdmVycmlkZUNvcHlFeGlzdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBBdHRyaWJ1dGVPdmVycmlkZXMoeyI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiLCBjb2x1bW4gPSBAQ29sdW1uKG5hbWUgPSBcIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJCQVJcIiwgdGFibGUgPSBcIkJBWlwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMSwgcHJlY2lzaW9uID0gMSwgc2NhbGUgPSAxKSksIjsKLQkJU3RyaW5nIGV4cGVjdGVkMyA9ICJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiQkFSXCIpIH0pIjsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERVMpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEF0dHJpYnV0ZU92ZXJyaWRlVG9CZWdpbm5pbmdPZkxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJAQXR0cmlidXRlT3ZlcnJpZGVzKHsiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIiwgY29sdW1uID0gQENvbHVtbihuYW1lID0gXCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHRhYmxlID0gXCJCQVpcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEsIHByZWNpc2lvbiA9IDEsIHNjYWxlID0gMSkpLCI7Ci0JCVN0cmluZyBleHBlY3RlZDMgPSAiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKSB9KSI7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQkJCi0JCWV4cGVjdGVkMiA9ICJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiQkFaXCIpLCI7Ci0JCWV4cGVjdGVkMyA9ICJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIsIGNvbHVtbiA9IEBDb2x1bW4obmFtZSA9IFwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCB0YWJsZSA9IFwiQkFaXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxLCBwcmVjaXNpb24gPSAxLCBzY2FsZSA9IDEpKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKSB9KSI7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERVMpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKSk7Ci0JCWFzc2VydEVxdWFscygzLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQXR0cmlidXRlT3ZlcnJpZGVDb3B5RXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJAQXR0cmlidXRlT3ZlcnJpZGVzKHsiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIiwgY29sdW1uID0gQENvbHVtbihuYW1lID0gXCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHRhYmxlID0gXCJCQVpcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEsIHByZWNpc2lvbiA9IDEsIHNjYWxlID0gMSkpLCI7Ci0JCVN0cmluZyBleHBlY3RlZDMgPSAiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKSB9KSI7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQkJCi0JCWV4cGVjdGVkMSA9ICJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIsIGNvbHVtbiA9IEBDb2x1bW4obmFtZSA9IFwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCB0YWJsZSA9IFwiQkFaXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxLCBwcmVjaXNpb24gPSAxLCBzY2FsZSA9IDEpKSI7Ci0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBBdHRyaWJ1dGVPdmVycmlkZXMiLCBjdSk7Ci0JfQotCS8vbm90IHN1cmUgaSB3YW50IHRvIHRlc3QgdGhpcyBhcGksIGhvdyBjYW4gd2Uga2VlcCBDb250YWluZXJBbm5vdGF0aW9uLmFkZCwgbW92ZSwgcmVtb3ZlIGZyb20gYmVpbmcgcHVibGljPwotCS8vdXNlcnMgc2hvdWxkIGdvIHRocm91Z2h0IEFic3RyYWN0SmF2YXBlcnNpc3RlbmNlUmVzb3VyY2UuIHRoaXMgZ2V0cyBjb25mdXNpbmcgYmVjYXVzZSB5b3Ugd291bGQgaGFuZGxlIGl0IGRpZmZlcmVudGx5Ci0JLy9mb3Igbm9uIHRvcC1sZXZlbCBhbm5vdGF0aW9ucwotLy8JcHVibGljIHZvaWQgdGVzdEFkZCgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0vLwkJSmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0vLwkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVSZXNvdXJjZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0vLwkJQXR0cmlidXRlT3ZlcnJpZGVzIGF0dHJpYnV0ZU92ZXJyaWRlcyA9IChBdHRyaWJ1dGVPdmVycmlkZXMpIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotLy8JCWFzc2VydE51bGwoYXR0cmlidXRlT3ZlcnJpZGVzKTsKLS8vCQkKLS8vCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLS8vCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSAoQXR0cmlidXRlT3ZlcnJpZGVzKSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLS8vCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlcyk7Ci0vLwkJCi0vLwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMiKTsKLS8vCQkKLS8vCQlBdHRyaWJ1dGVPdmVycmlkZSBmb29BdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlcy5hZGQoMCk7Ci0vLwkJZm9vQXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRm9vIik7Ci0vLwkKLS8vCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyhAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkZvb1wiKSkiKTsKLS8vCi0vLwkJQXR0cmlidXRlT3ZlcnJpZGUgYmFyQXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZXMuYWRkKDApOwotLy8JCWJhckF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJhciIpOwotLy8JCi0vLwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQmFyXCIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkZvb1wiKX0pIik7Ci0vLwotLy8JfQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0TW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZVdpdGhDb2x1bW5PbkZpZWxkKCk7Ci0vLwkJSmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0vLwkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVSZXNvdXJjZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0vLwkJQXR0cmlidXRlT3ZlcnJpZGVzIGF0dHJpYnV0ZU92ZXJyaWRlcyA9IChBdHRyaWJ1dGVPdmVycmlkZXMpIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotLy8JCQotLy8JCUF0dHJpYnV0ZU92ZXJyaWRlIGZvb0F0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVzLmFkZCgxKTsKLS8vCQlmb29BdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGb28iKTsKLS8vCQkKLS8vCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkZvb1wiKX0pIik7Ci0vLwkJCi0vLwkJYXR0cmlidXRlT3ZlcnJpZGVzLm1vdmUoMCwgMSk7Ci0vLwkJCi0vLwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiRm9vXCIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIil9KSIpOwotLy8JfQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlV2l0aENvbHVtbk9uRmllbGQoKTsKLS8vCQlKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLS8vCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVJlc291cmNlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLS8vCQlBdHRyaWJ1dGVPdmVycmlkZXMgYXR0cmlidXRlT3ZlcnJpZGVzID0gKEF0dHJpYnV0ZU92ZXJyaWRlcykgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0vLwkJCi0vLwkJQXR0cmlidXRlT3ZlcnJpZGUgZm9vQXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZXMuYWRkKDEpOwotLy8JCWZvb0F0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZvbyIpOwotLy8JCQotLy8JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIiksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiRm9vXCIpfSkiKTsKLS8vCQkKLS8vCQlhdHRyaWJ1dGVPdmVycmlkZXMucmVtb3ZlKDApOwotLy8KLS8vCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyhAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkZvb1wiKSkiKTsKLS8vCi0vLwkJYXR0cmlidXRlT3ZlcnJpZGVzLnJlbW92ZSgwKTsKLS8vCQkKLS8vCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcygpIik7Ci0vLwotLy8JfQotCQotCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Jhc2ljVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Jhc2ljVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkwZGYzMC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9CYXNpY1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEJhc2ljVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgQmFzaWNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEJhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQkFTSUMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RCYXNpY1dpdGhPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkJBU0lDKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMob3B0aW9uYWwgPSB0cnVlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RCYXNpY1dpdGhGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkJBU0lDLCBKUEEuRkVUQ0hfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljKGZldGNoID0gRmV0Y2hUeXBlLkVBR0VSKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEJhc2ljKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkJBU0lDKTsKLQkJYXNzZXJ0Tm90TnVsbChiYXNpYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RCYXNpY1dpdGhPcHRpb25hbCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQmFzaWNBbm5vdGF0aW9uIGJhc2ljID0gKEJhc2ljQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQyk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGJhc2ljLmdldE9wdGlvbmFsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QmFzaWNXaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQkFTSUMpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpYy5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCWJhc2ljLnNldE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYmFzaWMuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEJhc2ljKG9wdGlvbmFsID0gZmFsc2UpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T3B0aW9uYWxOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RCYXNpY1dpdGhPcHRpb25hbCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQmFzaWNBbm5vdGF0aW9uIGJhc2ljID0gKEJhc2ljQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQyk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGJhc2ljLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJYmFzaWMuc2V0T3B0aW9uYWwobnVsbCk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEJhc2ljIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigib3B0aW9uYWwiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QmFzaWNXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQkFTSUMpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBiYXNpYy5nZXRGZXRjaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEJhc2ljV2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkJBU0lDKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgYmFzaWMuZ2V0RmV0Y2goKSk7Ci0JCQotCQliYXNpYy5zZXRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgYmFzaWMuZ2V0RmV0Y2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEJhc2ljKGZldGNoID0gTEFaWSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEJhc2ljV2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkJBU0lDKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgYmFzaWMuZ2V0RmV0Y2goKSk7Ci0JCQotCQliYXNpYy5zZXRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRGZXRjaCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQmFzaWMiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJmZXRjaCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Db2x1bW5UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29sdW1uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZiYThiZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Db2x1bW5UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb2x1bW5UZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fTkFNRSA9ICJNWV9DT0xVTU4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fVEFCTEUgPSAiTVlfVEFCTEUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gPSAiQ09MVU1OX0RFRklOSVRJT04iOwotCQotCXB1YmxpYyBDb2x1bW5UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbHVtbiIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb2x1bW5XaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lID0gXCIiICsgQ09MVU1OX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbHVtbldpdGhUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbHVtbih0YWJsZSA9IFwiIiArIENPTFVNTl9UQUJMRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4oY29sdW1uRGVmaW5pdGlvbiA9IFwiIiArIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KGZpbmFsIFN0cmluZyBib29sZWFuRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uKCIgKyBib29sZWFuRWxlbWVudCArICIgPSB0cnVlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb2x1bW5XaXRoSW50RWxlbWVudChmaW5hbCBTdHJpbmcgaW50RWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uKCIgKyBpbnRFbGVtZW50ICsgIiA9IDUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVuaXF1ZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJY29sdW1uLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2x1bW4obmFtZSA9IFwiRm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJY29sdW1uLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKG5hbWUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uV2l0aFRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9UQUJMRSwgY29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFRhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXRUYWJsZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2x1bW4odGFibGUgPSBcIkZvb1wiKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldFRhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigidGFibGUiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhDb2x1bW5EZWZpbml0aW9uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCi0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKGNvbHVtbkRlZmluaXRpb24gPSBcIkZvb1wiKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjb2x1bW5EZWZpbml0aW9uIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhCb29sZWFuRWxlbWVudCgidW5pcXVlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb2x1bW4uZ2V0VW5pcXVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VW5pcXVlKCkpOwotCi0JCWNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0VW5pcXVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2x1bW4odW5pcXVlID0gZmFsc2UpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldFVuaXF1ZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInVuaXF1ZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoIm51bGxhYmxlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROdWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE51bGxhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldE51bGxhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigibnVsbGFibGUiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhCb29sZWFuRWxlbWVudCgiaW5zZXJ0YWJsZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldEluc2VydGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbnNlcnRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQotCQljb2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2x1bW4oaW5zZXJ0YWJsZSA9IGZhbHNlKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXRJbnNlcnRhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW5zZXJ0YWJsZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJ1cGRhdGFibGUiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbih1cGRhdGFibGUgPSBmYWxzZSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0VXBkYXRhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigidXBkYXRhYmxlIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhJbnRFbGVtZW50KCJsZW5ndGgiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0KLQkJY29sdW1uLnNldExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCBjb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2x1bW4obGVuZ3RoID0gNSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0TGVuZ3RoKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigibGVuZ3RoIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcmVjaXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhJbnRFbGVtZW50KCJwcmVjaXNpb24iKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGNvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRQcmVjaXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29sdW1uLmdldFByZWNpc2lvbigpKTsKLQotCQljb2x1bW4uc2V0UHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGNvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbihwcmVjaXNpb24gPSA1KSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXRQcmVjaXNpb24obnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJwcmVjaXNpb24iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNjYWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW5XaXRoSW50RWxlbWVudCgic2NhbGUiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGNvbHVtbi5nZXRTY2FsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNjYWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0U2NhbGUoKSk7Ci0KLQkJY29sdW1uLnNldFNjYWxlKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGNvbHVtbi5nZXRTY2FsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKHNjYWxlID0gNSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0U2NhbGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJzY2FsZSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmJkZTYxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIERpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fTkFNRSA9ICJNWV9DT0xVTU4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gPSAiQ09MVU1OX0RFRklOSVRJT04iOwotCQotCXB1YmxpYyBEaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RGlzY3JpbWluYXRvckNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARGlzY3JpbWluYXRvckNvbHVtbiIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3REaXNjcmltaW5hdG9yQ29sdW1uV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQERpc2NyaW1pbmF0b3JDb2x1bW4obmFtZSA9IFwiIiArIENPTFVNTl9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3REaXNjcmltaW5hdG9yQ29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQERpc2NyaW1pbmF0b3JDb2x1bW4oY29sdW1uRGVmaW5pdGlvbiA9IFwiIiArIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RGlzY3JpbWluYXRvckNvbHVtbldpdGhEaXNjcmltaW5hdG9yVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OLCBKUEEuRElTQ1JJTUlOQVRPUl9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARGlzY3JpbWluYXRvckNvbHVtbihkaXNjcmltaW5hdG9yVHlwZSA9IERpc2NyaW1pbmF0b3JUeXBlLkNIQVIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbHVtbldpdGhJbnRFbGVtZW50KGZpbmFsIFN0cmluZyBpbnRFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQERpc2NyaW1pbmF0b3JDb2x1bW4oIiArIGludEVsZW1lbnQgKyAiID0gNSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdERpc2NyaW1pbmF0b3JDb2x1bW5XaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQotCQljb2x1bW4uc2V0TmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQERpc2NyaW1pbmF0b3JDb2x1bW4obmFtZSA9IFwiRm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdERpc2NyaW1pbmF0b3JDb2x1bW5XaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbHVtbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihuYW1lIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3REaXNjcmltaW5hdG9yQ29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OLCBjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCi0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARGlzY3JpbWluYXRvckNvbHVtbihjb2x1bW5EZWZpbml0aW9uID0gXCJGb29cIikiLCBjdSk7Ci0KLQkJCi0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKGNvbHVtbkRlZmluaXRpb24iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uV2l0aEludEVsZW1lbnQoImxlbmd0aCIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgY29sdW1uLmdldExlbmd0aCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0KLQkJY29sdW1uLnNldExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCBjb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBEaXNjcmltaW5hdG9yQ29sdW1uKGxlbmd0aCA9IDUpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldExlbmd0aChudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihsZW5ndGgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREaXNjcmltaW5hdG9yVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RGlzY3JpbWluYXRvckNvbHVtbldpdGhEaXNjcmltaW5hdG9yVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5DSEFSLCBjb2x1bW4uZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXREaXNjcmltaW5hdG9yVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0KLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0KLQkJY29sdW1uLnNldERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlLklOVEVHRVIpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUiwgY29sdW1uLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBEaXNjcmltaW5hdG9yQ29sdW1uKGRpc2NyaW1pbmF0b3JUeXBlID0gSU5URUdFUikiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0RGlzY3JpbWluYXRvclR5cGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIoZGlzY3JpbWluYXRvclR5cGUiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvclZhbHVlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JWYWx1ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYWNkMWIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvclZhbHVlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRGlzY3JpbWluYXRvclZhbHVlVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBEaXNjcmltaW5hdG9yVmFsdWVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdERpc2NyaW1pbmF0b3JWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkRJU0NSSU1JTkFUT1JfVkFMVUUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBEaXNjcmltaW5hdG9yVmFsdWUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RGlzY3JpbWluYXRvclZhbHVlV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRElTQ1JJTUlOQVRPUl9WQUxVRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQERpc2NyaW1pbmF0b3JWYWx1ZSh2YWx1ZSA9IFwiZGlzY3JpbWluYXRvclwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzY3JpbWluYXRvclZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3REaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkKLQkJRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yVmFsdWUgPSAoRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfVkFMVUUpOwotCQlhc3NlcnROb3ROdWxsKGRpc2NyaW1pbmF0b3JWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RGlzY3JpbWluYXRvclZhbHVlV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIGRpc2NyaW1pbmF0b3JWYWx1ZSA9IChEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscygiZGlzY3JpbWluYXRvciIsIGRpc2NyaW1pbmF0b3JWYWx1ZS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3REaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCURpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24gZGlzY3JpbWluYXRvclZhbHVlID0gKERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX1ZBTFVFKTsKLQotCQlkaXNjcmltaW5hdG9yVmFsdWUuc2V0VmFsdWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBEaXNjcmltaW5hdG9yVmFsdWUoXCJmb29cIikiLCBjdSk7Ci0JCQotCQlkaXNjcmltaW5hdG9yVmFsdWUuc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQERpc2NyaW1pbmF0b3JWYWx1ZSgiLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWVlZTE3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW50aXR5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVtYmVkZGFibGVUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIEVtYmVkZGFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRhYmxlQW5kRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRUREQUJMRSwgSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCUphdmFSZXNvdXJjZU5vZGUgbWFwcGluZ0Fubm90YXRpb24gPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFbWJlZGRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRUcnVlKG1hcHBpbmdBbm5vdGF0aW9uIGluc3RhbmNlb2YgRW1iZWRkYWJsZUFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkYWJsZUFuZEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW1iZWRkYWJsZUFuZEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJSmF2YVJlc291cmNlTm9kZSBtYXBwaW5nQW5ub3RhdGlvbiA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUobWFwcGluZ0Fubm90YXRpb24gaW5zdGFuY2VvZiBFbWJlZGRhYmxlQW5ub3RhdGlvbik7Ci0JCQotCQlFbnRpdHlBbm5vdGF0aW9uIGVudGl0eSA9IChFbnRpdHlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRU5USVRZKTsKLQkJYXNzZXJ0Tm90TnVsbChlbnRpdHkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkZWRJZFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRlZElkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIzMTdlZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRlZElkVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFbWJlZGRlZElkVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFbWJlZGRlZElkVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRURERURfSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRlZElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW1iZWRkZWRJZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSmF2YVJlc291cmNlTm9kZSBtYXBwaW5nQW5ub3RhdGlvbiA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRUcnVlKG1hcHBpbmdBbm5vdGF0aW9uIGluc3RhbmNlb2YgRW1iZWRkZWRJZEFubm90YXRpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkZWRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkZWRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzM1ZTc1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGVkVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIEVtYmVkZGVkVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREVEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkZWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW1iZWRkZWQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUphdmFSZXNvdXJjZU5vZGUgbWFwcGluZ0Fubm90YXRpb24gPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUobWFwcGluZ0Fubm90YXRpb24gaW5zdGFuY2VvZiBFbWJlZGRlZEFubm90YXRpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW50aXR5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudGl0eVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZDlkZTYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW50aXR5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW50aXR5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVudGl0eVRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX05BTUUgPSAiRm9vIjsKLQkKLQlwdWJsaWMgRW50aXR5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkobmFtZSA9IFwiIiArIEVOVElUWV9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQW5kRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJRW50aXR5QW5ub3RhdGlvbiBlbnRpdHkgPSAoRW50aXR5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkVOVElUWSk7Ci0JCWFzc2VydFRydWUoZW50aXR5ICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoRU5USVRZX05BTUUsIGVudGl0eS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlFbnRpdHlBbm5vdGF0aW9uIGVudGl0eSA9IChFbnRpdHlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRU5USVRZKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkgIT0gbnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5LmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJRW50aXR5QW5ub3RhdGlvbiBlbnRpdHkgPSAoRW50aXR5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkVOVElUWSk7Ci0JCWFzc2VydE51bGwoZW50aXR5LmdldE5hbWUoKSk7Ci0JCWVudGl0eS5zZXROYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBlbnRpdHkuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARW50aXR5KG5hbWUgPSBcIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJRW50aXR5QW5ub3RhdGlvbiBlbnRpdHkgPSAoRW50aXR5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkVOVElUWSk7Ci0JCWFzc2VydEVxdWFscyhFTlRJVFlfTkFNRSwgZW50aXR5LmdldE5hbWUoKSk7Ci0JCQotCQllbnRpdHkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARW50aXR5IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEVudGl0eShuYW1lID0gXCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBwZWRTdXBlcmNsYXNzQW5kRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQW5kRW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlFbnRpdHlBbm5vdGF0aW9uIG1hcHBpbmdBbm5vdGF0aW9uID0gKEVudGl0eUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5FTlRJVFkpOwotCQlhc3NlcnROb3ROdWxsKG1hcHBpbmdBbm5vdGF0aW9uKTsKLQkJCi0JCU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCWFzc2VydE5vdE51bGwobWFwcGVkU3VwZXJjbGFzcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbnVtZXJhdGVkVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudW1lcmF0ZWRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTZmOGQ0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudW1lcmF0ZWRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW51bWVyYXRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFbnVtZXJhdGVkVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFbnVtZXJhdGVkVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5VTUVSQVRFRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudW1lcmF0ZWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW51bWVyYXRlZFdpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVU1FUkFURUQsIEpQQS5FTlVNX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnVtZXJhdGVkKEVudW1UeXBlLk9SRElOQUwpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnVtZXJhdGVkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFbnVtZXJhdGVkQW5ub3RhdGlvbiBlbnVtZXJhdGVkID0gKEVudW1lcmF0ZWRBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkVOVU1FUkFURUQpOwotCQlhc3NlcnROb3ROdWxsKGVudW1lcmF0ZWQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudW1lcmF0ZWRXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVudW1lcmF0ZWRBbm5vdGF0aW9uIGVudW1lcmF0ZWQgPSAoRW51bWVyYXRlZEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuRU5VTUVSQVRFRCk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5PUkRJTkFMLCBlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudW1lcmF0ZWQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQotCQlFbnVtZXJhdGVkQW5ub3RhdGlvbiBlbnVtZXJhdGVkID0gKEVudW1lcmF0ZWRBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkVOVU1FUkFURUQpOwotCi0JCWVudW1lcmF0ZWQuc2V0VmFsdWUoRW51bVR5cGUuU1RSSU5HKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARW51bWVyYXRlZChTVFJJTkcpIiwgY3UpOwotCQkKLQkJZW51bWVyYXRlZC5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJARW51bWVyYXRlZCgiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARW51bWVyYXRlZCIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0dlbmVyYXRlZFZhbHVlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0dlbmVyYXRlZFZhbHVlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU1MzZhMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9HZW5lcmF0ZWRWYWx1ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVkVmFsdWVUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRPUiA9ICJNWV9HRU5FUkFUT1IiOwotCXB1YmxpYyBHZW5lcmF0ZWRWYWx1ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEdlbmVyYXRlZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuR0VORVJBVEVEX1ZBTFVFLCBKUEEuR0VORVJBVElPTl9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAR2VuZXJhdGVkVmFsdWUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0R2VuZXJhdGVkVmFsdWVXaXRoR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuR0VORVJBVEVEX1ZBTFVFLCBKUEEuR0VORVJBVElPTl9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAR2VuZXJhdGVkVmFsdWUoZ2VuZXJhdG9yID0gXCIiICsgR0VORVJBVE9SICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RHZW5lcmF0ZWRWYWx1ZVdpdGhTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkdFTkVSQVRFRF9WQUxVRSwgSlBBLkdFTkVSQVRJT05fVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5ID0gR2VuZXJhdGlvblR5cGUuU0VRVUVOQ0UpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZWRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0R2VuZXJhdGVkVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZSA9IChHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuR0VORVJBVEVEX1ZBTFVFKTsKLQkJYXNzZXJ0Tm90TnVsbChnZW5lcmF0ZWRWYWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0R2VuZXJhdGVkVmFsdWVXaXRoR2VuZXJhdG9yKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUgPSAoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkdFTkVSQVRFRF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1IsIGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0R2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RHZW5lcmF0ZWRWYWx1ZVdpdGhHZW5lcmF0b3IoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZSA9IChHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuR0VORVJBVEVEX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUiwgZ2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yKCkpOwotCQkKLQkJZ2VuZXJhdGVkVmFsdWUuc2V0R2VuZXJhdG9yKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEdlbmVyYXRlZFZhbHVlKGdlbmVyYXRvciA9IFwiZm9vXCIpIiwgY3UpOwotCQkKLQkJZ2VuZXJhdGVkVmFsdWUuc2V0R2VuZXJhdG9yKG51bGwpOwotCQlhc3NlcnROdWxsKGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJnZW5lcmF0b3IiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAR2VuZXJhdGVkVmFsdWUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0R2VuZXJhdGVkVmFsdWVXaXRoU3RyYXRlZ3koKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZSA9IChHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuR0VORVJBVEVEX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKEdlbmVyYXRpb25UeXBlLlNFUVVFTkNFLCBnZW5lcmF0ZWRWYWx1ZS5nZXRTdHJhdGVneSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEdlbmVyYXRlZFZhbHVlV2l0aFN0cmF0ZWd5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUgPSAoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkdFTkVSQVRFRF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhHZW5lcmF0aW9uVHlwZS5TRVFVRU5DRSwgZ2VuZXJhdGVkVmFsdWUuZ2V0U3RyYXRlZ3koKSk7Ci0JCQotCQlnZW5lcmF0ZWRWYWx1ZS5zZXRTdHJhdGVneShHZW5lcmF0aW9uVHlwZS5UQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhHZW5lcmF0aW9uVHlwZS5UQUJMRSwgZ2VuZXJhdGVkVmFsdWUuZ2V0U3RyYXRlZ3koKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5ID0gVEFCTEUpIiwgY3UpOwotCQkKLQkJZ2VuZXJhdGVkVmFsdWUuc2V0U3RyYXRlZ3kobnVsbCk7Ci0JCWFzc2VydE51bGwoZ2VuZXJhdGVkVmFsdWUuZ2V0U3RyYXRlZ3koKSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJzdHJhdGVneSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBHZW5lcmF0ZWRWYWx1ZSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9JZENsYXNzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0lkQ2xhc3NUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWQ1MTExLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0lkQ2xhc3NUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZENsYXNzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIElkQ2xhc3NUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0NMQVNTX1ZBTFVFID0gIk15Q2xhc3MiOwotCQotCXB1YmxpYyBJZENsYXNzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0SWRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLklEX0NMQVNTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWRDbGFzcyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RJZENsYXNzV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSURfQ0xBU1MpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZENsYXNzKCIgKyBJRF9DTEFTU19WQUxVRSArICIuY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RJZENsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlJZENsYXNzQW5ub3RhdGlvbiBpZENsYXNzID0gKElkQ2xhc3NBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuSURfQ0xBU1MpOwotCQlhc3NlcnROb3ROdWxsKGlkQ2xhc3MpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3MuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RJZENsYXNzV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlJZENsYXNzQW5ub3RhdGlvbiBpZENsYXNzID0gKElkQ2xhc3NBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuSURfQ0xBU1MpOwotCQlhc3NlcnRFcXVhbHMoSURfQ0xBU1NfVkFMVUUsIGlkQ2xhc3MuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RJZENsYXNzV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlJZENsYXNzQW5ub3RhdGlvbiBpZENsYXNzID0gKElkQ2xhc3NBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuSURfQ0xBU1MpOwotCQlhc3NlcnRFcXVhbHMoSURfQ0xBU1NfVkFMVUUsIGlkQ2xhc3MuZ2V0VmFsdWUoKSk7Ci0JCQotCQlpZENsYXNzLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBpZENsYXNzLmdldFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBJZENsYXNzKGZvby5jbGFzcykiLCBjdSk7Ci0JCQotCQlpZENsYXNzLnNldFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBJZENsYXNzKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZ1bGx5UXVhbGlmaWVkQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdElkQ2xhc3NXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlJZENsYXNzQW5ub3RhdGlvbiBpZENsYXNzID0gKElkQ2xhc3NBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuSURfQ0xBU1MpOwotCQlhc3NlcnROb3ROdWxsKGlkQ2xhc3MuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTXlDbGFzcyIsIGlkQ2xhc3MuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoKSk7IC8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKLQotCi0JCWlkQ2xhc3Muc2V0VmFsdWUoVFlQRV9OQU1FKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIGlkQ2xhc3MuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoKSk7CQkJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQElkQ2xhc3MoIiArIFRZUEVfTkFNRSArICIuY2xhc3MpIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSWRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSWRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmZjMzAzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0lkVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSWRUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIElkVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RJZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSmF2YVJlc291cmNlTm9kZSBtYXBwaW5nQW5ub3RhdGlvbiA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwaW5nQW5ub3RhdGlvbiBpbnN0YW5jZW9mIElkQW5ub3RhdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Jbmhlcml0YW5jZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Jbmhlcml0YW5jZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZTdiZWUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSW5oZXJpdGFuY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBJbmhlcml0YW5jZVRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgSW5oZXJpdGFuY2VUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEluaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSU5IRVJJVEFOQ0UpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJbmhlcml0YW5jZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RJbmhlcml0YW5jZVdpdGhTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLklOSEVSSVRBTkNFLCBKUEEuSU5IRVJJVEFOQ0VfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEluaGVyaXRhbmNlKHN0cmF0ZWd5ID0gSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RJbmhlcml0YW5jZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJSW5oZXJpdGFuY2VBbm5vdGF0aW9uIGluaGVyaXRhbmNlID0gKEluaGVyaXRhbmNlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLklOSEVSSVRBTkNFKTsKLQkJYXNzZXJ0Tm90TnVsbChpbmhlcml0YW5jZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0SW5oZXJpdGFuY2VXaXRoU3RyYXRlZ3koKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCUluaGVyaXRhbmNlQW5ub3RhdGlvbiBpbmhlcml0YW5jZSA9IChJbmhlcml0YW5jZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5JTkhFUklUQU5DRSk7Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuSk9JTkVELCBpbmhlcml0YW5jZS5nZXRTdHJhdGVneSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RJbmhlcml0YW5jZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCUluaGVyaXRhbmNlQW5ub3RhdGlvbiBpbmhlcml0YW5jZSA9IChJbmhlcml0YW5jZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5JTkhFUklUQU5DRSk7Ci0JCWluaGVyaXRhbmNlLnNldFN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBJbmhlcml0YW5jZShzdHJhdGVneSA9IFRBQkxFX1BFUl9DTEFTUykiLCBjdSk7Ci0JCQotCQlpbmhlcml0YW5jZS5zZXRTdHJhdGVneShudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJzdHJhdGVneSIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pQVFRvb2xzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pQVFRvb2xzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU5OGY4Ny4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KUFRUb29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRmllbGRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1ldGhvZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpQVFRvb2xzVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBKUFRUb29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZUZpZWxkV2l0aE1vZGlmaWVyKGZpbmFsIFN0cmluZyBtb2RpZmllcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIgKyBtb2RpZmllciArICIgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgRmllbGRBdHRyaWJ1dGUgZm9vRmllbGQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gdGhpcy5idWlsZEZpZWxkKCJmb28iLCBjdSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZUdldE1ldGhvZFdpdGhNb2RpZmllcihmaW5hbCBTdHJpbmcgbW9kaWZpZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIiArIG1vZGlmaWVyICsgIiBpbnQgZ2V0Rm9vKCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHJldHVybiB0aGlzLmlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgdm9pZCBzZXRGb28oaW50IGlkKSB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgICAgdGhpcy5pZCA9IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZUludmFsaWRNZXRob2ROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgaW50IGZvbygpIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICAgICByZXR1cm4gdGhpcy5pZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIHZvaWQgc2V0Rm9vKGludCBpZCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHRoaXMuaWQgPSBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVDb25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljICIgKyBUWVBFX05BTUUgKyAiKCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHN1cGVyKCk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlVm9pZE1ldGhvZFJldHVyblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyB2b2lkIGdldEZvbygpIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICAgICByZXR1cm4gdGhpcy5pZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIHZvaWQgc2V0Rm9vKGludCBpZCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHRoaXMuaWQgPSBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVJbnZhbGlkTWV0aG9kUmV0dXJuVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPigiY29tLmZvby5Gb28iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIEZvbyBnZXRGb28oKSB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgICAgcmV0dXJuIG51bGw7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyB2b2lkIHNldEZvbyhGb28gaWQpIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICAgICB0aGlzLmlkID0gaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVJc01ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIGJvb2xlYW4gaXNGb28oKSB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgICAgcmV0dXJuIHRoaXMuaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyB2b2lkIHNldEZvbyhib29sZWFuIGlkKSB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgICAgdGhpcy5pZCA9IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZUlzTWV0aG9kUmV0dXJuSW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgaW50IGlzRm9vKCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHJldHVybiB0aGlzLmlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgdm9pZCBzZXRGb28oaW50IGlkKSB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgICAgdGhpcy5pZCA9IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZUlzQW5kR2V0TWV0aG9kV2l0aE1vZGlmaWVyKGZpbmFsIFN0cmluZyBtb2RpZmllcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiICsgbW9kaWZpZXIgKyAiIGJvb2xlYW4gaXNGb28oKSB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgICAgcmV0dXJuIHRoaXMuaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIgKyBtb2RpZmllciArICIgYm9vbGVhbiBnZXRGb28oKSB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgICAgcmV0dXJuIHRoaXMuaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyB2b2lkIHNldEZvbyhib29sZWFuIGlkKSB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgICAgdGhpcy5pZCA9IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlU2V0TWV0aG9kV2l0aE1vZGlmaWVyKGZpbmFsIFN0cmluZyBtb2RpZmllcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgaW50IGdldEZvbygpIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICAgICByZXR1cm4gdGhpcy5pZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIiArIG1vZGlmaWVyICsgIiB2b2lkIHNldEZvbyhpbnQgaWQpIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICAgICB0aGlzLmlkID0gaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVXaXRoTWVtYmVyVHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRNZW1iZXJUeXBlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvb1N0YXRpYyB7fSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgcHVibGljIGNsYXNzIEZvb05vdFN0YXRpYyB7fSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgcHVibGljIEBpbnRlcmZhY2UgTXlBbm5vdGF0aW9uIHt9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICBwdWJsaWMgZW51bSBNeUVudW0ge30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kQXR0cmlidXRlIGZvb01ldGhvZChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTWV0aG9kKCJnZXRGb28iLCBjdSk7Ci0JfQotCi0JLy9wcml2YXRlIFN0cmluZyBmb287IC0gcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0RmllbGRJc1BlcnNpc3RhYmxlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVGaWVsZFdpdGhNb2RpZmllcigicHJpdmF0ZSIpOwotCQlGaWVsZEF0dHJpYnV0ZSBmaWVsZEF0dHJpYnV0ZSA9IGZvb0ZpZWxkKGN1KTsKLQkJYXNzZXJ0VHJ1ZShmaWVsZEF0dHJpYnV0ZS5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCX0KLQkKLQkvL3ByaXZhdGUgc3RhdGljIFN0cmluZyBmb287IC0gbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdEZpZWxkSXNQZXJzaXN0YWJsZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlRmllbGRXaXRoTW9kaWZpZXIoInByaXZhdGUgc3RhdGljIik7Ci0JCUZpZWxkQXR0cmlidXRlIGZpZWxkQXR0cmlidXRlID0gZm9vRmllbGQoY3UpOwotCQlhc3NlcnRGYWxzZShmaWVsZEF0dHJpYnV0ZS5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCX0KLQkKLQkvL3ByaXZhdGUgdHJhbnNpZW50IFN0cmluZyBmb287IC0gbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdEZpZWxkSXNQZXJzaXN0YWJsZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlRmllbGRXaXRoTW9kaWZpZXIoInByaXZhdGUgdHJhbnNpZW50Iik7Ci0JCUZpZWxkQXR0cmlidXRlIGZpZWxkQXR0cmlidXRlID0gZm9vRmllbGQoY3UpOwotCQlhc3NlcnRGYWxzZShmaWVsZEF0dHJpYnV0ZS5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCX0KLQkKLQkvL3ByaXZhdGUgZmluYWwgU3RyaW5nIGZvbzsgLSBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RGaWVsZElzUGVyc2lzdGFibGU0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUZpZWxkV2l0aE1vZGlmaWVyKCJwcml2YXRlIGZpbmFsIik7Ci0JCUZpZWxkQXR0cmlidXRlIGZpZWxkQXR0cmlidXRlID0gZm9vRmllbGQoY3UpOwotCQlhc3NlcnRUcnVlKGZpZWxkQXR0cmlidXRlLmlzUGVyc2lzdGFibGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JfQotCQotCS8vcHVibGljIFN0cmluZyBmb287IC0gcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0RmllbGRJc1BlcnNpc3RhYmxlNSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVGaWVsZFdpdGhNb2RpZmllcigicHVibGljIik7Ci0JCUZpZWxkQXR0cmlidXRlIGZpZWxkQXR0cmlidXRlID0gZm9vRmllbGQoY3UpOwotCQlhc3NlcnRUcnVlKGZpZWxkQXR0cmlidXRlLmlzUGVyc2lzdGFibGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JfQotCQotCi0JLy9wdWJsaWMgaW50IGdldEZvbygpIHt9IC0gcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlR2V0TWV0aG9kV2l0aE1vZGlmaWVyKCJwdWJsaWMiKTsKLQkJTWV0aG9kQXR0cmlidXRlIG1ldGhvZEF0dHJpYnV0ZSA9IGZvb01ldGhvZChjdSk7Ci0JCWFzc2VydFRydWUobWV0aG9kQXR0cmlidXRlLmlzUGVyc2lzdGFibGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JfQotCQotCS8vcHJvdGVjdGVkIGludCBnZXRGb28oKSB7fSAtIHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUdldE1ldGhvZFdpdGhNb2RpZmllcigicHJvdGVjdGVkIik7Ci0JCU1ldGhvZEF0dHJpYnV0ZSBtZXRob2RBdHRyaWJ1dGUgPSBmb29NZXRob2QoY3UpOwotCQlhc3NlcnRUcnVlKG1ldGhvZEF0dHJpYnV0ZS5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCX0KLQkKLQkvL2ludCBnZXRGb28oKSB7fSAtIHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjAzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUdldE1ldGhvZFdpdGhNb2RpZmllcigiIik7Ci0JCU1ldGhvZEF0dHJpYnV0ZSBtZXRob2RBdHRyaWJ1dGUgPSBmb29NZXRob2QoY3UpOwotCQlhc3NlcnRUcnVlKG1ldGhvZEF0dHJpYnV0ZS5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCX0KLQkKLQkvL3ByaXZhdGUgaW50IGdldEZvbygpIHt9IC0gcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlR2V0TWV0aG9kV2l0aE1vZGlmaWVyKCJwcml2YXRlIik7Ci0JCU1ldGhvZEF0dHJpYnV0ZSBtZXRob2RBdHRyaWJ1dGUgPSBmb29NZXRob2QoY3UpOwotCQlhc3NlcnRUcnVlKG1ldGhvZEF0dHJpYnV0ZS5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCX0KLQkKLQkvL3B1YmxpYyBzdGF0aWMgaW50IGdldEZvbygpIHt9IC0gbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjA1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUdldE1ldGhvZFdpdGhNb2RpZmllcigicHVibGljIHN0YXRpYyIpOwotCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJYXNzZXJ0RmFsc2UobWV0aG9kQXR0cmlidXRlLmlzUGVyc2lzdGFibGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JfQotCi0JLy9wdWJsaWMgZmluYWwgaW50IGdldEZvbygpIHt9IC0gcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMDYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlR2V0TWV0aG9kV2l0aE1vZGlmaWVyKCJwdWJsaWMgZmluYWwiKTsKLQkJTWV0aG9kQXR0cmlidXRlIG1ldGhvZEF0dHJpYnV0ZSA9IGZvb01ldGhvZChjdSk7Ci0JCWFzc2VydFRydWUobWV0aG9kQXR0cmlidXRlLmlzUGVyc2lzdGFibGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JfQotCi0JLy9wdWJsaWMgdm9pZCBzZXRGb28oaW50IGZvbykge30gLSBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIwNygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVTZXRNZXRob2RXaXRoTW9kaWZpZXIoInB1YmxpYyIpOwotCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJYXNzZXJ0VHJ1ZShtZXRob2RBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQl9Ci0JCi0JLy9wcm90ZWN0ZWQgdm9pZCBzZXRGb28oaW50IGZvbykge30gLSBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIwOCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVTZXRNZXRob2RXaXRoTW9kaWZpZXIoInByb3RlY3RlZCIpOwotCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJYXNzZXJ0VHJ1ZShtZXRob2RBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQl9Ci0JCi0JLy92b2lkIHNldEZvbyhpbnQgZm9vKSB7fSAtIHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjA5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZVNldE1ldGhvZFdpdGhNb2RpZmllcigiIik7Ci0JCU1ldGhvZEF0dHJpYnV0ZSBtZXRob2RBdHRyaWJ1dGUgPSBmb29NZXRob2QoY3UpOwotCQlhc3NlcnRUcnVlKG1ldGhvZEF0dHJpYnV0ZS5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCX0KLQkKLQkvL3ByaXZhdGUgdm9pZCBzZXRGb28oaW50IGZvbykge30gLSBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIxMCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gIGNyZWF0ZVRlc3RUeXBlU2V0TWV0aG9kV2l0aE1vZGlmaWVyKCJwcml2YXRlIik7Ci0JCU1ldGhvZEF0dHJpYnV0ZSBtZXRob2RBdHRyaWJ1dGUgPSBmb29NZXRob2QoY3UpOwotCQlhc3NlcnRUcnVlKG1ldGhvZEF0dHJpYnV0ZS5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCX0KLQkKLQkvL3B1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb28oaW50IGZvbykge30gLSBub3QgcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlU2V0TWV0aG9kV2l0aE1vZGlmaWVyKCJwdWJsaWMgc3RhdGljIik7Ci0JCU1ldGhvZEF0dHJpYnV0ZSBtZXRob2RBdHRyaWJ1dGUgPSBmb29NZXRob2QoY3UpOwotCQlhc3NlcnRGYWxzZShtZXRob2RBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQl9Ci0KLQkvL3B1YmxpYyBmaW5hbCB2b2lkIHNldEZvbyhpbnQgZm9vKSB7fSAtIHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZVNldE1ldGhvZFdpdGhNb2RpZmllcigicHVibGljIGZpbmFsIik7Ci0JCU1ldGhvZEF0dHJpYnV0ZSBtZXRob2RBdHRyaWJ1dGUgPSBmb29NZXRob2QoY3UpOwotCQlhc3NlcnRUcnVlKG1ldGhvZEF0dHJpYnV0ZS5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCX0KLQotCS8vcHVibGljIGJvb2xlYW4gaXNGb28oKSB7fSAtIHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjEzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUlzTWV0aG9kKCk7Ci0JCU1ldGhvZEF0dHJpYnV0ZSBtZXRob2RBdHRyaWJ1dGUgPSAgdGhpcy5idWlsZE1ldGhvZCgiaXNGb28iLCBjdSk7Ci0JCWFzc2VydFRydWUobWV0aG9kQXR0cmlidXRlLmlzUGVyc2lzdGFibGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JfQotCQotCS8vcHVibGljIGludCBpc0ZvbygpIHt9IC0gbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjE0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUlzTWV0aG9kUmV0dXJuSW50KCk7Ci0JCU1ldGhvZEF0dHJpYnV0ZSBtZXRob2RBdHRyaWJ1dGUgPSAgdGhpcy5idWlsZE1ldGhvZCgiaXNGb28iLCBjdSk7Ci0JCWFzc2VydEZhbHNlKG1ldGhvZEF0dHJpYnV0ZS5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCX0KLQkKLQkvL3B1YmxpYyBpbnQgaXNGb28oKSB7fSAtIHBlcnNpc3RhYmxlCi0JLy9wdWJsaWMgaW50IGdldEZvbygpIHt9IC0gbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjE1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUlzQW5kR2V0TWV0aG9kV2l0aE1vZGlmaWVyKCJwdWJsaWMiKTsKLQkJTWV0aG9kQXR0cmlidXRlIGlzRm9vTWV0aG9kID0gIHRoaXMuYnVpbGRNZXRob2QoImlzRm9vIiwgY3UpOwotCQlNZXRob2RBdHRyaWJ1dGUgZ2V0Rm9vTWV0aG9kID0gIHRoaXMuYnVpbGRNZXRob2QoImdldEZvbyIsIGN1KTsKLQkJCi0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOwotCQlhc3NlcnRUcnVlKGlzRm9vTWV0aG9kLmlzUGVyc2lzdGFibGUoYXN0Um9vdCkpOwotCQlhc3NlcnRGYWxzZShnZXRGb29NZXRob2QuaXNQZXJzaXN0YWJsZShhc3RSb290KSk7Ci0JfQotCQotCS8vcHVibGljIGludCBmb28oKSB7fSAtIG5vdCBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIxNigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVJbnZhbGlkTWV0aG9kTmFtZSgpOwotCQlNZXRob2RBdHRyaWJ1dGUgZm9vTWV0aG9kID0gIHRoaXMuYnVpbGRNZXRob2QoImZvbyIsIGN1KTsKLQkJYXNzZXJ0RmFsc2UoZm9vTWV0aG9kLmlzUGVyc2lzdGFibGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JfQotCi0JLy9wdWJsaWMgdm9pZCBnZXRGb28oKSB7fSAtIG5vdCBwZXJzaXN0YWJsZSAtIHZvaWQgcmV0dXJuIHR5cGUKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMTcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlVm9pZE1ldGhvZFJldHVyblR5cGUoKTsKLQkJTWV0aG9kQXR0cmlidXRlIGZvb01ldGhvZCA9ICB0aGlzLmJ1aWxkTWV0aG9kKCJnZXRGb28iLCBjdSk7Ci0JCWFzc2VydEZhbHNlKGZvb01ldGhvZC5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCX0KLQkKLQkvL3B1YmxpYyBGb28gZ2V0Rm9vKCkge30gLSBwZXJzaXN0YWJsZT8/PyAtIEZvbyBkb2VzIG5vdCByZXNvbHZlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjE4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUludmFsaWRNZXRob2RSZXR1cm5UeXBlKCk7Ci0JCU1ldGhvZEF0dHJpYnV0ZSBnZXRGb29NZXRob2QgPSAgdGhpcy5idWlsZE1ldGhvZCgiZ2V0Rm9vIiwgY3UpOwotCQlhc3NlcnRUcnVlKGdldEZvb01ldGhvZC5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCX0KLQkKLQkvL21ldGhvZCB3aXRoIHBhcmFtZXRlcnMgLSBub3QgcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMTkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU1ldGhvZEF0dHJpYnV0ZSBzZXRJZE1ldGhvZCA9ICBpZFNldE1ldGhvZChjdSk7Ci0JCWFzc2VydEZhbHNlKHNldElkTWV0aG9kLmlzUGVyc2lzdGFibGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JfQotCQotCS8vY29uc3RydWN0b3IgLSBub3QgcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlQ29uc3RydWN0b3IoKTsKLQkJTWV0aG9kQXR0cmlidXRlIGNvbnN0cnVjdG9yID0gIGJ1aWxkTWV0aG9kKFRZUEVfTkFNRSwgY3UpOwotCQlhc3NlcnRGYWxzZShjb25zdHJ1Y3Rvci5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCX0KLQkKLQkvL25vIGNvcnJlc3BvbmRpbmcgc2V0IG1ldGhvZCAtIG5vdCBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIyMSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGUoKTsKLQkJTWV0aG9kQXR0cmlidXRlIGdldE5hbWVNZXRob2QgPSAgbmFtZUdldE1ldGhvZChjdSk7Ci0JCWFzc2VydEZhbHNlKGdldE5hbWVNZXRob2QuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQl9Ci0JCi0JLy9wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblRlc3RUeXBlCi0JcHVibGljIHZvaWQgdGVzdFR5cGVJc1BlcnNpc3RhYmxlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGUoKTsKLQkJVHlwZSB0eXBlID0gdGVzdFR5cGUoY3UpOwotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KGN1KTsKLQkJYXNzZXJ0VHJ1ZSh0eXBlLmlzUGVyc2lzdGFibGUoYXN0Um9vdCkpOwotCX0KLQkKLQkvL3B1YmxpYyBmaW5hbCBjbGFzcyBNeUZpbmFsCi0JcHVibGljIHZvaWQgdGVzdFR5cGVJc1BlcnNpc3RhYmxlMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImZpbmFscyIsICJNeUZpbmFsLmphdmEiLCAicHVibGljIGZpbmFsIGNsYXNzIE15RmluYWwgeyB9Iik7Ci0JCVR5cGUgdHlwZSA9IGJ1aWxkVHlwZSgiTXlGaW5hbCIsIGN1KTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSB0aGlzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCWFzc2VydFRydWUodHlwZS5pc1BlcnNpc3RhYmxlKGFzdFJvb3QpKTsKLQl9Ci0JCi0JLy9wdWJsaWMgaW50ZXJmYWNlIE15SW50ZXJmYWNlCi0JcHVibGljIHZvaWQgdGVzdFR5cGVJc1BlcnNpc3RhYmxlMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImludGVyZmFjZXMiLCAiTXlJbnRlcmZhY2UuamF2YSIsICJwdWJsaWMgaW50ZXJmYWNlIE15SW50ZXJmYWNlIHsgfSIpOwotCQlUeXBlIHR5cGUgPSBidWlsZFR5cGUoIk15SW50ZXJmYWNlIiwgY3UpOwotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KGN1KTsKLQkJYXNzZXJ0RmFsc2UodHlwZS5pc1BlcnNpc3RhYmxlKGFzdFJvb3QpKTsKLQl9Ci0JCi0JLy9lbnVtIG5vdCBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlSXNQZXJzaXN0YWJsZTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIlRlc3RFbnVtIiwgIkZPTywgQkFSLCBCQVoiKTsKLQkJVHlwZSB0eXBlID0gYnVpbGRUeXBlKCJUZXN0RW51bSIsIGN1KTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSB0aGlzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCWFzc2VydEZhbHNlKHR5cGUuaXNQZXJzaXN0YWJsZShhc3RSb290KSk7Ci0JfQotCQotCS8vYW5ub3RhdGlvbiBub3QgcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZUlzUGVyc2lzdGFibGU1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJUZXN0QW5ub3RhdGlvbiIsICJUZXN0RW51bSBmb28oKTsiKTsKLQkJVHlwZSB0eXBlID0gYnVpbGRUeXBlKCJUZXN0QW5ub3RhdGlvbiIsIGN1KTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSB0aGlzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCWFzc2VydEZhbHNlKHR5cGUuaXNQZXJzaXN0YWJsZShhc3RSb290KSk7Ci0JfQotCQotCS8vcHVibGljIHN0YXRpYyBtZW1iZXIgdHlwZSBpcyBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlSXNQZXJzaXN0YWJsZTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVXaXRoTWVtYmVyVHlwZXMoKTsKLQkJVHlwZSB0ZXN0VHlwZSA9IHRoaXMudGVzdFR5cGUoY3UpOwotCQlUeXBlIG1lbWJlclR5cGUgPSB0aGlzLmJ1aWxkVHlwZSh0ZXN0VHlwZSwgIkZvb1N0YXRpYyIsIDEsIGN1KTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSB0aGlzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCWFzc2VydFRydWUobWVtYmVyVHlwZS5pc1BlcnNpc3RhYmxlKGFzdFJvb3QpKTsKLQl9Ci0JCi0JLy9ub24tc3RhdGljIG1lbWJlciB0eXBlIGlzIHBlcnNpc3RhYmxlLCBoYW5kbGVkIHdpdGggdmFsaWRhdGlvbgotCXB1YmxpYyB2b2lkIHRlc3RUeXBlSXNQZXJzaXN0YWJsZTcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVXaXRoTWVtYmVyVHlwZXMoKTsKLQkJVHlwZSB0ZXN0VHlwZSA9IHRoaXMudGVzdFR5cGUoY3UpOwotCQlUeXBlIG1lbWJlclR5cGUgPSB0aGlzLmJ1aWxkVHlwZSh0ZXN0VHlwZSwgIkZvb05vdFN0YXRpYyIsIDEsIGN1KTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSB0aGlzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCWFzc2VydFRydWUobWVtYmVyVHlwZS5pc1BlcnNpc3RhYmxlKGFzdFJvb3QpKTsKLQl9Ci0JLy9UT0RPIHN0aWxsIG5lZWQgdG8gdGVzdCB0eXBlSXNQZXJzaXN0YWJsZSgpIHJldHVybnMgZmFsc2UgZm9yIGxvY2FsIGFuZCBhbm9ueW1vdXMgY2xhc3NlcwotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlQXR0cmlidXRlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUF0dHJpYnV0ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYzA1ZmQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlQXR0cmlidXRlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudC5FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VJZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmF2YVJlc291cmNlQXR0cmlidXRlVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgSmF2YVJlc291cmNlQXR0cmlidXRlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTm9uUmVzb2x2aW5nRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoInByaXZhdGUgRm9vIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5TXVsdGlwbGVWYXJpYWJsZURlY2xhcmF0aW9uc1BlckxpbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lID0gXCJiYXpcIikiKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb28sIGJhcjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aElkQW5kQmFzaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLkJBU0lDKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uIik7Ci0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uKG5hbWUgPSBcIkZPT1wiLCB0YWJsZSA9IFwiTVlfVEFCTEVcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aElkQ29sdW1uR2VuZXJhdGVkVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5DT0xVTU4sIEpQQS5JRCwgSlBBLkdFTkVSQVRFRF9WQUxVRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBHZW5lcmF0ZWRWYWx1ZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU11bHRpcGxlQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lID0gXCJGT09cIikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lID0gXCJCQVJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRlZFdpdGhBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREVELCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkZWQiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRlZFdpdGhBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERFRCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRlZCIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAQXR0cmlidXRlT3ZlcnJpZGVzKEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVtYmVkZGVkV2l0aEF0dHJpYnV0ZU92ZXJyaWRlc0VtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRURERUQsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkZWQiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEF0dHJpYnV0ZU92ZXJyaWRlcygpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVtYmVkZGVkV2l0aDJBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERFRCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRlZCIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiQkFSXCIpfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZVB1YmxpY0F0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgIHB1YmxpYyBTdHJpbmcgZm9vOyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVQYWNrYWdlQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgIFN0cmluZyBmb287Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZUZpbmFsQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZm9vOyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhQXR0cmlidXRlQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0eXBlUmVzb3VyY2UuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFBdHRyaWJ1dGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUF0dHJpYnV0ZUFubm90YXRpb25OdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdHlwZVJlc291cmNlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKSk7Ci0JfQotCi0JLy9UaGlzIHdpbGwgcmVzdWx0IGluIGEgY29tcGlsYXRpb24gZXJyb3IsIGJ1dCB3ZSBhc3N1bWUgdGhlIGZpcnN0IGNvbHVtbiBmb3VuZAotCXB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW50aXR5TXVsdGlwbGVDb2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW5SZXNvdXJjZSA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbHVtblJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0eXBlUmVzb3VyY2UuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENvbHVtbiIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdHlwZVJlc291cmNlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uUmVzb3VyY2UgPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJY29sdW1uUmVzb3VyY2Uuc2V0VGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSIsIGN1KTsKLQotCQljb2x1bW5SZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKG5hbWUiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ29sdW1uKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQXR0cmlidXRlTWFwcGluZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhJZEFuZEJhc2ljKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuQkFTSUMpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQkKLQkJSmF2YVJlc291cmNlTm9kZSBqYXZhQXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb24gPSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRUcnVlKGphdmFBdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbiBpbnN0YW5jZW9mIEJhc2ljQW5ub3RhdGlvbik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQmFzaWMiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASWQiLCBjdSk7Ci0JCQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5zZXRQcmltYXJ5QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlksIEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZSgpKTsKLQkJamF2YUF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uID0gcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUoamF2YUF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uIGluc3RhbmNlb2YgT25lVG9NYW55QW5ub3RhdGlvbik7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASWQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhc2ljIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SmF2YUF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0eXBlUmVzb3VyY2UuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoKSk7Ci0JCQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5zZXRQcmltYXJ5QW5ub3RhdGlvbihKUEEuSUQsIEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpIGluc3RhbmNlb2YgSWRBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBJZCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SmF2YUF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eVdpdGhDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdHlwZVJlc291cmNlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKCkpOwotCQkKLQkJcmVzb3VyY2VBdHRyaWJ1dGUuc2V0UHJpbWFyeUFubm90YXRpb24oSlBBLklELCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpIGluc3RhbmNlb2YgSWRBbm5vdGF0aW9uKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASWQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SmF2YUF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eVdpdGhJZENvbHVtbkdlbmVyYXRlZFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpIGluc3RhbmNlb2YgSWRBbm5vdGF0aW9uKTsKLQkJCi0JCXJlc291cmNlQXR0cmlidXRlLnNldFByaW1hcnlBbm5vdGF0aW9uKAotCQkJCUpQQS5CQVNJQywgCi0JCQkJQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10gewotCQkJCQlDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJCQkJR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRX0pKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpIGluc3RhbmNlb2YgQmFzaWNBbm5vdGF0aW9uKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASWQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAR2VuZXJhdGVkVmFsdWUiLCBjdSk7IC8vbm90IHN1cHBvcnRlZCBieSBCYXNpYwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbiIsIGN1KTsgLy9jb21tb24gYmV0d2VlbiBJZCBhbmQgQmFzaWMKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEphdmFBdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbk51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRDb2x1bW5HZW5lcmF0ZWRWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0eXBlUmVzb3VyY2UuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSBpbnN0YW5jZW9mIElkQW5ub3RhdGlvbik7Ci0JCQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5zZXRQcmltYXJ5QW5ub3RhdGlvbigKLQkJCQludWxsLCAKLQkJCQlBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7Ci0JCQkJCUNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQkJCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FfSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBJZCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBHZW5lcmF0ZWRWYWx1ZSIsIGN1KTsgLy9ub3Qgc3VwcG9ydGVkIGJ5IEJhc2ljCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uIiwgY3UpOyAvL2NvbW1vbiBiZXR3ZWVuIElkIGFuZCBCYXNpYwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRKYXZhQXR0cmlidXRlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ29sdW1uIiwgY3UpOwotCQlyZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbiIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUphdmFBdHRyaWJ1dGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdHlwZVJlc291cmNlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbiIsIGN1KTsKLQkJcmVzb3VyY2VBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDb2x1bW4iLCBjdSk7Ci0JfQotCQotCS8vdXBkYXRlIHNvdXJjZSBjb2RlIHRvIGNoYW5nZSBmcm9tIEBJZCB0byBAT25lVG9PbmUgYW5kIG1ha2Ugc3VyZSBAQ29sdW1uIGlzIG5vdCByZW1vdmVkCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUF0dHJpYnV0ZU1hcHBpbmdJblNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJZmluYWwgSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdHlwZVJlc291cmNlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlpZEZpZWxkKGN1KS5lZGl0KG5ldyBFZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlTb3VyY2VJZEFubm90YXRpb24uREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsJCQotCQkKLQkJY3UuY3JlYXRlSW1wb3J0KCJqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZSIsIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJaWRGaWVsZChjdSkuZWRpdChuZXcgRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJU291cmNlT25lVG9PbmVBbm5vdGF0aW9uLkRFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUi5uZXdNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7CQkKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhQXR0cmlidXRlQW5ub3RhdGlvbnNOZXN0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVtYmVkZGVkV2l0aEF0dHJpYnV0ZU92ZXJyaWRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdHlwZVJlc291cmNlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZShKUEEuQVRUUklCVVRFX09WRVJSSURFKSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEphdmFBdHRyaWJ1dGVBbm5vdGF0aW9uc05vTmVzdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0eXBlUmVzb3VyY2UuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEphdmFBdHRyaWJ1dGVBbm5vdGF0aW9uc0NvbnRhaW5lck5vTmVzdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbWJlZGRlZFdpdGhBdHRyaWJ1dGVPdmVycmlkZXNFbXB0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZShKUEEuQVRUUklCVVRFX09WRVJSSURFKSk7Ci0JfQotCQkJICAgICAgICAKLQkvLwkJCS0tPj4JQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9IkZPTyIpCi0JcHVibGljIHZvaWQgdGVzdEFkZEphdmFBdHRyaWJ1dGVBbm5vdGF0aW9uTmVzdGFibGVDb250YWluZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0eXBlUmVzb3VyY2UuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiKSIsIGN1KTsKLQl9Ci0JCi0JLy8gIEBFbWJlZGRlZCAgICAgCQkJCS0tPj4gICAgQEVtYmVkZGVkCi0JLy8JQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9IkZPTyIpCQlAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT0iRk9PIiksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPSJCQVIiKX0pCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRKYXZhQXR0cmlidXRlQW5ub3RhdGlvbk5lc3RhYmxlQ29udGFpbmVyMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVtYmVkZGVkV2l0aEF0dHJpYnV0ZU92ZXJyaWRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdHlwZVJlc291cmNlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHsgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKSB9KSIsIGN1KTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFUykpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpKTsKLQl9Ci0JCi0JLy8gIEBFbWJlZGRlZCAgICAgCQkJCQotCS8vCUBBdHRyaWJ1dGVPdmVycmlkZXMoQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9IkZPTyIpKQotCS8vICAgICAgICAgICB8fAotCS8vICAgICAgICAgICBcLwotCS8vICBARW1iZWRkZWQgICAgIAkJCQkKLQkvLwlAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT0iRk9PIiksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPSJCQVIiKX0pCi0JcHVibGljIHZvaWQgdGVzdEFkZEphdmFBdHRyaWJ1dGVBbm5vdGF0aW9uTmVzdGFibGVDb250YWluZXIzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW1iZWRkZWRXaXRoQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdHlwZVJlc291cmNlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIiksQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKX0pIiwgY3UpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkFUVFJJQlVURV9PVkVSUklERSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSmF2YUF0dHJpYnV0ZUFubm90YXRpb25OZXN0YWJsZUNvbnRhaW5lcjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbWJlZGRlZFdpdGhBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0eXBlUmVzb3VyY2UuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVJcIiksQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiKX0pIiwgY3UpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkFUVFJJQlVURV9PVkVSUklERSkpOwotCX0KLQotCS8vQEVudGl0eQotCS8vQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9IkZPTyIpCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUphdmFBdHRyaWJ1dGVBbm5vdGF0aW9uTmVzdGFibGVDb250YWluZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbWJlZGRlZFdpdGhBdHRyaWJ1dGVPdmVycmlkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJcmVzb3VyY2VBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQXR0cmlidXRlT3ZlcnJpZGUiLCBjdSk7Ci0JfQotCi0JLy9ARW1iZWRkZWQKLQkvL0BBdHRyaWJ1dGVPdmVycmlkZXMoQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiKSkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSmF2YUF0dHJpYnV0ZUFubm90YXRpb25OZXN0YWJsZUNvbnRhaW5lcjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbWJlZGRlZFdpdGhBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0eXBlUmVzb3VyY2UuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKYXZhQXR0cmlidXRlQW5ub3RhdGlvbkluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW1iZWRkZWRXaXRoMkF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJcmVzb3VyY2VBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiQkFSXCIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQXR0cmlidXRlT3ZlcnJpZGVzIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSmF2YUF0dHJpYnV0ZUFubm90YXRpb25JbmRleDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbWJlZGRlZFdpdGgyQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdHlwZVJlc291cmNlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbilyZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKDIsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQluZXdBbm5vdGF0aW9uLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKSwiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiQkFaXCIpfSkiLCBjdSk7Ci0JCQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBWlwiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUphdmFUeXBlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVtYmVkZGVkV2l0aDJBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0eXBlUmVzb3VyY2UuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbilyZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKDIsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQluZXdBbm5vdGF0aW9uLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKSwiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiQkFaXCIpfSkiLCBjdSk7Ci0JCQotCQkKLQkJcmVzb3VyY2VBdHRyaWJ1dGUubW92ZUFubm90YXRpb24oMCwgMiwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiQkFaXCIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIpLCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVJcIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVKYXZhVHlwZUFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW1iZWRkZWRXaXRoMkF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIG5ld0Fubm90YXRpb24gPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKDIsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQluZXdBbm5vdGF0aW9uLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKSwiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiQkFaXCIpfSkiLCBjdSk7Ci0JCQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVJcIiksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIiksIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBWlwiKX0pIiwgY3UpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aE5vblJlc29sdmluZ0ZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QuRm9vIiwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0VHlwZU5hbWUoKSk7IC8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKLQotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgidGVzdCIsICJGb28uamF2YSIsICJwdWJsaWMgY2xhc3MgRm9vIHt9Iik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInRlc3QuRm9vIiwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0VHlwZU5hbWUoKSk7Ci0JfQotCQotCS8vdGhpcyB0ZXN0cyB0aGF0IHdlIGhhbmRsZSBtdXRsaXBsZSB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgaW4gb25lIGxpbmUuCi0JLy9UaGUgYW5ub3RhdGlvbnMgc2hvdWxkIGFwcGx5IHRvIGFsbCBmaWVsZHMgZGVmaW5lZC4gIFRoaXMgaXMgbm90IHJlYWxseSBhIHVzZWZ1bAotCS8vdGhpbmcgdG8gZG8gd2l0aCBKUEEgYmV5b25kIHRoZSBtb3N0IGJhc2ljIHRoaW5ncyB0aGF0IHVzZSBkZWZhdWx0IGNvbHVtbiBuYW1lcwotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVZhcmlhYmxlRGVjbGFyYXRpb25zUGVyTGluZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eU11bHRpcGxlVmFyaWFibGVEZWNsYXJhdGlvbnNQZXJMaW5lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0eXBlUmVzb3VyY2UuZ2V0RmllbGRzKCkpKTsKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlRmllbGQ+IGZpZWxkcyA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gZmllbGRzLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIGNvbHVtbi5nZXROYW1lKCkpOwotCi0JCXJlc291cmNlRmllbGQgPSBmaWVsZHMubmV4dCgpOwotCQljb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIGNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNQdWJsaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlUHVibGljQXR0cmlidXRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIGF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydFRydWUoTW9kaWZpZXIuaXNQdWJsaWMoYXR0cmlidXRlLmdldE1vZGlmaWVycygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc1B1YmxpY0ZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZVBhY2thZ2VBdHRyaWJ1dGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgYXR0cmlidXRlID0gdHlwZVJlc291cmNlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RmFsc2UoTW9kaWZpZXIuaXNQdWJsaWMoYXR0cmlidXRlLmdldE1vZGlmaWVycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzRmluYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlRmluYWxBdHRyaWJ1dGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgYXR0cmlidXRlID0gdHlwZVJlc291cmNlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShNb2RpZmllci5pc0ZpbmFsKGF0dHJpYnV0ZS5nZXRNb2RpZmllcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNGaW5hbEZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZVBhY2thZ2VBdHRyaWJ1dGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgYXR0cmlidXRlID0gdHlwZVJlc291cmNlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RmFsc2UoTW9kaWZpZXIuaXNGaW5hbChhdHRyaWJ1dGUuZ2V0TW9kaWZpZXJzKCkpKTsKLQl9Ci0JCi0JLy9UT0RPIGFkZCB0ZXN0cyBmb3IgSlBUVG9vbHMgc3RhdGljIG1ldGhvZHMKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3MDE1NC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlUGFja2FnZUluZm9Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVR5cGVDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk51bGxBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlSW5mb0NvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmNvbW1hbmQuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CaXRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlCi0JCWV4dGVuZHMgQW5ub3RhdGlvblRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIEphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIgamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLQkKLQkKLQlwdWJsaWMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5qYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyID0gbmV3IEphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIoKTsKLQkJSmF2YUNvcmUuYWRkRWxlbWVudENoYW5nZWRMaXN0ZW5lcih0aGlzLmphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQlKYXZhQ29yZS5yZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMuamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lciA9IG51bGw7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgSmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcgotCQkJaW1wbGVtZW50cyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciB7Ci0JCQotCQlKYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgZWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQkJSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZS50aGlzLmphdmFFbGVtZW50Q2hhbmdlZChldmVudCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBqYXZhRWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5qYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuc3luY1dpdGhKYXZhRGVsdGEoZXZlbnQuZ2V0RGVsdGEoKSk7Ci0JfQotCQotCS8qKgotCSAqIE5COiB0aGlzIGlzIGNvcGllZCBmcm9tIEdlbmVyaWNKcGFQcm9qZWN0LCBzbyBpdCBtaWdodCBuZWVkIHRvIGJlCi0JICoga2VwdCBpbiBzeW5jaCB3aXRoIHRoYXQgY29kZSBpZiBpdCBjaGFuZ2VzLi4uIHllY2guLi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jV2l0aEphdmFEZWx0YShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlzd2l0Y2ggKGRlbHRhLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX01PREVMIDoKLQkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCA6Ci0JCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QgOgotCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCA6Ci0JCQkJdGhpcy5zeW5jV2l0aEphdmFEZWx0YUNoaWxkcmVuKGRlbHRhKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQgOgotCQkJCXRoaXMuamF2YUNvbXBpbGF0aW9uVW5pdENoYW5nZWQoZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7IC8vIGlnbm9yZSB0aGUgZWxlbWVudHMgaW5zaWRlIGEgY29tcGlsYXRpb24gdW5pdAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY1dpdGhKYXZhRGVsdGFDaGlsZHJlbihJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlmb3IgKElKYXZhRWxlbWVudERlbHRhIGNoaWxkIDogZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpKSB7Ci0JCQl0aGlzLnN5bmNXaXRoSmF2YURlbHRhKGNoaWxkKTsgLy8gcmVjdXJzZQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgamF2YUNvbXBpbGF0aW9uVW5pdENoYW5nZWQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaWYgKHRoaXMuZGVsdGFJc1JlbGV2YW50KGRlbHRhKSkgewotCQkJdGhpcy5qYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuc3luY2hyb25pemVXaXRoSmF2YVNvdXJjZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVsdGFJc1JlbGV2YW50KElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmIChCaXRUb29scy5vbmx5RmxhZ0lzU2V0KGRlbHRhLmdldEZsYWdzKCksIElKYXZhRWxlbWVudERlbHRhLkZfUFJJTUFSWV9XT1JLSU5HX0NPUFkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycyhTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGFubm90YXRpb25Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KHBhY2thZ2VOYW1lLCBhbm5vdGF0aW9uTmFtZSArICIuamF2YSIsICJwdWJsaWMgQGludGVyZmFjZSAiICsgYW5ub3RhdGlvbk5hbWUgKyAiIHsgIiArIGFubm90YXRpb25Cb2R5ICsgIiB9Iik7Ci0JfQotCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUVudW1BbmRNZW1iZXJzKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGVudW1OYW1lLCBTdHJpbmcgZW51bUJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQocGFja2FnZU5hbWUsIGVudW1OYW1lICsgIi5qYXZhIiwgInB1YmxpYyBlbnVtICIgKyBlbnVtTmFtZSArICIgeyAiICsgZW51bUJvZHkgKyAiIH0iKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBhY2thZ2UgYnVpbGRKYXZhUmVzb3VyY2VQYWNrYWdlKElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJSmF2YVJlc291cmNlUGFja2FnZUluZm9Db21waWxhdGlvblVuaXQgcGtnQ3UgPSAKLQkJCQluZXcgU291cmNlUGFja2FnZUluZm9Db21waWxhdGlvblVuaXQoCi0JCQkJCQljdSwKLQkJCQkJCXRoaXMuYnVpbGRBbm5vdGF0aW9uUHJvdmlkZXIoKSwKLQkJCQkJCU51bGxBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpLAotCQkJCQkJQ29tbWFuZEV4ZWN1dG9yLkRlZmF1bHQuaW5zdGFuY2UoKSk7Ci0JCXRoaXMuamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0ID0gcGtnQ3U7Ci0JCXJldHVybiBwa2dDdS5nZXRQYWNrYWdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVR5cGUgYnVpbGRKYXZhUmVzb3VyY2VUeXBlKElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJdGhpcy5qYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgPSB0aGlzLmJ1aWxkSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KGN1KTsKLQkJdGhpcy5qYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQucmVzb2x2ZVR5cGVzKCk7Ci0JCXJldHVybiB0aGlzLmhhY2tKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVR5cGUgaGFja0phdmFSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiAoSmF2YVJlc291cmNlVHlwZSkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUodGhpcy5qYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQsICJwcmltYXJ5VHlwZSIpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgYnVpbGRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlpZiAodGhpcy5qYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiBuZXcgU291cmNlVHlwZUNvbXBpbGF0aW9uVW5pdCgKLQkJCWN1LAotCQkJdGhpcy5idWlsZEFubm90YXRpb25Qcm92aWRlcigpLAotCQkJTnVsbEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCksCi0JCQlDb21tYW5kRXhlY3V0b3IuRGVmYXVsdC5pbnN0YW5jZSgpCi0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb25Qcm92aWRlciBidWlsZEFubm90YXRpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKcGFBbm5vdGF0aW9uUHJvdmlkZXIodGhpcy5hbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyIGFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBHZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVR5cGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlVHlwZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMmVlNzQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlVHlwZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50LkVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVtYmVkZGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFbnRpdHlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmEuSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmF2YVJlc291cmNlVHlwZVRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEphdmFSZXNvdXJjZVR5cGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0SW52YWxpZEFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPigiamF2YXgucGVyc2lzdGVuY2UuRm9vIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEZvbyIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEZvbyIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNZW1iZXJFbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuRU1CRUREQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZE1lbWJlclR5cGVUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIEBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb28geyB9IikuYXBwZW5kKENSKTsKLQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUR1cGxpY2F0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkobmFtZSA9IFwiRmlyc3RFbnRpdHlcIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eShuYW1lID0gXCJTZWNvbmRFbnRpdHlcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkVNQkVEREFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0KLS8vCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5TGFyZ2UoZmluYWwgaW50IGkpIHRocm93cyBFeGNlcHRpb24gewotLy8JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLS8vCQkJQE92ZXJyaWRlCi0vLwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0vLwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZICsgaSk7Ci0vLwkJCX0KLS8vCQkJQE92ZXJyaWRlCi0vLwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotLy8JCQkJc2IuYXBwZW5kKCJARW50aXR5IiArIGkpOwotLy8JCQkJc2IuYXBwZW5kKENSKTsKLS8vCQkJfQotLy8JCQlAT3ZlcnJpZGUKLS8vCQkJcHVibGljIFN0cmluZyB0eXBlTmFtZSgpIHsKLS8vCQkJCXJldHVybiBUWVBFX05BTUUgKyBpOwotLy8JCQl9Ci0vLwkJfSk7Ci0vLwl9Ci0vLwotLy8JcHVibGljIHZvaWQgdGVzdExhcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJZm9yIChpbnQgaSA9IFNUQVJUOyBpIDw9IEVORDsgaSsrKSB7Ci0vLwkJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIgK2ksICJTdHJpbmcgbmFtZSgpOyIpOwotLy8JCX0KLS8vCi0vLwkJTGlzdDxJQ29tcGlsYXRpb25Vbml0PiBjdXMgPSBuZXcgQXJyYXlMaXN0PElDb21waWxhdGlvblVuaXQ+KCk7Ci0vLwkJZm9yIChpbnQgaSA9IFNUQVJUOyBpIDw9IEVORDsgaSsrKSB7Ci0vLwkJCWN1cy5hZGQoY3JlYXRlVGVzdEVudGl0eUxhcmdlKGkpKTsKLS8vCQl9Ci0vLwkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotLy8JCUxpc3Q8SmF2YVBlcnNpc3RlbnRyZXNvdXJjZVR5cGU+IHJlc291cmNlVHlwZXMgPSBuZXcgQXJyYXlMaXN0PEphdmFQZXJzaXN0ZW50cmVzb3VyY2VUeXBlPigpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgRU5EOyBpKyspIHsKLS8vCQkJcmVzb3VyY2VUeXBlcy5hZGQoYnVpbGRKYXZhcmVzb3VyY2VUeXBlKGN1cy5nZXQoaSkpKTsgCi0vLwkJfQotLy8JCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0vLwkJCi0vLwkJU3lzdGVtLm91dC5wcmludGxuKGVuZC1zdGFydCArICJtcyIpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgRU5EOyBpKyspIHsKLS8vCQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlVHlwZXMuZ2V0KGkpLmphdmFUeXBlTWFwcGluZ0Fubm90YXRpb25zKCkpKTsKLS8vCQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGVzLmdldChpKS5qYXZhVHlwZU1hcHBpbmdBbm5vdGF0aW9uKEpQQS5FTlRJVFkgKyAoaSsxKSkpOwotLy8JCX0KLS8vCQkKLS8vCi0vLy8vCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VUeXBlLmphdmFUeXBlQW5ub3RhdGlvbnMoKSkpOwotLy8JfQotCi0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5UQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGUobmFtZSA9IFwiRk9PXCIsIHNjaGVtYSA9IFwiQkFSXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLS8vCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlQW5kSWRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLS8vCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJUYWJsZSIsICJTdHJpbmcgbmFtZSgpOyBTdHJpbmcgc2NoZW1hKCk7Iik7Ci0vLwkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSWRDbGFzcyIsICJDbGFzcyB2YWx1ZSgpOyIpOwotLy8JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLS8vCQkJQE92ZXJyaWRlCi0vLwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0vLwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVEFCTEUsIEpQQS5JRF9DTEFTUyk7Ci0vLwkJCX0KLS8vCQkJQE92ZXJyaWRlCi0vLwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotLy8JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0vLwkJCQlzYi5hcHBlbmQoQ1IpOwotLy8JCQkJc2IuYXBwZW5kKCJAVGFibGUiKTsKLS8vCQkJCXNiLmFwcGVuZChDUik7Ci0vLwkJCQlzYi5hcHBlbmQoIkBJZENsYXNzIik7Ci0vLwkJCX0KLS8vCQl9KTsKLS8vCX0KLS8vCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlNdWx0aXBsZVRhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlRBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZShuYW1lID0gXCJGT09cIikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFRhYmxlKG5hbWUgPSBcIkJBUlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbXB0eVNlY29uZGFyeVRhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlcygpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoMlNlY29uZGFyeVRhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkZPT1wiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBUlwiKX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE1lbWJlclR5cGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZE1lbWJlclR5cGVUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIHN0YXRpYyBjbGFzcyBGb29TdGF0aWMge30iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIGNsYXNzIEZvb05vdFN0YXRpYyB7fSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgQGludGVyZmFjZSBNeUFubm90YXRpb24ge30iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIGVudW0gTXlFbnVtIHt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhVHlwZUFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YVR5cGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhVHlwZUFubm90YXRpb25OdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSkpOwotCX0KLQotCS8vVGhpcyB3aWxsIHJlc3VsdCBpbiBhIGNvbXBpbGF0aW9uIGVycm9yLCBidXQgd2UgYXNzdW1lIHRoZSBmaXJzdCB0YWJsZSBmb3VuZAotCXB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW50aXR5TXVsdGlwbGVUYWJsZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlUYWJsZUFubm90YXRpb24gdGFibGVSZXNvdXJjZSA9IChUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVUYWJsZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0KLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlQW5ub3RhdGlvbiA9IChUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCXRhYmxlQW5ub3RhdGlvbi5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUobmFtZSA9IFwiRk9PXCIpIiwgY3UpOwotCi0JCXRhYmxlQW5ub3RhdGlvbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKG5hbWUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVR5cGVNYXBwaW5ncygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGUoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRU1CRUREQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5FTlRJVFkpKTsKLQkJCi0JCUphdmFSZXNvdXJjZU5vZGUgamF2YVR5cGVNYXBwaW5nQW5ub3RhdGlvbiA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGVNYXBwaW5nQW5ub3RhdGlvbiBpbnN0YW5jZW9mIEVtYmVkZGFibGVBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBFbnRpdHkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARW1iZWRkYWJsZSIsIGN1KTsKLQkJCi0JCXJlc291cmNlVHlwZS5zZXRQcmltYXJ5QW5ub3RhdGlvbihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoKSk7Ci0JCWphdmFUeXBlTWFwcGluZ0Fubm90YXRpb24gPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRUcnVlKGphdmFUeXBlTWFwcGluZ0Fubm90YXRpb24gaW5zdGFuY2VvZiBNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbik7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJARW50aXR5IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcHBlZFN1cGVyY2xhc3MiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJARW1iZWRkYWJsZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEphdmFUeXBlTWFwcGluZ0Fubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUuc2V0UHJpbWFyeUFubm90YXRpb24oSlBBLkVOVElUWSwgRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSBpbnN0YW5jZW9mIEVudGl0eUFubm90YXRpb24pOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEVudGl0eSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSmF2YVR5cGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGUiLCBjdSk7Ci0JCXJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKYXZhVHlwZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlIiwgY3UpOwotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlIiwgY3UpOwotCX0KLQkKLQkvL3VwZGF0ZSBzb3VyY2UgY29kZSB0byBjaGFuZ2UgZnJvbSBARW50aXR5IHRvIEBFbWJlZGRhYmxlIGFuZCBtYWtlIHN1cmUgQFRhYmxlIGlzIG5vdCByZW1vdmVkCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZVR5cGVNYXBwaW5nSW5Tb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKTsKLQkJZmluYWwgSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJdGVzdFR5cGUoY3UpLmVkaXQobmV3IEVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCVNvdXJjZUVudGl0eUFubm90YXRpb24uREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsJCi0KLQkJY3UuY3JlYXRlSW1wb3J0KCJqYXZheC5wZXJzaXN0ZW5jZS5FbWJlZGRhYmxlIiwgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCi0JCXRoaXMudGVzdFR5cGUoY3UpLmVkaXQobmV3IEVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCVNvdXJjZUVtYmVkZGFibGVBbm5vdGF0aW9uLkRFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUi5uZXdNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7CQkKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkVOVElUWSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5FTUJFRERBQkxFKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhVHlwZUFubm90YXRpb25zTmVzdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLlNFQ09OREFSWV9UQUJMRSkpOwotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLlNFQ09OREFSWV9UQUJMRSkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEphdmFUeXBlQW5ub3RhdGlvbnNOb05lc3RhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5TRUNPTkRBUllfVEFCTEUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEphdmFUeXBlQW5ub3RhdGlvbnNDb250YWluZXJOb05lc3RhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aEVtcHR5U2Vjb25kYXJ5VGFibGVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5TRUNPTkRBUllfVEFCTEUpKTsKLQl9Ci0JCi0JLy8gIEBFbnRpdHkgICAgIC0tPj4gICAgQEVudGl0eQotCS8vCQkJCQkJQFNlY29uZGFyeVRhYmxlKG5hbWU9IkZPTyIpCi0JcHVibGljIHZvaWQgdGVzdEFkZEphdmFUeXBlQW5ub3RhdGlvbk5lc3RhYmxlQ29udGFpbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIikiLCBjdSk7Ci0JfQotCQotCS8vICBARW50aXR5ICAgICAJCQkJLS0+PiAgICBARW50aXR5Ci0JLy8JQFNlY29uZGFyeVRhYmxlKG5hbWU9IkZPTyIpCQkJQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWU9IkZPTyIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZT0iQkFSIil9KQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSmF2YVR5cGVBbm5vdGF0aW9uTmVzdGFibGVDb250YWluZXIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2Uuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHsgQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkZPT1wiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBUlwiKSB9KSIsIGN1KTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShKUEEuU0VDT05EQVJZX1RBQkxFKSk7Ci0JfQotCQotCS8vICBARW50aXR5ICAgICAJCQkJCi0JLy8JQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUobmFtZT0iRk9PIikpCi0JLy8gICAgICAgICAgIHx8Ci0JLy8gICAgICAgICAgIFwvCi0JLy8gIEBFbnRpdHkgICAgIAkJCQkKLQkvLwlAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZT0iRk9PIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lPSJCQVIiKX0pCi0JcHVibGljIHZvaWQgdGVzdEFkZEphdmFUeXBlQW5ub3RhdGlvbk5lc3RhYmxlQ29udGFpbmVyMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIiksQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBUlwiKX0pIiwgY3UpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5TRUNPTkRBUllfVEFCTEUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEphdmFUeXBlQW5ub3RhdGlvbk5lc3RhYmxlQ29udGFpbmVyNSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVJcIiksQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkZPT1wiKX0pIiwgY3UpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5TRUNPTkRBUllfVEFCTEUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSmF2YVR5cGVBbm5vdGF0aW9uTmVzdGFibGVDb250YWluZXI2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBUlwiKSxAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIpfSkiLCBjdSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLlNFQ09OREFSWV9UQUJMRSkpOwotCi0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVpcIiksQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBUlwiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkZPT1wiKX0pIiwgY3UpOwotCi0JCWFzc2VydEVxdWFscygzLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5TRUNPTkRBUllfVEFCTEUpKTsKLQl9Ci0KLQotCS8vQEVudGl0eQotCS8vQFNlY29uZGFyeVRhYmxlKG5hbWU9IkZPTyIpCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUphdmFUeXBlQW5ub3RhdGlvbk5lc3RhYmxlQ29udGFpbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlY29uZGFyeVRhYmxlIiwgY3UpOwotCX0KLQkKLQotCS8vQEVudGl0eQotCS8vQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUobmFtZT0iRk9PIikpCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUphdmFUeXBlQW5ub3RhdGlvbk5lc3RhYmxlQ29udGFpbmVyMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIpIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUphdmFUeXBlQW5ub3RhdGlvbkluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aDJTZWNvbmRhcnlUYWJsZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFSXCIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2Vjb25kYXJ5VGFibGVzIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSmF2YVR5cGVBbm5vdGF0aW9uSW5kZXgyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aDJTZWNvbmRhcnlUYWJsZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gbmV3QW5ub3RhdGlvbiA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMiwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCW5ld0Fubm90YXRpb24uc2V0TmFtZSgiQkFaIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFSXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFaIiwgY3UpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFaXCIpfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSmF2YVR5cGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aDJTZWNvbmRhcnlUYWJsZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gbmV3QW5ub3RhdGlvbiA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMiwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCW5ld0Fubm90YXRpb24uc2V0TmFtZSgiQkFaIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFSXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFaXCIpfSkiLCBjdSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMCwgMiwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFaXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFSXCIpfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSmF2YVR5cGVBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eVdpdGgyU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIG5ld0Fubm90YXRpb24gPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKXJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDIsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQluZXdBbm5vdGF0aW9uLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkZPT1wiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBUlwiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBWlwiKX0pIiwgY3UpOwotCQkKLQkJcmVzb3VyY2VUeXBlLm1vdmVBbm5vdGF0aW9uKDIsIDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBUlwiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBWlwiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkZPT1wiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTWVtYmVyVHlwZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJvbmx5IG5vdCBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIHNob3VsZCBiZSByZXR1cm5lZCBieSAjZ2V0VHlwZXMoKSIsIDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlVHlwZS5nZXRUeXBlcygpKSk7Ci0JCWFzc2VydEVxdWFscygib25seSBlbnVtcyBzaG91bGQgYmUgcmV0dXJuZWQgYnkgI2dldEVudW1zKCkiLCAxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZVR5cGUuZ2V0RW51bXMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlRW50aXR5QW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlEdXBsaWNhdGVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVudGl0eUFubm90YXRpb24gamF2YVR5cGVNYXBwaW5nQW5ub3RhdGlvbiA9IChFbnRpdHlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRU5USVRZKTsKLQkJYXNzZXJ0RXF1YWxzKCJGaXJzdEVudGl0eSIsIGphdmFUeXBlTWFwcGluZ0Fubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKCkpOwotCQkKLQkJamF2YVR5cGVNYXBwaW5nQW5ub3RhdGlvbiA9IChFbnRpdHlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiRmlyc3RFbnRpdHkiLCBqYXZhVHlwZU1hcHBpbmdBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUT0RPCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gVE9ETwkKLQl9Ci0JCi0JCi0JLy9UT0RPIG1vcmUgdGVzdHMgaGVyZSB3aXRoIHN1cGVyY2xhc3NlcyBvdGhlciB0aGFuIE9iamVjdC4KLQkvLzEuIFRlc3Qgd2hlcmUgdGhlIHN1cGVyY2xhc3MgZG9lcyBub3QgcmVzb2x2ZQotCS8vMi4gVGVzdCBhIHN1cGVyY2xhc3MgdGhhdCBkb2VzIHJlc29sdmUKLQkvLzMuIFdoYXQgYWJvdXQgYSBzdXBlcmNsYXNzIHRoYXQgaXMgYSBjbGFzcyBmaWxlIGluIGEgamFyPz8KLQkvLzQuCi0JcHVibGljIHZvaWQgdGVzdEdldFN1cGVyY2xhc3NRdWFsaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIHJlc291cmNlVHlwZS5nZXRTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSgpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0Fubm90YXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKHJlc291cmNlVHlwZS5pc0Fubm90YXRlZCgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5FTlRJVFkpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZVR5cGUuaXNBbm5vdGF0ZWQoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlVHlwZS5pc0Fubm90YXRlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGVkTWVtYmVyVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aE1lbWJlckVtYmVkZGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5FTlRJVFkpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRU1CRUREQUJMRSkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSBuZXN0ZWRUeXBlID0gcmVzb3VyY2VUeXBlLmdldFR5cGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwobmVzdGVkVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5FTlRJVFkpKTsKLQkJYXNzZXJ0Tm90TnVsbChuZXN0ZWRUeXBlLmdldEFubm90YXRpb24oSlBBLkVNQkVEREFCTEUpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEludmFsaWRBbm5vdGF0aW9ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pbkNvbHVtblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU3MGFiOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpvaW5Db2x1bW5UZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fTkFNRSA9ICJNWV9DT0xVTU4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fVEFCTEUgPSAiTVlfVEFCTEUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gPSAiQ09MVU1OX0RFRklOSVRJT04iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9ICJNWV9SRUZfQ09MVU1OX05BTUUiOwotCQotCXB1YmxpYyBKb2luQ29sdW1uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luQ29sdW1uIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkpPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkNvbHVtbihuYW1lID0gXCIiICsgQ09MVU1OX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW4odGFibGUgPSBcIiIgKyBDT0xVTU5fVEFCTEUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW4ocmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIiIgKyBDT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luQ29sdW1uKGNvbHVtbkRlZmluaXRpb24gPSBcIiIgKyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoZmluYWwgU3RyaW5nIGJvb2xlYW5FbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW4oIiArIGJvb2xlYW5FbGVtZW50ICsgIiA9IHRydWUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVuaXF1ZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJY29sdW1uLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1uKG5hbWUgPSBcIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJY29sdW1uLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKG5hbWUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX1RBQkxFLCBjb2x1bW4uZ2V0VGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQljb2x1bW4uc2V0VGFibGUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbih0YWJsZSA9IFwiRm9vXCIpIiwgY3UpOwotCi0JCQotCQljb2x1bW4uc2V0VGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIodGFibGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUUsIGNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCWNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1uKHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJGb29cIikiLCBjdSk7Ci0KLQkJCi0JCWNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luQ29sdW1uKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhDb2x1bW5EZWZpbml0aW9uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04sIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCi0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbihjb2x1bW5EZWZpbml0aW9uID0gXCJGb29cIikiLCBjdSk7Ci0KLQkJCi0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKGNvbHVtbkRlZmluaXRpb24iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhCb29sZWFuRWxlbWVudCgidW5pcXVlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldFVuaXF1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VW5pcXVlKCkpOwotCi0JCWNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0VW5pcXVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1uKHVuaXF1ZSA9IGZhbHNlKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXRVbmlxdWUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhCb29sZWFuRWxlbWVudCgibnVsbGFibGUiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROdWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldE51bGxhYmxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldE51bGxhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbnNlcnRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJpbnNlcnRhYmxlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldEluc2VydGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbnNlcnRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldEluc2VydGFibGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW4oaW5zZXJ0YWJsZSA9IGZhbHNlKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXRJbnNlcnRhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VXBkYXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJ1cGRhdGFibGUiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VXBkYXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW4odXBkYXRhYmxlID0gZmFsc2UpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldFVwZGF0YWJsZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luQ29sdW1uKCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNTY4YTUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pbkNvbHVtbnNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpvaW5Db2x1bW5zVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05BTUUgPSAiTVlfQ09MVU1OIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX1RBQkxFID0gIk1ZX1RBQkxFIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OID0gIkNPTFVNTl9ERUZJTklUSU9OIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgPSAiTVlfUkVGX0NPTFVNTl9OQU1FIjsKLQkKLQlwdWJsaWMgSm9pbkNvbHVtbnNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbihuYW1lID0gXCIiICsgQ09MVU1OX05BTUUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbih0YWJsZSA9IFwiIiArIENPTFVNTl9UQUJMRSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCIiICsgQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKGNvbHVtbkRlZmluaXRpb24gPSBcIiIgKyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KGZpbmFsIFN0cmluZyBib29sZWFuRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbigiICsgYm9vbGVhbkVsZW1lbnQgKyAiID0gdHJ1ZSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQXQoSmF2YVJlc291cmNlTWVtYmVyIHJlc291cmNlTWVtYmVyLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChKb2luQ29sdW1uQW5ub3RhdGlvbikgQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZU1lbWJlci5nZXRBbm5vdGF0aW9ucyhKUEEuSk9JTl9DT0xVTU4pLCBpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLmpvaW5Db2x1bW5BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLmpvaW5Db2x1bW5BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLmpvaW5Db2x1bW5BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJY29sdW1uLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbihuYW1lID0gXCJGb29cIikpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLmpvaW5Db2x1bW5BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJY29sdW1uLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gdGhpcy5qb2luQ29sdW1uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fVEFCTEUsIGNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMuam9pbkNvbHVtbkF0KHJlc291cmNlRmllbGQsIDApOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldFRhYmxlKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKHRhYmxlID0gXCJGb29cIikpIiwgY3UpOwotCi0JCQotCQljb2x1bW4uc2V0VGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLmpvaW5Db2x1bW5BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLmpvaW5Db2x1bW5BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCWNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbihyZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiRm9vXCIpKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gdGhpcy5qb2luQ29sdW1uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04sIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLmpvaW5Db2x1bW5BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0KLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbihjb2x1bW5EZWZpbml0aW9uID0gXCJGb29cIikpIiwgY3UpOwotCi0JCQotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luQ29sdW1uKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJ1bmlxdWUiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gdGhpcy5qb2luQ29sdW1uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0KLQkJYXNzZXJ0VHJ1ZShjb2x1bW4uZ2V0VW5pcXVlKCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLmpvaW5Db2x1bW5BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVuaXF1ZSgpKTsKLQotCQljb2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShjb2x1bW4uZ2V0VW5pcXVlKCkuYm9vbGVhblZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbih1bmlxdWUgPSBmYWxzZSkpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldFVuaXF1ZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luQ29sdW1uKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJudWxsYWJsZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLmpvaW5Db2x1bW5BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQlhc3NlcnRUcnVlKGNvbHVtbi5nZXROdWxsYWJsZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLmpvaW5Db2x1bW5BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE51bGxhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoY29sdW1uLmdldE51bGxhYmxlKCkuYm9vbGVhblZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbihudWxsYWJsZSA9IGZhbHNlKSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0TnVsbGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoImluc2VydGFibGUiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gdGhpcy5qb2luQ29sdW1uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0KLQkJYXNzZXJ0VHJ1ZShjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMuam9pbkNvbHVtbkF0KHJlc291cmNlRmllbGQsIDApOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQotCQljb2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoY29sdW1uLmdldEluc2VydGFibGUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKGluc2VydGFibGUgPSBmYWxzZSkpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldEluc2VydGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoInVwZGF0YWJsZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLmpvaW5Db2x1bW5BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQlhc3NlcnRUcnVlKGNvbHVtbi5nZXRVcGRhdGFibGUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMuam9pbkNvbHVtbkF0KHJlc291cmNlRmllbGQsIDApOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKGNvbHVtbi5nZXRVcGRhdGFibGUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKHVwZGF0YWJsZSA9IGZhbHNlKSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0VXBkYXRhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSm9pbkNvbHVtbkNvcHlFeGlzdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVN0cmluZyBleHBlY3RlZDEgPSAiQEpvaW5Db2x1bW5zKHsiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCI7Ci0JCVN0cmluZyBleHBlY3RlZDMgPSAiQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpIH0pIjsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0JCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRKb2luQ29sdW1uVG9CZWdpbm5pbmdPZkxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBKb2luQ29sdW1ucyh7IjsKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwiOwotCQlTdHJpbmcgZXhwZWN0ZWQzID0gIkBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSB9KSI7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigxLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCQkJCQotCQlleHBlY3RlZDIgPSAiQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFaXCIpLCI7Ci0JCWV4cGVjdGVkMyA9ICJASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpIH0pIjsKLQkJam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiQkFaIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0KLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkpPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnRFcXVhbHMoMywgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSm9pbkNvbHVtbkNvcHlFeGlzdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVN0cmluZyBleHBlY3RlZDEgPSAiQEpvaW5Db2x1bW5zKHsiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCI7Ci0JCVN0cmluZyBleHBlY3RlZDMgPSAiQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpIH0pIjsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0JCQotCQlleHBlY3RlZDEgPSAiQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIikiOwotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMSwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pbkNvbHVtbnMiLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luVGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pblRhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJmYjhhYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luVGFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luVGFibGVBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKb2luVGFibGVUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FID0gIk1ZX1RBQkxFIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX05BTUUgPSAiTVlfU0NIRU1BIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUQUxPR19OQU1FID0gIk1ZX0NBVEFMT0ciOwotCQotCXB1YmxpYyBKb2luVGFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5KT0lOX1RBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pblRhYmxlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSk9JTl9UQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5UYWJsZShuYW1lID0gXCIiICsgVEFCTEVfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pblRhYmxlV2l0aFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkpPSU5fVEFCTEUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5UYWJsZShzY2hlbWEgPSBcIiIgKyBTQ0hFTUFfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pblRhYmxlV2l0aENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5KT0lOX1RBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pblRhYmxlKGNhdGFsb2cgPSBcIiIgKyBDQVRBTE9HX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkpPSU5fVEFCTEUsIEpQQS5VTklRVUVfQ09OU1RSQUlOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pblRhYmxlV2l0aEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSk9JTl9UQUJMRSwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW59KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luVGFibGVXaXRoSW52ZXJzZUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSk9JTl9UQUJMRSwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pblRhYmxlKGludmVyc2VKb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBKb2luQ29sdW1ufSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnRFcXVhbHMoVEFCTEVfTkFNRSwgdGFibGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXROYW1lKCkpOwotCi0JCXRhYmxlLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShuYW1lID0gXCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIHRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQl0YWJsZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5UYWJsZSgiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhDYXRhbG9nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnRFcXVhbHMoQ0FUQUxPR19OQU1FLCB0YWJsZS5nZXRDYXRhbG9nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0Q2F0YWxvZygpKTsKLQotCQl0YWJsZS5zZXRDYXRhbG9nKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB0YWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoY2F0YWxvZyA9IFwiRm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2F0YWxvZ051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhDYXRhbG9nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhDQVRBTE9HX05BTUUsIHRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQl0YWJsZS5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5UYWJsZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydEVxdWFscyhTQ0hFTUFfTkFNRSwgdGFibGUuZ2V0U2NoZW1hKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRTY2hlbWEoKSk7Ci0KLQkJdGFibGUuc2V0U2NoZW1hKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShzY2hlbWEgPSBcIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNjaGVtYU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKFNDSEVNQV9OQU1FLCB0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQl0YWJsZS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luVGFibGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0KLQkJCi0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQkKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDIpLmdldENvbHVtbk5hbWVzU2l6ZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiQkFSXCIpLEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJGT09cIiksIEBVbmlxdWVDb25zdHJhaW50fSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7CQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSl9KSIsIGN1KTsKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7CQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSkpIiwgY3UpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsJCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5UYWJsZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSl9KSIsIGN1KTsKLQkJCi0JCXRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAyKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbnMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQotCQkKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigwKTsKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1uczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCQotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDEpOwotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSxASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVKb2luQ29sdW1uKDEpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0KLQkJdGFibGUucmVtb3ZlSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbikiLCBjdSk7Ci0KLQkJCi0JCXRhYmxlLnJlbW92ZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pblRhYmxlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLmpvaW5Db2x1bW5BdCgwKTsKLQkJam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGX05BTUUiKTsKLQkJam9pbkNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqb2luQ29sdW1uLnNldFRhYmxlKCJUQUJMRSIpOwotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQotCQl0YWJsZS5tb3ZlSm9pbkNvbHVtbigyLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUuam9pbkNvbHVtbkF0KDApOwotCQlqb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZfTkFNRSIpOwotCQlqb2luQ29sdW1uLnNldFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWpvaW5Db2x1bW4uc2V0VGFibGUoIlRBQkxFIik7Ci0JCQotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQotCi0JCXRhYmxlLm1vdmVKb2luQ29sdW1uKDAsIDIpOwotCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Sm9pbkNvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLmpvaW5Db2x1bW5BdCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJmb29cIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmVyc2VKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEludmVyc2VKb2luQ29sdW1uczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCi0JCQotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJdGFibGUuYWRkSW52ZXJzZUpvaW5Db2x1bW4oMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEludmVyc2VKb2luQ29sdW1uczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJCi0JCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigxKTsKLQkJdGFibGUuYWRkSW52ZXJzZUpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuaW52ZXJzZUpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmludmVyc2VKb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSxASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJbnZlcnNlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aEludmVyc2VKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigyKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCUl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShpbnZlcnNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCXRhYmxlLnJlbW92ZUludmVyc2VKb2luQ29sdW1uKDEpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIil9KSIsIGN1KTsKLQkJaW52ZXJzZUpvaW5Db2x1bW5zID0gdGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShpbnZlcnNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQl0YWJsZS5yZW1vdmVJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpKSIsIGN1KTsKLQkJaW52ZXJzZUpvaW5Db2x1bW5zID0gdGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJdGFibGUucmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pblRhYmxlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVJbnZlcnNlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aEludmVyc2VKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCUl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQkKLQkJdGFibGUubW92ZUludmVyc2VKb2luQ29sdW1uKDIsIDApOwotCQlpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUludmVyc2VKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aEludmVyc2VKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigxKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCUl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQkKLQkJdGFibGUubW92ZUludmVyc2VKb2luQ29sdW1uKDAsIDIpOwotCQlpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKGludmVyc2VKb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEludmVyc2VKb2luQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aEludmVyc2VKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSB0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlqb2luQ29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKGludmVyc2VKb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJmb29cIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZTc1OGMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OwotCi1wdWJsaWMgY2xhc3MgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZQotCQlleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX1BFUlNJU1RFTkNFX1BBQ0tBR0VfTkFNRSA9ICJqYXZheC5wZXJzaXN0ZW5jZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlwdWJsaWMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5qYXZhUHJvamVjdC5hZGRKYXIoVGVzdEpwYVByb2plY3QuanBhSmFyTmFtZSgpKTsKLQkJaWYgKFRlc3RKcGFQcm9qZWN0LmVjbGlwc2VMaW5rSmFyTmFtZSgpICE9IG51bGwpIHsKLQkJCXRoaXMuamF2YVByb2plY3QuYWRkSmFyKFRlc3RKcGFQcm9qZWN0LmVjbGlwc2VMaW5rSmFyTmFtZSgpKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQkvLyBub3RoaW5nIGFzIG9mIHlldAotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycyhTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIFN0cmluZyBhbm5vdGF0aW9uQm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycyhKQVZBWF9QRVJTSVNURU5DRV9QQUNLQUdFX05BTUUsIGFubm90YXRpb25OYW1lLCBhbm5vdGF0aW9uQm9keSk7Ci0JfQotCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUVudW1BbmRNZW1iZXJzKFN0cmluZyBlbnVtTmFtZSwgU3RyaW5nIGVudW1Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZUVudW1BbmRNZW1iZXJzKEpBVkFYX1BFUlNJU1RFTkNFX1BBQ0tBR0VfTkFNRSwgZW51bU5hbWUsIGVudW1Cb2R5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KcHRKYXZhUmVzb3VyY2VUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSnB0SmF2YVJlc291cmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I3ZDdjYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KcHRKYXZhUmVzb3VyY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRKYXZhUmVzb3VyY2VUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0SmF2YVJlc291cmNlVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhUmVzb3VyY2VUeXBlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YVJlc291cmNlQXR0cmlidXRlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSlBUVG9vbHNUZXN0cy5jbGFzcyk7Ci0JCQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFzc29jaWF0aW9uT3ZlcnJpZGVzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXR0cmlidXRlT3ZlcnJpZGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBdHRyaWJ1dGVPdmVycmlkZXNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShCYXNpY1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbHVtblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERpc2NyaW1pbmF0b3JWYWx1ZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbWJlZGRhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW1iZWRkZWRUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbWJlZGRlZElkVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW50aXR5VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW51bWVyYXRlZFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyYXRlZFZhbHVlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSWRDbGFzc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKElkVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSW5oZXJpdGFuY2VUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKb2luQ29sdW1uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSm9pbkNvbHVtbnNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKb2luVGFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMb2JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNYW55VG9NYW55VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWFueVRvT25lVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWFwS2V5VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE5hbWVkTmF0aXZlUXVlcnlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOYW1lZE5hdGl2ZVF1ZXJpZXNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOYW1lZFF1ZXJ5VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTmFtZWRRdWVyaWVzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT25lVG9NYW55VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT25lVG9PbmVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcmRlckJ5VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcmltYXJ5S2V5Sm9pbkNvbHVtbnNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShRdWVyeUhpbnRUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTZWNvbmRhcnlUYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNlY29uZGFyeVRhYmxlc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNlcXVlbmNlR2VuZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVGFibGVHZW5lcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRlbXBvcmFsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJhbnNpZW50VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVmVyc2lvblRlc3RzLmNsYXNzKTsKLQkJCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRKYXZhUmVzb3VyY2VUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Mb2JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTG9iVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2MGM4MS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Mb2JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkxvYkFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIExvYlRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTG9iVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RMb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5MT0IpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBMb2IiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdExvYigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTG9iQW5ub3RhdGlvbiBsb2IgPSAoTG9iQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5MT0IpOwotCQlhc3NlcnROb3ROdWxsKGxvYik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYW55VG9NYW55VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb01hbnlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWUyMmYxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb01hbnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE1hbnlUb01hbnlUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBNYW55VG9NYW55VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19NQU5ZLCBKUEEuRkVUQ0hfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkoZmV0Y2ggPSBGZXRjaFR5cGUuRUFHRVIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueSh0YXJnZXRFbnRpdHkgPSBBbm5vdGF0aW9uVGVzdFR5cGUuY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoTWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55KG1hcHBlZEJ5ID0gXCJmb29cIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvTWFueVdpdGhDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19NQU5ZLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueShjYXNjYWRlID0gQ2FzY2FkZVR5cGUuQUxMKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aE11bHRpcGxlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BTllfVE9fTUFOWSwgSlBBLkNBU0NBREVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkoY2FzY2FkZSA9IHtDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvTWFueVdpdGhEdXBsaWNhdGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19NQU5ZLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueShjYXNjYWRlID0ge0Nhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5NRVJHRX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYW55VG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydE5vdE51bGwobWFueVRvTWFueSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueVdpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBtYW55VG9NYW55LmdldEZldGNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueVdpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBtYW55VG9NYW55LmdldEZldGNoKCkpOwotCQkKLQkJbWFueVRvTWFueS5zZXRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgbWFueVRvTWFueS5nZXRGZXRjaCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueShmZXRjaCA9IExBWlkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2hOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG1hbnlUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JCQotCQltYW55VG9NYW55LnNldEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJmZXRjaCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgbWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJbWFueVRvTWFueS5zZXRUYXJnZXRFbnRpdHkoIkZvbyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KHRhcmdldEVudGl0eSA9IEZvby5jbGFzcykiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYXJnZXRFbnRpdHlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBtYW55VG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCW1hbnlUb01hbnkuc2V0VGFyZ2V0RW50aXR5KG51bGwpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigidGFyZ2V0RW50aXR5IiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBtYW55VG9NYW55LmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lKCkpOwotCQkKLQkJbWFueVRvTWFueS5zZXRUYXJnZXRFbnRpdHkoIkZvbyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KHRhcmdldEVudGl0eSA9IEZvby5jbGFzcykiLCBjdSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBtYW55VG9NYW55LmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lKCkpOyAvL2J1ZyAxOTYyMDAgY2hhbmdlZCB0aGlzCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueVdpdGhNYXBwZWRCeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBlZEJ5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQltYW55VG9NYW55LnNldE1hcHBlZEJ5KCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KG1hcHBlZEJ5ID0gXCJiYXJcIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBwZWRCeU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoTWFwcGVkQnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJbWFueVRvTWFueS5zZXRNYXBwZWRCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigibWFwcGVkQnkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwotCQotCQltYW55VG9NYW55LnNldENhc2NhZGVBbGwodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueShjYXNjYWRlID0gQUxMKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUobWFueVRvTWFueS5pc0Nhc2NhZGVBbGwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlTWVyZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlTWVyZ2UodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueShjYXNjYWRlID0gTUVSR0UpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQotCQltYW55VG9NYW55LnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoY2FzY2FkZSA9IFBFUlNJU1QpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnkuaXNDYXNjYWRlUmVtb3ZlKCkpOwotCQotCQltYW55VG9NYW55LnNldENhc2NhZGVSZW1vdmUodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueShjYXNjYWRlID0gUkVNT1ZFKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUobWFueVRvTWFueS5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnkuaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlUmVmcmVzaCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KGNhc2NhZGUgPSBSRUZSRVNIKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUobWFueVRvTWFueS5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXNjYWRlTW9yZVRoYW5PbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aENhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQkJCi0JCW1hbnlUb01hbnkuc2V0Q2FzY2FkZUFsbCh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQkJLy9hIHNlY29uZCBDYXNjYWRlVHlwZS5BbGwgc2hvdWxkIG5vdCBoYXZlIGJlZW4gYWRkZWQKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KGNhc2NhZGUgPSBDYXNjYWRlVHlwZS5BTEwpIiwgY3UpOwotCQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlQWxsKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQkJCi0JCS8vdGVzdCBzZXR0aW5nIGNhc2NhZGVBbGwgdG8gZmFsc2UgYWdhaW4sIHNob3VsZCBqdXN0IGRvIG5vdGhpbmcKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlQWxsKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoRHVwbGljYXRlQ2FzY2FkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQltYW55VG9NYW55LnNldENhc2NhZGVNZXJnZShmYWxzZSk7IC8vVE9ETyBzaG91bGQgdGhlIHJlc291cmNlIG1vZGVsIGhhbmRsZSB0aGlzIGFuZCByZW1vdmUgYm90aCBNRVJHRSAKLQkJCQkJCQkJCQkgIC8vc2V0dGluZ3MgaW5zdGVhZCBvZiBoYXZpbmcgdG8gc2V0IGl0IGZhbHNlIHR3aWNlPwotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQltYW55VG9NYW55LnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnkuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueVdpdGhNdWx0aXBsZUNhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlUmVtb3ZlKCkpOwotCQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoY2FzY2FkZSA9IFJFTU9WRSkiLCBjdSk7Ci0JCQotCQltYW55VG9NYW55LnNldENhc2NhZGVSZW1vdmUoZmFsc2UpOwkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb09uZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYW55VG9PbmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjIxYTdhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb09uZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNYW55VG9PbmVUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBNYW55VG9PbmVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb09uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BTllfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BTllfVE9fT05FLCBKUEEuRkVUQ0hfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb09uZShmZXRjaCA9IEZldGNoVHlwZS5FQUdFUikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUodGFyZ2V0RW50aXR5ID0gQW5ub3RhdGlvblRlc3RUeXBlLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BTllfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lKG9wdGlvbmFsID0gdHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvT25lV2l0aENhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX09ORSwgSlBBLkNBU0NBREVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb09uZShjYXNjYWRlID0gQ2FzY2FkZVR5cGUuQUxMKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoTXVsdGlwbGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19PTkUsIEpQQS5DQVNDQURFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUoY2FzY2FkZSA9IHtDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvT25lV2l0aER1cGxpY2F0ZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX09ORSwgSlBBLkNBU0NBREVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb09uZShjYXNjYWRlID0ge0Nhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5NRVJHRX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYW55VG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydE5vdE51bGwobWFueVRvT25lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBtYW55VG9PbmUuZ2V0RmV0Y2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBtYW55VG9PbmUuZ2V0RmV0Y2goKSk7Ci0JCQotCQltYW55VG9PbmUuc2V0RmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG1hbnlUb09uZS5nZXRGZXRjaCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKGZldGNoID0gTEFaWSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG1hbnlUb09uZS5nZXRGZXRjaCgpKTsKLQkJCi0JCW1hbnlUb09uZS5zZXRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmUuZ2V0RmV0Y2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImZldGNoIiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgbWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lV2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQltYW55VG9PbmUuc2V0VGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKHRhcmdldEVudGl0eSA9IEZvby5jbGFzcykiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYXJnZXRFbnRpdHlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgbWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCW1hbnlUb09uZS5zZXRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInRhcmdldEVudGl0eSIsIGN1KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIG1hbnlUb09uZS5nZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSgpKTsKLQkJCi0JCW1hbnlUb09uZS5zZXRUYXJnZXRFbnRpdHkoIkZvbyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUodGFyZ2V0RW50aXR5ID0gRm9vLmNsYXNzKSIsIGN1KTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgbWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgbWFueVRvT25lLmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lKCkpOy8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQltYW55VG9PbmUuc2V0T3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShvcHRpb25hbCA9IGZhbHNlKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE9wdGlvbmFsTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lV2l0aE9wdGlvbmFsKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFueVRvT25lLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJbWFueVRvT25lLnNldE9wdGlvbmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigib3B0aW9uYWwiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlQWxsKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShjYXNjYWRlID0gQUxMKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVNZXJnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQotCQltYW55VG9PbmUuc2V0Q2FzY2FkZU1lcmdlKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShjYXNjYWRlID0gTUVSR0UpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUoY2FzY2FkZSA9IFBFUlNJU1QpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZS5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlUmVtb3ZlKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShjYXNjYWRlID0gUkVNT1ZFKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZS5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCQotCQltYW55VG9PbmUuc2V0Q2FzY2FkZVJlZnJlc2godHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKGNhc2NhZGUgPSBSRUZSRVNIKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZVJlZnJlc2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhc2NhZGVNb3JlVGhhbk9uY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhDYXNjYWRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVBbGwodHJ1ZSk7Ci0JCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQkJLy9hIHNlY29uZCBDYXNjYWRlVHlwZS5BbGwgc2hvdWxkIG5vdCBoYXZlIGJlZW4gYWRkZWQKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUoY2FzY2FkZSA9IENhc2NhZGVUeXBlLkFMTCkiLCBjdSk7Ci0JCQotCQltYW55VG9PbmUuc2V0Q2FzY2FkZUFsbChmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQkJCi0JCS8vdGVzdCBzZXR0aW5nIGNhc2NhZGVBbGwgdG8gZmFsc2UgYWdhaW4sIHNob3VsZCBqdXN0IGRvIG5vdGhpbmcKLQkJbWFueVRvT25lLnNldENhc2NhZGVBbGwoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmUuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoRHVwbGljYXRlQ2FzY2FkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ly9UT0RPIHNob3VsZCB0aGUgcmVzb3VyY2UgbW9kZWwgaGFuZGxlIHRoaXMgYW5kIHJlbW92ZSBib3RoIE1FUkdFIAotCQkJCQkJCQkJCS8vc2V0dGluZ3MgaW5zdGVhZCBvZiBoYXZpbmcgdG8gc2V0IGl0IGZhbHNlIHR3aWNlPwotCQlhc3NlcnRUcnVlKG1hbnlUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmUuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lV2l0aE11bHRpcGxlQ2FzY2FkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQlhc3NlcnRUcnVlKG1hbnlUb09uZS5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JCQotCQltYW55VG9PbmUuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUoY2FzY2FkZSA9IFJFTU9WRSkiLCBjdSk7Ci0JCQotCQltYW55VG9PbmUuc2V0Q2FzY2FkZVJlbW92ZShmYWxzZSk7CQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFwS2V5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hcEtleVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZjc0YWIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFwS2V5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYXBLZXlBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNYXBLZXlUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIE1hcEtleVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQX0tFWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcEtleSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBLZXlXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUF9LRVkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBLZXkobmFtZSA9IFwia2V5XCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hcEtleSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXkgPSAoTWFwS2V5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQVBfS0VZKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBLZXkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFwS2V5V2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hcEtleUFubm90YXRpb24gbWFwS2V5ID0gKE1hcEtleUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFQX0tFWSk7Ci0JCWFzc2VydEVxdWFscygia2V5IiwgbWFwS2V5LmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYXBLZXkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IChNYXBLZXlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BUF9LRVkpOwotCi0JCW1hcEtleS5zZXROYW1lKCJmb28iKTsKLQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXkobmFtZSA9IFwiZm9vXCIpIiwgY3UpOwotCQkKLQkJbWFwS2V5LnNldE5hbWUobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNYXBLZXkobmFtZSA9IFwiZm9vXCIpIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNkMDhmNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNYXBwZWRTdXBlcmNsYXNzVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBNYXBwZWRTdXBlcmNsYXNzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NBbmRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJSmF2YVJlc291cmNlTm9kZSBtYXBwaW5nQW5ub3RhdGlvbiA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUobWFwcGluZ0Fubm90YXRpb24gaW5zdGFuY2VvZiBNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBwZWRTdXBlcmNsYXNzQW5kRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQW5kRW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUphdmFSZXNvdXJjZU5vZGUgbWFwcGluZ0Fubm90YXRpb24gPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUobWFwcGluZ0Fubm90YXRpb24gaW5zdGFuY2VvZiBFbnRpdHlBbm5vdGF0aW9uKTsKLQkJCi0JCU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCWFzc2VydE5vdE51bGwobWFwcGVkU3VwZXJjbGFzcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJpZXNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWROYXRpdmVRdWVyaWVzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhlNjBiZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJpZXNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE5hbWVkTmF0aXZlUXVlcmllc1Rlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfTkFNRSA9ICJteVF1ZXJ5IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfUVVFUlkgPSAiU0VMRUNUIG5hbWUgRlJPTSBFbXBsb3llZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1JFU1VMVF9DTEFTUyA9ICJSZXN1bHQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9SRVNVTFRfU0VUX01BUFBJTkcgPSAicmVzdWx0U2V0TWFwcGluZyI7Ci0JCi0JcHVibGljIE5hbWVkTmF0aXZlUXVlcmllc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWROYXRpdmVRdWVyaWVzKEBOYW1lZE5hdGl2ZVF1ZXJ5KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFN0cmluZ0VsZW1lbnQoIm5hbWUiLCBRVUVSWV9OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhTdHJpbmdFbGVtZW50KCJxdWVyeSIsIFFVRVJZX1FVRVJZKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFJlc3VsdFNldE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFN0cmluZ0VsZW1lbnQoInJlc3VsdFNldE1hcHBpbmciLCBRVUVSWV9SRVNVTFRfU0VUX01BUFBJTkcpOwotCX0KLQkKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhTdHJpbmdFbGVtZW50KGZpbmFsIFN0cmluZyBlbGVtZW50TmFtZSwgZmluYWwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5OQU1FRF9OQVRJVkVfUVVFUklFUywgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE5hbWVkTmF0aXZlUXVlcmllcyhATmFtZWROYXRpdmVRdWVyeSgiICsgZWxlbWVudE5hbWUgKyAiID0gXCIiICsgdmFsdWUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUmVzdWx0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5OQU1FRF9OQVRJVkVfUVVFUklFUywgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE5hbWVkTmF0aXZlUXVlcmllcyhATmFtZWROYXRpdmVRdWVyeShyZXN1bHRDbGFzcyA9ICIgKyBRVUVSWV9SRVNVTFRfQ0xBU1MgKyAiLmNsYXNzKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhRdWVyeUhpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlksIEpQQS5RVUVSWV9ISU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWROYXRpdmVRdWVyaWVzKEBOYW1lZE5hdGl2ZVF1ZXJ5KGhpbnRzID0ge0BRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIiksIEBRdWVyeUhpbnR9KSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfTkFUSVZFX1FVRVJZLCBKUEEuUVVFUllfSElOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE5hbWVkTmF0aXZlUXVlcnkobmFtZSA9IFwiZm9vXCIsIHF1ZXJ5ID0gXCJiYXJcIiwgaGludHMgPSBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpLCByZXN1bHRDbGFzcyA9IEZvby5jbGFzcywgcmVzdWx0U2V0TWFwcGluZyA9IFwibWFwcGluZ1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZWROYXRpdmVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQlhc3NlcnROb3ROdWxsKG5hbWVkUXVlcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9OQU1FLCBuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX05BTUUsIG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJCi0JCW5hbWVkUXVlcnkuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWUgPSBcImZvb1wiKSIsIGN1KTsKLQkJCi0JCW5hbWVkUXVlcnkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE5hbWVkTmF0aXZlUXVlcnkoIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1FVRVJZLCBuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1FVRVJZLCBuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXRRdWVyeSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShxdWVyeSA9IFwiZm9vXCIpIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXRRdWVyeShudWxsKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBOYW1lZE5hdGl2ZVF1ZXJ5KCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFJlc3VsdENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFJlc3VsdENsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUkVTVUxUX0NMQVNTLCBuYW1lZFF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZXN1bHRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhSZXN1bHRDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1JFU1VMVF9DTEFTUywgbmFtZWRRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJCi0JCW5hbWVkUXVlcnkuc2V0UmVzdWx0Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkocmVzdWx0Q2xhc3MgPSBmb28uY2xhc3MpIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXRSZXN1bHRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBOYW1lZE5hdGl2ZVF1ZXJ5KCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RnVsbHlRdWFsaWZpZWRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhSZXN1bHRDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0KLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCWFzc2VydE5vdE51bGwobmFtZWRRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSZXN1bHQiLCBuYW1lZFF1ZXJ5LmdldEZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3NOYW1lKCkpOy8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKLQotCQluYW1lZFF1ZXJ5LnNldFJlc3VsdENsYXNzKFRZUEVfTkFNRSk7CQkKLQkJCi0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBuYW1lZFF1ZXJ5LmdldEZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3NOYW1lKCkpOwkJCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KHJlc3VsdENsYXNzID0gIiArIFRZUEVfTkFNRSArICIuY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzdWx0U2V0TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhSZXN1bHRTZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUkVTVUxUX1NFVF9NQVBQSU5HLCBuYW1lZFF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFJlc3VsdFNldE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUmVzdWx0U2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1JFU1VMVF9TRVRfTUFQUElORywgbmFtZWRRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXRSZXN1bHRTZXRNYXBwaW5nKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkocmVzdWx0U2V0TWFwcGluZyA9IFwiZm9vXCIpIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXRSZXN1bHRTZXRNYXBwaW5nKG51bGwpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATmFtZWROYXRpdmVRdWVyeSgiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIaW50czIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcmllcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJCi0JCW5hbWVkUXVlcnkuYWRkSGludCgwKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SGludHMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFF1ZXJ5SGludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCQotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW5hbWVkUXVlcnkuYWRkSGludCgxKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShoaW50cyA9IHtAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiKSxAUXVlcnlIaW50KG5hbWUgPSBcIkZPT1wiKSwgQFF1ZXJ5SGludH0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhRdWVyeUhpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMik7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyaWVzKEBOYW1lZE5hdGl2ZVF1ZXJ5KGhpbnRzID0ge0BRdWVyeUhpbnQobmFtZSA9IFwiQkFaXCIpLCBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpfSkpIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJpZXMoQE5hbWVkTmF0aXZlUXVlcnkoaGludHMgPSBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpKSkiLCBjdSk7Ci0JCQotCQotCQluYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBOYW1lZE5hdGl2ZVF1ZXJ5KCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFF1ZXJ5SGludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCQotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCi0JCW5hbWVkUXVlcnkubW92ZUhpbnQoMiwgMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyaWVzKEBOYW1lZE5hdGl2ZVF1ZXJ5KGhpbnRzID0ge0BRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIiksIEBRdWVyeUhpbnQsIEBRdWVyeUhpbnQobmFtZSA9IFwiQkFaXCIpfSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUhpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFF1ZXJ5SGludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCQotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCi0JCW5hbWVkUXVlcnkubW92ZUhpbnQoMCwgMik7Ci0JCQotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyaWVzKEBOYW1lZE5hdGl2ZVF1ZXJ5KGhpbnRzID0ge0BRdWVyeUhpbnQsIEBRdWVyeUhpbnQobmFtZSA9IFwiQkFaXCIpLCBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpfSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTmFtZWROYXRpdmVRdWVyeUNvcHlFeGlzdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJATmFtZWROYXRpdmVRdWVyaWVzKHsiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWUgPSBcImZvb1wiLCBxdWVyeSA9IFwiYmFyXCIsIGhpbnRzID0gQFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSwgcmVzdWx0Q2xhc3MgPSBGb28uY2xhc3MsIHJlc3VsdFNldE1hcHBpbmcgPSBcIm1hcHBpbmdcIiksIjsKLQkJU3RyaW5nIGV4cGVjdGVkMyA9ICJATmFtZWROYXRpdmVRdWVyeShuYW1lID0gXCJCQVJcIikgfSkiOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJbmFtZWRRdWVyeS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX05BVElWRV9RVUVSWSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9OQVRJVkVfUVVFUklFUykpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLk5BTUVEX05BVElWRV9RVUVSWSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTmFtZWROYXRpdmVRdWVyeVRvQmVnaW5uaW5nT2ZMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBOYW1lZE5hdGl2ZVF1ZXJpZXMoeyI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQE5hbWVkTmF0aXZlUXVlcnkobmFtZSA9IFwiZm9vXCIsIHF1ZXJ5ID0gXCJiYXJcIiwgaGludHMgPSBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpLCByZXN1bHRDbGFzcyA9IEZvby5jbGFzcywgcmVzdWx0U2V0TWFwcGluZyA9IFwibWFwcGluZ1wiKSwiOwotCQlTdHJpbmcgZXhwZWN0ZWQzID0gIkBOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWUgPSBcIkJBUlwiKSB9KSI7Ci0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQluYW1lZFF1ZXJ5LnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCQkKLQkJZXhwZWN0ZWQyID0gIkBOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWUgPSBcIkJBWlwiKSwiOwotCQlleHBlY3RlZDMgPSAiQE5hbWVkTmF0aXZlUXVlcnkobmFtZSA9IFwiZm9vXCIsIHF1ZXJ5ID0gXCJiYXJcIiwgaGludHMgPSBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpLCByZXN1bHRDbGFzcyA9IEZvby5jbGFzcywgcmVzdWx0U2V0TWFwcGluZyA9IFwibWFwcGluZ1wiKSwgQE5hbWVkTmF0aXZlUXVlcnkobmFtZSA9IFwiQkFSXCIpIH0pIjsKLQkJbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCW5hbWVkUXVlcnkuc2V0TmFtZSgiQkFaIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0KLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBuYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLk5BTUVEX05BVElWRV9RVUVSWSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSBuYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIG5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgbmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKSk7Ci0JCWFzc2VydEVxdWFscygzLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU5hbWVkTmF0aXZlUXVlcnlDb3B5RXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCVN0cmluZyBleHBlY3RlZDEgPSAiQE5hbWVkTmF0aXZlUXVlcmllcyh7IjsKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJATmFtZWROYXRpdmVRdWVyeShuYW1lID0gXCJmb29cIiwgcXVlcnkgPSBcImJhclwiLCBoaW50cyA9IEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIiksIHJlc3VsdENsYXNzID0gRm9vLmNsYXNzLCByZXN1bHRTZXRNYXBwaW5nID0gXCJtYXBwaW5nXCIpLCI7Ci0JCVN0cmluZyBleHBlY3RlZDMgPSAiQE5hbWVkTmF0aXZlUXVlcnkobmFtZSA9IFwiQkFSXCIpIH0pIjsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCW5hbWVkUXVlcnkuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0JCQotCQlleHBlY3RlZDEgPSAiQE5hbWVkTmF0aXZlUXVlcnkobmFtZSA9IFwiZm9vXCIsIHF1ZXJ5ID0gXCJiYXJcIiwgaGludHMgPSBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpLCByZXN1bHRDbGFzcyA9IEZvby5jbGFzcywgcmVzdWx0U2V0TWFwcGluZyA9IFwibWFwcGluZ1wiKSI7Ci0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBOYW1lZE5hdGl2ZVF1ZXJpZXMiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWROYXRpdmVRdWVyeVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmYTY0ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBOYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9OQU1FID0gIm15UXVlcnkiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9RVUVSWSA9ICJTRUxFQ1QgbmFtZSBGUk9NIEVtcGxveWVlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfUkVTVUxUX0NMQVNTID0gIlJlc3VsdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1JFU1VMVF9TRVRfTUFQUElORyA9ICJyZXN1bHRTZXRNYXBwaW5nIjsKLQkKLQlwdWJsaWMgTmFtZWROYXRpdmVRdWVyeVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZE5hdGl2ZVF1ZXJ5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoU3RyaW5nRWxlbWVudCgibmFtZSIsIFFVRVJZX05BTUUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFN0cmluZ0VsZW1lbnQoInF1ZXJ5IiwgUVVFUllfUVVFUlkpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUmVzdWx0U2V0TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoU3RyaW5nRWxlbWVudCgicmVzdWx0U2V0TWFwcGluZyIsIFFVRVJZX1JFU1VMVF9TRVRfTUFQUElORyk7Ci0JfQotCQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFN0cmluZ0VsZW1lbnQoZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lLCBmaW5hbCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE5hbWVkTmF0aXZlUXVlcnkoIiArIGVsZW1lbnROYW1lICsgIiA9IFwiIiArIHZhbHVlICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUmVzdWx0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZE5hdGl2ZVF1ZXJ5KHJlc3VsdENsYXNzID0gIiArIFFVRVJZX1JFU1VMVF9DTEFTUyArICIuY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUXVlcnlIaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk5BTUVEX05BVElWRV9RVUVSWSwgSlBBLlFVRVJZX0hJTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZE5hdGl2ZVF1ZXJ5KGhpbnRzID0ge0BRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIiksIEBRdWVyeUhpbnR9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZWROYXRpdmVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJYXNzZXJ0Tm90TnVsbChuYW1lZFF1ZXJ5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfTkFNRSwgbmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9OQU1FLCBuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShuYW1lID0gXCJmb29cIikiLCBjdSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBOYW1lZE5hdGl2ZVF1ZXJ5KCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUXVlcnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9RVUVSWSwgbmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUXVlcnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9RVUVSWSwgbmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQkJCi0JCW5hbWVkUXVlcnkuc2V0UXVlcnkoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkocXVlcnkgPSBcImZvb1wiKSIsIGN1KTsKLQkJCi0JCW5hbWVkUXVlcnkuc2V0UXVlcnkobnVsbCk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATmFtZWROYXRpdmVRdWVyeSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZXN1bHRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhSZXN1bHRDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1JFU1VMVF9DTEFTUywgbmFtZWRRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVzdWx0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUmVzdWx0Q2xhc3MoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9SRVNVTFRfQ0xBU1MsIG5hbWVkUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldFJlc3VsdENsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KHJlc3VsdENsYXNzID0gZm9vLmNsYXNzKSIsIGN1KTsKLQkJCi0JCW5hbWVkUXVlcnkuc2V0UmVzdWx0Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATmFtZWROYXRpdmVRdWVyeSgiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEZ1bGx5UXVhbGlmaWVkQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUmVzdWx0Q2xhc3MoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQlhc3NlcnROb3ROdWxsKG5hbWVkUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiUmVzdWx0IiwgbmFtZWRRdWVyeS5nZXRGdWxseVF1YWxpZmllZFJlc3VsdENsYXNzTmFtZSgpKTsvL2J1ZyAxOTYyMDAgY2hhbmdlZCB0aGlzCi0KLQkJbmFtZWRRdWVyeS5zZXRSZXN1bHRDbGFzcyhUWVBFX05BTUUpOwkJCi0JCQotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgbmFtZWRRdWVyeS5nZXRGdWxseVF1YWxpZmllZFJlc3VsdENsYXNzTmFtZSgpKTsJCQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShyZXN1bHRDbGFzcyA9ICIgKyBUWVBFX05BTUUgKyAiLmNsYXNzKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFJlc3VsdFNldE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUmVzdWx0U2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1JFU1VMVF9TRVRfTUFQUElORywgbmFtZWRRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZXN1bHRTZXRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFJlc3VsdFNldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9SRVNVTFRfU0VUX01BUFBJTkcsIG5hbWVkUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJCi0JCW5hbWVkUXVlcnkuc2V0UmVzdWx0U2V0TWFwcGluZygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWRRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KHJlc3VsdFNldE1hcHBpbmcgPSBcImZvb1wiKSIsIGN1KTsKLQkJCi0JCW5hbWVkUXVlcnkuc2V0UmVzdWx0U2V0TWFwcGluZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE5hbWVkTmF0aXZlUXVlcnkoIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhpbnRzMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJCi0JCW5hbWVkUXVlcnkuYWRkSGludCgwKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SGludHMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFF1ZXJ5SGludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQkKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkZPTyIpOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMSk7Ci0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiksQFF1ZXJ5SGludChuYW1lID0gXCJGT09cIiksIEBRdWVyeUhpbnR9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUXVlcnlIaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQkKLQkJbmFtZWRRdWVyeS5yZW1vdmVIaW50KDIpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludChuYW1lID0gXCJCQVpcIiksIEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIil9KSIsIGN1KTsKLQkJCi0JCW5hbWVkUXVlcnkucmVtb3ZlSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShoaW50cyA9IEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIikpIiwgY3UpOwotCQkKLQkKLQkJbmFtZWRRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMCwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATmFtZWROYXRpdmVRdWVyeSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhRdWVyeUhpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQkKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQotCQluYW1lZFF1ZXJ5Lm1vdmVIaW50KDIsIDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSwgQFF1ZXJ5SGludCwgQFF1ZXJ5SGludChuYW1lID0gXCJCQVpcIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVIaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhRdWVyeUhpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCi0JCW5hbWVkUXVlcnkubW92ZUhpbnQoMCwgMik7Ci0JCQotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShoaW50cyA9IHtAUXVlcnlIaW50LCBAUXVlcnlIaW50KG5hbWUgPSBcIkJBWlwiKSwgQFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKX0pIiwgY3UpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcmllc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJpZXNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWE5YTI3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcmllc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTmFtZWRRdWVyaWVzVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9OQU1FID0gIm15UXVlcnkiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9RVUVSWSA9ICJTRUxFQ1QgbmFtZSBGUk9NIEVtcGxveWVlIjsKLQkKLQlwdWJsaWMgTmFtZWRRdWVyaWVzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWRRdWVyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfUVVFUklFUywgSlBBLk5BTUVEX1FVRVJZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWRRdWVyaWVzKEBOYW1lZFF1ZXJ5KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFN0cmluZ0VsZW1lbnQoIm5hbWUiLCBRVUVSWV9OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0TmFtZWRRdWVyeVdpdGhTdHJpbmdFbGVtZW50KCJxdWVyeSIsIFFVRVJZX1FVRVJZKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFN0cmluZ0VsZW1lbnQoZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lLCBmaW5hbCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk5BTUVEX1FVRVJJRVMsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE5hbWVkUXVlcmllcyhATmFtZWRRdWVyeSgiICsgZWxlbWVudE5hbWUgKyAiID0gXCIiICsgdmFsdWUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnlIaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk5BTUVEX1FVRVJJRVMsIEpQQS5OQU1FRF9RVUVSWSwgSlBBLlFVRVJZX0hJTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZFF1ZXJpZXMoQE5hbWVkUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSwgQFF1ZXJ5SGludH0pKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk5BTUVEX1FVRVJZLCBKUEEuUVVFUllfSElOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE5hbWVkUXVlcnkobmFtZSA9IFwiZm9vXCIsIHF1ZXJ5ID0gXCJiYXJcIiwgaGludHMgPSBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZWRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyaWVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCWFzc2VydE5vdE51bGwobmFtZWRRdWVyeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfUVVFUlkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfTkFNRSwgbmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX05BTUUsIG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJCi0JCW5hbWVkUXVlcnkuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJ5KG5hbWUgPSBcImZvb1wiKSIsIGN1KTsKLQkJCi0JCW5hbWVkUXVlcnkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE5hbWVkUXVlcnkoIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyeVdpdGhRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfUVVFUlkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUVVFUlksIG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9RVUVSWSwgbmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQkJCi0JCW5hbWVkUXVlcnkuc2V0UXVlcnkoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcnkocXVlcnkgPSBcImZvb1wiKSIsIGN1KTsKLQkJCi0JCW5hbWVkUXVlcnkuc2V0UXVlcnkobnVsbCk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATmFtZWRRdWVyeSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyaWVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIaW50czIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcmllcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfUVVFUlkpOwotCQkKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIaW50czMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnlIaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfUVVFUlkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyaWVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCQotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW5hbWVkUXVlcnkuYWRkSGludCgxKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJ5KGhpbnRzID0ge0BRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIpLEBRdWVyeUhpbnQobmFtZSA9IFwiRk9PXCIpLCBAUXVlcnlIaW50fSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5SGludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQkKLQkJbmFtZWRRdWVyeS5yZW1vdmVIaW50KDIpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcmllcyhATmFtZWRRdWVyeShoaW50cyA9IHtAUXVlcnlIaW50KG5hbWUgPSBcIkJBWlwiKSwgQFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKX0pKSIsIGN1KTsKLQkJCi0JCW5hbWVkUXVlcnkucmVtb3ZlSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyaWVzKEBOYW1lZFF1ZXJ5KGhpbnRzID0gQFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSkpIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMCwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATmFtZWRRdWVyeSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyeVdpdGhRdWVyeUhpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkKLQkJbmFtZWRRdWVyeS5tb3ZlSGludCgyLCAwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJpZXMoQE5hbWVkUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSwgQFF1ZXJ5SGludCwgQFF1ZXJ5SGludChuYW1lID0gXCJCQVpcIil9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSGludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnlIaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfUVVFUlkpOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCi0JCW5hbWVkUXVlcnkubW92ZUhpbnQoMCwgMik7Ci0JCQotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyaWVzKEBOYW1lZFF1ZXJ5KGhpbnRzID0ge0BRdWVyeUhpbnQsIEBRdWVyeUhpbnQobmFtZSA9IFwiQkFaXCIpLCBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpfSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTmFtZWRRdWVyeUNvcHlFeGlzdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdE5hbWVkUXVlcnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJATmFtZWRRdWVyaWVzKHsiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBOYW1lZFF1ZXJ5KG5hbWUgPSBcImZvb1wiLCBxdWVyeSA9IFwiYmFyXCIsIGhpbnRzID0gQFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSksIjsKLQkJU3RyaW5nIGV4cGVjdGVkMyA9ICJATmFtZWRRdWVyeShuYW1lID0gXCJCQVJcIikgfSkiOwotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuTkFNRURfUVVFUlkpOwotCQluYW1lZFF1ZXJ5LnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfUVVFUlkpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfUVVFUklFUykpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShKUEEuTkFNRURfUVVFUlkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZE5hbWVkUXVlcnlUb0JlZ2lubmluZ09mTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdE5hbWVkUXVlcnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJATmFtZWRRdWVyaWVzKHsiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBOYW1lZFF1ZXJ5KG5hbWUgPSBcImZvb1wiLCBxdWVyeSA9IFwiYmFyXCIsIGhpbnRzID0gQFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSksIjsKLQkJU3RyaW5nIGV4cGVjdGVkMyA9ICJATmFtZWRRdWVyeShuYW1lID0gXCJCQVJcIikgfSkiOwotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuTkFNRURfUVVFUlkpOwotCQluYW1lZFF1ZXJ5LnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCQkKLQkJCi0JCWV4cGVjdGVkMiA9ICJATmFtZWRRdWVyeShuYW1lID0gXCJCQVpcIiksIjsKLQkJZXhwZWN0ZWQzID0gIkBOYW1lZFF1ZXJ5KG5hbWUgPSBcImZvb1wiLCBxdWVyeSA9IFwiYmFyXCIsIGhpbnRzID0gQFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSksIEBOYW1lZFF1ZXJ5KG5hbWUgPSBcIkJBUlwiKSB9KSI7Ci0JCW5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCW5hbWVkUXVlcnkuc2V0TmFtZSgiQkFaIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0KLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBuYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLk5BTUVEX1FVRVJZKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoTmFtZWRRdWVyeUFubm90YXRpb24pIG5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgbmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBuYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX1FVRVJZKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX1FVRVJJRVMpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfUVVFUlkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLk5BTUVEX1FVRVJZKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU5hbWVkUXVlcnlDb3B5RXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCVN0cmluZyBleHBlY3RlZDEgPSAiQE5hbWVkUXVlcmllcyh7IjsKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJATmFtZWRRdWVyeShuYW1lID0gXCJmb29cIiwgcXVlcnkgPSBcImJhclwiLCBoaW50cyA9IEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIikpLCI7Ci0JCVN0cmluZyBleHBlY3RlZDMgPSAiQE5hbWVkUXVlcnkobmFtZSA9IFwiQkFSXCIpIH0pIjsKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJbmFtZWRRdWVyeS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQkJCi0JCWV4cGVjdGVkMSA9ICJATmFtZWRRdWVyeShuYW1lID0gXCJmb29cIiwgcXVlcnkgPSBcImJhclwiLCBoaW50cyA9IEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIikpIjsKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATmFtZWROYXRpdmVRdWVyaWVzIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcnlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyeVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMTQ5MTcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyeVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlF1ZXJ5SGludEFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE5hbWVkUXVlcnlUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX05BTUUgPSAibXlRdWVyeSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1FVRVJZID0gIlNFTEVDVCBuYW1lIEZST00gRW1wbG95ZWUiOwotCQotCXB1YmxpYyBOYW1lZFF1ZXJ5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk5BTUVEX1FVRVJZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWRRdWVyeSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFN0cmluZ0VsZW1lbnQoIm5hbWUiLCBRVUVSWV9OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0TmFtZWRRdWVyeVdpdGhTdHJpbmdFbGVtZW50KCJxdWVyeSIsIFFVRVJZX1FVRVJZKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFN0cmluZ0VsZW1lbnQoZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lLCBmaW5hbCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk5BTUVEX1FVRVJZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWRRdWVyeSgiICsgZWxlbWVudE5hbWUgKyAiID0gXCIiICsgdmFsdWUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWRRdWVyeVdpdGhRdWVyeUhpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfUVVFUlksIEpQQS5RVUVSWV9ISU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWRRdWVyeShoaW50cyA9IHtAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpLCBAUXVlcnlIaW50fSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJYXNzZXJ0Tm90TnVsbChuYW1lZFF1ZXJ5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyeVdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9OQU1FLCBuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfUVVFUlkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfTkFNRSwgbmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcnkobmFtZSA9IFwiZm9vXCIpIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATmFtZWRRdWVyeSgiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9RVUVSWSwgbmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1FVRVJZLCBuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXRRdWVyeSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyeShxdWVyeSA9IFwiZm9vXCIpIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXRRdWVyeShudWxsKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBOYW1lZFF1ZXJ5KCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIaW50czIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJCi0JCW5hbWVkUXVlcnkuYWRkSGludCgwKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SGludHMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5SGludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxRdWVyeUhpbnRBbm5vdGF0aW9uPiBpdGVyYXRvciA9IG5hbWVkUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGl0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGl0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCQotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW5hbWVkUXVlcnkuYWRkSGludCgxKTsKLQkJUXVlcnlIaW50QW5ub3RhdGlvbiBxdWVyeUhpbnQgPSBuYW1lZFF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCXF1ZXJ5SGludC5zZXROYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiksQFF1ZXJ5SGludChuYW1lID0gXCJGT09cIiksIEBRdWVyeUhpbnR9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnlIaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfUVVFUlkpOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMik7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyeShoaW50cyA9IHtAUXVlcnlIaW50KG5hbWUgPSBcIkJBWlwiKSwgQFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKX0pIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJ5KGhpbnRzID0gQFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSkiLCBjdSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBOYW1lZFF1ZXJ5KCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5SGludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQotCQluYW1lZFF1ZXJ5Lm1vdmVIaW50KDIsIDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSwgQFF1ZXJ5SGludCwgQFF1ZXJ5SGludChuYW1lID0gXCJCQVpcIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVIaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyeVdpdGhRdWVyeUhpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkKLQkJbmFtZWRRdWVyeS5tb3ZlSGludCgwLCAyKTsKLQkJCi0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJ5KGhpbnRzID0ge0BRdWVyeUhpbnQsIEBRdWVyeUhpbnQobmFtZSA9IFwiQkFaXCIpLCBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpfSkiLCBjdSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvT25lVG9NYW55VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09uZVRvTWFueVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZTZmMDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvT25lVG9NYW55VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9uZVRvTWFueVRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIE9uZVRvTWFueVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9NYW55V2l0aEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX01BTlksIEpQQS5GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55KGZldGNoID0gRmV0Y2hUeXBlLkVBR0VSKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkodGFyZ2V0RW50aXR5ID0gQW5ub3RhdGlvblRlc3RUeXBlLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoTWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueShtYXBwZWRCeSA9IFwiZm9vXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX01BTlksIEpQQS5DQVNDQURFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkoY2FzY2FkZSA9IENhc2NhZGVUeXBlLkFMTCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9NYW55V2l0aE11bHRpcGxlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19NQU5ZLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55KGNhc2NhZGUgPSB7Q2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhEdXBsaWNhdGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX01BTlksIEpQQS5DQVNDQURFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkoY2FzY2FkZSA9IHtDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuTUVSR0V9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnROb3ROdWxsKG9uZVRvTWFueSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb25lVG9NYW55LmdldEZldGNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb25lVG9NYW55LmdldEZldGNoKCkpOwotCQkKLQkJb25lVG9NYW55LnNldEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvbmVUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueShmZXRjaCA9IExBWlkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2hOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0RmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldEZldGNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJmZXRjaCIsIGN1KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJb25lVG9NYW55LnNldFRhcmdldEVudGl0eSgiRm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueSh0YXJnZXRFbnRpdHkgPSBGb28uY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFyZ2V0RW50aXR5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0VGFyZ2V0RW50aXR5KG51bGwpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJ0YXJnZXRFbnRpdHkiLCBjdSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBvbmVUb01hbnkuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHlDbGFzc05hbWUoKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0VGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KHRhcmdldEVudGl0eSA9IEZvby5jbGFzcykiLCBjdSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9uZVRvTWFueS5nZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSgpKTsgLy9idWcgMTk2MjAwIGNoYW5nZWQgdGhpcwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhNYXBwZWRCeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBlZEJ5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQlvbmVUb01hbnkuc2V0TWFwcGVkQnkoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KG1hcHBlZEJ5ID0gXCJiYXJcIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBwZWRCeU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhNYXBwZWRCeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJb25lVG9NYW55LnNldE1hcHBlZEJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigibWFwcGVkQnkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwotCQotCQlvbmVUb01hbnkuc2V0Q2FzY2FkZUFsbCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoY2FzY2FkZSA9IEFMTCkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVBbGwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlTWVyZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVNZXJnZSh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoY2FzY2FkZSA9IE1FUkdFKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQotCQlvbmVUb01hbnkuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KGNhc2NhZGUgPSBQRVJTSVNUKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnkuaXNDYXNjYWRlUmVtb3ZlKCkpOwotCQotCQlvbmVUb01hbnkuc2V0Q2FzY2FkZVJlbW92ZSh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoY2FzY2FkZSA9IFJFTU9WRSkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnkuaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVSZWZyZXNoKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueShjYXNjYWRlID0gUkVGUkVTSCkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXNjYWRlTW9yZVRoYW5PbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoQ2FzY2FkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQkJCi0JCW9uZVRvTWFueS5zZXRDYXNjYWRlQWxsKHRydWUpOwotCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCS8vYSBzZWNvbmQgQ2FzY2FkZVR5cGUuQWxsIHNob3VsZCBub3QgaGF2ZSBiZWVuIGFkZGVkCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KGNhc2NhZGUgPSBDYXNjYWRlVHlwZS5BTEwpIiwgY3UpOwotCQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVBbGwoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JCQotCQkvL3Rlc3Qgc2V0dGluZyBjYXNjYWRlQWxsIHRvIGZhbHNlIGFnYWluLCBzaG91bGQganVzdCBkbyBub3RoaW5nCi0JCW9uZVRvTWFueS5zZXRDYXNjYWRlQWxsKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aER1cGxpY2F0ZUNhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJCi0JCW9uZVRvTWFueS5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOy8vVE9ETyBzaG91bGQgdGhlIHJlc291cmNlIG1vZGVsIGhhbmRsZSB0aGlzIGFuZCByZW1vdmUgYm90aCBNRVJHRSAKLQkJCQkJCQkJCQkvL3NldHRpbmdzIGluc3RlYWQgb2YgaGF2aW5nIHRvIHNldCBpdCBmYWxzZSB0d2ljZT8KLQkJYXNzZXJ0VHJ1ZShvbmVUb01hbnkuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhNdWx0aXBsZUNhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvbmVUb01hbnkuaXNDYXNjYWRlUmVtb3ZlKCkpOwotCQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KGNhc2NhZGUgPSBSRU1PVkUpIiwgY3UpOwotCQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVSZW1vdmUoZmFsc2UpOwkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvT25lVG9PbmVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvT25lVG9PbmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTBmNTY3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09uZVRvT25lVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT25lVG9PbmVUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBPbmVUb09uZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9PbmVXaXRoRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fT05FLCBKUEEuRkVUQ0hfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lKGZldGNoID0gRmV0Y2hUeXBlLkVBR0VSKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvT25lV2l0aFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZSh0YXJnZXRFbnRpdHkgPSBBbm5vdGF0aW9uVGVzdFR5cGUuY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9PbmVXaXRoT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUob3B0aW9uYWwgPSB0cnVlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb09uZVdpdGhNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZShtYXBwZWRCeSA9IFwiZm9vXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvT25lV2l0aENhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fT05FLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUoY2FzY2FkZSA9IENhc2NhZGVUeXBlLkFMTCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9PbmVXaXRoTXVsdGlwbGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX09ORSwgSlBBLkNBU0NBREVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lKGNhc2NhZGUgPSB7Q2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvT25lV2l0aER1cGxpY2F0ZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fT05FLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUoY2FzY2FkZSA9IHtDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuTUVSR0V9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnROb3ROdWxsKG9uZVRvT25lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb25lVG9PbmUuZ2V0RmV0Y2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb25lVG9PbmUuZ2V0RmV0Y2goKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb25lVG9PbmUuZ2V0RmV0Y2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGZldGNoID0gTEFaWSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb09uZS5nZXRGZXRjaCgpKTsKLQkJCi0JCW9uZVRvT25lLnNldEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldEZldGNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImZldGNoIiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRUYXJnZXRFbnRpdHkoIkZvbyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZSh0YXJnZXRFbnRpdHkgPSBGb28uY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFyZ2V0RW50aXR5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigidGFyZ2V0RW50aXR5IiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIG9uZVRvT25lLmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lKCkpOwotCQkKLQkJb25lVG9PbmUuc2V0VGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUodGFyZ2V0RW50aXR5ID0gRm9vLmNsYXNzKSIsIGN1KTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgb25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvbmVUb09uZS5nZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSgpKTsgLy9idWcgMTk2MjAwIGNoYW5nZWQgdGhpcwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0T3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aE9wdGlvbmFsKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb09uZS5nZXRPcHRpb25hbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aE9wdGlvbmFsKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCW9uZVRvT25lLnNldE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb25lVG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKG9wdGlvbmFsID0gZmFsc2UpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T3B0aW9uYWxOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhPcHRpb25hbCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRPcHRpb25hbChudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJvcHRpb25hbCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhNYXBwZWRCeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGVkQnlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0TWFwcGVkQnkoKSk7Ci0JCW9uZVRvT25lLnNldE1hcHBlZEJ5KCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUobWFwcGVkQnkgPSBcImJhclwiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHBlZEJ5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoTWFwcGVkQnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9PbmUuZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRNYXBwZWRCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJtYXBwZWRCeSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZUFsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQkKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZUFsbCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShjYXNjYWRlID0gQUxMKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUob25lVG9PbmUuaXNDYXNjYWRlQWxsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZU1lcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmUuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCi0JCW9uZVRvT25lLnNldENhc2NhZGVNZXJnZSh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShjYXNjYWRlID0gTUVSR0UpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmUuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUoY2FzY2FkZSA9IFBFUlNJU1QpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZVJlbW92ZSh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShjYXNjYWRlID0gUkVNT1ZFKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUob25lVG9PbmUuaXNDYXNjYWRlUmVtb3ZlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lLmlzQ2FzY2FkZVJlZnJlc2goKSk7Ci0JCi0JCW9uZVRvT25lLnNldENhc2NhZGVSZWZyZXNoKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGNhc2NhZGUgPSBSRUZSRVNIKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUob25lVG9PbmUuaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FzY2FkZU1vcmVUaGFuT25jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoQ2FzY2FkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlQWxsKHRydWUpOwotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQkJLy9hIHNlY29uZCBDYXNjYWRlVHlwZS5BbGwgc2hvdWxkIG5vdCBoYXZlIGJlZW4gYWRkZWQKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShjYXNjYWRlID0gQ2FzY2FkZVR5cGUuQUxMKSIsIGN1KTsKLQkJCi0JCW9uZVRvT25lLnNldENhc2NhZGVBbGwoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQkJCi0JCS8vdGVzdCBzZXR0aW5nIGNhc2NhZGVBbGwgdG8gZmFsc2UgYWdhaW4sIHNob3VsZCBqdXN0IGRvIG5vdGhpbmcKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZUFsbChmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoRHVwbGljYXRlQ2FzY2FkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJCi0JCW9uZVRvT25lLnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ly9UT0RPIHNob3VsZCB0aGUgcmVzb3VyY2UgbW9kZWwgaGFuZGxlIHRoaXMgYW5kIHJlbW92ZSBib3RoIE1FUkdFIAotCQkJCQkJCQkJCS8vc2V0dGluZ3MgaW5zdGVhZCBvZiBoYXZpbmcgdG8gc2V0IGl0IGZhbHNlIHR3aWNlPwotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmUuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoTXVsdGlwbGVDYXNjYWRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkJCi0JCW9uZVRvT25lLnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUoY2FzY2FkZSA9IFJFTU9WRSkiLCBjdSk7Ci0JCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlUmVtb3ZlKGZhbHNlKTsJCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PcmRlckJ5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09yZGVyQnlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWFmMjEwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09yZGVyQnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9yZGVyQnlBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcmRlckJ5VGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBPcmRlckJ5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPcmRlckJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT1JERVJfQlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPcmRlckJ5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9yZGVyQnlXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PUkRFUl9CWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9yZGVyQnkodmFsdWUgPSBcImtleVwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3JkZXJCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T3JkZXJCeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT3JkZXJCeUFubm90YXRpb24gb3JkZXJCeSA9IChPcmRlckJ5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PUkRFUl9CWSk7Ci0JCWFzc2VydE5vdE51bGwob3JkZXJCeSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T3JkZXJCeVdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT3JkZXJCeUFubm90YXRpb24gb3JkZXJCeSA9IChPcmRlckJ5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PUkRFUl9CWSk7Ci0JCWFzc2VydEVxdWFscygia2V5Iiwgb3JkZXJCeS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPcmRlckJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0KLQkJT3JkZXJCeUFubm90YXRpb24gb3JkZXJCeSA9IChPcmRlckJ5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PUkRFUl9CWSk7Ci0KLQkJb3JkZXJCeS5zZXRWYWx1ZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9yZGVyQnkoXCJmb29cIikiLCBjdSk7Ci0JCQotCQlvcmRlckJ5LnNldFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPcmRlckJ5IiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzY1ZDM4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OQU1FID0gIk1ZX0NPTFVNTiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiA9ICJDT0xVTU5fREVGSU5JVElPTiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FID0gIk1ZX1JFRl9DT0xVTU5fTkFNRSI7Ci0JCi0JcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAUHJpbWFyeUtleUpvaW5Db2x1bW4iKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5XaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiIiArIENPTFVNTl9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbldpdGhSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAUHJpbWFyeUtleUpvaW5Db2x1bW4ocmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIiIgKyBDT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5XaXRoQ29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAUHJpbWFyeUtleUpvaW5Db2x1bW4oY29sdW1uRGVmaW5pdGlvbiA9IFwiIiArIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQotCQljb2x1bW4uc2V0TmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJY29sdW1uLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFByaW1hcnlLZXlKb2luQ29sdW1uKCIsIGN1KTsKLQl9Ci0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5XaXRoUmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUUsIGNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCWNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihyZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiRm9vXCIpIiwgY3UpOwotCi0JCQotCQljb2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAUHJpbWFyeUtleUpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbldpdGhDb2x1bW5EZWZpbml0aW9uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0KLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihjb2x1bW5EZWZpbml0aW9uID0gXCJGb29cIikiLCBjdSk7Ci0KLQkJCi0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFByaW1hcnlLZXlKb2luQ29sdW1uKCIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9QcmltYXJ5S2V5Sm9pbkNvbHVtbnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmEwYmI2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5zVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05BTUUgPSAiTVlfQ09MVU1OIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OID0gIkNPTFVNTl9ERUZJTklUSU9OIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgPSAiTVlfUkVGX0NPTFVNTl9OQU1FIjsKLQkKLQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW5zVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoQFByaW1hcnlLZXlKb2luQ29sdW1uKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbldpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIiIgKyBDT0xVTU5fTkFNRSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uV2l0aFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoQFByaW1hcnlLZXlKb2luQ29sdW1uKHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCIiICsgQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbldpdGhDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoQFByaW1hcnlLZXlKb2luQ29sdW1uKGNvbHVtbkRlZmluaXRpb24gPSBcIiIgKyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCi0JCWNvbHVtbi5zZXROYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAUHJpbWFyeUtleUpvaW5Db2x1bW5zKEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJGb29cIikpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQljb2x1bW4uc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAUHJpbWFyeUtleUpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5XaXRoUmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUUsIGNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQljb2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAUHJpbWFyeUtleUpvaW5Db2x1bW5zKEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihyZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiRm9vXCIpKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFByaW1hcnlLZXlKb2luQ29sdW1uKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5XaXRoQ29sdW1uRGVmaW5pdGlvbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04sIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFByaW1hcnlLZXlKb2luQ29sdW1ucyhAUHJpbWFyeUtleUpvaW5Db2x1bW4oY29sdW1uRGVmaW5pdGlvbiA9IFwiRm9vXCIpKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAUHJpbWFyeUtleUpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUHJpbWFyeUtleUpvaW5Db2x1bW5Db3B5RXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJAUHJpbWFyeUtleUpvaW5Db2x1bW5zKHsiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiksIjsKLQkJU3RyaW5nIGV4cGVjdGVkMyA9ICJAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpIH0pIjsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMSwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUHJpbWFyeUtleUpvaW5Db2x1bW5Ub0JlZ2lubmluZ09mTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoeyI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiKSwiOwotCQlTdHJpbmcgZXhwZWN0ZWQzID0gIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJGT09cIikgfSkiOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigxLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCQkKLQkJZXhwZWN0ZWQyID0gIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVpcIiksIjsKLQkJZXhwZWN0ZWQzID0gIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJGT09cIikgfSkiOwotCQlqb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiQkFaIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0KLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBwa0pvaW5Db2x1bW5zID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHBrSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBwa0pvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcGtKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnRFcXVhbHMoMywgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uQ29weUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVN0cmluZyBleHBlY3RlZDEgPSAiQFByaW1hcnlLZXlKb2luQ29sdW1ucyh7IjsKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIpLCI7Ci0JCVN0cmluZyBleHBlY3RlZDMgPSAiQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSB9KSI7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0JCQotCQlleHBlY3RlZDEgPSAiQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiKSI7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMiLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9RdWVyeUhpbnRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUXVlcnlIaW50VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEwNzQyNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9RdWVyeUhpbnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5RdWVyeUhpbnRBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBRdWVyeUhpbnRUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0hJTlRfTkFNRSA9ICJteUhpbnQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9ISU5UX1ZBTFVFID0gIm15VmFsdWUiOwotCQotCXB1YmxpYyBRdWVyeUhpbnRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5SGludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5OQU1FRF9RVUVSWSwgSlBBLlFVRVJZX0hJTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZFF1ZXJ5KGhpbnRzID0ge0BRdWVyeUhpbnQobmFtZSA9IFwiIiArIFFVRVJZX0hJTlRfTkFNRSArICJcIiwgdmFsdWUgPSBcIiIgKyBRVUVSWV9ISU5UX1ZBTFVFICsgIlwiKSwgQFF1ZXJ5SGludH0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5SGludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCVF1ZXJ5SGludEFubm90YXRpb24gcXVlcnlIaW50ID0gbmFtZWRRdWVyeS5oaW50QXQoMCk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9ISU5UX05BTUUsIHF1ZXJ5SGludC5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5SGludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCVF1ZXJ5SGludEFubm90YXRpb24gcXVlcnlIaW50ID0gbmFtZWRRdWVyeS5oaW50QXQoMCk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9ISU5UX05BTUUsIHF1ZXJ5SGludC5nZXROYW1lKCkpOwotCQkKLQkJcXVlcnlIaW50LnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHF1ZXJ5SGludC5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBRdWVyeUhpbnQobmFtZSA9IFwiZm9vXCIsIHZhbHVlID0gXCIiICsgUVVFUllfSElOVF9WQUxVRSArICJcIikiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGQ0ZWQ1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlY29uZGFyeVRhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNlY29uZGFyeVRhYmxlVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJNWV9UQUJMRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9OQU1FID0gIk1ZX1NDSEVNQSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEFMT0dfTkFNRSA9ICJNWV9DQVRBTE9HIjsKLQkKLQlwdWJsaWMgU2Vjb25kYXJ5VGFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCIiICsgVEFCTEVfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGUoc2NoZW1hID0gXCIiICsgU0NIRU1BX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZShjYXRhbG9nID0gXCIiICsgQ0FUQUxPR19OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlVOSVFVRV9DT05TVFJBSU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFBrSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnMgPSB7QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBWlwiKX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCB0YWJsZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0TmFtZSgpKTsKLQotCQl0YWJsZS5zZXROYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB0YWJsZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCB0YWJsZS5nZXROYW1lKCkpOwotCQkKLQkJdGFibGUuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZWNvbmRhcnlUYWJsZSgiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aENhdGFsb2coKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKENBVEFMT0dfTkFNRSwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRDYXRhbG9nKCkpOwotCi0JCXRhYmxlLnNldENhdGFsb2coIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKGNhdGFsb2cgPSBcIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhdGFsb2dOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhDYXRhbG9nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKENBVEFMT0dfTkFNRSwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCXRhYmxlLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2Vjb25kYXJ5VGFibGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKFNDSEVNQV9OQU1FLCB0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRTY2hlbWEoKSk7Ci0KLQkJdGFibGUuc2V0U2NoZW1hKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKHNjaGVtYSA9IFwiRm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2NoZW1hTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKFNDSEVNQV9OQU1FLCB0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQl0YWJsZS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZWNvbmRhcnlUYWJsZSgiLCBjdSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5nZXRDb2x1bW5OYW1lc1NpemUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiQkFSXCIpLEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJGT09cIiksIEBVbmlxdWVDb25zdHJhaW50fSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCUl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KX0pIiwgY3UpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSkpIiwgY3UpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2Vjb25kYXJ5VGFibGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoMywgc2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSl9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoMywgc2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMik7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDIpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZWNvbmRhcnlUYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KX0pIiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UGtKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRQa0pvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFBrSm9pbkNvbHVtbnMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCXRhYmxlLmFkZFBrSm9pbkNvbHVtbigwKTsKLQkJdGFibGUuYWRkUGtKb2luQ29sdW1uKDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFBrSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UGtKb2luQ29sdW1uczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFBrSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRQa0pvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFBrSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0KLQkJCi0JCXRhYmxlLmFkZFBrSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJdGFibGUuYWRkUGtKb2luQ29sdW1uKDApOwotCQl0YWJsZS5hZGRQa0pvaW5Db2x1bW4oMCkuc2V0TmFtZSgiQkFSIik7Ly90ZXN0IGFkZGluZyBhIHBrSm9pbkNvbHVtbiBpbiBmcm9udCBvZiAyIG90aGVyIGpvaW5Db2x1bW5zCi0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS5wa0pvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLnBrSm9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUucGtKb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0UGtKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUocGtKb2luQ29sdW1ucyA9IHtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLEBQcmltYXJ5S2V5Sm9pbkNvbHVtbiwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUGtKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhQa0pvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkKLQkJdGFibGUucmVtb3ZlUGtKb2luQ29sdW1uKDEpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnMgPSB7QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBWlwiKX0pIiwgY3UpOwotCi0JCXRhYmxlLnJlbW92ZVBrSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zID0gQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBWlwiKSkiLCBjdSk7Ci0KLQkJCi0JCXRhYmxlLnJlbW92ZVBrSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZWNvbmRhcnlUYWJsZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlUGtKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhQa0pvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLnBrSm9pbkNvbHVtbkF0KDApOwotCQlqb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZfTkFNRSIpOwotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJdGFibGUubW92ZVBrSm9pbkNvbHVtbigyLCAwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zID0ge0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVpcIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVQa0pvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhQa0pvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCi0JCQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLnBrSm9pbkNvbHVtbkF0KDApOwotCQlqb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZfTkFNRSIpOwotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJdGFibGUubW92ZVBrSm9pbkNvbHVtbigwLCAyKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zID0ge0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVpcIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJGT09cIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFBrSm9pbkNvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFBrSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRQa0pvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUucGtKb2luQ29sdW1uQXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zID0ge0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJmb29cIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVpcIil9KSIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlY29uZGFyeVRhYmxlc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZXNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjg2NmE4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlY29uZGFyeVRhYmxlc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNlY29uZGFyeVRhYmxlc1Rlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAiTVlfVEFCTEUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfTkFNRSA9ICJNWV9TQ0hFTUEiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRBTE9HX05BTUUgPSAiTVlfQ0FUQUxPRyI7Ci0JCi0JcHVibGljIFNlY29uZGFyeVRhYmxlc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiIiArIFRBQkxFX05BTUUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShzY2hlbWEgPSBcIiIgKyBTQ0hFTUFfTkFNRSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShjYXRhbG9nID0gXCIiICsgQ0FUQUxPR19OQU1FICsgIlwiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMsIEpQQS5VTklRVUVfQ09OU1RSQUlOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludH0pKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlVOSVFVRV9DT05TVFJBSU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIiwgY2F0YWxvZyA9IFwiQkFSXCIsIHNjaGVtYSA9IFwiQkFaXCIsIHVuaXF1ZUNvbnN0cmFpbnRzID0gQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlc1dpdGhQa0pvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuU0VDT05EQVJZX1RBQkxFUywgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zID0ge0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVpcIil9KSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQlhc3NlcnROb3ROdWxsKHNlY29uZGFyeVRhYmxlcyk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIHNlY29uZGFyeVRhYmxlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWFzc2VydE51bGwoc2Vjb25kYXJ5VGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHNlY29uZGFyeVRhYmxlLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkKLQkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXROYW1lKCkpOwotCi0JCXNlY29uZGFyeVRhYmxlLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHNlY29uZGFyeVRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRm9vXCIpKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIHNlY29uZGFyeVRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHNlY29uZGFyeVRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlY29uZGFyeVRhYmxlKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoQ2F0YWxvZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhDQVRBTE9HX05BTUUsIHNlY29uZGFyeVRhYmxlLmdldENhdGFsb2coKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWFzc2VydE51bGwoc2Vjb25kYXJ5VGFibGUuZ2V0Q2F0YWxvZygpKTsKLQotCQlzZWNvbmRhcnlUYWJsZS5zZXRDYXRhbG9nKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBzZWNvbmRhcnlUYWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKGNhdGFsb2cgPSBcIkZvb1wiKSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXRhbG9nTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoQ2F0YWxvZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhDQVRBTE9HX05BTUUsIHNlY29uZGFyeVRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZS5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHNlY29uZGFyeVRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlY29uZGFyeVRhYmxlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbChzZWNvbmRhcnlUYWJsZSk7Ci0JCWFzc2VydEVxdWFscyhTQ0hFTUFfTkFNRSwgc2Vjb25kYXJ5VGFibGUuZ2V0U2NoZW1hKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWFzc2VydE51bGwoc2Vjb25kYXJ5VGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCXNlY29uZGFyeVRhYmxlLnNldFNjaGVtYSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgc2Vjb25kYXJ5VGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHNjaGVtYSA9IFwiRm9vXCIpKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNjaGVtYU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhTQ0hFTUFfTkFNRSwgc2Vjb25kYXJ5VGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGUuc2V0U2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKHNlY29uZGFyeVRhYmxlLmdldFNjaGVtYSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2Vjb25kYXJ5VGFibGUoIiwgY3UpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgc2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygyLCBzZWNvbmRhcnlUYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkZPTyIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuZ2V0Q29sdW1uTmFtZXNTaXplKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiQkFSXCIpLEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJGT09cIiksIEBVbmlxdWVDb25zdHJhaW50fSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkZPT1wiKSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pfSkiLCBjdSk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSkpIiwgY3UpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZWNvbmRhcnlUYWJsZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuZ2V0Q29sdW1uTmFtZXNTaXplKCkpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuZ2V0Q29sdW1uTmFtZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludCwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkZPT1wiKX0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDIpLmdldENvbHVtbk5hbWVzU2l6ZSgpKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDIpOwotCQlhc3NlcnRFcXVhbHMoMCwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmdldENvbHVtbk5hbWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50LCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiRk9PXCIpLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSl9KSkiLCBjdSk7Ci0JfQotCQotCQotCS8vICBARW50aXR5ICAgICAJCQkJLS0+PiAgICBARW50aXR5Ci0JLy8JQFNlY29uZGFyeVRhYmxlKG5hbWU9IkZPTyIpCQkJQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWU9IkZPTyIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZT0iQkFSIil9KQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU2Vjb25kYXJ5VGFibGVDb3B5RXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJAU2Vjb25kYXJ5VGFibGVzKHsiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIiwgY2F0YWxvZyA9IFwiQkFSXCIsIHNjaGVtYSA9IFwiQkFaXCIsIHVuaXF1ZUNvbnN0cmFpbnRzID0gQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7IFwiQkFSXCIgfSkpLCI7Ci0JCVN0cmluZyBleHBlY3RlZDMgPSAiQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBUlwiKSB9KSI7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlzZWNvbmRhcnlUYWJsZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShKUEEuU0VDT05EQVJZX1RBQkxFKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTZWNvbmRhcnlUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBTZWNvbmRhcnlUYWJsZXMoeyI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkZPT1wiLCBjYXRhbG9nID0gXCJCQVJcIiwgc2NoZW1hID0gXCJCQVpcIiwgdW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHsgXCJCQVJcIiB9KSksIjsKLQkJU3RyaW5nIGV4cGVjdGVkMyA9ICJAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFSXCIpIH0pIjsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCXNlY29uZGFyeVRhYmxlLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCQkKLQkJZXhwZWN0ZWQyID0gIkBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVpcIiksIjsKLQkJZXhwZWN0ZWQzID0gIkBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIiwgY2F0YWxvZyA9IFwiQkFSXCIsIHNjaGVtYSA9IFwiQkFaXCIsIHVuaXF1ZUNvbnN0cmFpbnRzID0gQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7IFwiQkFSXCIgfSkpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFSXCIpIH0pIjsKLQkJc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJc2Vjb25kYXJ5VGFibGUuc2V0TmFtZSgiQkFaIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0KLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBzZWNvbmRhcnlUYWJsZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLlNFQ09OREFSWV9UQUJMRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLlNFQ09OREFSWV9UQUJMRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTZWNvbmRhcnlUYWJsZUNvcHlFeGlzdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBTZWNvbmRhcnlUYWJsZXMoeyI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkZPT1wiLCBjYXRhbG9nID0gXCJCQVJcIiwgc2NoZW1hID0gXCJCQVpcIiwgdW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHsgXCJCQVJcIiB9KSksIjsKLQkJU3RyaW5nIGV4cGVjdGVkMyA9ICJAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFSXCIpIH0pIjsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCXNlY29uZGFyeVRhYmxlLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCQkKLQkJZXhwZWN0ZWQxID0gIkBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIiwgY2F0YWxvZyA9IFwiQkFSXCIsIHNjaGVtYSA9IFwiQkFaXCIsIHVuaXF1ZUNvbnN0cmFpbnRzID0gQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7IFwiQkFSXCIgfSkpIjsKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlY29uZGFyeVRhYmxlcyIsIGN1KTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UGtKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFBrSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UGtKb2luQ29sdW1uczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCXRhYmxlLmFkZFBrSm9pbkNvbHVtbigwKTsKLQkJdGFibGUuYWRkUGtKb2luQ29sdW1uKDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFBrSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UGtKb2luQ29sdW1uczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlc1dpdGhQa0pvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0UGtKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRQa0pvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCXRhYmxlLmFkZFBrSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJdGFibGUuYWRkUGtKb2luQ29sdW1uKDEpOwotCQl0YWJsZS5hZGRQa0pvaW5Db2x1bW4oMCkuc2V0TmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnMgPSB7QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSxAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW59KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQa0pvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlc1dpdGhQa0pvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkKLQkJdGFibGUucmVtb3ZlUGtKb2luQ29sdW1uKDEpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUocGtKb2luQ29sdW1ucyA9IHtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFaXCIpfSkpIiwgY3UpOwotCi0JCXRhYmxlLnJlbW92ZVBrSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnMgPSBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFaXCIpKSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVQa0pvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2Vjb25kYXJ5VGFibGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVBrSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzV2l0aFBrSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUucGtKb2luQ29sdW1uQXQoMCk7Ci0JCWpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRl9OQU1FIik7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQl0YWJsZS5tb3ZlUGtKb2luQ29sdW1uKDIsIDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUocGtKb2luQ29sdW1ucyA9IHtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFaXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIpfSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVBrSm9pbkNvbHVtbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlc1dpdGhQa0pvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCi0JCQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLnBrSm9pbkNvbHVtbkF0KDApOwotCQlqb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZfTkFNRSIpOwotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJdGFibGUubW92ZVBrSm9pbkNvbHVtbigwLCAyKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnMgPSB7QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBWlwiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFBrSm9pbkNvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlc1dpdGhQa0pvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0UGtKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLnBrSm9pbkNvbHVtbkF0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlqb2luQ29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zID0ge0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJmb29cIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVpcIil9KSkiLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlOTljYWYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2VxdWVuY2VHZW5lcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNlcXVlbmNlR2VuZXJhdG9yVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUT1JfTkFNRSA9ICJNWV9HRU5FUkFUT1IiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUT1JfU0VRVUVOQ0VfTkFNRSA9ICJNWV9TRVFVRU5DRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZWdlciBHRU5FUkFUT1JfQUxMT0NBVElPTl9TSVpFID0gSW50ZWdlci52YWx1ZU9mKDUpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgR0VORVJBVE9SX0lOSVRJQUxfVkFMVUUgPSBJbnRlZ2VyLnZhbHVlT2YoNSk7Ci0JCi0JcHVibGljIFNlcXVlbmNlR2VuZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JPbkZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAU2VxdWVuY2VHZW5lcmF0b3IiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JPblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZXF1ZW5jZUdlbmVyYXRvciIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JXaXRoU3RyaW5nRWxlbWVudCgibmFtZSIsIEdFTkVSQVRPUl9OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhTZXF1ZW5jZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhTdHJpbmdFbGVtZW50KCJzZXF1ZW5jZU5hbWUiLCBHRU5FUkFUT1JfU0VRVUVOQ0VfTkFNRSk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JXaXRoU3RyaW5nRWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAU2VxdWVuY2VHZW5lcmF0b3IoIiArIGVsZW1lbnROYW1lICsgIiA9IFwiIiArIHZhbHVlICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhBbGxvY2F0aW9uU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aEludEVsZW1lbnQoImFsbG9jYXRpb25TaXplIiwgR0VORVJBVE9SX0FMTE9DQVRJT05fU0laRS5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhJbnRFbGVtZW50KCJpbml0aWFsVmFsdWUiLCBHRU5FUkFUT1JfSU5JVElBTF9WQUxVRS5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhJbnRFbGVtZW50KGZpbmFsIFN0cmluZyBlbGVtZW50TmFtZSwgZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZXF1ZW5jZUdlbmVyYXRvcigiICsgZWxlbWVudE5hbWUgKyAiID0gIiArIHZhbHVlICsgIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcXVlbmNlR2VuZXJhdG9yT25GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWFzc2VydE5vdE51bGwoc2VxdWVuY2VHZW5lcmF0b3IpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2VxdWVuY2VHZW5lcmF0b3JPblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yT25UeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJYXNzZXJ0Tm90TnVsbChzZXF1ZW5jZUdlbmVyYXRvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9OQU1FLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfTkFNRSwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlcXVlbmNlR2VuZXJhdG9yKG5hbWUgPSBcImZvb1wiKSIsIGN1KTsKLQkJCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2VxdWVuY2VHZW5lcmF0b3IoIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTZXF1ZW5jZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aFNlcXVlbmNlTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX1NFUVVFTkNFX05BTUUsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNlcXVlbmNlTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2VxdWVuY2VOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhTZXF1ZW5jZU5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9TRVFVRU5DRV9OQU1FLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTZXF1ZW5jZU5hbWUoKSk7Ci0JCQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTZXF1ZW5jZU5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNlcXVlbmNlTmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2VxdWVuY2VHZW5lcmF0b3Ioc2VxdWVuY2VOYW1lID0gXCJmb29cIikiLCBjdSk7Ci0JCQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTZXF1ZW5jZU5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U2VxdWVuY2VOYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZXF1ZW5jZUdlbmVyYXRvcigiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhBbGxvY2F0aW9uU2l6ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX0FMTE9DQVRJT05fU0laRSwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhBbGxvY2F0aW9uU2l6ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX0FMTE9DQVRJT05fU0laRSwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoNTAwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTAwKSwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlcXVlbmNlR2VuZXJhdG9yKGFsbG9jYXRpb25TaXplID0gNTAwKSIsIGN1KTsKLQkJCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldEFsbG9jYXRpb25TaXplKG51bGwpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZXF1ZW5jZUdlbmVyYXRvcigiLCBjdSk7Ci0KLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDApKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZXF1ZW5jZUdlbmVyYXRvcihhbGxvY2F0aW9uU2l6ZSA9IDApIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW5pdGlhbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhJbml0aWFsVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9JTklUSUFMX1ZBTFVFLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEluaXRpYWxWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JXaXRoSW5pdGlhbFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfSU5JVElBTF9WQUxVRSwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0SW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZig1MDApKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1MDApLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlcXVlbmNlR2VuZXJhdG9yKGluaXRpYWxWYWx1ZSA9IDUwMCkiLCBjdSk7Ci0JCQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRJbml0aWFsVmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlcXVlbmNlR2VuZXJhdG9yKCIsIGN1KTsKLQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRJbml0aWFsVmFsdWUoSW50ZWdlci52YWx1ZU9mKDApKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZXF1ZW5jZUdlbmVyYXRvcihpbml0aWFsVmFsdWUgPSAwKSIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RhYmxlR2VuZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RhYmxlR2VuZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyZWMwNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UYWJsZUdlbmVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGFibGVHZW5lcmF0b3JUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRPUl9OQU1FID0gIk1ZX0dFTkVSQVRPUiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRPUl9UQUJMRSA9ICJNWV9UQUJMRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRPUl9DQVRBTE9HID0gIk1ZX0NBVEFMT0ciOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUT1JfU0NIRU1BID0gIk1ZX1NDSEVNQSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRPUl9QS19DT0xVTU5fTkFNRSA9ICJNWV9QS19DT0xVTU5fTkFNRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRPUl9WQUxVRV9DT0xVTU5fTkFNRSA9ICJNWV9WQUxVRV9DT0xVTU5fTkFNRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRPUl9QS19DT0xVTU5fVkFMVUUgPSAiTVlfUEtfQ09MVU1OX1ZBTFVFIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIEdFTkVSQVRPUl9BTExPQ0FUSU9OX1NJWkUgPSBJbnRlZ2VyLnZhbHVlT2YoNSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZWdlciBHRU5FUkFUT1JfSU5JVElBTF9WQUxVRSA9IEludGVnZXIudmFsdWVPZig1KTsKLQkKLQlwdWJsaWMgVGFibGVHZW5lcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvck9uRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZUdlbmVyYXRvciIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvck9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRhYmxlR2VuZXJhdG9yIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhTdHJpbmdFbGVtZW50KCJuYW1lIiwgR0VORVJBVE9SX05BTUUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoU3RyaW5nRWxlbWVudCgidGFibGUiLCBHRU5FUkFUT1JfVEFCTEUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhTdHJpbmdFbGVtZW50KCJjYXRhbG9nIiwgR0VORVJBVE9SX0NBVEFMT0cpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFN0cmluZ0VsZW1lbnQoInNjaGVtYSIsIEdFTkVSQVRPUl9TQ0hFTUEpOwotCX0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFBrQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFN0cmluZ0VsZW1lbnQoInBrQ29sdW1uTmFtZSIsIEdFTkVSQVRPUl9QS19DT0xVTU5fTkFNRSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoVmFsdWVDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoU3RyaW5nRWxlbWVudCgidmFsdWVDb2x1bW5OYW1lIiwgR0VORVJBVE9SX1ZBTFVFX0NPTFVNTl9OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhQa0NvbHVtblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoU3RyaW5nRWxlbWVudCgicGtDb2x1bW5WYWx1ZSIsIEdFTkVSQVRPUl9QS19DT0xVTU5fVkFMVUUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoU3RyaW5nRWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGVHZW5lcmF0b3IoIiArIGVsZW1lbnROYW1lICsgIiA9IFwiIiArIHZhbHVlICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhBbGxvY2F0aW9uU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aEludEVsZW1lbnQoImFsbG9jYXRpb25TaXplIiwgR0VORVJBVE9SX0FMTE9DQVRJT05fU0laRS5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhJbnRFbGVtZW50KCJpbml0aWFsVmFsdWUiLCBHRU5FUkFUT1JfSU5JVElBTF9WQUxVRS5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhJbnRFbGVtZW50KGZpbmFsIFN0cmluZyBlbGVtZW50TmFtZSwgZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZUdlbmVyYXRvcigiICsgZWxlbWVudE5hbWUgKyAiID0gIiArIHZhbHVlICsgIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlRBQkxFX0dFTkVSQVRPUiwgSlBBLlVOSVFVRV9DT05TVFJBSU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGVHZW5lcmF0b3IodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZUdlbmVyYXRvck9uRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlR2VuZXJhdG9yKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlR2VuZXJhdG9yT25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvck9uVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCWFzc2VydE5vdE51bGwodGFibGVHZW5lcmF0b3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfTkFNRSwgdGFibGVHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX05BTUUsIHRhYmxlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0YWJsZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcihuYW1lID0gXCJmb29cIikiLCBjdSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlR2VuZXJhdG9yKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfVEFCTEUsIHRhYmxlR2VuZXJhdG9yLmdldFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9UQUJMRSwgdGFibGVHZW5lcmF0b3IuZ2V0VGFibGUoKSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXRUYWJsZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGFibGVHZW5lcmF0b3IuZ2V0VGFibGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKHRhYmxlID0gXCJmb29cIikiLCBjdSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXRUYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRUYWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGVHZW5lcmF0b3IoIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhDYXRhbG9nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfQ0FUQUxPRywgdGFibGVHZW5lcmF0b3IuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoQ2F0YWxvZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX0NBVEFMT0csIHRhYmxlR2VuZXJhdG9yLmdldENhdGFsb2coKSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXRDYXRhbG9nKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0YWJsZUdlbmVyYXRvci5nZXRDYXRhbG9nKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcihjYXRhbG9nID0gXCJmb29cIikiLCBjdSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldENhdGFsb2coKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlR2VuZXJhdG9yKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9TQ0hFTUEsIHRhYmxlR2VuZXJhdG9yLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9TQ0hFTUEsIHRhYmxlR2VuZXJhdG9yLmdldFNjaGVtYSgpKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFNjaGVtYSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGFibGVHZW5lcmF0b3IuZ2V0U2NoZW1hKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcihzY2hlbWEgPSBcImZvb1wiKSIsIGN1KTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRTY2hlbWEoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlR2VuZXJhdG9yKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UGtDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhQa0NvbHVtbk5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9QS19DT0xVTU5fTkFNRSwgdGFibGVHZW5lcmF0b3IuZ2V0UGtDb2x1bW5OYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRQa0NvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFBrQ29sdW1uTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX1BLX0NPTFVNTl9OQU1FLCB0YWJsZUdlbmVyYXRvci5nZXRQa0NvbHVtbk5hbWUoKSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXRQa0NvbHVtbk5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRhYmxlR2VuZXJhdG9yLmdldFBrQ29sdW1uTmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IocGtDb2x1bW5OYW1lID0gXCJmb29cIikiLCBjdSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXRQa0NvbHVtbk5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0UGtDb2x1bW5OYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZUdlbmVyYXRvcigiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUNvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFZhbHVlQ29sdW1uTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX1ZBTFVFX0NPTFVNTl9OQU1FLCB0YWJsZUdlbmVyYXRvci5nZXRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoVmFsdWVDb2x1bW5OYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfVkFMVUVfQ09MVU1OX05BTUUsIHRhYmxlR2VuZXJhdG9yLmdldFZhbHVlQ29sdW1uTmFtZSgpKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFZhbHVlQ29sdW1uTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGFibGVHZW5lcmF0b3IuZ2V0VmFsdWVDb2x1bW5OYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcih2YWx1ZUNvbHVtbk5hbWUgPSBcImZvb1wiKSIsIGN1KTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFZhbHVlQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlR2VuZXJhdG9yKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UGtDb2x1bW5WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoUGtDb2x1bW5WYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX1BLX0NPTFVNTl9WQUxVRSwgdGFibGVHZW5lcmF0b3IuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UGtDb2x1bW5WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoUGtDb2x1bW5WYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX1BLX0NPTFVNTl9WQUxVRSwgdGFibGVHZW5lcmF0b3IuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFBrQ29sdW1uVmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRhYmxlR2VuZXJhdG9yLmdldFBrQ29sdW1uVmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKHBrQ29sdW1uVmFsdWUgPSBcImZvb1wiKSIsIGN1KTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFBrQ29sdW1uVmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGVHZW5lcmF0b3IoIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbGxvY2F0aW9uU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoQWxsb2NhdGlvblNpemUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9BTExPQ0FUSU9OX1NJWkUsIHRhYmxlR2VuZXJhdG9yLmdldEFsbG9jYXRpb25TaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRBbGxvY2F0aW9uU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoQWxsb2NhdGlvblNpemUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9BTExPQ0FUSU9OX1NJWkUsIHRhYmxlR2VuZXJhdG9yLmdldEFsbG9jYXRpb25TaXplKCkpOwotCQkKLQkJdGFibGVHZW5lcmF0b3Iuc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDUwMCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUwMCksIHRhYmxlR2VuZXJhdG9yLmdldEFsbG9jYXRpb25TaXplKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcihhbGxvY2F0aW9uU2l6ZSA9IDUwMCkiLCBjdSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXRBbGxvY2F0aW9uU2l6ZShudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGVHZW5lcmF0b3IoIiwgY3UpOwotCi0JCXRhYmxlR2VuZXJhdG9yLnNldEFsbG9jYXRpb25TaXplKEludGVnZXIudmFsdWVPZigwKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IoYWxsb2NhdGlvblNpemUgPSAwKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEluaXRpYWxWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoSW5pdGlhbFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfSU5JVElBTF9WQUxVRSwgdGFibGVHZW5lcmF0b3IuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aEluaXRpYWxWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX0lOSVRJQUxfVkFMVUUsIHRhYmxlR2VuZXJhdG9yLmdldEluaXRpYWxWYWx1ZSgpKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoNTAwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTAwKSwgdGFibGVHZW5lcmF0b3IuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcihpbml0aWFsVmFsdWUgPSA1MDApIiwgY3UpOwotCQkKLQkJdGFibGVHZW5lcmF0b3Iuc2V0SW5pdGlhbFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZUdlbmVyYXRvcigiLCBjdSk7Ci0KLQkJdGFibGVHZW5lcmF0b3Iuc2V0SW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZigwKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IoaW5pdGlhbFZhbHVlID0gMCkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvck9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMywgdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkZPTyIpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDEpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGVHZW5lcmF0b3IudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3IudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50QXQoMikuZ2V0Q29sdW1uTmFtZXNTaXplKCkpOwotCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkJBUlwiKSxAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiRk9PXCIpLCBAVW5pcXVlQ29uc3RyYWludH0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSl9KSIsIGN1KTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IodW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSkpIiwgY3UpOwotCQkKLQkJdGFibGVHZW5lcmF0b3IucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZUdlbmVyYXRvcigiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSl9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSl9KSIsIGN1KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNGE2YjQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRhYmxlVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJNWV9UQUJMRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9OQU1FID0gIk1ZX1NDSEVNQSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEFMT0dfTkFNRSA9ICJNWV9DQVRBTE9HIjsKLQkKLQlwdWJsaWMgVGFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlRBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlRBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGUobmFtZSA9IFwiIiArIFRBQkxFX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlV2l0aFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlRBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGUoc2NoZW1hID0gXCIiICsgU0NIRU1BX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlV2l0aENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5UQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRhYmxlKGNhdGFsb2cgPSBcIiIgKyBDQVRBTE9HX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuVEFCTEUsIEpQQS5VTklRVUVfQ09OU1RSQUlOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSl9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCB0YWJsZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldE5hbWUoKSk7Ci0KLQkJdGFibGUuc2V0TmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgdGFibGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUobmFtZSA9IFwiRm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCB0YWJsZS5nZXROYW1lKCkpOwotCQkKLQkJdGFibGUuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZSgiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlV2l0aENhdGFsb2coKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnRFcXVhbHMoQ0FUQUxPR19OQU1FLCB0YWJsZS5nZXRDYXRhbG9nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0Q2F0YWxvZygpKTsKLQotCQl0YWJsZS5zZXRDYXRhbG9nKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB0YWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZShjYXRhbG9nID0gXCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXRhbG9nTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVXaXRoQ2F0YWxvZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKENBVEFMT0dfTkFNRSwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCXRhYmxlLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZVdpdGhTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnRFcXVhbHMoU0NIRU1BX05BTUUsIHRhYmxlLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCXRhYmxlLnNldFNjaGVtYSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgdGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZShzY2hlbWEgPSBcIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNjaGVtYU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlV2l0aFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKFNDSEVNQV9OQU1FLCB0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQl0YWJsZS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50czIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCQotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCQotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkZPTyIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5nZXRDb2x1bW5OYW1lc1NpemUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJCQVJcIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkZPT1wiKSwgQFVuaXF1ZUNvbnN0cmFpbnR9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKCJCQVIiKTsKLQkJdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmFkZENvbHVtbk5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludCxAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHsgXCJCQVJcIiwgXCJCQVpcIiB9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkZPT1wiKX0pIiwgY3UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuY29sdW1uTmFtZUF0KDApKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gY29sdW1uTmFtZXMgPSB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGNvbHVtbk5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgY29sdW1uTmFtZXMubmV4dCgpKTsKLQl9CQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KX0pIiwgY3UpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkZPTyIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoIkJBUiIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoIkJBWiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJGT09cIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkJBUlwiKSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkJBWlwiKX0pIiwgY3UpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiQkFSXCIpLEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJCQVpcIil9KSIsIGN1KTsKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiQkFaXCIpKSIsIGN1KTsKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgiQkFSIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgiQkFaIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkZPT1wiKSxAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiQkFSXCIpLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiQkFaXCIpfSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJGT09cIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkJBUlwiKX0pIiwgY3UpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJGT09cIikpIiwgY3UpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJCi0JCXRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSl9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJCi0JCXRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSl9KSIsIGN1KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UZW1wb3JhbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UZW1wb3JhbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOTUzOTAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGVtcG9yYWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRlbXBvcmFsVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBUZW1wb3JhbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5URU1QT1JBTCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRlbXBvcmFsIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRlbXBvcmFsV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuVEVNUE9SQUwsIEpQQS5URU1QT1JBTF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLkRBVEUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGVtcG9yYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVRlbXBvcmFsQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChUZW1wb3JhbEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEVNUE9SQUwpOwotCQlhc3NlcnROb3ROdWxsKHRlbXBvcmFsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUZW1wb3JhbFdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJVGVtcG9yYWxBbm5vdGF0aW9uIHRlbXBvcmFsID0gKFRlbXBvcmFsQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5URU1QT1JBTCk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGVtcG9yYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQotCQlUZW1wb3JhbEFubm90YXRpb24gdGVtcG9yYWwgPSAoVGVtcG9yYWxBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRFTVBPUkFMKTsKLQotCQl0ZW1wb3JhbC5zZXRWYWx1ZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRlbXBvcmFsKFRJTUUpIiwgY3UpOwotCQkKLQkJdGVtcG9yYWwuc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRlbXBvcmFsKCIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RyYW5zaWVudFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UcmFuc2llbnRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODE1NTE2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RyYW5zaWVudFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUcmFuc2llbnRUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIFRyYW5zaWVudFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHJhbnNpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuVFJBTlNJRU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVHJhbnNpZW50Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2llbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRyYW5zaWVudCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSmF2YVJlc291cmNlTm9kZSBtYXBwaW5nQW5ub3RhdGlvbiA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUobWFwcGluZ0Fubm90YXRpb24gaW5zdGFuY2VvZiBUcmFuc2llbnRBbm5vdGF0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ZlcnNpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVmVyc2lvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMDQ1ZTcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVmVyc2lvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVmVyc2lvblRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgVmVyc2lvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlZFUlNJT04pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBWZXJzaW9uIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VmVyc2lvbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSmF2YVJlc291cmNlTm9kZSBtYXBwaW5nQW5ub3RhdGlvbiA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRUcnVlKG1hcHBpbmdBbm5vdGF0aW9uIGluc3RhbmNlb2YgVmVyc2lvbkFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvdGVzdC54bWwgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjA5ZmZiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy8uY2xhc3NwYXRoIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxMjhmMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLy5jdnNpZ25vcmUgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYWVjZjcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg2MDYzYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVHVlIE1hciAwOCAxMjowODo0OSBFU1QgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyOTZjOWYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cwotQnVuZGxlLVZlcnNpb246IDIuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy5pbnRlcm5hbC5KcHRKcGFEYlRlc3RzUGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmU7YnVuZGxlLXZlcnNpb249IjEuMC4xIiwKLSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbDtidW5kbGUtdmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5kYjtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSJbNC4wLjAsNS4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3Jtczt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9hYm91dC5odG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjdhYjhmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL2RlcmJ5LnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvZGVyYnkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQyZDE1Ni4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvZGVyYnkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENvbmZpZ3VyZSB0aGUgd29ya3NwYWNlLSBhbmQgZGF0YWJhc2Ugc2VydmVyLXNwZWNpZmljIHNldHRpbmdzIGhlcmUuCi0KLSMgdXNlciBhbmQgcGFzc3dvcmQgYXJlIG9wdGlvbmFsIGZvciBEZXJieQotdXNlcklEID0gCi1wYXNzd29yZCA9IAotCi0jIHRoZSBKREJDIGRyaXZlciBKQVIocykgbXVzdCBiZSBzcGVjaWZpZWQ7Ci0jIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBKQVJzLCBzZXBhcmF0ZSB0aGUgbmFtZXMgd2l0aCBjb21tYXMKLSMgamFycyA9IEM6L2RlcmJ5L2xpYi9kZXJieS5qYXIKLWphcnMgPSAKLQotIyB0aGUgSkRCQyBVUkwgaXMgcmVxdWlyZWQgZm9yIERlcmJ5Ci0jIHVybCA9IGpkYmM6ZGVyYnk6QzovZGVyYnkvZGF0YS90ZXN0ZGI7Y3JlYXRlPXRydWUKLXVybCA9IApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL215c3FsLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvbXlzcWwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0MDdkZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvbXlzcWwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENvbmZpZ3VyZSB0aGUgd29ya3NwYWNlLSBhbmQgZGF0YWJhc2Ugc2VydmVyLXNwZWNpZmljIHNldHRpbmdzIGhlcmUuCi0KLSMgdXNlciBhbmQgcGFzc3dvcmQgYXJlIG9wdGlvbmFsLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCi11c2VySUQgPSAKLXBhc3N3b3JkID0gCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovbXlzcWwvbXlzcWwtY29ubmVjdG9yLWphdmEtNS4wLjYtYmluLmphcgotamFycyA9IAotCi0jIHRoZSBKREJDIFVSTCBpcyBvcHRpb25hbCBmb3IgTXlTUUwKLSMgdXJsID0gamRiYzpteXNxbDovL2xvY2FsaG9zdDozMzA2CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvb3JhY2xlMTBnLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvb3JhY2xlMTBnLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOTExYjQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQ29uZmlndXJlIHRoZSB3b3Jrc3BhY2UtIGFuZCBkYXRhYmFzZSBzZXJ2ZXItc3BlY2lmaWMgc2V0dGluZ3MgaGVyZS4KLQotIyB1c2VyIGFuZCBwYXNzd29yZCBhcmUgb3B0aW9uYWwsIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KLXVzZXJJRCA9IHNjb3R0Ci1wYXNzd29yZCA9IHRpZ2VyCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovb3JhY2xlL2pkYmMvbGliL29qZGJjNS5qYXIKLWphcnMgPSAKLQotIyB0aGUgSkRCQyBVUkwgaXMgcmVxdWlyZWQKLSMgdXJsID0gamRiYzpvcmFjbGU6dGhpbjpAbG9jYWxob3N0OjE1MjE6dGVzdGRiCi11cmwgPSAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9vcmFjbGUxMGdYRS5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZ1hFLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2N2MwMWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZ1hFLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDb25maWd1cmUgdGhlIHdvcmtzcGFjZS0gYW5kIGRhdGFiYXNlIHNlcnZlci1zcGVjaWZpYyBzZXR0aW5ncyBoZXJlLgotCi0jIHVzZXIgYW5kIHBhc3N3b3JkIGFyZSBvcHRpb25hbCwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQotdXNlcklEID0gc2NvdHQKLXBhc3N3b3JkID0gdGlnZXIKLQotIyB0aGUgSkRCQyBkcml2ZXIgSkFSKHMpIG11c3QgYmUgc3BlY2lmaWVkOwotIyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgSkFScywgc2VwYXJhdGUgdGhlIG5hbWVzIHdpdGggY29tbWFzCi0jIGphcnMgPSBDOi9vcmFjbGUvamRiYy9saWIvb2pkYmM1LmphcgotamFycyA9IAotCi0jIHRoZSBKREJDIFVSTCBpcyByZXF1aXJlZAotIyB1cmwgPSBqZGJjOm9yYWNsZTp0aGluOkBsb2NhbGhvc3Q6MTUyMTpYRQotdXJsID0gCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvb3JhY2xlOWkucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9vcmFjbGU5aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjkxMWI0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9vcmFjbGU5aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQ29uZmlndXJlIHRoZSB3b3Jrc3BhY2UtIGFuZCBkYXRhYmFzZSBzZXJ2ZXItc3BlY2lmaWMgc2V0dGluZ3MgaGVyZS4KLQotIyB1c2VyIGFuZCBwYXNzd29yZCBhcmUgb3B0aW9uYWwsIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KLXVzZXJJRCA9IHNjb3R0Ci1wYXNzd29yZCA9IHRpZ2VyCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovb3JhY2xlL2pkYmMvbGliL29qZGJjNS5qYXIKLWphcnMgPSAKLQotIyB0aGUgSkRCQyBVUkwgaXMgcmVxdWlyZWQKLSMgdXJsID0gamRiYzpvcmFjbGU6dGhpbjpAbG9jYWxob3N0OjE1MjE6dGVzdGRiCi11cmwgPSAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9wb3N0Z3Jlc3FsLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvcG9zdGdyZXNxbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmZhZmU0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9wb3N0Z3Jlc3FsLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDb25maWd1cmUgdGhlIHdvcmtzcGFjZS0gYW5kIGRhdGFiYXNlIHNlcnZlci1zcGVjaWZpYyBzZXR0aW5ncyBoZXJlLgotCi0jIHVzZXIgYW5kIHBhc3N3b3JkIGFyZSBvcHRpb25hbCwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQotdXNlcklEID0gCi1wYXNzd29yZCA9IAotCi0jIHRoZSBKREJDIGRyaXZlciBKQVIocykgbXVzdCBiZSBzcGVjaWZpZWQ7Ci0jIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBKQVJzLCBzZXBhcmF0ZSB0aGUgbmFtZXMgd2l0aCBjb21tYXMKLSMgamFycyA9IEM6L3Bvc3RncmVzcWwvamRiYy9wb3N0Z3Jlc3FsLTguMi01MDUuamRiYzMuamFyCi1qYXJzID0gCi0KLSMgdGhlIEpEQkMgVVJMIGlzIG9wdGlvbmFsIGZvciBQb3N0Z3JlU1FMCi0jIHVybCA9IGpkYmM6cG9zdGdyZXNxbApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL3NxbHNlcnZlci5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL3NxbHNlcnZlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzJiNjQ1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9zcWxzZXJ2ZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENvbmZpZ3VyZSB0aGUgd29ya3NwYWNlLSBhbmQgZGF0YWJhc2Ugc2VydmVyLXNwZWNpZmljIHNldHRpbmdzIGhlcmUuCi0KLSMgdXNlciBhbmQgcGFzc3dvcmQgYXJlIG9wdGlvbmFsLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCi11c2VySUQgPSAKLXBhc3N3b3JkID0gCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovc3Fsc2VydmVyL2xpYi9zcWxqZGJjLmphcgotamFycyA9IAotCi0jIHRoZSBKREJDIFVSTCBpcyByZXF1aXJlZAotIyB1cmwgPSBqZGJjOnNxbHNlcnZlcjovL2xvY2FsaG9zdDoxNDMzCi11cmwgPSAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9zeWJhc2UucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9zeWJhc2UucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkzZDVkNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvc3liYXNlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDb25maWd1cmUgdGhlIHdvcmtzcGFjZS0gYW5kIGRhdGFiYXNlIHNlcnZlci1zcGVjaWZpYyBzZXR0aW5ncyBoZXJlLgotCi0jIHVzZXIgYW5kIHBhc3N3b3JkIGFyZSBvcHRpb25hbCwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQotdXNlcklEID0gCi1wYXNzd29yZCA9IAotCi0jIHRoZSBKREJDIGRyaXZlciBKQVIocykgbXVzdCBiZSBzcGVjaWZpZWQ7Ci0jIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBKQVJzLCBzZXBhcmF0ZSB0aGUgbmFtZXMgd2l0aCBjb21tYXMKLSMgamFycyA9IEM6L3N5YmFzZS9saWIvamNvbm4zLmphcgotamFycyA9IAotCi0jIHRoZSBKREJDIFVSTCBpcyByZXF1aXJlZAotIyB1cmwgPSBqZGJjOnN5YmFzZTpUZHM6bG9jYWxob3N0OjUwMDAKLXVybCA9IApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5ODc3OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gSlBBIERCIFRlc3RzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9KREJDVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL0pEQkNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDJlZmE0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL0pEQkNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5zcWwuRHJpdmVyTWFuYWdlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBUaGVzZSBhcmVuJ3QgdGVzdHMuIFRoZXkgYXJlIGp1c3QgYW4gZWFzeSB3YXkgdG8gZHVtcCBKREJDIG1ldGFkYXRhIHRvIHRoZQotICogY29uc29sZS4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSkRCQ1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEpEQkNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVyYnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5kdW1wTWV0YURhdGEoREVSQlkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNeVNRTCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmR1bXBNZXRhRGF0YShNWVNRTCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9yYWNsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmR1bXBNZXRhRGF0YShPUkFDTEUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQb3N0Z3JlU1FMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZHVtcE1ldGFEYXRhKFBPU1RHUkVTUUwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeWJhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5kdW1wTWV0YURhdGEoU1lCQVNFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wTWV0YURhdGEoQ29ubmVjdGlvbkNvbmZpZyBjb25maWcpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqIFBMQVRGT1JNOiAiICsgY29uZmlnLnBsYXRmb3JtTmFtZSArICIgKioqKioiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCUNsYXNzLmZvck5hbWUoY29uZmlnLmRyaXZlckNsYXNzTmFtZSk7Ci0JCUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IERyaXZlck1hbmFnZXIuZ2V0Q29ubmVjdGlvbih0aGlzLmJ1aWxkVVJMKGNvbmZpZyksIGNvbmZpZy51c2VyLCBjb25maWcucGFzc3dvcmQpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNBVEFMT0dTOiIpOwotCQlKREJDVG9vbHMuZHVtcChjb25uZWN0aW9uLmdldE1ldGFEYXRhKCkuZ2V0Q2F0YWxvZ3MoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNDSEVNQVRBOiIpOwotCQlKREJDVG9vbHMuZHVtcChjb25uZWN0aW9uLmdldE1ldGFEYXRhKCkuZ2V0U2NoZW1hcygpKTsKLQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVVJMKENvbm5lY3Rpb25Db25maWcgY29uZmlnKSB7Ci0JCXJldHVybiAiamRiYzoiICsgY29uZmlnLmRhdGFiYXNlVVJMOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29ubmVjdGlvbkNvbmZpZyBERVJCWSA9Ci0JCW5ldyBDb25uZWN0aW9uQ29uZmlnKAotCQkJIkRlcmJ5IiwKLQkJCSJvcmcuYXBhY2hlLmRlcmJ5LmpkYmMuRW1iZWRkZWREcml2ZXIiLAotCQkJImRlcmJ5OkM6L2RlcmJ5L2RhdGEvdGVzdCIsCi0JCQludWxsLAotCQkJbnVsbAotCQkpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb25uZWN0aW9uQ29uZmlnIE1ZU1FMID0KLQkJbmV3IENvbm5lY3Rpb25Db25maWcoCi0JCQkiTXlTUUwiLAotCQkJImNvbS5teXNxbC5qZGJjLkRyaXZlciIsCi0JCQkibXlzcWw6Ly9sb2NhbGhvc3Q6MzMwNiIsCi0JCQkicm9vdCIsCi0JCQkib3JhY2xlIgotCQkpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb25uZWN0aW9uQ29uZmlnIE9SQUNMRSA9Ci0JCW5ldyBDb25uZWN0aW9uQ29uZmlnKAotCQkJIk9yYWNsZSIsCi0JCQkib3JhY2xlLmpkYmMuT3JhY2xlRHJpdmVyIiwKLQkJCSJvcmFjbGU6dGhpbjpAbG9jYWxob3N0OjE1MjE6b3JjbCIsCi0JCQkic2NvdHQiLAotCQkJInRpZ2VyIgotCQkpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb25uZWN0aW9uQ29uZmlnIFBPU1RHUkVTUUwgPQotCQluZXcgQ29ubmVjdGlvbkNvbmZpZygKLQkJCSJQb3N0Z3JlU1FMIiwKLQkJCSJvcmcucG9zdGdyZXNxbC5Ecml2ZXIiLAotCQkJInBvc3RncmVzcWw6cG9zdGdyZXMiLAotCQkJInBvc3RncmVzIiwKLQkJCSJvcmFjbGUiCi0JCSk7Ci0KLQkvLyB0aGUgU3liYXNlIHNlcnZlciBtdXN0IGJlIGNvbmZpZ3VyZWQgZXhwbGljaXRseSB0byAibG9jYWxob3N0IgotCS8vIGluIHRoZSBjb25maWcgZmlsZSBbU1lCQVNFXS9pbmkvc3FsLmluaQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29ubmVjdGlvbkNvbmZpZyBTWUJBU0UgPQotCQluZXcgQ29ubmVjdGlvbkNvbmZpZygKLQkJCSJTeWJhc2UiLAotCQkJImNvbS5zeWJhc2UuamRiYzMuamRiYy5TeWJEcml2ZXIiLAotCQkJInN5YmFzZTpUZHM6bG9jYWxob3N0OjUwMDAiLAotCQkJInNhIiwKLQkJCSJvcmFjbGUiCi0JCSk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIENvbm5lY3Rpb25Db25maWcgewotCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHBsYXRmb3JtTmFtZTsKLQkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBkcml2ZXJDbGFzc05hbWU7Ci0JCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZGF0YWJhc2VVUkw7Ci0JCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgdXNlcjsKLQkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBwYXNzd29yZDsKLQkJcHJvdGVjdGVkIENvbm5lY3Rpb25Db25maWcoCi0JCQkJU3RyaW5nIHBsYXRmb3JtTmFtZSwKLQkJCQlTdHJpbmcgZHJpdmVyQ2xhc3NOYW1lLAotCQkJCVN0cmluZyBkYXRhYmFzZVVSTCwKLQkJCQlTdHJpbmcgdXNlciwKLQkJCQlTdHJpbmcgcGFzc3dvcmQKLQkJKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wbGF0Zm9ybU5hbWUgPSBwbGF0Zm9ybU5hbWU7Ci0JCQl0aGlzLmRyaXZlckNsYXNzTmFtZSA9IGRyaXZlckNsYXNzTmFtZTsKLQkJCXRoaXMuZGF0YWJhc2VVUkwgPSBkYXRhYmFzZVVSTDsKLQkJCXRoaXMudXNlciA9IHVzZXI7Ci0JCQl0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL0pEQkNUb29scy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvSkRCQ1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmOGQ4NzkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvSkRCQ1Rvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOwotaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlc3VsdFNldEl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKREJDVG9vbHMgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIGR1bXAoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJZHVtcChleGVjdXRlKGNvbm5lY3Rpb24sIHNxbCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wKFJlc3VsdFNldCByZXN1bHRTZXQpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5vdXQpKTsKLQkJLy8gc3luY2hyb25pemUgdGhlIGNvbnNvbGUgc28gZXZlcnl0aGluZyBpcyBjb250aWd1b3VzCi0JCXN5bmNocm9uaXplZCAoU3lzdGVtLm91dCkgewotCQkJZHVtcE9uKHJlc3VsdFNldCwgcHcpOwotCQl9Ci0JCXB3LmZsdXNoKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGR1bXBPbihSZXN1bHRTZXQgcmVzdWx0U2V0LCBQcmludFdyaXRlciBwdykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCUFycmF5TGlzdDxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gbWFwcyA9IGNvbnZlcnRUb01hcHMocmVzdWx0U2V0KTsKLQkJZm9yIChJdGVyYXRvcjxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gbWFwU3RyZWFtID0gbWFwcy5pdGVyYXRvcigpOyBtYXBTdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gZW50cnlTdHJlYW0gPSBtYXBTdHJlYW0ubmV4dCgpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgZW50cnlTdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5ID0gZW50cnlTdHJlYW0ubmV4dCgpOwotCQkJCXB3LnByaW50KGVudHJ5LmdldEtleSgpKTsKLQkJCQlwdy5wcmludCgiID0gIik7Ci0JCQkJcHcucHJpbnQoZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJfQotCQkJaWYgKG1hcFN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCQlwdy5wcmludGxuKCk7Ci0JCQl9Ci0JCX0KLQkJcHcucHJpbnRsbigidG90YWwgcm93czogIiArIG1hcHMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFycmF5TGlzdDxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gY29udmVydFRvTWFwcyhDb25uZWN0aW9uIGNvbm5lY3Rpb24sIFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlyZXR1cm4gY29udmVydFRvTWFwcyhleGVjdXRlKGNvbm5lY3Rpb24sIHNxbCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVzdWx0U2V0IGV4ZWN1dGUoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJU3RhdGVtZW50IHN0YXRlbWVudCA9IGNvbm5lY3Rpb24uY3JlYXRlU3RhdGVtZW50KCk7Ci0JCXN0YXRlbWVudC5leGVjdXRlKHNxbCk7Ci0JCVJlc3VsdFNldCByZXN1bHRTZXQgPSBzdGF0ZW1lbnQuZ2V0UmVzdWx0U2V0KCk7Ci0JCXN0YXRlbWVudC5jbG9zZSgpOwotCQlyZXR1cm4gcmVzdWx0U2V0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXJyYXlMaXN0PEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PiBjb252ZXJ0VG9NYXBzKFJlc3VsdFNldCByZXN1bHRTZXQpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlBcnJheUxpc3Q8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IHJvd3MgPSBuZXcgQXJyYXlMaXN0PEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PigpOwotCQlmb3IgKEl0ZXJhdG9yPEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PiBzdHJlYW0gPSBidWlsZE1hcEl0ZXJhdG9yKHJlc3VsdFNldCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJcm93cy5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJvd3M7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gYnVpbGRNYXBJdGVyYXRvcihSZXN1bHRTZXQgcmVzdWx0U2V0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBSZXN1bHRTZXRJdGVyYXRvcjxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4ocmVzdWx0U2V0LCBuZXcgTWFwUmVzdWx0U2V0SXRlcmF0b3JBZGFwdGVyKGJ1aWxkQ29sdW1uTmFtZXMocmVzdWx0U2V0KSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gYnVpbGRDb2x1bW5OYW1lcyhSZXN1bHRTZXQgcmVzdWx0U2V0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW3Jlc3VsdFNldC5nZXRNZXRhRGF0YSgpLmdldENvbHVtbkNvdW50KCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQluYW1lc1tpXSA9IHJlc3VsdFNldC5nZXRNZXRhRGF0YSgpLmdldENvbHVtbk5hbWUoaSArIDEpOyAgLy8gTkI6IFJlc3VsdFNldCBpbmRleC9zdWJzY3JpcHQgaXMgMS1iYXNlZAotCQl9Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE1hcFJlc3VsdFNldEl0ZXJhdG9yQWRhcHRlciBpbXBsZW1lbnRzIFJlc3VsdFNldEl0ZXJhdG9yLkFkYXB0ZXI8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IHsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBjb2x1bW5OYW1lczsKLQkJcHVibGljIE1hcFJlc3VsdFNldEl0ZXJhdG9yQWRhcHRlcihTdHJpbmdbXSBjb2x1bW5OYW1lcykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY29sdW1uTmFtZXMgPSBjb2x1bW5OYW1lczsKLQkJfQotCQlwdWJsaWMgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gYnVpbGROZXh0KFJlc3VsdFNldCBycykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCQlIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4odGhpcy5jb2x1bW5OYW1lcy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbk5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbWFwLnB1dCh0aGlzLmNvbHVtbk5hbWVzW2ldLCBycy5nZXRPYmplY3QoaSArIDEpKTsgIC8vIE5COiBSZXN1bHRTZXQgaW5kZXgvc3Vic2NyaXB0IGlzIDEtYmFzZWQKLQkJCX0KLQkJCXJldHVybiBtYXA7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL0pwdEpwYURiVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL0pwdEpwYURiVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3YjhjMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9KcHRKcGFEYlRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zLkFsbFBsYXRmb3JtVGVzdHM7Ci0KLS8qKgotICogIEpQVCBEQiBUZXN0cwotICovCi1wdWJsaWMgY2xhc3MgSnB0SnBhRGJUZXN0cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0SnBhRGJUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLSAgICAKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggQWxsUGxhdGZvcm1UZXN0cy5zdWl0ZSgpKTsKLSAgICAKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEpwdEpwYURiVGVzdHMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvSnB0SnBhRGJUZXN0c1BsdWdpbi5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvSnB0SnBhRGJUZXN0c1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDI4MzJlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL0pwdEpwYURiVGVzdHNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogIEpwdEpwYURiVGVzdHNQbHVnaW4KLSAqLwotcHVibGljIGNsYXNzIEpwdEpwYURiVGVzdHNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEpwdEpwYURiVGVzdHNQbHVnaW4gSU5TVEFOQ0U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfSUQgPSAib3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnB0SnBhRGJUZXN0c1BsdWdpbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSnB0SnBhRGJUZXN0c1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlOU1RBTkNFID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvQWxsUGxhdGZvcm1UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0FsbFBsYXRmb3JtVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQyZTk1NC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvQWxsUGxhdGZvcm1UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBBbGxQbGF0Zm9ybVRlc3RzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBbGxQbGF0Zm9ybVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShEZXJieVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE15U1FMVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JhY2xlMTBnVGVzdHMuY2xhc3MpOwotLy8JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcmFjbGUxMGdYRVRlc3RzLmNsYXNzKTsKLS8vCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JhY2xlOWlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQb3N0Z3JlU1FMVGVzdHMuY2xhc3MpOwotLy8JCXN1aXRlLmFkZFRlc3RTdWl0ZShTUUxTZXJ2ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTeWJhc2VUZXN0cy5jbGFzcyk7Ci0KLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgQWxsUGxhdGZvcm1UZXN0cygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRFRQUGxhdGZvcm1UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RUUFBsYXRmb3JtVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNiN2I2MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRFRQUGxhdGZvcm1UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YTsKLWltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7Ci1pbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0TWV0YURhdGE7Ci1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuQ29ubmVjdGlvblByb2ZpbGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5Qcm9maWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuSURyaXZlck1nbXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLklQcm9wZXJ0eVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuUHJvcGVydHlTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5YTUxGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuamRiYy5JSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5pbnRlcm5hbC5Db25uZWN0aXZpdHlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkluZGVudGluZ1ByaW50V3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZXN1bHRTZXRJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuSnB0SnBhRGJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWFDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMuaW50ZXJuYWwuSnB0SnBhRGJUZXN0c1BsdWdpbjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciB0ZXN0aW5nIERUUCB3cmFwcGVycyBvbiB2YXJpb3VzIGRhdGFiYXNlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRFRQUGxhdGZvcm1UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCS8qKgotCSAqIFRoZSBwbGF0Zm9ybSBwcm9wZXJ0aWVzIGFyZSBsb2FkZWQgZnJvbSBhIEphdmEgcHJvcGVydGllcyBmaWxlIGluIHRoZQotCSAqICdvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZycgZGlyZWN0b3J5LiBFYWNoIGRhdGFiYXNlIHBsYXRmb3JtIGhhcwotCSAqIGl0cyBvd24gcHJvcGVydGllcyBmaWxlIChlLmcuICdkZXJieS5wcm9wZXJ0aWVzJykuCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIHBsYXRmb3JtUHJvcGVydGllczsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIERhbGkgY29ubmVjdGlvbiBwcm9maWxlIHdyYXBwZXIuCi0JICovCi0JcHJvdGVjdGVkIENvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0YW50cyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fQ09ORklHX0RJUkVDVE9SWSA9ICJjb25maWciOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX1VTRVJfSURfUFJPUEVSVFkgPSAidXNlcklEIjsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX1VTRVJfSURfREVGQVVMVCA9ICJ1c2VyIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9QQVNTV09SRF9QUk9QRVJUWSA9ICJwYXNzd29yZCI7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9QQVNTV09SRF9ERUZBVUxUID0gIiI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfRFJJVkVSX0pBUlNfUFJPUEVSVFkgPSAiamFycyI7Ci0JCS8vIHJlcXVpcmVkIC0gbm8gZGVmYXVsdAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX1VSTF9QUk9QRVJUWSA9ICJ1cmwiOwotCQkvLyByZXF1aXJlZCAtIG5vIGRlZmF1bHQKLQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCBEVFBQbGF0Zm9ybVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZXQtdXAvdGVhci1kb3duICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0KLQkJdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMgPSB0aGlzLmxvYWRQbGF0Zm9ybVByb3BlcnRpZXMoKTsKLQkJdGhpcy5idWlsZERUUERyaXZlckRlZmluaXRpb25GaWxlKCk7Ci0JCXRoaXMuYnVpbGREVFBDb25uZWN0aW9uUHJvZmlsZSgpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKHRoaXMuZ2V0UHJvZmlsZU5hbWUoKSwgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlci5EZWZhdWx0Lmluc3RhbmNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSBudWxsOwotCQl0aGlzLnBsYXRmb3JtUHJvcGVydGllcyA9IG51bGw7Ci0KLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQkvLyAqKioqKiBwbGF0Zm9ybSBwcm9wZXJ0aWVzIGZpbGUKLQlwcml2YXRlIFByb3BlcnRpZXMgbG9hZFBsYXRmb3JtUHJvcGVydGllcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXAubG9hZCh0aGlzLmJ1aWxkUGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZVVSTCgpLm9wZW5TdHJlYW0oKSk7Ci0JCXJldHVybiBwOwotCX0KLQotCXByaXZhdGUgVVJMIGJ1aWxkUGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZVVSTCgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEJ1bmRsZSh0aGlzLmdldFRlc3RQbHVnaW5CdW5kbGVJRCgpKS5nZXRFbnRyeSh0aGlzLmdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVQYXRoKCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFRlc3RQbHVnaW5CdW5kbGVJRCgpIHsKLQkJcmV0dXJuIEpwdEpwYURiVGVzdHNQbHVnaW4uQlVORExFX0lEOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVQYXRoKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQbGF0Zm9ybVByb3BlcnRpZXNEaXJlY3RvcnlOYW1lKCkgKyAnLycgKyB0aGlzLmdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRGlyZWN0b3J5TmFtZSgpIHsKLQkJcmV0dXJuIFBMQVRGT1JNX0NPTkZJR19ESVJFQ1RPUlk7Ci0JfQotCi0JLyoqCi0JICogRWFjaCBkYXRhYmFzZSBwbGF0Zm9ybSBoYXMgYSBzZXBhcmF0ZSBwcm9wZXJ0aWVzIGZpbGUgaW4gdGhlICdjb25maWcnCi0JICogZGlyZWN0b3J5IHRoYXQgbXVzdCBiZSBjdXN0b21pemVkIGJ5IHdob21ldmVyIGlzIGV4ZWN1dGluZyB0aGUgdGVzdHMuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlTmFtZSgpOwotCi0JLy8gKioqKiogZHJpdmVyIGRlZmluaXRpb24gZmlsZQotCXByaXZhdGUgdm9pZCBidWlsZERUUERyaXZlckRlZmluaXRpb25GaWxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlYTUxGaWxlTWFuYWdlci5zZXRTdG9yYWdlTG9jYXRpb24odGhpcy5nZXREVFBEcml2ZXJEZWZpbml0aW9uTG9jYXRpb24oKSk7Ci0JCVhNTEZpbGVNYW5hZ2VyLnNldEZpbGVOYW1lKHRoaXMuZ2V0RFRQRHJpdmVyRmlsZU5hbWUoKSk7Ci0KLQkJSVByb3BlcnR5U2V0W10gc2V0cyA9IFhNTEZpbGVNYW5hZ2VyLmxvYWRQcm9wZXJ0eVNldHMoKTsKLQkJZm9yIChJUHJvcGVydHlTZXQgc2V0IDogc2V0cykgewotCQkJaWYgKHNldC5nZXRJRCgpLmVxdWFscyh0aGlzLmdldERyaXZlckRlZmluaXRpb25JRCgpKSkgewotCQkJCXJldHVybjsgIC8vIHByb3BlcnR5IHNldHMgbGl2ZSBhY3Jvc3MgdGVzdHMKLQkJCX0KLQkJfQotCi0JCVhNTEZpbGVNYW5hZ2VyLnNhdmVOYW1lZFByb3BlcnR5U2V0KHRoaXMuYnVpbGREVFBEcml2ZXJEZWZpbml0aW9uUHJvcGVydHlTZXRzKCkpOwotCi0JCS8vIHZlcmlmeSB0aGUgZmlsZSB3YXMgY3JlYXRlZDoKLQkJRmlsZSBkcml2ZXJEZWZpbml0aW9uZUZpbGUgPSB0aGlzLmdldERUUERyaXZlckRlZmluaXRpb25Mb2NhdGlvbigpLmFwcGVuZCh0aGlzLmdldERUUERyaXZlckZpbGVOYW1lKCkpLnRvRmlsZSgpOwotCQlhc3NlcnRUcnVlKGRyaXZlckRlZmluaXRpb25lRmlsZS5leGlzdHMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBnZXREVFBEcml2ZXJEZWZpbml0aW9uTG9jYXRpb24oKSB7Ci0JCXJldHVybiBDb25uZWN0aXZpdHlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREVFBEcml2ZXJGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIElEcml2ZXJNZ210Q29uc3RhbnRzLkRSSVZFUl9GSUxFOwotCX0KLQotCXByaXZhdGUgSVByb3BlcnR5U2V0W10gYnVpbGREVFBEcml2ZXJEZWZpbml0aW9uUHJvcGVydHlTZXRzKCkgewotCQlJUHJvcGVydHlTZXRbXSBwcm9wZXJ0eVNldHMgPSBuZXcgSVByb3BlcnR5U2V0WzFdOwotCQlQcm9wZXJ0eVNldEltcGwgcHJvcGVydHlTZXQgPSBuZXcgUHJvcGVydHlTZXRJbXBsKHRoaXMuZ2V0RHJpdmVyTmFtZSgpLCB0aGlzLmdldERyaXZlckRlZmluaXRpb25JRCgpKTsKLQkJcHJvcGVydHlTZXQuc2V0UHJvcGVydGllcyh0aGlzLmdldERyaXZlckRlZmluaXRpb25JRCgpLCB0aGlzLmJ1aWxkRFRQRHJpdmVyRGVmaW5pdGlvblByb3BlcnRpZXMoKSk7Ci0JCXByb3BlcnR5U2V0c1swXSA9IHByb3BlcnR5U2V0OwotCQlyZXR1cm4gcHJvcGVydHlTZXRzOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKTsKLQotCXByaXZhdGUgUHJvcGVydGllcyBidWlsZERUUERyaXZlckRlZmluaXRpb25Qcm9wZXJ0aWVzKCkgewotCQlQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwotCQlwLnNldFByb3BlcnR5KENvbm5lY3Rpb25Qcm9maWxlLkRSSVZFUl9ERUZJTklUSU9OX1RZUEVfUFJPUF9JRCwgdGhpcy5nZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpKTsKLQkJcC5zZXRQcm9wZXJ0eShDb25uZWN0aW9uUHJvZmlsZS5EUklWRVJfSkFSX0xJU1RfUFJPUF9JRCwgdGhpcy5nZXRKREJDRHJpdmVySmFyTGlzdCgpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfVkVORE9SX1BST1BfSUQsIHRoaXMuZ2V0RGF0YWJhc2VWZW5kb3IoKSk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX1ZFUlNJT05fUFJPUF9JRCwgdGhpcy5nZXREYXRhYmFzZVZlcnNpb24oKSk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRSSVZFUl9DTEFTU19QUk9QX0lELCB0aGlzLmdldERyaXZlckNsYXNzKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5VUkxfUFJPUF9JRCwgdGhpcy5nZXRKREJDVVJMKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5VU0VSTkFNRV9QUk9QX0lELCB0aGlzLmdldFVzZXJJRCgpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuUEFTU1dPUkRfUFJPUF9JRCwgdGhpcy5nZXRQYXNzd29yZCgpKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogVGhlIEpBUiBsaXN0IGlzIHdvcmtzcGFjZS1zcGVjaWZpYyBhbmQgaXMgc2V0IGluIHRoZSBwcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SkRCQ0RyaXZlckphckxpc3QoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlcXVpcmVkUGxhdGZvcm1Qcm9wZXJ0eShEQl9EUklWRVJfSkFSU19QUk9QRVJUWSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKTsKLQotCS8qKgotCSAqIFRoZSBkYXRhYmFzZSBVUkwgaXMgd29ya3NwYWNlLXNwZWNpZmljIGFuZCBpcyBzZXQgaW4gdGhlIHByb3BlcnRpZXMgZmlsZQotCSAqIGZvciBzb21lIGRhdGFiYXNlcy4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRKREJDVVJMKCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoREJfVVJMX1BST1BFUlRZLCB0aGlzLmdldERlZmF1bHRKREJDVVJMKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEpEQkNVUkwoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdXNlciBJRCBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIHNldCBpbiB0aGUgcHJvcGVydGllcyBmaWxlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VXNlcklEKCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoREJfVVNFUl9JRF9QUk9QRVJUWSwgREJfVVNFUl9JRF9ERUZBVUxUKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcGFzc3dvcmQgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBzZXQgaW4gdGhlIHByb3BlcnRpZXMgZmlsZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKLQkJcmV0dXJuIHRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KERCX1BBU1NXT1JEX1BST1BFUlRZLCBEQl9QQVNTV09SRF9ERUZBVUxUKTsKLQl9Ci0KLQkvLyAqKioqKiBEVFAgY29ubmVjdGlvbiBwcm9maWxlCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRFRQQ29ubmVjdGlvblByb2ZpbGUoKSB0aHJvd3MgQ29ubmVjdGlvblByb2ZpbGVFeGNlcHRpb24gewotCQlpZiAodGhpcy5nZXREVFBQcm9maWxlTWFuYWdlcigpLmdldFByb2ZpbGVCeU5hbWUodGhpcy5nZXRQcm9maWxlTmFtZSgpKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm47ICAvLyBwcm9maWxlcyBsaXZlIGFjcm9zcyB0ZXN0cwotCQl9Ci0JCXRoaXMuY3JlYXRlUHJvZmlsZSh0aGlzLmdldFByb2ZpbGVOYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RFRQUHJvZmlsZU1hbmFnZXIoKS5nZXRQcm9maWxlQnlOYW1lKHRoaXMuZ2V0UHJvZmlsZU5hbWUoKSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb2ZpbGUoU3RyaW5nIHByb2ZpbGVOYW1lKSB0aHJvd3MgQ29ubmVjdGlvblByb2ZpbGVFeGNlcHRpb24gewotCQl0aGlzLmdldERUUFByb2ZpbGVNYW5hZ2VyKCkuY3JlYXRlUHJvZmlsZSgKLQkJCQlwcm9maWxlTmFtZSwKLQkJCQl0aGlzLmdldFByb2ZpbGVEZXNjcmlwdGlvbigpLAotCQkJCXRoaXMuZ2V0UHJvdmlkZXJJRCgpLAotCQkJCXRoaXMuYnVpbGREVFBDb25uZWN0aW9uUHJvZmlsZVByb3BlcnRpZXMoKQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvZmlsZURlc2NyaXB0aW9uKCk7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3ZpZGVySUQoKSB7Ci0JCXJldHVybiBDb25uZWN0aW9uUHJvZmlsZS5DT05ORUNUSU9OX1BST0ZJTEVfVFlQRTsKLQl9Ci0JIAotCXByb3RlY3RlZCBQcm9wZXJ0aWVzIGJ1aWxkRFRQQ29ubmVjdGlvblByb2ZpbGVQcm9wZXJ0aWVzKCkgewotCQlQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5VU0VSTkFNRV9QUk9QX0lELCB0aGlzLmdldFVzZXJJRCgpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuUEFTU1dPUkRfUFJPUF9JRCwgdGhpcy5nZXRQYXNzd29yZCgpKTsKLQkJcC5zZXRQcm9wZXJ0eShDb25uZWN0aW9uUHJvZmlsZS5EUklWRVJfREVGSU5JVElPTl9QUk9QX0lELCB0aGlzLmdldERyaXZlckRlZmluaXRpb25JRCgpKTsKLQotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EUklWRVJfQ0xBU1NfUFJPUF9JRCwgdGhpcy5nZXREcml2ZXJDbGFzcygpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuVVJMX1BST1BfSUQsIHRoaXMuZ2V0SkRCQ1VSTCgpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfVkVORE9SX1BST1BfSUQsIHRoaXMuZ2V0RGF0YWJhc2VWZW5kb3IoKSk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX1ZFUlNJT05fUFJPUF9JRCwgdGhpcy5nZXREYXRhYmFzZVZlcnNpb24oKSk7Ci0KLQkJcC5zZXRQcm9wZXJ0eShDb25uZWN0aW9uUHJvZmlsZS5EQVRBQkFTRV9TQVZFX1BXRF9QUk9QX0lELCB0aGlzLnBhc3N3b3JkSXNTYXZlZCgpKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmRJc1NhdmVkKCkgewotCQlyZXR1cm4gInRydWUiOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0ZXN0cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcigpIHRocm93cyBDb25uZWN0aW9uUHJvZmlsZUV4Y2VwdGlvbiB7Ci0JCVRlc3RDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYWRkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJU3RyaW5nIGNwTmFtZTEgPSB0aGlzLmdldFByb2ZpbGVOYW1lKCkgKyAiMSI7Ci0JCXRoaXMuY3JlYXRlUHJvZmlsZShjcE5hbWUxKTsKLQkJSUNvbm5lY3Rpb25Qcm9maWxlIGR0cENQID0gdGhpcy5nZXREVFBQcm9maWxlTWFuYWdlcigpLmdldFByb2ZpbGVCeU5hbWUoY3BOYW1lMSk7Ci0JCWFzc2VydE5vdE51bGwoZHRwQ1ApOwotCi0JCWFzc2VydEVxdWFscyhjcE5hbWUxLCBsaXN0ZW5lci5hZGRlZE5hbWUpOwotCQlsaXN0ZW5lci5jbGVhcigpOwotCi0JCVN0cmluZyBjcE5hbWUyID0gdGhpcy5nZXRQcm9maWxlTmFtZSgpICsgIjIiOwotCQl0aGlzLmdldERUUFByb2ZpbGVNYW5hZ2VyKCkubW9kaWZ5UHJvZmlsZShkdHBDUCwgY3BOYW1lMiwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhjcE5hbWUxLCBsaXN0ZW5lci5yZW5hbWVkT2xkTmFtZSk7Ci0JCWFzc2VydEVxdWFscyhjcE5hbWUyLCBsaXN0ZW5lci5yZW5hbWVkTmV3TmFtZSk7Ci0JCWxpc3RlbmVyLmNsZWFyKCk7Ci0KLQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoY3BOYW1lMik7Ci0JCWFzc2VydE5vdE51bGwoY3ApOwotCi0JCXRoaXMuZ2V0RFRQUHJvZmlsZU1hbmFnZXIoKS5kZWxldGVQcm9maWxlKGR0cENQKTsKLQkJYXNzZXJ0RXF1YWxzKGNwTmFtZTIsIGxpc3RlbmVyLnJlbW92ZWROYW1lKTsKLQkJbGlzdGVuZXIuY2xlYXIoKTsKLQotCQljcCA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShjcE5hbWUyKTsKLQkJYXNzZXJ0TnVsbChjcCk7Ci0KLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5yZW1vdmVDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZ2V0UHJvZmlsZU5hbWUoKSwgdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0luYWN0aXZlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNEaXNjb25uZWN0ZWQoKSk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNBY3RpdmUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0Nvbm5lY3RlZCgpKTsKLQotCQl0aGlzLnZlcmlmeURhdGFiYXNlVmVyc2lvbk51bWJlcigpOwotCQl0aGlzLnZlcmlmeURhdGFiYXNlVmVuZG9yKCk7Ci0JCXRoaXMudmVyaWZ5RGF0YWJhc2VDb250ZW50KCk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0luYWN0aXZlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNEaXNjb25uZWN0ZWQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeURhdGFiYXNlVmVyc2lvbk51bWJlcigpIHsKLQkJRGF0YWJhc2UgZGF0YWJhc2UgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCk7Ci0JCWFzc2VydE5vdE51bGwoZGF0YWJhc2UpOwotCi0JCVN0cmluZyBhY3R1YWwgPSBkYXRhYmFzZS5nZXRWZXJzaW9uKCk7Ci0JCVN0cmluZyBleHBlY3RlZCA9IHRoaXMuZ2V0RGF0YWJhc2VWZXJzaW9uKCk7Ci0JCVN0cmluZyBlcnJvck1lc3NhZ2UgPSAiZXhwZWN0ZWQ6ICIgKyBleHBlY3RlZCArICIgLSBhY3R1YWw6ICIgKyBhY3R1YWw7Ci0JCS8vIHBhcnRpYWwgbWF0Y2ggaXMgZ29vZCBlbm91Z2gKLQkJYXNzZXJ0VHJ1ZShlcnJvck1lc3NhZ2UsIGFjdHVhbC5pbmRleE9mKGV4cGVjdGVkKSAhPSAtMSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeURhdGFiYXNlVmVuZG9yKCkgewotCQlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKTsKLQkJU3RyaW5nIGFjdHVhbCA9IGRhdGFiYXNlLmdldFZlbmRvck5hbWUoKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gdGhpcy5nZXREYXRhYmFzZVZlbmRvcigpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeURhdGFiYXNlQ29udGVudCgpIHsKLQkJRGF0YWJhc2UgZGF0YWJhc2UgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCk7Ci0JCWFzc2VydFRydWUoZGF0YWJhc2UuZ2V0U2NoZW1hdGFTaXplKCkgPj0gMCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IGRhdGFiYXNlLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQlpZiAoc2NoZW1hLmdldFRhYmxlc1NpemUoKSA+IDApIHsKLQkJCQlUYWJsZSB0YWJsZSA9IHNjaGVtYS5nZXRUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQlhc3NlcnRUcnVlKHRhYmxlLmdldENvbHVtbnNTaXplKCkgPj0gMCk7Ci0JCQkJYXNzZXJ0VHJ1ZSh0YWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSA+PSAwKTsKLQkJCQlhc3NlcnRUcnVlKHRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpID49IDApOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpOwotCi0JcHVibGljIGZpbmFsIHZvaWQgdGVzdE9mZmxpbmUoKSB7Ci0JCWlmICggISB0aGlzLmV4ZWN1dGVPZmZsaW5lVGVzdHMoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICggISB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnN1cHBvcnRzV29ya09mZmxpbmVNb2RlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRoaXMucHJlcGFyZUZvck9mZmxpbmVXb3JrKCk7Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLndvcmtPZmZsaW5lKCk7Ci0JCWFzc2VydFRydWUoc3RhdHVzLmlzT0soKSk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0FjdGl2ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmlzV29ya2luZ09mZmxpbmUoKSk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0luYWN0aXZlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNEaXNjb25uZWN0ZWQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlcGFyZUZvck9mZmxpbmVXb3JrKCkgewotCQlpZiAoICEgdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jYW5Xb3JrT2ZmbGluZSgpKSB7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5zYXZlV29ya09mZmxpbmVEYXRhKCk7Ci0JCQlhc3NlcnRUcnVlKHN0YXR1cy5pc09LKCkpOwotCQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuY2FuV29ya09mZmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbkxpc3RlbmVyQ29ubmVjdCgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlSGFzTm9MaXN0ZW5lcnMoKSk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZUhhc0FueUxpc3RlbmVycygpKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5vcGVuZWRQcm9maWxlKTsKLQkJbGlzdGVuZXIuY2xlYXIoKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5va1RvQ2xvc2VQcm9maWxlKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5hYm91dFRvQ2xvc2VQcm9maWxlKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5jbG9zZWRQcm9maWxlKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZUhhc05vTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHRlc3RDb25uZWN0aW9uTGlzdGVuZXJPZmZsaW5lKCkgewotCQlpZiAoICEgdGhpcy5leGVjdXRlT2ZmbGluZVRlc3RzKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMucHJlcGFyZUZvck9mZmxpbmVXb3JrKCk7Ci0JCWxpc3RlbmVyLmNsZWFyKCk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS53b3JrT2ZmbGluZSgpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsIGxpc3RlbmVyLm9wZW5lZFByb2ZpbGUpOwotCQlsaXN0ZW5lci5jbGVhcigpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsIGxpc3RlbmVyLm9rVG9DbG9zZVByb2ZpbGUpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsIGxpc3RlbmVyLmFib3V0VG9DbG9zZVByb2ZpbGUpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsIGxpc3RlbmVyLmNsb3NlZFByb2ZpbGUpOwotCQlsaXN0ZW5lci5jbGVhcigpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbkxpc3RlbmVyRGF0YWJhc2UoKSB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKSwgbGlzdGVuZXIuY2hhbmdlZERhdGFiYXNlKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uTGlzdGVuZXJDYXRhbG9nKCkgewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJaWYgKCAhIHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5zdXBwb3J0c0NhdGFsb2dzKCkpIHsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQkKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQkvLyB0YWtlIHRoZSBmaXJzdCBjYXRhbG9nCi0JCW9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGR0cENhdGFsb2cgPSB0aGlzLmdldEZpcnN0RFRQQ2F0YWxvZygpOwotCQlDYXRhbG9nIGNhdGFsb2cgPSB0aGlzLmdldENhdGFsb2dOYW1lZChkdHBDYXRhbG9nLmdldE5hbWUoKSk7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIGR0cENhdGFsb2cpLnJlZnJlc2goKTsKLQkJYXNzZXJ0U2FtZShjYXRhbG9nLCBsaXN0ZW5lci5jaGFuZ2VkQ2F0YWxvZyk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbkxpc3RlbmVyU2NoZW1hKCkgewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nPiBkdHBDYXRhbG9ncyA9IHRoaXMuZ2V0RFRQQ2F0YWxvZ3MoKTsKLQkJb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZHRwQ2F0YWxvZyA9IG51bGw7Ci0JCW9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hID0gbnVsbDsKLQkJU2NoZW1hIHNjaGVtYSA9IG51bGw7Ci0JCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuc3VwcG9ydHNDYXRhbG9ncygpKSB7Ci0JCQlkdHBDYXRhbG9nID0gZHRwQ2F0YWxvZ3MuZ2V0KDApOwotCQkJZHRwU2NoZW1hID0gKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEpIGR0cENhdGFsb2cuZ2V0U2NoZW1hcygpLmdldCgwKTsKLQkJCXNjaGVtYSA9IHRoaXMuZ2V0Q2F0YWxvZ05hbWVkKGR0cENhdGFsb2cuZ2V0TmFtZSgpKS5nZXRTY2hlbWFOYW1lZChkdHBTY2hlbWEuZ2V0TmFtZSgpKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChkdHBDYXRhbG9ncy5pc0VtcHR5KCkpIHsKLQkJCQlkdHBTY2hlbWEgPSAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSkgdGhpcy5nZXREVFBEYXRhYmFzZSgpLmdldFNjaGVtYXMoKS5nZXQoMCk7Ci0JCQkJc2NoZW1hID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKGR0cFNjaGVtYS5nZXROYW1lKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlkdHBDYXRhbG9nID0gZHRwQ2F0YWxvZ3MuZ2V0KDApOyAgLy8gc2hvdWxkIGJlIHRoZSAidmlydHVhbCIgY2F0YWxvZwotCQkJCWFzc2VydEVxdWFscygiIiwgZHRwQ2F0YWxvZy5nZXROYW1lKCkpOwotCQkJCWR0cFNjaGVtYSA9IChvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hKSBkdHBDYXRhbG9nLmdldFNjaGVtYXMoKS5nZXQoMCk7Ci0JCQkJLy8gdGhlIHNjaGVtYXRhIGFyZSBoZWxkIGRpcmVjdGx5IGJ5IHRoZSBkYXRhYmFzZSBpbiB0aGlzIHNpdHVhdGlvbgotCQkJCXNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZChkdHBTY2hlbWEuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKHNjaGVtYS5nZXRUYWJsZXNTaXplKCkgPj0gMCk7ICAvLyBmb3JjZSB0YWJsZXMgdG8gYmUgbG9hZGVkCi0JCSgoSUNhdGFsb2dPYmplY3QpIGR0cFNjaGVtYSkucmVmcmVzaCgpOwotCQlhc3NlcnRTYW1lKHNjaGVtYSwgbGlzdGVuZXIuY2hhbmdlZFNjaGVtYSk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzID0gdGhpcy5zdXBwb3J0c0NhdGFsb2dzKCk7Ci0JCWFzc2VydEVxdWFscyhzdXBwb3J0c0NhdGFsb2dzLCB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuc3VwcG9ydHNDYXRhbG9ncygpKTsKLQkJaWYgKHN1cHBvcnRzQ2F0YWxvZ3MpIHsKLQkJCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dzU2l6ZSgpID4gMCk7Ci0JCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLmdldFNjaGVtYXRhU2l6ZSgpKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygwLCB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ3NTaXplKCkpOwotCQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hdGFTaXplKCkgPiAwKTsKLQkJfQotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpOwotCi0vLwlwdWJsaWMgdm9pZCB0ZXN0REVCVUcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLS8vCQl0aGlzLmR1bXBKREJDQ2F0YWxvZ3MoKTsKLS8vCQl0aGlzLmR1bXBKREJDU2NoZW1hdGEoKTsKLS8vCQl0aGlzLmR1bXBEYXRhYmFzZUNvbnRhaW5lcnMoKTsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLS8vCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgewotCQlyZXR1cm4gSnB0SnBhRGJQbHVnaW4uZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGF0YWJhc2UgZ2V0RGF0YWJhc2UoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENhdGFsb2cgZ2V0RGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmdldERhdGFiYXNlKCkuZ2V0RGVmYXVsdENhdGFsb2coKTsKLQl9Ci0KLQkvKioKLQkgKiBvbmx5IHZhbGlkIG9uIGRhdGFiYXNlcyB0aGF0IGRvIG5vdCBzdXBwb3J0IGNhdGFsb2dzCi0JICovCi0JcHJvdGVjdGVkIFNjaGVtYSBnZXREZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5nZXREYXRhYmFzZSgpLmdldERlZmF1bHRTY2hlbWEoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2F0YWxvZyBnZXRDYXRhbG9nTmFtZWQoU3RyaW5nIGNhdGFsb2dOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKGNhdGFsb2dOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlcXVpcmVkUGxhdGZvcm1Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlLZXkpIHsKLQkJU3RyaW5nIHByb3BlcnR5VmFsdWUgPSB0aGlzLnBsYXRmb3JtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eUtleSk7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHByb3BlcnR5VmFsdWUpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YWJhc2UgcGxhdGZvcm0gcHJvcGVydGllcyBmaWxlICciICsgdGhpcy5nZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlUGF0aCgpCi0JCQkJCSsgIicgaXMgbWlzc2luZyBhIHZhbHVlIGZvciB0aGUgcHJvcGVydHkgJyIgKyBwcm9wZXJ0eUtleSArICInLiIpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0eVZhbHVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbm5lY3Rpb25Qcm9maWxlSGFzQW55TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gY29ubmVjdGlvblByb2ZpbGVIYXNBbnlMaXN0ZW5lcnModGhpcy5jb25uZWN0aW9uUHJvZmlsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGNvbm5lY3Rpb25Qcm9maWxlSGFzQW55TGlzdGVuZXJzKENvbm5lY3Rpb25Qcm9maWxlIGNwKSB7Ci0JCXJldHVybiAoKEJvb2xlYW4pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKGNwLCAiaGFzQW55TGlzdGVuZXJzIikpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbm5lY3Rpb25Qcm9maWxlSGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBjb25uZWN0aW9uUHJvZmlsZUhhc05vTGlzdGVuZXJzKHRoaXMuY29ubmVjdGlvblByb2ZpbGUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBjb25uZWN0aW9uUHJvZmlsZUhhc05vTGlzdGVuZXJzKENvbm5lY3Rpb25Qcm9maWxlIGNwKSB7Ci0JCXJldHVybiAoKEJvb2xlYW4pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKGNwLCAiaGFzTm9MaXN0ZW5lcnMiKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUCBtb2RlbCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvZmlsZU1hbmFnZXIgZ2V0RFRQUHJvZmlsZU1hbmFnZXIoKSB7Ci0JCXJldHVybiBQcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBJQ29ubmVjdGlvblByb2ZpbGUgZ2V0RFRQQ29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCXJldHVybiBnZXREVFBDb25uZWN0aW9uUHJvZmlsZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElDb25uZWN0aW9uUHJvZmlsZSBnZXREVFBDb25uZWN0aW9uUHJvZmlsZShDb25uZWN0aW9uUHJvZmlsZSBjcCkgewotCQlyZXR1cm4gKElDb25uZWN0aW9uUHJvZmlsZSkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUoY3AsICJkdHBDb25uZWN0aW9uUHJvZmlsZSIpOwotCX0KLQotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2UgZ2V0RFRQRGF0YWJhc2UoKSB7Ci0JCXJldHVybiBnZXREVFBEYXRhYmFzZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlIGdldERUUERhdGFiYXNlKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXJldHVybiAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlKSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShkYXRhYmFzZSwgImR0cERhdGFiYXNlIik7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c+IGdldERUUENhdGFsb2dzKCkgewotCQlyZXR1cm4gdGhpcy5nZXREVFBEYXRhYmFzZSgpLmdldENhdGFsb2dzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGdldEZpcnN0RFRQQ2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RFRQQ2F0YWxvZ3MoKS5nZXQoMCk7Ci0JfQotCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGdldERUUENhdGFsb2dOYW1lZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ2V0RFRQQ2F0YWxvZyh0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKG5hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGdldERUUENhdGFsb2coQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCXJldHVybiAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKGNhdGFsb2csICJkdHBDYXRhbG9nIik7Ci0JfQotCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZ2V0RFRQU2NoZW1hTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdldERUUFNjaGVtYSh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQobmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBnZXREVFBTY2hlbWEoU2NoZW1hIHNjaGVtYSkgewotCQlyZXR1cm4gKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHNjaGVtYSwgImR0cFNjaGVtYSIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleGVjdXRlIFNRTCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBpZ25vcmUgYW55IGVycm9ycyAodXNlZnVsIGZvciBkcm9wcGluZyBkYXRhYmFzZSBvYmplY3RzIHRoYXQgbWlnaHQKLQkgKiBub3QgYmUgdGhlcmUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycyhTdHJpbmcgc3FsKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmV4ZWN1dGVVcGRhdGUoc3FsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCVN5c3RlbS5lcnIucHJpbnRsbigiU1FMOiAiICsgc3FsKTsKLS8vCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlVXBkYXRlKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlTdGF0ZW1lbnQgamRiY1N0YXRlbWVudCA9IHRoaXMuY3JlYXRlSkRCQ1N0YXRlbWVudCgpOwotCQl0cnkgewotCQkJamRiY1N0YXRlbWVudC5leGVjdXRlVXBkYXRlKHNxbCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlqZGJjU3RhdGVtZW50LmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQl0aGlzLmR1bXAoc3FsLCAzMCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcChTdHJpbmcgc3FsLCBpbnQgY29sdW1uV2lkdGgpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlJbmRlbnRpbmdQcmludFdyaXRlciBwdyA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5vdXQpKTsKLQkJLy8gc3luY2hyb25pemUgdGhlIGNvbnNvbGUgc28gZXZlcnl0aGluZyBpcyBjb250aWd1b3VzCi0JCXN5bmNocm9uaXplZCAoU3lzdGVtLm91dCkgewotCQkJdGhpcy5kdW1wT24oc3FsLCBwdywgY29sdW1uV2lkdGgpOwotCQl9Ci0JCXB3LmZsdXNoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcE9uKFN0cmluZyBzcWwsIEluZGVudGluZ1ByaW50V3JpdGVyIHB3LCBpbnQgY29sdW1uV2lkdGgpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlwdy5wcmludGxuKHNxbCk7Ci0JCWZvciAoSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gcm93IDogdGhpcy5leGVjdXRlKHNxbCkpIHsKLQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBmaWVsZCA6IHJvdy5lbnRyeVNldCgpKSB7Ci0JCQkJU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZU9uKFN0cmluZy52YWx1ZU9mKGZpZWxkLmdldEtleSgpKSwgY29sdW1uV2lkdGgvMiwgcHcpOwotCQkJCXB3LnByaW50KCc9Jyk7Ci0JCQkJU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZU9uKFN0cmluZy52YWx1ZU9mKGZpZWxkLmdldFZhbHVlKCkpLCBjb2x1bW5XaWR0aC8yLCBwdyk7Ci0JCQkJcHcucHJpbnQoJyAnKTsKLQkJCX0KLQkJCXB3LnByaW50bG4oKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IGV4ZWN1dGUoU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCVN0YXRlbWVudCBqZGJjU3RhdGVtZW50ID0gdGhpcy5jcmVhdGVKREJDU3RhdGVtZW50KCk7Ci0JCWpkYmNTdGF0ZW1lbnQuZXhlY3V0ZShzcWwpOwotCQlBcnJheUxpc3Q8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IHJvd3MgPSB0aGlzLmJ1aWxkUm93cyhqZGJjU3RhdGVtZW50LmdldFJlc3VsdFNldCgpKTsKLQkJamRiY1N0YXRlbWVudC5jbG9zZSgpOwotCQlyZXR1cm4gcm93czsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PiBidWlsZFJvd3MoUmVzdWx0U2V0IHJlc3VsdFNldCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCUFycmF5TGlzdDxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gcm93cyA9IG5ldyBBcnJheUxpc3Q8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+KCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwocm93cywgdGhpcy5idWlsZFJlc3VsdFNldEl0ZXJhdG9yKHJlc3VsdFNldCkpOwotCQlyZXR1cm4gcm93czsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IGJ1aWxkUmVzdWx0U2V0SXRlcmF0b3IoUmVzdWx0U2V0IHJlc3VsdFNldCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgUmVzdWx0U2V0SXRlcmF0b3I8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+KHJlc3VsdFNldCwgbmV3IE1hcFJlc3VsdFNldEl0ZXJhdG9yQWRhcHRlcihyZXN1bHRTZXQuZ2V0TWV0YURhdGEoKSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTWFwUmVzdWx0U2V0SXRlcmF0b3JBZGFwdGVyCi0JCWltcGxlbWVudHMgUmVzdWx0U2V0SXRlcmF0b3IuQWRhcHRlcjxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4KLQl7Ci0JCXByaXZhdGUgZmluYWwgaW50IGNvbHVtbkNvdW50OwotCQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGNvbHVtbk5hbWVzOwotCQlwdWJsaWMgTWFwUmVzdWx0U2V0SXRlcmF0b3JBZGFwdGVyKFJlc3VsdFNldE1ldGFEYXRhIHJzTWV0YURhdGEpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY29sdW1uQ291bnQgPSByc01ldGFEYXRhLmdldENvbHVtbkNvdW50KCk7Ci0JCQl0aGlzLmNvbHVtbk5hbWVzID0gbmV3IFN0cmluZ1t0aGlzLmNvbHVtbkNvdW50ICsgMV07ICAvLyBsZWF2ZSB6ZXJvIHNsb3QgZW1wdHkKLQkJCWZvciAoaW50IGkgPSAxOyBpIDw9IHRoaXMuY29sdW1uQ291bnQ7IGkrKykgeyAgLy8gTkI6IFJlc3VsdFNldCBpbmRleC9zdWJzY3JpcHQgaXMgMS1iYXNlZAotCQkJCXRoaXMuY29sdW1uTmFtZXNbaV0gPSByc01ldGFEYXRhLmdldENvbHVtbk5hbWUoaSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGJ1aWxkTmV4dChSZXN1bHRTZXQgcnMpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQkJSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gcm93ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KHRoaXMuY29sdW1uQ291bnQpOwotCQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gdGhpcy5jb2x1bW5Db3VudDsgaSsrKSB7ICAvLyBOQjogUmVzdWx0U2V0IGluZGV4L3N1YnNjcmlwdCBpcyAxLWJhc2VkCi0JCQkJcm93LnB1dCh0aGlzLmNvbHVtbk5hbWVzW2ldLCBycy5nZXRPYmplY3QoaSkpOwotCQkJfQotCQkJcmV0dXJuIHJvdzsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdGF0ZW1lbnQgY3JlYXRlSkRCQ1N0YXRlbWVudCgpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLmNyZWF0ZVN0YXRlbWVudCgpOwotCX0KLQotCXByb3RlY3RlZCBDb25uZWN0aW9uIGdldEpEQkNDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXRKREJDQ29ubmVjdGlvbigpOwotCX0KLQotCXByb3RlY3RlZCBEYXRhYmFzZU1ldGFEYXRhIGdldERhdGFiYXNlTWV0YURhdGEoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5nZXRNZXRhRGF0YSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkdW1wIERUUCBtZXRhZGF0YSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBkdW1wIGFsbCB0aGUgZGF0YWJhc2UgbWV0YWRhdGEgdG8gdGhlIGNvbnNvbGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wRGF0YWJhc2UoKSB7Ci0JCXRoaXMuZHVtcERhdGFiYXNlKHRydWUpOwotCX0KLQotCS8qKgotCSAqIGR1bXAgdGhlIGRhdGFiYXNlIGNhdGFsb2dzIGFuZCBzY2hlbWF0YSB0byB0aGUgY29uc29sZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGR1bXBEYXRhYmFzZUNvbnRhaW5lcnMoKSB7Ci0JCXRoaXMuZHVtcERhdGFiYXNlKGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wRGF0YWJhc2UoYm9vbGVhbiBkZWVwKSB7Ci0JCUluZGVudGluZ1ByaW50V3JpdGVyIHB3ID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCkpOwotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY29uc29sZSBzbyBldmVyeXRoaW5nIGlzIGNvbnRpZ3VvdXMKLQkJc3luY2hyb25pemVkIChTeXN0ZW0ub3V0KSB7Ci0JCQl0aGlzLmR1bXBEYXRhYmFzZU9uKHB3LCBkZWVwKTsKLQkJfQotCQlwdy5mbHVzaCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBEYXRhYmFzZU9uKEluZGVudGluZ1ByaW50V3JpdGVyIHB3LCBib29sZWFuIGRlZXApIHsKLQkJRGF0YWJhc2UgZGF0YWJhc2UgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCk7Ci0JCXB3LnByaW50KCJkYXRhYmFzZTogIik7Ci0JCXB3LnByaW50bG4oZGF0YWJhc2UuZ2V0TmFtZSgpKTsKLQkJaWYgKGRhdGFiYXNlLnN1cHBvcnRzQ2F0YWxvZ3MoKSkgewotCQkJZm9yIChDYXRhbG9nIGNhdGFsb2cgOiBkYXRhYmFzZS5nZXRDYXRhbG9ncygpKSB7Ci0JCQkJdGhpcy5kdW1wQ2F0YWxvZ09uKGNhdGFsb2csIHB3LCBkZWVwKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRoaXMuZHVtcFNjaGVtYUNvbnRhaW5lck9uKGRhdGFiYXNlLCBwdywgZGVlcCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wQ2F0YWxvZ09uKENhdGFsb2cgY2F0YWxvZywgSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcsIGJvb2xlYW4gZGVlcCkgewotCQlwdy5wcmludCgiY2F0YWxvZzogIik7Ci0JCXB3LnByaW50bG4oY2F0YWxvZy5nZXROYW1lKCkpOwotCQlwdy5pbmRlbnQoKTsKLQkJCXRoaXMuZHVtcFNjaGVtYUNvbnRhaW5lck9uKGNhdGFsb2csIHB3LCBkZWVwKTsKLQkJcHcudW5kZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcFNjaGVtYUNvbnRhaW5lck9uKFNjaGVtYUNvbnRhaW5lciBzY2hlbWFDb250YWluZXIsIEluZGVudGluZ1ByaW50V3JpdGVyIHB3LCBib29sZWFuIGRlZXApIHsKLQkJZm9yIChTY2hlbWEgc2NoZW1hIDogc2NoZW1hQ29udGFpbmVyLmdldFNjaGVtYXRhKCkpIHsKLQkJCXRoaXMuZHVtcFNjaGVtYU9uKHNjaGVtYSwgcHcsIGRlZXApOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcFNjaGVtYShTY2hlbWEgc2NoZW1hKSB7Ci0JCXRoaXMuZHVtcFNjaGVtYShzY2hlbWEsIHRydWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBTY2hlbWEoU2NoZW1hIHNjaGVtYSwgYm9vbGVhbiBkZWVwKSB7Ci0JCUluZGVudGluZ1ByaW50V3JpdGVyIHB3ID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCkpOwotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY29uc29sZSBzbyBldmVyeXRoaW5nIGlzIGNvbnRpZ3VvdXMKLQkJc3luY2hyb25pemVkIChTeXN0ZW0ub3V0KSB7Ci0JCQl0aGlzLmR1bXBTY2hlbWFPbihzY2hlbWEsIHB3LCBkZWVwKTsKLQkJfQotCQlwdy5mbHVzaCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBTY2hlbWFPbihTY2hlbWEgc2NoZW1hLCBJbmRlbnRpbmdQcmludFdyaXRlciBwdywgYm9vbGVhbiBkZWVwKSB7Ci0JCXB3LnByaW50KCJzY2hlbWE6ICIpOwotCQlwdy5wcmludGxuKHNjaGVtYS5nZXROYW1lKCkpOwotCQlpZiAoZGVlcCkgewotCQkJcHcuaW5kZW50KCk7Ci0JCQkJZm9yIChUYWJsZSB0YWJsZSA6IHNjaGVtYS5nZXRUYWJsZXMoKSkgewotCQkJCQl0aGlzLmR1bXBUYWJsZU9uKHRhYmxlLCBwdyk7Ci0JCQkJfQotCQkJCWZvciAoU2VxdWVuY2Ugc2VxdWVuY2UgOiBzY2hlbWEuZ2V0U2VxdWVuY2VzKCkpIHsKLQkJCQkJdGhpcy5kdW1wU2VxdWVuY2VPbihzZXF1ZW5jZSwgcHcpOwotCQkJCX0KLQkJCXB3LnVuZGVudCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcFRhYmxlT24oVGFibGUgdGFibGUsIEluZGVudGluZ1ByaW50V3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50KCJ0YWJsZTogIik7Ci0JCXB3LnByaW50bG4odGFibGUuZ2V0TmFtZSgpKTsKLQkJcHcuaW5kZW50KCk7Ci0JCQlmb3IgKENvbHVtbiBjb2x1bW4gOiB0YWJsZS5nZXRDb2x1bW5zKCkpIHsKLQkJCQl0aGlzLmR1bXBDb2x1bW5Pbihjb2x1bW4sIHB3KTsKLQkJCX0KLQkJCWZvciAoRm9yZWlnbktleSBmb3JlaWduS2V5IDogdGFibGUuZ2V0Rm9yZWlnbktleXMoKSkgewotCQkJCXRoaXMuZHVtcEZvcmVpZ25LZXlPbihmb3JlaWduS2V5LCBwdyk7Ci0JCQl9Ci0JCXB3LnVuZGVudCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBDb2x1bW5PbihDb2x1bW4gY29sdW1uLCBJbmRlbnRpbmdQcmludFdyaXRlciBwdykgewotCQlwdy5wcmludCgiY29sdW1uOiAiKTsKLQkJcHcucHJpbnQoY29sdW1uLmdldE5hbWUoKSk7Ci0JCXB3LnByaW50KCIgOiAiKTsKLQkJcHcucHJpbnQoY29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJaWYgKGNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSkgewotCQkJcHcucHJpbnQoIiBbcHJpbWFyeSBrZXldIik7Ci0JCX0KLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBGb3JlaWduS2V5T24oRm9yZWlnbktleSBmb3JlaWduS2V5LCBJbmRlbnRpbmdQcmludFdyaXRlciBwdykgewotCQlwdy5wcmludCgiZm9yZWlnbiBrZXk6ICIpOwotCQlwdy5wcmludChmb3JlaWduS2V5LmdldE5hbWUoKSk7Ci0JCXB3LnByaW50KCI9PiIpOwotCQlwdy5wcmludChmb3JlaWduS2V5LmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldE5hbWUoKSk7Ci0JCXB3LnByaW50KCIgKCIpOwotCQlmb3IgKEl0ZXJhdG9yPEZvcmVpZ25LZXkuQ29sdW1uUGFpcj4gc3RyZWFtID0gZm9yZWlnbktleS5nZXRDb2x1bW5QYWlycygpLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJRm9yZWlnbktleS5Db2x1bW5QYWlyIGNwID0gc3RyZWFtLm5leHQoKTsKLQkJCXB3LnByaW50KGNwLmdldEJhc2VDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkJcHcucHJpbnQoIj0+Iik7Ci0JCQlwdy5wcmludChjcC5nZXRSZWZlcmVuY2VkQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCWlmIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJcHcucHJpbnQoIiwgIik7Ci0JCQl9Ci0JCX0KLQkJcHcucHJpbnQoJyknKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBTZXF1ZW5jZU9uKFNlcXVlbmNlIHNlcXVlbmNlLCBJbmRlbnRpbmdQcmludFdyaXRlciBwdykgewotCQlwdy5wcmludCgic2VxdWVuY2U6ICIpOwotCQlwdy5wcmludGxuKHNlcXVlbmNlLmdldE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGR1bXAgSkRCQyBtZXRhZGF0YSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wSkRCQ0NhdGFsb2dzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCUluZGVudGluZ1ByaW50V3JpdGVyIHB3ID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCkpOwotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY29uc29sZSBzbyBldmVyeXRoaW5nIGlzIGNvbnRpZ3VvdXMKLQkJc3luY2hyb25pemVkIChTeXN0ZW0ub3V0KSB7Ci0JCQl0aGlzLmR1bXBKREJDQ2F0YWxvZ3NPbihwdyk7Ci0JCX0KLQkJcHcuZmx1c2goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wSkRCQ0NhdGFsb2dzT24oSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlwdy5wcmludGxuKCJKREJDIGNhdGFsb2dzOiAiKTsKLQkJcHcuaW5kZW50KCk7Ci0JCQlBcnJheUxpc3Q8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IHJvd3MgPSB0aGlzLmJ1aWxkUm93cyh0aGlzLmdldERhdGFiYXNlTWV0YURhdGEoKS5nZXRDYXRhbG9ncygpKTsKLQkJCWZvciAoSXRlcmF0b3I8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IHN0cmVhbSA9IHJvd3MuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gcm93ID0gc3RyZWFtLm5leHQoKTsKLQkJCQlwdy5wcmludGxuKHJvdy5nZXQoIlRBQkxFX0NBVCIpKTsKLQkJCX0KLQkJcHcudW5kZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcEpEQkNTY2hlbWF0YSgpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlJbmRlbnRpbmdQcmludFdyaXRlciBwdyA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5vdXQpKTsKLQkJLy8gc3luY2hyb25pemUgdGhlIGNvbnNvbGUgc28gZXZlcnl0aGluZyBpcyBjb250aWd1b3VzCi0JCXN5bmNocm9uaXplZCAoU3lzdGVtLm91dCkgewotCQkJdGhpcy5kdW1wSkRCQ1NjaGVtYXRhT24ocHcpOwotCQl9Ci0JCXB3LmZsdXNoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcEpEQkNTY2hlbWF0YU9uKEluZGVudGluZ1ByaW50V3JpdGVyIHB3KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcHcucHJpbnRsbigiSkRCQyBzY2hlbWF0YTogIik7Ci0JCXB3LmluZGVudCgpOwotCQkJQXJyYXlMaXN0PEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PiByb3dzID0gdGhpcy5idWlsZFJvd3ModGhpcy5nZXREYXRhYmFzZU1ldGFEYXRhKCkuZ2V0U2NoZW1hcygpKTsKLQkJCWZvciAoSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gcm93IDogcm93cykgewotCQkJCWlmIChyb3cuc2l6ZSgpID09IDIpIHsgIC8vIGNhdGFsb2dzIHdlcmUgYWRkZWQgaW4gamRrIDEuNAotCQkJCQlPYmplY3QgY2F0YWxvZyA9IHJvdy5nZXQoIlRBQkxFX0NBVEFMT0ciKTsKLQkJCQkJcHcucHJpbnQoY2F0YWxvZyk7Ci0JCQkJCXB3LnByaW50KCcuJyk7Ci0JCQkJfQotCQkJCU9iamVjdCBzY2hlbWEgPSByb3cuZ2V0KCJUQUJMRV9TQ0hFTSIpOwotCQkJCXB3LnByaW50bG4oc2NoZW1hKTsKLQkJCX0KLQkJcHcudW5kZW50KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbm5lY3Rpb24gcHJvZmlsZSBsaXN0ZW5lciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRlc3RDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGltcGxlbWVudHMgQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciB7Ci0JCXB1YmxpYyBTdHJpbmcgYWRkZWROYW1lOwotCQlwdWJsaWMgU3RyaW5nIHJlbW92ZWROYW1lOwotCQlwdWJsaWMgU3RyaW5nIHJlbmFtZWRPbGROYW1lOwotCQlwdWJsaWMgU3RyaW5nIHJlbmFtZWROZXdOYW1lOwotCi0JCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlQWRkZWQoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMuYWRkZWROYW1lID0gbmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb25uZWN0aW9uUHJvZmlsZVJlbW92ZWQoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMucmVtb3ZlZE5hbWUgPSBuYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlUmVuYW1lZChTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJCXRoaXMucmVuYW1lZE9sZE5hbWUgPSBvbGROYW1lOwotCQkJdGhpcy5yZW5hbWVkTmV3TmFtZSA9IG5ld05hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCQl0aGlzLmFkZGVkTmFtZSA9IG51bGw7Ci0JCQl0aGlzLnJlbW92ZWROYW1lID0gbnVsbDsKLQkJCXRoaXMucmVuYW1lZE9sZE5hbWUgPSBudWxsOwotCQkJdGhpcy5yZW5hbWVkTmV3TmFtZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29ubmVjdGlvbiBsaXN0ZW5lciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRlc3RDb25uZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBDb25uZWN0aW9uTGlzdGVuZXIgewotCQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgb3BlbmVkUHJvZmlsZTsKLQkJcHVibGljIENvbm5lY3Rpb25Qcm9maWxlIG1vZGlmaWVkUHJvZmlsZTsKLQkJcHVibGljIENvbm5lY3Rpb25Qcm9maWxlIG9rVG9DbG9zZVByb2ZpbGU7Ci0JCXB1YmxpYyBDb25uZWN0aW9uUHJvZmlsZSBhYm91dFRvQ2xvc2VQcm9maWxlOwotCQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgY2xvc2VkUHJvZmlsZTsKLQkJcHVibGljIERhdGFiYXNlIGNoYW5nZWREYXRhYmFzZTsKLQkJcHVibGljIENhdGFsb2cgY2hhbmdlZENhdGFsb2c7Ci0JCXB1YmxpYyBTY2hlbWEgY2hhbmdlZFNjaGVtYTsKLQkJcHVibGljIFNlcXVlbmNlIGNoYW5nZWRTZXF1ZW5jZTsKLQkJcHVibGljIFRhYmxlIGNoYW5nZWRUYWJsZTsKLQkJcHVibGljIENvbHVtbiBjaGFuZ2VkQ29sdW1uOwotCQlwdWJsaWMgRm9yZWlnbktleSBjaGFuZ2VkRm9yZWlnbktleTsKLQotCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5vcGVuZWRQcm9maWxlID0gcHJvZmlsZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBtb2RpZmllZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQl0aGlzLm1vZGlmaWVkUHJvZmlsZSA9IHByb2ZpbGU7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gb2tUb0Nsb3NlKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCXRoaXMub2tUb0Nsb3NlUHJvZmlsZSA9IHByb2ZpbGU7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5hYm91dFRvQ2xvc2VQcm9maWxlID0gcHJvZmlsZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5jbG9zZWRQcm9maWxlID0gcHJvZmlsZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkYXRhYmFzZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJCXRoaXMuY2hhbmdlZERhdGFiYXNlID0gZGF0YWJhc2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2F0YWxvZ0NoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCQl0aGlzLmNoYW5nZWRDYXRhbG9nID0gY2F0YWxvZzsKLQkJfQotCQlwdWJsaWMgdm9pZCBzY2hlbWFDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFNjaGVtYSBzY2hlbWEpIHsKLQkJCXRoaXMuY2hhbmdlZFNjaGVtYSA9IHNjaGVtYTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXF1ZW5jZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgU2VxdWVuY2Ugc2VxdWVuY2UpIHsKLQkJCXRoaXMuY2hhbmdlZFNlcXVlbmNlID0gc2VxdWVuY2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFRhYmxlIHRhYmxlKSB7Ci0JCQl0aGlzLmNoYW5nZWRUYWJsZSA9IHRhYmxlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbHVtbkNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgQ29sdW1uIGNvbHVtbikgewotCQkJdGhpcy5jaGFuZ2VkQ29sdW1uID0gY29sdW1uOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGZvcmVpZ25LZXlDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSkgewotCQkJdGhpcy5jaGFuZ2VkRm9yZWlnbktleSA9IGZvcmVpZ25LZXk7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCQl0aGlzLm9wZW5lZFByb2ZpbGUgPSBudWxsOwotCQkJdGhpcy5tb2RpZmllZFByb2ZpbGUgPSBudWxsOwotCQkJdGhpcy5va1RvQ2xvc2VQcm9maWxlID0gbnVsbDsKLQkJCXRoaXMuYWJvdXRUb0Nsb3NlUHJvZmlsZSA9IG51bGw7Ci0JCQl0aGlzLmNsb3NlZFByb2ZpbGUgPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkRGF0YWJhc2UgPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkQ2F0YWxvZyA9IG51bGw7Ci0JCQl0aGlzLmNoYW5nZWRTY2hlbWEgPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkU2VxdWVuY2UgPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkVGFibGUgPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkQ29sdW1uID0gbnVsbDsKLQkJCXRoaXMuY2hhbmdlZEZvcmVpZ25LZXkgPSBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRGVyYnlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RlcmJ5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkODc5Mi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRGVyYnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRGVyYnlUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0JcHVibGljIERlcmJ5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiZGVyYnkucHJvcGVydGllcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIkRlcmJ5IEVtYmVkZGVkIEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLkRlcmJ5IEVtYmVkZGVkIEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25UeXBlKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZGVyYnkxMDEuZ2VuZXJpY0RyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIkRlcmJ5IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICIxMC4xIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gIm9yZy5hcGFjaGUuZGVyYnkuamRiYy5FbWJlZGRlZERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJEZXJieV8xMC4xX0VtYmVkZGVkIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJEZXJieSAxMC4xIEVtYmVkZGVkIEpEQkMgUHJvZmlsZSBbVGVzdF0iOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvdmlkZXJJRCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmRlcmJ5LmVtYmVkZGVkLmNvbm5lY3Rpb25Qcm9maWxlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QxIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEVTVDIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgVEVTVDEiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYTEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlRFU1QxIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFRFU1QyIik7Ci0JCVNjaGVtYSBzY2hlbWEyID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJURVNUMiIpOwotCQlhc3NlcnROdWxsKHNjaGVtYTIpOyAgLy8gc2hvdWxkIGJlIG51bGwgdW50aWwgcmVmcmVzaAotCi0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQlhc3NlcnRTYW1lKHRoaXMuZ2V0RGF0YWJhc2UoKSwgbGlzdGVuZXIuY2hhbmdlZERhdGFiYXNlKTsKLQotCQlzY2hlbWEyID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJURVNUMiIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlhc3NlcnROb3RTYW1lKHNjaGVtYTEsIHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiVEVTVDEiKSk7ICAvLyB3ZSBzaG91bGQgaGF2ZSBhIG5ldyBzY2hlbWEgYWZ0ZXIgdGhlIHJlZnJlc2gKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QyIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEVTVDEiKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJcImxvb2t1cF9URVNUXCIiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIExPT0tVUF9URVNUIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJMT09LVVBfVEVTVCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiTE9PS1VQX1RFU1QiKSk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF90ZXN0IikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfdGVzdCIpKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX1RFU1QiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoImxvb2t1cF9URVNUIikpOwotCi0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwiTE9PS1VQX1RFU1RcIiIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJsb29rdXBfVEVTVFwiIikpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgXCJsb29rdXBfVEVTVFwiIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJMT09LVVBfVEVTVCIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiTE9PS1VQX1RFU1QiKSk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF90ZXN0IikpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfdGVzdCIpKTsKLQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX1RFU1QiKSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoImxvb2t1cF9URVNUIikpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwiTE9PS1VQX1RFU1RcIiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJsb29rdXBfVEVTVFwiIikpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiXCJsb29rdXBfVEVTVFwiIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hSWRlbnRpZmllcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIkxPT0tVUF9URVNUIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiXCJsb29rdXBfVEVTVFwiIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIGxvb2t1cF90ZXN0Iik7ICAvLyB0aGlzIGdldHMgZm9sZGVkIHRvIHVwcGVyY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgXCJsb29rdXBfVEVTVFwiIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiTE9PS1VQX1RFU1QiKTsKLQkJYXNzZXJ0RXF1YWxzKCJMT09LVVBfVEVTVCIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxPT0tVUF9URVNUIiwgc2NoZW1hLmdldElkZW50aWZpZXIoIkxvb2t1cFRlc3QiKSk7Ci0JCWFzc2VydE51bGwoc2NoZW1hLmdldElkZW50aWZpZXIoIkxvb2t1cF9UZXN0IikpOwotCi0JCXNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfdGVzdCIpOwotCQlhc3NlcnRFcXVhbHMoIkxPT0tVUF9URVNUIiwgc2NoZW1hLmdldElkZW50aWZpZXIoKSk7Ci0KLQkJc2NoZW1hID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwibG9va3VwX1RFU1RcIiIpOwotCQlhc3NlcnRFcXVhbHMoIlwibG9va3VwX1RFU1RcIiIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIlwibG9va3VwX1RFU1RcIiIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCJsb29rdXBfVEVTVCIpKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlwibG9va3VwX1RFU1RcIiIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIkxPT0tVUF9URVNUIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiRk9PX0JBWiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJCQVoiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiRk9PIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkJBUiIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlRBQkxFX1RFU1QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgVEFCTEVfVEVTVCIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIlNFVCBTQ0hFTUEgPSBUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXJEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhekRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29CYXpEREwoKSk7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlRBQkxFX1RFU1QiKTsKLQotCQkvLyBGT08KLQkJVGFibGUgZm9vVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiRk9PIik7Ci0JCWFzc2VydEVxdWFscyg0LCBmb29UYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQotCQlDb2x1bW4gcGtDb2x1bW4gPSBmb29UYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiSUQiLCBwa0NvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gaWRDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiSUQiKTsKLQkJYXNzZXJ0U2FtZShwa0NvbHVtbiwgaWRDb2x1bW4pOwotCQlhc3NlcnRFcXVhbHMoIklOVEVHRVIiLCBpZENvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGlkQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGlkQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoaWRDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGlkQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0KLQkJQ29sdW1uIG5hbWVDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiTkFNRSIpOwotCQlhc3NlcnRFcXVhbHMoIlZBUkNIQVIiLCBuYW1lQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbmFtZUNvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMjAsIG5hbWVDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZUNvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydFRydWUobmFtZUNvbHVtbi5pc051bGxhYmxlKCkpOwotCi0JCUNvbHVtbiBiYXJDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiQkFSX0lEIik7Ci0JCWFzc2VydEVxdWFscygiSU5URUdFUiIsIGJhckNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYmFyQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlDb2x1bW4gc2FsYXJ5Q29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoIlNBTEFSWSIpOwotCQlhc3NlcnRFcXVhbHMoIkRFQ0lNQUwiLCBzYWxhcnlDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKHNhbGFyeUNvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHNhbGFyeUNvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgc2FsYXJ5Q29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHNhbGFyeUNvbHVtbi5nZXRTY2FsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBzYWxhcnlDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCi0JCUZvcmVpZ25LZXkgYmFyRksgPSBmb29UYWJsZS5nZXRGb3JlaWduS2V5cygpLml0ZXJhdG9yKCkubmV4dCgpOyAgLy8gdGhlcmUgc2hvdWxkIG9ubHkgYmUgMSBmb3JlaWduIGtleQotCQlhc3NlcnRFcXVhbHMoMSwgYmFyRksuZ2V0Q29sdW1uUGFpcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGJhckZLLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJiYXIiKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSX0lEIiwgYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJwcmltYXJ5QmFyIikpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBiYXJGSy5nZXRCYXNlVGFibGUoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoZm9vVGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0U2FtZShzY2hlbWEsIGZvb1RhYmxlLmdldFNjaGVtYSgpKTsKLQotCQkvLyBCQVIKLQkJVGFibGUgYmFyVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygzLCBiYXJUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGJhclRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJRCIsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShiYXJUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCi0JCUNvbHVtbiBpZDJDb2x1bW4gPSBiYXJUYWJsZS5nZXRDb2x1bW5OYW1lZCgiSUQyIik7Ci0JCWFzc2VydEVxdWFscygiSU5URUdFUiIsIGlkMkNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0vLwkJYXNzZXJ0VHJ1ZShpZDJDb2x1bW4uaXNQYXJ0T2ZVbmlxdWVDb25zdHJhaW50KCkpOyAgLy8gZG9lc24ndCB3b3JrKD8pCi0JCWFzc2VydEZhbHNlKGlkMkNvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGlkMkNvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBpZDJDb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOyAgLy8gbm90IHN1cmUgd2hhdCB0byBleHBlY3QgaGVyZS4uLgotCQlhc3NlcnRFcXVhbHMoMCwgaWQyQ29sdW1uLmdldFNjYWxlKCkpOyAgLy8gbm90IHN1cmUgd2hhdCB0byBleHBlY3QgaGVyZSBlaXRoZXIuLi4KLQkJYXNzZXJ0RXF1YWxzKCJCTE9CIiwgYmFyVGFibGUuZ2V0Q29sdW1uTmFtZWQoIkNIVU5LIikuZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJ5dGVbXSIsIGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJDSFVOSyIpLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCWFzc2VydFRydWUoYmFyVGFibGUuZ2V0Q29sdW1uTmFtZWQoIkNIVU5LIikuaXNMT0IoKSk7Ci0JCWFzc2VydFNhbWUoYmFyVGFibGUsIGJhckZLLmdldFJlZmVyZW5jZWRUYWJsZSgpKTsKLQotCQkvLyBCQVoKLQkJVGFibGUgYmF6VGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiQkFaIik7Ci0JCUNvbHVtbiBuaWNrbmFtZUNvbHVtbiA9IGJhelRhYmxlLmdldENvbHVtbk5hbWVkKCJOSUNLTkFNRSIpOwotCQlhc3NlcnRFcXVhbHMoMjAsIG5pY2tuYW1lQ29sdW1uLmdldExlbmd0aCgpKTsKLS8vCQlhc3NlcnRUcnVlKG5pY2tuYW1lQ29sdW1uLmlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpKTsgIC8vIGRvZXNuJ3Qgd29yayg/KQotCi0JCS8vIEZPT19CQVoKLQkJVGFibGUgZm9vX2JhelRhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoIkZPT19CQVoiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGZvb19iYXpUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5qb2luVGFibGVOYW1lSXNEZWZhdWx0KCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5nZXRDb2x1bW5OYW1lZCgiRk9PX0lEIikuaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkZPT19CQVoiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiQkFaIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkZPTyIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJCQVIiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7ICAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBidWlsZEJhckRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEJBUiAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgSUQgSU5UIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEMiBJTlQgVU5JUVVFIE5PVCBOVUxMLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIENIVU5LIEJMT0IoMTAwSykiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0RETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEZPTyAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgSUQgSU5UIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIE5BTUUgVkFSQ0hBUigyMCksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgU0FMQVJZIERFQ0lNQUwoMTEsIDIpLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEJBUl9JRCBJTlQgUkVGRVJFTkNFUyBCQVIoSUQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBCQVogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEIElOVCBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBOSUNLTkFNRSBWQVJDSEFSKDIwKSBOT1QgTlVMTCBVTklRVUUiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0JhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEZPT19CQVogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEZPT19JRCBJTlQgUkVGRVJFTkNFUyBGT08oSUQpLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEJBWl9JRCBJTlQgUkVGRVJFTkNFUyBCQVooSUQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbHVtbkxvb2t1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiQ09MVU1OX1RFU1QiLCAidGVzdCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIkNPTFVNTl9URVNUIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIENPTFVNTl9URVNUIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIFNDSEVNQSA9IENPTFVNTl9URVNUIik7Ci0KLQkJLy8gbG93ZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKGlkIElOVEVHRVIsIG5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVRhYmxlIHRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJDT0xVTU5fVEVTVCIpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImlkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIm5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIkNPTFVNTl9URVNUIiwgInRlc3QiKTsKLQotCQkvLyB1cHBlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSUQgSU5URUdFUiwgTkFNRSBWQVJDSEFSKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIkNPTFVNTl9URVNUIikuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSUQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTkFNRSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiQ09MVU1OX1RFU1QiLCAidGVzdCIpOwotCi0JCS8vIG1peGVkIGNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSWQgSU5URUdFUiwgTmFtZSBWQVJDSEFSKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIkNPTFVNTl9URVNUIikuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiQ09MVU1OX1RFU1QiLCAidGVzdCIpOwotCi0JCS8vIGRlbGltaXRlZAotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChcIklkXCIgSU5URUdFUiwgXCJOYW1lXCIgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJDT0xVTU5fVEVTVCIpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIlwiSWRcIiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJcIk5hbWVcIiIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiQ09MVU1OX1RFU1QiLCAidGVzdCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIkNPTFVNTl9URVNUIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NTY2hlbWFSZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDIiLCAiRU1QIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiWFJFRl9URVNUMSIsICJPUkciKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJYUkVGX1RFU1QxIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFhSRUZfVEVTVDEiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJTRVQgU0NIRU1BID0gWFJFRl9URVNUMSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBPUkcgKElEIElOVEVHRVIgUFJJTUFSWSBLRVksIE5BTUUgVkFSQ0hBUigyMCkpIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFhSRUZfVEVTVDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJTRVQgU0NIRU1BID0gWFJFRl9URVNUMiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBFTVAgKElEIElOVEVHRVIgUFJJTUFSWSBLRVksIE5BTUUgVkFSQ0hBUigyMCksICIgKwotCQkJCSJPUkdfSUQgSU5URUdFUiBSRUZFUkVOQ0VTIFhSRUZfVEVTVDEuT1JHKElEKSkiKTsKLQotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJU2NoZW1hIHNjaGVtYTEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlhSRUZfVEVTVDEiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWExKTsKLQkJVGFibGUgb3JnVGFibGUgPSBzY2hlbWExLmdldFRhYmxlTmFtZWQoIk9SRyIpOwotCQlhc3NlcnROb3ROdWxsKG9yZ1RhYmxlKTsKLQotCQlTY2hlbWEgc2NoZW1hMiA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiWFJFRl9URVNUMiIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlUYWJsZSBlbXBUYWJsZSA9IHNjaGVtYTIuZ2V0VGFibGVOYW1lZCgiRU1QIik7Ci0JCWFzc2VydE5vdE51bGwoZW1wVGFibGUpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW1wVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlGb3JlaWduS2V5IGZrID0gZW1wVGFibGUuZ2V0Rm9yZWlnbktleXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGUgcmVmVGFibGUgPSBmay5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWZUYWJsZSk7Ci0JCWFzc2VydEVxdWFscygiT1JHIiwgcmVmVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZrLmdldENvbHVtblBhaXJzU2l6ZSgpKTsKLQkJRm9yZWlnbktleS5Db2x1bW5QYWlyIGNwID0gZmsuZ2V0Q29sdW1uUGFpcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uIGJhc2VDb2x1bW4gPSBjcC5nZXRCYXNlQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiT1JHX0lEIiwgYmFzZUNvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gcmVmQ29sdW1uID0gY3AuZ2V0UmVmZXJlbmNlZENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIklEIiwgcmVmQ29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDIiLCAiRU1QIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiWFJFRl9URVNUMSIsICJPUkciKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJYUkVGX1RFU1QxIik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BUYWJsZShTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNjaGVtYSBzY2hlbWE9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKHNjaGVtYU5hbWUpOwotCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCWlmIChzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKHRhYmxlTmFtZSkgIT0gbnVsbCkgewotCQkJCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBUQUJMRSAiICsgc2NoZW1hTmFtZSArICcuJyArIHRhYmxlTmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOQjogQSBEZXJieSBzY2hlbWEgbXVzdCBiZSBlbXB0eSBiZWZvcmUgaXQgY2FuIGJlIGRyb3BwZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRyb3BTY2hlbWEoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIobmFtZSkgIT0gbnVsbCkgewotCQkJdGhpcy5leGVjdXRlVXBkYXRlKCJEUk9QIFNDSEVNQSAiICsgbmFtZSArICIgUkVTVFJJQ1QiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL015U1FMVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9NeVNRTFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNWI3ZTcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL015U1FMVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuamRiYy5JSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci0KLS8qKgotICogTXlTUUwKLSAqIAotICogTm90ZXM6PHVsPgotICogPGxpPldlIGNhbiBvbmx5IGdldCBkYXRhYmFzZSBvYmplY3RzIGZyb20gdGhlIGRhdGFiYXNlIGFzc29jaWF0ZWQgd2l0aCBvdXIKLSAqIGNvbm5lY3Rpb24gcHJvZmlsZS4KLSAqIDxsaT5XZSBjYW4gcmVmZXJlbmNlIG9iamVjdHMgYWNyb3NzIG11bHRpcGxlIGRhdGFiYXNlcywgc28gdGhleSBhcmUgc29ydGEgbGlrZQotICogc2NoZW1hcy4uLi4KLSAqIDxsaT5Gb3JlaWduIGtleXMgbXVzdCBiZSBkZWZpbmVkIGFzIHRhYmxlLWxldmVsIGNvbnN0cmFpbnRzOyB0aGV5IGNhbm5vdCBiZQotICogZGVmaW5lZCBhcyBwYXJ0IG9mIHRoZSBjb2x1bW4gY2xhdXNlLgotICogPGxpPkNhc2Utc2Vuc2l0aXZpdHkgYW5kIC1mb2xkaW5nIGlzIHdoYWNrZWQgb24gTXlTUUwuLi4uCi0gKiA8L3VsPgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNeVNRTFRlc3RzIGV4dGVuZHMgRFRQUGxhdGZvcm1UZXN0cyB7Ci0KLQlwdWJsaWMgTXlTUUxUZXN0cyggU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlTmFtZSgpIHsKLQkJcmV0dXJuICJteXNxbC5wcm9wZXJ0aWVzIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiTXlTUUwgSkRCQyBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkgewotCQlyZXR1cm4gIkRyaXZlckRlZm4uTXlTUUwgSkRCQyBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQubXlzcWwuNF8xLmRyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIk15U3FsIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICI0LjEiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAiY29tLm15c3FsLmpkYmMuRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRKREJDVVJMKCkgewotCQlyZXR1cm4gImpkYmM6bXlzcWw6Ly9sb2NhbGhvc3Q6MzMwNiI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJNeVNRTF80LjEiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIk15U1FMIDQuMSBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnRpZXMgYnVpbGREVFBDb25uZWN0aW9uUHJvZmlsZVByb3BlcnRpZXMoKSB7Ci0JCVByb3BlcnRpZXMgcCA9IHN1cGVyLmJ1aWxkRFRQQ29ubmVjdGlvblByb2ZpbGVQcm9wZXJ0aWVzKCk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX05BTUVfUFJPUF9JRCwgdGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0JCXJldHVybiBwOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERhdGFiYXNlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VXNlcklEKCk7ICAvLyBieSBjb252ZW50aW9uLi4uCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJcmV0dXJuIHRydWU7ICAvLyBzZWVtcyB0byB3b3JrLi4uCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdERhdGFiYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCS8vIERUUDogTXlTUUwgaGFzIGEgc2luZ2xlIHNjaGVtYSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGRhdGFiYXNlCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQodGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmdldERlZmF1bHRTY2hlbWEoKSwgc2NoZW1hKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZyh0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiZm9vX2JheiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiYmF6Iik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJmb28iKTsKLQkJdGhpcy5kcm9wVGFibGUoImJhciIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmFyRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0RETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXpEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vQmF6RERMKCkpOwotCQkvLyB0aGUgTXlTUUwgZGF0YWJhc2UgZG9lcyBOT1QgcmVmcmVzaCAtIHNlZSBidWcgMjc5NzIxLi4uCi0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQkvLyAuLi5yZWZyZXNoIHRoZSBzaW5nbGUgc2NoZW1hIGluc3RlYWQKLQkJKChJQ2F0YWxvZ09iamVjdCkgZ2V0RFRQU2NoZW1hKHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKTsKLQotCQkvLyBmb28KLQkJVGFibGUgZm9vVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygzLCBmb29UYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJLy8gaWYgdGhlIHRhYmxlcyBhcmUgY3JlYXRlZCB3aXRoIE15SVNBTSBhcyB0aGUgYmFja2luZyBzdG9yZQotCQkvLyB0aGVyZSB3aWxsIGJlIG5vIGZvcmVpZ24ga2V5cwotCQlhc3NlcnRFcXVhbHMoMSwgZm9vVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCi0JCUNvbHVtbiBwa0NvbHVtbiA9IGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHBrQ29sdW1uLmdldE5hbWUoKSk7Ci0JCUNvbHVtbiBpZENvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbk5hbWVkKCJpZCIpOwotCQlhc3NlcnRTYW1lKHBrQ29sdW1uLCBpZENvbHVtbik7Ci0JCWFzc2VydEVxdWFscygiSU5UIiwgaWRDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBpZENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpZENvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGlkQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBpZENvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCi0JCUNvbHVtbiBuYW1lQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoIm5hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJWQVJDSEFSIiwgbmFtZUNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG5hbWVDb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZUNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0KLQkJQ29sdW1uIGJhckNvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbk5hbWVkKCJiYXJfaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlQiLCBiYXJDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKGJhckNvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGJhckNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0KLQkJRm9yZWlnbktleSBiYXJGSyA9IGZvb1RhYmxlLmdldEZvcmVpZ25LZXlzKCkuaXRlcmF0b3IoKS5uZXh0KCk7ICAvLyB0aGVyZSBzaG91bGQgb25seSBiZSAxIGZvcmVpZ24ga2V5Ci0JCWFzc2VydEVxdWFscygxLCBiYXJGSy5nZXRDb2x1bW5QYWlyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYmFyRksuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXJfaWQiLCBiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoInByaW1hcnlCYXIiKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGJhckZLLmdldEJhc2VUYWJsZSgpKTsKLQotCQlhc3NlcnRGYWxzZShmb29UYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRTYW1lKHNjaGVtYSwgZm9vVGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCS8vIEJBUgotCQlUYWJsZSBiYXJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGJhclRhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYmFyVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYmFyVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYmFyVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGJhclRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxPQiIsIGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJjaHVuayIpLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJieXRlW10iLCBiYXJUYWJsZS5nZXRDb2x1bW5OYW1lZCgiY2h1bmsiKS5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRUcnVlKGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJjaHVuayIpLmlzTE9CKCkpOwotCQlhc3NlcnRTYW1lKGJhclRhYmxlLCBiYXJGSy5nZXRSZWZlcmVuY2VkVGFibGUoKSk7Ci0KLQkJLy8gRk9PX0JBWgotCQlUYWJsZSBmb29fYmF6VGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiZm9vX2JheiIpOwotCQlhc3NlcnRFcXVhbHMoMiwgZm9vX2JhelRhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZm9vX2JhelRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmpvaW5UYWJsZU5hbWVJc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmdldENvbHVtbk5hbWVkKCJmb29faWQiKS5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoImZvb19iYXoiKTsKLQkJdGhpcy5kcm9wVGFibGUoImJheiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiZm9vIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJiYXIiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmFyRERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgYmFyICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGNodW5rIEJMT0IiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0RETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGZvbyAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgaWQgSU5URUdFUiBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBuYW1lIFZBUkNIQVIoMjApLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGJhcl9pZCBJTlRFR0VSLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIENPTlNUUkFJTlQgQkFSIEZPUkVJR04gS0VZIChiYXJfaWQpIFJFRkVSRU5DRVMgYmFyKGlkKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmF6RERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgYmF6ICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIG5hbWUgVkFSQ0hBUigyMCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0JhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGZvb19iYXogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGZvb19pZCBJTlQsIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgYmF6X2lkIElOVCwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBGT1JFSUdOIEtFWSAoZm9vX2lkKSBSRUZFUkVOQ0VTIGZvbyhpZCksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgRk9SRUlHTiBLRVkgKGJhel9pZCkgUkVGRVJFTkNFUyBiYXooaWQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogT24gV2luZG93cywgdGFibGUgbmFtZXMgZ2V0IGZvbGRlZCB0byBsb3dlcmNhc2UgYnkgZGVmYXVsdDsKLQkgKiBldmVuIGlmIHRoZSBuYW1lIGlzIGRlbGltaXRlZCAoYXBwYXJlbnRseSkuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJ0ZXN0MSIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEVTVDIiKTsKLQkJdGhpcy5kcm9wVGFibGUoImBURVNUM2AiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0MSAoaWQgSU5URUdFUiwgbmFtZSBWQVJDSEFSKDIwKSkiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgVEVTVDIgKGlkIElOVEVHRVIsIG5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIGBURVNUM2AgKGlkIElOVEVHRVIsIG5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCS8vIHRoZSBNeVNRTCBkYXRhYmFzZSBkb2VzIE5PVCByZWZyZXNoIC0gc2VlIGJ1ZyAyNzk3MjEuLi4KLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0JCS8vIC4uLnJlZnJlc2ggdGhlIHNpbmdsZSBzY2hlbWEgaW5zdGVhZAotCQkoKElDYXRhbG9nT2JqZWN0KSBnZXREVFBTY2hlbWEodGhpcy5nZXREZWZhdWx0U2NoZW1hKCkpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCi0JCVRhYmxlIHRlc3QxVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0MSIpOwotCQlhc3NlcnROb3ROdWxsKHRlc3QxVGFibGUpOwotCi0JCS8vIGlmICdsY3RuJyBpcyAwIChVTklYKSwgdGhlIHRhYmxlIG5hbWUgaXMgY2FzZS1zZW5zaXRpdmUKLQkJaW50IGxjdG4gPSB0aGlzLmdldExvd2VyQ2FzZVRhYmxlTmFtZXNGcm9tRGF0YWJhc2UoKTsKLQotCQlTdHJpbmcgdGVzdDJJZGVudGlmaWVyID0gKGxjdG4gPT0gMCkgPyAiVEVTVDIiIDogInRlc3QyIjsKLQkJVGFibGUgdGVzdDJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIodGVzdDJJZGVudGlmaWVyKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0MlRhYmxlKTsKLQotCQlTdHJpbmcgdGVzdDNJZGVudGlmaWVyID0gKGxjdG4gPT0gMCkgPyAiYFRFU1QzYCIgOiAiYHRlc3QzYCI7Ci0JCVRhYmxlIHRlc3QzVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKHRlc3QzSWRlbnRpZmllcik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDNUYWJsZSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QxIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJURVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiYFRFU1QzYCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRMb3dlckNhc2VUYWJsZU5hbWVzRnJvbURhdGFiYXNlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCS8vIHRoZSB1bmRlcnNjb3JlIGlzIGEgd2lsZCBjaGFyYWN0ZXIgb24gTXlTUUwsIHNvIHdlIG5lZWQgdG8gZXNjYXBlIGl0Ci0JCUFycmF5TGlzdDxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gcm93cyA9IHRoaXMuZXhlY3V0ZSgic2hvdyB2YXJpYWJsZXMgbGlrZSAnbG93ZXJcXF9jYXNlXFxfdGFibGVcXF9uYW1lcyciKTsKLQkJTWFwPFN0cmluZywgT2JqZWN0PiByb3cgPSByb3dzLmdldCgwKTsKLQkJcmV0dXJuIEludGVnZXIudmFsdWVPZigoU3RyaW5nKSByb3cuZ2V0KCJWYWx1ZSIpKS5pbnRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIE15U1FMIHByZXNlcnZlcyB0aGUgY2FzZSBvZiBjb2x1bW4gbmFtZXMsIGRlbGltaXRlZCBvciBub3Q7Ci0JICogYnV0IHRoZXkgYXJlIDxlbT5ub3Q8L2VtPiBjYXNlLXNlbnNpdGl2ZSB3aGVuIHVzZWQgaW4gU1FMLgotCSAqIERlbGltaXRlcnMgYXJlIHVzZWZ1bCBmb3IgcmVzZXJ2ZWQgaWRlbnRpZmllcnMgYW5kIHNwZWNpYWwgY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJ0ZXN0Iik7Ci0KLQkJLy8gbG93ZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKGlkIElOVEVHRVIsIG5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCS8vIHRoZSBNeVNRTCBkYXRhYmFzZSBkb2VzIE5PVCByZWZyZXNoIC0gc2VlIGJ1ZyAyNzk3MjEuLi4KLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0JCS8vIC4uLnJlZnJlc2ggdGhlIHNpbmdsZSBzY2hlbWEgaW5zdGVhZAotCQkoKElDYXRhbG9nT2JqZWN0KSBnZXREVFBTY2hlbWEodGhpcy5nZXREZWZhdWx0U2NoZW1hKCkpKS5yZWZyZXNoKCk7Ci0KLQkJVGFibGUgdGFibGUgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZU5hbWVkKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoImlkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJuYW1lIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImlkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIm5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QiKTsKLQotCQkvLyB1cHBlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSUQgSU5URUdFUiwgTkFNRSBWQVJDSEFSKDIwKSkiKTsKLQkJLy8gdGhlIE15U1FMIGRhdGFiYXNlIGRvZXMgTk9UIHJlZnJlc2ggLSBzZWUgYnVnIDI3OTcyMS4uLgotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJLy8gLi4ucmVmcmVzaCB0aGUgc2luZ2xlIHNjaGVtYSBpbnN0ZWFkCi0JCSgoSUNhdGFsb2dPYmplY3QpIGdldERUUFNjaGVtYSh0aGlzLmdldERlZmF1bHRTY2hlbWEoKSkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiSUQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIk5BTUUiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiaWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigibmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdCIpOwotCi0JCS8vIG1peGVkIGNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSWQgSU5URUdFUiwgTmFtZSBWQVJDSEFSKDIwKSkiKTsKLQkJLy8gdGhlIE15U1FMIGRhdGFiYXNlIGRvZXMgTk9UIHJlZnJlc2ggLSBzZWUgYnVnIDI3OTcyMS4uLgotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJLy8gLi4ucmVmcmVzaCB0aGUgc2luZ2xlIHNjaGVtYSBpbnN0ZWFkCi0JCSgoSUNhdGFsb2dPYmplY3QpIGdldERUUFNjaGVtYSh0aGlzLmdldERlZmF1bHRTY2hlbWEoKSkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiSWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIk5hbWUiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiaWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigibmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdCIpOwotCi0JCS8vIGRlbGltaXRlZAotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChgSWRgIElOVEVHRVIsIGBOYW1lYCBWQVJDSEFSKDIwKSkiKTsKLQkJLy8gdGhlIE15U1FMIGRhdGFiYXNlIGRvZXMgTk9UIHJlZnJlc2ggLSBzZWUgYnVnIDI3OTcyMS4uLgotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJLy8gLi4ucmVmcmVzaCB0aGUgc2luZ2xlIHNjaGVtYSBpbnN0ZWFkCi0JCSgoSUNhdGFsb2dPYmplY3QpIGdldERUUFNjaGVtYSh0aGlzLmdldERlZmF1bHRTY2hlbWEoKSkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiSWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIk5hbWUiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiaWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigibmFtZSIpKTsKLQotCQlib29sZWFuIHF1b3RlcyA9IHRoaXMuZ2V0QU5TSVF1b3Rlc0Zyb21EYXRhYmFzZSgpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImBJZGAiKSk7Ci0JCWlmIChxdW90ZXMpIHsKLQkJCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiXCJJZFwiIikpOwotCQl9Ci0KLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJgTmFtZWAiKSk7Ci0JCWlmIChxdW90ZXMpIHsKLQkJCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiXCJOYW1lXCIiKSk7Ci0JCX0KLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0QU5TSVF1b3Rlc0Zyb21EYXRhYmFzZSgpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlBcnJheUxpc3Q8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IHJvd3MgPSB0aGlzLmV4ZWN1dGUoIlNFTEVDVCBAQFNFU1NJT04uc3FsX21vZGUiKTsKLQkJTWFwPFN0cmluZywgT2JqZWN0PiByb3cgPSByb3dzLmdldCgwKTsKLQkJU3RyaW5nIHNxbF9tb2RlID0gKFN0cmluZykgcm93LmdldCgiQEBTRVNTSU9OLnNxbF9tb2RlIik7Ci0JCVN0cmluZ1tdIG1vZGVzID0gc3FsX21vZGUuc3BsaXQoIiwiKTsKLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihBcnJheVRvb2xzLmNvbnRhaW5zKG1vZGVzLCAiQU5TSV9RVU9URVMiKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJEUk9QIFRBQkxFIElGIEVYSVNUUyAiICsgdGFibGVOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlMTBnVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGUxMGdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDcxMWU4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGUxMGdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JhY2xlMTBnVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotCXB1YmxpYyBPcmFjbGUxMGdUZXN0cyggU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoIG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKSB7Ci0JCXJldHVybiAib3JhY2xlMTBnLnByb3BlcnRpZXMiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJPcmFjbGUgMTBnIFRoaW4gRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLk9yYWNsZSBUaGluIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5vcmFjbGUuMTAuZHJpdmVyVGVtcGxhdGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAiT3JhY2xlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICIxMCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJvcmFjbGUuamRiYy5PcmFjbGVEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiT3JhY2xlMTBnXzEwLjEuMC40IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJPcmFjbGUxMGcgKDEwLjEuMC40KSBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJLy8gd29ya2luZyBvZmZsaW5lIGlzIHByZXR0eSB1Z2x5Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGF0YWJhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0VXNlck5hbWUoKS50b1VwcGVyQ2FzZSgpLmVxdWFscygiU1lTIikpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2tpcHBlZCB0ZXN0OiAiICsgdGhpcy5nZXRDbGFzcygpICsgJy4nICsgdGhpcy5nZXROYW1lKCkpOwotCQkJcmV0dXJuOyAgLy8gU1lTIGRvZXMgbm90IGhhdmUgYSBzY2hlbWEKLQkJfQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQkvLyBPcmFjbGUgc2hvdWxkIGhhdmUgYSBzY2hlbWEgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSB1c2VyCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcih0aGlzLmdldFVzZXJJRCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEpOwotCQlhc3NlcnRTYW1lKHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLCBzY2hlbWEpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJmb29fYmF6Iik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJiYXoiKTsKLQkJdGhpcy5kcm9wVGFibGUoImZvbyIpOwotCQl0aGlzLmRyb3BUYWJsZSgiYmFyIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXJEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhekRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29CYXpEREwoKSk7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKTsKLQotCQkvLyBmb28KLQkJVGFibGUgZm9vVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZvb1RhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZm9vVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZm9vVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCi0JCUNvbHVtbiBwa0NvbHVtbiA9IGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJJRCIsIHBrQ29sdW1uLmdldE5hbWUoKSk7Ci0JCUNvbHVtbiBpZENvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImlkIik7Ci0JCWFzc2VydFNhbWUocGtDb2x1bW4sIGlkQ29sdW1uKTsKLQkJYXNzZXJ0RXF1YWxzKCJOVU1CRVIiLCBpZENvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGlkQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGlkQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoaWRDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubWF0aC5CaWdEZWNpbWFsIiwgaWRDb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQotCQlDb2x1bW4gbmFtZUNvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIm5hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJWQVJDSEFSMiIsIG5hbWVDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBuYW1lQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpOwotCi0JCUNvbHVtbiBiYXJDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJiYXJfaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJOVU1CRVIiLCBiYXJDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKGJhckNvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGJhckNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0KLQkJRm9yZWlnbktleSBiYXJGSyA9IGZvb1RhYmxlLmdldEZvcmVpZ25LZXlzKCkuaXRlcmF0b3IoKS5uZXh0KCk7ICAvLyB0aGVyZSBzaG91bGQgb25seSBiZSAxIGZvcmVpZ24ga2V5Ci0JCWFzc2VydEVxdWFscygxLCBiYXJGSy5nZXRDb2x1bW5QYWlyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYmFyRksuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVJfSUQiLCBiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoInByaW1hcnlCYXIiKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGJhckZLLmdldEJhc2VUYWJsZSgpKTsKLQotCQlhc3NlcnRGYWxzZShmb29UYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRTYW1lKHNjaGVtYSwgZm9vVGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCS8vIEJBUgotCQlUYWJsZSBiYXJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoMiwgYmFyVGFibGUuZ2V0Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBiYXJUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBiYXJUYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiSUQiLCBiYXJUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyVGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTE9CIiwgYmFyVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiY2h1bmsiKS5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYnl0ZVtdIiwgYmFyVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiY2h1bmsiKS5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRUcnVlKGJhclRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImNodW5rIikuaXNMT0IoKSk7Ci0JCWFzc2VydFNhbWUoYmFyVGFibGUsIGJhckZLLmdldFJlZmVyZW5jZWRUYWJsZSgpKTsKLQotCQkvLyBGT09fQkFaCi0JCVRhYmxlIGZvb19iYXpUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoImZvb19iYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGZvb19iYXpUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5qb2luVGFibGVOYW1lSXNEZWZhdWx0KCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJmb29faWQiKS5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoImZvb19iYXoiKTsKLQkJdGhpcy5kcm9wVGFibGUoImJheiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiZm9vIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJiYXIiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmFyRERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgYmFyICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBOVU1CRVIoMTApIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGNodW5rIEJMT0IiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0RETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGZvbyAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgaWQgTlVNQkVSKDEwKSBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBuYW1lIFZBUkNIQVIyKDIwKSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBiYXJfaWQgUkVGRVJFTkNFUyBiYXIoaWQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBiYXogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGlkIE5VTUJFUigxMCkgUFJJTUFSWSBLRVksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgbmFtZSBWQVJDSEFSMigyMCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0JhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGZvb19iYXogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGZvb19pZCBOVU1CRVIoMTApIFJFRkVSRU5DRVMgZm9vKGlkKSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBiYXpfaWQgTlVNQkVSKDEwKSBSRUZFUkVOQ0VTIGJheihpZCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGVMb29rdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QxIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJURVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiXCJ0ZXN0M1wiIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdDEgKGlkIE5VTUJFUigxMCksIG5hbWUgVkFSQ0hBUjIoMjApKSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBURVNUMiAoaWQgTlVNQkVSKDEwKSwgbmFtZSBWQVJDSEFSMigyMCkpIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIFwidGVzdDNcIiAoaWQgTlVNQkVSKDEwKSwgbmFtZSBWQVJDSEFSMigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKTsKLQotCQlUYWJsZSB0ZXN0MVRhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdDEiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0MVRhYmxlKTsKLQkJdGVzdDFUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoIlRFU1QxIik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDFUYWJsZSk7Ci0KLQkJVGFibGUgdGVzdDJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QyIik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDJUYWJsZSk7Ci0JCXRlc3QyVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJURVNUMiIpOwotCQlhc3NlcnROb3ROdWxsKHRlc3QyVGFibGUpOwotCi0JCVRhYmxlIHRlc3QzVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJcInRlc3QzXCIiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0M1RhYmxlKTsKLQkJdGVzdDNUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QzIik7Ci0JCWFzc2VydE51bGwodGVzdDNUYWJsZSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QxIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJURVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiXCJ0ZXN0M1wiIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJ0ZXN0Iik7Ci0KLQkJLy8gbG93ZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKGlkIE5VTUJFUigxMCksIG5hbWUgVkFSQ0hBUjIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImlkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIm5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QiKTsKLQotCQkvLyB1cHBlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSUQgTlVNQkVSKDEwKSwgTkFNRSBWQVJDSEFSMigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSUQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTkFNRSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdCIpOwotCi0JCS8vIG1peGVkIGNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSWQgTlVNQkVSKDEwKSwgTmFtZSBWQVJDSEFSMigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdCIpOwotCi0JCS8vIGRlbGltaXRlZAotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChcIklkXCIgTlVNQkVSKDEwKSwgXCJOYW1lXCIgVkFSQ0hBUjIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIlwiSWRcIiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJcIk5hbWVcIiIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyb3NzU2NoZW1hUmVmZXJlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICggISB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldFVzZXJOYW1lKCkudG9VcHBlckNhc2UoKS5lcXVhbHMoIlNZUyIpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInNraXBwZWQgdGVzdDogIiArIHRoaXMuZ2V0Q2xhc3MoKSArICcuJyArIHRoaXMuZ2V0TmFtZSgpKTsKLQkJCXJldHVybjsgIC8vIFNZUyBkb2VzIG5vdCBoYXZlIGEgc2NoZW1hCi0JCX0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKCJEUk9QIFVTRVIgWFJFRl9URVNUMiBDQVNDQURFIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiRFJPUCBVU0VSIFhSRUZfVEVTVDEgQ0FTQ0FERSIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFVTRVIgWFJFRl9URVNUMSBJREVOVElGSUVEIEJZIGZvbyIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkFMVEVSIFVTRVIgWFJFRl9URVNUMSBRVU9UQSBVTkxJTUlURUQgT04gVVNFUlMiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgWFJFRl9URVNUMS5PUkcgKElEIE5VTUJFUigxMCkgUFJJTUFSWSBLRVksIE5BTUUgVkFSQ0hBUjIoMjApKSIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFVTRVIgWFJFRl9URVNUMiBJREVOVElGSUVEIEJZIGZvbyIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkFMVEVSIFVTRVIgWFJFRl9URVNUMiBRVU9UQSBVTkxJTUlURUQgT04gVVNFUlMiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJHUkFOVCBBTEwgT04gWFJFRl9URVNUMS5PUkcgVE8gWFJFRl9URVNUMiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBYUkVGX1RFU1QyLkVNUCAoSUQgTlVNQkVSKDEwKSBQUklNQVJZIEtFWSwgTkFNRSBWQVJDSEFSMigyMCksICIgKwotCQkJCSJPUkdfSUQgTlVNQkVSKDEwKSBSRUZFUkVOQ0VTIFhSRUZfVEVTVDEuT1JHKElEKSkiKTsKLQotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJU2NoZW1hIHNjaGVtYTEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlhSRUZfVEVTVDEiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWExKTsKLQkJVGFibGUgb3JnVGFibGUgPSBzY2hlbWExLmdldFRhYmxlTmFtZWQoIk9SRyIpOwotCQlhc3NlcnROb3ROdWxsKG9yZ1RhYmxlKTsKLQotCQlTY2hlbWEgc2NoZW1hMiA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiWFJFRl9URVNUMiIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlUYWJsZSBlbXBUYWJsZSA9IHNjaGVtYTIuZ2V0VGFibGVOYW1lZCgiRU1QIik7Ci0JCWFzc2VydE5vdE51bGwoZW1wVGFibGUpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW1wVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlGb3JlaWduS2V5IGZrID0gZW1wVGFibGUuZ2V0Rm9yZWlnbktleXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGUgcmVmVGFibGUgPSBmay5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWZUYWJsZSk7Ci0JCWFzc2VydEVxdWFscygiT1JHIiwgcmVmVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZrLmdldENvbHVtblBhaXJzU2l6ZSgpKTsKLQkJRm9yZWlnbktleS5Db2x1bW5QYWlyIGNwID0gZmsuZ2V0Q29sdW1uUGFpcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uIGJhc2VDb2x1bW4gPSBjcC5nZXRCYXNlQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiT1JHX0lEIiwgYmFzZUNvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gcmVmQ29sdW1uID0gY3AuZ2V0UmVmZXJlbmNlZENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIklEIiwgcmVmQ29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJEUk9QIFVTRVIgWFJFRl9URVNUMiBDQVNDQURFIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBVU0VSIFhSRUZfVEVTVDEgQ0FTQ0FERSIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkcm9wVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiRFJPUCBUQUJMRSAiICsgdGFibGVOYW1lICsgIiBDQVNDQURFIENPTlNUUkFJTlRTIik7Ci0JfQotCi0vLyBuZWVkIE9yYWNsZSBlbmFibGVtZW50IHBsdWctaW4KLS8vCXB1YmxpYyB2b2lkIHRlc3RTZXF1ZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotLy8JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotLy8JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLS8vCi0vLwkJdGhpcy5kcm9wU2VxdWVuY2UoIkZPT19TRVEiKTsKLS8vCi0vLwkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0VRVUVOQ0UgRk9PX1NFUSIpOwotLy8JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotLy8KLS8vCQlTZXF1ZW5jZSBzZXF1ZW5jZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0U2VxdWVuY2VGb3JJZGVudGlmaWVyKCJGT08iKTsKLS8vCQlhc3NlcnROb3ROdWxsKHNlcXVlbmNlKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPT19TRVEiLCBzZXF1ZW5jZS5nZXROYW1lKCkpOwotLy8KLS8vCQl0aGlzLmRyb3BTZXF1ZW5jZSgiRk9PX1NFUSIpOwotLy8KLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0vLwkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0vLwl9Ci0vLwotLy8JcHJpdmF0ZSB2b2lkIGRyb3BTZXF1ZW5jZShTdHJpbmcgc2VxdWVuY2VOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoIkRST1AgU0VRVUVOQ0UgIiArIHNlcXVlbmNlTmFtZSk7Ci0vLwl9Ci0vLwotCXByb3RlY3RlZCB2b2lkIGR1bXBVc2VyT2JqZWN0cygpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQl0aGlzLmR1bXAoInNlbGVjdCAqIGZyb20gdXNlcl9vYmplY3RzIik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlMTBnWEVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTEwZ1hFVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2NmE5YS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlMTBnWEVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotCi0vKioKLSAqICBPcmFjbGUgMTBnIFRoaW4gRHJpdmVyIFRlc3QKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JhY2xlMTBnWEVUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0JcHVibGljIE9yYWNsZTEwZ1hFVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCBuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIm9yYWNsZTEwZ1hFLnByb3BlcnRpZXMiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJPcmFjbGUgMTBnIFRoaW4gRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLk9yYWNsZSBUaGluIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5vcmFjbGUuMTAuZHJpdmVyVGVtcGxhdGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAiT3JhY2xlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICIxMCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJvcmFjbGUuamRiYy5PcmFjbGVEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiT3JhY2xlMTBnX1hFIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJPcmFjbGUxMGcgWEUgUmVsZWFzZSAyICgxMC4yKSBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJLy8gd29ya2luZyBvZmZsaW5lIGlzIHByZXR0eSB1Z2x5Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGU5aVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlOWlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDJlOTE5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGU5aVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi0KLS8qKgotICogIE9yYWNsZSA5aSBUaGluIERyaXZlciBUZXN0Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9yYWNsZTlpVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotCXB1YmxpYyBPcmFjbGU5aVRlc3RzKCBTdHJpbmcgbmFtZSkgewotCQlzdXBlciggbmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlTmFtZSgpIHsKLQkJcmV0dXJuICJvcmFjbGU5aS5wcm9wZXJ0aWVzIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiT3JhY2xlIDlpIFRoaW4gRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLk9yYWNsZSBUaGluIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5vcmFjbGUuOS5kcml2ZXJUZW1wbGF0ZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuICJPcmFjbGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZXJzaW9uKCkgewotCQlyZXR1cm4gIjkiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAib3JhY2xlLmpkYmMuT3JhY2xlRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIk9yYWNsZTlpIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJPcmFjbGU5aSBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJLy8gd29ya2luZyBvZmZsaW5lIGlzIHByZXR0eSB1Z2x5Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9Qb3N0Z3JlU1FMVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9Qb3N0Z3JlU1FMVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU1MDFhNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvUG9zdGdyZVNRTFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQb3N0Z3JlU1FMVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotCXB1YmxpYyBQb3N0Z3JlU1FMVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCBuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gInBvc3RncmVzcWwucHJvcGVydGllcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIlBvc3RncmVTUUwgSkRCQyBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkgewotCQlyZXR1cm4gIkRyaXZlckRlZm4uUG9zdGdyZVNRTCBKREJDIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5wb3N0Z3Jlc3FsLnBvc3RncmVzcWxEcml2ZXJUZW1wbGF0ZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuICJwb3N0Z3JlcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiOC54IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gIm9yZy5wb3N0Z3Jlc3FsLkRyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0SkRCQ1VSTCgpIHsKLQkJLy8gdXNpbmcgdGhpcyBVUkwgd2lsbCByZXN1bHQgaW4gdGhlIERUUCBkYXRhYmFzZSBjb250YWluaW5nIGEgc2luZ2xlCi0JCS8vIGNhdGFsb2cgbmFtZWQgIiIgLSB3aGljaCwgdW5mb3J0dW5hdGVseSwgcmVzZW1ibGVzIHRoZSBwc2V1ZG8tY2F0YWxvZwotCQkvLyBnZW5lcmF0ZWQgYnkgRFRQIGZvciBkYXRhYmFzZXMgdGhhdCBkbyBub3QgcmV0dXJuIGFueSBjYXRhbG9ncyB2aWEKLQkJLy8gSkRCQyBtZXRhZGF0YSBjYWxscy4uLgotCQlyZXR1cm4gImpkYmM6cG9zdGdyZXNxbCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJQb3N0Z3JlU1FMIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJQb3N0Z3JlU1FMIDguMiBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlT2ZmbGluZVRlc3RzKCkgewotCQkvLyBEVFAgZG9lcyBub3Qgc3VwcG9ydCBQb3N0Z3JlU1FMIG9mZi1saW5lIC0gc2VlIDIyNjcwNC8yNDE1NTgKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wU2NoZW1hKCJURVNUMSIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QyIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFRFU1QxIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWExID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlRFU1QxIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFRFU1QyIik7Ci0JCVNjaGVtYSBzY2hlbWEyID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlRFU1QyIik7Ci0JCWFzc2VydE51bGwoc2NoZW1hMik7ICAvLyBzaG91bGQgYmUgbnVsbCB1bnRpbCByZWZyZXNoCi0KLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0JCWFzc2VydFNhbWUodGhpcy5nZXREYXRhYmFzZSgpLCBsaXN0ZW5lci5jaGFuZ2VkRGF0YWJhc2UpOwotCi0JCXNjaGVtYTIgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiVEVTVDIiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEyKTsKLQkJYXNzZXJ0Tm90U2FtZShzY2hlbWExLCB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiVEVTVDEiKSk7ICAvLyB3ZSBzaG91bGQgaGF2ZSBhIG5ldyBzY2hlbWEgYWZ0ZXIgdGhlIHJlZnJlc2gKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QyIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEVTVDEiKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJcImxvb2t1cF9URVNUXCIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgTE9PS1VQX1RFU1QiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoIkxPT0tVUF9URVNUIikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJMT09LVVBfVEVTVCIpKTsKLQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX3Rlc3QiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoImxvb2t1cF90ZXN0IikpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYU5hbWVkKCJsb29rdXBfVEVTVCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigibG9va3VwX1RFU1QiKSk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJsb29rdXBfdGVzdFwiIikpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJcImxvb2t1cF9URVNUXCIiKSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwiTE9PS1VQX1RFU1RcIiIpKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIkxPT0tVUF9URVNUIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFwibG9va3VwX1RFU1RcIiIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFOYW1lZCgiTE9PS1VQX1RFU1QiKSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIkxPT0tVUF9URVNUIikpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYU5hbWVkKCJsb29rdXBfdGVzdCIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigibG9va3VwX3Rlc3QiKSk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF9URVNUIikpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfVEVTVCIpKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJcIkxPT0tVUF9URVNUXCIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwibG9va3VwX1RFU1RcIiIpKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlwibG9va3VwX1RFU1RcIiIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjaGVtYUlkZW50aWZpZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wU2NoZW1hKCJMT09LVVBfVEVTVCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlwibG9va3VwX1RFU1RcIiIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBsb29rdXBfdGVzdCIpOyAgLy8gdGhpcyBnZXRzIGZvbGRlZCB0byBsb3dlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFwibG9va3VwX1RFU1RcIiIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIkxPT0tVUF9URVNUIik7Ci0JCWFzc2VydEVxdWFscygibG9va3VwX3Rlc3QiLCBzY2hlbWEuZ2V0SWRlbnRpZmllcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJsb29rdXBfdGVzdCIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCJMb29rdXBUZXN0IikpOwotCQlhc3NlcnROdWxsKHNjaGVtYS5nZXRJZGVudGlmaWVyKCJMb29rdXBfVGVzdCIpKTsKLQotCQlzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF90ZXN0Iik7Ci0JCWFzc2VydEVxdWFscygibG9va3VwX3Rlc3QiLCBzY2hlbWEuZ2V0SWRlbnRpZmllcigpKTsKLQotCQlzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJsb29rdXBfVEVTVFwiIik7Ci0JCWFzc2VydEVxdWFscygiXCJsb29rdXBfVEVTVFwiIiwgc2NoZW1hLmdldElkZW50aWZpZXIoKSk7Ci0JCWFzc2VydEVxdWFscygiXCJsb29rdXBfVEVTVFwiIiwgc2NoZW1hLmdldElkZW50aWZpZXIoImxvb2t1cF9URVNUIikpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiXCJsb29rdXBfVEVTVFwiIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT09fQkFaIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkJBWiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT08iKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiQkFSIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEFCTEVfVEVTVCIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBUQUJMRV9URVNUIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIHNlYXJjaF9wYXRoIFRPIFRBQkxFX1RFU1QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhckRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29EREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmF6RERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0JhekRETCgpKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJUQUJMRV9URVNUIik7Ci0KLQkJLy8gRk9PCi0JCVRhYmxlIGZvb1RhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiRk9PIik7Ci0JCWFzc2VydEVxdWFscygzLCBmb29UYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQotCQlDb2x1bW4gcGtDb2x1bW4gPSBmb29UYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBwa0NvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gaWRDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJJRCIpOwotCQlhc3NlcnRTYW1lKHBrQ29sdW1uLCBpZENvbHVtbik7Ci0JCWFzc2VydEVxdWFscygiSU5UNCIsIGlkQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0U2FtZShmb29UYWJsZSwgaWRDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydFRydWUoaWRDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpOwotCQlhc3NlcnRGYWxzZShpZENvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkludGVnZXIiLCBpZENvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCi0JCUNvbHVtbiBuYW1lQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTkFNRSIpOwotCQlhc3NlcnRFcXVhbHMoIlZBUkNIQVIiLCBuYW1lQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbmFtZUNvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlDb2x1bW4gYmFyQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiQkFSX0lEIik7Ci0JCWFzc2VydEVxdWFscygiSU5UNCIsIGJhckNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYmFyQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlGb3JlaWduS2V5IGJhckZLID0gZm9vVGFibGUuZ2V0Rm9yZWlnbktleXMoKS5pdGVyYXRvcigpLm5leHQoKTsgIC8vIHRoZXJlIHNob3VsZCBvbmx5IGJlIDEgZm9yZWlnbiBrZXkKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhckZLLmdldENvbHVtblBhaXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBiYXJGSy5nZXRBdHRyaWJ1dGVOYW1lKCkpOwotCQlhc3NlcnROdWxsKGJhckZLLmdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcigiYmFyIikpOwotCQlhc3NlcnRFcXVhbHMoImJhcl9pZCIsIGJhckZLLmdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcigicHJpbWFyeUJhciIpKTsKLQkJYXNzZXJ0U2FtZShmb29UYWJsZSwgYmFyRksuZ2V0QmFzZVRhYmxlKCkpOwotCi0JCWFzc2VydEZhbHNlKGZvb1RhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydFNhbWUoc2NoZW1hLCBmb29UYWJsZS5nZXRTY2hlbWEoKSk7Ci0KLQkJLy8gQkFSCi0JCVRhYmxlIGJhclRhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiQkFSIik7Ci0JCWFzc2VydEVxdWFscygyLCBiYXJUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGJhclRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShiYXJUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJZVEVBIiwgYmFyVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiQ0hVTksiKS5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYnl0ZVtdIiwgYmFyVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiQ0hVTksiKS5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQkvLyBhc3NlcnRUcnVlKGJhclRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIkNIVU5LIikuZGF0YVR5cGVJc0xPQigpKTsKLQkJYXNzZXJ0U2FtZShiYXJUYWJsZSwgYmFyRksuZ2V0UmVmZXJlbmNlZFRhYmxlKCkpOwotCi0JCS8vIEZPT19CQVoKLQkJVGFibGUgZm9vX2JhelRhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiRk9PX0JBWiIpOwotCQlhc3NlcnRFcXVhbHMoMiwgZm9vX2JhelRhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZm9vX2JhelRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmpvaW5UYWJsZU5hbWVJc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIkZPT19JRCIpLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT09fQkFaIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkJBWiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT08iKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiQkFSIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEFCTEVfVEVTVCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXJEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBCQVIgKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEIGludGVnZXIgUFJJTUFSWSBLRVksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgQ0hVTksgYnl0ZWEiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0RETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEZPTyAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgSUQgaW50ZWdlciBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBOQU1FIHZhcmNoYXIoMjApLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEJBUl9JRCBpbnRlZ2VyIFJFRkVSRU5DRVMgQkFSKElEKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmF6RERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgQkFaICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBJRCBpbnRlZ2VyIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIE5BTUUgdmFyY2hhcigyMCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0JhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEZPT19CQVogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEZPT19JRCBpbnQgUkVGRVJFTkNFUyBGT08oSUQpLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEJBWl9JRCBpbnQgUkVGRVJFTkNFUyBCQVooSUQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbHVtbkxvb2t1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJ0ZXN0Iik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEFCTEVfVEVTVCIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBUQUJMRV9URVNUIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIHNlYXJjaF9wYXRoIFRPIFRBQkxFX1RFU1QiKTsKLQotCQkvLyBsb3dlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoaWQgaW50LCBuYW1lIHZhcmNoYXIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJUQUJMRV9URVNUIikuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiaWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigibmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJ0ZXN0Iik7Ci0KLQkJLy8gdXBwZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKElEIGludCwgTkFNRSB2YXJjaGFyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiVEFCTEVfVEVTVCIpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIklEIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIk5BTUUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAidGVzdCIpOwotCi0JCS8vIG1peGVkIGNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSWQgaW50LCBOYW1lIHZhcmNoYXIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJUQUJMRV9URVNUIikuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJ0ZXN0Iik7Ci0KLQkJLy8gZGVsaW1pdGVkCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKFwiSWRcIiBpbnQsIFwiTmFtZVwiIHZhcmNoYXIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJUQUJMRV9URVNUIikuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiXCJJZFwiIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIlwiTmFtZVwiIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgInRlc3QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NTY2hlbWFSZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDIiLCAiRU1QIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiWFJFRl9URVNUMSIsICJPUkciKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJYUkVGX1RFU1QxIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFhSRUZfVEVTVDEiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJTRVQgc2VhcmNoX3BhdGggVE8gWFJFRl9URVNUMSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBPUkcgKElEIGludGVnZXIgUFJJTUFSWSBLRVksIE5BTUUgdmFyY2hhcigyMCkpIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFhSRUZfVEVTVDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJTRVQgc2VhcmNoX3BhdGggVE8gWFJFRl9URVNUMiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBFTVAgKElEIGludGVnZXIgUFJJTUFSWSBLRVksIE5BTUUgdmFyY2hhcigyMCksICIgKwotCQkJCSJPUkdfSUQgaW50ZWdlciBSRUZFUkVOQ0VTIFhSRUZfVEVTVDEuT1JHKElEKSkiKTsKLQotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJU2NoZW1hIHNjaGVtYTEgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoInhyZWZfdGVzdDEiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWExKTsKLQkJVGFibGUgb3JnVGFibGUgPSBzY2hlbWExLmdldFRhYmxlTmFtZWQoIm9yZyIpOwotCQlhc3NlcnROb3ROdWxsKG9yZ1RhYmxlKTsKLQotCQlTY2hlbWEgc2NoZW1hMiA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFOYW1lZCgieHJlZl90ZXN0MiIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlUYWJsZSBlbXBUYWJsZSA9IHNjaGVtYTIuZ2V0VGFibGVOYW1lZCgiZW1wIik7Ci0JCWFzc2VydE5vdE51bGwoZW1wVGFibGUpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW1wVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlGb3JlaWduS2V5IGZrID0gZW1wVGFibGUuZ2V0Rm9yZWlnbktleXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGUgcmVmVGFibGUgPSBmay5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWZUYWJsZSk7Ci0JCWFzc2VydEVxdWFscygib3JnIiwgcmVmVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZrLmdldENvbHVtblBhaXJzU2l6ZSgpKTsKLQkJRm9yZWlnbktleS5Db2x1bW5QYWlyIGNwID0gZmsuZ2V0Q29sdW1uUGFpcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uIGJhc2VDb2x1bW4gPSBjcC5nZXRCYXNlQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygib3JnX2lkIiwgYmFzZUNvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gcmVmQ29sdW1uID0gY3AuZ2V0UmVmZXJlbmNlZENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgcmVmQ29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDIiLCAiRU1QIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiWFJFRl9URVNUMSIsICJPUkciKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJYUkVGX1RFU1QxIik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BUYWJsZShTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNjaGVtYSBzY2hlbWE9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKHNjaGVtYU5hbWUpOwotCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCWlmIChzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKHRhYmxlTmFtZSkgIT0gbnVsbCkgewotCQkJCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBUQUJMRSAiICsgc2NoZW1hTmFtZSArICcuJyArIHRhYmxlTmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZHJvcFNjaGVtYShTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcihuYW1lKSAhPSBudWxsKSB7Ci0JCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkRST1AgU0NIRU1BICIgKyBuYW1lICsgIiBDQVNDQURFIik7Ci0JCX0KLQl9Ci0KLS8vIHNlZSAyNDE1NzgvMjQxNTU3Ci0vLwlwdWJsaWMgdm9pZCB0ZXN0U2VxdWVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLS8vCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0vLwotLy8JCXRoaXMuZHJvcFNlcXVlbmNlKCJTRVFVRU5DRV9URVNUIiwgIkZPTyIpOwotLy8JCXRoaXMuZHJvcFNjaGVtYSgiU0VRVUVOQ0VfVEVTVCIpOwotLy8KLS8vCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgU0VRVUVOQ0VfVEVTVCIpOwotLy8JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIHNlYXJjaF9wYXRoIFRPIFNFUVVFTkNFX1RFU1QiKTsKLS8vCi0vLwkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXJEREwoKSk7Ci0vLwkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0VRVUVOQ0UgRk9PIFNUQVJUIDEiKTsKLS8vLy8JCUxpc3Q8T2JqZWN0W10+IGxpc3QgPSB0aGlzLmV4ZWN1dGUoIlNFTEVDVCBuZXh0dmFsKCdmb28nKSIpOwotLy8vLwkJU3lzdGVtLm91dC5wcmludGxuKGxpc3QpOwotLy8JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotLy8KLS8vCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYU5hbWVkKCJTRVFVRU5DRV9URVNUIik7Ci0vLwkJU2VxdWVuY2Ugc2VxdWVuY2UgPSBzY2hlbWEuZ2V0U2VxdWVuY2VOYW1lZCgiRk9PIik7Ci0vLwkJYXNzZXJ0Tm90TnVsbChzZXF1ZW5jZSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJmb29fc2VxIiwgc2VxdWVuY2UuZ2V0TmFtZSgpKTsKLS8vCi0vLwkJdGhpcy5kcm9wU2VxdWVuY2UoIlNFUVVFTkNFX1RFU1QiLCAiRk9PIik7Ci0vLwkJdGhpcy5kcm9wU2NoZW1hKCJTRVFVRU5DRV9URVNUIik7Ci0vLwotLy8JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLS8vCX0KLS8vCi0vLwlwcml2YXRlIHZvaWQgZHJvcFNlcXVlbmNlKFN0cmluZyBzY2hlbWFOYW1lLCBTdHJpbmcgc2VxdWVuY2VOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlTY2hlbWEgc2NoZW1hPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoc2NoZW1hTmFtZSk7Ci0vLwkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0vLwkJCWlmIChzY2hlbWEuZ2V0U2VxdWVuY2VOYW1lZChzZXF1ZW5jZU5hbWUpICE9IG51bGwpIHsKLS8vCQkJCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBTRVFVRU5DRSAiICsgc2NoZW1hTmFtZSArICcuJyArIHNlcXVlbmNlTmFtZSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9Ci0vLwotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1NRTFNlcnZlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvU1FMU2VydmVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ2NTgzZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvU1FMU2VydmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLQotLyoqCi0gKiAgU1FMIFNlcnZlciAyMDA1IERyaXZlciBUZXN0Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNRTFNlcnZlclRlc3RzIGV4dGVuZHMgRFRQUGxhdGZvcm1UZXN0cyB7Ci0KLQlwdWJsaWMgU1FMU2VydmVyVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCBuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gInNxbHNlcnZlci5wcm9wZXJ0aWVzIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiTWljcm9zb2Z0IFNRTCBTZXJ2ZXIgMjAwNSBKREJDIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKSB7Ci0JCXJldHVybiAiRHJpdmVyRGVmbi5NaWNyb3NvZnQgU1FMIFNlcnZlciAyMDA1IEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25UeXBlKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50Lm1zZnQuc3Fsc2VydmVyLjIwMDUuZHJpdmVyVGVtcGxhdGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAiU1FMU2VydmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICIyMDA1IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gImNvbS5taWNyb3NvZnQuc3Fsc2VydmVyLmpkYmMuU1FMU2VydmVyRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIlNRTFNlcnZlcl8yMDA1IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJNaWNyb3NvZnQgU1FMIFNlcnZlciAyMDA1IEpEQkMgUHJvZmlsZSBbVGVzdF0iOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvdmlkZXJJRCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmdlbmVyaWMuY29ubmVjdGlvblByb2ZpbGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVPZmZsaW5lVGVzdHMoKSB7Ci0JCXJldHVybiB0cnVlOyAgLy8gaGF2ZW4ndCBhY3R1YWxseSB0cmllZCB0aGlzIHlldC4uLgotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1N5YmFzZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvU3liYXNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY5MWQ3YS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvU3liYXNlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTeWJhc2VUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0JcHVibGljIFN5YmFzZVRlc3RzKCBTdHJpbmcgbmFtZSkgewotCQlzdXBlciggbmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlTmFtZSgpIHsKLQkJcmV0dXJuICJzeWJhc2UucHJvcGVydGllcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIlN5YmFzZSBKREJDIERyaXZlciBmb3IgU3liYXNlIEFTRSAxNS54IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLlN5YmFzZSBKREJDIERyaXZlciBmb3IgU3liYXNlIEFTRSAxNS54IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25UeXBlKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuc3liYXNlLmFzZS5nZW5lcmljRHJpdmVyVGVtcGxhdGVfMTUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAiU3liYXNlX0FTRSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiMTUueCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJjb20uc3liYXNlLmpkYmMzLmpkYmMuU3liRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIlN5YmFzZV8xNSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiU3liYXNlIEFTRSAxNSBqQ29ubmVjdCBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlT2ZmbGluZVRlc3RzKCkgewotCQkvLyB3b3JraW5nIG9mZmxpbmUgaXMgcHJldHR5IHVnbHkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFN5YmFzZSAiZGF0YWJhc2VzIiBiZWNvbWUgRFRQICJjYXRhbG9ncyIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygibWFzdGVyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiZHJvcCBkYXRhYmFzZSB0ZXN0MSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoImRyb3AgZGF0YWJhc2UgdGVzdDIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSBkYXRhYmFzZSB0ZXN0MSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlDYXRhbG9nIGNhdGFsb2cxID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgidGVzdDEiKTsKLQkJYXNzZXJ0Tm90TnVsbChjYXRhbG9nMSk7Ci0JCVNjaGVtYSBzY2hlbWExID0gY2F0YWxvZzEuZ2V0U2NoZW1hTmFtZWQoImRibyIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTEpOwotCQlhc3NlcnRTYW1lKHNjaGVtYTEsIGNhdGFsb2cxLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgZGF0YWJhc2UgdGVzdDIiKTsKLQkJQ2F0YWxvZyBjYXRhbG9nMiA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoInRlc3QyIik7Ci0JCWFzc2VydE51bGwoY2F0YWxvZzIpOyAgLy8gc2hvdWxkIGJlIG51bGwgdW50aWwgcmVmcmVzaAotCi0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQlhc3NlcnRTYW1lKHRoaXMuZ2V0RGF0YWJhc2UoKSwgbGlzdGVuZXIuY2hhbmdlZERhdGFiYXNlKTsKLQotCQljYXRhbG9nMiA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoInRlc3QyIik7Ci0JCWFzc2VydE5vdE51bGwoY2F0YWxvZzIpOwotCQlTY2hlbWEgc2NoZW1hMiA9IGNhdGFsb2cyLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEyKTsKLQotCQlhc3NlcnROb3RTYW1lKGNhdGFsb2cxLCB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJ0ZXN0MSIpKTsgIC8vIHdlIHNob3VsZCBoYXZlIGEgbmV3IGNhdGFsb2cgYWZ0ZXIgdGhlIHJlZnJlc2gKLQkJYXNzZXJ0Tm90U2FtZShzY2hlbWExLCB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJ0ZXN0MSIpLmdldERlZmF1bHRTY2hlbWEoKSk7ICAvLyB3ZSBzaG91bGQgaGF2ZSBhIG5ldyBzY2hlbWEgYWZ0ZXIgdGhlIHJlZnJlc2gKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgZGF0YWJhc2UgdGVzdDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIGRhdGFiYXNlIHRlc3QxIik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJtYXN0ZXIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKCJkcm9wIGRhdGFiYXNlIHRhYmxlX3Rlc3QiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgZGF0YWJhc2UgdGFibGVfdGVzdCIpOwotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygidGFibGVfdGVzdCIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmFyRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0RETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXpEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vQmF6RERMKCkpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgidGFibGVfdGVzdCIpLmdldERlZmF1bHRTY2hlbWEoKTsKLQotCQkvLyBmb28KLQkJVGFibGUgZm9vVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygzLCBmb29UYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQotCQlDb2x1bW4gcGtDb2x1bW4gPSBmb29UYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBwa0NvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gaWRDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiaWQiKTsKLQkJYXNzZXJ0U2FtZShmb29UYWJsZSwgaWRDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydFNhbWUocGtDb2x1bW4sIGlkQ29sdW1uKTsKLQkJYXNzZXJ0VHJ1ZShpZENvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGlkQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0VHJ1ZShpZENvbHVtbi5pc1BhcnRPZlVuaXF1ZUNvbnN0cmFpbnQoKSk7Ci0JCWFzc2VydEZhbHNlKGlkQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJJTlQiLCBpZENvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoaWRDb2x1bW4uaXNOdW1lcmljKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgaWRDb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgaWRDb2x1bW4uZ2V0U2NhbGUoKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgaWRDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRGYWxzZShpZENvbHVtbi5pc0xPQigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBpZENvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCi0JCUNvbHVtbiBuYW1lQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoIm5hbWUiKTsKLQkJYXNzZXJ0RmFsc2UobmFtZUNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRUcnVlKG5hbWVDb2x1bW4uaXNQYXJ0T2ZVbmlxdWVDb25zdHJhaW50KCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzTnVsbGFibGUoKSk7ICAvLyBpbXBsaWVkICJOT1QgTlVMTCIgPwotCi0JCWFzc2VydEVxdWFscygiVkFSQ0hBUiIsIG5hbWVDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzTnVtZXJpYygpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBuYW1lQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBuYW1lQ29sdW1uLmdldFNjYWxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjAsIG5hbWVDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzTE9CKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBuYW1lQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0KLQkJQ29sdW1uIGJhckNvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbk5hbWVkKCJiYXJfaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlQiLCBiYXJDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKGJhckNvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGJhckNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0KLQkJRm9yZWlnbktleSBiYXJGSyA9IGZvb1RhYmxlLmdldEZvcmVpZ25LZXlzKCkuaXRlcmF0b3IoKS5uZXh0KCk7ICAvLyB0aGVyZSBzaG91bGQgb25seSBiZSAxIGZvcmVpZ24ga2V5Ci0JCWFzc2VydEVxdWFscygxLCBiYXJGSy5nZXRDb2x1bW5QYWlyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYmFyRksuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXJfaWQiLCBiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoInByaW1hcnlCYXIiKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGJhckZLLmdldEJhc2VUYWJsZSgpKTsKLQotCQlhc3NlcnRGYWxzZShmb29UYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRTYW1lKHNjaGVtYSwgZm9vVGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCS8vIEJBUgotCQlUYWJsZSBiYXJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGJhclRhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYmFyVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYmFyVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYmFyVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGJhclRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCUNvbHVtbiBjaHVua0NvbHVtbiA9IGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJjaHVuayIpOwotCQlhc3NlcnRFcXVhbHMoIklNQUdFIiwgY2h1bmtDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRGYWxzZShjaHVua0NvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydFRydWUoY2h1bmtDb2x1bW4uaXNMT0IoKSk7Ci0JCWFzc2VydEVxdWFscygiYnl0ZVtdIiwgY2h1bmtDb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQkJYXNzZXJ0U2FtZShiYXJUYWJsZSwgYmFyRksuZ2V0UmVmZXJlbmNlZFRhYmxlKCkpOwotCi0JCS8vIEJBWgotCQlUYWJsZSBiYXpUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGJhelRhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYmF6VGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYmF6VGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCi0JCUNvbHVtbiBuaWNrbmFtZUNvbHVtbiA9IGJhelRhYmxlLmdldENvbHVtbk5hbWVkKCJuaWNrbmFtZSIpOwotCQlhc3NlcnRUcnVlKG5pY2tuYW1lQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0KLQkJQ29sdW1uIHNvbmdDb2x1bW4gPSBiYXpUYWJsZS5nZXRDb2x1bW5OYW1lZCgic29uZyIpOwotCQlhc3NlcnRGYWxzZShzb25nQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0KLQkJQ29sdW1uIHNhbGFyeUNvbHVtbiA9IGJhelRhYmxlLmdldENvbHVtbk5hbWVkKCJzYWxhcnkiKTsKLQkJYXNzZXJ0RmFsc2Uoc2FsYXJ5Q29sdW1uLmlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJERUNJTUFMIiwgc2FsYXJ5Q29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzYWxhcnlDb2x1bW4uaXNOdW1lcmljKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHNhbGFyeUNvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygyLCBzYWxhcnlDb2x1bW4uZ2V0U2NhbGUoKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgc2FsYXJ5Q29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2FsYXJ5Q29sdW1uLmlzTE9CKCkpOwotCi0JCS8vIEZPT19CQVoKLQkJVGFibGUgZm9vX2JhelRhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoImZvb19iYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGZvb19iYXpUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5qb2luVGFibGVOYW1lSXNEZWZhdWx0KCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5nZXRDb2x1bW5OYW1lZCgiZm9vX2lkIikuaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSBmb29fYmF6Iik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSBiYXoiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIGZvbyIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgYmFyIik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgZGF0YWJhc2UgdGFibGVfdGVzdCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXJEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoImNyZWF0ZSB0YWJsZSBiYXIgKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGlkIGludGVnZXIgcHJpbWFyeSBrZXksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgY2h1bmsgaW1hZ2UiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0RETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiY3JlYXRlIHRhYmxlIGZvbyAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgaWQgaW50ZWdlciBwcmltYXJ5IGtleSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBuYW1lIHZhcmNoYXIoMjApIHVuaXF1ZSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBiYXJfaWQgaW50ZWdlciByZWZlcmVuY2VzIGJhcihpZCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEJhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiY3JlYXRlIHRhYmxlIGJheiAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgaWQgaW50ZWdlciBwcmltYXJ5IGtleSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBuaWNrbmFtZSB2YXJjaGFyKDIwKSBudWxsLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIHNvbmcgdmFyY2hhcigyMCkgbm90IG51bGwsIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgc2FsYXJ5IGRlY2ltYWwoMTAsIDIpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGb29CYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoImNyZWF0ZSB0YWJsZSBmb29fYmF6ICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBmb29faWQgaW50ZWdlciByZWZlcmVuY2VzIGZvbyhpZCksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgYmF6X2lkIGludGVnZXIgcmVmZXJlbmNlcyBiYXooaWQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJtYXN0ZXIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKCJkcm9wIGRhdGFiYXNlIHRhYmxlX2xvb2t1cF90ZXN0Iik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIGRhdGFiYXNlIHRhYmxlX2xvb2t1cF90ZXN0Iik7Ci0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJ0YWJsZV9sb29rdXBfdGVzdCIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIHRlc3QxIChpZCBpbnRlZ2VyLCBuYW1lIHZhcmNoYXIoMjApKSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSB0YWJsZSBURVNUMiAoaWQgaW50ZWdlciwgbmFtZSB2YXJjaGFyKDIwKSkiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgdGFibGUgW1Rlc3QzXSAoaWQgaW50ZWdlciwgbmFtZSB2YXJjaGFyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoInRhYmxlX2xvb2t1cF90ZXN0IikuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCi0JCWFzc2VydE5vdE51bGwoc2NoZW1hLmdldFRhYmxlTmFtZWQoInRlc3QxIikpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QxIikpOwotCi0JCWFzc2VydE5vdE51bGwoc2NoZW1hLmdldFRhYmxlTmFtZWQoIlRFU1QyIikpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoIlRFU1QyIikpOwotCi0JCWFzc2VydE5vdE51bGwoc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiW1Rlc3QzXSIpKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgW1Rlc3QzXSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgVEVTVDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIHRlc3QxIik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgZGF0YWJhc2UgdGFibGVfbG9va3VwX3Rlc3QiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2x1bW5Mb29rdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoImRyb3AgZGF0YWJhc2UgY29sdW1uX2xvb2t1cF90ZXN0Iik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIGRhdGFiYXNlIGNvbHVtbl9sb29rdXBfdGVzdCIpOwotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygiY29sdW1uX2xvb2t1cF90ZXN0Iik7Ci0KLQkJLy8gbG93ZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIHRlc3QgKGlkIGludGVnZXIsIG5hbWUgdmFyY2hhcigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVRhYmxlIHRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgiY29sdW1uX2xvb2t1cF90ZXN0IikuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiaWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIm5hbWUiKSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIHRlc3QiKTsKLQotCQkvLyB1cHBlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgdGFibGUgdGVzdCAoSUQgaW50ZWdlciwgTkFNRSB2YXJjaGFyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJjb2x1bW5fbG9va3VwX3Rlc3QiKS5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0VGFibGVOYW1lZCgidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIklEIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIk5BTUUiKSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIHRlc3QiKTsKLQotCQkvLyBtaXhlZCBjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIHRlc3QgKElkIGludGVnZXIsIE5hbWUgdmFyY2hhcigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgiY29sdW1uX2xvb2t1cF90ZXN0IikuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJJZCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJOYW1lIikpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSB0ZXN0Iik7Ci0KLQkJLy8gZGVsaW1pdGVkCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIHRlc3QgKFtJZF0gaW50ZWdlciwgW05hbWVdIHZhcmNoYXIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoImNvbHVtbl9sb29rdXBfdGVzdCIpLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZU5hbWVkKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiW0lkXSIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJbTmFtZV0iKSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIHRlc3QiKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygibWFzdGVyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCBkYXRhYmFzZSBjb2x1bW5fbG9va3VwX3Rlc3QiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcm9zc1NjaGVtYVJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygibWFzdGVyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiZHJvcCBkYXRhYmFzZSB4cmVmX3Rlc3QyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiZHJvcCBkYXRhYmFzZSB4cmVmX3Rlc3QxIik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSBkYXRhYmFzZSB4cmVmX3Rlc3QxIik7Ci0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJ4cmVmX3Rlc3QxIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIG9yZyAoaWQgaW50ZWdlciBwcmltYXJ5IGtleSwgbmFtZSB2YXJjaGFyKDIwKSkiKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygibWFzdGVyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIGRhdGFiYXNlIHhyZWZfdGVzdDIiKTsKLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coInhyZWZfdGVzdDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgdGFibGUgZW1wIChpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCBuYW1lIHZhcmNoYXIoMjApLCAiICsKLQkJCQkib3JnX2lkIGludGVnZXIgcmVmZXJlbmNlcyB4cmVmX3Rlc3QxLi5vcmcoaWQpKSIpOwotCi0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQlDYXRhbG9nIGNhdGFsb2cxID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgieHJlZl90ZXN0MSIpOwotCQlhc3NlcnROb3ROdWxsKGNhdGFsb2cxKTsKLQkJU2NoZW1hIHNjaGVtYTEgPSBjYXRhbG9nMS5nZXRTY2hlbWFOYW1lZCgiZGJvIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0JCVRhYmxlIG9yZ1RhYmxlID0gc2NoZW1hMS5nZXRUYWJsZU5hbWVkKCJvcmciKTsKLQkJYXNzZXJ0Tm90TnVsbChvcmdUYWJsZSk7Ci0KLQkJQ2F0YWxvZyBjYXRhbG9nMiA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoInhyZWZfdGVzdDIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjYXRhbG9nMik7Ci0JCVNjaGVtYSBzY2hlbWEyID0gY2F0YWxvZzIuZ2V0U2NoZW1hTmFtZWQoImRibyIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlUYWJsZSBlbXBUYWJsZSA9IHNjaGVtYTIuZ2V0VGFibGVOYW1lZCgiZW1wIik7Ci0JCWFzc2VydE5vdE51bGwoZW1wVGFibGUpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW1wVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlGb3JlaWduS2V5IGZrID0gZW1wVGFibGUuZ2V0Rm9yZWlnbktleXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGUgcmVmVGFibGUgPSBmay5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWZUYWJsZSk7Ci0JCWFzc2VydEVxdWFscygib3JnIiwgcmVmVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZrLmdldENvbHVtblBhaXJzU2l6ZSgpKTsKLQkJRm9yZWlnbktleS5Db2x1bW5QYWlyIGNwID0gZmsuZ2V0Q29sdW1uUGFpcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uIGJhc2VDb2x1bW4gPSBjcC5nZXRCYXNlQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygib3JnX2lkIiwgYmFzZUNvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gcmVmQ29sdW1uID0gY3AuZ2V0UmVmZXJlbmNlZENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgcmVmQ29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coInhyZWZfdGVzdDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIGVtcCIpOwotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygieHJlZl90ZXN0MSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgb3JnIik7Ci0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJtYXN0ZXIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIGRhdGFiYXNlIHhyZWZfdGVzdDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIGRhdGFiYXNlIHhyZWZfdGVzdDEiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uY2xhc3NwYXRoIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmJmNDBhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvanBhLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qc3QvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLmN2c2lnbm9yZSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLnByb2plY3QgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGNmNDVmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAzNDY4NS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNUdWUgTWFyIDA4IDEyOjA5OjEzIEVTVCAyMDExCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMjk2MGYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAyLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHM7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHM7YnVuZGxlLXZlcnNpb249IlszLjAuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iWzQuMC4wLDUuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5tZXRhZGF0YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvYWJvdXQuaHRtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjIyN2NlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjljZmNkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0IC0gQ29yZSBUZXN0cwotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvSnB0SnBhRWNsaXBzZUxpbmtDb3JlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9KcHRKcGFFY2xpcHNlTGlua0NvcmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2Q3ODkxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9KcHRKcGFFY2xpcHNlTGlua0NvcmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSnB0SnBhRWNsaXBzZUxpbmtDb3JlQ29udGV4dE1vZGVsVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLm1ldGFkYXRhLkpwdEpwYUVjbGlwc2VMaW5rQ29yZU1ldGFkYXRhVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLkpwdEpwYUVjbGlwc2VsaW5rQ29yZVJlc291cmNlTW9kZWxUZXN0czsKLQotLyoqCi0gKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCi0gKiAKLSAqIFJlcXVpcmVkIEphdmEgc3lzdGVtIHByb3BlcnR5OgotICogICAgLURvcmcuZWNsaXBzZS5qcHQuanBhLmphcj08anBhLmphciBwYXRoPgotICogICAgLURvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuamFyPTxlY2xpcHNlbGluay5qYXIgcGF0aD4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSnB0SnBhRWNsaXBzZUxpbmtDb3JlVGVzdHMKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX0pBUl9QUk9QRVJUWSA9IFRlc3RKcGFQcm9qZWN0LkpQQV9KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0pBUl9QUk9QRVJUWSA9IFRlc3RKcGFQcm9qZWN0LkVDTElQU0VMSU5LX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWTsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRKcGFFY2xpcHNlTGlua0NvcmVUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRKcGFFY2xpcHNlbGlua0NvcmVSZXNvdXJjZU1vZGVsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0SnBhRWNsaXBzZUxpbmtDb3JlQ29udGV4dE1vZGVsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0SnBhRWNsaXBzZUxpbmtDb3JlTWV0YWRhdGFUZXN0cy5zdWl0ZSgpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXF1aXJlZEphcnNFeGlzdHMoKSB7Ci0JCXJldHVybiBqcGFKYXJQcm9wZXJ0eUV4aXN0cygpCi0JCQkmJiBqcGFKYXJGaWxlRXhpc3RzKCkKLQkJCSYmIGVjbGlwc2VsaW5rSmFyUHJvcGVydHlFeGlzdHMoKQotCQkJJiYgZWNsaXBzZWxpbmtKYXJGaWxlRXhpc3RzKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBqcGFKYXJQcm9wZXJ0eUV4aXN0cygpIHsKLQkJcmV0dXJuIGdldFN5c3RlbVByb3BlcnR5KEpQQV9KQVJfUFJPUEVSVFkpICE9IG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBqcGFKYXJGaWxlRXhpc3RzKCkgewotCQlyZXR1cm4gKG5ldyBGaWxlKGdldFN5c3RlbVByb3BlcnR5KEpQQV9KQVJfUFJPUEVSVFkpKSkuZXhpc3RzKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlY2xpcHNlbGlua0phclByb3BlcnR5RXhpc3RzKCkgewotCQlyZXR1cm4gZ2V0U3lzdGVtUHJvcGVydHkoRUNMSVBTRUxJTktfSkFSX1BST1BFUlRZKSAhPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWNsaXBzZWxpbmtKYXJGaWxlRXhpc3RzKCkgewotCQlyZXR1cm4gKG5ldyBGaWxlKGdldFN5c3RlbVByb3BlcnR5KEVDTElQU0VMSU5LX0pBUl9QUk9QRVJUWSkpKS5leGlzdHMoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZE1pc3NpbmdKYXJFcnJvck1lc3NhZ2UoKSB7Ci0JCWlmKCAhIGpwYUphclByb3BlcnR5RXhpc3RzKCkpIHsKLQkJCXJldHVybiBlcnJvck1pc3NpbmdQcm9wZXJ0eShKUEFfSkFSX1BST1BFUlRZKTsKLQkJfQotCQllbHNlIGlmKCAhIGpwYUphckZpbGVFeGlzdHMoKSkgewotCQkJcmV0dXJuIGVycm9ySmFyRmlsZURvZXNOb3RFeGlzdChnZXRTeXN0ZW1Qcm9wZXJ0eShKUEFfSkFSX1BST1BFUlRZKSk7Ci0JCX0KLQkJZWxzZSBpZiggISBlY2xpcHNlbGlua0phclByb3BlcnR5RXhpc3RzKCkpIHsKLQkJCXJldHVybiBlcnJvck1pc3NpbmdQcm9wZXJ0eShFQ0xJUFNFTElOS19KQVJfUFJPUEVSVFkpOwotCQl9Ci0JCXJldHVybiBlcnJvckphckZpbGVEb2VzTm90RXhpc3QoZ2V0U3lzdGVtUHJvcGVydHkoRUNMSVBTRUxJTktfSkFSX1BST1BFUlRZKSk7Ci0JfQotCi0JLyoqKioqKioqKioqIHByaXZhdGUgKioqKioqKioqKi8KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBlcnJvck1pc3NpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiAibWlzc2luZyBKYXZhIHN5c3RlbSBwcm9wZXJ0eTogXCIiICsgcHJvcGVydHlOYW1lICsgIlwiIjsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXJyb3JKYXJGaWxlRG9lc05vdEV4aXN0KFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0JCXJldHVybiAiSkFSIGZpbGUgZG9lc24ndCBleGlzdDogXCIiICsgcHJvcGVydHlWYWx1ZSArICJcIiI7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN5c3RlbVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlwcml2YXRlIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGluazFfMUNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGluazFfMUNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZmU1Y2IuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsxXzFDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucGxhdGZvcm0uRWNsaXBzZUxpbmtQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmsxXzE7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFY2xpcHNlTGluazFfMUNvbnRleHRNb2RlbFRlc3RDYXNlIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9BTk5PVEFUSU9OU19QQUNLQUdFX05BTUUgPSAiamF2YXgucGVyc2lzdGVuY2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsxXzFDb250ZXh0TW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXRKcGFQbGF0Zm9ybURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzFfMTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVjbGlwc2VMaW5rU2NoZW1hVmVyc2lvbigpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rMV8xLlNDSEVNQV9WRVJTSU9OOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMV8xSnBhUHJvamVjdFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGluazFfMUpwYVByb2plY3RUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzlhNTI3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMV8xSnBhUHJvamVjdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuSnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua0pwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5wbGF0Zm9ybS5FY2xpcHNlTGlua1BsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGluazFfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMUpwYVByb2plY3RUZXN0cwotCWV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmsxXzFKcGFQcm9qZWN0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0SnBhUGxhdGZvcm1EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICBFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMV8xOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0pwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua0pwYVByb2plY3QpIHN1cGVyLmdldEpwYVByb2plY3QoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsJCi0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCS8vYWRkIHRoZSBvcm0ueG1sIGZpbGUgd2l0aCBlY2xpcHNlbGluayAxLjEgb3JtIGNvbnRlbnQgdHlwZQotCQljcmVhdGVEZWZhdWx0T3JtWG1sRmlsZVdpdGhFY2xpcHNlTGluazFfMUNvbnRlbnRUeXBlKCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8xX1JFU09VUkNFX1RZUEUsIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkKLQkJLy9kZWxldGUgdGhlIG9ybS54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpCi0JCXJlc291cmNlLmRlbGV0ZShudWxsKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkKLQkJLy9hZGQgdGhlIG9ybS54bWwgZmlsZSB3aXRoIGVjbGlwc2VsaW5rIG9ybSBjb250ZW50IHR5cGUKLQkJY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGVXaXRoRWNsaXBzZUxpbmtDb250ZW50VHlwZSgpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkKLQkJCi0JCS8vZGVsZXRlIHRoZSBvcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJCi0JCS8vYWRkIHRoZSBvcm0ueG1sIGZpbGUgdGhpcyB0aW1lIHdpdGggb3JtIGNvbnRlbnQgdHlwZQotCQljcmVhdGVEZWZhdWx0T3JtWG1sRmlsZSgpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkvL2FkZCB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCAxLjEgZmlsZQotCQljcmVhdGVEZWZhdWx0RWNsaXBzZUxpbmsxXzFPcm1YbWxGaWxlKCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzFfUkVTT1VSQ0VfVFlQRSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCQotCQkvL2RlbGV0ZSB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBjb25maWcgPQotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT05UQUlORVJfUEFUSCwgCi0JCQkJZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYy9NRVRBLUlORiIpLmdldEZ1bGxQYXRoKCkpOwotCQljb25maWcuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0T3JtWG1sRmlsZVdpdGhFY2xpcHNlTGlua0NvbnRlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgY29uZmlnID0KLQkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT05UQUlORVJfUEFUSCwgCi0JCQkJZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYy9NRVRBLUlORiIpLmdldEZ1bGxQYXRoKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX05BTUUsIAotCQkJCUpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC5sYXN0U2VnbWVudCgpKTsKLQkJY29uZmlnLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsIG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGVXaXRoRWNsaXBzZUxpbmsxXzFDb250ZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFY2xpcHNlTGluazFfMU9ybVhtbEZpbGUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILmxhc3RTZWdtZW50KCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdEVjbGlwc2VMaW5rMV8xT3JtWG1sRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFY2xpcHNlTGluazFfMU9ybVhtbEZpbGUoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgubGFzdFNlZ21lbnQoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFY2xpcHNlTGluazFfMU9ybVhtbEZpbGUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBjb25maWcgPQotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QQVRILCAKLQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjL01FVEEtSU5GIikuZ2V0RnVsbFBhdGgoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfTkFNRSwgZmlsZU5hbWUpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5WRVJTSU9OLCBFY2xpcHNlTGluazFfMS5TQ0hFTUFfVkVSU0lPTik7Ci0JCWNvbmZpZy5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZ0ZpbGVSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCS8vYWRkIHRoZSBlY2xpcHNlbGluay1vcm0ueG1sIDEuMSBmaWxlCi0JCWNyZWF0ZURlZmF1bHRFY2xpcHNlTGluazFfMU9ybVhtbEZpbGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRIKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzFfUkVTT1VSQ0VfVFlQRSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCS8vZGVsZXRlIHRoZSBlY2xpcHNlbGluay1vcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXRNYXBwaW5nRmlsZVJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERpZmZlcmVudGx5TmFtZWRNYXBwaW5nRmlsZVJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCi0JCS8vY3JlYXRlIHRoZSBvcm0yLnhtbCBmaWxlCi0JCWNyZWF0ZUVjbGlwc2VMaW5rMV8xT3JtWG1sRmlsZSgib3JtMi54bWwiKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKCJNRVRBLUlORi9vcm0yLnhtbCIpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzFfUkVTT1VSQ0VfVFlQRSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0yLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtMi54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldE1hcHBpbmdGaWxlUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJLy9hZGQgdGhlIG9ybTIueG1sIGZpbGUgYmFjawotCQljcmVhdGVFY2xpcHNlTGluazFfMU9ybVhtbEZpbGUoIm9ybTIueG1sIik7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8xX1JFU09VUkNFX1RZUEUsIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtMi54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMV8yQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMV8yQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlkMGZkMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGluazFfMkNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5wbGF0Zm9ybS5FY2xpcHNlTGlua1BsYXRmb3JtOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmsxXzJDb250ZXh0TW9kZWxUZXN0Q2FzZSBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUEFfQU5OT1RBVElPTlNfUEFDS0FHRV9OQU1FID0gImphdmF4LnBlcnNpc3RlbmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rMV8yQ29udGV4dE1vZGVsVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIGdldEpwYVBsYXRmb3JtRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMV8yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMV8ySnBhUHJvamVjdFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGluazFfMkpwYVByb2plY3RUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzI3MjI1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMV8ySnBhUHJvamVjdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuSnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua0pwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5wbGF0Zm9ybS5FY2xpcHNlTGlua1BsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMi5FY2xpcHNlTGluazFfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMkpwYVByb2plY3RUZXN0cyAKLQlleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rMV8ySnBhUHJvamVjdFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIGdldEpwYVBsYXRmb3JtRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAgRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzFfMjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtKcGFQcm9qZWN0KSBzdXBlci5nZXRKcGFQcm9qZWN0KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7CQotCQkKLQkJLy9kZWxldGUgdGhlIG9ybS54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpCi0JCXJlc291cmNlLmRlbGV0ZShudWxsKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkvL2FkZCB0aGUgb3JtLnhtbCBmaWxlIHdpdGggZWNsaXBzZWxpbmsgMS4yIG9ybSBjb250ZW50IHR5cGUKLQkJY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGVXaXRoRWNsaXBzZUxpbmsxXzJDb250ZW50VHlwZSgpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMl9SRVNPVVJDRV9UWVBFLCByZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkKLQkJCi0JCS8vZGVsZXRlIHRoZSBvcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJCi0JCS8vYWRkIHRoZSBvcm0ueG1sIGZpbGUgd2l0aCBlY2xpcHNlbGluayBvcm0gY29udGVudCB0eXBlCi0JCWNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlV2l0aEVjbGlwc2VMaW5rQ29udGVudFR5cGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCQotCQkvL2FkZCB0aGUgb3JtLnhtbCBmaWxlIHRoaXMgdGltZSB3aXRoIG9ybSBjb250ZW50IHR5cGUKLQkJY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJLy9hZGQgdGhlIGVjbGlwc2VsaW5rLW9ybS54bWwgMS4yIGZpbGUKLQkJY3JlYXRlRGVmYXVsdEVjbGlwc2VMaW5rMV8yT3JtWG1sRmlsZSgpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8yX1JFU09VUkNFX1RZUEUsIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvZWNsaXBzZWxpbmstb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkKLQkJLy9kZWxldGUgdGhlIGVjbGlwc2VsaW5rLW9ybS54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpCi0JCXJlc291cmNlLmRlbGV0ZShudWxsKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgY29uZmlnID0KLQkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEFJTkVSX1BBVEgsIAotCQkJCWdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJzcmMvTUVUQS1JTkYiKS5nZXRGdWxsUGF0aCgpKTsKLQkJY29uZmlnLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsIG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGVXaXRoRWNsaXBzZUxpbmtDb250ZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGNvbmZpZyA9Ci0JCQlEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEFJTkVSX1BBVEgsIAotCQkJCWdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJzcmMvTUVUQS1JTkYiKS5nZXRGdWxsUGF0aCgpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9OQU1FLCAKLQkJCQlKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgubGFzdFNlZ21lbnQoKSk7Ci0JCWNvbmZpZy5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlV2l0aEVjbGlwc2VMaW5rMV8yQ29udGVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRWNsaXBzZUxpbmsxXzJPcm1YbWxGaWxlKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC5sYXN0U2VnbWVudCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRFY2xpcHNlTGluazFfMk9ybVhtbEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRWNsaXBzZUxpbmsxXzJPcm1YbWxGaWxlKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRILmxhc3RTZWdtZW50KCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRWNsaXBzZUxpbmsxXzJPcm1YbWxGaWxlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgY29uZmlnID0KLQkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT05UQUlORVJfUEFUSCwgCi0JCQkJZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYy9NRVRBLUlORiIpLmdldEZ1bGxQYXRoKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX05BTUUsIGZpbGVOYW1lKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KEpwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuVkVSU0lPTiwgRWNsaXBzZUxpbmsxXzIuU0NIRU1BX1ZFUlNJT04pOwotCQljb25maWcuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdGaWxlUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRIKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkvL2FkZCB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCAxLjIgZmlsZQotCQljcmVhdGVEZWZhdWx0RWNsaXBzZUxpbmsxXzJPcm1YbWxGaWxlKCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX1JVTlRJTUVfUEFUSCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8yX1JFU09VUkNFX1RZUEUsIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvZWNsaXBzZWxpbmstb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkvL2RlbGV0ZSB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0TWFwcGluZ0ZpbGVSZXNvdXJjZSgpCi0JCXJlc291cmNlLmRlbGV0ZShudWxsKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRIKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREaWZmZXJlbnRseU5hbWVkTWFwcGluZ0ZpbGVSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UobmV3IFBhdGgoIk1FVEEtSU5GL29ybTIueG1sIikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQotCQkvL2NyZWF0ZSB0aGUgb3JtMi54bWwgZmlsZQotCQljcmVhdGVFY2xpcHNlTGluazFfMk9ybVhtbEZpbGUoIm9ybTIueG1sIik7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8yX1JFU09VUkNFX1RZUEUsIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtMi54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkKLQkJLy9kZWxldGUgdGhlIG9ybTIueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXRNYXBwaW5nRmlsZVJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UobmV3IFBhdGgoIk1FVEEtSU5GL29ybTIueG1sIikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCS8vYWRkIHRoZSBvcm0yLnhtbCBmaWxlIGJhY2sKLQkJY3JlYXRlRWNsaXBzZUxpbmsxXzJPcm1YbWxGaWxlKCJvcm0yLnhtbCIpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UobmV3IFBhdGgoIk1FVEEtSU5GL29ybTIueG1sIikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMl9SRVNPVVJDRV9UWVBFLCByZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybTIueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOTY3OTYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnBsYXRmb3JtLkVjbGlwc2VMaW5rUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rMl8wOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZSBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEpwYUZhY2V0VmVyc2lvblN0cmluZygpIHsKLQkJcmV0dXJuIEpwYUZhY2V0LlZFUlNJT05fMl8wLmdldFZlcnNpb25TdHJpbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXRKcGFQbGF0Zm9ybURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzJfMDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVjbGlwc2VMaW5rU2NoZW1hVmVyc2lvbigpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rMl8wLlNDSEVNQV9WRVJTSU9OOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMl8xQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMl8xQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkNTYxZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGluazJfMUNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnBsYXRmb3JtLkVjbGlwc2VMaW5rUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmsyXzFDb250ZXh0TW9kZWxUZXN0Q2FzZSBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsyXzFDb250ZXh0TW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEpwYUZhY2V0VmVyc2lvblN0cmluZygpIHsKLQkJcmV0dXJuIEpwYUZhY2V0LlZFUlNJT05fMl8wLmdldFZlcnNpb25TdHJpbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXRKcGFQbGF0Zm9ybURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzJfMTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVjbGlwc2VMaW5rU2NoZW1hVmVyc2lvbigpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rMl8xLlNDSEVNQV9WRVJTSU9OOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMl8yQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMl8yQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNmYmIwZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGluazJfMkNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnBsYXRmb3JtLkVjbGlwc2VMaW5rUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rMl8yOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmsyXzJDb250ZXh0TW9kZWxUZXN0Q2FzZSBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsyXzJDb250ZXh0TW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEpwYUZhY2V0VmVyc2lvblN0cmluZygpIHsKLQkJcmV0dXJuIEpwYUZhY2V0LlZFUlNJT05fMl8wLmdldFZlcnNpb25TdHJpbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXRKcGFQbGF0Zm9ybURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzJfMjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVjbGlwc2VMaW5rU2NoZW1hVmVyc2lvbigpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rMl8yLlNDSEVNQV9WRVJTSU9OOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMl8zQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMl8zQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ2ZWZlOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGluazJfM0NvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnBsYXRmb3JtLkVjbGlwc2VMaW5rUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLkVjbGlwc2VMaW5rMl8zOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmsyXzNDb250ZXh0TW9kZWxUZXN0Q2FzZSBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsyXzNDb250ZXh0TW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEpwYUZhY2V0VmVyc2lvblN0cmluZygpIHsKLQkJcmV0dXJuIEpwYUZhY2V0LlZFUlNJT05fMl8wLmdldFZlcnNpb25TdHJpbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXRKcGFQbGF0Zm9ybURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzJfMzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVjbGlwc2VMaW5rU2NoZW1hVmVyc2lvbigpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rMl8zLlNDSEVNQV9WRVJTSU9OOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlYTY3Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuSnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua0pwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5wbGF0Zm9ybS5FY2xpcHNlTGlua1BsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotCWV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgZWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZTsKLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuZWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSA9IG51bGw7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0IGJ1aWxkSnBhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkLCBJRGF0YU1vZGVsIGpwYUNvbmZpZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RKcGFQcm9qZWN0IHRlc3RKcGFQcm9qZWN0ID0gc3VwZXIuYnVpbGRKcGFQcm9qZWN0KHByb2plY3ROYW1lLCBhdXRvQnVpbGQsIGpwYUNvbmZpZyk7Ci0KLQkJaWYgKGNyZWF0ZUVjbGlwc2VMaW5rT3JtWG1sKCkpIHsKLQkJCUVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uIG9wZXJhdGlvbiA9IAotCQkJCW5ldyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbihidWlsZEVjbGlwc2VMaW5rT3JtQ29uZmlnKHRlc3RKcGFQcm9qZWN0KSk7Ci0JCQlvcGVyYXRpb24uZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJfQotCi0JCXJldHVybiB0ZXN0SnBhUHJvamVjdDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGVPcm1YbWwoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGVFY2xpcHNlTGlua09ybVhtbCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgYnVpbGRFY2xpcHNlTGlua09ybUNvbmZpZyhUZXN0SnBhUHJvamVjdCB0ZXN0SnBhUHJvamVjdCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IAotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7CQkKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEFJTkVSX1BBVEgsIAotCQkJCXRlc3RKcGFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYy9NRVRBLUlORiIpLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlZFUlNJT04sIHRoaXMuZ2V0RWNsaXBzZUxpbmtTY2hlbWFWZXJzaW9uKCkpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fUEVSU0lTVEVOQ0VfVU5JVCwgQm9vbGVhbi5UUlVFKTsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVjbGlwc2VMaW5rU2NoZW1hVmVyc2lvbigpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLlNDSEVNQV9WRVJTSU9OOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIGdldEpwYVBsYXRmb3JtRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAgRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzFfMDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtKcGFQcm9qZWN0KSBzdXBlci5nZXRKcGFQcm9qZWN0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0VudGl0eSBnZXRKYXZhRW50aXR5KCkgewotCQlyZXR1cm4gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlIGdldEphdmFFbWJlZGRhYmxlKCkgewotCQlyZXR1cm4gKEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgZ2V0SmF2YU1hcHBlZFN1cGVyY2xhc3MoKSB7Ci0JCXJldHVybiAoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFYbWxSZXNvdXJjZSBnZXRPcm1YbWxSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuZWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sRW50aXR5TWFwcGluZ3MgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoWG1sRW50aXR5TWFwcGluZ3MpIHN1cGVyLmdldFhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZ2V0RW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncykgc3VwZXIuZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGlua0pwYVByb2plY3RUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtKcGFQcm9qZWN0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkNTE1NC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGlua0pwYVByb2plY3RUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5KcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnBsYXRmb3JtLkVjbGlwc2VMaW5rUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKcGFQcm9qZWN0VGVzdHMKLQlleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rSnBhUHJvamVjdFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGNyZWF0ZU9ybVhtbCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0SnBhUGxhdGZvcm1EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICBFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMV8wOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0pwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua0pwYVByb2plY3QpIHN1cGVyLmdldEpwYVByb2plY3QoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsJCi0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCS8vYWRkIHRoZSBvcm0ueG1sIGZpbGUgd2l0aCBlY2xpcHNlbGluayBvcm0gY29udGVudCB0eXBlCi0JCWNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlV2l0aEVjbGlwc2VMaW5rQ29udGVudFR5cGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCQotCQkvL2FkZCB0aGUgb3JtLnhtbCBmaWxlIHRoaXMgdGltZSB3aXRoIG9ybSBjb250ZW50IHR5cGUKLQkJY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJLy9hZGQgdGhlIGVjbGlwc2VsaW5rLW9ybS54bWwgZmlsZQotCQljcmVhdGVEZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxGaWxlKCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCQotCQkvL2RlbGV0ZSB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBjb25maWcgPQotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT05UQUlORVJfUEFUSCwgCi0JCQkJZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYy9NRVRBLUlORiIpLmdldEZ1bGxQYXRoKCkpOwotCQljb25maWcuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0T3JtWG1sRmlsZVdpdGhFY2xpcHNlTGlua0NvbnRlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVjbGlwc2VMaW5rT3JtWG1sRmlsZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgubGFzdFNlZ21lbnQoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVjbGlwc2VMaW5rT3JtWG1sRmlsZShKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX1JVTlRJTUVfUEFUSC5sYXN0U2VnbWVudCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVjbGlwc2VMaW5rT3JtWG1sRmlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGNvbmZpZyA9Ci0JCQlEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEFJTkVSX1BBVEgsIAotCQkJCWdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJzcmMvTUVUQS1JTkYiKS5nZXRGdWxsUGF0aCgpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9OQU1FLCBmaWxlTmFtZSk7Ci0JCWNvbmZpZy5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdGaWxlUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRIKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkvL2FkZCB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCBmaWxlCi0JCWNyZWF0ZURlZmF1bHRFY2xpcHNlTGlua09ybVhtbEZpbGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRIKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCS8vZGVsZXRlIHRoZSBlY2xpcHNlbGluay1vcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXRNYXBwaW5nRmlsZVJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERpZmZlcmVudGx5TmFtZWRNYXBwaW5nRmlsZVJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCi0JCS8vY3JlYXRlIHRoZSBvcm0yLnhtbCBmaWxlCi0JCWNyZWF0ZUVjbGlwc2VMaW5rT3JtWG1sRmlsZSgib3JtMi54bWwiKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKCJNRVRBLUlORi9vcm0yLnhtbCIpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0yLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtMi54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldE1hcHBpbmdGaWxlUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJLy9hZGQgdGhlIG9ybTIueG1sIGZpbGUgYmFjawotCQljcmVhdGVFY2xpcHNlTGlua09ybVhtbEZpbGUoIm9ybTIueG1sIik7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtMi54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdEpwYUVjbGlwc2VMaW5rQ29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcHRKcGFFY2xpcHNlTGlua0NvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDA3MTMxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdEpwYUVjbGlwc2VMaW5rQ29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmEuSnB0RWNsaXBzZUxpbmtDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybS5KcHRFY2xpcHNlTGlua0NvcmVPcm1Db250ZXh0TW9kZWxUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5KcHRFY2xpcHNlTGlua0NvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzOwotCi0vKioKLSAqIFJlcXVpcmVkIEphdmEgc3lzdGVtIHByb3BlcnR5OgotICogICAgLURvcmcuZWNsaXBzZS5qcHQuanBhLmphcj08anBhLmphciBwYXRoPgotICogICAgLURvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuamFyPTxlY2xpcHNlbGluay5qYXIgcGF0aD4KLSAqLwotcHVibGljIGNsYXNzIEpwdEpwYUVjbGlwc2VMaW5rQ29yZUNvbnRleHRNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0SnBhRWNsaXBzZUxpbmtDb3JlQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYoSnB0SnBhRWNsaXBzZUxpbmtDb3JlVGVzdHMucmVxdWlyZWRKYXJzRXhpc3RzKCkpIHsKLQkJCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0pwYVByb2plY3RUZXN0cy5jbGFzcyk7Ci0JCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsxXzFKcGFQcm9qZWN0VGVzdHMuY2xhc3MpOwotCQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMV8ySnBhUHJvamVjdFRlc3RzLmNsYXNzKTsKLQkJCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmtDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmtDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua0NvcmVPcm1Db250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXN1aXRlLmFkZFRlc3QoVGVzdFN1aXRlLndhcm5pbmcoSnB0SnBhRWNsaXBzZUxpbmtDb3JlVGVzdHMuYnVpbGRNaXNzaW5nSmFyRXJyb3JNZXNzYWdlKCkpKTsKLQkJfQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRKcGFFY2xpcHNlTGlua0NvcmVDb250ZXh0TW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFDb2xsZWN0aW9uVGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFDb2xsZWN0aW9uVGFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWQ1NzZhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhQ29sbGVjdGlvblRhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSmF2YUNvbGxlY3Rpb25UYWJsZVRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazJfMEphdmFDb2xsZWN0aW9uVGFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHByb2plY3RzOyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VDb2xsZWN0aW9uVGFibGUpOwotCQkKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLnNldE5hbWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0TmFtZSgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUzID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQ29sbGVjdGlvblRhYmxlMyk7Ci0JCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQljb2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlMyA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlMy5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9wcm9qZWN0cyIsIGNvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCS8vYWRkIHRoZSBjb2xsZWN0aW9uIHRhYmxlIGFubm90YXRpb24sIHZlcmlmeSBkZWZhdWx0IGNvbGxlY3Rpb24gdGFibGUgbmFtZSBpcyB0aGUgc2FtZQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9wcm9qZWN0cyIsIGNvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCS8vc2V0IHRoZSBlbnRpdHkgbmFtZSwgdmVyaWZ5IGRlZmF1bHQgY29sbGVjdGlvbiB0YWJsZSBuYW1lIHVwZGF0ZXMKLQkJZ2V0SmF2YUVudGl0eSgpLnNldFNwZWNpZmllZE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvb19wcm9qZWN0cyIsIGNvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VDb2xsZWN0aW9uVGFibGUpOwotCQkKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuc2V0U2NoZW1hKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRTY2hlbWEoKSk7Ci0JCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5zZXRTY2hlbWEobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuc2V0U2NoZW1hKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRTY2hlbWEoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQ29sbGVjdGlvblRhYmxlKTsKLQkKLQkJLy9zZXQgc2NoZW1hIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJY29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgiZm9vIik7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQkvL3NldCBzY2hlbWEgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQljb2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSk7Ci0JCQotCQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuc2V0Q2F0YWxvZygiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldENhdGFsb2coKSk7Ci0JCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuc2V0Q2F0YWxvZyhudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLnNldENhdGFsb2coIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRDYXRhbG9nKCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSk7Ci0JCi0JCS8vc2V0IGNhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQljb2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZygiZm9vIik7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQljb2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQkJCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIGpvaW5UYWJsZVJlc291cmNlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbjIgPSBjb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQkKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IGNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCWNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIGpvaW5UYWJsZVJlc291cmNlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQljb2xsZWN0aW9uVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQotCQljb2xsZWN0aW9uVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbGxlY3Rpb25UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJY29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlUmVzb3VyY2UgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCQotCQljb2xsZWN0aW9uVGFibGUubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQljb2xsZWN0aW9uVGFibGUubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlUmVzb3VyY2UgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkKLQkJam9pblRhYmxlUmVzb3VyY2UuYWRkSm9pbkNvbHVtbigwKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuYWRkSm9pbkNvbHVtbigxKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuYWRkSm9pbkNvbHVtbigyKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5zZXROYW1lKCJGT08iKTsKLQkJam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLnNldE5hbWUoIkJBUiIpOwotCQlqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQotCQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLm1vdmVKb2luQ29sdW1uKDIsIDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5tb3ZlSm9pbkNvbHVtbigwLCAxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlUmVzb3VyY2UucmVtb3ZlSm9pbkNvbHVtbigxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlUmVzb3VyY2UucmVtb3ZlSm9pbkNvbHVtbigxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLnJlbW92ZUpvaW5Db2x1bW4oMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJLy9UT0RPCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCWNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCWNvbGxlY3Rpb25UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWpvaW5UYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJmb28iKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RnZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgIGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWpvaW5UYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJmb28iKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgImJhciIpOwotCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsICBjb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQotCQljb2xsZWN0aW9uVGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gam9pblRhYmxlQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQkKLQkJY29sbGVjdGlvblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IGpvaW5UYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwkJCi0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0KLQkJCi0JCWNvbGxlY3Rpb25UYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSBqb2luVGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJCi0JCWNvbGxlY3Rpb25UYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSBqb2luVGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQotCi0JCWNvbGxlY3Rpb25UYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IGpvaW5UYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCi0JCWpvaW5UYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoIkJBUiIpOwotCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZUFubm90YXRpb24ubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZUFubm90YXRpb24ubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZUFubm90YXRpb24ucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVBbm5vdGF0aW9uLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYjQyYWIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2VFbnVtZXJhdGVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNlVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJDb2x1bW4yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlcmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5FbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDbGFzczJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERBQkxFX1RZUEVfTkFNRSA9ICJBZGRyZXNzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBFTUJFRERBQkxFX1RZUEVfTkFNRTsKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nV2l0aENvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiY2xhc3MtaW5zdGFuY2VcIikiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljQmFzaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPFN0cmluZz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE5vbkdlbmVyaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uIGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxJbnRlZ2VyLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBhYmJyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlBbmRWYWx1ZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxBZGRyZXNzLCBQcm9wZXJ0eUluZm8+IHBhcmNlbHM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVQcm9wZXJ0eUluZm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJvcGVydHlJbmZvIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgSW50ZWdlciBwYXJjZWxOdW1iZXI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgSW50ZWdlciBzaXplOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEubWF0aC5CaWdEZWNpbWFsIHRheDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcm9wZXJ0eUluZm8uamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlbGZSZWZlcmVudGlhbEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJGb28iKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5MaXN0PEZvbz4gZWxlbWVudENvbGxlY3Rpb247IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRm9vLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGluazJfMEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uIGVsZW1lbnRDb2xsZWN0aW9uQW5ub3RhdGlvbiA9IChFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uQW5ub3RhdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGNsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbkFubm90YXRpb24uc2V0VGFyZ2V0Q2xhc3MoIm5ld1RhcmdldENsYXNzIik7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0Q2xhc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0Q2xhc3MiLCBlbGVtZW50Q29sbGVjdGlvbkFubm90YXRpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBjbGFzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbGVtZW50Q29sbGVjdGlvbkFubm90YXRpb24uc2V0VGFyZ2V0Q2xhc3MobnVsbCk7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uQW5ub3RhdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFRhcmdldENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoIm5ld1RhcmdldENsYXNzIik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0Q2xhc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0Q2xhc3MiLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQkKLQkJLy9zZXQgdGFyZ2V0IGNsYXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCS8vdGFyZ2V0RW50aXR5IG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCwgZGVmYXVsdCBzdGlsbCBzZXQsIGhhbmRsZWQgYnkgdmFsaWRhdGlvbgotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRUYXJnZXRDbGFzcygpKTsKLQkJCi0JCS8vYWRkIHRhcmdldEVudGl0eSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSk7Ci0KLQkJLy90ZXN0IGRlZmF1bHQgc3RpbGwgdGhlIHNhbWUgd2hlbiBzcGVjaWZpZWQgdGFyZ2V0IGVudGl0eSBpdCBzZXQKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGFkZHJlc3NDbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBhZGRyZXNzQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0KLQkJLy90ZXN0IHRhcmdldCBpcyBub3QgYW4gRW1iZWRkYWJsZSwgZGVmYXVsdCB0YXJnZXQgZW50aXR5IHN0aWxsIGV4aXN0cywgdGhpcyBjYXNlIGhhbmRsZWQgd2l0aCB2YWxpZGF0aW9uCi0JCWFkZHJlc3NQZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldENsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRhcmdldENsYXNzTm9uR2VuZXJpY0NvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOb25HZW5lcmljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRUYXJnZXRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRDbGFzc0dlbmVyaWNDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRDbGFzc05vbkdlbmVyaWNNYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldENsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRhcmdldENsYXNzR2VuZXJpY01hcCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRUYXJnZXRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRhcmdldENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRUYXJnZXRDbGFzcygpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRUYXJnZXRDbGFzcygpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRUYXJnZXRDbGFzcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW1iZWRkYWJsZSBnZXRSZXNvbHZlZFRhcmdldEVtYmVkZGFibGUoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG1hcHBpbmcpIHsKLQkJcmV0dXJuIChFbWJlZGRhYmxlKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChtYXBwaW5nLCAiZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlZFRhcmdldEVtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCS8vdGFyZ2V0IGVtYmVkZGFibGUgbm90IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0JCWFzc2VydE51bGwodGhpcy5nZXRSZXNvbHZlZFRhcmdldEVtYmVkZGFibGUoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKSk7Ci0JCQotCQkvL2FkZCB0YXJnZXQgZW1iZWRkYWJsZSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCwgbm93IHRhcmdldCBlbWJlZGRhYmxlIHNob3VsZCByZXNvbHZlCi0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBhZGRyZXNzQ2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQlUeXBlTWFwcGluZyBhZGRyZXNzVHlwZU1hcHBpbmcgPSBhZGRyZXNzQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoYWRkcmVzc1R5cGVNYXBwaW5nLCB0aGlzLmdldFJlc29sdmVkVGFyZ2V0RW1iZWRkYWJsZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcpKTsKLQotCQkvL3Rlc3QgZGVmYXVsdCBzdGlsbCB0aGUgc2FtZSB3aGVuIHNwZWNpZmllZCB0YXJnZXQgZW50aXR5IGl0IHNldAotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoImZvbyIpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZykpOwotCQkKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKGFkZHJlc3NUeXBlTWFwcGluZywgdGhpcy5nZXRSZXNvbHZlZFRhcmdldEVtYmVkZGFibGUoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKSk7Ci0JCQotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGFkZHJlc3NUeXBlTWFwcGluZywgdGhpcy5nZXRSZXNvbHZlZFRhcmdldEVtYmVkZGFibGUoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlZFRhcmdldEVtYmVkZGFibGVXaXRoQmFzaWNUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJLy90YXJnZXQgaXMgYSBiYXNpYyB0eXBlLCBzbyByZXNvbHZlZCB0YXJnZXQgZW1iZWRkYWJsZSBpcyBudWxsCi0JCWFzc2VydE51bGwodGhpcy5nZXRSZXNvbHZlZFRhcmdldEVtYmVkZGFibGUoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJCQkKLQkJLy9zZXQgZmV0Y2ggaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5FQUdFUik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkVBR0VSLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldEZldGNoKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IChFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5FQUdFUiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQkKLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVUeXBlRW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuVHlwZS5FTUJFRERBQkxFX1RZUEUsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZVR5cGVOb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTm9uR2VuZXJpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGUuTk9fVFlQRSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlVHlwZSgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygiQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGUuRU1CRUREQUJMRV9UWVBFLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVUeXBlQmFzaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljQmFzaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlLkJBU0lDX1RZUEUsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCU1hcEtleUFubm90YXRpb24gbWFwS2V5ID0gKE1hcEtleUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwobWFwS2V5KTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hcEtleS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFwS2V5LmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYXBLZXkuc2V0TmFtZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXkuZ2V0TmFtZSgpKTsKLQkJCi0JCW1hcEtleS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJteU1hcEtleSIpOwotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleUFubm90YXRpb24gPSAoTWFwS2V5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYXBLZXlBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJbWFwS2V5QW5ub3RhdGlvbiA9IChNYXBLZXlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG1hcEtleUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IAotCQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoIkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJTdHJpbmciKTsKLQkJbWFwS2V5TmFtZXMgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIG1hcEtleUNsYXNzQW5ub3RhdGlvbiA9IChNYXBLZXlDbGFzczJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBLZXlDbGFzc0Fubm90YXRpb24pOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFwS2V5Q2xhc3NBbm5vdGF0aW9uLnNldFZhbHVlKCJteU1hcEtleUNsYXNzIik7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXlDbGFzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleUNsYXNzIiwgbWFwS2V5Q2xhc3NBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFwS2V5Q2xhc3NBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG1hcEtleUNsYXNzQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCW1hcEtleUNsYXNzQW5ub3RhdGlvbi5zZXRWYWx1ZSgibXlNYXBLZXlDbGFzcyIpOwotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiU3RyaW5nIik7Ci0JCU1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbiBtYXBLZXlDbGFzcyA9IChNYXBLZXlDbGFzczJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgbWFwS2V5Q2xhc3MuZ2V0VmFsdWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0KLQkJLy90ZXN0IGRlZmF1bHQgc3RpbGwgdGhlIHNhbWUgd2hlbiBzcGVjaWZpZWQgdGFyZ2V0IGVudGl0eSBpdCBzZXQKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TWFwS2V5Q2xhc3NDb2xsZWN0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPcmRlckNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlPcmRlcmFibGUyXzAgb3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCQotCQlvcmRlcmFibGUuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJT3JkZXJDb2x1bW4yXzAgb3JkZXJDb2x1bW4gPSBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19PUkRFUiIsIG9yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCW9yZGVyQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIHJlc291cmNlRmllbGQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArIl9hZGRyZXNzZXMiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgY2l0eU1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBlbWJlZGRhYmxlLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImNpdHkiKS5nZXRNYXBwaW5nKCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgcmVzb3VyY2VGaWVsZC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShudWxsKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyJfYWRkcmVzc2VzIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhbm5vdGF0aW9uLnNldE5hbWUoImNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyg2LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyg2LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJzdGF0ZS5uYW1lIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkJCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8PyBleHRlbmRzIFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigxLCAwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCi0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlQZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlFbWJlZGRlZE1hcHBpbmcgbmVzdGVkRW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJzdGF0ZSIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbmVzdGVkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBuZXN0ZWRFbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gbmVzdGVkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWJiciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJUGVyc2lzdGVudFR5cGUgc3RhdGVQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUJhc2ljTWFwcGluZyBhYmJyTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHN0YXRlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFiYnIiKS5nZXRNYXBwaW5nKCk7Ci0JCWFiYnJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUgiKTsKLQkJYWJick1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEUiKTsKLQkJYWJick1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJYWJick1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYWJick1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJYWJick1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFiYnJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJYWJick1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQotCQkvL2NoZWNrIHRoZSBuZXN0ZWQgZW1iZWRkZWQgKEFkZHJlc3Muc3RhdGUpIGF0dHJpYnV0ZSBvdmVycmlkZSB0byB2ZXJpZnkgaXQgaXMgZ2V0dGluZyBzZXR0aW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgY29sdW1uIG9uIFN0YXRlLmFiYnIKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKChFbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgic3RhdGUiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0T3ZlcnJpZGVOYW1lZCgiYWJiciIpOwotCQlhc3NlcnRFcXVhbHMoImFiYnIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBLZXlDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL2NvbGxlY3Rpb24gdGFibGUgbmFtZQotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9DT0xMRUNUSU9OX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfQ09MTEVDVElPTl9UQUJMRSIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQkJY29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleUFuZFZhbHVlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInZhbHVlLkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkxBSCIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkxBSCIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleUFuZFZhbHVlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxzIiwgcmVzb3VyY2VGaWVsZC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX3BhcmNlbHMiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlFbWJlZGRhYmxlIGFkZHJlc3NFbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGNpdHlNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgYWRkcmVzc0VtYmVkZGFibGUuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiY2l0eSIpLmdldE1hcHBpbmcoKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxzIiwgcmVzb3VyY2VGaWVsZC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUobnVsbCk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX3BhcmNlbHMiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFubm90YXRpb24uc2V0TmFtZSgia2V5LmNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygzLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX3BhcmNlbHMiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJRW1iZWRkYWJsZSBwcm9wZXJ0eUluZm9FbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJQmFzaWNNYXBwaW5nIHBhcmNlbE51bWJlck1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwcm9wZXJ0eUluZm9FbWJlZGRhYmxlLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbE51bWJlciIpLmdldE1hcHBpbmcoKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08xIik7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUjEiKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGMSIpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInBhcmNlbHMiLCByZXNvdXJjZUZpZWxkLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxOdW1iZXIiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08xIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSMSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGMSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShudWxsKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUobnVsbCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKG51bGwpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihudWxsKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShudWxsKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX3BhcmNlbHMiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJ2YWx1ZS5wYXJjZWxOdW1iZXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlBbmRWYWx1ZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygwLCB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFSIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5GT08yIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygyLCB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleUFuZFZhbHVlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFSIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5GT08yIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyg1LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyg1LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlBbmRWYWx1ZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5jaXR5Iik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5wYXJjZWxOdW1iZXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygzLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LnN0YXRlLm5hbWUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInNpemUiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygyLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlQXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleUFuZFZhbHVlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkJCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQl2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQl2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInZhbHVlLnBhcmNlbE51bWJlciIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5jaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuc2l6ZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5zdGF0ZS5uYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLnNpemUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuc3RhdGUubmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQl2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8PyBleHRlbmRzIFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzaXplIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0YXgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZU1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlBbmRWYWx1ZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCXZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQl2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRPdmVycmlkZXMgPSB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInNpemUiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRFcXVhbHMoInZhbHVlLnNpemUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5wYXJjZWxOdW1iZXIiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5zdGF0ZS5uYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkT3ZlcnJpZGVzID0gdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInNpemUiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXNwZWNpZmllZE92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDMsIDIsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRFcXVhbHMoInZhbHVlLnNpemUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5wYXJjZWxOdW1iZXIiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuc3RhdGUubmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5jaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkT3ZlcnJpZGVzID0gdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInNpemUiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXNwZWNpZmllZE92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNlbGZSZWZlcmVudGlhbEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVNlbGZSZWZlcmVudGlhbEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuRm9vIik7Ci0JCQotCQkvL0lmIHRoZXJlIGlzIGEgU3RhY2tPdmVyZmxvd0Vycm9yIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGdldCB0aGUgbWFwcGluZwotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiZWxlbWVudENvbGxlY3Rpb24iKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRNYXBLZXlFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyLmNsYXNzKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uIGVudW1lcmF0ZWQgPSAoTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChlbnVtZXJhdGVkKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVudW1lcmF0ZWQuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKEVudW1UeXBlLlNUUklORyk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZS5TVFJJTkcsIGVudW1lcmF0ZWQuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRNYXBLZXlFbnVtZXJhdGVkVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbiBlbnVtZXJhdGVkID0gKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZW51bWVyYXRlZC5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZS5TVFJJTkcpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCQotCQllbnVtZXJhdGVkLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwS2V5VGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIoQmFzZVRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE5vdE51bGwodGVtcG9yYWwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlLlRJTUUsIHRlbXBvcmFsLmdldFZhbHVlKCkpOwotCQkKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBLZXlUZW1wb3JhbFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uIHRlbXBvcmFsID0gKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0ZW1wb3JhbC5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQl0ZW1wb3JhbC5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCgoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFNhbWUoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0MigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1dpdGhDb252ZXJ0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuQ0xBU1NfSU5TVEFOQ0VfQ09OVkVSVEVSLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcyk7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImZvbyIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbiBlY2xpcHNlbGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgZWNsaXBzZWxpbmtDb252ZXJ0LmdldFZhbHVlKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnRVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24gY29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0LnNldFZhbHVlKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJOYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRTYW1lKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhRW50aXR5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhRW50aXR5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg4ZjkwZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YUVudGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLk1hcHBpbmdLZXlzMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5DYWNoZWFibGUyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBKYXZhRW50aXR5VGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCX1RZUEVfTkFNRSA9ICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBTVUJfVFlQRV9OQU1FOwotCQotCQotCXB1YmxpYyBFY2xpcHNlTGluazJfMEphdmFFbnRpdHlUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBKUEEuT05FX1RPX09ORSwgSlBBLk1BTllfVE9fT05FLCBKUEEuT05FX1RPX01BTlksIEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgicHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSU5IRVJJVEFOQ0UsIEpQQS5JTkhFUklUQU5DRV9UWVBFLCBKUEEuT05FX1RPX09ORSwgSlBBLk1BTllfVE9fT05FLCBKUEEuT05FX1RPX01BTlksIEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpIik7Ci0JCQkJc2IuYXBwZW5kKCJhYnN0cmFjdCIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoInByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzNDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkN1c3RvbWVyICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQ3VzdG9tZXIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkN1c3RvbWVyICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkN1c3RvbWVyLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJMb25nVGltZUN1c3RvbWVyIGV4dGVuZHMgQ3VzdG9tZXIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkxvbmdUaW1lQ3VzdG9tZXIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk9ORV9UT19PTkUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RyZWV0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBaaXBDb2RlIHppcENvZGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJaaXBDb2RlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgcGx1c2ZvdXI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJaaXBDb2RlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5CQVNJQ19NQVBfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVFJBTlNGT1JNQVRJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVkFSSUFCTEVfT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGdldEphdmFFbnRpdHkoKS5nZXRPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQkKLQkJZ2V0SmF2YUVudGl0eSgpLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUyk7Ci0JCQotCQlvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzID0gZ2V0SmF2YUVudGl0eSgpLmdldE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQkKLQkJZ2V0SmF2YUVudGl0eSgpLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUyk7Ci0JCQotCQlvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzID0gZ2V0SmF2YUVudGl0eSgpLmdldE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlc1RhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGdldEphdmFFbnRpdHkoKS5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKEphdmFFbnRpdHkpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBhYnN0cmFjdEVudGl0eS5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uc1RhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gZ2V0SmF2YUVudGl0eSgpLmdldEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7Ci0JCQotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKEphdmFFbnRpdHkpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IGFic3RyYWN0RW50aXR5LmdldEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlc01hcHBlZFN1cGVyY2xhc3NJbk9ybVhtbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGdldEphdmFFbnRpdHkoKS5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzID0gZ2V0SmF2YUVudGl0eSgpLmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBqYXZhRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgaWRNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgbWFwcGVkU3VwZXJjbGFzcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlc0VudGl0eUhpZXJhY2h5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gamF2YUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgcmVzb3VyY2VUeXBlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQlKYXZhRW50aXR5IHN1cGVyY2xhc3MgPSAoSmF2YUVudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGlkTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHN1cGVyY2xhc3MuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgcmVzb3VyY2VUeXBlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJiYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkJCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlhc3NlcnRFcXVhbHMoMywgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YUF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUF0dHJpYnV0ZU92ZXJyaWRlcykpOwotCQkKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQotCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMCwgMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCX0KLS8vCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkKLQkJKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJGT08iKTsKLQkJKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDIsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQkKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMiwgMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLm1vdmVBbm5vdGF0aW9uKDAsIDEsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsICBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZUlzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQotCQlKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IGdldEphdmFFbnRpdHkoKS5nZXRPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcyA9IGdldEphdmFFbnRpdHkoKS5nZXRPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0vLwkvL1RPRE8gYWRkIGFsbCBtYXBwaW5nIHR5cGVzIHRvIHRoZSBtYXBwZWQgc3VwZXJjbGFzcyB0byB0ZXN0IHdoaWNoIG9uZXMgYXJlIG92ZXJyaWRhYmxlCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gZ2V0SmF2YUVudGl0eSgpLmdldEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uc01hcHBlZFN1cGVyY2xhc3NJbk9ybVhtbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gZ2V0SmF2YUVudGl0eSgpLmdldEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0KLQkJYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gKEphdmFFbnRpdHkpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gamF2YUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJLy9NYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkvL0Jhc2ljTWFwcGluZyBpZE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLnBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0vLwkJLy9UT0RPIGpvaW5Db2x1bW5zIGZvciBkZWZhdWx0IGFzc29jaWF0aW9uIG92ZXJyaWRlcwotLy8vLwlJSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IGRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwkKLS8vLy8KLS8vLy8JSU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChJTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotLy8vLwkKLS8vLy8JSU9uZVRvT25lTWFwcGluZyBhZGRyZXNzTWFwcGluZyA9IChJT25lVG9PbmVNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLnBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0vLy8vCUlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBhZGRyZXNzTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJCQVIiKTsKLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFaIik7Ci0vLy8vCQotLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgcmVzb3VyY2VUeXBlLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZS5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8JYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlcy5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8KLS8vLy8JYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKLS8vLy8JZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkJBWiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0vLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwotLy8vLwlkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwkKLS8vLy8JamF2YUVudGl0eS5hZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDApLnNldE5hbWUoImFkZHJlc3MiKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFubm90YXRpb24uc2V0TmFtZSgiYmFyIik7CQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWxUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkJCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCUl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcykpOwotCQkKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgxLCAwKTsKLQkJSXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQotCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgwLCAxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkKLQkJKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiRk9PIik7Ci0JCSgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOwotCQkoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigyLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQkKLQkJSXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigyLCAwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMCwgMSwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9ICBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSXNWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0IiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlMb25nVGltZUN1c3RvbWVyKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQ3VzdG9tZXIiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Mb25nVGltZUN1c3RvbWVyIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlQZXJzaXN0ZW50VHlwZSBjdXN0b21lclBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJUGVyc2lzdGVudFR5cGUgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsJCQotCQlQZXJzaXN0ZW50VHlwZSB6aXBDb2RlUGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChFbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Muc3RyZWV0IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUuemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxvbmdUaW1lQ3VzdG9tZXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQkKLQkJQmFzaWNNYXBwaW5nIHBsdXNGb3VyTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHppcENvZGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicGx1c2ZvdXIiKS5nZXRNYXBwaW5nKCk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRSIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJLy9jaGVjayB0aGUgdG9wLWxldmVsIGVtYmVkZGVkIChDdXN0b21lci5hZGRyZXNzKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IGl0IGlzIGdldHRpbmcgc2V0dGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvbiBaaXBjb2RlLnBsdXNmb3VyCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlTmFtZWQoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkvL3NldCBhbiBhdHRyaWJ1dGUgb3ZlcnJpZGUgb24gQWRkcmVzcy56aXBDb2RlIGVtYmVkZGVkIG1hcHBpbmcKLQkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSAoKFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgKChFbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRPdmVycmlkZU5hbWVkKCJwbHVzZm91ciIpKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSF9PVkVSUklERSIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRV9PVkVSUklERSIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVOYW1lZCgiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEVfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkvL1RPRE8gSSBoYXZlIHRoZSBkZWZhdWx0IHdyb25nIGluIHRoaXMgY2FzZSwgYnV0IHRoaXMgd2FzIHdyb25nIGJlZm9yZSBhcyB3ZWxsLiAgTmVlZCB0byBmaXggdGhpcyBsYXRlcgotLy8JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkN1c3RvbWVyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlMb25nVGltZUN1c3RvbWVyKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQ3VzdG9tZXIiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Mb25nVGltZUN1c3RvbWVyIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlQZXJzaXN0ZW50VHlwZSBjdXN0b21lclBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJUGVyc2lzdGVudFR5cGUgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsJCQotCQlQZXJzaXN0ZW50VHlwZSB6aXBDb2RlUGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg2LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdHJlZXQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5jaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS56aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMb25nVGltZUN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCQotCQlCYXNpY01hcHBpbmcgcGx1c0ZvdXJNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgemlwQ29kZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwbHVzZm91ciIpLmdldE1hcHBpbmcoKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUgiKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkvL2NoZWNrIHRoZSB0b3AtbGV2ZWwgZW1iZWRkZWQgKEN1c3RvbWVyLmFkZHJlc3MpIGF0dHJpYnV0ZSBvdmVycmlkZSB0byB2ZXJpZnkgaXQgaXMgZ2V0dGluZyBzZXR0aW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgY29sdW1uIG9uIFppcGNvZGUucGx1c2ZvdXIKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVOYW1lZCgiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCS8vc2V0IGFuIGF0dHJpYnV0ZSBvdmVycmlkZSBvbiBBZGRyZXNzLnppcENvZGUgZW1iZWRkZWQgbWFwcGluZwotCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9ICgoVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSAoKEVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlTmFtZWQoInBsdXNmb3VyIikpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIik7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZU5hbWVkKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRV9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCS8vVE9ETyBJIGhhdmUgdGhlIGRlZmF1bHQgd3JvbmcgaW4gdGhpcyBjYXNlLCBidXQgdGhpcyB3YXMgd3JvbmcgYmVmb3JlIGFzIHdlbGwuICBOZWVkIHRvIGZpeCB0aGlzIGxhdGVyCi0vLwkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQ3VzdG9tZXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEVfT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5DdXN0b21lciIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkxvbmdUaW1lQ3VzdG9tZXIiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuWmlwQ29kZSIpOwotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IHNwZWNpZmllZENsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCXNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCk7Ci0JCVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0KLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdGF0ZSIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc0VsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXJXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5DdXN0b21lciIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkxvbmdUaW1lQ3VzdG9tZXIiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuWmlwQ29kZSIpOwotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IHNwZWNpZmllZENsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCXNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCk7Ci0JCVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0KLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdGF0ZSIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFFbnRpdHkoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMEFubm90YXRpb24gY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uKTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZShmYWxzZSkiLCBjdSk7Ci0JCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlIiwgY3UpOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShudWxsKTsKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsJCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24pOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENhY2hlYWJsZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0SmF2YUVudGl0eSgpKS5nZXRDYWNoZWFibGUoKTsKLQkJQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbiBjYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24pOwotCQkKLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmFkZEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUiLCBjdSk7Ci0KLQkJY2FjaGVhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUoZmFsc2UpIiwgY3UpOwotCQkKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLlRSVUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUodHJ1ZSkiLCBjdSk7Ci0JCQotCQljYWNoZWFibGVBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlIiwgY3UpOwotCi0JCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKS5yZW1vdmVBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwotCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZWFibGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0SmF2YUVudGl0eSgpKS5nZXRDYWNoZWFibGUoKTsKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlhc3NlcnRFcXVhbHMoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U2hhcmVkQ2FjaGVNb2RlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkFMTCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5FTkFCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5VTlNQRUNJRklFRCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW5oZXJpdGVkSXNEZWZhdWx0Q2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBzdWJDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0SmF2YUVudGl0eSgpKS5nZXRDYWNoZWFibGUoKTsKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRKYXZhRW50aXR5KCkuZ2V0UGFyZW50RW50aXR5KCkpLmdldENhY2hlYWJsZSgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0KLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0KLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUobnVsbCk7Ci0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5FTkFCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU0ZmQ3MS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNlRW51bWVyYXRlZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZVRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDbGFzczJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYXBLZXlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBKYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSm9pbkZldGNoTWFueVRvTWFueSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkZldGNoIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPEludGVnZXIsIEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBbm5vdGF0aW9uVGVzdFR5cGU+IGVtcGxveWVlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzc1dpdGhFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPFN0YXRlPiBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPEFkZHJlc3MsIFByb3BlcnR5SW5mbz4gcGFyY2VsczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJQcm9wZXJ0eUluZm8iKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBJbnRlZ2VyIHBhcmNlbE51bWJlcjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBJbnRlZ2VyIHNpemU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS5tYXRoLkJpZ0RlY2ltYWwgdGF4OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByb3BlcnR5SW5mby5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEpvaW5GZXRjaFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSm9pbkZldGNoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoIGNvbnRleHRKb2luRmV0Y2ggPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQkvLyBiYXNlIGFubm90YXRlZCwgdGVzdCBjb250ZXh0IHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gSU5ORVIgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJCi0JCWpvaW5GZXRjaEFubm90YXRpb24uc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5JTk5FUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBPVVRFUiwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIHZhbHVlIGZyb20gcmVzb3VyY2UsIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYW5ub3RhdGlvbiwgdGV4dCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRKb2luRmV0Y2hWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaCBjb250ZXh0Sm9pbkZldGNoID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgcmVzb3VyY2UgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIElOTkVSIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gT1VURVIsIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgdG8gbnVsbCwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gSU5ORVIgc3BlY2lmaWNhbGx5ICh0aGlzIHRpbWUgZnJvbSBubyBhbm5vdGF0aW9uKSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQlqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSAoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZXMiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZXMiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSAoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0KLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdGF0ZUZvb01hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXkgPSAoTWFwS2V5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBLZXkpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFwS2V5LnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hcEtleS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFwS2V5LnNldE5hbWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwobWFwS2V5LmdldE5hbWUoKSk7Ci0JCQotCQltYXBLZXkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm15TWFwS2V5Iik7Ci0JCU1hcEtleUFubm90YXRpb24gbWFwS2V5ID0gKE1hcEtleUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYXBLZXkuZ2V0TmFtZSgpKTsKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJbWFwS2V5ID0gKE1hcEtleUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwobWFwS2V5LmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nMl8wID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gCi0JCQltYW55VG9NYW55TWFwcGluZzJfMC5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wbG95ZWVzIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nMl8wID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gbWFueVRvTWFueU1hcHBpbmcyXzAuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZzJfMC5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSBtYW55VG9NYW55TWFwcGluZzJfMC5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wbG95ZWVzIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nMl8wLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiU3RyaW5nIik7Ci0JCW1hcEtleU5hbWVzID0gbWFueVRvTWFueU1hcHBpbmcyXzAuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlNYXBLZXlDbGFzczJfMEFubm90YXRpb24gbWFwS2V5Q2xhc3NBbm5vdGF0aW9uID0gKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKG1hcEtleUNsYXNzQW5ub3RhdGlvbik7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYXBLZXlDbGFzc0Fubm90YXRpb24uc2V0VmFsdWUoIm15TWFwS2V5Q2xhc3MiKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleUNsYXNzIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXlDbGFzcyIsIG1hcEtleUNsYXNzQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hcEtleUNsYXNzQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXlDbGFzc0Fubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQltYXBLZXlDbGFzc0Fubm90YXRpb24uc2V0VmFsdWUoIm15TWFwS2V5Q2xhc3MiKTsKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiU3RyaW5nIik7Ci0JCU1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbiBtYXBLZXlDbGFzcyA9IChNYXBLZXlDbGFzczJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBtYXBLZXlDbGFzcy5nZXRWYWx1ZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkludGVnZXIiLCBtYW55VG9NYW55TWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0KLQkJLy90ZXN0IGRlZmF1bHQgc3RpbGwgdGhlIHNhbWUgd2hlbiBzcGVjaWZpZWQgdGFyZ2V0IGVudGl0eSBpdCBzZXQKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE1hcEtleUNsYXNzQ29sbGVjdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0KLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkludGVnZXIiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3JkZXJDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRRdWV1ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJpbnRRdWV1ZSIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByaW50Sm9iIik7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBwcmludFF1ZXVlUGVyc2lzdGVudFR5cGUgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQZXJzaXN0ZW50VHlwZSgidGVzdC5QcmludFF1ZXVlIik7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIGpvYnNNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwcmludFF1ZXVlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImpvYnMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBwcmludEpvYlBlcnNpc3RlbnRUeXBlID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UGVyc2lzdGVudFR5cGUoInRlc3QuUHJpbnRKb2IiKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgcXVldWVzTWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcHJpbnRKb2JQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicXVldWVzIikuZ2V0TWFwcGluZygpOwotCi0JCU9yZGVyYWJsZTJfMCBqb2JzT3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIGpvYnNNYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJT3JkZXJDb2x1bW4yXzAgam9ic09yZGVyQ29sdW1uID0gam9ic09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgam9ic09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBqb2JzT3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgam9ic09yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7IC8vdGhlIGpvaW4gdGFibGUgbmFtZQotCQlPcmRlcmFibGUyXzAgcXVldWVzT3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIHF1ZXVlc01hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlPcmRlckNvbHVtbjJfMCBxdWV1ZXNPcmRlckNvbHVtbiA9IHF1ZXVlc09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcXVldWVzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicXVldWVzX09SREVSIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJam9ic09yZGVyQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvYnNPcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImpvYnNfT1JERVIiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIGpvYnNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJcXVldWVzT3JkZXJDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJxdWV1ZXNfT1JERVIiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQkoKEVudGl0eSkgcHJpbnRKb2JQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRV9QcmludFF1ZXVlIiwgam9ic09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFX1ByaW50UXVldWUiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCSgoRW50aXR5KSBwcmludFF1ZXVlUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9USEVSX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEVfT1RIRVJfVEFCTEUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEVfT1RIRVJfVEFCTEUiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCXF1ZXVlc01hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9UQUJMRSIsIGpvYnNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX1RBQkxFIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJpbnRRdWV1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJQcmludFF1ZXVlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkobWFwcGVkQnk9XCJxdWV1ZXNcIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPcmRlckNvbHVtbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDxQcmludEpvYj4gam9iczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcmludFF1ZXVlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVByaW50Sm9iKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlByaW50Sm9iIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT3JkZXJDb2x1bW4iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkxpc3Q8UHJpbnRRdWV1ZT4gcXVldWVzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByaW50Sm9iLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBLZXlDb2x1bW5NYXBwZWRCeVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLnNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoImVtcGxveWVlcyIpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3NfIiArIFRZUEVfTkFNRSwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ly9qb2luIHRhYmxlIG5hbWUgb2Ygb3duaW5nIG1hbnktdG8tbWFueQotCQkKLQkJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQZXJzaXN0ZW50VHlwZSgidGVzdC5BZGRyZXNzIik7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG93bmluZ01hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOwotCQkoKEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5KSBvd25pbmdNYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRTdHJhdGVneSgpKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9UQUJMRSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcEtleUNvbHVtbkpvaW5UYWJsZVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL2pvaW4gdGFibGUgbmFtZQotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9UQUJMRSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgidmFsdWUuQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CTEFIIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkxBSCIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkxBSCIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbHMiLCByZXNvdXJjZUZpZWxkLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyJfUHJvcGVydHlJbmZvIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJRW1iZWRkYWJsZSBhZGRyZXNzRW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBjaXR5TWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGFkZHJlc3NFbWJlZGRhYmxlLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImNpdHkiKS5nZXRNYXBwaW5nKCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQkJCi0JCWFzc2VydEVxdWFscygicGFyY2VscyIsIHJlc291cmNlRmllbGQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUobnVsbCk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX1Byb3BlcnR5SW5mbyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJrZXkuY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygwLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFSIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5GT08yIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygzLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCi0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBUiIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgidmFsdWUuRk9PMiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoNywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJjaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuc3RhdGUuZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5jaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LnN0YXRlLmZvbyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgic2l6ZSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImtleS5jaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygia2V5LnN0YXRlLmZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImtleS5zdGF0ZS5mb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZU1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZE92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCi0JCWFzc2VydEVxdWFscygia2V5LnN0YXRlLmZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5jaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE1hcEtleUVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihCYXNlRW51bWVyYXRlZENvbnZlcnRlci5jbGFzcyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbiBlbnVtZXJhdGVkID0gKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoZW51bWVyYXRlZCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCQkKLQkJKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKEVudW1UeXBlLlNUUklORyk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZS5TVFJJTkcsIGVudW1lcmF0ZWQuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkRW51bVR5cGUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGVudW1lcmF0ZWQuZ2V0VmFsdWUoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTWFwS2V5RW51bWVyYXRlZFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24gZW51bWVyYXRlZCA9IChNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWVudW1lcmF0ZWQuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGUuU1RSSU5HKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCAoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCQotCQllbnVtZXJhdGVkLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFNhbWUobWFueVRvTWFueU1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwS2V5VGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uIHRlbXBvcmFsID0gKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh0ZW1wb3JhbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0ZW1wb3JhbC5nZXRWYWx1ZSgpKTsKLQkJCi0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5USU1FLCB0ZW1wb3JhbC5nZXRWYWx1ZSgpKTsKLQkJCi0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBLZXlUZW1wb3JhbFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uIHRlbXBvcmFsID0gKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0ZW1wb3JhbC5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJCi0JCXRlbXBvcmFsLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKCgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFNhbWUobWFueVRvTWFueU1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5YjY4Ni4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBzSWQyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEphdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBtYW55VG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEyXzAuTUFQU19JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIEBNYXBzSWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBUWVBFX05BTUUgKyAiIG1hbnlUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5hZGRUb1htbCgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZXJpdmVkSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7Ci0JCUphdmFNYW55VG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihKUEEuSUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuSUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGVyaXZlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQlKYXZhTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0VmFsdWUoZmFsc2UpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFZhbHVlKHRydWUpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQlKYXZhTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlNYXBzSWQyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFZhbHVlKCJiYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwc0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJSmF2YU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCJmb28iKTsKLQkJTWFwc0lkMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE1hcHNJZDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQkKLQkJKChNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKS5zZXRWYWx1ZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydEZhbHNlKCgoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRGYWxzZSgoKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRGYWxzZSgoKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZzJfMCBtYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzAgcmVsID0gKE1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgbWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZzJfMCBtYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzAgcmVsID0gKE1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgbWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGFmZTQ2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5DYWNoZWFibGUyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWFkT25seTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJfVFlQRV9OQU1FID0gIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIFNVQl9UWVBFX05BTUU7Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuUkVBRF9PTkxZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAUmVhZE9ubHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDdXN0b21pemVyKEZvby5jbGFzcyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDaGFuZ2VUcmFja2luZyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGluazJfMEphdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRPbmx5LmlzUmVhZE9ubHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCX0KLQotCS8vVE9ETyB0ZXN0IGluaGVyaXRpbmcgYSBkZWZhdWx0IHJlYWRvbmx5IGZyb20geW91IHN1cGVyY2xhc3MKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcmVhZE9ubHkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCByZWFkT25seS5pc1JlYWRPbmx5KCkpOwotCQkKLQkJcmVhZE9ubHkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ly9Cb29sZWFuLkZBTFNFIGFuZCBudWxsIHJlYWxseSBtZWFuIHRoZSBzYW1lIHRoaW5nIHNpbmNlIHRoZXJlIGFyZSBvbmx5IDIgc3RhdGVzIGluIHRoZSBqYXZhIHJlc291cmNlIG1vZGVsCi0KLQkJcmVhZE9ubHkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0KLQkJcmVhZE9ubHkuc2V0U3BlY2lmaWVkUmVhZE9ubHkobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsvL0Jvb2xlYW4uRkFMU0UgYW5kIG51bGwgcmVhbGx5IG1lYW4gdGhlIHNhbWUgdGhpbmcgc2luY2UgdGhlcmUgYXJlIG9ubHkgMiBzdGF0ZXMgaW4gdGhlIGphdmEgcmVzb3VyY2UgbW9kZWwKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZFJlYWRPbmx5VXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHJlYWRPbmx5LmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyID0gKChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q3VzdG9taXplcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplciA9ICgoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldEN1c3RvbWl6ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCWN1c3RvbWl6ZXIuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIGN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCi0JCQotCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uKTsKLQotCi0JCWN1c3RvbWl6ZXIuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDdXN0b21pemVyQ2xhc3NVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljdXN0b21pemVyQW5ub3RhdGlvbi5zZXRWYWx1ZSgiQmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQljdXN0b21pemVyQW5ub3RhdGlvbi5zZXRWYWx1ZSgiRm9vQmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhciIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENoYW5nZVRyYWNraW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY29udGV4dENoYW5nZVRyYWNraW5nID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiByZXNvdXJjZUNoYW5nZVRyYWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgY29udGV4dCB2YWx1ZQotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBBVFRSSUJVVEUgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBPQkpFQ1Qgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBERUZFUlJFRCBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gQVVUTyBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSB2YWx1ZSBmcm9tIHJlc291cmNlLCB0ZXN0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm5vdGF0aW9uLCB0ZXh0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDaGFuZ2VUcmFja2luZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNvbnRleHRDaGFuZ2VUcmFja2luZyA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gcmVzb3VyY2VDaGFuZ2VUcmFja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IHJlc291cmNlIHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIEFVVE8gc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gQVRUUklCVVRFIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIE9CSkVDVCBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBERUZFUlJFRCBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBudWxsLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBBVVRPIHNwZWNpZmljYWxseSAodGhpcyB0aW1lIGZyb20gbm8gYW5ub3RhdGlvbiksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCQlDYWNoZWFibGUyXzBBbm5vdGF0aW9uIGNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7Ci0JCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUoZmFsc2UpIiwgY3UpOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOwotCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSIsIGN1KTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUobnVsbCk7Ci0JCWNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZWFibGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCQlDYWNoZWFibGUyXzBBbm5vdGF0aW9uIGNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7Ci0JCQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuYWRkQW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSIsIGN1KTsKLQotCQljYWNoZWFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZShmYWxzZSkiLCBjdSk7Ci0JCQotCQljYWNoZWFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uVFJVRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSh0cnVlKSIsIGN1KTsKLQkJCi0JCWNhY2hlYWJsZUFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUiLCBjdSk7Ci0KLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLnJlbW92ZUFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCAgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24pOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENhY2hlYWJsZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlhc3NlcnRFcXVhbHMoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U2hhcmVkQ2FjaGVNb2RlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkFMTCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5FTkFCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5VTlNQRUNJRklFRCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW5oZXJpdGVkSXNEZWZhdWx0Q2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQotCQlQZXJzaXN0ZW5jZVVuaXQyXzAgcGVyc2lzdGVuY2VVbml0Ml8wID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShudWxsKTsKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFiNDMxOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZVRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDbGFzczJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5PbmVUb01hbnkyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rMl8wSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEphdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8U3RyaW5nLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFubm90YXRpb25UZXN0VHlwZSBlbXBsb3llZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPEFkZHJlc3MsIFByb3BlcnR5SW5mbz4gcGFyY2VsczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJvcGVydHlJbmZvIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgSW50ZWdlciBwYXJjZWxOdW1iZXI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgSW50ZWdlciBzaXplOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEubWF0aC5CaWdEZWNpbWFsIHRheDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcm9wZXJ0eUluZm8uamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQkJCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZ09ycGhhblJlbW92YWxTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklELCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkob3JwaGFuUmVtb3ZhbD1mYWxzZSkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWxPZihPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcpIHsKLQkJcmV0dXJuICgoSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzApIG9uZVRvTWFueU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvTWFueUdldERlZmF1bHRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9NYW55TWFwcGluZykuaXNEZWZhdWx0T3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE9uZVRvTWFueUdldERlZmF1bHRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9NYW55TWFwcGluZykuaXNEZWZhdWx0T3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKLQotCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmlzT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBtYXBwaW5nc09ycGhhblJlbW92YWwuaXNPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpOwotCi0JCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnkyXzBBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnkyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJb25lVG9NYW55LnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZ09ycGhhblJlbW92YWxTcGVjaWZpZWQoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueTJfMEFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9NYW55LmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKSk7IAkvLyAuZ2V0RWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueTJfMEFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9NYW55LmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9NYW55TWFwcGluZyk7Ci0KLQkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnkyXzBBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnkyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJb25lVG9NYW55LnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW9uZVRvTWFueS5zZXRPcnBoYW5SZW1vdmFsKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0U2FtZShvbmVUb01hbnlNYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJcmVzb3VyY2VGaWVsZC5zZXRQcmltYXJ5QW5ub3RhdGlvbihudWxsLCBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IChNYXBLZXlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKG1hcEtleSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYXBLZXkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Iiwgb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYXBLZXkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hcEtleS5zZXROYW1lKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwobWFwS2V5LmdldE5hbWUoKSk7Ci0JCQotCQltYXBLZXkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkJCQkKLQkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm15TWFwS2V5Iik7Ci0JCU1hcEtleUFubm90YXRpb24gbWFwS2V5ID0gKE1hcEtleUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hcEtleS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleShudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJbWFwS2V5ID0gKE1hcEtleUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwobWFwS2V5LmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhT25lVG9NYW55TWFwcGluZyBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gCi0JCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wbG95ZWUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSBqYXZhT25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlNYXBLZXlDbGFzczJfMEFubm90YXRpb24gbWFwS2V5Q2xhc3NBbm5vdGF0aW9uID0gKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKG1hcEtleUNsYXNzQW5ub3RhdGlvbik7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYXBLZXlDbGFzc0Fubm90YXRpb24uc2V0VmFsdWUoIm15TWFwS2V5Q2xhc3MiKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleUNsYXNzIiwgb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleUNsYXNzIiwgbWFwS2V5Q2xhc3NBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFwS2V5Q2xhc3NBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwobWFwS2V5Q2xhc3NBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJbWFwS2V5Q2xhc3NBbm5vdGF0aW9uLnNldFZhbHVlKCJteU1hcEtleUNsYXNzIik7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoIlN0cmluZyIpOwotCQlNYXBLZXlDbGFzczJfMEFubm90YXRpb24gbWFwS2V5Q2xhc3MgPSAoTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBtYXBLZXlDbGFzcy5nZXRWYWx1ZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCi0JCS8vdGVzdCBkZWZhdWx0IHN0aWxsIHRoZSBzYW1lIHdoZW4gc3BlY2lmaWVkIHRhcmdldCBlbnRpdHkgaXQgc2V0Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBvbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRNYXBLZXlDbGFzc0NvbGxlY3Rpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nT3JwaGFuUmVtb3ZhbFNwZWNpZmllZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0KLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9yZGVyQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50UXVldWUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50Sm9iKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByaW50UXVldWUiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5QcmludEpvYiIpOwotCQkKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJqb2JzIikuZ2V0TWFwcGluZygpOwotCi0JCU9yZGVyYWJsZTJfMCBvcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCU9yZGVyQ29sdW1uMl8wIG9yZGVyQ29sdW1uID0gb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2IiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCW9yZGVyQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiam9ic19PUkRFUiIsIG9yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgcHJpbnRKb2JQZXJzaXN0ZW50VHlwZSA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKCJ0ZXN0LlByaW50Sm9iIik7Ci0JCSgoRW50aXR5KSBwcmludEpvYlBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9UQUJMRSIpOwotCi0JCWFzc2VydEVxdWFscygiTVlfVEFCTEUiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlQcmludFF1ZXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJpbnRRdWV1ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkobWFwcGVkQnk9XCJxdWV1ZVwiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9yZGVyQ29sdW1uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5MaXN0PFByaW50Sm9iPiBqb2JzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByaW50UXVldWUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BTllfVE9fT05FKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlByaW50Sm9iIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgUHJpbnRRdWV1ZSBxdWV1ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcmludEpvYi5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5Q29sdW1uTWFwcGVkQnlTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLnNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgiZW1wbG95ZWUiKTsKLQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOy8vb3dpbmcgZW50aXR5IHRhYmxlIG5hbWUKLQotCQlFbnRpdHkgYWRkcmVzc0VudGl0eSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCWFkZHJlc3NFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfUFJJTUFSWV9UQUJMRSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5Q29sdW1uSm9pblRhYmxlU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL2pvaW4gdGFibGUgbmFtZQotCi0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfUFJJTUFSWV9UQUJMRSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXRGb3JlaWduS2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCSgoSm9pbkNvbHVtblJlbGF0aW9uc2hpcCkgb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoKEpvaW5Db2x1bW5SZWxhdGlvbnNoaXApIG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfaWQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCBqb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJRW50aXR5IGFkZHJlc3NFbnRpdHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQlhZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0KLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfaWQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBRERSRVNTX1BSSU1BUllfVEFCTEUiLCBqb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQl9Ci0KLQkvL3RhcmdldCBmb3JlaWduIGtleSBjYXNlCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcEtleUNvbHVtbkpvaW5Db2x1bW5TdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkoKEpvaW5Db2x1bW5SZWxhdGlvbnNoaXApIG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJRW50aXR5IGFkZHJlc3NFbnRpdHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQlhZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQkJY29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0JfQotCi0JLy90YXJnZXQgZm9yZWlnbiBrZXkgY2FzZQotCXB1YmxpYyB2b2lkIHRlc3RPcmRlckNvbHVtbkRlZmF1bHRzSm9pbkNvbHVtblN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCSgoSm9pbkNvbHVtblJlbGF0aW9uc2hpcCkgb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQkJKChPcmRlcmFibGUyXzApIG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLnNldE9yZGVyQ29sdW1uT3JkZXJpbmcodHJ1ZSk7Ci0JCU9yZGVyQ29sdW1uMl8wIG9yZGVyQ29sdW1uID0gKChPcmRlcmFibGUyXzApIG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLmdldE9yZGVyQ29sdW1uKCk7Ci0KLQotCQlhc3NlcnROdWxsKG9yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ly90YXJnZXQgdGFibGUgbmFtZQotCi0JCUVudGl0eSBhZGRyZXNzRW50aXR5ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RW50aXR5KCJ0ZXN0LkFkZHJlc3MiKTsKLQkJYWRkcmVzc0VudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkFERFJFU1NfUFJJTUFSWV9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIkFERFJFU1NfUFJJTUFSWV9UQUJMRSIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgbWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT25lVG9NYW55UmVsYXRpb25zaGlwMl8wIHJlbCA9IChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgbWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT25lVG9NYW55UmVsYXRpb25zaGlwMl8wIHJlbCA9IChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRNYXBwZWRCeSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCWFubm90YXRpb24uc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5CQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJMQUgiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbHMiLCByZXNvdXJjZUZpZWxkLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyJfUHJvcGVydHlJbmZvIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJRW1iZWRkYWJsZSBhZGRyZXNzRW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBjaXR5TWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGFkZHJlc3NFbWJlZGRhYmxlLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImNpdHkiKS5nZXRNYXBwaW5nKCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQkJCi0JCWFzc2VydEVxdWFscygicGFyY2VscyIsIHJlc291cmNlRmllbGQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUobnVsbCk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX1Byb3BlcnR5SW5mbyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJrZXkuY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBUiIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgidmFsdWUuRk9PMiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFSIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5GT08yIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyg3LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyg3LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5zdGF0ZS5mb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyg3LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5jaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LnN0YXRlLmZvbyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgic2l6ZSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkJCQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5zdGF0ZS5mb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuc3RhdGUuZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMSwgMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJrZXkuc3RhdGUuZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygia2V5LmNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlzcGVjaWZpZWRPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkTWFwS2V5RW51bWVyYXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyLmNsYXNzKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uIGVudW1lcmF0ZWQgPSAoTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChlbnVtZXJhdGVkKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVudW1lcmF0ZWQuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRFbnVtVHlwZShFbnVtVHlwZS5TVFJJTkcpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGUuU1RSSU5HLCBlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCQkKLQkJKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkRW51bVR5cGUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGVudW1lcmF0ZWQuZ2V0VmFsdWUoKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRNYXBLZXlFbnVtZXJhdGVkVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24gZW51bWVyYXRlZCA9IChNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWVudW1lcmF0ZWQuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGUuU1RSSU5HKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCAoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJCi0JCWVudW1lcmF0ZWQuc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCgoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFNhbWUob25lVG9NYW55TWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBLZXlUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24gdGVtcG9yYWwgPSAoTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHRlbXBvcmFsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRlbXBvcmFsLmdldFZhbHVlKCkpOwotCQkKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBLZXlUZW1wb3JhbFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJdGVtcG9yYWwuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJCi0JCXRlbXBvcmFsLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKCgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRTYW1lKG9uZVRvTWFueU1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ODk4YjMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFPbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwc0lkMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk9uZVRvT25lMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rMl8wSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmdPcnBoYW5SZW1vdmFsU3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZShvcnBoYW5SZW1vdmFsPWZhbHNlKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgIiArIFRZUEVfTkFNRSArICIgb25lVG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQTJfMC5NQVBTX0lEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSBATWFwc0lkIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBvbmVUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5hZGRUb1htbCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzc1dpdGhFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPFN0YXRlPiBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiU3RhdGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZXJpdmVkSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihKUEEuSUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuSUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGVyaXZlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIik7Ci0JCUphdmFPbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0VmFsdWUoZmFsc2UpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFZhbHVlKHRydWUpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIik7Ci0JCUphdmFPbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJTWFwc0lkMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE1hcHNJZDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCk7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZSgiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCUphdmFPbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoImZvbyIpOwotCQlNYXBzSWQyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoKChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKCgoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoKChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKCgoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKCgoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoKChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJLy8gdGhpcyBpcyBubyBsb25nZXIgc3VwcG9ydGVkIChpdCB3YXMgYSBiaXQgb2YgYSB0ZXN0aW5nIGhhY2sgYW55d2F5Li4uKQotCQkvLyBjb250ZXh0QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJLy8gdGhlICpyZWFsKiB0ZXN0IGlzIHdoZXRoZXIgdGhlIElkIGFubm90YXRpb24gc3RpbGwgcmVzdWx0cyBpbiBhIDE6MSBtYXBwaW5nLi4uCi0JCWNvbnRleHRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShudWxsKTsgIC8vIGNsZWFyIGFueSBtYXBwaW5nIGFubm90YXRpb24KLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5JRCk7ICAvLyBhZGQgSWQgYW5ub3RhdGlvbgotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFPbmVUb09uZU1hcHBpbmcyXzApOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApOwkKLQkJCi0JCWNvbnRleHRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFCYXNpY01hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSAoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gb25lVG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0YXRlRm9vTWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lc0VsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3NXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWxPZihPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nKSB7Ci0JCXJldHVybiAoKEphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSBvbmVUb09uZU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lR2V0RGVmYXVsdE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb09uZU1hcHBpbmcpLmlzRGVmYXVsdE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRPbmVUb09uZUdldERlZmF1bHRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKS5pc0RlZmF1bHRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0T3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBwaW5nc09ycGhhblJlbW92YWwuaXNPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5pc09ycGhhblJlbW92YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKTsKLQotCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmUyXzBBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJb25lVG9PbmUuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmdPcnBoYW5SZW1vdmFsU3BlY2lmaWVkKCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKS5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZTJfMEFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmUuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSkpOyAJLy8gLmdldEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb09uZU1hcHBpbmcpOwotCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lMl8wQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb09uZS5nZXRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKTsKLQotCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lMl8wQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCW9uZVRvT25lLnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW9uZVRvT25lLnNldE9ycGhhblJlbW92YWwobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRTYW1lKG9uZVRvT25lTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwotCQkKLQkJb25lVG9PbmUuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJcmVzb3VyY2VGaWVsZC5zZXRQcmltYXJ5QW5ub3RhdGlvbihudWxsLCBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCBtYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9uZVRvT25lUmVsYXRpb25zaGlwMl8wIHJlbCA9IChPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgbWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgbWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCByZWwgPSAoT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRNYXBwZWRCeSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJCi0JCWFubm90YXRpb24uc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwkKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMkphdmFFbnRpdHlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMkphdmFFbnRpdHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWIyNjg4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzJKYXZhRW50aXR5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW50aXR5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZENsYXNzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmsyXzJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzJKYXZhRW50aXR5VGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGluazJfMkNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCX1RZUEVfTkFNRSA9ICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBTVUJfVFlQRV9OQU1FOwotCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzJKYXZhRW50aXR5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQllbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQllbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCXJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgiYXNkZiIpOwotCQllbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQllbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJZW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWVudGl0eS5nZXRJZENsYXNzUmVmZXJlbmNlKCkuc2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoIm15SWRDbGFzcyIpOwotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwotCQllbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkQ3VzdG9tQ29udmVydGVyKDApOwotCQllbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkQ3VzdG9tQ29udmVydGVyKDEpOwotCQllbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJZW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMSk7Ci0JCWVudGl0eS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRUeXBlQ29udmVydGVyKDApOwotCQllbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkVHlwZUNvbnZlcnRlcigxKTsKLQkJZW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKLQkJZW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFN0cnVjdENvbnZlcnRlcigxKTsKLQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hcHBlZFN1cGVyY2xhc3MpOwotCi0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEluaGVyaXRhbmNlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJZW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJZW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlyZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoImFzZGYiKTsKLQkJZW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJZW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQllbnRpdHkuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLnNldFNwZWNpZmllZElkQ2xhc3NOYW1lKCJteUlkQ2xhc3MiKTsKLQkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKTsKLQkJZW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZEN1c3RvbUNvbnZlcnRlcigwKTsKLQkJZW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZEN1c3RvbUNvbnZlcnRlcigxKTsKLQkJZW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWVudGl0eS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRPYmplY3RUeXBlQ29udmVydGVyKDEpOwotCQllbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJZW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFR5cGVDb252ZXJ0ZXIoMSk7Ci0JCWVudGl0eS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCWVudGl0eS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMSk7Ci0JCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRhYmxlKTsKLQotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJbmhlcml0YW5jZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMkphdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzJKYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMWM5NDEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMkphdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU51bGxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZENsYXNzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8yQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8ySmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8yQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJfVFlQRV9OQU1FID0gIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIFNVQl9UWVBFX05BTUU7Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQotCXB1YmxpYyBFY2xpcHNlTGluazJfMkphdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCW1hcHBlZFN1cGVyY2xhc3MuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLnNldFNwZWNpZmllZElkQ2xhc3NOYW1lKCJteUlkQ2xhc3MiKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCW1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkQ3VzdG9tQ29udmVydGVyKDEpOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCW1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigxKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRUeXBlQ29udmVydGVyKDApOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFR5cGVDb252ZXJ0ZXIoMSk7Ci0JCW1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkU3RydWN0Q29udmVydGVyKDApOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFN0cnVjdENvbnZlcnRlcigxKTsKLQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbnRpdHkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5zZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgibXlJZENsYXNzIik7Ci0JCW1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkQ3VzdG9tQ29udmVydGVyKDApOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZEN1c3RvbUNvbnZlcnRlcigxKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMSk7Ci0JCW1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRUeXBlQ29udmVydGVyKDEpOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMSk7Ci0KLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGFibGUpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9OdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5zZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgibXlJZENsYXNzIik7Ci0JCW1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkQ3VzdG9tQ29udmVydGVyKDApOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZEN1c3RvbUNvbnZlcnRlcigxKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMSk7Ci0JCW1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRUeXBlQ29udmVydGVyKDEpOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMSk7Ci0KLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFOdWxsVHlwZU1hcHBpbmcpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzNKYXZhTXVsdGl0ZW5hbmN5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzNKYXZhTXVsdGl0ZW5hbmN5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM2ZjZlNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8zSmF2YU11bHRpdGVuYW5jeVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5NdWx0aXRlbmFudFR5cGUyXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmsyXzNDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzNKYXZhTXVsdGl0ZW5hbmN5VGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGluazJfM0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCX1RZUEVfTkFNRSA9ICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBTVUJfVFlQRV9OQU1FOwotCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzNKYXZhTXVsdGl0ZW5hbmN5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNdWx0aXRlbmFudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuTVVMVElURU5BTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE11bHRpdGVuYW50Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLk1VTFRJVEVOQU5ULCBFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4obmFtZT1cImZvb1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuTVVMVElURU5BTlQsIEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTiwgRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoe0BUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKG5hbWU9XCJmb29cIiksIEBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKG5hbWU9XCJiYXJcIil9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE11bHRpdGVuYW50TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oCi0JCQkJCUpQQS5NQVBQRURfU1VQRVJDTEFTUywKLQkJCQkJRWNsaXBzZUxpbmsuTVVMVElURU5BTlQsCi0JCQkJCUVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE11bHRpdGVuYW50IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKG5hbWU9XCJNU19URU5BTlRfSURcIikiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE11bHRpdGVuYW50Um9vdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oCi0JCQkJCUpQQS5FTlRJVFksCi0JCQkJCUpQQS5JTkhFUklUQU5DRSwKLQkJCQkJRWNsaXBzZUxpbmsuTVVMVElURU5BTlQsCi0JCQkJCUVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJASW5oZXJpdGVuYWNlIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBNdWx0aXRlbmFudCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihuYW1lPVwiUk9PVF9FTlRJVFlfVEVOQU5UX0lEXCIpIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBnZXRKYXZhTXVsdGl0ZW5hbmN5KCkgewotCQlyZXR1cm4gZ2V0SmF2YUVudGl0eSgpLmdldE11bHRpdGVuYW5jeSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUeXBlTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydE51bGwoZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmdldFR5cGUoKSk7CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11bHRpdGVuYW50KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5TSU5HTEVfVEFCTEUsIGdldEphdmFNdWx0aXRlbmFuY3koKS5nZXRUeXBlKCkpOwkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdWx0aXRlbmFudCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMgbXVsdGl0ZW5hbnQgPSAoRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJbXVsdGl0ZW5hbnQuc2V0VmFsdWUoTXVsdGl0ZW5hbnRUeXBlMl8zLlNJTkdMRV9UQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5TSU5HTEVfVEFCTEUsIGdldEphdmFNdWx0aXRlbmFuY3koKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCW11bHRpdGVuYW50LnNldFZhbHVlKE11bHRpdGVuYW50VHlwZTJfMy5UQUJMRV9QRVJfVEVOQU5UKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlRBQkxFX1BFUl9URU5BTlQsIGdldEphdmFNdWx0aXRlbmFuY3koKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCW11bHRpdGVuYW50LnNldFZhbHVlKE11bHRpdGVuYW50VHlwZTJfMy5WUEQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuVlBELCBnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQotCQltdWx0aXRlbmFudC5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0TnVsbChnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11bHRpdGVuYW50KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0KLQkJZ2V0SmF2YU11bHRpdGVuYW5jeSgpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuU0lOR0xFX1RBQkxFKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuU0lOR0xFX1RBQkxFLCBnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMyBtdWx0aXRlbmFudCA9IChFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKE11bHRpdGVuYW50VHlwZTJfMy5TSU5HTEVfVEFCTEUsIG11bHRpdGVuYW50LmdldFZhbHVlKCkpOwotCi0KLQkJZ2V0SmF2YU11bHRpdGVuYW5jeSgpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuVEFCTEVfUEVSX1RFTkFOVCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlRBQkxFX1BFUl9URU5BTlQsIGdldEphdmFNdWx0aXRlbmFuY3koKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwkJCi0JCWFzc2VydEVxdWFscyhNdWx0aXRlbmFudFR5cGUyXzMuVEFCTEVfUEVSX1RFTkFOVCwgbXVsdGl0ZW5hbnQuZ2V0VmFsdWUoKSk7Ci0KLQkJZ2V0SmF2YU11bHRpdGVuYW5jeSgpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuVlBEKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuVlBELCBnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoTXVsdGl0ZW5hbnRUeXBlMl8zLlZQRCwgbXVsdGl0ZW5hbnQuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0luY2x1ZGVDcml0ZXJpYSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11bHRpdGVuYW50KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyh0cnVlLCBnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuaXNJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0KLQkJZ2V0SmF2YU11bHRpdGVuYW5jeSgpLnNldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuaXNJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11bHRpdGVuYW50KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydE51bGwoZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmdldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMyBtdWx0aXRlbmFudCA9IChFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKTsKLQkJbXVsdGl0ZW5hbnQuc2V0SW5jbHVkZUNyaXRlcmlhKEJvb2xlYW4uRkFMU0UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmdldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYSgpKTsKLQotCQltdWx0aXRlbmFudC5zZXRJbmNsdWRlQ3JpdGVyaWEoQm9vbGVhbi5UUlVFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmdldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYSgpKTsKLQotCQltdWx0aXRlbmFudC5zZXRJbmNsdWRlQ3JpdGVyaWEobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydE51bGwoZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmdldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYSgpKTsKLQkJbXVsdGl0ZW5hbnQgPSAoRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwobXVsdGl0ZW5hbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdWx0aXRlbmFudCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnROdWxsKGdldEphdmFNdWx0aXRlbmFuY3koKS5nZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMgbXVsdGl0ZW5hbnQgPSAoRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJYXNzZXJ0TnVsbChtdWx0aXRlbmFudC5nZXRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0KLQkJZ2V0SmF2YU11bHRpdGVuYW5jeSgpLnNldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdWx0aXRlbmFudC5nZXRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0KLQkJZ2V0SmF2YU11bHRpdGVuYW5jeSgpLnNldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYShudWxsKTsKLQkJbXVsdGl0ZW5hbnQgPSAoRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwobXVsdGl0ZW5hbnQuZ2V0SW5jbHVkZUNyaXRlcmlhKCkpOwotCQlhc3NlcnROdWxsKGdldEphdmFNdWx0aXRlbmFuY3koKS5nZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUxpc3RJdGVyYXRvcjxKYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gdGVuYW5kRGlzY3JpbWluYXRvckNvbHVtbnMgPSBnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpOwotCi0JCWFzc2VydFRydWUodGVuYW5kRGlzY3JpbWluYXRvckNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0ZW5hbmREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGVuYW5kRGlzY3JpbWluYXRvckNvbHVtbnMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXVsdGl0ZW5hbnQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIGphdmFNdWx0aXRlbmFuY3kgPSBnZXRKYXZhTXVsdGl0ZW5hbmN5KCk7CQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgamF2YU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0KLQkJKChFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFSIik7Ci0JCSgoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMiwgRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMy5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsKLQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGphdmFNdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUxpc3RJdGVyYXRvcjxKYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gdGVuYW5kRGlzY3JpbWluYXRvckNvbHVtbnMgPSBnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpOwotCi0JCWFzc2VydFRydWUodGVuYW5kRGlzY3JpbWluYXRvckNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0ZW5hbmREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0ZW5hbmREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGVuYW5kRGlzY3JpbWluYXRvckNvbHVtbnMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11bHRpdGVuYW50KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWdldEphdmFNdWx0aXRlbmFuY3koKS5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11bHRpdGVuYW50KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWdldEphdmFNdWx0aXRlbmFuY3koKS5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXVsdGl0ZW5hbnQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWdldEphdmFNdWx0aXRlbmFuY3koKS5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCi0JCWFzc2VydEVxdWFscygzLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJZ2V0SmF2YU11bHRpdGVuYW5jeSgpLnJlbW92ZVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMSk7Ci0KLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbnMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMy5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zKSB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbnMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgKChFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zKSB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQotCQlJdGVyYXRvcjxKYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMgPSBnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLmhhc05leHQoKSk7Ci0KLQotCQlnZXRKYXZhTXVsdGl0ZW5hbmN5KCkucmVtb3ZlU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigxKTsKLQkJdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25zID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25zLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRGYWxzZSh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQotCQl0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IGdldEphdmFNdWx0aXRlbmFuY3koKS5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLmhhc05leHQoKSk7Ci0KLQotCQlnZXRKYXZhTXVsdGl0ZW5hbmN5KCkucmVtb3ZlU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigwKTsKLQkJdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25zID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQkJdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMgPSBnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMy5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdWx0aXRlbmFudCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgamF2YU11bHRpdGVuYW5jeSA9IGdldEphdmFNdWx0aXRlbmFuY3koKTsJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0KLQkJamF2YU11bHRpdGVuYW5jeS5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhTXVsdGl0ZW5hbmN5LmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWphdmFNdWx0aXRlbmFuY3kuYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucykpOwotCi0KLQkJamF2YU11bHRpdGVuYW5jeS5tb3ZlU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IGphdmFNdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWphdmFUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIGphdmFUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zKSBqYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgamF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQotCi0JCWphdmFNdWx0aXRlbmFuY3kubW92ZVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMCwgMSk7Ci0JCXRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zID0gamF2YU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJamF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgamF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIGphdmFUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zKSBqYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBqYXZhTXVsdGl0ZW5hbmN5ID0gZ2V0SmF2YU11bHRpdGVuYW5jeSgpOwkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQotCQkoKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiRk9PIik7Ci0JCSgoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMy5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigyLCBFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlMaXN0SXRlcmF0b3I8SmF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zID0gamF2YU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VUeXBlLm1vdmVBbm5vdGF0aW9uKDIsIDAsIEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zID0gamF2YU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VUeXBlLm1vdmVBbm5vdGF0aW9uKDAsIDEsIEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zID0gamF2YU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgIEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zID0gamF2YU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgIEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zID0gamF2YU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgIEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zID0gamF2YU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCi0JLy9NYXBwZWRTdXBlcmNsYXNzIHNwZWNpZmllcyBtdWx0aXRlbmFuY3ksIGFsbCBzdWJjbGFzcyBlbnRpdGllcyBhcmUgbXVsdGl0ZW5hbnQgYnkgZGVmYXVsdC4KLQlwdWJsaWMgdm9pZCB0ZXN0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNXaXRoTWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TXVsdGl0ZW5hbnRNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIG11bHRpdGVuYW5jeSA9IGdldEphdmFNdWx0aXRlbmFuY3koKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVNfVEVOQU5UX0lEIiwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQkvL2lmIHRoZSBqYXZhIGVudGl0eSBzcGVjaWZpZXMgbXVsdGl0ZW5hbnQsIHRoZW4gaXQgZG9lcyBub3QgZ2V0IHRoZSB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zIGZyb20gdGhlIG1hcHBlZCBzdXBlcmNsYXNzCi0JCW11bHRpdGVuYW5jeS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlNJTkdMRV9UQUJMRSk7Ci0JCWFzc2VydEVxdWFscygxLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIlRFTkFOVF9JRCIsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCi0JLy9Sb290IGVudGl0eSBzcGVjaWZpZXMgbXVsdGl0ZW5hbmN5IGFuZCBTSU5HTEVfVEFCTEUgaW5oZXJpdGFuY2UsIGFsbCBzdWJjbGFzcyBlbnRpdGllcyBhcmUgbXVsdGl0ZW5hbnQgYnkgZGVmYXVsdC4KLQlwdWJsaWMgdm9pZCB0ZXN0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNXaXRoSW5oZXJpdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE11bHRpdGVuYW50Um9vdEVudGl0eSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBtdWx0aXRlbmFuY3kgPSBnZXRKYXZhTXVsdGl0ZW5hbmN5KCk7Ci0JCWFzc2VydFRydWUobXVsdGl0ZW5hbmN5LmlzTXVsdGl0ZW5hbnQoKSk7IC8vbXVsdGl0ZW5hbnQgYnkgZGVmYXVsdCBmcm9tIHJvb3QgZW50aXR5Ci0JCWFzc2VydEZhbHNlKG11bHRpdGVuYW5jeS5pc1NwZWNpZmllZE11bHRpdGVuYW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJST09UX0VOVElUWV9URU5BTlRfSUQiLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWdldEphdmFFbnRpdHkoKS5nZXRSb290RW50aXR5KCkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJYXNzZXJ0VHJ1ZShtdWx0aXRlbmFuY3kuaXNNdWx0aXRlbmFudCgpKTsgLy9tdWx0aXRlbmFudCBieSBkZWZhdWx0IGZyb20gcm9vdCBlbnRpdHkKLQkJYXNzZXJ0RmFsc2UobXVsdGl0ZW5hbmN5LmlzU3BlY2lmaWVkTXVsdGl0ZW5hbnQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJPT1RfRU5USVRZX1RFTkFOVF9JRCIsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJZ2V0SmF2YUVudGl0eSgpLmdldFJvb3RFbnRpdHkoKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCQlhc3NlcnRGYWxzZShtdWx0aXRlbmFuY3kuaXNNdWx0aXRlbmFudCgpKTsgLy9ub3QgbXVsdGl0ZW5hbnQgc2luY2UgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kgaXMgdGFibGUgcGVyIGNsYXNzCi0JCWFzc2VydEZhbHNlKG11bHRpdGVuYW5jeS5pc1NwZWNpZmllZE11bHRpdGVuYW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpIGdldE1hcHBpbmdGaWxlKCkuZ2V0Um9vdCgpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuYWRkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIlBVX1RFTkFOVF9JRCIpOwotCQlhc3NlcnRGYWxzZShtdWx0aXRlbmFuY3kuaXNNdWx0aXRlbmFudCgpKTsgLy9ub3QgbXVsdGl0ZW5hbnQgc2luY2UgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kgaXMgdGFibGUgcGVyIGNsYXNzCi0JCWFzc2VydEZhbHNlKG11bHRpdGVuYW5jeS5pc1NwZWNpZmllZE11bHRpdGVuYW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQotCQkvL2dldCB0aGUgZGVmYXVsdCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW4gZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdCBkZWZhdWx0cyBpbnN0ZWFkIG9mIHRoZSByb290IGVudGl0eSBzaW5jZSBpbmhlcml0YW5jZSBzdHJhdGVneSBpcyB0YWJsZSBwZXIgY2xhc3MKLQkJbXVsdGl0ZW5hbmN5LnNldFNwZWNpZmllZE11bHRpdGVuYW50KHRydWUpOwotCQlhc3NlcnRUcnVlKG11bHRpdGVuYW5jeS5pc1NwZWNpZmllZE11bHRpdGVuYW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQVV9URU5BTlRfSUQiLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwkJCi0KLQkJbXVsdGl0ZW5hbmN5LmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJDSElMRF9URU5BTlRfSUQiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ0hJTERfVEVOQU5UX0lEIiwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCi0JCWdldEphdmFFbnRpdHkoKS5nZXRSb290RW50aXR5KCkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ0hJTERfVEVOQU5UX0lEIiwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1dpdGhQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykgZ2V0TWFwcGluZ0ZpbGUoKS5nZXRSb290KCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5hZGRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiUFVfVEVOQU5UX0lEIik7Ci0KLQkJSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIG11bHRpdGVuYW5jeSA9IGdldEphdmFNdWx0aXRlbmFuY3koKTsKLQkJYXNzZXJ0RmFsc2UobXVsdGl0ZW5hbmN5LmlzTXVsdGl0ZW5hbnQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCi0JCW11bHRpdGVuYW5jeS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlNJTkdMRV9UQUJMRSk7Ci0JCWFzc2VydEVxdWFscygxLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIlBVX1RFTkFOVF9JRCIsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJLy9pZiB0aGVyZSBhcmUgc3BlY2lmaWVkIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMgdGhlbiB0aGVyZSBzaG91bGQgbm90IGJlIGFueSBkZWZhdWx0IG9uZXMKLQkJbXVsdGl0ZW5hbmN5LmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJFTlRJVFlfVEVOQU5UX0lEIik7Ci0JCWFzc2VydEVxdWFscygxLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbXVsdGl0ZW5hbmN5LmdldERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRU5USVRZX1RFTkFOVF9JRCIsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJLy9pZiBqYXZhIGVudGl0eSBpcyBub3QgbXVsdGl0ZW5hbnQgdGhhbiB0aGVyZSBhcmUgbm8gdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucwotCQlnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuc2V0U3BlY2lmaWVkTXVsdGl0ZW5hbnQoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoMCwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNXaXRoRW50aXR5TWFwcGluZ3NEZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSAoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncykgZ2V0TWFwcGluZ0ZpbGUoKS5nZXRSb290KCk7Ci0JCWVudGl0eU1hcHBpbmdzLmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJFTV9URU5BTlRfSUQiKTsKLQotCQlKYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgbXVsdGl0ZW5hbmN5ID0gZ2V0SmF2YU11bHRpdGVuYW5jeSgpOwotCQlhc3NlcnRGYWxzZShtdWx0aXRlbmFuY3kuaXNNdWx0aXRlbmFudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0KLQkJLy9lbnRpdHkgaXMgbm90IGxpc3RlZCBpbiB0aGUgb3JtLnhtbCBmaWxlLCBzbyBkb2VzIG5vdCBnZXQgZGVmYXVsdCBmcm9tIGVudGl0eSBtYXBwaW5ncwotCQltdWx0aXRlbmFuY3kuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5TSU5HTEVfVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoMSwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURU5BTlRfSUQiLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCW11bHRpdGVuYW5jeSA9ICgoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldE11bHRpdGVuYW5jeSgpOwotCi0JCWFzc2VydEVxdWFscygxLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkVNX1RFTkFOVF9JRCIsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJLy9pZiBqYXZhIGVudGl0eSBpcyBub3QgU0lOR0xFX1RBQkxFIG11bHRpdGVuYW50IHRoYW4gdGhlcmUgYXJlIG5vIGRlZmF1bHQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucwotCQltdWx0aXRlbmFuY3kuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5UQUJMRV9QRVJfVEVOQU5UKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0KLQkJLy9pZiBqYXZhIGVudGl0eSBpcyBub3QgU0lOR0xFX1RBQkxFIG11bHRpdGVuYW50IHRoYW4gdGhlcmUgYXJlIG5vIGRlZmF1bHQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucwotCQltdWx0aXRlbmFuY3kuc2V0U3BlY2lmaWVkTXVsdGl0ZW5hbnQoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoMCwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQotCi0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykgZ2V0TWFwcGluZ0ZpbGUoKS5nZXRSb290KCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5hZGRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiUFVfVEVOQU5UX0lEIik7Ci0KLQkJbXVsdGl0ZW5hbmN5LnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuU0lOR0xFX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRU1fVEVOQU5UX0lEIiwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQllbnRpdHlNYXBwaW5ncy5yZW1vdmVQZXJzaXN0ZW50VHlwZSgwKTsKLQkJbXVsdGl0ZW5hbmN5ID0gZ2V0SmF2YU11bHRpdGVuYW5jeSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQVV9URU5BTlRfSUQiLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGNhNTk5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZVRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011dGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJUKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiY2xhc3MtaW5zdGFuY2VcIikiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUJhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMsIEVjbGlwc2VMaW5rLk1VVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBNdXRhYmxlIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVCYXNpY0RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgRWNsaXBzZUxpbmsuTVVUQUJMRSwgImphdmEudXRpbC5EYXRlIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNdXRhYmxlIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIERhdGUgbXlEYXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuQ0xBU1NfSU5TVEFOQ0VfQ09OVkVSVEVSLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUZW1wb3JhbEFubm90YXRpb24gdGVtcG9yYWwgPSAoVGVtcG9yYWxBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlLlRJTUUsIHRlbXBvcmFsLmdldFZhbHVlKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbiBjb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWNvbnZlcnQuc2V0VmFsdWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlck5hbWUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFNhbWUoYmFzaWNNYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUJhc2ljKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IGJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJbXV0YWJsZUFubm90YXRpb24uc2V0VmFsdWUoQm9vbGVhbi5UUlVFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0KLQkJbXV0YWJsZUFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0KLQkJbXV0YWJsZUFubm90YXRpb24uc2V0VmFsdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVCYXNpYygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGUgPSBiYXNpY01hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uIG11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShudWxsKTsKLQkJbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGVBbm5vdGF0aW9uKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCW11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUJhc2ljKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IGJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCS8vc2V0IG11dGFibGUgZGVmYXVsdCB0byBmYWxzZSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCBwcm9wZXJ0aWVzLCB2ZXJpZnkgZGVmYXVsdCBpbiBqYXZhIHN0aWxsIHRydWUgc2luY2UgdGhpcyBpcyBub3QgYSBEYXRlL0NhbGVuZGFyCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0TXV0YWJsZUZvckRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlQmFzaWNEYXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IGJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCk7Ci0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwkKLQkJYXNzZXJ0RmFsc2UobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJLy9zZXQgbXV0YWJsZSBkZWZhdWx0IHRvIGZhbHNlIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHByb3BlcnRpZXMsIHZlcmlmeSBkZWZhdWx0IGluIGphdmEgc3RpbGwgdHJ1ZSBzaW5jZSB0aGlzIGlzIG5vdCBhIERhdGUvQ2FsZW5kYXIKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUobnVsbCk7Ci0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVCYXNpYygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGUgPSBiYXNpY01hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNNdXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzTXV0YWJsZSgpKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwkKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzTXV0YWJsZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNhY2hpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFDYWNoaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFkNzQ3ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNhY2hpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVGltZU9mRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUNhY2hpbmdUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsJCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YUNhY2hpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkU2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJCi0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZW50aXR5LmdldENhY2hpbmcoKS5pc1NoYXJlZCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZUFubm90YXRpb24uZ2V0U2hhcmVkKCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRTaGFyZWRGYWxzZVVuc2V0c090aGVyQ2FjaGVTZXR0aW5ncygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUspOwotCQljYWNoaW5nLnNldFNwZWNpZmllZFNpemUoSW50ZWdlci52YWx1ZU9mKDUwMCkpOwotCQljYWNoaW5nLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goQm9vbGVhbi5GQUxTRSk7Ci0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uRkFMU0UpOwotCQljYWNoaW5nLnNldFNwZWNpZmllZERpc2FibGVIaXRzKEJvb2xlYW4uRkFMU0UpOwotCQljYWNoaW5nLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMpOwotCQljYWNoaW5nLnNldEV4aXN0ZW5jZUNoZWNraW5nKHRydWUpOwotCQljYWNoaW5nLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0NBQ0hFKTsKLQkJY2FjaGluZy5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDgwMDApKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkU2hhcmVkKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQkKLQkJCi0JCS8vZXhpc3RlbmNlIGNoZWNraW5nIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgaXNuJ3QgdW5zZXQgd2hlbiBzaGFyZWQgaXMgc2V0IHRvIGZhbHNlCi0JCWFzc2VydFRydWUoY2FjaGluZy5pc0V4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0NBQ0hFLCBjYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZFNoYXJlZChudWxsKTsKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXkgdGltZU9mRGF5RXhwaXJ5ID0gY2FjaGluZy5hZGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJdGltZU9mRGF5RXhwaXJ5LnNldEhvdXIoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkU2hhcmVkKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlQW5ub3RhdGlvbi5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydE51bGwoY2FjaGVBbm5vdGF0aW9uLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRUcnVlKGNhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQkKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0UHJvcGVydHkoQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVCwgImZhbHNlIik7Ci0JCQotCQlhc3NlcnRGYWxzZShjYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoaW5nLmlzU2hhcmVkKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWNhY2hlQW5ub3RhdGlvbi5zZXRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlQW5ub3RhdGlvbi5nZXRTaGFyZWQoKSk7CQkJCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZW50aXR5LmdldENhY2hpbmcoKS5pc1NoYXJlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBjYWNoaW5nLmdldFR5cGUoKSk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLKTsKLQkJCi0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUssIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGUuSEFSRF9XRUFLLCBjYWNoZUFubm90YXRpb24uZ2V0VHlwZSgpKTsJCQotCi0JCi0JCS8vc2V0IHNwZWNpZmllZCB0eXBlIHRvIHRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0LCB2ZXJpZnkgaXQgaXMgbm90IHNldCB0byBkZWZhdWx0Ci0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUspOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBjYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGUuU09GVF9XRUFLLCBjYWNoZUFubm90YXRpb24uZ2V0VHlwZSgpKTsJCQotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgY2FjaGluZy5nZXRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBjYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQkKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0UHJvcGVydHkoQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQsIEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkZVTEwudG9TdHJpbmcoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgY2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBjYWNoaW5nLmdldFR5cGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJY2FjaGVBbm5vdGF0aW9uLnNldFR5cGUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLkhBUkRfV0VBSyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZS5IQVJEX1dFQUssIGNhY2hlQW5ub3RhdGlvbi5nZXRUeXBlKCkpOwkJCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSywgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZW50aXR5LmdldENhY2hpbmcoKS5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVBbm5vdGF0aW9uLmdldEFsd2F5c1JlZnJlc2goKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWNhY2hlQW5ub3RhdGlvbi5zZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4uVFJVRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVBbm5vdGF0aW9uLmdldEFsd2F5c1JlZnJlc2goKSk7CQkJCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVBbm5vdGF0aW9uLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWNhY2hlQW5ub3RhdGlvbi5zZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZUFubm90YXRpb24uZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwkJCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZUFubm90YXRpb24uZ2V0RGlzYWJsZUhpdHMoKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZERpc2FibGVIaXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJY2FjaGVBbm5vdGF0aW9uLnNldERpc2FibGVIaXRzKEJvb2xlYW4uVFJVRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZUFubm90YXRpb24uZ2V0RGlzYWJsZUhpdHMoKSk7CQkJCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZW50aXR5LmdldENhY2hpbmcoKS5pc0Rpc2FibGVIaXRzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGNhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgZW50aXR5LmdldENhY2hpbmcoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgY2FjaGVBbm5vdGF0aW9uLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CQkKLQotCQotCQkvL3NldCBzcGVjaWZpZWQgY29vcmRpbmF0aW9uIHR5cGUgdG8gdGhlIHNhbWUgYXMgdGhlIGRlZmF1bHQsIHZlcmlmeSBpdCBpcyBub3Qgc2V0IHRvIGRlZmF1bHQKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgY2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGNhY2hlQW5ub3RhdGlvbi5nZXRDb29yZGluYXRpb25UeXBlKCkpOwkJCi0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgY2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBjYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJY2FjaGVBbm5vdGF0aW9uLnNldENvb3JkaW5hdGlvblR5cGUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBjYWNoZUFubm90YXRpb24uZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsJCQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhhc0V4aXN0ZW5jZUNoZWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoaW5nLmlzRXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlyZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcpOwkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoaW5nLmlzRXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hpbmcuaXNFeGlzdGVuY2VDaGVja2luZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEV4aXN0ZW5jZUNoZWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoaW5nLmlzRXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuRVhJU1RFTkNFX0NIRUNLSU5HKSk7Ci0JCQotCQljYWNoaW5nLnNldEV4aXN0ZW5jZUNoZWNraW5nKHRydWUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hpbmcuaXNFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgY2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQotCQljYWNoaW5nLnNldEV4aXN0ZW5jZUNoZWNraW5nKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0NBQ0hFLCBjYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIGNhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuRVhJU1RFTkNFX0NIRUNLSU5HKTsKLQkJZXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBleGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uZ2V0VmFsdWUoKSk7CQkJCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBjYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCQotCQljYWNoaW5nLnNldEV4aXN0ZW5jZUNoZWNraW5nKHRydWUpOwotCQljYWNoaW5nLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFKTsKLQkJCi0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbiBleGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gPSAoRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgZXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwkJCi0KLQkKLQkJLy9zZXQgc3BlY2lmaWVkIGNvb3JkaW5hdGlvbiB0eXBlIHRvIHRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0LCB2ZXJpZnkgaXQgaXMgbm90IHNldCB0byBkZWZhdWx0Ci0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBjYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBleGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uZ2V0VmFsdWUoKSk7CQkKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfQ0FDSEUsIGNhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0Q2FjaGluZygpLmdldEV4cGlyeSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnROdWxsKGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0RXhwaXJ5KCkpOwotCQkKLQkJY2FjaGVBbm5vdGF0aW9uLnNldEV4cGlyeShJbnRlZ2VyLnZhbHVlT2YoNTcpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDU3KSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRFeHBpcnkoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0RXhwaXJ5KCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEV4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQljYWNoaW5nLnNldEV4cGlyeShJbnRlZ2VyLnZhbHVlT2YoNTgpKTsKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTgpLCBjYWNoZUFubm90YXRpb24uZ2V0RXhwaXJ5KCkpOwotCQkKLQkJCi0JCWNhY2hpbmcuc2V0RXhwaXJ5KG51bGwpOwotCQljYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0TnVsbChjYWNoZUFubm90YXRpb24uZ2V0RXhwaXJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RXhwaXJ5VW5zZXRzRXhwaXJ5VGltZU9mRGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJCi0JCWNhY2hpbmcuYWRkRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCWNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuc2V0SG91cihJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgY2FjaGVBbm5vdGF0aW9uLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7Ci0JCQotCQljYWNoaW5nLnNldEV4cGlyeShJbnRlZ2VyLnZhbHVlT2YoOTAwKSk7Ci0JCQotCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQlhc3NlcnROdWxsKGNhY2hlQW5ub3RhdGlvbi5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoOTAwKSwgY2FjaGVBbm5vdGF0aW9uLmdldEV4cGlyeSgpKTsJCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoOTAwKSwgY2FjaGluZy5nZXRFeHBpcnkoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGltZU9mRGF5RXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCi0JCWNhY2hlQW5ub3RhdGlvbi5hZGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVGltZU9mRGF5RXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0KLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXkgdGltZU9mRGF5RXhwaXJ5ID0gY2FjaGluZy5hZGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnROb3ROdWxsKGNhY2hlQW5ub3RhdGlvbi5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCWFzc2VydE5vdE51bGwoY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCWFzc2VydEVxdWFscyh0aW1lT2ZEYXlFeHBpcnksIGNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVGltZU9mRGF5RXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQljYWNoZUFubm90YXRpb24uYWRkRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydE5vdE51bGwoY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCQotCQljYWNoaW5nLnJlbW92ZUV4cGlyeVRpbWVPZkRheSgpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFRpbWVPZkRheUV4cGlyeVVuc2V0c0V4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWNhY2hpbmcuc2V0RXhwaXJ5KEludGVnZXIudmFsdWVPZig4MDApKTsKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODAwKSwgY2FjaGVBbm5vdGF0aW9uLmdldEV4cGlyeSgpKTsJCi0JCQotCQkKLQkJY2FjaGluZy5hZGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQotCQkKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkJYXNzZXJ0TnVsbChjYWNoZUFubm90YXRpb24uZ2V0RXhwaXJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKGNhY2hlQW5ub3RhdGlvbi5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMTAwLCBjYWNoaW5nLmdldFNpemUoKSk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZFNpemUobmV3IEludGVnZXIoNTApKTsKLQkJCi0JCQotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTApLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTaXplKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDUwKSwgY2FjaGVBbm5vdGF0aW9uLmdldFNpemUoKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgY2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLnNldFByb3BlcnR5KENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfU0laRV9ERUZBVUxULCAiMzMzIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMzMzLCBjYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxMDAsIGNhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQljYWNoZUFubm90YXRpb24uc2V0U2l6ZShuZXcgSW50ZWdlcig1MCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIGNhY2hlQW5ub3RhdGlvbi5nZXRTaXplKCkpOwkJCQkKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDUwKSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkSXNvbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIuU0hBUkVELCBjYWNoaW5nLmdldElzb2xhdGlvbigpKTsKLQotCQljYWNoaW5nLnNldFNwZWNpZmllZElzb2xhdGlvbihFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMi5QUk9URUNURUQpOwotCi0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yLlBST1RFQ1RFRCwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRJc29sYXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMi5QUk9URUNURUQsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0SXNvbGF0aW9uKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0KLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlSXNvbGF0aW9uVHlwZTJfMi5QUk9URUNURUQsIGNhY2hlQW5ub3RhdGlvbi5nZXRJc29sYXRpb24oKSk7CQkKLQotCi0JCS8vc2V0IHNwZWNpZmllZCBjb29yZGluYXRpb24gdHlwZSB0byB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdCwgdmVyaWZ5IGl0IGlzIG5vdCBzZXQgdG8gZGVmYXVsdAotCQljYWNoaW5nLnNldFNwZWNpZmllZElzb2xhdGlvbihFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMi5TSEFSRUQpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIuU0hBUkVELCBjYWNoaW5nLmdldFNwZWNpZmllZElzb2xhdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlSXNvbGF0aW9uVHlwZTJfMi5TSEFSRUQsIGNhY2hlQW5ub3RhdGlvbi5nZXRJc29sYXRpb24oKSk7CQkKLQotCQljYWNoaW5nLnNldFNwZWNpZmllZElzb2xhdGlvbihudWxsKTsKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldFNwZWNpZmllZElzb2xhdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yLlNIQVJFRCwgY2FjaGluZy5nZXRJc29sYXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZElzb2xhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yLlNIQVJFRCwgY2FjaGluZy5nZXRJc29sYXRpb24oKSk7Ci0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRTcGVjaWZpZWRJc29sYXRpb24oKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWNhY2hlQW5ub3RhdGlvbi5zZXRJc29sYXRpb24ob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVJc29sYXRpb25UeXBlMl8yLlBST1RFQ1RFRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUlzb2xhdGlvblR5cGUyXzIuUFJPVEVDVEVELCBjYWNoZUFubm90YXRpb24uZ2V0SXNvbGF0aW9uKCkpOwkJCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yLlBST1RFQ1RFRCwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRJc29sYXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMi5QUk9URUNURUQsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0SXNvbGF0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQ29udmVydFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNvbnZlcnRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmYzZGEzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQ29udmVydFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFDb252ZXJ0VGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJUKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiY2xhc3MtaW5zdGFuY2VcIikiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFR5cGVDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImNsYXNzLWluc3RhbmNlXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAVHlwZUNvbnZlcnRlciIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YUNvbnZlcnRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0ZXJOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuTk9fQ09OVkVSVEVSLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5OT19DT05WRVJURVIsIGVjbGlwc2VMaW5rQ29udmVydC5nZXREZWZhdWx0Q29udmVydGVyTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydE5hbWUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuQ0xBU1NfSU5TVEFOQ0VfQ09OVkVSVEVSLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcyk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQkJCi0JCWVjbGlwc2VMaW5rQ29udmVydC5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCJmb28iKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24gY29udmVydEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQllY2xpcHNlTGlua0NvbnZlcnQuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZShudWxsKTsKLQkJY29udmVydEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChjb252ZXJ0QW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0QW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnRlck5hbWVVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24gY29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0LnNldFZhbHVlKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJOYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRTYW1lKGJhc2ljTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQ29udmVydGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQ29udmVydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE0Zjk5Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNvbnZlcnRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFDb252ZXJ0ZXJUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDb252ZXJ0ZXIobmFtZT1cImZvb1wiIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kQ29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDb252ZXJ0ZXIoY29udmVydGVyQ2xhc3M9Rm9vLmNsYXNzIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhQ29udmVydGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kQ29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0KLQkJCi0JCWNvbnZlcnRlci5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQotCi0JCWNvbnZlcnRlci5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWVVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kQ29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24uc2V0TmFtZSgiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROb3ROdWxsKGNvbnZlcnRlcik7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsJCi0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZENvbnZlcnRlckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kQ29udmVydGVyQ2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0KLQkJCi0JCWNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQotCi0JCWNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnRlckNsYXNzVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZENvbnZlcnRlckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldENvbnZlcnRlckNsYXNzKCJCYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROb3ROdWxsKGNvbnZlcnRlcik7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldENvbnZlcnRlckNsYXNzKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbWJlZGRhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFiM2Y2Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZVRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZVdpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRUREQUJMRSwgRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDdXN0b21pemVyKEZvby5jbGFzcyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRhYmxlV2l0aENoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRUREQUJMRSwgRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQENoYW5nZVRyYWNraW5nIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyID0gKChFY2xpcHNlTGlua0VtYmVkZGFibGUpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q3VzdG9taXplcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlV2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplciA9ICgoRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldEN1c3RvbWl6ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCWN1c3RvbWl6ZXIuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIGN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCi0JCQotCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uKTsKLQotCi0JCWN1c3RvbWl6ZXIuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDdXN0b21pemVyQ2xhc3NVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyID0gZW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljdXN0b21pemVyQW5ub3RhdGlvbi5zZXRWYWx1ZSgiQmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQljdXN0b21pemVyQW5ub3RhdGlvbi5zZXRWYWx1ZSgiRm9vQmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhciIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlV2l0aENoYW5nZVRyYWNraW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY29udGV4dENoYW5nZVRyYWNraW5nID0gZW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiByZXNvdXJjZUNoYW5nZVRyYWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgY29udGV4dCB2YWx1ZQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIEFUVFJJQlVURSBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gT0JKRUNUIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBERUZFUlJFRCBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBBVVRPIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgdmFsdWUgZnJvbSByZXNvdXJjZSwgdGVzdCBjb250ZXh0Ci0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm5vdGF0aW9uLCB0ZXh0IGNvbnRleHQKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlV2l0aENoYW5nZVRyYWNraW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY29udGV4dENoYW5nZVRyYWNraW5nID0gZW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiByZXNvdXJjZUNoYW5nZVRyYWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgcmVzb3VyY2UgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gQVVUTyBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBBVFRSSUJVVEUgc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gT0JKRUNUIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIERFRkVSUkVEIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIG51bGwsIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIEFVVE8gc3BlY2lmaWNhbGx5ICh0aGlzIHRpbWUgZnJvbSBubyBhbm5vdGF0aW9uKSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbnRpdHlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbnRpdHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzI3OWVhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW50aXR5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWFkT25seTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUVudGl0eVRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEN1c3RvbWl6ZXIoRm9vLmNsYXNzIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkcpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDaGFuZ2VUcmFja2luZyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5SRUFEX09OTFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFJlYWRPbmx5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YUVudGl0eVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfTUFQX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChFY2xpcHNlTGlua01hcHBpbmdLZXlzLlRSQU5TRk9STUFUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChFY2xpcHNlTGlua01hcHBpbmdLZXlzLlZBUklBQkxFX09ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyID0gKChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDdXN0b21pemVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSAoKEVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldEN1c3RvbWl6ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCWN1c3RvbWl6ZXIuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIGN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCi0JCQotCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uKTsKLQotCi0JCWN1c3RvbWl6ZXIuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDdXN0b21pemVyQ2xhc3NVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSBlbnRpdHkuZ2V0Q3VzdG9taXplcigpOwotCi0JCWFzc2VydEVxdWFscygiRm9vIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIGN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY3VzdG9taXplckFubm90YXRpb24uc2V0VmFsdWUoIkJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJY3VzdG9taXplckFubm90YXRpb24uc2V0VmFsdWUoIkZvb0JhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENoYW5nZVRyYWNraW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY29udGV4dENoYW5nZVRyYWNraW5nID0gZW50aXR5LmdldENoYW5nZVRyYWNraW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQkvLyBiYXNlIGFubm90YXRlZCwgdGVzdCBjb250ZXh0IHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIEFUVFJJQlVURSBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIE9CSkVDVCBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIERFRkVSUkVEIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBBVVRPIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIHZhbHVlIGZyb20gcmVzb3VyY2UsIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGFubm90YXRpb24sIHRleHQgY29udGV4dAotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ2hhbmdlVHJhY2tpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBjb250ZXh0Q2hhbmdlVHJhY2tpbmcgPSBlbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gcmVzb3VyY2VDaGFuZ2VUcmFja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IHJlc291cmNlIHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIEFVVE8gc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gQVRUUklCVVRFIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIE9CSkVDVCBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBERUZFUlJFRCBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBudWxsLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBBVVRPIHNwZWNpZmljYWxseSAodGhpcyB0aW1lIGZyb20gbm8gYW5ub3RhdGlvbiksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtFbnRpdHkgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZE9ubHkuaXNSZWFkT25seSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhSZWFkT25seSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rRW50aXR5IG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JfQotCi0JLy9UT0RPIHRlc3QgaW5oZXJpdGluZyBhIGRlZmF1bHQgcmVhZG9ubHkgZnJvbSB5b3Ugc3VwZXJjbGFzcwotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhSZWFkT25seSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rRW50aXR5IG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWFkT25seS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhSZWFkT25seSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rRW50aXR5IG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRPbmx5LmlzUmVhZE9ubHkoKSk7Ci0JCQotCQlyZWFkT25seS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ly9Cb29sZWFuLkZBTFNFIGFuZCBudWxsIHJlYWxseSBtZWFuIHRoZSBzYW1lIHRoaW5nIHNpbmNlIHRoZXJlIGFyZSBvbmx5IDIgc3RhdGVzIGluIHRoZSBqYXZhIHJlc291cmNlIG1vZGVsCi0KLQkJcmVhZE9ubHkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0KLQkJcmVhZE9ubHkuc2V0U3BlY2lmaWVkUmVhZE9ubHkobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ly9Cb29sZWFuLkZBTFNFIGFuZCBudWxsIHJlYWxseSBtZWFuIHRoZSBzYW1lIHRoaW5nIHNpbmNlIHRoZXJlIGFyZSBvbmx5IDIgc3RhdGVzIGluIHRoZSBqYXZhIHJlc291cmNlIG1vZGVsCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRSZWFkT25seVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtFbnRpdHkgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwocmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcmVhZE9ubHkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhSWRNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhSWRNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3YTk1Ni4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2VUZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFJZE1hcHBpbmdUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgRWNsaXBzZUxpbmsuQ09OVkVSVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJjbGFzcy1pbnN0YW5jZVwiKSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgRWNsaXBzZUxpbmsuTVVUQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE11dGFibGUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUlkRGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBFY2xpcHNlTGluay5NVVRBQkxFLCAiamF2YS51dGlsLkRhdGUiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE11dGFibGUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgRGF0ZSBteURhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFJZE1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkNMQVNTX0lOU1RBTkNFX0NPTlZFUlRFUiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGVtcG9yYWxBbm5vdGF0aW9uIHRlbXBvcmFsID0gKFRlbXBvcmFsQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5USU1FLCB0ZW1wb3JhbC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnRVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24gY29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0LnNldFZhbHVlKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJOYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRTYW1lKGlkTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVJZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtJZE1hcHBpbmcgaWRNYXBwaW5nID0gKEVjbGlwc2VMaW5rSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGUgPSBpZE1hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uIG11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uVFJVRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCi0JCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCi0JCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlSWQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rSWRNYXBwaW5nIGlkTWFwcGluZyA9IChFY2xpcHNlTGlua0lkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gaWRNYXBwaW5nLmdldE11dGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiBtdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCi0JCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUobnVsbCk7Ci0JCW11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlQW5ub3RhdGlvbik7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQltdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0TXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVJZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtJZE1hcHBpbmcgaWRNYXBwaW5nID0gKEVjbGlwc2VMaW5rSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGUgPSBpZE1hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQkvL3NldCBtdXRhYmxlIGRlZmF1bHQgdG8gZmFsc2UgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQgcHJvcGVydGllcywgdmVyaWZ5IGRlZmF1bHQgaW4gamF2YSBzdGlsbCB0cnVlIHNpbmNlIHRoaXMgaXMgbm90IGEgRGF0ZS9DYWxlbmRhcgotCQkoZ2V0UGVyc2lzdGVuY2VVbml0KCkpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0TXV0YWJsZUZvckRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlSWREYXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0lkTWFwcGluZyBpZE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IGlkTWFwcGluZy5nZXRNdXRhYmxlKCk7Ci0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwkKLQkJYXNzZXJ0RmFsc2UobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJLy9zZXQgbXV0YWJsZSBkZWZhdWx0IHRvIGZhbHNlIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHByb3BlcnRpZXMsIHZlcmlmeSBkZWZhdWx0IGluIGphdmEgc3RpbGwgdHJ1ZSBzaW5jZSB0aGlzIGlzIG5vdCBhIERhdGUvQ2FsZW5kYXIKLQkJKGdldFBlcnNpc3RlbmNlVW5pdCgpKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJKGdldFBlcnNpc3RlbmNlVW5pdCgpKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQkoZ2V0UGVyc2lzdGVuY2VVbml0KCkpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUobnVsbCk7Ci0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVJZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtJZE1hcHBpbmcgaWRNYXBwaW5nID0gKEVjbGlwc2VMaW5rSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGUgPSBpZE1hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNNdXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzTXV0YWJsZSgpKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwkKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzTXV0YWJsZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjdjYWI5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE1hbnlUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEpvaW5GZXRjaCIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Sm9pbkZldGNoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2ggY29udGV4dEpvaW5GZXRjaCA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5GZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IGNvbnRleHQgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5JTk5FUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBPVVRFUiwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIHZhbHVlIGZyb20gcmVzb3VyY2UsIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYW5ub3RhdGlvbiwgdGV4dCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRKb2luRmV0Y2hWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaCBjb250ZXh0Sm9pbkZldGNoID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgcmVzb3VyY2UgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIElOTkVSIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gT1VURVIsIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgdG8gbnVsbCwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gSU5ORVIgc3BlY2lmaWNhbGx5ICh0aGlzIHRpbWUgZnJvbSBubyBhbm5vdGF0aW9uKSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQlqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMzQ2ZTguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hNYW55VG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBKb2luRmV0Y2giKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRKb2luRmV0Y2hWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE1hbnlUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoIGNvbnRleHRKb2luRmV0Y2ggPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQkvLyBiYXNlIGFubm90YXRlZCwgdGVzdCBjb250ZXh0IHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gSU5ORVIgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJCi0JCWpvaW5GZXRjaEFubm90YXRpb24uc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gT1VURVIsIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5PVVRFUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSB2YWx1ZSBmcm9tIHJlc291cmNlLCB0ZXN0IGNvbnRleHQKLQkJCi0JCWpvaW5GZXRjaEFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGFubm90YXRpb24sIHRleHQgY29udGV4dAotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Sm9pbkZldGNoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hNYW55VG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaCBjb250ZXh0Sm9pbkZldGNoID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgcmVzb3VyY2UgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIElOTkVSIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gT1VURVIsIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgdG8gbnVsbCwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gSU5ORVIgc3BlY2lmaWNhbGx5ICh0aGlzIHRpbWUgZnJvbSBubyBhbm5vdGF0aW9uKSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQlqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OTRjMjQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlYWRPbmx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEVjbGlwc2VMaW5rLlJFQURfT05MWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFJlYWRPbmx5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQ3VzdG9taXplcihGb28uY2xhc3MiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkcpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQ2hhbmdlVHJhY2tpbmciKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCByZWFkT25seS5pc1JlYWRPbmx5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhSZWFkT25seSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQl9Ci0KLQkvL1RPRE8gdGVzdCBpbmhlcml0aW5nIGEgZGVmYXVsdCByZWFkb25seSBmcm9tIHlvdSBzdXBlcmNsYXNzCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhSZWFkT25seSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHJlYWRPbmx5LmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhSZWFkT25seSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZE9ubHkuaXNSZWFkT25seSgpKTsKLQkJCi0JCXJlYWRPbmx5LnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsvL0Jvb2xlYW4uRkFMU0UgYW5kIG51bGwgcmVhbGx5IG1lYW4gdGhlIHNhbWUgdGhpbmcgc2luY2UgdGhlcmUgYXJlIG9ubHkgMiBzdGF0ZXMgaW4gdGhlIGphdmEgcmVzb3VyY2UgbW9kZWwKLQotCQlyZWFkT25seS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQotCQlyZWFkT25seS5zZXRTcGVjaWZpZWRSZWFkT25seShudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsvL0Jvb2xlYW4uRkFMU0UgYW5kIG51bGwgcmVhbGx5IG1lYW4gdGhlIHNhbWUgdGhpbmcgc2luY2UgdGhlcmUgYXJlIG9ubHkgMiBzdGF0ZXMgaW4gdGhlIGphdmEgcmVzb3VyY2UgbW9kZWwKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZFJlYWRPbmx5VXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWFkT25seS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplciA9ICgoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldEN1c3RvbWl6ZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSAoKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDdXN0b21pemVyKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBjdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQkKLQkJY3VzdG9taXplci5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyQW5ub3RhdGlvbik7Ci0KLQotCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VzdG9taXplckNsYXNzVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplciA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpOwotCi0JCWFzc2VydEVxdWFscygiRm9vIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIGN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY3VzdG9taXplckFubm90YXRpb24uc2V0VmFsdWUoIkJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJY3VzdG9taXplckFubm90YXRpb24uc2V0VmFsdWUoIkZvb0JhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDaGFuZ2VUcmFja2luZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNvbnRleHRDaGFuZ2VUcmFja2luZyA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gcmVzb3VyY2VDaGFuZ2VUcmFja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IGNvbnRleHQgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gQVRUUklCVVRFIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gT0JKRUNUIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gREVGRVJSRUQgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIEFVVE8gc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgdmFsdWUgZnJvbSByZXNvdXJjZSwgdGVzdCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYW5ub3RhdGlvbiwgdGV4dCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ2hhbmdlVHJhY2tpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBjb250ZXh0Q2hhbmdlVHJhY2tpbmcgPSBtYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQkvLyBiYXNlIGFubm90YXRlZCwgdGVzdCByZXNvdXJjZSB2YWx1ZQotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBBVVRPIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIEFUVFJJQlVURSBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBPQkpFQ1Qgc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gREVGRVJSRUQgc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gbnVsbCwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gQVVUTyBzcGVjaWZpY2FsbHkgKHRoaXMgdGltZSBmcm9tIG5vIGFubm90YXRpb24pLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT2JqZWN0VHlwZUNvbnZlcnRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjQ2YTRkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT2JqZWN0VHlwZUNvbnZlcnRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFPYmplY3RUeXBlQ29udmVydGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPYmplY3RUeXBlQ29udmVydGVyKG5hbWU9XCJmb29cIiwgZGVmYXVsdE9iamVjdFZhbHVlPVwiYmFyXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kRGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPYmplY3RUeXBlQ29udmVydGVyKGRhdGFUeXBlPUZvby5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT2JqZWN0VHlwZUNvbnZlcnRlcihvYmplY3RUeXBlPUZvby5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyQ29udmVyc2lvblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT2JqZWN0VHlwZUNvbnZlcnRlcihuYW1lPVwiZm9vXCIsIGRlZmF1bHRPYmplY3RWYWx1ZT1cImJhclwiLCBjb252ZXJzaW9uVmFsdWVzID0gQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWU9XCJmXCIsIG9iamVjdFZhbHVlPVwiZmVtYWxlXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhT2JqZWN0VHlwZUNvbnZlcnRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQotCQkKLQkJY29udmVydGVyLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0KLQotCQljb252ZXJ0ZXIuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWVVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24uc2V0TmFtZSgiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE5vdE51bGwoY29udmVydGVyKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24uc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kRGF0YVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZERhdGFUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0RGF0YVR5cGUoKSk7Ci0KLQkJCi0JCWNvbnZlcnRlci5zZXREYXRhVHlwZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldERhdGFUeXBlKCkpOwotCi0KLQkJY29udmVydGVyLnNldERhdGFUeXBlKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0RGF0YVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREYXRhVHlwZVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmREYXRhVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldERhdGFUeXBlKCJCYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE5vdE51bGwoY29udmVydGVyKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24uc2V0RGF0YVR5cGUoIkZvb0JhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIiLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0T2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0T2JqZWN0VHlwZSgiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE9iamVjdFR5cGUoKSk7Ci0KLQkJCi0JCWNvbnZlcnRlci5zZXRPYmplY3RUeXBlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRPYmplY3RUeXBlKCkpOwotCi0KLQkJY29udmVydGVyLnNldE9iamVjdFR5cGUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE9iamVjdFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRPYmplY3RUeXBlVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldE9iamVjdFR5cGUoIkJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROb3ROdWxsKGNvbnZlcnRlcik7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldE9iamVjdFR5cGUoIkZvb0JhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIiLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsJCi0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb252ZXJzaW9uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSA9IGNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCk7Ci0JCWNvbnZlcnNpb25WYWx1ZS5zZXREYXRhVmFsdWUoIkYiKTsKLQkJY29udmVyc2lvblZhbHVlLnNldE9iamVjdFZhbHVlKCJmZW1hbGUiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IHJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSA9IHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRiIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZW1hbGUiLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZTIgPSBjb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApOwotCQljb252ZXJzaW9uVmFsdWUyLnNldERhdGFWYWx1ZSgiTSIpOwotCQljb252ZXJzaW9uVmFsdWUyLnNldE9iamVjdFZhbHVlKCJtYWxlIik7Ci0JCQotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSA9IHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTSIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYWxlIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCXJlc291cmNlQ29udmVyc2lvblZhbHVlID0gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZlbWFsZSIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCQkKLQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlMyA9IGNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMSk7Ci0JCWNvbnZlcnNpb25WYWx1ZTMuc2V0RGF0YVZhbHVlKCJPIik7Ci0JCWNvbnZlcnNpb25WYWx1ZTMuc2V0T2JqZWN0VmFsdWUoIm1hbGUiKTsKLQkJCi0JCXJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXJlc291cmNlQ29udmVyc2lvblZhbHVlID0gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hbGUiLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUgPSByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk8iLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygibWFsZSIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSA9IHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRiIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZW1hbGUiLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhjb252ZXJzaW9uVmFsdWUyLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhjb252ZXJzaW9uVmFsdWUzLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhjb252ZXJzaW9uVmFsdWUsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpKTsKLQkJCi0JCWNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiTSIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb252ZXJzaW9uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApLnNldERhdGFWYWx1ZSgiRiIpOwotCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDEpLnNldERhdGFWYWx1ZSgiTSIpOwotCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDIpLnNldERhdGFWYWx1ZSgiTyIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQ29udmVyc2lvblZhbHVlcykpOwotCQkKLQkJY29udmVydGVyLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgwKTsKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQ29udmVyc2lvblZhbHVlcykpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIk0iLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0KLQkJY29udmVydGVyLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgwKTsKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQ29udmVyc2lvblZhbHVlcykpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIk8iLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5yZW1vdmVDb252ZXJzaW9uVmFsdWUoMCk7Ci0JCXJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUNvbnZlcnNpb25WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQotCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApLnNldERhdGFWYWx1ZSgiRiIpOwotCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDEpLnNldERhdGFWYWx1ZSgiTSIpOwotCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDIpLnNldERhdGFWYWx1ZSgiTyIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQ29udmVyc2lvblZhbHVlcykpOwotCQkKLQkJY29udmVydGVyLm1vdmVDb252ZXJzaW9uVmFsdWUoMiwwKTsKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQ29udmVyc2lvblZhbHVlcykpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIk0iLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRiIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQkKLQkJY29udmVydGVyLm1vdmVDb252ZXJzaW9uVmFsdWUoMCwxKTsKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQ29udmVyc2lvblZhbHVlcykpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIk8iLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRiIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ29udmVyc2lvblZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24uYWRkQ29udmVyc2lvblZhbHVlKDApLnNldERhdGFWYWx1ZSgiRiIpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLmFkZENvbnZlcnNpb25WYWx1ZSgxKS5zZXREYXRhVmFsdWUoIk0iKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5hZGRDb252ZXJzaW9uVmFsdWUoMikuc2V0RGF0YVZhbHVlKCJPIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRiIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk8iLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24ubW92ZUNvbnZlcnNpb25WYWx1ZSgyLCAwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiTSIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24ubW92ZUNvbnZlcnNpb25WYWx1ZSgwLCAxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiTyIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24ucmVtb3ZlQ29udmVyc2lvblZhbHVlKDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJPIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24ucmVtb3ZlQ29udmVyc2lvblZhbHVlKDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJPIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnNpb25WYWx1ZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCi0JCWFzc2VydEVxdWFscygwLCBjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLmFkZENvbnZlcnNpb25WYWx1ZSgwKS5zZXREYXRhVmFsdWUoIkYiKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5hZGRDb252ZXJzaW9uVmFsdWUoMSkuc2V0RGF0YVZhbHVlKCJNIik7Ci0JCWNvbnZlcnRlckFubm90YXRpb24uYWRkQ29udmVyc2lvblZhbHVlKDIpLnNldERhdGFWYWx1ZSgiTyIpOwotCQkKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0T2JqZWN0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldERlZmF1bHRPYmplY3RWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQkKLQkJY29udmVydGVyLnNldERlZmF1bHRPYmplY3RWYWx1ZSgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoImJheiIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCi0JCQotCQljb252ZXJ0ZXIuc2V0RGVmYXVsdE9iamVjdFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQotCi0JCWNvbnZlcnRlci5zZXREZWZhdWx0T2JqZWN0VmFsdWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE9iamVjdFZhbHVlVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24uc2V0RGVmYXVsdE9iamVjdFZhbHVlKCJiYXoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROb3ROdWxsKGNvbnZlcnRlcik7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldERlZmF1bHRPYmplY3RWYWx1ZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6ZUNvbnZlcnNpb25WYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlckNvbnZlcnNpb25WYWx1ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgY29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImYiLCBjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZW1hbGUiLCBjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE9iamVjdFZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjA2YTQ5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFByaXZhdGVPd25lZE9uZVRvTWFueSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBFY2xpcHNlTGluay5QUklWQVRFX09XTkVEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFByaXZhdGVPd25lZCIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hPbmVUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBKb2luRmV0Y2giKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvTWFueSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoInByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248IiArIFRZUEVfTkFNRSArICI+IG15VHlwZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldFByaXZhdGVPd25lZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaXZhdGVPd25lZE9uZVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgcHJpdmF0ZU93bmFibGUgPSBvbmVUb01hbnlNYXBwaW5nLmdldFByaXZhdGVPd25lZCgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFByaXZhdGVPd25lZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaXZhdGVPd25lZE9uZVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgcHJpdmF0ZU93bmFibGUgPSBvbmVUb01hbnlNYXBwaW5nLmdldFByaXZhdGVPd25lZCgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQlwcml2YXRlT3duYWJsZS5zZXRQcml2YXRlT3duZWQoZmFsc2UpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOwotCi0JCXByaXZhdGVPd25hYmxlLnNldFByaXZhdGVPd25lZCh0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcml2YXRlT3duZWRVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcml2YXRlT3duZWRPbmVUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIHByaXZhdGVPd25hYmxlID0gb25lVG9NYW55TWFwcGluZy5nZXRQcml2YXRlT3duZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Sm9pbkZldGNoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hPbmVUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaCBjb250ZXh0Sm9pbkZldGNoID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgY29udGV4dCB2YWx1ZQotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIElOTkVSIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIE9VVEVSLCB0ZXN0IGNvbnRleHQKLQkJCi0JCWpvaW5GZXRjaEFubm90YXRpb24uc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyByZW1vdmUgdmFsdWUgZnJvbSByZXNvdXJjZSwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm5vdGF0aW9uLCB0ZXh0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEpvaW5GZXRjaFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSm9pbkZldGNoT25lVG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2ggY29udGV4dEpvaW5GZXRjaCA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5GZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IHJlc291cmNlIHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIE9VVEVSLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5PVVRFUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IHRvIG51bGwsIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIElOTkVSIHNwZWNpZmljYWxseSAodGhpcyB0aW1lIGZyb20gbm8gYW5ub3RhdGlvbiksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBtYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwIHJlbCA9IG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXAgcmVsID0gbWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRNYXBwZWRCeShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55U2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nLmdldEZldGNoKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkxBWlksIGFubm90YXRpb24uZ2V0RmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55U2V0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIkZvbyIpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGFubm90YXRpb24uZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvTWFueVNldE1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIkZvbyIpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55U2V0Q2FzY2FkZUFsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldEFsbCh0cnVlKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLmlzQWxsKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYW5ub3RhdGlvbi5pc0Nhc2NhZGVBbGwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55U2V0Q2FzY2FkZU1lcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5pc01lcmdlKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYW5ub3RhdGlvbi5pc0Nhc2NhZGVNZXJnZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb01hbnlTZXRDYXNjYWRlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhbm5vdGF0aW9uLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55U2V0Q2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuaXNSZWZyZXNoKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYW5ub3RhdGlvbi5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvTWFueVNldENhc2NhZGVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5pc1JlbW92ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGFubm90YXRpb24uaXNDYXNjYWRlUmVtb3ZlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFkMjUzNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewkKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFByaXZhdGVPd25lZE9uZVRvT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSwgRWNsaXBzZUxpbmsuUFJJVkFURV9PV05FRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFByaXZhdGVPd25lZCIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hPbmVUb09uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBKb2luRmV0Y2giKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoImltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgicHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBteVR5cGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UHJpdmF0ZU93bmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpdmF0ZU93bmVkT25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIHByaXZhdGVPd25hYmxlID0gb25lVG9PbmVNYXBwaW5nLmdldFByaXZhdGVPd25lZCgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFByaXZhdGVPd25lZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaXZhdGVPd25lZE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBwcml2YXRlT3duYWJsZSA9IG9uZVRvT25lTWFwcGluZy5nZXRQcml2YXRlT3duZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOwotCQkKLQkJcHJpdmF0ZU93bmFibGUuc2V0UHJpdmF0ZU93bmVkKGZhbHNlKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBwcml2YXRlT3duYWJsZS5pc1ByaXZhdGVPd25lZCgpKTsKLQotCQlwcml2YXRlT3duYWJsZS5zZXRQcml2YXRlT3duZWQodHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJpdmF0ZU93bmVkVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpdmF0ZU93bmVkT25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIHByaXZhdGVPd25hYmxlID0gb25lVG9PbmVNYXBwaW5nLmdldFByaXZhdGVPd25lZCgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRKb2luRmV0Y2hWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2ggY29udGV4dEpvaW5GZXRjaCA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5GZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IGNvbnRleHQgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5JTk5FUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBPVVRFUiwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIHZhbHVlIGZyb20gcmVzb3VyY2UsIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYW5ub3RhdGlvbiwgdGV4dCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRKb2luRmV0Y2hWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2ggY29udGV4dEpvaW5GZXRjaCA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5GZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IHJlc291cmNlIHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIE9VVEVSLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5PVVRFUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IHRvIG51bGwsIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIElOTkVSIHNwZWNpZmljYWxseSAodGhpcyB0aW1lIGZyb20gbm8gYW5ub3RhdGlvbiksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwkKLQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIGF0dHJpYnV0ZXMubmV4dCgpLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lU2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIHNwZWNpZmllZE9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSwgYW5ub3RhdGlvbi5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb09uZVNldFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIHNwZWNpZmllZE9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGFubm90YXRpb24uZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lU2V0TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgiRm9vIik7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9PbmVTZXRDYXNjYWRlQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5pc0FsbCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGFubm90YXRpb24uaXNDYXNjYWRlQWxsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lU2V0Q2FzY2FkZU1lcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLmlzTWVyZ2UoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhbm5vdGF0aW9uLmlzQ2FzY2FkZU1lcmdlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lU2V0Q2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRQZXJzaXN0KHRydWUpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhbm5vdGF0aW9uLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9PbmVTZXRDYXNjYWRlUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlZnJlc2godHJ1ZSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLmlzUmVmcmVzaCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGFubm90YXRpb24uaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb09uZVNldENhc2NhZGVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLmlzUmVtb3ZlKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYW5ub3RhdGlvbi5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFTdHJ1Y3RDb252ZXJ0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFTdHJ1Y3RDb252ZXJ0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTZjYWU2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhU3RydWN0Q29udmVydGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YVN0cnVjdENvbnZlcnRlclRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRTdHJ1Y3RDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAU3RydWN0Q29udmVydGVyKG5hbWU9XCJmb29cIiIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFN0cnVjdENvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImZvb1wiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFN0cnVjdENvbnZlcnRlcihjb252ZXJ0ZXI9XCJGb29cIiIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YVN0cnVjdENvbnZlcnRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kU3RydWN0Q29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFN0cnVjdENvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCi0JCQotCQljb252ZXJ0ZXIuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0KLQotCQljb252ZXJ0ZXIuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFN0cnVjdENvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldE5hbWUoImJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0Tm90TnVsbChjb252ZXJ0ZXIpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29udmVydGVyLmdldE5hbWUoKSk7CQotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRTdHJ1Y3RDb252ZXJ0ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFN0cnVjdENvbnZlcnRlckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQkKLQkJY29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldENvbnZlcnRlcigpKTsKLQotCQkKLQkJY29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldENvbnZlcnRlcigpKTsKLQotCi0JCWNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJ0ZXIoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0ZXJDbGFzc1VwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRTdHJ1Y3RDb252ZXJ0ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRDb252ZXJ0ZXIoIkJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE5vdE51bGwoY29udmVydGVyKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24uc2V0Q29udmVydGVyKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVR5cGVDb252ZXJ0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFUeXBlQ29udmVydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1YTdiOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVR5cGVDb252ZXJ0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFUeXBlQ29udmVydGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFR5cGVDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImZvb1wiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFR5cGVDb252ZXJ0ZXIobmFtZT1cImZvb1wiIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kRGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImZvb1wiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFR5cGVDb252ZXJ0ZXIoZGF0YVR5cGU9Rm9vLmNsYXNzIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAVHlwZUNvbnZlcnRlcihvYmplY3RUeXBlPUZvby5jbGFzcyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YVR5cGVDb252ZXJ0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFR5cGVDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFR5cGVDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCi0JCQotCQljb252ZXJ0ZXIuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQotCi0JCWNvbnZlcnRlci5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRUeXBlQ29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXROYW1lKCJiYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0Tm90TnVsbChjb252ZXJ0ZXIpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kRGF0YVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZERhdGFUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0RGF0YVR5cGUoKSk7Ci0KLQkJCi0JCWNvbnZlcnRlci5zZXREYXRhVHlwZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldERhdGFUeXBlKCkpOwotCi0KLQkJY29udmVydGVyLnNldERhdGFUeXBlKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0RGF0YVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREYXRhVHlwZVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmREYXRhVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldERhdGFUeXBlKCJCYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE5vdE51bGwoY29udmVydGVyKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24uc2V0RGF0YVR5cGUoIkZvb0JhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkKLQkJY29udmVydGVyLnNldE9iamVjdFR5cGUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRPYmplY3RUeXBlKCkpOwotCi0JCQotCQljb252ZXJ0ZXIuc2V0T2JqZWN0VHlwZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0T2JqZWN0VHlwZSgpKTsKLQotCi0JCWNvbnZlcnRlci5zZXRPYmplY3RUeXBlKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRPYmplY3RUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0T2JqZWN0VHlwZVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRPYmplY3RUeXBlKCJCYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0Tm90TnVsbChjb252ZXJ0ZXIpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRPYmplY3RUeXBlKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7CQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVmVyc2lvbk1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYjEzNjMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZVRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011dGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhVmVyc2lvbk1hcHBpbmdUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlZFUlNJT04pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFZlcnNpb24iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVkVSU0lPTiwgRWNsaXBzZUxpbmsuQ09OVkVSVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVmVyc2lvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImNsYXNzLWluc3RhbmNlXCIpIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVWZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVkVSU0lPTiwgRWNsaXBzZUxpbmsuTVVUQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVmVyc2lvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATXV0YWJsZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlVmVyc2lvbkRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5WRVJTSU9OLCBFY2xpcHNlTGluay5NVVRBQkxFLCAiamF2YS51dGlsLkRhdGUiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBWZXJzaW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATXV0YWJsZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBEYXRlIG15RGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhVmVyc2lvbk1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5DTEFTU19JTlNUQU5DRV9DT05WRVJURVIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwodmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCXZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUZW1wb3JhbEFubm90YXRpb24gdGVtcG9yYWwgPSAoVGVtcG9yYWxBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlLlRJTUUsIHRlbXBvcmFsLmdldFZhbHVlKCkpOwotCQkKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0VXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbiBjb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWNvbnZlcnQuc2V0VmFsdWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJOYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZSh2ZXJzaW9uTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVWZXJzaW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKEVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IHZlcnNpb25NYXBwaW5nLmdldE11dGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiBtdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLlRSVUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZVZlcnNpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gdmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uIG11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShudWxsKTsKLQkJbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGVBbm5vdGF0aW9uKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCW11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZVZlcnNpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gdmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQkvL3NldCBtdXRhYmxlIGRlZmF1bHQgdG8gZmFsc2UgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQgcHJvcGVydGllcywgdmVyaWZ5IGRlZmF1bHQgaW4gamF2YSBzdGlsbCB0cnVlIHNpbmNlIHRoaXMgaXMgbm90IGEgRGF0ZS9DYWxlbmRhcgotCQkoZ2V0UGVyc2lzdGVuY2VVbml0KCkpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0TXV0YWJsZUZvckRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlVmVyc2lvbkRhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gdmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCi0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCS8vc2V0IG11dGFibGUgZGVmYXVsdCB0byBmYWxzZSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCBwcm9wZXJ0aWVzLCB2ZXJpZnkgZGVmYXVsdCBpbiBqYXZhIHN0aWxsIHRydWUgc2luY2UgdGhpcyBpcyBub3QgYSBEYXRlL0NhbGVuZGFyCi0JCShnZXRQZXJzaXN0ZW5jZVVuaXQoKSkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCShnZXRQZXJzaXN0ZW5jZVVuaXQoKSkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJKGdldFBlcnNpc3RlbmNlVW5pdCgpKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKG51bGwpOwotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc011dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlVmVyc2lvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGUgPSB2ZXJzaW9uTWFwcGluZy5nZXRNdXRhYmxlKCk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc011dGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNNdXRhYmxlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CQotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNNdXRhYmxlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSnB0RWNsaXBzZUxpbmtDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0pwdEVjbGlwc2VMaW5rQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWFhMmQzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSnB0RWNsaXBzZUxpbmtDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YUNhY2hpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFDb252ZXJ0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFDb252ZXJ0VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YUVudGl0eVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMuY2xhc3MpOwkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtKYXZhT2JqZWN0VHlwZUNvbnZlcnRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdUZXN0cy5jbGFzcyk7CQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YVN0cnVjdENvbnZlcnRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YVR5cGVDb252ZXJ0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wSmF2YUNvbGxlY3Rpb25UYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wSmF2YUVudGl0eVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfMEphdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzNKYXZhTXVsdGl0ZW5hbmN5VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzJKYXZhRW50aXR5VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzJKYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0RWNsaXBzZUxpbmtDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsxXzFPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazFfMU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzM3NzgzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazFfMU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMV8xQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMV8xT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzIAotCWV4dGVuZHMgRWNsaXBzZUxpbmsxXzFDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazFfMU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4obmFtZT1cIkZPT1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmdQcm9wZXJ0eUFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lPVwiRk9PXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlU3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmFkZFRvWG1sKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1ha2VTcGVjaWZpZWRNYXBwaW5nS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQkvL3Rha2UgYSB2aXJ0dWFsIG1hcHBpbmcgd2l0aCBhIG1hcHBpbmcgdHlwZSBhbmQgbWFrZSBpdCBzcGVjaWZpZWQKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydE51bGwob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmFkZFRvWG1sKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRUcnVlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmFkZFRvWG1sKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHNwZWNpZmllZEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydFRydWUoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPcm1FY2xpcHNlTGlua0lkTWFwcGluZyk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuYWRkVG9YbWwoKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5hZGRUb1htbCgpOwotCi0JCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUucmVtb3ZlRnJvbVhtbCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLnJlbW92ZUZyb21YbWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJSXRlcmF0b3I8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiB2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsJCQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlVmlydHVhbE5vVW5kZXJseWluZ0phdmFBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmFkZFRvWG1sKCk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuYWRkVG9YbWwoKTsKLQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKS5zZXROYW1lKCJub0phdmFBdHRyaWJ1dGUiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5yZW1vdmVGcm9tWG1sKCk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdUeXBlV2hlbk1ldGFkYXRhQ29tcGxldGUoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgKChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdUeXBlV2hlbk1ldGFkYXRhQ29tcGxldGUyKCkgIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5T25lVG9PbmVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCQkKLQkJLy92aXJ0dWFsIG9ybSBhdHRyaWJ1dGUsIGFjY2VzcyB0eXBlIG1hdGNoZXMgamF2YSA6IEZJRUxELCBuYW1lIG1hdGNoZXMgamF2YQotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgamF2YVJlc291cmNlQXR0cmlidXRlID0gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JCWFzc2VydFRydWUoamF2YVJlc291cmNlQXR0cmlidXRlIGluc3RhbmNlb2YgSmF2YVJlc291cmNlRmllbGQpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YVJlc291cmNlQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpLCBqYXZhUmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJCi0JCS8vc3BlY2lmaWVkIG9ybSBhdHRyaWJ1dGUsIGFjY2VzcyB0eXBlIG1hdGNoZXMgamF2YSA6IEZJRUxELCBuYW1lIG1hdGNoZXMgamF2YQotCQkvL2phdmFQZXJzaXN0ZW50QXR0cmlidXRlIHNob3VsZCBiZSA9PSB0byBqYXZhIGNvbnRleHQgbW9kZWwgb2JqZWN0Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9YbWwoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRGYWxzZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQotCQkKLQkJLy92aXJ0dWFsIG9ybSBhdHRyaWJ1dGUsIGphdmEgYWNjZXNzIHR5cGUgRklFTEQsIG9ybSBhY2Nlc3MgdHlwZSBQUk9QRVJUWSwgbmFtZSBtYXRjaGVzIGphdmEKLQkJLy92ZXJpZnkgYm90aCB0aGUgcHJvcGVydHkgamF2YSByZXNvdXJjZSBhdHRyaWJ1dGUgYW5kIHRoZSBmaWVsZCBqYXZhIHJlc291cmNlIGF0dHJpYnV0ZSBhcmUgdXNlZCBpbiBvcm0KLQkJLy9iZWNhdXNlIHRoZSBmaWVsZCBpcyBhbm5vdGF0ZWQgYW5kIHByb3BlcnR5IGlzIHNwZWNpZmllZAotCQkoKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpLnJlbW92ZUZyb21YbWwoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgaWRGaWVsZEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgaWRQcm9wZXJ0eUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgaWRGaWVsZEF0dHJpYnV0ZSk7Ci0JCWFzc2VydE5vdFNhbWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgaWRQcm9wZXJ0eUF0dHJpYnV0ZSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBpZFByb3BlcnR5QXR0cmlidXRlOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGlkRmllbGRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCWphdmFSZXNvdXJjZUF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YVJlc291cmNlQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldE1ldGhvZHMoKS5pdGVyYXRvcigpLm5leHQoKSwgamF2YVJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MobnVsbCk7Ly9kZWZhdWx0IGFjY2VzcyB3aWxsIGJlIGZpZWxkCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsJCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCkuc2V0TmFtZSgiaWQyIik7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0KLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpLnNldE5hbWUoImlkIik7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0KLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZU1peGVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1GaWVsZEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUHJvcGVydHlBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtRmllbGRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUHJvcGVydHlBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0T3duaW5nUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUob3JtRmllbGRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRUcnVlKG9ybVByb3BlcnR5QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUHJvcGVydHlBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybUZpZWxkQXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVByb3BlcnR5QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQkKLQkJb3JtUHJvcGVydHlBdHRyaWJ1dGUuYWRkVG9YbWwoKTsKLQkJb3JtUHJvcGVydHlBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUHJvcGVydHlBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUHJvcGVydHlBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1Qcm9wZXJ0eUF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Qcm9wZXJ0eUF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuTUVUSE9EKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLkZJRUxEKTsKLQkJCi0JCSgoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgb3JtUHJvcGVydHlBdHRyaWJ1dGUpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJb3JtUHJvcGVydHlBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUHJvcGVydHlBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUHJvcGVydHlBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVByb3BlcnR5QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQlhc3NlcnRUcnVlKG9ybVByb3BlcnR5QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5GSUVMRCk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5GSUVMRCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJCi0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5GSUVMRCk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuRklFTEQpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5GSUVMRCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NQcm9wZXJ0eUluSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nUHJvcGVydHlBY2Nlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCQotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuTUVUSE9EKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLk1FVEhPRCk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuTUVUSE9EKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLk1FVEhPRCk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5NRVRIT0QpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazFfMU9ybVBlcnNpc3RlbnRUeXBlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazFfMU9ybVBlcnNpc3RlbnRUeXBlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg4MDcwYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsxXzFPcm1QZXJzaXN0ZW50VHlwZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazFfMUNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMU9ybVBlcnNpc3RlbnRUeXBlVGVzdHMgCi0JZXh0ZW5kcyBFY2xpcHNlTGluazFfMUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rMV8xT3JtUGVyc2lzdGVudFR5cGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lPVwiRk9PXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLS8vCQotLy8JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFjY2Vzc1R5cGVFbnVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycyhKUEFfQU5OT1RBVElPTlNfUEFDS0FHRV9OQU1FLCAiQWNjZXNzVHlwZSIsICJGSUVMRCwgUFJPUEVSVFk7Iik7CQotLy8JfQotLy8JCi0vLwlwcml2YXRlIHZvaWQgY3JlYXRlQWNjZXNzQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotLy8JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoSlBBX0FOTk9UQVRJT05TX1BBQ0tBR0VfTkFNRSwgIkFjY2VzcyIsICJBY2Nlc3NUeXBlIHZhbHVlKCk7Iik7Ci0vLwkJY3JlYXRlQWNjZXNzVHlwZUVudW0oKTsKLS8vCX0KLS8vCQotLy8JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZFByb3BlcnR5U3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlQWNjZXNzQW5ub3RhdGlvbigpOwotLy8JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLS8vCQkJQE92ZXJyaWRlCi0vLwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0vLwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMsIEpQQS5JRCwgSlBBLkFDQ0VTUywgSlBBLkFDQ0VTU19UWVBFKTsKLS8vCQkJfQotLy8JCQlAT3ZlcnJpZGUKLS8vCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0vLwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLS8vCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKSIpOwotLy8JCQl9Ci0vLwkKLS8vCQkJQE92ZXJyaWRlCi0vLwkJCXB1YmxpYyB2b2lkIGFwcGVuZE5hbWVGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0vLwkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpOwotLy8JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpIik7Ci0vLwkJCX0KLS8vCQkJCi0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0vLwkJCQlzYi5hcHBlbmQoIkBJZCIpOwotLy8JCQl9Ci0vLwkJfSk7Ci0vLwl9Ci0vLwkKLS8vCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5RmllbGRTcGVjaWZpZWRQcm9wZXJ0eUFubm90YXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZUFjY2Vzc0Fubm90YXRpb24oKTsKLS8vCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotLy8JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBKUEEuSUQsIEpQQS5BQ0NFU1MsIEpQQS5BQ0NFU1NfVFlQRSk7Ci0vLwkJCX0KLS8vCQkJQE92ZXJyaWRlCi0vLwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotLy8JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0vLwkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCkiKTsKLS8vCQkJfQotLy8JCQkKLS8vCQkJQE92ZXJyaWRlCi0vLwkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLS8vCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0vLwkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSkiKTsKLS8vCQkJfQotLy8JCX0pOwotLy8JfQotLy8KLS8vCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5UHJvcGVydHlTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVBY2Nlc3NBbm5vdGF0aW9uKCk7Ci0vLwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotLy8JCQlAT3ZlcnJpZGUKLS8vCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLS8vCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5BQ0NFU1MsIEpQQS5BQ0NFU1NfVFlQRSk7Ci0vLwkJCX0KLS8vCQkJQE92ZXJyaWRlCi0vLwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotLy8JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0vLwkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSkiKTsKLS8vCQkJfQotLy8JCX0pOwotLy8JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc1dpdGhKYXZhQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCQotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbCgpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0KLS8vVE9ETyBBY2Nlc3MgYW5ub3RhdGlvbiB0ZXN0CQotLy8JcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc1dpdGhKYXZhQW5ub3RhdGlvbnNQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZFByb3BlcnR5U3BlY2lmaWVkKCk7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLS8vCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLS8vCQkKLS8vCQkKLS8vCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLS8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotLy8JCQotLy8JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkUHJvcGVydHlTcGVjaWZpZWQoKTsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCQotLy8JCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiB2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7Ci0vLwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotLy8JCQotLy8JCQotLy8JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLS8vCQkKLS8vCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotLy8JCQotLy8JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0vLwkJdmlydHVhbEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpOwotLy8JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJCi0vLwkJCi0vLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotLy8JCQotLy8JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlTcGVjaWZpZWQoKTsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCQotLy8JCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiB2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7Ci0vLwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotLy8JCQotLy8JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0vLwkJCi0vLwkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLS8vCQl2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7Ci0vLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLS8vCQkKLS8vCQkKLS8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygibmFtZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJCi0vLwkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLS8vCQkKLS8vCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLS8vCQl2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7Ci0vLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLS8vCQkKLS8vCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotLy8JfQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZXMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eUZpZWxkU3BlY2lmaWVkUHJvcGVydHlBbm5vdGF0ZWQoKTsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCQotLy8JCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiB2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7Ci0vLwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotLy8JCQotLy8JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLS8vCi0vLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLS8vCi0vLwkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLS8vCQkKLS8vCQkKLS8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoKTsKLS8vCQkKLS8vCQl2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7Ci0vLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLS8vCQkKLS8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygibmFtZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0vLwotLy8JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0vLwkJCi0vLwkJCi0vLwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBzcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLS8vCQkKLS8vCQkKLS8vCQlvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKS5tYWtlU3BlY2lmaWVkKCk7Ci0vLwkJdmlydHVhbEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpOwotLy8JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLS8vCi0vLwkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLS8vCX0KLS8vCi0vLwlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eVNwZWNpZmllZCgpOwotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotLy8JCQotLy8JCWphdmFQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0vLwkJCi0vLwkJamF2YVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLS8vCi0vLwkJCi0vLwkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLS8vCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazFfMU9ybVRyYW5zaWVudE1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMV8xT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMGE0ZTYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMV8xT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazFfMUNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMU9ybVRyYW5zaWVudE1hcHBpbmdUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmsxXzFDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazFfMU9ybVRyYW5zaWVudE1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlRSQU5TSUVOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVHJhbnNpZW50IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVUcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKHBlcnNpc3RlbnRBdHRyaWJ1dGUsIE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtQ29sbGVjdGlvblRhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUNvbGxlY3Rpb25UYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YWIzNzAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtQ29sbGVjdGlvblRhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLk1hcHBpbmdLZXlzMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ29sbGVjdGlvblRhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ29sbGVjdGlvblRhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbGxlY3Rpb25UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfME9ybUNvbGxlY3Rpb25UYWJsZVRlc3RzIAotCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazJfME9ybUNvbGxlY3Rpb25UYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gcHJvamVjdHM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBlbGVtZW50Q29sbGVjdGlvbjsiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbGVtZW50Q29sbGVjdGlvbiIpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCQotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCkpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXROYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldE5hbWUoKSk7Ci0KLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlV2l0aENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVsZW1lbnRDb2xsZWN0aW9uIik7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbENvbGxlY3Rpb25UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicHJvamVjdHMiKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIHZpcnR1YWxDb2xsZWN0aW9uVGFibGUgPSB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfcHJvamVjdHMiLCB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCUpvaW5Db2x1bW4gdmlydHVhbEpvaW5Db2x1bW4gPSB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2lkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGphdmFDb2xsZWN0aW9uVGFibGUgPSBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlqYXZhQ29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhQ29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coIkNBVEFMT0ciKTsKLQkJamF2YUNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoIlNDSEVNQSIpOwotCQlKYXZhSm9pbkNvbHVtbiBqYXZhSm9pbkNvbHVtbiA9IGphdmFDb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiTkFNRSIpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGRVJFTkNFRF9OQU1FIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDQVRBTE9HIiwgdmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlNDSEVNQSIsIHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCXZpcnR1YWxKb2luQ29sdW1uID0gdmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk5BTUUiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJFRkVSRU5DRURfTkFNRSIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tSmF2YVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRFbGVtZW50Q29sbGVjdGlvbigpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwcm9qZWN0cyIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfcHJvamVjdHMiLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJKChKYXZhRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLnNldFNwZWNpZmllZE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvb19wcm9qZWN0cyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLnNldFNwZWNpZmllZE5hbWUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhcl9wcm9qZWN0cyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicHJvamVjdHMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiSkFWQV9DT0xMRUNUSU9OX1RBQkxFIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJhcl9wcm9qZWN0cyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgdG8gdHJ1ZSwgd2lsbCBpZ25vcmUgamF2YSBhbm5vdGF0aW9uIHNldHRpbmdzCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXJfcHJvamVjdHMiLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJLy9yZW1vdmUgZWxlbWVudCBjb2xsZWN0aW9uIG1hcHBpbmcgZnJvbSB0aGUgb3JtLnhtbCBmaWxlCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUucmVtb3ZlRnJvbVhtbCgpOwotCQkvL29ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicHJvamVjdHMiKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCAgdmlydHVhbENvbGxlY3Rpb25UYWJsZSA9IHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfQ09MTEVDVElPTl9UQUJMRSIsIHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsvL3NwZWNpZmllZE5hbWUgc2luY2UgdGhpcyBpcyBhIHZpcnR1YWwgbWFwcGluZyBub3cKLQkJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQmFyX3Byb2plY3RzIiwgdmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlV2l0aENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVsZW1lbnRDb2xsZWN0aW9uIik7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCQkKLQkJLy9zZXQgc2NoZW1hIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0U2NoZW1hKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0U2NoZW1hKCkpOwotCQotCQkvL3NldCBTY2hlbWEgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldFNjaGVtYSgpKTsKLQkJCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0U2NoZW1hKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0U2NoZW1hKCkpOwotCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbGVtZW50Q29sbGVjdGlvbiIpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJCi0JCS8vc2V0IFNjaGVtYSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0JCQotCQkvL3NldCBTY2hlbWEgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlV2l0aENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVsZW1lbnRDb2xsZWN0aW9uIik7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJCi0JCS8vc2V0IENhdGFsb2cgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRDYXRhbG9nKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldENhdGFsb2coKSk7Ci0JCi0JCS8vc2V0IENhdGFsb2cgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0Q2F0YWxvZygiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXRDYXRhbG9nKCkpOwotCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbGVtZW50Q29sbGVjdGlvbiIpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCQotCQkvL3NldCBDYXRhbG9nIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQ29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IENhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbGVtZW50Q29sbGVjdGlvbiIpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9ybUNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQkJCQotCQlYbWxDb2xsZWN0aW9uVGFibGUgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4yID0gb3JtQ29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4zID0gb3JtQ29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW4zLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMiwgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4zLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbiwgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCi0JCWpvaW5Db2x1bW5zID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVXaXRoQ29sbGVjdGlvbigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZWxlbWVudENvbGxlY3Rpb24iKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlvcm1Db2xsZWN0aW9uVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJb3JtQ29sbGVjdGlvblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbGVtZW50Q29sbGVjdGlvbiIpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlYbWxDb2xsZWN0aW9uVGFibGUgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoMywgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQkKLQkJCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3JtQ29sbGVjdGlvblRhYmxlLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlV2l0aENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVsZW1lbnRDb2xsZWN0aW9uIik7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCVhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLm1vdmUoMiwgMCk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLm1vdmUoMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbGVtZW50Q29sbGVjdGlvbiIpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCkpOwotCQlYbWxDb2xsZWN0aW9uVGFibGUgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImZvbyIpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImJhciIpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbGVtZW50Q29sbGVjdGlvbiIpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCkpOwotCQlYbWxDb2xsZWN0aW9uVGFibGUgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsICBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiZm9vIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDEsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiYmFyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVXaXRoQ29sbGVjdGlvbigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZWxlbWVudENvbGxlY3Rpb24iKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbGVtZW50Q29sbGVjdGlvbiIpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCkpOwotCQlYbWxDb2xsZWN0aW9uVGFibGUgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8WG1sVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVXaXRoQ29sbGVjdGlvbigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZWxlbWVudENvbGxlY3Rpb24iKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5zaXplKCkpOwotCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJb3JtQ29sbGVjdGlvblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlV2l0aENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVsZW1lbnRDb2xsZWN0aW9uIik7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCVhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCi0KLQkJb3JtQ29sbGVjdGlvblRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0KLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlcyA9IHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbGVtZW50Q29sbGVjdGlvbiIpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCkpOwotCQlYbWxDb2xsZWN0aW9uVGFibGUgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJGT08iKTsKLQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDEsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiQkFSIik7Ci0KLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgyLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkJBWiIpOwotCi0JCQotCQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5tb3ZlKDIsIDApOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubW92ZSgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnJlbW92ZSgxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkucmVtb3ZlKDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNGcm9tSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIHZpcnR1YWxDb2xsZWN0aW9uVGFibGUgPSB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuaXNWaXJ0dWFsKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGphdmFDb2xsZWN0aW9uVGFibGUgPSBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJamF2YUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlqYXZhQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCWphdmFDb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQotCQl1bmlxdWVDb25zdHJhaW50cyA9IHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuYWRkVG9YbWwoKTsKLQkJCi0JCXZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoMCwgIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGNjYjQzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2VFbnVtZXJhdGVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZVRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlckNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX05BTUUgPSAiY2l0eSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSA9ICJFX0NJVFkiOwotCi0JcHVibGljIEVjbGlwc2VMaW5rMl8wT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuRkVUQ0hfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uKHRhcmdldENsYXNzPVN0cmluZy5jbGFzcywgZmV0Y2g9RmV0Y2hUeXBlLkVBR0VSKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5GRVRDSF9UWVBFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiIiArIEFUVFJJQlVURV9PVkVSUklERV9OQU1FICsgIlwiLCBjb2x1bW49QENvbHVtbihuYW1lPVwiIiArIEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSArICJcIikpIik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhOb25HZW5lcmljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxTdHJpbmc+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8U3RyaW5nLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBhYmJyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWxmUmVmZXJlbnRpYWxFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiRm9vIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDxGb28+IGVsZW1lbnRDb2xsZWN0aW9uOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkZvby5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVXaXRoQ29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPigiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gZWxlbWVudENvbGxlY3Rpb247IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVXaXRoQ29sbGVjdGlvbigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVsZW1lbnRDb2xsZWN0aW9uIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50Q29sbGVjdGlvbiIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnRDb2xsZWN0aW9uIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbGVtZW50Q29sbGVjdGlvbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlV2l0aENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbGVtZW50Q29sbGVjdGlvbiIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZWxlbWVudENvbGxlY3Rpb24iLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50Q29sbGVjdGlvbiIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwcGluZ05vVW5kZXJ5bGluZ0phdmFBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuc2V0TmFtZSgiZm9vIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldEZldGNoKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9YbWwoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9YbWwoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVXaXRoQ29sbGVjdGlvbigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVsZW1lbnRDb2xsZWN0aW9uIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudENvbGxlY3Rpb24iLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlV2l0aENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbGVtZW50Q29sbGVjdGlvbiIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50Q29sbGVjdGlvbiIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZWxlbWVudENvbGxlY3Rpb24iKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0KLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50Q29sbGVjdGlvbiIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlV2l0aENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbGVtZW50Q29sbGVjdGlvbiIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50Q29sbGVjdGlvbiIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVXaXRoQ29sbGVjdGlvbigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVsZW1lbnRDb2xsZWN0aW9uIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50Q29sbGVjdGlvbiIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVXaXRoQ29sbGVjdGlvbigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVsZW1lbnRDb2xsZWN0aW9uIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudENvbGxlY3Rpb24iLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlV2l0aENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbGVtZW50Q29sbGVjdGlvbiIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50Q29sbGVjdGlvbiIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZWxlbWVudENvbGxlY3Rpb24iKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudENvbGxlY3Rpb24iLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZWxlbWVudENvbGxlY3Rpb24iKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnRDb2xsZWN0aW9uIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLS8vVE9ETwlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKElCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlV2l0aENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbGVtZW50Q29sbGVjdGlvbiIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5FQUdFUiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlV2l0aENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbGVtZW50Q29sbGVjdGlvbiIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5FQUdFUiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQotCQkvL3NldCBmZXRjaCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVXaXRoQ29sbGVjdGlvbigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVsZW1lbnRDb2xsZWN0aW9uIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCBlbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldFRhcmdldENsYXNzKCkpOwotCQkJCQotCQkvL3NldCB0YXJnZXQgY2xhc3MgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldFRhcmdldENsYXNzKCJuZXdUYXJnZXRDbGFzcyIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBjbGFzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRUYXJnZXRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRUYXJnZXRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZWxlbWVudENvbGxlY3Rpb24iKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJuZXdUYXJnZXRDbGFzcyIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBjbGFzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlVHlwZUVtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQWRkcmVzcyIpOwotCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlLkVNQkVEREFCTEVfVFlQRSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlVHlwZUVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFkZHJlc3MiKTsKLQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuVHlwZS5CQVNJQ19UWVBFLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVUeXBlTm9uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5vbkdlbmVyaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5BZGRyZXNzIik7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuVHlwZS5OT19UWVBFLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVUeXBlKCkpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygidGVzdC5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscyhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuVHlwZS5FTUJFRERBQkxFX1RZUEUsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZVR5cGVCYXNpYygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQWRkcmVzcyIpOwotCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlLkJBU0lDX1RZUEUsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZVR5cGUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVXaXRoQ29sbGVjdGlvbigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVsZW1lbnRDb2xsZWN0aW9uIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRNYXBLZXkoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE5vdE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5KCkpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5KCkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5KCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXkoKS5zZXROYW1lKCJteU1hcEtleSIpOwotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWaXJ0dWFsTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQkJCi0JCS8vc2V0IHBrIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFBrTWFwS2V5KHRydWUpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXkoKSk7Ly9ubyBwcmltYXJ5IGtleSBvbiBhbiBlbWJlZGRhYmxlCi0JCWFzc2VydFRydWUodmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JCQotCQkKLQkJLy9zZXQgY3VzdG9tIHNwZWNpZmllZCBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRDdXN0b21NYXBLZXkodHJ1ZSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJjaXR5Iik7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZWxlbWVudENvbGxlY3Rpb24iKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb24geG1sRWxlbWVudENvbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50Q29sZWN0aW9uLmdldE1hcEtleSgpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm15TWFwS2V5Iik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgeG1sRWxlbWVudENvbGVjdGlvbi5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudENvbGVjdGlvbi5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSAKLQkJCXZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgYXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJ0ZXN0LkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWF0dHJpYnV0ZS5hZGRUb1htbCgpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJbWFwS2V5TmFtZXMgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoInRlc3QuQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoIlN0cmluZyIpOwotCQltYXBLZXlOYW1lcyA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlV2l0aENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbGVtZW50Q29sbGVjdGlvbiIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleUNsYXNzKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldE1hcEtleUNsYXNzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENsYXNzUmVmZXJlbmNlKCkpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleUNsYXNzKCkuc2V0Q2xhc3NOYW1lKCJTdHJpbmciKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpLnNldENsYXNzTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpLnNldENsYXNzTmFtZSgiU3RyaW5nIik7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldE1hcEtleUNsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZpcnR1YWxNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCS8vc2V0IHBrIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJJbnRlZ2VyIik7Ci0JCWFzc2VydEVxdWFscygiSW50ZWdlciIsIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiSW50ZWdlciIsIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVXaXRoQ29sbGVjdGlvbigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVsZW1lbnRDb2xsZWN0aW9uIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoIlN0cmluZyIpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdE9yZGVyQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljQmFzaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCU9yZGVyYWJsZTJfMCBvcmRlcmFibGUgPSAoT3JkZXJhYmxlMl8wKSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0T3JkZXJhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCQotCQlvcmRlcmFibGUuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJT3JkZXJDb2x1bW4yXzAgb3JkZXJDb2x1bW4gPSBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19PUkRFUiIsIG9yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCW9yZGVyQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE9yZGVyQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlPcmRlcmFibGUyXzAgb3JkZXJhYmxlID0gKE9yZGVyYWJsZTJfMCkgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE9yZGVyYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCk7Ci0JCSgoT3JkZXJhYmxlMl8wKSBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5zZXRPcmRlckNvbHVtbk9yZGVyaW5nKHRydWUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUucmVtb3ZlRnJvbVhtbCgpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCW9yZGVyYWJsZSA9IChPcmRlcmFibGUyXzApIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0T3JkZXJhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19PUkRFUiIsIG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQkoKE9yZGVyYWJsZTJfMCkgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRPcmRlcmFibGUoKSkuZ2V0T3JkZXJDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbFZhbHVlQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljQmFzaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJLy92aXJ0dWFsIGF0dHJ1YnRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyB2YWx1ZSBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkJCi0JCUNvbHVtbiB2aXJ0dWFsQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCB2aXJ0dWFsQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxDb2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgdmlydHVhbENvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgdmlydHVhbENvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1NDQUxFLCB2aXJ0dWFsQ29sdW1uLmdldFNjYWxlKCkpOwotCQotCQkvL3NldCBDb2x1bW4gYW5ub3RhdGlvbiBpbiBKYXZhCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CQkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJGT09fVEFCTEUiKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDQ1KSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDQ2KSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNDcpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fVEFCTEUiLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NSksIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ2KSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDcpLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCi0JCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlLCBvcm0ueG1sIHZpcnR1YWwgY29sdW1uIGlnbm9yZXMgamF2YSBjb2x1bW4gYW5ub3RhdGlvbgotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQkvL25vIGxvbmdlciBhbiBlbGVtZW50IGNvbGxlY3Rpb24gbWFwcGluZwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE51bGxDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0KLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldFZhbHVlQ29sdW1uKCk7Ci0JCi0JCS8vc2V0IENvbHVtbiBhbm5vdGF0aW9uIGluIEphdmEKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNDUpKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNDYpKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0JCi0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgb3JtQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbHVtbi5pc0RlZmF1bHRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgb3JtQ29sdW1uLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgb3JtQ29sdW1uLmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1NDQUxFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxWYWx1ZUNvbHVtblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCS8vZGVmYXVsdCBhdHRyaWJ1dGUgaW4gb3JtLnhtbCwgamF2YSBhdHRyaWJ1dGUgaGFzIG5vIENvbHVtbiBhbm5vdGF0aW9uCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlDb2x1bW4gdmlydHVhbENvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldFZhbHVlQ29sdW1uKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCQotCQkvL2VudGl0eSB0YWJsZSBzaG91bGQgaGF2ZSBubyBhZmZlY3Qgb24gdGhlIGNvbGxlY3Rpb24gdGFibGUgZGVmYXVsdCBuYW1lCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQkvL3NldCBDb2x1bW4gdGFibGUgZWxlbWVudCBpbiBKYXZhCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkpBVkFfQ09MTEVDVElPTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfQ09MTEVDVElPTl9UQUJMRSIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiSkFWQV9UQUJMRSIpOwkKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX1RBQkxFIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCS8vbWFrZSBuYW1lIHBlcnNpc3RlbnQgYXR0cmlidXRlIG5vdCBkZWZhdWx0Ci0JCWFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJdmlydHVhbENvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldFZhbHVlQ29sdW1uKCk7Ci0JCWFzc2VydE51bGwodmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgdmlydHVhbENvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZWxlbWVudENvbGxlY3Rpb24iKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7CQkKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMCwgMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZWxlbWVudENvbGxlY3Rpb24iKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMiwgMCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ05vVW5kZXJ5bGluZ0phdmFBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0KLQkJCi0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlMyA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQkvL2VtYmVkZGVkIG1hcHBpbmcgaXMgdmlydHVhbCwgc3BlY2lmaWVkIGF0dHJpYnV0ZSBvdmVycmlkZXMgc2hvdWxkIGV4aXN0Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJQ29sdW1uIGphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbiA9IGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldENvbHVtbigpOwotCQkKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPT19DT0xVTU4iKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJGT09fVEFCTEUiKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0KLQkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRUeXBlMy5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibmFtZSIpLmdldE1hcHBpbmcoKTsKLQkJamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9TVEFURV9DT0xVTU4iKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fQ09MVU1OIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fVEFCTEUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU1RBVEVfQ09MVU1OIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJCi0JCQotCQkvL2VtYmVkZGVkIG1hcHBpbmcgaXMgc3BlY2lmaWVkLCB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZXMgc2hvdWxkIGV4aXN0Ci0JCXBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5hZGRUb1htbCgpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU1RBVEVfQ09MVU1OIiwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBvbmUgb2YgdGhlIHZpcnR1YWwgYXR0cmlidXRlIG92ZXJyaWRlcyB0byBzcGVjaWZpZWQsIHZlcmlmeSBvdGhlcnMgYXJlIHN0aWxsIHZpcnR1YWwKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcEtleUNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCS8vdmlydHVhbCBhdHRyaWJ1dGUgaW4gb3JtLnhtbCwgamF2YSBhdHRyaWJ1dGUgaGFzIG5vIHZhbHVlIENvbHVtbiBhbm5vdGF0aW9uCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQkKLQkJQ29sdW1uIHZpcnR1YWxDb2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgdmlydHVhbENvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9MRU5HVEgsIHZpcnR1YWxDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIHZpcnR1YWxDb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9TQ0FMRSwgdmlydHVhbENvbHVtbi5nZXRTY2FsZSgpKTsKLQotCQkvL3NldCBDb2x1bW4gYW5ub3RhdGlvbiBpbiBKYXZhCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwkJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNDUpKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDQ2KSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDQ3KSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PX1RBQkxFIiwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxDb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDUpLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NiksIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ3KSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQotCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlLCBvcm0ueG1sIHZpcnR1YWwgY29sdW1uIGlnbm9yZXMgamF2YSBjb2x1bW4gYW5ub3RhdGlvbgotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQkvL25vIGxvbmdlciBhbiBlbGVtZW50IGNvbGxlY3Rpb24gbWFwcGluZwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE51bGxNYXBLZXlDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlDb2x1bW4gb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0KLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJGT09fVEFCTEUiKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDQ1KSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb3JtQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbHVtbi5pc0RlZmF1bHRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgb3JtQ29sdW1uLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgb3JtQ29sdW1uLmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1NDQUxFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBLZXlDb2x1bW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQkvL3ZpcnR1YWwgYXR0cmlidXRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJQ29sdW1uIHZpcnR1YWxDb2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCi0JCS8vZW50aXR5IHRhYmxlIHNob3VsZCBoYXZlIG5vIGFmZmVjdCBvbiB0aGUgY29sbGVjdGlvbiB0YWJsZSBkZWZhdWx0IG5hbWUKLQkJKChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQkvL3NldCBDb2x1bW4gdGFibGUgZWxlbWVudCBpbiBKYXZhCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkpBVkFfQ09MTEVDVElPTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfQ09MTEVDVElPTl9UQUJMRSIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkpBVkFfVEFCTEUiKTsJCi0JCWFzc2VydEVxdWFscygiSkFWQV9UQUJMRSIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJLy9tYWtlIGFkZHJlc3NlcyBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBub3QgZGVmYXVsdAotCQlhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCXZpcnR1YWxDb2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCB2aXJ0dWFsQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VsZlJlZmVyZW50aWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVNlbGZSZWZlcmVudGlhbEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRm9vIik7Ci0KLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZWxlbWVudENvbGxlY3Rpb24iKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG1hcHBpbmcuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nTmFtZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVXaXRoQ29sbGVjdGlvbigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVsZW1lbnRDb2xsZWN0aW9uIiksIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JCQkJCi0JCS8vc2V0IGVudW1lcmF0ZWQgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2Uuc2V0TWFwS2V5RW51bWVyYXRlZChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLk9SRElOQUwpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuT1JESU5BTCwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLnNldE1hcEtleUVudW1lcmF0ZWQob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5TVFJJTkcpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCAoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5TVFJJTkcsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2Uuc2V0TWFwS2V5RW51bWVyYXRlZChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlV2l0aENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbGVtZW50Q29sbGVjdGlvbiIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCQkJCQotCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRFbnVtVHlwZShFbnVtVHlwZS5PUkRJTkFMKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuT1JESU5BTCwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkKLQkJKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRFbnVtVHlwZShFbnVtVHlwZS5TVFJJTkcpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5TVFJJTkcsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZWxlbWVudENvbGxlY3Rpb24iKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IHRlbXBvcmFsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLnNldE1hcEtleVRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLkRBVEUpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLkRBVEUsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLkRBVEUsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRVNUQU1QKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQotCQkvL3NldCB0ZW1wb3JhbCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLnNldE1hcEtleVRlbXBvcmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZWxlbWVudENvbGxlY3Rpb24iKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IHRlbXBvcmFsIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKEJhc2VUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuREFURSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLkRBVEUsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkKLQkJKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCi0JCS8vc2V0IHRlbXBvcmFsIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLCBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxDb252ZXJ0aWJsZU1hcHBpbmcgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZSA9IChYbWxDb252ZXJ0aWJsZU1hcHBpbmcpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJCQkKLQkJLy9zZXQgbG9iIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLnNldENvbnZlcnQoIm15Q29udmVydCIpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldENvbnZlcnQoKSk7Ci0KLQkJLy9zZXQgbG9iIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2Uuc2V0Q29udmVydChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJCi0JCQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpOwotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUucmVtb3ZlRnJvbVhtbCgpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0JCQotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydE51bGwoamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZWxlbWVudENvbGxlY3Rpb24iKSwgTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQ29udmVydGlibGVNYXBwaW5nIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UgPSAoWG1sQ29udmVydGlibGVNYXBwaW5nKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCQkJCi0JCS8vc2V0IGxvYiBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCi0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKG51bGwpOwotCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldENvbnZlcnQoKSk7Ci0KLQkJLy9zZXQgbG9iIHRvIGZhbHNlIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUVudGl0eVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1FbnRpdHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmMyN2RkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUVudGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5NYXBwaW5nS2V5czJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZUhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuU2hhcmVkQ2FjaGVNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfME9ybUVudGl0eVRlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCX1RZUEVfTkFNRSA9ICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBTVUJfVFlQRV9OQU1FOwotCQotCQotCXB1YmxpYyBFY2xpcHNlTGluazJfME9ybUVudGl0eVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEpQQS5PTkVfVE9fT05FLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5PTkVfVE9fTUFOWSwgSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JTkhFUklUQU5DRSwgSlBBLklOSEVSSVRBTkNFX1RZUEUsIEpQQS5PTkVfVE9fT05FLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5PTkVfVE9fTUFOWSwgSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJASW5oZXJpdGFuY2Uoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUykiKTsKLQkJCQlzYi5hcHBlbmQoImFic3RyYWN0Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgicHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQ3VzdG9tZXIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJDdXN0b21lci5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcldpdGhFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJDdXN0b21lciAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJDdXN0b21lci5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlMb25nVGltZUN1c3RvbWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiTG9uZ1RpbWVDdXN0b21lciBleHRlbmRzIEN1c3RvbWVyICIpOwotCQkJCXNiLmFwcGVuZCgie30iKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJMb25nVGltZUN1c3RvbWVyLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5PTkVfVE9fT05FKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHN0cmVldDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgWmlwQ29kZSB6aXBDb2RlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiWmlwQ29kZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHBsdXNmb3VyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiWmlwQ29kZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCU9ybUVudGl0eSBlbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGVudGl0eS5nZXRPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQkKLQkJZW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUyk7Ci0JCQotCQlvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBlbnRpdHkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBlbnRpdHkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQllbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJCi0JCW92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBlbnRpdHkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gb3JtRW50aXR5LmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlPcm1FbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1FbnRpdHkuZ2V0UGFyZW50RW50aXR5KCk7Ci0JCW92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGFic3RyYWN0RW50aXR5LmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBvcm1FbnRpdHkuZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlPcm1FbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1FbnRpdHkuZ2V0UGFyZW50RW50aXR5KCk7Ci0JCW92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gYWJzdHJhY3RFbnRpdHkuZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKLQl9Ci0vL1RPRE8KLS8vCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXNNYXBwZWRTdXBlcmNsYXNzSW5Pcm1YbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotLy8JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0vLwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotLy8JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJCi0vLwkJSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLmFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotLy8JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBvcm1FbnRpdHkuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDEsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZCgwLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkJBWiIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMSwgMCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0KLQkJT3JtTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE9ybU1hcHBlZFN1cGVyY2xhc3MpIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQltYXBwZWRTdXBlcmNsYXNzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuYWRkVG9YbWwoKTsKLQkJQmFzaWNNYXBwaW5nIGlkTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG1hcHBlZFN1cGVyY2xhc3MuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCi0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXNFbnRpdHlIaWVyYWNoeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0KLQkJT3JtRW50aXR5IHN1cGVyY2xhc3MgPSAoT3JtRW50aXR5KSBvcm1FbnRpdHkuZ2V0UGFyZW50RW50aXR5KCk7Ci0JCQotCQlzdXBlcmNsYXNzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuYWRkVG9YbWwoKTsKLQkJQmFzaWNNYXBwaW5nIGlkTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHN1cGVyY2xhc3MuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCi0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygzLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygibmFtZSIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCQkKLQkJSXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCQkKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygibmFtZSIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMCwgMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZCgxLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoMiwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgyLCAwKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMCwgMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVJc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkKLQkJT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gZW50aXR5LmdldE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLS8vCS8vVE9ETyBhZGQgYWxsIG1hcHBpbmcgdHlwZXMgdG8gdGhlIG1hcHBlZCBzdXBlcmNsYXNzIHRvIHRlc3Qgd2hpY2ggb25lcyBhcmUgb3ZlcnJpZGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcyA9IG9ybUVudGl0eS5nZXRBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBvcm1FbnRpdHkuZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMCwgeG1sQXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDEsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDAsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm1vdmUoMSwgMCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgZW50aXR5UmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRUcnVlKGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuaXNFbXB0eSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotLy8KLS8vCQkvL01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0vLwkJLy9CYXNpY01hcHBpbmcgaWRNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgbWFwcGVkU3VwZXJjbGFzcy5wZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLS8vCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLS8vCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGVudGl0eVJlc291cmNlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLS8vCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCi0vLwkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLS8vCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLS8vCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLS8vCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJCi0vLwkJLy9UT0RPIGpvaW5Db2x1bW5zIGZvciBkZWZhdWx0IGFzc29jaWF0aW9uIG92ZXJyaWRlcwotLy8vLwlJSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IGRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwkKLS8vLy8KLS8vLy8JSU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChJTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotLy8vLwkKLS8vLy8JSU9uZVRvT25lTWFwcGluZyBhZGRyZXNzTWFwcGluZyA9IChJT25lVG9PbmVNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLnBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0vLy8vCUlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBhZGRyZXNzTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJCQVIiKTsKLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFaIik7Ci0vLy8vCQotLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydE51bGwodHlwZVJlc291cmNlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZS5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8JYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlcy5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8KLS8vLy8JYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKLS8vLy8JZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkJBWiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0vLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwotLy8vLwlkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwkKLS8vLy8JamF2YUVudGl0eS5hZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDApLnNldE5hbWUoImFkZHJlc3MiKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJLy9hZGQgdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscyg1LCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQotCQlJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDEsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0KLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDAsIDEpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgxLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMiwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubW92ZSgyLCAwKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm1vdmUoMCwgMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVJc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCi0JCU9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0KLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQ3VzdG9tZXIiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Mb25nVGltZUN1c3RvbWVyIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgemlwQ29kZVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuWmlwQ29kZSIpOwotCi0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChPcm1FbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdHJlZXQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5jaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS56aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMb25nVGltZUN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCQotCQl6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikuYWRkVG9YbWwoKTsKLQkJQmFzaWNNYXBwaW5nIHBsdXNGb3VyTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHppcENvZGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicGx1c2ZvdXIiKS5nZXRNYXBwaW5nKCk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRSIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKE9ybUVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJLy9jaGVjayB0aGUgdG9wLWxldmVsIGVtYmVkZGVkIChDdXN0b21lci5hZGRyZXNzKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IGl0IGlzIGdldHRpbmcgc2V0dGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvbiBaaXBjb2RlLnBsdXNmb3VyCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlTmFtZWQoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkvL3NldCBhbiBhdHRyaWJ1dGUgb3ZlcnJpZGUgb24gQWRkcmVzcy56aXBDb2RlIGVtYmVkZGVkIG1hcHBpbmcKLQkJYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuYWRkVG9YbWwoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSAoKFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgKChFbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRPdmVycmlkZU5hbWVkKCJwbHVzZm91ciIpKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSF9PVkVSUklERSIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRV9PVkVSUklERSIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKE9ybUVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVOYW1lZCgiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEVfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkvL1RPRE8gSSBoYXZlIHRoZSBkZWZhdWx0IHdyb25nIGluIHRoaXMgY2FzZSwgYnV0IHRoaXMgd2FzIHdyb25nIGJlZm9yZSBhcyB3ZWxsLiAgTmVlZCB0byBmaXggdGhpcyBsYXRlcgotLy8JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkN1c3RvbWVyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlMb25nVGltZUN1c3RvbWVyKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIGN1c3RvbWVyUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQ3VzdG9tZXIiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Mb25nVGltZUN1c3RvbWVyIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgemlwQ29kZVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuWmlwQ29kZSIpOwotCi0JCWN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoT3JtRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDYsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8T3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCU9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Muc3RyZWV0IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUuemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxvbmdUaW1lQ3VzdG9tZXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQkKLQkJemlwQ29kZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwbHVzZm91ciIpLmFkZFRvWG1sKCk7Ci0JCUJhc2ljTWFwcGluZyBwbHVzRm91ck1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSB6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikuZ2V0TWFwcGluZygpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEUiKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChPcm1FbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCS8vY2hlY2sgdGhlIHRvcC1sZXZlbCBlbWJlZGRlZCAoQ3VzdG9tZXIuYWRkcmVzcykgYXR0cmlidXRlIG92ZXJyaWRlIHRvIHZlcmlmeSBpdCBpcyBnZXR0aW5nIHNldHRpbmdzIGZyb20gdGhlIHNwZWNpZmllZCBjb2x1bW4gb24gWmlwY29kZS5wbHVzZm91cgotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZU5hbWVkKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJLy9zZXQgYW4gYXR0cmlidXRlIG92ZXJyaWRlIG9uIEFkZHJlc3MuemlwQ29kZSBlbWJlZGRlZCBtYXBwaW5nCi0JCWFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmFkZFRvWG1sKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gKChWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpICgoRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0T3ZlcnJpZGVOYW1lZCgicGx1c2ZvdXIiKSkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUhfT1ZFUlJJREUiKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEVfT1ZFUlJJREUiKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiKTsKLQotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChPcm1FbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlTmFtZWQoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJLy9UT0RPIEkgaGF2ZSB0aGUgZGVmYXVsdCB3cm9uZyBpbiB0aGlzIGNhc2UsIGJ1dCB0aGlzIHdhcyB3cm9uZyBiZWZvcmUgYXMgd2VsbC4gIE5lZWQgdG8gZml4IHRoaXMgbGF0ZXIKLS8vCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJDdXN0b21lciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRV9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChPcm1FbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Muc3RhdGUiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlMb25nVGltZUN1c3RvbWVyKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5DdXN0b21lciIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkxvbmdUaW1lQ3VzdG9tZXIiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7Ci0KLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoT3JtRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCU9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnN0YXRlIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlMl8wID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUyXzAuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCQkKLQkJY2FjaGVhYmxlMl8wLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZTJfMC5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JCQotCQljYWNoZWFibGUyXzAuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZTJfMC5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVudGl0eVJlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZTJfMC5zZXRTcGVjaWZpZWRDYWNoZWFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUyXzAuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5zZXRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCi0JCWVudGl0eVJlc291cmNlLnNldENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5zZXRDYWNoZWFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlhc3NlcnRFcXVhbHMoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFLCBwZXJzaXN0ZW5jZVVuaXQyXzAuZ2V0U2hhcmVkQ2FjaGVNb2RlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkFMTCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5FTkFCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5VTlNQRUNJRklFRCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlRnJvbVN1cGVyVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHN1Yk9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtFbnRpdHkgc3ViRW50aXR5ID0gKEVjbGlwc2VMaW5rRW50aXR5KSBzdWJPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIHN1YkVudGl0eSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZW50aXR5KS5nZXRDYWNoZWFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUobnVsbCk7Ci0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5FTkFCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZUZyb21KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgc3ViT3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIHN1Yk9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBqYXZhQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQkJCi0JCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRDYWNoZWFibGVGcm9tTWFwcGVkU3VwZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBzdWJPcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtFbnRpdHkgc3ViRW50aXR5ID0gKEVjbGlwc2VMaW5rRW50aXR5KSBzdWJPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIHN1YkVudGl0eSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgbWFwcGVkU3VwZXJjbGFzcykuZ2V0Q2FjaGVhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKG51bGwpOwotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkJCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZmUyODAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2VFbnVtZXJhdGVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZVRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhc2NhZGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlckNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazJfME9ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248U3RhdGU+IHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPFN0cmluZywgQWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXAgYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuRkVUQ0hfVFlQRSwgSlBBLkNBU0NBREVfVFlQRSwgSlBBLk9SREVSX0JZLCBFY2xpcHNlTGluay5KT0lOX0ZFVENILCBFY2xpcHNlTGluay5KT0lOX0ZFVENIX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55KGZldGNoPUZldGNoVHlwZS5FQUdFUiwgdGFyZ2V0RW50aXR5PUFkZHJlc3MuY2xhc3MsIGNhc2NhZGU9e0Nhc2NhZGVUeXBlLkFMTCwgQ2FzY2FkZVR5cGUuUEVSU0lTVCwgQ2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRSwgQ2FzY2FkZVR5cGUuUkVGUkVTSCwgQ2FzY2FkZVR5cGUuREVUQUNIfSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPcmRlckJ5KFwiY2l0eVwiIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASm9pbkZldGNoKEpvaW5GZXRjaFR5cGUuSU5ORVIpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlV2l0aENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxGb28+IG1hbnlUb01hbnlNYXBwaW5nOyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gCi0JCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdGF0ZUZvb01hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXNFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3NXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVXaXRoQ29sbGVjdGlvbigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb01hbnlNYXBwaW5nIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJbWFueVRvTWFueS5zZXRNYXBLZXkoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChtYW55VG9NYW55LmdldE1hcEtleSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwotCQkKLQkJbWFueVRvTWFueS5nZXRNYXBLZXkoKS5zZXROYW1lKCJteU1hcEtleSIpOwotCQltYW55VG9NYW55LnNldE1hcEtleShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWaXJ0dWFsTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJTWFueVRvTWFueU1hcHBpbmcgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YU1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JCQotCQkvL3NldCBwayBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLnNldFBrTWFwS2V5KHRydWUpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQkJCi0JCQotCQkvL3NldCBjdXN0b20gc3BlY2lmaWVkIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuc2V0Q3VzdG9tTWFwS2V5KHRydWUpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJjaXR5Iik7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVXaXRoQ29sbGVjdGlvbigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb01hbnlNYXBwaW5nIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm15TWFwS2V5Iik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYW55VG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlNYW55VG9NYW55TWFwcGluZyB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IAotCQkJdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJTWFueVRvTWFueU1hcHBpbmcgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YU1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5hZGRUb1htbCgpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBzcGVjaWZpZWRNYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJbWFwS2V5TmFtZXMgPSBzcGVjaWZpZWRNYW55VG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXNwZWNpZmllZE1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gc3BlY2lmaWVkTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJTdHJpbmciKTsKLQkJbWFwS2V5TmFtZXMgPSBzcGVjaWZpZWRNYW55VG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlV2l0aENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9NYW55TWFwcGluZyIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcyXzAgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQltYW55VG9NYW55LnNldE1hcEtleUNsYXNzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENsYXNzUmVmZXJlbmNlKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROb3ROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55LmdldE1hcEtleUNsYXNzKCkuc2V0Q2xhc3NOYW1lKCJTdHJpbmciKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBtYW55VG9NYW55LmdldE1hcEtleUNsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLnNldENsYXNzTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleUNsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJbWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLnNldENsYXNzTmFtZSgiU3RyaW5nIik7Ci0JCW1hbnlUb01hbnkuc2V0TWFwS2V5Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZpcnR1YWxNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCi0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIGphdmFNYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0JCQotCQkvL3NldCBwayBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJJbnRlZ2VyIik7Ci0JCWFzc2VydEVxdWFscygiSW50ZWdlciIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbnRlZ2VyIiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVXaXRoQ29sbGVjdGlvbigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb01hbnlNYXBwaW5nIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZzJfMCBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleUNsYXNzKCkpOwotCQkJCQkKLQkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoIlN0cmluZyIpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG1hbnlUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9yZGVyQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50UXVldWUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50Sm9iKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgcHJpbnRRdWV1ZVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5QcmludFF1ZXVlIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgam9ic1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBwcmludFF1ZXVlUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwocHJpbnRRdWV1ZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJqb2JzIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBqb2JzTWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgam9ic1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlqb2JzTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJam9ic01hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJxdWV1ZXMiKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBwcmludEpvYlBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5QcmludEpvYiIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHF1ZXVlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBwcmludEpvYlBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKHByaW50Sm9iUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInF1ZXVlcyIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgcXVldWVzTWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgcXVldWVzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJZ2V0T3JtWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCQlPcmRlcmFibGUyXzAgam9ic09yZGVyYWJsZSA9ICgoT3JkZXJhYmxlMl8wKSBqb2JzTWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCU9yZGVyQ29sdW1uMl8wIGpvYnNPcmRlckNvbHVtbiA9IGpvYnNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2JzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGpvYnNPcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQlPcmRlcmFibGUyXzAgcXVldWVzT3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIHF1ZXVlc01hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlPcmRlckNvbHVtbjJfMCBxdWV1ZXNPcmRlckNvbHVtbiA9IHF1ZXVlc09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHF1ZXVlc09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBxdWV1ZXNPcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCi0JCQotCQlqb2JzT3JkZXJhYmxlLnNldE9yZGVyQ29sdW1uT3JkZXJpbmcodHJ1ZSk7Ci0JCWpvYnNPcmRlckNvbHVtbiA9IGpvYnNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGpvYnNPcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgam9ic09yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiam9ic19PUkRFUiIsIGpvYnNPcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgam9ic09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQlxdWV1ZXNPcmRlcmFibGUuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJcXVldWVzT3JkZXJDb2x1bW4gPSBxdWV1ZXNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHF1ZXVlc09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInF1ZXVlc19PUkRFUiIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCWpvYnNPcmRlckNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2JzT3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgam9ic09yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCXF1ZXVlc09yZGVyQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicXVldWVzX09SREVSIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJCi0JCSgoRW50aXR5KSBwcmludEpvYlBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFX1ByaW50UXVldWUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEVfUHJpbnRRdWV1ZSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJKChFbnRpdHkpIHByaW50UXVldWVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1RIRVJfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRV9PVEhFUl9UQUJMRSIsIGpvYnNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRV9PVEhFUl9UQUJMRSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJcXVldWVzTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX1RBQkxFIiwgam9ic09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fVEFCTEUiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxPcmRlckNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRRdWV1ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBwcmludFF1ZXVlUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByaW50UXVldWUiKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBqb2JzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHByaW50UXVldWVQZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChwcmludFF1ZXVlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImpvYnMiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIGpvYnNNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBqb2JzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgcHJpbnRKb2JQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJpbnRKb2IiKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBxdWV1ZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gcHJpbnRKb2JQZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChwcmludEpvYlBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJxdWV1ZXMiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIHF1ZXVlc01hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIHF1ZXVlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCU9yZGVyYWJsZTJfMCBqb2JzT3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIGpvYnNNYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2JzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGpvYnNPcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQlPcmRlcmFibGUyXzAgcXVldWVzT3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIHF1ZXVlc01hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHF1ZXVlc09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBxdWV1ZXNPcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIGphdmFKb2JzTWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqb2JzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJKChPcmRlcmFibGUyXzApIGphdmFKb2JzTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLnNldE9yZGVyQ29sdW1uT3JkZXJpbmcodHJ1ZSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgam9ic09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqb2JzT3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBxdWV1ZXNPcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcXVldWVzT3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQotCQlqb2JzUGVyc2lzdGVudEF0dHJpYnV0ZS5yZW1vdmVGcm9tWG1sKCk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGpvYnNQZXJzaXN0ZW50QXR0cmlidXRlMiA9IHByaW50UXVldWVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiam9icyIpOwotCQlNYW55VG9NYW55TWFwcGluZyB2aXJ0dWFsSm9ic01hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIGpvYnNQZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCWpvYnNPcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgdmlydHVhbEpvYnNNYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGpvYnNPcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvYnNPcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBqb2JzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiam9ic19PUkRFUiIsIGpvYnNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlxdWV1ZXNQZXJzaXN0ZW50QXR0cmlidXRlLnJlbW92ZUZyb21YbWwoKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcXVldWVzUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBwcmludEpvYlBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJxdWV1ZXMiKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgdmlydHVhbFF1ZXVlc01hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHF1ZXVlc1BlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJcXVldWVzT3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIHZpcnR1YWxRdWV1ZXNNYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHF1ZXVlc09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcXVldWVzT3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgcXVldWVzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygicXVldWVzX09SREVSIiwgcXVldWVzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCSgoT3JkZXJhYmxlMl8wKSBqYXZhSm9ic01hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5nZXRPcmRlckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBqb2JzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9ic09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIHF1ZXVlc09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoInF1ZXVlc19PUkRFUiIsIHF1ZXVlc09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YVF1ZXVlc01hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgcXVldWVzUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFRdWV1ZXNNYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkpPSU5fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJKT0lOX1RBQkxFIiwgam9ic09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvYnNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkpPSU5fVEFCTEUiLCBxdWV1ZXNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJxdWV1ZXNfT1JERVIiLCBxdWV1ZXNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVByaW50UXVldWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJpbnRRdWV1ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55KG1hcHBlZEJ5PVwicXVldWVzXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT3JkZXJDb2x1bW4iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkxpc3Q8dGVzdC5QcmludEpvYj4gam9iczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcmludFF1ZXVlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVByaW50Sm9iKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlByaW50Sm9iIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT3JkZXJDb2x1bW4iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkxpc3Q8dGVzdC5QcmludFF1ZXVlPiBxdWV1ZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJpbnRKb2IuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBLZXlDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQkvL3ZpcnR1YWwgYXR0cmlidXRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyB2YWx1ZSBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlDb2x1bW4gdmlydHVhbENvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCB2aXJ0dWFsQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9MRU5HVEgsIHZpcnR1YWxDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIHZpcnR1YWxDb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9TQ0FMRSwgdmlydHVhbENvbHVtbi5nZXRTY2FsZSgpKTsKLQotCQkvL3NldCBDb2x1bW4gYW5ub3RhdGlvbiBpbiBKYXZhCi0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBqYXZhTWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CQkKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJGT09fVEFCTEUiKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDQ1KSk7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDQ2KSk7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNDcpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fVEFCTEUiLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NSksIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ2KSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDcpLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCi0KLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUsIG9ybS54bWwgdmlydHVhbCBjb2x1bW4gaWdub3JlcyBqYXZhIGNvbHVtbiBhbm5vdGF0aW9uCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCS8vYmVjb21lcyBhIDEtbSBieSBkZWZhdWx0Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgYWRkcmVzc2VzTWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQl2aXJ0dWFsQ29sdW1uID0gYWRkcmVzc2VzTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCi0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIHZpcnR1YWxDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxDb2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgdmlydHVhbENvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgdmlydHVhbENvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1NDQUxFLCB2aXJ0dWFsQ29sdW1uLmdldFNjYWxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbE1hcEtleUNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCU9ybU1hbnlUb01hbnlNYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlDb2x1bW4gb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0KLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgamF2YU1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwkJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7CQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig0NSkpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDQ3KSk7Ci0KLQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbHVtbi5pc0RlZmF1bHRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgb3JtQ29sdW1uLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgb3JtQ29sdW1uLmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1NDQUxFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBLZXlDb2x1bW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQkvL3ZpcnR1YWwgYXR0cmlidXRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCUNvbHVtbiBvcm1Db2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb3JtQ29sdW1uLmdldFRhYmxlKCkpOwotCi0JCS8vZW50aXR5IHRhYmxlIGNoYW5nZXMgdGhlIGpvaW4gdGFibGUgZGVmYXVsdCBuYW1lCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX0FkZHJlc3MiLCBvcm1Db2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJLy9zZXQgQ29sdW1uIHRhYmxlIGVsZW1lbnQgaW4gSmF2YQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgamF2YU1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiSkFWQV9KT0lOX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9KT0lOX1RBQkxFIiwgb3JtQ29sdW1uLmdldFRhYmxlKCkpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkpBVkFfVEFCTEUiKTsJCi0JCWFzc2VydEVxdWFscygiSkFWQV9UQUJMRSIsIG9ybUNvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQkvL21ha2UgYWRkcmVzc2VzIHBlcnNpc3RlbnQgYXR0cmlidXRlIG5vdCBkZWZhdWx0Ci0JCWFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlvcm1Db2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX0FkZHJlc3MiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCU1hbnlUb01hbnlNYXBwaW5nIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuCi0JCQlnZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0KLQkJQ2FzY2FkZTJfMCBjYXNjYWRlID0gKENhc2NhZGUyXzApIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzRGV0YWNoKCkpOwotCi0JCWFzc2VydFRydWUodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzQ3VzdG9tT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsICgoRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nKSB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcpLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0KLQkJdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9YbWwoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZT0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCU9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QuQWRkcmVzcyIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0KLQkJQ2FzY2FkZTJfMCBjYXNjYWRlID0gKENhc2NhZGUyXzApIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNEZXRhY2goKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkRW51bWVyYXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvTWFueU1hcHBpbmciKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nMl8wIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueV8yXzAgbWFueVRvTWFueVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JCQkJCi0JCS8vc2V0IGVudW1lcmF0ZWQgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnlSZXNvdXJjZS5zZXRNYXBLZXlFbnVtZXJhdGVkKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuT1JESU5BTCk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5PUkRJTkFMLCAoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLk9SRElOQUwsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCQotCQltYW55VG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5RW51bWVyYXRlZChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLlNUUklORyk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuU1RSSU5HLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnlSZXNvdXJjZS5zZXRNYXBLZXlFbnVtZXJhdGVkKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlV2l0aENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9NYW55TWFwcGluZyIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcyXzAgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55XzJfMCBtYW55VG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyLmNsYXNzKTsKLQkJKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKEVudW1UeXBlLk9SRElOQUwpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5PUkRJTkFMLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLk9SRElOQUwsICgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkKLQkJKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKEVudW1UeXBlLlNUUklORyk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLlNUUklORywgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvTWFueU1hcHBpbmciKSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nMl8wIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueV8yXzAgbWFueVRvTWFueVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQkJCQotCQkvL3NldCB0ZW1wb3JhbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueVJlc291cmNlLnNldE1hcEtleVRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLkRBVEUpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLkRBVEUsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSwgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQotCQltYW55VG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCQotCQltYW55VG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRVNUQU1QKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRVNUQU1QLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0KLQkJLy9zZXQgdGVtcG9yYWwgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvTWFueVJlc291cmNlLnNldE1hcEtleVRlbXBvcmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVXaXRoQ29sbGVjdGlvbigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb01hbnlNYXBwaW5nIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZzJfMCBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnlfMl8wIG1hbnlUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQkJCQkKLQkJLy9zZXQgdGVtcG9yYWwgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuREFURSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCi0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQotCQkvL3NldCB0ZW1wb3JhbCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDdhNmZkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYXNjYWRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRGVyaXZlZElkXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwc0lkXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rMl8wT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBUWVBFX05BTUUgKyAiIG1hbnlUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5hZGRUb1htbCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEyXzAuTUFQU19JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIEBNYXBzSWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBUWVBFX05BTUUgKyAiIG1hbnlUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5hZGRUb1htbCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWZvciAoT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCWVhY2guYWRkVG9YbWwoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU1hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSwgSlBBLkpPSU5fQ09MVU1OLCBKUEEuRkVUQ0hfVFlQRSwgSlBBLkNBU0NBREVfVFlQRSwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lKGZldGNoPUZldGNoVHlwZS5MQVpZLCBvcHRpb25hbD1mYWxzZSwgdGFyZ2V0RW50aXR5PUFkZHJlc3MuY2xhc3MsIGNhc2NhZGU9e0Nhc2NhZGVUeXBlLkFMTCwgQ2FzY2FkZVR5cGUuUEVSU0lTVCwgQ2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRSwgQ2FzY2FkZVR5cGUuUkVGUkVTSCwgQ2FzY2FkZVR5cGUuREVUQUNIfSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luQ29sdW1uKG5hbWU9XCJNWV9DT0xVTU5cIiwgcmVmZXJlbmNlZENvbHVtbk5hbWU9XCJNWV9SRUZFUkVOQ0VEX0NPTFVNTlwiLCB1bmlxdWU9dHJ1ZSwgbnVsbGFibGU9ZmFsc2UsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSwgY29sdW1uRGVmaW5pdGlvbj1cIkNPTFVNTl9ERUZJTklUSU9OXCIsIHRhYmxlPVwiTVlfVEFCTEVcIikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luRmV0Y2goSm9pbkZldGNoVHlwZS5JTk5FUikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVyaXZlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbERlcml2ZWRJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldElkKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0SWQoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRJZChudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldERlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxEZXJpdmVkSWRfMl8wIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRWYWx1ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRWYWx1ZShmYWxzZSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE1hcHNJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwc0lkKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHNJZCgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFwc0lkXzJfMCByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJCi0JCVhtbE1hbnlUb09uZSByZXNvdXJjZU1hbnlUb09uZSA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQlyZXNvdXJjZU1hbnlUb09uZS5zZXRJZChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hbnlUb09uZS5nZXRJZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9PbmUuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKCgoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJWG1sT25lVG9PbmUgcmVzb3VyY2VPbmVUb09uZSA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlT25lVG9PbmUuZ2V0SWQoKSk7Ci0JCWFzc2VydFRydWUoKChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb09uZS5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE51bGwoKChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQotCQljb250ZXh0QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJcmVzb3VyY2VNYW55VG9PbmUuc2V0SWQoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYW55VG9PbmUuZ2V0SWQoKSk7Ci0JCWFzc2VydFRydWUoKChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFueVRvT25lLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbCgoKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEpvaW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvT25lTWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlKYXZhTWFueVRvT25lTWFwcGluZzJfMCBqYXZhTWFueVRvT25lTWFwcGluZyA9ICgoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCkpOwotCQlNYW55VG9PbmVNYXBwaW5nMl8wIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkoKE1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgamF2YU1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9ICgoTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSB2aXJ0dWFsTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9ybUpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2lkIiwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlKb2luQ29sdW1uIGludmVyc2VPcm1Kb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgaW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBpbnZlcnNlT3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGludmVyc2VPcm1Kb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQlKYXZhSm9pblRhYmxlIGphdmFKb2luVGFibGUgPSAoKEphdmFNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIGphdmFNYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlqYXZhSm9pblRhYmxlLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhSm9pblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coIkNBVEFMT0ciKTsKLQkJamF2YUpvaW5UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoIlNDSEVNQSIpOwotCQlKYXZhSm9pbkNvbHVtbiBqYXZhSm9pbkNvbHVtbiA9IGphdmFKb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiTkFNRSIpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGRVJFTkNFRF9OQU1FIik7Ci0JCUphdmFKb2luQ29sdW1uIGludmVyc2VKYXZhSm9pbkNvbHVtbiA9IGphdmFKb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJJTlZFUlNFX05BTUUiKTsKLQkJaW52ZXJzZUphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJJTlZFUlNFX1JFRkVSRU5DRURfTkFNRSIpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ0FUQUxPRyIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlNDSEVNQSIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCW9ybUpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJOQU1FIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJFRkVSRU5DRURfTkFNRSIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWludmVyc2VPcm1Kb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIklOVkVSU0VfTkFNRSIsIGludmVyc2VPcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiSU5WRVJTRV9SRUZFUkVOQ0VEX05BTUUiLCBpbnZlcnNlT3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tSmF2YVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9PbmVNYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nMl8wIG9ybU1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCSgoTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBvcm1NYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSAoKE9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgb3JtTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSB0YXJnZXRQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0KLQkJKChKYXZhRW50aXR5KSB0YXJnZXRQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkoKEphdmFFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVJfRk9PIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCUphdmFNYW55VG9PbmVNYXBwaW5nMl8wIGphdmFNYW55VG9PbmVNYXBwaW5nID0gKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKTsKLQkJKChNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIGphdmFNYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCSgoTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJKQVZBX0pPSU5fVEFCTEUiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSB0byB0cnVlLCB3aWxsIGlnbm9yZSBqYXZhIGFubm90YXRpb24gc2V0dGluZ3MKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQkvL29ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQkvL3JlbW92ZSBtLW0gbWFwcGluZyBmcm9tIHRoZSBvcm0ueG1sIGZpbGUKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5yZW1vdmVGcm9tWG1sKCk7Ci0JCS8vb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCU1hbnlUb09uZU1hcHBpbmcyXzAgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlvcm1Kb2luVGFibGUgPSAoKE1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfSk9JTl9UQUJMRSIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOy8vc3BlY2lmaWVkTmFtZSBzaW5jZSB0aGlzIGlzIGEgdmlydHVhbCBtYXBwaW5nIG5vdwotCi0JCSgoTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5yZW1vdmVTdHJhdGVneSgpOwotCQlvcm1Kb2luVGFibGUgPSAoKE1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlKTsKLQkJKChNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIGphdmFNYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCW9ybUpvaW5UYWJsZSA9ICgoTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSB2aXJ0dWFsTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVJfRk9PIiwgb3JtSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkoKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9STV9UQUJMRV9OQU1FIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX05BTUVfRk9PIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCSgoT3JtRW50aXR5KSB0YXJnZXRQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBUkdFVCIpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9UQUJMRV9OQU1FX09STV9UQVJHRVQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCByZWwgPSAoT3JtTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb09uZSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCByZWwgPSAoT3JtTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb09uZSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5TWFueVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJTWFueVRvT25lTWFwcGluZzJfMCB2aXJ0dWFsTWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nMl8wKSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsTWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscygiQWRkcmVzcyIsIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQotCQlKb2luQ29sdW1uIHZpcnR1YWxKb2luQ29sdW1uID0gdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1JFRkVSRU5DRURfQ09MVU1OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEUiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQotCQlDYXNjYWRlMl8wIGNhc2NhZGUgPSAoQ2FzY2FkZTJfMCkgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0RldGFjaCgpKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCAoKEVjbGlwc2VMaW5rSm9pbkZldGNoTWFwcGluZykgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcpLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCi0JCXZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmFkZFRvWG1sKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlPcm1NYW55VG9PbmVNYXBwaW5nMl8wIG9ybU1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtTWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkFkZHJlc3MiLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0KLQkJQ2FzY2FkZTJfMCBjYXNjYWRlID0gKENhc2NhZGUyXzApIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0RldGFjaCgpKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgKChFY2xpcHNlTGlua0pvaW5GZXRjaE1hcHBpbmcpIG9ybU1hbnlUb09uZU1hcHBpbmcpLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYWUzYjkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZUhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuU2hhcmVkQ2FjaGVNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCX1RZUEVfTkFNRSA9ICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBTVUJfVFlQRV9OQU1FOwotCi0JcHVibGljIEVjbGlwc2VMaW5rMl8wT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBFY2xpcHNlTGluay5SRUFEX09OTFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckN1c3RvbWl6ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1N1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yVHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yUmVhZE9ubHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCByZWFkIG9ubHksIHNldCBqYXZhIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KG51bGwpOwotCQlqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0KLQkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gY2xlYXIgeG1sIHJlYWQgb25seSwgc2V0IGphdmEgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KG51bGwpOwotCQlqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclJlYWRPbmx5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IHJlYWQgb25seSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDdXN0b21pemVyKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjdXN0b21pemVyLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q3VzdG9taXplcihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDbGFzc1JlZmVyZW5jZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY3VzdG9taXplciBjbGFzcywgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0Q2xhc3NOYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJLy8gY2xlYXIgeG1sIGN1c3RvbWl6ZXIgY2xhc3MsIHNldCBqYXZhIGN1c3RvbWl6ZXIgY2xhc3MsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldENsYXNzTmFtZShudWxsKTsKLQkJamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoImJhciIpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIgY2xhc3MsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldENsYXNzTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQkvL3NldCB4bWwgY3VzdG9taXplciBudWxsCi0JCWphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKG51bGwpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q3VzdG9taXplcihudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpKTsKLQkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckN1c3RvbWl6ZXIoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY3VzdG9taXplciwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2hhbmdlVHJhY2tpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHR5cGUgdG8gQVRUUklCVVRFLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2hhbmdlVHJhY2tpbmcoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDaGFuZ2VUcmFja2luZygpKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0eXBlIHRvIE9CSkVDVCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0eXBlIHRvIERFRkVSUkVELCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBBVVRPLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2xlYXIgeG1sIGNoYW5nZSB0cmFja2luZywgc2V0IGphdmEgY2hhbmdlIHRyYWNraW5nLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENoYW5nZVRyYWNraW5nKG51bGwpOwotCQlqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gdW5zZXQgbWV0YWRhdGFDb21wbGV0ZSwgc2V0IHhtbCBjaGFuZ2UgdHJhY2tpbmcgdG8gT0JKRUNULCBjaGVjayBjb250ZXh0Ci0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2hhbmdlVHJhY2tpbmcoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDaGFuZ2VUcmFja2luZygpKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiAgewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNoYW5nZVRyYWNraW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIEFUVFJJQlVURSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIE9CSkVDVCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIERFRkVSUkVELCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBBVVRPLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSB0eXBlLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRUeXBlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEwpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuRlVMTCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkZVTEwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSB0eXBlLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuRlVMTCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSB0eXBlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRUeXBlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSB0eXBlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkhBUkRfV0VBSywgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZUNvb3JkaW5hdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHR5cGUsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldENvb3JkaW5hdGlvblR5cGUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIHR5cGUsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIHR5cGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldENvb3JkaW5hdGlvblR5cGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVDb29yZGluYXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgY29vcmRpbmF0aW9uIHR5cGUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY29vcmRpbmF0aW9uIHR5cGUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgeG1sTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgeG1sTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXhtbE1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHhtbE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHNpemUsIGNoZWNrIHNldHRpbmdzCi0JCXhtbE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRTaXplKG5ldyBJbnRlZ2VyKDEwNSkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTA1KSwgeG1sTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTA1LCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFNpemUobmV3IEludGVnZXIoNTApKTsKLQkJCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMDUpLCB4bWxNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwNSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMDUpLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0U2l6ZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgeG1sTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJeG1sTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgeG1sTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgeG1sTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaXplKG5ldyBJbnRlZ2VyKDUwKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaXplKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZUFsd2F5c1JlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQotCQkvLyBzZXQgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoIHRvIGZhbHNlCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldEFsd2F5c1JlZnJlc2goQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRBbHdheXNSZWZyZXNoKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCi0JCQotCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgYmFjayB0byBudWxsLCBjaGVjayBkZWZhdWx0cyBmcm9tIGphdmEKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZUFsd2F5c1JlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVSZWZyZXNoT25seUlmTmV3ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHNpemUsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0KLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVSZWZyZXNoT25seUlmTmV3ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVEaXNhYmxlSGl0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0RGlzYWJsZUhpdHMoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIHNpemUsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkvLyBzZXQgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoIHRvIGZhbHNlCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldERpc2FibGVIaXRzKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXREaXNhYmxlSGl0cyhudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JCi0JCQotCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZURpc2FibGVIaXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlU2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2ggdG8gZmFsc2UKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0U2hhcmVkKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0U2hhcmVkKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JCi0JCQotCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgYmFjayB0byBudWxsLCBjaGVjayBkZWZhdWx0cyBmcm9tIGphdmEKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlU2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkU2hhcmVkKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkU2hhcmVkKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRXhpc3RlbmNlQ2hlY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBleGlzdGVuY2UgY2hlY2tpbmcsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRFeGlzdGVuY2VDaGVja2luZyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBleGlzdGVuY2UgY2hlY2tpbmcsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRFeGlzdGVuY2VDaGVja2luZyhudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlFeGlzdGVuY2VDaGVja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBleGlzdGVuY2UgY2hlY2tpbmcsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGV4aXN0ZW5jZSBjaGVja2luZyB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDdXN0b21Db252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmFkZChyZXNvdXJjZUNvbnZlcnRlcik7Ci0JCXJlc291cmNlQ29udmVydGVyLnNldENsYXNzTmFtZSgiRm9vIik7Ci0JCXJlc291cmNlQ29udmVydGVyLnNldE5hbWUoIm15Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVydGVyKCk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlQ29udmVydGVyMik7Ci0JCXJlc291cmNlQ29udmVydGVyMi5zZXRDbGFzc05hbWUoIkZvbzIiKTsKLQkJcmVzb3VyY2VDb252ZXJ0ZXIyLnNldE5hbWUoIm15Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q3VzdG9tQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkQ3VzdG9tQ29udmVydGVyKDApOwotCQljb250ZXh0Q29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJGb28iKTsKLQkJY29udGV4dENvbnZlcnRlci5zZXROYW1lKCJteUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udGV4dENvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZEN1c3RvbUNvbnZlcnRlcigwKTsKLQkJY29udGV4dENvbnZlcnRlcjIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbzIiKTsKLQkJY29udGV4dENvbnZlcnRlcjIuc2V0TmFtZSgibXlDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVDdXN0b21Db252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZUN1c3RvbUNvbnZlcnRlcihjb250ZXh0Q29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmFkZChyZXNvdXJjZVR5cGVDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxUeXBlQ29udmVydGVyIHJlc291cmNlVHlwZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlVHlwZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0VHlwZUNvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQljb250ZXh0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlVHlwZUNvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVR5cGVDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlVHlwZUNvbnZlcnRlcihjb250ZXh0VHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yT2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyKTsKLQkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKLQkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKLQkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JPYmplY3RUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yU3RydWN0Q29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmFkZChyZXNvdXJjZVN0cnVjdENvbnZlcnRlcik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyLnNldENvbnZlcnRlcigiRm9vIik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sU3RydWN0Q29udmVydGVyIHJlc291cmNlU3RydWN0Q29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlU3RydWN0Q29udmVydGVyMik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXIoIkZvbzIiKTsKLQkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkU3RydWN0Q29udmVydGVyKDApOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJGb28iKTsKLQkJY29udGV4dFN0cnVjdENvbnZlcnRlci5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udGV4dFN0cnVjdENvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKLQkJY29udGV4dFN0cnVjdENvbnZlcnRlcjIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbzIiKTsKLQkJY29udGV4dFN0cnVjdENvbnZlcnRlcjIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVTdHJ1Y3RDb252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVN0cnVjdENvbnZlcnRlcihjb250ZXh0U3RydWN0Q29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUyXzAgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUyXzAuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZTJfMC5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGUyXzAuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZTJfMC5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlMl8wLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZTJfMC5zZXRTcGVjaWZpZWRDYWNoZWFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUyXzAuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JCQotCQltYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2Uuc2V0Q2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0KLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCQkKLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldENhY2hlYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlhc3NlcnRFcXVhbHMoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFLCBwZXJzaXN0ZW5jZVVuaXQyXzAuZ2V0U2hhcmVkQ2FjaGVNb2RlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkFMTCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5FTkFCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5VTlNQRUNJRklFRCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlRnJvbVN1cGVyVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1N1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgc3ViT3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIHN1Yk1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBzdWJPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIHN1Yk1hcHBlZFN1cGVyY2xhc3MpLmdldENhY2hlYWJsZSgpOwotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG1hcHBlZFN1cGVyY2xhc3MpLmdldENhY2hlYWJsZSgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlQZXJzaXN0ZW5jZVVuaXQyXzAgcGVyc2lzdGVuY2VVbml0Ml8wID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShudWxsKTsKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlRnJvbUphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHN1Yk9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBzdWJDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgc3ViT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGphdmFDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCQkKLQkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZUZyb21NYXBwZWRTdXBlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzU3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBzdWJPcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgc3ViTWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIHN1Yk9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUNhY2hlYWJsZTJfMCBzdWJDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgc3ViTWFwcGVkU3VwZXJjbGFzcykuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgbWFwcGVkU3VwZXJjbGFzcykuZ2V0Q2FjaGVhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKG51bGwpOwotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkJCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0NmE0OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNlRW51bWVyYXRlZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Q29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2VUZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhc2NhZGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT25lVG9NYW55UmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJDb2x1bW4yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlcmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0vKioKLSAqICBFY2xpcHNlTGluazJfME9ybU9uZVRvTWFueU1hcHBpbmdUZXN0cwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfME9ybU9uZVRvTWFueU1hcHBpbmdUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazJfME9ybU9uZVRvTWFueU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5hZGRUb1htbCgpOwotCQl9Ci0JfQotCQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8U3RyaW5nLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgYWJicjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9CQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxTdHJpbmcsIEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLkZFVENIX1RZUEUsIEpQQS5DQVNDQURFX1RZUEUsIEpQQS5PUkRFUl9CWSwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55KGZldGNoPUZldGNoVHlwZS5FQUdFUiwgdGFyZ2V0RW50aXR5PUFkZHJlc3MuY2xhc3MsIG9ycGhhblJlbW92YWwgPSB0cnVlLCBjYXNjYWRlPXtDYXNjYWRlVHlwZS5BTEwsIENhc2NhZGVUeXBlLlBFUlNJU1QsIENhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5SRU1PVkUsIENhc2NhZGVUeXBlLlJFRlJFU0gsIENhc2NhZGVUeXBlLkRFVEFDSH0pIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT3JkZXJCeShcImNpdHlcIiIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEpvaW5GZXRjaChKb2luRmV0Y2hUeXBlLklOTkVSKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVXaXRoQ29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPigiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEZvbz4gb25lVG9NYW55OyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWxPZihPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcpIHsKLQkJcmV0dXJuICgoT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgb25lVG9NYW55TWFwcGluZykuZ2V0T3JwaGFuUmVtb3ZhbCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9NYW55IiksIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVXaXRoQ29sbGVjdGlvbigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvTWFueSIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9uZVRvTWFueVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCQkJCi0JCS8vc2V0IGVudW1lcmF0ZWQgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvTWFueVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9uZVRvTWFueVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZpcnR1YWxNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRV8gKyAiQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FXyArICJTdGF0ZSIpOwotCi0JCU9uZVRvTWFueU1hcHBpbmcgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQkJCi0JCS8vc2V0IHBrIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5zZXRQa01hcEtleSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQkJCi0JCQotCQkvL3NldCBjdXN0b20gc3BlY2lmaWVkIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5zZXRDdXN0b21NYXBLZXkodHJ1ZSk7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgiY2l0eSIpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQkJCi0JCS8vc2V0IG1ldGFkYXRhIGNvbXBsZXRlIGFuZCB2ZXJpZnkgdGhhdCB0aGUgb3JtIG1vZGVsIGlnbm9yZXMgdGhlIGphdmEgYW5ub3RhdGlvbnMKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJdmlydHVhbE9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJT25lVG9NYW55TWFwcGluZyB2aXJ0dWFsT25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSAKLQkJCXZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJT25lVG9NYW55TWFwcGluZyB2aXJ0dWFsT25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZyBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuYWRkVG9YbWwoKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCW1hcEtleU5hbWVzID0gb3JtT25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJ0ZXN0LkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiU3RyaW5nIik7Ci0JCW1hcEtleU5hbWVzID0gb3JtT25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlV2l0aENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb01hbnkiKSwgTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZzJfMCBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJb25lVG9NYW55LnNldE1hcEtleUNsYXNzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENsYXNzUmVmZXJlbmNlKCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE5vdE51bGwob25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkuc2V0Q2xhc3NOYW1lKCJTdHJpbmciKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLnNldENsYXNzTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkJCi0JCW9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLnNldENsYXNzTmFtZSgiU3RyaW5nIik7Ci0JCW9uZVRvTWFueS5zZXRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZpcnR1YWxNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJT25lVG9NYW55TWFwcGluZzJfMCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCS8vc2V0IHBrIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiSW50ZWdlciIpOwotCQlhc3NlcnRFcXVhbHMoIkludGVnZXIiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbnRlZ2VyIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCQotCQkvL3NldCBjdXN0b20gc3BlY2lmaWVkIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQl2aXJ0dWFsT25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9NYW55IiksIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkpOwotCQkJCQkKLQkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiU3RyaW5nIik7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBvbmVUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9yZGVyQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50UXVldWUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50Sm9iKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByaW50UXVldWUiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5QcmludEpvYiIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiam9icyIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJxdWV1ZSIpOwotCi0JCU9yZGVyYWJsZTJfMCBvcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCQotCQlvcmRlcmFibGUuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJT3JkZXJDb2x1bW4yXzAgb3JkZXJDb2x1bW4gPSBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImpvYnNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYiIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJb3JkZXJDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2IiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHByaW50Sm9iUGVyc2lzdGVudFR5cGUgPSAoT3JtUGVyc2lzdGVudFR5cGUpIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKCJ0ZXN0LlByaW50Sm9iIik7Ci0JCSgoRW50aXR5KSBwcmludEpvYlBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9UQUJMRSIpOwotCi0JCWFzc2VydEVxdWFscygiTVlfVEFCTEUiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxPcmRlckNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRRdWV1ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJpbnRRdWV1ZSIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByaW50Sm9iIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJqb2JzIiksIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlPcmRlcmFibGUyXzAgb3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQkKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCk7Ci0JCSgoT3JkZXJhYmxlMl8wKSBqYXZhT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSkuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnJlbW92ZUZyb21YbWwoKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiam9icyIpOwotCQlPbmVUb01hbnlNYXBwaW5nIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJb3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYiIsIG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoImpvYnNfT1JERVIiLCBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJKChPcmRlcmFibGUyXzApIGphdmFPbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5nZXRPcmRlckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iIiwgb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlQcmludFF1ZXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJpbnRRdWV1ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkobWFwcGVkQnk9XCJxdWV1ZVwiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9yZGVyQ29sdW1uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5MaXN0PFByaW50Sm9iPiBqb2JzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByaW50UXVldWUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BTllfVE9fT05FKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlByaW50Sm9iIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgUHJpbnRRdWV1ZSBxdWV1ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcmludEpvYi5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcEtleUNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJLy92aXJ0dWFsIGF0dHJpYnV0ZSBpbiBvcm0ueG1sLCBqYXZhIGF0dHJpYnV0ZSBoYXMgbm8gdmFsdWUgQ29sdW1uIGFubm90YXRpb24KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkJCi0JCUNvbHVtbiBvcm1Db2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb3JtQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9MRU5HVEgsIG9ybUNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgb3JtQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXRTY2FsZSgpKTsKLQotCQkvL3NldCBDb2x1bW4gYW5ub3RhdGlvbiBpbiBKYXZhCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig0NSkpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDQ2KSk7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PX1RBQkxFIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDUpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ2KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NyksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQotCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlLCBvcm0ueG1sIHZpcnR1YWwgY29sdW1uIGlnbm9yZXMgamF2YSBjb2x1bW4gYW5ub3RhdGlvbgotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBhZGRyZXNzZXNNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkJCi0JCW9ybUNvbHVtbiA9IGFkZHJlc3Nlc01hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvcm1Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9ybUNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgb3JtQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBvcm1Db2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9TQ0FMRSwgb3JtQ29sdW1uLmdldFNjYWxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbE1hcEtleUNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKSwgTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkJCi0JCUNvbHVtbiBvcm1Db2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQotCQkvL3NldCBDb2x1bW4gYW5ub3RhdGlvbiBpbiBKYXZhCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig0NSkpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDQ2KSk7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb3JtQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb3JtQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9MRU5HVEgsIG9ybUNvbHVtbi5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIG9ybUNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9TQ0FMRSwgb3JtQ29sdW1uLmdldERlZmF1bHRTY2FsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwS2V5Q29sdW1uVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQkvL3ZpcnR1YWwgYXR0cmlidXRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlDb2x1bW4gb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9ybUNvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQkvL2VudGl0eSB0YWJsZSBjaGFuZ2VzIHRoZSBqb2luIHRhYmxlIGRlZmF1bHQgbmFtZQotCQkoKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9STV9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9UQUJMRV9BZGRyZXNzIiwgb3JtQ29sdW1uLmdldFRhYmxlKCkpOwotCi0JCS8vc2V0IENvbHVtbiB0YWJsZSBlbGVtZW50IGluIEphdmEKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiSkFWQV9KT0lOX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9KT0lOX1RBQkxFIiwgb3JtQ29sdW1uLmdldFRhYmxlKCkpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiSkFWQV9UQUJMRSIpOwkKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX1RBQkxFIiwgb3JtQ29sdW1uLmdldFRhYmxlKCkpOwotCi0JCS8vbWFrZSBuYW1lIHBlcnNpc3RlbnQgYXR0cmlidXRlIG5vdCBkZWZhdWx0Ci0JCWFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIiksIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgYWRkcmVzc2VzTWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCW9ybUNvbHVtbiA9IGFkZHJlc3Nlc01hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9UQUJMRV9BZGRyZXNzIiwgb3JtQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIGNvbnRleHRNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwMl8wIHJlbCA9IGNvbnRleHRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIGNvbnRleHRNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwMl8wIHJlbCA9IGNvbnRleHRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwcGVkQnkoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0Sm9pblRhYmxlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXRGb3JlaWduS2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1UYXJnZXRQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCS8vdGVzdCB2aXJ0dWFsIG9ybSBtYXBwaW5nLCBzZXR0aW5nIHRoZSBqb2luIGNvbHVtbiBvbiB0aGUgamF2YSBtYXBwaW5nCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJKChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIGphdmFPbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9ICgoT25lVG9NYW55UmVsYXRpb25zaGlwMl8wKSB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsJCQotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19pZCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQWRkcmVzcyIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOy8vdGFyZ2V0IHRhYmxlIG5hbWUKLQotCQlKYXZhRW50aXR5IGFkZHJlc3NFbnRpdHkgPSAoSmF2YUVudGl0eSkgb3JtVGFyZ2V0UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlhZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0KLQkJLy9vdmVycmlkZSB0aGUgbWFwcGluZyBpbiBvcm0ueG1sCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9YbWwoKTsKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZzJfMCBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UoKChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCi0JCSgoT25lVG9NYW55UmVsYXRpb25zaGlwMl8wKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlqb2luQ29sdW1uID0gKChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7CQkKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX2lkIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBRERSRVNTX1BSSU1BUllfVEFCTEUiLCBqb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJT3JtRW50aXR5IG9ybUFkZHJlc3NFbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1UYXJnZXRQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCW9ybUFkZHJlc3NFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX0FERFJFU1NfUFJJTUFSWV9UQUJMRSIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX2lkIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiT1JNX0FERFJFU1NfUFJJTUFSWV9UQUJMRSIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCX0KLQotCS8vdGFyZ2V0IGZvcmVpZ24ga2V5IGNhc2UKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5Q29sdW1uSm9pbkNvbHVtblN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1UYXJnZXRQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCS8vdGVzdCB2aXJ0dWFsIG9ybSBtYXBwaW5nLCBzZXR0aW5nIHRoZSBqb2luIGNvbHVtbiBvbiB0aGUgamF2YSBtYXBwaW5nCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJKChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIGphdmFPbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCi0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQWRkcmVzcyIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOy8vdGFyZ2V0IHRhYmxlIG5hbWUKLQotCQlKYXZhRW50aXR5IGFkZHJlc3NFbnRpdHkgPSAoSmF2YUVudGl0eSkgb3JtVGFyZ2V0UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlhZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFERFJFU1NfUFJJTUFSWV9UQUJMRSIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKLQotCQkvL292ZXJyaWRlIHRoZSBtYXBwaW5nIGluIG9ybS54bWwKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbCgpOwotCQlwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSgoKE9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCkgb3JtT25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0KLQkJKChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBRERSRVNTX1BSSU1BUllfVEFCTEUiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOy8vdGFyZ2V0IHRhYmxlIG5hbWUKLQotCQlPcm1FbnRpdHkgb3JtQWRkcmVzc0VudGl0eSA9IChPcm1FbnRpdHkpIG9ybVRhcmdldFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJb3JtQWRkcmVzc0VudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9STV9BRERSRVNTX1BSSU1BUllfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9BRERSRVNTX1BSSU1BUllfVEFCTEUiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOy8vdGFyZ2V0IHRhYmxlIG5hbWUKLQotCQlvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0JfQotCi0JLy90YXJnZXQgZm9yZWlnbiBrZXkgY2FzZQotCXB1YmxpYyB2b2lkIHRlc3RPcmRlckNvbHVtbkRlZmF1bHRzSm9pbkNvbHVtblN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1UYXJnZXRQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCS8vdGVzdCB2aXJ0dWFsIG9ybSBtYXBwaW5nLCBzZXR0aW5nIHRoZSBqb2luIGNvbHVtbiBvbiB0aGUgamF2YSBtYXBwaW5nCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJKChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIGphdmFPbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQkoKE9yZGVyYWJsZTJfMCkgamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLnNldE9yZGVyQ29sdW1uT3JkZXJpbmcodHJ1ZSk7Ci0JCU9yZGVyQ29sdW1uMl8wIG9yZGVyQ29sdW1uID0gKChPcmRlcmFibGUyXzApIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5nZXRPcmRlckNvbHVtbigpOwotCi0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ly90YXJnZXQgdGFibGUgbmFtZQotCi0JCUphdmFFbnRpdHkgYWRkcmVzc0VudGl0eSA9IChKYXZhRW50aXR5KSBvcm1UYXJnZXRQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFkZHJlc3NFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJBRERSRVNTX1BSSU1BUllfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJBRERSRVNTX1BSSU1BUllfVEFCTEUiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQkvL292ZXJyaWRlIHRoZSBtYXBwaW5nIGluIG9ybS54bWwKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbCgpOwotCQlwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSgoKE9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCkgb3JtT25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0KLQkJKChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydEZhbHNlKCgoT3JkZXJhYmxlMl8wKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCSgoT3JkZXJhYmxlMl8wKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5zZXRPcmRlckNvbHVtbk9yZGVyaW5nKHRydWUpOwotCQlvcmRlckNvbHVtbiA9ICgoT3JkZXJhYmxlMl8wKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5nZXRPcmRlckNvbHVtbigpOwotCi0JCWFzc2VydE51bGwob3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFERFJFU1NfUFJJTUFSWV9UQUJMRSIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOy8vdGFyZ2V0IHRhYmxlIG5hbWUKLQotCQlPcm1FbnRpdHkgb3JtQWRkcmVzc0VudGl0eSA9IChPcm1FbnRpdHkpIG9ybVRhcmdldFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJb3JtQWRkcmVzc0VudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9STV9BRERSRVNTX1BSSU1BUllfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9BRERSRVNTX1BSSU1BUllfVEFCTEUiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyB2aXJ0dWFsT25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuCi0JCQlnZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0KLQkJQ2FzY2FkZTJfMCBjYXNjYWRlID0gKENhc2NhZGUyXzApIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNEZXRhY2goKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCi0JCWFzc2VydFRydWUoKChPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSB2aXJ0dWFsT25lVG9NYW55TWFwcGluZykuZ2V0T3JwaGFuUmVtb3ZhbCgpLmlzT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0KLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkFkZHJlc3MiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCi0JCUNhc2NhZGUyXzAgY2FzY2FkZSA9IChDYXNjYWRlMl8wKSB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzRGV0YWNoKCkpOwotCi0JCWFzc2VydFRydWUodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQotCQlhc3NlcnRGYWxzZSgoKE9ycGhhblJlbW92YWxIb2xkZXIyXzApIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nKS5nZXRPcnBoYW5SZW1vdmFsKCkuaXNPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVXaXRoQ29sbGVjdGlvbigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvTWFueSIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueV8yXzAgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5RW51bWVyYXRlZChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLk9SRElOQUwpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgKChCYXNlRW51bWVyYXRlZENvbnZlcnRlcikgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLk9SRElOQUwsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JCi0JCW9uZVRvTWFueVJlc291cmNlLnNldE1hcEtleUVudW1lcmF0ZWQob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5TVFJJTkcpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCAoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuU1RSSU5HLCBvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCi0JCS8vc2V0IGVudW1lcmF0ZWQgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5RW51bWVyYXRlZChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVXaXRoQ29sbGVjdGlvbigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvTWFueSIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueV8yXzAgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRFbnVtVHlwZShFbnVtVHlwZS5PUkRJTkFMKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuT1JESU5BTCwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLk9SRElOQUwsICgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwotCQotCQkoKEJhc2VFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRFbnVtVHlwZShFbnVtVHlwZS5TVFJJTkcpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5TVFJJTkcsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoQmFzZUVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwotCi0JCS8vc2V0IGVudW1lcmF0ZWQgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlV2l0aENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb01hbnkiKSwgTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZzJfMCBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnlfMl8wIG9uZVRvTWFueVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQkJCQotCQkvL3NldCB0ZW1wb3JhbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLkRBVEUsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQotCQlvbmVUb01hbnlSZXNvdXJjZS5zZXRNYXBLZXlUZW1wb3JhbChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCQotCQlvbmVUb01hbnlSZXNvdXJjZS5zZXRNYXBLZXlUZW1wb3JhbChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVApOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0KLQkJLy9zZXQgdGVtcG9yYWwgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVXaXRoQ29sbGVjdGlvbigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvTWFueSIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueV8yXzAgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IHRlbXBvcmFsIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihCYXNlVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEJhc2VUZW1wb3JhbENvbnZlcnRlcikgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5EQVRFKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLkRBVEUsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLkRBVEUsICgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCi0JCSgoQmFzZVRlbXBvcmFsQ29udmVydGVyKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNlVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQotCQkvL3NldCB0ZW1wb3JhbCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBjNTlmZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYXNjYWRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT25lVG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT25lVG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxEZXJpdmVkSWRfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBzSWRfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfME9ybU9uZVRvT25lTWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rMl8wT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBUWVBFX05BTUUgKyAiIG9uZVRvT25lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlmb3IgKE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQllYWNoLmFkZFRvWG1sKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSwgSlBBMl8wLk1BUFNfSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIEBNYXBzSWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBUWVBFX05BTUUgKyAiIG9uZVRvT25lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlmb3IgKE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQllYWNoLmFkZFRvWG1sKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248U3RhdGU+IHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlmb3IgKE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQllYWNoLmFkZFRvWG1sKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5GRVRDSF9UWVBFLCBKUEEuQ0FTQ0FERV9UWVBFLCBFY2xpcHNlTGluay5KT0lOX0ZFVENILCBFY2xpcHNlTGluay5KT0lOX0ZFVENIX1RZUEUsIEVjbGlwc2VMaW5rLlBSSVZBVEVfT1dORUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZShmZXRjaD1GZXRjaFR5cGUuTEFaWSwgb3B0aW9uYWw9ZmFsc2UsIHRhcmdldEVudGl0eT1BZGRyZXNzLmNsYXNzLCBvcnBoYW5SZW1vdmFsID0gdHJ1ZSwgY2FzY2FkZT17Q2FzY2FkZVR5cGUuQUxMLCBDYXNjYWRlVHlwZS5QRVJTSVNULCBDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFLCBDYXNjYWRlVHlwZS5SRUZSRVNILCBDYXNjYWRlVHlwZS5ERVRBQ0h9KSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEpvaW5Db2x1bW4obmFtZT1cIk1ZX0NPTFVNTlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZT1cIk1ZX1JFRkVSRU5DRURfQ09MVU1OXCIsIHVuaXF1ZT10cnVlLCBudWxsYWJsZT1mYWxzZSwgaW5zZXJ0YWJsZT1mYWxzZSwgdXBkYXRhYmxlPWZhbHNlLCBjb2x1bW5EZWZpbml0aW9uPVwiQ09MVU1OX0RFRklOSVRJT05cIiwgdGFibGU9XCJNWV9UQUJMRVwiKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEpvaW5GZXRjaChKb2luRmV0Y2hUeXBlLklOTkVSKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFByaXZhdGVPd25lZCkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVXaXRoT25lVG9PbmVBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgRm9vIG9uZVRvT25lOyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVyaXZlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbERlcml2ZWRJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0SWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRJZChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldElkKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGVyaXZlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbERlcml2ZWRJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0VmFsdWUodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0VmFsdWUoZmFsc2UpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwc0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxNYXBzSWRfMl8wIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwc0lkKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHNJZCgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFwc0lkXzJfMCByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIik7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQkKLQkJWG1sT25lVG9PbmUgcmVzb3VyY2VPbmVUb09uZSA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCXJlc291cmNlT25lVG9PbmUuc2V0TWFwc0lkKCJmb28iKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvT25lLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZSgoKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU9uZVRvT25lLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCVhtbE1hbnlUb09uZSByZXNvdXJjZU1hbnlUb09uZSA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFueVRvT25lLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZSgoKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VNYW55VG9PbmUuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJcmVzb3VyY2VPbmVUb09uZSA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb09uZS5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoKChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VPbmVUb09uZS5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0KLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gb25lVG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0YXRlRm9vTWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzc1dpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0KLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gb25lVG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0YXRlRm9vTWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWxPZihPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nKSB7Ci0JCXJldHVybiAoKE9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzApIG9uZVRvT25lTWFwcGluZykuZ2V0T3JwaGFuUmVtb3ZhbCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhPbmVUb09uZUF0dHJpYnV0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIiksIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1PcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob3JtT25lVG9PbmVNYXBwaW5nKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9uZVRvT25lUmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmVSZXNvdXJjZS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb09uZVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCi0JCW9uZVRvT25lUmVzb3VyY2Uuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb25lVG9PbmVSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhPbmVUb09uZUF0dHJpYnV0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIiksIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1PcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob3JtT25lVG9PbmVNYXBwaW5nKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9uZVRvT25lUmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb09uZVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9uZVRvT25lUmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsSm9pblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZzJfMCBqYXZhT25lVG9PbmVNYXBwaW5nID0gKChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TWFwcGluZygpKTsKLQkJT25lVG9PbmVNYXBwaW5nMl8wIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJKChPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgamF2YU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlKb2luVGFibGUgdmlydHVhbEpvaW5UYWJsZSA9ICgoT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0KLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgdmlydHVhbEpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQlKb2luQ29sdW1uIHZpcnR1YWxKb2luQ29sdW1uID0gdmlydHVhbEpvaW5UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9pZCIsIHZpcnR1YWxKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlKb2luQ29sdW1uIHZpcnR1YWxJbnZlcnNlT3JtSm9pbkNvbHVtbiA9IHZpcnR1YWxKb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCB2aXJ0dWFsSW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCB2aXJ0dWFsSW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsSW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCUphdmFKb2luVGFibGUgamF2YUpvaW5UYWJsZSA9ICgoSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlqYXZhSm9pblRhYmxlLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhSm9pblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coIkNBVEFMT0ciKTsKLQkJamF2YUpvaW5UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoIlNDSEVNQSIpOwotCQlKYXZhSm9pbkNvbHVtbiBqYXZhSm9pbkNvbHVtbiA9IGphdmFKb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiTkFNRSIpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGRVJFTkNFRF9OQU1FIik7Ci0JCUphdmFKb2luQ29sdW1uIGludmVyc2VKYXZhSm9pbkNvbHVtbiA9IGphdmFKb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJJTlZFUlNFX05BTUUiKTsKLQkJaW52ZXJzZUphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJJTlZFUlNFX1JFRkVSRU5DRURfTkFNRSIpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNBVEFMT0ciLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiU0NIRU1BIiwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygxLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJdmlydHVhbEpvaW5Db2x1bW4gPSB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTkFNRSIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUkVGRVJFTkNFRF9OQU1FIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCXZpcnR1YWxJbnZlcnNlT3JtSm9pbkNvbHVtbiA9IHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiSU5WRVJTRV9OQU1FIiwgdmlydHVhbEludmVyc2VPcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiSU5WRVJTRV9SRUZFUkVOQ0VEX05BTUUiLCB2aXJ0dWFsSW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHROYW1lRnJvbUphdmFUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybU9uZVRvT25lTWFwcGluZzJfMCBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJKChPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgb3JtT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSAoKE9ybU9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgdGFyZ2V0UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCi0JCSgoSmF2YUVudGl0eSkgdGFyZ2V0UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJKChKYXZhRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGphdmFPbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0JCSgoT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIGphdmFPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJKChPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgamF2YU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJKQVZBX0pPSU5fVEFCTEUiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSB0byB0cnVlLCB3aWxsIGlnbm9yZSBqYXZhIGFubm90YXRpb24gc2V0dGluZ3MKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQkvL29ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQkvL3JlbW92ZSBtLW0gbWFwcGluZyBmcm9tIHRoZSBvcm0ueG1sIGZpbGUKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5yZW1vdmVGcm9tWG1sKCk7Ci0JCS8vb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgdmlydHVhbEpvaW5UYWJsZSA9ICgoT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfSk9JTl9UQUJMRSIsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsvL3NwZWNpZmllZE5hbWUgc2luY2UgdGhpcyBpcyBhIHZpcnR1YWwgbWFwcGluZyBub3cKLQotCQkoKE9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLnJlbW92ZVN0cmF0ZWd5KCk7Ci0JCXZpcnR1YWxKb2luVGFibGUgPSAoKE9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxKb2luVGFibGUpOwotCQkoKE9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCXZpcnR1YWxKb2luVGFibGUgPSAoKE9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCB2aXJ0dWFsSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIHZpcnR1YWxKb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJKChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fVEFCTEVfTkFNRSIpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9UQUJMRV9OQU1FX0ZPTyIsIHZpcnR1YWxKb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJKChPcm1FbnRpdHkpIHRhcmdldFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fVEFSR0VUIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX05BTUVfT1JNX1RBUkdFVCIsIHZpcnR1YWxKb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9uZVRvT25lUmVsYXRpb25zaGlwMl8wIHJlbCA9IChPcm1PbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgY29udGV4dE1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxPbmVUb09uZSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9QcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7CQotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtT25lVG9PbmVSZWxhdGlvbnNoaXAyXzAgcmVsID0gKE9ybU9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0Sm9pblRhYmxlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzApIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgdmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS4KLQkJCWdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQotCQlKb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSAKLQkJCXZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfUkVGRVJFTkNFRF9DT0xVTU4iLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIG9ybUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0KLQkJQ2FzY2FkZTJfMCBjYXNjYWRlID0gKENhc2NhZGUyXzApIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0RldGFjaCgpKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgoKE9ycGhhblJlbW92YWxIb2xkZXIyXzApIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKS5pc09ycGhhblJlbW92YWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMCBvcm1PbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzApIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1PbmVUb09uZU1hcHBpbmcuaXNPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkFkZHJlc3MiLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0KLQkJLy9UT0RPIGRlZmF1bHQgam9pbiBjb2x1bW5zIGluIHhtbCBvbmUtdG8tb25lCi0vLwkJWG1sSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtT25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOwotLy8JCS8vVE9ETyBqYXZhIGRlZmF1bHQgY29sdW1ucyBuYW1lIGluIEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLkpvaW5Db2x1bW5Pd25lcgotLy8JCS8vYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCS8vYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQotCQlDYXNjYWRlMl8wIGNhc2NhZGUgPSAoQ2FzY2FkZTJfMCkgb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNEZXRhY2goKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9PbmVNYXBwaW5nLmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOwotCi0JCWFzc2VydEZhbHNlKCgoT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgb3JtT25lVG9PbmVNYXBwaW5nKS5nZXRPcnBoYW5SZW1vdmFsKCkuaXNPcnBoYW5SZW1vdmFsKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfMUVudGl0eU1hcHBpbmdzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfMUVudGl0eU1hcHBpbmdzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc5MjM2OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzFFbnRpdHlNYXBwaW5nc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0FjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmsyXzFDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzFFbnRpdHlNYXBwaW5nc1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rMl8xRW50aXR5TWFwcGluZ3NUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0KLQkJLy9zZXQgYWNjZXNzIHRvIFZJUlRVQUwgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtBY2Nlc3NUeXBlLlZJUlRVQUwsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0QWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhFY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtBY2Nlc3NUeXBlLlZJUlRVQUwsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCW9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyk7Ci0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkR2V0TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzLmdldFNwZWNpZmllZEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2Vzc01ldGhvZHMoKSk7Ci0JCQotCQkvL3NldCBnZXRNZXRob2QgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0QWNjZXNzTWV0aG9kcyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFjY2Vzc01ldGhvZHMoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLnNldEdldE1ldGhvZCgiZ2V0Rm9vIik7Ci0JCWFzc2VydEVxdWFscygiZ2V0Rm9vIiwgZW50aXR5TWFwcGluZ3MuZ2V0U3BlY2lmaWVkR2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoImdldEZvbyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLmdldEdldE1ldGhvZCgpKTsKLQotCQkvL3NldCBnZXRNZXRob2QgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3NNZXRob2RzKCkuc2V0R2V0TWV0aG9kKG51bGwpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzLmdldFNwZWNpZmllZEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2Vzc01ldGhvZHMoKS5nZXRHZXRNZXRob2QoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEdldE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzLmdldFNwZWNpZmllZEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2Vzc01ldGhvZHMoKSk7Ci0KLQkJLy9zZXQgZ2V0TWV0aG9kIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJZW50aXR5TWFwcGluZ3Muc2V0U3BlY2lmaWVkR2V0TWV0aG9kKCJnZXRNZSIpOwotCQlhc3NlcnRFcXVhbHMoImdldE1lIiwgZW50aXR5TWFwcGluZ3MuZ2V0U3BlY2lmaWVkR2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoImdldE1lIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0R2V0TWV0aG9kKCkpOwotCi0JCS8vc2V0IGdldE1ldGhvZCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWVudGl0eU1hcHBpbmdzLnNldFNwZWNpZmllZEdldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncy5nZXRTcGVjaWZpZWRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3NNZXRob2RzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRHZXRNZXRob2QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzLmdldFNwZWNpZmllZEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2Vzc01ldGhvZHMoKSk7Ci0KLQkJLy9zZXQgZ2V0TWV0aG9kIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJZW50aXR5TWFwcGluZ3Muc2V0U3BlY2lmaWVkR2V0TWV0aG9kKCJnZXRNZSIpOwotCQlhc3NlcnRFcXVhbHMoImdldE1lIiwgZW50aXR5TWFwcGluZ3MuZ2V0R2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoImdldE1lIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0R2V0TWV0aG9kKCkpOwotCi0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgYWNjZXNzLW1ldGhvZHMgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLnNldFNldE1ldGhvZCgic2V0TWUiKTsKLQkJLy9zZXQgZ2V0TWV0aG9kIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJZW50aXR5TWFwcGluZ3Muc2V0U3BlY2lmaWVkR2V0TWV0aG9kKG51bGwpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzLmdldEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2Vzc01ldGhvZHMoKS5nZXRHZXRNZXRob2QoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRHZXRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MuZ2V0RGVmYXVsdEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncy5nZXRHZXRNZXRob2QoKSk7Ci0KLQkJZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRHZXRNZXRob2QoImdldEZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImdldEZvbyIsIGVudGl0eU1hcHBpbmdzLmdldERlZmF1bHRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygiZ2V0Rm9vIiwgZW50aXR5TWFwcGluZ3MuZ2V0R2V0TWV0aG9kKCkpOwotCi0JCWVudGl0eU1hcHBpbmdzLnNldFNwZWNpZmllZEdldE1ldGhvZCgiZ2V0QmFyIik7Ci0JCWFzc2VydEVxdWFscygiZ2V0Rm9vIiwgZW50aXR5TWFwcGluZ3MuZ2V0RGVmYXVsdEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZXRCYXIiLCBlbnRpdHlNYXBwaW5ncy5nZXRHZXRNZXRob2QoKSk7Ci0KLQkJZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRHZXRNZXRob2QobnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MuZ2V0RGVmYXVsdEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZXRCYXIiLCBlbnRpdHlNYXBwaW5ncy5nZXRHZXRNZXRob2QoKSk7CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFNldE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncy5nZXREZWZhdWx0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzLmdldFNldE1ldGhvZCgpKTsKLQotCQlnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNldE1ldGhvZCgic2V0Rm9vIik7Ci0JCWFzc2VydEVxdWFscygic2V0Rm9vIiwgZW50aXR5TWFwcGluZ3MuZ2V0RGVmYXVsdFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXRGb28iLCBlbnRpdHlNYXBwaW5ncy5nZXRTZXRNZXRob2QoKSk7Ci0KLQkJZW50aXR5TWFwcGluZ3Muc2V0U3BlY2lmaWVkU2V0TWV0aG9kKCJzZXRCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXRGb28iLCBlbnRpdHlNYXBwaW5ncy5nZXREZWZhdWx0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoInNldEJhciIsIGVudGl0eU1hcHBpbmdzLmdldFNldE1ldGhvZCgpKTsKLQotCQlnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncy5nZXREZWZhdWx0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoInNldEJhciIsIGVudGl0eU1hcHBpbmdzLmdldFNldE1ldGhvZCgpKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTZXRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MuZ2V0U3BlY2lmaWVkU2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzTWV0aG9kcygpKTsKLQotCQkvL3NldCBzZXRNZXRob2QgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0QWNjZXNzTWV0aG9kcyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFjY2Vzc01ldGhvZHMoKSk7Ci0KLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3NNZXRob2RzKCkuc2V0U2V0TWV0aG9kKCJzZXRGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXRGb28iLCBlbnRpdHlNYXBwaW5ncy5nZXRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygic2V0Rm9vIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0U2V0TWV0aG9kKCkpOwotCi0JCS8vc2V0IHNldE1ldGhvZCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2Vzc01ldGhvZHMoKS5zZXRTZXRNZXRob2QobnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MuZ2V0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLmdldFNldE1ldGhvZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkU2V0TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MuZ2V0U3BlY2lmaWVkU2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzTWV0aG9kcygpKTsKLQotCQkvL3NldCBzZXRNZXRob2QgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQllbnRpdHlNYXBwaW5ncy5zZXRTcGVjaWZpZWRTZXRNZXRob2QoInNldE1lIik7Ci0JCWFzc2VydEVxdWFscygic2V0TWUiLCBlbnRpdHlNYXBwaW5ncy5nZXRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygic2V0TWUiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2Vzc01ldGhvZHMoKS5nZXRTZXRNZXRob2QoKSk7Ci0KLQkJLy9zZXQgc2V0TWV0aG9kIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJZW50aXR5TWFwcGluZ3Muc2V0U3BlY2lmaWVkU2V0TWV0aG9kKG51bGwpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzLmdldFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRTZXRNZXRob2QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzLmdldFNwZWNpZmllZFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2Vzc01ldGhvZHMoKSk7Ci0KLQkJLy9zZXQgc2V0TWV0aG9kIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJZW50aXR5TWFwcGluZ3Muc2V0U3BlY2lmaWVkU2V0TWV0aG9kKCJzZXRNZSIpOwotCQlhc3NlcnRFcXVhbHMoInNldE1lIiwgZW50aXR5TWFwcGluZ3MuZ2V0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoInNldE1lIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0U2V0TWV0aG9kKCkpOwotCi0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgYWNjZXNzLW1ldGhvZHMgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLnNldEdldE1ldGhvZCgiZ2V0TWUiKTsKLQkJLy9zZXQgZ2V0TWV0aG9kIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJZW50aXR5TWFwcGluZ3Muc2V0U3BlY2lmaWVkU2V0TWV0aG9kKG51bGwpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzLmdldFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2Vzc01ldGhvZHMoKS5nZXRTZXRNZXRob2QoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfMU9ybUVtYmVkZGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8xT3JtRW1iZWRkYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMjFiNjQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8xT3JtRW1iZWRkYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazJfMUNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMU9ybUVtYmVkZGFibGVUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzFDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazJfMU9ybUVtYmVkZGFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkUGFyZW50Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IChFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlKSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkVtcGxveWVlIik7Ci0JCUVjbGlwc2VMaW5rT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcgPSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbFR5cGVNYXBwaW5nIHhtbFR5cGVNYXBwaW5nID0gKFhtbFR5cGVNYXBwaW5nKSBvcm1UeXBlTWFwcGluZy5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9ybVR5cGVNYXBwaW5nLmdldFNwZWNpZmllZFBhcmVudENsYXNzKCkpOwotCQlhc3NlcnROdWxsKHhtbFR5cGVNYXBwaW5nLmdldFBhcmVudENsYXNzKCkpOwotCi0JCS8vc2V0IHBhcmVudENsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQl4bWxUeXBlTWFwcGluZy5zZXRQYXJlbnRDbGFzcygibW9kZWwuUGFyZW50Iik7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuUGFyZW50Iiwgb3JtVHlwZU1hcHBpbmcuZ2V0U3BlY2lmaWVkUGFyZW50Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuUGFyZW50IiwgeG1sVHlwZU1hcHBpbmcuZ2V0UGFyZW50Q2xhc3MoKSk7Ci0JCQotCQkvL3NldCBwYXJlbnRDbGFzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQl4bWxUeXBlTWFwcGluZy5zZXRQYXJlbnRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1UeXBlTWFwcGluZy5nZXRTcGVjaWZpZWRQYXJlbnRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbCh4bWxUeXBlTWFwcGluZy5nZXRQYXJlbnRDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkUGFyZW50Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gKEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUpIGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRW1wbG95ZWUiKTsKLQkJRWNsaXBzZUxpbmtPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZyA9IHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sVHlwZU1hcHBpbmcgeG1sVHlwZU1hcHBpbmcgPSAoWG1sVHlwZU1hcHBpbmcpIG9ybVR5cGVNYXBwaW5nLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwob3JtVHlwZU1hcHBpbmcuZ2V0U3BlY2lmaWVkUGFyZW50Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoeG1sVHlwZU1hcHBpbmcuZ2V0UGFyZW50Q2xhc3MoKSk7Ci0JCQotCQkvL3NldCBwYXJlbnRDbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybVR5cGVNYXBwaW5nLnNldFNwZWNpZmllZFBhcmVudENsYXNzKCJtb2RlbC5QYXJlbnQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5QYXJlbnQiLCBvcm1UeXBlTWFwcGluZy5nZXRTcGVjaWZpZWRQYXJlbnRDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5QYXJlbnQiLCB4bWxUeXBlTWFwcGluZy5nZXRQYXJlbnRDbGFzcygpKTsKLQkJCi0JCS8vc2V0IHBhcmVudENsYXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtVHlwZU1hcHBpbmcuc2V0U3BlY2lmaWVkUGFyZW50Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtVHlwZU1hcHBpbmcuZ2V0U3BlY2lmaWVkUGFyZW50Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoeG1sVHlwZU1hcHBpbmcuZ2V0UGFyZW50Q2xhc3MoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfMU9ybUVudGl0eVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzFPcm1FbnRpdHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODc3OWY3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfMU9ybUVudGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazJfMUNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMU9ybUVudGl0eVRlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rMl8xT3JtRW50aXR5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFBhcmVudENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSAoRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZSkgZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkVtcGxveWVlIik7Ci0JCUVjbGlwc2VMaW5rT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcgPSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbFR5cGVNYXBwaW5nIHhtbFR5cGVNYXBwaW5nID0gKFhtbFR5cGVNYXBwaW5nKSBvcm1UeXBlTWFwcGluZy5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9ybVR5cGVNYXBwaW5nLmdldFNwZWNpZmllZFBhcmVudENsYXNzKCkpOwotCQlhc3NlcnROdWxsKHhtbFR5cGVNYXBwaW5nLmdldFBhcmVudENsYXNzKCkpOwotCi0JCS8vc2V0IHBhcmVudENsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQl4bWxUeXBlTWFwcGluZy5zZXRQYXJlbnRDbGFzcygibW9kZWwuUGFyZW50Iik7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuUGFyZW50Iiwgb3JtVHlwZU1hcHBpbmcuZ2V0U3BlY2lmaWVkUGFyZW50Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuUGFyZW50IiwgeG1sVHlwZU1hcHBpbmcuZ2V0UGFyZW50Q2xhc3MoKSk7Ci0JCQotCQkvL3NldCBwYXJlbnRDbGFzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQl4bWxUeXBlTWFwcGluZy5zZXRQYXJlbnRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1UeXBlTWFwcGluZy5nZXRTcGVjaWZpZWRQYXJlbnRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbCh4bWxUeXBlTWFwcGluZy5nZXRQYXJlbnRDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkUGFyZW50Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gKEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUpIGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5FbXBsb3llZSIpOwotCQlFY2xpcHNlTGlua09ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nID0gcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxUeXBlTWFwcGluZyB4bWxUeXBlTWFwcGluZyA9IChYbWxUeXBlTWFwcGluZykgb3JtVHlwZU1hcHBpbmcuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvcm1UeXBlTWFwcGluZy5nZXRTcGVjaWZpZWRQYXJlbnRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbCh4bWxUeXBlTWFwcGluZy5nZXRQYXJlbnRDbGFzcygpKTsKLQkJCi0JCS8vc2V0IHBhcmVudENsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtVHlwZU1hcHBpbmcuc2V0U3BlY2lmaWVkUGFyZW50Q2xhc3MoIm1vZGVsLlBhcmVudCIpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLlBhcmVudCIsIG9ybVR5cGVNYXBwaW5nLmdldFNwZWNpZmllZFBhcmVudENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLlBhcmVudCIsIHhtbFR5cGVNYXBwaW5nLmdldFBhcmVudENsYXNzKCkpOwotCQkKLQkJLy9zZXQgcGFyZW50Q2xhc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1UeXBlTWFwcGluZy5zZXRTcGVjaWZpZWRQYXJlbnRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1UeXBlTWFwcGluZy5nZXRTcGVjaWZpZWRQYXJlbnRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbCh4bWxUeXBlTWFwcGluZy5nZXRQYXJlbnRDbGFzcygpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8xT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzFPcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIxNmQxMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzFPcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8xQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8xT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rMl8xT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRQYXJlbnRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gKEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUpIGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkVtcGxveWVlIik7Ci0JCUVjbGlwc2VMaW5rT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcgPSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbFR5cGVNYXBwaW5nIHhtbFR5cGVNYXBwaW5nID0gKFhtbFR5cGVNYXBwaW5nKSBvcm1UeXBlTWFwcGluZy5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9ybVR5cGVNYXBwaW5nLmdldFNwZWNpZmllZFBhcmVudENsYXNzKCkpOwotCQlhc3NlcnROdWxsKHhtbFR5cGVNYXBwaW5nLmdldFBhcmVudENsYXNzKCkpOwotCi0JCS8vc2V0IHBhcmVudENsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQl4bWxUeXBlTWFwcGluZy5zZXRQYXJlbnRDbGFzcygibW9kZWwuUGFyZW50Iik7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuUGFyZW50Iiwgb3JtVHlwZU1hcHBpbmcuZ2V0U3BlY2lmaWVkUGFyZW50Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuUGFyZW50IiwgeG1sVHlwZU1hcHBpbmcuZ2V0UGFyZW50Q2xhc3MoKSk7Ci0JCQotCQkvL3NldCBwYXJlbnRDbGFzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQl4bWxUeXBlTWFwcGluZy5zZXRQYXJlbnRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1UeXBlTWFwcGluZy5nZXRTcGVjaWZpZWRQYXJlbnRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbCh4bWxUeXBlTWFwcGluZy5nZXRQYXJlbnRDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkUGFyZW50Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gKEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUpIGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkVtcGxveWVlIik7Ci0JCUVjbGlwc2VMaW5rT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcgPSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbFR5cGVNYXBwaW5nIHhtbFR5cGVNYXBwaW5nID0gKFhtbFR5cGVNYXBwaW5nKSBvcm1UeXBlTWFwcGluZy5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9ybVR5cGVNYXBwaW5nLmdldFNwZWNpZmllZFBhcmVudENsYXNzKCkpOwotCQlhc3NlcnROdWxsKHhtbFR5cGVNYXBwaW5nLmdldFBhcmVudENsYXNzKCkpOwotCQkKLQkJLy9zZXQgcGFyZW50Q2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1UeXBlTWFwcGluZy5zZXRTcGVjaWZpZWRQYXJlbnRDbGFzcygibW9kZWwuUGFyZW50Iik7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuUGFyZW50Iiwgb3JtVHlwZU1hcHBpbmcuZ2V0U3BlY2lmaWVkUGFyZW50Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuUGFyZW50IiwgeG1sVHlwZU1hcHBpbmcuZ2V0UGFyZW50Q2xhc3MoKSk7Ci0JCQotCQkvL3NldCBwYXJlbnRDbGFzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybVR5cGVNYXBwaW5nLnNldFNwZWNpZmllZFBhcmVudENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVR5cGVNYXBwaW5nLmdldFNwZWNpZmllZFBhcmVudENsYXNzKCkpOwotCQlhc3NlcnROdWxsKHhtbFR5cGVNYXBwaW5nLmdldFBhcmVudENsYXNzKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzFPcm1QZXJzaXN0ZW50VHlwZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzFPcm1QZXJzaXN0ZW50VHlwZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YTM0OWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8xT3JtUGVyc2lzdGVudFR5cGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0FjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8xQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8xT3JtUGVyc2lzdGVudFR5cGVUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzFDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazJfMU9ybVBlcnNpc3RlbnRUeXBlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEdldE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAoRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZSkgZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVhtbEFjY2Vzc01ldGhvZHNIb2xkZXIgeG1sQWNjZXNzTWV0aG9kc0hvbGRlciA9IChYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5nZXRBY2Nlc3NNZXRob2RzKCkpOwotCi0JCS8vc2V0IGdldE1ldGhvZCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5zZXRBY2Nlc3NNZXRob2RzKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQWNjZXNzTWV0aG9kcygpKTsKLQkJeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5nZXRBY2Nlc3NNZXRob2RzKCkuc2V0R2V0TWV0aG9kKCJnZXRGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZXRGb28iLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygiZ2V0Rm9vIiwgeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0R2V0TWV0aG9kKCkpOwotCQkKLQkJLy9zZXQgZ2V0TWV0aG9kIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuZ2V0QWNjZXNzTWV0aG9kcygpLnNldEdldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0R2V0TWV0aG9kKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRHZXRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAoRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZSkgZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVhtbEFjY2Vzc01ldGhvZHNIb2xkZXIgeG1sQWNjZXNzTWV0aG9kc0hvbGRlciA9IChYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5nZXRBY2Nlc3NNZXRob2RzKCkpOwotCQkKLQkJLy9zZXQgZ2V0TWV0aG9kIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkR2V0TWV0aG9kKCJnZXRNZSIpOwotCQlhc3NlcnRFcXVhbHMoImdldE1lIiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkR2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoImdldE1lIiwgeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0R2V0TWV0aG9kKCkpOwotCQkKLQkJLy9zZXQgZ2V0TWV0aG9kIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkR2V0TWV0aG9kKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBY2Nlc3NNZXRob2RzSG9sZGVyLmdldEFjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRHZXRNZXRob2QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IChFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlKSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJWG1sQWNjZXNzTWV0aG9kc0hvbGRlciB4bWxBY2Nlc3NNZXRob2RzSG9sZGVyID0gKFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBY2Nlc3NNZXRob2RzSG9sZGVyLmdldEFjY2Vzc01ldGhvZHMoKSk7Ci0JCQotCQkvL3NldCBnZXRNZXRob2QgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRHZXRNZXRob2QoImdldE1lIik7Ci0JCWFzc2VydEVxdWFscygiZ2V0TWUiLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygiZ2V0TWUiLCB4bWxBY2Nlc3NNZXRob2RzSG9sZGVyLmdldEFjY2Vzc01ldGhvZHMoKS5nZXRHZXRNZXRob2QoKSk7Ci0JCQotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIGFjY2Vzcy1tZXRob2RzIGVsZW1lbnQgc28gaXQgZG9lc24ndCBnZXQgcmVtb3ZlZAotCQl4bWxBY2Nlc3NNZXRob2RzSG9sZGVyLmdldEFjY2Vzc01ldGhvZHMoKS5zZXRTZXRNZXRob2QoInNldE1lIik7Ci0JCS8vc2V0IGdldE1ldGhvZCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEdldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0R2V0TWV0aG9kKCkpOwotCX0KLQotCS8vVE9ETyBkZWZhdWx0IGZyb20gc3VwZXIgY2xhc3MsIGRlZmF1bHQgZnJvbSBtYXBwZWQgc3VwZXIgY2xhc3MsIHdoYXQgYWJvdXQgYSBkZWZhdWx0IG9uIGFuIGVtYmVkZGFibGU/Ci0JLy9kZWZhdWx0IGZyb20gcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cywgZGVmYXVsdCBmcm9tIGVudGl0eS1tYXBwaW5ncywgZGVmYXVsdCBmcm9tIGphdmEgZW50aXR5Ci0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRHZXRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gKEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUpIGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlYbWxBY2Nlc3NNZXRob2RzSG9sZGVyIHhtbEFjY2Vzc01ldGhvZHNIb2xkZXIgPSAoWG1sQWNjZXNzTWV0aG9kc0hvbGRlcikgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwob3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkR2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0R2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKHhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuZ2V0QWNjZXNzTWV0aG9kcygpKTsKLQotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoRWNsaXBzZUxpbmtBY2Nlc3NUeXBlLlZJUlRVQUwpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZXQiLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygiZ2V0Iiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBY2Nlc3NNZXRob2RzSG9sZGVyLmdldEFjY2Vzc01ldGhvZHMoKSk7Ci0KLQkJZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRHZXRNZXRob2QoImdldEZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImdldEZvbyIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygiZ2V0Rm9vIiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0R2V0TWV0aG9kKCkpOwotCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEdldE1ldGhvZCgiZ2V0QmFyIik7Ci0JCWFzc2VydEVxdWFscygiZ2V0Rm9vIiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZXRCYXIiLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRHZXRNZXRob2QoKSk7Ci0JCQotCQlnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZEdldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZXQiLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0R2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoImdldEJhciIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEdldE1ldGhvZCgpKTsKLQotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEdldE1ldGhvZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkU2V0TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IChFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlKSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJWG1sQWNjZXNzTWV0aG9kc0hvbGRlciB4bWxBY2Nlc3NNZXRob2RzSG9sZGVyID0gKFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBY2Nlc3NNZXRob2RzSG9sZGVyLmdldEFjY2Vzc01ldGhvZHMoKSk7Ci0KLQkJLy9zZXQgc2V0TWV0aG9kIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQl4bWxBY2Nlc3NNZXRob2RzSG9sZGVyLnNldEFjY2Vzc01ldGhvZHMoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBY2Nlc3NNZXRob2RzKCkpOwotCQl4bWxBY2Nlc3NNZXRob2RzSG9sZGVyLmdldEFjY2Vzc01ldGhvZHMoKS5zZXRTZXRNZXRob2QoInNldEZvbyIpOwotCQlhc3NlcnRFcXVhbHMoInNldEZvbyIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXRGb28iLCB4bWxBY2Nlc3NNZXRob2RzSG9sZGVyLmdldEFjY2Vzc01ldGhvZHMoKS5nZXRTZXRNZXRob2QoKSk7Ci0JCQotCQkvL3NldCBzZXRNZXRob2QgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5nZXRBY2Nlc3NNZXRob2RzKCkuc2V0U2V0TWV0aG9kKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBY2Nlc3NNZXRob2RzSG9sZGVyLmdldEFjY2Vzc01ldGhvZHMoKS5nZXRTZXRNZXRob2QoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFNldE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IChFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlKSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJWG1sQWNjZXNzTWV0aG9kc0hvbGRlciB4bWxBY2Nlc3NNZXRob2RzSG9sZGVyID0gKFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBY2Nlc3NNZXRob2RzSG9sZGVyLmdldEFjY2Vzc01ldGhvZHMoKSk7Ci0JCQotCQkvL3NldCBzZXRNZXRob2QgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRTZXRNZXRob2QoInNldE1lIik7Ci0JCWFzc2VydEVxdWFscygic2V0TWUiLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygic2V0TWUiLCB4bWxBY2Nlc3NNZXRob2RzSG9sZGVyLmdldEFjY2Vzc01ldGhvZHMoKS5nZXRTZXRNZXRob2QoKSk7Ci0JCQotCQkvL3NldCBzZXRNZXRob2QgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRTZXRNZXRob2QobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkU2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKHhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuZ2V0QWNjZXNzTWV0aG9kcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFNldE1ldGhvZDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gKEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUpIGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlYbWxBY2Nlc3NNZXRob2RzSG9sZGVyIHhtbEFjY2Vzc01ldGhvZHNIb2xkZXIgPSAoWG1sQWNjZXNzTWV0aG9kc0hvbGRlcikgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwob3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkU2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKHhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuZ2V0QWNjZXNzTWV0aG9kcygpKTsKLQkJCi0JCS8vc2V0IHNldE1ldGhvZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZFNldE1ldGhvZCgic2V0TWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXRNZSIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXRNZSIsIHhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuZ2V0QWNjZXNzTWV0aG9kcygpLmdldFNldE1ldGhvZCgpKTsKLQkJCi0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgYWNjZXNzLW1ldGhvZHMgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCi0JCXhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuZ2V0QWNjZXNzTWV0aG9kcygpLnNldEdldE1ldGhvZCgiZ2V0TWUiKTsKLQkJLy9zZXQgc2V0TWV0aG9kIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkU2V0TWV0aG9kKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBY2Nlc3NNZXRob2RzSG9sZGVyLmdldEFjY2Vzc01ldGhvZHMoKS5nZXRTZXRNZXRob2QoKSk7Ci0JfQotCi0JLy9UT0RPIGRlZmF1bHQgZnJvbSBzdXBlciBjbGFzcywgZGVmYXVsdCBmcm9tIG1hcHBlZCBzdXBlciBjbGFzcywgd2hhdCBhYm91dCBhIGRlZmF1bHQgb24gYW4gZW1iZWRkYWJsZT8KLQkvL2RlZmF1bHQgZnJvbSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzLCBkZWZhdWx0IGZyb20gZW50aXR5LW1hcHBpbmdzLCBkZWZhdWx0IGZyb20gamF2YSBlbnRpdHkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFNldE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAoRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZSkgZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVhtbEFjY2Vzc01ldGhvZHNIb2xkZXIgeG1sQWNjZXNzTWV0aG9kc0hvbGRlciA9IChYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwob3JtUGVyc2lzdGVudFR5cGUuZ2V0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5nZXRBY2Nlc3NNZXRob2RzKCkpOwotCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhFY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCk7Ci0JCWFzc2VydE51bGwob3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkU2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoInNldCIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXQiLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKHhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuZ2V0QWNjZXNzTWV0aG9kcygpKTsKLQotCQlnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNldE1ldGhvZCgic2V0Rm9vIik7Ci0JCWFzc2VydEVxdWFscygic2V0Rm9vIiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXRGb28iLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTZXRNZXRob2QoKSk7Ci0KLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkU2V0TWV0aG9kKCJzZXRCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXRGb28iLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoInNldEJhciIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNldE1ldGhvZCgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkU2V0TWV0aG9kKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoInNldCIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygic2V0QmFyIiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U2V0TWV0aG9kKCkpOwotCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0U2V0TWV0aG9kKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHsKLQkJcmV0dXJuKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRWaXJ0dWFsQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSAoRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50VHlwZSkgZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkVtcGxveWVlIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IHBlcnNpc3RlbnRUeXBlLmFkZFZpcnR1YWxBdHRyaWJ1dGUoImlkIiwgTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaW50Iik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJT3JtSWRNYXBwaW5nIGlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGlkTWFwcGluZy5nZXRBdHRyaWJ1dGVUeXBlKCkpOwotCQkKLQkJWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3MgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpOwotCQlYbWxFbnRpdHkgeG1sRW50aXR5ID0gKFhtbEVudGl0eSkgeG1sRW50aXR5TWFwcGluZ3MuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbElkIHhtbElkID0gKFhtbElkKSB4bWxFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHhtbElkLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgeG1sSWQuZ2V0QXR0cmlidXRlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJWSVJUVUFMIiwgeG1sSWQuZ2V0QWNjZXNzKCkpOwotCi0JCS8vaWYgdGhlIGVudGl0eSBhY2Nlc3MgaXMgc2V0IHRvIFZJUlRVQUwsIHRlc3QgdGhhdCB0aGUgYWRkZWQgdmlydHVhbCBhdHRyaWJ1dGUgbWFwcGluZyBoYXMgbm8gc3BlY2lmaWVkIGFjY2VzcwotCQlwZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoRWNsaXBzZUxpbmtBY2Nlc3NUeXBlLlZJUlRVQUwpOwotCQlwZXJzaXN0ZW50QXR0cmlidXRlID0gcGVyc2lzdGVudFR5cGUuYWRkVmlydHVhbEF0dHJpYnV0ZSgibmFtZSIsIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIlN0cmluZyIpOwotCi0JCWFzc2VydEVxdWFscygibmFtZSIsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCU9ybUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBiYXNpY01hcHBpbmcuZ2V0QXR0cmlidXRlVHlwZSgpKTsKLQkJCi0JCVhtbEJhc2ljIHhtbEJhc2ljID0gKFhtbEJhc2ljKSB4bWxFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgeG1sQmFzaWMuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCB4bWxCYXNpYy5nZXRBdHRyaWJ1dGVUeXBlKCkpOwotCQlhc3NlcnROdWxsKHhtbEJhc2ljLmdldEFjY2VzcygpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8xUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8xUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWM5M2RiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfMVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0FjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazJfMUNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8xQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzFQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHsKLQkJcmV0dXJuKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB7Ci0JCXJldHVybiAoWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNBbGxGZWF0dXJlc1Vuc2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1Vuc2V0KCkpOwotCQkKLQkJWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZSA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRDYXNjYWRlUGVyc2lzdChmYWxzZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRTY2hlbWEoImFzZGYiKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRDYXRhbG9nKCJhc2RmIik7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2Uuc2V0Q2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtBY2Nlc3NUeXBlLlZJUlRVQUwpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtBY2Nlc3NUeXBlLlZJUlRVQUwsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZEFjY2VzcyhFY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlBY2Nlc3MyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQWNjZXNzKEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtBY2Nlc3NUeXBlLlZJUlRVQUwsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IHNvIGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5QWNjZXNzMygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IHNvIG9ubHkgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IGdldHMgcmVtb3ZlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQWNjZXNzKEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtBY2Nlc3NUeXBlLlZJUlRVQUwsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlR2V0TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgZ2V0TWV0aG9kIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2Vzc01ldGhvZHMoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBY2Nlc3NNZXRob2RzKCkpOwotCi0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLnNldEdldE1ldGhvZCgiZ2V0Rm9vIik7Ci0JCWFzc2VydEVxdWFscygiZ2V0Rm9vIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0R2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoImdldEZvbyIsIGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLmdldEdldE1ldGhvZCgpKTsKLQkKLQkJLy9zZXQgZ2V0TWV0aG9kIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLnNldEdldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0R2V0TWV0aG9kKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5R2V0TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0R2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBnZXRNZXRob2QgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRHZXRNZXRob2QoImdldE1lIik7Ci0JCWFzc2VydEVxdWFscygiZ2V0TWUiLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygiZ2V0TWUiLCBnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2Vzc01ldGhvZHMoKS5nZXRHZXRNZXRob2QoKSk7Ci0JCQotCQkvL3NldCBnZXRNZXRob2QgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRHZXRNZXRob2QobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0R2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlHZXRNZXRob2QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgZ2V0TWV0aG9kIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkR2V0TWV0aG9kKCJnZXRNZSIpOwotCQlhc3NlcnRFcXVhbHMoImdldE1lIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0R2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoImdldE1lIiwgZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0R2V0TWV0aG9kKCkpOwotCQkKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBhY2Nlc3MtbWV0aG9kcyBlbGVtZW50IHNvIGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3NNZXRob2RzKCkuc2V0U2V0TWV0aG9kKCJzZXRNZSIpOwotCQkvL3NldCBnZXRNZXRob2QgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRHZXRNZXRob2QobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0R2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLmdldEdldE1ldGhvZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUdldE1ldGhvZDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0R2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgc28gb25seSBhY2Nlc3MtbWV0aG9kcyBlbGVtZW50IGdldHMgcmVtb3ZlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJCi0JCS8vc2V0IGdldE1ldGhvZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZEdldE1ldGhvZCgiZ2V0TWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZXRNZSIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZXRNZSIsIGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLmdldEdldE1ldGhvZCgpKTsKLQkJCi0JCS8vc2V0IGdldE1ldGhvZCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZEdldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3NNZXRob2RzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU2V0TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgZ2V0TWV0aG9kIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2Vzc01ldGhvZHMoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBY2Nlc3NNZXRob2RzKCkpOwotCi0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLnNldFNldE1ldGhvZCgic2V0Rm9vIik7Ci0JCWFzc2VydEVxdWFscygic2V0Rm9vIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoInNldEZvbyIsIGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLmdldFNldE1ldGhvZCgpKTsKLQkKLQkJLy9zZXQgZ2V0TWV0aG9kIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLnNldFNldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0U2V0TWV0aG9kKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U2V0TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBnZXRNZXRob2QgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRTZXRNZXRob2QoInNldE1lIik7Ci0JCWFzc2VydEVxdWFscygic2V0TWUiLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygic2V0TWUiLCBnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2Vzc01ldGhvZHMoKS5nZXRTZXRNZXRob2QoKSk7Ci0JCQotCQkvL3NldCBnZXRNZXRob2QgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRTZXRNZXRob2QobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTZXRNZXRob2QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgZ2V0TWV0aG9kIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkU2V0TWV0aG9kKCJzZXRNZSIpOwotCQlhc3NlcnRFcXVhbHMoInNldE1lIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoInNldE1lIiwgZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0U2V0TWV0aG9kKCkpOwotCQkKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBhY2Nlc3MtbWV0aG9kcyBlbGVtZW50IHNvIGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3NNZXRob2RzKCkuc2V0R2V0TWV0aG9kKCJnZXRNZSIpOwotCQkvL3NldCBnZXRNZXRob2QgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRTZXRNZXRob2QobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLmdldFNldE1ldGhvZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNldE1ldGhvZDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgc28gb25seSBhY2Nlc3MtbWV0aG9kcyBlbGVtZW50IGdldHMgcmVtb3ZlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJCi0JCS8vc2V0IGdldE1ldGhvZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNldE1ldGhvZCgic2V0TWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXRNZSIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXRNZSIsIGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLmdldFNldE1ldGhvZCgpKTsKLQkJCi0JCS8vc2V0IGdldE1ldGhvZCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3NNZXRob2RzKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfM09ybU11bHRpdGVuYW5jeVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzNPcm1NdWx0aXRlbmFuY3lUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDk0ZWZkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfM09ybU11bHRpdGVuYW5jeVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11bHRpdGVuYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGl0ZW5hbnRIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8zLk11bHRpdGVuYW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazJfM0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfM09ybU11bHRpdGVuYW5jeVRlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfM0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCX1RZUEVfTkFNRSA9ICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBTVUJfVFlQRV9OQU1FOwotCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzNPcm1NdWx0aXRlbmFuY3lUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TXVsdGl0ZW5hbnRNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPigKLQkJCQkJSlBBLk1BUFBFRF9TVVBFUkNMQVNTLAotCQkJCQlFY2xpcHNlTGluay5NVUxUSVRFTkFOVCwKLQkJCQkJRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATXVsdGl0ZW5hbnQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4obmFtZT1cIk1TX1RFTkFOVF9JRFwiKSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TXVsdGl0ZW5hbnRSb290RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPigKLQkJCQkJSlBBLkVOVElUWSwKLQkJCQkJSlBBLklOSEVSSVRBTkNFLAotCQkJCQlFY2xpcHNlTGluay5NVUxUSVRFTkFOVCwKLQkJCQkJRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBJbmhlcml0ZW5hY2UiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE11bHRpdGVuYW50IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKG5hbWU9XCJST09UX0VOVElUWV9URU5BTlRfSURcIikiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJWG1sTXVsdGl0ZW5hbnRIb2xkZXIgbXVsdGl0ZW5hbnRIb2xkZXIgPSAoWG1sTXVsdGl0ZW5hbnRIb2xkZXIpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCW11bHRpdGVuYW50SG9sZGVyLnNldE11bHRpdGVuYW50KEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTXVsdGl0ZW5hbnQoKSk7Ci0KLQkJT3JtRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgb3JtTXVsdGl0ZW5hbmN5ID0gKChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRNdWx0aXRlbmFuY3koKTsKLQkJWG1sTXVsdGl0ZW5hbnQgbXVsdGl0ZW5hbnRSZXNvdXJjZSA9IG11bHRpdGVuYW50SG9sZGVyLmdldE11bHRpdGVuYW50KCk7Ci0JCWFzc2VydE51bGwob3JtTXVsdGl0ZW5hbmN5LmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydE51bGwobXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUeXBlKCkpOwotCi0JCS8vc2V0IHR5cGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW11bHRpdGVuYW50UmVzb3VyY2Uuc2V0VHlwZShNdWx0aXRlbmFudFR5cGUuU0lOR0xFX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlNJTkdMRV9UQUJMRSwgb3JtTXVsdGl0ZW5hbmN5LmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhNdWx0aXRlbmFudFR5cGUuU0lOR0xFX1RBQkxFLCBtdWx0aXRlbmFudFJlc291cmNlLmdldFR5cGUoKSk7Ci0KLQkJLy9zZXQgdHlwZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltdWx0aXRlbmFudFJlc291cmNlLnNldFR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTXVsdGl0ZW5hbmN5LmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydE51bGwobXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUeXBlKCkpOwotCi0JCW11bHRpdGVuYW50UmVzb3VyY2Uuc2V0VHlwZShNdWx0aXRlbmFudFR5cGUuVEFCTEVfUEVSX1RFTkFOVCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5UQUJMRV9QRVJfVEVOQU5ULCBvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE11bHRpdGVuYW50VHlwZS5UQUJMRV9QRVJfVEVOQU5ULCBtdWx0aXRlbmFudFJlc291cmNlLmdldFR5cGUoKSk7Ci0KLQkJbXVsdGl0ZW5hbnRSZXNvdXJjZS5zZXRUeXBlKE11bHRpdGVuYW50VHlwZS5WUEQpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuVlBELCBvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE11bHRpdGVuYW50VHlwZS5WUEQsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VHlwZSgpKTsKLQotCQltdWx0aXRlbmFudEhvbGRlci5zZXRNdWx0aXRlbmFudChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NdWx0aXRlbmFuY3kuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChtdWx0aXRlbmFudEhvbGRlci5nZXRNdWx0aXRlbmFudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJWG1sTXVsdGl0ZW5hbnRIb2xkZXIgbXVsdGl0ZW5hbnRIb2xkZXIgPSAoWG1sTXVsdGl0ZW5hbnRIb2xkZXIpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCW11bHRpdGVuYW50SG9sZGVyLnNldE11bHRpdGVuYW50KEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTXVsdGl0ZW5hbnQoKSk7Ci0KLQkJT3JtRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgb3JtTXVsdGl0ZW5hbmN5ID0gKChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRNdWx0aXRlbmFuY3koKTsKLQkJWG1sTXVsdGl0ZW5hbnQgbXVsdGl0ZW5hbnRSZXNvdXJjZSA9IG11bHRpdGVuYW50SG9sZGVyLmdldE11bHRpdGVuYW50KCk7Ci0JCWFzc2VydE51bGwob3JtTXVsdGl0ZW5hbmN5LmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydE51bGwobXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUeXBlKCkpOwotCi0JCS8vc2V0IHR5cGUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1NdWx0aXRlbmFuY3kuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5TSU5HTEVfVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuU0lOR0xFX1RBQkxFLCBvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE11bHRpdGVuYW50VHlwZS5TSU5HTEVfVEFCTEUsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VHlwZSgpKTsKLQotCQlvcm1NdWx0aXRlbmFuY3kuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5WUEQpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuVlBELCBvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE11bHRpdGVuYW50VHlwZS5WUEQsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VHlwZSgpKTsKLQotCQlvcm1NdWx0aXRlbmFuY3kuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5UQUJMRV9QRVJfVEVOQU5UKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlRBQkxFX1BFUl9URU5BTlQsIG9ybU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoTXVsdGl0ZW5hbnRUeXBlLlRBQkxFX1BFUl9URU5BTlQsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VHlwZSgpKTsKLQotCQkvL3NldCB0eXBlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTXVsdGl0ZW5hbmN5LnNldFNwZWNpZmllZFR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTXVsdGl0ZW5hbmN5LmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydE51bGwobXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUeXBlKCkpOwkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlYbWxNdWx0aXRlbmFudEhvbGRlciBtdWx0aXRlbmFudEhvbGRlciA9IChYbWxNdWx0aXRlbmFudEhvbGRlcikgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJbXVsdGl0ZW5hbnRIb2xkZXIuc2V0TXVsdGl0ZW5hbnQoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNdWx0aXRlbmFudCgpKTsKLQotCQlPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBvcm1NdWx0aXRlbmFuY3kgPSAoKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldE11bHRpdGVuYW5jeSgpOwotCQlYbWxNdWx0aXRlbmFudCBtdWx0aXRlbmFudFJlc291cmNlID0gbXVsdGl0ZW5hbnRIb2xkZXIuZ2V0TXVsdGl0ZW5hbnQoKTsKLQotCQlhc3NlcnROdWxsKG9ybU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0JCWFzc2VydE51bGwobXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0KLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbXVsdGl0ZW5hbnRSZXNvdXJjZS5zZXRJbmNsdWRlQ3JpdGVyaWEoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtTXVsdGl0ZW5hbmN5LmdldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0KLQkJbXVsdGl0ZW5hbnRSZXNvdXJjZS5zZXRJbmNsdWRlQ3JpdGVyaWEoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0KLQkJLy9zZXQgZW51bWVyYXRlZCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltdWx0aXRlbmFudFJlc291cmNlLnNldEluY2x1ZGVDcml0ZXJpYShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhKCkpOwotCQlhc3NlcnROdWxsKG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0SW5jbHVkZUNyaXRlcmlhKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCVhtbE11bHRpdGVuYW50SG9sZGVyIG11bHRpdGVuYW50SG9sZGVyID0gKFhtbE11bHRpdGVuYW50SG9sZGVyKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQltdWx0aXRlbmFudEhvbGRlci5zZXRNdWx0aXRlbmFudChFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE11bHRpdGVuYW50KCkpOwotCi0JCU9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIG9ybU11bHRpdGVuYW5jeSA9ICgoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0TXVsdGl0ZW5hbmN5KCk7Ci0JCVhtbE11bHRpdGVuYW50IG11bHRpdGVuYW50UmVzb3VyY2UgPSBtdWx0aXRlbmFudEhvbGRlci5nZXRNdWx0aXRlbmFudCgpOwotCi0JCWFzc2VydE51bGwob3JtTXVsdGl0ZW5hbmN5LmdldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYSgpKTsKLQkJYXNzZXJ0TnVsbChtdWx0aXRlbmFudFJlc291cmNlLmdldEluY2x1ZGVDcml0ZXJpYSgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1NdWx0aXRlbmFuY3kuc2V0U3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0SW5jbHVkZUNyaXRlcmlhKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhKCkpOwotCi0JCW9ybU11bHRpdGVuYW5jeS5zZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtdWx0aXRlbmFudFJlc291cmNlLmdldEluY2x1ZGVDcml0ZXJpYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0KLQkJLy9zZXQgZW51bWVyYXRlZCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU11bHRpdGVuYW5jeS5zZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEobnVsbCk7Ci0JCWFzc2VydE51bGwobXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0JCWFzc2VydE51bGwob3JtTXVsdGl0ZW5hbmN5LmdldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJWG1sTXVsdGl0ZW5hbnRIb2xkZXIgbXVsdGl0ZW5hbnRIb2xkZXIgPSAoWG1sTXVsdGl0ZW5hbnRIb2xkZXIpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCW11bHRpdGVuYW50SG9sZGVyLnNldE11bHRpdGVuYW50KEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTXVsdGl0ZW5hbnQoKSk7Ci0KLQkJT3JtRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgb3JtTXVsdGl0ZW5hbmN5ID0gKChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRNdWx0aXRlbmFuY3koKTsKLQkJWG1sTXVsdGl0ZW5hbnQgbXVsdGl0ZW5hbnRSZXNvdXJjZSA9IG11bHRpdGVuYW50SG9sZGVyLmdldE11bHRpdGVuYW50KCk7Ci0KLQkJT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uID0gb3JtTXVsdGl0ZW5hbmN5LmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMCk7Ci0JCXRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBtdWx0aXRlbmFudFJlc291cmNlLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0KLQkJT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMiA9IG9ybU11bHRpdGVuYW5jeS5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKDApOwotCQl0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBtdWx0aXRlbmFudFJlc291cmNlLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQkJT3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMyB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMyA9IG9ybU11bHRpdGVuYW5jeS5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKDEpOwotCQl0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBtdWx0aXRlbmFudFJlc291cmNlLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IG9ybU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4zLCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHModGVuYW50RGlzY3JpbWluYXRvckNvbHVtbiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpKTsKLQotCQl0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IG9ybU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCVhtbE11bHRpdGVuYW50SG9sZGVyIG11bHRpdGVuYW50SG9sZGVyID0gKFhtbE11bHRpdGVuYW50SG9sZGVyKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQltdWx0aXRlbmFudEhvbGRlci5zZXRNdWx0aXRlbmFudChFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE11bHRpdGVuYW50KCkpOwotCi0JCU9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIG9ybU11bHRpdGVuYW5jeSA9ICgoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0TXVsdGl0ZW5hbmN5KCk7Ci0JCVhtbE11bHRpdGVuYW50IG11bHRpdGVuYW50UmVzb3VyY2UgPSBtdWx0aXRlbmFudEhvbGRlci5nZXRNdWx0aXRlbmFudCgpOwotCi0JCW9ybU11bHRpdGVuYW5jeS5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1NdWx0aXRlbmFuY3kuYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtTXVsdGl0ZW5hbmN5LmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5zaXplKCkpOwotCi0JCW9ybU11bHRpdGVuYW5jeS5yZW1vdmVTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlvcm1NdWx0aXRlbmFuY3kucmVtb3ZlU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQotCQlvcm1NdWx0aXRlbmFuY3kucmVtb3ZlU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJWG1sTXVsdGl0ZW5hbnRIb2xkZXIgbXVsdGl0ZW5hbnRIb2xkZXIgPSAoWG1sTXVsdGl0ZW5hbnRIb2xkZXIpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCW11bHRpdGVuYW50SG9sZGVyLnNldE11bHRpdGVuYW50KEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTXVsdGl0ZW5hbnQoKSk7Ci0KLQkJT3JtRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgb3JtTXVsdGl0ZW5hbmN5ID0gKChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRNdWx0aXRlbmFuY3koKTsKLQkJWG1sTXVsdGl0ZW5hbnQgbXVsdGl0ZW5hbnRSZXNvdXJjZSA9IG11bHRpdGVuYW50SG9sZGVyLmdldE11bHRpdGVuYW50KCk7Ci0KLQkJb3JtTXVsdGl0ZW5hbmN5LmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybU11bHRpdGVuYW5jeS5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1NdWx0aXRlbmFuY3kuYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLnNpemUoKSk7Ci0KLQotCQlvcm1NdWx0aXRlbmFuY3kubW92ZVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IG9ybU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBtdWx0aXRlbmFudFJlc291cmNlLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW9ybU11bHRpdGVuYW5jeS5tb3ZlU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigwLCAxKTsKLQkJdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMgPSBvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBtdWx0aXRlbmFudFJlc291cmNlLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlYbWxNdWx0aXRlbmFudEhvbGRlciBtdWx0aXRlbmFudEhvbGRlciA9IChYbWxNdWx0aXRlbmFudEhvbGRlcikgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJbXVsdGl0ZW5hbnRIb2xkZXIuc2V0TXVsdGl0ZW5hbnQoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNdWx0aXRlbmFudCgpKTsKLQotCQlPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBvcm1NdWx0aXRlbmFuY3kgPSAoKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldE11bHRpdGVuYW5jeSgpOwotCQlYbWxNdWx0aXRlbmFudCBtdWx0aXRlbmFudFJlc291cmNlID0gbXVsdGl0ZW5hbnRIb2xkZXIuZ2V0TXVsdGl0ZW5hbnQoKTsKLQotCQltdWx0aXRlbmFudFJlc291cmNlLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuYWRkKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQkJbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLmFkZChFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCW11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5hZGQoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCkpOwotCi0JCW11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCW11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zID0gb3JtTXVsdGl0ZW5hbmN5LmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQltdWx0aXRlbmFudFJlc291cmNlLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkubW92ZSgyLCAwKTsKLQkJdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMgPSBvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCW11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5tb3ZlKDAsIDEpOwotCQl0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IG9ybU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMgPSBvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCW11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCXRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zID0gb3JtTXVsdGl0ZW5hbmN5LmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQltdWx0aXRlbmFudFJlc291cmNlLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JLy9NYXBwZWRTdXBlcmNsYXNzIHNwZWNpZmllcyBtdWx0aXRlbmFuY3ksIGFsbCBzdWJjbGFzcyBlbnRpdGllcyBhcmUgbXVsdGl0ZW5hbnQgYnkgZGVmYXVsdC4KLQlwdWJsaWMgdm9pZCB0ZXN0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNXaXRoTWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TXVsdGl0ZW5hbnRNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUyID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCi0JCU9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIG11bHRpdGVuYW5jeSA9ICgoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlMi5nZXRNYXBwaW5nKCkpLmdldE11bHRpdGVuYW5jeSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNU19URU5BTlRfSUQiLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCS8vaWYgdGhlIGVudGl0eSBzcGVjaWZpZXMgbXVsdGl0ZW5hbnQsIHRoZW4gaXQgZG9lcyBub3QgZ2V0IHRoZSB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zIGZyb20gdGhlIG1hcHBlZCBzdXBlcmNsYXNzCi0JCW11bHRpdGVuYW5jeS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlNJTkdMRV9UQUJMRSk7Ci0JCWFzc2VydEVxdWFscygxLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIlRFTkFOVF9JRCIsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQotCQltdWx0aXRlbmFuY3kuc2V0U3BlY2lmaWVkTXVsdGl0ZW5hbnQoZmFsc2UpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKG11bHRpdGVuYW5jeS5pc011bHRpdGVuYW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQotCQlPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBtYXBwZWRTdXBlcmNsYXNzTXVsdGl0ZW5hbmN5ID0gKChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0TXVsdGl0ZW5hbmN5KCk7Ci0JCW1hcHBlZFN1cGVyY2xhc3NNdWx0aXRlbmFuY3kuc2V0U3BlY2lmaWVkTXVsdGl0ZW5hbnQodHJ1ZSk7Ci0JCW1hcHBlZFN1cGVyY2xhc3NNdWx0aXRlbmFuY3kuYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk1TX1RFTkFOVF9JRCIpOwotCQotCQlhc3NlcnRFcXVhbHMoMSwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNU19URU5BTlRfSUQiLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCW11bHRpdGVuYW5jeS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlNJTkdMRV9UQUJMRSk7Ci0JCWFzc2VydEVxdWFscygxLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIlRFTkFOVF9JRCIsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCi0JLy9Sb290IGVudGl0eSBzcGVjaWZpZXMgbXVsdGl0ZW5hbmN5IGFuZCBTSU5HTEVfVEFCTEUgaW5oZXJpdGFuY2UsIGFsbCBzdWJjbGFzcyBlbnRpdGllcyBhcmUgbXVsdGl0ZW5hbnQgYnkgZGVmYXVsdC4KLQlwdWJsaWMgdm9pZCB0ZXN0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNXaXRoSW5oZXJpdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE11bHRpdGVuYW50Um9vdEVudGl0eSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQotCQlPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBtdWx0aXRlbmFuY3kgPSAoKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldE11bHRpdGVuYW5jeSgpOwotCQlhc3NlcnRUcnVlKG11bHRpdGVuYW5jeS5pc011bHRpdGVuYW50KCkpOyAvL211bHRpdGVuYW50IGJ5IGRlZmF1bHQgZnJvbSByb290IGVudGl0eQotCQlhc3NlcnRGYWxzZShtdWx0aXRlbmFuY3kuaXNTcGVjaWZpZWRNdWx0aXRlbmFudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiUk9PVF9FTlRJVFlfVEVOQU5UX0lEIiwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuZ2V0Um9vdEVudGl0eSgpLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWFzc2VydFRydWUobXVsdGl0ZW5hbmN5LmlzTXVsdGl0ZW5hbnQoKSk7IC8vbXVsdGl0ZW5hbnQgYnkgZGVmYXVsdCBmcm9tIHJvb3QgZW50aXR5Ci0JCWFzc2VydEZhbHNlKG11bHRpdGVuYW5jeS5pc1NwZWNpZmllZE11bHRpdGVuYW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJST09UX0VOVElUWV9URU5BTlRfSUQiLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5nZXRSb290RW50aXR5KCkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJYXNzZXJ0RmFsc2UobXVsdGl0ZW5hbmN5LmlzTXVsdGl0ZW5hbnQoKSk7IC8vbm90IG11bHRpdGVuYW50IHNpbmNlIGluaGVyaXRhbmNlIHN0cmF0ZWd5IGlzIHRhYmxlIHBlciBjbGFzcwotCQlhc3NlcnRGYWxzZShtdWx0aXRlbmFuY3kuaXNTcGVjaWZpZWRNdWx0aXRlbmFudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0KLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzKSBnZXRNYXBwaW5nRmlsZSgpLmdldFJvb3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmFkZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJQVV9URU5BTlRfSUQiKTsKLQkJYXNzZXJ0RmFsc2UobXVsdGl0ZW5hbmN5LmlzTXVsdGl0ZW5hbnQoKSk7IC8vbm90IG11bHRpdGVuYW50IHNpbmNlIGluaGVyaXRhbmNlIHN0cmF0ZWd5IGlzIHRhYmxlIHBlciBjbGFzcwotCQlhc3NlcnRGYWxzZShtdWx0aXRlbmFuY3kuaXNTcGVjaWZpZWRNdWx0aXRlbmFudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0KLQkJLy9nZXQgdGhlIGRlZmF1bHQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQgZGVmYXVsdHMgaW5zdGVhZCBvZiB0aGUgcm9vdCBlbnRpdHkgc2luY2UgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kgaXMgdGFibGUgcGVyIGNsYXNzCi0JCW11bHRpdGVuYW5jeS5zZXRTcGVjaWZpZWRNdWx0aXRlbmFudCh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShtdWx0aXRlbmFuY3kuaXNTcGVjaWZpZWRNdWx0aXRlbmFudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiUFVfVEVOQU5UX0lEIiwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCi0JCW11bHRpdGVuYW5jeS5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQ0hJTERfVEVOQU5UX0lEIik7Ci0JCWFzc2VydEVxdWFscygxLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNISUxEX1RFTkFOVF9JRCIsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7CQkKLQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuZ2V0Um9vdEVudGl0eSgpLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWFzc2VydEVxdWFscygxLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNISUxEX1RFTkFOVF9JRCIsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNXaXRoUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykgZ2V0TWFwcGluZ0ZpbGUoKS5nZXRSb290KCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5hZGRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiUFVfVEVOQU5UX0lEIik7Ci0KLQkJT3JtRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgbXVsdGl0ZW5hbmN5ID0gKChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRNdWx0aXRlbmFuY3koKTsKLQkJYXNzZXJ0RmFsc2UobXVsdGl0ZW5hbmN5LmlzTXVsdGl0ZW5hbnQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCi0JCW11bHRpdGVuYW5jeS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlNJTkdMRV9UQUJMRSk7Ci0JCWFzc2VydEVxdWFscygxLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIlBVX1RFTkFOVF9JRCIsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJLy9pZiB0aGVyZSBhcmUgc3BlY2lmaWVkIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMgdGhlbiB0aGVyZSBzaG91bGQgbm90IGJlIGFueSBkZWZhdWx0IG9uZXMKLQkJbXVsdGl0ZW5hbmN5LmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJFTlRJVFlfVEVOQU5UX0lEIik7Ci0JCWFzc2VydEVxdWFscygxLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbXVsdGl0ZW5hbmN5LmdldERlZmF1bHRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRU5USVRZX1RFTkFOVF9JRCIsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJLy9pZiBlbnRpdHkgaXMgbm90IFNJTkdMRV9UQUJMRSBtdWx0aXRlbmFudCB0aGFuIHRoZXJlIGFyZSBubyBkZWZhdWx0IHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMKLQkJbXVsdGl0ZW5hbmN5LnNldFNwZWNpZmllZE11bHRpdGVuYW50KGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zV2l0aEVudGl0eU1hcHBpbmdzRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSAoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncykgZ2V0TWFwcGluZ0ZpbGUoKS5nZXRSb290KCk7Ci0JCWVudGl0eU1hcHBpbmdzLmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJFTV9URU5BTlRfSUQiKTsKLQotCQlPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBtdWx0aXRlbmFuY3kgPSAoKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldE11bHRpdGVuYW5jeSgpOwotCQlhc3NlcnRGYWxzZShtdWx0aXRlbmFuY3kuaXNNdWx0aXRlbmFudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0KLQkJbXVsdGl0ZW5hbmN5LnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuU0lOR0xFX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRU1fVEVOQU5UX0lEIiwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQkvL2lmIGVudGl0eSBpcyBub3QgU0lOR0xFX1RBQkxFIG11bHRpdGVuYW50IHRoYW4gdGhlcmUgYXJlIG5vIGRlZmF1bHQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucwotCQltdWx0aXRlbmFuY3kuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5UQUJMRV9QRVJfVEVOQU5UKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0KLQkJLy9pZiBlbnRpdHkgaXMgbm90IFNJTkdMRV9UQUJMRSBtdWx0aXRlbmFudCB0aGFuIHRoZXJlIGFyZSBubyBkZWZhdWx0IHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMKLQkJbXVsdGl0ZW5hbmN5LnNldFNwZWNpZmllZE11bHRpdGVuYW50KGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0KLQotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpIGdldE1hcHBpbmdGaWxlKCkuZ2V0Um9vdCgpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuYWRkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIlBVX1RFTkFOVF9JRCIpOwotCi0JCW11bHRpdGVuYW5jeS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlNJTkdMRV9UQUJMRSk7Ci0JCWFzc2VydEVxdWFscygxLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkVNX1RFTkFOVF9JRCIsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zV2l0aEphdmFNdWx0aXRlbmFudCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCSgoRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0TXVsdGl0ZW5hbmN5KCkuc2V0U3BlY2lmaWVkTXVsdGl0ZW5hbnQodHJ1ZSk7Ci0JCQkJCi0JCU9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIG11bHRpdGVuYW5jeSA9ICgoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0TXVsdGl0ZW5hbmN5KCk7Ci0JCWFzc2VydFRydWUobXVsdGl0ZW5hbmN5LmlzTXVsdGl0ZW5hbnQoKSk7IC8vaXNNdWx0aXRlbmFudCBpcyB0cnVlIGJlY2F1c2UgdGhlIGphdmEgZW50aXR5IHNwZWNpZmllcyBATXVsdGl0ZW5hbnQKLQkJYXNzZXJ0RmFsc2UobXVsdGl0ZW5hbmN5LmlzU3BlY2lmaWVkTXVsdGl0ZW5hbnQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIlRFTkFOVF9JRCIsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IChFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzKSBnZXRNYXBwaW5nRmlsZSgpLmdldFJvb3QoKTsKLQkJZW50aXR5TWFwcGluZ3MuYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkVNX1RFTkFOVF9JRCIpOwotCi0JCWFzc2VydEVxdWFscygxLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkVNX1RFTkFOVF9JRCIsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQotCQlPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IChPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSkgZ2V0TWFwcGluZ0ZpbGUoKS5nZXRSb290KCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKG11bHRpdGVuYW5jeS5pc011bHRpdGVuYW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NjBjNWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ3VzdG9tQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlYbWxFbnRpdHlNYXBwaW5ncyByZXNvdXJjZUVudGl0eU1hcHBpbmdzID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgY29udGV4dEVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IGNvbnRleHRFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsJCQotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbENvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmFkZChyZXNvdXJjZUNvbnZlcnRlcik7Ci0JCXJlc291cmNlQ29udmVydGVyLnNldENsYXNzTmFtZSgiRm9vIik7Ci0JCXJlc291cmNlQ29udmVydGVyLnNldE5hbWUoIm15Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZUNvbnZlcnRlcjIuc2V0Q2xhc3NOYW1lKCJGb28yIik7Ci0JCXJlc291cmNlQ29udmVydGVyMi5zZXROYW1lKCJteUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsJCQotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDdXN0b21Db252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhtbEVudGl0eU1hcHBpbmdzIHJlc291cmNlRW50aXR5TWFwcGluZ3MgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBjb250ZXh0RW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gY29udGV4dEVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkQ3VzdG9tQ29udmVydGVyKDApOwotCQljb250ZXh0Q29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJGb28iKTsKLQkJY29udGV4dENvbnZlcnRlci5zZXROYW1lKCJteUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7CQkKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkQ3VzdG9tQ29udmVydGVyKDApOwotCQljb250ZXh0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vMiIpOwotCQljb250ZXh0Q29udmVydGVyMi5zZXROYW1lKCJteUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsJCQotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVDdXN0b21Db252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7CQkKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlQ3VzdG9tQ29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZUN1c3RvbUNvbnZlcnRlcihjb250ZXh0Q29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhtbEVudGl0eU1hcHBpbmdzIHJlc291cmNlRW50aXR5TWFwcGluZ3MgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBjb250ZXh0RW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gY29udGV4dEVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7CQotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VUeXBlQ29udmVydGVyKTsKLQkJcmVzb3VyY2VUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKLQkJcmVzb3VyY2VUeXBlQ29udmVydGVyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkKLQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VUeXBlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlVHlwZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsJCi0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsJCi0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhtbEVudGl0eU1hcHBpbmdzIHJlc291cmNlRW50aXR5TWFwcGluZ3MgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBjb250ZXh0RW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gY29udGV4dEVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0VHlwZUNvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQljb250ZXh0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVUeXBlQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVUeXBlQ29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVR5cGVDb252ZXJ0ZXIoY29udGV4dFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJWG1sRW50aXR5TWFwcGluZ3MgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncyA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGNvbnRleHRFbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBjb250ZXh0RW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsJCQotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyKTsKLQkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKLQkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsJCQotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsJCQotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJWG1sRW50aXR5TWFwcGluZ3MgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncyA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGNvbnRleHRFbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBjb250ZXh0RW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcihjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhtbEVudGl0eU1hcHBpbmdzIHJlc291cmNlRW50aXR5TWFwcGluZ3MgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBjb250ZXh0RW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gY29udGV4dEVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlci5zZXRDb252ZXJ0ZXIoIkZvbyIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlci5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsJCi0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sU3RydWN0Q29udmVydGVyIHJlc291cmNlU3RydWN0Q29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIuc2V0Q29udmVydGVyKCJGb28yIik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyMi5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsJCi0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlYbWxFbnRpdHlNYXBwaW5ncyByZXNvdXJjZUVudGl0eU1hcHBpbmdzID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgY29udGV4dEVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IGNvbnRleHRFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbyIpOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0U3RydWN0Q29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkU3RydWN0Q29udmVydGVyKDApOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vMiIpOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyMi5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlU3RydWN0Q29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVN0cnVjdENvbnZlcnRlcihjb250ZXh0U3RydWN0Q29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtQmFzaWNNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUJhc2ljTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZGFmOTkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtQmFzaWNNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybUJhc2ljTWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVCYXNpY0RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgRWNsaXBzZUxpbmsuTVVUQUJMRSwgImphdmEudXRpbC5EYXRlIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNdXRhYmxlIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIERhdGUgbXlEYXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua09ybUJhc2ljTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBjb250ZXh0QmFzaWMgPSAKLQkJCShPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyByZXNvdXJjZUJhc2ljID0gCi0JCQkoWG1sQmFzaWMpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0JCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIGZhbHNlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUJhc2ljLnNldE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIG11dGFibGUgdG8gdHJ1ZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VCYXNpYy5zZXRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgbXV0YWJsZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VCYXNpYy5zZXRNdXRhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIFRPRE8gLSB0ZXN0IGRlZmF1bHRzIGZvciBqYXZhIHNlcmlhbGl6YWJsZSBhbmQgZGF0ZS90aW1lIHR5cGVzLCAKLQkJLy8gd2l0aCBhbmQgd2l0aG91dCBwZXJzaXN0ZW5jZSBwcm9wZXJ0eQotCQkKLQkJLy8gc2V0IG11dGFibGUgb24gamF2YSBiYXNpYyBtYXBwaW5nCi0JCQotCQlqYXZhQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYXR0cmlidXRlIGZyb20geG1sLCB0ZXN0IGRlZmF1bHQgbXV0YWJsZSBmcm9tIGphdmEKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUucmVtb3ZlRnJvbVhtbCgpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgdmlydHVhbENvbnRleHRCYXNpYyA9IChFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxDb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxDb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IG1ldGFkYXRhIGNvbXBsZXRlCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCXZpcnR1YWxDb250ZXh0QmFzaWMgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsQ29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTXV0YWJsZURhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlQmFzaWNEYXRlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm15RGF0ZSIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBjb250ZXh0QmFzaWMgPSAKLQkJCShPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyByZXNvdXJjZUJhc2ljID0gCi0JCQkoWG1sQmFzaWMpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0JCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteURhdGUiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIGZhbHNlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUJhc2ljLnNldE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIHRydWUsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlQmFzaWMuc2V0TXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBtdXRhYmxlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUJhc2ljLnNldE11dGFibGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IG11dGFibGUgb24gamF2YSBiYXNpYyBtYXBwaW5nCi0JCQotCQlqYXZhQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYXR0cmlidXRlIGZyb20geG1sLCB0ZXN0IGRlZmF1bHQgbXV0YWJsZSBmcm9tIGphdmEKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUucmVtb3ZlRnJvbVhtbCgpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlEYXRlIik7Ci0JCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIHZpcnR1YWxDb250ZXh0QmFzaWMgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQ29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB2aXJ0dWFsQ29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgbWV0YWRhdGEgY29tcGxldGUKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlEYXRlIik7Ci0JCXZpcnR1YWxDb250ZXh0QmFzaWMgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxDb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbENvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbENvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGphdmFCYXNpY01hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVCYXNpY0RhdGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJteURhdGUiKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgY29udGV4dEJhc2ljID0gCi0JCQkoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgcmVzb3VyY2VCYXNpYyA9IAotCQkJKFhtbEJhc2ljKSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IG11dGFibGUgdG8gdHJ1ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IG11dGFibGUgdG8gZmFsc2UsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgbXV0YWJsZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoSmF2YUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJCQkKLQkJLy9zZXQgbG9iIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpY1Jlc291cmNlLnNldENvbnZlcnQoIm15Q29udmVydCIpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0KLQkJLy9zZXQgbG9iIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWJhc2ljUmVzb3VyY2Uuc2V0Q29udmVydChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJCi0JCQotCQlqYXZhQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpOwotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUucmVtb3ZlRnJvbVhtbCgpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgdmlydHVhbEJhc2ljTWFwcGluZyA9IChFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgdmlydHVhbEJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB2aXJ0dWFsQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCQkKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCB2aXJ0dWFsQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIHZpcnR1YWxCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0KLQkJamF2YUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwodmlydHVhbEJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnROdWxsKGphdmFCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSAoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJCQkKLQkJLy9zZXQgbG9iIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1CYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiIiwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCi0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUobnVsbCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQotCQkvL3NldCBsb2IgdG8gZmFsc2UgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1DYWNoaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUNhY2hpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjgwNjViLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUNhY2hpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1RpbWVPZkRheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkNhY2hlSXNvbGF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybUNhY2hpbmdUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtQ2FjaGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkU2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KXR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkU2hhcmVkKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmlzU2hhcmVkKCkpOwotCQkKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFNoYXJlZEZhbHNlVW5zZXRzT3RoZXJDYWNoZVNldHRpbmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KXR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLKTsKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRTaXplKEludGVnZXIudmFsdWVPZig1MDApKTsKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4uRkFMU0UpOwotCQljYWNoaW5nLnNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLkZBTFNFKTsKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuLkZBTFNFKTsKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKTsKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19DQUNIRSk7Ci0JCWNhY2hpbmcuc2V0RXhwaXJ5KEludGVnZXIudmFsdWVPZig4MDAwKSk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkJCi0JCQotCQkvL2V4aXN0ZW5jZSBjaGVja2luZyBpcyB0aGUgb25seSB0aGluZyB0aGF0IGlzbid0IHVuc2V0IHdoZW4gc2hhcmVkIGlzIHNldCB0byBmYWxzZQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0NBQ0hFLCBjYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZFNoYXJlZChudWxsKTsKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXkgdGltZU9mRGF5RXhwaXJ5ID0gY2FjaGluZy5hZGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJdGltZU9mRGF5RXhwaXJ5LnNldEhvdXIoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkU2hhcmVkKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSB0eXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSl0eXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0VHJ1ZShjYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLnNldFByb3BlcnR5KENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQsICJmYWxzZSIpOwotCQkKLQkJYXNzZXJ0RmFsc2UoY2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpdHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoaW5nLmlzU2hhcmVkKCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpdHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGNhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUspOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUssIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSywgZW50aXR5LmdldENhY2hpbmcoKS5nZXRUeXBlKCkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSyk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGNhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGNhY2hpbmcuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KXR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBjYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQkKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0UHJvcGVydHkoQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQsIEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkZVTEwudG9TdHJpbmcoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgY2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSB0eXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSl0eXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgY2FjaGluZy5nZXRUeXBlKCkpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSB0eXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSl0eXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChCb29sZWFuLkZBTFNFKTsKLQkJCi0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGVudGl0eS5nZXRDYWNoaW5nKCkuaXNBbHdheXNSZWZyZXNoKCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpdHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KXR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLlRSVUUpOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZW50aXR5LmdldENhY2hpbmcoKS5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpdHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZERpc2FibGVIaXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KXR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZW50aXR5LmdldENhY2hpbmcoKS5pc0Rpc2FibGVIaXRzKCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZERpc2FibGVIaXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KXR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpdHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBjYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMpOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCQotCQkvL3NldCBzcGVjaWZpZWQgY29vcmRpbmF0aW9uIHR5cGUgdG8gdGhlIHNhbWUgYXMgdGhlIGRlZmF1bHQsIHZlcmlmeSBpdCBpcyBub3Qgc2V0IHRvIGRlZmF1bHQKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgY2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGNhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpdHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBjYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRFeHBpcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpdHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0RXhwaXJ5KCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEV4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSB0eXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSl0eXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJY2FjaGluZy5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDU4KSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTgpLCBjYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkJCi0JCQotCQljYWNoaW5nLnNldEV4cGlyeShudWxsKTsKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldEV4cGlyeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEV4cGlyeVVuc2V0c0V4cGlyeVRpbWVPZkRheSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSB0eXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSl0eXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJY2FjaGluZy5hZGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5zZXRIb3VyKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0SG91cigpKTsKLQkJCi0JCWNhY2hpbmcuc2V0RXhwaXJ5KEludGVnZXIudmFsdWVPZig5MDApKTsKLQkJCi0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoOTAwKSwgY2FjaGluZy5nZXRFeHBpcnkoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGltZU9mRGF5RXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KXR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVGltZU9mRGF5RXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KXR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXkgdGltZU9mRGF5RXhwaXJ5ID0gY2FjaGluZy5hZGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCWFzc2VydEVxdWFscyh0aW1lT2ZEYXlFeHBpcnksIGNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVGltZU9mRGF5RXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KXR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVGltZU9mRGF5RXhwaXJ5VW5zZXRzRXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KXR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQljYWNoaW5nLnNldEV4cGlyeShJbnRlZ2VyLnZhbHVlT2YoODAwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODAwKSwgY2FjaGluZy5nZXRFeHBpcnkoKSk7CQotCQkKLQkJY2FjaGluZy5hZGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJCi0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydE5vdE51bGwoY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpdHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxMDAsIGNhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkU2l6ZShuZXcgSW50ZWdlcig1MCkpOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0U2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSB0eXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSl0eXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgY2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLnNldFByb3BlcnR5KENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfU0laRV9ERUZBVUxULCAiMzMzIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMzMzLCBjYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSB0eXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSl0eXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgY2FjaGluZy5nZXRTaXplKCkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRTaXplKG5ldyBJbnRlZ2VyKDUwKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDUwKSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkSXNvbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSB0eXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSl0eXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxDYWNoZSB4bWxDYWNoZSA9IGVudGl0eS5nZXRYbWxUeXBlTWFwcGluZygpLmdldENhY2hlKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yLlNIQVJFRCwgY2FjaGluZy5nZXRJc29sYXRpb24oKSk7Ci0JCWFzc2VydE51bGwoeG1sQ2FjaGUpOwotCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkSXNvbGF0aW9uKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yLlBST1RFQ1RFRCk7CQkKLQkJeG1sQ2FjaGUgPSBlbnRpdHkuZ2V0WG1sVHlwZU1hcHBpbmcoKS5nZXRDYWNoZSgpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIuUFJPVEVDVEVELCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZElzb2xhdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yLlBST1RFQ1RFRCwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRJc29sYXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhDYWNoZUlzb2xhdGlvblR5cGUuUFJPVEVDVEVELCB4bWxDYWNoZS5nZXRJc29sYXRpb24oKSk7Ci0KLQkJLy9zZXQgc3BlY2lmaWVkIGlzb2xhdGlvbiB0byB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdCwgdmVyaWZ5IGl0IGlzIG5vdCBzZXQgdG8gZGVmYXVsdAotCQljYWNoaW5nLnNldFNwZWNpZmllZElzb2xhdGlvbihFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMi5TSEFSRUQpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIuU0hBUkVELCBjYWNoaW5nLmdldFNwZWNpZmllZElzb2xhdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yLlNIQVJFRCwgY2FjaGluZy5nZXRJc29sYXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhDYWNoZUlzb2xhdGlvblR5cGUuU0hBUkVELCB4bWxDYWNoZS5nZXRJc29sYXRpb24oKSk7Ci0KLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRJc29sYXRpb24obnVsbCk7Ci0JCXhtbENhY2hlID0gZW50aXR5LmdldFhtbFR5cGVNYXBwaW5nKCkuZ2V0Q2FjaGUoKTsKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldFNwZWNpZmllZElzb2xhdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yLlNIQVJFRCwgY2FjaGluZy5nZXRJc29sYXRpb24oKSk7Ci0JCWFzc2VydE51bGwoeG1sQ2FjaGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRJc29sYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KXR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbENhY2hlIHhtbENhY2hlID0gZW50aXR5LmdldFhtbFR5cGVNYXBwaW5nKCkuZ2V0Q2FjaGUoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIuU0hBUkVELCBjYWNoaW5nLmdldElzb2xhdGlvbigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxDYWNoZSk7Ci0KLQkJZW50aXR5LmdldFhtbFR5cGVNYXBwaW5nKCkuc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJeG1sQ2FjaGUgPSBlbnRpdHkuZ2V0WG1sVHlwZU1hcHBpbmcoKS5nZXRDYWNoZSgpOwotCQl4bWxDYWNoZS5zZXRJc29sYXRpb24oQ2FjaGVJc29sYXRpb25UeXBlLklTT0xBVEVEKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yLklTT0xBVEVELCBjYWNoaW5nLmdldElzb2xhdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yLklTT0xBVEVELCBjYWNoaW5nLmdldFNwZWNpZmllZElzb2xhdGlvbigpKTsKLQotCQl4bWxDYWNoZS5zZXRJc29sYXRpb24oQ2FjaGVJc29sYXRpb25UeXBlLlBST1RFQ1RFRCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMi5QUk9URUNURUQsIGNhY2hpbmcuZ2V0SXNvbGF0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIuUFJPVEVDVEVELCBjYWNoaW5nLmdldFNwZWNpZmllZElzb2xhdGlvbigpKTsKLQotCQl4bWxDYWNoZS5zZXRJc29sYXRpb24obnVsbCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMi5TSEFSRUQsIGNhY2hpbmcuZ2V0SXNvbGF0aW9uKCkpOwotCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0U3BlY2lmaWVkSXNvbGF0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUNvbnZlcnRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1Db252ZXJ0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGViYzkzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUNvbnZlcnRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybUNvbnZlcnRlclRlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMsIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDb252ZXJ0KG5hbWU9XCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDb252ZXJ0ZXIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtQ29udmVydGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDb252ZXJ0ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkQ3VzdG9tQ29udmVydGVyKDApOwotCQlYbWxDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldENvbnZlcnRlcnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKCJteUNvbnZlcnQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWNvbnZlcnRlclJlc291cmNlLnNldENsYXNzTmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCU9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCVhtbENvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0Q29udmVydGVycygpLmdldCgwKTsKLQkJCi0JCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQ29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCQotCQlvcm1Db252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCU9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCVhtbENvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0Q29udmVydGVycygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXROYW1lKCJteUNvbnZlcnQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWNvbnZlcnRlclJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCU9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCVhtbENvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0Q29udmVydGVycygpLmdldCgwKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1Db252ZXJ0ZXIuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJb3JtQ29udmVydGVyLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtRW1iZWRkYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1FbWJlZGRhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMxMzEwZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1FbWJlZGRhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0VtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybUVtYmVkZGFibGVUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGlua09ybUVtYmVkZGFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JDdXN0b21pemVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRUREQUJMRSwgRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkJCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERBQkxFLCBFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkcpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9CQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZUZvckN1c3RvbUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZUZvclR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRUREQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yU3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JDdXN0b21pemVyKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlIGphdmFDb250ZXh0RW1iZWRkYWJsZSA9IChKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBvcm1Db250ZXh0RW1iZWRkYWJsZSA9IChPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkYWJsZSByZXNvdXJjZUVtYmVkZGFibGUgPSAoWG1sRW1iZWRkYWJsZSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCS8vIHNldCB4bWwgY3VzdG9taXplciwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLnNldEN1c3RvbWl6ZXIoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2xhc3NSZWZlcmVuY2UoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIgY2xhc3MsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLnNldENsYXNzTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBjdXN0b21pemVyIGNsYXNzLCBzZXQgamF2YSBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5zZXRDbGFzc05hbWUobnVsbCk7Ci0JCWphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJiYXIiKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJLy8gc2V0IHhtbCBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5zZXRDbGFzc05hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQkJLy9zZXQgeG1sIGN1c3RvbWl6ZXIgbnVsbAotCQlqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLnNldEN1c3RvbWl6ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JDdXN0b21pemVyKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjdXN0b21pemVyLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY3VzdG9taXplciB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JDaGFuZ2VUcmFja2luZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBqYXZhQ29udGV4dEVtYmVkZGFibGUgPSAoSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHR5cGUgdG8gQVRUUklCVVRFLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUVtYmVkZGFibGUuc2V0Q2hhbmdlVHJhY2tpbmcoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDaGFuZ2VUcmFja2luZygpKTsKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0eXBlIHRvIE9CSkVDVCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0eXBlIHRvIERFRkVSUkVELCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBBVVRPLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2xlYXIgeG1sIGNoYW5nZSB0cmFja2luZywgc2V0IGphdmEgY2hhbmdlIHRyYWNraW5nLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLnNldENoYW5nZVRyYWNraW5nKG51bGwpOwotCQlqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gdW5zZXQgbWV0YWRhdGFDb21wbGV0ZSwgc2V0IHhtbCBjaGFuZ2UgdHJhY2tpbmcgdG8gT0JKRUNULCBjaGVjayBjb250ZXh0Ci0JCQotCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlyZXNvdXJjZUVtYmVkZGFibGUuc2V0Q2hhbmdlVHJhY2tpbmcoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDaGFuZ2VUcmFja2luZygpKTsKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiAgewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUZvckNoYW5nZVRyYWNraW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBBVFRSSUJVVEUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBPQkpFQ1QsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBERUZFUlJFRCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gQVVUTywgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUN1c3RvbUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JDdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlIG9ybUNvbnRleHRFbWJlZGRhYmxlID0gKE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmFkZChyZXNvdXJjZUNvbnZlcnRlcik7Ci0JCXJlc291cmNlQ29udmVydGVyLnNldENsYXNzTmFtZSgiRm9vIik7Ci0JCXJlc291cmNlQ29udmVydGVyLnNldE5hbWUoIm15Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlQ29udmVydGVyMik7Ci0JCXJlc291cmNlQ29udmVydGVyMi5zZXRDbGFzc05hbWUoIkZvbzIiKTsKLQkJcmVzb3VyY2VDb252ZXJ0ZXIyLnNldE5hbWUoIm15Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q3VzdG9tQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUZvckN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBvcm1Db250ZXh0RW1iZWRkYWJsZSA9IChPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxFbWJlZGRhYmxlIHJlc291cmNlRW1iZWRkYWJsZSA9IChYbWxFbWJlZGRhYmxlKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkQ3VzdG9tQ29udmVydGVyKDApOwotCQljb250ZXh0Q29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJGb28iKTsKLQkJY29udGV4dENvbnZlcnRlci5zZXROYW1lKCJteUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkQ3VzdG9tQ29udmVydGVyKDApOwotCQljb250ZXh0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vMiIpOwotCQljb250ZXh0Q29udmVydGVyMi5zZXROYW1lKCJteUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlQ3VzdG9tQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlQ3VzdG9tQ29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlQ3VzdG9tQ29udmVydGVyKGNvbnRleHRDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUZvclR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlIG9ybUNvbnRleHRFbWJlZGRhYmxlID0gKE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLmFkZChyZXNvdXJjZVR5cGVDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxUeXBlQ29udmVydGVyIHJlc291cmNlVHlwZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlVHlwZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBvcm1Db250ZXh0RW1iZWRkYWJsZSA9IChPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxFbWJlZGRhYmxlIHJlc291cmNlRW1iZWRkYWJsZSA9IChYbWxFbWJlZGRhYmxlKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRUeXBlQ29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVUeXBlQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlVHlwZUNvbnZlcnRlcigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVUeXBlQ29udmVydGVyKGNvbnRleHRUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JPYmplY3RUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBvcm1Db250ZXh0RW1iZWRkYWJsZSA9IChPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxFbWJlZGRhYmxlIHJlc291cmNlRW1iZWRkYWJsZSA9IChYbWxFbWJlZGRhYmxlKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyKTsKLQkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKLQkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKLQkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JPYmplY3RUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBvcm1Db250ZXh0RW1iZWRkYWJsZSA9IChPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxFbWJlZGRhYmxlIHJlc291cmNlRW1iZWRkYWJsZSA9IChYbWxFbWJlZGRhYmxlKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVPYmplY3RUeXBlQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVPYmplY3RUeXBlQ29udmVydGVyKGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUZvclN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sRW1iZWRkYWJsZSByZXNvdXJjZUVtYmVkZGFibGUgPSAoWG1sRW1iZWRkYWJsZSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZVN0cnVjdENvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7Ci0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlU3RydWN0Q29udmVydGVyKTsKLQkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIuc2V0Q29udmVydGVyKCJGb28iKTsKLQkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyKTsKLQkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyLnNldENvbnZlcnRlcigiRm9vMiIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlU3RydWN0Q29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yU3RydWN0Q29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBvcm1Db250ZXh0RW1iZWRkYWJsZSA9IChPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxFbWJlZGRhYmxlIHJlc291cmNlRW1iZWRkYWJsZSA9IChYbWxFbWJlZGRhYmxlKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkU3RydWN0Q29udmVydGVyKDApOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJGb28iKTsKLQkJY29udGV4dFN0cnVjdENvbnZlcnRlci5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udGV4dFN0cnVjdENvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKLQkJY29udGV4dFN0cnVjdENvbnZlcnRlcjIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbzIiKTsKLQkJY29udGV4dFN0cnVjdENvbnZlcnRlcjIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVTdHJ1Y3RDb252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVN0cnVjdENvbnZlcnRlcihjb250ZXh0U3RydWN0Q29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1FbnRpdHlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtRW50aXR5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAzYTlkMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1FbnRpdHlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1RpbWVPZkRheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtRW50aXR5VGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1FbnRpdHlUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlGb3JSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuUkVBRF9PTkxZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5Rm9yQ3VzdG9taXplcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5Rm9yQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlGb3JDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlGb3JUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5Rm9yT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUZvclN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JSZWFkT25seSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgamF2YUNvbnRleHRFbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZUVudGl0eS5zZXRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlRW50aXR5LnNldFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCByZWFkIG9ubHksIHNldCBqYXZhIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VFbnRpdHkuc2V0UmVhZE9ubHkobnVsbCk7Ci0JCWphdmFDb250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUoamF2YUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0KLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VFbnRpdHkuc2V0UmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUoamF2YUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VFbnRpdHkuc2V0UmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKGphdmFDb250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCQkKLQkJLy8gY2xlYXIgeG1sIHJlYWQgb25seSwgc2V0IGphdmEgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VFbnRpdHkuc2V0UmVhZE9ubHkobnVsbCk7Ci0JCWphdmFDb250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJCi0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlRW50aXR5LnNldFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VFbnRpdHkuc2V0UmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvclJlYWRPbmx5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IHJlYWQgb25seSB0byB0cnVlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwkKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ3VzdG9taXplcigpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgamF2YUNvbnRleHRFbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldEN1c3RvbWl6ZXIoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2xhc3NSZWZlcmVuY2UoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q3VzdG9taXplcigpLnNldENsYXNzTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgY3VzdG9taXplciBjbGFzcywgc2V0IGphdmEgY3VzdG9taXplciBjbGFzcywgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKS5zZXRDbGFzc05hbWUobnVsbCk7Ci0JCWphdmFDb250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoImJhciIpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIgY2xhc3MsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZUVudGl0eS5nZXRDdXN0b21pemVyKCkuc2V0Q2xhc3NOYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQkvL3NldCB4bWwgY3VzdG9taXplciBudWxsCi0JCWphdmFDb250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MobnVsbCk7Ci0JCXJlc291cmNlRW50aXR5LnNldEN1c3RvbWl6ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q3VzdG9taXplcigpKTsKLQkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDdXN0b21pemVyKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY3VzdG9taXplciwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjdXN0b21pemVyIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNoYW5nZVRyYWNraW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBqYXZhQ29udGV4dEVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBBVFRSSUJVVEUsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlRW50aXR5LnNldENoYW5nZVRyYWNraW5nKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmcoKSk7Ci0JCXJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBPQkpFQ1QsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBERUZFUlJFRCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHR5cGUgdG8gQVVUTywgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBjaGFuZ2UgdHJhY2tpbmcsIHNldCBqYXZhIGNoYW5nZSB0cmFja2luZywgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlRW50aXR5LnNldENoYW5nZVRyYWNraW5nKG51bGwpOwotCQlqYXZhQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGphdmFDb250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGphdmFDb250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gdW5zZXQgbWV0YWRhdGFDb21wbGV0ZSwgc2V0IHhtbCBjaGFuZ2UgdHJhY2tpbmcgdG8gT0JKRUNULCBjaGVjayBjb250ZXh0Ci0JCQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCXJlc291cmNlRW50aXR5LnNldENoYW5nZVRyYWNraW5nKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmcoKSk7Ci0JCXJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGphdmFDb250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNoYW5nZVRyYWNraW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gQVRUUklCVVRFLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIE9CSkVDVCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBERUZFUlJFRCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIEFVVE8sIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHR5cGUsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0VHlwZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5GVUxMKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkZVTEwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSB0eXBlLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuRlVMTCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkZVTEwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIHR5cGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0VHlwZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHR5cGUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSyk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5IQVJEX1dFQUssIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVDb29yZGluYXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgdHlwZSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRDb29yZGluYXRpb25UeXBlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIHR5cGUsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgdHlwZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRDb29yZGluYXRpb25UeXBlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBjb29yZGluYXRpb24gdHlwZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY29vcmRpbmF0aW9uIHR5cGUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSB4bWxFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCB4bWxFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQl4bWxFbnRpdHkuc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHhtbEVudGl0eS5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgc2V0dGluZ3MKLQkJeG1sRW50aXR5LmdldENhY2hlKCkuc2V0U2l6ZShuZXcgSW50ZWdlcigxMDUpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIHhtbEVudGl0eS5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTA1LCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFNpemUobmV3IEludGVnZXIoNTApKTsKLQkJCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMDUpLCB4bWxFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTA1LCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIHNpemUsIGNoZWNrIGRlZmF1bHRzCi0JCXhtbEVudGl0eS5nZXRDYWNoZSgpLnNldFNpemUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHhtbEVudGl0eS5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJeG1sRW50aXR5LnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCB4bWxFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgeG1sRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkU2l6ZShuZXcgSW50ZWdlcig1MCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTApLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFNpemUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2ggdG8gZmFsc2UKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldEFsd2F5c1JlZnJlc2gobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgYmFjayB0byBudWxsLCBjaGVjayBkZWZhdWx0cyBmcm9tIGphdmEKLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlUmVmcmVzaE9ubHlJZk5ld2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQotCQkvLyBzZXQgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoIHRvIGZhbHNlCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlUmVmcmVzaE9ubHlJZk5ld2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldERpc2FibGVIaXRzKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIHNpemUsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2ggdG8gZmFsc2UKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXREaXNhYmxlSGl0cyhCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldERpc2FibGVIaXRzKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVEaXNhYmxlSGl0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHNpemUsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0U2hhcmVkKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldFNoYXJlZChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRTaGFyZWQobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgYmFjayB0byBudWxsLCBjaGVjayBkZWZhdWx0cyBmcm9tIGphdmEKLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFNoYXJlZEZhbHNlVW5zZXRzT3RoZXJDYWNoZVNldHRpbmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSyk7Ci0JCW9ybUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFNpemUoSW50ZWdlci52YWx1ZU9mKDUwMCkpOwotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4uRkFMU0UpOwotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5GQUxTRSk7Ci0JCW9ybUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZERpc2FibGVIaXRzKEJvb2xlYW4uRkFMU0UpOwotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKTsKLQkJb3JtQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UpOwotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDgwMDApKTsKLQkJCi0JCW9ybUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCQotCQkKLQkJLy9leGlzdGVuY2UgY2hlY2tpbmcgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBpc24ndCB1bnNldCB3aGVuIHNoYXJlZCBpcyBzZXQgdG8gZmFsc2UKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQkJCi0JCW9ybUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFNoYXJlZChudWxsKTsKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXkgdGltZU9mRGF5RXhwaXJ5ID0gb3JtQ29udGV4dENhY2hpbmcuYWRkRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCXRpbWVPZkRheUV4cGlyeS5zZXRIb3VyKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCQotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRXhpc3RlbmNlQ2hlY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBleGlzdGVuY2UgY2hlY2tpbmcsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlRW50aXR5LnNldEV4aXN0ZW5jZUNoZWNraW5nKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCByZXNvdXJjZUVudGl0eS5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIGV4aXN0ZW5jZSBjaGVja2luZywgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIHJlc291cmNlRW50aXR5LmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBleGlzdGVuY2UgY2hlY2tpbmcsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldEV4aXN0ZW5jZUNoZWNraW5nKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsJCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RXhpc3RlbmNlQ2hlY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIGV4aXN0ZW5jZSBjaGVja2luZywgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIHJlc291cmNlRW50aXR5LmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGV4aXN0ZW5jZSBjaGVja2luZyB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVFeHBpcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgZXhwaXJ5LCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldEV4cGlyeShuZXcgSW50ZWdlcig0NSkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNDUpLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig0NSksIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIGV4cGlyeSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRFeHBpcnkobmV3IEludGVnZXIoNTUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig0NSksIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTUpLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNDUpLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIGV4cGlyeSB0byBudWxsLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldEV4cGlyeShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1NSksIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCi0JCQotCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDU1KSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDU1KSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgYmFjayB0byBudWxsLCBjaGVjayBkZWZhdWx0cyBmcm9tIGphdmEKLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTUpLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVFeHBpcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBleHBpcnksIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRFeHBpcnkobmV3IEludGVnZXIoNjApKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDYwKSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig2MCksIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0RXhwaXJ5KG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVFeHBpcnlUaW1lT2ZEYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgZXhwaXJ5LCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldEV4cGlyeVRpbWVPZkRheShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRpbWVPZkRheSgpKTsKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5zZXRIb3VyKG5ldyBJbnRlZ2VyKDEwKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMCksIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0SG91cigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMCksIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBleHBpcnksIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuYWRkRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCWphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5zZXRIb3VyKG5ldyBJbnRlZ2VyKDEyKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTApLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMiksIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTApLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBleHBpcnkgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRFeHBpcnlUaW1lT2ZEYXkobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTIpLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0SG91cigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTIpLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0SG91cigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEyKSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0KLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEyKSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZUV4cGlyeVRpbWVPZkRheSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIGV4cGlyeSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLmFkZEV4cGlyeVRpbWVPZkRheSgpLnNldEhvdXIobmV3IEludGVnZXIoMTIpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEyKSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTIpLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBleHBpcnkgdGltZSBvZiBkYXkgbWludXRlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuc2V0TWludXRlKG5ldyBJbnRlZ2VyKDM1KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTIpLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMiksIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigzNSksIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0TWludXRlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMzUpLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRNaW51dGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBleHBpcnkgdGltZSBvZiBkYXkgbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnJlbW92ZUV4cGlyeVRpbWVPZkRheSgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUN1c3RvbUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbENvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZUNvbnZlcnRlci5zZXRDbGFzc05hbWUoIkZvbyIpOwotCQlyZXNvdXJjZUNvbnZlcnRlci5zZXROYW1lKCJteUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IG9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VDb252ZXJ0ZXIyKTsKLQkJcmVzb3VyY2VDb252ZXJ0ZXIyLnNldENsYXNzTmFtZSgiRm9vMiIpOwotCQlyZXNvdXJjZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUN1c3RvbUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZEN1c3RvbUNvbnZlcnRlcigwKTsKLQkJY29udGV4dENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuc2V0TmFtZSgibXlDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IG9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7Ci0JCWNvbnRleHRDb252ZXJ0ZXIyLnNldE5hbWUoIm15Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZUN1c3RvbUNvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZUN1c3RvbUNvbnZlcnRlcihjb250ZXh0Q29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yVHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sVHlwZUNvbnZlcnRlciByZXNvdXJjZVR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VUeXBlQ29udmVydGVyKTsKLQkJcmVzb3VyY2VUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKLQkJcmVzb3VyY2VUeXBlQ29udmVydGVyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxUeXBlQ29udmVydGVyIHJlc291cmNlVHlwZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VUeXBlQ29udmVydGVyMik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJcmVzb3VyY2VUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvclR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQljb250ZXh0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udGV4dFR5cGVDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVUeXBlQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVR5cGVDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlVHlwZUNvbnZlcnRlcihjb250ZXh0VHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvck9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JPYmplY3RUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVudGl0eS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvclN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZVN0cnVjdENvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlci5zZXRDb252ZXJ0ZXIoIkZvbyIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlci5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sU3RydWN0Q29udmVydGVyIHJlc291cmNlU3RydWN0Q29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyKTsKLQkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyLnNldENvbnZlcnRlcigiRm9vMiIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlU3RydWN0Q29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvclN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKLQkJY29udGV4dFN0cnVjdENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZVN0cnVjdENvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVN0cnVjdENvbnZlcnRlcihjb250ZXh0U3RydWN0Q29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7CQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUlkTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1JZE1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjM0MmE1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUlkTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0lkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtSWRNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1JZE1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVJZERhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgRWNsaXBzZUxpbmsuTVVUQUJMRSwgImphdmEudXRpbC5EYXRlIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNdXRhYmxlIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIERhdGUgbXlEYXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FY2xpcHNlTGlua0lkTWFwcGluZyBjb250ZXh0SWQgPSAKLQkJCShPcm1FY2xpcHNlTGlua0lkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxJZCByZXNvdXJjZUlkID0gCi0JCQkoWG1sSWQpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCUVjbGlwc2VMaW5rSWRNYXBwaW5nIGphdmFJZE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIGZhbHNlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUlkLnNldE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIG11dGFibGUgdG8gdHJ1ZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VJZC5zZXRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgbXV0YWJsZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VJZC5zZXRNdXRhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIFRPRE8gLSB0ZXN0IGRlZmF1bHRzIGZvciBqYXZhIHNlcmlhbGl6YWJsZSBhbmQgZGF0ZS90aW1lIHR5cGVzLCAKLQkJLy8gd2l0aCBhbmQgd2l0aG91dCBwZXJzaXN0ZW5jZSBwcm9wZXJ0eQotCQkKLQkJLy8gc2V0IG11dGFibGUgb24gamF2YSBiYXNpYyBtYXBwaW5nCi0JCQotCQlqYXZhSWRNYXBwaW5nLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShqYXZhSWRNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYXR0cmlidXRlIGZyb20geG1sLCB0ZXN0IGRlZmF1bHQgbXV0YWJsZSBmcm9tIGphdmEKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUucmVtb3ZlRnJvbVhtbCgpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJRWNsaXBzZUxpbmtJZE1hcHBpbmcgdmlydHVhbElkTWFwcGluZyA9IChFY2xpcHNlTGlua0lkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbElkTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxJZE1hcHBpbmcuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxJZE1hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUlkTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IG1ldGFkYXRhIGNvbXBsZXRlCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIHZpcnR1YWxCYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxCYXNpY01hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUlkTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTXV0YWJsZURhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlSWREYXRlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gCi0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlEYXRlIiksIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nIGNvbnRleHRJZCA9IAotCQkJKE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbElkIHJlc291cmNlSWQgPSAKLQkJCShYbWxJZCkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJRWNsaXBzZUxpbmtJZE1hcHBpbmcgamF2YUlkTWFwcGluZyA9IChFY2xpcHNlTGlua0lkTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RGF0ZSIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIG11dGFibGUgdG8gZmFsc2UsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlSWQuc2V0TXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIG11dGFibGUgdG8gdHJ1ZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VJZC5zZXRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gY2xlYXIgeG1sIG11dGFibGUsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlSWQuc2V0TXV0YWJsZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCQotCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgbXV0YWJsZSBvbiBqYXZhIGlkIG1hcHBpbmcKLQkJCi0JCWphdmFJZE1hcHBpbmcuZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGphdmFJZE1hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhdHRyaWJ1dGUgZnJvbSB4bWwsIHRlc3QgZGVmYXVsdCBtdXRhYmxlIGZyb20gamF2YQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5yZW1vdmVGcm9tWG1sKCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJteURhdGUiKTsKLQkJRWNsaXBzZUxpbmtJZE1hcHBpbmcgdmlydHVhbElkTWFwcGluZyA9IChFY2xpcHNlTGlua0lkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxJZE1hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHZpcnR1YWxJZE1hcHBpbmcuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbElkTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGphdmFJZE1hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBtZXRhZGF0YSBjb21wbGV0ZQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJteURhdGUiKTsKLQkJRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgdmlydHVhbEJhc2ljTWFwcGluZyA9IChFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoamF2YUlkTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUlkRGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm15RGF0ZSIpLCBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FY2xpcHNlTGlua0lkTWFwcGluZyBjb250ZXh0SWQgPSAKLQkJCShPcm1FY2xpcHNlTGlua0lkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxJZCByZXNvdXJjZUlkID0gCi0JCQkoWG1sSWQpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgbXV0YWJsZSB0byB0cnVlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dElkLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgbXV0YWJsZSB0byBmYWxzZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRJZC5nZXRNdXRhYmxlKCkuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRJZC5nZXRNdXRhYmxlKCkuc2V0U3BlY2lmaWVkTXV0YWJsZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGJhc2ljUmVzb3VyY2UgPSAoWG1sSWQpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJSmF2YUlkTWFwcGluZyBqYXZhSWRNYXBwaW5nID0gKEphdmFJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCQkJCi0JCS8vc2V0IGxvYiBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYmFzaWNSZXNvdXJjZS5zZXRDb252ZXJ0KCJteUNvbnZlcnQiKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgb3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCi0JCS8vc2V0IGxvYiB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpY1Jlc291cmNlLnNldENvbnZlcnQobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCQotCQkKLQkJamF2YUlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzKTsKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFJZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnJlbW92ZUZyb21YbWwoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCUlkTWFwcGluZyB2aXJ0dWFsSWRNYXBwaW5nID0gKElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgdmlydHVhbElkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB2aXJ0dWFsSWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhSWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCQkKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFJZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCB2aXJ0dWFsSWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIHZpcnR1YWxJZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFJZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0KLQkJamF2YUlkTWFwcGluZy5zZXRDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwodmlydHVhbElkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxJZCBiYXNpY1Jlc291cmNlID0gKFhtbElkKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQkJCQotCQkvL3NldCBsb2IgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0KLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZShudWxsKTsKLQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQotCQkvL3NldCBsb2IgdG8gZmFsc2UgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtSWRNYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMThkYzcxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdERlcGFydG1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuTUFOWV9UT19NQU5ZKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5KT0lOX1RBQkxFKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5KT0lOX0NPTFVNTikuYXBwZW5kKCI7Iik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkRlcGFydG1lbnQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luVGFibGUobmFtZT1cIkRFUF9FTVBcIiwgam9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT1cIkRFUFRfSURcIiksIGludmVyc2VKb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPVwiRU1QX0lEXCIpKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEVtcGxveWVlPiBlbXBsb3llZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRGVwYXJ0bWVudC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtcGxveWVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuRU5USVRZKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5JRCkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiRW1wbG95ZWUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBlbXBJZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJFbXBsb3llZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9CQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLkZFVENIX1RZUEUsIEpQQS5DQVNDQURFX1RZUEUsIEpQQS5PUkRFUl9CWSwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueShmZXRjaD1GZXRjaFR5cGUuRUFHRVIsIHRhcmdldEVudGl0eT1BZGRyZXNzLmNsYXNzLCBjYXNjYWRlPXtDYXNjYWRlVHlwZS5BTEwsIENhc2NhZGVUeXBlLlBFUlNJU1QsIENhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5SRU1PVkUsIENhc2NhZGVUeXBlLlJFRlJFU0h9KSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9yZGVyQnkoXCJjaXR5XCIiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luRmV0Y2goSm9pbkZldGNoVHlwZS5JTk5FUikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlV2l0aENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxGb28+IG1hbnlUb01hbnk7IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvTWFueSIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIGNvbnRleHRNYW55VG9NYW55ID0gCi0JCQkoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxNYW55VG9NYW55IHJlc291cmNlTWFueVRvTWFueSA9IAotCQkJKFhtbE1hbnlUb01hbnkpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFueVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gSU5ORVIsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlTWFueVRvTWFueS5zZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5JTk5FUiwgcmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dE1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gT1VURVIsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlTWFueVRvTWFueS5zZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5PVVRFUiwgcmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dE1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gbnVsbCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYW55VG9NYW55LnNldEpvaW5GZXRjaChudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvTWFueSIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIGNvbnRleHRNYW55VG9NYW55ID0gCi0JCQkoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE1hbnlUb01hbnkgcmVzb3VyY2VNYW55VG9NYW55ID0gCi0JCQkoWG1sTWFueVRvTWFueSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGpvaW4gZmV0Y2ggdG8gSU5ORVIsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIsIHJlc291cmNlTWFueVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgam9pbiBmZXRjaCB0byBPVVRFUiwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5PVVRFUiwgcmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dE1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBqb2luIGZldGNoIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5GZXRjaERlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtcGxveWVlKCk7Ci0JCWNyZWF0ZVRlc3REZXBhcnRtZW50KCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRGVwYXJ0bWVudCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkVtcGxveWVlIik7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgbWFueVRvTWFueSA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueSA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCQotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgamF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQltYW55VG9NYW55ID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIG1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0Sm9pblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbXBsb3llZSgpOwotCQljcmVhdGVUZXN0RGVwYXJ0bWVudCgpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkRlcGFydG1lbnQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5FbXBsb3llZSIpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIik7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueU1hcHBpbmcpIGF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG1hbnlUb01hbnkuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJERVBfRU1QIiwgb3JtSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiREVQVF9JRCIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFTVBfSUQiLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBJZCIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSBhbmQgdmVyaWZ5IEpvaW5UYWJsZSBpbmZvIGlzIG5vdCB0YWtlbiBmcm9tIHRoZSBqYXZhCi0JCWRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwoZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhdHRyaWJ1dGUgPSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueSA9IChPbmVUb01hbnlNYXBwaW5nKSBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCW9ybUpvaW5UYWJsZSA9IG9uZVRvTWFueS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkRlcGFydG1lbnRfRW1wbG95ZWUiLCBvcm1Kb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJEZXBhcnRtZW50X2lkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlc19lbXBJZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcElkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgdG8gZmFsc2UsIGFkZCBtYXBwaW5nIHRvIG9ybS54bWwgdmVyaWZ5IEpvaW5UYWJsZSBpbmZvIGlzIG5vdCB0YWtlbiBmcm9tIHRoZSBqYXZhCi0JCWRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLQkJYXR0cmlidXRlID0gZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKTsKLQkJbWFueVRvTWFueSA9IChNYW55VG9NYW55TWFwcGluZykgYXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCW9ybUpvaW5UYWJsZSA9IG1hbnlUb01hbnkuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJERVBfRU1QIiwgb3JtSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiREVQVF9JRCIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFTVBfSUQiLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBJZCIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQkKLQkJZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIiksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhdHRyaWJ1dGUgPSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpOwotCQltYW55VG9NYW55ID0gKE1hbnlUb01hbnlNYXBwaW5nKSBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCW9ybUpvaW5UYWJsZSA9IG1hbnlUb01hbnkuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJEZXBhcnRtZW50X0VtcGxveWVlIiwgb3JtSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkRlcGFydG1lbnRfaWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZXNfZW1wSWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBJZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlNYW55VG9NYW55TWFwcGluZyB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygiQWRkcmVzcyIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLgotCQkJZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCi0JCUNhc2NhZGUgY2FzY2FkZSA9IHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQotCQlhc3NlcnRUcnVlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCAoKEVjbGlwc2VMaW5rSm9pbkZldGNoTWFwcGluZykgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nKS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmFkZFRvWG1sKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCU9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QuQWRkcmVzcyIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0KLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQotCQlhc3NlcnRUcnVlKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzTm9PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYjRmMDEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5DYXNjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdERlcGFydG1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5NQU5ZX1RPX09ORSkuYXBwZW5kKCI7Iik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkRlcGFydG1lbnQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBFbXBsb3llZSBlbXBsb3llZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJEZXBhcnRtZW50LmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1wbG95ZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJFbXBsb3llZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGVtcElkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkVtcGxveWVlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5TWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5GRVRDSF9UWVBFLCBKUEEuQ0FTQ0FERV9UWVBFLCBFY2xpcHNlTGluay5KT0lOX0ZFVENILCBFY2xpcHNlTGluay5KT0lOX0ZFVENIX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUoZmV0Y2g9RmV0Y2hUeXBlLkxBWlksIG9wdGlvbmFsPWZhbHNlLCB0YXJnZXRFbnRpdHk9QWRkcmVzcy5jbGFzcywgY2FzY2FkZT17Q2FzY2FkZVR5cGUuQUxMLCBDYXNjYWRlVHlwZS5QRVJTSVNULCBDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFLCBDYXNjYWRlVHlwZS5SRUZSRVNIfSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luQ29sdW1uKG5hbWU9XCJNWV9DT0xVTU5cIiwgcmVmZXJlbmNlZENvbHVtbk5hbWU9XCJNWV9SRUZFUkVOQ0VEX0NPTFVNTlwiLCB1bmlxdWU9dHJ1ZSwgbnVsbGFibGU9ZmFsc2UsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSwgY29sdW1uRGVmaW5pdGlvbj1cIkNPTFVNTl9ERUZJTklUSU9OXCIsIHRhYmxlPVwiTVlfVEFCTEVcIikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luRmV0Y2goSm9pbkZldGNoVHlwZS5JTk5FUikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVXaXRoTWFueVRvT25lQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEZvbyBtYW55VG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhNYW55VG9PbmVBdHRyaWJ1dGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKSwgTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIGNvbnRleHRNYW55VG9PbmUgPSAKLQkJCShFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE1hbnlUb09uZSByZXNvdXJjZU1hbnlUb09uZSA9IAotCQkJKFhtbE1hbnlUb09uZSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hbnlUb09uZS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgam9pbiBmZXRjaCB0byBJTk5FUiwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYW55VG9PbmUuc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIsIHJlc291cmNlTWFueVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgam9pbiBmZXRjaCB0byBPVVRFUiwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYW55VG9PbmUuc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUuT1VURVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuT1VURVIsIHJlc291cmNlTWFueVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgam9pbiBmZXRjaCB0byBudWxsLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU1hbnlUb09uZS5zZXRKb2luRmV0Y2gobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFueVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFueVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Sm9pbkZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlV2l0aE1hbnlUb09uZUF0dHJpYnV0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgY29udGV4dE1hbnlUb09uZSA9IAotCQkJKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxNYW55VG9PbmUgcmVzb3VyY2VNYW55VG9PbmUgPSAKLQkJCShYbWxNYW55VG9PbmUpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBqb2luIGZldGNoIHRvIElOTkVSLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIsIHJlc291cmNlTWFueVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGpvaW4gZmV0Y2ggdG8gT1VURVIsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0TWFueVRvT25lLmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5PVVRFUiwgcmVzb3VyY2VNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0TWFueVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgam9pbiBmZXRjaCB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luRmV0Y2hEZWZhdWx0RnJvbUphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtcGxveWVlKCk7Ci0JCWNyZWF0ZVRlc3REZXBhcnRtZW50KCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRGVwYXJ0bWVudCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkVtcGxveWVlIik7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWUiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVNYXBwaW5nLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBvbmVUb09uZSA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZSIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCQotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgamF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlIikuZ2V0TWFwcGluZygpOwotCQlqYXZhUmVsYXRpb25zaGlwTWFwcGluZy5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIpOwotCQltYW55VG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZSIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVNYXBwaW5nLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJbWFueVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWUiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIG1hbnlUb09uZU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlNYW55VG9PbmVNYXBwaW5nIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCi0JCUpvaW5Db2x1bW4gdmlydHVhbEpvaW5Db2x1bW4gPSB2aXJ0dWFsTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NPTFVNTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfUkVGRVJFTkNFRF9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCi0JCUNhc2NhZGUgY2FzY2FkZSA9IHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsICgoRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nKSB2aXJ0dWFsTWFueVRvT25lTWFwcGluZykuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU1hbnlUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbChNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCU9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtTWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkFkZHJlc3MiLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0KLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtTWFueVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMzY0YmUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBFY2xpcHNlTGluay5SRUFEX09OTFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckN1c3RvbWl6ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yVHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yUmVhZE9ubHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCByZWFkIG9ubHksIHNldCBqYXZhIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KG51bGwpOwotCQlqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0KLQkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gY2xlYXIgeG1sIHJlYWQgb25seSwgc2V0IGphdmEgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KG51bGwpOwotCQlqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclJlYWRPbmx5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IHJlYWQgb25seSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDdXN0b21pemVyKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjdXN0b21pemVyLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q3VzdG9taXplcihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDbGFzc1JlZmVyZW5jZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY3VzdG9taXplciBjbGFzcywgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0Q2xhc3NOYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJLy8gY2xlYXIgeG1sIGN1c3RvbWl6ZXIgY2xhc3MsIHNldCBqYXZhIGN1c3RvbWl6ZXIgY2xhc3MsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldENsYXNzTmFtZShudWxsKTsKLQkJamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoImJhciIpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIgY2xhc3MsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldENsYXNzTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQkvL3NldCB4bWwgY3VzdG9taXplciBudWxsCi0JCWphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKG51bGwpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q3VzdG9taXplcihudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpKTsKLQkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckN1c3RvbWl6ZXIoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY3VzdG9taXplciwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2hhbmdlVHJhY2tpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHR5cGUgdG8gQVRUUklCVVRFLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2hhbmdlVHJhY2tpbmcoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDaGFuZ2VUcmFja2luZygpKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0eXBlIHRvIE9CSkVDVCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0eXBlIHRvIERFRkVSUkVELCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBBVVRPLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2xlYXIgeG1sIGNoYW5nZSB0cmFja2luZywgc2V0IGphdmEgY2hhbmdlIHRyYWNraW5nLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENoYW5nZVRyYWNraW5nKG51bGwpOwotCQlqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gdW5zZXQgbWV0YWRhdGFDb21wbGV0ZSwgc2V0IHhtbCBjaGFuZ2UgdHJhY2tpbmcgdG8gT0JKRUNULCBjaGVjayBjb250ZXh0Ci0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2hhbmdlVHJhY2tpbmcoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDaGFuZ2VUcmFja2luZygpKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiAgewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNoYW5nZVRyYWNraW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIEFUVFJJQlVURSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIE9CSkVDVCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIERFRkVSUkVELCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBBVVRPLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgdHlwZSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0VHlwZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5GVUxMKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgdHlwZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUspOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkZVTEwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgdHlwZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0VHlwZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCi0JCQotCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHR5cGUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUspOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuSEFSRF9XRUFLLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY3VzdG9taXplciB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHR5cGUsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldENvb3JkaW5hdGlvblR5cGUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIHR5cGUsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIHR5cGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldENvb3JkaW5hdGlvblR5cGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVDb29yZGluYXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIGNvb3JkaW5hdGlvbiB0eXBlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNvb3JkaW5hdGlvbiB0eXBlIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRTaXplKG5ldyBJbnRlZ2VyKDEwNSkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTA1KSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTA1KSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIHNpemUsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkU2l6ZShuZXcgSW50ZWdlcig1MCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTA1KSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0U2l6ZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaXplKG5ldyBJbnRlZ2VyKDUwKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaXplKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZUFsd2F5c1JlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVJlZnJlc2hPbmx5SWZOZXdlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHNpemUsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0KLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVSZWZyZXNoT25seUlmTmV3ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2ggdG8gZmFsc2UKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0RGlzYWJsZUhpdHMoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldERpc2FibGVIaXRzKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0KLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlU2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0U2hhcmVkKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQotCQkvLyBzZXQgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoIHRvIGZhbHNlCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFNoYXJlZChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFNoYXJlZChudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVFeGlzdGVuY2VDaGVja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBleGlzdGVuY2UgY2hlY2tpbmcsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRFeGlzdGVuY2VDaGVja2luZyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBleGlzdGVuY2UgY2hlY2tpbmcsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRFeGlzdGVuY2VDaGVja2luZyhudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlFeGlzdGVuY2VDaGVja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBleGlzdGVuY2UgY2hlY2tpbmcgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ3VzdG9tQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZUNvbnZlcnRlci5zZXRDbGFzc05hbWUoIkZvbyIpOwotCQlyZXNvdXJjZUNvbnZlcnRlci5zZXROYW1lKCJteUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IG9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbENvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZUNvbnZlcnRlcjIuc2V0Q2xhc3NOYW1lKCJGb28yIik7Ci0JCXJlc291cmNlQ29udmVydGVyMi5zZXROYW1lKCJteUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUN1c3RvbUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZEN1c3RvbUNvbnZlcnRlcigwKTsKLQkJY29udGV4dENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuc2V0TmFtZSgibXlDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IG9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7Ci0JCWNvbnRleHRDb252ZXJ0ZXIyLnNldE5hbWUoIm15Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlQ3VzdG9tQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlQ3VzdG9tQ29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVDdXN0b21Db252ZXJ0ZXIoY29udGV4dENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yVHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxUeXBlQ29udmVydGVyIHJlc291cmNlVHlwZUNvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VUeXBlQ29udmVydGVyKTsKLQkJcmVzb3VyY2VUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKLQkJcmVzb3VyY2VUeXBlQ29udmVydGVyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sVHlwZUNvbnZlcnRlciByZXNvdXJjZVR5cGVDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZVR5cGVDb252ZXJ0ZXIyKTsKLQkJcmVzb3VyY2VUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlVHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQljb250ZXh0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udGV4dFR5cGVDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZVR5cGVDb252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVUeXBlQ29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVR5cGVDb252ZXJ0ZXIoY29udGV4dFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0Zvck9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yT2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVPYmplY3RUeXBlQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVPYmplY3RUeXBlQ29udmVydGVyKGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sU3RydWN0Q29udmVydGVyIHJlc291cmNlU3RydWN0Q29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlci5zZXRDb252ZXJ0ZXIoIkZvbyIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlci5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIuc2V0Q29udmVydGVyKCJGb28yIik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyMi5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JTdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKLQkJY29udGV4dFN0cnVjdENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlU3RydWN0Q29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlU3RydWN0Q29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoY29udGV4dFN0cnVjdENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1PYmplY3RUeXBlQ29udmVydGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2IwYzhhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1PYmplY3RUeXBlQ29udmVydGVyVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQENvbnZlcnQobmFtZT1cImZvb1wiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCQotCXB1YmxpYyBFY2xpcHNlTGlua09ybU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXREYXRhVHlwZSgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIGNvbnZlcnRlclJlc291cmNlLmdldERhdGFUeXBlKCkpOwotCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWNvbnZlcnRlclJlc291cmNlLnNldERhdGFUeXBlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlEYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApOwotCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQ29udmVydGVyLnNldERhdGFUeXBlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7Ci0JCi0JCW9ybUNvbnZlcnRlci5zZXREYXRhVHlwZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldERhdGFUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlT2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWNvbnZlcnRlclJlc291cmNlLnNldE9iamVjdFR5cGUoIm15Q29udmVydCIpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIG9ybUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7Ci0KLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0T2JqZWN0VHlwZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0T2JqZWN0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1Db252ZXJ0ZXIuc2V0T2JqZWN0VHlwZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0T2JqZWN0VHlwZSgpKTsKLQkKLQkJb3JtQ29udmVydGVyLnNldE9iamVjdFR5cGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0TmFtZSgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApOwotCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUNvbnZlcnRlci5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQlvcm1Db252ZXJ0ZXIuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRPYmplY3RWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXREZWZhdWx0T2JqZWN0VmFsdWUoIm15Q29udmVydCIpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIG9ybUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWNvbnZlcnRlclJlc291cmNlLnNldERlZmF1bHRPYmplY3RWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlEZWZhdWx0T2JqZWN0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQ29udmVydGVyLnNldERlZmF1bHRPYmplY3RWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCi0JCW9ybUNvbnZlcnRlci5zZXREZWZhdWx0T2JqZWN0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDb252ZXJzaW9uVmFsdWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOwotCQkKLQkJLy9hZGQgY29udmVyc2lvbiB2YWx1ZSB0byByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxDb252ZXJzaW9uVmFsdWUgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnNpb25WYWx1ZSgpOwotCQljb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuYWRkKHJlc291cmNlQ29udmVyc2lvblZhbHVlKTsKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuc2V0RGF0YVZhbHVlKCJmb28iKTsKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuc2V0T2JqZWN0VmFsdWUoImJhciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gY29udGV4dENvbnZlcnNpb25WYWx1ZXMgPSBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnNpb24gdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVzb3VyY2UgbW9kZWwgbGlzdAotCQlYbWxDb252ZXJzaW9uVmFsdWUgeG1sQ29udmVyc2lvblZhbHVlMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVyc2lvblZhbHVlKCk7Ci0JCWNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5hZGQoMCwgeG1sQ29udmVyc2lvblZhbHVlMik7Ci0JCXhtbENvbnZlcnNpb25WYWx1ZTIuc2V0RGF0YVZhbHVlKCJmb28yIik7Ci0JCXhtbENvbnZlcnNpb25WYWx1ZTIuc2V0T2JqZWN0VmFsdWUoImJhcjIiKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlcyA9IG9ybUNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDEpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDEpLmdldE9iamVjdFZhbHVlKCkpOwotCi0JCS8vbW92ZSBhIGNvbnZlcnNpb24gdmFsdWUgaW4gdGhlIHJlc291cmNlIG1vZGVsIGxpc3QKLQkJCi0JCWNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5tb3ZlKDAsIDEpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlcyA9IG9ybUNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlID0gY29udGV4dENvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIyIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMSkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhcjIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDEpLmdldE9iamVjdFZhbHVlKCkpOwotCi0JCS8vcmVtb3ZlIGEgY29udmVyc2lvbiB2YWx1ZSBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCBsaXN0Ci0KLQkJY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZXMgPSBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhcjIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhcjIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldE9iamVjdFZhbHVlKCkpOwotCi0JCS8vY2xlYXIgdGhlIGNvbnZlcnNpb24gdmFsdWUgcmVzb3VyY2UgbW9kZWwgbGlzdAotCQljb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuY2xlYXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q29udmVyc2lvblZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOwotCQkKLQkJLy9hZGQgY29udmVyc2lvbiB2YWx1ZSB0byBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb250ZXh0Q29udmVyc2lvblZhbHVlID0gb3JtQ29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlLnNldERhdGFWYWx1ZSgiZm9vIik7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWUuc2V0T2JqZWN0VmFsdWUoImJhciIpOwotCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzID0gb3JtQ29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlID0gY29udGV4dENvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldE9iamVjdFZhbHVlKCkpOwotCi0JCS8vYWRkIGEgY29udmVyc2lvbiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZXh0IG1vZGVsIGxpc3QKLQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udGV4dENvbnZlcnNpb25WYWx1ZTIgPSBvcm1Db252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlMi5zZXREYXRhVmFsdWUoImZvbzIiKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZTIuc2V0T2JqZWN0VmFsdWUoImJhcjIiKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlcyA9IG9ybUNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDEpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDEpLmdldE9iamVjdFZhbHVlKCkpOwotCi0JCS8vbW92ZSBhIGNvbnZlcnNpb24gdmFsdWUgaW4gdGhlIGNvbnRleHQgbW9kZWwgbGlzdAotCQkKLQkJb3JtQ29udmVydGVyLm1vdmVDb252ZXJzaW9uVmFsdWUoMCwgMSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWVzID0gb3JtQ29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlID0gY29udGV4dENvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhcjIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgxKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMSkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0KLQkJLy9yZW1vdmUgYSBjb252ZXJzaW9uIHZhbHVlIGZyb20gdGhlIGNvbnRleHQgbW9kZWwgbGlzdAotCi0JCW9ybUNvbnZlcnRlci5yZW1vdmVDb252ZXJzaW9uVmFsdWUoMCk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWVzID0gb3JtQ29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlID0gY29udGV4dENvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIyIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQotCQkvL2NsZWFyIHRoZSBjb252ZXJzaW9uIHZhbHVlIHJlc291cmNlIG1vZGVsIGxpc3QKLQkJb3JtQ29udmVydGVyLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYzgzYWYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5DYXNjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RGVwYXJ0bWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLkVOVElUWSkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuSUQpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5KT0lOX1RBQkxFKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5KT0lOX0NPTFVNTikuYXBwZW5kKCI7Iik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkRlcGFydG1lbnQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEpvaW5UYWJsZShuYW1lPVwiREVQX0VNUFwiLCBqb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPVwiREVQVF9JRFwiKSwgaW52ZXJzZUpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKG5hbWU9XCJFTVBfSURcIikpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIENvbGxlY3Rpb248RW1wbG95ZWU+IGVtcGxveWVlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJEZXBhcnRtZW50LmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1wbG95ZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJFbXBsb3llZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGVtcElkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkVtcGxveWVlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5hZGRUb1htbCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxTdHJpbmcsIEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXAgYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiU3RhdGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5GRVRDSF9UWVBFLCBKUEEuQ0FTQ0FERV9UWVBFLCBKUEEuT1JERVJfQlksIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gsIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0hfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueShmZXRjaD1GZXRjaFR5cGUuRUFHRVIsIHRhcmdldEVudGl0eT1BZGRyZXNzLmNsYXNzLCBjYXNjYWRlPXtDYXNjYWRlVHlwZS5BTEwsIENhc2NhZGVUeXBlLlBFUlNJU1QsIENhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5SRU1PVkUsIENhc2NhZGVUeXBlLlJFRlJFU0h9KSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9yZGVyQnkoXCJjaXR5XCIiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luRmV0Y2goSm9pbkZldGNoVHlwZS5JTk5FUikiKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlV2l0aENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxGb28+IG9uZVRvTWFueTsiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJpdmF0ZU93bmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlV2l0aENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb01hbnkiKSwgTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIGNvbnRleHRPbmVUb01hbnkgPSAKLQkJCShFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU9uZVRvTWFueSA9IAotCQkJKFhtbE9uZVRvTWFueSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VPbmVUb01hbnkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRPbmVUb01hbnkuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHByaXZhdGUgb3duZWQgdG8gdHJ1ZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VPbmVUb01hbnkuc2V0UHJpdmF0ZU93bmVkKHRydWUpOwotCQkKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU9uZVRvTWFueS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0T25lVG9NYW55LmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBwcml2YXRlIG93bmVkIGJhY2sgdG8gZmFsc2UsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlT25lVG9NYW55LnNldFByaXZhdGVPd25lZChmYWxzZSk7Ci0JCQotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU9uZVRvTWFueS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE9uZVRvTWFueS5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByaXZhdGVPd25lZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9NYW55IiksIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBjb250ZXh0T25lVG9NYW55ID0gCi0JCQkoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU9uZVRvTWFueSA9IAotCQkJKFhtbE9uZVRvTWFueSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VPbmVUb01hbnkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRPbmVUb01hbnkuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBwcml2YXRlIG93bmVkICB0byB0cnVlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dE9uZVRvTWFueS5nZXRQcml2YXRlT3duZWQoKS5zZXRQcml2YXRlT3duZWQodHJ1ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHJlc291cmNlT25lVG9NYW55LmlzUHJpdmF0ZU93bmVkKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRPbmVUb01hbnkuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBwcml2YXRlIG93bmVkIGJhY2sgdG8gZmFsc2UsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0T25lVG9NYW55LmdldFByaXZhdGVPd25lZCgpLnNldFByaXZhdGVPd25lZChmYWxzZSk7Ci0JCQotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU9uZVRvTWFueS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE9uZVRvTWFueS5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9NYW55IiksIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBjb250ZXh0T25lVG9NYW55ID0gCi0JCQkoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxPbmVUb01hbnkgcmVzb3VyY2VPbmVUb01hbnkgPSAKLQkJCShYbWxPbmVUb01hbnkpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gSU5ORVIsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlT25lVG9NYW55LnNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLklOTkVSLCByZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gT1VURVIsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlT25lVG9NYW55LnNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLk9VVEVSLCByZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gbnVsbCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VPbmVUb01hbnkuc2V0Sm9pbkZldGNoKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9NYW55IiksIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBjb250ZXh0T25lVG9NYW55ID0gCi0JCQkoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU9uZVRvTWFueSA9IAotCQkJKFhtbE9uZVRvTWFueSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGpvaW4gZmV0Y2ggdG8gSU5ORVIsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0T25lVG9NYW55LmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5JTk5FUiwgcmVzb3VyY2VPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0T25lVG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgam9pbiBmZXRjaCB0byBPVVRFUiwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLk9VVEVSLCByZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBqb2luIGZldGNoIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0T25lVG9NYW55LmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5GZXRjaERlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtcGxveWVlKCk7Ci0JCWNyZWF0ZVRlc3REZXBhcnRtZW50KCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRGVwYXJ0bWVudCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkVtcGxveWVlIik7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55ID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCW9uZVRvTWFueSA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsJCQotCQkKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIGphdmFSZWxhdGlvbnNoaXBNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFSZWxhdGlvbnNoaXBNYXBwaW5nLmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJb25lVG9NYW55ID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIG9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtcGxveWVlKCk7Ci0JCWNyZWF0ZVRlc3REZXBhcnRtZW50KCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRGVwYXJ0bWVudCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkVtcGxveWVlIik7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnkgPSAoT25lVG9NYW55TWFwcGluZykgYXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyh0cnVlLCBhdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlKb2luVGFibGUgb3JtSm9pblRhYmxlID0gb25lVG9NYW55LmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygiREVQX0VNUCIsIG9ybUpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkRFUFRfSUQiLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRU1QX0lEIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wSWQiLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgYW5kIHZlcmlmeSBKb2luVGFibGUgaW5mbyBpcyBub3QgdGFrZW4gZnJvbSB0aGUgamF2YQotCQlkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsJCi0JCWF0dHJpYnV0ZSA9IGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIik7Ci0JCW9uZVRvTWFueSA9IChPbmVUb01hbnlNYXBwaW5nKSBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCW9ybUpvaW5UYWJsZSA9IG9uZVRvTWFueS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkRlcGFydG1lbnRfRW1wbG95ZWUiLCBvcm1Kb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJEZXBhcnRtZW50X2lkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlc19lbXBJZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcElkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgdG8gZmFsc2UsIGFkZCBtYXBwaW5nIHRvIG9ybS54bWwgdmVyaWZ5IEpvaW5UYWJsZSBpbmZvIGlzIG5vdCB0YWtlbiBmcm9tIHRoZSBqYXZhCi0JCWRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLQkJYXR0cmlidXRlID0gZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKTsKLQkJb25lVG9NYW55ID0gKE9uZVRvTWFueU1hcHBpbmcpIGF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlvcm1Kb2luVGFibGUgPSBvbmVUb01hbnkuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJERVBfRU1QIiwgb3JtSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiREVQVF9JRCIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFTVBfSUQiLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBJZCIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQkKLQkJZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIiksIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWF0dHJpYnV0ZSA9IGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIik7Ci0JCW9uZVRvTWFueSA9IChPbmVUb01hbnlNYXBwaW5nKSBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCW9ybUpvaW5UYWJsZSA9IG9uZVRvTWFueS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkRlcGFydG1lbnRfRW1wbG95ZWUiLCBvcm1Kb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRGVwYXJ0bWVudF9pZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlc19lbXBJZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcElkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmlydHVhbE1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzUGtNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybU9uZVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgcGsgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLnNldFBrTWFwS2V5KHRydWUpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JCQotCQkKLQkJLy9zZXQgY3VzdG9tIHNwZWNpZmllZCBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuc2V0Q3VzdG9tTWFwS2V5KHRydWUpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoImNpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzUGtNYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgbWV0YWRhdGEgY29tcGxldGUgYW5kIHZlcmlmeSB0aGF0IHRoZSBvcm0gbW9kZWwgaWdub3JlcyB0aGUgamF2YSBhbm5vdGF0aW9ucwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzUGtNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybU9uZVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlPbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5hZGRUb1htbCgpOwotCQlvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCW1hcEtleU5hbWVzID0gb3JtT25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJ0ZXN0LkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiU3RyaW5nIik7Ci0JCW1hcEtleU5hbWVzID0gb3JtT25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCU9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBjb250ZXh0TWFwcGluZyA9IChPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCByZWwgPSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU1hcHBpbmcgPSAoWG1sT25lVG9NYW55KSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCU9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBjb250ZXh0TWFwcGluZyA9IChPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCByZWwgPSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU1hcHBpbmcgPSAoWG1sT25lVG9NYW55KSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHBlZEJ5KG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldEpvaW5UYWJsZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyB2aXJ0dWFsT25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuCi0JCQlnZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0KLQkJQ2FzY2FkZSBjYXNjYWRlID0gdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyB2aXJ0dWFsT25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQotCQlDYXNjYWRlIGNhc2NhZGUgPSB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCi0JCWFzc2VydFRydWUodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NjYwYmMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1PbmVUb09uZU1hcHBpbmdUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGlua09ybU9uZVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdERlcGFydG1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5PTkVfVE9fT05FKS5hcHBlbmQoIjsiKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiRGVwYXJ0bWVudCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgRW1wbG95ZWUgZW1wbG95ZWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRGVwYXJ0bWVudC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtcGxveWVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuRU5USVRZKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5JRCkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiRW1wbG95ZWUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBlbXBJZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJFbXBsb3llZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQS5KT0lOX0NPTFVNTiwgSlBBLkZFVENIX1RZUEUsIEpQQS5DQVNDQURFX1RZUEUsIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gsIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0hfVFlQRSwgRWNsaXBzZUxpbmsuUFJJVkFURV9PV05FRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lKGZldGNoPUZldGNoVHlwZS5MQVpZLCBvcHRpb25hbD1mYWxzZSwgdGFyZ2V0RW50aXR5PUFkZHJlc3MuY2xhc3MsIGNhc2NhZGU9e0Nhc2NhZGVUeXBlLkFMTCwgQ2FzY2FkZVR5cGUuUEVSU0lTVCwgQ2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRSwgQ2FzY2FkZVR5cGUuUkVGUkVTSH0pIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASm9pbkNvbHVtbihuYW1lPVwiTVlfQ09MVU1OXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lPVwiTVlfUkVGRVJFTkNFRF9DT0xVTU5cIiwgdW5pcXVlPXRydWUsIG51bGxhYmxlPWZhbHNlLCBpbnNlcnRhYmxlPWZhbHNlLCB1cGRhdGFibGU9ZmFsc2UsIGNvbHVtbkRlZmluaXRpb249XCJDT0xVTU5fREVGSU5JVElPTlwiLCB0YWJsZT1cIk1ZX1RBQkxFXCIpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASm9pbkZldGNoKEpvaW5GZXRjaFR5cGUuSU5ORVIpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAUHJpdmF0ZU93bmVkKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQkKLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZVdpdGhPbmVUb09uZUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBGb28gb25lVG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByaXZhdGVPd25lZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhPbmVUb09uZUF0dHJpYnV0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIiksIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgY29udGV4dE9uZVRvT25lID0gCi0JCQkoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sT25lVG9PbmUgcmVzb3VyY2VPbmVUb09uZSA9IAotCQkJKFhtbE9uZVRvT25lKSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEZhbHNlKHJlc291cmNlT25lVG9PbmUuaXNQcml2YXRlT3duZWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRPbmVUb09uZS5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcHJpdmF0ZSBvd25lZCB0byB0cnVlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU9uZVRvT25lLnNldFByaXZhdGVPd25lZCh0cnVlKTsKLQkJCi0JCWFzc2VydFRydWUocmVzb3VyY2VPbmVUb09uZS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0T25lVG9PbmUuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHByaXZhdGUgb3duZWQgYmFjayB0byBmYWxzZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VPbmVUb09uZS5zZXRQcml2YXRlT3duZWQoZmFsc2UpOwotCQkKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VPbmVUb09uZS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE9uZVRvT25lLmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJpdmF0ZU93bmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlV2l0aE9uZVRvT25lQXR0cmlidXRlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBjb250ZXh0T25lVG9PbmUgPSAKLQkJCShFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxPbmVUb09uZSByZXNvdXJjZU9uZVRvT25lID0gCi0JCQkoWG1sT25lVG9PbmUpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VPbmVUb09uZS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE9uZVRvT25lLmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgcHJpdmF0ZSBvd25lZCAgdG8gdHJ1ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRPbmVUb09uZS5nZXRQcml2YXRlT3duZWQoKS5zZXRQcml2YXRlT3duZWQodHJ1ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHJlc291cmNlT25lVG9PbmUuaXNQcml2YXRlT3duZWQoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE9uZVRvT25lLmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgcHJpdmF0ZSBvd25lZCBiYWNrIHRvIGZhbHNlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dE9uZVRvT25lLmdldFByaXZhdGVPd25lZCgpLnNldFByaXZhdGVPd25lZChmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKb2luRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVXaXRoT25lVG9PbmVBdHRyaWJ1dGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIGNvbnRleHRPbmVUb09uZSA9IAotCQkJKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxPbmVUb09uZSByZXNvdXJjZU9uZVRvT25lID0gCi0JCQkoWG1sT25lVG9PbmUpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0T25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gSU5ORVIsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlT25lVG9PbmUuc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIsIHJlc291cmNlT25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0T25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gT1VURVIsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlT25lVG9PbmUuc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUuT1VURVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuT1VURVIsIHJlc291cmNlT25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0T25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gbnVsbCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VPbmVUb09uZS5zZXRKb2luRmV0Y2gobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlT25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRPbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZVdpdGhPbmVUb09uZUF0dHJpYnV0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIiksIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgY29udGV4dE9uZVRvT25lID0gCi0JCQkoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sT25lVG9PbmUgcmVzb3VyY2VPbmVUb09uZSA9IAotCQkJKFhtbE9uZVRvT25lKSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb09uZS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE9uZVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgam9pbiBmZXRjaCB0byBJTk5FUiwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRPbmVUb09uZS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIsIHJlc291cmNlT25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0T25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBqb2luIGZldGNoIHRvIE9VVEVSLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dE9uZVRvT25lLmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5PVVRFUiwgcmVzb3VyY2VPbmVUb09uZS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRPbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGpvaW4gZmV0Y2ggdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRPbmVUb09uZS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb09uZS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE9uZVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkZldGNoRGVmYXVsdEZyb21KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbXBsb3llZSgpOwotCQljcmVhdGVUZXN0RGVwYXJ0bWVudCgpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkRlcGFydG1lbnQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5FbXBsb3llZSIpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmUgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWUiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJb25lVG9PbmUgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWUiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CQkKLQkJCi0JCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBqYXZhUmVsYXRpb25zaGlwTWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWUiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFSZWxhdGlvbnNoaXBNYXBwaW5nLmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlvbmVUb09uZSA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZSIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgb25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCU9uZVRvT25lTWFwcGluZyB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLgotCQkJZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCi0JCUpvaW5Db2x1bW4gdmlydHVhbEpvaW5Db2x1bW4gPSAKLQkJCXZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1JFRkVSRU5DRURfQ09MVU1OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEUiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQotCQlDYXNjYWRlIGNhc2NhZGUgPSB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsICgoRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nKSB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nKS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nKS5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5T25lVG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCi0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybU9uZVRvT25lTWFwcGluZy5pc09wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QuQWRkcmVzcyIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQotCQkvL1RPRE8gZGVmYXVsdCBqb2luIGNvbHVtbnMgaW4geG1sIG9uZS10by1vbmUKLS8vCQlYbWxKb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1PbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0vLwkJLy9UT0RPIGphdmEgZGVmYXVsdCBjb2x1bW5zIG5hbWUgaW4gSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuSm9pbkNvbHVtbk93bmVyCi0vLwkJLy9hc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwkJLy9hc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLS8vCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCi0JCUNhc2NhZGUgY2FzY2FkZSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybU9uZVRvT25lTWFwcGluZy5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIiksIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1PbmVUb09uZU1hcHBpbmcuaXNPcHRpb25hbCgpKTsKLQkJLy9UT0RPIGRlZmF1bHQgdGFyZ2V0IGVudGl0eSBpbiB4bWwKLQkJLy9hc3NlcnRFcXVhbHMoInRlc3QuQWRkcmVzcyIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuZ2V0Sm9pbkNvbHVtbnNTaXplKCkgPiAwKTsKLQkJCi0JCS8vVE9ETyBkZWZhdWx0IGpvaW4gY29sdW1ucyBmb3Igc3BlY2lmaWVkIHhtbE9uZVRvT25lIG1hcHBpbmcKLS8vCQlYbWxKb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1PbmVUb09uZU1hcHBpbmcuZGVmYXVsdEpvaW5Db2x1bW5zKCkubmV4dCgpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLS8vCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLS8vCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRVbmlxdWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0TnVsbGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRVcGRhdGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybU9uZVRvT25lTWFwcGluZy5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTlkNWRkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4obmFtZT1cIkZPT1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZVNwZWNpZmllZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb1htbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9YbWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3BlY2lmaWVkQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHNwZWNpZmllZEF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZVNwZWNpZmllZE1hcHBpbmdLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVOdWxsQXR0cmlidXRlTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCS8vdGFrZSBhIHZpcnR1YWwgbWFwcGluZyB3aXRoIGEgbWFwcGluZyB0eXBlIGFuZCBtYWtlIGl0IHNwZWNpZmllZAotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmFkZFRvWG1sKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCksIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmFkZFRvWG1sKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHNwZWNpZmllZEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydFRydWUoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPcm1FY2xpcHNlTGlua0lkTWFwcGluZyk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuYWRkVG9YbWwoKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5hZGRUb1htbCgpOwotCi0JCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUucmVtb3ZlRnJvbVhtbCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLnJlbW92ZUZyb21YbWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJSXRlcmF0b3I8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiB2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsJCQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlVmlydHVhbE5vVW5kZXJseWluZ0phdmFBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmFkZFRvWG1sKCk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuYWRkVG9YbWwoKTsKLQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKS5zZXROYW1lKCJub0phdmFBdHRyaWJ1dGUiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5yZW1vdmVGcm9tWG1sKCk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdUeXBlV2hlbk1ldGFkYXRhQ29tcGxldGUoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgKChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdUeXBlV2hlbk1ldGFkYXRhQ29tcGxldGUyKCkgIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5T25lVG9PbmVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCQkKLQkJLy92aXJ0dWFsIG9ybSBhdHRyaWJ1dGUsIGFjY2VzcyB0eXBlIG1hdGNoZXMgamF2YSA6IEZJRUxELCBuYW1lIG1hdGNoZXMgamF2YQotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgamF2YVJlc291cmNlQXR0cmlidXRlID0gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JCWFzc2VydFRydWUoamF2YVJlc291cmNlQXR0cmlidXRlLmdldEtpbmQoKSA9PSBLaW5kLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGphdmFSZXNvdXJjZUF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKSwgamF2YVJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCQotCQkvL3NwZWNpZmllZCBvcm0gYXR0cmlidXRlLCBhY2Nlc3MgdHlwZSBtYXRjaGVzIGphdmEgOiBGSUVMRCwgbmFtZSBtYXRjaGVzIGphdmEKLQkJLy9qYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBzaG91bGQgYmUgPT0gdG8gamF2YSBjb250ZXh0IG1vZGVsIG9iamVjdAotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmFkZFRvWG1sKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkKLQkJCi0JCS8vdmlydHVhbCBvcm0gYXR0cmlidXRlLCBqYXZhIGFjY2VzcyB0eXBlIEZJRUxELCBvcm0gYWNjZXNzIHR5cGUgUFJPUEVSVFksIG5hbWUgbWF0Y2hlcyBqYXZhCi0JCS8vdmVyaWZ5IGJvdGggdGhlIHByb3BlcnR5IGphdmEgcmVzb3VyY2UgYXR0cmlidXRlIGFuZCB0aGUgZmllbGQgamF2YSByZXNvdXJjZSBhdHRyaWJ1dGUgYXJlIHVzZWQgaW4gb3JtCi0JCS8vYmVjYXVzZSB0aGUgZmllbGQgaXMgYW5ub3RhdGVkIGFuZCBwcm9wZXJ0eSBpcyBzcGVjaWZpZWQKLQkJKChPcm1QZXJzaXN0ZW50QXR0cmlidXRlKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlKS5yZW1vdmVGcm9tWG1sKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsJCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGlkRmllbGRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGlkUHJvcGVydHlBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIGlkRmllbGRBdHRyaWJ1dGUpOwotCQlhc3NlcnROb3RTYW1lKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIGlkUHJvcGVydHlBdHRyaWJ1dGUpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gaWRQcm9wZXJ0eUF0dHJpYnV0ZTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBpZEZpZWxkQXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOwotCQlqYXZhUmVzb3VyY2VBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGphdmFSZXNvdXJjZUF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRNZXRob2RzKCkuaXRlcmF0b3IoKS5uZXh0KCksIGphdmFSZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOy8vZGVmYXVsdCBhY2Nlc3Mgd2lsbCBiZSBmaWVsZAotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9YbWwoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpLnNldE5hbWUoImlkMiIpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKS5zZXROYW1lKCJpZCIpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVN0cnVjdENvbnZlcnRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1TdHJ1Y3RDb252ZXJ0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDhjZTRkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVN0cnVjdENvbnZlcnRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtU3RydWN0Q29udmVydGVyVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDb252ZXJ0KG5hbWU9XCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBTdHJ1Y3RDb252ZXJ0ZXIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtU3RydWN0Q29udmVydGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKLQkJWG1sU3RydWN0Q29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnRlcigpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWNvbnZlcnRlclJlc291cmNlLnNldENvbnZlcnRlcigibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnRlcigpKTsKLQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXRDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJ0ZXIoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKLQkJWG1sU3RydWN0Q29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApOwotCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVydGVyKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnRlcigpKTsKLQkKLQkJb3JtQ29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVydGVyKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkU3RydWN0Q29udmVydGVyKDApOwotCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0TmFtZSgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkU3RydWN0Q29udmVydGVyKDApOwotCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCk7Ci0JCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQ29udmVydGVyLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCW9ybUNvbnZlcnRlci5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVRyYW5zaWVudE1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwODQ3NmMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVRyYW5zaWVudE1hcHBpbmdUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGlua09ybVRyYW5zaWVudE1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlRSQU5TSUVOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVHJhbnNpZW50IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVUcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlMiA9IHBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkVG9YbWwoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUyLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtVHlwZUNvbnZlcnRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1UeXBlQ29udmVydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmNzI1ZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1UeXBlQ29udmVydGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVR5cGVDb252ZXJ0ZXJUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDb252ZXJ0KG5hbWU9XCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBUeXBlQ29udmVydGVyIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQotCXB1YmxpYyBFY2xpcHNlTGlua09ybVR5cGVDb252ZXJ0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJWG1sVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXREYXRhVHlwZSgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIGNvbnZlcnRlclJlc291cmNlLmdldERhdGFUeXBlKCkpOwotCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWNvbnZlcnRlclJlc291cmNlLnNldERhdGFUeXBlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlEYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCVhtbFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApOwotCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQ29udmVydGVyLnNldERhdGFUeXBlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7Ci0JCi0JCW9ybUNvbnZlcnRlci5zZXREYXRhVHlwZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldERhdGFUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlT2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCVhtbFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWNvbnZlcnRlclJlc291cmNlLnNldE9iamVjdFR5cGUoIm15Q29udmVydCIpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIG9ybUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7Ci0KLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0T2JqZWN0VHlwZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0T2JqZWN0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRUeXBlQ29udmVydGVyKDApOwotCQlYbWxUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1Db252ZXJ0ZXIuc2V0T2JqZWN0VHlwZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0T2JqZWN0VHlwZSgpKTsKLQkKLQkJb3JtQ29udmVydGVyLnNldE9iamVjdFR5cGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRBdHRyaWJ1dGVUb1htbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJWG1sVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0TmFtZSgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkQXR0cmlidXRlVG9YbWwob3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIiksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCVhtbFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApOwotCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUNvbnZlcnRlci5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQlvcm1Db252ZXJ0ZXIuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1WZXJzaW9uTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1WZXJzaW9uTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZDQ0MjguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtVmVyc2lvbk1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1WZXJzaW9uTWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rT3JtVmVyc2lvbk1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5WRVJTSU9OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBWZXJzaW9uIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVWZXJzaW9uRGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlZFUlNJT04sIEVjbGlwc2VMaW5rLk1VVEFCTEUsICJqYXZhLnV0aWwuRGF0ZSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFZlcnNpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNdXRhYmxlIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIERhdGUgbXlEYXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSAKLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgY29udGV4dFZlcnNpb24gPSAKLQkJCShPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFZlcnNpb24gcmVzb3VyY2VWZXJzaW9uID0gCi0JCQkoWG1sVmVyc2lvbikgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOwotCQlFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIGphdmFWZXJzaW9uTWFwcGluZyA9IChFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIGZhbHNlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZVZlcnNpb24uc2V0TXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIHRydWUsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlVmVyc2lvbi5zZXRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBtdXRhYmxlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZVZlcnNpb24uc2V0TXV0YWJsZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIFRPRE8gLSB0ZXN0IGRlZmF1bHRzIGZvciBqYXZhIHNlcmlhbGl6YWJsZSBhbmQgZGF0ZS90aW1lIHR5cGVzLCAKLQkJLy8gd2l0aCBhbmQgd2l0aG91dCBwZXJzaXN0ZW5jZSBwcm9wZXJ0eQotCQkKLQkJLy8gc2V0IG11dGFibGUgb24gamF2YSBiYXNpYyBtYXBwaW5nCi0JCQotCQlqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVZlcnNpb25NYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYXR0cmlidXRlIGZyb20geG1sLCB0ZXN0IGRlZmF1bHQgbXV0YWJsZSBmcm9tIGphdmEKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5yZW1vdmVGcm9tWG1sKCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIHZpcnR1YWxDb250ZXh0VmVyc2lvbiA9IChFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxDb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbENvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFWZXJzaW9uTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IG1ldGFkYXRhIGNvbXBsZXRlCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGNvbnRleHRCYXNpYyA9IChFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFWZXJzaW9uTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTXV0YWJsZURhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlVmVyc2lvbkRhdGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSAKLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJteURhdGUiKSwgTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIGNvbnRleHRWZXJzaW9uID0gCi0JCQkoT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxWZXJzaW9uIHJlc291cmNlVmVyc2lvbiA9IAotCQkJKFhtbFZlcnNpb24pIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLmdldCgwKTsKLQkJRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZyBqYXZhVmVyc2lvbk1hcHBpbmcgPSAoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RGF0ZSIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgbXV0YWJsZSB0byBmYWxzZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VWZXJzaW9uLnNldE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIG11dGFibGUgdG8gdHJ1ZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VWZXJzaW9uLnNldE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBtdXRhYmxlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZVZlcnNpb24uc2V0TXV0YWJsZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBtdXRhYmxlIG9uIGphdmEgdmVyc2lvbiBtYXBwaW5nCi0JCQotCQlqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoamF2YVZlcnNpb25NYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYXR0cmlidXRlIGZyb20geG1sLCB0ZXN0IGRlZmF1bHQgbXV0YWJsZSBmcm9tIGphdmEKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5yZW1vdmVGcm9tWG1sKCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJteURhdGUiKTsKLQkJRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZyB2aXJ0dWFsQ29udGV4dFZlcnNpb24gPSAoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbENvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB2aXJ0dWFsQ29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoamF2YVZlcnNpb25NYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgbWV0YWRhdGEgY29tcGxldGUKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlEYXRlIik7Ci0JCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGNvbnRleHRCYXNpYyA9IChFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlVmVyc2lvbkRhdGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSAKLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJteURhdGUiKSwgTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIGNvbnRleHRWZXJzaW9uID0gCi0JCQkoT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxWZXJzaW9uIHJlc291cmNlVmVyc2lvbiA9IAotCQkJKFhtbFZlcnNpb24pIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IG11dGFibGUgdG8gdHJ1ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBtdXRhYmxlIHRvIGZhbHNlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybVZlcnNpb25NYXBwaW5nIG9ybVZlcnNpb25NYXBwaW5nID0gKE9ybVZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sVmVyc2lvbiBiYXNpY1Jlc291cmNlID0gKFhtbFZlcnNpb24pIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOwotCQlKYXZhVmVyc2lvbk1hcHBpbmcgamF2YVZlcnNpb25NYXBwaW5nID0gKEphdmFWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQkJCQotCQkvL3NldCBsb2IgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWJhc2ljUmVzb3VyY2Uuc2V0Q29udmVydCgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCi0JCS8vc2V0IGxvYiB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpY1Jlc291cmNlLnNldENvbnZlcnQobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJCi0JCQotCQlqYXZhVmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcyk7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5yZW1vdmVGcm9tWG1sKCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlWZXJzaW9uTWFwcGluZyB2aXJ0dWFsVmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIHZpcnR1YWxWZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB2aXJ0dWFsVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFWZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQkJCi0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCB2aXJ0dWFsVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgdmlydHVhbFZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0KLQkJamF2YVZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydE51bGwoamF2YVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSAKLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZEF0dHJpYnV0ZVRvWG1sKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLCBNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybVZlcnNpb25NYXBwaW5nIG9ybVZlcnNpb25NYXBwaW5nID0gKE9ybVZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sVmVyc2lvbiBiYXNpY1Jlc291cmNlID0gKFhtbFZlcnNpb24pIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOwotCQotCQlhc3NlcnROdWxsKG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQkJCQotCQkvL3NldCBsb2IgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybVZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCi0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZShudWxsKTsKLQotCQlhc3NlcnROdWxsKG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0KLQkJLy9zZXQgbG9iIHRvIGZhbHNlIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybVZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2OTFhZjAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgewotCQlyZXR1cm4gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0FsbEZlYXR1cmVzVW5zZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzVW5zZXQoKSk7Ci0JCQotCQlYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldENhc2NhZGVQZXJzaXN0KGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldFNjaGVtYSgiYXNkZiIpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldENhdGFsb2coImFzZGYiKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKLQkJCi0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNjaGVtYSgiTVlfU0NIRU1BIik7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKLQkKLQkJLy9zZXQgc2NoZW1hIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgc2NoZW1hIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkU2NoZW1hKCJNWV9TQ0hFTUEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJLy9zZXQgc2NoZW1hIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U2NoZW1hMigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRTY2hlbWEoIk1ZX1NDSEVNQSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7Ci0JCQotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhdGFsb2coIk1ZX0NBVEFMT0ciKTsKLQkJLy9zZXQgc2NoZW1hIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTY2hlbWEzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgc28gb25seSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgZ2V0cyByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQkKLQkJLy9zZXQgc2NoZW1hIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkU2NoZW1hKCJNWV9TQ0hFTUEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJLy9zZXQgc2NoZW1hIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBjYXRhbG9nIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7Ci0JCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYXRhbG9nMigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZENhdGFsb2coIk1ZX0NBVEFMT0ciKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IHNvIGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U2NoZW1hKCJNWV9TQ0hFTUEiKTsKLQkJLy9zZXQgY2F0YWxvZyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2F0YWxvZzMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgc28gb25seSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgZ2V0cyByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZENhdGFsb2coIk1ZX0NBVEFMT0ciKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBjYXNjYWRlUGVyc2lzdCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQotCQkvL3NldCBjYXNjYWRlUGVyc2lzdCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyB0YWcgbm90IHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2FzY2FkZVBlcnNpc3QoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGNhc2NhZGVQZXJzaXN0IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQkKLQkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRDYXNjYWRlUGVyc2lzdChmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVQZXJzaXN0MigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGNhc2NhZGVQZXJzaXN0IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQkKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgc28gaXQgZG9lc24ndCBnZXQgcmVtb3ZlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCS8vc2V0IGNhc2NhZGVQZXJzaXN0IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZVBlcnNpc3QzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBzbyBvbmx5IHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBnZXRzIHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCQotCQkvL3NldCBjYXNjYWRlUGVyc2lzdCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJCi0JCS8vc2V0IGNhc2NhZGVQZXJzaXN0IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxELCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7Ci0JCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5QWNjZXNzMigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IHNvIGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5QWNjZXNzMygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IHNvIG9ubHkgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IGdldHMgcmVtb3ZlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTM5ODRmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkgewotCQlyZXR1cm4gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNBbGxGZWF0dXJlc1Vuc2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzVW5zZXQoKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7CQkKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCi0JCS8vc2V0IHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlMigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vSnB0RWNsaXBzZUxpbmtDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9KcHRFY2xpcHNlTGlua0NvcmVPcm1Db250ZXh0TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDcwYTc5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9KcHRFY2xpcHNlTGlua0NvcmVPcm1Db250ZXh0TW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rQ29yZU9ybUNvbnRleHRNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsJCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rQ29yZU9ybUNvbnRleHRNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybUVtYmVkZGFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybUVudGl0eVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtQmFzaWNNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1JZE1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybVZlcnNpb25NYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1Db252ZXJ0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybVN0cnVjdENvbnZlcnRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtVHlwZUNvbnZlcnRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtQ2FjaGluZ1Rlc3RzLmNsYXNzKTsJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazFfMU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5jbGFzcyk7CQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMV8xT3JtUGVyc2lzdGVudFR5cGVUZXN0cy5jbGFzcyk7CQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsxXzFPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMuY2xhc3MpOwkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wT3JtQ29sbGVjdGlvblRhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfME9ybUVudGl0eVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfME9ybU1hbnlUb09uZU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfME9ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfME9ybU9uZVRvT25lTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8xRW50aXR5TWFwcGluZ3NUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfMVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzFPcm1QZXJzaXN0ZW50VHlwZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8xT3JtRW1iZWRkYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8xT3JtRW50aXR5VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzFPcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzNPcm1NdWx0aXRlbmFuY3lUZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBKcHRFY2xpcHNlTGlua0NvcmVPcm1Db250ZXh0TW9kZWxUZXN0cygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2FjaGluZ0FkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2FjaGluZ0FkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzNmM2VlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0NhY2hpbmdBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNhY2hlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNhY2hpbmdFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRmx1c2hDbGVhckNhY2hlOwotCi0vKioKLSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgbW9kZWwgb2JqZWN0cyBieSB0aGUgQ2FjaGluZyBhZGFwdGVyIHdoZW4gdGhlCi0gKiBQZXJzaXN0ZW5jZVVuaXQgY2hhbmdlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2FjaGluZ0FkYXB0ZXJUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIENhY2hpbmcgY2FjaGluZzsKLQlwcml2YXRlIExpc3RFdmVudCBlbnRpdGllc0V2ZW50OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1RFU1QgPSAiRW1wbG95ZWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9URVNUXzIgPSAiQWRkcmVzcyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9UWVBFX0RFRkFVTFRfS0VZID0gQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDYWNoZVR5cGUgQ0FDSEVfVFlQRV9ERUZBVUxUX1RFU1RfVkFMVUUgPSBDYWNoZVR5cGUuc29mdF93ZWFrOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2FjaGVUeXBlIENBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFXzIgPSBDYWNoZVR5cGUuZnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NJWkVfREVGQVVMVF9LRVkgPSBDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1NJWkVfREVGQVVMVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgQ0FDSEVfU0laRV9ERUZBVUxUX1RFU1RfVkFMVUUgPSAxMjM0NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgQ0FDSEVfU0laRV9ERUZBVUxUX1RFU1RfVkFMVUVfMiA9IDY3ODkwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBUkVEX0NBQ0hFX0RFRkFVTFRfS0VZID0gQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBTSEFSRURfQ0FDSEVfREVGQVVMVF9URVNUX1ZBTFVFXzIgPSB0cnVlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfVFlQRV9LRVkgPSBDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1RZUEUgKyBFTlRJVFlfVEVTVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENhY2hlVHlwZSBDQUNIRV9UWVBFX1RFU1RfVkFMVUUgPSBDYWNoZVR5cGUuc29mdF93ZWFrOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2FjaGVUeXBlIENBQ0hFX1RZUEVfVEVTVF9WQUxVRV8yID0gQ2FjaGVUeXBlLmZ1bGw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSEFSRURfQ0FDSEVfS0VZID0gQ2FjaGluZy5FQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUgKyBFTlRJVFlfVEVTVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUVfMiA9IHRydWU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TSVpFX0tFWSA9IENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfU0laRSArIEVOVElUWV9URVNUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBDQUNIRV9TSVpFX1RFU1RfVkFMVUUgPSAxMjM0NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgQ0FDSEVfU0laRV9URVNUX1ZBTFVFXzIgPSA2Nzg5MDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTFVTSF9DTEVBUl9DQUNIRV9LRVkgPSBDYWNoaW5nLkVDTElQU0VMSU5LX0ZMVVNIX0NMRUFSX0NBQ0hFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRmx1c2hDbGVhckNhY2hlIEZMVVNIX0NMRUFSX0NBQ0hFX1RFU1RfVkFMVUUgPSBGbHVzaENsZWFyQ2FjaGUuZHJvcDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZsdXNoQ2xlYXJDYWNoZSBGTFVTSF9DTEVBUl9DQUNIRV9URVNUX1ZBTFVFXzIgPSBGbHVzaENsZWFyQ2FjaGUubWVyZ2U7Ci0KLQlwdWJsaWMgQ2FjaGluZ0FkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmNhY2hpbmcgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldENhY2hpbmcoKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJCi0JCXRoaXMuY2FjaGluZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENhY2hpbmcuQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jYWNoaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ2FjaGluZy5DQUNIRV9TSVpFX0RFRkFVTFRfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNhY2hpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDYWNoaW5nLlNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jYWNoaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ2FjaGluZ0VudGl0eS5DQUNIRV9UWVBFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jYWNoaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ2FjaGluZ0VudGl0eS5DQUNIRV9TSVpFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jYWNoaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ2FjaGluZ0VudGl0eS5TSEFSRURfQ0FDSEVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNhY2hpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDYWNoaW5nLkZMVVNIX0NMRUFSX0NBQ0hFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJCi0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBlbnRpdGllc0NoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZEVudGl0aWVzQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5jYWNoaW5nLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihDYWNoaW5nLkVOVElUSUVTX0xJU1QsIGVudGl0aWVzQ2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4gCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgPSA3OwotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsICsgNDsgLy8gNCBtaXNjIHByb3BlcnRpZXMKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7Ci0JCQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjEiLCAidmFsdWUuMSIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KENBQ0hFX1RZUEVfREVGQVVMVF9LRVksIENBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4yIiwgInZhbHVlLjIiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShDQUNIRV9TSVpFX0RFRkFVTFRfS0VZLCBDQUNIRV9TSVpFX0RFRkFVTFRfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoU0hBUkVEX0NBQ0hFX0RFRkFVTFRfS0VZLCBTSEFSRURfQ0FDSEVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4zIiwgInZhbHVlLjMiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS40IiwgInZhbHVlLjQiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShDQUNIRV9TSVpFX0tFWSwgQ0FDSEVfU0laRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShDQUNIRV9UWVBFX0tFWSwgQ0FDSEVfVFlQRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShTSEFSRURfQ0FDSEVfS0VZLCBTSEFSRURfQ0FDSEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoRkxVU0hfQ0xFQVJfQ0FDSEVfS0VZLCBGTFVTSF9DTEVBUl9DQUNIRV9URVNUX1ZBTFVFKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vICoqKioqKioqKiogTGlzdGVuZXJzICoqKioqKioqKioKLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZEVudGl0aWVzQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJCUNhY2hpbmdBZGFwdGVyVGVzdHMudGhpcy5lbnRpdHlBZGRlZChlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ0FkYXB0ZXJUZXN0cy50aGlzLmVudGl0eVJlbW92ZWQoZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ0FkYXB0ZXJUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ0FkYXB0ZXJUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nQWRhcHRlclRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nQWRhcHRlclRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjbGVhckV2ZW50KCkgewotCQlzdXBlci5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuZW50aXRpZXNFdmVudCA9IG51bGw7Ci0JfQotCi0Jdm9pZCBlbnRpdHlBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQl0aGlzLmVudGl0aWVzRXZlbnQgPSBlOwotCX0KLQotCXZvaWQgZW50aXR5UmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQl0aGlzLmVudGl0aWVzRXZlbnQgPSBlOwotCX0KLQotCS8vICoqKioqKioqKiogZW50aXRpZXMgbGlzdCAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdEVudGl0aWVzTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBhZGQKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCWludCBvcmlnaW5hbE51bWJlck9mRW50aXRpZXMgPSB0aGlzLmNhY2hpbmcuZ2V0RW50aXRpZXNTaXplKCk7Ci0JCQotCQl0aGlzLmNhY2hpbmcuYWRkRW50aXR5KEVOVElUWV9URVNUXzIpOwotCQlhc3NlcnRFcXVhbHMoIkVudGl0eSBub3QgYWRkZWQiLCB0aGlzLmNhY2hpbmcuZ2V0RW50aXRpZXNTaXplKCksIG9yaWdpbmFsTnVtYmVyT2ZFbnRpdGllcyArIDEpOwotCQkKLQkJLy8gdmVyaWZ5IGV2ZW50IHJlY2VpdmVkCi0JCWFzc2VydE5vdE51bGwoIk5vIEV2ZW50IEZpcmVkLiIsIHRoaXMuZW50aXRpZXNFdmVudCk7Ci0JCS8vIHZlcmlmeSBldmVudCBmb3IgdGhlIGV4cGVjdGVkIHByb3BlcnR5Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgRXZlbnQuIiwgdGhpcy5lbnRpdGllc0V2ZW50LmdldExpc3ROYW1lKCksIENhY2hpbmcuRU5USVRJRVNfTElTVCk7Ci0KLQkJLy8gcmVtb3ZlCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLmNhY2hpbmcucmVtb3ZlRW50aXR5KEVOVElUWV9URVNUXzIpOwotCQlhc3NlcnRFcXVhbHMoIkVudGl0eSBub3QgcmVtb3ZlZCIsIHRoaXMuY2FjaGluZy5nZXRFbnRpdGllc1NpemUoKSwgb3JpZ2luYWxOdW1iZXJPZkVudGl0aWVzKTsKLQotCQkvLyB2ZXJpZnkgZXZlbnQgcmVjZWl2ZWQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gRXZlbnQgRmlyZWQuIiwgdGhpcy5lbnRpdGllc0V2ZW50KTsKLQkJLy8gdmVyaWZ5IGV2ZW50IGZvciB0aGUgZXhwZWN0ZWQgcHJvcGVydHkKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBFdmVudC4iLCB0aGlzLmVudGl0aWVzRXZlbnQuZ2V0TGlzdE5hbWUoKSwgQ2FjaGluZy5FTlRJVElFU19MSVNUKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENhY2hlVHlwZURlZmF1bHQgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgQ2FjaGVUeXBlRGVmYXVsdCBwcm9wZXJ0eSBieSB0aGUgQ2FjaGluZyBhZGFwdGVyIHdoZW4KLQkgKiB0aGUgUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldENhY2hlVHlwZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQ0FDSEVfVFlQRV9ERUZBVUxUX0tFWSwKLQkJCUNBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUNBQ0hFX1RZUEVfREVGQVVMVF9LRVksCi0JCQlDQUNIRV9UWVBFX0RFRkFVTFRfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVDYWNoZVR5cGVEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlDQUNIRV9UWVBFX0RFRkFVTFRfS0VZLAotCQkJQ0FDSEVfVFlQRV9ERUZBVUxUX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9UWVBFX0RFRkFVTFRfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENhY2hlU2l6ZURlZmF1bHQgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgQ2FjaGVTaXplRGVmYXVsdCBwcm9wZXJ0eSBieSB0aGUgQ2FjaGluZyBhZGFwdGVyIHdoZW4KLQkgKiB0aGUgUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldENhY2hlU2l6ZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQ0FDSEVfU0laRV9ERUZBVUxUX0tFWSwKLQkJCUNBQ0hFX1NJWkVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUNBQ0hFX1NJWkVfREVGQVVMVF9LRVksCi0JCQlDQUNIRV9TSVpFX0RFRkFVTFRfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1NJWkVfREVGQVVMVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVDYWNoZVNpemVEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlDQUNIRV9TSVpFX0RFRkFVTFRfS0VZLAotCQkJQ0FDSEVfU0laRV9ERUZBVUxUX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9TSVpFX0RFRkFVTFRfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFNoYXJlZENhY2hlRGVmYXVsdCAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFNoYXJlZENhY2hlRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlTSEFSRURfQ0FDSEVfREVGQVVMVF9LRVksCi0JCQlTSEFSRURfQ0FDSEVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX0tFWSwKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUUsCi0JCQlTSEFSRURfQ0FDSEVfREVGQVVMVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVTaGFyZWRDYWNoZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX0tFWSwKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUUsCi0JCQlTSEFSRURfQ0FDSEVfREVGQVVMVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVUeXBlICoqKioqKioqKioKLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIENhY2hlVHlwZSBwcm9wZXJ0eSBieSB0aGUgQ2FjaGluZyBhZGFwdGVyIHdoZW4gdGhlIFBVCi0JICogb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldENhY2hlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlDQUNIRV9UWVBFX0tFWSwKLQkJCUNBQ0hFX1RZUEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0Q2FjaGluZ1Byb3BlcnR5KAotCQkJQ2FjaGluZ0VudGl0eS5DQUNIRV9UWVBFX1BST1BFUlRZLAotCQkJQ0FDSEVfVFlQRV9LRVksCi0JCQlDQUNIRV9UWVBFX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9UWVBFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUNhY2hlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZUNhY2hpbmdQcm9wZXJ0eSgKLQkJCUNhY2hpbmdFbnRpdHkuQ0FDSEVfVFlQRV9QUk9QRVJUWSwKLQkJCUNBQ0hFX1RZUEVfS0VZLAotCQkJQ0FDSEVfVFlQRV9URVNUX1ZBTFVFLAotCQkJQ0FDSEVfVFlQRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVTaXplICoqKioqKioqKioKLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIENhY2hlU2l6ZSBwcm9wZXJ0eSBieSB0aGUgQ2FjaGluZyBhZGFwdGVyIHdoZW4gdGhlIFBVCi0JICogb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldENhY2hlU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlDQUNIRV9TSVpFX0tFWSwKLQkJCUNBQ0hFX1NJWkVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0Q2FjaGluZ1Byb3BlcnR5KAotCQkJQ2FjaGluZ0VudGl0eS5DQUNIRV9TSVpFX1BST1BFUlRZLAotCQkJQ0FDSEVfU0laRV9LRVksCi0JCQlDQUNIRV9TSVpFX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9TSVpFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUNhY2hlU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZUNhY2hpbmdQcm9wZXJ0eSgKLQkJCUNhY2hpbmdFbnRpdHkuQ0FDSEVfU0laRV9QUk9QRVJUWSwKLQkJCUNBQ0hFX1NJWkVfS0VZLAotCQkJQ0FDSEVfU0laRV9URVNUX1ZBTFVFLAotCQkJQ0FDSEVfU0laRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogU2hhcmVkQ2FjaGUgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgU2hhcmVkQ2FjaGUgcHJvcGVydHkgYnkgdGhlIENhY2hpbmcgYWRhcHRlciB3aGVuIHRoZQotCSAqIFBVIG9yIHRoZSBtb2RlbCBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTZXRTaGFyZWRDYWNoZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlTSEFSRURfQ0FDSEVfS0VZLAotCQkJU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldENhY2hpbmdQcm9wZXJ0eSgKLQkJCUNhY2hpbmdFbnRpdHkuU0hBUkVEX0NBQ0hFX1BST1BFUlRZLAotCQkJU0hBUkVEX0NBQ0hFX0tFWSwKLQkJCVNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFLAotCQkJU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNoYXJlZENhY2hlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlQ2FjaGluZ1Byb3BlcnR5KAotCQkJQ2FjaGluZ0VudGl0eS5TSEFSRURfQ0FDSEVfUFJPUEVSVFksCi0JCQlTSEFSRURfQ0FDSEVfS0VZLAotCQkJU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUUsCi0JCQlTSEFSRURfQ0FDSEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEZsdXNoQ2xlYXJDYWNoZSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEZsdXNoQ2xlYXJDYWNoZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlGTFVTSF9DTEVBUl9DQUNIRV9LRVksCi0JCQlGTFVTSF9DTEVBUl9DQUNIRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUZMVVNIX0NMRUFSX0NBQ0hFX0tFWSwKLQkJCUZMVVNIX0NMRUFSX0NBQ0hFX1RFU1RfVkFMVUUsCi0JCQlGTFVTSF9DTEVBUl9DQUNIRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVGbHVzaENsZWFyQ2FjaGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUZMVVNIX0NMRUFSX0NBQ0hFX0tFWSwKLQkJCUZMVVNIX0NMRUFSX0NBQ0hFX1RFU1RfVkFMVUUsCi0JCQlGTFVTSF9DTEVBUl9DQUNIRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTZXRDYWNoaW5nUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGtleSwgT2JqZWN0IHRlc3RWYWx1ZTEsIE9iamVjdCB0ZXN0VmFsdWUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gUmVwbGFjZQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KGtleSwgdGVzdFZhbHVlMik7Ci0JCXRoaXMudmVyaWZ5UHV0Q2FjaGluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTIpOwotCQkKLQkJLy8gUmVwbGFjZSBieSBzZXR0aW5nIG1vZGVsIG9iamVjdAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5zZXRDYWNoaW5nUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMSk7Ci0JCXRoaXMudmVyaWZ5UHV0Q2FjaGluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTEpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUFkZFJlbW92ZUNhY2hpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBSZW1vdmUKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCS0tdGhpcy5wcm9wZXJ0aWVzVG90YWw7Ci0JCS0tdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOwotCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnJlbW92ZVByb3BlcnR5KGtleSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShrZXkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSwgdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgLSAxKTsKLQkJdGhpcy52ZXJpZnlQdXRDYWNoaW5nUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgbnVsbCk7Ci0JCQotCQkvLyBBZGQgb3JpZ2luYWwgUHJvcGVydHkKLQkJKyt0aGlzLnByb3BlcnRpZXNUb3RhbDsKLQkJKyt0aGlzLm1vZGVsUHJvcGVydGllc1NpemU7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCB0ZXN0VmFsdWUxKTsKLQkJdGhpcy52ZXJpZnlQdXRDYWNoaW5nUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMSk7Ci0JCQotCQkvLyBTZXQgdG8gbnVsbAotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KGtleSwgbnVsbCk7Ci0JCXRoaXMudmVyaWZ5UHV0Q2FjaGluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIG51bGwpOwotCQkKLQkJLy8gUmVwbGFjZQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KGtleSwgdGVzdFZhbHVlMik7Ci0JCXRoaXMudmVyaWZ5UHV0Q2FjaGluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVB1dENhY2hpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgZW50aXR5TmFtZSwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUV2ZW50KHByb3BlcnR5TmFtZSk7Ci0JCXRoaXMudmVyaWZ5Q2FjaGluZ0V2ZW50KHByb3BlcnR5TmFtZSwgZW50aXR5TmFtZSwgZXhwZWN0ZWRWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5Q2FjaGluZ0V2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBlbnRpdHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHZlcmlmeSBldmVudCB2YWx1ZQotCQlDYWNoaW5nRW50aXR5IGVudGl0eSA9IChDYWNoaW5nRW50aXR5KSB0aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmdFbnRpdHkuQ0FDSEVfVFlQRV9QUk9QRVJUWSkpIHsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBlbnRpdHkuZ2V0UGFyZW50KCkuZ2V0Q2FjaGVUeXBlT2YoZW50aXR5TmFtZSkpOwotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIHRoaXMuY2FjaGluZy5nZXRDYWNoZVR5cGVPZihlbnRpdHlOYW1lKSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDYWNoaW5nRW50aXR5LkNBQ0hFX1NJWkVfUFJPUEVSVFkpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgZW50aXR5LmdldFBhcmVudCgpLmdldENhY2hlU2l6ZU9mKGVudGl0eU5hbWUpKTsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCB0aGlzLmNhY2hpbmcuZ2V0Q2FjaGVTaXplT2YoZW50aXR5TmFtZSkpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZ0VudGl0eS5TSEFSRURfQ0FDSEVfUFJPUEVSVFkpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgZW50aXR5LmdldFBhcmVudCgpLmdldFNoYXJlZENhY2hlT2YoZW50aXR5TmFtZSkpOwotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIHRoaXMuY2FjaGluZy5nZXRTaGFyZWRDYWNoZU9mKGVudGl0eU5hbWUpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigidmVyaWZ5Q2FjaGluZ0V2ZW50IiwgcHJvcGVydHlOYW1lKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5DQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFkpKQotCQkJdGhpcy5jYWNoaW5nLnNldENhY2hlVHlwZURlZmF1bHQoKENhY2hlVHlwZSkgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmcuQ0FDSEVfU0laRV9ERUZBVUxUX1BST1BFUlRZKSkKLQkJCXRoaXMuY2FjaGluZy5zZXRDYWNoZVNpemVEZWZhdWx0KChJbnRlZ2VyKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5TSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSkpCi0JCQl0aGlzLmNhY2hpbmcuc2V0U2hhcmVkQ2FjaGVEZWZhdWx0KChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5GTFVTSF9DTEVBUl9DQUNIRV9QUk9QRVJUWSkpCi0JCQl0aGlzLmNhY2hpbmcuc2V0Rmx1c2hDbGVhckNhY2hlKChGbHVzaENsZWFyQ2FjaGUpIG5ld1ZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q2FjaGluZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBlbnRpdHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmdFbnRpdHkuQ0FDSEVfVFlQRV9QUk9QRVJUWSkpCi0JCQl0aGlzLmNhY2hpbmcuc2V0Q2FjaGVUeXBlT2YoZW50aXR5TmFtZSwgKENhY2hlVHlwZSkgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmdFbnRpdHkuQ0FDSEVfU0laRV9QUk9QRVJUWSkpCi0JCQl0aGlzLmNhY2hpbmcuc2V0Q2FjaGVTaXplT2YoZW50aXR5TmFtZSwgKEludGVnZXIpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDYWNoaW5nRW50aXR5LlNIQVJFRF9DQUNIRV9QUk9QRVJUWSkpCi0JCQl0aGlzLmNhY2hpbmcuc2V0U2hhcmVkQ2FjaGVPZihlbnRpdHlOYW1lLCAoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldENhY2hpbmdQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmcuQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNhY2hpbmcuZ2V0Q2FjaGVUeXBlRGVmYXVsdCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmcuQ0FDSEVfU0laRV9ERUZBVUxUX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNhY2hpbmcuZ2V0Q2FjaGVTaXplRGVmYXVsdCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmcuU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY2FjaGluZy5nZXRTaGFyZWRDYWNoZURlZmF1bHQoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDYWNoaW5nRW50aXR5LkNBQ0hFX1NJWkVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY2FjaGluZy5nZXRDYWNoZVNpemVPZihFTlRJVFlfVEVTVCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZ0VudGl0eS5DQUNIRV9UWVBFX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNhY2hpbmcuZ2V0Q2FjaGVUeXBlT2YoRU5USVRZX1RFU1QpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmdFbnRpdHkuU0hBUkVEX0NBQ0hFX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNhY2hpbmcuZ2V0U2hhcmVkQ2FjaGVPZihFTlRJVFlfVEVTVCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5GTFVTSF9DTEVBUl9DQUNIRV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jYWNoaW5nLmdldEZsdXNoQ2xlYXJDYWNoZSgpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImdldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIG1vZGVsVmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2FjaGluZ1ZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2FjaGluZ1ZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDM0MTg2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0NhY2hpbmdWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2FjaGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2FjaGluZ0VudGl0eTsKLQotLyoqCi0gKiBDYWNoaW5nVmFsdWVNb2RlbFRlc3RzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENhY2hpbmdWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBDYWNoaW5nIGNhY2hpbmc7Ci0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gY2FjaGluZ0hvbGRlcjsKLQkKLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGVUeXBlPiBjYWNoZVR5cGVIb2xkZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGNhY2hlVHlwZUxpc3RlbmVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBjYWNoZVR5cGVFdmVudDsKLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBzaGFyZWRDYWNoZUhvbGRlcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc2hhcmVkQ2FjaGVMaXN0ZW5lcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgc2hhcmVkQ2FjaGVFdmVudDsKLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZVR5cGU+IGNhY2hlVHlwZURlZmF1bHRIb2xkZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGNhY2hlVHlwZURlZmF1bHRMaXN0ZW5lcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgY2FjaGVUeXBlRGVmYXVsdEV2ZW50OwotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHNoYXJlZENhY2hlRGVmYXVsdEhvbGRlcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc2hhcmVkQ2FjaGVEZWZhdWx0TGlzdGVuZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IHNoYXJlZENhY2hlRGVmYXVsdEV2ZW50OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX05BTUVfVEVTVF9WQUxVRSA9ICJFbXBsb3llZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDYWNoZVR5cGUgQ0FDSEVfVFlQRV9URVNUX1ZBTFVFID0gQ2FjaGVUeXBlLmhhcmRfd2VhazsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUUgPSBCb29sZWFuLkZBTFNFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2FjaGVUeXBlIENBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFID0gQ2FjaGVUeXBlLndlYWs7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUUgPSBCb29sZWFuLkZBTFNFOwotCi0JcHVibGljIENhY2hpbmdWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5jYWNoaW5nID0gdGhpcy5zdWJqZWN0LmdldENhY2hpbmcoKTsgLy8gU3ViamVjdAotCQl0aGlzLmNhY2hpbmdIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+KHRoaXMuY2FjaGluZyk7Ci0JCQotCQl0aGlzLmNhY2hlVHlwZUhvbGRlciA9IHRoaXMuYnVpbGRDYWNoZVR5cGVBQSh0aGlzLmNhY2hpbmdIb2xkZXIpOwotCQl0aGlzLmNhY2hlVHlwZUxpc3RlbmVyID0gdGhpcy5idWlsZENhY2hlVHlwZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuY2FjaGVUeXBlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmNhY2hlVHlwZUxpc3RlbmVyKTsKLQkJdGhpcy5jYWNoZVR5cGVFdmVudCA9IG51bGw7Ci0JCQotCQl0aGlzLnNoYXJlZENhY2hlSG9sZGVyID0gdGhpcy5idWlsZFNoYXJlZENhY2hlQUEodGhpcy5jYWNoaW5nSG9sZGVyKTsKLQkJdGhpcy5zaGFyZWRDYWNoZUxpc3RlbmVyID0gdGhpcy5idWlsZFNoYXJlZENhY2hlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zaGFyZWRDYWNoZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zaGFyZWRDYWNoZUxpc3RlbmVyKTsKLQkJdGhpcy5zaGFyZWRDYWNoZUV2ZW50ID0gbnVsbDsKLQkJCi0JCXRoaXMuY2FjaGVUeXBlRGVmYXVsdEhvbGRlciA9IHRoaXMuYnVpbGRDYWNoZVR5cGVEZWZhdWx0QUEodGhpcy5jYWNoaW5nSG9sZGVyKTsKLQkJdGhpcy5jYWNoZVR5cGVEZWZhdWx0TGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ2FjaGVUeXBlRGVmYXVsdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuY2FjaGVUeXBlRGVmYXVsdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5jYWNoZVR5cGVEZWZhdWx0TGlzdGVuZXIpOwotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRFdmVudCA9IG51bGw7Ci0JCQotCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdEhvbGRlciA9IHRoaXMuYnVpbGRTaGFyZWRDYWNoZURlZmF1bHRBQSh0aGlzLmNhY2hpbmdIb2xkZXIpOwotCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdExpc3RlbmVyID0gdGhpcy5idWlsZFNoYXJlZENhY2hlRGVmYXVsdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnNoYXJlZENhY2hlRGVmYXVsdExpc3RlbmVyKTsKLQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRFdmVudCA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJQWJzdHJhY3RNb2RlbCBzdWJqZWN0Q2FjaGluZyA9IChBYnN0cmFjdE1vZGVsKSB0aGlzLmNhY2hpbmc7IC8vIFN1YmplY3QKLQkJUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIENhY2hlVHlwZT4gY2FjaGVUeXBlQUEgPSAKLQkJCShQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQ2FjaGVUeXBlPikgdGhpcy5jYWNoZVR5cGVIb2xkZXI7Ci0JCWFzc2VydFRydWUoY2FjaGVUeXBlQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoc3ViamVjdENhY2hpbmcuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoQ2FjaGluZy5DQUNIRV9UWVBFX1BST1BFUlRZKSk7Ci0JCQotCQljYWNoZVR5cGVBQS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5jYWNoZVR5cGVMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHN1YmplY3RDYWNoaW5nLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKENhY2hpbmcuQ0FDSEVfVFlQRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZShjYWNoZVR5cGVBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJCi0JCVByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBCb29sZWFuPiBzaGFyZWRDYWNoZUFBID0gCi0JCQkoUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEJvb2xlYW4+KSB0aGlzLnNoYXJlZENhY2hlSG9sZGVyOwotCQlhc3NlcnRUcnVlKHNoYXJlZENhY2hlQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoc3ViamVjdENhY2hpbmcuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoQ2FjaGluZy5TSEFSRURfQ0FDSEVfUFJPUEVSVFkpKTsKLQkJCi0JCXNoYXJlZENhY2hlQUEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2hhcmVkQ2FjaGVMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHN1YmplY3RDYWNoaW5nLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKENhY2hpbmcuU0hBUkVEX0NBQ0hFX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHNoYXJlZENhY2hlQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCQotCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQ2FjaGVUeXBlPiBjYWNoZVR5cGVEZWZhdWx0QUEgPSAKLQkJCShQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQ2FjaGVUeXBlPikgdGhpcy5jYWNoZVR5cGVEZWZhdWx0SG9sZGVyOwotCQlhc3NlcnRUcnVlKGNhY2hlVHlwZURlZmF1bHRBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZShzdWJqZWN0Q2FjaGluZy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhDYWNoaW5nLkNBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSkpOwotCQkKLQkJY2FjaGVUeXBlRGVmYXVsdEFBLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmNhY2hlVHlwZURlZmF1bHRMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHN1YmplY3RDYWNoaW5nLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKENhY2hpbmcuQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKGNhY2hlVHlwZURlZmF1bHRBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJCi0JCVByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBCb29sZWFuPiBzaGFyZWRDYWNoZURlZmF1bHRBQSA9IAotCQkJKFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBCb29sZWFuPikgdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRIb2xkZXI7Ci0JCWFzc2VydFRydWUoc2hhcmVkQ2FjaGVEZWZhdWx0QUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoc3ViamVjdENhY2hpbmcuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoQ2FjaGluZy5TSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSkpOwotCQkKLQkJc2hhcmVkQ2FjaGVEZWZhdWx0QUEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0TGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShzdWJqZWN0Q2FjaGluZy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhDYWNoaW5nLlNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHNoYXJlZENhY2hlRGVmYXVsdEFBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoCi0JCQlDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1RZUEUgKyBFTlRJVFlfTkFNRV9URVNUX1ZBTFVFLCAKLQkJCUNBQ0hFX1RZUEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoCi0JCQlDYWNoaW5nLkVDTElQU0VMSU5LX1NIQVJFRF9DQUNIRSArIEVOVElUWV9OQU1FX1RFU1RfVkFMVUUsIAotCQkJU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KAotCQkJQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQsIAotCQkJQ0FDSEVfVFlQRV9ERUZBVUxUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KAotCQkJQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVCwgCi0JCQlTSEFSRURfQ0FDSEVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJcmV0dXJuOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoaW5nOwotCX0KLQotCS8qKiAqKioqKiogQ2FjaGVUeXBlICoqKioqKiogKi8KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGVUeXBlPiBidWlsZENhY2hlVHlwZUFBKFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIENhY2hlVHlwZT4oc3ViamVjdEhvbGRlciwgQ2FjaGluZy5DQUNIRV9UWVBFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYWNoZVR5cGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDYWNoZVR5cGVPZihFTlRJVFlfTkFNRV9URVNUX1ZBTFVFKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQ2FjaGVUeXBlIGVudW1WYWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRDYWNoZVR5cGVPZihFTlRJVFlfTkFNRV9URVNUX1ZBTFVFLCBlbnVtVmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZENhY2hlVHlwZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ1ZhbHVlTW9kZWxUZXN0cy50aGlzLmNhY2hlVHlwZUV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKiogKioqKioqIFNoYXJlZENhY2hlICoqKioqKiogKi8KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTaGFyZWRDYWNoZUFBKFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIENhY2hpbmcuU0hBUkVEX0NBQ0hFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U2hhcmVkQ2FjaGVPZihFTlRJVFlfTkFNRV9URVNUX1ZBTFVFKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiBlbnVtVmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U2hhcmVkQ2FjaGVPZihFTlRJVFlfTkFNRV9URVNUX1ZBTFVFLCBlbnVtVmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNoYXJlZENhY2hlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2hhcmVkQ2FjaGVFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqICoqKioqKiBDYWNoZVR5cGVEZWZhdWx0ICoqKioqKiogKi8KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGVUeXBlPiBidWlsZENhY2hlVHlwZURlZmF1bHRBQShQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBDYWNoZVR5cGU+KHN1YmplY3RIb2xkZXIsIENhY2hpbmcuQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYWNoZVR5cGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDYWNoZVR5cGVEZWZhdWx0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKENhY2hlVHlwZSBlbnVtVmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0Q2FjaGVUeXBlRGVmYXVsdChlbnVtVmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZENhY2hlVHlwZURlZmF1bHRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNhY2hpbmdWYWx1ZU1vZGVsVGVzdHMudGhpcy5jYWNoZVR5cGVEZWZhdWx0RXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCS8qKiAqKioqKiogU2hhcmVkQ2FjaGVEZWZhdWx0ICoqKioqKiogKi8KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTaGFyZWRDYWNoZURlZmF1bHRBQShQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBDYWNoaW5nLlNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U2hhcmVkQ2FjaGVEZWZhdWx0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gZW51bVZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNoYXJlZENhY2hlRGVmYXVsdChlbnVtVmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNoYXJlZENhY2hlRGVmYXVsdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ1ZhbHVlTW9kZWxUZXN0cy50aGlzLnNoYXJlZENhY2hlRGVmYXVsdEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKiogKioqKioqIEJhc2ljIEVudGl0eSdzIFByb3BlcnRpZXMgVGVzdHMgKioqKioqKiAqLwotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlDYWNoaW5nRW50aXR5IGVudGl0eSA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHkiLCBDYWNoZVR5cGUuZnVsbCwgMTAwLCB0cnVlKTsKLQotCQl0aGlzLnZlcmlmeUNsb25lKGVudGl0eSwgZW50aXR5LmNsb25lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotCQlDYWNoaW5nRW50aXR5IGVudGl0eTEgPSB0aGlzLmJ1aWxkRW50aXR5KCJUZXN0RW50aXR5QSIsIENhY2hlVHlwZS5mdWxsLCAxMDAsIHRydWUpOwotCQlDYWNoaW5nRW50aXR5IGVudGl0eTIgPSB0aGlzLmJ1aWxkRW50aXR5KCJUZXN0RW50aXR5QiIsIENhY2hlVHlwZS5mdWxsLCAxMDAsIHRydWUpOwotCQlhc3NlcnRFcXVhbHMoZW50aXR5MSwgZW50aXR5Mik7Ci0JCUNhY2hpbmdFbnRpdHkgZW50aXR5MyA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHlDIiwgQ2FjaGVUeXBlLmZ1bGwsIDEwMCwgdHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhlbnRpdHkxLCBlbnRpdHkzKTsKLQkJYXNzZXJ0RXF1YWxzKGVudGl0eTIsIGVudGl0eTMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKLQkJQ2FjaGluZ0VudGl0eSBlbnRpdHkgPSB0aGlzLmJ1aWxkRW50aXR5KCJUZXN0RW50aXR5Iik7Ci0JCWFzc2VydFRydWUoZW50aXR5LmlzRW1wdHkoKSk7Ci0JCXRoaXMuY2FjaGluZy5zZXRDYWNoZVNpemVPZihlbnRpdHkuZ2V0TmFtZSgpLCAxMDApOwotCQlhc3NlcnRGYWxzZShlbnRpdHkuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2xvbmUoQ2FjaGluZ0VudGl0eSBvcmlnaW5hbCwgQ2FjaGluZ0VudGl0eSBjbG9uZSkgewotCQlhc3NlcnROb3RTYW1lKG9yaWdpbmFsLCBjbG9uZSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbCwgb3JpZ2luYWwpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwsIGNsb25lKTsKLQl9Ci0KLQlwcml2YXRlIENhY2hpbmdFbnRpdHkgYnVpbGRFbnRpdHkoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGluZy5hZGRFbnRpdHkobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBDYWNoaW5nRW50aXR5IGJ1aWxkRW50aXR5KFN0cmluZyBuYW1lLCBDYWNoZVR5cGUgY2FjaGVUeXBlLCBJbnRlZ2VyIHNpemUsIEJvb2xlYW4gaXNTaGFyZWQpIHsKLQkJQ2FjaGluZ0VudGl0eSBlbnRpdHkgPSB0aGlzLmNhY2hpbmcuYWRkRW50aXR5KG5hbWUpOwotCQl0aGlzLmNhY2hpbmcuc2V0Q2FjaGVUeXBlT2YoZW50aXR5LmdldE5hbWUoKSwgY2FjaGVUeXBlKTsKLQkJdGhpcy5jYWNoaW5nLnNldENhY2hlU2l6ZU9mKGVudGl0eS5nZXROYW1lKCksIHNpemUpOwotCQl0aGlzLmNhY2hpbmcuc2V0U2hhcmVkQ2FjaGVPZihlbnRpdHkuZ2V0TmFtZSgpLCBpc1NoYXJlZCk7Ci0JCXJldHVybiBlbnRpdHk7Ci0JfQotCQotCS8qKiAqKioqKiogQ2FjaGluZyBUZXN0cyAqKioqKioqICovCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQkvKiogKioqKioqIENhY2hlVHlwZSAtIGRlZmF1bHRzIGZvciBlbnRpdHkgbGV2ZWwgY2FjaGluZyBhcmUgZXF1YWwgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgc2V0dGluZ3MgKioqKioqKiAqLwotCQl0aGlzLnZlcmlmeUNhY2hlVHlwZUFBVmFsdWUoQ0FDSEVfVFlQRV9URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY2FjaGluZy5nZXRDYWNoZVR5cGVEZWZhdWx0KCksIHRoaXMuY2FjaGluZy5nZXREZWZhdWx0Q2FjaGVUeXBlKCkpOwotCQkvKiogKioqKioqIFNoYXJlZENhY2hlIC0gZGVmYXVsdHMgZm9yIGVudGl0eSBsZXZlbCBjYWNoaW5nIGFyZSBlcXVhbCB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBzZXR0aW5ncyAqKioqKioqICovCi0JCXRoaXMudmVyaWZ5U2hhcmVkQ2FjaGVBQVZhbHVlKFNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY2FjaGluZy5nZXRTaGFyZWRDYWNoZURlZmF1bHQoKSwgdGhpcy5jYWNoaW5nLmdldERlZmF1bHRTaGFyZWRDYWNoZSgpKTsKLQkJLyoqICoqKioqKiBDYWNoZVR5cGVEZWZhdWx0ICoqKioqKiogKi8KLQkJdGhpcy52ZXJpZnlDYWNoZVR5cGVEZWZhdWx0QUFWYWx1ZShDQUNIRV9UWVBFX0RFRkFVTFRfVEVTVF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhDYWNoaW5nLkRFRkFVTFRfQ0FDSEVfVFlQRV9ERUZBVUxULCB0aGlzLmNhY2hpbmcuZ2V0RGVmYXVsdENhY2hlVHlwZURlZmF1bHQoKSk7Ci0JCS8qKiAqKioqKiogU2hhcmVkQ2FjaGVEZWZhdWx0ICoqKioqKiogKi8KLQkJdGhpcy52ZXJpZnlTaGFyZWRDYWNoZURlZmF1bHRBQVZhbHVlKFNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoQ2FjaGluZy5ERUZBVUxUX1NIQVJFRF9DQUNIRV9ERUZBVUxULCB0aGlzLmNhY2hpbmcuZ2V0RGVmYXVsdFNoYXJlZENhY2hlRGVmYXVsdCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLyoqICoqKioqKiBDYWNoZVR5cGUgKioqKioqKiAqLwotCQl0aGlzLmNhY2hlVHlwZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5jYWNoZVR5cGVIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSk7Ci0JCUNhY2hlVHlwZSBuZXdDYWNoZVR5cGUgPSBDYWNoZVR5cGUuZnVsbDsKLQkJLy8gTW9kaWZ5IHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5jYWNoZVR5cGVIb2xkZXIuc2V0VmFsdWUobmV3Q2FjaGVUeXBlKTsKLQkJdGhpcy52ZXJpZnlDYWNoZVR5cGVBQVZhbHVlKG5ld0NhY2hlVHlwZSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5jYWNoZVR5cGVFdmVudCk7Ci0JCS8qKiAqKioqKiogU2hhcmVkQ2FjaGUgKioqKioqKiAqLwotCQl0aGlzLnNoYXJlZENhY2hlRXZlbnQgPSBudWxsOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnNoYXJlZENhY2hlSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCQlCb29sZWFuIG5ld1NoYXJlZENhY2hlID0gIVNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFOwotCQkvLyBNb2RpZnkgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLnNoYXJlZENhY2hlSG9sZGVyLnNldFZhbHVlKG5ld1NoYXJlZENhY2hlKTsKLQkJdGhpcy52ZXJpZnlTaGFyZWRDYWNoZUFBVmFsdWUobmV3U2hhcmVkQ2FjaGUpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuc2hhcmVkQ2FjaGVFdmVudCk7Ci0JCS8qKiAqKioqKiogQ2FjaGVUeXBlRGVmYXVsdCAqKioqKioqICovCi0JCXRoaXMuY2FjaGVUeXBlRGVmYXVsdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5jYWNoZVR5cGVEZWZhdWx0SG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCQlDYWNoZVR5cGUgbmV3Q2FjaGVUeXBlRGVmYXVsdCA9IENhY2hlVHlwZS5ub25lOwotCQkvLyBNb2RpZnkgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRIb2xkZXIuc2V0VmFsdWUobmV3Q2FjaGVUeXBlRGVmYXVsdCk7Ci0JCXRoaXMudmVyaWZ5Q2FjaGVUeXBlRGVmYXVsdEFBVmFsdWUobmV3Q2FjaGVUeXBlRGVmYXVsdCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5jYWNoZVR5cGVEZWZhdWx0RXZlbnQpOwotCQkvKiogKioqKioqIFNoYXJlZENhY2hlRGVmYXVsdCAqKioqKioqICovCi0JCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0RXZlbnQgPSBudWxsOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnNoYXJlZENhY2hlRGVmYXVsdEhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJQm9vbGVhbiBuZXdTaGFyZWRDYWNoZURlZmF1bHQgPSAhU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRTsKLQkJLy8gTW9kaWZ5IHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRIb2xkZXIuc2V0VmFsdWUobmV3U2hhcmVkQ2FjaGVEZWZhdWx0KTsKLQkJdGhpcy52ZXJpZnlTaGFyZWRDYWNoZURlZmF1bHRBQVZhbHVlKG5ld1NoYXJlZENhY2hlRGVmYXVsdCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5zaGFyZWRDYWNoZURlZmF1bHRFdmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE51bGxWYWx1ZSgpIHsKLQkJU3RyaW5nIG5vdERlbGV0ZWQgPSAiUHJvcGVydHkgbm90IGRlbGV0ZWQiOwotCQkvKiogKioqKioqIENhY2hlVHlwZSAqKioqKioqICovCi0JCXRoaXMuY2FjaGVUeXBlRXZlbnQgPSBudWxsOwotCQkvLyBTZXR0aW5nIHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5jYWNoZVR5cGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCS8vIHRlc3RpbmcgSG9sZGVyCi0JCXRoaXMudmVyaWZ5Q2FjaGVUeXBlQUFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmNhY2hlVHlwZUV2ZW50KTsKLQkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCi0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1RZUEUgKyBFTlRJVFlfTkFNRV9URVNUX1ZBTFVFLCBub3REZWxldGVkKTsKLQkJLyoqICoqKioqKiBTaGFyZWRDYWNoZSAqKioqKioqICovCi0JCXRoaXMuc2hhcmVkQ2FjaGVFdmVudCA9IG51bGw7Ci0JCS8vIFNldHRpbmcgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLnNoYXJlZENhY2hlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkvLyB0ZXN0aW5nIEhvbGRlcgotCQl0aGlzLnZlcmlmeVNoYXJlZENhY2hlQUFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnNoYXJlZENhY2hlRXZlbnQpOwotCQkvLyB0ZXN0aW5nIFBVIHByb3BlcnRpZXMKLQkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KENhY2hpbmcuRUNMSVBTRUxJTktfU0hBUkVEX0NBQ0hFICsgRU5USVRZX05BTUVfVEVTVF9WQUxVRSwgbm90RGVsZXRlZCk7Ci0JCS8qKiAqKioqKiogQ2FjaGVUeXBlRGVmYXVsdCAqKioqKioqICovCi0JCXRoaXMuY2FjaGVUeXBlRGVmYXVsdEV2ZW50ID0gbnVsbDsKLQkJLy8gU2V0dGluZyB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMuY2FjaGVUeXBlRGVmYXVsdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJLy8gdGVzdGluZyBIb2xkZXIKLQkJdGhpcy52ZXJpZnlDYWNoZVR5cGVEZWZhdWx0QUFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmNhY2hlVHlwZURlZmF1bHRFdmVudCk7Ci0JCS8vIHRlc3RpbmcgUFUgcHJvcGVydGllcwotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQsIG5vdERlbGV0ZWQpOwotCQkvKiogKioqKioqIFNoYXJlZENhY2hlRGVmYXVsdCAqKioqKioqICovCi0JCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0RXZlbnQgPSBudWxsOwotCQkvLyBTZXR0aW5nIHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCS8vIHRlc3RpbmcgSG9sZGVyCi0JCXRoaXMudmVyaWZ5U2hhcmVkQ2FjaGVEZWZhdWx0QUFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnNoYXJlZENhY2hlRGVmYXVsdEV2ZW50KTsKLQkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCi0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1NIQVJFRF9ERUZBVUxULCBub3REZWxldGVkKTsKLQl9Ci0KLQkvKiogKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKiAqLwotCS8qKgotCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KLQkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgotCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgotCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlDYWNoZVR5cGVBQVZhbHVlKENhY2hlVHlwZSB0ZXN0VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlBQVZhbHVlKAotCQkJdGVzdFZhbHVlLCAKLQkJCXRoaXMuY2FjaGluZy5nZXRDYWNoZVR5cGVPZihFTlRJVFlfTkFNRV9URVNUX1ZBTFVFKSwgCi0JCQl0aGlzLmNhY2hlVHlwZUhvbGRlciwgCi0JCQlDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1RZUEUgKyBFTlRJVFlfTkFNRV9URVNUX1ZBTFVFKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2hhcmVkQ2FjaGVBQVZhbHVlKEJvb2xlYW4gdGVzdFZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5QUFWYWx1ZSgKLQkJCXRlc3RWYWx1ZSwgCi0JCQl0aGlzLmNhY2hpbmcuZ2V0U2hhcmVkQ2FjaGVPZihFTlRJVFlfTkFNRV9URVNUX1ZBTFVFKSwgCi0JCQl0aGlzLnNoYXJlZENhY2hlSG9sZGVyLCAKLQkJCUNhY2hpbmcuRUNMSVBTRUxJTktfU0hBUkVEX0NBQ0hFICsgRU5USVRZX05BTUVfVEVTVF9WQUxVRSk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhyZWUgdmFsdWUgdGVzdHM6PGJyPgotCSAqIDEuIHN1YmplY3QgdmFsdWU8YnI+Ci0JICogMi4gYXNwZWN0IGFkYXB0ZXIgdmFsdWU8YnI+Ci0JICogMy4gcGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IHZhbHVlPGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUNhY2hlVHlwZURlZmF1bHRBQVZhbHVlKENhY2hlVHlwZSB0ZXN0VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlBQVZhbHVlKAotCQkJdGVzdFZhbHVlLCAKLQkJCXRoaXMuY2FjaGluZy5nZXRDYWNoZVR5cGVEZWZhdWx0KCksIAotCQkJdGhpcy5jYWNoZVR5cGVEZWZhdWx0SG9sZGVyLCAKLQkJCUNhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfVFlQRV9ERUZBVUxUKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2hhcmVkQ2FjaGVEZWZhdWx0QUFWYWx1ZShCb29sZWFuIHRlc3RWYWx1ZSkgewotCQl0aGlzLnZlcmlmeUFBVmFsdWUoCi0JCQl0ZXN0VmFsdWUsIAotCQkJdGhpcy5jYWNoaW5nLmdldFNoYXJlZENhY2hlRGVmYXVsdCgpLCAKLQkJCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0SG9sZGVyLCAKLQkJCUNhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0N1c3RvbWl6YXRpb25WYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0N1c3RvbWl6YXRpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxODZlZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9DdXN0b21pemF0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ3VzdG9taXphdGlvbkVudGl0eTsKLQotLyoqCi0gKiBDdXN0b21pemF0aW9uVmFsdWVNb2RlbFRlc3RzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEN1c3RvbWl6YXRpb25WYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBDdXN0b21pemF0aW9uIGN1c3RvbWl6YXRpb247Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdGhyb3dFeGNlcHRpb25zSG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB0aHJvd0V4Y2VwdGlvbnNMaXN0ZW5lcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgdGhyb3dFeGNlcHRpb25zRXZlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfTkFNRV9URVNUX1ZBTFVFID0gIkVtcGxveWVlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFID0gQm9vbGVhbi5GQUxTRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01JWkVSX1RFU1RfVkFMVUUgPSAiYWNtZS5zZXNzaW9ucy5DdXN0b21pemVyIjsKLQotCXB1YmxpYyBDdXN0b21pemF0aW9uVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbiA9IHRoaXMuc3ViamVjdC5nZXRDdXN0b21pemF0aW9uKCk7IC8vIFN1YmplY3QKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEN1c3RvbWl6YXRpb24+IGN1c3RvbWl6YXRpb25Ib2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEN1c3RvbWl6YXRpb24+KHRoaXMuY3VzdG9taXphdGlvbik7Ci0JCQotCQl0aGlzLnRocm93RXhjZXB0aW9uc0hvbGRlciA9IHRoaXMuYnVpbGRUaHJvd0V4Y2VwdGlvbnNBQShjdXN0b21pemF0aW9uSG9sZGVyKTsKLQkJdGhpcy50aHJvd0V4Y2VwdGlvbnNMaXN0ZW5lciA9IHRoaXMuYnVpbGRUaHJvd0V4Y2VwdGlvbnNDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnRocm93RXhjZXB0aW9uc0hvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy50aHJvd0V4Y2VwdGlvbnNMaXN0ZW5lcik7Ci0JCXRoaXMudGhyb3dFeGNlcHRpb25zRXZlbnQgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCUFic3RyYWN0TW9kZWwgc3ViamVjdEN1c3RvbWl6YXRpb24gPSAoQWJzdHJhY3RNb2RlbCkgdGhpcy5jdXN0b21pemF0aW9uOyAvLyBTdWJqZWN0Ci0JCQotCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4gdGhyb3dFeGNlcHRpb25zQUEgPSAKLQkJCShQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4pIHRoaXMudGhyb3dFeGNlcHRpb25zSG9sZGVyOwotCQlhc3NlcnRUcnVlKHRocm93RXhjZXB0aW9uc0FBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHN1YmplY3RDdXN0b21pemF0aW9uLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEN1c3RvbWl6YXRpb24uVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSkpOwotCQkKLQkJdGhyb3dFeGNlcHRpb25zQUEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudGhyb3dFeGNlcHRpb25zTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShzdWJqZWN0Q3VzdG9taXphdGlvbi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhDdXN0b21pemF0aW9uLlRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhyb3dFeGNlcHRpb25zQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuIAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoCi0JCQlDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX1RIUk9XX0VYQ0VQVElPTlMsIAotCQkJVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFKTsKLQkJcmV0dXJuOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemF0aW9uOwotCX0KLQotCS8vICoqKioqKiBUaHJvd0V4Y2VwdGlvbnMgKioqKioqKgotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRocm93RXhjZXB0aW9uc0FBKFByb3BlcnR5VmFsdWVNb2RlbDxDdXN0b21pemF0aW9uPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIEN1c3RvbWl6YXRpb24uVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFRocm93RXhjZXB0aW9ucygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIGVudW1WYWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRUaHJvd0V4Y2VwdGlvbnMoZW51bVZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRUaHJvd0V4Y2VwdGlvbnNDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUN1c3RvbWl6YXRpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy50aHJvd0V4Y2VwdGlvbnNFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqICoqKioqKiBCYXNpYyBFbnRpdHkncyBQcm9wZXJ0aWVzIFRlc3RzICoqKioqKiogKi8KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJQ3VzdG9taXphdGlvbkVudGl0eSBlbnRpdHkgPSB0aGlzLmJ1aWxkRW50aXR5KCJUZXN0RW50aXR5IiwgQ1VTVE9NSVpFUl9URVNUX1ZBTFVFKTsKLQotCQl0aGlzLnZlcmlmeUNsb25lKGVudGl0eSwgZW50aXR5LmNsb25lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotCQlDdXN0b21pemF0aW9uRW50aXR5IGVudGl0eTEgPSB0aGlzLmJ1aWxkRW50aXR5KCJUZXN0RW50aXR5QSIsIENVU1RPTUlaRVJfVEVTVF9WQUxVRSk7Ci0JCUN1c3RvbWl6YXRpb25FbnRpdHkgZW50aXR5MiA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHlCIiwgQ1VTVE9NSVpFUl9URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKGVudGl0eTEsIGVudGl0eTIpOwotCQlDdXN0b21pemF0aW9uRW50aXR5IGVudGl0eTMgPSB0aGlzLmJ1aWxkRW50aXR5KCJUZXN0RW50aXR5QyIsIENVU1RPTUlaRVJfVEVTVF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhlbnRpdHkxLCBlbnRpdHkzKTsKLQkJYXNzZXJ0RXF1YWxzKGVudGl0eTIsIGVudGl0eTMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKLQkJQ3VzdG9taXphdGlvbkVudGl0eSBlbnRpdHkgPSB0aGlzLmJ1aWxkRW50aXR5KCJUZXN0RW50aXR5Iik7Ci0JCWFzc2VydFRydWUoZW50aXR5LmlzRW1wdHkoKSk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5zZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKGVudGl0eS5nZXROYW1lKCksIENVU1RPTUlaRVJfVEVTVF9WQUxVRSk7Ci0JCWFzc2VydEZhbHNlKGVudGl0eS5pc0VtcHR5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDbG9uZShDdXN0b21pemF0aW9uRW50aXR5IG9yaWdpbmFsLCBDdXN0b21pemF0aW9uRW50aXR5IGNsb25lKSB7Ci0JCWFzc2VydE5vdFNhbWUob3JpZ2luYWwsIGNsb25lKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLCBvcmlnaW5hbCk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbCwgY2xvbmUpOwotCX0KLQotCXByaXZhdGUgQ3VzdG9taXphdGlvbkVudGl0eSBidWlsZEVudGl0eShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemF0aW9uLmFkZEVudGl0eShuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIEN1c3RvbWl6YXRpb25FbnRpdHkgYnVpbGRFbnRpdHkoU3RyaW5nIG5hbWUsIFN0cmluZyBhQ2xhc3NOYW1lKSB7Ci0JCUN1c3RvbWl6YXRpb25FbnRpdHkgZW50aXR5ID0gdGhpcy5jdXN0b21pemF0aW9uLmFkZEVudGl0eShuYW1lKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLnNldERlc2NyaXB0b3JDdXN0b21pemVyT2YoZW50aXR5LmdldE5hbWUoKSwgYUNsYXNzTmFtZSk7Ci0JCXJldHVybiBlbnRpdHk7Ci0JfQotCi0JLy8gKioqKioqIFRlc3RzICoqKioqKiogCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQkvLyAqKioqKiogVGhyb3dFeGNlcHRpb25zICoqKioqKiogCi0JCXRoaXMudmVyaWZ5VGhyb3dFeGNlcHRpb25zQUFWYWx1ZShUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoQ3VzdG9taXphdGlvbi5ERUZBVUxUX1RIUk9XX0VYQ0VQVElPTlMsIHRoaXMuY3VzdG9taXphdGlvbi5nZXREZWZhdWx0VGhyb3dFeGNlcHRpb25zKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyAqKioqKiogVGhyb3dFeGNlcHRpb25zICoqKioqKiogCi0JCXRoaXMudGhyb3dFeGNlcHRpb25zRXZlbnQgPSBudWxsOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnRocm93RXhjZXB0aW9uc0hvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJQm9vbGVhbiBuZXdUaHJvd0V4Y2VwdGlvbnMgPSAhVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFOwotCQkvLyBNb2RpZnkgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLnRocm93RXhjZXB0aW9uc0hvbGRlci5zZXRWYWx1ZShuZXdUaHJvd0V4Y2VwdGlvbnMpOwotCQl0aGlzLnZlcmlmeVRocm93RXhjZXB0aW9uc0FBVmFsdWUobmV3VGhyb3dFeGNlcHRpb25zKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnRocm93RXhjZXB0aW9uc0V2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbFZhbHVlKCkgewotCQlTdHJpbmcgbm90RGVsZXRlZCA9ICJQcm9wZXJ0eSBub3QgZGVsZXRlZCI7Ci0JCS8vICoqKioqKiBUaHJvd0V4Y2VwdGlvbnMgKioqKioqKgotCQl0aGlzLnRocm93RXhjZXB0aW9uc0V2ZW50ID0gbnVsbDsKLQkJLy8gU2V0dGluZyB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMudGhyb3dFeGNlcHRpb25zSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkvLyB0ZXN0aW5nIEhvbGRlcgotCQl0aGlzLnZlcmlmeVRocm93RXhjZXB0aW9uc0FBVmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy50aHJvd0V4Y2VwdGlvbnNFdmVudCk7Ci0JCS8vIHRlc3RpbmcgUFUgcHJvcGVydGllcwotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19USFJPV19FWENFUFRJT05TLCBub3REZWxldGVkKTsKLQl9Ci0KLQkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCi0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5VGhyb3dFeGNlcHRpb25zQUFWYWx1ZShCb29sZWFuIHRlc3RWYWx1ZSkgewotCQl0aGlzLnZlcmlmeUFBVmFsdWUoCi0JCQl0ZXN0VmFsdWUsIAotCQkJdGhpcy5jdXN0b21pemF0aW9uLmdldFRocm93RXhjZXB0aW9ucygpLCAKLQkJCXRoaXMudGhyb3dFeGNlcHRpb25zSG9sZGVyLCAKLQkJCUN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfVEhST1dfRVhDRVBUSU9OUyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wQ29ubmVjdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfMENvbm5lY3Rpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjlkZWE2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wQ29ubmVjdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNvbm5lY3Rpb24yXzA7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rMl8wQ29ubmVjdGlvblRlc3RzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wQ29ubmVjdGlvblRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotewotCXByaXZhdGUgQ29ubmVjdGlvbjJfMCBjb25uZWN0aW9uOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUSVZFX1NRTF9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX05BVElWRV9TUUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIE5BVElWRV9TUUxfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBOQVRJVkVfU1FMX1RFU1RfVkFMVUVfMiA9ICEgTkFUSVZFX1NRTF9URVNUX1ZBTFVFOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSSVZFUl9LRVkgPSBKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfRFJJVkVSOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSSVZFUl9URVNUX1ZBTFVFID0gImNvbm5lY3Rpb24uZHJpdmVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfVEVTVF9WQUxVRV8yID0gImNvbm5lY3Rpb24uZHJpdmVyLjIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFR0FDWV9EUklWRVJfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19EUklWRVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX0RSSVZFUl9URVNUX1ZBTFVFID0gImxlZ2FjeS5jb25uZWN0aW9uLmRyaXZlciI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0tFWSA9IEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19VUkw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1RFU1RfVkFMVUUgPSAidGVzdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFR0FDWV9VUkxfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19VUkw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX1VSTF9URVNUX1ZBTFVFID0gImxlZ2FjeS5jb25uZWN0aW9uLnVybCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0tFWSA9IEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19VU0VSOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfVEVTVF9WQUxVRSA9ICJ0ZXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFR0FDWV9VU0VSX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfVVNFUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfVVNFUl9URVNUX1ZBTFVFID0gImxlZ2FjeS5jb25uZWN0aW9uLnVzZXIiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkRfS0VZID0gSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1BBU1NXT1JEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEX1RFU1RfVkFMVUUgPSAidGVzdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkRfVEVTVF9WQUxVRV8yID0gInRlc3RfMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX1BBU1NXT1JEX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfUEFTU1dPUkQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX1BBU1NXT1JEX1RFU1RfVkFMVUUgPSAibGVnYWN5LmNvbm5lY3Rpb24ucGFzc3dvcmQiOwotCi0JcHVibGljIEVjbGlwc2VMaW5rMl8wQ29ubmVjdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuY29ubmVjdGlvbiA9IChDb25uZWN0aW9uMl8wKSB0aGlzLnN1YmplY3QuZ2V0Q29ubmVjdGlvbigpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQkKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5EUklWRVJfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLlVSTF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uVVNFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uUEFTU1dPUkRfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgPSA4OyAvLyBFY2xpcHNlTGluayBwcm9wZXJ0aWVzCi0JCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyAxOyAvLyA0IG1pc2MgcHJvcGVydGllcwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCS8vIEluaXRpYWxpemVzIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4xIiwgInZhbHVlLjEiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShMRUdBQ1lfRFJJVkVSX0tFWSwgTEVHQUNZX0RSSVZFUl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KERSSVZFUl9LRVksIERSSVZFUl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KExFR0FDWV9VUkxfS0VZLCBMRUdBQ1lfVVJMX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVVJMX0tFWSwgVVJMX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTEVHQUNZX1VTRVJfS0VZLCBMRUdBQ1lfVVNFUl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFVTRVJfS0VZLCBVU0VSX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTEVHQUNZX1BBU1NXT1JEX0tFWSwgTEVHQUNZX1BBU1NXT1JEX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoUEFTU1dPUkRfS0VZLCBQQVNTV09SRF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQkKLQkJcmV0dXJuOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uOwotCX0KLQotCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7Ci0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5EUklWRVJfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXREcml2ZXIoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlVSTF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldFVybCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uVVNFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldFVzZXIoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlBBU1NXT1JEX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0UGFzc3dvcmQoKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBtb2RlbFZhbHVlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uRFJJVkVSX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXREcml2ZXIoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uVVJMX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRVcmwoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uVVNFUl9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0VXNlcigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5QQVNTV09SRF9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0UGFzc3dvcmQoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnRpZXMgTmFtZSBNaWdyYXRpb24gdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3REcml2ZXJQcm9wZXJ0eU5hbWVNaWdyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvLyBWZXJpZnkgbGVnYWN5IGRyaXZlciBleGlzdHMKLQkJYXNzZXJ0VHJ1ZSgiTGVnYWN5IGRyaXZlciBub3QgZXhpc3RzIiwgdGhpcy5wcm9wZXJ0eVZhbHVlRXF1YWxzKExFR0FDWV9EUklWRVJfS0VZLCBMRUdBQ1lfRFJJVkVSX1RFU1RfVkFMVUUpKTsKLQkJCi0JCS8vIFZlcmlmeSBkcml2ZXIgcmVhZCBpbgotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBkcml2ZXIgcmVhZCIsIHRoaXMuY29ubmVjdGlvbi5nZXREcml2ZXIoKSwgRFJJVkVSX1RFU1RfVkFMVUUpOwotCi0JCS8vIENoYW5nZSBkcml2ZXIgdmFsdWUKLQkJdGhpcy5jb25uZWN0aW9uLnNldERyaXZlcihEUklWRVJfVEVTVF9WQUxVRV8yKTsKLQkJLy8gVmVyaWZ5IGRyaXZlciB2YWx1ZSBjaGFuZ2VkCi0JCWFzc2VydEVxdWFscygiRHJpdmVyIG5vdCBzZXQiLCB0aGlzLmNvbm5lY3Rpb24uZ2V0RHJpdmVyKCksIERSSVZFUl9URVNUX1ZBTFVFXzIpOwotCQlhc3NlcnRUcnVlKCJQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgbm90IHNldCIsIHRoaXMucHJvcGVydHlWYWx1ZUVxdWFscyhEUklWRVJfS0VZLCBEUklWRVJfVEVTVF9WQUxVRV8yKSk7Ci0JCQotCQkvLyBWZXJpZnkgbGVnYWN5IGVudHJ5IGhhcyBiZWVuIGRlbGV0ZWQKLQkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KExFR0FDWV9EUklWRVJfS0VZLCAgIkxlZ2FjeSBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gZGVsZXRlZCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0aWVzTmFtZXNNaWdyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gY29ubmVjdGlvbi5pbml0aWFsaXplUHJvcGVydGllcygpIG9jY3VycmVkIGJlZm9yZSB0ZXN0LnB1UG9wdWxhdGUoKSB0aGVyZWZvcmUKLQkJLy8gd2UgY2Fubm90IHRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgYXJlIGxlZ2FjeSBwcm9wZXJ0aWVzIG9ubHkgZXhpc3QgaW4gdGhlIHhtbAotCQkvLyBWZXJpZnkgdGhhdCBVc2VyICYgUGFzc3dvcmQgZXhpc3QgaW4gYm90aCBmb3JtcwotCQl0aGlzLnZlcmlmeVB1SGFzUHJvcGVydHkoVVNFUl9LRVksICAiUHJvcGVydHkgbm90IGV4aXN0cyIpOwotCQl0aGlzLnZlcmlmeVB1SGFzUHJvcGVydHkoUEFTU1dPUkRfS0VZLCAgIlByb3BlcnR5IG5vdCBleGlzdHMiKTsKLQkJdGhpcy52ZXJpZnlQdUhhc1Byb3BlcnR5KExFR0FDWV9VU0VSX0tFWSwgICJMZWdhY3kgcHJvcGVydHkgbm90IGV4aXN0cyIpOwotCQl0aGlzLnZlcmlmeVB1SGFzUHJvcGVydHkoTEVHQUNZX1BBU1NXT1JEX0tFWSwgICJMZWdhY3kgcHJvcGVydHkgbm90IGV4aXN0cyIpOwotCQkKLQkJLy8gQ2hhbmdlIGEgcHJvcGVydHkgdmFsdWUgdG8gdHJpZ2dlciBtaWdyYXRpb24gcm91dGluZQotCQl0aGlzLmNvbm5lY3Rpb24uc2V0TmF0aXZlU3FsKE5BVElWRV9TUUxfVEVTVF9WQUxVRSk7Ci0JCQotCQkvLyBWZXJpZnkgdGhhdCBhbGwgbGVnYWN5IGVudHJ5IGhhcyBiZWVuIGRlbGV0ZWQKLQkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KExFR0FDWV9EUklWRVJfS0VZLCAgIkxlZ2FjeSBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gZGVsZXRlZCIpOwotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoTEVHQUNZX1VSTF9LRVksICAiTGVnYWN5IHByb3BlcnR5IGhhcyBub3QgYmVlbiBkZWxldGVkIik7Ci0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShMRUdBQ1lfVVNFUl9LRVksICAiTGVnYWN5IHByb3BlcnR5IGhhcyBub3QgYmVlbiBkZWxldGVkIik7Ci0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShMRUdBQ1lfUEFTU1dPUkRfS0VZLCAgIkxlZ2FjeSBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gZGVsZXRlZCIpOwotCX0KLQotCQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wTG9nZ2luZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfMExvZ2dpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGE1OWRkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wTG9nZ2luZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Mb2dnaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkxvZ2dpbmdMZXZlbDsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmsyXzBMb2dnaW5nVGVzdHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBMb2dnaW5nVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBMb2dnaW5nMl8wIGxvZ2dpbmc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUUxfTE9HR0lOR19LRVkgPSBMb2dnaW5nMl8wLkVDTElQU0VMSU5LX1NRTF9DQVRFR09SWV9MT0dHSU5HX0xFVkVMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIFNRTF9MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwub2ZmOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIFNRTF9MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5zZXZlcmU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0FDVElPTl9MT0dHSU5HX0tFWSA9IExvZ2dpbmcyXzAuRUNMSVBTRUxJTktfVFJBTlNBQ1RJT05fQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBUUkFOU0FDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwud2FybmluZzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBUUkFOU0FDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5pbmZvOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfTE9HR0lOR19LRVkgPSBMb2dnaW5nMl8wLkVDTElQU0VMSU5LX0VWRU5UX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgRVZFTlRfTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLmNvbmZpZzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBFVkVOVF9MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5maW5lOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9MT0dHSU5HX0tFWSA9IExvZ2dpbmcyXzAuRUNMSVBTRUxJTktfQ09OTkVDVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIENPTk5FQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLmZpbmVyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIENPTk5FQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwuZmluZXN0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfTE9HR0lOR19LRVkgPSBMb2dnaW5nMl8wLkVDTElQU0VMSU5LX1FVRVJZX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgUVVFUllfTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLmFsbDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBRVUVSWV9MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5vZmY7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9MT0dHSU5HX0tFWSA9IExvZ2dpbmcyXzAuRUNMSVBTRUxJTktfQ0FDSEVfQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBDQUNIRV9MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwuc2V2ZXJlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIENBQ0hFX0xPR0dJTkdfVEVTVF9WQUxVRV8yID0gTG9nZ2luZ0xldmVsLndhcm5pbmc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QQUdBVElPTl9MT0dHSU5HX0tFWSA9IExvZ2dpbmcyXzAuRUNMSVBTRUxJTktfUFJPUEFHQVRJT05fQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBQUk9QQUdBVElPTl9MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwuaW5mbzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBQUk9QQUdBVElPTl9MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5jb25maWc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVFVRU5DSU5HX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19TRVFVRU5DSU5HX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgU0VRVUVOQ0lOR19MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwuZmluZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBTRVFVRU5DSU5HX0xPR0dJTkdfVEVTVF9WQUxVRV8yID0gTG9nZ2luZ0xldmVsLmZpbmVyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19FSkJfQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBFSkJfTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLmZpbmVzdDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBFSkJfTE9HR0lOR19URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwuYWxsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE1TX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19ETVNfQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBETVNfTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLm9mZjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBETVNfTE9HR0lOR19URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwuc2V2ZXJlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX09SX01FVEFEQVRBX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19FSkJfT1JfTUVUQURBVEFfQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBFSkJfT1JfTUVUQURBVEFfTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLndhcm5pbmc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgRUpCX09SX01FVEFEQVRBX0xPR0dJTkdfVEVTVF9WQUxVRV8yID0gTG9nZ2luZ0xldmVsLmluZm87Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBTU9ERUxfTE9HR0lOR19LRVkgPSBMb2dnaW5nMl8wLkVDTElQU0VMSU5LX01FVEFNT0RFTF9DQVRFR09SWV9MT0dHSU5HX0xFVkVMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIE1FVEFNT0RFTF9MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwuY29uZmlnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIE1FVEFNT0RFTF9MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5maW5lOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBVkVSX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19XRUFWRVJfQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBXRUFWRVJfTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLmZpbmVyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIFdFQVZFUl9MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5maW5lc3Q7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19QUk9QRVJUSUVTX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgUFJPUEVSVElFU19MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwuYWxsOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIFBST1BFUlRJRVNfTE9HR0lOR19URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwub2ZmOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19TRVJWRVJfQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBTRVJWRVJfTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLnNldmVyZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBTRVJWRVJfTE9HR0lOR19URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwud2FybmluZzsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBMb2dnaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5sb2dnaW5nID0gKExvZ2dpbmcyXzApIHRoaXMuc3ViamVjdC5nZXRMb2dnaW5nKCk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0KLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5TUUxfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcyXzAuVFJBTlNBQ1RJT05fQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcyXzAuRVZFTlRfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcyXzAuQ09OTkVDVElPTl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5RVUVSWV9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5DQUNIRV9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5QUk9QQUdBVElPTl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5TRVFVRU5DSU5HX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nMl8wLkVKQl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5ETVNfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcyXzAuRUpCX09SX01FVEFEQVRBX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nMl8wLk1FVEFNT0RFTF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5XRUFWRVJfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcyXzAuUFJPUEVSVElFU19DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5TRVJWRVJfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gMTU7IC8vIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzCi0JCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyAxOyAvLyAxIG1pc2MgcHJvcGVydGllcwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCS8vIEluaXRpYWxpemVzIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMSIsICJ2YWx1ZS4xIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoU1FMX0xPR0dJTkdfS0VZLCBTUUxfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShUUkFOU0FDVElPTl9MT0dHSU5HX0tFWSwgVFJBTlNBQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShFVkVOVF9MT0dHSU5HX0tFWSwgRVZFTlRfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShDT05ORUNUSU9OX0xPR0dJTkdfS0VZLCBDT05ORUNUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoUVVFUllfTE9HR0lOR19LRVksIFFVRVJZX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoQ0FDSEVfTE9HR0lOR19LRVksIENBQ0hFX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoUFJPUEFHQVRJT05fTE9HR0lOR19LRVksIFBST1BBR0FUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoU0VRVUVOQ0lOR19MT0dHSU5HX0tFWSwgU0VRVUVOQ0lOR19MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KEVKQl9MT0dHSU5HX0tFWSwgRUpCX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoRE1TX0xPR0dJTkdfS0VZLCBETVNfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShFSkJfT1JfTUVUQURBVEFfTE9HR0lOR19LRVksIEVKQl9PUl9NRVRBREFUQV9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KE1FVEFNT0RFTF9MT0dHSU5HX0tFWSwgTUVUQU1PREVMX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoV0VBVkVSX0xPR0dJTkdfS0VZLCBXRUFWRVJfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShQUk9QRVJUSUVTX0xPR0dJTkdfS0VZLCBQUk9QRVJUSUVTX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoU0VSVkVSX0xPR0dJTkdfS0VZLCBTRVJWRVJfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5sb2dnaW5nOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmxvZ2dpbmcuZ2V0TGV2ZWwocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXRoaXMubG9nZ2luZy5zZXRMZXZlbChwcm9wZXJ0eU5hbWUsIChMb2dnaW5nTGV2ZWwpIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBTcWwgTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcWxMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJU1FMX0xPR0dJTkdfS0VZLAotCQkJU1FMX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlTUUxfTE9HR0lOR19LRVksCi0JCQlTUUxfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJU1FMX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlU3FsTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlTUUxfTE9HR0lOR19LRVksCi0JCQlTUUxfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJU1FMX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBUcmFuc2FjdGlvbiBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFRyYW5zYWN0aW9uTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVRSQU5TQUNUSU9OX0xPR0dJTkdfS0VZLAotCQkJVFJBTlNBQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVRSQU5TQUNUSU9OX0xPR0dJTkdfS0VZLAotCQkJVFJBTlNBQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJVFJBTlNBQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVUcmFuc2FjdGlvbkxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJVFJBTlNBQ1RJT05fTE9HR0lOR19LRVksCi0JCQlUUkFOU0FDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlUUkFOU0FDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogRXZlbnQgTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRFdmVudExvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlFVkVOVF9MT0dHSU5HX0tFWSwKLQkJCUVWRU5UX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlFVkVOVF9MT0dHSU5HX0tFWSwKLQkJCUVWRU5UX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCUVWRU5UX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlRXZlbnRMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUVWRU5UX0xPR0dJTkdfS0VZLAotCQkJRVZFTlRfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJRVZFTlRfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIENvbm5lY3Rpb24gTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb25uZWN0aW9uTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUNPTk5FQ1RJT05fTE9HR0lOR19LRVksCi0JCQlDT05ORUNUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlDT05ORUNUSU9OX0xPR0dJTkdfS0VZLAotCQkJQ09OTkVDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlDT05ORUNUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQ29ubmVjdGlvbkxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJQ09OTkVDVElPTl9MT0dHSU5HX0tFWSwKLQkJCUNPTk5FQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJQ09OTkVDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogUXVlcnkgTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRRdWVyeUxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlRVUVSWV9MT0dHSU5HX0tFWSwKLQkJCVFVRVJZX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlRVUVSWV9MT0dHSU5HX0tFWSwKLQkJCVFVRVJZX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCVFVRVJZX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUXVlcnlMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVFVRVJZX0xPR0dJTkdfS0VZLAotCQkJUVVFUllfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJUVVFUllfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIENhY2hlIExldmVsIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FjaGVMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQ0FDSEVfTE9HR0lOR19LRVksCi0JCQlDQUNIRV9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJQ0FDSEVfTE9HR0lOR19LRVksCi0JCQlDQUNIRV9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUNhY2hlTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlDQUNIRV9MT0dHSU5HX0tFWSwKLQkJCUNBQ0hFX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBQcm9wYWdhdGlvbiBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFByb3BhZ2F0aW9uTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVBST1BBR0FUSU9OX0xPR0dJTkdfS0VZLAotCQkJUFJPUEFHQVRJT05fTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVBST1BBR0FUSU9OX0xPR0dJTkdfS0VZLAotCQkJUFJPUEFHQVRJT05fTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJUFJPUEFHQVRJT05fTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVQcm9wYWdhdGlvbkxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJUFJPUEFHQVRJT05fTE9HR0lOR19LRVksCi0JCQlQUk9QQUdBVElPTl9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlQUk9QQUdBVElPTl9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogU2VxdWVuY2luZyBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFNlcXVlbmNpbmdMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJU0VRVUVOQ0lOR19MT0dHSU5HX0tFWSwKLQkJCVNFUVVFTkNJTkdfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVNFUVVFTkNJTkdfTE9HR0lOR19LRVksCi0JCQlTRVFVRU5DSU5HX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCVNFUVVFTkNJTkdfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVTZXF1ZW5jaW5nTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlTRVFVRU5DSU5HX0xPR0dJTkdfS0VZLAotCQkJU0VRVUVOQ0lOR19MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlTRVFVRU5DSU5HX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBFSkIgTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRFSkJMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJRUpCX0xPR0dJTkdfS0VZLAotCQkJRUpCX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlFSkJfTE9HR0lOR19LRVksCi0JCQlFSkJfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJRUpCX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlRUpCTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlFSkJfTE9HR0lOR19LRVksCi0JCQlFSkJfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJRUpCX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBETVMgTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRETVNMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJRE1TX0xPR0dJTkdfS0VZLAotCQkJRE1TX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlETVNfTE9HR0lOR19LRVksCi0JCQlETVNfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJRE1TX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlRE1TTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlETVNfTE9HR0lOR19LRVksCi0JCQlETVNfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJRE1TX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBFSkIgb3IgTWV0YWRhdGEgTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRFSkJPck1ldGFkYXRhTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUVKQl9PUl9NRVRBREFUQV9MT0dHSU5HX0tFWSwKLQkJCUVKQl9PUl9NRVRBREFUQV9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJRUpCX09SX01FVEFEQVRBX0xPR0dJTkdfS0VZLAotCQkJRUpCX09SX01FVEFEQVRBX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCUVKQl9PUl9NRVRBREFUQV9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUVKQk9yTWV0YWRhdGFMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUVKQl9PUl9NRVRBREFUQV9MT0dHSU5HX0tFWSwKLQkJCUVKQl9PUl9NRVRBREFUQV9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlFSkJfT1JfTUVUQURBVEFfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIE1ldGFtb2RlbCBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldE1ldGFtb2RlbExvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlNRVRBTU9ERUxfTE9HR0lOR19LRVksCi0JCQlNRVRBTU9ERUxfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCU1FVEFNT0RFTF9MT0dHSU5HX0tFWSwKLQkJCU1FVEFNT0RFTF9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlNRVRBTU9ERUxfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVNZXRhbW9kZWxMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCU1FVEFNT0RFTF9MT0dHSU5HX0tFWSwKLQkJCU1FVEFNT0RFTF9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlNRVRBTU9ERUxfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIFdlYXZlciBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFdlYXZlckxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlXRUFWRVJfTE9HR0lOR19LRVksCi0JCQlXRUFWRVJfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVdFQVZFUl9MT0dHSU5HX0tFWSwKLQkJCVdFQVZFUl9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlXRUFWRVJfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVXZWF2ZXJMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVdFQVZFUl9MT0dHSU5HX0tFWSwKLQkJCVdFQVZFUl9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlXRUFWRVJfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIFByb3BlcnRpZXMgTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRQcm9wZXJ0aWVzTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVBST1BFUlRJRVNfTE9HR0lOR19LRVksCi0JCQlQUk9QRVJUSUVTX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlQUk9QRVJUSUVTX0xPR0dJTkdfS0VZLAotCQkJUFJPUEVSVElFU19MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlQUk9QRVJUSUVTX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUHJvcGVydGllc0xvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJUFJPUEVSVElFU19MT0dHSU5HX0tFWSwKLQkJCVBST1BFUlRJRVNfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJUFJPUEVSVElFU19MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogU2VydmVyIExldmVsIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2VydmVyTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNFUlZFUl9MT0dHSU5HX0tFWSwKLQkJCVNFUlZFUl9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJU0VSVkVSX0xPR0dJTkdfS0VZLAotCQkJU0VSVkVSX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCVNFUlZFUl9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNlcnZlckxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJU0VSVkVSX0xPR0dJTkdfS0VZLAotCQkJU0VSVkVSX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCVNFUlZFUl9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wT3B0aW9uc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfME9wdGlvbnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzcyNGFlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wT3B0aW9uc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk9wdGlvbnMyXzA7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rT3B0aW9uczJfMFRlc3RzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wT3B0aW9uc1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotewotCXByaXZhdGUgT3B0aW9uczJfMCBvcHRpb25zOwotCXByaXZhdGUgTGlzdENoYW5nZUV2ZW50IHByZVBlcnNpc3RFdmVudDsKLQlwcml2YXRlIExpc3RDaGFuZ2VFdmVudCBwcmVVcGRhdGVFdmVudDsKLQlwcml2YXRlIExpc3RDaGFuZ2VFdmVudCBwcmVSZW1vdmVFdmVudDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0tfVElNRU9VVF9LRVkgPSBPcHRpb25zMl8wLlBFUlNJU1RFTkNFX0xPQ0tfVElNRU9VVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgTE9DS19USU1FT1VUX1RFU1RfVkFMVUUgPSAxMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIExPQ0tfVElNRU9VVF9URVNUX1ZBTFVFXzIgPSAyMDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9USU1FT1VUX0tFWSA9IE9wdGlvbnMyXzAuUEVSU0lTVEVOQ0VfUVVFUllfVElNRU9VVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFID0gMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUVfMiA9IDIwMDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0tFWSA9IE9wdGlvbnMyXzAuUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUUgPSAidGVzdF9wcmUtcGVyc2lzdF9ncm91cCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFXzIgPSAidGVzdF8yX3ByZS1wZXJzaXN0X2dyb3VwIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfS0VZID0gT3B0aW9uczJfMC5QRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUUgPSAidGVzdF9wcmUtdXBkYXRlX2dyb3VwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRV8yID0gInRlc3RfMl9wcmUtdXBkYXRlX2dyb3VwIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfS0VZID0gT3B0aW9uczJfMC5QRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUUgPSAidGVzdF9wcmUtcmVtb3ZlX2dyb3VwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRV8yID0gInRlc3RfMl9wcmUtcmVtb3ZlX2dyb3VwIjsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBPcHRpb25zVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vcHRpb25zID0gKE9wdGlvbnMyXzApIHRoaXMuc3ViamVjdC5nZXRPcHRpb25zKCk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0KLQkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9uczJfMC5MT0NLX1RJTUVPVVRfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPcHRpb25zMl8wLlFVRVJZX1RJTUVPVVRfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgdmFsaWRhdGlvbkdyb3VwTGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFZhbGlkYXRpb25Hcm91cExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLm9wdGlvbnMuYWRkTGlzdENoYW5nZUxpc3RlbmVyKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9MSVNULCB2YWxpZGF0aW9uR3JvdXBMaXN0Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLm9wdGlvbnMuYWRkTGlzdENoYW5nZUxpc3RlbmVyKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0xJU1QsIHZhbGlkYXRpb25Hcm91cExpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfTElTVCwgdmFsaWRhdGlvbkdyb3VwTGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDU7IC8vIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzCi0JCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyAxOyAvLyAxIG1pc2MgcHJvcGVydGllcwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCS8vIEluaXRpYWxpemVzIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTE9DS19USU1FT1VUX0tFWSwgTE9DS19USU1FT1VUX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoUVVFUllfVElNRU9VVF9LRVksIFFVRVJZX1RJTUVPVVRfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4zIiwgInZhbHVlLjMiKTsKLQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfS0VZLCBWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9LRVksIFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfS0VZLCBWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbnM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuTE9DS19USU1FT1VUX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLm9wdGlvbnMuZ2V0TG9ja1RpbWVvdXQoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlFVRVJZX1RJTUVPVVRfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMub3B0aW9ucy5nZXRRdWVyeVRpbWVvdXQoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFkpKSB7Ci0JCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMub3B0aW9ucy5nZXRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cygpLml0ZXJhdG9yKCk7Ci0JCQltb2RlbFZhbHVlID0gdGhpcy5nZXRGaXJzdEVsZW1lbnQoaXRlcmF0b3IpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFkpKSB7Ci0JCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMub3B0aW9ucy5nZXRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzKCkuaXRlcmF0b3IoKTsKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmdldEZpcnN0RWxlbWVudChpdGVyYXRvcik7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSkpIHsKLQkJCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5vcHRpb25zLmdldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMoKS5pdGVyYXRvcigpOwotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuZ2V0Rmlyc3RFbGVtZW50KGl0ZXJhdG9yKTsKLQkJfQotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImdldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIG1vZGVsVmFsdWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuTE9DS19USU1FT1VUX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5zZXRMb2NrVGltZW91dCgoSW50ZWdlcikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuUVVFUllfVElNRU9VVF9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMuc2V0UXVlcnlUaW1lb3V0KChJbnRlZ2VyKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5hZGRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMuYWRkVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMuYWRkVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogTG9ja1RpbWVvdXQgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRMb2NrVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlMT0NLX1RJTUVPVVRfS0VZLAotCQkJTE9DS19USU1FT1VUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJTE9DS19USU1FT1VUX0tFWSwKLQkJCUxPQ0tfVElNRU9VVF9URVNUX1ZBTFVFLAotCQkJTE9DS19USU1FT1VUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUxvY2tUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlMT0NLX1RJTUVPVVRfS0VZLAotCQkJTE9DS19USU1FT1VUX1RFU1RfVkFMVUUsCi0JCQlMT0NLX1RJTUVPVVRfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBRdWVyeVRpbWVvdXQgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRRdWVyeVRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJUVVFUllfVElNRU9VVF9LRVksCi0JCQlRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJUVVFUllfVElNRU9VVF9LRVksCi0JCQlRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUUsCi0JCQlRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVF1ZXJ5VGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJUVVFUllfVElNRU9VVF9LRVksCi0JCQlRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUUsCi0JCQlRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0IHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0VmFsaWRhdGlvbkdyb3VwUHJvcGVydHkoCi0JCQlPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVZhbGlkYXRpb25Hcm91cFByb3BlcnR5KAotCQkJT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RDb21wb3NpdGVWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZENvbXBvc2l0ZVZhbHVlKAotCQkJT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RDb21wb3NpdGVWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVJlbW92ZUNvbXBvc2l0ZVZhbHVlKAotCQkJT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRWYWxpZGF0aW9uR3JvdXBQcm9wZXJ0eSgKLQkJCU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVZhbGlkYXRpb25Hcm91cFByb3BlcnR5KAotCQkJT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlQ29tcG9zaXRlVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRDb21wb3NpdGVWYWx1ZSgKLQkJCU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZUNvbXBvc2l0ZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQ29tcG9zaXRlVmFsdWUoCi0JCQlPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0VmFsaWRhdGlvbkdyb3VwUHJvcGVydHkoCi0JCQlPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcm9wZXJ0eSgKLQkJCU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZUNvbXBvc2l0ZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkQ29tcG9zaXRlVmFsdWUoCi0JCQlPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVDb21wb3NpdGVWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVJlbW92ZUNvbXBvc2l0ZVZhbHVlKAotCQkJT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cHMgbGlzdCAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFZhbGlkYXRpb25Hcm91cHNMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TGlzdEV2ZW50cygKLQkJCU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRV8yLAotCQkJT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0xJU1QpOwotCQkKLQkJdGhpcy52ZXJpZnlMaXN0RXZlbnRzKAotCQkJT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRV8yLAotCQkJT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfTElTVCk7Ci0JCQotCQl0aGlzLnZlcmlmeUxpc3RFdmVudHMoCi0JCQlPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFXzIsCi0JCQlPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9MSVNUKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNsZWFyRXZlbnQoKSB7Ci0JCXN1cGVyLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5wcmVQZXJzaXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLnByZVVwZGF0ZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcmVSZW1vdmVFdmVudCA9IG51bGw7Ci0JfQotCi0JLy8gKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKgotCi0JLy8gKioqKioqKioqKiB2ZXJpZnkgVmFsaWRhdGlvbkdyb3VwIHByb3BlcnR5ICoqKioqKioqKioKLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTZXRWYWxpZGF0aW9uR3JvdXBQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBSZXBsYWNlCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCB0ZXN0VmFsdWUyLCB0cnVlKTsgCi0JCXRoaXMucHJvcGVydGllc1RvdGFsKys7Ci0JCXRoaXMudmVyaWZ5UHV0VmFsaWRhdGlvbkdyb3VwUHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUxKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlBZGRSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMudmFsaWRhdGlvbkdyb3VwVmFsdWVFeGlzdHMocHJvcGVydHlOYW1lLCAoU3RyaW5nKXRlc3RWYWx1ZTEpKTsKLQkJLy8gUmVtb3ZlCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQktLXRoaXMucHJvcGVydGllc1RvdGFsOwotCQktLXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZTsKLQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5yZW1vdmVQcm9wZXJ0eShrZXksIChTdHJpbmcpdGVzdFZhbHVlMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudmFsaWRhdGlvbkdyb3VwVmFsdWVFeGlzdHMocHJvcGVydHlOYW1lLCAoU3RyaW5nKXRlc3RWYWx1ZTEpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSwgdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgLSAxKTsKLQkJCi0JCS8vIEFkZCBvcmlnaW5hbCBQcm9wZXJ0eQotCQkrK3RoaXMucHJvcGVydGllc1RvdGFsOwotCQkrK3RoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShrZXksIHRlc3RWYWx1ZTEsIHRydWUpOyAKLQkJdGhpcy52ZXJpZnlQdXRWYWxpZGF0aW9uR3JvdXBQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTEpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUFkZENvbXBvc2l0ZVZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBrZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzdHJpbmdUZXN0VmFsdWUxID0gKFN0cmluZyl0ZXN0VmFsdWUxOwotCQlTdHJpbmcgc3RyaW5nVGVzdFZhbHVlMiA9IChTdHJpbmcpdGVzdFZhbHVlMjsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnZhbGlkYXRpb25Hcm91cFZhbHVlRXhpc3RzKHByb3BlcnR5TmFtZSwgc3RyaW5nVGVzdFZhbHVlMSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5nZXRWYWxpZGF0aW9uR3JvdXBTaXplKHByb3BlcnR5TmFtZSksIDEpOwotCQl0aGlzLmFkZFZhbGlkYXRpb25Hcm91cFZhbHVlKHByb3BlcnR5TmFtZSwgc3RyaW5nVGVzdFZhbHVlMik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmdldFZhbGlkYXRpb25Hcm91cFNpemUocHJvcGVydHlOYW1lKSwgMik7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnZhbGlkYXRpb25Hcm91cFZhbHVlRXhpc3RzKHByb3BlcnR5TmFtZSwgc3RyaW5nVGVzdFZhbHVlMSkpOwotCQlhc3NlcnRUcnVlKHRoaXMudmFsaWRhdGlvbkdyb3VwVmFsdWVFeGlzdHMocHJvcGVydHlOYW1lLCBzdHJpbmdUZXN0VmFsdWUyKSk7Ci0KLQkJU3RyaW5nIHByb3BlcnR5VmFsdWUgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGtleSkuZ2V0VmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShwcm9wZXJ0eVZhbHVlLmluZGV4T2Yoc3RyaW5nVGVzdFZhbHVlMSkgIT0gLTEpOwotCQlhc3NlcnRUcnVlKHByb3BlcnR5VmFsdWUuaW5kZXhPZihzdHJpbmdUZXN0VmFsdWUyKSAhPSAtMSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UmVtb3ZlQ29tcG9zaXRlVmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGtleSwgT2JqZWN0IHRlc3RWYWx1ZTEsIE9iamVjdCB0ZXN0VmFsdWUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHN0cmluZ1Rlc3RWYWx1ZTEgPSAoU3RyaW5nKXRlc3RWYWx1ZTE7Ci0JCVN0cmluZyBzdHJpbmdUZXN0VmFsdWUyID0gKFN0cmluZyl0ZXN0VmFsdWUyOwotCQlhc3NlcnRUcnVlKHRoaXMudmFsaWRhdGlvbkdyb3VwVmFsdWVFeGlzdHMocHJvcGVydHlOYW1lLCBzdHJpbmdUZXN0VmFsdWUxKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmdldFZhbGlkYXRpb25Hcm91cFNpemUocHJvcGVydHlOYW1lKSwgMSk7Ci0JCXRoaXMuYWRkVmFsaWRhdGlvbkdyb3VwVmFsdWUocHJvcGVydHlOYW1lLCBzdHJpbmdUZXN0VmFsdWUyKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZ2V0VmFsaWRhdGlvbkdyb3VwU2l6ZShwcm9wZXJ0eU5hbWUpLCAyKTsKLQotCQl0aGlzLnJlbW92ZVZhbGlkYXRpb25Hcm91cFZhbHVlKHByb3BlcnR5TmFtZSwgc3RyaW5nVGVzdFZhbHVlMik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmdldFZhbGlkYXRpb25Hcm91cFNpemUocHJvcGVydHlOYW1lKSwgMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudmFsaWRhdGlvbkdyb3VwVmFsdWVFeGlzdHMocHJvcGVydHlOYW1lLCBzdHJpbmdUZXN0VmFsdWUyKSk7Ci0JCVN0cmluZyBwcm9wZXJ0eVZhbHVlID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShrZXkpLmdldFZhbHVlKCk7Ci0JCWFzc2VydFRydWUocHJvcGVydHlWYWx1ZS5pbmRleE9mKHN0cmluZ1Rlc3RWYWx1ZTEpICE9IC0xKTsKLQkJYXNzZXJ0VHJ1ZShwcm9wZXJ0eVZhbHVlLmluZGV4T2Yoc3RyaW5nVGVzdFZhbHVlMikgPT0gLTEpOwotCQkKLQkJdGhpcy5yZW1vdmVWYWxpZGF0aW9uR3JvdXBWYWx1ZShwcm9wZXJ0eU5hbWUsIHN0cmluZ1Rlc3RWYWx1ZTIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5nZXRWYWxpZGF0aW9uR3JvdXBTaXplKHByb3BlcnR5TmFtZSksIDEpOwotCQkKLQkJdGhpcy5yZW1vdmVWYWxpZGF0aW9uR3JvdXBWYWx1ZShwcm9wZXJ0eU5hbWUsIHN0cmluZ1Rlc3RWYWx1ZTEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5nZXRWYWxpZGF0aW9uR3JvdXBTaXplKHByb3BlcnR5TmFtZSksIDApOwotCQlhc3NlcnRGYWxzZSh0aGlzLnZhbGlkYXRpb25Hcm91cFZhbHVlRXhpc3RzKHByb3BlcnR5TmFtZSwgc3RyaW5nVGVzdFZhbHVlMSkpOwotCQkKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGtleSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUxpc3RFdmVudHMoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHRlc3RWYWx1ZSwgU3RyaW5nIGxpc3ROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gYWRkCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLmFkZFZhbGlkYXRpb25Hcm91cFZhbHVlKHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlKTsKLQkJCi0JCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAotCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLmdldEV2ZW50Rm9yKHByb3BlcnR5TmFtZSkpOwotCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMuZ2V0RXZlbnRGb3IocHJvcGVydHlOYW1lKS5nZXRMaXN0TmFtZSgpLCBsaXN0TmFtZSk7Ci0KLQkJLy8gcmVtb3ZlCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQkKLQkJdGhpcy5yZW1vdmVWYWxpZGF0aW9uR3JvdXBWYWx1ZShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZSk7Ci0JCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAotCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLmdldEV2ZW50Rm9yKHByb3BlcnR5TmFtZSkpOwotCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMuZ2V0RXZlbnRGb3IocHJvcGVydHlOYW1lKS5nZXRMaXN0TmFtZSgpLCBsaXN0TmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVB1dFZhbGlkYXRpb25Hcm91cFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gdmVyaWZ5IGV2ZW50IHJlY2VpdmVkCi0JCWFzc2VydE5vdE51bGwoIk5vIEV2ZW50IEZpcmVkLiIsIHRoaXMuZ2V0RXZlbnRGb3IocHJvcGVydHlOYW1lKSk7Ci0JCS8vIHZlcmlmeSBldmVudCB2YWx1ZQotCQlhc3NlcnRUcnVlKHRoaXMudmFsaWRhdGlvbkdyb3VwVmFsdWVFeGlzdHMocHJvcGVydHlOYW1lLCAoU3RyaW5nKSBleHBlY3RlZFZhbHVlKSk7Ci0JCSByZXR1cm47Ci0JfQotCQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kICoqKioqKioqKioKLQotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsaWRhdGlvbkdyb3VwTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGluazJfME9wdGlvbnNUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rMl8wT3B0aW9uc1Rlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGluazJfME9wdGlvbnNUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQkJRWNsaXBzZUxpbmsyXzBPcHRpb25zVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQkJRWNsaXBzZUxpbmsyXzBPcHRpb25zVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCQotCQkJCUVjbGlwc2VMaW5rMl8wT3B0aW9uc1Rlc3RzLnRoaXMudmFsaWRhdGlvbkdyb3VwQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGlvbkdyb3VwQ2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQlTdHJpbmcgbGlzdE5hbWUgPSBlLmdldExpc3ROYW1lKCk7Ci0JCQotCQlpZiAobGlzdE5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9MSVNUKSkKLQkJCXRoaXMucHJlUGVyc2lzdEV2ZW50ID0gZTsKLQkJZWxzZSBpZiAobGlzdE5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0xJU1QpKQotCQkJdGhpcy5wcmVVcGRhdGVFdmVudCA9IGU7Ci0JCWVsc2UgaWYgKGxpc3ROYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9MSVNUKSkKLQkJCXRoaXMucHJlUmVtb3ZlRXZlbnQgPSBlOwotCQllbHNlCi0JCQl0aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFZhbGlkYXRpb25Hcm91cFZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLmFkZFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QocHJvcGVydHlWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLmFkZFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZShwcm9wZXJ0eVZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMuYWRkVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKHByb3BlcnR5VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImFkZFZhbGlkYXRpb25Hcm91cFZhbHVlIiwgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlVmFsaWRhdGlvbkdyb3VwVmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHByb3BlcnR5VmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMucmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdChwcm9wZXJ0eVZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMucmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKHByb3BlcnR5VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5yZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUocHJvcGVydHlWYWx1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigicmVtb3ZlVmFsaWRhdGlvbkdyb3VwVmFsdWUiLCBwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0aW9uR3JvdXBWYWx1ZUV4aXN0cyhTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZKSkKLQkJCXJlc3VsdCA9IHRoaXMub3B0aW9ucy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0RXhpc3RzKHByb3BlcnR5VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZKSkKLQkJCXJlc3VsdCA9IHRoaXMub3B0aW9ucy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVFeGlzdHMocHJvcGVydHlWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFkpKQotCQkJcmVzdWx0ID0gdGhpcy5vcHRpb25zLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZUV4aXN0cyhwcm9wZXJ0eVZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJ2ZXJpZnlWYWxpZGF0aW9uR3JvdXBWYWx1ZUV4aXN0cyIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0VmFsaWRhdGlvbkdyb3VwU2l6ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZKSkKLQkJCXJlc3VsdCA9ICB0aGlzLm9wdGlvbnMuZ2V0VmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHNTaXplKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFkpKQotCQkJcmVzdWx0ID0gIHRoaXMub3B0aW9ucy5nZXRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzU2l6ZSgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZKSkKLQkJCXJlc3VsdCA9ICB0aGlzLm9wdGlvbnMuZ2V0VmFsaWRhdGlvbkdyb3VwUHJlUmVtb3Zlc1NpemUoKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJ2ZXJpZnlWYWxpZGF0aW9uR3JvdXBTaXplIiwgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlRXZlbnQgZ2V0RXZlbnRGb3IoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJTGlzdENoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZKSkKLQkJCWV2ZW50ID0gdGhpcy5wcmVQZXJzaXN0RXZlbnQ7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFkpKQotCQkJZXZlbnQgPSB0aGlzLnByZVVwZGF0ZUV2ZW50OwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZKSkKLQkJCWV2ZW50ID0gdGhpcy5wcmVSZW1vdmVFdmVudDsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRFdmVudEZvciIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBldmVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VVbml0VGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VVbml0VGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhNjQ3OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucGxhdGZvcm0uRWNsaXBzZUxpbmtQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VVbml0VGVzdENhc2UgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotewotCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBzdWJqZWN0OwotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcjsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnN1YmplY3QgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQl0aGlzLnN1YmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0Pih0aGlzLnN1YmplY3QpOwotCQl0aGlzLnBvcHVsYXRlUHUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBzdXBlci5idWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgSnBhRmFjZXQuVkVSU0lPTl8yXzAuZ2V0VmVyc2lvblN0cmluZygpKTsJCi0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuUExBVEZPUk0sIEVjbGlwc2VMaW5rUGxhdGZvcm0uVkVSU0lPTl8yXzApOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIHN1cGVyLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8ySnBhTWV0YWRhdGFDb252ZXJzaW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8ySnBhTWV0YWRhdGFDb252ZXJzaW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVlY2Y1Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfMkpwYU1ldGFkYXRhQ29udmVyc2lvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuR2VuZXJpYzJfMEpwYU1ldGFkYXRhQ29udmVyc2lvblRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0aWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmsyXzJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzJKcGFNZXRhZGF0YUNvbnZlcnNpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8yQ29udGV4dE1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcjsKLQotCXB1YmxpYyBFY2xpcHNlTGluazJfMkpwYU1ldGFkYXRhQ29udmVyc2lvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMucHJvZ3Jlc3NNb25pdG9yID0gbmV3IElQcm9ncmVzc01vbml0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3b3JrZWQoaW50IHdvcmspIHt9Ci0JCQlwdWJsaWMgdm9pZCBzdWJUYXNrKFN0cmluZyBuYW1lKSB7fQotCQkJcHVibGljIHZvaWQgc2V0VGFza05hbWUoU3RyaW5nIG5hbWUpIHt9Ci0JCQlwdWJsaWMgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIHZhbHVlKSB7fQotCQkJcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHtyZXR1cm4gZmFsc2U7fQotCQkJcHVibGljIHZvaWQgaW50ZXJuYWxXb3JrZWQoZG91YmxlIHdvcmspIHt9Ci0JCQlwdWJsaWMgdm9pZCBkb25lKCkge30KLQkJCXB1YmxpYyB2b2lkIGJlZ2luVGFzayhTdHJpbmcgbmFtZSwgaW50IHRvdGFsV29yaykge30KLQkJfSA7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMucHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqIG1ldGFkYXRhIGNvbnZlcnNpb24gb2YgZXF1aXZhbGVudCBxdWVyaWVzIG9uIEVjbGlwc2VMaW5rIHBsYXRmb3JtKioqKioqKioqKioqKgotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aER1cGxpY2F0ZVF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLk5BTUVEX1FVRVJZLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE5hbWVkUXVlcnkobmFtZT1cIm5xdWVyeVwiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWROYXRpdmVRdWVyaWVzKHsiICsKLQkJCQkJCSJATmFtZWROYXRpdmVRdWVyeShuYW1lPVwibm5xMVwiLCBxdWVyeT1cImFiY2RcIiksICIgKwotCQkJCQkJIkBOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWU9XCJubnExXCIsIHF1ZXJ5PVwiYWJjZGVcIil9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRXF1aXZhbGVudFF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5OQU1FRF9OQVRJVkVfUVVFUklFUywgSlBBLk5BTUVEX05BVElWRV9RVUVSWSwgSlBBLlFVRVJZX0hJTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE5hbWVkTmF0aXZlUXVlcmllcyh7IiArCi0JCQkJCQkJIkBOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWU9XCJubnExXCIsIHF1ZXJ5PVwiYWJjZFwiLCByZXN1bHRDbGFzcz1mb28xLmNsYXNzLCByZXN1bHRTZXRNYXBwaW5nPVwiYmFyMVwiLCAiICsKLQkJCQkJCQkJCQkiaGludHM9e0BRdWVyeUhpbnQobmFtZT1cIm5ucTFoaW50MVwiLCB2YWx1ZSA9IFwiYWFhXCIpLCAiICsKLQkJCQkJCQkJCQkJCSJAUXVlcnlIaW50KG5hbWU9XCJubnExaGludDJcIiwgdmFsdWU9XCJiYmJcIil9KSwgIiArCi0JCQkJCQkJIkBOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWU9XCJubnExXCIsIHF1ZXJ5PVwiYWJjZFwiLCByZXN1bHRDbGFzcz1mb28xLmNsYXNzLCByZXN1bHRTZXRNYXBwaW5nPVwiYmFyMVwiLCAiICsKLQkJCQkJCQkJCQkiaGludHM9e0BRdWVyeUhpbnQobmFtZT1cIm5ucTFoaW50MVwiLCB2YWx1ZSA9IFwiYWFhXCIpLCAiICsKLQkJCQkJCQkJCQkJCSJAUXVlcnlIaW50KG5hbWU9XCJubnExaGludDJcIiwgdmFsdWU9XCJiYmJcIil9KX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydER1cGxpY2F0ZVF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEdXBsaWNhdGVRdWVyaWVzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCi0JCWFkZFhtbE1hcHBpbmdGaWxlUmVmKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlwZXJzaXN0ZW5jZVVuaXQuY29udmVydEphdmFRdWVyaWVzKGVudGl0eU1hcHBpbmdzLCBwcm9ncmVzc01vbml0b3IpOwotCQkKLQkJSmF2YUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCS8vIHRlc3QgZHVwbGljYXRlIEphdmEgcXVlcmllcyBhcmUgbm90IGNvbnZlcnRlZCB0byBlY2xpcHNlbGluay1vcm0ueG1sIGFuZCAKLQkJLy8gbm90IHJlbW92ZWQgZnJvbSB0aGUgSmF2YSBlbnRpdHksIGJ1dCB1bmlxdWUgcXVlcnkgaXMgCi0JCWFzc2VydEVxdWFscygwLCBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eU1hcHBpbmdzLmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eU1hcHBpbmdzLmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydEVxdWl2YWxlbnRRdWVyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRXF1aXZhbGVudFF1ZXJpZXMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQkKLQkJYWRkWG1sTWFwcGluZ0ZpbGVSZWYoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCXBlcnNpc3RlbmNlVW5pdC5jb252ZXJ0SmF2YVF1ZXJpZXMoZW50aXR5TWFwcGluZ3MsIHByb2dyZXNzTW9uaXRvcik7Ci0JCQotCQkvLyB0ZXN0IG9ubHkgb25lIG9mIHRoZSBlcXVpdmFsZW50IEphdmEgcXVlcmllcyBhcmUgY29udmVydGVkCi0JCS8vIHRvIGVjbGlwc2VsaW5rLW9ybS54bWwgYW5kIHRoZSByZXN0IGFyZSByZW1vdmVkIAotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eU1hcHBpbmdzLmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqIG1ldGFkYXRhIGNvbnZlcnNpb24gb2YgZXF1aXZhbGVudCBnZW5lcmF0b3JzIG9uIEVjbGlwc2VMaW5rIHBsYXRmb3JtKioqKioqKioqKioqKgotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aER1cGxpY2F0ZUdlbmVyYXRvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLlRBQkxFX0dFTkVSQVRPUiwgSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGVHZW5lcmF0b3IobmFtZT1cInRnZW5cIiwgaW5pdGlhbFZhbHVlPTEwMCkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFNlcXVlbmNlR2VuZXJhdG9yKG5hbWU9XCJzZ2VuXCIsIGluaXRpYWxWYWx1ZT0xMCkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGVHZW5lcmF0b3IobmFtZT1cInRnZW5cIiwgaW5pdGlhbFZhbHVlPTEwKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAU2VxdWVuY2VHZW5lcmF0b3IobmFtZT1cInNnZW5cIiwgaW5pdGlhbFZhbHVlPTEpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkJCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRXF1aXZhbGVudEdlbmVyYXRvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLlRBQkxFX0dFTkVSQVRPUiwgSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGVHZW5lcmF0b3IobmFtZT1cInRnZW5cIiwgdGFibGU9XCJJRF9HRU5cIiwgc2NoZW1hPVwiQVBQXCIsIGNhdGFsb2c9XCJGT09cIiwiICsKLQkJCQkJCSJwa0NvbHVtbk5hbWU9XCJHRU5fTkFNRVwiLCB2YWx1ZUNvbHVtbk5hbWU9XCJHRU5fVkFMVUVcIiwgcGtDb2x1bW5WYWx1ZT1cIlRHRU5cIiwiICsKLQkJCQkJCSJhbGxvY2F0aW9uU2l6ZT01MCwgaW5pdGlhbFZhbHVlPTEwMCkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFNlcXVlbmNlR2VuZXJhdG9yKG5hbWU9XCJzZ2VuXCIsIHNlcXVlbmNlTmFtZT1cIkZvb19TZXFcIiwgc2NoZW1hPVwiU1lTXCIsIGNhdGFsb2c9XCJCQVJcIiwiICsKLQkJCQkJCSJhbGxvY2F0aW9uU2l6ZT01LCBpbml0aWFsVmFsdWU9MTApIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFRhYmxlR2VuZXJhdG9yKG5hbWU9XCJ0Z2VuXCIsIHRhYmxlPVwiSURfR0VOXCIsIHNjaGVtYT1cIkFQUFwiLCBjYXRhbG9nPVwiRk9PXCIsIiArCi0JCQkJCQkicGtDb2x1bW5OYW1lPVwiR0VOX05BTUVcIiwgdmFsdWVDb2x1bW5OYW1lPVwiR0VOX1ZBTFVFXCIsIHBrQ29sdW1uVmFsdWU9XCJUR0VOXCIsIiArCi0JCQkJCQkiYWxsb2NhdGlvblNpemU9NTAsIGluaXRpYWxWYWx1ZT0xMDApIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBTZXF1ZW5jZUdlbmVyYXRvcihuYW1lPVwic2dlblwiLCBzZXF1ZW5jZU5hbWU9XCJGb29fU2VxXCIsIHNjaGVtYT1cIlNZU1wiLCBjYXRhbG9nPVwiQkFSXCIsIiArCi0JCQkJCQkiYWxsb2NhdGlvblNpemU9NSwgaW5pdGlhbFZhbHVlPTEwKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnREdXBsaWNhdGVHZW5lcmF0b3JzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRHVwbGljYXRlR2VuZXJhdG9ycygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlKYXZhSWRNYXBwaW5nIG1hcHBpbmcgPSAoSmF2YUlkTWFwcGluZyllbnRpdHkuZ2V0SWRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhZGRYbWxNYXBwaW5nRmlsZVJlZihKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCUVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQkJcGVyc2lzdGVuY2VVbml0LmNvbnZlcnRKYXZhR2VuZXJhdG9ycyhlbnRpdHlNYXBwaW5ncywgcHJvZ3Jlc3NNb25pdG9yKTsKLQkJCi0JCS8vIHRlc3QgZHVwbGljYXRlIEphdmEgZ2VuZXJhdG9ycyBhcmUgbm90IGNvbnZlcnRlZCB0byBlY2xpcHNlbGluay1vcm0ueG1sIGFuZCAKLQkJLy8gbm90IHJlbW92ZWQgZnJvbSB0aGUgSmF2YSBlbnRpdHksIGJ1dCB1bmlxdWUgZ2VuZXJhdG9yIGlzCi0JCWFzc2VydE5vdE51bGwoZW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROb3ROdWxsKGVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eU1hcHBpbmdzLmdldFNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlNYXBwaW5ncy5nZXRUYWJsZUdlbmVyYXRvcnNTaXplKCkpOwotCQlhc3NlcnROb3ROdWxsKG1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwobWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRFcXVpdmFsZW50R2VuZXJhdG9ycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVxdWl2YWxlbnRHZW5lcmF0b3JzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJSmF2YUlkTWFwcGluZyBtYXBwaW5nID0gKEphdmFJZE1hcHBpbmcpZW50aXR5LmdldElkQXR0cmlidXRlKCkuZ2V0TWFwcGluZygpOwotCi0JCWFkZFhtbE1hcHBpbmdGaWxlUmVmKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlwZXJzaXN0ZW5jZVVuaXQuY29udmVydEphdmFHZW5lcmF0b3JzKGVudGl0eU1hcHBpbmdzLCBwcm9ncmVzc01vbml0b3IpOwotCQkKLQkJLy8gdGVzdCBvbmx5IG9uZSBvZiB0aGUgZXF1aXZhbGVudCBnZW5lcmF0b3JzIGFyZSBjb252ZXJ0ZWQgdG8gCi0JCS8vIGVjbGlwc2VsaW5rLW9ybS54bWwgYW5kIHRoZSByZXN0IGFyZSByZW1vdmVkCi0JCWFzc2VydE51bGwoZW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBlbnRpdHlNYXBwaW5ncy5nZXRTZXF1ZW5jZUdlbmVyYXRvcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5TWFwcGluZ3MuZ2V0VGFibGVHZW5lcmF0b3JzU2l6ZSgpKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqIGVudGl0eSB3aXRoIGNvbnZlcnRlcnMqKioqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBFY2xpcHNlTGluay5DT05WRVJURVIsIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSLAotCQkJCQkJRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSLCBFY2xpcHNlTGluay5DT05WRVJTSU9OX1ZBTFVFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0ZXIobmFtZT1cImN1c3RvbVwiLCBjb252ZXJ0ZXJDbGFzcz1mb28uY2xhc3MpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBUeXBlQ29udmVydGVyKG5hbWU9XCJ0eXBlXCIsIGRhdGFUeXBlPU51bWJlci5jbGFzcywgb2JqZWN0VHlwZT1JbnRlZ2VyLmNsYXNzKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihuYW1lPVwib3R5cGVcIiwgZGF0YVR5cGU9Q2hhcmFjdGVyLmNsYXNzLCBvYmplY3RUeXBlPVN0cmluZy5jbGFzcywgIiArCi0JCQkJCQkiY29udmVyc2lvblZhbHVlcz17QENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWU9XCJtXCIsIG9iamVjdFZhbHVlPVwibWFsZVwiKSwgIiArCi0JCQkJCQkJCQkJICAiQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWU9XCJmXCIsIG9iamVjdFZhbHVlPVwiZmVtYWxlXCIpfSwiICsKLQkJCQkJCSJkZWZhdWx0T2JqZWN0VmFsdWU9XCJmZW1hbGVcIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFN0cnVjdENvbnZlcnRlcihuYW1lPVwic3RydWN0XCIsIGNvbnZlcnRlcj1cImJhclwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydGVyT25Db252ZXJ0aWJsZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgRWNsaXBzZUxpbmsuQ09OVkVSVEVSUywgRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydGVycyh7IiArCi0JCQkJCQkiQENvbnZlcnRlcihuYW1lID0gXCJjdXN0b20xXCIsIGNvbnZlcnRlckNsYXNzPWZvbzEuY2xhc3MpLCIgKwotCQkJCQkJIkBDb252ZXJ0ZXIobmFtZSA9IFwiY3VzdG9tMlwiLCBjb252ZXJ0ZXJDbGFzcz1mb28yLmNsYXNzKX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0ZXJPbkNvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sCi0JCQkJCQkJCQkJCQkiamF2YS51dGlsLk1hcCIsIEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFN0cnVjdENvbnZlcnRlcihuYW1lPVwic3RydWN0XCIsIGNvbnZlcnRlcj1cImJhclwiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb2plY3RzOyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRHVwbGljYXRlQ29udmVydGVyc09mRGlmZlR5cGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMsIEVjbGlwc2VMaW5rLkNPTlZFUlRFUiwgRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIsCi0JCQkJCQlFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIsIEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnRlcihuYW1lPVwiY3VzdG9tXCIsIGNvbnZlcnRlckNsYXNzPWZvby5jbGFzcykiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFR5cGVDb252ZXJ0ZXIobmFtZT1cInR5cGVcIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE9iamVjdFR5cGVDb252ZXJ0ZXIobmFtZT1cInR5cGVcIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFN0cnVjdENvbnZlcnRlcihuYW1lPVwic3RydWN0XCIsIGNvbnZlcnRlcj1cImJhclwiKSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBPYmplY3RUeXBlQ29udmVydGVyKG5hbWU9XCJvdHlwZVwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eTJXaXRoRHVwbGljYXRlQ29udmVydGVyc09mU2FtZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgRWNsaXBzZUxpbmsuQ09OVkVSVEVSLCBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUiwKLQkJCQkJCUVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydGVyKG5hbWU9XCJjdXN0b21cIiwgY29udmVydGVyQ2xhc3M9Zm9vLmNsYXNzKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAVHlwZUNvbnZlcnRlcihuYW1lPVwidHlwZVwiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihuYW1lPVwib3R5cGVcIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFN0cnVjdENvbnZlcnRlcihuYW1lPVwic3RydWN0XCIsIGNvbnZlcnRlcj1cImJhclwiKSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0ZXIobmFtZT1cImN1c3RvbVwiLCBjb252ZXJ0ZXJDbGFzcz1iYXIuY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFcXVpdmFsZW50Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBFY2xpcHNlTGluay5DT05WRVJURVIsIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSLAotCQkJCQkJRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSLCBFY2xpcHNlTGluay5DT05WRVJTSU9OX1ZBTFVFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0ZXIobmFtZT1cImN1c3RvbVwiLCBjb252ZXJ0ZXJDbGFzcz1mb28uY2xhc3MpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBUeXBlQ29udmVydGVyKG5hbWU9XCJ0eXBlXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBPYmplY3RUeXBlQ29udmVydGVyKG5hbWU9XCJvdHlwZVwiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAU3RydWN0Q29udmVydGVyKG5hbWU9XCJzdHJ1Y3RcIiwgY29udmVydGVyPVwiYmFyXCIpIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnRlcihuYW1lPVwiY3VzdG9tXCIsIGNvbnZlcnRlckNsYXNzPWZvby5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q29udmVydGVyc29uRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydGVycygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCWFkZFhtbE1hcHBpbmdGaWxlUmVmKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQkJCi0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQuY29udmVydEphdmFDb252ZXJ0ZXJzKGVudGl0eU1hcHBpbmdzLCBwcm9ncmVzc01vbml0b3IpOwotCQkKLQkJLy8gdGVzdCBKYXZhIGNvbnZlcnRlciBhcmUgY29udmVydGVkIHRvIGVjbGlwc2VsaW5rLW9ybS54bWwgYW5kIHJlbW92ZWQgZnJvbSB0aGUgSmF2YSBlbnRpdHkKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhlbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSwgMCk7Ci0JCWFzc2VydEVxdWFscyhlbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCksIDApOwotCQlhc3NlcnRFcXVhbHMoZW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKGVudGl0eS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpLCAwKTsKLQkJCi0JCS8vIHRlc3QgdGhlIG1hcHBpbmcgZmlsZSBjb252ZXJ0ZXJzIGhhdmUgY29ycmVjdCB2YWx1ZXMKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY3VzdG9tID0gZW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImN1c3RvbSIsIGN1c3RvbS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGN1c3RvbS5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciB0eXBlID0gZW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0eXBlIiwgdHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdW1iZXIiLCB0eXBlLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgdHlwZS5nZXRPYmplY3RUeXBlKCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG90eXBlID0gZW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJvdHlwZSIsIG90eXBlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkNoYXJhY3RlciIsIG90eXBlLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBvdHlwZS5nZXRPYmplY3RUeXBlKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiB2YWx1ZXMgPSBvdHlwZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgdmFsdWUxID0gdmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtIiwgdmFsdWUxLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYWxlIiwgdmFsdWUxLmdldE9iamVjdFZhbHVlKCkpOwotCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSB2YWx1ZTIgPSB2YWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImYiLCB2YWx1ZTIuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZlbWFsZSIsIHZhbHVlMi5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZW1hbGUiLCBvdHlwZS5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCQotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBzdHJ1Y3QgPSBlbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RydWN0Iiwgc3RydWN0LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgc3RydWN0LmdldENvbnZlcnRlckNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydENvbnZlcnRlcnNPbkVudGl0eUNvbnZlcnRpYmxlTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRlck9uQ29udmVydGlibGVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJYWRkWG1sTWFwcGluZ0ZpbGVSZWYoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQkKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCXBlcnNpc3RlbmNlVW5pdC5jb252ZXJ0SmF2YUNvbnZlcnRlcnMoZW50aXR5TWFwcGluZ3MsIHByb2dyZXNzTW9uaXRvcik7Ci0JCQotCQkvLyB0ZXN0IEphdmEgY29udmVydGVyIG9uIGF0dHJpYnV0ZSBtYXBwaW5nIGlzIGNvbnZlcnRlZCB0byBlY2xpcHNlbGluay1vcm0ueG1sIGFuZCByZW1vdmVkIGZyb20gdGhlIEphdmEgZW50aXR5Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ29udmVydGlibGVNYXBwaW5nIG1hcHBpbmcgPSAoRWNsaXBzZUxpbmtDb252ZXJ0aWJsZU1hcHBpbmcpZW50aXR5LmdldElkQXR0cmlidXRlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG1hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0Q29udmVydGVyc1NpemUoKSwgMCk7Ci0JCQotCQkvLyB0ZXN0IHRoZSBtYXBwaW5nIGZpbGUgY29udmVydGVyIGhhdmUgY29ycmVjdCB2YWx1ZXMKLQkJQ29sbGVjdGlvbjxPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gY3VzdG9tQ29udmVydGVycyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldEN1c3RvbUNvbnZlcnRlcnMoKSk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGN1c3RvbTEgPSBHZW5lcmljMl8wSnBhTWV0YWRhdGFDb252ZXJzaW9uVGVzdHMuc2VsZWN0Tm9kZU5hbWVkKGN1c3RvbUNvbnZlcnRlcnMsICJjdXN0b20xIik7Ci0JCWFzc2VydEVxdWFscygiY3VzdG9tMSIsIGN1c3RvbTEuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xIiwgY3VzdG9tMS5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY3VzdG9tMiA9IEdlbmVyaWMyXzBKcGFNZXRhZGF0YUNvbnZlcnNpb25UZXN0cy5zZWxlY3ROb2RlTmFtZWQoY3VzdG9tQ29udmVydGVycywgImN1c3RvbTIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJjdXN0b20yIiwgY3VzdG9tMi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBjdXN0b20yLmdldENvbnZlcnRlckNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydENvbnZlcnRlcnNPbkNvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydGVyT25Db2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCWFkZFhtbE1hcHBpbmdGaWxlUmVmKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQkJCi0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQuY29udmVydEphdmFDb252ZXJ0ZXJzKGVudGl0eU1hcHBpbmdzLCBwcm9ncmVzc01vbml0b3IpOwotCQkKLQkJLy8gdGVzdCBKYXZhIGNvbnZlcnRlciBvbiBhdHRyaWJ1dGUgbWFwcGluZyBpcyBjb252ZXJ0ZWQgdG8gZWNsaXBzZWxpbmstb3JtLnhtbCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBKYXZhIGVudGl0eQotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCQotCQlpZiAoZW50aXR5LmdldEF0dHJpYnV0ZU1hcHBpbmdzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpIHsKLQkJCUVjbGlwc2VMaW5rQ29udmVydGlibGVNYXBwaW5nIG1hcHBpbmcgPSAoRWNsaXBzZUxpbmtDb252ZXJ0aWJsZU1hcHBpbmcpZW50aXR5LmdldEF0dHJpYnV0ZU1hcHBpbmdzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQlhc3NlcnRFcXVhbHMobWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRDb252ZXJ0ZXJzU2l6ZSgpLCAwKTsKLQkJfQotCi0JCS8vIHRlc3QgdGhlIG1hcHBpbmcgZmlsZSBjb252ZXJ0ZXIgaGF2ZSBjb3JyZWN0IHZhbHVlcwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjdXN0b20gPSBlbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RydWN0IiwgY3VzdG9tLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY3VzdG9tLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQkKLQkJLy8gVE9ETyB0ZXN0IGNvbnZlcnRpbmcgY29udmVydGVyIG9uIG1hcCBrZXkgLSBub3Qgc3VwcG9ydGVkIHlldAotCX0KLQkKLQkJcHVibGljIHZvaWQgdGVzdENvbnZlcnRPdmVycmlkZGVuQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aER1cGxpY2F0ZUNvbnZlcnRlcnNPZkRpZmZUeXBlcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFkZFhtbE1hcHBpbmdGaWxlUmVmKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsJCQotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db252ZXJ0ZXJjb250YWluZXIgPSBlbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udmVydGVyID0gb3JtQ29udmVydGVyY29udGFpbmVyLmFkZEN1c3RvbUNvbnZlcnRlcihvcm1Db252ZXJ0ZXJjb250YWluZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWNvbnZlcnRlci5zZXROYW1lKCJ0eXBlIik7Ci0JCQotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGlibGVNYXBwaW5nIG1hcHBpbmcgPSAoRWNsaXBzZUxpbmtDb252ZXJ0aWJsZU1hcHBpbmcpZW50aXR5LmdldEF0dHJpYnV0ZU1hcHBpbmdzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHBlcnNpc3RlbmNlVW5pdC5nZXRDb252ZXJ0ZXJzKCksIG1hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0Q29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpKSk7Ci0JCQkJCi0JCXBlcnNpc3RlbmNlVW5pdC5jb252ZXJ0SmF2YUNvbnZlcnRlcnMoZW50aXR5TWFwcGluZ3MsIHByb2dyZXNzTW9uaXRvcik7Ci0JCQotCQkvLyB0ZXN0IG92ZXJyaWRlbiBKYXZhIGNvbnZlcnRlcnMgYXJlIG5vdCBjb252ZXJ0ZWQgdG8gZWNsaXBzZWxpbmstb3JtLnhtbCBhbmQgCi0JCS8vIG5vdCByZW1vdmVkIGZyb20gdGhlIEphdmEgZW50aXR5LCBidXQgdW5pcXVlIGNvbnZlcnRlcnMgYXJlCi0JCWFzc2VydEVxdWFscyhlbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCksIDEpOwotCQlhc3NlcnRFcXVhbHMoZW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpLCAxKTsKLQkJYXNzZXJ0RXF1YWxzKGVudGl0eS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKGVudGl0eS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKG1hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCksIDApOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udmVydGVyY29udGFpbmVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udmVydGVyY29udGFpbmVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udmVydGVyY29udGFpbmVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnZlcnRlcmNvbnRhaW5lci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0RHVwbGljYXRlQ29udmVydGVyc1dpdGhEaWZmVHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEdXBsaWNhdGVDb252ZXJ0ZXJzT2ZEaWZmVHlwZXMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0aWJsZU1hcHBpbmcgbWFwcGluZyA9IChFY2xpcHNlTGlua0NvbnZlcnRpYmxlTWFwcGluZyllbnRpdHkuZ2V0QXR0cmlidXRlTWFwcGluZ3MoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkKLQkJYWRkWG1sTWFwcGluZ0ZpbGVSZWYoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlwZXJzaXN0ZW5jZVVuaXQuY29udmVydEphdmFDb252ZXJ0ZXJzKGVudGl0eU1hcHBpbmdzLCBwcm9ncmVzc01vbml0b3IpOwotCQkKLQkJLy8gdGVzdCBkdXBsaWNhdGUgSmF2YSBjb252ZXJ0ZXJzIGFyZSBub3QgY29udmVydGVkIHRvIGVjbGlwc2VsaW5rLW9ybS54bWwgYW5kIAotCQkvLyBub3QgcmVtb3ZlZCBmcm9tIHRoZSBKYXZhIGVudGl0eSwgYnV0IHVuaXF1ZSBjb252ZXJ0ZXJzIGFyZQotCQlhc3NlcnRFcXVhbHMoZW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpLCAxKTsKLQkJYXNzZXJ0RXF1YWxzKGVudGl0eS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSwgMSk7Ci0JCWFzc2VydEVxdWFscyhlbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSwgMCk7Ci0JCWFzc2VydEVxdWFscyhlbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSwgMCk7Ci0JCWFzc2VydEVxdWFscyhtYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydER1cGxpY2F0ZUNvbnZlcnRlcnNXaXRoU2FtZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eTJXaXRoRHVwbGljYXRlQ29udmVydGVyc09mU2FtZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0aWJsZU1hcHBpbmcgbWFwcGluZyA9IChFY2xpcHNlTGlua0NvbnZlcnRpYmxlTWFwcGluZyllbnRpdHkuZ2V0QXR0cmlidXRlTWFwcGluZ3MoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlhZGRYbWxNYXBwaW5nRmlsZVJlZihKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCXBlcnNpc3RlbmNlVW5pdC5jb252ZXJ0SmF2YUNvbnZlcnRlcnMoZW50aXR5TWFwcGluZ3MsIHByb2dyZXNzTW9uaXRvcik7Ci0JCQotCQkvLyB0ZXN0IGR1cGxpY2F0ZSBKYXZhIGNvbnZlcnRlcnMgYXJlIG5vdCBjb252ZXJ0ZWQgdG8gZWNsaXBzZWxpbmstb3JtLnhtbCBhbmQgCi0JCS8vIG5vdCByZW1vdmVkIGZyb20gdGhlIEphdmEgZW50aXR5LCBidXQgdW5pcXVlIGNvbnZlcnRlcnMgYXJlCi0JCWFzc2VydEVxdWFscyhlbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSwgMSk7Ci0JCWFzc2VydEVxdWFscyhlbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCksIDApOwotCQlhc3NlcnRFcXVhbHMoZW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKGVudGl0eS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKG1hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSwgMSk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydEVxdWl2YWxlbnRDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRXF1aXZhbGVudENvbnZlcnRlcnMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0aWJsZU1hcHBpbmcgbWFwcGluZyA9IChFY2xpcHNlTGlua0NvbnZlcnRpYmxlTWFwcGluZyllbnRpdHkuZ2V0QXR0cmlidXRlTWFwcGluZ3MoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkKLQkJYWRkWG1sTWFwcGluZ0ZpbGVSZWYoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlwZXJzaXN0ZW5jZVVuaXQuY29udmVydEphdmFDb252ZXJ0ZXJzKGVudGl0eU1hcHBpbmdzLCBwcm9ncmVzc01vbml0b3IpOwotCQkKLQkJLy8gdGVzdCBvbmx5IG9uZSBvZiB0aGUgZXF1aXZhbGVudCBjb252ZXJ0ZXJzIGlzIGNvbnZlcnRlZCB0byAKLQkJLy8gZWNsaXBzZWxpbmstb3JtLnhtbCBhbmQgdGhlIHJlc3QgYXJlIHJlbW92ZWQgCi0JCWFzc2VydEVxdWFscyhlbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSwgMCk7Ci0JCWFzc2VydEVxdWFscyhlbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCksIDApOwotCQlhc3NlcnRFcXVhbHMoZW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKGVudGl0eS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKG1hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSwgMCk7Ci0JCWFzc2VydEVxdWFscygxLCBlbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCX0KLQkKLQkvLyAqKioqKioqKioqKiogZW1iZWRkYWJsZSB3aXRoIGNvbnZlcnRlcnMqKioqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRhYmxlV2l0aENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERBQkxFLCBFY2xpcHNlTGluay5DT05WRVJURVIsIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSLAotCQkJCQkJRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSLCBFY2xpcHNlTGluay5DT05WRVJTSU9OX1ZBTFVFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydGVyKG5hbWU9XCJjdXN0b21cIiwgY29udmVydGVyQ2xhc3M9Zm9vLmNsYXNzKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAVHlwZUNvbnZlcnRlcihuYW1lPVwidHlwZVwiLCBkYXRhVHlwZT1OdW1iZXIuY2xhc3MsIG9iamVjdFR5cGU9SW50ZWdlci5jbGFzcykiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE9iamVjdFR5cGVDb252ZXJ0ZXIobmFtZT1cIm90eXBlXCIsIGRhdGFUeXBlPUNoYXJhY3Rlci5jbGFzcywgb2JqZWN0VHlwZT1TdHJpbmcuY2xhc3MsICIgKwotCQkJCQkJImNvbnZlcnNpb25WYWx1ZXM9e0BDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlPVwibVwiLCBvYmplY3RWYWx1ZT1cIm1hbGVcIiksICIgKwotCQkJCQkJCQkJCSAgIkBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlPVwiZlwiLCBvYmplY3RWYWx1ZT1cImZlbWFsZVwiKX0sIiArCi0JCQkJCQkiZGVmYXVsdE9iamVjdFZhbHVlPVwiZmVtYWxlXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBTdHJ1Y3RDb252ZXJ0ZXIobmFtZT1cInN0cnVjdFwiLCBjb252ZXJ0ZXI9XCJiYXJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZVdpdGhDb252ZXJ0ZXJPbkNvbnZlcnRpYmxlTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREFCTEUsIEpQQS5WRVJTSU9OLCBFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBWZXJzaW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0ZXIobmFtZT1cImN1c3RvbVwiLCBjb252ZXJ0ZXJDbGFzcz1mb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydENvbnZlcnRlcnNPbkVtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVXaXRoQ29udmVydGVycygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUgZW1iZWRkYWJsZSA9IGdldEphdmFFbWJlZGRhYmxlKCk7Ci0JCWFkZFhtbE1hcHBpbmdGaWxlUmVmKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQkJCi0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQuY29udmVydEphdmFDb252ZXJ0ZXJzKGVudGl0eU1hcHBpbmdzLCBwcm9ncmVzc01vbml0b3IpOwotCQkKLQkJLy8gdGVzdCBKYXZhIGNvbnZlcnRlciBhcmUgY29udmVydGVkIHRvIGVjbGlwc2VsaW5rLW9ybS54bWwgYW5kIHJlbW92ZWQgZnJvbSB0aGUgSmF2YSBlbnRpdHkKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhlbWJlZGRhYmxlLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCksIDApOwotCQlhc3NlcnRFcXVhbHMoZW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRUeXBlQ29udmVydGVyc1NpemUoKSwgMCk7Ci0JCWFzc2VydEVxdWFscyhlbWJlZGRhYmxlLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKGVtYmVkZGFibGUuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSwgMCk7Ci0JCQotCQkvLyB0ZXN0IHRoZSBtYXBwaW5nIGZpbGUgY29udmVydGVycyBoYXZlIGNvcnJlY3QgdmFsdWVzCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGN1c3RvbSA9IGVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjdXN0b20iLCBjdXN0b20uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjdXN0b20uZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgdHlwZSA9IGVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidHlwZSIsIHR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTnVtYmVyIiwgdHlwZS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIHR5cGUuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvdHlwZSA9IGVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygib3R5cGUiLCBvdHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5DaGFyYWN0ZXIiLCBvdHlwZS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgb3R5cGUuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gdmFsdWVzID0gb3R5cGUuZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIHZhbHVlMSA9IHZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibSIsIHZhbHVlMS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygibWFsZSIsIHZhbHVlMS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgdmFsdWUyID0gdmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmIiwgdmFsdWUyLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZW1hbGUiLCB2YWx1ZTIuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZmVtYWxlIiwgb3R5cGUuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQkKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgc3RydWN0ID0gZW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0cnVjdCIsIHN0cnVjdC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHN0cnVjdC5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRDb252ZXJ0ZXJzT25FbWJlZGRhYmxlQ29udmVydGlibGVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlV2l0aENvbnZlcnRlck9uQ29udmVydGlibGVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gZ2V0SmF2YUVtYmVkZGFibGUoKTsKLQkJYWRkWG1sTWFwcGluZ0ZpbGVSZWYoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQkKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCXBlcnNpc3RlbmNlVW5pdC5jb252ZXJ0SmF2YUNvbnZlcnRlcnMoZW50aXR5TWFwcGluZ3MsIHByb2dyZXNzTW9uaXRvcik7Ci0JCQotCQkvLyB0ZXN0IEphdmEgY29udmVydGVyIG9uIGF0dHJpYnV0ZSBtYXBwaW5nIGlzIGNvbnZlcnRlZCB0byBlY2xpcHNlbGluay1vcm0ueG1sIGFuZCByZW1vdmVkIGZyb20gdGhlIEphdmEgZW50aXR5Ci0JCWFzc2VydEVxdWFscygxLCBlbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ29udmVydGlibGVNYXBwaW5nIG1hcHBpbmcgPSAoRWNsaXBzZUxpbmtDb252ZXJ0aWJsZU1hcHBpbmcpZW1iZWRkYWJsZS5nZXRBdHRyaWJ1dGVNYXBwaW5ncygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMobWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRDb252ZXJ0ZXJzU2l6ZSgpLCAwKTsKLQkJCi0JCS8vIHRlc3QgdGhlIG1hcHBpbmcgZmlsZSBjb252ZXJ0ZXIgaGF2ZSBjb3JyZWN0IHZhbHVlcwotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjdXN0b20gPSBlbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY3VzdG9tIiwgY3VzdG9tLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY3VzdG9tLmdldENvbnZlcnRlckNsYXNzKCkpOwotCX0KLQkKLQkvLyAqKioqKioqKioqKiogbWFwcGVkIHN1cGVyY2xhc3MgIHdpdGggY29udmVydGVycyoqKioqKioqKioqKioKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBFY2xpcHNlTGluay5DT05WRVJURVIsIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSLAotCQkJCQkJRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSLCBFY2xpcHNlTGluay5DT05WRVJTSU9OX1ZBTFVFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydGVyKG5hbWU9XCJjdXN0b21cIiwgY29udmVydGVyQ2xhc3M9Zm9vLmNsYXNzKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAVHlwZUNvbnZlcnRlcihuYW1lPVwidHlwZVwiLCBkYXRhVHlwZT1OdW1iZXIuY2xhc3MsIG9iamVjdFR5cGU9SW50ZWdlci5jbGFzcykiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE9iamVjdFR5cGVDb252ZXJ0ZXIobmFtZT1cIm90eXBlXCIsIGRhdGFUeXBlPUNoYXJhY3Rlci5jbGFzcywgb2JqZWN0VHlwZT1TdHJpbmcuY2xhc3MsICIgKwotCQkJCQkJImNvbnZlcnNpb25WYWx1ZXM9e0BDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlPVwibVwiLCBvYmplY3RWYWx1ZT1cIm1hbGVcIiksICIgKwotCQkJCQkJCQkJCSAgIkBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlPVwiZlwiLCBvYmplY3RWYWx1ZT1cImZlbWFsZVwiKX0sIiArCi0JCQkJCQkiZGVmYXVsdE9iamVjdFZhbHVlPVwiZmVtYWxlXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBTdHJ1Y3RDb252ZXJ0ZXIobmFtZT1cInN0cnVjdFwiLCBjb252ZXJ0ZXI9XCJiYXJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDb252ZXJ0ZXJPbkNvbnZlcnRpYmxlTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBKUEEuSUQsIEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0ZXIobmFtZT1cImN1c3RvbVwiLCBjb252ZXJ0ZXJDbGFzcz1mb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydENvbnZlcnRlcnNPbk1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ29udmVydGVycygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IGdldEphdmFNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbE1hcHBpbmdGaWxlUmVmKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQkJCi0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQuY29udmVydEphdmFDb252ZXJ0ZXJzKGVudGl0eU1hcHBpbmdzLCBwcm9ncmVzc01vbml0b3IpOwotCQkKLQkJLy8gdGVzdCBKYXZhIGNvbnZlcnRlciBhcmUgY29udmVydGVkIHRvIGVjbGlwc2VsaW5rLW9ybS54bWwgYW5kIHJlbW92ZWQgZnJvbSB0aGUgSmF2YSBlbnRpdHkKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhtYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCksIDApOwotCQlhc3NlcnRFcXVhbHMobWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRUeXBlQ29udmVydGVyc1NpemUoKSwgMCk7Ci0JCWFzc2VydEVxdWFscyhtYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKG1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSwgMCk7Ci0JCQotCQkvLyB0ZXN0IHRoZSBtYXBwaW5nIGZpbGUgY29udmVydGVycyBoYXZlIGNvcnJlY3QgdmFsdWVzCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGN1c3RvbSA9IGVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjdXN0b20iLCBjdXN0b20uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjdXN0b20uZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgdHlwZSA9IGVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidHlwZSIsIHR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTnVtYmVyIiwgdHlwZS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIHR5cGUuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvdHlwZSA9IGVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygib3R5cGUiLCBvdHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5DaGFyYWN0ZXIiLCBvdHlwZS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgb3R5cGUuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gdmFsdWVzID0gb3R5cGUuZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIHZhbHVlMSA9IHZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibSIsIHZhbHVlMS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygibWFsZSIsIHZhbHVlMS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgdmFsdWUyID0gdmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmIiwgdmFsdWUyLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZW1hbGUiLCB2YWx1ZTIuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZmVtYWxlIiwgb3R5cGUuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQkKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgc3RydWN0ID0gZW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0cnVjdCIsIHN0cnVjdC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHN0cnVjdC5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRDb252ZXJ0ZXJzT25NYXBwZWRTdXBlcmNsYXNzQ29udmVydGlibGVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENvbnZlcnRlck9uQ29udmVydGlibGVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gZ2V0SmF2YU1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJYWRkWG1sTWFwcGluZ0ZpbGVSZWYoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQkKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCXBlcnNpc3RlbmNlVW5pdC5jb252ZXJ0SmF2YUNvbnZlcnRlcnMoZW50aXR5TWFwcGluZ3MsIHByb2dyZXNzTW9uaXRvcik7Ci0JCQotCQkvLyB0ZXN0IEphdmEgY29udmVydGVyIG9uIGF0dHJpYnV0ZSBtYXBwaW5nIGlzIGNvbnZlcnRlZCB0byBlY2xpcHNlbGluay1vcm0ueG1sIGFuZCByZW1vdmVkIGZyb20gdGhlIEphdmEgZW50aXR5Ci0JCWFzc2VydEVxdWFscygxLCBlbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ29udmVydGlibGVNYXBwaW5nIG1hcHBpbmcgPSAoRWNsaXBzZUxpbmtDb252ZXJ0aWJsZU1hcHBpbmcpbWFwcGVkU3VwZXJjbGFzcy5nZXRBdHRyaWJ1dGVNYXBwaW5ncygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMobWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRDb252ZXJ0ZXJzU2l6ZSgpLCAwKTsKLQkJCi0JCS8vIHRlc3QgdGhlIG1hcHBpbmcgZmlsZSBjb252ZXJ0ZXIgaGF2ZSBjb3JyZWN0IHZhbHVlcwotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjdXN0b20gPSBlbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY3VzdG9tIiwgY3VzdG9tLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY3VzdG9tLmdldENvbnZlcnRlckNsYXNzKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rQ29ubmVjdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua0Nvbm5lY3Rpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWE0M2E3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rQ29ubmVjdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQmF0Y2hXcml0aW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGU7Ci0KLS8qKgotICogIENvbm5lY3Rpb25BZGFwdGVyVGVzdHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDb25uZWN0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBDb25uZWN0aW9uIGNvbm5lY3Rpb247Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBUUkFOU0FDVElPTl9UWVBFX1RFU1RfVkFMVUUgPSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgVFJBTlNBQ1RJT05fVFlQRV9URVNUX1ZBTFVFXzIgPSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlRBX0RBVEFfU09VUkNFX1RFU1RfVkFMVUUgPSAiVGVzdF9KVEEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpUQV9EQVRBX1NPVVJDRV9URVNUX1ZBTFVFXzIgPSAiVGVzdF9KVEFfMiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05fSlRBX0RBVEFfU09VUkNFX1RFU1RfVkFMVUUgPSAiVGVzdF9Ob25fSlRBIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05fSlRBX0RBVEFfU09VUkNFX1RFU1RfVkFMVUVfMiA9ICJUZXN0X05vbl9KVEFfMiI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUSVZFX1NRTF9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX05BVElWRV9TUUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIE5BVElWRV9TUUxfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBOQVRJVkVfU1FMX1RFU1RfVkFMVUVfMiA9ICEgTkFUSVZFX1NRTF9URVNUX1ZBTFVFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFUQ0hfV1JJVElOR19LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX0JBVENIX1dSSVRJTkc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCYXRjaFdyaXRpbmcgQkFUQ0hfV1JJVElOR19URVNUX1ZBTFVFID0gQmF0Y2hXcml0aW5nLm9yYWNsZV9qZGJjOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQmF0Y2hXcml0aW5nIEJBVENIX1dSSVRJTkdfVEVTVF9WQUxVRV8yID0gQmF0Y2hXcml0aW5nLmJ1ZmZlcmVkOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NUQVRFTUVOVFNfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19DQUNIRV9TVEFURU1FTlRTOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBDQUNIRV9TVEFURU1FTlRTX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gQ0FDSEVfU1RBVEVNRU5UU19URVNUX1ZBTFVFXzIgPSAhIENBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TVEFURU1FTlRTX1NJWkVfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19DQUNIRV9TVEFURU1FTlRTX1NJWkU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIENBQ0hFX1NUQVRFTUVOVFNfU0laRV9URVNUX1ZBTFVFID0gMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBDQUNIRV9TVEFURU1FTlRTX1NJWkVfVEVTVF9WQUxVRV8yID0gMjAwOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSSVZFUl9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX0RSSVZFUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfVEVTVF9WQUxVRSA9ICJjb25uZWN0aW9uLmRyaXZlciI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX1RFU1RfVkFMVUVfMiA9ICJjb25uZWN0aW9uLmRyaXZlci4yIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19VUkw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1RFU1RfVkFMVUUgPSAidGVzdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzIiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1VTRVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9URVNUX1ZBTFVFID0gInRlc3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfVEVTVF9WQUxVRV8yID0gInRlc3RfMiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1BBU1NXT1JEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEX1RFU1RfVkFMVUUgPSAidGVzdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkRfVEVTVF9WQUxVRV8yID0gInRlc3RfMiI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORF9QQVJBTUVURVJTX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfQklORF9QQVJBTUVURVJTOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBCSU5EX1BBUkFNRVRFUlNfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBCSU5EX1BBUkFNRVRFUlNfVEVTVF9WQUxVRV8yID0gISBCSU5EX1BBUkFNRVRFUlNfVEVTVF9WQUxVRTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfU0hBUkVEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1RFU1RfVkFMVUVfMiA9ICEgUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX0NPTk5FQ1RJT05TX01JTl9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUlOOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBSRUFEX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFID0gMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBSRUFEX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFXzIgPSAyMDA7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9DT05ORUNUSU9OU19NQVhfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX01BWDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgUkVBRF9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRSA9IDEwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgUkVBRF9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRV8yID0gMjAwOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdSSVRFX0NPTk5FQ1RJT05TX01JTl9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01JTjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgV1JJVEVfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUUgPSAxMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFdSSVRFX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFXzIgPSAyMDA7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JJVEVfQ09OTkVDVElPTlNfTUFYX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUFYOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBXUklURV9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRSA9IDEwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgV1JJVEVfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUVfMiA9IDIwMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19FWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9URVNUX1ZBTFVFID0gRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUuYWx3YXlzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9URVNUX1ZBTFVFXzIgPSBFeGNsdXNpdmVDb25uZWN0aW9uTW9kZS5pc29sYXRlZDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVpZX0NPTk5FQ1RJT05fS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19MQVpZX0NPTk5FQ1RJT047Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIExBWllfQ09OTkVDVElPTl9URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIExBWllfQ09OTkVDVElPTl9URVNUX1ZBTFVFXzIgPSAhIExBWllfQ09OTkVDVElPTl9URVNUX1ZBTFVFOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmtDb25uZWN0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5jb25uZWN0aW9uID0gdGhpcy5zdWJqZWN0LmdldENvbm5lY3Rpb24oKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJCi0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uTkFUSVZFX1NRTF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uQkFUQ0hfV1JJVElOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uQ0FDSEVfU1RBVEVNRU5UU19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5EUklWRVJfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLlVSTF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uVVNFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uUEFTU1dPUkRfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLkJJTkRfUEFSQU1FVEVSU19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19TSEFSRURfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5SRUFEX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5XUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLkVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLkxBWllfQ09OTkVDVElPTl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDE2OyAvLyBFY2xpcHNlTGluayBwcm9wZXJ0aWVzCi0JCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyA0OyAvLyA0IG1pc2MgcHJvcGVydGllcwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCS8vIEluaXRpYWxpemVzIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4xIiwgInZhbHVlLjEiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShOQVRJVkVfU1FMX0tFWSwgTkFUSVZFX1NRTF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KEJBVENIX1dSSVRJTkdfS0VZLCBCQVRDSF9XUklUSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KENBQ0hFX1NUQVRFTUVOVFNfS0VZLCBDQUNIRV9TVEFURU1FTlRTX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoQ0FDSEVfU1RBVEVNRU5UU19TSVpFX0tFWSwgQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoRFJJVkVSX0tFWSwgRFJJVkVSX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVVJMX0tFWSwgVVJMX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVVNFUl9LRVksIFVTRVJfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShQQVNTV09SRF9LRVksIFBBU1NXT1JEX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoQklORF9QQVJBTUVURVJTX0tFWSwgQklORF9QQVJBTUVURVJTX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMiIsICJ2YWx1ZS4yIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMyIsICJ2YWx1ZS4zIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoUkVBRF9DT05ORUNUSU9OU19TSEFSRURfS0VZLCBSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFJFQURfQ09OTkVDVElPTlNfTUlOX0tFWSwgUkVBRF9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShSRUFEX0NPTk5FQ1RJT05TX01BWF9LRVksIFJFQURfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoV1JJVEVfQ09OTkVDVElPTlNfTUlOX0tFWSwgV1JJVEVfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoV1JJVEVfQ09OTkVDVElPTlNfTUFYX0tFWSwgV1JJVEVfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuNCIsICJ2YWx1ZS40Iik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9LRVksIEVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTEFaWV9DT05ORUNUSU9OX0tFWSwgTEFaWV9DT05ORUNUSU9OX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCQotCQkvLyBJbml0aWFsaXplcyBQVSBlbGVtZW50cwotCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnNldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZShUUkFOU0FDVElPTl9UWVBFX1RFU1RfVkFMVUUpOwotCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnNldEp0YURhdGFTb3VyY2UoSlRBX0RBVEFfU09VUkNFX1RFU1RfVkFMVUUpOwotCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnNldE5vbkp0YURhdGFTb3VyY2UoTk9OX0pUQV9EQVRBX1NPVVJDRV9URVNUX1ZBTFVFKTsKLQkJcmV0dXJuOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uOwotCX0KLQotCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5OQVRJVkVfU1FMX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXROYXRpdmVTcWwoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkJBVENIX1dSSVRJTkdfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldEJhdGNoV3JpdGluZygoQmF0Y2hXcml0aW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5DQUNIRV9TVEFURU1FTlRTX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRDYWNoZVN0YXRlbWVudHMoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkNBQ0hFX1NUQVRFTUVOVFNfU0laRV9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgoSW50ZWdlcikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uRFJJVkVSX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXREcml2ZXIoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uVVJMX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRVcmwoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uVVNFUl9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0VXNlcigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5QQVNTV09SRF9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0UGFzc3dvcmQoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uQklORF9QQVJBTUVURVJTX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRCaW5kUGFyYW1ldGVycygoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19TSEFSRURfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFJlYWRDb25uZWN0aW9uc1NoYXJlZCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFJlYWRDb25uZWN0aW9uc01pbigoSW50ZWdlcikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFJlYWRDb25uZWN0aW9uc01heCgoSW50ZWdlcikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRXcml0ZUNvbm5lY3Rpb25zTWluKChJbnRlZ2VyKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5XUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFdyaXRlQ29ubmVjdGlvbnNNYXgoKEludGVnZXIpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlKChFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSkgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uTEFaWV9DT05ORUNUSU9OX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRMYXp5Q29ubmVjdGlvbigoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uTkFUSVZFX1NRTF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldE5hdGl2ZVNxbCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uQkFUQ0hfV1JJVElOR19QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldEJhdGNoV3JpdGluZygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uQ0FDSEVfU1RBVEVNRU5UU19QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldENhY2hlU3RhdGVtZW50cygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uRFJJVkVSX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0RHJpdmVyKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5VUkxfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRVcmwoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlVTRVJfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRVc2VyKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5QQVNTV09SRF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldFBhc3N3b3JkKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5CSU5EX1BBUkFNRVRFUlNfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRCaW5kUGFyYW1ldGVycygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19TSEFSRURfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0UmVhZENvbm5lY3Rpb25zTWluKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5SRUFEX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldFJlYWRDb25uZWN0aW9uc01heCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0V3JpdGVDb25uZWN0aW9uc01pbigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uV1JJVEVfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0V3JpdGVDb25uZWN0aW9uc01heCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5MQVpZX0NPTk5FQ1RJT05fUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRMYXp5Q29ubmVjdGlvbigpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImdldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIG1vZGVsVmFsdWU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBOYXRpdmVTcWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXROYXRpdmVTcWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJTkFUSVZFX1NRTF9LRVksCi0JCQlOQVRJVkVfU1FMX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJTkFUSVZFX1NRTF9LRVksCi0JCQlOQVRJVkVfU1FMX1RFU1RfVkFMVUUsCi0JCQlOQVRJVkVfU1FMX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZU5hdGl2ZVNxbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJTkFUSVZFX1NRTF9LRVksCi0JCQlOQVRJVkVfU1FMX1RFU1RfVkFMVUUsCi0JCQlOQVRJVkVfU1FMX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBCYXRjaFdyaXRpbmcgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRCYXRjaFdyaXRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQkFUQ0hfV1JJVElOR19LRVksCi0JCQlCQVRDSF9XUklUSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJQkFUQ0hfV1JJVElOR19LRVksCi0JCQlCQVRDSF9XUklUSU5HX1RFU1RfVkFMVUUsCi0JCQlCQVRDSF9XUklUSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUJhdGNoV3JpdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJQkFUQ0hfV1JJVElOR19LRVksCi0JCQlCQVRDSF9XUklUSU5HX1RFU1RfVkFMVUUsCi0JCQlCQVRDSF9XUklUSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDYWNoZVN0YXRlbWVudHMgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYWNoZVN0YXRlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQ0FDSEVfU1RBVEVNRU5UU19LRVksCi0JCQlDQUNIRV9TVEFURU1FTlRTX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJQ0FDSEVfU1RBVEVNRU5UU19LRVksCi0JCQlDQUNIRV9TVEFURU1FTlRTX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9TVEFURU1FTlRTX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUNhY2hlU3RhdGVtZW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJQ0FDSEVfU1RBVEVNRU5UU19LRVksCi0JCQlDQUNIRV9TVEFURU1FTlRTX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9TVEFURU1FTlRTX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogQ2FjaGVTdGF0ZW1lbnRzU2l6ZSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldENhY2hlU3RhdGVtZW50c1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQ0FDSEVfU1RBVEVNRU5UU19TSVpFX0tFWSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfU0laRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfU0laRV9LRVksCi0JCQlDQUNIRV9TVEFURU1FTlRTX1NJWkVfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfU0laRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVDYWNoZVN0YXRlbWVudHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlDQUNIRV9TVEFURU1FTlRTX1NJWkVfS0VZLAotCQkJQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9TVEFURU1FTlRTX1NJWkVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIERyaXZlciB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldERyaXZlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlEUklWRVJfS0VZLAotCQkJRFJJVkVSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJRFJJVkVSX0tFWSwKLQkJCURSSVZFUl9URVNUX1ZBTFVFLAotCQkJRFJJVkVSX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZURyaXZlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJRFJJVkVSX0tFWSwKLQkJCURSSVZFUl9URVNUX1ZBTFVFLAotCQkJRFJJVkVSX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBVcmwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRVcmwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVVJMX0tFWSwKLQkJCVVSTF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVVSTF9LRVksCi0JCQlVUkxfVEVTVF9WQUxVRSwKLQkJCVVSTF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVVcmwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVVSTF9LRVksCi0JCQlVUkxfVEVTVF9WQUxVRSwKLQkJCVVSTF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVXNlciB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVVNFUl9LRVksCi0JCQlVU0VSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJVVNFUl9LRVksCi0JCQlVU0VSX1RFU1RfVkFMVUUsCi0JCQlVU0VSX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVVTRVJfS0VZLAotCQkJVVNFUl9URVNUX1ZBTFVFLAotCQkJVVNFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogUGFzc3dvcmQgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRQYXNzd29yZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlQQVNTV09SRF9LRVksCi0JCQlQQVNTV09SRF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVBBU1NXT1JEX0tFWSwKLQkJCVBBU1NXT1JEX1RFU1RfVkFMVUUsCi0JCQlQQVNTV09SRF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVQYXNzd29yZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJUEFTU1dPUkRfS0VZLAotCQkJUEFTU1dPUkRfVEVTVF9WQUxVRSwKLQkJCVBBU1NXT1JEX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBCaW5kUGFyYW1ldGVycyB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEJpbmRQYXJhbWV0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUJJTkRfUEFSQU1FVEVSU19LRVksCi0JCQlCSU5EX1BBUkFNRVRFUlNfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlCSU5EX1BBUkFNRVRFUlNfS0VZLAotCQkJQklORF9QQVJBTUVURVJTX1RFU1RfVkFMVUUsCi0JCQlCSU5EX1BBUkFNRVRFUlNfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQmluZFBhcmFtZXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUJJTkRfUEFSQU1FVEVSU19LRVksCi0JCQlCSU5EX1BBUkFNRVRFUlNfVEVTVF9WQUxVRSwKLQkJCUJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogUmVhZENvbm5lY3Rpb25zU2hhcmVkIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVhZENvbm5lY3Rpb25zU2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVJFQURfQ09OTkVDVElPTlNfU0hBUkVEX0tFWSwKLQkJCVJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJUkVBRF9DT05ORUNUSU9OU19TSEFSRURfS0VZLAotCQkJUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRSwKLQkJCVJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVJlYWRDb25uZWN0aW9uc1NoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJUkVBRF9DT05ORUNUSU9OU19TSEFSRURfS0VZLAotCQkJUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRSwKLQkJCVJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogUmVhZENvbm5lY3Rpb25zTWluIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVhZENvbm5lY3Rpb25zTWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVJFQURfQ09OTkVDVElPTlNfTUlOX0tFWSwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJUkVBRF9DT05ORUNUSU9OU19NSU5fS0VZLAotCQkJUkVBRF9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRSwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVJlYWRDb25uZWN0aW9uc01pbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJUkVBRF9DT05ORUNUSU9OU19NSU5fS0VZLAotCQkJUkVBRF9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRSwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogUmVhZENvbm5lY3Rpb25zTWF4IHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVhZENvbm5lY3Rpb25zTWF4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVJFQURfQ09OTkVDVElPTlNfTUFYX0tFWSwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJUkVBRF9DT05ORUNUSU9OU19NQVhfS0VZLAotCQkJUkVBRF9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRSwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVJlYWRDb25uZWN0aW9uc01heCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJUkVBRF9DT05ORUNUSU9OU19NQVhfS0VZLAotCQkJUkVBRF9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRSwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogV3JpdGVDb25uZWN0aW9uc01pbiB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFdyaXRlQ29ubmVjdGlvbnNNaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUlOX0tFWSwKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01JTl9LRVksCi0JCQlXUklURV9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRSwKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVXcml0ZUNvbm5lY3Rpb25zTWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlXUklURV9DT05ORUNUSU9OU19NSU5fS0VZLAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUUsCi0JCQlXUklURV9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBXcml0ZUNvbm5lY3Rpb25zTWF4IHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0V3JpdGVDb25uZWN0aW9uc01heCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlXUklURV9DT05ORUNUSU9OU19NQVhfS0VZLAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUFYX0tFWSwKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFLAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVdyaXRlQ29ubmVjdGlvbnNNYXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01BWF9LRVksCi0JCQlXUklURV9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRSwKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlFWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX0tFWSwKLQkJCUVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlFWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX0tFWSwKLQkJCUVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfVEVTVF9WQUxVRSwKLQkJCUVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfS0VZLAotCQkJRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9URVNUX1ZBTFVFLAotCQkJRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogTGF6eUNvbm5lY3Rpb24gdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRMYXp5Q29ubmVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlMQVpZX0NPTk5FQ1RJT05fS0VZLAotCQkJTEFaWV9DT05ORUNUSU9OX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJTEFaWV9DT05ORUNUSU9OX0tFWSwKLQkJCUxBWllfQ09OTkVDVElPTl9URVNUX1ZBTFVFLAotCQkJTEFaWV9DT05ORUNUSU9OX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUxhenlDb25uZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlMQVpZX0NPTk5FQ1RJT05fS0VZLAotCQkJTEFaWV9DT05ORUNUSU9OX1RFU1RfVkFMVUUsCi0JCQlMQVpZX0NPTk5FQ1RJT05fVEVTVF9WQUxVRV8yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY0MGM5MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DdXN0b21pemF0aW9uRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlByb2ZpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLldlYXZpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uOwotCi0vKioKLSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgbW9kZWwgb2JqZWN0cyBieSB0aGUgQ3VzdG9taXphdGlvbiBhZGFwdGVyIHdoZW4gdGhlCi0gKiBQZXJzaXN0ZW5jZVVuaXQgY2hhbmdlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBDdXN0b21pemF0aW9uIGN1c3RvbWl6YXRpb247Ci0JcHJpdmF0ZSBMaXN0RXZlbnQgZW50aXRpZXNFdmVudDsKLQlwcml2YXRlIExpc3RFdmVudCBzZXNzaW9uQ3VzdG9taXplcnNFdmVudDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9URVNUID0gIkVtcGxveWVlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfVEVTVF8yID0gIkFkZHJlc3MiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhST1dfRVhDRVBUSU9OU19LRVkgPSBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX1RIUk9XX0VYQ0VQVElPTlM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUVfMiA9ICEgVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBVklOR19MQVpZX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfV0VBVklOR19MQVpZOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0xBWllfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0xBWllfVEVTVF9WQUxVRV8yID0gISBXRUFWSU5HX0xBWllfVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfV0VBVklOR19DSEFOR0VfVFJBQ0tJTkc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfVEVTVF9WQUxVRV8yID0gISBXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19URVNUX1ZBTFVFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBVklOR19GRVRDSF9HUk9VUFNfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19XRUFWSU5HX0ZFVENIX0dST1VQUzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV0VBVklOR19GRVRDSF9HUk9VUFNfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0ZFVENIX0dST1VQU19URVNUX1ZBTFVFXzIgPSAhIFdFQVZJTkdfRkVUQ0hfR1JPVVBTX1RFU1RfVkFMVUU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0lOVEVSTkFMX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfV0VBVklOR19JTlRFUk5BTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV0VBVklOR19JTlRFUk5BTF9URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFdFQVZJTkdfSU5URVJOQUxfVEVTVF9WQUxVRV8yID0gISBXRUFWSU5HX0lOVEVSTkFMX1RFU1RfVkFMVUU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0VBR0VSX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfV0VBVklOR19FQUdFUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV0VBVklOR19FQUdFUl9URVNUX1ZBTFVFID0gdHJ1ZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV0VBVklOR19FQUdFUl9URVNUX1ZBTFVFXzIgPSAhIFdFQVZJTkdfRUFHRVJfVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fT05MWV9LRVkgPSBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX1ZBTElEQVRJT05fT05MWTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVkFMSURBVElPTl9PTkxZX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVkFMSURBVElPTl9PTkxZX1RFU1RfVkFMVUVfMiA9ICEgVkFMSURBVElPTl9PTkxZX1RFU1RfVkFMVUU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFURV9TQ0hFTUFfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19WQUxJREFURV9TQ0hFTUE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFZBTElEQVRFX1NDSEVNQV9URVNUX1ZBTFVFID0gdHJ1ZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVkFMSURBVEVfU0NIRU1BX1RFU1RfVkFMVUVfMiA9ICEgVkFMSURBVEVfU0NIRU1BX1RFU1RfVkFMVUU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9DVVNUT01JWkVSX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfU0VTU0lPTl9DVVNUT01JWkVSOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0NVU1RPTUlaRVJfVEVTVF9WQUxVRSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9DVVNUT01JWkVSX1RFU1RfVkFMVUVfMiA9ICJqYXZhLmxhbmcuQm9vbGVhbiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfV0VBVklORzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFdlYXZpbmcgV0VBVklOR19URVNUX1ZBTFVFID0gV2VhdmluZy5mYWxzZV87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBXZWF2aW5nIFdFQVZJTkdfVEVTVF9WQUxVRV8yID0gV2VhdmluZy5zdGF0aWNfOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NSVpFUl9LRVkgPSBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUiArIEVOVElUWV9URVNUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTUlaRVJfVEVTVF9WQUxVRSA9ICJhY21lLnNlc3Npb25zLkRlc2NyaXB0b3JDdXN0b21pemVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01JWkVSX1RFU1RfVkFMVUVfMiA9ICJhY21lLnNlc3Npb25zLkN1c3RvbWl6ZXIiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVSX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfUFJPRklMRVI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvZmlsZXIgUFJPRklMRVJfVEVTVF9WQUxVRSA9IFByb2ZpbGVyLnF1ZXJ5X21vbml0b3I7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVSX1RFU1RfVkFMVUVfMiA9ICJjdXN0b20ucHJvZmlsZXIudGVzdCI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDRVBUSU9OX0hBTkRMRVJfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19FWENFUFRJT05fSEFORExFUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05fSEFORExFUl9URVNUX1ZBTFVFID0gImFjbWUuQ3VzdG9tU2Vzc2lvbkV2ZW50TGlzdGVuZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTl9IQU5ETEVSX1RFU1RfVkFMVUVfMiA9ICJvcmFjbGUuc2Vzc2lvbnMuQ3VzdG9tU2Vzc2lvbkV2ZW50TGlzdGVuZXIiOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24gPSB0aGlzLnN1YmplY3QuZ2V0Q3VzdG9taXphdGlvbigpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQkKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5USFJPV19FWENFUFRJT05TX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0xBWllfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLldFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0ZFVENIX0dST1VQU19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uV0VBVklOR19JTlRFUk5BTF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uV0VBVklOR19FQUdFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uV0VBVklOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uVkFMSURBVElPTl9PTkxZX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5WQUxJREFURV9TQ0hFTUFfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uRW50aXR5LkRFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uU0VTU0lPTl9DVVNUT01JWkVSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5QUk9GSUxFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uRVhDRVBUSU9OX0hBTkRMRVJfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCi0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBzZXNzaW9uQ3VzdG9taXplcnNDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTZXNzaW9uQ3VzdG9taXplcnNDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkTGlzdENoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uU0VTU0lPTl9DVVNUT01JWkVSX0xJU1QsIHNlc3Npb25DdXN0b21pemVyc0NoYW5nZUxpc3RlbmVyKTsKLQkJCi0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBlbnRpdGllc0NoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZEVudGl0aWVzQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLkVOVElUSUVTX0xJU1QsIGVudGl0aWVzQ2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDEzOwotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsICsgNDsgLy8gNCBtaXNjIHByb3BlcnRpZXMKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7Ci0JCQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjEiLCAidmFsdWUuMSIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFRIUk9XX0VYQ0VQVElPTlNfS0VZLCBUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoV0VBVklOR19MQVpZX0tFWSwgV0VBVklOR19MQVpZX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfS0VZLCBXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFdFQVZJTkdfRkVUQ0hfR1JPVVBTX0tFWSwgV0VBVklOR19GRVRDSF9HUk9VUFNfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShXRUFWSU5HX0lOVEVSTkFMX0tFWSwgV0VBVklOR19JTlRFUk5BTF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFdFQVZJTkdfRUFHRVJfS0VZLCBXRUFWSU5HX0VBR0VSX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVkFMSURBVElPTl9PTkxZX0tFWSwgVkFMSURBVElPTl9PTkxZX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVkFMSURBVEVfU0NIRU1BX0tFWSwgVkFMSURBVEVfU0NIRU1BX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMiIsICJ2YWx1ZS4yIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoU0VTU0lPTl9DVVNUT01JWkVSX0tFWSwgU0VTU0lPTl9DVVNUT01JWkVSX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoV0VBVklOR19LRVksIFdFQVZJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMyIsICJ2YWx1ZS4zIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuNCIsICJ2YWx1ZS40Iik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoQ1VTVE9NSVpFUl9LRVksIENVU1RPTUlaRVJfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoUFJPRklMRVJfS0VZLCBQUk9GSUxFUl9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShFWENFUFRJT05fSEFORExFUl9LRVksIEVYQ0VQVElPTl9IQU5ETEVSX1RFU1RfVkFMVUUpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gKioqKioqKioqKiBMaXN0ZW5lcnMgKioqKioqKioqKgotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkRW50aXRpZXNDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQkJRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uVGVzdHMudGhpcy5lbnRpdHlBZGRlZChlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uVGVzdHMudGhpcy5lbnRpdHlSZW1vdmVkKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZFNlc3Npb25DdXN0b21pemVyc0NoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy50aGlzLnNlc3Npb25DdXN0b21pemVyQWRkZWQoZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLnRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJSZW1vdmVkKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLnRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJSZXBsYWNlZChlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy50aGlzLnNlc3Npb25DdXN0b21pemVyTGlzdENsZWFyZWQoZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNsZWFyRXZlbnQoKSB7Ci0JCXN1cGVyLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5lbnRpdGllc0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXNzaW9uQ3VzdG9taXplcnNFdmVudCA9IG51bGw7Ci0JfQotCi0Jdm9pZCBlbnRpdHlBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQl0aGlzLmVudGl0aWVzRXZlbnQgPSBlOwotCX0KLQotCXZvaWQgZW50aXR5UmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQl0aGlzLmVudGl0aWVzRXZlbnQgPSBlOwotCX0KLQotCXZvaWQgc2Vzc2lvbkN1c3RvbWl6ZXJBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQl0aGlzLnNlc3Npb25DdXN0b21pemVyc0V2ZW50ID0gZTsKLQl9Ci0KLQl2b2lkIHNlc3Npb25DdXN0b21pemVyUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQl0aGlzLnNlc3Npb25DdXN0b21pemVyc0V2ZW50ID0gZTsKLQl9Ci0KLQl2b2lkIHNlc3Npb25DdXN0b21pemVyUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCXRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQgPSBlOwotCX0KLQotCXZvaWQgc2Vzc2lvbkN1c3RvbWl6ZXJMaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCXRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQgPSBlOwotCX0KLQotCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5USFJPV19FWENFUFRJT05TX1BST1BFUlRZKSkKLQkJCXRoaXMuY3VzdG9taXphdGlvbi5zZXRUaHJvd0V4Y2VwdGlvbnMoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLldFQVZJTkdfTEFaWV9QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0V2VhdmluZ0xhenkoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLldFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZKSkKLQkJCXRoaXMuY3VzdG9taXphdGlvbi5zZXRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLldFQVZJTkdfRkVUQ0hfR1JPVVBTX1BST1BFUlRZKSkKLQkJCXRoaXMuY3VzdG9taXphdGlvbi5zZXRXZWF2aW5nRmV0Y2hHcm91cHMoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLldFQVZJTkdfSU5URVJOQUxfUFJPUEVSVFkpKQotCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFdlYXZpbmdJbnRlcm5hbCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19FQUdFUl9QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0V2VhdmluZ0VhZ2VyKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5WQUxJREFUSU9OX09OTFlfUFJPUEVSVFkpKQotCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFZhbGlkYXRpb25Pbmx5KChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5WQUxJREFURV9TQ0hFTUFfUFJPUEVSVFkpKQotCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFZhbGlkYXRlU2NoZW1hKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5FWENFUFRJT05fSEFORExFUl9QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0RXhjZXB0aW9uSGFuZGxlcigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfUFJPUEVSVFkpKQotCQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFNlc3Npb25DdXN0b21pemVyKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLldFQVZJTkdfUFJPUEVSVFkpKQotCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFdlYXZpbmcoKFdlYXZpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlBST0ZJTEVSX1BST1BFUlRZKSkgewotCQkJaWYgKG5ld1ZhbHVlLmdldENsYXNzKCkuaXNFbnVtKCkpCi0JCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFByb2ZpbGVyKChQcm9maWxlcikgbmV3VmFsdWUpOwotCQkJZWxzZQotCQkJCXRoaXMuY3VzdG9taXphdGlvbi5zZXRQcm9maWxlcigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFRocm93RXhjZXB0aW9ucygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFdlYXZpbmcoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLldFQVZJTkdfTEFaWV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFdlYXZpbmdMYXp5KCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFdlYXZpbmdDaGFuZ2VUcmFja2luZygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19GRVRDSF9HUk9VUFNfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY3VzdG9taXphdGlvbi5nZXRXZWF2aW5nRmV0Y2hHcm91cHMoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLldFQVZJTkdfSU5URVJOQUxfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY3VzdG9taXphdGlvbi5nZXRXZWF2aW5nSW50ZXJuYWwoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLldFQVZJTkdfRUFHRVJfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY3VzdG9taXphdGlvbi5nZXRXZWF2aW5nRWFnZXIoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlZBTElEQVRJT05fT05MWV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFZhbGlkYXRpb25Pbmx5KCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5WQUxJREFURV9TQ0hFTUFfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY3VzdG9taXphdGlvbi5nZXRWYWxpZGF0ZVNjaGVtYSgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uRVhDRVBUSU9OX0hBTkRMRVJfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY3VzdG9taXphdGlvbi5nZXRFeGNlcHRpb25IYW5kbGVyKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5QUk9GSUxFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFByb2ZpbGVyKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfUFJPUEVSVFkpKSB7Ci0JCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuY3VzdG9taXphdGlvbi5nZXRTZXNzaW9uQ3VzdG9taXplcnMoKS5pdGVyYXRvcigpOwotCQkJaWYoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJbW9kZWxWYWx1ZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb25FbnRpdHkuREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihFTlRJVFlfVEVTVCk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigiZ2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gbW9kZWxWYWx1ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UHV0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlPYmplY3QgZXhwZWN0ZWRWYWx1ZV8gPSBleHBlY3RlZFZhbHVlOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlBST0ZJTEVSX1BST1BFUlRZKSkgewotCQkJCi0JCQlleHBlY3RlZFZhbHVlXyA9IChleHBlY3RlZFZhbHVlICE9IG51bGwgJiYgZXhwZWN0ZWRWYWx1ZS5nZXRDbGFzcygpLmlzRW51bSgpKSA/Ci0JCQkJdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoUFJPRklMRVJfVEVTVF9WQUxVRSkgOiAvLyBtb2RlbCBpcyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUKLQkJCQlleHBlY3RlZFZhbHVlOwotCQl9Ci0JCXN1cGVyLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgZXhwZWN0ZWRWYWx1ZV8pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemF0aW9uOwotCX0KLQotCS8vICoqKioqKioqKiogZW50aXRpZXMgbGlzdCAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdEVudGl0aWVzTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBhZGQKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRFbnRpdHkoRU5USVRZX1RFU1RfMik7Ci0JCQotCQkvLyB2ZXJpZnkgZXZlbnQgcmVjZWl2ZWQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gRXZlbnQgRmlyZWQuIiwgdGhpcy5lbnRpdGllc0V2ZW50KTsKLQkJLy8gdmVyaWZ5IGV2ZW50IGZvciB0aGUgZXhwZWN0ZWQgcHJvcGVydHkKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBFdmVudC4iLCB0aGlzLmVudGl0aWVzRXZlbnQuZ2V0TGlzdE5hbWUoKSwgQ3VzdG9taXphdGlvbi5FTlRJVElFU19MSVNUKTsKLQkJCi0JCS8vIHJlbW92ZQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLnJlbW92ZUVudGl0eShFTlRJVFlfVEVTVF8yKTsKLQkJCi0JCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAotCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLmVudGl0aWVzRXZlbnQpOwotCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMuZW50aXRpZXNFdmVudC5nZXRMaXN0TmFtZSgpLCBDdXN0b21pemF0aW9uLkVOVElUSUVTX0xJU1QpOwotCX0KLQotCS8vICoqKioqKioqKiogc2Vzc2lvbkN1c3RvbWl6ZXJzIGxpc3QgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXNzaW9uQ3VzdG9taXplcnNMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIGFkZAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IHRoaXMuY3VzdG9taXphdGlvbi5hZGRTZXNzaW9uQ3VzdG9taXplcihTRVNTSU9OX0NVU1RPTUlaRVJfVEVTVF9WQUxVRV8yKTsKLQkJCi0JCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAotCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLnNlc3Npb25DdXN0b21pemVyc0V2ZW50KTsKLQkJLy8gdmVyaWZ5IGV2ZW50IGZvciB0aGUgZXhwZWN0ZWQgcHJvcGVydHkKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBFdmVudC4iLCB0aGlzLnNlc3Npb25DdXN0b21pemVyc0V2ZW50LmdldExpc3ROYW1lKCksIEN1c3RvbWl6YXRpb24uU0VTU0lPTl9DVVNUT01JWkVSX0xJU1QpOwotCQkKLQkJLy8gcmVtb3ZlCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQkKLQkJdGhpcy5jdXN0b21pemF0aW9uLnJlbW92ZVNlc3Npb25DdXN0b21pemVyKGNsYXNzTmFtZSk7Ci0JCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAotCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLnNlc3Npb25DdXN0b21pemVyc0V2ZW50KTsKLQkJLy8gdmVyaWZ5IGV2ZW50IGZvciB0aGUgZXhwZWN0ZWQgcHJvcGVydHkKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBFdmVudC4iLCB0aGlzLnNlc3Npb25DdXN0b21pemVyc0V2ZW50LmdldExpc3ROYW1lKCksIEN1c3RvbWl6YXRpb24uU0VTU0lPTl9DVVNUT01JWkVSX0xJU1QpOwotCX0KLQotCS8vICoqKioqKioqKiogVGhyb3dFeGNlcHRpb25zIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGhyb3dFeGNlcHRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVRIUk9XX0VYQ0VQVElPTlNfS0VZLAotCQkJVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVRIUk9XX0VYQ0VQVElPTlNfS0VZLAotCQkJVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFLAotCQkJVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVUaHJvd0V4Y2VwdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVRIUk9XX0VYQ0VQVElPTlNfS0VZLAotCQkJVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFLAotCQkJVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogV2VhdmluZ0xhenkgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRXZWF2aW5nTGF6eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlXRUFWSU5HX0xBWllfS0VZLAotCQkJV0VBVklOR19MQVpZX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJV0VBVklOR19MQVpZX0tFWSwKLQkJCVdFQVZJTkdfTEFaWV9URVNUX1ZBTFVFLAotCQkJV0VBVklOR19MQVpZX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVdlYXZpbmdMYXp5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlXRUFWSU5HX0xBWllfS0VZLAotCQkJV0VBVklOR19MQVpZX1RFU1RfVkFMVUUsCi0JCQlXRUFWSU5HX0xBWllfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFdlYXZpbmdDaGFuZ2VUcmFja2luZyB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFdlYXZpbmdDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19LRVksCi0JCQlXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX0tFWSwKLQkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUUsCi0JCQlXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVXZWF2aW5nQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX0tFWSwKLQkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUUsCi0JCQlXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogV2VhdmluZ0ZldGNoR3JvdXBzIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0V2VhdmluZ0ZldGNoR3JvdXBzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVdFQVZJTkdfRkVUQ0hfR1JPVVBTX0tFWSwKLQkJCVdFQVZJTkdfRkVUQ0hfR1JPVVBTX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfS0VZLAotCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfRkVUQ0hfR1JPVVBTX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVdlYXZpbmdGZXRjaEdyb3VwcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfS0VZLAotCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfRkVUQ0hfR1JPVVBTX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXZWF2aW5nSW50ZXJuYWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRXZWF2aW5nSW50ZXJuYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJV0VBVklOR19JTlRFUk5BTF9LRVksCi0JCQlXRUFWSU5HX0lOVEVSTkFMX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJV0VBVklOR19JTlRFUk5BTF9LRVksCi0JCQlXRUFWSU5HX0lOVEVSTkFMX1RFU1RfVkFMVUUsCi0JCQlXRUFWSU5HX0lOVEVSTkFMX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVdlYXZpbmdJbnRlcm5hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJV0VBVklOR19JTlRFUk5BTF9LRVksCi0JCQlXRUFWSU5HX0lOVEVSTkFMX1RFU1RfVkFMVUUsCi0JCQlXRUFWSU5HX0lOVEVSTkFMX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXZWF2aW5nRWFnZXIgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRXZWF2aW5nRWFnZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJV0VBVklOR19FQUdFUl9LRVksCi0JCQlXRUFWSU5HX0VBR0VSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJV0VBVklOR19FQUdFUl9LRVksCi0JCQlXRUFWSU5HX0VBR0VSX1RFU1RfVkFMVUUsCi0JCQlXRUFWSU5HX0VBR0VSX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVdlYXZpbmdFYWdlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJV0VBVklOR19FQUdFUl9LRVksCi0JCQlXRUFWSU5HX0VBR0VSX1RFU1RfVkFMVUUsCi0JCQlXRUFWSU5HX0VBR0VSX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBTZXNzaW9uQ3VzdG9taXplciB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFNlc3Npb25DdXN0b21pemVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNFU1NJT05fQ1VTVE9NSVpFUl9LRVksCi0JCQlTRVNTSU9OX0NVU1RPTUlaRVJfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0U2Vzc2lvbkN1c3RvbWl6YXRpb25Qcm9wZXJ0eSgKLQkJCUN1c3RvbWl6YXRpb24uU0VTU0lPTl9DVVNUT01JWkVSX1BST1BFUlRZLAotCQkJU0VTU0lPTl9DVVNUT01JWkVSX0tFWSwKLQkJCVNFU1NJT05fQ1VTVE9NSVpFUl9URVNUX1ZBTFVFLAotCQkJU0VTU0lPTl9DVVNUT01JWkVSX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNlc3Npb25DdXN0b21pemVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlU2Vzc2lvbkN1c3RvbWl6YXRpb25Qcm9wZXJ0eSgKLQkJCUN1c3RvbWl6YXRpb24uU0VTU0lPTl9DVVNUT01JWkVSX1BST1BFUlRZLAotCQkJU0VTU0lPTl9DVVNUT01JWkVSX0tFWSwKLQkJCVNFU1NJT05fQ1VTVE9NSVpFUl9URVNUX1ZBTFVFLAotCQkJU0VTU0lPTl9DVVNUT01JWkVSX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXZWF2aW5nIHRlc3RzICoqKioqKioqKioKLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIFdlYXZpbmcgcHJvcGVydHkgYnkgdGhlIEN1c3RvbWl6YXRpb24gYWRhcHRlciB3aGVuCi0JICogdGhlIFBVIG9yIHRoZSBtb2RlbCBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTZXRXZWF2aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVdFQVZJTkdfS0VZLAotCQkJV0VBVklOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVdFQVZJTkdfS0VZLAotCQkJV0VBVklOR19URVNUX1ZBTFVFLAotCQkJV0VBVklOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVXZWF2aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlXRUFWSU5HX0tFWSwKLQkJCVdFQVZJTkdfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Pbmx5IHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsaWRhdGlvbk9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVkFMSURBVElPTl9PTkxZX0tFWSwKLQkJCVZBTElEQVRJT05fT05MWV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVZBTElEQVRJT05fT05MWV9LRVksCi0JCQlWQUxJREFUSU9OX09OTFlfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fT05MWV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVWYWxpZGF0aW9uT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJVkFMSURBVElPTl9PTkxZX0tFWSwKLQkJCVZBTElEQVRJT05fT05MWV9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9PTkxZX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0ZVNjaGVtYSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbGlkYXRlU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVZBTElEQVRFX1NDSEVNQV9LRVksCi0JCQlWQUxJREFURV9TQ0hFTUFfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlWQUxJREFURV9TQ0hFTUFfS0VZLAotCQkJVkFMSURBVEVfU0NIRU1BX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFURV9TQ0hFTUFfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVmFsaWRhdGVTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVZBTElEQVRFX1NDSEVNQV9LRVksCi0JCQlWQUxJREFURV9TQ0hFTUFfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRFX1NDSEVNQV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogRXhjZXB0aW9uSGFuZGxlciB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEV4Y2VwdGlvbkhhbmRsZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJRVhDRVBUSU9OX0hBTkRMRVJfS0VZLAotCQkJRVhDRVBUSU9OX0hBTkRMRVJfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlFWENFUFRJT05fSEFORExFUl9LRVksCi0JCQlFWENFUFRJT05fSEFORExFUl9URVNUX1ZBTFVFLAotCQkJRVhDRVBUSU9OX0hBTkRMRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlRXhjZXB0aW9uSGFuZGxlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJRVhDRVBUSU9OX0hBTkRMRVJfS0VZLAotCQkJRVhDRVBUSU9OX0hBTkRMRVJfVEVTVF9WQUxVRSwKLQkJCUVYQ0VQVElPTl9IQU5ETEVSX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDdXN0b21pemF0aW9uIGNsYXNzICoqKioqKioqKioKLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIEN1c3RvbWl6YXRpb24gcHJvcGVydHkgYnkgdGhlIEN1c3RvbWl6YXRpb24gYWRhcHRlciB3aGVuIHRoZQotCSAqIFBVIG9yIHRoZSBtb2RlbCBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTZXRDdXN0b21pemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUNVU1RPTUlaRVJfS0VZLAotCQkJQ1VTVE9NSVpFUl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRDdXN0b21pemF0aW9uUHJvcGVydHkoCi0JCQlDdXN0b21pemF0aW9uRW50aXR5LkRFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSwKLQkJCUNVU1RPTUlaRVJfS0VZLAotCQkJQ1VTVE9NSVpFUl9URVNUX1ZBTFVFLAotCQkJQ1VTVE9NSVpFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVDdXN0b21pemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlQ3VzdG9taXphdGlvblByb3BlcnR5KAotCQkJQ3VzdG9taXphdGlvbkVudGl0eS5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFksCi0JCQlDVVNUT01JWkVSX0tFWSwKLQkJCUNVU1RPTUlaRVJfVEVTVF9WQUxVRSwKLQkJCUNVU1RPTUlaRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBQcm9maWxlciB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFByb2ZpbGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVBST0ZJTEVSX0tFWSwKLQkJCXRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKFBST0ZJTEVSX1RFU1RfVkFMVUUpKTsgLy8gbW9kZWwgaXMgc3RvcmluZyBFY2xpcHNlTGlua1N0cmluZ1ZhbHVlCi0JCS8vIHZlcmlmeSBzZXQgZW51bSB2YWx1ZQotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJUFJPRklMRVJfS0VZLAotCQkJUFJPRklMRVJfVEVTVF9WQUxVRSwKLQkJCVBST0ZJTEVSX1RFU1RfVkFMVUVfMik7Ci0JCS8vIHZlcmlmeSBzZXQgY3VzdG9tIGFuZCBsaXRlcmFsIHZhbHVlCi0JCXRoaXMudmVyaWZ5U2V0UHJvZmlsZXIoCi0JCQlQUk9GSUxFUl9LRVksCi0JCQlQUk9GSUxFUl9URVNUX1ZBTFVFLAotCQkJUFJPRklMRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUHJvZmlsZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVBST0ZJTEVSX0tFWSwKLQkJCVBST0ZJTEVSX1RFU1RfVkFMVUUsCi0JCQlQUk9GSUxFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvKioKLQkgKiBWZXJpZmllcyBzZXR0aW5nIGN1c3RvbSBwcm9maWxlciBhbmQgbGl0ZXJhbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2V0UHJvZmlsZXIoU3RyaW5nIGVsS2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KTsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0TW9kZWwoKS5wcm9wZXJ0eUlkT2YocHJvcGVydHkpOwotCQkvLyB0ZXN0IHNldCBjdXN0b20gcHJvZmlsZXIuCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMik7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUyKTsKLQotCQkvLyB0ZXN0IHNldCAoUHJvZmlsZXIpIG51bGwKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5zZXRQcm9maWxlcigoUHJvZmlsZXIpIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOwotCQkKLQkJLy8gdGVzdCBzZXQgZW51bSBsaXRlcmFsCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMS50b1N0cmluZygpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KSk7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZih0ZXN0VmFsdWUxKSk7Ci0KLQkJLy8gdGVzdCBzZXQgKFN0cmluZykgbnVsbAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFByb2ZpbGVyKChTdHJpbmcpIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOwotCX0KLQotCi0KLQkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCi0KLQkvLyAqKioqKioqKioqIHZlcmlmeSBTZXNzaW9uQ3VzdG9taXplciBwcm9wZXJ0eSAqKioqKioqKioqCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2V0U2Vzc2lvbkN1c3RvbWl6YXRpb25Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBSZXBsYWNlCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCB0ZXN0VmFsdWUyLCB0cnVlKTsgCi0JCXRoaXMucHJvcGVydGllc1RvdGFsKys7Ci0JCXRoaXMudmVyaWZ5UHV0U2Vzc2lvbkN1c3RvbWl6ZXJQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTEpOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5QWRkUmVtb3ZlU2Vzc2lvbkN1c3RvbWl6YXRpb25Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBSZW1vdmUKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCS0tdGhpcy5wcm9wZXJ0aWVzVG90YWw7Ci0JCS0tdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOwotCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnJlbW92ZVByb3BlcnR5KGtleSwgKFN0cmluZykgdGVzdFZhbHVlMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY3VzdG9taXphdGlvbi5zZXNzaW9uQ3VzdG9taXplckV4aXN0cyhrZXkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSwgdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgLSAxKTsKLQkJCi0JCS8vIEFkZCBvcmlnaW5hbCBQcm9wZXJ0eQotCQkrK3RoaXMucHJvcGVydGllc1RvdGFsOwotCQkrK3RoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShrZXksIHRlc3RWYWx1ZTEsIHRydWUpOyAKLQkJdGhpcy52ZXJpZnlQdXRTZXNzaW9uQ3VzdG9taXplclByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UHV0U2Vzc2lvbkN1c3RvbWl6ZXJQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAotCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLnNlc3Npb25DdXN0b21pemVyc0V2ZW50KTsKLQkJdGhpcy52ZXJpZnlTZXNzaW9uQ3VzdG9taXplckV2ZW50KHByb3BlcnR5TmFtZSwgZXhwZWN0ZWRWYWx1ZSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2Vzc2lvbkN1c3RvbWl6ZXJFdmVudChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHZlcmlmeSBldmVudCB2YWx1ZQotCQlFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24gY3VzdG9taXphdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24pIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQuZ2V0U291cmNlKCk7Ci0JCWFzc2VydFRydWUoY3VzdG9taXphdGlvbi5zZXNzaW9uQ3VzdG9taXplckV4aXN0cygoU3RyaW5nKSBleHBlY3RlZFZhbHVlKSk7Ci0JCSByZXR1cm47Ci0JfQotCQotCS8vICoqKioqKioqKiogdmVyaWZ5IGVudGl0eSBwcm9wZXJ0eSAqKioqKioqKioqCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2V0Q3VzdG9taXphdGlvblByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBrZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFJlcGxhY2UKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShrZXksIHRlc3RWYWx1ZTIpOwotCQl0aGlzLnZlcmlmeVB1dEN1c3RvbWl6YXRpb25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIEVOVElUWV9URVNULCB0ZXN0VmFsdWUyKTsKLQkJCi0JCS8vIFJlcGxhY2UgYnkgc2V0dGluZyBtb2RlbCBvYmplY3QKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2V0Q3VzdG9taXphdGlvblByb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTEpOwotCQl0aGlzLnZlcmlmeVB1dEN1c3RvbWl6YXRpb25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIEVOVElUWV9URVNULCB0ZXN0VmFsdWUxKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlBZGRSZW1vdmVDdXN0b21pemF0aW9uUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGtleSwgT2JqZWN0IHRlc3RWYWx1ZTEsIE9iamVjdCB0ZXN0VmFsdWUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gUmVtb3ZlCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQktLXRoaXMucHJvcGVydGllc1RvdGFsOwotCQktLXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZTsKLQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5yZW1vdmVQcm9wZXJ0eShrZXkpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoa2V5KSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vZGVsUHJvcGVydGllc1NpemUsIHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsIC0gMSk7Ci0JCXRoaXMudmVyaWZ5UHV0Q3VzdG9taXphdGlvblByb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIG51bGwpOwotCQkKLQkJLy8gQWRkIG9yaWdpbmFsIFByb3BlcnR5Ci0JCSsrdGhpcy5wcm9wZXJ0aWVzVG90YWw7Ci0JCSsrdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KGtleSwgdGVzdFZhbHVlMSk7Ci0JCXRoaXMudmVyaWZ5UHV0Q3VzdG9taXphdGlvblByb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTEpOwotCQkKLQkJLy8gUmVwbGFjZQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KGtleSwgdGVzdFZhbHVlMik7Ci0JCXRoaXMudmVyaWZ5UHV0Q3VzdG9taXphdGlvblByb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVB1dEN1c3RvbWl6YXRpb25Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgZW50aXR5TmFtZSwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUV2ZW50KHByb3BlcnR5TmFtZSk7Ci0JCXRoaXMudmVyaWZ5Q3VzdG9taXphdGlvbkV2ZW50KHByb3BlcnR5TmFtZSwgZW50aXR5TmFtZSwgZXhwZWN0ZWRWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5Q3VzdG9taXphdGlvbkV2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBlbnRpdHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHZlcmlmeSBldmVudCB2YWx1ZQotCQlDdXN0b21pemF0aW9uRW50aXR5IGVudGl0eSA9IChDdXN0b21pemF0aW9uRW50aXR5KSB0aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb25FbnRpdHkuREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZKSkgewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIGVudGl0eS5nZXRQYXJlbnQoKS5nZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKGVudGl0eU5hbWUpKTsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihlbnRpdHlOYW1lKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInZlcmlmeUN1c3RvbWl6YXRpb25FdmVudCIsIHByb3BlcnR5TmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDdXN0b21pemF0aW9uUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGVudGl0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbkVudGl0eS5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFkpKQotCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldERlc2NyaXB0b3JDdXN0b21pemVyT2YoZW50aXR5TmFtZSwgKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldEN1c3RvbWl6YXRpb25Qcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmNhNGQxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnBsYXRmb3JtLkVjbGlwc2VMaW5rUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlIGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgc3ViamVjdDsKLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXI7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zdWJqZWN0ID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4odGhpcy5zdWJqZWN0KTsKLQkJdGhpcy5wb3B1bGF0ZVB1KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gc3VwZXIuYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5QTEFURk9STSwgRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzFfMCk7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIHN1cGVyLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM5YmQwYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmF2YUNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGVPcm1YbWwoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkRWNsaXBzZUxpbmtPcm1Db25maWcoVGVzdEpwYVByb2plY3QgdGVzdEpwYVByb2plY3QpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSAKLQkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwkJCi0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QQVRILCAKLQkJCQl0ZXN0SnBhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJzcmMvTUVUQS1JTkYiKS5nZXRGdWxsUGF0aCgpKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX1BFUlNJU1RFTkNFX1VOSVQsIEJvb2xlYW4uRkFMU0UpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRWNsaXBzZUxpbmtJbXBsaWVkTWFwcGluZ0ZpbGVSZWYxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gdGVzdCB0aGF0IHRoZXJlIGlzIG9uZSBpbml0aWFsbHkKLQkJSnBhWG1sUmVzb3VyY2UgZWNsaXBzZUxpbmtPcm1SZXNvdXJjZSA9IGdldE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydFRydWUoZWNsaXBzZUxpbmtPcm1SZXNvdXJjZS5maWxlRXhpc3RzKCkpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGVjbGlwc2VsaW5rLW9ybS54bWwKLQkJZGVsZXRlUmVzb3VyY2UoZWNsaXBzZUxpbmtPcm1SZXNvdXJjZSk7Ci0JCQotCQlhc3NlcnRGYWxzZShlY2xpcHNlTGlua09ybVJlc291cmNlLmZpbGVFeGlzdHMoKSk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVFY2xpcHNlTGlua0ltcGxpZWRNYXBwaW5nRmlsZVJlZjIoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgdGhlcmUgaXMgb25lIGluaXRpYWxseQotCQlKcGFYbWxSZXNvdXJjZSBlY2xpcHNlTGlua09ybVJlc291cmNlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0VHJ1ZShlY2xpcHNlTGlua09ybVJlc291cmNlLmZpbGVFeGlzdHMoKSk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JCQotCQkvLyBhZGQgc3BlY2lmaWVkIGVjbGlwc2VsaW5rLW9ybS54bWwKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgeG1sTWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCXhtbE1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKCJNRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIik7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5hZGQoeG1sTWFwcGluZ0ZpbGVSZWYpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKSkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShlY2xpcHNlTGlua09ybVJlc291cmNlLmZpbGVFeGlzdHMoKSk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVFY2xpcHNlTGlua0ltcGxpZWRNYXBwaW5nRmlsZVJlZjMoKSB7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gdGVzdCB0aGF0IHRoZXJlIGlzIG9uZSBpbml0aWFsbHkKLQkJSnBhWG1sUmVzb3VyY2UgZWNsaXBzZUxpbmtPcm1SZXNvdXJjZSA9IGdldE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydFRydWUoZWNsaXBzZUxpbmtPcm1SZXNvdXJjZS5maWxlRXhpc3RzKCkpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmKCkpOwotCQkKLQkJLy8gaWdub3JlIGluIHBlcnNpc3RlbmNlIHVuaXQKLQkJcGVyc2lzdGVuY2VVbml0LmdldEdlbmVyYWxQcm9wZXJ0aWVzKCkuc2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRUcnVlKGVjbGlwc2VMaW5rT3JtUmVzb3VyY2UuZmlsZUV4aXN0cygpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwcGluZ0ZpbGVSZWZzKCkgewotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJTGlzdEl0ZXJhdG9yPE1hcHBpbmdGaWxlUmVmPiBtYXBwaW5nRmlsZVJlZnMgPSBwZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVSZWZzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCksIG1hcHBpbmdGaWxlUmVmcy5uZXh0KCkuZ2V0TWFwcGluZ0ZpbGUoKS5nZXRQYXJlbnQoKSk7Ci0JCWFzc2VydEVxdWFscyhwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKSwgbWFwcGluZ0ZpbGVSZWZzLm5leHQoKS5nZXRNYXBwaW5nRmlsZSgpLmdldFBhcmVudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwcGluZ0ZpbGVSZWZzU2l6ZSgpIHsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCWFzc2VydEVxdWFscygyLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVSZWZzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGVyc2lzdGVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZ2V0SnBhUHJvamVjdCgpLnNldERpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMoZmFsc2UpOwkKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQkvL3BlcnNpc3RlbnRUeXBlIG5vdCBsaXN0ZWQgaW4gcGVyc2lzdGVuY2UueG1sIGFuZCBkaXNjb3ZlckFubm90YXRlZENsYXNzZXMgaXMgZmFsc2UKLQkJLy9zdGlsbCBmaW5kIHRoZSBwZXJzaXN0ZW50VHlwZSBiZWNhdXNlIG9mIGNoYW5nZXMgZm9yIGJ1ZyAxOTAzMTcKLQkJYXNzZXJ0RmFsc2UoZ2V0SnBhUHJvamVjdCgpLmRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMoKSk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKLQkJCi0JCS8vdGVzdCBwZXJzaXN0ZW50VHlwZSBub3QgbGlzdGVkIGluIHBlcnNpc3RlbmNlLnhtbCwgZGlzY292ZXIgYW5ub3RhdGVkIGNsYXNzZXMgc2V0IHRvIHRydWUKLQkJZ2V0SnBhUHJvamVjdCgpLnNldERpc2NvdmVyc0Fubm90YXRlZENsYXNzZXModHJ1ZSk7CQotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSk7Ci0JCQotCQkvL3Rlc3QgcGVyc2lzdGVudFR5cGUgbGlzdCBhcyBjbGFzcyBpbiBwZXJzaXN0ZW5jZS54bWwKLQkJZ2V0SnBhUHJvamVjdCgpLnNldERpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMoZmFsc2UpOwotCQlYbWxKYXZhQ2xhc3NSZWYgY2xhc3NSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEphdmFDbGFzc1JlZigpOwotCQljbGFzc1JlZi5zZXRKYXZhQ2xhc3MoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldENsYXNzZXMoKS5hZGQoY2xhc3NSZWYpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSk7Ci0KLQkJCi0JCS8vdGVzdCBwZXJzaXN0ZW50VHlwZSBmcm9tIG9ybS54bWwgZmlsZSB0aGF0IGlzIHNwZWNpZmllZCBpbiB0aGUgcGVyc2lzdGVuY2UueG1sCi0JCWFkZFhtbE1hcHBpbmdGaWxlUmVmKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UGVyc2lzdGVudFR5cGUoIm1vZGVsLkZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRUeXBlLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UGVyc2lzdGVudFR5cGUoIm1vZGVsLkZvbyIpKTsKLQotCQkvL3Rlc3QgcGVyc2lzdGVudFR5cGUgZnJvbSBlY2xpcHNlbGluay1vcm0ueG1sIGZpbGUgdGhhdCBpcyBpbXBsaWVkKG5vdCBzcGVjaWZpZWQpIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRQZXJzaXN0ZW50VHlwZSgibW9kZWwuRm9vIikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyYWxQcm9wZXJ0aWVzQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmFsUHJvcGVydGllc0FkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGQwZTJmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyYWxQcm9wZXJ0aWVzQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5HZW5lcmFsUHJvcGVydGllczsKLQotLyoqCi0gKiAgR2VuZXJhbEFkYXB0ZXJUZXN0cwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmFsUHJvcGVydGllc0FkYXB0ZXJUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIEdlbmVyYWxQcm9wZXJ0aWVzIGdlbmVyYWxQcm9wZXJ0aWVzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fS0VZID0gR2VuZXJhbFByb3BlcnRpZXMuRUNMSVBTRUxJTktfRVhDTFVERV9FQ0xJUFNFTElOS19PUk07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIEVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRV8yID0gISBFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFOwotCi0JCi0JcHVibGljIEdlbmVyYWxQcm9wZXJ0aWVzQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuZ2VuZXJhbFByb3BlcnRpZXMgPSB0aGlzLnN1YmplY3QuZ2V0R2VuZXJhbFByb3BlcnRpZXMoKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJCi0JCXRoaXMuZ2VuZXJhbFByb3BlcnRpZXMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihHZW5lcmFsUHJvcGVydGllcy5FWENMVURFX0VDTElQU0VMSU5LX09STV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgPSAxOwotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsICsgMjsgLy8gbWlzYyBwcm9wZXJ0aWVzCi0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsOwotCQkKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4xIiwgInZhbHVlLjEiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShFWENMVURFX0VDTElQU0VMSU5LX09STV9LRVksIEVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMiIsICJ2YWx1ZS4yIik7Ci0KLQkJcmV0dXJuOwotCX0KLQotCQotCS8vICoqKioqKioqKiogRXhjbHVkZUVjbGlwc2VsaW5rT3JtIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX0tFWSwKLQkJCUVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fS0VZLAotCQkJRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRSwKLQkJCUVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fS0VZLAotCQkJRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRSwKLQkJCUVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0KLQotCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEdlbmVyYWxQcm9wZXJ0aWVzLkVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLmdldEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImdldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIG1vZGVsVmFsdWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoR2VuZXJhbFByb3BlcnRpZXMuRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fUFJPUEVSVFkpKQotCQkJdGhpcy5nZW5lcmFsUHJvcGVydGllcy5zZXRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5nZW5lcmFsUHJvcGVydGllczsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmFsUHJvcGVydGllc1ZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJhbFByb3BlcnRpZXNWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI3YTJhMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmFsUHJvcGVydGllc1ZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5HZW5lcmFsUHJvcGVydGllczsKLQotLyoqCi0gKiBHZW5lcmFsUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJhbFByb3BlcnRpZXNWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBHZW5lcmFsUHJvcGVydGllcyBnZW5lcmFsUHJvcGVydHk7Ci0KLQlwcml2YXRlIE1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZXhjbHVkZUVjbGlwc2VsaW5rT3JtSG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBleGNsdWRlRWNsaXBzZWxpbmtPcm1MaXN0ZW5lcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXhjbHVkZUVjbGlwc2VsaW5rT3JtRXZlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRSA9IEJvb2xlYW4uRkFMU0U7Ci0KLQlwdWJsaWMgR2VuZXJhbFByb3BlcnRpZXNWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5nZW5lcmFsUHJvcGVydHkgPSB0aGlzLnN1YmplY3QuZ2V0R2VuZXJhbFByb3BlcnRpZXMoKTsgLy8gU3ViamVjdAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhbFByb3BlcnRpZXM+IGdlbmVyYWxQcm9wZXJ0eUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhbFByb3BlcnRpZXM+KHRoaXMuZ2VuZXJhbFByb3BlcnR5KTsKLQkJCi0JCXRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtSG9sZGVyID0gdGhpcy5idWlsZEV4Y2x1ZGVFY2xpcHNlbGlua09ybUFBKGdlbmVyYWxQcm9wZXJ0eUhvbGRlcik7Ci0JCXRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRXhjbHVkZUVjbGlwc2VsaW5rT3JtQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtTGlzdGVuZXIpOwotCQl0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlBYnN0cmFjdE1vZGVsIHN1YmplY3RHZW5lcmFsUHJvcGVydHkgPSAoQWJzdHJhY3RNb2RlbCkgdGhpcy5nZW5lcmFsUHJvcGVydHk7IC8vIFN1YmplY3QKLQkJCi0JCVByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmFsUHJvcGVydGllcywgQm9vbGVhbj4gZXhjbHVkZUVjbGlwc2VsaW5rT3JtQUEgPSAKLQkJCShQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhbFByb3BlcnRpZXMsIEJvb2xlYW4+KSB0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUhvbGRlcjsKLQkJYXNzZXJ0VHJ1ZShleGNsdWRlRWNsaXBzZWxpbmtPcm1BQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZShzdWJqZWN0R2VuZXJhbFByb3BlcnR5Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEdlbmVyYWxQcm9wZXJ0aWVzLkVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZKSk7Ci0JCQotCQlleGNsdWRlRWNsaXBzZWxpbmtPcm1BQS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1MaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHN1YmplY3RHZW5lcmFsUHJvcGVydHkuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoR2VuZXJhbFByb3BlcnRpZXMuRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UoZXhjbHVkZUVjbGlwc2VsaW5rT3JtQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuIAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoCi0JCQlHZW5lcmFsUHJvcGVydGllcy5FQ0xJUFNFTElOS19FWENMVURFX0VDTElQU0VMSU5LX09STSwgCi0JCQlFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFKTsKLQkJcmV0dXJuOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5nZW5lcmFsUHJvcGVydHk7Ci0JfQotCi0JLy8gKioqKioqIEV4Y2x1ZGVFY2xpcHNlbGlua09ybSAqKioqKioqCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRXhjbHVkZUVjbGlwc2VsaW5rT3JtQUEoUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYWxQcm9wZXJ0aWVzPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYWxQcm9wZXJ0aWVzLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBHZW5lcmFsUHJvcGVydGllcy5FWENMVURFX0VDTElQU0VMSU5LX09STV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIGVudW1WYWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oZW51bVZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRFeGNsdWRlRWNsaXBzZWxpbmtPcm1DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUdlbmVyYWxQcm9wZXJ0aWVzVmFsdWVNb2RlbFRlc3RzLnRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCS8vICoqKioqKiBUZXN0cyAqKioqKioqIAotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJLy8gKioqKioqIEV4Y2x1ZGVFY2xpcHNlbGlua09ybSAqKioqKioqIAotCQl0aGlzLnZlcmlmeUV4Y2x1ZGVFY2xpcHNlbGlua09ybUFBVmFsdWUoRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhHZW5lcmFsUHJvcGVydGllcy5ERUZBVUxUX0VYQ0xVREVfRUNMSVBTRUxJTktfT1JNLCB0aGlzLmdlbmVyYWxQcm9wZXJ0eS5nZXREZWZhdWx0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyAqKioqKiogRXhjbHVkZUVjbGlwc2VsaW5rT3JtICoqKioqKiogCi0JCXRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtRXZlbnQgPSBudWxsOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJQm9vbGVhbiBuZXdFeGNsdWRlRWNsaXBzZWxpbmtPcm0gPSAhRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRTsKLQkJLy8gTW9kaWZ5IHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1Ib2xkZXIuc2V0VmFsdWUobmV3RXhjbHVkZUVjbGlwc2VsaW5rT3JtKTsKLQkJdGhpcy52ZXJpZnlFeGNsdWRlRWNsaXBzZWxpbmtPcm1BQVZhbHVlKG5ld0V4Y2x1ZGVFY2xpcHNlbGlua09ybSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1FdmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE51bGxWYWx1ZSgpIHsKLQkJU3RyaW5nIG5vdERlbGV0ZWQgPSAiUHJvcGVydHkgbm90IGRlbGV0ZWQiOwotCQkvLyAqKioqKiogRXhjbHVkZUVjbGlwc2VsaW5rT3JtICoqKioqKioKLQkJdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1FdmVudCA9IG51bGw7Ci0JCS8vIFNldHRpbmcgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJLy8gdGVzdGluZyBIb2xkZXIKLQkJdGhpcy52ZXJpZnlFeGNsdWRlRWNsaXBzZWxpbmtPcm1BQVZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtRXZlbnQpOwotCQkvLyB0ZXN0aW5nIFBVIHByb3BlcnRpZXMKLQkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KEdlbmVyYWxQcm9wZXJ0aWVzLkVDTElQU0VMSU5LX0VYQ0xVREVfRUNMSVBTRUxJTktfT1JNLCBub3REZWxldGVkKTsKLQl9Ci0KLQkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCi0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5RXhjbHVkZUVjbGlwc2VsaW5rT3JtQUFWYWx1ZShCb29sZWFuIHRlc3RWYWx1ZSkgewotCQl0aGlzLnZlcmlmeUFBVmFsdWUoCi0JCQl0ZXN0VmFsdWUsIAotCQkJdGhpcy5nZW5lcmFsUHJvcGVydHkuZ2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKCksIAotCQkJdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1Ib2xkZXIsIAotCQkJR2VuZXJhbFByb3BlcnRpZXMuRUNMSVBTRUxJTktfRVhDTFVERV9FQ0xJUFNFTElOS19PUk0pOwotCX0KLQotCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9KcHRFY2xpcHNlTGlua0NvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9KcHRFY2xpcHNlTGlua0NvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MjU0MjUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvSnB0RWNsaXBzZUxpbmtDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rQ29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGlua0NvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyYWxQcm9wZXJ0aWVzVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyYWxQcm9wZXJ0aWVzQWRhcHRlclRlc3RzLmNsYXNzKTsKLS8vCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29ubmVjdGlvblZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0Nvbm5lY3Rpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDdXN0b21pemF0aW9uVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENhY2hpbmdWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2FjaGluZ0FkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMb2dnaW5nVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExvZ2dpbmdBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3B0aW9uc1ZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcHRpb25zQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNjaGVtYUdlbmVyYXRpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2NoZW1hR2VuZXJhdGlvbkJhc2ljQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNjaGVtYUdlbmVyYXRpb25BZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBDb25uZWN0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBMb2dnaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBPcHRpb25zVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzJKcGFNZXRhZGF0YUNvbnZlcnNpb25UZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rQ29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0xvZ2dpbmdBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0xvZ2dpbmdBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI3MzYzOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9Mb2dnaW5nQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTG9nZ2luZ0xldmVsOwotCi0vKioKLSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgbW9kZWwgb2JqZWN0cyBieSB0aGUgTG9nZ2luZyBhZGFwdGVyIHdoZW4gdGhlCi0gKiBQZXJzaXN0ZW5jZVVuaXQgY2hhbmdlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTG9nZ2luZ0FkYXB0ZXJUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIExvZ2dpbmcgbG9nZ2luZzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFVkVMX0tFWSA9IExvZ2dpbmcuRUNMSVBTRUxJTktfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgTEVWRUxfVEVTVF9WQUxVRSA9IExvZ2dpbmdMZXZlbC5maW5lOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIExFVkVMX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5maW5lc3Q7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FU1RBTVBfS0VZID0gTG9nZ2luZy5FQ0xJUFNFTElOS19USU1FU1RBTVA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRJTUVTVEFNUF9URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRJTUVTVEFNUF9URVNUX1ZBTFVFXzIgPSAhIFRJTUVTVEFNUF9URVNUX1ZBTFVFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhSRUFEX0tFWSA9IExvZ2dpbmcuRUNMSVBTRUxJTktfVEhSRUFEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBUSFJFQURfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBUSFJFQURfVEVTVF9WQUxVRV8yID0gISBUSFJFQURfVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fS0VZID0gTG9nZ2luZy5FQ0xJUFNFTElOS19TRVNTSU9OOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBTRVNTSU9OX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gU0VTU0lPTl9URVNUX1ZBTFVFXzIgPSAhIFNFU1NJT05fVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTlNfS0VZID0gTG9nZ2luZy5FQ0xJUFNFTElOS19FWENFUFRJT05TOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBFWENFUFRJT05TX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gRVhDRVBUSU9OU19URVNUX1ZBTFVFXzIgPSAhIEVYQ0VQVElPTlNfVEVTVF9WQUxVRTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfRklMRV9MT0NBVElPTl9LRVkgPSBMb2dnaW5nLkVDTElQU0VMSU5LX0xPR19GSUxFX0xPQ0FUSU9OOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFID0gIkM6L3RlbXAiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFXzIgPSAiQzovdG1wIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dHRVJfS0VZID0gTG9nZ2luZy5FQ0xJUFNFTElOS19MT0dHRVI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUl9URVNUX1ZBTFVFID0gTG9nZ2VyLmphdmFfbG9nZ2VyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dHRVJfVEVTVF9WQUxVRV8yID0gImN1c3RvbS5sb2dnZXIudGVzdCI7Ci0JCi0JcHVibGljIExvZ2dpbmdBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5sb2dnaW5nID0gdGhpcy5zdWJqZWN0LmdldExvZ2dpbmcoKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJCi0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcuTEVWRUxfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nLlRJTUVTVEFNUF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcuVEhSRUFEX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZy5TRVNTSU9OX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZy5FWENFUFRJT05TX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZy5MT0dfRklMRV9MT0NBVElPTl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcuTE9HR0VSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDc7Ci0JCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyA0OyAvLyA0IG1pc2MgcHJvcGVydGllcwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMSIsICJ2YWx1ZS4xIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVElNRVNUQU1QX0tFWSwgVElNRVNUQU1QX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMiIsICJ2YWx1ZS4yIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTEVWRUxfS0VZLCBMRVZFTF9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4zIiwgInZhbHVlLjMiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShUSFJFQURfS0VZLCBUSFJFQURfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShTRVNTSU9OX0tFWSwgU0VTU0lPTl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KEVYQ0VQVElPTlNfS0VZLCBFWENFUFRJT05TX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuNCIsICJ2YWx1ZS40Iik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTE9HX0ZJTEVfTE9DQVRJT05fS0VZLCBMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShMT0dHRVJfS0VZLCBMT0dHRVJfVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldExldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUxFVkVMX0tFWSwKLQkJCUxFVkVMX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJTEVWRUxfS0VZLAotCQkJTEVWRUxfVEVTVF9WQUxVRSwKLQkJCUxFVkVMX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUxldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlMRVZFTF9LRVksCi0JCQlMRVZFTF9URVNUX1ZBTFVFLAotCQkJTEVWRUxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFRpbWVzdGFtcCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFRpbWVzdGFtcCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlUSU1FU1RBTVBfS0VZLAotCQkJVElNRVNUQU1QX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJVElNRVNUQU1QX0tFWSwKLQkJCVRJTUVTVEFNUF9URVNUX1ZBTFVFLAotCQkJVElNRVNUQU1QX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVRpbWVzdGFtcCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJVElNRVNUQU1QX0tFWSwKLQkJCVRJTUVTVEFNUF9URVNUX1ZBTFVFLAotCQkJVElNRVNUQU1QX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBUaHJlYWQgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRUaHJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVEhSRUFEX0tFWSwKLQkJCVRIUkVBRF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVRIUkVBRF9LRVksCi0JCQlUSFJFQURfVEVTVF9WQUxVRSwKLQkJCVRIUkVBRF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVUaHJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVRIUkVBRF9LRVksCi0JCQlUSFJFQURfVEVTVF9WQUxVRSwKLQkJCVRIUkVBRF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogU2Vzc2lvbiB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFNlc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJU0VTU0lPTl9LRVksCi0JCQlTRVNTSU9OX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJU0VTU0lPTl9LRVksCi0JCQlTRVNTSU9OX1RFU1RfVkFMVUUsCi0JCQlTRVNTSU9OX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNlc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVNFU1NJT05fS0VZLAotCQkJU0VTU0lPTl9URVNUX1ZBTFVFLAotCQkJU0VTU0lPTl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogRXhjZXB0aW9ucyB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEV4Y2VwdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJRVhDRVBUSU9OU19LRVksCi0JCQlFWENFUFRJT05TX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJRVhDRVBUSU9OU19LRVksCi0JCQlFWENFUFRJT05TX1RFU1RfVkFMVUUsCi0JCQlFWENFUFRJT05TX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVFeGNlcHRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlFWENFUFRJT05TX0tFWSwKLQkJCUVYQ0VQVElPTlNfVEVTVF9WQUxVRSwKLQkJCUVYQ0VQVElPTlNfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExvZ0ZpbGVMb2NhdGlvbiAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldExvZ0ZpbGVMb2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlMT0dfRklMRV9MT0NBVElPTl9LRVksCi0JCQlMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUxPR19GSUxFX0xPQ0FUSU9OX0tFWSwKLQkJCUxPR19GSUxFX0xPQ0FUSU9OX1RFU1RfVkFMVUUsCi0JCQlMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVMb2dGaWxlTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUxPR19GSUxFX0xPQ0FUSU9OX0tFWSwKLQkJCUxPR19GSUxFX0xPQ0FUSU9OX1RFU1RfVkFMVUUsCi0JCQlMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRFbXB0eUZpbGVMb2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgcHVLZXkgPSBMT0dfRklMRV9MT0NBVElPTl9LRVk7Ci0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkocHVLZXkpOwotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZXRNb2RlbCgpLnByb3BlcnR5SWRPZihwcm9wZXJ0eSk7Ci0KLQkJLy8gU2V0IEZpbGVMb2NhdGlvbiB0byAiIiAmIHZlcmlmeSB0aGF0IHRoZSBwcm9wZXJ0eSBpcyBkZWxldGVkCi0JCXRoaXMudmVyaWZ5UHVIYXNQcm9wZXJ0eShwdUtleSwgICJwZXJzaXN0ZW5jZVVuaXQucHJvcGVydGllcyBkb2Vzbid0IGNvbnRhaW5zOiAiKTsKLQkJdGhpcy5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsICIiKTsKLQotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkocHVLZXksICAiUHJvcGVydHkgd2FzIG5vdCBkZWxldGVkIik7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCBudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KHB1S2V5KSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogTG9nZ2VyIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TG9nZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUxPR0dFUl9LRVksCi0JCQl0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihMT0dHRVJfVEVTVF9WQUxVRSkpOyAvLyBtb2RlbCBpcyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUKLQkJLy8gdmVyaWZ5IHNldCBlbnVtIHZhbHVlCi0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlMT0dHRVJfS0VZLAotCQkJTE9HR0VSX1RFU1RfVkFMVUUsCi0JCQlMT0dHRVJfVEVTVF9WQUxVRV8yKTsKLQkJLy8gdmVyaWZ5IHNldCBjdXN0b20gYW5kIGxpdGVyYWwgdmFsdWUKLQkJdGhpcy52ZXJpZnlTZXRMb2dnZXIoCi0JCQlMT0dHRVJfS0VZLAotCQkJTE9HR0VSX1RFU1RfVkFMVUUsCi0JCQlMT0dHRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTG9nZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlMT0dHRVJfS0VZLAotCQkJTE9HR0VSX1RFU1RfVkFMVUUsCi0JCQlMT0dHRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLyoqCi0JICogVmVyaWZpZXMgc2V0dGluZyBjdXN0b20gbG9nZ2VyIGFuZCBsaXRlcmFscy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTZXRMb2dnZXIoU3RyaW5nIGVsS2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KTsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0TW9kZWwoKS5wcm9wZXJ0eUlkT2YocHJvcGVydHkpOwotCQkvLyB0ZXN0IHNldCBjdXN0b20gbG9nZ2VyLgotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTIpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMik7Ci0KLQkJLy8gdGVzdCBzZXQgKExvZ2dlcikgbnVsbAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5sb2dnaW5nLnNldExvZ2dlcigoTG9nZ2VyKSBudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KSk7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCBudWxsKTsKLQkJCi0JCS8vIHRlc3Qgc2V0IGVudW0gbGl0ZXJhbAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTEudG9TdHJpbmcoKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YodGVzdFZhbHVlMSkpOwotCi0JCS8vIHRlc3Qgc2V0IChTdHJpbmcpIG51bGwKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMubG9nZ2luZy5zZXRMb2dnZXIoKFN0cmluZykgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLkxFVkVMX1BST1BFUlRZKSkKLQkJCXRoaXMubG9nZ2luZy5zZXRMZXZlbCgoTG9nZ2luZ0xldmVsKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5USU1FU1RBTVBfUFJPUEVSVFkpKQotCQkJdGhpcy5sb2dnaW5nLnNldFRpbWVzdGFtcCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuVEhSRUFEX1BST1BFUlRZKSkKLQkJCXRoaXMubG9nZ2luZy5zZXRUaHJlYWQoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLlNFU1NJT05fUFJPUEVSVFkpKQotCQkJdGhpcy5sb2dnaW5nLnNldFNlc3Npb24oKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLkVYQ0VQVElPTlNfUFJPUEVSVFkpKQotCQkJdGhpcy5sb2dnaW5nLnNldEV4Y2VwdGlvbnMoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLkxPR19GSUxFX0xPQ0FUSU9OX1BST1BFUlRZKSkKLQkJCXRoaXMubG9nZ2luZy5zZXRMb2dGaWxlTG9jYXRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuTE9HR0VSX1BST1BFUlRZKSkgewotCQkJaWYgKG5ld1ZhbHVlLmdldENsYXNzKCkuaXNFbnVtKCkpCi0JCQkJdGhpcy5sb2dnaW5nLnNldExvZ2dlcigoTG9nZ2VyKSBuZXdWYWx1ZSk7Ci0JCQllbHNlCi0JCQkJdGhpcy5sb2dnaW5nLnNldExvZ2dlcigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuTEVWRUxfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMubG9nZ2luZy5nZXRMZXZlbCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuVElNRVNUQU1QX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmxvZ2dpbmcuZ2V0VGltZXN0YW1wKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5USFJFQURfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMubG9nZ2luZy5nZXRUaHJlYWQoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLlNFU1NJT05fUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMubG9nZ2luZy5nZXRTZXNzaW9uKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5FWENFUFRJT05TX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmxvZ2dpbmcuZ2V0RXhjZXB0aW9ucygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuTE9HX0ZJTEVfTE9DQVRJT05fUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMubG9nZ2luZy5nZXRMb2dGaWxlTG9jYXRpb24oKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLkxPR0dFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5sb2dnaW5nLmdldExvZ2dlcigpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImdldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIG1vZGVsVmFsdWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVB1dFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT2JqZWN0IGV4cGVjdGVkVmFsdWVfID0gZXhwZWN0ZWRWYWx1ZTsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5MT0dHRVJfUFJPUEVSVFkpKSB7Ci0JCQkKLQkJCWV4cGVjdGVkVmFsdWVfID0gKGV4cGVjdGVkVmFsdWUgIT0gbnVsbCAmJiBleHBlY3RlZFZhbHVlLmdldENsYXNzKCkuaXNFbnVtKCkpID8KLQkJCQl0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihMT0dHRVJfVEVTVF9WQUxVRSkgOiAvLyBtb2RlbCBpcyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUKLQkJCQlleHBlY3RlZFZhbHVlOwotCQl9Ci0JCXN1cGVyLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgZXhwZWN0ZWRWYWx1ZV8pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMubG9nZ2luZzsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9Mb2dnaW5nVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9Mb2dnaW5nVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZjgwZmMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvTG9nZ2luZ1ZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLk1vZGlmaWFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Mb2dnaW5nOwotCi0vKioKLSAqIExvZ2dpbmdWYWx1ZU1vZGVsVGVzdHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTG9nZ2luZ1ZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIExvZ2dpbmcgbG9nZ2luZzsKLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB0aW1lc3RhbXBIb2xkZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHRpbWVzdGFtcExpc3RlbmVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCB0aW1lc3RhbXBFdmVudDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBUSU1FU1RBTVBfVEVTVF9WQUxVRSA9IEJvb2xlYW4uRkFMU0U7Ci0KLQlwdWJsaWMgTG9nZ2luZ1ZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmxvZ2dpbmcgPSB0aGlzLnN1YmplY3QuZ2V0TG9nZ2luZygpOyAvLyBTdWJqZWN0Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxMb2dnaW5nPiBsb2dnaW5nSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxMb2dnaW5nPih0aGlzLmxvZ2dpbmcpOwotCQkKLQkJdGhpcy50aW1lc3RhbXBIb2xkZXIgPSB0aGlzLmJ1aWxkVGltZXN0YW1wQUEobG9nZ2luZ0hvbGRlcik7Ci0JCXRoaXMudGltZXN0YW1wTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGltZXN0YW1wQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy50aW1lc3RhbXBIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudGltZXN0YW1wTGlzdGVuZXIpOwotCQl0aGlzLnRpbWVzdGFtcEV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlBYnN0cmFjdE1vZGVsIHN1YmplY3RMb2dnaW5nID0gKEFic3RyYWN0TW9kZWwpIHRoaXMubG9nZ2luZzsgLy8gU3ViamVjdAotCQkKLQkJUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIEJvb2xlYW4+IHRpbWVzdGFtcEFBID0gCi0JCQkoUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIEJvb2xlYW4+KSB0aGlzLnRpbWVzdGFtcEhvbGRlcjsKLQkJYXNzZXJ0VHJ1ZSh0aW1lc3RhbXBBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZShzdWJqZWN0TG9nZ2luZy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhMb2dnaW5nLlRJTUVTVEFNUF9QUk9QRVJUWSkpOwotCQkKLQkJdGltZXN0YW1wQUEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudGltZXN0YW1wTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShzdWJqZWN0TG9nZ2luZy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhMb2dnaW5nLlRJTUVTVEFNUF9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aW1lc3RhbXBBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4gCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgKLQkJCUxvZ2dpbmcuRUNMSVBTRUxJTktfVElNRVNUQU1QLCAKLQkJCVRJTUVTVEFNUF9URVNUX1ZBTFVFKTsKLQkJcmV0dXJuOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5sb2dnaW5nOwotCX0KLQotCS8vICoqKioqKiBUaW1lc3RhbXAgKioqKioqKgotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRpbWVzdGFtcEFBKFByb3BlcnR5VmFsdWVNb2RlbDxMb2dnaW5nPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIExvZ2dpbmcuVElNRVNUQU1QX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VGltZXN0YW1wKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gZW51bVZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFRpbWVzdGFtcChlbnVtVmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFRpbWVzdGFtcENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTG9nZ2luZ1ZhbHVlTW9kZWxUZXN0cy50aGlzLnRpbWVzdGFtcEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvLyAqKioqKiogVGVzdHMgKioqKioqKiAKLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCS8vICoqKioqKiBUaW1lc3RhbXAgKioqKioqKiAKLQkJdGhpcy52ZXJpZnlUaW1lc3RhbXBBQVZhbHVlKFRJTUVTVEFNUF9URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKExvZ2dpbmcuREVGQVVMVF9USU1FU1RBTVAsIHRoaXMubG9nZ2luZy5nZXREZWZhdWx0VGltZXN0YW1wKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyAqKioqKiogVGltZXN0YW1wICoqKioqKiogCi0JCXRoaXMudGltZXN0YW1wRXZlbnQgPSBudWxsOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnRpbWVzdGFtcEhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJQm9vbGVhbiBuZXdUaW1lc3RhbXAgPSAhVElNRVNUQU1QX1RFU1RfVkFMVUU7Ci0JCS8vIE1vZGlmeSB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMudGltZXN0YW1wSG9sZGVyLnNldFZhbHVlKG5ld1RpbWVzdGFtcCk7Ci0JCXRoaXMudmVyaWZ5VGltZXN0YW1wQUFWYWx1ZShuZXdUaW1lc3RhbXApOwotCQlhc3NlcnROb3ROdWxsKHRoaXMudGltZXN0YW1wRXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROdWxsVmFsdWUoKSB7Ci0JCVN0cmluZyBub3REZWxldGVkID0gIlByb3BlcnR5IG5vdCBkZWxldGVkIjsKLQkJLy8gKioqKioqIFRpbWVzdGFtcCAqKioqKioqCi0JCXRoaXMudGltZXN0YW1wRXZlbnQgPSBudWxsOwotCQkvLyBTZXR0aW5nIHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy50aW1lc3RhbXBIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCS8vIHRlc3RpbmcgSG9sZGVyCi0JCXRoaXMudmVyaWZ5VGltZXN0YW1wQUFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnRpbWVzdGFtcEV2ZW50KTsKLQkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCi0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShMb2dnaW5nLkVDTElQU0VMSU5LX1RJTUVTVEFNUCwgbm90RGVsZXRlZCk7Ci0JfQotCi0JLy8gKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKgotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhyZWUgdmFsdWUgdGVzdHM6PGJyPgotCSAqIDEuIHN1YmplY3QgdmFsdWU8YnI+Ci0JICogMi4gYXNwZWN0IGFkYXB0ZXIgdmFsdWU8YnI+Ci0JICogMy4gcGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IHZhbHVlPGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVRpbWVzdGFtcEFBVmFsdWUoQm9vbGVhbiB0ZXN0VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlBQVZhbHVlKAotCQkJdGVzdFZhbHVlLCAKLQkJCXRoaXMubG9nZ2luZy5nZXRUaW1lc3RhbXAoKSwgCi0JCQl0aGlzLnRpbWVzdGFtcEhvbGRlciwgCi0JCQlMb2dnaW5nLkVDTElQU0VMSU5LX1RJTUVTVEFNUCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL09wdGlvbnNBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL09wdGlvbnNBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY0ZjMzYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9PcHRpb25zQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5UYXJnZXREYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5UYXJnZXRTZXJ2ZXI7Ci0KLS8qKgotICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBtb2RlbCBvYmplY3RzIGJ5IHRoZSBPcHRpb24gYWRhcHRlciB3aGVuIHRoZQotICogUGVyc2lzdGVuY2VVbml0IGNoYW5nZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9wdGlvbnNBZGFwdGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBPcHRpb25zIG9wdGlvbnM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9OQU1FX0tFWSA9IE9wdGlvbnMuRUNMSVBTRUxJTktfU0VTU0lPTl9OQU1FOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX05BTUVfVEVTVF9WQUxVRSA9ICJzZXNzaW9uLW5hbWUudGVzdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fTkFNRV9URVNUX1ZBTFVFXzIgPSAic2Vzc2lvbi1uYW1lLTIudGVzdCI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTlNfWE1MX0tFWSA9IE9wdGlvbnMuRUNMSVBTRUxJTktfU0VTU0lPTlNfWE1MOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OU19YTUxfVEVTVF9WQUxVRSA9ICJzZXNzaW9ucy14bWwudGVzdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05TX1hNTF9URVNUX1ZBTFVFXzIgPSAic2Vzc2lvbnMteG1sLTIudGVzdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfREFUQUJBU0VfS0VZID0gT3B0aW9ucy5FQ0xJUFNFTElOS19UQVJHRVRfREFUQUJBU0U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUYXJnZXREYXRhYmFzZSBUQVJHRVRfREFUQUJBU0VfVEVTVF9WQUxVRSA9IFRhcmdldERhdGFiYXNlLmNsb3Vkc2NhcGU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUVfMiA9ICJjdXN0b20udGFyZ2V0RGF0YWJhc2UudGVzdCI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX1NFUlZFUl9LRVkgPSBPcHRpb25zLkVDTElQU0VMSU5LX1RBUkdFVF9TRVJWRVI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGFyZ2V0U2VydmVyIFRBUkdFVF9TRVJWRVJfVEVTVF9WQUxVRSA9IFRhcmdldFNlcnZlci53ZWJsb2dpY185OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfU0VSVkVSX1RFU1RfVkFMVUVfMiA9ICJjdXN0b20udGFyZ2V0U2VydmVyLnRlc3QiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfS0VZID0gT3B0aW9ucy5FQ0xJUFNFTElOS19TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIElOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUVfMiA9ICEgSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fRVZFTlRfTElTVEVORVJfS0VZID0gT3B0aW9ucy5FQ0xJUFNFTElOS19TRVNTSU9OX0VWRU5UX0xJU1RFTkVSOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fRVZFTlRfTElTVEVORVJfVEVTVF9WQUxVRSA9ICJhY21lLkN1c3RvbVNlc3Npb25FdmVudExpc3RlbmVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1RFU1RfVkFMVUVfMiA9ICJvcmFjbGUuc2Vzc2lvbnMuQ3VzdG9tU2Vzc2lvbkV2ZW50TGlzdGVuZXIiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUE9SQUxfTVVUQUJMRV9LRVkgPSBPcHRpb25zLkVDTElQU0VMSU5LX1RFTVBPUkFMX01VVEFCTEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRSA9IHRydWU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRV8yID0gISBURU1QT1JBTF9NVVRBQkxFX1RFU1RfVkFMVUU7Ci0KLQlwdWJsaWMgT3B0aW9uc0FkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9wdGlvbnMgPSB0aGlzLnN1YmplY3QuZ2V0T3B0aW9ucygpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCi0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMuU0VTU0lPTl9OQU1FX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9ucy5TRVNTSU9OU19YTUxfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPcHRpb25zLlRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMuVEFSR0VUX1NFUlZFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMuU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJT3B0aW9ucy5TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9ucy5URU1QT1JBTF9NVVRBQkxFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDc7Ci0JCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyA0OyAvLyA0IG1pc2MgcHJvcGVydGllcwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoU0VTU0lPTl9OQU1FX0tFWSwgU0VTU0lPTl9OQU1FX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFNFU1NJT05TX1hNTF9LRVksIFNFU1NJT05TX1hNTF9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4xIiwgInZhbHVlLjEiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19LRVksIElOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMiIsICJ2YWx1ZS4yIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMyIsICJ2YWx1ZS4zIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVEFSR0VUX0RBVEFCQVNFX0tFWSwgVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFRBUkdFVF9TRVJWRVJfS0VZLCBUQVJHRVRfU0VSVkVSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFNFU1NJT05fRVZFTlRfTElTVEVORVJfS0VZLCBTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjQiLCAidmFsdWUuNCIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFRFTVBPUkFMX01VVEFCTEVfS0VZLCBURU1QT1JBTF9NVVRBQkxFX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXJldHVybjsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBMaXN0ZW5lcnMgKioqKioqKioqKgotCi0JLy8gKioqKioqKioqKiBTZXNzaW9uTmFtZSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFNlc3Npb25OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNFU1NJT05fTkFNRV9LRVksCi0JCQlTRVNTSU9OX05BTUVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlTRVNTSU9OX05BTUVfS0VZLAotCQkJU0VTU0lPTl9OQU1FX1RFU1RfVkFMVUUsCi0JCQlTRVNTSU9OX05BTUVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlU2Vzc2lvbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVNFU1NJT05fTkFNRV9LRVksCi0JCQlTRVNTSU9OX05BTUVfVEVTVF9WQUxVRSwKLQkJCVNFU1NJT05fTkFNRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogU2Vzc2lvbnNYbWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZXNzaW9uc1htbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlTRVNTSU9OU19YTUxfS0VZLAotCQkJU0VTU0lPTlNfWE1MX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJU0VTU0lPTlNfWE1MX0tFWSwKLQkJCVNFU1NJT05TX1hNTF9URVNUX1ZBTFVFLAotCQkJU0VTU0lPTlNfWE1MX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNlc3Npb25zWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlTRVNTSU9OU19YTUxfS0VZLAotCQkJU0VTU0lPTlNfWE1MX1RFU1RfVkFMVUUsCi0JCQlTRVNTSU9OU19YTUxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19LRVksCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX0tFWSwKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUUsCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX0tFWSwKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUUsCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVGFyZ2V0RGF0YWJhc2UgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYXJnZXREYXRhYmFzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlUQVJHRVRfREFUQUJBU0VfS0VZLAotCQkJdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUUpKTsgLy8gbW9kZWwgaXMgc3RvcmluZyBFY2xpcHNlTGlua1N0cmluZ1ZhbHVlCi0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlUQVJHRVRfREFUQUJBU0VfS0VZLAotCQkJVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUUsCi0JCQlUQVJHRVRfREFUQUJBU0VfVEVTVF9WQUxVRV8yKTsKLQkJLy8gdmVyaWZ5IHNldCBjdXN0b20gYW5kIGxpdGVyYWwgdmFsdWUKLQkJdGhpcy52ZXJpZnlTZXRUYXJnZXREYXRhYmFzZSgKLQkJCVRBUkdFVF9EQVRBQkFTRV9LRVksCi0JCQlUQVJHRVRfREFUQUJBU0VfVEVTVF9WQUxVRSwKLQkJCVRBUkdFVF9EQVRBQkFTRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVUYXJnZXREYXRhYmFzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJVEFSR0VUX0RBVEFCQVNFX0tFWSwKLQkJCVRBUkdFVF9EQVRBQkFTRV9URVNUX1ZBTFVFLAotCQkJVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmaWVzIHNldHRpbmcgY3VzdG9tIHRhcmdldERhdGFiYXNlIGFuZCBsaXRlcmFscy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTZXRUYXJnZXREYXRhYmFzZShTdHJpbmcgZWxLZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpOwotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZXRNb2RlbCgpLnByb3BlcnR5SWRPZihwcm9wZXJ0eSk7Ci0JCS8vIHRlc3Qgc2V0IGN1c3RvbSB0YXJnZXREYXRhYmFzZS4KLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUyKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTIpOwotCi0JCS8vIHRlc3Qgc2V0IChUYXJnZXREYXRhYmFzZSkgbnVsbAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5vcHRpb25zLnNldFRhcmdldERhdGFiYXNlKChUYXJnZXREYXRhYmFzZSkgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JCQotCQkvLyB0ZXN0IHNldCBlbnVtIGxpdGVyYWwKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUxLnRvU3RyaW5nKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKHRlc3RWYWx1ZTEpKTsKLQotCQkvLyB0ZXN0IHNldCAoU3RyaW5nKSBudWxsCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLm9wdGlvbnMuc2V0VGFyZ2V0RGF0YWJhc2UoKFN0cmluZykgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogVGFyZ2V0U2VydmVyIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFyZ2V0U2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVRBUkdFVF9TRVJWRVJfS0VZLAotCQkJdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFKSk7IC8vIG1vZGVsIGlzIHN0b3JpbmcgRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZQotCQkvLyB2ZXJpZnkgc2V0IGVudW0gdmFsdWUKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVRBUkdFVF9TRVJWRVJfS0VZLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFXzIpOwotCQkvLyB2ZXJpZnkgc2V0IGN1c3RvbSBhbmQgbGl0ZXJhbCB2YWx1ZQotCQl0aGlzLnZlcmlmeVNldFRhcmdldFNlcnZlcigKLQkJCVRBUkdFVF9TRVJWRVJfS0VZLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVUYXJnZXRTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVRBUkdFVF9TRVJWRVJfS0VZLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvKioKLQkgKiBWZXJpZmllcyBzZXR0aW5nIGN1c3RvbSB0YXJnZXRTZXJ2ZXIgYW5kIGxpdGVyYWxzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVNldFRhcmdldFNlcnZlcihTdHJpbmcgZWxLZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpOwotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZXRNb2RlbCgpLnByb3BlcnR5SWRPZihwcm9wZXJ0eSk7Ci0JCS8vIHRlc3Qgc2V0IGN1c3RvbSB0YXJnZXRTZXJ2ZXIuCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMik7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUyKTsKLQotCQkvLyB0ZXN0IHNldCAoVGFyZ2V0U2VydmVyKSBudWxsCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLm9wdGlvbnMuc2V0VGFyZ2V0U2VydmVyKChUYXJnZXRTZXJ2ZXIpIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOwotCQkKLQkJLy8gdGVzdCBzZXQgZW51bSBsaXRlcmFsCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMS50b1N0cmluZygpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KSk7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZih0ZXN0VmFsdWUxKSk7Ci0KLQkJLy8gdGVzdCBzZXQgKFN0cmluZykgbnVsbAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5vcHRpb25zLnNldFRhcmdldFNlcnZlcigoU3RyaW5nKSBudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KSk7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCBudWxsKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEV2ZW50TGlzdGVuZXIgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRFdmVudExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfS0VZLAotCQkJU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfS0VZLAotCQkJU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9URVNUX1ZBTFVFLAotCQkJU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVFdmVudExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX0tFWSwKLQkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfVEVTVF9WQUxVRSwKLQkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFRlbXBvcmFsTXV0YWJsZSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFRlbXBvcmFsTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlURU1QT1JBTF9NVVRBQkxFX0tFWSwKLQkJCVRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlURU1QT1JBTF9NVVRBQkxFX0tFWSwKLQkJCVRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRSwKLQkJCVRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVGVtcG9yYWxNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlURU1QT1JBTF9NVVRBQkxFX0tFWSwKLQkJCVRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRSwKLQkJCVRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuU0VTU0lPTl9OQU1FX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5zZXRTZXNzaW9uTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5TRVNTSU9OU19YTUxfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLnNldFNlc3Npb25zWG1sKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLnNldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZKSkKLQkJCXRoaXMuc2V0VGFyZ2V0RGF0YWJhc2VQcm9wZXJ0eShuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5UQVJHRVRfU0VSVkVSX1BST1BFUlRZKSkKLQkJCXRoaXMuc2V0VGFyZ2V0U2VydmVyUHJvcGVydHkobmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMuc2V0RXZlbnRMaXN0ZW5lcigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5URU1QT1JBTF9NVVRBQkxFX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5zZXRUZW1wb3JhbE11dGFibGUoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFRhcmdldERhdGFiYXNlUHJvcGVydHkoT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWlmIChuZXdWYWx1ZS5nZXRDbGFzcygpLmlzRW51bSgpKQotCQkJdGhpcy5vcHRpb25zLnNldFRhcmdldERhdGFiYXNlKChUYXJnZXREYXRhYmFzZSkgbmV3VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLm9wdGlvbnMuc2V0VGFyZ2V0RGF0YWJhc2UoKFN0cmluZykgbmV3VmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUYXJnZXRTZXJ2ZXJQcm9wZXJ0eShPYmplY3QgbmV3VmFsdWUpIHsKLQkJaWYgKG5ld1ZhbHVlLmdldENsYXNzKCkuaXNFbnVtKCkpCi0JCQl0aGlzLm9wdGlvbnMuc2V0VGFyZ2V0U2VydmVyKChUYXJnZXRTZXJ2ZXIpIG5ld1ZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy5vcHRpb25zLnNldFRhcmdldFNlcnZlcigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuU0VTU0lPTl9OQU1FX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLm9wdGlvbnMuZ2V0U2Vzc2lvbk5hbWUoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlNFU1NJT05TX1hNTF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldFNlc3Npb25zWG1sKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLm9wdGlvbnMuZ2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5UQVJHRVRfREFUQUJBU0VfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMub3B0aW9ucy5nZXRUYXJnZXREYXRhYmFzZSgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuVEFSR0VUX1NFUlZFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldFRhcmdldFNlcnZlcigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldEV2ZW50TGlzdGVuZXIoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlRFTVBPUkFMX01VVEFCTEVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMub3B0aW9ucy5nZXRUZW1wb3JhbE11dGFibGUoKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBtb2RlbFZhbHVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQdXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBleHBlY3RlZFZhbHVlXyA9IGV4cGVjdGVkVmFsdWU7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZKSB8fAotCQkJcHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlRBUkdFVF9TRVJWRVJfUFJPUEVSVFkpKSB7Ci0JCQkKLQkJCWV4cGVjdGVkVmFsdWVfID0gdGhpcy5jb252ZXJ0VG9FY2xpcHNlTGlua1N0cmluZ1ZhbHVlKGV4cGVjdGVkVmFsdWUpOwotCQl9Ci0JCQotCQlzdXBlci52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGV4cGVjdGVkVmFsdWVfKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgY29udmVydFRvRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZShPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZykgKChleHBlY3RlZFZhbHVlICE9IG51bGwgJiYgZXhwZWN0ZWRWYWx1ZS5nZXRDbGFzcygpLmlzRW51bSgpKSA/Ci0JCQkJdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoZXhwZWN0ZWRWYWx1ZSkgOiAvLyBtb2RlbCBpcyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUKLQkJCQlleHBlY3RlZFZhbHVlKTsgLy8gYWxyZWFkeSBhIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvT3B0aW9uc1ZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvT3B0aW9uc1ZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWQ5OWI4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL09wdGlvbnNWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Nb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuT3B0aW9uczsKLQotLyoqCi0gKiBPcHRpb25zVmFsdWVNb2RlbFRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBPcHRpb25zVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotewotCXByaXZhdGUgT3B0aW9ucyBvcHRpb25zOwotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0hvbGRlcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzTGlzdGVuZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0V2ZW50OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIElOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUUgPSBCb29sZWFuLkZBTFNFOwotCi0JcHVibGljIE9wdGlvbnNWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vcHRpb25zID0gdGhpcy5zdWJqZWN0LmdldE9wdGlvbnMoKTsgLy8gU3ViamVjdAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9ucz4gb3B0aW9uc0hvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9ucz4odGhpcy5vcHRpb25zKTsKLQkJCi0JCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyID0gdGhpcy5idWlsZEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBKG9wdGlvbnNIb2xkZXIpOwotCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xpc3RlbmVyID0gdGhpcy5idWlsZEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xpc3RlbmVyKTsKLQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNFdmVudCA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJQWJzdHJhY3RNb2RlbCBzdWJqZWN0T3B0aW9ucyA9IChBYnN0cmFjdE1vZGVsKSB0aGlzLm9wdGlvbnM7IC8vIFN1YmplY3QKLQkJCi0JCVByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBCb29sZWFuPiBpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNBQSA9IAotCQkJKFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBCb29sZWFuPikgdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXI7Ci0JCWFzc2VydFRydWUoaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoc3ViamVjdE9wdGlvbnMuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoT3B0aW9ucy5TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZKSk7Ci0JCQotCQlpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNBQS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHN1YmplY3RPcHRpb25zLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKE9wdGlvbnMuU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZShpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4gCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgKLQkJCU9wdGlvbnMuRUNMSVBTRUxJTktfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUywgCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFKTsKLQkJcmV0dXJuOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25zOwotCX0KLQotCS8vICoqKioqKiBJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMgKioqKioqKgotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBKFByb3BlcnR5VmFsdWVNb2RlbDxPcHRpb25zPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIE9wdGlvbnMuU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIGVudW1WYWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoZW51bVZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCU9wdGlvbnNWYWx1ZU1vZGVsVGVzdHMudGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKioqIFRlc3RzICoqKioqKiogCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQkvLyAqKioqKiogSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzICoqKioqKiogCi0JCXRoaXMudmVyaWZ5SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQUFWYWx1ZShJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKE9wdGlvbnMuREVGQVVMVF9TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTLCB0aGlzLm9wdGlvbnMuZ2V0RGVmYXVsdEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gKioqKioqIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyAqKioqKioqIAotCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0V2ZW50ID0gbnVsbDsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSk7Ci0JCUJvb2xlYW4gbmV3SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzID0gIUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUU7Ci0JCS8vIE1vZGlmeSB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyLnNldFZhbHVlKG5ld0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyk7Ci0JCXRoaXMudmVyaWZ5SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQUFWYWx1ZShuZXdJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzRXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROdWxsVmFsdWUoKSB7Ci0JCVN0cmluZyBub3REZWxldGVkID0gIlByb3BlcnR5IG5vdCBkZWxldGVkIjsKLQkJLy8gKioqKioqIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyAqKioqKioqCi0JCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzRXZlbnQgPSBudWxsOwotCQkvLyBTZXR0aW5nIHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCS8vIHRlc3RpbmcgSG9sZGVyCi0JCXRoaXMudmVyaWZ5SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQUFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0V2ZW50KTsKLQkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCi0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShPcHRpb25zLkVDTElQU0VMSU5LX1NFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVMsIG5vdERlbGV0ZWQpOwotCX0KLQotCS8vICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKLQotCS8qKgotCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KLQkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgotCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgotCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNBQVZhbHVlKEJvb2xlYW4gdGVzdFZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5QUFWYWx1ZSgKLQkJCXRlc3RWYWx1ZSwgCi0JCQl0aGlzLm9wdGlvbnMuZ2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCksIAotCQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIsIAotCQkJT3B0aW9ucy5FQ0xJUFNFTElOS19TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvU2NoZW1hR2VuZXJhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvU2NoZW1hR2VuZXJhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTY2NmNlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1NjaGVtYUdlbmVyYXRpb25BZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRGRsR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuT3V0cHV0TW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5TY2hlbWFHZW5lcmF0aW9uOwotCi0vKioKLSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgT3V0cHV0TW9kZSBtb2RlbCBvYmplY3QgYnkgdGhlIFNjaGVtYUdlbmVyYXRpb24gYWRhcHRlcgotICogd2hlbiB0aGUgUGVyc2lzdGVuY2VVbml0IGNoYW5nZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNjaGVtYUdlbmVyYXRpb25BZGFwdGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBTY2hlbWFHZW5lcmF0aW9uIHNjaGVtYUdlbmVyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERExfR0VORVJBVElPTl9UWVBFX0tFWSA9IFNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERkbEdlbmVyYXRpb25UeXBlIERETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRSA9IERkbEdlbmVyYXRpb25UeXBlLmRyb3BfYW5kX2NyZWF0ZV90YWJsZXM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZGxHZW5lcmF0aW9uVHlwZSBERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUVfMiA9IERkbEdlbmVyYXRpb25UeXBlLm5vbmU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfTU9ERV9LRVkgPSBTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX09VVFBVVF9NT0RFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3V0cHV0TW9kZSBPVVRQVVRfTU9ERV9URVNUX1ZBTFVFID0gT3V0cHV0TW9kZS5zcWxfc2NyaXB0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3V0cHV0TW9kZSBPVVRQVVRfTU9ERV9URVNUX1ZBTFVFXzIgPSBPdXRwdXRNb2RlLmRhdGFiYXNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9GSUxFX05BTUVfS0VZID0gU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19DUkVBVEVfRklMRV9OQU1FOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfRklMRV9OQU1FX1RFU1RfVkFMVUUgPSAiY3JlYXRlLWZpbGUtbmFtZS50ZXN0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0ZJTEVfTkFNRV9URVNUX1ZBTFVFXzIgPSAiY3JlYXRlLWZpbGUtbmFtZS0yLnRlc3QiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERST1BfRklMRV9OQU1FX0tFWSA9IFNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRFJPUF9GSUxFX05BTUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERST1BfRklMRV9OQU1FX1RFU1RfVkFMVUUgPSAiZHJvcC1maWxlLW5hbWUudGVzdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERST1BfRklMRV9OQU1FX1RFU1RfVkFMVUVfMiA9ICJkcm9wLWZpbGUtbmFtZS0yLnRlc3QiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0xPQ0FUSU9OX0tFWSA9IFNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfQVBQTElDQVRJT05fTE9DQVRJT047Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0xPQ0FUSU9OX1RFU1RfVkFMVUUgPSAiQzovdGVtcCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0xPQ0FUSU9OX1RFU1RfVkFMVUVfMiA9ICJDOi90bXAiOwotCi0JcHVibGljIFNjaGVtYUdlbmVyYXRpb25BZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uID0gdGhpcy5zdWJqZWN0LmdldFNjaGVtYUdlbmVyYXRpb24oKTsKLQkJCi0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTY2hlbWFHZW5lcmF0aW9uLkRETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTY2hlbWFHZW5lcmF0aW9uLkNSRUFURV9GSUxFX05BTUVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTY2hlbWFHZW5lcmF0aW9uLkRST1BfRklMRV9OQU1FX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU2NoZW1hR2VuZXJhdGlvbi5BUFBMSUNBVElPTl9MT0NBVElPTl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY2xlYXJFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLiBDYW5ub3QgdXNlCi0JICogUHJvcGVydHkgSG9sZGVyIHRvIGluaXRpYWxpemUgYmVjYXVzZSBpdCBpcyBub3QgY3JlYXRlZCB5ZXQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IDk7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gNTsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7Ci0JCQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJwcm9wZXJ0eS4wIiwgInZhbHVlLjAiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShPVVRQVVRfTU9ERV9LRVksIHRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgicHJvcGVydHkuMiIsICJ2YWx1ZS4yIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoInByb3BlcnR5LjMiLCAidmFsdWUuMyIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJwcm9wZXJ0eS40IiwgInZhbHVlLjQiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShERExfR0VORVJBVElPTl9UWVBFX0tFWSwgdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoQ1JFQVRFX0ZJTEVfTkFNRV9LRVksIENSRUFURV9GSUxFX05BTUVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoRFJPUF9GSUxFX05BTUVfS0VZLCBEUk9QX0ZJTEVfTkFNRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShBUFBMSUNBVElPTl9MT0NBVElPTl9LRVksIEFQUExJQ0FUSU9OX0xPQ0FUSU9OX1RFU1RfVkFMVUUpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gKioqKioqKioqKiBDcmVhdGVGaWxlTmFtZSAqKioqKioqKioqCi0JLyoqCi0JICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBDcmVhdGVGaWxlTmFtZSBwcm9wZXJ0eSBieSB0aGUgU2NoZW1hR2VuZXJhdGlvbgotCSAqIGFkYXB0ZXIgd2hlbiB0aGUgUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldENyZWF0ZUZpbGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUNSRUFURV9GSUxFX05BTUVfS0VZLAotCQkJQ1JFQVRFX0ZJTEVfTkFNRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUNSRUFURV9GSUxFX05BTUVfS0VZLAotCQkJQ1JFQVRFX0ZJTEVfTkFNRV9URVNUX1ZBTFVFLAotCQkJQ1JFQVRFX0ZJTEVfTkFNRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVDcmVhdGVGaWxlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJQ1JFQVRFX0ZJTEVfTkFNRV9LRVksCi0JCQlDUkVBVEVfRklMRV9OQU1FX1RFU1RfVkFMVUUsCi0JCQlDUkVBVEVfRklMRV9OQU1FX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogRHJvcEZpbGVOYW1lICoqKioqKioqKioKLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIERyb3BGaWxlTmFtZSBwcm9wZXJ0eSBieSB0aGUgU2NoZW1hR2VuZXJhdGlvbiBhZGFwdGVyCi0JICogd2hlbiB0aGUgUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldERyb3BGaWxlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlEUk9QX0ZJTEVfTkFNRV9LRVksCi0JCQlEUk9QX0ZJTEVfTkFNRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCURST1BfRklMRV9OQU1FX0tFWSwKLQkJCURST1BfRklMRV9OQU1FX1RFU1RfVkFMVUUsCi0JCQlEUk9QX0ZJTEVfTkFNRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVEcm9wRmlsZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCURST1BfRklMRV9OQU1FX0tFWSwgCi0JCQlEUk9QX0ZJTEVfTkFNRV9URVNUX1ZBTFVFLCAKLQkJCURST1BfRklMRV9OQU1FX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBBcHBsaWNhdGlvbkxvY2F0aW9uICoqKioqKioqKioKLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIEFwcGxpY2F0aW9uTG9jYXRpb24gcHJvcGVydHkgYnkgdGhlIFNjaGVtYUdlbmVyYXRpb24KLQkgKiBhZGFwdGVyIHdoZW4gdGhlIFBVIG9yIHRoZSBtb2RlbCBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTZXRBcHBsaWNhdGlvbkxvY2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUFQUExJQ0FUSU9OX0xPQ0FUSU9OX0tFWSwKLQkJCUFQUExJQ0FUSU9OX0xPQ0FUSU9OX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJQVBQTElDQVRJT05fTE9DQVRJT05fS0VZLAotCQkJQVBQTElDQVRJT05fTE9DQVRJT05fVEVTVF9WQUxVRSwKLQkJCUFQUExJQ0FUSU9OX0xPQ0FUSU9OX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUFwcGxpY2F0aW9uTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUFQUExJQ0FUSU9OX0xPQ0FUSU9OX0tFWSwKLQkJCUFQUExJQ0FUSU9OX0xPQ0FUSU9OX1RFU1RfVkFMVUUsCi0JCQlBUFBMSUNBVElPTl9MT0NBVElPTl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRFbXB0eUFwcGxpY2F0aW9uTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHB1S2V5ID0gQVBQTElDQVRJT05fTE9DQVRJT05fS0VZOwotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KHB1S2V5KTsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0TW9kZWwoKS5wcm9wZXJ0eUlkT2YocHJvcGVydHkpOwotCi0JCS8vIFNldCBBcHBsaWNhdGlvbkxvY2F0aW9uIHRvICIiICYgdmVyaWZ5IHRoYXQgdGhlIHByb3BlcnR5IGlzIGRlbGV0ZWQKLQkJdGhpcy52ZXJpZnlQdUhhc1Byb3BlcnR5KHB1S2V5LCAgInBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzIGRvZXNuJ3QgY29udGFpbnM6ICIpOwotCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgIiIpOwotCi0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShwdUtleSwgICJQcm9wZXJ0eSB3YXMgbm90IGRlbGV0ZWQiKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkocHVLZXkpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIE91dHB1dE1vZGUgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgT3V0cHV0TW9kZSBwcm9wZXJ0eSBieSB0aGUgU2NoZW1hR2VuZXJhdGlvbiBhZGFwdGVyCi0JICogd2hlbiB0aGUgUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldE91dHB1dE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJT1VUUFVUX01PREVfS0VZLAotCQkJT1VUUFVUX01PREVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlPVVRQVVRfTU9ERV9LRVksCi0JCQlPVVRQVVRfTU9ERV9URVNUX1ZBTFVFLAotCQkJT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlT3V0cHV0TW9kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJT1VUUFVUX01PREVfS0VZLCAKLQkJCU9VVFBVVF9NT0RFX1RFU1RfVkFMVUUsIAotCQkJT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIERkbEdlbmVyYXRpb25UeXBlICoqKioqKioqKioKLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIERkbEdlbmVyYXRpb25UeXBlIHByb3BlcnR5IGJ5IHRoZSBTY2hlbWFHZW5lcmF0aW9uCi0JICogYWRhcHRlciB3aGVuIHRoZSBQVSBvciB0aGUgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGRsR2VuZXJhdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJRERMX0dFTkVSQVRJT05fVFlQRV9LRVksCi0JCQlERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJRERMX0dFTkVSQVRJT05fVFlQRV9LRVksCi0JCQlERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUsCi0JCQlERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZURkbEdlbmVyYXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlERExfR0VORVJBVElPTl9UWVBFX0tFWSwgCi0JCQlERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUsIAotCQkJRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLk9VVFBVVF9NT0RFX1BST1BFUlRZKSkKLQkJCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5zZXRPdXRwdXRNb2RlKChPdXRwdXRNb2RlKSBuZXdWYWx1ZSk7Ci0JCS8vIGVsc2UgaWYoIHByb3BlcnR5TmFtZS5lcXVhbHMoIENhY2hpbmcuQ0FDSEVfU0laRV9QUk9QRVJUWSkpCi0JCS8vIFRPRE8KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLkRETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFkpKQotCQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLnNldERkbEdlbmVyYXRpb25UeXBlKChEZGxHZW5lcmF0aW9uVHlwZSkgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uQVBQTElDQVRJT05fTE9DQVRJT05fUFJPUEVSVFkpKQotCQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLnNldEFwcGxpY2F0aW9uTG9jYXRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uQ1JFQVRFX0ZJTEVfTkFNRV9QUk9QRVJUWSkpCi0JCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uc2V0Q3JlYXRlRmlsZU5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uRFJPUF9GSUxFX05BTUVfUFJPUEVSVFkpKQotCQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLnNldERyb3BGaWxlTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJT2JqZWN0IG1vZGVsVmFsdWUgPSBudWxsOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLk9VVFBVVF9NT0RFX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLnNjaGVtYUdlbmVyYXRpb24uZ2V0T3V0cHV0TW9kZSgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmdldERkbEdlbmVyYXRpb25UeXBlKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU2NoZW1hR2VuZXJhdGlvbi5BUFBMSUNBVElPTl9MT0NBVElPTl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmdldEFwcGxpY2F0aW9uTG9jYXRpb24oKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLkNSRUFURV9GSUxFX05BTUVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRDcmVhdGVGaWxlTmFtZSgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uRFJPUF9GSUxFX05BTUVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXREcm9wRmlsZU5hbWUoKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBtb2RlbFZhbHVlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWFHZW5lcmF0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1NjaGVtYUdlbmVyYXRpb25CYXNpY0FkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvU2NoZW1hR2VuZXJhdGlvbkJhc2ljQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MzgzMzAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvU2NoZW1hR2VuZXJhdGlvbkJhc2ljQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkRkbEdlbmVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk91dHB1dE1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuU2NoZW1hR2VuZXJhdGlvbjsKLQotLyoqCi0gKiBUZXN0cyB0aGUgdXBkYXRlIG9mIE91dHB1dE1vZGUgbW9kZWwgb2JqZWN0IGJ5IHRoZSBTY2hlbWFHZW5lcmF0aW9uIGFkYXB0ZXIKLSAqIHdoZW4gdGhlIFBlcnNpc3RlbmNlVW5pdCBjaGFuZ2VzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTY2hlbWFHZW5lcmF0aW9uQmFzaWNBZGFwdGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBTY2hlbWFHZW5lcmF0aW9uIHNjaGVtYUdlbmVyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBvdXRwdXRNb2RlS2V5ID0gU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBkZGxHZW5UeXBlS2V5ID0gU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPdXRwdXRNb2RlIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUgPSBPdXRwdXRNb2RlLnNxbF9zY3JpcHQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBPdXRwdXRNb2RlIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUVfMiA9IE91dHB1dE1vZGUuZGF0YWJhc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZGxHZW5lcmF0aW9uVHlwZSBERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUgPSBEZGxHZW5lcmF0aW9uVHlwZS5kcm9wX2FuZF9jcmVhdGVfdGFibGVzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGRsR2VuZXJhdGlvblR5cGUgRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFXzIgPSBEZGxHZW5lcmF0aW9uVHlwZS5ub25lOwotCi0JcHVibGljIFNjaGVtYUdlbmVyYXRpb25CYXNpY0FkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQkKLQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uID0gdGhpcy5zdWJqZWN0LmdldFNjaGVtYUdlbmVyYXRpb24oKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFNjaGVtYUdlbmVyYXRpb24uRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY2xlYXJFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLiBDYW5ub3QgdXNlCi0JICogUHJvcGVydHkgSG9sZGVyIHRvIGluaXRpYWxpemUgYmVjYXVzZSBpdCBpcyBub3QgY3JlYXRlZCB5ZXQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IDY7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gMjsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7Ci0JCQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJwcm9wZXJ0eS4wIiwgInZhbHVlLjAiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShvdXRwdXRNb2RlS2V5LCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihPVVRQVVRfTU9ERV9URVNUX1ZBTFVFKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoInByb3BlcnR5LjIiLCAidmFsdWUuMiIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJwcm9wZXJ0eS4zIiwgInZhbHVlLjMiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgicHJvcGVydHkuNCIsICJ2YWx1ZS40Iik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoZGRsR2VuVHlwZUtleSwgdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiogKioqKioqIHRlc3QgbWV0aG9kcyAqKioqKioqICovCi0KLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIE91dHB1dE1vZGUgcHJvcGVydHkgYnkgdGhlIFNjaGVtYUdlbmVyYXRpb24gYWRhcHRlcgotCSAqIHdoZW4gdGhlIFBVIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE91dHB1dE1vZGVVcGRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdFZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBwcm9wZXJ0aWVzQWRhcHRlciA9IHRoaXMuYnVpbGRQcm9wZXJ0aWVzQWRhcHRlcih0aGlzLnN1YmplY3RIb2xkZXIpOwotCQlMaXN0VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IHByb3BlcnR5TGlzdEFkYXB0ZXIgPSBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4ocHJvcGVydGllc0FkYXB0ZXIsIFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eS5WQUxVRV9QUk9QRVJUWSk7Ci0JCQotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnNjaGVtYUdlbmVyYXRpb24sIFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFkpOwotCQkKLQkJLy8gQmFzaWMKLQkJYXNzZXJ0VHJ1ZShzY2hlbWFHZW5lcmF0aW9uLml0ZW1Jc1Byb3BlcnR5KHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkob3V0cHV0TW9kZUtleSkpKTsKLQkJYXNzZXJ0RXF1YWxzKE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUsIHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRPdXRwdXRNb2RlKCkpOwotCQkKLQkJLy8gUmVwbGFjZQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KG91dHB1dE1vZGVLZXksIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUVfMik7Ci0JCXRoaXMudmVyaWZ5UHV0RXZlbnQoU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSwgT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yLCB0aGlzLnNjaGVtYUdlbmVyYXRpb24uZ2V0T3V0cHV0TW9kZSgpKTsKLQkJCi0JCS8vIFJlbW92ZQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJLS10aGlzLnByb3BlcnRpZXNUb3RhbDsKLQkJLS10aGlzLm1vZGVsUHJvcGVydGllc1NpemU7Ci0JCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkucmVtb3ZlUHJvcGVydHkob3V0cHV0TW9kZUtleSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShvdXRwdXRNb2RlS2V5KSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vZGVsUHJvcGVydGllc1NpemUsIHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsIC0gMSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCi0JCS8vIEFkZCBvcmlnaW5hbCBPdXRwdXRNb2RlCi0JCSsrdGhpcy5wcm9wZXJ0aWVzVG90YWw7Ci0JCSsrdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KG91dHB1dE1vZGVLZXksIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVB1dEV2ZW50KFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFksIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUsIHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRPdXRwdXRNb2RlKCkpOwotCQkKLQkJLy8gUmVwbGFjZSBhZ2FpbgotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KG91dHB1dE1vZGVLZXksIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUVfMik7Ci0JCXRoaXMudmVyaWZ5UHV0RXZlbnQoU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSwgT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yLCB0aGlzLnNjaGVtYUdlbmVyYXRpb24uZ2V0T3V0cHV0TW9kZSgpKTsKLQkJCi0JCS8vIFJlcGxhY2UgYnkgc2V0dGluZyBtb2RlbCBvYmplY3QKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5zZXRPdXRwdXRNb2RlKE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVB1dEV2ZW50KFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFksIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUsIHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRPdXRwdXRNb2RlKCkpOwotCX0KLQotCS8vICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hR2VuZXJhdGlvbjsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4gYnVpbGRQcm9wZXJ0aWVzQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PihzdWJqZWN0SG9sZGVyLCBQZXJzaXN0ZW5jZVVuaXQuUFJPUEVSVElFU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBnZXRMaXN0SXRlcmFibGUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQcm9wZXJ0aWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFByb3BlcnRpZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1NjaGVtYUdlbmVyYXRpb25WYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1NjaGVtYUdlbmVyYXRpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3M2VhZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9TY2hlbWFHZW5lcmF0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5EZGxHZW5lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5PdXRwdXRNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlNjaGVtYUdlbmVyYXRpb247Ci0KLS8qKgotICogU2NoZW1hR2VuZXJhdGlvblZhbHVlTW9kZWxUZXN0cwotICogCi0gKiBUZXN0cyB0aGUgUHJvcGVydHlWYWx1ZU1vZGVsIG9mIFNjaGVtYUdlbmVyYXRpb24gbW9kZWwgYW5kIHRoZSB1cGRhdGUgb2YgdGhlCi0gKiBQZXJzaXN0ZW5jZVVuaXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2hlbWFHZW5lcmF0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotewotCXByaXZhdGUgU2NoZW1hR2VuZXJhdGlvbiBzY2hlbWFHZW47Ci0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U2NoZW1hR2VuZXJhdGlvbj4gc2NoZW1hR2VuSG9sZGVyOwotCi0JcHJpdmF0ZSBNb2RpZmlhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPERkbEdlbmVyYXRpb25UeXBlPiBkZGxHZW5lcmF0aW9uVHlwZUhvbGRlcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgZGRsR2VuZXJhdGlvblR5cGVFdmVudDsKLQotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPdXRwdXRNb2RlPiBvdXRwdXRNb2RlSG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBvdXRwdXRNb2RlRXZlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERkbEdlbmVyYXRpb25UeXBlIERETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRSA9IERkbEdlbmVyYXRpb25UeXBlLmRyb3BfYW5kX2NyZWF0ZV90YWJsZXM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBPdXRwdXRNb2RlIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUgPSBPdXRwdXRNb2RlLnNxbF9zY3JpcHQ7Ci0KLQlwdWJsaWMgU2NoZW1hR2VuZXJhdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnNjaGVtYUdlbiA9IHRoaXMuc3ViamVjdC5nZXRTY2hlbWFHZW5lcmF0aW9uKCk7IC8vIFN1YmplY3QKLQkJdGhpcy5zY2hlbWFHZW5Ib2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFNjaGVtYUdlbmVyYXRpb24+KHRoaXMuc2NoZW1hR2VuKTsKLQkJCi0JCXRoaXMuZGRsR2VuZXJhdGlvblR5cGVIb2xkZXIgPSB0aGlzLmJ1aWxkRGRsR2VuZXJhdGlvblR5cGVBQSh0aGlzLnNjaGVtYUdlbkhvbGRlcik7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZGRsR2VuZXJhdGlvblR5cGVMaXN0ZW5lciA9IHRoaXMuYnVpbGREZGxHZW5lcmF0aW9uVHlwZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZGRsR2VuZXJhdGlvblR5cGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGRkbEdlbmVyYXRpb25UeXBlTGlzdGVuZXIpOwotCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlRXZlbnQgPSBudWxsOwotCQkKLQkJdGhpcy5vdXRwdXRNb2RlSG9sZGVyID0gdGhpcy5idWlsZE91dHB1dE1vZGVBQSh0aGlzLnNjaGVtYUdlbkhvbGRlcik7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgb3V0cHV0TW9kZUxpc3RlbmVyID0gdGhpcy5idWlsZE91dHB1dE1vZGVDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLm91dHB1dE1vZGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIG91dHB1dE1vZGVMaXN0ZW5lcik7Ci0JCXRoaXMub3V0cHV0TW9kZUV2ZW50ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4gQ2Fubm90IHVzZQotCSAqIFByb3BlcnR5IEhvbGRlciB0byBpbml0aWFsaXplIGJlY2F1c2UgaXQgaXMgbm90IGNyZWF0ZWQgeWV0Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgKLQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSwKLQkJCURETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoCi0JCQlTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX09VVFBVVF9NT0RFLAotCQkJT1VUUFVUX01PREVfVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hR2VuOwotCX0KLQotCS8qKiAqKioqKiogRGRsR2VuZXJhdGlvblR5cGUgKioqKioqKiAqLwotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxEZGxHZW5lcmF0aW9uVHlwZT4gYnVpbGREZGxHZW5lcmF0aW9uVHlwZUFBKFByb3BlcnR5VmFsdWVNb2RlbDxTY2hlbWFHZW5lcmF0aW9uPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFNjaGVtYUdlbmVyYXRpb24sIERkbEdlbmVyYXRpb25UeXBlPihzdWJqZWN0SG9sZGVyLCBTY2hlbWFHZW5lcmF0aW9uLkRETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIERkbEdlbmVyYXRpb25UeXBlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGRsR2VuZXJhdGlvblR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oRGRsR2VuZXJhdGlvblR5cGUgZW51bVZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldERkbEdlbmVyYXRpb25UeXBlKGVudW1WYWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRGRsR2VuZXJhdGlvblR5cGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVNjaGVtYUdlbmVyYXRpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5kZGxHZW5lcmF0aW9uVHlwZUV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKiogKioqKioqIE91dHB1dE1vZGUgKioqKioqKiAqLwotCXByaXZhdGUgTW9kaWZpYWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPdXRwdXRNb2RlPiBidWlsZE91dHB1dE1vZGVBQShQcm9wZXJ0eVZhbHVlTW9kZWw8U2NoZW1hR2VuZXJhdGlvbj4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTY2hlbWFHZW5lcmF0aW9uLCBPdXRwdXRNb2RlPihzdWJqZWN0SG9sZGVyLCBTY2hlbWFHZW5lcmF0aW9uLk9VVFBVVF9NT0RFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPdXRwdXRNb2RlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0T3V0cHV0TW9kZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPdXRwdXRNb2RlIGVudW1WYWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRPdXRwdXRNb2RlKGVudW1WYWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkT3V0cHV0TW9kZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU2NoZW1hR2VuZXJhdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLm91dHB1dE1vZGVFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQkvKiogKioqKioqIERkbEdlbmVyYXRpb25UeXBlICoqKioqKiogKi8KLQkJdGhpcy52ZXJpZnlEZGxHZW5lcmF0aW9uVHlwZUFBVmFsdWUoRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJU2NoZW1hR2VuZXJhdGlvbi5ERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0RETF9HRU5FUkFUSU9OX1RZUEUsCi0JCQl0aGlzLnNjaGVtYUdlbi5nZXREZWZhdWx0RGRsR2VuZXJhdGlvblR5cGUoKSk7Ci0JCS8qKiAqKioqKiogT3V0cHV0TW9kZSAqKioqKioqICovCi0JCXRoaXMudmVyaWZ5T3V0cHV0TW9kZUFBVmFsdWUoT1VUUFVUX01PREVfVEVTVF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscygKLQkJCVNjaGVtYUdlbmVyYXRpb24uREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9PVVRQVVRfTU9ERSwKLQkJCXRoaXMuc2NoZW1hR2VuLmdldERlZmF1bHRPdXRwdXRNb2RlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvKiogKioqKioqIERkbEdlbmVyYXRpb25UeXBlICoqKioqKiogKi8KLQkJdGhpcy5kZGxHZW5lcmF0aW9uVHlwZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5kZGxHZW5lcmF0aW9uVHlwZUhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJRGRsR2VuZXJhdGlvblR5cGUgbmV3RGRsR2VuZXJhdGlvblR5cGUgPSBEZGxHZW5lcmF0aW9uVHlwZS5jcmVhdGVfdGFibGVzOwotCQkvLyBNb2RpZnkgdGhlIHBlcnNpc3RlbmNlVW5pdCBkaXJlY3RseQotCQl0aGlzLnN1YmplY3Quc2V0UHJvcGVydHkoCi0JCQlTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX1RZUEUsCi0JCQl0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihuZXdEZGxHZW5lcmF0aW9uVHlwZSksCi0JCQlmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5RGRsR2VuZXJhdGlvblR5cGVBQVZhbHVlKG5ld0RkbEdlbmVyYXRpb25UeXBlKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmRkbEdlbmVyYXRpb25UeXBlRXZlbnQpOwotCQkKLQkJLyoqICoqKioqKiBPdXRwdXRNb2RlICoqKioqKiogKi8KLQkJdGhpcy5vdXRwdXRNb2RlRXZlbnQgPSBudWxsOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLm91dHB1dE1vZGVIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSk7Ci0JCU91dHB1dE1vZGUgbmV3T3V0cHV0TW9kZSA9IE91dHB1dE1vZGUuZGF0YWJhc2U7Ci0JCS8vIE1vZGlmeSB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMub3V0cHV0TW9kZUhvbGRlci5zZXRWYWx1ZShuZXdPdXRwdXRNb2RlKTsKLQkJdGhpcy52ZXJpZnlPdXRwdXRNb2RlQUFWYWx1ZShuZXdPdXRwdXRNb2RlKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLm91dHB1dE1vZGVFdmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE51bGxWYWx1ZSgpIHsKLQkJLyoqICoqKioqKiBEZGxHZW5lcmF0aW9uVHlwZSAqKioqKioqICovCi0JCXRoaXMuZGRsR2VuZXJhdGlvblR5cGVFdmVudCA9IG51bGw7Ci0JCS8vIFNldHRpbmcgdGhlIHBlcnNpc3RlbmNlVW5pdCBkaXJlY3RseQotCQl0aGlzLnN1YmplY3Quc2V0UHJvcGVydHkoU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFLCBudWxsLCBmYWxzZSk7Ci0JCXRoaXMuZGRsR2VuZXJhdGlvblR5cGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCS8vIHRlc3RpbmcgSG9sZGVyCi0JCXRoaXMudmVyaWZ5RGRsR2VuZXJhdGlvblR5cGVBQVZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZGRsR2VuZXJhdGlvblR5cGVFdmVudCk7Ci0JCS8vIHRlc3RpbmcgUFUgcHJvcGVydGllcwotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KFNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSk7Ci0JCWFzc2VydE51bGwocHJvcGVydHkpOwotCQkKLQkJLyoqICoqKioqKiBPdXRwdXRNb2RlICoqKioqKiogKi8KLQkJdGhpcy5vdXRwdXRNb2RlRXZlbnQgPSBudWxsOwotCQkvLyBTZXR0aW5nIHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5vdXRwdXRNb2RlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkvLyB0ZXN0aW5nIEhvbGRlcgotCQl0aGlzLnZlcmlmeU91dHB1dE1vZGVBQVZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMub3V0cHV0TW9kZUV2ZW50KTsKLQkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCi0JCXByb3BlcnR5ID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX09VVFBVVF9NT0RFKTsKLQkJYXNzZXJ0TnVsbChwcm9wZXJ0eSk7Ci0JfQotCi0JLyoqICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKiogKi8KLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5RGRsR2VuZXJhdGlvblR5cGVBQVZhbHVlKERkbEdlbmVyYXRpb25UeXBlIHRlc3RWYWx1ZSkgewotCQl0aGlzLnZlcmlmeUFBVmFsdWUoCi0JCQl0ZXN0VmFsdWUsCi0JCQl0aGlzLnNjaGVtYUdlbi5nZXREZGxHZW5lcmF0aW9uVHlwZSgpLAotCQkJdGhpcy5kZGxHZW5lcmF0aW9uVHlwZUhvbGRlciwKLQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhyZWUgdmFsdWUgdGVzdHM6PGJyPgotCSAqIDEuIHN1YmplY3QgdmFsdWU8YnI+Ci0JICogMi4gYXNwZWN0IGFkYXB0ZXIgdmFsdWU8YnI+Ci0JICogMy4gcGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IHZhbHVlPGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeU91dHB1dE1vZGVBQVZhbHVlKE91dHB1dE1vZGUgdGVzdFZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5QUFWYWx1ZSgKLQkJCXRlc3RWYWx1ZSwKLQkJCXRoaXMuc2NoZW1hR2VuLmdldE91dHB1dE1vZGUoKSwKLQkJCXRoaXMub3V0cHV0TW9kZUhvbGRlciwKLQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fT1VUUFVUX01PREUpOwotCX0KLQotCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvbWV0YWRhdGEvRWNsaXBzZUxpbmtTdGF0aWNXZWF2aW5nQnVpbGRlck1ldGFkYXRhVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9tZXRhZGF0YS9FY2xpcHNlTGlua1N0YXRpY1dlYXZpbmdCdWlsZGVyTWV0YWRhdGFUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTBhZDQ1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9tZXRhZGF0YS9FY2xpcHNlTGlua1N0YXRpY1dlYXZpbmdCdWlsZGVyTWV0YWRhdGFUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5tZXRhZGF0YTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwubWV0YWRhdGEuSnBhTWV0YWRhdGFUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuYnVpbGRlci5FY2xpcHNlTGlua1N0YXRpY1dlYXZpbmdCdWlsZGVyQ29uZmlndXJhdG9yOwotCi0vKioKLSAqICBKcGFTdGF0aWNXZWF2aW5nQnVpbGRlck1ldGFkYXRhVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rU3RhdGljV2VhdmluZ0J1aWxkZXJNZXRhZGF0YVRlc3RzIGV4dGVuZHMgSnBhTWV0YWRhdGFUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfUFJFRl9LRVkgPSAic3RhdGljd2VhdmUuU09VUkNFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19MRVZFTF9QUkVGX0tFWSA9ICJzdGF0aWN3ZWF2ZS5MT0dfTEVWRUwiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX1RFU1RfVkFMVUUgPSAiYmluIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19MRVZFTF9URVNUX1ZBTFVFID0gIkFMTCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua1N0YXRpY1dlYXZpbmdCdWlsZGVyQ29uZmlndXJhdG9yIHByb2plY3RQcmVmc01hbmFnZXI7Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtTdGF0aWNXZWF2aW5nQnVpbGRlck1ldGFkYXRhVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQotCQl0aGlzLnByb2plY3RQcmVmc01hbmFnZXIgPSBuZXcgRWNsaXBzZUxpbmtTdGF0aWNXZWF2aW5nQnVpbGRlckNvbmZpZ3VyYXRvcih0aGlzLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwodGhpcy5wcm9qZWN0UHJlZnNNYW5hZ2VyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTb3VyY2VMb2NhdGlvblByb2plY3RNZXRhZGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXRoaXMucHJvamVjdFByZWZzTWFuYWdlci5zZXRTb3VyY2VMb2NhdGlvblByZWZlcmVuY2UoU09VUkNFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnByb2plY3RQcmVmc01hbmFnZXIuZ2V0TGVnYWN5UHJvamVjdFByZWZlcmVuY2VzKCkuZmx1c2goKTsKLQkJCi0JCVN0cmluZyB2YWx1ZSA9IHRoaXMuZ2V0UHJvamVjdFByZWZzKCkuZ2V0KFNPVVJDRV9QUkVGX0tFWSk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKHZhbHVlKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoU09VUkNFX1RFU1RfVkFMVUUuZXF1YWxzKHZhbHVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExvZ0xldmVsUHJvamVjdE1ldGFkYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJdGhpcy5wcm9qZWN0UHJlZnNNYW5hZ2VyLnNldExvZ0xldmVsUHJlZmVyZW5jZShMT0dfTEVWRUxfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucHJvamVjdFByZWZzTWFuYWdlci5nZXRMZWdhY3lQcm9qZWN0UHJlZmVyZW5jZXMoKS5mbHVzaCgpOwotCQkKLQkJU3RyaW5nIHZhbHVlID0gdGhpcy5nZXRQcm9qZWN0UHJlZnMoKS5nZXQoTE9HX0xFVkVMX1BSRUZfS0VZKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwodmFsdWUpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShMT0dfTEVWRUxfVEVTVF9WQUxVRS5lcXVhbHModmFsdWUpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL21ldGFkYXRhL0pwdEpwYUVjbGlwc2VMaW5rQ29yZU1ldGFkYXRhVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9tZXRhZGF0YS9KcHRKcGFFY2xpcHNlTGlua0NvcmVNZXRhZGF0YVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOGFkZjUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL21ldGFkYXRhL0pwdEpwYUVjbGlwc2VMaW5rQ29yZU1ldGFkYXRhVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwubWV0YWRhdGE7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0KLS8qKgotICogIEpwdEpwYUVjbGlwc2VMaW5rQ29yZU1ldGFkYXRhVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEpwdEpwYUVjbGlwc2VMaW5rQ29yZU1ldGFkYXRhVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEpwYUVjbGlwc2VMaW5rQ29yZU1ldGFkYXRhVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua1N0YXRpY1dlYXZpbmdCdWlsZGVyTWV0YWRhdGFUZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEpwYUVjbGlwc2VMaW5rQ29yZU1ldGFkYXRhVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9KcHRKcGFFY2xpcHNlbGlua0NvcmVSZXNvdXJjZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9KcHRKcGFFY2xpcHNlbGlua0NvcmVSZXNvdXJjZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY1OTU0Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvSnB0SnBhRWNsaXBzZWxpbmtDb3JlUmVzb3VyY2VNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5KcHRKcGFFY2xpcHNlTGlua0NvcmVUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5KcHRFY2xpcHNlTGlua0NvcmVKYXZhUmVzb3VyY2VNb2RlbFRlc3RzOwotCi0vKioKLSAqIFJlcXVpcmVkIEphdmEgc3lzdGVtIHByb3BlcnR5OgotICogICAgLURvcmcuZWNsaXBzZS5qcHQuanBhLmphcj08anBhLmphciBwYXRoPgotICogICAgLURvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuamFyPTxlY2xpcHNlbGluay5qYXIgcGF0aD4KLSAqLwotcHVibGljIGNsYXNzIEpwdEpwYUVjbGlwc2VsaW5rQ29yZVJlc291cmNlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEpwYUVjbGlwc2VsaW5rQ29yZVJlc291cmNlTW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlpZihKcHRKcGFFY2xpcHNlTGlua0NvcmVUZXN0cy5yZXF1aXJlZEphcnNFeGlzdHMoKSkgewotCQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua0NvcmVKYXZhUmVzb3VyY2VNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJc3VpdGUuYWRkVGVzdChUZXN0U3VpdGUud2FybmluZyhKcHRKcGFFY2xpcHNlTGlua0NvcmVUZXN0cy5idWlsZE1pc3NpbmdKYXJFcnJvck1lc3NhZ2UoKSkpOwotCQl9Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEpwYUVjbGlwc2VsaW5rQ29yZVJlc291cmNlTW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ2FjaGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ2FjaGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTI0MzQ1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NhY2hlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVDb29yZGluYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlSXNvbGF0aW9uVHlwZTJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDYWNoZVRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBDYWNoZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DQUNIRSwgRWNsaXBzZUxpbmsuQ0FDSEVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENhY2hlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlV2l0aENhY2hlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rLkNBQ0hFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZSh0eXBlID0gQ2FjaGVUeXBlLlNPRlQpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlV2l0aFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoc2l6ZSA9IDUwKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDYWNoZVdpdGhFeHBpcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoZXhwaXJ5ID0gNTApIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlV2l0aEV4cGlyeVRpbWVPZkRheSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoZXhwaXJ5VGltZU9mRGF5ID0gQFRpbWVPZkRheSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDYWNoZVdpdGhTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoc2hhcmVkPXRydWUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2FjaGVXaXRoQWx3YXlzUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZShhbHdheXNSZWZyZXNoPXRydWUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlV2l0aFJlZnJlc2hPbmx5SWZOZXdlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZShyZWZyZXNoT25seUlmTmV3ZXI9dHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2FjaGVXaXRoRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoZGlzYWJsZUhpdHM9dHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2FjaGVXaXRoQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rLkNBQ0hFX0NPT1JESU5BVElPTl9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoY29vcmRpbmF0aW9uVHlwZSA9IENhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2FjaGVXaXRoSXNvbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DQUNIRSwgRWNsaXBzZUxpbmsuQ0FDSEVfSVNPTEFUSU9OX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZShpc29sYXRpb24gPSBDYWNoZUlzb2xhdGlvblR5cGUuSVNPTEFURUQpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FjaGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnROb3ROdWxsKGNhY2hlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoQ2FjaGVUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoQ2FjaGVUeXBlLlNPRlQsIGNhY2hlLmdldFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aENhY2hlVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoQ2FjaGVUeXBlLlNPRlQsIGNhY2hlLmdldFR5cGUoKSk7Ci0JCQotCQljYWNoZS5zZXRUeXBlKENhY2hlVHlwZS5XRUFLKTsKLQkJYXNzZXJ0RXF1YWxzKENhY2hlVHlwZS5XRUFLLCBjYWNoZS5nZXRUeXBlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZSh0eXBlID0gV0VBSykiLCBjdSk7Ci0JCQotCQljYWNoZS5zZXRUeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKGNhY2hlLmdldFR5cGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKHR5cGUgPSBXRUFLKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhTaXplKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTApLCBjYWNoZS5nZXRTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhTaXplKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTApLCBjYWNoZS5nZXRTaXplKCkpOwotCQkKLQkJY2FjaGUuc2V0U2l6ZShJbnRlZ2VyLnZhbHVlT2YoODApKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4MCksIGNhY2hlLmdldFNpemUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlKHNpemUgPSA4MCkiLCBjdSk7Ci0JCQotCQljYWNoZS5zZXRTaXplKG51bGwpOwotCQlhc3NlcnROdWxsKGNhY2hlLmdldFNpemUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKHNpemUgPSA4MCkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhTaGFyZWQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0U2hhcmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aFNoYXJlZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZS5nZXRTaGFyZWQoKSk7Ci0JCQotCQljYWNoZS5zZXRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZS5nZXRTaGFyZWQoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlKHNoYXJlZD1mYWxzZSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTaGFyZWROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhTaGFyZWQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0U2hhcmVkKCkpOwotCQkKLQkJY2FjaGUuc2V0U2hhcmVkKG51bGwpOwotCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENhY2hlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEV4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoRXhwaXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTApLCBjYWNoZS5nZXRFeHBpcnkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEV4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoRXhwaXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTApLCBjYWNoZS5nZXRFeHBpcnkoKSk7Ci0JCQotCQljYWNoZS5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDgwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODApLCBjYWNoZS5nZXRFeHBpcnkoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlKGV4cGlyeSA9IDgwKSIsIGN1KTsKLQkJCi0JCWNhY2hlLnNldEV4cGlyeShudWxsKTsKLQkJYXNzZXJ0TnVsbChjYWNoZS5nZXRFeHBpcnkoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKGV4cGlyeSA9IDgwKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRFeHBpcnlUaW1lT2ZEYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aEV4cGlyeVRpbWVPZkRheSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gdGltZU9mRGF5ID0gY2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCk7Ci0JCWFzc2VydE5vdE51bGwodGltZU9mRGF5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkRXhwaXJ5VGltZU9mRGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQljYWNoZS5hZGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoY2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZShleHBpcnlUaW1lT2ZEYXkgPSBAVGltZU9mRGF5KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUV4cGlyeVRpbWVPZkRheSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQotCQljYWNoZS5yZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJYXNzZXJ0TnVsbChjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGUoZXhwaXJ5VGltZU9mRGF5ID0gQFRpbWVPZkRheSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhBbHdheXNSZWZyZXNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhBbHdheXNSZWZyZXNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCQotCQljYWNoZS5zZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGUuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGUoYWx3YXlzUmVmcmVzaD1mYWxzZSkiLCBjdSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEFsd2F5c1JlZnJlc2hOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhBbHdheXNSZWZyZXNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCQotCQljYWNoZS5zZXRBbHdheXNSZWZyZXNoKG51bGwpOwotCQljYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnROdWxsKGNhY2hlLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENhY2hlKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhSZWZyZXNoT25seUlmTmV3ZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWZyZXNoT25seUlmTmV3ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aFJlZnJlc2hPbmx5SWZOZXdlcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQotCQljYWNoZS5zZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlKHJlZnJlc2hPbmx5SWZOZXdlcj1mYWxzZSkiLCBjdSk7CQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWZyZXNoT25seUlmTmV3ZXJOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhSZWZyZXNoT25seUlmTmV3ZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQkJY2FjaGUuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKG51bGwpOwotCQljYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnROdWxsKGNhY2hlLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZSgiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERpc2FibGVIaXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhEaXNhYmxlSGl0cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZS5nZXREaXNhYmxlSGl0cygpKTsJCQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXREaXNhYmxlSGl0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoRGlzYWJsZUhpdHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCQotCQljYWNoZS5zZXREaXNhYmxlSGl0cyhCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlLmdldERpc2FibGVIaXRzKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZShkaXNhYmxlSGl0cz1mYWxzZSkiLCBjdSk7CQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXREaXNhYmxlSGl0c051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aERpc2FibGVIaXRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZS5nZXREaXNhYmxlSGl0cygpKTsKLQkJCi0JCWNhY2hlLnNldERpc2FibGVIaXRzKG51bGwpOwotCQljYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnROdWxsKGNhY2hlLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENhY2hlKCIsIGN1KTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoQ29vcmRpbmF0aW9uVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKENhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgY2FjaGUuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoQ29vcmRpbmF0aW9uVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKENhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgY2FjaGUuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCWNhY2hlLnNldENvb3JkaW5hdGlvblR5cGUoQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTKTsKLQkJYXNzZXJ0RXF1YWxzKENhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgY2FjaGUuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGUoY29vcmRpbmF0aW9uVHlwZSA9IFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTKSIsIGN1KTsKLQkJCi0JCWNhY2hlLnNldENvb3JkaW5hdGlvblR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwoY2FjaGUuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIoY29vcmRpbmF0aW9uVHlwZSA9IFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZSgiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldElzb2xhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoSXNvbGF0aW9uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKENhY2hlSXNvbGF0aW9uVHlwZTJfMi5JU09MQVRFRCwgY2FjaGUuZ2V0SXNvbGF0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJc29sYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aElzb2xhdGlvbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhDYWNoZUlzb2xhdGlvblR5cGUyXzIuSVNPTEFURUQsIGNhY2hlLmdldElzb2xhdGlvbigpKTsKLQotCQljYWNoZS5zZXRJc29sYXRpb24oQ2FjaGVJc29sYXRpb25UeXBlMl8yLlNIQVJFRCk7Ci0JCWFzc2VydEVxdWFscyhDYWNoZUlzb2xhdGlvblR5cGUyXzIuU0hBUkVELCBjYWNoZS5nZXRJc29sYXRpb24oKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZShpc29sYXRpb24gPSBTSEFSRUQpIiwgY3UpOwotCi0JCWNhY2hlLnNldElzb2xhdGlvbihDYWNoZUlzb2xhdGlvblR5cGUyXzIuUFJPVEVDVEVEKTsKLQkJYXNzZXJ0RXF1YWxzKENhY2hlSXNvbGF0aW9uVHlwZTJfMi5QUk9URUNURUQsIGNhY2hlLmdldElzb2xhdGlvbigpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlKGlzb2xhdGlvbiA9IFBST1RFQ1RFRCkiLCBjdSk7Ci0KLQkJY2FjaGUuc2V0SXNvbGF0aW9uKG51bGwpOwotCQlhc3NlcnROdWxsKGNhY2hlLmdldElzb2xhdGlvbigpKTsKLQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKGlzb2xhdGlvbiA9IFNIQVJFRCkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGUoIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NoYW5nZVRyYWNraW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NoYW5nZVRyYWNraW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY0YzMwNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9DaGFuZ2VUcmFja2luZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDaGFuZ2VUcmFja2luZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBDaGFuZ2VUcmFja2luZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkcsIEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lOR19UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2hhbmdlVHJhY2tpbmciKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2hhbmdlVHJhY2tpbmdXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORywgRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDaGFuZ2VUcmFja2luZyhDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2hhbmdlVHJhY2tpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gZXhpc3RlbmNlQ2hlY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7Ci0JCWFzc2VydE5vdE51bGwoZXhpc3RlbmNlQ2hlY2tpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2hhbmdlVHJhY2tpbmdXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gZXhpc3RlbmNlQ2hlY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7Ci0JCWFzc2VydEVxdWFscyhDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIGV4aXN0ZW5jZUNoZWNraW5nLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2hhbmdlVHJhY2tpbmdXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gZXhpc3RlbmNlQ2hlY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7Ci0JCWFzc2VydEVxdWFscyhDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIGV4aXN0ZW5jZUNoZWNraW5nLmdldFZhbHVlKCkpOwotCQkKLQkJZXhpc3RlbmNlQ2hlY2tpbmcuc2V0VmFsdWUoQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCWFzc2VydEVxdWFscyhDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBleGlzdGVuY2VDaGVja2luZy5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2hhbmdlVHJhY2tpbmcoQVRUUklCVVRFKSIsIGN1KTsKLQkJCi0JCWV4aXN0ZW5jZUNoZWNraW5nLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKGV4aXN0ZW5jZUNoZWNraW5nLmdldFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihBVFRSSUJVVEUpIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENoYW5nZVRyYWNraW5nIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENoYW5nZVRyYWNraW5nKCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Db252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGVlODIxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbnZlcnNpb25WYWx1ZUFubm90YXRpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIENvbnZlcnNpb25WYWx1ZUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPYmplY3RUeXBlQ29udmVydGVyIik7Ci0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IHtAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiRlwiLCBvYmplY3RWYWx1ZSA9IFwiRmVtYWxlXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldERhdGFWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhDb252ZXJzaW9uVmFsdWVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLmdldERhdGFWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGF0YVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuZ2V0RGF0YVZhbHVlKCkpOwotCQkKLQkJY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLnNldERhdGFWYWx1ZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLmdldERhdGFWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0ge0BDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJGT09cIiwgb2JqZWN0VmFsdWUgPSBcIkZlbWFsZVwiKSwgQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIk1cIiwgb2JqZWN0VmFsdWUgPSBcIk1hbGVcIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldERhdGFWYWx1ZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoMCwgY29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQkKLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgwKS5zZXREYXRhVmFsdWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJGT09cIikpIiwgY3UpOwotCQkKLQkJY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLnNldERhdGFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSBAQ29udmVyc2lvblZhbHVlKSIsIGN1KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE9iamVjdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZlbWFsZSIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoQ29udmVyc2lvblZhbHVlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRmVtYWxlIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLmdldE9iamVjdFZhbHVlKCkpOwotCQkKLQkJY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLnNldE9iamVjdFZhbHVlKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IHtAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiRlwiLCBvYmplY3RWYWx1ZSA9IFwiRk9PXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0VmFsdWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCkuc2V0T2JqZWN0VmFsdWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IEBDb252ZXJzaW9uVmFsdWUob2JqZWN0VmFsdWUgPSBcIkZPT1wiKSkiLCBjdSk7Ci0JCQotCQljb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuc2V0T2JqZWN0VmFsdWUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0gQENvbnZlcnNpb25WYWx1ZSkiLCBjdSk7Ci0JCWFzc2VydEVxdWFscygxLCBjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udmVydEFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udmVydEFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmMwNTBkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbnZlcnRBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb252ZXJ0QW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgQ29udmVydEFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbnZlcnRlcldpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ09OVkVSVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQodmFsdWU9XCJteUNvbnZlcnRlclwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlQpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJUKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ09OVkVSVCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJUKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24gY29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ09OVkVSVCk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBjb252ZXJ0LmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29udmVydGVyV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uIGNvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgY29udmVydC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnZlcnQuc2V0VmFsdWUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnQuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbnZlcnQodmFsdWU9XCJCYXJcIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnRlcldpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbiBjb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJUKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIGNvbnZlcnQuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb252ZXJ0LnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbnZlcnQuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbnZlcnQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJ2YWx1ZSIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbnZlcnRlckFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udmVydGVyQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYTQzNDUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udmVydGVyQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnRlciIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoQ29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnRlcihjb252ZXJ0ZXJDbGFzcz1Gb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbnZlcnRlcldpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0ZXIobmFtZT1cImJhclwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydGVyQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29udmVydGVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5DT05WRVJURVIpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoRWNsaXBzZUxpbmsuQ09OVkVSVEVSKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuQ09OVkVSVEVSKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoQ29udmVydGVyQ2xhc3MoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoQ29udmVydGVyQ2xhc3MoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29udmVydGVyKGNvbnZlcnRlckNsYXNzPUJhci5jbGFzcykiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb252ZXJ0ZXJDbGFzc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnRlcldpdGhDb252ZXJ0ZXJDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbnZlcnRlciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNvbnZlcnRlckNsYXNzIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29udmVydGVyKG5hbWU9XCJmb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb252ZXJ0ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJuYW1lPSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9DdXN0b21pemVyQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9DdXN0b21pemVyQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyOGEyNTYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ3VzdG9taXplckFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEN1c3RvbWl6ZXJBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBDdXN0b21pemVyQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q3VzdG9taXplcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEN1c3RvbWl6ZXIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q3VzdG9taXplcldpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEN1c3RvbWl6ZXIoRm9vLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9taXplckFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEN1c3RvbWl6ZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DVVNUT01JWkVSKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGluay5DVVNUT01JWkVSKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DVVNUT01JWkVSKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DVVNUT01JWkVSKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DVVNUT01JWkVSKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDdXN0b21pemVyV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEN1c3RvbWl6ZXJXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldFZhbHVlKCkpOwotCQkKLQkJY29udmVydGVyLnNldFZhbHVlKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEN1c3RvbWl6ZXIoQmFyLmNsYXNzKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENvbnZlcnRlckNsYXNzTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q3VzdG9taXplcldpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DVVNUT01JWkVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmdldFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDdXN0b21pemVyIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vLmNsYXNzIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MjFlMGIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5KcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGluazJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlCi17CQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQU5OT1RBVElPTlNfUEFDS0FHRV9OQU1FID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBFY2xpcHNlTGluazJfMEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb25Qcm92aWRlciBidWlsZEFubm90YXRpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKcGFBbm5vdGF0aW9uUHJvdmlkZXIoCi0JCQlHZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpLAotCQkJRWNsaXBzZUxpbmsyXzBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmsyXzNKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGluazJfM0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk5NTExMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGluazJfM0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSnBhQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rMl8zSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8zSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UKLXsJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19BTk5PVEFUSU9OU19QQUNLQUdFX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIEVjbGlwc2VMaW5rMl8zSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvblByb3ZpZGVyIGJ1aWxkQW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEpwYUFubm90YXRpb25Qcm92aWRlcigKLQkJCUdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlFY2xpcHNlTGluazJfM0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDVmYzE5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5Bbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5KcGFBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmEuSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZQotewkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0FOTk9UQVRJT05TX1BBQ0tBR0VfTkFNRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBbm5vdGF0aW9uUHJvdmlkZXIgYnVpbGRBbm5vdGF0aW9uUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSnBhQW5ub3RhdGlvblByb3ZpZGVyKAotCQkJR2VuZXJpY0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCUVjbGlwc2VMaW5rSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NzgxZmIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZVdpdGhQcmltYXJ5S2V5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuUFJJTUFSWV9LRVkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZVdpdGhQcmltYXJ5S2V5QW5ub3RhdGlvbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlBSSU1BUllfS0VZKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGluay5QUklNQVJZX0tFWSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuUFJJTUFSWV9LRVkpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlBSSU1BUllfS0VZKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5QUklNQVJZX0tFWSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfM1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YzQ0ZmIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfM1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGluazJfM0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fTkFNRSA9ICJNWV9DT0xVTU4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gPSAiQ09MVU1OX0RFRklOSVRJT04iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fQ09OVEVYVF9QUk9QRVJUWSA9ICJlY2xpcHNlbGluay5mb28taWQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fVEFCTEUgPSAiTVlfVEFCTEUiOwotCi0JcHVibGljIEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5XaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihuYW1lID0gXCIiICsgQ09MVU1OX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5XaXRoQ29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihjb2x1bW5EZWZpbml0aW9uID0gXCIiICsgQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uV2l0aENvbnRleHRQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihjb250ZXh0UHJvcGVydHkgPSBcIiIgKyBDT0xVTU5fQ09OVEVYVF9QUk9QRVJUWSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbldpdGhUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbih0YWJsZSA9IFwiIiArIENPTFVNTl9UQUJMRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUZW5lbmF0RGlzY3JpbWluYXRvckNvbHVtbldpdGhEaXNjcmltaW5hdG9yVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OLCBKUEEuRElTQ1JJTUlOQVRPUl9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihkaXNjcmltaW5hdG9yVHlwZSA9IERpc2NyaW1pbmF0b3JUeXBlLkNIQVIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbHVtbldpdGhJbnRFbGVtZW50KGZpbmFsIFN0cmluZyBpbnRFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oIiArIGludEVsZW1lbnQgKyAiID0gNSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KGZpbmFsIFN0cmluZyBib29sZWFuRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCIgKyBib29sZWFuRWxlbWVudCArICIgPSB0cnVlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMgY29sdW1uID0gKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zIGNvbHVtbiA9IChFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMgY29sdW1uID0gKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCi0JCWNvbHVtbi5zZXROYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihuYW1lID0gXCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMgY29sdW1uID0gKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbHVtbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihuYW1lIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyBjb2x1bW4gPSAoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyBjb2x1bW4gPSAoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0KLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKGNvbHVtbkRlZmluaXRpb24gPSBcIkZvb1wiKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIoY29sdW1uRGVmaW5pdGlvbiIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW5XaXRoSW50RWxlbWVudCgibGVuZ3RoIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMgY29sdW1uID0gKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgY29sdW1uLmdldExlbmd0aCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zIGNvbHVtbiA9IChFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCi0JCWNvbHVtbi5zZXRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgY29sdW1uLmdldExlbmd0aCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihsZW5ndGggPSA1KSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXRMZW5ndGgobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIobGVuZ3RoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGlzY3JpbWluYXRvclR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRlbmVuYXREaXNjcmltaW5hdG9yQ29sdW1uV2l0aERpc2NyaW1pbmF0b3JUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMgY29sdW1uID0gKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5DSEFSLCBjb2x1bW4uZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXREaXNjcmltaW5hdG9yVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zIGNvbHVtbiA9IChFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCi0JCWFzc2VydE51bGwoY29sdW1uLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCi0JCWNvbHVtbi5zZXREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS5JTlRFR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLklOVEVHRVIsIGNvbHVtbi5nZXREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihkaXNjcmltaW5hdG9yVHlwZSA9IElOVEVHRVIpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldERpc2NyaW1pbmF0b3JUeXBlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKGRpc2NyaW1pbmF0b3JUeXBlIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb250ZXh0UHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5XaXRoQ29udGV4dFByb3BlcnR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMgY29sdW1uID0gKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fQ09OVEVYVF9QUk9QRVJUWSwgY29sdW1uLmdldENvbnRleHRQcm9wZXJ0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udGV4dFByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMgY29sdW1uID0gKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRDb250ZXh0UHJvcGVydHkoKSk7Ci0KLQkJY29sdW1uLnNldENvbnRleHRQcm9wZXJ0eSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldENvbnRleHRQcm9wZXJ0eSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihjb250ZXh0UHJvcGVydHkgPSBcIkZvb1wiKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldENvbnRleHRQcm9wZXJ0eShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihjb250ZXh0UHJvcGVydHkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uV2l0aFRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMgY29sdW1uID0gKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fVEFCTEUsIGNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyBjb2x1bW4gPSAoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFRhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXRUYWJsZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKHRhYmxlID0gXCJGb29cIikiLCBjdSk7Ci0KLQkJCi0JCWNvbHVtbi5zZXRUYWJsZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIih0YWJsZSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UHJpbWFyeUtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJwcmltYXJ5S2V5Iik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMgY29sdW1uID0gKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldFByaW1hcnlLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRQcmltYXJ5S2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMgY29sdW1uID0gKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRQcmltYXJ5S2V5KCkpOwotCi0JCWNvbHVtbi5zZXRQcmltYXJ5S2V5KEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldFByaW1hcnlLZXkoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4ocHJpbWFyeUtleSA9IGZhbHNlKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXRQcmltYXJ5S2V5KG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigicHJpbWFyeUtleSIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VsaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VsaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkwMDQ4ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlbGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfM1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLk11bHRpdGVuYW50VHlwZTJfMzsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZWxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzNUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8zSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRWNsaXBzZWxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNdWx0aXRlbmFudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuTVVMVElURU5BTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNdWx0aXRlbmFudCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNdWx0aXRlbmFudFdpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuTVVMVElURU5BTlQsIEVjbGlwc2VMaW5rLk1VTFRJVEVOQU5UX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNdWx0aXRlbmFudChNdWx0aXRlbmFudFR5cGUuU0lOR0xFX1RBQkxFKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlV2l0aEluY2x1ZGVDcml0ZXJpYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuTVVMVElURU5BTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNdWx0aXRlbmFudChpbmNsdWRlQ3JpdGVyaWE9dHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE11bHRpdGVuYW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNdWx0aXRlbmFudCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCUVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zIG11bHRpdGVuYW50ID0gKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5NVUxUSVRFTkFOVCk7Ci0JCWFzc2VydE5vdE51bGwobXVsdGl0ZW5hbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TXVsdGl0ZW5hbnRXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMgbXVsdGl0ZW5hbnQgPSAoRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VTFRJVEVOQU5UKTsKLQkJYXNzZXJ0RXF1YWxzKE11bHRpdGVuYW50VHlwZTJfMy5TSU5HTEVfVEFCTEUsIG11bHRpdGVuYW50LmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TXVsdGl0ZW5hbnRXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMgbXVsdGl0ZW5hbnQgPSAoRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VTFRJVEVOQU5UKTsKLQkJYXNzZXJ0RXF1YWxzKE11bHRpdGVuYW50VHlwZTJfMy5TSU5HTEVfVEFCTEUsIG11bHRpdGVuYW50LmdldFZhbHVlKCkpOwotCQkKLQkJbXVsdGl0ZW5hbnQuc2V0VmFsdWUoTXVsdGl0ZW5hbnRUeXBlMl8zLlRBQkxFX1BFUl9URU5BTlQpOwotCQlhc3NlcnRFcXVhbHMoTXVsdGl0ZW5hbnRUeXBlMl8zLlRBQkxFX1BFUl9URU5BTlQsIG11bHRpdGVuYW50LmdldFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNdWx0aXRlbmFudChUQUJMRV9QRVJfVEVOQU5UKSIsIGN1KTsKLQkJCi0JCW11bHRpdGVuYW50LnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKG11bHRpdGVuYW50LmdldFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihUQUJMRV9QRVJfVEVOQU5UKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNdWx0aXRlbmFudCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNdWx0aXRlbmFudCgiLCBjdSk7Ci0JfQotCi0vLwotLy8JcHVibGljIHZvaWQgdGVzdEdldEluY2x1ZGVDcml0ZXJpYSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhJbmNsdWRlQ3JpdGVyaWEoKTsKLS8vCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0vLwkJCi0vLwkJRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMgbXVsdGl0ZW5hbnQgPSAoRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VTFRJVEVOQU5UKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdWx0aXRlbmFudC5nZXRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RTZXRJbmNsdWRlQ3JpdGVyaWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoSW5jbHVkZUNyaXRlcmlhKCk7Ci0vLwkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotLy8JCQotLy8JCUVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zIG11bHRpdGVuYW50ID0gKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5NVUxUSVRFTkFOVCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXVsdGl0ZW5hbnQuZ2V0SW5jbHVkZUNyaXRlcmlhKCkpOwotLy8JCQotLy8JCW11bHRpdGVuYW50LnNldEluY2x1ZGVDcml0ZXJpYShCb29sZWFuLkZBTFNFKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbXVsdGl0ZW5hbnQuZ2V0SW5jbHVkZUNyaXRlcmlhKCkpOwotLy8JCQotLy8JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATXVsdGl0ZW5hbnQoaW5jbHVkZUNyaXRlcmlhPWZhbHNlKSIsIGN1KTsJCQotLy8JfQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0U2V0SW5jbHVkZUNyaXRlcmlhTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhJbmNsdWRlQ3JpdGVyaWEoKTsKLS8vCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0vLwkJCi0vLwkJRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMgbXVsdGl0ZW5hbnQgPSAoRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VTFRJVEVOQU5UKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdWx0aXRlbmFudC5nZXRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0vLwkJCi0vLwkJbXVsdGl0ZW5hbnQuc2V0SW5jbHVkZUNyaXRlcmlhKG51bGwpOwotLy8JCW11bHRpdGVuYW50ID0gKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5NVUxUSVRFTkFOVCk7Ci0vLwkJYXNzZXJ0TnVsbChtdWx0aXRlbmFudC5nZXRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0vLwkJCi0vLwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNdWx0aXRlbmFudCIsIGN1KTsKLS8vCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE11bHRpdGVuYW50KCIsIGN1KTsKLS8vCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0V4aXN0ZW5jZUNoZWNraW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0V4aXN0ZW5jZUNoZWNraW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNmZDc0Mi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FeGlzdGVuY2VDaGVja2luZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlVHlwZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRXhpc3RlbmNlQ2hlY2tpbmdUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRXhpc3RlbmNlQ2hlY2tpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFeGlzdGVuY2VDaGVja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuRVhJU1RFTkNFX0NIRUNLSU5HLCBFY2xpcHNlTGluay5FWElTVEVOQ0VfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEV4aXN0ZW5jZUNoZWNraW5nIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEV4aXN0ZW5jZUNoZWNraW5nV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcsIEVjbGlwc2VMaW5rLkVYSVNURU5DRV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARXhpc3RlbmNlQ2hlY2tpbmcoRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhpc3RlbmNlQ2hlY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEV4aXN0ZW5jZUNoZWNraW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGV4aXN0ZW5jZUNoZWNraW5nID0gKEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcpOwotCQlhc3NlcnROb3ROdWxsKGV4aXN0ZW5jZUNoZWNraW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEV4aXN0ZW5jZUNoZWNraW5nV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGV4aXN0ZW5jZUNoZWNraW5nID0gKEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcpOwotCQlhc3NlcnRFcXVhbHMoRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBleGlzdGVuY2VDaGVja2luZy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEV4aXN0ZW5jZUNoZWNraW5nV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGV4aXN0ZW5jZUNoZWNraW5nID0gKEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcpOwotCQlhc3NlcnRFcXVhbHMoRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBleGlzdGVuY2VDaGVja2luZy5nZXRWYWx1ZSgpKTsKLQkJCi0JCWV4aXN0ZW5jZUNoZWNraW5nLnNldFZhbHVlKEV4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UpOwotCQlhc3NlcnRFcXVhbHMoRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgZXhpc3RlbmNlQ2hlY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEV4aXN0ZW5jZUNoZWNraW5nKEFTU1VNRV9OT05fRVhJU1RFTkNFKSIsIGN1KTsKLQkJCi0JCWV4aXN0ZW5jZUNoZWNraW5nLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKGV4aXN0ZW5jZUNoZWNraW5nLmdldFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihBU1NVTUVfTk9OX0VYSVNURU5DRSkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARXhpc3RlbmNlQ2hlY2tpbmciLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJARXhpc3RlbmNlQ2hlY2tpbmcoIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5GZXRjaFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luRmV0Y2hUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDYwOWNjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5GZXRjaFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSm9pbkZldGNoVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIEpvaW5GZXRjaFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkZldGNoIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5GZXRjaFdpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkZldGNoKEpvaW5GZXRjaFR5cGUuT1VURVIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKb2luRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5GZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCi0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBqb2luRmV0Y2ggPSAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCk7Ci0JCWFzc2VydE5vdE51bGwoam9pbkZldGNoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5GZXRjaFdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaCA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5KT0lOX0ZFVENIKTsKLQkJYXNzZXJ0RXF1YWxzKEpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5GZXRjaFdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaCA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5KT0lOX0ZFVENIKTsKLQkJYXNzZXJ0RXF1YWxzKEpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWpvaW5GZXRjaC5zZXRWYWx1ZShKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJYXNzZXJ0RXF1YWxzKEpvaW5GZXRjaFR5cGUuSU5ORVIsIGpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkZldGNoKElOTkVSKSIsIGN1KTsKLQkJCi0JCWpvaW5GZXRjaC5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKElOTkVSKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luRmV0Y2giLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pbkZldGNoKCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KcHRFY2xpcHNlTGlua0NvcmVKYXZhUmVzb3VyY2VNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KcHRFY2xpcHNlTGlua0NvcmVKYXZhUmVzb3VyY2VNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZDVkMDQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSnB0RWNsaXBzZUxpbmtDb3JlSmF2YVJlc291cmNlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGlua0NvcmVKYXZhUmVzb3VyY2VNb2RlbFRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGlua0NvcmVKYXZhUmVzb3VyY2VNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDYWNoZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENoYW5nZVRyYWNraW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbnZlcnRBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29udmVydGVyQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEN1c3RvbWl6ZXJBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRXhpc3RlbmNlQ2hlY2tpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKb2luRmV0Y2hUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNdXRhYmxlQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByaXZhdGVPd25lZFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlYWRPbmx5VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN0cnVjdENvbnZlcnRlckFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUaW1lT2ZEYXlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUeXBlQ29udmVydGVyQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFdyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWFwS2V5Q29udmVydEFubm90YXRpb24yXzBUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlbGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfM1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzNUZXN0cy5jbGFzcyk7Ci0JCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRFY2xpcHNlTGlua0NvcmVKYXZhUmVzb3VyY2VNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hcEtleUNvbnZlcnRBbm5vdGF0aW9uMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hcEtleUNvbnZlcnRBbm5vdGF0aW9uMl8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NhNjM4MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYXBLZXlDb252ZXJ0QW5ub3RhdGlvbjJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNYXBLZXlDb252ZXJ0QW5ub3RhdGlvbjJfMDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTWFwS2V5Q29udmVydEFubm90YXRpb24yXzBUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8wSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIE1hcEtleUNvbnZlcnRBbm5vdGF0aW9uMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBLZXlDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5NQVBfS0VZX0NPTlZFUlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBLZXlDb252ZXJ0Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbnZlcnRlcldpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuTUFQX0tFWV9DT05WRVJUKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwS2V5Q29udmVydCh2YWx1ZT1cIm15Q29udmVydGVyXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlDb252ZXJ0QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFwS2V5Q29udmVydCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuTUFQX0tFWV9DT05WRVJUKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmsuTUFQX0tFWV9DT05WRVJUKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuTUFQX0tFWV9DT05WRVJUKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuTUFQX0tFWV9DT05WRVJUKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuTUFQX0tFWV9DT05WRVJUKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rTWFwS2V5Q29udmVydEFubm90YXRpb24yXzAgY29udmVydCA9IChFY2xpcHNlTGlua01hcEtleUNvbnZlcnRBbm5vdGF0aW9uMl8wKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuTUFQX0tFWV9DT05WRVJUKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIGNvbnZlcnQuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rTWFwS2V5Q29udmVydEFubm90YXRpb24yXzAgY29udmVydCA9IChFY2xpcHNlTGlua01hcEtleUNvbnZlcnRBbm5vdGF0aW9uMl8wKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuTUFQX0tFWV9DT05WRVJUKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIGNvbnZlcnQuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb252ZXJ0LnNldFZhbHVlKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0LmdldFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlDb252ZXJ0KHZhbHVlPVwiQmFyXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rTWFwS2V5Q29udmVydEFubm90YXRpb24yXzAgY29udmVydCA9IChFY2xpcHNlTGlua01hcEtleUNvbnZlcnRBbm5vdGF0aW9uMl8wKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuTUFQX0tFWV9DT05WRVJUKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIGNvbnZlcnQuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb252ZXJ0LnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbnZlcnQuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUNvbnZlcnQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJ2YWx1ZSIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL011dGFibGVBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL011dGFibGVBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkNGYwYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NdXRhYmxlQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTXV0YWJsZUFubm90YXRpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIE11dGFibGVBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5NVVRBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATXV0YWJsZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNdXRhYmxlV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5NVVRBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATXV0YWJsZSh2YWx1ZT10cnVlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TXV0YWJsZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE11dGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VVEFCTEUpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGluay5NVVRBQkxFKTsJCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5NVVRBQkxFKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuTVVUQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VVEFCTEUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE11dGFibGVXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE11dGFibGVXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE11dGFibGUodmFsdWU9ZmFsc2UpIiwgY3UpOwotCQkKLQkJbXV0YWJsZUFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE11dGFibGUoZmFsc2UpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNdXRhYmxlV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uIG11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5NVVRBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATXV0YWJsZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInZhbHVlIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDRmZmU2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPYmplY3RUeXBlQ29udmVydGVyIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoRGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9iamVjdFR5cGVDb252ZXJ0ZXIoZGF0YVR5cGU9Rm9vLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aE9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9iamVjdFR5cGVDb252ZXJ0ZXIob2JqZWN0VHlwZT1Gb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihuYW1lID0gXCJiYXJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhEZWZhdWx0T2JqZWN0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9iamVjdFR5cGVDb252ZXJ0ZXIoZGVmYXVsdE9iamVjdFZhbHVlID0gXCJmXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoQ29udmVyc2lvblZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGluay5DT05WRVJTSU9OX1ZBTFVFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0ge0BDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJGXCIsIG9iamVjdFZhbHVlID0gXCJGZW1hbGVcIiksIEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJNXCIsIG9iamVjdFZhbHVlID0gXCJNYWxlXCIpfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aERhdGFUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aERhdGFUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihkYXRhVHlwZT1CYXIuY2xhc3MpIiwgY3UpOwotCQkKLQkJY29udmVydGVyLnNldERhdGFUeXBlKCJpbnQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihkYXRhVHlwZT1pbnQuY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGF0YVR5cGVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aERhdGFUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0RGF0YVR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiZGF0YVR5cGUiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoT2JqZWN0VHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoT2JqZWN0VHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0T2JqZWN0VHlwZSgiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIob2JqZWN0VHlwZT1CYXIuY2xhc3MpIiwgY3UpOwotCQkKLQkJY29udmVydGVyLnNldE9iamVjdFR5cGUoImludCIpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIob2JqZWN0VHlwZT1pbnQuY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0VHlwZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoT2JqZWN0VHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0T2JqZWN0VHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm9iamVjdFR5cGUiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIobmFtZSA9IFwiZm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm5hbWU9IiwgY3UpOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0T2JqZWN0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoRGVmYXVsdE9iamVjdFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJmIiwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGVmYXVsdE9iamVjdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aERlZmF1bHRPYmplY3RWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiZiIsIGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0RGVmYXVsdE9iamVjdFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGRlZmF1bHRPYmplY3RWYWx1ZSA9IFwiZm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGVmYXVsdE9iamVjdFZhbHVlTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhEZWZhdWx0T2JqZWN0VmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoImYiLCBjb252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQkKLQkJY29udmVydGVyLnNldERlZmF1bHRPYmplY3RWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiZGVmYXVsdE9iamVjdFZhbHVlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVyc2lvblZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVyc2lvblZhbHVlczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0KLQkJCi0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCk7Ci0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygyLCBjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IGNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUoY29udmVyc2lvblZhbHVlcy5oYXNOZXh0KCkpOwotCQlhc3NlcnROb3ROdWxsKGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChjb252ZXJzaW9uVmFsdWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnNpb25WYWx1ZXMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgY29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBjb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gY29udmVyc2lvblZhbHVlID0gY29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRiIsIGNvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRmVtYWxlIiwgY29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCQljb252ZXJzaW9uVmFsdWUgPSBjb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNIiwgY29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNYWxlIiwgY29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb252ZXJzaW9uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCQotCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApLnNldE9iamVjdFZhbHVlKCJGT08iKTsKLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgxKTsKLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgwKS5zZXREYXRhVmFsdWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDEpLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgxKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDIpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMikuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKG5hbWUgPSBcImJhclwiLCBjb252ZXJzaW9uVmFsdWVzID0ge0BDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJCQVJcIiksQENvbnZlcnNpb25WYWx1ZShvYmplY3RWYWx1ZSA9IFwiRk9PXCIpLCBAQ29udmVyc2lvblZhbHVlfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb252ZXJzaW9uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoQ29udmVyc2lvblZhbHVlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCkuc2V0T2JqZWN0VmFsdWUoIkZPTyIpOwotCQkKLQkJSXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBjb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZlbWFsZSIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1hbGUiLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udmVyc2lvblZhbHVlcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IHtAQ29udmVyc2lvblZhbHVlKG9iamVjdFZhbHVlID0gXCJGT09cIiksIEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJGXCIsIG9iamVjdFZhbHVlID0gXCJGZW1hbGVcIiksIEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJNXCIsIG9iamVjdFZhbHVlID0gXCJNYWxlXCIpfSkiLCBjdSk7Ci0JCQotCQljb252ZXJ0ZXIucmVtb3ZlQ29udmVyc2lvblZhbHVlKDEpOwotCQljb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1hbGUiLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udmVyc2lvblZhbHVlcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IHtAQ29udmVyc2lvblZhbHVlKG9iamVjdFZhbHVlID0gXCJGT09cIiksIEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJNXCIsIG9iamVjdFZhbHVlID0gXCJNYWxlXCIpfSkiLCBjdSk7Ci0KLQkJY29udmVydGVyLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgwKTsKLQkJY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNYWxlIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKSkiLCBjdSk7Ci0KLQkJCi0JCWNvbnZlcnRlci5yZW1vdmVDb252ZXJzaW9uVmFsdWUoMCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAY29udmVyc2lvblZhbHVlcyIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUNvbnZlcnNpb25WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhDb252ZXJzaW9uVmFsdWVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgwKS5zZXRPYmplY3RWYWx1ZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IHtAQ29udmVyc2lvblZhbHVlKG9iamVjdFZhbHVlID0gXCJGT09cIiksIEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJGXCIsIG9iamVjdFZhbHVlID0gXCJGZW1hbGVcIiksIEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJNXCIsIG9iamVjdFZhbHVlID0gXCJNYWxlXCIpfSkiLCBjdSk7Ci0KLQkJY29udmVydGVyLm1vdmVDb252ZXJzaW9uVmFsdWUoMiwgMCk7Ci0JCWFzc2VydEVxdWFscygiRmVtYWxlIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1hbGUiLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMSkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTSIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgxKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDIpLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDIpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSB7QENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIkZcIiwgb2JqZWN0VmFsdWUgPSBcIkZlbWFsZVwiKSwgQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIk1cIiwgb2JqZWN0VmFsdWUgPSBcIk1hbGVcIiksIEBDb252ZXJzaW9uVmFsdWUob2JqZWN0VmFsdWUgPSBcIkZPT1wiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUNvbnZlcnNpb25WYWx1ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoQ29udmVyc2lvblZhbHVlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCkuc2V0T2JqZWN0VmFsdWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSB7QENvbnZlcnNpb25WYWx1ZShvYmplY3RWYWx1ZSA9IFwiRk9PXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiRlwiLCBvYmplY3RWYWx1ZSA9IFwiRmVtYWxlXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKX0pIiwgY3UpOwotCi0JCWNvbnZlcnRlci5tb3ZlQ29udmVyc2lvblZhbHVlKDAsIDIpOwotCQlhc3NlcnRFcXVhbHMoIk1hbGUiLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTSIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDEpLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDEpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGZW1hbGUiLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMikuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRiIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgyKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0ge0BDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJNXCIsIG9iamVjdFZhbHVlID0gXCJNYWxlXCIpLCBAQ29udmVyc2lvblZhbHVlKG9iamVjdFZhbHVlID0gXCJGT09cIiksIEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJGXCIsIG9iamVjdFZhbHVlID0gXCJGZW1hbGVcIil9KSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Qcml2YXRlT3duZWRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpdmF0ZU93bmVkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4YzZlOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Qcml2YXRlT3duZWRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQcml2YXRlT3duZWRUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUHJpdmF0ZU93bmVkVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RQcml2YXRlT3duZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlBSSVZBVEVfT1dORUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBQcml2YXRlT3duZWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcml2YXRlT3duZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFByaXZhdGVPd25lZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uIHByaXZhdGVPd25lZCA9IChFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5QUklWQVRFX09XTkVEKTsKLQkJYXNzZXJ0Tm90TnVsbChwcml2YXRlT3duZWQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUmVhZE9ubHlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUmVhZE9ubHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTFmNTljLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1JlYWRPbmx5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUmVhZE9ubHlUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuUkVBRF9PTkxZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAUmVhZE9ubHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UmVhZE9ubHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24gcmVhZE9ubHkgPSAoRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfT05MWSk7Ci0JCWFzc2VydE5vdE51bGwocmVhZE9ubHkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9SZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiNjUyYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9SZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlYWRUcmFuc2Zvcm1lckFubm90YXRpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFJlYWRUcmFuc2Zvcm1lckFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFJlYWRUcmFuc2Zvcm1lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFJlYWRUcmFuc2Zvcm1lciIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RSZWFkVHJhbnNmb3JtZXJXaXRoVHJhbnNmb3JtZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFJlYWRUcmFuc2Zvcm1lcih0cmFuc2Zvcm1lckNsYXNzPUZvby5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UmVhZFRyYW5zZm9ybWVyV2l0aE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFJlYWRUcmFuc2Zvcm1lcihtZXRob2Q9XCJ0cmFuc2Zvcm1lck1ldGhvZFwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UmVhZFRyYW5zZm9ybWVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUikJOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUik7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHJhbnNmb3JtZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UmVhZFRyYW5zZm9ybWVyV2l0aFRyYW5zZm9ybWVyQ2xhc3MoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbiByZWFkVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVhZFRyYW5zZm9ybWVyLmdldFRyYW5zZm9ybWVyQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFRyYW5zZm9ybWVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFJlYWRUcmFuc2Zvcm1lcldpdGhUcmFuc2Zvcm1lckNsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24gcmVhZFRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlYWRUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lckNsYXNzKCkpOwotCQkKLQkJcmVhZFRyYW5zZm9ybWVyLnNldFRyYW5zZm9ybWVyQ2xhc3MoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIHJlYWRUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lckNsYXNzKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBSZWFkVHJhbnNmb3JtZXIodHJhbnNmb3JtZXJDbGFzcz1CYXIuY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VHJhbnNmb3JtZXJDbGFzc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFJlYWRUcmFuc2Zvcm1lcldpdGhUcmFuc2Zvcm1lckNsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24gcmVhZFRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlYWRUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lckNsYXNzKCkpOwotCQkKLQkJcmVhZFRyYW5zZm9ybWVyLnNldFRyYW5zZm9ybWVyQ2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwocmVhZFRyYW5zZm9ybWVyLmdldFRyYW5zZm9ybWVyQ2xhc3MoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFJlYWRUcmFuc2Zvcm1lciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInRyYW5zZm9ybWVyQ2xhc3MiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFJlYWRUcmFuc2Zvcm1lcldpdGhNZXRob2QoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbiByZWFkVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUik7Ci0JCWFzc2VydEVxdWFscygidHJhbnNmb3JtZXJNZXRob2QiLCByZWFkVHJhbnNmb3JtZXIuZ2V0TWV0aG9kKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFJlYWRUcmFuc2Zvcm1lcldpdGhNZXRob2QoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbiByZWFkVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUik7Ci0JCWFzc2VydEVxdWFscygidHJhbnNmb3JtZXJNZXRob2QiLCByZWFkVHJhbnNmb3JtZXIuZ2V0TWV0aG9kKCkpOwotCQkKLQkJcmVhZFRyYW5zZm9ybWVyLnNldE1ldGhvZCgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVhZFRyYW5zZm9ybWVyLmdldE1ldGhvZCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAUmVhZFRyYW5zZm9ybWVyKG1ldGhvZD1cImZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1ldGhvZE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFJlYWRUcmFuc2Zvcm1lcldpdGhNZXRob2QoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbiByZWFkVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUik7Ci0JCWFzc2VydEVxdWFscygidHJhbnNmb3JtZXJNZXRob2QiLCByZWFkVHJhbnNmb3JtZXIuZ2V0TWV0aG9kKCkpOwotCQkKLQkJcmVhZFRyYW5zZm9ybWVyLnNldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0TnVsbChyZWFkVHJhbnNmb3JtZXIuZ2V0TWV0aG9kKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBSZWFkVHJhbnNmb3JtZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJtZXRob2QiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvU3RydWN0Q29udmVydGVyQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYxMjVlZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFN0cnVjdENvbnZlcnRlckFubm90YXRpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFN0cnVjdENvbnZlcnRlckFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFN0cnVjdENvbnZlcnRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFN0cnVjdENvbnZlcnRlciIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXJXaXRoQ29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAU3RydWN0Q29udmVydGVyKGNvbnZlcnRlcj1cIkZvb1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXJXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFN0cnVjdENvbnZlcnRlcihuYW1lPVwiYmFyXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFN0cnVjdENvbnZlcnRlcldpdGhDb252ZXJ0ZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXJXaXRoQ29udmVydGVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0Q29udmVydGVyKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTdHJ1Y3RDb252ZXJ0ZXIoY29udmVydGVyPVwiQmFyXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydGVyTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U3RydWN0Q29udmVydGVyV2l0aENvbnZlcnRlcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJY29udmVydGVyLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTdHJ1Y3RDb252ZXJ0ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjb252ZXJ0ZXIiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U3RydWN0Q29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFN0cnVjdENvbnZlcnRlcihuYW1lPVwiZm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFN0cnVjdENvbnZlcnRlcldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFN0cnVjdENvbnZlcnRlciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm5hbWU9IiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RpbWVPZkRheVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UaW1lT2ZEYXlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGYyY2NkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RpbWVPZkRheVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGltZU9mRGF5VGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIFRpbWVPZkRheVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRpbWVPZkRheSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoZXhwaXJ5VGltZU9mRGF5ID0gQFRpbWVPZkRheSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUaW1lT2ZEYXlXaXRoSG91cigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoZXhwaXJ5VGltZU9mRGF5ID0gQFRpbWVPZkRheShob3VyPTUpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUaW1lT2ZEYXlXaXRoTWludXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DQUNIRSwgRWNsaXBzZUxpbmsuVElNRV9PRl9EQVkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZShleHBpcnlUaW1lT2ZEYXkgPSBAVGltZU9mRGF5KG1pbnV0ZT01KSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGltZU9mRGF5V2l0aFNlY29uZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoZXhwaXJ5VGltZU9mRGF5ID0gQFRpbWVPZkRheShzZWNvbmQ9NSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhNaWxsaXNlY29uZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoZXhwaXJ5VGltZU9mRGF5ID0gQFRpbWVPZkRheShtaWxsaXNlY29uZD01KSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFeHBpcnlUaW1lT2ZEYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRpbWVPZkRheSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSA9IGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh0aW1lT2ZEYXkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SG91cigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGltZU9mRGF5V2l0aEhvdXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSA9IGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCB0aW1lT2ZEYXkuZ2V0SG91cigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SG91cigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGltZU9mRGF5V2l0aEhvdXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSA9IGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCB0aW1lT2ZEYXkuZ2V0SG91cigpKTsKLQkJCi0JCXRpbWVPZkRheS5zZXRIb3VyKEludGVnZXIudmFsdWVPZig4MCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgwKSwgdGltZU9mRGF5LmdldEhvdXIoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRpbWVPZkRheShob3VyPTgwKSIsIGN1KTsKLQkJCi0JCXRpbWVPZkRheS5zZXRIb3VyKG51bGwpOwotCQlhc3NlcnROdWxsKHRpbWVPZkRheS5nZXRIb3VyKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihob3VyPTgwKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUaW1lT2ZEYXkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNaW51dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhNaW51dGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSA9IGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCB0aW1lT2ZEYXkuZ2V0TWludXRlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNaW51dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhNaW51dGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSA9IGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCB0aW1lT2ZEYXkuZ2V0TWludXRlKCkpOwotCQkKLQkJdGltZU9mRGF5LnNldE1pbnV0ZShJbnRlZ2VyLnZhbHVlT2YoODApKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4MCksIHRpbWVPZkRheS5nZXRNaW51dGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRpbWVPZkRheShtaW51dGU9ODApIiwgY3UpOwotCQkKLQkJdGltZU9mRGF5LnNldE1pbnV0ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aW1lT2ZEYXkuZ2V0TWludXRlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihtaW51dGU9ODApIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRpbWVPZkRheSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2Vjb25kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUaW1lT2ZEYXlXaXRoU2Vjb25kKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXkgPSBjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgdGltZU9mRGF5LmdldFNlY29uZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2Vjb25kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUaW1lT2ZEYXlXaXRoU2Vjb25kKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXkgPSBjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgdGltZU9mRGF5LmdldFNlY29uZCgpKTsKLQkJCi0JCXRpbWVPZkRheS5zZXRTZWNvbmQoSW50ZWdlci52YWx1ZU9mKDgwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODApLCB0aW1lT2ZEYXkuZ2V0U2Vjb25kKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUaW1lT2ZEYXkoc2Vjb25kPTgwKSIsIGN1KTsKLQkJCi0JCXRpbWVPZkRheS5zZXRTZWNvbmQobnVsbCk7Ci0JCWFzc2VydE51bGwodGltZU9mRGF5LmdldFNlY29uZCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIoc2Vjb25kPTgwKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUaW1lT2ZEYXkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNaWxsaXNlY29uZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGltZU9mRGF5V2l0aE1pbGxpc2Vjb25kKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXkgPSBjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgdGltZU9mRGF5LmdldE1pbGxpc2Vjb25kKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNaWxsaXNlY29uZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGltZU9mRGF5V2l0aE1pbGxpc2Vjb25kKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXkgPSBjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgdGltZU9mRGF5LmdldE1pbGxpc2Vjb25kKCkpOwotCQkKLQkJdGltZU9mRGF5LnNldE1pbGxpc2Vjb25kKEludGVnZXIudmFsdWVPZig4MCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgwKSwgdGltZU9mRGF5LmdldE1pbGxpc2Vjb25kKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUaW1lT2ZEYXkobWlsbGlzZWNvbmQ9ODApIiwgY3UpOwotCQkKLQkJdGltZU9mRGF5LnNldE1pbGxpc2Vjb25kKG51bGwpOwotCQlhc3NlcnROdWxsKHRpbWVPZkRheS5nZXRNaWxsaXNlY29uZCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIobWlsbGlzZWNvbmQ9ODApIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRpbWVPZkRheSIsIGN1KTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMzRkMGYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRyYW5zZm9ybWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRyYW5zZm9ybWF0aW9uIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRyYW5zZm9ybWF0aW9uV2l0aE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRyYW5zZm9ybWF0aW9uKG9wdGlvbmFsID0gdHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHJhbnNmb3JtYXRpb25XaXRoRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OLCBKUEEuRkVUQ0hfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRyYW5zZm9ybWF0aW9uKGZldGNoID0gRmV0Y2hUeXBlLkVBR0VSKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUcmFuc2Zvcm1hdGlvbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT04pKTsKLQkJCi0JCXJlc291cmNlRmllbGQuc2V0UHJpbWFyeUFubm90YXRpb24obnVsbCwgRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTikpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5zZXRQcmltYXJ5QW5ub3RhdGlvbihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTiwgRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHJhbnNmb3JtYXRpb25XaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uIHRyYW5zZm9ybWF0aW9uID0gKEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT04pOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB0cmFuc2Zvcm1hdGlvbi5nZXRPcHRpb25hbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRyYW5zZm9ybWF0aW9uV2l0aE9wdGlvbmFsKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbiB0cmFuc2Zvcm1hdGlvbiA9IChFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgdHJhbnNmb3JtYXRpb24uZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQl0cmFuc2Zvcm1hdGlvbi5zZXRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHRyYW5zZm9ybWF0aW9uLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUcmFuc2Zvcm1hdGlvbihvcHRpb25hbCA9IGZhbHNlKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE9wdGlvbmFsTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHJhbnNmb3JtYXRpb25XaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uIHRyYW5zZm9ybWF0aW9uID0gKEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT04pOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB0cmFuc2Zvcm1hdGlvbi5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCXRyYW5zZm9ybWF0aW9uLnNldE9wdGlvbmFsKG51bGwpOwotCQlhc3NlcnROdWxsKHRyYW5zZm9ybWF0aW9uLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUcmFuc2Zvcm1hdGlvbiIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm9wdGlvbmFsIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRyYW5zZm9ybWF0aW9uV2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbiB0cmFuc2Zvcm1hdGlvbiA9IChFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgdHJhbnNmb3JtYXRpb24uZ2V0RmV0Y2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUcmFuc2Zvcm1hdGlvbldpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24gdHJhbnNmb3JtYXRpb24gPSAoRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTik7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIHRyYW5zZm9ybWF0aW9uLmdldEZldGNoKCkpOwotCQkKLQkJdHJhbnNmb3JtYXRpb24uc2V0RmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIHRyYW5zZm9ybWF0aW9uLmdldEZldGNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUcmFuc2Zvcm1hdGlvbihmZXRjaCA9IExBWlkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2hOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUcmFuc2Zvcm1hdGlvbldpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24gdHJhbnNmb3JtYXRpb24gPSAoRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTik7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIHRyYW5zZm9ybWF0aW9uLmdldEZldGNoKCkpOwotCQkKLQkJdHJhbnNmb3JtYXRpb24uc2V0RmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwodHJhbnNmb3JtYXRpb24uZ2V0RmV0Y2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRyYW5zZm9ybWF0aW9uIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiZmV0Y2giLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmNiODYyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUeXBlQ29udmVydGVyQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgVHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVHlwZUNvbnZlcnRlciIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlQ29udmVydGVyV2l0aERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFR5cGVDb252ZXJ0ZXIoZGF0YVR5cGUgPSBGb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoT2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUeXBlQ29udmVydGVyKG9iamVjdFR5cGUgPSBGb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUeXBlQ29udmVydGVyKG5hbWUgPSBcImJhclwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZUNvbnZlcnRlckFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGVEYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZUNvbnZlcnRlcldpdGhEYXRhVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlQ29udmVydGVyV2l0aERhdGFUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXREYXRhVHlwZSgiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUeXBlQ29udmVydGVyKGRhdGFUeXBlID0gQmFyLmNsYXNzKSIsIGN1KTsKLQkJCi0JCWNvbnZlcnRlci5zZXREYXRhVHlwZSgiaW50Iik7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFR5cGVDb252ZXJ0ZXIoZGF0YVR5cGUgPSBpbnQuY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGF0YVR5cGVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlQ29udmVydGVyV2l0aERhdGFUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXREYXRhVHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFR5cGVDb252ZXJ0ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJkYXRhVHlwZSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZU9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoT2JqZWN0VHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZUNvbnZlcnRlcldpdGhPYmplY3RUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkKLQkJY29udmVydGVyLnNldE9iamVjdFR5cGUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUeXBlQ29udmVydGVyKG9iamVjdFR5cGUgPSBCYXIuY2xhc3MpIiwgY3UpOwotCQkKLQkJY29udmVydGVyLnNldE9iamVjdFR5cGUoImludCIpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFR5cGVDb252ZXJ0ZXIob2JqZWN0VHlwZSA9IGludC5jbGFzcykiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPYmplY3RUeXBlTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZUNvbnZlcnRlcldpdGhPYmplY3RUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkKLQkJY29udmVydGVyLnNldE9iamVjdFR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFR5cGVDb252ZXJ0ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJvYmplY3RUeXBlIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlQ29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVHlwZUNvbnZlcnRlcihuYW1lID0gXCJmb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZUNvbnZlcnRlcldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFR5cGVDb252ZXJ0ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJuYW1lPSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Xcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Xcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MmM4ZjUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAV3JpdGVUcmFuc2Zvcm1lciIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RXcml0ZVRyYW5zZm9ybWVyV2l0aFRyYW5zZm9ybWVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAV3JpdGVUcmFuc2Zvcm1lcih0cmFuc2Zvcm1lckNsYXNzID0gRm9vLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RXcml0ZVRyYW5zZm9ybWVyV2l0aE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBXcml0ZVRyYW5zZm9ybWVyKG1ldGhvZCA9IFwidHJhbnNmb3JtZXJNZXRob2RcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcldpdGhDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSLCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAV3JpdGVUcmFuc2Zvcm1lcihjb2x1bW4gPSBAQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0V3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpCTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUik7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFRyYW5zZm9ybWVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoVHJhbnNmb3JtZXJDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbiB3cml0ZVRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgd3JpdGVUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lckNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUcmFuc2Zvcm1lckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RXcml0ZVRyYW5zZm9ybWVyV2l0aFRyYW5zZm9ybWVyQ2xhc3MoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gd3JpdGVUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHdyaXRlVHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtZXJDbGFzcygpKTsKLQkJCi0JCXdyaXRlVHJhbnNmb3JtZXIuc2V0VHJhbnNmb3JtZXJDbGFzcygiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgd3JpdGVUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lckNsYXNzKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBXcml0ZVRyYW5zZm9ybWVyKHRyYW5zZm9ybWVyQ2xhc3MgPSBCYXIuY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VHJhbnNmb3JtZXJDbGFzc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoVHJhbnNmb3JtZXJDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbiB3cml0ZVRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgd3JpdGVUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lckNsYXNzKCkpOwotCQkKLQkJd3JpdGVUcmFuc2Zvcm1lci5zZXRUcmFuc2Zvcm1lckNsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKHdyaXRlVHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtZXJDbGFzcygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAV3JpdGVUcmFuc2Zvcm1lciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInRyYW5zZm9ybWVyQ2xhc3MiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoTWV0aG9kKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHdyaXRlVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2Zvcm1lck1ldGhvZCIsIHdyaXRlVHJhbnNmb3JtZXIuZ2V0TWV0aG9kKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoTWV0aG9kKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHdyaXRlVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2Zvcm1lck1ldGhvZCIsIHdyaXRlVHJhbnNmb3JtZXIuZ2V0TWV0aG9kKCkpOwotCQkKLQkJd3JpdGVUcmFuc2Zvcm1lci5zZXRNZXRob2QoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHdyaXRlVHJhbnNmb3JtZXIuZ2V0TWV0aG9kKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBXcml0ZVRyYW5zZm9ybWVyKG1ldGhvZCA9IFwiZm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWV0aG9kTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcldpdGhNZXRob2QoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gd3JpdGVUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zZm9ybWVyTWV0aG9kIiwgd3JpdGVUcmFuc2Zvcm1lci5nZXRNZXRob2QoKSk7Ci0JCQotCQl3cml0ZVRyYW5zZm9ybWVyLnNldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0TnVsbCh3cml0ZVRyYW5zZm9ybWVyLmdldE1ldGhvZCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAV3JpdGVUcmFuc2Zvcm1lciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm1ldGhvZCIsIGN1KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcldpdGhDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gd3JpdGVUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnROb3ROdWxsKHdyaXRlVHJhbnNmb3JtZXIuZ2V0Q29sdW1uKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHdyaXRlVHJhbnNmb3JtZXIuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RXcml0ZVRyYW5zZm9ybWVyV2l0aE1ldGhvZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbiB3cml0ZVRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUik7Ci0JCWFzc2VydE51bGwod3JpdGVUcmFuc2Zvcm1lci5nZXRDb2x1bW4oKSk7Ci0JCQotCQl3cml0ZVRyYW5zZm9ybWVyLmFkZENvbHVtbigpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh3cml0ZVRyYW5zZm9ybWVyLmdldENvbHVtbigpKTsJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFdyaXRlVHJhbnNmb3JtZXIobWV0aG9kID0gXCJ0cmFuc2Zvcm1lck1ldGhvZFwiLCBjb2x1bW4gPSBAQ29sdW1uKSIsIGN1KTsKLQkJCi0JCXdyaXRlVHJhbnNmb3JtZXIuZ2V0Q29sdW1uKCkuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAV3JpdGVUcmFuc2Zvcm1lcihtZXRob2QgPSBcInRyYW5zZm9ybWVyTWV0aG9kXCIsIGNvbHVtbiA9IEBDb2x1bW4obmFtZSA9IFwiQkFSXCIpKSIsIGN1KTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHdyaXRlVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKTsKLQkJYXNzZXJ0Tm90TnVsbCh3cml0ZVRyYW5zZm9ybWVyLmdldENvbHVtbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB3cml0ZVRyYW5zZm9ybWVyLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQl3cml0ZVRyYW5zZm9ybWVyLnJlbW92ZUNvbHVtbigpOwotCQlhc3NlcnROdWxsKHdyaXRlVHJhbnNmb3JtZXIuZ2V0Q29sdW1uKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBXcml0ZVRyYW5zZm9ybWVyIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY29sdW1uIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBnZXROb25OdWxsQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3Rlc3QueG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFhOGRjZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzLy5jbGFzc3BhdGggYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhNTE0ZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvanBhL2dlbi8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy8uY3ZzaWdub3JlIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy8ucHJvamVjdCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY4NTc3Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlYWViZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDk6MzggRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NjZmM2EuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzCi1CdW5kbGUtVmVyc2lvbjogMy4wLjAucXVhbGlmaWVyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iMy40LjAiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5kYjtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5nZW47YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iWzQuMC4wLDUuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvYWJvdXQuaHRtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NzM1ODcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MWE2NzQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWU9SmF2YSBQZXJzaXN0ZW5jZSBUb29scyBFbnRpdHkgR2VuZXJhdGlvbiBUZXN0cwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL3Rlc3RzL2ludGVybmFsL0VudGl0eUdlblRvb2xzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vdGVzdHMvaW50ZXJuYWwvRW50aXR5R2VuVG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWU4NzBmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vdGVzdHMvaW50ZXJuYWwvRW50aXR5R2VuVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC51dGlsLkVudGl0eUdlblRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFbnRpdHlHZW5Ub29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVudGl0eUdlblRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZTEoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZvbyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJmb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPT18iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiX0ZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX29vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCI1b28iLCBuYW1lcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUyKCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCW5hbWVzLmFkZCgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJmb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiX0ZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX29vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCI1T08iLCBuYW1lcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUzKCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCW5hbWVzLmFkZCgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJmb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiX0ZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX29vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCI1T08iLCBuYW1lcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWU0KCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGb29CYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb19iYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoImZvb19iYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PX0JBUiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJfRk9PX0JBUiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGT09fQkFSXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PX0JBUl8qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfZm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCI0Rk9PX0JBUiIsIG5hbWVzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZTUoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJbmFtZXMuYWRkKCJGb29CYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGb29CYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb19iYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoImZvb19iYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhcjIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPT19CQVIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhcjIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIl9GT09fQkFSIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGT09fQkFSXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PX0JBUl8qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfZm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCI0Rk9PX0JBUiIsIG5hbWVzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUxKCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJmb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiX0ZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPTyoiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIl9vbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIjVvbyIsIG5hbWVzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUyKCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCW5hbWVzLmFkZCgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZvbyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoImZvbyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT18iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJfRk9PIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29fIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX29vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiNU9PIiwgbmFtZXMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZTMoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJbmFtZXMuYWRkKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiZm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIl9GT08iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb18iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGT08qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCI1T08iLCBuYW1lcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lNCgpIHsKLQkJSGFzaFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlhc3NlcnRFcXVhbHMoImZvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZvb0JhciIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vX2JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoImZvb19iYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT19CQVIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIl9GT09fQkFSIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29CYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGT09fQkFSXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vQmFyXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT19CQVJfKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX2Zvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIjRGT09fQkFSIiwgbmFtZXMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZTUoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJbmFtZXMuYWRkKCJGb29CYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29CYXIyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRm9vQmFyIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29fYmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiZm9vX2JhciIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vQmFyMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT19CQVIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb0JhcjIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJfRk9PX0JBUiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vQmFyMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT19CQVJfIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29CYXJfIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PX0JBUl8qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfZm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiNEZPT19CQVIiLCBuYW1lcykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi90ZXN0cy9pbnRlcm5hbC9KcHRKcGFHZW5UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi90ZXN0cy9pbnRlcm5hbC9KcHRKcGFHZW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzBkZDg0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vdGVzdHMvaW50ZXJuYWwvSnB0SnBhR2VuVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzLmludGVybmFsLkVudGl0eUdlblRvb2xzVGVzdHM7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRKcGFHZW5UZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIkpQVCBFbnRpdHkgR2VuZXJhdGlvbiBUZXN0cyIpOyAvLyROT04tTkxTLTEkCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbnRpdHlHZW5Ub29sc1Rlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0SnBhR2VuVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL3Rlc3QueG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGEwMjdmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLQotICBDb250cmlidXRvcnM6Ci0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0JPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLQk8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotCTxlY2hvIG1lc3NhZ2U9ImJhc2VkaXIgJHtiYXNlZGlyfSIgLz4KLQk8ZWNobyBtZXNzYWdlPSJlY2xpcHNlIHBsYWNlICR7ZWNsaXBzZS1ob21lfSIgLz4KLQk8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgcGx1Z2luLW5hbWUgLS0+Ci0JPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMiLz4KLQotCTwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLQk8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotCTwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0c3RhbXAvPgotCQk8ZGVsZXRlPgotCQkJPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotCQk8L2RlbGV0ZT4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0JPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0JCTxhbnQgdGFyZ2V0PSJnZW4tdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotCQkJPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzLmludGVybmFsLkpwdEpwYUdlblRlc3RzIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiIvPgotCQk8L2FudD4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotCTwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLQk8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0JPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLQk8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsIHN1aXRlLCBjbGVhbnVwIj4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy8uY2xhc3NwYXRoIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE2ZWJmYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9qcGEvdWkvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy8uY3ZzaWdub3JlIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy8ucHJvamVjdCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjBlZTFmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZTcwZDMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDk6NTIgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGY0MWUwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5qZmFjZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjtidW5kbGUtdmVyc2lvbj0iMy40LjAiLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zO2J1bmRsZS12ZXJzaW9uPSIzLjMuMTAwIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKLSBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249Ils0LjAuMCw1LjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMuaW50ZXJuYWwucGxhdGZvcm07eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZjBhYTMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzg4N2FkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gVUkgVGVzdHMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvdGVzdHMvSnB0VWlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvdGVzdHMvSnB0VWlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTI3NzkxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL3Rlc3RzL0pwdFVpVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzLmludGVybmFsLnBsYXRmb3JtLkpwdFVpUGxhdGZvcm1UZXN0czsKLQotLyoqCi0gKiBSdW5zIGFsbCBKUFQgVUkgVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEpwdFVpVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFVpVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0VWlQbGF0Zm9ybVRlc3RzLnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVaVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtVWlFeHRlbnNpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1VaUV4dGVuc2lvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNjBhZmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1VaUV4dGVuc2lvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzLmludGVybmFsLnBsYXRmb3JtOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybS5KcGFQbGF0Zm9ybU1hbmFnZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuRXh0ZW5zaW9uVGVzdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLlRlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SnBhUHJvamVjdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSnBhUGxhdGZvcm1VaUV4dGVuc2lvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgVGVzdEpwYVByb2plY3QgdGVzdFByb2plY3Q7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiRXh0ZW5zaW9uVGVzdFByb2plY3QiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfTkFNRSA9ICJleHRlbnNpb24udGVzdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMVUdJTl9DTEFTUyA9IEV4dGVuc2lvblRlc3RQbHVnaW4uY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExVR0lOX0lEID0gRXh0ZW5zaW9uVGVzdFBsdWdpbi5QTFVHSU5fSUQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMQVRGT1JNX0lEID0gVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIuSUQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTEFURk9STV9DTEFTUyA9IFRlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMQVRGT1JNX0xBQkVMID0gIlRlc3QgSnBhIFBsYXRmb3JtIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVUlfUExBVEZPUk1fSUQgPSBURVNUX1BMQVRGT1JNX0lEOwotCi0JcHVibGljIEpwYVBsYXRmb3JtVWlFeHRlbnNpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnRlc3RQcm9qZWN0ID0gdGhpcy5idWlsZEpwYVByb2plY3QoUFJPSkVDVF9OQU1FLCBmYWxzZSk7ICAvLyBmYWxzZSA9IG5vIGF1dG8tYnVpbGQKLQl9Ci0KLQlwcm90ZWN0ZWQgVGVzdEpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFRlc3RKcGFQcm9qZWN0KHByb2plY3ROYW1lLCBhdXRvQnVpbGQpOyAgLy8gZmFsc2UgPSBubyBhdXRvLWJ1aWxkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy50ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCQl0aGlzLnRlc3RQcm9qZWN0ID0gbnVsbDsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBqcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy50ZXN0UHJvamVjdC5nZXRKcGFQcm9qZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEpwYVBsYXRmb3JtKCkgewotCQlhc3NlcnROb3ROdWxsKEpwYVBsYXRmb3JtTWFuYWdlckltcGwuaW5zdGFuY2UoKS5idWlsZEpwYVBsYXRmb3JtSW1wbGVtZW50YXRpb24odGhpcy50ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcHRVaVBsYXRmb3JtVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwdFVpUGxhdGZvcm1UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ2OTYwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwdFVpUGxhdGZvcm1UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzLmludGVybmFsLnBsYXRmb3JtOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdFVpUGxhdGZvcm1UZXN0cwotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVaVBsYXRmb3JtVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKcGFQbGF0Zm9ybVVpRXh0ZW5zaW9uVGVzdHMuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVaVBsYXRmb3JtVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvLnByb2plY3QgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjliZDdmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC51aS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHM8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLnByb2plY3QgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNzFlOWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cyBhbmQgbW92ZWQgdG8gY29tbW9uIGNvbXBvbmVudDwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnJlbGVuZy8ucHJvamVjdCBiL2pwYV9kaWFncmFtX2VkaXRvci9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5yZWxlbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMGMwYmIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnJlbGVuZy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnJlbGVuZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5yZWxlbmcvcG9tLnhtbCBiL2pwYV9kaWFncmFtX2VkaXRvci9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5yZWxlbmcvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVhMzU0MC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IucmVsZW5nL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgotCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQkKLQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcjwvZ3JvdXBJZD4KLQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcl9wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0JPHZlcnNpb24+MS4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0JPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLQkKLQk8cHJvcGVydGllcz4KLQkJPHR5Y2hvLXZlcnNpb24+MC45LjA8L3R5Y2hvLXZlcnNpb24+Ci0JPC9wcm9wZXJ0aWVzPgotCQotCTxtb2R1bGVzPgotCQk8bW9kdWxlPi4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWk8L21vZHVsZT4KLQkJPCEtLSBtb2R1bGU+Li4vLi4vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudGVzdHM8L21vZHVsZSAtLT4KLQkJPG1vZHVsZT4uLi8uLi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlPC9tb2R1bGU+Ci0JCTxtb2R1bGU+Li4vb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IucmVwb3NpdG9yeTwvbW9kdWxlPgotCTwvbW9kdWxlcz4KLQkKLQk8YnVpbGQ+Ci0JCTxwbHVnaW5zPgotCQkJPHBsdWdpbj4KLQkJCQk8Z3JvdXBJZD5vcmcuc29uYXR5cGUudHljaG88L2dyb3VwSWQ+Ci0JCQkJPGFydGlmYWN0SWQ+dHljaG8tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotCQkJCTx2ZXJzaW9uPiR7dHljaG8tdmVyc2lvbn08L3ZlcnNpb24+Ci0JCQkJPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KLQkJCTwvcGx1Z2luPgotCQkJPHBsdWdpbj4KLQkJCQk8Z3JvdXBJZD5vcmcuc29uYXR5cGUudHljaG88L2dyb3VwSWQ+Ci0JCQkJPGFydGlmYWN0SWQ+dGFyZ2V0LXBsYXRmb3JtLWNvbmZpZ3VyYXRpb248L2FydGlmYWN0SWQ+Ci0JCQkJPHZlcnNpb24+JHt0eWNoby12ZXJzaW9ufTwvdmVyc2lvbj4KLQkJCQk8Y29uZmlndXJhdGlvbj4KLQkJCQkJPHJlc29sdmVyPnAyPC9yZXNvbHZlcj4KLQkJCQk8L2NvbmZpZ3VyYXRpb24+Ci0JCQk8L3BsdWdpbj4KLQkJPC9wbHVnaW5zPgotCTwvYnVpbGQ+Ci0JCi0JPHJlcG9zaXRvcmllcz4KLQkJPHJlcG9zaXRvcnk+Ci0JCQk8aWQ+aW5kaWdvPC9pZD4KLQkJCTx1cmw+aHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3JlbGVhc2VzL3N0YWdpbmcvPC91cmw+Ci0JCQk8bGF5b3V0PnAyPC9sYXlvdXQ+CQkJCi0JCTwvcmVwb3NpdG9yeT4JCi0JCTxyZXBvc2l0b3J5PgotCQkJPGlkPkp1bm88L2lkPgotCQkJPHVybD5odHRwOi8vYnVpbGQuZWNsaXBzZS5vcmcvd2VidG9vbHMvY29tbWl0dGVycy93dHAtUjMuNC4wLUkvMjAxMTA4MDUxNTA3MzgvSS0zLjQuMC0yMDExMDgwNTE1MDczOC9yZXBvc2l0b3J5LzwvdXJsPgotCQkJPGxheW91dD5wMjwvbGF5b3V0PgotCQk8L3JlcG9zaXRvcnk+Ci0JCTxyZXBvc2l0b3J5PgotCQkJPGlkPkdyYXBoaXRpPC9pZD4KLQkJCTx1cmw+aHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2dyYXBoaXRpL3VwZGF0ZXMvbWlsZXN0b25lcy88L3VybD4KLQkJCTxsYXlvdXQ+cDI8L2xheW91dD4KLQkJPC9yZXBvc2l0b3J5PgotCQkKLQk8L3JlcG9zaXRvcmllcz4KLQkKLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IucmVwb3NpdG9yeS8ucHJvamVjdCBiL2pwYV9kaWFncmFtX2VkaXRvci9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5yZXBvc2l0b3J5Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmVhNWIxLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5yZXBvc2l0b3J5Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IucmVwb3NpdG9yeTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5VcGRhdGVTaXRlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5yZXBvc2l0b3J5L3BvbS54bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IucmVwb3NpdG9yeS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzhkY2M0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5yZXBvc2l0b3J5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgotCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQkKLQk8cGFyZW50PgotCQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcl9wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0JCTxncm91cElkPm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yPC9ncm91cElkPgotCQk8dmVyc2lvbj4xLjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQkJPHJlbGF0aXZlUGF0aD4uLi9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5yZWxlbmcvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotCTwvcGFyZW50PgotCQotCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnJlcG9zaXRvcnk8L2FydGlmYWN0SWQ+Ci0JPHBhY2thZ2luZz5lY2xpcHNlLXVwZGF0ZS1zaXRlPC9wYWNrYWdpbmc+Ci0JPG5hbWU+SlBBIEVkaXRvciBVcGRhdGUgU2l0ZTwvbmFtZT4KLQkKLQk8YnVpbGQ+Ci0JCTxwbHVnaW5zPgotCQkJPHBsdWdpbj4KLQkJCQk8Z3JvdXBJZD5vcmcuc29uYXR5cGUudHljaG88L2dyb3VwSWQ+Ci0JCQkJPGFydGlmYWN0SWQ+bWF2ZW4tb3NnaS1wYWNrYWdpbmctcGx1Z2luPC9hcnRpZmFjdElkPgotCQkJCTxjb25maWd1cmF0aW9uPgotCQkJCQk8YXJjaGl2ZVNpdGU+dHJ1ZTwvYXJjaGl2ZVNpdGU+Ci0JCQkJPC9jb25maWd1cmF0aW9uPgotCQkJPC9wbHVnaW4+Ci0JCTwvcGx1Z2lucz4KLQk8L2J1aWxkPgotCQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5yZXBvc2l0b3J5L3NpdGUueG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnJlcG9zaXRvcnkvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExM2VhZTcuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnJlcG9zaXRvcnkvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZV8xLjEuMC5xdWFsaWZpZXIuamFyIiBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZSIgdmVyc2lvbj0iMS4xLjAucXVhbGlmaWVyIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJqcGFfZGlhZ3JhbV9lZGl0b3IiLz4KLSAgIDwvZmVhdHVyZT4KLSAgIDxjYXRlZ29yeS1kZWYgbmFtZT0ianBhX2RpYWdyYW1fZWRpdG9yIiBsYWJlbD0iSlBBIERpYWdyYW0gRWRpdG9yIi8+Ci08L3NpdGU+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS8uY3ZzaWdub3JlIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS8ucHJvamVjdCBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWQ2Yjc1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzI0MmExLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZjA4OTkuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgU0FQIEFHLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKUEEgRGlhZ3JhbSBFZGl0b3IKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpQQSBEaWFncmFtIEVkaXRvcgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMTEgU0FQIEFHLlwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMyMjU3My4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4xLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmciCi0gICAgICBsaWNlbnNlLWZlYXR1cmU9Im9yZy5lY2xpcHNlLmxpY2Vuc2UiCi0gICAgICBsaWNlbnNlLWZlYXR1cmUtdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZSIgdmVyc2lvbj0iMC44LjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUiIHZlcnNpb249IjMuMS4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3BvbS54bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGVkMTRkLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgotCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQkKLQk8cGFyZW50PgotCQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcl9wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0JCTxncm91cElkPm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yPC9ncm91cElkPgotCQk8dmVyc2lvbj4xLjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQkJPHJlbGF0aXZlUGF0aD4uLi8uLi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5yZWxlbmcvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotCTwvcGFyZW50PgotCQotCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmU8L2FydGlmYWN0SWQ+Ci0JPHBhY2thZ2luZz5lY2xpcHNlLWZlYXR1cmU8L3BhY2thZ2luZz4KLQk8bmFtZT5KUEEgRGlhZ3JhbSBFZGl0b3IgRmVhdHVyZTwvbmFtZT4KLQkKLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ODNjNGIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpQQSBEaWFncmFtIEVkaXRvciBTb3VyY2VcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAxMS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY0ODMyNC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyoqLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbCBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkMDBiYS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotCi08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYjBkOTYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKUEEgRGlhZ3JhbSBFZGl0b3IKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzkzYWEwLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjNjOGZmLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSlBBIERpYWdyYW0gRWRpdG9yCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgRGlhZ3JhbSBFZGl0b3IKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDExIFNBUCBBRy5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMxMDVhNy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSlBBIERpYWdyYW0gRWRpdG9yIFNvdXJjZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDExLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNDgzMjQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLmdpZixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8qKixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbCBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDAwYmEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLQotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2Q1ZTFmLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKUEEgRGlhZ3JhbSBFZGl0b3IKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnRlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTliZmM3YS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1idWlsZC54bWwKLS5zZXR0aW5ncwpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnRlc3RzLmZlYXR1cmUvLnByb2plY3QgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhMDQ1OS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudGVzdHMuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnRlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE2ZGU3NC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTVkY2I5Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIFNBUCBBRy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSlBBIERpYWdyYW0gRWRpdG9yIEpVbml0IFRlc3RzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgSlBBIERpYWdyYW0gRWRpdG9yIEpVbml0IFRlc3RzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAxMSBTQVAgQUcuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1wKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmI5NDBmLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjEuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVhc3ltb2NrIiB2ZXJzaW9uPSIyLjQuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZSIgdmVyc2lvbj0iMC44LjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUiIHZlcnNpb249IjMuMC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3Jfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDBlMTE0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mZWF0dXJlLnRlbXAuZm9sZGVyCi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcl9zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcl9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQyNDAxZi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3Jfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcl9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NTk5ZmIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3Jfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3Jfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3Jfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGNjMTI3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBTQVAgQUcuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpQQSBEaWFncmFtIEVkaXRvcgotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgYXJjaGl2ZXMgZm9yIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSAtIEpQQSBEaWFncmFtIEVkaXRvcgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLlwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjRmZTZlLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yX3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBsaWNlbnNlLWZlYXR1cmU9Im9yZy5lY2xpcHNlLmxpY2Vuc2UiCi0gICAgICBsaWNlbnNlLWZlYXR1cmUtdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nLy5jdnNpZ25vcmUgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nLy5wcm9qZWN0IGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YTgwNWYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NjQ0ODMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmcvYWJvdXQuaHRtbCBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjA2YjEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmcvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nL2Fib3V0LmluaSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyMGQ3Zi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZy9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ0aXBzQW5kVHJpY2tzSHJlZiIgY29udGFpbnMgdGhlIEhlbHAgdG9waWMgaHJlZiB0byBhIHRpcHMgYW5kIHRyaWNrcyBwYWdlIAotIyBvcHRpb25hbAotdGlwc0FuZFRyaWNrc0hyZWY9L29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtCi0KLQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZy9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYWFiNC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZy9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU0Mjk0ZC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSlBBIERpYWdyYW0gRWRpdG9yXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMTEuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcyBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZjk4NDkuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGNvbXBvbmVudC54bWwKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nL2NvbXBvbmVudC54bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZy9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWM1MTQyLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZyI+Ci08ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+Ci08Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmciIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMDljMmEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYjBkOTYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKUEEgRGlhZ3JhbSBFZGl0b3IKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci8ucHJvamVjdCBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzg0MzM3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmZjOWY4Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXI7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5oZWxwO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9hYm91dC5odG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkOGQ3MC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwOTwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmNjExOS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBpbWcvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBodG1sLyxcCi0gICAgICAgICAgICAgICAqLnhtbAotZ2VuZXJhdGVTb3VyY2VCdW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvZ2V0dGluZ19zdGFydGVkLmh0bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9odG1sL2dldHRpbmdfc3RhcnRlZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGI5ZjA0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvZ2V0dGluZ19zdGFydGVkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2V0dGluZyBzdGFydGVkPC90aXRsZT4KLQotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotCi0JPGRpdiBjbGFzcz0ic2VjdDEiPgotCQk8IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci0JCTxoMT5HZXR0aW5nIHN0YXJ0ZWQ8L2gxPgotCQk8cD5UaGUgRWNsaXBzZSBJREUgcHJvdmlkZXMgYSBKUEEgZGlhZ3JhbSBlZGl0b3IgdG9vbCB0aGF0IGFsbG93cwotCQkJeW91IHRvIGNyZWF0ZSwgZWRpdCwgYW5kIGRpc3BsYXkgdGhlIGFwcGxpY2F0aW9uIGRhdGEgbW9kZWwgKGVudGl0aWVzCi0JCQlhbmQgdGhlaXIgcmVsYXRpb25zaGlwcykgaW4gYSBncmFwaGljYWwgZW52aXJvbm1lbnQuPC9wPgotCQk8cD5Zb3UgY2FuIHVzZSBvbmx5IG9uZSBKUEEgZGlhZ3JhbSBwZXIgcHJvamVjdCwgYW5kIHlvdSBjYW5ub3QKLQkJCXZpc3VhbGl6ZSBlbnRpdGllcyBmcm9tIGRpZmZlcmVudCBwcm9qZWN0cyBpbiBvbmUgSlBBIGRpYWdyYW0uPC9wPgotCQk8ZGl2PgotCQkJPHA+Ci0JCQkJPGI+RXhhbXBsZTo8L2I+Ci0JCQk8L3A+Ci0JCQk8cD5UaGUgZm9sbG93aW5nIEpQQSBkaWFncmFtIHJlcHJlc2VudHMgdGhlIGRhdGEgbW9kZWwgb2YKLQkJCQllbXBsb3llZXMgcGFydGljaXBhdGluZyBpbiB2YXJpb3VzIHByb2plY3RzLCB0aGF0IGlzLCB0d28gZW50aXRpZXMKLQkJCQl3aXRoIGEgYmlkaXJlY3Rpb25hbCBtYW55LXRvLW1hbnkgcmVsYXRpb25zaGlwOjwvcD4KLQkJCTxkaXY+Ci0JCQkJPHA+Ci0JCQkJCTxpbWcgc3JjPSIuLi9pbWcvanBhX2RpYWdyYW1fZWRpdG9yLmdpZiIKLQkJCQkJCWFsdD0iVGhpcyBncmFwaGljIGlzIGV4cGxhaW5lZCBpbiB0aGUgYWNjb21wYW55aW5nIHRleHQuIgotCQkJCQkJdGl0bGU9IlRoaXMgZ3JhcGhpYyBpcyBleHBsYWluZWQgaW4gdGhlIGFjY29tcGFueWluZyB0ZXh0LiIgLz4KLQkJCQk8L3A+Ci0JCQkJPGJyIC8+Ci0JCQk8L2Rpdj4KLQkJPC9kaXY+Ci0JCTxkaXY+Ci0JCQk8aDI+RmVhdHVyZXM8L2gyPgotCQkJPHA+VGhlIEpQQSBkaWFncmFtIGVkaXRvciBjb21wcmlzZXMgdGhlIGZvbGxvd2luZyBnZW5lcmFsCi0JCQkJZmVhdHVyZXM6PC9wPgotCQkJPGRpdj4KLQkJCQk8dWw+Ci0JCQkJCTxsaT48cD5BYmlsaXR5IHRvIGNyZWF0ZSBlbnRpdGllcyBhbmQgZGVmaW5lIHJlbGF0aW9uc2hpcHMKLQkJCQkJCQliZXR3ZWVuIHRoZW0uPC9wPjwvbGk+Ci0JCQkJCTxsaT48cD5BYmlsaXR5IHRvIGltcG9ydCBleGlzdGluZyBlbnRpdGllcyB0b2dldGhlciB3aXRoCi0JCQkJCQkJdGhlaXIgcmVsYXRpb25zaGlwcy48L3A+PC9saT4KLQkJCQkJPGxpPjxwPkZ1bGwgc3luY2hyb25pemF0aW9uIHdpdGggdGhlIHVuZGVybHlpbmcKLQkJCQkJCQlhcHBsaWNhdGlvbiBjb2RlLCB0aGF0IGlzLCB3aGVuZXZlciB5b3UgYXBwbHkgYSBjaGFuZ2UgdG8gYW55IG9mCi0JCQkJCQkJdGhlIG9iamVjdHMgb24gdGhlIGRpYWdyYW0sIHRoZSBjb3JyZXNwb25kaW5nIGFwcGxpY2F0aW9uIGNvZGUKLQkJCQkJCQl1cGRhdGVzIGF1dG9tYXRpY2FsbHksIGFuZCB0aGUgb3Bwb3NpdGUuPC9wPjwvbGk+Ci0JCQkJCTxsaT48cD4KLQkJCQkJCQlFcnJvciBhbmQgd2FybmluZyBtYXJrZXJzIHdpdGggaW5mb3JtYXRpdmUgcXVpY2sgaW5mbyB0ZXh0LiBZb3UKLQkJCQkJCQljYW4gdmlldyBkZXRhaWxzIG9uIHRoZSBtYXJrZWQgZXJyb3JzIGFuZCB3YXJuaW5ncyBpbiB0aGUgPGk+UHJvYmxlbXM8L2k+Ci0JCQkJCQkJdmlldy4KLQkJCQkJCTwvcD48L2xpPgotCQkJCQk8bGk+PHA+Ci0JCQkJCQkJSW50ZWdyYXRpb24gd2l0aCB0aGUgPGk+SlBBIERldGFpbHM8L2k+IHZpZXcgYW5kIHRoZSA8aT5NaW5pYXR1cmUKLQkJCQkJCQkJVmlldzwvaT4uCi0JCQkJCQk8L3A+PC9saT4KLQkJCQk8L3VsPgotCQkJPC9kaXY+Ci0JCTwvZGl2PgotCTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaHRtbC9yZWZlcmVuY2VfcHJvamVjdF9wYWdlLmh0bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9odG1sL3JlZmVyZW5jZV9wcm9qZWN0X3BhZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY1MWYzYi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9odG1sL3JlZmVyZW5jZV9wcm9qZWN0X3BhZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+UHJvcGVydHkgcGFnZSAmbmRhc2g7IEpQQSBEaWFncmFtIEVkaXRvciBPcHRpb25zPC90aXRsZT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+UHJvcGVydHkgcGFnZSAmbmRhc2g7IEpQQSBEaWFncmFtIEVkaXRvciBPcHRpb25zPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERpYWdyYW0gRWRpdG9yIHNldHRpbmdzIHBhZ2U8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSlBBIERpYWdyYW0gRWRpdG9yIFByb3BlcnRpZXMgcGFnZS4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBKUEEgRGlhZ3JhbSBFZGl0b3IgUHJvcGVydGllcyBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIzMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MzciPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQzNyI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+PGEgaWQ9InN0aHJlZjI3NyIgbmFtZT0ic3RocmVmMjc3Ij48L2E+PGEgaWQ9InN0aHJlZjI3OCIgbmFtZT0ic3RocmVmMjc4Ij48L2E+PGEgaWQ9InN0aHJlZjI3OSIgbmFtZT0ic3RocmVmMjc5Ij48L2E+PGEgaWQ9InN0aHJlZjI4MCIgbmFtZT0ic3RocmVmMjgwIj48L2E+Rm9sZGVyIGZvciBkaWFncmFtczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDM3IHIxYzItdDM3Ij5TcGVjaWZ5IHRoZSBmb2xkZXIgd2hlcmUgdGhlIGRpYWdyYW0ueG1pIGZpbGUgd2lsbCBiZSBjcmVhdGVkLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQzNyIgaGVhZGVycz0icjFjMS10MzciPkRlZmF1bHQgSmF2YSBQYWNrYWdlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MzcgcjFjMi10MzciPlNwZWNpZnkgdGhlIGphdmEgcGFja2FnZSB3aGVyZSB0aGUgZW50aXRpZXMgd2lsbCBiZSBjcmVhdGVkIGJ5IGRlZmF1bHQuCi08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MzciIGhlYWRlcnM9InIxYzEtdDM3Ij5EZWZhdWx0IHRhYmxlIG5hbWUgcHJlZml4PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MzcgcjFjMi10MzciPlNwZWNpZnkgdGhlIHByZWZpeCB3aXRoIHdoaWNoIHRoZSB0YWJsZXMgd2lsbCBiZSBjcmVhdGVkIGJ5IGRlZmF1bHQuCi08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MzciIGhlYWRlcnM9InIxYzEtdDM3Ij5FZGl0aW5nIGVudGl0eSBuYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MzcgcjFjMi10MzciPkRldGVybWluZSBpZiB0aGUgZWRpdGluZyBvZiB0aGUgZW50aXR5IG5hbWUgaW4gdGhlIGRpYWdyYW0gc2hvdWxkIGFmZmVjdCB0aGUgY2xhc3MgbmFtZSBpbiB0aGUgc291cmNlIGZpbGUuCi08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MzciIGhlYWRlcnM9InIxYzEtdDM3Ij5FbnRpdHkgYWNjZXNzIHR5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzNyByMWMyLXQzNyI+U2VsZWN0IGFuIGVudGl0eSBhY2Nlc3MgdHlwZS4KLTxwPlRvIGFkZCBhbm5vdGF0aW9ucyBvbiB0aGUgZmllbGQgbGV2ZWwgY2hvb3NlIDxzcGFuPjxiPkZpZWxkLWJhc2VkPC9iPjwvc3Bhbj4uPC9wPgotPHA+VG8gYWRkIGFubm90YXRpb25zIG9uIHRoZSBwcm9wZXJ0eSBsZXZlbCBjaG9vc2UgPHNwYW4+PGI+UHJvcGVydHktYmFzZWQ8L2I+PC9zcGFuPi48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MzciIGhlYWRlcnM9InIxYzEtdDM3Ij5EZWZhdWx0IGNvbGxlY3Rpb24gdHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDM3IHIxYzItdDM3Ij5TZWxlY3QgYSBjb2xsZWN0aW9uIHR5cGUgb2Ygd2hpY2ggdGhlIHJlbGF0aW9uIGF0dHJpYnV0ZXMgdG8gYmUgY3JlYXRlZCBieSBkZWZhdWx0OgotPHA+Q2hvb3NlIDxzcGFuPjxiPmphdmEudXRpbC5Db2xsZWN0aW9uPC9iPjwvc3Bhbj4sIHNvIHRoYXQgdGhlIHJlbGF0aW9uIGF0dHJpYnV0ZXMgdG8gYmUgb2YgdHlwZSBDb2xsZWN0aW9uLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQzNyIgaGVhZGVycz0icjFjMS10MzciPk9uZS10by1NYW55IHVuaWRpcmVjdGlvbmFsIG9sZCBzdHlsZSByZWxhdGlvbnNoaXA8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQzNyByMWMyLXQzNyI+U3BlY2lmeSBpZiB0aGUgb2xkIHN0eWxlIE9uZS10by1NYW55IHVuaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcCAoc3VwcG9ydGVkIGJ5IEpQQSAxLjApIHRvIGJlIHVzZWQuCi08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvdGFza18yMF9zdXBwb3J0Lmh0bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9odG1sL3Rhc2tfMjBfc3VwcG9ydC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTYzZTcyLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvdGFza18yMF9zdXBwb3J0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+SlBBIGRpYWdyYW0gZWRpdG9yIHBhcnRpYWwgc3VwcG9ydCBmb3IgSlBBIDIuMDwvdGl0bGU+Ci0KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLQotCTxkaXYgY2xhc3M9InNlY3QxIj4KLQkJPCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotCQk8aDE+SlBBIGRpYWdyYW0gZWRpdG9yIHBhcnRpYWwgc3VwcG9ydCBmb3IgSlBBIDIuMDwvaDE+Ci0JCTx0ZD48ZGl2PgotCQkJCTx1bD4KLQkJCQkJPGxpPjxwPgotCQkJCQkJCVRoZSBKUEEgZGlhZ3JhbSBlZGl0b3Igc3VwcG9ydHMgdGhlIG5ldyBzdHlsZSA8aT5PbmUtdG8tTWFueTwvaT4KLQkJCQkJCQl1bmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXAuIEl0IG1lYW5zIHRoYXQgaW4gSlBBIDIuMCBwcm9qZWN0cwotCQkJCQkJCXRoZSBjb3JyZXNwb25kaW5nIHJlbGF0aW9uc2hpcCBhdHRyaWJ1dGUgd2lsbCBiZSBjcmVhdGVkIHdpdGgKLQkJCQkJCQlhZGRpdGlvbmFsCi0JCQkJCQkJPHR0IHRpdGxlPSJPdXRwdXQiPkBKb2luQ29sdW1ucyhzKTwvdHQ+Ci0JCQkJCQkJYW5ub3RhdGlvbiwgc28gdGhhdCB0aGUgY29ycmVzcG9uZGluZyBEQiBzY2hlbWEgd2lsbCBiZSBjcmVhdGVkCi0JCQkJCQkJd2l0aG91dCBhZGRpdGlvbmFsIGpvaW4gdGFibGUuCi0JCQkJCQk8L3A+Ci0JCQkJCTwvbGk+Ci0JCQkJPC91bD4KLQkJCTwvZGl2PgotCQkJPGRpdj4KLQkJCQk8cD4KLQkJCQkJPGI+Tm90ZTo8L2I+Ci0JCQkJPC9wPgotCQkJCTxwPgotCQkJCQlUaGlzIGJlaGF2aW9yIGlzIG9wdGlvbmFsLiBZb3UgbWF5IGNob29zZSBmcm9tIHRoZSBlZGl0b3IKLQkJCQkJcHJlZmVyZW5jZSBwYWdlIG9yIHByb2plY3QgcHJvcGVydHkgcGFnZSB0byBjcmVhdGUgdGhpcwotCQkJCQlyZWxhdGlvbnNoaXAgKGluIEpQQSAyLjAgcHJvamVjdHMpIGNvbXBsaWFudCB3aXRoIEpQQSAxLjAKLQkJCQkJc3BlY2lmaWNhdGlvbiwgaS5lLiAtIHdpdGhvdXQgdGhlIGFkZGl0aW9uYWwKLQkJCQkJPHR0IHRpdGxlPSJPdXRwdXQiPkBKb2luQ29sdW1ucyhzKTwvdHQ+Ci0JCQkJCWFubm90YXRpb24uCi0JCQkJPC9wPgotCQkJPC9kaXY+PC90ZD4KLQk8L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaHRtbC90YXNrX2NvbmZpZ3VyaW5nX2VkaXRvci5odG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaHRtbC90YXNrX2NvbmZpZ3VyaW5nX2VkaXRvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmU2YTM0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvdGFza19jb25maWd1cmluZ19lZGl0b3IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Db25maWd1cmluZyB0aGUgSlBBIGRpYWdyYW0gZWRpdG9yPC90aXRsZT4KLQotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotCi0JPGRpdiBjbGFzcz0ic2VjdDEiPgotCQk8IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci0JCTxoMT5Db25maWd1cmluZyB0aGUgSlBBIGRpYWdyYW0gZWRpdG9yPC9oMT4KLQkJPHRkPjxkaXY+Ci0JCQkJPHVsPgotCQkJCQk8bGk+PHA+Q29uZmlndXJlIHRoZSBnbG9iYWwgZGVmYXVsdCBzZXR0aW5ncyBvZiB0aGUgSlBBCi0JCQkJCQkJZGlhZ3JhbSBlZGl0b3I8L3A+Ci0JCQkJCQk8ZGl2PgotCQkJCQkJCTxvbD4KLQkJCQkJCQkJPGxpPkNob29zZSA8c3Bhbj48aT5XaW5kb3c8L2k+IC0mZ3Q7IDxpPlByZWZlcmVuY2VzPC9pPiA8L3NwYW4+IGluCi0JCQkJCQkJCQl0aGUgbWFpbiBtZW51LjwvbGk+Ci0JCQkJCQkJCTxsaT48cD4KLQkJCQkJCQkJCQlTZWxlY3QgPHNwYW4+PGk+R2VuZXJhbDwvaT4gLSZndDsgPGk+RWRpdG9yczwvaT4gLSZndDsgPGk+SlBBIERpYWdyYW0gRWRpdG9yPC9pPiA8L3NwYW4+IGluIHRoZQotCQkJCQkJCQkJCXByb3BlcnRpZXMgdHJlZS4KLQkJCQkJCQkJCTwvcD48L2xpPgotCQkJCQkJCQk8bGk+PHA+Ci0JCQkJCQkJCQkJU3BlY2lmeSB0aGUgSlBBIGRpYWdyYW0gZWRpdG9yIHNldHRpbmdzLiBUbyByZXN0b3JlIHRoZSBnbG9iYWwKLQkJCQkJCQkJCQlwcmVkZWZpbmVkIHZhbHVlcywgY2hvb3NlIDxpPlJlc3RvcmUgRGVmYXVsdHM8L2k+LgotCQkJCQkJCQkJPC9wPjwvbGk+Ci0JCQkJCQkJCTxsaT48cD4KLQkJCQkJCQkJCQlDaG9vc2UgPGk+QXBwbHk8L2k+LCB0aGVuIGNob29zZSA8aT5PSzwvaT4uCi0JCQkJCQkJCQk8L3A+PC9saT4KLQkJCQkJCQk8L29sPgotCQkJCQkJPC9kaXY+Ci0JCQkJCTwvbGk+Ci0JCQkJCTxsaT48cD5Db25maWd1cmUgdGhlIEpQQSBkaWFncmFtIGVkaXRvciBwZXIgcHJvamVjdDwvcD4KLQkJCQkJCTxkaXY+Ci0JCQkJCQkJPG9sPgotCQkJCQkJCQk8bGk+PHA+Ci0JCQkJCQkJCQkJSW4gdGhlIGNvbnRleHQgbWVudSBvZiB0aGUgcHJvamVjdCBpbiB0aGUgPGk+UHJvamVjdAotCQkJCQkJCQkJCQlFeHBsb3JlcjwvaT4sIGNob29zZSA8aT5Qcm9wZXJ0aWVzPC9pPi4KLQkJCQkJCQkJCTwvcD48L2xpPgotCQkJCQkJCQk8bGk+PHA+Ci0JCQkJCQkJCQkJU2VsZWN0IDxzcGFuPjxpPkpQQTwvaT4gLSZndDsgPGk+SlBBIERpYWdyYW0gRWRpdG9yPC9pPiA8L3NwYW4+LgotCQkJCQkJCQkJPC9wPjwvbGk+Ci0JCQkJCQkJCTxsaT48cD4KLQkJCQkJCQkJCQlTcGVjaWZ5IHRoZSBKUEEgZGlhZ3JhbSBlZGl0b3Igc2V0dGluZ3MuIFRvIHJlc3RvcmUgdGhlIGdsb2JhbAotCQkJCQkJCQkJCWRlZmF1bHQgc2V0dGluZ3MsIGNob29zZSA8aT5SZXN0b3JlIERlZmF1bHRzPC9pPi4KLQkJCQkJCQkJCTwvcD48L2xpPgotCQkJCQkJCQk8bGk+PHA+Ci0JCQkJCQkJCQkJQ2hvb3NlIDxpPkFwcGx5PC9pPiwgdGhlbiBjaG9vc2UgPGk+T0s8L2k+LgotCQkJCQkJCQkJPC9wPjwvbGk+Ci0JCQkJCQkJPC9vbD4KLQkJCQkJCTwvZGl2PgotCQkJCQk8L2xpPgotCQkJCTwvdWw+Ci0JCQk8L2Rpdj4KLQkJPC90ZD4KLQk8L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaHRtbC90YXNrX21hbmFnZV9lbnRpdGllcy5odG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaHRtbC90YXNrX21hbmFnZV9lbnRpdGllcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODg0NTBlLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvdGFza19tYW5hZ2VfZW50aXRpZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TWFuYWdpbmcgZW50aXRpZXM8L3RpdGxlPgotCi08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci0KLQk8ZGl2IGNsYXNzPSJzZWN0MSI+Ci0JCTwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLQkJPGgxPk1hbmFnaW5nIGVudGl0aWVzPC9oMT4KLQkJPHRkPjxwPllvdSBjYW4gcGVyZm9ybSB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgb24gYQotCQkJCXBhcnRpY3VsYXIgZW50aXR5IGdyYXBoaWNhbCBtb2RlbDo8L3A+Ci0JCQk8ZGl2PgotCQkJCTx1bD4KLQkJCQkJPGxpPjxwPlJlbmFtZSBlbnRpdGllczwvcD4KLQkJCQkJCTxwPgotCQkJCQkJCUluIHRlcm1zIG9mIHNvdXJjZSBjb2RlLCB0aGlzIG9wZXJhdGlvbiBjaGFuZ2VzIHRoZQotCQkJCQkJCTx0dCB0aXRsZT0iT3V0cHV0Ij5uYW1lPC90dD4KLQkJCQkJCQlhdHRyaWJ1dGUgb2YgdGhlCi0JCQkJCQkJPHR0IHRpdGxlPSJPdXRwdXQiPkBFbnRpdHk8L3R0PgotCQkJCQkJCWFubm90YXRpb24gb25seS4KLQkJCQkJCTwvcD4KLQkJCQkJPC9saT4KLQkJCQkJPGxpPjxwPkFkZCwgcmVuYW1lLCBvciByZW1vdmUgYXR0cmlidXRlczwvcD4KLQkJCQkJCTxkaXY+Ci0JCQkJCQkJPHA+Ci0JCQkJCQkJCTxiPk5vdGU6PC9iPgotCQkJCQkJCTwvcD4KLQkJCQkJCQk8cD4KLQkJCQkJCQkJVGhlIEVjbGlwc2UgSURFIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIGdldHRlciBhbmQgc2V0dGVyCi0JCQkJCQkJCW1ldGhvZHMgZm9yIG5ldyBhdHRyaWJ1dGVzLiBUaGUgZGVmYXVsdCBkYXRhIHR5cGUgZm9yIG5ldwotCQkJCQkJCQlhdHRyaWJ1dGVzIGlzCi0JCQkJCQkJCTx0dCB0aXRsZT0iT3V0cHV0Ij5qYXZhLmxhbmcuU3RyaW5nPC90dD4KLQkJCQkJCQkJLgotCQkJCQkJCTwvcD4KLQkJCQkJCQk8cD5JbiB0ZXJtcyBvZiBzb3VyY2UgY29kZSwgcmVuYW1pbmcgYXR0cmlidXRlcyBjaGFuZ2VzIHRoZQotCQkJCQkJCQlmaWVsZCBuYW1lcyBvZiBlbnRpdGllcywgdG9nZXRoZXIgd2l0aCB0aGUgZmllbGRzJyBnZXR0ZXIgYW5kCi0JCQkJCQkJCXNldHRlciBtZXRob2RzLjwvcD4KLQkJCQkJCQk8cD5SZW1vdmluZyBhdHRyaWJ1dGVzIHJlbW92ZXMgdGhlbSBmcm9tIHRoZSBkYXRhIG1vZGVsIGFsc28uPC9wPgotCQkJCQkJCTxkaXY+RW5kIG9mIHRoZSBub3RlLjwvZGl2PgotCQkJCQkJPC9kaXY+Ci0JCQkJCTwvbGk+Ci0JCQkJCTxsaT48cD5Db2xsYXBzZSBvciBleHBhbmQgZW50aXRpZXMgb3IgYXR0cmlidXRlIGdyb3VwczwvcD48L2xpPgotCQkJCQk8bGk+PHA+U2F2ZSBvciBkaXNjYXJkIHlvdXIgY2hhbmdlczwvcD48L2xpPgotCQkJCQk8bGk+PHA+U2F2ZSBvciBkaXNjYXJkIHlvdXIgY2hhbmdlcyBhbmQgcmVtb3ZlIHRoZSBlbnRpdHkKLQkJCQkJCQlmcm9tIHRoZSBkaWFncmFtIHdpdGhvdXQgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgYXBwbGljYXRpb24gZGF0YQotCQkJCQkJCW1vZGVsPC9wPjwvbGk+Ci0JCQkJCTxsaT48cD5SZW1vdmUgdGhlIGVudGl0eSBmcm9tIHRoZSBkaWFncmFtIGFuZCBkZWxldGUgaXQKLQkJCQkJCQlmcm9tIHRoZSBhcHBsaWNhdGlvbiBkYXRhIG1vZGVsPC9wPjwvbGk+Ci0JCQkJPC91bD4KLQkJCTwvZGl2PgotCQkJPHA+VG8gcGVyZm9ybSB0aGUgYWN0aW9ucyBkZXNjcmliZWQgYWJvdmUsIGZvbGxvdyB0aGUgc3RlcHM6PC9wPgotCQkJPGRpdj4KLQkJCQk8b2w+Ci0JCQkJCTxsaT48cD5Qb3NpdGlvbiB0aGUgbW91c2UgY3Vyc29yIG92ZXIgdGhlIGVudGl0eSB5b3Ugd2FudAotCQkJCQkJCXRvIG1hbmFnZS48L3A+Ci0JCQkJCQk8cD5BIGJ1dHRvbiBiYXIgYXBwZWFycyBieSB0aGUgZW50aXR5LjwvcD4KLQkJCQkJCTxkaXY+Ci0JCQkJCQkJPHA+Ci0JCQkJCQkJCTxpbWcgc3JjPSIuLi9pbWcvanBhX2RpYWdyYW1fZW50aXR5X29wZXJhdGlvbnMuZ2lmIgotCQkJCQkJCQkJYWx0PSJUaGlzIGdyYXBoaWMgaXMgZXhwbGFpbmVkIGluIHRoZSBhY2NvbXBhbnlpbmcgdGV4dC4iCi0JCQkJCQkJCQl0aXRsZT0iVGhpcyBncmFwaGljIGlzIGV4cGxhaW5lZCBpbiB0aGUgYWNjb21wYW55aW5nIHRleHQuIiAvPgotCQkJCQkJCTwvcD4KLQkJCQkJCQk8YnIgLz4KLQkJCQkJCTwvZGl2PgotCQkJCQk8L2xpPgotCQkJCQk8bGk+PHA+Q2hvb3NlIHRoZSByZWxldmFudCBwdXNoYnV0dG9uLiBFYWNoIGJ1dHRvbiBoYXMgYW4KLQkJCQkJCQlpbmZvcm1hdGl2ZSB0b29sdGlwIHRoYXQgZGVzY3JpYmVzIHRoZSByZWxldmFudCBvcGVyYXRpb24uPC9wPjwvbGk+Ci0JCQkJCTxsaT48cD4KLQkJCQkJCQlUbyByZW5hbWUgYW4gZW50aXR5IG9yIGFuIGF0dHJpYnV0ZSwgZG91YmxlLWNsaWNrIHRoZSB0aXRsZSBvZiBhbgotCQkJCQkJCWVudGl0eSBvciB0aGUgYXR0cmlidXRlLCBjaGFuZ2UgdGhlIG5hbWUsIGFuZCBjaG9vc2UKLQkJCQkJCQk8a2JkIHRpdGxlPSJLZXlib2FyZCBidXR0b24iPkVOVEVSPC9rYmQ+Ci0JCQkJCQkJLgotCQkJCQkJPC9wPjwvbGk+Ci0JCQkJCTxsaT48cD4KLQkJCQkJCQlUbyByZW1vdmUgYW4gYXR0cmlidXRlLCBjbGljayB0aGUgYXR0cmlidXRlIGFuZCBjaG9vc2UKLQkJCQkJCQk8a2JkIHRpdGxlPSJLZXlib2FyZCBidXR0b24iPkRFTEVURTwva2JkPgotCQkJCQkJCW9yIGNob29zZSA8aT5EZWxldGU8L2k+IGluIHRoZSBjb250ZXh0IG1lbnUuCi0JCQkJCQk8L3A+Ci0JCQkJCQk8cD4KLQkJCQkJCQlZb3UgY2FuIGFsc28gcmVtb3ZlIGFuIGF0dHJpYnV0ZSBieSBwb3NpdGlvbmluZyB0aGUgbW91c2UgY3Vyc29yCi0JCQkJCQkJb3ZlciB0aGUgYXR0cmlidXRlIGFuZCBjaG9vc2luZyB0aGUgPGk+RGVsZXRlIEF0dHJpYnV0ZTwvaT4KLQkJCQkJCQlwdXNoYnV0dG9uLgotCQkJCQkJPC9wPgotCQkJCQkJPGRpdj4KLQkJCQkJCQk8cD4KLQkJCQkJCQkJPGltZyBzcmM9Ii4uL2ltZy9qcGFfZGlhZ3JhbV9kZWxldGVfYXR0cmlidXRlLmdpZiIKLQkJCQkJCQkJCWFsdD0iVGhpcyBncmFwaGljIGlzIGV4cGxhaW5lZCBpbiB0aGUgYWNjb21wYW55aW5nIHRleHQuIgotCQkJCQkJCQkJdGl0bGU9IlRoaXMgZ3JhcGhpYyBpcyBleHBsYWluZWQgaW4gdGhlIGFjY29tcGFueWluZyB0ZXh0LiIgLz4KLQkJCQkJCQk8L3A+Ci0JCQkJCQkJPHAgLz4KLQkJCQkJCTwvZGl2PgotCQkJCQk8L2xpPgotCQkJCTwvb2w+Ci0JCQk8L2Rpdj4KLQkJPC90ZD4KLQk8L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaHRtbC90YXNrX29wZW5fZGlhZ3JhbS5odG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaHRtbC90YXNrX29wZW5fZGlhZ3JhbS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzE5ZTZlLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvdGFza19vcGVuX2RpYWdyYW0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5PcGVuIEpQQSBEaWFncmFtLCBjcmVhdGUgYW5kIGRpc3BsYXkgZW50aXRpZXM8L3RpdGxlPgotCi08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci0KLQk8ZGl2IGNsYXNzPSJzZWN0MSI+Ci0JCTwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLQkJPGgyPk9wZW5pbmcgSlBBIERpYWdyYW0gRWRpdG9yPC9oMj4KLQkJPHRkPjxkaXY+Ci0JCQkJPG9sPgotCQkJCQk8bGk+PHA+Ci0JCQkJCQkJSW4gdGhlIDxpPlByb2plY3QgRXhwbG9yZXI8L2k+LCBzZWxlY3QgdGhlIHByb2plY3QgdGhhdCB5b3UgYXJlCi0JCQkJCQkJdXNpbmcgb3Igd2FudCB0byB1c2UgZm9yIHlvdXIgZW50aXRpZXMuCi0JCQkJCQk8L3A+Ci0JCQkJCTwvbGk+Ci0JCQkJCTxsaT48cD4KLQkJCQkJCQlJbiB0aGUgY29udGV4dCBtZW51LCBjaG9vc2UgPHNwYW4gdGl0bGU9Ik5hdmlnYXRpb24gcGF0aCI+Ci0JCQkJCQkJCTxpPkpQQSBUb29sczwvaT4gLSZncnQ7IDxpPk9wZW4gRGlhZ3JhbTwvaT4KLQkJCQkJCQk8L3NwYW4+LgotCQkJCQkJPC9wPgotCQkJCQk8L2xpPgotCQkJCTwvb2w+Ci0JCQk8L2Rpdj48L3RkPgotCQk8aDI+Q3JlYXRpbmcgbmV3IGVudGl0aWVzPC9oMj4KLQkJPHRkPjxwPgotCQkJCUluIHRoZSA8aT5FbnRpdGllczwvaT4gbGlzdCBvZiB0aGUgPGk+UGFsZXR0ZTwvaT4sIGNob29zZSA8c3Bhbj48aW1nCi0JCQkJCXNyYz0iLi4vaW1nL2pwYWVkaXRvcl9lbnRpdHkuZ2lmIiBhbHQ9IkVudGl0eSIgdGl0bGU9IkVudGl0eSIgLz4gKDxpCi0JCQkJCXRpdGxlPSJRdWljayBpbmZvIj5FbnRpdHk8L2k+KTwvc3Bhbj4sIHRoZW4gY2xpY2sgdGhlIGRpYWdyYW0gYXJlYS4KLQkJCTwvcD4KLQkJCTxwPlRoZSBFY2xpcHNlIElERSBjcmVhdGVzIHRoZSBuZXcgZW50aXR5IHdpdGggYSBwcmVkZWZpbmVkIG5hbWUKLQkJCQlhbmQgYSBwcmltYXJ5IGtleS48L3A+PC90ZD4KLQkJPGgyPkRpc3BsYXlpbmcgZXhpc3RpbmcgZW50aXRpZXMgKGlmIGFueSkgd2l0aGluIGEgcHJvamVjdCBvbiB0aGUKLQkJCWRpYWdyYW08L2gyPgotCQk8dGQ+PGRpdj4KLQkJCQk8dWw+Ci0JCQkJCTxsaT48cD4KLQkJCQkJCQlUbyBkaXNwbGF5IGEgc2luZ2xlIGVudGl0eSwgY29weSB0aGUgZW50aXR5IHVzaW5nIGRyYWcgYW5kIGRyb3AKLQkJCQkJCQlmcm9tIHRoZSA8aT5Qcm9qZWN0IEV4cGxvcmVyPC9pPiB0byB0aGUgSlBBIGRpYWdyYW0uCi0JCQkJCQk8L3A+Ci0JCQkJCTwvbGk+Ci0JCQkJCTxsaT48cD4KLQkJCQkJCQlUbyBkaXNwbGF5IGFsbCBlbnRpdGllcywgY2xpY2sgdGhlIEpQQSBkaWFncmFtIHdpdGggdGhlIHNlY29uZGFyeQotCQkJCQkJCW1vdXNlIGJ1dHRvbiBhbmQgY2hvb3NlIDxpPlNob3cgQWxsIEVudGl0aWVzPC9pPiwgb3IgY29weSB0aGUgPGk+SlBBCi0JCQkJCQkJCUNvbnRlbnQ8L2k+IG5vZGUgZnJvbSB0aGUgcHJvamVjdCBpbiB0aGUgPGk+UHJvamVjdCBFeHBsb3JlcjwvaT4gdG8KLQkJCQkJCQl0aGUgSlBBIGRpYWdyYW0sIHVzaW5nIGRyYWcgYW5kIGRyb3AuCi0JCQkJCQk8L3A+Ci0JCQkJCTwvbGk+Ci0JCQkJPC91bD4KLQkJCTwvZGl2PjwvdGQ+Ci0JPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvdGFza19vcGVuX21pbmlhdHVyZV92aWV3Lmh0bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9odG1sL3Rhc2tfb3Blbl9taW5pYXR1cmVfdmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGIwMWY4Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvdGFza19vcGVuX21pbmlhdHVyZV92aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+T3BlbmluZyB0aGUgTWluaWF0dXJlIHZpZXcgb3IgdGhlIEpQQSBEZXRhaWxzIHZpZXc8L3RpdGxlPgotCi08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci0KLQk8ZGl2IGNsYXNzPSJzZWN0MSI+Ci0JCTwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLQkJPGgyPk9wZW5pbmcgdGhlIE1pbmlhdHVyZSB2aWV3IG9yIHRoZSBKUEEgRGV0YWlscyB2aWV3PC9oMj4KLQkJPHRkPjxkaXY+Ci0JCQkJPG9sPgotCQkJCQk8bGk+PHA+Q2xpY2sgdGhlIEpQQSBkaWFncmFtIHdpdGggdGhlIHNlY29uZGFyeSBtb3VzZQotCQkJCQkJCWJ1dHRvbi48L3A+PC9saT4KLQkJCQkJPGxpPjxwPgotCQkJCQkJCUNob29zZSA8aT5PcGVuIE1pbmlhdHVyZSBWaWV3PC9pPiBvciA8aT5PcGVuIEpQQSBEZXRhaWxzIFZpZXc8L2k+LAotCQkJCQkJCXJlc3BlY3RpdmVseS4KLQkJCQkJCTwvcD48L2xpPgotCQkJCQk8bGk+PHA+Ci0JCQkJCQkJVG8gc2F2ZSB0aGUgZGlhZ3JhbSBhcyBhbiBpbWFnZSwgY2hvb3NlIDxpPlNhdmUgYXMgSW1hZ2U8L2k+LgotCQkJCQkJPC9wPjwvbGk+Ci0JCQkJPC9vbD4KLQkJCTwvZGl2PgotCQkJPGRpdj4KLQkJCQk8cD4KLQkJCQkJPGltZyBzcmM9Ii4uL2ltZy9qcGFfbWluaWF0dXJlX3ZpZXcuZ2lmIgotCQkJCQkJYWx0PSJKUEEgRWRpdG9yIE1pbmlhdHVyZSB2aWV3LiIKLQkJCQkJCXRpdGxlPSJKUEEgRWRpdG9yIE1pbmlhdHVyZSB2aWV3LiIgLz4KLQkJCQk8L3A+Ci0JCQkJPGJyIC8+Ci0JCQk8L2Rpdj4KLQkJPC90ZD4KLQk8L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaHRtbC90YXNrX3JlZmFjdG9yX2VudGl0aWVzLmh0bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9odG1sL3Rhc2tfcmVmYWN0b3JfZW50aXRpZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY1MmZkMi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9odG1sL3Rhc2tfcmVmYWN0b3JfZW50aXRpZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+UmVmYWN0b3IsIHZpZXcsIGVkaXQgYW5kIHJlbW92ZSBlbnRpdGllcyBhbmQgdGhlaXIKLQlhdHRyaWJ1dGVzPC90aXRsZT4KLQotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotCi0JPGRpdiBjbGFzcz0ic2VjdDEiPgotCQk8IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci0JCTxoMj5SZWZhY3RvcmluZyBlbnRpdGllcyBhbmQgYXR0cmlidXRlIHR5cGVzPC9oMj4KLQkJPHRkPjxkaXY+Ci0JCQkJPHA+Ci0JCQkJCTxiPkNhdXRpb246PC9iPgotCQkJCTwvcD4KLQkJCQk8ZGl2PgotCQkJCQk8dWw+Ci0JCQkJCQk8bGk+PHA+Ci0JCQkJCQkJCUlmIHlvdSByZW5hbWUgb3IgbW92ZSBhbiBlbnRpdHkgdXNpbmcgYSBkaWZmZXJlbnQgYXBwcm9hY2ggKGZvcgotCQkJCQkJCQlleGFtcGxlLCB2aWEgdGhlIDxpPlByb2plY3QgRXhwbG9yZXI8L2k+KSwgdGhlIGVudGl0eSBkaXNhcHBlYXJzCi0JCQkJCQkJCWZyb20gdGhlIEpQQSBkaWFncmFtLgotCQkJCQkJCTwvcD4KLQkJCQkJCTwvbGk+Ci0JCQkJCQk8bGk+PHA+V2hlbiB5b3UgcmVmYWN0b3IgYW4gYXR0cmlidXRlIHR5cGUsIGFueSBleGlzdGluZwotCQkJCQkJCQlidXNpbmVzcyBsb2dpYyB3aXRoaW4gdGhlIGF0dHJpYnV0ZSdzIGFjY2VzcyBtZXRob2RzIGlzIGRlbGV0ZWQuPC9wPgotCQkJCQkJPC9saT4KLQkJCQkJPC91bD4KLQkJCQk8L2Rpdj4KLQkJCTwvZGl2PgotCQkJPHA+VXNpbmcgdGhlIEpQQSBkaWFncmFtIGVkaXRvciwgeW91IGNhbiBwZXJmb3JtIHRoZSBmb2xsb3dpbmcKLQkJCQlyZWZhY3RvcmluZyBvcGVyYXRpb25zOjwvcD4KLQkJCTxkaXY+Ci0JCQkJPHVsPgotCQkJCQk8bGk+PHA+Ci0JCQkJCQkJUmVuYW1lIHRoZSBlbnRpdHkgY2xhc3MgLSBpbiB0aGUgY29udGV4dCBtZW51IG9mIHRoZSBlbnRpdHkgbmFtZSwKLQkJCQkJCQljaG9vc2UgPHNwYW4+PGk+UmVmYWN0b3IgRW50aXR5IENsYXNzPC9pPiAtJmd0OyA8aT5SZW5hbWU8L2k+Ci0JCQkJCQkJPC9zcGFuPiwgdGhlbiBjb21wbGV0ZSB0aGUgd2l6YXJkLgotCQkJCQkJPC9wPgotCQkJCQk8L2xpPgotCQkJCQk8bGk+PHA+Ci0JCQkJCQkJTW92ZSB0aGUgZW50aXR5IHRvIGFub3RoZXIgc291cmNlIHBhY2thZ2UgLSBpbiB0aGUgY29udGV4dCBtZW51Ci0JCQkJCQkJb2YgdGhlIGVudGl0eSBuYW1lLCBjaG9vc2UgPHNwYW4+PGk+UmVmYWN0b3IgRW50aXR5Ci0JCQkJCQkJCQlDbGFzczwvaT4gLSZndDsgPGk+TW92ZTwvaT4KLQkJCQkJCQk8L3NwYW4+LCB0aGVuIGNvbXBsZXRlIHRoZSB3aXphcmQuCi0JCQkJCQk8L3A+Ci0JCQkJCTwvbGk+Ci0JCQkJCTxsaT48cD4KLQkJCQkJCQlSZWZhY3RvciBhbiBhdHRyaWJ1dGUgdHlwZSAtIGluIHRoZSBjb250ZXh0IG1lbnUgb2YgYW4gYXR0cmlidXRlLAotCQkJCQkJCWNob29zZSA8aT5SZWZhY3RvciBBdHRyaWJ1dGUgVHlwZTwvaT4sIGNoYW5nZSB0aGUgdHlwZSwgYW5kCi0JCQkJCQkJY2hvb3NlIDxpPk9LPC9pPi4KLQkJCQkJCTwvcD4KLQkJCQkJPC9saT4KLQkJCQk8L3VsPgotCQkJPC9kaXY+PC90ZD4KLQotCQk8aDI+Vmlld2luZyBhbmQgZWRpdGluZyBlbnRpdGllcycgc291cmNlIGNvZGU8L2gyPgotCQk8dGQ+PHA+VG8gdmlldyBhbmQgZWRpdCB0aGUgc291cmNlIGNvZGUgb2YgYSBwYXJ0aWN1bGFyCi0JCQkJZW50aXR5LCBkb3VibGUtY2xpY2sgdGhlIHRpdGxlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVudGl0eSBibG9jayBvbgotCQkJCXRoZSBkaWFncmFtLjwvcD4KLQkJCTxwPlRoZSBFY2xpcHNlIElERSBvcGVucyB0aGUgZW50aXR5IGNsYXNzIGluIHRoZSBzdGFuZGFyZCBzb3VyY2UKLQkJCQljb2RlIGVkaXRvci48L3A+Ci0JCQk8cD5XaGVuIHlvdSBhcHBseSBjaGFuZ2VzIHRvIHRoZSBzb3VyY2UgY29kZSwgdGhleSBhcmUKLQkJCQlhdXRvbWF0aWNhbGx5IHN5bmNocm9uaXplZCB3aXRoIHRoZSBkaWFncmFtLjwvcD48L3RkPgotCi0JCTxoMj5SZW1vdmluZyBhbGwgZW50aXRpZXMgZnJvbSB0aGUgZGlhZ3JhbTwvaDI+Ci0JCTx0ZD48ZGl2PgotCQkJCTxwPgotCQkJCQk8Yj5Ob3RlOjwvYj4KLQkJCQk8L3A+Ci0JCQkJPHA+VGhpcyBvcGVyYXRpb24gcmVtb3ZlcyB0aGUgZW50aXRpZXMgZnJvbSB0aGUgSlBBIGRpYWdyYW0KLQkJCQkJb25seSwgdGhhdCBpcywgdGhleSBhcmUgbm90IHJlbW92ZWQgZnJvbSB0aGUgdW5kZXJseWluZyBhcHBsaWNhdGlvbgotCQkJCQlkYXRhIG1vZGVsLjwvcD4KLQkJCTwvZGl2PgotCQkJPGRpdj4KLQkJCQk8b2w+Ci0JCQkJCTxsaT48cD5DbGljayB0aGUgSlBBIGRpYWdyYW0gd2l0aCB0aGUgc2Vjb25kYXJ5IG1vdXNlCi0JCQkJCQkJYnV0dG9uLjwvcD4KLQkJCQkJPC9saT4KLQkJCQkJPGxpPjxwPgotCQkJCQkJCVRvIHNhdmUgYW55IHVuc2F2ZWQgY2hhbmdlcyB0byB0aGUgYXBwbGljYXRpb24gZGF0YSBtb2RlbCwgYW5kCi0JCQkJCQkJcmVtb3ZlIGFsbCBlbnRpdGllcyBmcm9tIHRoZSBkaWFncmFtLCBjaG9vc2UgPHNwYW4+IDxpPlJlbW92ZQotCQkJCQkJCQkJQWxsIEVudGl0aWVzIGZyb20gRGlhZ3JhbTwvaT4gLSZndDsgPGk+Li4uYW5kIFNhdmUgQ2hhbmdlczwvaT4KLQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQk8L3A+Ci0JCQkJCTwvbGk+Ci0JCQkJCTxsaT48cD4KLQkJCQkJCQlUbyByZW1vdmUgYWxsIGVudGl0aWVzIGZyb20gdGhlIGRpYWdyYW0gd2l0aG91dCBzYXZpbmcgYW55Ci0JCQkJCQkJdW5zYXZlZCBjaGFuZ2VzIHRvIHRoZSBkYXRhIG1vZGVsLCBjaG9vc2UgPHNwYW4+PGk+UmVtb3ZlCi0JCQkJCQkJCQlBbGwgRW50aXRpZXMgZnJvbSBEaWFncmFtPC9pPiAtJmd0OyA8aT4uLi5hbmQgRGlzY2FyZCBDaGFuZ2VzPC9pPgotCQkJCQkJCTwvc3Bhbj4uCi0JCQkJCQk8L3A+Ci0JCQkJCTwvbGk+Ci0JCQkJPC9vbD4KLQkJCTwvZGl2PjwvdGQ+Ci0JPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvdGFza19yZW1vdmVfZW50aXRpZXMuaHRtbCBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvdGFza19yZW1vdmVfZW50aXRpZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1NjBiYi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9odG1sL3Rhc2tfcmVtb3ZlX2VudGl0aWVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RGVmaW5pbmcgYW5kIHJlbW92aW5nIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBlbnRpdGllczwvdGl0bGU+Ci0KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLQotCTxkaXYgY2xhc3M9InNlY3QxIj4KLQkJPCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotCQk8aDE+RGVmaW5pbmcgYW5kIHJlbW92aW5nIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBlbnRpdGllczwvaDE+Ci0JCTx0ZD48ZGl2PgotCQkJCTxvbD4KLQkJCQkJPGxpPjxwPgotCQkJCQkJCUluIHRoZSA8aT5SZWxhdGlvbnM8L2k+IGxpc3Qgb2YgdGhlIDxpPlBhbGV0dGU8L2k+LCBjaG9vc2UgYQotCQkJCQkJCXJlbGF0aW9uc2hpcCB0eXBlLgotCQkJCQkJPC9wPgotCQkJCQk8L2xpPgotCQkJCQk8bGk+PHA+Ci0JCQkJCQkJQ2xpY2sgdGhlIHNvdXJjZSBlbnRpdHkgb2YgdGhlIHJlbGF0aW9uc2hpcCB3aXRoIHRoZSBwcmltYXJ5Ci0JCQkJCQkJbW91c2UgYnV0dG9uIG9yIGNob29zZQotCQkJCQkJCTxrYmQgdGl0bGU9IktleWJvYXJkIGJ1dHRvbiI+RVNDQVBFPC9rYmQ+Ci0JCQkJCQkJdG8gY2FuY2VsLgotCQkJCQkJPC9wPgotCQkJCQk8L2xpPgotCQkJCQk8bGk+PHA+Ci0JCQkJCQkJQ2xpY2sgdGhlIHRhcmdldCBlbnRpdHkgb2YgdGhlIHJlbGF0aW9uc2hpcCB3aXRoIHRoZSBwcmltYXJ5Ci0JCQkJCQkJbW91c2UgYnV0dG9uIG9yIGNob29zZQotCQkJCQkJCTxrYmQgdGl0bGU9IktleWJvYXJkIGJ1dHRvbiI+RVNDQVBFPC9rYmQ+Ci0JCQkJCQkJdG8gY2FuY2VsLgotCQkJCQkJPC9wPgotCQkJCQkJPHA+VGhlIEVjbGlwc2UgSURFIGNyZWF0ZXMgYW5kIHZpc3VhbGl6ZXMgdGhlIHJlbGF0aW9uc2hpcCwgYXMKLQkJCQkJCQl3ZWxsIGFzIHRoZSByZWxldmFudCByZWxhdGlvbnNoaXAgYXR0cmlidXRlcyBvZiB0aGUgZW50aXRpZXMsCi0JCQkJCQkJZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIHJlbGF0aW9uLjwvcD48L2xpPgotCQkJCQk8bGk+PHA+Ci0JCQkJCQkJVG8gcmVtb3ZlIGEgcGFydGljdWxhciByZWxhdGlvbnNoaXAsIHNlbGVjdCB0aGUgcmVsYXRpb24gb24gdGhlCi0JCQkJCQkJSlBBIGRpYWdyYW0gYW5kIGNob29zZQotCQkJCQkJCTxrYmQgdGl0bGU9IktleWJvYXJkIGJ1dHRvbiI+REVMRVRFPC9rYmQ+Ci0JCQkJCQkJLCBvciBjaG9vc2UgPGk+RGVsZXRlPC9pPiBpbiB0aGUgY29udGV4dCBtZW51LgotCQkJCQkJPC9wPgotCQkJCQkJPGRpdj4KLQkJCQkJCQk8cD5SZW1vdmluZyBhIHJlbGF0aW9uc2hpcCB2aWEgdGhlIEpQQSBkaWFncmFtIGFsc28gcmVtb3ZlcwotCQkJCQkJCQlpdCBmcm9tIHRoZSBhcHBsaWNhdGlvbiBkYXRhIG1vZGVsIGFuZCBkZWxldGVzIHRoZSByZWxhdGlvbnNoaXAKLQkJCQkJCQkJYXR0cmlidXRlcyBvZiB0aGUgdHdvIHJlbGF0ZWQgZW50aXRpZXMuPC9wPgotCQkJCQkJPC9kaXY+PC9saT4KLQkJCQk8L29sPgotCQkJPC9kaXY+PC90ZD4KLQk8L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaHRtbC90b2MuaHRtbCBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvdG9jLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5Yjk2MzEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaHRtbC90b2MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5UYWJsZSBvZiBDb250ZW50czwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCTxoMT5UYWJsZSBvZiBDb250ZW50czwvaDE+Ci0JUGxlYXNlIGVudGVyIHlvdXIgdGV4dCBoZXJlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2ltZy9qcGFfZGlhZ3JhbV9kZWxldGVfYXR0cmlidXRlLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2ltZy9qcGFfZGlhZ3JhbV9kZWxldGVfYXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRiNTNmMS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9pbWcvanBhX2RpYWdyYW1fZGVsZXRlX2F0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9pbWcvanBhX2RpYWdyYW1fZWRpdG9yLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2ltZy9qcGFfZGlhZ3JhbV9lZGl0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmM5NWU2Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2ltZy9qcGFfZGlhZ3JhbV9lZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaW1nL2pwYV9kaWFncmFtX2VudGl0eV9vcGVyYXRpb25zLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2ltZy9qcGFfZGlhZ3JhbV9lbnRpdHlfb3BlcmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MDBhMWIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaW1nL2pwYV9kaWFncmFtX2VudGl0eV9vcGVyYXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2ltZy9qcGFfbWluaWF0dXJlX3ZpZXcuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaW1nL2pwYV9taW5pYXR1cmVfdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkM2UyNTQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaW1nL2pwYV9taW5pYXR1cmVfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9pbWcvanBhZWRpdG9yX2VudGl0eS5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9pbWcvanBhZWRpdG9yX2VudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNDk1ZmYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaW1nL2pwYWVkaXRvcl9lbnRpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI2MGEzZi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXBsdWdpbk5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRG9jdW1lbnRhdGlvbgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL3BsdWdpbi54bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDVjNmFjLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuNCI/PgotPHBsdWdpbj4KLQotCTwhLS0gPT09PT09PT09PT0gLS0+Ci0JPCEtLSBEZWZpbmUgVE9DICAtLT4KLQk8IS0tID09PT09PT09PT09IC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgIDx0b2MKLSAgICAgICAgICAgIGZpbGU9InRvYy54bWwiCi0gICAgICAgICAgICBwcmltYXJ5PSJ0cnVlIj4KLSAgICAgIDwvdG9jPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvdG9jLnhtbCBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYmJmNjIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJKUEEgRGlhZ3JhbSBFZGl0b3IgUHJvamVjdCBVc2VyIEd1aWRlIj4KLQotCTx0b3BpYyBsYWJlbD0iR2V0dGluZyBzdGFydGVkIiBocmVmPSJodG1sL2dldHRpbmdfc3RhcnRlZC5odG1sIi8+Ci0JCi0gICAgPHRvcGljIGxhYmVsPSJUYXNrcyI+Ci0gICAgCTx0b3BpYyBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMy5odG0iIGxhYmVsPSJDcmVhdGUgbmV3IEpQQSBwcm9qZWN0Ij4KLSAgICAJPC90b3BpYz4KLSAgICAgPHRvcGljIGhyZWY9Imh0bWwvdGFza19jb25maWd1cmluZ19lZGl0b3IuaHRtbCIgbGFiZWw9IkNvbmZpZ3VyaW5nIHRoZSBKUEEgZGlhZ3JhbSBlZGl0b3IiPgotICAgICA8L3RvcGljPgotICAgIAk8dG9waWMgaHJlZj0iaHRtbC90YXNrX29wZW5fZGlhZ3JhbS5odG1sIiBsYWJlbD0iT3BlbiBKUEEgRGlhZ3JhbSwgY3JlYXRlIGFuZCBkaXNwbGF5IGVudGl0aWVzIj4KLSAgICAJPC90b3BpYz4KLSAgICAJPHRvcGljIGhyZWY9Imh0bWwvdGFza19yZW1vdmVfZW50aXRpZXMuaHRtbCIgbGFiZWw9IkRlZmluaW5nIGFuZCByZW1vdmluZyByZWxhdGlvbnNoaXBzIGJldHdlZW4gZW50aXRpZXMiPgotICAgIAk8L3RvcGljPgotICAgIAk8dG9waWMgaHJlZj0iaHRtbC90YXNrX21hbmFnZV9lbnRpdGllcy5odG1sIiBsYWJlbD0iTWFuYWdpbmcgZW50aXRpZXMiPgotICAgIAk8L3RvcGljPgotICAgIAk8dG9waWMgaHJlZj0iaHRtbC90YXNrX3JlZmFjdG9yX2VudGl0aWVzLmh0bWwiIGxhYmVsPSJSZWZhY3RvciwgdmlldywgZWRpdCBhbmQgcmVtb3ZlIGVudGl0aWVzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIj4KLSAgICAJPC90b3BpYz4KLSAgICAJPHRvcGljIGhyZWY9Imh0bWwvdGFza19vcGVuX21pbmlhdHVyZV92aWV3Lmh0bWwiIGxhYmVsPSJPcGVuaW5nIHRoZSBNaW5pYXR1cmUgdmlldyBvciB0aGUgSlBBIERldGFpbHMgdmlldyI+Ci0gICAgCTwvdG9waWM+Ci0gICAgCTx0b3BpYyBocmVmPSJodG1sL3Rhc2tfMjBfc3VwcG9ydC5odG1sIiBsYWJlbD0iSlBBIGRpYWdyYW0gZWRpdG9yIHBhcnRpYWwgc3VwcG9ydCBmb3IgSlBBIDIuMCI+Ci0gICAgCTwvdG9waWM+Ci0gCTwvdG9waWM+Ci0gICAgPHRvcGljIGxhYmVsPSJSZWZlcmVuY2UiPgotICAgICAgIDx0b3BpYyBocmVmPSJodG1sL3JlZmVyZW5jZV9wcm9qZWN0X3BhZ2UuaHRtbCIgbGFiZWw9IlByb3BlcnR5IHBhZ2UgLSBKUEEgRGlhZ3JhbSBFZGl0b3IgT3B0aW9ucyI+Ci0gICAgICAgPC90b3BpYz4KLSAgICA8L3RvcGljPiAKLQotPC90b2M+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS8uY2xhc3NwYXRoIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmMmMzNS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41IiAvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIiAvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS8uY3ZzaWdub3JlIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS8ucHJvamVjdCBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzk5NDk1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2NhZDA5Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNUdWUgTWFyIDA4IDEyOjA5OjU3IEVTVCAyMDExCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk0ZWJkNi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMjAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjYKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi41LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb247YnVuZGxlLXZlcnNpb249IlsxLjQuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmdlZjtidW5kbGUtdmVyc2lvbj0iWzMuNi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZ3JhcGhpdGk7YnVuZGxlLXZlcnNpb249IlswLjguMCwxLjAuMCkiLAotIG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tO2J1bmRsZS12ZXJzaW9uPSJbMC44LjAsMS4wLjApIiwKLSBvcmcuZWNsaXBzZS5ncmFwaGl0aS5wYXR0ZXJuO2J1bmRsZS12ZXJzaW9uPSJbMC44LjAsMS4wLjApIiwKLSBvcmcuZWNsaXBzZS5ncmFwaGl0aS51aTtidW5kbGUtdmVyc2lvbj0iWzAuOC4wLDEuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbTtidW5kbGUtdmVyc2lvbj0iMS4zLjEwMCIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmRpYWxvZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZhY2FkZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvcGVydHl0ZXN0ZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvYWJvdXQuaHRtbCBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MWY1ODYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgyPkFib3V0IFRoaXMgQ29udGVudDwvSDI+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgCi0gIG91dCBiZWxvdy4gSWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCAKLSAgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIAotICB0byB0aGUgUmVkaXN0cmlidXRvciYjODIxNztzIGxpY2Vuc2UgZm9yIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLTxoND48YSBuYW1lPSJKUEEiIGlkPSJKUEEiPjwvYT5KYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSB2MS4wPC9oND4KLQotPGJsb2NrcXVvdGU+Ci0gIDxwPlRoZSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSB3aGljaCBpcyBkaXN0cmlidXRlZCB1bmRlciA8YSBocmVmPSJodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWwiPkNEREwgCi0gICAgdjEuMDwvYT4gaXMgcmVxdWlyZWQgYnkgdGhlIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBQcm9qZWN0IGluIG9yZGVyIAotICAgIHRvIHN1cHBvcnQgdGhpcyBzdGFuZGFyZC48L3A+Ci08L2Jsb2NrcXVvdGU+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQxOGY1ZC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgU0FQIEFHLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2NvbXBvbmVudC54bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjA3MmE1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpIj48ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvQ29tcG91bmRLZXkuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvQ29tcG91bmRLZXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOThkMTNkLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL0NvbXBvdW5kS2V5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL0VKQl8xNXgxNi5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9FSkJfMTV4MTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmZlZjA1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL0VKQl8xNXgxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9jbXBFbnRpdHlfb2JqLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2NtcEVudGl0eV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGVkMWY5Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2NtcEVudGl0eV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2FkZF9hdHRyaWJ1dGUuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2FkZF9hdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDFhNGMxLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9hZGRfYXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9hZGRfZW50aXR5LmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9hZGRfZW50aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk3ODM4NC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvYWRkX2VudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvYWRkX21hcHBlZC1zdXBlcmNsYXNzLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9hZGRfbWFwcGVkLXN1cGVyY2xhc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzk1ODVmLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9hZGRfbWFwcGVkLXN1cGVyY2xhc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2Jhc2ljLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9iYXNpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NDdkNzQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2Jhc2ljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9lbWJlZGRhYmxlLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9lbWJlZGRhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg1NmY3OC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvZW1iZWRkYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvZW1iZWRkZWQtaWQuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2VtYmVkZGVkLWlkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjOGUyMS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvZW1iZWRkZWQtaWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2VtYmVkZGVkLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9lbWJlZGRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYWU2NjQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2VtYmVkZGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9lbnRpdHktbWFwcGluZ3MuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2VudGl0eS1tYXBwaW5ncy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNDljOTYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2VudGl0eS1tYXBwaW5ncy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvZW50aXR5LmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9lbnRpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjA2ZjQ4Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9lbnRpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2lkLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9pZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMDVlYzMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2lkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9qcGEtY29udGVudC5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvanBhLWNvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGFiOTE3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9qcGEtY29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvanBhLWZpbGUuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2pwYS1maWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRlOWY0Ny4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvanBhLWZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L21hbnktdG8tbWFueS0xLWRpci5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbWFueS10by1tYW55LTEtZGlyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljYWMwMC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbWFueS10by1tYW55LTEtZGlyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9tYW55LXRvLW1hbnktMi1kaXIuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L21hbnktdG8tbWFueS0yLWRpci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YjNkMTQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L21hbnktdG8tbWFueS0yLWRpci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbWFueS10by1tYW55LmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9tYW55LXRvLW1hbnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODg4NWIyLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9tYW55LXRvLW1hbnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L21hbnktdG8tb25lLTEtZGlyLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9tYW55LXRvLW9uZS0xLWRpci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNGUyY2EuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L21hbnktdG8tb25lLTEtZGlyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9tYW55LXRvLW9uZS0yLWRpci5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbWFueS10by1vbmUtMi1kaXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODI4MDA3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9tYW55LXRvLW9uZS0yLWRpci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbWFueS10by1vbmUuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L21hbnktdG8tb25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUxZTJiOS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbWFueS10by1vbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L21hcHBlZC1zdXBlcmNsYXNzLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9tYXBwZWQtc3VwZXJjbGFzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYzM3NjQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L21hcHBlZC1zdXBlcmNsYXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9udWxsLWF0dHJpYnV0ZS1tYXBwaW5nLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9udWxsLWF0dHJpYnV0ZS1tYXBwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhOWMyMy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbnVsbC1hdHRyaWJ1dGUtbWFwcGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbnVsbC10eXBlLW1hcHBpbmcuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L251bGwtdHlwZS1tYXBwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI3OTQ3OC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbnVsbC10eXBlLW1hcHBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L29uZS10by1tYW55LTEtZGlyLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9vbmUtdG8tbWFueS0xLWRpci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MmVmNDguLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L29uZS10by1tYW55LTEtZGlyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9vbmUtdG8tbWFueS5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvb25lLXRvLW1hbnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTkwMDI3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9vbmUtdG8tbWFueS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvb25lLXRvLW9uZS0xLWRpci5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvb25lLXRvLW9uZS0xLWRpci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOTNhY2YuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L29uZS10by1vbmUtMS1kaXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L29uZS10by1vbmUtMi1kaXIuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L29uZS10by1vbmUtMi1kaXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTRhOWFmLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9vbmUtdG8tb25lLTItZGlyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9vbmUtdG8tb25lLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9vbmUtdG8tb25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4ZWMzNi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvb25lLXRvLW9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvcGVyc2lzdGVuY2UtdW5pdC5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvcGVyc2lzdGVuY2UtdW5pdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYzQ1ZjYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L3BlcnNpc3RlbmNlLXVuaXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L3BlcnNpc3RlbmNlLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9wZXJzaXN0ZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZjYxNmQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L3BlcnNpc3RlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9yZW1vdmVfYXR0cmlidXRlLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9yZW1vdmVfYXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAxNjZiMy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvcmVtb3ZlX2F0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvdHJhbnNpZW50LmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC90cmFuc2llbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzVkODNkLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC90cmFuc2llbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L3ZlcnNpb24uZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L3ZlcnNpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDJhODEwLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC92ZXJzaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC93YXJuaW5nLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC93YXJuaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQwMDllOS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvd2FybmluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9yZXN0b3JlLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL3Jlc3RvcmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDgxOTg0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL3Jlc3RvcmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvc2F2ZS5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9zYXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUwODUxYS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9zYXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL3NhdmVfYW5kX3JlbW92ZS5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9zYXZlX2FuZF9yZW1vdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzFkMjMxLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL3NhdmVfYW5kX3JlbW92ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2M1NWExLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1wbHVnaW5OYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpQQSBEaWFncmFtIEVkaXRvcgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotZGlhZ3JhbWVkaXRvci5uYW1lID0gSlBBIERpYWdyYW0gRWRpdG9yCi1kaWFncmFtZWRpdG9yLm9wZW5kaWFncmFtLm1lbnUubGFiZWwgPSBPcGVuIERpYWdyYW0KLWRpYWdyYW1lZGl0b3Iub3BlbmRpYWdyYW0uYWN0aW9uLmxhYmVsID0gT3BlbiBEaWFncmFtCi1kaWFncmFtZWRpdG9yLm9wZW5kaWFncmFtLnByb2plY3QubWVudS5sYWJlbCA9IE9wZW4gRGlhZ3JhbQotZGlhZ3JhbWVkaXRvci5vcGVuZGlhZ3JhbS5hY3Rpb24ucHJvamVjdC5sYWJlbCA9IE9wZW4gRGlhZ3JhbQotZGlhZ3JhbWVkaXRvci5wcmVmcGFnZSA9IEpQQSBEaWFncmFtIEVkaXRvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3BsdWdpbi54bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTdkMjVjLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0KLSAgICA8Y29weXJpZ2h0PgotICAgCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgCi0gICAgQ29udHJpYnV0b3JzOgotICAgICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICAgCi0gICAgPC9jb3B5cmlnaHQ+Ci0gICAKLSAtLT4KLTxwbHVnaW4+Ci0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvciIKLSAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9lbnQvZW50aXR5LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aSIKLSAgICAgICAgICAgIG1hdGNoaW5nU3RyYXRlZ3k9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udWkuSlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneSIKLSAgICAgICAgICAgIG5hbWU9IiVkaWFncmFtZWRpdG9yLm5hbWUiPgotICAgICAgPC9lZGl0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotIDxleHRlbnNpb24KLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgIGFkYXB0YWJsZT0iZmFsc2UiCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLm9wZW5EaWFncmFtT25KcGFDb250ZW50Tm9kZSIKLSAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVJvb3RDb250ZXh0Tm9kZU1vZGVsIj4KLSAgICAgICAgICAKLQkJCTxlbmFibGVtZW50PgotCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5qcGFDb250ZW50Tm9kZUZhY2V0IiB2YWx1ZT0ianB0LmpwYSIvPgotCQkJPC9lbmFibGVtZW50PgotICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLm9wZW5EaWFncmFtSnBhQ29udGVudE5vZGVNZW51IgotICAgICAgICAgICAgIGxhYmVsPSIlZGlhZ3JhbWVkaXRvci5vcGVuZGlhZ3JhbS5tZW51LmxhYmVsIj4KLSAgICAgICA8L21lbnU+Ci0gICAgICAgPGFjdGlvbgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnVpLk9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkub3BlbkRpYWdyYW1PbkpwYUNvbnRlbnROb2RlQWN0aW9uIgotICAgICAgICAgICAgIGxhYmVsPSIlZGlhZ3JhbWVkaXRvci5vcGVuZGlhZ3JhbS5hY3Rpb24ubGFiZWwiPgotICAgICAgIDwvYWN0aW9uPgotICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICBhZGFwdGFibGU9ImZhbHNlIgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5vcGVuRGlhZ3JhbUpwYSIKLSAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhTm9kZSI+Ci0gICAgICAgICAgCi0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuanBhUHJvamVjdEZhY2V0IiB2YWx1ZT0ianB0LmpwYSIvPgotCQkJPC9lbmFibGVtZW50PgotICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLm9wZW5EaWFncmFtSnBhTWVudSIKLSAgICAgICAgICAgICBsYWJlbD0iJWRpYWdyYW1lZGl0b3Iub3BlbmRpYWdyYW0ubWVudS5sYWJlbCI+Ci0gICAgICAgPC9tZW51PgotICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51aS5PcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLm9wZW5EaWFncmFtSnBhQWN0aW9uIgotICAgICAgICAgICAgIGxhYmVsPSIlZGlhZ3JhbWVkaXRvci5vcGVuZGlhZ3JhbS5hY3Rpb24ubGFiZWwiPgotICAgICAgIDwvYWN0aW9uPgotICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLm9wZW5EaWFncmFtT25KcGFQcm9qZWN0IgotICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJPGVuYWJsZW1lbnQ+Ci0JCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IiB2YWx1ZT0ianB0LmpwYSIvPgotCQk8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPGFjdGlvbgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnVpLk9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkub3BlbkRpYWdyYW1PbkpwYVByb2plY3RBY3Rpb24iCi0gICAgICAgICAgICAgbGFiZWw9IiVkaWFncmFtZWRpdG9yLm9wZW5kaWFncmFtLmFjdGlvbi5wcm9qZWN0LmxhYmVsIgotICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLm1lbnUuSnBhVG9vbHMvY29udGVudCI+Ci0gICAgICAgPC9hY3Rpb24+Ci0gICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gPC9leHRlbnNpb24+Ci08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotIAk8cGFnZQotICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLkVkaXRvcnMiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UiCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UiCi0gICAgICAgIG5hbWU9IiVkaWFncmFtZWRpdG9yLnByZWZwYWdlIj4KLSAgIAk8L3BhZ2U+Ci08L2V4dGVuc2lvbj4KLTxleHRlbnNpb24KLSAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotICAgPGluaXRpYWxpemVyCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyIj4KLSAgIDwvaW5pdGlhbGl6ZXI+Ci08L2V4dGVuc2lvbj4KLTxleHRlbnNpb24KLSAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLSAgIDxwYWdlCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5qcGFQcm9qZWN0UHJvcGVydGllcyIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuSlBBRGlhZ3JhbVByb3BlcnR5UGFnZSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5wcm9wZXJ0eXBhZ2UiCi0gICAgICAgICBuYW1lPSIlZGlhZ3JhbWVkaXRvci5wcmVmcGFnZSI+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4gCQkgICAgICAgIAotCQkgICAgICAgICAgPG9yPgotCQkJCSAgICA8dGVzdAotCQkJCQkgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkgICAgIHZhbHVlPSJqcHQuanBhOjEuMCI+Ci0JCQkJCTwvdGVzdD4KLQkJCQkJPHRlc3QKLQkJCQkJICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCSAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJICAgICB2YWx1ZT0ianB0LmpwYToyLjAiPgotCQkJCQk8L3Rlc3Q+Ci0JCQkJICA8L29yPgkKLQkJICAgICAgICA8L2FkYXB0PiAKLQkJCTwvZW5hYmxlZFdoZW4+ICAgICAgICAgCi0gICA8L3BhZ2U+Ci08L2V4dGVuc2lvbj4KLTxleHRlbnNpb24KLSAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5kaWFncmFtVHlwZVByb3ZpZGVycyI+Ci0gICA8ZGlhZ3JhbVR5cGVQcm92aWRlcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkucHJvdmlkZXIuSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlciIKLSAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnByb3ZpZGVyLkpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIiPgotICAgICAgPGRpYWdyYW1UeXBlCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuSlBBRWRpdG9yRGlhZ3JhbVR5cGUiPgotICAgICAgPC9kaWFncmFtVHlwZT4KLSAgICAgIDxpbWFnZVByb3ZpZGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkucHJvdmlkZXIuSlBBRWRpdG9ySW1hZ2VQcm92aWRlciI+Ci0gICAgICA8L2ltYWdlUHJvdmlkZXI+Ci0gICA8L2RpYWdyYW1UeXBlUHJvdmlkZXI+Ci08L2V4dGVuc2lvbj4KLTxleHRlbnNpb24KLSAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5kaWFncmFtVHlwZXMiPgotICAgPGRpYWdyYW1UeXBlCi0gICAgICAgICBkZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgZGlhZ3JhbSB0eXBlIGZvciB0aGUgSlBBIGVkaXRvciIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5KUEFFZGl0b3JEaWFncmFtVHlwZSIKLSAgICAgICAgIG5hbWU9IkpQQSBlZGl0b3IgZGlhZ3JhbSB0eXBlIgotICAgICAgICAgdHlwZT0iSlBBIERpYWdyYW0iPgotICAgPC9kaWFncmFtVHlwZT4KLTwvZXh0ZW5zaW9uPgotPGV4dGVuc2lvbgotICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmdyYXBoaXRpLnVpLmltYWdlUHJvdmlkZXJzIj4KLSAgIDxpbWFnZVByb3ZpZGVyCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9ySW1hZ2VQcm92aWRlciIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5wcm92aWRlci5KUEFFZGl0b3JJbWFnZVByb3ZpZGVyIj4KLSAgIDwvaW1hZ2VQcm92aWRlcj4KLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLnByb3BlcnR5VGVzdGVycyI+Ci0gICAgPHByb3BlcnR5VGVzdGVyCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkucHJvcGVydHl0ZXN0ZXIuSnBhUHJvamVjdEZhY2V0VmVyc2lvblByb3BlcnR5VGVzdGVyIgotICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYU5vZGUiCi0gICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpIgotICAgICAgcHJvcGVydGllcz0ianBhUHJvamVjdEZhY2V0IgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3BlcnR5dGVzdGVyLkpwYVByb2plY3RGYWNldFZlcnNpb25Qcm9wZXJ0eVRlc3RlciI+Ci0gICAgPC9wcm9wZXJ0eVRlc3Rlcj4KLSAgICA8cHJvcGVydHlUZXN0ZXIKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvcGVydHl0ZXN0ZXIuSnBhQ29udGVudE5vZGVGYWNldFByb2plY3RWZXJzaW9uUHJvcGVydHlUZXN0ZXIiCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLkpwYUNvbnRlbnROb2RlRmFjZXRWZXJzaW9uUHJvcGVydHlUZXN0ZXIiCi0gICAgICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aSIKLSAgICAgICAgICBwcm9wZXJ0aWVzPSJqcGFDb250ZW50Tm9kZUZhY2V0IgotICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUm9vdENvbnRleHROb2RlTW9kZWwiPgotICAgIDwvcHJvcGVydHlUZXN0ZXI+Ci08L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9wb20ueG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiMWNmZi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KLQk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0JPHZlcnNpb24+MS4wLjEwMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQkKLQk8cGFyZW50PgotCQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcl9wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0JCTxncm91cElkPm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yPC9ncm91cElkPgotCQk8dmVyc2lvbj4xLjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQkJPHJlbGF0aXZlUGF0aD4uLi8uLi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5yZWxlbmcvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotCTwvcGFyZW50PgotCQotCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpPC9hcnRpZmFjdElkPgotCTxwYWNrYWdpbmc+ZWNsaXBzZS1wbHVnaW48L3BhY2thZ2luZz4KLQk8bmFtZT5KUEEgRGlhZ3JhbSBFZGl0b3IgUGx1Zy1pbjwvbmFtZT4JCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL0pQQURpYWdyYW1FZGl0b3IuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9KUEFEaWFncmFtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NzA1OGUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL0pQQURpYWdyYW1FZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIgU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db250ZXh0TWVudVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5lZGl0b3IuRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5pbnRlcm5hbC5wYXJ0cy5Db25uZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5QbGF0Zm9ybVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51aS5KUEFEaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLk1vZGVsSW50ZWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9yQ29udGV4dE1lbnVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuRW50aXRpZXNDb29yZGluYXRlc1hNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkdyYXBoaWNzVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUNoZWNrU3VtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLldycDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKUEFEaWFncmFtRWRpdG9yIGV4dGVuZHMgRGlhZ3JhbUVkaXRvciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIERlZmF1bHRFZGl0RG9tYWluIGVkaXREb21haW47Ci0KLQlwcml2YXRlIEphdmFQZXJzaXN0ZW50VHlwZSBpbnB1dEpwdFR5cGU7Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkganBhU2VsZWN0aW9uTWFuYWdlckZhY3Rvcnk7Ci0KLQlwdWJsaWMgSlBBRGlhZ3JhbUVkaXRvcigpIHsKLQkJdGhpcyhuZXcgU2VsZWN0aW9uTWFuYWdlckZhY3RvcnlJbXBsKCkpOwotCQllZGl0RG9tYWluID0gbmV3IERlZmF1bHRFZGl0RG9tYWluKHRoaXMpOwotCX0KLQotCXB1YmxpYyBKUEFEaWFncmFtRWRpdG9yKElTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeSBqcGFTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeSkgewotCQlzdXBlcigpOwotCQl0aGlzLmpwYVNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5ID0ganBhU2VsZWN0aW9uTWFuYWdlckZhY3Rvcnk7Ci0JCWVkaXREb21haW4gPSBuZXcgRGVmYXVsdEVkaXREb21haW4odGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIgZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChKUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyKSBzdXBlci5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCk7Ci0JfQotCi0JcHVibGljIElGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIHR5cGUpIHsJCQotCQlpZihJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MuZXF1YWxzKHR5cGUpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcih0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlV2l0aG91dEVudGl0aWVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmaW5hbCBEaWFncmFtIGQgPSBnZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbSgpOwotCQlmaW5hbCBXcnAgd3JwID0gbmV3IFdycCgpOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihkKTsKLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJSlBBQ2hlY2tTdW0uSU5TVEFOQ0UoKS5hc3NpZ25FbnRpdHlTaGFwZXNNRDVTdHJpbmdzKGQsIE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldFByb2plY3RCeURpYWdyYW0oZC5nZXROYW1lKCkpKTsKLQkJCQlMaXN0PFNoYXBlPiBjaGlsZHJlbiA9IGQuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlJdGVyYXRvcjxTaGFwZT4gY2hJdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQkJYm9vbGVhbiBzYXZlID0gdHJ1ZTsKLQkJCQl3aGlsZSAoY2hJdC5oYXNOZXh0KCkpIHsKLQkJCQkJQ29udGFpbmVyU2hhcGUgc2ggPSAoQ29udGFpbmVyU2hhcGUpY2hJdC5uZXh0KCk7Ci0JCQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBnZXRGZWF0dXJlUHJvdmlkZXIoKQotCQkJCQkJCS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoc2gpOwotCQkJCQlTdHJpbmcgZW50TmFtZSA9IEpQQUVkaXRvclV0aWwuZ2V0VGV4dChqcHQpOwotCQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gSlBBRWRpdG9yVXRpbC5nZXRDb21waWxhdGlvblVuaXQoanB0KTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChjdS5oYXNVbnNhdmVkQ2hhbmdlcygpKSB7Ci0JCQkJCQkJZW50TmFtZSA9ICIqICIgKyBlbnROYW1lOyAJLy8kTk9OLU5MUy0xJAotCQkJCQkJCXNhdmUgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIlByb2JsZW0gd2l0aCBjb21waWxhdGlvbiB1bml0IiwgZSk7IC8vJE5PTi1OTFMtMSQJCQkJIAotCQkJCQl9Ci0JCQkJCUdyYXBoaWNzVXBkYXRlci51cGRhdGVIZWFkZXIoc2gsIGVudE5hbWUpOwotCQkJCX0KLQkJCQl3cnAuc2V0T2JqKG5ldyBCb29sZWFuKHNhdmUpKTsKLQkJCX0KLQkJfSk7CQkKLQkJaWYgKChCb29sZWFuKXdycC5nZXRPYmooKSkKLQkJCXN1cGVyLmRvU2F2ZShtb25pdG9yKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkb1NhdmUoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZpbmFsIERpYWdyYW0gZCA9IGdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCk7Ci0JCS8vSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCA9IChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKWdldEZlYXR1cmVQcm92aWRlcigpOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihkKTsKLQkJaWYgKChkID09IG51bGwpIHx8ICh0ZWQgPT0gbnVsbCkpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoKGQgPT0gbnVsbCkgPyAiRGlhZ3JhbSBpcyBudWxsIiA6ICJUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBpcyBudWxsIiwgbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAkgLy8kTk9OLU5MUy0yJAkgICAgIAkJCQkJCi0JCQlyZXR1cm47Ci0JCX0KLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJSlBBQ2hlY2tTdW0uSU5TVEFOQ0UoKS5hc3NpZ25FbnRpdHlTaGFwZXNNRDVTdHJpbmdzKGQsIE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldFByb2plY3RCeURpYWdyYW0oZC5nZXROYW1lKCkpKTsKLQkJCQlMaXN0PFNoYXBlPiBjaGlsZHJlbiA9IGQuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlJdGVyYXRvcjxTaGFwZT4gY2hJdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGNoSXQuaGFzTmV4dCgpKSB7Ci0JCQkJCVNoYXBlIHNoID0gY2hJdC5uZXh0KCk7Ci0JCQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBnZXRGZWF0dXJlUHJvdmlkZXIoKQotCQkJCQkJCS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoc2gpOwotCQkJCQlpZiAoanB0ICE9IG51bGwpCi0JCQkJCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5mb3JjZVNhdmVFbnRpdHlDbGFzcyhqcHQsIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKSBnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQkJfQotCQkJCS8qCi0JCQkJUmVzb3VyY2UgcmVzID0gTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0UmVzb3VyY2VCeURpYWdyYW0oZCk7Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJLy9kb1NhdmUobW9uaXRvcik7Ci0JCQkJCXJlcy5zYXZlKG51bGwpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW4ndCBzYXZlIHRoZSBkaWFncmFtIik7CS8vJE5PTi1OTFMtMSQKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsgCQotCQkJCX0KLQkJCQkqLwotCQkJCQotCQkJfQotCQl9KTsKLQkJCi0JCS8vSVByb2plY3QgcHJvamVjdCA9IE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldFByb2plY3RCeURpYWdyYW0oKS5nZXRQcm9qZWN0KCk7Ci0JCUVudGl0aWVzQ29vcmRpbmF0ZXNYTUwgeG1sID0gbmV3IEVudGl0aWVzQ29vcmRpbmF0ZXNYTUwoZC5nZXROYW1lKCkpOwotCQl4bWwuc3RvcmUoKTsKLQkJeG1sLmNsb3NlKCk7Ci0JCQotCQlzdXBlci5kb1NhdmUobW9uaXRvcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRleHRNZW51UHJvdmlkZXIgY3JlYXRlQ29udGV4dE1lbnVQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKUEFFZGl0b3JDb250ZXh0TWVudVByb3ZpZGVyKGdldEdyYXBoaWNhbFZpZXdlcigpLAotCQkJCWdldEFjdGlvblJlZ2lzdHJ5KCksCi0JCQkJZ2V0Q29uZmlndXJhdGlvblByb3ZpZGVyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0V2l0aEZpbGVFZGl0b3JJbnB1dChmaW5hbCBJRWRpdG9yU2l0ZSBzaXRlLAotCQkJZmluYWwgSUZpbGUgZW50aXR5RmlsZSkgewotCQlEaWFncmFtIGRpYWdyYW0gPSBudWxsOwotCQl0cnkgewkJCQotCQkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2l0ZQotCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQlkaWFsb2cucnVuKHRydWUsIGZhbHNlLCBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQltb25pdG9yLmJlZ2luVGFzaygKLQkJCQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KUEFEaWFncmFtRWRpdG9yX3dhaXRpbmdGb3JNb2luLAotCQkJCQkJCUlQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7CQkJCQkKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWlucHV0SnB0VHlwZSA9IEpQQUVkaXRvclV0aWwuZ2V0SlBUeXBlKEphdmFDb3JlCi0JCQkJCS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGVudGl0eUZpbGUpKTsKLQkJCXNldFBhcnRQcm9wZXJ0eSgKLQkJCQkJSlBBRWRpdG9yQ29uc3RhbnRzLk9QRU5fV0hPTEVfUEVSU0lTVEVOQ0VfVU5JVF9FRElUT1JfUFJPUEVSVFksCi0JCQkJCWlucHV0SnB0VHlwZS5nZXROYW1lKCkpOwotCQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGlucHV0SnB0VHlwZS5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCVN0cmluZyBkaWFncmFtVVJJID0gTW9kZWxJbnRlZ3JhdGlvblV0aWwuY3JlYXRlRGlhZ3JhbVBhdGgocGVyc2lzdGVuY2VVbml0KS50b1N0cmluZygpOwotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZGVmYXVsdFRyYW5zRWRpdERvbWFpbiA9IChUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbilpbnB1dEpwdFR5cGUuCi0JCQkJCQkJCWdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0QWRhcHRlcihUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbi5jbGFzcyk7Ci0JCQlkaWFncmFtID0gTW9kZWxJbnRlZ3JhdGlvblV0aWwuY3JlYXRlRGlhZ3JhbShwZXJzaXN0ZW5jZVVuaXQsIDEwLCB0cnVlKTsKLQkJCUpQQURpYWdyYW1FZGl0b3JJbnB1dCBkaWFncmFtSW5wdXQgPSBuZXcgSlBBRGlhZ3JhbUVkaXRvcklucHV0KGRpYWdyYW0sCi0JCQkJCQkJCQkJCQkJCQkJCQkgICBkaWFncmFtVVJJLCAKLQkJCQkJCQkJCQkJCQkJCQkJCSAgIGRlZmF1bHRUcmFuc0VkaXREb21haW4sIAotCQkJCQkJCQkJCQkJCQkJCQkJICAgSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlci5JRCwgCi0JCQkJCQkJCQkJCQkJCQkJCQkgICBmYWxzZSk7Ci0JCQkvL01vZGVsSW50ZWdyYXRpb25VdGlsLm1hcERpYWdyYW1Ub1Byb2plY3QoZGlhZ3JhbSwgcGVyc2lzdGVuY2VVbml0Ci0JCQkvLwkJLmdldEpwYVByb2plY3QoKSk7Ci0JCQlzdXBlci5pbml0KHNpdGUsIGRpYWdyYW1JbnB1dCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQkJLy9Nb2RlbEludGVncmF0aW9uVXRpbC5yZW1vdmVEaWFncmFtUHJvamVjdE1hcHBpbmcoZGlhZ3JhbSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4uUExVR0lOX0lELCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQkJCS8vTW9kZWxJbnRlZ3JhdGlvblV0aWwucmVtb3ZlRGlhZ3JhbVByb2plY3RNYXBwaW5nKGRpYWdyYW0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5QTFVHSU5fSUQsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQkJLy9Nb2RlbEludGVncmF0aW9uVXRpbC5yZW1vdmVEaWFncmFtUHJvamVjdE1hcHBpbmcoZGlhZ3JhbSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsJCQotCQlJRmlsZSBlbnRpdHlGaWxlID0gKElGaWxlKSBpbnB1dC5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJCi0JCWlmIChlbnRpdHlGaWxlICE9IG51bGwgJiYgZW50aXR5RmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKCJqYXZhIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaW5pdFdpdGhGaWxlRWRpdG9ySW5wdXQoc2l0ZSwgZW50aXR5RmlsZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZihpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpewotCQkJCXRocm93IG5ldyBQYXJ0SW5pdEV4Y2VwdGlvbihOTFMuYmluZChKUEFFZGl0b3JNZXNzYWdlcy5KUEFEaWFncmFtRWRpdG9yX29wZW5EaWFncmFtRXJyb3JNU0csIGVudGl0eUZpbGUuZ2V0TmFtZSgpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChwYXJ0LCBzZWxlY3Rpb24pOwotCQlpZiAoIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdFNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYXRvcjxJU3RydWN0dXJlZFNlbGVjdGlvbj4gaXRlciA9IHN0cnVjdFNlbC5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyLmhhc05leHQoKSl7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQlpZihvYmplY3QgaW5zdGFuY2VvZiBFZGl0UGFydCl7Ci0JCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIG9iamVjdDsKLQkJCQlpZihlZGl0UGFydCBpbnN0YW5jZW9mIENvbm5lY3Rpb25FZGl0UGFydCl7Ci0JCQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uZWN0aW9uRWRpdFBhcnQgPSAgKENvbm5lY3Rpb25FZGl0UGFydCkgKGVkaXRQYXJ0KTsKLQkJCQkJY29ubmVjdGlvbkVkaXRQYXJ0LnJlbW92ZUVkaXRQb2xpY3koRWRpdFBvbGljeS5DT05ORUNUSU9OX0JFTkRQT0lOVFNfUk9MRSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChvIGluc3RhbmNlb2YgRWRpdFBhcnQpIHsJCQkKLQkJCUpwYVNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uTWFuYWdlciA9IGdldEpwYVNlbGVjdGlvbk1hbmFnZXIocGFydCk7Ci0JCQlPYmplY3QgbSA9ICgoRWRpdFBhcnQpIG8pLmdldE1vZGVsKCk7Ci0JCQlpZiAobSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWlmIChtIGluc3RhbmNlb2YgUGljdG9ncmFtRWxlbWVudCkgewotCQkJCU9iamVjdCBibyA9IGdldEZlYXR1cmVQcm92aWRlcigpCi0JCQkJCQkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KAotCQkJCQkJCQkoUGljdG9ncmFtRWxlbWVudCkgbSk7Ci0JCQkJaWYgKChibyA9PSBudWxsKSB8fCAoIShibyBpbnN0YW5jZW9mIEpwYVN0cnVjdHVyZU5vZGUpKSkKLQkJCQkJcmV0dXJuOwotCQkJCXNlbGVjdGlvbk1hbmFnZXIuc2V0U2VsZWN0aW9uKChKcGFTdHJ1Y3R1cmVOb2RlKSBibyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBKcGFTZWxlY3Rpb25NYW5hZ2VyIGdldEpwYVNlbGVjdGlvbk1hbmFnZXIoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlyZXR1cm4ganBhU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkuZ2V0U2VsZWN0aW9uTWFuYWdlcihwYXJ0LmdldFNpdGUoKQotCQkJCS5nZXRXb3JrYmVuY2hXaW5kb3coKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSVNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5IHsKLQkJcHVibGljIEpwYVNlbGVjdGlvbk1hbmFnZXIgZ2V0U2VsZWN0aW9uTWFuYWdlcihJV29ya2JlbmNoV2luZG93IHdpbmRvdyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VsZWN0aW9uTWFuYWdlckZhY3RvcnlJbXBsIGltcGxlbWVudHMKLQkJCUlTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeSB7Ci0KLQkJcHVibGljIEpwYVNlbGVjdGlvbk1hbmFnZXIgZ2V0U2VsZWN0aW9uTWFuYWdlcihJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJcmV0dXJuIFBsYXRmb3JtVG9vbHMuZ2V0QWRhcHRlcih3aW5kb3csIEpwYVNlbGVjdGlvbk1hbmFnZXIuY2xhc3MpOwotCQl9Ci0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIERlZmF1bHRFZGl0RG9tYWluIGdldEVkaXREb21haW4oKSB7Ci0JCXJldHVybiBlZGl0RG9tYWluOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9KUEFEaWFncmFtRWRpdG9yUGx1Z2luLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2Q2MzQ2Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9KUEFEaWFncmFtRWRpdG9yUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuZGlhbG9ncy5PcHRpb25hbE1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZhY2FkZS5FY2xpcHNlRmFjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKUEFEaWFncmFtRWRpdG9yUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBKUEFEaWFncmFtRWRpdG9yUGx1Z2luIHBsdWdpbjsKLQkKLQlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyOwotCQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSlBBRGlhZ3JhbUVkaXRvclBsdWdpbigpIHsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQkJCi0JCU9wdGlvbmFsTWVzc2FnZURpYWxvZy5zZXREaWFsb2dFbmFibGVkKEpQQUVkaXRvckNvbnN0YW50cy5KUEFfU1VQUE9SVF9ESUFMT0dfSUQsIHRydWUpOwotCQljaGFuZ2VMaXN0ZW5lciA9IG5ldyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCUVjbGlwc2VGYWNhZGUuSU5TVEFOQ0UuZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCUVjbGlwc2VGYWNhZGUuSU5TVEFOQ0UuZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpQQURpYWdyYW1FZGl0b3JQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aAotCSAqCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgcGF0aCk7Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtc2cpIHsKLSAgICAgICAgbG9nRXJyb3IobXNnLCBudWxsKTsKLSAgICB9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBleGNlcHRpb24gb3IgZXJyb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJbG9nRXJyb3IodGhyb3dhYmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgdGhyb3dhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGFuZCBleGNlcHRpb24gb3IgZXJyb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtc2csIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIHRocm93YWJsZSkpOwotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBzdGF0dXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotCQlwbHVnaW4uZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotCQotCQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbiBvciBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nSW5mbyhTdHJpbmcgbXNnKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIG51bGwpKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZGlhbG9nL1NlbGVjdFR5cGVEaWFsb2cuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9kaWFsb2cvU2VsZWN0VHlwZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDg1ZTk3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9kaWFsb2cvU2VsZWN0VHlwZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5kaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb252ZW50aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlTdHJva2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5UaXRsZUFyZWFEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuQ29udGVudFByb3Bvc2FsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5JQ29udGVudFByb3Bvc2FsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuU2ltcGxlQ29udGVudFByb3Bvc2FsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuVGV4dENvbnRlbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc1NlcnZpY2U7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBTZWxlY3RUeXBlRGlhbG9nIGV4dGVuZHMgVGl0bGVBcmVhRGlhbG9nIHsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotCXByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZTsKLQlwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0JcHJvdGVjdGVkIFRleHQgdGV4dDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGU7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b247Ci0JcHJvdGVjdGVkIENvbnRlbnRQcm9wb3NhbEFkYXB0ZXIgY29udGVudFByb3Bvc2FsQWRhcHRlcjsKLQkKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIEtleVN0cm9rZSBrcyA9IG51bGw7Ci0Jc3RhdGljIHsKLQkJdHJ5IHsKLQkJCWtzID0gS2V5U3Ryb2tlLmdldEluc3RhbmNlKCJDdHJsK1NwYWNlIik7CQkJLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlMSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2FuJ3QgY3JlYXRlIGtleXN0cm9rZSBvYmplY3QiLCBlMSk7IAkvLyROT04tTkxTLTEkCi0JCX0gCi0JfQotCQotCXB1YmxpYyBTZWxlY3RUeXBlRGlhbG9nKFN0cmluZyBtZXNzYWdlLAotCQkJCQkJCVN0cmluZyBpbml0aWFsVHlwZSkgewotCQlzdXBlcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpKTsKLQkJdGhpcy50aXRsZSA9IEpQQUVkaXRvck1lc3NhZ2VzLlNlbGVjdFR5cGVEaWFsb2dfY2hvb3NlQXR0cmlidXRlVHlwZURpYWxvZ1RpdGxlOwotCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotCQl0aGlzLnR5cGUgPSBpbml0aWFsVHlwZTsKLQl9Ci0JCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb250cm9sIGNvbnRlbnRzID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLSAgICAgICAgaW5pdGlhbGl6ZUNvbnRyb2xzKCk7Ci0gICAgICAgIHZhbGlkYXRlUGFnZSgpOwotICAgICAgICByZXR1cm4gY29udGVudHM7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgICAgICAgc2hlbGwuc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5TZWxlY3RUeXBlRGlhbG9nX2Nob29zZUF0dHJpYnV0ZVR5cGVEaWFsb2dXaW5kb3dUaXRsZSk7Ci0gICAgfQotICAgIAotICAgIAotCXByb3RlY3RlZCBQb2ludCBnZXRJbml0aWFsU2l6ZSgpIHsKLQkJcmV0dXJuIG5ldyBQb2ludChjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscygzMjApLAotCQkJCQkJIGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscygxMjApKTsKLQl9ICAgIAotICAgIAotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQl0eXBlID0gdGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9CQkKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Jlc2l6YWJsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQkKLQkJCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuU2VsZWN0VHlwZURpYWxvZ190eXBlTGFiZWwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGV4dEZpZWxkKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJdGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVCcm93c2VCdG4oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5TZWxlY3RUeXBlRGlhbG9nX2Jyb3dzZUJ0blR4dCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5TZWxlY3RUeXBlRGlhbG9nX2Jyb3dzZUJ0bkRlc2MpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSUphdmFTZWFyY2hTY29wZSBzY29wZT0gU2VhcmNoRW5naW5lLmNyZWF0ZVdvcmtzcGFjZVNjb3BlKCk7Ci0JCQkJSVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKTsJCQkJCi0JCQkJU2VsZWN0aW9uRGlhbG9nIGQgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWQgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpLCAKLQkJCQkJc2VydmljZSwgCi0JCQkJCXNjb3BlLCAKLQkJCQkJSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0FMTF9UWVBFUywgCi0JCQkJCWZhbHNlLCAKLQkJCQkJdGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZTEpIHsKLQkJCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2FuJ3QgY3JlYXRlIHR5cGUgc2VsYWN0aW9uIGRpYWxvZyBpbnN0YW5jZSIsIGUxKTsgCS8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZC5vcGVuKCk7Ci0JCQkJT2JqZWN0W10gcmVzID0gZC5nZXRSZXN1bHQoKTsgCi0JCQkJaWYgKHJlcyA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJT2JqZWN0W10gb2JqID0gZC5nZXRSZXN1bHQoKTsKLQkJCQlpZiAob2JqID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlJVHlwZSB0cCA9IChJVHlwZSkgb2JqWzBdOwotCQkJCXRleHQuc2V0VGV4dCh0cC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCQkJdGV4dC5zZXRTZWxlY3Rpb24oMCwgdHAuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkubGVuZ3RoKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyIGNyZWF0ZUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyKCkgewotCQlTaW1wbGVDb250ZW50UHJvcG9zYWxQcm92aWRlciBjb250UHJvdmlkZXIgPSBuZXcgU2ltcGxlQ29udGVudFByb3Bvc2FsUHJvdmlkZXIoSlBBRWRpdG9yQ29uc3RhbnRzLlBSSU1JVElWRV9UWVBFU19BTkRfV1JBUFBFUlMpOwotCQljb250UHJvdmlkZXIuc2V0RmlsdGVyaW5nKHRydWUpOwotCQkKLQkJY29udGVudFByb3Bvc2FsQWRhcHRlciA9IG5ldyBDb250ZW50UHJvcG9zYWxBZGFwdGVyKAotCQkJCXRleHQsCi0JCQkJbmV3IFRleHRDb250ZW50QWRhcHRlcigpLCAKLQkJCQljb250UHJvdmlkZXIsCi0JCQkJa3MsCi0JCQkJbmV3IGNoYXJbXSB7J2InLCAnYycsICdkJywgJ2knLCAnZicsICdsJywgJ3MnLCAnaicsICdCJywgJ0MnLCAnRCcsICdJJywgJ0YnLCAnTCcsICdTJywgJ0onfSk7Ci0JCWNvbnRlbnRQcm9wb3NhbEFkYXB0ZXIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJY29udGVudFByb3Bvc2FsQWRhcHRlci5zZXRQcm9wb3NhbEFjY2VwdGFuY2VTdHlsZShDb250ZW50UHJvcG9zYWxBZGFwdGVyLlBST1BPU0FMX1JFUExBQ0UpOwotCQlyZXR1cm4gY29udFByb3ZpZGVyOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIHBhcmVudENvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICAgICAgR3JpZExheW91dCByb3dMYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudENvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgIAotICAgICAgICBHcmlkRGF0YSBkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgIGQuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICAgIGQuaGVpZ2h0SGludCA9IDQwMDsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZCk7Ci0gICAgICAgIAotIAkJcm93TGF5b3V0Lm1hcmdpbkxlZnQgPSA1OwotIAkJcm93TGF5b3V0Lm1hcmdpblRvcCA9IDU7Ci0gCQlyb3dMYXlvdXQubWFyZ2luUmlnaHQgPSA1OwotIAkJcm93TGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDMwOwotIAkJCi0gCQljb21wb3NpdGUuc2V0TGF5b3V0KHJvd0xheW91dCk7Ci0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoNDAsMjApOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJY3JlYXRlVGV4dEZpZWxkKGNvbXBvc2l0ZSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoMzAwLCAxNyk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXNldERpYWxvZ0NvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQkJCX0JCQkKLQkJfSk7Ci0JCWNyZWF0ZUJyb3dzZUJ0bihjb21wb3NpdGUpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKDEwMCwgMjUpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCWRhdGEubWluaW11bVdpZHRoID0gODA7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwkJCi0JCWNyZWF0ZUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyKCk7Ci0JCXJldHVybiBwYXJlbnRDb21wb3NpdGU7Ci0JfQotCQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplQ29udHJvbHMoKSB7Ci0gICAgICAgIHNldFRpdGxlKHRpdGxlKTsKLSAgICAgICAgc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgdGV4dC5zZXRUZXh0KHR5cGUpOwotICAgICAgICB0ZXh0LnNldFNlbGVjdGlvbigwLCB0eXBlLmxlbmd0aCgpKTsKLSAgICAgICAgc2V0RGlhbG9nQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotICAgIH0JCi0JCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RGlhbG9nQ29tcGxldGUoYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICB0aGlzLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKHZhbHVlKTsKLSAgICB9CQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCVN0cmluZyB0eXBlID0gdGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0eXBlKSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKEpQQUVkaXRvck1lc3NhZ2VzLlNlbGVjdFR5cGVEaWFsb2dfZW1wdHlUeXBlRXJyb3JUZXh0KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlJU3RhdHVzIHN0YXQgPSBnZXRTdGF0dXMoKTsKLQkJaWYgKHN0YXQuaXNPSygpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlzZXRNZXNzYWdlKG1lc3NhZ2UsCUlNZXNzYWdlLk5PTkUpOwotCQl9IGVsc2UgeyAKLQkJCXNldE1lc3NhZ2Uoc3RhdC5nZXRNZXNzYWdlKCksIElNZXNzYWdlLkVSUk9SKTsKLQkJfQotCQlyZXR1cm4gKHN0YXQuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJU3RhdHVzIGdldFN0YXR1cygpIHsKLSAgICAJU3RyaW5nIHR5cGUgPSB0ZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgCVN0cmluZ1tdIHR5cGVzID0gdHlwZS5zcGxpdCgiWzw+XFxbXFxdLF0iKTsJCS8vJE5PTi1OTFMtMSQKLSAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotICAgIAkJdHlwZSA9IHR5cGVzW2ldLnRyaW0oKTsKLQkJCUlTdGF0dXMgc3RhdCA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUphdmFUeXBlTmFtZSh0eXBlLCBKYXZhQ29yZS5WRVJTSU9OXzFfNiwgSmF2YUNvcmUuVkVSU0lPTl8xXzYpOwotCQkJYm9vbGVhbiBpc1ByaW1pdGl2ZSA9IEpQQUVkaXRvckNvbnN0YW50cy5QUklNSVRJVkVfVFlQRVNfQU5EX1dSQVBQRVJTX1NFVC5jb250YWlucyh0eXBlKTsKLQkJCWlmIChpc1ByaW1pdGl2ZSB8fCAoc3RhdC5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1IpKQotCQkJCWNvbnRpbnVlOwotCQkJcmV0dXJuIHN0YXQ7Ci0gICAgCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmFjYWRlL0Rpc3BsYXlGYWNhZGUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mYWNhZGUvRGlzcGxheUZhY2FkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmMxYjg1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mYWNhZGUvRGlzcGxheUZhY2FkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmFjYWRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JRGlzcGxheUZhY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1wdWJsaWMgY2xhc3MgRGlzcGxheUZhY2FkZSBpbXBsZW1lbnRzIElEaXNwbGF5RmFjYWRlIHsKLQotCXB1YmxpYyB2b2lkIGFzeW5jRXhlYyhSdW5uYWJsZSBydW5uYWJsZSkgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMocnVubmFibGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZhY2FkZS9FY2xpcHNlRmFjYWRlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmFjYWRlL0VjbGlwc2VGYWNhZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxZGUwZi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmFjYWRlL0VjbGlwc2VGYWNhZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtpcmlsIE1pdG92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZhY2FkZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSURpc3BsYXlGYWNhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JRWNsaXBzZUZhY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklKYXZhQ29yZUZhY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklTdGF0aWNJREU7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlRmFjYWRlIGltcGxlbWVudHMgSUVjbGlwc2VGYWNhZGUgewotCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlRmFjYWRlIElOU1RBTkNFID0gbmV3IEVjbGlwc2VGYWNhZGUoKTsKLQkKLQlwcml2YXRlIEVjbGlwc2VGYWNhZGUoKSB7Ci0JfQotCi0JcHVibGljIElKYXZhQ29yZUZhY2FkZSBnZXRKYXZhQ29yZSgpIHsKLQkJcmV0dXJuIG5ldyBKYXZhQ29yZUZhY2FkZSgpOwotCX0KLQotCXB1YmxpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSURpc3BsYXlGYWNhZGUgZ2V0RGlzcGxheSgpIHsKLQkJcmV0dXJuIG5ldyBEaXNwbGF5RmFjYWRlKCk7Ci0JfQotCQotCXB1YmxpYyBJU3RhdGljSURFIGdldElERSgpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNJREUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmFjYWRlL0phdmFDb3JlRmFjYWRlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmFjYWRlL0phdmFDb3JlRmFjYWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzA2OGUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZhY2FkZS9KYXZhQ29yZUZhY2FkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmFjYWRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklKYXZhQ29yZUZhY2FkZTsKLQotcHVibGljIGNsYXNzIEphdmFDb3JlRmFjYWRlIGltcGxlbWVudHMgSUphdmFDb3JlRmFjYWRlIHsKLQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShmaWxlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mYWNhZGUvU3RhdGljSURFLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmFjYWRlL1N0YXRpY0lERS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmIzMjU0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mYWNhZGUvU3RhdGljSURFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBQZXR5YSBTYWJldmEgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmFjYWRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JU3RhdGljSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLQotcHVibGljIGNsYXNzIFN0YXRpY0lERSBpbXBsZW1lbnRzIElTdGF0aWNJREUgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZQotCSAqIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnByb3ZpZGVyLklTdGF0aWNJREUjb3BlbkVkaXRvcihvcmcuZWNsaXBzZQotCSAqIC5jb3JlLnJlc291cmNlcy5JRmlsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuRWRpdG9yKElGaWxlIGZpbGUpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCUlERS5vcGVuRWRpdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkuZ2V0QWN0aXZlUGFnZSgpLCBmaWxlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0FkZEFsbEVudGl0aWVzRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQWRkQWxsRW50aXRpZXNGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNWM4YWYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQWRkQWxsRW50aXRpZXNGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmRhdGF0eXBlcy5JRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklBZGRGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQWRkQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkFkZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLkFic3RyYWN0Q3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnV0aWwuTW9kZWxJbnRlZ3JhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQWRkQWxsRW50aXRpZXNGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RDdXN0b21GZWF0dXJlIGltcGxlbWVudHMgSUFkZEZlYXR1cmUgewotCi0JaW50W10gbG93ZXJFZGdlcyA9IG5ldyBpbnRbMjAwXTsgCi0JaW50IG51bUluQVJvdzsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgRElTVF9GUk9NX0VER0VfSCA9IDUwOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBESVNUX0ZST01fRURHRV9WID0gNTA7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IERJU1RfSCA9IDEwMDsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgRElTVF9WID0gMTAwOwotCQotCXB1YmxpYyBBZGRBbGxFbnRpdGllc0ZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoSUNvbnRleHQgY3R4KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCURpYWdyYW0gZCA9IGdldERpYWdyYW0oKTsKLQkJSnBhUHJvamVjdCBwcm9qZWN0ID0gZ2V0VGFyZ2V0SlBBUHJvamVjdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgdW5pdCA9IHByb2plY3QuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS4KLQkJCQkJCQkJZ2V0UGVyc2lzdGVuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQkKLQkJUG9pbnQgbG93ZXN0UmlnaHRlc3RQb2ludE9mRXhpc3RpbmdEaWFncmFtID0gZ2V0TG93ZXN0UmlnaHRlc3RQb2ludChkKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgMjAwOyBpKyspIHsKLQkJCWxvd2VyRWRnZXNbaV0gPSBsb3dlc3RSaWdodGVzdFBvaW50T2ZFeGlzdGluZ0RpYWdyYW0ueSArIAotCQkJCQkJCQkoKChpICUgMiA9PSAwKSA/IDEgOiAyKSAqIAotCQkJCQkJCQkoKGxvd2VzdFJpZ2h0ZXN0UG9pbnRPZkV4aXN0aW5nRGlhZ3JhbS55ID09IDApID8gCi0JCQkJCQkJCQlESVNUX0ZST01fRURHRV9WIDogCi0JCQkJCQkJCQlESVNUX1YpKTsKLQkJfQotCQlJRGltZW5zaW9uIGRpbSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtRWRpdG9yKCkuZ2V0Q3VycmVudFNpemUoKTsKLQkJaW50IGRXaWR0aCA9IGRpbS5nZXRXaWR0aCgpOwotCQludW1JbkFSb3cgPSAoZFdpZHRoIC0gRElTVF9GUk9NX0VER0VfSCAtIDIwICsgSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9XSURUSCkvKEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfV0lEVEggKyBESVNUX0gpOwotCQludW1JbkFSb3cgPSAobnVtSW5BUm93ID4gMCkgPyBudW1JbkFSb3cgOiAxOwotCQkKLQkJbG93ZXJFZGdlc1swXSA9IGxvd2VzdFJpZ2h0ZXN0UG9pbnRPZkV4aXN0aW5nRGlhZ3JhbS55ICsgKChsb3dlc3RSaWdodGVzdFBvaW50T2ZFeGlzdGluZ0RpYWdyYW0ueSA9PSAwKSA/IERJU1RfRlJPTV9FREdFX1YgOiBESVNUX1YpOwkJCi0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKGQpOwotCQkKLQkJZm9yIChDbGFzc1JlZiBjbGFzc1JlZiA6IHVuaXQuZ2V0Q2xhc3NSZWZzKCkpIHsKLQkJCWlmIChjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKSAhPSBudWxsKSB7IC8vIG51bGwgaWYKLQkJCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCQkJCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5oYXNFbnRpdHlPck1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKGpwdCkpIHsKLQkJCQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChqcHQpOwotCQkJCQlpZiAocGUgIT0gbnVsbCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQkKLQkJCQkJZmluYWwgQWRkQ29udGV4dCBjdHggPSBuZXcgQWRkQ29udGV4dCgpOwotCQkJCQljdHguc2V0VGFyZ2V0Q29udGFpbmVyKGQpOwotCQkJCQljdHguc2V0TmV3T2JqZWN0KGpwdCk7Ci0JCQkJCQotCQkJCQlJbmRleEFuZExvd2VyRWRnZSBpZSA9IGdldE1pbkxvd2VyRWRnZSgpOwotCQkJCQkKLQkJCQkJaW50IHggPSBESVNUX0ZST01fRURHRV9IICsgaWUuaW5kZXggKiAoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9XSURUSCArIERJU1RfSCk7Ci0JCQkJCWN0eC5zZXRMb2NhdGlvbih4LCBpZS5sb3dlckVkZ2UpOwotCQkJCQlmaW5hbCBBZGRKUEFFbnRpdHlGZWF0dXJlIGZ0ID0gbmV3IEFkZEpQQUVudGl0eUZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCksIGZhbHNlKTsKLQkJCQkJCi0JCQkJCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJCQkJZnQuYWRkKGN0eCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCQlDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSA9IChDb250YWluZXJTaGFwZSlnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoanB0KTsKLQkJCQkJbG93ZXJFZGdlc1tpZS5pbmRleF0gPSBlbnRpdHlTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldFkoKSArIGVudGl0eVNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0SGVpZ2h0KCkgKyBESVNUX1Y7Ci0JCQkJfQotCQkJfQotCQl9CQkKLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWFycmFuZ2VJc0FSZWxhdGlvbnMoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQkJfQotCQl9KTsKLQotCX0KLQkKLQlwcml2YXRlIEluZGV4QW5kTG93ZXJFZGdlIGdldE1pbkxvd2VyRWRnZSgpIHsKLQkJSW5kZXhBbmRMb3dlckVkZ2UgcmVzID0gbmV3IEluZGV4QW5kTG93ZXJFZGdlKCk7Ci0JCXJlcy5sb3dlckVkZ2UgPSAxMDAwMDAwMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1JbkFSb3c7IGkrKykgewotCQkJaWYgKGxvd2VyRWRnZXNbaV0gPCByZXMubG93ZXJFZGdlKSB7Ci0JCQkJcmVzLmxvd2VyRWRnZSA9IGxvd2VyRWRnZXNbaV07Ci0JCQkJcmVzLmluZGV4ID0gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQkKLQlwcml2YXRlIEpwYVByb2plY3QgZ2V0VGFyZ2V0SlBBUHJvamVjdCgpIHsKLQkJcmV0dXJuIE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldFByb2plY3RCeURpYWdyYW0oZ2V0RGlhZ3JhbSgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUG9pbnQgZ2V0TG93ZXN0UmlnaHRlc3RQb2ludChEaWFncmFtIGQpIHsgCi0JCUxpc3Q8U2hhcGU+IHNoYXBlcyA9IGQuZ2V0Q2hpbGRyZW4oKTsKLQkJSXRlcmF0b3I8U2hhcGU+IGl0ID0gc2hhcGVzLml0ZXJhdG9yKCk7Ci0JCWludCB4ID0gMDsKLQkJaW50IHkgPSAwOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlTaGFwZSBzaCA9IGl0Lm5leHQoKTsKLQkJCWludCByaWdodEVkZ2UgPSBzaC5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldFgoKSArIAotCQkJCQkJCXNoLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0V2lkdGgoKTsKLQkJCXggPSBNYXRoLm1heCh4LCByaWdodEVkZ2UpOwotCQkJaW50IGxvd2VyRWRnZSA9IHNoLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0WSgpICsKLQkJCQkJCQkgc2guZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRIZWlnaHQoKTsKLQkJCXkgPSBNYXRoLm1heCh5LCBsb3dlckVkZ2UpOwotCQl9Ci0JCXggPSBNYXRoLm1heCh4LCAzICogKERJU1RfSCArIEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfV0lEVEgpKTsKLQkJcmV0dXJuIG5ldyBQb2ludCh4LCB5KTsKLQl9Ci0KLQlwdWJsaWMgUGljdG9ncmFtRWxlbWVudCBhZGQoSUFkZENvbnRleHQgY29udGV4dCkgewotCQl0aGlzLmV4ZWN1dGUobmV3IEN1c3RvbUNvbnRleHQoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkFkZChJQWRkQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIEluZGV4QW5kTG93ZXJFZGdlIHsKLQkJaW50IGluZGV4OwotCQlpbnQgbG93ZXJFZGdlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9zaG93QWxsVGhlRW50aXRpZXM7Ci0JfQotCQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKSBzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0FkZEF0dHJpYnV0ZUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0FkZEF0dHJpYnV0ZUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJkZDllOS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9BZGRBdHRyaWJ1dGVGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUFkZEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSURpcmVjdEVkaXRpbmdJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQWRkQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5BZGRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5DdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5JQ3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5pbXBsLkFic3RyYWN0QWRkU2hhcGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuR3JhcGhpY3NBbGdvcml0aG07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLldycDsKLQotCi1wdWJsaWMgY2xhc3MgQWRkQXR0cmlidXRlRmVhdHVyZSBleHRlbmRzIEFic3RyYWN0QWRkU2hhcGVGZWF0dXJlIHsKLQotCXByaXZhdGUgSUFkZEZlYXR1cmUgZ3JhcGhpY2FsQWRkOwotCi0JcHJpdmF0ZSBJQ3VzdG9tRmVhdHVyZSBleHBhbmRDb21wYXJ0bWVudEZlYXR1cmU7Ci0KLQlwdWJsaWMgQWRkQXR0cmlidXRlRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXRoaXMoZnAsIG5ldyBHcmFwaGljYWxBZGRBdHRyaWJ1dGVGZWF0dXJlKGZwKSwgbmV3IEV4cGFuZENvbXBhcnRtZW50U2hhcGVGZWF0dXJlKGZwKSk7Ci0JfQotCi0JcHVibGljIEFkZEF0dHJpYnV0ZUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCwgSUFkZEZlYXR1cmUgZ3JhcGhpY2FsQWRkLCBJQ3VzdG9tRmVhdHVyZSBleHBhbmRGZWF0dXJlKSB7Ci0JCXN1cGVyKGZwKTsKLQkJdGhpcy5ncmFwaGljYWxBZGQgPSBncmFwaGljYWxBZGQ7Ci0JCWV4cGFuZENvbXBhcnRtZW50RmVhdHVyZSA9IGV4cGFuZEZlYXR1cmU7Ci0JfQotCi0JcHVibGljIFBpY3RvZ3JhbUVsZW1lbnQgYWRkKGZpbmFsIElBZGRDb250ZXh0IGNvbnRleHQpIHsKLQkJT2JqZWN0IG8gPSBjb250ZXh0LmdldE5ld09iamVjdCgpOwotCQlpZiAoIShvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmaW5hbCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBuZXdBdHRyID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSBvOwotLy8JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChnZXRGZWF0dXJlUHJvdmlkZXIoKSwgKEphdmFQZXJzaXN0ZW50VHlwZSluZXdBdHRyLmdldFBhcmVudCgpKTsKLQotCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5wdXRLZXlUb0J1c2luZXNzT2JqZWN0KGdldEZlYXR1cmVQcm92aWRlcigpLmdldEtleUZvckJ1c2luZXNzT2JqZWN0KG5ld0F0dHIpLCBuZXdBdHRyKTsKLQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChuZXdBdHRyKTsgCi0JCWlmIChwZSAhPSBudWxsKSAKLQkJCXJldHVybiBwZTsKLQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihjb250ZXh0LmdldFRhcmdldENvbnRhaW5lcigpKTsKLQkJZmluYWwgV3JwIHdycCA9IG5ldyBXcnAoKTsKLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJQ29udGFpbmVyU2hhcGUgdGV4dFNoYXBlID0gZ3JhcGhpY2FsQWRkKGNvbnRleHQuZ2V0VGFyZ2V0Q29udGFpbmVyKCksIG5ld0F0dHIpOwotCQkJCWV4cGFuZChuZXdBdHRyKTsKLQkJCQllbmFibGVEaXJlY3RBZnRlckFkZGluZyh0ZXh0U2hhcGUpOwotCQkJCXdycC5zZXRPYmoodGV4dFNoYXBlKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiAoUGljdG9ncmFtRWxlbWVudCl3cnAuZ2V0T2JqKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJQ29udGFpbmVyU2hhcGUgYXR0cmlidXRlU2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIGdldEZlYXR1cmVQcm92aWRlcigpLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChqcGEpOwotCi0JCUlDdXN0b21Db250ZXh0IGN1c3RvbUNvbnRleHQgPSBuZXcgQ3VzdG9tQ29udGV4dChuZXcgUGljdG9ncmFtRWxlbWVudFtdIHsgYXR0cmlidXRlU2hhcGUuZ2V0Q29udGFpbmVyKCkgfSk7Ci0JCWV4cGFuZENvbXBhcnRtZW50RmVhdHVyZS5leGVjdXRlKGN1c3RvbUNvbnRleHQpOwotCX0KLQotCXByaXZhdGUgQ29udGFpbmVyU2hhcGUgZ3JhcGhpY2FsQWRkKENvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlLCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBuZXdBdHRyKSB7Ci0JCUFkZENvbnRleHQgY29udGV4dCA9IG5ldyBBZGRDb250ZXh0KCk7Ci0JCWNvbnRleHQuc2V0TmV3T2JqZWN0KG5ld0F0dHIpOwotCQljb250ZXh0LnNldFRhcmdldENvbnRhaW5lcihlbnRpdHlTaGFwZSk7Ci0JCUNvbnRhaW5lclNoYXBlIHRleHRTaGFwZSA9IChDb250YWluZXJTaGFwZSkgZ3JhcGhpY2FsQWRkLmFkZChjb250ZXh0KTsKLQkJcmV0dXJuIHRleHRTaGFwZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5hYmxlRGlyZWN0QWZ0ZXJBZGRpbmcoQ29udGFpbmVyU2hhcGUgdGV4dFNoYXBlKSB7Ci0JCUdyYXBoaWNzQWxnb3JpdGhtIGdhID0gdGV4dFNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCWZpbmFsIEdyYXBoaWNzQWxnb3JpdGhtIGdyYXBoaWNzQWxnb3JpdGhtID0gZ2EuZ2V0R3JhcGhpY3NBbGdvcml0aG1DaGlsZHJlbigpLmdldCgwKTsKLQkJaWYgKGdyYXBoaWNzQWxnb3JpdGhtIGluc3RhbmNlb2YgVGV4dCkgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdyYXBoaWNzQWxnb3JpdGhtOwotCQkJSURpcmVjdEVkaXRpbmdJbmZvIGRpcmVjdEVkaXRpbmdJbmZvID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0RGlyZWN0RWRpdGluZ0luZm8oKTsKLQkJCWRpcmVjdEVkaXRpbmdJbmZvLnNldE1haW5QaWN0b2dyYW1FbGVtZW50KHRleHRTaGFwZSk7Ci0JCQlkaXJlY3RFZGl0aW5nSW5mby5zZXRQaWN0b2dyYW1FbGVtZW50KHRleHRTaGFwZSk7Ci0JCQlkaXJlY3RFZGl0aW5nSW5mby5zZXRHcmFwaGljc0FsZ29yaXRobSh0ZXh0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKSBzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5BZGQoSUFkZENvbnRleHQgY29udGV4dCkgewotCQlPYmplY3QgbyA9IGNvbnRleHQuZ2V0TmV3T2JqZWN0KCk7Ci0JCXJldHVybiBvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQWRkSW5oZXJpdGVkRW50aXR5RmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQWRkSW5oZXJpdGVkRW50aXR5RmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmNmMzg3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0FkZEluaGVyaXRlZEVudGl0eUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklBZGRDb25uZWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklBZGRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmltcGwuQWJzdHJhY3RBZGRGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbkRlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5GcmVlRm9ybUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnNlcnZpY2VzLkdyYXBoaXRpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckltYWdlQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JJbWFnZUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklzQVJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsSW1wbDsKLQotcHVibGljIGNsYXNzIEFkZEluaGVyaXRlZEVudGl0eUZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEFkZEZlYXR1cmUgewotCi0JcHJpdmF0ZSBJSlBBRWRpdG9ySW1hZ2VDcmVhdG9yIGltYWdlQ3JlYXRvcjsKLQkKLQlwdWJsaWMgQWRkSW5oZXJpdGVkRW50aXR5RmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXRoaXMoZnAsIG5ldyBKUEFFZGl0b3JJbWFnZUNyZWF0b3IoKSwgbmV3IEpQQUVkaXRvclV0aWxJbXBsKCkpOwotCX0KLQkKLQotCXB1YmxpYyBBZGRJbmhlcml0ZWRFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnAsCi0JCSAgSUpQQUVkaXRvckltYWdlQ3JlYXRvciBpbWFnZUNyZWF0b3IsIAotCQkgIElKUEFFZGl0b3JVdGlsIGpwYUVkaXRvclV0aWwpIHsKLQkJc3VwZXIoZnApOwotCQl0aGlzLmltYWdlQ3JlYXRvciA9IGltYWdlQ3JlYXRvcjsKLQl9Ci0JCi0JCi0JcHVibGljIGJvb2xlYW4gY2FuQWRkKElBZGRDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFBpY3RvZ3JhbUVsZW1lbnQgYWRkKElBZGRDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgZmluYWwgSUFkZENvbm5lY3Rpb25Db250ZXh0IGFkZENvbkNvbnRleHQgPSAoSUFkZENvbm5lY3Rpb25Db250ZXh0KSBjb250ZXh0OwotCQlmaW5hbCBJc0FSZWxhdGlvbiByZWxhdGlvbiA9IChJc0FSZWxhdGlvbiljb250ZXh0LmdldE5ld09iamVjdCgpOwotCQlmaW5hbCBEaWFncmFtIGRpYWdyYW0gPSBnZXREaWFncmFtKCk7Ci0JCUZyZWVGb3JtQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gY3JlYXRlSXNBQ29ubmVjdGlvbihhZGRDb25Db250ZXh0LCByZWxhdGlvbiwgZGlhZ3JhbSk7Ci0JCWltYWdlQ3JlYXRvci5jcmVhdGVJc0FDb25uZWN0aW9uTGluZShkaWFncmFtLCBjb25uZWN0aW9uKTsKLQkJbGF5b3V0UGljdG9ncmFtRWxlbWVudChjb25uZWN0aW9uKTsKLQkJcmV0dXJuIGNvbm5lY3Rpb247CQotCX0KLQkKLQlwcml2YXRlIEZyZWVGb3JtQ29ubmVjdGlvbiBjcmVhdGVJc0FDb25uZWN0aW9uKElBZGRDb25uZWN0aW9uQ29udGV4dCBhZGRDb25Db250ZXh0LCBJc0FSZWxhdGlvbiByZWxhdGlvbiwKLQkJCWZpbmFsIERpYWdyYW0gZGlhZ3JhbSkgewotCQlGcmVlRm9ybUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldFBlU2VydmljZSgpLmNyZWF0ZUZyZWVGb3JtQ29ubmVjdGlvbihkaWFncmFtKTsKLSAgICAgICAgY29ubmVjdGlvbi5zZXRTdGFydChhZGRDb25Db250ZXh0LmdldFNvdXJjZUFuY2hvcigpKTsKLSAgICAgICAgY29ubmVjdGlvbi5zZXRFbmQoYWRkQ29uQ29udGV4dC5nZXRUYXJnZXRBbmNob3IoKSk7Ci0gICAgICAgIGNvbm5lY3Rpb24uc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgY29ubmVjdGlvbi5zZXRBY3RpdmUodHJ1ZSk7Ci0gICAgICAgIGdldEZlYXR1cmVQcm92aWRlcigpLmdldFBlU2VydmljZVV0aWwoKS5zZXRQcm9wZXJ0eVZhbHVlKGNvbm5lY3Rpb24sIElzQVJlbGF0aW9uLklTX0FfQ09OTkVDVElPTl9QUk9QX0tFWSwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotICAgICAgICBhZGREZWNvcmF0b3JzKGNvbm5lY3Rpb24pOwotCQlyZXR1cm4gY29ubmVjdGlvbjsKLQl9Ci0JCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGREZWNvcmF0b3JzKEZyZWVGb3JtQ29ubmVjdGlvbiBjKSB7Ci0JCUNvbm5lY3Rpb25EZWNvcmF0b3IgZCA9IGltYWdlQ3JlYXRvci5jcmVhdGVBcnJvd0Nvbm5lY3Rpb25EZWNvcmF0b3IoYywgMC45OTk5LCB0cnVlKTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb24oZC5nZXRHcmFwaGljc0FsZ29yaXRobSgpLCAwLCAwKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9BZGRKUEFFbnRpdHlGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9BZGRKUEFFbnRpdHlGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNDA3NTMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQWRkSlBBRW50aXR5RmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQWRkQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5pbXBsLkFic3RyYWN0QWRkU2hhcGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5Qb2x5bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlJvdW5kZWRSZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuc3R5bGVzLkxpbmVTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5PcmllbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51dGlsLklDb2xvckNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLk1vZGVsSW50ZWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklBZGRFbnRpdHlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9ySW1hZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkdyYXBoaWNzVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50cy5TaGFwZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JQcmVkZWZpbmVkQ29sb3JlZEFyZWFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncyh7ICJyZXN0cmljdGlvbiIgfSkKLXB1YmxpYyBjbGFzcyBBZGRKUEFFbnRpdHlGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RBZGRTaGFwZUZlYXR1cmUgewotCi0JcHJpdmF0ZSBJUGVVdGlsRmFjYWRlIGZhY2FkZTsKLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkUmVhcnJhbmdlSXNBUmVsYXRpb25zID0gdHJ1ZTsKLQlwcml2YXRlIHN0YXRpYyBDb250YWluZXJTaGFwZSBwcmltYXJ5U2hhcGU7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29udGFpbmVyU2hhcGUgcmVsYXRpb25TaGFwZTsKLQlwcml2YXRlIHN0YXRpYyBDb250YWluZXJTaGFwZSBiYXNpY1NoYXBlOwotCi0KLQlwdWJsaWMgQWRkSlBBRW50aXR5RmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwLCBib29sZWFuIHNob3VsZFJlYXJyYW5nZUlzQVJlbGF0aW9ucykgewotCQlzdXBlcihmcCk7Ci0JCXRoaXMuc2hvdWxkUmVhcnJhbmdlSXNBUmVsYXRpb25zID0gc2hvdWxkUmVhcnJhbmdlSXNBUmVsYXRpb25zOwotCQlmYWNhZGUgPSBuZXcgUGVVdGlsRmFjYWRlKCk7Ci0JfQotCi0JcHVibGljIEFkZEpQQUVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCwgSVBlVXRpbEZhY2FkZSBmYWNhZGUpIHsKLQkJc3VwZXIoZnApOwotCQl0aGlzLmZhY2FkZSA9IGZhY2FkZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5BZGQoSUFkZENvbnRleHQgY29udGV4dCkgewotCQlPYmplY3QgbmV3T2JqID0gY29udGV4dC5nZXROZXdPYmplY3QoKTsKLQotCQlpZiAobmV3T2JqIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSB7Ci0JCQlpZiAoY29udGV4dC5nZXRUYXJnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgbmV3T2JqOwotCQkJCXJldHVybiBjaGVja0pQVEZvckFkZGluZyhqcHQpOwotCQkJfQotCQl9IGVsc2UgaWYgKG5ld09iaiBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsKLQkJCWlmIChjb250ZXh0LmdldFRhcmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSAoSUNvbXBpbGF0aW9uVW5pdCkgbmV3T2JqOwotCQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBKUEFFZGl0b3JVdGlsLmdldEpQVHlwZShjdSk7Ci0JCQkJcmV0dXJuIGNoZWNrSlBURm9yQWRkaW5nKGpwdCk7Ci0JCQl9Ci0JCX0gaWYgKG5ld09iaiBpbnN0YW5jZW9mIFNvdXJjZVR5cGUpIHsKLQkJCWlmIChjb250ZXh0LmdldFRhcmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSAoKFNvdXJjZVR5cGUpbmV3T2JqKS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gSlBBRWRpdG9yVXRpbC5nZXRKUFR5cGUoY3UpOwotCQkJCXJldHVybiBjaGVja0pQVEZvckFkZGluZyhqcHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tKUFRGb3JBZGRpbmcoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlpZiAoanB0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJUGljdG9ncmFtRWxlbWVudFtdIHBpY3RvZ3JhbXMgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKQotCQkJCS5nZXRBbGxQaWN0b2dyYW1FbGVtZW50c0ZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0JCUpwYVByb2plY3QgcHJvaiA9IE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldFByb2plY3RCeURpYWdyYW0oZ2V0RGlhZ3JhbSgpLmdldE5hbWUoKSk7Ci0JCWlmIChwcm9qICE9IG51bGwpCi0JCQlpZiAocHJvaiAhPSBqcHQuZ2V0SnBhUHJvamVjdCgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIChwaWN0b2dyYW1zID09IG51bGwpIHx8IChwaWN0b2dyYW1zLmxlbmd0aCA9PSAwKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcikgc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfQotCi0JcHVibGljIFBpY3RvZ3JhbUVsZW1lbnQgYWRkKElBZGRDb250ZXh0IGNvbnRleHQpIHsKLQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCA9IGdldEZlYXR1cmVQcm92aWRlcigpOwotCQlPYmplY3QgbmV3T2JqID0gY29udGV4dC5nZXROZXdPYmplY3QoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IG51bGw7Ci0JCWlmIChuZXdPYmogaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLQkJCWpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIG5ld09iajsKLQkJfSBlbHNlIGlmIChuZXdPYmogaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gKElDb21waWxhdGlvblVuaXQpIG5ld09iajsKLQkJCWpwdCA9IEpQQUVkaXRvclV0aWwuZ2V0SlBUeXBlKGN1KTsKLQotCQl9IGVsc2UgaWYgKG5ld09iaiBpbnN0YW5jZW9mIFNvdXJjZVR5cGUpIHsKLQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSAoKFNvdXJjZVR5cGUpbmV3T2JqKS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCWpwdCA9IEpQQUVkaXRvclV0aWwuZ2V0SlBUeXBlKGN1KTsKLQkJfQotCQlmaW5hbCBEaWFncmFtIHRhcmdldERpYWdyYW0gPSAoRGlhZ3JhbSkgY29udGV4dC5nZXRUYXJnZXRDb250YWluZXIoKTsKLQkJCQkKLQkgICAgQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUgPSBmYWNhZGUuY3JlYXRlQ29udGFpbmVyU2hhcGUodGFyZ2V0RGlhZ3JhbSwgdHJ1ZSk7Ci0JCQotCSAgICBKUEFFZGl0b3JDb25zdGFudHMuRElBR1JBTV9PQkpFQ1RfVFlQRSBkb3QgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5kZXRlcm1pbmVEaWFncmFtT2JqZWN0VHlwZShqcHQpOwotCQljcmVhdGVFbnRpdHlSZWN0YW5nbGUoY29udGV4dCwgZW50aXR5U2hhcGUsIGRvdCwKLQkJCQkJCQkgIHRoaXMuZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW0oKSk7Ci0JCWxpbmsoZW50aXR5U2hhcGUsIGpwdCk7Ci0JCVNoYXBlIHNoYXBlID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuY3JlYXRlU2hhcGUoZW50aXR5U2hhcGUsIGZhbHNlKTsKLQkJUG9seWxpbmUgaGVhZGVyQm90dG9tTGluZSA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZVBvbHlsaW5lKHNoYXBlLCBuZXcgaW50W10geyAwLAotCQkJCTMwLCBKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX1dJRFRILCAzMCB9KTsKLQkJaGVhZGVyQm90dG9tTGluZQotCQkJCS5zZXRGb3JlZ3JvdW5kKG1hbmFnZUNvbG9yKEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfQk9SREVSX0NPTE9SKSk7Ci0JCWhlYWRlckJvdHRvbUxpbmUuc2V0TGluZVdpZHRoKEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfQk9SREVSX1dJRFRIKTsKLQotCQlhZGRIZWFkZXIoanB0LCBlbnRpdHlTaGFwZSwgSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9XSURUSCwgZG90KTsKLQkJCi0JCWNyZWF0ZUNvbXBhcnRtZW50cyhjb250ZXh0LCBqcHQsIGVudGl0eVNoYXBlKTsKLQkJZmlsbENvbXBhcnRtZW50cyhqcHQsZW50aXR5U2hhcGUpOwotCQkKLQkJU3RyaW5nIGtleSA9IGZwLmdldEtleUZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0JCWlmIChmcC5nZXRCdXNpbmVzc09iamVjdEZvcktleShrZXkpID09IG51bGwpCi0JCQlmcC5wdXRLZXlUb0J1c2luZXNzT2JqZWN0KGtleSwganB0KTsKLQotCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVDaG9wYm94QW5jaG9yKGVudGl0eVNoYXBlKTsKLQkJZW50aXR5U2hhcGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJbGF5b3V0UGljdG9ncmFtRWxlbWVudChlbnRpdHlTaGFwZSk7Ci0KLQkJVXBkYXRlQXR0cmlidXRlRmVhdHVyZSB1cGRhdGVGZWF0dXJlID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUoZnApOwotCQl1cGRhdGVGZWF0dXJlLnJlY29ubmVjdChqcHQpOwotCQlpZiAoc2hvdWxkUmVhcnJhbmdlSXNBUmVsYXRpb25zKQotCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVhcnJhbmdlSXNBUmVsYXRpb25zKGdldEZlYXR1cmVQcm92aWRlcigpKTsJCi0JCXJldHVybiBlbnRpdHlTaGFwZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbXBhcnRtZW50cyhJQWRkQ29udGV4dCBjb250ZXh0LCBKYXZhUGVyc2lzdGVudFR5cGUganB0LAotCQkJQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUpIHsKLQkJSlBBRWRpdG9yQ29uc3RhbnRzLkRJQUdSQU1fT0JKRUNUX1RZUEUgZG90ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZGV0ZXJtaW5lRGlhZ3JhbU9iamVjdFR5cGUoanB0KTsKLQkJcHJpbWFyeVNoYXBlID0gY3JlYXRlQ29tcGFydG1lbnRSZWN0YW5nbGUoZW50aXR5U2hhcGUsIAotCQkJCQkJCQkJCQkJICBKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX01JTl9IRUlHSFQsIAotCQkJCQkJCQkJCQkJICBKUEFFZGl0b3JNZXNzYWdlcy5BZGRKUEFFbnRpdHlGZWF0dXJlX3ByaW1hcnlLZXlzU2hhcGUsCi0JCQkJCQkJCQkJCQkgIGRvdCk7Ci0JCXJlbGF0aW9uU2hhcGUgPSBjcmVhdGVDb21wYXJ0bWVudFJlY3RhbmdsZShlbnRpdHlTaGFwZSwgCi0JCQkJCQkJCQkJCQkgICBHcmFwaGljc1VwZGF0ZXIuZ2V0TmV4dENvbXBhcnRtZW50WShwcmltYXJ5U2hhcGUpICsgSlBBRWRpdG9yQ29uc3RhbnRzLlNFUEFSQVRPUl9IRUlHSFQsCi0JCQkJCQkJCQkJCQkgICBKUEFFZGl0b3JNZXNzYWdlcy5BZGRKUEFFbnRpdHlGZWF0dXJlX3JlbGF0aW9uQXR0cmlidXRlc1NoYXBlcywKLQkJCQkJCQkJCQkJCSAgIGRvdCk7Ci0JCWJhc2ljU2hhcGUgPSBjcmVhdGVDb21wYXJ0bWVudFJlY3RhbmdsZShlbnRpdHlTaGFwZSwgCi0JCQkJCQkJCQkJCQlHcmFwaGljc1VwZGF0ZXIuZ2V0TmV4dENvbXBhcnRtZW50WShyZWxhdGlvblNoYXBlKSArIEpQQUVkaXRvckNvbnN0YW50cy5TRVBBUkFUT1JfSEVJR0hULCAKLQkJCQkJCQkJCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkFkZEpQQUVudGl0eUZlYXR1cmVfYmFzaWNBdHRyaWJ1dGVzU2hhcGVzLAotCQkJCQkJCQkJCQkJZG90KTsKLQkJaWYgKElBZGRFbnRpdHlDb250ZXh0LmNsYXNzLmlzSW5zdGFuY2UoY29udGV4dCkpIHsKLQkJCUlBZGRFbnRpdHlDb250ZXh0IGVudGl0eUNvbnRleHQgPSAoSUFkZEVudGl0eUNvbnRleHQpIGNvbnRleHQ7Ci0JCQlHcmFwaGljc1VwZGF0ZXIuc2V0Q29sbGFwc2VkKHByaW1hcnlTaGFwZSwgZW50aXR5Q29udGV4dC5pc1ByaW1hcnlDb2xsYXBzZWQoKSk7Ci0JCQlHcmFwaGljc1VwZGF0ZXIuc2V0Q29sbGFwc2VkKGJhc2ljU2hhcGUsIGVudGl0eUNvbnRleHQuaXNCYXNpY0NvbGxhcHNlZCgpKTsKLQkJCUdyYXBoaWNzVXBkYXRlci5zZXRDb2xsYXBzZWQocmVsYXRpb25TaGFwZSwgZW50aXR5Q29udGV4dC5pc1JlbGF0aW9uQ29sbGFwc2VkKCkpOwotCQl9IGVsc2UgewotCQkJR3JhcGhpY3NVcGRhdGVyLnNldENvbGxhcHNlZChwcmltYXJ5U2hhcGUsIGZhbHNlKTsKLQkJCUdyYXBoaWNzVXBkYXRlci5zZXRDb2xsYXBzZWQoYmFzaWNTaGFwZSwgZmFsc2UpOwotCQkJR3JhcGhpY3NVcGRhdGVyLnNldENvbGxhcHNlZChyZWxhdGlvblNoYXBlLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlsbENvbXBhcnRtZW50cyhKYXZhUGVyc2lzdGVudFR5cGUganB0LCBDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSkgewotCQlTdHJpbmdbXSBwcmltYXJ5S2V5QW5ub3RhdGlvbnMgPSBuZXcgU3RyaW5nW10ge0pQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX0lELCBKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9FTUJFRERFRF9JRH07Ci0JCWZvcihTdHJpbmcgYW5ub3RhdGlvbiA6IHByaW1hcnlLZXlBbm5vdGF0aW9ucyl7Ci0JCQlhZGRDb21wYXJ0bWVudENoaWxkcmVuKHByaW1hcnlTaGFwZSwganB0LCBhbm5vdGF0aW9uKTsKLQkJfQotCQlTdHJpbmdbXSByZWxhdGlvbkFubm90YXRpb25zID0gbmV3IFN0cmluZ1tdIHtKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX01BTlksIAotCQkJCUpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX01BTllfVE9fT05FLCBKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fTUFOWSwKLQkJCQlKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fT05FfTsKLQkgICAgZm9yKFN0cmluZyBhbm5vdGF0aW9uIDogcmVsYXRpb25Bbm5vdGF0aW9ucyl7Ci0JCSAgIGFkZENvbXBhcnRtZW50Q2hpbGRyZW4ocmVsYXRpb25TaGFwZSwganB0LCBhbm5vdGF0aW9uKTsKLQkgICAgfQotICAgICAgICBhZGRCYXNpY0F0dHJpYnV0ZXMoYmFzaWNTaGFwZSwganB0KTsKLSAgICAgICAgR3JhcGhpY3NVcGRhdGVyLnVwZGF0ZUVudGl0eVNoYXBlKGVudGl0eVNoYXBlKTsKLQl9Ci0KLQlwcml2YXRlIENvbnRhaW5lclNoYXBlIGNyZWF0ZUNvbXBhcnRtZW50UmVjdGFuZ2xlKAotCQkJQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUsIGludCB5LCBTdHJpbmcgYXR0cmliVHh0LAotCQkJSlBBRWRpdG9yQ29uc3RhbnRzLkRJQUdSQU1fT0JKRUNUX1RZUEUgZG90KSB7Ci0JCWludCB3aWR0aCA9IGVudGl0eVNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0V2lkdGgoKTsKLQkJQ29udGFpbmVyU2hhcGUgY29udGFpbmVyU2hhcGUgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVDb250YWluZXJTaGFwZSgKLQkJCQllbnRpdHlTaGFwZSwgZmFsc2UpOwotCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5zZXRQcm9wZXJ0eVZhbHVlKGNvbnRhaW5lclNoYXBlLAotCQkJCUpQQUVkaXRvckNvbnN0YW50cy5QUk9QX1NIQVBFX1RZUEUsIFNoYXBlVHlwZS5DT01QQVJUTUVOVAotCQkJCQkJLnRvU3RyaW5nKCkpOwotCQlSZWN0YW5nbGUgcmVjdCA9IGFkZENvbXBhcnRtZW50UmVjdGFuZ2xlKHksIHdpZHRoLCBjb250YWluZXJTaGFwZSk7Ci0JCQotCQlhZGRDb21wYXJ0bWVudEhlYWRlclRleHQoYXR0cmliVHh0LCB3aWR0aCwgcmVjdCk7Ci0JCQotCQlVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlIHVwZGF0ZUZlYXR1cmUgPSBuZXcgVXBkYXRlQXR0cmlidXRlRmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQotCQl1cGRhdGVGZWF0dXJlLmFkZFNlcGFyYXRvcnNUb1NoYXBlKGNvbnRhaW5lclNoYXBlLCBkb3QpOwotCQkKLQkJcmV0dXJuIGNvbnRhaW5lclNoYXBlOwotCX0KLQotCXByaXZhdGUgUmVjdGFuZ2xlIGFkZENvbXBhcnRtZW50UmVjdGFuZ2xlKGludCB5LCBpbnQgd2lkdGgsCi0JCQlDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSkgewotCQlSZWN0YW5nbGUgcmVjdCA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZVJlY3RhbmdsZShjb250YWluZXJTaGFwZSk7Ci0JCXJlY3Quc2V0RmlsbGVkKGZhbHNlKTsKLQkJcmVjdC5zZXRMaW5lVmlzaWJsZShmYWxzZSk7Ci0JCXJlY3Quc2V0SGVpZ2h0KDApOwotCQlyZWN0LnNldFdpZHRoKHdpZHRoKTsKLQkJcmVjdC5zZXRYKDApOwotCQlyZWN0LnNldFkoeSk7Ci0JCWNvbnRhaW5lclNoYXBlLnNldEFjdGl2ZSh0cnVlKTsKLQkJcmV0dXJuIHJlY3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENvbXBhcnRtZW50SGVhZGVyVGV4dChTdHJpbmcgYXR0cmliVHh0LCBpbnQgd2lkdGgsCi0JCQlSZWN0YW5nbGUgcmVjdCkgewotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JCVRleHQgdGV4dCA9IFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUuYWRkVGV4dChmcCwgcmVjdCwgYXR0cmliVHh0KTsKLQkJdGV4dC5nZXRGb250KCkuc2V0U2l6ZSg3KTsKLQkJdGV4dC5nZXRGb250KCkuc2V0SXRhbGljKHRydWUpOwotCQl0ZXh0LmdldEZvbnQoKS5zZXRCb2xkKGZhbHNlKTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0V2lkdGgodGV4dCwgd2lkdGgpOwotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbkFuZFNpemUodGV4dCwgMCwgMiwgd2lkdGgsCi0JCQkJMTMpOwotCQl0ZXh0LnNldEhvcml6b250YWxBbGlnbm1lbnQoT3JpZW50YXRpb24uQUxJR05NRU5UX0NFTlRFUik7Ci0JCXRleHQuc2V0VmVydGljYWxBbGlnbm1lbnQoT3JpZW50YXRpb24uQUxJR05NRU5UX0NFTlRFUik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENvbXBhcnRtZW50Q2hpbGRyZW4oCi0JCQlDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwKLQkJCVN0cmluZyBhdHRyaWJ1dGVBbm5vdGF0aW9ucykgewotCQlMaXN0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQotCQlmb3IgKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA6IGpwdC5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCUhhc2hTZXQ8U3RyaW5nPiBhbm5vdGF0aW9ucyA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEFubm90YXRpb25OYW1lcyhhdHRyaWJ1dGUpOwotCQkJaWYgKGFubm90YXRpb25zLmNvbnRhaW5zKGF0dHJpYnV0ZUFubm90YXRpb25zKSkgewotCQkJCWF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQkJYWRkQXR0cmlidXRlcyhjb250YWluZXJTaGFwZSwgYXR0cmlidXRlcyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRCYXNpY0F0dHJpYnV0ZXMoQ29udGFpbmVyU2hhcGUgY29udGFpbmVyU2hhcGUsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpewotCQlMaXN0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJCi0JCWZvciAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlIDoganB0LmdldEF0dHJpYnV0ZXMoKSl7Ci0JCQlIYXNoU2V0PFN0cmluZz4gYW5ub3RhdGlvbnMgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uTmFtZXMoYXR0cmlidXRlKTsKLQkJCWlmKCEoYW5ub3RhdGlvbnMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fSUQpKSYmICEoYW5ub3RhdGlvbnMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fRU1CRURERURfSUQpKSAmJiAhKGFubm90YXRpb25zLmNvbnRhaW5zKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX01BTllfVE9fTUFOWSkpICYmIAotCQkJCQkhKGFubm90YXRpb25zLmNvbnRhaW5zKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX01BTllfVE9fT05FKSkgJiYgIShhbm5vdGF0aW9ucy5jb250YWlucyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fTUFOWSkpJiYKLQkJCQkJIShhbm5vdGF0aW9ucy5jb250YWlucyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fT05FKSkgfHwgYW5ub3RhdGlvbnMuaXNFbXB0eSgpKXsKLQkJCQlhdHRyaWJ1dGVzLmFkZChhdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JCWFkZEF0dHJpYnV0ZXMoY29udGFpbmVyU2hhcGUsIGF0dHJpYnV0ZXMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkQXR0cmlidXRlcyhDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSwKLQkJCUxpc3Q8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEgPSBhdHRyaWJ1dGVzLmdldChpKTsKLQkJCWFkZEF0dHJpYnV0ZShqcGEsIGVudGl0eVNoYXBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnRlcmZhY2UgSVBlVXRpbEZhY2FkZSB7Ci0JCXB1YmxpYyBDb250YWluZXJTaGFwZSBjcmVhdGVDb250YWluZXJTaGFwZShEaWFncmFtIGRpYWdyYW0sIGJvb2xlYW4gYik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSb3VuZGVkUmVjdGFuZ2xlIGNyZWF0ZUVudGl0eVJlY3RhbmdsZShJQWRkQ29udGV4dCBjb250ZXh0LAotCQkJCQkJCQkJCQkJCQkgQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUsIAotCQkJCQkJCQkJCQkJCQkgSlBBRWRpdG9yQ29uc3RhbnRzLkRJQUdSQU1fT0JKRUNUX1RZUEUgZG90LCAgCi0JCQkJCQkJCQkJCQkJCSBEaWFncmFtIGRpYWdyYW0pIHsKLQotCQlJQ29sb3JDb25zdGFudCBmb3JlZ3JvdW5kID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Rm9yZWdyb3VuZChkb3QpOwotCQlJQ29sb3JDb25zdGFudCBiYWNrZ3JvdW5kID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0QmFja2dyb3VuZChkb3QpOwotCQlTdHJpbmcgcmVuZGVyaW5nU3R5bGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRSZW5kZXJpbmdTdHlsZShkb3QpOwotCQkKLQkJUm91bmRlZFJlY3RhbmdsZSBlbnRpdHlSZWN0YW5nbGUgPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVSb3VuZGVkUmVjdGFuZ2xlKAotCQkJCWVudGl0eVNoYXBlLCBKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX0NPUk5FUl9XSURUSCwKLQkJCQlKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX0NPUk5FUl9IRUlHSFQpOwotCQllbnRpdHlSZWN0YW5nbGUKLQkJCQkuc2V0Rm9yZWdyb3VuZChHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5tYW5hZ2VDb2xvcihkaWFncmFtLCBmb3JlZ3JvdW5kKSk7Ci0JCWVudGl0eVJlY3RhbmdsZQotCQkJCS5zZXRCYWNrZ3JvdW5kKEdyYXBoaXRpLmdldEdhU2VydmljZSgpLm1hbmFnZUNvbG9yKGRpYWdyYW0sIGJhY2tncm91bmQpKTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0UmVuZGVyaW5nU3R5bGUoZW50aXR5UmVjdGFuZ2xlLmdldFBpY3RvZ3JhbUVsZW1lbnQoKS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLCAKLQkJCQlKUEFFZGl0b3JQcmVkZWZpbmVkQ29sb3JlZEFyZWFzLmdldEFkYXB0ZWRHcmFkaWVudENvbG9yZWRBcmVhcyhyZW5kZXJpbmdTdHlsZSkpOwotCQllbnRpdHlSZWN0YW5nbGUuc2V0TGluZVdpZHRoKEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfQk9SREVSX1dJRFRIKTsKLQkJZW50aXR5UmVjdGFuZ2xlLnNldExpbmVTdHlsZShMaW5lU3R5bGUuU09MSUQpOwotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbkFuZFNpemUoZW50aXR5UmVjdGFuZ2xlLCBjb250ZXh0Ci0JCQkJLmdldFgoKSwgY29udGV4dC5nZXRZKCksCi0JCQkJKGNvbnRleHQuZ2V0V2lkdGgoKSA9PSAtMSkgPyBKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX1dJRFRICi0JCQkJCQk6IGNvbnRleHQuZ2V0V2lkdGgoKSwKLQkJCQkoY29udGV4dC5nZXRIZWlnaHQoKSA9PSAtMSkgPyBKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX0hFSUdIVAotCQkJCQkJOiBjb250ZXh0LmdldEhlaWdodCgpKTsKLQkJcmV0dXJuIGVudGl0eVJlY3RhbmdsZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQZVV0aWxGYWNhZGUgaW1wbGVtZW50cyBJUGVVdGlsRmFjYWRlIHsKLQkJcHVibGljIENvbnRhaW5lclNoYXBlIGNyZWF0ZUNvbnRhaW5lclNoYXBlKERpYWdyYW0gZGlhZ3JhbSwgYm9vbGVhbiBiKSB7Ci0JCQlyZXR1cm4gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuY3JlYXRlQ29udGFpbmVyU2hhcGUoZGlhZ3JhbSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbnRhaW5lclNoYXBlIGFkZEhlYWRlcihKYXZhUGVyc2lzdGVudFR5cGUgYWRkZWRXcmFwcGVyLAotCQkJCQkJCQkJIENvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlLCAKLQkJCQkJCQkJCSBpbnQgd2lkdGgsCi0JCQkJCQkJCQkgSlBBRWRpdG9yQ29uc3RhbnRzLkRJQUdSQU1fT0JKRUNUX1RZUEUgZG90KSB7Ci0JCVN0cmluZyBlbnRpdHlJY29uSWQgPSBkb3QuZXF1YWxzKEpQQUVkaXRvckNvbnN0YW50cy5ESUFHUkFNX09CSkVDVF9UWVBFLkVudGl0eSkgPyAKLQkJCQkJCQkJCUpQQUVkaXRvckltYWdlUHJvdmlkZXIuSlBBX0VOVElUWSA6Ci0JCQkJCQkJCQlKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLk1BUFBFRF9TVVBFUkNMQVNTOwotCQkKLQkJQ29udGFpbmVyU2hhcGUgaGVhZGVySWNvblNoYXBlID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuY3JlYXRlQ29udGFpbmVyU2hhcGUoCi0JCQkJZW50aXR5U2hhcGUsIGZhbHNlKTsKLQkJUmVjdGFuZ2xlIGljb25SZWN0ID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlUmVjdGFuZ2xlKGhlYWRlckljb25TaGFwZSk7Ci0JCWljb25SZWN0LnNldEZpbGxlZChmYWxzZSk7Ci0JCWljb25SZWN0LnNldExpbmVWaXNpYmxlKGZhbHNlKTsKLQkJaWNvblJlY3Quc2V0SGVpZ2h0KEpQQUVkaXRvckNvbnN0YW50cy5JQ09OX1JFQ1RfSEVJR0hUKTsKLQkJaWNvblJlY3Quc2V0WCgwKTsKLQkJaWNvblJlY3Quc2V0V2lkdGgoSlBBRWRpdG9yQ29uc3RhbnRzLkhFQURFUl9JQ09OX1JFQ1RfV0lEVEgpOwotCQlpY29uUmVjdC5zZXRIZWlnaHQoSlBBRWRpdG9yQ29uc3RhbnRzLkhFQURFUl9JQ09OX1JFQ1RfSEVJR0hUKTsKLQkJaWNvblJlY3Quc2V0WSgwKTsKLQkJSW1hZ2UgaGVhZGVySWNvbiA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZUltYWdlKGljb25SZWN0LAotCQkJCWVudGl0eUljb25JZCk7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldExvY2F0aW9uQW5kU2l6ZShoZWFkZXJJY29uLCAKLQkJCQkJCQkJCQkJCQlKUEFFZGl0b3JDb25zdGFudHMuSUNPTl9IRUFERVJfWCwKLQkJCQkJCQkJCQkJCQlKUEFFZGl0b3JDb25zdGFudHMuSUNPTl9IRUFERVJfWSwKLQkJCQkJCQkJCQkJCQlKUEFFZGl0b3JDb25zdGFudHMuSUNPTl9XSURUSCwgCi0JCQkJCQkJCQkJCQkJSlBBRWRpdG9yQ29uc3RhbnRzLklDT05fSEVJR0hUKTsKLQkJR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuc2V0UHJvcGVydHlWYWx1ZShoZWFkZXJJY29uU2hhcGUsCi0JCQkJSlBBRWRpdG9yQ29uc3RhbnRzLlBST1BfU0hBUEVfVFlQRSwgU2hhcGVUeXBlLklDT04udG9TdHJpbmcoKSk7Ci0KLQkJQ29udGFpbmVyU2hhcGUgZW50aXR5SGVhZGVyVGV4dFNoYXBlID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuY3JlYXRlQ29udGFpbmVyU2hhcGUoZW50aXR5U2hhcGUsIGZhbHNlKTsKLQkJR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkKLQkJCQkuc2V0UHJvcGVydHlWYWx1ZShlbnRpdHlIZWFkZXJUZXh0U2hhcGUsCi0JCQkJCQlKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9TSEFQRV9UWVBFLCBTaGFwZVR5cGUuSEVBREVSCi0JCQkJCQkJCS50b1N0cmluZygpKTsKLQkJUmVjdGFuZ2xlIGhlYWRlclJlY3QgPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVSZWN0YW5nbGUoZW50aXR5SGVhZGVyVGV4dFNoYXBlKTsKLQkJaGVhZGVyUmVjdC5zZXRGaWxsZWQoZmFsc2UpOwotCQloZWFkZXJSZWN0LnNldExpbmVWaXNpYmxlKGZhbHNlKTsKLQkJaGVhZGVyUmVjdC5zZXRXaWR0aCh3aWR0aCAtIEpQQUVkaXRvckNvbnN0YW50cy5IRUFERVJfVEVYVF9SRUNUX1dJRFRIX1JFRFVDRVIpOwotCQloZWFkZXJSZWN0LnNldEhlaWdodChKUEFFZGl0b3JDb25zdGFudHMuSEVBREVSX1RFWFRfUkVDVF9IRUlHSFQpOwotCQloZWFkZXJSZWN0LnNldFkoMik7Ci0JCWhlYWRlclJlY3Quc2V0WChKUEFFZGl0b3JDb25zdGFudHMuSEVBREVSX1RFWFRfUkVDVF9YKTsKLQotCQlTdHJpbmcgaGVhZGVyVGV4dFN0cmluZyA9IEpQQUVkaXRvclV0aWwuZ2V0VGV4dChhZGRlZFdyYXBwZXIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KGFkZGVkV3JhcHBlcik7Ci0JCUpQQUVkaXRvclV0aWwuYmVjb21lV29ya2luZ0NvcHkoY3UpOwotCQloZWFkZXJUZXh0U3RyaW5nID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGhlYWRlclRleHRTdHJpbmcpOyAKLQkJdHJ5IHsKLQkJCWlmIChjdS5oYXNVbnNhdmVkQ2hhbmdlcygpKSB7Ci0JCQkJaGVhZGVyVGV4dFN0cmluZyA9IEpQQUVkaXRvckNvbnN0YW50cy5IRUFERVJfUFJFRklYX0RJUlRZICsgaGVhZGVyVGV4dFN0cmluZzsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsgCi0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3QgY2hlY2sgY29tcGlsYXRpb24gdW5pdCBmb3IgdW5zYXZlZCBjaGFuZ2VzIiwgZSk7ICAvLyROT04tTkxTLTEkCQkgCi0JCX0KLQkJVGV4dCBoZWFkZXJUZXh0T2JqID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlRGVmYXVsdFRleHQoZ2V0RGlhZ3JhbSgpLCBoZWFkZXJSZWN0LAotCQkJCWhlYWRlclRleHRTdHJpbmcpOwotCQloZWFkZXJUZXh0T2JqCi0JCQkJLnNldEZvcmVncm91bmQobWFuYWdlQ29sb3IoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9URVhUX0ZPUkVHUk9VTkQpKTsKLQkJaGVhZGVyVGV4dE9iai5zZXRIb3Jpem9udGFsQWxpZ25tZW50KE9yaWVudGF0aW9uLkFMSUdOTUVOVF9MRUZUKTsKLQkJaGVhZGVyVGV4dE9iai5zZXRWZXJ0aWNhbEFsaWdubWVudChPcmllbnRhdGlvbi5BTElHTk1FTlRfVE9QKTsKLQkJaGVhZGVyVGV4dE9iai5nZXRGb250KCkuc2V0Qm9sZCh0cnVlKTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb25BbmRTaXplKGhlYWRlclRleHRPYmosIDEsIDIsCi0JCQkJd2lkdGgsIDIwKTsKLQotCQlyZXR1cm4gZW50aXR5SGVhZGVyVGV4dFNoYXBlOwotCi0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLQlwcml2YXRlIHZvaWQgYWRkQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhLAotCQkJQ29udGFpbmVyU2hhcGUgY29tcGFydG1lbnRTaGFwZSkgewotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JCWZwLnB1dEtleVRvQnVzaW5lc3NPYmplY3QoZnAuZ2V0S2V5Rm9yQnVzaW5lc3NPYmplY3QocGEpLCBwYSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKXBhLmdldFBhcmVudCgpOwotCQlTdHJpbmcga2V5ID0gZnAuZ2V0S2V5Rm9yQnVzaW5lc3NPYmplY3QoanB0KTsKLQkJaWYgKGZwLmdldEJ1c2luZXNzT2JqZWN0Rm9yS2V5KGtleSkgPT0gbnVsbCkKLQkJCWZwLnB1dEtleVRvQnVzaW5lc3NPYmplY3Qoa2V5LCBqcHQpOwotCQlVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlIHVwZGF0ZUZlYXR1cmUgPSBuZXcgVXBkYXRlQXR0cmlidXRlRmVhdHVyZShmcCk7Ci0gICAgICAgIHVwZGF0ZUZlYXR1cmUuYWRkQXR0cmlidXRlcyhjb21wYXJ0bWVudFNoYXBlLmdldENvbnRhaW5lcigpLCBwYSk7Ci0JCXVwZGF0ZUZlYXR1cmUgPSBudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0FkZFJlbGF0aW9uRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQWRkUmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NGI4NjUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQWRkUmVsYXRpb25GZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uLlJlbERpci5VTkk7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb24uUmVsVHlwZS5NQU5ZX1RPX01BTlk7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb24uUmVsVHlwZS5NQU5ZX1RPX09ORTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbi5SZWxUeXBlLk9ORV9UT19NQU5ZOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uLlJlbFR5cGUuT05FX1RPX09ORTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JQWRkQmVuZHBvaW50RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUFkZENvbm5lY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUFkZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkFkZEJlbmRwb2ludENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdEFkZEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkZyZWVGb3JtQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckltYWdlQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JJbWFnZUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uLlJlbERpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uLlJlbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLldycDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0KLQotcHVibGljIGNsYXNzIEFkZFJlbGF0aW9uRmVhdHVyZSBleHRlbmRzIEFic3RyYWN0QWRkRmVhdHVyZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIFNUQVJUX0NPRUZGSUNJRU5UID0gMC4xOwotCi0JcHJpdmF0ZSBJSlBBRWRpdG9ySW1hZ2VDcmVhdG9yIGltYWdlQ3JlYXRvcjsKLQlwcml2YXRlIElKUEFFZGl0b3JVdGlsIGpwYUVkaXRvclV0aWw7IAotCi0gICAgcHVibGljIEFkZFJlbGF0aW9uRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXRoaXMoZnAsIG5ldyBKUEFFZGl0b3JJbWFnZUNyZWF0b3IoKSwgbmV3IEpQQUVkaXRvclV0aWxJbXBsKCkpOwotCX0KLQotCXB1YmxpYyBBZGRSZWxhdGlvbkZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCwgCi0JCQkJCQkJICBJSlBBRWRpdG9ySW1hZ2VDcmVhdG9yIGltYWdlQ3JlYXRvciwgCi0JCQkJCQkJICBJSlBBRWRpdG9yVXRpbCBqcGFFZGl0b3JVdGlsKSB7Ci0gICAgICAgIHN1cGVyKGZwKTsKLQkJdGhpcy5pbWFnZUNyZWF0b3IgPSBpbWFnZUNyZWF0b3I7Ci0JCXRoaXMuanBhRWRpdG9yVXRpbCA9IGpwYUVkaXRvclV0aWw7Ci0gICAgfQotIAotICAgIHB1YmxpYyBQaWN0b2dyYW1FbGVtZW50IGFkZChJQWRkQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGZpbmFsIElBZGRDb25uZWN0aW9uQ29udGV4dCBhZGRDb25Db250ZXh0ID0gKElBZGRDb25uZWN0aW9uQ29udGV4dCkgY29udGV4dDsKLQkJZmluYWwgSVJlbGF0aW9uIHJlbGF0aW9uID0gKElSZWxhdGlvbikgY29udGV4dC5nZXROZXdPYmplY3QoKTsKLQkJZmluYWwgRGlhZ3JhbSBkaWFncmFtID0gZ2V0RGlhZ3JhbSgpOwotCQlmaW5hbCBXcnAgd3JwID0gbmV3IFdycCgpOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihkaWFncmFtKTsKLQkJUmVjb3JkaW5nQ29tbWFuZCByYyA9IG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCUZyZWVGb3JtQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gY3JlYXRlQ29ubmVjdGlvbihhZGRDb25Db250ZXh0LCByZWxhdGlvbiwgZGlhZ3JhbSk7Ci0JCQkJaW1hZ2VDcmVhdG9yLmNyZWF0ZUNvbm5lY3Rpb25MaW5lKGRpYWdyYW0sIGNvbm5lY3Rpb24pOwotCQkJCWdldEZlYXR1cmVQcm92aWRlcigpLnB1dEtleVRvQnVzaW5lc3NPYmplY3QocmVsYXRpb24uZ2V0SWQoKSwgcmVsYXRpb24pOwotCQkJCWxpbmsoY29ubmVjdGlvbiwgcmVsYXRpb24pOwotCQkJCWxheW91dFBpY3RvZ3JhbUVsZW1lbnQoY29ubmVjdGlvbik7Ci0JCQkJd3JwLnNldE9iaihjb25uZWN0aW9uKTsKLQkJCX0JCQkKLQkJfTsKLQkJdHJ5IHsKLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUocmMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQotCQl9Ci0JCQotCQlyZXR1cm4gKFBpY3RvZ3JhbUVsZW1lbnQpd3JwLmdldE9iaigpOwotICAgIH0KLSAgICAgICAgCi0JcHJpdmF0ZSBGcmVlRm9ybUNvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbihJQWRkQ29ubmVjdGlvbkNvbnRleHQgYWRkQ29uQ29udGV4dCwgSVJlbGF0aW9uIHJlbGF0aW9uLAotCQkJZmluYWwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0gICAgICAgIEZyZWVGb3JtQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0UGVTZXJ2aWNlVXRpbCgpLmNyZWF0ZUZyZWVGb3JtQ29ubmVjdGlvbihkaWFncmFtKTsKLSAgICAgICAgY29ubmVjdGlvbi5zZXRTdGFydChhZGRDb25Db250ZXh0LmdldFNvdXJjZUFuY2hvcigpKTsKLSAgICAgICAgY29ubmVjdGlvbi5zZXRFbmQoYWRkQ29uQ29udGV4dC5nZXRUYXJnZXRBbmNob3IoKSk7Ci0gICAgICAgIGNvbm5lY3Rpb24uc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgY29ubmVjdGlvbi5zZXRBY3RpdmUodHJ1ZSk7ICAgICAgICAKLSAgICAgICAgTGlzdDxQb2ludD4gcG9pbnRzID0ganBhRWRpdG9yVXRpbC5jcmVhdGVCZW5kUG9pbnRMaXN0KGNvbm5lY3Rpb24sIHJlbGF0aW9uLmdldE93bmVyKCkgPT0gcmVsYXRpb24uZ2V0SW52ZXJzZSgpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb2ludHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgCVBvaW50IHAgPSBwb2ludHMuZ2V0KGkpOwotICAgICAgICAJQWRkQmVuZHBvaW50Q29udGV4dCBjdHggPSBuZXcgQWRkQmVuZHBvaW50Q29udGV4dChjb25uZWN0aW9uLCBwLngsIHAueSwgaSk7Ci0gICAgICAgICAgICBJQWRkQmVuZHBvaW50RmVhdHVyZSBmdCA9Z2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QWRkQmVuZHBvaW50RmVhdHVyZShjdHgpOwotICAgICAgICAgICAgZnQuYWRkQmVuZHBvaW50KGN0eCk7Ci0gICAgICAgIH0JCQotICAgICAgICBhZGREZWNvcmF0b3JzKGNvbm5lY3Rpb24sIHJlbGF0aW9uKTsgCi0gICAgICAgIGFkZFRleHREZWNvcmF0b3JzKGNvbm5lY3Rpb24sIHJlbGF0aW9uKTsKLQkJcmV0dXJuIGNvbm5lY3Rpb247Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZERlY29yYXRvcnMoRnJlZUZvcm1Db25uZWN0aW9uIGNvbm5lY3Rpb24sIElSZWxhdGlvbiByZWxhdGlvbikgewotCQlSZWxEaXIgZGlyZWN0aW9uID0gcmVsYXRpb24uZ2V0UmVsRGlyKCk7Ci0JCVJlbFR5cGUgdHlwZSA9IHJlbGF0aW9uLmdldFJlbFR5cGUoKTsKLQkJaWYgKE9ORV9UT19PTkUuZXF1YWxzKHR5cGUpKSB7Ci0JCQlhZGRPbmVUb09uZURlY29yYXRvcihjb25uZWN0aW9uLCBkaXJlY3Rpb24sIHJlbGF0aW9uKTsKLQkJfSBlbHNlIGlmIChPTkVfVE9fTUFOWS5lcXVhbHModHlwZSkgJiYgVU5JLmVxdWFscyhkaXJlY3Rpb24pKSB7Ci0JCQlhZGRPbmVUb01hbnlEZWNvcmF0b3IoY29ubmVjdGlvbiwgcmVsYXRpb24pOwotCQl9IGVsc2UgaWYgKE1BTllfVE9fT05FLmVxdWFscyh0eXBlKSkgewotCQkJYWRkTWFueVRvT25lRGVjb3JhdG9yKGNvbm5lY3Rpb24sIGRpcmVjdGlvbiwgcmVsYXRpb24pOwotCQl9IGVsc2UgaWYgKE1BTllfVE9fTUFOWS5lcXVhbHModHlwZSkpIHsKLQkJCWFkZE1hbnlUb01hbnlEZWNvcmF0b3IoY29ubmVjdGlvbiwgZGlyZWN0aW9uLCByZWxhdGlvbik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFRleHREZWNvcmF0b3JzKEZyZWVGb3JtQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBJUmVsYXRpb24gcmVsYXRpb24pIHsKLQkJUmVsRGlyIGRpcmVjdGlvbiA9IHJlbGF0aW9uLmdldFJlbERpcigpOwotCQlSZWxUeXBlIHR5cGUgPSByZWxhdGlvbi5nZXRSZWxUeXBlKCk7Ci0JCWlmIChPTkVfVE9fT05FLmVxdWFscyh0eXBlKSkgewotCQkJYWRkT25lVG9PbmVUZXh0RGVjb3JhdG9yKGNvbm5lY3Rpb24sIGRpcmVjdGlvbiwgcmVsYXRpb24pOwotCQl9IGVsc2UgaWYgKE9ORV9UT19NQU5ZLmVxdWFscyh0eXBlKSAmJiBVTkkuZXF1YWxzKGRpcmVjdGlvbikpIHsKLQkJCWFkZE9uZVRvTWFueVRleHREZWNvcmF0b3IoY29ubmVjdGlvbiwgcmVsYXRpb24pOwotCQl9IGVsc2UgaWYgKE1BTllfVE9fT05FLmVxdWFscyh0eXBlKSkgewotCQkJYWRkTWFueVRvT25lVGV4dERlY29yYXRvcihjb25uZWN0aW9uLCBkaXJlY3Rpb24sIHJlbGF0aW9uKTsKLQkJfSBlbHNlIGlmIChNQU5ZX1RPX01BTlkuZXF1YWxzKHR5cGUpKSB7Ci0JCQlhZGRNYW55VG9NYW55VGV4dERlY29yYXRvcihjb25uZWN0aW9uLCBkaXJlY3Rpb24sIHJlbGF0aW9uKTsKLQkJfQotCX0JCi0KLQotCXByaXZhdGUgdm9pZCBhZGRPbmVUb09uZURlY29yYXRvcihGcmVlRm9ybUNvbm5lY3Rpb24gYywgUmVsRGlyIGRpcmVjdGlvbiwgSVJlbGF0aW9uIHJlbCkgewotCQlkb3VibGUgc3RhcnRDb2VmZmljaWVudCA9IFNUQVJUX0NPRUZGSUNJRU5UOwotCQlkb3VibGUgZW5kQ29lZmZpY2llbnQgPSAxLjAgLSBzdGFydENvZWZmaWNpZW50OwkKLQkJaW50IGxlbiA9IEpQQUVkaXRvclV0aWwuY2FsY0Nvbm5lY3Rpb25MZW5ndGgoYyk7CQkKLQkJaWYgKFVOSS5lcXVhbHMoZGlyZWN0aW9uKSkgewotCQkJQ29ubmVjdGlvbkRlY29yYXRvciBkID0gaW1hZ2VDcmVhdG9yLmNyZWF0ZUFycm93Q29ubmVjdGlvbkRlY29yYXRvcihjLCBlbmRDb2VmZmljaWVudCwgZmFsc2UpOwotCQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb24oZC5nZXRHcmFwaGljc0FsZ29yaXRobSgpLE1hdGgucm91bmQoLWxlbi8xMCksIDApOwkJCQkKLQkJfSAKLQl9Ci0gICAgICAgIAotCXByaXZhdGUgdm9pZCBhZGRPbmVUb01hbnlEZWNvcmF0b3IoRnJlZUZvcm1Db25uZWN0aW9uIGMsIElSZWxhdGlvbiByZWwpIHsKLQkJZG91YmxlIHN0YXJ0Q29lZmZpY2llbnQgPSBTVEFSVF9DT0VGRklDSUVOVDsKLQkJZG91YmxlIGVuZENvZWZmaWNpZW50ID0gMS4wIC0gc3RhcnRDb2VmZmljaWVudDsKLQkJaW50IGxlbiA9IEpQQUVkaXRvclV0aWwuY2FsY0Nvbm5lY3Rpb25MZW5ndGgoYyk7Ci0JCUNvbm5lY3Rpb25EZWNvcmF0b3IgZCA9IGltYWdlQ3JlYXRvci5jcmVhdGVNYW55RW5kV2l0aEFycm93RGVjb3JhdG9yKGMsIGVuZENvZWZmaWNpZW50KTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb24oZC5nZXRHcmFwaGljc0FsZ29yaXRobSgpLE1hdGgucm91bmQoLWxlbi8xMCksIDApOwotCX0KLSAgICAgICAgICAgICAgICAKLQlwcml2YXRlIHZvaWQgYWRkTWFueVRvT25lRGVjb3JhdG9yKEZyZWVGb3JtQ29ubmVjdGlvbiBjLCBSZWxEaXIgZGlyZWN0aW9uLCBJUmVsYXRpb24gcmVsKSB7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCByZWwuZ2V0T3duZXIoKSk7Ci0JCWRvdWJsZSBzdGFydENvZWZmaWNpZW50ID0gU1RBUlRfQ09FRkZJQ0lFTlQ7Ci0JCWRvdWJsZSBlbmRDb2VmZmljaWVudCA9IDEuMCAtIHN0YXJ0Q29lZmZpY2llbnQ7Ci0JCWludCBsZW4gPSBKUEFFZGl0b3JVdGlsLmNhbGNDb25uZWN0aW9uTGVuZ3RoKGMpOwkJCi0JCUNvbm5lY3Rpb25EZWNvcmF0b3IgZDEgPSBpbWFnZUNyZWF0b3IuY3JlYXRlTWFueVN0YXJ0RGVjb3JhdG9yKGMsIHN0YXJ0Q29lZmZpY2llbnQpOwotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbihkMS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLE1hdGgucm91bmQobGVuLzEwKSwgMCk7Ci0JCWlmIChVTkkuZXF1YWxzKGRpcmVjdGlvbikpIHsKLQkJCUNvbm5lY3Rpb25EZWNvcmF0b3IgZDIgPSBpbWFnZUNyZWF0b3IuY3JlYXRlQXJyb3dDb25uZWN0aW9uRGVjb3JhdG9yKGMsIGVuZENvZWZmaWNpZW50LCBmYWxzZSk7Ci0JCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbihkMi5nZXRHcmFwaGljc0FsZ29yaXRobSgpLE1hdGgucm91bmQoLWxlbi8xMCksIDApOwotCQl9IAotICAgIH0KLSAgICAKLQlwcml2YXRlIHZvaWQgYWRkTWFueVRvTWFueURlY29yYXRvcihGcmVlRm9ybUNvbm5lY3Rpb24gYywgUmVsRGlyIGRpcmVjdGlvbiwgSVJlbGF0aW9uIHJlbCkgewotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgcmVsLmdldE93bmVyKCkpOwotCQlkb3VibGUgc3RhcnRDb2VmZmljaWVudCA9IFNUQVJUX0NPRUZGSUNJRU5UOwotCQlkb3VibGUgZW5kQ29lZmZpY2llbnQgPSAxLjAgLSBzdGFydENvZWZmaWNpZW50OwkJCi0JCWludCBsZW4gPSBKUEFFZGl0b3JVdGlsLmNhbGNDb25uZWN0aW9uTGVuZ3RoKGMpOwkJCi0JCUNvbm5lY3Rpb25EZWNvcmF0b3IgZDEgPSBpbWFnZUNyZWF0b3IuY3JlYXRlTWFueVN0YXJ0RGVjb3JhdG9yKGMsIHN0YXJ0Q29lZmZpY2llbnQpOwotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbihkMS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLE1hdGgucm91bmQobGVuLzEwKSwgMCk7Ci0JCWlmIChVTkkuZXF1YWxzKGRpcmVjdGlvbikpIHsKLQkJCUNvbm5lY3Rpb25EZWNvcmF0b3IgZCA9IGltYWdlQ3JlYXRvci5jcmVhdGVNYW55RW5kV2l0aEFycm93RGVjb3JhdG9yKGMsIGVuZENvZWZmaWNpZW50KTsKLQkJCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldExvY2F0aW9uKGQuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSxNYXRoLnJvdW5kKC1sZW4vMTApLCAwKTsKLQkJfSBlbHNlIHsKLQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCByZWwuZ2V0SW52ZXJzZSgpKTsKLQkJCUNvbm5lY3Rpb25EZWNvcmF0b3IgZCA9IGltYWdlQ3JlYXRvci5jcmVhdGVNYW55RW5kRGVjb3JhdG9yKGMsIGVuZENvZWZmaWNpZW50KTsKLQkJCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldExvY2F0aW9uKGQuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSxNYXRoLnJvdW5kKC1sZW4vMTApLCAwKTsKLQkJfQotICAgIH0KLSAKLQkKLQkKLQkKLQkKLQkKLQlwcml2YXRlIHZvaWQgYWRkT25lVG9PbmVUZXh0RGVjb3JhdG9yKEZyZWVGb3JtQ29ubmVjdGlvbiBjLCBSZWxEaXIgZGlyZWN0aW9uLCBJUmVsYXRpb24gcmVsKSB7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCByZWwuZ2V0T3duZXIoKSk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhID0gbnVsbDsKLQkJQm9vbGVhbiBvcHRpb25hbDsKLQkJYm9vbGVhbiBpc09wdGlvbmFsID0gZmFsc2U7Ci0JCWlmIChSZWxEaXIuVU5JLmVxdWFscyhkaXJlY3Rpb24pKSB7Ci0JCQlpc09wdGlvbmFsID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGludmVyc2UgPSByZWwuZ2V0SW52ZXJzZSgpLmdldEF0dHJpYnV0ZU5hbWVkKHJlbC5nZXRJbnZlcnNlQXR0cmlidXRlTmFtZSgpKTsKLQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCAoSmF2YVBlcnNpc3RlbnRUeXBlKWludmVyc2UuZ2V0UGFyZW50KCkpOwotCQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZyA9IGludmVyc2UuZ2V0TWFwcGluZygpOwotCQkJYSA9IChPbmVUb09uZUFubm90YXRpb24pbWFwcGluZy5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQkJaWYgKGEgIT0gbnVsbCkgewotCQkJCW9wdGlvbmFsID0gYS5nZXRPcHRpb25hbCgpOwotCQkJCWlzT3B0aW9uYWwgPSAob3B0aW9uYWwgPT0gbnVsbCkgPyB0cnVlIDogb3B0aW9uYWwuYm9vbGVhblZhbHVlKCk7Ci0JCQkJaW1hZ2VDcmVhdG9yLmNyZWF0ZUNhcmRpbmFsaXR5Q29ubmVjdGlvbkRlY29yYXRvcihnZXREaWFncmFtKCksIGMsIGlzT3B0aW9uYWwgPyBKUEFFZGl0b3JDb25zdGFudHMuQ0FSRElOQUxJVFlfWkVST19PTkUgOiBKUEFFZGl0b3JDb25zdGFudHMuQ0FSRElOQUxJVFlfT05FLCAwLjApOwkJCQkKLQkJCX0KLQkJfQotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgcmVsLmdldE93bmVyKCkpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lciA9IHJlbC5nZXRPd25lcigpLmdldEF0dHJpYnV0ZU5hbWVkKHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSk7Ci0JCW93bmVyLnVwZGF0ZSgpOwotCQlKYXZhQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gb3duZXIuZ2V0TWFwcGluZygpOyAgCi0JCWEgPSAoT25lVG9PbmVBbm5vdGF0aW9uKW1hcHBpbmcuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsJCQotCQlpZiAoYSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlvcHRpb25hbCA9IGEuZ2V0T3B0aW9uYWwoKTsKLQkJaXNPcHRpb25hbCA9IChvcHRpb25hbCA9PSBudWxsKSA/IHRydWUgOiBvcHRpb25hbC5ib29sZWFuVmFsdWUoKTsJCQotCQlpbWFnZUNyZWF0b3IuY3JlYXRlQ2FyZGluYWxpdHlDb25uZWN0aW9uRGVjb3JhdG9yKGdldERpYWdyYW0oKSwgYywgaXNPcHRpb25hbCA/IEpQQUVkaXRvckNvbnN0YW50cy5DQVJESU5BTElUWV9aRVJPX09ORSA6IEpQQUVkaXRvckNvbnN0YW50cy5DQVJESU5BTElUWV9PTkUsIDEuMCk7CQkJCQkJCQkJIAotCQlpbWFnZUNyZWF0b3IuY3JlYXRlQ2FyZGluYWxpdHlDb25uZWN0aW9uRGVjb3JhdG9yKGdldERpYWdyYW0oKSwgYywgcmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpLCAwLjApOwkJCQkKLQkJaWYgKCFVTkkuZXF1YWxzKGRpcmVjdGlvbikpIHsKLQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCByZWwuZ2V0SW52ZXJzZSgpKTsKLQkJCWltYWdlQ3JlYXRvci5jcmVhdGVDYXJkaW5hbGl0eUNvbm5lY3Rpb25EZWNvcmF0b3IoZ2V0RGlhZ3JhbSgpLCBjLCByZWwuZ2V0SW52ZXJzZUF0dHJpYnV0ZU5hbWUoKSwgMS4wKTsJCQkJCi0JCX0KLQl9Ci0gICAgICAgIAotCXByaXZhdGUgdm9pZCBhZGRPbmVUb01hbnlUZXh0RGVjb3JhdG9yKEZyZWVGb3JtQ29ubmVjdGlvbiBjLCBJUmVsYXRpb24gcmVsKSB7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCByZWwuZ2V0T3duZXIoKSk7Ci0JCWltYWdlQ3JlYXRvci5jcmVhdGVDYXJkaW5hbGl0eUNvbm5lY3Rpb25EZWNvcmF0b3IoZ2V0RGlhZ3JhbSgpLCBjLCBKUEFFZGl0b3JDb25zdGFudHMuQ0FSRElOQUxJVFlfWkVST19PTkUsIDAuMCk7Ci0JCWltYWdlQ3JlYXRvci5jcmVhdGVDYXJkaW5hbGl0eUNvbm5lY3Rpb25EZWNvcmF0b3IoZ2V0RGlhZ3JhbSgpLCBjLCBKUEFFZGl0b3JDb25zdGFudHMuQ0FSRElOQUxJVFlfWkVST19OLCAxLjApOwkKLQkJaW1hZ2VDcmVhdG9yLmNyZWF0ZUNhcmRpbmFsaXR5Q29ubmVjdGlvbkRlY29yYXRvcihnZXREaWFncmFtKCksIGMsIHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSwgMC4wKTsJCQkJCQkKLQl9Ci0gICAgICAgICAgICAgICAgCi0JcHJpdmF0ZSB2b2lkIGFkZE1hbnlUb09uZVRleHREZWNvcmF0b3IoRnJlZUZvcm1Db25uZWN0aW9uIGMsIFJlbERpciBkaXJlY3Rpb24sIElSZWxhdGlvbiByZWwpIHsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIHJlbC5nZXRPd25lcigpKTsKLQkJaW1hZ2VDcmVhdG9yLmNyZWF0ZUNhcmRpbmFsaXR5Q29ubmVjdGlvbkRlY29yYXRvcihnZXREaWFncmFtKCksIGMsIEpQQUVkaXRvckNvbnN0YW50cy5DQVJESU5BTElUWV9aRVJPX04sIDAuMCk7Ci0JCWltYWdlQ3JlYXRvci5jcmVhdGVDYXJkaW5hbGl0eUNvbm5lY3Rpb25EZWNvcmF0b3IoZ2V0RGlhZ3JhbSgpLCBjLCByZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCksIDAuMCk7CQkJCQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lciA9IHJlbC5nZXRPd25lcigpLmdldEF0dHJpYnV0ZU5hbWVkKHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSk7Ci0JCUphdmFBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgPSBvd25lci5nZXRNYXBwaW5nKCk7Ci0JCU1hbnlUb09uZUFubm90YXRpb24gYSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKW1hcHBpbmcuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJaWYgKGEgPT0gbnVsbCkgCi0JCQlyZXR1cm47Ci0JCUJvb2xlYW4gb3B0aW9uYWwgPSBhLmdldE9wdGlvbmFsKCk7Ci0JCWJvb2xlYW4gaXNPcHRpb25hbCA9IChvcHRpb25hbCA9PSBudWxsKSA/IHRydWUgOiBvcHRpb25hbC5ib29sZWFuVmFsdWUoKTsJCQotCQlpbWFnZUNyZWF0b3IuY3JlYXRlQ2FyZGluYWxpdHlDb25uZWN0aW9uRGVjb3JhdG9yKGdldERpYWdyYW0oKSwgYywgaXNPcHRpb25hbCA/Ci0JCQkJCQkJCQkJCQkJCQkJCUpQQUVkaXRvckNvbnN0YW50cy5DQVJESU5BTElUWV9aRVJPX09ORSA6Ci0JCQkJCQkJCQkJCQkJCQkJCUpQQUVkaXRvckNvbnN0YW50cy5DQVJESU5BTElUWV9PTkUsIDEuMCk7Ci0JCWlmICghVU5JLmVxdWFscyhkaXJlY3Rpb24pKSB7Ci0JCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgcmVsLmdldEludmVyc2UoKSk7Ci0JCQlpbWFnZUNyZWF0b3IuY3JlYXRlQ2FyZGluYWxpdHlDb25uZWN0aW9uRGVjb3JhdG9yKGdldERpYWdyYW0oKSwgYywgcmVsLmdldEludmVyc2VBdHRyaWJ1dGVOYW1lKCksIDEuMCk7Ci0JCX0KLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSB2b2lkIGFkZE1hbnlUb01hbnlUZXh0RGVjb3JhdG9yKEZyZWVGb3JtQ29ubmVjdGlvbiBjLCBSZWxEaXIgZGlyZWN0aW9uLCBJUmVsYXRpb24gcmVsKSB7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCByZWwuZ2V0T3duZXIoKSk7Ci0JCWltYWdlQ3JlYXRvci5jcmVhdGVDYXJkaW5hbGl0eUNvbm5lY3Rpb25EZWNvcmF0b3IoZ2V0RGlhZ3JhbSgpLCBjLCBKUEFFZGl0b3JDb25zdGFudHMuQ0FSRElOQUxJVFlfWkVST19OLCAwLjApOwkJCi0JCWltYWdlQ3JlYXRvci5jcmVhdGVDYXJkaW5hbGl0eUNvbm5lY3Rpb25EZWNvcmF0b3IoZ2V0RGlhZ3JhbSgpLCBjLCBKUEFFZGl0b3JDb25zdGFudHMuQ0FSRElOQUxJVFlfWkVST19OLCAxLjApOwkKLQkJaW1hZ2VDcmVhdG9yLmNyZWF0ZUNhcmRpbmFsaXR5Q29ubmVjdGlvbkRlY29yYXRvcihnZXREaWFncmFtKCksIGMsIHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSwgMC4wKTsKLQkJaWYgKCFVTkkuZXF1YWxzKGRpcmVjdGlvbikpIHsKLQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCByZWwuZ2V0SW52ZXJzZSgpKTsKLQkJCWltYWdlQ3JlYXRvci5jcmVhdGVDYXJkaW5hbGl0eUNvbm5lY3Rpb25EZWNvcmF0b3IoZ2V0RGlhZ3JhbSgpLCBjLCByZWwuZ2V0SW52ZXJzZUF0dHJpYnV0ZU5hbWUoKSwgMS4wKTsJCi0JCX0KLSAgICB9Ci0KLQkKLQkKLQkKLQkKLQkKLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5BZGQoSUFkZENvbnRleHQgY29udGV4dCkgewotCQlpZiAoY29udGV4dCBpbnN0YW5jZW9mIElBZGRDb25uZWN0aW9uQ29udGV4dCAmJiBjb250ZXh0LmdldE5ld09iamVjdCgpIGluc3RhbmNlb2YgSVJlbGF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLSAgICAKLX0KLQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DbGlja0FkZEF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg3NzljYy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DbGlja0FkZEF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUNyZWF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdENyZWF0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFNpdGU7Ci0KLQotcHVibGljIGNsYXNzIENsaWNrQWRkQXR0cmlidXRlQnV0dG9uRmVhdHVyZSBleHRlbmRzIEFic3RyYWN0Q3JlYXRlRmVhdHVyZSB7Ci0JCi0JcHVibGljIENsaWNrQWRkQXR0cmlidXRlQnV0dG9uRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCXN1cGVyKHByb3ZpZGVyLCAiIiwgIiIpOwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShJQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oSUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuQ3JlYXRlKElDcmVhdGVDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBjcmVhdGUoSUNyZWF0ZUNvbnRleHQgY29udGV4dCkgewotCQlDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSA9IGNvbnRleHQuZ2V0VGFyZ2V0Q29udGFpbmVyKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWdldEZlYXR1cmVQcm92aWRlcigpLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChlbnRpdHlTaGFwZSk7Ci0JCVN0cmluZyBuZXdBdHRyTmFtZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmNyZWF0ZU5ld0F0dHJpYnV0ZShqcHQsIGZhbHNlLCBnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChnZXRGZWF0dXJlUHJvdmlkZXIoKSwganB0KTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmV3QXR0ciA9IGpwdC5nZXRBdHRyaWJ1dGVOYW1lZChuZXdBdHRyTmFtZSk7Ci0JCWludCBjbnQgPSAwOwotCQl3aGlsZSAoKG5ld0F0dHIgPT0gbnVsbCkgJiYgKGNudCA8IDI1KSkgeyAKLQkJCW5ld0F0dHIgPSBqcHQuZ2V0QXR0cmlidXRlTmFtZWQobmV3QXR0ck5hbWUpOwotCQkJaWYgKG5ld0F0dHIgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiVGhyZWFkIHNsZWVwIGludGVycnVwdGVkIiwgZSk7ICAvLyROT04tTkxTLTEkCQkgCi0JCQkJfQotCQkJfQotCQkJY250Kys7Ci0JCX0KLQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuYWRkQWRkSWdub3JlKChKYXZhUGVyc2lzdGVudFR5cGUpbmV3QXR0ci5nZXRQYXJlbnQoKSwgbmV3QXR0ci5nZXROYW1lKCkpOwotCQlhZGRHcmFwaGljYWxSZXByZXNlbnRhdGlvbihjb250ZXh0LCBuZXdBdHRyKTsKLSAgICAgICAgZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0RGlyZWN0RWRpdGluZ0luZm8oKS5zZXRBY3RpdmUodHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBJV29ya2JlbmNoU2l0ZSB3cyA9ICgoSUVkaXRvclBhcnQpZ2V0RGlhZ3JhbUVkaXRvcigpKS5nZXRTaXRlKCk7Ci0gICAgICAgIElDb21waWxhdGlvblVuaXQgY3UgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRDb21waWxhdGlvblVuaXQoanB0KTsKLSAgICAgICAgZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0SlBBRWRpdG9yVXRpbCgpLmZvcm1hdENvZGUoY3UsIHdzKTsKLQotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHtuZXdBdHRyfTsKLQl9CQotCi0JcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoSUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JNZXNzYWdlcy5DbGlja0FkZEF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmVfY3JlYXRlQXR0cmlidXRlQnV0dG9uTGFiZWw7ICAJCQkKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbkRlc2NyaXB0aW9uOyAgCi0JfQotCQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjExN2FmLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JRGVsZXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5pbnRlcm5hbC5mZWF0dXJlcy5jb250ZXh0LmltcGwuYmFzZS5QaWN0b2dyYW1FbGVtZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5mZWF0dXJlcy5EZWZhdWx0RGVsZXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIENsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZSBleHRlbmRzIERlZmF1bHREZWxldGVGZWF0dXJlIHsKLQotCXByaXZhdGUgU3RyaW5nIGF0dHJOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJc3VwZXIocHJvdmlkZXIpOwotCX0JCi0JCQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UXVlc3Rpb25Ub1VzZXIoKSB7Ci0gICAgCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChKUEFFZGl0b3JNZXNzYWdlcy5DbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmVfZGVsZXRlQXR0cmlidXRlUXVlc3Rpb24sIG5ldyBPYmplY3RbXSB7YXR0ck5hbWV9KTsgCi0gICAgfQotCQotCQotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oSUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEF0dHJOYW1lKENvbnRhaW5lclNoYXBlIHRleHRTaGFwZSkgewotCQlTdHJpbmcgdHh0ID0gKChUZXh0KSh0ZXh0U2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCkuZ2V0KDApKSkuZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIGF0dHJOYW1lID0gdHh0LnN1YnN0cmluZyh0eHQuaW5kZXhPZignOicpICsgMSk7Ci0JCWF0dHJOYW1lID0gYXR0ck5hbWUudHJpbSgpOwkKLQkJcmV0dXJuIGF0dHJOYW1lOwotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZUF0dHJpYnV0ZShDb250YWluZXJTaGFwZSBwZSwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWdldEZlYXR1cmVQcm92aWRlcigpLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZS5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKSk7CQkKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZGVsZXRlQXR0cmlidXRlKGpwdCwgYXR0ck5hbWUsIGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQl9CQotCQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShJRGVsZXRlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgCWRlbGV0ZShjb250ZXh0LCB0cnVlKTsKLSAgICB9Ci0gICAgCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJlRGVsZXRlKElEZWxldGVDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIucHJlRGVsZXRlKGNvbnRleHQpOwotCX0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkZWxldGUoSURlbGV0ZUNvbnRleHQgY29udGV4dCwgYm9vbGVhbiBoYXZlVG9Bc2spIHsKLQkJUGljdG9ncmFtRWxlbWVudENvbnRleHQgY3R4ID0gKFBpY3RvZ3JhbUVsZW1lbnRDb250ZXh0KWNvbnRleHQ7Ci0JCUNvbnRhaW5lclNoYXBlIHRleHRTaGFwZSA9IChDb250YWluZXJTaGFwZSljdHguZ2V0UGljdG9ncmFtRWxlbWVudCgpOwkKLQkJaWYgKCh0ZXh0U2hhcGUgPT0gbnVsbCkgfHwgdGV4dFNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkgPT0gbnVsbCkgCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBhdHRyTmFtZSA9IGdldEF0dHJOYW1lKHRleHRTaGFwZSk7Ci0JCXRoaXMuYXR0ck5hbWUgPSBhdHRyTmFtZTsKLSAgICAJaWYgKGhhdmVUb0FzaykgewotICAgIAkJaWYgKCFnZXRVc2VyRGVjaXNpb24oY29udGV4dCkpIHsKLSAgICAJCQlyZXR1cm47Ci0gICAgCQl9Ci0gICAgCX0gICAgCQotICAgIAkKLSAgICAgICAgcHJlRGVsZXRlKGNvbnRleHQpOyAKLSAgICAgICAgaWYgKHRleHRTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpID09IG51bGwpewotICAgICAgICAJcmV0dXJuOwotICAgICAgICB9ICAgICAgICAKLQkJZGVsZXRlQXR0cmlidXRlKHRleHRTaGFwZSwgYXR0ck5hbWUpOwotICAgIH0KLQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGRlbGV0ZUJ1c2luZXNzT2JqZWN0cyhPYmplY3RbXSBidXNpbmVzc09iamVjdHMpIHsKLSAgICAgICAgaWYgKGJ1c2luZXNzT2JqZWN0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBibyA6IGJ1c2luZXNzT2JqZWN0cykgewotICAgICAgICAgICAgICAgIGRlbGV0ZUJ1c2luZXNzT2JqZWN0KGJvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gICAgCi0JCQotCXB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKElDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbmxhYmVsOyAKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbkRlc2NyaXB0aW9uOyAKLQl9Ci0JCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfQotCi0JCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NvbGxhcHNlQWxsRW50aXRpZXNGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9Db2xsYXBzZUFsbEVudGl0aWVzRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWJiZDkzLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NvbGxhcHNlQWxsRW50aXRpZXNGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5BYnN0cmFjdEN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLklDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuR3JhcGhpY3NBbGdvcml0aG07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgQ29sbGFwc2VBbGxFbnRpdGllc0ZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEN1c3RvbUZlYXR1cmUgaW1wbGVtZW50cyBJQ3VzdG9tRmVhdHVyZXsKLQkKLQlwdWJsaWMgQ29sbGFwc2VBbGxFbnRpdGllc0ZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCk7Ci0JCWZpbmFsIEVMaXN0PFNoYXBlPiBlbnRTaGFwZXMgPSBkaWFncmFtLmdldENoaWxkcmVuKCk7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGRpYWdyYW0pOwotCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlmb3IgKGZpbmFsIFBpY3RvZ3JhbUVsZW1lbnQgZWwgOiBlbnRTaGFwZXMpIHsKLQkJCQkJU3RyaW5nIGNvbGxhcHNlRmVhdHVyZXMgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRQcm9wZXJ0eVZhbHVlKGVsLCBKUEFFZGl0b3JDb25zdGFudHMuQ09MTEFQU0VfRkVBVFVSRVMpOwotCQkJCQlpZiAoY29sbGFwc2VGZWF0dXJlcyA9PSBudWxsKSB7CQotCQkJCSAgICAgICAgR3JhcGhpY3NBbGdvcml0aG0gYWxnbyA9IGVsLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCQkJCQlhbGdvLnNldEhlaWdodChKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX01JTl9IRUlHSFQpOwotCQkJCQkJR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuc2V0UHJvcGVydHlWYWx1ZShlbCwgSlBBRWRpdG9yQ29uc3RhbnRzLkNPTExBUFNFX0ZFQVRVUkVTLCBTdHJpbmcudmFsdWVPZihKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX01JTl9IRUlHSFQpKTsKLQkJCQkJCUpQQUVkaXRvclV0aWwucmVhcnJhbmdlQWxsQ29ubmVjdGlvbnMoKENvbnRhaW5lclNoYXBlKSBlbCwgZ2V0RmVhdHVyZVByb3ZpZGVyKCksIGZhbHNlKTsJCQkJCQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsJCi0JCQkJCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuICAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZShJQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUFsbEVudGl0aWVzTWVudUl0ZW07Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ29sbGFwc2VDb21wYXJ0bWVudFNoYXBlRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ29sbGFwc2VDb21wYXJ0bWVudFNoYXBlRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGZiOWM0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NvbGxhcHNlQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFBldHlhIFNhYmV2YSAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uQWJzdHJhY3RDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuR3JhcGhpY3NBbGdvcml0aG07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkdyYXBoaWNzVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci0KLQotcHVibGljIGNsYXNzIENvbGxhcHNlQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEN1c3RvbUZlYXR1cmV7Ci0KLQlwdWJsaWMgQ29sbGFwc2VDb21wYXJ0bWVudFNoYXBlRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJUGljdG9ncmFtRWxlbWVudCBlbCA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudHMoKVswXTsKLQkJCi0JCWZpbmFsIENvbnRhaW5lclNoYXBlIGNvbnRhaW5lclNoYXBlID0gKENvbnRhaW5lclNoYXBlKSBlbDsKLQkJZmluYWwgQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUgPSBjb250YWluZXJTaGFwZS5nZXRDb250YWluZXIoKTsKLQkJCi0JCWZpbmFsIEdyYXBoaWNzQWxnb3JpdGhtIGFsZ28gPSBlbC5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihhbGdvKTsKLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkgICAgYWxnby5zZXRIZWlnaHQoSlBBRWRpdG9yQ29uc3RhbnRzLkNPTVBBUlRNRU5UX01JTl9IRUlHSFQpOwotCQkJCUdyYXBoaWNzVXBkYXRlci51cGRhdGVFbnRpdHlTaGFwZShlbnRpdHlTaGFwZSk7Ci0JCQkJR3JhcGhpY3NVcGRhdGVyLnNldENvbGxhcHNlZChjb250YWluZXJTaGFwZSwgdHJ1ZSk7Ci0JCQkJSlBBRWRpdG9yVXRpbC5yZWFycmFuZ2VBbGxDb25uZWN0aW9ucyhlbnRpdHlTaGFwZSwgZ2V0RmVhdHVyZVByb3ZpZGVyKCksIGZhbHNlKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAgKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfQotCQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKElDb250ZXh0IGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBJQ3VzdG9tQ29udGV4dCkgewotCQkJUGljdG9ncmFtRWxlbWVudFtdIHBlcyA9ICgoSUN1c3RvbUNvbnRleHQpIGNvbnRleHQpLmdldFBpY3RvZ3JhbUVsZW1lbnRzKCk7Ci0JCQlpZiAocGVzICE9IG51bGwgJiYgcGVzLmxlbmd0aCA+IDApIHsKLQkJCQlib29sZWFuIGNvbGxhcHNlUG9zc2libGUgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBlcy5sZW5ndGg7IGkrKykgewotCQkJCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gcGVzW2ldOwotCQkJCQlPYmplY3QgYm8gPSBnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotCQkJCQlpZiAoYm8gIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCWlmICghY29sbGFwc2VQb3NzaWJsZSkgewotCQkJCQkJaWYoIUdyYXBoaWNzVXBkYXRlci5pc0NvbGxhcHNlZCgoQ29udGFpbmVyU2hhcGUpcGUpKSB7Ci0JCQkJCQkJY29sbGFwc2VQb3NzaWJsZSA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGNvbGxhcHNlUG9zc2libGUpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9Db2xsYXBzZUVudGl0eUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NvbGxhcHNlRW50aXR5RmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzY5NWRkLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NvbGxhcHNlRW50aXR5RmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFBldHlhIFNhYmV2YSAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uQWJzdHJhY3RDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5JQ3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkdyYXBoaWNzQWxnb3JpdGhtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnNlcnZpY2VzLkdyYXBoaXRpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci0KLQotcHVibGljIGNsYXNzIENvbGxhcHNlRW50aXR5RmVhdHVyZSBleHRlbmRzIEFic3RyYWN0Q3VzdG9tRmVhdHVyZSBpbXBsZW1lbnRzIElDdXN0b21GZWF0dXJlewotCQotCXB1YmxpYyBDb2xsYXBzZUVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCWZpbmFsIFBpY3RvZ3JhbUVsZW1lbnQgZWwgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnRzKClbMF07Ci0JCQotICAgICAgICBmaW5hbCBHcmFwaGljc0FsZ29yaXRobSBhbGdvID0gZWwuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLSAgICAgICAgCi0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGFsZ28pOwotCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlhbGdvLnNldEhlaWdodChKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX01JTl9IRUlHSFQpOwotCQkJCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLnNldFByb3BlcnR5VmFsdWUoZWwsIEpQQUVkaXRvckNvbnN0YW50cy5DT0xMQVBTRV9GRUFUVVJFUywgU3RyaW5nLnZhbHVlT2YoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9NSU5fSEVJR0hUKSk7Ci0JCQkJSlBBRWRpdG9yVXRpbC5yZWFycmFuZ2VBbGxDb25uZWN0aW9ucygoQ29udGFpbmVyU2hhcGUpIGVsLCBnZXRGZWF0dXJlUHJvdmlkZXIoKSwgZmFsc2UpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKElDb250ZXh0IGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBJQ3VzdG9tQ29udGV4dCkgewotCQkJUGljdG9ncmFtRWxlbWVudFtdIHBlcyA9ICgoSUN1c3RvbUNvbnRleHQpIGNvbnRleHQpLmdldFBpY3RvZ3JhbUVsZW1lbnRzKCk7Ci0JCQlpZiAocGVzICE9IG51bGwgJiYgcGVzLmxlbmd0aCA+IDApIHsKLQkJCQlib29sZWFuIGNvbGxhcHNlUG9zc2libGUgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBlcy5sZW5ndGg7IGkrKykgewotCQkJCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gcGVzW2ldOwotCQkJCQlPYmplY3QgYm8gPSBnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotCQkJCQlpZiAoIShibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQlpZiAoIWNvbGxhcHNlUG9zc2libGUpIHsKLQkJCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHkocGUsIEpQQUVkaXRvckNvbnN0YW50cy5DT0xMQVBTRV9GRUFUVVJFUyk7Ci0JCQkJCQlpZiAocHJvcGVydHkgPT0gbnVsbCkgewotCQkJCQkJCWNvbGxhcHNlUG9zc2libGUgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChjb2xsYXBzZVBvc3NpYmxlKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUVudGl0eU1lbnVJdGVtOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZUluaGVyaXRlZEVudGl0eUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZUluaGVyaXRlZEVudGl0eUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3ZWRiMi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVJbmhlcml0ZWRFbnRpdHlGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUNyZWF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkFkZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkNyZWF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdENyZWF0ZUNvbm5lY3Rpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvckltYWdlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBDcmVhdGVJbmhlcml0ZWRFbnRpdHlGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RDcmVhdGVDb25uZWN0aW9uRmVhdHVyZSB7Ci0KLQlwdWJsaWMgQ3JlYXRlSW5oZXJpdGVkRW50aXR5RmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXRoaXMoZnAsIEpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZUlzQVJlbGF0aW9uRmVhdHVyZV9uYW1lLAlKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVJc0FSZWxhdGlvbkZlYXR1cmVfZGVzY3JpcHRpb24pOwotCX0KLQkJCi0JcHVibGljIENyZWF0ZUluaGVyaXRlZEVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCwgU3RyaW5nIG5hbWUsCi0JCQlTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIoZnAsIG5hbWUsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5DcmVhdGUoSUNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHN1cGVyY2xhc3MgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWdldFBlcnNpc3RlbnRUeXBlKGNvbnRleHQuZ2V0U291cmNlQW5jaG9yKCkpOwotCSAgICBpZiAoc3VwZXJjbGFzcyA9PSBudWxsKQotCSAgICAJcmV0dXJuIGZhbHNlOwotCSAgICBpZiAoY29udGV4dC5nZXRUYXJnZXRBbmNob3IoKSA9PSBudWxsKQotCSAgICAJcmV0dXJuIHRydWU7Ci0JCWlmIChjb250ZXh0LmdldFRhcmdldEFuY2hvcigpLmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbSkKLQkJCXJldHVybiB0cnVlOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb24gY3JlYXRlKElDcmVhdGVDb25uZWN0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBtYXBwZWRTdXBlcmNsYXNzID0gKEphdmFQZXJzaXN0ZW50VHlwZSlnZXRQZXJzaXN0ZW50VHlwZShjb250ZXh0LmdldFNvdXJjZUFuY2hvcigpKTsKLQkJQ3JlYXRlSlBBRW50aXR5RmVhdHVyZSBjcmVhdGVFbnRpdHlGZWF0dXJlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNyZWF0ZUVudGl0eUZlYXR1cmUgPSBuZXcgQ3JlYXRlSlBBRW50aXR5RmVhdHVyZSgKLQkJCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCksIG1hcHBlZFN1cGVyY2xhc3MpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IGNyZWF0ZSBhIG5ldyBKUEEgZW50aXR5IGNsYXNzIiwgZSk7IC8vJE5PTi1OTFMtMSQJCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJQ3JlYXRlQ29udGV4dCBjdHggPSBuZXcgQ3JlYXRlQ29udGV4dCgpOwotCQlPYmplY3RbXSByZXMgPSBjcmVhdGVFbnRpdHlGZWF0dXJlLmNyZWF0ZShjdHgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgbmV3RW50aXR5ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlyZXNbMF07Ci0JCUFkZEpQQUVudGl0eUZlYXR1cmUgZnQgPSBuZXcgQWRkSlBBRW50aXR5RmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSwgdHJ1ZSk7Ci0JCUFkZENvbnRleHQgY29udCA9IG5ldyBBZGRDb250ZXh0KCk7Ci0JCWNvbnQuc2V0VGFyZ2V0Q29udGFpbmVyKGdldEZlYXR1cmVQcm92aWRlcigpLmdldERpYWdyYW0oKSk7Ci0JCWNvbnQuc2V0TmV3T2JqZWN0KG5ld0VudGl0eSk7Ci0JCWNvbnQuc2V0TG9jYXRpb24oY29udGV4dC5nZXRUYXJnZXRMb2NhdGlvbigpLmdldFgoKSwgY29udGV4dC5nZXRUYXJnZXRMb2NhdGlvbigpLmdldFkoKSk7Ci0JCWZ0LmFkZChjb250KTsJCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdGFydENvbm5lY3Rpb24oSUNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHN1cGVyY2xhc3MgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWdldFBlcnNpc3RlbnRUeXBlKGNvbnRleHQuZ2V0U291cmNlQW5jaG9yKCkpOyAKLQkgICAgaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgCi0JICAgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIHJldHVybiB0cnVlOwotCX0KLQkKLSAgICBwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUltYWdlSWQoKSB7Ci0gICAgICAgIHJldHVybiBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLkFERF9JTkhFUklURURfRU5USVRZOwotICAgIH0JCi0gICAgCi0JcHJvdGVjdGVkIFBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKEFuY2hvciBhbmNob3IpIHsKLQkgICAgaWYgKGFuY2hvciAhPSBudWxsKSB7Ci0JICAgICAgICBPYmplY3QgcmVmT2JqZWN0ID0KLQkgICAgICAgICAgICBnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoYW5jaG9yLmdldFBhcmVudCgpKTsKLQkgICAgICAgIGlmIChyZWZPYmplY3QgaW5zdGFuY2VvZiBQZXJzaXN0ZW50VHlwZSkgewotCSAgICAgICAgICAgIHJldHVybiAoUGVyc2lzdGVudFR5cGUpIHJlZk9iamVjdDsKLQkgICAgICAgIH0KLQkgICAgfQotCSAgICByZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7IAotCX0KLQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVKUEFFbnRpdHlGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVKUEFFbnRpdHlGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZDAzNTcuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlSlBBRW50aXR5RmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3JlYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5pbXBsLkFic3RyYWN0Q3JlYXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLkpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JJbWFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoU2l0ZTsKLQotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlSlBBRW50aXR5RmVhdHVyZSBleHRlbmRzIEFic3RyYWN0Q3JlYXRlRmVhdHVyZSB7Ci0JCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGpwYVByZWZlcmVuY2VTdG9yZSA9IEpQQURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCXByaXZhdGUgYm9vbGVhbiBpc01hcHBlZFN1cGVyY2xhc3NDaGlsZDsKLQlwcml2YXRlIEphdmFQZXJzaXN0ZW50VHlwZSBtYXBwZWRTdXBlcmNsYXNzOwotCXByaXZhdGUgU3RyaW5nIG1hcHBlZFN1cGVyY2xhc3NOYW1lOwotCXByaXZhdGUgU3RyaW5nIG1hcHBlZFN1cGVyY2xhc3NQYWNrYWdlOwotCXByaXZhdGUgYm9vbGVhbiBzdXBlckhhc1ByaW1hcnlrZXk7Ci0KLQotCXB1YmxpYyBDcmVhdGVKUEFFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLSAgICAgICAgc3VwZXIoZnAsIEpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZUpQQUVudGl0eUZlYXR1cmVfanBhRW50aXR5RmVhdHVyZU5hbWUsIEpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZUpQQUVudGl0eUZlYXR1cmVfanBhRW50aXR5RmVhdHVyZURlc2NyaXB0aW9uKTsKLSAgICB9Ci0JCi0JcHVibGljIENyZWF0ZUpQQUVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCwKLQkJCWJvb2xlYW4gaXNNYXBwZWRTdXBlcmNsYXNzQ2hpbGQsIFN0cmluZyBtYXBwZWRTdXBlcmNsYXNzTmFtZSwKLQkJCVN0cmluZyBtYXBwZWRTdXBlckNsYXNzUGFja2FnZSkgewotCQl0aGlzKGZwLCBpc01hcHBlZFN1cGVyY2xhc3NDaGlsZCwgbWFwcGVkU3VwZXJjbGFzc05hbWUsCi0JCQkJbWFwcGVkU3VwZXJDbGFzc1BhY2thZ2UsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgQ3JlYXRlSlBBRW50aXR5RmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwLAotCQkJYm9vbGVhbiBpc01hcHBlZFN1cGVyY2xhc3NDaGlsZCwgU3RyaW5nIG1hcHBlZFN1cGVyY2xhc3NOYW1lKSB7Ci0JCXRoaXMoZnAsIGlzTWFwcGVkU3VwZXJjbGFzc0NoaWxkLCBtYXBwZWRTdXBlcmNsYXNzTmFtZSwgbnVsbCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBDcmVhdGVKUEFFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnAsCi0JCQlib29sZWFuIGlzTWFwcGVkU3VwZXJjbGFzc0NoaWxkLCBTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc05hbWUsCi0JCQlTdHJpbmcgbWFwcGVkU3VwZXJDbGFzc1BhY2thZ2UsIGJvb2xlYW4gc3VwZXJIYXNQcmltYXJ5S2V5KSB7Ci0JCXRoaXMoZnApOwotCQl0aGlzLmlzTWFwcGVkU3VwZXJjbGFzc0NoaWxkID0gaXNNYXBwZWRTdXBlcmNsYXNzQ2hpbGQ7Ci0JCXRoaXMubWFwcGVkU3VwZXJjbGFzc05hbWUgPSBtYXBwZWRTdXBlcmNsYXNzTmFtZTsKLQkJdGhpcy5tYXBwZWRTdXBlcmNsYXNzUGFja2FnZSA9IG1hcHBlZFN1cGVyQ2xhc3NQYWNrYWdlOwotCQl0aGlzLnN1cGVySGFzUHJpbWFyeWtleSA9IHN1cGVySGFzUHJpbWFyeUtleTsKLQl9Ci0KLQlwdWJsaWMgQ3JlYXRlSlBBRW50aXR5RmVhdHVyZShJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIG1hcHBlZFN1cGVyY2xhc3MpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQl0aGlzKGZwKTsKLQkJdGhpcy5pc01hcHBlZFN1cGVyY2xhc3NDaGlsZCA9IHRydWU7Ci0JCXRoaXMubWFwcGVkU3VwZXJjbGFzcyA9IG1hcHBlZFN1cGVyY2xhc3M7IAotCQl0aGlzLm1hcHBlZFN1cGVyY2xhc3NOYW1lID0gbWFwcGVkU3VwZXJjbGFzcy5nZXROYW1lKCk7Ci0JCXRoaXMubWFwcGVkU3VwZXJjbGFzc1BhY2thZ2UgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRNYXBwZWRTdXBlcmNsYXNzUGFja2FnZURlY2xhcmF0aW9uKG1hcHBlZFN1cGVyY2xhc3MpOwotCQl0aGlzLnN1cGVySGFzUHJpbWFyeWtleSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmhhc09ySW5oZXJpdHNQcmltYXJ5S2V5KG1hcHBlZFN1cGVyY2xhc3MpOwotCX0KLQkKLQotICAgIHB1YmxpYyBib29sZWFuIGNhbkNyZWF0ZShJQ3JlYXRlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldFRhcmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgRGlhZ3JhbTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotCXB1YmxpYyBPYmplY3RbXSBjcmVhdGUoSUNyZWF0ZUNvbnRleHQgY29udGV4dCkgewotCQlMaXN0PFNoYXBlPiBzaGFwZXMgPSB0aGlzLmdldEZlYXR1cmVQcm92aWRlcigpLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCkuZ2V0Q2hpbGRyZW4oKTsKLQkJSVByb2plY3QgdGFyZ2V0UHJvamVjdCA9IG51bGw7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IG51bGw7Ci0JCWlmICgoc2hhcGVzID09IG51bGwpIHx8IChzaGFwZXMuc2l6ZSgpID09IDApKSB7Ci0JCQlqcGFQcm9qZWN0ID0gZ2V0VGFyZ2V0SlBBUHJvamVjdCgpOwotCQkJdGFyZ2V0UHJvamVjdCA9IGpwYVByb2plY3QuZ2V0UHJvamVjdCgpOwotCQl9IGVsc2UgewotCQkJU2hhcGUgc2ggPSBzaGFwZXMuZ2V0KDApOwotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHNoKTsKLQkJCWlmIChqcHQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotCQkJanBhUHJvamVjdCA9IGpwdC5nZXRKcGFQcm9qZWN0KCk7Ci0JCQl0YXJnZXRQcm9qZWN0ID0ganBhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0JCX0gICAgCQotCQlTdHJpbmcgZW50aXR5TmFtZSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldEpQQUVkaXRvclV0aWwoKS4KLQkJCQkJCQkJZ2VuZXJhdGVVbmlxdWVFbnRpdHlOYW1lKGpwYVByb2plY3QsIAotCQkJCQkJCQkJCQkJCQkgSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5nZXREZWZhdWx0UGFja2FnZShqcGFQcm9qZWN0LmdldFByb2plY3QoKSksIAotCQkJCQkJCQkJCQkJCQkgZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOyAKLQotCQlpZighSlBBRWRpdG9yVXRpbC5jaGVja0lzU2V0UGVyc2lzdGVuY2VQcm92aWRlckxpYnJhcnkoanBhUHJvamVjdCkpewotCQkJU2hlbGwgc2hlbGwgPSBKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpQQURpYWdyYW1FZGl0b3IuSUQsIEpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZUpQQUVudGl0eUZlYXR1cmVfY3JlYXRlRW50aXR5RXJyb3JTdGF0dXNNc2cpOwotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVKUEFFbnRpdHlGZWF0dXJlX2NyZWF0ZUVudGl0eUVycm9yTXNnVGl0bGUsIAotCQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVKUEFFbnRpdHlGZWF0dXJlX2NyZWF0ZUVudGl0eUVycm9yTXNnLCBzdGF0dXMpOwotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7fTsKLQkJfQotCQkKLQkJaWYgKCFKcHRKcGFDb3JlUGx1Z2luLmdldERpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlcyh0YXJnZXRQcm9qZWN0KSkgewotCQkJSlBBRWRpdG9yVXRpbC5jcmVhdGVSZWdpc3RlckVudGl0eUluWE1MSm9iKGpwYVByb2plY3QsIGVudGl0eU5hbWUpOwotCQl9Ci0JCQotCQl0cnkgewotCQkJaWYgKG1hcHBlZFN1cGVyY2xhc3MgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0RmVhdHVyZVByb3ZpZGVyKCkuCi0JCQkJZ2V0SlBBRWRpdG9yVXRpbCgpLgotCQkJCQljcmVhdGVFbnRpdHlJblByb2plY3QodGFyZ2V0UHJvamVjdCwgZW50aXR5TmFtZSwgbWFwcGVkU3VwZXJjbGFzcyk7CS8vJE5PTi1OTFMtMSQJCQkJCQkJCQotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmdldEZlYXR1cmVQcm92aWRlcigpLgotCQkJCWdldEpQQUVkaXRvclV0aWwoKS4KLQkJCQkJY3JlYXRlRW50aXR5SW5Qcm9qZWN0KHRhcmdldFByb2plY3QsIGVudGl0eU5hbWUsIGpwYVByZWZlcmVuY2VTdG9yZSwgCi0JCQkJCQkJCQkJICBpc01hcHBlZFN1cGVyY2xhc3NDaGlsZCwgbWFwcGVkU3VwZXJjbGFzc05hbWUsIAotCQkJCQkJCQkJCSAgbWFwcGVkU3VwZXJjbGFzc1BhY2thZ2UsICJpZCIsIHN1cGVySGFzUHJpbWFyeWtleSk7CS8vJE5PTi1OTFMtMSQJCQkJCi0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IGNyZWF0ZSBhbiBlbnRpdHkgaW4gdGhlIHByb2plY3QgIiArIHRhcmdldFByb2plY3QuZ2V0TmFtZSgpLCBlMSk7ICAvLyROT04tTkxTLTEkCQkgCi0JCX0KLQkJCi0JCQotCQl0cnkgewotCQkJanBhUHJvamVjdC5nZXRQcm9qZWN0KCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCByZWZyZXNoIHRoZSBwcm9qZWN0IiwgZTEpOyAgLy8kTk9OLU5MUy0xJAkJIAotCQl9Ci0JCQotCQlMaXN0SXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0PiBsaXQgPSBqcGFQcm9qZWN0LmdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuaXRlcmF0b3IoKTsJCQotCQlQZXJzaXN0ZW5jZVVuaXQgcHUgPSBsaXQubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlwdS5nZXRQZXJzaXN0ZW50VHlwZShlbnRpdHlOYW1lKTsKLQotCQlpbnQgY250ID0gMDsKLQkJd2hpbGUgKChqcHQgPT0gbnVsbCkgJiYgKGNudCA8IDI1KSkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJUaHJlYWQgc2xlZXAgaW50ZXJydXB0ZWQiLCBlKTsgIC8vJE5PTi1OTFMtMSQJCSAKLQkJCX0KLQkJCWpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpcHUuZ2V0UGVyc2lzdGVudFR5cGUoZW50aXR5TmFtZSk7Ci0JCQljbnQrKzsKLQkJfQkJCi0JCQotCQlpZiAoanB0ICE9IG51bGwpIHsKLQkJCWFkZEdyYXBoaWNhbFJlcHJlc2VudGF0aW9uKGNvbnRleHQsIGpwdCk7Ci0JICAgICAgICBJV29ya2JlbmNoU2l0ZSB3cyA9ICgoSUVkaXRvclBhcnQpZ2V0RGlhZ3JhbUVkaXRvcigpKS5nZXRTaXRlKCk7Ci0JICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JICAgICAgICBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRKUEFFZGl0b3JVdGlsKCkuZm9ybWF0Q29kZShjdSwgd3MpOwkJCQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IGpwdCB9OwotCQl9IGVsc2UgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiVGhlIEpQQSBlbnRpdHkgIiArIGVudGl0eU5hbWUgKyAiIGNvdWxkIG5vdCBiZSBjcmVhdGVkIiwgbmV3IEV4Y2VwdGlvbigpKTsgIC8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAkgCi0JCX0JCQotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotICAgIH0KLSAgICAgICAgCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVJbWFnZUlkKCkgewotICAgICAgICByZXR1cm4gSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5BRERfSlBBX0VOVElUWTsKLSAgICB9Ci0gICAgCi0JQE92ZXJyaWRlCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0gICAgICAgIAotICAgICAgICAKLQlwcml2YXRlIEpwYVByb2plY3QgZ2V0VGFyZ2V0SlBBUHJvamVjdCgpIHsKLQkJcmV0dXJuIGdldEZlYXR1cmVQcm92aWRlcigpLmdldE1vaW5JbnRlZ3JhdGlvblV0aWwoKS5nZXRQcm9qZWN0QnlEaWFncmFtKGdldERpYWdyYW0oKSk7Ci0JfQkJCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlSlBBRW50aXR5RnJvbU1hcHBlZFN1cGVyY2xhc3NGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVKUEFFbnRpdHlGcm9tTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M0NDJkNi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVKUEFFbnRpdHlGcm9tTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLSAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3JlYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5pbXBsLkFic3RyYWN0Q3JlYXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS5KUEFEaWFncmFtUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9ySW1hZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci0gIAotCi0KLXB1YmxpYyBjbGFzcyBDcmVhdGVKUEFFbnRpdHlGcm9tTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmUgZXh0ZW5kcwotCQlBYnN0cmFjdENyZWF0ZUZlYXR1cmUgewotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBqcGFQcmVmZXJlbmNlU3RvcmUgPSBKUEFEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JcHVibGljIENyZWF0ZUpQQUVudGl0eUZyb21NYXBwZWRTdXBlcmNsYXNzRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKAotCQkJCWZwLAotCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZUpQQUVudGl0eUZyb21NYXBwZWRTdXBlcmNsYXNzRmVhdHVyZV9jcmVhdGVJbmhlcml0ZWRFbnRpdHlGZWF0dXJlTmFtZSwKLQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVKUEFFbnRpdHlGcm9tTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmVfY3JlYXRlSW5oZXJpdGVkRW50aXR5RmVhdHVyZURlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5DcmVhdGUoSUNyZWF0ZUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gY29udGV4dC5nZXRUYXJnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIERpYWdyYW07Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGNyZWF0ZShJQ3JlYXRlQ29udGV4dCBjb250ZXh0KSB7Ci0JCUxpc3Q8U2hhcGU+IHNoYXBlcyA9IHRoaXMuZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpCi0JCQkJLmdldERpYWdyYW0oKS5nZXRDaGlsZHJlbigpOwotCQlJUHJvamVjdCB0YXJnZXRQcm9qZWN0ID0gbnVsbDsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gbnVsbDsKLQkJaWYgKChzaGFwZXMgPT0gbnVsbCkgfHwgKHNoYXBlcy5zaXplKCkgPT0gMCkpIHsKLQkJCWpwYVByb2plY3QgPSBnZXRUYXJnZXRKUEFQcm9qZWN0KCk7Ci0JCQl0YXJnZXRQcm9qZWN0ID0ganBhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlTaGFwZSBzaCA9IHNoYXBlcy5nZXQoMCk7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgZ2V0RmVhdHVyZVByb3ZpZGVyKCkKLQkJCQkJLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChzaCk7Ci0JCQlpZiAoanB0ID09IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7fTsKLQkJCWpwYVByb2plY3QgPSBqcHQuZ2V0SnBhUHJvamVjdCgpOwotCQkJdGFyZ2V0UHJvamVjdCA9IGpwYVByb2plY3QuZ2V0UHJvamVjdCgpOwotCQl9Ci0JCQotCQlTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc05hbWUgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKQotCQkJCS5nZXRKUEFFZGl0b3JVdGlsKCkKLQkJCQkuZ2VuZXJhdGVVbmlxdWVNYXBwZWRTdXBlcmNsYXNzTmFtZSgKLQkJCQkJCWpwYVByb2plY3QsCi0JCQkJCQlKUEFEaWFncmFtUHJvcGVydHlQYWdlLmdldERlZmF1bHRQYWNrYWdlKGpwYVByb2plY3QuZ2V0UHJvamVjdCgpKSwKLQkJCQkJCWdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJCi0JCWlmICghSnB0SnBhQ29yZVBsdWdpbi5nZXREaXNjb3ZlckFubm90YXRlZENsYXNzZXMoanBhUHJvamVjdC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQlKUEFFZGl0b3JVdGlsLmNyZWF0ZVJlZ2lzdGVyRW50aXR5SW5YTUxKb2IoanBhUHJvamVjdCwgbWFwcGVkU3VwZXJjbGFzc05hbWUpOwotCQl9Ci0JCQkJCi0KLQkJdHJ5IHsKLQkJCXRoaXMuZ2V0RmVhdHVyZVByb3ZpZGVyKCkKLQkJCQkJLmdldEpQQUVkaXRvclV0aWwoKQotCQkJCQkuY3JlYXRlRW50aXR5RnJvbU1hcHBlZFN1cGVyY2xhc3NJblByb2plY3QodGFyZ2V0UHJvamVjdCwKLQkJCQkJCQltYXBwZWRTdXBlcmNsYXNzTmFtZSwganBhUHJlZmVyZW5jZVN0b3JlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3QgY3JlYXRlIGFuIGVudGl0eSBpbiB0aGUgcHJvamVjdCAiICsgdGFyZ2V0UHJvamVjdC5nZXROYW1lKCksIGUxKTsgIC8vJE5PTi1OTFMtMSQJCSAKLQkJfQotCQkKLQkJQ3JlYXRlSlBBRW50aXR5RmVhdHVyZSBjcmVhdGVFbnRpdHlGZWF0dXJlID0gbmV3IENyZWF0ZUpQQUVudGl0eUZlYXR1cmUoCi0JCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCksIHRydWUsIG1hcHBlZFN1cGVyY2xhc3NOYW1lKTsKLQkJcmV0dXJuIGNyZWF0ZUVudGl0eUZlYXR1cmUuY3JlYXRlKGNvbnRleHQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlSW1hZ2VJZCgpIHsKLQkJcmV0dXJuIEpQQUVkaXRvckltYWdlUHJvdmlkZXIuQUREX0lOSEVSSVRFRF9FTlRJVFk7Ci0JfQotCi0KLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcikgc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBKcGFQcm9qZWN0IGdldFRhcmdldEpQQVByb2plY3QoKSB7Ci0JCXJldHVybiBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRNb2luSW50ZWdyYXRpb25VdGlsKCkKLQkJCQkuZ2V0UHJvamVjdEJ5RGlhZ3JhbShnZXREaWFncmFtKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlTWFueVRvTWFueUJpRGlyUmVsYXRpb25GZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVNYW55VG9NYW55QmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg2MWZiZi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVNYW55VG9NYW55QmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JJbWFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5NYW55VG9NYW55QmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIENyZWF0ZU1hbnlUb01hbnlCaURpclJlbGF0aW9uRmVhdHVyZSBleHRlbmRzIENyZWF0ZU1hbnlUb01hbnlSZWxhdGlvbkZlYXR1cmUgCi0JCQkJCQkJCQkJCQkgIGltcGxlbWVudHMgSUNyZWF0ZUJpRGlyUmVsYXRpb25GZWF0dXJlIHsKLQotCXB1YmxpYyBDcmVhdGVNYW55VG9NYW55QmlEaXJSZWxhdGlvbkZlYXR1cmUoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCwgSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlTWFueVRvTWFueUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb01hbnlCaURpckZlYXR1cmVOYW1lLCAgCi0JCQkJSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlTWFueVRvTWFueUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb01hbnlVbmlEaXJGZWF0dXJlRGVzY3JpcHRpb24pOyAKLQl9Ci0JCQotCUBPdmVycmlkZQotCXB1YmxpYyBNYW55VG9NYW55QmlEaXJSZWxhdGlvbiBjcmVhdGVSZWxhdGlvbihJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBQaWN0b2dyYW1FbGVtZW50IHNvdXJjZSwgUGljdG9ncmFtRWxlbWVudCB0YXJnZXQpIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyID0gKEphdmFQZXJzaXN0ZW50VHlwZSkoZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHNvdXJjZSkpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgaW52ZXJzZSA9IChKYXZhUGVyc2lzdGVudFR5cGUpKGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudCh0YXJnZXQpKTsJCQotCQkKLQkJU3RyaW5nIG93bmVyQXR0cmlidXRlTmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKGludmVyc2UpKTsKLQkJU3RyaW5nIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IG93bmVyQXR0cmlidXRlTmFtZTsKLQkJaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKG93bmVyKSkKLQkJCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShvd25lckF0dHJpYnV0ZU5hbWUpOwotCQlTdHJpbmcgb3duZXJBdHRyaWJ1dGVUZXh0ID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsJCQotCi0JCVN0cmluZyBpbnZlcnNlQXR0cmlidXRlTmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKG93bmVyKSk7Ci0JCVN0cmluZyBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIyID0gaW52ZXJzZUF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChpbnZlcnNlKSkKLQkJCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcjIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoaW52ZXJzZUF0dHJpYnV0ZU5hbWUpOwotCQlTdHJpbmcgaW52ZXJzZUF0dHJpYnV0ZVRleHQgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKGludmVyc2UsIG93bmVyQXR0cmlidXRlVGV4dCwgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyMik7CQkKLQkJCi0JCU1hbnlUb01hbnlCaURpclJlbGF0aW9uIHJlbCA9IG5ldyBNYW55VG9NYW55QmlEaXJSZWxhdGlvbihmcCwgb3duZXIsIGludmVyc2UsIG93bmVyQXR0cmlidXRlVGV4dCwgaW52ZXJzZUF0dHJpYnV0ZVRleHQsIHRydWUsIAotCQkJCWdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChvd25lciksCi0JCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KGludmVyc2UpKTsgCi0JCXJldHVybiByZWw7CQkKLQotCX0JCi0JCi0gICAgcHVibGljIFN0cmluZyBnZXRDcmVhdGVJbWFnZUlkKCkgewotICAgICAgICByZXR1cm4gSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX01BTllfVE9fTUFOWV8yX0RJUjsKLSAgICB9CQkJCQkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVNYW55VG9NYW55UmVsYXRpb25GZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVNYW55VG9NYW55UmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDA0MGYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlTWFueVRvTWFueVJlbGF0aW9uRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotCi0KLWFic3RyYWN0IGNsYXNzIENyZWF0ZU1hbnlUb01hbnlSZWxhdGlvbkZlYXR1cmUgCi0JCWV4dGVuZHMJQ3JlYXRlUmVsYXRpb25GZWF0dXJlIHsKLQotCXB1YmxpYyBDcmVhdGVNYW55VG9NYW55UmVsYXRpb25GZWF0dXJlKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIoZnAsIG5hbWUsIGRlc2NyaXB0aW9uKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVNYW55VG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVNYW55VG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZjViZDMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlTWFueVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvckltYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIENyZWF0ZU1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmUgZXh0ZW5kcyBDcmVhdGVNYW55VG9NYW55UmVsYXRpb25GZWF0dXJlIAotCQkJCQkJCQkJCQkJICAgaW1wbGVtZW50cyBJQ3JlYXRlVW5pRGlyUmVsYXRpb25GZWF0dXJlIHsKLQotCXB1YmxpYyBDcmVhdGVNYW55VG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnAsIEpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZU1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmVfbWFueVRvTWFueVVuaURpckZlYXR1cmVOYW1lLCAKLQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVNYW55VG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb01hbnlVbmlEaXJGZWF0dXJlRGVzY3JpcHRpb24pOyAKLQl9Ci0JCQotCUBPdmVycmlkZQotCXB1YmxpYyBNYW55VG9NYW55VW5pRGlyUmVsYXRpb24gY3JlYXRlUmVsYXRpb24oSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgUGljdG9ncmFtRWxlbWVudCBzb3VyY2UsIFBpY3RvZ3JhbUVsZW1lbnQgdGFyZ2V0KSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBvd25lciA9IChKYXZhUGVyc2lzdGVudFR5cGUpKGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChzb3VyY2UpKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKShnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQodGFyZ2V0KSk7CQkKLQotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKGludmVyc2UpKTsKLQkJU3RyaW5nIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IGF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChvd25lcikpCi0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlTmFtZSk7Ci0JCVN0cmluZyBhdHRyaWJ1dGVUZXh0ID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsJCQotCQlNYW55VG9NYW55VW5pRGlyUmVsYXRpb24gcmVsYXRpb24gPSBuZXcgTWFueVRvTWFueVVuaURpclJlbGF0aW9uKGZwLCBvd25lciwgaW52ZXJzZSwgYXR0cmlidXRlVGV4dCwgdHJ1ZSwgCi0JCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KG93bmVyKSwKLQkJCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRDb21waWxhdGlvblVuaXQoaW52ZXJzZSkpOyAKLQkJcmV0dXJuIHJlbGF0aW9uOwkJCi0JfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDcmVhdGVJbWFnZUlkKCkgewotICAgICAgICByZXR1cm4gSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX01BTllfVE9fTUFOWV8xX0RJUjsKLSAgICB9CQkJCQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlTWFueVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU1hbnlUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOWUyYjguLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlTWFueVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JJbWFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5NYW55VG9PbmVCaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTWFueVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmUgZXh0ZW5kcyBDcmVhdGVNYW55VG9PbmVSZWxhdGlvbkZlYXR1cmUgCi0JCQkJCQkJCQkJCQkgaW1wbGVtZW50cyBJQ3JlYXRlQmlEaXJSZWxhdGlvbkZlYXR1cmUgewotCi0JcHVibGljIENyZWF0ZU1hbnlUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnAsIEpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZU1hbnlUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZUJpRGlyRmVhdHVyZU5hbWUsICAKLQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVNYW55VG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZV9tYW55VG9PbmVCaURpckZlYXR1cmVEZXNjcmlwdGlvbik7Ci0JfQotCQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTWFueVRvT25lQmlEaXJSZWxhdGlvbiBjcmVhdGVSZWxhdGlvbihJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBQaWN0b2dyYW1FbGVtZW50IHNvdXJjZSwgCi0JCQlQaWN0b2dyYW1FbGVtZW50IHRhcmdldCkgewotCQlKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKShnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoc291cmNlKSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlID0gKEphdmFQZXJzaXN0ZW50VHlwZSkoZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHRhcmdldCkpOwkJCi0JCQotCQlTdHJpbmcgb3duZXJBdHRyaWJ1dGVOYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUoaW52ZXJzZSkpOwotCQlTdHJpbmcgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gb3duZXJBdHRyaWJ1dGVOYW1lOwotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQob3duZXIpKQotCQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKG93bmVyQXR0cmlidXRlTmFtZSk7Ci0JCVN0cmluZyBvd25lckF0dHJpYnV0ZVRleHQgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKG93bmVyLCBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIpOwkJCi0KLQkJU3RyaW5nIGludmVyc2VBdHRyaWJ1dGVOYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUob3duZXIpKTsKLQkJU3RyaW5nIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcjIgPSBpbnZlcnNlQXR0cmlidXRlTmFtZTsKLQkJaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKGludmVyc2UpKQotCQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyMiA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShpbnZlcnNlQXR0cmlidXRlTmFtZSk7Ci0JCVN0cmluZyBpbnZlcnNlQXR0cmlidXRlVGV4dCA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUoaW52ZXJzZSwgb3duZXJBdHRyaWJ1dGVUZXh0LCBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIyKTsJCQotCQkKLQkJTWFueVRvT25lQmlEaXJSZWxhdGlvbiByZWwgPSBuZXcgTWFueVRvT25lQmlEaXJSZWxhdGlvbihmcCwgb3duZXIsIGludmVyc2UsIG93bmVyQXR0cmlidXRlVGV4dCwgaW52ZXJzZUF0dHJpYnV0ZVRleHQsIHRydWUsIAotCQkJCWdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChvd25lciksCi0JCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KGludmVyc2UpKTsgCi0JCXJldHVybiByZWw7CQkKLQl9Ci0JCi0gICAgcHVibGljIFN0cmluZyBnZXRDcmVhdGVJbWFnZUlkKCkgewotICAgICAgICByZXR1cm4gSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX01BTllfVE9fT05FXzJfRElSOwotICAgIH0JCQkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU1hbnlUb09uZVJlbGF0aW9uRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlTWFueVRvT25lUmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMWM5ZWMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlTWFueVRvT25lUmVsYXRpb25GZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci0KLWFic3RyYWN0IGNsYXNzIENyZWF0ZU1hbnlUb09uZVJlbGF0aW9uRmVhdHVyZSAKLQkJZXh0ZW5kcwlDcmVhdGVSZWxhdGlvbkZlYXR1cmUgewotCi0JcHVibGljIENyZWF0ZU1hbnlUb09uZVJlbGF0aW9uRmVhdHVyZShJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGZwLCBuYW1lLCBkZXNjcmlwdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVNYW55VG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU1hbnlUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzU1YWE2Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU1hbnlUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvckltYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb09uZVVuaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTWFueVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlIGV4dGVuZHMgQ3JlYXRlTWFueVRvT25lUmVsYXRpb25GZWF0dXJlIAotCQkJCQkJCQkJCQkJICBpbXBsZW1lbnRzIElDcmVhdGVVbmlEaXJSZWxhdGlvbkZlYXR1cmUgewotCi0JcHVibGljIENyZWF0ZU1hbnlUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZShJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwLCBKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVNYW55VG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmVfbWFueVRvT25lVW5pRGlyRmVhdHVyZU5hbWUsICAKLQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVNYW55VG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmVfbWFueVRvT25lVW5pRGlyRmVhdHVyZURlc2NyaXB0aW9uKTsKLQl9Ci0JCQotCUBPdmVycmlkZQotCXB1YmxpYyBNYW55VG9PbmVVbmlEaXJSZWxhdGlvbiBjcmVhdGVSZWxhdGlvbihJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBQaWN0b2dyYW1FbGVtZW50IHNvdXJjZSwgUGljdG9ncmFtRWxlbWVudCB0YXJnZXQpIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyID0gKEphdmFQZXJzaXN0ZW50VHlwZSkoZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHNvdXJjZSkpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgaW52ZXJzZSA9IChKYXZhUGVyc2lzdGVudFR5cGUpKGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudCh0YXJnZXQpKTsKLQkJCi0JCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUoaW52ZXJzZSkpOwotCQlTdHJpbmcgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gYXR0cmlidXRlTmFtZTsKLQkJaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKG93bmVyKSkKLQkJCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShhdHRyaWJ1dGVOYW1lKTsKLQkJU3RyaW5nIGF0dHJpYnV0ZVRleHQgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKG93bmVyLCBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIpOwkJCi0JCU1hbnlUb09uZVVuaURpclJlbGF0aW9uIHJlbGF0aW9uID0gbmV3IE1hbnlUb09uZVVuaURpclJlbGF0aW9uKGZwLCBvd25lciwgaW52ZXJzZSwgYXR0cmlidXRlVGV4dCwgdHJ1ZSwgCi0JCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KG93bmVyKSwKLQkJCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRDb21waWxhdGlvblVuaXQoaW52ZXJzZSkpOwotCQlyZXR1cm4gcmVsYXRpb247Ci0JfQotCQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlSW1hZ2VJZCgpIHsKLSAgICAgICAgcmV0dXJuIEpQQUVkaXRvckltYWdlUHJvdmlkZXIuSUNPTl9NQU5ZX1RPX09ORV8xX0RJUjsKLSAgICB9CQkJCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU1hcHBlZFN1cGVyY2xhc3NGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YjQ1OGQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDcmVhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmltcGwuQWJzdHJhY3RDcmVhdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuSlBBRGlhZ3JhbVByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvckltYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotICAKLQotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmUgZXh0ZW5kcwotCQlBYnN0cmFjdENyZWF0ZUZlYXR1cmUgewotCi0JcHVibGljIENyZWF0ZU1hcHBlZFN1cGVyY2xhc3NGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoCi0JCQkJZnAsCi0JCQkJSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmVfY3JlYXRlTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmVOYW1lLAotCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZU1hcHBlZFN1cGVyY2xhc3NGZWF0dXJlX2NyZWF0ZU1hcHBlZFN1cGVyY2xhc3NGZWF0dXJlRGVzY3JpcHRpb24pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkNyZWF0ZShJQ3JlYXRlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBjb250ZXh0LmdldFRhcmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgRGlhZ3JhbTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gY3JlYXRlKElDcmVhdGVDb250ZXh0IGNvbnRleHQpIHsKLQkJTGlzdDxTaGFwZT4gc2hhcGVzID0gdGhpcy5nZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkKLQkJCQkuZ2V0RGlhZ3JhbSgpLmdldENoaWxkcmVuKCk7Ci0JCUlQcm9qZWN0IHRhcmdldFByb2plY3QgPSBudWxsOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBudWxsOwotCQlpZiAoKHNoYXBlcyA9PSBudWxsKSB8fCAoc2hhcGVzLnNpemUoKSA9PSAwKSkgewotCQkJanBhUHJvamVjdCA9IGdldFRhcmdldEpQQVByb2plY3QoKTsKLQkJCXRhcmdldFByb2plY3QgPSBqcGFQcm9qZWN0LmdldFByb2plY3QoKTsKLQkJfSBlbHNlIHsKLQkJCVNoYXBlIHNoID0gc2hhcGVzLmdldCgwKTsKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBnZXRGZWF0dXJlUHJvdmlkZXIoKQotCQkJCQkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHNoKTsKLQkJCWlmIChqcHQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotCQkJanBhUHJvamVjdCA9IGpwdC5nZXRKcGFQcm9qZWN0KCk7Ci0JCQl0YXJnZXRQcm9qZWN0ID0ganBhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJCi0JCVN0cmluZyBtYXBwZWRTdXBlcmNsYXNzTmFtZSA9IGdldEZlYXR1cmVQcm92aWRlcigpCi0JCQkJLmdldEpQQUVkaXRvclV0aWwoKQotCQkJCS5nZW5lcmF0ZVVuaXF1ZU1hcHBlZFN1cGVyY2xhc3NOYW1lKAotCQkJCQkJanBhUHJvamVjdCwKLQkJCQkJCUpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuZ2V0RGVmYXVsdFBhY2thZ2UoanBhUHJvamVjdC5nZXRQcm9qZWN0KCkpLAotCQkJCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQkKLQkJaWYgKCFKcHRKcGFDb3JlUGx1Z2luLmdldERpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyhqcGFQcm9qZWN0LmdldFByb2plY3QoKSkpIHsKLQkJCUpQQUVkaXRvclV0aWwuY3JlYXRlUmVnaXN0ZXJFbnRpdHlJblhNTEpvYihqcGFQcm9qZWN0LCBtYXBwZWRTdXBlcmNsYXNzTmFtZSk7Ci0JCX0KLQkJCQkKLQkJdHJ5IHsKLQkJCWdldEZlYXR1cmVQcm92aWRlcigpLmdldEpQQUVkaXRvclV0aWwoKS5jcmVhdGVNYXBwZWRTdXBlcmNsYXNzSW5Qcm9qZWN0KHRhcmdldFByb2plY3QsIG1hcHBlZFN1cGVyY2xhc3NOYW1lKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3QgY3JlYXRlIGEgbWFwcGVkIHN1cGVyY2xhc3MgaW4gdGhlIHByb2plY3QgIiArIHRhcmdldFByb2plY3QuZ2V0TmFtZSgpLCBlMSk7ICAvLyROT04tTkxTLTEkCQkgCi0JCX0KLS8vCQlqcGFQcm9qZWN0LnVwZGF0ZUFuZFdhaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHB1ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0UGVyc2lzdGVuY2VVbml0KGpwYVByb2plY3QpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0SlBUKG1hcHBlZFN1cGVyY2xhc3NOYW1lLCBwdSk7Ci0JCQotCQlpZiAoanB0ICE9IG51bGwpIHsKLQkJCWFkZEdyYXBoaWNhbFJlcHJlc2VudGF0aW9uKGNvbnRleHQsIGpwdCk7Ci0JICAgICAgICBJV29ya2JlbmNoU2l0ZSB3cyA9ICgoSUVkaXRvclBhcnQpZ2V0RGlhZ3JhbUVkaXRvcigpKS5nZXRTaXRlKCk7Ci0JICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JICAgICAgICBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRKUEFFZGl0b3JVdGlsKCkuZm9ybWF0Q29kZShjdSwgd3MpOwkJCQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IGpwdCB9OwotCQl9IGVsc2UgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiVGhlIG1hcHBlZCBzdXBlcmNsYXNzICIgKyAJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQltYXBwZWRTdXBlcmNsYXNzTmFtZSArICIgY291bGQgbm90IGJlIGNyZWF0ZWQiLCBuZXcgRXhjZXB0aW9uKCkpOwkvLyROT04tTkxTLTEkCSAKLQkJfQkJCQkKLQotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlSW1hZ2VJZCgpIHsKLQkJcmV0dXJuIEpQQUVkaXRvckltYWdlUHJvdmlkZXIuQUREX01BUFBFRF9TVVBFUkNMQVNTOwotCX0KLQotCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpIHN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQotCXByaXZhdGUgSnBhUHJvamVjdCBnZXRUYXJnZXRKUEFQcm9qZWN0KCkgewotCQlyZXR1cm4gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0TW9pbkludGVncmF0aW9uVXRpbCgpCi0JCQkJLmdldFByb2plY3RCeURpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU9uZVRvTWFueVJlbGF0aW9uRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlT25lVG9NYW55UmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZWMyZDEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlT25lVG9NYW55UmVsYXRpb25GZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci0KLWFic3RyYWN0IGNsYXNzIENyZWF0ZU9uZVRvTWFueVJlbGF0aW9uRmVhdHVyZSAKLQkJZXh0ZW5kcwlDcmVhdGVSZWxhdGlvbkZlYXR1cmUgewotCi0JcHVibGljIENyZWF0ZU9uZVRvTWFueVJlbGF0aW9uRmVhdHVyZShJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGZwLCBuYW1lLCBkZXNjcmlwdGlvbik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlT25lVG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVPbmVUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0YzBiNy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVPbmVUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JJbWFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5PbmVUb01hbnlVbmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIENyZWF0ZU9uZVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZSBleHRlbmRzIENyZWF0ZU9uZVRvTWFueVJlbGF0aW9uRmVhdHVyZSAKLQkJCQkJCQkJCQkJCSAgaW1wbGVtZW50cyBJQ3JlYXRlVW5pRGlyUmVsYXRpb25GZWF0dXJlIHsKLQotCXB1YmxpYyBDcmVhdGVPbmVUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmUoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCwgSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlT25lVG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvTWFueVVuaURpckZlYXR1cmVOYW1lLCAgCi0JCQkJSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlT25lVG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvTWFueVVuaURpckZlYXR1cmVEZXNjcmlwdGlvbik7IAotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHVibGljIE9uZVRvTWFueVVuaURpclJlbGF0aW9uIGNyZWF0ZVJlbGF0aW9uKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIFBpY3RvZ3JhbUVsZW1lbnQgc291cmNlLCAKLQkJCVBpY3RvZ3JhbUVsZW1lbnQgdGFyZ2V0KSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBvd25lciA9IChKYXZhUGVyc2lzdGVudFR5cGUpKGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChzb3VyY2UpKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKShnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQodGFyZ2V0KSk7CQotCQkJCQotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKGludmVyc2UpKTsKLQkJU3RyaW5nIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IGF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChvd25lcikpCi0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlTmFtZSk7Ci0JCQotCQlTdHJpbmcgYXR0cmlidXRlVGV4dCA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7CQkKLQkJT25lVG9NYW55VW5pRGlyUmVsYXRpb24gcmVsYXRpb24gPSBuZXcgT25lVG9NYW55VW5pRGlyUmVsYXRpb24oZnAsIG93bmVyLCBpbnZlcnNlLCBhdHRyaWJ1dGVUZXh0LCB0cnVlLCAKLQkJCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRDb21waWxhdGlvblVuaXQob3duZXIpLAotCQkJCWdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChpbnZlcnNlKSk7Ci0JCXJldHVybiByZWxhdGlvbjsJCi0JfQkKLQkKLSAgICBwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUltYWdlSWQoKSB7Ci0gICAgICAgIHJldHVybiBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLklDT05fT05FX1RPX01BTllfMV9ESVI7Ci0gICAgfQkJCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlT25lVG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlT25lVG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjY0YWYyLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU9uZVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JJbWFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5PbmVUb09uZUJpRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBDcmVhdGVPbmVUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlIGV4dGVuZHMgQ3JlYXRlT25lVG9PbmVSZWxhdGlvbkZlYXR1cmUKLQkJCQkJCQkJCQkJCWltcGxlbWVudHMgSUNyZWF0ZUJpRGlyUmVsYXRpb25GZWF0dXJlIHsKLQkKLQlwdWJsaWMgQ3JlYXRlT25lVG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZShJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwLCBKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVPbmVUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lQmlEaXJGZWF0dXJlTmFtZSwgIAotCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZU9uZVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmVfb25lVG9PbmVCaURpckZlYXR1cmVEZXNjcmlwdGlvbik7IAotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHVibGljIE9uZVRvT25lQmlEaXJSZWxhdGlvbiBjcmVhdGVSZWxhdGlvbihJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBQaWN0b2dyYW1FbGVtZW50IHNvdXJjZSwgCi0JCQlQaWN0b2dyYW1FbGVtZW50IHRhcmdldCkgewotCQlKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKShnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoc291cmNlKSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlID0gKEphdmFQZXJzaXN0ZW50VHlwZSkoZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHRhcmdldCkpOwkJCi0JCi0JCVN0cmluZyBvd25lckF0dHJpYnV0ZU5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShpbnZlcnNlKSk7Ci0JCVN0cmluZyBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBvd25lckF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChvd25lcikpCi0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUob3duZXJBdHRyaWJ1dGVOYW1lKTsKLQkJU3RyaW5nIG93bmVyQXR0cmlidXRlVGV4dCA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7CQkKLQotCQlTdHJpbmcgaW52ZXJzZUF0dHJpYnV0ZU5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShvd25lcikpOwotCQlTdHJpbmcgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyMiA9IGludmVyc2VBdHRyaWJ1dGVOYW1lOwotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQoaW52ZXJzZSkpCi0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKGludmVyc2VBdHRyaWJ1dGVOYW1lKTsKLQkJU3RyaW5nIGludmVyc2VBdHRyaWJ1dGVUZXh0ID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShpbnZlcnNlLCBvd25lckF0dHJpYnV0ZVRleHQsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcjIpOwkJCi0JCQotCQlPbmVUb09uZUJpRGlyUmVsYXRpb24gcmVsID0gbmV3IE9uZVRvT25lQmlEaXJSZWxhdGlvbihmcCwgb3duZXIsIGludmVyc2UsIG93bmVyQXR0cmlidXRlVGV4dCwgaW52ZXJzZUF0dHJpYnV0ZVRleHQsIHRydWUsIAotCQkJCWdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChvd25lciksCi0JCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KGludmVyc2UpKTsgCi0JCXJldHVybiByZWw7CQkKLQl9Ci0JCi0gICAgcHVibGljIFN0cmluZyBnZXRDcmVhdGVJbWFnZUlkKCkgewotICAgICAgICByZXR1cm4gSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX09ORV9UT19PTkVfMl9ESVI7Ci0gICAgfQkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVPbmVUb09uZVJlbGF0aW9uRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlT25lVG9PbmVSZWxhdGlvbkZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRiOWZlYS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVPbmVUb09uZVJlbGF0aW9uRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotCi1hYnN0cmFjdCBjbGFzcyBDcmVhdGVPbmVUb09uZVJlbGF0aW9uRmVhdHVyZSAKLQkJZXh0ZW5kcyBDcmVhdGVSZWxhdGlvbkZlYXR1cmUgewotCQotCXB1YmxpYyBDcmVhdGVPbmVUb09uZVJlbGF0aW9uRmVhdHVyZShJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGZwLCBuYW1lLCBkZXNjcmlwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlT25lVG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU9uZVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMWQ3NjYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlT25lVG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JJbWFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5PbmVUb09uZVVuaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlT25lVG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmUgZXh0ZW5kcyBDcmVhdGVPbmVUb09uZVJlbGF0aW9uRmVhdHVyZQotCQkJCQkJCQkJCQkJIGltcGxlbWVudHMgSUNyZWF0ZVVuaURpclJlbGF0aW9uRmVhdHVyZSB7Ci0JCi0JcHVibGljIENyZWF0ZU9uZVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnAsIEpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZU9uZVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lVW5pRGlyRmVhdHVyZU5hbWUsIAotCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZU9uZVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lVW5pRGlyRmVhdHVyZURlc2NyaXB0aW9uKTsgCi0JfQotCQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT25lVG9PbmVVbmlEaXJSZWxhdGlvbiBjcmVhdGVSZWxhdGlvbihJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBQaWN0b2dyYW1FbGVtZW50IHNvdXJjZSwgCi0JCQkJCQkJCQkJCQkJCVBpY3RvZ3JhbUVsZW1lbnQgdGFyZ2V0KSB7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKShnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoc291cmNlKSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlID0gKEphdmFQZXJzaXN0ZW50VHlwZSkoZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHRhcmdldCkpOwotCQkKLQkJU3RyaW5nIG5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShpbnZlcnNlKSk7Ci0JCVN0cmluZyBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBuYW1lOwotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQob3duZXIpKQotCQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKG5hbWUpOwotCQlTdHJpbmcgYXR0cmliVHh0ID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsJCQotCQlPbmVUb09uZVVuaURpclJlbGF0aW9uIHJlcyA9IG5ldyBPbmVUb09uZVVuaURpclJlbGF0aW9uKGZwLCBvd25lciwgaW52ZXJzZSwgYXR0cmliVHh0LCB0cnVlLCAKLQkJCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRDb21waWxhdGlvblVuaXQob3duZXIpLAotCQkJCWdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChpbnZlcnNlKSk7Ci0JCXJldHVybiByZXM7Ci0JfQotCQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlSW1hZ2VJZCgpIHsKLSAgICAgICAgcmV0dXJuIEpQQUVkaXRvckltYWdlUHJvdmlkZXIuSUNPTl9PTkVfVE9fT05FXzFfRElSOwotICAgIH0JCi0JCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZVJlbGF0aW9uRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlUmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MTQyOTMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlUmVsYXRpb25GZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDcmVhdGVDb25uZWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQWRkQ29ubmVjdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdENyZWF0ZUNvbm5lY3Rpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuQWJzdHJhY3RSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQ3JlYXRlUmVsYXRpb25GZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RDcmVhdGVDb25uZWN0aW9uRmVhdHVyZSB7Ci0KLQlwdWJsaWMgQ3JlYXRlUmVsYXRpb25GZWF0dXJlKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIoZnAsIG5hbWUsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5DcmVhdGUoSUNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyID0gKEphdmFQZXJzaXN0ZW50VHlwZSlnZXRQZXJzaXN0ZW50VHlwZShjb250ZXh0LmdldFNvdXJjZUFuY2hvcigpKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWdldFBlcnNpc3RlbnRUeXBlKGNvbnRleHQuZ2V0VGFyZ2V0QW5jaG9yKCkpOwotCSAgICBpZiAoKG93bmVyID09IG51bGwpIHx8IChpbnZlcnNlID09IG51bGwpKSAKLQkgICAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmhhc01hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKGludmVyc2UpKQotCSAgICAJcmV0dXJuIGZhbHNlOwotCSAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBJQ3JlYXRlQmlEaXJSZWxhdGlvbkZlYXR1cmUpICYmIAotCSAgICAJKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmhhc01hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKG93bmVyKSkpCi0JICAgIAlyZXR1cm4gZmFsc2U7Ci0JICAgIHJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblN0YXJ0Q29ubmVjdGlvbihJQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQgY29udGV4dCkgewotCQlKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWdldFBlcnNpc3RlbnRUeXBlKGNvbnRleHQuZ2V0U291cmNlQW5jaG9yKCkpOyAKLQkgICAgaWYgKG93bmVyID09IG51bGwpIAotCSAgICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBJQ3JlYXRlQmlEaXJSZWxhdGlvbkZlYXR1cmUpICYmCi0JICAgIAlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5oYXNNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbihvd25lcikpCi0JICAgIAlyZXR1cm4gZmFsc2U7Ci0JICAgIHJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgQ29ubmVjdGlvbiBjcmVhdGUoSUNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0IGNvbnRleHQpIHsKLQkgICAgQ29ubmVjdGlvbiBuZXdDb25uZWN0aW9uID0gbnVsbDsKLQkgICAgUGVyc2lzdGVudFR5cGUgb3duZXIgPSBnZXRQZXJzaXN0ZW50VHlwZShjb250ZXh0LmdldFNvdXJjZUFuY2hvcigpKTsKLQkgICAgUGVyc2lzdGVudFR5cGUgaW52ZXJzZSA9IGdldFBlcnNpc3RlbnRUeXBlKGNvbnRleHQuZ2V0VGFyZ2V0QW5jaG9yKCkpOwotCSAgICBpZiAob3duZXIgIT0gbnVsbCAmJiBpbnZlcnNlICE9IG51bGwpIHsKLQkgICAgCUFic3RyYWN0UmVsYXRpb24gcmVsID0gY3JlYXRlUmVsYXRpb24oZ2V0RmVhdHVyZVByb3ZpZGVyKCksIGNvbnRleHQuZ2V0U291cmNlQW5jaG9yKCkuZ2V0UGFyZW50KCksIAotCSAgICAJCQkJCQkJCQkJCQkJY29udGV4dC5nZXRUYXJnZXRBbmNob3IoKS5nZXRQYXJlbnQoKSk7Ci0JICAgICAgICBBZGRDb25uZWN0aW9uQ29udGV4dCBhZGRDb250ZXh0ID0KLQkgICAgICAgICAgICBuZXcgQWRkQ29ubmVjdGlvbkNvbnRleHQoY29udGV4dC5nZXRTb3VyY2VBbmNob3IoKSwgY29udGV4dAotCSAgICAgICAgICAgICAgICAuZ2V0VGFyZ2V0QW5jaG9yKCkpOwotCSAgICAgICAgYWRkQ29udGV4dC5zZXROZXdPYmplY3QocmVsKTsKLQkgICAgICAgIG5ld0Nvbm5lY3Rpb24gPQotCSAgICAgICAgICAgIChDb25uZWN0aW9uKSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5hZGRJZlBvc3NpYmxlKGFkZENvbnRleHQpOwotCSAgICB9ICAgIAotCSAgICByZXR1cm4gbmV3Q29ubmVjdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgUGVyc2lzdGVudFR5cGUgY2xhc3MgYmVsb25naW5nIHRvIHRoZSBhbmNob3IsIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoQW5jaG9yIGFuY2hvcikgewotCSAgICBpZiAoYW5jaG9yICE9IG51bGwpIHsKLQkgICAgICAgIE9iamVjdCByZWZPYmplY3QgPQotCSAgICAgICAgICAgIGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChhbmNob3IuZ2V0UGFyZW50KCkpOwotCSAgICAgICAgaWYgKHJlZk9iamVjdCBpbnN0YW5jZW9mIFBlcnNpc3RlbnRUeXBlKSB7Ci0JICAgICAgICAgICAgcmV0dXJuIChQZXJzaXN0ZW50VHlwZSkgcmVmT2JqZWN0OwotCSAgICAgICAgfQotCSAgICB9Ci0JICAgIHJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IE9uZVRvT25lUmVsYXRpb24gYmV0d2VlbiB0d28gUGVyc2lzdGVudFR5cGUgY2xhc3Nlcy4KLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWJzdHJhY3RSZWxhdGlvbiBjcmVhdGVSZWxhdGlvbihJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBQaWN0b2dyYW1FbGVtZW50IHNvdXJjZSwgCi0JCQkJCQkJCQkJCQkJCQkgICBQaWN0b2dyYW1FbGVtZW50IHRhcmdldCk7Ci0JCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7IAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0RlbGV0ZUpQQUVudGl0eUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0RlbGV0ZUpQQUVudGl0eUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU0ZDNhMy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9EZWxldGVKUEFFbnRpdHlGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklEZWxldGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSU11bHRpRGVsZXRlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudWkuZmVhdHVyZXMuRGVmYXVsdERlbGV0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi1wdWJsaWMgY2xhc3MgRGVsZXRlSlBBRW50aXR5RmVhdHVyZSBleHRlbmRzIERlZmF1bHREZWxldGVGZWF0dXJlIHsKLQkKLQlwcml2YXRlIFN0cmluZyBlbnRpdHlDbGFzc05hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGVudGl0eU5hbWUgPSBudWxsOwotCXB1YmxpYyBEZWxldGVKUEFFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwkJCi0JfQotCQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShmaW5hbCBJRGVsZXRlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAJCi0gICAgCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWdldEZlYXR1cmVQcm92aWRlcigpLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSk7Ci0gICAgCWVudGl0eUNsYXNzTmFtZSA9IGpwdC5nZXROYW1lKCk7Ci0gICAgCWVudGl0eU5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShqcHQpKTsKLSAgICAJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4ocGUpOwotICAgIAl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlkZWxldGVFbChjb250ZXh0KTsKLQkJCX0KLQkJfSk7Ci0gICAgCQotICAgIH0KLSAgICAJCi0gICAgcHVibGljIHZvaWQgZGVsZXRlRWwoSURlbGV0ZUNvbnRleHQgY29udGV4dCl7Ci0gICAgCXN1cGVyLmRlbGV0ZShjb250ZXh0KTsKLSAgICB9Ci0JCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVsZXRlQnVzaW5lc3NPYmplY3QoT2JqZWN0IGJvKSB7Ci0gICAgCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBudWxsOwotCQlpZiAoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLQkJCWpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGJvOwotCQkJCi0JCQotCQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0ganB0LmdldEpwYVByb2plY3QoKTsKLQkJCVN0cmluZyBuYW1lID0ganB0LmdldE5hbWUoKTsKLQkJCQotCQkJCi0JCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5mb3JjZVNhdmVFbnRpdHlDbGFzcyhqcHQsIGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmRlbGV0ZUVudGl0eUNsYXNzKGpwdCwgZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQkJaWYgKCFKcHRKcGFDb3JlUGx1Z2luLmdldERpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyhqcHQuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKSkpIHsKLQkJCQlKUEFFZGl0b3JVdGlsLmNyZWF0ZVVucmVnaXN0ZXJFbnRpdHlGcm9tWE1MSm9iKGpwYVByb2plY3QsIG5hbWUpOwotCQkJfQotCQkJCQkJCi0JCX0gCQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXN0aW9uVG9Vc2VyKCkgewotICAgIAlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSlBBRWRpdG9yTWVzc2FnZXMuRGVsZXRlSlBBRW50aXR5RmVhdHVyZV9kZWxldGVKUEFFbnRpdHlRdWVzdGlvbiwgZW50aXR5TmFtZSwgZW50aXR5Q2xhc3NOYW1lKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfQkJICAgIAotCQotCXByb3RlY3RlZCBib29sZWFuIGdldFVzZXJEZWNpc2lvbihJRGVsZXRlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVN0cmluZyBtc2cgPSAiIjsgIC8vJE5PTi1OTFMtMSQKLQkJSU11bHRpRGVsZXRlSW5mbyBtdWx0aURlbGV0ZUluZm8gPSBjb250ZXh0LmdldE11bHRpRGVsZXRlSW5mbygpOwotCQlpZiAobXVsdGlEZWxldGVJbmZvICE9IG51bGwpIHsKLQkJCW1zZyA9IEpQQUVkaXRvck1lc3NhZ2VzLkRlbGV0ZUpQQUVudGl0eUZlYXR1cmVfZGVsZXRlSlBBRW50aXRpZXNRdWVzdGlvbjsKLQkJfSBlbHNlIHsKLQkJCWlmIChlbnRpdHlDbGFzc05hbWUgIT0gbnVsbCAmJiBlbnRpdHlDbGFzc05hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSlBBRWRpdG9yTWVzc2FnZXMuRGVsZXRlSlBBRW50aXR5RmVhdHVyZV9kZWxldGVKUEFFbnRpdHlRdWVzdGlvbiwgZW50aXR5TmFtZSwgZW50aXR5Q2xhc3NOYW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkRlbGV0ZUZlYXR1cmVfZGVsZXRlQ29uZmlybSwgbXNnKTsKLQl9Ci0KLQkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9EZWxldGVSZWxhdGlvbkZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0RlbGV0ZVJlbGF0aW9uRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGMzMDFiLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0RlbGV0ZVJlbGF0aW9uRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklEZWxldGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5EZWxldGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5mZWF0dXJlcy5EZWZhdWx0RGVsZXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuQWJzdHJhY3RSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSUJpZGlyZWN0aW9uYWxSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5VbmlkaXJlY3Rpb25hbFJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi1wdWJsaWMgY2xhc3MgRGVsZXRlUmVsYXRpb25GZWF0dXJlIGV4dGVuZHMgRGVmYXVsdERlbGV0ZUZlYXR1cmV7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSUpQQUVkaXRvclV0aWwgdXQgPSBudWxsOwotCQkKLQlwdWJsaWMgRGVsZXRlUmVsYXRpb25GZWF0dXJlKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCQl1dCA9IGZwLmdldEpQQUVkaXRvclV0aWwoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuRGVsZXRlKElEZWxldGVDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKElDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoSUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9CQotCQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UXVlc3Rpb25Ub1VzZXIoKSB7Ci0gICAgCXJldHVybiBKUEFFZGl0b3JNZXNzYWdlcy5EZWxldGVSZWxhdGlvbkZlYXR1cmVfZGVsZXRlUmVsYXRpb25RdWVzdGlvbjsKLSAgICB9Ci0JCi0gICAgcHVibGljIHZvaWQgZGVsZXRlKElEZWxldGVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgUGljdG9ncmFtRWxlbWVudCBwZSA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudCgpOwotICAgICAgICBPYmplY3QgYnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50ID0gZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLSAgICAgICAgaWYgKGJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIWdldFVzZXJEZWNpc2lvbihjb250ZXh0KSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByZURlbGV0ZShjb250ZXh0KTsKLSAgICAgICAgQWJzdHJhY3RSZWxhdGlvbiByZWwgPSAoQWJzdHJhY3RSZWxhdGlvbilidXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQ7Ci0JCQotICAgICAgICBpZiAocmVsIGluc3RhbmNlb2YgVW5pZGlyZWN0aW9uYWxSZWxhdGlvbikgewotICAgICAgICAJVW5pZGlyZWN0aW9uYWxSZWxhdGlvbiByZWxhdGlvbiA9IChVbmlkaXJlY3Rpb25hbFJlbGF0aW9uKXJlbDsKLSAgICAgICAgCUNsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZSBmZWF0ID0gbmV3IENsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0gICAgCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSByZWxhdGlvbi5nZXRBbm5vdGF0ZWRBdHRyaWJ1dGUoKTsKLSAgICAJCVBpY3RvZ3JhbUVsZW1lbnQgdGV4dFNoYXBlID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGF0dHJpYnV0ZSk7Ci0gICAgCQlJRGVsZXRlQ29udGV4dCBkZWxDdHggPSBuZXcgRGVsZXRlQ29udGV4dCh0ZXh0U2hhcGUpOyAgICAJCQotICAgIAkJZmVhdC5kZWxldGUoZGVsQ3R4LCBmYWxzZSk7Ci0gICAgCX0gICAgCQotCi0gICAgICAgIGlmIChyZWwgaW5zdGFuY2VvZiBJQmlkaXJlY3Rpb25hbFJlbGF0aW9uKSB7IAkJCQotICAgICAgICAJSUJpZGlyZWN0aW9uYWxSZWxhdGlvbiByZWxhdGlvbiA9IChJQmlkaXJlY3Rpb25hbFJlbGF0aW9uKShyZWwpOwotICAgICAgICAJQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlIGZlYXQgPSBuZXcgQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLSAgICAgICAgCQotICAgIAkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBdHRyaWJ1dGUgPSByZWxhdGlvbi5nZXRPd25lckFubm90YXRlZEF0dHJpYnV0ZSgpOwotICAgIAkJUGljdG9ncmFtRWxlbWVudCBvd25lckF0dHJpYnV0ZVRleHRTaGFwZSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChvd25lckF0dHJpYnV0ZSk7Ci0gICAgCQlJRGVsZXRlQ29udGV4dCBkZWxldGVPd25lckF0dHJpYnV0ZUNvbnRleHQgPSBuZXcgRGVsZXRlQ29udGV4dChvd25lckF0dHJpYnV0ZVRleHRTaGFwZSk7Ci0gICAgCQlmZWF0LmRlbGV0ZShkZWxldGVPd25lckF0dHJpYnV0ZUNvbnRleHQsIGZhbHNlKTsKLSAgICAJCQotICAgIAkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW52ZXJzZUF0dHJpYnV0ZSA9IHJlbGF0aW9uLmdldEludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUoKTsKLSAgICAJCVBpY3RvZ3JhbUVsZW1lbnQgaW52ZXJzZUF0dHJpYnV0ZVRleHRTaGFwZSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChpbnZlcnNlQXR0cmlidXRlKTsKLSAgICAJCUlEZWxldGVDb250ZXh0IGRlbGV0ZUludmVyc2VBdHRyaWJ1dGVDb250ZXh0ID0gbmV3IERlbGV0ZUNvbnRleHQoaW52ZXJzZUF0dHJpYnV0ZVRleHRTaGFwZSk7Ci0gICAgCQlmZWF0LmRlbGV0ZShkZWxldGVJbnZlcnNlQXR0cmlidXRlQ29udGV4dCwgZmFsc2UpOyAgICAJCQotICAgIAl9ICAgIAkKLQotICAgICAgICBwb3N0RGVsZXRlKGNvbnRleHQpOwotICAgIH0JCi0gICAgCi0JcHVibGljIHZvaWQgcG9zdERlbGV0ZShJRGVsZXRlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAgICAgT2JqZWN0IGJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudCA9IGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSk7Ci0gICAgICAgIElSZWxhdGlvbiByZWwgPSAoSVJlbGF0aW9uKWJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudDsJCi0JCUlXb3JrYmVuY2hTaXRlIHdzID0gKChJRWRpdG9yUGFydClnZXREaWFncmFtRWRpdG9yKCkpLmdldFNpdGUoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChyZWwuZ2V0T3duZXIoKSk7CQkKLSAgICAgICAgdXQub3JnYW5pemVJbXBvcnRzKGN1LCB3cyk7ICAgICAgICAKLQkJaWYgKHJlbCBpbnN0YW5jZW9mIElCaWRpcmVjdGlvbmFsUmVsYXRpb24pIHsKLQkJCWN1ID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KHJlbC5nZXRJbnZlcnNlKCkpOwotCQkJdXQub3JnYW5pemVJbXBvcnRzKGN1LCB3cyk7ICAKLQkJfQotCX0KLSAgICAKLSAgICAKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAgKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfSAgICAKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRVc2VyRGVjaXNpb24oSURlbGV0ZUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkRlbGV0ZUZlYXR1cmVfZGVsZXRlQ29uZmlybSwgSlBBRWRpdG9yTWVzc2FnZXMuRGVsZXRlUmVsYXRpb25GZWF0dXJlX2RlbGV0ZVJlbGF0aW9uUXVlc3Rpb24pOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9EaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRGlyZWN0RWRpdEF0dHJpYnV0ZUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNkN2VmMy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9EaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtpcmlsIE1pdG92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSURpcmVjdEVkaXRpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmltcGwuQWJzdHJhY3REaXJlY3RFZGl0aW5nRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkdyYXBoaWNzQWxnb3JpdGhtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvbnZlbnRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklCaWRpcmVjdGlvbmFsUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIERpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3REaXJlY3RFZGl0aW5nRmVhdHVyZSB7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzTWV0aG9kQW5ub3RhdGVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgRGlyZWN0RWRpdEF0dHJpYnV0ZUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFZGl0aW5nVHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfVEVYVDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5EaXJlY3RFZGl0KElEaXJlY3RFZGl0aW5nQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5pdGlhbFZhbHVlKElEaXJlY3RFZGl0aW5nQ29udGV4dCBjb250ZXh0KSB7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKWdldEZlYXR1cmVQcm92aWRlcigpLgotCQkJCQkJCQkJCQlnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotCQlpc01ldGhvZEFubm90YXRlZCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKGpwYSk7Ci0JCVRleHQgdHh0ID0gKFRleHQpIHBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0R3JhcGhpY3NBbGdvcml0aG1DaGlsZHJlbigpLmdldCgwKTsKLQkJU3RyaW5nIHZhbHVlID0gIHR4dC5nZXRWYWx1ZSgpOwotCQlpZiAoaXNNZXRob2RBbm5vdGF0ZWQpCi0JCQl2YWx1ZSA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZSh2YWx1ZSk7CQkKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY2hlY2tWYWx1ZVZhbGlkKFN0cmluZyB2YWx1ZSwgSURpcmVjdEVkaXRpbmdDb250ZXh0IGNvbnRleHQpIHsKLQkJaWYgKGlzTWV0aG9kQW5ub3RhdGVkKQotCQkJdmFsdWUgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUodmFsdWUpOwkJCi0JCUlTdGF0dXMgc3RhdHVzID0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlRmllbGROYW1lKHZhbHVlLCBKYXZhQ29yZS5WRVJTSU9OXzFfNSwgSmF2YUNvcmUuVkVSU0lPTl8xXzUpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQlyZXR1cm4gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJc3RhdHVzID0gY2hlY2tEdXBsaWNhdGVBdHRyaWJ1dGUodmFsdWUsIGNvbnRleHQpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQlyZXR1cm4gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzIGNoZWNrRHVwbGljYXRlQXR0cmlidXRlKFN0cmluZyB2YWx1ZSwgSURpcmVjdEVkaXRpbmdDb250ZXh0IGNvbnRleHQpIHsKLQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudCgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvbGRBdCA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmV3QWwgPSAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpKChKYXZhUGVyc2lzdGVudFR5cGUpb2xkQXQuZ2V0UGFyZW50KCkpLmdldEF0dHJpYnV0ZU5hbWVkKHZhbHVlKTsKLQkJaWYgKG5ld0FsICE9IG51bGwgJiYgIW5ld0FsLmVxdWFscyhvbGRBdCkpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSlBBRWRpdG9yTWVzc2FnZXMuRGlyZWN0RWRpdEF0dHJpYnV0ZUZlYXR1cmVfYXR0cmlidXRlRXhpc3RzLCB2YWx1ZSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKUEFEaWFncmFtRWRpdG9yUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpIHN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSwgSURpcmVjdEVkaXRpbmdDb250ZXh0IGNvbnRleHQpIHsKLQkJaWYgKGlzTWV0aG9kQW5ub3RhdGVkKQotCQkJdmFsdWUgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUodmFsdWUpOwotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50KCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG9sZEF0ID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSBnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotCi0JCUlSZWxhdGlvbiByZWwgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRSZWxhdGlvblJlbGF0ZWRUb0F0dHJpYnV0ZShvbGRBdCk7Ci0JCVN0cmluZyBpbnZlcnNlSlBUTmFtZSA9IG51bGw7Ci0JCWlmIChJQmlkaXJlY3Rpb25hbFJlbGF0aW9uLmNsYXNzLmlzSW5zdGFuY2UocmVsKSkgCi0JCQlpbnZlcnNlSlBUTmFtZSA9IHJlbC5nZXRJbnZlcnNlKCkuZ2V0TmFtZSgpOwotCQlpZiAob2xkQXQuZ2V0TmFtZSgpLmVxdWFscyh2YWx1ZSkpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZW5hbWVBdHRyaWJ1dGUob2xkQXQsIHZhbHVlLCBpbnZlcnNlSlBUTmFtZSwgZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZpbmFsIEdyYXBoaWNzQWxnb3JpdGhtIGFsZyA9IHBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0R3JhcGhpY3NBbGdvcml0aG1DaGlsZHJlbigpLmdldCgwKTsKLQkJZmluYWwgU3RyaW5nIG5ld1ZhbHVlID0gdmFsdWU7Ci0KLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oYWxnKTsKLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJKChUZXh0KSBhbGcpLnNldFZhbHVlKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9EaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRGlyZWN0RWRpdEpQQUVudGl0eUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q2ZTQ1NS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9EaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JRGlyZWN0RWRpdGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdERpcmVjdEVkaXRpbmdGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuR3JhcGhpY3NBbGdvcml0aG07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuSlBBRGlhZ3JhbVByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi0KLXB1YmxpYyBjbGFzcyBEaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZSBleHRlbmRzIEFic3RyYWN0RGlyZWN0RWRpdGluZ0ZlYXR1cmUgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFsbG93ZWQgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjEyMzQ1Njc4OTBfIjsJLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIERpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkgICAgc3VwZXIoZnApOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldEVkaXRpbmdUeXBlKCkgewotCSAgICByZXR1cm4gVFlQRV9URVhUOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5EaXJlY3RFZGl0KElEaXJlY3RFZGl0aW5nQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxWYWx1ZShJRGlyZWN0RWRpdGluZ0NvbnRleHQgY29udGV4dCkgewotCSAgICBTaGFwZSBzaCA9IChTaGFwZSljb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLQkgICAgQ29udGFpbmVyU2hhcGUgY3NoID0gc2guZ2V0Q29udGFpbmVyKCk7Ci0JICAgIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChjc2gpOwotCSAgICByZXR1cm4gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUoanB0KSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY2hlY2tWYWx1ZVZhbGlkKFN0cmluZyB2YWx1ZSwgSURpcmVjdEVkaXRpbmdDb250ZXh0IGNvbnRleHQpIHsKLQkJLy9DU04gIzEzMDU2NjQgMjAxMAotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50KCk7Ci0JICAgIENvbnRhaW5lclNoYXBlIGNzaCA9ICgoU2hhcGUpcGUpLmdldENvbnRhaW5lcigpOwkgICAgCi0JICAgIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY3NoKTsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gU2lnbmF0dXJlLmdldFF1YWxpZmllcihqcHQuZ2V0TmFtZSgpKTsKLQkgICAgUGVyc2lzdGVuY2VVbml0IHVuaXQgPSBqcHQuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0gICAgICAgIAotCSAgICBmb3IoQ2xhc3NSZWYgY2xhc3NSZWYgOiB1bml0LmdldENsYXNzUmVmcygpKSB7Ci0JICAgIAlpZihjbGFzc1JlZi5nZXRDbGFzc05hbWUoKS5lcXVhbHMocGFja2FnZU5hbWUgKyBTaWduYXR1cmUuQ19ET1QgKyB2YWx1ZSkgJiYgIShKUEFFZGl0b3JVdGlsLmdldFRleHQoanB0KS5lcXVhbHModmFsdWUpKSl7Ci0JCSAgICAJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpQQUVkaXRvck1lc3NhZ2VzLkRpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2R1cGxpY2F0ZUVudGl0eU5hbWUsIHBhY2thZ2VOYW1lK3ZhbHVlKTsKLQotCSAgICAJfQotCSAgICB9Ci0JICAgIAotCSAgICBpZiAodmFsdWUubGVuZ3RoKCkgPCAxKQotCSAgICAgICAgcmV0dXJuIEpQQUVkaXRvck1lc3NhZ2VzLkRpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2NsYXNzTmFtZU1zZzsgCi0JICAgIGlmICh2YWx1ZS5jb250YWlucygiICIpKSAvLyROT04tTkxTLTEkCi0JICAgICAgICByZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuRGlyZWN0RWRpdEpQQUVudGl0eUZlYXR1cmVfc2NwYWNlc05vdEFsbG93ZWRNc2c7IAotCSAgICBpZiAodmFsdWUuY29udGFpbnMoIlxuIikpIC8vJE5PTi1OTFMtMSQKLQkgICAgICAgIHJldHVybiBKUEFFZGl0b3JNZXNzYWdlcy5EaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZV9saW5lQnJlYWtzTm90QWxsb3dlZE1zZzsKLQkgICAgaWYodmFsdWUuY29udGFpbnMoInsiKSB8fCB2YWx1ZS5jb250YWlucygifSIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkgICAgCXJldHVybiBKUEFFZGl0b3JNZXNzYWdlcy5EaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZV9icmFjZXNOb3RBbGxvd2VkTXNnOwotCSAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aCgpOyBpKyspIHsKLQkgICAgCWlmIChhbGxvd2VkLmluZGV4T2YodmFsdWUuY2hhckF0KGkpKSA8IDApCi0JICAgIAkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpQQUVkaXRvck1lc3NhZ2VzLkRpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2ludmFsaWRTeW1ib2xzTXNnLCB2YWx1ZSk7CQotCSAgICB9Ci0JICAgIHJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShmaW5hbCBTdHJpbmcgdmFsdWUsIElEaXJlY3RFZGl0aW5nQ29udGV4dCBjb250ZXh0KSB7Ci0JICAgIFBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLQkgICAgQ29udGFpbmVyU2hhcGUgY3NoID0gKChTaGFwZSlwZSkuZ2V0Q29udGFpbmVyKCk7Ci0JICAgIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChjc2gpOwotCSAgICBQcm9wZXJ0aWVzIHByb3BzID0gSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5sb2FkUHJvcGVydGllcyhqcHQuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0KLQkgICAgU3RyaW5nIHNwZWNpZmllZEVudGl0eU1hcHBpbmdOYW1lID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0U3BlY2lmaWVkRW50aXR5TmFtZShqcHQpOwotCSAgICBpZihzcGVjaWZpZWRFbnRpdHlNYXBwaW5nTmFtZSA9PSBudWxsKXsKLQkgICAgCVJlbmFtZUVudGl0eVdpdGhvdXRVSUZlYXR1cmUgZnQgPSBuZXcgUmVuYW1lRW50aXR5V2l0aG91dFVJRmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSwgdmFsdWUpOwotCSAgICAJZnQuZXhlY3V0ZShqcHQpOwotCSAgICAJcmV0dXJuOwotCSAgICB9IGVsc2UgewotCSAgICAKLQkgICAgSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVuYW1lRW50aXR5KGpwdCwgdmFsdWUpOwotLy8JICAgIFByb3BlcnRpZXMgcHJvcHMgPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmxvYWRQcm9wZXJ0aWVzKGpwdC5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQkJCWlmIChKUEFEaWFncmFtUHJvcGVydHlQYWdlLmRvZXNEaXJlY3RlRWRpdGluZ0FmZmVjdENsYXNzTmFtZUJ5RGVmYXVsdChqcHQuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKSwgcHJvcHMpKSB7Ci0JCQkJUmVuYW1lRW50aXR5V2l0aG91dFVJRmVhdHVyZSBmdCA9IG5ldyBSZW5hbWVFbnRpdHlXaXRob3V0VUlGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpLCB2YWx1ZSk7Ci0JCQkJZnQuZXhlY3V0ZShqcHQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCSAgICAKLQkgICAgZmluYWwgR3JhcGhpY3NBbGdvcml0aG0gYWxnID0gcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCkuZ2V0KDApOwotCi0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGFsZyk7Ci0JCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJKChUZXh0KSBhbGcpLnNldFZhbHVlKHZhbHVlKTsKLQkJCX0KLQkJfSk7CSAgICAKLQkgICAgCi0JICAgIFNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXRzID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0UmVsYXRlZEF0dHJpYnV0ZXMoanB0KTsKLQkgICAgSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGl0ID0gYXRzLml0ZXJhdG9yKCk7Ci0JICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkgICAgCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0ID0gaXQubmV4dCgpOwotCSAgICAJUGljdG9ncmFtRWxlbWVudCBwZWwgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoYXQpOwotCSAgICAJU3RyaW5nIG5ld0F0TmFtZSA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIodmFsdWUpOwotCSAgICAJaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKGF0KSkgCi0JICAgIAkJbmV3QXROYW1lID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKG5ld0F0TmFtZSk7Ci0JICAgIAl0cnkgewotCQkJCW5ld0F0TmFtZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlbmFtZUF0dHJpYnV0ZShhdCwgbmV3QXROYW1lLCBqcHQuZ2V0TmFtZSgpLCBnZXRGZWF0dXJlUHJvdmlkZXIoKSkuZ2V0TmFtZSgpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQkKLQkgICAgCWZpbmFsIEdyYXBoaWNzQWxnb3JpdGhtIGFsZ28gPSBwZWwuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCkuZ2V0KDApOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGF0dE5hbWUgPSBuZXdBdE5hbWU7Ci0JICAJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZGl0ID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oYWxnbyk7Ci0JICAJCXRlZGl0LmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkaXQpIHsKLQkgIAkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkgIAkJCQkoKFRleHQpIGFsZ28pLnNldFZhbHVlKGF0dE5hbWUpOwotCSAgCQkJfQotCSAgCQl9KTsJIAotCSAgICB9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuICAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9CQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRGlzY2FyZEFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRGlzY2FyZEFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGI3YjEwLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0Rpc2NhcmRBbmRSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5DdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLQotcHVibGljIGNsYXNzIERpc2NhcmRBbmRSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmUgZXh0ZW5kcyBSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmUgewotCi0JcHVibGljIERpc2NhcmRBbmRSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlybWF0aW9uVGV4dCgpIHsKLQkJcmV0dXJuIEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFuZERpc2NhcmRBbGxFbnRpdGllc0NvbmZpcm1hdGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCU1lc3NhZ2VEaWFsb2cgZGxnID0gbmV3IE1lc3NhZ2VEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U2hlbGxzKClbMF0sIAotCQkJCQkJCQkJCQkJSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQWxsRW50aXRpZXNNZW51LCAKLQkJCQkJCQkJCQkJCW51bGwsIGdldENvbmZpcm1hdGlvblRleHQoKSwgMCwgCi0JCQkJCQkJCQkJCQluZXcgU3RyaW5nW10ge0pQQUVkaXRvck1lc3NhZ2VzLkJUTl9PSywgSlBBRWRpdG9yTWVzc2FnZXMuQlROX0NBTkNFTH0sIERpYWxvZy5DQU5DRUwpOwotCQlpZiAoZGxnLm9wZW4oKSAhPSBEaWFsb2cuT0spCi0JCQlyZXR1cm47CQkKLQkJSXRlcmF0b3I8U2hhcGU+IGl0ID0gdGhpcy5nZXREaWFncmFtKCkuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlTaGFwZSBzaCA9IGl0Lm5leHQoKTsKLQkJCVJlc3RvcmVFbnRpdHlGZWF0dXJlIGZ0ID0gbmV3IFJlc3RvcmVFbnRpdHlGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJCUlDdXN0b21Db250ZXh0IGN0eCA9IG5ldyBDdXN0b21Db250ZXh0KG5ldyBQaWN0b2dyYW1FbGVtZW50W10geyBzaCB9KTsKLQkJCWZ0LmV4ZWN1dGUoY3R4KTsKLQkJCWFsbFNoYXBlcy5hZGQoc2gpOwotCQl9Ci0JCXN1cGVyLmV4ZWN1dGUoY29udGV4dCk7Ci0JfQkJCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuRGlzY2FyZEFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZV9Db250ZXh0TWVudU9wZXJhdGlvbkRlc2NyaXB0aW9uOwotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0V4cGFuZEFsbEVudGl0aWVzRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRXhwYW5kQWxsRW50aXRpZXNGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MDFiNjguLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRXhwYW5kQWxsRW50aXRpZXNGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5BYnN0cmFjdEN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuR3JhcGhpY3NVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgRXhwYW5kQWxsRW50aXRpZXNGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RDdXN0b21GZWF0dXJlewotCQkKLQlwdWJsaWMgRXhwYW5kQWxsRW50aXRpZXNGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJZmluYWwgRGlhZ3JhbSBkaWFncmFtID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW0oKTsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oZGlhZ3JhbSk7Ci0JCQotCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlFTGlzdDxTaGFwZT4gc2hhcGVzID0gZGlhZ3JhbS5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoUGljdG9ncmFtRWxlbWVudCBlbCA6IHNoYXBlcykgewkJCQotCQkJCQlTdHJpbmcgY29sbGFwc2VGZWF0dXJlcyA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUoZWwsIEpQQUVkaXRvckNvbnN0YW50cy5DT0xMQVBTRV9GRUFUVVJFUyk7Ci0JCQkJCWlmIChjb2xsYXBzZUZlYXR1cmVzICE9IG51bGwpIHsKLQkJCQkJCU9iamVjdCBibyA9IGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChlbCk7Ci0JCQkJCQlpZihibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSl7Ci0JCQkJCQkJQ29udGFpbmVyU2hhcGUgY29udGFpbmVyU2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIGVsOwkKLQkJCQkJCQlHcmFwaGljc1VwZGF0ZXIudXBkYXRlRW50aXR5U2hhcGUoY29udGFpbmVyU2hhcGUpOwotCQkJCQkJCUdyYXBoaWNzVXBkYXRlci51cGRhdGVFbnRpdHlIZWlndGgoY29udGFpbmVyU2hhcGUpOwotCQkJCQkJCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLnJlbW92ZVByb3BlcnR5KGVsLCBKUEFFZGl0b3JDb25zdGFudHMuQ09MTEFQU0VfRkVBVFVSRVMpOwotCQkJCQkJCUpQQUVkaXRvclV0aWwucmVhcnJhbmdlQWxsQ29ubmVjdGlvbnMoY29udGFpbmVyU2hhcGUsIGdldEZlYXR1cmVQcm92aWRlcigpLCBmYWxzZSk7Ci0JCQkJCQl9CQkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoSUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRBbGxFbnRpdGllc01lbnVJdGVtOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRXhwYW5kQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0V4cGFuZENvbXBhcnRtZW50U2hhcGVGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyN2U0MzAuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRXhwYW5kQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBQZXR5YSBTYWJldmEgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLkFic3RyYWN0Q3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uSUN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5HcmFwaGljc0FsZ29yaXRobTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuR3JhcGhpY3NVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgRXhwYW5kQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEN1c3RvbUZlYXR1cmV7Ci0JCi0JcHVibGljIEV4cGFuZENvbXBhcnRtZW50U2hhcGVGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlQaWN0b2dyYW1FbGVtZW50IGVsID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50cygpWzBdOwotCi0JCU9iamVjdCBvYiA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChlbCk7Ci0JCWludCBwaWN0b2dyYW1IZWlnaHQgPSBKUEFFZGl0b3JDb25zdGFudHMuQ09NUEFSVE1FTlRfTUlOX0hFSUdIVDsKLQkJaW50IG5ld0hlaWdodCA9IEpQQUVkaXRvckNvbnN0YW50cy5DT01QQVJUTUVOVF9CVVRUT01fT0ZGU0VUOwotCQlmaW5hbCBDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSA9IChDb250YWluZXJTaGFwZSkgZWw7Ci0JCWlmKG9iID09IG51bGwpCi0JCQluZXdIZWlnaHQgPSBHcmFwaGljc1VwZGF0ZXIuaW5jcmVhc2VDb21wYXJ0bWVudEhlaWd0aChjb250YWluZXJTaGFwZSwgbmV3SGVpZ2h0KTsKLQkJZmluYWwgaW50IHBpY3RIZWlnaHQgPSBwaWN0b2dyYW1IZWlnaHQgKyBuZXdIZWlnaHQ7Ci0gICAgICAgIGZpbmFsIEdyYXBoaWNzQWxnb3JpdGhtIGFsZ28gPSBlbC5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotICAgICAgICBmaW5hbCBDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSA9IGNvbnRhaW5lclNoYXBlLmdldENvbnRhaW5lcigpOwotICAgICAgICBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihhbGdvKTsKLSAgICAgICAgdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCSAgICAgICAgYWxnby5zZXRIZWlnaHQocGljdEhlaWdodCk7Ci0JCSAgICAgICAgaW50IGhlaWdodCA9IEdyYXBoaWNzVXBkYXRlci5nZXRQcmltYXJ5U2hhcGUoZW50aXR5U2hhcGUpLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0SGVpZ2h0KCkgKwotCQkgICAgICAgICAgICAgICAgICAgICBHcmFwaGljc1VwZGF0ZXIuZ2V0UmVsYXRpb25TaGFwZShlbnRpdHlTaGFwZSkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRIZWlnaHQoKSArIAotCQkgICAgICAgICAgICAgICAgICAgICBHcmFwaGljc1VwZGF0ZXIuZ2V0QmFzaWNTaGFwZShlbnRpdHlTaGFwZSkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRIZWlnaHQoKSArIEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfTUlOX0hFSUdIVDsKLQkJICAgICAgICAKLQkJICAgICAgICBpZihoZWlnaHQ+ZW50aXR5U2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRIZWlnaHQoKSl7Ci0JCSAgICAgICAgCUlDdXN0b21Db250ZXh0IGNvbnQgPSBuZXcgQ3VzdG9tQ29udGV4dChuZXcgUGljdG9ncmFtRWxlbWVudFtdIHtlbnRpdHlTaGFwZX0pOwotCQkgICAgICAgIAlJQ3VzdG9tRmVhdHVyZSBleHBhbmRFbnRpdHkgPSBuZXcgRXhwYW5kRW50aXR5RmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCSAgICAgICAgCWV4cGFuZEVudGl0eS5leGVjdXRlKGNvbnQpOwotCQkgICAgICAgIH0KLQkJICAgICAgICBHcmFwaGljc1VwZGF0ZXIudXBkYXRlRW50aXR5U2hhcGUoZW50aXR5U2hhcGUpOwotCQkJCUdyYXBoaWNzVXBkYXRlci5zZXRDb2xsYXBzZWQoY29udGFpbmVyU2hhcGUsIGZhbHNlKTsKLQkJCQlKUEFFZGl0b3JVdGlsLnJlYXJyYW5nZUFsbENvbm5lY3Rpb25zKGVudGl0eVNoYXBlLCBnZXRGZWF0dXJlUHJvdmlkZXIoKSwgZmFsc2UpOwkJCQkKLQkJCX0KLSAgICAgICAgfSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoSUNvbnRleHQgY29udGV4dCkgewotCQlib29sZWFuIHJldCA9IGZhbHNlOwotCQlpZiAoY29udGV4dCBpbnN0YW5jZW9mIElDdXN0b21Db250ZXh0KSB7Ci0JCQlQaWN0b2dyYW1FbGVtZW50W10gcGVzID0gKChJQ3VzdG9tQ29udGV4dCkgY29udGV4dCkuZ2V0UGljdG9ncmFtRWxlbWVudHMoKTsKLQkJCWlmIChwZXMgIT0gbnVsbCAmJiBwZXMubGVuZ3RoID4gMCkgewotCQkJCWJvb2xlYW4gZXhwYW5kUG9zc2libGUgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBlcy5sZW5ndGg7IGkrKykgewotCQkJCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gcGVzW2ldOwotCQkJCQlPYmplY3QgYm8gPSBnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotCQkJCQlpZiAoYm8gIT0gbnVsbCkgewotCQkJCQkJZXhwYW5kUG9zc2libGUgPSBmYWxzZTsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQlpZiAoIWV4cGFuZFBvc3NpYmxlKSB7Ci0JCQkJCQlpZiAoR3JhcGhpY3NVcGRhdGVyLmlzQ29sbGFwc2VkKChDb250YWluZXJTaGFwZSlwZSkpIHsKLQkJCQkJCQlleHBhbmRQb3NzaWJsZSA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGV4cGFuZFBvc3NpYmxlKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXQ7Ci0JfQotCQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuICAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0V4cGFuZEVudGl0eUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0V4cGFuZEVudGl0eUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1MmQyNy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9FeHBhbmRFbnRpdHlGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUGV0eWEgU2FiZXZhIC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5BYnN0cmFjdEN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuR3JhcGhpY3NVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgRXhwYW5kRW50aXR5RmVhdHVyZSBleHRlbmRzIEFic3RyYWN0Q3VzdG9tRmVhdHVyZXsKLQkJCi0JcHVibGljIEV4cGFuZEVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlmaW5hbCBQaWN0b2dyYW1FbGVtZW50IGVsID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50cygpWzBdOwotCi0JCU9iamVjdCBibyA9IGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChlbCk7Ci0JCWlmKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKXsKLQkJZmluYWwgQ29udGFpbmVyU2hhcGUgY29udGFpbmVyU2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIGVsOwotCQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihjb250YWluZXJTaGFwZSk7Ci0JCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0KLQkJCQkJR3JhcGhpY3NVcGRhdGVyLnVwZGF0ZUVudGl0eVNoYXBlKGNvbnRhaW5lclNoYXBlKTsKLQkJCQkJR3JhcGhpY3NVcGRhdGVyLnVwZGF0ZUVudGl0eUhlaWd0aChjb250YWluZXJTaGFwZSk7Ci0JCQkJCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLnJlbW92ZVByb3BlcnR5KGVsLCBKUEFFZGl0b3JDb25zdGFudHMuQ09MTEFQU0VfRkVBVFVSRVMpOwotCi0JCQkJCUpQQUVkaXRvclV0aWwucmVhcnJhbmdlQWxsQ29ubmVjdGlvbnMoY29udGFpbmVyU2hhcGUsIGdldEZlYXR1cmVQcm92aWRlcigpLCBmYWxzZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKElDb250ZXh0IGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBJQ3VzdG9tQ29udGV4dCkgewotCQkJUGljdG9ncmFtRWxlbWVudFtdIHBlcyA9ICgoSUN1c3RvbUNvbnRleHQpIGNvbnRleHQpLmdldFBpY3RvZ3JhbUVsZW1lbnRzKCk7Ci0JCQlpZiAocGVzICE9IG51bGwgJiYgcGVzLmxlbmd0aCA+IDApIHsKLQkJCQlib29sZWFuIGV4cGFuZFBvc3NpYmxlID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IHBlc1tpXTsKLQkJCQkJT2JqZWN0IGJvID0gZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQkJCQkJaWYgKCEoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJaWYgKCFleHBhbmRQb3NzaWJsZSkgewotCQkJCQkJUHJvcGVydHkgcHJvcGVydHkgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRQcm9wZXJ0eShwZSwgSlBBRWRpdG9yQ29uc3RhbnRzLkNPTExBUFNFX0ZFQVRVUkVTKTsKLQkJCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCQkJZXhwYW5kUG9zc2libGUgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChleHBhbmRQb3NzaWJsZSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAgKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2V4cGFuZEVudGl0eU1lbnVJdGVtOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvR3JhcGhpY2FsQWRkQXR0cmlidXRlRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvR3JhcGhpY2FsQWRkQXR0cmlidXRlRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTVkM2U4Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0dyYXBoaWNhbEFkZEF0dHJpYnV0ZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUFkZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdEFkZFNoYXBlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9ySW1hZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkdyYXBoaWNzVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5XcnA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHMuU2hhcGVUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBHcmFwaGljYWxBZGRBdHRyaWJ1dGVGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RBZGRTaGFwZUZlYXR1cmUgewotCi0JcHVibGljIEdyYXBoaWNhbEFkZEF0dHJpYnV0ZUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0JcHVibGljIFBpY3RvZ3JhbUVsZW1lbnQgYWRkKGZpbmFsIElBZGRDb250ZXh0IGNvbnRleHQpIHsKLQkJZmluYWwgQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUgPSBjb250ZXh0LmdldFRhcmdldENvbnRhaW5lcigpOwotCQlmaW5hbCBXcnAgd3JwID0gbmV3IFdycCgpOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihlbnRpdHlTaGFwZSk7Ci0JCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5ld0F0dHIgPSAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGNvbnRleHQuZ2V0TmV3T2JqZWN0KCk7Ci0JCQkJU3RyaW5nIHR4dCA9IEpQQUVkaXRvclV0aWwuZ2V0VGV4dChuZXdBdHRyKTsKLQkJCQlIYXNoU2V0PFN0cmluZz4gYW5ub3RzID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0QW5ub3RhdGlvbk5hbWVzKG5ld0F0dHIpOwotCQkJCUNvbnRhaW5lclNoYXBlIHRleHRTaGFwZSA9IG51bGw7Ci0JCQkJQ29udGFpbmVyU2hhcGUgcHJpbWFyeVNoYXBlID0gR3JhcGhpY3NVcGRhdGVyLmdldFByaW1hcnlTaGFwZShlbnRpdHlTaGFwZSk7Ci0JCQkJQ29udGFpbmVyU2hhcGUgcmVsYXRpb25TaGFwZSA9IEdyYXBoaWNzVXBkYXRlci5nZXRSZWxhdGlvblNoYXBlKGVudGl0eVNoYXBlKTsKLQkJCQlDb250YWluZXJTaGFwZSBiYXNpY1NoYXBlID0gR3JhcGhpY3NVcGRhdGVyLmdldEJhc2ljU2hhcGUoZW50aXR5U2hhcGUpOwotCQkJCXRleHRTaGFwZSA9IGFkZEF0dHJpYnV0ZVRvUHJvcGVybHlTaGFwZShlbnRpdHlTaGFwZSwgdHh0LCBhbm5vdHMsIHByaW1hcnlTaGFwZSwgcmVsYXRpb25TaGFwZSwgYmFzaWNTaGFwZSk7Ci0JCQkJbGluayh0ZXh0U2hhcGUsIG5ld0F0dHIpOwotCQkJCWxheW91dFBpY3RvZ3JhbUVsZW1lbnQoZW50aXR5U2hhcGUpOwotCQkJCXdycC5zZXRPYmoodGV4dFNoYXBlKTsKLQkJCX0KLQkJCQotCQl9KTsKLQkJcmV0dXJuIChQaWN0b2dyYW1FbGVtZW50KXdycC5nZXRPYmooKTsKLQl9Ci0KLQlwcml2YXRlIENvbnRhaW5lclNoYXBlIGFkZEF0dHJpYnV0ZVRvUHJvcGVybHlTaGFwZShDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSwgU3RyaW5nIHR4dCwgSGFzaFNldDxTdHJpbmc+IGFubm90cywKLQkJCUNvbnRhaW5lclNoYXBlIHByaW1hcnlTaGFwZSwgQ29udGFpbmVyU2hhcGUgcmVsYXRpb25TaGFwZSwgQ29udGFpbmVyU2hhcGUgYmFzaWNTaGFwZSkgewotCQlDb250YWluZXJTaGFwZSB0ZXh0U2hhcGUgPSBudWxsOwotCQlpZiAoYW5ub3RzLmNvbnRhaW5zKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX0lEKSB8fCBhbm5vdHMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fRU1CRURERURfSUQpKSB7Ci0JCQl0ZXh0U2hhcGUgPSBhZGRBdHRyaWJ1dGVUb1NoYXBlKGVudGl0eVNoYXBlLCB0eHQsIGFubm90cywgcHJpbWFyeVNoYXBlKTsKLQkJfSBlbHNlIGlmIChhbm5vdHMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fTUFOWV9UT19NQU5ZKQotCQkJCXx8IGFubm90cy5jb250YWlucyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX09ORSkKLQkJCQl8fCBhbm5vdHMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fT05FX1RPX01BTlkpCi0JCQkJfHwgYW5ub3RzLmNvbnRhaW5zKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX09ORV9UT19PTkUpKSB7Ci0JCQl0ZXh0U2hhcGUgPSBhZGRBdHRyaWJ1dGVUb1NoYXBlKGVudGl0eVNoYXBlLCB0eHQsIGFubm90cywgcmVsYXRpb25TaGFwZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0ZXh0U2hhcGUgPSBhZGRBdHRyaWJ1dGVUb1NoYXBlKGVudGl0eVNoYXBlLCB0eHQsIGFubm90cywgYmFzaWNTaGFwZSk7Ci0JCX0KLQkJcmV0dXJuIHRleHRTaGFwZTsKLQl9Ci0KLQlwcml2YXRlIENvbnRhaW5lclNoYXBlIGFkZEF0dHJpYnV0ZVRvU2hhcGUoQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUsIFN0cmluZyB0eHQsIEhhc2hTZXQ8U3RyaW5nPiBhbm5vdHMsCi0JCQlDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSkgewotCQlDb250YWluZXJTaGFwZSB0ZXh0U2hhcGUgPSBudWxsOwotCQlpbnQgY2hpbGRyZW5TaXplQmVmb3JlID0gY29udGFpbmVyU2hhcGUuZ2V0Q2hpbGRyZW4oKS5zaXplKCk7Ci0JCWludCBjb250YWluZXJIZWlnaHRCZWZvcmUgPSBjb250YWluZXJTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldEhlaWdodCgpOwotCQl0ZXh0U2hhcGUgPSBhZGRBdHRyaWJ1dGUoZ2V0RmVhdHVyZVByb3ZpZGVyKCksIGNvbnRhaW5lclNoYXBlLCB0eHQsIGFubm90cyk7Ci0KLQkJR3JhcGhpY3NVcGRhdGVyLnVwZGF0ZUNvbnRhaW5lcihjb250YWluZXJTaGFwZSwgY2hpbGRyZW5TaXplQmVmb3JlLCBjb250YWluZXJIZWlnaHRCZWZvcmUpOwotCQlHcmFwaGljc1VwZGF0ZXIudXBkYXRlRW50aXR5U2hhcGUoZW50aXR5U2hhcGUpOwotCi0JCXJldHVybiB0ZXh0U2hhcGU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29udGFpbmVyU2hhcGUgYWRkQXR0cmlidXRlKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIENvbnRhaW5lclNoYXBlIGNvbnRhaW5lclNoYXBlLAotCQkJU3RyaW5nIGF0dHJpYlR4dCwgSGFzaFNldDxTdHJpbmc+IGFubm90YXRpb25zKSB7Ci0KLQkJaW50IHdpZHRoID0gY29udGFpbmVyU2hhcGUuZ2V0Q29udGFpbmVyKCkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRXaWR0aCgpOwotCQlDb250YWluZXJTaGFwZSBpY29uU2hhcGUgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVDb250YWluZXJTaGFwZShjb250YWluZXJTaGFwZSwgZmFsc2UpOwotCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5zZXRQcm9wZXJ0eVZhbHVlKGljb25TaGFwZSwgSlBBRWRpdG9yQ29uc3RhbnRzLlBST1BfU0hBUEVfVFlQRSwgU2hhcGVUeXBlLklDT04udG9TdHJpbmcoKSk7Ci0JCWludCBhdHRyaWJJbmRleCA9IGZwLmdldEF0dHJpYnNOdW0oY29udGFpbmVyU2hhcGUpOwotCQlSZWN0YW5nbGUgaWNvblJlY3QgPSBVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlLmFkZFJlY3RhbmdsZUZvckljb24oaWNvblNoYXBlLCBhdHRyaWJJbmRleCk7Ci0JCUltYWdlIGljb24gPSBudWxsOwotCQlPYmplY3Qgb2IgPSBmcC5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY29udGFpbmVyU2hhcGUuZ2V0Q29udGFpbmVyKCkpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlvYjsKLQkJYm9vbGVhbiBpc01ldGhvZEFubm90YXRlZCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKGpwdCk7IAotCQlib29sZWFuIGlzQ29sbGVjdGlvbiA9IGlzTWV0aG9kQW5ub3RhdGVkID8gCi0JCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNHZXR0ZXJNZXRob2RSZXR1cm5UeXBlQ29sbGVjdGlvbihjb250YWluZXJTaGFwZS5nZXRDb250YWluZXIoKSwgZnAsIGF0dHJpYlR4dCkgOgotCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzQ29sbGVjdGlvbihjb250YWluZXJTaGFwZS5nZXRDb250YWluZXIoKSwgZnAsIGF0dHJpYlR4dCk7IAotCQlpZiAoaXNDb2xsZWN0aW9uICYmIGFubm90YXRpb25zLmlzRW1wdHkoKSkgewotCQkJaWNvbiA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZUltYWdlKGljb25SZWN0LCBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLklDT05fVU5NQVBQRUQpOwotCQl9IGVsc2V7Ci0JCSAgICBpY29uID0gSlBBRWRpdG9yVXRpbC5jcmVhdGVBdHRyaWJ1dGVJY29uKGljb25SZWN0LCBhbm5vdGF0aW9ucyk7Ci0JCX0KLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb25BbmRTaXplKGljb24sIEpQQUVkaXRvckNvbnN0YW50cy5JQ09OX1gsIEpQQUVkaXRvckNvbnN0YW50cy5JQ09OX1ksCi0JCQkJSlBBRWRpdG9yQ29uc3RhbnRzLklDT05fV0lEVEgsIEpQQUVkaXRvckNvbnN0YW50cy5JQ09OX0hFSUdIVCk7Ci0JCUNvbnRhaW5lclNoYXBlIHRleHRTaGFwZSA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmNyZWF0ZUNvbnRhaW5lclNoYXBlKGNvbnRhaW5lclNoYXBlLCBmYWxzZSk7Ci0JCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLnNldFByb3BlcnR5VmFsdWUodGV4dFNoYXBlLCBKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9TSEFQRV9UWVBFLCBTaGFwZVR5cGUuQVRUUklCVVRFLnRvU3RyaW5nKCkpOwotCQlSZWN0YW5nbGUgdGV4dFJlY3RhbmdsZSA9IFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUuYWRkUmVjdGFuZ2xlRm9yVGV4dCh0ZXh0U2hhcGUsIGF0dHJpYkluZGV4LCB3aWR0aCk7Ci0JCXRleHRTaGFwZS5zZXRBY3RpdmUodHJ1ZSk7Ci0JCVRleHQgdGV4dCA9IFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUuYWRkVGV4dChmcCwgdGV4dFJlY3RhbmdsZSwgYXR0cmliVHh0KTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0V2lkdGgodGV4dCwgd2lkdGggLSBKUEFFZGl0b3JDb25zdGFudHMuQVRUUklCVVRFX1RFWFRfUkVDVF9XSURUSF9SRURVQ0VSKTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb25BbmRTaXplKHRleHQsIDEsIC0yLCB3aWR0aAotCQkJCS0gSlBBRWRpdG9yQ29uc3RhbnRzLkFUVFJJQlVURV9URVhUX1JFQ1RfV0lEVEhfUkVEVUNFUiwgSlBBRWRpdG9yQ29uc3RhbnRzLkFUVFJJQlVURV9SRUNUX0hFSUdIVCk7Ci0JCWZwLmluY3JlYXNlQXR0cmlic051bShjb250YWluZXJTaGFwZSk7Ci0JCXJldHVybiB0ZXh0U2hhcGU7Ci0JfQotCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpIHN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkFkZChJQWRkQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvR3JhcGhpY2FsUmVtb3ZlQXR0cmlidXRlRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvR3JhcGhpY2FsUmVtb3ZlQXR0cmlidXRlRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGQ1OTc1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0dyYXBoaWNhbFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5BZGRDb25uZWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uQWJzdHJhY3RDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQW5jaG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5HcmFwaGljc1VwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotY2xhc3MgR3JhcGhpY2FsUmVtb3ZlQXR0cmlidXRlRmVhdHVyZSBleHRlbmRzIEFic3RyYWN0Q3VzdG9tRmVhdHVyZSB7Ci0KLQlwdWJsaWMgR3JhcGhpY2FsUmVtb3ZlQXR0cmlidXRlRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJZmluYWwgUGljdG9ncmFtRWxlbWVudCBwZSA9IGNvbnRleHQuZ2V0SW5uZXJQaWN0b2dyYW1FbGVtZW50KCk7Ci0JCWlmIChwZSA9PSBudWxsKSAKLQkJCXJldHVybjsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gIFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKHBlKTsKLQkJaWYgKHRlZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCVNoYXBlIHNoID0gKFNoYXBlKSBwZTsKLQkJCQlPYmplY3QgYm8gPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoc2gpOwotCQkJCWlmICgoYm8gPT0gbnVsbCkgfHwgKCFKYXZhUGVyc2lzdGVudFR5cGUuY2xhc3MuaXNJbnN0YW5jZShibykpKQotCQkJCQlyZXR1cm47Ci0JCQkJQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIHBlOwotCQkJCUNvbnRhaW5lclNoYXBlIHByaW1TaGFwZSA9IEdyYXBoaWNzVXBkYXRlci5nZXRQcmltYXJ5U2hhcGUoZW50aXR5U2hhcGUpOwotCQkJCUNvbnRhaW5lclNoYXBlIHJlbGF0aW9uU2hhcGUgPSBHcmFwaGljc1VwZGF0ZXIuZ2V0UmVsYXRpb25TaGFwZShlbnRpdHlTaGFwZSk7Ci0JCQkJQ29udGFpbmVyU2hhcGUgYmFzaWNTaGFwZSA9IEdyYXBoaWNzVXBkYXRlci5nZXRCYXNpY1NoYXBlKGVudGl0eVNoYXBlKTsKLQotCQkJCXJlbW92ZUNvbXBhcnRtZW50Q2hpbGRyZW4ocHJpbVNoYXBlKTsKLQkJCQlyZW1vdmVDb21wYXJ0bWVudENoaWxkcmVuKHJlbGF0aW9uU2hhcGUpOwotCQkJCXJlbW92ZUNvbXBhcnRtZW50Q2hpbGRyZW4oYmFzaWNTaGFwZSk7Ci0KLQkJCQlyZWFkZENvbXBhcnRtZW50c0NoaWxkcmVuKChKYXZhUGVyc2lzdGVudFR5cGUpIGJvLCBlbnRpdHlTaGFwZSwgcHJpbVNoYXBlLCByZWxhdGlvblNoYXBlLCBiYXNpY1NoYXBlKTsKLQotCQkJCWxheW91dFBpY3RvZ3JhbUVsZW1lbnQoZW50aXR5U2hhcGUpOwotCQkJCXJlY29ubmVjdCgoSmF2YVBlcnNpc3RlbnRUeXBlKSBibyk7Ci0JCQl9Ci0JCX0pOwkJCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWNvbm5lY3QoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JCUNvbGxlY3Rpb248SVJlbGF0aW9uPiByZWxzID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucHJvZHVjZUFsbFJlbGF0aW9ucyhqcHQsIGZwKTsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKGZwLCBqcHQpOwotCQlJdGVyYXRvcjxJUmVsYXRpb24+IGl0ID0gcmVscy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJUmVsYXRpb24gcmVsID0gaXQubmV4dCgpOwotCQkJQWRkUmVsYXRpb25GZWF0dXJlIHJlbEYgPSBuZXcgQWRkUmVsYXRpb25GZWF0dXJlKGZwKTsKLQkJCUFuY2hvckNvbnRhaW5lciBhY1NvdXJjZSA9IChBbmNob3JDb250YWluZXIpIGZwLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChyZWwuZ2V0T3duZXIoKSk7Ci0JCQlBbmNob3JDb250YWluZXIgYWNUYXJnZXQgPSAoQW5jaG9yQ29udGFpbmVyKSBmcC5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QocmVsLmdldEludmVyc2UoKSk7Ci0JCQlBZGRDb25uZWN0aW9uQ29udGV4dCBjdHggPSBuZXcgQWRkQ29ubmVjdGlvbkNvbnRleHQoYWNTb3VyY2UuZ2V0QW5jaG9ycygpLml0ZXJhdG9yKCkubmV4dCgpLCBhY1RhcmdldAotCQkJCQkuZ2V0QW5jaG9ycygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCWN0eC5zZXROZXdPYmplY3QocmVsKTsKLQkJCXJlbEYuYWRkKGN0eCk7Ci0JCX0KLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVhcnJhbmdlSXNBUmVsYXRpb25zKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0JcHJpdmF0ZSB2b2lkIHJlYWRkQ29tcGFydG1lbnRzQ2hpbGRyZW4oSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSwgQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUsCi0JCQlDb250YWluZXJTaGFwZSBwcmltYXJ5U2hhcGUsIENvbnRhaW5lclNoYXBlIHJlbGF0aW9uU2hhcGUsIENvbnRhaW5lclNoYXBlIGJhc2ljU2hhcGUpIHsKLQkJSlBBRWRpdG9yQ29uc3RhbnRzLkRJQUdSQU1fT0JKRUNUX1RZUEUgZG90ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZGV0ZXJtaW5lRGlhZ3JhbU9iamVjdFR5cGUoamF2YVBlcnNpc3RlbnRUeXBlKTsKLQkJVXBkYXRlQXR0cmlidXRlRmVhdHVyZSB1cGRhdGVGZWF0dXJlID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQl1cGRhdGVGZWF0dXJlLmFkZFNlcGFyYXRvcnNUb1NoYXBlKHByaW1hcnlTaGFwZSwgZG90KTsKLQkJdXBkYXRlRmVhdHVyZS5hZGRTZXBhcmF0b3JzVG9TaGFwZShyZWxhdGlvblNoYXBlLCBkb3QpOwotCQl1cGRhdGVGZWF0dXJlLmFkZFNlcGFyYXRvcnNUb1NoYXBlKGJhc2ljU2hhcGUsIGRvdCk7Ci0KLQkJZm9yIChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQl1cGRhdGVGZWF0dXJlLmFkZEF0dHJpYnV0ZXMoZW50aXR5U2hhcGUsIGF0dHJpYnV0ZSk7Ci0KLQkJCWdldEZlYXR1cmVQcm92aWRlcigpLnJlbmV3QXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlMaXN0ZW5lcihhdHRyaWJ1dGUpOwotCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuYWRkSlBURm9yVXBkYXRlKGphdmFQZXJzaXN0ZW50VHlwZS5nZXROYW1lKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNvbXBhcnRtZW50Q2hpbGRyZW4oQ29udGFpbmVyU2hhcGUgY29tcGFydG1lbnRTaGFwZSkgewotCQlpbnQgeSA9IDA7Ci0JCUxpc3Q8U2hhcGU+IGNoaWxkcmVuID0gY29tcGFydG1lbnRTaGFwZS5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5ldyBBcnJheUxpc3Q8U2hhcGU+KGNvbXBhcnRtZW50U2hhcGUuZ2V0Q2hpbGRyZW4oKSkuc2l6ZSgpOyBpKyspIHsKLQkJCVNoYXBlIHNoYXBlID0gY29tcGFydG1lbnRTaGFwZS5nZXRDaGlsZHJlbigpLmdldChpKTsKLQkJCXkgPSBzaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldFkoKTsKLQkJCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLmRlbGV0ZVBpY3RvZ3JhbUVsZW1lbnQoc2hhcGUpOwotCQl9Ci0JCWZvciAoaW50IGkgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRBdHRyaWJzTnVtKGNvbXBhcnRtZW50U2hhcGUpOyBpID4gMDsgaS0tKSB7Ci0JCQlTaGFwZSBzaGFwZSA9IGNvbXBhcnRtZW50U2hhcGUuZ2V0Q2hpbGRyZW4oKS5nZXQoaSk7Ci0JCQl5ID0gc2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRZKCk7Ci0JCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5kZWxldGVQaWN0b2dyYW1FbGVtZW50KHNoYXBlKTsKLQkJCWdldEZlYXR1cmVQcm92aWRlcigpLmRlY3JlYXNlQXR0cmlic051bShjb21wYXJ0bWVudFNoYXBlKTsKLQkJfQotCQljaGlsZHJlbiA9IGNvbXBhcnRtZW50U2hhcGUuZ2V0Q2hpbGRyZW4oKTsKLQkJc2hpZnRVcExvd2VyQXR0cmlicyh5LCBjaGlsZHJlbik7Ci0JCWNvbXBhcnRtZW50U2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5zZXRIZWlnaHQoMCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpIHN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzaGlmdFVwTG93ZXJBdHRyaWJzKGludCB5LCBMaXN0PFNoYXBlPiBjaGlsZHJlbikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlTaGFwZSBzaHAgPSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQlpZiAoc2hwICE9IG51bGwpIHsKLQkJCQlpbnQgZ3JZID0gY2hpbGRyZW4uZ2V0KGkpLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0WSgpOwotCQkJCWlmIChnclkgPiB5KSB7Ci0JCQkJCWNoaWxkcmVuLmdldChpKS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLnNldFkoZ3JZIC0gSlBBRWRpdG9yQ29uc3RhbnRzLkFUVFJJQlVURVNfUExBQ0VNRU5UX1NURVApOwotCQkJCX0KLQkJCQljaGlsZHJlbi5nZXQoaSkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZGVsZXRlUGljdG9ncmFtRWxlbWVudChjaGlsZHJlbi5nZXQoaSkpOwotCQkJfQotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvSUNyZWF0ZUJpRGlyUmVsYXRpb25GZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9JQ3JlYXRlQmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0Y2Q5ZC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9JQ3JlYXRlQmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDcmVhdGVCaURpclJlbGF0aW9uRmVhdHVyZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0lDcmVhdGVVbmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0lDcmVhdGVVbmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUxNzRkOS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9JQ3JlYXRlVW5pRGlyUmVsYXRpb25GZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotcHVibGljIGludGVyZmFjZSBJQ3JlYXRlVW5pRGlyUmVsYXRpb25GZWF0dXJlIHsKLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvSlBBTW92ZUNvbm5lY3Rpb25EZWNvcmF0b3JGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9KUEFNb3ZlQ29ubmVjdGlvbkRlY29yYXRvckZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4MGU5NS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9KUEFNb3ZlQ29ubmVjdGlvbkRlY29yYXRvckZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklNb3ZlQ29ubmVjdGlvbkRlY29yYXRvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5EZWZhdWx0TW92ZUNvbm5lY3Rpb25EZWNvcmF0b3JGZWF0dXJlOwotCi1wdWJsaWMgY2xhc3MgSlBBTW92ZUNvbm5lY3Rpb25EZWNvcmF0b3JGZWF0dXJlIGV4dGVuZHMKLQkJRGVmYXVsdE1vdmVDb25uZWN0aW9uRGVjb3JhdG9yRmVhdHVyZSB7Ci0KLQlwdWJsaWMgSlBBTW92ZUNvbm5lY3Rpb25EZWNvcmF0b3JGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5Nb3ZlQ29ubmVjdGlvbkRlY29yYXRvcigKLQkJCUlNb3ZlQ29ubmVjdGlvbkRlY29yYXRvckNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKElDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0xheW91dEpQQUVudGl0eUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0xheW91dEpQQUVudGl0eUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ1ZTJkNy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9MYXlvdXRKUEFFbnRpdHlGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5kYXRhdHlwZXMuSURpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklMYXlvdXRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmltcGwuQWJzdHJhY3RMYXlvdXRGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuR3JhcGhpY3NBbGdvcml0aG07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlBvbHlsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnNlcnZpY2VzLkdyYXBoaXRpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JR3JhcGhpY3NVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSVBlU2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci0KLQotcHVibGljIGNsYXNzIExheW91dEpQQUVudGl0eUZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdExheW91dEZlYXR1cmUgewotCi0JcHJpdmF0ZSBJUGVTZXJ2aWNlVXRpbCBwZVV0aWwgPSBudWxsOwotCi0gICAgcHVibGljIExheW91dEpQQUVudGl0eUZlYXR1cmUoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotICAgICAgICBzdXBlcihmcCk7Ci0gICAgICAgIHBlVXRpbCA9IGZwLmdldFBlU2VydmljZVV0aWwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5MYXlvdXQoSUxheW91dENvbnRleHQgY29udGV4dCkgewotICAgICAgICBQaWN0b2dyYW1FbGVtZW50IHBlID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50KCk7Ci0gICAgICAgIE9iamVjdCBibyA9IGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSk7Ci0gICAgICAgIHJldHVybiAoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGxheW91dChJTGF5b3V0Q29udGV4dCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gYW55dGhpbmdDaGFuZ2VkID0gZmFsc2U7Ci0JCUNvbnRhaW5lclNoYXBlIGNvbnRhaW5lclNoYXBlID0gKENvbnRhaW5lclNoYXBlKSBjb250ZXh0Ci0JCQkJLmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLQkJR3JhcGhpY3NBbGdvcml0aG0gY29udGFpbmVyR2EgPSBjb250YWluZXJTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCi0JCWlmKGNvbnRhaW5lckdhLmdldEhlaWdodCgpIDwgSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9NSU5fSEVJR0hUKXsKLQkJCWNvbnRhaW5lckdhLnNldEhlaWdodChKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX01JTl9IRUlHSFQpOwotCQl9Ci0JCQotCQljb25maWd1cmVFbnRpdHlDb2xsYXBzZUV4cGFuZFByb3BlcnR5KGNvbnRhaW5lclNoYXBlLCBjb250YWluZXJHYSk7Ci0JCQotCQlpZiAoY29udGFpbmVyR2EuZ2V0V2lkdGgoKSA8IEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfTUlOX1dJRFRIKSB7Ci0JCQljb250YWluZXJHYS5zZXRXaWR0aChKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX01JTl9XSURUSCk7Ci0JCQlhbnl0aGluZ0NoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCWludCBjb250YWluZXJXaWR0aCA9IGNvbnRhaW5lckdhLmdldFdpZHRoKCk7Ci0JCUl0ZXJhdG9yPFNoYXBlPiBpdGVyID0gY29udGFpbmVyU2hhcGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVNoYXBlIHNoYXBlID0gaXRlci5uZXh0KCk7Ci0JCQlhbnl0aGluZ0NoYW5nZWQgPSBsYXlvdXRDb250YWluZXJFbnRpdHlDaGlsZHJlbihhbnl0aGluZ0NoYW5nZWQsCi0JCQkJCWNvbnRhaW5lcldpZHRoLCBzaGFwZSk7Ci0KLQkJfQotCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IHBlVXRpbC5nZXRQcm9wZXJ0eShjb250YWluZXJTaGFwZSwgSlBBRWRpdG9yQ29uc3RhbnRzLkNPTExBUFNFX0ZFQVRVUkVTKTsKLQkJaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLQkJCUlHcmFwaGljc1VwZGF0ZXIgZ3UgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRHcmFwaGljc1VwZGF0ZXIoKTsKLQkJCWd1LnVwZGF0ZUVudGl0eUhlaWd0aChjb250YWluZXJTaGFwZSk7Ci0JCX0KLQotCQlyZXR1cm4gYW55dGhpbmdDaGFuZ2VkOwotCX0KLQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLSAgICAKLQlwcml2YXRlIHZvaWQgY29uZmlndXJlRW50aXR5Q29sbGFwc2VFeHBhbmRQcm9wZXJ0eSgKLQkJCUNvbnRhaW5lclNoYXBlIGNvbnRhaW5lclNoYXBlLCBHcmFwaGljc0FsZ29yaXRobSBjb250YWluZXJHYSkgewotCQlpZihjb250YWluZXJHYS5nZXRIZWlnaHQoKSA9PSBKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX01JTl9IRUlHSFQpewotCQkJcGVVdGlsLnNldFByb3BlcnR5VmFsdWUoY29udGFpbmVyU2hhcGUsIEpQQUVkaXRvckNvbnN0YW50cy5DT0xMQVBTRV9GRUFUVVJFUywgU3RyaW5nLnZhbHVlT2YoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9NSU5fSEVJR0hUKSk7Ci0JCX0KLQkJZWxzZSBpZihjb250YWluZXJHYS5nZXRIZWlnaHQoKT5KUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX01JTl9IRUlHSFQpewotCQkJcGVVdGlsLnJlbW92ZVByb3BlcnR5KGNvbnRhaW5lclNoYXBlLCBKUEFFZGl0b3JDb25zdGFudHMuQ09MTEFQU0VfRkVBVFVSRVMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGxheW91dENvbnRhaW5lckVudGl0eUNoaWxkcmVuKGJvb2xlYW4gYW55dGhpbmdDaGFuZ2VkLAotCQkJaW50IGNvbnRhaW5lcldpZHRoLCBTaGFwZSBzaGFwZSkgewotCQlHcmFwaGljc0FsZ29yaXRobSBncmFwaGljc0FsZ29yaXRobSA9IHNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCUlEaW1lbnNpb24gc2l6ZSA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNhbGN1bGF0ZVNpemUoZ3JhcGhpY3NBbGdvcml0aG0pOwotCQlpZiAoY29udGFpbmVyV2lkdGggIT0gc2l6ZS5nZXRXaWR0aCgpKSB7Ci0JCQlpZiAoZ3JhcGhpY3NBbGdvcml0aG0gaW5zdGFuY2VvZiBQb2x5bGluZSkgewotCQkJCWFueXRoaW5nQ2hhbmdlZCA9IGxheW91dFBvbHlsaW5lKGNvbnRhaW5lcldpZHRoLAotCQkJCQkJZ3JhcGhpY3NBbGdvcml0aG0pOwotCQkJfSBlbHNlIGlmIChncmFwaGljc0FsZ29yaXRobSBpbnN0YW5jZW9mIFJlY3RhbmdsZSkgewotCQkJCQotCQkJCVJlY3RhbmdsZSByZWN0ID0gKFJlY3RhbmdsZSkgZ3JhcGhpY3NBbGdvcml0aG07Ci0JCQkJTGlzdDxHcmFwaGljc0FsZ29yaXRobT4gZ3JhID0gcmVjdC5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCk7Ci0JCQkJSXRlcmF0b3I8R3JhcGhpY3NBbGdvcml0aG0+IGl0ID0gZ3JhLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlHcmFwaGljc0FsZ29yaXRobSBnciA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKGdyIGluc3RhbmNlb2YgSW1hZ2UpewotCQkJCQkJbGF5b3V0SGVhZGVySWNvbihzaGFwZSwgZ3JhcGhpY3NBbGdvcml0aG0pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGdyIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCQkJVGV4dCB0eHQgPSAoVGV4dCkgZ3I7Ci0JCQkJCQlpZighdHh0LmdldEZvbnQoKS5pc0l0YWxpYygpKXsKLQkJCQkJCSAgICBsYXlvdXRIZWFkZXJUZXh0KGNvbnRhaW5lcldpZHRoLCBncmFwaGljc0FsZ29yaXRobSwgZ3IpOwotCQkJCQkJfWVsc2V7Ci0JCQkJCQkJbGF5b3V0QXR0cmlidXRlc0dyb3Vwcyhhbnl0aGluZ0NoYW5nZWQsIGdyLCBjb250YWluZXJXaWR0aCk7Ci0JCQkJCQl9Ci0JCQkJCX0JCQkJCQotCQkJCX0KLQkJCQlhbnl0aGluZ0NoYW5nZWQgPSB0cnVlOwotCQkJfSAKLQkJfQotCQlyZXR1cm4gYW55dGhpbmdDaGFuZ2VkOwotCX0KLQotCXByaXZhdGUgdm9pZCBsYXlvdXRIZWFkZXJUZXh0KGludCBjb250YWluZXJXaWR0aCwKLQkJCUdyYXBoaWNzQWxnb3JpdGhtIGdyYXBoaWNzQWxnb3JpdGhtLCBHcmFwaGljc0FsZ29yaXRobSBncikgewotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRXaWR0aChncmFwaGljc0FsZ29yaXRobSwKLQkJCQkJCWNvbnRhaW5lcldpZHRoIC0gSlBBRWRpdG9yQ29uc3RhbnRzLkhFQURFUl9URVhUX1JFQ1RfV0lEVEhfUkVEVUNFUik7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldFdpZHRoKGdyLCBjb250YWluZXJXaWR0aCAtIEpQQUVkaXRvckNvbnN0YW50cy5IRUFERVJfVEVYVF9SRUNUX1dJRFRIX1JFRFVDRVIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBsYXlvdXRIZWFkZXJJY29uKFNoYXBlIHNoYXBlLAotCQkJR3JhcGhpY3NBbGdvcml0aG0gZ3JhcGhpY3NBbGdvcml0aG0pIHsKLQkJR3JhcGhpY3NBbGdvcml0aG0gaGVhZGVySWNvbkdyYXBoaWNzQWxnID0gc2hhcGUKLQkJCQkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0V2lkdGgoZ3JhcGhpY3NBbGdvcml0aG0sIEpQQUVkaXRvckNvbnN0YW50cy5IRUFERVJfSUNPTl9SRUNUX1dJRFRIKTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0V2lkdGgoaGVhZGVySWNvbkdyYXBoaWNzQWxnLCBKUEFFZGl0b3JDb25zdGFudHMuSEVBREVSX0lDT05fUkVDVF9IRUlHSFQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBsYXlvdXRQb2x5bGluZShpbnQgY29udGFpbmVyV2lkdGgsCi0JCQlHcmFwaGljc0FsZ29yaXRobSBncmFwaGljc0FsZ29yaXRobSkgewotCQlib29sZWFuIGFueXRoaW5nQ2hhbmdlZDsKLQkJUG9seWxpbmUgaGVhZGVyQm90dG9tTGluZSA9IChQb2x5bGluZSkgZ3JhcGhpY3NBbGdvcml0aG07Ci0JCVBvaW50IHNlY29uZFBvaW50ID0gaGVhZGVyQm90dG9tTGluZS5nZXRQb2ludHMoKS5nZXQoMSk7Ci0JCVBvaW50IG5ld1NlY29uZFBvaW50ID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlUG9pbnQoLyogaGVhZGVyQm90dG9tTGluZSwgKi8KLQkJCQljb250YWluZXJXaWR0aCwgc2Vjb25kUG9pbnQuZ2V0WSgpKTsKLQkJaGVhZGVyQm90dG9tTGluZS5nZXRQb2ludHMoKS5zZXQoMSwgbmV3U2Vjb25kUG9pbnQpOwotCQlhbnl0aGluZ0NoYW5nZWQgPSB0cnVlOwotCQlyZXR1cm4gYW55dGhpbmdDaGFuZ2VkOwotCX0KLQotCXByaXZhdGUgdm9pZCBsYXlvdXRBdHRyaWJ1dGVzR3JvdXBzKGJvb2xlYW4gYW55dGhpbmdDaGFuZ2VkLCBHcmFwaGljc0FsZ29yaXRobSBncmFwaGljc0FsZ29yaXRobSwKLQkJCWludCBjb250YWluZXJXaWR0aCkgewotCQlDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSA9IChDb250YWluZXJTaGFwZSkgR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0QWN0aXZlQ29udGFpbmVyUGUoZ3JhcGhpY3NBbGdvcml0aG0pOwotCQlsYXlvdXRDb25jcmV0ZUNvbXBhcnRtZW50U2hhcGUoYW55dGhpbmdDaGFuZ2VkLCBjb250YWluZXJTaGFwZSwgY29udGFpbmVyV2lkdGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBsYXlvdXRDb25jcmV0ZUNvbXBhcnRtZW50U2hhcGUoYm9vbGVhbiBhbnl0aGluZ0NoYW5nZWQsIENvbnRhaW5lclNoYXBlIGNvbnRhaW5lclNoYXBlLAotCQkJaW50IGNvbnRhaW5lcldpZHRoKSB7Ci0KLQkJbGF5b3V0Q29tcGFydG1lbnRTaGFwZShjb250YWluZXJTaGFwZSwgY29udGFpbmVyV2lkdGgpOwotCi0JCUl0ZXJhdG9yPFNoYXBlPiBpdGVyID0gY29udGFpbmVyU2hhcGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJU2hhcGUgc2hhcGUgPSBpdGVyLm5leHQoKTsKLQkJCUdyYXBoaWNzQWxnb3JpdGhtIGdyYXBoaWNzQWxnb3JpdGhtID0gc2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJCWlmIChncmFwaGljc0FsZ29yaXRobSBpbnN0YW5jZW9mIFJlY3RhbmdsZSkgewotCQkJCVJlY3RhbmdsZSByZWN0ID0gKFJlY3RhbmdsZSkgZ3JhcGhpY3NBbGdvcml0aG07Ci0JCQkJTGlzdDxHcmFwaGljc0FsZ29yaXRobT4gZ3JhID0gcmVjdC5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCk7Ci0JCQkJaWYoZ3JhLmlzRW1wdHkoKSl7Ci0JCQkJCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldFdpZHRoKGdyYXBoaWNzQWxnb3JpdGhtLCBjb250YWluZXJXaWR0aCk7Ci0JCQkJfQotCQkJCUl0ZXJhdG9yPEdyYXBoaWNzQWxnb3JpdGhtPiBpdCA9IGdyYS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJR3JhcGhpY3NBbGdvcml0aG0gZ3IgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChnciBpbnN0YW5jZW9mIEltYWdlKSB7Ci0JCQkJCQlsYXlvdXRBdHRyaWJ1dGVJY29uKHNoYXBlLCBncmFwaGljc0FsZ29yaXRobSk7Ci0JCQkJCX0KLQkJCQkJaWYgKGdyIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCQkJbGF5b3V0QXR0cmlidXRlVGV4dChjb250YWluZXJXaWR0aCwgZ3JhcGhpY3NBbGdvcml0aG0sIGdyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlhbnl0aGluZ0NoYW5nZWQgPSB0cnVlOwotCQkJfSAKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsYXlvdXRBdHRyaWJ1dGVUZXh0KGludCBjb250YWluZXJXaWR0aCwKLQkJCUdyYXBoaWNzQWxnb3JpdGhtIGdyYXBoaWNzQWxnb3JpdGhtLCBHcmFwaGljc0FsZ29yaXRobSBncikgewotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRXaWR0aChncmFwaGljc0FsZ29yaXRobSwKLQkJCQkJCWNvbnRhaW5lcldpZHRoIC0gSlBBRWRpdG9yQ29uc3RhbnRzLkFUVFJJQlVURV9URVhUX1JFQ1RfV0lEVEhfUkVEVUNFUik7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldFdpZHRoKGdyLAotCQkJCQkJY29udGFpbmVyV2lkdGggLSBKUEFFZGl0b3JDb25zdGFudHMuQVRUUklCVVRFX1RFWFRfUkVDVF9XSURUSF9SRURVQ0VSKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGF5b3V0QXR0cmlidXRlSWNvbihTaGFwZSBzaGFwZSwKLQkJCUdyYXBoaWNzQWxnb3JpdGhtIGdyYXBoaWNzQWxnb3JpdGhtKSB7CQkKLQkJR3JhcGhpY3NBbGdvcml0aG0gaGVhZGVySWNvbkdyYXBoaWNzQWxnID0gc2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0V2lkdGgoZ3JhcGhpY3NBbGdvcml0aG0sSlBBRWRpdG9yQ29uc3RhbnRzLklDT05fUkVDVF9XSURUSCk7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldFdpZHRoKGhlYWRlckljb25HcmFwaGljc0FsZywgSlBBRWRpdG9yQ29uc3RhbnRzLklDT05fUkVDVF9XSURUSCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxheW91dENvbXBhcnRtZW50U2hhcGUoQ29udGFpbmVyU2hhcGUgY29udGFpbmVyU2hhcGUsCi0JCQlpbnQgY29udGFpbmVyV2lkdGgpIHsKLQkJR3JhcGhpY3NBbGdvcml0aG0gZ3JhcGhpYyA9IGNvbnRhaW5lclNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCUxpc3Q8R3JhcGhpY3NBbGdvcml0aG0+IGdyYXBoaWNzID0gZ3JhcGhpYy5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCk7Ci0JCUl0ZXJhdG9yPEdyYXBoaWNzQWxnb3JpdGhtPiBpdGVyYXRvciA9IGdyYXBoaWNzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUdyYXBoaWNzQWxnb3JpdGhtIGdyYXBoaWNzQWxnb3JpdGhtID0gaXRlcmF0b3IubmV4dCgpOwotCQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0V2lkdGgoZ3JhcGhpYywgY29udGFpbmVyV2lkdGgpOwotCQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0V2lkdGgoZ3JhcGhpY3NBbGdvcml0aG0sIGNvbnRhaW5lcldpZHRoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvTW92ZUF0dHJpYnV0ZUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL01vdmVBdHRyaWJ1dGVGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOWU2MzkuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvTW92ZUF0dHJpYnV0ZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSU1vdmVTaGFwZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5EZWZhdWx0TW92ZVNoYXBlRmVhdHVyZTsKLQotLyoKLSAqIFRoZSBhdHRyaWJ1dGUgc2hhcGVzIChyZXNpZGluZyB3aXRoaW4gdGhlIGVudGl0eSBzaGFwZXMpIAotICogYXJlIE5PVCBzdXBwb3NlZCB0byBiZSBtb3ZlYWJsZSAoYXQgbGVhc3QgLSBub3QgYnkgCi0gKiBkcmFnLWFuZC1kcm9wKS4gVGhlIG9ubHkgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIAotICogZGlzYWJsZSB0aGlzIGFiaWxpdHkKLSAqIAotICovCi0KLXB1YmxpYyBjbGFzcyBNb3ZlQXR0cmlidXRlRmVhdHVyZSBleHRlbmRzIERlZmF1bHRNb3ZlU2hhcGVGZWF0dXJlIHsKLQlwdWJsaWMgTW92ZUF0dHJpYnV0ZUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0gICAgcHVibGljIGJvb2xlYW4gY2FuTW92ZVNoYXBlKElNb3ZlU2hhcGVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKElDb250ZXh0IGNvbnRleHQpIHsKLSAgICAJcmV0dXJuIGZhbHNlOwotICAgIH0JCi0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9Nb3ZlRW50aXR5RmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvTW92ZUVudGl0eUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZiZjNjYS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9Nb3ZlRW50aXR5RmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcucmVvcmcuUmVvcmdNb3ZlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFNpdGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgTW92ZUVudGl0eUZlYXR1cmUgZXh0ZW5kcyBSZWZhY3RvckVudGl0eUZlYXR1cmUgewkKLQkKLQlwdWJsaWMgTW92ZUVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JCUlXb3JrYmVuY2hTaXRlIHdzID0gKChJRWRpdG9yUGFydClnZXREaWFncmFtRWRpdG9yKCkpLmdldFNpdGUoKTsKLQkJUmVvcmdNb3ZlQWN0aW9uIGFjdGlvbiA9IG5ldyBSZW9yZ01vdmVBY3Rpb24od3MpOwotCQlleGVjdXRlKGNvbnRleHQsIGFjdGlvbiwgY3UpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JNZXNzYWdlcy5Nb3ZlRW50aXR5RmVhdHVyZV9Db250ZXh0TWVudU9wZXJhdGlvbkRlc2NyaXB0aW9uOwotCX0KLQkKLQkJCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9Nb3ZlRW50aXR5U2hhcGVGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9Nb3ZlRW50aXR5U2hhcGVGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMTY3YTcuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvTW92ZUVudGl0eVNoYXBlRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JTW92ZVNoYXBlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5pbXBsLkRlZmF1bHRNb3ZlU2hhcGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotCi0KLXB1YmxpYyBjbGFzcyBNb3ZlRW50aXR5U2hhcGVGZWF0dXJlIGV4dGVuZHMgRGVmYXVsdE1vdmVTaGFwZUZlYXR1cmUgewotCi0JcHVibGljIE1vdmVFbnRpdHlTaGFwZUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG1vdmVBbGxCZW5kcG9pbnRzKElNb3ZlU2hhcGVDb250ZXh0IGNvbnRleHQpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcG9zdE1vdmVTaGFwZShJTW92ZVNoYXBlQ29udGV4dCBjb250ZXh0KSB7Ci0JCUNvbnRhaW5lclNoYXBlIGNzID0gKENvbnRhaW5lclNoYXBlKWNvbnRleHQuZ2V0U2hhcGUoKTsKLQkJSlBBRWRpdG9yVXRpbC5yZWFycmFuZ2VBbGxDb25uZWN0aW9ucyhjcywgZ2V0RmVhdHVyZVByb3ZpZGVyKCksIGZhbHNlKTsKLQkJQ29sbGVjdGlvbjxDb250YWluZXJTaGFwZT4gY3NzID0gSlBBRWRpdG9yVXRpbC5nZXRSZWxhdGVkU2hhcGVzKGNzKTsKLQkJSXRlcmF0b3I8Q29udGFpbmVyU2hhcGU+IGNzSXQgPSBjc3MuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGNzSXQuaGFzTmV4dCgpKSB7Ci0JCQlDb250YWluZXJTaGFwZSBjczEgPSBjc0l0Lm5leHQoKTsKLQkJCUpQQUVkaXRvclV0aWwucmVhcnJhbmdlQWxsQ29ubmVjdGlvbnMoY3MxLCBnZXRGZWF0dXJlUHJvdmlkZXIoKSwgdHJ1ZSk7Ci0JCX0KLQl9CQotCQotCQlAT3ZlcnJpZGUKLQkgCXByb3RlY3RlZCB2b2lkIGludGVybmFsTW92ZShmaW5hbCBJTW92ZVNoYXBlQ29udGV4dCBjb250ZXh0KSB7Ci0JIAkJUGljdG9ncmFtRWxlbWVudCBlbCA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudCgpOwotCSAJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGVsKTsKLQkgCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkgCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCSAJCQkgICBtb3ZlKGNvbnRleHQpOwotCSAJCQl9Ci0JIAkJfSk7Ci0JIAl9Ci0JIAkKLQkgCXB1YmxpYyB2b2lkIG1vdmUoSU1vdmVTaGFwZUNvbnRleHQgY29udGV4dCl7Ci0JIAkJc3VwZXIuaW50ZXJuYWxNb3ZlKGNvbnRleHQpOwotCSAJfQotCQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuICAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9CQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9PcGVuSlBBRGV0YWlsc1ZpZXdGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9PcGVuSlBBRGV0YWlsc1ZpZXdGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2Zjg4MWMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvT3BlbkpQQURldGFpbHNWaWV3RmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLkFic3RyYWN0Q3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi1wdWJsaWMgY2xhc3MgT3BlbkpQQURldGFpbHNWaWV3RmVhdHVyZSBleHRlbmRzIEFic3RyYWN0Q3VzdG9tRmVhdHVyZSB7Ci0JCi0JcHVibGljIE9wZW5KUEFEZXRhaWxzVmlld0ZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0JCi0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCXRyeSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS4KLQkJCQkJc2hvd1ZpZXcoSlBBRWRpdG9yQ29uc3RhbnRzLklEX1ZJRVdfSlBBX0RFVEFJTFMpOwotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW4ndCBvcGVuIEpQQSBEZXRhaWxzIHZpZXciLCBlKTsgIC8vJE5PTi1OTFMtMSQJCSAJCi0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfb3BlbkpQQURldGFpbHNWaWV3OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvT3Blbk1pbmlhdHVyZVZpZXdGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9PcGVuTWluaWF0dXJlVmlld0ZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkNzg1Ni4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9PcGVuTWluaWF0dXJlVmlld0ZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5BYnN0cmFjdEN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotcHVibGljIGNsYXNzIE9wZW5NaW5pYXR1cmVWaWV3RmVhdHVyZSBleHRlbmRzIEFic3RyYWN0Q3VzdG9tRmVhdHVyZSB7Ci0JCi0JcHVibGljIE9wZW5NaW5pYXR1cmVWaWV3RmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJdHJ5IHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLgotCQkJCQlzaG93VmlldyhKUEFFZGl0b3JDb25zdGFudHMuSURfVklFV19NSU5JQVRVUkUpOwotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW4ndCBvcGVuIE1pbmlhdHVyZSB2aWV3IiwgZSk7ICAvLyROT04tTkxTLTEkCQkgCQkJCi0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfb3Blbk1pbmlhdHVyZVZpZXc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZWZhY3RvckF0dHJpYnV0ZVR5cGVGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZWZhY3RvckF0dHJpYnV0ZVR5cGVGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YzQzODcuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVmYWN0b3JBdHRyaWJ1dGVUeXBlRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5BYnN0cmFjdEN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmRpYWxvZy5TZWxlY3RUeXBlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFNpdGU7Ci0KLQotcHVibGljIGNsYXNzIFJlZmFjdG9yQXR0cmlidXRlVHlwZUZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEN1c3RvbUZlYXR1cmUgewotCi0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFjZXJJIHRyYWNlciA9IFRyYWNpbmdNYW5hZ2VyLmdldFRyYWNlcihSZWZhY3RvckF0dHJpYnV0ZVR5cGVGZWF0dXJlLmNsYXNzKTsJCQkJCi0JCi0JcHVibGljIFJlZmFjdG9yQXR0cmlidXRlVHlwZUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkJCQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50cygpWzBdOwotCQlPYmplY3QgYm8gPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotCQlpZiAoKGJvID09IG51bGwpIHx8ICghKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpKSkKLQkJCQlyZXR1cm47Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSlibzsKLQkJU3RyaW5nIHR5cGVOYW1lID0gSlBBRWRpdG9yVXRpbC5nZXRBdHRyaWJ1dGVUeXBlTmFtZVdpdGhHZW5lcmljcyhqcGEpOwotCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSlBBRWRpdG9yTWVzc2FnZXMuU2VsZWN0VHlwZURpYWxvZ19jaG9vc2VBdHRyaWJ1dGVUeXBlRGlhbG9nVGV4dCwgCi0JCQkJanBhLmdldE5hbWUoKSwgSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKCgoUGVyc2lzdGVudFR5cGUpanBhLmdldFBhcmVudCgpKS5nZXROYW1lKCkpKTsJCQotCQlTZWxlY3RUeXBlRGlhbG9nIGQgPSBuZXcgU2VsZWN0VHlwZURpYWxvZyhtc2csIHR5cGVOYW1lKTsKLQkJaWYgKGQub3BlbigpICE9IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBuZXdUeXBlTmFtZSA9IGQuZ2V0VHlwZU5hbWUoKTsKLQkJU3RyaW5nW10gYXR0cmlidXRlVHlwZVR5cGVOYW1lcyA9IEpQQUVkaXRvclV0aWwuZ2V0R2VuZXJpY3NFbGVtZW50VHlwZXMobmV3VHlwZU5hbWUpOwotCQlpZiAoYXR0cmlidXRlVHlwZVR5cGVOYW1lcyAhPSBudWxsKQotCQkJbmV3VHlwZU5hbWUgPSBuZXdUeXBlTmFtZS5zdWJzdHJpbmcoMCwgbmV3VHlwZU5hbWUuaW5kZXhPZignPCcpKS50cmltKCk7Ci0JCQotCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5hZGRBZGRJZ25vcmUoKEphdmFQZXJzaXN0ZW50VHlwZSlqcGEuZ2V0UGFyZW50KCksIGpwYS5nZXROYW1lKCkpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUganJhID0ganBhLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JCWdldEZlYXR1cmVQcm92aWRlcigpLmFkZFJlbW92ZUlnbm9yZSgoSmF2YVBlcnNpc3RlbnRUeXBlKWpwYS5nZXRQYXJlbnQoKSwganJhLmdldE5hbWUoKSk7Ci0JCWJvb2xlYW4gaXNNZXRob2RBbm5vdGF0ZWQgPSBqcmEuZ2V0S2luZCgpID09IEtpbmQuTUVUSE9EOwotCi0JCUxpc3Q8U3RyaW5nPiBhbm5vdGF0aW9ucyA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEFubm90YXRpb25TdHJpbmdzKGpwYSk7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmRlbGV0ZUF0dHJpYnV0ZSgoSmF2YVBlcnNpc3RlbnRUeXBlKWpwYS5nZXRQYXJlbnQoKSwganBhLmdldE5hbWUoKSwKLQkJCQlnZXRGZWF0dXJlUHJvdmlkZXIoKSk7CQkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmV3QXQgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5jcmVhdGVBTmV3QXR0cmlidXRlKChKYXZhUGVyc2lzdGVudFR5cGUpanBhLmdldFBhcmVudCgpLAotCQkJCWpwYS5nZXROYW1lKCksIG5ld1R5cGVOYW1lLCBhdHRyaWJ1dGVUeXBlVHlwZU5hbWVzLCBqcGEuZ2V0TmFtZSgpLCBhbm5vdGF0aW9ucywKLQkJCQlmYWxzZSwgaXNNZXRob2RBbm5vdGF0ZWQsIGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkucmVwbGFjZUF0dHJpYnV0ZShqcGEsIG5ld0F0KTsKLSAgICAgICAgSVdvcmtiZW5jaFNpdGUgd3MgPSAoKElFZGl0b3JQYXJ0KWdldERpYWdyYW1FZGl0b3IoKSkuZ2V0U2l0ZSgpOwotICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KChKYXZhUGVyc2lzdGVudFR5cGUpbmV3QXQuZ2V0UGFyZW50KCkpOwotICAgICAgICBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRKUEFFZGl0b3JVdGlsKCkuZm9ybWF0Q29kZShjdSwgd3MpOwkJCQkJCi0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlbWFrZVJlbGF0aW9ucyhnZXRGZWF0dXJlUHJvdmlkZXIoKSwgCi0JCQkJKChTaGFwZSlwZSkuZ2V0Q29udGFpbmVyKCksIChKYXZhUGVyc2lzdGVudFR5cGUpbmV3QXQuZ2V0UGFyZW50KCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcikgc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpQQUVkaXRvck1lc3NhZ2VzLlJlZmFjdG9yQXR0cmlidXRlVHlwZUZlYXR1cmVfQ29udGV4dE1lbnVPcGVyYXRpb25EZXNjcmlwdGlvbjsKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlZmFjdG9yRW50aXR5RmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVmYWN0b3JFbnRpdHlGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MDY4OGMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVmYWN0b3JFbnRpdHlGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkFkZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLlJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLkFic3RyYWN0Q3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlJvdW5kZWRSZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuYWN0aW9ucy5TZWxlY3Rpb25EaXNwYXRjaEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuQWRkRW50aXR5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQVNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmYWN0b3JFbnRpdHlGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RDdXN0b21GZWF0dXJlIHsKLQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgU2V0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHMgPSBudWxsOwotCXByb3RlY3RlZCBib29sZWFuIGhhc05hbWVBbm5vdGF0aW9uID0gZmFsc2U7Ci0KLQlwdWJsaWMgUmVmYWN0b3JFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZShJQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgCWlmICghKGNvbnRleHQgaW5zdGFuY2VvZiBJQ3VzdG9tQ29udGV4dCkpCi0gICAgCQlyZXR1cm4gZmFsc2U7Ci0gICAgCUlDdXN0b21Db250ZXh0IGN0eCA9IChJQ3VzdG9tQ29udGV4dCljb250ZXh0OwotICAgIAlQaWN0b2dyYW1FbGVtZW50IHBlID0gY3R4LmdldElubmVyUGljdG9ncmFtRWxlbWVudCgpOwotICAgIAlPYmplY3QgYm8gPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotICAgIAlpZiAoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLSAgICAJCWpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpYm87Ci0gICAgCQloYXNOYW1lQW5ub3RhdGlvbiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmhhc05hbWVBbm5vdGF0aW9uKGpwdCk7Ci0gICAgCQlyZXR1cm4gdHJ1ZTsKLSAgICAJfQotICAgIAlpZiAocGUgaW5zdGFuY2VvZiBTaGFwZSkgewotICAgIAkJQ29udGFpbmVyU2hhcGUgY3MgPSAoKFNoYXBlKXBlKS5nZXRDb250YWluZXIoKTsKLSAgICAJCWlmIChjcyA9PSBudWxsKQotICAgIAkJCXJldHVybiBmYWxzZTsKLSAgICAgCQlibyA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChjcyk7Ci0gICAgICAgIAlpZiAoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLSAgICAgICAgCQlqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWJvOwotICAgICAgICAJCWhhc05hbWVBbm5vdGF0aW9uID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaGFzTmFtZUFubm90YXRpb24oanB0KTsKLSAgICAgICAgCQlyZXR1cm4gdHJ1ZTsKLSAgICAgICAgCX0KLSAgICAJfSAgICAJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQsIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIGFjdGlvbiwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGN1KTsKLQkJZmluYWwgU2hhcGUgcGljdCA9IChTaGFwZSlnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoanB0KTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpZ2V0RmVhdHVyZVByb3ZpZGVyKCkuCi0JCQkJCQkJCQlnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGljdCk7Ci0JCWZpbmFsIEpQQUVkaXRvckNvbnN0YW50cy5ESUFHUkFNX09CSkVDVF9UWVBFIGRvdCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmRldGVybWluZURpYWdyYW1PYmplY3RUeXBlKGpwdCk7Ci0JCWZpbmFsIFBlcnNpc3RlbmNlVW5pdCBwdSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdChqcHQpOwotCQlmaW5hbCBTZW1hcGhvcmUgcyA9IG5ldyBTZW1hcGhvcmUoMCk7Ci0JCWZpbmFsIEpQQVByb2plY3RMaXN0ZW5lciBsc25yID0gbmV3IEpQQVByb2plY3RMaXN0ZW5lcihzKTsKLQkJanB0LmdldEpwYVByb2plY3QoKS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoSnBhUHJvamVjdC5KUEFfRklMRVNfQ09MTEVDVElPTiwgbHNucik7Ci0JCVNob3dCdXN5IHNob3dCdXN5ID0gbmV3IFNob3dCdXN5KHMpOwotCQlKUEFTb2x2ZXIuaWdub3JlRXZlbnRzID0gdHJ1ZTsKLQkJZmluYWwgU3RyaW5nIG9sZE5hbWUgPSBqcHQuZ2V0TmFtZSgpOwotCQkKLQkJdHJ5IHsKLQkJCWFjdGlvbi5ydW4oc2VsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9IAotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgc2hvd0J1c3kpOwotCQlqcHQuZ2V0SnBhUHJvamVjdCgpLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihKcGFQcm9qZWN0LkpQQV9GSUxFU19DT0xMRUNUSU9OLCBsc25yKTsKLQkJSlBBU29sdmVyLmlnbm9yZUV2ZW50cyA9IGZhbHNlOwotCQlmaW5hbCBib29sZWFuIHJlbmFtZSA9IFJlbmFtZUVudGl0eUZlYXR1cmUuY2xhc3MuaXNJbnN0YW5jZSh0aGlzKTsKLQkJCi0JCWlmICghc2hvd0J1c3kuaXNNb3ZlZCgpKSAKLQkJCXJldHVybjsKLQkJCi0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKHBpY3QpOwotCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCXJlbWFwRW50aXR5KG9sZE5hbWUsIHBpY3QsIHB1LCByZW5hbWUsIGxzbnIsIGRvdCwgZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQkJfQotCQl9KTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCwgU3RyaW5nIG5ld05hbWUsIElDb21waWxhdGlvblVuaXQgY3UsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJZmluYWwgSlBBRWRpdG9yQ29uc3RhbnRzLkRJQUdSQU1fT0JKRUNUX1RZUEUgZG90ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZGV0ZXJtaW5lRGlhZ3JhbU9iamVjdFR5cGUoanB0KTsKLQkJZmluYWwgU3RyaW5nIG9sZE5hbWUgPSBqcHQuZ2V0TmFtZSgpOwotCQlmaW5hbCBTaGFwZSBwaWN0ID0gKFNoYXBlKWdldEZlYXR1cmVQcm92aWRlcigpLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChqcHQpOwotCQlqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWdldEZlYXR1cmVQcm92aWRlcigpLgotCQkJCQkJCQkJZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBpY3QpOwkJCi0JCWZpbmFsIFBlcnNpc3RlbmNlVW5pdCBwdSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdChqcHQpOwotCQlmaW5hbCBTZW1hcGhvcmUgcyA9IG5ldyBTZW1hcGhvcmUoMCk7Ci0JCWZpbmFsIEpQQVByb2plY3RMaXN0ZW5lciBsc25yID0gbmV3IEpQQVByb2plY3RMaXN0ZW5lcihzKTsKLQkJanB0LmdldEpwYVByb2plY3QoKS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoSnBhUHJvamVjdC5KUEFfRklMRVNfQ09MTEVDVElPTiwgbHNucik7Ci0JCVNob3dCdXN5IHNob3dCdXN5ID0gbmV3IFNob3dCdXN5KHMpOwotCQlKUEFTb2x2ZXIuaWdub3JlRXZlbnRzID0gdHJ1ZTsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVuYW1lRW50aXR5Q2xhc3MoanB0LCBuZXdOYW1lLCBnZXRGZWF0dXJlUHJvdmlkZXIoKSk7CQkKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheS5nZXRDdXJyZW50KCksIHNob3dCdXN5KTsKLQkJanB0LmdldEpwYVByb2plY3QoKS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoSnBhUHJvamVjdC5KUEFfRklMRVNfQ09MTEVDVElPTiwgbHNucik7Ci0JCUpQQVNvbHZlci5pZ25vcmVFdmVudHMgPSBmYWxzZTsJCQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihwaWN0KTsKLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlyZW1hcEVudGl0eShvbGROYW1lLCBwaWN0LCBwdSwgdHJ1ZSwgbHNuciwgZG90LCBnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtYXBFbnRpdHkoZmluYWwgU3RyaW5nIG9sZE5hbWUsCi0JCQkJCQkJCSAgIGZpbmFsIFNoYXBlIHBpY3QsCi0JCQkJCQkJCSAgIGZpbmFsIFBlcnNpc3RlbmNlVW5pdCBwdSwKLQkJCQkJCQkJICAgZmluYWwgYm9vbGVhbiByZW5hbWUsCi0JCQkJCQkJCSAgIGZpbmFsIEpQQVByb2plY3RMaXN0ZW5lciBsc25yLAotCQkJCQkJCQkgICBmaW5hbCBKUEFFZGl0b3JDb25zdGFudHMuRElBR1JBTV9PQkpFQ1RfVFlQRSBkb3QsCi0JCQkJCQkJCSAgIGZpbmFsIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheS5nZXRDdXJyZW50KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBUT0RPIGZpZ3VyZSBvdXQgd2h5IHRoaXMgd2FzIG5lY2Vzc2FyeToKLQkJCQkvLyBwdS5nZXRKcGFQcm9qZWN0KCkudXBkYXRlQW5kV2FpdCgpOwotCQkJCWZpbmFsIGludCB4ID0gcGljdC5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldFgoKTsKLQkJCQlmaW5hbCBpbnQgeSA9IHBpY3QuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRZKCk7Ci0JCQkJZmluYWwgaW50IHdpZHRoID0gcGljdC5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldFdpZHRoKCk7Ci0JCQkJZmluYWwgaW50IGhlaWdodCA9IHBpY3QuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRIZWlnaHQoKTsJCQotCQkJCQotCQkJCWZpbmFsIENvbnRhaW5lclNoYXBlIGNzID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuY3JlYXRlQ29udGFpbmVyU2hhcGUoZnAuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW0oKSwgCi0JCQkJCQl0cnVlKTsKLQkJCQljcy5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQotCQkJCUFkZENvbnRleHQgY29udCA9IG5ldyBBZGRDb250ZXh0KCk7Ci0JCQkJY29udC5zZXRYKHgpOwotCQkJCWNvbnQuc2V0WSh5KTsKLQkJCQljb250LnNldFdpZHRoKHdpZHRoKTsKLQkJCQljb250LnNldEhlaWdodChoZWlnaHQpOwotCQkJCVJvdW5kZWRSZWN0YW5nbGUgcmVjdCA9IEFkZEpQQUVudGl0eUZlYXR1cmUuY3JlYXRlRW50aXR5UmVjdGFuZ2xlKGNvbnQsIGNzLCBkb3QsIGZwLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCkpOyAJCi0JCQkJcmVjdC5zZXRGaWxsZWQodHJ1ZSk7Ci0JCQkJCi0JCQkJSVJlbW92ZUNvbnRleHQgY3R4ID0gbmV3IFJlbW92ZUNvbnRleHQocGljdCk7IAotCQkJCVJlbW92ZUpQQUVudGl0eUZlYXR1cmUgZnQgPSBuZXcgUmVtb3ZlSlBBRW50aXR5RmVhdHVyZShmcCwgdHJ1ZSk7Ci0JCQkJCi0JCQkJYm9vbGVhbiBwcmltYXJ5Q29sbGFwc2VkID0gSlBBRWRpdG9yQ29uc3RhbnRzLlRSVUVfU1RSSU5HLmVxdWFscyhHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRQcm9wZXJ0eVZhbHVlKHBpY3QsIEpQQUVkaXRvckNvbnN0YW50cy5QUklNQVJZX0NPTExBUFNFRCkpOwotCQkJCWJvb2xlYW4gcmVsYXRpb25Db2xsYXBzZWQgPSBKUEFFZGl0b3JDb25zdGFudHMuVFJVRV9TVFJJTkcuZXF1YWxzKEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUocGljdCwgSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX0NPTExBUFNFRCkpOwotCQkJCWJvb2xlYW4gYmFzaWNDb2xsYXBzZWQgPSBKUEFFZGl0b3JDb25zdGFudHMuVFJVRV9TVFJJTkcuZXF1YWxzKEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUocGljdCwgSlBBRWRpdG9yQ29uc3RhbnRzLkJBU0lDX0NPTExBUFNFRCkpOwotCi0JCQkJQWRkRW50aXR5Q29udGV4dCBhZGRDdHggPSBuZXcgQWRkRW50aXR5Q29udGV4dChwcmltYXJ5Q29sbGFwc2VkLCByZWxhdGlvbkNvbGxhcHNlZCwgYmFzaWNDb2xsYXBzZWQpOwotCQkJCVN0cmluZyBuZXdKUFROYW1lID0gbHNuci5nZXROZXdKUFROYW1lKCk7Ci0JCQkJCi0JCQkJSmF2YVBlcnNpc3RlbnRUeXBlIG5ld0pQVCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEpQVChuZXdKUFROYW1lLCBwdSk7Ci0JCQkJaWYgKCFKcHRKcGFDb3JlUGx1Z2luLmdldERpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyhuZXdKUFQuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKSkpIHsKLQkJCQkJSlBBRWRpdG9yVXRpbC5jcmVhdGVVbnJlZ2lzdGVyRW50aXR5RnJvbVhNTEpvYihuZXdKUFQuZ2V0SnBhUHJvamVjdCgpLCBvbGROYW1lKTsKLQkJCQl9CQkJCQkJCQkJCi0JCQkJaWYgKHJlbmFtZSkgewotCQkJCQlTdHJpbmcgdGFibGVOYW1lID0gSlBBRWRpdG9yVXRpbC5mb3JtVGFibGVOYW1lKG5ld0pQVCk7Ci0JCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnNldFRhYmxlTmFtZShuZXdKUFQsIHRhYmxlTmFtZSk7Ci0JCQkJfQotCQkJCWFkZEN0eC5zZXROZXdPYmplY3QobmV3SlBUKTsKLQkJCQlhZGRDdHguc2V0VGFyZ2V0Q29udGFpbmVyKGZwLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCkpOwotCQkJCWFkZEN0eC5zZXRYKHgpOwotCQkJCWFkZEN0eC5zZXRZKHkpOwotCQkJCWFkZEN0eC5zZXRXaWR0aCh3aWR0aCk7Ci0JCQkJYWRkQ3R4LnNldEhlaWdodChoZWlnaHQpOwotCQkJCUFkZEpQQUVudGl0eUZlYXR1cmUgZnQxID0gbmV3IEFkZEpQQUVudGl0eUZlYXR1cmUoZnAsIHRydWUpOwotCQkJCWZ0LnJlbW92ZShjdHgpOwotCQkJCWZ0MS5hZGQoYWRkQ3R4KTsKLQkJCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gZnAuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KG5ld0pQVCk7Ci0JCQkJZnAuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW1FZGl0b3IoKS5zZXRQaWN0b2dyYW1FbGVtZW50Rm9yU2VsZWN0aW9uKHBlKTsKLQkJCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5kZWxldGVQaWN0b2dyYW1FbGVtZW50KGNzKTsJCi0JCQkJCi0JCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKGZwLCBuZXdKUFQpOwotCQkJCWlmICghSnB0SnBhQ29yZVBsdWdpbi5nZXREaXNjb3ZlckFubm90YXRlZENsYXNzZXMobmV3SlBULmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJCUpQQUVkaXRvclV0aWwuY3JlYXRlUmVnaXN0ZXJFbnRpdHlJblhNTEpvYihuZXdKUFQuZ2V0SnBhUHJvamVjdCgpLCBuZXdKUFROYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQl9Ci0JCi0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGdldEZlYXR1cmVQcm92aWRlcigpLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCk7Ci0JfQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0JCi0JY2xhc3MgU2hvd0J1c3kgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXByaXZhdGUgU2VtYXBob3JlIHM7Ci0JCWJvb2xlYW4gbW92ZWQgPSBmYWxzZTsKLQkJU2hvd0J1c3koU2VtYXBob3JlIHMpIHsKLQkJCXRoaXMucyA9IHM7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJbW92ZWQgPSBzLnRyeUFjcXVpcmUoMiwgNCwgVGltZVVuaXQuU0VDT05EUyk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiVGhyZWFkIGludGVycnVwdGVkIiwgZSk7ICAvLyROT04tTkxTLTEkCQkgCQkJCQkJCQotCQkJfQotCQl9Ci0KLQkJYm9vbGVhbiBpc01vdmVkKCkgewotCQkJcmV0dXJuIG1vdmVkOwotCQl9CQkKLQl9Ci0JCi0JcHVibGljIGNsYXNzIEpQQVByb2plY3RMaXN0ZW5lciBpbXBsZW1lbnRzIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciB7Ci0JCXByaXZhdGUgU2VtYXBob3JlIHMgPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBuZXdKcHROYW1lID0gbnVsbDsKLQkJCi0JCXB1YmxpYyBKUEFQcm9qZWN0TGlzdGVuZXIoU2VtYXBob3JlIHMpIHsKLQkJCXRoaXMucyA9IHM7Ci0JCX0KLQkJCQkJCQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJSXRlcmF0b3I8Pz4gaXQgPSBldmVudC5nZXRJdGVtcygpLml0ZXJhdG9yKCk7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCUpwYUZpbGUganBhRmlsZSA9IChKcGFGaWxlKW87Ci0JCQkKLQkJCUpwdFJlc291cmNlTW9kZWwgcm0gPSBqcGFGaWxlLmdldFJlc291cmNlTW9kZWwoKTsKLQkJCWlmIChybSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWlmICghSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmNsYXNzLmlzSW5zdGFuY2Uocm0pKQotCQkJCXJldHVybjsKLQkJCUphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqcmN1ID0gKEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdClybTsKLQkJCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBqcnQgPSBqcmN1LmdldFByaW1hcnlUeXBlKCk7CQkKLQkJCW5ld0pwdE5hbWUgPSBqcnQuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkJcy5yZWxlYXNlKCk7Ci0JCQlpZiAoKGF0cyA9PSBudWxsKSB8fCBoYXNOYW1lQW5ub3RhdGlvbikKLQkJCQlyZXR1cm47Ci0JCQlmaW5hbCBJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gaXRlciA9IGF0cy5pdGVyYXRvcigpOwotCQkJUnVubmFibGUgciA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCUhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gYXRPbGRUb05ld05hbWUgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPigpOwotCQkJCQlTZXQ8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG5ld1NlbGZBdHMgPSBuZXcgSGFzaFNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdCgoSmF2YVBlcnNpc3RlbnRUeXBlKSBhdC5nZXRQYXJlbnQoKSk7Ci0JCQkJCQlpZiAoIWN1LmV4aXN0cygpKSB7Ci0JCQkJCQkJYXQgPSAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpYXQuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UGVyc2lzdGVudFR5cGUobmV3SnB0TmFtZSkuZ2V0QXR0cmlidXRlTmFtZWQoYXQuZ2V0TmFtZSgpKTsKLQkJCQkJCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBuZXdBdCA9IG51bGw7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbmV3QXQgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZW5hbWVBdHRyaWJ1dGUoYXQsIEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShuZXdKcHROYW1lKSwgbmV3SnB0TmFtZSwgZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQkJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJYXRPbGRUb05ld05hbWUucHV0KGF0LmdldE5hbWUoKSwgbmV3QXQuZ2V0TmFtZSgpKTsKLQkJCQkJCQluZXdTZWxmQXRzLmFkZChuZXdBdCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlbmFtZUF0dHJpYnV0ZShhdCwgSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKG5ld0pwdE5hbWUpLCBuZXdKcHROYW1lLCBnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gaXRyID0gIG5ld1NlbGZBdHMuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0ID0gaXRyLm5leHQoKTsKLQkJCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCAoSmF2YVBlcnNpc3RlbnRUeXBlKWF0LmdldFBhcmVudCgpKTsKLQkJCQkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIG0gPSBhdC5nZXRNYXBwaW5nKCk7Ci0JCQkJCQlBbm5vdGF0aW9uIG1hcHBpbmdBbm5vdGF0aW9uID0gbS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQkJCQkJCQkJCQkKLQkJCQkJCWlmKG1hcHBpbmdBbm5vdGF0aW9uID09IG51bGwpewotCQkJCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChnZXRGZWF0dXJlUHJvdmlkZXIoKSwgKEphdmFQZXJzaXN0ZW50VHlwZSlhdC5nZXRQYXJlbnQoKSk7Ci0JCQkJCQkJbWFwcGluZ0Fubm90YXRpb24gPSBtLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQkJCQl9CQotCQkJCQkJaWYgKG1hcHBpbmdBbm5vdGF0aW9uID09IG51bGwpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJaWYgKE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbi5jbGFzcy5pc0luc3RhbmNlKG1hcHBpbmdBbm5vdGF0aW9uKSkgewotCQkJCQkJCU93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBvd25hYmxlTWFwcGluZ0Fubm90YXRpb24gPSAoT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uKW1hcHBpbmdBbm5vdGF0aW9uOwotCQkJCQkJCVN0cmluZyBvbGRNYXBwZWRCeSA9IG93bmFibGVNYXBwaW5nQW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpOwotCQkJCQkJCWlmIChvbGRNYXBwZWRCeSAhPSBudWxsKSB7Ci0JCQkJCQkJCVN0cmluZyBuZXdNYXBwZWRCeSA9IGF0T2xkVG9OZXdOYW1lLmdldChvbGRNYXBwZWRCeSk7Ci0JCQkJCQkJCWlmIChuZXdNYXBwZWRCeSAhPSBudWxsKQotCQkJCQkJCQkJb3duYWJsZU1hcHBpbmdBbm5vdGF0aW9uLnNldE1hcHBlZEJ5KG5ld01hcHBlZEJ5KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQkJCQkKLQkJCX07Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMocik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGFyZzApIHsKLQkJCXMucmVsZWFzZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGFyZzApIHt9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldE5ld0pQVE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmV3SnB0TmFtZTsKLQkJfQotCQkKLQotCX07Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbW92ZUFsbEVudGl0aWVzRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVtb3ZlQWxsRW50aXRpZXNGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNWY2Y2UuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVtb3ZlQWxsRW50aXRpZXNGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JUmVtb3ZlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuUmVtb3ZlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uQWJzdHJhY3RDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZSBleHRlbmRzIEFic3RyYWN0Q3VzdG9tRmVhdHVyZSB7Ci0KLQlwcm90ZWN0ZWQgU2V0PFNoYXBlPiBhbGxTaGFwZXMgPSBuZXcgSGFzaFNldDxTaGFwZT4oKTsKLQkKLQlwdWJsaWMgUmVtb3ZlQWxsRW50aXRpZXNGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldENvbmZpcm1hdGlvblRleHQoKTsKLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGdldEZlYXR1cmVQcm92aWRlcigpLmdldERpYWdyYW0oKSk7Ci0JCUl0ZXJhdG9yPFNoYXBlPiBpdCA9IGFsbFNoYXBlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlTaGFwZSBzaCA9IGl0Lm5leHQoKTsKLQkJCWZpbmFsIFJlbW92ZUpQQUVudGl0eUZlYXR1cmUgZnQgPSBuZXcgUmVtb3ZlSlBBRW50aXR5RmVhdHVyZSh0aGlzLmdldEZlYXR1cmVQcm92aWRlcigpLCBmYWxzZSk7Ci0JCQlmaW5hbCBJUmVtb3ZlQ29udGV4dCBjdHggPSBuZXcgUmVtb3ZlQ29udGV4dChzaCk7Ci0JCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJCWZ0LnJlbW92ZShjdHgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpIHN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVtb3ZlQW5kU2F2ZUVudGl0eUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbW92ZUFuZFNhdmVFbnRpdHlGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYzQ1MWYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVtb3ZlQW5kU2F2ZUVudGl0eUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLlJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5EZWZhdWx0UmVtb3ZlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi0KLXB1YmxpYyBjbGFzcyBSZW1vdmVBbmRTYXZlRW50aXR5RmVhdHVyZSBleHRlbmRzIERlZmF1bHRSZW1vdmVGZWF0dXJlIHsKLQkKLSAgICBwdWJsaWMgUmVtb3ZlQW5kU2F2ZUVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotICAgIAlzdXBlcihmcCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByZVJlbW92ZShJUmVtb3ZlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAJT2JqZWN0IGJvID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLSAgICAJU2V0PFNoYXBlPiBzaGFwZXNGb3JEZWxldGlvbiA9IG5ldyBIYXNoU2V0PFNoYXBlPigpOwotICAgIAlpZiAoYm8gaW5zdGFuY2VvZiBQZXJzaXN0ZW50VHlwZSkgewotICAgIAkJSUZlYXR1cmVQcm92aWRlciBmcCA9IGdldEZlYXR1cmVQcm92aWRlcigpOwotICAgIAkJTGlzdDxTaGFwZT4gbHN0ID0gKChDb250YWluZXJTaGFwZSlwZSkuZ2V0Q2hpbGRyZW4oKTsKLSAgICAJCWZvciAoaW50IGkgPSBsc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAJCQlTaGFwZSB0ZXh0U2hhcGUgPSBsc3QuZ2V0KGkpOwotICAgIAkJCU9iamVjdCBvID0gZnAuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHRleHRTaGFwZSk7Ci0gICAgCQkJaWYgKChvICE9IG51bGwpICYmIChvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpKSB7Ci0gICAgCQkJCXNoYXBlc0ZvckRlbGV0aW9uLmFkZCh0ZXh0U2hhcGUpOwotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJCUl0ZXJhdG9yPFNoYXBlPiBpdCA9IHNoYXBlc0ZvckRlbGV0aW9uLml0ZXJhdG9yKCk7Ci0gICAgCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLQkJCQlSZW1vdmVBdHRyaWJ1dGVGZWF0dXJlIGYgPSBuZXcgUmVtb3ZlQXR0cmlidXRlRmVhdHVyZShmcCwgZmFsc2UsIHRydWUpOwotCQkJCUlSZW1vdmVDb250ZXh0IGN0eCA9IG5ldyBSZW1vdmVDb250ZXh0KGl0Lm5leHQoKSk7Ci0JCQkJZi5yZW1vdmUoY3R4KTsgICAgCQkJCi0gICAgCQl9Ci0gICAgCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5yZW1vdmUoKChQZXJzaXN0ZW50VHlwZSlibykuZ2V0TmFtZSgpLCB0cnVlKTsgCi0gICAgCX0gCQkJCi0gICAgfQotICAgIAotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuICAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3N0UmVtb3ZlKElSZW1vdmVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVhcnJhbmdlSXNBUmVsYXRpb25zKGdldEZlYXR1cmVQcm92aWRlcigpKTsgICAgCQotICAgIH0KLQkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbW92ZUF0dHJpYnV0ZUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbW92ZUF0dHJpYnV0ZUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQzZGQ5MS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZW1vdmVBdHRyaWJ1dGVGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JUmVtb3ZlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQWRkQ29ubmVjdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLlJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLklDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmltcGwuRGVmYXVsdFJlbW92ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlQXR0cmlidXRlRmVhdHVyZSBleHRlbmRzIERlZmF1bHRSZW1vdmVGZWF0dXJlIHsKLQotCXByaXZhdGUgYm9vbGVhbiBza2lwUmVtb3ZlUmVsYXRpb25zID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHNraXBDcmVhdGVSZWxhdGlvbnMgPSBmYWxzZTsKLQlwcml2YXRlIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBudWxsOwotCXByaXZhdGUgSUN1c3RvbUZlYXR1cmUgZ3JhcGhpY2FsUmVtb3ZlOwotCi0JcHVibGljIFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQl0aGlzKGZwLCBuZXcgR3JhcGhpY2FsUmVtb3ZlQXR0cmlidXRlRmVhdHVyZShmcCkpOwotCX0KLQotCXB1YmxpYyBSZW1vdmVBdHRyaWJ1dGVGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnAsIGJvb2xlYW4gc2tpcFJlbW92ZVJlbGF0aW9ucywgYm9vbGVhbiBza2lwQ3JlYXRlUmVsYXRpb25zKSB7Ci0JCXRoaXMoZnApOwotCQl0aGlzLnNraXBSZW1vdmVSZWxhdGlvbnMgPSBza2lwUmVtb3ZlUmVsYXRpb25zOwotCQl0aGlzLnNraXBDcmVhdGVSZWxhdGlvbnMgPSBza2lwQ3JlYXRlUmVsYXRpb25zOwotCX0KLQotCXB1YmxpYyBSZW1vdmVBdHRyaWJ1dGVGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnAsIElDdXN0b21GZWF0dXJlIGdyYXBoaWNhbFJlbW92ZSkgewotCQlzdXBlcihmcCk7Ci0JCXRoaXMuZ3JhcGhpY2FsUmVtb3ZlID0gZ3JhcGhpY2FsUmVtb3ZlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KSB7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoSUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShJQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcikgc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJlUmVtb3ZlKElSZW1vdmVDb250ZXh0IGNvbnRleHQpIHsKLQkJZmluYWwgUGljdG9ncmFtRWxlbWVudCBwZSA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudCgpOwotCQlpZiAocGUgPT0gbnVsbCkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiUGljdG9ncmFtRWxlbWVudCBpcyBudWxsXG4iLCBuZXcgRXhjZXB0aW9uKCkpOyAgLy8kTk9OLU5MUy0xJAkJIAkJCQkJCQkKLQkJCXJldHVybjsKLQkJfQotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JCU9iamVjdCBibyA9IGZwLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSk7Ci0JCWlmKGJvID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSBibzsKLQkJCQotCQkJSGFzaFNldDxTdHJpbmc+IGlnbm9yZXMgPSAoKEpQQUVkaXRvckZlYXR1cmVQcm92aWRlcikgZ2V0RmVhdHVyZVByb3ZpZGVyKCkpLmdldEFkZElnbm9yZSgpOwotCQkJaWYgKCFpZ25vcmVzLmlzRW1wdHkoKSkgewotCQkJCUl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGlnbm9yZXMuaXRlcmF0b3IoKTsKLQkJCQlpZiAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJU3RyaW5nIGl0ZXJTdHIgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGl0ZXJTdHIuZW5kc1dpdGgoanBhLmdldE5hbWUoKSkpIHsKLQkJCQkJCWlnbm9yZXMucmVtb3ZlKGl0ZXJTdHIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWpwYS5nZXRQYXJlbnQoKTsKLQkJCWZwLnJlbW92ZShmcC5nZXRLZXlGb3JCdXNpbmVzc09iamVjdChibykpOwotCQkJaWYgKCFza2lwUmVtb3ZlUmVsYXRpb25zKSB7Ci0JCQkJSVJlbGF0aW9uIHJlbCA9IGZwLmdldFJlbGF0aW9uUmVsYXRlZFRvQXR0cmlidXRlKGpwYSk7Ci0JCQkJcmVtb3ZlUmVsYXRpb24ocmVsKTsKLQkJCX0KLQkJfQotCi0JCUNvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlID0gKChDb250YWluZXJTaGFwZSkgcGUpLmdldENvbnRhaW5lcigpLmdldENvbnRhaW5lcigpOwotCQl0cnl7Ci0JCWdyYXBoaWNhbFJlbW92ZUF0dHJpYnV0ZShlbnRpdHlTaGFwZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoZSk7IAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdyYXBoaWNhbFJlbW92ZUF0dHJpYnV0ZShQaWN0b2dyYW1FbGVtZW50IHBlKSB7Ci0JCUN1c3RvbUNvbnRleHQgY3VzdG9tQ29udGV4dCA9IG5ldyBDdXN0b21Db250ZXh0KCk7Ci0JCWN1c3RvbUNvbnRleHQuc2V0SW5uZXJQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQkJZ3JhcGhpY2FsUmVtb3ZlLmV4ZWN1dGUoY3VzdG9tQ29udGV4dCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVJlbGF0aW9uKElSZWxhdGlvbiByZWwpIHsKLQkJaWYgKHJlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDb25uZWN0aW9uIGNvbm4gPSAoQ29ubmVjdGlvbikgZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KHJlbCk7Ci0JCVJlbW92ZUNvbnRleHQgY3R4ID0gbmV3IFJlbW92ZUNvbnRleHQoY29ubik7Ci0JCVJlbW92ZVJlbGF0aW9uRmVhdHVyZSBmdCA9IG5ldyBSZW1vdmVSZWxhdGlvbkZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQlmdC5yZW1vdmUoY3R4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwb3N0UmVtb3ZlKElSZW1vdmVDb250ZXh0IGNvbnRleHQpIHsKLQkJaWYgKHNraXBDcmVhdGVSZWxhdGlvbnMpCi0JCQlyZXR1cm47Ci0JCWlmIChqcHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKGdldEZlYXR1cmVQcm92aWRlcigpLCBqcHQpOwotCi0JCUNvbGxlY3Rpb248SVJlbGF0aW9uPiByZWxzID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkKLQkJCQkucHJvZHVjZUFsbFJlbGF0aW9ucyhqcHQsIGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJSXRlcmF0b3I8SVJlbGF0aW9uPiBpdGVyID0gcmVscy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlSZWxhdGlvbiByZWwgPSBpdGVyLm5leHQoKTsKLQkJCUNvbnRhaW5lclNoYXBlIG93bmVyU2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIGdldEZlYXR1cmVQcm92aWRlcigpLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdCgKLQkJCQkJcmVsLmdldE93bmVyKCkpOwotCQkJQ29udGFpbmVyU2hhcGUgaW52ZXJzZVNoYXBlID0gKENvbnRhaW5lclNoYXBlKSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoCi0JCQkJCXJlbC5nZXRJbnZlcnNlKCkpOwotCQkJQWRkQ29ubmVjdGlvbkNvbnRleHQgY250eCA9IG5ldyBBZGRDb25uZWN0aW9uQ29udGV4dChKUEFFZGl0b3JVdGlsLmdldEFuY2hvcihvd25lclNoYXBlKSwgSlBBRWRpdG9yVXRpbAotCQkJCQkuZ2V0QW5jaG9yKGludmVyc2VTaGFwZSkpOwotCQkJY250eC5zZXROZXdPYmplY3QocmVsKTsKLQkJCUFkZFJlbGF0aW9uRmVhdHVyZSBmdCA9IG5ldyBBZGRSZWxhdGlvbkZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQkJZnQuYWRkKGNudHgpOwotCQl9Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlYXJyYW5nZUlzQVJlbGF0aW9ucyhnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVtb3ZlSlBBRW50aXR5RmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVtb3ZlSlBBRW50aXR5RmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWJmYjQ3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbW92ZUpQQUVudGl0eUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLlJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5EZWZhdWx0UmVtb3ZlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotcHVibGljIGNsYXNzIFJlbW92ZUpQQUVudGl0eUZlYXR1cmUgZXh0ZW5kcyBEZWZhdWx0UmVtb3ZlRmVhdHVyZSB7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFJlYXJyYW5nZUlzQVJlbGF0aW9ucyA9IHRydWU7Ci0JCi0gICAgcHVibGljIFJlbW92ZUpQQUVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCwgYm9vbGVhbiBzaG91bGRSZWFycmFuZ2VJc0FSZWxhdGlvbnMpIHsKLSAgICAJc3VwZXIoZnApOwotICAgIAl0aGlzLnNob3VsZFJlYXJyYW5nZUlzQVJlbGF0aW9ucyA9IHNob3VsZFJlYXJyYW5nZUlzQVJlbGF0aW9uczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHJlUmVtb3ZlKElSZW1vdmVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAJUGljdG9ncmFtRWxlbWVudCBwZSA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudCgpOwotICAgIAlmaW5hbCBPYmplY3QgYm8gPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotICAgIAlTZXQ8U2hhcGU+IHNoYXBlc0ZvckRlbGV0aW9uID0gbmV3IEhhc2hTZXQ8U2hhcGU+KCk7Ci0gICAgCWlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotICAgIAkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpYm87Ci0gICAgCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZXN0b3JlRW50aXR5Q2xhc3MoanB0LCBnZXRGZWF0dXJlUHJvdmlkZXIoKSk7ICAgIAkJCi0gICAgCQlJRmVhdHVyZVByb3ZpZGVyIGZwID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0gICAgCQlMaXN0PFNoYXBlPiBsc3QgPSAoKENvbnRhaW5lclNoYXBlKXBlKS5nZXRDaGlsZHJlbigpOwotICAgIAkJZm9yIChpbnQgaSA9IGxzdC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgIAkJCVNoYXBlIHRleHRTaGFwZSA9IGxzdC5nZXQoaSk7Ci0gICAgCQkJT2JqZWN0IG8gPSBmcC5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQodGV4dFNoYXBlKTsKLSAgICAJCQlpZiAoKG8gIT0gbnVsbCkgJiYgKG8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkpIHsKLSAgICAJCQkJc2hhcGVzRm9yRGVsZXRpb24uYWRkKHRleHRTaGFwZSk7Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAkJSXRlcmF0b3I8U2hhcGU+IGl0ID0gc2hhcGVzRm9yRGVsZXRpb24uaXRlcmF0b3IoKTsKLSAgICAJCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJCVJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUgZiA9IG5ldyBSZW1vdmVBdHRyaWJ1dGVGZWF0dXJlKGZwLCBmYWxzZSwgdHJ1ZSk7Ci0JCQkJSVJlbW92ZUNvbnRleHQgY3R4ID0gbmV3IFJlbW92ZUNvbnRleHQoaXQubmV4dCgpKTsKLQkJCQlmLnJlbW92ZShjdHgpOyAgICAJCQkKLSAgICAJCX0KLSAgICAJCVN0cmluZyBuYW1lID0gKChQZXJzaXN0ZW50VHlwZSlibykuZ2V0TmFtZSgpOwotCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkucmVtb3ZlKG5hbWUsIHRydWUpOwotICAgIAl9IAkJCQotICAgIH0KLSAgICAKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAgKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ29udGV4dCBjdHgpIHsKLQkJaWYgKCFJUmVtb3ZlQ29udGV4dC5jbGFzcy5pc0luc3RhbmNlKGN0eCkpIAotCQkJcmV0dXJuOwotCQlJUmVtb3ZlQ29udGV4dCBjb250ZXh0ID0gKElSZW1vdmVDb250ZXh0KWN0eDsgCi0gICAgCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAJT2JqZWN0IGJvID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLSAgICAJaWYgKCFKYXZhUGVyc2lzdGVudFR5cGUuY2xhc3MuaXNJbnN0YW5jZShibykpCi0gICAgCQlyZXR1cm47Ci0gICAgCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWJvOwotCQlpZiAoSlBBRWRpdG9yVXRpbC5pc0VudGl0eU9wZW5FbHNld2hlcmUoanB0LCB0cnVlKSkgewotCQkJU3RyaW5nIHNob3J0RW50TmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKGpwdCkpOwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChKUEFFZGl0b3JNZXNzYWdlcy5SZW1vdmVKUEFFbnRpdHlGZWF0dXJlX2Rpc2NhcmRXYXJuaW5nTXNnLCBzaG9ydEVudE5hbWUpOwotCQkJTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkpQQVNvbHZlcl9jbG9zZUVkaXRvcnMsIG51bGwsIG1lc3NhZ2UsCi0JCQlNZXNzYWdlRGlhbG9nLldBUk5JTkcsIG5ldyBTdHJpbmdbXXtKUEFFZGl0b3JNZXNzYWdlcy5CVE5fT0ssIEpQQUVkaXRvck1lc3NhZ2VzLkJUTl9DQU5DRUx9LCAwKSB7Ci0JCQkJcHJvdGVjdGVkIGludCBnZXRTaGVsbFN0eWxlKCkgewotCQkJCQlyZXR1cm4gU1dULkNMT1NFIAotCQkJCQl8IFNXVC5USVRMRSB8IFNXVC5CT1JERVIKLQkJCQkJfCBTV1QuQVBQTElDQVRJT05fTU9EQUwKLQkJCQkJfCBnZXREZWZhdWx0T3JpZW50YXRpb24oKTt9fTsKLQkJCWlmIChkaWFsb2cub3BlbigpICE9IDApCQotCQkJCXJldHVybjsgICAgCQkJCi0JCX0JCQotCQlzdXBlci5leGVjdXRlKGNvbnRleHQpOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCBwb3N0UmVtb3ZlKElSZW1vdmVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAJaWYgKHNob3VsZFJlYXJyYW5nZUlzQVJlbGF0aW9ucykKLSAgICAJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlYXJyYW5nZUlzQVJlbGF0aW9ucyhnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0gICAgfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbW92ZVJlbGF0aW9uRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVtb3ZlUmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNzNlMWQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVtb3ZlUmVsYXRpb25GZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklSZW1vdmVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JUmVtb3ZlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuUmVtb3ZlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5pbXBsLkFic3RyYWN0RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnNlcnZpY2VzLkdyYXBoaXRpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLkFic3RyYWN0UmVsYXRpb247Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBSZW1vdmVSZWxhdGlvbkZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEZlYXR1cmUgaW1wbGVtZW50cyBJUmVtb3ZlRmVhdHVyZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSBNZXNzYWdlcy5EZWZhdWx0UmVtb3ZlRmVhdHVyZV8wX3hmbGQ7CQotCi0JcHVibGljIFJlbW92ZVJlbGF0aW9uRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwKTsKLQl9Ci0JCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoSUNvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9CQotCi0gICAgcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlKElSZW1vdmVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAJcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoSUNvbnRleHQgY29udGV4dCkgewotICAgIAlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHJlUmVtb3ZlKElSZW1vdmVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAJUGljdG9ncmFtRWxlbWVudCBwZSA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudCgpOwotICAgIAlPYmplY3QgYm8gPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotICAgIAlpZiAoYm8gaW5zdGFuY2VvZiBBYnN0cmFjdFJlbGF0aW9uKSB7Ci0gICAgCQlBYnN0cmFjdFJlbGF0aW9uIHJlbCA9IChBYnN0cmFjdFJlbGF0aW9uKWJvOwotICAgIAkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkucmVtb3ZlKHJlbC5nZXRJZCgpKTsKLSAgICAJfSAgICAJCi0gICAgfSAgICAKLSAgICAgICAgCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlKGZpbmFsIElSZW1vdmVDb250ZXh0IGNvbnRleHQpIHsKLQkJaWYgKCFnZXRVc2VyRGVjaXNpb24oKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXByZVJlbW92ZShjb250ZXh0KTsKLQkJZmluYWwgUGljdG9ncmFtRWxlbWVudCBwZSA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudCgpOwotCQlpZiAocGUgPT0gbnVsbCkgCi0JCQlyZXR1cm47Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKHBlKTsKLQkJUmVjb3JkaW5nQ29tbWFuZCByYyA9IG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCWlmIChwZSBpbnN0YW5jZW9mIFNoYXBlKSB7Ci0JCQkJCVNoYXBlIHNoYXBlID0gKFNoYXBlKSBwZTsKLQkJCQkJcmVtb3ZlQWxsQ29ubmVjdGlvbnMoc2hhcGUpOwotCQkJCX0KLQkJCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5kZWxldGVQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQkJCQlwb3N0UmVtb3ZlKGNvbnRleHQpOwotCQkJfQotCQl9OwotCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShyYyk7Ci0JfQotICAgIAotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFsbENvbm5lY3Rpb25zKFNoYXBlIHNoYXBlKSB7Ci0JCUlGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JCWZvciAoSXRlcmF0b3I8QW5jaG9yPiBpdGVyID0gc2hhcGUuZ2V0QW5jaG9ycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQW5jaG9yIGFuY2hvciA9IGl0ZXIubmV4dCgpOwotCQkJZm9yIChJdGVyYXRvcjxDb25uZWN0aW9uPiBpdGVyYXRvciA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldEFsbENvbm5lY3Rpb25zKGFuY2hvcikuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoY29ubmVjdGlvbi5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCUlSZW1vdmVDb250ZXh0IHJjID0gbmV3IFJlbW92ZUNvbnRleHQoY29ubmVjdGlvbik7Ci0JCQkJCUlSZW1vdmVGZWF0dXJlIHJlbW92ZUZlYXR1cmUgPSBmZWF0dXJlUHJvdmlkZXIuZ2V0UmVtb3ZlRmVhdHVyZShyYyk7Ci0JCQkJCWlmIChyZW1vdmVGZWF0dXJlICE9IG51bGwpIHsKLQkJCQkJCUNvbm5lY3Rpb25EZWNvcmF0b3IgZGVjb3JhdG9yc1tdID0gY29ubmVjdGlvbi5nZXRDb25uZWN0aW9uRGVjb3JhdG9ycygpLnRvQXJyYXkobmV3IENvbm5lY3Rpb25EZWNvcmF0b3JbMF0pOwotCQkJCQkJZm9yIChDb25uZWN0aW9uRGVjb3JhdG9yIGRlY29yYXRvciA6IGRlY29yYXRvcnMpIHsKLQkJCQkJCQlpZiAoZGVjb3JhdG9yICE9IG51bGwgJiYgKGRlY29yYXRvci5lUmVzb3VyY2UoKSAhPSBudWxsKSkgewotCQkJCQkJCQlFY29yZVV0aWwuZGVsZXRlKGRlY29yYXRvciwgdHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJcmVtb3ZlRmVhdHVyZS5yZW1vdmUocmMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcG9zdFJlbW92ZShJUmVtb3ZlQ29udGV4dCBjb250ZXh0KSB7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5BTUU7Ci0JfQotCQkKLSAgICAKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAgKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfSAgICAKLSAgICAKLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUNvbnRleHQgY29udGV4dCkgewotCQlpZiAoY29udGV4dCBpbnN0YW5jZW9mIElSZW1vdmVDb250ZXh0KSB7Ci0JCQlyZW1vdmUoKElSZW1vdmVDb250ZXh0KWNvbnRleHQpOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVuYW1lRW50aXR5RmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVuYW1lRW50aXR5RmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjU4Y2ZhLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbmFtZUVudGl0eUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLmFjdGlvbnMuUmVuYW1lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFNpdGU7Ci0KLQotCi1wdWJsaWMgY2xhc3MgUmVuYW1lRW50aXR5RmVhdHVyZSBleHRlbmRzIFJlZmFjdG9yRW50aXR5RmVhdHVyZSB7Ci0KLQlwdWJsaWMgUmVuYW1lRW50aXR5RmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCQlJV29ya2JlbmNoU2l0ZSB3cyA9ICgoSUVkaXRvclBhcnQpZ2V0RGlhZ3JhbUVkaXRvcigpKS5nZXRTaXRlKCk7Ci0JCVJlbmFtZUFjdGlvbiBhY3Rpb24gPSBuZXcgUmVuYW1lQWN0aW9uKHdzKTsKLQkJYXRzID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0UmVsYXRlZEF0dHJpYnV0ZXMoanB0KTsKLQkJZXhlY3V0ZShjb250ZXh0LCBhY3Rpb24sIGN1KTsJCQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JNZXNzYWdlcy5SZW5hbWVFbnRpdHlGZWF0dXJlX0NvbnRleHRNZW51T3BlcmF0aW9uRGVzY3JpcHRpb247Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVuYW1lRW50aXR5V2l0aG91dFVJRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVuYW1lRW50aXR5V2l0aG91dFVJRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjhiZTdjLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbmFtZUVudGl0eVdpdGhvdXRVSUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5DdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIFJlbmFtZUVudGl0eVdpdGhvdXRVSUZlYXR1cmUgZXh0ZW5kcyBSZWZhY3RvckVudGl0eUZlYXR1cmUgewotCQotCXByaXZhdGUgU3RyaW5nIG5ld05hbWUgPSBudWxsOwotCi0JcHVibGljIFJlbmFtZUVudGl0eVdpdGhvdXRVSUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJc3VwZXIoZnApOwotCQl0aGlzLm5ld05hbWUgPSBuZXdOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JCWF0cyA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldFJlbGF0ZWRBdHRyaWJ1dGVzKGpwdCk7Ci0JCWV4ZWN1dGUobmV3IEN1c3RvbUNvbnRleHQoKSwgbmV3TmFtZSwgY3UsIGpwdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCS8vIG5vdCB1c2VkCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVzaXplQXR0cmlidXRlRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVzaXplQXR0cmlidXRlRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjMwOGFiLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1Jlc2l6ZUF0dHJpYnV0ZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlc2l6ZVNoYXBlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5pbXBsLkRlZmF1bHRSZXNpemVTaGFwZUZlYXR1cmU7Ci0KLQotcHVibGljIGNsYXNzIFJlc2l6ZUF0dHJpYnV0ZUZlYXR1cmUgIGV4dGVuZHMgRGVmYXVsdFJlc2l6ZVNoYXBlRmVhdHVyZSB7Ci0KLQlwdWJsaWMgUmVzaXplQXR0cmlidXRlRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwKTsKLQl9Ci0JCi0gICAgcHVibGljIGJvb2xlYW4gY2FuUmVzaXplU2hhcGUoSVJlc2l6ZVNoYXBlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShJQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZShJQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1Jlc2l6ZUpQQUVudGl0eUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1Jlc2l6ZUpQQUVudGl0eUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JmNTliOS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZXNpemVKUEFFbnRpdHlGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklSZXNpemVTaGFwZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5EZWZhdWx0UmVzaXplU2hhcGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgUmVzaXplSlBBRW50aXR5RmVhdHVyZSBleHRlbmRzIERlZmF1bHRSZXNpemVTaGFwZUZlYXR1cmUgewotCi0JcHVibGljIFJlc2l6ZUpQQUVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotICAgICAgICBzdXBlcihmcCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2FuUmVzaXplU2hhcGUoSVJlc2l6ZVNoYXBlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGJvb2xlYW4gY2FuUmVzaXplID0gc3VwZXIuY2FuUmVzaXplU2hhcGUoY29udGV4dCk7Ci0gICAgICAgIGlmIChjYW5SZXNpemUpIHsKLSAgICAgICAgCVNoYXBlIHNoYXBlID0gY29udGV4dC5nZXRTaGFwZSgpOwotICAgICAgICAgICAgT2JqZWN0IGJvID0gZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHNoYXBlKTsgICAgICAgCQotICAgICAgICAgICAgaWYgKGJvID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmIChibyBpbnN0YW5jZW9mIFBlcnNpc3RlbnRUeXBlKSB7Ci0gICAgICAgICAgICAJUGVyc2lzdGVudFR5cGUgYyA9IChQZXJzaXN0ZW50VHlwZSkgYm87Ci0gICAgICAgICAgICAgICAgaWYgKGMuZ2V0TmFtZSgpICE9IG51bGwgJiYgCi0gICAgICAgICAgICAgICAgCQljLmdldE5hbWUoKS5sZW5ndGgoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhblJlc2l6ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2FuUmVzaXplOwotICAgIH0KLSAgICAKLQlwcml2YXRlIHZvaWQgcmVzaXplQ29udGFpbmVyU2hhcGUoSVJlc2l6ZVNoYXBlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXN1cGVyLnJlc2l6ZVNoYXBlKGNvbnRleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2l6ZVNoYXBlKGZpbmFsIElSZXNpemVTaGFwZUNvbnRleHQgY29udGV4dCkgewotCQlmaW5hbCBDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSA9IChDb250YWluZXJTaGFwZSkgY29udGV4dC5nZXRTaGFwZSgpOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihlbnRpdHlTaGFwZSk7Ci0JCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCXJlc2l6ZUNvbnRhaW5lclNoYXBlKGNvbnRleHQpOwotCQkJCUpQQUVkaXRvclV0aWwucmVhcnJhbmdlQWxsQ29ubmVjdGlvbnMoZW50aXR5U2hhcGUsCi0JCQkJCQlnZXRGZWF0dXJlUHJvdmlkZXIoKSwgZmFsc2UpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQkKLSAgICAKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1Jlc3RvcmVFbnRpdHlGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZXN0b3JlRW50aXR5RmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGI2NzQ3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1Jlc3RvcmVFbnRpdHlGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uQWJzdHJhY3RDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLXB1YmxpYyBjbGFzcyBSZXN0b3JlRW50aXR5RmVhdHVyZSBleHRlbmRzIEFic3RyYWN0Q3VzdG9tRmVhdHVyZSB7Ci0JCi0JcHVibGljIFJlc3RvcmVFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50cygpWzBdKTsKLQkJaWYgKEpQQUVkaXRvclV0aWwuaXNFbnRpdHlPcGVuRWxzZXdoZXJlKGpwdCwgdHJ1ZSkpIHsKLQkJCVN0cmluZyBzaG9ydEVudE5hbWUgPSBKUEFFZGl0b3JVdGlsCi0JCQkJCS5yZXR1cm5TaW1wbGVOYW1lKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpCi0JCQkJCQkJLmdldEVudGl0eU5hbWUoanB0KSk7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KUEFTb2x2ZXJfY2xvc2VXYXJuaW5nTXNnLCBzaG9ydEVudE5hbWUpOwotCQkJTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KUEFTb2x2ZXJfY2xvc2VFZGl0b3JzLCBudWxsLCBtZXNzYWdlLAotCQkJCQlNZXNzYWdlRGlhbG9nLldBUk5JTkcsCi0JCQkJCW5ldyBTdHJpbmdbXSB7IEpQQUVkaXRvck1lc3NhZ2VzLkJUTl9PSyB9LCAwKSB7Ci0JCQkJcHJvdGVjdGVkIGludCBnZXRTaGVsbFN0eWxlKCkgewotCQkJCQlyZXR1cm4gU1dULkNMT1NFIHwgU1dULlRJVExFIHwgU1dULkJPUkRFUgotCQkJCQkJCXwgU1dULkFQUExJQ0FUSU9OX01PREFMIHwgZ2V0RGVmYXVsdE9yaWVudGF0aW9uKCk7Ci0JCQkJfQotCQkJfTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVzdG9yZUVudGl0eUNsYXNzKGpwdCwgZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwkJCi0JfQotCQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZGlzY2FyZENoYW5nZXNNZW51SXRlbTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1NhdmVBbmRSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1NhdmVBbmRSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY2NWQ1MS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9TYXZlQW5kUmVtb3ZlQWxsRW50aXRpZXNGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0KLXB1YmxpYyBjbGFzcyBTYXZlQW5kUmVtb3ZlQWxsRW50aXRpZXNGZWF0dXJlIGV4dGVuZHMgUmVtb3ZlQWxsRW50aXRpZXNGZWF0dXJlIHsKLQotCXB1YmxpYyBTYXZlQW5kUmVtb3ZlQWxsRW50aXRpZXNGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENvbmZpcm1hdGlvblRleHQoKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbmRTYXZlQWxsRW50aXRpZXNDb25maXJtYXRpb247Ci0JfQotCQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCU1lc3NhZ2VEaWFsb2cgZGxnID0gbmV3IE1lc3NhZ2VEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U2hlbGxzKClbMF0sIAotCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFsbEVudGl0aWVzTWVudSwgCi0JCQkJbnVsbCwgZ2V0Q29uZmlybWF0aW9uVGV4dCgpLCAwLCAKLQkJCQluZXcgU3RyaW5nW10ge0pQQUVkaXRvck1lc3NhZ2VzLkJUTl9PSywgSlBBRWRpdG9yTWVzc2FnZXMuQlROX0NBTkNFTH0sIERpYWxvZy5DQU5DRUwpOwotCQlpZiAoZGxnLm9wZW4oKSAhPSBEaWFsb2cuT0spCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yPFNoYXBlPiBpdCA9IHRoaXMuZ2V0RGlhZ3JhbSgpLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJU2hhcGUgc2ggPSBpdC5uZXh0KCk7Ci0JCQlTYXZlRW50aXR5RmVhdHVyZSBmdCA9IG5ldyBTYXZlRW50aXR5RmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQlJQ3VzdG9tQ29udGV4dCBjdHggPSBuZXcgQ3VzdG9tQ29udGV4dChuZXcgUGljdG9ncmFtRWxlbWVudFtdIHsgc2ggfSk7Ci0JCQlmdC5leGVjdXRlKGN0eCk7Ci0JCQlhbGxTaGFwZXMuYWRkKHNoKTsKLQkJfQotCQlzdXBlci5leGVjdXRlKGNvbnRleHQpOwotCX0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuU2F2ZUFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZV9Db250ZXh0TWVudU9wZXJhdGlvbkRlc2NyaXB0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1NhdmVFbnRpdHlGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9TYXZlRW50aXR5RmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTg5NjQ3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1NhdmVFbnRpdHlGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uQWJzdHJhY3RDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgU2F2ZUVudGl0eUZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEN1c3RvbUZlYXR1cmUgewotCi0JcHVibGljIFNhdmVFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQkKLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50cygpWzBdKTsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZm9yY2VTYXZlRW50aXR5Q2xhc3MoanB0LCBnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JfQotCQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2F2ZU1lbnVJdGVtOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvVXBkYXRlQXR0cmlidXRlRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvVXBkYXRlQXR0cmlidXRlRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjRhZDhhLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1VwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQWRkQ29ubmVjdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkFkZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLkFic3RyYWN0Q3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5zdHlsZXMuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5zdHlsZXMuT3JpZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5BbmNob3JDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnNlcnZpY2VzLkdyYXBoaXRpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnV0aWwuSUNvbG9yQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEN1c3RvbUZlYXR1cmUgewotCi0JcHVibGljIFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVjb25uZWN0KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCA9IGdldEZlYXR1cmVQcm92aWRlcigpOwotCQlDb2xsZWN0aW9uPElSZWxhdGlvbj4gcmVscyA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnByb2R1Y2VBbGxSZWxhdGlvbnMoanB0LCBmcCk7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChmcCwganB0KTsKLQotCQlJdGVyYXRvcjxJUmVsYXRpb24+IGl0ID0gcmVscy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJUmVsYXRpb24gcmVsID0gaXQubmV4dCgpOwotCQkJQWRkUmVsYXRpb25GZWF0dXJlIHJlbEYgPSBuZXcgQWRkUmVsYXRpb25GZWF0dXJlKGZwKTsKLQkJCUFuY2hvckNvbnRhaW5lciBhY1NvdXJjZSA9IChBbmNob3JDb250YWluZXIpIGZwLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChyZWwuZ2V0T3duZXIoKSk7Ci0JCQlBbmNob3JDb250YWluZXIgYWNUYXJnZXQgPSAoQW5jaG9yQ29udGFpbmVyKSBmcC5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QocmVsLmdldEludmVyc2UoKSk7Ci0JCQlpZiAoKGFjU291cmNlICE9IG51bGwpICYmIChhY1RhcmdldCAhPSBudWxsKSkgeyAKLQkJCQlBZGRDb25uZWN0aW9uQ29udGV4dCBjdHggPSBuZXcgQWRkQ29ubmVjdGlvbkNvbnRleHQoYWNTb3VyY2UuZ2V0QW5jaG9ycygpLml0ZXJhdG9yKCkubmV4dCgpLCBhY1RhcmdldAotCQkJCQkuZ2V0QW5jaG9ycygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCQljdHguc2V0TmV3T2JqZWN0KHJlbCk7Ci0JCQkJcmVsRi5hZGQoY3R4KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIEdyYXBoaWNhbFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmV9Ci0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCUdyYXBoaWNhbFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUgcmVtb3ZlID0gbmV3IEdyYXBoaWNhbFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQlyZW1vdmUuZXhlY3V0ZShjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBVc2UgR3JhcGhpY2FsQWRkQXR0cmlidXRlRmVhdHVyZQotCSAqIEBwYXJhbSBlbnRpdHlTaGFwZQotCSAqIEBwYXJhbSBuZXdBdHRyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb250YWluZXJTaGFwZSBhZGRBdHRyaWJ1dGVzKENvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlLCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBuZXdBdHRyKSB7Ci0JCUFkZENvbnRleHQgY29udGV4dCA9IG5ldyBBZGRDb250ZXh0KCk7Ci0JCWNvbnRleHQuc2V0TmV3T2JqZWN0KG5ld0F0dHIpOwotCQljb250ZXh0LnNldFRhcmdldENvbnRhaW5lcihlbnRpdHlTaGFwZSk7Ci0JCUdyYXBoaWNhbEFkZEF0dHJpYnV0ZUZlYXR1cmUgZmVhdHVyZSA9IG5ldyBHcmFwaGljYWxBZGRBdHRyaWJ1dGVGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJcmV0dXJuIChDb250YWluZXJTaGFwZSkgZmVhdHVyZS5hZGQoY29udGV4dCk7Ci0JfQotCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpIHN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGV4dCBhZGRUZXh0KElGZWF0dXJlUHJvdmlkZXIgZnAsIFJlY3RhbmdsZSB0ZXh0UmVjdGFuZ2xlLCBTdHJpbmcgdHh0KSB7Ci0JCVRleHQgdGV4dCA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZURlZmF1bHRUZXh0KGZwLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCksIHRleHRSZWN0YW5nbGUsIHR4dCk7Ci0JCUNvbG9yIGNvbG9yID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkubWFuYWdlQ29sb3IoZnAuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW0oKSwKLQkJCQlKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX1RFWFRfRk9SRUdST1VORCk7Ci0JCXRleHQuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JCXRleHQuc2V0SG9yaXpvbnRhbEFsaWdubWVudChPcmllbnRhdGlvbi5BTElHTk1FTlRfTEVGVCk7Ci0JCXRleHQuc2V0VmVydGljYWxBbGlnbm1lbnQoT3JpZW50YXRpb24uQUxJR05NRU5UX1RPUCk7Ci0JCXRleHQuZ2V0Rm9udCgpLnNldEJvbGQodHJ1ZSk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVjdGFuZ2xlIGFkZFJlY3RhbmdsZUZvclRleHQoQ29udGFpbmVyU2hhcGUgY3MsIGludCBhdHRyaWJJbmRleCwgaW50IHdpZHRoKSB7Ci0JCVJlY3RhbmdsZSByZWN0ID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlUmVjdGFuZ2xlKGNzKTsKLQkJcmVjdC5zZXRGaWxsZWQoZmFsc2UpOwotCQlyZWN0LnNldExpbmVWaXNpYmxlKGZhbHNlKTsKLQkJcmVjdC5zZXRIZWlnaHQoSlBBRWRpdG9yQ29uc3RhbnRzLkFUVFJJQlVURV9SRUNUX0hFSUdIVCk7Ci0JCXJlY3Quc2V0V2lkdGgod2lkdGggLSBKUEFFZGl0b3JDb25zdGFudHMuQVRUUklCVVRFX1RFWFRfUkVDVF9XSURUSF9SRURVQ0VSKTsKLQkJcmVjdC5zZXRYKEpQQUVkaXRvckNvbnN0YW50cy5BVFRSSUJVVEVfVEVYVF9SRUNUX1gpOwotCQlyZWN0Ci0JCQkJLnNldFkoSlBBRWRpdG9yQ29uc3RhbnRzLkFUVFJJQlVURVNfVE9QX09GRlNFVCArIGF0dHJpYkluZGV4Ci0JCQkJCQkqIEpQQUVkaXRvckNvbnN0YW50cy5BVFRSSUJVVEVTX1BMQUNFTUVOVF9TVEVQKTsKLQkJcmV0dXJuIHJlY3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZWN0YW5nbGUgYWRkUmVjdGFuZ2xlRm9ySWNvbihDb250YWluZXJTaGFwZSBjcywgaW50IGF0dHJpYkluZGV4KSB7Ci0JCVJlY3RhbmdsZSByZWN0ID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlUmVjdGFuZ2xlKGNzKTsKLQkJcmVjdC5zZXRGaWxsZWQoZmFsc2UpOwotCQlyZWN0LnNldExpbmVWaXNpYmxlKGZhbHNlKTsKLQkJcmVjdC5zZXRIZWlnaHQoSlBBRWRpdG9yQ29uc3RhbnRzLklDT05fUkVDVF9IRUlHSFQpOwotCQlyZWN0LnNldFgoSlBBRWRpdG9yQ29uc3RhbnRzLklDT05fUkVDVF9MRUZUX09GRlNFVCk7Ci0JCXJlY3Quc2V0V2lkdGgoSlBBRWRpdG9yQ29uc3RhbnRzLklDT05fUkVDVF9XSURUSCk7Ci0JCXJlY3QKLQkJCQkuc2V0WShKUEFFZGl0b3JDb25zdGFudHMuQVRUUklCVVRFU19UT1BfT0ZGU0VUICsgYXR0cmliSW5kZXgKLQkJCQkJCSogSlBBRWRpdG9yQ29uc3RhbnRzLkFUVFJJQlVURVNfUExBQ0VNRU5UX1NURVApOwotCQlyZXR1cm4gcmVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRTZXBhcmF0b3JzVG9TaGFwZShDb250YWluZXJTaGFwZSBjb21wYXJ0bWVudFNoYXBlLAotCQkJSlBBRWRpdG9yQ29uc3RhbnRzLkRJQUdSQU1fT0JKRUNUX1RZUEUgZG90KSB7Ci0JCWFkZFNlcGFyYXRvclRvQ29sbGVjdGlvbihjb21wYXJ0bWVudFNoYXBlLCAwLCBkb3QpOwotCQlhZGRTZXBhcmF0b3JUb0NvbGxlY3Rpb24oY29tcGFydG1lbnRTaGFwZSwgSlBBRWRpdG9yQ29uc3RhbnRzLkNPTVBBUlRNRU5UX01JTl9IRUlHSFQsIGRvdCk7Ci0JfQotCi0JcHJpdmF0ZSBTaGFwZSBhZGRTZXBhcmF0b3JUb0NvbGxlY3Rpb24oQ29udGFpbmVyU2hhcGUgY29udGFpbmVyU2hhcGUsIGludCB5LCAKLQkJCQkJCQkJCQkgICBKUEFFZGl0b3JDb25zdGFudHMuRElBR1JBTV9PQkpFQ1RfVFlQRSBkb3QpIHsKLQkJZmluYWwgaW50IHdpZHRoID0gY29udGFpbmVyU2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRXaWR0aCgpOwotCQlTaGFwZSBzaGFwZSA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmNyZWF0ZVNoYXBlKGNvbnRhaW5lclNoYXBlLCBmYWxzZSk7Ci0JCVJlY3RhbmdsZSByZWN0YW5nbGUgPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVSZWN0YW5nbGUoc2hhcGUpOwotCQlJQ29sb3JDb25zdGFudCBmb3JlZ3JvdW5kID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Rm9yZWdyb3VuZChkb3QpOwotCQlJQ29sb3JDb25zdGFudCBiYWNrZ3JvdW5kID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0QmFja2dyb3VuZChkb3QpOwotCQlyZWN0YW5nbGUuc2V0Rm9yZWdyb3VuZChtYW5hZ2VDb2xvcihiYWNrZ3JvdW5kKSk7Ci0JCXJlY3RhbmdsZS5zZXRCYWNrZ3JvdW5kKG1hbmFnZUNvbG9yKGZvcmVncm91bmQpKTsKLQkJcmVjdGFuZ2xlLnNldExpbmVWaXNpYmxlKGZhbHNlKTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0U2l6ZShyZWN0YW5nbGUsIHdpZHRoLCBKUEFFZGl0b3JDb25zdGFudHMuU0VQQVJBVE9SX0hFSUdIVCk7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldExvY2F0aW9uQW5kU2l6ZShyZWN0YW5nbGUsIDAsIHksIHdpZHRoLCBKUEFFZGl0b3JDb25zdGFudHMuU0VQQVJBVE9SX0hFSUdIVCk7Ci0JCXJldHVybiBzaGFwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvaTE4bi9KUEFFZGl0b3JNZXNzYWdlcy5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2kxOG4vSlBBRWRpdG9yTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMxZjI5ZS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvaTE4bi9KUEFFZGl0b3JNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFBldHlhIFNhYmV2YSAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEpQQUVkaXRvck1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRKUEFFbnRpdHlGZWF0dXJlX2Jhc2ljQXR0cmlidXRlc1NoYXBlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEpQQUVudGl0eUZlYXR1cmVfcHJpbWFyeUtleXNTaGFwZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEpQQUVudGl0eUZlYXR1cmVfcmVsYXRpb25BdHRyaWJ1dGVzU2hhcGVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsaWNrQWRkQXR0cmlidXRlQnV0dG9uRmVhdHVyZV9jcmVhdGVBdHRyaWJ1dGVCdXR0b25MYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmVfY3JlYXRlQXR0cmlidXRlQnV0dG9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbmxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZV9kZWxldGVBdHRyaWJ1dGVRdWVzdGlvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVEaWFncmFtSm9iX2NyZWF0ZURpYWdyYW1Kb2JOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZURpYWdyYW1Kb2JfZ2V0SlBBRGlhZ3JhbU1vbml0b3JUYXNrTmFtZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVJc0FSZWxhdGlvbkZlYXR1cmVfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlSXNBUmVsYXRpb25GZWF0dXJlX25hbWU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9jcmVhdGVFbnRpdHlFcnJvck1zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVKUEFFbnRpdHlGZWF0dXJlX2NyZWF0ZUVudGl0eUVycm9yTXNnVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9jcmVhdGVFbnRpdHlFcnJvclN0YXR1c01zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVKUEFFbnRpdHlGZWF0dXJlX2pwYUVudGl0eUZlYXR1cmVEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVKUEFFbnRpdHlGZWF0dXJlX2pwYUVudGl0eUZlYXR1cmVOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZUpQQUVudGl0eUZlYXR1cmVfanBhUHJvamVjdFNlbGVjdGlvbkRpYWxvZ0Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZUpQQUVudGl0eUZlYXR1cmVfanBhUHJvamVjdFNlbGVjdGlvbkRpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZUpQQUVudGl0eUZyb21NYXBwZWRTdXBlcmNsYXNzRmVhdHVyZV9jcmVhdGVJbmhlcml0ZWRFbnRpdHlGZWF0dXJlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlSlBBRW50aXR5RnJvbU1hcHBlZFN1cGVyY2xhc3NGZWF0dXJlX2NyZWF0ZUluaGVyaXRlZEVudGl0eUZlYXR1cmVOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZU1hcHBlZFN1cGVyY2xhc3NGZWF0dXJlX2NyZWF0ZU1hcHBlZFN1cGVyY2xhc3NGZWF0dXJlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmVfY3JlYXRlTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmVOYW1lOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZU1hbnlUb01hbnlCaURpclJlbGF0aW9uRmVhdHVyZV9tYW55VG9NYW55QmlEaXJGZWF0dXJlTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVNYW55VG9NYW55QmlEaXJSZWxhdGlvbkZlYXR1cmVfbWFueVRvTWFueVVuaURpckZlYXR1cmVEZXNjcmlwdGlvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVNYW55VG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb01hbnlVbmlEaXJGZWF0dXJlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlTWFueVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZV9tYW55VG9NYW55VW5pRGlyRmVhdHVyZU5hbWU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlTWFueVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmVfbWFueVRvT25lQmlEaXJGZWF0dXJlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlTWFueVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmVfbWFueVRvT25lQmlEaXJGZWF0dXJlTmFtZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVNYW55VG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmVfbWFueVRvT25lVW5pRGlyRmVhdHVyZURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZU1hbnlUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZV9tYW55VG9PbmVVbmlEaXJGZWF0dXJlTmFtZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVPbmVUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmVfb25lVG9NYW55VW5pRGlyRmVhdHVyZURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZU9uZVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZV9vbmVUb01hbnlVbmlEaXJGZWF0dXJlTmFtZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVPbmVUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lQmlEaXJGZWF0dXJlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlT25lVG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZV9vbmVUb09uZUJpRGlyRmVhdHVyZU5hbWU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlT25lVG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmVfb25lVG9PbmVVbmlEaXJGZWF0dXJlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlT25lVG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmVfb25lVG9PbmVVbmlEaXJGZWF0dXJlTmFtZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVGZWF0dXJlX2RlbGV0ZUNvbmZpcm07Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlSlBBRW50aXR5RmVhdHVyZV9kZWxldGVKUEFFbnRpdHlRdWVzdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVKUEFFbnRpdHlGZWF0dXJlX2RlbGV0ZUpQQUVudGl0aWVzUXVlc3Rpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlUmVsYXRpb25GZWF0dXJlX2RlbGV0ZVJlbGF0aW9uUXVlc3Rpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlyZWN0RWRpdEF0dHJpYnV0ZUZlYXR1cmVfYXR0cmlidXRlRXhpc3RzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlyZWN0RWRpdEF0dHJpYnV0ZUZlYXR1cmVfY2xhc3NOYW1lTXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2JyYWNlc05vdEFsbG93ZWRNc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZV9kdXBsaWNhdGVFbnRpdHlOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlX2xpbmVCcmVha3NOb3RBbGxvd2VkTXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlX3NwYWNlc05vdEFsbG93ZWRNc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlyZWN0RWRpdEpQQUVudGl0eUZlYXR1cmVfY2xhc3NOYW1lTXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2xpbmVCcmVha3NOb3RBbGxvd2VkTXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX3NjcGFjZXNOb3RBbGxvd2VkTXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2ludmFsaWRTeW1ib2xzTXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlzY2FyZEFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZV9Db250ZXh0TWVudU9wZXJhdGlvbkRlc2NyaXB0aW9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUFydGlmYWN0RmFjdG9yeV9DYW5Ob3RDaGVja1JldHVyblR5cGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFEaWFncmFtRWRpdG9yX29wZW5EaWFncmFtRXJyb3JNU0c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFEaWFncmFtRWRpdG9yX3dhaXRpbmdGb3JNb2luOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2VfZXJyU2F2ZVByb3BzTXNnVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRGlhZ3JhbVByb3BlcnR5UGFnZV9lcnJTYXZlUHJvcHNNc2dUZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX3BhZ2VEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdENvbGxlY3Rpb25UeXBlU2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRDb2xsZWN0aW9uVHlwZVNlY3Rpb25UaXR0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdFBhY2thZ2VNc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRUYWJsZU5hbWVQcmVmaXhNc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRUYWJsZU5hbWVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdFBhY2thZ2VUb1VzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfaW52YWxpZFBhY2thZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2ludmFsaWRUYWJsZU5hbWVQcmVmaXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2RpcmVjdEVkaXRBZmZlY3RzQ2xhc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2RpcmVjdEVkaXRBZmZlY3RzQ2xhc3NUb29sdGlwOwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW50aXR5QWNjZXNzVHlwZUJ1dHRvbkdyb3VwVG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW50aXR5QWNjZXNzVHlwZUJ1dHRvbkdyb3VwTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2VudGl0eUZpZWxkQmFzZWRBY2Nlc3NCdXR0b25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW50aXR5UHJvcGVydHlCYXNlZEFjY2Vzc0J1dHRvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9kZWZhdWx0Rm9sZGVyQ29udHJvbFRvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2RlZmF1bHRGb2xkZXJDb250cm9sTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2ludmFsaWRGb2xkZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2VtcHR5Rm9sZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9vbmVUb01hbnlPbGRTdHlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2Vfb25lVG9NYW55T2xkU3R5bGVUb29sdGlwOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclByb3BlcnR5UGFnZV9vbmVUb01hbnlPbGRTdHlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JQcm9wZXJ0eVBhZ2Vfb25lVG9NYW55T2xkU3R5bGVUb29sdGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VBdHRyR3JvdXBNZW51SXRlbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NvbGxhcHNlQXR0ckdyb3VwTWVudUl0ZW1EZXNjcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUNvbXBhcnRUb29sVGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VFbnRpdHlNZW51SXRlbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUVudGl0eU1lbnVJdGVtRGVzY3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VBbGxFbnRpdGllc01lbnVJdGVtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NvbGxhcHNlQWxsRW50aXRpZXNNZW51SXRlbURlc2NyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY3JlYXRlQXR0cmlidXRlQnV0dG9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY3JlYXRlQXR0cmlidXRlQnV0dG9ubGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY3VzdG9tU3ViTWVudURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2N1c3RvbVN1Yk1lbnVUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2RlbGV0ZUF0dHJpYnV0ZUJ1dHRvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2RlbGV0ZUF0dHJpYnV0ZUJ1dHRvbmxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2RlbGV0ZUVudGl0eUZyb21Nb2RlbEJ1dHRvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2RlbGV0ZUVudGl0eUZyb21Nb2RlbEJ1dHRvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZGlzY2FyZENoYW5nZXNNZW51SXRlbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2Rpc2NhcmRDaGFuZ2VzTWVudUl0ZW1EZXNjcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVFbnRpdHlGcm9tRGlhZ3JhbUJ1dHRvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUVudGl0eUZyb21EaWFncmFtQnV0dG9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2F2ZUJ1dHRvblRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2F2ZUJ1dHRvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2F2ZU1lbnVJdGVtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2F2ZU1lbnVJdGVtRGVzY3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVzdG9yZUJ1dHRvblRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVzdG9yZUJ1dHRvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFuZFNhdmVCdXR0b25UZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFuZFNhdmVCdXR0b25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9zaG93QWxsVGhlRW50aXRpZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2hvd0FsbFRoZUVudGl0aWVzRGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZWZhY3RvclN1Yk1lbnU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVuYW1lRW50aXR5Q2xhc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfbW92ZUVudGl0eUNsYXNzOwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9vcGVuSlBBRGV0YWlsc1ZpZXc7IAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX29wZW5KUEFEZXRhaWxzVmlld0Rlc2M7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX29wZW5NaW5pYXR1cmVWaWV3OyAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9vcGVuTWluaWF0dXJlVmlld0Rlc2M7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2FwcGx5UGF0dGVybjsgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfYXBwbHlQYXR0ZXJuRGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRBdHRyTWVudUl0ZW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRBdHRyTWVudUl0ZW1EZXNjcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRDb21wYXJ0VG9vbFRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2V4cGFuZEVudGl0eU1lbnVJdGVtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2V4cGFuZEVudGl0eW1lbnVJdGVtRGVzY3I7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZXhwYW5kQWxsRW50aXRpZXNNZW51SXRlbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRBbGxFbnRpdGllc01lbnVJdGVtRGVzY3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9Jbmhlcml0YW5jZUNvbXBhcnRtZW50VGl0bGU7CQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVmYWN0b3JBdHRyaWJ1dGVUeXBlOyAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZWZhY3RvckF0dHJpYnV0ZVR5cGVEZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFsbEVudGl0aWVzTWVudTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbmRTYXZlQWxsRW50aXRpZXNBY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQW5kRGlzY2FyZEFsbEVudGl0aWVzQWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFuZFNhdmVBbGxFbnRpdGllc0NvbmZpcm1hdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbmREaXNjYXJkQWxsRW50aXRpZXNDb25maXJtYXRpb247CQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXJfY2FudE1ha2VEaWFncmFtV3JpdGFibGVUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyX2NhbnRNYWtlRGlhZ3JhbVdyaXRhYmxlTXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXJfSlBBRGlhZ3JhbVJlYWRPbmx5VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcl9KUEFEaWFncmFtUmVhZE9ubHlNc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcl9KUEFEaWFncmFtUmVhZE9ubHlIYXNUb0FkZE1zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGVfb3BlbkpQQURpYWdyYW1FcnJvck1zZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGVfb3BlbkpQQURpYWdyYW1FcnJvck1zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlX2pwYVN1cHBvcnRXYXJuaW5nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZV9qcGFTdXBwb3J0V2FybmluZ01zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlX25vUGVyc2lzdGVuY2VVbml0VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZV9ub1BlcnNpc3RlbmNlVW5pdE1zZzsgCi0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlQW5kUmVtb3ZlQWxsRW50aXRpZXNGZWF0dXJlX0NvbnRleHRNZW51T3BlcmF0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RUeXBlRGlhbG9nX2Nob29zZUF0dHJpYnV0ZVR5cGVEaWFsb2dUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFR5cGVEaWFsb2dfYnJvd3NlQnRuVHh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFR5cGVEaWFsb2dfYnJvd3NlQnRuRGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RUeXBlRGlhbG9nX3R5cGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RUeXBlRGlhbG9nX2Nob29zZUF0dHJpYnV0ZVR5cGVEaWFsb2dXaW5kb3dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RUeXBlRGlhbG9nX2Nob29zZUF0dHJpYnV0ZVR5cGVEaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RUeXBlRGlhbG9nX2ludmFsaWRUeXBlTXNnVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0VHlwZURpYWxvZ19pbnZhbGlkVHlwZU1zZ1RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0VHlwZURpYWxvZ19lbXB0eVR5cGVFcnJvclRleHQ7Ci0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JVdGlsX2Z1bGxuYW1lVG9vbHRpcFRleHQ7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclV0aWxfdHlwZVRvb2x0aXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclV0aWxfYXBwbHlDaGFuZ2VzSm9iTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JVdGlsX2luaGVyaXRUeXBlVG9vbHRpcFRleHQ7Ci0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYWxldHRlQ29tcGFydG1lbnRfQ29ubmVjdGlvbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFsZXR0ZUNvbXBhcnRtZW50X09iamVjdHM7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBU29sdmVyX2Nsb3NlV2FybmluZ01zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFTb2x2ZXJfY2xvc2VFZGl0b3JzOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlZmFjdG9yQXR0cmlidXRlVHlwZUZlYXR1cmVfQ29udGV4dE1lbnVPcGVyYXRpb25EZXNjcmlwdGlvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVKUEFFbnRpdHlGZWF0dXJlX2Rpc2NhcmRXYXJuaW5nTXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUVudGl0eUZlYXR1cmVfQ29udGV4dE1lbnVPcGVyYXRpb25EZXNjcmlwdGlvbjsKLQkgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQlROX09LOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJUTl9DQU5DRUw7CQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVFbnRpdHlGZWF0dXJlX0NvbnRleHRNZW51T3BlcmF0aW9uRGVzY3JpcHRpb247IAotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0aWVzQ29vcmRpbmF0ZXNYTUxfQ2Fubm90Q2xvc2VGaWxlU3RyZWFtRXJyb3JNU0c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdGllc0Nvb3JkaW5hdGVzWE1MX0Nhbm5vdENyZWF0ZURPTUZpbGVFcnJvck1TRzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0aWVzQ29vcmRpbmF0ZXNYTUxfQ2Fubm90RmluZEZpbGVFcnJvck1TRzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0aWVzQ29vcmRpbmF0ZXNYTUxfQ2Fubm90T2J0YWluUHJvamVjdEVycm9yTVNHOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXRpZXNDb29yZGluYXRlc1hNTF9DYW5ub3RQYXJzZUZpbGVFcnJvck1TRzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0aWVzQ29vcmRpbmF0ZXNYTUxfQ2Fubm90UmVhZEZpbGVFcnJvck1TRzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0aWVzQ29vcmRpbmF0ZXNYTUxfQ2Fubm90UmVmcmZyZXNoRmlsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vZGVsSW50ZWdyYXRpb25VdGlsX0Nhbm5vdFNldEZpbGVDb250ZW50RXJyb3JNU0c7Ci0KLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBKUEFFZGl0b3JNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBKUEFFZGl0b3JNZXNzYWdlcygpIHsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9pMThuL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvaTE4bi9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzlmN2JlLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9pMThuL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPGNvcHlyaWdodD4KLSMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICBQZXR5YSBTYWJldmEgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSMKLSMgPC9jb3B5cmlnaHQ+Ci0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQWRkSlBBRW50aXR5RmVhdHVyZV9iYXNpY0F0dHJpYnV0ZXNTaGFwZXM9T3RoZXIgQXR0cmlidXRlcwotQWRkSlBBRW50aXR5RmVhdHVyZV9wcmltYXJ5S2V5c1NoYXBlPVByaW1hcnkgS2V5Ci1BZGRKUEFFbnRpdHlGZWF0dXJlX3JlbGF0aW9uQXR0cmlidXRlc1NoYXBlcz1SZWxhdGlvbiBBdHRyaWJ1dGVzCi1DbGlja0FkZEF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmVfY3JlYXRlQXR0cmlidXRlQnV0dG9uRGVzY3JpcHRpb249Q3JlYXRlIGEgbmV3IGF0dHJpYnV0ZSBvZiB0aGlzIGVudGl0eS4KLUNsaWNrQWRkQXR0cmlidXRlQnV0dG9uRmVhdHVyZV9jcmVhdGVBdHRyaWJ1dGVCdXR0b25MYWJlbD1DcmVhdGUgQXR0cmlidXRlCi0KLUNsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZV9jcmVhdGVBdHRyaWJ1dGVCdXR0b25EZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgYXR0cmlidXRlIG9mIHRoaXMgZW50aXR5LgotQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbmxhYmVsPUNyZWF0ZSBBdHRyaWJ1dGUKLUNsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZV9kZWxldGVBdHRyaWJ1dGVRdWVzdGlvbj1EbyB5b3Ugd2FudCB0byBkZWxldGUgYXR0cmlidXRlICJ7MH0iPwotCi1DcmVhdGVEaWFncmFtSm9iX2NyZWF0ZURpYWdyYW1Kb2JOYW1lPUNyZWF0aW5nIGRpYWdyYW0gZm9yOiB7MH0uLi4KLUNyZWF0ZURpYWdyYW1Kb2JfZ2V0SlBBRGlhZ3JhbU1vbml0b3JUYXNrTmFtZT1HZXQgSlBBIERpYWdyYW0KLQotQ3JlYXRlSXNBUmVsYXRpb25GZWF0dXJlX2Rlc2NyaXB0aW9uPUNsaWNrIG9uIGFuIGVudGl0eSBvciBtYXBwZWQgc3VwZXJjbGFzcyBhbmQgdGhlbiBjbGljayBzb21ld2hlcmUgaW4gdGhlIGRpYWdyYW0gdG8gY3JlYXRlIG5ldyBpbmhlcml0ZWQgZW50aXR5Ci1DcmVhdGVJc0FSZWxhdGlvbkZlYXR1cmVfbmFtZT1Jbmhlcml0ZWQgRW50aXR5Ci0KLUNyZWF0ZUpQQUVudGl0eUZlYXR1cmVfY3JlYXRlRW50aXR5RXJyb3JNc2c9RW50aXR5IGNvdWxkIG5vdCBiZSBjcmVhdGVkLgotQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9jcmVhdGVFbnRpdHlFcnJvck1zZ1RpdGxlPUNhbm5vdCBDcmVhdGUgRW50aXR5Ci1DcmVhdGVKUEFFbnRpdHlGZWF0dXJlX2NyZWF0ZUVudGl0eUVycm9yU3RhdHVzTXNnPVBlcnNpc3RlbmNlIEFQSSBsaWJyYXJ5IGlzIG5vdCBpbnRvIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoLgotQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9qcGFFbnRpdHlGZWF0dXJlRGVzY3JpcHRpb249Q3JlYXRlIGEgbmV3IEpQQSBlbnRpdHkuCi1DcmVhdGVKUEFFbnRpdHlGZWF0dXJlX2pwYUVudGl0eUZlYXR1cmVOYW1lPUphdmEgRW50aXR5Ci1DcmVhdGVKUEFFbnRpdHlGZWF0dXJlX2pwYVByb2plY3RTZWxlY3Rpb25EaWFsb2dEZXNjcmlwdGlvbj1TZWxlY3QgYSBKUEEgcHJvamVjdCB0byBjb250YWluIHRoZSBlbnRpdHkuCi1DcmVhdGVKUEFFbnRpdHlGZWF0dXJlX2pwYVByb2plY3RTZWxlY3Rpb25EaWFsb2dUaXRsZT1TZWxlY3QgSlBBIFByb2plY3QKLUNyZWF0ZUpQQUVudGl0eUZyb21NYXBwZWRTdXBlcmNsYXNzRmVhdHVyZV9jcmVhdGVJbmhlcml0ZWRFbnRpdHlGZWF0dXJlRGVzY3JpcHRpb249Q3JlYXRlIGEgbmV3IEpQQSBlbnRpdHkgdGhhdCB3aWxsIGluaGVyaXQgYSBuZXcgTWFwcGVkIFN1cGVyY2xhc3MuCi1DcmVhdGVKUEFFbnRpdHlGcm9tTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmVfY3JlYXRlSW5oZXJpdGVkRW50aXR5RmVhdHVyZU5hbWU9SW5oZXJpdGVkIEVudGl0eQotQ3JlYXRlTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmVfY3JlYXRlTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmVEZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgTWFwcGVkIFN1cGVyY2xhc3MuCi1DcmVhdGVNYXBwZWRTdXBlcmNsYXNzRmVhdHVyZV9jcmVhdGVNYXBwZWRTdXBlcmNsYXNzRmVhdHVyZU5hbWU9TWFwcGVkIFN1cGVyY2xhc3MKLQotQ3JlYXRlTWFueVRvTWFueUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb01hbnlCaURpckZlYXR1cmVOYW1lPU1hbnktdG8tTWFueQotQ3JlYXRlTWFueVRvTWFueUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb01hbnlVbmlEaXJGZWF0dXJlRGVzY3JpcHRpb249Q3JlYXRlIG5ldyBiaWRpcmVjdGlvbmFsIG1hbnktdG8tbWFueSByZWxhdGlvbi4KLQotQ3JlYXRlTWFueVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZV9tYW55VG9NYW55VW5pRGlyRmVhdHVyZURlc2NyaXB0aW9uPUNyZWF0ZSBuZXcgdW5pZGlyZWN0aW9uYWwgbWFueS10by1tYW55IHJlbGF0aW9uLgotQ3JlYXRlTWFueVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZV9tYW55VG9NYW55VW5pRGlyRmVhdHVyZU5hbWU9TWFueS10by1NYW55Ci0KLUNyZWF0ZU1hbnlUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZUJpRGlyRmVhdHVyZURlc2NyaXB0aW9uPUNyZWF0ZSBuZXcgYmlkaXJlY3Rpb25hbCBtYW55LXRvLW9uZSByZWxhdGlvbi4KLUNyZWF0ZU1hbnlUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZUJpRGlyRmVhdHVyZU5hbWU9TWFueS10by1PbmUKLQotQ3JlYXRlTWFueVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZVVuaURpckZlYXR1cmVEZXNjcmlwdGlvbj1DcmVhdGUgbmV3IHVuaWRpcmVjdGlvbmFsIG1hbnktdG8tb25lIHJlbGF0aW9uLgotQ3JlYXRlTWFueVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZVVuaURpckZlYXR1cmVOYW1lPU1hbnktdG8tT25lCi0KLUNyZWF0ZU9uZVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZV9vbmVUb01hbnlVbmlEaXJGZWF0dXJlRGVzY3JpcHRpb249Q3JlYXRlIG5ldyB1bmlkaXJlY3Rpb25hbCBvbmUtdG8tbWFueSByZWxhdGlvbi4KLUNyZWF0ZU9uZVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZV9vbmVUb01hbnlVbmlEaXJGZWF0dXJlTmFtZT1PbmUtdG8tTWFueQotCi1DcmVhdGVPbmVUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lQmlEaXJGZWF0dXJlRGVzY3JpcHRpb249Q3JlYXRlIG5ldyBiaWRpcmVjdGlvbmFsIG9uZS10by1vbmUgcmVsYXRpb24uCi1DcmVhdGVPbmVUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lQmlEaXJGZWF0dXJlTmFtZT1PbmUtdG8tT25lCi0KLUNyZWF0ZU9uZVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lVW5pRGlyRmVhdHVyZURlc2NyaXB0aW9uPUNyZWF0ZSBuZXcgdW5pZGlyZWN0aW9uYWwgb25lLXRvLW9uZSByZWxhdGlvbi4KLUNyZWF0ZU9uZVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lVW5pRGlyRmVhdHVyZU5hbWU9T25lLXRvLU9uZQotCi1EZWxldGVGZWF0dXJlX2RlbGV0ZUNvbmZpcm09Q29uZmlybSBEZWxldGUKLURlbGV0ZUpQQUVudGl0eUZlYXR1cmVfZGVsZXRlSlBBRW50aXR5UXVlc3Rpb249RG8geW91IHdhbnQgdG8gcmVtb3ZlIHRoZSBlbnRpdHkgInswfSIgZnJvbSB0aGUgZGlhZ3JhbSBhbmQgZGVsZXRlIHRoZSBjb3JyZXNwb25kaW5nIEphdmEgcmVzb3VyY2UgInsxfSI/Ci1EZWxldGVKUEFFbnRpdHlGZWF0dXJlX2RlbGV0ZUpQQUVudGl0aWVzUXVlc3Rpb249RG8geW91IHdhbnQgdG8gcmVtb3ZlIHRoZSBzZWxlY3RlZCBlbnRpdGllcyBmcm9tIHRoZSBkaWFncmFtIGFuZCBkZWxldGUgdGhlIGNvcnJlc3BvbmRpbmcgSmF2YSByZXNvdXJjZXM/Ci0KLURlbGV0ZVJlbGF0aW9uRmVhdHVyZV9kZWxldGVSZWxhdGlvblF1ZXN0aW9uPURvIHlvdSB3YW50IHRvIHJlbW92ZSB0aGlzIHJlbGF0aW9uIGZyb20gdGhlIGRpYWdyYW0gYW5kIHVwZGF0ZSB0aGUgY29ycmVzcG9uZGluZyBKYXZhIHJlc291cmNlcz8KLQotRGlyZWN0RWRpdEF0dHJpYnV0ZUZlYXR1cmVfYXR0cmlidXRlRXhpc3RzPUF0dHJpYnV0ZSB3aXRoIG5hbWUgInswfSIgYWxyZWFkeSBleGlzdHMuCi1EaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZV9jbGFzc05hbWVNc2c9RW50ZXIgYW4gYXR0cmlidXRlIG5hbWUuCi1EaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZV9saW5lQnJlYWtzTm90QWxsb3dlZE1zZz1Zb3UgY2Fubm90IHVzZSBsaW5lIGJyZWFrcyBpbiBhdHRyaWJ1dGUgbmFtZXMuCi1EaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZV9zcGFjZXNOb3RBbGxvd2VkTXNnPVlvdSBjYW5ub3QgdXNlIHNwYWNlcyBpbiBhdHRyaWJ1dGUgbmFtZXMuCi0KLURpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2JyYWNlc05vdEFsbG93ZWRNc2c9WW91IGNhbm5vdCB1c2UgYnJhY2VzIGluIGVudGl0eSBuYW1lcy4KLURpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2NsYXNzTmFtZU1zZz1FbnRlciBhbiBlbnRpdHkgbmFtZS4KLURpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2R1cGxpY2F0ZUVudGl0eU5hbWU9RW50aXR5IHdpdGggbmFtZSAiezB9IiBhbHJlYWR5IGV4aXN0cy4KLURpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2xpbmVCcmVha3NOb3RBbGxvd2VkTXNnPVlvdSBjYW5ub3QgdXNlIGxpbmUgYnJlYWtzIGluIGVudGl0eSBuYW1lcy4KLURpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX3NjcGFjZXNOb3RBbGxvd2VkTXNnPVlvdSBjYW5ub3QgdXNlIHNwYWNlcyBpbiBlbnRpdHkgbmFtZXMuCi1EaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZV9pbnZhbGlkU3ltYm9sc01zZz0iezB9IiBpcyBub3QgYSB2YWxpZCBlbnRpdHkgbmFtZS4KLURpc2NhcmRBbmRSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmVfQ29udGV4dE1lbnVPcGVyYXRpb25EZXNjcmlwdGlvbj1SZW1vdmUgQWxsIEVudGl0aWVzIEZyb20gRGlhZ3JhbSBhbmQgRGlzY2FyZCBDaGFuZ2VzCi0KLUpwYUFydGlmYWN0RmFjdG9yeV9DYW5Ob3RDaGVja1JldHVyblR5cGU9Q2Fubm90IGNoZWNrIHRoZSByZXR1cm4gdHlwZQotCi1KUEFEaWFncmFtRWRpdG9yX29wZW5EaWFncmFtRXJyb3JNU0c9Q291bGQgbm90IG9wZW4gZWRpdG9yLCBiZWNhdXNlIHswfSBpcyBub3QgYSB2YWxpZCBKUEEgcHJvamVjdC4gVXNlIE9wZW4gV2l0aCB0byBvcGVuIHRoaXMgZmlsZSB3aXRoIGEgZGlmZmVyZW50IGVkaXRvci4KLUpQQURpYWdyYW1FZGl0b3Jfd2FpdGluZ0Zvck1vaW49V2FpdGluZyBmb3IgTU9JTiBjb25uZWN0aW9uIGluaXRpYWxpemF0aW9uLi4uCi0KLUpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2VfZXJyU2F2ZVByb3BzTXNnVGl0bGU9Q2Fubm90IFNhdmUgUHJvcGVydGllcwotSlBBRGlhZ3JhbVByb3BlcnR5UGFnZV9lcnJTYXZlUHJvcHNNc2dUZXh0PVRoZSBKUEEgZGlhZ3JhbSBwcm9wZXJ0aWVzIGNvdWxkIG5vdCBiZSBzYXZlZAotCi1KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfcGFnZURlc2NyaXB0aW9uPURlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZSBKUEEgZGlhZ3JhbSBlZGl0b3I6Ci1KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdENvbGxlY3Rpb25UeXBlU2VjdGlvbkRlc2NyaXB0aW9uPVJlbGF0aW9uIGF0dHJpYnV0ZXMsIHdoaWNoIHlvdSBnZW5lcmF0ZSB1c2luZyB0aGUgSlBBIGVkaXRvcixcbmFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgdG8gYmUgb2YgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHR5cGUuCi1KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdENvbGxlY3Rpb25UeXBlU2VjdGlvblRpdHRsZT1EZWZhdWx0IENvbGxlY3Rpb24gVHlwZQotSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRQYWNrYWdlTXNnPUVudGl0aWVzLCB3aGljaCB5b3UgZ2VuZXJhdGUgdXNpbmcgdGhlIEpQQSBlZGl0b3IgcGFsZXR0ZSxcbmFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgaW4gdGhlIHNwZWNpZmllZCBwYWNrYWdlLgotSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRUYWJsZU5hbWVQcmVmaXhNc2c9RW50aXRpZXMsIHdoaWNoIHlvdSBoYXZlIGNyZWF0ZWQsIHVzaW5nIHRoZSBKUEEgZWRpdG9yIHBhbGV0dGUsIGFyZSBhdXRvbWF0aWNhbGx5XG5hbm5vdGF0ZWQgd2l0aCBAVGFibGUobmFtZT0uLi4pLCB3aGVyZSB0aGUgbmFtZSBvZiB0aGUgdGFibGUgaXMgYSByZXN1bHQgb2ZcbmNvbmNhdGVuYXRpb24gb2YgdGhlIGdpdmVuIHByZWZpeCBhbmQgdGhlIG5hbWUgb2YgdGhlIGVudGl0eS4gSWYgeW91IHNldFxuYSBibGFuayBwcmVmaXgsIHRoZSBuZXdseSBjcmVhdGVkIGVudGl0aWVzIGFyZSBub3QgYW5ub3RhdGVkIHdpdGggQFRhYmxlLgotSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRUYWJsZU5hbWVMYWJlbD1EZWZhdWx0ICZ0YWJsZSBuYW1lIHByZWZpeDoKLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0UGFja2FnZVRvVXNlPURlZmF1bHQgJkphdmEgcGFja2FnZSBmb3IgbmV3IGVudGl0aWVzOgotSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2ludmFsaWRQYWNrYWdlPSJ7MH0iIGlzIG5vdCBhIHZhbGlkIEphdmEgaWRlbnRpZmllci4KLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9pbnZhbGlkVGFibGVOYW1lUHJlZml4PVRhYmxlIG5hbWUgcHJlZml4IG1heSBjb250YWluIGxldHRlcnMsIGRpZ2l0cyBhbmQgdW5kZXJzY29yZXMgb25seSwgYW5kIG11c3Qgbm90IHN0YXJ0IHdpdGggYSBkaWdpdC4KLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9kaXJlY3RFZGl0QWZmZWN0c0NsYXNzPSZFZGl0aW5nIHRoZSBlbnRpdHkgbmFtZSBpbiB0aGUgZGlhZ3JhbSBhZmZlY3RzIHRoZSBjbGFzcyBuYW1lIGluIHRoZSBzb3VyY2UgZmlsZQotSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2RpcmVjdEVkaXRBZmZlY3RzQ2xhc3NUb29sdGlwPUlmIHRoaXMgb3B0aW9uIGlzIGNoZWNrZWQgYW5kIHRoZSBlbnRpdHkgbmFtZSBpcyBhcHBvaW50ZWRcbmJ5IHRoZSBARW50aXR5IGFubm90YXRpb24sIGRpcmVjdCBlbnRpdHkgbmFtZSBlZGl0aW5nIHdpbGxcbmFmZmVjdCB0aGUgYW5ub3RhdGlvbiBhbmQgd2lsbCBjYXVzZSBjbGFzcyBuYW1lIHJlZmFjdG9yaW5nLlxuSWYgdGhpcyBvcHRpb24gaXMgdW5jaGVja2VkLCBkaXJlY3QgZWRpdGluZyB3aWxsIGFmZmVjdCB0aGVcbmFubm90YXRpb24gb25seS4gSWYgdGhlIGVudGl0eSBuYW1lIGlzIG5vdCBhcHBvaW50ZWQgYnkgdGhlXG5ARW50aXR5IGFubm90YXRpb24sIGRpcmVjdCBlZGl0aW5nIHdpbGwgY2F1c2UgY2xhc3MgbmFtZVxucmVmYWN0b3JpbmcgcmVnYXJkbGVzcyB0aGlzIG9wdGlvbiBpcyBjaGVja2VkIG9yIG5vdC4KLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9lbnRpdHlBY2Nlc3NUeXBlQnV0dG9uR3JvdXBUb29sdGlwPUVudGl0aWVzLCB3aGljaCB5b3UgZ2VuZXJhdGUgdXNpbmcgdGhlIEpQQSBlZGl0b3IgcGFsZXR0ZSxcbmFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGFjY2Vzcy4KLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9lbnRpdHlBY2Nlc3NUeXBlQnV0dG9uR3JvdXBMYWJlbD1FbnRpdHkgYWNjZXNzIHR5cGUKLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9lbnRpdHlGaWVsZEJhc2VkQWNjZXNzQnV0dG9uTGFiZWw9JkZpZWxkLWJhc2VkCi1KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW50aXR5UHJvcGVydHlCYXNlZEFjY2Vzc0J1dHRvbkxhYmVsPSZQcm9wZXJ0eS1iYXNlZAotSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2RlZmF1bHRGb2xkZXJDb250cm9sVG9vbHRpcD1UaGUgbmV3bHkgY3JlYXRlZCBkaWFncmFtIGZpbGUocykgd2lsbCBiZSBzdG9yZWQgaW4gdGhpcyBmb2xkZXIKLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9kZWZhdWx0Rm9sZGVyQ29udHJvbExhYmVsPUZvbGRlciBmb3IgJmRpYWdyYW1zOgotSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2ludmFsaWRGb2xkZXI9VGhlIGZvbGRlciBuYW1lIG11c3QgYmUgcHJlY2VkZWQgYnkgInswfSIuCi1KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW1wdHlGb2xkZXI9VGhlIGZvbGRlciBuYW1lIGZvciBkaWFncmFtcyBtdXN0IG5vdCBiZSBlbXB0eS4KLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9vbmVUb01hbnlPbGRTdHlsZT0mT25lLXRvLU1hbnkgdW5pZGlyZWN0aW9uYWwgb2xkIChKUEEgMS4wKSBzdHlsZSByZWxhdGlvbnMgaW4gSlBBIDIuMCBwcm9qZWN0cyAKLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9vbmVUb01hbnlPbGRTdHlsZVRvb2x0aXA9SWYgdGhpcyBvcHRpb24gaXMgY2hlY2tlZCwgdGhlIG5ld2x5IGNyZWF0ZWQgT25lLXRvLU1hbnlcbnVuaWRpcmVjdGlvbmFsIHJlbGF0aW9ucyBpbiBKUEEgMi4wIHByb2plY3RzIHdpbGwgYmUgb2xkXG4oSlBBIDEuMCkgc3R5bGUuICBJLmUuLCB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGVzIHdpbGxcbmJlIGNyZWF0ZWQgd2l0aG91dCBASm9pbkNvbHVtbihzKSBhbm5vdGF0aW9uLgotCi1KUEFFZGl0b3JQcm9wZXJ0eVBhZ2Vfb25lVG9NYW55T2xkU3R5bGU9Jk9uZS10by1NYW55IHVuaWRpcmVjdGlvbmFsIG9sZCAoSlBBIDEuMCkgc3R5bGUgcmVsYXRpb25zCi1KUEFFZGl0b3JQcm9wZXJ0eVBhZ2Vfb25lVG9NYW55T2xkU3R5bGVUb29sdGlwPUlmIHRoaXMgb3B0aW9uIGlzIGNoZWNrZWQsIHRoZSBuZXdseSBjcmVhdGVkIE9uZS10by1NYW55XG51bmlkaXJlY3Rpb25hbCByZWxhdGlvbnMgd2lsbCBiZSBvbGQgKEpQQSAxLjApIHN0eWxlLlxuSS5lLiwgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlcyB3aWxsIGJlIGNyZWF0ZWQgd2l0aG91dFxuQEpvaW5Db2x1bW4ocykgYW5ub3RhdGlvbi4KLQotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VBdHRyR3JvdXBNZW51SXRlbT1Db2xsYXBzZSBBdHRyaWJ1dGVzIEdyb3VwCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUF0dHJHcm91cE1lbnVJdGVtRGVzY3I9Q29sbGFwc2UgdGhlIGF0dHJpYnV0ZXMgZ3JvdXAuCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUNvbXBhcnRUb29sVGlwPURvdWJsZSBjbGljayB0byBjb2xsYXBzZSAiezB9IiBhdHRyaWJ1dGVzIGdyb3VwLgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VFbnRpdHlNZW51SXRlbT1Db2xsYXBzZSBFbnRpdHkKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NvbGxhcHNlRW50aXR5TWVudUl0ZW1EZXNjcj1Db2xsYXBzZSBlbnRpdHkuCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUFsbEVudGl0aWVzTWVudUl0ZW09Q29sbGFwc2UgQWxsCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUFsbEVudGl0aWVzTWVudUl0ZW1EZXNjcj1Db2xsYXBzZSBhbGwgZW50aXRpZXMKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbkRlc2NyaXB0aW9uPUNyZWF0ZSBuZXcgYXR0cmlidXRlIG9mIHRoaXMgZW50aXR5LgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY3JlYXRlQXR0cmlidXRlQnV0dG9ubGFiZWw9Q3JlYXRlIEF0dHJpYnV0ZQotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY3VzdG9tU3ViTWVudURlc2NyaXB0aW9uPUN1c3RvbSBmZWF0dXJlcyBzdWJtZW51Ci1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jdXN0b21TdWJNZW51VGV4dD1DdXN0b20KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2RlbGV0ZUF0dHJpYnV0ZUJ1dHRvbkRlc2NyaXB0aW9uPURlbGV0ZSB0aGlzIGF0dHJpYnV0ZSBmcm9tIHRoZSBtb2RlbC4KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2RlbGV0ZUF0dHJpYnV0ZUJ1dHRvbmxhYmVsPURlbGV0ZSBBdHRyaWJ1dGUKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2RlbGV0ZUVudGl0eUZyb21Nb2RlbEJ1dHRvbkRlc2NyaXB0aW9uPVJlbW92ZSB0aGlzIEpQQSBlbnRpdHkgZnJvbSB0aGUgZGlhZ3JhbSBhbmQgZGVsZXRlIGl0IGZyb20gdGhlIEpQQSBtb2RlbC4KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2RlbGV0ZUVudGl0eUZyb21Nb2RlbEJ1dHRvbkxhYmVsPURlbGV0ZQotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZGlzY2FyZENoYW5nZXNNZW51SXRlbT1EaXNjYXJkIENoYW5nZXMKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2Rpc2NhcmRDaGFuZ2VzTWVudUl0ZW1EZXNjcj1EaXNjYXJkIGFsbCBjaGFuZ2VzIG1hZGUgdG8gdGhpcyBKUEEgZW50aXR5IGFmdGVyIHRoZSBsYXN0IHNhdmluZy4KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUVudGl0eUZyb21EaWFncmFtQnV0dG9uRGVzY3JpcHRpb249RGlzY2FyZCBhbGwgY2hhbmdlcyBtYWRlIHRvIHRoaXMgSlBBIGVudGl0eSBhZnRlciB0aGUgbGFzdCBzYXZpbmcgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBkaWFncmFtLgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlRW50aXR5RnJvbURpYWdyYW1CdXR0b25MYWJlbD1EaXNjYXJkIENoYW5nZXMgYW5kIFJlbW92ZQotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2F2ZUJ1dHRvblRleHQ9U2F2ZQotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2F2ZUJ1dHRvbkRlc2NyaXB0aW9uPVNhdmUgYWxsIGNoYW5nZXMgbWFkZSB0byB0aGlzIEpQQSBlbnRpdHkuCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9zYXZlTWVudUl0ZW09U2F2ZQotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2F2ZU1lbnVJdGVtRGVzY3I9U2F2ZSBhbGwgY2hhbmdlcyBtYWRlIHRvIHRoaXMgSlBBIGVudGl0eS4KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3Jlc3RvcmVCdXR0b25UZXh0PURpc2NhcmQgQ2hhbmdlcwotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVzdG9yZUJ1dHRvbkRlc2NyaXB0aW9uPURpc2NhcmQgYWxsIGNoYW5nZXMgbWFkZSB0byB0aGlzIEpQQSBlbnRpdHkgYWZ0ZXIgdGhlIGxhc3Qgc2F2aW5nLgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQW5kU2F2ZUJ1dHRvblRleHQ9U2F2ZSBBbmQgUmVtb3ZlCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbmRTYXZlQnV0dG9uRGVzY3JpcHRpb249U2F2ZSBhbGwgY2hhbmdlcyBtYWRlIHRvIHRoaXMgZW50aXR5IGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgZGlhZ3JhbS4KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3Nob3dBbGxUaGVFbnRpdGllcz1TaG93IEFsbCBFbnRpdGllcwotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2hvd0FsbFRoZUVudGl0aWVzRGVzYz1TaG93IGFsbCBlbnRpdGllcyB3aXRoaW4gdGhlIHByb2plY3Qgb24gdGhlIGRpYWdyYW0uCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZWZhY3RvclN1Yk1lbnU9UmVmYWN0b3IgRW50aXR5IENsYXNzCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW5hbWVFbnRpdHlDbGFzcz1SZW5hbWUuLi4KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX21vdmVFbnRpdHlDbGFzcz1Nb3ZlLi4uCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9vcGVuSlBBRGV0YWlsc1ZpZXc9T3BlbiBKUEEgRGV0YWlscyBWaWV3Ci1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9vcGVuSlBBRGV0YWlsc1ZpZXdEZXNjPU9wZW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcgdG8gdmlldy9tb2RpZnkgdGhlIGRldGFpbHMgb2YgdGhlIHNlbGVjdGVkIHBlcnNpc3RlbnQgb2JqZWN0LgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfb3Blbk1pbmlhdHVyZVZpZXc9T3BlbiBNaW5pYXR1cmUgVmlldyAKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX29wZW5NaW5pYXR1cmVWaWV3RGVzYz1PcGVuIHRoZSBNaW5pYXR1cmUgdmlldyB0byBkaXNwbGF5IHRoZSBkaWFncmFtIGluIGEgbGFyZ2VyIHNjYWxlLgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfYXBwbHlQYXR0ZXJuPUFwcGx5IFRlbXBsYXRlLi4uIAotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfYXBwbHlQYXR0ZXJuRGVzYz1BcHBseSBUZW1wbGF0ZQotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZXhwYW5kQXR0ck1lbnVJdGVtPUV4cGFuZCBBdHRyaWJ1dGVzIEdyb3VwCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRBdHRyTWVudUl0ZW1EZXNjcj1FeHBhbmQgdGhlIGF0dHJpYnV0ZXMgZ3JvdXAuCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRDb21wYXJ0VG9vbFRpcD1Eb3VibGUgY2xpY2sgdG8gZXhwYW5kICJ7MH0iIGF0dHJpYnV0ZXMgZ3JvdXAuCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRFbnRpdHlNZW51SXRlbT1FeHBhbmQgRW50aXR5Ci1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRFbnRpdHltZW51SXRlbURlc2NyPUV4cGFuZCBlbnRpdHkuCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRBbGxFbnRpdGllc01lbnVJdGVtPUV4cGFuZCBBbGwKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2V4cGFuZEFsbEVudGl0aWVzTWVudUl0ZW1EZXNjcj1FeHBhbmQgYWxsIGVudGl0aWVzLgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfSW5oZXJpdGFuY2VDb21wYXJ0bWVudFRpdGxlPUluaGVyaXRhbmNlCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZWZhY3RvckF0dHJpYnV0ZVR5cGU9UmVmYWN0b3IgQXR0cmlidXRlIFR5cGUuLi4KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlZmFjdG9yQXR0cmlidXRlVHlwZURlc2M9Q2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBzZWxlY3RlZCBhdHRyaWJ1dGUuCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbGxFbnRpdGllc01lbnU9UmVtb3ZlIEFsbCBFbnRpdGllcyBGcm9tIERpYWdyYW0KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFuZFNhdmVBbGxFbnRpdGllc0FjdGlvbj0uLi5hbmQgU2F2ZSBDaGFuZ2VzCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbmREaXNjYXJkQWxsRW50aXRpZXNBY3Rpb249Li4uYW5kIERpc2NhcmQgQ2hhbmdlcwotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQW5kU2F2ZUFsbEVudGl0aWVzQ29uZmlybWF0aW9uPURvIHlvdSB3YW50IHRvIHNhdmUgdGhlIGNoYW5nZXMgYW5kIHJlbW92ZSBhbGwgZW50aXRpZXMgZnJvbSB0aGUgZGlhZ3JhbT8KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFuZERpc2NhcmRBbGxFbnRpdGllc0NvbmZpcm1hdGlvbj1EbyB5b3Ugd2FudCB0byBkaXNjYXJkIHRoZSBjaGFuZ2VzIGFuZCByZW1vdmUgYWxsIGVudGl0aWVzIGZyb20gdGhlIGRpYWdyYW0/Ci0KLUpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXJfY2FudE1ha2VEaWFncmFtV3JpdGFibGVUaXRsZT1DYW4ndCBNYWtlIERpYWdyYW0gV3JpdGFibGUKLUpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXJfY2FudE1ha2VEaWFncmFtV3JpdGFibGVNc2c9Q2Fubm90IG1ha2UgdGhlIEpQQSBkaWFncmFtIGZpbGUgd3JpdGFibGU6XG5cbnswfQotSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcl9KUEFEaWFncmFtUmVhZE9ubHlUaXRsZT1KUEEgRGlhZ3JhbSBSZWFkLU9ubHkKLUpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXJfSlBBRGlhZ3JhbVJlYWRPbmx5TXNnPVRoZSBKUEEgZGlhZ3JhbSBmaWxlIGlzIHJlYWQtb25seSBhbmQgY2Fubm90IGJlIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbC4gSW4gb3JkZXIgdG8gb3BlbiB0aGUgZGlhZ3JhbSwgdGhlIEpQQSBlZGl0b3IgbXVzdCBtYWtlIHRoaXMgZmlsZSB3cml0YWJsZS4KLUpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXJfSlBBRGlhZ3JhbVJlYWRPbmx5SGFzVG9BZGRNc2c9Q2Fubm90IHNob3cgdGhlIHNlbGVjdGVkIGVudGl0eSBpbiB0aGUgSlBBIGRpYWdyYW0sIGJlY2F1c2UgdGhlIGRpYWdyYW0gZmlsZSBpcyByZWFkLW9ubHkuIEluIG9yZGVyIHRvIHNob3cgdGhlIGVudGl0eSwgdGhlIEpQQSBlZGl0b3IgbXVzdCBtYWtlIHRoaXMgZmlsZSB3cml0YWJsZS4KLQotT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZV9vcGVuSlBBRGlhZ3JhbUVycm9yTXNnVGl0bGU9Q2Fubm90IE9wZW4gRGlhZ3JhbQotT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZV9vcGVuSlBBRGlhZ3JhbUVycm9yTXNnPUNhbm5vdCBvcGVuIHRoZSBKUEEgZGlhZ3JhbSBlZGl0b3IKLU9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGVfanBhU3VwcG9ydFdhcm5pbmdUaXRsZT1KUEEgU3VwcG9ydAotT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZV9qcGFTdXBwb3J0V2FybmluZ01zZz1KUEEgRGlhZ3JhbSBFZGl0b3IgaGFzIHBhcnRpYWwgIEpQQSAyLjAgIHN1cHBvcnQgb25seS4gICBXaGVuIHlvdSB1c2UgaXQgd2l0aCAgSlBBIDIuMCBlbmFibGVkIHByb2plY3RzIHlvdSBzaG91bGQgdmlzdWFsaXplIEpQQSAxLjAgY29tcGxpYW50IGVudGl0aWVzIG9ubHkuIE90aGVyd2lzZSwgdGhlIGVkaXRvciBiZWhhdmlvciB3aWxsIGJlY29tZSBlcnJhdGljLiAKLU9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGVfbm9QZXJzaXN0ZW5jZVVuaXRUaXRsZT1ObyBQZXJzaXN0ZW5jZSBVbml0Ci1PcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlX25vUGVyc2lzdGVuY2VVbml0TXNnPVRoZSBKUEEgRGlhZ3JhbSBFZGl0b3IgY2FuIG5vdCBiZSBvcGVuLCBiZWNhdXNlIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGRvZXMgbm90IGV4aXN0IG9yIGlzIGNvcnJ1cHRlZC4gCi0KLUpQQUVkaXRvclV0aWxfZnVsbG5hbWVUb29sdGlwVGV4dD1cIENsYXNzIE5hbWU6IHswfSAKLUpQQUVkaXRvclV0aWxfdHlwZVRvb2x0aXBUZXh0PVwgVHlwZTogezB9IAotSlBBRWRpdG9yVXRpbF9hcHBseUNoYW5nZXNKb2JOYW1lPUFwcGx5IGNoYW5nZXMgdG8gcGVyc2lzdGVuY2UueG1sLgotSlBBRWRpdG9yVXRpbF9pbmhlcml0VHlwZVRvb2x0aXBUZXh0PVwgQ2xhc3MgTmFtZTogezB9IFxuIFRoaXMgZW50aXR5IGluaGVyaXRzIHsxfQotCi1QYWxldHRlQ29tcGFydG1lbnRfQ29ubmVjdGlvbnM9UmVsYXRpb25zCi1QYWxldHRlQ29tcGFydG1lbnRfT2JqZWN0cz1FbnRpdGllcwotCi1CVE5fT0s9T0sKLUJUTl9DQU5DRUw9Q2FuY2VsCi1FbnRpdGllc0Nvb3JkaW5hdGVzWE1MX0Nhbm5vdENsb3NlRmlsZVN0cmVhbUVycm9yTVNHPUNhbm5vdCBjbG9zZSB0aGUgc3RyZWFtCi1FbnRpdGllc0Nvb3JkaW5hdGVzWE1MX0Nhbm5vdENyZWF0ZURPTUZpbGVFcnJvck1TRz1DYW5ub3QgY3JlYXRlIERPTSBmaWxlLgotRW50aXRpZXNDb29yZGluYXRlc1hNTF9DYW5ub3RGaW5kRmlsZUVycm9yTVNHPUNhbm5vdCBmaW5kIGZpbGUuCi1FbnRpdGllc0Nvb3JkaW5hdGVzWE1MX0Nhbm5vdE9idGFpblByb2plY3RFcnJvck1TRz1DYW5ub3Qgb2J0YWluIHByb2plY3QuCi1FbnRpdGllc0Nvb3JkaW5hdGVzWE1MX0Nhbm5vdFBhcnNlRmlsZUVycm9yTVNHPUNhbm5vdCBwYXJzZSBmaWxlLgotRW50aXRpZXNDb29yZGluYXRlc1hNTF9DYW5ub3RSZWFkRmlsZUVycm9yTVNHPUNhbm5vdCByZWFkIGZpbGUuCi1FbnRpdGllc0Nvb3JkaW5hdGVzWE1MX0Nhbm5vdFJlZnJmcmVzaEZpbGU9Q2Fubm90IHJlZnJlc2ggdGhlIGRpYWdyYW0geG1sIGZpbGUuCi0KLVNlbGVjdFR5cGVEaWFsb2dfY2hvb3NlQXR0cmlidXRlVHlwZURpYWxvZ1RleHQ9U2VsZWN0IGEgcHJpbWl0aXZlIHR5cGUgZm9yIHRoZSBhdHRyaWJ1dGUgInswfSIgb2YgdGhlIGVudGl0eSAiezF9IiBvciBjaG9vc2UgdGhlICJCcm93c2UiIGJ1dHRvbiB0byBzZWxlY3QgYSBjbGFzcyB0eXBlLgotU2VsZWN0VHlwZURpYWxvZ19icm93c2VCdG5UeHQ9JkJyb3dzZS4uLgotU2VsZWN0VHlwZURpYWxvZ19icm93c2VCdG5EZXNjPUJyb3dzZSB0byBzZWxlY3QgYSBjbGFzcy4KLVNlbGVjdFR5cGVEaWFsb2dfdHlwZUxhYmVsPSZUeXBlOgotU2VsZWN0VHlwZURpYWxvZ19jaG9vc2VBdHRyaWJ1dGVUeXBlRGlhbG9nV2luZG93VGl0bGU9U2VsZWN0IFR5cGUKLVNlbGVjdFR5cGVEaWFsb2dfY2hvb3NlQXR0cmlidXRlVHlwZURpYWxvZ1RpdGxlPVNlbGVjdCBOZXcgQXR0cmlidXRlIFR5cGUKLVNlbGVjdFR5cGVEaWFsb2dfaW52YWxpZFR5cGVNc2dUaXRsZT1JbnZhbGlkIFR5cGUKLVNlbGVjdFR5cGVEaWFsb2dfaW52YWxpZFR5cGVNc2dUZXh0PSJ7MH0iIGlzIG5vdCB2YWxpZCBqYXZhIHR5cGUgb3IgcHJpbWl0aXZlLgotU2VsZWN0VHlwZURpYWxvZ19lbXB0eVR5cGVFcnJvclRleHQ9VGhlIG5ldyB0eXBlIG5hbWUgbXVzdCBub3QgYmUgZW1wdHkKLQotSlBBU29sdmVyX2Nsb3NlV2FybmluZ01zZz1UaGUgZW50aXR5ICJ7MH0iIGlzIG9wZW4gZWxzZXdoZXJlIHdpdGggaWRlbnRpY2FsIGNoYW5nZXMuIFVzaW5nIHRoaXMgYnV0dG9uIHdpbGwgbm90IGxvc2UgdGhvc2UgY2hhbmdlcy4gQ2xvc2UgdGhlIG90aGVyIGVkaXRvcihzKSwgd2hlcmUgdGhlIGVudGl0eSAiezB9IiBpcyBvcGVuIGFuZCB0cnkgYWdhaW4hCi1KUEFTb2x2ZXJfY2xvc2VFZGl0b3JzPUNsb3NlIEVkaXRvcnMgIAotTW92ZUVudGl0eUZlYXR1cmVfQ29udGV4dE1lbnVPcGVyYXRpb25EZXNjcmlwdGlvbj1Nb3ZlIEVudGl0eSBDbGFzcwotCi1SZWZhY3RvckF0dHJpYnV0ZVR5cGVGZWF0dXJlX0NvbnRleHRNZW51T3BlcmF0aW9uRGVzY3JpcHRpb249UmVmYWN0b3IgQXR0cmlidXRlIFR5cGUKLU1vZGVsSW50ZWdyYXRpb25VdGlsX0Nhbm5vdFNldEZpbGVDb250ZW50RXJyb3JNU0c9Q2Fubm90IHNldCBmaWxlIGNvbnRlbnQuCi0KLVJlbW92ZUpQQUVudGl0eUZlYXR1cmVfZGlzY2FyZFdhcm5pbmdNc2c9VGhlIGVudGl0eSAiezB9IiBpcyBvcGVuIGVsc2V3aGVyZSB3aXRoIGlkZW50aWNhbCBjaGFuZ2VzLiBVc2luZyB0aGlzIGJ1dHRvbiB3aWxsIHJlbW92ZSB0aGUgZW50aXR5IGZyb20gdGhlIGRpYWdyYW0sIGJ1dCB3aWxsIG5vdCBsb3NlIHRob3NlIGNoYW5nZXMuIEluIG9yZGVyIHRvIGxvc2UgdGhlIGNoYW5nZXMgeW91IG5lZWQgZmlyc3QgdG8gY2xvc2UgdGhlIG90aGVyIGVkaXRvcihzKSwgd2hlcmUgdGhlIGVudGl0eSAiezB9IiBpcyBvcGVuIGFuZCB0cnkgYWdhaW4hXG5cbkRvIHlvdSB3YW50IHRvIGNvbnRpbnVlIHdpdGggcmVtb3ZpbmcgYW55d2F5PwotCi1SZW5hbWVFbnRpdHlGZWF0dXJlX0NvbnRleHRNZW51T3BlcmF0aW9uRGVzY3JpcHRpb249UmVuYW1lIEVudGl0eSBDbGFzcwotCi1TYXZlQW5kUmVtb3ZlQWxsRW50aXRpZXNGZWF0dXJlX0NvbnRleHRNZW51T3BlcmF0aW9uRGVzY3JpcHRpb249UmVtb3ZlIEFsbCBFbnRpdGllcyBGcm9tIERpYWdyYW0gYW5kIFNhdmUgQ2hhbmdlcwpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdWkvSlBBRGlhZ3JhbUVkaXRvcklucHV0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91aS9KUEFEaWFncmFtRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczNzI4Zi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91aS9KUEFEaWFncmFtRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnVpLmVkaXRvci5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbC5Nb2RlbEludGVncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklKUEFEaWFncmFtRWRpdG9ySW5wdXQ7Ci0KLQotcHVibGljIGNsYXNzIEpQQURpYWdyYW1FZGl0b3JJbnB1dCBleHRlbmRzIERpYWdyYW1FZGl0b3JJbnB1dCAKLQkJCQkJCQkJCWltcGxlbWVudHMgSUpQQURpYWdyYW1FZGl0b3JJbnB1dCB7Ci0JCi0JcHJpdmF0ZSBEaWFncmFtIGRpYWdyYW07Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWU7Ci0JCi0KLQlwdWJsaWMgSlBBRGlhZ3JhbUVkaXRvcklucHV0KERpYWdyYW0gZGlhZ3JhbSwgCi0JCQkJCQkJCSBTdHJpbmcgZGlhZ3JhbVVyaVN0cmluZywgCi0JCQkJCQkJCSBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIAotCQkJCQkJCQkgU3RyaW5nIHByb3ZpZGVySWQsIAotCQkJCQkJCQkgYm9vbGVhbiBkaXNwb3NlRWRpdGluZ0RvbWFpbikgewotCQkKLQkJc3VwZXIoZGlhZ3JhbVVyaVN0cmluZywgZG9tYWluLCBwcm92aWRlcklkLCBkaXNwb3NlRWRpdGluZ0RvbWFpbik7Ci0JCXRoaXMuZGlhZ3JhbSA9IGRpYWdyYW07IAotCQl0aGlzLnByb2plY3ROYW1lID0gTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0UHJvamVjdEJ5RGlhZ3JhbShkaWFncmFtLmdldE5hbWUoKSkuZ2V0TmFtZSgpOwkJCi0JfQotCi0JcHVibGljIEpQQURpYWdyYW1FZGl0b3JJbnB1dChEaWFncmFtIGRpYWdyYW0sCi0JCQkJCQkJCSBVUkkgZGlhZ3JhbVVyaSwgCi0JCQkJCQkJCSBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIAotCQkJCQkJCQkgU3RyaW5nIHByb3ZpZGVySWQsIAotCQkJCQkJCQkgYm9vbGVhbiBkaXNwb3NlRWRpdGluZ0RvbWFpbikgewotCQkKLQkJc3VwZXIoZGlhZ3JhbVVyaSwgZG9tYWluLCBwcm92aWRlcklkLCBkaXNwb3NlRWRpdGluZ0RvbWFpbik7Ci0JCXRoaXMuZGlhZ3JhbSA9IGRpYWdyYW07Ci0JCXRoaXMucHJvamVjdE5hbWUgPSBNb2RlbEludGVncmF0aW9uVXRpbC5nZXRQcm9qZWN0QnlEaWFncmFtKGRpYWdyYW0uZ2V0TmFtZSgpKS5nZXROYW1lKCk7Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGFkYXB0ZXIuZXF1YWxzKEVPYmplY3QuY2xhc3MpKSB7Ci0JCQlyZXR1cm4gZ2V0RGlhZ3JhbSgpOwotCQl9IAotCQlpZiAoYWRhcHRlci5lcXVhbHMoRGlhZ3JhbS5jbGFzcykpIHsKLQkJCXJldHVybiBnZXREaWFncmFtKCk7Ci0JCX0KLQkJaWYgKGFkYXB0ZXIuZXF1YWxzKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluLmNsYXNzKSkKLQkJCXJldHVybiBNb2RlbEludGVncmF0aW9uVXRpbC5nZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbihkaWFncmFtKTsKLQkJaWYgKGFkYXB0ZXIuZXF1YWxzKElGaWxlLmNsYXNzKSkgewotCQkJUmVzb3VyY2UgZVJlc291cmNlID0gZGlhZ3JhbS5lUmVzb3VyY2UoKTsKLQkJCVVSSSBlVXJpID0gZVJlc291cmNlLmdldFVSSSgpOwotCQkJaWYgKGVVcmkuaXNQbGF0Zm9ybVJlc291cmNlKCkpIHsKLQkJCQlTdHJpbmcgcGxhdGZvcm1TdHJpbmcgPSBlVXJpLnRvUGxhdGZvcm1TdHJpbmcodHJ1ZSk7Ci0JCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKLQkJCQkJCS5maW5kTWVtYmVyKHBsYXRmb3JtU3RyaW5nKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldFByb2plY3RCeURpYWdyYW0oCi0JCQkJCQlkaWFncmFtLmdldE5hbWUoKSkuZ2V0UHJvamVjdCgpOwotCQkJCXJldHVybiBmaW5kWE1MRmlsZShwcm9qZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBJRmlsZSBmaW5kWE1MRmlsZShJUHJvamVjdCBwcm9qZWN0KXsKLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9IHByb2plY3QubWVtYmVycygpOwotCQkJZm9yIChJUmVzb3VyY2UgcmVzIDogcmVzb3VyY2VzKSB7Ci0JCQkJaWYgKHJlcyBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQkJSUZpbGUgZXhpc3RpbmdYTUxGaWxlID0gKChJRm9sZGVyKSByZXMpCi0JCQkJCQkJLmdldEZpbGUoZGlhZ3JhbS5nZXROYW1lKCkKLQkJCQkJCQkJCSsgIi4iICsgTW9kZWxJbnRlZ3JhdGlvblV0aWwuRElBR1JBTV9YTUxfRklMRV9FWFRFTlNJT04pOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChleGlzdGluZ1hNTEZpbGUgIT0gbnVsbCAmJiBleGlzdGluZ1hNTEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCXJldHVybiBleGlzdGluZ1hNTEZpbGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJSlBBRWRpdG9yTWVzc2FnZXMuRW50aXRpZXNDb29yZGluYXRlc1hNTF9DYW5ub3RPYnRhaW5Qcm9qZWN0RXJyb3JNU0csCi0JCQkJCQkJZSk7Ci0JCX0KLQkJSUZpbGUgZXhpc3RpbmdYTUxGaWxlID0gcHJvamVjdC5nZXRGaWxlKE1vZGVsSW50ZWdyYXRpb25VdGlsCi0JCQkJLmdldERpYWdyYW1zWE1MRm9sZGVyUGF0aChwcm9qZWN0KQotCQkJCS5hcHBlbmQoZGlhZ3JhbS5nZXROYW1lKCkpCi0JCQkJLmFkZEZpbGVFeHRlbnNpb24oCi0JCQkJCQlNb2RlbEludGVncmF0aW9uVXRpbC5ESUFHUkFNX1hNTF9GSUxFX0VYVEVOU0lPTikpOwotCQlpZiAoZXhpc3RpbmdYTUxGaWxlICE9IG51bGwgJiYgZXhpc3RpbmdYTUxGaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gZXhpc3RpbmdYTUxGaWxlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9CQotCQotCXB1YmxpYyBzdGF0aWMgSlBBRGlhZ3JhbUVkaXRvcklucHV0IGNyZWF0ZUVkaXRvcklucHV0KERpYWdyYW0gZGlhZ3JhbSwgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBTdHJpbmcgcHJvdmlkZXJJZCwKLQkJCWJvb2xlYW4gZGlzcG9zZUVkaXRpbmdEb21haW4pIHsKLQkJZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UgPSBkaWFncmFtLmVSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCWZpbmFsIFN0cmluZyBmcmFnbWVudCA9IHJlc291cmNlLmdldFVSSUZyYWdtZW50KGRpYWdyYW0pOwotCQlmaW5hbCBVUkkgZnJhZ21lbnRVcmkgPSByZXNvdXJjZS5nZXRVUkkoKS5hcHBlbmRGcmFnbWVudChmcmFnbWVudCk7Ci0JCUpQQURpYWdyYW1FZGl0b3JJbnB1dCBkaWFncmFtRWRpdG9ySW5wdXQ7Ci0JCWRpYWdyYW1FZGl0b3JJbnB1dCA9IG5ldyBKUEFEaWFncmFtRWRpdG9ySW5wdXQoZGlhZ3JhbSwgZnJhZ21lbnRVcmksIGRvbWFpbiwgcHJvdmlkZXJJZCwgZGlzcG9zZUVkaXRpbmdEb21haW4pOwotCQlyZXR1cm4gZGlhZ3JhbUVkaXRvcklucHV0OwotCX0KLQkKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBwcm9qZWN0TmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91aS9KUEFFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91aS9KUEFFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YzA5NzkuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdWkvSlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZHQuSURpYWdyYW1UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLklDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLklNb2RlbEludGVncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnV0aWwuTW9kZWxJbnRlZ3JhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklKUEFEaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIEpQQUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgaW1wbGVtZW50cyBJRWRpdG9yTWF0Y2hpbmdTdHJhdGVneSB7Ci0JCi0JcHJpdmF0ZSBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwID0gbnVsbDsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERV9HRU5FUkFURUQgPSAiQ09ERV9HRU5FUkFURUQiOyAJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRV9DTElDSyA9ICJET1VCTEVfQ0xJQ0siOwkJLy8kTk9OLU5MUy0xJAotCQotCQotCXB1YmxpYyBKUEFFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5KCkge30KLQkKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIGludGVuZGVkIHNvbGVseSBmb3IgdGhlIHRlc3QgcHVycG9zZXMKLQkgKiAgCi0JICogQHBhcmFtIGZwIHRoZSBmZWF0dXJlIHByb3ZpZGVyCi0JICovCi0JcHVibGljIEpQQUVkaXRvck1hdGNoaW5nU3RyYXRlZ3koSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQl0aGlzLmZwID0gZnA7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoSUVkaXRvclJlZmVyZW5jZSBlZGl0b3JSZWYsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJRmlsZUVkaXRvcklucHV0IGZpbGVJbnB1dCA9IChJRmlsZUVkaXRvcklucHV0KSBpbnB1dDsKLQkJCUlGaWxlIGVudGl0eUZpbGUgPSBmaWxlSW5wdXQuZ2V0RmlsZSgpOwotCQkJaWYoIWVudGl0eUZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamF2YSIpKXsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJUXVhbGlmaWVkTmFtZSBxbiA9IG5ldyBRdWFsaWZpZWROYW1lKG51bGwsIERPVUJMRV9DTElDSyk7Ci0JCQkJaWYgKCJ0cnVlIi5lcXVhbHMoZW50aXR5RmlsZS5nZXRTZXNzaW9uUHJvcGVydHkocW4pKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWVudGl0eUZpbGUuc2V0U2Vzc2lvblByb3BlcnR5KHFuLCBudWxsKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3QgZ2V0IHNlc3Npb24gcHJvcGVydHkgRE9VQkxFX0NMSUNLIiwgZTEpOyAgLy8kTk9OLU5MUy0xJAkJIAkJCQkJCQkKLQkJCX0KLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBpbnB1dEpwdFR5cGUgPSBudWxsOyAKLQkJCQotCQkJaWYgKGZwID09IG51bGwpIHsKLQkJCQlpbnB1dEpwdFR5cGUgPSBKUEFFZGl0b3JVdGlsLmdldEpQVHlwZShKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGVudGl0eUZpbGUpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5wdXRKcHRUeXBlID0gZnAuZ2V0SlBBRWRpdG9yVXRpbCgpLmdldEpQVHlwZShKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGVudGl0eUZpbGUpKTsKLQkJCX0KLQkJCWlmIChpbnB1dEpwdFR5cGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gaW5wdXRKcHRUeXBlLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gcGVyc2lzdGVuY2VVbml0LmdldEpwYVByb2plY3QoKTsKLQotCQkJdHJ5IHsKLQkJCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBlZGl0b3JSZWYuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJSlBBRGlhZ3JhbUVkaXRvcklucHV0KSB7Ci0JCQkJCUlKUEFEaWFncmFtRWRpdG9ySW5wdXQganBJbnB1dCA9IChJSlBBRGlhZ3JhbUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dDsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0ganBJbnB1dC5nZXREaWFncmFtKCk7Ci0JCQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJCQotCQkJCQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXIgPSBudWxsOwotCQkJCQkJSURpYWdyYW1UeXBlUHJvdmlkZXIgZGlhZ3JhbVByb3ZpZGVyID0gbnVsbDsKLQkJCQkJCWlmIChmcCAhPSBudWxsKSB7Ci0JCQkJCQkJZmVhdHVyZVByb3ZpZGVyID0gdGhpcy5mcDsKLQkJCQkJCQlkaWFncmFtUHJvdmlkZXIgPSBmZWF0dXJlUHJvdmlkZXIuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlkaWFncmFtUHJvdmlkZXIgPSBNb2RlbEludGVncmF0aW9uVXRpbC5nZXRQcm92aWRlckJ5RGlhZ3JhbShkaWFncmFtLmdldE5hbWUoKSk7Ci0JCQkJCQkJZmVhdHVyZVByb3ZpZGVyID0gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpZGlhZ3JhbVByb3ZpZGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCQkJCQkJfQotCQkJCQkJSU1vZGVsSW50ZWdyYXRpb25VdGlsIG1vaW5JbnRlZ3JhdGlvblV0aWwgPSBmZWF0dXJlUHJvdmlkZXIuZ2V0TW9pbkludGVncmF0aW9uVXRpbCgpOwotCQkJCQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0RnJvbUVkaXRvciA9IG1vaW5JbnRlZ3JhdGlvblV0aWwuZ2V0UHJvamVjdEJ5RGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJCWlmIChqcGFQcm9qZWN0LmVxdWFscyhqcGFQcm9qZWN0RnJvbUVkaXRvcikpIHsKLQkJCQkJCQlpZiAoZmlsZUlucHV0LmdldE5hbWUoKSAhPSBDT0RFX0dFTkVSQVRFRCkgCi0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChpbnB1dEpwdFR5cGUpOwotCQkJCQkJCWlmIChwZSAhPSBudWxsKSB7Ci0JCQkJCQkJCWRpYWdyYW1Qcm92aWRlci5nZXREaWFncmFtRWRpdG9yKCkuc2V0UGljdG9ncmFtRWxlbWVudEZvclNlbGVjdGlvbihwZSk7Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlJQ3VzdG9tRmVhdHVyZSBmZWF0dXJlID0gZmVhdHVyZVByb3ZpZGVyLmdldEFkZEFsbEVudGl0aWVzRmVhdHVyZSgpOwotCQkJCQkJCUN1c3RvbUNvbnRleHQgY29udGV4dCA9IG5ldyBDdXN0b21Db250ZXh0KCk7Ci0JCQkJCQkJZmVhdHVyZS5leGVjdXRlKGNvbnRleHQpOwotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIElKUEFEaWFncmFtRWRpdG9ySW5wdXQpIHsKLQkJCXJldHVybiBlZGl0b3JSZWYuZ2V0UGFydE5hbWUoKS5lcXVhbHMoKChJSlBBRGlhZ3JhbUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0UHJvamVjdE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdWkvT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdWkvT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTQxYjJjLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3VpL09wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51aTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2JDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnBsYXRmb3JtLklEaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnVpLmVkaXRvci5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmRpYWxvZ3MuT3B0aW9uYWxNZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JY29uQW5kTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUm9vdENvbnRleHROb2RlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLkNyZWF0ZURpYWdyYW1Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLk1vZGVsSW50ZWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuV3JwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKHsgInVudXNlZCIsICJyZXN0cmljdGlvbiIgfSkKLXB1YmxpYyBjbGFzcyBPcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQkJCQotCXByaXZhdGUgY2xhc3MgT3BlbkVkaXRvclJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgewotCQlwcml2YXRlIERpYWdyYW0gZGlhZ3JhbTsKLQotCQlwcml2YXRlIE9wZW5FZGl0b3JSdW5uYWJsZShEaWFncmFtIGRpYWdyYW0pIHsKLQkJCXRoaXMuZGlhZ3JhbSA9IGRpYWdyYW07Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkvL01vZGVsSW50ZWdyYXRpb25VdGlsLm1hcERpYWdyYW1Ub1Byb2plY3QoZGlhZ3JhbSwganBhUHJvamVjdCk7CQkJCi0JCQlvcGVuRGlhZ3JhbUVkaXRvcihkaWFncmFtKTsKLQkJfQotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBJRGlhZ3JhbUVkaXRvciBvcGVuRGlhZ3JhbUVkaXRvcihEaWFncmFtIGRpYWdyYW0pIHsKLQkJCi0JCVN0cmluZyBkaWFncmFtTmFtZSA9IGRpYWdyYW0uZ2V0TmFtZSgpOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBNb2RlbEludGVncmF0aW9uVXRpbC5nZXRQcm9qZWN0QnlEaWFncmFtKGRpYWdyYW1OYW1lKTsKLQkJaWYgKCFKUEFFZGl0b3JVdGlsLmNoZWNrSlBBRmFjZXRWZXJzaW9uKGpwYVByb2plY3QsICIxLjAiKSAmJiAhTW9kZWxJbnRlZ3JhdGlvblV0aWwuaXNEaWFncmFtT3BlbihkaWFncmFtTmFtZSkpIHsJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCWJvb2xlYW4gd2FzRW5hYmxlZCA9IE9wdGlvbmFsTWVzc2FnZURpYWxvZy5pc0RpYWxvZ0VuYWJsZWQoSlBBRWRpdG9yQ29uc3RhbnRzLkpQQV9TVVBQT1JUX0RJQUxPR19JRCk7Ci0JCQlpbnQgYnRuSW5kZXggPSBPcHRpb25hbE1lc3NhZ2VEaWFsb2cub3BlbihKUEFFZGl0b3JDb25zdGFudHMuSlBBX1NVUFBPUlRfRElBTE9HX0lELCAKLQkJCQkJCQkJCSAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFNoZWxscygpWzBdLCAKLQkJCQkJCQkJCSAgIEpQQUVkaXRvck1lc3NhZ2VzLk9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGVfanBhU3VwcG9ydFdhcm5pbmdUaXRsZSwgCi0JCQkJCQkJCQkgICBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9XQVJOSU5HKSwKLQkJCQkJCQkJCSAgIEpQQUVkaXRvck1lc3NhZ2VzLk9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGVfanBhU3VwcG9ydFdhcm5pbmdNc2csIAotCQkJCQkJCQkJICAgMCwgCi0JCQkJCQkJCQkgICBuZXcgU3RyaW5nW10ge0pQQUVkaXRvck1lc3NhZ2VzLkJUTl9PS30sIAotCQkJCQkJCQkJICAgMCk7Ci0JCX0KLQkJCi0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRlZmF1bHRUcmFuc0VkaXREb21haW4gPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbigoZGlhZ3JhbS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKSk7IAotCQlmaW5hbCBKUEFEaWFncmFtRWRpdG9ySW5wdXQgZGlhZ3JhbUVkaXRvcklucHV0ID0gSlBBRGlhZ3JhbUVkaXRvcklucHV0LmNyZWF0ZUVkaXRvcklucHV0KGRpYWdyYW0sIGRlZmF1bHRUcmFuc0VkaXREb21haW4sIEpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIuSUQsIGZhbHNlKTsgCi0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJZmluYWwgSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCWZpbmFsIFdycCB3cnAgPSBuZXcgV3JwKCk7Ci0JCXRyeSB7Ci0JCQlmaW5hbCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gSURFLm9wZW5FZGl0b3Iod29ya2JlbmNoUGFnZSwgZGlhZ3JhbUVkaXRvcklucHV0LCBKUEFEaWFncmFtRWRpdG9yLklEKTsKLQkJCWlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgSlBBRGlhZ3JhbUVkaXRvcikgewkJCQkKLQkJCQlKUEFEaWFncmFtRWRpdG9yIHJldCA9IChKUEFEaWFncmFtRWRpdG9yKSBlZGl0b3JQYXJ0OwotCQkJCXdycC5zZXRPYmoocmV0KTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmFkZFdvcmtiZW5jaExpc3RlbmVyKCBuZXcgSVdvcmtiZW5jaExpc3RlbmVyKCkgewotCQkJCSAgICBwdWJsaWMgYm9vbGVhbiBwcmVTaHV0ZG93biggSVdvcmtiZW5jaCB3b3JrYmVuY2gsIGJvb2xlYW4gZm9yY2VkICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkgICAgCXdvcmtiZW5jaFBhZ2UuY2xvc2VFZGl0b3IoIGVkaXRvclBhcnQsIHRydWUpOwotCQkJCSAgICAgICAgcmV0dXJuIHRydWU7Ci0JCQkJICAgIH0KLQkJCQkgCi0JCQkJICAgIHB1YmxpYyB2b2lkIHBvc3RTaHV0ZG93biggSVdvcmtiZW5jaCB3b3JrYmVuY2ggKXsKLQkJCQkgCi0JCQkJICAgIH0KLQkJCQl9KTsKLQkJCQkvL0NTTiAjMTMwNTg1MCAyMDEwCi0JCQkJLy9pZihyZXQuaXNEaXJ0eSgpKQotCQkJCS8vCXJldC5kb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbid0IG9wZW4gSlBBIGVkaXRvciIsIGUpOyAgLy8kTk9OLU5MUy0xJAkJIAkJCQkJCQkKLQkJfQkKLQkJcmV0dXJuIChKUEFEaWFncmFtRWRpdG9yKXdycC5nZXRPYmooKTsKLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9PUEVOSU5HX0RJQUdSQU0gPSBKUEFFZGl0b3JNZXNzYWdlcy5PcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlX29wZW5KUEFEaWFncmFtRXJyb3JNc2c7Ci0JcHJpdmF0ZSBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQlwcml2YXRlIFdlYWtSZWZlcmVuY2U8SVNlbGVjdGlvbj4gc2VsZWN0aW9uUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8SVNlbGVjdGlvbj4obnVsbCk7IAotCQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJc2hlbGwgPSB0YXJnZXRQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsgICAgICAJCi0gICAgICAgIAlwZXJzaXN0ZW5jZVVuaXQgPSBvYnRhaW5KcGFQcm9qZWN0QW5kUGVyc2lzdGVuY2VVbml0KHNlbGVjdGlvblJlZi5nZXQoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHBlcnNpc3RlbmNlVW5pdCA9PSBudWxsKSB7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIAotCQkJCQkJCQkJSlBBRWRpdG9yTWVzc2FnZXMuT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZV9ub1BlcnNpc3RlbmNlVW5pdFRpdGxlLAotCQkJCQkJCQkJSlBBRWRpdG9yTWVzc2FnZXMuT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZV9ub1BlcnNpc3RlbmNlVW5pdE1zZyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmluYWwgQ3JlYXRlRGlhZ3JhbUpvYiBjcmVhdGVEaWFncmFtUnVubmFibGUgPSBuZXcgQ3JlYXRlRGlhZ3JhbUpvYihwZXJzaXN0ZW5jZVVuaXQsIDEwLCB0cnVlKTsKLQkJY3JlYXRlRGlhZ3JhbVJ1bm5hYmxlLnNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCWNyZWF0ZURpYWdyYW1SdW5uYWJsZS5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpewotCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlzaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IE9wZW5FZGl0b3JSdW5uYWJsZShjcmVhdGVEaWFncmFtUnVubmFibGUuZ2V0RGlhZ3JhbSgpKSk7Ci0JCQl9Ci0JCX0pOwotCQljcmVhdGVEaWFncmFtUnVubmFibGUuc2V0VXNlcih0cnVlKTsKLQkJY3JlYXRlRGlhZ3JhbVJ1bm5hYmxlLnNjaGVkdWxlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2VsZWN0aW9uUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8SVNlbGVjdGlvbj4oc2VsZWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0IG9idGFpbkpwYVByb2plY3RBbmRQZXJzaXN0ZW5jZVVuaXQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJT2JqZWN0IGZpcnN0RWxlbWVudCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIEpwYVJvb3RDb250ZXh0Tm9kZU1vZGVsKXsKLQkJCWpwYVByb2plY3QgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRKcGFQcm9qZWN0KCgoSnBhUm9vdENvbnRleHROb2RlTW9kZWwpZmlyc3RFbGVtZW50KS5nZXRQcm9qZWN0KCkpOwotCQl9IGVsc2UgaWYgKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIEpwYU5vZGUpIHsKLSAgICAgICAgCWpwYVByb2plY3QgPSAoKEpwYU5vZGUpZmlyc3RFbGVtZW50KS5nZXRKcGFQcm9qZWN0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QpIHsKLSAgICAgICAgCWludCBjbnQgPSAwOwotICAgIAkJd2hpbGUgKChqcGFQcm9qZWN0ID09IG51bGwpICYmIChjbnQgPCAyNSkpIHsgCi0gICAgCQkJanBhUHJvamVjdCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEpwYVByb2plY3QoKElQcm9qZWN0KWZpcnN0RWxlbWVudCk7Ci0gICAgCQkJaWYgKGpwYVByb2plY3QgPT0gbnVsbCkgewotICAgIAkJCQl0cnkgewotICAgIAkJCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0gICAgCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAJCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIlRocmVhZCBzbGVlcCBpbnRlcnJ1cHRlZCIsIGUpOyAgLy8kTk9OLU5MUy0xJAkJIAotICAgIAkJCQl9Ci0gICAgCQkJfQotICAgIAkJCWNudCsrOwotICAgIAkJfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoanBhUHJvamVjdCk7Ci0JfQotCQkKLQotCXByaXZhdGUgdm9pZCBoYW5kbGVFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcihFUlJPUl9PUEVOSU5HX0RJQUdSQU0sIGUpOzsKLQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgRXJyU3RhdHVzKElTdGF0dXMuRVJST1IsIEpQQURpYWdyYW1FZGl0b3IuSUQsIGUudG9TdHJpbmcoKSwgZSk7Ci0JCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgSlBBRWRpdG9yTWVzc2FnZXMuT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZV9vcGVuSlBBRGlhZ3JhbUVycm9yTXNnVGl0bGUsIAotCQkJCUVSUk9SX09QRU5JTkdfRElBR1JBTSwgc3RhdHVzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBFcnJTdGF0dXMgZXh0ZW5kcyBTdGF0dXMgewotCQkKLQkJcHVibGljIEVyclN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCXN1cGVyKHNldmVyaXR5LCBtZXNzYWdlLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQl9Ci0JCQotCQlwdWJsaWMgSVN0YXR1c1tdIGdldENoaWxkcmVuKCkgewotCQkJU3RhY2tUcmFjZUVsZW1lbnRbXSBzdCA9IGdldEV4Y2VwdGlvbigpLmdldFN0YWNrVHJhY2UoKTsKLQkJCUlTdGF0dXNbXSByZXMgPSBuZXcgSVN0YXR1c1tzdCA9PSBudWxsID8gMCA6IHN0Lmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN0Lmxlbmd0aDsgaSsrKSAKLQkJCQlyZXNbaV0gPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpQQURpYWdyYW1FZGl0b3IuSUQsIHN0W2ldLnRvU3RyaW5nKCkpOwotCQkJcmV0dXJuIHJlczsKLQkJfQotCX0KLQkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3V0aWwvQ3JlYXRlRGlhZ3JhbUpvYi5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdXRpbC9DcmVhdGVEaWFncmFtSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZWE4ZjEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdXRpbC9DcmVhdGVEaWFncmFtSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci0KLQotcHVibGljIGNsYXNzIENyZWF0ZURpYWdyYW1Kb2IgZXh0ZW5kcyBKb2IgewotCi0JLy9wcml2YXRlIENvbm5lY3Rpb24gbW9pbkNvbm5lY3Rpb24gPSBudWxsOwotCXByaXZhdGUgUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdDsKLQlwcml2YXRlIERpYWdyYW0gZGlhZ3JhbTsKLQlwcml2YXRlIGludCBncmlkOwotCXByaXZhdGUgYm9vbGVhbiBzbmFwOwotCQotCS8qCi0JcHVibGljIENvbm5lY3Rpb24gZ2V0TW9pbkNvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiBtb2luQ29ubmVjdGlvbjsKLQl9Ci0JKi8KLQkKLQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQlwdWJsaWMgQ3JlYXRlRGlhZ3JhbUpvYihQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0LCBpbnQgZ3JpZCwgYm9vbGVhbiBzbmFwKSB7Ci0JCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZURpYWdyYW1Kb2JfY3JlYXRlRGlhZ3JhbUpvYk5hbWUsIG5ldyBPYmplY3RbXSB7IHBlcnNpc3RlbmNlVW5pdC5nZXRKcGFQcm9qZWN0KCkuZ2V0TmFtZSgpfSkpOyAKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQ7Ci0JCXRoaXMuZ3JpZCA9IGdyaWQ7Ci0JCXRoaXMuc25hcCA9IHNuYXA7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvL0lQcm9qZWN0IHByb2plY3QgPSBwZXJzaXN0ZW5jZVVuaXQuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJdHJ5ewotCQkJbW9uaXRvci5iZWdpblRhc2soSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlRGlhZ3JhbUpvYl9nZXRKUEFEaWFncmFtTW9uaXRvclRhc2tOYW1lLCAzKTsgCi0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCS8vbW9pbkNvbm5lY3Rpb24gPSBDb25uZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbm5lY3Rpb24ocHJvamVjdCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCWRpYWdyYW0gPSBNb2RlbEludGVncmF0aW9uVXRpbC5jcmVhdGVEaWFncmFtKHBlcnNpc3RlbmNlVW5pdCwgZ3JpZCwgc25hcCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91dGlsL0lNb2RlbEludGVncmF0aW9uVXRpbC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdXRpbC9JTW9kZWxJbnRlZ3JhdGlvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU4YzZjZS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91dGlsL0lNb2RlbEludGVncmF0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLQotcHVibGljIGludGVyZmFjZSBJTW9kZWxJbnRlZ3JhdGlvblV0aWwgewotCXB1YmxpYyBKcGFQcm9qZWN0IGdldFByb2plY3RCeURpYWdyYW0oRGlhZ3JhbSBkaWFncmFtKTsKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3V0aWwvTW9kZWxJbnRlZ3JhdGlvblV0aWwuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3V0aWwvTW9kZWxJbnRlZ3JhdGlvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0NGUzOS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91dGlsL01vZGVsSW50ZWdyYXRpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLkVGUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudWkuZWRpdG9yLkRpYWdyYW1FZGl0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLkpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi1wdWJsaWMgY2xhc3MgTW9kZWxJbnRlZ3JhdGlvblV0aWwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR1JBTV9GSUxFX0VYVEVOU0lPTiA9ICJ4bWkiOyAJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFHUkFNX1hNTF9GSUxFX0VYVEVOU0lPTiA9ICJ4bWwiOyAJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUEFfRElBR1JBTV9UWVBFID0gIkpQQSBEaWFncmFtIjsgCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JFU19GT0xERVIgPSAic3JjIjsJCS8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4geG1pRXhpc3RzID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgV2Vha0hhc2hNYXA8SVByb2plY3QsIFdlYWtSZWZlcmVuY2U8RGlhZ3JhbT4+IHByb2plY3RUb0RpYWdyYW0gPSBuZXcgIFdlYWtIYXNoTWFwPElQcm9qZWN0LCBXZWFrUmVmZXJlbmNlPERpYWdyYW0+PigpOwotCQotCXB1YmxpYyBzdGF0aWMgSVBhdGggY3JlYXRlRGlhZ3JhbVBhdGgoUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCSAgICBJUHJvamVjdCBwcm9qZWN0ID0gcGVyc2lzdGVuY2VVbml0LmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JICAgIFN0cmluZyBkaWFncmFtTmFtZSA9IHBlcnNpc3RlbmNlVW5pdC5nZXRKcGFQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQlJUGF0aCBuZXdYTUlGaWxlUGF0aCA9IGdldERpYWdyYW1zRm9sZGVyUGF0aChwcm9qZWN0KS5hcHBlbmQoZGlhZ3JhbU5hbWUpLmFkZEZpbGVFeHRlbnNpb24oRElBR1JBTV9GSUxFX0VYVEVOU0lPTik7CQotCQlJRmlsZVN5c3RlbSBmaWxlU3lzdGVtID0gRUZTLmdldExvY2FsRmlsZVN5c3RlbSgpOwotCQlJRmlsZVN0b3JlIG5ld1hNSUZpbGUgPSBmaWxlU3lzdGVtLmdldFN0b3JlKG5ld1hNSUZpbGVQYXRoKTsKLSAgICAgICAgCi0JICAgIElQYXRoIGZvbGRlclBhdGggPSBjb3B5RXhpc3RpbmdYTUlDb250ZW50QW5kRGVsZXRlRmlsZShwcm9qZWN0LCBkaWFncmFtTmFtZSwgbmV3WE1JRmlsZSk7Ci0JICAgIGlmKGZvbGRlclBhdGggIT0gbnVsbCl7Ci0JCSAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoZm9sZGVyUGF0aC5zZWdtZW50KDApKTsKLQkJICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZm9sZGVyUGF0aC5zZWdtZW50Q291bnQoKTsgaSsrKSB7Ci0JCSAgICAJcGF0aCA9IHBhdGguYXBwZW5kKGZvbGRlclBhdGguc2VnbWVudChpKSk7Ci0JCQkgICAgSUZvbGRlciBmb2xkZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihwYXRoKTsKLQkJCSAgICBpZiAoIWZvbGRlci5leGlzdHMoKSkKLQkJCSAgICAJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJICAgIH0JICAgIAkKLQkgICAgCUlGaWxlIGRpYWdyYW1YTUxGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGZvbGRlclBhdGguYXBwZW5kKGRpYWdyYW1OYW1lKS5hZGRGaWxlRXh0ZW5zaW9uKERJQUdSQU1fWE1MX0ZJTEVfRVhURU5TSU9OKSk7Ci0JICAgIAlTdHJpbmcgY29udGVudCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiID8+XG4iKyAvLyROT04tTkxTLTEkCi0JCSAgIAkJCSI8ZW50aXRpZXM+XG4iKyAvLyROT04tTkxTLTEkCi0JCSAgIAkJCSI8L2VudGl0aWVzPlxuIjsgLy8kTk9OLU5MUy0xJAotCSAgICAJaWYoZGlhZ3JhbVhNTEZpbGUgPT0gbnVsbCB8fCAhZGlhZ3JhbVhNTEZpbGUuZXhpc3RzKCkpewotCQkJICAgSW5wdXRTdHJlYW0gc291cmNlID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnQuZ2V0Qnl0ZXMoKSk7Ci0JCQkgICBkaWFncmFtWE1MRmlsZS5jcmVhdGUoc291cmNlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJICAgfSBlbHNlCi0JCQkJdHJ5IHsKLQkJCQkJaWYoZGlhZ3JhbVhNTEZpbGUuZ2V0Q29udGVudHMoKS5yZWFkKCkgPT0gLTEpewotCQkJCQkJICAgZGlhZ3JhbVhNTEZpbGUuc2V0Q29udGVudHMobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnQuZ2V0Qnl0ZXMoKSksIHRydWUsIGZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcihKUEFFZGl0b3JNZXNzYWdlcy5Nb2RlbEludGVncmF0aW9uVXRpbF9DYW5ub3RTZXRGaWxlQ29udGVudEVycm9yTVNHLCBlKTsKLQkJCQl9Ci0JICAgIH0KLQotCSAgICByZXR1cm4gbmV3WE1JRmlsZVBhdGg7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSVBhdGggY29weUV4aXN0aW5nWE1JQ29udGVudChJQ29udGFpbmVyIGNvbnRhaW5lciwKLQkJCVN0cmluZyB4bWlGaWxlTmFtZSwgSUZpbGVTdG9yZSBuZXdYTUlGaWxlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLAlDb3JlRXhjZXB0aW9uIHsKLQkJSVBhdGggZm9sZGVyUGF0aCA9IG51bGw7Ci0JCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0JICAgIGZvcihJUmVzb3VyY2UgcmVzIDogcmVzb3VyY2VzKXsKLQkgICAgCWlmKHJlcyBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkgICAgCQlmb2xkZXJQYXRoID0gKChJRm9sZGVyKXJlcykuZ2V0RnVsbFBhdGgoKTsKLQkJCQlJRmlsZSBleGlzdGluZ1hNSUZpbGUgPSgoSUZvbGRlcilyZXMpLmdldEZpbGUoeG1pRmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JICAgIAkJaWYoZXhpc3RpbmdYTUlGaWxlICE9IG51bGwgJiYgZXhpc3RpbmdYTUlGaWxlLmV4aXN0cygpKXsKLQkJICAgIAkJSUZpbGVTdG9yZSBmb2xkZXIgPSBFRlMuZ2V0TG9jYWxGaWxlU3lzdGVtKCkuZ2V0U3RvcmUoZXhpc3RpbmdYTUlGaWxlLmdldExvY2F0aW9uVVJJKCkpOwotCSAgICAJCQlmb2xkZXIuY29weShuZXdYTUlGaWxlLCBFRlMuT1ZFUldSSVRFLCBudWxsKTsKLQkgICAgCQkgICAgZXhpc3RpbmdYTUlGaWxlLmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkgICAgCQkgICAgc2V0WG1pRXhpc3RzKHRydWUpOwotCSAgICAJCSAgICByZXR1cm4gZm9sZGVyUGF0aDsKLQkgICAgCQl9Ci0JICAgIAl9Ci0JICAgIAlpZihyZXMgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSAKLQkgICAgCQljb3B5RXhpc3RpbmdYTUlDb250ZW50KChJQ29udGFpbmVyKXJlcywKLQkgICAgCQkJCXhtaUZpbGVOYW1lLCBuZXdYTUlGaWxlKTsKLQkgICAgfQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVBhdGggY29weUV4aXN0aW5nWE1JQ29udGVudEFuZERlbGV0ZUZpbGUoSVByb2plY3QgcHJvamVjdCwKLQkJCVN0cmluZyBkaWFncmFtTmFtZSwgSUZpbGVTdG9yZSBuZXdYTUlGaWxlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLAlDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHhtaUZpbGVOYW1lID0gZGlhZ3JhbU5hbWUgKyAiLiIgKyBESUFHUkFNX0ZJTEVfRVhURU5TSU9OOwkJLy8kTk9OLU5MUy0xJAotCQlJUGF0aCBmb2xkZXJQYXRoID0gY29weUV4aXN0aW5nWE1JQ29udGVudChwcm9qZWN0LCB4bWlGaWxlTmFtZSwgbmV3WE1JRmlsZSk7Ci0JCWlmIChmb2xkZXJQYXRoICE9IG51bGwpCi0JCQlyZXR1cm4gZm9sZGVyUGF0aDsKLQkgICAgSVBhdGggcHJvamVjdFBhdGggPSBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JICAgIGZvbGRlclBhdGggPSBwcm9qZWN0UGF0aC5hcHBlbmQoZ2V0RGlhZ3JhbXNYTUxGb2xkZXJQYXRoKHByb2plY3QpKTsKLQkgICAgcmV0dXJuIGZvbGRlclBhdGg7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbSBjcmVhdGVEaWFncmFtKFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQsIAotCQkJCQkJCQkJCWludCBncmlkLCAKLQkJCQkJCQkJCQlib29sZWFuIHNuYXApIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBhdGggcGF0aCA9IGNyZWF0ZURpYWdyYW1QYXRoKHBlcnNpc3RlbmNlVW5pdCk7Ci0JCURpYWdyYW0gZCA9IGNyZWF0ZURpYWdyYW0ocGVyc2lzdGVuY2VVbml0LmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCksIHBhdGgsIHBlcnNpc3RlbmNlVW5pdC5nZXRKcGFQcm9qZWN0KCkuZ2V0TmFtZSgpLCBncmlkLCBzbmFwKTsgCi0JICAgIHJldHVybiBkOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGdldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKERpYWdyYW0gZGlhZ3JhbSkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oZGlhZ3JhbSk7Ci0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KERpYWdyYW0gZGlhZ3JhbSkgewotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBnZXRQcm9qZWN0QnlEaWFncmFtKGRpYWdyYW0uZ2V0TmFtZSgpKTsKLQkJaWYgKGpwYVByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkZWZhdWx0VHJhbnNFZGl0RG9tYWluID0gKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmdldEFkYXB0ZXIoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4uY2xhc3MpOwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGRlZmF1bHRUcmFuc0VkaXREb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsKLQkJcmV0dXJuIHJlc291cmNlU2V0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBXcnAgewotCQlwcml2YXRlIE9iamVjdCBvOwotCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJCXJldHVybiBvOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG8pIHsKLQkJCXRoaXMubyA9IG87Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBEaWFncmFtIGNyZWF0ZURpYWdyYW0oSVByb2plY3QgcHJvamVjdCwgCi0JCQkJCQkJCQkgSVBhdGggZGlhZ3JhbUZpbGVOYW1lLAotCQkJCQkJCQkJIFN0cmluZyBkaWFncmFtTmFtZSwKLQkJCQkJCQkJCSBpbnQgZ3JpZCwgCi0JCQkJCQkJCQkgYm9vbGVhbiBzbmFwKSB7Ci0JCQotCQlEaWFncmFtIGRpYWdyYW0gPSBnZXREaWFncmFtQnlQcm9qZWN0KHByb2plY3QpOwotCQlpZiAoZGlhZ3JhbSAhPSBudWxsKQotCQkJcmV0dXJuIGRpYWdyYW07Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRlZmF1bHRUcmFuc0VkaXREb21haW4gPSBEaWFncmFtRWRpdG9yRmFjdG9yeS5jcmVhdGVSZXNvdXJjZVNldEFuZEVkaXRpbmdEb21haW4oKTsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBkZWZhdWx0VHJhbnNFZGl0RG9tYWluLmdldFJlc291cmNlU2V0KCk7Ci0KLQkJU3RyaW5nIHBhdGhOYW1lID0gZGlhZ3JhbUZpbGVOYW1lLnRvU3RyaW5nKCk7Ci0JCVVSSSByZXNvdXJjZVVSSSA9IFVSSS5jcmVhdGVGaWxlVVJJKHBhdGhOYW1lKTsKLQkJZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZVVSSSk7Ci0JCS8vcmVzb3VyY2Uuc2V0VHJhY2tpbmdNb2RpZmljYXRpb24oZmFsc2UpOwotCQkJLy8oUmVzb3VyY2VTZXRNYW5hZ2VyLmdldFByb2plY3RGb3JSZXNvdXJjZVNldChyZXNvdXJjZVNldCkpOwotCQlkZWZhdWx0VHJhbnNFZGl0RG9tYWluLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQoZGVmYXVsdFRyYW5zRWRpdERvbWFpbikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzb3VyY2UubG9hZChudWxsKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nSW5mbygiVGhlIGRpYWdyYW0gZmlsZSBkb2VzIG5vdCBleGlzdC4gSXQgd2lsbCBiZSBjcmVhdGVkIik7CQkvLyROT04tTkxTLTEkCi0JCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nSW5mbyhlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCWlmICghcmVzb3VyY2UuaXNMb2FkZWQoKSkKLQkJCXJldHVybiBjcmVhdGVOZXdEaWFncmFtKHByb2plY3QsIGRlZmF1bHRUcmFuc0VkaXREb21haW4sIHJlc291cmNlU2V0LCByZXNvdXJjZSwgZGlhZ3JhbU5hbWUsIGdyaWQsIHNuYXApOwotCQkKLQkJRUxpc3Q8RU9iamVjdD4gb2JqcyA9IHJlc291cmNlLmdldENvbnRlbnRzKCk7Ci0JCWlmIChvYmpzID09IG51bGwpIAotCQkJcmV0dXJuIGNyZWF0ZU5ld0RpYWdyYW0ocHJvamVjdCwgZGVmYXVsdFRyYW5zRWRpdERvbWFpbiwgcmVzb3VyY2VTZXQsIHJlc291cmNlLCBkaWFncmFtTmFtZSwgZ3JpZCwgc25hcCk7Ci0JCUl0ZXJhdG9yPEVPYmplY3Q+IGl0ID0gb2Jqcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlFT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCWlmICgob2JqID09IG51bGwpICYmICFEaWFncmFtLmNsYXNzLmlzSW5zdGFuY2Uob2JqKSkKLQkJCQljb250aW51ZTsKLQkJCWRpYWdyYW0gPSAoRGlhZ3JhbSlvYmo7Ci0JCQkvL2RpYWdyYW1zVG9SZXNvdXJjZXMucHV0KGRpYWdyYW0sIHJlc291cmNlKTsKLQkJCWRlZmF1bHRUcmFuc0VkaXREb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZmx1c2goKTsKLQkJCXJldHVybiBkaWFncmFtOwotCQl9Ci0JCXJldHVybiBjcmVhdGVOZXdEaWFncmFtKHByb2plY3QsIGRlZmF1bHRUcmFuc0VkaXREb21haW4sIHJlc291cmNlU2V0LCByZXNvdXJjZSwgZGlhZ3JhbU5hbWUsIGdyaWQsIHNuYXApOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBEaWFncmFtIGNyZWF0ZU5ld0RpYWdyYW0oZmluYWwgSVByb2plY3QgcHJvamVjdCwKLQkJCQkJCQkJCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwKLQkJCQkJCQkJCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQsCi0JCQkJCQkJCQkJCWZpbmFsIFJlc291cmNlIHJlc291cmNlLAotCQkJCQkJCQkJCQlmaW5hbCBTdHJpbmcgZGlhZ3JhbU5hbWUsCi0JCQkJCQkJCQkJCWZpbmFsIGludCBncmlkLCAKLQkJCQkJCQkJCQkJZmluYWwgYm9vbGVhbiBzbmFwKSB7Ci0JCWZpbmFsIFdycCB3cnAgPSBuZXcgV3JwKCk7Ci0JCWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZChlZGl0aW5nRG9tYWluKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlEaWFncmFtIGRpYWdyYW0gPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVEaWFncmFtKEpQQV9ESUFHUkFNX1RZUEUsIGRpYWdyYW1OYW1lLCBncmlkLCBzbmFwKTsKLQkJCQlwcm9qZWN0VG9EaWFncmFtLnB1dChwcm9qZWN0LCBuZXcgV2Vha1JlZmVyZW5jZTxEaWFncmFtPihkaWFncmFtKSk7Ci0JCQkJd3JwLnNldE9iamVjdChkaWFncmFtKTsKLQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsKLQkJCQl0cnkgewotCQkJCQlyZXNvdXJjZS5zYXZlKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3QgY3JlYXRlIG5ldyBkaWFncmFtIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9CQkJCQotCQkJfQotCQl9KTsJCi0JCWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZmx1c2goKTsKLQkJLy9tYXBEaWFncmFtVG9Qcm9qZWN0KChEaWFncmFtKXdycC5nZXRPYmplY3QoKSwgcmVzb3VyY2UpOwotCQlyZXR1cm4gKERpYWdyYW0pd3JwLmdldE9iamVjdCgpOwkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0UmVzb3VyY2VGb2xkZXJQYXRoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGdldEVNRlJlc291cmNlRm9sZGVyUGF0aChwcm9qZWN0KTsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0RU1GUmVzb3VyY2VGb2xkZXJQYXRoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIHByb2plY3QuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLmFwcGVuZChERUZBVUxUX1JFU19GT0xERVIpOwkJCi0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldERpYWdyYW1zWE1MRm9sZGVyUGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmxvYWRQcm9wZXJ0aWVzKHByb2plY3QpOwkJCi0JCXJldHVybiBuZXcgUGF0aChKUEFEaWFncmFtUHJvcGVydHlQYWdlLmdldERlZmF1bHRGb2xkZXIocHJvamVjdCwgcHJvcHMpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXREaWFncmFtc0ZvbGRlclBhdGgoSVByb2plY3QgcHJvamVjdCl7Ci0JCXJldHVybiBKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCk7Ci0JfQotCQkKLQlwdWJsaWMgc3RhdGljIEpwYVByb2plY3QgZ2V0UHJvamVjdEJ5RGlhZ3JhbShTdHJpbmcgZGlhZ3JhbU5hbWUpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChkaWFncmFtTmFtZSk7Ci0JCXJldHVybiBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRKcGFQcm9qZWN0KHByb2plY3QpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEaWFncmFtT3BlbihTdHJpbmcgZGlhZ3JhbU5hbWUpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZnMgPSB3b3JrYmVuY2hQYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJZm9yIChJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZiA6IGVkaXRvclJlZnMpIHsKLQkJCWlmKCFKUEFEaWFncmFtRWRpdG9yUGx1Z2luLlBMVUdJTl9JRC5lcXVhbHMoZWRpdG9yUmVmLmdldElkKCkpKSAKLQkJCQljb250aW51ZTsKLQkJCUpQQURpYWdyYW1FZGl0b3IgZWRpdG9yID0gKEpQQURpYWdyYW1FZGl0b3IpZWRpdG9yUmVmLmdldEVkaXRvcihmYWxzZSk7Ci0JCQlpZiAoZWRpdG9yID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlKUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyIGRpYWdyYW1Qcm92aWRlciA9IGVkaXRvci5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCk7ICAKLQkJCURpYWdyYW0gZCA9IGRpYWdyYW1Qcm92aWRlci5nZXREaWFncmFtKCk7Ci0JCQlpZiAoZGlhZ3JhbU5hbWUuZXF1YWxzKGQuZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCQkKLQkJCi0JcHVibGljIHN0YXRpYyBKUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyIGdldFByb3ZpZGVyQnlEaWFncmFtKFN0cmluZyBkaWFncmFtTmFtZSkgewotCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3b3JrYmVuY2hXaW5kb3cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZnMgPSB3b3JrYmVuY2hQYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJZm9yIChJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZiA6IGVkaXRvclJlZnMpIHsKLQkJCWlmKCFKUEFEaWFncmFtRWRpdG9yUGx1Z2luLlBMVUdJTl9JRC5lcXVhbHMoZWRpdG9yUmVmLmdldElkKCkpKSAKLQkJCQljb250aW51ZTsKLQkJCUpQQURpYWdyYW1FZGl0b3IgZWRpdG9yID0gKEpQQURpYWdyYW1FZGl0b3IpZWRpdG9yUmVmLmdldEVkaXRvcihmYWxzZSk7Ci0JCQlpZiAoZWRpdG9yID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlKUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyIGRpYWdyYW1Qcm92aWRlciA9IGVkaXRvci5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCk7ICAKLQkJCURpYWdyYW0gZCA9IGRpYWdyYW1Qcm92aWRlci5nZXREaWFncmFtKCk7Ci0JCQlpZiAoZGlhZ3JhbU5hbWUuZXF1YWxzKGQuZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm4gZGlhZ3JhbVByb3ZpZGVyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4geG1pRXhpc3RzKCkgewotCQlyZXR1cm4geG1pRXhpc3RzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRYbWlFeGlzdHMoYm9vbGVhbiB4bWlFeGlzdHMpIHsKLQkJTW9kZWxJbnRlZ3JhdGlvblV0aWwueG1pRXhpc3RzID0geG1pRXhpc3RzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0RGlhZ3JhbVhNTEZ1bGxQYXRoKFN0cmluZyBkaWFncmFtTmFtZSkgewotCQlpZiAoZGlhZ3JhbU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBnZXRQcm9qZWN0QnlEaWFncmFtKGRpYWdyYW1OYW1lKTsKLQkJaWYgKGpwYVByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJUHJvamVjdCBwcm9qZWN0ID0ganBhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0JCXJldHVybiBwcm9qZWN0LmdldEZpbGUoTW9kZWxJbnRlZ3JhdGlvblV0aWwKLQkJCQkuZ2V0RGlhZ3JhbXNYTUxGb2xkZXJQYXRoKHByb2plY3QpCi0JCQkJLmFwcGVuZChkaWFncmFtTmFtZSkKLQkJCQkuYWRkRmlsZUV4dGVuc2lvbigKLQkJCQkJCU1vZGVsSW50ZWdyYXRpb25VdGlsLkRJQUdSQU1fWE1MX0ZJTEVfRVhURU5TSU9OKSkuZ2V0RnVsbFBhdGgoKTsKLQl9Ci0JCi0Jc3luY2hyb25pemVkIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXRQcm9qZWN0VG9EaWFncmFtKElQcm9qZWN0IHByb2plY3QsIERpYWdyYW0gZCkgewotCQlwcm9qZWN0VG9EaWFncmFtLnB1dChwcm9qZWN0LCBuZXcgV2Vha1JlZmVyZW5jZTxEaWFncmFtPihkKSk7Ci0JfQotCi0Jc3luY2hyb25pemVkIHB1YmxpYyBzdGF0aWMgRGlhZ3JhbSBnZXREaWFncmFtQnlQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBudWxsOyAKLQkJdHJ5IHsKLQkJCXdvcmtiZW5jaFBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZnMgPSB3b3JrYmVuY2hQYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJCWZvciAoSUVkaXRvclJlZmVyZW5jZSBlZGl0b3JSZWYgOiBlZGl0b3JSZWZzKSB7Ci0JCQkJaWYoIUpQQURpYWdyYW1FZGl0b3JQbHVnaW4uUExVR0lOX0lELmVxdWFscyhlZGl0b3JSZWYuZ2V0SWQoKSkpIAotCQkJCQljb250aW51ZTsKLQkJCQlKUEFEaWFncmFtRWRpdG9yIGVkaXRvciA9IChKUEFEaWFncmFtRWRpdG9yKWVkaXRvclJlZi5nZXRFZGl0b3IoZmFsc2UpOwotCQkJCWlmIChlZGl0b3IgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlciBkaWFncmFtUHJvdmlkZXIgPSBlZGl0b3IuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpOyAgCi0JCQkJRGlhZ3JhbSBkID0gZGlhZ3JhbVByb3ZpZGVyLmdldERpYWdyYW0oKTsKLQkJCQlpZiAoZC5nZXROYW1lKCkuZXF1YWxzKHByb2plY3QuZ2V0TmFtZSgpKSkKLQkJCQkJcmV0dXJuIGQ7Ci0JCQl9CQkJCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCVdlYWtSZWZlcmVuY2U8RGlhZ3JhbT4gcmVmID0gcHJvamVjdFRvRGlhZ3JhbS5nZXQocHJvamVjdCk7Ci0JCWlmIChyZWYgIT0gbnVsbCkKLQkJCXJldHVybiByZWYuZ2V0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3V0aWwvTW9kZWxJbnRlZ3JhdGlvblV0aWxJbXBsLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91dGlsL01vZGVsSW50ZWdyYXRpb25VdGlsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTY3ZmU0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3V0aWwvTW9kZWxJbnRlZ3JhdGlvblV0aWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotCi1wdWJsaWMgY2xhc3MgTW9kZWxJbnRlZ3JhdGlvblV0aWxJbXBsIGltcGxlbWVudHMgSU1vZGVsSW50ZWdyYXRpb25VdGlsIHsKLQkKLQlwdWJsaWMgSnBhUHJvamVjdCBnZXRQcm9qZWN0QnlEaWFncmFtKERpYWdyYW0gZGlhZ3JhbSkgewotCQlyZXR1cm4gTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0UHJvamVjdEJ5RGlhZ3JhbShkaWFncmFtLmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0pQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0pQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzJkODhkLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzCi0JCUFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ESUFHUkFNX0ZPTERFUiAJCQkJPSAib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuZGlhZ3JhbWZvbGRlciI7CQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0VOVElUWV9QQUNLQUdFIAkJCQk9ICJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5lbnRpdHkuZGVmYXVsdFBhY2thZ2UiOwkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVEFCTEVfTkFNRV9QUkVGSVggCQkJPSAib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuZW50aXR5LmRlZmF1bHRUYWJsZU5hbWVQcmVmaXgiOwkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RJUkVDVF9FRElUX0NMQVNTX05BTUUgCQk9ICJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5lbnRpdHkuZGVmYXVsdERpcmVjdEVkaXRDbGFzc05hbWUiOwkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRU5USVRZX0FDQ0VTU19UWVBFIAkJCT0gIm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmVudGl0eS5kZWZhdWx0RW50aXR5QWNjZXNzVHlwZSI7CS8vJE5PTi1OTFMtMSQJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfREVGQVVMVF9DT0xMRUNUSU9OX1RZUEUgCT0gIm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmVudGl0eS5kZWZhdWx0Q29sbGVjdGlvblR5cGUiOwkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX09ORV9UT19NQU5ZX09MRF9TVFlMRQkgIAk9ICJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5lbnRpdHkuZGVmYXVsdE9uZVRvTWFueU9sZFN0eWxlIjsJCQkvLyROT04tTkxTLTEkCi0JCi0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9WQUxfRElBR1JBTV9GT0xERVIJCSAJPSAiZGlhZ3JhbXMiOwkJCS8vJE5PTi1OTFMtMSQJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVkFMX0VOVElUWV9QQUNLQUdFIAkJCT0gIm9yZy5wZXJzaXN0ZW5jZSI7CS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9WQUxfUFJFRklYIAkJCQkJPSAiVF8iOwkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1ZBTF9BQ0NFU1NfRklFTERfQkFTRUQgCQk9ICJmaWVsZCI7CQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9WQUxfQUNDRVNTX1BST1BFUlRZX0JBU0VEIAk9ICJwcm9wZXJ0eSI7CQkJLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1ZBTF9DT0xMRUNUSU9OX1RZUEUgCT0gImNvbGxlY3Rpb24iOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9WQUxfTElTVF9UWVBFIAkJCT0gImxpc3QiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9WQUxfU0VUX1RZUEUgCQkJPSAic2V0IjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVkFMX01BUF9UWVBFIAkJCT0gIm1hcCI7CQkJLy8kTk9OLU5MUy0xJAotCi0JCi0JCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlOwotCi0JcHVibGljIEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplcigpIHsKLQkJc3RvcmUgPSBKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKQotCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCXB1YmxpYyBKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQl0aGlzLnN0b3JlID0gc3RvcmU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciMKLQkgKiBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlzdG9yZS5zZXREZWZhdWx0KFBST1BFUlRZX0RJQUdSQU1fRk9MREVSLCBQUk9QRVJUWV9WQUxfRElBR1JBTV9GT0xERVIpOwkJCi0JCXN0b3JlLnNldERlZmF1bHQoUFJPUEVSVFlfRU5USVRZX1BBQ0tBR0UsIFBST1BFUlRZX1ZBTF9FTlRJVFlfUEFDS0FHRSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoUFJPUEVSVFlfVEFCTEVfTkFNRV9QUkVGSVgsIFBST1BFUlRZX1ZBTF9QUkVGSVgpOwotCQlzdG9yZS5zZXREZWZhdWx0KFBST1BFUlRZX0RJUkVDVF9FRElUX0NMQVNTX05BTUUsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KFBST1BFUlRZX0VOVElUWV9BQ0NFU1NfVFlQRSwgUFJPUEVSVFlfVkFMX0FDQ0VTU19GSUVMRF9CQVNFRCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoUFJPUEVSVFlfREVGQVVMVF9DT0xMRUNUSU9OX1RZUEUsIFBST1BFUlRZX1ZBTF9DT0xMRUNUSU9OX1RZUEUpOwotCQlzdG9yZS5zZXREZWZhdWx0KFBST1BFUlRZX09ORV9UT19NQU5ZX09MRF9TVFlMRSwgZmFsc2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0pQQUVkaXRvclByZWZlcmVuY2VzUGFnZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0pQQUVkaXRvclByZWZlcmVuY2VzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzUzYzVlLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvbnZlbnRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkJvb2xlYW5GaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5SYWRpb0dyb3VwRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5TdHJpbmdGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlIGV4dGVuZHMgRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZQotCQlpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgCUZJQ1RJVkVfUFJPSkVDVF9OQU1FID0gIlBST0pFQ1QgTkFNRSI7CQkvLyROT04tTkxTLTEkIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyAJQ09MTEVDVElJT05fVFlQRSA9ICJqYXZhLnV0aWwuQ29sbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgCUxJU1RfVFlQRSA9ICJqYXZhLnV0aWwuTGlzdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgCVNFVF9UWVBFID0gImphdmEudXRpbC5TZXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIAlNQVBfVFlQRSA9ICJqYXZhLnV0aWwuTWFwIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgU3RyaW5nRmllbGRFZGl0b3IgCQlmRGVmYXVsdERpYWdyYW1Gb2xkZXJGaWVsZDsKLQlwcml2YXRlIFN0cmluZ0ZpZWxkRWRpdG9yIAkJZkRlZmF1bHRFbnRpdHlQYWNrYWdlRmllbGQ7Ci0JcHJpdmF0ZSBTdHJpbmdGaWVsZEVkaXRvciAJCWZEZWZhdWx0VGFibGVOYW1lUHJlZml4OwotCXByaXZhdGUgSlBBQm9vbGVhbkZpZWxkRWRpdG9yIAlkaXJlY3RFZGl0QWZmZWN0c0NsYXNzOwotCXByaXZhdGUgUmFkaW9Hcm91cEZpZWxkRWRpdG9yIAllbnRpdHlBY2Nlc3NUeXBlQ2hvb3NlcjsKLQlwcml2YXRlIFJhZGlvR3JvdXBGaWVsZEVkaXRvciAgIGRlZmF1bHRDb2xsZWN0aW9uVHlwZUNob29zZXI7Ci0JcHJpdmF0ZSBKUEFCb29sZWFuRmllbGRFZGl0b3IgCW9uZVRvTWFueU9sZFN0eWxlOwotCi0JcHVibGljIEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZSgpIHsKLQkJc3VwZXIoR1JJRCk7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCXNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9wYWdlRGVzY3JpcHRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0JCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IGdldEZpZWxkRWRpdG9yUGFyZW50KCk7Ci0JCWNyZWF0ZUZvbGRlckZpZWxkKHBhcmVudCk7Ci0JCWNyZWF0ZUVudGl0eVBhY2thZ2VGaWVsZChwYXJlbnQpOwotCQljcmVhdGVUYWJsZU5hbWVGaWVsZChwYXJlbnQpOwotCQkKLQkJZGlyZWN0RWRpdEFmZmVjdHNDbGFzcyA9IG5ldyBKUEFCb29sZWFuRmllbGRFZGl0b3IoIiIsCS8vJE5PTi1OTFMtMSQgCi0JCQkJSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2RpcmVjdEVkaXRBZmZlY3RzQ2xhc3MsIAotCQkJCUJvb2xlYW5GaWVsZEVkaXRvci5ERUZBVUxULCBwYXJlbnQpOwotCQlkaXJlY3RFZGl0QWZmZWN0c0NsYXNzLnNldFByZWZlcmVuY2VOYW1lKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9ESVJFQ1RfRURJVF9DTEFTU19OQU1FKTsKLQkJZGlyZWN0RWRpdEFmZmVjdHNDbGFzcy5nZXRDaGVja0JveChwYXJlbnQpLnNldFRvb2xUaXBUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9kaXJlY3RFZGl0QWZmZWN0c0NsYXNzVG9vbHRpcCk7Ci0JCWFkZEZpZWxkKGRpcmVjdEVkaXRBZmZlY3RzQ2xhc3MpOwkJCi0JCWVudGl0eUFjY2Vzc1R5cGVDaG9vc2VyID0gbmV3IFJhZGlvR3JvdXBGaWVsZEVkaXRvcigKLQkJCQlKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfRU5USVRZX0FDQ0VTU19UWVBFLAotCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9lbnRpdHlBY2Nlc3NUeXBlQnV0dG9uR3JvdXBMYWJlbCwKLQkJCQkxLAotCQkJICAgIG5ldyBTdHJpbmdbXVtdIHsKLQkJCQkJe0pQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9lbnRpdHlGaWVsZEJhc2VkQWNjZXNzQnV0dG9uTGFiZWwsIEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfQUNDRVNTX0ZJRUxEX0JBU0VEfSwKLQkJCQkJe0pQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9lbnRpdHlQcm9wZXJ0eUJhc2VkQWNjZXNzQnV0dG9uTGFiZWwsIEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfQUNDRVNTX1BST1BFUlRZX0JBU0VEfX0sCQkJCQotCQkJCQlwYXJlbnQsIHRydWUpOwotCQllbnRpdHlBY2Nlc3NUeXBlQ2hvb3Nlci5zZXRQcmVmZXJlbmNlU3RvcmUoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQllbnRpdHlBY2Nlc3NUeXBlQ2hvb3Nlci5nZXRSYWRpb0JveENvbnRyb2wocGFyZW50KS5zZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW50aXR5QWNjZXNzVHlwZUJ1dHRvbkdyb3VwVG9vbHRpcCk7Ci0JCWFkZEZpZWxkKGVudGl0eUFjY2Vzc1R5cGVDaG9vc2VyKTsKLQkJCi0JCQotCQkKLQkJZGVmYXVsdENvbGxlY3Rpb25UeXBlQ2hvb3NlciA9IG5ldyBSYWRpb0dyb3VwRmllbGRFZGl0b3IoCi0JCQkJSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX0RFRkFVTFRfQ09MTEVDVElPTl9UWVBFLAotCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0Q29sbGVjdGlvblR5cGVTZWN0aW9uVGl0dGxlLAotCQkJCTEsCi0JCQkgICAgbmV3IFN0cmluZ1tdW10gewotCQkJCQl7Q09MTEVDVElJT05fVFlQRSwgSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9DT0xMRUNUSU9OX1RZUEV9LAotCQkJCQl7TElTVF9UWVBFLCBKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX0xJU1RfVFlQRX0sCQkKLQkJCQkJe1NFVF9UWVBFLCBKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX1NFVF9UWVBFfSwKLQkJCQkJe01BUF9UWVBFLCBKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX01BUF9UWVBFfX0sCi0JCQkJCXBhcmVudCwgdHJ1ZSk7Ci0JCWRlZmF1bHRDb2xsZWN0aW9uVHlwZUNob29zZXIuc2V0UHJlZmVyZW5jZVN0b3JlKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJZGVmYXVsdENvbGxlY3Rpb25UeXBlQ2hvb3Nlci5nZXRSYWRpb0JveENvbnRyb2wocGFyZW50KS5zZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdENvbGxlY3Rpb25UeXBlU2VjdGlvbkRlc2NyaXB0aW9uKTsKLQkJYWRkRmllbGQoZGVmYXVsdENvbGxlY3Rpb25UeXBlQ2hvb3Nlcik7Ci0JCQotCQlvbmVUb01hbnlPbGRTdHlsZSA9IG5ldyBKUEFCb29sZWFuRmllbGRFZGl0b3IoIiIsCS8vJE5PTi1OTFMtMSQgCi0JCQkJSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX29uZVRvTWFueU9sZFN0eWxlLCAKLQkJCQlCb29sZWFuRmllbGRFZGl0b3IuREVGQVVMVCwgcGFyZW50KTsKLQkJb25lVG9NYW55T2xkU3R5bGUuc2V0UHJlZmVyZW5jZU5hbWUoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX09ORV9UT19NQU5ZX09MRF9TVFlMRSk7Ci0JCW9uZVRvTWFueU9sZFN0eWxlLmdldENoZWNrQm94KHBhcmVudCkuc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX29uZVRvTWFueU9sZFN0eWxlVG9vbHRpcCk7Ci0JCWFkZEZpZWxkKG9uZVRvTWFueU9sZFN0eWxlKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb2xkZXJGaWVsZChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZEZWZhdWx0RGlhZ3JhbUZvbGRlckZpZWxkID0gbmV3IEN1c3RvbVN0cmluZ0ZpZWxkRWRpdG9yKAotCQkJCUpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9ESUFHUkFNX0ZPTERFUiwKLQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZGVmYXVsdEZvbGRlckNvbnRyb2xMYWJlbCwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSkgewotCQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVZhbHVlKCkgewotCQkJCQkJcmV0dXJuIHZhbGlkYXRlRGVmYXVsdEZvbGRlcihJUGF0aC5TRVBBUkFUT1IgKyBGSUNUSVZFX1BST0pFQ1RfTkFNRSArIElQYXRoLlNFUEFSQVRPUgotCQkJCQkJCQkJCQkJCSArIGZEZWZhdWx0RGlhZ3JhbUZvbGRlckZpZWxkLmdldFN0cmluZ1ZhbHVlKCkudHJpbSgpLCBGSUNUSVZFX1BST0pFQ1RfTkFNRSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCQotCQlmRGVmYXVsdERpYWdyYW1Gb2xkZXJGaWVsZC5nZXRUZXh0Q29udHJvbChwYXJlbnQpLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXZhbGlkYXRlUGFnZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWZEZWZhdWx0RGlhZ3JhbUZvbGRlckZpZWxkLmdldExhYmVsQ29udHJvbChwYXJlbnQpLgotCQlzZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZGVmYXVsdEZvbGRlckNvbnRyb2xUb29sdGlwKTsKLQkJYWRkRmllbGQoZkRlZmF1bHREaWFncmFtRm9sZGVyRmllbGQpOwotCQkKLQkJCi0JCWZEZWZhdWx0RW50aXR5UGFja2FnZUZpZWxkID0gbmV3IEN1c3RvbVN0cmluZ0ZpZWxkRWRpdG9yKAotCQkJCUpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9FTlRJVFlfUEFDS0FHRSwKLQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdFBhY2thZ2VUb1VzZSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSkgewotCQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVZhbHVlKCkgewotCQkJCQkJcmV0dXJuIHZhbGlkYXRlRGVmYXVsdFBhY2thZ2UoZkRlZmF1bHRFbnRpdHlQYWNrYWdlRmllbGQuZ2V0U3RyaW5nVmFsdWUoKS50cmltKCkpOwotCQkJCQl9CQotCQkJCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVudGl0eVBhY2thZ2VGaWVsZChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZEZWZhdWx0RW50aXR5UGFja2FnZUZpZWxkLmdldFRleHRDb250cm9sKHBhcmVudCkuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJdmFsaWRhdGVQYWdlKCk7Ci0JCQl9Ci0JCX0pOwotCQkJCi0JCWZEZWZhdWx0RW50aXR5UGFja2FnZUZpZWxkLmdldExhYmVsQ29udHJvbChwYXJlbnQpLgotCQkJCXNldFRvb2xUaXBUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0UGFja2FnZU1zZyk7Ci0JCWFkZEZpZWxkKGZEZWZhdWx0RW50aXR5UGFja2FnZUZpZWxkKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWJsZU5hbWVGaWVsZChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZEZWZhdWx0VGFibGVOYW1lUHJlZml4ID0gbmV3IEN1c3RvbVN0cmluZ0ZpZWxkRWRpdG9yKAotCQkJCUpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9UQUJMRV9OQU1FX1BSRUZJWCwKLQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdFRhYmxlTmFtZUxhYmVsLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKSB7Ci0JCQkJCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlVmFsdWUoKSB7Ci0JCQkJCQlyZXR1cm4gdmFsaWRhdGVUYWJsZU5hbWVQcmVmaXgoZkRlZmF1bHRUYWJsZU5hbWVQcmVmaXguZ2V0U3RyaW5nVmFsdWUoKS50cmltKCkpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlmRGVmYXVsdFRhYmxlTmFtZVByZWZpeC5nZXRUZXh0Q29udHJvbChwYXJlbnQpLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXZhbGlkYXRlUGFnZSgpOwotCQkJfQotCQl9KTsKLQkJCQkKLQkJZkRlZmF1bHRUYWJsZU5hbWVQcmVmaXguZ2V0TGFiZWxDb250cm9sKHBhcmVudCkuCi0JCQkJc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRUYWJsZU5hbWVQcmVmaXhNc2cpOwotCQlhZGRGaWVsZChmRGVmYXVsdFRhYmxlTmFtZVByZWZpeCk7Ci0JCQotCQkKLQkJCi0JCWZEZWZhdWx0VGFibGVOYW1lUHJlZml4LmdldFRleHRDb250cm9sKHBhcmVudCkuCi0JCQkJc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRUYWJsZU5hbWVQcmVmaXhNc2cpOwkJCi0JfQotCQotCQotCQotCQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZURlZmF1bHRGb2xkZXIoU3RyaW5nIGRlZmF1bHRGb2xkZXIsIFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQlkZWZhdWx0Rm9sZGVyID0gZGVmYXVsdEZvbGRlci50cmltKCk7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGRlZmF1bHRGb2xkZXIpKSAKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIAotCQkJCQkgIEpQQURpYWdyYW1FZGl0b3JQbHVnaW4uUExVR0lOX0lELCAKLQkJCQkJICBKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW1wdHlGb2xkZXIpOwotCQlkZWZhdWx0Rm9sZGVyID0gSVBhdGguU0VQQVJBVE9SICsgcHJvamVjdE5hbWUgKyBJUGF0aC5TRVBBUkFUT1IgKyBkZWZhdWx0Rm9sZGVyOyAKLQkJaWYgKCFkZWZhdWx0Rm9sZGVyLnN0YXJ0c1dpdGgoSVBhdGguU0VQQVJBVE9SICsgcHJvamVjdE5hbWUgKyBJUGF0aC5TRVBBUkFUT1IpKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgCi0JCQkJCQkJICBKUEFEaWFncmFtRWRpdG9yUGx1Z2luLlBMVUdJTl9JRCwgCi0JCQkJCQkJICBNZXNzYWdlRm9ybWF0LmZvcm1hdChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfaW52YWxpZEZvbGRlciwgCi0JCQkJCQkJCQkgIAkJCSAgIElQYXRoLlNFUEFSQVRPUiArIHByb2plY3ROYW1lICsgSVBhdGguU0VQQVJBVE9SKSk7Ci0JCUlTdGF0dXMgcmVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlUGF0aChkZWZhdWx0Rm9sZGVyLCBJUmVzb3VyY2UuRk9MREVSKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZURlZmF1bHRQYWNrYWdlKFN0cmluZyBkZWZhdWx0UGFja2FnZSkgewotCQlJU3RhdHVzIHZhbGlkYXRlRGVmYXVsdFBhY2thZ2VTdGF0dXMgPSBKYXZhQ29udmVudGlvbnMKLQkJCQkudmFsaWRhdGVQYWNrYWdlTmFtZShkZWZhdWx0UGFja2FnZSwgSmF2YUNvcmUuVkVSU0lPTl8xXzUsCi0JCQkJCQlKYXZhQ29yZS5WRVJTSU9OXzFfNSk7Ci0JCWlmICh2YWxpZGF0ZURlZmF1bHRQYWNrYWdlU3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5PSykgCi0JCQlyZXR1cm4gdmFsaWRhdGVEZWZhdWx0UGFja2FnZVN0YXR1czsgCi0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEpQQURpYWdyYW1FZGl0b3IuSUQsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVUYWJsZU5hbWVQcmVmaXgoU3RyaW5nIHRhYmxlTmFtZVByZWZpeCkgewotCQlTdHJpbmcgcyA9IHRhYmxlTmFtZVByZWZpeDsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkocykpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKUEFEaWFncmFtRWRpdG9yLklELCBudWxsKTsKLQkJaWYgKENoYXJhY3Rlci5pc0RpZ2l0KHMuY2hhckF0KDApKSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfaW52YWxpZFRhYmxlTmFtZVByZWZpeCwgCi0JCQkJCXRhYmxlTmFtZVByZWZpeCk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKUEFEaWFncmFtRWRpdG9yLklELCBtZXNzYWdlKTsJCQkJCQkKLQkJfQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQljaGFyIGNoID0gcy5jaGFyQXQoaSk7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoY2gpICYmIChjaCAhPSAnXycpKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfaW52YWxpZFRhYmxlTmFtZVByZWZpeCwgCi0JCQkJCQl0YWJsZU5hbWVQcmVmaXgpOwotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpQQURpYWdyYW1FZGl0b3IuSUQsIG1lc3NhZ2UpOwkJCQkJCQotCQkJfQkKLQkJfQotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKUEFEaWFncmFtRWRpdG9yLklELCBudWxsKTsJCi0JfQkKLQkKLQlwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ3VzdG9tU3RyaW5nRmllbGRFZGl0b3IgZXh0ZW5kcyBTdHJpbmdGaWVsZEVkaXRvciB7Ci0JCXB1YmxpYyBDdXN0b21TdHJpbmdGaWVsZEVkaXRvcihTdHJpbmcgcHJvcGVydHlOYW1lLAotCQkJCQkJCQkJICAgU3RyaW5nIGxhYmVsTmFtZSwKLQkJCQkJCQkJCSAgIENvbXBvc2l0ZSBmaWVsZEVkaXRvclBhcmVudCkgewotCQkJCi0JCQlzdXBlcihwcm9wZXJ0eU5hbWUsIGxhYmVsTmFtZSwgZmllbGRFZGl0b3JQYXJlbnQpOwotCQl9Ci0JCQotCQlTdHJpbmcgbXNnOwotCQlTdHJpbmcgcHJlZml4TXNnOwotCQkKLQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tTdGF0ZSgpIHsKLQkJCUlTdGF0dXMgc3RhdCA9IHZhbGlkYXRlVmFsdWUoKTsKLQkJCWlmIChzdGF0LmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChzdGF0LmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsJCQkKLQkJfQotCQkKLQkJcHJvdGVjdGVkIGJvb2xlYW4gZG9DaGVja1N0YXRlKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0JCi0JCQkJCi0JCWFic3RyYWN0IHByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlVmFsdWUoKTsKLQl9Ci0JCi0JCi0JcHVibGljIGNsYXNzIEpQQUJvb2xlYW5GaWVsZEVkaXRvciBleHRlbmRzIEJvb2xlYW5GaWVsZEVkaXRvciB7Ci0JCXB1YmxpYyBKUEFCb29sZWFuRmllbGRFZGl0b3IoU3RyaW5nIG5hbWUsIFN0cmluZyBsYWJlbFRleHQsIGludCBzdHlsZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIobmFtZSwgbGFiZWxUZXh0LCBzdHlsZSwgcGFyZW50KTsKLQkJfQotCQkJCQotCQlwdWJsaWMgQnV0dG9uIGdldENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXJldHVybiBnZXRDaGFuZ2VDb250cm9sKHBhcmVudCk7Ci0JCX0JCQotCX0KLQkKLSAgICBzeW5jaHJvbml6ZWQgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQYWdlKCkgewotICAgIAkKLSAgICAJSVN0YXR1cyBzdGF0Rm9sZGVyID0gSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlLgotICAgIAkJCQkJCQl2YWxpZGF0ZURlZmF1bHRGb2xkZXIoZkRlZmF1bHREaWFncmFtRm9sZGVyRmllbGQuZ2V0VGV4dENvbnRyb2woZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSkuZ2V0VGV4dCgpLnRyaW0oKSwgCi0gICAgCQkJCQkJCUZJQ1RJVkVfUFJPSkVDVF9OQU1FKTsKLSAgICAJSVN0YXR1cyBzdGF0UGFjayA9IEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZS4KLSAgICAJCQkJCQkJdmFsaWRhdGVEZWZhdWx0UGFja2FnZShmRGVmYXVsdEVudGl0eVBhY2thZ2VGaWVsZC5nZXRUZXh0Q29udHJvbChnZXRGaWVsZEVkaXRvclBhcmVudCgpKS5nZXRUZXh0KCkudHJpbSgpKTsKLSAgICAJCi0gICAgCUlTdGF0dXMgc3RhdFByZWYgPSBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UuCi0gICAgCQkJCQkJCXZhbGlkYXRlVGFibGVOYW1lUHJlZml4KGZEZWZhdWx0VGFibGVOYW1lUHJlZml4LmdldFRleHRDb250cm9sKGdldEZpZWxkRWRpdG9yUGFyZW50KCkpLmdldFRleHQoKS50cmltKCkpOwotICAgIAkKLSAgICAJaWYgKHN0YXRGb2xkZXIuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0gICAgCQlzZXRFcnJvck1lc3NhZ2Uoc3RhdEZvbGRlci5nZXRNZXNzYWdlKCkpOwotICAgIAkJc2V0VmFsaWQoZmFsc2UpOwotICAgIAkJcmV0dXJuOwotICAgIAl9ICAgIAkgICAgCQotICAgIAlpZiAoc3RhdFBhY2suZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0gICAgCQlzZXRFcnJvck1lc3NhZ2Uoc3RhdFBhY2suZ2V0TWVzc2FnZSgpKTsKLSAgICAJCXNldFZhbGlkKGZhbHNlKTsKLSAgICAJCXJldHVybjsKLSAgICAJfSAKLSAgICAJaWYgKHN0YXRQcmVmLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotICAgIAkJc2V0RXJyb3JNZXNzYWdlKHN0YXRQcmVmLmdldE1lc3NhZ2UoKSk7Ci0gICAgCQlzZXRWYWxpZChmYWxzZSk7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgIAlzZXRWYWxpZCh0cnVlKTsKLSAgICAJaWYgKHN0YXRQYWNrLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7ICAgCQkKLSAgICAJCXNldE1lc3NhZ2Uoc3RhdFBhY2suZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgCWlmIChzdGF0UHJlZi5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykgeyAgIAkJCi0gICAgCQlzZXRNZXNzYWdlKHN0YXRQcmVmLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLSAgICAJCXJldHVybjsKLSAgICAJfQotICAgIAlzZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0gICAgfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS9KUEFEaWFncmFtUHJvcGVydHlQYWdlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL0pQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmMGJlZS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL0pQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBKUEFEaWFncmFtUHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX1NFVFRJTkdTX1BBVEggPSAiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aSI7CS8vJE5PTi1OTFMtMSQ7Ci0JcHJvdGVjdGVkIElQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCXByb3RlY3RlZCBib29sZWFuIGlzSlBBMTBQcm9qZWN0ID0gZmFsc2U7CQkJCS8vJE5PTi1OTFMtMSQ7Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGVkaXRvclByb3BzOwotCQotCXByaXZhdGUgVGV4dCB0eHREZWZhdWx0Rm9sZGVyRmllbGQ7Ci0JcHJpdmF0ZSBUZXh0IHR4dERlZmF1bHRFbnRpdHlQYWNrYWdlRmllbGQ7Ci0JcHJpdmF0ZSBUZXh0IHR4dERlZmF1bHRUYWJsZU5hbWVQcmVmaXg7Ci0JcHJpdmF0ZSBCdXR0b24gY2hlY2tEaXJlY3RFZGl0QWZmZWN0c0NsYXNzOwotCXByaXZhdGUgR3JvdXAgZ3JvdXBBY2Nlc3NUeXBlOwotCXByaXZhdGUgR3JvdXAgZ3JvdXBDb2xsZWN0aW9uVHlwZTsKLQlwcml2YXRlIEJ1dHRvbiBidG5GaWVsZEJhc2VkQWNjZXNzOwotCXByaXZhdGUgQnV0dG9uIGJ0blByb3BlcnR5QmFzZWRBY2Nlc3M7Ci0JcHJpdmF0ZSBCdXR0b24gYnRuQ29sbGVjdGlvblR5cGU7Ci0JcHJpdmF0ZSBCdXR0b24gYnRuTGlzdFR5cGU7Ci0JcHJpdmF0ZSBCdXR0b24gYnRuU2V0VHlwZTsKLQlwcml2YXRlIEJ1dHRvbiBidG5NYXBUeXBlOwotCXByaXZhdGUgQnV0dG9uIGNoZWNrT25lVG9NYW55T2xkU3R5bGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHJvcHNNb2RpZmllZCA9IGZhbHNlOwotCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFFVQUxJRklFUiAJCQkJCQkJCT0gIm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpIjsJCQkJCQkvLyROT04tTkxTLTEkCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBRdWFsaWZpZWROYW1lIFBST1BfREVGQVVMVF9ESUFHUkFNX0ZPTERFUgkJPSBuZXcgUXVhbGlmaWVkTmFtZShRVUFMSUZJRVIsICJkaWFncmFtRm9sZGVyIik7CQkJLy8kTk9OLU5MUy0xJDsJCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBRdWFsaWZpZWROYW1lIFBST1BfREVGQVVMVF9QQUNLQUdFIAkJCQk9IG5ldyBRdWFsaWZpZWROYW1lKFFVQUxJRklFUiwgImRlZmF1bHRQYWNrYWdlIik7CQkJLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwdWJsaWMgZmluYWwgUXVhbGlmaWVkTmFtZSBQUk9QX0RFRkFVTFRfVEFCTEVfTkFNRV9QUkVGSVggCT0gbmV3IFF1YWxpZmllZE5hbWUoUVVBTElGSUVSLCAiZGVmYXVsdFRhYmxlTmFtZVByZWZpeCIpOwkvLyROT04tTkxTLTEkOwotCXN0YXRpYyBwdWJsaWMgZmluYWwgUXVhbGlmaWVkTmFtZSBQUk9QX0RJUkVDVF9FRElUX0FGRkVDVFNfQ0xBU1MgCT0gbmV3IFF1YWxpZmllZE5hbWUoUVVBTElGSUVSLCAiZGlyZWN0RWRpdEFmZmVjdHNDbGFzcyIpOwkvLyROT04tTkxTLTEkOwotCXN0YXRpYyBwdWJsaWMgZmluYWwgUXVhbGlmaWVkTmFtZSBQUk9QX0FDQ0VTU19UWVBFIAkJCQkJPSBuZXcgUXVhbGlmaWVkTmFtZShRVUFMSUZJRVIsICJhY2Nlc3NUeXBlIik7CQkJCS8vJE5PTi1OTFMtMSQ7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBRdWFsaWZpZWROYW1lIFBST1BfQ09MTEVDVElPTl9UWVBFIAkJCQk9IG5ldyBRdWFsaWZpZWROYW1lKFFVQUxJRklFUiwgImNvbGxlY3Rpb25UeXBlIik7CQkJLy8kTk9OLU5MUy0xJDsKLQlzdGF0aWMgcHVibGljIGZpbmFsIFF1YWxpZmllZE5hbWUgUFJPUF9PTkVfVE9fTUFOWV9PTERfU1RZTEUJCT0gbmV3IFF1YWxpZmllZE5hbWUoUVVBTElGSUVSLCAib25lVG9NYW55T2xkU3R5bGUiKTsJCS8vJE5PTi1OTFMtMSQ7Ci0JCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xMRUNUSU9OX1RZUEUgPSAiamF2YS51dGlsLkNvbGxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVF9UWVBFID0gImphdmEudXRpbC5MaXN0IjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9UWVBFID0gImphdmEudXRpbC5TZXQiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQX1RZUEUgPSAiamF2YS51dGlsLk1hcCI7IC8vJE5PTi1OTFMtMSQKLQotCQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEpQQURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlQ29udGFpbmVyKHBhcmVudCk7Ci0JCXByb2plY3QgPSAoSVByb2plY3QpZ2V0RWxlbWVudCgpLmdldEFkYXB0ZXIoSVByb2plY3QuY2xhc3MpOwotCQlpc0pQQTEwUHJvamVjdCA9IEpQQUVkaXRvclV0aWwuY2hlY2tKUEFGYWNldFZlcnNpb24ocHJvamVjdCwgIjEuMCIpOwkJCQkvLyROT04tTkxTLTEkOwkJCi0JCWxvYWRQcm9wZXJ0aWVzKCk7Ci0JCWNyZWF0ZURlZmF1bHRGb2xkZXJDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZURlZmF1bHRQYWNrYWdlQ29udHJvbChjb21wb3NpdGUpOwotCQljcmVhdGVEZWZhdWx0VGFibGVOYW1lUHJlZml4Q29udHJvbChjb21wb3NpdGUpOwotCQljcmVhdGVEaXJlY3RFZGl0QWZmZWN0c0NsYXNzQ29udHJvbChjb21wb3NpdGUpOwotCQljcmVhdGVBY2Nlc3NUeXBlQ29udHJvbChjb21wb3NpdGUpOwotCQljcmVhdGVEZWZhdWx0Q29sbGVjdGlvblR5cGVDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCWlmICghaXNKUEExMFByb2plY3QpCi0JCQljcmVhdGVPbmVUb01hbnlPbGRTdHlsZUNvbnRyb2woY29tcG9zaXRlKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQl2YWxpZGF0ZVBhZ2UoKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsJCQotCX0KLQkKLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGVDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewkKLQkJZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZT0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ2wubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRGb2xkZXJDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJTGFiZWwgbGJsRGVmYXVsdEZvbGRlciA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5GSUxMKTsgCi0JCWxibERlZmF1bHRGb2xkZXIuc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZGVmYXVsdEZvbGRlckNvbnRyb2xMYWJlbCk7Ci0JCWxibERlZmF1bHRGb2xkZXIuc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2RlZmF1bHRGb2xkZXJDb250cm9sVG9vbHRpcCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWxibERlZmF1bHRGb2xkZXIuc2V0TGF5b3V0RGF0YShnZCk7CQotCQl0eHREZWZhdWx0Rm9sZGVyRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5GTEFUIHwgU1dULkJPUkRFUiB8IFNXVC5GSUxMKTsKLQkJbGJsRGVmYXVsdEZvbGRlci5zZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZGVmYXVsdEZvbGRlckNvbnRyb2xUb29sdGlwKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXR4dERlZmF1bHRGb2xkZXJGaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JICAgIFN0cmluZyBkZWZhdWx0Rm9sZGVyID0gZWRpdG9yUHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9ERUZBVUxUX0RJQUdSQU1fRk9MREVSLmdldExvY2FsTmFtZSgpKTsKLQkgICAgdHh0RGVmYXVsdEZvbGRlckZpZWxkLnNldFRleHQoZGVmYXVsdEZvbGRlcik7Ci0JICAgIHR4dERlZmF1bHRGb2xkZXJGaWVsZC5zZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZGVmYXVsdEZvbGRlckNvbnRyb2xUb29sdGlwKTsKLQkgICAgdHh0RGVmYXVsdEZvbGRlckZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXZhbGlkYXRlUGFnZSgpOwotCQkJCXByb3BzTW9kaWZpZWQgPSB0cnVlOwotCQkJfQkJCQotCQl9KTsKLQl9Ci0JCi0JCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0UGFja2FnZUNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlMYWJlbCBsYmxEZWZhdWx0UGFja2FnZSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5GSUxMKTsgCi0JCWxibERlZmF1bHRQYWNrYWdlLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRQYWNrYWdlVG9Vc2UpOwotCQlsYmxEZWZhdWx0UGFja2FnZS5zZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdFBhY2thZ2VNc2cpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlsYmxEZWZhdWx0UGFja2FnZS5zZXRMYXlvdXREYXRhKGdkKTsJCi0JCXR4dERlZmF1bHRFbnRpdHlQYWNrYWdlRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5GTEFUIHwgU1dULkJPUkRFUiB8IFNXVC5GSUxMKTsKLQkJbGJsRGVmYXVsdFBhY2thZ2Uuc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRQYWNrYWdlTXNnKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXR4dERlZmF1bHRFbnRpdHlQYWNrYWdlRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCSAgICBTdHJpbmcgZGVmYXVsdFBhY2thZ2VOYW1lID0gZWRpdG9yUHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9ERUZBVUxUX1BBQ0tBR0UuZ2V0TG9jYWxOYW1lKCkpOwotCQl0eHREZWZhdWx0RW50aXR5UGFja2FnZUZpZWxkLnNldFRleHQoZGVmYXVsdFBhY2thZ2VOYW1lKTsKLQkJdHh0RGVmYXVsdEVudGl0eVBhY2thZ2VGaWVsZC5zZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdFBhY2thZ2VNc2cpOwotCQl0eHREZWZhdWx0RW50aXR5UGFja2FnZUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXZhbGlkYXRlUGFnZSgpOwotCQkJCXByb3BzTW9kaWZpZWQgPSB0cnVlOwotCQkJfQkJCQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRUYWJsZU5hbWVQcmVmaXhDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJTGFiZWwgbGJsRGVmYXVsdFRhYmxlTmFtZVByZml4ID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkZJTEwpOyAKLQkJbGJsRGVmYXVsdFRhYmxlTmFtZVByZml4LnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRUYWJsZU5hbWVMYWJlbCk7Ci0JCWxibERlZmF1bHRUYWJsZU5hbWVQcmZpeC5zZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdFRhYmxlTmFtZVByZWZpeE1zZyk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWxibERlZmF1bHRUYWJsZU5hbWVQcmZpeC5zZXRMYXlvdXREYXRhKGdkKTsJCi0JCXR4dERlZmF1bHRUYWJsZU5hbWVQcmVmaXggPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5GTEFUIHwgU1dULkJPUkRFUik7Ci0JCWxibERlZmF1bHRUYWJsZU5hbWVQcmZpeC5zZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdFRhYmxlTmFtZVByZWZpeE1zZyk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0eHREZWZhdWx0VGFibGVOYW1lUHJlZml4LnNldExheW91dERhdGEoZ2QpOwotCQkKLQkgICAgU3RyaW5nIGRlZmF1bHRUYWJsZU5hbWVQcmVmaXggPSAgZWRpdG9yUHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9ERUZBVUxUX1RBQkxFX05BTUVfUFJFRklYLmdldExvY2FsTmFtZSgpKTsKLQkJdHh0RGVmYXVsdFRhYmxlTmFtZVByZWZpeC5zZXRUZXh0KGRlZmF1bHRUYWJsZU5hbWVQcmVmaXgpOwkKLQkJdHh0RGVmYXVsdFRhYmxlTmFtZVByZWZpeC5zZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdFRhYmxlTmFtZVByZWZpeE1zZyk7Ci0JCXR4dERlZmF1bHRUYWJsZU5hbWVQcmVmaXguYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJdmFsaWRhdGVQYWdlKCk7Ci0JCQkJcHJvcHNNb2RpZmllZCA9IHRydWU7Ci0JCQl9CQkJCi0JCX0pOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEaXJlY3RFZGl0QWZmZWN0c0NsYXNzQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWNoZWNrRGlyZWN0RWRpdEFmZmVjdHNDbGFzcyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuRkxBVCB8IFNXVC5DSEVDSyk7Ci0JCWNoZWNrRGlyZWN0RWRpdEFmZmVjdHNDbGFzcy5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9kaXJlY3RFZGl0QWZmZWN0c0NsYXNzKTsKLQkJY2hlY2tEaXJlY3RFZGl0QWZmZWN0c0NsYXNzLnNldFRvb2xUaXBUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9kaXJlY3RFZGl0QWZmZWN0c0NsYXNzVG9vbHRpcCk7Ci0JCWNoZWNrRGlyZWN0RWRpdEFmZmVjdHNDbGFzcy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgZmFsc2UsIGZhbHNlLCAyLCAxKSk7Ci0JCQotCQlib29sZWFuIGRlZmF1bHREaXJlY3RFZGl0QWZmZWN0c0NsYXNzID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oZWRpdG9yUHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9ESVJFQ1RfRURJVF9BRkZFQ1RTX0NMQVNTLmdldExvY2FsTmFtZSgpKSk7Ci0JCWNoZWNrRGlyZWN0RWRpdEFmZmVjdHNDbGFzcy5zZXRTZWxlY3Rpb24oZGVmYXVsdERpcmVjdEVkaXRBZmZlY3RzQ2xhc3MpOwotCQljaGVja0RpcmVjdEVkaXRBZmZlY3RzQ2xhc3MuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXByb3BzTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CQkJCi0JCX0pOwkJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlT25lVG9NYW55T2xkU3R5bGVDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJY2hlY2tPbmVUb01hbnlPbGRTdHlsZSA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuRkxBVCB8IFNXVC5DSEVDSyk7Ci0JCWNoZWNrT25lVG9NYW55T2xkU3R5bGUuc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcm9wZXJ0eVBhZ2Vfb25lVG9NYW55T2xkU3R5bGUpOwotCQljaGVja09uZVRvTWFueU9sZFN0eWxlLnNldFRvb2xUaXBUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByb3BlcnR5UGFnZV9vbmVUb01hbnlPbGRTdHlsZVRvb2x0aXApOwotCQljaGVja09uZVRvTWFueU9sZFN0eWxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuVE9QLCBmYWxzZSwgZmFsc2UsIDIsIDEpKTsKLQkJCi0JCWJvb2xlYW4gZGVmYXVsdERpcmVjdEVkaXRBZmZlY3RzQ2xhc3MgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihlZGl0b3JQcm9wcy5nZXRQcm9wZXJ0eShQUk9QX09ORV9UT19NQU5ZX09MRF9TVFlMRS5nZXRMb2NhbE5hbWUoKSkpOwotCQljaGVja09uZVRvTWFueU9sZFN0eWxlLnNldFNlbGVjdGlvbihkZWZhdWx0RGlyZWN0RWRpdEFmZmVjdHNDbGFzcyk7Ci0JCWNoZWNrT25lVG9NYW55T2xkU3R5bGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXByb3BzTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CQkJCi0JCX0pOwkJCQotCX0KLQkKLQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdENvbGxlY3Rpb25UeXBlQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWdyb3VwQ29sbGVjdGlvblR5cGUgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCAwKTsKLQkJZ3JvdXBDb2xsZWN0aW9uVHlwZS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0Q29sbGVjdGlvblR5cGVTZWN0aW9uVGl0dGxlKTsKLQkJZ3JvdXBDb2xsZWN0aW9uVHlwZS5zZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdENvbGxlY3Rpb25UeXBlU2VjdGlvbkRlc2NyaXB0aW9uKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ3JvdXBDb2xsZWN0aW9uVHlwZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCUdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotCQlnbC5udW1Db2x1bW5zID0gMTsKLQkJZ3JvdXBDb2xsZWN0aW9uVHlwZS5zZXRMYXlvdXQoZ2wpOwotCQkKLQkJU3RyaW5nIGRlZmF1bHRDb2xsZWN0aW9uVHlwZSA9IGVkaXRvclByb3BzLmdldFByb3BlcnR5KFBST1BfQ09MTEVDVElPTl9UWVBFLmdldExvY2FsTmFtZSgpKTsKLQkJCi0JCWNyZWF0ZUNvbGxlY3Rpb25UeXBlQnV0dG9uKGNvbXBvc2l0ZSwgZ2QsIGRlZmF1bHRDb2xsZWN0aW9uVHlwZSk7Ci0JCWNyZWF0ZUxpc3RUeXBlQnV0dG9uKGNvbXBvc2l0ZSwgZ2QsIGRlZmF1bHRDb2xsZWN0aW9uVHlwZSk7Ci0JCWNyZWF0ZVNldFR5cGVCdXR0b24oY29tcG9zaXRlLCBnZCwgZGVmYXVsdENvbGxlY3Rpb25UeXBlKTsKLQkJY3JlYXRlTWFwVHlwZUJ1dHRvbihjb21wb3NpdGUsIGdkLCBkZWZhdWx0Q29sbGVjdGlvblR5cGUpOwotCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVBY2Nlc3NUeXBlQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWdyb3VwQWNjZXNzVHlwZSA9IG5ldyBHcm91cChjb21wb3NpdGUsIDApOwotCQlncm91cEFjY2Vzc1R5cGUuc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW50aXR5QWNjZXNzVHlwZUJ1dHRvbkdyb3VwTGFiZWwpOwotCQlncm91cEFjY2Vzc1R5cGUuc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2VudGl0eUFjY2Vzc1R5cGVCdXR0b25Hcm91cFRvb2x0aXApOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlncm91cEFjY2Vzc1R5cGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ2wubnVtQ29sdW1ucyA9IDE7Ci0JCWdyb3VwQWNjZXNzVHlwZS5zZXRMYXlvdXQoZ2wpOwotCQkKLQkJU3RyaW5nIGRlZmF1bHRBY2Nlc3NUeXBlID0gZWRpdG9yUHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9BQ0NFU1NfVFlQRS5nZXRMb2NhbE5hbWUoKSk7Ci0JCQotCQljcmVhdGVGaWVsZEFjY2Vzc0J1dHRvbihjb21wb3NpdGUsIGdkLCBkZWZhdWx0QWNjZXNzVHlwZSk7Ci0JCWNyZWF0ZVByb3BlcnR5QWNjZXNzQnV0dG9uKGNvbXBvc2l0ZSwgZ2QsIGRlZmF1bHRBY2Nlc3NUeXBlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbGxlY3Rpb25UeXBlQnV0dG9uKENvbXBvc2l0ZSBjb21wb3NpdGUsIEdyaWREYXRhIGdkLCBTdHJpbmcgZGVmYXVsdENvbGxlY3Rpb25UeXBlKSB7Ci0JCWJ0bkNvbGxlY3Rpb25UeXBlID0gbmV3IEJ1dHRvbihncm91cENvbGxlY3Rpb25UeXBlLCBTV1QuUkFESU8gfCBTV1QuRkxBVCk7Ci0JCWJ0bkNvbGxlY3Rpb25UeXBlLnNldFRleHQoQ09MTEVDVElPTl9UWVBFKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJYnRuQ29sbGVjdGlvblR5cGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWJ0bkNvbGxlY3Rpb25UeXBlLnNldFNlbGVjdGlvbihkZWZhdWx0Q29sbGVjdGlvblR5cGUuZXF1YWxzKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfQ09MTEVDVElPTl9UWVBFKSk7Ci0JCWJ0bkNvbGxlY3Rpb25UeXBlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwcm9wc01vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQkJCQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUxpc3RUeXBlQnV0dG9uKENvbXBvc2l0ZSBjb21wb3NpdGUsIEdyaWREYXRhIGdkLCBTdHJpbmcgZGVmYXVsdENvbGxlY3Rpb25UeXBlKSB7Ci0JCWJ0bkxpc3RUeXBlID0gbmV3IEJ1dHRvbihncm91cENvbGxlY3Rpb25UeXBlLCBTV1QuUkFESU8gfCBTV1QuRkxBVCk7Ci0JCWJ0bkxpc3RUeXBlLnNldFRleHQoTElTVF9UWVBFKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJYnRuTGlzdFR5cGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWJ0bkxpc3RUeXBlLnNldFNlbGVjdGlvbihkZWZhdWx0Q29sbGVjdGlvblR5cGUuZXF1YWxzKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfTElTVF9UWVBFKSk7Ci0JCWJ0bkxpc3RUeXBlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwcm9wc01vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQkJCQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNldFR5cGVCdXR0b24oQ29tcG9zaXRlIGNvbXBvc2l0ZSwgR3JpZERhdGEgZ2QsIFN0cmluZyBkZWZhdWx0Q29sbGVjdGlvblR5cGUpIHsKLQkJYnRuU2V0VHlwZSA9IG5ldyBCdXR0b24oZ3JvdXBDb2xsZWN0aW9uVHlwZSwgU1dULlJBRElPIHwgU1dULkZMQVQpOwotCQlidG5TZXRUeXBlLnNldFRleHQoU0VUX1RZUEUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlidG5TZXRUeXBlLnNldExheW91dERhdGEoZ2QpOwotCQlidG5TZXRUeXBlLnNldFNlbGVjdGlvbihkZWZhdWx0Q29sbGVjdGlvblR5cGUuZXF1YWxzKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfU0VUX1RZUEUpKTsKLQkJYnRuU2V0VHlwZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcHJvcHNNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30JCQkKLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVNYXBUeXBlQnV0dG9uKENvbXBvc2l0ZSBjb21wb3NpdGUsIEdyaWREYXRhIGdkLCBTdHJpbmcgZGVmYXVsdENvbGxlY3Rpb25UeXBlKSB7Ci0JCWJ0bk1hcFR5cGUgPSBuZXcgQnV0dG9uKGdyb3VwQ29sbGVjdGlvblR5cGUsIFNXVC5SQURJTyB8IFNXVC5GTEFUKTsKLQkJYnRuTWFwVHlwZS5zZXRUZXh0KE1BUF9UWVBFKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJYnRuTWFwVHlwZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYnRuTWFwVHlwZS5zZXRTZWxlY3Rpb24oZGVmYXVsdENvbGxlY3Rpb25UeXBlLmVxdWFscyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX01BUF9UWVBFKSk7Ci0JCWJ0bk1hcFR5cGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXByb3BzTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CQkJCi0JCX0pOwotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUZpZWxkQWNjZXNzQnV0dG9uKENvbXBvc2l0ZSBjb21wb3NpdGUsIEdyaWREYXRhIGdkLCBTdHJpbmcgZGVmYXVsdEFjY2Vzc1R5cGUpIHsKLQkJYnRuRmllbGRCYXNlZEFjY2VzcyA9IG5ldyBCdXR0b24oZ3JvdXBBY2Nlc3NUeXBlLCBTV1QuUkFESU8gfCBTV1QuRkxBVCk7Ci0JCWJ0bkZpZWxkQmFzZWRBY2Nlc3Muc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW50aXR5RmllbGRCYXNlZEFjY2Vzc0J1dHRvbkxhYmVsKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJYnRuRmllbGRCYXNlZEFjY2Vzcy5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYnRuRmllbGRCYXNlZEFjY2Vzcy5zZXRTZWxlY3Rpb24oZGVmYXVsdEFjY2Vzc1R5cGUuZXF1YWxzKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfQUNDRVNTX0ZJRUxEX0JBU0VEKSk7Ci0JCWJ0bkZpZWxkQmFzZWRBY2Nlc3MuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXByb3BzTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CQkJCi0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlUHJvcGVydHlBY2Nlc3NCdXR0b24oQ29tcG9zaXRlIGNvbXBvc2l0ZSwgR3JpZERhdGEgZ2QsIFN0cmluZyBkZWZhdWx0QWNjZXNzVHlwZSkgewotCQlidG5Qcm9wZXJ0eUJhc2VkQWNjZXNzID0gbmV3IEJ1dHRvbihncm91cEFjY2Vzc1R5cGUsIFNXVC5SQURJTyB8IFNXVC5GTEFUKTsKLQkJYnRuUHJvcGVydHlCYXNlZEFjY2Vzcy5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9lbnRpdHlQcm9wZXJ0eUJhc2VkQWNjZXNzQnV0dG9uTGFiZWwpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlidG5Qcm9wZXJ0eUJhc2VkQWNjZXNzLnNldExheW91dERhdGEoZ2QpOwkKLQkJYnRuUHJvcGVydHlCYXNlZEFjY2Vzcy5zZXRTZWxlY3Rpb24oZGVmYXVsdEFjY2Vzc1R5cGUuZXF1YWxzKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfQUNDRVNTX1BST1BFUlRZX0JBU0VEKSk7Ci0JCWJ0blByb3BlcnR5QmFzZWRBY2Nlc3MuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXByb3BzTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CQkJCi0JCX0pOwkJCi0JfQotCQotICAgIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkgICAgU3RyaW5nIGRlZmF1bHRGb2xkZXIgPSBzdG9yZS5nZXRTdHJpbmcoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX0RJQUdSQU1fRk9MREVSKTsKLQkJdHh0RGVmYXVsdEZvbGRlckZpZWxkLnNldFRleHQoZGVmYXVsdEZvbGRlcik7CQkKLQkgICAgU3RyaW5nIGRlZmF1bHRQYWNrYWdlTmFtZSA9IHN0b3JlLmdldFN0cmluZyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfRU5USVRZX1BBQ0tBR0UpOwotCQl0eHREZWZhdWx0RW50aXR5UGFja2FnZUZpZWxkLnNldFRleHQoZGVmYXVsdFBhY2thZ2VOYW1lKTsJCQotCSAgICBTdHJpbmcgZGVmYXVsdFRhYmxlTmFtZVByZWZpeCA9ICBzdG9yZS5nZXRTdHJpbmcoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1RBQkxFX05BTUVfUFJFRklYKTsKLQkJdHh0RGVmYXVsdFRhYmxlTmFtZVByZWZpeC5zZXRUZXh0KGRlZmF1bHRUYWJsZU5hbWVQcmVmaXgpOwkJICAKLQkgICAgYm9vbGVhbiBkZWZhdWx0RGlyZWN0RWRpdEFmZmVjdHNDbGFzcyA9IHN0b3JlLmdldEJvb2xlYW4oSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX0RJUkVDVF9FRElUX0NMQVNTX05BTUUpOwotCQljaGVja0RpcmVjdEVkaXRBZmZlY3RzQ2xhc3Muc2V0U2VsZWN0aW9uKGRlZmF1bHREaXJlY3RFZGl0QWZmZWN0c0NsYXNzKTsKLQkJU3RyaW5nIGRlZmF1bHRBY2Nlc3NUeXBlID0gc3RvcmUuZ2V0U3RyaW5nKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9FTlRJVFlfQUNDRVNTX1RZUEUpOwotCQlidG5GaWVsZEJhc2VkQWNjZXNzLnNldFNlbGVjdGlvbihkZWZhdWx0QWNjZXNzVHlwZS5lcXVhbHMoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9BQ0NFU1NfRklFTERfQkFTRUQpKTsKLQkJYnRuUHJvcGVydHlCYXNlZEFjY2Vzcy5zZXRTZWxlY3Rpb24oZGVmYXVsdEFjY2Vzc1R5cGUuZXF1YWxzKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfQUNDRVNTX1BST1BFUlRZX0JBU0VEKSk7CQkKLQkJU3RyaW5nIGRlZmF1bHRDb2xsZWN0aW9uVHlwZSA9IHN0b3JlLmdldFN0cmluZyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfREVGQVVMVF9DT0xMRUNUSU9OX1RZUEUpOwotCQlidG5Db2xsZWN0aW9uVHlwZS5zZXRTZWxlY3Rpb24oZGVmYXVsdENvbGxlY3Rpb25UeXBlLmVxdWFscyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX0NPTExFQ1RJT05fVFlQRSkpOwotCQlidG5MaXN0VHlwZS5zZXRTZWxlY3Rpb24oZGVmYXVsdENvbGxlY3Rpb25UeXBlLmVxdWFscyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX0xJU1RfVFlQRSkpOwkJCi0JCWJ0blNldFR5cGUuc2V0U2VsZWN0aW9uKGRlZmF1bHRDb2xsZWN0aW9uVHlwZS5lcXVhbHMoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9TRVRfVFlQRSkpOwotCQlidG5NYXBUeXBlLnNldFNlbGVjdGlvbihkZWZhdWx0Q29sbGVjdGlvblR5cGUuZXF1YWxzKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfTUFQX1RZUEUpKTsKLQkgICAgYm9vbGVhbiBkZWZhdWx0T25lVG9NYW55T2xkU3R5bGUgPSBzdG9yZS5nZXRCb29sZWFuKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9PTkVfVE9fTUFOWV9PTERfU1RZTEUpOwotCSAgICBpZiAoIWlzSlBBMTBQcm9qZWN0KQotCSAgICAJY2hlY2tPbmVUb01hbnlPbGRTdHlsZS5zZXRTZWxlY3Rpb24oZGVmYXVsdE9uZVRvTWFueU9sZFN0eWxlKTsJCQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLSAgICB9Ci0gICAgCi0gICAgc3luY2hyb25pemVkIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGFnZSgpIHsKLSAgICAJSVN0YXR1cyBzdGF0Rm9sZGVyID0gSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlLnZhbGlkYXRlRGVmYXVsdEZvbGRlcih0eHREZWZhdWx0Rm9sZGVyRmllbGQuZ2V0VGV4dCgpLnRyaW0oKSwgCi0gICAgCQkJCQkJCQkJCQkJCQkJCQkJcHJvamVjdC5nZXROYW1lKCkpOwotICAgIAlJU3RhdHVzIHN0YXRQYWNrID0gSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlLnZhbGlkYXRlRGVmYXVsdFBhY2thZ2UodHh0RGVmYXVsdEVudGl0eVBhY2thZ2VGaWVsZC5nZXRUZXh0KCkudHJpbSgpKTsKLSAgICAJSVN0YXR1cyBzdGF0UHJlZiA9IEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZS52YWxpZGF0ZVRhYmxlTmFtZVByZWZpeCh0eHREZWZhdWx0VGFibGVOYW1lUHJlZml4LmdldFRleHQoKS50cmltKCkpOwotICAgIAlpZiAoc3RhdEZvbGRlci5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLSAgICAJCXNldEVycm9yTWVzc2FnZShzdGF0Rm9sZGVyLmdldE1lc3NhZ2UoKSk7Ci0gICAgCQlzZXRWYWxpZChmYWxzZSk7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0gICAgCSAgICAJCi0gICAgCWlmIChzdGF0UGFjay5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLSAgICAJCXNldEVycm9yTWVzc2FnZShzdGF0UGFjay5nZXRNZXNzYWdlKCkpOwotICAgIAkJc2V0VmFsaWQoZmFsc2UpOwotICAgIAkJcmV0dXJuOwotICAgIAl9IAotICAgIAlpZiAoc3RhdFByZWYuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0gICAgCQlzZXRFcnJvck1lc3NhZ2Uoc3RhdFByZWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAJCXNldFZhbGlkKGZhbHNlKTsKLSAgICAJCXJldHVybjsKLSAgICAJfQotICAgIAlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgCXNldFZhbGlkKHRydWUpOwotICAgIAlpZiAoc3RhdFBhY2suZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpIHsgICAJCQotICAgIAkJc2V0TWVzc2FnZShzdGF0UGFjay5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJaWYgKHN0YXRQcmVmLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7ICAgCQkKLSAgICAJCXNldE1lc3NhZ2Uoc3RhdFByZWYuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgCXNldE1lc3NhZ2UobnVsbCwgSU1lc3NhZ2VQcm92aWRlci5OT05FKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFwcGx5KCkgewotICAgIAlzYXZlU2V0dGluZ3NJZk1vZGlmaWVkKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLSAgICAJcmV0dXJuIHNhdmVTZXR0aW5nc0lmTW9kaWZpZWQoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIHNhdmVTZXR0aW5nc0lmTW9kaWZpZWQoKSB7Ci0gICAgCWlmIChwcm9wc01vZGlmaWVkKSB7Ci0gICAgCQlib29sZWFuIHNhdmVkID0gc2F2ZVNldHRpbmdzKCk7Ci0gICAgCQlwcm9wc01vZGlmaWVkID0gIXNhdmVkOwotICAgIAkJcmV0dXJuIHNhdmVkOwotICAgIAl9Ci0gICAgCXJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gc2F2ZVNldHRpbmdzKCkgewotICAgIAlwdXROZXdWYWxzSW5Qcm9wcygpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KWdldEVsZW1lbnQoKS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoUFJPSkVDVF9TRVRUSU5HU19QQVRIKTsKLQkJSUZpbGUgcXVhcnR6RGF0YVhNTEZpbGUgPSBwcm9qZWN0LmdldEZpbGUocGF0aCk7CQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShxdWFydHpEYXRhWE1MRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0JCU91dHB1dFN0cmVhbSBvcyA9IG51bGw7IAotCQl0cnkgewotCQkJb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsgCi0JCQllZGl0b3JQcm9wcy5zdG9yZShvcywgIlRoaXMgZmlsZSBjb250YWlucyBKUEEgRGlhZ3JhbSBFZGl0b3Igc2V0dGluZ3MiKTsJLy8kTk9OLU5MUy0xJDsKLQkJCW9zLmNsb3NlKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgCi0JCQkJCQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KUEFEaWFncmFtUHJvcGVydHlQYWdlX2VyclNhdmVQcm9wc01zZ1RpdGxlLCAKLQkJCQkJCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2VfZXJyU2F2ZVByb3BzTXNnVGV4dCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHB1dE5ld1ZhbHNJblByb3BzKCkgewotCQllZGl0b3JQcm9wcy5wdXQoUFJPUF9ERUZBVUxUX0RJQUdSQU1fRk9MREVSLmdldExvY2FsTmFtZSgpLCB0eHREZWZhdWx0Rm9sZGVyRmllbGQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCWVkaXRvclByb3BzLnB1dChQUk9QX0RFRkFVTFRfUEFDS0FHRS5nZXRMb2NhbE5hbWUoKSwgdHh0RGVmYXVsdEVudGl0eVBhY2thZ2VGaWVsZC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJZWRpdG9yUHJvcHMucHV0KFBST1BfREVGQVVMVF9UQUJMRV9OQU1FX1BSRUZJWC5nZXRMb2NhbE5hbWUoKSwgdHh0RGVmYXVsdFRhYmxlTmFtZVByZWZpeC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJZWRpdG9yUHJvcHMucHV0KFBST1BfRElSRUNUX0VESVRfQUZGRUNUU19DTEFTUy5nZXRMb2NhbE5hbWUoKSwgIiIgKyBjaGVja0RpcmVjdEVkaXRBZmZlY3RzQ2xhc3MuZ2V0U2VsZWN0aW9uKCkpOwkvLyROT04tTkxTLTEkOwotCQllZGl0b3JQcm9wcy5wdXQoUFJPUF9BQ0NFU1NfVFlQRS5nZXRMb2NhbE5hbWUoKSwgYnRuRmllbGRCYXNlZEFjY2Vzcy5nZXRTZWxlY3Rpb24oKSA/IEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfQUNDRVNTX0ZJRUxEX0JBU0VEIDogSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9BQ0NFU1NfUFJPUEVSVFlfQkFTRUQpOwkJCi0JCWVkaXRvclByb3BzLnB1dChQUk9QX0NPTExFQ1RJT05fVFlQRS5nZXRMb2NhbE5hbWUoKSwgZ2V0Q29sbGVjdGlvblByb3BlcnR5KCkpOwotCQlpZiAoIWlzSlBBMTBQcm9qZWN0KQotCQkJZWRpdG9yUHJvcHMucHV0KFBST1BfT05FX1RPX01BTllfT0xEX1NUWUxFLmdldExvY2FsTmFtZSgpLCAiIiArIGNoZWNrT25lVG9NYW55T2xkU3R5bGUuZ2V0U2VsZWN0aW9uKCkpOwkvLyROT04tTkxTLTEkOwotCX0KLQkKLQkKLQlwcml2YXRlIFN0cmluZyBnZXRDb2xsZWN0aW9uUHJvcGVydHkoKXsKLQkJaWYgKGJ0bkNvbGxlY3Rpb25UeXBlLmdldFNlbGVjdGlvbigpKQotCQkJcmV0dXJuIEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfQ09MTEVDVElPTl9UWVBFOwotCQllbHNlIGlmIChidG5MaXN0VHlwZS5nZXRTZWxlY3Rpb24oKSkKLQkJCXJldHVybiBKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX0xJU1RfVFlQRTsKLQkJZWxzZSBpZiAoYnRuU2V0VHlwZS5nZXRTZWxlY3Rpb24oKSkKLQkJCXJldHVybiBKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX1NFVF9UWVBFOwotCQllbHNlIGlmIChidG5NYXBUeXBlLmdldFNlbGVjdGlvbigpKQotCQkJcmV0dXJuIEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfTUFQX1RZUEU7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnRpZXMgY3JlYXRlRGVmYXVsdFByb3BzKCkgewotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFByb3BzKHN0b3JlKTsKLQl9Ci0JCi0Jc3RhdGljIHByaXZhdGUgUHJvcGVydGllcyBjcmVhdGVEZWZhdWx0UHJvcHMoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQlQcm9wZXJ0aWVzIGVkaXRvckRlZmF1bHRQcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7IAotCQllZGl0b3JEZWZhdWx0UHJvcHMuc2V0UHJvcGVydHkoUFJPUF9ERUZBVUxUX0RJQUdSQU1fRk9MREVSLmdldExvY2FsTmFtZSgpLCBzdG9yZS5nZXRTdHJpbmcoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX0RJQUdSQU1fRk9MREVSKSk7CQkKLQkJZWRpdG9yRGVmYXVsdFByb3BzLnNldFByb3BlcnR5KFBST1BfREVGQVVMVF9QQUNLQUdFLmdldExvY2FsTmFtZSgpLCBzdG9yZS5nZXRTdHJpbmcoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX0VOVElUWV9QQUNLQUdFKSk7Ci0JCWVkaXRvckRlZmF1bHRQcm9wcy5zZXRQcm9wZXJ0eShQUk9QX0RFRkFVTFRfVEFCTEVfTkFNRV9QUkVGSVguZ2V0TG9jYWxOYW1lKCksIHN0b3JlLmdldFN0cmluZyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVEFCTEVfTkFNRV9QUkVGSVgpKTsKLQkJZWRpdG9yRGVmYXVsdFByb3BzLnNldFByb3BlcnR5KFBST1BfRElSRUNUX0VESVRfQUZGRUNUU19DTEFTUy5nZXRMb2NhbE5hbWUoKSwgIiIgKyBzdG9yZS5nZXRCb29sZWFuKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9ESVJFQ1RfRURJVF9DTEFTU19OQU1FKSk7CS8vJE5PTi1OTFMtMSQ7Ci0JCWVkaXRvckRlZmF1bHRQcm9wcy5zZXRQcm9wZXJ0eShQUk9QX0FDQ0VTU19UWVBFLmdldExvY2FsTmFtZSgpLCBzdG9yZS5nZXRTdHJpbmcoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX0VOVElUWV9BQ0NFU1NfVFlQRSkpOwkJCi0JCWVkaXRvckRlZmF1bHRQcm9wcy5zZXRQcm9wZXJ0eShQUk9QX0NPTExFQ1RJT05fVFlQRS5nZXRMb2NhbE5hbWUoKSwgc3RvcmUuZ2V0U3RyaW5nKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9ERUZBVUxUX0NPTExFQ1RJT05fVFlQRSkpOwotCQllZGl0b3JEZWZhdWx0UHJvcHMuc2V0UHJvcGVydHkoUFJPUF9PTkVfVE9fTUFOWV9PTERfU1RZTEUuZ2V0TG9jYWxOYW1lKCksICIiICsgc3RvcmUuZ2V0Qm9vbGVhbihKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfT05FX1RPX01BTllfT0xEX1NUWUxFKSk7CS8vJE5PTi1OTFMtMSQ7Ci0JCQotCQkKLQkJcmV0dXJuIGVkaXRvckRlZmF1bHRQcm9wczsKLQl9Ci0KLQkKLQlwcml2YXRlIHZvaWQgbG9hZFByb3BlcnRpZXMoKSB7Ci0JCVByb3BlcnRpZXMgZGVmYXVsdFByb3BzID0gY3JlYXRlRGVmYXVsdFByb3BzKCk7Ci0JCWVkaXRvclByb3BzID0gbmV3IFByb3BlcnRpZXMoZGVmYXVsdFByb3BzKTsKLQkJCi0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpZ2V0RWxlbWVudCgpLmdldEFkYXB0ZXIoSVByb2plY3QuY2xhc3MpOwotCQlQYXRoIHBhdGggPSBuZXcgUGF0aChQUk9KRUNUX1NFVFRJTkdTX1BBVEgpOwotCQlJRmlsZSBlZGl0b3JQcm9qZWN0UHJvcGVydGllcyA9IHByb2plY3QuZ2V0RmlsZShwYXRoKTsKLQkJCi0JCUZpbGUgcHJvcGVydGllc0ZpbGUgPSBuZXcgRmlsZShlZGl0b3JQcm9qZWN0UHJvcGVydGllcy5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0JCWlmIChwcm9wZXJ0aWVzRmlsZS5leGlzdHMoKSkgewotCQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocHJvcGVydGllc0ZpbGUpOwotCQkJCWVkaXRvclByb3BzLmxvYWQoaXMpOwkKLQkJCQlpcy5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCQotCXN0YXRpYyBwdWJsaWMgUHJvcGVydGllcyBsb2FkUHJvcGVydGllcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJUHJvcGVydGllcyBkZWZhdWx0UHJvcHMgPSBjcmVhdGVEZWZhdWx0UHJvcHMoc3RvcmUpOwotCQlQcm9wZXJ0aWVzIGVkaXRvclByb3BzID0gbmV3IFByb3BlcnRpZXMoZGVmYXVsdFByb3BzKTsKLQkJCi0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKFBST0pFQ1RfU0VUVElOR1NfUEFUSCk7Ci0JCUlGaWxlIGVkaXRvclByb2plY3RQcm9wZXJ0aWVzID0gcHJvamVjdC5nZXRGaWxlKHBhdGgpOwotCQkKLQkJRmlsZSBwcm9wZXJ0aWVzRmlsZSA9IG5ldyBGaWxlKGVkaXRvclByb2plY3RQcm9wZXJ0aWVzLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJaWYgKHByb3BlcnRpZXNGaWxlLmV4aXN0cygpKSB7Ci0JCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwcm9wZXJ0aWVzRmlsZSk7Ci0JCQkJZWRpdG9yUHJvcHMubG9hZChpcyk7CQotCQkJCWlzLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVkaXRvclByb3BzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0Rm9sZGVyKElQcm9qZWN0IHByb2plY3QpIHsKLQkJUHJvcGVydGllcyBwcm9wcyA9IEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UubG9hZFByb3BlcnRpZXMocHJvamVjdCk7Ci0JCXJldHVybiBnZXREZWZhdWx0Rm9sZGVyKHByb2plY3QsIHByb3BzKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhY2thZ2UoSVByb2plY3QgcHJvamVjdCkgewotCQlQcm9wZXJ0aWVzIHByb3BzID0gSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5sb2FkUHJvcGVydGllcyhwcm9qZWN0KTsKLQkJcmV0dXJuIGdldERlZmF1bHRQYWNrYWdlKHByb2plY3QsIHByb3BzKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlUHJlZml4TmFtZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmxvYWRQcm9wZXJ0aWVzKHByb2plY3QpOwotCQlyZXR1cm4gZ2V0RGVmYXVsdFRhYmxlUHJlZml4TmFtZShwcm9qZWN0LCBwcm9wcyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkb2VzRGlyZWN0ZUVkaXRpbmdBZmZlY3RDbGFzc05hbWVCeURlZmF1bHQoSVByb2plY3QgcHJvamVjdCkgewotCQlQcm9wZXJ0aWVzIHByb3BzID0gSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5sb2FkUHJvcGVydGllcyhwcm9qZWN0KTsKLQkJcmV0dXJuIGRvZXNEaXJlY3RlRWRpdGluZ0FmZmVjdENsYXNzTmFtZUJ5RGVmYXVsdChwcm9qZWN0LCBwcm9wcyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FjY2Vzc0ZpZWxkQmFzZWQoSVByb2plY3QgcHJvamVjdCkgewotCQlQcm9wZXJ0aWVzIHByb3BzID0gSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5sb2FkUHJvcGVydGllcyhwcm9qZWN0KTsKLQkJcmV0dXJuIGlzQWNjZXNzRmllbGRCYXNlZChwcm9qZWN0LCBwcm9wcyk7Ci0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb2xsZWN0aW9uVHlwZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmxvYWRQcm9wZXJ0aWVzKHByb2plY3QpOwotCQlyZXR1cm4gaXNDb2xsZWN0aW9uVHlwZShwcm9qZWN0LCBwcm9wcyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xpc3RUeXBlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJUHJvcGVydGllcyBwcm9wcyA9IEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UubG9hZFByb3BlcnRpZXMocHJvamVjdCk7Ci0JCXJldHVybiBpc0xpc3RUeXBlKHByb2plY3QsIHByb3BzKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2V0VHlwZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmxvYWRQcm9wZXJ0aWVzKHByb2plY3QpOwotCQlyZXR1cm4gaXNTZXRUeXBlKHByb2plY3QsIHByb3BzKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFwVHlwZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmxvYWRQcm9wZXJ0aWVzKHByb2plY3QpOwotCQlyZXR1cm4gaXNNYXBUeXBlKHByb2plY3QsIHByb3BzKTsKLQl9CQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG91bGRPbmVUb01hbnlVbmlkaXJCZU9sZFN0eWxlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJUHJvcGVydGllcyBwcm9wcyA9IEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UubG9hZFByb3BlcnRpZXMocHJvamVjdCk7Ci0JCXJldHVybiBzaG91bGRPbmVUb01hbnlVbmlkaXJCZU9sZFN0eWxlKHByb2plY3QsIHByb3BzKTsKLQl9CQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdEZvbGRlcihJUHJvamVjdCBwcm9qZWN0LCBQcm9wZXJ0aWVzIHByb3BzKSB7Ci0JCXJldHVybiBwcm9wcy5nZXRQcm9wZXJ0eShQUk9QX0RFRkFVTFRfRElBR1JBTV9GT0xERVIuZ2V0TG9jYWxOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0UGFja2FnZShJUHJvamVjdCBwcm9qZWN0LCBQcm9wZXJ0aWVzIHByb3BzKSB7Ci0JCXJldHVybiBwcm9wcy5nZXRQcm9wZXJ0eShQUk9QX0RFRkFVTFRfUEFDS0FHRS5nZXRMb2NhbE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZVByZWZpeE5hbWUoSVByb2plY3QgcHJvamVjdCwgUHJvcGVydGllcyBwcm9wcykgewotCQlyZXR1cm4gcHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9ERUZBVUxUX1RBQkxFX05BTUVfUFJFRklYLmdldExvY2FsTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRvZXNEaXJlY3RlRWRpdGluZ0FmZmVjdENsYXNzTmFtZUJ5RGVmYXVsdChJUHJvamVjdCBwcm9qZWN0LCBQcm9wZXJ0aWVzIHByb3BzKSB7Ci0JCXJldHVybiBCb29sZWFuLnBhcnNlQm9vbGVhbihwcm9wcy5nZXRQcm9wZXJ0eShQUk9QX0RJUkVDVF9FRElUX0FGRkVDVFNfQ0xBU1MuZ2V0TG9jYWxOYW1lKCkpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWNjZXNzRmllbGRCYXNlZChJUHJvamVjdCBwcm9qZWN0LCBQcm9wZXJ0aWVzIHByb3BzKSB7Ci0JCVN0cmluZyBhY2Nlc3NUeXBlID0gcHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9BQ0NFU1NfVFlQRS5nZXRMb2NhbE5hbWUoKSk7Ci0JCXJldHVybiBhY2Nlc3NUeXBlLmVxdWFscygiZmllbGQiKTsJLy8kTk9OLU5MUy0xJDsKLQl9CQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbGxlY3Rpb25UeXBlKElQcm9qZWN0IHByb2plY3QsIFByb3BlcnRpZXMgcHJvcHMpIHsKLQkJU3RyaW5nIGFjY2Vzc1R5cGUgPSBwcm9wcy5nZXRQcm9wZXJ0eShQUk9QX0NPTExFQ1RJT05fVFlQRS5nZXRMb2NhbE5hbWUoKSk7Ci0JCXJldHVybiBhY2Nlc3NUeXBlLmVxdWFscygiY29sbGVjdGlvbiIpOwkvLyROT04tTkxTLTEkOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMaXN0VHlwZShJUHJvamVjdCBwcm9qZWN0LCBQcm9wZXJ0aWVzIHByb3BzKSB7Ci0JCVN0cmluZyBhY2Nlc3NUeXBlID0gcHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9DT0xMRUNUSU9OX1RZUEUuZ2V0TG9jYWxOYW1lKCkpOwotCQlyZXR1cm4gYWNjZXNzVHlwZS5lcXVhbHMoImxpc3QiKTsJLy8kTk9OLU5MUy0xJDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2V0VHlwZShJUHJvamVjdCBwcm9qZWN0LCBQcm9wZXJ0aWVzIHByb3BzKSB7Ci0JCVN0cmluZyBhY2Nlc3NUeXBlID0gcHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9DT0xMRUNUSU9OX1RZUEUuZ2V0TG9jYWxOYW1lKCkpOwotCQlyZXR1cm4gYWNjZXNzVHlwZS5lcXVhbHMoInNldCIpOwkvLyROT04tTkxTLTEkOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNYXBUeXBlKElQcm9qZWN0IHByb2plY3QsIFByb3BlcnRpZXMgcHJvcHMpIHsKLQkJU3RyaW5nIGFjY2Vzc1R5cGUgPSBwcm9wcy5nZXRQcm9wZXJ0eShQUk9QX0NPTExFQ1RJT05fVFlQRS5nZXRMb2NhbE5hbWUoKSk7Ci0JCXJldHVybiBhY2Nlc3NUeXBlLmVxdWFscygibWFwIik7CS8vJE5PTi1OTFMtMSQ7Ci0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvdWxkT25lVG9NYW55VW5pZGlyQmVPbGRTdHlsZShJUHJvamVjdCBwcm9qZWN0LCBQcm9wZXJ0aWVzIHByb3BzKSB7Ci0JCXJldHVybiBCb29sZWFuLnBhcnNlQm9vbGVhbihwcm9wcy5nZXRQcm9wZXJ0eShQUk9QX09ORV9UT19NQU5ZX09MRF9TVFlMRS5nZXRMb2NhbE5hbWUoKSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3BlcnR5dGVzdGVyL0pwYUNvbnRlbnROb2RlRmFjZXRQcm9qZWN0VmVyc2lvblByb3BlcnR5VGVzdGVyLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvcGVydHl0ZXN0ZXIvSnBhQ29udGVudE5vZGVGYWNldFByb2plY3RWZXJzaW9uUHJvcGVydHlUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3Yjk3ZC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvcGVydHl0ZXN0ZXIvSnBhQ29udGVudE5vZGVGYWNldFByb2plY3RWZXJzaW9uUHJvcGVydHlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvcGVydHl0ZXN0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLlByb3BlcnR5VGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUm9vdENvbnRleHROb2RlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEpwYUNvbnRlbnROb2RlRmFjZXRQcm9qZWN0VmVyc2lvblByb3BlcnR5VGVzdGVyIGV4dGVuZHMKLQkJUHJvcGVydHlUZXN0ZXIgewotCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJqcHQuanBhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldCBGQUNFVCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJRCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3RbXSBhcmdzLAotCQkJT2JqZWN0IHZhbHVlKSB7Ci0JCQotCQlTdHJpbmdbXSBzdWJWYWx1ZXMgPSAoKFN0cmluZykgdmFsdWUpLnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlY2VpdmVySWQgPSBzdWJWYWx1ZXNbMF07Ci0KLQkJaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgSnBhUm9vdENvbnRleHROb2RlTW9kZWwpIHsKLQkJCWlmKHJlY2VpdmVySWQuZXF1YWxzKElEKSl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9CQkJCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvcGVydHl0ZXN0ZXIvSnBhUHJvamVjdEZhY2V0VmVyc2lvblByb3BlcnR5VGVzdGVyLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvcGVydHl0ZXN0ZXIvSnBhUHJvamVjdEZhY2V0VmVyc2lvblByb3BlcnR5VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YTAwZjIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3BlcnR5dGVzdGVyL0pwYVByb2plY3RGYWNldFZlcnNpb25Qcm9wZXJ0eVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm9wZXJ0eXRlc3RlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEpwYVByb2plY3RGYWNldFZlcnNpb25Qcm9wZXJ0eVRlc3RlciBleHRlbmRzIFByb3BlcnR5VGVzdGVyewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAianB0LmpwYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXQgRkFDRVQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSUQpOwotCi0JcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0W10gYXJncywKLQkJCU9iamVjdCB2YWx1ZSkgewotCQkKLQkJU3RyaW5nW10gc3ViVmFsdWVzID0gKChTdHJpbmcpIHZhbHVlKS5zcGxpdCgiOiIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyByZWNlaXZlcklkID0gc3ViVmFsdWVzWzBdOwotCi0JCWlmIChyZWNlaXZlciBpbnN0YW5jZW9mIEpwYU5vZGUpIHsKLQkJCWlmKHJlY2VpdmVySWQuZXF1YWxzKElEKSl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9CQkJCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvQWRkRW50aXR5Q29udGV4dC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0FkZEVudGl0eUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk3NGQ5YS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvQWRkRW50aXR5Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUGV0eWEgU2FiZXZhIC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkFkZENvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRFbnRpdHlDb250ZXh0IGV4dGVuZHMgQWRkQ29udGV4dCBpbXBsZW1lbnRzIElBZGRFbnRpdHlDb250ZXh0ewotCXByaXZhdGUgYm9vbGVhbiBwcmltYXJ5Q29sbGFwc2VkOwotCXByaXZhdGUgYm9vbGVhbiByZWxhdGlvbkNvbGxhcHNlZDsKLQlwcml2YXRlIGJvb2xlYW4gYmFzaWNDb2xsYXBzZWQ7Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5Q29sbGFwc2VkKCkgewotCQlyZXR1cm4gcHJpbWFyeUNvbGxhcHNlZDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0UHJpbWFyeUNvbGxhcHNlZChib29sZWFuIHByaW1hcnlDb2xsYXBzZWQpIHsKLQkJdGhpcy5wcmltYXJ5Q29sbGFwc2VkID0gcHJpbWFyeUNvbGxhcHNlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlbGF0aW9uQ29sbGFwc2VkKCkgewotCQlyZXR1cm4gcmVsYXRpb25Db2xsYXBzZWQ7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFJlbGF0aW9uQ29sbGFwc2VkKGJvb2xlYW4gcmVsYXRpb25Db2xsYXBzZWQpIHsKLQkJdGhpcy5yZWxhdGlvbkNvbGxhcHNlZCA9IHJlbGF0aW9uQ29sbGFwc2VkOwotCX0KLQotCXB1YmxpYyBBZGRFbnRpdHlDb250ZXh0KGJvb2xlYW4gcHJpbWFyeUNvbGxhcHNlZCwKLQkJCWJvb2xlYW4gcmVsYXRpb25Db2xsYXBzZWQsIGJvb2xlYW4gYmFzaWNDb2xsYXBzZWQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wcmltYXJ5Q29sbGFwc2VkID0gcHJpbWFyeUNvbGxhcHNlZDsKLQkJdGhpcy5yZWxhdGlvbkNvbGxhcHNlZCA9IHJlbGF0aW9uQ29sbGFwc2VkOwotCQl0aGlzLmJhc2ljQ29sbGFwc2VkID0gYmFzaWNDb2xsYXBzZWQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQmFzaWNDb2xsYXBzZWQoKSB7Ci0JCXJldHVybiBiYXNpY0NvbGxhcHNlZDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0QmFzaWNDb2xsYXBzZWQoYm9vbGVhbiBiYXNpY0NvbGxhcHNlZCkgewotCQl0aGlzLmJhc2ljQ29sbGFwc2VkID0gYmFzaWNDb2xsYXBzZWQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0lBZGRFbnRpdHlDb250ZXh0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSUFkZEVudGl0eUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkMTdjNS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSUFkZEVudGl0eUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFBldHlhIFNhYmV2YSAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotcHVibGljIGludGVyZmFjZSBJQWRkRW50aXR5Q29udGV4dCB7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1ByaW1hcnlDb2xsYXBzZWQoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUmVsYXRpb25Db2xsYXBzZWQoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQmFzaWNDb2xsYXBzZWQoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzM3ZDkzLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSURlbGV0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklEZWxldGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5JQ3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5JUGVTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLklNb2RlbEludGVncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb24uUmVsRGlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb24uUmVsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSXNBUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JR3JhcGhpY3NVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JUGVTZXJ2aWNlVXRpbDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZXh0ZW5kcyBJRmVhdHVyZVByb3ZpZGVyewotCi0JcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbSgpOwotCQotCXB1YmxpYyBIYXNoU2V0PElzQVJlbGF0aW9uPiBnZXRBbGxSZWR1bmRhbnRJc0FSZWxhdGlvbnMoKTsgCi0JCi0JcHVibGljIEhhc2hTZXQ8SXNBUmVsYXRpb24+IGdldEFsbEV4aXN0aW5nSXNBUmVsYXRpb25zKCk7Ci0JCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpOwotCQotCXB1YmxpYyBib29sZWFuIGhhc09iamVjdFdpdGhOYW1lKFN0cmluZyBuYW1lKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5Rm9yQnVzaW5lc3NPYmplY3QoT2JqZWN0IGJvKTsKLQotCXB1YmxpYyBPYmplY3QgcmVtb3ZlKFN0cmluZyBrZXkpOwotCQotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKFN0cmluZyBrZXksIGJvb2xlYW4gc2F2ZSk7CQotCi0JcHVibGljIElSZWxhdGlvbiBnZXRSZWxhdGlvblJlbGF0ZWRUb0F0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpOwotCQotCXB1YmxpYyBib29sZWFuIGV4aXN0c1JlbGF0aW9uKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQxLCBKYXZhUGVyc2lzdGVudFR5cGUganB0Mik7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEJ1c2luZXNzT2JqZWN0Rm9yS2V5KFN0cmluZyBrZXkpOwotCi0JcHVibGljIHZvaWQgYWRkSlBURm9yVXBkYXRlKFN0cmluZyBqcHROYW1lKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGRvZXNSZWxhdGlvbkV4aXN0KEphdmFQZXJzaXN0ZW50VHlwZSBvd25lciwgCi0JCQlKYXZhUGVyc2lzdGVudFR5cGUgaW52ZXJzZSwgCi0JCQlTdHJpbmcgb3duZXJBdHRyaWJ1dGVOYW1lLAotCQkJUmVsVHlwZSByZWxUeXBlLCAKLQkJCVJlbERpciByZWxEaXIpOwotICAgIAotCXB1YmxpYyB2b2lkIHJlc3RvcmVFbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCk7Ci0JCi0JcHVibGljIHZvaWQgYWRkUmVtb3ZlSWdub3JlKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIFN0cmluZyBhdE5hbWUpOwotCQotCXB1YmxpYyB2b2lkIGFkZEFkZElnbm9yZShKYXZhUGVyc2lzdGVudFR5cGUganB0LCBTdHJpbmcgYXROYW1lKTsKLQkKLSAgICBwdWJsaWMgdm9pZCBwdXRLZXlUb0J1c2luZXNzT2JqZWN0KFN0cmluZyBrZXksIE9iamVjdCBibyk7Ci0gICAgCi0JcHVibGljIGludCBnZXRBdHRyaWJzTnVtKFNoYXBlIHNoKTsgICAgCi0gICAgCi0JcHVibGljIGludCBpbmNyZWFzZUF0dHJpYnNOdW0oU2hhcGUgc2gpOwotCQotCXB1YmxpYyBpbnQgZGVjcmVhc2VBdHRyaWJzTnVtKFNoYXBlIHNoKTsKLQkKLSAgICBwdWJsaWMgdm9pZCByZXBsYWNlQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG9sZEF0LCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBuZXdBdCk7Ci0gICAgCQotCXB1YmxpYyB2b2lkIHJlbmV3QXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlMaXN0ZW5lcihKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpOwotCQotCXB1YmxpYyBJUGVTZXJ2aWNlIGdldFBlU2VydmljZSgpOwotCi0JcHVibGljIElQZVNlcnZpY2VVdGlsIGdldFBlU2VydmljZVV0aWwoKTsKLQkKLQlwdWJsaWMgSUpQQUVkaXRvclV0aWwgZ2V0SlBBRWRpdG9yVXRpbCgpOwotCi0JcHVibGljIElEZWxldGVGZWF0dXJlIGdldERlbGV0ZUZlYXR1cmUoSURlbGV0ZUNvbnRleHQgY29udGV4dCk7Ci0JCi0JcHVibGljIElDdXN0b21GZWF0dXJlIGdldEFkZEFsbEVudGl0aWVzRmVhdHVyZSgpOwotCQotCXB1YmxpYyBJTW9kZWxJbnRlZ3JhdGlvblV0aWwgZ2V0TW9pbkludGVncmF0aW9uVXRpbCgpOwotCQotCXB1YmxpYyBJR3JhcGhpY3NVcGRhdGVyIGdldEdyYXBoaWNzVXBkYXRlcigpOwotCi0JcHVibGljIHZvaWQgYWRkQXR0cmliRm9yVXBkYXRlKFBlcnNpc3RlbmNlVW5pdCBwdSwgU3RyaW5nIGVudEF0TWFwcGVkQnkpOwotCQotCXB1YmxpYyBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbigpOwotCQotCXB1YmxpYyBQcm9wZXJ0aWVzIGxvYWRQcm9wZXJ0aWVzKElQcm9qZWN0IHByb2plY3QpOwotCi0JcHVibGljIENvbGxlY3Rpb248SmF2YVBlcnNpc3RlbnRUeXBlPiBnZXRQZXJzaXN0ZW50VHlwZXMoKTsKLQkKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRUeXBlIGdldEZpcnN0U3VwZXJjbGFzc0JlbG9uZ2luZ1RvVGhlRGlhZ3JhbShKYXZhUGVyc2lzdGVudFR5cGUgc3ViY2xhc3MpOwotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbFJlZHVuZGFudElzQVJlbGF0aW9ucygpOwotCQotCXB1YmxpYyBib29sZWFuIGV4aXN0UmVkdW5kYW50SXNBUmVsYXRpb25zKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSUpQQUVkaXRvckltYWdlQ3JlYXRvci5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0lKUEFFZGl0b3JJbWFnZUNyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJlMzk5Yy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSUpQQUVkaXRvckltYWdlQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlBvbHlsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb25EZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotCi1wdWJsaWMgaW50ZXJmYWNlIElKUEFFZGl0b3JJbWFnZUNyZWF0b3IgewotCQotCXN0YXRpYyBwdWJsaWMgZW51bSBSZWxFbmREaXIgewotCQlVUCwKLQkJTEVGVCwKLQkJUklHSFQsCi0JCURPV04KLQl9Ci0KLQlwdWJsaWMgUG9seWxpbmUgY3JlYXRlQ29ubmVjdGlvbkxpbmUoRGlhZ3JhbSBkLCBDb25uZWN0aW9uIGNvbm5lY3Rpb24pOwotCi0JcHVibGljIFBvbHlsaW5lIGNyZWF0ZUlzQUNvbm5lY3Rpb25MaW5lKERpYWdyYW0gZCwgQ29ubmVjdGlvbiBjb25uZWN0aW9uKTsKLQotCS8vcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3IgY3JlYXRlVGV4dENvbm5lY3Rpb25EZWNvcmF0b3IoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBTdHJpbmcgdGV4dCwgZG91YmxlIGxvY2F0aW9uKTsKLQotCXB1YmxpYyBDb25uZWN0aW9uRGVjb3JhdG9yIGNyZWF0ZUFycm93Q29ubmVjdGlvbkRlY29yYXRvcihDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGRvdWJsZSBsb2NhdGlvbiwgYm9vbGVhbiBpc0EpOwotCi0JcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3IgY3JlYXRlTWFueUVuZFdpdGhBcnJvd0RlY29yYXRvcihDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGRvdWJsZSBsb2NhdGlvbik7Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkRlY29yYXRvciBjcmVhdGVNYW55U3RhcnREZWNvcmF0b3IoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBkb3VibGUgbG9jYXRpb24pOwotCQotCXB1YmxpYyBDb25uZWN0aW9uRGVjb3JhdG9yIGNyZWF0ZU1hbnlFbmREZWNvcmF0b3IoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBkb3VibGUgbG9jYXRpb24pOwotCi0JcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3IgY3JlYXRlSWNvbkNvbm5lY3Rpb25EZWNvcmF0b3IoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBTdHJpbmcgaWNvbklkLCBkb3VibGUgbG9jYXRpb24pOwotCQotCXB1YmxpYyBDb25uZWN0aW9uRGVjb3JhdG9yIGNyZWF0ZUNhcmRpbmFsaXR5Q29ubmVjdGlvbkRlY29yYXRvcihEaWFncmFtIGQsIENvbm5lY3Rpb24gYywgU3RyaW5nIHRleHQsIGRvdWJsZSBsb2NhdGlvbik7Ci0JCi0JcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3IgY3JlYXRlSXNBVGV4dENvbm5lY3Rpb25EZWNvcmF0b3IoRGlhZ3JhbSBkLCBDb25uZWN0aW9uIGMpOwotCQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSlBBRWRpdG9yQ29udGV4dE1lbnVQcm92aWRlci5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckNvbnRleHRNZW51UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IxNWY5Yi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSlBBRWRpdG9yQ29udGV4dE1lbnVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnVpLmVkaXRvci5EaWFncmFtRWRpdG9yQ29udGV4dE1lbnVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5pbnRlcm5hbC5jb25maWcuSUNvbmZpZ3VyYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKUEFFZGl0b3JDb250ZXh0TWVudVByb3ZpZGVyIGV4dGVuZHMgRGlhZ3JhbUVkaXRvckNvbnRleHRNZW51UHJvdmlkZXIgewotCXB1YmxpYyBKUEFFZGl0b3JDb250ZXh0TWVudVByb3ZpZGVyKEVkaXRQYXJ0Vmlld2VyIHZpZXdlciwgCi0JCQkJCQkJCQkJQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnksIAotCQkJCQkJCQkJCUlDb25maWd1cmF0aW9uUHJvdmlkZXIgY29uZmlndXJhdGlvblByb3ZpZGVyKSB7Ci0JCXN1cGVyKHZpZXdlciwgcmVnaXN0cnksIGNvbmZpZ3VyYXRpb25Qcm92aWRlcik7Ci0JfQotCQkKLQotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRNZW51R3JvdXBFZGl0KElNZW51TWFuYWdlciBtYW5hZ2VyLCBQb2ludCBtZW51TG9jYXRpb24pIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWN0aW9uVG9NZW51SWZBdmFpbGFibGUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIsIFN0cmluZyBhY3Rpb25JZCwgU3RyaW5nIG1lbnVHcm91cCkgewotCQlpZiAoYWN0aW9uSWQuZXF1YWxzKCJwcmVkZWZpbmVkIHJlbW92ZSBhY3Rpb24iKSB8fAkvLyROT04tTkxTLTEkCi0JCQlhY3Rpb25JZC5lcXVhbHMoInByZWRlZmluZWQgdXBkYXRlIGFjdGlvbiIpKSAJLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQlzdXBlci5hZGRBY3Rpb25Ub01lbnVJZkF2YWlsYWJsZShtYW5hZ2VyLCBhY3Rpb25JZCwgbWVudUdyb3VwKTsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlci5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY0YzVjMC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmR0LkFic3RyYWN0RGlhZ3JhbVR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5BZGRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5DdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5SZW1vdmVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkucGxhdGZvcm0uSURpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudGIuSVRvb2xCZWhhdmlvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmFjYWRlLkVjbGlwc2VGYWNhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5BZGRBbGxFbnRpdGllc0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5BZGRKUEFFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuUmVtb3ZlUmVsYXRpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLk1vZGVsSW50ZWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuRW50aXRpZXNDb29yZGluYXRlc1hNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUNoZWNrU3VtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBU29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuU2l6ZVBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLXB1YmxpYyBjbGFzcyBKUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3REaWFncmFtVHlwZVByb3ZpZGVyIHsKLQkKLQlwcml2YXRlIElUb29sQmVoYXZpb3JQcm92aWRlcltdIHRvb2xCZWhhdmlvclByb3ZpZGVyczsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5wcm92aWRlci5KUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotICAgIGJvb2xlYW4gaXNEaXNwb3NlZCA9IGZhbHNlOwotICAgIGJvb2xlYW4gcmVhZE9ubHkgPSBmYWxzZTsKLQkKLSAgICBwdWJsaWMgSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcigpIHsKLSAgICAJSUZlYXR1cmVQcm92aWRlciBmcCA9IG5ldyBKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIodGhpcywgbmV3IEpQQVNvbHZlcigpKTsKLSAgICAgICAgc2V0RmVhdHVyZVByb3ZpZGVyKGZwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0KERpYWdyYW0gZGlhZ3JhbSwgSURpYWdyYW1FZGl0b3IgZGlhZ3JhbUVkaXRvcikgewotICAgIAlzdXBlci5pbml0KGRpYWdyYW0sIGRpYWdyYW1FZGl0b3IpOwotICAgIAlpZiAoZ2V0VGFyZ2V0SlBBUHJvamVjdCgpID09IG51bGwpCi0gICAgCQljbG9zZUVkaXRvcigpOwotICAgIAlKUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyIHByb3ZpZGVyID0gTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0UHJvdmlkZXJCeURpYWdyYW0oZGlhZ3JhbS5nZXROYW1lKCkpOwotICAgIAlpZiAoKHByb3ZpZGVyICE9IG51bGwpICYmIHByb3ZpZGVyLmlzQWxpdmUoKSkgCi0gICAgCQlwcm92aWRlci5nZXREaWFncmFtRWRpdG9yKCkuZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5jbG9zZUVkaXRvcihwcm92aWRlci5nZXREaWFncmFtRWRpdG9yKCksIHRydWUpOwotCX0KLSAgICAKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVRvb2xCZWhhdmlvclByb3ZpZGVyW10gZ2V0QXZhaWxhYmxlVG9vbEJlaGF2aW9yUHJvdmlkZXJzKCkgewotICAgICAgICBpZiAodG9vbEJlaGF2aW9yUHJvdmlkZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRvb2xCZWhhdmlvclByb3ZpZGVycyA9Ci0gICAgICAgICAgICAgICAgbmV3IElUb29sQmVoYXZpb3JQcm92aWRlcltdIHsgbmV3IEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyKHRoaXMsIEVjbGlwc2VGYWNhZGUuSU5TVEFOQ0UpIH07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRvb2xCZWhhdmlvclByb3ZpZGVyczsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIEpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0gICAgCXJldHVybiAoSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotICAgIH0KLSAgICAKLQlAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotCXB1YmxpYyBib29sZWFuIGhhc1RvQWRkKCkgewotCQlKcGFQcm9qZWN0IHByb2plY3QgPSBnZXRUYXJnZXRKUEFQcm9qZWN0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCB1bml0ID0gcHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLgotCQkJCQkJCQlnZXRQZXJzaXN0ZW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWZvciAoQ2xhc3NSZWYgY2xhc3NSZWYgOiB1bml0LmdldENsYXNzUmVmcygpKSB7Ci0JCQlpZiAoY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkgIT0gbnVsbCkgeyAKLQkJCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCQkJCWlmIChqcHQuZ2V0TWFwcGluZ0tleSgpID09IE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKSB7Ci0JCQkJCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoanB0KTsKLQkJCQkJaWYgKHBlID09IG51bGwpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsJCQkJCQotCQkJCX0KLQkJCX0KLQkJfQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0gICAgICAgIAotICAgIAotICAgIEBPdmVycmlkZQotCXB1YmxpYyAJdm9pZCBwb3N0SW5pdCgpIHsKLSAgICAJZmluYWwgU3RyaW5nIGpwdE5hbWUgPSBnZXREaWFncmFtRWRpdG9yKCkuZ2V0UGFydFByb3BlcnR5KEpQQUVkaXRvckNvbnN0YW50cy5PUEVOX1dIT0xFX1BFUlNJU1RFTkNFX1VOSVRfRURJVE9SX1BST1BFUlRZKTsKLQkJaWYgKGpwdE5hbWUgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBoYXNUb0FkZCA9IGhhc1RvQWRkKCk7IAotCQkJYm9vbGVhbiByZWFkT25seSA9IG9wZW5QZXJzaXN0ZWREaWFncmFtKGhhc1RvQWRkKTsKLQkJCWlmIChoYXNUb0FkZCAmJiAhcmVhZE9ubHkpCi0JCQlhZGRSZW1haW5pbmdFbnRpdGllcygpOwotCQl9IGVsc2UKLQkJCXRyeSB7Ci0JCQkJb3BlblBlcnNpc3RlZERpYWdyYW0oZmFsc2UpOwotCQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJCXJldHVybjsKLQkJCX0KLQl9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFJlbWFpbmluZ0VudGl0aWVzKCkgewotCQlmaW5hbCBBZGRBbGxFbnRpdGllc0ZlYXR1cmUgZmVhdHVyZSA9IG5ldyBBZGRBbGxFbnRpdGllc0ZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQlmaW5hbCBDdXN0b21Db250ZXh0IGNvbnRleHQgPSBuZXcgQ3VzdG9tQ29udGV4dCgpOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBNb2RlbEludGVncmF0aW9uVXRpbC5nZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbihmZWF0dXJlLmdldEZlYXR1cmVQcm92aWRlcigpLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCkpOwotCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCWZlYXR1cmUuZXhlY3V0ZShjb250ZXh0KTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsb3NlRWRpdG9yKCkgewotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsJCQkJCQotCQkJCXBhZ2UuY2xvc2VFZGl0b3IoZ2V0RGlhZ3JhbUVkaXRvcigpLCBmYWxzZSk7Ci0JCQl9Ci0JCX0pOyAgICAJCi0gICAgfQotICAgIAotCXByaXZhdGUgYm9vbGVhbiBvcGVuUGVyc2lzdGVkRGlhZ3JhbShib29sZWFuIGhhc1RvQWRkKSB7CQotCQlmaW5hbCBKcGFQcm9qZWN0IHByb2ogPSBnZXRUYXJnZXRKUEFQcm9qZWN0KCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qLmdldFByb2plY3QoKTsKLQkJZmluYWwgRGlhZ3JhbSBkaWFncmFtID0gZ2V0RGlhZ3JhbSgpOwotCQlNb2RlbEludGVncmF0aW9uVXRpbC5wdXRQcm9qZWN0VG9EaWFncmFtKHByb2plY3QsIGRpYWdyYW0pOwotCQlQZXJzaXN0ZW5jZVVuaXQgcHUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXQocHJvaik7Ci0JCVN0cmluZyBkaWFncmFtTmFtZSA9IHB1LmdldE5hbWUoKTsKLQkgICAgSVBhdGggcGF0aCA9IE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldERpYWdyYW1zRm9sZGVyUGF0aChwcm9qZWN0KS5hcHBlbmQoZGlhZ3JhbU5hbWUpLmFkZEZpbGVFeHRlbnNpb24oTW9kZWxJbnRlZ3JhdGlvblV0aWwuRElBR1JBTV9GSUxFX0VYVEVOU0lPTik7Ci0JCWZpbmFsIElGaWxlIGYgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCWJvb2xlYW4gcmVhZE9ubHkgPSAoZiAhPSBudWxsKSAmJiBmLmV4aXN0cygpICYmIGYuaXNSZWFkT25seSgpOwotCQlpZiAocmVhZE9ubHkpIHsKLQkJCWlmIChKUEFDaGVja1N1bS5JTlNUQU5DRSgpLmlzTW9kZWxEaWZmZXJlbnRGcm9tRGlhZ3JhbShkaWFncmFtLCBwcm9qKSB8fCBoYXNUb0FkZCkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gaGFzVG9BZGQgPyBKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyX0pQQURpYWdyYW1SZWFkT25seUhhc1RvQWRkTXNnIDogCi0JCQkJCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXJfSlBBRGlhZ3JhbVJlYWRPbmx5TXNnOwotCQkJCU1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQkJSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcl9KUEFEaWFncmFtUmVhZE9ubHlUaXRsZSwgbnVsbCwgbWVzc2FnZSwKLQkJCQkJCU1lc3NhZ2VEaWFsb2cuSU5GT1JNQVRJT04sIG5ldyBTdHJpbmdbXSB7SlBBRWRpdG9yTWVzc2FnZXMuQlROX09LLCBKUEFFZGl0b3JNZXNzYWdlcy5CVE5fQ0FOQ0VMfSwgMCkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIGludCBnZXRTaGVsbFN0eWxlKCkgewotCQkJCQkJcmV0dXJuIFNXVC5USVRMRSB8IFNXVC5CT1JERVIKLQkJCQkJCQl8IFNXVC5BUFBMSUNBVElPTl9NT0RBTAotCQkJCQkJCXwgZ2V0RGVmYXVsdE9yaWVudGF0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWlmIChkaWFsb2cub3BlbigpID09IDEpIHsKLQkJCQkJY2xvc2VFZGl0b3IoKTsJCQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlJU3RhdHVzIHN0YXQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KG5ldyBJRmlsZVtde2Z9LCBudWxsKTsKLQkJCQkJaWYgKCFzdGF0LmlzT0soKSkgewotCQkJCQkJbWVzc2FnZSA9IE5MUy5iaW5kKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXJfY2FudE1ha2VEaWFncmFtV3JpdGFibGVNc2csIAotCQkJCQkJCQlzdGF0LmdldE1lc3NhZ2UoKSk7OwotCQkJCQkJZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyX2NhbnRNYWtlRGlhZ3JhbVdyaXRhYmxlVGl0bGUsIG51bGwsIG1lc3NhZ2UsCi0JCQkJCQkJCU1lc3NhZ2VEaWFsb2cuQ0FOQ0VMLCBuZXcgU3RyaW5nW10ge0pQQUVkaXRvck1lc3NhZ2VzLkJUTl9PS30sIDApIHsKLQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQlwcm90ZWN0ZWQgaW50IGdldFNoZWxsU3R5bGUoKSB7Ci0JCQkJCQkJCXJldHVybiBTV1QuQ0xPU0UgfCBTV1QuVElUTEUgfCBTV1QuQk9SREVSCi0JCQkJCQkJCQl8IFNXVC5BUFBMSUNBVElPTl9NT0RBTAotCQkJCQkJCQkJfCBnZXREZWZhdWx0T3JpZW50YXRpb24oKTsKLQkJCQkJCQl9Ci0JCQkJCQl9OwotCQkJCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQkJCWNsb3NlRWRpdG9yKCk7CQkJCQkJCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlYWRPbmx5ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiByZWFkT25seTsKLQkJCX0KLQkJfQotCQkKLQkJcmVtb3ZlQ29ubmVjdGlvbnMoKTsKLQkJCi0JCWZpbmFsIEhhc2h0YWJsZTxTdHJpbmcsIFNpemVQb3NpdGlvbj4gbWFya3MgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU2l6ZVBvc2l0aW9uPigpOyAJCQkJCi0JCUVudGl0aWVzQ29vcmRpbmF0ZXNYTUwgeG1sID0gbmV3IEVudGl0aWVzQ29vcmRpbmF0ZXNYTUwocHJvamVjdC5nZXROYW1lKCkpOwotCQl4bWwubG9hZChtYXJrcyk7Ci0JCXhtbC5jbGVhbigpOwotCQkJCQotCQlMaXN0PFNoYXBlPiBwaWN0cyA9IGRpYWdyYW0uZ2V0Q2hpbGRyZW4oKTsKLQkJSXRlcmF0b3I8U2hhcGU+IGl0ID0gcGljdHMuaXRlcmF0b3IoKTsKLQkJSGFzaFNldDxTaGFwZT4gdG9EZWxldGUgPSBuZXcgSGFzaFNldDxTaGFwZT4oKTsKLQkJLy8gY29sbGVjdGluZyBkYXRhIGZyb20gdGhlIHNhdmVkIHBpY3RvZ3JhbXMKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJU2hhcGUgcGljdCA9IGl0Lm5leHQoKTsKLQkJCXRvRGVsZXRlLmFkZChwaWN0KTsKLQkJfQotCQkKLQkJZmluYWwgSXRlcmF0b3I8U2hhcGU+IGl0ZXIgPSB0b0RlbGV0ZS5pdGVyYXRvcigpOwotCQkJCQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihkaWFncmFtKTsKLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0JCQkJCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLmRlbGV0ZVBpY3RvZ3JhbUVsZW1lbnQoaXRlci5uZXh0KCkpOwotCQkJCUNvbGxlY3Rpb248Q29ubmVjdGlvbj4gY25zID0gZGlhZ3JhbS5nZXRDb25uZWN0aW9ucygpOwotCQkJCUl0ZXJhdG9yPENvbm5lY3Rpb24+IGl0ZXJhID0gY25zLml0ZXJhdG9yKCk7Ci0JCQkJU2V0PENvbm5lY3Rpb24+IHRvRGVsID0gbmV3IEhhc2hTZXQ8Q29ubmVjdGlvbj4oKTsKLQkJCQl3aGlsZSAoaXRlcmEuaGFzTmV4dCgpKSAKLQkJCQkJdG9EZWwuYWRkKGl0ZXJhLm5leHQoKSk7Ci0JCQkJaXRlcmEgPSB0b0RlbC5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyYS5oYXNOZXh0KCkpCi0JCQkJCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLmRlbGV0ZVBpY3RvZ3JhbUVsZW1lbnQoaXRlcmEubmV4dCgpKTsJCQotCQkJCQotCQkJCUVudW1lcmF0aW9uPFN0cmluZz4gaXRyID0gbWFya3Mua2V5cygpOwotCQkJCQotCQkJCS8vIGNyZWF0ZSBuZXcgcGljdG9ncmFtcwotCQkJCXdoaWxlIChpdHIuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQkJU3RyaW5nIGVudGl0eU5hbWUgPSBpdHIubmV4dEVsZW1lbnQoKTsKLQkJCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShwcm9qLCBlbnRpdHlOYW1lKTsKLQkJCQkJaWYgKGpwdCAhPSBudWxsKSB7Ci0JCQkJCQlTaXplUG9zaXRpb24gc3AgPSBtYXJrcy5nZXQoZW50aXR5TmFtZSk7Ci0JCQkJCQlBZGRDb250ZXh0IGN0eCA9IG5ldyBBZGRFbnRpdHlDb250ZXh0KHNwLnByaW1hcnlDb2xsYXBzZWQsCi0JCQkJCQkJCXNwLnJlbGF0aW9uQ29sbGFwc2VkLCBzcC5iYXNpY0NvbGxhcHNlZCk7Ci0JCQkJCQljdHguc2V0TmV3T2JqZWN0KGpwdCk7Ci0JCQkJCQljdHguc2V0VGFyZ2V0Q29udGFpbmVyKGdldERpYWdyYW0oKSk7Ci0JCQkJCQljdHguc2V0V2lkdGgoc3AuZ2V0V2lkdGgoKSk7Ci0JCQkJCQljdHguc2V0SGVpZ2h0KHNwLmdldEhlaWdodCgpKTsKLQkJCQkJCWN0eC5zZXRYKHNwLmdldFgoKSk7Ci0JCQkJCQljdHguc2V0WShzcC5nZXRZKCkpOwotCQkJCQkJQWRkSlBBRW50aXR5RmVhdHVyZSBmdCA9IG5ldyBBZGRKUEFFbnRpdHlGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpLCBmYWxzZSk7Ci0JCQkJCQlmdC5hZGQoY3R4KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWFycmFuZ2VJc0FSZWxhdGlvbnMoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQkJfQkJCQotCQl9KTsKLQkJZ2V0RGlhZ3JhbUVkaXRvcigpLnNhdmVXaXRob3V0RW50aXRpZXMobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJLy8gZGVsZXRlIG9sZCBwaWN0b2dyYW1zCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQ29ubmVjdGlvbnMoKSB7Ci0JCUNvbGxlY3Rpb248b3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uPiBjb25zID0gZ2V0RGlhZ3JhbSgpLmdldENvbm5lY3Rpb25zKCk7Ci0JCUl0ZXJhdG9yPG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbj4gY29uc0l0ID0gY29ucy5pdGVyYXRvcigpOwotCQlDb2xsZWN0aW9uPG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbj4gYWxsQ29ucyA9IG5ldyBIYXNoU2V0PG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbj4oKTsKLQkJd2hpbGUgKGNvbnNJdC5oYXNOZXh0KCkpIHsKLQkJCW9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbiBjb24gPSBjb25zSXQubmV4dCgpOwotCQkJYWxsQ29ucy5hZGQoY29uKTsKLQkJfQotCQljb25zSXQgPSBhbGxDb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjb25zSXQuaGFzTmV4dCgpKSB7Ci0JCQlvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb24gY29uID0gY29uc0l0Lm5leHQoKTsKLQkgICAgCVJlbW92ZUNvbnRleHQgY3R4ID0gbmV3IFJlbW92ZUNvbnRleHQoY29uKTsKLQkgICAgCVJlbW92ZVJlbGF0aW9uRmVhdHVyZSBmdCA9IG5ldyBSZW1vdmVSZWxhdGlvbkZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCSAgICAJZnQucmVtb3ZlKGN0eCk7CQkJCi0JCX0JCQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSlBBRGlhZ3JhbUVkaXRvciBnZXREaWFncmFtRWRpdG9yKCkgewotCQlyZXR1cm4gKEpQQURpYWdyYW1FZGl0b3Ipc3VwZXIuZ2V0RGlhZ3JhbUVkaXRvcigpOwotCX0gICAgCi0gICAgCi0JcHJpdmF0ZSBKcGFQcm9qZWN0IGdldFRhcmdldEpQQVByb2plY3QoKSB7Ci0JCXJldHVybiBNb2RlbEludGVncmF0aW9uVXRpbC5nZXRQcm9qZWN0QnlEaWFncmFtKGdldERpYWdyYW0oKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0FsaXZlKCkgewotCQlyZXR1cm4gIWlzRGlzcG9zZWQ7Ci0JfQotCSAgICAgICAgICAgCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlzZXRGZWF0dXJlUHJvdmlkZXIobnVsbCk7Ci0JCWlzRGlzcG9zZWQgPSB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NDliZTQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckZlYXR1cmVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZHQuSURpYWdyYW1UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUFkZEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUNyZWF0ZUNvbm5lY3Rpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklDcmVhdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklEZWxldGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklEaXJlY3RFZGl0aW5nRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JTGF5b3V0RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JTW92ZUNvbm5lY3Rpb25EZWNvcmF0b3JGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklNb3ZlU2hhcGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklSZWFzb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSVJlbW92ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSVJlc2l6ZVNoYXBlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklBZGRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JRGVsZXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklEaXJlY3RFZGl0aW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklMYXlvdXRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSU1vdmVDb25uZWN0aW9uRGVjb3JhdG9yQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklNb3ZlU2hhcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JUmVzaXplU2hhcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5BZGRDb25uZWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uSUN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5SZWFzb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuaW50ZXJuYWwuc2VydmljZXMuR3JhcGhpdGlJbnRlcm5hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkdyYXBoaWNzQWxnb3JpdGhtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuSVBlU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5mZWF0dXJlcy5EZWZhdWx0RmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkFkZEFsbEVudGl0aWVzRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkFkZEF0dHJpYnV0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5BZGRKUEFFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQWRkUmVsYXRpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ29sbGFwc2VBbGxFbnRpdGllc0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5Db2xsYXBzZUNvbXBhcnRtZW50U2hhcGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ29sbGFwc2VFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ3JlYXRlSlBBRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNyZWF0ZU1hbnlUb01hbnlCaURpclJlbGF0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNyZWF0ZU1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5DcmVhdGVNYW55VG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNyZWF0ZU1hbnlUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNyZWF0ZU1hcHBlZFN1cGVyY2xhc3NGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ3JlYXRlT25lVG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ3JlYXRlT25lVG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNyZWF0ZU9uZVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuRGVsZXRlSlBBRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkRlbGV0ZVJlbGF0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkRpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuRGlyZWN0RWRpdEpQQUVudGl0eUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5FeHBhbmRDb21wYXJ0bWVudFNoYXBlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkV4cGFuZEVudGl0eUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5KUEFNb3ZlQ29ubmVjdGlvbkRlY29yYXRvckZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5MYXlvdXRKUEFFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuTW92ZUF0dHJpYnV0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5Nb3ZlRW50aXR5U2hhcGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuUmVtb3ZlQXR0cmlidXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlJlbW92ZUpQQUVudGl0eUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5SZW1vdmVSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5SZXNpemVBdHRyaWJ1dGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuUmVzaXplSlBBRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnV0aWwuSU1vZGVsSW50ZWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbC5Nb2RlbEludGVncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnV0aWwuTW9kZWxJbnRlZ3JhdGlvblV0aWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS5KUEFEaWFncmFtUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5BYnN0cmFjdFJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbi5SZWxEaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbi5SZWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5Jc0FSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkdyYXBoaWNzVXBkYXRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JR3JhcGhpY3NVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JSnBhU29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSVBlU2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFTb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5QZVNlcnZpY2VVdGlsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGV4dGVuZHMgRGVmYXVsdEZlYXR1cmVQcm92aWRlciBpbXBsZW1lbnRzIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgewotCQotCXByaXZhdGUgQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlIGNsaWNrQWRkQXR0QnRuRmVhdCA9IG51bGw7Ci0JcHJpdmF0ZSBDbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUgY2xpY2tSZW1vdmVBdHRCdG5GZWF0ID0gbnVsbDsKLQlwcml2YXRlIElQZVNlcnZpY2VVdGlsIHBlU2VydmljZVV0aWwgPSBuZXcgUGVTZXJ2aWNlVXRpbEltcGwoKTsKLQlwcml2YXRlIElQZVNlcnZpY2UgcGVTZXJ2aWNlID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCk7Ci0JcHJpdmF0ZSBJSlBBRWRpdG9yVXRpbCBqcGFFZGl0b3JVdGlsID0gbmV3IEpQQUVkaXRvclV0aWxJbXBsKCk7Ci0JcHJpdmF0ZSBJTW9kZWxJbnRlZ3JhdGlvblV0aWwgbW9pbkludGVncmF0aW9uVXRpbCA9IG5ldyBNb2RlbEludGVncmF0aW9uVXRpbEltcGwoKTsgCi0JcHJpdmF0ZSBJR3JhcGhpY3NVcGRhdGVyIGdyYXBoaWNzVXBkYXRlciA9IG5ldyBHcmFwaGljc1VwZGF0ZXJJbXBsKCk7IAotCQotICAgIHB1YmxpYyBKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIoSURpYWdyYW1UeXBlUHJvdmlkZXIgZHRwLCBJSnBhU29sdmVyIGlzKSB7Ci0gICAgICAgIHN1cGVyKGR0cCk7Ci0gICAgICAgIGlzLnNldEZlYXR1cmVQcm92aWRlcih0aGlzKTsKLSAgICAgICAgdGhpcy5zZXRJbmRlcGVuZGVuY2VTb2x2ZXIoaXMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzdG9wVGhyZWFkKCkgewotICAgIAlpZiAoZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkgIT0gbnVsbCkKLSAgICAJCSgoSlBBU29sdmVyKWdldEluZGVwZW5kZW5jZVNvbHZlcigpKS5zdG9wVGhyZWFkKCk7Ci0gICAgfQotICAgIAotCXB1YmxpYyBEaWFncmFtIGdldERpYWdyYW0oKSB7Ci0JCXJldHVybiBnZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbSgpOwotCX0KLQotCXB1YmxpYyBIYXNoU2V0PElzQVJlbGF0aW9uPiBnZXRBbGxFeGlzdGluZ0lzQVJlbGF0aW9ucygpIHsKLQkJRUxpc3Q8Q29ubmVjdGlvbj4gYWxsQ29ucyA9IGdldERpYWdyYW0oKS5nZXRDb25uZWN0aW9ucygpOwotCQlIYXNoU2V0PElzQVJlbGF0aW9uPiByZXMgPSBuZXcgSGFzaFNldDxJc0FSZWxhdGlvbj4oKTsKLQkJSGFzaFNldDxDb25uZWN0aW9uPiB0YmQgPSBuZXcgSGFzaFNldDxDb25uZWN0aW9uPigpOwotCQlmb3IgKENvbm5lY3Rpb24gY29ubiA6IGFsbENvbnMpIHsKLQkJCWlmIChJc0FSZWxhdGlvbi5pc0lzQUNvbm5lY3Rpb24oY29ubikpIAotCQkJCXRyeSB7IAotCQkJCQlyZXMuYWRkKG5ldyBJc0FSZWxhdGlvbih0aGlzLCBjb25uKSk7Ci0JCQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJCQl0YmQuYWRkKGNvbm4pOwotCQkJCX0KLQkJfQotCQlJdGVyYXRvcjxDb25uZWN0aW9uPiBpdCA9IHRiZC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5kZWxldGVQaWN0b2dyYW1FbGVtZW50KGl0Lm5leHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JcHVibGljIEhhc2hTZXQ8SXNBUmVsYXRpb24+IGdldEFsbFJlZHVuZGFudElzQVJlbGF0aW9ucygpIHsKLQkJRUxpc3Q8Q29ubmVjdGlvbj4gYWxsQ29ucyA9IGdldERpYWdyYW0oKS5nZXRDb25uZWN0aW9ucygpOwotCQlIYXNoU2V0PElzQVJlbGF0aW9uPiByZXMgPSBuZXcgSGFzaFNldDxJc0FSZWxhdGlvbj4oKTsKLQkJZm9yIChDb25uZWN0aW9uIGNvbm4gOiBhbGxDb25zKSB7Ci0JCQlpZiAoSXNBUmVsYXRpb24uaXNJc0FDb25uZWN0aW9uKGNvbm4pKSAKLQkJCQlyZXMuYWRkKG5ldyBJc0FSZWxhdGlvbih0aGlzLCBjb25uKSk7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsUmVkdW5kYW50SXNBUmVsYXRpb25zKCkgewotCQlFTGlzdDxDb25uZWN0aW9uPiBhbGxDb25zID0gZ2V0RGlhZ3JhbSgpLmdldENvbm5lY3Rpb25zKCk7Ci0JCUNvbGxlY3Rpb248Q29ubmVjdGlvbj4gcmVkdW5kYW50Q29ubmVjdGlvbnMgPSBuZXcgTGlua2VkTGlzdDxDb25uZWN0aW9uPigpOwotCQlmb3IgKENvbm5lY3Rpb24gY29ubiA6IGFsbENvbnMpIHsKLQkJCWlmIChJc0FSZWxhdGlvbi5pc0lzQUNvbm5lY3Rpb24oY29ubikpIHsKLQkJCQlJc0FSZWxhdGlvbiByZWwgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCXJlbCA9IG5ldyBJc0FSZWxhdGlvbih0aGlzLCBjb25uKTsJCi0JCQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJCQlyZWR1bmRhbnRDb25uZWN0aW9ucy5hZGQoY29ubik7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoIXJlbC5nZXRTdXBlcmNsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscyhnZXRGaXJzdFN1cGVyY2xhc3NCZWxvbmdpbmdUb1RoZURpYWdyYW0ocmVsLmdldFN1YmNsYXNzKCkpLmdldE5hbWUoKSkpIHsKLQkJCQkJcmVkdW5kYW50Q29ubmVjdGlvbnMuYWRkKGNvbm4pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlJdGVyYXRvcjxDb25uZWN0aW9uPiBpdCA9IHJlZHVuZGFudENvbm5lY3Rpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUNvbm5lY3Rpb24gY29ubiA9IGl0Lm5leHQoKTsKLQkJCXBlU2VydmljZS5kZWxldGVQaWN0b2dyYW1FbGVtZW50KGNvbm4pOwotCQl9CQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBleGlzdFJlZHVuZGFudElzQVJlbGF0aW9ucygpIHsKLQkJRUxpc3Q8Q29ubmVjdGlvbj4gYWxsQ29ucyA9IGdldERpYWdyYW0oKS5nZXRDb25uZWN0aW9ucygpOwotCQlmb3IgKENvbm5lY3Rpb24gY29ubiA6IGFsbENvbnMpIHsKLQkJCWlmIChJc0FSZWxhdGlvbi5pc0lzQUNvbm5lY3Rpb24oY29ubikpIHsKLQkJCQlJc0FSZWxhdGlvbiByZWwgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCXJlbCA9IG5ldyBJc0FSZWxhdGlvbih0aGlzLCBjb25uKTsJCi0JCQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKCFyZWwuZ2V0U3VwZXJjbGFzcygpLmVxdWFscyhnZXRGaXJzdFN1cGVyY2xhc3NCZWxvbmdpbmdUb1RoZURpYWdyYW0ocmVsLmdldFN1YmNsYXNzKCkpKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkJCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRGaXJzdFN1cGVyY2xhc3NCZWxvbmdpbmdUb1RoZURpYWdyYW0oSmF2YVBlcnNpc3RlbnRUeXBlIHN1YmNsYXNzKSB7Ci0JCUl0ZXJhYmxlPFBlcnNpc3RlbnRUeXBlPiBoID0gc3ViY2xhc3MuZ2V0SW5oZXJpdGFuY2VIaWVyYXJjaHkoKTsKLQkJSXRlcmF0b3I8UGVyc2lzdGVudFR5cGU+IGl0ZXIgPSBoLml0ZXJhdG9yKCk7Ci0JCWlmICghaXRlci5oYXNOZXh0KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSGFzaFNldDxQZXJzaXN0ZW50VHlwZT4gY3ljbGVDaGVja2VyID0gbmV3IEhhc2hTZXQ8UGVyc2lzdGVudFR5cGU+KCk7Ci0JCWN5Y2xlQ2hlY2tlci5hZGQoaXRlci5uZXh0KCkpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVBlcnNpc3RlbnRUeXBlIHN1cGVyY2xhc3MgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChoYXNPYmplY3RXaXRoTmFtZShnZXRLZXlGb3JCdXNpbmVzc09iamVjdChzdXBlcmNsYXNzKSkpIHsKLQkJCQlyZXR1cm4gKEphdmFQZXJzaXN0ZW50VHlwZSkgc3VwZXJjbGFzczsKLQkJCX0KLQkJCWlmICghY3ljbGVDaGVja2VyLmFkZChzdXBlcmNsYXNzKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0gICAgCi0JcHVibGljIHZvaWQgYWRkSlBURm9yVXBkYXRlKFN0cmluZyBqcHROYW1lKSB7Ci0JCSgoSlBBU29sdmVyKWdldEluZGVwZW5kZW5jZVNvbHZlcigpKS5hZGRKUFRGb3JVcGRhdGUoanB0TmFtZSk7Ci0JfQotCi0gICAgCQotCXB1YmxpYyB2b2lkIGFkZFJlbW92ZUlnbm9yZShKYXZhUGVyc2lzdGVudFR5cGUganB0LCBTdHJpbmcgYXROYW1lKSB7Ci0JCSgoSlBBU29sdmVyKWdldEluZGVwZW5kZW5jZVNvbHZlcigpKS5hZGRSZW1vdmVJZ25vcmUoanB0LmdldE5hbWUoKSArICIuIiArIGF0TmFtZSk7ICAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIGFkZEFkZElnbm9yZShKYXZhUGVyc2lzdGVudFR5cGUganB0LCBTdHJpbmcgYXROYW1lKSB7Ci0JCSgoSlBBU29sdmVyKWdldEluZGVwZW5kZW5jZVNvbHZlcigpKS5hZGRBZGRJZ25vcmUoanB0LmdldE5hbWUoKSArICIuIiArIGF0TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIEhhc2hTZXQ8U3RyaW5nPiBnZXRBZGRJZ25vcmUoKSB7Ci0JCXJldHVybiAoKEpQQVNvbHZlcilnZXRJbmRlcGVuZGVuY2VTb2x2ZXIoKSkuZ2V0QWRkSWdub3JlKCk7IAotCX0KLQotCQotCXB1YmxpYyB2b2lkIGFkZEF0dHJpYkZvclVwZGF0ZShQZXJzaXN0ZW5jZVVuaXQgcHUsIFN0cmluZyBlbnRBdE1hcHBlZEJ5KSB7Ci0JCSgoSlBBU29sdmVyKWdldEluZGVwZW5kZW5jZVNvbHZlcigpKS5hZGRBdHRyaWJGb3JVcGRhdGUocHUsIGVudEF0TWFwcGVkQnkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4aXN0c1JlbGF0aW9uKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQxLCBKYXZhUGVyc2lzdGVudFR5cGUganB0MikgewotCQlyZXR1cm4gKChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkpLmV4aXN0c1JlbGF0aW9uKGpwdDEsIGpwdDIpOwotCX0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUFkZEZlYXR1cmUgZ2V0QWRkRmVhdHVyZShJQWRkQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgCU9iamVjdCBuZXdPYmogPSBjb250ZXh0LmdldE5ld09iamVjdCgpOyAKLSAgICAgICAgaWYgKG5ld09iaiBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBZGRKUEFFbnRpdHlGZWF0dXJlKHRoaXMsIHRydWUpOwotICAgICAgICB9IGVsc2UgaWYgKG5ld09iaiBpbnN0YW5jZW9mIEFic3RyYWN0UmVsYXRpb24pIHsKLSAgICAgICAgCSByZXR1cm4gbmV3IEFkZFJlbGF0aW9uRmVhdHVyZSh0aGlzKTsKLSAgICAgICAgfSBlbHNlIGlmIChuZXdPYmogaW5zdGFuY2VvZiBQZXJzaXN0ZW50QXR0cmlidXRlKSB7IAotICAgICAgICAJaWYgKERpYWdyYW0uY2xhc3MuaXNJbnN0YW5jZShjb250ZXh0LmdldFRhcmdldENvbnRhaW5lcigpKSkgeyAgICAgCQkJCi0gICAgICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgICAgIAl9IGVsc2UgewotICAgICAgICAJCXJldHVybiBuZXcgQWRkQXR0cmlidXRlRmVhdHVyZSh0aGlzKTsKLSAgICAgICAgCX0KLSAgICAgICAgfSBlbHNlIGlmIChuZXdPYmogaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgCUNvbXBpbGF0aW9uVW5pdCBjdSA9IChDb21waWxhdGlvblVuaXQpbmV3T2JqOwotICAgICAgICAJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IEpQQUVkaXRvclV0aWwuZ2V0SlBUeXBlKGN1KTsKLSAgICAgICAgCWlmIChqcHQgIT0gbnVsbCkgcmV0dXJuIG5ldyBBZGRKUEFFbnRpdHlGZWF0dXJlKHRoaXMsIHRydWUpOwotICAgICAgICB9IGVsc2UgaWYgKChuZXdPYmogaW5zdGFuY2VvZiBKcGFOb2RlKSkgewotICAgICAgICAJcmV0dXJuIG5ldyBBZGRBbGxFbnRpdGllc0ZlYXR1cmUodGhpcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAobmV3T2JqIGluc3RhbmNlb2YgU291cmNlVHlwZSkgewotICAgICAgICAJcmV0dXJuIG5ldyBBZGRKUEFFbnRpdHlGZWF0dXJlKHRoaXMsIHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRBZGRGZWF0dXJlKGNvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUNyZWF0ZUZlYXR1cmVbXSBnZXRDcmVhdGVGZWF0dXJlcygpIHsKLSAgICAJcmV0dXJuIG5ldyBJQ3JlYXRlRmVhdHVyZVtdIHtuZXcgQ3JlYXRlSlBBRW50aXR5RmVhdHVyZSh0aGlzKSwgCi0gICAgCQkJCQkJCQkgbmV3IENyZWF0ZU1hcHBlZFN1cGVyY2xhc3NGZWF0dXJlKHRoaXMpfTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIElEZWxldGVGZWF0dXJlIGdldERlbGV0ZUZlYXR1cmUoSURlbGV0ZUNvbnRleHQgY29udGV4dCkgewotICAgIAlQaWN0b2dyYW1FbGVtZW50IHBlID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50KCk7Ci0gICAgCU9iamVjdCBibyA9IGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSk7Ci0gICAgCWlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotICAgIAkJcmV0dXJuIG5ldyBEZWxldGVKUEFFbnRpdHlGZWF0dXJlKHRoaXMpOwkKLSAgICAJfSBlbHNlIGlmIChibyBpbnN0YW5jZW9mIEFic3RyYWN0UmVsYXRpb24pIHsKLSAgICAJCXJldHVybiBuZXcgRGVsZXRlUmVsYXRpb25GZWF0dXJlKHRoaXMpOwotICAgIAl9IGVsc2UgaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLSAgICAJCXJldHVybiBuZXcgQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlKHRoaXMpOwotICAgIAl9Ci0JCXJldHVybiBudWxsOwotCX0gICAgCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUN1c3RvbUZlYXR1cmVbXSBnZXRDdXN0b21GZWF0dXJlcyhJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCUlDdXN0b21GZWF0dXJlW10gcmV0ID0gc3VwZXIuZ2V0Q3VzdG9tRmVhdHVyZXMoY29udGV4dCk7Ci0JCUxpc3Q8SUN1c3RvbUZlYXR1cmU+IHJldExpc3QgPSBuZXcgQXJyYXlMaXN0PElDdXN0b21GZWF0dXJlPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJldC5sZW5ndGg7IGkrKykgewotCQkJcmV0TGlzdC5hZGQocmV0W2ldKTsKLQkJfQotCQkKLQkJcmV0TGlzdC5hZGQobmV3IENvbGxhcHNlQWxsRW50aXRpZXNGZWF0dXJlKHRoaXMpKTsKLQotCQlyZXRMaXN0LmFkZChuZXcgQ29sbGFwc2VFbnRpdHlGZWF0dXJlKHRoaXMpKTsKLQkJcmV0TGlzdC5hZGQobmV3IEV4cGFuZEVudGl0eUZlYXR1cmUodGhpcykpOwotCQotCQlyZXRMaXN0LmFkZChuZXcgQ29sbGFwc2VDb21wYXJ0bWVudFNoYXBlRmVhdHVyZSh0aGlzKSk7Ci0JCXJldExpc3QuYWRkKG5ldyBFeHBhbmRDb21wYXJ0bWVudFNoYXBlRmVhdHVyZSh0aGlzKSk7Ci0JCQotCQlyZXQgPSByZXRMaXN0LnRvQXJyYXkocmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0gICAgCi0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElSZXNpemVTaGFwZUZlYXR1cmUgZ2V0UmVzaXplU2hhcGVGZWF0dXJlKElSZXNpemVTaGFwZUNvbnRleHQgY29udGV4dCkgewotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50KCk7Ci0JCWlmIChnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSB7Ci0JCQlyZXR1cm4gbmV3IFJlc2l6ZUpQQUVudGl0eUZlYXR1cmUodGhpcyk7Ci0JCX0KLSAgICAJR3JhcGhpY3NBbGdvcml0aG0gZ2EgPSBwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotICAgIAlpZiAoZ2EgPT0gbnVsbCkgCi0gICAgCQlyZXR1cm4gc3VwZXIuZ2V0UmVzaXplU2hhcGVGZWF0dXJlKGNvbnRleHQpOwotICAgIAlMaXN0PEdyYXBoaWNzQWxnb3JpdGhtPiBjaCA9IGdhLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKTsKLSAgICAJaWYgKChjaCAhPSBudWxsKSAmJiAoY2guc2l6ZSgpID4gMCkgJiYgKGNoLmdldCgwKSBpbnN0YW5jZW9mIFRleHQpKSB7Ci0gICAgCQlyZXR1cm4gbmV3IFJlc2l6ZUF0dHJpYnV0ZUZlYXR1cmUodGhpcyk7Ci0gICAgCX0KLQkJCi0JCXJldHVybiBzdXBlci5nZXRSZXNpemVTaGFwZUZlYXR1cmUoY29udGV4dCk7Ci0gICAgfQotICAgICAgCi0gICAgCi0gICAKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUxheW91dEZlYXR1cmUgZ2V0TGF5b3V0RmVhdHVyZShJTGF5b3V0Q29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFBpY3RvZ3JhbUVsZW1lbnQgcGljdG9ncmFtRWxlbWVudCA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudCgpOwotICAgICAgICBPYmplY3QgYm8gPSBnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGljdG9ncmFtRWxlbWVudCk7Ci0gICAgICAgIGlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBMYXlvdXRKUEFFbnRpdHlGZWF0dXJlKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRMYXlvdXRGZWF0dXJlKGNvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVJlbW92ZUZlYXR1cmUgZ2V0UmVtb3ZlRmVhdHVyZShJUmVtb3ZlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAgICAgT2JqZWN0IGJvID0gZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsgICAKLSAgICAgICAgaWYgKGJvID09IG51bGwpCi0gICAgICAgIAlzdXBlci5nZXRSZW1vdmVGZWF0dXJlKGNvbnRleHQpOwotICAgIAlpZiAoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLSAgICAJCXJldHVybiBuZXcgUmVtb3ZlSlBBRW50aXR5RmVhdHVyZSh0aGlzLCB0cnVlKTsJCi0gICAgCX0gZWxzZSBpZiAoYm8gaW5zdGFuY2VvZiBBYnN0cmFjdFJlbGF0aW9uKSB7IAotICAgIAkJcmV0dXJuIG5ldyBSZW1vdmVSZWxhdGlvbkZlYXR1cmUodGhpcyk7Ci0gICAgCX0KLSAgICAJR3JhcGhpY3NBbGdvcml0aG0gZ2EgPSBwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotICAgIAlpZiAoZ2EgPT0gbnVsbCkgCi0gICAgCQlyZXR1cm4gc3VwZXIuZ2V0UmVtb3ZlRmVhdHVyZShjb250ZXh0KTsKLSAgICAJTGlzdDxHcmFwaGljc0FsZ29yaXRobT4gY2ggPSBnYS5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCk7Ci0gICAgCWlmICgoY2ggIT0gbnVsbCkgJiYgKGNoLnNpemUoKSA+IDApICYmIChjaC5nZXQoMCkgaW5zdGFuY2VvZiBUZXh0KSkgewotICAgIAkJcmV0dXJuIG5ldyBSZW1vdmVBdHRyaWJ1dGVGZWF0dXJlKHRoaXMpOwotICAgIAl9Ci0gICAgCXJldHVybiBzdXBlci5nZXRSZW1vdmVGZWF0dXJlKGNvbnRleHQpOwotICAgIH0KLSAgICAgICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElDcmVhdGVDb25uZWN0aW9uRmVhdHVyZVtdIGdldENyZWF0ZUNvbm5lY3Rpb25GZWF0dXJlcygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJQ3JlYXRlQ29ubmVjdGlvbkZlYXR1cmVbXSB7Ci0gICAgICAgIAluZXcgQ3JlYXRlT25lVG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmUodGhpcyksCi0gICAgICAgICAgICBuZXcgQ3JlYXRlT25lVG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZSh0aGlzKSwgICAgICAgICAgIAotICAgICAgICAJbmV3IENyZWF0ZU9uZVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZSh0aGlzKSwgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAJbmV3IENyZWF0ZU1hbnlUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZSh0aGlzKSwKLSAgICAgICAgICAgIG5ldyBDcmVhdGVNYW55VG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZSh0aGlzKSwgICAgICAgICAgICAKLSAgICAgICAgCW5ldyBDcmVhdGVNYW55VG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlKHRoaXMpLAotICAgICAgICAgICAgbmV3IENyZWF0ZU1hbnlUb01hbnlCaURpclJlbGF0aW9uRmVhdHVyZSh0aGlzKQotICAgICAgICB9OwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVJlYXNvbiBjYW5BZGQoSUFkZENvbnRleHQgY29udGV4dCkgewotICAgIAlyZXR1cm4gUmVhc29uLmNyZWF0ZVRydWVSZWFzb24oKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElDdXN0b21GZWF0dXJlIGdldEFkZEFsbEVudGl0aWVzRmVhdHVyZSgpIHsKLSAgICAJcmV0dXJuIG5ldyBBZGRBbGxFbnRpdGllc0ZlYXR1cmUodGhpcyk7IAotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1vdmVTaGFwZUZlYXR1cmUgZ2V0TW92ZVNoYXBlRmVhdHVyZShJTW92ZVNoYXBlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAgICAgT2JqZWN0IGJvID0gZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLSAgICAgICAgaWYgKEphdmFQZXJzaXN0ZW50VHlwZS5jbGFzcy5pc0luc3RhbmNlKGJvKSkgewotICAgICAgICAJcmV0dXJuIG5ldyBNb3ZlRW50aXR5U2hhcGVGZWF0dXJlKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIGlmKGJvID09IG51bGwpewotICAgIAkJcmV0dXJuIG5ldyBNb3ZlQXR0cmlidXRlRmVhdHVyZSh0aGlzKTsKLSAgICAgICAgfSAKLSAgICAJR3JhcGhpY3NBbGdvcml0aG0gZ2EgPSBwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotICAgIAlpZiAoZ2EgPT0gbnVsbCkgCi0gICAgCQlyZXR1cm4gc3VwZXIuZ2V0TW92ZVNoYXBlRmVhdHVyZShjb250ZXh0KTsKLSAgICAJTGlzdDxHcmFwaGljc0FsZ29yaXRobT4gY2ggPSBnYS5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCk7Ci0gICAgCWlmICgoY2ggIT0gbnVsbCkgJiYgKGNoLnNpemUoKSA+IDApICYmIChjaC5nZXQoMCkgaW5zdGFuY2VvZiBUZXh0KSkgewotICAgIAkJcmV0dXJuIG5ldyBNb3ZlQXR0cmlidXRlRmVhdHVyZSh0aGlzKTsKLSAgICAJfQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TW92ZVNoYXBlRmVhdHVyZShjb250ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElEaXJlY3RFZGl0aW5nRmVhdHVyZSBnZXREaXJlY3RFZGl0aW5nRmVhdHVyZShJRGlyZWN0RWRpdGluZ0NvbnRleHQgY29udGV4dCkgewotICAgICAgICBQaWN0b2dyYW1FbGVtZW50IHBlID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50KCk7Ci0gICAgICAgIEdyYXBoaWNzQWxnb3JpdGhtIGdhID0gcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLSAgICAgICAgaWYgKCEoZ2EgaW5zdGFuY2VvZiBSZWN0YW5nbGUpKSAKLSAgICAgICAgCXJldHVybiBzdXBlci5nZXREaXJlY3RFZGl0aW5nRmVhdHVyZShjb250ZXh0KTsKLSAgICAgICAgTGlzdDxHcmFwaGljc0FsZ29yaXRobT4gY2ggPSBnYS5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCk7Ci0gICAgICAgIGlmICgoY2ggPT0gbnVsbCkgfHwgKGNoLnNpemUoKSA9PSAwKSkgCi0gICAgICAgIAlyZXR1cm4gc3VwZXIuZ2V0RGlyZWN0RWRpdGluZ0ZlYXR1cmUoY29udGV4dCk7Ci0gICAgICAgIGdhID0gY2guZ2V0KDApOwotICAgICAgICBpZiAoIShnYSBpbnN0YW5jZW9mIFRleHQpKSAKLSAgICAgICAgCXJldHVybiBzdXBlci5nZXREaXJlY3RFZGl0aW5nRmVhdHVyZShjb250ZXh0KTsKLSAgICAgICAgaWYoKChUZXh0KWdhKS5nZXRGb250KCkuaXNJdGFsaWMoKSkKLSAgICAJCXJldHVybiBzdXBlci5nZXREaXJlY3RFZGl0aW5nRmVhdHVyZShjb250ZXh0KTsKLSAgICAgICAgT2JqZWN0IGJvID0gZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLSAgICAgICAgaWYgKGJvICE9IG51bGwpIHsKLSAgICAgICAgCWlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0gICAgICAgIAkJcmV0dXJuIG5ldyBEaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZSh0aGlzKTsKLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgICAgICBpZiAoIShwZSBpbnN0YW5jZW9mIFNoYXBlKSkgCi0gICAgICAgIAlyZXR1cm4gc3VwZXIuZ2V0RGlyZWN0RWRpdGluZ0ZlYXR1cmUoY29udGV4dCk7Ci0gICAgICAgIFNoYXBlIHNoID0gKFNoYXBlKXBlOwotICAgICAgICBDb250YWluZXJTaGFwZSBjc2ggPSBzaC5nZXRDb250YWluZXIoKTsKLSAgICAgICAgaWYgKGNzaCA9PSBudWxsKSAKLSAgICAgICAgCXJldHVybiBzdXBlci5nZXREaXJlY3RFZGl0aW5nRmVhdHVyZShjb250ZXh0KTsgCi0gICAgICAgIGJvID0gZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNzaCk7Ci0gICAgICAgIGlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSl7IAotICAgICAgICAgICAgcmV0dXJuIG5ldyBEaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZSh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RGlyZWN0RWRpdGluZ0ZlYXR1cmUoY29udGV4dCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZE1pc3NpbmdSZWxhdGlvbnMoSmF2YVBlcnNpc3RlbnRUeXBlIG5ld0VudGl0eSwgQ29udGFpbmVyU2hhcGUgbmV3U2hhcGUpIHsKLSAgICAgICAgQ29sbGVjdGlvbjxQaWN0b2dyYW1FbGVtZW50PiBhbGxDb250YWluZWRQaWN0b2dyYW1FbGVtZW50cyA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpCi0gICAgICAgIC5nZXRBbGxDb250YWluZWRQaWN0b2dyYW1FbGVtZW50cyhnZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbSgpKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoUGljdG9ncmFtRWxlbWVudCBwZSA6IGFsbENvbnRhaW5lZFBpY3RvZ3JhbUVsZW1lbnRzKSB7Ci0gICAgICAgIAlpZiAoKHBlICE9IG5ld1NoYXBlKSAmJiAocGUgaW5zdGFuY2VvZiBDb250YWluZXJTaGFwZSkpIHsKLSAgICAgICAgCQlKYXZhUGVyc2lzdGVudFR5cGUgZW50aXR5ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotICAgICAgICAJCUFic3RyYWN0UmVsYXRpb24gbmV3UmVsID0gcHJvZHVjZU5lY2Vzc2FyeVJlbGF0aW9uKG5ld0VudGl0eSwgZW50aXR5KTsKLSAgICAgICAgCQlpZiAobmV3UmVsICE9IG51bGwpIHsKLSAgICAgICAgCQkJSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyID0gbmV3UmVsLmdldE93bmVyKCk7Ci0gICAgICAgIAkJCUphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlID0gbmV3UmVsLmdldEludmVyc2UoKTsKLSAgICAgICAgCQkJQ29udGFpbmVyU2hhcGUgb3duZXJTaGFwZSA9IChDb250YWluZXJTaGFwZSlnZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3Qob3duZXIpOwotICAgICAgICAJCQlDb250YWluZXJTaGFwZSBpbnZlcnNlU2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGludmVyc2UpOwotICAgICAgICAgCQkJQWRkUmVsYXRpb25GZWF0dXJlIGYgPSBuZXcgQWRkUmVsYXRpb25GZWF0dXJlKHRoaXMpOwotICAgICAgICAJCQlBZGRDb25uZWN0aW9uQ29udGV4dCBjdHggPSAKLSAgICAgICAgCQkJCW5ldyBBZGRDb25uZWN0aW9uQ29udGV4dChKUEFFZGl0b3JVdGlsLmdldEFuY2hvcihvd25lclNoYXBlKSwgSlBBRWRpdG9yVXRpbC5nZXRBbmNob3IoaW52ZXJzZVNoYXBlKSk7Ci0gICAgICAgIAkJCWYuYWRkKGN0eCk7Ci0gICAgICAgIAkJfQotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgfQotICAgIAotCXB1YmxpYyB2b2lkIHJlbmV3QXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlMaXN0ZW5lcihKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJKChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkpLnJlbmV3QXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlMaXN0ZW5lcihqcGEpOwotCX0KLSAgICAgICAgCi0gICAgcHJpdmF0ZSBBYnN0cmFjdFJlbGF0aW9uIHByb2R1Y2VOZWNlc3NhcnlSZWxhdGlvbihKYXZhUGVyc2lzdGVudFR5cGUgZW50MSwgSmF2YVBlcnNpc3RlbnRUeXBlIGVudDIpIHsKLSAgICAJcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotCXB1YmxpYyBTdHJpbmcgcHJvZHVjZUtleUZvclJlbChKYXZhUGVyc2lzdGVudFR5cGUganB0LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gKChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkpLnByb2R1Y2VLZXlGb3JSZWwoanB0LCBhdHRyaWJ1dGVOYW1lKTsKLQl9Ci0KLSAgICAKLSAgICBwdWJsaWMgQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlIGdldENsaWNrQWRkQXR0cmlidXRlQnV0dG9uRmVhdHVyZSgpIHsKLSAgICAJaWYgKGNsaWNrQWRkQXR0QnRuRmVhdCA9PSBudWxsKSB7Ci0gICAgCQljbGlja0FkZEF0dEJ0bkZlYXQgPSBuZXcgQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlKHRoaXMpOwotICAgIAl9Ci0gICAgCXJldHVybiBjbGlja0FkZEF0dEJ0bkZlYXQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUgZ2V0Q2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlKCkgewotICAgIAlpZiAoY2xpY2tSZW1vdmVBdHRCdG5GZWF0ID09IG51bGwpIHsKLSAgICAJCWNsaWNrUmVtb3ZlQXR0QnRuRmVhdCA9IG5ldyBDbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUodGhpcyk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIGNsaWNrUmVtb3ZlQXR0QnRuRmVhdDsKLSAgICB9ICAgIAotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTW92ZUNvbm5lY3Rpb25EZWNvcmF0b3JGZWF0dXJlIGdldE1vdmVDb25uZWN0aW9uRGVjb3JhdG9yRmVhdHVyZSgKLSAgICAJCUlNb3ZlQ29ubmVjdGlvbkRlY29yYXRvckNvbnRleHQgY29udGV4dCkgewotICAgICAgCSByZXR1cm4gbmV3IEpQQU1vdmVDb25uZWN0aW9uRGVjb3JhdG9yRmVhdHVyZSh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJ1c2luZXNzT2JqZWN0Rm9yS2V5KFN0cmluZyBrZXkpIHsKLSAgICAJcmV0dXJuIGdldEluZGVwZW5kZW5jZVNvbHZlcigpLmdldEJ1c2luZXNzT2JqZWN0Rm9yS2V5KGtleSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5Rm9yQnVzaW5lc3NPYmplY3QoT2JqZWN0IGJvKSB7Ci0gICAgCXJldHVybiBnZXRJbmRlcGVuZGVuY2VTb2x2ZXIoKS5nZXRLZXlGb3JCdXNpbmVzc09iamVjdChibyk7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBwdXRLZXlUb0J1c2luZXNzT2JqZWN0KFN0cmluZyBrZXksIE9iamVjdCBibykgewotICAgIAkoKEpQQVNvbHZlcilnZXRJbmRlcGVuZGVuY2VTb2x2ZXIoKSkuYWRkS2V5QnVzaW5lc3NPYmplY3Qoa2V5LCBibyk7Ci0gICAgfSAgCi0gICAgCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoU3RyaW5nIGtleSkgewotICAgIAlyZXR1cm4gcmVtb3ZlKGtleSwgZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShTdHJpbmcga2V5LCBib29sZWFuIHNhdmUpIHsKLSAgICAJT2JqZWN0IHJlcyA9IGdldEJ1c2luZXNzT2JqZWN0Rm9yS2V5KGtleSk7Ci0gICAgCWlmIChyZXMgaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLSAgICAJCWZpbmFsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKXJlczsKLSAgICAJCWlmIChzYXZlKQotICAgIAkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmZvcmNlU2F2ZUVudGl0eUNsYXNzKGpwdCwgdGhpcyk7Ci0gICAgCQlpZighKGpwdC5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhRW50aXR5KSl7Ci0gICAgCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgIAkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgCQkJICAgICAgICAgIHJlbW92ZUZyb21EaWFncmFtSWZOb3RFbnRpdHkoanB0KTsKLSAgICAJCQkJfX0pOwotICAgIAkJfQotCi0gICAgCX0KLSAgICAJcmV0dXJuICgoSlBBU29sdmVyKWdldEluZGVwZW5kZW5jZVNvbHZlcigpKS5yZW1vdmUoa2V5KTsKLSAgICB9ICAgIAotICAgIAotICAgIHB1YmxpYyBDb2xsZWN0aW9uPEphdmFQZXJzaXN0ZW50VHlwZT4gZ2V0UGVyc2lzdGVudFR5cGVzKCkgewotICAgIAlyZXR1cm4gKChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkpLmdldFBlcnNpc3RlbnRUeXBlcygpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbGxDb25uZWN0aW9ucyhTaGFwZSBzaGFwZSkgewotCQlmb3IgKEl0ZXJhdG9yPEFuY2hvcj4gaXRlciA9IHNoYXBlLmdldEFuY2hvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFuY2hvciBhbmNob3IgPSBpdGVyLm5leHQoKTsKLQkJCWZvciAoSXRlcmF0b3I8Q29ubmVjdGlvbj4gaXRlcmF0b3IgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRBbGxDb25uZWN0aW9ucyhhbmNob3IpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKEdyYXBoaXRpSW50ZXJuYWwuZ2V0RW1mU2VydmljZSgpLmlzT2JqZWN0QWxpdmUoY29ubmVjdGlvbikpIHsKLSAJCQkJCU9iamVjdCBvYiA9IGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChjb25uZWN0aW9uKTsKLQkJCQkJCWlmKG9iIGluc3RhbmNlb2YgQWJzdHJhY3RSZWxhdGlvbil7Ci0JCQkJCQkJU3RyaW5nIGtleSA9IGdldEtleUZvckJ1c2luZXNzT2JqZWN0KG9iKTsKLQkJCQkJCQkoKEpQQVNvbHZlcilnZXRJbmRlcGVuZGVuY2VTb2x2ZXIoKSkucmVtb3ZlKGtleSk7Ci0JCQkJCQl9Ci0JCQkJCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLmRlbGV0ZVBpY3RvZ3JhbUVsZW1lbnQoY29ubmVjdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUZyb21EaWFncmFtSWZOb3RFbnRpdHkoZmluYWwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlmaW5hbCBQaWN0b2dyYW1FbGVtZW50IGNzID0gdGhpcy5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoanB0KTsKLQkJaWYgKGNzICE9IG51bGwpIHsKLQkJCWZpbmFsIFNoYXBlIHNoYXBlID0gKFNoYXBlKSBjczsKLQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKHRoaXMKLQkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCkpOwotCQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCQlyZW1vdmVBbGxDb25uZWN0aW9ucyhzaGFwZSk7Ci0JCQkJCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLmRlbGV0ZVBpY3RvZ3JhbUVsZW1lbnQoY3MpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNPYmplY3RXaXRoTmFtZShTdHJpbmcgbmFtZSkgewotICAgIAlyZXR1cm4gKChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkpLmNvbnRhaW5zS2V5KG5hbWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZXBsYWNlQXR0cmlidXRlKGZpbmFsIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG9sZEF0LCBmaW5hbCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBuZXdBdCkgewotICAgIAlmaW5hbCBQaWN0b2dyYW1FbGVtZW50IHBlID0gdGhpcy5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3Qob2xkQXQpOwotICAgIAlpZiAocGUgPT0gbnVsbCkgewotICAgIAkJLy9TeXN0ZW0uZXJyLnByaW50bG4oIlBpY3RvZ3JhbUVsZW1lbnQgaXMgbnVsbFxuIik7Ci0gICAgCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOyAgICAJCQotICAgIAkJLy9yZXR1cm47Ci0gICAgCX0KLSAgICAJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4ocGUpOwotICAgIAl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJICAgIAlKUEFTb2x2ZXIgc29sdmVyID0gKEpQQVNvbHZlcilnZXRJbmRlcGVuZGVuY2VTb2x2ZXIoKTsgCi0JCSAgICAJc29sdmVyLnJlbW92ZShzb2x2ZXIuZ2V0S2V5Rm9yQnVzaW5lc3NPYmplY3Qob2xkQXQpKTsKLQkJICAgIAlzb2x2ZXIuYWRkS2V5QnVzaW5lc3NPYmplY3Qoc29sdmVyLmdldEtleUZvckJ1c2luZXNzT2JqZWN0KG5ld0F0KSwgbmV3QXQpOwotCQkgICAgCWlmIChuZXdBdCA9PSBudWxsKSB7Ci0JCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIk5ldyBhdHRyaWJ1dGUgaXMgbnVsbFxuIiwgbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkgICAgCQlyZXR1cm47Ci0JCSAgICAJfQotCQkgICAgCWxpbmsocGUsIG5ld0F0KTsKLQkJICAgIAlHcmFwaGljc0FsZ29yaXRobSBnYSA9IHBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCSAgICAJaWYgKGdhID09IG51bGwpCi0JCSAgICAJCXJldHVybjsKLQkJICAgIAlMaXN0PEdyYXBoaWNzQWxnb3JpdGhtPiBjaCA9IGdhLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKTsKLQkJICAgIAkoKFRleHQpY2guZ2V0KDApKS5zZXRWYWx1ZShuZXdBdC5nZXROYW1lKCkpOwotCQkJfQotICAgIAl9KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gZG9lc1JlbGF0aW9uRXhpc3QoSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyLCAKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlLCAKLQkJCVN0cmluZyBvd25lckF0dHJpYnV0ZU5hbWUsCi0JCQlSZWxUeXBlIHJlbFR5cGUsIAotCQkJUmVsRGlyIHJlbERpcikgewotICAgIAkKLSAgICAJU3RyaW5nIGlkID0gQWJzdHJhY3RSZWxhdGlvbi5nZW5lcmF0ZUlkKG93bmVyLCBpbnZlcnNlLCBvd25lckF0dHJpYnV0ZU5hbWUsIHJlbFR5cGUsIHJlbERpcik7Ci0gICAgCXJldHVybiAoZ2V0QnVzaW5lc3NPYmplY3RGb3JLZXkoaWQpICE9IG51bGwpOwotICAgIH0gICAKLSAgICAKLQlwdWJsaWMgYm9vbGVhbiBpc1JlbGF0aW9uUmVsYXRlZFRvQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSkgewotCQlyZXR1cm4gKChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkpLmlzUmVsYXRpb25SZWxhdGVkVG9BdHRyaWJ1dGUoanBhKTsKLQl9Ci0JCi0JcHVibGljIElSZWxhdGlvbiBnZXRSZWxhdGlvblJlbGF0ZWRUb0F0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJcmV0dXJuICgoSlBBU29sdmVyKWdldEluZGVwZW5kZW5jZVNvbHZlcigpKS5nZXRSZWxhdGlvblJlbGF0ZWRUb0F0dHJpYnV0ZShqcGEpOwotCX0gICAgCi0JCQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdChKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCXJldHVybiAoKEpQQVNvbHZlcilnZXRJbmRlcGVuZGVuY2VTb2x2ZXIoKSkuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzdG9yZUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCSgoSlBBU29sdmVyKWdldEluZGVwZW5kZW5jZVNvbHZlcigpKS5yZXN0b3JlRW50aXR5KGpwdCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0QXR0cmlic051bShTaGFwZSBzaCkgewotCQlTdHJpbmcgcyA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUoc2gsIEpQQUVkaXRvckNvbnN0YW50cy5QUk9QX0FUVFJJQlNfTlVNKTsKLQkJaW50IHJlcyA9IDA7Ci0JCWlmIChzID09IG51bGwpIHsKLQkJCXNldEF0dHJpYnNOdW0oMCwgc2gpOwotCQl9IGVsc2UgewotCQkJcmVzID0gSW50ZWdlci5wYXJzZUludChzKTsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQkKLQlwdWJsaWMgaW50IGluY3JlYXNlQXR0cmlic051bShTaGFwZSBzaCkgewotCQlpbnQgYXR0cmlic051bSA9IGdldEF0dHJpYnNOdW0oc2gpOwotCQlhdHRyaWJzTnVtKys7Ci0JCXNldEF0dHJpYnNOdW0oYXR0cmlic051bSwgc2gpOwotCQlyZXR1cm4gYXR0cmlic051bTsKLQl9Ci0JCi0JcHVibGljIGludCBkZWNyZWFzZUF0dHJpYnNOdW0oU2hhcGUgc2gpIHsKLQkJaW50IGF0dHJpYnNOdW0gPSBnZXRBdHRyaWJzTnVtKHNoKTsKLQkJYXR0cmlic051bS0tOwotCQlzZXRBdHRyaWJzTnVtKGF0dHJpYnNOdW0sIHNoKTsKLQkJcmV0dXJuIGF0dHJpYnNOdW07Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJzTnVtKGludCBuZXdBdHRyaWJzTnVtLCBTaGFwZSBzaCkgewotCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5zZXRQcm9wZXJ0eVZhbHVlKHNoLCBKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9BVFRSSUJTX05VTSwgIiIgKyBuZXdBdHRyaWJzTnVtKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKgotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlT3BlcmF0aW9uPiBnZXRBZmZlY3RlZFBhcnRpdGlvbnNGb3JNb2RpZmljYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgSGFzaFNldDxSZXNvdXJjZU9wZXJhdGlvbj4oKTsKLQl9Ci0JKi8KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN0b3BUaHJlYWQoKTsKLQkJKChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkpLmRpc3Bvc2UoKTsKLQkJc2V0SW5kZXBlbmRlbmNlU29sdmVyKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgSVBlU2VydmljZSBnZXRQZVNlcnZpY2UoKSB7Ci0JCXJldHVybiBwZVNlcnZpY2U7Ci0JfQotCi0JcHVibGljIElQZVNlcnZpY2VVdGlsIGdldFBlU2VydmljZVV0aWwoKSB7Ci0JCXJldHVybiBwZVNlcnZpY2VVdGlsOwotCX0KLQkKLQlwdWJsaWMgSUpQQUVkaXRvclV0aWwgZ2V0SlBBRWRpdG9yVXRpbCgpIHsKLQkJcmV0dXJuIHRoaXMuanBhRWRpdG9yVXRpbDsKLQl9Ci0JCi0JcHVibGljIElNb2RlbEludGVncmF0aW9uVXRpbCBnZXRNb2luSW50ZWdyYXRpb25VdGlsKCkgewotCQlyZXR1cm4gbW9pbkludGVncmF0aW9uVXRpbDsKLQl9Ci0JCi0JcHVibGljIElHcmFwaGljc1VwZGF0ZXIgZ2V0R3JhcGhpY3NVcGRhdGVyKCkgewotCQlyZXR1cm4gZ3JhcGhpY3NVcGRhdGVyOwotCX0KLQotCXB1YmxpYyBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbigpIHsKLQkJRGlhZ3JhbSBkaWFncmFtID0gZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW0oKTsKLQkJcmV0dXJuIFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGRpYWdyYW0pOwotCX0KLQkKLQlwdWJsaWMgUGljdG9ncmFtRWxlbWVudCBnZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoT2JqZWN0IGJ1c2luZXNzT2JqZWN0KSB7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBzdXBlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoYnVzaW5lc3NPYmplY3QpOwotCQkvKgotCQlpbnQgY250ID0gMDsKLQkJd2hpbGUgKChwZSA9PSBudWxsKSAmJiAoY250IDwgMjApKSB7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibG9vcCIpOwotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMjUwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibG9vcDsgaGM6IiArIGJ1c2luZXNzT2JqZWN0Lmhhc2hDb2RlKCkpOwotCQkJcGUgPSBzdXBlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoYnVzaW5lc3NPYmplY3QpOwotCQkJY250Kys7Ci0JCX0KLQkJaWYgKHBlID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRlAgLSBQRSBpcyBudWxsOyBoYzoiICsgYnVzaW5lc3NPYmplY3QuaGFzaENvZGUoKSk7Ci0JCX0KLQkJKi8KLQkJcmV0dXJuIHBlOwotCX0KLQkKLQlwdWJsaWMgUHJvcGVydGllcyBsb2FkUHJvcGVydGllcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmxvYWRQcm9wZXJ0aWVzKHByb2plY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckltYWdlQ3JlYXRvci5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckltYWdlQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjhmNGRjLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9KUEFFZGl0b3JJbWFnZUNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLaXJpbCBNaXRvdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5Qb2x5bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5zdHlsZXMuTGluZVN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb25EZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRnJlZUZvcm1Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnNlcnZpY2VzLkdyYXBoaXRpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnV0aWwuSUNvbG9yQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLQotcHVibGljIGNsYXNzIEpQQUVkaXRvckltYWdlQ3JlYXRvciBpbXBsZW1lbnRzIElKUEFFZGl0b3JJbWFnZUNyZWF0b3IgewotCi0JcHVibGljIFBvbHlsaW5lIGNyZWF0ZUNvbm5lY3Rpb25MaW5lKERpYWdyYW0gZCwgQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCVBvbHlsaW5lIHBvbHlsaW5lID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlUG9seWxpbmUoY29ubmVjdGlvbik7Ci0JCXBvbHlsaW5lLnNldEZvcmVncm91bmQoR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkubWFuYWdlQ29sb3IoZCwgSlBBRWRpdG9yQ29uc3RhbnRzLkNPTk5FQ1RJT05fTElORV9DT0xPUikpOwotCQlwb2x5bGluZS5zZXRMaW5lV2lkdGgoSlBBRWRpdG9yQ29uc3RhbnRzLkNPTk5FQ1RJT05fTElORV9XSURUSCk7Ci0JCXJldHVybiBwb2x5bGluZTsKLQl9Ci0KLQlwdWJsaWMgUG9seWxpbmUgY3JlYXRlSXNBQ29ubmVjdGlvbkxpbmUoRGlhZ3JhbSBkLCBDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJUG9seWxpbmUgcG9seWxpbmUgPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVQb2x5bGluZShjb25uZWN0aW9uKTsKLQkJcG9seWxpbmUuc2V0Rm9yZWdyb3VuZChHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5tYW5hZ2VDb2xvcihkLCBKUEFFZGl0b3JDb25zdGFudHMuSVNfQV9DT05ORUNUSU9OX0xJTkVfQ09MT1IpKTsKLQkJcG9seWxpbmUuc2V0TGluZVdpZHRoKEpQQUVkaXRvckNvbnN0YW50cy5JU19BX0NPTk5FQ1RJT05fTElORV9XSURUSCk7Ci0JCXBvbHlsaW5lLnNldExpbmVTdHlsZShMaW5lU3R5bGUuREFTSCk7Ci0JCXJldHVybiBwb2x5bGluZTsKLQl9Ci0JCQotCXB1YmxpYyBDb25uZWN0aW9uRGVjb3JhdG9yIGNyZWF0ZUNhcmRpbmFsaXR5Q29ubmVjdGlvbkRlY29yYXRvcihEaWFncmFtIGQsIENvbm5lY3Rpb24gYywgU3RyaW5nIHRleHQsIGRvdWJsZSBsb2NhdGlvbikgewotCQlDb25uZWN0aW9uRGVjb3JhdG9yIHRleHREZWNvcmF0b3IgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVDb25uZWN0aW9uRGVjb3JhdG9yKGMsIHRydWUsIGxvY2F0aW9uLCB0cnVlKTsKLQkJVGV4dCB0eHQgPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVEZWZhdWx0VGV4dChkLCB0ZXh0RGVjb3JhdG9yKTsKLQkJdHh0LnNldExpbmVXaWR0aChKUEFFZGl0b3JDb25zdGFudHMuQ09OTkVDVElPTl9MSU5FX1dJRFRIKTsKLQkJdHh0LnNldFZhbHVlKHRleHQpOwotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5tYW5hZ2VDb2xvcihjLmdldFBhcmVudCgpLCBJQ29sb3JDb25zdGFudC5CTEFDSyk7Ci0JCVBvaW50IHB0ID0gSlBBRWRpdG9yVXRpbC5yZWNhbGNUZXh0RGVjb3JhdG9yUG9zaXRpb24oKEZyZWVGb3JtQ29ubmVjdGlvbiljLCB0ZXh0RGVjb3JhdG9yKTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb24odHh0LCBwdC54LCBwdC55LCBmYWxzZSk7Ci0JCXJldHVybiB0ZXh0RGVjb3JhdG9yOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uRGVjb3JhdG9yIGNyZWF0ZUFycm93Q29ubmVjdGlvbkRlY29yYXRvcihDb25uZWN0aW9uIGNvbm5lY3Rpb24sIAotCQkJCQkJCQkJCQkJCQkJICBkb3VibGUgbG9jYXRpb24sCi0JCQkJCQkJCQkJCQkJCQkgIGJvb2xlYW4gaXNBKSB7Ci0JCUNvbm5lY3Rpb25EZWNvcmF0b3IgY2QgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVDb25uZWN0aW9uRGVjb3JhdG9yKGNvbm5lY3Rpb24sIGZhbHNlLCBsb2NhdGlvbiwgdHJ1ZSk7Ci0JCVBvbHlsaW5lIGFycm93ID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlUG9seWxpbmUoY2QsIG5ldyBpbnRbXSB7IDExLCAzLCAwLCAwLCAxMSwgLTMsIDExLCAzIH0pOwotCQlhcnJvdy5zZXRGb3JlZ3JvdW5kKEdyYXBoaXRpLmdldEdhU2VydmljZSgpLm1hbmFnZUNvbG9yKGNvbm5lY3Rpb24uZ2V0UGFyZW50KCksIGlzQSA/IAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUpQQUVkaXRvckNvbnN0YW50cy5JU19BX0NPTk5FQ1RJT05fTElORV9DT0xPUiA6IAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUpQQUVkaXRvckNvbnN0YW50cy5DT05ORUNUSU9OX0xJTkVfQ09MT1IpKTsKLQkJYXJyb3cuc2V0TGluZVdpZHRoKEpQQUVkaXRvckNvbnN0YW50cy5DT05ORUNUSU9OX0xJTkVfV0lEVEgpOwotCQlyZXR1cm4gY2Q7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3IgY3JlYXRlTWFueUVuZFdpdGhBcnJvd0RlY29yYXRvcihDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGRvdWJsZSBsb2NhdGlvbikgewotCQlDb25uZWN0aW9uRGVjb3JhdG9yIGNkID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuY3JlYXRlQ29ubmVjdGlvbkRlY29yYXRvcihjb25uZWN0aW9uLCBmYWxzZSwgbG9jYXRpb24sIHRydWUpOwotCQlQb2x5bGluZSBhcnJvdyA9IG51bGw7Ci0JCWFycm93ID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlUG9seWxpbmUoY2QsIG5ldyBpbnRbXSB7IC0yLCA3LCA2LCAwLCAtMiwgLTcsIDYsIDAsIDIwLCAzLCAyMCwgLTMsIDcsIDB9KTsKLQkJYXJyb3cuc2V0Rm9yZWdyb3VuZChHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5tYW5hZ2VDb2xvcihjb25uZWN0aW9uLmdldFBhcmVudCgpLCBKUEFFZGl0b3JDb25zdGFudHMuQ09OTkVDVElPTl9MSU5FX0NPTE9SKSk7Ci0JCWFycm93LnNldExpbmVXaWR0aChKUEFFZGl0b3JDb25zdGFudHMuQ09OTkVDVElPTl9MSU5FX1dJRFRIKTsKLQkJcmV0dXJuIGNkOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uRGVjb3JhdG9yIGNyZWF0ZU1hbnlFbmREZWNvcmF0b3IoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBkb3VibGUgbG9jYXRpb24pIHsKLQkJQ29ubmVjdGlvbkRlY29yYXRvciBjZCA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmNyZWF0ZUNvbm5lY3Rpb25EZWNvcmF0b3IoY29ubmVjdGlvbiwgZmFsc2UsIGxvY2F0aW9uLCB0cnVlKTsKLQkJUG9seWxpbmUgYXJyb3cgPSBudWxsOwotCQlhcnJvdyA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZVBvbHlsaW5lKGNkLCBuZXcgaW50W10geyAwLCA3LCAKLQkJCQkJCQkJCQkJCQkgOCwgMCwgCi0JCQkJCQkJCQkJCQkJMCwgLTcgfSk7Ci0JCWFycm93LnNldEZvcmVncm91bmQoR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkubWFuYWdlQ29sb3IoY29ubmVjdGlvbi5nZXRQYXJlbnQoKSwgSlBBRWRpdG9yQ29uc3RhbnRzLkNPTk5FQ1RJT05fTElORV9DT0xPUikpOwotCQlhcnJvdy5zZXRMaW5lV2lkdGgoSlBBRWRpdG9yQ29uc3RhbnRzLkNPTk5FQ1RJT05fTElORV9XSURUSCk7Ci0JCXJldHVybiBjZDsKLQl9Ci0JCi0JcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3IgY3JlYXRlTWFueVN0YXJ0RGVjb3JhdG9yKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZG91YmxlIGxvY2F0aW9uKSB7Ci0JCUNvbm5lY3Rpb25EZWNvcmF0b3IgY2QgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVDb25uZWN0aW9uRGVjb3JhdG9yKGNvbm5lY3Rpb24sIGZhbHNlLCBsb2NhdGlvbiwgdHJ1ZSk7Ci0JCVBvbHlsaW5lIGFycm93ID0gbnVsbDsKLQkJYXJyb3cgPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVQb2x5bGluZShjZCwgbmV3IGludFtdIHswLCA3LCAKLQkJCQkJCQkJCQkJCQkgLTgsIDAsIAotCQkJCQkJCQkJCQkJCTAsIC03IH0pOwkJCi0JCWFycm93LnNldEZvcmVncm91bmQoR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkubWFuYWdlQ29sb3IoY29ubmVjdGlvbi5nZXRQYXJlbnQoKSwgSlBBRWRpdG9yQ29uc3RhbnRzLkNPTk5FQ1RJT05fTElORV9DT0xPUikpOwotCQlhcnJvdy5zZXRMaW5lV2lkdGgoSlBBRWRpdG9yQ29uc3RhbnRzLkNPTk5FQ1RJT05fTElORV9XSURUSCk7Ci0JCXJldHVybiBjZDsKLQl9CQotCi0JcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3IgY3JlYXRlSWNvbkNvbm5lY3Rpb25EZWNvcmF0b3IoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBTdHJpbmcgaWNvbklkLCBkb3VibGUgbG9jYXRpb24pIHsKLQkJQ29ubmVjdGlvbkRlY29yYXRvciBpY29uRGVjb3JhdG9yID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuY3JlYXRlQ29ubmVjdGlvbkRlY29yYXRvcihjb25uZWN0aW9uLCB0cnVlLCBsb2NhdGlvbiwgdHJ1ZSk7Ci0JCUltYWdlIGljb24gPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVJbWFnZShjb25uZWN0aW9uLCBpY29uSWQpOwotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbihpY29uLCA1LCAtMjApOwotCQlyZXR1cm4gaWNvbkRlY29yYXRvcjsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkRlY29yYXRvciBjcmVhdGVJc0FUZXh0Q29ubmVjdGlvbkRlY29yYXRvcihEaWFncmFtIGQsIENvbm5lY3Rpb24gYykgewotCQlDb25uZWN0aW9uRGVjb3JhdG9yIHRleHREZWNvcmF0b3IgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVDb25uZWN0aW9uRGVjb3JhdG9yKGMsIHRydWUsIDAuNSwgdHJ1ZSk7Ci0JCVRleHQgdHh0ID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlRGVmYXVsdFRleHQoZCwgdGV4dERlY29yYXRvcik7Ci0JCXR4dC5zZXRMaW5lV2lkdGgoSlBBRWRpdG9yQ29uc3RhbnRzLkNPTk5FQ1RJT05fTElORV9XSURUSCk7Ci0JCXR4dC5zZXRWYWx1ZShKUEFFZGl0b3JDb25zdGFudHMuSVNfQSk7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLm1hbmFnZUNvbG9yKGMuZ2V0UGFyZW50KCksIElDb2xvckNvbnN0YW50LkJMQUNLKTsKLQkJLy9Qb2ludCBwdCA9IEpQQUVkaXRvclV0aWwucmVjYWxjVGV4dERlY29yYXRvclBvc2l0aW9uKChGcmVlRm9ybUNvbm5lY3Rpb24pYywgdGV4dERlY29yYXRvcik7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldExvY2F0aW9uKHR4dCwgNSwgNSwgZmFsc2UpOwotCQlyZXR1cm4gdGV4dERlY29yYXRvcjsJCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckltYWdlUHJvdmlkZXIuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9KUEFFZGl0b3JJbWFnZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMWE4MTQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckltYWdlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5wbGF0Zm9ybS5BYnN0cmFjdEltYWdlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RJbWFnZVByb3ZpZGVyIHsKLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRklYID0gIm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLiI7IAkJCQkJCS8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJRAk9ICJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5KUEFFZGl0b3JJbWFnZVByb3ZpZGVyIjsJCS8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUEFfRU5USVRZIAkJCQk9IFBSRUZJWCArICJlbnRpdHkiOyAJCQkJCQkJLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFRF9TVVBFUkNMQVNTIAkJPSBQUkVGSVggKyAibWFwcGVkX3N1cGVyY2xhc3MiOyAJCQkJLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9KUEFfRU5USVRZIAkJCT0gUFJFRklYICsgImFkZF9lbnRpdHkiOyAJCQkJCQkvLyROT04tTkxTLTEkICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9JTkhFUklURURfRU5USVRZIAk9IFBSRUZJWCArICJhZGRfaW5oZXJpdGVkX2VudGl0eSI7CQkgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfTUFQUEVEX1NVUEVSQ0xBU1MJPSBQUkVGSVggKyAiYWRkX21hcHBlZF9zdXBlcmNsYXNzIjsJICAgICAgICAJLy8kTk9OLU5MUy0xJCAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNQVJZX0tFWSAJCQkJPSBQUkVGSVggKyAicGsiOyAJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0JBU0lDIAkJCQk9IFBSRUZJWCArICJmaWVsZCI7IAkJCQkJCQkvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0FUVFJJQlVURSAJCQk9IFBSRUZJWCArICJhZGRfYXR0cmlidXRlIjsgCQkJCQkvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX0FUVFJJQlVURSAJCT0gUFJFRklYICsgInJlbW92ZV9hdHRyaWJ1dGUiOyAJCQkJCS8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX09ORV9UT19PTkUgCQkJPSBQUkVGSVggKyAib25lX3RvX29uZV9yZWxhdGlvbiI7IAkJCQkvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9PTkVfVE9fTUFOWSAJCT0gUFJFRklYICsgIm9uZV90b19tYW55X3JlbGF0aW9uIjsgCQkJCS8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX01BTllfVE9fT05FIAkJPSBQUkVGSVggKyAibWFueV90b19vbmVfcmVsYXRpb24iOyAJCQkJLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTUFOWV9UT19NQU5ZIAkJPSBQUkVGSVggKyAibWFueV90b19tYW55X3JlbGF0aW9uIjsgCQkJLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fRU1CRURERURfSUQgCQk9IFBSRUZJWCArICJlbWJlZGRlZF9pZCI7IAkJCQkJCS8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1ZFUlNJT04gCQkJPSBQUkVGSVggKyAidmVyc2lvbiI7IAkJCQkJCQkvLyROT04tTkxTLTEkIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fVFJBTlNJRU5UIAkJCT0gUFJFRklYICsgInRyYW5zaWVudCI7IAkJCQkJCS8vJE5PTi1OTFMtMSQgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fRU1CRURERUQgCQkJPSBQUkVGSVggKyAiZW1iZWRkZWQiOyAJCQkJCQkJLy8kTk9OLU5MUy0xJCAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1VOTUFQUEVEIAkJCT0gUFJFRklYICsgInVubWFwcGVkIjsgCQkJCQkJCS8vJE5PTi1OTFMtMSQgIAotCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX09ORV9UT19PTkVfMV9ESVIgCT0gUFJFRklYICsgIm9uZV90b19vbmVfMV9kaXJfcmVsYXRpb24iOyAJCS8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX09ORV9UT19NQU5ZXzFfRElSIAk9IFBSRUZJWCArICJvbmVfdG9fbWFueV8xX2Rpcl9yZWxhdGlvbiI7IAkJLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTUFOWV9UT19PTkVfMV9ESVIgCT0gUFJFRklYICsgIm1hbnlfdG9fb25lXzFfZGlyX3JlbGF0aW9uIjsgCQkvLyROT04tTkxTLTEkICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTUFOWV9UT19NQU5ZXzFfRElSIAk9IFBSRUZJWCArICJtYW55X3RvX21hbnlfMV9kaXJfcmVsYXRpb24iOyAJCS8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fT05FX1RPX09ORV8yX0RJUiAJPSBQUkVGSVggKyAib25lX3RvX29uZV8yX2Rpcl9yZWxhdGlvbiI7IAkJLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTUFOWV9UT19PTkVfMl9ESVIgCT0gUFJFRklYICsgIm1hbnlfdG9fb25lXzJfZGlyX3JlbGF0aW9uIjsgCQkvLyROT04tTkxTLTEkICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTUFOWV9UT19NQU5ZXzJfRElSIAk9IFBSRUZJWCArICJtYW55X3RvX21hbnlfMl9kaXJfcmVsYXRpb24iOyAJCS8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1NBVkUgCQkJCT0gUFJFRklYICsgInNhdmUiOyAJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1JFU1RPUkUgCQkJPSBQUkVGSVggKyAicmVzdG9yZSI7IAkJCQkJCQkvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9TQVZFX0FORF9SRU1PVkUgCT0gUFJFRklYICsgInNhdmVfYW5kX3JlbW92ZSI7IAkJCQkJLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfRk9MREVSX0ZPUl9JTUcgCT0gImljb25zLyI7IAkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEF2YWlsYWJsZUltYWdlcygpIHsgICAgICAgIAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fQkFTSUMsIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L2Jhc2ljLmdpZiIpOwkJCQkJCQkvLyROT04tTkxTLTEkCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoSlBBX0VOVElUWSwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvZW50aXR5LmdpZiIpOwkJCQkJCQkvLyROT04tTkxTLTEkCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoTUFQUEVEX1NVUEVSQ0xBU1MsIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L21hcHBlZC1zdXBlcmNsYXNzLmdpZiIpOwkJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChBRERfSlBBX0VOVElUWSwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvYWRkX2VudGl0eS5naWYiKTsJCQkJCS8vJE5PTi1OTFMtMSQgICAgICAgIAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKEFERF9JTkhFUklURURfRU5USVRZLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9hZGRfZW50aXR5LmdpZiIpOyAJCQkvLyROT04tTkxTLTEkCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoQUREX01BUFBFRF9TVVBFUkNMQVNTLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9hZGRfbWFwcGVkLXN1cGVyY2xhc3MuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChQUklNQVJZX0tFWSwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvaWQuZ2lmIik7CQkJCQkJCQkvLyROT04tTkxTLTEkCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoQUREX0FUVFJJQlVURSwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvYWRkX2F0dHJpYnV0ZS5naWYiKTsJCQkJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChSRU1PVkVfQVRUUklCVVRFLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9yZW1vdmVfYXR0cmlidXRlLmdpZiIpOwkJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX09ORV9UT19PTkUsIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L29uZS10by1vbmUuZ2lmIik7CQkJCQkvLyROT04tTkxTLTEkCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoSUNPTl9PTkVfVE9fTUFOWSwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvb25lLXRvLW1hbnkuZ2lmIik7CQkJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX01BTllfVE9fT05FLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9tYW55LXRvLW9uZS5naWYiKTsJCQkJLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fTUFOWV9UT19NQU5ZLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9tYW55LXRvLW1hbnkuZ2lmIik7CQkJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX0VNQkVEREVEX0lELCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9lbWJlZGRlZC1pZC5naWYiKTsgCQkJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX1ZFUlNJT04sIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L3ZlcnNpb24uZ2lmIik7IAkJCQkJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX1RSQU5TSUVOVCwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvdHJhbnNpZW50LmdpZiIpOyAJCQkJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX0VNQkVEREVELCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9lbWJlZGRlZC5naWYiKTsgCQkJCQkJLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fVU5NQVBQRUQsIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L251bGwtYXR0cmlidXRlLW1hcHBpbmcuZ2lmIik7IAkJLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoSUNPTl9PTkVfVE9fT05FXzFfRElSLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9vbmUtdG8tb25lLTEtZGlyLmdpZiIpOwkJLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fT05FX1RPX01BTllfMV9ESVIsIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L29uZS10by1tYW55LTEtZGlyLmdpZiIpOwkvLyROT04tTkxTLTEkCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoSUNPTl9NQU5ZX1RPX09ORV8xX0RJUiwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvbWFueS10by1vbmUtMS1kaXIuZ2lmIik7CS8vJE5PTi1OTFMtMSQgICAgICAgIAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fTUFOWV9UT19NQU5ZXzFfRElSLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9tYW55LXRvLW1hbnktMS1kaXIuZ2lmIik7CS8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoSUNPTl9PTkVfVE9fT05FXzJfRElSLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9vbmUtdG8tb25lLTItZGlyLmdpZiIpOwkJLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fTUFOWV9UT19PTkVfMl9ESVIsIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L21hbnktdG8tb25lLTItZGlyLmdpZiIpOwkvLyROT04tTkxTLTEkICAgICAgICAKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX01BTllfVE9fTUFOWV8yX0RJUiwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvbWFueS10by1tYW55LTItZGlyLmdpZiIpOwkvLyROT04tTkxTLTEkICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX1NBVkUsIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAic2F2ZS5naWYiKTsJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoSUNPTl9SRVNUT1JFLCBST09UX0ZPTERFUl9GT1JfSU1HICsgInJlc3RvcmUuZ2lmIik7CQkJCQkJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX1NBVkVfQU5EX1JFTU9WRSwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJzYXZlX2FuZF9yZW1vdmUuZ2lmIik7CQkJLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlci5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MThmOTcuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5kdC5JRGlhZ3JhbVR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JRG91YmxlQ2xpY2tDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVBpY3RvZ3JhbUVsZW1lbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5DcmVhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5DdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5EZWxldGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5SZW1vdmVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5JQ3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5pbnRlcm5hbC5mZWF0dXJlcy5jb250ZXh0LmltcGwuYmFzZS5QaWN0b2dyYW1FbGVtZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkdyYXBoaWNzQWxnb3JpdGhtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnBhbGV0dGUuSVBhbGV0dGVDb21wYXJ0bWVudEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnBhbGV0dGUuSVRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5wYWxldHRlLmltcGwuQ29ubmVjdGlvbkNyZWF0aW9uVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnBhbGV0dGUuaW1wbC5QYWxldHRlQ29tcGFydG1lbnRFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5wbGF0Zm9ybS5JUGxhdGZvcm1JbWFnZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS50Yi5Db250ZXh0QnV0dG9uRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudGIuQ29udGV4dEVudHJ5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnRiLkNvbnRleHRNZW51RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudGIuRGVmYXVsdFRvb2xCZWhhdmlvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnRiLklDb250ZXh0QnV0dG9uRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudGIuSUNvbnRleHRCdXR0b25QYWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnRiLklDb250ZXh0TWVudUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnRiLklEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudGIuSW1hZ2VEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZhY2FkZS5FY2xpcHNlRmFjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQWRkQWxsRW50aXRpZXNGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ29sbGFwc2VBbGxFbnRpdGllc0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5Db2xsYXBzZUNvbXBhcnRtZW50U2hhcGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ29sbGFwc2VFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ3JlYXRlSW5oZXJpdGVkRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkRlbGV0ZUpQQUVudGl0eUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5EaXNjYXJkQW5kUmVtb3ZlQWxsRW50aXRpZXNGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuRXhwYW5kQWxsRW50aXRpZXNGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuRXhwYW5kQ29tcGFydG1lbnRTaGFwZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5FeHBhbmRFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuTW92ZUVudGl0eUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5PcGVuSlBBRGV0YWlsc1ZpZXdGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuT3Blbk1pbmlhdHVyZVZpZXdGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuUmVmYWN0b3JBdHRyaWJ1dGVUeXBlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlJlbW92ZUFuZFNhdmVFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuUmVtb3ZlSlBBRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlJlbmFtZUVudGl0eUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5SZXN0b3JlRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlNhdmVBbmRSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5TYXZlRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udWkuSlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkdyYXBoaWNzVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklFY2xpcHNlRmFjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzLlNoYXBlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXIgZXh0ZW5kcyBEZWZhdWx0VG9vbEJlaGF2aW9yUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJRWNsaXBzZUZhY2FkZSBmYWNhZGU7Ci0KLSAgICBwdWJsaWMgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXIoSURpYWdyYW1UeXBlUHJvdmlkZXIgZHRwKSB7Ci0gICAgCXRoaXMoZHRwLCBFY2xpcHNlRmFjYWRlLklOU1RBTkNFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXIoSURpYWdyYW1UeXBlUHJvdmlkZXIgZHRwLCBJRWNsaXBzZUZhY2FkZSBlY2xpcHNlRmFjYWRlKSB7Ci0gICAgICAgIHN1cGVyKGR0cCk7Ci0gICAgICAgIHRoaXMuZmFjYWRlID0gZWNsaXBzZUZhY2FkZTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElDb250ZXh0QnV0dG9uUGFkRGF0YSBnZXRDb250ZXh0QnV0dG9uUGFkKElQaWN0b2dyYW1FbGVtZW50Q29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIElDb250ZXh0QnV0dG9uUGFkRGF0YSBkYXRhID0gc3VwZXIuZ2V0Q29udGV4dEJ1dHRvblBhZChjb250ZXh0KTsgICAgICAgIAotICAgICAgICBDb250YWluZXJTaGFwZSBjcyA9IG51bGw7Ci0gICAgICAgIAlQaWN0b2dyYW1FbGVtZW50IHBlID0gKChQaWN0b2dyYW1FbGVtZW50Q29udGV4dCkgY29udGV4dCkuZ2V0UGljdG9ncmFtRWxlbWVudCgpOwotICAgICAgICAJICBPYmplY3Qgb2IgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotICAgICAgCQlpZiAob2IgPT0gbnVsbCl7Ci0gICAgICAJCQlyZXR1cm4gbnVsbDsKLSAgICAgICAgICAgfQotICAgICAgICAJaWYgKHBlIGluc3RhbmNlb2YgQ29udGFpbmVyU2hhcGUpIHsKLSAgICAgICAgICAgIAljcyA9IChDb250YWluZXJTaGFwZSlwZTsKLSAgICAgICAgICAgIAlHcmFwaGljc0FsZ29yaXRobSBnYSA9IGNzLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0gICAgICAgICAgICAJaWYgKGdhIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSB7Ci0gICAgICAgICAgICAJCUxpc3Q8R3JhcGhpY3NBbGdvcml0aG0+IGdhcyA9ICgoUmVjdGFuZ2xlKWdhKS5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCk7Ci0gICAgICAgICAgICAJCWlmICgoZ2FzLnNpemUoKSA+IDApICYmIChnYXMuZ2V0KDApIGluc3RhbmNlb2YgVGV4dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEdlbmVyaWNDb250ZXh0QnV0dG9ucyhkYXRhLCBwZSwgMCk7ICAgICAgICAgICAgCQkJCi0gICAgICAgICAgICAJCQlDbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUgZmVhdCA9IGdldENvbmNyZXRlRmVhdHVyZVByb3ZpZGVyKCkKLQkJCQkJCQkJLmdldENsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZSgpOwotICAgICAgICAgICAgCQkJRGVsZXRlQ29udGV4dCBkZWxDdHggPSBuZXcgRGVsZXRlQ29udGV4dChjcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0QnV0dG9uRW50cnkgYnRuID0gIG5ldyBDb250ZXh0QnV0dG9uRW50cnkoZmVhdCwgZGVsQ3R4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ0bi5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2RlbGV0ZUF0dHJpYnV0ZUJ1dHRvbmxhYmVsKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICBidG4uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZGVsZXRlQXR0cmlidXRlQnV0dG9uRGVzY3JpcHRpb24pOyAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ0bi5zZXRJY29uSWQoSVBsYXRmb3JtSW1hZ2VDb25zdGFudHMuSU1HX0VESVRfREVMRVRFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0RG9tYWluU3BlY2lmaWNDb250ZXh0QnV0dG9ucygpLmFkZChidG4pOyAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOyAKLSAgICAgICAgICAgIAkJfQotICAgICAgICAgICAgCX0gICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAkJCi0gICAgICAgIAl9IGVsc2UgewotICAgICAgICAJCXJldHVybiBkYXRhOwotICAgICAgICAJfQotICAgICAgICAJCi0JCXNldEdlbmVyaWNDb250ZXh0QnV0dG9ucyhkYXRhLCBwZSwgQ09OVEVYVF9CVVRUT05fREVMRVRFCi0JCQkJfCBDT05URVhUX0JVVFRPTl9SRU1PVkUpOwotCQlMaXN0PElDb250ZXh0QnV0dG9uRW50cnk+IGJ1dHRvbnMgPSBkYXRhLmdldEdlbmVyaWNDb250ZXh0QnV0dG9ucygpOwotCQlJdGVyYXRvcjxJQ29udGV4dEJ1dHRvbkVudHJ5PiBidG5zSXQgPSBidXR0b25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChidG5zSXQuaGFzTmV4dCgpKSB7Ci0JCQlJQ29udGV4dEJ1dHRvbkVudHJ5IGJ1dHRvbiA9IGJ0bnNJdC5uZXh0KCk7Ci0JCQlpZiAoYnV0dG9uLmdldEZlYXR1cmUoKSBpbnN0YW5jZW9mIFJlbW92ZUpQQUVudGl0eUZlYXR1cmUpIHsKLQkJCQlidXR0b24uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVFbnRpdHlGcm9tRGlhZ3JhbUJ1dHRvbkxhYmVsKTsKLQkJCQlidXR0b24uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlRW50aXR5RnJvbURpYWdyYW1CdXR0b25EZXNjcmlwdGlvbik7Ci0JCQl9IGVsc2UgaWYgKGJ1dHRvbi5nZXRGZWF0dXJlKCkgaW5zdGFuY2VvZiBEZWxldGVKUEFFbnRpdHlGZWF0dXJlKSB7Ci0JCQkJYnV0dG9uLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZGVsZXRlRW50aXR5RnJvbU1vZGVsQnV0dG9uTGFiZWwpOwotCQkJCWJ1dHRvbi5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9kZWxldGVFbnRpdHlGcm9tTW9kZWxCdXR0b25EZXNjcmlwdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQlDb250ZXh0QnV0dG9uRW50cnkgYnV0dG9uID0gbnVsbDsKLQkJaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBQaWN0b2dyYW1FbGVtZW50Q29udGV4dCkgewotCi0JCQlDbGlja0FkZEF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUgZmVhdHVyZSA9IGdldENvbmNyZXRlRmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlKCk7Ci0JCQlDcmVhdGVDb250ZXh0IGNyZWF0ZUN0eCA9IG5ldyBDcmVhdGVDb250ZXh0KCk7Ci0JCQljcmVhdGVDdHguc2V0VGFyZ2V0Q29udGFpbmVyKGNzKTsKLQkJCWJ1dHRvbiA9IG5ldyBDb250ZXh0QnV0dG9uRW50cnkoZmVhdHVyZSwgY3JlYXRlQ3R4KTsKLQkJCWJ1dHRvbi5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbmxhYmVsKTsKLQkJCWJ1dHRvbi5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jcmVhdGVBdHRyaWJ1dGVCdXR0b25EZXNjcmlwdGlvbik7Ci0JCQlidXR0b24uc2V0SWNvbklkKEpQQUVkaXRvckltYWdlUHJvdmlkZXIuQUREX0FUVFJJQlVURSk7Ci0JCQlkYXRhLmdldERvbWFpblNwZWNpZmljQ29udGV4dEJ1dHRvbnMoKS5hZGQoYnV0dG9uKTsKLQotCQkJUGljdG9ncmFtRWxlbWVudENvbnRleHQgYyA9IChQaWN0b2dyYW1FbGVtZW50Q29udGV4dCkgY29udGV4dDsKLQkJCVJlbW92ZUFuZFNhdmVFbnRpdHlGZWF0dXJlIGZ0MiA9IG5ldyBSZW1vdmVBbmRTYXZlRW50aXR5RmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQlSZW1vdmVDb250ZXh0IHJlbUN0eCA9IG5ldyBSZW1vdmVDb250ZXh0KGMuZ2V0UGljdG9ncmFtRWxlbWVudCgpKTsKLQkJCWJ1dHRvbiA9IG5ldyBDb250ZXh0QnV0dG9uRW50cnkoZnQyLCByZW1DdHgpOwotCQkJYnV0dG9uLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQW5kU2F2ZUJ1dHRvblRleHQpOwotCQkJYnV0dG9uLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFuZFNhdmVCdXR0b25EZXNjcmlwdGlvbik7Ci0JCQlidXR0b24uc2V0SWNvbklkKEpQQUVkaXRvckltYWdlUHJvdmlkZXIuSUNPTl9TQVZFX0FORF9SRU1PVkUpOwotCQkJZGF0YS5nZXREb21haW5TcGVjaWZpY0NvbnRleHRCdXR0b25zKCkuYWRkKGJ1dHRvbik7Ci0KLQkJCVNhdmVFbnRpdHlGZWF0dXJlIGZ0ID0gbmV3IFNhdmVFbnRpdHlGZWF0dXJlKGdldENvbmNyZXRlRmVhdHVyZVByb3ZpZGVyKCkpOwotCQkJQ3VzdG9tQ29udGV4dCBjdHggPSBuZXcgQ3VzdG9tQ29udGV4dCgpOwotCQkJY3R4LnNldFBpY3RvZ3JhbUVsZW1lbnRzKG5ldyBQaWN0b2dyYW1FbGVtZW50W10geyBjLmdldFBpY3RvZ3JhbUVsZW1lbnQoKSB9KTsKLQkJCWJ1dHRvbiA9IG5ldyBDb250ZXh0QnV0dG9uRW50cnkoZnQsIGN0eCk7Ci0JCQlidXR0b24uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9zYXZlQnV0dG9uVGV4dCk7Ci0JCQlidXR0b24uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2F2ZUJ1dHRvbkRlc2NyaXB0aW9uKTsKLQkJCWJ1dHRvbi5zZXRJY29uSWQoSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX1NBVkUpOwotCQkJZGF0YS5nZXREb21haW5TcGVjaWZpY0NvbnRleHRCdXR0b25zKCkuYWRkKGJ1dHRvbik7Ci0KLQkJCVJlc3RvcmVFbnRpdHlGZWF0dXJlIGZ0MSA9IG5ldyBSZXN0b3JlRW50aXR5RmVhdHVyZShnZXRDb25jcmV0ZUZlYXR1cmVQcm92aWRlcigpKTsKLQkJCWN0eCA9IG5ldyBDdXN0b21Db250ZXh0KCk7Ci0JCQljdHguc2V0UGljdG9ncmFtRWxlbWVudHMobmV3IFBpY3RvZ3JhbUVsZW1lbnRbXSB7IGMuZ2V0UGljdG9ncmFtRWxlbWVudCgpIH0pOwotCQkJYnV0dG9uID0gbmV3IENvbnRleHRCdXR0b25FbnRyeShmdDEsIGN0eCk7Ci0JCQlidXR0b24uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZXN0b3JlQnV0dG9uVGV4dCk7Ci0JCQlidXR0b24uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVzdG9yZUJ1dHRvbkRlc2NyaXB0aW9uKTsKLQkJCWJ1dHRvbi5zZXRJY29uSWQoSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX1JFU1RPUkUpOwotCQkJZGF0YS5nZXREb21haW5TcGVjaWZpY0NvbnRleHRCdXR0b25zKCkuYWRkKGJ1dHRvbik7Ci0KLQkJCWN0eCA9IG5ldyBDdXN0b21Db250ZXh0KG5ldyBQaWN0b2dyYW1FbGVtZW50W10geyBwZSB9KTsKLQkJCUlGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JCQlJQ3VzdG9tRmVhdHVyZVtdIGN1c3RvbUZlYXR1cmVzID0gZmVhdHVyZVByb3ZpZGVyLmdldEN1c3RvbUZlYXR1cmVzKGN0eCk7Ci0JCQlpbnQgZmVhdHVyZUNvdW50ID0gY3VzdG9tRmVhdHVyZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlQ291bnQ7IGkrKykgewotCQkJCUlDdXN0b21GZWF0dXJlIGN1c3RvbUZlYXR1cmUgPSBjdXN0b21GZWF0dXJlc1tpXTsKLQkJCQlpZiAoY3VzdG9tRmVhdHVyZS5pc0F2YWlsYWJsZShjdHgpKSB7Ci0JCQkJCWlmICgoY3VzdG9tRmVhdHVyZSBpbnN0YW5jZW9mIENvbGxhcHNlRW50aXR5RmVhdHVyZSkpIHsKLQkJCQkJCUlDb250ZXh0QnV0dG9uRW50cnkgY29udGV4dEJ1dHRvbiA9IENvbnRleHRFbnRyeUhlbHBlcgotCQkJCQkJCQkuY3JlYXRlQ29sbGFwc2VDb250ZXh0QnV0dG9uKHRydWUsIGN1c3RvbUZlYXR1cmUsIGN0eCk7Ci0JCQkJCQlkYXRhLnNldENvbGxhcHNlQ29udGV4dEJ1dHRvbihjb250ZXh0QnV0dG9uKTsKLQkJCQkJfSBlbHNlIGlmICgoY3VzdG9tRmVhdHVyZSBpbnN0YW5jZW9mIEV4cGFuZEVudGl0eUZlYXR1cmUpKSB7Ci0JCQkJCQlJQ29udGV4dEJ1dHRvbkVudHJ5IGNvbnRleHRCdXR0b24gPSBDb250ZXh0RW50cnlIZWxwZXIKLQkJCQkJCQkJLmNyZWF0ZUNvbGxhcHNlQ29udGV4dEJ1dHRvbihmYWxzZSwJY3VzdG9tRmVhdHVyZSwgY3R4KTsKLQkJCQkJCWRhdGEuc2V0Q29sbGFwc2VDb250ZXh0QnV0dG9uKGNvbnRleHRCdXR0b24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZGF0YTsKLSAgICB9Ci0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVBhbGV0dGVDb21wYXJ0bWVudEVudHJ5W10gZ2V0UGFsZXR0ZSgpIHsKLSAgICAgICAgTGlzdDxJUGFsZXR0ZUNvbXBhcnRtZW50RW50cnk+IHJldCA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PElQYWxldHRlQ29tcGFydG1lbnRFbnRyeT4oKTsKLSAgICAgICAgSVBhbGV0dGVDb21wYXJ0bWVudEVudHJ5W10gc3VwZXJDb21wYXJ0bWVudHMgPQotICAgICAgICAgICAgc3VwZXIuZ2V0UGFsZXR0ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1cGVyQ29tcGFydG1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIAlTdHJpbmcgbmV3TGFiZWwgPSAoc3VwZXJDb21wYXJ0bWVudHNbaV0uZ2V0TGFiZWwoKS5lcXVhbHMoIk9iamVjdHMiKSA/IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCQkJSlBBRWRpdG9yTWVzc2FnZXMuUGFsZXR0ZUNvbXBhcnRtZW50X09iamVjdHMgOiAKLSAgICAgICAgCQkJCUpQQUVkaXRvck1lc3NhZ2VzLlBhbGV0dGVDb21wYXJ0bWVudF9Db25uZWN0aW9ucyk7IAotICAgICAgICAJUGFsZXR0ZUNvbXBhcnRtZW50RW50cnkgZW50cnkgPSBuZXcgUGFsZXR0ZUNvbXBhcnRtZW50RW50cnkobmV3TGFiZWwsIHN1cGVyQ29tcGFydG1lbnRzW2ldLmdldEljb25JZCgpKTsgICAgICAgCi0gICAgICAgIAlMaXN0PElUb29sRW50cnk+IGxzdCA9IHN1cGVyQ29tcGFydG1lbnRzW2ldLmdldFRvb2xFbnRyaWVzKCk7Ci0gICAgICAgIAlJdGVyYXRvcjxJVG9vbEVudHJ5PiBpdCA9IGxzdC5pdGVyYXRvcigpOwotICAgICAgICAJd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgIAkJZW50cnkuYWRkVG9vbEVudHJ5KGl0Lm5leHQoKSk7Ci0gICAgICAgIAl9Ci0gICAgICAgIAlyZXQuYWRkKGVudHJ5KTsKLSAgICAgICAgfQotICAgICAgICBJUGFsZXR0ZUNvbXBhcnRtZW50RW50cnkgZW4gPSByZXQuZ2V0KDApOwotICAgICAgICByZXQuc2V0KDAsIHJldC5nZXQoMSkpOwotICAgICAgICByZXQuc2V0KDEsIGVuKTsKLSAgICAgICAgCi0gICAgCVBhbGV0dGVDb21wYXJ0bWVudEVudHJ5IGVudCA9IG5ldyBQYWxldHRlQ29tcGFydG1lbnRFbnRyeShKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9Jbmhlcml0YW5jZUNvbXBhcnRtZW50VGl0bGUsIHN1cGVyQ29tcGFydG1lbnRzWzFdLmdldEljb25JZCgpKTsgICAgIAotICAgIAlDcmVhdGVJbmhlcml0ZWRFbnRpdHlGZWF0dXJlIGZ0ID0gbmV3IENyZWF0ZUluaGVyaXRlZEVudGl0eUZlYXR1cmUodGhpcy5nZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0gICAgCUNvbm5lY3Rpb25DcmVhdGlvblRvb2xFbnRyeSBpc0FSZWxUb29sRW50cnkgPSBuZXcgQ29ubmVjdGlvbkNyZWF0aW9uVG9vbEVudHJ5KGZ0LmdldENyZWF0ZU5hbWUoKSwKLQkJCQlmdC5nZXRDcmVhdGVEZXNjcmlwdGlvbigpLCBmdC5nZXRDcmVhdGVJbWFnZUlkKCksIGZ0LmdldENyZWF0ZUxhcmdlSW1hZ2VJZCgpKTsKLSAgICAJaXNBUmVsVG9vbEVudHJ5LmFkZENyZWF0ZUNvbm5lY3Rpb25GZWF0dXJlKGZ0KTsKLSAgICAJCi0JCWVudC5hZGRUb29sRW50cnkoaXNBUmVsVG9vbEVudHJ5KTsKLQotICAgIAkKLSAgICAJcmV0LmFkZCgxLCBlbnQpOwotCi0gICAgICAgIHJldHVybiByZXQudG9BcnJheShuZXcgSVBhbGV0dGVDb21wYXJ0bWVudEVudHJ5W3JldC5zaXplKCldKTsKLSAgICB9Ci0gICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSURlY29yYXRvcltdIGdldERlY29yYXRvcnMoUGljdG9ncmFtRWxlbWVudCBwZSkgewotCQlJRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlciA9IGdldEZlYXR1cmVQcm92aWRlcigpOwotCQlPYmplY3QgYm8gPSBmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQotCQlpZiAoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGJvOwotCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcGVyc2lzdGVudFR5cGUuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmKCFmaWxlLmV4aXN0cygpKXsKLQkJCQlyZXR1cm4gbmV3IElEZWNvcmF0b3JbMF07Ci0JCQl9Ci0JCQlJTWFya2VyW10gbWFya2VycyA9IG5ldyBJTWFya2VyWzBdOwotCQkJdHJ5IHsKLQkJCQltYXJrZXJzID0gZmlsZS5maW5kTWFya2VycyhudWxsLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJCUlEZWNvcmF0b3JbXSByZXN1bHQgPSBuZXcgSURlY29yYXRvclsxXTsKLQkJCQlpZiAobWFya2Vycy5sZW5ndGggPT0gMCkKLQkJCQkJcmV0dXJuIHN1cGVyLmdldERlY29yYXRvcnMocGUpOwotCQkJCUlNYXJrZXIgbWFya2VyID0gZ2V0SGlnaGVzdFByaW9NYXJrZXIobWFya2Vycyk7Ci0JCQkJSW1hZ2VEZWNvcmF0b3IgaW1hZ2VSZW5kZXJpbmdEZWNvcmF0b3IgPSBjcmVhdGVEZWNvcmF0b3JGcm9tTWFya2VyKG1hcmtlcik7Ci0JCQkJaWYgKGltYWdlUmVuZGVyaW5nRGVjb3JhdG9yICE9IG51bGwpIHsKLQkJCQkJaW1hZ2VSZW5kZXJpbmdEZWNvcmF0b3Iuc2V0WCg1ICogKHBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0V2lkdGgoKSAvIDYpKTsKLQkJCQkJaW1hZ2VSZW5kZXJpbmdEZWNvcmF0b3Iuc2V0WSg1ICogKHBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0SGVpZ2h0KCkgLyA2KSk7Ci0JCQkJCXJlc3VsdFswXSA9IGltYWdlUmVuZGVyaW5nRGVjb3JhdG9yOwotCQkJCX0KLQkJCQlpZiAocmVzdWx0WzBdICE9IG51bGwpCi0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlY29yYXRvcnMocGUpOwotCX0KLQotCXByaXZhdGUgSU1hcmtlciBnZXRIaWdoZXN0UHJpb01hcmtlcihJTWFya2VyW10gbWFya2VycykgewotCQlJTWFya2VyIHJlc3VsdCA9IG1hcmtlcnNbMF07Ci0JCWZvciAoSU1hcmtlciBtYXJrZXIgOiBtYXJrZXJzKSB7Ci0JCQl0cnkgewotCQkJCWZpbmFsIEludGVnZXIgcmVzdWx0U2V2ZXJpdHkgPSAoSW50ZWdlcikgcmVzdWx0LmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKTsKLQkJCQlpZiAocmVzdWx0U2V2ZXJpdHkgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKElNYXJrZXIuU0VWRVJJVFlfRVJST1IgPT0gcmVzdWx0U2V2ZXJpdHkpCi0JCQkJCS8vIHJldHVybiB0aGUgZmlyc3QgZXJyb3IgbWFya2VyCi0JCQkJCWJyZWFrOwotCQkJCUludGVnZXIgbWFya2VyU2V2ZXJpdHkgPSAoSW50ZWdlcikgbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKTsKLQkJCQlpZiAoKG1hcmtlclNldmVyaXR5ICE9IG51bGwpICYmIChtYXJrZXJTZXZlcml0eSA+IHJlc3VsdFNldmVyaXR5KSkKLQkJCQkJcmVzdWx0ID0gbWFya2VyOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJbWFnZURlY29yYXRvciBjcmVhdGVEZWNvcmF0b3JGcm9tTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0JCXRyeSB7Ci0JCQlJbnRlZ2VyIHNldmVyaXR5ID0gKEludGVnZXIpIG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSk7Ci0JCQlTdHJpbmcgZGVjb3JhdG9yVHlwZSA9IElQbGF0Zm9ybUltYWdlQ29uc3RhbnRzLklNR19FQ0xJUFNFX0lORk9STUFUSU9OX1RTSzsKLQkJCWlmIChzZXZlcml0eSAhPSBudWxsKSB7Ci0JCQkJc3dpdGNoIChzZXZlcml0eSkgewotCQkJCWNhc2UgMDoKLQkJCQkJZGVjb3JhdG9yVHlwZSA9IElQbGF0Zm9ybUltYWdlQ29uc3RhbnRzLklNR19FQ0xJUFNFX0lORk9STUFUSU9OX1RTSzsKLQkJCQljYXNlIDE6Ci0JCQkJCWRlY29yYXRvclR5cGUgPSBJUGxhdGZvcm1JbWFnZUNvbnN0YW50cy5JTUdfRUNMSVBTRV9XQVJOSU5HX1RTSzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOgotCQkJCQlkZWNvcmF0b3JUeXBlID0gSVBsYXRmb3JtSW1hZ2VDb25zdGFudHMuSU1HX0VDTElQU0VfRVJST1JfVFNLOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJSW1hZ2VEZWNvcmF0b3IgaW1hZ2VSZW5kZXJpbmdEZWNvcmF0b3IgPSBuZXcgSW1hZ2VEZWNvcmF0b3IoZGVjb3JhdG9yVHlwZSk7Ci0JCQkJaW1hZ2VSZW5kZXJpbmdEZWNvcmF0b3Iuc2V0TWVzc2FnZSgoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotCQkJCXJldHVybiBpbWFnZVJlbmRlcmluZ0RlY29yYXRvcjsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcChHcmFwaGljc0FsZ29yaXRobSBnYSkgewotICAgIAlQaWN0b2dyYW1FbGVtZW50IHBlID0gZ2EuZ2V0UGljdG9ncmFtRWxlbWVudCgpOwotICAgICAgICBpZiAoIShnYSBpbnN0YW5jZW9mIFJlY3RhbmdsZSkpIAotICAgICAgICAJcmV0dXJuIG51bGw7Ci0gICAgICAgIExpc3Q8R3JhcGhpY3NBbGdvcml0aG0+IGNoID0gZ2EuZ2V0R3JhcGhpY3NBbGdvcml0aG1DaGlsZHJlbigpOwotICAgICAgICBpZiAoKGNoID09IG51bGwpIHx8IChjaC5zaXplKCkgPT0gMCkpIAotICAgICAgICAJcmV0dXJuIG51bGw7Ci0gICAgICAgIGdhID0gY2guZ2V0KDApOwotICAgICAgICBpZiAoIShnYSBpbnN0YW5jZW9mIFRleHQpKSAKLSAgICAgICAgCXJldHVybiBudWxsOwotICAgICAgICBGb250IGYgPSAoKFRleHQpZ2EpLmdldEZvbnQoKTsKLSAgICAgICAgaWYgKGYgPT0gbnVsbCkKLSAgICAgICAgCXJldHVybiAiIjsJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYoZi5pc0l0YWxpYygpKXsKLSAgICAgICAgCXJldHVybiBnZXRUb29sVGlwRm9yQ29tcGFydG1lbnRTaGFwZShnYSk7Ci0gICAgCX0KLSAgICAgICAgCi0gICAgICAgIE9iamVjdCBibyA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSk7Ci0JCWlmIChibyAhPSBudWxsKSB7Ci0JCQlpZiAoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLQkJCQlTdHJpbmcgc3VwZXJQZXJzaXN0ZW50VHlwZU5hbWUgPSBudWxsOwotCQkJCWlmICgoKEphdmFQZXJzaXN0ZW50VHlwZSkgYm8pLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJCXN1cGVyUGVyc2lzdGVudFR5cGVOYW1lID0gKChKYXZhUGVyc2lzdGVudFR5cGUpIGJvKS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gSlBBRWRpdG9yVXRpbC5nZXRUb29sdGlwVGV4dCgoSmF2YVBlcnNpc3RlbnRUeXBlKWJvLCBzdXBlclBlcnNpc3RlbnRUeXBlTmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCQkJCXJldHVybiBKUEFFZGl0b3JVdGlsLmdldFRvb2x0aXBUZXh0KChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSlibyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0gICAgICAgIGlmICghKHBlIGluc3RhbmNlb2YgU2hhcGUpKSAKLSAgICAgICAgCXJldHVybiBudWxsOwotICAgICAgICBTaGFwZSBzaCA9IChTaGFwZSlwZTsKLSAgICAgICAgQ29udGFpbmVyU2hhcGUgY3NoID0gc2guZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgIGlmIChjc2ggPT0gbnVsbCkgCi0gICAgICAgIAlyZXR1cm4gbnVsbDsgCi0gICAgICAgIGJvID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNzaCk7Ci0JCWlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotCQkJU3RyaW5nIHN1cGVyUGVyc2lzdGVudFR5cGVOYW1lID0gbnVsbDsKLQkJCWlmICgoKEphdmFQZXJzaXN0ZW50VHlwZSkgYm8pLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJc3VwZXJQZXJzaXN0ZW50VHlwZU5hbWUgPSAoKEphdmFQZXJzaXN0ZW50VHlwZSkgYm8pCi0JCQkJCQkuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKTsKLQkJCX0KLQkJCXJldHVybiBKUEFFZGl0b3JVdGlsLmdldFRvb2x0aXBUZXh0KChKYXZhUGVyc2lzdGVudFR5cGUpIGJvLAotCQkJCQlzdXBlclBlcnNpc3RlbnRUeXBlTmFtZSk7Ci0JCX0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VG9vbFRpcEZvckNvbXBhcnRtZW50U2hhcGUoR3JhcGhpY3NBbGdvcml0aG0gZ2EpIHsKLQkJVGV4dCB0eHQgPSAoVGV4dCkgZ2E7Ci0JCUNvbnRhaW5lclNoYXBlIHNoYXBlID0gKENvbnRhaW5lclNoYXBlKSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRBY3RpdmVDb250YWluZXJQZShnYSk7Ci0JCQlpZihHcmFwaGljc1VwZGF0ZXIuaXNDb2xsYXBzZWQoc2hhcGUpKQotCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRDb21wYXJ0VG9vbFRpcCwgdHh0LmdldFZhbHVlKCkpOwotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NvbGxhcHNlQ29tcGFydFRvb2xUaXAsIHR4dC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldENvbmNyZXRlRmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKEpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsJCQotCX0KLQkKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUNvbnRleHRNZW51RW50cnlbXSBnZXRDb250ZXh0TWVudShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgCUlDdXN0b21Db250ZXh0IGN1c3RvbUNvbnRleHQgPSAoSUN1c3RvbUNvbnRleHQpY29udGV4dDsKLSAgICAJUGljdG9ncmFtRWxlbWVudFtdIHBpY3RFbHMgPSBjdXN0b21Db250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnRzKCk7Ci0gICAgCQotICAgIAlJQ3VzdG9tRmVhdHVyZSBzYXZlRW50aXR5RmVhdHVyZSA9IG5ldyBTYXZlRW50aXR5RmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCUNvbnRleHRNZW51RW50cnkgc2F2ZUVudGl0eU1lbnVJdGVtID0gbmV3IENvbnRleHRNZW51RW50cnkoc2F2ZUVudGl0eUZlYXR1cmUsIGNvbnRleHQpOwotCQlzYXZlRW50aXR5TWVudUl0ZW0uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9zYXZlTWVudUl0ZW0pOwotCQlzYXZlRW50aXR5TWVudUl0ZW0uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2F2ZU1lbnVJdGVtRGVzY3IpOwotCQlzYXZlRW50aXR5TWVudUl0ZW0uc2V0U3VibWVudShmYWxzZSk7Ci0JCQotCQlJQ3VzdG9tRmVhdHVyZSByZXN0b3JlRW50aXR5RmVhdHVyZSA9IG5ldyBSZXN0b3JlRW50aXR5RmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCUNvbnRleHRNZW51RW50cnkgcmVzdG9yZUVudGl0eU1lbnVJdGVtID0gbmV3IENvbnRleHRNZW51RW50cnkocmVzdG9yZUVudGl0eUZlYXR1cmUsIGNvbnRleHQpOwotCQlyZXN0b3JlRW50aXR5TWVudUl0ZW0uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9kaXNjYXJkQ2hhbmdlc01lbnVJdGVtKTsKLQkJcmVzdG9yZUVudGl0eU1lbnVJdGVtLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2Rpc2NhcmRDaGFuZ2VzTWVudUl0ZW1EZXNjcik7Ci0JCXJlc3RvcmVFbnRpdHlNZW51SXRlbS5zZXRTdWJtZW51KGZhbHNlKTsJCQotICAgIAkKLQkJSUN1c3RvbUZlYXR1cmUgY29sbGFwc2VGZWF0dXJlID0gbmV3IENvbGxhcHNlRW50aXR5RmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCUNvbnRleHRNZW51RW50cnkgY29sbGFwc2VFbnRpdHlNZW51SXRlbSA9IG5ldyBDb250ZXh0TWVudUVudHJ5KGNvbGxhcHNlRmVhdHVyZSwgY29udGV4dCk7Ci0JCWNvbGxhcHNlRW50aXR5TWVudUl0ZW0uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUVudGl0eU1lbnVJdGVtKTsKLQkJY29sbGFwc2VFbnRpdHlNZW51SXRlbS5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUVudGl0eU1lbnVJdGVtRGVzY3IpOwotCQljb2xsYXBzZUVudGl0eU1lbnVJdGVtLnNldFN1Ym1lbnUoZmFsc2UpOwotCQkKLQkJSUN1c3RvbUZlYXR1cmUgY29sbGFwc2VBbGxGZWF0dXJlID0gbmV3IENvbGxhcHNlQWxsRW50aXRpZXNGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJQ29udGV4dE1lbnVFbnRyeSBjb2xsYXBzZUFsbE1lbnVJdGVtID0gbmV3IENvbnRleHRNZW51RW50cnkoY29sbGFwc2VBbGxGZWF0dXJlLCBjb250ZXh0KTsKLQkJY29sbGFwc2VBbGxNZW51SXRlbS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NvbGxhcHNlQWxsRW50aXRpZXNNZW51SXRlbSk7Ci0JCWNvbGxhcHNlQWxsTWVudUl0ZW0uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VBbGxFbnRpdGllc01lbnVJdGVtRGVzY3IpOwotCQljb2xsYXBzZUFsbE1lbnVJdGVtLnNldFN1Ym1lbnUoZmFsc2UpOwkJCi0KLQkJSUN1c3RvbUZlYXR1cmUgZXhwYW5kRmVhdHVyZSA9IG5ldyBFeHBhbmRFbnRpdHlGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJQ29udGV4dE1lbnVFbnRyeSBleHBhbmRFbnRpdHlNZW51SXRlbT0gbmV3IENvbnRleHRNZW51RW50cnkoZXhwYW5kRmVhdHVyZSwgY29udGV4dCk7Ci0JCWV4cGFuZEVudGl0eU1lbnVJdGVtLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZXhwYW5kRW50aXR5TWVudUl0ZW0pOwotCQlleHBhbmRFbnRpdHlNZW51SXRlbS5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRFbnRpdHltZW51SXRlbURlc2NyKTsKLQkJZXhwYW5kRW50aXR5TWVudUl0ZW0uc2V0U3VibWVudShmYWxzZSk7Ci0JCQotCQlJQ3VzdG9tRmVhdHVyZSBleHBhbmRBbGxGZWF0dXJlID0gbmV3IEV4cGFuZEFsbEVudGl0aWVzRmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCUNvbnRleHRNZW51RW50cnkgZXhwYW5kQWxsTWVudUl0ZW09IG5ldyBDb250ZXh0TWVudUVudHJ5KGV4cGFuZEFsbEZlYXR1cmUsIGNvbnRleHQpOwotCQlleHBhbmRBbGxNZW51SXRlbS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2V4cGFuZEFsbEVudGl0aWVzTWVudUl0ZW0pOwotCQlleHBhbmRBbGxNZW51SXRlbS5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRBbGxFbnRpdGllc01lbnVJdGVtRGVzY3IpOwotCQlleHBhbmRBbGxNZW51SXRlbS5zZXRTdWJtZW51KGZhbHNlKTsJCQotCi0gICAgICAgIElDdXN0b21GZWF0dXJlIG9wZW5KUEFEZXRhaWxzVmlld0ZlYXR1cmUgPSBuZXcgT3BlbkpQQURldGFpbHNWaWV3RmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0gICAgICAgIENvbnRleHRNZW51RW50cnkgb3BlbkpQQURldGFpbHNWaWV3TWVudUl0ZW0gPSBuZXcgQ29udGV4dE1lbnVFbnRyeShvcGVuSlBBRGV0YWlsc1ZpZXdGZWF0dXJlLCBjb250ZXh0KTsKLSAgICAgICAgb3BlbkpQQURldGFpbHNWaWV3TWVudUl0ZW0uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9vcGVuSlBBRGV0YWlsc1ZpZXcpOwotICAgICAgICBvcGVuSlBBRGV0YWlsc1ZpZXdNZW51SXRlbS5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9vcGVuSlBBRGV0YWlsc1ZpZXdEZXNjKTsKLSAgICAgICAgb3BlbkpQQURldGFpbHNWaWV3TWVudUl0ZW0uc2V0U3VibWVudShmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBJQ3VzdG9tRmVhdHVyZSBvcGVuTWluaWF0dXJlVmlld0ZlYXR1cmUgPSBuZXcgT3Blbk1pbmlhdHVyZVZpZXdGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLSAgICAgICAgQ29udGV4dE1lbnVFbnRyeSBvcGVuTWluaWF0dXJlVmlld01lbnVJdGVtID0gbmV3IENvbnRleHRNZW51RW50cnkob3Blbk1pbmlhdHVyZVZpZXdGZWF0dXJlLCBjb250ZXh0KTsKLSAgICAgICAgb3Blbk1pbmlhdHVyZVZpZXdNZW51SXRlbS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX29wZW5NaW5pYXR1cmVWaWV3KTsKLSAgICAgICAgb3Blbk1pbmlhdHVyZVZpZXdNZW51SXRlbS5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9vcGVuTWluaWF0dXJlVmlld0Rlc2MpOwotICAgICAgICBvcGVuTWluaWF0dXJlVmlld01lbnVJdGVtLnNldFN1Ym1lbnUoZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBpc0VtcHR5ID0gdHJ1ZTsKLSAgICAgICAgQ29udGV4dE1lbnVFbnRyeSByZW1vdmVBbGxFbnRpdGllc1N1Ym1lbnUgPSBudWxsOwotICAgICAgICBpZihnZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbSgpLmdldENoaWxkcmVuKCkuc2l6ZSgpIT0wKXsKLSAgICAgICAgaXNFbXB0eSA9IGZhbHNlOwotICAgICAgICByZW1vdmVBbGxFbnRpdGllc1N1Ym1lbnUgPSBuZXcgQ29udGV4dE1lbnVFbnRyeShudWxsLCBudWxsKTsKLSAgICAgICAgcmVtb3ZlQWxsRW50aXRpZXNTdWJtZW51LnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQWxsRW50aXRpZXNNZW51KTsKLSAgICAgICAgcmVtb3ZlQWxsRW50aXRpZXNTdWJtZW51LnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFsbEVudGl0aWVzTWVudSk7Ci0gICAgICAgIHJlbW92ZUFsbEVudGl0aWVzU3VibWVudS5zZXRTdWJtZW51KHRydWUpOwotCQkKLSAgICAgICAgSUN1c3RvbUZlYXR1cmUgY3VzdG9tRmVhdHVyZSA9IG5ldyBTYXZlQW5kUmVtb3ZlQWxsRW50aXRpZXNGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsgICAgCQotICAgICAgICBDb250ZXh0TWVudUVudHJ5IHNhdmVBbmRSZW1vdkVudGl0eU1lbnVJdGVtID0gbmV3IENvbnRleHRNZW51RW50cnkoY3VzdG9tRmVhdHVyZSwgY29udGV4dCk7Ci0gICAgICAgIHNhdmVBbmRSZW1vdkVudGl0eU1lbnVJdGVtLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQW5kU2F2ZUFsbEVudGl0aWVzQWN0aW9uKTsKLSAgICAgICAgc2F2ZUFuZFJlbW92RW50aXR5TWVudUl0ZW0uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQW5kU2F2ZUFsbEVudGl0aWVzQWN0aW9uKTsKLSAgICAgICAgc2F2ZUFuZFJlbW92RW50aXR5TWVudUl0ZW0uc2V0U3VibWVudShmYWxzZSk7Ci0gICAgICAgIAotCQljdXN0b21GZWF0dXJlID0gbmV3IERpc2NhcmRBbmRSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOyAgICAJCi0gICAgICAgIENvbnRleHRNZW51RW50cnkgZGlzY2FyZEFuZFJlbW92RW50aXR5TWVudUl0ZW0gPSBuZXcgQ29udGV4dE1lbnVFbnRyeShjdXN0b21GZWF0dXJlLCBjb250ZXh0KTsKLSAgICAgICAgZGlzY2FyZEFuZFJlbW92RW50aXR5TWVudUl0ZW0uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbmREaXNjYXJkQWxsRW50aXRpZXNBY3Rpb24pOwotICAgICAgICBkaXNjYXJkQW5kUmVtb3ZFbnRpdHlNZW51SXRlbS5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbmREaXNjYXJkQWxsRW50aXRpZXNBY3Rpb24pOwotICAgICAgICBkaXNjYXJkQW5kUmVtb3ZFbnRpdHlNZW51SXRlbS5zZXRTdWJtZW51KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgIHJlbW92ZUFsbEVudGl0aWVzU3VibWVudS5hZGQoc2F2ZUFuZFJlbW92RW50aXR5TWVudUl0ZW0pOwotICAgICAgICByZW1vdmVBbGxFbnRpdGllc1N1Ym1lbnUuYWRkKGRpc2NhcmRBbmRSZW1vdkVudGl0eU1lbnVJdGVtKTsKLSAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgIAlpZiAoKHBpY3RFbHMgPT0gbnVsbCkgfHwgKHBpY3RFbHMubGVuZ3RoID09IDApKSAKLSAgICAJCXJldHVybiBuZXcgSUNvbnRleHRNZW51RW50cnlbXSB7IG9wZW5KUEFEZXRhaWxzVmlld01lbnVJdGVtIH07Ci0gICAgCWlmIChwaWN0RWxzWzBdIGluc3RhbmNlb2YgQ29udGFpbmVyU2hhcGUpIHsKLSAgICAJCU9iamVjdCBvYiA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwaWN0RWxzWzBdKTsKLSAgICAgICAgICAgIGlmIChwaWN0RWxzWzBdIGluc3RhbmNlb2YgRGlhZ3JhbSkgewotICAgICAgICAgICAgCUlDdXN0b21GZWF0dXJlIGN1c3RvbUZlYXR1cmUgPSBuZXcgQWRkQWxsRW50aXRpZXNGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsgICAgCQotICAgICAgICAgICAgICAgIENvbnRleHRNZW51RW50cnkgc2hvd0FsbEVudHNNZW51SXRlbSA9IG5ldyBDb250ZXh0TWVudUVudHJ5KGN1c3RvbUZlYXR1cmUsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgIHNob3dBbGxFbnRzTWVudUl0ZW0uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9zaG93QWxsVGhlRW50aXRpZXMpOwotICAgICAgICAgICAgICAgIHNob3dBbGxFbnRzTWVudUl0ZW0uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2hvd0FsbFRoZUVudGl0aWVzRGVzYyk7Ci0gICAgICAgICAgICAgICAgc2hvd0FsbEVudHNNZW51SXRlbS5zZXRTdWJtZW51KGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpZihpc0VtcHR5KXsKLSAgICAgICAgICAgICAgICAJcmV0dXJuIG5ldyBJQ29udGV4dE1lbnVFbnRyeVtdIHsgc2hvd0FsbEVudHNNZW51SXRlbSwKLSAgICAgICAgICAgICAgICAJCQkgY29sbGFwc2VBbGxNZW51SXRlbSwKLSAgICAgICAgICAgICAgICAJCQkgZXhwYW5kQWxsTWVudUl0ZW0sCi0JCQkJCQkJIG9wZW5KUEFEZXRhaWxzVmlld01lbnVJdGVtLAotCQkJCQkJCSBvcGVuTWluaWF0dXJlVmlld01lbnVJdGVtfTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSUNvbnRleHRNZW51RW50cnlbXSB7IHNob3dBbGxFbnRzTWVudUl0ZW0sIAotICAgICAgICAgICAgICAgIAkJCQkJCQkJIHJlbW92ZUFsbEVudGl0aWVzU3VibWVudSwKLSAgICAgICAgICAgICAgICAJCQkJCQkJCSBjb2xsYXBzZUFsbE1lbnVJdGVtLAotICAgICAgICAgICAgICAgIAkJCQkJCQkJIGV4cGFuZEFsbE1lbnVJdGVtLAotICAgICAgICAgICAgICAgIAkJCQkJCQkJIG9wZW5KUEFEZXRhaWxzVmlld01lbnVJdGVtLAotICAgICAgICAgICAgICAgIAkJCQkJCQkJIG9wZW5NaW5pYXR1cmVWaWV3TWVudUl0ZW19OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgCX0gICAgCi0gICAgICAgICAgICBpZigob2IgPT0gbnVsbCkgJiYgKHBpY3RFbHNbMF0uZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSBpbnN0YW5jZW9mIFJlY3RhbmdsZSkpewotICAgICAgICAgICAgCUlDdXN0b21GZWF0dXJlIGNvbGxhcHNlQ29tcGFydG1lbnRGZWF0dXJlID0gbmV3IENvbGxhcHNlQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotICAgICAgICAJCUNvbnRleHRNZW51RW50cnkgY29sbGFwc2VDb21wYXJ0bWVudE1lbnVJdGVtID0gbmV3IENvbnRleHRNZW51RW50cnkoY29sbGFwc2VDb21wYXJ0bWVudEZlYXR1cmUsIGNvbnRleHQpOwotICAgICAgICAJCWNvbGxhcHNlQ29tcGFydG1lbnRNZW51SXRlbS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NvbGxhcHNlQXR0ckdyb3VwTWVudUl0ZW0pOwotICAgICAgICAJCWNvbGxhcHNlQ29tcGFydG1lbnRNZW51SXRlbS5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUF0dHJHcm91cE1lbnVJdGVtRGVzY3IpOwotICAgICAgICAJCWNvbGxhcHNlQ29tcGFydG1lbnRNZW51SXRlbS5zZXRTdWJtZW51KGZhbHNlKTsKLQotICAgICAgICAJCUlDdXN0b21GZWF0dXJlIGV4cGFuZENvbXBhcnRtZW50RmVhdHVyZSA9IG5ldyBFeHBhbmRDb21wYXJ0bWVudFNoYXBlRmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0gICAgICAgIAkJQ29udGV4dE1lbnVFbnRyeSBleHBhbmRDb21wYXJ0bWVudE1lbnVJdGVtPSBuZXcgQ29udGV4dE1lbnVFbnRyeShleHBhbmRDb21wYXJ0bWVudEZlYXR1cmUsIGNvbnRleHQpOwotICAgICAgICAJCWV4cGFuZENvbXBhcnRtZW50TWVudUl0ZW0uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRBdHRyTWVudUl0ZW0pOwotICAgICAgICAJCWV4cGFuZENvbXBhcnRtZW50TWVudUl0ZW0uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZXhwYW5kQXR0ck1lbnVJdGVtRGVzY3IpOwotICAgICAgICAJCWV4cGFuZENvbXBhcnRtZW50TWVudUl0ZW0uc2V0U3VibWVudShmYWxzZSk7Ci0gICAgICAgIAkJcmV0dXJuIG5ldyBJQ29udGV4dE1lbnVFbnRyeVtdIHtjb2xsYXBzZUNvbXBhcnRtZW50TWVudUl0ZW0sIGV4cGFuZENvbXBhcnRtZW50TWVudUl0ZW19OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgLy9BcHBseSBQYXR0ZXJuIG1lbnUKLSAgICAgICAgICAgIAotICAgICAgICAgICAgSUN1c3RvbUZlYXR1cmUgYXBwbHlQYXR0ZXJuRmVhdHVyZSA9IG5ldyBBcHBseVBhdHRlcm5GZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLSAgICAgICAgICAgIENvbnRleHRNZW51RW50cnkgYXBwbHlQYXR0ZXJuTWVudUl0ZW0gPSBuZXcgQ29udGV4dE1lbnVFbnRyeShhcHBseVBhdHRlcm5GZWF0dXJlLCBjb250ZXh0KTsKLSAgICAgICAgICAgIGFwcGx5UGF0dGVybk1lbnVJdGVtLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfYXBwbHlQYXR0ZXJuKTsKLSAgICAgICAgICAgIGFwcGx5UGF0dGVybk1lbnVJdGVtLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2FwcGx5UGF0dGVybkRlc2MpOwotICAgICAgICAgICAgYXBwbHlQYXR0ZXJuTWVudUl0ZW0uc2V0U3VibWVudShmYWxzZSk7Ci0gICAgICAgICAgICAvL0FwcGx5IFBhdHRlcm4gbWVudQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIENvbnRleHRNZW51RW50cnkgcmVmYWN0b3JDbGFzc1N1Ym1lbnUgPSBuZXcgQ29udGV4dE1lbnVFbnRyeShudWxsLCBudWxsKTsKLSAgICAgICAgICAgIHJlZmFjdG9yQ2xhc3NTdWJtZW51LnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVmYWN0b3JTdWJNZW51KTsKLSAgICAgICAgICAgIHJlZmFjdG9yQ2xhc3NTdWJtZW51LnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlZmFjdG9yU3ViTWVudSk7Ci0gICAgICAgICAgICByZWZhY3RvckNsYXNzU3VibWVudS5zZXRTdWJtZW51KHRydWUpOwotICAgICAgICAgICAgCi0gICAgCQkKLSAgICAgICAgICAgIElDdXN0b21GZWF0dXJlIGN1c3RvbUZlYXR1cmUgPSBuZXcgUmVuYW1lRW50aXR5RmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7ICAgIAkKLSAgICAgICAgICAgIENvbnRleHRNZW51RW50cnkgcmVuYW1lRW50aXR5TWVudUl0ZW0gPSBuZXcgQ29udGV4dE1lbnVFbnRyeShjdXN0b21GZWF0dXJlLCBjb250ZXh0KTsKLSAgICAgICAgICAgIHJlbmFtZUVudGl0eU1lbnVJdGVtLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVuYW1lRW50aXR5Q2xhc3MpOwotICAgICAgICAgICAgcmVuYW1lRW50aXR5TWVudUl0ZW0uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVuYW1lRW50aXR5Q2xhc3MpOwotICAgICAgICAgICAgcmVuYW1lRW50aXR5TWVudUl0ZW0uc2V0U3VibWVudShmYWxzZSk7Ci0gICAgICAgICAgICAKLSAgICAJCWN1c3RvbUZlYXR1cmUgPSBuZXcgTW92ZUVudGl0eUZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOyAgICAJCi0gICAgICAgICAgICBDb250ZXh0TWVudUVudHJ5IG1vdmVFbnRpdHlNZW51SXRlbSA9IG5ldyBDb250ZXh0TWVudUVudHJ5KGN1c3RvbUZlYXR1cmUsIGNvbnRleHQpOwotICAgICAgICAgICAgbW92ZUVudGl0eU1lbnVJdGVtLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfbW92ZUVudGl0eUNsYXNzKTsKLSAgICAgICAgICAgIG1vdmVFbnRpdHlNZW51SXRlbS5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9tb3ZlRW50aXR5Q2xhc3MpOwotICAgICAgICAgICAgbW92ZUVudGl0eU1lbnVJdGVtLnNldFN1Ym1lbnUoZmFsc2UpOyAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICByZWZhY3RvckNsYXNzU3VibWVudS5hZGQocmVuYW1lRW50aXR5TWVudUl0ZW0pOwotICAgICAgICAgICAgcmVmYWN0b3JDbGFzc1N1Ym1lbnUuYWRkKG1vdmVFbnRpdHlNZW51SXRlbSk7ICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIHNoYXBlVHlwZSA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUocGljdEVsc1swXSwgSlBBRWRpdG9yQ29uc3RhbnRzLlBST1BfU0hBUEVfVFlQRSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICgoc2hhcGVUeXBlID09IG51bGwpIHx8ICFzaGFwZVR5cGUuZXF1YWxzKFNoYXBlVHlwZS5BVFRSSUJVVEUudG9TdHJpbmcoKSkpIAotICAgICAgICAgICAgCXJldHVybiBuZXcgSUNvbnRleHRNZW51RW50cnlbXSB7IHNhdmVFbnRpdHlNZW51SXRlbSwKLSAgICAgICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZhY3RvckNsYXNzU3VibWVudSwKLSAgICAgICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZUVudGl0eU1lbnVJdGVtLCAKLSAgICAgICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZUFsbE1lbnVJdGVtLAotICAgICAgICAgICAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZEVudGl0eU1lbnVJdGVtLAotICAgICAgICAgICAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZEFsbE1lbnVJdGVtLAotICAgICAgICAgICAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVFbnRpdHlNZW51SXRlbSwKLSAgICAgICAgICAgIAkJCQkJCQkJCSAvL2FwcGx5UGF0dGVybk1lbnVJdGVtLCAKLSAgICAgICAgICAgIAkJCQkJCQkJCSByZW1vdmVBbGxFbnRpdGllc1N1Ym1lbnUsCi0gICAgICAgICAgICAJCQkJCQkJCQkgb3BlbkpQQURldGFpbHNWaWV3TWVudUl0ZW0sCi0gICAgICAgICAgICAJCQkJCQkJCQkgb3Blbk1pbmlhdHVyZVZpZXdNZW51SXRlbX07Ci0gICAgICAgICAgICAKLSAgICAJCWN1c3RvbUZlYXR1cmUgPSBuZXcgUmVmYWN0b3JBdHRyaWJ1dGVUeXBlRmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7ICAgICAJCQotICAgICAgICAgICAgQ29udGV4dE1lbnVFbnRyeSByZWZhY3RvckF0dHJpYnV0ZVR5cGVNZW51SXRlbSA9IG5ldyBDb250ZXh0TWVudUVudHJ5KGN1c3RvbUZlYXR1cmUsIGNvbnRleHQpOwotICAgICAgICAgICAgcmVmYWN0b3JBdHRyaWJ1dGVUeXBlTWVudUl0ZW0uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZWZhY3RvckF0dHJpYnV0ZVR5cGUpOwotICAgICAgICAgICAgcmVmYWN0b3JBdHRyaWJ1dGVUeXBlTWVudUl0ZW0uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVmYWN0b3JBdHRyaWJ1dGVUeXBlRGVzYyk7Ci0gICAgICAgICAgICByZWZhY3RvckF0dHJpYnV0ZVR5cGVNZW51SXRlbS5zZXRTdWJtZW51KGZhbHNlKTsgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgCXJldHVybiBuZXcgSUNvbnRleHRNZW51RW50cnlbXSB7IHJlZmFjdG9yQ2xhc3NTdWJtZW51LCAKLSAgICAgICAgCQkJCQkJCQkJIHJlZmFjdG9yQXR0cmlidXRlVHlwZU1lbnVJdGVtLCAKLSAgICAgICAgCQkJCQkJCQkJIGNvbGxhcHNlQWxsTWVudUl0ZW0sCi0gICAgICAgIAkJCQkJCQkJCSBleHBhbmRBbGxNZW51SXRlbSwKLSAgICAgICAgCQkJCQkJCQkJIC8vYXBwbHlQYXR0ZXJuTWVudUl0ZW0sIAotICAgICAgICAJCQkJCQkJCQkgb3BlbkpQQURldGFpbHNWaWV3TWVudUl0ZW0sCi0gICAgICAgIAkJCQkJCQkJCSBvcGVuTWluaWF0dXJlVmlld01lbnVJdGVtfTsKLSAgICAJfQotICAgIAlyZXR1cm4gbmV3IElDb250ZXh0TWVudUVudHJ5W10geyByZW1vdmVBbGxFbnRpdGllc1N1Ym1lbnUsCi0gICAgCQkJCQkJCQkJIGNvbGxhcHNlQWxsTWVudUl0ZW0sCi0gICAgCQkJCQkJCQkJIGV4cGFuZEFsbE1lbnVJdGVtLCAKLSAgICAJCQkJCQkJCQkgb3BlbkpQQURldGFpbHNWaWV3TWVudUl0ZW0sCi0gICAgCQkJCQkJCQkJIG9wZW5NaW5pYXR1cmVWaWV3TWVudUl0ZW19OwotICAgIH0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJQ3VzdG9tRmVhdHVyZSBnZXREb3VibGVDbGlja0ZlYXR1cmUoSURvdWJsZUNsaWNrQ29udGV4dCBjb250ZXh0KSB7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnRzKClbMF07Ci0JCU9iamVjdCBibyA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudCgKLQkJCQlwZSk7Ci0JCWlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEgPSAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGJvOwotCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkganBhLmdldFJlc291cmNlKCk7Ci0JCQl0cnkgewotCQkJCWZpbGUuc2V0U2Vzc2lvblByb3BlcnR5KG5ldyBRdWFsaWZpZWROYW1lKG51bGwsIEpQQUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kuRE9VQkxFX0NMSUNLKSwgInRydWUiKTsJLy8kTk9OLU5MUy0xJAkJCQotCQkJCWZhY2FkZS5nZXRJREUoKS5vcGVuRWRpdG9yKGZpbGUpOwotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCBvcGVuIGVkaXRvciIsIGUpOyAvLyROT04tTkxTLTEkCQkJCQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IG9wZW4gZWRpdG9yIiwgZSk7IC8vJE5PTi1OTFMtMSQJCQkJCQkJCQotCQkJfQotCQl9Ci0JCWlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGJvOwotCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkganB0LmdldFJlc291cmNlKCk7Ci0JCQl0cnkgewotCQkJCWZpbGUuc2V0U2Vzc2lvblByb3BlcnR5KG5ldyBRdWFsaWZpZWROYW1lKG51bGwsIEpQQUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kuRE9VQkxFX0NMSUNLKSwgInRydWUiKTsJLy8kTk9OLU5MUy0xJAotCQkJCWZhY2FkZS5nZXRJREUoKS5vcGVuRWRpdG9yKGZpbGUpOwotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCBvcGVuIGVkaXRvciIsIGUpOyAvLyROT04tTkxTLTEkCQkJCQkJCQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IG9wZW4gZWRpdG9yIiwgZSk7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQl9Ci0JCX0KLQkJaWYgKChibyA9PSBudWxsKSAmJiAocGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSBpbnN0YW5jZW9mIFJlY3RhbmdsZSkpIHsKLQkJCUlDdXN0b21Db250ZXh0IGNvbnQgPSBuZXcgQ3VzdG9tQ29udGV4dCgKLQkJCQkJbmV3IFBpY3RvZ3JhbUVsZW1lbnRbXSB7IHBlIH0pOwotCQkJQ29udGFpbmVyU2hhcGUgY29udGFpbmVyU2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIHBlOwotCQkJaWYgKEdyYXBoaWNzVXBkYXRlci5pc0NvbGxhcHNlZChjb250YWluZXJTaGFwZSkpIHsKLQkJCQlFeHBhbmRDb21wYXJ0bWVudFNoYXBlRmVhdHVyZSBmZWF0dXJlID0gbmV3IEV4cGFuZENvbXBhcnRtZW50U2hhcGVGZWF0dXJlKAotCQkJCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQkJCWZlYXR1cmUuZXhlY3V0ZShjb250KTsKLQkJCX0gZWxzZSB7Ci0JCQkJQ29sbGFwc2VDb21wYXJ0bWVudFNoYXBlRmVhdHVyZSBmZWF0dXJlID0gbmV3IENvbGxhcHNlQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUoCi0JCQkJCQlnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQkJZmVhdHVyZS5leGVjdXRlKGNvbnQpOwotCQkJfQotCi0JCX0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldERvdWJsZUNsaWNrRmVhdHVyZShjb250ZXh0KTsKLQl9ICAgCQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9BYnN0cmFjdFJlbGF0aW9uLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL0Fic3RyYWN0UmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmMWYzZS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL0Fic3RyYWN0UmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBBYnN0cmFjdFJlbGF0aW9uIGltcGxlbWVudHMgSVJlbGF0aW9uIHsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBTRVBBUkFUT1IgPSAiOyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyOwotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgaW52ZXJzZTsKLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG93bmVyQXR0cmlidXRlTmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGludmVyc2VBdHRyaWJ1dGVOYW1lOwotCi0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBIYXNodGFibGU8UmVsVHlwZSwgU3RyaW5nPiByZWxUeXBlVG9JZFBhcnQgPSBuZXcgSGFzaHRhYmxlPFJlbFR5cGUsIFN0cmluZz4oKTsgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBIYXNodGFibGU8UmVsRGlyLCBTdHJpbmc+IHJlbERpclRvSWRQYXJ0ID0gbmV3IEhhc2h0YWJsZTxSZWxEaXIsIFN0cmluZz4oKTsgCi0JCi0Jc3RhdGljIHsKLQkJcmVsVHlwZVRvSWRQYXJ0LnB1dChSZWxUeXBlLk9ORV9UT19PTkUsICIxLTEiKTsgLy8kTk9OLU5MUy0xJAotCQlyZWxUeXBlVG9JZFBhcnQucHV0KFJlbFR5cGUuT05FX1RPX01BTlksICIxLU4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZWxUeXBlVG9JZFBhcnQucHV0KFJlbFR5cGUuTUFOWV9UT19PTkUsICJOLTEiKTsgLy8kTk9OLU5MUy0xJAotCQlyZWxUeXBlVG9JZFBhcnQucHV0KFJlbFR5cGUuTUFOWV9UT19NQU5ZLCAiTi1OIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXJlbERpclRvSWRQYXJ0LnB1dChSZWxEaXIuVU5JLCAiLT4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZWxEaXJUb0lkUGFydC5wdXQoUmVsRGlyLkJJLCAiPC0+Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIEFic3RyYWN0UmVsYXRpb24oSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyLCBKYXZhUGVyc2lzdGVudFR5cGUgaW52ZXJzZSkgewotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCXRoaXMuaW52ZXJzZSA9IGludmVyc2U7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBnZW5lcmF0ZUlkKG93bmVyLCBpbnZlcnNlLCBnZXRPd25lckF0dHJpYnV0ZU5hbWUoKSwgZ2V0UmVsVHlwZSgpLCBnZXRSZWxEaXIoKSk7Ci0JfQotCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiBvd25lcjsgCi0JfQotCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0SW52ZXJzZSgpIHsKLQkJcmV0dXJuIGludmVyc2U7IAotCX0JCi0JCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlOwotCX0KLQkKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0T3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBvd25lckFubm90YXRlZEF0dHJpYnV0ZTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHNldE93bmVyQW5ub3RhdGVkQXR0cmlidXRlKAotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUpIHsKLQkJdGhpcy5vd25lckFubm90YXRlZEF0dHJpYnV0ZSA9IG93bmVyQW5ub3RhdGVkQXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUoCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKSB7Ci0JCXRoaXMuaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSA9IGludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3duZXJBdHRyaWJ1dGVOYW1lKFN0cmluZyBvd25lckF0dHJpYnV0ZU5hbWUpIHsKLQkJdGhpcy5vd25lckF0dHJpYnV0ZU5hbWUgPSBvd25lckF0dHJpYnV0ZU5hbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkgewotCQlpZiAodGhpcy5vd25lckFubm90YXRlZEF0dHJpYnV0ZSAhPSBudWxsKQotCQkJcmV0dXJuIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlLmdldE5hbWUoKTsKLQkJcmV0dXJuIG93bmVyQXR0cmlidXRlTmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW52ZXJzZUF0dHJpYnV0ZU5hbWUoU3RyaW5nIGludmVyc2VBdHRyaWJ1dGVOYW1lKSB7Ci0JCXRoaXMuaW52ZXJzZUF0dHJpYnV0ZU5hbWUgPSBpbnZlcnNlQXR0cmlidXRlTmFtZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJbnZlcnNlQXR0cmlidXRlTmFtZSgpIHsKLQkJaWYgKHRoaXMuaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSAhPSBudWxsKQotCQkJcmV0dXJuIGludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQlyZXR1cm4gaW52ZXJzZUF0dHJpYnV0ZU5hbWU7Ci0JfQotCQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBnZXRJZCgpLmhhc2hDb2RlKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXJSZWwpIHsKLQkJaWYgKCFJUmVsYXRpb24uY2xhc3MuaXNJbnN0YW5jZShvdGhlclJlbCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBnZXRJZCgpLmVxdWFscygoKElSZWxhdGlvbilvdGhlclJlbCkuZ2V0SWQoKSk7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBSZWxUeXBlIGdldFJlbFR5cGUoKTsgCi0JCi0JcHVibGljIGFic3RyYWN0IFJlbERpciBnZXRSZWxEaXIoKTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0ZUlkKEphdmFQZXJzaXN0ZW50VHlwZSBvd25lciwgCi0JCQkJCQkJCQlKYXZhUGVyc2lzdGVudFR5cGUgaW52ZXJzZSwgCi0JCQkJCQkJCQlTdHJpbmcgb3duZXJBdHRyaWJ1dGVOYW1lLAotCQkJCQkJCQkJUmVsVHlwZSByZWxUeXBlLCAKLQkJCQkJCQkJCVJlbERpciByZWxEaXIpIHsKLQkJU3RyaW5nIGlkID0gb3duZXIuZ2V0TmFtZSgpICsgIi0iICsgaW52ZXJzZS5nZXROYW1lKCkgKyBTRVBBUkFUT1IgKyAgLy8kTk9OLU5MUy0xJAotCQkJCQlyZWxUeXBlVG9JZFBhcnQuZ2V0KHJlbFR5cGUpICsgU0VQQVJBVE9SICsKLQkJCQkJcmVsRGlyVG9JZFBhcnQuZ2V0KHJlbERpcikgKyBTRVBBUkFUT1IgKyBvd25lckF0dHJpYnV0ZU5hbWU7IAotCQlyZXR1cm4gaWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL0lCaWRpcmVjdGlvbmFsUmVsYXRpb24uamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvSUJpZGlyZWN0aW9uYWxSZWxhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjc0Njg3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvSUJpZGlyZWN0aW9uYWxSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUJpZGlyZWN0aW9uYWxSZWxhdGlvbiBleHRlbmRzIElSZWxhdGlvbiB7Ci0JCi0JcHVibGljIGFic3RyYWN0IEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldE93bmVyQW5ub3RhdGVkQXR0cmlidXRlKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0SW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSgpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0T3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKTsgCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL0lSZWxhdGlvbi5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9JUmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1Njg0Ni4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL0lSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLQotcHVibGljIGludGVyZmFjZSBJUmVsYXRpb24gewotCi0JcHVibGljIHN0YXRpYyBlbnVtIFJlbFR5cGUgewotCQlPTkVfVE9fT05FLCBPTkVfVE9fTUFOWSwgTUFOWV9UT19PTkUsIE1BTllfVE9fTUFOWQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZW51bSBSZWxEaXIgewotCQlVTkksIEJJCi0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRJZCgpOwotCi0JcHVibGljIGFic3RyYWN0IEphdmFQZXJzaXN0ZW50VHlwZSBnZXRPd25lcigpOwotCi0JcHVibGljIGFic3RyYWN0IEphdmFQZXJzaXN0ZW50VHlwZSBnZXRJbnZlcnNlKCk7Ci0JCi0JcHVibGljIHZvaWQgc2V0T3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUpOwotCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRPd25lckFubm90YXRlZEF0dHJpYnV0ZSgpOwotCQkKLQlwdWJsaWMgdm9pZCBzZXRJbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUpOwotCQkJCQotCXB1YmxpYyB2b2lkIHNldE93bmVyQXR0cmlidXRlTmFtZShTdHJpbmcgb3duZXJBdHRyaWJ1dGVOYW1lKTsKLQkJCi0JcHVibGljIHZvaWQgc2V0SW52ZXJzZUF0dHJpYnV0ZU5hbWUoU3RyaW5nIGludmVyc2VBdHRyaWJ1dGVOYW1lKTsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0SW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSgpOwotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRPd25lckF0dHJpYnV0ZU5hbWUoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0SW52ZXJzZUF0dHJpYnV0ZU5hbWUoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBSZWxUeXBlIGdldFJlbFR5cGUoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBSZWxEaXIgZ2V0UmVsRGlyKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL0lzQVJlbGF0aW9uLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL0lzQVJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZGEzMTYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9Jc0FSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLQotcHVibGljIGNsYXNzIElzQVJlbGF0aW9uIHsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUEFSQVRPUiA9ICI7aXNBOyI7CQkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJU19BX0NPTk5FQ1RJT05fUFJPUF9LRVkgPSAiaXNfaXNfYV9jb25uZWN0aW9uIjsJLy8kTk9OLU5MUy0xJAotCQotCQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgc3ViY2xhc3M7Ci0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50VHlwZSBzdXBlcmNsYXNzOwotCQotCXB1YmxpYyBJc0FSZWxhdGlvbihKYXZhUGVyc2lzdGVudFR5cGUgc3ViY2xhc3MsIAotCQkJCQkgICBKYXZhUGVyc2lzdGVudFR5cGUgc3VwZXJjbGFzcykgewotCQl0aGlzLnN1YmNsYXNzID0gc3ViY2xhc3M7Ci0JCXRoaXMuc3VwZXJjbGFzcyA9IHN1cGVyY2xhc3M7Ci0JfQotCQotCXB1YmxpYyBJc0FSZWxhdGlvbihJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBDb25uZWN0aW9uIGNvbm4pIHsKLQkJQW5jaG9yIHN0YXJ0ID0gY29ubi5nZXRTdGFydCgpOwotCQlBbmNob3IgZW5kID0gY29ubi5nZXRFbmQoKTsKLQkJT2JqZWN0IHN0YXJ0T2JqID0gZnAuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KChDb250YWluZXJTaGFwZSlzdGFydC5lQ29udGFpbmVyKCkpOwotCQlPYmplY3QgZW5kT2JqID0gZnAuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KChDb250YWluZXJTaGFwZSllbmQuZUNvbnRhaW5lcigpKTsKLQkJaWYgKChzdGFydE9iaiA9PSBudWxsKSB8fCAoZW5kT2JqID09IG51bGwpKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJTb21lIG9mIHRoZSBjb25uZWN0aW9uIGVuZHMgaXMgbnVsbCIpOwkvLyROT04tTkxTLTEkCi0JCWlmICghKHN0YXJ0T2JqIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSB8fCAhKGVuZE9iaiBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXRoaXMuc3ViY2xhc3MgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKXN0YXJ0T2JqOwotCQl0aGlzLnN1cGVyY2xhc3MgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWVuZE9iajsKLQl9Ci0JCi0JCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRTdWJjbGFzcygpIHsKLQkJcmV0dXJuIHN1YmNsYXNzOyAKLQl9Ci0JCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRTdXBlcmNsYXNzKCkgewotCQlyZXR1cm4gc3VwZXJjbGFzczsgCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0lzQUNvbm5lY3Rpb24oQ29ubmVjdGlvbiBjb25uKSB7Ci0JCVN0cmluZyB2YWwgPSBKUEFFZGl0b3JVdGlsLmdldFBlVXRpbCgpLmdldFByb3BlcnR5VmFsdWUoY29ubiwgSVNfQV9DT05ORUNUSU9OX1BST1BfS0VZKTsKLQkJcmV0dXJuIChCb29sZWFuLlRSVUUudG9TdHJpbmcoKS5lcXVhbHModmFsKSk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZ2VuZXJhdGVJZChzdWJjbGFzcywgc3VwZXJjbGFzcyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlSWQoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgQ29ubmVjdGlvbiBjb25uKSB7Ci0JCUFuY2hvciBzdGFydCA9IGNvbm4uZ2V0U3RhcnQoKTsKLQkJQW5jaG9yIGVuZCA9IGNvbm4uZ2V0RW5kKCk7Ci0JCU9iamVjdCBzdGFydE9iaiA9IGZwLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudCgoQ29udGFpbmVyU2hhcGUpc3RhcnQuZUNvbnRhaW5lcigpKTsKLQkJT2JqZWN0IGVuZE9iaiA9IGZwLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudCgoQ29udGFpbmVyU2hhcGUpZW5kLmVDb250YWluZXIoKSk7Ci0JCWlmICgoc3RhcnRPYmogPT0gbnVsbCkgfHwgKGVuZE9iaiA9PSBudWxsKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIShzdGFydE9iaiBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgfHwgIShlbmRPYmogaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBzdGFydEpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpc3RhcnRPYmo7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBlbmRKcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWVuZE9iajsKLQkJcmV0dXJuIGdlbmVyYXRlSWQoc3RhcnRKcHQsIGVuZEpwdCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZW5lcmF0ZUlkKEphdmFQZXJzaXN0ZW50VHlwZSBzdGFydEpwdCwgSmF2YVBlcnNpc3RlbnRUeXBlIGVuZEpwdCkgewotCQlyZXR1cm4gSlBBRWRpdG9yQ29uc3RhbnRzLklTX0FfUkVMQVRJT05fSURfUFJFRklYICsgCi0JCQkJc3RhcnRKcHQuZ2V0TmFtZSgpICsgU0VQQVJBVE9SICsgZW5kSnB0LmdldE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodGhpcy5oYXNoQ29kZSgpICE9IG9iai5oYXNoQ29kZSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJc0FSZWxhdGlvbikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlzQVJlbGF0aW9uIHJlbCA9IChJc0FSZWxhdGlvbilvYmo7IAotCQlyZXR1cm4gdGhpcy5nZXRJZCgpLmVxdWFscyhyZWwuZ2V0SWQoKSk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBnZXRJZCgpLmhhc2hDb2RlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL01hbnlUb01hbnlCaURpclJlbGF0aW9uLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL01hbnlUb01hbnlCaURpclJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1N2NkOWMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9NYW55VG9NYW55QmlEaXJSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLkpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIE1hbnlUb01hbnlCaURpclJlbGF0aW9uIGV4dGVuZHMgTWFueVRvTWFueVJlbGF0aW9uIGltcGxlbWVudHMgSUJpZGlyZWN0aW9uYWxSZWxhdGlvbiB7Ci0JCi0JcHVibGljIE1hbnlUb01hbnlCaURpclJlbGF0aW9uKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBvd25lciwgCi0JCQkJCQkJCSAgIEphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlLAotCQkJCQkJCQkgICBTdHJpbmcgb3duZXJBdHRyaWJ1dGVOYW1lLAotCQkJCQkJCQkgICBTdHJpbmcgaW52ZXJzZUF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJCSAgIGJvb2xlYW4gY3JlYXRlQXR0cmlicywKLQkJCQkJCQkJICAgSUNvbXBpbGF0aW9uVW5pdCBvd25lckNVLCAKLQkJCQkJCQkJICAgSUNvbXBpbGF0aW9uVW5pdCBpbnZlcnNlQ1UpIHsKLQkJc3VwZXIob3duZXIsIGludmVyc2UpOwotCQl0aGlzLm93bmVyQXR0cmlidXRlTmFtZSA9IG93bmVyQXR0cmlidXRlTmFtZTsKLQkJdGhpcy5pbnZlcnNlQXR0cmlidXRlTmFtZSA9IGludmVyc2VBdHRyaWJ1dGVOYW1lOwotCQlpZiAoY3JlYXRlQXR0cmlicykKLQkJCWNyZWF0ZVJlbGF0aW9uKGZwLCBvd25lckNVLCBpbnZlcnNlQ1UpOwkJCi0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5yZWxhdGlvbnMuQmlkaXJlY3Rpb25hbFJlbGF0aW9uI2dldE93bmVyQW5ub3RhdGVkQXR0cmlidXRlKCkKLQkgKi8KLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0T3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBvd25lckFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPd25lckFubm90YXRlZEF0dHJpYnV0ZSgKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlKSB7Ci0JCXRoaXMub3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBvd25lckFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5yZWxhdGlvbnMuQmlkaXJlY3Rpb25hbFJlbGF0aW9uI2dldEludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUoKQotCSAqLwotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRJbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKCkgewotCQlyZXR1cm4gaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKAotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSkgewotCQl0aGlzLmludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlOwotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlbGF0aW9uKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIElDb21waWxhdGlvblVuaXQgb3duZXJDVSwgSUNvbXBpbGF0aW9uVW5pdCBpbnZlcnNlQ1UpIHsKLQkJU3RyaW5nIGludmVyc2VBdHRyaWJ1dGVOYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGludmVyc2UuZ2V0TmFtZSgpKTsKLQkJU3RyaW5nIGFjdEludmVyc2VBdHRyaWJ1dGVOYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUoaW52ZXJzZSkpOwotCQkKLQkJU3RyaW5nIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIoaW52ZXJzZUF0dHJpYnV0ZU5hbWUpOwotCQlTdHJpbmcgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihhY3RJbnZlcnNlQXR0cmlidXRlTmFtZSk7Ci0JCQotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQob3duZXIpKSB7Ci0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoaW52ZXJzZUF0dHJpYnV0ZU5hbWUpOwotCQkJYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKGFjdEludmVyc2VBdHRyaWJ1dGVOYW1lKTsKLQkJfQotCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKG93bmVyLCBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIpOwotCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKG93bmVyLCBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIpOyAKLQkJCi0JCW93bmVyQW5ub3RhdGVkQXR0cmlidXRlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkQXR0cmlidXRlKGZwLCBvd25lciwgaW52ZXJzZSwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJCUpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuaXNNYXBUeXBlKG93bmVyLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpID8gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0SWRUeXBlKGludmVyc2UpIDogbnVsbCwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgdHJ1ZSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgb3duZXJDVSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgaW52ZXJzZUNVKTsKLQkJCi0JCVN0cmluZyBvd25lckF0dHJpYnV0ZU5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUob3duZXIuZ2V0TmFtZSgpKTsKLQkJU3RyaW5nIGFjdE93bmVyQXR0cmlidXRlTmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKG93bmVyKSk7Ci0JCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIob3duZXJBdHRyaWJ1dGVOYW1lKTsKLQkJYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihhY3RPd25lckF0dHJpYnV0ZU5hbWUpOwkJCQkKLQkJCi0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChpbnZlcnNlKSkgewotCQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKG93bmVyQXR0cmlidXRlTmFtZSk7Ci0JCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoYWN0T3duZXJBdHRyaWJ1dGVOYW1lKTsKLQkJfQotCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKGludmVyc2UsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7IAotCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKGludmVyc2UsIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7IAotCQlib29sZWFuIGlzTWFwID0gSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5pc01hcFR5cGUob3duZXIuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JCWludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRBdHRyaWJ1dGUoZnAsIGludmVyc2UsIG93bmVyLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgICBpc01hcCA/IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldElkVHlwZShvd25lcikgOiBudWxsLAotCQkJCQkJCQkJCQkJCQkJCQkJCSAgIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJICAgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgICB0cnVlLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgICBpbnZlcnNlQ1UsCi0JCQkJCQkJCQkJCQkJCQkJCQkJICAgb3duZXJDVSk7Ci0JCQotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRNYW55VG9NYW55QmlkaXJlY3Rpb25hbFJlbGF0aW9uKGZwLCBvd25lciwgb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUsIGludmVyc2UsIGludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUsIGlzTWFwKTsJCQotCX0gCQotCQotCXB1YmxpYyBSZWxEaXIgZ2V0UmVsRGlyKCkgewotCQlyZXR1cm4gUmVsRGlyLkJJOwotCX0KLQkJCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9NYW55VG9NYW55UmVsYXRpb24uamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvTWFueVRvTWFueVJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ODMzYjQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9NYW55VG9NYW55UmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE1hbnlUb01hbnlSZWxhdGlvbiBleHRlbmRzIEFic3RyYWN0UmVsYXRpb24gewotCi0JcHVibGljIE1hbnlUb01hbnlSZWxhdGlvbihKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIsIEphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlKSB7Ci0JCXN1cGVyKG93bmVyLCBpbnZlcnNlKTsKLQl9Ci0JCi0JcHVibGljIFJlbFR5cGUgZ2V0UmVsVHlwZSgpIHsKLQkJcmV0dXJuIFJlbFR5cGUuTUFOWV9UT19NQU5ZOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9NYW55VG9NYW55VW5pRGlyUmVsYXRpb24uamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvTWFueVRvTWFueVVuaURpclJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MGMyM2MuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9NYW55VG9NYW55VW5pRGlyUmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLkpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIE1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbiBleHRlbmRzIE1hbnlUb01hbnlSZWxhdGlvbiBpbXBsZW1lbnRzIFVuaWRpcmVjdGlvbmFsUmVsYXRpb24gewotCi0JcHVibGljIE1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbihJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIsIAotCQkJCQkJCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UsCi0JCQkJCQkJCQlTdHJpbmcgb3duZXJBdHRyaWJ1dGVOYW1lLAotCQkJCQkJCQkJYm9vbGVhbiBjcmVhdGVBdHRyaWJzLAotCQkJCQkJCQkJSUNvbXBpbGF0aW9uVW5pdCBvd25lckNVLAotCQkJCQkJCQkJSUNvbXBpbGF0aW9uVW5pdCBpbnZlcnNlQ1UpIHsgCi0JCXN1cGVyKG93bmVyLCBpbnZlcnNlKTsKLQkJdGhpcy5vd25lckF0dHJpYnV0ZU5hbWUgPSBvd25lckF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChjcmVhdGVBdHRyaWJzKQotCQkJY3JlYXRlUmVsYXRpb24oZnAsIG93bmVyQ1UsIGludmVyc2VDVSk7CQkKLQl9Ci0KLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0QW5ub3RhdGVkQXR0cmlidXRlKCkgewotCQlyZXR1cm4gb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QW5ub3RhdGVkQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGFubm90YXRlZEF0dHJpYnV0ZSkgewotCQl0aGlzLm93bmVyQW5ub3RhdGVkQXR0cmlidXRlID0gYW5ub3RhdGVkQXR0cmlidXRlOwotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlbGF0aW9uKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIElDb21waWxhdGlvblVuaXQgb3duZXJDVSwKLQkJCQkJCQkJSUNvbXBpbGF0aW9uVW5pdCBpbnZlcnNlQ1UpIHsKLQkJU3RyaW5nIG5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoaW52ZXJzZS5nZXROYW1lKCkpOwotCQlTdHJpbmcgYWN0TmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKGludmVyc2UpKTsKLQkJCi0JCVN0cmluZyBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKG5hbWUpOwotCQlTdHJpbmcgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihhY3ROYW1lKTsKLQkJCi0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChvd25lcikpIHsKLQkJCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShuYW1lKTsKLQkJCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShhY3ROYW1lKTsKLQkJfQotCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKG93bmVyLCBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIpOyAKLQkJYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsgCi0JCWJvb2xlYW4gaXNNYXAgPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmlzTWFwVHlwZShvd25lci5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQkJb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRBdHRyaWJ1dGUoZnAsIG93bmVyLCBpbnZlcnNlLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkJaXNNYXAgPyBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRJZFR5cGUoaW52ZXJzZSkgOiBudWxsLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkgICBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIAotCQkJCQkJCQkJCQkJCQkJCQkJCQkgICBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAgIHRydWUsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAgIG93bmVyQ1UsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAgIGludmVyc2VDVSk7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmFkZE1hbnlUb01hbnlVbmlkaXJlY3Rpb25hbFJlbGF0aW9uKGZwLCBvd25lciwgb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUsIGlzTWFwKTsKLQkJCi0JfSAKLQkKLQlwdWJsaWMgUmVsRGlyIGdldFJlbERpcigpIHsKLQkJcmV0dXJuIFJlbERpci5VTkk7Ci0JfQkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL01hbnlUb09uZUJpRGlyUmVsYXRpb24uamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvTWFueVRvT25lQmlEaXJSZWxhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDhhZDBmLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvTWFueVRvT25lQmlEaXJSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLkpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIE1hbnlUb09uZUJpRGlyUmVsYXRpb24gIGV4dGVuZHMgTWFueVRvT25lUmVsYXRpb24gaW1wbGVtZW50cyBJQmlkaXJlY3Rpb25hbFJlbGF0aW9uewotCi0JcHVibGljIE1hbnlUb09uZUJpRGlyUmVsYXRpb24oSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyLCAKLQkJCQkJCQkJICBKYXZhUGVyc2lzdGVudFR5cGUgaW52ZXJzZSwgCi0JCQkJCQkJCSAgU3RyaW5nIG93bmVyQXR0cmlidXRlTmFtZSwKLQkJCQkJCQkJICBTdHJpbmcgaW52ZXJzZUF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJCSAgYm9vbGVhbiBjcmVhdGVBdHRyaWJzLAotCQkJCQkJCQkgIElDb21waWxhdGlvblVuaXQgb3duZXJDVSwKLQkJCQkJCQkJICBJQ29tcGlsYXRpb25Vbml0IGludmVyc2VDVSkgewotCQlzdXBlcihvd25lciwgaW52ZXJzZSk7Ci0JCXRoaXMub3duZXJBdHRyaWJ1dGVOYW1lID0gb3duZXJBdHRyaWJ1dGVOYW1lOwotCQl0aGlzLmludmVyc2VBdHRyaWJ1dGVOYW1lID0gaW52ZXJzZUF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChjcmVhdGVBdHRyaWJzKQotCQkJY3JlYXRlUmVsYXRpb24oZnAsIG93bmVyQ1UsIGludmVyc2VDVSk7Ci0JCQotCX0JCi0KLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0T3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBvd25lckFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPd25lckFubm90YXRlZEF0dHJpYnV0ZSgJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUpIHsKLQkJdGhpcy5vd25lckFubm90YXRlZEF0dHJpYnV0ZSA9IG93bmVyQW5ub3RhdGVkQXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRJbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKCkgewotCQlyZXR1cm4gaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUpIHsKLQkJdGhpcy5pbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlID0gaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUmVsYXRpb24oSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgSUNvbXBpbGF0aW9uVW5pdCBvd25lckNVLCBJQ29tcGlsYXRpb25Vbml0IGludmVyc2VDVSkgewotCQlTdHJpbmcgbmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShpbnZlcnNlLmdldE5hbWUoKSk7Ci0JCVN0cmluZyBhY3ROYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUoaW52ZXJzZSkpOwotCQlTdHJpbmcgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihuYW1lKTsKLQkJU3RyaW5nIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIoYWN0TmFtZSk7Ci0JCQotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQob3duZXIpKSB7Ci0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUobmFtZSk7Ci0JCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoYWN0TmFtZSk7Ci0JCX0KLQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsKLQkJYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsKLQotCQlvd25lckFubm90YXRlZEF0dHJpYnV0ZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmFkZEF0dHJpYnV0ZShmcCwgb3duZXIsIGludmVyc2UsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIGZhbHNlLAotCQkJCQkJCQkJCQkJCQkJCQkJCSBvd25lckNVLAotCQkJCQkJCQkJCQkJCQkJCQkJCSBpbnZlcnNlQ1UpOwotCQkKLQkJbmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShvd25lci5nZXROYW1lKCkpOwotCQlhY3ROYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUob3duZXIpKTsJCi0JCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIobmFtZSk7Ci0JCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIoYWN0TmFtZSk7CQkJCQotCQkKLQkJaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKGludmVyc2UpKSB7Ci0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUobmFtZSk7Ci0JCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoYWN0TmFtZSk7Ci0JCX0KLQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShpbnZlcnNlLCBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIpOwotCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKGludmVyc2UsIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7IAotCQlib29sZWFuIGlzTWFwID0gSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5pc01hcFR5cGUob3duZXIuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JCWludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRBdHRyaWJ1dGUoZnAsIGludmVyc2UsIG93bmVyLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgICBpc01hcCA/IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldElkVHlwZShvd25lcikgOiBudWxsLAotCQkJCQkJCQkJCQkJCQkJCQkJCSAgIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciwgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgICB0cnVlLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgICBpbnZlcnNlQ1UsCi0JCQkJCQkJCQkJCQkJCQkJCQkJICAgb3duZXJDVSk7Ci0JCQotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRNYW55VG9PbmVCaWRpcmVjdGlvbmFsUmVsYXRpb24oZnAsIG93bmVyLCBvd25lckFubm90YXRlZEF0dHJpYnV0ZSwgaW52ZXJzZSwgaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSwgaXNNYXApOwkJCi0JfSAJCi0JCQotCXB1YmxpYyBSZWxEaXIgZ2V0UmVsRGlyKCkgewotCQlyZXR1cm4gUmVsRGlyLkJJOwotCX0KLQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvTWFueVRvT25lUmVsYXRpb24uamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvTWFueVRvT25lUmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBkZjEzMS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL01hbnlUb09uZVJlbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBNYW55VG9PbmVSZWxhdGlvbiBleHRlbmRzIEFic3RyYWN0UmVsYXRpb257Ci0KLQlwdWJsaWMgTWFueVRvT25lUmVsYXRpb24oSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyLCBKYXZhUGVyc2lzdGVudFR5cGUgaW52ZXJzZSkgewotCQlzdXBlcihvd25lciwgaW52ZXJzZSk7Ci0JfQotCQotCXB1YmxpYyBSZWxUeXBlIGdldFJlbFR5cGUoKSB7Ci0JCXJldHVybiBSZWxUeXBlLk1BTllfVE9fT05FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9NYW55VG9PbmVVbmlEaXJSZWxhdGlvbi5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9NYW55VG9PbmVVbmlEaXJSZWxhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTllYjI5Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvTWFueVRvT25lVW5pRGlyUmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIE1hbnlUb09uZVVuaURpclJlbGF0aW9uIGV4dGVuZHMgTWFueVRvT25lUmVsYXRpb24gaW1wbGVtZW50cyBVbmlkaXJlY3Rpb25hbFJlbGF0aW9uIHsKLQotCXB1YmxpYyBNYW55VG9PbmVVbmlEaXJSZWxhdGlvbihJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIsIAotCQkJCQkJCQkgICBKYXZhUGVyc2lzdGVudFR5cGUgaW52ZXJzZSwKLQkJCQkJCQkJICAgU3RyaW5nIG93bmVyQXR0cmlidXRlTmFtZSwKLQkJCQkJCQkJICAgYm9vbGVhbiBjcmVhdGVBdHRyaWJzLAotCQkJCQkJCQkgICBJQ29tcGlsYXRpb25Vbml0IG93bmVyQ1UsCi0JCQkJCQkJCSAgIElDb21waWxhdGlvblVuaXQgaW52ZXJzZUNVKSB7CQkKLQkJc3VwZXIob3duZXIsIGludmVyc2UpOwotCQl0aGlzLm93bmVyQXR0cmlidXRlTmFtZSA9IG93bmVyQXR0cmlidXRlTmFtZTsKLQkJaWYgKGNyZWF0ZUF0dHJpYnMpCi0JCQljcmVhdGVSZWxhdGlvbihmcCwgb3duZXJDVSwgaW52ZXJzZUNVKTsJCQotCX0JCi0JCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEFubm90YXRlZEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFubm90YXRlZEF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhbm5vdGF0ZWRBdHRyaWJ1dGUpIHsKLQkJdGhpcy5vd25lckFubm90YXRlZEF0dHJpYnV0ZSA9IGFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUmVsYXRpb24oSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgSUNvbXBpbGF0aW9uVW5pdCBvd25lckNVLCBJQ29tcGlsYXRpb25Vbml0IGludmVyc2VDVSkgewotCQlTdHJpbmcgbmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShpbnZlcnNlLmdldE5hbWUoKSk7Ci0JCVN0cmluZyBhY3ROYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUoaW52ZXJzZSkpOwotCQlTdHJpbmcgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihuYW1lKTsKLQkJU3RyaW5nIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIoYWN0TmFtZSk7Ci0JCQotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQob3duZXIpKSB7Ci0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUobmFtZSk7Ci0JCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoYWN0TmFtZSk7Ci0JCX0KLQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsgCi0JCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcgk9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7IAotCQkKLQkJLy9mcC5hZGRBZGRJZ25vcmUob3duZXIsIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7Ci0JCQotCQlvd25lckFubm90YXRlZEF0dHJpYnV0ZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmFkZEF0dHJpYnV0ZShmcCwgb3duZXIsIGludmVyc2UsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIGZhbHNlLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgb3duZXJDVSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkgaW52ZXJzZUNVKTsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkTWFueVRvT25lVW5pZGlyZWN0aW9uYWxSZWxhdGlvbihmcCwgb3duZXIsIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlKTsKLQkJCi0JfQotCQotCXB1YmxpYyBSZWxEaXIgZ2V0UmVsRGlyKCkgewotCQlyZXR1cm4gUmVsRGlyLlVOSTsKLQl9CQkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvT25lVG9NYW55UmVsYXRpb24uamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvT25lVG9NYW55UmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM1ZTcxMy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL09uZVRvTWFueVJlbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPbmVUb01hbnlSZWxhdGlvbiBleHRlbmRzIEFic3RyYWN0UmVsYXRpb24gewotCQotCXB1YmxpYyBPbmVUb01hbnlSZWxhdGlvbihKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIsIEphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlKSB7Ci0JCXN1cGVyKG93bmVyLCBpbnZlcnNlKTsKLQl9Ci0JCi0JcHVibGljIFJlbFR5cGUgZ2V0UmVsVHlwZSgpIHsKLQkJcmV0dXJuIFJlbFR5cGUuT05FX1RPX01BTlk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL09uZVRvTWFueVVuaURpclJlbGF0aW9uLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL09uZVRvTWFueVVuaURpclJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZjA2MzcuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9PbmVUb01hbnlVbmlEaXJSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuSlBBRGlhZ3JhbVByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgT25lVG9NYW55VW5pRGlyUmVsYXRpb24gZXh0ZW5kcyBPbmVUb01hbnlSZWxhdGlvbiBpbXBsZW1lbnRzIFVuaWRpcmVjdGlvbmFsUmVsYXRpb24gewotCi0JcHVibGljIE9uZVRvTWFueVVuaURpclJlbGF0aW9uKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBvd25lciwgCi0JCQkJCQkJCSAgIEphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlLAotCQkJCQkJCQkgICBTdHJpbmcgb3duZXJBdHRyaWJ1dGVOYW1lLAotCQkJCQkJCQkgICBib29sZWFuIGNyZWF0ZUF0dHJpYnMsIAotCQkJCQkJCQkgICBJQ29tcGlsYXRpb25Vbml0IG93bmVyQ1UsCi0JCQkJCQkJCSAgIElDb21waWxhdGlvblVuaXQgaW52ZXJzZUNVKSB7Ci0JCXN1cGVyKG93bmVyLCBpbnZlcnNlKTsKLQkJdGhpcy5vd25lckF0dHJpYnV0ZU5hbWUgPSBvd25lckF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChjcmVhdGVBdHRyaWJzKQotCQkJY3JlYXRlUmVsYXRpb24oZnAsIG93bmVyQ1UsIGludmVyc2VDVSk7CQkKLQl9CQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEFubm90YXRlZEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFubm90YXRlZEF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhbm5vdGF0ZWRBdHRyaWJ1dGUpIHsKLQkJdGhpcy5vd25lckFubm90YXRlZEF0dHJpYnV0ZSA9IGFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUmVsYXRpb24oSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgSUNvbXBpbGF0aW9uVW5pdCBvd25lckNVLAotCQkJCQkJCQlJQ29tcGlsYXRpb25Vbml0IGludmVyc2VDVSkgewotCQlTdHJpbmcgbmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShpbnZlcnNlLmdldE5hbWUoKSk7Ci0JCVN0cmluZyBhY3ROYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUoaW52ZXJzZSkpOwotCi0JCVN0cmluZyBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKG5hbWUpOwotCQlTdHJpbmcgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihhY3ROYW1lKTsKLQkJCi0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChvd25lcikpIHsKLQkJCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShuYW1lKTsKLQkJCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShhY3ROYW1lKTsKLQkJfQotCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKG93bmVyLCBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIpOyAKLQkJYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsgCi0JCWJvb2xlYW4gaXNNYXAgPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmlzTWFwVHlwZShvd25lci5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQkJb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRBdHRyaWJ1dGUoZnAsIG93bmVyLCBpbnZlcnNlLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgaXNNYXAgPyBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRJZFR5cGUoaW52ZXJzZSkgOiBudWxsLAotCQkJCQkJCQkJCQkJCQkJCQkJCSBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIHRydWUsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSBvd25lckNVLAotCQkJCQkJCQkJCQkJCQkJCQkJCSBpbnZlcnNlQ1UpOwotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRPbmVUb01hbnlVbmlkaXJlY3Rpb25hbFJlbGF0aW9uKGZwLCBvd25lciwgb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUsIGlzTWFwKTsKLQl9IAotCQotCXB1YmxpYyBSZWxEaXIgZ2V0UmVsRGlyKCkgewotCQlyZXR1cm4gUmVsRGlyLlVOSTsKLQl9CQkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL09uZVRvT25lQmlEaXJSZWxhdGlvbi5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9PbmVUb09uZUJpRGlyUmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNhYjU5ZS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL09uZVRvT25lQmlEaXJSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIE9uZVRvT25lQmlEaXJSZWxhdGlvbiBleHRlbmRzIE9uZVRvT25lUmVsYXRpb24gaW1wbGVtZW50cyBJQmlkaXJlY3Rpb25hbFJlbGF0aW9uewotCXB1YmxpYyBPbmVUb09uZUJpRGlyUmVsYXRpb24oSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyLCAKLQkJCQkJCQkJIEphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlLCAKLQkJCQkJCQkJIFN0cmluZyBvd25lckF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJCSBTdHJpbmcgaW52ZXJzZUF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJCSBib29sZWFuIGNyZWF0ZUF0dHJpYnMsCi0JCQkJCQkJCSBJQ29tcGlsYXRpb25Vbml0IG93bmVyQ1UsCi0JCQkJCQkJCSBJQ29tcGlsYXRpb25Vbml0IGludmVyc2VDVSkgewotCQlzdXBlcihvd25lciwgaW52ZXJzZSk7Ci0JCXRoaXMub3duZXJBdHRyaWJ1dGVOYW1lID0gb3duZXJBdHRyaWJ1dGVOYW1lOwotCQl0aGlzLmludmVyc2VBdHRyaWJ1dGVOYW1lID0gaW52ZXJzZUF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChjcmVhdGVBdHRyaWJzKQotCQkJY3JlYXRlUmVsYXRpb24oZnAsIG93bmVyQ1UsIGludmVyc2VDVSk7Ci0JfQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldE93bmVyQW5ub3RhdGVkQXR0cmlidXRlKCkgewotCQlyZXR1cm4gb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUoCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lckFubm90YXRlZEF0dHJpYnV0ZSkgewotCQl0aGlzLm93bmVyQW5ub3RhdGVkQXR0cmlidXRlID0gb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUoCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKSB7Ci0JCXRoaXMuaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSA9IGludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlbGF0aW9uKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIElDb21waWxhdGlvblVuaXQgb3duZXJDVSwgSUNvbXBpbGF0aW9uVW5pdCBpbnZlcnNlQ1UpIHsKLQkJU3RyaW5nIG5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoaW52ZXJzZS5nZXROYW1lKCkpOwotCQlTdHJpbmcgYWN0TmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKGludmVyc2UpKTsKLQkJU3RyaW5nIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIobmFtZSk7Ci0JCVN0cmluZyBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdE5hbWUpOwotCQkKLQkJaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKG93bmVyKSkgewotCQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKG5hbWUpOwotCQkJYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKGFjdE5hbWUpOwotCQl9Ci0JCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7Ci0JCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7IAotCQkKLQkJb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRBdHRyaWJ1dGUoZnAsIG93bmVyLCBpbnZlcnNlLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyLCBmYWxzZSwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJIG93bmVyQ1UsCi0JCQkJCQkJCQkJCQkJCQkJCQkJIGludmVyc2VDVSk7Ci0JCQotCQluYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKG93bmVyLmdldE5hbWUoKSk7Ci0JCWFjdE5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShvd25lcikpOwotCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKG5hbWUpOwotCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdE5hbWUpOwkJCi0JCQotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQoaW52ZXJzZSkpIHsKLQkJCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShuYW1lKTsKLQkJCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShhY3ROYW1lKTsKLQkJfQotCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKGludmVyc2UsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7IAotCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKGludmVyc2UsIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7IAotCQlpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkQXR0cmlidXRlKGZwLCBpbnZlcnNlLCBvd25lciwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJICAgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyLCBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSAgIGZhbHNlLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgICBpbnZlcnNlQ1UsCi0JCQkJCQkJCQkJCQkJCQkJCQkJICAgb3duZXJDVSk7Ci0JCQotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRPbmVUb09uZUJpZGlyZWN0aW9uYWxSZWxhdGlvbihmcCwgb3duZXIsIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlLCBpbnZlcnNlLCBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKTsJCQotCX0gCQotCQkKLQlwdWJsaWMgUmVsRGlyIGdldFJlbERpcigpIHsKLQkJcmV0dXJuIFJlbERpci5CSTsKLQl9CQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9PbmVUb09uZVJlbGF0aW9uLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL09uZVRvT25lUmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIxMTlmMy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL09uZVRvT25lUmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIE9uZVRvT25lUmVsYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFJlbGF0aW9uIHsKLQkKLQlwdWJsaWMgT25lVG9PbmVSZWxhdGlvbihKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIsIAotCQkJCQkJCUphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlKSB7Ci0JCXN1cGVyKG93bmVyLCBpbnZlcnNlKTsKLQl9Ci0JCi0JcHVibGljIFJlbFR5cGUgZ2V0UmVsVHlwZSgpIHsKLQkJcmV0dXJuIFJlbFR5cGUuT05FX1RPX09ORTsKLQl9Ci0JCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9PbmVUb09uZVVuaURpclJlbGF0aW9uLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL09uZVRvT25lVW5pRGlyUmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQyOTA2OC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL09uZVRvT25lVW5pRGlyUmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIE9uZVRvT25lVW5pRGlyUmVsYXRpb24gZXh0ZW5kcyBPbmVUb09uZVJlbGF0aW9uIGltcGxlbWVudHMgVW5pZGlyZWN0aW9uYWxSZWxhdGlvbiB7Ci0KLQlwdWJsaWMgT25lVG9PbmVVbmlEaXJSZWxhdGlvbihJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIsIAotCQkJCQkJCQkgIEphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlLCAKLQkJCQkJCQkJICBTdHJpbmcgb3duZXJBdHRyaWJ1dGVOYW1lLAotCQkJCQkJCQkgIGJvb2xlYW4gY3JlYXRlQXR0cmlicywgCi0JCQkJCQkJCSAgSUNvbXBpbGF0aW9uVW5pdCBvd25lckNVLAotCQkJCQkJCQkgIElDb21waWxhdGlvblVuaXQgaW52ZXJzZUNVKSB7Ci0JCXN1cGVyKG93bmVyLCBpbnZlcnNlKTsKLQkJdGhpcy5vd25lckF0dHJpYnV0ZU5hbWUgPSBvd25lckF0dHJpYnV0ZU5hbWU7IAotCQlpZiAoY3JlYXRlQXR0cmlicykgCi0JCQljcmVhdGVSZWxhdGlvbihmcCwgb3duZXJDVSwgaW52ZXJzZUNVKTsKLQl9Ci0JCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEFubm90YXRlZEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFubm90YXRlZEF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhbm5vdGF0ZWRBdHRyaWJ1dGUpIHsKLQkJdGhpcy5vd25lckFubm90YXRlZEF0dHJpYnV0ZSA9IGFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUmVsYXRpb24oSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgSUNvbXBpbGF0aW9uVW5pdCBvd25lckNVLCBJQ29tcGlsYXRpb25Vbml0IGludmVyc2VDVSkgewotCQlTdHJpbmcgbmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShpbnZlcnNlLmdldE5hbWUoKSk7Ci0JCVN0cmluZyBhY3ROYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUoaW52ZXJzZSkpOwotCQkKLQkJU3RyaW5nIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIobmFtZSk7Ci0JCVN0cmluZyBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdE5hbWUpOwotCQkKLQkJaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKG93bmVyKSkgewotCQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKG5hbWUpOwotCQkJYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKGFjdE5hbWUpOwotCQl9Ci0JCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7Ci0JCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7Ci0JCQotCQlvd25lckFubm90YXRlZEF0dHJpYnV0ZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmFkZEF0dHJpYnV0ZShmcCwgb3duZXIsIGludmVyc2UsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIGZhbHNlLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgb3duZXJDVSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkgaW52ZXJzZUNVKTsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkT25lVG9PbmVVbmlkaXJlY3Rpb25hbFJlbGF0aW9uKGZwLCBvd25lciwgb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUpOwotCQkKLQl9IAotCQkKLQlwdWJsaWMgUmVsRGlyIGdldFJlbERpcigpIHsKLQkJcmV0dXJuIFJlbERpci5VTkk7Ci0JfQkJCi0JCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvVW5pZGlyZWN0aW9uYWxSZWxhdGlvbi5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9VbmlkaXJlY3Rpb25hbFJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZmI4NWEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9VbmlkaXJlY3Rpb25hbFJlbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQotcHVibGljIGludGVyZmFjZSBVbmlkaXJlY3Rpb25hbFJlbGF0aW9uIGV4dGVuZHMgSVJlbGF0aW9uIHsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0QW5ub3RhdGVkQXR0cmlidXRlKCk7Ci0JCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0QW5ub3RhdGVkQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0KTsKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9FbnRpdGllc0Nvb3JkaW5hdGVzWE1MLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9FbnRpdGllc0Nvb3JkaW5hdGVzWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiN2I0MDIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvRW50aXRpZXNDb29yZGluYXRlc1hNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5Sb3VuZGVkUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnNlcnZpY2VzLkdyYXBoaXRpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnV0aWwuTW9kZWxJbnRlZ3JhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEVudGl0aWVzQ29vcmRpbmF0ZXNYTUwgewotCQotCXByaXZhdGUgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0JcHJpdmF0ZSBFbGVtZW50IHJvb3RFbGVtZW50OwotCXByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX1BPU0lUSU9OID0gIlxuXHRcdCI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JcHVibGljIEVudGl0aWVzQ29vcmRpbmF0ZXNYTUwoU3RyaW5nIHByb2plY3ROYW1lKXsKLQkJdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY3VtZW50QnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCWRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCURvY3VtZW50QnVpbGRlciBkb2N1bWVudEJ1aWxkZXIgPSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJaXMgPSAoSW5wdXRTdHJlYW0pZmluZFhNTEZpbGUodHJ1ZSk7Ci0JCQlkb2N1bWVudCA9IGRvY3VtZW50QnVpbGRlci5wYXJzZShpcyk7Ci0JCQlyb290RWxlbWVudCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoSlBBRWRpdG9yTWVzc2FnZXMuRW50aXRpZXNDb29yZGluYXRlc1hNTF9DYW5ub3RQYXJzZUZpbGVFcnJvck1TRywgZSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKEpQQUVkaXRvck1lc3NhZ2VzLkVudGl0aWVzQ29vcmRpbmF0ZXNYTUxfQ2Fubm90UGFyc2VGaWxlRXJyb3JNU0csIGUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKEpQQUVkaXRvck1lc3NhZ2VzLkVudGl0aWVzQ29vcmRpbmF0ZXNYTUxfQ2Fubm90UmVhZEZpbGVFcnJvck1TRywgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaXMgIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQlpcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQl9Ci0JfQotCi0JCi0gICAgcHJpdmF0ZSBDbG9zZWFibGUgZmluZFhNTEZpbGUoYm9vbGVhbiBpbnB1dFN0cmVhbSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbnsKLSAgICAJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCXRyeSB7Ci0JCQlJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBwcm9qZWN0Lm1lbWJlcnMoKTsKLQkJCWZvciAoSVJlc291cmNlIHJlcyA6IHJlc291cmNlcykgewotCQkJCWlmIChyZXMgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQkJCUlGaWxlIGV4aXN0aW5nWE1MRmlsZSA9ICgoSUZvbGRlcikgcmVzKS5nZXRGaWxlKHByb2plY3ROYW1lICsgIi4iICsgTW9kZWxJbnRlZ3JhdGlvblV0aWwuRElBR1JBTV9YTUxfRklMRV9FWFRFTlNJT04pOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChleGlzdGluZ1hNTEZpbGUgIT0gbnVsbCAmJiBleGlzdGluZ1hNTEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCXJldHVybiBpbnB1dFN0cmVhbSA/IAotCQkJCQkJCQluZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGV4aXN0aW5nWE1MRmlsZS5nZXRMb2NhdGlvblVSSSgpKSkgOgotCQkJCQkJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoZXhpc3RpbmdYTUxGaWxlLmdldExvY2F0aW9uVVJJKCkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKEpQQUVkaXRvck1lc3NhZ2VzLkVudGl0aWVzQ29vcmRpbmF0ZXNYTUxfQ2Fubm90T2J0YWluUHJvamVjdEVycm9yTVNHLCBlKTsKLQkJfQotCQlJRmlsZSBleGlzdGluZ1hNTEZpbGUgPSBwcm9qZWN0LmdldEZpbGUoTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0RGlhZ3JhbXNYTUxGb2xkZXJQYXRoKHByb2plY3QpLmFwcGVuZChwcm9qZWN0TmFtZSkuYWRkRmlsZUV4dGVuc2lvbihNb2RlbEludGVncmF0aW9uVXRpbC5ESUFHUkFNX1hNTF9GSUxFX0VYVEVOU0lPTikpOwotCQlyZXR1cm4gaW5wdXRTdHJlYW0gPyBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGV4aXN0aW5nWE1MRmlsZS5nZXRMb2NhdGlvblVSSSgpKSkgOgotCQkJCQkJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoZXhpc3RpbmdYTUxGaWxlLmdldExvY2F0aW9uVVJJKCkpKTsKLSAgICB9Ci0JCi0gICAgc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIHN0b3JlKCkgewotICAgIAlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAJRGlhZ3JhbSBkaWFncmFtID0gTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0RGlhZ3JhbUJ5UHJvamVjdChwcm9qZWN0KTsKLQkJTGlzdDxTaGFwZT4gcGljdHMgPSBkaWFncmFtLmdldENoaWxkcmVuKCk7Ci0JCUl0ZXJhdG9yPFNoYXBlPiBpdCA9IHBpY3RzLml0ZXJhdG9yKCk7Ci0JCS8vIGNvbGxlY3RpbmcgZGF0YSBmcm9tIHRoZSBzYXZlZCBwaWN0b2dyYW1zCi0JCWRvY3VtZW50LnJlbW92ZUNoaWxkKHJvb3RFbGVtZW50KTsKLQkJcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJlbnRpdGllcyIpOyAvLyROT04tTkxTLTEkCi0JCWRvY3VtZW50LmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsKLQotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlTaGFwZSBwaWN0ID0gaXQubmV4dCgpOwotCQkJU3RyaW5nIG5hbWUgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRQcm9wZXJ0eVZhbHVlKHBpY3QsIEpQQUVkaXRvckNvbnN0YW50cy5QUk9QX0VOVElUWV9DTEFTU19OQU1FKTsKLQotCQkJUm91bmRlZFJlY3RhbmdsZSByZWN0ID0gKFJvdW5kZWRSZWN0YW5nbGUpIHBpY3QuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQotCQkJYm9vbGVhbiBpc1ByaW1hcnlDb2xsYXBzZWQgPSBKUEFFZGl0b3JDb25zdGFudHMuVFJVRV9TVFJJTkcuZXF1YWxzKEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUocGljdCwKLQkJCQkJCQlKUEFFZGl0b3JDb25zdGFudHMuUFJJTUFSWV9DT0xMQVBTRUQpKTsKLQkJCWJvb2xlYW4gaXNSZWxhdGlvbkNvbGxhcHNlZCA9IEpQQUVkaXRvckNvbnN0YW50cy5UUlVFX1NUUklORy5lcXVhbHMoR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShwaWN0LAotCQkJCQkJCUpQQUVkaXRvckNvbnN0YW50cy5SRUxBVElPTl9DT0xMQVBTRUQpKTsKLQkJCWJvb2xlYW4gaXNCYXNpY0NvbGxhcHNlZCA9IEpQQUVkaXRvckNvbnN0YW50cy5UUlVFX1NUUklORy5lcXVhbHMoR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShwaWN0LAotCQkJCQkJCUpQQUVkaXRvckNvbnN0YW50cy5CQVNJQ19DT0xMQVBTRUQpKTsKLQotCQkJRWxlbWVudCBlbnRpdHkgPSBjcmVhdGVFbnRpdHlFbGVtZW50VGFnKGRvY3VtZW50LCByb290RWxlbWVudCwgSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9YTUxfVEFHLCBYTUxfRUxFTUVOVF9QT1NJVElPTik7Ci0JCQlUZXh0IG5hbWVUZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmFtZSk7Ci0JCQlFbGVtZW50IGVudGl0eU5hbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfTkFNRV9UQUcpOwotCQkJY3JlYXRlQ2hpbGRFbGVtZW50VGFnKGRvY3VtZW50LCBuYW1lVGV4dCwgZW50aXR5TmFtZSwgZW50aXR5LCBYTUxfRUxFTUVOVF9QT1NJVElPTik7Ci0KLQkJCVRleHQgd2lkdGggPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcudmFsdWVPZihyZWN0LmdldFdpZHRoKCkpKTsKLQkJCUVsZW1lbnQgZW50aXR5V2lkdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfV0lEVEhfVEFHKTsKLQkJCWNyZWF0ZUNoaWxkRWxlbWVudFRhZyhkb2N1bWVudCwgd2lkdGgsIGVudGl0eVdpZHRoLCBlbnRpdHksIFhNTF9FTEVNRU5UX1BPU0lUSU9OKTsKLQotCQkJVGV4dCBoZWlnaHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcudmFsdWVPZihyZWN0LmdldEhlaWdodCgpKSk7Ci0JCQlFbGVtZW50IGVudGl0eUhlaWdodCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9IRUlHSFRfVEFHKTsKLQkJCWNyZWF0ZUNoaWxkRWxlbWVudFRhZyhkb2N1bWVudCwgaGVpZ2h0LCBlbnRpdHlIZWlnaHQsIGVudGl0eSwgWE1MX0VMRU1FTlRfUE9TSVRJT04pOwotCi0JCQlUZXh0IHhDb29yZGluYXRlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLnZhbHVlT2YocmVjdC5nZXRYKCkpKTsKLQkJCUVsZW1lbnQgZW50aXR5WENvb3JkaW5hdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfWF9DT09SRElOQVRFX1RBRyk7Ci0JCQljcmVhdGVDaGlsZEVsZW1lbnRUYWcoZG9jdW1lbnQsIHhDb29yZGluYXRlLCBlbnRpdHlYQ29vcmRpbmF0ZSwJZW50aXR5LCBYTUxfRUxFTUVOVF9QT1NJVElPTik7Ci0KLQkJCVRleHQgeUNvb3JkaW5hdGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcudmFsdWVPZihyZWN0LmdldFkoKSkpOwotCQkJRWxlbWVudCBlbnRpdHlZQ29vcmRpbmF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9ZX0NPT1JESU5BVEVfVEFHKTsKLQkJCWNyZWF0ZUNoaWxkRWxlbWVudFRhZyhkb2N1bWVudCwgeUNvb3JkaW5hdGUsIGVudGl0eVlDb29yZGluYXRlLAllbnRpdHksIFhNTF9FTEVNRU5UX1BPU0lUSU9OKTsKLQkJCQotCQkJVGV4dCBwcmltYXJ5Q29sbGFwc2VkID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLnZhbHVlT2YoaXNQcmltYXJ5Q29sbGFwc2VkKSk7Ci0JCQlFbGVtZW50IGVudGl0eVByaW1hcnlDb2xsYXBzZWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfUFJJTUFSWV9TRUNUSU9OX1NUQVRFX1RBRyk7Ci0JCQljcmVhdGVDaGlsZEVsZW1lbnRUYWcoZG9jdW1lbnQsIHByaW1hcnlDb2xsYXBzZWQsIGVudGl0eVByaW1hcnlDb2xsYXBzZWQsIGVudGl0eSwgWE1MX0VMRU1FTlRfUE9TSVRJT04pOwkKLQkJCQotCQkJVGV4dCByZWxhdGlvbkNvbGxhcHNlZCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy52YWx1ZU9mKGlzUmVsYXRpb25Db2xsYXBzZWQpKTsKLQkJCUVsZW1lbnQgZW50aXR5UmVsYXRpb25Db2xsYXBzZWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfUkVMQVRJT05fU0VDVElPTl9TVEFURV9UQUcpOwotCQkJY3JlYXRlQ2hpbGRFbGVtZW50VGFnKGRvY3VtZW50LCByZWxhdGlvbkNvbGxhcHNlZCwgZW50aXR5UmVsYXRpb25Db2xsYXBzZWQsCWVudGl0eSwgWE1MX0VMRU1FTlRfUE9TSVRJT04pOwotCQkJCi0JCQlUZXh0IGJhc2ljQ29sbGFwc2VkID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLnZhbHVlT2YoaXNCYXNpY0NvbGxhcHNlZCkpOwotCQkJRWxlbWVudCBlbnRpdHlCYXNpY0NvbGxhcHNlZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9CQVNJQ19TRUNUSU9OX1NUQVRFX1RBRyk7Ci0JCQljcmVhdGVDaGlsZEVsZW1lbnRUYWcoZG9jdW1lbnQsIGJhc2ljQ29sbGFwc2VkLCBlbnRpdHlCYXNpY0NvbGxhcHNlZCwJZW50aXR5LCAiXG5cdCIpOwkgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlyb290RWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiXG4iKSk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0JCU1vZGVsSW50ZWdyYXRpb25VdGlsLnNldFhtaUV4aXN0cyhmYWxzZSk7Ci0JfQotCi0Jc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIGxvYWQoSGFzaHRhYmxlPFN0cmluZywgU2l6ZVBvc2l0aW9uPiBtYXJrcyl7Ci0JCWlmKHJvb3RFbGVtZW50LmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKTw9MSl7Ci0JCQlpZihNb2RlbEludGVncmF0aW9uVXRpbC54bWlFeGlzdHMoKSl7Ci0JCQkJc3RvcmUoKTsKLQkJCQlzYXZlKCk7Ci0JCQl9Ci0JCX0gCi0JCQotCQlOb2RlTGlzdCBub2RlTGlzdCA9IHJvb3RFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfWE1MX1RBRyk7Ci0JCWZvcihpbnQgaT0wOyBpPG5vZGVMaXN0LmdldExlbmd0aCgpO2krKyl7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZUxpc3QuaXRlbShpKTsKLQkJCVN0cmluZyBlbnRpdHlOYW1lID0gbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZShKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX05BTUVfVEFHKS5pdGVtKDApLmdldFRleHRDb250ZW50KCk7Ci0JCQlpbnQgd2lkdGggPSBJbnRlZ2VyLnBhcnNlSW50KG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9XSURUSF9UQUcpLml0ZW0oMCkuZ2V0VGV4dENvbnRlbnQoKSk7Ci0JCQlpbnQgaGVpZ2h0ID0gSW50ZWdlci5wYXJzZUludChub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfSEVJR0hUX1RBRykuaXRlbSgwKS5nZXRUZXh0Q29udGVudCgpKTsKLQkJCWludCB4Q29vcmRpbmF0ZSA9IEludGVnZXIucGFyc2VJbnQobm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZShKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX1hfQ09PUkRJTkFURV9UQUcpLml0ZW0oMCkuZ2V0VGV4dENvbnRlbnQoKSk7Ci0JCQlpbnQgeUNvb3JkaW5hdGUgPSBJbnRlZ2VyLnBhcnNlSW50KG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9ZX0NPT1JESU5BVEVfVEFHKS5pdGVtKDApLmdldFRleHRDb250ZW50KCkpOwotCQkJYm9vbGVhbiBpc1ByaW1hcnlDb2xsYXBzZWQgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfUFJJTUFSWV9TRUNUSU9OX1NUQVRFX1RBRykuaXRlbSgwKS5nZXRUZXh0Q29udGVudCgpKTsKLQkJCWJvb2xlYW4gaXNSZWxhdGlvbkNvbGxhcHNlZCA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9SRUxBVElPTl9TRUNUSU9OX1NUQVRFX1RBRykuaXRlbSgwKS5nZXRUZXh0Q29udGVudCgpKTsKLQkJCWJvb2xlYW4gaXNCYXNpY0NvbGxhcHNlZCA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9CQVNJQ19TRUNUSU9OX1NUQVRFX1RBRykuaXRlbSgwKS5nZXRUZXh0Q29udGVudCgpKTsKLQkJCQotCQkJU2l6ZVBvc2l0aW9uIHJlY3RTUCA9IG5ldyBTaXplUG9zaXRpb24od2lkdGgsIGhlaWdodCwgeENvb3JkaW5hdGUsIHlDb29yZGluYXRlKTsKLQkJCXJlY3RTUC5wcmltYXJ5Q29sbGFwc2VkID0gaXNQcmltYXJ5Q29sbGFwc2VkOwotCQkJcmVjdFNQLnJlbGF0aW9uQ29sbGFwc2VkID0gaXNSZWxhdGlvbkNvbGxhcHNlZDsKLQkJCXJlY3RTUC5iYXNpY0NvbGxhcHNlZCA9IGlzQmFzaWNDb2xsYXBzZWQ7Ci0JCQkKLQkJCW1hcmtzLnB1dChlbnRpdHlOYW1lLCByZWN0U1ApOwotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIEVsZW1lbnQgY3JlYXRlRW50aXR5RWxlbWVudFRhZyhEb2N1bWVudCBkb2N1bWVudCwgRWxlbWVudCBzY2hlZHVsZUVsZW1lbnQsIFN0cmluZyBkZXNjciwgU3RyaW5nIHBvc2l0aW9uKSB7Ci0JCUVsZW1lbnQgam9iID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChkZXNjcik7Ci0JCXNjaGVkdWxlRWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiXG5cdCIpKTsgLy8kTk9OLU5MUy0xJAotCQlzY2hlZHVsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoam9iKTsKLQkJam9iLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBvc2l0aW9uKSk7Ci0JCQotCQlyZXR1cm4gam9iOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQ2hpbGRFbGVtZW50VGFnKERvY3VtZW50IGRvY3VtZW50LCBUZXh0IG5hbWVUZXh0LCBFbGVtZW50IG5hbWVFbCwgRWxlbWVudCBwYXJlbnRFbGVtZW50LCBTdHJpbmcgcG9zaXRpb24pIHsKLQkJcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChuYW1lRWwpOwotCQluYW1lRWwuYXBwZW5kQ2hpbGQobmFtZVRleHQpOwotCQlwYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBvc2l0aW9uKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNhdmUoKSB7Ci0JCU91dHB1dFN0cmVhbSBvcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNmb3JtZXJGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwotCQkJb3MgPSAoT3V0cHV0U3RyZWFtKWZpbmRYTUxGaWxlKGZhbHNlKTsKLQkJCXRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChvcykpOwotCQkJb3MuZmx1c2goKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoSlBBRWRpdG9yTWVzc2FnZXMuRW50aXRpZXNDb29yZGluYXRlc1hNTF9DYW5ub3RDcmVhdGVET01GaWxlRXJyb3JNU0csIGUpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlvcy5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9CQkKLQl9Ci0JCi0Jc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQlzYXZlKCk7Ci0JCWNsZWFuKCk7Ci0JfQotCQotCXN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBjbGVhbigpIHsKLQkJdHJ5IHsKLQkgICAgCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwkJCQotCSAgICAJcHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKEpQQUVkaXRvck1lc3NhZ2VzLkVudGl0aWVzQ29vcmRpbmF0ZXNYTUxfQ2Fubm90UmVmcmZyZXNoRmlsZSwgZSk7Ci0JCX0JCQotCQlkb2N1bWVudCA9IG51bGw7Ci0JCXJvb3RFbGVtZW50ID0gbnVsbDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvRW50aXR5Q2hhbmdlTGlzdGVuZXIuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0VudGl0eUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNWM1MjguLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvRW50aXR5Q2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuUmVtb3ZlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGVkQnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU51bGxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Pd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlJlbW92ZUFuZFNhdmVFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEVudGl0eUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgVGhyZWFkIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBQQVVTRV9EVVJBVElPTiA9IDI1MDsKLQlwcml2YXRlIGJvb2xlYW4gZ29PbiA9IHRydWU7Ci0JcHJpdmF0ZSBKUEFTb2x2ZXIgc29sdmVyOwotCXByaXZhdGUgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXI7Ci0JcHJpdmF0ZSBTZXQ8U3RyaW5nPiBqcHRzVG9VcGRhdGUgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7IAotCXByaXZhdGUgSGFzaHRhYmxlPFN0cmluZywgUGVyc2lzdGVuY2VVbml0PiBhdHRyaWJzVG9VcGRhdGUgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgUGVyc2lzdGVuY2VVbml0PigpOyAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTRVBBUkFUT1IgPSAiOyI7CQkvLyROT04tTkxTLTEkCi0JCi0JRW50aXR5Q2hhbmdlTGlzdGVuZXIoSlBBU29sdmVyIHNvbHZlcikgewotCQl0aGlzLnNvbHZlciA9IHNvbHZlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZVByb3ZpZGVyKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyKSB7Ci0JCXRoaXMuZmVhdHVyZVByb3ZpZGVyID0gZmVhdHVyZVByb3ZpZGVyOwotCX0KLQkJCQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCVVwZGF0ZUZyb21Nb2RlbCB0YXNrQ2xhc3MgPSBuZXcgVXBkYXRlRnJvbU1vZGVsKCk7Ci0JCXdoaWxlIChnb09uKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcChQQVVTRV9EVVJBVElPTik7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiVGhyZWFkIHNsZWVwIGludGVycnVwcnRlZCIsIGUpOyAvLyROT04tTkxTLTEkCQkJCQotCQkJfQotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHRhc2tDbGFzcyk7Ci0JCX0KLQkJc29sdmVyID0gbnVsbDsKLQkJZmVhdHVyZVByb3ZpZGVyID0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3RvcFRocmVhZCgpIHsKLQkJZ29PbiA9IGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRKUFRGb3JVcGRhdGUoU3RyaW5nIGpwdE5hbWUpIHsKLQkJc3luY2hyb25pemVkIChqcHRzVG9VcGRhdGUpIHsKLQkJCWpwdHNUb1VwZGF0ZS5hZGQoanB0TmFtZSk7Ci0JCX0KLQl9Ci0JCQkKLQlwdWJsaWMgdm9pZCBhZGRBdHRyaWJGb3JVcGRhdGUoUGVyc2lzdGVuY2VVbml0IHB1LCBTdHJpbmcgZW50QXRNYXBwZWRCeSkgewotCQlzeW5jaHJvbml6ZWQgKGF0dHJpYnNUb1VwZGF0ZSkgewotCQkJYXR0cmlic1RvVXBkYXRlLnB1dChlbnRBdE1hcHBlZEJ5LCBwdSk7Ci0JCX0KLQl9Ci0JCQkKLQlwcml2YXRlIGNsYXNzIFVwZGF0ZUZyb21Nb2RlbCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJZXhlYygpOwotCQl9Ci0KLQkJCi0JCXByaXZhdGUgdm9pZCBleGVjKCkgewotCQkJdHJ5IHsKLQkJCQlzeW5jaHJvbml6ZWQgKGpwdHNUb1VwZGF0ZSkgewotCQkJCQlJdGVyYXRvcjxTdHJpbmc+IGl0ciA9IGpwdHNUb1VwZGF0ZS5pdGVyYXRvcigpOwotCQkJCQlpZiAoaXRyLmhhc05leHQoKSkgewotCQkJCQkJU3RyaW5nIGpwdE5hbWUgPSBpdHIubmV4dCgpOwotCQkJCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yS2V5KGpwdE5hbWUpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZW1ha2VSZWxhdGlvbnMoZmVhdHVyZVByb3ZpZGVyLCBudWxsLCBqcHQpOwotCQkJCQkJCWpwdHNUb1VwZGF0ZS5yZW1vdmUoanB0TmFtZSk7Ci0JCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHt9IAotCQkJCQl9Ci0JCQkJfQotCQkJCUNvbGxlY3Rpb248T2JqZWN0PiB2YWxzID0gc29sdmVyLmdldFZpc3VhbGl6ZWRPYmplY3RzKCk7Ci0JCQkJSXRlcmF0b3I8T2JqZWN0PiBpdCA9IHZhbHMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotCQkJCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpbzsKLQkJCQkJCWZpbmFsIENvbnRhaW5lclNoYXBlIGVudFNoYXBlID0gKENvbnRhaW5lclNoYXBlKWZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3Qobyk7Ci0JCQkJCQlpZiAoZW50U2hhcGUgPT0gbnVsbCkgCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQlQZXJzaXN0ZW5jZVVuaXQgcHUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoanB0KTsKLQkJCQkJCVBlcnNpc3RlbnRUeXBlIHB0ID0gcHUuZ2V0UGVyc2lzdGVudFR5cGUoanB0LmdldE5hbWUoKSk7Ci0JCQkJCQkKLQkJCQkJCWlmICgocHQgPT0gbnVsbCkgfHwgIUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmhhc0VudGl0eU9yTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24oanB0KSkgewotCQkJCQkJCQotCQkJCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmZvcmNlU2F2ZUVudGl0eUNsYXNzKGpwdCwgZmVhdHVyZVByb3ZpZGVyKTsKLQkJCQkJCQkKLQkJCQkJCQlpZihqcHQuZ2V0TWFwcGluZygpID09IG51bGwgfHwgKGpwdC5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhTnVsbFR5cGVNYXBwaW5nKSkgewotCQkJCQkJCQlpZiAoIUpwdEpwYUNvcmVQbHVnaW4uZ2V0RGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKGpwdC5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKSkgewotCQkJCQkJCQkJSlBBRWRpdG9yVXRpbC5jcmVhdGVVbnJlZ2lzdGVyRW50aXR5RnJvbVhNTEpvYihqcHQuZ2V0SnBhUHJvamVjdCgpLCBqcHQuZ2V0TmFtZSgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlSZW1vdmVDb250ZXh0IGN0eCA9IG5ldyBSZW1vdmVDb250ZXh0KGVudFNoYXBlKTsKLQkJCQkJCQlSZW1vdmVBbmRTYXZlRW50aXR5RmVhdHVyZSBmdCA9IG5ldyBSZW1vdmVBbmRTYXZlRW50aXR5RmVhdHVyZShmZWF0dXJlUHJvdmlkZXIpOwotCQkJCQkJCWZ0LnJlbW92ZShjdHgpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQkJCi0JCQkJc3luY2hyb25pemVkIChhdHRyaWJzVG9VcGRhdGUpIHsKLQkJCQkJU2V0PFN0cmluZz4gYXRTZXQgPSBhdHRyaWJzVG9VcGRhdGUua2V5U2V0KCk7Ci0JCQkJCUl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGF0U2V0Lml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJU3RyaW5nIGpwdEF0TUIgPSBpdGVyLm5leHQoKTsKLQkJCQkJCVN0cmluZ1tdIGpwdEFuZEF0dHJpYiA9IGpwdEF0TUIuc3BsaXQoU0VQQVJBVE9SKTsgCi0JCQkJCQlQZXJzaXN0ZW5jZVVuaXQgcHUgPSBhdHRyaWJzVG9VcGRhdGUuZ2V0KGpwdEF0TUIpOwotCQkJCQkJU3RyaW5nIGVudGl0eU5hbWUgPSBqcHRBbmRBdHRyaWJbMF07Ci0JCQkJCQlTdHJpbmcgYXR0cmliTmFtZSA9IGpwdEFuZEF0dHJpYlsxXTsKLQkJCQkJCVN0cmluZyBtYXBwZWRCeSA9IGpwdEFuZEF0dHJpYlsyXTsKLQkJCQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKXB1LmdldFBlcnNpc3RlbnRUeXBlKGVudGl0eU5hbWUpOwotCQkJCQkJaWYgKGpwdCAhPSBudWxsKSB7Ci0JCQkJCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhID0ganB0LmdldEF0dHJpYnV0ZU5hbWVkKGF0dHJpYk5hbWUpOwotCQkJCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCBqcHQpOwotCQkJCQkJCWlmIChqcGEgIT0gbnVsbCkgewotCQkJCQkJCQlKYXZhQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0ganBhLmdldE1hcHBpbmcoKTsKLQkJCQkJCQkJQW5ub3RhdGlvbiBhID0gbWFwcGluZy5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQkJCQkJCQlpZihhID09IG51bGwpewotCQkJCQkJCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKGZlYXR1cmVQcm92aWRlciwganB0KTsKLQkJCQkJCQkJCW1hcHBpbmcgPSBqcGEuZ2V0TWFwcGluZygpOwotCQkJCQkJCQkJYSA9IG1hcHBpbmcuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoYSA9PSBudWxsKQotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQlpZiAoT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmNsYXNzLmlzSW5zdGFuY2UobWFwcGluZy5nZXRNYXBwaW5nQW5ub3RhdGlvbigpKSkgewotCQkJCQkJCQkJSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZyA9IChKYXZhUmVsYXRpb25zaGlwTWFwcGluZyltYXBwaW5nOyAKLQkJCQkJCQkJCU1hcHBlZEJ5UmVsYXRpb25zaGlwIG93bmFibGVSZWYgPSAoTWFwcGVkQnlSZWxhdGlvbnNoaXApcmVsYXRpb25zaGlwTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJCQkJCQkJCWlmICghb3duYWJsZVJlZi5zdHJhdGVneUlzTWFwcGVkQnkoKSkgewotCQkJCQkJCQkJICAgIG93bmFibGVSZWYuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlvd25hYmxlUmVmLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZShtYXBwZWRCeSk7CQkJCQkJCQkJCi0JCQkJCQkJCQlhdHRyaWJzVG9VcGRhdGUucmVtb3ZlKGpwdEF0TUIpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaChFeGNlcHRpb24gZSkgewotCQkJCS8vaWdub3JlIAotCQkJfQkJCQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvR3JhcGhpY3NVcGRhdGVyLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9HcmFwaGljc1VwZGF0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5NmE2Zi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9HcmFwaGljc1VwZGF0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5HcmFwaGljc0FsZ29yaXRobTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnNlcnZpY2VzLkdyYXBoaXRpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzLlNoYXBlVHlwZTsKLQotCi1wdWJsaWMgY2xhc3MgR3JhcGhpY3NVcGRhdGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUklNQVJZX1NIQVBFX0lOREVYID0gMzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVMQVRJT05fU0hBUEVfQ09OU1RBTlQgPSA0OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQVNJQ19TSEFQRV9JTkRFWCA9IDU7Ci0KLQlwdWJsaWMgc3RhdGljIGludCBpbmNyZWFzZUNvbXBhcnRtZW50SGVpZ3RoKENvbnRhaW5lclNoYXBlIGNvbnRhaW5lclNoYXBlLAotCQkJaW50IGhlaWdodCkgewotCQlmb3IoU2hhcGUgc2hhcGUgOiBjb250YWluZXJTaGFwZS5nZXRDaGlsZHJlbigpKXsKLQkJCUl0ZXJhdG9yPEdyYXBoaWNzQWxnb3JpdGhtPiBpdGVyYXRvciA9IHNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0R3JhcGhpY3NBbGdvcml0aG1DaGlsZHJlbigpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpewotCQkJICAgIGlmKGl0ZXJhdG9yLm5leHQoKSBpbnN0YW5jZW9mIFRleHQpCi0JCQkgICAgICAgIGhlaWdodCA9IGhlaWdodCArIEpQQUVkaXRvckNvbnN0YW50cy5BVFRSSUJVVEVTX1BMQUNFTUVOVF9TVEVQOwotCQkJfQotCQl9Ci0JCXJldHVybiBoZWlnaHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVDb250YWluZXIoQ29udGFpbmVyU2hhcGUgY29udGFpbmVyU2hhcGUsIAotCQkJaW50IGNoaWxkcmVuU2l6ZUJlZm9yZSwgaW50IGNvbnRhaW5lckhlaWdodEJlZm9yZSl7Ci0JCWludCBjaGlsZHJlblNpemVBZnRlciA9IGNvbnRhaW5lclNoYXBlLmdldENoaWxkcmVuKCkuc2l6ZSgpOwotCQlpbnQgY29udGFpbmVySGVpZ2h0QWZ0ZXIgPSAwOwotCQlpZihjaGlsZHJlblNpemVCZWZvcmUgPT0gMil7Ci0JCQkJY29udGFpbmVySGVpZ2h0QmVmb3JlID0gSlBBRWRpdG9yQ29uc3RhbnRzLkNPTVBBUlRNRU5UX01JTl9IRUlHSFQgKyBKUEFFZGl0b3JDb25zdGFudHMuQ09NUEFSVE1FTlRfQlVUVE9NX09GRlNFVDsKLQkJfQotCQljb250YWluZXJIZWlnaHRBZnRlciA9IGNvbnRhaW5lckhlaWdodEJlZm9yZSArICgoKGNoaWxkcmVuU2l6ZUFmdGVyIC0gY2hpbGRyZW5TaXplQmVmb3JlKS8yKSpKUEFFZGl0b3JDb25zdGFudHMuQVRUUklCVVRFU19QTEFDRU1FTlRfU1RFUCk7Ci0JCQotCQlpZighaXNDb2xsYXBzZWQoY29udGFpbmVyU2hhcGUpKQotCQkJY29udGFpbmVyU2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5zZXRIZWlnaHQoY29udGFpbmVySGVpZ2h0QWZ0ZXIpOwotCQllbHNlIAotCQkJY29udGFpbmVyU2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5zZXRIZWlnaHQoSlBBRWRpdG9yQ29uc3RhbnRzLkNPTVBBUlRNRU5UX01JTl9IRUlHSFQpOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlRW50aXR5U2hhcGUoQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUpewotCQlDb250YWluZXJTaGFwZSBwcmltYXJ5U2hhcGUgPSBnZXRQcmltYXJ5U2hhcGUoZW50aXR5U2hhcGUpOwotCQlDb250YWluZXJTaGFwZSByZWxhdGlvblNoYXBlID0gZ2V0UmVsYXRpb25TaGFwZShlbnRpdHlTaGFwZSk7Ci0JCUNvbnRhaW5lclNoYXBlIGJhc2ljU2hhcGUgPSBnZXRCYXNpY1NoYXBlKGVudGl0eVNoYXBlKTsKLQkJCi0JCXByaW1hcnlTaGFwZS5zZXRWaXNpYmxlKCFpc0VtcHR5Q29tcGFydG1lbnQocHJpbWFyeVNoYXBlKSk7Ci0JCWJhc2ljU2hhcGUuc2V0VmlzaWJsZSghaXNFbXB0eUNvbXBhcnRtZW50KGJhc2ljU2hhcGUpKTsKLQkJcmVsYXRpb25TaGFwZS5zZXRWaXNpYmxlKCFpc0VtcHR5Q29tcGFydG1lbnQocmVsYXRpb25TaGFwZSkpOwotCi0gICAgICAgIHJlbGF0aW9uU2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5zZXRZKGdldE5leHRDb21wYXJ0bWVudFkocHJpbWFyeVNoYXBlKSk7Ci0gICAgICAgIGJhc2ljU2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5zZXRZKGdldE5leHRDb21wYXJ0bWVudFkocmVsYXRpb25TaGFwZSkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFbXB0eUNvbXBhcnRtZW50KENvbnRhaW5lclNoYXBlIHByaW1hcnlTaGFwZSkgewotCQlyZXR1cm4gcHJpbWFyeVNoYXBlLmdldENoaWxkcmVuKCkuc2l6ZSgpIDw9IDI7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVFbnRpdHlIZWlndGgoQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUpewotCQlDb250YWluZXJTaGFwZSBwcmltYXJ5U2hhcGUgPSBHcmFwaGljc1VwZGF0ZXIuZ2V0UHJpbWFyeVNoYXBlKGVudGl0eVNoYXBlKTsKLQkJQ29udGFpbmVyU2hhcGUgcmVsYXRpb25TaGFwZSA9IEdyYXBoaWNzVXBkYXRlci5nZXRSZWxhdGlvblNoYXBlKGVudGl0eVNoYXBlKTsKLQkJQ29udGFpbmVyU2hhcGUgYmFzaWNTaGFwZSA9IEdyYXBoaWNzVXBkYXRlci5nZXRCYXNpY1NoYXBlKGVudGl0eVNoYXBlKTsKLQkJCi0gICAgICAgIGVudGl0eVNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuc2V0SGVpZ2h0KEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfTUlOX0hFSUdIVCArIAotICAgICAgICAJCXByaW1hcnlTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldEhlaWdodCgpICsgcmVsYXRpb25TaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldEhlaWdodCgpCi0gICAgICAgIAkJKyBiYXNpY1NoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0SGVpZ2h0KCkgKyAyKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TmV4dENvbXBhcnRtZW50WShDb250YWluZXJTaGFwZSBjb21wYXJ0bWVudFNoYXBlKXsKLQkJaWYoaXNFbXB0eUNvbXBhcnRtZW50KGNvbXBhcnRtZW50U2hhcGUpKQotCQkJcmV0dXJuIGNvbXBhcnRtZW50U2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRZKCk7Ci0JCXJldHVybiBjb21wYXJ0bWVudFNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0WSgpICsgY29tcGFydG1lbnRTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldEhlaWdodCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29udGFpbmVyU2hhcGUgZ2V0UHJpbWFyeVNoYXBlKENvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlKXsKLQkJTGlzdDxTaGFwZT4gY2hpbGRyZW4gPSBlbnRpdHlTaGFwZS5nZXRDaGlsZHJlbigpOwotCQlpZihjaGlsZHJlbi5zaXplKCkgPCBQUklNQVJZX1NIQVBFX0lOREVYKzEpCi0JCQlyZXR1cm4gbnVsbDsKLQkJR3JhcGhpY3NBbGdvcml0aG0gYWxnID0gY2hpbGRyZW4uZ2V0KFBSSU1BUllfU0hBUEVfSU5ERVgpLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCUNvbnRhaW5lclNoYXBlIHByaW1hcnlTaGFwZSA9IChDb250YWluZXJTaGFwZSlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRBY3RpdmVDb250YWluZXJQZShhbGcpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbnRhaW5lclNoYXBlIGdldENvbXBhcnRtZW50U2VwYXJhdG9yU2hhcGUoQ29udGFpbmVyU2hhcGUgY29tcGFydG1lbnRTaGFwZSl7Ci0JCUdyYXBoaWNzQWxnb3JpdGhtIGFsZyA9IGNvbXBhcnRtZW50U2hhcGUuZ2V0Q2hpbGRyZW4oKS5nZXQoMCkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJQ29udGFpbmVyU2hhcGUgcHJpbWFyeVNlcGFyYXRvclNoYXBlID0gKENvbnRhaW5lclNoYXBlKSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRBY3RpdmVDb250YWluZXJQZShhbGcpOwotCQlyZXR1cm4gcHJpbWFyeVNlcGFyYXRvclNoYXBlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbnRhaW5lclNoYXBlIGdldFJlbGF0aW9uU2hhcGUoQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUpewotCQlMaXN0PFNoYXBlPiBjaGlsZHJlbiA9IGVudGl0eVNoYXBlLmdldENoaWxkcmVuKCk7Ci0JCWlmKGNoaWxkcmVuLnNpemUoKTxSRUxBVElPTl9TSEFQRV9DT05TVEFOVCsxKQotCQkJcmV0dXJuIG51bGw7Ci0JCUdyYXBoaWNzQWxnb3JpdGhtIGFsZyA9IGNoaWxkcmVuLmdldChSRUxBVElPTl9TSEFQRV9DT05TVEFOVCkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJQ29udGFpbmVyU2hhcGUgcmVsYXRpb25TaGFwZSA9IChDb250YWluZXJTaGFwZSkgR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0QWN0aXZlQ29udGFpbmVyUGUoYWxnKTsKLQkJcmV0dXJuIHJlbGF0aW9uU2hhcGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29udGFpbmVyU2hhcGUgZ2V0QmFzaWNTaGFwZShDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSl7Ci0JCUxpc3Q8U2hhcGU+IGNoaWxkcmVuID0gZW50aXR5U2hhcGUuZ2V0Q2hpbGRyZW4oKTsKLQkJaWYoY2hpbGRyZW4uc2l6ZSgpIDwgQkFTSUNfU0hBUEVfSU5ERVgrMSkKLQkJCXJldHVybiBudWxsOwotCQlHcmFwaGljc0FsZ29yaXRobSBhbGcgPSBjaGlsZHJlbi5nZXQoQkFTSUNfU0hBUEVfSU5ERVgpLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCUNvbnRhaW5lclNoYXBlIGJhc2ljU2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldEFjdGl2ZUNvbnRhaW5lclBlKGFsZyk7Ci0JCXJldHVybiBiYXNpY1NoYXBlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb2xsYXBzZWQoQ29udGFpbmVyU2hhcGUgY29tcGFydG1lbnRTaGFwZSkgewotCQlDb250YWluZXJTaGFwZSBjb250YWluZXIgPSBjb21wYXJ0bWVudFNoYXBlLmdldENvbnRhaW5lcigpOwotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYoY29tcGFydG1lbnRTaGFwZS5lcXVhbHMoR3JhcGhpY3NVcGRhdGVyLmdldFByaW1hcnlTaGFwZShjb250YWluZXIpKSkKLQkJCXJlc3VsdCA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUoY29udGFpbmVyLCBKUEFFZGl0b3JDb25zdGFudHMuUFJJTUFSWV9DT0xMQVBTRUQpOwotCQllbHNlIGlmKGNvbXBhcnRtZW50U2hhcGUuZXF1YWxzKEdyYXBoaWNzVXBkYXRlci5nZXRCYXNpY1NoYXBlKGNvbnRhaW5lcikpKQotCQkJcmVzdWx0ID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShjb250YWluZXIsIEpQQUVkaXRvckNvbnN0YW50cy5CQVNJQ19DT0xMQVBTRUQpOwotCQllbHNlIGlmKGNvbXBhcnRtZW50U2hhcGUuZXF1YWxzKEdyYXBoaWNzVXBkYXRlci5nZXRSZWxhdGlvblNoYXBlKGNvbnRhaW5lcikpKQotCQkJcmVzdWx0ID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShjb250YWluZXIsIEpQQUVkaXRvckNvbnN0YW50cy5SRUxBVElPTl9DT0xMQVBTRUQpOwotCQlpZihCb29sZWFuLnRvU3RyaW5nKHRydWUpLmVxdWFscyhyZXN1bHQpKSAKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBjb21wYXJ0bWVudFNoYXBlCi0JICogQHBhcmFtIGNvbGxhcHNlZCAKLQkgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXRDb2xsYXBzZWQoQ29udGFpbmVyU2hhcGUgY29tcGFydG1lbnRTaGFwZSwgYm9vbGVhbiBjb2xsYXBzZWQpIHsKLQkJQ29udGFpbmVyU2hhcGUgY29udGFpbmVyID0gY29tcGFydG1lbnRTaGFwZS5nZXRDb250YWluZXIoKTsKLQkJaWYoY29tcGFydG1lbnRTaGFwZS5lcXVhbHMoR3JhcGhpY3NVcGRhdGVyLmdldFByaW1hcnlTaGFwZShjb250YWluZXIpKSkgewotCQkJR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuc2V0UHJvcGVydHlWYWx1ZShjb250YWluZXIsIEpQQUVkaXRvckNvbnN0YW50cy5QUklNQVJZX0NPTExBUFNFRCwgQm9vbGVhbi50b1N0cmluZyhjb2xsYXBzZWQpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYoY29tcGFydG1lbnRTaGFwZS5lcXVhbHMoR3JhcGhpY3NVcGRhdGVyLmdldEJhc2ljU2hhcGUoY29udGFpbmVyKSkpIHsKLQkJCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLnNldFByb3BlcnR5VmFsdWUoY29udGFpbmVyLCBKUEFFZGl0b3JDb25zdGFudHMuQkFTSUNfQ09MTEFQU0VELCBCb29sZWFuLnRvU3RyaW5nKGNvbGxhcHNlZCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZihjb21wYXJ0bWVudFNoYXBlLmVxdWFscyhHcmFwaGljc1VwZGF0ZXIuZ2V0UmVsYXRpb25TaGFwZShjb250YWluZXIpKSkgewotCQkJR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuc2V0UHJvcGVydHlWYWx1ZShjb250YWluZXIsIEpQQUVkaXRvckNvbnN0YW50cy5SRUxBVElPTl9DT0xMQVBTRUQsIEJvb2xlYW4udG9TdHJpbmcoY29sbGFwc2VkKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVIZWFkZXIoQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUsIGZpbmFsIFN0cmluZyBuZXdIZWFkZXIpIHsKLQkJZmluYWwgVGV4dCB0eHQgPSBnZXRIZWFkZXJUZXh0KGVudGl0eVNoYXBlKTsKLQkJaWYgKHR4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvL2lmICghSlBBRWRpdG9yVXRpbC5hcmVIZWFkZXJzRXF1YWwodHh0LmdldFZhbHVlKCksIG5ld0hlYWRlcikpIHsKLQotCQlpZiAoIXR4dC5nZXRWYWx1ZSgpLmVxdWFscyhuZXdIZWFkZXIpKSB7Ci0JCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbih0eHQpOwotCQkJUmVjb3JkaW5nQ29tbWFuZCByYyA9IG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQkJdHh0LnNldFZhbHVlKG5ld0hlYWRlcik7CQkKLQkJCQl9CQkKLQkJCX07CQkJCi0JCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShyYyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVGV4dCBnZXRIZWFkZXJUZXh0KENvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlKSB7Ci0JCWlmKGVudGl0eVNoYXBlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsJCQotCQlMaXN0PFNoYXBlPiBzaGFwZXMgPSBlbnRpdHlTaGFwZS5nZXRDaGlsZHJlbigpOwotCQlJdGVyYXRvcjxTaGFwZT4gc2hJdCA9IHNoYXBlcy5pdGVyYXRvcigpOwotCQlTaGFwZSBoZWFkZXJTaGFwZSA9IG51bGw7OwotCQl3aGlsZSAoc2hJdC5oYXNOZXh0KCkpIHsKLQkJCWhlYWRlclNoYXBlID0gc2hJdC5uZXh0KCk7Ci0JCQlTdHJpbmcgc2hhcGVUeXBlID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShoZWFkZXJTaGFwZSwgSlBBRWRpdG9yQ29uc3RhbnRzLlBST1BfU0hBUEVfVFlQRSk7Ci0JCQlpZiAoU2hhcGVUeXBlLkhFQURFUi50b1N0cmluZygpLmVxdWFscyhzaGFwZVR5cGUpKSAKLQkJCQlicmVhazsKLQkJCWhlYWRlclNoYXBlID0gbnVsbDsKLQkJfQotCQlpZiAoaGVhZGVyU2hhcGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlHcmFwaGljc0FsZ29yaXRobSBnYSA9IGhlYWRlclNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCWlmIChnYSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChnYS5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCkuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJVGV4dCB0eHQgPSAoVGV4dClnYS5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCkuZ2V0KDApOwotCQlyZXR1cm4gdHh0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0dyYXBoaWNzVXBkYXRlckltcGwuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0dyYXBoaWNzVXBkYXRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3ODhhOS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9HcmFwaGljc1VwZGF0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci0KLXB1YmxpYyBjbGFzcyBHcmFwaGljc1VwZGF0ZXJJbXBsIGltcGxlbWVudHMgSUdyYXBoaWNzVXBkYXRlciB7Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlRW50aXR5SGVpZ3RoKENvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlKSB7Ci0JCUdyYXBoaWNzVXBkYXRlci51cGRhdGVFbnRpdHlIZWlndGgoZW50aXR5U2hhcGUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lEaXNwbGF5RmFjYWRlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JRGlzcGxheUZhY2FkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmVkNmRlLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lEaXNwbGF5RmFjYWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLaXJpbCBNaXRvdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIElEaXNwbGF5RmFjYWRlIHsKLQotCXB1YmxpYyB2b2lkIGFzeW5jRXhlYyhSdW5uYWJsZSBydW5uYWJsZSk7Ci19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JRWNsaXBzZUZhY2FkZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSUVjbGlwc2VGYWNhZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM1NzE2Ni4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JRWNsaXBzZUZhY2FkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUVjbGlwc2VGYWNhZGUgewotCi0JcHVibGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCk7Ci0KLQlwdWJsaWMgSUphdmFDb3JlRmFjYWRlIGdldEphdmFDb3JlKCk7Ci0JCi0JcHVibGljIElEaXNwbGF5RmFjYWRlIGdldERpc3BsYXkoKTsKLQkKLQlwdWJsaWMgSVN0YXRpY0lERSBnZXRJREUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lHcmFwaGljc1VwZGF0ZXIuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lHcmFwaGljc1VwZGF0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNiNDg0NC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JR3JhcGhpY3NVcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUdyYXBoaWNzVXBkYXRlciB7Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlRW50aXR5SGVpZ3RoKENvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSUpQQURpYWdyYW1FZGl0b3JJbnB1dC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSUpQQURpYWdyYW1FZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzQwOWJiLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lKUEFEaWFncmFtRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLQotcHVibGljIGludGVyZmFjZSBJSlBBRGlhZ3JhbUVkaXRvcklucHV0IGV4dGVuZHMgSUVkaXRvcklucHV0IHsKLQkKLQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKCk7Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JSlBBRWRpdG9yUHJlZGVmaW5lZFJlbmRlcmluZ1N0eWxlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JSlBBRWRpdG9yUHJlZGVmaW5lZFJlbmRlcmluZ1N0eWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNDUzOGIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSUpQQUVkaXRvclByZWRlZmluZWRSZW5kZXJpbmdTdHlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51dGlsLklQcmVkZWZpbmVkUmVuZGVyaW5nU3R5bGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUpQQUVkaXRvclByZWRlZmluZWRSZW5kZXJpbmdTdHlsZSBleHRlbmRzIElQcmVkZWZpbmVkUmVuZGVyaW5nU3R5bGUgewotCi0JLyoqCi0JICogVGhlIElEIGZvciBhIGdyZWVuLXRvLXdoaXRlIGdyYWRpZW50IHdpdGggYSBnbG9zcy1lZmZlY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFRU5fV0hJVEVfR0xPU1NfSUQgPSAiZ3JlZW4td2hpdGUtZ2xvc3MiOyAvLyROT04tTkxTLTEkCi0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JSlBBRWRpdG9yVXRpbC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSUpQQUVkaXRvclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc4MTk0OC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JSlBBRWRpdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRnJlZUZvcm1Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckltYWdlQ3JlYXRvci5SZWxFbmREaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUpQQUVkaXRvclV0aWwgewotCQotCXB1YmxpYyBMaXN0PFBvaW50PiBjcmVhdGVCZW5kUG9pbnRMaXN0KEZyZWVGb3JtQ29ubmVjdGlvbiBjLCAgaW50IGNudCwgaW50IGNvbm5lY3Rpb25zTnVtLCBib29sZWFuIHNlbGZSZWxhdGlvbik7Ci0JCi0JcHVibGljIExpc3Q8UG9pbnQ+IGNyZWF0ZUJlbmRQb2ludExpc3QoRnJlZUZvcm1Db25uZWN0aW9uIGMsIGJvb2xlYW4gc2VsZlJlbGF0aW9uKTsKLQkKLQlwdWJsaWMgaW50IGNhbGNDb25uZWN0aW9uTGVuZ3RoKEZyZWVGb3JtQ29ubmVjdGlvbiBjKTsKLQkKLQlwdWJsaWMgUmVsRW5kRGlyIGdldENvbm5lY3Rpb25TdGFydERpcihGcmVlRm9ybUNvbm5lY3Rpb24gYyk7Ci0JCi0JcHVibGljIFJlbEVuZERpciBnZXRDb25uZWN0aW9uRW5kRGlyKEZyZWVGb3JtQ29ubmVjdGlvbiBjKTsKLQkKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRUeXBlIGdldEpQVHlwZShJQ29tcGlsYXRpb25Vbml0IGN1KTsKLQkKLQlwdWJsaWMgdm9pZCBvcmdhbml6ZUltcG9ydHMoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSVdvcmtiZW5jaFNpdGUgd3MpOwotCQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdChKYXZhUGVyc2lzdGVudFR5cGUganB0KTsKLQkKLQlwdWJsaWMgdm9pZCBmb3JtYXRDb2RlKElDb21waWxhdGlvblVuaXQgY3UsIElXb3JrYmVuY2hTaXRlIHdzKTsKLQkKLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlVW5pcXVlRW50aXR5TmFtZShKcGFQcm9qZWN0IGpwYVByb2plY3QsIAotCQkJICBTdHJpbmcgcGFjaywgCi0JCQkgIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApOwotCQotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVVbmlxdWVNYXBwZWRTdXBlcmNsYXNzTmFtZShKcGFQcm9qZWN0IGpwYVByb2plY3QsCi0JCQlTdHJpbmcgcGFjaywgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCk7Ci0KLQlwdWJsaWMgSUZpbGUgY3JlYXRlRW50aXR5SW5Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIAotCQkJCQkJCQkJICAgU3RyaW5nIGVudGl0eU5hbWUsIAotCQkJCQkJCQkJICAgSVByZWZlcmVuY2VTdG9yZSBqcGFQcmVmZXJlbmNlU3RvcmUsCi0JCQkJCQkJCQkgICBib29sZWFuIGlzTWFwcGVkU3VwZXJDbGFzc0NoaWxkLCAKLQkJCQkJCQkJCSAgIFN0cmluZyBtYXBwZWRTdXBlcmNsYXNzTmFtZSwgCi0JCQkJCQkJCQkgICBTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc1BhY2thZ2UsIAotCQkJCQkJCQkJICAgU3RyaW5nIGlkTmFtZSwKLQkJCQkJCQkJCSAgIGJvb2xlYW4gaGFzUHJpbWFyeUtleSkgdGhyb3dzIEV4Y2VwdGlvbjsKLQkKLQlwdWJsaWMgSUZpbGUgY3JlYXRlRW50aXR5SW5Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIAotCQkJCQkJCQkJICAgU3RyaW5nIGVudGl0eU5hbWUsIAotCQkJCQkJCQkJICAgSmF2YVBlcnNpc3RlbnRUeXBlIG1hcHBlZFN1cGVyY2xhc3MpIHRocm93cyBFeGNlcHRpb247Ci0JCi0KLQlwdWJsaWMgSUZpbGUgY3JlYXRlRW50aXR5RnJvbU1hcHBlZFN1cGVyY2xhc3NJblByb2plY3QoSVByb2plY3QgcHJvamVjdCwKLQkJCVN0cmluZyBtYXBwZWRTdXBlcmNsYXNzTmFtZSwgSVByZWZlcmVuY2VTdG9yZSBqcGFQcmVmZXJlbmNlU3RvcmUpIHRocm93cyBFeGNlcHRpb247Ci0JCi0JcHVibGljIElGaWxlIGNyZWF0ZU1hcHBlZFN1cGVyY2xhc3NJblByb2plY3QoSVByb2plY3QgcHJvamVjdCwKLQkJCUlGb2xkZXIgZm9sZGVyLCBTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc05hbWUpIHRocm93cyBFeGNlcHRpb247Ci0JCi0JcHVibGljIElGaWxlIGNyZWF0ZU1hcHBlZFN1cGVyY2xhc3NJblByb2plY3QoSVByb2plY3QgcHJvamVjdCwKLQkJCVN0cmluZyBtYXBwZWRTdXBlcmNsYXNzTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbjsJCi0JCi0JcHVibGljIGJvb2xlYW4gaXNDYXJkaW5hbGl0eURlY29yYXRvcihDb25uZWN0aW9uRGVjb3JhdG9yIGNkKTsKLQkKLQlwdWJsaWMgdm9pZCBkaXNjYXJkV29ya2luZ0NvcHlPbmNlKElDb21waWxhdGlvblVuaXQgY3UpOwotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSUphdmFDb3JlRmFjYWRlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JSmF2YUNvcmVGYWNhZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzMTY5My4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JSmF2YUNvcmVGYWNhZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtpcmlsIE1pdG92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhQ29yZUZhY2FkZSB7Ci0KLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKElGaWxlIGZpbGUpOwotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSUpwYVNvbHZlci5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSUpwYVNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MThkMDFlLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lKcGFTb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5JSW5kZXBlbmRlbmNlU29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci0KLQotcHVibGljIGludGVyZmFjZSBJSnBhU29sdmVyIGV4dGVuZHMgSUluZGVwZW5kZW5jZVNvbHZlciB7Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRGZWF0dXJlUHJvdmlkZXIoCi0JCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlcik7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JUGVTZXJ2aWNlVXRpbC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSVBlU2VydmljZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1YTBjOS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JUGVTZXJ2aWNlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLlByb3BlcnR5Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkZyZWVGb3JtQ29ubmVjdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJUGVTZXJ2aWNlVXRpbCB7Ci0KLQlwdWJsaWMgRnJlZUZvcm1Db25uZWN0aW9uIGNyZWF0ZUZyZWVGb3JtQ29ubmVjdGlvbihEaWFncmFtIGRpYWdyYW0pOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZShQcm9wZXJ0eUNvbnRhaW5lciBwcm9wZXJ0eUNvbnRhaW5lciwgU3RyaW5nIGtleSk7Ci0JCi0JcHVibGljIFByb3BlcnR5IGdldFByb3BlcnR5KFByb3BlcnR5Q29udGFpbmVyIHByb3BlcnR5Q29udGFpbmVyLCBTdHJpbmcga2V5KTsKLQkKLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVQcm9wZXJ0eShQcm9wZXJ0eUNvbnRhaW5lciBwcm9wZXJ0eUNvbnRhaW5lciwgU3RyaW5nIGtleSk7IAotCQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKFByb3BlcnR5Q29udGFpbmVyIHByb3BlcnR5Q29udGFpbmVyLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JU3RhdGljSURFLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JU3RhdGljSURFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNGVlMGUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSVN0YXRpY0lERS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJU3RhdGljSURFIHsKLQotCXB1YmxpYyB2b2lkIG9wZW5FZGl0b3IoSUZpbGUgZmlsZSkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSlBBQ2hlY2tTdW0uamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0pQQUNoZWNrU3VtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMWM2ZTUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSlBBQ2hlY2tTdW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIEpQQUNoZWNrU3VtIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBKUEFDaGVja1N1bSBpbnN0YW5jZSA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZURpZ2VzdCBtZDUgPSBudWxsOwotCQotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEpQQUNoZWNrU3VtIElOU1RBTkNFKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQltZDUgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsJLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKLQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDb3VsZG4ndCBjcmVhdGUgaW5zdGFuY2Ugb2YgTUQ1IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWluc3RhbmNlID0gbmV3IEpQQUNoZWNrU3VtKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOyAKLQl9Ci0JCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2F2ZWRTaGFwZU1ENShTaGFwZSBzaCkgewkKLQkJU3RyaW5nIGNoZWNrU3VtU3RyaW5nID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShzaCwgSlBBRWRpdG9yQ29uc3RhbnRzLlBST1BfRU5USVRZX0NIRUNLU1VNKTsKLQkJaWYgKGNoZWNrU3VtU3RyaW5nID09IG51bGwpCi0JCQlyZXR1cm4gIiI7CS8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNoZWNrU3VtU3RyaW5nOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhc3NpZ25FbnRpdHlTaGFwZXNNRDVTdHJpbmdzKERpYWdyYW0gZCwgSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwdSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdChqcGFQcm9qZWN0KTsKLQkJTGlzdDxTaGFwZT4gcGljdHMgPSBkLmdldENoaWxkcmVuKCk7Ci0JCWlmIChwaWN0cy5zaXplKCkgPT0gMCkKLQkJCXJldHVybjsKLQkJSXRlcmF0b3I8U2hhcGU+IGl0ID0gcGljdHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJU2hhcGUgcGljdCA9IGl0Lm5leHQoKTsKLQkJCVN0cmluZyBuYW1lID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShwaWN0LCBKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9FTlRJVFlfQ0xBU1NfTkFNRSk7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0SlBUKG5hbWUsIHB1KTsKLQkJCVN0cmluZyBoYXNoID0gIiI7CS8vJE5PTi1OTFMtMSQKLQkJCWlmIChqcHQgIT0gbnVsbCkgewotCQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSBKUEFFZGl0b3JVdGlsLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCQkJCWhhc2ggPSBnZW5lcmF0ZUNvbXBpbGF0aW9uVW5pdE1ENVN0cmluZyhjdSk7Ci0JCQl9Ci0JCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5zZXRQcm9wZXJ0eVZhbHVlKHBpY3QsIEpQQUVkaXRvckNvbnN0YW50cy5QUk9QX0VOVElUWV9DSEVDS1NVTSwgaGFzaCk7Ci0JCX0KLQl9Ci0KLQkJCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUNvbXBpbGF0aW9uVW5pdE1ENVN0cmluZyhJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCVN0cmluZyBzcmMgPSBudWxsOwotCQl0cnkgewotCQkJc3JjID0gY3UuZ2V0U291cmNlKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW4ndCBnZXQgdGhlIHNvdXJjZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCIsIGUpOyAvLyROT04tTkxTLTEkCQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJYnl0ZVtdIHJlcyA9IG1kNS5kaWdlc3Qoc3JjLmdldEJ5dGVzKCkpOwotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJZm9yIChieXRlIGIgOiByZXMpCi0JCQlzYi5hcHBlbmQoQnl0ZS50b1N0cmluZyhiKSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwkJCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRW50aXR5TW9kZWxDaGFuZ2VkKFNoYXBlIHNoLCBKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJaWYgKHNoID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgCi0JCVBlcnNpc3RlbmNlVW5pdCBwdSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdChqcGFQcm9qZWN0KTsKLQkJU3RyaW5nIG5hbWUgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRQcm9wZXJ0eVZhbHVlKHNoLCBKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9FTlRJVFlfQ0xBU1NfTkFNRSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRKUFQobmFtZSwgcHUpOwotCQlTdHJpbmcgc2F2ZWRNRDUgPSBnZXRTYXZlZFNoYXBlTUQ1KHNoKTsJCi0JCVN0cmluZyBhY3R1YWxNRDUgPSAiIjsJLy8kTk9OLU5MUy0xJAotCQlpZiAoanB0ICE9IG51bGwpIHsKLQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSBKUEFFZGl0b3JVdGlsLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCQkJYWN0dWFsTUQ1ID0gZ2VuZXJhdGVDb21waWxhdGlvblVuaXRNRDVTdHJpbmcoY3UpOwotCQl9Ci0JCXJldHVybiAhc2F2ZWRNRDUuZXF1YWxzKGFjdHVhbE1ENSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTW9kZWxEaWZmZXJlbnRGcm9tRGlhZ3JhbShEaWFncmFtIGQsIEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlMaXN0PFNoYXBlPiBwaWN0cyA9IGQuZ2V0Q2hpbGRyZW4oKTsKLQkJaWYgKHBpY3RzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJdGVyYXRvcjxTaGFwZT4gaXQgPSBwaWN0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlTaGFwZSBwaWN0ID0gaXQubmV4dCgpOwotCQkJaWYgKGlzRW50aXR5TW9kZWxDaGFuZ2VkKHBpY3QsIGpwYVByb2plY3QpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9KUEFFZGl0b3JDb25zdGFudHMuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0pQQUVkaXRvckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2Q2MjcwLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0pQQUVkaXRvckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudXRpbC5Db2xvckNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnV0aWwuSUNvbG9yQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotCi1wdWJsaWMgY2xhc3MgSlBBRWRpdG9yQ29uc3RhbnRzIHsKLQkKLQlwdWJsaWMgc3RhdGljIGVudW0gRElBR1JBTV9PQkpFQ1RfVFlQRSB7Ci0JCUVudGl0eSwKLQkJTWFwcGVkU3VwZWNsYXNzCi0JfTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19BX1JFTEFUSU9OX0lEX1BSRUZJWCA9ICJpc19hX3JlbGF0aW9uOiI7IAkvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfQSA9ICJpcy1hIjsJLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9QUkVGSVhfRElSVFkgPSAiKiAiOwkvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IFBSSU1JVElWRV9UT19XUkFQUEVSID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsU3RyaW5nPigpOwotCQotCXB1YmxpYyBzdGF0aWMgSGFzaFNldDxTdHJpbmc+IFdSQVBQRVJfU0lNUExFX05BTUVTID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQkKLQlwdWJsaWMgc3RhdGljIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gQU5OT1RBVElPTl9OQU1FX1RPX0tFWSA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JcHVibGljIHN0YXRpYyBTZXQ8U3RyaW5nPiBDQVJESU5BTElUWV9MQUJFTFMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09MTEFQU0VfRkVBVFVSRVMgPSAiY29sbGFwc2VGZWF0dXJlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElDb2xvckNvbnN0YW50IEVOVElUWV9URVhUX0ZPUkVHUk9VTkQgPQotICAgICAgICBuZXcgQ29sb3JDb25zdGFudCgwLCAwLCA1MSk7Ci0JCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUNvbG9yQ29uc3RhbnQgRU5USVRZX0JBQ0tHUk9VTkQgPQotICAgICAgICBuZXcgQ29sb3JDb25zdGFudCgyMTIsIDIzMSwgMjQ4KTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElDb2xvckNvbnN0YW50IE1BUFBFRF9TVVBFUkNMQVNTX0JBQ0tHUk9VTkQgPQotCSAgICAgICAgbmV3IENvbG9yQ29uc3RhbnQoMjEyLCAyNDgsIDIzMSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElDb2xvckNvbnN0YW50IENPTk5FQ1RJT05fTElORV9DT0xPUiA9IAotICAgICAgICBuZXcgQ29sb3JDb25zdGFudCg5OCwgMTMxLDE2Nyk7CQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUNvbG9yQ29uc3RhbnQgSVNfQV9DT05ORUNUSU9OX0xJTkVfQ09MT1IgPSAKLQkgICAgICAgIG5ldyBDb2xvckNvbnN0YW50KDk4LCAxNjcsIDEzMSk7CQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUNvbG9yQ29uc3RhbnQgRU5USVRZX0JPUkRFUl9DT0xPUiA9IAotICAgICAgICBuZXcgQ29sb3JDb25zdGFudCg5OCwgMTMxLDE2Nyk7CQkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElDb2xvckNvbnN0YW50IE1BUFBFRF9TVVBFUkNMQVNTX0JPUkRFUl9DT0xPUiA9IAotCSAgICAgICAgbmV3IENvbG9yQ29uc3RhbnQoOTgsIDE2NywgMTMxKTsJCQotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRSVUVfU1RSSU5HID0gQm9vbGVhbi50b1N0cmluZyh0cnVlKTsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDT05ORUNUSU9OX0xJTkVfV0lEVEggPSAyOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElTX0FfQ09OTkVDVElPTl9MSU5FX1dJRFRIID0gMjsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVOVElUWV9CT1JERVJfV0lEVEggPSAyOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVOVElUWV9DT1JORVJfV0lEVEggPSA2OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVOVElUWV9DT1JORVJfSEVJR0hUID0gNjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTUlOX0hFSUdIVCA9IDMwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9NSU5fV0lEVEggPSA1MDsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFTlRJVFlfV0lEVEggPSAxMjA7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRU5USVRZX0hFSUdIVCA9IDcwOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFUVFJJQlVURV9SRUNUX0hFSUdIVCA9IDMwOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFUVFJJQlVURVNfVE9QX09GRlNFVCA9IDE1OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFUVFJJQlVURVNfUExBQ0VNRU5UX1NURVAgPSAyMDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBBVFRSSUJVVEVfVEVYVF9SRUNUX1ggPSAyMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBBVFRSSUJVVEVfVEVYVF9SRUNUX1dJRFRIX1JFRFVDRVIgPSAyMTsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJQ09OX1JFQ1RfTEVGVF9PRkZTRVQgPSAwOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElDT05fSEVBREVSX1ggPSA3OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElDT05fSEVBREVSX1kgPSA3OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhFQURFUl9JQ09OX1JFQ1RfV0lEVEggPSAyNDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBIRUFERVJfSUNPTl9SRUNUX0hFSUdIVCA9IDI0OyAKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBIRUFERVJfVEVYVF9SRUNUX0hFSUdIVCA9IDIxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhFQURFUl9URVhUX1JFQ1RfWCA9IDI1OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhFQURFUl9URVhUX1JFQ1RfV0lEVEhfUkVEVUNFUiA9IDI1OwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElDT05fWCA9IDQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSUNPTl9ZID0gNDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJQ09OX1dJRFRIID0gMTY7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSUNPTl9IRUlHSFQgPSAxNjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJQ09OX1JFQ1RfV0lEVEggPSAyMDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJQ09OX1JFQ1RfSEVJR0hUID0gMjA7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU0VQQVJBVE9SX0hFSUdIVCA9IDI7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09NUEFSVE1FTlRfTUlOX0hFSUdIVCA9IDEzOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPTVBBUlRNRU5UX0JVVFRPTV9PRkZTRVQgPSA1OwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fQkFTSUMgPSAiQmFzaWMiOyAJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OX0lEID0gIklkIjsgCQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fT05FX1RPX09ORSA9ICJPbmVUb09uZSI7IAkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OX09ORV9UT19NQU5ZID0gIk9uZVRvTWFueSI7IAkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fTUFOWV9UT19PTkUgPSAiTWFueVRvT25lIjsgCQkvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTl9NQU5ZX1RPX01BTlkgPSAiTWFueVRvTWFueSI7IAkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fVkVSU0lPTiA9ICJWZXJzaW9uIjsgCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OX0VNQkVEREVEID0gIkVtYmVkZGVkIjsgCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fRU1CRURERURfSUQgPSAiRW1iZWRkZWRJZCI7IAkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fVFJBTlNJRU5UID0gIlRyYW5zaWVudCI7IAkJCS8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxBVElPTl9UWVBFX1VOSURJUkVDVElPTkFMID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxBVElPTl9UWVBFX0JJRElSRUNUSU9OQUwgPSAyOwotCQotCXB1YmxpYyBzdGF0aWMgSGFzaFNldDxTdHJpbmc+IFJFTEFUSU9OX0FOTk9UQVRJT05TID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST1BfRU5USVRZX0NMQVNTX05BTUUgPSAicHJvcF9lbnRpdHlfY2xhc3NfbmFtZSI7CS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9QX1NIQVBFX1RZUEUgPSAicHJvcF9zaGFwZV90eXBlIjsJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST1BfQVRUUklCU19OVU0gPSAicHJvcF9hdHRyaWJzX251bSI7CQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9QX1NQRUNJRklFRF9OQU1FID0gInNwZWNpZmllZE5hbWUiOwkJLy8kTk9OLU5MUy0xJAotCQkKLQlwdWJsaWMgc3RhdGljIGVudW0gRGVjb3JhdG9yVHlwZSB7Ci0JCUNBUkRJTkFMSVRZLAotCQlBU1NPQ0lBVElPTgotCX0KLQotCS8vcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPUF9DT05fRElSX1NUQVJUID0gInByb3BfY29uX2Rpcl9zdGFydCI7CQkJLy8kTk9OLU5MUy0xJAotCS8vcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPUF9DT05fRElSX0VORCA9ICJwcm9wX2Nvbl9kaXJfZW5kIjsJCQkJLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEX1ZJRVdfSlBBX0RFVEFJTFMgPSAib3JnLmVjbGlwc2UuanB0LnVpLmpwYURldGFpbHNWaWV3IjsJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSURfVklFV19NSU5JQVRVUkUgPSAib3JnLmVjbGlwc2UuZ3JhcGhpdGkudWkuaW50ZXJuYWwuZWRpdG9yLnRodW1ibmFpbHZpZXciOwkvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ0FSRElOQUxJVFlfWkVST19PTkUgPSAiMC4uMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDQVJESU5BTElUWV9PTkUgPSAiMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDQVJESU5BTElUWV9aRVJPX04gPSAiMC4uTiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGVudW0gU2hhcGVUeXBlIHtJQ09OLCBIRUFERVIsIEFUVFJJQlVURSwgQ09NUEFSVE1FTlR9OwotCQotCXN0YXRpYyB7Ci0JCUFOTk9UQVRJT05fTkFNRV9UT19LRVkucHV0KEFOTk9UQVRJT05fQkFTSUMsIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUFOTk9UQVRJT05fTkFNRV9UT19LRVkucHV0KEFOTk9UQVRJT05fSUQsIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUFOTk9UQVRJT05fTkFNRV9UT19LRVkucHV0KEFOTk9UQVRJT05fT05FX1RPX09ORSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlBTk5PVEFUSU9OX05BTUVfVE9fS0VZLnB1dChBTk5PVEFUSU9OX09ORV9UT19NQU5ZLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlBTk5PVEFUSU9OX05BTUVfVE9fS0VZLnB1dChBTk5PVEFUSU9OX01BTllfVE9fT05FLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlBTk5PVEFUSU9OX05BTUVfVE9fS0VZLnB1dChBTk5PVEFUSU9OX01BTllfVE9fTUFOWSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUFOTk9UQVRJT05fTkFNRV9UT19LRVkucHV0KEFOTk9UQVRJT05fVkVSU0lPTiwgTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlBTk5PVEFUSU9OX05BTUVfVE9fS0VZLnB1dChBTk5PVEFUSU9OX0VNQkVEREVELCBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlBTk5PVEFUSU9OX05BTUVfVE9fS0VZLnB1dChBTk5PVEFUSU9OX0VNQkVEREVEX0lELCBNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlBTk5PVEFUSU9OX05BTUVfVE9fS0VZLnB1dChBTk5PVEFUSU9OX1RSQU5TSUVOVCwgTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlSRUxBVElPTl9BTk5PVEFUSU9OUy5hZGQoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fT05FX1RPX09ORSk7Ci0JCVJFTEFUSU9OX0FOTk9UQVRJT05TLmFkZChKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fTUFOWSk7Ci0JCVJFTEFUSU9OX0FOTk9UQVRJT05TLmFkZChKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX09ORSk7Ci0JCVJFTEFUSU9OX0FOTk9UQVRJT05TLmFkZChKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX01BTlkpOwkKLQkJCi0JCUNBUkRJTkFMSVRZX0xBQkVMUy5hZGQoQ0FSRElOQUxJVFlfWkVST19PTkUpOwotCQlDQVJESU5BTElUWV9MQUJFTFMuYWRkKENBUkRJTkFMSVRZX09ORSk7Ci0JCUNBUkRJTkFMSVRZX0xBQkVMUy5hZGQoQ0FSRElOQUxJVFlfWkVST19OKTsKLQkJCi0JCVBSSU1JVElWRV9UT19XUkFQUEVSLnB1dCgiaW50IiwgSW50ZWdlci5jbGFzcy5nZXROYW1lKCkpOwkJLy8kTk9OLU5MUy0xJAotCQlQUklNSVRJVkVfVE9fV1JBUFBFUi5wdXQoImxvbmciLCBMb25nLmNsYXNzLmdldE5hbWUoKSk7CQkJLy8kTk9OLU5MUy0xJAotCQlQUklNSVRJVkVfVE9fV1JBUFBFUi5wdXQoImRvdWJsZSIsIERvdWJsZS5jbGFzcy5nZXROYW1lKCkpOwkJLy8kTk9OLU5MUy0xJAotCQlQUklNSVRJVkVfVE9fV1JBUFBFUi5wdXQoImZsb2F0IiwgRmxvYXQuY2xhc3MuZ2V0TmFtZSgpICk7CQkvLyROT04tTkxTLTEkCi0JCVBSSU1JVElWRV9UT19XUkFQUEVSLnB1dCgiYm9vbGVhbiIsIEJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKTsJLy8kTk9OLU5MUy0xJAotCQlQUklNSVRJVkVfVE9fV1JBUFBFUi5wdXQoImNoYXIiLCBDaGFyYWN0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsJLy8kTk9OLU5MUy0xJAotCQlQUklNSVRJVkVfVE9fV1JBUFBFUi5wdXQoImJ5dGUiLCBCeXRlLmNsYXNzLmdldE5hbWUoKSk7CQkJLy8kTk9OLU5MUy0xJAotCQlQUklNSVRJVkVfVE9fV1JBUFBFUi5wdXQoInNob3J0IiwgU2hvcnQuY2xhc3MuZ2V0TmFtZSgpKTsJCS8vJE5PTi1OTFMtMSQKLQkJCi0JCVdSQVBQRVJfU0lNUExFX05BTUVTLmFkZCgiSW50ZWdlciIpOwkJLy8kTk9OLU5MUy0xJAotCQlXUkFQUEVSX1NJTVBMRV9OQU1FUy5hZGQoIkxvbmciKTsJCQkvLyROT04tTkxTLTEkCi0JCVdSQVBQRVJfU0lNUExFX05BTUVTLmFkZCgiRG91YmxlIik7CQkJLy8kTk9OLU5MUy0xJAotCQlXUkFQUEVSX1NJTVBMRV9OQU1FUy5hZGQoIkZsb2F0Iik7CQkJLy8kTk9OLU5MUy0xJAotCQlXUkFQUEVSX1NJTVBMRV9OQU1FUy5hZGQoIkJvb2xlYW4iKTsJCS8vJE5PTi1OTFMtMSQKLQkJV1JBUFBFUl9TSU1QTEVfTkFNRVMuYWRkKCJDaGFyYWN0ZXIiKTsJCS8vJE5PTi1OTFMtMSQKLQkJV1JBUFBFUl9TSU1QTEVfTkFNRVMuYWRkKCJCeXRlIik7CQkJLy8kTk9OLU5MUy0xJAotCQlXUkFQUEVSX1NJTVBMRV9OQU1FUy5hZGQoIlNob3J0Iik7CQkJLy8kTk9OLU5MUy0xJAotCQlXUkFQUEVSX1NJTVBMRV9OQU1FUy5hZGQoIlN0cmluZyIpOwkJCS8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBQUklNSVRJVkVfVFlQRVNfQU5EX1dSQVBQRVJTID0geyJpbnQiLCAJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCQkJICJJbnRlZ2VyIiwgCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCQkJICJsb25nIiwgCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCQkJCSAiTG9uZyIsIAkJCQkJCS8vJE5PTi1OTFMtMSQJCQkJCQkJCQkJCQkJCQkJIAotCQkJCQkJCQkJCQkJCQkJCSAic2hvcnQiLCAJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCQkJICJTaG9ydCIsIAkJCQkJCS8vJE5PTi1OTFMtMSQJCQkJCQkJCQkJCQkJCQkJIAotCQkJCQkJCQkJCQkJCQkJCSAiY2hhciIsIAkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQkJCQkgIkNoYXJhY3RlciIsCQkJCQkvLyROT04tTkxTLTEkCQkJCQkJCQkJCQkJCQkJCSAKLQkJCQkJCQkJCQkJCQkJCQkgImJvb2xlYW4iLCAJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQkJCQkgIkJvb2xlYW4iLCAJCQkJCS8vJE5PTi1OTFMtMSQJCQkJCQkJCQkJCQkJCQkJIAotCQkJCQkJCQkJCQkJCQkJCSAiYnl0ZSIsIAkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQkJCQkgIkJ5dGUiLCAJCQkJCQkvLyROT04tTkxTLTEkCQkJCQkJCQkJCQkJCQkJCSAKLQkJCQkJCQkJCQkJCQkJCQkgImRvdWJsZSIsIAkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQkJCQkgIkRvdWJsZSIsIAkJCQkJCS8vJE5PTi1OTFMtMSQJCQkJCQkJCQkJCQkJCQkJIAotCQkJCQkJCQkJCQkJCQkJCSAiZmxvYXQiLAkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQkJCQkgIkZsb2F0IiwJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCQkJICJTdHJpbmcifTsJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEhhc2hTZXQ8U3RyaW5nPiBQUklNSVRJVkVfVFlQRVNfQU5EX1dSQVBQRVJTX1NFVCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsJCi0JCi0Jc3RhdGljIHsKLQkJZm9yIChTdHJpbmcgdHlwZSA6IFBSSU1JVElWRV9UWVBFU19BTkRfV1JBUFBFUlMpCi0JCQlQUklNSVRJVkVfVFlQRVNfQU5EX1dSQVBQRVJTX1NFVC5hZGQodHlwZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9XSE9MRV9QRVJTSVNURU5DRV9VTklUX0VESVRPUl9QUk9QRVJUWSA9ICJKUEFEaWFncmFtRWRpdG9yX29wZW5XaG9sZVBlcnNpc3RlbmNlVW5pdCI7CS8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1BUllfQ09MTEFQU0VEID0gInByaW1hcnkgY29sbGFwc2VkIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0lDX0NPTExBUFNFRCA9ICJiYXNpYyBjb2xsYXBzZWQiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxBVElPTl9DT0xMQVBTRUQgPSAicmVsYXRpb24gY29sbGFwc2VkIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0VOVElUWV9DSEVDS1NVTSA9ICJkaWFncmFtLmNoZWNrc3VtIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9TVVBQT1JUX0RJQUxPR19JRCA9ICJqcGFfc3VwcG9ydF93YXJuaW5nIjsJLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9YTUxfVEFHID0gImVudGl0eSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfTkFNRV9UQUcgPSAiZW50aXR5LW5hbWUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1dJRFRIX1RBRyA9ICJlbnRpdHktd2lkdGgiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfSEVJR0hUX1RBRyA9ICJlbnRpdHktaGVpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1hfQ09PUkRJTkFURV9UQUcgPSAiZW50aXR5LVgtQ29vcmRpbmF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9ZX0NPT1JESU5BVEVfVEFHID0gImVudGl0eS1ZLUNvb3JkaW5hdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfUFJJTUFSWV9TRUNUSU9OX1NUQVRFX1RBRyA9ICJwcmltYXJ5LWNvbGxhcHNlZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9SRUxBVElPTl9TRUNUSU9OX1NUQVRFX1RBRyA9ICJyZWxhdGlvbi1jb2xsYXBzZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfQkFTSUNfU0VDVElPTl9TVEFURV9UQUcgPSAiYmFzaWMtY29sbGFwc2VkIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9KUEFFZGl0b3JQcmVkZWZpbmVkQ29sb3JlZEFyZWFzLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9KUEFFZGl0b3JQcmVkZWZpbmVkQ29sb3JlZEFyZWFzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlOTAzNTkuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSlBBRWRpdG9yUHJlZGVmaW5lZENvbG9yZWRBcmVhcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuc3R5bGVzLkFkYXB0ZWRHcmFkaWVudENvbG9yZWRBcmVhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5HcmFkaWVudENvbG9yZWRBcmVhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuc3R5bGVzLkdyYWRpZW50Q29sb3JlZEFyZWFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuc3R5bGVzLkxvY2F0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5TdHlsZXNGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnV0aWwuSUdyYWRpZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51dGlsLklQcmVkZWZpbmVkUmVuZGVyaW5nU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudXRpbC5QcmVkZWZpbmVkQ29sb3JlZEFyZWFzOwotCi1wdWJsaWMgY2xhc3MgSlBBRWRpdG9yUHJlZGVmaW5lZENvbG9yZWRBcmVhcyBleHRlbmRzIFByZWRlZmluZWRDb2xvcmVkQXJlYXMgCi0JCQkJCQkJCQkJCSBpbXBsZW1lbnRzIElKUEFFZGl0b3JQcmVkZWZpbmVkUmVuZGVyaW5nU3R5bGUgewotCi0JLyoqCi0JICogVGhlIGNvbG9yLWFyZWFzLCB3aGljaCBhcmUgdXNlZCBmb3IgZGVmYXVsdCBlbGVtZW50cyB3aXRoIHRoZSBJRAotCSAqIHtAbGluayAjR1JFRU5fV0hJVEVfR0xPU1NfSUR9LgotCSAqLwotCXByaXZhdGUgc3RhdGljIEdyYWRpZW50Q29sb3JlZEFyZWFzIGdldEdyZWVuV2hpdGVHbG9zc0RlZmF1bHRBcmVhcygpIHsKLQkJZmluYWwgR3JhZGllbnRDb2xvcmVkQXJlYXMgZ3JhZGllbnRDb2xvcmVkQXJlYXMgPSBTdHlsZXNGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHcmFkaWVudENvbG9yZWRBcmVhcygpOwotCQlmaW5hbCBFTGlzdDxHcmFkaWVudENvbG9yZWRBcmVhPiBnY2FzID0gZ3JhZGllbnRDb2xvcmVkQXJlYXMuZ2V0R3JhZGllbnRDb2xvcigpOwotCi0JCWFkZEdyYWRpZW50Q29sb3JlZEFyZWEoZ2NhcywgIkY4RkVGQiIsIDAsIExvY2F0aW9uVHlwZS5MT0NBVElPTl9UWVBFX0FCU09MVVRFX1NUQVJULCAiRjhGRUZCIiwgMSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJTG9jYXRpb25UeXBlLkxPQ0FUSU9OX1RZUEVfQUJTT0xVVEVfU1RBUlQpOwotCQlhZGRHcmFkaWVudENvbG9yZWRBcmVhKGdjYXMsICJFREZDRjUiLCAxLCBMb2NhdGlvblR5cGUuTE9DQVRJT05fVFlQRV9BQlNPTFVURV9TVEFSVCwgIkVERkNGNSIsIDIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUxvY2F0aW9uVHlwZS5MT0NBVElPTl9UWVBFX0FCU09MVVRFX1NUQVJUKTsKLQkJYWRkR3JhZGllbnRDb2xvcmVkQXJlYShnY2FzLCAiREVGQUVEIiwgMiwgTG9jYXRpb25UeXBlLkxPQ0FUSU9OX1RZUEVfQUJTT0xVVEVfU1RBUlQsICJERUZBRUQiLCAzLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlMb2NhdGlvblR5cGUuTE9DQVRJT05fVFlQRV9BQlNPTFVURV9TVEFSVCk7Ci0JCWFkZEdyYWRpZW50Q29sb3JlZEFyZWEoZ2NhcywgIkQ0RjhFNyIsIDMsIExvY2F0aW9uVHlwZS5MT0NBVElPTl9UWVBFX0FCU09MVVRFX1NUQVJULCAiRkFGQ0ZCIiwgMiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJTG9jYXRpb25UeXBlLkxPQ0FUSU9OX1RZUEVfQUJTT0xVVEVfRU5EKTsKLQkJYWRkR3JhZGllbnRDb2xvcmVkQXJlYShnY2FzLCAiRTJFOUU1IiwgMiwgTG9jYXRpb25UeXBlLkxPQ0FUSU9OX1RZUEVfQUJTT0xVVEVfRU5ELCAiRTJFOUU1IiwgMCwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJTG9jYXRpb25UeXBlLkxPQ0FUSU9OX1RZUEVfQUJTT0xVVEVfRU5EKTsKLQkJZ3JhZGllbnRDb2xvcmVkQXJlYXMuc2V0U3R5bGVBZGFwdGlvbihJUHJlZGVmaW5lZFJlbmRlcmluZ1N0eWxlLlNUWUxFX0FEQVBUQVRJT05fREVGQVVMVCk7Ci0JCXJldHVybiBncmFkaWVudENvbG9yZWRBcmVhczsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29sb3ItYXJlYXMsIHdoaWNoIGFyZSB1c2VkIGZvciBwcmltYXJ5IHNlbGVjdGVkIGVsZW1lbnRzIHdpdGggdGhlIElECi0JICoge0BsaW5rICNHUkVFTl9XSElURV9HTE9TU19JRH0uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgR3JhZGllbnRDb2xvcmVkQXJlYXMgZ2V0R3JlZW5XaGl0ZUdsb3NzUHJpbWFyeVNlbGVjdGVkQXJlYXMoKSB7Ci0JCWZpbmFsIEdyYWRpZW50Q29sb3JlZEFyZWFzIGdyYWRpZW50Q29sb3JlZEFyZWFzID0gU3R5bGVzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhZGllbnRDb2xvcmVkQXJlYXMoKTsKLQkJZ3JhZGllbnRDb2xvcmVkQXJlYXMuc2V0U3R5bGVBZGFwdGlvbihJUHJlZGVmaW5lZFJlbmRlcmluZ1N0eWxlLlNUWUxFX0FEQVBUQVRJT05fUFJJTUFSWV9TRUxFQ1RFRCk7Ci0JCWZpbmFsIEVMaXN0PEdyYWRpZW50Q29sb3JlZEFyZWE+IGdjYXMgPSBncmFkaWVudENvbG9yZWRBcmVhcy5nZXRHcmFkaWVudENvbG9yKCk7Ci0KLQkJYWRkR3JhZGllbnRDb2xvcmVkQXJlYShnY2FzLCAiRUVGREY2IiwgMCwgTG9jYXRpb25UeXBlLkxPQ0FUSU9OX1RZUEVfQUJTT0xVVEVfU1RBUlQsICJFRUZERjYiLCAxLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlMb2NhdGlvblR5cGUuTE9DQVRJT05fVFlQRV9BQlNPTFVURV9TVEFSVCk7Ci0JCWFkZEdyYWRpZW50Q29sb3JlZEFyZWEoZ2NhcywgIkQwRjlFNiIsIDEsIExvY2F0aW9uVHlwZS5MT0NBVElPTl9UWVBFX0FCU09MVVRFX1NUQVJULCAiRDBGOUU2IiwgMiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJTG9jYXRpb25UeXBlLkxPQ0FUSU9OX1RZUEVfQUJTT0xVVEVfU1RBUlQpOwotCQlhZGRHcmFkaWVudENvbG9yZWRBcmVhKGdjYXMsICJBQ0Y0RDIiLCAyLCBMb2NhdGlvblR5cGUuTE9DQVRJT05fVFlQRV9BQlNPTFVURV9TVEFSVCwgIkFDRjREMiIsIDMsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUxvY2F0aW9uVHlwZS5MT0NBVElPTl9UWVBFX0FCU09MVVRFX1NUQVJUKTsKLQkJYWRkR3JhZGllbnRDb2xvcmVkQXJlYShnY2FzLCAiODFFQUI5IiwgMywgTG9jYXRpb25UeXBlLkxPQ0FUSU9OX1RZUEVfQUJTT0xVVEVfU1RBUlQsICJBQUYyRDAiLCAyLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlMb2NhdGlvblR5cGUuTE9DQVRJT05fVFlQRV9BQlNPTFVURV9FTkQpOwotCQlhZGRHcmFkaWVudENvbG9yZWRBcmVhKGdjYXMsICI5QUUwQkYiLCAyLCBMb2NhdGlvblR5cGUuTE9DQVRJT05fVFlQRV9BQlNPTFVURV9FTkQsICI5QUUwQkYiLCAwLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlMb2NhdGlvblR5cGUuTE9DQVRJT05fVFlQRV9BQlNPTFVURV9FTkQpOwotCQlyZXR1cm4gZ3JhZGllbnRDb2xvcmVkQXJlYXM7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbG9yLWFyZWFzLCB3aGljaCBhcmUgdXNlZCBmb3Igc2Vjb25kYXJ5IHNlbGVjdGVkIGVsZW1lbnRzIHdpdGggdGhlCi0JICogSUQge0BsaW5rICNHUkVFTl9XSElURV9HTE9TU19JRH0uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgR3JhZGllbnRDb2xvcmVkQXJlYXMgZ2V0R3JlZW5XaGl0ZUdsb3NzU2Vjb25kYXJ5U2VsZWN0ZWRBcmVhcygpIHsKLQkJZmluYWwgR3JhZGllbnRDb2xvcmVkQXJlYXMgZ3JhZGllbnRDb2xvcmVkQXJlYXMgPSBTdHlsZXNGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHcmFkaWVudENvbG9yZWRBcmVhcygpOwotCQlncmFkaWVudENvbG9yZWRBcmVhcy5zZXRTdHlsZUFkYXB0aW9uKElQcmVkZWZpbmVkUmVuZGVyaW5nU3R5bGUuU1RZTEVfQURBUFRBVElPTl9TRUNPTkRBUllfU0VMRUNURUQpOwotCQlmaW5hbCBFTGlzdDxHcmFkaWVudENvbG9yZWRBcmVhPiBnY2FzID0gZ3JhZGllbnRDb2xvcmVkQXJlYXMuZ2V0R3JhZGllbnRDb2xvcigpOwotCi0JCWFkZEdyYWRpZW50Q29sb3JlZEFyZWEoZ2NhcywgIkY1RkVGOSIsIDAsIExvY2F0aW9uVHlwZS5MT0NBVElPTl9UWVBFX0FCU09MVVRFX1NUQVJULCAiRjVGRUY5IiwgMSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJTG9jYXRpb25UeXBlLkxPQ0FUSU9OX1RZUEVfQUJTT0xVVEVfU1RBUlQpOwotCQlhZGRHcmFkaWVudENvbG9yZWRBcmVhKGdjYXMsICJFMkZDRUYiLCAxLCBMb2NhdGlvblR5cGUuTE9DQVRJT05fVFlQRV9BQlNPTFVURV9TVEFSVCwgIkUyRkNFRiIsIDIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUxvY2F0aW9uVHlwZS5MT0NBVElPTl9UWVBFX0FCU09MVVRFX1NUQVJUKTsKLQkJYWRkR3JhZGllbnRDb2xvcmVkQXJlYShnY2FzLCAiQ0JGOUUzIiwgMiwgTG9jYXRpb25UeXBlLkxPQ0FUSU9OX1RZUEVfQUJTT0xVVEVfU1RBUlQsICJDQkY5RTMiLCAzLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlMb2NhdGlvblR5cGUuTE9DQVRJT05fVFlQRV9BQlNPTFVURV9TVEFSVCk7Ci0JCWFkZEdyYWRpZW50Q29sb3JlZEFyZWEoZ2NhcywgIkJCRjdEQSIsIDMsIExvY2F0aW9uVHlwZS5MT0NBVElPTl9UWVBFX0FCU09MVVRFX1NUQVJULCAiQzVGN0UwIiwgMiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJTG9jYXRpb25UeXBlLkxPQ0FUSU9OX1RZUEVfQUJTT0xVVEVfRU5EKTsKLQkJYWRkR3JhZGllbnRDb2xvcmVkQXJlYShnY2FzLCAiQjJFNUNEIiwgMiwgTG9jYXRpb25UeXBlLkxPQ0FUSU9OX1RZUEVfQUJTT0xVVEVfRU5ELCAiQjJFNUNEIiwgMCwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJTG9jYXRpb25UeXBlLkxPQ0FUSU9OX1RZUEVfQUJTT0xVVEVfRU5EKTsKLQkJcmV0dXJuIGdyYWRpZW50Q29sb3JlZEFyZWFzOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb2xvci1hcmVhcywgd2hpY2ggYXJlIHVzZWQgZm9yIGVsZW1lbnRzIHdoZXJlIGFuIGFjdGlvbiBpcyBhbGxvd2VkCi0JICogd2l0aCB0aGUgSUQge0BsaW5rICNHUkVFTl9XSElURV9HTE9TU19JRH0uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgR3JhZGllbnRDb2xvcmVkQXJlYXMgZ2V0R3JlZWVuV2hpdGVHbG9zc0FjdGlvbkFsbG93ZWRBcmVhcygpIHsKLQkJZmluYWwgR3JhZGllbnRDb2xvcmVkQXJlYXMgZ3JhZGllbnRDb2xvcmVkQXJlYXMgPSBTdHlsZXNGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHcmFkaWVudENvbG9yZWRBcmVhcygpOwotCQlncmFkaWVudENvbG9yZWRBcmVhcy5zZXRTdHlsZUFkYXB0aW9uKElQcmVkZWZpbmVkUmVuZGVyaW5nU3R5bGUuU1RZTEVfQURBUFRBVElPTl9BQ1RJT05fQUxMT1dFRCk7Ci0JCWZpbmFsIEVMaXN0PEdyYWRpZW50Q29sb3JlZEFyZWE+IGdjYXMgPSBncmFkaWVudENvbG9yZWRBcmVhcy5nZXRHcmFkaWVudENvbG9yKCk7Ci0KLQkJYWRkR3JhZGllbnRDb2xvcmVkQXJlYShnY2FzLCAiOTkwMENDIiwgMCwgTG9jYXRpb25UeXBlLkxPQ0FUSU9OX1RZUEVfQUJTT0xVVEVfU1RBUlQsICIzMzY2OTkiLCAwLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlMb2NhdGlvblR5cGUuTE9DQVRJT05fVFlQRV9BQlNPTFVURV9FTkQpOwotCQlyZXR1cm4gZ3JhZGllbnRDb2xvcmVkQXJlYXM7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbG9yLWFyZWFzLCB3aGljaCBhcmUgdXNlZCBmb3IgZWxlbWVudHMgd2hlcmUgYW4gYWN0aW9uIGlzIGZvcmJpZGRlbgotCSAqIHdpdGggdGhlIElEIHtAbGluayAjR1JFRU5fV0hJVEVfR0xPU1NfSUR9LgotCSAqLwotCXByaXZhdGUgc3RhdGljIEdyYWRpZW50Q29sb3JlZEFyZWFzIGdldEdyZWVuV2hpdGVHbG9zc0FjdGlvbkZvcmJpZGRlbkFyZWFzKCkgewotCQlmaW5hbCBHcmFkaWVudENvbG9yZWRBcmVhcyBncmFkaWVudENvbG9yZWRBcmVhcyA9IFN0eWxlc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYWRpZW50Q29sb3JlZEFyZWFzKCk7Ci0JCWdyYWRpZW50Q29sb3JlZEFyZWFzLnNldFN0eWxlQWRhcHRpb24oSVByZWRlZmluZWRSZW5kZXJpbmdTdHlsZS5TVFlMRV9BREFQVEFUSU9OX0FDVElPTl9GT1JCSURERU4pOwotCQlmaW5hbCBFTGlzdDxHcmFkaWVudENvbG9yZWRBcmVhPiBnY2FzID0gZ3JhZGllbnRDb2xvcmVkQXJlYXMuZ2V0R3JhZGllbnRDb2xvcigpOwotCi0JCWFkZEdyYWRpZW50Q29sb3JlZEFyZWEoZ2NhcywgIkZGMDBDQyIsIDAsIExvY2F0aW9uVHlwZS5MT0NBVElPTl9UWVBFX0FCU09MVVRFX1NUQVJULCAiRkYwMDY2IiwgMCwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJTG9jYXRpb25UeXBlLkxPQ0FUSU9OX1RZUEVfQUJTT0xVVEVfRU5EKTsKLQkJcmV0dXJuIGdyYWRpZW50Q29sb3JlZEFyZWFzOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIEFkYXB0ZWRHcmFkaWVudENvbG9yZWRBcmVhcyBnZXRHcmVlbldoaXRlR2xvc3NBZGFwdGlvbnMoKSB7Ci0JCWZpbmFsIEFkYXB0ZWRHcmFkaWVudENvbG9yZWRBcmVhcyBhZ2NhID0gU3R5bGVzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWRhcHRlZEdyYWRpZW50Q29sb3JlZEFyZWFzKCk7Ci0JCWFnY2Euc2V0RGVmaW5lZFN0eWxlSWQoR1JFRU5fV0hJVEVfR0xPU1NfSUQpOwotCQlhZ2NhLnNldEdyYWRpZW50VHlwZShJR3JhZGllbnRUeXBlLlZFUlRJQ0FMKTsKLQkJYWdjYS5nZXRBZGFwdGVkR3JhZGllbnRDb2xvcmVkQXJlYXMoKS5hZGQoSVByZWRlZmluZWRSZW5kZXJpbmdTdHlsZS5TVFlMRV9BREFQVEFUSU9OX0RFRkFVTFQsIGdldEdyZWVuV2hpdGVHbG9zc0RlZmF1bHRBcmVhcygpKTsKLQkJYWdjYS5nZXRBZGFwdGVkR3JhZGllbnRDb2xvcmVkQXJlYXMoKS5hZGQoSVByZWRlZmluZWRSZW5kZXJpbmdTdHlsZS5TVFlMRV9BREFQVEFUSU9OX1BSSU1BUllfU0VMRUNURUQsCi0JCQkJZ2V0R3JlZW5XaGl0ZUdsb3NzUHJpbWFyeVNlbGVjdGVkQXJlYXMoKSk7Ci0JCWFnY2EuZ2V0QWRhcHRlZEdyYWRpZW50Q29sb3JlZEFyZWFzKCkuYWRkKElQcmVkZWZpbmVkUmVuZGVyaW5nU3R5bGUuU1RZTEVfQURBUFRBVElPTl9TRUNPTkRBUllfU0VMRUNURUQsCi0JCQkJZ2V0R3JlZW5XaGl0ZUdsb3NzU2Vjb25kYXJ5U2VsZWN0ZWRBcmVhcygpKTsKLQkJYWdjYS5nZXRBZGFwdGVkR3JhZGllbnRDb2xvcmVkQXJlYXMoKS5hZGQoSVByZWRlZmluZWRSZW5kZXJpbmdTdHlsZS5TVFlMRV9BREFQVEFUSU9OX0FDVElPTl9BTExPV0VELAotCQkJCWdldEdyZWVlbldoaXRlR2xvc3NBY3Rpb25BbGxvd2VkQXJlYXMoKSk7Ci0JCWFnY2EuZ2V0QWRhcHRlZEdyYWRpZW50Q29sb3JlZEFyZWFzKCkuYWRkKElQcmVkZWZpbmVkUmVuZGVyaW5nU3R5bGUuU1RZTEVfQURBUFRBVElPTl9BQ1RJT05fRk9SQklEREVOLAotCQkJCWdldEdyZWVuV2hpdGVHbG9zc0FjdGlvbkZvcmJpZGRlbkFyZWFzKCkpOwotCQlyZXR1cm4gYWdjYTsKLQl9CQotCi0JcHVibGljIHN0YXRpYyBBZGFwdGVkR3JhZGllbnRDb2xvcmVkQXJlYXMgZ2V0QWRhcHRlZEdyYWRpZW50Q29sb3JlZEFyZWFzKFN0cmluZyBpZCkgewotCQlBZGFwdGVkR3JhZGllbnRDb2xvcmVkQXJlYXMgcmVzID0gUHJlZGVmaW5lZENvbG9yZWRBcmVhcy5nZXRBZGFwdGVkR3JhZGllbnRDb2xvcmVkQXJlYXMoaWQpOwotCQlpZiAocmVzICE9IG51bGwpCi0JCQlyZXR1cm4gcmVzOwotCQlpZiAoR1JFRU5fV0hJVEVfR0xPU1NfSUQuZXF1YWxzKGlkKSkKLQkJCXJldHVybiBnZXRHcmVlbldoaXRlR2xvc3NBZGFwdGlvbnMoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSlBBRWRpdG9yVXRpbC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSlBBRWRpdG9yVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGJkNTI1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0pQQUVkaXRvclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuR3JhcGhpY3NBbGdvcml0aG07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlJvdW5kZWRSZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb25EZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkZyZWVGb3JtQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSW1wb3J0RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5KYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLmFjdGlvbnMuRm9ybWF0QWxsQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLk9yZ2FuaXplSW1wb3J0c0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZhY2FkZS5FY2xpcHNlRmFjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLkpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9ySW1hZ2VDcmVhdG9yLlJlbEVuZERpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JJbWFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHMuU2hhcGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEpQQUVkaXRvclV0aWwgewotCQotCi0JcHJpdmF0ZSBzdGF0aWMgSVBlU2VydmljZVV0aWwgcGVVdGlsID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfUFJPVklERVJfTElCUkFSWV9TVFJJTkcgPSAiamF2YXgvcGVyc2lzdGVuY2UvIjsgLy8kTk9OLU5MUy0xJAotCQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXBpdGFsaXplRmlyc3RMZXR0ZXIoU3RyaW5nIHMpIHsKLQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgcmV0dXJuIHM7Ci0JCVN0cmluZyByZXMgPSBzLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCkgKyBzLnN1YnN0cmluZygxKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIoU3RyaW5nIHMpIHsKLQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgcmV0dXJuIHM7Ci0JCVN0cmluZyByZXMgPSBzLnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkgKyBzLnN1YnN0cmluZygxKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV2ZXJ0Rmlyc3RMZXR0ZXJDYXNlKFN0cmluZyBzKSB7Ci0JCWlmICgocyA9PSBudWxsKSB8fCAocy5sZW5ndGgoKSA9PSAwKSkKLQkJCXJldHVybiBzOwotCQlyZXR1cm4gKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShzLmNoYXJBdCgwKSkgPyAKLQkJCQlzLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCkgOgotCQkJCXMuc3Vic3RyaW5nKDAsIDEpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKSkgKwotCQkJCXMuc3Vic3RyaW5nKDEpOwotCX0KLQotCXN5bmNocm9uaXplZCBwdWJsaWMgc3RhdGljIElQZVNlcnZpY2VVdGlsIGdldFBlVXRpbCgpIHsKLQkJaWYgKHBlVXRpbCA9PSBudWxsKQotCQkJcGVVdGlsID0gbmV3IFBlU2VydmljZVV0aWxJbXBsKCk7Ci0JCXJldHVybiBwZVV0aWw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHNJZ25vcmVGaXJzdExldHRlckNhc2UoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJaWYgKChzMSA9PSBudWxsKSAmJiAoczIgPT0gbnVsbCkpIAotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICgoczEgPT0gbnVsbCkgfHwgKHMyID09IG51bGwpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoczEubGVuZ3RoKCkgIT0gczIubGVuZ3RoKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChzMS5sZW5ndGgoKSA9PSAwKSAKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gczEuc3Vic3RyaW5nKDAsIDEpLmVxdWFsc0lnbm9yZUNhc2UoczIuc3Vic3RyaW5nKDAsIDEpKSAmJgotCQkJCXMxLnN1YnN0cmluZygxKS5lcXVhbHMoczIuc3Vic3RyaW5nKDEpKTsKLQl9Ci0JCi0gICAgcHVibGljIHN0YXRpYyBBbmNob3IgZ2V0QW5jaG9yKENvbnRhaW5lclNoYXBlIGNzKSB7IAotICAgIAlDb2xsZWN0aW9uPEFuY2hvcj4gYW5jaG9ycyAgPSBjcy5nZXRBbmNob3JzKCk7Ci0gICAgCWlmIChhbmNob3JzLml0ZXJhdG9yKCkuaGFzTmV4dCgpKQotICAgIAkJcmV0dXJuIGFuY2hvcnMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgCXJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEFuY2hvciBnZXRBbmNob3IoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgSUZlYXR1cmVQcm92aWRlciBmcCkgewotICAgIAlQaWN0b2dyYW1FbGVtZW50IHBlID0gZnAuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0gICAgCWlmICgocGUgPT0gbnVsbCkgfHwgKCEocGUgaW5zdGFuY2VvZiBDb250YWluZXJTaGFwZSkpKQotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCXJldHVybiBnZXRBbmNob3IoKENvbnRhaW5lclNoYXBlKXBlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGV4dChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCkgewotICAgIAlyZXR1cm4gYXQuZ2V0TmFtZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXR1cm5TaW1wbGVOYW1lKFN0cmluZyBzKSB7Ci0gICAgCXJldHVybiBzLnN1YnN0cmluZyhzLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBRdW90ZXMoU3RyaW5nIHMpIHsKLSAgICAJaWYgKChzLnN0YXJ0c1dpdGgoIlwiIikpICYmIChzLmVuZHNXaXRoKCJcIiIpKSkgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIAkJcmV0dXJuIHMuc3Vic3RyaW5nKDEsIHMubGVuZ3RoKCkgLSAxKTsKLSAgICAJcmV0dXJuIHM7Ci0gICAgfQotICAgIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRvb2x0aXBUZXh0KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsCi0JCQlTdHJpbmcgc3VwZXJQZXJzaXN0ZW50VHlwZU5hbWUpIHsKLQkJU3RyaW5nIHJlcyA9IGpwdC5nZXROYW1lKCk7Ci0JCWlmIChzdXBlclBlcnNpc3RlbnRUeXBlTmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVXRpbF9pbmhlcml0VHlwZVRvb2x0aXBUZXh0LAotCQkJCQluZXcgT2JqZWN0W10geyByZXMsIHN1cGVyUGVyc2lzdGVudFR5cGVOYW1lIH0pOwotCQl9Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JVdGlsX2Z1bGxuYW1lVG9vbHRpcFRleHQsCi0JCQkJbmV3IE9iamVjdFtdIHsgcmVzIH0pOwotCX0KLQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGVOYW1lKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0KSB7Ci0gICAgCXJldHVybiBnZXRBdHRyaWJ1dGVUeXBlTmFtZShhdC5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpKTsKLSAgICB9ICAgIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGVOYW1lKEphdmFSZXNvdXJjZUF0dHJpYnV0ZSBhdCkgewotICAgIAlyZXR1cm4gYXQuZ2V0VHlwZU5hbWUoKTsKLSAgICB9ICAgICAgICAKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRBdHRyaWJ1dGVUeXBlVHlwZU5hbWVzKEphdmFSZXNvdXJjZUF0dHJpYnV0ZSBhdCkgewotICAgIAlMaXN0SXRlcmF0b3I8U3RyaW5nPiB0dCA9IGF0LmdldFR5cGVUeXBlQXJndW1lbnROYW1lcygpLml0ZXJhdG9yKCk7Ci0gICAgCWlmICgodHQgPT0gbnVsbCkgfHwgIXR0Lmhhc05leHQoKSkgCi0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJTGlua2VkTGlzdDxTdHJpbmc+IHJlcyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKLQkgICAgd2hpbGUgKHR0Lmhhc05leHQoKSkgCi0JICAgIAlyZXMuYWRkKHR0Lm5leHQoKSk7IAotICAgIAlyZXR1cm4gcmVzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlTmFtZVdpdGhHZW5lcmljcyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCkgewotICAgIAlyZXR1cm4gZ2V0QXR0cmlidXRlVHlwZU5hbWVXaXRoR2VuZXJpY3MoYXQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKSk7Ci0gICAgfQotCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZU5hbWVXaXRoR2VuZXJpY3MoSmF2YVJlc291cmNlQXR0cmlidXRlIGF0KSB7Ci0gICAgCVN0cmluZ0J1aWxkZXIgcmVzID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0QXR0cmlidXRlVHlwZU5hbWUoYXQpKTsKLSAgICAJTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXQgPSBhdC5nZXRUeXBlVHlwZUFyZ3VtZW50TmFtZXMoKS5pdGVyYXRvcigpOwotICAgIAlpZiAoKGl0ICE9IG51bGwpICYmIGl0Lmhhc05leHQoKSkgewotCSAgICAJcmVzLmFwcGVuZCgnPCcpOwotCSAgICAJcmVzLmFwcGVuZChjcmVhdGVDb21tYVNlcGFyYXRlZExpc3RPZkZ1bGxUeXBlTmFtZXMoaXQpKTsKLQkgICAgCXJlcy5hcHBlbmQoJz4nKTsKLSAgICAJfQotICAgIAlyZXR1cm4gcmVzLnRvU3RyaW5nKCk7Ci0gICAgfSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRHZW5lcmljc0VsZW1lbnRUeXBlcyhTdHJpbmcgdHlwZU5hbWUpIHsKLSAgICAJaWYgKHR5cGVOYW1lLmluZGV4T2YoIjwiKSA9PSAtMSkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJU3RyaW5nIHR5cGVzID0gdHlwZU5hbWUuc3Vic3RyaW5nKHR5cGVOYW1lLmluZGV4T2YoIjwiKSArIDEsIHR5cGVOYW1lLmxhc3RJbmRleE9mKCI+IikpOwkvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKLSAgICAJU3RyaW5nW10gdHlwZU5hbWVzID0gdHlwZXMuc3BsaXQoIiwiKTsJCS8vJE5PTi1OTFMtMSQKLSAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlTmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAJCXR5cGVOYW1lc1tpXSA9IHR5cGVOYW1lc1tpXS50cmltKCk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIHR5cGVOYW1lczsKLSAgICB9ICAgICAgICAgIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUNvbW1hU2VwYXJhdGVkTGlzdE9mU2ltcGxlVHlwZU5hbWVzKFN0cmluZ1tdIHN0cmluZ3MpIHsKLSAgICAJaWYgKChzdHJpbmdzID09IG51bGwpIHx8IChzdHJpbmdzLmxlbmd0aCA9PSAwKSkKLSAgICAJCXJldHVybiBudWxsOwotICAgIAlTdHJpbmdCdWlsZGVyIHJlcyA9IG5ldyBTdHJpbmdCdWlsZGVyKEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShzdHJpbmdzWzBdKSk7Ci0gICAgCWZvciAoaW50IGkgPSAxOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykgewotICAgIAkJcmVzLmFwcGVuZCgiLCAiKTsJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0gICAgCQlyZXMuYXBwZW5kKEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShzdHJpbmdzW2ldKSk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIHJlcy50b1N0cmluZygpOwotICAgIH0gICAgIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUNvbW1hU2VwYXJhdGVkTGlzdE9mU2ltcGxlVHlwZU5hbWVzKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0ckl0KSB7Ci0gICAgCWlmICgoc3RySXQgPT0gbnVsbCkgfHwgIXN0ckl0Lmhhc05leHQoKSkgCi0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJU3RyaW5nQnVpbGRlciByZXMgPSBuZXcgU3RyaW5nQnVpbGRlcihKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoc3RySXQubmV4dCgpKSk7ICAgIAkKLQkgICAgd2hpbGUgKHN0ckl0Lmhhc05leHQoKSkgewotCSAgICAJcmVzLmFwcGVuZCgiLCAiKTsJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JICAgIAlyZXMuYXBwZW5kKEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShzdHJJdC5uZXh0KCkpKTsKLQkgICAgfQotICAgIAlyZXR1cm4gcmVzLnRvU3RyaW5nKCk7ICAgIAkKLSAgICB9ICAgICAKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVDb21tYVNlcGFyYXRlZExpc3RPZkZ1bGxUeXBlTmFtZXMoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RySXQpIHsKLSAgICAJaWYgKChzdHJJdCA9PSBudWxsKSB8fCAhc3RySXQuaGFzTmV4dCgpKSAKLSAgICAJCXJldHVybiBudWxsOwotICAgIAlTdHJpbmdCdWlsZGVyIHJlcyA9IG5ldyBTdHJpbmdCdWlsZGVyKHN0ckl0Lm5leHQoKSk7ICAgIAkKLQkgICAgd2hpbGUgKHN0ckl0Lmhhc05leHQoKSkgewotCSAgICAJcmVzLmFwcGVuZCgiLCAiKTsJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JICAgIAlyZXMuYXBwZW5kKHN0ckl0Lm5leHQoKSk7Ci0JICAgIH0KLSAgICAJcmV0dXJuIHJlcy50b1N0cmluZygpOyAgICAJCi0gICAgfSAgICAgICAgICAgICAgICAgICAgCi0gICAgCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGV4dChKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0gICAgCXJldHVybiBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShqcHQpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VG9vbHRpcFRleHQoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotICAgIAlTdHJpbmcgcmVzID0ganB0LmdldE5hbWUoKTsKLSAgICAJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclV0aWxfZnVsbG5hbWVUb29sdGlwVGV4dCwgbmV3IE9iamVjdFtdIHsgcmVzIH0pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRKUFR5cGUoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotICAgIAlTdHJpbmcgbmFtZSA9IGN1LmdldEVsZW1lbnROYW1lKCk7Ci0JCWlmICghbmFtZS5lbmRzV2l0aCgiLmphdmEiKSkJCQkJLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0gICAgCUlUeXBlIHRwID0gY3UuZmluZFByaW1hcnlUeXBlKCk7Ci0gICAgCWlmICh0cCA9PSBudWxsKQotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCW5hbWUgPSB0cC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJSUphdmFQcm9qZWN0IGpwID0gY3UuZ2V0SmF2YVByb2plY3QoKTsKLSAgICAJSnBhUHJvamVjdCBwcm9qID0gbnVsbDsKLQkJcHJvaiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEpwYVByb2plY3QoanAuZ2V0UHJvamVjdCgpKTsKLQkJaWYgKHByb2ogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotICAgIAlQZXJzaXN0ZW5jZVVuaXQgcHUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXQocHJvaik7Ci0gICAgCVBlcnNpc3RlbnRUeXBlIHB0ID0gcHUuZ2V0UGVyc2lzdGVudFR5cGUobmFtZSk7Ci0JCWlmICgocHQgPT0gbnVsbCkgfHwgKCEocHQgaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpKSkKLQkJCXJldHVybiBudWxsOwotICAgIAlyZXR1cm4JKEphdmFQZXJzaXN0ZW50VHlwZSlwdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZUZyb21TaGFwZShTaGFwZSBzaCkgewotICAgIAlDb250YWluZXJTaGFwZSBjc2ggPSAoQ29udGFpbmVyU2hhcGUpc2g7Ci0gICAgCUxpc3Q8U2hhcGU+IHNoYXBlcyA9IGNzaC5nZXRDaGlsZHJlbigpOwotICAgIAlJdGVyYXRvcjxTaGFwZT4gaXQgPSBzaGFwZXMuaXRlcmF0b3IoKTsKLSAgICAJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgIAkJU2hhcGUgc2hhcGUgPSBpdC5uZXh0KCk7Ci0gICAgCQlHcmFwaGljc0FsZ29yaXRobSBnYSA9IHNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0gICAgCQlpZiAoZ2EgaW5zdGFuY2VvZiBSZWN0YW5nbGUpIHsKLSAgICAJCQlSZWN0YW5nbGUgcmVjdCA9IChSZWN0YW5nbGUpZ2E7Ci0gICAgCQkJaWYgKHJlY3QuZ2V0WSgpID09IDApIHsKLSAgICAJCQkJTGlzdDxHcmFwaGljc0FsZ29yaXRobT4gZ2FzID0gcmVjdC5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCk7Ci0gICAgCQkJCWlmIChnYXMuc2l6ZSgpID4gMCkgeyAKLSAgICAJCQkJCUdyYXBoaWNzQWxnb3JpdGhtIGdyYSA9IGdhcy5nZXQoMCk7Ci0gICAgCQkJCQlpZiAoZ3JhIGluc3RhbmNlb2YgVGV4dCkKLSAgICAJCQkJCQlyZXR1cm4gKChUZXh0KWdyYSkuZ2V0VmFsdWUoKTsgCi0gICAgCQkJCX0KLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXROYW1lT2ZTaGFwZShTaGFwZSBzaCwgU3RyaW5nIG5hbWUpIHsKLSAgICAJQ29udGFpbmVyU2hhcGUgY3NoID0gKENvbnRhaW5lclNoYXBlKXNoOwotICAgIAlMaXN0PFNoYXBlPiBzaGFwZXMgPSBjc2guZ2V0Q2hpbGRyZW4oKTsKLSAgICAJSXRlcmF0b3I8U2hhcGU+IGl0ID0gc2hhcGVzLml0ZXJhdG9yKCk7Ci0gICAgCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAJCVNoYXBlIHNoYXBlID0gaXQubmV4dCgpOwotICAgIAkJR3JhcGhpY3NBbGdvcml0aG0gZ2EgPSBzaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotICAgIAkJaWYgKGdhIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSB7Ci0gICAgCQkJUmVjdGFuZ2xlIHJlY3QgPSAoUmVjdGFuZ2xlKWdhOwotICAgIAkJCWlmIChyZWN0LmdldFkoKSA9PSAwKSB7Ci0gICAgCQkJCUxpc3Q8R3JhcGhpY3NBbGdvcml0aG0+IGdhcyA9IHJlY3QuZ2V0R3JhcGhpY3NBbGdvcml0aG1DaGlsZHJlbigpOwotICAgIAkJCQlpZiAoZ2FzLnNpemUoKSA+IDApIHsgCi0gICAgCQkJCQlHcmFwaGljc0FsZ29yaXRobSBncmEgPSBnYXMuZ2V0KDApOwotICAgIAkJCQkJaWYgKGdyYSBpbnN0YW5jZW9mIFRleHQpIHsKLSAgICAJCQkJCQkoKFRleHQpZ3JhKS5zZXRWYWx1ZShuYW1lKTsKLSAgICAJCQkJCQlyZXR1cm47Ci0gICAgCQkJCQl9Ci0gICAgCQkJCX0KLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCX07Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRKUFROYW1lSW5TaGFwZShDb250YWluZXJTaGFwZSBjcywgU3RyaW5nIG5ld05hbWUpIHsKLSAgICAJc2V0SlBUTmFtZUluU2hhcGUoY3MsIG5ld05hbWUsIGdldFBlVXRpbCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEpQVE5hbWVJblNoYXBlKENvbnRhaW5lclNoYXBlIGNzLCBTdHJpbmcgbmV3TmFtZSwgSVBlU2VydmljZVV0aWwgcGVVdGlsKSB7Ci0gICAgCUxpc3Q8U2hhcGU+IHNoYXBlcyA9IGNzLmdldENoaWxkcmVuKCk7Ci0gICAgCUl0ZXJhdG9yPFNoYXBlPiBpdCA9IHNoYXBlcy5pdGVyYXRvcigpOwotICAgIAl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgCQlTaGFwZSBzaCA9IGl0Lm5leHQoKTsKLSAgICAJCVN0cmluZyBwcm9wU2hhcGVUeXBlID0gcGVVdGlsLmdldFByb3BlcnR5VmFsdWUoc2gsIEpQQUVkaXRvckNvbnN0YW50cy5QUk9QX1NIQVBFX1RZUEUpOwotICAgIAkJaWYgKCFTaGFwZVR5cGUuSEVBREVSLnRvU3RyaW5nKCkuZXF1YWxzKHByb3BTaGFwZVR5cGUpKQotICAgIAkJCWNvbnRpbnVlOwotICAgIAkJVGV4dCB0eHQgPSAoVGV4dClzaC5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKS5nZXQoMCk7Ci0gICAgCQl0eHQuc2V0VmFsdWUobmV3TmFtZSk7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShTdHJpbmcgbmFtZSkgewotICAgIAlpZiAoKG5hbWUgPT0gbnVsbCkgfHwgKG5hbWUubGVuZ3RoKCkgPT0gMCkpIAotCQkJcmV0dXJuICIiOwkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0gICAgCWlmIChuYW1lLmxlbmd0aCgpID09IDEpCi0gICAgCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgCVN0cmluZyBzZWNvbmRTeW1ib2wgPSBuYW1lLnN1YnN0cmluZygxLCAyKTsgCi0gICAgCWlmIChzZWNvbmRTeW1ib2wudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpLmVxdWFscyhzZWNvbmRTeW1ib2wudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpKSkKLSAgICAJCXJldHVybiBkZWNhcGl0YWxpemVGaXJzdExldHRlcihuYW1lKTsKLSAgICAJcmV0dXJuIChpc1VwcGVyQ2FzZShzZWNvbmRTeW1ib2wpKSA/IAotICAgIAkJCWNhcGl0YWxpemVGaXJzdExldHRlcihuYW1lKSA6IAotICAgIAkJCQlkZWNhcGl0YWxpemVGaXJzdExldHRlcihuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVXBwZXJDYXNlKFN0cmluZyBzKSB7Ci0gICAgCWlmICgocyA9PSBudWxsKSB8fCAocy5sZW5ndGgoKSA9PSAwKSB8fCAocy5sZW5ndGgoKSA+IDEpKSAKLSAgICAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZ2l2ZW4gc3RyaW5nIGhhcyB0byBjb250YWluIG9uZSBzeW1ib2wgZXhhY3RseSIpOwkvLyROT04tTkxTLTEkCi0gICAgCXJldHVybiBzLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKS5lcXVhbHMocyk7Ci0gICAgfQotICAgIAotICAgIAotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVSZWdpc3RlckVudGl0eUluWE1MSm9iKGZpbmFsIEpwYVByb2plY3QganBhUHJvamVjdCwgZmluYWwgU3RyaW5nIGNsYXNzRlFOKSB7Ci0JCWZpbmFsIEpwYVhtbFJlc291cmNlIHJlc291cmNlID0ganBhUHJvamVjdC5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCk7Ci0JCVhtbFBlcnNpc3RlbmNlIHhtbFBlcnNpc3RlbmNlID0gKFhtbFBlcnNpc3RlbmNlKSByZXNvdXJjZS5nZXRSb290T2JqZWN0KCk7Ci0JCUVMaXN0PFhtbFBlcnNpc3RlbmNlVW5pdD4gcGVyc2lzdGVuY2VVbml0cyA9IHhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKTsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdHMuZ2V0KDApOyAvLyBNdWx0aXBseSBwZXJzaXN0ZW5jZSB1bml0IHN1cHBvcnQKLQkJYm9vbGVhbiByZWdpc3RlcmVkID0gZmFsc2U7Ci0JCWZvciAoWG1sSmF2YUNsYXNzUmVmIHJlZiA6IHBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkpIHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSByZWYuZ2V0SmF2YUNsYXNzKCk7Ci0JCQlpZiAoY2xhc3NGUU4uZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQlyZWdpc3RlcmVkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoIXJlZ2lzdGVyZWQpIHsKLQkJCVhtbEphdmFDbGFzc1JlZiBjbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7Ci0JCQljbGFzc1JlZi5zZXRKYXZhQ2xhc3MoY2xhc3NGUU4pOwotCSAgICAgCXBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuYWRkKGNsYXNzUmVmKTsJCQkJCQotCQl9Ci0JCXJlc291cmNlLnNhdmUoKTsKLQl9Ci0gICAgCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVVucmVnaXN0ZXJFbnRpdHlGcm9tWE1MSm9iKGZpbmFsIEpwYVByb2plY3QganBhUHJvamVjdCwgZmluYWwgU3RyaW5nIGNsYXNzRlFOKSB7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0ganBhUHJvamVjdC5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCk7Ci0JCVhtbFBlcnNpc3RlbmNlIHhtbFBlcnNpc3RlbmNlID0gKFhtbFBlcnNpc3RlbmNlKSByZXNvdXJjZS5nZXRSb290T2JqZWN0KCk7Ci0JCUVMaXN0PFhtbFBlcnNpc3RlbmNlVW5pdD4gcGVyc2lzdGVuY2VVbml0cyA9IHhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKTsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdHMuZ2V0KDApOy8vIE11bHRpcGx5IHBlcnNpc3RlbmNlIHVuaXQgc3VwcG9ydAotCQlFTGlzdDxYbWxKYXZhQ2xhc3NSZWY+IGNSZWZzID0gcGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKTsKLQkJZm9yIChYbWxKYXZhQ2xhc3NSZWYgcmVmIDogY1JlZnMpIHsKLQkJCWlmIChyZWYuZ2V0SmF2YUNsYXNzKCkuZXF1YWxzKGNsYXNzRlFOKSkgewotCQkJCWNSZWZzLnJlbW92ZShyZWYpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJlc291cmNlLnNhdmUoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUltcG9ydHMoSUNvbXBpbGF0aW9uVW5pdCBjdSwgU3RyaW5nIHR5cGVGUU4pIHsKLQkJaWYgKHR5cGVGUU4gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdHlwZUZRTiA9IHR5cGVGUU4udHJpbSgpOwotCQlTdHJpbmdbXSB0eXBlRlFOcyA9IGdldEFsbFR5cGVzKHR5cGVGUU4pOwotCQljcmVhdGVJbXBvcnRzKGN1LCB0eXBlRlFOcyk7Ci0JfQotCQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEFsbFR5cGVzKFN0cmluZyB0eXBlRlFOKXsKLQkJdHlwZUZRTiA9IHR5cGVGUU4ucmVwbGFjZSgnWycsICcsJyk7Ci0JCXR5cGVGUU4gPSB0eXBlRlFOLnJlcGxhY2UoJ10nLCAnLCcpOwotCQl0eXBlRlFOID0gdHlwZUZRTi5yZXBsYWNlKCc8JywgJywnKTsKLQkJdHlwZUZRTiA9IHR5cGVGUU4ucmVwbGFjZSgnPicsICcsJyk7Ci0JCVN0cmluZ1tdIHJlcyA9IHR5cGVGUU4udHJpbSgpLnNwbGl0KCIsIik7CS8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspCi0JCQlyZXNbaV0gPSByZXNbaV0udHJpbSgpOwotCQlyZXR1cm4gcmVzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlSW1wb3J0cyhJQ29tcGlsYXRpb25Vbml0IGN1LCBTdHJpbmdbXSB0eXBlRlFOcykgewotCQlOdWxsUHJvZ3Jlc3NNb25pdG9yIG5wbSA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCWZvciAoU3RyaW5nIHR5cGVGUU4gOiB0eXBlRlFOcykgewotCQkJaWYgKHR5cGVGUU4uc3RhcnRzV2l0aCgiamF2YS5sYW5nLiIpIHx8ICF0eXBlRlFOLmNvbnRhaW5zKCIuIikpCQkvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKLQkJCQljb250aW51ZTsKLQkJCXRyeSB7Ci0JCQkJY3UuY3JlYXRlSW1wb3J0KHR5cGVGUU4sIG51bGwsIG5wbSk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkge30KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVJbXBvcnQoSUNvbXBpbGF0aW9uVW5pdCBjdSwgU3RyaW5nIHR5cGVGUU4pIHsKLQkJaWYgKHR5cGVGUU4uc3RhcnRzV2l0aCgiamF2YS5sYW5nLiIpIHx8ICF0eXBlRlFOLmNvbnRhaW5zKCIuIikpIAkJLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gcmV0dXJuU2ltcGxlTmFtZSh0eXBlRlFOKTsJCQkKLQkJCi0JCU51bGxQcm9ncmVzc01vbml0b3IgbnBtID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJU3RyaW5nIHNpbXBsZU5hbWUgPSByZXR1cm5TaW1wbGVOYW1lKHR5cGVGUU4pOwotCQlJSW1wb3J0RGVjbGFyYXRpb25bXSBpZHMgPSBuZXcgSUltcG9ydERlY2xhcmF0aW9uWzBdOwotCQl0cnkgewotCQkJaWRzID0gY3UuZ2V0SW1wb3J0cygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkge30JCQotCQlmb3IgKElJbXBvcnREZWNsYXJhdGlvbiBpZCA6IGlkcykgewotCQkJU3RyaW5nIGltcE5hbWUgPSBpZC5nZXRFbGVtZW50TmFtZSgpOyAKLQkJCWlmIChpbXBOYW1lLmVuZHNXaXRoKCIqIikpCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGltcE5hbWUuZW5kc1dpdGgoIi4iICsgc2ltcGxlTmFtZSkpCQkJLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0eXBlRlFOOwotCQkJaWYgKEpQQUVkaXRvckNvbnN0YW50cy5XUkFQUEVSX1NJTVBMRV9OQU1FUy5jb250YWlucyhzaW1wbGVOYW1lKSkKLQkJCQlyZXR1cm4gdHlwZUZRTjsKLQkJfQotCQl0cnkgewotCQkJY3UuY3JlYXRlSW1wb3J0KHR5cGVGUU4sIG51bGwsIG5wbSk7Ci0JCQlyZXR1cm4gcmV0dXJuU2ltcGxlTmFtZSh0eXBlRlFOKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHt9Ci0JCXJldHVybiB0eXBlRlFOOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgY3JlYXRlQXR0cmlidXRlSWNvbihSZWN0YW5nbGUgaWNvblJlY3QsIFNldDxTdHJpbmc+IGFubm90YXRpb25zKSB7Ci0JCUltYWdlIGljb24gPSBudWxsOwotCQlpZiAoKGFubm90YXRpb25zID09IG51bGwpIHx8IChhbm5vdGF0aW9ucy5zaXplKCkgPT0gMCkgfHwgYW5ub3RhdGlvbnMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fQkFTSUMpKSB7Ci0JCQlpY29uID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlSW1hZ2UoaWNvblJlY3QsIEpQQUVkaXRvckltYWdlUHJvdmlkZXIuSUNPTl9CQVNJQyk7Ci0JCX0gZWxzZSBpZiAoYW5ub3RhdGlvbnMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fSUQpKSB7Ci0JCQlpY29uID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlSW1hZ2UoaWNvblJlY3QsIEpQQUVkaXRvckltYWdlUHJvdmlkZXIuUFJJTUFSWV9LRVkpOwotCQl9IGVsc2UgaWYgKGFubm90YXRpb25zLmNvbnRhaW5zKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX09ORV9UT19PTkUpKSB7Ci0JCQlpY29uID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlSW1hZ2UoaWNvblJlY3QsIEpQQUVkaXRvckltYWdlUHJvdmlkZXIuSUNPTl9PTkVfVE9fT05FKTsKLQkJfSBlbHNlIGlmIChhbm5vdGF0aW9ucy5jb250YWlucyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fTUFOWSkpIHsKLQkJCWljb24gPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVJbWFnZShpY29uUmVjdCwgSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX09ORV9UT19NQU5ZKTsKLQkJfSBlbHNlIGlmIChhbm5vdGF0aW9ucy5jb250YWlucyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX09ORSkpIHsKLQkJCWljb24gPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVJbWFnZShpY29uUmVjdCwgSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX01BTllfVE9fT05FKTsKLQkJfSBlbHNlIGlmIChhbm5vdGF0aW9ucy5jb250YWlucyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX01BTlkpKSB7Ci0JCQlpY29uID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlSW1hZ2UoaWNvblJlY3QsIEpQQUVkaXRvckltYWdlUHJvdmlkZXIuSUNPTl9NQU5ZX1RPX01BTlkpOwkJCi0JCX0gZWxzZSBpZihhbm5vdGF0aW9ucy5jb250YWlucyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9FTUJFRERFRF9JRCkpewotCQkJaWNvbiA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZUltYWdlKGljb25SZWN0LCBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLklDT05fRU1CRURERURfSUQpOwotCQl9IGVsc2UgaWYoYW5ub3RhdGlvbnMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fVkVSU0lPTikpewotCQkJaWNvbiA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZUltYWdlKGljb25SZWN0LCBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLklDT05fVkVSU0lPTik7Ci0JCX0gZWxzZSBpZihhbm5vdGF0aW9ucy5jb250YWlucyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9UUkFOU0lFTlQpKXsKLQkJCWljb24gPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVJbWFnZShpY29uUmVjdCwgSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX1RSQU5TSUVOVCk7Ci0JCX0gZWxzZSBpZihhbm5vdGF0aW9ucy5jb250YWlucyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9FTUJFRERFRCkpewotCQkJaWNvbiA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZUltYWdlKGljb25SZWN0LCBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLklDT05fRU1CRURERUQpOwotCQl9IGVsc2UgewotCQkJaWNvbiA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZUltYWdlKGljb25SZWN0LCBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLklDT05fQkFTSUMpOwkJCQotCQl9CQotCQlyZXR1cm4gaWNvbjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTaGFwZSBnZXRJY29uU2hhcGUoU2hhcGUgYXR0cmlidXRlU2hhcGUpIHsKLQkJaW50IHkgPSBhdHRyaWJ1dGVTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldFkoKTsKLQkJQ29udGFpbmVyU2hhcGUgY3MgPSBhdHRyaWJ1dGVTaGFwZS5nZXRDb250YWluZXIoKTsKLQkJSXRlcmF0b3I8U2hhcGU+IGl0ID0gY3MuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlTaGFwZSBzaHAgPSBpdC5uZXh0KCk7Ci0JCQlHcmFwaGljc0FsZ29yaXRobSBnYSA9IHNocC5nZXRHcmFwaGljc0FsZ29yaXRobSgpOyAKLQkJCWlmICgoZ2EgIT0gbnVsbCkgJiYgKGdhLmdldFkoKSA9PSB5KSAmJiAKLQkJCQkoU2hhcGVUeXBlLklDT04udG9TdHJpbmcoKS4KLQkJCQkJCWVxdWFscyhHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRQcm9wZXJ0eVZhbHVlKHNocCwgCi0JCQkJCQkJCUpQQUVkaXRvckNvbnN0YW50cy5QUk9QX1NIQVBFX1RZUEUpKSkpIAotCQkJCXJldHVybiBzaHA7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxDb250YWluZXJTaGFwZT4gZ2V0UmVsYXRlZFNoYXBlcyhDb250YWluZXJTaGFwZSBjcykgewotCQlDb2xsZWN0aW9uPENvbnRhaW5lclNoYXBlPiByZXMgPSBuZXcgSGFzaFNldDxDb250YWluZXJTaGFwZT4oKTsKLQkJQ29sbGVjdGlvbjxDb25uZWN0aW9uPiBjb25zID0gbmV3IEhhc2hTZXQ8Q29ubmVjdGlvbj4oKTsgIAotCQlJdGVyYXRvcjxBbmNob3I+IGFuc0l0ID0gY3MuZ2V0QW5jaG9ycygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChhbnNJdC5oYXNOZXh0KCkpIHsKLQkJCUFuY2hvciBhbiA9IGFuc0l0Lm5leHQoKTsKLQkJCWNvbnMuYWRkQWxsKGFuLmdldEluY29taW5nQ29ubmVjdGlvbnMoKSk7Ci0JCQljb25zLmFkZEFsbChhbi5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkpOwotCQl9Ci0JCUl0ZXJhdG9yPENvbm5lY3Rpb24+IGNvbnNJdCA9IGNvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGNvbnNJdC5oYXNOZXh0KCkpIHsKLQkJCUNvbm5lY3Rpb24gY29uID0gY29uc0l0Lm5leHQoKTsKLQkJCUNvbnRhaW5lclNoYXBlIGNzMSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNzMSA9IChDb250YWluZXJTaGFwZSljb24uZ2V0U3RhcnQoKS5nZXRQYXJlbnQoKTsKLQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChjczEgIT0gY3MpCi0JCQkJcmVzLmFkZChjczEpOwotCQkJY3MxID0gKENvbnRhaW5lclNoYXBlKWNvbi5nZXRFbmQoKS5nZXRQYXJlbnQoKTsKLQkJCWlmIChjczEgIT0gY3MpCi0JCQkJcmVzLmFkZChjczEpOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCQkKLQlwdWJsaWMgc3RhdGljIGludCBjYWxjQ29ubmVjdGlvbkxlbmd0aChGcmVlRm9ybUNvbm5lY3Rpb24gYykgewotCQlMaXN0PG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuc3R5bGVzLlBvaW50PiBwdHMgPSBjLmdldEJlbmRwb2ludHMoKTsKLQkJaW50IGxlbiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHRzLnNpemUoKSAtIDE7IGkrKykgewotCQkJbGVuID0gbGVuICsgKChwdHMuZ2V0KGkpLmdldFgoKSA9PSBwdHMuZ2V0KGkgKyAxKS5nZXRYKCkpID8KLQkJCQkJTWF0aC5hYnMocHRzLmdldChpKS5nZXRZKCkgLSBwdHMuZ2V0KGkgKyAxKS5nZXRZKCkpIDoKLQkJCQkJTWF0aC5hYnMocHRzLmdldChpKS5nZXRYKCkgLSBwdHMuZ2V0KGkgKyAxKS5nZXRYKCkpKTsJCi0JCX0KLQkJcmV0dXJuIGxlbjsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgTGlzdDxQb2ludD4gY3JlYXRlQmVuZFBvaW50TGlzdChGcmVlRm9ybUNvbm5lY3Rpb24gYywgIGJvb2xlYW4gc2VsZlJlbGF0aW9uKSB7Ci0JCWludCBjbnQgPSBnZXROdW1iZXJPZkNvbm5lY3Rpb25zV2l0aFNhbWVFbmRzQXMoYyk7Ci0JCXJldHVybiBjcmVhdGVCZW5kUG9pbnRMaXN0KGMsIGNudCAtIDEsIGNudCwgc2VsZlJlbGF0aW9uKTsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgTGlzdDxQb2ludD4gY3JlYXRlQmVuZFBvaW50TGlzdChGcmVlRm9ybUNvbm5lY3Rpb24gYywgIGludCBjbnQsIGludCBjb25uZWN0aW9uc051bSwgIGJvb2xlYW4gc2VsZlJlbGF0aW9uKSB7Ci0JCXJldHVybiBzZWxmUmVsYXRpb24gPyAKLQkJCQljcmVhdGVCZW5kUG9pbnRMaXN0Rm9yU2VsZlJlbGF0aW9uKGMsIGNudCwgY29ubmVjdGlvbnNOdW0pIDoKLQkJCQljcmVhdGVCZW5kUG9pbnRMaXN0Rm9yTm9uU2VsZlJlbGF0aW9uKGMsIGNudCwgY29ubmVjdGlvbnNOdW0pOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBMaXN0PFBvaW50PiBjcmVhdGVCZW5kUG9pbnRMaXN0Rm9yU2VsZlJlbGF0aW9uKEZyZWVGb3JtQ29ubmVjdGlvbiBjLCAgaW50IGNudCwgaW50IGNvbm5lY3Rpb25zTnVtKSB7Ci0JCWZpbmFsIGludCBBQlNfU0hJRlQgPSAxNTsgCi0JCQotCQlpbnQgZW1wdGllc3RRdWFkcmFudCA9IGdldEVtcHRpZXN0UXVhZHJhbnQoYyk7Ci0JCWJvb2xlYW4gZXZlblF1YWRyYW50ID0gKGVtcHRpZXN0UXVhZHJhbnQgPT0gMikgfHwgKGVtcHRpZXN0UXVhZHJhbnQgPT0gNCk7Ci0JCQotCQlSb3VuZGVkUmVjdGFuZ2xlIHJlY3QgPSAoUm91bmRlZFJlY3RhbmdsZSljLmdldFN0YXJ0KCkuZ2V0UGFyZW50KCkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJCi0JCWZsb2F0IGhhbGZXaWR0aCA9IHJlY3QuZ2V0V2lkdGgoKSAvIDIuMGY7Ci0JCWZsb2F0IGhhbGZIZWlnaHQgPSByZWN0LmdldEhlaWdodCgpIC8gMi4wZjsKLQkJCi0JCWludCBjZW50ZXJYID0gTWF0aC5yb3VuZChoYWxmV2lkdGggKyByZWN0LmdldFgoKSk7Ci0JCWludCBjZW50ZXJZID0gTWF0aC5yb3VuZChoYWxmSGVpZ2h0ICsgcmVjdC5nZXRZKCkpOwotCQkKLQkJYm9vbGVhbiBzdGFydEhvcml6b250YWwgPSBmYWxzZTsKLQkJYm9vbGVhbiBlbmRIb3Jpem9udGFsID0gIXN0YXJ0SG9yaXpvbnRhbDsJCi0KLQkJCi0JCWludCBzdGFydERpcmVjdGlvbiA9ICgoZW1wdGllc3RRdWFkcmFudCA9PSAyKSB8fCAoZW1wdGllc3RRdWFkcmFudCA9PSAzKSkgPyAxIDogLTE7ICAvLyAxIG9yIC0xOyAxIGZvciBSSUdIVC9ET1dOOyAtMSBmb3IgTEVGVC9VUAotCQlpbnQgZW5kRGlyZWN0aW9uID0gKChlbXB0aWVzdFF1YWRyYW50ID09IDEpIHx8IChlbXB0aWVzdFF1YWRyYW50ID09IDIpKSA/IDEgOiAtMTsKLQkJCi0JCWludCB4OwotCQlpbnQgeTsgCi0JCQotCQkKLQkJaWYgKGVuZEhvcml6b250YWwpIHsKLQkJCXggPSBjZW50ZXJYICsgTWF0aC5yb3VuZChoYWxmV2lkdGggKiBlbmREaXJlY3Rpb24pOyAKLQkJCXkgPSBjZW50ZXJZOwotCQl9IGVsc2UgewotCQkJeCA9IGNlbnRlclg7IAotCQkJeSA9IGNlbnRlclkgKyBNYXRoLnJvdW5kKGhhbGZIZWlnaHQgKiBlbmREaXJlY3Rpb24pOwkJCQotCQl9Ci0JCWludCBTSElGVCA9IGV2ZW5RdWFkcmFudCA/IC1BQlNfU0hJRlQgKiBlbmREaXJlY3Rpb24gOiBBQlNfU0hJRlQgKiBlbmREaXJlY3Rpb247CQotCQlQb2ludCBlbmRQb2ludCA9IG5ldyBQb2ludCh4ICsgKGVuZEhvcml6b250YWwgPyAwIDogKGNudCAqIFNISUZUKSksIHkgKyAoZW5kSG9yaXpvbnRhbCA/IChjbnQgKiBTSElGVCkgOiAwKSk7Ci0JCQotCQkKLQkJaWYgKHN0YXJ0SG9yaXpvbnRhbCkgewotCQkJeCA9IGNlbnRlclggKyBNYXRoLnJvdW5kKGhhbGZXaWR0aCAqIHN0YXJ0RGlyZWN0aW9uKTsgCi0JCQl5ID0gY2VudGVyWTsKLQkJfSBlbHNlIHsKLQkJCXggPSBjZW50ZXJYOyAKLQkJCXkgPSBjZW50ZXJZICsgTWF0aC5yb3VuZChoYWxmSGVpZ2h0ICogc3RhcnREaXJlY3Rpb24pOwkJCQotCQl9Ci0JCVNISUZUID0gZXZlblF1YWRyYW50ID8gLUFCU19TSElGVCAqIHN0YXJ0RGlyZWN0aW9uIDogQUJTX1NISUZUICogc3RhcnREaXJlY3Rpb247CQkKLQkJUG9pbnQgc3RhcnRQb2ludCA9IG5ldyBQb2ludCh4ICsgKHN0YXJ0SG9yaXpvbnRhbCA/IDAgOiAoY250ICogU0hJRlQpKSwgeSArIChzdGFydEhvcml6b250YWwgPyAoY250ICogU0hJRlQpIDogMCkpOwotCQkKLQkJLy8gc2Vjb25kIHBvaW50Ci0JCUxpc3Q8UG9pbnQ+IHJlcyA9IG5ldyBMaW5rZWRMaXN0PFBvaW50PigpOwotCQlyZXMuYWRkKHN0YXJ0UG9pbnQpOwotCQlpZiAoc3RhcnRIb3Jpem9udGFsKSB7Ci0JCQl4ID0gc3RhcnRQb2ludC54ICsgc3RhcnREaXJlY3Rpb24gKiA1MCArICgoZXZlblF1YWRyYW50ID8gLSBjbnQgOiBjbnQpICogU0hJRlQpOwotCQkJeSA9IHN0YXJ0UG9pbnQueTsKLQkJfSBlbHNlIHsKLQkJCXggPSBzdGFydFBvaW50Lng7Ci0JCQl5ID0gc3RhcnRQb2ludC55ICsgc3RhcnREaXJlY3Rpb24gKiA1MCArICgoZXZlblF1YWRyYW50ID8gLSBjbnQgOiBjbnQpICogU0hJRlQpOwotCQl9Ci0JCXJlcy5hZGQobmV3IFBvaW50KHgsIHkpKTsKLQkJCi0JCS8vIG1pZGRsZSBwb2ludAotCQlTSElGVCA9IEFCU19TSElGVCAqIGVuZERpcmVjdGlvbjsKLQkJaWYgKHN0YXJ0SG9yaXpvbnRhbCkgewotCQkJeSA9IHkgKyBNYXRoLnJvdW5kKGhhbGZIZWlnaHQgKyA1MCkgKiBlbmREaXJlY3Rpb24gKyAoMiAqY250ICogU0hJRlQpOwotCQl9IGVsc2UgewotCQkJeCA9IHggKyBNYXRoLnJvdW5kKGhhbGZXaWR0aCArIDUwKSAqIGVuZERpcmVjdGlvbiArICgyICogY250ICogU0hJRlQpOwotCQl9Ci0JCXJlcy5hZGQobmV3IFBvaW50KHgsIHkpKTsKLQkJCi0JCS8vIGZvdXJ0aCBwb2ludAotCQlpZiAoc3RhcnRIb3Jpem9udGFsKSB7Ci0JCQl4ID0gZW5kUG9pbnQueDsKLQkJfSBlbHNlIHsKLQkJCXkgPSBlbmRQb2ludC55OwotCQl9Ci0JCXJlcy5hZGQobmV3IFBvaW50KHgsIHkpKTsKLQkJCi0JCQotCQlyZXMuYWRkKGVuZFBvaW50KTsKLQkJCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tCQkKLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldEVtcHRpZXN0UXVhZHJhbnQoRnJlZUZvcm1Db25uZWN0aW9uIHNlbGZSZWwpIHsKLQkJQW5jaG9yIGFuY2hvciA9IHNlbGZSZWwuZ2V0U3RhcnQoKTsKLQkJUm91bmRlZFJlY3RhbmdsZSBwcmltUmVjdCA9IChSb3VuZGVkUmVjdGFuZ2xlKWFuY2hvci5nZXRQYXJlbnQoKS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCQlDb2xsZWN0aW9uPENvbm5lY3Rpb24+IGNvbnMgPSBuZXcgSGFzaFNldDxDb25uZWN0aW9uPigpOwotCQljb25zLmFkZEFsbChhbmNob3IuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpKTsKLQkJY29ucy5hZGRBbGwoYW5jaG9yLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKSk7Ci0JCUl0ZXJhdG9yPENvbm5lY3Rpb24+IGl0ID0gY29ucy5pdGVyYXRvcigpOwotCQlDb2xsZWN0aW9uPEFuY2hvcj4gYW5jaG9ycyA9IG5ldyBIYXNoU2V0PEFuY2hvcj4oKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJQ29ubmVjdGlvbiBjID0gaXQubmV4dCgpOwotCQkJQW5jaG9yIGEgPSBjLmdldFN0YXJ0KCk7Ci0JCQlpZiAoYSAhPSBhbmNob3IpCi0JCQkJYW5jaG9ycy5hZGQoYSk7Ci0JCQlhID0gYy5nZXRFbmQoKTsKLQkJCWlmIChhICE9IGFuY2hvcikKLQkJCQlhbmNob3JzLmFkZChhKTsJCQkKLQkJfQotCQlJdGVyYXRvcjxBbmNob3I+IGl0QW5jaG9ycyA9IGFuY2hvcnMuaXRlcmF0b3IoKTsKLQkJZmxvYXRbXSBxdWFkcmFudEhhYml0YXQgPSBuZXcgZmxvYXRbNV07Ci0JCXdoaWxlIChpdEFuY2hvcnMuaGFzTmV4dCgpKSB7Ci0JCQlBbmNob3IgYSA9IGl0QW5jaG9ycy5uZXh0KCk7Ci0JCQlSb3VuZGVkUmVjdGFuZ2xlIHJlY3QgPSAoUm91bmRlZFJlY3RhbmdsZSlhLmdldFBhcmVudCgpLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCQlpbnQgcSA9IGdldFF1YWRyYW50KHByaW1SZWN0LCByZWN0KTsKLQkJCXF1YWRyYW50SGFiaXRhdFtxXSArPSAxLjVmOwotCQkJaWYgKHEgPT0gMSkgewotCQkJCXF1YWRyYW50SGFiaXRhdFs0XSA9IHF1YWRyYW50SGFiaXRhdFs0XSArIDAuNWY7Ci0JCQl9IGVsc2UgaWYgKHEgPT0gNCkgewotCQkJCXF1YWRyYW50SGFiaXRhdFsxXSArPSAgMC41ZjsKLQkJCX0KLQkJCWlmIChxIDwgNCkgewotCQkJCXF1YWRyYW50SGFiaXRhdFtxICsgMV0gKz0gMC41ZjsKLQkJCX0KLQkJCWlmIChxID4gMSkgewotCQkJCXF1YWRyYW50SGFiaXRhdFtxIC0gMV0gKz0gMC41ZjsKLQkJCX0JCQkKLQkJfQotCQlmbG9hdCBtaW5IYWJpdGF0ID0gRmxvYXQuTUFYX1ZBTFVFOwotCQlpbnQgZW1wdGllc3RRdWFkcmFudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgNTsgaSsrKSB7Ci0JCQlpZiAocXVhZHJhbnRIYWJpdGF0W2ldIDwgbWluSGFiaXRhdCkgewotCQkJCWVtcHRpZXN0UXVhZHJhbnQgPSBpOwotCQkJCW1pbkhhYml0YXQgPSBxdWFkcmFudEhhYml0YXRbaV07IAotCQkJfQotCQl9Ci0JCXJldHVybiBlbXB0aWVzdFF1YWRyYW50OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0UXVhZHJhbnQoUm91bmRlZFJlY3RhbmdsZSBwcmltUmVjdCwgUm91bmRlZFJlY3RhbmdsZSByZWN0KSB7Ci0JCWludCBwcmltQ2VudGVyWCA9IHByaW1SZWN0LmdldFgoKSArIE1hdGgucm91bmQocHJpbVJlY3QuZ2V0V2lkdGgoKSAvIDIuMGYpOwotCQlpbnQgcHJpbUNlbnRlclkgPSBwcmltUmVjdC5nZXRZKCkgKyBNYXRoLnJvdW5kKHByaW1SZWN0LmdldEhlaWdodCgpIC8gMi4wZik7Ci0JCWludCBjZW50ZXJYID0gcmVjdC5nZXRYKCkgKyBNYXRoLnJvdW5kKHJlY3QuZ2V0V2lkdGgoKSAvIDIuMGYpOwotCQlpbnQgY2VudGVyWSA9IHJlY3QuZ2V0WSgpICsgTWF0aC5yb3VuZChyZWN0LmdldEhlaWdodCgpIC8gMi4wZik7Ci0JCWlmIChwcmltQ2VudGVyWCA8IGNlbnRlclgpIAotCQkJaWYgKHByaW1DZW50ZXJZID4gY2VudGVyWSkKLQkJCQlyZXR1cm4gMTsKLQkJCWVsc2UgCi0JCQkJcmV0dXJuIDI7Ci0JCWVsc2UgCi0JCQlpZiAocHJpbUNlbnRlclkgPiBjZW50ZXJZKQotCQkJCXJldHVybiA0OwotCQkJZWxzZSAKLQkJCQlyZXR1cm4gMzsKLQl9Ci0JCQotCXByaXZhdGUgc3RhdGljIExpc3Q8UG9pbnQ+IGNyZWF0ZUJlbmRQb2ludExpc3RGb3JOb25TZWxmUmVsYXRpb24oRnJlZUZvcm1Db25uZWN0aW9uIGMsICBpbnQgY250LCBpbnQgY29ubmVjdGlvbnNOdW0pIHsKLQkJZmluYWwgaW50IEFCU19TSElGVCA9IDE1OyAKLQkJUm91bmRlZFJlY3RhbmdsZSByZWN0U3RhcnQgPSAoUm91bmRlZFJlY3RhbmdsZSljLmdldFN0YXJ0KCkuZ2V0UGFyZW50KCkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJUm91bmRlZFJlY3RhbmdsZSByZWN0RW5kID0gKFJvdW5kZWRSZWN0YW5nbGUpYy5nZXRFbmQoKS5nZXRQYXJlbnQoKS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCQkKLQkJZmxvYXQgc3RhcnRIYWxmV2lkdGggPSByZWN0U3RhcnQuZ2V0V2lkdGgoKSAvIDIuMGY7Ci0JCWZsb2F0IHN0YXJ0SGFsZkhlaWdodCA9IHJlY3RTdGFydC5nZXRIZWlnaHQoKSAvIDIuMGY7Ci0JCWZsb2F0IGVuZEhhbGZXaWR0aCA9IHJlY3RFbmQuZ2V0V2lkdGgoKSAvIDIuMGY7Ci0JCWZsb2F0IGVuZEhhbGZIZWlnaHQgPSByZWN0RW5kLmdldEhlaWdodCgpIC8gMi4wZjsKLQotCQkKLQkJaW50IHN0YXJ0Q2VudGVyWCA9IE1hdGgucm91bmQoc3RhcnRIYWxmV2lkdGggKyByZWN0U3RhcnQuZ2V0WCgpKTsKLQkJaW50IHN0YXJ0Q2VudGVyWSA9IE1hdGgucm91bmQoc3RhcnRIYWxmSGVpZ2h0ICsgcmVjdFN0YXJ0LmdldFkoKSk7Ci0JCWludCBlbmRDZW50ZXJYID0gTWF0aC5yb3VuZChlbmRIYWxmV2lkdGggKyByZWN0RW5kLmdldFgoKSk7Ci0JCWludCBlbmRDZW50ZXJZID0gTWF0aC5yb3VuZChlbmRIYWxmSGVpZ2h0ICsgcmVjdEVuZC5nZXRZKCkpOwotCQlpbnQgeERlbHRhID0gZW5kQ2VudGVyWCAtIHN0YXJ0Q2VudGVyWDsKLQkJaW50IHlEZWx0YSA9IGVuZENlbnRlclkgLSBzdGFydENlbnRlclk7Ci0JCQotCQlib29sZWFuIHN0YXJ0SG9yaXpvbnRhbCA9IHRydWU7Ci0JCWludCB4OwotCQlpbnQgeTsgCi0JCQotCQlpZiAoeERlbHRhICE9IDApIHsKLQkJCXggPSBzdGFydENlbnRlclggKyBNYXRoLnJvdW5kKHN0YXJ0SGFsZldpZHRoICogTWF0aC5zaWdudW0oeERlbHRhKSk7IAotCQkJeSA9IHN0YXJ0Q2VudGVyWSArIE1hdGgucm91bmQoTWF0aC5hYnMoc3RhcnRIYWxmV2lkdGggLyB4RGVsdGEpICogeURlbHRhKTsKLQkJfSBlbHNlIHsKLQkJCXggPSBzdGFydENlbnRlclggKyBNYXRoLnJvdW5kKE1hdGguYWJzKHN0YXJ0SGFsZkhlaWdodCAvIHlEZWx0YSkgKiB4RGVsdGEpOyAKLQkJCXkgPSBzdGFydENlbnRlclkgKyBNYXRoLnJvdW5kKHN0YXJ0SGFsZkhlaWdodCAqIE1hdGguc2lnbnVtKHlEZWx0YSkpOwkJCQotCQl9Ci0JCQotCQlpZiAoTWF0aC5hYnMoeSAtIHN0YXJ0Q2VudGVyWSkgKyAwLjEgPiBzdGFydEhhbGZIZWlnaHQpIHsKLQkJCXN0YXJ0SG9yaXpvbnRhbCA9IGZhbHNlOzsKLQkJCXggPSBzdGFydENlbnRlclggKyBNYXRoLnJvdW5kKE1hdGguYWJzKHN0YXJ0SGFsZkhlaWdodCAvIHlEZWx0YSkgKiB4RGVsdGEpOwkJCQotCQkJeSA9IHN0YXJ0Q2VudGVyWSArIE1hdGgucm91bmQoc3RhcnRIYWxmSGVpZ2h0ICogTWF0aC5zaWdudW0oeURlbHRhKSk7Ci0JCX0KLQkJaW50IFNISUZUOwotCQkgaWYgKHN0YXJ0SG9yaXpvbnRhbCkgewotCQkJIFNISUZUID0gKHkgPCBzdGFydENlbnRlclkpID8gQUJTX1NISUZUIDogLUFCU19TSElGVDsKLQkJIH0gZWxzZSB7Ci0JCQkgU0hJRlQgPSAoeCA8IHN0YXJ0Q2VudGVyWCkgPyBBQlNfU0hJRlQgOiAtQUJTX1NISUZUOwotCQkgfQotCi0JCQotCQlQb2ludCBzdGFydFBvaW50ID0gbmV3IFBvaW50KHggKyAoc3RhcnRIb3Jpem9udGFsID8gMCA6IChjbnQgKiBTSElGVCkpLCB5ICsgKHN0YXJ0SG9yaXpvbnRhbCA/IChjbnQgKiBTSElGVCkgOiAwKSk7Ci0JCUxpc3Q8UG9pbnQ+IHJlcyA9IG5ldyBMaW5rZWRMaXN0PFBvaW50PigpOwotCQkKLQkJeERlbHRhID0gc3RhcnRDZW50ZXJYIC0gZW5kQ2VudGVyWDsKLQkJeURlbHRhID0gc3RhcnRDZW50ZXJZIC0gZW5kQ2VudGVyWTsKLQkJCi0JCWJvb2xlYW4gc3RyYWlnaHQgPSAoeERlbHRhID09IDApIHx8ICh5RGVsdGEgPT0gMCk7IAotCQkKLQkJcmVzLmFkZChzdGFydFBvaW50KTsKLQkJCi0JCWJvb2xlYW4gZW5kSG9yaXpvbnRhbCA9IHRydWU7CQotCQkKLQkJaWYgKHhEZWx0YSAhPSAwKSB7Ci0JCQl4ID0gZW5kQ2VudGVyWCArIE1hdGgucm91bmQoZW5kSGFsZldpZHRoICogTWF0aC5zaWdudW0oeERlbHRhKSk7IAotCQkJeSA9IGVuZENlbnRlclkgKyBNYXRoLnJvdW5kKE1hdGguYWJzKGVuZEhhbGZXaWR0aCAvIHhEZWx0YSkgKiB5RGVsdGEpOwotCQl9IGVsc2UgewotCQkJeCA9IGVuZENlbnRlclggKyBNYXRoLnJvdW5kKE1hdGguYWJzKGVuZEhhbGZIZWlnaHQgLyB5RGVsdGEpICogeERlbHRhKTsKLQkJCXkgPSBlbmRDZW50ZXJZICsgTWF0aC5yb3VuZChlbmRIYWxmSGVpZ2h0ICogTWF0aC5zaWdudW0oeURlbHRhKSk7IAotCQl9Ci0JCWlmIChNYXRoLmFicyh5IC0gZW5kQ2VudGVyWSkgKyAwLjEgPiBlbmRIYWxmSGVpZ2h0KSB7Ci0JCQllbmRIb3Jpem9udGFsID0gZmFsc2U7Ci0JCQl4ID0gZW5kQ2VudGVyWCArIE1hdGgucm91bmQoTWF0aC5hYnMoZW5kSGFsZkhlaWdodCAvIHlEZWx0YSkgKiB4RGVsdGEpOwkJCQotCQkJeSA9IGVuZENlbnRlclkgKyBNYXRoLnJvdW5kKGVuZEhhbGZIZWlnaHQgKiBNYXRoLnNpZ251bSh5RGVsdGEpKTsKLQkJfQotCQkKLQkJIGlmIChlbmRIb3Jpem9udGFsKSB7Ci0JCQkgU0hJRlQgPSAoeSA8IGVuZENlbnRlclkpID8gQUJTX1NISUZUIDogLUFCU19TSElGVDsKLQkJIH0gZWxzZSB7Ci0JCQkgU0hJRlQgPSAoeCA8IGVuZENlbnRlclgpID8gQUJTX1NISUZUIDogLUFCU19TSElGVDsKLQkJIH0KLQkJUG9pbnQgZW5kUG9pbnQgPSBuZXcgUG9pbnQoeCArIChlbmRIb3Jpem9udGFsID8gMCA6IChjbnQgKiBTSElGVCkpLCB5ICsgKGVuZEhvcml6b250YWwgPyAoY250ICogU0hJRlQpIDogMCkpOwotCi0JCWlmICghc3RyYWlnaHQpIHsKLQkJCWlmIChzdGFydEhvcml6b250YWwgJiYgZW5kSG9yaXpvbnRhbCkgewotCQkJCWlmIChzdGFydFBvaW50LnkgIT0gZW5kUG9pbnQueSkgewotCQkJCQl4ID0gc3RhcnRQb2ludC54ICsgTWF0aC5yb3VuZCgoZW5kUG9pbnQueCAtIHN0YXJ0UG9pbnQueCkgLyAyLjBmKSArIGNudCAqIEFCU19TSElGVDsgCi0JCQkJCVBvaW50IHAgPSBuZXcgUG9pbnQoeCwgc3RhcnRQb2ludC55KTsKLQkJCQkJcmVzLmFkZChwKTsKLQkJCQkJcCA9IG5ldyBQb2ludCh4LCBlbmRQb2ludC55KTsKLQkJCQkJcmVzLmFkZChwKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKCFzdGFydEhvcml6b250YWwgJiYgIWVuZEhvcml6b250YWwpIHsKLQkJCQlpZiAoc3RhcnRQb2ludC54ICE9IGVuZFBvaW50LngpIHsKLQkJCQkJeSA9IHN0YXJ0UG9pbnQueSArIE1hdGgucm91bmQoKGVuZFBvaW50LnkgLSBzdGFydFBvaW50LnkpIC8gMi4wZikgKyBjbnQgKiBBQlNfU0hJRlQgLyoqIChpbnQpTWF0aC5zaWdudW0oeURlbHRhKSovOyAKLQkJCQkJUG9pbnQgcCA9IG5ldyBQb2ludChzdGFydFBvaW50LngsIHkpOwotCQkJCQlyZXMuYWRkKHApOwotCQkJCQlwID0gbmV3IFBvaW50KGVuZFBvaW50LngsIHkpOwotCQkJCQlyZXMuYWRkKHApOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoc3RhcnRIb3Jpem9udGFsKSB7Ci0JCQkJUG9pbnQgcCA9IG5ldyBQb2ludChlbmRQb2ludC54LCBzdGFydFBvaW50LnkpOwotCQkJCXJlcy5hZGQocCk7Ci0JCQl9IGVsc2UgaWYgKGVuZEhvcml6b250YWwpIHsKLQkJCQlQb2ludCBwID0gbmV3IFBvaW50KHN0YXJ0UG9pbnQueCwgZW5kUG9pbnQueSk7Ci0JCQkJcmVzLmFkZChwKTsJCQkKLQkJCX0KLQkJfQotCi0JCXJlcy5hZGQoZW5kUG9pbnQpOwkJCQkKLQkJcmV0dXJuIHJlczsKLQl9Ci0JCQotCXN0YXRpYyBwdWJsaWMgdm9pZCByZWFycmFuZ2VBbGxDb25uZWN0aW9ucyhmaW5hbCBDb250YWluZXJTaGFwZSBjcywgCi0JCQkJCQkJCQkJCSAgIGZpbmFsIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIAotCQkJCQkJCQkJCQkgICBmaW5hbCBib29sZWFuIHNlbGZPbmx5KSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGNzKTsKLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlMaXN0PEFuY2hvcj4gYW5jaG9yc0Zyb20gPSBnZXRBbmNob3JzKGNzKTsKLQkJCQlmb3IgKEFuY2hvciBhbmNob3JGcm9tIDogYW5jaG9yc0Zyb20pIHsKLQkJCQkJQ29sbGVjdGlvbjxDb25uZWN0aW9uPiBvdXRnb2luZ0Nvbm5lY3Rpb25zID0gYW5jaG9yRnJvbS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCk7Ci0JCQkJCUNvbGxlY3Rpb248Q29ubmVjdGlvbj4gaW5jb21pbmdDb25uZWN0aW9ucyA9IGFuY2hvckZyb20uZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpOwotCQkJCQkKLQkJCQkJU2V0PFNldDxDb25uZWN0aW9uPj4gc2V0cyA9IG5ldyBIYXNoU2V0PFNldDxDb25uZWN0aW9uPj4oKTsKLQkJCQkJSXRlcmF0b3I8Q29ubmVjdGlvbj4gaXQgPSBvdXRnb2luZ0Nvbm5lY3Rpb25zLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIAotCQkJCQkJYWRkQ29ubmVjdGlvbihzZXRzLCBpdC5uZXh0KCksIHNlbGZPbmx5KTsKLQkJCQkJaXQgPSBpbmNvbWluZ0Nvbm5lY3Rpb25zLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIAotCQkJCQkJYWRkQ29ubmVjdGlvbihzZXRzLCBpdC5uZXh0KCksIHNlbGZPbmx5KTsKLQkJCQkJCi0JCQkJCUl0ZXJhdG9yPFNldDxDb25uZWN0aW9uPj4gc2V0c0l0ZXIgPSBzZXRzLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChzZXRzSXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCVNldDxDb25uZWN0aW9uPiBzZXQgPSBzZXRzSXRlci5uZXh0KCk7Ci0JCQkJCQlpbnQgY250ID0gMDsKLQkJCQkJCWludCBzZXRTaXplID0gc2V0LnNpemUoKTsKLQkJCQkJCUl0ZXJhdG9yPENvbm5lY3Rpb24+IGNJdGVyID0gc2V0Lml0ZXJhdG9yKCk7Ci0JCQkJCQl3aGlsZSAoY0l0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJQ29ubmVjdGlvbiBjID0gY0l0ZXIubmV4dCgpOwotCQkJCQkJCU9iamVjdCBvID0gZnAuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGMpOwotCQkJCQkJCWlmICghKG8gaW5zdGFuY2VvZiBJUmVsYXRpb24pKQotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQlJUmVsYXRpb24gcmVsID0gKElSZWxhdGlvbilvOyAKLQkJCQkJCQlyZWFycmFuZ2VDb25uZWN0aW9uKGMsIGNudCwgc2V0U2l6ZSwgIHJlbC5nZXRPd25lcigpID09IHJlbC5nZXRJbnZlcnNlKCkpOwotCQkJCQkJCWNudCsrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQkJCQotCQl9KTsgIAotCX0KLQkKLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gYXJlQ29ubmVjdGlvbnNXaXRoSWRlbnRpY2FsRW5kcyhDb25uZWN0aW9uIGMxLCBDb25uZWN0aW9uIGMyKSB7Ci0JCXJldHVybiAoKGMxLmdldFN0YXJ0KCkgPT0gYzIuZ2V0U3RhcnQoKSkgJiYgKGMxLmdldEVuZCgpID09IGMyLmdldEVuZCgpKSkgfHwKLQkJCSAgICgoYzEuZ2V0U3RhcnQoKSA9PSBjMi5nZXRFbmQoKSkgJiYgKGMxLmdldEVuZCgpID09IGMyLmdldFN0YXJ0KCkpKTsKLQl9Ci0JCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGNvbm5lY3Rpb25CZWxvbmdzVG9TZXQoQ29ubmVjdGlvbiBjLCBTZXQ8Q29ubmVjdGlvbj4gcykgewotCQlpZiAocy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNvbm5lY3Rpb24gZXhhbXBsZSA9IHMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJldHVybiBhcmVDb25uZWN0aW9uc1dpdGhJZGVudGljYWxFbmRzKGMsIGV4YW1wbGUpOwotCX0KLQkKLQlzdGF0aWMgcHVibGljIGludCBnZXROdW1iZXJPZkNvbm5lY3Rpb25zV2l0aFNhbWVFbmRzQXMoQ29ubmVjdGlvbiBjKSB7Ci0JCUFuY2hvciBmcm9tID0gYy5nZXRTdGFydCgpOwotCQlBbmNob3IgdG8gPSBjLmdldEVuZCgpOwotCQlDb2xsZWN0aW9uPENvbm5lY3Rpb24+IGNzMSA9IGZyb20uZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpOwotCQlDb2xsZWN0aW9uPENvbm5lY3Rpb24+IGNzMiA9IHRvLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLQkJaW50IGNudCA9IDA7Ci0JCUl0ZXJhdG9yPENvbm5lY3Rpb24+IGl0ID0gY3MxLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUNvbm5lY3Rpb24gY29uID0gaXQubmV4dCgpOwotCQkJaWYgKGNvbi5nZXRFbmQoKSA9PSB0bykKLQkJCQljbnQrKzsKLQkJfQotCQlpZiAoZnJvbSA9PSB0bykKLQkJCXJldHVybiBjbnQ7Ci0JCWl0ID0gY3MyLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUNvbm5lY3Rpb24gY29uID0gaXQubmV4dCgpOwotCQkJaWYgKGNvbi5nZXRFbmQoKSA9PSBmcm9tKQotCQkJCWNudCsrOwotCQkJfQotCQlyZXR1cm4gY250OwotCX0KLQkKLQlzdGF0aWMgdm9pZCBhZGRDb25uZWN0aW9uKFNldDxTZXQ8Q29ubmVjdGlvbj4+IHNldHMsIENvbm5lY3Rpb24gYywgYm9vbGVhbiBzZWxmT25seSkgewotCQlpZiAoc2V0cyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCInc2V0cycgcGFyYW1ldGVyIHNob3VsZCBub3QgYmUgbnVsbCIpOwkvLyROT04tTkxTLTEkCi0JCWlmIChzZWxmT25seSAmJiAoYy5nZXRTdGFydCgpICE9IGMuZ2V0RW5kKCkpKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvcjxTZXQ8Q29ubmVjdGlvbj4+IHNldHNJdGVyID0gc2V0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoc2V0c0l0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlTZXQ8Q29ubmVjdGlvbj4gc2V0ID0gc2V0c0l0ZXIubmV4dCgpOwotCQkJaWYgKGNvbm5lY3Rpb25CZWxvbmdzVG9TZXQoYywgc2V0KSkgewotCQkJCXNldHMucmVtb3ZlKHNldCk7Ci0JCQkJc2V0LmFkZChjKTsKLQkJCQlzZXRzLmFkZChzZXQpOwotCQkJCXJldHVybjsKLQkJfQotCX0KLQkJU2V0PENvbm5lY3Rpb24+IG5ld1NldCA9IG5ldyBIYXNoU2V0PENvbm5lY3Rpb24+KCk7Ci0JCW5ld1NldC5hZGQoYyk7Ci0JCXNldHMuYWRkKG5ld1NldCk7Ci0JfQotCQotCXN0YXRpYyBwdWJsaWMgdm9pZCByZWFycmFuZ2VDb25uZWN0aW9uKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgaW50IGNudCwgaW50IGNvbm5lY3Rpb25zTnVtLCBib29sZWFuIHNlbGZSZWxhdGlvbikgewotCQlGcmVlRm9ybUNvbm5lY3Rpb24gYyA9IChGcmVlRm9ybUNvbm5lY3Rpb24pY29ubmVjdGlvbjsKLQkJcmVhcnJhbmdlQ29ubmVjdGlvbkJlbmRQb2ludHMoYywgY250LCBjb25uZWN0aW9uc051bSwgc2VsZlJlbGF0aW9uKTsKLQkJcmVhcnJhbmdlQ29ubmVjdGlvbkRlY29yYXRvcnNMb2NhdGlvbihjLCAgY250LCBjb25uZWN0aW9uc051bSk7CQkJCQkJCQkJCQotCX0KLQkKLQlzdGF0aWMgcHVibGljIHZvaWQgcmVhcnJhbmdlQ29ubmVjdGlvbkJlbmRQb2ludHMoRnJlZUZvcm1Db25uZWN0aW9uIGMsIGludCBjbnQsIGludCBjb25uZWN0aW9uc051bSwgYm9vbGVhbiBzZWxmUmVsYXRpb24pIHsKLQkJTGlzdDxvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5Qb2ludD4gb2xkUHRzID0gYy5nZXRCZW5kcG9pbnRzKCk7Ci0JCUxpc3Q8b3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50PiBuZXdQdHMgPSBKUEFFZGl0b3JVdGlsLmNyZWF0ZUJlbmRQb2ludExpc3QoYywgY250LCBjb25uZWN0aW9uc051bSwgIHNlbGZSZWxhdGlvbik7Ci0JCWlmIChuZXdQdHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCQotCQlmb3IgKGludCBpID0gMDsgaSA8IE1hdGgubWluKG9sZFB0cy5zaXplKCksIG5ld1B0cy5zaXplKCkpOyBpKyspIHsKLQkJCW9sZFB0cy5zZXQoaSwgR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlUG9pbnQoLypjLCAqL25ld1B0cy5nZXQoaSkueCwgbmV3UHRzLmdldChpKS55KSk7Ci0JCX0KLQkJaW50IGRpZmYgPSBvbGRQdHMuc2l6ZSgpIC0gbmV3UHRzLnNpemUoKTsKLQkJaWYgKGRpZmYgPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gb2xkUHRzLnNpemUoKSAtIDE7IGkgPj0gbmV3UHRzLnNpemUoKTsgaS0tKSAKLQkJCQlvbGRQdHMucmVtb3ZlKGkpOwotCQl9IGVsc2UgaWYgKGRpZmYgPCAwKSB7Ci0JCQlmb3IgKGludCBpID0gb2xkUHRzLnNpemUoKTsgaSA8IG5ld1B0cy5zaXplKCk7IGkrKykgCi0JCQkJb2xkUHRzLmFkZChHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVQb2ludCgvKmMsICovbmV3UHRzLmdldChpKS54LCBuZXdQdHMuZ2V0KGkpLnkpKTsKLQkJfQotCX0KLQkKLQlzdGF0aWMgcHVibGljIHZvaWQgcmVhcnJhbmdlQ29ubmVjdGlvbkRlY29yYXRvcnNMb2NhdGlvbihGcmVlRm9ybUNvbm5lY3Rpb24gYywgIGludCBjbnQsIGludCBjb25uZWN0aW9uc051bSkgewotCQlDb2xsZWN0aW9uPENvbm5lY3Rpb25EZWNvcmF0b3I+IGRjcnMgPSBjLmdldENvbm5lY3Rpb25EZWNvcmF0b3JzKCk7Ci0JCQkJaW50IGxlbiA9IEpQQUVkaXRvclV0aWwuY2FsY0Nvbm5lY3Rpb25MZW5ndGgoYyk7Ci0JCQkJZm9yIChDb25uZWN0aW9uRGVjb3JhdG9yIGRjciA6IGRjcnMpIHsKLQkJCQkJR3JhcGhpY3NBbGdvcml0aG0gZ2EgPSBkY3IuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJCQkJaWYgKGdhIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCQkJaWYgKE1hdGguYWJzKGRjci5nZXRMb2NhdGlvbigpIC0gMC41KSA8IDAuMDAwMSkgCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQlQb2ludCBwdCA9IHJlY2FsY1RleHREZWNvcmF0b3JQb3NpdGlvbihjLCBkY3IpOwotCQkJCQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb24oZ2EsIHB0LngsIHB0LnksIGZhbHNlKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWlmIChkY3IuZ2V0TG9jYXRpb24oKSA8IDAuNSkgewotCQkJCQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb24oZGNyLmdldEdyYXBoaWNzQWxnb3JpdGhtKCksIAotCQkJCQkJCQlNYXRoLnJvdW5kKGxlbiAvMTApICwgMCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbihkY3IuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSwgCi0JCQkJCQkJCU1hdGgucm91bmQoLWxlbiAvMTApICwgMCk7Ci0JCQkJCX0KLQkJCQl9Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgUG9pbnQgcmVjYWxjVGV4dERlY29yYXRvclBvc2l0aW9uKEZyZWVGb3JtQ29ubmVjdGlvbiBjLCAKLQkJCQkJCQkJCQkJIENvbm5lY3Rpb25EZWNvcmF0b3IgZGNyKSB7Ci0JCWludCBDT1JSID0gNTsKLQkJaW50IFRYVF9IRUlHSFQgPSA4OwotCQlkb3VibGUgbG9jYXRpb24gPSBkY3IuZ2V0TG9jYXRpb24oKTsKLQkJUmVsRW5kRGlyIHJlbEVuZERpciA9IChsb2NhdGlvbiA8IDAuNSkgPyAKLQkJCQlKUEFFZGl0b3JVdGlsLmdldENvbm5lY3Rpb25TdGFydERpcihjKSA6Ci0JCQkJCUpQQUVkaXRvclV0aWwuZ2V0Q29ubmVjdGlvbkVuZERpcihjKTsKLQkJVGV4dCB0eHQgPSAoVGV4dClkY3IuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJaW50IFRYVF9XSURUSCA9IHR4dC5nZXRWYWx1ZSgpLmxlbmd0aCgpICogNjsKLQkJYm9vbGVhbiBpc0NhcmRpbmFsaXR5ID0gSlBBRWRpdG9yQ29uc3RhbnRzLkNBUkRJTkFMSVRZX0xBQkVMUy5jb250YWlucyh0eHQuZ2V0VmFsdWUoKSk7IAotCQlpbnQgeCA9IDA7Ci0JCWludCB5ID0gMDsKLQkJaWYgKHJlbEVuZERpci5lcXVhbHMoUmVsRW5kRGlyLkxFRlQpKSB7Ci0JCQl4ID0gQ09SUiArIChpc0NhcmRpbmFsaXR5ID8gMiA6IDEyKTsKLQkJCXkgPSBpc0NhcmRpbmFsaXR5ID8gKC1DT1JSIC0gMyAtIFRYVF9IRUlHSFQpIDogQ09SUiAtIDM7Ci0JCX0gZWxzZSBpZiAocmVsRW5kRGlyLmVxdWFscyhSZWxFbmREaXIuUklHSFQpKSB7Ci0JCQl4ID0gLSBUWFRfV0lEVEg7Ci0JCQl5ID0gaXNDYXJkaW5hbGl0eSA/ICgtQ09SUiAtIDMgLSBUWFRfSEVJR0hUKSA6IENPUlIgLSAzOwotCQl9IGVsc2UgaWYgKHJlbEVuZERpci5lcXVhbHMoUmVsRW5kRGlyLlVQKSkgewotCQkJeCA9IGlzQ2FyZGluYWxpdHkgPyAoLUNPUlIgLSBUWFRfV0lEVEgpIDogQ09SUjsKLQkJCXkgPSBpc0NhcmRpbmFsaXR5ID8gQ09SUiA6IENPUlIgKyBUWFRfSEVJR0hUICsgMjsKLQkJfSBlbHNlIGlmIChyZWxFbmREaXIuZXF1YWxzKFJlbEVuZERpci5ET1dOKSkgewotCQkJeCA9IGlzQ2FyZGluYWxpdHkgPyAoLUNPUlIgLSBUWFRfV0lEVEgpIDogQ09SUjsKLQkJCXkgPSAtQ09SUiAtIChpc0NhcmRpbmFsaXR5ID8gVFhUX0hFSUdIVCA6IChUWFRfSEVJR0hUICsgMikgKiAyKTsKLQkJfQotCQlyZXR1cm4gbmV3IFBvaW50KHgsIHkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtVGFibGVOYW1lKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsgCi0JCUlQcm9qZWN0IHByb2plY3QgPSBqcHQuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJUHJvcGVydGllcyBwcm9wcyA9IEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UubG9hZFByb3BlcnRpZXMocHJvamVjdCk7Ci0JICAgIFN0cmluZyB0YWJsZU5hbWVQcmVmaXggPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmdldERlZmF1bHRUYWJsZVByZWZpeE5hbWUocHJvamVjdCwgcHJvcHMpOwotCSAgICBTdHJpbmcgc2hvcnRFbnRpdHlOYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUoanB0KSk7IAotCSAgICBpZiAodGFibGVOYW1lUHJlZml4Lmxlbmd0aCgpID09IDApCi0JICAgIAlyZXR1cm4gc2hvcnRFbnRpdHlOYW1lOwotCQlyZXR1cm4gdGFibGVOYW1lUHJlZml4ICsgc2hvcnRFbnRpdHlOYW1lLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKLQl9Ci0JCi0Jc3RhdGljIHByaXZhdGUgTGlzdDxBbmNob3I+IGdldEFuY2hvcnMoQ29udGFpbmVyU2hhcGUgY29udGFpbmVyU2hhcGUpIHsKLQkJTGlzdDxBbmNob3I+IHJldCA9IG5ldyBBcnJheUxpc3Q8QW5jaG9yPigpOwotCQlyZXQuYWRkQWxsKGNvbnRhaW5lclNoYXBlLmdldEFuY2hvcnMoKSk7Ci0KLQkJTGlzdDxTaGFwZT4gY2hpbGRyZW4gPSBjb250YWluZXJTaGFwZS5nZXRDaGlsZHJlbigpOwotCQlmb3IgKFNoYXBlIHNoYXBlIDogY2hpbGRyZW4pIHsKLQkJCWlmIChzaGFwZSBpbnN0YW5jZW9mIENvbnRhaW5lclNoYXBlKSB7Ci0JCQkJcmV0LmFkZEFsbChnZXRBbmNob3JzKChDb250YWluZXJTaGFwZSkgc2hhcGUpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0LmFkZEFsbChzaGFwZS5nZXRBbmNob3JzKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQkKLQkKLQlzdGF0aWMgcHVibGljIFJlbEVuZERpciBnZXRDb25uZWN0aW9uU3RhcnREaXIoRnJlZUZvcm1Db25uZWN0aW9uIGMpIHsKLQkJRUxpc3Q8b3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5zdHlsZXMuUG9pbnQ+IHB0cyA9IGMuZ2V0QmVuZHBvaW50cygpOwotCQlyZXR1cm4gZ2V0Q29ubmVjdGlvbkVuZERpcihwdHMuZ2V0KDApLCBwdHMuZ2V0KDEpKTsKLQl9Ci0JCi0Jc3RhdGljIHB1YmxpYyBSZWxFbmREaXIgZ2V0Q29ubmVjdGlvbkVuZERpcihGcmVlRm9ybUNvbm5lY3Rpb24gYykgewotCQlMaXN0PG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuc3R5bGVzLlBvaW50PiBwdHMgPSBjLmdldEJlbmRwb2ludHMoKTsKLQkJcmV0dXJuIGdldENvbm5lY3Rpb25FbmREaXIocHRzLmdldChwdHMuc2l6ZSgpIC0gMSksIHB0cy5nZXQocHRzLnNpemUoKSAtIDIpKTsKLQl9CQotCQotCXN0YXRpYyBwcml2YXRlIFJlbEVuZERpciBnZXRDb25uZWN0aW9uRW5kRGlyKG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuc3R5bGVzLlBvaW50IHB0RW5kLAotCQkJb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5zdHlsZXMuUG9pbnQgcHROZXh0VG9FbmQpIHsKLQkJaWYgKHB0RW5kLmdldFgoKSA9PSBwdE5leHRUb0VuZC5nZXRYKCkpIHsKLQkJCXJldHVybiAocHROZXh0VG9FbmQuZ2V0WSgpID4gcHRFbmQuZ2V0WSgpKSA/IFJlbEVuZERpci5VUCA6IFJlbEVuZERpci5ET1dOOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIChwdE5leHRUb0VuZC5nZXRYKCkgPiBwdEVuZC5nZXRYKCkpID8gUmVsRW5kRGlyLkxFRlQgOiBSZWxFbmREaXIuUklHSFQ7Ci0JCX0JCQotCX0KLQkKLQlzdGF0aWMgcHVibGljIHZvaWQgb3JnYW5pemVJbXBvcnRzKElDb21waWxhdGlvblVuaXQgY3UsIElXb3JrYmVuY2hTaXRlIHdzKSB7Ci0JCU9yZ2FuaXplSW1wb3J0c0FjdGlvbiBhY3Rpb24gPSBuZXcgT3JnYW5pemVJbXBvcnRzQWN0aW9uKHdzKTsKLQkJYWN0aW9uLnJ1bihjdSk7Ci0JfQotCQotCXN0YXRpYyBwdWJsaWMgdm9pZCBmb3JtYXRDb2RlKElDb21waWxhdGlvblVuaXQgY3UsIElXb3JrYmVuY2hTaXRlIHdzKSB7Ci0JCUZvcm1hdEFsbEFjdGlvbiBhY3Rpb24gPSBuZXcgRm9ybWF0QWxsQWN0aW9uKHdzKTsKLQkJYWN0aW9uLnJ1bihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjdSkpOwotCX0KLQkKLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZW5lcmF0ZVVuaXF1ZUVudGl0eU5hbWUoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCAKLQkJCQkJCQkJCQkJCSAgU3RyaW5nIHBhY2ssIAotCQkJCQkJCQkJCQkJICBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0gICAgCVN0cmluZyBOQU1FID0gcGFjayArICIuRW50aXR5IjsgLy8kTk9OLU5MUy0xJAotICAgIAlTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgCQotICAgIAlIYXNoU2V0PFN0cmluZz4gSlBBUHJvamVjdEVudGl0eU5hbWVzID0gZ2V0RW50aXR5TmFtZXMoanBhUHJvamVjdCk7Ci0gICAgICAgCUhhc2hTZXQ8U3RyaW5nPiBKUEFQcm9qZWN0RW50aXR5U2ltcGxlTmFtZXMgPSBnZXRFbnRpdHlTaW1wbGVOYW1lcyhqcGFQcm9qZWN0KTsKLSAgICAgICAJCi0gICAgCWZvciAoaW50IGkgPSAxOyBpIDwgMTAwMDAwMDAwOyBpKyspIHsKLSAgICAJCW5hbWUgPSBOQU1FICsgaTsKLSAgICAJCWlmICgoIWZwLmhhc09iamVjdFdpdGhOYW1lKG5hbWUpKSAmJgotICAgIAkJCQkhSlBBUHJvamVjdEVudGl0eU5hbWVzLmNvbnRhaW5zKG5hbWUudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpKSAmJiAKLSAgICAJCQkJIUpQQVByb2plY3RFbnRpdHlTaW1wbGVOYW1lcy5jb250YWlucyhKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUobmFtZSkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpKSAmJgotICAgIAkJCQkhaXNKYXZhRmlsZUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmFtZSwgcGFjaykpIAotICAgIAkJCWJyZWFrOwotICAgIAl9Ci0gICAgCXJldHVybiBuYW1lOwotICAgIH0KLQkKLQkKLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZW5lcmF0ZVVuaXF1ZU1hcHBlZFN1cGVyY2xhc3NOYW1lKAotCQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBTdHJpbmcgcGFjaywgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQlTdHJpbmcgTkFNRSA9IHBhY2sgKyAiLk1wZFN1cHJjbHMiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQotCQlIYXNoU2V0PFN0cmluZz4gSlBBUHJvamVjdEVudGl0eU5hbWVzID0gZ2V0RW50aXR5TmFtZXMoanBhUHJvamVjdCk7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBKUEFQcm9qZWN0RW50aXR5U2ltcGxlTmFtZXMgPSBnZXRFbnRpdHlTaW1wbGVOYW1lcyhqcGFQcm9qZWN0KTsKLQotCQlmb3IgKGludCBpID0gMTsgaSA8IDEwMDAwMDAwMDsgaSsrKSB7Ci0JCQluYW1lID0gTkFNRSArIGk7Ci0JCQlpZiAoKCFmcC5oYXNPYmplY3RXaXRoTmFtZShuYW1lKSkgJiYgIUpQQVByb2plY3RFbnRpdHlOYW1lcy5jb250YWlucyhuYW1lCi0JCQkJCS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkpICYmICFKUEFQcm9qZWN0RW50aXR5U2ltcGxlTmFtZXMuY29udGFpbnMoSlBBRWRpdG9yVXRpbAotCQkJCQkucmV0dXJuU2ltcGxlTmFtZShuYW1lKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkpCi0JCQkJCSYmICFpc0phdmFGaWxlSW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuYW1lLCBwYWNrKSkKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCQkJCi0Jc3RhdGljIHB1YmxpYyBJRmlsZSBjcmVhdGVFbnRpdHlJblByb2plY3QoSVByb2plY3QgcHJvamVjdCwKLQkJCQkJCQkJCQkJICBTdHJpbmcgZW50aXR5TmFtZSwKLQkJCQkJCQkJCQkJICBKYXZhUGVyc2lzdGVudFR5cGUgbWFwcGVkU3VwZXJjbGFzcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlGb2xkZXIgZm9sZGVyID0gZ2V0UGFja2FnZUZvbGRlcihwcm9qZWN0KTsKLQkJcmV0dXJuIGNyZWF0ZUVudGl0eShwcm9qZWN0LCBmb2xkZXIsIGVudGl0eU5hbWUsCi0JCQkJdHJ1ZSwgbWFwcGVkU3VwZXJjbGFzcy5nZXROYW1lKCksCi0JCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc1BhY2thZ2VEZWNsYXJhdGlvbihtYXBwZWRTdXBlcmNsYXNzKSwgCi0JCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2VuZXJhdGVJZE5hbWUobWFwcGVkU3VwZXJjbGFzcyksIAotCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmhhc09ySW5oZXJpdHNQcmltYXJ5S2V5KG1hcHBlZFN1cGVyY2xhc3MpKTsKLQl9Ci0JCi0Jc3RhdGljIHB1YmxpYyBJRmlsZSBjcmVhdGVFbnRpdHlJblByb2plY3QoSVByb2plY3QgcHJvamVjdCwKLQkJCVN0cmluZyBlbnRpdHlOYW1lLCBJUHJlZmVyZW5jZVN0b3JlIGpwYVByZWZlcmVuY2VTdG9yZSwKLQkJCWJvb2xlYW4gaXNNYXBwZWRTdXBlcmNsYXNzQ2hpbGQsIFN0cmluZyBtYXBwZWRTdXBlcmNsYXNzTmFtZSwKLQkJCVN0cmluZyBtYXBwZWRTdXBlcmNsYXNzUGFja2FnZSwgU3RyaW5nIGlkTmFtZSwgYm9vbGVhbiBoYXNQcmltYXJ5S2V5KQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlGb2xkZXIgZm9sZGVyID0gZ2V0UGFja2FnZUZvbGRlcihwcm9qZWN0KTsKLQkJcmV0dXJuIGNyZWF0ZUVudGl0eShwcm9qZWN0LCBmb2xkZXIsIGVudGl0eU5hbWUsCi0JCQkJaXNNYXBwZWRTdXBlcmNsYXNzQ2hpbGQsIG1hcHBlZFN1cGVyY2xhc3NOYW1lLAotCQkJCW1hcHBlZFN1cGVyY2xhc3NQYWNrYWdlLCBpZE5hbWUsIGhhc1ByaW1hcnlLZXkpOwotCX0KLQotCQkJCQotCXN0YXRpYyBwdWJsaWMgSUZpbGUgY3JlYXRlRW50aXR5RnJvbU1hcHBlZFN1cGVyY2xhc3NJblByb2plY3QoCi0JCQlJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc05hbWUsCi0JCQlJUHJlZmVyZW5jZVN0b3JlIGpwYVByZWZlcmVuY2VTdG9yZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlGb2xkZXIgZm9sZGVyID0gZ2V0UGFja2FnZUZvbGRlcihwcm9qZWN0KTsKLQkJcmV0dXJuIGNyZWF0ZU1hcHBlZFN1cGVyY2xhc3NJblByb2plY3QocHJvamVjdCwgZm9sZGVyLCBtYXBwZWRTdXBlcmNsYXNzTmFtZSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLQkJcHJpdmF0ZSBzdGF0aWMgSUZvbGRlciBnZXRQYWNrYWdlRm9sZGVyKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7CQkKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBwYWNrYWdlRnJhZ21lbnRSb290cyA9IG5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFswXTsKLQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoRW50cmllcyA9ICBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsJCQotCQlmb3IgKElDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeSA6IGNsYXNzcGF0aEVudHJpZXMpIHsKLQkJCWlmIChjbGFzc3BhdGhFbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJCXBhY2thZ2VGcmFnbWVudFJvb3RzID0gamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoY2xhc3NwYXRoRW50cnkpOwotCQkJCWJyZWFrOwotCQkJfSAgCQkJCi0JCX0KLQotCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gcGFja2FnZUZyYWdtZW50Um9vdHNbMF07Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmxvYWRQcm9wZXJ0aWVzKHByb2plY3QpOwotCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuZ2V0RGVmYXVsdFBhY2thZ2UocHJvamVjdCwgcHJvcHMpKTsKLQkJaWYocGFja2FnZUZyYWdtZW50LmV4aXN0cygpID09IGZhbHNlKSB7Ci0JCQlwYWNrYWdlRnJhZ21lbnQgPSBwYWNrYWdlRnJhZ21lbnRSb290LmNyZWF0ZVBhY2thZ2VGcmFnbWVudChKUEFEaWFncmFtUHJvcGVydHlQYWdlLmdldERlZmF1bHRQYWNrYWdlKHByb2plY3QsIHByb3BzKSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQkJSUZvbGRlciBmb2xkZXIgPSAoSUZvbGRlcikgcGFja2FnZUZyYWdtZW50LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCQlyZXR1cm4gZm9sZGVyOwotCi0JfQotCQotCXN0YXRpYyBwdWJsaWMgSUZpbGUgY3JlYXRlTWFwcGVkU3VwZXJjbGFzc0luUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LAotCQkJU3RyaW5nIG1hcHBlZFN1cGVyY2xhc3NOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZvbGRlciBmb2xkZXIgPSBnZXRQYWNrYWdlRm9sZGVyKHByb2plY3QpOwotCQlyZXR1cm4gY3JlYXRlTWFwcGVkU3VwZXJjbGFzc0luUHJvamVjdChwcm9qZWN0LCBmb2xkZXIsIG1hcHBlZFN1cGVyY2xhc3NOYW1lKTsKLQl9Ci0JCi0Jc3RhdGljIHB1YmxpYyBJRmlsZSBjcmVhdGVNYXBwZWRTdXBlcmNsYXNzSW5Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QsCi0JCQlJRm9sZGVyIGZvbGRlciwgU3RyaW5nIG1hcHBlZFN1cGVyY2xhc3NOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc1Nob3J0TmFtZSA9IG1hcHBlZFN1cGVyY2xhc3NOYW1lCi0JCQkJLnN1YnN0cmluZyhtYXBwZWRTdXBlcmNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZShtYXBwZWRTdXBlcmNsYXNzU2hvcnROYW1lICsgIi5qYXZhIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCVN0cmluZyBjb250ZW50ID0gInBhY2thZ2UgIiArIEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuZ2V0RGVmYXVsdFBhY2thZ2UocHJvamVjdCkgKyAiO1xuXG4iIC8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAotCQkJCQkrICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjtcblxuIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgIkBNYXBwZWRTdXBlcmNsYXNzIFxuIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgInB1YmxpYyBjbGFzcyAiICsgbWFwcGVkU3VwZXJjbGFzc1Nob3J0TmFtZSArICIge1xuXG4iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkrICJ9IjsgLy8kTk9OLU5MUy0xJAotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCXRyeSB7Ci0JCQkJc3RyZWFtLndyaXRlKGNvbnRlbnQuZ2V0Qnl0ZXMoKSk7Ci0JCQkJc3RyZWFtLmZsdXNoKCk7Ci0JCQkJZmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHN0cmVhbS50b0J5dGVBcnJheSgpKSwKLQkJCQkJCXRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGlzSmF2YUZpbGVJblByb2plY3QoSVByb2plY3QgcHJvamVjdCwgCi0JCQkJCQkJCQkJCSAgU3RyaW5nIGVudGl0eU5hbWUsCi0JCQkJCQkJCQkJCSAgU3RyaW5nIGRlZmF1bHRFbnRpdHlQYWNha2FnZSkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7CQkKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBwYWNrYWdlRnJhZ21lbnRSb290cyA9IG5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFswXTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoRW50cmllcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljbGFzc3BhdGhFbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3Qgb2J0YWluIHRoZSBjbGFzc3BhdGgiLCBlKTsgLy8kTk9OLU5MUy0xJAkKLQkJCXJldHVybiBmYWxzZTsKLQkJfQkJCi0JCWZvciAoSUNsYXNzcGF0aEVudHJ5IGNsYXNzcGF0aEVudHJ5IDogY2xhc3NwYXRoRW50cmllcykgewotCQkJaWYgKGNsYXNzcGF0aEVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQkJcGFja2FnZUZyYWdtZW50Um9vdHMgPSBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cyhjbGFzc3BhdGhFbnRyeSk7Ci0JCQkJYnJlYWs7Ci0JCQl9ICAJCQkKLQkJfQotCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgPSBwYWNrYWdlRnJhZ21lbnRSb290c1swXTsKLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSBwYWNrYWdlRnJhZ21lbnRSb290LmdldFBhY2thZ2VGcmFnbWVudChKUEFEaWFncmFtUHJvcGVydHlQYWdlLmdldERlZmF1bHRQYWNrYWdlKHByb2plY3QpKTsKLQkJaWYoIXBhY2thZ2VGcmFnbWVudC5leGlzdHMoKSkgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlGb2xkZXIgZm9sZGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZvbGRlciA9IChJRm9sZGVyKSBwYWNrYWdlRnJhZ21lbnQuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3Qgb2J0YWluIHRoZSBmb2xkZXIiLCBlKTsgLy8kTk9OLU5MUy0xJAkKLQkJCXJldHVybiBmYWxzZTsKLQkJfQkKLQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIAotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgZW50aXR5U2hvcnROYW1lID0gZW50aXR5TmFtZS5zdWJzdHJpbmcoZW50aXR5TmFtZQotCQkJCS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZShlbnRpdHlTaG9ydE5hbWUgKyAiLmphdmEiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZmlsZS5leGlzdHMoKTsKLQl9Ci0KLQkKLQlzdGF0aWMgcHVibGljIFN0cmluZyBwcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShKYXZhUGVyc2lzdGVudFR5cGUganB0LCAKLQkJCQkJCQkJCQkJCQlTdHJpbmcgYXR0cmlidXRlTmFtZUNhbmRpZGF0ZSkgewotCQlTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZU5hbWVDYW5kaWRhdGU7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgMTAwMDAwMDAwOyBpKyspIHsKLQkJCWlmIChqcHQuZ2V0QXR0cmlidXRlTmFtZWQobmFtZSkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbmFtZTsKLQkJCW5hbWUgPSBhdHRyaWJ1dGVOYW1lQ2FuZGlkYXRlICsgIl8iICsgaTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQlzdGF0aWMgcHVibGljIFN0cmluZyBwcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShKYXZhUGVyc2lzdGVudFR5cGUganB0LCBTdHJpbmcgZm9yYmlkZGVuTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWVDYW5kaWRhdGUpIHsKLQkJU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGVOYW1lQ2FuZGlkYXRlOwotCQlmb3IgKGludCBpID0gMTsgaSA8IDEwMDAwMDAwMDsgaSsrKSB7Ci0JCQlpZiAoKGpwdC5nZXRBdHRyaWJ1dGVOYW1lZChuYW1lKSA9PSBudWxsKSAmJiAhbmFtZS5lcXVhbHMoZm9yYmlkZGVuTmFtZSkpCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCQluYW1lID0gYXR0cmlidXRlTmFtZUNhbmRpZGF0ZSArICJfIiArIGk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbnRpdHlPcGVuRWxzZXdoZXJlKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIGJvb2xlYW4gY2hlY2tEaXJ0eSkgewotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRSZWZzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkUmVmcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclBhcnQgZWQgPSBlZFJlZnNbaV0uZ2V0RWRpdG9yKGZhbHNlKTsKLQkJCWlmIChlZCA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGNoZWNrRGlydHkgJiYgIWVkLmlzRGlydHkoKSkKLQkJCQljb250aW51ZTsKLQkJCUlFZGl0b3JJbnB1dCBlZElucCA9IGVkLmdldEVkaXRvcklucHV0KCk7Ci0JCQlpZiAoRmlsZUVkaXRvcklucHV0LmNsYXNzLmlzSW5zdGFuY2UoZWRJbnApKSB7Ci0JCQkJRmlsZUVkaXRvcklucHV0IGZlZElucHV0ID0gKEZpbGVFZGl0b3JJbnB1dCllZElucDsgCi0JCQkJaWYgKGZlZElucHV0LmdldEZpbGUoKS5lcXVhbHMoanB0LmdldFJlc291cmNlKCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7CQkKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlyZXR1cm4gZ2V0Q29tcGlsYXRpb25Vbml0KChJRmlsZSkganB0LmdldFJlc291cmNlKCkpOwotCX0JCQotCQotCXB1YmxpYyBzdGF0aWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gRWNsaXBzZUZhY2FkZS5JTlNUQU5DRS5nZXRKYXZhQ29yZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZmlsZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBiZWNvbWVXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXRyeSB7Ci0JCQljdS5iZWNvbWVXb3JraW5nQ29weShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbid0IGRpc2NhcmQgdGhlIHdvcmtpbmcgY29weSIsIGUpOyAvLyROT04tTkxTLTEkCQkKLQkJfQotCX0JCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGRpc2NhcmRXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXdoaWxlIChjdS5pc1dvcmtpbmdDb3B5KCkpCi0JCQl0cnkgewotCQkJCWN1LmRpc2NhcmRXb3JraW5nQ29weSgpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW4ndCBkaXNjYXJkIHRoZSB3b3JraW5nIGNvcHkiLCBlKTsgLy8kTk9OLU5MUy0xJAkJCi0JCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkaXNjYXJkV29ya2luZ0NvcHlPbmNlKElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJaWYgKGN1LmlzV29ya2luZ0NvcHkoKSkKLQkJCXRyeSB7Ci0JCQkJY3UuZGlzY2FyZFdvcmtpbmdDb3B5KCk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbid0IGRpc2NhcmQgdGhlIHdvcmtpbmcgY29weSIsIGUpOyAvLyROT04tTkxTLTEkCQkKLQkJCX0KLQl9Ci0JCQotCXN0YXRpYyBwcml2YXRlIElGaWxlIGNyZWF0ZUVudGl0eShJUHJvamVjdCBwcm9qZWN0LCAKLQkJCQkJCQkJCSAgSUZvbGRlciBmb2xkZXIsIAotCQkJCQkJCQkJICBTdHJpbmcgZW50aXR5TmFtZSwgCi0JCQkJCQkJCQkgIGJvb2xlYW4gaXNNYXBwZWRTdXBlcmNsYXNzQ2hpbGQsIAotCQkJCQkJCQkJICBTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc05hbWUsIAotCQkJCQkJCQkJICBTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc1BhY2thZ2UsIAotCQkJCQkJCQkJICBTdHJpbmcgaWROYW1lLAotCQkJCQkJCQkJICBib29sZWFuIGhhc1ByaW1hcnlLZXkpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJU3RyaW5nIGVudGl0eVNob3J0TmFtZSA9IGVudGl0eU5hbWUuc3Vic3RyaW5nKGVudGl0eU5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwkJCi0JCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwkJCQkKLQkJfQotCQlJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoZW50aXR5U2hvcnROYW1lICsgIi5qYXZhIik7CQkgLy8kTk9OLU5MUy0xJAotCQlQcm9wZXJ0aWVzIHByb3BzID0gSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5sb2FkUHJvcGVydGllcyhwcm9qZWN0KTsKLQkJU3RyaW5nIHRhYmxlTmFtZVByZWZpeCA9IEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuZ2V0RGVmYXVsdFRhYmxlUHJlZml4TmFtZShwcm9qZWN0LCBwcm9wcyk7Ci0JCVN0cmluZyB0YWJsZU5hbWUgPSAodGFibGVOYW1lUHJlZml4Lmxlbmd0aCgpID4gMCkgPyAodGFibGVOYW1lUHJlZml4ICsgZW50aXR5U2hvcnROYW1lLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKSkgOiAiIjsJLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIGZpZWxkQmFzZWRBY2Nlc3MgPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmlzQWNjZXNzRmllbGRCYXNlZChwcm9qZWN0LCBwcm9wcyk7Ci0JCQotCQlTdHJpbmcgY2xhc3NEZWNsYXJhdGlvblN0cmluZ0NvbnRlbnQgPSBudWxsOwotCQlpZiAoaXNNYXBwZWRTdXBlcmNsYXNzQ2hpbGQpIHsKLQkJCVN0cmluZyBtYXBwZWRTdXBlcmNsYXNzU2hvcnROYW1lID0gbWFwcGVkU3VwZXJjbGFzc05hbWUuc3Vic3RyaW5nKG1hcHBlZFN1cGVyY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQkJCWNsYXNzRGVjbGFyYXRpb25TdHJpbmdDb250ZW50ID0gInB1YmxpYyBjbGFzcyAiICsgZW50aXR5U2hvcnROYW1lICsgIiBleHRlbmRzICIgKyBtYXBwZWRTdXBlcmNsYXNzU2hvcnROYW1lICsgIiB7XG5cbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0gZWxzZSB7Ci0JCQljbGFzc0RlY2xhcmF0aW9uU3RyaW5nQ29udGVudCA9ICJwdWJsaWMgY2xhc3MgIiArIGVudGl0eVNob3J0TmFtZSArICIge1xuXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQl9Ci0KLQkJU3RyaW5nIHBhY2thZ2VJbXBvcnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAobWFwcGVkU3VwZXJjbGFzc1BhY2thZ2UgIT0gbnVsbAotCQkJCSYmICFtYXBwZWRTdXBlcmNsYXNzUGFja2FnZS5lcXVhbHMoIiIpICYmICEoSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5nZXREZWZhdWx0UGFja2FnZShwcm9qZWN0LCBwcm9wcykuZXF1YWxzKG1hcHBlZFN1cGVyY2xhc3NQYWNrYWdlKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcGFja2FnZUltcG9ydCA9ICJpbXBvcnQgIiArIG1hcHBlZFN1cGVyY2xhc3NQYWNrYWdlICsgIi4qOyI7IC8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJU3RyaW5nIHByaW1hcnlLZXlEZWNsYXJhdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmICghaGFzUHJpbWFyeUtleSkgCi0JCQlwcmltYXJ5S2V5RGVjbGFyYXRpb24gPSBnZW5lcmF0ZVByaW1hcnlLZXlEZWNsYXJhdGlvbihmaWVsZEJhc2VkQWNjZXNzLCBpZE5hbWUpOwotCQkKLQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQkgIFN0cmluZyBjb250ZW50ID0gInBhY2thZ2UgIiArIEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuZ2V0RGVmYXVsdFBhY2thZ2UocHJvamVjdCwgcHJvcHMpCS8vJE5PTi1OTFMtMSQgCi0JCQkJCSAgCQkgKyAiO1xuXG4iCQkJCQkJCQkJCQkJCQkJCQkvLyROT04tTkxTLTEkCQotCQkJCQkgIAkJICsgImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qO1xuIiAgCQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJICAJCSArIHBhY2thZ2VJbXBvcnQrIlxuXG4iIAkJCQkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCSAgCQkgKyAiQEVudGl0eSBcbiIgCQkJCQkJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCQkgIAkJICsgKCh0YWJsZU5hbWUubGVuZ3RoKCkgPiAwKSA/ICgiQFRhYmxlKG5hbWU9XCIiIAkJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCSAgCQkgKyB0YWJsZU5hbWUgKyAiXCIpXG4iKSA6ICIiKSAgCQkJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCQkJCSAgCQkgKyBjbGFzc0RlY2xhcmF0aW9uU3RyaW5nQ29udGVudAotCQkJCQkgIAkJICsgcHJpbWFyeUtleURlY2xhcmF0aW9uCi0JCQkJCSAgCQkgKyJ9IjsgCQkJCQkJCQkJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCXRyeSB7Ci0JCQkJc3RyZWFtLndyaXRlKGNvbnRlbnQuZ2V0Qnl0ZXMoKSk7Ci0JCQkJc3RyZWFtLmZsdXNoKCk7Ci0JCQkJZmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHN0cmVhbS50b0J5dGVBcnJheSgpKSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfQkKLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9CQotCQotCXN0YXRpYyBwcml2YXRlIFN0cmluZyBnZW5lcmF0ZVByaW1hcnlLZXlEZWNsYXJhdGlvbihib29sZWFuIGZpZWxkQmFzZWRBY2Nlc3MsIFN0cmluZyBwcmltYXJ5S2V5TmFtZSkgewotCQlTdHJpbmcgcHJpbWFyeUtleURlY2xhcmF0aW9uID0gKGZpZWxkQmFzZWRBY2Nlc3MgPyAiICBASWQgXG4iIDogIiIpIAkJCQkvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKLQkJCQkrICIgIHByaXZhdGUgbG9uZyAiICsgcHJpbWFyeUtleU5hbWUgKyAiO1xuXG4iIAkJCQkJCQkJLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCQkJKyAoZmllbGRCYXNlZEFjY2VzcyA/ICIiIDogIiAgQElkIFxuIikgCQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAotCQkJCSsgIiAgcHVibGljIGxvbmcgZ2V0IiArIGNhcGl0YWxpemVGaXJzdExldHRlcihwcmltYXJ5S2V5TmFtZSkgKyAiKCkge1xuIiAJLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCQkJKyAiICAgIHJldHVybiAiICsgcHJpbWFyeUtleU5hbWUgKyAiO1xuIiAJCQkJCQkJCQkvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKLQkJCQkrICIgIH1cblxuIiAJCQkJCQkJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCSsgIiAgcHVibGljIHZvaWQgc2V0IiArIGNhcGl0YWxpemVGaXJzdExldHRlcihwcmltYXJ5S2V5TmFtZSkgCQkJCS8vJE5PTi1OTFMtMSQgCi0JCQkJKyAiKGxvbmcgIiArIHByaW1hcnlLZXlOYW1lICsgIikge1xuIiAJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCQkJKyAiICAgIHRoaXMuIiArIHByaW1hcnlLZXlOYW1lICsgIiA9ICIgKyBwcmltYXJ5S2V5TmFtZSArICI7XG4iIAkJCS8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAkvLyROT04tTkxTLTMkCi0JCQkJKyAiICB9XG5cbiI7IAkJCQkJCQkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCXJldHVybiBwcmltYXJ5S2V5RGVjbGFyYXRpb247Ci0JfQotCQotCXN0YXRpYyBwcml2YXRlIEhhc2hTZXQ8U3RyaW5nPiBnZXRFbnRpdHlOYW1lcyhKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJSGFzaFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlMaXN0SXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0PiBsaXQgPSBqcGFQcm9qZWN0LmdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCkuCi0JCQkJCQkJCQkJCQlnZXRQZXJzaXN0ZW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5pdGVyYXRvcigpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcHUgPSBsaXQubmV4dCgpOwotCQlmb3IgKENsYXNzUmVmIGNmIDogcHUuZ2V0Q2xhc3NSZWZzKCkpIHsKLQkJCW5hbWVzLmFkZChjZi5nZXRDbGFzc05hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQkKLQlzdGF0aWMgcHJpdmF0ZSBIYXNoU2V0PFN0cmluZz4gZ2V0RW50aXR5U2ltcGxlTmFtZXMoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJTGlzdEl0ZXJhdG9yPFBlcnNpc3RlbmNlVW5pdD4gbGl0ID0ganBhUHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLgotCQkJCQkJCQkJCQkJZ2V0UGVyc2lzdGVuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuaXRlcmF0b3IoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHB1ID0gbGl0Lm5leHQoKTsJCQkKLQkJZm9yIChDbGFzc1JlZiBjZiA6IHB1LmdldENsYXNzUmVmcygpKSB7Ci0JCQluYW1lcy5hZGQoSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGNmLmdldENsYXNzTmFtZSgpKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkpOwotCQl9Ci0JCXJldHVybiBuYW1lczsKLQl9CQkKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDYXJkaW5hbGl0eURlY29yYXRvcihDb25uZWN0aW9uRGVjb3JhdG9yIGNkKSB7Ci0JCUdyYXBoaWNzQWxnb3JpdGhtIGdhID0gY2QuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJaWYgKCFUZXh0LmNsYXNzLmlzSW5zdGFuY2UoZ2EpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlUZXh0IHR4dCA9IChUZXh0KWdhOwotCQlyZXR1cm4gSlBBRWRpdG9yQ29uc3RhbnRzLkNBUkRJTkFMSVRZX0xBQkVMUy5jb250YWlucyh0eHQuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRvb2x0aXBUZXh0KEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0KSB7Ci0gICAgCVN0cmluZyByZXMgPSBnZXRBdHRyaWJ1dGVUeXBlTmFtZShhdCk7Ci0gICAgCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JVdGlsX3R5cGVUb29sdGlwVGV4dCwgbmV3IE9iamVjdFtdIHsgcmVzIH0pOyAKLSAgICB9Ci0gICAgCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGNoZWNrSlBBRmFjZXRWZXJzaW9uKEpwYVByb2plY3QganBhUHJvamVjdCwgU3RyaW5nIHZlcnNpb24pIHsKLQkJcmV0dXJuIGNoZWNrSlBBRmFjZXRWZXJzaW9uKGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCB2ZXJzaW9uKTsKLQl9CQotCQotCQotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBjaGVja0pQQUZhY2V0VmVyc2lvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdmVyc2lvbikgewotCQlJRmFjZXRlZFByb2plY3QgZnByb2ogPSBudWxsOwotCQl0cnkgewotCQkJZnByb2ogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ291bGQgbm90IGNyZWF0ZSBmYWNldGVkIHByb2plY3QgZnJvbSAiICsgcHJvamVjdC5nZXROYW1lKCksIGUpOyAvLyROT04tTkxTLTEkCQkKLQkJfQotCQlTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IHByb2pGYWNldHMgPSBmcHJvai5nZXRQcm9qZWN0RmFjZXRzKCk7Ci0JCUl0ZXJhdG9yPElQcm9qZWN0RmFjZXRWZXJzaW9uPiBpdCA9IHByb2pGYWNldHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoZnYuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0SWQoKS5lcXVhbHMoImpwdC5qcGEiKSkgewkvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZ2LmdldFZlcnNpb25TdHJpbmcoKS5lcXVhbHModmVyc2lvbik7CQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0UHJpbWl0aXZlV3JhcHBlcihTdHJpbmcgcHJpbWl0aXZlKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JDb25zdGFudHMuUFJJTUlUSVZFX1RPX1dSQVBQRVIuZ2V0KHByaW1pdGl2ZSk7Ci0JfQotCQotCXN0YXRpYyBwcml2YXRlIEZpbGUgZ2V0RmlsZShJUGF0aCBjbGFzc1BhdGhFbnRyeSkgewotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSUZpbGUgZiA9IHJvb3QuZ2V0RmlsZShjbGFzc1BhdGhFbnRyeSk7Ci0JCWlmICgoZiAhPSBudWxsKSAmJiBmLmV4aXN0cygpKSB7Ci0JCQlVUkkgdXJpID0gZi5nZXRMb2NhdGlvblVSSSgpOwotCQkJaWYgKHVyaSA9PSBudWxsKSAKLQkJCQlyZXR1cm4gbmV3IEZpbGUoY2xhc3NQYXRoRW50cnkudG9PU1N0cmluZygpKTsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHVyaSk7Ci0JCQlyZXR1cm4gZmlsZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBuZXcgRmlsZShjbGFzc1BhdGhFbnRyeS50b09TU3RyaW5nKCkpOyAJCi0JCX0KLQotCX0KLQkKLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0ZW5jZVByb3ZpZGVyTGlicmFyeUluQ2xhc3NwYXRoKElQYXRoIGNsYXNzUGF0aEVudHJ5KSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIGYgPSBnZXRGaWxlKGNsYXNzUGF0aEVudHJ5KTsKLQkJCWlmICgoZiA9PSBudWxsKSB8fCAhZi5leGlzdHMoKSkgCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJSmFyRmlsZSBqYXIgPSBuZXcgSmFyRmlsZShmKTsKLQkJCUVudW1lcmF0aW9uPEphckVudHJ5PiBlbnRyaWVzID0gamFyLmVudHJpZXMoKTsKLQotCQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlKYXJFbnRyeSBlbnRyeSA9IGVudHJpZXMubmV4dEVsZW1lbnQoKTsKLQkJCQlpZiAoZW50cnkuZ2V0TmFtZSgpLmVxdWFscyhQRVJTSVNURU5DRV9QUk9WSURFUl9MSUJSQVJZX1NUUklORykpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoZSk7IAkgICAgIAkJCQkJCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkJCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGNoZWNrSXNTZXRQZXJzaXN0ZW5jZVByb3ZpZGVyTGlicmFyeShKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGpwYVByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W10geyBqYXZhUHJvamVjdCB9OwotCQlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSAoSmF2YVNlYXJjaFNjb3BlKSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGVsZW1lbnRzKTsKLQkJYm9vbGVhbiBpc0FkZGVkID0gZmFsc2U7Ci0KLQkJSVBhdGhbXSBwYXRocyA9IHNjb3BlLmVuY2xvc2luZ1Byb2plY3RzQW5kSmFycygpOwotCQlmb3IgKGludCBpID0gMTsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUGF0aCBwYXRoID0gcGF0aHNbaV07Ci0JCQlpZiAoaXNQZXJzaXN0ZW5jZVByb3ZpZGVyTGlicmFyeUluQ2xhc3NwYXRoKHBhdGgpKSB7Ci0JCQkJaXNBZGRlZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzQWRkZWQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1dE9mZlN0cmluZ1ByZWZpeChTdHJpbmcgcywgU3RyaW5nIHByZWZpeCkgewotCQlpZiAocy5zdGFydHNXaXRoKHByZWZpeCkpIAotCQkJcmV0dXJuIHMuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSk7Ci0JCXJldHVybiBzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXRPZmZIZWFkZXJEaXJ0eVByZWZpeChTdHJpbmcgaGVhZGVyKSB7Ci0JCXJldHVybiBjdXRPZmZTdHJpbmdQcmVmaXgoaGVhZGVyLCBKUEFFZGl0b3JDb25zdGFudHMuSEVBREVSX1BSRUZJWF9ESVJUWSk7Ci0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXJlSGVhZGVyc0VxdWFsKFN0cmluZyBoMSwgU3RyaW5nIGgyKSB7Ci0JCWgxID0gY3V0T2ZmSGVhZGVyRGlydHlQcmVmaXgoaDEpOwotCQloMiA9IGN1dE9mZkhlYWRlckRpcnR5UHJlZml4KGgyKTsKLQkJcmV0dXJuIGgxLmVxdWFscyhoMik7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0pQQUVkaXRvclV0aWxJbXBsLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9KUEFFZGl0b3JVdGlsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzdhYWVlLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0pQQUVkaXRvclV0aWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRnJlZUZvcm1Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckltYWdlQ3JlYXRvci5SZWxFbmREaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotCi0KLXB1YmxpYyBjbGFzcyBKUEFFZGl0b3JVdGlsSW1wbCBpbXBsZW1lbnRzIElKUEFFZGl0b3JVdGlsIHsKLQotCXB1YmxpYyBpbnQgY2FsY0Nvbm5lY3Rpb25MZW5ndGgoRnJlZUZvcm1Db25uZWN0aW9uIGMpIHsKLQkJcmV0dXJuIEpQQUVkaXRvclV0aWwuY2FsY0Nvbm5lY3Rpb25MZW5ndGgoYyk7Ci0JfQotCi0JcHVibGljIExpc3Q8UG9pbnQ+IGNyZWF0ZUJlbmRQb2ludExpc3QoRnJlZUZvcm1Db25uZWN0aW9uIGMsICBpbnQgY250LCBpbnQgY29ubmVjdGlvbnNOdW0sICBib29sZWFuIHNlbGZSZWxhdGlvbikgewotCQlyZXR1cm4gSlBBRWRpdG9yVXRpbC5jcmVhdGVCZW5kUG9pbnRMaXN0KGMsICBjbnQsIGNvbm5lY3Rpb25zTnVtLCBzZWxmUmVsYXRpb24pOwotCX0KLQkKLQlwdWJsaWMgTGlzdDxQb2ludD4gY3JlYXRlQmVuZFBvaW50TGlzdChGcmVlRm9ybUNvbm5lY3Rpb24gYywgIGJvb2xlYW4gc2VsZlJlbGF0aW9uKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JVdGlsLmNyZWF0ZUJlbmRQb2ludExpc3QoYywgIHNlbGZSZWxhdGlvbik7Ci0JfQotCQotCXB1YmxpYyBSZWxFbmREaXIgZ2V0Q29ubmVjdGlvblN0YXJ0RGlyKEZyZWVGb3JtQ29ubmVjdGlvbiBjKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JVdGlsLmdldENvbm5lY3Rpb25TdGFydERpcihjKTsKLQkJCi0JfQotCQotCXB1YmxpYyBSZWxFbmREaXIgZ2V0Q29ubmVjdGlvbkVuZERpcihGcmVlRm9ybUNvbm5lY3Rpb24gYykgewotCQlyZXR1cm4gSlBBRWRpdG9yVXRpbC5nZXRDb25uZWN0aW9uRW5kRGlyKGMpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRUeXBlIGdldEpQVHlwZShJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiBKUEFFZGl0b3JVdGlsLmdldEpQVHlwZShjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG9yZ2FuaXplSW1wb3J0cyhJQ29tcGlsYXRpb25Vbml0IGN1LCBJV29ya2JlbmNoU2l0ZSB3cykgewotCQlKUEFFZGl0b3JVdGlsLm9yZ2FuaXplSW1wb3J0cyhjdSwgd3MpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBmb3JtYXRDb2RlKElDb21waWxhdGlvblVuaXQgY3UsIElXb3JrYmVuY2hTaXRlIHdzKSB7Ci0JCUpQQUVkaXRvclV0aWwuZm9ybWF0Q29kZShjdSwgd3MpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlVW5pcXVlRW50aXR5TmFtZShKcGFQcm9qZWN0IGpwYVByb2plY3QsIAotCQkJICBTdHJpbmcgcGFjaywgCi0JCQkgIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJcmV0dXJuIEpQQUVkaXRvclV0aWwuZ2VuZXJhdGVVbmlxdWVFbnRpdHlOYW1lKGpwYVByb2plY3QsIHBhY2ssIGZwKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVVuaXF1ZU1hcHBlZFN1cGVyY2xhc3NOYW1lKEpwYVByb2plY3QganBhUHJvamVjdCwgU3RyaW5nIHBhY2ssIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJcmV0dXJuIEpQQUVkaXRvclV0aWwuZ2VuZXJhdGVVbmlxdWVNYXBwZWRTdXBlcmNsYXNzTmFtZShqcGFQcm9qZWN0LCBwYWNrLCBmcCk7Ci0JfQotCi0JCi0JcHVibGljIElGaWxlIGNyZWF0ZUVudGl0eUluUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZW50aXR5TmFtZSwgSVByZWZlcmVuY2VTdG9yZSBqcGFQcmVmZXJlbmNlU3RvcmUsCi0JCQkJCQkJCQkgICBib29sZWFuIGlzTWFwcGVkU3VwZXJjbGFzc0NoaWxkLCBTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc05hbWUsIAotCQkJCQkJCQkJICAgU3RyaW5nIG1hcHBlZFN1cGVyY2xhc3NQYWNrYWdlLCBTdHJpbmcgaWROYW1lLCAKLQkJCQkJCQkJCSAgIGJvb2xlYW4gaGFzUHJpbWFyeUtleSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBKUEFFZGl0b3JVdGlsLmNyZWF0ZUVudGl0eUluUHJvamVjdChwcm9qZWN0LCBlbnRpdHlOYW1lLCBqcGFQcmVmZXJlbmNlU3RvcmUsIGlzTWFwcGVkU3VwZXJjbGFzc0NoaWxkLCAKLQkJCQltYXBwZWRTdXBlcmNsYXNzTmFtZSwgbWFwcGVkU3VwZXJjbGFzc1BhY2thZ2UsIGlkTmFtZSwgaGFzUHJpbWFyeUtleSk7Ci0gCX0KLQotCXB1YmxpYyBJRmlsZSBjcmVhdGVFbnRpdHlJblByb2plY3QoSVByb2plY3QgcHJvamVjdCwgCi0JCQkgICBTdHJpbmcgZW50aXR5TmFtZSwgCi0JCQkgICBKYXZhUGVyc2lzdGVudFR5cGUgbWFwcGVkU3VwZXJjbGFzcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBKUEFFZGl0b3JVdGlsLmNyZWF0ZUVudGl0eUluUHJvamVjdChwcm9qZWN0LCBlbnRpdHlOYW1lLCBtYXBwZWRTdXBlcmNsYXNzKTsJCQotCX0KLQkKLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlyZXR1cm4gSlBBRWRpdG9yVXRpbC5nZXRDb21waWxhdGlvblVuaXQoanB0KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDYXJkaW5hbGl0eURlY29yYXRvcihDb25uZWN0aW9uRGVjb3JhdG9yIGRjKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JVdGlsLmlzQ2FyZGluYWxpdHlEZWNvcmF0b3IoZGMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc2NhcmRXb3JraW5nQ29weU9uY2UoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlKUEFFZGl0b3JVdGlsLmRpc2NhcmRXb3JraW5nQ29weU9uY2UoY3UpOwotCX0KLQkKLQlwdWJsaWMgSUZpbGUgY3JlYXRlRW50aXR5RnJvbU1hcHBlZFN1cGVyY2xhc3NJblByb2plY3QoSVByb2plY3QgcHJvamVjdCwKLQkJCVN0cmluZyBtYXBwZWRTdXBlcmNsYXNzTmFtZSwgSVByZWZlcmVuY2VTdG9yZSBqcGFQcmVmZXJlbmNlU3RvcmUpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gSlBBRWRpdG9yVXRpbC5jcmVhdGVFbnRpdHlGcm9tTWFwcGVkU3VwZXJjbGFzc0luUHJvamVjdChwcm9qZWN0LCBtYXBwZWRTdXBlcmNsYXNzTmFtZSwganBhUHJlZmVyZW5jZVN0b3JlKTsKLQl9Ci0JCi0JcHVibGljIElGaWxlIGNyZWF0ZU1hcHBlZFN1cGVyY2xhc3NJblByb2plY3QoSVByb2plY3QgcHJvamVjdCwKLQkJCUlGb2xkZXIgZm9sZGVyLCBTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc05hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gSlBBRWRpdG9yVXRpbC5jcmVhdGVNYXBwZWRTdXBlcmNsYXNzSW5Qcm9qZWN0KHByb2plY3QsIGZvbGRlciwgbWFwcGVkU3VwZXJjbGFzc05hbWUpOwotCX0KLQkKLQlwdWJsaWMgSUZpbGUgY3JlYXRlTWFwcGVkU3VwZXJjbGFzc0luUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LAotCQkJU3RyaW5nIG1hcHBlZFN1cGVyY2xhc3NOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEpQQUVkaXRvclV0aWwuY3JlYXRlTWFwcGVkU3VwZXJjbGFzc0luUHJvamVjdChwcm9qZWN0LCBtYXBwZWRTdXBlcmNsYXNzTmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9KUEFTb2x2ZXIuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0pQQVNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDAzMmI2Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0pQQVNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXJEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5kdC5JRGlhZ3JhbVR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JUmVtb3ZlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQWRkQ29ubmVjdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkFkZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLlJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb25EZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5GcmVlRm9ybUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklFbGVtZW50Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT3B0aW9uYWxNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZhY2FkZS5FY2xpcHNlRmFjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQWRkQXR0cmlidXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkFkZFJlbGF0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlJlbW92ZUF0dHJpYnV0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5SZW1vdmVSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5VcGRhdGVBdHRyaWJ1dGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbC5Nb2RlbEludGVncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLkFic3RyYWN0UmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklCaWRpcmVjdGlvbmFsUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSlBBU29sdmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElKcGFTb2x2ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU2V0PEpQQVNvbHZlcj4gc29sdmVyc1NldCA9IG5ldyBIYXNoU2V0PEpQQVNvbHZlcj4oKTsKLQotCXByaXZhdGUgc3RhdGljIFdvcmtpbmdDb3B5Q2hhbmdlTGlzdGVuZXIgd2Nsc25yID0gbnVsbDsKLQotCXByaXZhdGUgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBrZXlUb0JPOwotCXByaXZhdGUgV2Vha0hhc2hNYXA8SnBhUHJvamVjdCwgV2Vha1JlZmVyZW5jZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+PiBwcm9qZWN0VG9FbnRpdHlMaXN0ZW5lcjsKLQlwcml2YXRlIFdlYWtIYXNoTWFwPEphdmFQZXJzaXN0ZW50VHlwZSwgV2Vha1JlZmVyZW5jZTxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPj4gZW50aXR5VG9Qcm9wTGlzdGVuZXI7Ci0JcHJpdmF0ZSBXZWFrSGFzaE1hcDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPj4gYXR0cmlidXRlVG9Qcm9wTGlzdGVuZXI7Ci0JcHJpdmF0ZSBXZWFrSGFzaE1hcDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlDaGFuZ2VMaXN0ZW5lcj4+IGF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eVRvUHJvcExpc3RlbmVyOwkJCi0JcHJpdmF0ZSBXZWFrSGFzaE1hcDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVKb2luaW5nU3RyYXRlZ3lQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPj4gYXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5VG9Qcm9wTGlzdGVuZXI7CQotCXByaXZhdGUgV2Vha0hhc2hNYXA8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFdlYWtSZWZlcmVuY2U8QXR0cmlidXRlUmVsYXRpb25zaGlwUmVmZXJlbmNlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4+IGF0dHJpYnV0ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZVRvUHJvcExpc3RlbmVyOwotCXByaXZhdGUgV2Vha0hhc2hNYXA8SmF2YVBlcnNpc3RlbnRUeXBlLCBXZWFrUmVmZXJlbmNlPExpc3RDaGFuZ2VMaXN0ZW5lcj4+IGVudGl0eVRvQXRMaXN0ZW5lcjsKLQlwcml2YXRlIFdlYWtIYXNoTWFwPEphdmFQZXJzaXN0ZW50VHlwZSwgV2Vha1JlZmVyZW5jZTxTdGF0ZUNoYW5nZUxpc3RlbmVyPj4gZW50aXR5VG9TdGF0ZUxpc3RlbmVyOwotCXByaXZhdGUgRW50aXR5Q2hhbmdlTGlzdGVuZXIgZW50aXR5TmFtZUxpc3RlbmVyOwotCXByaXZhdGUgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXI7Ci0JcHJpdmF0ZSBIYXNoU2V0PFN0cmluZz4gcmVtb3ZlSWdub3JlID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCXByaXZhdGUgSGFzaFNldDxTdHJpbmc+IHJlbW92ZVJlbElnbm9yZSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQlwcml2YXRlIENvbGxlY3Rpb248SmF2YVBlcnNpc3RlbnRUeXBlPiBwZXJzaXN0ZW50VHlwZXMgPSBuZXcgSGFzaFNldDxKYXZhUGVyc2lzdGVudFR5cGU+KCk7Ci0KLQlwcml2YXRlIEhhc2hTZXQ8U3RyaW5nPiBhZGRJZ25vcmUgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JcHJpdmF0ZSBIYXNodGFibGU8U3RyaW5nLCBJUmVsYXRpb24+IGF0dHJpYlRvUmVsID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIElSZWxhdGlvbj4oKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQQVJBVE9SID0gIi0iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIElFY2xpcHNlRmFjYWRlIGVjbGlwc2VGYWNhZGU7Ci0JcHJpdmF0ZSBJSlBBRWRpdG9yVXRpbCB1dGlsID0gbnVsbDsKLQotCS8qKgotCSAqIFByb3ZpZGVzIHRoZSB1bmlxdWUga2V5IGZvciB0aGUgZ2l2ZW4gYnVzaW5lc3Mgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBibwotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIGJ1c2luZXNzIG9iamVjdAotCSAqIAotCSAqIEByZXR1cm4gdW5pcXVlIGtleQotCSAqLwotCXB1YmxpYyBKUEFTb2x2ZXIoKSB7Ci0JCXRoaXMoRWNsaXBzZUZhY2FkZS5JTlNUQU5DRSwgbmV3IEpQQUVkaXRvclV0aWxJbXBsKCkpOwotCQlzeW5jaHJvbml6ZWQgKEpQQVNvbHZlci5jbGFzcykgewotCQkJaWYgKHdjbHNuciA9PSBudWxsKSB7Ci0JCQkJd2Nsc25yID0gbmV3IFdvcmtpbmdDb3B5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJCQlKYXZhQ29yZS5hZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKHdjbHNuciwgRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX0NIQU5HRSB8IEVsZW1lbnRDaGFuZ2VkRXZlbnQuUE9TVF9SRUNPTkNJTEUpOwotCQkJfQotCQl9Ci0JCXNvbHZlcnNTZXQuYWRkKHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgSlBBU29sdmVyKElFY2xpcHNlRmFjYWRlIGVjbGlwc2VGYWNhZGUsIElKUEFFZGl0b3JVdGlsIHV0aWwpIHsKLQkJdGhpcy5lY2xpcHNlRmFjYWRlID0gZWNsaXBzZUZhY2FkZTsKLQkJZWNsaXBzZUZhY2FkZS5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0JVSUxEKTsKLQkJa2V5VG9CTyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCXByb2plY3RUb0VudGl0eUxpc3RlbmVyID0gbmV3IFdlYWtIYXNoTWFwPEpwYVByb2plY3QsIFdlYWtSZWZlcmVuY2U8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPj4oKTsKLQkJZW50aXR5VG9Qcm9wTGlzdGVuZXIgPSBuZXcgV2Vha0hhc2hNYXA8SmF2YVBlcnNpc3RlbnRUeXBlLCBXZWFrUmVmZXJlbmNlPFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+PigpOwotCQlhdHRyaWJ1dGVUb1Byb3BMaXN0ZW5lciA9IG5ldyBXZWFrSGFzaE1hcDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPj4oKTsKLQkJYXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5VG9Qcm9wTGlzdGVuZXIgPSBuZXcgV2Vha0hhc2hNYXA8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFdlYWtSZWZlcmVuY2U8QXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5Q2hhbmdlTGlzdGVuZXI+PigpOwotCQlhdHRyaWJ1dGVKb2luaW5nU3RyYXRlZ3lUb1Byb3BMaXN0ZW5lciA9IG5ldyBXZWFrSGFzaE1hcDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVKb2luaW5nU3RyYXRlZ3lQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPj4oKTsKLQkJYXR0cmlidXRlUmVsYXRpb25zaGlwUmVmZXJlbmNlVG9Qcm9wTGlzdGVuZXIgPSBuZXcgV2Vha0hhc2hNYXA8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFdlYWtSZWZlcmVuY2U8QXR0cmlidXRlUmVsYXRpb25zaGlwUmVmZXJlbmNlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4+KCk7IAotCQllbnRpdHlUb0F0TGlzdGVuZXIgPSBuZXcgV2Vha0hhc2hNYXA8SmF2YVBlcnNpc3RlbnRUeXBlLCBXZWFrUmVmZXJlbmNlPExpc3RDaGFuZ2VMaXN0ZW5lcj4+KCk7Ci0JCWVudGl0eVRvU3RhdGVMaXN0ZW5lciA9IG5ldyBXZWFrSGFzaE1hcDxKYXZhUGVyc2lzdGVudFR5cGUsIFdlYWtSZWZlcmVuY2U8U3RhdGVDaGFuZ2VMaXN0ZW5lcj4+KCk7Ci0JCWVudGl0eU5hbWVMaXN0ZW5lciA9IG5ldyBFbnRpdHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJZW50aXR5TmFtZUxpc3RlbmVyLnNldE5hbWUoIkVudGl0eSBOYW1lIENoYW5nZSBMaXN0ZW5lciIpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMudXRpbCA9IHV0aWw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0KLQkJY2xvc2VEaWFncmFtRWRpdG9ySWZQcm9qZWN0SXNEZWxldGVkKGV2ZW50KTsKLQkJCi0JCXVucmVnaXN0ZXJEZWx0ZWRFbnRpdHkoZXZlbnQpOwotCQkKLQkJSU1hcmtlckRlbHRhW10gbWFya2VyRGVsdGFzID0gZXZlbnQuZmluZE1hcmtlckRlbHRhcyhudWxsLCB0cnVlKTsKLQkJU2V0PElGaWxlPiBmaWxlc1RvVXBkYXRlID0gbmV3IEhhc2hTZXQ8SUZpbGU+KCk7Ci0JCWZvciAoSU1hcmtlckRlbHRhIGRlbHRhIDogbWFya2VyRGVsdGFzKSB7Ci0JCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpCi0JCQkJY29udGludWU7Ci0JCQlmaWxlc1RvVXBkYXRlLmFkZCgoSUZpbGUpIGRlbHRhLmdldFJlc291cmNlKCkpOwotCQl9Ci0JCQotCQkvLyB1cGRhdGUgaXMgbWFkZSB0byB0aGUgd2hvbGUgZWRpdG9yLiBGaW5kIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uIHBlCi0JCS8vIHRvIGJlIHVwZGF0ZSBhbmQgYnJlYWsgdGhlIGl0ZXJhdGlvbgotCQlib29sZWFuIHVwZGF0ZUVkaXRvciA9IGZhbHNlOwotCQlGSUxFOiBmb3IgKElGaWxlIGZpbGUgOiBmaWxlc1RvVXBkYXRlKSB7Ci0JCQlmb3IgKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQgOiBlbnRpdHlUb1Byb3BMaXN0ZW5lci5rZXlTZXQoKSkgewotCQkJCWlmIChqcHQuZ2V0UmVzb3VyY2UoKS5lcXVhbHMoZmlsZSkpIHsKLQkJCQkJZmluYWwgUGljdG9ncmFtRWxlbWVudCBlbGVtZW50ID0gZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChqcHQpOwotCQkJCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJCQkJYnJlYWs7Ci0JCQkJCWVsc2UgewotCQkJCQkJdXBkYXRlRWRpdG9yID0gdHJ1ZTsKLQkJCQkJCWJyZWFrIEZJTEU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHVwZGF0ZUVkaXRvcikgewotCQkJZWNsaXBzZUZhY2FkZS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmKGZlYXR1cmVQcm92aWRlciAhPSBudWxsKQotCQkJCQkJdHJ5IHsKLQkJCQkJCQlmZWF0dXJlUHJvdmlkZXIuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW1FZGl0b3IoKS5yZWZyZXNoKCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIGlnbm9yZQotCQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZW1vdmVJZ25vcmUoU3RyaW5nIGF0TmFtZSkgewotCQlyZW1vdmVJZ25vcmUuYWRkKGF0TmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVtb3ZlUmVsSWdub3JlKFN0cmluZyBhdE5hbWUpIHsKLQkJcmVtb3ZlUmVsSWdub3JlLmFkZChhdE5hbWUpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgYWRkSlBURm9yVXBkYXRlKFN0cmluZyBqcHROYW1lKSB7Ci0JCWVudGl0eU5hbWVMaXN0ZW5lci5hZGRKUFRGb3JVcGRhdGUoanB0TmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQWRkSWdub3JlKFN0cmluZyBhdE5hbWUpIHsKLQkJYWRkSWdub3JlLmFkZChhdE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgSGFzaFNldDxTdHJpbmc+IGdldEFkZElnbm9yZSgpeyAKLSAJCXJldHVybiBhZGRJZ25vcmU7IAotIAl9IAotCi0JCi0JcHVibGljIHZvaWQgc3RvcFRocmVhZCgpIHsKLQkJZW50aXR5TmFtZUxpc3RlbmVyLnN0b3BUaHJlYWQoKTsKLQkJZW50aXR5TmFtZUxpc3RlbmVyID0gbnVsbDsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgcHVibGljIEVudGl0eUNoYW5nZUxpc3RlbmVyIGdldE1vbml0b3IoKSB7Ci0JCWlmIChlbnRpdHlOYW1lTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZW50aXR5TmFtZUxpc3RlbmVyID0gbmV3IEVudGl0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJZW50aXR5TmFtZUxpc3RlbmVyLnNldE5hbWUoIkVudGl0eSBOYW1lIENoYW5nZSBMaXN0ZW5lciIpOyAvLyROT04tTkxTLTEkCQkJCi0JCX0KLQkJcmV0dXJuIGVudGl0eU5hbWVMaXN0ZW5lcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS51dGlsLklKcGFTb2x2ZXIjc2V0RmVhdHVyZVByb3ZpZGVyKG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZVByb3ZpZGVyKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyKSB7Ci0JCXRoaXMuZmVhdHVyZVByb3ZpZGVyID0gZmVhdHVyZVByb3ZpZGVyOwotCQllbnRpdHlOYW1lTGlzdGVuZXIuc2V0RmVhdHVyZVByb3ZpZGVyKGZlYXR1cmVQcm92aWRlcik7Ci0JCWVudGl0eU5hbWVMaXN0ZW5lci5zZXREYWVtb24odHJ1ZSk7Ci0JCWVudGl0eU5hbWVMaXN0ZW5lci5zdGFydCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5Rm9yQnVzaW5lc3NPYmplY3QoT2JqZWN0IGJvKSB7Ci0JCWlmIChibyA9PSBudWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGJvOwotCQkJU3RyaW5nIG5hbWUgPSBqcHQuZ2V0TmFtZSgpOwotCQkJcmV0dXJuIG5hbWU7Ci0JCX0gZWxzZSBpZiAoYm8gaW5zdGFuY2VvZiBBYnN0cmFjdFJlbGF0aW9uKSB7Ci0JCQlyZXR1cm4gKChBYnN0cmFjdFJlbGF0aW9uKSBibykuZ2V0SWQoKTsKLQkJfSBlbHNlIGlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgYm87Ci0JCQlyZXR1cm4gKCgoUGVyc2lzdGVudFR5cGUpYXQuZ2V0UGFyZW50KCkpLmdldE5hbWUoKSArICItIiArIGF0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gYm8udG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyB0aGUgYnVzaW5lc3Mgb2JqZWN0IGZvciB0aGUgZ2l2ZW4ga2V5LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSB1bmlxdWUga2V5Ci0JICogCi0JICogQHJldHVybiB0aGUgYnVzaW5lc3Mgb2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRCdXNpbmVzc09iamVjdEZvcktleShTdHJpbmcga2V5KSB7Ci0JCWlmIChrZXkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4ga2V5VG9CTy5nZXQoa2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2R1Y2VPd25lcktleUZvclJlbChBYnN0cmFjdFJlbGF0aW9uIHJlbCkgewotCQlyZXR1cm4gcHJvZHVjZUtleUZvclJlbChyZWwuZ2V0T3duZXIoKSwgcmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2R1Y2VJbnZlcnNlS2V5Rm9yUmVsKEFic3RyYWN0UmVsYXRpb24gcmVsKSB7Ci0JCXJldHVybiBwcm9kdWNlS2V5Rm9yUmVsKHJlbC5nZXRJbnZlcnNlKCksIHJlbC5nZXRJbnZlcnNlQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHByb2R1Y2VLZXlGb3JSZWwoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuIGpwdC5nZXROYW1lKCkgKyBTRVBBUkFUT1IgKyBhdHRyaWJ1dGVOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEtleUJ1c2luZXNzT2JqZWN0KFN0cmluZyBrZXksIE9iamVjdCBibykgewotCQlrZXlUb0JPLnB1dChrZXksIGJvKTsKLQkJaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSB7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgYm87Ci0JCQlKcGFQcm9qZWN0IHByb2ogPSBqcHQuZ2V0SnBhUHJvamVjdCgpOwotCQkJYWRkTGlzdGVuZXJzVG9Qcm9qZWN0KHByb2opOwotCQkJYWRkTGlzdGVuZXJzVG9FbnRpdHkoanB0KTsKLQkJCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0JCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5zZXRQcm9wZXJ0eVZhbHVlKHBlLCBKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9FTlRJVFlfQ0xBU1NfTkFNRSwganB0LmdldE5hbWUoKSk7Ci0JCQlwZXJzaXN0ZW50VHlwZXMuYWRkKGpwdCk7Ci0JCX0gZWxzZSBpZiAoYm8gaW5zdGFuY2VvZiBBYnN0cmFjdFJlbGF0aW9uKSB7Ci0JCQlBYnN0cmFjdFJlbGF0aW9uIHJlbCA9IChBYnN0cmFjdFJlbGF0aW9uKSBibzsKLQkJCWF0dHJpYlRvUmVsLnB1dChwcm9kdWNlT3duZXJLZXlGb3JSZWwocmVsKSwgcmVsKTsKLQkJCWlmIChyZWwgaW5zdGFuY2VvZiBJQmlkaXJlY3Rpb25hbFJlbGF0aW9uKSB7Ci0JCQkJYXR0cmliVG9SZWwucHV0KHByb2R1Y2VJbnZlcnNlS2V5Rm9yUmVsKHJlbCksIHJlbCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQkJYWRkUHJvcGVydGllc0xpc3RlbmVyVG9BdHRyaWJ1dGUoKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKWJvKTsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgcmVtb3ZlKFN0cmluZyBrZXkpIHsKLQkJaWYgKGtleSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU9iamVjdCBvID0ga2V5VG9CTy5yZW1vdmUoa2V5KTsKLQkJaWYgKG8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBvOwotCQkJZm9yIChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCA6IGpwdC5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCQlTdHJpbmcgayA9IGdldEtleUZvckJ1c2luZXNzT2JqZWN0KGF0KTsKLQkJCQlyZW1vdmUoayk7Ci0JCQl9Ci0JCQlwZXJzaXN0ZW50VHlwZXMucmVtb3ZlKGpwdCk7Ci0JCQlyZW1vdmVMaXN0ZW5lcnNGcm9tRW50aXR5KGpwdCk7Ci0JCQlEaWFncmFtIGQgPSBmZWF0dXJlUHJvdmlkZXIuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW0oKTsKLQkJCWlmIChkLmdldENoaWxkcmVuKCkuc2l6ZSgpID09IDEpIHsKLQkJCQlXZWFrUmVmZXJlbmNlPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gcmVmID0gcHJvamVjdFRvRW50aXR5TGlzdGVuZXIucmVtb3ZlKGpwdC5nZXRKcGFQcm9qZWN0KCkpOwotCQkJCWlmIChyZWYgIT0gbnVsbCkgewotCQkJCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgY2ggPSByZWYuZ2V0KCk7Ci0JCQkJCWlmIChjaCAhPSBudWxsKSAKLQkJCQkJCWpwdC5nZXRKcGFQcm9qZWN0KCkucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKEpwYVByb2plY3QuSlBBX0ZJTEVTX0NPTExFQ1RJT04sIGNoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoanB0KTsKLQkJCUpQQUVkaXRvclV0aWwuZGlzY2FyZFdvcmtpbmdDb3B5T25jZShjdSk7Ci0JCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEFic3RyYWN0UmVsYXRpb24pIHsKLQkJCUFic3RyYWN0UmVsYXRpb24gcmVsID0gKEFic3RyYWN0UmVsYXRpb24pIG87Ci0JCQlhdHRyaWJUb1JlbC5yZW1vdmUocHJvZHVjZU93bmVyS2V5Rm9yUmVsKHJlbCkpOwotCQkJaWYgKHJlbCBpbnN0YW5jZW9mIElCaWRpcmVjdGlvbmFsUmVsYXRpb24pIAotCQkJCWF0dHJpYlRvUmVsLnJlbW92ZShwcm9kdWNlSW52ZXJzZUtleUZvclJlbChyZWwpKTsKLQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJCXJlbW92ZUxpc3RlbmVyc0Zyb21BdHRyaWJ1dGUoKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKW8pOwotCQl9Ci0JCXJldHVybiBvOwotCX0KLQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdChKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCXJldHVybiB1dGlsLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVsYXRpb25SZWxhdGVkVG9BdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCVN0cmluZyBrZXkgPSBwcm9kdWNlS2V5Rm9yUmVsKChKYXZhUGVyc2lzdGVudFR5cGUpanBhLmdldFBhcmVudCgpLCBqcGEuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGF0dHJpYlRvUmVsLmNvbnRhaW5zS2V5KGtleSk7Ci0JfQotCi0JcHVibGljIElSZWxhdGlvbiBnZXRSZWxhdGlvblJlbGF0ZWRUb0F0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJU3RyaW5nIGtleSA9IHByb2R1Y2VLZXlGb3JSZWwoKEphdmFQZXJzaXN0ZW50VHlwZSlqcGEuZ2V0UGFyZW50KCksIGpwYS5nZXROYW1lKCkpOwotCQlyZXR1cm4gYXR0cmliVG9SZWwuZ2V0KGtleSk7Ci0JfQotCi0JcHVibGljIFNldDxJUmVsYXRpb24+IGdldFJlbGF0aW9uc1JlbGF0ZWRUb0VudGl0eShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCUhhc2hTZXQ8SVJlbGF0aW9uPiByZXMgPSBuZXcgSGFzaFNldDxJUmVsYXRpb24+KCk7Ci0JCWZvciAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQgOiBqcHQuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQlJUmVsYXRpb24gcmVsID0gZ2V0UmVsYXRpb25SZWxhdGVkVG9BdHRyaWJ1dGUoYXQpOwotCQkJaWYgKHJlbCAhPSBudWxsKQotCQkJCXJlcy5hZGQocmVsKTsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQotCQotCXB1YmxpYyBib29sZWFuIGV4aXN0c1JlbGF0aW9uKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQxLCBKYXZhUGVyc2lzdGVudFR5cGUganB0MikgewotCQlTZXQ8SVJlbGF0aW9uPiByZWxzID0gZ2V0UmVsYXRpb25zUmVsYXRlZFRvRW50aXR5KGpwdDEpOwotCQlpZiAoZXhpc3RzUmVsYXRpb24oanB0MSwganB0MiwgcmVscykpCi0JCQlyZXR1cm4gdHJ1ZTsJCQotCQlyZWxzID0gZ2V0UmVsYXRpb25zUmVsYXRlZFRvRW50aXR5KGpwdDIpOwotCQlyZXR1cm4gZXhpc3RzUmVsYXRpb24oanB0MSwganB0MiwgcmVscyk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGV4aXN0c1JlbGF0aW9uKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQxLCAKLQkJCQkJCQkJCSAgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdDIsCi0JCQkJCQkJCQkgIFNldDxJUmVsYXRpb24+IHJlbHMpIHsKLQkJSXRlcmF0b3I8SVJlbGF0aW9uPiBpdCA9IHJlbHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSVJlbGF0aW9uIHJlbCA9IGl0Lm5leHQoKTsKLQkJCWlmICgoanB0MS5lcXVhbHMocmVsLmdldE93bmVyKCkpICYmIGpwdDIuZXF1YWxzKHJlbC5nZXRJbnZlcnNlKCkpKSB8fAotCQkJCSgoanB0Mi5lcXVhbHMocmVsLmdldE93bmVyKCkpICYmIGpwdDEuZXF1YWxzKHJlbC5nZXRJbnZlcnNlKCkpKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbjxPYmplY3Q+IGdldFZpc3VhbGl6ZWRPYmplY3RzKCkgewotCQlyZXR1cm4ga2V5VG9CTy52YWx1ZXMoKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHJlbmV3QXR0cmlidXRlTWFwcGluZ1Byb3BMaXN0ZW5lcihKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJcmVuZXdBdHRyaWJ1dGVKb2luaW5nU3RyYXRlZ3lQcm9wZXJ0eUxpc3RlbmVyKGpwYSk7Ci0JCXJlbmV3QXR0cmlidXRlTWFwcGluZ09wdFByb3BMaXN0ZW5lcihqcGEpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW5ld0F0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5TGlzdGVuZXIoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCUF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHNuID0gbnVsbDsKLQkJaWYgKGF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVRvUHJvcExpc3RlbmVyID09IG51bGwpIAotCQkJcmV0dXJuOwotCQlXZWFrUmVmZXJlbmNlPEF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IHJlZiA9IGF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVRvUHJvcExpc3RlbmVyLnJlbW92ZShqcGEpOwotCQlpZiAocmVmICE9IG51bGwpCi0JCQlsc24gPSByZWYuZ2V0KCk7Ci0JCQotCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYW0gPSBqcGEuZ2V0TWFwcGluZygpOwotCQlpZiAoKGphbSA9PSBudWxsKSB8fCAhUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcy5pc0luc3RhbmNlKGphbSkpCi0JCQlyZXR1cm47Ci0JCVJlbGF0aW9uc2hpcCByciA9ICgoUmVsYXRpb25zaGlwTWFwcGluZykgamFtKS5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJaWYgKHJyID09IG51bGwpCi0JCQlyZXR1cm47CQkJCi0JCVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpzID0gcnIuZ2V0U3RyYXRlZ3koKTsKLQkJaWYgKChqcyA9PSBudWxsKSB8fCAhTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneS5jbGFzcy5pc0luc3RhbmNlKGpzKSkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCWlmIChsc24gIT0gbnVsbCkgCi0JCQkJanMucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Lk1BUFBFRF9CWV9BVFRSSUJVVEVfUFJPUEVSVFksIGxzbik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJbHNuID0gbmV3IEF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJanMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Lk1BUFBFRF9CWV9BVFRSSUJVVEVfUFJPUEVSVFksIGxzbik7Ci0JCXJlZiA9IG5ldyBXZWFrUmVmZXJlbmNlPEF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+KGxzbik7Ci0JCWF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVRvUHJvcExpc3RlbmVyLnB1dChqcGEsIHJlZik7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW5ld0F0dHJpYnV0ZU1hcHBpbmdPcHRQcm9wTGlzdGVuZXIoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCUF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eUNoYW5nZUxpc3RlbmVyIGxzbiA9IG51bGw7Ci0JCVdlYWtSZWZlcmVuY2U8QXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5Q2hhbmdlTGlzdGVuZXI+IHJlZiA9IGF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eVRvUHJvcExpc3RlbmVyLnJlbW92ZShqcGEpOwotCQlpZiAocmVmICE9IG51bGwpCi0JCQlsc24gPSByZWYuZ2V0KCk7CQotCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYW0gPSBqcGEuZ2V0TWFwcGluZygpOwotCQlpZiAoamFtID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghTWFueVRvT25lTWFwcGluZy5jbGFzcy5pc0luc3RhbmNlKGphbSkgJiYgIU9uZVRvT25lTWFwcGluZy5jbGFzcy5pc0luc3RhbmNlKGphbSkpCi0JCQlyZXR1cm47Ci0JCQotCQl0cnkgewotCQlpZiAobHNuICE9IG51bGwpIAotCQkJamFtLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9uYWxNYXBwaW5nLlNQRUNJRklFRF9PUFRJT05BTF9QUk9QRVJUWSwgbHNuKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQlsc24gPSBuZXcgQXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJamFtLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9uYWxNYXBwaW5nLlNQRUNJRklFRF9PUFRJT05BTF9QUk9QRVJUWSwgbHNuKTsKLQkJcmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8QXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5Q2hhbmdlTGlzdGVuZXI+KGxzbik7Ci0JCWF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eVRvUHJvcExpc3RlbmVyLnB1dChqcGEsIHJlZik7Ci0JfQotCQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVyc1RvUHJvamVjdChKcGFQcm9qZWN0IHByb2opIHsKLQkJYWRkRW50aXRpZXNMaXN0ZW5lclRvUHJvamVjdChwcm9qKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRW50aXRpZXNMaXN0ZW5lclRvUHJvamVjdChKcGFQcm9qZWN0IHByb2opIHsKLQkJV2Vha1JlZmVyZW5jZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxzbnJSZWYgPSBwcm9qZWN0VG9FbnRpdHlMaXN0ZW5lci5nZXQocHJvaik7Ci0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsc25yID0gbnVsbDsKLQkJaWYgKGxzbnJSZWYgIT0gbnVsbCkKLQkJCWxzbnIgPSBsc25yUmVmLmdldCgpOwotCQlpZiAobHNuciA9PSBudWxsKSB7Ci0JCQkvKgotCQkJaWYgKCFwcm9qLmdldFVwZGF0ZXIoKS5nZXRDbGFzcygpLmlzSW5zdGFuY2UoU3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlci5jbGFzcykpCi0JCQkJcHJvai5zZXRVcGRhdGVyKG5ldyBTeW5jaHJvbm91c0pwYVByb2plY3RVcGRhdGVyKHByb2opKTsKLQkJCSovCi0JCQlsc25yID0gbmV3IEpQQVByb2plY3RMaXN0ZW5lcigpOwotCQkJcHJvai5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoSnBhUHJvamVjdC5KUEFfRklMRVNfQ09MTEVDVElPTiwgbHNucik7Ci0JCQlsc25yUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPihsc25yKTsKLQkJCXByb2plY3RUb0VudGl0eUxpc3RlbmVyLnB1dChwcm9qLCBsc25yUmVmKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnNUb0VudGl0eShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCWFkZEF0TGlzdGVuZXJUb0VudGl0eShqcHQpOwotCQlhZGRQcm9wZXJ0aWVzTGlzdGVuZXJUb0VudGl0eShqcHQpOwotCQlhZGRTdGF0ZUxpc3RlbmVyVG9FbnRpdHkoanB0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQXRMaXN0ZW5lclRvRW50aXR5KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJV2Vha1JlZmVyZW5jZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxzbnJSZWYgPSBlbnRpdHlUb0F0TGlzdGVuZXIuZ2V0KGpwdCk7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsc25yID0gbnVsbDsKLQkJaWYgKGxzbnJSZWYgIT0gbnVsbCkKLQkJCWxzbnIgPSBsc25yUmVmLmdldCgpOwotCQlpZiAobHNuciA9PSBudWxsKSB7Ci0JCQlsc25yID0gbmV3IEVudGl0eUF0dHJpYnV0ZXNDaGFuZ2VMaXN0ZW5lcigpOwotCQkJanB0LmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihKYXZhUGVyc2lzdGVudFR5cGUuQVRUUklCVVRFU19MSVNULCBsc25yKTsKLQkJCWxzbnJSZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxMaXN0Q2hhbmdlTGlzdGVuZXI+KGxzbnIpOwotCQkJZW50aXR5VG9BdExpc3RlbmVyLnB1dChqcHQsIGxzbnJSZWYpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnRpZXNMaXN0ZW5lclRvRW50aXR5KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJV2Vha1JlZmVyZW5jZTxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsc25yUmVmID0gZW50aXR5VG9Qcm9wTGlzdGVuZXIuZ2V0KGpwdCk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHNuciA9IG51bGw7Ci0JCWlmIChsc25yUmVmICE9IG51bGwpCi0JCQlsc25yID0gbHNuclJlZi5nZXQoKTsKLQkJaWYgKGxzbnIgPT0gbnVsbCkgewotCQkJbHNuciA9IG5ldyBFbnRpdHlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQlqcHQuZ2V0TWFwcGluZygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUGVyc2lzdGVudFR5cGUuTkFNRV9QUk9QRVJUWSwgbHNucik7Ci0JCQlsc25yUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4obHNucik7Ci0JCQllbnRpdHlUb1Byb3BMaXN0ZW5lci5wdXQoanB0LCBsc25yUmVmKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQcm9wZXJ0aWVzTGlzdGVuZXJUb0F0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJYWRkUHJvcGVydGllc0xpc3RlbmVyVG9BdHRyaWJ1dGVJdHNlbGYoanBhKTsKLQkJYWRkUHJvcGVydGllc0xpc3RlbmVyVG9Kb2luaW5nU3RyYXRlZ3koanBhKTsJCQotCQlhZGRQcm9wZXJ0aWVzTGlzdGVuZXJUb1JlbGF0aW9uc2hpcFJlZmVyZW5jZShqcGEpOwotCQlhZGRPcHRQcm9wTGlzdGVuZXJUb0F0dHJpYnV0ZU1hcHBpbmcoanBhKTsJCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnRpZXNMaXN0ZW5lclRvQXR0cmlidXRlSXRzZWxmKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSkgewotCQlXZWFrUmVmZXJlbmNlPEF0dHJpYnV0ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxzbnJSZWYgPSBhdHRyaWJ1dGVUb1Byb3BMaXN0ZW5lci5nZXQoanBhKTsKLQkJQXR0cmlidXRlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsc25yID0gbnVsbDsKLQkJaWYgKGxzbnJSZWYgIT0gbnVsbCkKLQkJCWxzbnIgPSBsc25yUmVmLmdldCgpOwotCQlpZiAobHNuciA9PSBudWxsKSB7Ci0JCQlsc25yID0gbmV3IEF0dHJpYnV0ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJCWpwYS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBlcnNpc3RlbnRBdHRyaWJ1dGUuTUFQUElOR19QUk9QRVJUWSwgbHNucik7Ci0JCQlsc25yUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8QXR0cmlidXRlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4obHNucik7Ci0JCQlhdHRyaWJ1dGVUb1Byb3BMaXN0ZW5lci5wdXQoanBhLCBsc25yUmVmKTsKLQkJfQkJCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE9wdFByb3BMaXN0ZW5lclRvQXR0cmlidXRlTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlDaGFuZ2VMaXN0ZW5lcj4gbHNuclJlZiA9IGF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eVRvUHJvcExpc3RlbmVyLmdldChqcGEpOwotCQlBdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlDaGFuZ2VMaXN0ZW5lciBsc25yID0gbnVsbDsKLQkJaWYgKGxzbnJSZWYgIT0gbnVsbCkKLQkJCWxzbnIgPSBsc25yUmVmLmdldCgpOwotCQlpZiAobHNuciA9PSBudWxsKSB7Ci0JCQlsc25yID0gbmV3IEF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYW0gPSBqcGEuZ2V0TWFwcGluZygpOwotCQkJaWYgKGphbSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWlmICghSmF2YU1hbnlUb09uZU1hcHBpbmcuY2xhc3MuaXNJbnN0YW5jZShqYW0pICYmCi0JCQkJCSFKYXZhT25lVG9PbmVNYXBwaW5nLmNsYXNzLmlzSW5zdGFuY2UoamFtKSkKLQkJCQlyZXR1cm47Ci0JCQlqYW0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPcHRpb25hbE1hcHBpbmcuU1BFQ0lGSUVEX09QVElPTkFMX1BST1BFUlRZLCBsc25yKTsKLQkJCWxzbnJSZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlDaGFuZ2VMaXN0ZW5lcj4obHNucik7Ci0JCQlhdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlUb1Byb3BMaXN0ZW5lci5wdXQoanBhLCBsc25yUmVmKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgYWRkUHJvcGVydGllc0xpc3RlbmVyVG9Kb2luaW5nU3RyYXRlZ3koSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCQotCQlXZWFrUmVmZXJlbmNlPEF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxzbnJSZWYgPSBhdHRyaWJ1dGVKb2luaW5nU3RyYXRlZ3lUb1Byb3BMaXN0ZW5lci5nZXQoanBhKTsKLQkJQXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsc25yID0gbnVsbDsKLQkJbHNuclJlZiA9IGF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVRvUHJvcExpc3RlbmVyLmdldChqcGEpOwotCQlsc25yID0gbnVsbDsKLQkJaWYgKGxzbnJSZWYgIT0gbnVsbCkKLQkJCWxzbnIgPSBsc25yUmVmLmdldCgpOwotCQlpZiAobHNuciA9PSBudWxsKSB7Ci0JCQlsc25yID0gbmV3IEF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphbSA9IGpwYS5nZXRNYXBwaW5nKCk7Ci0JCQlpZiAoKGphbSA9PSBudWxsKSB8fCAhUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcy5pc0luc3RhbmNlKGphbSkpCi0JCQkJcmV0dXJuOwotCQkJUmVsYXRpb25zaGlwIHJyID0gKChSZWxhdGlvbnNoaXBNYXBwaW5nKSBqYW0pLmdldFJlbGF0aW9uc2hpcCgpOwotCQkJaWYgKHJyID09IG51bGwpCi0JCQkJcmV0dXJuOwkJCQotCQkJUmVsYXRpb25zaGlwU3RyYXRlZ3kganMgPSByci5nZXRTdHJhdGVneSgpOwotCQkJaWYgKChqcyA9PSBudWxsKSB8fCAhTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneS5jbGFzcy5pc0luc3RhbmNlKGpzKSkKLQkJCQlyZXR1cm47Ci0JCQlsc25yUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8QXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4obHNucik7Ci0JCQlhdHRyaWJ1dGVKb2luaW5nU3RyYXRlZ3lUb1Byb3BMaXN0ZW5lci5wdXQoanBhLCBsc25yUmVmKTsKLQkJfQotCQkKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnRpZXNMaXN0ZW5lclRvUmVsYXRpb25zaGlwUmVmZXJlbmNlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSkgewotCQkKLQkJV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsc25yUmVmID0gYXR0cmlidXRlUmVsYXRpb25zaGlwUmVmZXJlbmNlVG9Qcm9wTGlzdGVuZXIuZ2V0KGpwYSk7Ci0JCUF0dHJpYnV0ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHNuciA9IG51bGw7Ci0JCWxzbnJSZWYgPSBhdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VUb1Byb3BMaXN0ZW5lci5nZXQoanBhKTsKLQkJbHNuciA9IG51bGw7Ci0JCWlmIChsc25yUmVmICE9IG51bGwpCi0JCQlsc25yID0gbHNuclJlZi5nZXQoKTsKLQkJaWYgKGxzbnIgPT0gbnVsbCkgewotCQkJbHNuciA9IG5ldyBBdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYW0gPSBqcGEuZ2V0TWFwcGluZygpOwotCQkJaWYgKChqYW0gPT0gbnVsbCkgfHwgIVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MuaXNJbnN0YW5jZShqYW0pKQotCQkJCXJldHVybjsKLQkJCVJlbGF0aW9uc2hpcCByciA9ICgoUmVsYXRpb25zaGlwTWFwcGluZykgamFtKS5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJCWlmIChyciA9PSBudWxsKQotCQkJCXJldHVybjsJCQotCQkJcnIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihSZWFkT25seVJlbGF0aW9uc2hpcC5TVFJBVEVHWV9QUk9QRVJUWSwgbHNucik7Ci0JCQlyci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbmFsTWFwcGluZy5TUEVDSUZJRURfT1BUSU9OQUxfUFJPUEVSVFksIG5ldyBBdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJCWxzbnJSZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPihsc25yKTsKLQkJCWF0dHJpYnV0ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZVRvUHJvcExpc3RlbmVyLnB1dChqcGEsIGxzbnJSZWYpOwotCQl9Ci0JCQotCX0KLQkKLQotCQotCXByaXZhdGUgdm9pZCBhZGRTdGF0ZUxpc3RlbmVyVG9FbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlXZWFrUmVmZXJlbmNlPFN0YXRlQ2hhbmdlTGlzdGVuZXI+IGxzbnJSZWYgPSBlbnRpdHlUb1N0YXRlTGlzdGVuZXIuZ2V0KGpwdCk7Ci0JCVN0YXRlQ2hhbmdlTGlzdGVuZXIgbHNuciA9IG51bGw7Ci0JCWlmIChsc25yUmVmICE9IG51bGwpCi0JCQlsc25yID0gbHNuclJlZi5nZXQoKTsKLQkJaWYgKGxzbnIgPT0gbnVsbCkgewotCQkJbHNuciA9IG5ldyBFbnRpdHlTdGF0ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQlqcHQuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsc25yKTsKLQkJCWxzbnJSZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxTdGF0ZUNoYW5nZUxpc3RlbmVyPihsc25yKTsKLQkJCWVudGl0eVRvU3RhdGVMaXN0ZW5lci5wdXQoanB0LCBsc25yUmVmKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVMaXN0ZW5lcnNGcm9tRW50aXR5KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJcmVtb3ZlQXRMaXN0ZW5lckZyb21FbnRpdHkoanB0KTsKLQkJcmVtb3ZlUHJvcExpc3RlbmVyRnJvbUVudGl0eShqcHQpOwotCQlyZW1vdmVTdGF0ZUxpc3RlbmVyRnJvbUVudGl0eShqcHQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlTGlzdGVuZXJzRnJvbUF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJcmVtb3ZlUHJvcExpc3RlbmVyRnJvbUF0dHJpYnV0ZShqcGEpOwotCX0JCi0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQXRMaXN0ZW5lckZyb21FbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlXZWFrUmVmZXJlbmNlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbHNuclJlZiA9IGVudGl0eVRvQXRMaXN0ZW5lci5nZXQoanB0KTsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxzbnIgPSBudWxsOwotCQlpZiAobHNuclJlZiAhPSBudWxsKQotCQkJbHNuciA9IGxzbnJSZWYuZ2V0KCk7Ci0JCWlmIChsc25yICE9IG51bGwpIHsKLQkJCWVudGl0eVRvQXRMaXN0ZW5lci5yZW1vdmUoanB0KTsKLQkJCWpwdC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoSmF2YVBlcnNpc3RlbnRUeXBlLkFUVFJJQlVURVNfTElTVCwgbHNucik7CQkJCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJvcExpc3RlbmVyRnJvbUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCVdlYWtSZWZlcmVuY2U8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gbHNuclJlZiA9IGVudGl0eVRvUHJvcExpc3RlbmVyLmdldChqcHQpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxzbnIgPSBudWxsOwotCQlpZiAobHNuclJlZiAhPSBudWxsKQotCQkJbHNuciA9IGxzbnJSZWYuZ2V0KCk7Ci0JCWlmIChsc25yICE9IG51bGwpIHsKLQkJCWVudGl0eVRvUHJvcExpc3RlbmVyLnJlbW92ZShqcHQpOwotCQkJdHJ5IHsKLQkJCQlqcHQuZ2V0TWFwcGluZygpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUGVyc2lzdGVudFR5cGUuTkFNRV9QUk9QRVJUWSwgbHNucik7CQkJCQotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyROT04tTkxTLTEkCi0JCQl9CQkKLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVByb3BMaXN0ZW5lckZyb21BdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCXJlbW92ZVByb3BMaXN0ZW5lckZyb21BdHRyaWJ1dGVJdHNlbGYoanBhKTsKLQkJcmVtb3ZlUHJvcExpc3RlbmVyRnJvbUpvaW5pbmdTdHJhdGVneShqcGEpOwotCQlyZW1vdmVQcm9wTGlzdGVuZXJGcm9tUmVsYXRpb25zaGlwUmVmZXJlbmNlKGpwYSk7Ci0JCXJlbW92ZU9wdFByb3BMaXN0ZW5lckZyb21BdHRyaWJ1dGVNYXBwaW5nKGpwYSk7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJvcExpc3RlbmVyRnJvbUF0dHJpYnV0ZUl0c2VsZihKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsc25yUmVmID0gYXR0cmlidXRlVG9Qcm9wTGlzdGVuZXIuZ2V0KGpwYSk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHNuciA9IG51bGw7Ci0JCWlmIChsc25yUmVmICE9IG51bGwpCi0JCQlsc25yID0gbHNuclJlZi5nZXQoKTsKLQkJaWYgKGxzbnIgIT0gbnVsbCkgewotCQkJYXR0cmlidXRlVG9Qcm9wTGlzdGVuZXIucmVtb3ZlKGpwYSk7Ci0JCQl0cnkgewotCQkJCWpwYS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBlcnNpc3RlbnRBdHRyaWJ1dGUuTUFQUElOR19QUk9QRVJUWSwgbHNucik7CQkJCQotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyROT04tTkxTLTEkCi0JCQl9CQkKLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVByb3BMaXN0ZW5lckZyb21Kb2luaW5nU3RyYXRlZ3koSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCVdlYWtSZWZlcmVuY2U8QXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gbHNuclJlZiA9IGF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVRvUHJvcExpc3RlbmVyLmdldChqcGEpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxzbnIgPSBudWxsOwkJCi0JCWxzbnJSZWYgPSBhdHRyaWJ1dGVKb2luaW5nU3RyYXRlZ3lUb1Byb3BMaXN0ZW5lci5nZXQoanBhKTsKLQkJbHNuciA9IG51bGw7Ci0JCWlmIChsc25yUmVmICE9IG51bGwpCi0JCQlsc25yID0gbHNuclJlZi5nZXQoKTsKLQkJaWYgKGxzbnIgIT0gbnVsbCkgewotCQkJYXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5VG9Qcm9wTGlzdGVuZXIucmVtb3ZlKGpwYSk7Ci0JCQl0cnkgewkJCQotCQkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphbSA9IGpwYS5nZXRNYXBwaW5nKCk7Ci0JCQkJaWYgKChqYW0gPT0gbnVsbCkgfHwgIVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MuaXNJbnN0YW5jZShqYW0pKQotCQkJCQlyZXR1cm47Ci0JCQkJUmVsYXRpb25zaGlwIHJyID0gKChSZWxhdGlvbnNoaXBNYXBwaW5nKSBqYW0pLmdldFJlbGF0aW9uc2hpcCgpOwotCQkJCWlmIChyciA9PSBudWxsKQotCQkJCQlyZXR1cm47CQkJCi0JCQkJUmVsYXRpb25zaGlwU3RyYXRlZ3kganMgPSByci5nZXRTdHJhdGVneSgpOwotCQkJCWlmICgoanMgPT0gbnVsbCkgfHwgIU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kuY2xhc3MuaXNJbnN0YW5jZShqcykpCi0JCQkJCXJldHVybjsKLQkJCQlqcy5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kuTUFQUEVEX0JZX0FUVFJJQlVURV9QUk9QRVJUWSwgbHNucik7CQkJCQkJCQotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyROT04tTkxTLTEkCi0JCQl9CQkKLQkJfQkJCi0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlT3B0UHJvcExpc3RlbmVyRnJvbUF0dHJpYnV0ZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCVdlYWtSZWZlcmVuY2U8QXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5Q2hhbmdlTGlzdGVuZXI+IGxzbnJSZWYgPSBhdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlUb1Byb3BMaXN0ZW5lci5nZXQoanBhKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsc25yID0gbnVsbDsJCQotCQlsc25yUmVmID0gYXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5VG9Qcm9wTGlzdGVuZXIuZ2V0KGpwYSk7Ci0JCWxzbnIgPSBudWxsOwotCQlpZiAobHNuclJlZiAhPSBudWxsKQotCQkJbHNuciA9IGxzbnJSZWYuZ2V0KCk7Ci0JCWlmIChsc25yICE9IG51bGwpIHsKLQkJCWF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eVRvUHJvcExpc3RlbmVyLnJlbW92ZShqcGEpOwotCQkJdHJ5IHsJCQkKLQkJCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYW0gPSBqcGEuZ2V0TWFwcGluZygpOwotCQkJCWlmICgoamFtID09IG51bGwpIHx8ICFSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzLmlzSW5zdGFuY2UoamFtKSkKLQkJCQkJcmV0dXJuOwotCQkJCWphbS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbmFsTWFwcGluZy5TUEVDSUZJRURfT1BUSU9OQUxfUFJPUEVSVFksIGxzbnIpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyROT04tTkxTLTEkCi0JCQl9CQkKLQkJfQkJCi0JfQkKLQkKLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJvcExpc3RlbmVyRnJvbVJlbGF0aW9uc2hpcFJlZmVyZW5jZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsc25yUmVmID0gYXR0cmlidXRlUmVsYXRpb25zaGlwUmVmZXJlbmNlVG9Qcm9wTGlzdGVuZXIuZ2V0KGpwYSk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHNuciA9IG51bGw7CQkKLQkJbHNuclJlZiA9IGF0dHJpYnV0ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZVRvUHJvcExpc3RlbmVyLmdldChqcGEpOwotCQlsc25yID0gbnVsbDsKLQkJaWYgKGxzbnJSZWYgIT0gbnVsbCkKLQkJCWxzbnIgPSBsc25yUmVmLmdldCgpOwotCQlpZiAobHNuciAhPSBudWxsKSB7Ci0JCQlhdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VUb1Byb3BMaXN0ZW5lci5yZW1vdmUoanBhKTsKLQkJCXRyeSB7CQkJCi0JCQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamFtID0ganBhLmdldE1hcHBpbmcoKTsKLQkJCQlpZiAoKGphbSA9PSBudWxsKSB8fCAhUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcy5pc0luc3RhbmNlKGphbSkpCi0JCQkJCXJldHVybjsKLQkJCQlSZWxhdGlvbnNoaXAgcnIgPSAoKFJlbGF0aW9uc2hpcE1hcHBpbmcpIGphbSkuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQkJaWYgKHJyID09IG51bGwpCi0JCQkJCXJldHVybjsJCQkKLQkJCQlyci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFJlYWRPbmx5UmVsYXRpb25zaGlwLlNUUkFURUdZX1BST1BFUlRZLCBsc25yKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8kTk9OLU5MUy0xJAotCQkJfQkJCi0JCX0JCQkJCi0JfQotCQkKLQotCXByaXZhdGUgdm9pZCByZW1vdmVTdGF0ZUxpc3RlbmVyRnJvbUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCVdlYWtSZWZlcmVuY2U8U3RhdGVDaGFuZ2VMaXN0ZW5lcj4gbHNuclJlZiA9IGVudGl0eVRvU3RhdGVMaXN0ZW5lci5nZXQoanB0KTsKLQkJU3RhdGVDaGFuZ2VMaXN0ZW5lciBsc25yID0gbnVsbDsKLQkJaWYgKGxzbnJSZWYgIT0gbnVsbCkKLQkJCWxzbnIgPSBsc25yUmVmLmdldCgpOwotCQlpZiAobHNuciAhPSBudWxsKSB7Ci0JCQllbnRpdHlUb1N0YXRlTGlzdGVuZXIucmVtb3ZlKGpwdCk7Ci0JCQlqcHQucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihsc25yKTsJCQkKLQkJfQotCX0KLQotCS8vLS0tLS0tLS0tLS0tLS0tCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUVudGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudFR5cGU+IGl0ID0gZW50aXR5VG9TdGF0ZUxpc3RlbmVyLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCVNldDxKYXZhUGVyc2lzdGVudFR5cGU+IHMgPSBuZXcgSGFzaFNldDxKYXZhUGVyc2lzdGVudFR5cGU+KCk7Ci0JCXdoaWxlKGl0Lmhhc05leHQoKSkgCi0JCQlzLmFkZChpdC5uZXh0KCkpOwotCQlpdCA9IHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gaXQubmV4dCgpOwotCQkJV2Vha1JlZmVyZW5jZTxTdGF0ZUNoYW5nZUxpc3RlbmVyPiByZWYgPSBlbnRpdHlUb1N0YXRlTGlzdGVuZXIucmVtb3ZlKGpwdCk7Ci0JCQlTdGF0ZUNoYW5nZUxpc3RlbmVyIGxzbiA9IHJlZi5nZXQoKTsKLQkJCWlmIChsc24gIT0gbnVsbCkgCi0JCQkJanB0LnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIobHNuKTsKLQkJfQotCQllbnRpdHlUb1N0YXRlTGlzdGVuZXIuY2xlYXIoKTsKLQkJZW50aXR5VG9TdGF0ZUxpc3RlbmVyID0gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUVudGl0eVByb3BDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50VHlwZT4gaXQgPSBlbnRpdHlUb1Byb3BMaXN0ZW5lci5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlTZXQ8SmF2YVBlcnNpc3RlbnRUeXBlPiBzID0gbmV3IEhhc2hTZXQ8SmF2YVBlcnNpc3RlbnRUeXBlPigpOwotCQl3aGlsZShpdC5oYXNOZXh0KCkpIAotCQkJcy5hZGQoaXQubmV4dCgpKTsKLQkJaXQgPSBzLml0ZXJhdG9yKCk7CQkKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gaXQubmV4dCgpOwotCQkJV2Vha1JlZmVyZW5jZTxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiByZWYgPSBlbnRpdHlUb1Byb3BMaXN0ZW5lci5yZW1vdmUoanB0KTsKLQkJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHNuID0gcmVmLmdldCgpOwotCQkJaWYgKGxzbiAhPSBudWxsKSAKLQkJCQlqcHQuZ2V0TWFwcGluZygpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUGVyc2lzdGVudFR5cGUuTkFNRV9QUk9QRVJUWSwgbHNuKTsKLQkJfQotCQllbnRpdHlUb1Byb3BMaXN0ZW5lci5jbGVhcigpOwotCQllbnRpdHlUb1Byb3BMaXN0ZW5lciA9IG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVBdHRyaWJ1dGVQcm9wQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gaXQgPSBhdHRyaWJ1dGVUb1Byb3BMaXN0ZW5lci5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlTZXQ8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHMgPSBuZXcgSGFzaFNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSAKLQkJCXMuYWRkKGl0Lm5leHQoKSk7Ci0JCWl0ID0gcy5pdGVyYXRvcigpOwkJCi0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhID0gaXQubmV4dCgpOwotCQkJV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiByZWYgPSBhdHRyaWJ1dGVUb1Byb3BMaXN0ZW5lci5yZW1vdmUoanBhKTsKLQkJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHNuID0gcmVmLmdldCgpOwotCQkJaWYgKGxzbiAhPSBudWxsKSAKLQkJCQl0cnkgewotCQkJCQlqcGEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQZXJzaXN0ZW50QXR0cmlidXRlLk1BUFBJTkdfUFJPUEVSVFksIGxzbik7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJfQotCQlhdHRyaWJ1dGVUb1Byb3BMaXN0ZW5lci5jbGVhcigpOwotCQlhdHRyaWJ1dGVUb1Byb3BMaXN0ZW5lciA9IG51bGw7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlQXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcENoYW5nZUxpc3RlbmVycygpIHsKLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGl0ID0gYXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5VG9Qcm9wTGlzdGVuZXIua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJU2V0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBzID0gbmV3IEhhc2hTZXQ8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCXdoaWxlKGl0Lmhhc05leHQoKSkgCi0JCQlzLmFkZChpdC5uZXh0KCkpOwotCQlpdCA9IHMuaXRlcmF0b3IoKTsJCQotCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSA9IGl0Lm5leHQoKTsKLQkJCVdlYWtSZWZlcmVuY2U8QXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gcmVmID0gYXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5VG9Qcm9wTGlzdGVuZXIucmVtb3ZlKGpwYSk7Ci0JCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxzbiA9IHJlZi5nZXQoKTsKLQkJCWlmIChsc24gIT0gbnVsbCkgCi0JCQkJdHJ5IHsKLQkJCQkJanBhLmdldE1hcHBpbmcoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kuTUFQUEVEX0JZX0FUVFJJQlVURV9QUk9QRVJUWSwgbHNuKTsKLQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJfQotCQl9Ci0JCWF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVRvUHJvcExpc3RlbmVyLmNsZWFyKCk7Ci0JCWF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVRvUHJvcExpc3RlbmVyID0gbnVsbDsKLQl9CQkKLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlT3B0UHJvcExpc3RlbmVycygpIHsKLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGl0ID0gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlUb1Byb3BMaXN0ZW5lci5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlTZXQ8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHMgPSBuZXcgSGFzaFNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSAKLQkJCXMuYWRkKGl0Lm5leHQoKSk7Ci0JCWl0ID0gcy5pdGVyYXRvcigpOwkJCi0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhID0gaXQubmV4dCgpOwotCQkJV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlDaGFuZ2VMaXN0ZW5lcj4gcmVmID0gYXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5VG9Qcm9wTGlzdGVuZXIucmVtb3ZlKGpwYSk7Ci0JCQlpZiAocmVmID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxzbiA9IHJlZi5nZXQoKTsKLQkJCWlmIChsc24gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphbSA9IGpwYS5nZXRNYXBwaW5nKCk7Ci0JCQlpZiAoKGphbSA9PSBudWxsKSB8fCAhUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcy5pc0luc3RhbmNlKGphbSkpCi0JCQkJY29udGludWU7CQkJCi0JCQl0cnkgewotCQkJCWphbS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbmFsTWFwcGluZy5TUEVDSUZJRURfT1BUSU9OQUxfUFJPUEVSVFksIGxzbik7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCS8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlhdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VUb1Byb3BMaXN0ZW5lci5jbGVhcigpOwotCQlhdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VUb1Byb3BMaXN0ZW5lciA9IG51bGw7CQkKLQl9CQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVFbnRpdHlBdHRyaWJ1dGVDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50VHlwZT4gaXQgPSBlbnRpdHlUb0F0TGlzdGVuZXIua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJU2V0PEphdmFQZXJzaXN0ZW50VHlwZT4gcyA9IG5ldyBIYXNoU2V0PEphdmFQZXJzaXN0ZW50VHlwZT4oKTsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSAKLQkJCXMuYWRkKGl0Lm5leHQoKSk7Ci0JCWl0ID0gcy5pdGVyYXRvcigpOwkJCi0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IGl0Lm5leHQoKTsKLQkJCVdlYWtSZWZlcmVuY2U8TGlzdENoYW5nZUxpc3RlbmVyPiByZWYgPSBlbnRpdHlUb0F0TGlzdGVuZXIucmVtb3ZlKGpwdCk7Ci0JCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbHNuID0gcmVmLmdldCgpOwotCQkJaWYgKGxzbiAhPSBudWxsKSAKLQkJCQlqcHQucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKEphdmFQZXJzaXN0ZW50VHlwZS5BVFRSSUJVVEVTX0xJU1QsIGxzbik7Ci0JCX0KLQkJZW50aXR5VG9BdExpc3RlbmVyLmNsZWFyKCk7Ci0JCWVudGl0eVRvQXRMaXN0ZW5lciA9IG51bGw7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJvamVjdExpc3RlbmVycygpIHsJCQotCQlJdGVyYXRvcjxKcGFQcm9qZWN0PiBpdCA9IHByb2plY3RUb0VudGl0eUxpc3RlbmVyLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCVNldDxKcGFQcm9qZWN0PiBzID0gbmV3IEhhc2hTZXQ8SnBhUHJvamVjdD4oKTsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSAKLQkJCXMuYWRkKGl0Lm5leHQoKSk7Ci0JCWl0ID0gcy5pdGVyYXRvcigpOwkJCi0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJSnBhUHJvamVjdCBwcm9qZWN0ID0gaXQubmV4dCgpOwotCQkJV2Vha1JlZmVyZW5jZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IHJlZiA9IHByb2plY3RUb0VudGl0eUxpc3RlbmVyLnJlbW92ZShwcm9qZWN0KTsKLQkJCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsc24gPSByZWYuZ2V0KCk7Ci0JCQlpZiAobHNuICE9IG51bGwpIAotCQkJCXByb2plY3QucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKEpwYVByb2plY3QuSlBBX0ZJTEVTX0NPTExFQ1RJT04sIGxzbik7Ci0JCX0KLQkJcHJvamVjdFRvRW50aXR5TGlzdGVuZXIuY2xlYXIoKTsKLQkJcHJvamVjdFRvRW50aXR5TGlzdGVuZXIgPSBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlQWxsTGlzdGVuZXJzKCkgewotCQlyZW1vdmVPcHRQcm9wTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlQXR0cmlidXRlUHJvcENoYW5nZUxpc3RlbmVycygpOwotCQlyZW1vdmVFbnRpdHlTdGF0ZUNoYW5nZUxpc3RlbmVycygpOwkKLQkJcmVtb3ZlRW50aXR5UHJvcENoYW5nZUxpc3RlbmVycygpOwotCQlyZW1vdmVFbnRpdHlBdHRyaWJ1dGVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlUHJvamVjdExpc3RlbmVycygpOwotCQllY2xpcHNlRmFjYWRlLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gaXQgPSBrZXlUb0JPLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBibyA9IGl0Lm5leHQoKTsKLQkJCWlmICghSmF2YVBlcnNpc3RlbnRUeXBlLmNsYXNzLmlzSW5zdGFuY2UoYm8pKQotCQkJCWNvbnRpbnVlOwotCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHV0aWwuZ2V0Q29tcGlsYXRpb25Vbml0KCgoSmF2YVBlcnNpc3RlbnRUeXBlKWJvKSk7Ci0JCQl1dGlsLmRpc2NhcmRXb3JraW5nQ29weU9uY2UoY3UpOwotCQl9Ci0JCQotCQl1dGlsID0gbnVsbDsKLQkJa2V5VG9CTy5jbGVhcigpOwotCQlhdHRyaWJUb1JlbC5jbGVhcigpOwotCQlwZXJzaXN0ZW50VHlwZXMuY2xlYXIoKTsKLQkJa2V5VG9CTyA9IG51bGw7Ci0JCWF0dHJpYlRvUmVsID0gbnVsbDsKLQkJcGVyc2lzdGVudFR5cGVzID0gbnVsbDsKLQkJcmVtb3ZlQWxsTGlzdGVuZXJzKCk7Ci0JCWZlYXR1cmVQcm92aWRlciA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAoSlBBU29sdmVyLmNsYXNzKSB7Ci0JCQlzb2x2ZXJzU2V0LnJlbW92ZSh0aGlzKTsKLQkJCWlmIChzb2x2ZXJzU2V0LmlzRW1wdHkoKSkgewotCQkJCUphdmFDb3JlLnJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIod2Nsc25yKTsKLQkJCQl3Y2xzbnIgPSBudWxsOwotCQkJfQotCQl9Ci0JfQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBrZXlUb0JPLmNvbnRhaW5zS2V5KGtleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzdG9yZUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCWlmIChqcHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JCUpQQUVkaXRvclV0aWwuZGlzY2FyZFdvcmtpbmdDb3B5T25jZShjdSk7Ci0JCUpQQUVkaXRvclV0aWwuYmVjb21lV29ya2luZ0NvcHkoY3UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpZ25vcmVFdmVudHMgPSBmYWxzZTsgCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBXb3JraW5nQ29weUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgewotCQlzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgIGVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCU9iamVjdCBvID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQlpZiAoIUlKYXZhRWxlbWVudERlbHRhLmNsYXNzLmlzSW5zdGFuY2UobykpCi0JCQkJcmV0dXJuOwotCi0JCQlJSmF2YUVsZW1lbnREZWx0YSBqZWQgPSAoSUphdmFFbGVtZW50RGVsdGEpbzsKLQkJCVNldDxJQ29tcGlsYXRpb25Vbml0PiBhZmZlY3RlZENvbXBpbGF0aW9uVW5pdHMgPSBnZXRBZmZlY3RlZENvbXBpbGF0aW9uVW5pdHMoamVkKTsKLQkJCQotCQkJZm9yIChJQ29tcGlsYXRpb25Vbml0IGN1IDogYWZmZWN0ZWRDb21waWxhdGlvblVuaXRzKSB7Ci0JCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IEpQQUVkaXRvclV0aWwuZ2V0SlBUeXBlKGN1KTsKLQkJCQlmb3IgKGZpbmFsIEpQQVNvbHZlciBzb2x2ZXIgOiBzb2x2ZXJzU2V0KSB7Ci0JCQkJCWZpbmFsIENvbnRhaW5lclNoYXBlIGNzID0gKENvbnRhaW5lclNoYXBlKXNvbHZlci5mZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0JCQkJCWlmIChjcyA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCQlTdHJpbmcgZW50TmFtZSA9IEpQQUVkaXRvclV0aWwuZ2V0VGV4dChqcHQpOwotCQkJCQl0cnkgewotCQkJCQkJZmluYWwgU3RyaW5nIG5ld0hlYWRlciA9IChjdS5oYXNVbnNhdmVkQ2hhbmdlcygpID8gIiogIiA6ICIiKSArIGVudE5hbWU7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJR3JhcGhpY3NVcGRhdGVyLnVwZGF0ZUhlYWRlcihjcywgbmV3SGVhZGVyKTsKLQkJCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlYXJyYW5nZUlzQVJlbGF0aW9uc0luVHJhbnNhY3Rpb24oc29sdmVyLmZlYXR1cmVQcm92aWRlcik7Ci0JCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3QgY2hlY2sgY29tcGlsYXRpb24gdW5pdCBmb3IgdW5zYXZlZCBjaGFuZ2VzIiwgZSk7IC8vJE5PTi1OTFMtMSQJCQkJIAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIFNldDxJQ29tcGlsYXRpb25Vbml0PiBnZXRBZmZlY3RlZENvbXBpbGF0aW9uVW5pdHMoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsgCi0JCQlTZXQ8SUNvbXBpbGF0aW9uVW5pdD4gcmVzID0gbmV3IEhhc2hTZXQ8SUNvbXBpbGF0aW9uVW5pdD4oKTsKLQkJCUlKYXZhRWxlbWVudCBlbCA9IGRlbHRhLmdldEVsZW1lbnQoKTsKLQkJCWlmIChJQ29tcGlsYXRpb25Vbml0LmNsYXNzLmlzSW5zdGFuY2UoZWwpKQotCQkJCXJlcy5hZGQoKElDb21waWxhdGlvblVuaXQpZWwpOwotCQkJSUphdmFFbGVtZW50RGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldENoYW5nZWRDaGlsZHJlbigpOwotCQkJZm9yIChJSmF2YUVsZW1lbnREZWx0YSBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0JCQkJU2V0PElDb21waWxhdGlvblVuaXQ+IGN1cyA9IGdldEFmZmVjdGVkQ29tcGlsYXRpb25Vbml0cyhjaGlsZCk7Ci0JCQkJcmVzLmFkZEFsbChjdXMpOwotCQkJfQotCQkJcmV0dXJuIHJlczsKLQkJfQotCX0KLQkKLQlwdWJsaWMgY2xhc3MgSlBBUHJvamVjdExpc3RlbmVyIGltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHsJCQkJCi0KLQkJc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChpZ25vcmVFdmVudHMpCi0JCQkJcmV0dXJuOwotCi0JCQlJdGVyYXRvcjw/PiBpdCA9IGV2ZW50LmdldEl0ZW1zKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoIShvIGluc3RhbmNlb2YgSnBhRmlsZSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWZpbmFsIEpwYUZpbGUganBhRmlsZSA9IChKcGFGaWxlKW87Ci0JCQkJSnB0UmVzb3VyY2VNb2RlbCBqcm0gPSAoKEpwYUZpbGUpbykuZ2V0UmVzb3VyY2VNb2RlbCgpOwotCQkJCWlmICghSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmNsYXNzLmlzSW5zdGFuY2UoanJtKSkKLQkJCQkJY29udGludWU7Ci0JCQkJSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGpyY3UgPSAoSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KWpybTsKLQkJCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUganJhdCA9IGpyY3UuZ2V0UHJpbWFyeVR5cGUoKTsKLQkJCQlTdHJpbmcgbmFtZSA9IGpyYXQuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkJCQotCQkJCUpwYVByb2plY3QganBhUHJvamVjdCA9IGpwYUZpbGUuZ2V0SnBhUHJvamVjdCgpOwotCQkJCVBlcnNpc3RlbmNlVW5pdCBwdSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdChqcGFQcm9qZWN0KTsKLQkJCQlpZihwdSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlwdS5nZXRQZXJzaXN0ZW50VHlwZShuYW1lKTsKLQkJCQlmaW5hbCBDb250YWluZXJTaGFwZSBjcyA9IChDb250YWluZXJTaGFwZSlmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0JCQkJaWYgKGNzID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlmaW5hbCBSZW1vdmVDb250ZXh0IGN0eCA9IG5ldyBSZW1vdmVDb250ZXh0KGNzKTsKLQkJCQlmaW5hbCBJUmVtb3ZlRmVhdHVyZSBmdCA9IGZlYXR1cmVQcm92aWRlci5nZXRSZW1vdmVGZWF0dXJlKGN0eCk7OwotCQkJCVJ1bm5hYmxlIHIgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGNzKTsKLQkJCQkJCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQkJCQkJZnQucmVtb3ZlKGN0eCk7Ci0JCQkJCQkJfQkJCQkJCQotCQkJCQkJfSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKHIpOwotCQkJfQkJCQotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgYXJnMCkge30KLQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHt9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHt9Ci0JfTsKLQotCXB1YmxpYyBjbGFzcyBFbnRpdHlTdGF0ZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgU3RhdGVDaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgRW50aXR5QXR0cmlidXRlc0NoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgTGlzdENoYW5nZUxpc3RlbmVyIHsKLQkJCi0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQlBZGRFbnRpdHlBdHRyaWJ1dGVzIHRhc2sgPSBuZXcgQWRkRW50aXR5QXR0cmlidXRlcyhldmVudCk7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWModGFzayk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQlSZW1vdmVFbnRpdHlBdHRyaWJ1dGVzIHRhc2sgPSBuZXcgUmVtb3ZlRW50aXR5QXR0cmlidXRlcyhldmVudCk7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWModGFzayk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkge30KLQotCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgYXJnMCkge30KLQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgYXJnMCkge30KLQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBhcmcwKSB7fQotCX07Ci0KLQlwdWJsaWMgY2xhc3MgRW50aXR5UHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCQlzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCVN0cmluZyBwcm9wTmFtZSA9IGV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotCQkJaWYgKHByb3BOYW1lLmVxdWFscyhKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9TUEVDSUZJRURfTkFNRSkpIHsJCi0JCQkJZmluYWwgSmF2YUVudGl0eSBqZSA9IChKYXZhRW50aXR5KWV2ZW50LmdldFNvdXJjZSgpOwotCQkJCVJ1bm5hYmxlIGpvYiA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gZmVhdHVyZVByb3ZpZGVyLmdldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKCk7Ci0JCQkJCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJCQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBqZS5nZXRQZXJzaXN0ZW50VHlwZSgpOyAKLQkJCQkJCQkJdXBkYXRlSlBUTmFtZShqcHQpOwotCQkJCQkJCSAgICBTdHJpbmcgdGFibGVOYW1lID0gSlBBRWRpdG9yVXRpbC5mb3JtVGFibGVOYW1lKGpwdCk7Ci0JCQkJCQkJICAgIEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnNldFRhYmxlTmFtZShqcHQsIHRhYmxlTmFtZSk7Ci0JCQkJCQkJfQkJCQkJCQotCQkJCQkJfSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKGpvYik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGNsYXNzIEF0dHJpYnV0ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cwotCQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JCXN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCi0JCQlNb2RlbCBzb3VyY2UgPSBldmVudC5nZXRTb3VyY2UoKTsKLQkJCWlmICghSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuY2xhc3MuaXNJbnN0YW5jZShzb3VyY2UpKQotCQkJCXJldHVybjsKLQkJCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBmZWF0dXJlUHJvdmlkZXIKLQkJCQkJLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdCgoKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSBzb3VyY2UpCi0JCQkJCQkJLmdldFBhcmVudCgpKTsJCQkKLQkJCWZpbmFsIFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUgZnQgPSBuZXcgVXBkYXRlQXR0cmlidXRlRmVhdHVyZSgKLQkJCQkJZmVhdHVyZVByb3ZpZGVyKTsKLQkJCWZpbmFsIEN1c3RvbUNvbnRleHQgY3R4ID0gbmV3IEN1c3RvbUNvbnRleHQoKTsKLQkJCWN0eC5zZXRJbm5lclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWZ0LmV4ZWN1dGUoY3R4KTsJCQkJCQotCQkJCX0KLQkJCX07Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMocnVubmFibGUpOwotCQkJU3RyaW5nIHByb3BOYW1lID0gZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCQlpZiAocHJvcE5hbWUuZXF1YWxzKFBlcnNpc3RlbnRBdHRyaWJ1dGUuTUFQUElOR19QUk9QRVJUWSkpIHsKLQkJCQlyZW5ld0F0dHJpYnV0ZU1hcHBpbmdQcm9wTGlzdGVuZXIoKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSBzb3VyY2UpOwotCQkJfQotCQl9Ci0JfQkKLQotCS8qIAotCSAqIFRoaXMgbGlzdGVuZXIgbGlzdGVucyB3aGVuIG1hcHBlZEJ5IGhhcyBiZWVuIGNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgQXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCQkKLQkJc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkKLQkJCU1vZGVsIG0gPSBldmVudC5nZXRTb3VyY2UoKTsKLQkJCWlmICghTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneS5jbGFzcy5pc0luc3RhbmNlKG0pKQotCQkJCXJldHVybjsKLQkJCU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kganMgPSAoTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneSltOwotCQkJSnBhTm9kZSBuZCA9IGpzLmdldFBhcmVudCgpOwotCQkJaWYgKG5kID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJbmQgPSBuZC5nZXRQYXJlbnQoKTsKLQkJCWlmIChuZCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCW5kID0gbmQuZ2V0UGFyZW50KCk7Ci0JCQlpZiAoKG5kID09IG51bGwpIHx8ICFKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5jbGFzcy5pc0luc3RhbmNlKG5kKSkKLQkJCQlyZXR1cm47CQkJCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSluZDsKLQkJCWlmICghYXQuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UmVzb3VyY2UoKS5leGlzdHMoKSkKLQkJCQlyZXR1cm47Ci0JCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChhdC5nZXRQYXJlbnQoKSk7Ci0JCQlmaW5hbCBVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlIGZ0ID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyKTsgCi0JCQlmaW5hbCBDdXN0b21Db250ZXh0IGN0eCA9IG5ldyBDdXN0b21Db250ZXh0KCk7Ci0JCQljdHguc2V0SW5uZXJQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJZnQuZXhlY3V0ZShjdHgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCX0KLQl9CQkKLQkKLQkKLQlwdWJsaWMgY2xhc3MgQXR0cmlidXRlUmVsYXRpb25zaGlwUmVmZXJlbmNlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCQkKLQkJc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CQkKLQkJCVJlbGF0aW9uc2hpcCByciA9IChSZWxhdGlvbnNoaXApZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQlKcGFOb2RlIHAgPSByci5nZXRQYXJlbnQoKTsKLQkJCWlmIChwID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJcCA9IHAuZ2V0UGFyZW50KCk7Ci0JCQlpZiAocCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWlmICghSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuY2xhc3MuaXNJbnN0YW5jZShwKSkKLQkJCQlyZXR1cm47Ci0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEgPSAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpcDsKLQkJCXJlbmV3QXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlMaXN0ZW5lcihqcGEpOwotCQkJaWYgKCFqcGEuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UmVzb3VyY2UoKS5leGlzdHMoKSkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoZmVhdHVyZVByb3ZpZGVyID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoanBhLmdldFBhcmVudCgpKTsKLQkJCWZpbmFsIFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUgZnQgPSBuZXcgVXBkYXRlQXR0cmlidXRlRmVhdHVyZShmZWF0dXJlUHJvdmlkZXIpOyAKLQkJCWZpbmFsIEN1c3RvbUNvbnRleHQgY3R4ID0gbmV3IEN1c3RvbUNvbnRleHQoKTsKLQkJCWN0eC5zZXRJbm5lclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmdC5leGVjdXRlKGN0eCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsJCQotCQl9Ci0JfQkJCi0JCi0JcHVibGljIGNsYXNzIEF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkJc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlCb29sZWFuIG9wdGlvbmFsID0gKEJvb2xlYW4pZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCWJvb2xlYW4gaXNPcHRpb25hbCA9IChvcHRpb25hbCA9PSBudWxsKSA/IHRydWUgOiBvcHRpb25hbC5ib29sZWFuVmFsdWUoKTsKLQkJCU9wdGlvbmFsTWFwcGluZyBubSA9IChPcHRpb25hbE1hcHBpbmcpZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEgPSAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpbm0uZ2V0UGFyZW50KCk7Ci0JCQlJUmVsYXRpb24gcmVsID0gZmVhdHVyZVByb3ZpZGVyLmdldFJlbGF0aW9uUmVsYXRlZFRvQXR0cmlidXRlKGpwYSk7Ci0JCQlib29sZWFuIGF0QmVnaW5uaW5nID0gIXJlbC5nZXRPd25lcigpLmVxdWFscyhqcGEuZ2V0UGFyZW50KCkpIHx8IAotCQkJCQkJCQkgICFyZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkuZXF1YWxzKGpwYS5nZXROYW1lKCkpOwotCQkJZmluYWwgQ29ubmVjdGlvbiBjID0gKENvbm5lY3Rpb24pZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChyZWwpOwotCQkJQ29sbGVjdGlvbjxDb25uZWN0aW9uRGVjb3JhdG9yPiBjb25EZWNzID0gYy5nZXRDb25uZWN0aW9uRGVjb3JhdG9ycygpOwotCQkJSXRlcmF0b3I8Q29ubmVjdGlvbkRlY29yYXRvcj4gaXQgPSBjb25EZWNzLml0ZXJhdG9yKCk7Ci0JCQlmaW5hbCBTdHJpbmcgbmV3TGFiZWxUZXh0ID0gaXNPcHRpb25hbCA/IAotCQkJCQkJCQkJCUpQQUVkaXRvckNvbnN0YW50cy5DQVJESU5BTElUWV9aRVJPX09ORSA6IAotCQkJCQkJCQkJCUpQQUVkaXRvckNvbnN0YW50cy5DQVJESU5BTElUWV9PTkU7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJZmluYWwgQ29ubmVjdGlvbkRlY29yYXRvciBjZCA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoIUpQQUVkaXRvclV0aWwuaXNDYXJkaW5hbGl0eURlY29yYXRvcihjZCkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWRvdWJsZSBkID0gY2QuZ2V0TG9jYXRpb24oKTsKLQkJCQlpZiAoKGF0QmVnaW5uaW5nICYmIGQgPiAwLjUpIHx8ICghYXRCZWdpbm5pbmcgJiYgZCA8PSAwLjUpKQotCQkJCQljb250aW51ZTsKLQkJCQkKLQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihjZCk7Ci0JCQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJCQlUZXh0IHR4dCA9IChUZXh0KWNkLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCQkJCQl0eHQuc2V0VmFsdWUobmV3TGFiZWxUZXh0KTsKLQkJCQkJCQotCQkJCQkJUG9pbnQgcHQgPSBKUEFFZGl0b3JVdGlsLnJlY2FsY1RleHREZWNvcmF0b3JQb3NpdGlvbigoRnJlZUZvcm1Db25uZWN0aW9uKWMsIGNkKTsKLQkJCQkJCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldExvY2F0aW9uKHR4dCwgcHQueCwgcHQueSwgZmFsc2UpOwkJCQkJCQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9CQotCi0JcHVibGljIGNsYXNzIFJlbW92ZUVudGl0eUF0dHJpYnV0ZXMgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCUxpc3RSZW1vdmVFdmVudCBldmVudCA9IG51bGw7Ci0KLQkJcHVibGljIFJlbW92ZUVudGl0eUF0dHJpYnV0ZXMoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQl0aGlzLmV2ZW50ID0gZXZlbnQ7Ci0JCX0KLQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJQXJyYXlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gaXQgPSAoQXJyYXlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4pIGV2ZW50LmdldEl0ZW1zKCkuaXRlcmF0b3IoKTsKLQkJCQlTZXQ8U2hhcGU+IHNoYXBlc1RvUmVtb3ZlID0gbmV3IEhhc2hTZXQ8U2hhcGU+KCk7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCA9IGl0Lm5leHQoKTsKLQkJCQkJLyoKLQkJCQkJU3RyaW5nIGtleSA9IGdldEtleUZvckJ1c2luZXNzT2JqZWN0KGF0KTsKLQkJCQkJcmVtb3ZlKGtleSk7Ci0JCQkJCSovCi0JCQkJCWlmIChyZW1vdmVJZ25vcmUucmVtb3ZlKCgoUGVyc2lzdGVudFR5cGUpYXQuZ2V0UGFyZW50KCkpLmdldE5hbWUoKSArICIuIiArIGF0LmdldE5hbWUoKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlTaGFwZSBhdFNoYXBlID0gKFNoYXBlKSBmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGF0KTsKLQkJCQkJaWYgKGF0U2hhcGUgPT0gbnVsbCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQkKLQkJCQkJCi0JCQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWV2ZW50LmdldFNvdXJjZSgpOwotCQkJCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBuZXdBdCA9IGpwdC5nZXRBdHRyaWJ1dGVOYW1lZChhdC5nZXROYW1lKCkpOwotCQkJCQlpZiAobmV3QXQgIT0gbnVsbCkgewotCQkJCQkJUmVtb3ZlQXR0cmlidXRlRmVhdHVyZSBmdCA9IG5ldyBSZW1vdmVBdHRyaWJ1dGVGZWF0dXJlKGZlYXR1cmVQcm92aWRlciwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJCQlSZW1vdmVDb250ZXh0IGMgPSBuZXcgUmVtb3ZlQ29udGV4dChhdFNoYXBlKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZnQucmVtb3ZlKGMpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7Ci0JCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJQWRkQXR0cmlidXRlRmVhdHVyZSBmdDEgPSBuZXcgQWRkQXR0cmlidXRlRmVhdHVyZShmZWF0dXJlUHJvdmlkZXIpOwotCQkJCQkJQWRkQ29udGV4dCBjMSA9IG5ldyBBZGRDb250ZXh0KCk7Ci0JCQkJCQljMS5zZXROZXdPYmplY3QobmV3QXQpOwotCQkJCQkJZnQxLmFkZChjMSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQlzaGFwZXNUb1JlbW92ZS5hZGQoYXRTaGFwZSk7Ci0JCQkJCUlSZWxhdGlvbiByZWwgPSBmZWF0dXJlUHJvdmlkZXIuZ2V0UmVsYXRpb25SZWxhdGVkVG9BdHRyaWJ1dGUoYXQpOwotCQkJCQlpZiAocmVsID09IG51bGwpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJQ29ubmVjdGlvbiBjb25uID0gKENvbm5lY3Rpb24pIGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QocmVsKTsKLQkJCQkJd2hpbGUgKGNvbm4gIT0gbnVsbCkgewotCQkJCQkJUmVtb3ZlQ29udGV4dCBjdHggPSBuZXcgUmVtb3ZlQ29udGV4dChjb25uKTsKLQkJCQkJCVJlbW92ZVJlbGF0aW9uRmVhdHVyZSBmdCA9IG5ldyBSZW1vdmVSZWxhdGlvbkZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyKTsKLQkJCQkJCWZ0LnJlbW92ZShjdHgpOwotCQkJCQkJY29ubiA9IChDb25uZWN0aW9uKSBmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KHJlbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJSXRlcmF0b3I8U2hhcGU+IGl0ciA9IHNoYXBlc1RvUmVtb3ZlLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCQkJU2hhcGUgYXRTaGFwZSA9IGl0ci5uZXh0KCk7Ci0JCQkJCVJlbW92ZUNvbnRleHQgY3R4ID0gbmV3IFJlbW92ZUNvbnRleHQoYXRTaGFwZSk7Ci0JCQkJCVJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUgZnQgPSBuZXcgUmVtb3ZlQXR0cmlidXRlRmVhdHVyZShmZWF0dXJlUHJvdmlkZXIsIHRydWUsIHRydWUpOwotCQkJCQlmdC5yZW1vdmUoY3R4KTsKLQkJCQl9Ci0JCQkJQ29sbGVjdGlvbjxJUmVsYXRpb24+IHJlbHMgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5wcm9kdWNlQWxsUmVsYXRpb25zKAotCQkJCQkJKEphdmFQZXJzaXN0ZW50VHlwZSkgZXZlbnQuZ2V0U291cmNlKCksIGZlYXR1cmVQcm92aWRlcik7Ci0JCQkJSXRlcmF0b3I8SVJlbGF0aW9uPiBpdGVyID0gcmVscy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlJUmVsYXRpb24gcmVsID0gaXRlci5uZXh0KCk7Ci0JCQkJCUNvbnRhaW5lclNoYXBlIG93bmVyU2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIGZlYXR1cmVQcm92aWRlcgotCQkJCQkJCS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QocmVsLmdldE93bmVyKCkpOwotCQkJCQlDb250YWluZXJTaGFwZSBpbnZlcnNlU2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIGZlYXR1cmVQcm92aWRlcgotCQkJCQkJCS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QocmVsLmdldEludmVyc2UoKSk7Ci0JCQkJCUFkZENvbm5lY3Rpb25Db250ZXh0IGNudHggPSBuZXcgQWRkQ29ubmVjdGlvbkNvbnRleHQoSlBBRWRpdG9yVXRpbC5nZXRBbmNob3Iob3duZXJTaGFwZSksCi0JCQkJCQkJSlBBRWRpdG9yVXRpbC5nZXRBbmNob3IoaW52ZXJzZVNoYXBlKSk7Ci0JCQkJCWNudHguc2V0TmV3T2JqZWN0KHJlbCk7Ci0JCQkJCUFkZFJlbGF0aW9uRmVhdHVyZSBmdCA9IG5ldyBBZGRSZWxhdGlvbkZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyKTsKLQkJCQkJZnQuYWRkKGNudHgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQWRkRW50aXR5QXR0cmlidXRlcyBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJTGlzdEFkZEV2ZW50IGV2ZW50ID0gbnVsbDsKLQotCQlwdWJsaWMgQWRkRW50aXR5QXR0cmlidXRlcyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCXRoaXMuZXZlbnQgPSBldmVudDsKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQkJQ29udGFpbmVyU2hhcGUgZW50U2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChqcHQpOwotCQkJCQotCQkJCS8vIHJlbW92ZSBpbnZhbGlkYXRlZCByZWxhdGlvbnMgKGlmIGFueSkKLQkJCQlBcnJheUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBpdCA9IChBcnJheUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPikgZXZlbnQuZ2V0SXRlbXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQgPSBpdC5uZXh0KCk7Ci0JCQkJCS8vU2hhcGUgYXRTaGFwZSA9IChTaGFwZSkgZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChhdCk7Ci0JCQkJCS8vaWYgKGF0U2hhcGUgIT0gbnVsbCkKLQkJCQkJLy8JY29udGludWU7Ci0JCQkJCWlmIChhZGRJZ25vcmUucmVtb3ZlKCgoUGVyc2lzdGVudFR5cGUpYXQuZ2V0UGFyZW50KCkpLmdldE5hbWUoKSArICIuIiArIGF0LmdldE5hbWUoKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlBZGRDb250ZXh0IGN0eCA9IG5ldyBBZGRDb250ZXh0KCk7Ci0JCQkJCWN0eC5zZXROZXdPYmplY3QoYXQpOwotCQkJCQljdHguc2V0VGFyZ2V0Q29udGFpbmVyKGVudFNoYXBlKTsKLQkJCQkJQWRkQXR0cmlidXRlRmVhdHVyZSBmdCA9IG5ldyBBZGRBdHRyaWJ1dGVGZWF0dXJlKGZlYXR1cmVQcm92aWRlcik7Ci0JCQkJCWZ0LmFkZChjdHgpOwotCQkJCX0KLQkJCQkvL0pwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlbWFrZVJlbGF0aW9ucygoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilmZWF0dXJlUHJvdmlkZXIsIGVudFNoYXBlLCBqcHQpOwotCQkJCWZlYXR1cmVQcm92aWRlci5hZGRKUFRGb3JVcGRhdGUoanB0LmdldE5hbWUoKSk7Ci0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZEF0dHJpYkZvclVwZGF0ZShQZXJzaXN0ZW5jZVVuaXQgcHUsIFN0cmluZyBlbnRBdE1hcHBlZEJ5KSB7Ci0JCWVudGl0eU5hbWVMaXN0ZW5lci5hZGRBdHRyaWJGb3JVcGRhdGUocHUsIGVudEF0TWFwcGVkQnkpOwotCX0KLQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVKUFROYW1lKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJU3RyaW5nIGVudE5hbWUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKGpwdCk7Ci0JCWVudE5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoZW50TmFtZSk7Ci0JCUNvbnRhaW5lclNoYXBlIGVudFNoYXBlID0gKENvbnRhaW5lclNoYXBlKWZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoanB0KTsKLQkJSlBBRWRpdG9yVXRpbC5zZXRKUFROYW1lSW5TaGFwZShlbnRTaGFwZSwgZW50TmFtZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjbG9zZURpYWdyYW1FZGl0b3JJZlByb2plY3RJc0RlbGV0ZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJZmluYWwgSVJlc291cmNlIHJlc291cmNlID0gZXZlbnQuZ2V0UmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgIXJlc291cmNlLmV4aXN0cygpIHx8IGV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgfHwgKGV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFKSkgewotCQkJICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJCWZpbmFsIElEaWFncmFtVHlwZVByb3ZpZGVyIHByb3ZpZGVyID0gZmVhdHVyZVByb3ZpZGVyLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKTsKLQkJCQkJaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcikgewotCQkJCQkJZmluYWwgSlBBRGlhZ3JhbUVkaXRvciBkaWFncmFtQnlTZWxlY3RlZFByb2plY3QgPSAoKEpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIpIHByb3ZpZGVyKS5nZXREaWFncmFtRWRpdG9yKCk7Ci0JCQkJCQlmaW5hbCBEaWFncmFtIGRpYWdyYW0gPSAoKEpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIpcHJvdmlkZXIpLmdldERpYWdyYW0oKTsKLQkJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQkJCQkJCWlmICgoTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0UHJvamVjdEJ5RGlhZ3JhbShkaWFncmFtLmdldE5hbWUoKSkuZ2V0UHJvamVjdCgpKS5lcXVhbHMocmVzb3VyY2UpKSB7Ci0JCQkJCQkJCQkJCXBhZ2UuY2xvc2VFZGl0b3IoZGlhZ3JhbUJ5U2VsZWN0ZWRQcm9qZWN0LCBmYWxzZSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgdW5yZWdpc3RlckRlbHRlZEVudGl0eShJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZigoZXZlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSkgfHwgKGV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFKSkKLQkJCXJldHVybjsKLQkJCi0JCUlSZXNvdXJjZURlbHRhIGNoYW5nZWREZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCUlSZXNvdXJjZURlbHRhW10gZGVsdGFzID0gY2hhbmdlZERlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJZm9yIChJUmVzb3VyY2VEZWx0YSBkZWx0YSA6IGRlbHRhcykgewotCQkJZmluYWwgSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCQkJCWZvciAoSVJlc291cmNlRGVsdGEgZGVsdGFSZXNvdXJjZSA6IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkgewotCQkJCQkJTGlzdDxJUmVzb3VyY2VEZWx0YT4gcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxJUmVzb3VyY2VEZWx0YT4oKTsKLQkJCQkJCXJlc291cmNlcyA9IGZpbmREZWxldGVkUmVzb3VyY2UoZGVsdGFSZXNvdXJjZSwgcmVzb3VyY2VzKTsKLQkJCQkJCWZvciAoSVJlc291cmNlRGVsdGEgcmVzb3VyY2VEZWx0YSA6IHJlc291cmNlcykgewotCQkJCQkJCWlmIChyZXNvdXJjZURlbHRhLmdldFJlc291cmNlKCkgaW5zdGFuY2VvZiBGaWxlKSB7Ci0JCQkJCQkJCUlGaWxlIGZpbGUgPSB0aGlzLmVjbGlwc2VGYWNhZGUuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoKChGaWxlKSByZXNvdXJjZURlbHRhLmdldFJlc291cmNlKCkpLmdldEZ1bGxQYXRoKCkpOwotCQkJCQkJCQlpZiAoIWZpbGUuZXhpc3RzKCkgJiYgZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKCJqYXZhIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCUpwYVByb2plY3QganBhUHJvamVjdCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEpwYVByb2plY3QoKElQcm9qZWN0KSByZXNvdXJjZSk7Ci0JCQkJCQkJCQkJCWlmIChqcGFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCQkJCQkJCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gZnJhZ21lbnRSb290cyA9IGphdmFQcm9qZWN0LmdldEFsbFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCQkJCQkJCQkJCQlmb3IgKElQYWNrYWdlRnJhZ21lbnRSb290IGZyYWdtZW50Um9vdCA6IGZyYWdtZW50Um9vdHMpIHsKLQkJCQkJCQkJCQkJCQlpZiAoKGZyYWdtZW50Um9vdCBpbnN0YW5jZW9mIFBhY2thZ2VGcmFnbWVudFJvb3QpICYmIGZyYWdtZW50Um9vdC5nZXRLaW5kKCkgPT0gUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkgewotCQkJCQkJCQkJCQkJCQlQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgPSAoUGFja2FnZUZyYWdtZW50Um9vdCkgZnJhZ21lbnRSb290OwotCQkJCQkJCQkJCQkJCQlTdHJpbmcgc291cmNlZm9sZGVyID0gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKTsKLQkJCQkJCQkJCQkJCQkJU3RyaW5nW10gZnEgPSBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS5zcGxpdChzb3VyY2Vmb2xkZXIpOwotCQkJCQkJCQkJCQkJCQlTdHJpbmcgZnFOYW1lID0gZnFbMV0ucmVwbGFjZSgiLyIsICIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkJCQlmcU5hbWUgPSBmcU5hbWUucmVwbGFjZUZpcnN0KCIuIiwgIiIpLnJlcGxhY2UoIi5qYXZhIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJCQkJCQkJCQkJCS8vSlBBRWRpdG9yVXRpbC5jcmVhdGVVbnJlZ2lzdGVyRW50aXR5RnJvbVhNTEpvYihqcGFQcm9qZWN0LCBmcU5hbWUpOwotCQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIExpc3Q8SVJlc291cmNlRGVsdGE+IGZpbmREZWxldGVkUmVzb3VyY2UoSVJlc291cmNlRGVsdGEgZGVsdGEsIExpc3Q8SVJlc291cmNlRGVsdGE+IHJlc291cmNlcyl7Ci0JCUlSZXNvdXJjZURlbHRhW10gZGVsdGFzID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJZm9yIChJUmVzb3VyY2VEZWx0YSBkZWwgOiBkZWx0YXMpIHsKLQkJCQlmaW5kRGVsZXRlZFJlc291cmNlKGRlbCwgcmVzb3VyY2VzKTsKLQkJCQlpZihkZWwuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpLmxlbmd0aD09MCkKLQkJCQkgICAgcmVzb3VyY2VzLmFkZChkZWwpOwotCQkJfQotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uPEphdmFQZXJzaXN0ZW50VHlwZT4gZ2V0UGVyc2lzdGVudFR5cGVzKCkgewotCQlyZXR1cm4gcGVyc2lzdGVudFR5cGVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSnBhQXJ0aWZhY3RGYWN0b3J5LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9KcGFBcnRpZmFjdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE3ZGQ5ZC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9KcGFBcnRpZmFjdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklSZW1vdmVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5BZGRDb25uZWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuUmVtb3ZlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnNlcnZpY2VzLkdyYXBoaXRpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnV0aWwuSUNvbG9yQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUltcG9ydERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkucmVmYWN0b3JpbmcuUmVuYW1lU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3ViTGlzdEl0ZXJhYmxlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRDbGFzc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Pd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5BZGRJbmhlcml0ZWRFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQWRkUmVsYXRpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuUmVtb3ZlUmVsYXRpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuVXBkYXRlQXR0cmlidXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS5KUEFEaWFncmFtUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklCaWRpcmVjdGlvbmFsUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uLlJlbERpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uLlJlbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklzQVJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5NYW55VG9NYW55QmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuTWFueVRvTWFueVVuaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5NYW55VG9PbmVCaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5NYW55VG9PbmVVbmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuT25lVG9NYW55VW5pRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk9uZVRvT25lQmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuT25lVG9PbmVVbmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuVW5pZGlyZWN0aW9uYWxSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKcGFBcnRpZmFjdEZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhQXJ0aWZhY3RGYWN0b3J5IElOU1RBTkNFID0gbmV3IEpwYUFydGlmYWN0RmFjdG9yeSgpOwkKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05VTV9PRl9JVEVSQVRJT05TID0gMjU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBVVNFX0RVUkFUSU9OID0gMjAwOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xMRUNUSU9OX1RZUEUgPSAiamF2YS51dGlsLkNvbGxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfVFlQRSA9ICJqYXZhLnV0aWwuTGlzdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX1RZUEUgPSAiamF2YS51dGlsLlNldCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQX1RZUEUgPSAiamF2YS51dGlsLk1hcCI7IC8vJE5PTi1OTFMtMSQKLQotCXN5bmNocm9uaXplZCBwdWJsaWMgc3RhdGljIEpwYUFydGlmYWN0RmFjdG9yeSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWFycmFuZ2VJc0FSZWxhdGlvbnMoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQlDb2xsZWN0aW9uPElzQVJlbGF0aW9uPiBpc0FSZWxzID0gcHJvZHVjZUFsbE1pc3NpbmdJc0FSZWxhdGlvbnMoZnApOwotCQlhZGRJc0FSZWxhdGlvbnMoZnAsIGlzQVJlbHMpOwotCQlmcC5yZW1vdmVBbGxSZWR1bmRhbnRJc0FSZWxhdGlvbnMoKTsKLQl9IAotCQotCXB1YmxpYyB2b2lkIHJlYXJyYW5nZUlzQVJlbGF0aW9uc0luVHJhbnNhY3Rpb24oZmluYWwgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQlmaW5hbCBDb2xsZWN0aW9uPElzQVJlbGF0aW9uPiBpc0FSZWxzID0gcHJvZHVjZUFsbE1pc3NpbmdJc0FSZWxhdGlvbnMoZnApOwotCQlpZiAoIWZwLmV4aXN0UmVkdW5kYW50SXNBUmVsYXRpb25zKCkgJiYgKGlzQVJlbHMuc2l6ZSgpID09IDApKQotCQkJcmV0dXJuOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBmcC5nZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbigpOwotCQlSZWNvcmRpbmdDb21tYW5kIHJjID0gbmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJYWRkSXNBUmVsYXRpb25zKGZwLCBpc0FSZWxzKTsKLQkJCQlmcC5yZW1vdmVBbGxSZWR1bmRhbnRJc0FSZWxhdGlvbnMoKTsKLQkJCX0JCQotCQl9OwotCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShyYyk7Ci0JfSAKLQkKLQkJCi0JcHVibGljIENvbGxlY3Rpb248SXNBUmVsYXRpb24+IHByb2R1Y2VBbGxNaXNzaW5nSXNBUmVsYXRpb25zKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJQ29sbGVjdGlvbjxKYXZhUGVyc2lzdGVudFR5cGU+IHBlcnNpc3RlbnRUeXBlcyA9IGZwLmdldFBlcnNpc3RlbnRUeXBlcygpOwotCQlDb2xsZWN0aW9uPElzQVJlbGF0aW9uPiByZXMgPSBuZXcgSGFzaFNldDxJc0FSZWxhdGlvbj4oKTsKLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRUeXBlPiBpdCA9IHBlcnNpc3RlbnRUeXBlcy5pdGVyYXRvcigpOyAKLQkJSGFzaFNldDxJc0FSZWxhdGlvbj4gYWxsRXhpc3RpbmdJc0FSZWxhdGlvbnMgPSBmcC5nZXRBbGxFeGlzdGluZ0lzQVJlbGF0aW9ucygpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gaXQubmV4dCgpOwotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHN1cGVyY2xhc3MgPSBmcC5nZXRGaXJzdFN1cGVyY2xhc3NCZWxvbmdpbmdUb1RoZURpYWdyYW0oanB0KTsKLQkJCWlmIChzdXBlcmNsYXNzID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlJc0FSZWxhdGlvbiBuZXdSZWwgPSBuZXcgSXNBUmVsYXRpb24oanB0LCBzdXBlcmNsYXNzKTsKLQkJCWlmICghYWxsRXhpc3RpbmdJc0FSZWxhdGlvbnMuY29udGFpbnMobmV3UmVsKSkKLQkJCQlyZXMuYWRkKG5ld1JlbCk7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIGFkZE9uZVRvT25lVW5pZGlyZWN0aW9uYWxSZWxhdGlvbihJRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUganB0LCAKLQkJCQkJCQkJCQkJCSAgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCWFkZE9uZVRvT25lUmVsYXRpb24oZnAsIGpwdCwgYXR0cmlidXRlLCBudWxsLCBudWxsLAotCQkJCUpQQUVkaXRvckNvbnN0YW50cy5SRUxBVElPTl9UWVBFX1VOSURJUkVDVElPTkFMKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkT25lVG9PbmVCaWRpcmVjdGlvbmFsUmVsYXRpb24gKElGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQxLCAKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZTEsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQyLAotCQkJCQkJCQkJCQkJICBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUyKSB7Ci0JCQotCQlhZGRPbmVUb09uZVJlbGF0aW9uKGZwLCBqcHQxLCBhdHRyaWJ1dGUxLCBqcHQyLCBhdHRyaWJ1dGUyLAotCQkJCUpQQUVkaXRvckNvbnN0YW50cy5SRUxBVElPTl9UWVBFX0JJRElSRUNUSU9OQUwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRPbmVUb09uZVJlbGF0aW9uKElGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBvd25lckpQVCwgCi0JCQkJCQkJCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lckF0dGlidXRlLCAKLQkJCQkJCQkJCUphdmFQZXJzaXN0ZW50VHlwZSByZWZlcmVuY2VkSlBULCAKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHJlZmVyZW5jZWRBdHRyaWJ1dGUsIGludCBkaXJlY3Rpb24pIHsKLQkJCi0JCWlmKG93bmVySlBULmdldEF0dHJpYnV0ZU5hbWVkKG93bmVyQXR0aWJ1dGUuZ2V0TmFtZSgpKSA9PSBudWxsKXsKLQkJCSAgIHJlZnJlc2hFbnRpdHlNb2RlbChmcCwgb3duZXJKUFQpOwotCQl9Ci0JCQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSBvd25lckpQVAotCQkJCS5yZXNvbHZlQXR0cmlidXRlKG93bmVyQXR0aWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXR0ci5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLnNldFByaW1hcnlBbm5vdGF0aW9uKCJqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZSIsIG5ldyBBcnJheUxpc3RJdGVyYWJsZTxTdHJpbmc+KCkpOwkvLyROT04tTkxTLTEkCi0JCWlmIChkaXJlY3Rpb24gPT0gSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX1RZUEVfQklESVJFQ1RJT05BTCkgewotCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIHJlZmVyZW5jZWRKUFQpOwotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cjIgPSAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHJlZmVyZW5jZWRKUFQucmVzb2x2ZUF0dHJpYnV0ZShyZWZlcmVuY2VkQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQlhdHRyMi5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCWF0dHIyLmdldEpwYVByb2plY3QoKS5nZXRSb290Q29udGV4dE5vZGUoKS51cGRhdGUoKTsKLQkJCUphdmFPbmVUb09uZU1hcHBpbmcgbWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBhdHRyMi5nZXRNYXBwaW5nKCk7Ci0JCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IG1hcHBpbmcuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCWlmKGFubm90YXRpb24gPT0gbnVsbCkgewotCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCByZWZlcmVuY2VkSlBUKTsKLQkJCQlhbm5vdGF0aW9uID0gKChKYXZhT25lVG9PbmVNYXBwaW5nKSBhdHRyMi5nZXRNYXBwaW5nKCkpLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQl9Ci0JCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KG93bmVyQXR0aWJ1dGUuZ2V0TmFtZSgpKTsKLQkJfQkJCi0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRPbmVUb01hbnlVbmlkaXJlY3Rpb25hbFJlbGF0aW9uKElGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIAotCQkJCQkJCQkJCQkJICAgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlLCBib29sZWFuIGlzTWFwKSB7Ci0JCQotCQlhZGRPbmVUb01hbnlSZWxhdGlvbihmcCwganB0LCBhdHRyaWJ1dGUsIG51bGwsIG51bGwsCi0JCQkJSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX1RZUEVfVU5JRElSRUNUSU9OQUwsIGlzTWFwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkT25lVG9NYW55QmlkaXJlY3Rpb25hbFJlbGF0aW9uKElGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQxLCAKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZTEsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQyLAotCQkJCQkJCQkJCQkJICBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUyLCBib29sZWFuIGlzTWFwKSB7Ci0JCQotCQlhZGRPbmVUb01hbnlSZWxhdGlvbihmcCwganB0MSwgYXR0cmlidXRlMSwganB0MiwgYXR0cmlidXRlMiwKLQkJCQlKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fVFlQRV9CSURJUkVDVElPTkFMLCBpc01hcCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE1hbnlUb09uZUJpZGlyZWN0aW9uYWxSZWxhdGlvbihJRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUganB0MSwgCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUxLCBKYXZhUGVyc2lzdGVudFR5cGUganB0MiwKLQkJCQkJCQkJCQkJCSAgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlMiwgYm9vbGVhbiBpc01hcCkgewotCQkKLQkJYWRkTWFueVRvT25lUmVsYXRpb24oZnAsIGpwdDEsIGF0dHJpYnV0ZTEsIGpwdDIsIGF0dHJpYnV0ZTIsCi0JCQkJSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX1RZUEVfQklESVJFQ1RJT05BTCwgaXNNYXApOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBhZGRPbmVUb01hbnlSZWxhdGlvbihJRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUgc2luZ2xlU2lkZUpQVCwgCi0JCQkJCQkJCQkgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgc2luZ2xlU2lkZUF0dGlidXRlLCAKLQkJCQkJCQkJCSBKYXZhUGVyc2lzdGVudFR5cGUgbWFueVNpZGVKUFQsIAotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbWFueVNpZGVBdHRyaWJ1dGUsIGludCBkaXJlY3Rpb24sIGJvb2xlYW4gaXNNYXApIHsKLQkJCi0JCS8vaWYoc2luZ2xlU2lkZUpQVC5nZXRBdHRyaWJ1dGVOYW1lZChzaW5nbGVTaWRlQXR0aWJ1dGUuZ2V0TmFtZSgpKSA9PSBudWxsKXsKLQkJCSAgIHJlZnJlc2hFbnRpdHlNb2RlbChmcCwgc2luZ2xlU2lkZUpQVCk7Ci0JCS8vfQotCQkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb2x2ZWRTaW5nbGVTaWRlQXR0cmlidXRlID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSBzaW5nbGVTaWRlSlBUCi0JCQkJLnJlc29sdmVBdHRyaWJ1dGUoc2luZ2xlU2lkZUF0dGlidXRlLmdldE5hbWUoKSk7Ci0JCXJlc29sdmVkU2luZ2xlU2lkZUF0dHJpYnV0ZQotCQkJCS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWlmIChkaXJlY3Rpb24gPT0gSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX1RZUEVfQklESVJFQ1RJT05BTCkgewotCQkJcmVzb2x2ZWRTaW5nbGVTaWRlQXR0cmlidXRlLmdldEpwYVByb2plY3QoKS5nZXRSb290Q29udGV4dE5vZGUoKQotCQkJCQkudXBkYXRlKCk7Ci0JCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgc2luZ2xlU2lkZUpQVCk7Ci0JCQlKYXZhQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gcmVzb2x2ZWRTaW5nbGVTaWRlQXR0cmlidXRlCi0JCQkJCS5nZXRNYXBwaW5nKCk7Ci0JCQlpZiAoIW1hcHBpbmcuZ2V0Q2xhc3MoKS5pc0luc3RhbmNlKEphdmFPbmVUb01hbnlNYXBwaW5nLmNsYXNzKSkgCi0JCQkJcmV0dXJuOwotCQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKChKYXZhT25lVG9NYW55TWFwcGluZyltYXBwaW5nKS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgewotCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCBzaW5nbGVTaWRlSlBUKTsKLQkJCQltYXBwaW5nID0gcmVzb2x2ZWRTaW5nbGVTaWRlQXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCQlhbm5vdGF0aW9uID0gKChKYXZhT25lVG9NYW55TWFwcGluZyltYXBwaW5nKS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQkJfQotCQkJCi0JCQlpZihhbm5vdGF0aW9uID09IG51bGwpewotCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCBzaW5nbGVTaWRlSlBUKTsKLQkJCQlhbm5vdGF0aW9uID0gKChKYXZhT25lVG9NYW55TWFwcGluZylyZXNvbHZlZFNpbmdsZVNpZGVBdHRyaWJ1dGUKLQkJCQkJLmdldE1hcHBpbmcoKSkuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCX0KLQkJCWFubm90YXRpb24uc2V0TWFwcGVkQnkobWFueVNpZGVBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsJCQkJCQkKLQkJCQotCQl9Ci0JCWlmIChpc01hcCkKLQkJCXNpbmdsZVNpZGVBdHRpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlpZiAoZGlyZWN0aW9uID09IEpQQUVkaXRvckNvbnN0YW50cy5SRUxBVElPTl9UWVBFX0JJRElSRUNUSU9OQUwpIHsKLQkJCWlmKG1hbnlTaWRlSlBULmdldEF0dHJpYnV0ZU5hbWVkKG1hbnlTaWRlQXR0cmlidXRlLmdldE5hbWUoKSkgPT0gbnVsbCl7Ci0JCQkJICAgcmVmcmVzaEVudGl0eU1vZGVsKGZwLCBtYW55U2lkZUpQVCk7Ci0JCQl9Ci0JCQkKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHJlc29sdmVkTWFueVNpZGVBdHRyaWJ1dGUgPSAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIG1hbnlTaWRlSlBUCi0JCQkJCS5yZXNvbHZlQXR0cmlidXRlKG1hbnlTaWRlQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQlyZXNvbHZlZE1hbnlTaWRlQXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJfSBlbHNlIHsKLQkJCWFkZEpvaW5Db2x1bW5JZk5lY2Vzc2FyeShyZXNvbHZlZFNpbmdsZVNpZGVBdHRyaWJ1dGUsIHNpbmdsZVNpZGVKUFQsIGZwKTsKLQkJfQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRKb2luQ29sdW1uSWZOZWNlc3NhcnkoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhLAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgSUZlYXR1cmVQcm92aWRlciBmcCkgewotCi0JCWlmIChKUEFFZGl0b3JVdGlsLmNoZWNrSlBBRmFjZXRWZXJzaW9uKGpwYS5nZXRKcGFQcm9qZWN0KCksICIxLjAiKSB8fCAvLyROT04tTkxTLTEkCi0JCQkJSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5zaG91bGRPbmVUb01hbnlVbmlkaXJCZU9sZFN0eWxlKGpwYQotCQkJCQkJLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpKQotCQkJcmV0dXJuOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVtdIGlkcyA9IGdldElkcyhqcHQpOwotCQlpZiAoaWRzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQlmaW5hbCBTdHJpbmcgdGFibGVOYW1lID0gZ2V0VGFibGVOYW1lKGpwdCk7Ci0JCWlmIChpZHMubGVuZ3RoID09IDEpIHsKLQkJCWlmIChpc1NpbXBsZUlkKGlkc1swXSkpIHsKLQkJCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBhbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikganBhCi0JCQkJCQkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKDAsIAotCQkJCQkJCQlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkJCVN0cmluZyBpZENvbE5hbWUgPSBnZXRDb2x1bW5OYW1lKGlkc1swXSk7Ci0JCQkJYW4uc2V0TmFtZSh0YWJsZU5hbWUgKyAiXyIgKyBpZENvbE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJYW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoaWRDb2xOYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBhdE5hbWVUb0NvbE5hbWUgPSBnZXRPdmVycmlkZGVuQ29sTmFtZXMoaWRzWzBdKTsKLQkJCQlQZXJzaXN0ZW5jZVVuaXQgcHUgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoanB0KTsKLQkJCQlTdHJpbmcgZW1iZWRkYWJsZVR5cGVOYW1lID0gaWRzWzBdLmdldFR5cGVOYW1lKCk7Ci0JCQkJRW1iZWRkYWJsZSBlbWIgPSBwdS5nZXRFbWJlZGRhYmxlKGVtYmVkZGFibGVUeXBlTmFtZSk7Ci0JCQkJZm9yIChBdHRyaWJ1dGVNYXBwaW5nIGFtIDogZW1iLmdldEFsbEF0dHJpYnV0ZU1hcHBpbmdzKCkpIHsKLQkJCQkJSm9pbkNvbHVtbkFubm90YXRpb24gamMgPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGpwYS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oanBhLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbnNTaXplKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSksIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0ID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSBhbQotCQkJCQkJCS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQkJCVN0cmluZyBpZENvbE5hbWUgPSBhdE5hbWVUb0NvbE5hbWUuZ2V0KGF0LmdldE5hbWUoKSk7Ci0JCQkJCWlkQ29sTmFtZSA9IChpZENvbE5hbWUgIT0gbnVsbCkgPyBpZENvbE5hbWUKLQkJCQkJCQk6IGdldENvbHVtbk5hbWUoYXQpOwotCQkJCQlqYy5zZXROYW1lKHRhYmxlTmFtZSArICJfIiArIGlkQ29sTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJamMuc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoaWRDb2xOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGlkQXQgOiBpZHMpIHsKLQkJCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqYyA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikganBhLmdldFJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbigganBhLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbnNTaXplKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSksIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQkJU3RyaW5nIGlkQ29sTmFtZSA9IGdldENvbHVtbk5hbWUoaWRBdCk7Ci0JCQkJamMuc2V0TmFtZSh0YWJsZU5hbWUgKyAiXyIgKyBpZENvbE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJamMuc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoaWRDb2xOYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBnZXRPdmVycmlkZGVuQ29sTmFtZXMoCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBlbWJJZEF0KSB7Ci0JCUhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gcmVzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4oKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGFvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGVtYklkQXQKLQkJCQkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKDAsIAotCQkJCQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWlmIChhb24gIT0gbnVsbCkgewotCQkJQ29sdW1uQW5ub3RhdGlvbiBjb2xBbiA9IGFvbi5nZXRDb2x1bW4oKTsKLQkJCWlmIChjb2xBbiA9PSBudWxsKQotCQkJCXJldHVybiByZXM7Ci0JCQlTdHJpbmcgY29sTmFtZSA9IGNvbEFuLmdldE5hbWUoKTsKLQkJCWlmIChjb2xOYW1lID09IG51bGwpCi0JCQkJcmV0dXJuIHJlczsKLQkJCXJlcy5wdXQoYW9uLmdldE5hbWUoKSwgY29sTmFtZSk7Ci0JCQlyZXR1cm4gcmVzOwotCQl9Ci0JCUl0ZXJhYmxlPEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbj4gaXQgPSBuZXcgU3ViTGlzdEl0ZXJhYmxlV3JhcHBlcjxOZXN0YWJsZUFubm90YXRpb24sIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbj4oCi0JCQllbWJJZEF0LmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlmb3IgKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhbiA6IGl0KSB7Ci0JCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbEFuID0gYW4uZ2V0Q29sdW1uKCk7Ci0JCQlpZiAoY29sQW4gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyBjb2xOYW1lID0gY29sQW4uZ2V0TmFtZSgpOwotCQkJaWYgKGNvbE5hbWUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCXJlcy5wdXQoYW4uZ2V0TmFtZSgpLCBjb2xOYW1lKTsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0JCi0JCi0JCi0JcHVibGljIHZvaWQgYWRkTWFueVRvT25lVW5pZGlyZWN0aW9uYWxSZWxhdGlvbihJRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUganB0LCAKLQkJCQkJCQkJCQkJCSAgIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkKLQkJYWRkTWFueVRvT25lUmVsYXRpb24oZnAsIGpwdCwgYXR0cmlidXRlLCBudWxsLCBudWxsLAotCQkJCUpQQUVkaXRvckNvbnN0YW50cy5SRUxBVElPTl9UWVBFX1VOSURJUkVDVElPTkFMLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE1hbnlUb09uZVJlbGF0aW9uKElGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBtYW55U2lkZUpQVCwgCi0JCQkJCQkJCQkgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbWFueVNpZGVBdHRyaWJ1dGUsIAotCQkJCQkJCQkJIEphdmFQZXJzaXN0ZW50VHlwZSBzaW5nbGVTaWRlSlBULCAKLQkJCQkJCQkJCSBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBzaW5nbGVTaWRlQXR0aWJ1dGUsIAotCQkJCQkJCQkJIGludCBkaXJlY3Rpb24sIGJvb2xlYW4gaXNNYXApIHsKLQkJCi0JCXJlZnJlc2hFbnRpdHlNb2RlbChmcCwgbWFueVNpZGVKUFQpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb2x2ZWRNYW55U2lkZUF0dHJpYnV0ZSA9IG1hbnlTaWRlSlBULmdldEF0dHJpYnV0ZU5hbWVkKG1hbnlTaWRlQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCXJlc29sdmVkTWFueVNpZGVBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJaWYgKGRpcmVjdGlvbiA9PSBKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fVFlQRV9VTklESVJFQ1RJT05BTCkgCi0JCQlyZXR1cm47Ci0JCQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvbHZlZFNpbmdsZVNpZGVBdHRyaWJ1dGUgPSBzaW5nbGVTaWRlSlBULmdldEF0dHJpYnV0ZU5hbWVkKHNpbmdsZVNpZGVBdHRpYnV0ZS5nZXROYW1lKCkpOwotCQlyZXNvbHZlZFNpbmdsZVNpZGVBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlyZWZyZXNoRW50aXR5TW9kZWwoZnAsIHNpbmdsZVNpZGVKUFQpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZyBtYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nKXJlc29sdmVkU2luZ2xlU2lkZUF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gYSA9IG1hcHBpbmcuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJaWYgKGEgPT0gbnVsbCkgCi0JCQlyZXR1cm47Ci0JCWEuc2V0TWFwcGVkQnkobWFueVNpZGVBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJaWYgKGlzTWFwKQotCQkJc2luZ2xlU2lkZUF0dGlidXRlLmdldFJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE1hbnlUb01hbnlCaWRpcmVjdGlvbmFsUmVsYXRpb24oSUZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdDEsIAotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlMSwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdDIsCi0JCQkJCQkJCQkJCQkgICBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUyLCBib29sZWFuIGlzTWFwKSB7Ci0JCQotCQlhZGRNYW55VG9NYW55UmVsYXRpb24oZnAsIGpwdDEsIGF0dHJpYnV0ZTEsIGpwdDIsIGF0dHJpYnV0ZTIsCi0JCQkJSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX1RZUEVfQklESVJFQ1RJT05BTCwgaXNNYXApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRNYW55VG9NYW55VW5pZGlyZWN0aW9uYWxSZWxhdGlvbihJRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUgYW5ub3RhdGVkSlBULAotCQkJCQkJCQkJCQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGFubm90YXRlZEF0dHJpYnV0ZSwgYm9vbGVhbiBpc01hcCkgewotCQkKLQkJYWRkTWFueVRvTWFueVJlbGF0aW9uKGZwLCBhbm5vdGF0ZWRKUFQsIGFubm90YXRlZEF0dHJpYnV0ZSwgbnVsbCwgbnVsbCwKLQkJCQlKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fVFlQRV9VTklESVJFQ1RJT05BTCwgaXNNYXApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRNYW55VG9NYW55UmVsYXRpb24oSUZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyU2lkZUpQVCwgCi0JCQkJCQkJCQkgIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyU2lkZUF0dHJpYnV0ZSwgCi0JCQkJCQkJCQkgIEphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlU2lkZUpQVCwgCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlU2lkZUF0dGlidXRlLCBpbnQgZGlyZWN0aW9uLCBib29sZWFuIGlzTWFwKSB7Ci0JCQotCQlpZihvd25lclNpZGVKUFQuZ2V0QXR0cmlidXRlTmFtZWQob3duZXJTaWRlQXR0cmlidXRlLmdldE5hbWUoKSkgPT0gbnVsbCl7Ci0JCQkgICByZWZyZXNoRW50aXR5TW9kZWwoZnAsIG93bmVyU2lkZUpQVCk7Ci0JCX0KLQkJCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHJlc29sdmVkT3duZXJTaWRlQXR0cmlidXRlID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSBvd25lclNpZGVKUFQKLQkJCQkucmVzb2x2ZUF0dHJpYnV0ZShvd25lclNpZGVBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJcmVzb2x2ZWRPd25lclNpZGVBdHRyaWJ1dGUKLQkJCQkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJaWYgKGlzTWFwKQotCQkJcmVzb2x2ZWRPd25lclNpZGVBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWlmIChkaXJlY3Rpb24gPT0gSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX1RZUEVfQklESVJFQ1RJT05BTCkgewotCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIGludmVyc2VTaWRlSlBUKTsKLQkJCS8qCi0JCQlpZihpbnZlcnNlU2lkZUpQVC5nZXRBdHRyaWJ1dGVOYW1lZChpbnZlcnNlU2lkZUF0dGlidXRlLmdldE5hbWUoKSkgPT0gbnVsbCl7Ci0JCQkJICAgcmVmcmVzaEVudGl0eU1vZGVsKGZwLCBpbnZlcnNlU2lkZUpQVCk7Ci0JCQl9Ci0JCQkqLwotCQkJCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvbHZlZEludmVyc2VTaWRlQXR0cmlidXRlID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSBpbnZlcnNlU2lkZUpQVAotCQkJCQkucmVzb2x2ZUF0dHJpYnV0ZShpbnZlcnNlU2lkZUF0dGlidXRlLmdldE5hbWUoKSk7Ci0JCQlyZXNvbHZlZEludmVyc2VTaWRlQXR0cmlidXRlCi0JCQkJCS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkJcmVzb2x2ZWRJbnZlcnNlU2lkZUF0dHJpYnV0ZS5nZXRKcGFQcm9qZWN0KCkuZ2V0Um9vdENvbnRleHROb2RlKCkKLQkJCQkJLnVwZGF0ZSgpOwotCQkJCi0JCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIHJlc29sdmVkSW52ZXJzZVNpZGVBdHRyaWJ1dGUKLQkJCQkJLmdldE1hcHBpbmcoKTsKLQkJCU1hbnlUb01hbnlBbm5vdGF0aW9uIGEgPSBtYXBwaW5nLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQlpZihtYXBwaW5nID09IG51bGwgfHwgYSA9PSBudWxsKXsKLQkJCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgaW52ZXJzZVNpZGVKUFQpOwotCQkJCW1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSByZXNvbHZlZEludmVyc2VTaWRlQXR0cmlidXRlCi0JCQkJCS5nZXRNYXBwaW5nKCk7Ci0JCQkJYSA9IG1hcHBpbmcuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCX0KLQkJCWlmIChhID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJYS5zZXRNYXBwZWRCeShvd25lclNpZGVBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsJCi0JCQlpZiAoaXNNYXApCi0JCQkJcmVzb2x2ZWRJbnZlcnNlU2lkZUF0dHJpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl9CQkKLQkJCi0JfQotCQkKLQlwdWJsaWMgdm9pZCByZXN0b3JlRW50aXR5Q2xhc3MoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwKLQkJCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJZnAucmVzdG9yZUVudGl0eShqcHQpOwotCX0gICAgCQotCQotCXB1YmxpYyB2b2lkIGZvcmNlU2F2ZUVudGl0eUNsYXNzKGZpbmFsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsCi0JCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgY3UgPSBmcC5nZXRDb21waWxhdGlvblVuaXQoanB0KTsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoY3UuaXNXb3JraW5nQ29weSgpKSAKLQkJCQkJCWN1LmNvbW1pdFdvcmtpbmdDb3B5KHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQljdS5zYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRydWUpOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChjdS5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSAmJiBjdS5nZXRSZXNvdXJjZSgpLmlzQWNjZXNzaWJsZSgpKQotCQkJCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IHNhdmUgZW50aXR5ICciICsganB0LmdldE5hbWUoKSArICInIiwgZSk7CS8vJE5PTi1OTFMtMSQJCS8vJE5PTi1OTFMtMiQJCQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGRlbGV0ZUVudGl0eUNsYXNzKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIAotCQkJCQkJCQkJIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGZwLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCQl0cnkgewotCQkJSlBBRWRpdG9yVXRpbC5kaXNjYXJkV29ya2luZ0NvcHkoY3UpOwotCQkJY3UuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJcmV0dXJuIHRydWU7CQkJCi0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3QgZGVsZXRlIHRoZSBKUEEgZW50aXR5IGNsYXNzIiwgZSk7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9IAotCSAgIAotCXB1YmxpYyB2b2lkIGRlbGV0ZVBlcnNpc3RlbmNlVHlwZVJlc291cmNlKFBlcnNpc3RlbnRUeXBlIHR5cGUpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUpwYVByb2plY3QgcHJvaiA9IHR5cGUuZ2V0SnBhUHJvamVjdCgpOwotCQlTdHJpbmcgdHlwZU5hbWUgPSB0eXBlLmdldE5hbWUoKTsKLQkJSVJlc291cmNlIGVudGl0eVJlc291cmNlID0gdHlwZS5nZXRSZXNvdXJjZSgpOwotCQkvL3R5cGUuZGlzcG9zZSgpOwotCQllbnRpdHlSZXNvdXJjZS5kZWxldGUodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CQotCQlpbnQgY250ID0gMDsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IGdldENvbnRleHRQZXJzaXN0ZW50VHlwZShwcm9qLCB0eXBlTmFtZSk7Ci0JCXdoaWxlICgoanB0ICE9IG51bGwpICYmIChjbnQgPCBNQVhfTlVNX09GX0lURVJBVElPTlMpKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcChQQVVTRV9EVVJBVElPTik7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiU2xlZXAgaW50ZXJydXB0ZWQiLCBlKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCX0KLQkJCWNudCsrOwotCQl9Ci0JfQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCAKLQkJCQkJCQkJCQkJCQkgICBTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQkKLQkJUGVyc2lzdGVuY2VVbml0IHVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoanBhUHJvamVjdCk7Ci0JCWZvciAoQ2xhc3NSZWYgcmVmIDogdW5pdC5nZXRDbGFzc1JlZnMoKSkgewotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IHJlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCi0JCQlpZiAoKGpwdCAhPSBudWxsKSAmJiBqcHQuZ2V0TmFtZSgpLmVxdWFscyhmdWxseVF1YWxpZmllZFR5cGVOYW1lKSkgewotCQkJCXJldHVybiByZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQl9Ci0JCX0gCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBuYW1lIG9mIHRoZSBlbnRpdHkgZnJvbSBARW50aXR5KG5hbWU9Ii4uLiIpLgotCSAqIElmIHRoZXJlIGlzIG5vIHN1Y2ggYW5ub3RhdGlvbiwgcmV0dXJucyB0aGUgCi0JICogZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbnRpdHlOYW1lKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJaWYgKGpwdCA9PSBudWxsKQotCQkJcmV0dXJuICIiOwkvLyROT04tTkxTLTEkCi0JCUphdmFSZXNvdXJjZVR5cGUganJwdCA9IGNvbnZlcnRKUFRUb0pSVChqcHQpOwotCQlpZiAoanJwdCA9PSBudWxsKSAKLQkJCXJldHVybiAiIjsJLy8kTk9OLU5MUy0xJAotCQkKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlKYXZhVHlwZU1hcHBpbmcgbWFwcGluZyA9IGpwdC5nZXRNYXBwaW5nKCk7Ci0JCWlmICgobWFwcGluZyAhPSBudWxsKSAmJiBKYXZhRW50aXR5LmNsYXNzLmlzSW5zdGFuY2UobWFwcGluZykpCi0JCQluYW1lID0gKChKYXZhRW50aXR5KW1hcHBpbmcpLmdldFNwZWNpZmllZE5hbWUoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCW5hbWUgPSBqcHQuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbmFtZTsKLQkJfQotCQkJCQkJCQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNOYW1lQW5ub3RhdGlvbihKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCWlmIChqcHQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSmF2YVJlc291cmNlVHlwZSBqcnB0ID0gY29udmVydEpQVFRvSlJUKGpwdCk7Ci0JCWlmIChqcnB0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUphdmFUeXBlTWFwcGluZyBqdG0gPSBqcHQuZ2V0TWFwcGluZygpOwotCQlpZiAoanRtID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChqdG0gaW5zdGFuY2VvZiBKYXZhRW50aXR5KSB7Ci0JCQlKYXZhRW50aXR5IG1hcHBpbmcgPSAoSmF2YUVudGl0eSlqdG07Ci0JCQlyZXR1cm4gKG1hcHBpbmcuZ2V0U3BlY2lmaWVkTmFtZSgpICE9IG51bGwpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQkJCQkJCQl9Ci0JCi0JLyoKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0ID0ganBhLmdldEpwYVByb2plY3QoKQotCQkJCS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShqcGEuZ2V0TmFtZSgpKTsKLQkJQVNUTm9kZSBuZCA9IGpycHQuZ2V0TWVtYmVyKCkuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbigpLmdldERlY2xhcmF0aW9uKCk7Ci0JCWlmIChuZCBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgewotCQkJTGlzdEl0ZXJhdG9yPD8+IG1vZGZzID0gKChUeXBlRGVjbGFyYXRpb24pIG5kKS5tb2RpZmllcnMoKQotCQkJCQkubGlzdEl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAobW9kZnMuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG1vZGYgPSBtb2Rmcy5uZXh0KCk7Ci0JCQkJaWYgKG1vZGYgaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKSB7Ci0JCQkJCU5vcm1hbEFubm90YXRpb24gYW4gPSAoTm9ybWFsQW5ub3RhdGlvbiltb2RmOwotCQkJCQkJTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHZhbHMgPSBhbi52YWx1ZXMoKTsKLQkJCQkJCWlmICh2YWxzICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQkJTWVtYmVyVmFsdWVQYWlyIG12cCA9IHZhbHMuZ2V0KGkpOwotCQkJCQkJCQlpZiAobXZwLmdldE5hbWUoKS50b1N0cmluZygpLmVxdWFscygibmFtZSIpKSA7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlyZXR1cm4gSlBBRWRpdG9yVXRpbC5zdHJpcFF1b3RlcyhtdnAuZ2V0VmFsdWUoKQotCQkJCQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJCQkJCQkKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJfSAJCQkKLQkJCX0KLQkJfQkJCi0JCXJldHVybiBqcGEuZ2V0TmFtZSgpOwotCX0KLQkqLwotCQotCXB1YmxpYyBib29sZWFuIGhhc0VudGl0eU9yTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24oSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlyZXR1cm4gaGFzRW50aXR5QW5ub3RhdGlvbihqcHQpIHx8IGhhc01hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKGpwdCk7IAotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNFbnRpdHlBbm5vdGF0aW9uKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJcmV0dXJuIChqcHQuZ2V0TWFwcGluZ0tleSgpID09IE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKTsKLQl9CQotCQotCXB1YmxpYyBib29sZWFuIGhhc01hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJcmV0dXJuIChqcHQuZ2V0TWFwcGluZ0tleSgpID09IE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVkpOwotCX0JCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkRW50aXR5TmFtZShKYXZhUGVyc2lzdGVudFR5cGUganB0KXsKLQkJSmF2YVR5cGVNYXBwaW5nIGp0bSA9IGpwdC5nZXRNYXBwaW5nKCk7Ci0JCWlmIChqdG0gaW5zdGFuY2VvZiBKYXZhRW50aXR5KSB7Ci0JCQlKYXZhRW50aXR5IGdqZSA9IChKYXZhRW50aXR5KWp0bTsKLQkJcmV0dXJuIGdqZS5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JfQotCQlKYXZhTWFwcGVkU3VwZXJjbGFzcyBqbXMgPSAoSmF2YU1hcHBlZFN1cGVyY2xhc3MpanRtOwotCQlyZXR1cm4gam1zLmdldE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVuYW1lRW50aXR5KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCUphdmFUeXBlTWFwcGluZyBqdG0gPSBqcHQuZ2V0TWFwcGluZygpOwotCQlpZiAoanRtIGluc3RhbmNlb2YgSmF2YUVudGl0eSkgewotCQkJSmF2YUVudGl0eSBnamUgPSAoSmF2YUVudGl0eSlqdG07Ci0JCWdqZS5zZXRTcGVjaWZpZWROYW1lKG5ld05hbWUpOwkKLQl9Ci0JfQotCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRBdHRyaWJ1dGUoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgCi0JCQlKYXZhUGVyc2lzdGVudFR5cGUgYXR0cmlidXRlVHlwZSwgIFN0cmluZyBhdHRyaWJ1dGVOYW1lLAotCQkJU3RyaW5nIGFjdE5hbWUsIGJvb2xlYW4gaXNDb2xsZWN0aW9uLCBJQ29tcGlsYXRpb25Vbml0IGN1MSwKLQkJCUlDb21waWxhdGlvblVuaXQgY3UyKSB7Ci0JCQotCQlyZXR1cm4gYWRkQXR0cmlidXRlKGZwLCBqcHQsIGF0dHJpYnV0ZVR5cGUsIG51bGwsIGF0dHJpYnV0ZU5hbWUsCi0JCQkJYWN0TmFtZSwgaXNDb2xsZWN0aW9uLCBjdTEsIGN1Mik7Ci0JfQotCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRBdHRyaWJ1dGUoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgCi0JCQkJCQkJCQkJCQlKYXZhUGVyc2lzdGVudFR5cGUgYXR0cmlidXRlVHlwZSwgU3RyaW5nIG1hcEtleVR5cGUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLAotCQkJCQkJCQkJCQkJU3RyaW5nIGFjdE5hbWUsIGJvb2xlYW4gaXNDb2xsZWN0aW9uLCBJQ29tcGlsYXRpb25Vbml0IGN1MSwKLQkJCQkJCQkJCQkJCUlDb21waWxhdGlvblVuaXQgY3UyKSB7Ci0JCUlUeXBlIHR5cGUgPSBudWxsOwotCQl0cnkgewotCQkJSlBBRWRpdG9yVXRpbC5jcmVhdGVJbXBvcnQoY3UxLCBjdTIuZ2V0VHlwZShhdHRyaWJ1dGVUeXBlLmdldE5hbWUoKSkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQl0eXBlID0gY3UxLmZpbmRQcmltYXJ5VHlwZSgpOwkKLQkJCXJlZnJlc2hFbnRpdHlNb2RlbChmcCwganB0KTsKLQkJCWlmIChkb2VzQXR0cmlidXRlRXhpc3QoanB0LCBhY3ROYW1lKSkgewotCQkJCXJldHVybiAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGpwdAotCQkJCQkJLnJlc29sdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7Ci0JCQl9Ci0JCQlpZiAoaXNDb2xsZWN0aW9uKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IGpwdC5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQkJCVByb3BlcnRpZXMgcHJvcHMgPSBmcC5sb2FkUHJvcGVydGllcyhwcm9qZWN0KTsKLQotCQkJCWlmIChKUEFEaWFncmFtUHJvcGVydHlQYWdlLmlzQ29sbGVjdGlvblR5cGUocHJvamVjdCwgcHJvcHMpKSB7Ci0JCQkJCWNyZWF0ZUNvbnRlbnRUeXBlKGF0dHJpYnV0ZVR5cGUsIGFjdE5hbWUsIGN1MSwgdHlwZSwgQ09MTEVDVElPTl9UWVBFKTsKLQkJCQkJdHlwZS5jcmVhdGVNZXRob2QoZ2VuR2V0dGVyV2l0aEFwcHJvcHJpYXRlVHlwZShhdHRyaWJ1dGVOYW1lLAotCQkJCQkJCUpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShhdHRyaWJ1dGVUeXBlLmdldE5hbWUoKSksIAotCQkJCQkJCWFjdE5hbWUsIENPTExFQ1RJT05fVFlQRSksIG51bGwsIGZhbHNlLAotCQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQl0eXBlLmNyZWF0ZU1ldGhvZChnZW5TZXR0ZXJXaXRoQXBwcm9wcmlhdGVUeXBlKGF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGF0dHJpYnV0ZVR5cGUuZ2V0TmFtZSgpKSwgCi0JCQkJCQkJYWN0TmFtZSwgQ09MTEVDVElPTl9UWVBFKSwgbnVsbCwgZmFsc2UsCi0JCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfSBlbHNlIGlmIChKUEFEaWFncmFtUHJvcGVydHlQYWdlLmlzTGlzdFR5cGUocHJvamVjdCwgcHJvcHMpKSB7Ci0JCQkJCWNyZWF0ZUNvbnRlbnRUeXBlKGF0dHJpYnV0ZVR5cGUsIGFjdE5hbWUsIGN1MSwgdHlwZSwgTElTVF9UWVBFKTsKLQkJCQkJdHlwZS5jcmVhdGVNZXRob2QoZ2VuR2V0dGVyV2l0aEFwcHJvcHJpYXRlVHlwZShhdHRyaWJ1dGVOYW1lLAotCQkJCQkJCUpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShhdHRyaWJ1dGVUeXBlLmdldE5hbWUoKSksIAotCQkJCQkJCWFjdE5hbWUsIExJU1RfVFlQRSksIG51bGwsIGZhbHNlLAotCQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQl0eXBlLmNyZWF0ZU1ldGhvZChnZW5TZXR0ZXJXaXRoQXBwcm9wcmlhdGVUeXBlKGF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGF0dHJpYnV0ZVR5cGUuZ2V0TmFtZSgpKSwgCi0JCQkJCQkJYWN0TmFtZSwgTElTVF9UWVBFKSwgbnVsbCwgZmFsc2UsCi0JCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfSBlbHNlIGlmIChKUEFEaWFncmFtUHJvcGVydHlQYWdlLmlzU2V0VHlwZShwcm9qZWN0LCBwcm9wcykpIHsKLQkJCQkJY3JlYXRlQ29udGVudFR5cGUoYXR0cmlidXRlVHlwZSwgYWN0TmFtZSwgY3UxLCB0eXBlLCBTRVRfVFlQRSk7Ci0JCQkJCXR5cGUuY3JlYXRlTWV0aG9kKGdlbkdldHRlcldpdGhBcHByb3ByaWF0ZVR5cGUoYXR0cmlidXRlTmFtZSwKLQkJCQkJCQlKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoYXR0cmlidXRlVHlwZS5nZXROYW1lKCkpLCAKLQkJCQkJCQlhY3ROYW1lLCBTRVRfVFlQRSksIG51bGwsIGZhbHNlLAotCQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQl0eXBlLmNyZWF0ZU1ldGhvZChnZW5TZXR0ZXJXaXRoQXBwcm9wcmlhdGVUeXBlKGF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGF0dHJpYnV0ZVR5cGUuZ2V0TmFtZSgpKSwgCi0JCQkJCQkJYWN0TmFtZSwgU0VUX1RZUEUpLCBudWxsLCBmYWxzZSwKLQkJCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9IGVsc2UgewotCQkJCQltYXBLZXlUeXBlID0gY3JlYXRlQ29udGVudFR5cGUobWFwS2V5VHlwZSwgYXR0cmlidXRlVHlwZSwgYWN0TmFtZSwgY3UxLCB0eXBlLCBNQVBfVFlQRSk7Ci0JCQkJCXR5cGUuY3JlYXRlTWV0aG9kKGdlbkdldHRlcldpdGhBcHByb3ByaWF0ZVR5cGUoYXR0cmlidXRlTmFtZSwgbWFwS2V5VHlwZSwKLQkJCQkJCQlKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoYXR0cmlidXRlVHlwZS5nZXROYW1lKCkpLCAKLQkJCQkJCQlhY3ROYW1lLCBNQVBfVFlQRSksIG51bGwsIGZhbHNlLAotCQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQl0eXBlLmNyZWF0ZU1ldGhvZChnZW5TZXR0ZXJXaXRoQXBwcm9wcmlhdGVUeXBlKGF0dHJpYnV0ZU5hbWUsIG1hcEtleVR5cGUsCi0JCQkJCQkJSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGF0dHJpYnV0ZVR5cGUuZ2V0TmFtZSgpKSwgCi0JCQkJCQkJYWN0TmFtZSwgTUFQX1RZUEUpLCBudWxsLCBmYWxzZSwKLQkJCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXR5cGUKLQkJCQkJCS5jcmVhdGVGaWVsZCgKLQkJCQkJCQkJIiAgcHJpdmF0ZSAiICsgSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGF0dHJpYnV0ZVR5cGUuZ2V0TmFtZSgpKSArICIgIiArIEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIoYWN0TmFtZSkgKyAiOyIsIG51bGwsIGZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl0eXBlLmNyZWF0ZU1ldGhvZChnZW5HZXR0ZXJDb250ZW50cyhhdHRyaWJ1dGVOYW1lLAotCQkJCQkJSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGF0dHJpYnV0ZVR5cGUuZ2V0TmFtZSgpKSwgbnVsbCwKLQkJCQkJCWFjdE5hbWUsIG51bGwsIGlzQ29sbGVjdGlvbiksIG51bGwsIGZhbHNlLAotCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJdHlwZS5jcmVhdGVNZXRob2QoZ2VuU2V0dGVyQ29udGVudHMoYXR0cmlidXRlTmFtZSwKLQkJCQkJCUpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShhdHRyaWJ1dGVUeXBlLmdldE5hbWUoKSksIG51bGwsCi0JCQkJCQlhY3ROYW1lLCBpc0NvbGxlY3Rpb24pLCBudWxsLCBmYWxzZSwKLQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm5vdCBjcmVhdGUgYSBuZXcgYXR0cmlidXRlIHdpdGggbmFtZSAiICsgYXR0cmlidXRlTmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCX0KLQkJCi0JCWlmKGpwdC5nZXRBdHRyaWJ1dGVOYW1lZChhdHRyaWJ1dGVOYW1lKSA9PSBudWxsKXsKLQkJCSAgIHJlZnJlc2hFbnRpdHlNb2RlbChmcCwganB0KTsKLQkJfQotCQkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzID0gIGdldEF0dHJpYnV0ZUZyb21FbnRpdHkoanB0LCBhY3ROYW1lKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudFR5cGUoSmF2YVBlcnNpc3RlbnRUeXBlIGF0dHJpYnV0ZVR5cGUsCi0JCQlTdHJpbmcgYWN0TmFtZSwgSUNvbXBpbGF0aW9uVW5pdCBjdTEsIElUeXBlIHR5cGUsIFN0cmluZyBjb2xsZWN0aW9uVHlwZSkKLQkJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQljcmVhdGVDb250ZW50VHlwZShudWxsLCBhdHRyaWJ1dGVUeXBlLAotCQkJCWFjdE5hbWUsIGN1MSwgdHlwZSwgY29sbGVjdGlvblR5cGUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBjcmVhdGVDb250ZW50VHlwZShTdHJpbmcgbWFwS2V5VHlwZSwgSmF2YVBlcnNpc3RlbnRUeXBlIGF0dHJpYnV0ZVR5cGUsCi0JCQlTdHJpbmcgYWN0TmFtZSwgSUNvbXBpbGF0aW9uVW5pdCBjdTEsIElUeXBlIHR5cGUsIFN0cmluZyBjb2xsZWN0aW9uVHlwZSkKLQkJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkKLQkJaWYgKG1hcEtleVR5cGUgIT0gbnVsbCkgewotCQkJbWFwS2V5VHlwZSA9IEpQQUVkaXRvclV0aWwuY3JlYXRlSW1wb3J0KGN1MSwgbWFwS2V5VHlwZSk7IAotCQl9Ci0JCUpQQUVkaXRvclV0aWwuY3JlYXRlSW1wb3J0KGN1MSwgY29sbGVjdGlvblR5cGUpOwotCQl0eXBlLmNyZWF0ZUZpZWxkKAotCQkJCSIgIHByaXZhdGUgIiArIEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShjb2xsZWN0aW9uVHlwZSkgKyAiPCIgKy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCSgobWFwS2V5VHlwZSAhPSBudWxsKSA/IChtYXBLZXlUeXBlICsgIiwgIikgOiAiIikgKwkJCS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShhdHRyaWJ1dGVUeXBlLmdldE5hbWUoKSkgKyAiPiAiICsgSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihhY3ROYW1lKSArICAvLyROT04tTkxTLTEkCi0JCQkJIjsiLCBudWxsLCBmYWxzZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCXJldHVybiBtYXBLZXlUeXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWZyZXNoRW50aXR5TW9kZWwoSUZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlpZihjb252ZXJ0SlBUVG9KUlQoanB0KSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZnAgPT0gbnVsbCkgewotCQkJanB0LnVwZGF0ZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVNoYXBlIGVsID0gKFNoYXBlKSBmcC5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoanB0KTsKLQkJaWYoSlBBQ2hlY2tTdW0uSU5TVEFOQ0UoKS5pc0VudGl0eU1vZGVsQ2hhbmdlZChlbCwganB0LmdldEpwYVByb2plY3QoKSkpewotCQkJdHJ5IHsKLQkJCQlqcHQudXBkYXRlKCk7Ci0JCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQ29sbGVjdGlvbihDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSwKLQkJCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIFN0cmluZyBhdHRyVHh0KSB7Ci0JCU9iamVjdCBvYiA9IGZwLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChlbnRpdHlTaGFwZSk7Ci0JCWlmKG9iIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKXsKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBvYjsKLQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSBmcC5nZXRDb21waWxhdGlvblVuaXQoanB0KTsKLQkJCQlJVHlwZSB0eXBlID0gY3UuZ2V0VHlwZShKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoanB0LmdldE5hbWUoKSkpOwotCQkJSUZpZWxkIGZpZWxkID0gdHlwZS5nZXRGaWVsZChhdHRyVHh0KTsKLQkJCWludCBjbnQgPSAwOwotCQkJd2hpbGUgKChjbnQgPCAyMCkgJiYgIWZpZWxkLmV4aXN0cygpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKDI1MCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJTbGVlcCBpbnRlcnJ1cHRlZCIsIGUpOyAvLyROT04tTkxTLTEkCQkJCQotCQkJCX0KLQkJCQlmaWVsZCA9IHR5cGUuZ2V0RmllbGQoYXR0clR4dCk7Ci0JCQkJY250Kys7Ci0JCQl9Ci0JCQlpZiAoZmllbGQuZXhpc3RzKCkpIHsKLQkJCQl0cnkgewotCQkJCQlpZihmaWVsZC5nZXRUeXBlU2lnbmF0dXJlKCkuY29udGFpbnMoIkxpc3QiKSB8fCBmaWVsZC5nZXRUeXBlU2lnbmF0dXJlKCkuY29udGFpbnMoIlNldCIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCXx8IGZpZWxkLmdldFR5cGVTaWduYXR1cmUoKS5jb250YWlucygiQ29sbGVjdGlvbiIpIHx8IGZpZWxkLmdldFR5cGVTaWduYXR1cmUoKS5jb250YWlucygiTWFwIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJfHwgZmllbGQuZ2V0VHlwZVNpZ25hdHVyZSgpLmVuZHNXaXRoKCJbXSIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKEpQQUVkaXRvck1lc3NhZ2VzLkpwYUFydGlmYWN0RmFjdG9yeV9DYW5Ob3RDaGVja1JldHVyblR5cGUgKwotCQkJCQkJCSIgIiArIGF0dHJUeHQgKyAiXCIiLCBlKTsgLy8kTk9OLU5MUy0xJAkJLy8kTk9OLU5MUy0yJAkJCi0JCQkJfQkJCQkKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNHZXR0ZXJNZXRob2RSZXR1cm5UeXBlQ29sbGVjdGlvbigKLQkJCUNvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlLCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLAotCQkJU3RyaW5nIGF0dHJUeHQpIHsKLQkJT2JqZWN0IG9iID0gZnAuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGVudGl0eVNoYXBlKTsKLQkJaWYob2IgaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpewotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgb2I7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBmcC5nZXRDb21waWxhdGlvblVuaXQoanB0KTsKLQkJCUlUeXBlIHR5cGUgPSBjdS5nZXRUeXBlKEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShqcHQuZ2V0TmFtZSgpKSk7Ci0JCQlTdHJpbmcgYXR0ck5hbWVXaXRoQ2FwaXRhbExldHRlciA9IGF0dHJUeHQuc3Vic3RyaW5nKDAsIDEpCi0JCQkJCS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCkKLQkJCQkJKyBhdHRyVHh0LnN1YnN0cmluZygxKTsKLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSAiZ2V0IiArIGF0dHJOYW1lV2l0aENhcGl0YWxMZXR0ZXI7ICAvLyROT04tTkxTLTEkCi0JCUlNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QobWV0aG9kTmFtZSwgbmV3IFN0cmluZ1swXSk7Ci0JCXRyeSB7Ci0JCQlpZihtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmNvbnRhaW5zKCJMaXN0IikgfHwgbWV0aG9kLmdldFJldHVyblR5cGUoKS5jb250YWlucygiU2V0IikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXx8IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuY29udGFpbnMoIkNvbGxlY3Rpb24iKSB8fCBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmNvbnRhaW5zKCJNYXAiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfHwgbWV0aG9kLmdldFJldHVyblR5cGUoKS5lbmRzV2l0aCgiW10iKSkgLy8kTk9OLU5MUy0xJAotCQkJICByZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoSlBBRWRpdG9yTWVzc2FnZXMuSnBhQXJ0aWZhY3RGYWN0b3J5X0Nhbk5vdENoZWNrUmV0dXJuVHlwZSArIAotCQkJCQkiICIgKyBhdHRyVHh0ICsgIlwiIiwgZSk7IC8vJE5PTi1OTFMtMSQJCS8vJE5PTi1OTFMtMiQJCQotCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZU5ld0F0dHJpYnV0ZShKYXZhUGVyc2lzdGVudFR5cGUganB0LCAKLQkJCWJvb2xlYW4gaXNDb2xsZWN0aW9uLCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGlqbCA9IGZwLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCQlTdHJpbmcgYXR0clR5cGVOYW1lID0gImphdmEubGFuZy5TdHJpbmciOyAJCQkJCQkJCQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5ld0F0dHJOYW1lID0gZ2VuVW5pcXVlQXR0ck5hbWUoanB0LCBhdHRyVHlwZU5hbWUsIGZwKTsKLQkJcmV0dXJuIGFkZE5ld0F0dHJpYnV0ZShqcHQsIGlqbCwgbmV3QXR0ck5hbWUsIGF0dHJUeXBlTmFtZSwKLQkJCQkiQEJhc2ljIiwgbmV3QXR0ck5hbWUsIGlzQ29sbGVjdGlvbiwgZnApOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qCi0JICogcHVibGljIFN0cmluZyBjcmVhdGVOZXdBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgU3RyaW5nIGF0dHJOYW1lLAotCSAqIFN0cmluZyBhdHRyVHlwZU5hbWUsIFN0cmluZyBhbm5vdGF0aW9uLCBTdHJpbmcgYWN0TmFtZSwgYm9vbGVhbgotCSAqIGlzQ29sbGVjdGlvbiwgSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JICogCi0JICogSUNvbXBpbGF0aW9uVW5pdCBpamwgPSBmcC5nZXRDb21waWxhdGlvblVuaXQoanB0KTsgcmV0dXJuCi0JICogYWRkTmV3QXR0cmlidXRlKGpwdCwgaWpsLCBhdHRyTmFtZSwgYXR0clR5cGVOYW1lLCBhbm5vdGF0aW9uLCBhY3ROYW1lLAotCSAqIGlzQ29sbGVjdGlvbiwgZnApOyB9Ci0JKi8KLQkKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY3JlYXRlQU5ld0F0dHJpYnV0ZShKYXZhUGVyc2lzdGVudFR5cGUganB0LCAKLQkJCVN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIGF0dHJUeXBlTmFtZSwgU3RyaW5nW10gYXR0clR5cGVFbGVtZW50TmFtZXMsCi0JCQlTdHJpbmcgYWN0TmFtZSwgTGlzdDxTdHJpbmc+IGFubm90YXRpb25zLCBib29sZWFuIGlzQ29sbGVjdGlvbiwKLQkJCWJvb2xlYW4gaXNNZXRob2RBbm5vdGF0ZWQsIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgaWpsID0gZnAuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JCXJldHVybiBhZGRBTmV3QXR0cmlidXRlKGpwdCwgaWpsLCBhdHRyTmFtZSwgYXR0clR5cGVOYW1lLAotCQkJCWF0dHJUeXBlRWxlbWVudE5hbWVzLCBhY3ROYW1lLCBhbm5vdGF0aW9ucywgaXNDb2xsZWN0aW9uLAotCQkJCWlzTWV0aG9kQW5ub3RhdGVkLCBmcCk7Ci0JfQotCQkKLQlwcml2YXRlIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGFkZEFOZXdBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgCi0JCQlJQ29tcGlsYXRpb25Vbml0IGN1LCBTdHJpbmcgYXR0ck5hbWUsIFN0cmluZyBhdHRyVHlwZU5hbWUsCi0JCQlTdHJpbmdbXSBhdHRyVHlwZUVsZW1lbnROYW1lcywgU3RyaW5nIGFjdE5hbWUsCi0JCQlMaXN0PFN0cmluZz4gYW5ub3RhdGlvbnMsIGJvb2xlYW4gaXNDb2xsZWN0aW9uLAotCQkJYm9vbGVhbiBpc01ldGhvZEFubm90YXRlZCwgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0ciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhdHRyID0gbWFrZU5ld0F0dHJpYnV0ZShmcCwganB0LCBjdSwgYXR0ck5hbWUsIGF0dHJUeXBlTmFtZSwKLQkJCQkJYXR0clR5cGVFbGVtZW50TmFtZXMsIGFjdE5hbWUsIGFubm90YXRpb25zLCBpc0NvbGxlY3Rpb24sCi0JCQkJCWlzTWV0aG9kQW5ub3RhdGVkKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCBjcmVhdGUgYSBuZXcgYXR0cmlidXRlIHdpdGggbmFtZSAiICsgYXR0ck5hbWUsIGUpOyAvLyROT04tTkxTLTEkCQkKLQkJfQotCQlyZXR1cm4gYXR0cjsJCQkJCQkKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBhZGROZXdBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgSUNvbXBpbGF0aW9uVW5pdCBjdSwKLQkJCVN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIGF0dHJUeXBlTmFtZSwgU3RyaW5nIGFubm90YXRpb24sCi0JCQlTdHJpbmcgYWN0TmFtZSwgYm9vbGVhbiBpc0NvbGxlY3Rpb24sIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJCi0JCXRyeSB7Ci0JCQlMaXN0PFN0cmluZz4gYW5ub3RhdGlvbnMgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7Ci0JCQlhbm5vdGF0aW9ucy5hZGQoYW5ub3RhdGlvbik7Ci0JCQlib29sZWFuIGlzTWV0aG9kQW5ub3RhdGVkID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkKLQkJCQkJLmlzTWV0aG9kQW5ub3RhdGVkKGpwdCk7Ci0JCQltYWtlTmV3QXR0cmlidXRlKGZwLCBqcHQsIGN1LCBhdHRyTmFtZSwgYXR0clR5cGVOYW1lLCBudWxsLCBhY3ROYW1lLAotCQkJCQlhbm5vdGF0aW9ucywgaXNDb2xsZWN0aW9uLCBpc01ldGhvZEFubm90YXRlZCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3QgY3JlYXRlIGEgbmV3IGF0dHJpYnV0ZSB3aXRoIG5hbWUgIiArIGF0dHJOYW1lLCBlKTsgLy8kTk9OLU5MUy0xJAkJCi0JCX0KLQkJcmV0dXJuIGF0dHJOYW1lOwkJCQkKLQl9Ci0JCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG1ha2VOZXdBdHRyaWJ1dGUoSUZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgCi0JCQlJQ29tcGlsYXRpb25Vbml0IGN1LCBTdHJpbmcgYXR0ck5hbWUsIFN0cmluZyBhdHRyVHlwZU5hbWUsCi0JCQlTdHJpbmdbXSBhdHRyVHlwZXMsIFN0cmluZyBhY3ROYW1lLAotCQkJTGlzdDxTdHJpbmc+IGFubm90YXRpb25zLCBib29sZWFuIGlzQ29sbGVjdGlvbiwKLQkJCWJvb2xlYW4gaXNNZXRob2RBbm5vdGF0ZWQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkKLQkJSVR5cGUgdHlwZSA9IGN1LmZpbmRQcmltYXJ5VHlwZSgpOwotCQlTdHJpbmcgY29udGVudHMgPSAiIjsgCQkJCQkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCWlzTWV0aG9kQW5ub3RhdGVkID0gKGFubm90YXRpb25zICE9IG51bGwpICYmICghYW5ub3RhdGlvbnMuaXNFbXB0eSgpKSA/IGlzTWV0aG9kQW5ub3RhdGVkCi0JCQkJOiBKcGFBcnRpZmFjdEZhY3RvcnkuSU5TVEFOQ0UuaXNNZXRob2RBbm5vdGF0ZWQoanB0KTsKLQkJCi0JCWlmICghaXNNZXRob2RBbm5vdGF0ZWQpIHsKLQkJCWlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3I8U3RyaW5nPiBpdCA9IGFubm90YXRpb25zLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlTdHJpbmcgYW4gPSBpdC5uZXh0KCk7Ci0JCQkJCWNvbnRlbnRzICs9ICIgICAiICsgYW4gKyAiXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9CQkJCQkJCQotCQkJfQotCQl9Ci0JCQotCQlpZihhbm5vdGF0aW9ucyE9bnVsbCAmJiBhbm5vdGF0aW9ucy5jb250YWlucygiQEJhc2ljIikpeyAvLyROT04tTkxTLTEkCi0JCQlpZighY3UuZ2V0SW1wb3J0KCJqYXZheC5wZXJzaXN0ZW5jZS4qIikuZXhpc3RzKCkgJiYgIWN1LmdldEltcG9ydCgiamF2YXgucGVyc2lzdGVuY2UuQmFzaWMiKS5leGlzdHMoKSl7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUpQQUVkaXRvclV0aWwuY3JlYXRlSW1wb3J0cyhjdSwgImphdmF4LnBlcnNpc3RlbmNlLkJhc2ljIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkKLQkJYm9vbGVhbiBzaG91bGRBZGRJbXBvcnQgPSB0cnVlOwotCQlJSW1wb3J0RGVjbGFyYXRpb25bXSBpbXBvcnREZWNsYXJhdGlvbnMgPSBjdS5nZXRJbXBvcnRzKCk7Ci0JCVN0cmluZyBhdHRyU2hvcnRUeXBlTmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShhdHRyVHlwZU5hbWUpOwotCQlmb3IoSUltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2wgOiBpbXBvcnREZWNsYXJhdGlvbnMpewotCQkJU3RyaW5nIGltcG9ydGVkRGVjbGFyYXRpb25GUU4gPSBpbXBvcnREZWNsLmdldEVsZW1lbnROYW1lKCk7Ci0JCQlTdHJpbmcgaW1wb3J0ZWREZWNsYXJhdGlvblNob3J0TmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShpbXBvcnRlZERlY2xhcmF0aW9uRlFOKTsKLQkJCWlmKGF0dHJTaG9ydFR5cGVOYW1lLmVxdWFscyhpbXBvcnRlZERlY2xhcmF0aW9uU2hvcnROYW1lKSAmJiAhYXR0clR5cGVOYW1lLmVxdWFscyhpbXBvcnRlZERlY2xhcmF0aW9uRlFOKSkKLQkJCQlzaG91bGRBZGRJbXBvcnQgPSBmYWxzZTsKLQkJfQotCQkKLQkJaWYoc2hvdWxkQWRkSW1wb3J0KXsKLQkJCUpQQUVkaXRvclV0aWwuY3JlYXRlSW1wb3J0cyhjdSwgYXR0clR5cGVOYW1lKTsKLQkJICAgIGF0dHJUeXBlTmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShhdHRyVHlwZU5hbWUpOwotCQl9Ci0JCWlmICgoYXR0clR5cGVzICE9IG51bGwpICYmIChhdHRyVHlwZXMubGVuZ3RoID4gMCkpIHsKLQkJCUpQQUVkaXRvclV0aWwuY3JlYXRlSW1wb3J0cyhjdSwgYXR0clR5cGVzKTsKLQkJfQotCQkKLQkJY29udGVudHMgKz0gIiAgICBwcml2YXRlICIgKyBhdHRyVHlwZU5hbWUgKyAvLyROT04tTkxTLTEkCi0JCQkJKChhdHRyVHlwZXMgPT0gbnVsbCkgPyAiIiA6ICgiPCIgKyBKUEFFZGl0b3JVdGlsLmNyZWF0ZUNvbW1hU2VwYXJhdGVkTGlzdE9mU2ltcGxlVHlwZU5hbWVzKGF0dHJUeXBlcykgKyAiPiIpKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJIiAiICsgYXR0ck5hbWUgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJCi0KLQkJdHlwZS5jcmVhdGVNZXRob2QoCi0JCQkJZ2VuU2V0dGVyQ29udGVudHMoYXR0ck5hbWUsIGF0dHJUeXBlTmFtZSwgYXR0clR5cGVzLAotCQkJCQkJYWN0TmFtZSwgaXNDb2xsZWN0aW9uKSwgbnVsbCwgZmFsc2UsCi0JCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCWlmIChpc01ldGhvZEFubm90YXRlZCkgewotCQkJdHlwZS5jcmVhdGVNZXRob2QoCi0JCQkJCWdlbkdldHRlckNvbnRlbnRzKGF0dHJOYW1lLCBhdHRyVHlwZU5hbWUsCi0JCQkJCQkJYXR0clR5cGVzLCBhY3ROYW1lLCBhbm5vdGF0aW9ucywKLQkJCQkJCQlpc0NvbGxlY3Rpb24pLCBudWxsLCBmYWxzZSwKLQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl0eXBlLmNyZWF0ZUZpZWxkKGNvbnRlbnRzLCBudWxsLCBmYWxzZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gZWxzZSB7Ci0JCQl0eXBlLmNyZWF0ZUZpZWxkKGNvbnRlbnRzLCBudWxsLCBmYWxzZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl0eXBlLmNyZWF0ZU1ldGhvZCgKLQkJCQkJZ2VuR2V0dGVyQ29udGVudHMoYXR0ck5hbWUsIGF0dHJUeXBlTmFtZSwKLQkJCQkJCQlhdHRyVHlwZXMsIGFjdE5hbWUsIG51bGwsIGlzQ29sbGVjdGlvbiksCi0JCQkJCW51bGwsIGZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQkJCi0JCQotCQlpbnQgY250ID0gMDsKLQkJcmVmcmVzaEVudGl0eU1vZGVsKGZwLCBqcHQpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEgPSBqcHQuZ2V0QXR0cmlidXRlTmFtZWQoYXR0ck5hbWUpOwotCQl3aGlsZSAoKGpwYSA9PSBudWxsKSAmJiAoY250IDwgMjUpKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgyNTApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQlqcGEgPSBqcHQuZ2V0QXR0cmlidXRlTmFtZWQoYXR0ck5hbWUpOwotCQkJY250Kys7Ci0JCX0KLQkJCQotCQkvKgotCQlpZihqcHQuZ2V0QXR0cmlidXRlTmFtZWQoYXR0ck5hbWUpID09IG51bGwpewotCQkJICAgcmVmcmVzaEVudGl0eU1vZGVsKGZwLCBqcHQpOwotCQl9Ci0JCSovCi0JCQotCQlyZXR1cm4gZ2V0QXR0cmlidXRlRnJvbUVudGl0eShqcHQsIGF0dHJOYW1lKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIGRlbGV0ZUF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudFR5cGUganB0LCBTdHJpbmcgYXR0cmlidXRlTmFtZSwKLQkJCQkJCQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQkKLQkJU3RyaW5nIGF0dHJOYW1lV2l0aENhcGl0YWxMZXR0ZXIgPSBhdHRyaWJ1dGVOYW1lLnN1YnN0cmluZygwLCAxKQotCQkJCS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCkKLQkJCQkrIGF0dHJpYnV0ZU5hbWUuc3Vic3RyaW5nKDEpOwotCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBVbml0ID0gZnAuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7CQkKLQkJSVR5cGUgamF2YVR5cGUgPSBjb21wVW5pdC5maW5kUHJpbWFyeVR5cGUoKTsKLQkJU3RyaW5nIHR5cGVTaWduYXR1cmUgPSBudWxsOwotCQlTdHJpbmcgZ2V0dGVyUHJlZml4ID0gImdldCI7IAkJCS8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBnZXR0ZXJQcmVmaXggKyBhdHRyTmFtZVdpdGhDYXBpdGFsTGV0dGVyOyAKLQkJSU1ldGhvZCBnZXRBdHRyaWJ1dGVNZXRob2QgPSBqYXZhVHlwZS5nZXRNZXRob2QobWV0aG9kTmFtZSwKLQkJCQluZXcgU3RyaW5nWzBdKTsKLQkJaWYgKCFnZXRBdHRyaWJ1dGVNZXRob2QuZXhpc3RzKCkpIHsKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSA9IGpwdC5nZXRBdHRyaWJ1dGVOYW1lZChhdHRyaWJ1dGVOYW1lKTsKLQkJCVN0cmluZyB0eXBlTmFtZSA9IGpwYS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldFR5cGVOYW1lKCk7Ci0JCQlpZiAoImJvb2xlYW4iLmVxdWFscyh0eXBlTmFtZSkpIHsJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCWdldHRlclByZWZpeCA9ICJpcyI7CQkJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCW1ldGhvZE5hbWUgPSBnZXR0ZXJQcmVmaXggKyBhdHRyTmFtZVdpdGhDYXBpdGFsTGV0dGVyOyAJCQkJCi0JCQkJZ2V0QXR0cmlidXRlTWV0aG9kID0gamF2YVR5cGUuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsCi0JCQkJCQluZXcgU3RyaW5nWzBdKTsKLQkJCX0JCQotCQkJdHJ5IHsKLQkJCQlpZiAoKGdldEF0dHJpYnV0ZU1ldGhvZCAhPSBudWxsKSAmJiBnZXRBdHRyaWJ1dGVNZXRob2QuZXhpc3RzKCkpOwotCQkJCQl0eXBlU2lnbmF0dXJlID0gZ2V0QXR0cmlidXRlTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlMSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCBvYnRhaW4gdGhlIHR5cGUgb2YgdGhlIGdldHRlciB3aXRoIG5hbWUgIiArIG1ldGhvZE5hbWUgKyAiKCkiLCBlMSk7IAkvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKLQkJCX0JCQkKLQkJfQotCQlpZiAodHlwZVNpZ25hdHVyZSA9PSBudWxsKQotCQkgCW1ldGhvZE5hbWUgPSBudWxsOwkJCi0JCQotCQlib29sZWFuIGlzTWV0aG9kQW5ub3RhdGVkID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkKLQkJCQkuaXNNZXRob2RBbm5vdGF0ZWQoanB0KTsKLQkJaWYgKGlzTWV0aG9kQW5ub3RhdGVkKSB7Ci0JCQl0cnkgewotCQkJCUlGaWVsZCBhdHRyaWJ1dGVGaWVsZCA9IGphdmFUeXBlLmdldEZpZWxkKGF0dHJpYnV0ZU5hbWUpOwotCQkJCQotCQkJCWlmICgoYXR0cmlidXRlRmllbGQgIT0gbnVsbCkgJiYgIWF0dHJpYnV0ZUZpZWxkLmV4aXN0cygpKQotCQkJCQlhdHRyaWJ1dGVGaWVsZCA9IGphdmFUeXBlLmdldEZpZWxkKEpQQUVkaXRvclV0aWwucmV2ZXJ0Rmlyc3RMZXR0ZXJDYXNlKGF0dHJpYnV0ZU5hbWUpKTsKLQkJCQlpZiAoKGF0dHJpYnV0ZUZpZWxkICE9IG51bGwpICYmIGF0dHJpYnV0ZUZpZWxkLmV4aXN0cygpKSAKLQkJCQkJYXR0cmlidXRlRmllbGQuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3QgcmVtb3ZlIHRoZSBhdHRyaWJ1dGUgZmllbGQgd2l0aCBuYW1lICIgKyBhdHRyaWJ1dGVOYW1lLCBlKTsgCS8vJE5PTi1OTFMtMSQJCi0JCQl9IAotCQkJdHJ5IHsKLQkJCQltZXRob2ROYW1lID0gZ2V0dGVyUHJlZml4ICsgYXR0ck5hbWVXaXRoQ2FwaXRhbExldHRlcjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChnZXRBdHRyaWJ1dGVNZXRob2QgIT0gbnVsbCkgewotCQkJCQl0eXBlU2lnbmF0dXJlID0gZ2V0QXR0cmlidXRlTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJCQkJaWYgKGdldEF0dHJpYnV0ZU1ldGhvZC5leGlzdHMoKSkKLQkJCQkJCWdldEF0dHJpYnV0ZU1ldGhvZC5kZWxldGUodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3QgcmVtb3ZlIHRoZSBhdHRyaWJ1dGUgZ2V0dGVyIHdpdGggbmFtZSAiICsgbWV0aG9kTmFtZSArICIoKSIsIGUpOyAJLy8kTk9OLU5MUy0xJAkgLy8kTk9OLU5MUy0yJAotCQkJfSAJCi0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCW1ldGhvZE5hbWUgPSBnZXR0ZXJQcmVmaXggKyBhdHRyTmFtZVdpdGhDYXBpdGFsTGV0dGVyOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGdldEF0dHJpYnV0ZU1ldGhvZC5leGlzdHMoKSkgewotCQkJCQl0eXBlU2lnbmF0dXJlID0gZ2V0QXR0cmlidXRlTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJCQkJZ2V0QXR0cmlidXRlTWV0aG9kLmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCByZW1vdmUgdGhlIGF0dHJpYnV0ZSBnZXR0ZXIgd2l0aCBuYW1lICIgKyBtZXRob2ROYW1lICsgIigpIiwgZSk7IAkvLyROT04tTkxTLTEkCSAvLyROT04tTkxTLTIkCi0JCQl9IAkKLQkJCXRyeSB7Ci0JCQkJSUZpZWxkIGF0dHJpYnV0ZUZpZWxkID0gamF2YVR5cGUuZ2V0RmllbGQoYXR0cmlidXRlTmFtZSk7Ci0JCQkJaWYgKGF0dHJpYnV0ZUZpZWxkICE9IG51bGwpCi0JCQkJCWlmICghYXR0cmlidXRlRmllbGQuZXhpc3RzKCkpCi0JCQkJCQlhdHRyaWJ1dGVGaWVsZCA9IGphdmFUeXBlLmdldEZpZWxkKEpQQUVkaXRvclV0aWwucmV2ZXJ0Rmlyc3RMZXR0ZXJDYXNlKGF0dHJpYnV0ZU5hbWUpKTsJCQkKLQkJCQlpZiAoKGF0dHJpYnV0ZUZpZWxkICE9IG51bGwpICYmIGF0dHJpYnV0ZUZpZWxkLmV4aXN0cygpKQotCQkJCQlhdHRyaWJ1dGVGaWVsZC5kZWxldGUodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCByZW1vdmUgdGhlIGF0dHJpYnV0ZSBmaWVsZCB3aXRoIG5hbWUgIiArIGF0dHJpYnV0ZU5hbWUsIGUpOyAJLy8kTk9OLU5MUy0xJAkKLQkJCX0gCQkJCi0JCX0KLQkJdHJ5IHsKLQkJCW1ldGhvZE5hbWUgPSAic2V0IiArIGF0dHJOYW1lV2l0aENhcGl0YWxMZXR0ZXI7IC8vJE5PTi1OTFMtMSQKLQkJCUlNZXRob2Qgc2V0QXR0cmlidXRlTWV0aG9kID0gamF2YVR5cGUuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsCi0JCQkJCW5ldyBTdHJpbmdbXSB7IHR5cGVTaWduYXR1cmUgfSk7Ci0JCQlpZiAoKHNldEF0dHJpYnV0ZU1ldGhvZCAhPSBudWxsKSAmJiBzZXRBdHRyaWJ1dGVNZXRob2QuZXhpc3RzKCkpCi0JCQkJc2V0QXR0cmlidXRlTWV0aG9kLmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCByZW1vdmUgdGhlIGF0dHJpYnV0ZSBzZXR0ZXIgd2l0aCBuYW1lICIgKyBtZXRob2ROYW1lICsgIiguLi4pIiwgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkKLQkJfSAJCQotCQkKLQkJcmVmcmVzaEVudGl0eU1vZGVsKGZwLCBqcHQpOwotCQkKLQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGF0ID0ganB0LnJlc29sdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7Ci0JCWludCBjID0gMDsKLQkJd2hpbGUgKChhdCAhPSBudWxsKSAmJiAoYyA8IE1BWF9OVU1fT0ZfSVRFUkFUSU9OUykpIHsgCi0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcChQQVVTRV9EVVJBVElPTik7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiVGhyZWFkLnNsZWVwKCkgaW50ZXJydXB0ZWQiLCBlKTsgLy8kTk9OLU5MUy0xJAkJCi0JCQl9CQotCQkJYXQgPSBqcHQuZ2V0QXR0cmlidXRlTmFtZWQoYXR0cmlidXRlTmFtZSk7CQkJCi0JCQljKys7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZW5VbmlxdWVBdHRyTmFtZShKYXZhUGVyc2lzdGVudFR5cGUganB0LCAKLQkJCVN0cmluZyBhdHRyVHlwZU5hbWUsIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgaWpsID0gZnAuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JCUlUeXBlIHR5cGUgPSBudWxsOwotCQl0eXBlID0gaWpsLmZpbmRQcmltYXJ5VHlwZSgpOwotCQlTZXQ8U3RyaW5nPiBhdHRyTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWZvciAoU3RyaW5nIG5hbWUgOiBqcHQuZ2V0QXR0cmlidXRlTmFtZXMoKSkgewotCQkJYXR0ck5hbWVzLmFkZChuYW1lKTsKLQkJfQkJCi0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCAxMDAwMDAwMDsgaSsrKSB7Ci0JCQluYW1lID0gImF0dHJpYnV0ZSIgKyBpOyAgCS8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBhdHRyTmFtZVdpdGhDYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbAotCQkJCQkuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKG5hbWUpOwotCQkJU3RyaW5nIGdldHRlck5hbWUgPSAiZ2V0IiArIGF0dHJOYW1lV2l0aENhcGl0YWxMZXR0ZXI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBzZXR0ZXJOYW1lID0gInNldCIgKyBhdHRyTmFtZVdpdGhDYXBpdGFsTGV0dGVyOyAgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCFhdHRyTmFtZXMuY29udGFpbnMobmFtZSkpIHsKLQkJCQlJRmllbGQgZmxkID0gdHlwZS5nZXRGaWVsZChuYW1lKTsKLQkJCQlJTWV0aG9kIGdldHRlciA9IHR5cGUuZ2V0TWV0aG9kKGdldHRlck5hbWUsIG5ldyBTdHJpbmdbXSB7fSk7Ci0JCQkJSU1ldGhvZCBzZXR0ZXIxID0gdHlwZS5nZXRNZXRob2Qoc2V0dGVyTmFtZSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7IGF0dHJUeXBlTmFtZSB9KTsKLQkJCQlJTWV0aG9kIHNldHRlcjIgPSB0eXBlLmdldE1ldGhvZChzZXR0ZXJOYW1lLAotCQkJCQkJbmV3IFN0cmluZ1tdIHsgIlFTZXQ8USIgKyBhdHRyVHlwZU5hbWUgKyAiOz47IiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJSU1ldGhvZCBzZXR0ZXIzID0gdHlwZQotCQkJCQkJLmdldE1ldGhvZCgKLQkJCQkJCQkJc2V0dGVyTmFtZSwKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgIlFDb2xsZWN0aW9uPFEiICsgYXR0clR5cGVOYW1lICsgIjs+OyIgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUlNZXRob2Qgc2V0dGVyNCA9IHR5cGUuZ2V0TWV0aG9kKHNldHRlck5hbWUsCi0JCQkJCQluZXcgU3RyaW5nW10geyAiUVNldDsiIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJSU1ldGhvZCBzZXR0ZXI1ID0gdHlwZS5nZXRNZXRob2Qoc2V0dGVyTmFtZSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7ICJRQ29sbGVjdGlvbjsiIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKCFmbGQuZXhpc3RzKCkgJiYgIWdldHRlci5leGlzdHMoKSAmJiAhc2V0dGVyMS5leGlzdHMoKQotCQkJCQkJJiYgIXNldHRlcjIuZXhpc3RzKCkgJiYgIXNldHRlcjMuZXhpc3RzKCkKLQkJCQkJCSYmICFzZXR0ZXI0LmV4aXN0cygpICYmICFzZXR0ZXI1LmV4aXN0cygpKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCQotCXB1YmxpYyBBbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnMoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYml0ZSkgewkKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIGpycHQgPSBwZXJzaXN0ZW50QXR0cmliaXRlLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JCUFubm90YXRpb25bXSByZXMgPSBuZXcgQW5ub3RhdGlvbltqcnB0LmdldEFubm90YXRpb25zU2l6ZSgpXTsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbWFwcGluZ0Fubm90YXRpb25zU2l6ZSgpICsganJwdC5zdXBwb3J0aW5nQW5ub3RhdGlvbnNTaXplKCldOwotCQlpbnQgYyA9IDA7Ci0JCWZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDoganJwdC5nZXRBbm5vdGF0aW9ucygpKSB7Ci0JCQlyZXNbY10gPSBhbm5vdGF0aW9uOwotCQkJYysrOwotCQl9Ci0JCS8qCi0JCWl0ID0ganJwdC5zdXBwb3J0aW5nQW5ub3RhdGlvbnMoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJcmVzW2NdID0gaXQubmV4dCgpOwotCQkJYysrOwotCQl9Ci0JCSovCi0JCXJldHVybiByZXM7Ci0JfQkJCi0JCi0JcHVibGljIEhhc2hTZXQ8U3RyaW5nPiBnZXRBbm5vdGF0aW9uTmFtZXMoCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmliaXRlKSB7Ci0JCQotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUganJwdCA9IHBlcnNpc3RlbnRBdHRyaWJpdGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJSGFzaFNldDxTdHJpbmc+IHJlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBqcnB0LmdldEFubm90YXRpb25zKCkpIHsKLQkJCXJlcy5hZGQoSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkpOwotCQl9Ci0JCS8qCi0JCWl0ID0ganJwdC5zdXBwb3J0aW5nQW5ub3RhdGlvbnMoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgCi0JCQlyZXMuYWRkKEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoaXQubmV4dCgpLmdldEFubm90YXRpb25OYW1lKCkpKTsKLQkJKi8KLQkJcmV0dXJuIHJlczsKLQl9CQotCQotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QW5ub3RhdGlvblN0cmluZ3MoCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmliaXRlKSB7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlwZXJzaXN0ZW50QXR0cmliaXRlLmdldFBhcmVudCgpOwotCQlDb21waWxhdGlvblVuaXQgamR0Q1UgPSBqcHQuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCgpLmJ1aWxkQVNUUm9vdCgpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUganJwdCA9IHBlcnNpc3RlbnRBdHRyaWJpdGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJTGlzdDxTdHJpbmc+IHJlcyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChBbm5vdGF0aW9uIGFuIDoganJwdC5nZXRBbm5vdGF0aW9ucygpKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBqZHRBbiA9IGFuLmdldEFzdEFubm90YXRpb24oamR0Q1UpOwotCQkJcmVzLmFkZChqZHRBbi50b1N0cmluZygpKTsKLQkJfQotCQkvKgotCQlpdCA9IGpycHQuc3VwcG9ydGluZ0Fubm90YXRpb25zKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsgCi0JCQlBbm5vdGF0aW9uIGFuID0gaXQubmV4dCgpOwotCQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gamR0QW4gPSBhbi5nZXRKZHRBbm5vdGF0aW9uKGpkdENVKTsKLQkJCXJlcy5hZGQoamR0QW4udG9TdHJpbmcoKSk7Ci0JCX0KLQkJKi8KLQkJcmV0dXJuIHJlczsKLQl9CQotCQkKLQlwcml2YXRlIGJvb2xlYW4gaXNOb25Pd25lcihKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCkgewotCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYW0gPSBhdC5nZXRNYXBwaW5nKCk7Ci0JCS8vaWYgKGphbS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpID09IG51bGwpIHsKLQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCAoSmF2YVBlcnNpc3RlbnRUeXBlKWF0LmdldFBhcmVudCgpKTsKLQkJCWphbSA9IGF0LmdldE1hcHBpbmcoKTsKLQkJLy99Ci0JCWlmICghKGphbS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpIGluc3RhbmNlb2YgT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIG5vbSA9IChPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24pamFtLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiBub20uZ2V0TWFwcGVkQnkoKSAhPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbjxJUmVsYXRpb24+IHByb2R1Y2VBbGxSZWxhdGlvbnMoCi0JCQlKYXZhUGVyc2lzdGVudFR5cGUgbmV3SlBULCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCQotCQlDb2xsZWN0aW9uPElSZWxhdGlvbj4gcmVzID0gcHJvZHVjZVJlbGF0aW9ucyhuZXdKUFQsIGZwKTsKLQkJSXRlcmF0b3I8SVJlbGF0aW9uPiBpdCA9IHJlcy5pdGVyYXRvcigpOwotCQlIYXNoU2V0PEphdmFQZXJzaXN0ZW50VHlwZT4gY2hlY2tlZEVudGl0aWVzID0gbmV3IEhhc2hTZXQ8SmF2YVBlcnNpc3RlbnRUeXBlPigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJUmVsYXRpb24gcmVsID0gaXQubmV4dCgpOwotCQkJY2hlY2tlZEVudGl0aWVzLmFkZChyZWwuZ2V0T3duZXIoKSk7Ci0JCQljaGVja2VkRW50aXRpZXMuYWRkKHJlbC5nZXRJbnZlcnNlKCkpOwotCQl9Ci0JCUxpc3Q8U2hhcGU+IHNoYXBlcyA9IGZwLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCkKLQkJCQkuZ2V0Q2hpbGRyZW4oKTsKLQkJSXRlcmF0b3I8U2hhcGU+IGl0ZXIgPSBzaGFwZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlTaGFwZSBzaCA9IGl0ZXIubmV4dCgpOwotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGZwCi0JCQkJCS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoc2gpOwotCQkJaWYgKGpwdCA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJLy9pZiAoIWNoZWNrZWRFbnRpdGllcy5jb250YWlucyhqcHQpKSB7Ci0JCQkJQ29sbGVjdGlvbjxJUmVsYXRpb24+IHJlbHMgPSBwcm9kdWNlUmVsYXRpb25zKGpwdCwgbmV3SlBULCBmcCk7Ci0JCQkJcmVzLmFkZEFsbChyZWxzKTsKLQkJCS8vfQotCQl9Ci0JCXJldHVybiByZXM7Ci0JIH0KLQkKLQlwcml2YXRlIENvbGxlY3Rpb248SVJlbGF0aW9uPiBwcm9kdWNlUmVsYXRpb25zKAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIG5ld0pQVCwgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQkKLQkJSGFzaFNldDxJUmVsYXRpb24+IHJlcyA9IG5ldyBIYXNoU2V0PElSZWxhdGlvbj4oKTsKLQkJZm9yIChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCA6IG5ld0pQVC5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCUlSZWxhdGlvbiByZWwgPSBwcm9kdWNlUmVsYXRpb24oYXQsIGZwKTsKLQkJCWlmIChyZWwgIT0gbnVsbCkKLQkJCQlyZXMuYWRkKHJlbCk7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNSZWxhdGlvbkFubm90YXRlZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJCi0JCUhhc2hTZXQ8U3RyaW5nPiBhbk5hbWVzID0gZ2V0QW5ub3RhdGlvbk5hbWVzKGpwYSk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXQgPSBhbk5hbWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBhbk5hbWUgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX0FOTk9UQVRJT05TLmNvbnRhaW5zKGFuTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwkJCi0JfQotCQotCXB1YmxpYyBJUmVsYXRpb24gcHJvZHVjZVJlbGF0aW9uKAotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYml0ZSwKLQkJCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJCi0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSBqcnBhID0gcGVyc2lzdGVudEF0dHJpYml0ZQotCQkJCS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJSVJlbGF0aW9uIHJlcyA9IG51bGw7Ci0JCUFubm90YXRpb25bXSBhbnMgPSBnZXRBbm5vdGF0aW9ucyhwZXJzaXN0ZW50QXR0cmliaXRlKTsKLQkJZm9yIChBbm5vdGF0aW9uIGFuIDogYW5zKSB7Ci0JCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoYW4uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JCQlpZiAoSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX0FOTk9UQVRJT05TLmNvbnRhaW5zKGFubm90YXRpb25OYW1lKSkgewotCQkJCVN0cmluZyByZWxUeXBlTmFtZSA9IGdldFJlbFR5cGVOYW1lKChSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbilhbiwganJwYSk7Ci0JCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJlbEpQVCA9IChKYXZhUGVyc2lzdGVudFR5cGUpZnAuZ2V0QnVzaW5lc3NPYmplY3RGb3JLZXkocmVsVHlwZU5hbWUpOwotCQkJCWlmIChyZWxKUFQgIT0gbnVsbCkgCi0JCQkJCXJlcyA9IHByb2R1Y2VSZWxhdGlvbihwZXJzaXN0ZW50QXR0cmliaXRlLCBhbiwgcmVsSlBULCBmcCk7Ci0JCQkJcmV0dXJuIHJlczsKLQkJCX0JCQkJCQkJCQkKLQkJfQotCQlyZXR1cm4gcmVzOwotCQkJCQotCX0KLQkJCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPElSZWxhdGlvbj4gcHJvZHVjZVJlbGF0aW9ucyhKYXZhUGVyc2lzdGVudFR5cGUganB0MSwKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQyLCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCQotCQlDb2xsZWN0aW9uPElSZWxhdGlvbj4gcmVzU2V0ID0gbmV3IEhhc2hTZXQ8SVJlbGF0aW9uPigpOwotCQlJUmVsYXRpb24gcmVzID0gbnVsbDsKLQkJZm9yIChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCA6IGpwdDEuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQlJUmVzb3VyY2UgciA9IGF0LmdldFBhcmVudCgpLmdldFJlc291cmNlKCk7Ci0JCQlpZiAoIXIuZXhpc3RzKCkpCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJSmF2YVJlc291cmNlQXR0cmlidXRlIGpycGEgPSBhdC5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkJCUFubm90YXRpb25bXSBhbnMgPSB0aGlzLmdldEFubm90YXRpb25zKGF0KTsKLQkJCQlmb3IgKEFubm90YXRpb24gYW4gOiBhbnMpIHsKLQkJCQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGFuLmdldEFubm90YXRpb25OYW1lKCkpOwotCQkJCQlpZiAoSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX0FOTk9UQVRJT05TLmNvbnRhaW5zKGFubm90YXRpb25OYW1lKSkgewotCQkJCQkJU3RyaW5nIHJlbFR5cGVOYW1lID0gZ2V0UmVsVHlwZU5hbWUoKFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uKWFuLCBqcnBhKTsKLQkJCQkJCWlmICghcmVsVHlwZU5hbWUuZXF1YWxzKGpwdDIuZ2V0TmFtZSgpKSkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCUphdmFQZXJzaXN0ZW50VHlwZSByZWxKUFQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBmcAotCQkJCQkJCQkuZ2V0QnVzaW5lc3NPYmplY3RGb3JLZXkoanB0Mi5nZXROYW1lKCkpOwotCQkJCQkJcmVzID0gcHJvZHVjZVJlbGF0aW9uKGF0LCBhbiwgcmVsSlBULCBmcCk7Ci0JCQkJCQlpZiAocmVzICE9IG51bGwpCi0JCQkJCQkJcmVzU2V0LmFkZChyZXMpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0JCQkJCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCQkJfQotCQkJCi0JCX0KLQkJcmV0dXJuIHJlc1NldDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVsYXRpb24gYW5ub3RhdGlvbiBvZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIGlmIHRoZXJlIGlzIGFueS4gSWYgbm90IC0gcmV0dXJucyBudWxsCi0JICogCi0JICogQHBhcmFtIGF0Ci0JICogQHJldHVybgotCSAqLwotCQotCS8qCi0JcHJpdmF0ZSBJQW5ub3RhdGlvbiBnZXRSZWxhdGlvbkFubm90YXRpb24oSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQpIHsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhID0gYXQuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCUlBbm5vdGF0YWJsZSBtID0gZ2V0QXR0cmlidXRlTWVtYmVyKGF0KTsKLQkJSUFubm90YXRpb25bXSBhbnMgPSBudWxsOwotCQl0cnkgewotCQkJYW5zID0gbS5nZXRBbm5vdGF0aW9ucygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJdHJhY2VyLmVycm9yKCIiLCBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZvciAoSUFubm90YXRpb24gYW4gOiBhbnMpIHsKLQkJCWlmIChKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fQU5OT1RBVElPTlMuY29udGFpbnMoSlBBRWRpdG9yVXRpbC5jdXRGcm9tTGFzdERvdChhbi5nZXRFbGVtZW50TmFtZSgpKSkpIHsKLQkJCQlyZXR1cm4gYW47Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCSovCi0JCi0JLyoKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UmVsYXRlZEF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudFR5cGUganB0LAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJlbEpQVCkgewotCi0JCUxpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gaXQgPSByZWxKUFQuYXR0cmlidXRlcygpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSByZWxFbnRpdHlBdCA9IGl0Lm5leHQoKTsKLQkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSA9IHJlbEVudGl0eUF0Ci0JCQkJCS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCUFTVE5vZGUgbmQgPSBqcnBhLmdldE1lbWJlcigpLmdldE1vZGlmaWVkRGVjbGFyYXRpb24oKQotCQkJCQkuZ2V0RGVjbGFyYXRpb24oKTsKLQkJCWlmICgobmQgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikKLQkJCQkJfHwgKG5kIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikpIHsKLQkJCQlMaXN0SXRlcmF0b3I8Pz4gbW9kZnMgPSAoKEJvZHlEZWNsYXJhdGlvbikgbmQpLm1vZGlmaWVycygpCi0JCQkJCQkubGlzdEl0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKG1vZGZzLmhhc05leHQoKSkgewotCQkJCQlPYmplY3QgbW9kZiA9IG1vZGZzLm5leHQoKTsKLQkJCQkJaWYgKG1vZGYgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKSB7Ci0JCQkJCQlBbm5vdGF0aW9uIGFuID0gKEFubm90YXRpb24pIG1vZGY7Ci0JCQkJCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBhbi5nZXRUeXBlTmFtZSgpCi0JCQkJCQkJCS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCQkJCWFubm90YXRpb25OYW1lID0gYW5ub3RhdGlvbk5hbWUKLQkJCQkJCQkJLnN1YnN0cmluZyhhbm5vdGF0aW9uTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JCQkJCQlpZiAoSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX0FOTk9UQVRJT05TCi0JCQkJCQkJCS5jb250YWlucyhhbm5vdGF0aW9uTmFtZSkpIHsKLQkJCQkJCQlTdHJpbmcgb3duZXJUeXBlTmFtZSA9IGdldFJlbFR5cGVOYW1lKGFuLCBqcnBhKTsKLQkJCQkJCQlpZiAoIW93bmVyVHlwZU5hbWUuZXF1YWxzKGpwdC5nZXROYW1lKCkpKQotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQlyZXR1cm4gcmVsRW50aXR5QXQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JKi8KLQkKLQkKLQkvKgotCSAqIElmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgaXMgcmVsYXRpb24gYW5ub3RhdGVkIGFuZCBwb2ludHMgdG8gc29tZSBlbnRpdHksCi0JICogd2hpY2ggaXMgdmlzdWFsaXplZCBpbiB0aGUgZGlhZ3JhbSB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBwb2ludGVkCi0JICogZW50aXR5LiBPdGhlcndpc2UgLSBudWxsCi0JICovCi0JCi0JLyoKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRUeXBlIGdldFJlbGF0ZWRFbnRpdHkoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhLCAKLQkJCQkJCQkJCQkJICAgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhID0ganBhCi0JCQkJLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlJVHlwZSB0ID0ganJwYS5nZXRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoKS5nZXRDb21waWxhdGlvblVuaXQoKS5maW5kUHJpbWFyeVR5cGUoKTsKLQkJSUFubm90YXRhYmxlIG0gPSBnZXRBdHRyaWJ1dGVNZW1iZXIoanBhKTsKLQkJSUFubm90YXRpb25bXSBhbnMgPSBtLmdldEFubm90YXRpb25zKCk7Ci0JCWZvciAoSUFubm90YXRpb24gYW4gOiBhbnMpIHsKLQkJCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IGFuLmdldEVsZW1lbnROYW1lKCk7Ci0JCQlhbm5vdGF0aW9uTmFtZSA9IEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoYW5ub3RhdGlvbk5hbWUpOwotCi0JCQlpZiAoSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX0FOTk9UQVRJT05TCi0JCQkJCS5jb250YWlucyhhbm5vdGF0aW9uTmFtZSkpIHsKLQkJCQlTdHJpbmcgcmVsVHlwZU5hbWUgPSBnZXRSZWxUeXBlTmFtZShhbiwganJwYSk7CQkJCQkJCi0JCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJlbEpQVCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGpwYQotCQkJCQkJLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkKLQkJCQkJCS5nZXRQZXJzaXN0ZW50VHlwZShyZWxUeXBlTmFtZSk7Ci0JCQkJaWYgKHJlbEpQVCAhPSBudWxsKQotCQkJCQlpZiAoZnAuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KHJlbEpQVCkgIT0gbnVsbCkKLQkJCQkJCXJldHVybiByZWxKUFQ7Ci0JCQl9CQkJCQkJCi0JCQkKLQkJCQotCQl9Ci0JCQotCQlpZiAoKG5kIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pCi0JCQkJfHwgKG5kIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikpIHsKLQkJCUxpc3RJdGVyYXRvcjw/PiBtb2RmcyA9ICgoQm9keURlY2xhcmF0aW9uKSBuZCkubW9kaWZpZXJzKCkKLQkJCQkJLmxpc3RJdGVyYXRvcigpOwotCQkJd2hpbGUgKG1vZGZzLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBtb2RmID0gbW9kZnMubmV4dCgpOwotCQkJCWlmIChtb2RmIGluc3RhbmNlb2YgQW5ub3RhdGlvbikgewotCQkJCQlBbm5vdGF0aW9uIGFuID0gKEFubm90YXRpb24pbW9kZjsKLQkJCQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gYW4uZ2V0VHlwZU5hbWUoKQotCQkJCQkJCS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCQkJYW5ub3RhdGlvbk5hbWUgPSBhbm5vdGF0aW9uTmFtZS5zdWJzdHJpbmcoYW5ub3RhdGlvbk5hbWUKLQkJCQkJCQkubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCQkJCQlpZiAoSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX0FOTk9UQVRJT05TCi0JCQkJCQkJLmNvbnRhaW5zKGFubm90YXRpb25OYW1lKSkgewotCQkJCQkJU3RyaW5nIHJlbFR5cGVOYW1lID0gZ2V0UmVsVHlwZU5hbWUoYW4sIGpycGEpOwkJCQkJCQotCQkJCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJlbEpQVCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGpwYQotCQkJCQkJCQkuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKQotCQkJCQkJCQkuZ2V0UGVyc2lzdGVudFR5cGUocmVsVHlwZU5hbWUpOwotCQkJCQkJaWYgKHJlbEpQVCAhPSBudWxsKQotCQkJCQkJCWlmIChmcC5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QocmVsSlBUKSAhPSBudWxsKQotCQkJCQkJCQlyZXR1cm4gcmVsSlBUOwotCQkJCQl9CQkJCQkJCi0JCQkJfQkJCQkJCQkJCQkJCQkJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCSovCi0JCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0SlBUKFN0cmluZyBuYW1lLCBQZXJzaXN0ZW5jZVVuaXQgcHUpIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIHB1LmdldFBlcnNpc3RlbnRUeXBlKG5hbWUpOwotCQlpbnQgY250ID0gMDsKLQkJd2hpbGUgKChqcHQgPT0gbnVsbCkgJiYgKGNudCA8IE1BWF9OVU1fT0ZfSVRFUkFUSU9OUykpIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKFBBVVNFX0RVUkFUSU9OKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJTbGVlcCBpbnRlcnJ1cHRlZCIsIGUpOyAvLyROT04tTkxTLTEkCQkKLQkJCX0KLQkJCWpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpcHUuZ2V0UGVyc2lzdGVudFR5cGUobmFtZSk7Ci0JCQljbnQrKzsKLQkJfQkJCi0JCXJldHVybiBqcHQ7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGFsbCB0aGUgYXR0cmlidXRlcyBiZWxvbmdpbmcgdG8gYW5vdGhlciBlbnRpdGllcyBhbmQKLQkgKiBpbnZvbHZlZCBpbiBhIHJlbGF0aW9uIHdpdGggdGhlIGVudGl0eSBnaXZlbiBhcyBwYXJhbWV0ZXIKLQkgKi8KLQlwdWJsaWMgU2V0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRSZWxhdGVkQXR0cmlidXRlcyhKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCVNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gcmVzID0gbmV3IEhhc2hTZXQ8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCUl0ZXJhdG9yPEpwYUZpbGU+IGl0ID0ganB0LmdldEpwYVByb2plY3QoKS5nZXRKcGFGaWxlcygpLml0ZXJhdG9yKCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwdSA9IEpwYUFydGlmYWN0RmFjdG9yeS5JTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZVVuaXQoanB0LmdldEpwYVByb2plY3QoKSk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUpwYUZpbGUganBhRmlsZSA9IGl0Lm5leHQoKTsKLQkJCUpwdFJlc291cmNlTW9kZWwgcm0gPSBqcGFGaWxlLmdldFJlc291cmNlTW9kZWwoKTsKLQkJCWlmIChybSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCFKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuY2xhc3MuaXNJbnN0YW5jZShybSkpCi0JCQkJY29udGludWU7Ci0JCQlKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQganJjdSA9IChKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQpcm07Ci0JCQkvL0NTTiAjMTMwODU5IDIwMTAKLQkJCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBqcnQgPSBqcmN1LmdldFByaW1hcnlUeXBlKCk7Ci0JCQlpZiAoanJ0ID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgbmFtZSA9IGpydC5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUganB0MSA9IChKYXZhUGVyc2lzdGVudFR5cGUpIHB1Ci0JCQkJCS5nZXRQZXJzaXN0ZW50VHlwZShuYW1lKTsKLQkJCWlmIChqcHQxID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlTZXQ8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHJlbEF0cyA9IGdldFJlbEF0dHJpYnV0ZXMoanB0LCBqcHQxKTsKLQkJCWlmIChyZWxBdHMgIT0gbnVsbCkKLQkJCQlyZXMuYWRkQWxsKHJlbEF0cyk7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0aGUgYXR0cmlidXRlIChpZiB0aGVyZSBpcyBhbnkpIGJlbG9uZ2luZyB0byBqcHQxIGFuZAotCSAqIGludm9sdmVkIGluIGEgcmVsYXRpb24gd2l0aCBqcHQKLQkgKi8KLQkKLQlwcml2YXRlIFNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gZ2V0UmVsQXR0cmlidXRlcyhKYXZhUGVyc2lzdGVudFR5cGUganB0LAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJlbEpQVCkgewotCi0JCVNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gcmVzID0gbmV3IEhhc2hTZXQ8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCWZvciAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQgOiByZWxKUFQuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQlJUmVzb3VyY2UgciA9IGF0LmdldFBhcmVudCgpLmdldFJlc291cmNlKCk7Ci0JCQlpZiAoIXIuZXhpc3RzKCkpCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQkJCUFubm90YXRpb25bXSBhbnMgPSBnZXRBbm5vdGF0aW9ucyhhdCk7CQkJCi0JCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBudWxsOwotCQkJZm9yIChBbm5vdGF0aW9uIGFuIDogYW5zKSB7Ci0JCQkJYW5ub3RhdGlvbk5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoYW4uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7IAotCQkJCWlmIChKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fQU5OT1RBVElPTlMuY29udGFpbnMoYW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJCVN0cmluZyByZWxUeXBlTmFtZSA9IGdldFJlbFR5cGVOYW1lKChSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbilhbiwgYXQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKSk7Ci0JCQkJCWlmICghcmVsVHlwZU5hbWUuZXF1YWxzKGpwdC5nZXROYW1lKCkpKQotCQkJCQkJY29udGludWU7Ci0JCQkJCXJlcy5hZGQoYXQpOwotCQkJCX0KLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCByZW5hbWVFbnRpdHlDbGFzcyhKYXZhUGVyc2lzdGVudFR5cGUganB0LCBTdHJpbmcgbmV3RW50aXR5TmFtZSwgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQlyZW5hbWVFbnRpdHlDbGFzcyhmcC5nZXRDb21waWxhdGlvblVuaXQoanB0KSwgbmV3RW50aXR5TmFtZSk7Ci0JfQotCQkKLQlwcml2YXRlIHZvaWQgcmVuYW1lRW50aXR5Q2xhc3MoSUNvbXBpbGF0aW9uVW5pdCBjdSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJSVR5cGUgamF2YVR5cGUgPSBjdS5maW5kUHJpbWFyeVR5cGUoKTsKLQkJcmVuYW1lVHlwZShqYXZhVHlwZSwgbmV3TmFtZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW5hbWVUeXBlKElUeXBlIHR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmICghdHlwZS5leGlzdHMoKSkKLQkJCXJldHVybjsKLQkJU3RyaW5nIG9sZE5hbWUgPSB0eXBlLmdldEVsZW1lbnROYW1lKCk7Ci0JCXRyeSB7Ci0JCQlSZW5hbWVTdXBwb3J0IHMgPSBSZW5hbWVTdXBwb3J0LmNyZWF0ZSh0eXBlLCBuZXdOYW1lLCBSZW5hbWVTdXBwb3J0LlVQREFURV9SRUZFUkVOQ0VTKTsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd3cgPSBKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQlTaGVsbCBzaCA9IHd3LmdldFNoZWxsKCk7Ci0JCQlzLnBlcmZvcm0oc2gsIHd3KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3QgcmVuYW1lIHRoZSB0eXBlICIgKyBvbGROYW1lLCBlMSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHJlbmFtZUF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudFR5cGUganB0LAotCQkJU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBuZXdOYW1lLCBTdHJpbmcgaW52ZXJzZUVudGl0eU5hbWUsCi0JCQkJCQkJCQkgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJbmV3TmFtZSA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIobmV3TmFtZSk7Ci0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChqcHQpKSB7CQkKLQkJCW5ld05hbWUgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUobmV3TmFtZSk7Ci0JCX0gCi0JCW5ld05hbWUgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKGpwdCwgbmV3TmFtZSk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwdSA9IG51bGw7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG9sZEF0ID0ganB0LmdldEF0dHJpYnV0ZU5hbWVkKG9sZE5hbWUpOwotCQlmcC5hZGRBZGRJZ25vcmUoKEphdmFQZXJzaXN0ZW50VHlwZSlvbGRBdC5nZXRQYXJlbnQoKSwgbmV3TmFtZSk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSBqcmEgPSBvbGRBdAotCQkJCS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlmcC5hZGRSZW1vdmVJZ25vcmUoKEphdmFQZXJzaXN0ZW50VHlwZSlvbGRBdC5nZXRQYXJlbnQoKSwganJhLmdldE5hbWUoKSk7Ci0JCUlSZWxhdGlvbiByZWwgPSBmcC5nZXRSZWxhdGlvblJlbGF0ZWRUb0F0dHJpYnV0ZShvbGRBdCk7Ci0JCVN0cmluZyBpbnZlcnNlSlBBTmFtZSA9IG51bGw7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlSlBUID0gbnVsbDsKLQkJaWYgKElCaWRpcmVjdGlvbmFsUmVsYXRpb24uY2xhc3MuaXNJbnN0YW5jZShyZWwpKSB7Ci0JCQlpbnZlcnNlSlBUID0gcmVsLmdldEludmVyc2UoKTsKLQkJCWlmIChpbnZlcnNlSlBUICE9IG9sZEF0LmdldFBhcmVudCgpKSB7Ci0JCQkJcHUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VVbml0KGpwdCk7Ci0JCQkJaW52ZXJzZUpQQU5hbWUgPSByZWwuZ2V0SW52ZXJzZUF0dHJpYnV0ZU5hbWUoKTsKLQkJCX0KLQkJfQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZnAuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JCXJlbmFtZUF0dHJpYnV0ZShjdSwgb2xkTmFtZSwgbmV3TmFtZSwgZnAsIHRoaXMuaXNNZXRob2RBbm5vdGF0ZWQoanB0KSk7Ci0JCXJlZnJlc2hFbnRpdHlNb2RlbChmcCwganB0KTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmV3QXQgPSBqcHQuZ2V0QXR0cmlidXRlTmFtZWQobmV3TmFtZSk7Ci0JCWlmIChuZXdBdCA9PSBudWxsKQotCQkJbmV3QXQgPSBqcHQuZ2V0QXR0cmlidXRlTmFtZWQoSlBBRWRpdG9yVXRpbAotCQkJCQkucmV2ZXJ0Rmlyc3RMZXR0ZXJDYXNlKG5ld05hbWUpKTsKLQkJaW50IGMgPSAwOwotCQl3aGlsZSAoKG5ld0F0ID09IG51bGwpICYmIChjIDwgTUFYX05VTV9PRl9JVEVSQVRJT05TKSkgewotCQkJYysrOwotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoUEFVU0VfRFVSQVRJT04pOwotCQkJCW5ld0F0ID0ganB0LmdldEF0dHJpYnV0ZU5hbWVkKG5ld05hbWUpOwotCQkJCWlmIChuZXdBdCA9PSBudWxsKQotCQkJCQluZXdBdCA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkganB0Ci0JCQkJCQkJLnJlc29sdmVBdHRyaWJ1dGUoSlBBRWRpdG9yVXRpbAotCQkJCQkJCQkJLnJldmVydEZpcnN0TGV0dGVyQ2FzZShuZXdOYW1lKSk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiVGhyZWFkLnNsZWVwKCkgaW50ZXJydXB0ZWQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCWlmIChuZXdBdCA9PSBudWxsKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJUaGUgYXR0cmlidXRlICIgKyBuZXdOYW1lICsgIiBjb3VsZCBub3QgYmUgcmVzb2x2ZWQiLCBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlmcC5hZGRSZW1vdmVJZ25vcmUoanB0LCBvbGRBdC5nZXROYW1lKCkpOwotCQl0cnkgewotCQkJZnAucmVwbGFjZUF0dHJpYnV0ZShvbGRBdCwgbmV3QXQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG5ld0F0OwotCQl9Ci0JCWlmIChpbnZlcnNlSlBBTmFtZSAhPSBudWxsKSB7Ci0JCQlmcC5hZGRBdHRyaWJGb3JVcGRhdGUocHUsIGludmVyc2VFbnRpdHlOYW1lCi0JCQkJCSsgRW50aXR5Q2hhbmdlTGlzdGVuZXIuU0VQQVJBVE9SICsgaW52ZXJzZUpQQU5hbWUKLQkJCQkJKyBFbnRpdHlDaGFuZ2VMaXN0ZW5lci5TRVBBUkFUT1IgKyBuZXdBdC5nZXROYW1lKCkpOwotCQkJdGhpcy5yZWZyZXNoRW50aXR5TW9kZWwoZnAsIGludmVyc2VKUFQpOwotCQkJQW5ub3RhdGlvbiBhID0gcmVsLmdldEludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCkuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCWlmIChPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24uY2xhc3MuaXNJbnN0YW5jZShhKSkgewotCQkJCWJvb2xlYW4gZXhjZSA9IHRydWU7Ci0JCQkJaW50IGNudCA9IDA7Ci0JCQkJCXdoaWxlIChleGNlICYmIChjbnQgPCAyNSkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVRocmVhZC5zbGVlcCgyNTApOwotCQkJCQkJYSA9IHJlbC5nZXRJbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKCkuZ2V0TWFwcGluZygpLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQkJCQkoKE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbilhKS5zZXRNYXBwZWRCeShuZXdBdC5nZXROYW1lKCkpOwotCQkJCQkJZXhjZSA9IGZhbHNlOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJCQkJY250Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZWwgIT0gbnVsbCkKLQkJCXVwZGF0ZVJlbGF0aW9uKGpwdCwgZnAsIHJlbCk7Ci0JCQotCQlyZXR1cm4gbmV3QXQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVJlbGF0aW9uKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsCi0JCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBJUmVsYXRpb24gcmVsKSB7Ci0JCVVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUgdXBkYXRlRmVhdHVyZSA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlKGZwKTsKLQkJaWYgKGpwdC5lcXVhbHMocmVsLmdldEludmVyc2UoKSkpIHsKLQkJCXVwZGF0ZUZlYXR1cmUucmVjb25uZWN0KHJlbC5nZXRPd25lcigpKTsKLQkJfSBlbHNlIHsKLQkJCXVwZGF0ZUZlYXR1cmUucmVjb25uZWN0KHJlbC5nZXRJbnZlcnNlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHJlbmFtZUF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEsCi0JCQlTdHJpbmcgbmV3TmFtZSwgU3RyaW5nIG5ld0VudGl0eU5hbWUsIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiByZW5hbWVBdHRyaWJ1dGUoKEphdmFQZXJzaXN0ZW50VHlwZSlqcGEuZ2V0UGFyZW50KCksIGpwYS5nZXROYW1lKCksIG5ld05hbWUsCi0JCQkJbmV3RW50aXR5TmFtZSwgZnApOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW5hbWVBdHRyaWJ1dGUoSUNvbXBpbGF0aW9uVW5pdCBjdSwgU3RyaW5nIG9sZE5hbWUsCi0JCQlTdHJpbmcgbmV3TmFtZSwgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgYm9vbGVhbiBpc01ldGhvZEFubm90YXRlZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJSVR5cGUgamF2YVR5cGUgPSBjdS5maW5kUHJpbWFyeVR5cGUoKTsKLQkJaWYgKGphdmFUeXBlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlGaWVsZCBhdHRyaWJ1dGVGaWVsZCA9IG51bGw7Ci0JCVN0cmluZyB0eXBlU2lnbmF0dXJlID0gbnVsbDsKLQkJaWYgKGlzTWV0aG9kQW5ub3RhdGVkKSB7Ci0JCQlhdHRyaWJ1dGVGaWVsZCA9IGphdmFUeXBlLmdldEZpZWxkKG9sZE5hbWUpOwotCQkJaWYgKCFhdHRyaWJ1dGVGaWVsZC5leGlzdHMoKSkKLQkJCQlhdHRyaWJ1dGVGaWVsZCA9ICBqYXZhVHlwZS5nZXRGaWVsZChKUEFFZGl0b3JVdGlsLnJldmVydEZpcnN0TGV0dGVyQ2FzZShvbGROYW1lKSk7Ci0JCX0gZWxzZSB7Ci0JCQlhdHRyaWJ1dGVGaWVsZCA9IGphdmFUeXBlLmdldEZpZWxkKG9sZE5hbWUpOwotCQl9Ci0JCVN0cmluZyBnZXR0ZXJQcmVmaXggPSAiZ2V0IjsJLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbWV0aG9kTmFtZSA9IGdldHRlclByZWZpeCArIEpQQUVkaXRvclV0aWwuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKG9sZE5hbWUpOyAJLy8kTk9OLU5MUy0xJAotCQlJTWV0aG9kIGdldHRlciA9IGphdmFUeXBlLmdldE1ldGhvZChtZXRob2ROYW1lLCBuZXcgU3RyaW5nWzBdKTsKLQkJaWYgKCFnZXR0ZXIuZXhpc3RzKCkpIHsKLQkJCWdldHRlclByZWZpeCA9ICJpcyI7CS8vJE5PTi1OTFMtMSQKLQkJfQotCQltZXRob2ROYW1lID0gZ2V0dGVyUHJlZml4ICsgSlBBRWRpdG9yVXRpbC5jYXBpdGFsaXplRmlyc3RMZXR0ZXIob2xkTmFtZSk7IAkvLyROT04tTkxTLTEkCi0JCWdldHRlciA9IGphdmFUeXBlLmdldE1ldGhvZChtZXRob2ROYW1lLCBuZXcgU3RyaW5nWzBdKTsJCQotCQkKLQkJaWYgKGlzTWV0aG9kQW5ub3RhdGVkKSB7Ci0JCQl0cnkgewotCQkJCXR5cGVTaWduYXR1cmUgPSBnZXR0ZXIuZ2V0UmV0dXJuVHlwZSgpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUxKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IG9idGFpbiB0eXBlIHNpZ25hdHVyZSBvZiB0aGUgZ2V0dGVyIG9mIHRoZSBhdHRyaWJ1dGUgIiArIG9sZE5hbWUsIGUxKTsgLy8kTk9OLU5MUy0xJCAgCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKCh0eXBlU2lnbmF0dXJlID09IG51bGwpIHx8IAotCQkJCQkoISJaIi5lcXVhbHModHlwZVNpZ25hdHVyZSkgJiYgIWdldHRlclByZWZpeC5lcXVhbHMoImdldCIpKSkgewkJLy8kTk9OLU5MUy0xJCAJLy8kTk9OLU5MUy0yJCAKLQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3Qgb2J0YWluIHR5cGUgc2lnbmF0dXJlIG9mIHRoZSBnZXR0ZXIgb2YgdGhlIGF0dHJpYnV0ZSAiICsgb2xkTmFtZSwgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkICAKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCXR5cGVTaWduYXR1cmUgPSBhdHRyaWJ1dGVGaWVsZC5nZXRUeXBlU2lnbmF0dXJlKCk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCBvYnRhaW4gdHlwZSBzaWduYXR1cmUgb2YgdGhlIGZpZWxkIG9mIHRoZSBhdHRyaWJ1dGUgIiArIG9sZE5hbWUsIGUpOyAvLyROT04tTkxTLTEkICAKLQkJCQlyZXR1cm47Ci0JCQl9CQkJCi0JCX0KLQotCQltZXRob2ROYW1lID0gInNldCIgKyBKUEFFZGl0b3JVdGlsLmNhcGl0YWxpemVGaXJzdExldHRlcihvbGROYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlJTWV0aG9kIHNldHRlciA9IGphdmFUeXBlLmdldE1ldGhvZChtZXRob2ROYW1lLAotCQkJCW5ldyBTdHJpbmdbXSB7IHR5cGVTaWduYXR1cmUgfSk7Ci0KLQkJaWYgKHNldHRlci5leGlzdHMoKSkKLQkJCXJlbmFtZVNldHRlcihzZXR0ZXIsIG5ld05hbWUpOwotCQlpZiAoaXNNZXRob2RBbm5vdGF0ZWQpIHsKLQkJCWlmIChhdHRyaWJ1dGVGaWVsZC5leGlzdHMoKSkKLQkJCQlyZW5hbWVGaWVsZChhdHRyaWJ1dGVGaWVsZCwgbmV3TmFtZSwgaXNNZXRob2RBbm5vdGF0ZWQpOwkJCQotCQkJaWYgKGdldHRlci5leGlzdHMoKSkKLQkJCQlyZW5hbWVHZXR0ZXIoZ2V0dGVyLCBuZXdOYW1lKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXR0ZXIuZXhpc3RzKCkpCi0JCQkJcmVuYW1lR2V0dGVyKGdldHRlciwgbmV3TmFtZSk7Ci0JCQlpZiAoYXR0cmlidXRlRmllbGQuZXhpc3RzKCkpCi0JCQkJcmVuYW1lRmllbGQoYXR0cmlidXRlRmllbGQsIG5ld05hbWUsIGlzTWV0aG9kQW5ub3RhdGVkKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbmFtZUZpZWxkKElGaWVsZCBmaWVsZCwgU3RyaW5nIG5ld05hbWUsIGJvb2xlYW4gaXNNZXRob2RBbm5vdGF0ZWQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICghZmllbGQuZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBvbGROYW1lID0gZmllbGQuZ2V0RWxlbWVudE5hbWUoKTsKLQkJaWYgKG9sZE5hbWUuZXF1YWxzKG5ld05hbWUpKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJUmVuYW1lU3VwcG9ydCBzID0gUmVuYW1lU3VwcG9ydC5jcmVhdGUoZmllbGQsIAotCQkJCQkJCQkJCQkJICAgaXNNZXRob2RBbm5vdGF0ZWQgPyBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKG5ld05hbWUpIDogbmV3TmFtZSwKLQkJCQkJCQkJCQkJCSAgIFJlbmFtZVN1cHBvcnQuVVBEQVRFX1JFRkVSRU5DRVMpOwotCQkJdHJ5IHsKLQkJCQlJV29ya2JlbmNoV2luZG93IHd3ID0gSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQlTaGVsbCBzaCA9IHd3LmdldFNoZWxsKCk7Ci0JCQkJcy5wZXJmb3JtKHNoLCB3dyk7Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3QgcmVuYW1lIHRoZSBmaWVsZCBvZiB0aGUgYXR0cmlidXRlICIgKyBvbGROYW1lLCBlKTsgLy8kTk9OLU5MUy0xJCAgCi0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCByZW5hbWUgdGhlIGZpZWxkIG9mIHRoZSBhdHRyaWJ1dGUgIiArIG9sZE5hbWUsIGUxKTsgLy8kTk9OLU5MUy0xJCAgCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVuYW1lR2V0dGVyKElNZXRob2QgZ2V0dGVyLCBTdHJpbmcgbmV3TmFtZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKCFnZXR0ZXIuZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBvbGROYW1lID0gZ2V0dGVyLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN0cmluZyBnZXR0ZXJUeXBlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWdldHRlclR5cGUgPSBnZXR0ZXIuZ2V0UmV0dXJuVHlwZSgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZTIpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbid0IG9idGFpbiBnZXR0ZXIgdHlwZSIsIGUyKTsgLy8kTk9OLU5MUy0xJCAgCi0JCX0KLQkJU3RyaW5nIG5ld0dldHRlck5hbWUgPSAoIloiLmVxdWFscyhnZXR0ZXJUeXBlKSA/ICJpcyIgOiAiZ2V0IikgKwkJLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCS8vJE5PTi1OTFMtMyQKLQkJCUpQQUVkaXRvclV0aWwuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKG5ld05hbWUpOwotCQlpZiAob2xkTmFtZS5lcXVhbHMobmV3R2V0dGVyTmFtZSkpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlSZW5hbWVTdXBwb3J0IHMgPSBSZW5hbWVTdXBwb3J0LmNyZWF0ZShnZXR0ZXIsIG5ld0dldHRlck5hbWUsCi0JCQkJCVJlbmFtZVN1cHBvcnQuVVBEQVRFX1JFRkVSRU5DRVMpOwotCQkJdHJ5IHsKLQkJCQlJV29ya2JlbmNoV2luZG93IHd3ID0gSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQlTaGVsbCBzaCA9IHd3LmdldFNoZWxsKCk7Ci0JCQkJcy5wZXJmb3JtKHNoLCB3dyk7Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3QgcmVuYW1lIHRoZSBnZXR0ZXIgb2YgdGhlIGF0dHJpYnV0ZSAiICsgb2xkTmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IHJlbmFtZSB0aGUgZ2V0dGVyIG9mIHRoZSBhdHRyaWJ1dGUgIiArIG9sZE5hbWUsIGUxKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQkKLQlwcml2YXRlIHZvaWQgcmVuYW1lU2V0dGVyKElNZXRob2Qgc2V0dGVyLCBTdHJpbmcgbmV3TmFtZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKCFzZXR0ZXIuZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBvbGROYW1lID0gc2V0dGVyLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN0cmluZyBuZXdTZXR0ZXJOYW1lID0gInNldCIJCQkvLyROT04tTkxTLTEkCi0JCQkrIEpQQUVkaXRvclV0aWwuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKG5ld05hbWUpOwotCQlpZiAob2xkTmFtZS5lcXVhbHMobmV3U2V0dGVyTmFtZSkpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlSZW5hbWVTdXBwb3J0IHMgPSBSZW5hbWVTdXBwb3J0LmNyZWF0ZShzZXR0ZXIsIG5ld1NldHRlck5hbWUsCi0JCQkJCVJlbmFtZVN1cHBvcnQuVVBEQVRFX1JFRkVSRU5DRVMpOwotCQkJdHJ5IHsKLQkJCQlJV29ya2JlbmNoV2luZG93IHd3ID0gSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQlTaGVsbCBzaCA9IHd3LmdldFNoZWxsKCk7Ci0JCQkJcy5wZXJmb3JtKHNoLCB3dyk7Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3QgcmVuYW1lIHRoZSBzZXR0ZXIgb2YgdGhlIGF0dHJpYnV0ZSAiICsgb2xkTmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IHJlbmFtZSB0aGUgc2V0dGVyIG9mIHRoZSBhdHRyaWJ1dGUgIiArIG9sZE5hbWUsIGUxKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJUmVsYXRpb24gcHJvZHVjZVJlbGF0aW9uKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJpdGUsIEFubm90YXRpb24gYW4sCi0JCQlKYXZhUGVyc2lzdGVudFR5cGUgcmVsSlBULCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0KLQkJSGFzaHRhYmxlPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBBbm5vdGF0aW9uPiBodCA9IGdldFJlbEF0dHJpYnV0ZUFubm90YXRpb24oCi0JCQkJcGVyc2lzdGVudEF0dHJpYml0ZSwgcmVsSlBUKTsKLQkJaWYgKGh0ID09IG51bGwpIHsKLQkJCXJldHVybiBwcm9kdWNlVW5pRGlyUmVsYXRpb24oKEphdmFQZXJzaXN0ZW50VHlwZSlwZXJzaXN0ZW50QXR0cmliaXRlCi0JCQkJCS5nZXRQYXJlbnQoKSwgcGVyc2lzdGVudEF0dHJpYml0ZSwgYW4sIHJlbEpQVCwgZnApOwotCQl9IGVsc2UgewotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVsQXQgPSBodC5rZXlzKCkubmV4dEVsZW1lbnQoKTsKLQkJCUFubm90YXRpb24gcmVsQW4gPSBodC5nZXQocmVsQXQpOwotCQkJcmV0dXJuIHByb2R1Y2VCaURpclJlbGF0aW9uKChKYXZhUGVyc2lzdGVudFR5cGUpcGVyc2lzdGVudEF0dHJpYml0ZQotCQkJCQkuZ2V0UGFyZW50KCksIHBlcnNpc3RlbnRBdHRyaWJpdGUsIGFuLCByZWxKUFQsCi0JCQkJCXJlbEF0LCByZWxBbiwgZnApOwotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIEhhc2h0YWJsZTxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgQW5ub3RhdGlvbj4gZ2V0UmVsQXR0cmlidXRlQW5ub3RhdGlvbigKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSwgSmF2YVBlcnNpc3RlbnRUeXBlIHJlbEpQVCkgewotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpanBhLmdldFBhcmVudCgpOwotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwganB0KTsKLQkJZm9yIChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSByZWxFbnRBdCA6IHJlbEpQVC5nZXRBdHRyaWJ1dGVzKCkpCXsKLQkJCUlSZXNvdXJjZSByID0gcmVsRW50QXQuZ2V0UGFyZW50KCkuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmICghci5leGlzdHMoKSkKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlbEpSQSA9IHJlbEVudEF0LmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQlBbm5vdGF0aW9uW10gYW5zID0gdGhpcy5nZXRBbm5vdGF0aW9ucyhyZWxFbnRBdCk7Ci0JCQlmb3IgKEFubm90YXRpb24gYW4gOiBhbnMpIHsKLQkJCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoYW4uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JCQkJaWYgKEpQQUVkaXRvckNvbnN0YW50cy5SRUxBVElPTl9BTk5PVEFUSU9OUy5jb250YWlucyhhbm5vdGF0aW9uTmFtZSkpIHsKLQkJCQkJU3RyaW5nIHJlbFR5cGVOYW1lID0gZ2V0UmVsVHlwZU5hbWUoKFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uKWFuLCByZWxKUkEpOwkJCQkJCi0JCQkJCWlmICghcmVsVHlwZU5hbWUuZXF1YWxzKGpwdC5nZXROYW1lKCkpKSAKLQkJCQkJCWNvbnRpbnVlOwkJCQkJCQkJCQkJCQkJCi0JCQkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIG1wID0gcmVsRW50QXQuZ2V0TWFwcGluZygpOwotCQkJCQlpZihtcC5nZXRNYXBwaW5nQW5ub3RhdGlvbigpID09IG51bGwpIHsKLQkJCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXJlbEVudEF0LmdldFBhcmVudCgpKTsKLQkJCQkJCW1wID0gcmVsRW50QXQuZ2V0TWFwcGluZygpOwotCQkJCQl9Ci0JCQkJCWlmICghT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmNsYXNzLmlzSW5zdGFuY2UobXAuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJU3RyaW5nIG1hcHBlZEJ5ID0gKChPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24pbXAuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSkuZ2V0TWFwcGVkQnkoKTsKLQkJCQkJaWYgKCFqcGEuZ2V0TmFtZSgpLmVxdWFscyhtYXBwZWRCeSkpIAotCQkJCQkJY29udGludWU7Ci0JCQkJCUhhc2h0YWJsZTxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgQW5ub3RhdGlvbj4gaHQgPSBuZXcgSGFzaHRhYmxlPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBBbm5vdGF0aW9uPigpOwotCQkJCQlodC5wdXQocmVsRW50QXQsIGFuKTsKLQkJCQkJcmV0dXJuIGh0OwkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkJCQotCQkJCi0JCQkvKgotCQkJQVNUTm9kZSBuZCA9IGpycGEuZ2V0TWVtYmVyKCkuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbigpCi0JCQkJCS5nZXREZWNsYXJhdGlvbigpOwotCQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gbnVsbDsKLQkJCWlmICgobmQgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikKLQkJCQkJfHwgKG5kIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikpIHsKLQkJCQlMaXN0SXRlcmF0b3I8Pz4gbW9kZnMgPSAoKEJvZHlEZWNsYXJhdGlvbikgbmQpLm1vZGlmaWVycygpCi0JCQkJCQkubGlzdEl0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKG1vZGZzLmhhc05leHQoKSkgewotCQkJCQlPYmplY3QgbW9kZiA9IG1vZGZzLm5leHQoKTsKLQkJCQkJaWYgKG1vZGYgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKSB7Ci0JCQkJCQlBbm5vdGF0aW9uIGFuID0gKEFubm90YXRpb24pbW9kZjsKLQkJCQkJCWFubm90YXRpb25OYW1lID0gYW4uZ2V0VHlwZU5hbWUoKQotCQkJCQkJCQkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQkJCQlhbm5vdGF0aW9uTmFtZSA9IGFubm90YXRpb25OYW1lCi0JCQkJCQkJCS5zdWJzdHJpbmcoYW5ub3RhdGlvbk5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCQkJCQkJaWYgKEpQQUVkaXRvckNvbnN0YW50cy5SRUxBVElPTl9BTk5PVEFUSU9OUwotCQkJCQkJCQkuY29udGFpbnMoYW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJCQkJU3RyaW5nIHJlbFR5cGVOYW1lID0gZ2V0UmVsVHlwZU5hbWUoYW4sIGpycGEpOwkJCQkJCi0JCQkJCQkJaWYgKCFyZWxUeXBlTmFtZS5lcXVhbHMoanB0LmdldE5hbWUoKSkpIAotCQkJCQkJCQljb250aW51ZTsJCQkJCQkJCQkJCQkJCQotCQkJCQkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIG1wID0gYXQuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQkJCQkJCWlmICghT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmNsYXNzLmlzSW5zdGFuY2UobXAuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSkpCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCVN0cmluZyBtYXBwZWRCeSA9ICgoT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uKW1wLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkpLmdldE1hcHBlZEJ5KCk7Ci0JCQkJCQkJaWYgKCFqcGEuZ2V0TmFtZSgpLmVxdWFscyhtYXBwZWRCeSkpIAotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQlIYXNodGFibGU8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEFubm90YXRpb24+IGh0ID0gbmV3IEhhc2h0YWJsZTxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgQW5ub3RhdGlvbj4oKTsKLQkJCQkJCQlodC5wdXQoYXQsIGFuKTsKLQkJCQkJCQlyZXR1cm4gaHQ7Ci0JCQkJCQl9Ci0JCQkJCX0gCQkJCi0JCQkJfQotCQkJfQotCQkJKi8JCQkKLQkKLQlwcml2YXRlIFVuaWRpcmVjdGlvbmFsUmVsYXRpb24gcHJvZHVjZVVuaURpclJlbGF0aW9uKAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQsIEFubm90YXRpb24gYW4sCi0JCQlKYXZhUGVyc2lzdGVudFR5cGUgcmVsSlBULCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCQotCQlpZiAoaXNOb25Pd25lcihhdCkgfHwgIUpQQUVkaXRvclV0aWwuZ2V0Q29tcGlsYXRpb25Vbml0KChKYXZhUGVyc2lzdGVudFR5cGUpIGF0LmdldFBhcmVudCgpKS5leGlzdHMoKSkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoYW4uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JCVVuaWRpcmVjdGlvbmFsUmVsYXRpb24gcmVzID0gbnVsbDsKLQkJU3RyaW5nIGF0dHJOYW1lID0gYXQuZ2V0TmFtZSgpOwotCQlpZiAoYW5ub3RhdGlvbk5hbWUuZXF1YWxzKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX09ORV9UT19PTkUpKSB7Ci0JCQlpZiAoIWZwLmRvZXNSZWxhdGlvbkV4aXN0KGpwdCwgcmVsSlBULCBhdHRyTmFtZSwgUmVsVHlwZS5PTkVfVE9fT05FLAotCQkJCQlSZWxEaXIuVU5JKSkKLQkJCQlyZXMgPSBuZXcgT25lVG9PbmVVbmlEaXJSZWxhdGlvbihmcCwganB0LCByZWxKUFQsIGF0dHJOYW1lLCBmYWxzZSwKLQkJCQkJCWZwLmdldENvbXBpbGF0aW9uVW5pdChqcHQpLCBmcAotCQkJCQkJCQkuZ2V0Q29tcGlsYXRpb25Vbml0KHJlbEpQVCkpOwotCQl9IGVsc2UgaWYgKGFubm90YXRpb25OYW1lCi0JCQkJLmVxdWFscyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fTUFOWSkpIHsKLQkJCWlmICghZnAuZG9lc1JlbGF0aW9uRXhpc3QoanB0LCByZWxKUFQsIGF0dHJOYW1lLCBSZWxUeXBlLk9ORV9UT19NQU5ZLAotCQkJCQlSZWxEaXIuVU5JKSkKLQkJCQlyZXMgPSBuZXcgT25lVG9NYW55VW5pRGlyUmVsYXRpb24oZnAsIGpwdCwgcmVsSlBULCBhdHRyTmFtZSwgZmFsc2UsCi0JCQkJCQlmcC5nZXRDb21waWxhdGlvblVuaXQoanB0KSwgZnAKLQkJCQkJCQkJLmdldENvbXBpbGF0aW9uVW5pdChyZWxKUFQpKTsKLQkJfSBlbHNlIGlmIChhbm5vdGF0aW9uTmFtZQotCQkJCS5lcXVhbHMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fTUFOWV9UT19PTkUpKSB7Ci0JCQlpZiAoIWZwLmRvZXNSZWxhdGlvbkV4aXN0KGpwdCwgcmVsSlBULCBhdHRyTmFtZSwgUmVsVHlwZS5NQU5ZX1RPX09ORSwKLQkJCQkJUmVsRGlyLlVOSSkpCi0JCQkJcmVzID0gbmV3IE1hbnlUb09uZVVuaURpclJlbGF0aW9uKGZwLCBqcHQsIHJlbEpQVCwgYXR0ck5hbWUsIGZhbHNlLAotCQkJCQkJZnAuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCksIGZwCi0JCQkJCQkJCS5nZXRDb21waWxhdGlvblVuaXQocmVsSlBUKSk7Ci0JCX0gZWxzZSBpZiAoYW5ub3RhdGlvbk5hbWUKLQkJCQkuZXF1YWxzKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX01BTllfVE9fTUFOWSkpIHsKLQkJCWlmICghZnAuZG9lc1JlbGF0aW9uRXhpc3QoanB0LCByZWxKUFQsIGF0dHJOYW1lLCBSZWxUeXBlLk1BTllfVE9fTUFOWSwKLQkJCQkJUmVsRGlyLlVOSSkpCi0JCQkJcmVzID0gbmV3IE1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbihmcCwganB0LCByZWxKUFQsIGF0dHJOYW1lLAotCQkJCQkJZmFsc2UsIGZwLmdldENvbXBpbGF0aW9uVW5pdChqcHQpLCBmcAotCQkJCQkJCQkuZ2V0Q29tcGlsYXRpb25Vbml0KHJlbEpQVCkpOwotCQl9Ci0JCWlmIChyZXMgIT0gbnVsbCkKLQkJCXJlcy5zZXRBbm5vdGF0ZWRBdHRyaWJ1dGUoYXQpOwotCQlyZXR1cm4gcmVzOwotCX0KLQkKLQlwcml2YXRlIElCaWRpcmVjdGlvbmFsUmVsYXRpb24gcHJvZHVjZUJpRGlyUmVsYXRpb24oSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0LCBBbm5vdGF0aW9uIGFuLAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJlbEpQVCwgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVsQXQsCi0JCQlBbm5vdGF0aW9uIHJlbEFuLCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXJlbEF0LmdldFBhcmVudCgpKTsKLQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGFuLmdldEFubm90YXRpb25OYW1lKCkpOwotCQlTdHJpbmcgcmVsQW5ub3RhdGlvbk5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUocmVsQW4uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JCWlmICghYW5ub3RhdGlvbk5hbWVzTWF0Y2goYW5ub3RhdGlvbk5hbWUsIHJlbEFubm90YXRpb25OYW1lKSkgCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGFubm90YXRpb25OYW1lLmVxdWFscyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fTUFOWSkpIAotCQkJcmV0dXJuIHByb2R1Y2VCaURpclJlbGF0aW9uKHJlbEpQVCwgcmVsQXQsIHJlbEFuLCBqcHQsIGF0LCBhbiwgZnApOwotCQlpZiAoaXNOb25Pd25lcihhdCkgJiYgaXNOb25Pd25lcihyZWxBdCkpIAotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChhbm5vdGF0aW9uTmFtZS5lcXVhbHMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fTUFOWV9UT19PTkUpKSB7Ci0JCQlpZiAoaXNOb25Pd25lcihhdCkgfHwgIWlzTm9uT3duZXIocmVsQXQpKSAKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoYW5ub3RhdGlvbk5hbWUuZXF1YWxzKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX01BTllfVE9fTUFOWSkpIHsKLQkJCWlmICghaXNOb25Pd25lcihhdCkgJiYgIWlzTm9uT3duZXIocmVsQXQpKSAKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChpc05vbk93bmVyKGF0KSkgCi0JCQkJcmV0dXJuIHByb2R1Y2VCaURpclJlbGF0aW9uKHJlbEpQVCwgcmVsQXQsIHJlbEFuLCBqcHQsIGF0LCBhbiwKLQkJCQkJCWZwKTsKLQkJfQkJCi0JCVN0cmluZyBvd25lckF0dHJOYW1lID0gYXQuZ2V0TmFtZSgpOwotCQlTdHJpbmcgaW52ZXJzZUF0dHJOYW1lID0gcmVsQXQuZ2V0TmFtZSgpOwotCQkKLQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgbSA9IHJlbEF0LmdldE1hcHBpbmcoKTsKLQkJCi0JCWlmICgobSAhPSBudWxsKSl7Ci0JCQlpZiAobS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpPT1udWxsKSB7Ci0JCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIChKYXZhUGVyc2lzdGVudFR5cGUpcmVsQXQuZ2V0UGFyZW50KCkpOwotCQkJCW0gPSByZWxBdC5nZXRNYXBwaW5nKCk7Ci0JCQl9Ci0JCQlpZihtLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkgaW5zdGFuY2VvZiBPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24pIHsKLQkJCi0JCQlTdHJpbmcgbWFwcGVkQnkgPSAoKE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiltLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkpLmdldE1hcHBlZEJ5KCk7Ci0JCQlpZiAobWFwcGVkQnkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmICghbWFwcGVkQnkuZXF1YWxzKG93bmVyQXR0ck5hbWUpKQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlJQmlkaXJlY3Rpb25hbFJlbGF0aW9uIHJlcyA9IG51bGw7Ci0JCWlmIChhbm5vdGF0aW9uTmFtZS5lcXVhbHMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fT05FX1RPX09ORSkpIHsKLQkJCWlmICghZnAuZG9lc1JlbGF0aW9uRXhpc3QoanB0LCByZWxKUFQsIG93bmVyQXR0ck5hbWUsIFJlbFR5cGUuT05FX1RPX09ORSwKLQkJCQkJUmVsRGlyLkJJKSkKLQkJCQlyZXMgPSBuZXcgT25lVG9PbmVCaURpclJlbGF0aW9uKGZwLCBqcHQsIHJlbEpQVCwgb3duZXJBdHRyTmFtZSwKLQkJCQkJCWludmVyc2VBdHRyTmFtZSwgZmFsc2UsIGZwLmdldENvbXBpbGF0aW9uVW5pdChqcHQpLCBmcAotCQkJCQkJCQkuZ2V0Q29tcGlsYXRpb25Vbml0KHJlbEpQVCkpOwotCQl9IGVsc2UgaWYgKGFubm90YXRpb25OYW1lCi0JCQkJLmVxdWFscyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX09ORSkpIHsKLQkJCWlmICghZnAuZG9lc1JlbGF0aW9uRXhpc3QoanB0LCByZWxKUFQsIG93bmVyQXR0ck5hbWUsIFJlbFR5cGUuTUFOWV9UT19PTkUsCi0JCQkJCVJlbERpci5CSSkpCi0JCQkJcmVzID0gbmV3IE1hbnlUb09uZUJpRGlyUmVsYXRpb24oZnAsIGpwdCwgcmVsSlBULCBvd25lckF0dHJOYW1lLAotCQkJCQkJaW52ZXJzZUF0dHJOYW1lLCBmYWxzZSwgZnAuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCksIGZwCi0JCQkJCQkJCS5nZXRDb21waWxhdGlvblVuaXQocmVsSlBUKSk7Ci0JCX0gZWxzZSBpZiAoYW5ub3RhdGlvbk5hbWUKLQkJCQkuZXF1YWxzKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX01BTllfVE9fTUFOWSkpIHsKLQkJCWlmICghZnAuZG9lc1JlbGF0aW9uRXhpc3QoanB0LCByZWxKUFQsIG93bmVyQXR0ck5hbWUsIFJlbFR5cGUuTUFOWV9UT19NQU5ZLAotCQkJCQlSZWxEaXIuQkkpKQotCQkJCXJlcyA9IG5ldyBNYW55VG9NYW55QmlEaXJSZWxhdGlvbihmcCwganB0LCByZWxKUFQsIG93bmVyQXR0ck5hbWUsCi0JCQkJCQlpbnZlcnNlQXR0ck5hbWUsIGZhbHNlLCBmcC5nZXRDb21waWxhdGlvblVuaXQoanB0KSwgZnAKLQkJCQkJCQkJLmdldENvbXBpbGF0aW9uVW5pdChyZWxKUFQpKTsKLQkJfQotCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCXJlcy5zZXRPd25lckFubm90YXRlZEF0dHJpYnV0ZShhdCk7Ci0JCQlyZXMuc2V0SW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZShyZWxBdCk7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFubm90YXRpb25OYW1lc01hdGNoKFN0cmluZyBhbjFOYW1lLCBTdHJpbmcgYW4yTmFtZSkgewotCQlpZiAoYW4xTmFtZS5lcXVhbHMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fT05FX1RPX09ORSkKLQkJCQkmJiBhbjJOYW1lLmVxdWFscyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fT05FKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoYW4xTmFtZS5lcXVhbHMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fT05FX1RPX01BTlkpCi0JCQkJJiYgYW4yTmFtZS5lcXVhbHMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fTUFOWV9UT19PTkUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChhbjFOYW1lLmVxdWFscyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX09ORSkKLQkJCQkmJiBhbjJOYW1lLmVxdWFscyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fTUFOWSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGFuMU5hbWUuZXF1YWxzKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX01BTllfVE9fTUFOWSkKLQkJCQkmJiBhbjJOYW1lLmVxdWFscyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX01BTlkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdlbkdldHRlckNvbnRlbnRzKFN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIGF0dHJUeXBlLAotCQkJU3RyaW5nW10gYXR0clR5cGVFbGVtZW50TmFtZXMsIFN0cmluZyBhY3ROYW1lLAotCQkJTGlzdDxTdHJpbmc+IGFubm90YXRpb25zLCBib29sZWFuIGlzQ29sbGVjdGlvbikgewotCQkKLQkJU3RyaW5nIGF0dHJOYW1lV2l0aENhcGl0YWxBID0gYWN0TmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpCi0JCQkJKyBhY3ROYW1lLnN1YnN0cmluZygxKTsKLQkJU3RyaW5nIGNvbnRlbnRzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yPFN0cmluZz4gaXQgPSBhbm5vdGF0aW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCVN0cmluZyBhbiA9IGl0Lm5leHQoKTsKLQkJCQljb250ZW50cyArPSAiICAgIiArIGFuICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJaWYgKGlzQ29sbGVjdGlvbikgewotCQkJY29udGVudHMgKz0gIiAgICBwdWJsaWMgQ29sbGVjdGlvbjwiKyBhdHRyVHlwZSArICI+IGdldCIgKyBhdHRyTmFtZVdpdGhDYXBpdGFsQSArICIoKSB7XG4iICsgIAkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCQkJIiAgICAgICAgcmV0dXJuICIJLy8kTk9OLU5MUy0xJAotCQkJCQkrIEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIoYWN0TmFtZSkgKyAiO1xuIiArIC8vJE5PTi1OTFMtMSQgCi0JCQkgICIgICAgfVxuIjsgIC8vJE5PTi1OTFMtMSQJCQkKLQkJfSBlbHNlIHsKLQkJCWNvbnRlbnRzICs9ICIgICAgcHVibGljICIrIGF0dHJUeXBlICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSgoYXR0clR5cGVFbGVtZW50TmFtZXMgPT0gbnVsbCk/IiI6KCI8IiArIEpQQUVkaXRvclV0aWwuY3JlYXRlQ29tbWFTZXBhcmF0ZWRMaXN0T2ZTaW1wbGVUeXBlTmFtZXMoYXR0clR5cGVFbGVtZW50TmFtZXMpICsgIj4iKSkgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJCShhdHRyVHlwZS5lcXVhbHMoImJvb2xlYW4iKSA/ICIgaXMiIDogIiBnZXQiKSArIGF0dHJOYW1lV2l0aENhcGl0YWxBICsgIigpIHtcbiIgKyAgCS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgCi0JCQkJCSIgICAgICAgIHJldHVybiAiCS8vJE5PTi1OTFMtMSQKLQkJCQkJKyBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdE5hbWUpICsgIjtcbiIgKyAvLyROT04tTkxTLTEkIAotCQkJICAiICAgIH1cbiI7ICAJCQkJCQkJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAkJCQotCQl9Ci0JCXJldHVybiBjb250ZW50czsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2VuU2V0dGVyQ29udGVudHMoU3RyaW5nIGF0dHJOYW1lLCBTdHJpbmcgYXR0clR5cGUsCi0JCQlTdHJpbmdbXSBhdHRyVHlwZUVsZW1lbnROYW1lcywgU3RyaW5nIGFjdE5hbWUsIGJvb2xlYW4gaXNDb2xsZWN0aW9uKSB7Ci0JCQotCQlTdHJpbmcgYXR0ck5hbWVXaXRoQ2FwaXRhbEEgPSBhY3ROYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCkKLQkJCQkrIGFjdE5hbWUuc3Vic3RyaW5nKDEpOwotCQlTdHJpbmcgY29udGVudHMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaXNDb2xsZWN0aW9uKSB7Ci0JCQljb250ZW50cyA9ICIgICAgcHVibGljIHZvaWQgc2V0IiArIGF0dHJOYW1lV2l0aENhcGl0YWxBICsgIihDb2xsZWN0aW9uPCIgKyBhdHRyVHlwZSArICI+IHBhcmFtKSAiICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJIntcbiIgKyAvLyROT04tTkxTLTEkIAotCQkJCQkiICAgICAgICB0aGlzLiIJLy8kTk9OLU5MUy0xJAotCQkJCQkrIEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIoYWN0TmFtZSkKLQkJCQkJKyAiID0gcGFyYW07XG4iICsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCSAgIiAgICB9XG4iOyAgCS8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCWNvbnRlbnRzID0gIiAgICBwdWJsaWMgdm9pZCBzZXQiICsgYXR0ck5hbWVXaXRoQ2FwaXRhbEEgKyAiKCIgKyBhdHRyVHlwZSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkoKGF0dHJUeXBlRWxlbWVudE5hbWVzID09IG51bGwpPyIiOigiPCIgKyBKUEFFZGl0b3JVdGlsLmNyZWF0ZUNvbW1hU2VwYXJhdGVkTGlzdE9mU2ltcGxlVHlwZU5hbWVzKGF0dHJUeXBlRWxlbWVudE5hbWVzKSArICI+IikpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJIiBwYXJhbSkge1xuIgkvLyROT04tTkxTLTEkCi0JCQkJCSsgCi0JCQkJCSIgICAgICAgIHRoaXMuIgkvLyROT04tTkxTLTEkCi0JCQkJCSsgSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihhY3ROYW1lKQotCQkJCQkrICIgPSBwYXJhbTtcbiIgKyAvLyROT04tTkxTLTEkIAotCQkJICAiICAgIH1cbiI7ICAJCQkvLyROT04tTkxTLTEkCQkJCi0JCX0KLQkJcmV0dXJuIGNvbnRlbnRzOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZW5HZXR0ZXJXaXRoQXBwcm9wcmlhdGVUeXBlKFN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIGF0dHJUeXBlLAotCQkJU3RyaW5nIGFjdE5hbWUsIFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiBnZW5HZXR0ZXJXaXRoQXBwcm9wcmlhdGVUeXBlKGF0dHJOYW1lLCBudWxsLCBhdHRyVHlwZSwKLQkJCQlhY3ROYW1lLCB0eXBlKTsKLQl9Ci0KLQkKLQlwcml2YXRlIFN0cmluZyBnZW5HZXR0ZXJXaXRoQXBwcm9wcmlhdGVUeXBlKFN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIG1hcEtleVR5cGUsIFN0cmluZyBhdHRyVHlwZSwKLQkJCVN0cmluZyBhY3ROYW1lLCBTdHJpbmcgdHlwZSkgewotCi0JCVN0cmluZyBhdHRyTmFtZVdpdGhDYXBpdGFsQSA9IGFjdE5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKAotCQkJCUxvY2FsZS5FTkdMSVNIKQotCQkJCSsgYWN0TmFtZS5zdWJzdHJpbmcoMSk7Ci0JCVN0cmluZyBjb250ZW50cyA9ICIgICAgcHVibGljICIgKyBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUodHlwZSkgKyAJCS8vJE5PTi1OTFMtMSQKLQkJCQkiPCIgKyAoKG1hcEtleVR5cGUgIT0gbnVsbCkgPyAobWFwS2V5VHlwZSArICIsICIpIDogIiIpICArICBhdHRyVHlwZSArICI+ICIgKwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJImdldCIgKyBhdHRyTmFtZVdpdGhDYXBpdGFsQSArICIoKSB7XG4iICsgCS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCSIgICAgICAgIHJldHVybiAiIAkvLyROT04tTkxTLTEkCi0JCQkJKyBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdE5hbWUpICsgIjtcbiIgKyAJCS8vJE5PTi1OTFMtMSQKLQkJCQkiICAgIH1cbiI7IAkvLyROT04tTkxTLTEkCi0JCXJldHVybiBjb250ZW50czsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZW5TZXR0ZXJXaXRoQXBwcm9wcmlhdGVUeXBlKFN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIGF0dHJUeXBlLAotCQkJU3RyaW5nIGFjdE5hbWUsIFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiBnZW5TZXR0ZXJXaXRoQXBwcm9wcmlhdGVUeXBlKGF0dHJOYW1lLCBudWxsLCBhdHRyVHlwZSwKLQkJCQlhY3ROYW1lLCB0eXBlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2VuU2V0dGVyV2l0aEFwcHJvcHJpYXRlVHlwZShTdHJpbmcgYXR0ck5hbWUsIFN0cmluZyBtYXBLZXlUeXBlLCBTdHJpbmcgYXR0clR5cGUsCi0JCQlTdHJpbmcgYWN0TmFtZSwgU3RyaW5nIHR5cGUpIHsKLQotCQlTdHJpbmcgYXR0ck5hbWVXaXRoQ2FwaXRhbEEgPSBhY3ROYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgKLQkJCQlMb2NhbGUuRU5HTElTSCkKLQkJCQkrIGFjdE5hbWUuc3Vic3RyaW5nKDEpOwotCQlTdHJpbmcgY29udGVudHMgPSAiICAgIHB1YmxpYyB2b2lkIHNldCIgKyBhdHRyTmFtZVdpdGhDYXBpdGFsQSArIAkJCS8vJE5PTi1OTFMtMSQKLQkJCQkiKCIgKyBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUodHlwZSkgKyAJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJIjwiICsgKChtYXBLZXlUeXBlICE9IG51bGwpID8gKG1hcEtleVR5cGUgKyAiLCAiKSA6ICIiKSArIGF0dHJUeXBlICsgIj4gcGFyYW0pICIgKwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJIntcbiIgKyAgIAkvLyROT04tTkxTLTEkCi0JCQkJIiAgICAgICAgdGhpcy4iIAkvLyROT04tTkxTLTEkCi0JCQkJKyBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdE5hbWUpCi0JCQkJKyAiID0gcGFyYW07XG4iICsgCS8vJE5PTi1OTFMtMSQKLQkJCQkiICAgIH1cbiI7IAkJCS8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNvbnRlbnRzOwotCX0KLQkKLQkvKgotCXByaXZhdGUgU3RyaW5nIHJldHVyblNpbXBsZU5hbWUoU3RyaW5nIGlucHV0KSB7Ci0JCVN0cmluZyBuYW1lID0gaW5wdXQ7Ci0JCWlmIChuYW1lLmxhc3RJbmRleE9mKCcuJykgIT0gLTEpIHsKLQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JKi8KLQkKLQlwcml2YXRlIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZyb21FbnRpdHkoCi0JCQlKYXZhUGVyc2lzdGVudFR5cGUganB0LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQl0aGlzLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCBqcHQpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGF0ID0ganB0LmdldEF0dHJpYnV0ZU5hbWVkKGF0dHJpYnV0ZU5hbWUpOwotCQlpZiAoYXQgPT0gbnVsbCkgewotCQkJanB0LmdldEphdmFSZXNvdXJjZVR5cGUoKS5zeW5jaHJvbml6ZVdpdGgoanB0LmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoKS5idWlsZEFTVFJvb3QoKSk7Ci0JCQlqcHQudXBkYXRlKCk7Ci0JCX0KLQkJaW50IGMgPSAwOwotCQl3aGlsZSAoKGF0ID09IG51bGwpICYmIChjIDwgTUFYX05VTV9PRl9JVEVSQVRJT05TKSkgewkJCi0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcChQQVVTRV9EVVJBVElPTik7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IGdldCB0aGUgYXR0cmlidXRlICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlhdHRyaWJ1dGVOYW1lICsgIiBmcm9tICIgKyBqcHQuZ2V0TmFtZSgpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYXQgPSBqcHQuZ2V0QXR0cmlidXRlTmFtZWQoYXR0cmlidXRlTmFtZSk7Ci0JCQljKys7Ci0JCX0KLQkJcmV0dXJuIChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSlhdDsJCQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZG9lc0F0dHJpYnV0ZUV4aXN0KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIFN0cmluZyBuYW1lKQotCQkJCQkJCQkJCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleGlzdHMgPSBmYWxzZTsKLQkJaWYgKGpwdC5yZXNvbHZlQXR0cmlidXRlKG5hbWUpICE9IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBleGlzdHM7Ci0JfQotCQkKLQlwdWJsaWMgSmF2YVJlc291cmNlVHlwZSBjb252ZXJ0SlBUVG9KUlQoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlpZiAoanB0ID09IG51bGwpIAotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSmF2YVJlc291cmNlVHlwZSkganB0LmdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKGpwdC5nZXROYW1lKCksIEtpbmQuVFlQRSk7Ci0JfQotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KEpwYUZpbGUganBhRmlsZSkgewotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgID0ganBhRmlsZS5nZXRKcGFQcm9qZWN0KCk7Ci0JCWlmIChqcGFQcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdChqcGFQcm9qZWN0KTsgCi0JfQotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KEpwYVByb2plY3QgcHJvamVjdCkgewotCQlpZihwcm9qZWN0LmdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCkKLQkJCQkuZ2V0UGVyc2lzdGVuY2VVbml0cygpLml0ZXJhdG9yKCkubmV4dCgpOwotCX0KLQkKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdChKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCXJldHVybiBqcHQuZ2V0UGVyc2lzdGVuY2VVbml0KCk7IAotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZEFubm90YXRlZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyKSB7Ci0JCXJldHVybiBhdHRyLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuTUVUSE9EOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZEFubm90YXRlZChKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gbGkgPSBqcHQuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWlmICghbGkuaGFzTmV4dCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKGlzTWV0aG9kQW5ub3RhdGVkKGxpLm5leHQoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1ha2VSZWxhdGlvbnMoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwKLQkJCUNvbnRhaW5lclNoYXBlIGNzLCBKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCWlmIChjcyA9PSBudWxsKSAKLQkJCWNzID0gKENvbnRhaW5lclNoYXBlKWZwLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChqcHQpOwotCQlpZiAoY3MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJcmVtb3ZlT2xkUmVsYXRpb25zKGZwLCBjcyk7Ci0JCWFkZE5ld1JlbGF0aW9ucyhmcCwganB0KTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlpZiAoanB0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgCi0JCUphdmFSZXNvdXJjZVR5cGUganJ0ID0gY29udmVydEpQVFRvSlJUKGpwdCk7Ci0JCWlmIChqcnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAKLQkJVGFibGVBbm5vdGF0aW9uIHRhbiA9IChUYWJsZUFubm90YXRpb24panJ0LmdldEFubm90YXRpb24oImphdmF4LnBlcnNpc3RlbmNlLlRhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHRhYmxlTmFtZSA9IG51bGw7Ci0JCWlmICh0YW4gPT0gbnVsbCl7Ci0JCQl0YWJsZU5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoanB0LmdldE5hbWUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQl0YWJsZU5hbWUgPSB0YW4uZ2V0TmFtZSgpOwkJCi0JCX0JCQotCQlpZiAodGFibGVOYW1lID09IG51bGwpCi0JCQl0YWJsZU5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoanB0LmdldE5hbWUoKSk7Ci0JCXJldHVybiB0YWJsZU5hbWU7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHNldFRhYmxlTmFtZShKYXZhUGVyc2lzdGVudFR5cGUganB0LCBTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCWlmIChqcHQgPT0gbnVsbCkKLQkJCXJldHVybjsgCi0JCUphdmFSZXNvdXJjZVR5cGUganJ0ID0gY29udmVydEpQVFRvSlJUKGpwdCk7Ci0JCWlmIChqcnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOyAKLQkJfQotCQlUYWJsZUFubm90YXRpb24gdGEgPSAoVGFibGVBbm5vdGF0aW9uKWpydC5nZXRBbm5vdGF0aW9uKCJqYXZheC5wZXJzaXN0ZW5jZS5UYWJsZSIpOwkvLyROT04tTkxTLTEkCi0JCWlmICh0YSAhPSBudWxsKSAKLQkJCXRhLnNldE5hbWUodGFibGVOYW1lKTsJCQotCX0KLQkKLQkvKgotCXByaXZhdGUgT2JqZWN0IGV4dHJhY3RBbm5vdGF0aW9uTWVtYmVyVmFsdWUoQW5ub3RhdGlvbiBhbiwgU3RyaW5nIG1lbWJlck5hbWUpIHsKLQkJCi0JCWFuLgotCQkKLQkJSU1lbWJlclZhbHVlUGFpcltdIG12cHM7Ci0JCXRyeSB7Ci0JCQltdnBzID0gYW4uZ2V0TWVtYmVyVmFsdWVQYWlycygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJdHJhY2VyLmVycm9yKCJDYW4ndCBnZXQgYW5ub3RhdGlvbiBtZW1iZXJzIiwgZSk7CS8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZvciAoSU1lbWJlclZhbHVlUGFpciBtdnAgOiBtdnBzKSB7Ci0JCQlpZiAobXZwLmdldE1lbWJlck5hbWUoKS5lcXVhbHMobWVtYmVyTmFtZSkpIHsKLQkJCQlyZXR1cm4gbXZwLmdldFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCSovCQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU9sZFJlbGF0aW9ucyhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLAotCQkJQ29udGFpbmVyU2hhcGUgY3MpIHsKLQkJU2V0PElSZW1vdmVDb250ZXh0PiBjdHhzID0gbmV3IEhhc2hTZXQ8SVJlbW92ZUNvbnRleHQ+KCk7Ci0JCUl0ZXJhdG9yPENvbm5lY3Rpb24+IGl0ZXIgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRBbGxDb25uZWN0aW9ucyhjcykuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlDb25uZWN0aW9uIGNvbm4gPSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyB2ID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShjb25uLCBJc0FSZWxhdGlvbi5JU19BX0NPTk5FQ1RJT05fUFJPUF9LRVkpOwotCQkJaWYgKEJvb2xlYW4uVFJVRS50b1N0cmluZygpLmVxdWFscyh2KSkKLQkJCQljb250aW51ZTsKLQkJCUlSZW1vdmVDb250ZXh0IGN0eCA9IG5ldyBSZW1vdmVDb250ZXh0KGNvbm4pOwotCQkJY3R4cy5hZGQoY3R4KTsKLQkJfQotCQlJdGVyYXRvcjxJUmVtb3ZlQ29udGV4dD4gaXRDdHggPSBjdHhzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdEN0eC5oYXNOZXh0KCkpIHsKLQkJCUlSZW1vdmVDb250ZXh0IGN0eCA9IGl0Q3R4Lm5leHQoKTsKLQkJCVJlbW92ZVJlbGF0aW9uRmVhdHVyZSBmdCA9IG5ldyBSZW1vdmVSZWxhdGlvbkZlYXR1cmUoZnApOwotCQkJZnQucmVtb3ZlKGN0eCk7Ci0JCX0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkTmV3UmVsYXRpb25zKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsCi0JCQlKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCi0JCUNvbGxlY3Rpb248SVJlbGF0aW9uPiBzZWxmUmVscyA9IG5ldyBIYXNoU2V0PElSZWxhdGlvbj4oKTsgCi0JCUNvbGxlY3Rpb248SVJlbGF0aW9uPiBuZXdSZWxzID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkKLQkJCQkucHJvZHVjZUFsbFJlbGF0aW9ucyhqcHQsIGZwKTsKLQkJSXRlcmF0b3I8SVJlbGF0aW9uPiByZWxzSXQgPSBuZXdSZWxzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChyZWxzSXQuaGFzTmV4dCgpKSB7Ci0JCQlJUmVsYXRpb24gcmVsID0gcmVsc0l0Lm5leHQoKTsKLQkJCWlmIChyZWwuZ2V0T3duZXIoKSA9PSByZWwuZ2V0SW52ZXJzZSgpKSB7Ci0JCQkJc2VsZlJlbHMuYWRkKHJlbCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlhZGROZXdSZWxhdGlvbihmcCwgcmVsKTsKLQkJfQotCQlyZWxzSXQgPSBzZWxmUmVscy5pdGVyYXRvcigpOwotCQl3aGlsZSAocmVsc0l0Lmhhc05leHQoKSkgewotCQkJSVJlbGF0aW9uIHJlbCA9IHJlbHNJdC5uZXh0KCk7Ci0JCQlhZGROZXdSZWxhdGlvbihmcCwgcmVsKTsKLQkJfQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIGFkZElzQVJlbGF0aW9ucyhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLAotCQkJCQkJCQkgICBDb2xsZWN0aW9uPElzQVJlbGF0aW9uPiByZWxzKSB7Ci0JCUl0ZXJhdG9yPElzQVJlbGF0aW9uPiBpdCA9IHJlbHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSXNBUmVsYXRpb24gcmVsID0gaXQubmV4dCgpOwotCQkJYWRkTmV3SXNBUmVsYXRpb24oZnAsIHJlbCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE5ld1JlbGF0aW9uKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIElSZWxhdGlvbiByZWwpIHsKLQkJQWRkQ29ubmVjdGlvbkNvbnRleHQgY3R4ID0gbmV3IEFkZENvbm5lY3Rpb25Db250ZXh0KEpQQUVkaXRvclV0aWwKLQkJCQkuZ2V0QW5jaG9yKHJlbC5nZXRPd25lcigpLCBmcCksIEpQQUVkaXRvclV0aWwuZ2V0QW5jaG9yKHJlbAotCQkJCS5nZXRJbnZlcnNlKCksIGZwKSk7Ci0JCWN0eC5zZXROZXdPYmplY3QocmVsKTsKLQkJY3R4LnNldFRhcmdldENvbnRhaW5lcihmcC5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbSgpKTsKLQkJcmVmcmVzaEVudGl0eU1vZGVsKGZwLCByZWwuZ2V0T3duZXIoKSk7Ci0JCXJlZnJlc2hFbnRpdHlNb2RlbChmcCwgcmVsLmdldEludmVyc2UoKSk7Ci0JCUFkZFJlbGF0aW9uRmVhdHVyZSBmdCA9IG5ldyBBZGRSZWxhdGlvbkZlYXR1cmUoZnApOwotCQlmdC5hZGQoY3R4KTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkTmV3SXNBUmVsYXRpb24oSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgSXNBUmVsYXRpb24gcmVsKSB7Ci0JCUFkZENvbm5lY3Rpb25Db250ZXh0IGN0eCA9IG5ldyBBZGRDb25uZWN0aW9uQ29udGV4dChKUEFFZGl0b3JVdGlsCi0JCQkJLmdldEFuY2hvcihyZWwuZ2V0U3ViY2xhc3MoKSwgZnApLCBKUEFFZGl0b3JVdGlsLmdldEFuY2hvcihyZWwuZ2V0U3VwZXJjbGFzcygpLCBmcCkpOwotCQljdHguc2V0TmV3T2JqZWN0KHJlbCk7Ci0JCWN0eC5zZXRUYXJnZXRDb250YWluZXIoZnAuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW0oKSk7Ci0JCXJlZnJlc2hFbnRpdHlNb2RlbChmcCwgcmVsLmdldFN1YmNsYXNzKCkpOwotCQlyZWZyZXNoRW50aXR5TW9kZWwoZnAsIHJlbC5nZXRTdXBlcmNsYXNzKCkpOwotCQlBZGRJbmhlcml0ZWRFbnRpdHlGZWF0dXJlIGZ0ID0gbmV3IEFkZEluaGVyaXRlZEVudGl0eUZlYXR1cmUoZnApOwotCQlmdC5hZGQoY3R4KTsJCQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRSZWxUeXBlTmFtZShSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBhbiwKLQkJCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSBqcmEpIHsKLQkJU3RyaW5nIHJlbFR5cGVOYW1lID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJvb2xlYW4gaXNNYXAgPSBqcmEuZ2V0VHlwZU5hbWUoKS5lcXVhbHMoImphdmEudXRpbC5NYXAiKTsJLy8kTk9OLU5MUy0xJAotCQkJcmVsVHlwZU5hbWUgPSBqcmEuZ2V0VHlwZVR5cGVBcmd1bWVudE5hbWUoaXNNYXAgPyAxIDogMCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQlpZiAocmVsVHlwZU5hbWUgPT0gbnVsbCkgCi0JCQlyZWxUeXBlTmFtZSA9IGFuLmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lKCk7CQkJCQkJCQkJCQkJCi0JCWlmIChyZWxUeXBlTmFtZSA9PSBudWxsKSAKLQkJCXJlbFR5cGVOYW1lID0gSlBBRWRpdG9yVXRpbC5nZXRBdHRyaWJ1dGVUeXBlTmFtZShqcmEpOwkJCQkJCQkKLQkJcmV0dXJuIHJlbFR5cGVOYW1lOwotCX0KLQkJCi0JcHVibGljIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiAoSnBhUHJvamVjdCkgcHJvamVjdC5nZXRBZGFwdGVyKEpwYVByb2plY3QuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkVHlwZShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCUlkQ2xhc3NBbm5vdGF0aW9uIGFuID0gKElkQ2xhc3NBbm5vdGF0aW9uKWpwdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlpZiAoYW4gIT0gbnVsbCkKLQkJCXJldHVybiBhbi5nZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVtdIGlkcyA9IGdldElkcyhqcHQpOwotCQlpZiAoaWRzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyB0eXBlID0gaWRzWzBdLmdldFR5cGVOYW1lKCk7Ci0JCVN0cmluZyB3cmFwcGVyID0gSlBBRWRpdG9yVXRpbC5nZXRQcmltaXRpdmVXcmFwcGVyKHR5cGUpOwotCQlyZXR1cm4gKHdyYXBwZXIgIT0gbnVsbCkgPyB3cmFwcGVyIDogdHlwZTsKLQl9Ci0JCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlW10gZ2V0SWRzKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJQXJyYXlMaXN0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiByZXMgPSBuZXcgQXJyYXlMaXN0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPigpOwotCQlmb3IgKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0IDoganB0LmdldEF0dHJpYnV0ZXMoKSkgewotCQkJaWYgKGlzSWQoYXQpKQotCQkJCXJlcy5hZGQoYXQpOwotCQl9Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlW10gcmV0ID0gbmV3IEphdmFQZXJzaXN0ZW50QXR0cmlidXRlW3Jlcy5zaXplKCldOwotCQlyZXR1cm4gcmVzLnRvQXJyYXkocmV0KTsKLQl9Ci0JCi0JLy8gcmV0dXJucyB0cnVlIGV2ZW4gaWYgdGhlIHByaW1hcnkga2V5IGlzIGluaGVyaXRlZAotCXB1YmxpYyBib29sZWFuIGhhc09ySW5oZXJpdHNQcmltYXJ5S2V5KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJSXRlcmFibGU8UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0ganB0LmdldEFsbEF0dHJpYnV0ZXMoKTsKLQkJSXRlcmF0b3I8UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiBpdCA9IGF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGF0ID0gaXQubmV4dCgpOwotCQkJaWYgKGlzSWQoYXQpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzUHJpbWFyeUtleShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCWZvciAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQgOiBqcHQuZ2V0QXR0cmlidXRlcygpKSAKLQkJCWlmIChpc0lkKGF0KSkgcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0lkKFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJcmV0dXJuIGlzU2ltcGxlSWQoanBhKSB8fCBpc0VtYmVkZGVkSWQoanBhKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNTaW1wbGVJZChSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCXJldHVybiAoanBhLmdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0VtYmVkZGVkSWQoUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSkgewotCQlyZXR1cm4gKGpwYS5nZXRNYXBwaW5nS2V5KCkgPT0gTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQl9CQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJU3RyaW5nIGNvbHVtbk5hbWU9IG51bGw7Ci0JCUNvbHVtbkFubm90YXRpb24gYW4gPSAoQ29sdW1uQW5ub3RhdGlvbilqcGEuCi0JCQkJCQkJCQlnZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLgotCQkJCQkJCQkJCWdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlpZiAoYW4gIT0gbnVsbCkgCi0JCQljb2x1bW5OYW1lID0gYW4uZ2V0TmFtZSgpOwotCQlpZiAoY29sdW1uTmFtZSA9PSBudWxsKSAKLQkJCWNvbHVtbk5hbWUgPSBqcGEuZ2V0TmFtZSgpOwkJCi0JCXJldHVybiBjb2x1bW5OYW1lOyAKLQl9Ci0JCi0JcHVibGljIElDb2xvckNvbnN0YW50IGdldEZvcmVncm91bmQoSlBBRWRpdG9yQ29uc3RhbnRzLkRJQUdSQU1fT0JKRUNUX1RZUEUgZG90KSB7Ci0JCUlDb2xvckNvbnN0YW50IGZvcmVncm91bmQgPSBkb3QuZXF1YWxzKEpQQUVkaXRvckNvbnN0YW50cy5ESUFHUkFNX09CSkVDVF9UWVBFLk1hcHBlZFN1cGVjbGFzcykgPyAKLQkJCQlKUEFFZGl0b3JDb25zdGFudHMuTUFQUEVEX1NVUEVSQ0xBU1NfQk9SREVSX0NPTE9SOgotCQkJCUpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfQk9SREVSX0NPTE9SOwotCQlyZXR1cm4gZm9yZWdyb3VuZDsKLQl9Ci0KLQlwdWJsaWMgSUNvbG9yQ29uc3RhbnQgZ2V0QmFja2dyb3VuZChKUEFFZGl0b3JDb25zdGFudHMuRElBR1JBTV9PQkpFQ1RfVFlQRSBkb3QpIHsKLQkJSUNvbG9yQ29uc3RhbnQgYmFja2dyb3VuZCA9IGRvdC5lcXVhbHMoSlBBRWRpdG9yQ29uc3RhbnRzLkRJQUdSQU1fT0JKRUNUX1RZUEUuTWFwcGVkU3VwZWNsYXNzKSA/IAotCQkJCUpQQUVkaXRvckNvbnN0YW50cy5NQVBQRURfU1VQRVJDTEFTU19CQUNLR1JPVU5EOgotCQkJCUpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfQkFDS0dST1VORDsJCi0JCXJldHVybiBiYWNrZ3JvdW5kOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJlbmRlcmluZ1N0eWxlKEpQQUVkaXRvckNvbnN0YW50cy5ESUFHUkFNX09CSkVDVF9UWVBFIGRvdCkgewotCQlTdHJpbmcgcmVuZGVyaW5nU3R5bGUgPSBkb3QuZXF1YWxzKEpQQUVkaXRvckNvbnN0YW50cy5ESUFHUkFNX09CSkVDVF9UWVBFLk1hcHBlZFN1cGVjbGFzcykgPyAKLQkJCUlKUEFFZGl0b3JQcmVkZWZpbmVkUmVuZGVyaW5nU3R5bGUuR1JFRU5fV0hJVEVfR0xPU1NfSUQgOgotCQkJSUpQQUVkaXRvclByZWRlZmluZWRSZW5kZXJpbmdTdHlsZS5CTFVFX1dISVRFX0dMT1NTX0lEOwotCQlyZXR1cm4gcmVuZGVyaW5nU3R5bGU7Ci0JfQotCQotCXB1YmxpYyBKUEFFZGl0b3JDb25zdGFudHMuRElBR1JBTV9PQkpFQ1RfVFlQRSBkZXRlcm1pbmVEaWFncmFtT2JqZWN0VHlwZShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCWlmICh0aGlzLmhhc0VudGl0eUFubm90YXRpb24oanB0KSkgewotCQkJcmV0dXJuIEpQQUVkaXRvckNvbnN0YW50cy5ESUFHUkFNX09CSkVDVF9UWVBFLkVudGl0eTsKLQkJfSBlbHNlIGlmICh0aGlzLmhhc01hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKGpwdCkpIHsKLQkJCXJldHVybiBKUEFFZGl0b3JDb25zdGFudHMuRElBR1JBTV9PQkpFQ1RfVFlQRS5NYXBwZWRTdXBlY2xhc3M7Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlSWROYW1lKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJU3RyaW5nIG5hbWUgPSAiaWQiOwkJLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZ2VuTmFtZSA9IG5hbWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDAwMDA7IGkrKykgewotCQkJaWYgKCFoYXNBdHRyaWJ1dGVOYW1lZChqcHQsIGdlbk5hbWUpKQotCQkJCXJldHVybiBnZW5OYW1lOwotCQkJZ2VuTmFtZSA9IG5hbWUgKyAiXyIgKyBpOwkvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdlbk5hbWU7Ci0JfQotCQotCQotCXByaXZhdGUgIGJvb2xlYW4gaGFzQXR0cmlidXRlTmFtZWQoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBoaWVyID0ganB0LmdldEFsbEF0dHJpYnV0ZU5hbWVzKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXQgPSBoaWVyLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBhdE5hbWUgPSBpdC5uZXh0KCk7Ci0JCQlpZiAobmFtZS5lcXVhbHMoYXROYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkU3VwZXJjbGFzc1BhY2thZ2VEZWNsYXJhdGlvbihKYXZhUGVyc2lzdGVudFR5cGUganB0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gbnVsbDsKLQkJSVBhY2thZ2VEZWNsYXJhdGlvbltdIHBhY2thZ2VzID0gSlBBRWRpdG9yVXRpbC5nZXRDb21waWxhdGlvblVuaXQoanB0KQotCQkJCS5nZXRQYWNrYWdlRGVjbGFyYXRpb25zKCk7Ci0JCWlmIChwYWNrYWdlcy5sZW5ndGggPiAwKSB7Ci0JCQlJUGFja2FnZURlY2xhcmF0aW9uIHBhY2thZ2VEZWNsID0gcGFja2FnZXNbMF07Ci0JCQlwYWNrYWdlTmFtZSA9IHBhY2thZ2VEZWNsLmdldEVsZW1lbnROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHBhY2thZ2VOYW1lOwotCX0KLQkKLQkJCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvUGVTZXJ2aWNlVXRpbEltcGwuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL1BlU2VydmljZVV0aWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZGMyOWMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvUGVTZXJ2aWNlVXRpbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtpcmlsIE1pdG92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5Qcm9wZXJ0eUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5GcmVlRm9ybUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci0KLXB1YmxpYyBjbGFzcyBQZVNlcnZpY2VVdGlsSW1wbCBpbXBsZW1lbnRzIElQZVNlcnZpY2VVdGlsIHsKLQotCXB1YmxpYyBGcmVlRm9ybUNvbm5lY3Rpb24gY3JlYXRlRnJlZUZvcm1Db25uZWN0aW9uKERpYWdyYW0gZGlhZ3JhbSkgewotCQlyZXR1cm4gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuY3JlYXRlRnJlZUZvcm1Db25uZWN0aW9uKGRpYWdyYW0pOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VmFsdWUoUHJvcGVydHlDb250YWluZXIgcHJvcGVydHlDb250YWluZXIsIFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUocHJvcGVydHlDb250YWluZXIsIGtleSk7Ci0JfQotCi0JcHVibGljIFByb3BlcnR5IGdldFByb3BlcnR5KFByb3BlcnR5Q29udGFpbmVyIHByb3BlcnR5Q29udGFpbmVyLCBTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRQcm9wZXJ0eShwcm9wZXJ0eUNvbnRhaW5lciwga2V5KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlUHJvcGVydHkoUHJvcGVydHlDb250YWluZXIgcHJvcGVydHlDb250YWluZXIsIFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIEdyYXBoaXRpLmdldFBlU2VydmljZSgpLnJlbW92ZVByb3BlcnR5KHByb3BlcnR5Q29udGFpbmVyLCBrZXkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKFByb3BlcnR5Q29udGFpbmVyIHByb3BlcnR5Q29udGFpbmVyLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsJCi0JCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLnNldFByb3BlcnR5VmFsdWUocHJvcGVydHlDb250YWluZXIsIGtleSwgdmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGViM2U0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL1Jlc291cmNlQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlckRlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnV0aWwuTW9kZWxJbnRlZ3JhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCUlNYXJrZXJEZWx0YVtdIG1hcmtlckRlbHRhcyA9IGV2ZW50LmZpbmRNYXJrZXJEZWx0YXMobnVsbCwgdHJ1ZSk7Ci0JCUlQcm9qZWN0IHByID0gbnVsbDsKLQkJZm9yIChJTWFya2VyRGVsdGEgZGVsdGEgOiBtYXJrZXJEZWx0YXMpIHsKLQkJCWludCByZXNUeXBlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCk7Ci0JCQlpZiAocmVzVHlwZSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgewotCQkJCXByID0gKElQcm9qZWN0KWRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAocmVzVHlwZSAhPSBJUmVzb3VyY2UuRklMRSkKLQkJCQljb250aW51ZTsKLQkJCWZpbmFsIElGaWxlIGZpbGUgPSAoSUZpbGUpIGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlwciA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoZGVsdGEuZ2V0S2luZCgpICE9IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIAotCQkJCWNvbnRpbnVlOwotCQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQkJcHIgPSBwcm9qZWN0OwotCQkJZmluYWwgU3RyaW5nIG5hbWUgPSBwcm9qZWN0LmdldE5hbWUoKTsKLQkJCWlmIChmaWxlLmdldEZ1bGxQYXRoKCkuZXF1YWxzKE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldERpYWdyYW1YTUxGdWxsUGF0aChuYW1lKSkpIHsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmcyA9IHdvcmtiZW5jaFBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQkJCQkJZm9yIChJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZiA6IGVkaXRvclJlZnMpIHsKLQkJCQkJCQlpZighSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5QTFVHSU5fSUQuZXF1YWxzKGVkaXRvclJlZi5nZXRJZCgpKSkgCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCWlmIChuYW1lLmVxdWFscyhlZGl0b3JSZWYuZ2V0TmFtZSgpKSkgCi0JCQkJCQkJCWNvbnRpbnVlOwkJCQkJCQkKLQkJCQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBlZGl0b3JSZWYuZ2V0RWRpdG9yKGZhbHNlKTsKLQkJCQkJCQlpZiAoZWRpdG9yID09IG51bGwpCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCXdvcmtiZW5jaFBhZ2UuY2xvc2VFZGl0b3IoZWRpdG9yLCBmYWxzZSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQkKLQkJCX0KLQkJfQkKLQkJCi0JCWlmIChwciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlyZWFycmFuZ2VJc0FSZWxhdGlvbnMocHIpOwotCi0JfQotCQotCXByaXZhdGUgdm9pZCByZWFycmFuZ2VJc0FSZWxhdGlvbnMoSVByb2plY3QgcHIpIHsKLQkJaWYgKHByID09IG51bGwpIHJldHVybjsKLQkJZmluYWwgRGlhZ3JhbSBkID0gTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0RGlhZ3JhbUJ5UHJvamVjdChwcik7Ci0JCWlmIChkID09IG51bGwpIHJldHVybjsKLQkJZmluYWwgSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlciBwcm92aWRlciA9IE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldFByb3ZpZGVyQnlEaWFncmFtKGQuZ2V0TmFtZSgpKTsKLQkJaWYgKHByb3ZpZGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVhcnJhbmdlSXNBUmVsYXRpb25zSW5UcmFuc2FjdGlvbihwcm92aWRlci5nZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQl9Ci0JCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL1NpemVQb3NpdGlvbi5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvU2l6ZVBvc2l0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NzAxMmMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvU2l6ZVBvc2l0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotcHVibGljIGNsYXNzIFNpemVQb3NpdGlvbiB7Ci0JCi0JcHJpdmF0ZSBpbnQgd2lkdGg7Ci0JcHJpdmF0ZSBpbnQgaGVpZ2h0OwotCXByaXZhdGUgaW50IHg7Ci0JcHJpdmF0ZSBpbnQgeTsKLQotCXB1YmxpYyBib29sZWFuIHByaW1hcnlDb2xsYXBzZWQ7Ci0JcHVibGljIGJvb2xlYW4gYmFzaWNDb2xsYXBzZWQ7Ci0JcHVibGljIGJvb2xlYW4gcmVsYXRpb25Db2xsYXBzZWQ7Ci0JCi0JcHVibGljIFNpemVQb3NpdGlvbihpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCB4LCBpbnQgeSkgewotCQl0aGlzLndpZHRoID0gd2lkdGg7Ci0JCXRoaXMuaGVpZ2h0ID0gaGVpZ2h0OwotCQl0aGlzLnggPSB4OwotCQl0aGlzLnkgPSB5OwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFdpZHRoKCkgewotCQlyZXR1cm4gd2lkdGg7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkgewotCQlyZXR1cm4gaGVpZ2h0OwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFgoKSB7Ci0JCXJldHVybiB4OwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFkoKSB7Ci0JCXJldHVybiB5OwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvV3JwLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9XcnAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmZmU4MS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9XcnAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1wdWJsaWMgY2xhc3MgV3JwIHsKLQlwcml2YXRlIE9iamVjdCBvYmo7Ci0JCi0JcHVibGljIFdycCgpIHt9Ci0JCi0JcHVibGljIHZvaWQgc2V0T2JqKE9iamVjdCBvYmopIHsKLQkJdGhpcy5vYmogPSBvYmo7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0T2JqKCkgewotCQlyZXR1cm4gb2JqOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy8uY2xhc3NwYXRoIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZjAwY2UuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy8uY3ZzaWdub3JlIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy8ucHJvamVjdCBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ1ZjU2Mi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcxNzZiMy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1dlZCBNYXIgMDkgMTA6MjI6MjIgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYTNlMTMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4yMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5KUEFFZGl0b3JUZXN0c0FjdGl2YXRvcgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjYKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWFzeW1vY2s7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjUuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuNC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZ2VmO2J1bmRsZS12ZXJzaW9uPSJbMy42LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5ncmFwaGl0aTtidW5kbGUtdmVyc2lvbj0iWzAuOC4wLDEuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZ3JhcGhpdGkudWk7YnVuZGxlLXZlcnNpb249IlswLjguMCwxLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4wLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4wLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjIuMSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW07YnVuZGxlLXZlcnNpb249IlsxLjMuMSwyLjAuMCkiLAotIG9yZy5qdW5pdDQ7YnVuZGxlLXZlcnNpb249Ils0LjAuMCw1LjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5lZGl0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5mZWF0dXJlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwubGlzdGVuZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5wcm92aWRlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLnJlbGF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvYWJvdXQuaHRtbCBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YWRkN2UuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgU0FQIEFHLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YmNkODcuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpQQSBEaWFncmFtIEVkaXRvciBKVW5pdCBUZXN0cwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvcG9tLnhtbCBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWNkYTIzLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KLQk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0JCi0JPHBhcmVudD4KLQkJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3JfcGFyZW50PC9hcnRpZmFjdElkPgotCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcjwvZ3JvdXBJZD4KLQkJPHZlcnNpb24+MS4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0JCTxyZWxhdGl2ZVBhdGg+Li4vLi4vZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IucmVsZW5nL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLQk8L3BhcmVudD4KLQkKLQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qcHQudWkuZGlhZ3JhbWVkaXRvci50ZXN0PC9hcnRpZmFjdElkPgotCTxwYWNrYWdpbmc+ZWNsaXBzZS10ZXN0LXBsdWdpbjwvcGFja2FnaW5nPgotCTxuYW1lPkpQQSBEaWFncmFtIEVkaXRvciBUZXN0IFBsdWctaW48L25hbWU+Ci0JCi0JPGJ1aWxkPgotCQk8cGx1Z2lucz4KLQkJCTxwbHVnaW4+Ci0JCQkJPGdyb3VwSWQ+b3JnLnNvbmF0eXBlLnR5Y2hvPC9ncm91cElkPgotCQkJCTxhcnRpZmFjdElkPm1hdmVuLW9zZ2ktdGVzdC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0JCQkJPHZlcnNpb24+JHt0eWNoby12ZXJzaW9ufTwvdmVyc2lvbj4KLQkJCQk8Y29uZmlndXJhdGlvbj4KLQkJCQkJPHRlc3RTdWl0ZT5vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci50ZXN0czwvdGVzdFN1aXRlPgotCQkJCQk8dGVzdENsYXNzPm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLkFsbEpwYUVkaXRvclRlc3RzPC90ZXN0Q2xhc3M+Ci0JCQkJCTx1c2VVSUhhcm5lc3M+dHJ1ZTwvdXNlVUlIYXJuZXNzPgotCQkJCQk8dXNlVUlUaHJlYWQ+dHJ1ZTwvdXNlVUlUaHJlYWQ+Ci0JCQkJCTxhcmdMaW5lPi1YbXMxMjhtIC1YbXg1MTJtIC1YWDpNYXhQZXJtU2l6ZT0yNTZtPC9hcmdMaW5lPgotCQkJCQk8cHJvZHVjdD5vcmcuZWNsaXBzZS5zZGsuaWRlPC9wcm9kdWN0PgotCQkJCQk8YXBwbGljYXRpb24+b3JnLmVjbGlwc2UudWkuaWRlLndvcmtiZW5jaDwvYXBwbGljYXRpb24+Ci0JCQkJCTxkZXBlbmRlbmNpZXM+Ci0JCQkJCQk8ZGVwZW5kZW5jeT4KLQkJCQkJCQk8dHlwZT5wMi1pbnN0YWxsYWJsZS11bml0PC90eXBlPgotCQkJCQkJCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnNkay5pZGU8L2FydGlmYWN0SWQ+Ci0JCQkJCQkJPHZlcnNpb24+MC4wLjA8L3ZlcnNpb24+Ci0JCQkJCQk8L2RlcGVuZGVuY3k+Ci0JCQkJCTwvZGVwZW5kZW5jaWVzPgotCQkJCTwvY29uZmlndXJhdGlvbj4KLQkJCTwvcGx1Z2luPgotCQk8L3BsdWdpbnM+Ci0JPC9idWlsZD4KLQkKLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL0FsbEpwYUVkaXRvclRlc3RzLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL0FsbEpwYUVkaXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYWExYWYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9BbGxKcGFFZGl0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLmVkaXRvci5DcmVhdGVEaWFncmFtVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5lZGl0b3IuRWRpdG9yVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5mZWF0dXJlLkFkZEF0dHJpYnV0ZUZlYXR1cmVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLmZlYXR1cmUuQWRkSlBBRW50aXR5RmVhdHVyZVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuZmVhdHVyZS5BZGRSZWxhdGlvbkZlYXR1cmVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLmZlYXR1cmUuRGVsZXRlUmVsYXRpb25GZWF0dXJlVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5mZWF0dXJlLkRpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5mZWF0dXJlLkxheW91dEVudGl0eUZlYXR1cmVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbC5Nb2RlbEludGVncmF0aW9uVXRpbFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWxUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLnV0aWwuSlBBU29sdmVyVGVzdDsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlLlN1aXRlQ2xhc3NlczsKLQotLyoqCi0gKiBBbGxKcGFFZGl0b3JUZXN0cwotICogCi0gKiBSZXF1aXJlZCBKYXZhIHN5c3RlbSBwcm9wZXJ0aWVzOgotICogICAgLURvcmcuZWNsaXBzZS5qcHQuanBhLmphcj08anBhLmphciBwYXRoPgotICogICAgLURvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuamFyPTxlY2xpcHNlbGluay5qYXIgcGF0aD4KLSAqLwotCi1AUnVuV2l0aChTdWl0ZS5jbGFzcykKLUBTdWl0ZUNsYXNzZXMoIHsKLS8vCQkJCUNyZWF0ZURpYWdyYW1UZXN0LmNsYXNzLAotCQkJCUpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplclRlc3QuY2xhc3MsCi0JIAkJCUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZVRlc3QuY2xhc3MsCi0JIAkJCUFkZEpQQUVudGl0eUZlYXR1cmVUZXN0LmNsYXNzLAotLy8JCQkJQ2xpY2tBZGRGZWF0dXJlVGVzdC5jbGFzcywKLS8vCQkJCUNyZWF0ZURlbGV0ZUVudGl0eS5jbGFzcywKLQkJCQlEaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZVRlc3QuY2xhc3MsCi0JCQkJRWRpdG9yVGVzdC5jbGFzcywJCi0JCQkJSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJUZXN0LmNsYXNzLAotCQkJCUpQQUVkaXRvclV0aWxUZXN0LmNsYXNzLAotCQkJCUpQQVNvbHZlclRlc3QuY2xhc3MsCi0vLwkJCQlPcGVuTWluaWF0dXJlVmlld0ZlYXR1cmVUZXN0LmNsYXNzLAotLy8JCQkJUmVmYWN0b3JBdHRyaWJ1dGVUeXBlRmVhdHVyZVRlc3QuY2xhc3MsCi0vLwkJCQlTYXZlRW50aXR5RmVhdHVyZVRlc3QuY2xhc3MsCi0JCQkJQWRkUmVsYXRpb25GZWF0dXJlVGVzdC5jbGFzcywKLQkJCQlBZGRBdHRyaWJ1dGVGZWF0dXJlVGVzdC5jbGFzcywKLS8vCQkJCUNyZWF0ZURlbGV0ZU9ubHlBdHRyaWJ1dGVUZXN0LmNsYXNzLAotLy8JCQkJSlBBUHJvamVjdExpc3RlbmVyVGVzdC5jbGFzcywKLS8vCQkJCU1vZGVsSW50ZWdyYXRpb25UZXN0LmNsYXNzLAotCQkJCU1vZGVsSW50ZWdyYXRpb25VdGlsVGVzdC5jbGFzcywKLQkJCQlMYXlvdXRFbnRpdHlGZWF0dXJlVGVzdC5jbGFzcywKLQkJCQlEZWxldGVSZWxhdGlvbkZlYXR1cmVUZXN0LmNsYXNzLAotLy8JCQkJQ3JlYXRlUmVsYXRpb25zVGVzdC5jbGFzcwotCQkJCX0pCi0KLXB1YmxpYyBjbGFzcyBBbGxKcGFFZGl0b3JUZXN0cyB7Ci0JCi0JLyoqCi0JICogVGhpcyBjaGVjayBpcyBuZWNlc3NhcnkgdG8gYWJvcnQgdGhlIHRlc3Qgc3VpdGUgaW4gdGhlIGJ1aWxkIAotCSAqIHdoZW4gdGhlIGVudmlyb25tZW50IGlzIG5vdCBzZXR1cCBwcm9wZXJseS4KLQkgKiAKLQkgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLQkgKi8KLSAgICBAQmVmb3JlQ2xhc3MKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5UmVxdWlyZWRKYXJzRXhpc3RzKCkgdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gewotICAgIAl2ZXJpZnlKcGFKYXJFeGlzdHMoKTsKLSAgICAJLy92ZXJpZnlFY2xpcHNlTGlua0phckV4aXN0cygpOwotICAgIH0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5SnBhSmFyRXhpc3RzKCkgdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gewotCQl2ZXJpZnlSZXF1aXJlZFByb3BlcnR5RXhpc3RzKEpQQUNyZWF0ZUZhY3RvcnkuSlBBX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWSk7Ci0JCXZlcmlmeVJlcXVpcmVkRmlsZUV4aXN0cyhKUEFDcmVhdGVGYWN0b3J5LkpQQV9KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeUVjbGlwc2VMaW5rSmFyRXhpc3RzKCkgdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gewotCQl2ZXJpZnlSZXF1aXJlZFByb3BlcnR5RXhpc3RzKEpQQUNyZWF0ZUZhY3RvcnkuRUNMSVBTRUxJTktfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZKTsKLQkJdmVyaWZ5UmVxdWlyZWRGaWxlRXhpc3RzKEpQQUNyZWF0ZUZhY3RvcnkuRUNMSVBTRUxJTktfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZKTsKLQl9Ci0JCQotCXByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5UmVxdWlyZWRQcm9wZXJ0eUV4aXN0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiB7Ci0JCWlmKEpQQUNyZWF0ZUZhY3RvcnkuZ2V0U3lzdGVtUHJvcGVydHkocHJvcGVydHlOYW1lKSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbihlcnJvck1pc3NpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5UmVxdWlyZWRGaWxlRXhpc3RzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gSlBBQ3JlYXRlRmFjdG9yeS5nZXRTeXN0ZW1Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQlpZiggISAobmV3IEZpbGUoZmlsZU5hbWUpKS5leGlzdHMoKSkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oZXJyb3JKYXJGaWxlRG9lc05vdEV4aXN0KGZpbGVOYW1lKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXJyb3JNaXNzaW5nUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gIk1pc3NpbmcgSmF2YSBzeXN0ZW0gcHJvcGVydHk6IFwiIiArIHByb3BlcnR5TmFtZSArICJcIiI7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVycm9ySmFyRmlsZURvZXNOb3RFeGlzdChTdHJpbmcgZmlsZU5hbWUpIHsKLQkJcmV0dXJuICJKQVIgZmlsZSBkb2Vzbid0IGV4aXN0OiBcIiIgKyBmaWxlTmFtZSArICJcIiI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL0pQQUNyZWF0ZUZhY3RvcnkuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvSlBBQ3JlYXRlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODkyZDkzLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvSlBBQ3JlYXRlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEpQQUNyZWF0ZUZhY3RvcnkgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkgPSAib3JnLmVjbGlwc2UuanB0LmpwYS5qYXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWSA9ICJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuamFyIjsJCi0JCi0JcHJpdmF0ZSBzdGF0aWMgSlBBQ3JlYXRlRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQlwcml2YXRlIElGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdDsgCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OyAKLQlwcml2YXRlIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLQkvL3ByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3Qgc291cmNlRm9sZGVyOwotCUpwYVByb2plY3QganBhUHJvamVjdDsKLQkKLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBKUEFDcmVhdGVGYWN0b3J5IGluc3RhbmNlKCkgewotCQlpZiAoZmFjdG9yeSA9PSBudWxsKQotCQkJZmFjdG9yeSA9IG5ldyBKUEFDcmVhdGVGYWN0b3J5KCk7Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQkKLQlwcml2YXRlIElQcm9qZWN0IGJ1aWxkUGxhdGZvcm1Qcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJZGVzY3JpcHRpb24uc2V0QXV0b0J1aWxkaW5nKHRydWUpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwkJCi0JCUlQcm9qZWN0IHAgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlwLmNyZWF0ZShudWxsKTsKLQkJcC5vcGVuKG51bGwpOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIoKSk7CQkKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTl9TVFIsICIxLjAiKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5QTEFURk9STSwgbnVsbCAvKkdlbmVyaWNQbGF0Zm9ybS5WRVJTSU9OXzFfMC5nZXRJZCgpKi8pOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfT1JNX1hNTCwgQm9vbGVhbi5UUlVFKTsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0JCi0JcHVibGljIEpwYVByb2plY3QgY3JlYXRlSlBBUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZUpQQVByb2plY3QocHJvamVjdE5hbWUsIG51bGwsICIxLjAiKTsKLQl9Ci0KLQlwdWJsaWMgSnBhUHJvamVjdCBjcmVhdGVKUEEyMFByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVKUEFQcm9qZWN0KHByb2plY3ROYW1lLCBudWxsLCAiMi4wIik7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFQcm9qZWN0IGNyZWF0ZUpQQVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBJRGF0YU1vZGVsIGpwYUNvbmZpZywgU3RyaW5nIGpwYUZhY2V0VmVyc2lvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlwcm9qZWN0ID0gYnVpbGRQbGF0Zm9ybVByb2plY3QocHJvamVjdE5hbWUpOwotCQlqYXZhUHJvamVjdCA9IGNyZWF0ZUphdmFQcm9qZWN0KHByb2plY3QsIHRydWUpOwotCQlpZiAoanBhQ29uZmlnICE9IG51bGwpIHsKLQkJCWpwYUZhY2V0VmVyc2lvbiA9IGpwYUNvbmZpZy5nZXRTdHJpbmdQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSKTsKLQkJfQotCQlpbnN0YWxsRmFjZXQoZmFjZXRlZFByb2plY3QsICJqc3QudXRpbGl0eSIsICIxLjAiKTsKLQkJaW5zdGFsbEZhY2V0KGZhY2V0ZWRQcm9qZWN0LCAianB0LmpwYSIsIGpwYUZhY2V0VmVyc2lvbiwganBhQ29uZmlnKTsKLQkJYWRkSmFyKGphdmFQcm9qZWN0LCBqcGFKYXJOYW1lKCkpOwotCQlpZiAoZWNsaXBzZUxpbmtKYXJOYW1lKCkgIT0gbnVsbCkgewotCQkJYWRkSmFyKGphdmFQcm9qZWN0LCBlY2xpcHNlTGlua0phck5hbWUoKSk7Ci0JCX0KLQkJcHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQkJanBhUHJvamVjdCA9IHRoaXMuZ2V0SnBhUHJvamVjdChwcm9qZWN0KTsKLQkJaW50IGNudCA9IDA7Ci0JCXdoaWxlICgoanBhUHJvamVjdCA9PSBudWxsKSAmJiAoY250IDwgMTAwMCkpewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoNTAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJanBhUHJvamVjdCA9IHRoaXMuZ2V0SnBhUHJvamVjdChwcm9qZWN0KTsKLQkJCWNudCsrOwotCQl9Ci0JCWpwYVByb2plY3Quc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3Nlcyh0cnVlKTsKLS8vCQlqcGFQcm9qZWN0LnNldFVwZGF0ZXIobmV3IFN5bmNocm9ub3VzSnBhUHJvamVjdFVwZGF0ZXIoanBhUHJvamVjdCkpOwotCQlyZXR1cm4ganBhUHJvamVjdDsKLQl9Ci0JCi0JcHJpdmF0ZSBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoSVByb2plY3QgcCkgewotCQlyZXR1cm4gKEpwYVByb2plY3QpIHAuZ2V0QWRhcHRlcihKcGFQcm9qZWN0LmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlY2xpcHNlTGlua0phck5hbWUoKSB7Ci0JCXJldHVybiBnZXRTeXN0ZW1Qcm9wZXJ0eShFQ0xJUFNFTElOS19KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbnN0YWxsRmFjZXQoSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0LAotCQkJCQkJCSBTdHJpbmcgZmFjZXROYW1lLCAKLQkJCQkJCQkgU3RyaW5nIHZlcnNpb25OYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWluc3RhbGxGYWNldChmYWNldGVkUHJvamVjdCwgZmFjZXROYW1lLCB2ZXJzaW9uTmFtZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsRmFjZXQoSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0LAotCQkJCQkJCSAgIFN0cmluZyBmYWNldE5hbWUsIAotCQkJCQkJCSAgIFN0cmluZyB2ZXJzaW9uTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl1bmluc3RhbGxGYWNldChmYWNldGVkUHJvamVjdCwgZmFjZXROYW1lLCB2ZXJzaW9uTmFtZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogaWYgJ2NvbmZpZycgaXMgbnVsbCAoYW5kICdmYWNldE5hbWUnIGlzICJqcHQuanBhIiksIHRoZSBKUEEgcHJvamVjdCB3aWxsIGJlIGJ1aWx0IHdpdGggdGhlIGRlZmF1bHRzCi0JICogZGVmaW5lZCBpbiBKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciNnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGxGYWNldChJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QsCi0JCQkJCQkJIFN0cmluZyBmYWNldE5hbWUsIAotCQkJCQkJCSBTdHJpbmcgdmVyc2lvbk5hbWUsIAotCQkJCQkJCSBJRGF0YU1vZGVsIGNvbmZpZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmYWNldGVkUHJvamVjdC5pbnN0YWxsUHJvamVjdEZhY2V0KHRoaXMuZmFjZXRWZXJzaW9uKGZhY2V0TmFtZSwgdmVyc2lvbk5hbWUpLCBjb25maWcsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbEZhY2V0KElGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCwKLQkJCQkJCQkgICBTdHJpbmcgZmFjZXROYW1lLCAKLQkJCQkJCQkgICBTdHJpbmcgdmVyc2lvbk5hbWUsIAotCQkJCQkJCSAgIElEYXRhTW9kZWwgY29uZmlnKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZhY2V0ZWRQcm9qZWN0LnVuaW5zdGFsbFByb2plY3RGYWNldCh0aGlzLmZhY2V0VmVyc2lvbihmYWNldE5hbWUsIHZlcnNpb25OYW1lKSwgY29uZmlnLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZhY2V0VmVyc2lvbihTdHJpbmcgZmFjZXROYW1lLCBTdHJpbmcgdmVyc2lvbk5hbWUpIHsKLQkJcmV0dXJuIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChmYWNldE5hbWUpLmdldFZlcnNpb24odmVyc2lvbk5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRTeXN0ZW1Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRKYXIoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTdHJpbmcgamFyUGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXRoaXMuYWRkQ2xhc3NwYXRoRW50cnkoamF2YVByb2plY3QsIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aChqYXJQYXRoKSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRDbGFzc3BhdGhFbnRyeShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChBcnJheVRvb2xzLmFkZChqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSwgZW50cnkpLCBudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJRmFjZXRlZFByb2plY3QgY3JlYXRlRmFjZXRlZFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QsIHRydWUsIG51bGwpOwkJLy8gdHJ1ZSA9ICJjb252ZXJ0IGlmIG5lY2Vzc2FyeSIKLQl9Ci0JCi0JcHVibGljIElKYXZhUHJvamVjdCBjcmVhdGVKYXZhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCAgCi0JCQkJCQkJCQkJICBib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmYWNldGVkUHJvamVjdCA9IGNyZWF0ZUZhY2V0ZWRQcm9qZWN0KHByb2plY3QpOwotCQlpbnN0YWxsRmFjZXQoZmFjZXRlZFByb2plY3QsICJqc3QuamF2YSIsICI1LjAiKTsKLQkJamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCS8vc291cmNlRm9sZGVyID0gamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0LmdldEZvbGRlcigic3JjIikpOwotCQlyZXR1cm4gamF2YVByb2plY3Q7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpwYUphck5hbWUoKSB7Ci0JCXJldHVybiBnZXRTeXN0ZW1Qcm9wZXJ0eShKUEFfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZKTsKLQl9Ci0JCi0JcHVibGljIElGaWxlIGNyZWF0ZUVudGl0eShKcGFQcm9qZWN0IGpwYVByb2plY3QsIFN0cmluZyBmdWxseVF1YWxpZmllZE5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihmdWxseVF1YWxpZmllZE5hbWUsICIuIik7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IG5hbWVFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl3aGlsZSh0b2tlbml6ZXIuaGFzTW9yZUVsZW1lbnRzKCkpewotCQkJbmFtZUVsZW1lbnRzLmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQl9Ci0JCUFycmF5TGlzdDxTdHJpbmc+IHBhY2thZ2VGcmFnbWVudHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yKGludCBpPTA7aTxuYW1lRWxlbWVudHMuc2l6ZSgpLTE7aSsrKXsKLQkJCXBhY2thZ2VGcmFnbWVudHMuYWRkKG5hbWVFbGVtZW50cy5nZXQoaSkpOwotCQl9Ci0JCVN0cmluZ1tdIHBhY2thZ2VTdHJpbmdzID0gbmV3IFN0cmluZ1twYWNrYWdlRnJhZ21lbnRzLnNpemUoKV07Ci0JCWZvcihpbnQgaT0wO2k8cGFja2FnZUZyYWdtZW50cy5zaXplKCk7aSsrKXsKLQkJCXBhY2thZ2VTdHJpbmdzW2ldID0gcGFja2FnZUZyYWdtZW50cy5nZXQoaSk7Ci0JCX0KLQkJU3RyaW5nIG5hbWUgPSBuYW1lRWxlbWVudHMuZ2V0KE1hdGgubWF4KDAsIG5hbWVFbGVtZW50cy5zaXplKCktMSkpOwotLy8JCVN5bmNocm9ub3VzSnBhUHJvamVjdFVwZGF0ZXIgdXBkYXRlciA9IG5ldyBTeW5jaHJvbm91c0pwYVByb2plY3RVcGRhdGVyKGpwYVByb2plY3QpOwotLy8JCXVwZGF0ZXIuc3RhcnQoKTsKLQkJSnBhUm9vdENvbnRleHROb2RlIGpwYVByb2plY3RDb250ZW50ID0ganBhUHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKTsKLQkJUGVyc2lzdGVuY2VYbWwgcGVyc1hNTCA9IGpwYVByb2plY3RDb250ZW50LmdldFBlcnNpc3RlbmNlWG1sKCk7Ci0JCWludCBjbnQgPSAwOwotCQl3aGlsZSAoKHBlcnNYTUwgPT0gbnVsbCkgJiYgKGNudCA8IDEwMCkpIHsJCQotCQkJVGhyZWFkLnNsZWVwKDI1MCk7Ci0JCQlwZXJzWE1MID0ganBhUHJvamVjdENvbnRlbnQuZ2V0UGVyc2lzdGVuY2VYbWwoKTsKLQkJCWNudCsrOwotCQl9Ci0JCWlmIChwZXJzWE1MID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlRoZSBwZXJzaXN0ZW5jZSBYTUwgaXMgbm90IGNyZWF0ZWQiKTsKLQkJCi0JCUlGaWxlIGVudGl0eTEgPSBjcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIHBhY2thZ2VTdHJpbmdzLCBuYW1lKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGpycHQgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoZnVsbHlRdWFsaWZpZWROYW1lKTsKLQkJY250ID0gMDsKLQkJd2hpbGUoKGpycHQgPT0gbnVsbCkgJiYgKGNudCA8IDEwMCkpIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDI1MCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkge30gCi0JCQlqcnB0ID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKGZ1bGx5UXVhbGlmaWVkTmFtZSk7Ci0JCQljbnQrKzsKLQkJfQotCQlpZiAoanJwdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJUaGUgZW50aXR5ICciICsgZnVsbHlRdWFsaWZpZWROYW1lICsgIicgY291bGQgbm90IGJlIGNyZWF0ZWQiKTsJCQotCQlyZXR1cm4gZW50aXR5MTsKLQl9Ci0JCi0JcHVibGljIElGaWxlIGNyZWF0ZUVudGl0eUluUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCAKLQkJCQkJCQkJCSAgIFN0cmluZ1tdIHBhY2thZ2VGcmFnbWVudHMsIAotCQkJCQkJCQkJICAgU3RyaW5nIGVudGl0eU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgCi0JCQkJCQkJCQkgICAJCQkJCQkJIENvcmVFeGNlcHRpb24sIAotCQkJCQkJCQkJICAgCQkJCQkJCSBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlTdHJpbmcgZm9sZGVyTmFtZSA9IGdldEZvbGRlck5hbWUocHJvamVjdCwgcGFja2FnZUZyYWdtZW50cyk7Ci0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IHBhY2thZ2VGcmFnbWVudHNbMF07CQkKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBwYWNrYWdlRnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYWNrYWdlTmFtZSArPSAiLiIgKyBwYWNrYWdlRnJhZ21lbnRzW2ldOwotCQl9Ci0JCQotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoZm9sZGVyTmFtZSk7Ci0JCUlGb2xkZXIgZm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIocGF0aCk7CQkgCi0JCXJldHVybiBjcmVhdGVFbnRpdHkoZm9sZGVyLCBwYWNrYWdlTmFtZSAsIGVudGl0eU5hbWUpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Rm9sZGVyTmFtZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSBwYWNrYWdlRnJhZ21lbnRzKQotCQkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsJCQotCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHBhY2thZ2VGcmFnbWVudFJvb3RzID0gbmV3IElQYWNrYWdlRnJhZ21lbnRSb290WzBdOwotCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGhFbnRyaWVzID0gIGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwkJCi0JCWZvciAoSUNsYXNzcGF0aEVudHJ5IGNsYXNzcGF0aEVudHJ5IDogY2xhc3NwYXRoRW50cmllcykgewotCQkJaWYgKGNsYXNzcGF0aEVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQkJcGFja2FnZUZyYWdtZW50Um9vdHMgPSBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cyhjbGFzc3BhdGhFbnRyeSk7Ci0JCQkJYnJlYWs7Ci0JCQl9ICAJCQkKLQkJfQotCQkKLQkJU3RyaW5nIGZvbGRlck5hbWUgPSBwYWNrYWdlRnJhZ21lbnRSb290c1swXS5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKTsKLQkJZm9yIChTdHJpbmcgZnJhZ21lbnQgOiBwYWNrYWdlRnJhZ21lbnRzKSB7Ci0JCQlmb2xkZXJOYW1lICs9IFBhdGguU0VQQVJBVE9SICsgZnJhZ21lbnQ7Ci0JCX0KLQkJcmV0dXJuIGZvbGRlck5hbWU7Ci0JfQotCQotCXByaXZhdGUgSUZpbGUgY3JlYXRlRW50aXR5KElGb2xkZXIgZm9sZGVyLCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBlbnRpdHlOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgZW50aXR5U2hvcnROYW1lID0gZW50aXR5TmFtZS5zdWJzdHJpbmcoZW50aXR5TmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQljcmVhdGVEaXJlY3Rvcmllcyhmb2xkZXIsIHRydWUsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZShlbnRpdHlTaG9ydE5hbWUgKyAiLmphdmEiKTsJCQotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCVN0cmluZyBjb250ZW50ID0gInBhY2thZ2UgIiArIHBhY2thZ2VOYW1lICsgIjtcblxuIiAKLQkJCQkJKyAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7XG5cbiIgCi0JCQkJCSsgIkBFbnRpdHkgXG4iCi0JCQkJCSsgInB1YmxpYyBjbGFzcyAiICsgZW50aXR5U2hvcnROYW1lICsgIiB7XG4iCi0JCQkJCSsgIglwcml2YXRlIGludCBpZDtcbiIKLQkJCQkJKyAiCUBJZCBcbiIKLQkJCQkJKyAiCXB1YmxpYyBpbnQgZ2V0SWQoKSB7XG4iIAotCQkJCQkrICIJCXJldHVybiBpZDtcbiIKLQkJCQkJKyAiCX1cbiIKLQkJCQkJKyAiCXB1YmxpYyB2b2lkIHNldElkKGludCBpZCkge1xuIgotCQkJCQkrICIJCXRoaXMuaWQgPSBpZDtcbiIgCi0JCQkJCSsgIgl9XG4iCi0JCQkJCSsgIn0iOyAvLyROT04tTkxTLTEkCi0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJdHJ5IHsKLQkJCQlzdHJlYW0ud3JpdGUoY29udGVudC5nZXRCeXRlcygpKTsKLQkJCQlzdHJlYW0uZmx1c2goKTsKLQkJCQlmaWxlLmNyZWF0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc3RyZWFtLnRvQnl0ZUFycmF5KCkpLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQl9CQotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0JCi0JCi0JcHVibGljIElGaWxlIGNyZWF0ZUVudGl0eVdpdGhDb21wb3NpdGVQS0luUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LAotCQkJU3RyaW5nW10gcGFja2FnZUZyYWdtZW50cywgU3RyaW5nIGVudGl0eU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwKLQkJCUNvcmVFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmb2xkZXJOYW1lID0gZ2V0Rm9sZGVyTmFtZShwcm9qZWN0LCBwYWNrYWdlRnJhZ21lbnRzKTsKLQotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBwYWNrYWdlRnJhZ21lbnRzWzBdOwotCQlmb3IgKGludCBpID0gMTsgaSA8IHBhY2thZ2VGcmFnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXBhY2thZ2VOYW1lICs9ICIuIiArIHBhY2thZ2VGcmFnbWVudHNbaV07Ci0JCX0KLQotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoZm9sZGVyTmFtZSk7Ci0JCUlGb2xkZXIgZm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIocGF0aCk7Ci0JCXJldHVybiBjcmVhdGVFbnRpdHlXaXRoQ29tcG9zaXRlUEsoZm9sZGVyLCBwYWNrYWdlTmFtZSwgZW50aXR5TmFtZSk7Ci0JfQotCi0JcHVibGljIElGaWxlIGNyZWF0ZUlkQ2xhc3NJblByb2plY3QoSVByb2plY3QgcHJvamVjdCwKLQkJCVN0cmluZ1tdIHBhY2thZ2VGcmFnbWVudHMsIFN0cmluZyBlbnRpdHlOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sCi0JCQlDb3JlRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlTdHJpbmcgZm9sZGVyTmFtZSA9IGdldEZvbGRlck5hbWUocHJvamVjdCwgcGFja2FnZUZyYWdtZW50cyk7Ci0KLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gcGFja2FnZUZyYWdtZW50c1swXTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBwYWNrYWdlRnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYWNrYWdlTmFtZSArPSAiLiIgKyBwYWNrYWdlRnJhZ21lbnRzW2ldOwotCQl9Ci0KLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGZvbGRlck5hbWUpOwotCQlJRm9sZGVyIGZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKHBhdGgpOwotCQlyZXR1cm4gY3JlYXRlSWRDbGFzcyhmb2xkZXIsIHBhY2thZ2VOYW1lLCBlbnRpdHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgY3JlYXRlRW1iZWRkZWRDbGFzc0luUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LAotCQkJU3RyaW5nW10gcGFja2FnZUZyYWdtZW50cywgU3RyaW5nIGVudGl0eU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwKLQkJCUNvcmVFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmb2xkZXJOYW1lID0gZ2V0Rm9sZGVyTmFtZShwcm9qZWN0LCBwYWNrYWdlRnJhZ21lbnRzKTsKLQotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBwYWNrYWdlRnJhZ21lbnRzWzBdOwotCQlmb3IgKGludCBpID0gMTsgaSA8IHBhY2thZ2VGcmFnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXBhY2thZ2VOYW1lICs9ICIuIiArIHBhY2thZ2VGcmFnbWVudHNbaV07Ci0JCX0KLQotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoZm9sZGVyTmFtZSk7Ci0JCUlGb2xkZXIgZm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIocGF0aCk7Ci0JCXJldHVybiBjcmVhdGVFbWJlZGRlZENsYXNzKGZvbGRlciwgcGFja2FnZU5hbWUsIGVudGl0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBJRmlsZSBjcmVhdGVFbnRpdHlXaXRoRW1iZWRkZWRQS0luUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LAotCQkJU3RyaW5nW10gcGFja2FnZUZyYWdtZW50cywgU3RyaW5nIGVudGl0eU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwKLQkJCUNvcmVFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmb2xkZXJOYW1lID0gZ2V0Rm9sZGVyTmFtZShwcm9qZWN0LCBwYWNrYWdlRnJhZ21lbnRzKTsKLQotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBwYWNrYWdlRnJhZ21lbnRzWzBdOwotCQlmb3IgKGludCBpID0gMTsgaSA8IHBhY2thZ2VGcmFnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXBhY2thZ2VOYW1lICs9ICIuIiArIHBhY2thZ2VGcmFnbWVudHNbaV07Ci0JCX0KLQotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoZm9sZGVyTmFtZSk7Ci0JCUlGb2xkZXIgZm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIocGF0aCk7Ci0JCXJldHVybiBjcmVhdGVFbnRpdHlXaXRoRW1iZWRkZWRQSyhmb2xkZXIsIHBhY2thZ2VOYW1lLCBlbnRpdHlOYW1lKTsKLQl9Ci0JCi0JCQotCQkKLQkJcHJpdmF0ZSBJRmlsZSBjcmVhdGVFbnRpdHlXaXRoQ29tcG9zaXRlUEsoSUZvbGRlciBmb2xkZXIsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGVudGl0eU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbnsKLQkJCVN0cmluZyBlbnRpdHlTaG9ydE5hbWUgPSBlbnRpdHlOYW1lLnN1YnN0cmluZyhlbnRpdHlOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQkJCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJY3JlYXRlRGlyZWN0b3JpZXMoZm9sZGVyLCB0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0KLQkJCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZShlbnRpdHlTaG9ydE5hbWUgKyAiLmphdmEiKTsJCQotCQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQkJU3RyaW5nIGNvbnRlbnQgPSAicGFja2FnZSAiICsgcGFja2FnZU5hbWUgKyAiO1xuXG4iIAotCQkJCQkJKyAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7XG5cbiIgCi0JCQkJCQkrICJARW50aXR5IFxuIgotCQkJCQkJKyAiQElkQ2xhc3MoIitlbnRpdHlTaG9ydE5hbWUrIklkLmNsYXNzKSIKLQkJCQkJKyAicHVibGljIGNsYXNzICIgKyBlbnRpdHlTaG9ydE5hbWUgKyAiIHtcbiIKLQkJCQkJCSsgIglASWQgXG4iCi0JCQkJCQkrICIJcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lO1xuIgotCQkJCQkJKyAiCUBJZCBcbiIKLQkJCQkJCSsgIglwcml2YXRlIFN0cmluZyBsYXN0TmFtZTtcbiIKLQkJCQkJCSsgIiBwdWJsaWMgIitlbnRpdHlTaG9ydE5hbWUrIklkKCkge31cbiIKLQkgICAgICAgICAgICAgICAgICAgICsgIiBwdWJsaWMgIitlbnRpdHlTaG9ydE5hbWUrIklkKFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBsYXN0TmFtZSlcbnsiCi0JICAgICAgICAgICAgICAgICAgICArICIgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lO1xuIgotCSAgICAgICAgICAgICAgICAgICAgKyAiICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7XG4iCi0JICAgICAgICAgICAgICAgICAgICArICIgfVxuIgotCQkJCQkJKyAifSI7IC8vJE5PTi1OTFMtMSQKLQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS53cml0ZShjb250ZW50LmdldEJ5dGVzKCkpOwotCQkJCQlzdHJlYW0uZmx1c2goKTsKLQkJCQkJZmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHN0cmVhbS50b0J5dGVBcnJheSgpKSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQkKLQkJCX0KLQkJCXJldHVybiBmaWxlOwotCQkJfQotCQkKLQkJcHJpdmF0ZSBJRmlsZSBjcmVhdGVJZENsYXNzKElGb2xkZXIgZm9sZGVyLCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBlbnRpdHlOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb257Ci0JCQlTdHJpbmcgZW50aXR5U2hvcnROYW1lID0gZW50aXR5TmFtZS5zdWJzdHJpbmcoZW50aXR5TmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JCQlpZiAoIWZvbGRlci5leGlzdHMoKSkgewotCQkJCWNyZWF0ZURpcmVjdG9yaWVzKGZvbGRlciwgdHJ1ZSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCQlJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoZW50aXR5U2hvcnROYW1lICsgIklkLmphdmEiKTsJCQotCQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQkJU3RyaW5nIGNvbnRlbnQgPSAicGFja2FnZSAiICsgcGFja2FnZU5hbWUgKyAiO1xuXG4iIAotCQkJCQkJKyAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7XG5cbiIgCi0JCQkJCQkrImltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsiCi0JCQkJCQkrICJwdWJsaWMgY2xhc3MgIiArIGVudGl0eVNob3J0TmFtZSArICJJZCB7XG4iCi0JCQkJCQkrICIJcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lO1xuIgotCQkJCQkJKyAiCXByaXZhdGUgU3RyaW5nIGxhc3ROYW1lO1xuIgotCQkJCQkJKyAiCXB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkge1xuIiAKLQkJCQkJCSsgIgkJcmV0dXJuIGZpcnN0TmFtZTtcbiIKLQkJCQkJCSsgIgl9XG4iCi0JCQkJCQkrICIJcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpIHtcbiIKLQkJCQkJCSsgIgkJdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7XG4iIAotCQkJCQkJKyAiCX1cbiIKLQkJCQkJCSsgIglwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkge1xuIiAKLQkJCQkJCSsgIgkJcmV0dXJuIGxhc3ROYW1lO1xuIgotCQkJCQkJKyAiCX1cbiIKLQkJCQkJCSsgIglwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpIHtcbiIKLQkJCQkJCSsgIgkJdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lO1xuIiAKLQkJCQkJCSsgIgl9XG4iCi0JCQkJCQkrICJ9IjsgLy8kTk9OLU5MUy0xJAotCQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLndyaXRlKGNvbnRlbnQuZ2V0Qnl0ZXMoKSk7Ci0JCQkJCXN0cmVhbS5mbHVzaCgpOwotCQkJCQlmaWxlLmNyZWF0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc3RyZWFtLnRvQnl0ZUFycmF5KCkpLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCQl9CQotCQkJfQotCQkJcmV0dXJuIGZpbGU7Ci0JCQl9Ci0JCQotCQlwcml2YXRlIElGaWxlIGNyZWF0ZUVudGl0eVdpdGhFbWJlZGRlZFBLKElGb2xkZXIgZm9sZGVyLCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBlbnRpdHlOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb257Ci0JCQlTdHJpbmcgZW50aXR5U2hvcnROYW1lID0gZW50aXR5TmFtZS5zdWJzdHJpbmcoZW50aXR5TmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JCQlpZiAoIWZvbGRlci5leGlzdHMoKSkgewotCQkJCWNyZWF0ZURpcmVjdG9yaWVzKGZvbGRlciwgdHJ1ZSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCQlJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoZW50aXR5U2hvcnROYW1lICsgIi5qYXZhIik7CQkKLQkJCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJCVN0cmluZyBjb250ZW50ID0gInBhY2thZ2UgIiArIHBhY2thZ2VOYW1lICsgIjtcblxuIiAKLQkJCQkJCSsgImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qO1xuXG4iIAkJCQkJCi0JCQkJCQkrICJARW50aXR5XG4iCi0JCQkJCQkrICJwdWJsaWMgY2xhc3MgIiArIGVudGl0eVNob3J0TmFtZSArICIge1xuIgotCQkJCQkJKyAiQEVtYmVkZGVkSWRcbiIKLQkJCQkJCSsgIglwcml2YXRlICIrIGVudGl0eVNob3J0TmFtZSArIklkIGlkO1xuIgkJCQkJCQotCQkJCQkJKyAicHVibGljIHZvaWQgc2V0SWQoIiArIGVudGl0eVNob3J0TmFtZSsgIklkIHBhcmFtKSB7XG4iCi0JCQkJCQkrICIJdGhpcy5pZCA9IHBhcmFtO1xuIgotCQkJCQkJKyAifVxuIgotCQkJCQkJKyAicHVibGljICIrZW50aXR5U2hvcnROYW1lKyJJZCBnZXRJZCgpIHtcbiIKLQkJCQkJCSsJInJldHVybiBpZDtcbiIKLQkJCQkJCSsgIn1cbiIJCQkJCQkKLQkJCQkJCSsgIn0iOyAvLyROT04tTkxTLTEkCi0JCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ud3JpdGUoY29udGVudC5nZXRCeXRlcygpKTsKLQkJCQkJc3RyZWFtLmZsdXNoKCk7Ci0JCQkJCWZpbGUuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzdHJlYW0udG9CeXRlQXJyYXkoKSksIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJCX0JCi0JCQl9Ci0JCQlyZXR1cm4gZmlsZTsKLQkJCX0KLQkJCi0JCXByaXZhdGUgSUZpbGUgY3JlYXRlRW1iZWRkZWRDbGFzcyhJRm9sZGVyIGZvbGRlciwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZW50aXR5TmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uewotCQkJU3RyaW5nIGVudGl0eVNob3J0TmFtZSA9IGVudGl0eU5hbWUuc3Vic3RyaW5nKGVudGl0eU5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQljcmVhdGVEaXJlY3Rvcmllcyhmb2xkZXIsIHRydWUsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfQotCQkJSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKGVudGl0eVNob3J0TmFtZSArICIuamF2YSIpOwkJCi0JCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJU3RyaW5nIGNvbnRlbnQgPSAicGFja2FnZSAiICsgcGFja2FnZU5hbWUgKyAiO1xuXG4iCi0JCQkgICAgICAgICAgICAgICAgICsgImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qO1xuIiAKLQkJCSAgICAgICAgICAgICAgICAgKyAiQEVtYmVkZGFibGVcbiIKLQkJCQkJICAgICAgICAgKyAicHVibGljIGNsYXNzICIgKyBlbnRpdHlTaG9ydE5hbWUgKyAiIHtcbiIKLQkJCQkJICAgICAJICsicHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lO1xuIgotCQkJCQkgICAgIAkgKyJwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpIHtcbiIKLQkJCQkJICAgICAJICsgIglyZXR1cm4gZmlyc3ROYW1lO1xuIgotCQkJCQkgICAgIAkgKyAifVxuIgotCQkJCQkgICAgIAkgKyAicHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpIHtcbiIKLQkJCQkJICAgICAJICsJInRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lO1xuIgotCQkJCQkgICAgIAkgKyAifVxuIgotCQkJCQkgICAgICAgICArICJ9IjsgLy8kTk9OLU5MUy0xJAotCQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLndyaXRlKGNvbnRlbnQuZ2V0Qnl0ZXMoKSk7Ci0JCQkJCXN0cmVhbS5mbHVzaCgpOwotCQkJCQlmaWxlLmNyZWF0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc3RyZWFtLnRvQnl0ZUFycmF5KCkpLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCQl9CQotCQkJfQotCQkJcmV0dXJuIGZpbGU7Ci0JCQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURpcmVjdG9yaWVzKElDb250YWluZXIgY29udGFpbmVyLCBib29sZWFuIGZvcmNlLAotCQkJYm9vbGVhbiBsb2NhbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCAmJiBjb250YWluZXIgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKSBjb250YWluZXI7Ci0JCQlpZiAoIWZvbGRlci5leGlzdHMoKSkgewotCQkJCS8vIGRlcHRoIGZpcnN0Ci0JCQkJSUNvbnRhaW5lciBwYXJlbnQgPSBmb2xkZXIuZ2V0UGFyZW50KCk7Ci0JCQkJY3JlYXRlRGlyZWN0b3JpZXMocGFyZW50LCBmb3JjZSwgbG9jYWwsIG51bGwpOwotCQkJCS8vIG93biBzZWNvbmQKLQkJCQlmb2xkZXIuY3JlYXRlKGZvcmNlLCBsb2NhbCwgbW9uaXRvcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShJRmlsZSBlbnRpdHksIFN0cmluZyBhdHRyaWJ1dGVOYW1lKXsKLQkJU2V0PFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gcmVzdWx0ID0gZ2V0RW50aXR5RmllbGRzKGVudGl0eSk7Ci0JCWZvcihSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlIDogcmVzdWx0KXsKLQkJCWlmKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKGF0dHJpYnV0ZS5nZXROYW1lKCkpKXsKLQkJCQlyZXR1cm4gYXR0cmlidXRlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKElGaWxlIGZpbGUpewotCQlKcGFGaWxlIGpwYUZpbGUgPSBnZXRKcGFGaWxlKGZpbGUpOwotCQlmb3IgKEpwYVN0cnVjdHVyZU5vZGUgbm9kZSA6IGdldFJvb3ROb2RlcyhqcGFGaWxlKSkgewotCQkJUGVyc2lzdGVudFR5cGUgZW50aXR5ID0gKFBlcnNpc3RlbnRUeXBlKSBub2RlOwotCQkJcmV0dXJuIGVudGl0eTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJdGVyYWJsZTxKcGFTdHJ1Y3R1cmVOb2RlPiBnZXRSb290Tm9kZXMoSnBhRmlsZSBqcGFGaWxlKSB7Ci0JCWlmKGpwYUZpbGUgPT0gbnVsbCl7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBqcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFNldDxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldEVudGl0eUZpZWxkcyhJRmlsZSBmaWxlKXsKLQkJU2V0PFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPigpOwotCQlKcGFGaWxlIGpwYUZpbGUgPSBnZXRKcGFGaWxlKGZpbGUpOwotCQlpZihqcGFGaWxlID09IG51bGwpewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlmb3IgKEpwYVN0cnVjdHVyZU5vZGUgbm9kZSA6IGdldFJvb3ROb2RlcyhqcGFGaWxlKSkgewotCQkJUGVyc2lzdGVudFR5cGUgZW50aXR5ID0gKFBlcnNpc3RlbnRUeXBlKSBub2RlOwotCQkJZm9yIChSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlIDogZW50aXR5LmdldEFsbEF0dHJpYnV0ZXMoKSkgewotCQkJCXJlc3VsdC5hZGQoYXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIEpwYUZpbGUgZ2V0SnBhRmlsZShJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiAoSnBhRmlsZSkgZmlsZS5nZXRBZGFwdGVyKEpwYUZpbGUuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGVzKElGaWxlIGVudGl0eSwgU3RyaW5nIGF0dE5hbWUsIFN0cmluZyBhdHRUeXBlLCBTdHJpbmcgYW5ub3RhdGlvbiwgU3RyaW5nIGF0dEFjdE5hbWUsIGJvb2xlYW4gaXNDb2xsZWN0aW9uKXsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IChKYXZhUGVyc2lzdGVudFR5cGUpZ2V0UGVyc2lzdGVudFR5cGUoZW50aXR5KTsKLQkJaW50IGNudCA9IDA7Ci0JCXdoaWxlICgoamF2YVBlcnNpc3RlbnRUeXBlID09IG51bGwpICYmIChjbnQgPCAxMDApKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgyNTApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkge30KLQkJCWphdmFQZXJzaXN0ZW50VHlwZSA9IChKYXZhUGVyc2lzdGVudFR5cGUpZ2V0UGVyc2lzdGVudFR5cGUoZW50aXR5KTsKLQkJCWNudCsrOwotCQl9Ci0JCWlmIChqYXZhUGVyc2lzdGVudFR5cGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgZW50aXR5IGNvdWxkIG5vdCBiZSBjcmVhdGVkIik7Ci0JCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShlbnRpdHkpOwotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGROZXdBdHRyaWJ1dGUoamF2YVBlcnNpc3RlbnRUeXBlLCBjb21waWxhdGlvblVuaXQsIGF0dE5hbWUsIGF0dFR5cGUsIGFubm90YXRpb24sIGF0dEFjdE5hbWUsIGlzQ29sbGVjdGlvbiwgbnVsbCk7Ci0JfQotCQotCXByaXZhdGUgSUZpbGUgY3JlYXRlRmllbGRBbm5vdGF0ZWRFbnRpdHkoSUZvbGRlciBmb2xkZXIsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGVudGl0eU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBlbnRpdHlTaG9ydE5hbWUgPSBlbnRpdHlOYW1lLnN1YnN0cmluZyhlbnRpdHlOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCWNyZWF0ZURpcmVjdG9yaWVzKGZvbGRlciwgdHJ1ZSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKGVudGl0eVNob3J0TmFtZSArICIuamF2YSIpOwkJCi0JCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJU3RyaW5nIGNvbnRlbnQgPSAicGFja2FnZSAiICsgcGFja2FnZU5hbWUgKyAiO1xuXG4iIAotCQkJCQkrICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjtcblxuIiAKLQkJCQkJKyAiQEVudGl0eSBcbiIKLQkJCQkJKyAicHVibGljIGNsYXNzICIgKyBlbnRpdHlTaG9ydE5hbWUgKyAiIHtcbiIKLQkJCQkJKyAiCUBJZCBcbiIJCQkJCQotCQkJCQkrICIJcHJpdmF0ZSBpbnQgaWQ7XG4iCi0JCQkJCSsgIglwdWJsaWMgaW50IGdldElkKCkge1xuIiAKLQkJCQkJKyAiCQlyZXR1cm4gaWQ7XG4iCi0JCQkJCSsgIgl9XG4iCi0JCQkJCSsgIglwdWJsaWMgdm9pZCBzZXRJZChpbnQgaWQpIHtcbiIKLQkJCQkJKyAiCQl0aGlzLmlkID0gaWQ7XG4iIAotCQkJCQkrICIJfVxuIgotCQkJCQkrICJ9IjsgLy8kTk9OLU5MUy0xJAotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCXRyeSB7Ci0JCQkJc3RyZWFtLndyaXRlKGNvbnRlbnQuZ2V0Qnl0ZXMoKSk7Ci0JCQkJc3RyZWFtLmZsdXNoKCk7Ci0JCQkJZmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHN0cmVhbS50b0J5dGVBcnJheSgpKSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfQkKLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9CQotCi0JcHVibGljIElGaWxlIGNyZWF0ZUZpZWxkQW5ub3RhdGVkRW50aXR5SW5Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIHBhY2thZ2VGcmFnbWVudHMsIFN0cmluZyBlbnRpdHlOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmb2xkZXJOYW1lID0gZ2V0Rm9sZGVyTmFtZShwcm9qZWN0LCBwYWNrYWdlRnJhZ21lbnRzKTsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gcGFja2FnZUZyYWdtZW50c1swXTsJCQotCQlmb3IgKGludCBpID0gMTsgaSA8IHBhY2thZ2VGcmFnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXBhY2thZ2VOYW1lICs9ICIuIiArIHBhY2thZ2VGcmFnbWVudHNbaV07Ci0JCX0KLQkJCi0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChmb2xkZXJOYW1lKTsKLQkJSUZvbGRlciBmb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihwYXRoKTsJCSAKLQkJcmV0dXJuIGNyZWF0ZUZpZWxkQW5ub3RhdGVkRW50aXR5KGZvbGRlciwgcGFja2FnZU5hbWUgLCBlbnRpdHlOYW1lKTsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL0pQQUVkaXRvclRlc3RzQWN0aXZhdG9yLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL0pQQUVkaXRvclRlc3RzQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NzFlZTAuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9KUEFFZGl0b3JUZXN0c0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEpQQUVkaXRvclRlc3RzQWN0aXZhdG9yIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBKUEFFZGl0b3JUZXN0c0FjdGl2YXRvcigpIHsKLQl9Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgSlBBRWRpdG9yVGVzdHNBY3RpdmF0b3IgcGx1Z2luOwotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCQlKcGFQcm9qZWN0TWFuYWdlciBqcGFQcm9qZWN0TWFuYWdlciA9IHRoaXMuZ2V0SnBhUHJvamVjdE1hbmFnZXIoKTsKLQkJUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QoanBhUHJvamVjdE1hbmFnZXIsICJleGVjdXRlQ29tbWFuZHNTeW5jaHJvbm91c2x5Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhUHJvamVjdE1hbmFnZXIgZ2V0SnBhUHJvamVjdE1hbmFnZXIoKSB7Ci0JCXJldHVybiAoSnBhUHJvamVjdE1hbmFnZXIpIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRBZGFwdGVyKEpwYVByb2plY3RNYW5hZ2VyLmNsYXNzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpQQUVkaXRvclRlc3RzQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JCi0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2VkaXRvci9DcmVhdGVEaWFncmFtVGVzdC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9lZGl0b3IvQ3JlYXRlRGlhZ3JhbVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc2N2FjMS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2VkaXRvci9DcmVhdGVEaWFncmFtVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2JDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLkNyZWF0ZURpYWdyYW1Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuSlBBQ3JlYXRlRmFjdG9yeTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIENyZWF0ZURpYWdyYW1UZXN0IHsKLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVEaWFncmFtV2hlblBlcnNpc3RlbmNlVW5pdEhhc0RpZmZlcmVudE5hbWVGcm9tVGhlUHJvamVjdCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CQkKLQkJSlBBQ3JlYXRlRmFjdG9yeSBmYWN0b3J5ID0gSlBBQ3JlYXRlRmFjdG9yeS5pbnN0YW5jZSgpOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBmYWN0b3J5LmNyZWF0ZUpQQVByb2plY3QoIkpQQV8iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwotCQlTdHJpbmcgcGVyc2lzdGVuY2VVbml0TmFtZSA9IGpwYVByb2plY3QuZ2V0TmFtZSgpICsgIl91bml0IjsKLQkJUGVyc2lzdGVuY2VVbml0IHB1ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0UGVyc2lzdGVuY2VVbml0KGpwYVByb2plY3QpOyAKLQkJcHUuc2V0TmFtZShwZXJzaXN0ZW5jZVVuaXROYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNpc3RlbmNlVW5pdE5hbWUsIHB1LmdldE5hbWUoKSk7Ci0JCQotCQkKLQkJZmluYWwgQ3JlYXRlRGlhZ3JhbUpvYiBjcmVhdGVEaWFncmFtUnVubmFibGUgPSBuZXcgQ3JlYXRlRGlhZ3JhbUpvYihwdSwgMTAsIHRydWUpOwotCQljcmVhdGVEaWFncmFtUnVubmFibGUuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJZmluYWwgU2VtYXBob3JlIHMgPSBuZXcgU2VtYXBob3JlKDApOyAKLQkJY3JlYXRlRGlhZ3JhbVJ1bm5hYmxlLmFkZEpvYkNoYW5nZUxpc3RlbmVyKG5ldyBKb2JDaGFuZ2VBZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCXMucmVsZWFzZSgpOwotCQkJfQotCQl9KTsKLQkJY3JlYXRlRGlhZ3JhbVJ1bm5hYmxlLnNldFVzZXIodHJ1ZSk7Ci0JCWNyZWF0ZURpYWdyYW1SdW5uYWJsZS5zY2hlZHVsZSgpOwotCQlzLmFjcXVpcmUoKTsKLQkJRGlhZ3JhbSBkID0gY3JlYXRlRGlhZ3JhbVJ1bm5hYmxlLmdldERpYWdyYW0oKTsKLQkJYXNzZXJ0RXF1YWxzKGpwYVByb2plY3QuZ2V0TmFtZSgpLCBkLmdldE5hbWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2VkaXRvci9FZGl0b3JUZXN0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2VkaXRvci9FZGl0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NDg0YTIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9lZGl0b3IvRWRpdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmlzQTsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlcGxheTsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnZlcmlmeTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5zZWxlY3Rpb24uSnBhU2VsZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVMaXN0ZW5lcjsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBFZGl0b3JUZXN0IHsKLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEpQQURpYWdyYW1FZGl0b3JDcmVhdGlvbigpIHsKLQkJSlBBRGlhZ3JhbUVkaXRvciBlZCA9IG5ldyBKUEFEaWFncmFtRWRpdG9yKCk7Ci0JCWFzc2VydE5vdE51bGwoZWQpOwotCX0KLQkKLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RKUEFEaWFncmFtRWRpdG9yUGx1Z2luKCkgewotCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luIHBsdWdpbiA9IG5ldyBKUEFEaWFncmFtRWRpdG9yUGx1Z2luKCk7Ci0JCUJ1bmRsZUNvbnRleHQgYmMgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEJ1bmRsZUNvbnRleHQuY2xhc3MpOwotCQlCdW5kbGUgYnVuZGxlID0gRWFzeU1vY2suY3JlYXRlTW9jayhCdW5kbGUuY2xhc3MpOwotCQlFYXN5TW9jay5leHBlY3QoYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKS5hbmRTdHViUmV0dXJuKCIiKTsKLQkJRWFzeU1vY2suZXhwZWN0KGJjLmdldEJ1bmRsZSgpKS5hbmRTdHViUmV0dXJuKGJ1bmRsZSk7Ci0JCWJjLmFkZEJ1bmRsZUxpc3RlbmVyKEVhc3lNb2NrLmlzQShCdW5kbGVMaXN0ZW5lci5jbGFzcykpOwotCQliYy5yZW1vdmVCdW5kbGVMaXN0ZW5lcihFYXN5TW9jay5pc0EoQnVuZGxlTGlzdGVuZXIuY2xhc3MpKTsKLQkJRWFzeU1vY2sucmVwbGF5KGJjLCBidW5kbGUpOwotCQl0cnkgewotCQkJcGx1Z2luLnN0YXJ0KGJjKTsKLQkJCXBsdWdpbi5zdG9wKGJjKTsJCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJRWFzeU1vY2sudmVyaWZ5KGJjKTsKLQl9CQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCWZpbmFsIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgcHJvdmlkZXIgPSBFYXN5TW9jawotCQkJCS5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCi0JCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSByZXBsYXlQYXJ0KCk7Ci0KLQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soUGljdG9ncmFtRWxlbWVudC5jbGFzcyk7Ci0JCXJlcGxheShwZSk7Ci0JCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhFZGl0UGFydC5jbGFzcyk7Ci0JCWV4cGVjdChlZGl0UGFydC5nZXRNb2RlbCgpKS5hbmRSZXR1cm4ocGUpOwotCQlyZXBsYXkoZWRpdFBhcnQpOwotCi0JCUpwYVN0cnVjdHVyZU5vZGUganBhTm9kZVRvQmVTZWxlY3RlZCA9IEVhc3lNb2NrCi0JCQkJLmNyZWF0ZU1vY2soSnBhU3RydWN0dXJlTm9kZS5jbGFzcyk7Ci0JCWV4cGVjdChwcm92aWRlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpKS5hbmRSZXR1cm4oCi0JCQkJanBhTm9kZVRvQmVTZWxlY3RlZCk7Ci0JCXJlcGxheShwcm92aWRlcik7Ci0KLQkJLy8gdGVzdAotCQlKcGFTZWxlY3Rpb25NYW5hZ2VyIG1hbmFnZXIgPSBFYXN5TW9jawotCQkJCS5jcmVhdGVNb2NrKEpwYVNlbGVjdGlvbk1hbmFnZXIuY2xhc3MpOwotCQltYW5hZ2VyLnNldFNlbGVjdGlvbihpc0EoSnBhU3RydWN0dXJlTm9kZS5jbGFzcykpOwotCQlyZXBsYXkobWFuYWdlcik7Ci0KLQkJSlBBRGlhZ3JhbUVkaXRvci5JU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkgZmFjdG9yeSA9IEVhc3lNb2NrCi0JCQkJLmNyZWF0ZU1vY2soSlBBRGlhZ3JhbUVkaXRvci5JU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkuY2xhc3MpOwotCQlleHBlY3QoZmFjdG9yeS5nZXRTZWxlY3Rpb25NYW5hZ2VyKGlzQShJV29ya2JlbmNoV2luZG93LmNsYXNzKSkpCi0JCQkJLmFuZFJldHVybihtYW5hZ2VyKTsKLQkJcmVwbGF5KGZhY3RvcnkpOwotCQlKUEFEaWFncmFtRWRpdG9yIGVkaXRvciA9IGNyZWF0ZUVkaXRvcihwcm92aWRlciwgZmFjdG9yeSk7Ci0JCS8vIHRlc3QKLQkJZWRpdG9yLnNlbGVjdGlvbkNoYW5nZWQocGFydCwgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdFBhcnQpKTsKLQkJdmVyaWZ5KG1hbmFnZXIpOwotCX0KLQotCXByaXZhdGUgSlBBRGlhZ3JhbUVkaXRvciBjcmVhdGVFZGl0b3IoZmluYWwgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBwcm92aWRlciwKLQkJCUpQQURpYWdyYW1FZGl0b3IuSVNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSVdvcmtiZW5jaFBhZ2UuY2xhc3MpOwotCQlleHBlY3QocGFnZS5pc1BhcnRWaXNpYmxlKGlzQShJV29ya2JlbmNoUGFydC5jbGFzcykpKQotCQkJCS5hbmRSZXR1cm4oZmFsc2UpOwotCQlleHBlY3QocGFnZS5nZXRBY3RpdmVFZGl0b3IoKSkuYW5kU3R1YlJldHVybihudWxsKTsKLQkJcmVwbGF5KHBhZ2UpOwotCQlmaW5hbCBJV29ya2JlbmNoUGFydFNpdGUgc2l0ZSA9IEVhc3lNb2NrCi0JCQkJLmNyZWF0ZU1vY2soSVdvcmtiZW5jaFBhcnRTaXRlLmNsYXNzKTsKLQkJZXhwZWN0KHNpdGUuZ2V0UGFnZSgpKS5hbmRTdHViUmV0dXJuKHBhZ2UpOwotCQlyZXBsYXkoc2l0ZSk7Ci0KLQkJSlBBRGlhZ3JhbUVkaXRvciBlZGl0b3IgPSBuZXcgSlBBRGlhZ3JhbUVkaXRvcihmYWN0b3J5KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJV29ya2JlbmNoUGFydFNpdGUgZ2V0U2l0ZSgpIHsKLQkJCQlyZXR1cm4gc2l0ZTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGVkaXRvcjsKLQl9Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IHJlcGxheVBhcnQoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJV29ya2JlbmNoV2luZG93LmNsYXNzKTsKLQkJcmVwbGF5KHdpbmRvdyk7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElXb3JrYmVuY2hQYWdlLmNsYXNzKTsKLQkJSVdvcmtiZW5jaFBhcnRTaXRlIHNpdGUgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElXb3JrYmVuY2hQYXJ0U2l0ZS5jbGFzcyk7Ci0JCWV4cGVjdChzaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpKS5hbmRSZXR1cm4od2luZG93KTsKLQkJZXhwZWN0KHNpdGUuZ2V0UGFnZSgpKS5hbmRTdHViUmV0dXJuKHBhZ2UpOwotCQlyZXBsYXkoc2l0ZSk7Ci0JCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElXb3JrYmVuY2hQYXJ0LmNsYXNzKTsKLQkJZXhwZWN0KHBhcnQuZ2V0U2l0ZSgpKS5hbmRTdHViUmV0dXJuKHNpdGUpOwotCQlleHBlY3QocGFnZS5pc1BhcnRWaXNpYmxlKGlzQShJV29ya2JlbmNoUGFydC5jbGFzcykpKQotCQkJCS5hbmRSZXR1cm4oZmFsc2UpOwotCQlleHBlY3QocGFnZS5nZXRBY3RpdmVFZGl0b3IoKSkuYW5kUmV0dXJuKG51bGwpOwotCQlyZXBsYXkocGFnZSk7Ci0JCXJlcGxheShwYXJ0KTsKLQkJcmV0dXJuIHBhcnQ7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQ2hhbmdlZFRleHRTZWxlY3Rpb24oKSB7Ci0JCUpQQURpYWdyYW1FZGl0b3IgZWRpdG9yID0gY3JlYXRlRWRpdG9yKG51bGwsIG51bGwpOwotCQllZGl0b3Iuc2VsZWN0aW9uQ2hhbmdlZChudWxsLCBuZXcgSVNlbGVjdGlvbigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25DaGFuZ2VkTm90RWRpdFBhcnQoKSB7Ci0JCUpQQURpYWdyYW1FZGl0b3IgZWRpdG9yID0gY3JlYXRlRWRpdG9yKG51bGwsIG51bGwpOwotCQllZGl0b3Iuc2VsZWN0aW9uQ2hhbmdlZChudWxsLCBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0KCkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9BZGRBdHRyaWJ1dGVGZWF0dXJlVGVzdC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9mZWF0dXJlL0FkZEF0dHJpYnV0ZUZlYXR1cmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OTU4YjcuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9mZWF0dXJlL0FkZEF0dHJpYnV0ZUZlYXR1cmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVwbGF5OwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5lYXN5bW9jay5JQXJndW1lbnRNYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JQWRkRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRGlyZWN0RWRpdGluZ0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQWRkQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5BZGRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5JQ3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkdyYXBoaWNzQWxnb3JpdGhtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQWRkQXR0cmlidXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBBZGRBdHRyaWJ1dGVGZWF0dXJlVGVzdCB7Ci0KLQlwcml2YXRlIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyOwotCi0JcHJpdmF0ZSBBZGRDb250ZXh0IGNvbnRleHQ7Ci0KLQlwcml2YXRlIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYTsKLQotCXByaXZhdGUgQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGU7Ci0KLQlwcml2YXRlIElDdXN0b21GZWF0dXJlIGV4cGFuZEZlYXR1cmU7Ci0KLQlwcml2YXRlIElBZGRGZWF0dXJlIGdyYXBoaWNhbEFkZDsKLQotCS8qKgotCSAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlqcGEgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmNsYXNzKTsKLQkJY29udGV4dCA9IG5ldyBBZGRDb250ZXh0KCk7Ci0JCWNvbnRleHQuc2V0TmV3T2JqZWN0KGpwYSk7Ci0JCWNvbnRleHQuc2V0VGFyZ2V0Q29udGFpbmVyKGVudGl0eVNoYXBlKTsKLQkJZ3JhcGhpY2FsQWRkID0gRWFzeU1vY2suY3JlYXRlTW9jayhJQWRkRmVhdHVyZS5jbGFzcyk7Ci0JCWV4cGFuZEZlYXR1cmUgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElDdXN0b21GZWF0dXJlLmNsYXNzKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RBZGROb3RKUEEoKSB7Ci0JCWNvbnRleHQuc2V0TmV3T2JqZWN0KG5ldyBPYmplY3QoKSk7Ci0JCWFzc2VydE51bGwoY2FsbEFkZCgpKTsKLQl9Ci0JCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIHZvaWQgY29uZmdpcnVlQXR0cmlidXRlU2hhcGUoQ29udGFpbmVyU2hhcGUgYXR0cmlidXRlQ29udGFpbmVyKSB7Ci0JCUNvbnRhaW5lclNoYXBlIGF0dHJpYnV0ZVNoYXBlID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb250YWluZXJTaGFwZS5jbGFzcyk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwYSkpLmFuZFJldHVybihhdHRyaWJ1dGVTaGFwZSk7Ci0JCWV4cGVjdChhdHRyaWJ1dGVTaGFwZS5nZXRDb250YWluZXIoKSkuYW5kUmV0dXJuKGF0dHJpYnV0ZUNvbnRhaW5lcik7Ci0JCXJlcGxheShhdHRyaWJ1dGVTaGFwZSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoeyAidW5jaGVja2VkIiwgInVudXNlZCIgfSkKLQlwcml2YXRlIENvbnRhaW5lclNoYXBlIHJlcGxheVRleHRTaGFwZShUZXh0IHRleHQpIHsKLQkJRUxpc3Q8R3JhcGhpY3NBbGdvcml0aG0+IGNoaWxkcmVuID0gRWFzeU1vY2suY3JlYXRlTW9jayhFTGlzdC5jbGFzcyk7Ci0JCWNoaWxkcmVuLmFkZCh0ZXh0KTsKLQkJR3JhcGhpY3NBbGdvcml0aG0gZ2EgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEdyYXBoaWNzQWxnb3JpdGhtLmNsYXNzKTsKLQkJZXhwZWN0KGdhLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKSkuYW5kUmV0dXJuKGNoaWxkcmVuKTsKLQkJcmVwbGF5KGdhKTsKLQkJQ29udGFpbmVyU2hhcGUgdGV4dFNoYXBlID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb250YWluZXJTaGFwZS5jbGFzcyk7Ci0JCWV4cGVjdCh0ZXh0U2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSkuYW5kUmV0dXJuKGdhKTsKLQkJcmVwbGF5KHRleHRTaGFwZSk7Ci0JCXJldHVybiB0ZXh0U2hhcGU7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJpdmF0ZSBJRGlyZWN0RWRpdGluZ0luZm8gY29uZmlndXJlRGlyZWN0RWRpdGluZyhUZXh0IHRleHQsIENvbnRhaW5lclNoYXBlIHRleHRTaGFwZSkgewotCQlJRGlyZWN0RWRpdGluZ0luZm8gaW5mbyA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSURpcmVjdEVkaXRpbmdJbmZvLmNsYXNzKTsKLQkJaW5mby5zZXRHcmFwaGljc0FsZ29yaXRobSh0ZXh0KTsKLQkJaW5mby5zZXRNYWluUGljdG9ncmFtRWxlbWVudCh0ZXh0U2hhcGUpOwotCQlpbmZvLnNldFBpY3RvZ3JhbUVsZW1lbnQodGV4dFNoYXBlKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXREaXJlY3RFZGl0aW5nSW5mbygpKS5hbmRSZXR1cm4oaW5mbyk7Ci0JCXJlcGxheShpbmZvKTsKLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJpdmF0ZSBJQ3VzdG9tQ29udGV4dCBjcmVhdGVDdXN0b21Db250ZXh0TWF0Y2hlcihmaW5hbCBQaWN0b2dyYW1FbGVtZW50W10gZWxlbWVudHMpIHsKLQkJRWFzeU1vY2sucmVwb3J0TWF0Y2hlcihuZXcgSUFyZ3VtZW50TWF0Y2hlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFRvKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhPYmplY3QgYXJndW1lbnQpIHsKLQkJCQlpZiAoIUlDdXN0b21Db250ZXh0LmNsYXNzLmlzSW5zdGFuY2UoYXJndW1lbnQpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJSUN1c3RvbUNvbnRleHQgY29udGV4dCA9IChJQ3VzdG9tQ29udGV4dCkgYXJndW1lbnQ7Ci0JCQkJcmV0dXJuIEFycmF5cy5lcXVhbHMoY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50cygpLCBlbGVtZW50cyk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIElBZGRDb250ZXh0IGNvbnRleHRNYXRjaGVyKCkgewotCQlFYXN5TW9jay5yZXBvcnRNYXRjaGVyKG5ldyBJQXJndW1lbnRNYXRjaGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUbyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoT2JqZWN0IGFyZ3VtZW50KSB7Ci0JCQkJaWYgKCFJQWRkQ29udGV4dC5jbGFzcy5pc0luc3RhbmNlKGFyZ3VtZW50KSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUlBZGRDb250ZXh0IGNvbnRleHQgPSAoSUFkZENvbnRleHQpIGFyZ3VtZW50OwotCQkJCS8vIGNvbXBhcmUgYnkgcmVmZXJlbmNlCi0JCQkJaWYgKGpwYSAhPSBjb250ZXh0LmdldE5ld09iamVjdCgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKGVudGl0eVNoYXBlICE9IGNvbnRleHQuZ2V0VGFyZ2V0Q29udGFpbmVyKCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQkJfQotCi0JCX0pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFBpY3RvZ3JhbUVsZW1lbnQgY2FsbEFkZCgpIHsKLQkJSUFkZEZlYXR1cmUgZml4dHVyZSA9IGNyZWF0ZUZlYXR1cmUoKTsKLQkJcmV0dXJuIGZpeHR1cmUuYWRkKGNvbnRleHQpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJYXNzZXJ0U2FtZShmZWF0dXJlUHJvdmlkZXIsIGNyZWF0ZUZlYXR1cmUoKS5nZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuQWRkT2JqZWN0KCkgewotCQljb250ZXh0LnNldE5ld09iamVjdChuZXcgT2JqZWN0KCkpOwotCQkvLyB0ZXN0Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FsbENhbkFkZCgpKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDYW5BZGRKcHQoKSB7Ci0JCS8vIHRlc3QKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhbGxDYW5BZGQoKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhbGxDYW5BZGQoKSB7Ci0JCUlBZGRGZWF0dXJlIGZpeHR1cmUgPSBjcmVhdGVGZWF0dXJlKCk7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZml4dHVyZS5jYW5BZGQoY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJQWRkRmVhdHVyZSBjcmVhdGVGZWF0dXJlKCkgewotCQlyZXBsYXkoZmVhdHVyZVByb3ZpZGVyKTsKLQkJcmVwbGF5KGdyYXBoaWNhbEFkZCk7Ci0JCXJlcGxheShleHBhbmRGZWF0dXJlKTsKLQkJcmV0dXJuIG5ldyBBZGRBdHRyaWJ1dGVGZWF0dXJlKGZlYXR1cmVQcm92aWRlciwgZ3JhcGhpY2FsQWRkLCBleHBhbmRGZWF0dXJlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9BZGRKUEFFbnRpdHlGZWF0dXJlVGVzdC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9mZWF0dXJlL0FkZEpQQUVudGl0eUZlYXR1cmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ODZiYTIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9mZWF0dXJlL0FkZEpQQUVudGl0eUZlYXR1cmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlcGxheTsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNJbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmR0LklEaWFncmFtVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuR3JhcGhpY3NBbGdvcml0aG07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5zdHlsZXMuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5zdHlsZXMuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5PcmllbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbXNQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5VcGRhdGVBdHRyaWJ1dGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIEFkZEpQQUVudGl0eUZlYXR1cmVUZXN0IHsKLQkKLQlwcml2YXRlIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyOwotCQotCQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUaHJlYWQuc2xlZXAoMjAwMCk7Ci0JCWZlYXR1cmVQcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlci5jbGFzcyk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QXR0cmlic051bSgoU2hhcGUpIEVhc3lNb2NrLmFueU9iamVjdCgpKSkuYW5kU3R1YlJldHVybigwKTsKLQkJSURpYWdyYW1UeXBlUHJvdmlkZXIgaWRwID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRGlhZ3JhbVR5cGVQcm92aWRlci5jbGFzcyk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpKS5hbmRTdHViUmV0dXJuKGlkcCk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuaW5jcmVhc2VBdHRyaWJzTnVtKChTaGFwZSkgRWFzeU1vY2suYW55T2JqZWN0KCkpKS5hbmRTdHViUmV0dXJuKDEpOwotCQlEaWFncmFtIGQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKERpYWdyYW0uY2xhc3MpOwotCQlleHBlY3QoaWRwLmdldERpYWdyYW0oKSkuYW5kU3R1YlJldHVybihkKTsKLQkJQ29sb3IgYyA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29sb3IuY2xhc3MpOwotCQlleHBlY3QoYy5nZXRCbHVlKCkpLmFuZFN0dWJSZXR1cm4oMCk7Ci0JCWV4cGVjdChjLmdldFJlZCgpKS5hbmRTdHViUmV0dXJuKDApOwotCQlleHBlY3QoYy5nZXRHcmVlbigpKS5hbmRTdHViUmV0dXJuKDApOwotCQlFTGlzdDxDb2xvcj4gY29sID0gbmV3IEJhc2ljSW50ZXJuYWxFTGlzdDxDb2xvcj4oQ29sb3IuY2xhc3MpOwotCQlleHBlY3QoZC5nZXRDb2xvcnMoKSkuYW5kU3R1YlJldHVybihjb2wpOwotCQlDb2xvciBjMSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29sb3IuY2xhc3MpOwotCQljMS5zZXRSZWQoRWFzeU1vY2suYW55SW50KCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQljMS5zZXRHcmVlbihFYXN5TW9jay5hbnlJbnQoKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCWMxLnNldEJsdWUoRWFzeU1vY2suYW55SW50KCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlFTGlzdDxGb250PiBmb250cyA9IG5ldyBCYXNpY0ludGVybmFsRUxpc3Q8Rm9udD4oRm9udC5jbGFzcyk7Ci0JCWV4cGVjdChkLmdldEZvbnRzKCkpLmFuZFN0dWJSZXR1cm4oZm9udHMpOwotCQlyZXBsYXkoZCwgYywgYzEsIGlkcCwgZmVhdHVyZVByb3ZpZGVyKTsKLQl9Ci0JCi0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RBZGRUZXh0KCkgewotCQlGb250IGYgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEZvbnQuY2xhc3MpOyAKLQkJVGV4dCB0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhUZXh0LmNsYXNzKTsKLQkJdC5zZXRGb250KGYpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlleHBlY3QodC5nZXRYKCkpLmFuZFN0dWJSZXR1cm4oMCk7Ci0JCWV4cGVjdCh0LmdldFkoKSkuYW5kU3R1YlJldHVybigwKTsKLQkJCi0JCWYuc2V0TmFtZSgiQXJpYWwiKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJZi5zZXRTaXplKEVhc3lNb2NrLmFueUludCgpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsJCQotCQlmLnNldEl0YWxpYyhFYXN5TW9jay5hbnlCb29sZWFuKCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwkKLQkJZi5zZXRCb2xkKEVhc3lNb2NrLmFueUJvb2xlYW4oKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCXQuc2V0V2lkdGgoRWFzeU1vY2suYW55SW50KCkpOwkKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJdC5zZXRIZWlnaHQoRWFzeU1vY2suYW55SW50KCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQl0LnNldFZhbHVlKCJhYmMiKTsJCi0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCQotCQl0LnNldEZvcmVncm91bmQoKENvbG9yKSBFYXN5TW9jay5hbnlPYmplY3QoKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCXQuc2V0SG9yaXpvbnRhbEFsaWdubWVudChPcmllbnRhdGlvbi5BTElHTk1FTlRfTEVGVCk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCXQuc2V0VmVydGljYWxBbGlnbm1lbnQoT3JpZW50YXRpb24uQUxJR05NRU5UX1RPUCk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCQotCQlGb250IGYxID0gRWFzeU1vY2suY3JlYXRlTW9jayhGb250LmNsYXNzKTsKLQkJZjEuc2V0Qm9sZCh0cnVlKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJZXhwZWN0KHQuZ2V0Rm9udCgpKS5hbmRTdHViUmV0dXJuKGYxKTsKLQkJCi0JCVJlY3RhbmdsZSB0ZXh0UmVjdGFuZ2xlID0gRWFzeU1vY2suY3JlYXRlTW9jayhSZWN0YW5nbGUuY2xhc3MpOwotCQlFTGlzdDxHcmFwaGljc0FsZ29yaXRobT4gbHN0ID0gbmV3IEJhc2ljSW50ZXJuYWxFTGlzdDxHcmFwaGljc0FsZ29yaXRobT4oR3JhcGhpY3NBbGdvcml0aG0uY2xhc3MpOwotCQlleHBlY3QodGV4dFJlY3RhbmdsZS5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCkpLmFuZFN0dWJSZXR1cm4obHN0KTsKLQkJCi0JCXJlcGxheShmMSwgZiwgdCwgdGV4dFJlY3RhbmdsZSk7Ci0JCVVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUuYWRkVGV4dChmZWF0dXJlUHJvdmlkZXIsIHRleHRSZWN0YW5nbGUsICJhYmMiKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0YWRkUmVjdGFuZ2xlRm9ySWNvbigpIHsKLQkJQ29udGFpbmVyU2hhcGUgY3MgPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbnRhaW5lclNoYXBlLmNsYXNzKTsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBFYXN5TW9jay5jcmVhdGVNb2NrKFJlY3RhbmdsZS5jbGFzcyk7Ci0JCWV4cGVjdChyZWN0LmdldFgoKSkuYW5kU3R1YlJldHVybigwKTsKLQkJZXhwZWN0KHJlY3QuZ2V0WSgpKS5hbmRTdHViUmV0dXJuKDApOwotCQlyZWN0LnNldFdpZHRoKEVhc3lNb2NrLmFueUludCgpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJcmVjdC5zZXRIZWlnaHQoRWFzeU1vY2suYW55SW50KCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQljcy5zZXRHcmFwaGljc0FsZ29yaXRobShyZWN0KTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJcmVjdC5zZXRGaWxsZWQoRWFzeU1vY2suYW55Qm9vbGVhbigpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJcmVjdC5zZXRMaW5lVmlzaWJsZShFYXN5TW9jay5hbnlCb29sZWFuKCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlyZWN0LnNldFgoRWFzeU1vY2suYW55SW50KCkpOwotCQlyZWN0LnNldExpbmVWaXNpYmxlKEVhc3lNb2NrLmFueUJvb2xlYW4oKSk7Ci0JCXJlY3Quc2V0WShFYXN5TW9jay5hbnlJbnQoKSk7Ci0JCXJlY3Quc2V0TGluZVZpc2libGUoRWFzeU1vY2suYW55Qm9vbGVhbigpKTsKLQkJcmVjdC5zZXRXaWR0aChFYXN5TW9jay5hbnlJbnQoKSk7Ci0JCXJlY3Quc2V0TGluZVZpc2libGUoRWFzeU1vY2suYW55Qm9vbGVhbigpKTsKLQkJY3Muc2V0R3JhcGhpY3NBbGdvcml0aG0oRWFzeU1vY2suaXNBKFJlY3RhbmdsZS5jbGFzcykpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlyZXBsYXkocmVjdCwgY3MpOwkJCi0JCVVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUuYWRkUmVjdGFuZ2xlRm9ySWNvbihjcywgMCk7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZFJlY3RhbmdsZUZvclRleHQoKSB7Ci0JCUNvbnRhaW5lclNoYXBlIGNzID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb250YWluZXJTaGFwZS5jbGFzcyk7Ci0JCVJlY3RhbmdsZSByZWN0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhSZWN0YW5nbGUuY2xhc3MpOwotCQlleHBlY3QocmVjdC5nZXRYKCkpLmFuZFN0dWJSZXR1cm4oMCk7Ci0JCWV4cGVjdChyZWN0LmdldFkoKSkuYW5kU3R1YlJldHVybigwKTsKLQkJcmVjdC5zZXRXaWR0aChFYXN5TW9jay5hbnlJbnQoKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCXJlY3Quc2V0SGVpZ2h0KEVhc3lNb2NrLmFueUludCgpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJY3Muc2V0R3JhcGhpY3NBbGdvcml0aG0ocmVjdCk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCXJlY3Quc2V0RmlsbGVkKEVhc3lNb2NrLmFueUJvb2xlYW4oKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCXJlY3Quc2V0TGluZVZpc2libGUoRWFzeU1vY2suYW55Qm9vbGVhbigpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJcmVjdC5zZXRYKEVhc3lNb2NrLmFueUludCgpKTsKLQkJcmVjdC5zZXRMaW5lVmlzaWJsZShFYXN5TW9jay5hbnlCb29sZWFuKCkpOwotCQlyZWN0LnNldFkoRWFzeU1vY2suYW55SW50KCkpOwotCQlyZWN0LnNldExpbmVWaXNpYmxlKEVhc3lNb2NrLmFueUJvb2xlYW4oKSk7Ci0JCXJlY3Quc2V0V2lkdGgoRWFzeU1vY2suYW55SW50KCkpOwotCQlyZWN0LnNldExpbmVWaXNpYmxlKEVhc3lNb2NrLmFueUJvb2xlYW4oKSk7Ci0JCWNzLnNldEdyYXBoaWNzQWxnb3JpdGhtKEVhc3lNb2NrLmlzQShSZWN0YW5nbGUuY2xhc3MpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJcmVwbGF5KHJlY3QsIGNzKTsJCQotCQlVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlLmFkZFJlY3RhbmdsZUZvclRleHQoY3MsIDAsIDEyMCk7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZEF0dHJpYnV0ZSgpIHsKLQkJR3JhcGhpY3NBbGdvcml0aG0gZ2EgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEdyYXBoaWNzQWxnb3JpdGhtLmNsYXNzKTsKLQkJZXhwZWN0KGdhLmdldFdpZHRoKCkpLmFuZFN0dWJSZXR1cm4oMjApOwotCQlDb250YWluZXJTaGFwZSBjcyA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29udGFpbmVyU2hhcGUuY2xhc3MpOwotCQlleHBlY3QoY3MuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSkuYW5kU3R1YlJldHVybihnYSk7Ci0JCVJlY3RhbmdsZSByZWN0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhSZWN0YW5nbGUuY2xhc3MpOwotCQlleHBlY3QocmVjdC5nZXRYKCkpLmFuZFN0dWJSZXR1cm4oMCk7Ci0JCWV4cGVjdChyZWN0LmdldFkoKSkuYW5kU3R1YlJldHVybigwKTsKLQkJcmVjdC5zZXRXaWR0aChFYXN5TW9jay5hbnlJbnQoKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCXJlY3Quc2V0SGVpZ2h0KEVhc3lNb2NrLmFueUludCgpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJcmVjdC5zZXRGaWxsZWQoRWFzeU1vY2suYW55Qm9vbGVhbigpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJcmVjdC5zZXRMaW5lVmlzaWJsZShFYXN5TW9jay5hbnlCb29sZWFuKCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlyZWN0LnNldFgoRWFzeU1vY2suYW55SW50KCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlyZWN0LnNldFkoRWFzeU1vY2suYW55SW50KCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCi0JCUVMaXN0PFByb3BlcnR5PiBwcm9wcyA9IG5ldyBCYXNpY0ludGVybmFsRUxpc3Q8UHJvcGVydHk+KFByb3BlcnR5LmNsYXNzKTsKLQkJRUxpc3Q8UHJvcGVydHk+IHByb3BzMSA9IG5ldyBCYXNpY0ludGVybmFsRUxpc3Q8UHJvcGVydHk+KFByb3BlcnR5LmNsYXNzKTsKLQotCQlleHBlY3QoY3MuZ2V0UHJvcGVydGllcygpKS5hbmRTdHViUmV0dXJuKHByb3BzKTsKLQkJCi0JCWNzLnNldFZpc2libGUoRWFzeU1vY2suYW55Qm9vbGVhbigpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJY3Muc2V0QWN0aXZlKEVhc3lNb2NrLmFueUJvb2xlYW4oKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCWNzLnNldENvbnRhaW5lcigoQ29udGFpbmVyU2hhcGUpIEVhc3lNb2NrLmFueU9iamVjdCgpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJQ29udGFpbmVyU2hhcGUgY3MxID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb250YWluZXJTaGFwZS5jbGFzcyk7Ci0JCWV4cGVjdChjczEuZ2V0UHJvcGVydGllcygpKS5hbmRTdHViUmV0dXJuKHByb3BzMSk7CQotCQljczEuc2V0VmlzaWJsZShFYXN5TW9jay5hbnlCb29sZWFuKCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQljczEuc2V0QWN0aXZlKEVhc3lNb2NrLmFueUJvb2xlYW4oKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCWNzMS5zZXRDb250YWluZXIoKENvbnRhaW5lclNoYXBlKSBFYXN5TW9jay5hbnlPYmplY3QoKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCVBpY3RvZ3JhbXNQYWNrYWdlIHAgPSBFYXN5TW9jay5jcmVhdGVNb2NrKFBpY3RvZ3JhbXNQYWNrYWdlLmNsYXNzKTsKLQkJUHJvcGVydHkgcHIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKFByb3BlcnR5LmNsYXNzKTsKLQkJY3MxLnNldEdyYXBoaWNzQWxnb3JpdGhtKChHcmFwaGljc0FsZ29yaXRobSkgRWFzeU1vY2suYW55T2JqZWN0KCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwkJCi0JCUltYWdlIGltZyA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSW1hZ2UuY2xhc3MpOwotCQlleHBlY3QoaW1nLmdldFgoKSkuYW5kU3R1YlJldHVybigwKTsKLQkJZXhwZWN0KGltZy5nZXRZKCkpLmFuZFN0dWJSZXR1cm4oMCk7Ci0JCWltZy5zZXRXaWR0aChFYXN5TW9jay5hbnlJbnQoKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCWltZy5zZXRIZWlnaHQoRWFzeU1vY2suYW55SW50KCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlpbWcuc2V0WChFYXN5TW9jay5hbnlJbnQoKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCWltZy5zZXRZKEVhc3lNb2NrLmFueUludCgpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJaW1nLnNldElkKCJvcmcuZWNsaXNwLmpwdC51aS5kaWFncmFtZWRpdG9yLmZpZWxkIik7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCWltZy5zZXRQcm9wb3J0aW9uYWwoRWFzeU1vY2suYW55Qm9vbGVhbigpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJaW1nLnNldFN0cmV0Y2hIKEVhc3lNb2NrLmFueUJvb2xlYW4oKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCWltZy5zZXRTdHJldGNoVihFYXN5TW9jay5hbnlCb29sZWFuKCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlFTGlzdDxHcmFwaGljc0FsZ29yaXRobT4gY2ggPSBuZXcgQmFzaWNJbnRlcm5hbEVMaXN0PEdyYXBoaWNzQWxnb3JpdGhtPihHcmFwaGljc0FsZ29yaXRobS5jbGFzcyk7Ci0JCWV4cGVjdChyZWN0LmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKSkuYW5kU3R1YlJldHVybihjaCk7Ci0JCWV4cGVjdChwci5nZXRLZXkoKSkuYW5kU3R1YlJldHVybigicHJvcF9zaGFwZV90eXBlIik7Ci0JCVRleHQgdCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soVGV4dC5jbGFzcyk7Ci0JCWV4cGVjdCh0LmdldFgoKSkuYW5kU3R1YlJldHVybigwKTsKLQkJZXhwZWN0KHQuZ2V0WSgpKS5hbmRTdHViUmV0dXJuKDApOwotCQl0LnNldFdpZHRoKEVhc3lNb2NrLmFueUludCgpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJdC5zZXRYKEVhc3lNb2NrLmFueUludCgpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJdC5zZXRZKEVhc3lNb2NrLmFueUludCgpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJdC5zZXRIZWlnaHQoRWFzeU1vY2suYW55SW50KCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQl0LnNldFZhbHVlKCIiKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJRm9udCBmID0gRWFzeU1vY2suY3JlYXRlTW9jayhGb250LmNsYXNzKTsKLQkJZi5zZXROYW1lKChTdHJpbmcpIEVhc3lNb2NrLmFueU9iamVjdCgpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJCi0JCWYuc2V0U2l6ZShFYXN5TW9jay5hbnlJbnQoKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCWYuc2V0SXRhbGljKEVhc3lNb2NrLmFueUJvb2xlYW4oKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCWYuc2V0Qm9sZChFYXN5TW9jay5hbnlCb29sZWFuKCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlleHBlY3QodC5nZXRGb250KCkpLmFuZFN0dWJSZXR1cm4oZik7Ci0JCXQuc2V0Rm9udCgoRm9udCkgRWFzeU1vY2suYW55T2JqZWN0KCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQl0LnNldEZvcmVncm91bmQoKENvbG9yKSBFYXN5TW9jay5hbnlPYmplY3QoKSk7Ci0JCXQuc2V0SG9yaXpvbnRhbEFsaWdubWVudChPcmllbnRhdGlvbi5BTElHTk1FTlRfTEVGVCk7Ci0JCXQuc2V0VmVydGljYWxBbGlnbm1lbnQoT3JpZW50YXRpb24uQUxJR05NRU5UX1RPUCk7Ci0JCWYuc2V0Qm9sZCh0cnVlKTsKLQkJcmVwbGF5KHJlY3QsIGdhLCBpbWcsIGNzLCBjczEsIHAsIHByLCB0LCBmKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvQWRkUmVsYXRpb25GZWF0dXJlVGVzdC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9mZWF0dXJlL0FkZFJlbGF0aW9uRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNiMmU4OS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvQWRkUmVsYXRpb25GZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtpcmlsIE1pdG92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmFyeUVxOwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXE7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5pc0E7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBsYXk7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay52ZXJpZnk7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNJbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5kdC5JRGlhZ3JhbVR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JQWRkQmVuZHBvaW50RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JQWRkRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklBZGRCZW5kcG9pbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUFkZENvbm5lY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUFkZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JTGF5b3V0Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlBvbHlsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb25EZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRnJlZUZvcm1Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5JR2FTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQWRkUmVsYXRpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckltYWdlQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb24uUmVsRGlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb24uUmVsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklKUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSVBlU2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBBZGRSZWxhdGlvbkZlYXR1cmVUZXN0IHsKLQotCXByaXZhdGUgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXI7Ci0KLQlwcml2YXRlIElKUEFFZGl0b3JJbWFnZUNyZWF0b3IgaW1hZ2VDcmVhdG9yOwotCQotCXByaXZhdGUgSUpQQUVkaXRvclV0aWwganBhRWRpdG9yVXRpbDsKLQotCXByaXZhdGUgSURpYWdyYW1UeXBlUHJvdmlkZXIgZGlhZ3JhbVByb3ZpZGVyOwotCi0JcHJpdmF0ZSBEaWFncmFtIGRpYWdyYW07Ci0KLQlwcml2YXRlIElBZGRDb25uZWN0aW9uQ29udGV4dCBjb250ZXh0OwotCi0JcHJpdmF0ZSBJUGVTZXJ2aWNlVXRpbCBwZVNlcnZpY2VVdGlsOwotCQotCXByaXZhdGUgSUdhU2VydmljZSBnYVV0aWw7Ci0JCi0JcHJpdmF0ZSBJQWRkQmVuZHBvaW50RmVhdHVyZSBmdDsKLQkKLQlwcml2YXRlIFJlc291cmNlIHJlc291cmNlOwotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBPV05FUl9BVF9OQU1FID0gIm93bmVyQXR0ciI7CQkvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIElOVkVSU0VfQVRfTkFNRSA9ICJpbnZlcnNlQXR0ciI7CS8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmVhdHVyZVByb3ZpZGVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQkJaW1hZ2VDcmVhdG9yID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9ySW1hZ2VDcmVhdG9yLmNsYXNzKTsKLQkJanBhRWRpdG9yVXRpbCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQUVkaXRvclV0aWwuY2xhc3MpOwotCQlkaWFncmFtUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElEaWFncmFtVHlwZVByb3ZpZGVyLmNsYXNzKTsKLQkJZGlhZ3JhbSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soRGlhZ3JhbS5jbGFzcyk7Ci0JCWNvbnRleHQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElBZGRDb25uZWN0aW9uQ29udGV4dC5jbGFzcyk7Ci0JCXBlU2VydmljZVV0aWwgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElQZVNlcnZpY2VVdGlsLmNsYXNzKTsKLQkJZ2FVdGlsID0gRWFzeU1vY2suY3JlYXRlTW9jayhJR2FTZXJ2aWNlLmNsYXNzKTsKLQkJZnQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElBZGRCZW5kcG9pbnRGZWF0dXJlLmNsYXNzKTsKLQkJCi0JCQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkZWZhdWx0VHJhbnNFZGl0RG9tYWluID0gRWFzeU1vY2suY3JlYXRlTW9jayhUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbi5jbGFzcyk7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhSZXNvdXJjZVNldC5jbGFzcyk7IAotCQlleHBlY3QoZGVmYXVsdFRyYW5zRWRpdERvbWFpbi5nZXRSZXNvdXJjZVNldCgpKS5hbmRTdHViUmV0dXJuKHJlc291cmNlU2V0KTsKLQkJRUxpc3Q8QWRhcHRlcj4gZUFkYXB0ZXJzID0gRWFzeU1vY2suY3JlYXRlTW9jayhFTGlzdC5jbGFzcyk7Ci0JCWV4cGVjdChyZXNvdXJjZVNldC5lQWRhcHRlcnMoKSkuYW5kU3R1YlJldHVybihlQWRhcHRlcnMpOwotCQkvL0lGaWxlIGRpYWdyYW1GaWxlID0gcHJvamVjdC5nZXRGaWxlKGRpYWdyYW1GaWxlTmFtZS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQkJLy9JUGF0aCBkaWFncmFtRmlsZVBhdGggPSBkaWFncmFtRmlsZS5nZXRGdWxsUGF0aCgpOwotCi0JCS8vU3RyaW5nIHBhdGhOYW1lID0gZGlhZ3JhbUZpbGVQYXRoLnRvU3RyaW5nKCk7Ci0JCS8vVVJJIHJlc291cmNlVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkocGF0aE5hbWUsIHRydWUpOwotCQlyZXNvdXJjZSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soUmVzb3VyY2UuY2xhc3MpOyAKLQkJZXhwZWN0KHJlc291cmNlU2V0LmdldFJlc291cmNlKGlzQShVUkkuY2xhc3MpLCBFYXN5TW9jay5hbnlCb29sZWFuKCkpKS5hbmRTdHViUmV0dXJuKHJlc291cmNlKTsKLQkJCi0JCWV4cGVjdChyZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKS5hbmRTdHViUmV0dXJuKHJlc291cmNlU2V0KTsKLQkJcmVwbGF5KGRlZmF1bHRUcmFuc0VkaXREb21haW4sIHJlc291cmNlU2V0LCByZXNvdXJjZSk7Ci0JCQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENhbkFkZE5vdEFkZENvbm5lY3Rpb25Db250ZXh0KCkgewotCQlJQWRkQ29udGV4dCBjb250ZXh0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJQWRkQ29udGV4dC5jbGFzcyk7Ci0JCXZlcmlmeUNhbkFkZChjb250ZXh0LCBmYWxzZSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuQWRkTm9SZWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQWRkQ29ubmVjdGlvbkNvbnRleHQgY29udGV4dCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUFkZENvbm5lY3Rpb25Db250ZXh0LmNsYXNzKTsKLQkJT2JqZWN0IG5vdEFSZWxhdGlvbiA9IG5ldyBPYmplY3QoKTsKLQkJZXhwZWN0KGNvbnRleHQuZ2V0TmV3T2JqZWN0KCkpLmFuZFJldHVybihub3RBUmVsYXRpb24pOwotCQl2ZXJpZnlDYW5BZGQoY29udGV4dCwgZmFsc2UpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENhbkFkZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQWRkQ29ubmVjdGlvbkNvbnRleHQgY29udGV4dCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUFkZENvbm5lY3Rpb25Db250ZXh0LmNsYXNzKTsKLQkJSVJlbGF0aW9uIHJlbGF0aW9uID0gRWFzeU1vY2suY3JlYXRlTW9jayhJUmVsYXRpb24uY2xhc3MpOwotCQlyZXBsYXkocmVsYXRpb24pOwotCQlleHBlY3QoY29udGV4dC5nZXROZXdPYmplY3QoKSkuYW5kUmV0dXJuKHJlbGF0aW9uKTsKLQkJdmVyaWZ5Q2FuQWRkKGNvbnRleHQsIHRydWUpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJSUFkZEZlYXR1cmUgZml4dHVyZSA9IGNyZWF0ZUZlYXR1cmUoKTsKLQkJYXNzZXJ0U2FtZShmZWF0dXJlUHJvdmlkZXIsIGZpeHR1cmUuZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCXByaXZhdGUgdm9pZCBleHBlY3RNYW55RW5kRGVjb3JhdG9yKGRvdWJsZSBsb2NhdGlvbikgewotCQlDb25uZWN0aW9uRGVjb3JhdG9yIGQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbm5lY3Rpb25EZWNvcmF0b3IuY2xhc3MpOwotCQlQb2x5bGluZSBwbCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soUG9seWxpbmUuY2xhc3MpOwotCQlleHBlY3QocGwuZ2V0WCgpKS5hbmRSZXR1cm4oMCk7Ci0JCWV4cGVjdChwbC5nZXRZKCkpLmFuZFJldHVybigwKTsJCQotCQlleHBlY3QoaW1hZ2VDcmVhdG9yLmNyZWF0ZU1hbnlFbmREZWNvcmF0b3IoaXNBKENvbm5lY3Rpb24uY2xhc3MpLCBlcShsb2NhdGlvbikpKS5hbmRSZXR1cm4oZCk7Ci0JCWV4cGVjdChkLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkpLmFuZFJldHVybihwbCk7Ci0JCXJlcGxheShkLCBwbCk7CQkKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJpdmF0ZSB2b2lkIGV4cGVjdE1hbnlTdGFydERlY29yYXRvcihkb3VibGUgbG9jYXRpb24pIHsKLQkJQ29ubmVjdGlvbkRlY29yYXRvciBkID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb25uZWN0aW9uRGVjb3JhdG9yLmNsYXNzKTsKLQkJUG9seWxpbmUgcGwgPSBFYXN5TW9jay5jcmVhdGVNb2NrKFBvbHlsaW5lLmNsYXNzKTsKLQkJZXhwZWN0KHBsLmdldFgoKSkuYW5kUmV0dXJuKDApOwotCQlleHBlY3QocGwuZ2V0WSgpKS5hbmRSZXR1cm4oMCk7CQkKLQkJZXhwZWN0KGltYWdlQ3JlYXRvci5jcmVhdGVNYW55U3RhcnREZWNvcmF0b3IoaXNBKENvbm5lY3Rpb24uY2xhc3MpLCBlcShsb2NhdGlvbikpKS5hbmRSZXR1cm4oZCk7Ci0JCWV4cGVjdChkLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkpLmFuZFJldHVybihwbCk7Ci0JCXJlcGxheShkLCBwbCk7CQkKLQl9CQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJpdmF0ZSB2b2lkIGV4cGVjdE1hbnlFbmRXaXRoQXJyb3coZmluYWwgZG91YmxlIGxvY2F0aW9uKSB7Ci0JCUNvbm5lY3Rpb25EZWNvcmF0b3IgZCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29ubmVjdGlvbkRlY29yYXRvci5jbGFzcyk7Ci0JCVBvbHlsaW5lIHBsID0gRWFzeU1vY2suY3JlYXRlTW9jayhQb2x5bGluZS5jbGFzcyk7Ci0JCWV4cGVjdChwbC5nZXRYKCkpLmFuZFJldHVybigwKTsKLQkJZXhwZWN0KHBsLmdldFkoKSkuYW5kUmV0dXJuKDApOwkJCi0JCWV4cGVjdChpbWFnZUNyZWF0b3IuY3JlYXRlTWFueUVuZFdpdGhBcnJvd0RlY29yYXRvcihpc0EoQ29ubmVjdGlvbi5jbGFzcyksIGVxKGxvY2F0aW9uKSkpLmFuZFJldHVybihkKTsKLQkJZXhwZWN0KGQuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSkuYW5kUmV0dXJuKHBsKTsKLQkJcmVwbGF5KGQsIHBsKTsJCQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCXByaXZhdGUgdm9pZCBleHBlY3RBcnJvdyhmaW5hbCBkb3VibGUgbG9jYXRpb24pIHsKLQkJQ29ubmVjdGlvbkRlY29yYXRvciBkID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb25uZWN0aW9uRGVjb3JhdG9yLmNsYXNzKTsKLQkJUG9seWxpbmUgcGwgPSBFYXN5TW9jay5jcmVhdGVNb2NrKFBvbHlsaW5lLmNsYXNzKTsKLQkJZXhwZWN0KHBsLmdldFgoKSkuYW5kUmV0dXJuKDApOwotCQlleHBlY3QocGwuZ2V0WSgpKS5hbmRSZXR1cm4oMCk7Ci0JCWV4cGVjdChpbWFnZUNyZWF0b3IuY3JlYXRlQXJyb3dDb25uZWN0aW9uRGVjb3JhdG9yKGlzQShDb25uZWN0aW9uLmNsYXNzKSwgZXEobG9jYXRpb24pLCBmYWxzZSkpLmFuZFJldHVybihkKTsKLQkJZXhwZWN0KGQuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSkuYW5kUmV0dXJuKHBsKTsKLQkJcmVwbGF5KGQsIHBsKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIHZvaWQgZXhwZWN0VGV4dENvbm5lY3Rpb25EZWNvcmF0b3IoU3RyaW5nIHRleHQsIGRvdWJsZSBsb2NhdGlvbikgewotCQlleHBlY3QoaW1hZ2VDcmVhdG9yLmNyZWF0ZUNhcmRpbmFsaXR5Q29ubmVjdGlvbkRlY29yYXRvcihkaWFncmFtLCBpc0EoQ29ubmVjdGlvbi5jbGFzcyksIGVxKHRleHQpLCBlcShsb2NhdGlvbikpKS5hbmRSZXR1cm4oCi0JCQkJbnVsbCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVJlbGF0aW9uKElSZWxhdGlvbiByZWxhdGlvbiwgZmluYWwgUmVsRGlyIGRpcmVjdGlvbiwgZmluYWwgUmVsVHlwZSB0eXBlKSB7Ci0JCWV4cGVjdChyZWxhdGlvbi5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSkuYW5kU3R1YlJldHVybihPV05FUl9BVF9OQU1FKTsKLQkJZXhwZWN0KHJlbGF0aW9uLmdldEludmVyc2VBdHRyaWJ1dGVOYW1lKCkpLmFuZFN0dWJSZXR1cm4oSU5WRVJTRV9BVF9OQU1FKTsKLQkJZXhwZWN0KHJlbGF0aW9uLmdldFJlbERpcigpKS5hbmRTdHViUmV0dXJuKGRpcmVjdGlvbik7Ci0JCWV4cGVjdChyZWxhdGlvbi5nZXRSZWxUeXBlKCkpLmFuZFN0dWJSZXR1cm4odHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVByb3ZpZGVyc0ZvckFkZChJUmVsYXRpb24gcmVsYXRpb24pIHsKLQkJZXhwZWN0KGRpYWdyYW1Qcm92aWRlci5nZXREaWFncmFtKCkpLmFuZFJldHVybihkaWFncmFtKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkpLmFuZFJldHVybihkaWFncmFtUHJvdmlkZXIpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldFBlU2VydmljZVV0aWwoKSkuYW5kUmV0dXJuKHBlU2VydmljZVV0aWwpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEFkZEJlbmRwb2ludEZlYXR1cmUoaXNBKElBZGRCZW5kcG9pbnRDb250ZXh0LmNsYXNzKSkpLmFuZFN0dWJSZXR1cm4oZnQpOwotCQlleHBlY3QoY29udGV4dC5nZXROZXdPYmplY3QoKSkuYW5kUmV0dXJuKHJlbGF0aW9uKTsKLQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCXByaXZhdGUgdm9pZCB2ZXJpZnlBZGQoSVJlbGF0aW9uIHJlbGF0aW9uLCBib29sZWFuIGV4cGVjdElkKSB7Ci0JCUZyZWVGb3JtQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gY29uZmlndXJlQ29ubmVjdGlvbihyZWxhdGlvbiwgZXhwZWN0SWQpOwotCQlyZXBsYXkoY29ubmVjdGlvbik7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgcmVzdWx0ID0gY2FsbEFkZCgpOwotCQlhc3NlcnRTYW1lKGNvbm5lY3Rpb24sIHJlc3VsdCk7Ci0JCXZlcmlmeShjb250ZXh0KTsKLQkJdmVyaWZ5KGZlYXR1cmVQcm92aWRlcik7Ci0JCXZlcmlmeShpbWFnZUNyZWF0b3IpOwotCQl2ZXJpZnkoanBhRWRpdG9yVXRpbCk7Ci0JCXZlcmlmeShkaWFncmFtKTsKLQkJdmVyaWZ5KGRpYWdyYW1Qcm92aWRlcik7Ci0JCXZlcmlmeShyZWxhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBQaWN0b2dyYW1FbGVtZW50IGNhbGxBZGQoKSB7Ci0JCUlBZGRGZWF0dXJlIGZpeHR1cmUgPSBjcmVhdGVGZWF0dXJlKCk7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgcmVzdWx0ID0gZml4dHVyZS5hZGQoY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBGcmVlRm9ybUNvbm5lY3Rpb24gY29uZmlndXJlQ29ubmVjdGlvbihJUmVsYXRpb24gcmVsYXRpb24sIGJvb2xlYW4gZXhwZWN0SWQpIHsKLQkJZmluYWwgU3RyaW5nIHJlbGF0aW9uSWQgPSAic29tZUlkIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZXhwZWN0SWQpCi0JCQlleHBlY3QocmVsYXRpb24uZ2V0SWQoKSkuYW5kU3R1YlJldHVybihyZWxhdGlvbklkKTsKLQkJcmVwbGF5KHJlbGF0aW9uKTsKLQkJY29uZmlndXJlUHJvdmlkZXJzRm9yQWRkKHJlbGF0aW9uKTsKLQkJQW5jaG9yIHN0YXJ0QW5jaG9yID0gcmVwbGF5QW5jaG9yKCk7Ci0JCUFuY2hvciBlbmRBbmNob3IgPSByZXBsYXlBbmNob3IoKTsKLQkJZXhwZWN0KGNvbnRleHQuZ2V0U291cmNlQW5jaG9yKCkpLmFuZFJldHVybihzdGFydEFuY2hvcik7Ci0JCWV4cGVjdChjb250ZXh0LmdldFRhcmdldEFuY2hvcigpKS5hbmRSZXR1cm4oZW5kQW5jaG9yKTsKLQkJCi0JCWdhVXRpbC5zZXRMb2NhdGlvbihpc0EoUG9seWxpbmUuY2xhc3MpLCBFYXN5TW9jay5hbnlJbnQoKSAsIEVhc3lNb2NrLmFueUludCgpKTsKLQkJZ2FVdGlsLnNldExvY2F0aW9uKGlzQShQb2x5bGluZS5jbGFzcyksIEVhc3lNb2NrLmFueUludCgpICwgRWFzeU1vY2suYW55SW50KCkpOwotCi0JCUZyZWVGb3JtQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gY3JlYXRlQ29ubmVjdGlvbihzdGFydEFuY2hvciwgZW5kQW5jaG9yKTsKLQkJZXhwZWN0KHBlU2VydmljZVV0aWwuY3JlYXRlRnJlZUZvcm1Db25uZWN0aW9uKGRpYWdyYW0pKS5hbmRSZXR1cm4oY29ubmVjdGlvbik7Ci0JCWV4cGVjdChpbWFnZUNyZWF0b3IuY3JlYXRlQ29ubmVjdGlvbkxpbmUoZGlhZ3JhbSwgY29ubmVjdGlvbikpLmFuZFJldHVybihudWxsKTsKLQkJZnQuYWRkQmVuZHBvaW50KGlzQShJQWRkQmVuZHBvaW50Q29udGV4dC5jbGFzcykpOwotCQkKLQkJTGlzdDxQb2ludD4gcHRzID0gbmV3IExpbmtlZExpc3Q8UG9pbnQ+KCk7Ci0JCVBvaW50IHB0MSA9IG5ldyBQb2ludCgxMDAsIDEwMCk7Ci0JCS8vUG9pbnQgcHQyID0gbmV3IFBvaW50KDIwMCwgMjAwKTsKLQkJcHRzLmFkZChwdDEpOyAKLQkJLy9wdHMuYWRkKHB0Mik7Ci0JCWV4cGVjdChqcGFFZGl0b3JVdGlsLmNyZWF0ZUJlbmRQb2ludExpc3QoY29ubmVjdGlvbiwgZmFsc2UpKS5hbmRSZXR1cm4ocHRzKTsKLQkJZmVhdHVyZVByb3ZpZGVyLnB1dEtleVRvQnVzaW5lc3NPYmplY3QocmVsYXRpb25JZCwgcmVsYXRpb24pOwotCQlmZWF0dXJlUHJvdmlkZXIubGluayhlcShjb25uZWN0aW9uKSwgYXJ5RXEobmV3IElSZWxhdGlvbltdIHsgcmVsYXRpb24gfSkpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmxheW91dElmUG9zc2libGUoaXNBKElMYXlvdXRDb250ZXh0LmNsYXNzKSkpLmFuZFJldHVybihudWxsKTsKLQkJcmV0dXJuIGNvbm5lY3Rpb247Ci0JfQotCi0JcHJpdmF0ZSBBbmNob3IgcmVwbGF5QW5jaG9yKCkgewotCQlBbmNob3Igc3RhcnRBbmNob3IgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEFuY2hvci5jbGFzcyk7Ci0JCXJlcGxheShzdGFydEFuY2hvcik7Ci0JCXJldHVybiBzdGFydEFuY2hvcjsKLQl9Ci0KLQlwcml2YXRlIEZyZWVGb3JtQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uKEFuY2hvciBzdGFydEFuY2hvciwgQW5jaG9yIGVuZEFuY2hvcikgewotCQlGcmVlRm9ybUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soRnJlZUZvcm1Db25uZWN0aW9uLmNsYXNzKTsKLQkJY29ubmVjdGlvbi5zZXRTdGFydChzdGFydEFuY2hvcik7Ci0JCWNvbm5lY3Rpb24uc2V0RW5kKGVuZEFuY2hvcik7Ci0JCWNvbm5lY3Rpb24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJY29ubmVjdGlvbi5zZXRBY3RpdmUodHJ1ZSk7Ci0JCQotCQlvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5Qb2ludCBwdCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2sob3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5zdHlsZXMuUG9pbnQuY2xhc3MpOwotCQlleHBlY3QocHQuZ2V0WCgpKS5hbmRTdHViUmV0dXJuKDEwMCk7Ci0JCWV4cGVjdChwdC5nZXRZKCkpLmFuZFN0dWJSZXR1cm4oMTAwKTsKLQkJCi0JCW9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuc3R5bGVzLlBvaW50IHB0MSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2sob3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5zdHlsZXMuUG9pbnQuY2xhc3MpOwotCQlleHBlY3QocHQxLmdldFgoKSkuYW5kU3R1YlJldHVybigyMDApOwotCQlleHBlY3QocHQxLmdldFkoKSkuYW5kU3R1YlJldHVybigyMDApOwotCQkKLQkJCi0JCUVMaXN0PG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuc3R5bGVzLlBvaW50PiBwdHMxID0gbmV3IEJhc2ljSW50ZXJuYWxFTGlzdDxvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5Qb2ludD4ob3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5zdHlsZXMuUG9pbnQuY2xhc3MpOwotCQlwdHMxLmFkZChwdCk7CQotCQlwdHMxLmFkZChwdDEpOwotCQlleHBlY3QoY29ubmVjdGlvbi5nZXRCZW5kcG9pbnRzKCkpLmFuZFN0dWJSZXR1cm4ocHRzMSk7Ci0JCXJlcGxheShwdCwgcHQxKTsKLQkJcmV0dXJuIGNvbm5lY3Rpb247Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhbkFkZChJQWRkQ29udGV4dCBjb250ZXh0LCBmaW5hbCBib29sZWFuIGV4cGVjdGVkKSB7Ci0JCXJlcGxheShjb250ZXh0KTsKLQkJYm9vbGVhbiByZXN1bHQgPSBjYWxsQ2FuQWRkKGNvbnRleHQpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3VsdCk7Ci0JCXZlcmlmeShjb250ZXh0KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FsbENhbkFkZChJQWRkQ29udGV4dCBjb250ZXh0KSB7Ci0JCUlBZGRGZWF0dXJlIGZpeHR1cmUgPSBjcmVhdGVGZWF0dXJlKCk7Ci0JCXJldHVybiBmaXh0dXJlLmNhbkFkZChjb250ZXh0KTsKLQl9Ci0KLQlwcml2YXRlIElBZGRGZWF0dXJlIGNyZWF0ZUZlYXR1cmUoKSB7Ci0JCXJlcGxheShmZWF0dXJlUHJvdmlkZXIpOwotCQlyZXBsYXkoaW1hZ2VDcmVhdG9yKTsKLQkJcmVwbGF5KGpwYUVkaXRvclV0aWwpOwotCQlyZXBsYXkoZGlhZ3JhbVByb3ZpZGVyKTsKLQkJcmVwbGF5KGRpYWdyYW0pOwotCQlyZXBsYXkoY29udGV4dCk7Ci0JCXJlcGxheShwZVNlcnZpY2VVdGlsKTsKLQkJcmVwbGF5KGdhVXRpbCk7Ci0JCXJlcGxheShmdCk7Ci0JCXJldHVybiBuZXcgQWRkUmVsYXRpb25GZWF0dXJlKGZlYXR1cmVQcm92aWRlciwgaW1hZ2VDcmVhdG9yLCBqcGFFZGl0b3JVdGlsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9DbGlja0FkZEZlYXR1cmVUZXN0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvQ2xpY2tBZGRGZWF0dXJlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTgxMjY3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9DbGlja0FkZEZlYXR1cmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmlzQTsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlcGxheTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5kdC5JRGlhZ3JhbVR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRGlyZWN0RWRpdGluZ0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQWRkQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDcmVhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNsaWNrQWRkQXR0cmlidXRlQnV0dG9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuSlBBQ3JlYXRlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC51dGlsLklFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDbGlja0FkZEZlYXR1cmVUZXN0IHsKLQkKLQlwcml2YXRlIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyOwotCXByaXZhdGUgSUNyZWF0ZUNvbnRleHQgY29udGV4dDsKLQlmaW5hbCBTdHJpbmcgVEVTVF9QUk9KRUNUID0gIlRlc3QiOwotCXByaXZhdGUgSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIEpQQUNyZWF0ZUZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IG51bGw7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IG51bGw7Ci0JCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eShKUEFDcmVhdGVGYWN0b3J5LkpQQV9KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFksICJDOlxcbGliXFxwZXJzaXN0ZW5jZS1hcGktMS4wLmphciIpOwotCQlmYWN0b3J5ID0gSlBBQ3JlYXRlRmFjdG9yeS5pbnN0YW5jZSgpOwotCQlqcGFQcm9qZWN0ID0gZmFjdG9yeS5jcmVhdGVKUEFQcm9qZWN0KFRFU1RfUFJPSkVDVCArICJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLQkJSUZpbGUgZW50aXR5ID0gZmFjdG9yeS5jcmVhdGVFbnRpdHkoanBhUHJvamVjdCwgIm9yZy5lY2xpcHNlLkVudGl0eTEiKTsKLQkJQ29udGFpbmVyU2hhcGUgY3MgPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbnRhaW5lclNoYXBlLmNsYXNzKTsKLQkJY29udGV4dCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUNyZWF0ZUNvbnRleHQuY2xhc3MpOwotCQlleHBlY3QoY29udGV4dC5nZXRUYXJnZXRDb250YWluZXIoKSkuYW5kU3R1YlJldHVybihjcyk7Ci0JCWV4cGVjdChjb250ZXh0LmdldFgoKSkuYW5kU3R1YlJldHVybigwKTsKLQkJZXhwZWN0KGNvbnRleHQuZ2V0WSgpKS5hbmRTdHViUmV0dXJuKDApOwotCQlleHBlY3QoY29udGV4dC5nZXRXaWR0aCgpKS5hbmRTdHViUmV0dXJuKDEwMCk7Ci0JCWV4cGVjdChjb250ZXh0LmdldEhlaWdodCgpKS5hbmRTdHViUmV0dXJuKDEwMCk7Ci0JCWV4cGVjdChjb250ZXh0LmdldFRhcmdldENvbm5lY3Rpb24oKSkuYW5kU3R1YlJldHVybihudWxsKTsKLQkJSURpcmVjdEVkaXRpbmdJbmZvIGRlaSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSURpcmVjdEVkaXRpbmdJbmZvLmNsYXNzKTsKLQkJZGVpLnNldEFjdGl2ZSh0cnVlKTsKLQkJVGhyZWFkLnNsZWVwKDIwMDApOwotCQlqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKUpQQUNyZWF0ZUZhY3RvcnkuZ2V0UGVyc2lzdGVudFR5cGUoZW50aXR5KTsKLQkJaW50IGNudCA9IDA7Ci0JCXdoaWxlICgoY250IDwgNTApICYmIChqcHQgPT0gbnVsbCkpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJanB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlKUEFDcmVhdGVGYWN0b3J5LmdldFBlcnNpc3RlbnRUeXBlKGVudGl0eSk7Ci0JCQljbnQrKzsKLQkJfQotCQlmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChjcykpLmFuZFN0dWJSZXR1cm4oanB0KTsJCQotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChqcHQpKS5hbmRTdHViUmV0dXJuKG51bGwpOwotCQljdSA9IEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZW50aXR5KTsKLQkJY250ID0gMDsKLQkJd2hpbGUgKChjbnQgPCA1MCkgJiYgKGN1ID09IG51bGwpKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCWN1ID0gSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShlbnRpdHkpOwotCQkJY250Kys7Ci0JCX0JCQotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdCgoSmF2YVBlcnNpc3RlbnRUeXBlKSBFYXN5TW9jay5hbnlPYmplY3QoKSkpLmFuZFJldHVybihjdSkuYW55VGltZXMoKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5hZGRJZlBvc3NpYmxlKGlzQShJQWRkQ29udGV4dC5jbGFzcykpKS5hbmRTdHViUmV0dXJuKG51bGwpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldERpcmVjdEVkaXRpbmdJbmZvKCkpLmFuZFN0dWJSZXR1cm4oZGVpKTsKLQkJCi0JCUlKUEFFZGl0b3JVdGlsIHV0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yVXRpbC5jbGFzcyk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0SlBBRWRpdG9yVXRpbCgpKS5hbmRTdHViUmV0dXJuKHV0KTsKLQkJCi0JCUlEaWFncmFtVHlwZVByb3ZpZGVyIGRpYWdyYW1UeXBlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElEaWFncmFtVHlwZVByb3ZpZGVyLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkpLmFuZFN0dWJSZXR1cm4oZGlhZ3JhbVR5cGVQcm92aWRlcik7Ci0JCUlFZGl0b3IgZWQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElFZGl0b3IuY2xhc3MpOwotCQlleHBlY3QoZGlhZ3JhbVR5cGVQcm92aWRlci5nZXREaWFncmFtRWRpdG9yKCkpLmFuZFN0dWJSZXR1cm4oZWQpOwotCQlJV29ya2JlbmNoUGFydFNpdGUgd3MgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElXb3JrYmVuY2hQYXJ0U2l0ZS5jbGFzcyk7Ci0JCWV4cGVjdChlZC5nZXRTaXRlKCkpLmFuZFN0dWJSZXR1cm4od3MpOwotCQl1dC5mb3JtYXRDb2RlKChJQ29tcGlsYXRpb25Vbml0KUVhc3lNb2NrLmFueU9iamVjdCgpLCAoSVdvcmtiZW5jaFBhcnRTaXRlKUVhc3lNb2NrLmFueU9iamVjdCgpKTsKLQkJCi0JCWZlYXR1cmVQcm92aWRlci5hZGRBZGRJZ25vcmUoanB0LCAiYXR0cmlidXRlMSIpOwotCQkKLQkJcmVwbGF5KGZlYXR1cmVQcm92aWRlciwgY3MsIGNvbnRleHQsIGRlaSwgZGlhZ3JhbVR5cGVQcm92aWRlciwgZWQsIHdzLCB1dCk7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENsaWNrQWRkQXR0cmlidXRlQnV0dG9uRmVhdHVyZSgpeyAKLQkJaWYgKChqcHQgPT0gbnVsbCkgfHwgKGN1ID09IG51bGwpKQotCQkJcmV0dXJuOwkJLy8gVGhlIHRlc3Qgd2Fzbid0IHNldHVwIHByb3Blcmx5Ci0JCUNsaWNrQWRkQXR0cmlidXRlQnV0dG9uRmVhdHVyZSBmZWF0dXJlID0gbmV3IENsaWNrQWRkQXR0cmlidXRlQnV0dG9uRmVhdHVyZShmZWF0dXJlUHJvdmlkZXIpOwotCQlPYmplY3RbXSBjcmVhdGVkID0gZmVhdHVyZS5jcmVhdGUoY29udGV4dCk7Ci0JCWFzc2VydE5vdE51bGwoY3JlYXRlZFswXSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZURlbGV0ZU9ubHlBdHRyaWJ1dGVUZXN0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlRGVsZXRlT25seUF0dHJpYnV0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ2MjY0Yi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlRGVsZXRlT25seUF0dHJpYnV0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suaXNBOwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVwbGF5OwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUFkZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuSlBBQ3JlYXRlRmFjdG9yeTsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIENyZWF0ZURlbGV0ZU9ubHlBdHRyaWJ1dGVUZXN0IHsKLQotCXByaXZhdGUgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXI7Ci0JZmluYWwgU3RyaW5nIFRFU1RfUFJPSkVDVCA9ICJUZXN0IjsKLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBKUEFDcmVhdGVGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBudWxsOwotCQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb257Ci0JCWZhY3RvcnkgPSBKUEFDcmVhdGVGYWN0b3J5Lmluc3RhbmNlKCk7Ci0JCWpwYVByb2plY3QgPSBmYWN0b3J5LmNyZWF0ZUpQQVByb2plY3QoVEVTVF9QUk9KRUNUICsgIl8iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwotCQlJRmlsZSBlbnRpdHkgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eShqcGFQcm9qZWN0LCAib3JnLmVjbGlwc2UuRW50aXR5MSIpOwotCQlqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKUpQQUNyZWF0ZUZhY3RvcnkuZ2V0UGVyc2lzdGVudFR5cGUoZW50aXR5KTsKLQkJaW50IGMgPSAwOwotCQl3aGlsZSAoKGpwdCA9PSBudWxsKSAmJiAoYyA8IDEwMCkpIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDI1MCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJCWpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpSlBBQ3JlYXRlRmFjdG9yeS5nZXRQZXJzaXN0ZW50VHlwZShlbnRpdHkpOwotCQkJYysrOwotCQl9Ci0JCWZlYXR1cmVQcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlci5jbGFzcyk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGlzQShDb250YWluZXJTaGFwZS5jbGFzcykpKS5hbmRTdHViUmV0dXJuKGpwdCk7CQkKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQobnVsbCkpLmFuZFJldHVybihKUEFDcmVhdGVGYWN0b3J5LmdldFBlcnNpc3RlbnRUeXBlKGVudGl0eSkpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdChpc0EoSmF2YVBlcnNpc3RlbnRUeXBlLmNsYXNzKSkpLmFuZFJldHVybihKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGVudGl0eSkpLmFueVRpbWVzKCk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuYWRkSWZQb3NzaWJsZShpc0EoSUFkZENvbnRleHQuY2xhc3MpKSkuYW5kU3R1YlJldHVybihudWxsKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoanB0KSkuYW5kU3R1YlJldHVybihpc0EoQ29udGFpbmVyU2hhcGUuY2xhc3MpKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZW50aXR5KTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQoanB0KSkuYW5kU3R1YlJldHVybihjdSk7Ci0JCXJlcGxheShmZWF0dXJlUHJvdmlkZXIpOwotCX0KLQkKLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVQcm9wZXJ0eUFubm90YXRlZEF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlFbnRpdHlBdHRyaWJ1dGVzQ2hhbmdlVGVzdExpc3RlbmVyIGxzbnIgPSBuZXcgRW50aXR5QXR0cmlidXRlc0NoYW5nZVRlc3RMaXN0ZW5lcigwLCAxKTsKLQkJanB0LmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihKYXZhUGVyc2lzdGVudFR5cGUuQVRUUklCVVRFU19MSVNULCBsc25yKTsKLQkJZGVsZXRlQXR0cmlidXRlKCJpZCIpOwotCQlhc3NlcnRUcnVlKGxzbnIud2FpdEZvckV2ZW50cygpKTsKLQkJanB0LnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihKYXZhUGVyc2lzdGVudFR5cGUuQVRUUklCVVRFU19MSVNULCBsc25yKTsKLQkJbHNuciA9IG5ldyBFbnRpdHlBdHRyaWJ1dGVzQ2hhbmdlVGVzdExpc3RlbmVyKDIsIDApOwotCQlqcHQuYWRkTGlzdENoYW5nZUxpc3RlbmVyKEphdmFQZXJzaXN0ZW50VHlwZS5BVFRSSUJVVEVTX0xJU1QsIGxzbnIpOwotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5tYWtlTmV3QXR0cmlidXRlKGZlYXR1cmVQcm92aWRlciwganB0LCBmZWF0dXJlUHJvdmlkZXIuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCksICJhYWEiLCAiamF2YS5sYW5nLlN0cmluZyIsIG51bGwsICJhYWEiLCBudWxsLCBmYWxzZSwgdHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKGxzbnIud2FpdEZvckV2ZW50cygpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGxzbnIuaW5jcmVtZW50Q291bnRlcik7Ci0JCWFzc2VydEVxdWFscygwLCBsc25yLmRlY3JlbWVudENvdW50ZXIpOwkJCi0JfQotCQotCQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUZpZWxkQW5ub3RhdGVkQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVudGl0eUF0dHJpYnV0ZXNDaGFuZ2VUZXN0TGlzdGVuZXIgbHNuciA9IG5ldyBFbnRpdHlBdHRyaWJ1dGVzQ2hhbmdlVGVzdExpc3RlbmVyKDAsIDEpOwotCQlqcHQuYWRkTGlzdENoYW5nZUxpc3RlbmVyKEphdmFQZXJzaXN0ZW50VHlwZS5BVFRSSUJVVEVTX0xJU1QsIGxzbnIpOwotCQlkZWxldGVBdHRyaWJ1dGUoImlkIik7Ci0JCWFzc2VydFRydWUobHNuci53YWl0Rm9yRXZlbnRzKCkpOwotCQlqcHQucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKEphdmFQZXJzaXN0ZW50VHlwZS5BVFRSSUJVVEVTX0xJU1QsIGxzbnIpOwotCQlsc25yID0gbmV3IEVudGl0eUF0dHJpYnV0ZXNDaGFuZ2VUZXN0TGlzdGVuZXIoMiwgMCk7Ci0JCWpwdC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoSmF2YVBlcnNpc3RlbnRUeXBlLkFUVFJJQlVURVNfTElTVCwgbHNucik7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLm1ha2VOZXdBdHRyaWJ1dGUoZmVhdHVyZVByb3ZpZGVyLCBqcHQsIGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQoanB0KSwgImFhYSIsICJqYXZhLmxhbmcuU3RyaW5nIiwgbnVsbCwgImFhYSIsIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKGxzbnIud2FpdEZvckV2ZW50cygpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGxzbnIuaW5jcmVtZW50Q291bnRlcik7Ci0JCWFzc2VydEVxdWFscygwLCBsc25yLmRlY3JlbWVudENvdW50ZXIpOwkJCi0JfQkKLQkKLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3REZWxldGVQcm9wZXJ0eUFubm90YXRlZEF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlFbnRpdHlBdHRyaWJ1dGVzQ2hhbmdlVGVzdExpc3RlbmVyIGxzbnIgPSBuZXcgRW50aXR5QXR0cmlidXRlc0NoYW5nZVRlc3RMaXN0ZW5lcigwLCAyKTsKLQkJanB0LmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihKYXZhUGVyc2lzdGVudFR5cGUuQVRUUklCVVRFU19MSVNULCBsc25yKTsKLQkJZGVsZXRlQXR0cmlidXRlKCJpZCIpOwotCQlhc3NlcnRGYWxzZShsc25yLndhaXRGb3JFdmVudHMoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBsc25yLmluY3JlbWVudENvdW50ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgbHNuci5kZWNyZW1lbnRDb3VudGVyKTsJCQotCX0JCi0JCi0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3REZWxldGVGaWVsZEFubm90YXRlZEF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gIHsKLQkJRW50aXR5QXR0cmlidXRlc0NoYW5nZVRlc3RMaXN0ZW5lciBsc25yID0gbmV3IEVudGl0eUF0dHJpYnV0ZXNDaGFuZ2VUZXN0TGlzdGVuZXIoMSwgMSk7Ci0JCWpwdC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoSmF2YVBlcnNpc3RlbnRUeXBlLkFUVFJJQlVURVNfTElTVCwgbHNucik7Ci0JCWRlbGV0ZUF0dHJpYnV0ZSgiaWQiKTsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkubWFrZU5ld0F0dHJpYnV0ZShmZWF0dXJlUHJvdmlkZXIsIGpwdCwgZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdChqcHQpLCAiYWFhIiwgImphdmEubGFuZy5TdHJpbmciLCBudWxsLCAiYWFhIiwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZShsc25yLndhaXRGb3JFdmVudHMoKSk7Ci0JCWpwdC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoSmF2YVBlcnNpc3RlbnRUeXBlLkFUVFJJQlVURVNfTElTVCwgbHNucik7Ci0JCWxzbnIgPSBuZXcgRW50aXR5QXR0cmlidXRlc0NoYW5nZVRlc3RMaXN0ZW5lcigwLCAyKTsKLQkJanB0LmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihKYXZhUGVyc2lzdGVudFR5cGUuQVRUUklCVVRFU19MSVNULCBsc25yKTsKLQkJZGVsZXRlQXR0cmlidXRlKCJhYWEiKTsKLQkJYXNzZXJ0RmFsc2UobHNuci53YWl0Rm9yRXZlbnRzKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbHNuci5pbmNyZW1lbnRDb3VudGVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGxzbnIuZGVjcmVtZW50Q291bnRlcik7CQkKLQl9Ci0JCi0JCi0JCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZUF0dHJpYnV0ZShTdHJpbmcgYXR0ck5hbWUpIHsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZGVsZXRlQXR0cmlidXRlKGpwdCwgYXR0ck5hbWUsIGZlYXR1cmVQcm92aWRlcik7Ci0JfQkKLQkKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEVudGl0eUF0dHJpYnV0ZXNDaGFuZ2VUZXN0TGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQkKLQkJcHJpdmF0ZSBTZW1hcGhvcmUgc2VtID0gbmV3IFNlbWFwaG9yZSgxKTsKLQkJCi0JCXByaXZhdGUgaW50IHRvQmVBZGRlZDsKLQkJcHJpdmF0ZSBpbnQgdG9CZVJlbW92ZTsKLQotCQlwdWJsaWMgRW50aXR5QXR0cmlidXRlc0NoYW5nZVRlc3RMaXN0ZW5lcihpbnQgYWRkLCBpbnQgcmVtb3ZlKSB7Ci0JCQl0aGlzLnRvQmVBZGRlZCA9IGFkZDsKLQkJCXRoaXMudG9CZVJlbW92ZSA9IHJlbW92ZTsKLQkJCXRyeSB7Ci0JCQkJc2VtLmFjcXVpcmUoMSk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gd2FpdEZvckV2ZW50cygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gc2VtLnRyeUFjcXVpcmUoNSwgVGltZVVuaXQuU0VDT05EUyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgaW5jcmVtZW50Q291bnRlciA9IDA7Ci0JCXB1YmxpYyBpbnQgZGVjcmVtZW50Q291bnRlciA9IDA7Ci0JCQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGFyZzApIHsKLQkJCWluY3JlbWVudENvdW50ZXIrKzsKLQkJCWlmKHRoaXMuaW5jcmVtZW50Q291bnRlciA+PSB0b0JlQWRkZWQgJiYgdGhpcy5kZWNyZW1lbnRDb3VudGVyPj0gdG9CZVJlbW92ZSApIHsKLQkJCQlzZW0ucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGFyZzApIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgYXJnMCkgewotCQkJZGVjcmVtZW50Q291bnRlcisrOwotCQkJaWYodGhpcy5pbmNyZW1lbnRDb3VudGVyID49IHRvQmVBZGRlZCAmJiB0aGlzLmRlY3JlbWVudENvdW50ZXI+PSB0b0JlUmVtb3ZlICkgewotCQkJCXNlbS5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgYXJnMCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgYXJnMCkgewotCQl9Ci0JfTsKLQkKLQlAQWZ0ZXIJCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlkZWxldGVBbGxQcm9qZWN0cygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGVsZXRlQWxsUHJvamVjdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IGpwYVByb2plY3QuZ2V0UHJvamVjdCgpOwotCQkJICAgIHByb2plY3QuY2xvc2UobW9uaXRvcik7CSAgICAJCi0JCQkgICAgcHJvamVjdC5jbG9zZShtb25pdG9yKTsKLQkJCSAgICBwcm9qZWN0LmRlbGV0ZSh0cnVlLCB0cnVlLCBtb25pdG9yKTsJCQkJCi0JCQl9Ci0JCX0gLCBtb25pdG9yKTsKLQl9CQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZVJlbGF0aW9uRmVhdHVyZXNUZXN0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlUmVsYXRpb25GZWF0dXJlc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwNjU5NS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlUmVsYXRpb25GZWF0dXJlc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVwbGF5OwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUFkZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5DcmVhdGVNYW55VG9NYW55QmlEaXJSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5DcmVhdGVNYW55VG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ3JlYXRlTWFueVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5DcmVhdGVNYW55VG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5DcmVhdGVPbmVUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5DcmVhdGVPbmVUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ3JlYXRlT25lVG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uLlJlbERpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uLlJlbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb01hbnlCaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5NYW55VG9NYW55VW5pRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb09uZUJpRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb09uZVVuaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5PbmVUb01hbnlVbmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuT25lVG9PbmVCaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5PbmVUb09uZVVuaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUVjbGlwc2VGYWNhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuSlBBQ3JlYXRlRmFjdG9yeTsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlUmVsYXRpb25GZWF0dXJlc1Rlc3QgewotCWZpbmFsIFN0cmluZyBURVNUX1BST0pFQ1QgPSAiVGVzdCI7Ci0JcHJpdmF0ZSBKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBudWxsOwotCXByaXZhdGUgSlBBQ3JlYXRlRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQlJRWNsaXBzZUZhY2FkZSBlY2xpcHNlRmFjYWRlID0gbnVsbDsKLQkKLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmFjdG9yeSA9IEpQQUNyZWF0ZUZhY3RvcnkuaW5zdGFuY2UoKTsKLQkJanBhUHJvamVjdCA9IGZhY3RvcnkuY3JlYXRlSlBBUHJvamVjdChURVNUX1BST0pFQ1QgKyAiXyIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0JCVRocmVhZC5zbGVlcCgyMDAwKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlT25lVG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwkKLQkJSUZpbGUgY3VzdG9tZXJGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQ3VzdG9tZXIiKTsKLQkJSUZpbGUgYWRkcmVzc0ZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJBZGRyZXNzIik7Ci0JCQotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCi0JCWFzc2VydFRydWUoY3VzdG9tZXJGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQ3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCQkKLQkJYXNzZXJ0VHJ1ZShhZGRyZXNzRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBhZGRyZXNzVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQWRkcmVzcyIpOwotCQlhc3NlcnROb3ROdWxsKGFkZHJlc3NUeXBlKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQxID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MiA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQotCQkKLQkJQ3JlYXRlT25lVG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmUgZnQgPSBuZXcgQ3JlYXRlT25lVG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyKTsKLQkJSUNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0IGN0eCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0LmNsYXNzKTsKLQkJCi0JCUNvbnRhaW5lclNoYXBlIGNzMSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29udGFpbmVyU2hhcGUuY2xhc3MpOwotCQlDb250YWluZXJTaGFwZSBjczIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbnRhaW5lclNoYXBlLmNsYXNzKTsKLQkJCi0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNzMSkpLmFuZFN0dWJSZXR1cm4odDEpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChjczIpKS5hbmRTdHViUmV0dXJuKHQyKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QodDEpKS5hbmRTdHViUmV0dXJuKGNzMSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KHQyKSkuYW5kU3R1YlJldHVybihjczIpOwotCQkKLQkJQW5jaG9yIGExID0gRWFzeU1vY2suY3JlYXRlTW9jayhBbmNob3IuY2xhc3MpOwotCQlBbmNob3IgYTIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEFuY2hvci5jbGFzcyk7Ci0JCWV4cGVjdChhMS5nZXRQYXJlbnQoKSkuYW5kU3R1YlJldHVybihjczEpOwotCQlleHBlY3QoYTIuZ2V0UGFyZW50KCkpLmFuZFN0dWJSZXR1cm4oY3MyKTsKLQkJZXhwZWN0KGN0eC5nZXRTb3VyY2VBbmNob3IoKSkuYW5kU3R1YlJldHVybihhMSk7Ci0JCWV4cGVjdChjdHguZ2V0VGFyZ2V0QW5jaG9yKCkpLmFuZFN0dWJSZXR1cm4oYTIpOwotCi0JCUlDb21waWxhdGlvblVuaXQgY3UxID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShjdXN0b21lckZpbGUpOwotCQljdTEuYmVjb21lV29ya2luZ0NvcHkobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UyID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShhZGRyZXNzRmlsZSk7Ci0JCWN1Mi5iZWNvbWVXb3JraW5nQ29weShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCi0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0Q29tcGlsYXRpb25Vbml0KHQxKSkuYW5kU3R1YlJldHVybihjdTEpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdCh0MikpLmFuZFN0dWJSZXR1cm4oY3UyKTsKLQkJCi0JCUNvbm5lY3Rpb24gY29ubiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29ubmVjdGlvbi5jbGFzcyk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuYWRkSWZQb3NzaWJsZSgoSUFkZENvbnRleHQpRWFzeU1vY2suYW55T2JqZWN0KCkpKS5hbmRTdHViUmV0dXJuKGNvbm4pOwotCQlyZXBsYXkoZmVhdHVyZVByb3ZpZGVyLCBhMSwgYTIsIGNzMSwgY3MyLCBjdHgpOwotCQlmdC5jcmVhdGUoY3R4KTsKLQkJT25lVG9PbmVVbmlEaXJSZWxhdGlvbiByZWwgPSBmdC5jcmVhdGVSZWxhdGlvbihmZWF0dXJlUHJvdmlkZXIsIGNzMSwgY3MyKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWwpOwotCQlhc3NlcnROb3ROdWxsKHJlbC5nZXRJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlbFR5cGUuT05FX1RPX09ORSwgcmVsLmdldFJlbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWxEaXIuVU5JLCByZWwuZ2V0UmVsRGlyKCkpOwkJCi0JCWFzc2VydFNhbWUocmVsLmdldE93bmVyKCksIHQxKTsKLQkJYXNzZXJ0U2FtZShyZWwuZ2V0SW52ZXJzZSgpLCB0Mik7Ci0JCWFzc2VydE5vdE51bGwodDEuZ2V0QXR0cmlidXRlTmFtZWQocmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQodDEpKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhID0gdDEuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydEZhbHNlKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzUmVsYXRpb25Bbm5vdGF0ZWQoanBhKSk7Ci0JCWpwYSA9IHQxLmdldEF0dHJpYnV0ZU5hbWVkKHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNSZWxhdGlvbkFubm90YXRlZChqcGEpKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlT25lVG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlci5jbGFzcyk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7CQotCQlJRmlsZSBjdXN0b21lckZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJDdXN0b21lciIpOwotCQlJRmlsZSBhZGRyZXNzRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSIsInRlc3QifSwgIkFkZHJlc3MiKTsKLQkJCi0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShjdXN0b21lckZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3VzdG9tZXJUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5DdXN0b21lciIpOwotCQlhc3NlcnROb3ROdWxsKGN1c3RvbWVyVHlwZSk7Ci0JCQotCQlhc3NlcnRUcnVlKGFkZHJlc3NGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGFkZHJlc3NUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5BZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwoYWRkcmVzc1R5cGUpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDEgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQlKYXZhUGVyc2lzdGVudFR5cGUgdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQyID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCi0JCQotCQlDcmVhdGVPbmVUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlIGZ0ID0gbmV3IENyZWF0ZU9uZVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyKTsKLQkJSUNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0IGN0eCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0LmNsYXNzKTsKLQkJCi0JCUNvbnRhaW5lclNoYXBlIGNzMSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29udGFpbmVyU2hhcGUuY2xhc3MpOwotCQlDb250YWluZXJTaGFwZSBjczIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbnRhaW5lclNoYXBlLmNsYXNzKTsKLQkJCi0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNzMSkpLmFuZFN0dWJSZXR1cm4odDEpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChjczIpKS5hbmRTdHViUmV0dXJuKHQyKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QodDEpKS5hbmRTdHViUmV0dXJuKGNzMSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KHQyKSkuYW5kU3R1YlJldHVybihjczIpOwotCQkKLQkJQW5jaG9yIGExID0gRWFzeU1vY2suY3JlYXRlTW9jayhBbmNob3IuY2xhc3MpOwotCQlBbmNob3IgYTIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEFuY2hvci5jbGFzcyk7Ci0JCWV4cGVjdChhMS5nZXRQYXJlbnQoKSkuYW5kU3R1YlJldHVybihjczEpOwotCQlleHBlY3QoYTIuZ2V0UGFyZW50KCkpLmFuZFN0dWJSZXR1cm4oY3MyKTsKLQkJZXhwZWN0KGN0eC5nZXRTb3VyY2VBbmNob3IoKSkuYW5kU3R1YlJldHVybihhMSk7Ci0JCWV4cGVjdChjdHguZ2V0VGFyZ2V0QW5jaG9yKCkpLmFuZFN0dWJSZXR1cm4oYTIpOwotCi0JCUlDb21waWxhdGlvblVuaXQgY3UxID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShjdXN0b21lckZpbGUpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1MiA9IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oYWRkcmVzc0ZpbGUpOwotCQkKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQodDEpKS5hbmRTdHViUmV0dXJuKGN1MSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0Q29tcGlsYXRpb25Vbml0KHQyKSkuYW5kU3R1YlJldHVybihjdTIpOwotCQkKLQkJQ29ubmVjdGlvbiBjb25uID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb25uZWN0aW9uLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5hZGRJZlBvc3NpYmxlKChJQWRkQ29udGV4dClFYXN5TW9jay5hbnlPYmplY3QoKSkpLmFuZFN0dWJSZXR1cm4oY29ubik7Ci0JCXJlcGxheShmZWF0dXJlUHJvdmlkZXIsIGExLCBhMiwgY3MxLCBjczIsIGN0eCk7Ci0JCWZ0LmNyZWF0ZShjdHgpOwotCQlPbmVUb09uZUJpRGlyUmVsYXRpb24gcmVsID0gZnQuY3JlYXRlUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCBjczEsIGNzMik7Ci0JCWFzc2VydE5vdE51bGwocmVsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWwuZ2V0SWQoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWxUeXBlLk9ORV9UT19PTkUsIHJlbC5nZXRSZWxUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVsRGlyLkJJLCByZWwuZ2V0UmVsRGlyKCkpOwotCQlhc3NlcnROb3ROdWxsKHQxLmdldEF0dHJpYnV0ZU5hbWVkKHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSkpOwotCQlhc3NlcnROb3ROdWxsKHQyLmdldEF0dHJpYnV0ZU5hbWVkKHJlbC5nZXRJbnZlcnNlQXR0cmlidXRlTmFtZSgpKSk7CQkKLQl9Ci0JCi0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTWFueVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCUlGaWxlIGN1c3RvbWVyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSIsInRlc3QifSwgIkN1c3RvbWVyIik7Ci0JCUlGaWxlIGFkZHJlc3NGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQWRkcmVzcyIpOwotCQkKLQkJanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQlhc3NlcnRUcnVlKGN1c3RvbWVyRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBjdXN0b21lclR5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS50ZXN0LkN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQkJCi0JCWFzc2VydFRydWUoYWRkcmVzc0ZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYWRkcmVzc1R5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS50ZXN0LkFkZHJlc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChhZGRyZXNzVHlwZSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDIgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0KLQkJCi0JCUNyZWF0ZU1hbnlUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZSBmdCA9IG5ldyBDcmVhdGVNYW55VG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyKTsKLQkJSUNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0IGN0eCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0LmNsYXNzKTsKLQkJCi0JCUNvbnRhaW5lclNoYXBlIGNzMSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29udGFpbmVyU2hhcGUuY2xhc3MpOwotCQlDb250YWluZXJTaGFwZSBjczIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbnRhaW5lclNoYXBlLmNsYXNzKTsKLQkJCi0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNzMSkpLmFuZFN0dWJSZXR1cm4odDEpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChjczIpKS5hbmRTdHViUmV0dXJuKHQyKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QodDEpKS5hbmRTdHViUmV0dXJuKGNzMSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KHQyKSkuYW5kU3R1YlJldHVybihjczIpOwotCQkKLQkJQW5jaG9yIGExID0gRWFzeU1vY2suY3JlYXRlTW9jayhBbmNob3IuY2xhc3MpOwotCQlBbmNob3IgYTIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEFuY2hvci5jbGFzcyk7Ci0JCWV4cGVjdChhMS5nZXRQYXJlbnQoKSkuYW5kU3R1YlJldHVybihjczEpOwotCQlleHBlY3QoYTIuZ2V0UGFyZW50KCkpLmFuZFN0dWJSZXR1cm4oY3MyKTsKLQkJZXhwZWN0KGN0eC5nZXRTb3VyY2VBbmNob3IoKSkuYW5kU3R1YlJldHVybihhMSk7Ci0JCWV4cGVjdChjdHguZ2V0VGFyZ2V0QW5jaG9yKCkpLmFuZFN0dWJSZXR1cm4oYTIpOwotCi0JCUlDb21waWxhdGlvblVuaXQgY3UxID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShjdXN0b21lckZpbGUpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1MiA9IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oYWRkcmVzc0ZpbGUpOwotCQkKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQodDEpKS5hbmRTdHViUmV0dXJuKGN1MSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0Q29tcGlsYXRpb25Vbml0KHQyKSkuYW5kU3R1YlJldHVybihjdTIpOwotCQkKLQkJQ29ubmVjdGlvbiBjb25uID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb25uZWN0aW9uLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5hZGRJZlBvc3NpYmxlKChJQWRkQ29udGV4dClFYXN5TW9jay5hbnlPYmplY3QoKSkpLmFuZFN0dWJSZXR1cm4oY29ubik7Ci0JCXJlcGxheShmZWF0dXJlUHJvdmlkZXIsIGExLCBhMiwgY3MxLCBjczIsIGN0eCk7Ci0JCWZ0LmNyZWF0ZShjdHgpOwotCQlNYW55VG9PbmVVbmlEaXJSZWxhdGlvbiByZWwgPSBmdC5jcmVhdGVSZWxhdGlvbihmZWF0dXJlUHJvdmlkZXIsIGNzMSwgY3MyKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWwpOwotCQlhc3NlcnROb3ROdWxsKHJlbC5nZXRJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlbFR5cGUuTUFOWV9UT19PTkUsIHJlbC5nZXRSZWxUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVsRGlyLlVOSSwgcmVsLmdldFJlbERpcigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0MS5nZXRBdHRyaWJ1dGVOYW1lZChyZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkpKTsKLQl9Ci0JCi0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTWFueVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwkKLQkJSUZpbGUgY3VzdG9tZXJGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQ3VzdG9tZXIiKTsKLQkJSUZpbGUgYWRkcmVzc0ZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJBZGRyZXNzIik7Ci0JCQotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCi0JCWFzc2VydFRydWUoY3VzdG9tZXJGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQ3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCQkKLQkJYXNzZXJ0VHJ1ZShhZGRyZXNzRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBhZGRyZXNzVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQWRkcmVzcyIpOwotCQlhc3NlcnROb3ROdWxsKGFkZHJlc3NUeXBlKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQxID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MiA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQotCQkKLQkJQ3JlYXRlTWFueVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmUgZnQgPSBuZXcgQ3JlYXRlTWFueVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyKTsKLQkJSUNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0IGN0eCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0LmNsYXNzKTsKLQkJCi0JCUNvbnRhaW5lclNoYXBlIGNzMSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29udGFpbmVyU2hhcGUuY2xhc3MpOwotCQlDb250YWluZXJTaGFwZSBjczIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbnRhaW5lclNoYXBlLmNsYXNzKTsKLQkJCi0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNzMSkpLmFuZFN0dWJSZXR1cm4odDEpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChjczIpKS5hbmRTdHViUmV0dXJuKHQyKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QodDEpKS5hbmRTdHViUmV0dXJuKGNzMSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KHQyKSkuYW5kU3R1YlJldHVybihjczIpOwotCQkKLQkJQW5jaG9yIGExID0gRWFzeU1vY2suY3JlYXRlTW9jayhBbmNob3IuY2xhc3MpOwotCQlBbmNob3IgYTIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEFuY2hvci5jbGFzcyk7Ci0JCWV4cGVjdChhMS5nZXRQYXJlbnQoKSkuYW5kU3R1YlJldHVybihjczEpOwotCQlleHBlY3QoYTIuZ2V0UGFyZW50KCkpLmFuZFN0dWJSZXR1cm4oY3MyKTsKLQkJZXhwZWN0KGN0eC5nZXRTb3VyY2VBbmNob3IoKSkuYW5kU3R1YlJldHVybihhMSk7Ci0JCWV4cGVjdChjdHguZ2V0VGFyZ2V0QW5jaG9yKCkpLmFuZFN0dWJSZXR1cm4oYTIpOwotCi0JCUlDb21waWxhdGlvblVuaXQgY3UxID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShjdXN0b21lckZpbGUpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1MiA9IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oYWRkcmVzc0ZpbGUpOwotCQkKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQodDEpKS5hbmRTdHViUmV0dXJuKGN1MSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0Q29tcGlsYXRpb25Vbml0KHQyKSkuYW5kU3R1YlJldHVybihjdTIpOwotCQkKLQkJQ29ubmVjdGlvbiBjb25uID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb25uZWN0aW9uLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5hZGRJZlBvc3NpYmxlKChJQWRkQ29udGV4dClFYXN5TW9jay5hbnlPYmplY3QoKSkpLmFuZFN0dWJSZXR1cm4oY29ubik7Ci0JCXJlcGxheShmZWF0dXJlUHJvdmlkZXIsIGExLCBhMiwgY3MxLCBjczIsIGN0eCk7Ci0JCWZ0LmNyZWF0ZShjdHgpOwotCQlNYW55VG9PbmVCaURpclJlbGF0aW9uIHJlbCA9IGZ0LmNyZWF0ZVJlbGF0aW9uKGZlYXR1cmVQcm92aWRlciwgY3MxLCBjczIpOwotCQlhc3NlcnROb3ROdWxsKHJlbCk7Ci0JCWFzc2VydE5vdE51bGwocmVsLmdldElkKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVsVHlwZS5NQU5ZX1RPX09ORSwgcmVsLmdldFJlbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWxEaXIuQkksIHJlbC5nZXRSZWxEaXIoKSk7Ci0JCWFzc2VydE5vdE51bGwodDEuZ2V0QXR0cmlidXRlTmFtZWQocmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKSk7Ci0JCWFzc2VydE5vdE51bGwodDIuZ2V0QXR0cmlidXRlTmFtZWQocmVsLmdldEludmVyc2VBdHRyaWJ1dGVOYW1lKCkpKTsJCQotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVPbmVUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwkKLQkJSUZpbGUgY3VzdG9tZXJGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQ3VzdG9tZXIiKTsKLQkJSUZpbGUgYWRkcmVzc0ZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJBZGRyZXNzIik7Ci0JCQotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCi0JCWFzc2VydFRydWUoY3VzdG9tZXJGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQ3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCQkKLQkJYXNzZXJ0VHJ1ZShhZGRyZXNzRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBhZGRyZXNzVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQWRkcmVzcyIpOwotCQlhc3NlcnROb3ROdWxsKGFkZHJlc3NUeXBlKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQxID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MiA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQotCQkKLQkJQ3JlYXRlT25lVG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlIGZ0ID0gbmV3IENyZWF0ZU9uZVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZShmZWF0dXJlUHJvdmlkZXIpOwotCQlJQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQgY3R4ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQuY2xhc3MpOwotCQkKLQkJQ29udGFpbmVyU2hhcGUgY3MxID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb250YWluZXJTaGFwZS5jbGFzcyk7Ci0JCUNvbnRhaW5lclNoYXBlIGNzMiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29udGFpbmVyU2hhcGUuY2xhc3MpOwotCQkKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY3MxKSkuYW5kU3R1YlJldHVybih0MSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNzMikpLmFuZFN0dWJSZXR1cm4odDIpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdCh0MSkpLmFuZFN0dWJSZXR1cm4oY3MxKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QodDIpKS5hbmRTdHViUmV0dXJuKGNzMik7Ci0JCQotCQlBbmNob3IgYTEgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEFuY2hvci5jbGFzcyk7Ci0JCUFuY2hvciBhMiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQW5jaG9yLmNsYXNzKTsKLQkJZXhwZWN0KGExLmdldFBhcmVudCgpKS5hbmRTdHViUmV0dXJuKGNzMSk7Ci0JCWV4cGVjdChhMi5nZXRQYXJlbnQoKSkuYW5kU3R1YlJldHVybihjczIpOwotCQlleHBlY3QoY3R4LmdldFNvdXJjZUFuY2hvcigpKS5hbmRTdHViUmV0dXJuKGExKTsKLQkJZXhwZWN0KGN0eC5nZXRUYXJnZXRBbmNob3IoKSkuYW5kU3R1YlJldHVybihhMik7Ci0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTEgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGN1c3RvbWVyRmlsZSk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UyID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShhZGRyZXNzRmlsZSk7Ci0JCQotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdCh0MSkpLmFuZFN0dWJSZXR1cm4oY3UxKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQodDIpKS5hbmRTdHViUmV0dXJuKGN1Mik7Ci0JCQotCQlDb25uZWN0aW9uIGNvbm4gPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbm5lY3Rpb24uY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmFkZElmUG9zc2libGUoKElBZGRDb250ZXh0KUVhc3lNb2NrLmFueU9iamVjdCgpKSkuYW5kU3R1YlJldHVybihjb25uKTsKLQkJcmVwbGF5KGZlYXR1cmVQcm92aWRlciwgYTEsIGEyLCBjczEsIGNzMiwgY3R4KTsKLQkJZnQuY3JlYXRlKGN0eCk7Ci0JCU9uZVRvTWFueVVuaURpclJlbGF0aW9uIHJlbCA9IGZ0LmNyZWF0ZVJlbGF0aW9uKGZlYXR1cmVQcm92aWRlciwgY3MxLCBjczIpOwotCQlhc3NlcnROb3ROdWxsKHJlbCk7Ci0JCWFzc2VydE5vdE51bGwocmVsLmdldElkKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVsVHlwZS5PTkVfVE9fTUFOWSwgcmVsLmdldFJlbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWxEaXIuVU5JLCByZWwuZ2V0UmVsRGlyKCkpOwkKLQkJYXNzZXJ0Tm90TnVsbCh0MS5nZXRBdHRyaWJ1dGVOYW1lZChyZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkpKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTWFueVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlci5jbGFzcyk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7CQotCQlJRmlsZSBjdXN0b21lckZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJDdXN0b21lciIpOwotCQlJRmlsZSBhZGRyZXNzRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSIsInRlc3QifSwgIkFkZHJlc3MiKTsKLQkJCi0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShjdXN0b21lckZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3VzdG9tZXJUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5DdXN0b21lciIpOwotCQlhc3NlcnROb3ROdWxsKGN1c3RvbWVyVHlwZSk7Ci0JCQotCQlhc3NlcnRUcnVlKGFkZHJlc3NGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGFkZHJlc3NUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5BZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwoYWRkcmVzc1R5cGUpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDEgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQlKYXZhUGVyc2lzdGVudFR5cGUgdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQyID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCi0JCQotCQlDcmVhdGVNYW55VG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlIGZ0ID0gbmV3IENyZWF0ZU1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyKTsKLQkJSUNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0IGN0eCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0LmNsYXNzKTsKLQkJCi0JCUNvbnRhaW5lclNoYXBlIGNzMSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29udGFpbmVyU2hhcGUuY2xhc3MpOwotCQlDb250YWluZXJTaGFwZSBjczIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbnRhaW5lclNoYXBlLmNsYXNzKTsKLQkJCi0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNzMSkpLmFuZFN0dWJSZXR1cm4odDEpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChjczIpKS5hbmRTdHViUmV0dXJuKHQyKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QodDEpKS5hbmRTdHViUmV0dXJuKGNzMSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KHQyKSkuYW5kU3R1YlJldHVybihjczIpOwotCQkKLQkJQW5jaG9yIGExID0gRWFzeU1vY2suY3JlYXRlTW9jayhBbmNob3IuY2xhc3MpOwotCQlBbmNob3IgYTIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEFuY2hvci5jbGFzcyk7Ci0JCWV4cGVjdChhMS5nZXRQYXJlbnQoKSkuYW5kU3R1YlJldHVybihjczEpOwotCQlleHBlY3QoYTIuZ2V0UGFyZW50KCkpLmFuZFN0dWJSZXR1cm4oY3MyKTsKLQkJZXhwZWN0KGN0eC5nZXRTb3VyY2VBbmNob3IoKSkuYW5kU3R1YlJldHVybihhMSk7Ci0JCWV4cGVjdChjdHguZ2V0VGFyZ2V0QW5jaG9yKCkpLmFuZFN0dWJSZXR1cm4oYTIpOwotCi0JCUlDb21waWxhdGlvblVuaXQgY3UxID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShjdXN0b21lckZpbGUpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1MiA9IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oYWRkcmVzc0ZpbGUpOwotCQkKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQodDEpKS5hbmRTdHViUmV0dXJuKGN1MSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0Q29tcGlsYXRpb25Vbml0KHQyKSkuYW5kU3R1YlJldHVybihjdTIpOwotCQkKLQkJQ29ubmVjdGlvbiBjb25uID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb25uZWN0aW9uLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5hZGRJZlBvc3NpYmxlKChJQWRkQ29udGV4dClFYXN5TW9jay5hbnlPYmplY3QoKSkpLmFuZFN0dWJSZXR1cm4oY29ubik7Ci0JCXJlcGxheShmZWF0dXJlUHJvdmlkZXIsIGExLCBhMiwgY3MxLCBjczIsIGN0eCk7Ci0JCWZ0LmNyZWF0ZShjdHgpOwotCQlNYW55VG9NYW55VW5pRGlyUmVsYXRpb24gcmVsID0gZnQuY3JlYXRlUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCBjczEsIGNzMik7Ci0JCWFzc2VydE5vdE51bGwocmVsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWwuZ2V0SWQoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWxUeXBlLk1BTllfVE9fTUFOWSwgcmVsLmdldFJlbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWxEaXIuVU5JLCByZWwuZ2V0UmVsRGlyKCkpOwkKLQkJYXNzZXJ0Tm90TnVsbCh0MS5nZXRBdHRyaWJ1dGVOYW1lZChyZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkpKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTWFueVRvTWFueUJpRGlyUmVsYXRpb25GZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCUlGaWxlIGN1c3RvbWVyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSIsInRlc3QifSwgIkN1c3RvbWVyIik7Ci0JCUlGaWxlIGFkZHJlc3NGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQWRkcmVzcyIpOwotCQkKLQkJanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQlhc3NlcnRUcnVlKGN1c3RvbWVyRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBjdXN0b21lclR5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS50ZXN0LkN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQkJCi0JCWFzc2VydFRydWUoYWRkcmVzc0ZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYWRkcmVzc1R5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS50ZXN0LkFkZHJlc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChhZGRyZXNzVHlwZSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDIgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0KLQkJCi0JCUNyZWF0ZU1hbnlUb01hbnlCaURpclJlbGF0aW9uRmVhdHVyZSBmdCA9IG5ldyBDcmVhdGVNYW55VG9NYW55QmlEaXJSZWxhdGlvbkZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyKTsKLQkJSUNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0IGN0eCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0LmNsYXNzKTsKLQkJCi0JCUNvbnRhaW5lclNoYXBlIGNzMSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29udGFpbmVyU2hhcGUuY2xhc3MpOwotCQlDb250YWluZXJTaGFwZSBjczIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbnRhaW5lclNoYXBlLmNsYXNzKTsKLQkJCi0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNzMSkpLmFuZFN0dWJSZXR1cm4odDEpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChjczIpKS5hbmRTdHViUmV0dXJuKHQyKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QodDEpKS5hbmRTdHViUmV0dXJuKGNzMSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KHQyKSkuYW5kU3R1YlJldHVybihjczIpOwotCQkKLQkJQW5jaG9yIGExID0gRWFzeU1vY2suY3JlYXRlTW9jayhBbmNob3IuY2xhc3MpOwotCQlBbmNob3IgYTIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEFuY2hvci5jbGFzcyk7Ci0JCWV4cGVjdChhMS5nZXRQYXJlbnQoKSkuYW5kU3R1YlJldHVybihjczEpOwotCQlleHBlY3QoYTIuZ2V0UGFyZW50KCkpLmFuZFN0dWJSZXR1cm4oY3MyKTsKLQkJZXhwZWN0KGN0eC5nZXRTb3VyY2VBbmNob3IoKSkuYW5kU3R1YlJldHVybihhMSk7Ci0JCWV4cGVjdChjdHguZ2V0VGFyZ2V0QW5jaG9yKCkpLmFuZFN0dWJSZXR1cm4oYTIpOwotCi0JCUlDb21waWxhdGlvblVuaXQgY3UxID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShjdXN0b21lckZpbGUpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1MiA9IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oYWRkcmVzc0ZpbGUpOwotCQkKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQodDEpKS5hbmRTdHViUmV0dXJuKGN1MSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0Q29tcGlsYXRpb25Vbml0KHQyKSkuYW5kU3R1YlJldHVybihjdTIpOwotCQkKLQkJQ29ubmVjdGlvbiBjb25uID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb25uZWN0aW9uLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5hZGRJZlBvc3NpYmxlKChJQWRkQ29udGV4dClFYXN5TW9jay5hbnlPYmplY3QoKSkpLmFuZFN0dWJSZXR1cm4oY29ubik7Ci0JCXJlcGxheShmZWF0dXJlUHJvdmlkZXIsIGExLCBhMiwgY3MxLCBjczIsIGN0eCk7Ci0JCWZ0LmNyZWF0ZShjdHgpOwotCQlNYW55VG9NYW55QmlEaXJSZWxhdGlvbiByZWwgPSBmdC5jcmVhdGVSZWxhdGlvbihmZWF0dXJlUHJvdmlkZXIsIGNzMSwgY3MyKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWwpOwotCQlhc3NlcnROb3ROdWxsKHJlbC5nZXRJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlbFR5cGUuTUFOWV9UT19NQU5ZLCByZWwuZ2V0UmVsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlbERpci5CSSwgcmVsLmdldFJlbERpcigpKTsJCi0JCWFzc2VydE5vdE51bGwodDEuZ2V0QXR0cmlidXRlTmFtZWQocmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKSk7Ci0JCWFzc2VydE5vdE51bGwodDIuZ2V0QXR0cmlidXRlTmFtZWQocmVsLmdldEludmVyc2VBdHRyaWJ1dGVOYW1lKCkpKTsJCQotCX0KLQkKLQkKLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZmlsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvRGVsZXRlUmVsYXRpb25GZWF0dXJlVGVzdC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9mZWF0dXJlL0RlbGV0ZVJlbGF0aW9uRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RjYjgzYy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvRGVsZXRlUmVsYXRpb25GZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmlzQTsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlcGxheTsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5kdC5JRGlhZ3JhbVR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklEZWxldGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5EZWxldGVSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSUJpZGlyZWN0aW9uYWxSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklKUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLnV0aWwuSUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFNpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBEZWxldGVSZWxhdGlvbkZlYXR1cmVUZXN0IHsJCQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFBvc3REZWxldGUoKXsJCQotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlci5jbGFzcyk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0UmVtb3ZlRmVhdHVyZShpc0EoSVJlbW92ZUNvbnRleHQuY2xhc3MpKSkuYW5kUmV0dXJuKG51bGwpOwotCQlJSlBBRWRpdG9yVXRpbCB1dCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQUVkaXRvclV0aWwuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEpQQUVkaXRvclV0aWwoKSkuYW5kU3R1YlJldHVybih1dCk7Ci0JCUlEZWxldGVDb250ZXh0IGN0eCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSURlbGV0ZUNvbnRleHQuY2xhc3MpOwotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gRWFzeU1vY2suY3JlYXRlTW9jayhQaWN0b2dyYW1FbGVtZW50LmNsYXNzKTsKLQkJZXhwZWN0KGN0eC5nZXRQaWN0b2dyYW1FbGVtZW50KCkpLmFuZFN0dWJSZXR1cm4ocGUpOwotCQlJQmlkaXJlY3Rpb25hbFJlbGF0aW9uIHJlbCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUJpZGlyZWN0aW9uYWxSZWxhdGlvbi5jbGFzcyk7IAotCQlJQ29tcGlsYXRpb25Vbml0IGN1MSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUNvbXBpbGF0aW9uVW5pdC5jbGFzcyk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJQ29tcGlsYXRpb25Vbml0LmNsYXNzKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdDEgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEphdmFQZXJzaXN0ZW50VHlwZS5jbGFzcyk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQyID0gRWFzeU1vY2suY3JlYXRlTW9jayhKYXZhUGVyc2lzdGVudFR5cGUuY2xhc3MpOwotCi0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKSkuYW5kU3R1YlJldHVybihyZWwpOwotCQlleHBlY3QocmVsLmdldE93bmVyKCkpLmFuZFN0dWJSZXR1cm4oanB0MSk7Ci0JCWV4cGVjdChyZWwuZ2V0SW52ZXJzZSgpKS5hbmRTdHViUmV0dXJuKGpwdDIpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdChqcHQxKSkuYW5kU3R1YlJldHVybihjdTEpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdChqcHQyKSkuYW5kU3R1YlJldHVybihjdTIpOwotCQkKLQkJSVdvcmtiZW5jaFBhcnRTaXRlIHdzID0gRWFzeU1vY2suY3JlYXRlTW9jayhJV29ya2JlbmNoUGFydFNpdGUuY2xhc3MpOwotCQkKLQkJSURpYWdyYW1UeXBlUHJvdmlkZXIgcCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSURpYWdyYW1UeXBlUHJvdmlkZXIuY2xhc3MpOwotCQlJRWRpdG9yIGUgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElFZGl0b3IuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKSkuYW5kU3R1YlJldHVybihwKTsKLQkJZXhwZWN0KHAuZ2V0RGlhZ3JhbUVkaXRvcigpKS5hbmRTdHViUmV0dXJuKGUpOwotCQlleHBlY3QoZS5nZXRTaXRlKCkpLmFuZFN0dWJSZXR1cm4od3MpOwotCQl1dC5vcmdhbml6ZUltcG9ydHMoY3UxLCB3cyk7Ci0JCXV0Lm9yZ2FuaXplSW1wb3J0cyhjdTIsIHdzKTsKLQkJCi0JCXJlcGxheShmZWF0dXJlUHJvdmlkZXIsIGN0eCwgdXQsIHJlbCwganB0MSwganB0MiwgY3UxLCBjdTIsIHBlLCBwLCBlLCB3cyk7Ci0JCQotCQlEZWxldGVSZWxhdGlvbkZlYXR1cmUgZmVhdHVyZSA9IG5ldyBEZWxldGVSZWxhdGlvbkZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyKTsJCQotCQlmZWF0dXJlLnBvc3REZWxldGUoY3R4KTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9EaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZVRlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9EaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ4ZWUwZC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvRGlyZWN0RWRpdEF0dHJpYnV0ZUZlYXR1cmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suaXNBOwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVwbGF5OwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklEaXJlY3RFZGl0aW5nRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSURpcmVjdEVkaXRpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb252ZW50aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuRGlyZWN0RWRpdEF0dHJpYnV0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBEaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZVRlc3QgewotCi0JLyoqCi0JICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tWYWx1ZVZhbGlkU3RyaW5nQnlKYXZhQ29udmVudGlvbnMoKSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBFYXN5TW9jay5jcmVhdGVOaWNlTW9jayhKYXZhUGVyc2lzdGVudFR5cGUuY2xhc3MpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEgPSBjb25maWd1cmVKcGFGb3JKcHQoanB0KTsKLQkJZXhwZWN0KGpwdC5nZXRBdHRyaWJ1dGVOYW1lZChpc0EoU3RyaW5nLmNsYXNzKSkpLmFuZFN0dWJSZXR1cm4oanBhKTsKLQkJcmVwbGF5KGpwYSwganB0KTsKLQotCQlJRmVhdHVyZVByb3ZpZGVyIHByb3ZpZGVyID0gcmVwbGF5SnBhRm9yTnVsbFBlKGpwYSk7Ci0JCUlEaXJlY3RFZGl0aW5nQ29udGV4dCBjb250ZXh0ID0gcmVwbGF5TnVsbFBlQ29udGV4dCgpOwotCi0JCUlEaXJlY3RFZGl0aW5nRmVhdHVyZSBmZWF0dXJlID0gbmV3IERpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlKHByb3ZpZGVyKTsKLQkJYXNzZXJ0Tm90VmFsaWRKYXZhQ29udmVudGlvbkZpZWxkKGZlYXR1cmUsIGNvbnRleHQsICIiKTsKLQkJYXNzZXJ0Tm90VmFsaWRKYXZhQ29udmVudGlvbkZpZWxkKGZlYXR1cmUsIGNvbnRleHQsICIxYSIpOwotCQlhc3NlcnROb3RWYWxpZEphdmFDb252ZW50aW9uRmllbGQoZmVhdHVyZSwgY29udGV4dCwgImQgZCIpOwotCQlhc3NlcnRWYWxpZEZpZWxkKGZlYXR1cmUsIGNvbnRleHQsICIkZCIpOwotCQlhc3NlcnROb3RWYWxpZEphdmFDb252ZW50aW9uRmllbGQoZmVhdHVyZSwgY29udGV4dCwgImVudW0iKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDaGVja1ZhbHVlVmFsaWRTdHJpbmdEdXBsaWNhdGVBdHRyaWJ1dGUoKSB7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG90aGVySnBhID0gRWFzeU1vY2suY3JlYXRlTW9jayhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5jbGFzcyk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEphdmFQZXJzaXN0ZW50VHlwZS5jbGFzcyk7Ci0JCWV4cGVjdChqcHQuZ2V0QXR0cmlidXRlTmFtZWQoImF0dHJOYW1lIikpLmFuZFN0dWJSZXR1cm4ob3RoZXJKcGEpOwotCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSA9IGNvbmZpZ3VyZUpwYUZvckpwdChqcHQpOwotCQlyZXBsYXkoanBhLCBqcHQsIG90aGVySnBhKTsKLQotCQlJRmVhdHVyZVByb3ZpZGVyIHByb3ZpZGVyID0gcmVwbGF5SnBhRm9yTnVsbFBlKGpwYSk7Ci0JCUlEaXJlY3RFZGl0aW5nQ29udGV4dCBjb250ZXh0ID0gcmVwbGF5TnVsbFBlQ29udGV4dCgpOwotCi0JCUlEaXJlY3RFZGl0aW5nRmVhdHVyZSBmZWF0dXJlID0gbmV3IERpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlKHByb3ZpZGVyKTsKLQotCQlhc3NlcnRFcXVhbHMoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSlBBRWRpdG9yTWVzc2FnZXMuRGlyZWN0RWRpdEF0dHJpYnV0ZUZlYXR1cmVfYXR0cmlidXRlRXhpc3RzLCAiYXR0ck5hbWUiKSwgZmVhdHVyZS5jaGVja1ZhbHVlVmFsaWQoImF0dHJOYW1lIiwgY29udGV4dCkpOwotCX0KLQotCXByaXZhdGUgSUZlYXR1cmVQcm92aWRlciByZXBsYXlKcGFGb3JOdWxsUGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCUlGZWF0dXJlUHJvdmlkZXIgcHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlleHBlY3QocHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KG51bGwpKS5hbmRTdHViUmV0dXJuKGpwYSk7Ci0JCXJlcGxheShwcm92aWRlcik7Ci0JCXJldHVybiBwcm92aWRlcjsKLQl9Ci0KLQlwcml2YXRlIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbmZpZ3VyZUpwYUZvckpwdChKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuY2xhc3MpOwotCQlleHBlY3QoanBhLmdldFBhcmVudCgpKS5hbmRTdHViUmV0dXJuKGpwdCk7Ci0JCXJldHVybiBqcGE7Ci0JfQotCi0JcHJpdmF0ZSBJRGlyZWN0RWRpdGluZ0NvbnRleHQgcmVwbGF5TnVsbFBlQ29udGV4dCgpIHsKLQkJSURpcmVjdEVkaXRpbmdDb250ZXh0IGNvbnRleHQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElEaXJlY3RFZGl0aW5nQ29udGV4dC5jbGFzcyk7Ci0JCWV4cGVjdChjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKSkuYW5kU3R1YlJldHVybihudWxsKTsKLQkJcmVwbGF5KGNvbnRleHQpOwotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXNzZXJ0VmFsaWRGaWVsZChJRGlyZWN0RWRpdGluZ0ZlYXR1cmUgZmVhdHVyZSwgSURpcmVjdEVkaXRpbmdDb250ZXh0IGNvbnRleHQsIFN0cmluZyBmaWVsZCkgewotCQlhc3NlcnRFcXVhbHMobnVsbCwgZmVhdHVyZS5jaGVja1ZhbHVlVmFsaWQoZmllbGQsIGNvbnRleHQpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXNzZXJ0Tm90VmFsaWRKYXZhQ29udmVudGlvbkZpZWxkKElEaXJlY3RFZGl0aW5nRmVhdHVyZSBmZWF0dXJlLCBJRGlyZWN0RWRpdGluZ0NvbnRleHQgY29udGV4dCwKLQkJCVN0cmluZyBmaWVsZCkgewotCQlmaW5hbCBTdHJpbmcgc291cmNlTGV2ZWwgPSAiMS41IjsKLQkJZmluYWwgU3RyaW5nIGNvbXBsaWFuY2VMZXZlbCA9ICIxLjUiOwotCQlhc3NlcnRFcXVhbHMoSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlRmllbGROYW1lKGZpZWxkLCBzb3VyY2VMZXZlbCwgY29tcGxpYW5jZUxldmVsKS5nZXRNZXNzYWdlKCksIGZlYXR1cmUKLQkJCQkuY2hlY2tWYWx1ZVZhbGlkKGZpZWxkLCBjb250ZXh0KSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvTGF5b3V0RW50aXR5RmVhdHVyZVRlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9MYXlvdXRFbnRpdHlGZWF0dXJlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmYzNzFmLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9MYXlvdXRFbnRpdHlGZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWFzeW1vY2suRWFzeU1vY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklMYXlvdXRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuR3JhcGhpY3NBbGdvcml0aG07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuTGF5b3V0SlBBRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUdyYXBoaWNzVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklQZVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgTGF5b3V0RW50aXR5RmVhdHVyZVRlc3QgewotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SWZOZXdseUFkZGVkRW50aXR5U2hhcGVJc0V4cGFuZGVkKCkgewotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQkJSUxheW91dENvbnRleHQgY3R4ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJTGF5b3V0Q29udGV4dC5jbGFzcyk7Ci0JCUNvbnRhaW5lclNoYXBlIGNzID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb250YWluZXJTaGFwZS5jbGFzcyk7Ci0JCUdyYXBoaWNzQWxnb3JpdGhtIGdhID0gRWFzeU1vY2suY3JlYXRlTW9jayhHcmFwaGljc0FsZ29yaXRobS5jbGFzcyk7Ci0JCUVhc3lNb2NrLmV4cGVjdChjcy5nZXRHcmFwaGljc0FsZ29yaXRobSgpKS5hbmRTdHViUmV0dXJuKGdhKTsKLQkJRWFzeU1vY2suZXhwZWN0KGN0eC5nZXRQaWN0b2dyYW1FbGVtZW50KCkpLmFuZFN0dWJSZXR1cm4oY3MpOwotCQlFYXN5TW9jay5leHBlY3QoZ2EuZ2V0SGVpZ2h0KCkpLmFuZFN0dWJSZXR1cm4oODApOwotCQlFYXN5TW9jay5leHBlY3QoZ2EuZ2V0V2lkdGgoKSkuYW5kU3R1YlJldHVybigxMDApOwotCQkvL0Vhc3lNb2NrLmV4cGVjdChjcy5pc19fX0FsaXZlKCkpLmFuZFN0dWJSZXR1cm4odHJ1ZSk7Ci0JCUVMaXN0PFNoYXBlPiBzaExpc3QgPSBuZXcgQmFzaWNJbnRlcm5hbEVMaXN0PFNoYXBlPihTaGFwZS5jbGFzcyk7IAotCQlFYXN5TW9jay5leHBlY3QoY3MuZ2V0Q2hpbGRyZW4oKSkuYW5kU3R1YlJldHVybihzaExpc3QpOwotCQlJUGVTZXJ2aWNlVXRpbCBwZVV0aWwgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElQZVNlcnZpY2VVdGlsLmNsYXNzKTsKLQkJRWFzeU1vY2suZXhwZWN0KGZwLmdldFBlU2VydmljZVV0aWwoKSkuYW5kU3R1YlJldHVybihwZVV0aWwpOwotCQlFYXN5TW9jay5leHBlY3QocGVVdGlsLmdldFByb3BlcnR5KGNzLCBKUEFFZGl0b3JDb25zdGFudHMuQ09MTEFQU0VfRkVBVFVSRVMpKS5hbmRTdHViUmV0dXJuKG51bGwpOwotCQlFYXN5TW9jay5leHBlY3QocGVVdGlsLnJlbW92ZVByb3BlcnR5KGNzLCBKUEFFZGl0b3JDb25zdGFudHMuQ09MTEFQU0VfRkVBVFVSRVMpKS5hbmRTdHViUmV0dXJuKGZhbHNlKTsKLQkJSUdyYXBoaWNzVXBkYXRlciBndSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUdyYXBoaWNzVXBkYXRlci5jbGFzcyk7Ci0JCUVhc3lNb2NrLmV4cGVjdChmcC5nZXRHcmFwaGljc1VwZGF0ZXIoKSkuYW5kU3R1YlJldHVybihndSk7Ci0JCWd1LnVwZGF0ZUVudGl0eUhlaWd0aChjcyk7Ci0JCQotCQlFYXN5TW9jay5yZXBsYXkoZnAsIGN0eCwgY3MsIGdhLCBwZVV0aWwsIGd1KTsJCQotCQlMYXlvdXRKUEFFbnRpdHlGZWF0dXJlIGZ0ID0gbmV3IExheW91dEpQQUVudGl0eUZlYXR1cmUoZnApOwkJCi0JCWZ0LmxheW91dChjdHgpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9PcGVuTWluaWF0dXJlVmlld0ZlYXR1cmVUZXN0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvT3Blbk1pbmlhdHVyZVZpZXdGZWF0dXJlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGI5NWE1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9PcGVuTWluaWF0dXJlVmlld0ZlYXR1cmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suaXNBOwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVwbGF5OwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci0KLWltcG9ydCBvcmcuZWFzeW1vY2suRWFzeU1vY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQWRkQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLk9wZW5NaW5pYXR1cmVWaWV3RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLkpQQUNyZWF0ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIE9wZW5NaW5pYXR1cmVWaWV3RmVhdHVyZVRlc3QgewotCQotCXByaXZhdGUgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXI7Ci0JZmluYWwgU3RyaW5nIFRFU1RfUFJPSkVDVCA9ICJUZXN0IjsKLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBKUEFDcmVhdGVGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwkKLQkKLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uewotCQlmYWN0b3J5ID0gSlBBQ3JlYXRlRmFjdG9yeS5pbnN0YW5jZSgpOwotCQlqcGFQcm9qZWN0ID0gZmFjdG9yeS5jcmVhdGVKUEFQcm9qZWN0KFRFU1RfUFJPSkVDVCArICJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLQkJSUZpbGUgZW50aXR5ID0gZmFjdG9yeS5jcmVhdGVFbnRpdHkoanBhUHJvamVjdCwgIm9yZy5lY2xpcHNlLkVudGl0eTEiKTsKLQkJVGhyZWFkLnNsZWVwKDIwMDApOwotCQlmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChudWxsKSkuYW5kUmV0dXJuKEpQQUNyZWF0ZUZhY3RvcnkuZ2V0UGVyc2lzdGVudFR5cGUoZW50aXR5KSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0Q29tcGlsYXRpb25Vbml0KGlzQShKYXZhUGVyc2lzdGVudFR5cGUuY2xhc3MpKSkuYW5kUmV0dXJuKEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZW50aXR5KSkuYW55VGltZXMoKTsKLQkJcmVwbGF5KGZlYXR1cmVQcm92aWRlcik7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGUoKSB7Ci0JCU9wZW5NaW5pYXR1cmVWaWV3RmVhdHVyZSBmdCA9IG5ldyBPcGVuTWluaWF0dXJlVmlld0ZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyKTsKLQkJSUFkZENvbnRleHQgY3R4ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJQWRkQ29udGV4dC5jbGFzcyk7Ci0JCWZ0LmV4ZWN1dGUoY3R4KTsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9SZWZhY3RvckF0dHJpYnV0ZVR5cGVGZWF0dXJlVGVzdC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9mZWF0dXJlL1JlZmFjdG9yQXR0cmlidXRlVHlwZUZlYXR1cmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNjAwMzEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9mZWF0dXJlL1JlZmFjdG9yQXR0cmlidXRlVHlwZUZlYXR1cmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVwbGF5OwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlJlZmFjdG9yQXR0cmlidXRlVHlwZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuSlBBQ3JlYXRlRmFjdG9yeTsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgUmVmYWN0b3JBdHRyaWJ1dGVUeXBlRmVhdHVyZVRlc3QgewotCQotCXByaXZhdGUgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXI7Ci0JcHJpdmF0ZSBJQ3VzdG9tQ29udGV4dCBjb250ZXh0OwotCWZpbmFsIFN0cmluZyBURVNUX1BST0pFQ1QgPSAiVGVzdCIrKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBKUEFDcmVhdGVGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCXByaXZhdGUgSUZpbGUgZW50aXR5OwotCQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb257Ci0JCWZhY3RvcnkgPSBKUEFDcmVhdGVGYWN0b3J5Lmluc3RhbmNlKCk7Ci0JCWpwYVByb2plY3QgPSBmYWN0b3J5LmNyZWF0ZUpQQVByb2plY3QoVEVTVF9QUk9KRUNUICsgIl8iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwotCQllbnRpdHkgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eShqcGFQcm9qZWN0LCAib3JnLmVjbGlwc2UuRW50Iik7Ci0JCVRocmVhZC5zbGVlcCgyMDAwKTsKLQkJZmFjdG9yeS5hZGRBdHRyaWJ1dGVzKGVudGl0eSwgImF0dCIsICJqYXZhLmxhbmcuU3RyaW5nIiwgIiIsICJhdHQiLCBmYWxzZSk7Ci0JCQotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RSZWZhY3RvckF0dHJpYnV0ZVR5cGVGZWF0dXJlKCl7Ci0JCVBpY3RvZ3JhbUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBQaWN0b2dyYW1FbGVtZW50WzFdOwotCQlQaWN0b2dyYW1FbGVtZW50IGVsZW1lbnQgPSBFYXN5TW9jay5jcmVhdGVOaWNlTW9jayhQaWN0b2dyYW1FbGVtZW50LmNsYXNzKTsKLQkJcmVwbGF5KGVsZW1lbnQpOwotCQllbGVtZW50c1swXSA9IGVsZW1lbnQ7Ci0JCQotCQlmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChlbGVtZW50KSkuYW5kUmV0dXJuKG51bGwpOwotCQlyZXBsYXkoZmVhdHVyZVByb3ZpZGVyKTsKLQkJCi0JCWNvbnRleHQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElDdXN0b21Db250ZXh0LmNsYXNzKTsKLQkJZXhwZWN0KGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudHMoKSkuYW5kUmV0dXJuKGVsZW1lbnRzKTsKLQkJcmVwbGF5KGNvbnRleHQpOwotCQkKLQkJUmVmYWN0b3JBdHRyaWJ1dGVUeXBlRmVhdHVyZSBmZWF0dXJlID0gbmV3IFJlZmFjdG9yQXR0cmlidXRlVHlwZUZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyKTsKLQkJZmVhdHVyZS5leGVjdXRlKGNvbnRleHQpOwotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVVdGlscygpewotCQlQZXJzaXN0ZW5jZVVuaXQgcHUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoanBhUHJvamVjdCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKXB1LmdldFBlcnNpc3RlbnRUeXBlKCJvcmcuZWNsaXBzZS5FbnQiKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQgPSBqcHQuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCUxpc3Q8U3RyaW5nPiBsc3QgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uU3RyaW5ncyhhdCk7Ci0JCWFzc2VydEVxdWFscygxLCBsc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsc3QuY29udGFpbnMoIkBJZCIpKTsKLQkJU3RyaW5nIHR5cGVOYW1lMSA9IEpQQUVkaXRvclV0aWwuZ2V0QXR0cmlidXRlVHlwZU5hbWUoYXQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHR5cGVOYW1lMSk7Ci0JCVN0cmluZyB0eXBlTmFtZTIgPSBKUEFFZGl0b3JVdGlsLmdldEF0dHJpYnV0ZVR5cGVOYW1lKGF0LmdldFJlc291cmNlQXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHR5cGVOYW1lMik7CQkKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvUmVtb3ZlQXR0cmlidXRlRmVhdHVyZVRlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9SZW1vdmVBdHRyaWJ1dGVGZWF0dXJlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWI0NmE0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9SZW1vdmVBdHRyaWJ1dGVGZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5pc0E7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBsYXk7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNJbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JUmVtb3ZlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uSUN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5HcmFwaGljc0FsZ29yaXRobTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlJlbW92ZUF0dHJpYnV0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5KUEFDcmVhdGVGYWN0b3J5OwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVBdHRyaWJ1dGVGZWF0dXJlVGVzdCB7Ci0JCi0JcHJpdmF0ZSBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlcjsKLQlwcml2YXRlIElSZW1vdmVDb250ZXh0IGNvbnRleHQ7Ci0JZmluYWwgU3RyaW5nIFRFU1RfUFJPSkVDVCA9ICJUZXN0IisobmV3IERhdGUoKSkuZ2V0VGltZSgpOwotCXByaXZhdGUgSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIEpQQUNyZWF0ZUZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JcHJpdmF0ZSBJRmlsZSBlbnRpdHk7Ci0JCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJZmFjdG9yeSA9IEpQQUNyZWF0ZUZhY3RvcnkuaW5zdGFuY2UoKTsKLQkJanBhUHJvamVjdCA9IGZhY3RvcnkuY3JlYXRlSlBBUHJvamVjdChURVNUX1BST0pFQ1QgKyAiXyIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0JCWVudGl0eSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5KGpwYVByb2plY3QsICJvcmcuZWNsaXBzZS5FbnQiKTsKLQkJVGhyZWFkLnNsZWVwKDIwMDApOwotCQlmYWN0b3J5LmFkZEF0dHJpYnV0ZXMoZW50aXR5LCAiYXR0IiwgImphdmEubGFuZy5TdHJpbmciLCAiIiwgImF0dCIsIGZhbHNlKTsKLQkJCi0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUoKSB7Ci0JCUdyYXBoaWNzQWxnb3JpdGhtIGFsZ29yaXRobSA9IEVhc3lNb2NrLmNyZWF0ZU5pY2VNb2NrKEdyYXBoaWNzQWxnb3JpdGhtLmNsYXNzKTsKLQkJcmVwbGF5KGFsZ29yaXRobSk7Ci0JCQotCQlFTGlzdDxBbmNob3I+IGxpc3QgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEVMaXN0LmNsYXNzKTsKLQkJU2hhcGUgc2hhcGUgPSBFYXN5TW9jay5jcmVhdGVOaWNlTW9jayhTaGFwZS5jbGFzcyk7Ci0JCQotCQlleHBlY3Qoc2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSkuYW5kUmV0dXJuKGFsZ29yaXRobSk7Ci0JCWV4cGVjdChzaGFwZS5nZXRBbmNob3JzKCkpLmFuZFJldHVybihsaXN0KTsKLQkJcmVwbGF5KHNoYXBlKTsKLQkJCi0JCS8vRUxpc3Q8U2hhcGU+IGxpc3RTaGFwZSA9IG5ldyBCYXNpY0ludGVybmFsRUxpc3Q8U2hhcGU+KFNoYXBlLmNsYXNzKTsKLQkJCi0JCUNvbnRhaW5lclNoYXBlIHBpY3RvZ3JhbUVsZW1lbnQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbnRhaW5lclNoYXBlLmNsYXNzKTsKLQkJUmVzb3VyY2UgcmVzID0gRWFzeU1vY2suY3JlYXRlTW9jayhSZXNvdXJjZS5jbGFzcyk7Ci0JCWV4cGVjdChwaWN0b2dyYW1FbGVtZW50LmVSZXNvdXJjZSgpKS5hbmRTdHViUmV0dXJuKHJlcyk7Ci0JCQotCQlSZXNvdXJjZVNldCBycyA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soUmVzb3VyY2VTZXQuY2xhc3MpOwotCQlleHBlY3QocmVzLmdldFJlc291cmNlU2V0KCkpLmFuZFN0dWJSZXR1cm4ocnMpOwotCQlFTGlzdDxBZGFwdGVyPiBlYWQgPSBuZXcgQmFzaWNJbnRlcm5hbEVMaXN0PEFkYXB0ZXI+KEFkYXB0ZXIuY2xhc3MpOyAKLQkJZXhwZWN0KHJzLmVBZGFwdGVycygpKS5hbmRTdHViUmV0dXJuKGVhZCk7Ci0KLQkJcmVwbGF5KHBpY3RvZ3JhbUVsZW1lbnQsIHJlcywgcnMpOwotCQkKLQkJZmVhdHVyZVByb3ZpZGVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGljdG9ncmFtRWxlbWVudCkpLmFuZFJldHVybihKUEFDcmVhdGVGYWN0b3J5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoZW50aXR5LCAiYXR0IikpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmRlY3JlYXNlQXR0cmlic051bShwaWN0b2dyYW1FbGVtZW50KSkuYW5kUmV0dXJuKDApOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEtleUZvckJ1c2luZXNzT2JqZWN0KGlzQShPYmplY3QuY2xhc3MpKSkuYW5kUmV0dXJuKCIiKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5yZW1vdmUoIiIpKS5hbmRSZXR1cm4obnVsbCk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0UmVsYXRpb25SZWxhdGVkVG9BdHRyaWJ1dGUoaXNBKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmNsYXNzKSkpLmFuZFJldHVybihudWxsKTsKLQkJcmVwbGF5KGZlYXR1cmVQcm92aWRlcik7Ci0JCQotCQljb250ZXh0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJUmVtb3ZlQ29udGV4dC5jbGFzcyk7Ci0JCWV4cGVjdChjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKSkuYW5kUmV0dXJuKHBpY3RvZ3JhbUVsZW1lbnQpOwotCQlyZXBsYXkoY29udGV4dCk7Ci0JCQotCQlJQ3VzdG9tRmVhdHVyZSBncmFwaGljYWxSZW1vdmUgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElDdXN0b21GZWF0dXJlLmNsYXNzKTsKLQkJZ3JhcGhpY2FsUmVtb3ZlLmV4ZWN1dGUoaXNBKElDdXN0b21Db250ZXh0LmNsYXNzKSk7Ci0JCXJlcGxheShncmFwaGljYWxSZW1vdmUpOwotCQkKLQkJUmVtb3ZlQXR0cmlidXRlRmVhdHVyZSBmZWF0dXJlID0gbmV3IFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyLCBncmFwaGljYWxSZW1vdmUpOwotCQlmZWF0dXJlLnByZVJlbW92ZShjb250ZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvU2F2ZUVudGl0eUZlYXR1cmVUZXN0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvU2F2ZUVudGl0eUZlYXR1cmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlOTA3MTcuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9mZWF0dXJlL1NhdmVFbnRpdHlGZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5pc0E7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBsYXk7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuU2F2ZUVudGl0eUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5KUEFDcmVhdGVGYWN0b3J5OwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTYXZlRW50aXR5RmVhdHVyZVRlc3QgewotCWZpbmFsIFN0cmluZyBURVNUX1BST0pFQ1QgPSAiVGVzdCI7Ci0JcHJpdmF0ZSBKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBudWxsOwotCXByaXZhdGUgSlBBQ3JlYXRlRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsJCi0JCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJZmFjdG9yeSA9IEpQQUNyZWF0ZUZhY3RvcnkuaW5zdGFuY2UoKTsKLQkJanBhUHJvamVjdCA9IGZhY3RvcnkuY3JlYXRlSlBBUHJvamVjdChURVNUX1BST0pFQ1QgKyAiXyIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0JCVRocmVhZC5zbGVlcCgyMDAwKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwkKLQkJSUZpbGUgY3VzdG9tZXJGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQ3VzdG9tZXIiKTsKLQkJCi0JCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soUGljdG9ncmFtRWxlbWVudC5jbGFzcyk7Ci0KLQkJCi0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWFzc2VydFRydWUoY3VzdG9tZXJGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQ3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCQkKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJaW50IGNudCA9IDA7Ci0JCXdoaWxlICgoY250IDwgMjUpICYmICh0MSA9PSBudWxsKSkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJCWNudCsrOwotCQl9Ci0JCWlmICh0MSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSkpLmFuZFN0dWJSZXR1cm4odDEpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdChpc0EoSmF2YVBlcnNpc3RlbnRUeXBlLmNsYXNzKSkpLmFuZFJldHVybihjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGN1c3RvbWVyRmlsZSkpLmFueVRpbWVzKCk7Ci0KLQkJCi0JCVNhdmVFbnRpdHlGZWF0dXJlIGZ0ID0gbmV3IFNhdmVFbnRpdHlGZWF0dXJlKGZlYXR1cmVQcm92aWRlcik7Ci0JCUlDdXN0b21Db250ZXh0IGN0eCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUN1c3RvbUNvbnRleHQuY2xhc3MpOwotCQkKLQkJUGljdG9ncmFtRWxlbWVudFtdIHBlcyA9IG5ldyBQaWN0b2dyYW1FbGVtZW50WzFdOwotCQlwZXNbMF0gPSBwZTsKLQkJZXhwZWN0KGN0eC5nZXRQaWN0b2dyYW1FbGVtZW50cygpKS5hbmRTdHViUmV0dXJuKHBlcyk7Ci0JCQotCQlyZXBsYXkoZmVhdHVyZVByb3ZpZGVyLCBjdHgsIHBlKTsKLQkJZnQuZXhlY3V0ZShjdHgpOwotCX0KLQkKLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZmlsZSk7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvVXBkYXRlQXR0cmlidXRlRmVhdHVyZVRlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9VcGRhdGVBdHRyaWJ1dGVGZWF0dXJlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTJjN2MzLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9VcGRhdGVBdHRyaWJ1dGVGZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuR3JhcGhpY3NBbGdvcml0aG07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5KUEFDcmVhdGVGYWN0b3J5OwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlVGVzdCB7Ci0JCi0JcHJpdmF0ZSBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlcjsKLQlwcml2YXRlIElDdXN0b21Db250ZXh0IGNvbnRleHQ7Ci0JZmluYWwgU3RyaW5nIFRFU1RfUFJPSkVDVCA9ICJUZXN0IisobmV3IERhdGUoKSkuZ2V0VGltZSgpOwotCXByaXZhdGUgSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIEpQQUNyZWF0ZUZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JcHJpdmF0ZSBJRmlsZSBlbnRpdHk7Ci0JCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZhY3RvcnkgPSBKUEFDcmVhdGVGYWN0b3J5Lmluc3RhbmNlKCk7Ci0JCWpwYVByb2plY3QgPSBmYWN0b3J5LmNyZWF0ZUpQQVByb2plY3QoVEVTVF9QUk9KRUNUICsgIl8iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwotCQllbnRpdHkgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eShqcGFQcm9qZWN0LCAib3JnLmVjbGlwc2UuRW50Iik7Ci0JCVRocmVhZC5zbGVlcCgyMDAwKTsKLQkJZmFjdG9yeS5hZGRBdHRyaWJ1dGVzKGVudGl0eSwgImF0dCIsICJqYXZhLmxhbmcuU3RyaW5nIiwgIiIsICJhdHQiLCBmYWxzZSk7Ci0JfQotCQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJkZXByZWNhdGlvbiIgfSkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlKCl7Ci0JCVRleHQgdGV4dCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soVGV4dC5jbGFzcyk7Ci0JCXRleHQuc2V0VmFsdWUoRWFzeU1vY2suaXNBKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpKTsKLQkJRWFzeU1vY2sucmVwbGF5KHRleHQpOwotCQkKLQkJRUxpc3Q8R3JhcGhpY3NBbGdvcml0aG0+IGxpc3RDaGlsZHJlbiA9IG5ldyBCYXNpY0ludGVybmFsRUxpc3Q8R3JhcGhpY3NBbGdvcml0aG0+KEdyYXBoaWNzQWxnb3JpdGhtLmNsYXNzKTsKLQkJCi0JCQotCQlFYXN5TW9jay5leHBlY3QobGlzdENoaWxkcmVuLmdldCgwKSkuYW5kUmV0dXJuKHRleHQpOwotCQlFYXN5TW9jay5yZXBsYXkobGlzdENoaWxkcmVuKTsKLQkJCi0JCQotCQlSZWN0YW5nbGUgcmVjdGFuZ2xlID0gRWFzeU1vY2suY3JlYXRlTW9jayhSZWN0YW5nbGUuY2xhc3MpOwotCQlFYXN5TW9jay5leHBlY3QocmVjdGFuZ2xlLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKSkuYW5kUmV0dXJuKGxpc3RDaGlsZHJlbik7Ci0JCUVhc3lNb2NrLmV4cGVjdChyZWN0YW5nbGUuZ2V0WSgpKS5hbmRSZXR1cm4oMCkudGltZXMoMik7Ci0JCUVhc3lNb2NrLnJlcGxheShyZWN0YW5nbGUpOwotCQkKLQkJSXRlcmF0b3I8U2hhcGU+IGl0ZXJhdG9yU2hhcGUgPSBFYXN5TW9jay5jcmVhdGVOaWNlTW9jayhJdGVyYXRvci5jbGFzcyk7Ci0JCUVhc3lNb2NrLmV4cGVjdChpdGVyYXRvclNoYXBlLmhhc05leHQoKSkuYW5kUmV0dXJuKGZhbHNlKTsKLQkJRWFzeU1vY2sucmVwbGF5KGl0ZXJhdG9yU2hhcGUpOwotCQkKLQkJRUxpc3Q8U2hhcGU+IGxpc3RTaGFwZSA9IG5ldyBCYXNpY0ludGVybmFsRUxpc3Q8U2hhcGU+KFNoYXBlLmNsYXNzKTsKLQkJCi0JCUNvbnRhaW5lclNoYXBlIGNvbnRhaW5lclNoYXBlID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb250YWluZXJTaGFwZS5jbGFzcyk7Ci0JCUVhc3lNb2NrLmV4cGVjdChjb250YWluZXJTaGFwZS5nZXRDaGlsZHJlbigpKS5hbmRSZXR1cm4obGlzdFNoYXBlKTsKLQkJRWFzeU1vY2sucmVwbGF5KGNvbnRhaW5lclNoYXBlKTsKLQkJCi0JCVNoYXBlIHNoYXBlID0gRWFzeU1vY2suY3JlYXRlTW9jayhTaGFwZS5jbGFzcyk7Ci0JCVJlc291cmNlIHJlcyA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soUmVzb3VyY2UuY2xhc3MpOwotCQlSZXNvdXJjZVNldCBycyA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soUmVzb3VyY2VTZXQuY2xhc3MpOwotCQlFYXN5TW9jay5leHBlY3QocmVzLmdldFJlc291cmNlU2V0KCkpLmFuZFN0dWJSZXR1cm4ocnMpOwotCQlFTGlzdDxBZGFwdGVyPiBhZHMgPSBuZXcgQmFzaWNJbnRlcm5hbEVMaXN0PEFkYXB0ZXI+KEFkYXB0ZXIuY2xhc3MpOwotCQlFYXN5TW9jay5leHBlY3QocnMuZUFkYXB0ZXJzKCkpLmFuZFN0dWJSZXR1cm4oYWRzKTsKLQkJRWFzeU1vY2suZXhwZWN0KHNoYXBlLmVSZXNvdXJjZSgpKS5hbmRTdHViUmV0dXJuKHJlcyk7Ci0JCQotCi0JCQotCQlFYXN5TW9jay5leHBlY3Qoc2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSkuYW5kUmV0dXJuKHJlY3RhbmdsZSkudGltZXMoMyk7Ci0JCUVhc3lNb2NrLmV4cGVjdChzaGFwZS5nZXRDb250YWluZXIoKSkuYW5kUmV0dXJuKGNvbnRhaW5lclNoYXBlKTsKLQkJCi0JCQotCQlFYXN5TW9jay5yZXBsYXkoc2hhcGUsIHJlcywgcnMpOwotCQkKLQkJY29udGV4dCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUN1c3RvbUNvbnRleHQuY2xhc3MpOwotCQlFYXN5TW9jay5leHBlY3QoY29udGV4dC5nZXRJbm5lclBpY3RvZ3JhbUVsZW1lbnQoKSkuYW5kUmV0dXJuKHNoYXBlKTsKLQkJRWFzeU1vY2sucmVwbGF5KGNvbnRleHQpOwotCQkKLQkJZmVhdHVyZVByb3ZpZGVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQkJRWFzeU1vY2suZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoc2hhcGUpKS5hbmRSZXR1cm4obnVsbCk7Ci0JCUVhc3lNb2NrLnJlcGxheShmZWF0dXJlUHJvdmlkZXIpOwotCQkKLQkJVXBkYXRlQXR0cmlidXRlRmVhdHVyZSBmZWF0dXJlID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyKTsKLQkJZmVhdHVyZS5leGVjdXRlKGNvbnRleHQpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvbGlzdGVuZXIvSlBBUHJvamVjdExpc3RlbmVyVGVzdC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9saXN0ZW5lci9KUEFQcm9qZWN0TGlzdGVuZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MTk1MzAuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9saXN0ZW5lci9KUEFQcm9qZWN0TGlzdGVuZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLmxpc3RlbmVyOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5pc0E7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBsYXk7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklSZW1vdmVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklFY2xpcHNlRmFjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBU29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLkpQQUNyZWF0ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLQotcHVibGljIGNsYXNzIEpQQVByb2plY3RMaXN0ZW5lclRlc3QgewotCXByaXZhdGUgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXI7Ci0JZmluYWwgU3RyaW5nIFRFU1RfUFJPSkVDVCA9ICJUZXN0IjsKLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBKUEFDcmVhdGVGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCUlFY2xpcHNlRmFjYWRlIGVjbGlwc2VGYWNhZGUgPSBudWxsOwotCQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlmYWN0b3J5ID0gSlBBQ3JlYXRlRmFjdG9yeS5pbnN0YW5jZSgpOwotCQlqcGFQcm9qZWN0ID0gZmFjdG9yeS5jcmVhdGVKUEFQcm9qZWN0KFRFU1RfUFJPSkVDVCArICJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLQkJSUZpbGUgZW50aXR5ID0gZmFjdG9yeS5jcmVhdGVFbnRpdHkoanBhUHJvamVjdCwgIm9yZy5lY2xpcHNlLkVudGl0eTEiKTsKLQkJVGhyZWFkLnNsZWVwKDIwMDApOwotCQlmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChudWxsKSkuYW5kUmV0dXJuKEpQQUNyZWF0ZUZhY3RvcnkuZ2V0UGVyc2lzdGVudFR5cGUoZW50aXR5KSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0Q29tcGlsYXRpb25Vbml0KGlzQShKYXZhUGVyc2lzdGVudFR5cGUuY2xhc3MpKSkuYW5kUmV0dXJuKEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZW50aXR5KSkuYW55VGltZXMoKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZmlsZSk7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEpQQVByb2plY3RMaXN0ZW5lcigpIHsKLQkJSlBBU29sdmVyIHNsdiA9IG5ldyBKUEFTb2x2ZXIoKTsgCi0JCXNsdi5zZXRGZWF0dXJlUHJvdmlkZXIoZmVhdHVyZVByb3ZpZGVyKTsKLQkJanBhUHJvamVjdC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoIm1hcmsiLCBzbHYubmV3IEpQQVByb2plY3RMaXN0ZW5lcigpKTsKLQkJUGVyc2lzdGVuY2VVbml0IHB1ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0UGVyc2lzdGVuY2VVbml0KGpwYVByb2plY3QpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0SlBUKCJvcmcuZWNsaXBzZS5FbnRpdHkxIiwgcHUpOwotCQlDb250YWluZXJTaGFwZSBjcyA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29udGFpbmVyU2hhcGUuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChqcHQpKS5hbmRTdHViUmV0dXJuKGNzKTsKLQkJSVJlbW92ZUZlYXR1cmUgZnQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElSZW1vdmVGZWF0dXJlLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRSZW1vdmVGZWF0dXJlKGlzQShJUmVtb3ZlQ29udGV4dC5jbGFzcykpKS5hbmRSZXR1cm4oZnQpOwotCQkvLyBUaGUgcmVtb3ZlIG1ldGhvZCBzaG91bGQgYmUgaW52b2tlZCBleGFjdGx5IG9uY2UKLQkJZnQucmVtb3ZlKGlzQShJUmVtb3ZlQ29udGV4dC5jbGFzcykpOwotCQlyZXBsYXkoZnQsIGNzLCBmZWF0dXJlUHJvdmlkZXIpOwotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5kZWxldGVFbnRpdHlDbGFzcyhqcHQsIGZlYXR1cmVQcm92aWRlcik7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEpQQVByb2plY3RMaXN0ZW5lck5vUmVtb3ZlKCkgewotCQlKUEFTb2x2ZXIgc2x2ID0gbmV3IEpQQVNvbHZlcigpOyAKLQkJc2x2LnNldEZlYXR1cmVQcm92aWRlcihmZWF0dXJlUHJvdmlkZXIpOwotCQlqcGFQcm9qZWN0LmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigibWFyayIsIHNsdi5uZXcgSlBBUHJvamVjdExpc3RlbmVyKCkpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcHUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoanBhUHJvamVjdCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRKUFQoIm9yZy5lY2xpcHNlLkVudGl0eTEiLCBwdSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwdCkpLmFuZFN0dWJSZXR1cm4obnVsbCk7Ci0JCUlSZW1vdmVGZWF0dXJlIGZ0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJUmVtb3ZlRmVhdHVyZS5jbGFzcyk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0UmVtb3ZlRmVhdHVyZShpc0EoSVJlbW92ZUNvbnRleHQuY2xhc3MpKSkuYW5kUmV0dXJuKGZ0KTsKLQkJcmVwbGF5KGZ0LCBmZWF0dXJlUHJvdmlkZXIpOwotCQkvLyBpZiB0aGUgY29udGFpbmVyIHNoYXBlIGlzIG51bGwgdGhlIHJlbW92ZSBtZXRob2Qgb2YgdGhlIGZlYXR1cmUgc2hvdWxkIG5vdCBiZSBpbnZva2VkCi0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmRlbGV0ZUVudGl0eUNsYXNzKGpwdCwgZmVhdHVyZVByb3ZpZGVyKTsKLQl9Ci0JCi0JCi0JQEFmdGVyCQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJZGVsZXRlQWxsUHJvamVjdHMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZUFsbFByb2plY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcj0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSBqcGFQcm9qZWN0LmdldFByb2plY3QoKTsKLQkJCQkgICAgcHJvamVjdC5jbG9zZShtb25pdG9yKTsJICAgIAkKLQkJCQkgICAgcHJvamVjdC5jbG9zZShtb25pdG9yKTsKLQkJCQkgICAgcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy9pZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0gLCBtb25pdG9yKTsKLQl9CQotCQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3VpL01vZGVsSW50ZWdyYXRpb25UZXN0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdWkvTW9kZWxJbnRlZ3JhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRlM2JhMS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdWkvTW9kZWxJbnRlZ3JhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51aTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suaXNBOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmR0LklEaWFncmFtVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkucGxhdGZvcm0uSURpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51aS5KUEFFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbC5JTW9kZWxJbnRlZ3JhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklFY2xpcHNlRmFjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUpQQURpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklKUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLkpQQUNyZWF0ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgTW9kZWxJbnRlZ3JhdGlvblRlc3QgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFX0dFTkVSQVRFRCA9ICJDT0RFX0dFTkVSQVRFRCI7Ci0JcHJpdmF0ZSBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlcjsKLQlmaW5hbCBTdHJpbmcgVEVTVF9QUk9KRUNUID0gIlRlc3QiOwotCXByaXZhdGUgSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIEpQQUNyZWF0ZUZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JSUVjbGlwc2VGYWNhZGUgZWNsaXBzZUZhY2FkZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgdGVzdFByb2plY3ROYW1lID0gVEVTVF9QUk9KRUNUICsgIl8iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JSUZpbGUgZW50aXR5RmlsZSA9IG51bGw7Ci0JCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZhY3RvcnkgPSBKUEFDcmVhdGVGYWN0b3J5Lmluc3RhbmNlKCk7Ci0JCWpwYVByb2plY3QgPSBmYWN0b3J5LmNyZWF0ZUpQQVByb2plY3QodGVzdFByb2plY3ROYW1lKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLQkJZW50aXR5RmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5KGpwYVByb2plY3QsICJvcmcuZWNsaXBzZS5FbnRpdHkxIik7Ci0JCVRocmVhZC5zbGVlcCgyMDAwKTsKLQkJZmVhdHVyZVByb3ZpZGVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQobnVsbCkpLmFuZFJldHVybihKUEFDcmVhdGVGYWN0b3J5LmdldFBlcnNpc3RlbnRUeXBlKGVudGl0eUZpbGUpKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQoaXNBKEphdmFQZXJzaXN0ZW50VHlwZS5jbGFzcykpKS5hbmRSZXR1cm4oSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShlbnRpdHlGaWxlKSkuYW55VGltZXMoKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneVdpdGhFbnRpdHlGaWxlRWRpdG9ySW5wdXRUcnVlKCkgewotCQlJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUVkaXRvclJlZmVyZW5jZS5jbGFzcyk7Ci0JCUlGaWxlRWRpdG9ySW5wdXQgaW5wdXQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElGaWxlRWRpdG9ySW5wdXQuY2xhc3MpOwotCQlleHBlY3QoaW5wdXQuZ2V0RmlsZSgpKS5hbmRTdHViUmV0dXJuKGVudGl0eUZpbGUpOwotCQlleHBlY3QoaW5wdXQuZ2V0TmFtZSgpKS5hbmRTdHViUmV0dXJuKENPREVfR0VORVJBVEVEKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZW50aXR5RmlsZSk7IAotCQkKLQkJSUpQQUVkaXRvclV0aWwgdXQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JVdGlsLmNsYXNzKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGlucHV0SnB0VHlwZSA9IChKYXZhUGVyc2lzdGVudFR5cGUpIEpQQUNyZWF0ZUZhY3RvcnkuZ2V0UGVyc2lzdGVudFR5cGUoZW50aXR5RmlsZSk7Ci0JCWV4cGVjdCh1dC5nZXRKUFR5cGUoY3UpKS5hbmRTdHViUmV0dXJuKGlucHV0SnB0VHlwZSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0SlBBRWRpdG9yVXRpbCgpKS5hbmRTdHViUmV0dXJuKHV0KTsKLQkJRGlhZ3JhbSBkID0gRWFzeU1vY2suY3JlYXRlTW9jayhEaWFncmFtLmNsYXNzKTsKLQkJSUpQQURpYWdyYW1FZGl0b3JJbnB1dCBkRWRJbnB1dCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQURpYWdyYW1FZGl0b3JJbnB1dC5jbGFzcyk7Ci0JCXRyeSB7Ci0JCQlleHBlY3QoZWRpdG9yUmVmLmdldEVkaXRvcklucHV0KCkpLmFuZFN0dWJSZXR1cm4oZEVkSW5wdXQpOwotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWV4cGVjdChkRWRJbnB1dC5nZXREaWFncmFtKCkpLmFuZFN0dWJSZXR1cm4oZCk7Ci0JCUlEaWFncmFtVHlwZVByb3ZpZGVyIGR0cCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSURpYWdyYW1UeXBlUHJvdmlkZXIuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKSkuYW5kU3R1YlJldHVybihkdHApOwotCQlJTW9kZWxJbnRlZ3JhdGlvblV0aWwgbW9pbkludFV0aWwgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElNb2RlbEludGVncmF0aW9uVXRpbC5jbGFzcyk7IAotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldE1vaW5JbnRlZ3JhdGlvblV0aWwoKSkuYW5kU3R1YlJldHVybihtb2luSW50VXRpbCk7Ci0JCWV4cGVjdChtb2luSW50VXRpbC5nZXRQcm9qZWN0QnlEaWFncmFtKGQpKS5hbmRTdHViUmV0dXJuKGpwYVByb2plY3QpOwotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gRWFzeU1vY2suY3JlYXRlTW9jayhQaWN0b2dyYW1FbGVtZW50LmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoaW5wdXRKcHRUeXBlKSkuYW5kU3R1YlJldHVybihwZSk7Ci0JCUlEaWFncmFtRWRpdG9yIGRFZCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSURpYWdyYW1FZGl0b3IuY2xhc3MpOwotCQlleHBlY3QoZHRwLmdldERpYWdyYW1FZGl0b3IoKSkuYW5kU3R1YlJldHVybihkRWQpOwotCQlkRWQuc2V0UGljdG9ncmFtRWxlbWVudEZvclNlbGVjdGlvbihwZSk7Ci0KLQkJSlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneSBzdHIgPSBuZXcgSlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneShmZWF0dXJlUHJvdmlkZXIpOwotCQkKLQkJRWFzeU1vY2sucmVwbGF5KGVkaXRvclJlZiwgZCwgZHRwLCBwZSwgZEVkLCBtb2luSW50VXRpbCwgZEVkSW5wdXQsIHV0LCBpbnB1dCwgZmVhdHVyZVByb3ZpZGVyKTsKLQkJYXNzZXJ0VHJ1ZShzdHIubWF0Y2hlcyhlZGl0b3JSZWYsIGlucHV0KSk7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEpQQUVkaXRvck1hdGNoaW5nU3RyYXRlZ3lXaXRoRW50aXR5RmlsZUVkaXRvcklucHV0RmFsc2UoKSB7CQkKLQkJSUVkaXRvclJlZmVyZW5jZSBlZGl0b3JSZWYgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElFZGl0b3JSZWZlcmVuY2UuY2xhc3MpOwotCQlJRmlsZUVkaXRvcklucHV0IGlucHV0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRmlsZUVkaXRvcklucHV0LmNsYXNzKTsKLQkJZXhwZWN0KGlucHV0LmdldEZpbGUoKSkuYW5kU3R1YlJldHVybihlbnRpdHlGaWxlKTsKLQkJZXhwZWN0KGlucHV0LmdldE5hbWUoKSkuYW5kU3R1YlJldHVybihDT0RFX0dFTkVSQVRFRCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGVudGl0eUZpbGUpOyAKLQkJCi0JCUlKUEFFZGl0b3JVdGlsIHV0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yVXRpbC5jbGFzcyk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBpbnB1dEpwdFR5cGUgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBKUEFDcmVhdGVGYWN0b3J5LmdldFBlcnNpc3RlbnRUeXBlKGVudGl0eUZpbGUpOwotCQlleHBlY3QodXQuZ2V0SlBUeXBlKGN1KSkuYW5kU3R1YlJldHVybihpbnB1dEpwdFR5cGUpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEpQQUVkaXRvclV0aWwoKSkuYW5kU3R1YlJldHVybih1dCk7Ci0JCURpYWdyYW0gZCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soRGlhZ3JhbS5jbGFzcyk7Ci0JCUlKUEFEaWFncmFtRWRpdG9ySW5wdXQgZEVkSW5wdXQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFEaWFncmFtRWRpdG9ySW5wdXQuY2xhc3MpOwotCQl0cnkgewotCQkJZXhwZWN0KGVkaXRvclJlZi5nZXRFZGl0b3JJbnB1dCgpKS5hbmRTdHViUmV0dXJuKGRFZElucHV0KTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlleHBlY3QoZEVkSW5wdXQuZ2V0RGlhZ3JhbSgpKS5hbmRTdHViUmV0dXJuKGQpOwotCQlJRGlhZ3JhbVR5cGVQcm92aWRlciBkdHAgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElEaWFncmFtVHlwZVByb3ZpZGVyLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkpLmFuZFN0dWJSZXR1cm4oZHRwKTsKLQkJSU1vZGVsSW50ZWdyYXRpb25VdGlsIG1vaW5JbnRVdGlsID0gRWFzeU1vY2suY3JlYXRlTW9jayhJTW9kZWxJbnRlZ3JhdGlvblV0aWwuY2xhc3MpOyAKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRNb2luSW50ZWdyYXRpb25VdGlsKCkpLmFuZFN0dWJSZXR1cm4obW9pbkludFV0aWwpOwotCQlKcGFQcm9qZWN0IGFub3RoZXJKcGFQcm9qZWN0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhKcGFQcm9qZWN0LmNsYXNzKTsKLQkJZXhwZWN0KG1vaW5JbnRVdGlsLmdldFByb2plY3RCeURpYWdyYW0oZCkpLmFuZFN0dWJSZXR1cm4oYW5vdGhlckpwYVByb2plY3QpOwotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gRWFzeU1vY2suY3JlYXRlTW9jayhQaWN0b2dyYW1FbGVtZW50LmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoaW5wdXRKcHRUeXBlKSkuYW5kU3R1YlJldHVybihwZSk7Ci0JCUlEaWFncmFtRWRpdG9yIGRFZCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSURpYWdyYW1FZGl0b3IuY2xhc3MpOwotCQlleHBlY3QoZHRwLmdldERpYWdyYW1FZGl0b3IoKSkuYW5kU3R1YlJldHVybihkRWQpOwotCQlkRWQuc2V0UGljdG9ncmFtRWxlbWVudEZvclNlbGVjdGlvbihwZSk7Ci0KLQkJSlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneSBzdHIgPSBuZXcgSlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneShmZWF0dXJlUHJvdmlkZXIpOwotCQkKLQkJRWFzeU1vY2sucmVwbGF5KGVkaXRvclJlZiwgZCwgZHRwLCBwZSwgZEVkLCBtb2luSW50VXRpbCwgYW5vdGhlckpwYVByb2plY3QsIGRFZElucHV0LCB1dCwgaW5wdXQsIGZlYXR1cmVQcm92aWRlcik7Ci0JCWFzc2VydEZhbHNlKHN0ci5tYXRjaGVzKGVkaXRvclJlZiwgaW5wdXQpKTsKLQl9CQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEpQQUVkaXRvck1hdGNoaW5nU3RyYXRlZ3lXaXRoSlBBRGlhZ3JhbUVkaXRvcklucHV0VHJ1ZSgpIHsJCQotCQlJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUVkaXRvclJlZmVyZW5jZS5jbGFzcyk7Ci0JCWV4cGVjdChlZGl0b3JSZWYuZ2V0UGFydE5hbWUoKSkuYW5kU3R1YlJldHVybigiUHJvamVjdE5hbWUiKTsKLQkJSUpQQURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQURpYWdyYW1FZGl0b3JJbnB1dC5jbGFzcyk7Ci0JCWV4cGVjdChpbnB1dC5nZXRQcm9qZWN0TmFtZSgpKS5hbmRTdHViUmV0dXJuKCJQcm9qZWN0TmFtZSIpOwotCQlKUEFFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5IHN0ciA9IG5ldyBKUEFFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5KGZlYXR1cmVQcm92aWRlcik7CQkKLQkJRWFzeU1vY2sucmVwbGF5KGVkaXRvclJlZiwgaW5wdXQsIGZlYXR1cmVQcm92aWRlcik7Ci0JCWFzc2VydFRydWUoc3RyLm1hdGNoZXMoZWRpdG9yUmVmLCBpbnB1dCkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEpQQUVkaXRvck1hdGNoaW5nU3RyYXRlZ3lXaXRoSlBBRGlhZ3JhbUVkaXRvcklucHV0RmFsc2UoKSB7CQkKLQkJSUVkaXRvclJlZmVyZW5jZSBlZGl0b3JSZWYgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElFZGl0b3JSZWZlcmVuY2UuY2xhc3MpOwotCQlleHBlY3QoZWRpdG9yUmVmLmdldFBhcnROYW1lKCkpLmFuZFN0dWJSZXR1cm4oIlByb2plY3ROYW1lIik7Ci0JCUlKUEFEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFEaWFncmFtRWRpdG9ySW5wdXQuY2xhc3MpOwotCQlleHBlY3QoaW5wdXQuZ2V0UHJvamVjdE5hbWUoKSkuYW5kU3R1YlJldHVybigiRGlmZmVyZW50UHJvamVjdE5hbWUiKTsKLQkJSlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneSBzdHIgPSBuZXcgSlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneShmZWF0dXJlUHJvdmlkZXIpOwkJCi0JCUVhc3lNb2NrLnJlcGxheShlZGl0b3JSZWYsIGlucHV0LCBmZWF0dXJlUHJvdmlkZXIpOwotCQlhc3NlcnRGYWxzZShzdHIubWF0Y2hlcyhlZGl0b3JSZWYsIGlucHV0KSk7Ci0JfQkKLQkKLQkKLS8vCUBUZXN0Ci0vLwlwdWJsaWMgdm9pZCB0ZXN0SlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneVdpdGhGaWxlRWRpdG9ySW5wdXQoKSB7Ci0vLwkJSUVkaXRvclJlZmVyZW5jZSBlZGl0b3JSZWYgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElFZGl0b3JSZWZlcmVuY2UuY2xhc3MpOwotLy8JCUlGaWxlRWRpdG9ySW5wdXQgaW5wdXQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElGaWxlRWRpdG9ySW5wdXQuY2xhc3MpOwotLy8JCUlKUEFFZGl0b3JVdGlsIHV0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yVXRpbC5jbGFzcyk7Ci0vLwkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRKUEFFZGl0b3JVdGlsKCkpLmFuZFN0dWJSZXR1cm4odXQpOwotLy8JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEphdmFQZXJzaXN0ZW50VHlwZS5jbGFzcyk7Ci0vLwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZW50aXR5RmlsZSk7Ci0vLwkJZXhwZWN0KHV0LmdldEpQVHlwZShjdSkpLmFuZFN0dWJSZXR1cm4oanB0KTsKLS8vCQlQZXJzaXN0ZW5jZVVuaXQgcHUgPSBFYXN5TW9jay5jcmVhdGVNb2NrKFBlcnNpc3RlbmNlVW5pdC5jbGFzcyk7Ci0vLwkJZXhwZWN0KGpwdC5nZXRQZXJzaXN0ZW5jZVVuaXQoKSkuYW5kU3R1YlJldHVybihwdSk7Ci0vLwkJZXhwZWN0KHB1LmdldEpwYVByb2plY3QoKSkuYW5kU3R1YlJldHVybihqcGFQcm9qZWN0KTsKLS8vCQlleHBlY3QoaW5wdXQuZ2V0RmlsZSgpKS5hbmRTdHViUmV0dXJuKGVudGl0eUZpbGUpOwotLy8JCWV4cGVjdChpbnB1dC5nZXROYW1lKCkpLmFuZFN0dWJSZXR1cm4oZW50aXR5RmlsZS5nZXROYW1lKCkpOwotLy8JCUpQQUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgc3RyID0gbmV3IEpQQUVkaXRvck1hdGNoaW5nU3RyYXRlZ3koZmVhdHVyZVByb3ZpZGVyKTsJCQotLy8JCUVhc3lNb2NrLnJlcGxheShlZGl0b3JSZWYsIGlucHV0LCB1dCwganB0LCBwdSwgZmVhdHVyZVByb3ZpZGVyKTsKLS8vCQlhc3NlcnRGYWxzZShzdHIubWF0Y2hlcyhlZGl0b3JSZWYsIGlucHV0KSk7Ci0vLwl9Ci0JCi0JCi0JCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGZpbGUpOwotCX0KLQkJCi0JQEFmdGVyCQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJZGVsZXRlQWxsUHJvamVjdHMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZUFsbFByb2plY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcj0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBqcGFQcm9qZWN0LmdldFByb2plY3QoKTsKLQkJCSAgICBwcm9qZWN0LmNsb3NlKG1vbml0b3IpOwkgICAgCQotCQkJICAgIHByb2plY3QuY2xvc2UobW9uaXRvcik7Ci0JCQkgICAgcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbW9uaXRvcik7CQkJCQotCQkJfQotCQl9ICwgbW9uaXRvcik7Ci0JfQkKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91dGlsL01vZGVsSW50ZWdyYXRpb25VdGlsVGVzdC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3V0aWwvTW9kZWxJbnRlZ3JhdGlvblV0aWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOGRmZTMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3V0aWwvTW9kZWxJbnRlZ3JhdGlvblV0aWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNJbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbC5Nb2RlbEludGVncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuSlBBQ3JlYXRlRmFjdG9yeTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVMaXN0ZW5lcjsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLXB1YmxpYyBjbGFzcyBNb2RlbEludGVncmF0aW9uVXRpbFRlc3QgewotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgZ2V0TU9JTk5vUmVzb3VyY2VGb2xkZXJUZXN0KCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJUHJvamVjdC5jbGFzcyk7Ci0JCS8vRUxpc3QgcnIgPSBuZXcgQmFzaWNJbnRlcm5hbEVMaXN0KFN0cmluZy5jbGFzcyk7Ci0JCUVhc3lNb2NrLmV4cGVjdChwcm9qZWN0LmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSkuYW5kU3R1YlJldHVybihuZXcgUGF0aCgic3JjIikpOwotCQlFYXN5TW9jay5yZXBsYXkocHJvamVjdCk7Ci0JCUlQYXRoIHAgPSBNb2RlbEludGVncmF0aW9uVXRpbC5nZXRFTUZSZXNvdXJjZUZvbGRlclBhdGgocHJvamVjdCk7Ci0JCWFzc2VydE5vdE51bGwocCk7Ci0JCWFzc2VydEVxdWFscygyLCBwLnNlZ21lbnRDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHAuc2VnbWVudCgwKSwgInNyYyIpOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCUBUZXN0Ci0JcHVibGljIHZvaWQgZ2V0TU9JTlNyY1Jlc291cmNlRm9sZGVyVGVzdCgpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSVByb2plY3QuY2xhc3MpOwotCQlFTGlzdCByciA9IG5ldyBCYXNpY0ludGVybmFsRUxpc3QoU3RyaW5nLmNsYXNzKTsKLQkJcnIuYWRkKCJzcmMiKTsKLQkJRWFzeU1vY2suZXhwZWN0KHByb2plY3QuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKS5hbmRTdHViUmV0dXJuKG5ldyBQYXRoKCJzcmMiKSk7Ci0JCUVhc3lNb2NrLnJlcGxheShwcm9qZWN0KTsKLQkJSVBhdGggcCA9IE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldEVNRlJlc291cmNlRm9sZGVyUGF0aChwcm9qZWN0KTsKLQkJYXNzZXJ0Tm90TnVsbChwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHAuc2VnbWVudENvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMocC5zZWdtZW50KDApLCAic3JjIik7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgY29weUV4aXN0aW5nWE1JQ29udGVudEFuZERlbGV0ZUZpbGVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJ1bmRsZSBiID0gRWFzeU1vY2suY3JlYXRlTW9jayhCdW5kbGUuY2xhc3MpOwotCQlCdW5kbGVDb250ZXh0IGJjID0gRWFzeU1vY2suY3JlYXRlTW9jayhCdW5kbGVDb250ZXh0LmNsYXNzKTsKLQkJRWFzeU1vY2suZXhwZWN0KGJjLmdldEJ1bmRsZSgpKS5hbmRTdHViUmV0dXJuKGIpOwotCQlFYXN5TW9jay5leHBlY3QoYi5nZXRTeW1ib2xpY05hbWUoKSkuYW5kU3R1YlJldHVybigianBhX2VkaXRvciIpOwotCQliYy5hZGRCdW5kbGVMaXN0ZW5lcihFYXN5TW9jay5pc0EoQnVuZGxlTGlzdGVuZXIuY2xhc3MpKTsKLQkJRWFzeU1vY2sucmVwbGF5KGJjLCBiKTsKLQkJCi0JCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4gcCA9IG5ldyBKUEFEaWFncmFtRWRpdG9yUGx1Z2luKCk7Ci0JCXAuc3RhcnQoYmMpOwotCQkKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEpQQURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlzdG9yZS5wdXRWYWx1ZShKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfRElBR1JBTV9GT0xERVIsICJkaWFncmFtcyIpOwotCQlzdG9yZS5nZXRTdHJpbmcoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX0RJQUdSQU1fRk9MREVSKTsKLQkJCi0JCUpQQUNyZWF0ZUZhY3RvcnkgZmFjdG9yeSA9IEpQQUNyZWF0ZUZhY3RvcnkuaW5zdGFuY2UoKTsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gZmFjdG9yeS5jcmVhdGVKUEFQcm9qZWN0KCJUZXN0XyIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7CQkKLQkJTW9kZWxJbnRlZ3JhdGlvblV0aWwuY29weUV4aXN0aW5nWE1JQ29udGVudEFuZERlbGV0ZUZpbGUoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksICJkaWFncmFtX25hbWUiLCBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3ByZWZlcmVuY2VzL0pQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplclRlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzQ5NjVkLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyVGVzdCB7Ci0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IG5ldyBQcmVmZXJlbmNlU3RvcmUoKTsKLQkJQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZml4dHVyZSA9IG5ldyBKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIoCi0JCQkJc3RvcmUpOwotCQlmaXh0dXJlLmluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIHBhY2sgPSBzdG9yZQotCQkJCS5nZXREZWZhdWx0U3RyaW5nKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9FTlRJVFlfUEFDS0FHRSk7Ci0JCWFzc2VydEVxdWFscyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX0VOVElUWV9QQUNLQUdFLCBwYWNrKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlVGVzdC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxODg5NmUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VUZXN0IHsKLQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBzdG9yZTsKLQlwcml2YXRlIFN0cmluZyBvbGRWYWx1ZTsKLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJc3RvcmUgPSBKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJb2xkVmFsdWUgPSBzdG9yZQotCQkJCS5nZXRTdHJpbmcoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX0VOVElUWV9QQUNLQUdFKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkJc3RvcmUuc2V0VmFsdWUoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX0VOVElUWV9QQUNLQUdFLAotCQkJCW9sZFZhbHVlKTsKLQl9Ci0KLQkvKgotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENoZWNrU3RhdGUoKSB7Ci0JCUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZSBwYWdlID0gY3JlYXRlQ29udHJvbCgpOwotCQlhc3NlcnROdWxsKHBhZ2UuZ2V0RXJyb3JNZXNzYWdlKCkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENoZWNrU3RhdGVFcnJvck1lc3NhZ2UoKSB7Ci0JCXN0b3JlLnNldFZhbHVlKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5ERUZBVUxUX0VOVElUWV9QQUNLQUdFLAotCQkJCSJkIG9tZCIpOwotCQlKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UgcGFnZSA9IGNyZWF0ZUNvbnRyb2woKTsKLQkJYXNzZXJ0Tm90TnVsbChwYWdlLmdldEVycm9yTWVzc2FnZSgpKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDaGVja1N0YXRlV2FybmluZ01lc3NhZ2UoKSB7Ci0JCXN0b3JlLnNldFZhbHVlKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5ERUZBVUxUX0VOVElUWV9QQUNLQUdFLAotCQkJCSJDYXBpdGFsTGV0dGVyIik7Ci0JCUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZSBwYWdlID0gY3JlYXRlQ29udHJvbCgpOwotCQlhc3NlcnROdWxsKHBhZ2UuZ2V0TWVzc2FnZSgpKTsKLQkJYXNzZXJ0VHJ1ZShwYWdlLmlzVmFsaWQoKSk7Ci0JfQotCSovCi0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJbml0KCkgewotCQlKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UgcGFnZSA9IG5ldyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UoKTsKLQkJcGFnZS5pbml0KG51bGwpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCXByaXZhdGUgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlIGNyZWF0ZUNvbnRyb2woKSB7Ci0JCUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZSBwYWdlID0gbmV3IEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZSgpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShEaXNwbGF5LmdldERlZmF1bHQoKQotCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhZ2UuY3JlYXRlQ29udHJvbChjb21wb3NpdGUpOwotCQlyZXR1cm4gcGFnZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckZlYXR1cmVQcm92aWRlclRlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvcHJvdmlkZXIvSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjQ2ZjY1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvcHJvdmlkZXIvSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suaXNBOwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVwbGF5OwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZHQuSURpYWdyYW1UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSURlbGV0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JRGVsZXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkRlbGV0ZUpQQUVudGl0eUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5EZWxldGVSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuQWJzdHJhY3RSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuTWFueVRvTWFueVVuaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUpwYVNvbHZlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi0KLXB1YmxpYyBjbGFzcyBKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXJUZXN0IHsKLQkKLQotCXByaXZhdGUgSUpwYVNvbHZlciBzb2x2ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgYnVzaW5lc3NPYmplY3RLZXk7Ci0KLQkvKioKLQkgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc29sdmVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSnBhU29sdmVyLmNsYXNzKTsKLQkJYnVzaW5lc3NPYmplY3RLZXkgPSAic29tZVZhbHVlIjsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlc0dyb3VwRGVsZXRlRmVhdHVyZSgpewkJCi0JCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSByZXBsYXlQaWN0b2dyYW1FbGVtZW50KCk7Ci0JCi0JCWV4cGVjdChzb2x2ZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JLZXkoYnVzaW5lc3NPYmplY3RLZXkpKS5hbmRSZXR1cm4obmV3IE9iamVjdCgpKTsKLSAJCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgcHJvdmlkZXIgPSBjcmVhdGVGZWF0dXJlUHJvdmlkZXIoKTsKLSAJCQotCQkvL3Rlc3QKLQkJSURlbGV0ZUNvbnRleHQgY29udGV4dCA9IHJlcGxheURlbGV0ZUNvbnRleHQocGUpOwotCQlhc3NlcnROdWxsKHByb3ZpZGVyLmdldERlbGV0ZUZlYXR1cmUoY29udGV4dCkpOwotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVEZWxldGVGZWF0dXJlKCl7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSByZXBsYXlQaWN0b2dyYW1FbGVtZW50KCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSA9IHJlcGxheUF0dHJpYnV0ZSgpOwotCQlleHBlY3Qoc29sdmVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yS2V5KGJ1c2luZXNzT2JqZWN0S2V5KSkuYW5kU3R1YlJldHVybihqcGEpOwotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIHByb3ZpZGVyID0gY3JlYXRlRmVhdHVyZVByb3ZpZGVyKCk7Ci0JCQotCQkvL3Rlc3QKLQkJSURlbGV0ZUNvbnRleHQgY29udGV4dCA9IHJlcGxheURlbGV0ZUNvbnRleHQocGUpOwotCQlhc3NlcnROb3ROdWxsKHByb3ZpZGVyLmdldERlbGV0ZUZlYXR1cmUoY29udGV4dCkpOwotCQlJRGVsZXRlRmVhdHVyZSBmZWF0dXJlID0gcHJvdmlkZXIuZ2V0RGVsZXRlRmVhdHVyZShjb250ZXh0KTsKLQkJYXNzZXJ0VHJ1ZShmZWF0dXJlIGluc3RhbmNlb2YgQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RW50aXR5RGVsZXRlRmVhdHVyZSgpewotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gcmVwbGF5UGljdG9ncmFtRWxlbWVudCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gcmVwbGF5SlBUKCJUZXN0RW50aXR5Iik7Ci0JCQotCQlleHBlY3Qoc29sdmVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yS2V5KGJ1c2luZXNzT2JqZWN0S2V5KSkuYW5kU3R1YlJldHVybihqcHQpOwotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIHByb3ZpZGVyID0gY3JlYXRlRmVhdHVyZVByb3ZpZGVyKCk7Ci0JCQotCQkvL3Rlc3QKLQkJSURlbGV0ZUNvbnRleHQgY29udGV4dCA9IHJlcGxheURlbGV0ZUNvbnRleHQocGUpOwotCQlhc3NlcnROb3ROdWxsKHByb3ZpZGVyLmdldERlbGV0ZUZlYXR1cmUoY29udGV4dCkpOwotCQlJRGVsZXRlRmVhdHVyZSBkZWxldGVGZWF0dXJlID0gcHJvdmlkZXIuZ2V0RGVsZXRlRmVhdHVyZShjb250ZXh0KTsKLQkJYXNzZXJ0VHJ1ZShkZWxldGVGZWF0dXJlIGluc3RhbmNlb2YgRGVsZXRlSlBBRW50aXR5RmVhdHVyZSk7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFJlbGF0aW9uRGVsZXRlRmVhdHVyZSgpewotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gcmVwbGF5UGljdG9ncmFtRWxlbWVudCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0MSA9IHJlcGxheUpQVCgiVGVzdEVudGl0eTEiKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdDIgPSByZXBsYXlKUFQoIlRlc3RFbnRpdHkyIik7Ci0JCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgcHJvdmlkZXIgPSBjcmVhdGVGZWF0dXJlUHJvdmlkZXIoKTsKLQotCQlBYnN0cmFjdFJlbGF0aW9uIHJlbGF0aW9uID0gbmV3IE1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbihwcm92aWRlciwganB0MSwganB0MiwgImF0dHJpYnV0ZTEiLCBmYWxzZSwgbnVsbCwgbnVsbCk7Ci0JCWV4cGVjdChzb2x2ZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JLZXkoYnVzaW5lc3NPYmplY3RLZXkpKS5hbmRTdHViUmV0dXJuKHJlbGF0aW9uKTsKLQkJCi0JCS8vdGVzdAotCQlJRGVsZXRlQ29udGV4dCBjb250ZXh0ID0gcmVwbGF5RGVsZXRlQ29udGV4dChwZSk7Ci0JCWFzc2VydE5vdE51bGwocHJvdmlkZXIuZ2V0RGVsZXRlRmVhdHVyZShjb250ZXh0KSk7Ci0JCUlEZWxldGVGZWF0dXJlIGRlbGV0ZUZlYXR1cmUgPSBwcm92aWRlci5nZXREZWxldGVGZWF0dXJlKGNvbnRleHQpOwotCQlhc3NlcnRUcnVlKGRlbGV0ZUZlYXR1cmUgaW5zdGFuY2VvZiBEZWxldGVSZWxhdGlvbkZlYXR1cmUpOwotCX0KLQotCXByaXZhdGUgSmF2YVBlcnNpc3RlbnRUeXBlIHJlcGxheUpQVChTdHJpbmcgbmFtZSl7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEphdmFQZXJzaXN0ZW50VHlwZS5jbGFzcyk7Ci0JCWV4cGVjdChqcHQuZ2V0TmFtZSgpKS5hbmRSZXR1cm4obmFtZSk7Ci0JCXJlcGxheShqcHQpOwotCQlyZXR1cm4ganB0OwotCX0KLQkKLQlwcml2YXRlIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHJlcGxheUF0dHJpYnV0ZSgpewotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmNsYXNzKTsKLQkJZXhwZWN0KGF0dHJpYnV0ZS5nZXROYW1lKCkpLmFuZFJldHVybigiYXR0cmlidXRlIik7Ci0JCXJlcGxheShhdHRyaWJ1dGUpOwotCQlyZXR1cm4gYXR0cmlidXRlOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIFBpY3RvZ3JhbUVsZW1lbnQgcmVwbGF5UGljdG9ncmFtRWxlbWVudCgpewotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gRWFzeU1vY2suY3JlYXRlTW9jayhQaWN0b2dyYW1FbGVtZW50LmNsYXNzKTsKLQkJUmVzb3VyY2UgciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soUmVzb3VyY2UuY2xhc3MpOwotCQlleHBlY3QocGUuZVJlc291cmNlKCkpLmFuZFN0dWJSZXR1cm4ocik7Ci0JCS8vZXhwZWN0KHBlLmlzX19fQWxpdmUoKSkuYW5kU3R1YlJldHVybih0cnVlKTsKLQkJRUxpc3Q8UHJvcGVydHk+IHByb3BlcnRpZXMgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEVMaXN0LmNsYXNzKTsKLQkJUHJvcGVydHkgcHJvcCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soUHJvcGVydHkuY2xhc3MpOwotCQlleHBlY3QocHJvcC5nZXRLZXkoKSkuYW5kU3R1YlJldHVybigiaW5kZXBlbmRlbnRPYmplY3QiKTsKLQkJZXhwZWN0KHByb3AuZ2V0VmFsdWUoKSkuYW5kU3R1YlJldHVybihidXNpbmVzc09iamVjdEtleSk7Ci0JCXJlcGxheShwcm9wLCByKTsKLQkJcHJvcGVydGllcy5hZGQocHJvcCk7Ci0JCWV4cGVjdChwZS5nZXRQcm9wZXJ0aWVzKCkpLmFuZFN0dWJSZXR1cm4ocHJvcGVydGllcyk7Ci0JCXJlcGxheShwZSk7Ci0JCXJldHVybiBwZTsKLQl9Ci0KLQlwcml2YXRlIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgY3JlYXRlRmVhdHVyZVByb3ZpZGVyKCkgewotCQlJRGlhZ3JhbVR5cGVQcm92aWRlciBkdHAgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElEaWFncmFtVHlwZVByb3ZpZGVyLmNsYXNzKTsKLQkJcmVwbGF5KGR0cCk7Ci0JCXNvbHZlci5zZXRGZWF0dXJlUHJvdmlkZXIoaXNBKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpKTsKLQkJcmVwbGF5KHNvbHZlcik7Ci0JCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgcHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlleHBlY3QocHJvdmlkZXIuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpKS5hbmRTdHViUmV0dXJuKGR0cCk7Ci0JCS8vcHJvdmlkZXIuZ2V0Ci0JCXJlcGxheShwcm92aWRlcik7Ci0JCXJldHVybiBwcm92aWRlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBJRGVsZXRlQ29udGV4dCByZXBsYXlEZWxldGVDb250ZXh0KFBpY3RvZ3JhbUVsZW1lbnQgcGUpewotCQlJRGVsZXRlQ29udGV4dCBjb250ZXh0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRGVsZXRlQ29udGV4dC5jbGFzcyk7Ci0JCWV4cGVjdChjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKSkuYW5kU3R1YlJldHVybihwZSk7Ci0JCXJlcGxheShjb250ZXh0KTsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyVGVzdC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9wcm92aWRlci9KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk4NzY4MC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtpcmlsIE1pdG92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLnByb3ZpZGVyOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBsYXk7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay52ZXJpZnk7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotCi1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmR0LklEaWFncmFtVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JRG91YmxlQ2xpY2tDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuR3JhcGhpY3NBbGdvcml0aG07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnRiLklEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudGIuSVRvb2xCZWhhdmlvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnRiLkltYWdlRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51aS5KUEFFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUVjbGlwc2VGYWNhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JU3RhdGljSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlclRlc3QgewotCi0JLyoqCi0JICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVuZGVyaW5nRGVjb3JhdG9yc1BpY3RvZ3JhbUVsZW1lbnRFcnJvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gcmVwbGF5UGljdG9ncmFtRWxlbWVudCgxMDAsIDEwMCk7Ci0JCUlNYXJrZXIgbWFya2VyID0gcmVwbGF5TWFya2VyKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsICJFcnJvciBtZXNzYWdlIik7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSByZXBsYXlKcHRXaXRoTWFya2VyKG5ldyBJTWFya2VyW10geyBtYXJrZXIgfSk7Ci0JCUlEaWFncmFtVHlwZVByb3ZpZGVyIGR0cCA9IHJlcGxheURpYWdyYW1Qcm92aWRlcihwZSwganB0KTsKLQotCQlJVG9vbEJlaGF2aW9yUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXIoZHRwKTsKLQkJSURlY29yYXRvcltdIGRlY29yYXRvcnMgPSBwcm92aWRlci5nZXREZWNvcmF0b3JzKHBlKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGRlY29yYXRvcnMubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCJFcnJvciBtZXNzYWdlIiwgZGVjb3JhdG9yc1swXS5nZXRNZXNzYWdlKCkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEdldFJlbmRlcmluZ0RlY29yYXRvcnNQaWN0b2dyYW1FbGVtZW50V2FybmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gcmVwbGF5UGljdG9ncmFtRWxlbWVudCgxMDAsIDEwMCk7Ci0KLQkJSU1hcmtlciBtYXJrZXIgPSByZXBsYXlNYXJrZXIoSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCAiV2FybmluZyBtZXNzYWdlIik7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSByZXBsYXlKcHRXaXRoTWFya2VyKG5ldyBJTWFya2VyW10geyBtYXJrZXIgfSk7Ci0JCUlEaWFncmFtVHlwZVByb3ZpZGVyIGR0cCA9IHJlcGxheURpYWdyYW1Qcm92aWRlcihwZSwganB0KTsKLQotCQlJVG9vbEJlaGF2aW9yUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXIoZHRwKTsKLQkJSURlY29yYXRvcltdIGRlY29yYXRvcnMgPSBwcm92aWRlci5nZXREZWNvcmF0b3JzKHBlKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGRlY29yYXRvcnMubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXYXJuaW5nIG1lc3NhZ2UiLCBkZWNvcmF0b3JzWzBdLmdldE1lc3NhZ2UoKSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVuZGVyaW5nRGVjb3JhdG9yc1BpY3RvZ3JhbUVsZW1lbnRJbmZvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSByZXBsYXlQaWN0b2dyYW1FbGVtZW50KDEwMCwgMTAwKTsKLQkJSU1hcmtlciBtYXJrZXIgPSByZXBsYXlNYXJrZXIoSU1hcmtlci5TRVZFUklUWV9JTkZPLCAiSW5mbyBtZXNzYWdlIik7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSByZXBsYXlKcHRXaXRoTWFya2VyKG5ldyBJTWFya2VyW10geyBtYXJrZXIgfSk7Ci0JCUlEaWFncmFtVHlwZVByb3ZpZGVyIGR0cCA9IHJlcGxheURpYWdyYW1Qcm92aWRlcihwZSwganB0KTsKLQotCQlJVG9vbEJlaGF2aW9yUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXIoZHRwKTsKLQkJSURlY29yYXRvcltdIGRlY29yYXRvcnMgPSBwcm92aWRlci5nZXREZWNvcmF0b3JzKHBlKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGRlY29yYXRvcnMubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbmZvIG1lc3NhZ2UiLCBkZWNvcmF0b3JzWzBdLmdldE1lc3NhZ2UoKSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVuZGVyaW5nRGVjb3JhdG9yc1BpY3RvZ3JhbUVsZW1lbnROb01hcmtlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IHJlcGxheVBpY3RvZ3JhbUVsZW1lbnQoMTAwLCAxMDApOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gcmVwbGF5SnB0V2l0aE1hcmtlcihuZXcgSU1hcmtlclswXSk7Ci0JCUlEaWFncmFtVHlwZVByb3ZpZGVyIGR0cCA9IHJlcGxheURpYWdyYW1Qcm92aWRlcihwZSwganB0KTsKLQotCQlJVG9vbEJlaGF2aW9yUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXIoZHRwKTsKLQkJSURlY29yYXRvcltdIGRlY29yYXRvcnMgPSBwcm92aWRlci5nZXREZWNvcmF0b3JzKHBlKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlY29yYXRvcnMubGVuZ3RoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZW5kZXJpbmdEZWNvcmF0b3JzUGljdG9ncmFtRWxlbWVudFR3b01hcmtlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IHJlcGxheVBpY3RvZ3JhbUVsZW1lbnQoMTAwLCAxMDApOwotCQlJTWFya2VyIHdhcm5pbmdNYXJrZXIgPSByZXBsYXlNYXJrZXIoSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCAid2FybmluZyIpOwotCQlJTWFya2VyIGVycm9yTWFya2VyID0gcmVwbGF5TWFya2VyKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsICJlcnJvciIpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gcmVwbGF5SnB0V2l0aE1hcmtlcihuZXcgSU1hcmtlcltdIHsgZXJyb3JNYXJrZXIsIHdhcm5pbmdNYXJrZXIgfSk7Ci0JCUlEaWFncmFtVHlwZVByb3ZpZGVyIGR0cCA9IHJlcGxheURpYWdyYW1Qcm92aWRlcihwZSwganB0KTsKLQkJSVRvb2xCZWhhdmlvclByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyKGR0cCk7Ci0JCUlEZWNvcmF0b3JbXSBkZWNvcmF0b3JzID0gcHJvdmlkZXIuZ2V0RGVjb3JhdG9ycyhwZSk7Ci0JCWFzc2VydEVxdWFscygxLCBkZWNvcmF0b3JzLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiZXJyb3IiLCBkZWNvcmF0b3JzWzBdLmdldE1lc3NhZ2UoKSk7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEdldFJlbmRlcmluZ0RlY29yYXRvcnNQaWN0b2dyYW1FbGVtZW50TG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IHJlcGxheVBpY3RvZ3JhbUVsZW1lbnQoMTAwLCAxMDApOwotCQlJTWFya2VyIG1hcmtlciA9IHJlcGxheU1hcmtlcihJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCAiRXJyb3IgbWVzc2FnZSIpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gcmVwbGF5SnB0V2l0aE1hcmtlcihuZXcgSU1hcmtlcltdIHsgbWFya2VyIH0pOwotCQlJRGlhZ3JhbVR5cGVQcm92aWRlciBkdHAgPSByZXBsYXlEaWFncmFtUHJvdmlkZXIocGUsIGpwdCk7Ci0KLQkJSVRvb2xCZWhhdmlvclByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyKGR0cCk7Ci0JCUlEZWNvcmF0b3JbXSBkZWNvcmF0b3JzID0gcHJvdmlkZXIuZ2V0RGVjb3JhdG9ycyhwZSk7Ci0JCWFzc2VydEVxdWFscygxLCBkZWNvcmF0b3JzLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscyg4MCwgKChJbWFnZURlY29yYXRvcikgZGVjb3JhdG9yc1swXSkuZ2V0WCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDgwLCAoKEltYWdlRGVjb3JhdG9yKSBkZWNvcmF0b3JzWzBdKS5nZXRZKCkpOwotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RHZXREb3VibGVDbGlja09uSnB0RmVhdHVyZSgpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSByZXBsYXlQaWN0b2dyYW1FbGVtZW50KDEwMCwgMTAwKTsKLQkJSUZpbGUgZmlsZSA9IHJlcGxheVJlc291cmNlKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSByZXBsYXlKcHQocGUsIGZpbGUpOwotCQlJRGlhZ3JhbVR5cGVQcm92aWRlciBkdHAgPSByZXBsYXlEaWFncmFtUHJvdmlkZXIocGUsIGpwdCk7Ci0JCQotCQlJRWNsaXBzZUZhY2FkZSBmYWNhZGUgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElFY2xpcHNlRmFjYWRlLmNsYXNzKTsKLQkJSVN0YXRpY0lERSBpZGUgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElTdGF0aWNJREUuY2xhc3MpOwotCQlleHBlY3QoZmFjYWRlLmdldElERSgpKS5hbmRTdHViUmV0dXJuKGlkZSk7Ci0JCWlkZS5vcGVuRWRpdG9yKGZpbGUpOwotCQlyZXBsYXkoZmFjYWRlLCBpZGUpOwotCQlJVG9vbEJlaGF2aW9yUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXIoZHRwLCBmYWNhZGUpOwotICAgICAgCi0JCUlEb3VibGVDbGlja0NvbnRleHQgY29udGV4dCA9IHJlcGxheURvdWJsZUNsaWNrQ29udGV4dChwZSk7Ci0JCXByb3ZpZGVyLmdldERvdWJsZUNsaWNrRmVhdHVyZShjb250ZXh0KTsKLQkJdmVyaWZ5KGlkZSk7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEdldERvdWJsZUNsaWNrT25KcGFGZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSByZXBsYXlQaWN0b2dyYW1FbGVtZW50KDEwMCwgMTAwKTsKLQkJSUZpbGUgZmlsZSA9IHJlcGxheVJlc291cmNlKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSA9IHJlcGxheUpwYShwZSwgZmlsZSk7Ci0JCUlEaWFncmFtVHlwZVByb3ZpZGVyIGR0cCA9IHJlcGxheURpYWdyYW1Qcm92aWRlckZvckpwYShwZSwganBhKTsKLQkJCi0JCUlFY2xpcHNlRmFjYWRlIGVjbGlwc2VGYWNhZGUgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElFY2xpcHNlRmFjYWRlLmNsYXNzKTsKLQkJSVN0YXRpY0lERSBpZGUgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElTdGF0aWNJREUuY2xhc3MpOwotCQlleHBlY3QoZWNsaXBzZUZhY2FkZS5nZXRJREUoKSkuYW5kU3R1YlJldHVybihpZGUpOwotCQlpZGUub3BlbkVkaXRvcihmaWxlKTsKLQkJcmVwbGF5KGVjbGlwc2VGYWNhZGUsIGlkZSk7Ci0JCUlUb29sQmVoYXZpb3JQcm92aWRlciBwcm92aWRlciA9IG5ldyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcihkdHAsIGVjbGlwc2VGYWNhZGUpOwotCQkKLQkJSURvdWJsZUNsaWNrQ29udGV4dCBjb250ZXh0ID0gcmVwbGF5RG91YmxlQ2xpY2tDb250ZXh0KHBlKTsKLQkJcHJvdmlkZXIuZ2V0RG91YmxlQ2xpY2tGZWF0dXJlKGNvbnRleHQpOwotCQl2ZXJpZnkoaWRlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJRGlhZ3JhbVR5cGVQcm92aWRlciByZXBsYXlEaWFncmFtUHJvdmlkZXIoUGljdG9ncmFtRWxlbWVudCBwZSwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlJRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUZlYXR1cmVQcm92aWRlci5jbGFzcyk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKSkuYW5kU3R1YlJldHVybihqcHQpOwotCQlJRGlhZ3JhbVR5cGVQcm92aWRlciBkdHAgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElEaWFncmFtVHlwZVByb3ZpZGVyLmNsYXNzKTsKLQkJZXhwZWN0KGR0cC5nZXRGZWF0dXJlUHJvdmlkZXIoKSkuYW5kU3R1YlJldHVybihmZWF0dXJlUHJvdmlkZXIpOwotCQlyZXBsYXkoZHRwLCBmZWF0dXJlUHJvdmlkZXIpOwotCQlyZXR1cm4gZHRwOwotCX0KLQotCXByaXZhdGUgSU1hcmtlciByZXBsYXlNYXJrZXIoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTWFya2VyIG1hcmtlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSU1hcmtlci5jbGFzcyk7Ci0JCWV4cGVjdChtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpKS5hbmRTdHViUmV0dXJuKHNldmVyaXR5KTsKLQkJZXhwZWN0KG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSkuYW5kU3R1YlJldHVybihtZXNzYWdlKTsKLQkJcmVwbGF5KG1hcmtlcik7Ci0JCXJldHVybiBtYXJrZXI7Ci0JfQotCi0JcHJpdmF0ZSBKYXZhUGVyc2lzdGVudFR5cGUgcmVwbGF5SnB0V2l0aE1hcmtlcihJTWFya2VyW10gbWFya2VycykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhKYXZhUGVyc2lzdGVudFR5cGUuY2xhc3MpOwotCQlJRmlsZSBmaWxlID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRmlsZS5jbGFzcyk7Ci0JCWV4cGVjdChmaWxlLmV4aXN0cygpKS5hbmRSZXR1cm4odHJ1ZSk7Ci0JCWV4cGVjdChmaWxlLmZpbmRNYXJrZXJzKG51bGwsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSkpLmFuZFN0dWJSZXR1cm4obWFya2Vycyk7Ci0JCWV4cGVjdChqcHQuZ2V0UmVzb3VyY2UoKSkuYW5kU3R1YlJldHVybihmaWxlKTsKLQkJcmVwbGF5KGZpbGUsIGpwdCk7Ci0JCXJldHVybiBqcHQ7Ci0JfQotCQotCXByaXZhdGUgSUZpbGUgcmVwbGF5UmVzb3VyY2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGaWxlIGZpbGUgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElGaWxlLmNsYXNzKTsKLQkJZmlsZS5zZXRTZXNzaW9uUHJvcGVydHkobmV3IFF1YWxpZmllZE5hbWUobnVsbCwgSlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneS5ET1VCTEVfQ0xJQ0spLCAidHJ1ZSIpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlleHBlY3QoZmlsZS5nZXRUeXBlKCkpLmFuZFN0dWJSZXR1cm4oSVJlc291cmNlLkZJTEUpOwotCQlyZXBsYXkoZmlsZSk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQlwcml2YXRlIElEb3VibGVDbGlja0NvbnRleHQgcmVwbGF5RG91YmxlQ2xpY2tDb250ZXh0KFBpY3RvZ3JhbUVsZW1lbnQgcGUpewotCQlJRG91YmxlQ2xpY2tDb250ZXh0IGNvbnRleHQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElEb3VibGVDbGlja0NvbnRleHQuY2xhc3MpOwotCQlleHBlY3QoY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50cygpKS5hbmRTdHViUmV0dXJuKG5ldyBQaWN0b2dyYW1FbGVtZW50W10ge3BlfSk7Ci0JCXJlcGxheShjb250ZXh0KTsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCQotCXByaXZhdGUgSmF2YVBlcnNpc3RlbnRUeXBlIHJlcGxheUpwdChQaWN0b2dyYW1FbGVtZW50IHBlLCBJRmlsZSBmaWxlKXsKLQkJSUZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhKYXZhUGVyc2lzdGVudFR5cGUuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSkpLmFuZFN0dWJSZXR1cm4oanB0KTsKLQkJZXhwZWN0KGpwdC5nZXRSZXNvdXJjZSgpKS5hbmRSZXR1cm4oZmlsZSk7Ci0JCXJlcGxheShqcHQsIGZlYXR1cmVQcm92aWRlcik7Ci0JCXJldHVybiBqcHQ7Ci0JfQotCQotCXByaXZhdGUgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVwbGF5SnBhKFBpY3RvZ3JhbUVsZW1lbnQgcGUsIElGaWxlIGZpbGUpewotCQlJRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUZlYXR1cmVQcm92aWRlci5jbGFzcyk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSkpLmFuZFN0dWJSZXR1cm4oanBhKTsKLQkJZXhwZWN0KGpwYS5nZXRSZXNvdXJjZSgpKS5hbmRSZXR1cm4oZmlsZSk7Ci0JCXJlcGxheShqcGEsIGZlYXR1cmVQcm92aWRlcik7Ci0JCXJldHVybiBqcGE7Ci0JfQotCQotCXByaXZhdGUgSURpYWdyYW1UeXBlUHJvdmlkZXIgcmVwbGF5RGlhZ3JhbVByb3ZpZGVyRm9ySnBhKFBpY3RvZ3JhbUVsZW1lbnQgcGUsIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSkgewotCQlJRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUZlYXR1cmVQcm92aWRlci5jbGFzcyk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKSkuYW5kU3R1YlJldHVybihqcGEpOwotCQlJRGlhZ3JhbVR5cGVQcm92aWRlciBkdHAgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElEaWFncmFtVHlwZVByb3ZpZGVyLmNsYXNzKTsKLQkJZXhwZWN0KGR0cC5nZXRGZWF0dXJlUHJvdmlkZXIoKSkuYW5kU3R1YlJldHVybihmZWF0dXJlUHJvdmlkZXIpOwotCQlyZXBsYXkoZHRwLCBmZWF0dXJlUHJvdmlkZXIpOwotCQlyZXR1cm4gZHRwOwotCX0KLQotCXByaXZhdGUgUGljdG9ncmFtRWxlbWVudCByZXBsYXlQaWN0b2dyYW1FbGVtZW50KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gRWFzeU1vY2suY3JlYXRlTW9jayhQaWN0b2dyYW1FbGVtZW50LmNsYXNzKTsKLQkJR3JhcGhpY3NBbGdvcml0aG0gYWxnbyA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soR3JhcGhpY3NBbGdvcml0aG0uY2xhc3MpOwotCQlleHBlY3QoYWxnby5nZXRXaWR0aCgpKS5hbmRTdHViUmV0dXJuKHdpZHRoKTsKLQkJZXhwZWN0KGFsZ28uZ2V0SGVpZ2h0KCkpLmFuZFN0dWJSZXR1cm4oaGVpZ2h0KTsKLQkJZXhwZWN0KHBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkpLmFuZFN0dWJSZXR1cm4oYWxnbyk7Ci0JCXJlcGxheShwZSwgYWxnbyk7Ci0JCXJldHVybiBwZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3JlbGF0aW9uL0NyZWF0ZVJlbGF0aW9uQXR0cmlidXRlc1Rlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvcmVsYXRpb24vQ3JlYXRlUmVsYXRpb25BdHRyaWJ1dGVzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmNjNjVhLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvcmVsYXRpb24vQ3JlYXRlUmVsYXRpb25BdHRyaWJ1dGVzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5yZWxhdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suaXNBOwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVwbGF5OwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUVjbGlwc2VGYWNhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuSlBBQ3JlYXRlRmFjdG9yeTsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlUmVsYXRpb25BdHRyaWJ1dGVzVGVzdCB7Ci0JCi0JcHJpdmF0ZSBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlcjsKLQlmaW5hbCBTdHJpbmcgVEVTVF9QUk9KRUNUID0gIlRlc3QiOwotCXByaXZhdGUgSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIEpQQUNyZWF0ZUZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JSUVjbGlwc2VGYWNhZGUgZWNsaXBzZUZhY2FkZSA9IG51bGw7Ci0JCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZhY3RvcnkgPSBKUEFDcmVhdGVGYWN0b3J5Lmluc3RhbmNlKCk7Ci0JCWpwYVByb2plY3QgPSBmYWN0b3J5LmNyZWF0ZUpQQVByb2plY3QoVEVTVF9QUk9KRUNUICsgIl8iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwotCQlJRmlsZSBlbnRpdHkgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eShqcGFQcm9qZWN0LCAib3JnLmVjbGlwc2UuRW50aXR5MSIpOwotCQlUaHJlYWQuc2xlZXAoMjAwMCk7Ci0JCWZlYXR1cmVQcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlci5jbGFzcyk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KG51bGwpKS5hbmRSZXR1cm4oSlBBQ3JlYXRlRmFjdG9yeS5nZXRQZXJzaXN0ZW50VHlwZShlbnRpdHkpKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQoaXNBKEphdmFQZXJzaXN0ZW50VHlwZS5jbGFzcykpKS5hbmRSZXR1cm4oSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShlbnRpdHkpKS5hbnlUaW1lcygpOwotCQlyZXBsYXkoZmVhdHVyZVByb3ZpZGVyKTsKLQl9Ci0JCQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oSUZpbGUgZmlsZSkgewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShmaWxlKTsKLQkJaWYgKCFjdS5pc1dvcmtpbmdDb3B5KCkpCi0JCQl0cnkgewotCQkJCWN1LmJlY29tZVdvcmtpbmdDb3B5KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQlyZXR1cm4gY3U7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCS8vanBhUHJvamVjdC5zZXRVcGRhdGVyKG5ldyBTeW5jaHJvbm91c0pwYVByb2plY3RVcGRhdGVyKGpwYVByb2plY3QpKTsKLQkJSUZpbGUgY3VzdG9tZXJGaWxlID0gSlBBQ3JlYXRlRmFjdG9yeS5pbnN0YW5jZSgpLmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJhYmMifSwgIkN1c3RvbWVyIik7CQotCQlJRmlsZSBhZGRyZXNzRmlsZSA9IEpQQUNyZWF0ZUZhY3RvcnkuaW5zdGFuY2UoKS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiYWJjIn0sICJBZGRyZXNzIik7Ci0JCQotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlhc3NlcnRUcnVlKGN1c3RvbWVyRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBjdXN0b21lclR5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImFiYy5DdXN0b21lciIpOwotCQlhc3NlcnROb3ROdWxsKGN1c3RvbWVyVHlwZSk7Ci0JCQotCQkKLQkJUGVyc2lzdGVudFR5cGUgdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKGFkZHJlc3NGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGFkZHJlc3NUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJhYmMuQWRkcmVzcyIpOwotCQlhc3NlcnROb3ROdWxsKGN1c3RvbWVyVHlwZSk7Ci0KLQkJCi0JCVBlcnNpc3RlbnRUeXBlIHQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MiA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLSAKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0ciA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLgotCQkJCWFkZEF0dHJpYnV0ZShmZWF0dXJlUHJvdmlkZXIsIChKYXZhUGVyc2lzdGVudFR5cGUpdDEsIChKYXZhUGVyc2lzdGVudFR5cGUpdDIsICJhZGQiLCAiYWRkIiwgZmFsc2UsIAotCQkJCQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShjdXN0b21lckZpbGUpLAotCQkJCQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShhZGRyZXNzRmlsZSkpOwotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJUGVyc2lzdGVuY2VVbml0IHB1ID0ganBhUHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCkuZ2V0UGVyc2lzdGVuY2VVbml0cygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQl0MSA9IHB1LmdldFBlcnNpc3RlbnRUeXBlKCJhYmMuQ3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyKTsJCQkKLQotCX0KLQkKLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RBZGRPbmVUb09uZVVuaWRpcmVjdGlvbmFsUmVsYXRpb25BdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7CQotCQlJRmlsZSBjdXN0b21lckZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJDdXN0b21lciIpOwotCQkKLQkJSUZpbGUgYWRkcmVzc0ZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20ifSwgIkFkZHJlc3MiKTsKLQkJCi0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWFzc2VydFRydWUoY3VzdG9tZXJGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQ3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCQkKLQkJCi0JCVBlcnNpc3RlbnRUeXBlIHQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDEgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQkKLQkJYXNzZXJ0VHJ1ZShhZGRyZXNzRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBhZGRyZXNzVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLkFkZHJlc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCi0JCQotCQlQZXJzaXN0ZW50VHlwZSB0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDIgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0gCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS4KLQkJCWFkZEF0dHJpYnV0ZShmZWF0dXJlUHJvdmlkZXIsIChKYXZhUGVyc2lzdGVudFR5cGUpdDEsIChKYXZhUGVyc2lzdGVudFR5cGUpdDIsICJhZGRyZXNzIiwgImFkZHJlc3MiLCBmYWxzZSwgCQkJCQkJCi0JCQkJCWNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKXQxLmdldFJlc291cmNlKCkpLAotCQkJCQljcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSl0Mi5nZXRSZXNvdXJjZSgpKSk7CQkKLQkJYXNzZXJ0Tm90TnVsbChhdHRyKTsKLQkJCQotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRPbmVUb09uZVVuaWRpcmVjdGlvbmFsUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXQxLCBhdHRyKTsKLQkJCi0JCVBlcnNpc3RlbnRUeXBlIHB0ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAocHQgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQlwdCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCQotCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBwdC5yZXNvbHZlQXR0cmlidXRlKCJhZGRyZXNzIik7CQotCQlhc3NlcnROb3ROdWxsKGNQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQotCX0JCi0JCQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZE9uZVRvT25lQmlkaXJlY3Rpb25hbFJlbGF0aW9uQXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwkKLQkJSUZpbGUgY3VzdG9tZXJGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIn0sICJDdXN0b21lciIpOwotCQkKLQkJSUZpbGUgY3JlZGl0Q2FyZEZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20ifSwgIkNyZWRpdENhcmQiKTsKLQkJCi0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWFzc2VydFRydWUoY3VzdG9tZXJGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLkN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQkJCi0JCQotCQlQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQxID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJCi0JCWFzc2VydFRydWUoY3JlZGl0Q2FyZEZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3JlZGl0Q2FyZFR5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS5DcmVkaXRDYXJkIik7Ci0JCWFzc2VydE5vdE51bGwoY3JlZGl0Q2FyZEZpbGUpOwotCi0JCQotCQlQZXJzaXN0ZW50VHlwZSB0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjcmVkaXRDYXJkVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDIgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjcmVkaXRDYXJkVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0gCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS4KLQkJCWFkZEF0dHJpYnV0ZSggZmVhdHVyZVByb3ZpZGVyLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXQxLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXQyLCAiY3JlZGl0Q2FyZCIsICJjcmVkaXRDYXJkIiwgZmFsc2UsCi0JCQkJCWNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKXQxLmdldFJlc291cmNlKCkpLAotCQkJCQljcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSl0Mi5nZXRSZXNvdXJjZSgpKSk7CQkKLQkJYXNzZXJ0Tm90TnVsbChhdHRyKTsKLQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyMiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLgotCQkJYWRkQXR0cmlidXRlKGZlYXR1cmVQcm92aWRlciwgKEphdmFQZXJzaXN0ZW50VHlwZSl0MiwgKEphdmFQZXJzaXN0ZW50VHlwZSl0MSwgImN1c3RvbWVyIiwgImN1c3RvbWVyIiwgZmFsc2UsIAotCQkJCQljcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSl0Mi5nZXRSZXNvdXJjZSgpKSwKLQkJCQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpdDEuZ2V0UmVzb3VyY2UoKSkpOwkJCi0JCWFzc2VydE5vdE51bGwoYXR0cjIpOwotCQkKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkT25lVG9PbmVCaWRpcmVjdGlvbmFsUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXQxLCBhdHRyLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXQyLCBhdHRyMik7Ci0JCQotCQlQZXJzaXN0ZW50VHlwZSBvd25lclBlcnNpc3RlbnRUeXBlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAob3duZXJQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCW93bmVyUGVyc2lzdGVudFR5cGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJCi0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lclBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvd25lclBlcnNpc3RlbnRUeXBlLnJlc29sdmVBdHRyaWJ1dGUoImNyZWRpdENhcmQiKTsKLQkJYXNzZXJ0Tm90TnVsbChvd25lclBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQlhc3NlcnRUcnVlKG93bmVyUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgb3duZXJTaWRlTWFwcGluZyA9IG93bmVyUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUob3duZXJTaWRlTWFwcGluZyBpbnN0YW5jZW9mIEphdmFPbmVUb09uZU1hcHBpbmcpOyAKLQkJCi0JCWFzc2VydFRydWUoKChKYXZhT25lVG9PbmVNYXBwaW5nKW93bmVyU2lkZU1hcHBpbmcpLmlzUmVsYXRpb25zaGlwT3duZXIoKSk7Ci0JCQotCQlQZXJzaXN0ZW50VHlwZSBpbnZlcnNlUGVyc2lzdGVudFR5cGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3JlZGl0Q2FyZFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKGludmVyc2VQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCWludmVyc2VQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjcmVkaXRDYXJkVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCQotCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW52ZXJzZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBpbnZlcnNlUGVyc2lzdGVudFR5cGUucmVzb2x2ZUF0dHJpYnV0ZSgiY3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChpbnZlcnNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCWFzc2VydFRydWUoaW52ZXJzZVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQotCQlBdHRyaWJ1dGVNYXBwaW5nIGludmVyc2VTaWRlTWFwcGluZyA9IGludmVyc2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShpbnZlcnNlU2lkZU1hcHBpbmcgaW5zdGFuY2VvZiBKYXZhT25lVG9PbmVNYXBwaW5nKTsgCi0JCQotCQlhc3NlcnRGYWxzZSgoKEphdmFPbmVUb09uZU1hcHBpbmcpaW52ZXJzZVNpZGVNYXBwaW5nKS5pc1JlbGF0aW9uc2hpcE93bmVyKCkpOwotCX0JCi0JCi0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkT25lVG9NYW55VW5pZGlyZWN0aW9uYWxSZWxhdGlvbkF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCUlGaWxlIGN1c3RvbWVyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSJ9LCAiQ3VzdG9tZXIiKTsKLQkJCi0JCUlGaWxlIHBob25lRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSJ9LCAiUGhvbmUiKTsKLQkJCi0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWFzc2VydFRydWUoY3VzdG9tZXJGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLkN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQkJCi0JCQotCQlQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQxID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJCi0JCWFzc2VydFRydWUocGhvbmVGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHBob25lVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLlBob25lIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQotCQkKLQkJUGVyc2lzdGVudFR5cGUgdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgcGhvbmVUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MiA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIHBob25lVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0gCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRBdHRyaWJ1dGUoZmVhdHVyZVByb3ZpZGVyLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXQxLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXQyLCAicGhvbmVzIiwgInBob25lcyIsIHRydWUsIAotCQkJCWNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKXQxLmdldFJlc291cmNlKCkpLAotCQkJCWNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKXQyLmdldFJlc291cmNlKCkpKTsJCQotCQlhc3NlcnROb3ROdWxsKGF0dHIpOwotCQkJCi0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmFkZE9uZVRvTWFueVVuaWRpcmVjdGlvbmFsUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXQxLCBhdHRyLCBmYWxzZSk7Ci0JCQotCQlQZXJzaXN0ZW50VHlwZSBwdCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHB0ID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJcHQgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgcGhvbmVUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJCi0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHB0LnJlc29sdmVBdHRyaWJ1dGUoInBob25lcyIpOwkJCi0JCWFzc2VydE5vdE51bGwoY1BlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkKLQkJQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gY1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROb3ROdWxsKG1hcHBpbmcpOwotCQlhc3NlcnRUcnVlKG1hcHBpbmcgaW5zdGFuY2VvZiBKYXZhT25lVG9NYW55TWFwcGluZyk7IAotCQkKLQkJYXNzZXJ0VHJ1ZSgoKEphdmFPbmVUb01hbnlNYXBwaW5nKW1hcHBpbmcpLmlzUmVsYXRpb25zaGlwT3duZXIoKSk7Ci0JfQkKLQkKLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RBZGRPbmVUb01hbnlCaWRpcmVjdGlvbmFsUmVsYXRpb25BdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7CQotCQlJRmlsZSBjcnVpc2VGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIn0sICJDcnVpc2UiKTsJCQotCQlJRmlsZSByZXNlcnZhdGlvbkZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20ifSwgIlJlc2VydmF0aW9uIik7Ci0JCQotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlhc3NlcnRUcnVlKGNydWlzZUZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3J1aXNlVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLkNydWlzZSIpOwotCQlhc3NlcnROb3ROdWxsKGNydWlzZVR5cGUpOwotCQkKLQkJCi0JCVBlcnNpc3RlbnRUeXBlIHNpbmdsZVNpZGVQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjcnVpc2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlIChzaW5nbGVTaWRlUGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQlzaW5nbGVTaWRlUGVyc2lzdGVudFR5cGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3J1aXNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKHJlc2VydmF0aW9uRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNlcnZhdGlvblR5cGU9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLlJlc2VydmF0aW9uIik7Ci0JCWFzc2VydE5vdE51bGwocmVzZXJ2YXRpb25GaWxlKTsKLQotCQkKLQkJUGVyc2lzdGVudFR5cGUgbWFueVNpZGVQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCByZXNlcnZhdGlvblR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKG1hbnlTaWRlUGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQltYW55U2lkZVBlcnNpc3RlbnRUeXBlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIHJlc2VydmF0aW9uVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0gCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHNpbmdsZVNpZGVBdHRyaWJ1dGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS4KLQkJCWFkZEF0dHJpYnV0ZShmZWF0dXJlUHJvdmlkZXIsIChKYXZhUGVyc2lzdGVudFR5cGUpc2luZ2xlU2lkZVBlcnNpc3RlbnRUeXBlLCAoSmF2YVBlcnNpc3RlbnRUeXBlKW1hbnlTaWRlUGVyc2lzdGVudFR5cGUsICJyZXNlcnZhdGlvbnMiLCAicmVzZXJ2YXRpb25zIiwgdHJ1ZSwgCi0JCQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpc2luZ2xlU2lkZVBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlKCkpLAotCQkJCWNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKW1hbnlTaWRlUGVyc2lzdGVudFR5cGUuZ2V0UmVzb3VyY2UoKSkpOwkJCi0JCWFzc2VydE5vdE51bGwoc2luZ2xlU2lkZUF0dHJpYnV0ZSk7Ci0KLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbWFueVNpZGVBdHRyaWJ1dGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS4KLQkJCWFkZEF0dHJpYnV0ZShmZWF0dXJlUHJvdmlkZXIsIChKYXZhUGVyc2lzdGVudFR5cGUpbWFueVNpZGVQZXJzaXN0ZW50VHlwZSwgKEphdmFQZXJzaXN0ZW50VHlwZSlzaW5nbGVTaWRlUGVyc2lzdGVudFR5cGUsICJjcnVpc2UiLCAiY3J1aXNlIiwgZmFsc2UsIAotCQkJCWNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKW1hbnlTaWRlUGVyc2lzdGVudFR5cGUuZ2V0UmVzb3VyY2UoKSksCi0JCQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpc2luZ2xlU2lkZVBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlKCkpKTsJCQotCQlhc3NlcnROb3ROdWxsKG1hbnlTaWRlQXR0cmlidXRlKTsKLQkJCi0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmFkZE9uZVRvTWFueUJpZGlyZWN0aW9uYWxSZWxhdGlvbihmZWF0dXJlUHJvdmlkZXIsIChKYXZhUGVyc2lzdGVudFR5cGUpc2luZ2xlU2lkZVBlcnNpc3RlbnRUeXBlLCBzaW5nbGVTaWRlQXR0cmlidXRlLCAoSmF2YVBlcnNpc3RlbnRUeXBlKW1hbnlTaWRlUGVyc2lzdGVudFR5cGUsIG1hbnlTaWRlQXR0cmlidXRlLCBmYWxzZSk7Ci0JCQotCQkvLyBJbiBvbmUtdG8tbWFueSBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uIG1hbnkgc2lkZSBpcyBBTFdBWVMgb3duZXIKLQkJUGVyc2lzdGVudFR5cGUgaW52ZXJzZVBlcnNpc3RlbnRUeXBlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGNydWlzZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKGludmVyc2VQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCWludmVyc2VQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjcnVpc2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJCi0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGludmVyc2VQZXJzaXN0ZW50VHlwZS5yZXNvbHZlQXR0cmlidXRlKCJyZXNlcnZhdGlvbnMiKTsKLQkJYXNzZXJ0Tm90TnVsbChpbnZlcnNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCWFzc2VydFRydWUoaW52ZXJzZVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQotCQlBdHRyaWJ1dGVNYXBwaW5nIGludmVyc2VTaWRlTWFwcGluZyA9IGludmVyc2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShpbnZlcnNlU2lkZU1hcHBpbmcgaW5zdGFuY2VvZiBKYXZhT25lVG9NYW55TWFwcGluZyk7IAotCQkKLQkJYXNzZXJ0RmFsc2UoKChKYXZhT25lVG9NYW55TWFwcGluZylpbnZlcnNlU2lkZU1hcHBpbmcpLmlzUmVsYXRpb25zaGlwT3duZXIoKSk7Ci0JCQotCQkvLyBJbiBvbmUtdG8tbWFueSBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uIG1hbnkgc2lkZSBpcyBBTFdBWVMgb3duZXIKLQkJUGVyc2lzdGVudFR5cGUgb3duZXJQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCByZXNlcnZhdGlvblR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJaW50IGMgPSAwOwotCQl3aGlsZSAoKG93bmVyUGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgJiYgKGMgPCA1MCkpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJb3duZXJQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCByZXNlcnZhdGlvblR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJCWMrKzsKLQkJfQotCQlhc3NlcnROb3ROdWxsKG93bmVyUGVyc2lzdGVudFR5cGUpOwotCQkKLQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG93bmVyUGVyc2lzdGVudFR5cGUucmVzb2x2ZUF0dHJpYnV0ZSgiY3J1aXNlIik7Ci0JCWMgPSAwOwotCQl3aGlsZSAoKG93bmVyUGVyc2lzdGVudEF0dHJpYnV0ZSA9PSBudWxsKSAmJiAoYyA8IDUwKSkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQlvd25lclBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvd25lclBlcnNpc3RlbnRUeXBlLnJlc29sdmVBdHRyaWJ1dGUoImNydWlzZSIpOwotCQkJYysrOwotCQl9CQkKLQkJCi0JCWFzc2VydE5vdE51bGwob3duZXJQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJYXNzZXJ0VHJ1ZShvd25lclBlcnNpc3RlbnRBdHRyaWJ1dGUgaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQotCQlBdHRyaWJ1dGVNYXBwaW5nIG93bmVyU2lkZU1hcHBpbmcgPSBvd25lclBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQljID0gMDsKLQkJd2hpbGUgKChvd25lclNpZGVNYXBwaW5nID09IG51bGwpICYmIChjIDwgNTApKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCW93bmVyU2lkZU1hcHBpbmcgPSBvd25lclBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkJYysrOwotCQl9CQotCQlpZiAob3duZXJTaWRlTWFwcGluZyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlhc3NlcnROb3ROdWxsKCJvd25lclNpZGVNYXBwaW5nIG11c3Qgbm90IGJlIG51bGwiLCBvd25lclNpZGVNYXBwaW5nKTsKLQkJYXNzZXJ0VHJ1ZSgib3duZXJTaWRlTWFwcGluZyBjbGFzcyBpcyAiICsgb3duZXJTaWRlTWFwcGluZy5nZXRDbGFzcygpLmdldE5hbWUoKSwgSmF2YU1hbnlUb09uZU1hcHBpbmcuY2xhc3MuaXNJbnN0YW5jZShvd25lclNpZGVNYXBwaW5nKSk7Ci0JCQotCQlhc3NlcnRUcnVlKCgoSmF2YU1hbnlUb09uZU1hcHBpbmcpb3duZXJTaWRlTWFwcGluZykuaXNSZWxhdGlvbnNoaXBPd25lcigpKTsKLQl9CQotCi0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTWFueVRvT25lVW5pZGlyZWN0aW9uYWxSZWxhdGlvbkF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCUlGaWxlIGNydWlzZUZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20ifSwgIkNydWlzZSIpOwotCQlJRmlsZSBzaGlwRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSJ9LCAiU2hpcCIpOwotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlhc3NlcnRUcnVlKGNydWlzZUZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3J1aXNlVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLkNydWlzZSIpOwotCQlhc3NlcnROb3ROdWxsKGNydWlzZVR5cGUpOwotCQkJCi0JCVBlcnNpc3RlbnRUeXBlIG1hbnlTaWRlUGVyc2lzdGVudFR5cGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3J1aXNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAobWFueVNpZGVQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCW1hbnlTaWRlUGVyc2lzdGVudFR5cGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3J1aXNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKHNoaXBGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHNoaXBUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20uU2hpcCIpOwotCQlhc3NlcnROb3ROdWxsKGNydWlzZVR5cGUpOwotCi0JCQotCQlQZXJzaXN0ZW50VHlwZSBzaW5nbGVTaWRlUGVyc2lzdGVudFR5cGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgc2hpcFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHNpbmdsZVNpZGVQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXNpbmdsZVNpZGVQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBzaGlwVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0gCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG1hcHBlZEF0dHJpYnV0ZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLgotCQkJYWRkQXR0cmlidXRlKGZlYXR1cmVQcm92aWRlciwgKEphdmFQZXJzaXN0ZW50VHlwZSltYW55U2lkZVBlcnNpc3RlbnRUeXBlLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXNpbmdsZVNpZGVQZXJzaXN0ZW50VHlwZSwgInNoaXAiLCAic2hpcCIsIHRydWUsIAotCQkJCQljcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSltYW55U2lkZVBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlKCkpLAotCQkJCQljcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSlzaW5nbGVTaWRlUGVyc2lzdGVudFR5cGUuZ2V0UmVzb3VyY2UoKSkpOwkJCi0JCWFzc2VydE5vdE51bGwobWFwcGVkQXR0cmlidXRlKTsKLQkJCQotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRNYW55VG9PbmVVbmlkaXJlY3Rpb25hbFJlbGF0aW9uKGZlYXR1cmVQcm92aWRlciwgKEphdmFQZXJzaXN0ZW50VHlwZSltYW55U2lkZVBlcnNpc3RlbnRUeXBlLCBtYXBwZWRBdHRyaWJ1dGUpOwotCQkKLQkJUGVyc2lzdGVudFR5cGUgcHQgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3J1aXNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAocHQgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQlwdCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBzaGlwVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCQotCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBwdC5yZXNvbHZlQXR0cmlidXRlKCJzaGlwIik7CQotCQlpbnQgY250ID0gMDsKLQkJd2hpbGUgKChjUGVyc2lzdGVudEF0dHJpYnV0ZSA9PSBudWxsKSAmJiAoY250IDwgMTAwKSkgewotCQkJVGhyZWFkLnNsZWVwKDI1MCk7Ci0JCQljUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHB0LnJlc29sdmVBdHRyaWJ1dGUoInNoaXAiKTsJCi0JCQljbnQrKzsKLQkJfQkJCi0JCWFzc2VydE5vdE51bGwoY1BlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkKLQkJQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gY1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQljbnQgPSAwOwotCQl3aGlsZSAoKG1hcHBpbmcgPT0gbnVsbCkgJiYgKGNudCA8IDEwMCkpIHsKLQkJCVRocmVhZC5zbGVlcCgyNTApOwotCQkJbWFwcGluZyA9IGNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCWNudCsrOwotCQl9Ci0JCWFzc2VydE5vdE51bGwobWFwcGluZyk7Ci0JCWFzc2VydFRydWUobWFwcGluZyBpbnN0YW5jZW9mIEphdmFNYW55VG9PbmVNYXBwaW5nKTsgCi0JCQotCQlhc3NlcnRUcnVlKCgoSmF2YU1hbnlUb09uZU1hcHBpbmcpbWFwcGluZykuaXNSZWxhdGlvbnNoaXBPd25lcigpKTsKLQl9CQotCQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZE1hbnlUb01hbnlCaWRpcmVjdGlvbmFsUmVsYXRpb25BdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7CQotCQlJRmlsZSByZXNlcnZhdGlvbkZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20ifSwgIlJlc2VydmF0aW9uIik7Ci0JCUlGaWxlIGN1c3RvbWVyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSJ9LCAiQ3VzdG9tZXIiKTsKLQkJCi0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWFzc2VydFRydWUocmVzZXJ2YXRpb25GaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc2VydmF0aW9uVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLlJlc2VydmF0aW9uIik7Ci0JCWFzc2VydE5vdE51bGwocmVzZXJ2YXRpb25UeXBlKTsKLQkJCi0JCVBlcnNpc3RlbnRUeXBlIG93bmVyU2lkZVBlcnNpc3RlbnRUeXBlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIHJlc2VydmF0aW9uVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAob3duZXJTaWRlUGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQlvd25lclNpZGVQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCByZXNlcnZhdGlvblR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQkKLQkJYXNzZXJ0VHJ1ZShjdXN0b21lckZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3VzdG9tZXJUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20uQ3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lckZpbGUpOwotCi0JCQotCQlQZXJzaXN0ZW50VHlwZSBpbnZlcnNlU2lkZVBlcnNpc3RlbnRUeXBlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAoaW52ZXJzZVNpZGVQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCWludmVyc2VTaWRlUGVyc2lzdGVudFR5cGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLSAKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJTaWRlQXR0cmlidXRlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuCi0JCQlhZGRBdHRyaWJ1dGUoZmVhdHVyZVByb3ZpZGVyLCAoSmF2YVBlcnNpc3RlbnRUeXBlKW93bmVyU2lkZVBlcnNpc3RlbnRUeXBlLCAoSmF2YVBlcnNpc3RlbnRUeXBlKWludmVyc2VTaWRlUGVyc2lzdGVudFR5cGUsICJjdXN0b21lcnMiLCAiY3VzdG9tZXJzIiwgdHJ1ZSwKLQkJCQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpb3duZXJTaWRlUGVyc2lzdGVudFR5cGUuZ2V0UmVzb3VyY2UoKSksCi0JCQkJCWNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKWludmVyc2VTaWRlUGVyc2lzdGVudFR5cGUuZ2V0UmVzb3VyY2UoKSkpOwkJCi0JCWFzc2VydE5vdE51bGwob3duZXJTaWRlQXR0cmlidXRlKTsKLQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlU2lkZUF0dHJpYnV0ZXMgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRBdHRyaWJ1dGUoZmVhdHVyZVByb3ZpZGVyLCAoSmF2YVBlcnNpc3RlbnRUeXBlKWludmVyc2VTaWRlUGVyc2lzdGVudFR5cGUsIChKYXZhUGVyc2lzdGVudFR5cGUpb3duZXJTaWRlUGVyc2lzdGVudFR5cGUsICJyZXNlcnZhdGlvbnMiLCAicmVzZXJ2YXRpb25zIiwgdHJ1ZSwgCi0JCQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpaW52ZXJzZVNpZGVQZXJzaXN0ZW50VHlwZS5nZXRSZXNvdXJjZSgpKSwKLQkJCQljcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSlvd25lclNpZGVQZXJzaXN0ZW50VHlwZS5nZXRSZXNvdXJjZSgpKSk7CQkKLQkJYXNzZXJ0Tm90TnVsbChpbnZlcnNlU2lkZUF0dHJpYnV0ZXMpOwotCQkKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkTWFueVRvTWFueUJpZGlyZWN0aW9uYWxSZWxhdGlvbihmZWF0dXJlUHJvdmlkZXIsIChKYXZhUGVyc2lzdGVudFR5cGUpb3duZXJTaWRlUGVyc2lzdGVudFR5cGUsIG93bmVyU2lkZUF0dHJpYnV0ZSwgKEphdmFQZXJzaXN0ZW50VHlwZSlpbnZlcnNlU2lkZVBlcnNpc3RlbnRUeXBlLCBpbnZlcnNlU2lkZUF0dHJpYnV0ZXMsIGZhbHNlKTsKLQkJCi0JCVBlcnNpc3RlbnRUeXBlIG93bmVyUGVyc2lzdGVudFR5cGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgcmVzZXJ2YXRpb25UeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlIChvd25lclBlcnNpc3RlbnRUeXBlID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJb3duZXJQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCByZXNlcnZhdGlvblR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQkKLQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG93bmVyUGVyc2lzdGVudFR5cGUucmVzb2x2ZUF0dHJpYnV0ZSgiY3VzdG9tZXJzIik7Ci0JCWFzc2VydE5vdE51bGwob3duZXJQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJYXNzZXJ0VHJ1ZShvd25lclBlcnNpc3RlbnRBdHRyaWJ1dGUgaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQotCQlBdHRyaWJ1dGVNYXBwaW5nIG93bmVyU2lkZU1hcHBpbmcgPSBvd25lclBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRUcnVlKG93bmVyU2lkZU1hcHBpbmcgaW5zdGFuY2VvZiBKYXZhTWFueVRvTWFueU1hcHBpbmcpOyAKLQkJCi0JCWFzc2VydFRydWUoKChKYXZhTWFueVRvTWFueU1hcHBpbmcpb3duZXJTaWRlTWFwcGluZykuaXNSZWxhdGlvbnNoaXBPd25lcigpKTsKLQkKLQkJUGVyc2lzdGVudFR5cGUgaW52ZXJzZVBlcnNpc3RlbnRUeXBlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAoaW52ZXJzZVBlcnNpc3RlbnRUeXBlID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJaW52ZXJzZVBlcnNpc3RlbnRUeXBlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCQotCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW52ZXJzZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBpbnZlcnNlUGVyc2lzdGVudFR5cGUucmVzb2x2ZUF0dHJpYnV0ZSgicmVzZXJ2YXRpb25zIik7Ci0JCWFzc2VydE5vdE51bGwoaW52ZXJzZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQlhc3NlcnRUcnVlKGludmVyc2VQZXJzaXN0ZW50QXR0cmlidXRlIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkKLQkJQXR0cmlidXRlTWFwcGluZyBpbnZlcnNlU2lkZU1hcHBpbmcgPSBpbnZlcnNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUoaW52ZXJzZVNpZGVNYXBwaW5nIGluc3RhbmNlb2YgSmF2YU1hbnlUb01hbnlNYXBwaW5nKTsgCi0JCQotCQlhc3NlcnRGYWxzZSgoKEphdmFNYW55VG9NYW55TWFwcGluZylpbnZlcnNlU2lkZU1hcHBpbmcpLmlzUmVsYXRpb25zaGlwT3duZXIoKSk7Ci0JfQkKLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RBZGRNYW55VG9NYW55VW5pZGlyZWN0aW9uYWxSZWxhdGlvbkF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCUlGaWxlIHJlc2VydmF0aW9uRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSJ9LCAiUmVzZXJ2YXRpb24iKTsKLQkJSUZpbGUgY2FiaW5GaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIn0sICJDYWJpbiIpOwotCQkKLQkJanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShyZXNlcnZhdGlvbkZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzZXJ2YXRpb25UeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20uUmVzZXJ2YXRpb24iKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNlcnZhdGlvblR5cGUpOwotCQkKLQkJUGVyc2lzdGVudFR5cGUgYW5ub3RhdGVkUGVyc2lzdGVudFR5cGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgcmVzZXJ2YXRpb25UeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlIChhbm5vdGF0ZWRQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCWFubm90YXRlZFBlcnNpc3RlbnRUeXBlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIHJlc2VydmF0aW9uVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKGNhYmluRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBjYWJpblR5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS5DYWJpbiIpOwotCQlhc3NlcnROb3ROdWxsKGNhYmluRmlsZSk7Ci0KLQkJCi0JCVBlcnNpc3RlbnRUeXBlIHJlZmVyZW5jZWRQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjYWJpblR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHJlZmVyZW5jZWRQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXJlZmVyZW5jZWRQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjYWJpblR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotIAotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhbm5vdGF0ZWRTaWRlQXR0cmlidXRlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuCi0JCQlhZGRBdHRyaWJ1dGUoZmVhdHVyZVByb3ZpZGVyLCAoSmF2YVBlcnNpc3RlbnRUeXBlKWFubm90YXRlZFBlcnNpc3RlbnRUeXBlLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXJlZmVyZW5jZWRQZXJzaXN0ZW50VHlwZSwgImNhYmlucyIsICJjYWJpbnMiLCB0cnVlLAotCQkJCQljcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSlhbm5vdGF0ZWRQZXJzaXN0ZW50VHlwZS5nZXRSZXNvdXJjZSgpKSwKLQkJCQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpcmVmZXJlbmNlZFBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlKCkpKTsJCQotCQlhc3NlcnROb3ROdWxsKGFubm90YXRlZFNpZGVBdHRyaWJ1dGUpOwotCQkKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkTWFueVRvTWFueVVuaWRpcmVjdGlvbmFsUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCAoSmF2YVBlcnNpc3RlbnRUeXBlKWFubm90YXRlZFBlcnNpc3RlbnRUeXBlLCBhbm5vdGF0ZWRTaWRlQXR0cmlidXRlLCBmYWxzZSk7Ci0JCQotCQlQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCByZXNlcnZhdGlvblR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHBlcnNpc3RlbnRUeXBlID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJcGVyc2lzdGVudFR5cGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgcmVzZXJ2YXRpb25UeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJCi0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gcGVyc2lzdGVudFR5cGUucmVzb2x2ZUF0dHJpYnV0ZSgiY2FiaW5zIik7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZSBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZyA9IHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRUcnVlKG1hcHBpbmcgaW5zdGFuY2VvZiBKYXZhTWFueVRvTWFueU1hcHBpbmcpOyAKLQkJCi0JCWFzc2VydFRydWUoKChKYXZhTWFueVRvTWFueU1hcHBpbmcpbWFwcGluZykuaXNSZWxhdGlvbnNoaXBPd25lcigpKTsKLQkJfQkKLQkKLQotCQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9yZWxhdGlvbi9DcmVhdGVSZWxhdGlvbnNJbkZpZWxkQW5ub3RhdGVkRW50aXRpZXNUZXN0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3JlbGF0aW9uL0NyZWF0ZVJlbGF0aW9uc0luRmllbGRBbm5vdGF0ZWRFbnRpdGllc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMxMzUxMi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3JlbGF0aW9uL0NyZWF0ZVJlbGF0aW9uc0luRmllbGRBbm5vdGF0ZWRFbnRpdGllc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwucmVsYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmlzQTsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlcGxheTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWFzeW1vY2suRWFzeU1vY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLkFic3RyYWN0UmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb01hbnlCaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5NYW55VG9NYW55VW5pRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb09uZUJpRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb09uZVVuaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5PbmVUb01hbnlVbmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuT25lVG9PbmVCaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5PbmVUb09uZVVuaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUVjbGlwc2VGYWNhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuSlBBQ3JlYXRlRmFjdG9yeTsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlUmVsYXRpb25zSW5GaWVsZEFubm90YXRlZEVudGl0aWVzVGVzdCB7Ci0KLQlwcml2YXRlIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyOwotCWZpbmFsIFN0cmluZyBURVNUX1BST0pFQ1QgPSAiVGVzdCI7Ci0JcHJpdmF0ZSBKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBudWxsOwotCXByaXZhdGUgSlBBQ3JlYXRlRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQlJRWNsaXBzZUZhY2FkZSBlY2xpcHNlRmFjYWRlID0gbnVsbDsKLQkKLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmFjdG9yeSA9IEpQQUNyZWF0ZUZhY3RvcnkuaW5zdGFuY2UoKTsKLQkJanBhUHJvamVjdCA9IGZhY3RvcnkuY3JlYXRlSlBBUHJvamVjdChURVNUX1BST0pFQ1QgKyAiXyIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0JCUlGaWxlIGVudGl0eSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5KGpwYVByb2plY3QsICJvcmcuZWNsaXBzZS5FbnRpdHkxIik7Ci0JCVRocmVhZC5zbGVlcCgyMDAwKTsKLQkJZmVhdHVyZVByb3ZpZGVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQobnVsbCkpLmFuZFJldHVybihKUEFDcmVhdGVGYWN0b3J5LmdldFBlcnNpc3RlbnRUeXBlKGVudGl0eSkpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdChpc0EoSmF2YVBlcnNpc3RlbnRUeXBlLmNsYXNzKSkpLmFuZFJldHVybihKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGVudGl0eSkpLmFueVRpbWVzKCk7Ci0JCXJlcGxheShmZWF0dXJlUHJvdmlkZXIpOwotCX0KLQkKLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZmlsZSk7Ci0JfQotCQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlT25lVG9PbmVVbmlkaXJSZWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwkKLQkJSUZpbGUgY3VzdG9tZXJGaWxlID0gZmFjdG9yeS5jcmVhdGVGaWVsZEFubm90YXRlZEVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJDdXN0b21lciIpOwotCQkKLQkJSUZpbGUgYWRkcmVzc0ZpbGUgPSBmYWN0b3J5LmNyZWF0ZUZpZWxkQW5ub3RhdGVkRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSJ9LCAiQWRkcmVzcyIpOwotCQkKLQkJanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShjdXN0b21lckZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3VzdG9tZXJUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5DdXN0b21lciIpOwotCQlhc3NlcnROb3ROdWxsKGN1c3RvbWVyVHlwZSk7Ci0JCQotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDEgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQkKLQkJYXNzZXJ0VHJ1ZShhZGRyZXNzRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBhZGRyZXNzVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLkFkZHJlc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCi0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQyID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQlJQ29tcGlsYXRpb25Vbml0IGN1MSA9IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKXQxLmdldFJlc291cmNlKCkpOwotCQlBYnN0cmFjdFJlbGF0aW9uIHJlbCA9IG5ldyBPbmVUb09uZVVuaURpclJlbGF0aW9uKGZlYXR1cmVQcm92aWRlciwgdDEsIHQyLCAiYWRkcmVzcyIsCi0JCQkJCQkJCSAgCQkJCQl0cnVlLCAKLQkJCQkJCQkJICAJCQkJCWN1MSwKLQkJCQkJCQkJICAJCQkJCWNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKXQyLmdldFJlc291cmNlKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWwpOwotCQlhc3NlcnRTYW1lKHQxLCByZWwuZ2V0T3duZXIoKSk7Ci0JCWFzc2VydFNhbWUodDIsIHJlbC5nZXRJbnZlcnNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCByZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lckF0ID0gdDEuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChvd25lckF0KTsKLQkJU2V0PFN0cmluZz4gYW5ub3RhdGlvbnMgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uTmFtZXMob3duZXJBdCk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuY29udGFpbnMoIk9uZVRvT25lIikpOwotCQlhc3NlcnROdWxsKCgoT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uKW93bmVyQXQuZ2V0TWFwcGluZygpKS5nZXRNYXBwZWRCeSgpKTsJCQotCQkKLQkJYXNzZXJ0VHJ1ZShjdTEuaXNXb3JraW5nQ29weSgpKTsKLQkJSVR5cGUgamF2YVR5cGUgPSBjdTEuZmluZFByaW1hcnlUeXBlKCk7Ci0JCUlGaWVsZCBmID0gamF2YVR5cGUuZ2V0RmllbGQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0VHJ1ZShmLmV4aXN0cygpKTsKLQkJCQkKLQl9Ci0JCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENyZWF0ZU9uZVRvT25lQmlkaXJSZWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwkKLQkJSUZpbGUgY3VzdG9tZXJGaWxlID0gZmFjdG9yeS5jcmVhdGVGaWVsZEFubm90YXRlZEVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJDdXN0b21lciIpOwotCQkKLQkJSUZpbGUgYWRkcmVzc0ZpbGUgPSBmYWN0b3J5LmNyZWF0ZUZpZWxkQW5ub3RhdGVkRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSJ9LCAiQWRkcmVzcyIpOwotCQkKLQkJanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShjdXN0b21lckZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3VzdG9tZXJUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5DdXN0b21lciIpOwotCQlhc3NlcnROb3ROdWxsKGN1c3RvbWVyVHlwZSk7Ci0JCQotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDEgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQkKLQkJYXNzZXJ0VHJ1ZShhZGRyZXNzRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBhZGRyZXNzVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLkFkZHJlc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCi0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQyID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQlJQ29tcGlsYXRpb25Vbml0IGN1MSA9IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKXQxLmdldFJlc291cmNlKCkpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1MiA9IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKXQyLmdldFJlc291cmNlKCkpOwotCQlBYnN0cmFjdFJlbGF0aW9uIHJlbCA9IG5ldyBPbmVUb09uZUJpRGlyUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCB0MSwgdDIsICJhZGRyZXNzIiwgImN1c3RvbWVyIiwKLQkJCQkJCQkJICAJCQkJCXRydWUsIAotCQkJCQkJCQkgIAkJCQkJY3UxLAotCQkJCQkJCQkgIAkJCQkJY3UyKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWwpOwotCQlhc3NlcnRTYW1lKHQxLCByZWwuZ2V0T3duZXIoKSk7Ci0JCWFzc2VydFNhbWUodDIsIHJlbC5nZXRJbnZlcnNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCByZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lckF0ID0gdDEuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChvd25lckF0KTsKLQkJU2V0PFN0cmluZz4gYW5ub3RhdGlvbnMgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uTmFtZXMob3duZXJBdCk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuY29udGFpbnMoIk9uZVRvT25lIikpOwotCQlhc3NlcnROdWxsKCgoT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uKW93bmVyQXQuZ2V0TWFwcGluZygpKS5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGludmVyc2VBdCA9IHQyLmdldEF0dHJpYnV0ZU5hbWVkKCJjdXN0b21lciIpOwotCQlhc3NlcnROb3ROdWxsKGludmVyc2VBdCk7Ci0JCWFubm90YXRpb25zID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0QW5ub3RhdGlvbk5hbWVzKGludmVyc2VBdCk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuY29udGFpbnMoIk9uZVRvT25lIikpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCAoKE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbilpbnZlcnNlQXQuZ2V0TWFwcGluZygpKS5nZXRNYXBwZWRCeSgpKTsKLQotCQlhc3NlcnRUcnVlKGN1MS5pc1dvcmtpbmdDb3B5KCkpOwotCQlhc3NlcnRUcnVlKGN1Mi5pc1dvcmtpbmdDb3B5KCkpOwotCQkKLQkJSVR5cGUgamF2YVR5cGUxID0gY3UxLmZpbmRQcmltYXJ5VHlwZSgpOwotCQlJRmllbGQgZjEgPSBqYXZhVHlwZTEuZ2V0RmllbGQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0VHJ1ZShmMS5leGlzdHMoKSk7Ci0JCUlUeXBlIGphdmFUeXBlMiA9IGN1Mi5maW5kUHJpbWFyeVR5cGUoKTsKLQkJSUZpZWxkIGYyID0gamF2YVR5cGUyLmdldEZpZWxkKCJjdXN0b21lciIpOwotCQlhc3NlcnRUcnVlKGYyLmV4aXN0cygpKTsJCQotCQkJCQotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVPbmVUb01hbnlVbmlkaXJSZWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwkKLQkJSUZpbGUgY3VzdG9tZXJGaWxlID0gZmFjdG9yeS5jcmVhdGVGaWVsZEFubm90YXRlZEVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJDdXN0b21lciIpOwotCQkKLQkJSUZpbGUgYWRkcmVzc0ZpbGUgPSBmYWN0b3J5LmNyZWF0ZUZpZWxkQW5ub3RhdGVkRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSJ9LCAiQWRkcmVzcyIpOwotCQkKLQkJanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShjdXN0b21lckZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3VzdG9tZXJUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5DdXN0b21lciIpOwotCQlhc3NlcnROb3ROdWxsKGN1c3RvbWVyVHlwZSk7Ci0JCQotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDEgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQkKLQkJYXNzZXJ0VHJ1ZShhZGRyZXNzRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBhZGRyZXNzVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLkFkZHJlc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCi0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQyID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQlJQ29tcGlsYXRpb25Vbml0IGN1MSA9IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKXQxLmdldFJlc291cmNlKCkpOwotCQlBYnN0cmFjdFJlbGF0aW9uIHJlbCA9IG5ldyBPbmVUb01hbnlVbmlEaXJSZWxhdGlvbihmZWF0dXJlUHJvdmlkZXIsIHQxLCB0MiwgImFkZHJlc3MiLAotCQkJCQkJCQkgIAkJCQkJdHJ1ZSwgCi0JCQkJCQkJCSAgCQkJCQljdTEsCi0JCQkJCQkJCSAgCQkJCQljcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSl0Mi5nZXRSZXNvdXJjZSgpKSk7Ci0JCWFzc2VydE5vdE51bGwocmVsKTsKLQkJYXNzZXJ0U2FtZSh0MSwgcmVsLmdldE93bmVyKCkpOwotCQlhc3NlcnRTYW1lKHQyLCByZWwuZ2V0SW52ZXJzZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgcmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBdCA9IHQxLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwob3duZXJBdCk7Ci0JCVNldDxTdHJpbmc+IGFubm90YXRpb25zID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0QW5ub3RhdGlvbk5hbWVzKG93bmVyQXQpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLmNvbnRhaW5zKCJPbmVUb01hbnkiKSk7Ci0JCWFzc2VydE51bGwoKChPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24pb3duZXJBdC5nZXRNYXBwaW5nKCkpLmdldE1hcHBlZEJ5KCkpOwkKLQkJCi0JCWFzc2VydFRydWUoY3UxLmlzV29ya2luZ0NvcHkoKSk7Ci0JCQotCQlJVHlwZSBqYXZhVHlwZTEgPSBjdTEuZmluZFByaW1hcnlUeXBlKCk7Ci0JCUlGaWVsZCBmMSA9IGphdmFUeXBlMS5nZXRGaWVsZCgiYWRkcmVzcyIpOwotCQlhc3NlcnRUcnVlKGYxLmV4aXN0cygpKTsKLQkKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTWFueVRvT25lVW5pZGlyUmVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCUlGaWxlIGN1c3RvbWVyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRmllbGRBbm5vdGF0ZWRFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQ3VzdG9tZXIiKTsKLQkJCi0JCUlGaWxlIGFkZHJlc3NGaWxlID0gZmFjdG9yeS5jcmVhdGVGaWVsZEFubm90YXRlZEVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20ifSwgIkFkZHJlc3MiKTsKLQkJCi0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWFzc2VydFRydWUoY3VzdG9tZXJGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQ3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCQkKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQxID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJCi0JCWFzc2VydFRydWUoYWRkcmVzc0ZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYWRkcmVzc1R5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS5BZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MiA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTEgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSl0MS5nZXRSZXNvdXJjZSgpKTsKLQkJQWJzdHJhY3RSZWxhdGlvbiByZWwgPSBuZXcgTWFueVRvT25lVW5pRGlyUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCB0MSwgdDIsICJhZGRyZXNzIiwKLQkJCQkJCQkJICAJCQkJCXRydWUsIAotCQkJCQkJCQkgIAkJCQkJY3UxLAotCQkJCQkJCQkgIAkJCQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpdDIuZ2V0UmVzb3VyY2UoKSkpOwotCQlhc3NlcnROb3ROdWxsKHJlbCk7Ci0JCWFzc2VydFNhbWUodDEsIHJlbC5nZXRPd25lcigpKTsKLQkJYXNzZXJ0U2FtZSh0MiwgcmVsLmdldEludmVyc2UoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyQXQgPSB0MS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlhc3NlcnROb3ROdWxsKG93bmVyQXQpOwotCQlTZXQ8U3RyaW5nPiBhbm5vdGF0aW9ucyA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEFubm90YXRpb25OYW1lcyhvd25lckF0KTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5jb250YWlucygiTWFueVRvT25lIikpOwotCQkKLQkJYXNzZXJ0VHJ1ZShjdTEuaXNXb3JraW5nQ29weSgpKTsKLQkJCi0JCUlUeXBlIGphdmFUeXBlMSA9IGN1MS5maW5kUHJpbWFyeVR5cGUoKTsKLQkJSUZpZWxkIGYxID0gamF2YVR5cGUxLmdldEZpZWxkKCJhZGRyZXNzIik7Ci0JCWFzc2VydFRydWUoZjEuZXhpc3RzKCkpOwkKLQkJCi0JfQotCQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENyZWF0ZU1hbnlUb09uZUJpZGlyUmVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCUlGaWxlIGN1c3RvbWVyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRmllbGRBbm5vdGF0ZWRFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQ3VzdG9tZXIiKTsKLQkJCi0JCUlGaWxlIGFkZHJlc3NGaWxlID0gZmFjdG9yeS5jcmVhdGVGaWVsZEFubm90YXRlZEVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20ifSwgIkFkZHJlc3MiKTsKLQkJCi0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWFzc2VydFRydWUoY3VzdG9tZXJGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQ3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCQkKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQxID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJCi0JCWFzc2VydFRydWUoYWRkcmVzc0ZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYWRkcmVzc1R5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS5BZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MiA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTEgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSl0MS5nZXRSZXNvdXJjZSgpKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTIgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSl0Mi5nZXRSZXNvdXJjZSgpKTsKLQkJQWJzdHJhY3RSZWxhdGlvbiByZWwgPSBuZXcgTWFueVRvT25lQmlEaXJSZWxhdGlvbihmZWF0dXJlUHJvdmlkZXIsIHQxLCB0MiwgImFkZHJlc3MiLCAiY3VzdG9tZXIiLAotCQkJCQkJCQkgIAkJCQkJdHJ1ZSwgCi0JCQkJCQkJCSAgCQkJCQljdTEsCi0JCQkJCQkJCSAgCQkJCQljdTIpOwotCQlhc3NlcnROb3ROdWxsKHJlbCk7Ci0JCWFzc2VydFNhbWUodDEsIHJlbC5nZXRPd25lcigpKTsKLQkJYXNzZXJ0U2FtZSh0MiwgcmVsLmdldEludmVyc2UoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyQXQgPSB0MS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlhc3NlcnROb3ROdWxsKG93bmVyQXQpOwotCQlTZXQ8U3RyaW5nPiBhbm5vdGF0aW9ucyA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEFubm90YXRpb25OYW1lcyhvd25lckF0KTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5jb250YWlucygiTWFueVRvT25lIikpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW52ZXJzZUF0ID0gdDIuZ2V0QXR0cmlidXRlTmFtZWQoImN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoaW52ZXJzZUF0KTsKLQkJYW5ub3RhdGlvbnMgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uTmFtZXMoaW52ZXJzZUF0KTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5jb250YWlucygiT25lVG9NYW55IikpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCAoKE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbilpbnZlcnNlQXQuZ2V0TWFwcGluZygpKS5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JCWFzc2VydFRydWUoY3UxLmlzV29ya2luZ0NvcHkoKSk7Ci0JCWFzc2VydFRydWUoY3UyLmlzV29ya2luZ0NvcHkoKSk7Ci0JCQotCQlJVHlwZSBqYXZhVHlwZTEgPSBjdTEuZmluZFByaW1hcnlUeXBlKCk7Ci0JCUlGaWVsZCBmMSA9IGphdmFUeXBlMS5nZXRGaWVsZCgiYWRkcmVzcyIpOwotCQlhc3NlcnRUcnVlKGYxLmV4aXN0cygpKTsKLQkJSVR5cGUgamF2YVR5cGUyID0gY3UyLmZpbmRQcmltYXJ5VHlwZSgpOwotCQlJRmllbGQgZjIgPSBqYXZhVHlwZTIuZ2V0RmllbGQoImN1c3RvbWVyIik7Ci0JCWFzc2VydFRydWUoZjIuZXhpc3RzKCkpOwkKLQkJCQkKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTWFueVRvTWFueVVuaWRpclJlbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7CQotCQlJRmlsZSBjdXN0b21lckZpbGUgPSBmYWN0b3J5LmNyZWF0ZUZpZWxkQW5ub3RhdGVkRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSIsInRlc3QifSwgIkN1c3RvbWVyIik7Ci0JCQotCQlJRmlsZSBhZGRyZXNzRmlsZSA9IGZhY3RvcnkuY3JlYXRlRmllbGRBbm5vdGF0ZWRFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIn0sICJBZGRyZXNzIik7Ci0JCQotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlhc3NlcnRUcnVlKGN1c3RvbWVyRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBjdXN0b21lclR5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS50ZXN0LkN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQkJCi0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKGFkZHJlc3NGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGFkZHJlc3NUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20uQWRkcmVzcyIpOwotCQlhc3NlcnROb3ROdWxsKGN1c3RvbWVyVHlwZSk7Ci0KLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDIgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCUlDb21waWxhdGlvblVuaXQgY3UxID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpdDEuZ2V0UmVzb3VyY2UoKSk7Ci0JCUFic3RyYWN0UmVsYXRpb24gcmVsID0gbmV3IE1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbihmZWF0dXJlUHJvdmlkZXIsIHQxLCB0MiwgImFkZHJlc3MiLAotCQkJCQkJCQkgIAkJCQkJdHJ1ZSwgCi0JCQkJCQkJCSAgCQkJCQljdTEsCi0JCQkJCQkJCSAgCQkJCQljcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSl0Mi5nZXRSZXNvdXJjZSgpKSk7Ci0JCWFzc2VydE5vdE51bGwocmVsKTsKLQkJYXNzZXJ0U2FtZSh0MSwgcmVsLmdldE93bmVyKCkpOwotCQlhc3NlcnRTYW1lKHQyLCByZWwuZ2V0SW52ZXJzZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgcmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBdCA9IHQxLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwob3duZXJBdCk7Ci0JCVNldDxTdHJpbmc+IGFubm90YXRpb25zID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0QW5ub3RhdGlvbk5hbWVzKG93bmVyQXQpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLmNvbnRhaW5zKCJNYW55VG9NYW55IikpOwotCQlhc3NlcnROdWxsKCgoT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uKW93bmVyQXQuZ2V0TWFwcGluZygpKS5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JCWFzc2VydFRydWUoY3UxLmlzV29ya2luZ0NvcHkoKSk7Ci0JCQotCQlJVHlwZSBqYXZhVHlwZTEgPSBjdTEuZmluZFByaW1hcnlUeXBlKCk7Ci0JCUlGaWVsZCBmMSA9IGphdmFUeXBlMS5nZXRGaWVsZCgiYWRkcmVzcyIpOwotCQlhc3NlcnRUcnVlKGYxLmV4aXN0cygpKTsJCQotCQkKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTWFueVRvTWFueUJpZGlyUmVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCUlGaWxlIGN1c3RvbWVyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRmllbGRBbm5vdGF0ZWRFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQ3VzdG9tZXIiKTsKLQkJCi0JCUlGaWxlIGFkZHJlc3NGaWxlID0gZmFjdG9yeS5jcmVhdGVGaWVsZEFubm90YXRlZEVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20ifSwgIkFkZHJlc3MiKTsKLQkJCi0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWFzc2VydFRydWUoY3VzdG9tZXJGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQ3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCQkKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQxID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJCi0JCWFzc2VydFRydWUoYWRkcmVzc0ZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYWRkcmVzc1R5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS5BZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MiA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTEgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSl0MS5nZXRSZXNvdXJjZSgpKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTIgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSl0Mi5nZXRSZXNvdXJjZSgpKTsKLQkJQWJzdHJhY3RSZWxhdGlvbiByZWwgPSBuZXcgTWFueVRvTWFueUJpRGlyUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCB0MSwgdDIsICJhZGRyZXNzIiwgImN1c3RvbWVyIiwKLQkJCQkJCQkJICAJCQkJCXRydWUsIAotCQkJCQkJCQkgIAkJCQkJY3UxLAotCQkJCQkJCQkgIAkJCQkJY3UyKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWwpOwotCQlhc3NlcnRTYW1lKHQxLCByZWwuZ2V0T3duZXIoKSk7Ci0JCWFzc2VydFNhbWUodDIsIHJlbC5nZXRJbnZlcnNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCByZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lckF0ID0gdDEuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChvd25lckF0KTsKLQkJU2V0PFN0cmluZz4gYW5ub3RhdGlvbnMgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uTmFtZXMob3duZXJBdCk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuY29udGFpbnMoIk1hbnlUb01hbnkiKSk7Ci0JCWFzc2VydE51bGwoKChPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24pb3duZXJBdC5nZXRNYXBwaW5nKCkpLmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW52ZXJzZUF0ID0gdDIuZ2V0QXR0cmlidXRlTmFtZWQoImN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoaW52ZXJzZUF0KTsKLQkJYW5ub3RhdGlvbnMgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uTmFtZXMoaW52ZXJzZUF0KTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5jb250YWlucygiTWFueVRvTWFueSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgKChPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24paW52ZXJzZUF0LmdldE1hcHBpbmcoKSkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQlhc3NlcnRUcnVlKGN1MS5pc1dvcmtpbmdDb3B5KCkpOwotCQlhc3NlcnRUcnVlKGN1Mi5pc1dvcmtpbmdDb3B5KCkpOwotCQkKLQkJSVR5cGUgamF2YVR5cGUxID0gY3UxLmZpbmRQcmltYXJ5VHlwZSgpOwotCQlJRmllbGQgZjEgPSBqYXZhVHlwZTEuZ2V0RmllbGQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0VHJ1ZShmMS5leGlzdHMoKSk7Ci0JCUlUeXBlIGphdmFUeXBlMiA9IGN1Mi5maW5kUHJpbWFyeVR5cGUoKTsKLQkJSUZpZWxkIGYyID0gamF2YVR5cGUyLmdldEZpZWxkKCJjdXN0b21lciIpOwotCQlhc3NlcnRUcnVlKGYyLmV4aXN0cygpKTsKLQkJCi0JfQotCQotCQotfQotCi0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvcmVsYXRpb24vQ3JlYXRlUmVsYXRpb25zVGVzdC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9yZWxhdGlvbi9DcmVhdGVSZWxhdGlvbnNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDIwZWQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9yZWxhdGlvbi9DcmVhdGVSZWxhdGlvbnNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwucmVsYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmlzQTsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlcGxheTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdWJJdGVyYWJsZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLkpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuQWJzdHJhY3RSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuTWFueVRvTWFueUJpRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuTWFueVRvT25lQmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuTWFueVRvT25lVW5pRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk9uZVRvTWFueVVuaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5PbmVUb09uZUJpRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk9uZVRvT25lVW5pRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JRWNsaXBzZUZhY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5KUEFDcmVhdGVGYWN0b3J5OwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoeyAidW51c2VkIiwgIm5scyIgfSkKLXB1YmxpYyBjbGFzcyBDcmVhdGVSZWxhdGlvbnNUZXN0IHsKLQotCXByaXZhdGUgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXI7Ci0JZmluYWwgU3RyaW5nIFRFU1RfUFJPSkVDVCA9ICJUZXN0IjsKLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBKUEFDcmVhdGVGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCUlFY2xpcHNlRmFjYWRlIGVjbGlwc2VGYWNhZGUgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlVNX09GX0lURVJBVElPTlMgPSAyNTA7Ci0JSmF2YVBlcnNpc3RlbnRUeXBlIHQxID0gbnVsbDsKLQlJQ29tcGlsYXRpb25Vbml0IGN1MSA9IG51bGw7Ci0JSmF2YVBlcnNpc3RlbnRUeXBlIHQyID0gbnVsbDsKLQlJQ29tcGlsYXRpb25Vbml0IGN1MiA9IG51bGw7Ci0JcHJpdmF0ZSBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlcjIwOwotCXByaXZhdGUgSnBhUHJvamVjdCBqcGEyMFByb2plY3Q7Ci0JCi0JCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlmYWN0b3J5ID0gSlBBQ3JlYXRlRmFjdG9yeS5pbnN0YW5jZSgpOwotCQlqcGFQcm9qZWN0ID0gZmFjdG9yeS5jcmVhdGVKUEFQcm9qZWN0KFRFU1RfUFJPSkVDVCArICJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLQkJCi0JCUlGaWxlIGVudGl0eSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5KGpwYVByb2plY3QsICJvcmcuZWNsaXBzZS5FbnRpdHkxIik7Ci0JCWZlYXR1cmVQcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlci5jbGFzcyk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KG51bGwpKS5hbmRSZXR1cm4oSlBBQ3JlYXRlRmFjdG9yeS5nZXRQZXJzaXN0ZW50VHlwZShlbnRpdHkpKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQoaXNBKEphdmFQZXJzaXN0ZW50VHlwZS5jbGFzcykpKS5hbmRSZXR1cm4oSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShlbnRpdHkpKS5hbnlUaW1lcygpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCUlGaWxlIGN1c3RvbWVyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSIsInRlc3QifSwgIkN1c3RvbWVyIik7Ci0JCQotCQlJRmlsZSBhZGRyZXNzRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSJ9LCAiQWRkcmVzcyIpOwotCQkKLQkJanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShjdXN0b21lckZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3VzdG9tZXJUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5DdXN0b21lciIpOwotCQlhc3NlcnROb3ROdWxsKGN1c3RvbWVyVHlwZSk7Ci0JCQotCQkKLQkJdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCQotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdCh0MSkpLmFuZFN0dWJSZXR1cm4oaXNBKFNoYXBlLmNsYXNzKSk7Ci0JCWN1MSA9IEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oY3VzdG9tZXJGaWxlKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQodDEpKS5hbmRTdHViUmV0dXJuKGN1MSk7CQkKLQkJCi0JCWFzc2VydFRydWUoYWRkcmVzc0ZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYWRkcmVzc1R5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS5BZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQotCQkKLQkJdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJCi0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KHQyKSkuYW5kU3R1YlJldHVybihpc0EoU2hhcGUuY2xhc3MpKTsKLQkJY3UyID0gSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShhZGRyZXNzRmlsZSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0Q29tcGlsYXRpb25Vbml0KHQyKSkuYW5kU3R1YlJldHVybihjdTIpOwotCQkKLQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXByb3BzLnNldFByb3BlcnR5KEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuUFJPUF9DT0xMRUNUSU9OX1RZUEUuZ2V0TG9jYWxOYW1lKCksICJjb2xsZWN0aW9uIik7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIubG9hZFByb3BlcnRpZXMoanBhUHJvamVjdC5nZXRQcm9qZWN0KCkpKS5hbmRTdHViUmV0dXJuKHByb3BzKTsKLQkJCi0JCXJlcGxheShmZWF0dXJlUHJvdmlkZXIpOwkKLQkJCi0JCWpwYTIwUHJvamVjdCA9IGZhY3RvcnkuY3JlYXRlSlBBMjBQcm9qZWN0KFRFU1RfUFJPSkVDVCArICJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGEyMFByb2plY3QpOwotCi0JCUlGaWxlIGVudGl0eTIwID0gZmFjdG9yeS5jcmVhdGVFbnRpdHkoanBhMjBQcm9qZWN0LAkib3JnLmVjbGlwc2UuRW50aXR5MSIpOwotCQlUaHJlYWQuc2xlZXAoMjAwMCk7Ci0JCWZlYXR1cmVQcm92aWRlcjIwID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlcjIwLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChudWxsKSkuYW5kUmV0dXJuKEpQQUNyZWF0ZUZhY3RvcnkuZ2V0UGVyc2lzdGVudFR5cGUoZW50aXR5MjApKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlcjIwLmdldENvbXBpbGF0aW9uVW5pdChpc0EoSmF2YVBlcnNpc3RlbnRUeXBlLmNsYXNzKSkpCi0JCQkJLmFuZFJldHVybihKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGVudGl0eTIwKSkuYW55VGltZXMoKTsKLQl9Ci0JCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGZpbGUpOwotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVPbmVUb09uZVVuaWRpclJlbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCi0JCUFic3RyYWN0UmVsYXRpb24gcmVsID0gbmV3IE9uZVRvT25lVW5pRGlyUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCB0MSwgdDIsICJhZGRyZXNzIiwKLQkJCQkJCQkJICAJCQkJCXRydWUsIAotCQkJCQkJCQkgIAkJCQkJY3UxLAotCQkJCQkJCQkgIAkJCQkJY3UyKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWwpOwotCQlhc3NlcnRTYW1lKHQxLCByZWwuZ2V0T3duZXIoKSk7Ci0JCWFzc2VydFNhbWUodDIsIHJlbC5nZXRJbnZlcnNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCByZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lckF0ID0gdDEuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChvd25lckF0KTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIGFuID0gKE9uZVRvT25lQW5ub3RhdGlvbilvd25lckF0LmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChhbik7Ci0JCWFzc2VydE51bGwoYW4uZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQkKLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVPbmVUb09uZUJpZGlyUmVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCUFic3RyYWN0UmVsYXRpb24gcmVsID0gbmV3IE9uZVRvT25lQmlEaXJSZWxhdGlvbihmZWF0dXJlUHJvdmlkZXIsIHQxLCB0MiwgImFkZHJlc3MiLCAiY3VzdG9tZXIiLAotCQkJCQkJCQkgIAkJCQkJdHJ1ZSwgCi0JCQkJCQkJCSAgCQkJCQljdTEsCi0JCQkJCQkJCSAgCQkJCQljdTIpOwotCQlhc3NlcnROb3ROdWxsKHJlbCk7Ci0JCWFzc2VydFNhbWUodDEsIHJlbC5nZXRPd25lcigpKTsKLQkJYXNzZXJ0U2FtZSh0MiwgcmVsLmdldEludmVyc2UoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyQXQgPSB0MS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlhc3NlcnROb3ROdWxsKG93bmVyQXQpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW4gPSAoT25lVG9PbmVBbm5vdGF0aW9uKW93bmVyQXQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFuKTsKLQkJYXNzZXJ0TnVsbChhbi5nZXRNYXBwZWRCeSgpKTsKLQkJCQkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW52ZXJzZUF0ID0gdDIuZ2V0QXR0cmlidXRlTmFtZWQoImN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoaW52ZXJzZUF0KTsKLQkJYW4gPSAoT25lVG9PbmVBbm5vdGF0aW9uKWludmVyc2VBdC5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW4pOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhbi5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JfQotCQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENyZWF0ZU9uZVRvTWFueVVuaWRpclJlbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFic3RyYWN0UmVsYXRpb24gcmVsID0gbmV3IE9uZVRvTWFueVVuaURpclJlbGF0aW9uKGZlYXR1cmVQcm92aWRlciwgdDEsIHQyLCAiYWRkcmVzcyIsCi0JCQkJCQkJCSAgCQkJCQl0cnVlLCAKLQkJCQkJCQkJICAJCQkJCWN1MSwKLQkJCQkJCQkJICAJCQkJCWN1Mik7Ci0JCWFzc2VydE5vdE51bGwocmVsKTsKLQkJYXNzZXJ0U2FtZSh0MSwgcmVsLmdldE93bmVyKCkpOwotCQlhc3NlcnRTYW1lKHQyLCByZWwuZ2V0SW52ZXJzZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgcmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBdCA9IHQxLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwob3duZXJBdCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIGFuID0gKE9uZVRvTWFueUFubm90YXRpb24pb3duZXJBdC5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKGFuLmdldE1hcHBlZEJ5KCkpOwkJCi0JfQotCQotCQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENyZWF0ZU1hbnlUb09uZVVuaWRpclJlbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFic3RyYWN0UmVsYXRpb24gcmVsID0gbmV3IE1hbnlUb09uZVVuaURpclJlbGF0aW9uKGZlYXR1cmVQcm92aWRlciwgdDEsIHQyLCAiYWRkcmVzcyIsCi0JCQkJCQkJCSAgCQkJCQl0cnVlLCAKLQkJCQkJCQkJICAJCQkJCWN1MSwKLQkJCQkJCQkJICAJCQkJCWN1Mik7Ci0JCWFzc2VydE5vdE51bGwocmVsKTsKLQkJYXNzZXJ0U2FtZSh0MSwgcmVsLmdldE93bmVyKCkpOwotCQlhc3NlcnRTYW1lKHQyLCByZWwuZ2V0SW52ZXJzZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgcmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBdCA9IHQxLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwob3duZXJBdCk7Ci0JCU1hbnlUb09uZUFubm90YXRpb24gYW4gPSAoTWFueVRvT25lQW5ub3RhdGlvbilvd25lckF0LmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW4pOwotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNYW55VG9PbmVCaWRpclJlbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFic3RyYWN0UmVsYXRpb24gcmVsID0gbmV3IE1hbnlUb09uZUJpRGlyUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCB0MSwgdDIsICJhZGRyZXNzIiwgImN1c3RvbWVyIiwKLQkJCQkJCQkJICAJCQkJCXRydWUsIAotCQkJCQkJCQkgIAkJCQkJY3UxLAotCQkJCQkJCQkgIAkJCQkJY3UyKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWwpOwotCQlhc3NlcnRTYW1lKHQxLCByZWwuZ2V0T3duZXIoKSk7Ci0JCWFzc2VydFNhbWUodDIsIHJlbC5nZXRJbnZlcnNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCByZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lckF0ID0gdDEuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChvd25lckF0KTsKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBhbiA9IChNYW55VG9PbmVBbm5vdGF0aW9uKW93bmVyQXQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChhbik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImN1c3RvbWVyIiwgcmVsLmdldEludmVyc2VBdHRyaWJ1dGVOYW1lKCkpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlQXQgPSB0Mi5nZXRBdHRyaWJ1dGVOYW1lZCgiY3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChpbnZlcnNlQXQpOwotCQlPbmVUb01hbnlBbm5vdGF0aW9uIGFuMSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKWludmVyc2VBdC5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFuMSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFuMS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTWFueVRvTWFueVVuaWRpclJlbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFic3RyYWN0UmVsYXRpb24gcmVsID0gbmV3IE1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbihmZWF0dXJlUHJvdmlkZXIsIHQxLCB0MiwgImFkZHJlc3MiLAotCQkJCQkJCQkgIAkJCQkJdHJ1ZSwgCi0JCQkJCQkJCSAgCQkJCQljdTEsCi0JCQkJCQkJCSAgCQkJCQljdTIpOwotCQlhc3NlcnROb3ROdWxsKHJlbCk7Ci0JCWFzc2VydFNhbWUodDEsIHJlbC5nZXRPd25lcigpKTsKLQkJYXNzZXJ0U2FtZSh0MiwgcmVsLmdldEludmVyc2UoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyQXQgPSB0MS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlhc3NlcnROb3ROdWxsKG93bmVyQXQpOwotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBhbiA9IChNYW55VG9NYW55QW5ub3RhdGlvbilvd25lckF0LmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFuKTsKLQkJYXNzZXJ0TnVsbChhbi5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTWFueVRvTWFueUJpZGlyUmVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RSZWxhdGlvbiByZWwgPSBuZXcgTWFueVRvTWFueUJpRGlyUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCB0MSwgdDIsICJhZGRyZXNzIiwgImN1c3RvbWVyIiwKLQkJCQkJCQkJICAJCQkJCXRydWUsIAotCQkJCQkJCQkgIAkJCQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpdDEuZ2V0UmVzb3VyY2UoKSksCi0JCQkJCQkJCSAgCQkJCQljcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSl0Mi5nZXRSZXNvdXJjZSgpKSk7Ci0JCWFzc2VydE5vdE51bGwocmVsKTsKLQkJYXNzZXJ0U2FtZSh0MSwgcmVsLmdldE93bmVyKCkpOwotCQlhc3NlcnRTYW1lKHQyLCByZWwuZ2V0SW52ZXJzZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgcmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBdCA9IHQxLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwob3duZXJBdCk7Ci0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIGFuID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKW93bmVyQXQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW4pOwotCQlhc3NlcnROdWxsKGFuLmdldE1hcHBlZEJ5KCkpOwotCQkJCQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlQXQgPSB0Mi5nZXRBdHRyaWJ1dGVOYW1lZCgiY3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChpbnZlcnNlQXQpOwotCQlhbiA9IChNYW55VG9NYW55QW5ub3RhdGlvbilpbnZlcnNlQXQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW4pOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhbi5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JfQotCi0JQFRlc3QKLQkJcHVibGljIHZvaWQgdGVzdENyZWF0ZU9uZVRvTWFueVVuaWRpclJlbGF0aW9uMjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQotCQkJYXNzZXJ0Tm90TnVsbChqcGEyMFByb2plY3QpOwkKLQkJCUlGaWxlIGN1c3RvbWVyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYTIwUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQ3VzdG9tZXIiKTsKLQkJCQotCQkJSUZpbGUgYWRkcmVzc0ZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGEyMFByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSJ9LCAiQWRkcmVzcyIpOwotCQkJCi0JCQlqcGEyMFByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQotCQkJYXNzZXJ0VHJ1ZShjdXN0b21lckZpbGUuZXhpc3RzKCkpOwotCQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYTIwUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5DdXN0b21lciIpOwotCQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCQkJCQkKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGEyMFByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQkJCQkKLQkJCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIyMC5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QodDEpKS5hbmRTdHViUmV0dXJuKGlzQShTaGFwZS5jbGFzcykpOwotCQkJSUNvbXBpbGF0aW9uVW5pdCBjdTEgPSBKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGN1c3RvbWVyRmlsZSk7Ci0JCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyMjAuZ2V0Q29tcGlsYXRpb25Vbml0KHQxKSkuYW5kU3R1YlJldHVybihjdTEpOwotCQkJCQotCQkJYXNzZXJ0VHJ1ZShhZGRyZXNzRmlsZS5leGlzdHMoKSk7Ci0JCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYWRkcmVzc1R5cGUgPSBqcGEyMFByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLkFkZHJlc3MiKTsKLQkJCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQkKLQkJCQotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYTIwUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQotCQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlcjIwLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdCh0MikpLmFuZFN0dWJSZXR1cm4oaXNBKFNoYXBlLmNsYXNzKSk7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IGN1MiA9IEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oYWRkcmVzc0ZpbGUpOwotCQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlcjIwLmdldENvbXBpbGF0aW9uVW5pdCh0MikpLmFuZFN0dWJSZXR1cm4oY3UyKTsKLQkJCQotCQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQlwcm9wcy5zZXRQcm9wZXJ0eShKUEFEaWFncmFtUHJvcGVydHlQYWdlLlBST1BfQ09MTEVDVElPTl9UWVBFLmdldExvY2FsTmFtZSgpLCAibGlzdCIpOwotCQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlcjIwLmxvYWRQcm9wZXJ0aWVzKGpwYTIwUHJvamVjdC5nZXRQcm9qZWN0KCkpKS5hbmRSZXR1cm4ocHJvcHMpOwotCQkJcmVwbGF5KGZlYXR1cmVQcm92aWRlcjIwKTsKLQkJCQkJCQkKLQkJCUFic3RyYWN0UmVsYXRpb24gcmVsID0gbmV3IE9uZVRvTWFueVVuaURpclJlbGF0aW9uKGZlYXR1cmVQcm92aWRlcjIwLCB0MSwgdDIsICJhZGRyZXNzIiwKLQkJCQkJCQkJCSAgCQkJCQl0cnVlLCAKLQkJCQkJCQkJCSAgCQkJCQljdTEsCi0JCQkJCQkJCQkgIAkJCQkJY3UyKTsKLQkJCWFzc2VydE5vdE51bGwocmVsKTsKLQkJCWFzc2VydFNhbWUodDEsIHJlbC5nZXRPd25lcigpKTsKLQkJCWFzc2VydFNhbWUodDIsIHJlbC5nZXRJbnZlcnNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgcmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKTsKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyQXQgPSB0MS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQkJYXNzZXJ0Tm90TnVsbChvd25lckF0KTsKLQkJCQotCQkJT2JqZWN0IG8xID0gb3duZXJBdC5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkJYXNzZXJ0Tm90TnVsbChvMSk7Ci0JCQkKLQkJCU9iamVjdCBvMiA9IG93bmVyQXQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQlhc3NlcnROb3ROdWxsKG8yKTsKLQkJCQotCQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgbzI7Ci0JCQlhc3NlcnROb3ROdWxsKGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCQotCQkJYXNzZXJ0Tm90TnVsbChqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkJCi0JCQlhc3NlcnRFcXVhbHMoIkN1c3RvbWVyX2lkIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQkJCQkKLQkJfQotCQkKLQkJCi0JCUBUZXN0Ci0JCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVPbmVUb01hbnlVbmlkaXJJRENsYXNzUmVsYXRpb24yMCgpIHRocm93cyBFeGNlcHRpb24gewotCQkJCi0JCQlhc3NlcnROb3ROdWxsKGpwYTIwUHJvamVjdCk7CQotCQkJSUZpbGUgc2ltcGxlRW1wbG95ZWVGaWxlID0gZmFjdG9yeS5jcmVhdGVJZENsYXNzSW5Qcm9qZWN0KGpwYTIwUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiRW1wbG95ZWUiKTsKLQkJCUlGaWxlIGVtcGxveWVlRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5V2l0aENvbXBvc2l0ZVBLSW5Qcm9qZWN0KGpwYTIwUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiRW1wbG95ZWUiKTsKLQkKLQkJCUlGaWxlIHByb2plY3RGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhMjBQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20ifSwgIlByb2plY3QiKTsKLQkJCQotCQkJanBhMjBQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQotCQkJYXNzZXJ0VHJ1ZShzaW1wbGVFbXBsb3llZUZpbGUuZXhpc3RzKCkpOwotCQkJYXNzZXJ0VHJ1ZShlbXBsb3llZUZpbGUuZXhpc3RzKCkpOwotCQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGVtcGxveWVlVHlwZSA9IGpwYTIwUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5FbXBsb3llZSIpOwotCQkJYXNzZXJ0Tm90TnVsbChlbXBsb3llZVR5cGUpOwotCQkJCQkKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGEyMFByb2plY3QsIGVtcGxveWVlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQkJCQkKLQkJCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIyMC5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QodDEpKS5hbmRTdHViUmV0dXJuKGlzQShTaGFwZS5jbGFzcykpOwotCQkJSUNvbXBpbGF0aW9uVW5pdCBjdTEgPSBKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGVtcGxveWVlRmlsZSk7Ci0JCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyMjAuZ2V0Q29tcGlsYXRpb25Vbml0KHQxKSkuYW5kU3R1YlJldHVybihjdTEpOwotCQkJCQotCQkJYXNzZXJ0VHJ1ZShwcm9qZWN0RmlsZS5leGlzdHMoKSk7Ci0JCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcHJvamVjdFR5cGUgPSBqcGEyMFByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLlByb2plY3QiKTsKLQkJCWFzc2VydE5vdE51bGwoZW1wbG95ZWVUeXBlKTsKLQkKLQkJCQotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYTIwUHJvamVjdCwgcHJvamVjdFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQotCQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlcjIwLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdCh0MikpLmFuZFN0dWJSZXR1cm4oaXNBKFNoYXBlLmNsYXNzKSk7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IGN1MiA9IEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20ocHJvamVjdEZpbGUpOwotCQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlcjIwLmdldENvbXBpbGF0aW9uVW5pdCh0MikpLmFuZFN0dWJSZXR1cm4oY3UyKTsKLQkJCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJcHJvcHMuc2V0UHJvcGVydHkoSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5QUk9QX0NPTExFQ1RJT05fVFlQRS5nZXRMb2NhbE5hbWUoKSwgImxpc3QiKTsKLQkJCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIyMC5sb2FkUHJvcGVydGllcyhqcGEyMFByb2plY3QuZ2V0UHJvamVjdCgpKSkuYW5kUmV0dXJuKHByb3BzKTsKLQkJCXJlcGxheShmZWF0dXJlUHJvdmlkZXIyMCk7Ci0JCQkJCQkJCi0JCQlBYnN0cmFjdFJlbGF0aW9uIHJlbCA9IG5ldyBPbmVUb01hbnlVbmlEaXJSZWxhdGlvbihmZWF0dXJlUHJvdmlkZXIyMCwgdDEsIHQyLCAicHJvamVjdCIsCi0JCQkJCQkJCQkgIAkJCQkJdHJ1ZSwgCi0JCQkJCQkJCQkgIAkJCQkJY3UxLAotCQkJCQkJCQkJICAJCQkJCWN1Mik7Ci0JCQlhc3NlcnROb3ROdWxsKHJlbCk7Ci0JCQlhc3NlcnRTYW1lKHQxLCByZWwuZ2V0T3duZXIoKSk7Ci0JCQlhc3NlcnRTYW1lKHQyLCByZWwuZ2V0SW52ZXJzZSgpKTsKLQkJCWFzc2VydEVxdWFscygicHJvamVjdCIsIHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lckF0ID0gdDEuZ2V0QXR0cmlidXRlTmFtZWQoInByb2plY3QiKTsKLQkJCWFzc2VydE5vdE51bGwob3duZXJBdCk7Ci0JCQkKLQkJCU9iamVjdCBvMSA9IG93bmVyQXQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCWFzc2VydE5vdE51bGwobzEpOwotCQkJCi0JCQlPYmplY3QgbzIgPSBvd25lckF0LmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU5TKTsKLQkJCWFzc2VydE5vdE51bGwobzIpOwotCQkJCi0JCQlhc3NlcnRFcXVhbHMoMiwgb3duZXJBdC5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsJCQkKLQkJCQkJCQotCQl9Ci0JCQotCQlAVGVzdAotCQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlT25lVG9NYW55VW5pZGlyRW1iZWRkZWRSZWxhdGlvbjIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkKLQkJCWFzc2VydE5vdE51bGwoanBhMjBQcm9qZWN0KTsJCi0JCQlJRmlsZSBzaW1wbGVFbXBsb3llZUZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVtYmVkZGVkQ2xhc3NJblByb2plY3QoanBhMjBQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJFbXBsb3llZXJJZCIpOwotCQkJSUZpbGUgZW1wbG95ZWVGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlXaXRoRW1iZWRkZWRQS0luUHJvamVjdChqcGEyMFByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSIsInRlc3QifSwgIkVtcGxveWVlciIpOwotCQotCQkJSUZpbGUgcHJvamVjdEZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGEyMFByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSJ9LCAiUGVyc29uIik7Ci0JCQkKLQkJCWpwYTIwUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkKLQkJCWFzc2VydFRydWUoc2ltcGxlRW1wbG95ZWVGaWxlLmV4aXN0cygpKTsKLQkJCWFzc2VydFRydWUoZW1wbG95ZWVGaWxlLmV4aXN0cygpKTsKLQkJCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBlbXBsb3llZVR5cGUgPSBqcGEyMFByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuRW1wbG95ZWVyIik7Ci0JCQlhc3NlcnROb3ROdWxsKGVtcGxveWVlVHlwZSk7Ci0JCQkKLQkJCQkJCi0JCQlKYXZhUGVyc2lzdGVudFR5cGUgdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhMjBQcm9qZWN0LCBlbXBsb3llZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJCQkJCi0JCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyMjAuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KHQxKSkuYW5kU3R1YlJldHVybihpc0EoU2hhcGUuY2xhc3MpKTsKLQkJCUlDb21waWxhdGlvblVuaXQgY3UxID0gSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShlbXBsb3llZUZpbGUpOwotCQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlcjIwLmdldENvbXBpbGF0aW9uVW5pdCh0MSkpLmFuZFN0dWJSZXR1cm4oY3UxKTsKLQkJCQotCQkJCi0JCQlFbWJlZGRhYmxlIGVtYiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdCh0MSkuZ2V0RW1iZWRkYWJsZSgiY29tLnRlc3QuRW1wbG95ZWVySWQiKTsKLQkJCUl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmc+IGVtYkl0ID0gZW1iLmdldEFsbEF0dHJpYnV0ZU1hcHBpbmdzKCkuaXRlcmF0b3IoKTsKLQkJCQkJCQkKLQkJCWFzc2VydFRydWUocHJvamVjdEZpbGUuZXhpc3RzKCkpOwotCQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHByb2plY3RUeXBlID0ganBhMjBQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS5QZXJzb24iKTsKLQkJCWFzc2VydE5vdE51bGwoZW1wbG95ZWVUeXBlKTsKLQkKLQkJCQotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYTIwUHJvamVjdCwgcHJvamVjdFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJCQotCQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlcjIwLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdCh0MikpLmFuZFN0dWJSZXR1cm4oaXNBKFNoYXBlLmNsYXNzKSk7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IGN1MiA9IEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20ocHJvamVjdEZpbGUpOwotCQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlcjIwLmdldENvbXBpbGF0aW9uVW5pdCh0MikpLmFuZFN0dWJSZXR1cm4oY3UyKTsKLQkJCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJcHJvcHMuc2V0UHJvcGVydHkoSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5QUk9QX0NPTExFQ1RJT05fVFlQRS5nZXRMb2NhbE5hbWUoKSwgImxpc3QiKTsKLQkJCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIyMC5sb2FkUHJvcGVydGllcyhqcGEyMFByb2plY3QuZ2V0UHJvamVjdCgpKSkuYW5kUmV0dXJuKHByb3BzKTsKLQkJCXJlcGxheShmZWF0dXJlUHJvdmlkZXIyMCk7Ci0JCQkJCQkJCQkJCi0JCQlBYnN0cmFjdFJlbGF0aW9uIHJlbCA9IG5ldyBPbmVUb01hbnlVbmlEaXJSZWxhdGlvbihmZWF0dXJlUHJvdmlkZXIyMCwgdDEsIHQyLCAicGVyc29uIiwKLQkJCQkJCQkJCSAgCQkJCQl0cnVlLCAKLQkJCQkJCQkJCSAgCQkJCQljdTEsCi0JCQkJCQkJCQkgIAkJCQkJY3UyKTsKLQkJCWFzc2VydE5vdE51bGwocmVsKTsKLQkJCWFzc2VydFNhbWUodDEsIHJlbC5nZXRPd25lcigpKTsKLQkJCWFzc2VydFNhbWUodDIsIHJlbC5nZXRJbnZlcnNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJwZXJzb24iLCByZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkpOwotCQkgICAgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBdCA9IHQxLmdldEF0dHJpYnV0ZU5hbWVkKCJwZXJzb24iKTsKLQkJCWFzc2VydE5vdE51bGwob3duZXJBdCk7Ci0JCQkJCQkKLQkJCU9iamVjdCBvMSA9IG93bmVyQXQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCWFzc2VydE5vdE51bGwobzEpOwotCQkJCi0JCQlPYmplY3QgbzIgPSBvd25lckF0LmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU5TKTsKLQkJCWFzc2VydE5vdE51bGwobzIpOwotCQkJCi0JCQlhc3NlcnRFcXVhbHMoMSwgIG93bmVyQXQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCQlJdGVyYWJsZTxKb2luQ29sdW1uQW5ub3RhdGlvbj4gbmVzdGVkQW5ub3RhdGlvbnMgPSBuZXcgU3ViSXRlcmFibGVXcmFwcGVyPE5lc3RhYmxlQW5ub3RhdGlvbiwgSm9pbkNvbHVtbkFubm90YXRpb24+KG93bmVyQXQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9ucyhKUEEuSk9JTl9DT0xVTU4pKTsKLQkJCUl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBuZXN0ZWRJdGVyYXRvciA9IG5lc3RlZEFubm90YXRpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShuZXN0ZWRJdGVyYXRvci5oYXNOZXh0KCkpewotCQkJCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSBuZXN0ZWRJdGVyYXRvci5uZXh0KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJFbXBsb3llZXJfZmlyc3ROYW1lIixqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJmaXJzdE5hbWUiLGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQl9Ci0JCQkJCQkKLQkJfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NyZWF0ZURlbGV0ZUVudGl0eS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NyZWF0ZURlbGV0ZUVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjhjZjZlLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9DcmVhdGVEZWxldGVFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5KUEFDcmVhdGVGYWN0b3J5OwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLQotcHVibGljIGNsYXNzIENyZWF0ZURlbGV0ZUVudGl0eSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUFJPSkVDVCA9ICJUZXN0IjsKLQlwcml2YXRlIEpQQUNyZWF0ZUZhY3RvcnkgZmFjdG9yeSA9IEpQQUNyZWF0ZUZhY3RvcnkuaW5zdGFuY2UoKTsKLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdCA9IG51bGw7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmFjdG9yeSA9IEpQQUNyZWF0ZUZhY3RvcnkuaW5zdGFuY2UoKTsKLQkJanBhUHJvamVjdCA9IGZhY3RvcnkuY3JlYXRlSlBBUHJvamVjdChURVNUX1BST0pFQ1QgKyAiXyIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0JCVRocmVhZC5zbGVlcCgyMDAwKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmREZWxldGVFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCi0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0vLwkJU3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlciB1cGRhdGVyID0gbmV3IFN5bmNocm9ub3VzSnBhUHJvamVjdFVwZGF0ZXIoanBhUHJvamVjdCk7Ci0vLwkJdXBkYXRlci5zdGFydCgpOwotCQlKcGFSb290Q29udGV4dE5vZGUganBhUHJvamVjdENvbnRlbnQgPSBqcGFQcm9qZWN0LmdldFJvb3RDb250ZXh0Tm9kZSgpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3RDb250ZW50KTsJCQotLy8JCWlmKGpwYVByb2plY3RDb250ZW50LmdldFBlcnNpc3RlbmNlWG1sKCkgPT0gbnVsbCkgewkJCi0vLwkJCXVwZGF0ZXIgPSBuZXcgU3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlcihqcGFQcm9qZWN0KTsKLS8vCQkJdXBkYXRlci5zdGFydCgpOwkJCQotLy8JCX0KLQkJVGhyZWFkLnNsZWVwKDIwMDApOwkJCi0JCVBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sID0ganBhUHJvamVjdENvbnRlbnQuZ2V0UGVyc2lzdGVuY2VYbWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVhtbCk7Ci0JCVBlcnNpc3RlbmNlIHAgPSBwZXJzaXN0ZW5jZVhtbC5nZXRQZXJzaXN0ZW5jZSgpOwotCQlpbnQgY250ID0gMDsKLQkJd2hpbGUgKChwID09IG51bGwpICYmIChjbnQgPCAyNSkpIHsKLQkJCVRocmVhZC5zbGVlcCgyNTApOwotCQkJcCA9IHBlcnNpc3RlbmNlWG1sLmdldFBlcnNpc3RlbmNlKCk7Ci0JCQljbnQrKzsKLQkJfQotCQlhc3NlcnRUcnVlKCJDYW4ndCBvYnRhaW4gcGVyc2lzdGVuY2Ugb2JqZWN0IiwgcCAhPSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVhtbC5nZXRQZXJzaXN0ZW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdHNTaXplKCkgPT0gMSk7Ci0JCS8vamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uOiBObyBQZXJzaXN0ZW5jZVVuaXQgaW4gdGhpcyBjb250ZXh0Ci0JCS8vUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlWG1sLmdldFBlcnNpc3RlbmNlKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVhtbC5nZXRQZXJzaXN0ZW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc1JlZnNTaXplKCkgPT0gMCk7Ci0JCUlGaWxlIGVudGl0eTEgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20ifSwgIkVudGl0eTEiKTsJCQotCQlhc3NlcnRUcnVlKGVudGl0eTEuZXhpc3RzKCkpOwotLy8JCWlmKGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLkVudGl0eTEiKSA9PSBudWxsKSB7CQkJCi0vLwkJCXVwZGF0ZXIgPSBuZXcgU3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlcihqcGFQcm9qZWN0KTsKLS8vCQkJdXBkYXRlci5zdGFydCgpOwotLy8JCX0KLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHBlcnNpc3RlbmNlVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLkVudGl0eTEiKTsKLQkJaW50IGMgPSAwOwotCQl3aGlsZSAoKHBlcnNpc3RlbmNlVHlwZSA9PSBudWxsKSAmJiAoYyA8IDEwMCkpIHsKLQkJCVRocmVhZC5zbGVlcCg1MDApOwotCQkJanBhUHJvamVjdC5nZXRQcm9qZWN0KCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0JCQlwZXJzaXN0ZW5jZVR5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS5FbnRpdHkxIik7Ci0JCQljKys7Ci0JCX0KLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVR5cGUpOwotCQlQZXJzaXN0ZW50VHlwZSB0ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIHBlcnNpc3RlbmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQljID0gMDsKLQkJd2hpbGUgKCh0ID09IG51bGwpICYmIChjIDwgMTAwKSkgewotCQkJVGhyZWFkLnNsZWVwKDUwMCk7Ci0JCQl0ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIHBlcnNpc3RlbmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQkJYysrOwotCQl9Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmRlbGV0ZVBlcnNpc3RlbmNlVHlwZVJlc291cmNlKHQpOwotCQlhc3NlcnRGYWxzZShlbnRpdHkxLmV4aXN0cygpKTsKLS8vCQl1cGRhdGVyID0gbmV3IFN5bmNocm9ub3VzSnBhUHJvamVjdFVwZGF0ZXIoanBhUHJvamVjdCk7Ci0vLwkJdXBkYXRlci5zdGFydCgpOwotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJcGVyc2lzdGVuY2VUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20uRW50aXR5MSIpOwotCQljID0gMDsKLQkJd2hpbGUgKChwZXJzaXN0ZW5jZVR5cGUgIT0gbnVsbCkgJiYgKGMgPCAyNTApKSB7Ci0JCQlUaHJlYWQuc2xlZXAoNTAwKTsKLQkJCXBlcnNpc3RlbmNlVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLkVudGl0eTEiKTsKLQkJCWMrKzsKLQkJfQotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVHlwZSk7CQkKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0lFZGl0b3IuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9JRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNWM5YTcuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0lFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkucGxhdGZvcm0uSURpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUVkaXRvciBleHRlbmRzIElFZGl0b3JQYXJ0LCBJRGlhZ3JhbUVkaXRvciB7CQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0pQQUVkaXRvclV0aWxUZXN0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvSlBBRWRpdG9yVXRpbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4OTZjYi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvSlBBRWRpdG9yVXRpbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suY3JlYXRlTW9jazsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWFzeW1vY2suRWFzeU1vY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNJbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuR3JhcGhpY3NBbGdvcml0aG07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5Sb3VuZGVkUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkFuY2hvckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkZyZWVGb3JtQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JUGVTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50cy5TaGFwZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuU2l6ZVBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLkpQQUNyZWF0ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgSlBBRWRpdG9yVXRpbFRlc3QgewotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVGaXJzdExldHRlcigpIHsKLQkJU3RyaW5nIHMgPSAiYWJjZGVmIjsKLQkJU3RyaW5nIHJlcyA9IEpQQUVkaXRvclV0aWwuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHMpOwotCQlhc3NlcnRFcXVhbHMocmVzLnN1YnN0cmluZygwLCAxKSwgIkEiKTsKLQkJYXNzZXJ0RXF1YWxzKHMuc3Vic3RyaW5nKDEpLCByZXMuc3Vic3RyaW5nKDEpKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIoKSB7IAkJCi0JCVN0cmluZyBzID0gIkFCQ0RFRkdISUpLIjsKLQkJU3RyaW5nIHJlcyA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIocyk7Ci0JCWFzc2VydEVxdWFscyhyZXMuc3Vic3RyaW5nKDAsIDEpLCAiYSIpOwotCQlhc3NlcnRFcXVhbHMocy5zdWJzdHJpbmcoMSksIHJlcy5zdWJzdHJpbmcoMSkpOwotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnRGaXJzdExldHRlckNhc2UoKSB7Ci0JCVN0cmluZyBzID0gIkFCQ0RFRkdISUpLIjsKLQkJU3RyaW5nIHJlcyA9IEpQQUVkaXRvclV0aWwucmV2ZXJ0Rmlyc3RMZXR0ZXJDYXNlKHMpOwotCQlhc3NlcnRFcXVhbHMocmVzLnN1YnN0cmluZygwLCAxKSwgImEiKTsKLQkJYXNzZXJ0RXF1YWxzKHMuc3Vic3RyaW5nKDEpLCByZXMuc3Vic3RyaW5nKDEpKTsKLQkJU3RyaW5nIHJlczEgPSBKUEFFZGl0b3JVdGlsLnJldmVydEZpcnN0TGV0dGVyQ2FzZShyZXMpOwotCQlhc3NlcnRFcXVhbHMocmVzMS5zdWJzdHJpbmcoMCwgMSksICJBIik7Ci0JCWFzc2VydEVxdWFscyhyZXMxLnN1YnN0cmluZygxKSwgcmVzLnN1YnN0cmluZygxKSk7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEVxdWFsc0lnbm9yZUZpcnN0TGV0dGVyQ2FzZSgpIHsKLQkJU3RyaW5nIHMxID0gImFiY2RlZmciOwotCQlTdHJpbmcgczIgPSAiQWJjZGVmZyI7Ci0JCWFzc2VydFRydWUoSlBBRWRpdG9yVXRpbC5lcXVhbHNJZ25vcmVGaXJzdExldHRlckNhc2UoczEsIHMyKSk7Ci0JCQotCQlzMSA9ICIiOwotCQlzMiA9ICIiOwotCQlhc3NlcnRUcnVlKEpQQUVkaXRvclV0aWwuZXF1YWxzSWdub3JlRmlyc3RMZXR0ZXJDYXNlKHMxLCBzMikpOwotCQkKLQkJczEgPSAiZ2pnSXlndWl5R1VZdUdVWUd1eWciOwotCQlzMiA9ICJnamdJeWd1aXlHVVl1R1VZR3V5ZyI7Ci0JCWFzc2VydFRydWUoSlBBRWRpdG9yVXRpbC5lcXVhbHNJZ25vcmVGaXJzdExldHRlckNhc2UoczEsIHMyKSk7Ci0JCQotCQlzMSA9ICJMamdJeWd1aXlHVVl1R1VZR3V5ZyI7Ci0JCXMyID0gIkxqZ0l5Z3VpeUdVWXVHVVlHdXlnIjsKLQkJYXNzZXJ0VHJ1ZShKUEFFZGl0b3JVdGlsLmVxdWFsc0lnbm9yZUZpcnN0TGV0dGVyQ2FzZShzMSwgczIpKTsJCQotCQkKLQkJczEgPSAiZ2pnSXlndWl5R1VZdUdVWUd1eWdzIjsKLQkJczIgPSAiZ2pnSXlndWl5R1VZdUdVWUd1eWciOwotCQlhc3NlcnRGYWxzZShKUEFFZGl0b3JVdGlsLmVxdWFsc0lnbm9yZUZpcnN0TGV0dGVyQ2FzZShzMSwgczIpKTsKLQkJCi0JCXMxID0gIkxqZ0l5Z3VpeUdVeXVHVVlHdXlnIjsKLQkJczIgPSAiTGpnSXlndWl5R1VZdUdVWUd1eWciOwotCQlhc3NlcnRGYWxzZShKUEFFZGl0b3JVdGlsLmVxdWFsc0lnbm9yZUZpcnN0TGV0dGVyQ2FzZShzMSwgczIpKTsJCQkKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmV0dXJuU2ltcGxlTmFtZSgpIHsKLQkJU3RyaW5nIHMgPSAiIjsKLQkJU3RyaW5nIHJlcyA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShzKTsKLQkJYXNzZXJ0RXF1YWxzKHMsIHJlcyk7Ci0JCXMgPSAiamRoa3NhamhkayI7Ci0JCXJlcyA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShzKTsKLQkJYXNzZXJ0RXF1YWxzKHMsIHJlcyk7CQkKLQkJcyA9ICJqZGhrc2FqaGRrLiI7Ci0JCXJlcyA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShzKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCByZXMpOwotCQlzID0gIi5qZGhrc2FqaGRrIjsKLQkJcmVzID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKHMpOwotCQlhc3NlcnRFcXVhbHMoImpkaGtzYWpoZGsiLCByZXMpOwotCQlzID0gImpkaGtzLmFqaGRrIjsKLQkJcmVzID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKHMpOwotCQlhc3NlcnRFcXVhbHMoImFqaGRrIiwgcmVzKTsKLQkJcyA9ICJkc3MuZHNkc2QuamQuaGtzLmFqaGRrIjsKLQkJcmVzID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKHMpOwotCQlhc3NlcnRFcXVhbHMoImFqaGRrIiwgcmVzKTsKLQl9Ci0JCi0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaXBRdW90ZXMoKSB7Ci0JCVN0cmluZyBzID0gIiI7Ci0JCVN0cmluZyByZXMgPSBKUEFFZGl0b3JVdGlsLnN0cmlwUXVvdGVzKHMpOwotCQlhc3NlcnRFcXVhbHMoIiIsIHJlcyk7Ci0JCQotCQlzID0gIlwiXCIiOwotCQlyZXMgPSBKUEFFZGl0b3JVdGlsLnN0cmlwUXVvdGVzKHMpOwotCQlhc3NlcnRFcXVhbHMoIiIsIHJlcyk7Ci0JCQotCQlzID0gIlwiZmRzamZqc2xrZGpmbGtzXCIiOwotCQlyZXMgPSBKUEFFZGl0b3JVdGlsLnN0cmlwUXVvdGVzKHMpOwotCQlhc3NlcnRFcXVhbHMoImZkc2pmanNsa2RqZmxrcyIsIHJlcyk7Ci0JCQotCQlzID0gIlwiZmRzamZqc2xrZGpmbGtzIjsKLQkJcmVzID0gSlBBRWRpdG9yVXRpbC5zdHJpcFF1b3RlcyhzKTsKLQkJYXNzZXJ0RXF1YWxzKCJcImZkc2pmanNsa2RqZmxrcyIsIHJlcyk7CQotCQkKLQkJcyA9ICJmZHNqZmpzbGtkamZsa3NcIiI7Ci0JCXJlcyA9IEpQQUVkaXRvclV0aWwuc3RyaXBRdW90ZXMocyk7Ci0JCWFzc2VydEVxdWFscygiZmRzamZqc2xrZGpmbGtzXCIiLCByZXMpOwkJCQotCX0KLQkKLQkvL0BUZXN0IAotCXB1YmxpYyB2b2lkIHRlc3RHZXRKUFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCVN0cmluZyBURVNUX1BST0pFQ1QgPSAiVGVzdCI7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IG51bGw7Ci0JCUpQQUNyZWF0ZUZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCVN0cmluZyB0ZXN0UHJvamVjdE5hbWUgPSBURVNUX1BST0pFQ1QgKyAiXyIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkKLQkJZmFjdG9yeSA9IEpQQUNyZWF0ZUZhY3RvcnkuaW5zdGFuY2UoKTsKLQkJanBhUHJvamVjdCA9IGZhY3RvcnkuY3JlYXRlSlBBUHJvamVjdCh0ZXN0UHJvamVjdE5hbWUpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwotCQlUaHJlYWQuc2xlZXAoMjAwMCk7Ci0JCi0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7CQotCQlJRmlsZSBjdXN0b21lckZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJDdXN0b21lciIpOwotCQkKLQkJanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQlhc3NlcnRUcnVlKGN1c3RvbWVyRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBjdXN0b21lclR5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS50ZXN0LkN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGN1c3RvbWVyRmlsZSk7Ci0JCVRocmVhZC5zbGVlcCgyMDAwKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IEpQQUVkaXRvclV0aWwuZ2V0SlBUeXBlKGN1KTsKLQkJYXNzZXJ0RXF1YWxzKGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCksIGpwdC5nZXROYW1lKCkpOwotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RQcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKCkgewotCQlTdHJpbmcgcyA9ICJhIjsKLQkJU3RyaW5nIHJlcyA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShzKTsKLQkJYXNzZXJ0RXF1YWxzKHMsIHJlcyk7Ci0JCQotCQlzID0gIkEiOwotCQlyZXMgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUocyk7Ci0JCWFzc2VydEVxdWFscygiYSIsIHJlcyk7CQkKLQkJCi0JCXMgPSAiYVQiOwotCQlyZXMgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUocyk7Ci0JCWFzc2VydEVxdWFscygiQVQiLCByZXMpOwotCQkKLQkJcyA9ICJBdCI7Ci0JCXJlcyA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShzKTsKLQkJYXNzZXJ0RXF1YWxzKCJhdCIsIHJlcyk7Ci0JCQotCQlzID0gIkFUIjsKLQkJcmVzID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKHMpOwotCQlhc3NlcnRFcXVhbHMoIkFUIiwgcmVzKTsJCQotCQkKLQkJcyA9ICJhMSI7Ci0JCXJlcyA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShzKTsKLQkJYXNzZXJ0RXF1YWxzKCJhMSIsIHJlcyk7CQkKLQkJCi0JCXMgPSAiQTEiOwotCQlyZXMgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUocyk7Ci0JCWFzc2VydEVxdWFscygiYTEiLCByZXMpOwkJCQkKLQotCX0KLQkKLQkvL0BUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUltcG9ydHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIFRFU1RfUFJPSkVDVCA9ICJUZXN0IjsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gbnVsbDsKLQkJSlBBQ3JlYXRlRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJU3RyaW5nIHRlc3RQcm9qZWN0TmFtZSA9IFRFU1RfUFJPSkVDVCArICJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQotCQlmYWN0b3J5ID0gSlBBQ3JlYXRlRmFjdG9yeS5pbnN0YW5jZSgpOwotCQlqcGFQcm9qZWN0ID0gZmFjdG9yeS5jcmVhdGVKUEFQcm9qZWN0KHRlc3RQcm9qZWN0TmFtZSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0JCVRocmVhZC5zbGVlcCgyMDAwKTsJCQotCQotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwkKLQkJSUZpbGUgY3VzdG9tZXJGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQ3VzdG9tZXIiKTsKLQkJanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQlhc3NlcnRUcnVlKGN1c3RvbWVyRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBjdXN0b21lclR5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS50ZXN0LkN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGN1c3RvbWVyRmlsZSk7Ci0JCQotCQlKUEFFZGl0b3JVdGlsLmNyZWF0ZUltcG9ydHMoY3UsICJqYXZhLnV0aWwuSGFzaHRhYmxlPGphdmEubGFuZy5TdHJpbmdCdWZmZXIsamF2YS5sYW5nLlNldDxqYXZhLmxhbmcuU3RyaW5nPj4iKTsKLQl9Ci0JCi0JQFRlc3QgCi0JcHVibGljIHZvaWQgdGVzdFNpemVQb3NpdGlvbigpIHsKLQkJU2l6ZVBvc2l0aW9uIHNwID0gbmV3IFNpemVQb3NpdGlvbigxLDIsMyw0KTsKLQkJYXNzZXJ0VHJ1ZShzcC5nZXRXaWR0aCgpID09IDEpOwotCQlhc3NlcnRUcnVlKHNwLmdldEhlaWdodCgpID09IDIpOwkJCi0JCWFzc2VydFRydWUoc3AuZ2V0WCgpID09IDMpOwotCQlhc3NlcnRUcnVlKHNwLmdldFkoKSA9PSA0KTsKLQl9Ci0JCi0JLy9AVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RHZXRUZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBURVNUX1BST0pFQ1QgPSAiVGVzdCI7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IG51bGw7Ci0JCUpQQUNyZWF0ZUZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCVN0cmluZyB0ZXN0UHJvamVjdE5hbWUgPSBURVNUX1BST0pFQ1QgKyAiXyIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkKLQkJZmFjdG9yeSA9IEpQQUNyZWF0ZUZhY3RvcnkuaW5zdGFuY2UoKTsKLQkJanBhUHJvamVjdCA9IGZhY3RvcnkuY3JlYXRlSlBBUHJvamVjdCh0ZXN0UHJvamVjdE5hbWUpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwotCQlUaHJlYWQuc2xlZXAoMjAwMCk7CQkKLQkKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCUlGaWxlIGN1c3RvbWVyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSIsInRlc3QifSwgIkN1c3RvbWVyIik7Ci0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShjdXN0b21lckZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3VzdG9tZXJUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5DdXN0b21lciIpOwotCQlhc3NlcnROb3ROdWxsKGN1c3RvbWVyVHlwZSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCWludCBjbnQgPSAwOwotCQl3aGlsZSAoKGNudCA8IDI1KSAmJiAodDEgPT0gbnVsbCkpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCQljbnQrKzsKLQkJfQotCQlpZiAodDEgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJYXNzZXJ0Tm90TnVsbChKUEFFZGl0b3JVdGlsLmdldFRleHQodDEpKTsKLQkJYXNzZXJ0Tm90TnVsbChKUEFFZGl0b3JVdGlsLmdldFRvb2x0aXBUZXh0KHQxKSk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSA9IHQxLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnROb3ROdWxsKGpwYSk7Ci0JCWFzc2VydE5vdE51bGwoSlBBRWRpdG9yVXRpbC5nZXRUZXh0KGpwYSkpOwotCQlhc3NlcnROb3ROdWxsKEpQQUVkaXRvclV0aWwuZ2V0VG9vbHRpcFRleHQoanBhKSk7Ci0KLQl9Ci0JCi0JLy9AVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRKUFROYW1lSW5TaGFwZSgpIHsKLQkJZmluYWwgU3RyaW5nIE5FV19OQU1FID0gIk5ld0pQVE5hbWUiOwotCQlDb250YWluZXJTaGFwZSBjcyA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29udGFpbmVyU2hhcGUuY2xhc3MpOwotCQlTaGFwZSBzaCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soU2hhcGUuY2xhc3MpOwotCQlHcmFwaGljc0FsZ29yaXRobSBnYSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soR3JhcGhpY3NBbGdvcml0aG0uY2xhc3MpOwotCQlJUGVTZXJ2aWNlVXRpbCBwZVV0aWwgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElQZVNlcnZpY2VVdGlsLmNsYXNzKTsKLQkJRWFzeU1vY2suZXhwZWN0KHBlVXRpbC5nZXRQcm9wZXJ0eVZhbHVlKHNoLCBKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9TSEFQRV9UWVBFKSkuYW5kU3R1YlJldHVybihTaGFwZVR5cGUuSEVBREVSLnRvU3RyaW5nKCkpOwotCQlFTGlzdDxTaGFwZT4gc2hhcGVzID0gbmV3IEJhc2ljSW50ZXJuYWxFTGlzdDxTaGFwZT4oU2hhcGUuY2xhc3MpOwotCQlzaGFwZXMuYWRkKHNoKTsKLQkJRWFzeU1vY2suZXhwZWN0KGNzLmdldENoaWxkcmVuKCkpLmFuZFN0dWJSZXR1cm4oc2hhcGVzKTsKLQkJVGV4dCB0eHQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKFRleHQuY2xhc3MpOwotCQlFTGlzdDxHcmFwaGljc0FsZ29yaXRobT4gZ2FDaCA9IG5ldyBCYXNpY0ludGVybmFsRUxpc3Q8R3JhcGhpY3NBbGdvcml0aG0+KEdyYXBoaWNzQWxnb3JpdGhtLmNsYXNzKTsgIAotCQlnYUNoLmFkZCh0eHQpOwotCQlFYXN5TW9jay5leHBlY3Qoc2guZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSkuYW5kU3R1YlJldHVybihnYSk7Ci0JCUVhc3lNb2NrLmV4cGVjdChnYS5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCkpLmFuZFN0dWJSZXR1cm4oZ2FDaCk7Ci0JCXR4dC5zZXRWYWx1ZShORVdfTkFNRSk7Ci0JCUVhc3lNb2NrLnJlcGxheShjcywgc2gsIGdhLCBwZVV0aWwsIHR4dCk7Ci0JCUpQQUVkaXRvclV0aWwuc2V0SlBUTmFtZUluU2hhcGUoY3MsIE5FV19OQU1FLCBwZVV0aWwpOwotCX0KLQkKLQkvL0BUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUJlbmRQb2ludExpc3QxKCkgewotCQlGcmVlRm9ybUNvbm5lY3Rpb24gYyA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soRnJlZUZvcm1Db25uZWN0aW9uLmNsYXNzKTsKLQkJQW5jaG9yIHN0YXJ0QW5jaG9yID0gRWFzeU1vY2suY3JlYXRlTW9jayhBbmNob3IuY2xhc3MpOwotCQlBbmNob3IgZW5kQW5jaG9yID0gRWFzeU1vY2suY3JlYXRlTW9jayhBbmNob3IuY2xhc3MpOwotCQlBbmNob3JDb250YWluZXIgc3RhcnRBbmNob3JDb250YWluZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEFuY2hvckNvbnRhaW5lci5jbGFzcyk7Ci0JCUFuY2hvckNvbnRhaW5lciBlbmRBbmNob3JDb250YWluZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEFuY2hvckNvbnRhaW5lci5jbGFzcyk7Ci0JCWV4cGVjdChjLmdldFN0YXJ0KCkpLmFuZFN0dWJSZXR1cm4oc3RhcnRBbmNob3IpOwotCQlleHBlY3QoYy5nZXRFbmQoKSkuYW5kU3R1YlJldHVybihlbmRBbmNob3IpOwotCQlleHBlY3Qoc3RhcnRBbmNob3IuZ2V0UGFyZW50KCkpLmFuZFN0dWJSZXR1cm4oc3RhcnRBbmNob3JDb250YWluZXIpOwotCQlleHBlY3QoZW5kQW5jaG9yLmdldFBhcmVudCgpKS5hbmRTdHViUmV0dXJuKGVuZEFuY2hvckNvbnRhaW5lcik7Ci0JCVJvdW5kZWRSZWN0YW5nbGUgcmVjdFN0YXJ0ID0gY3JlYXRlTW9jayhSb3VuZGVkUmVjdGFuZ2xlLmNsYXNzKTsKLQkJUm91bmRlZFJlY3RhbmdsZSByZWN0RW5kID0gY3JlYXRlTW9jayhSb3VuZGVkUmVjdGFuZ2xlLmNsYXNzKTsKLQkJZXhwZWN0KHN0YXJ0QW5jaG9yQ29udGFpbmVyLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkpLmFuZFN0dWJSZXR1cm4ocmVjdFN0YXJ0KTsKLQkJZXhwZWN0KGVuZEFuY2hvckNvbnRhaW5lci5nZXRHcmFwaGljc0FsZ29yaXRobSgpKS5hbmRTdHViUmV0dXJuKHJlY3RFbmQpOwotCQlleHBlY3QocmVjdFN0YXJ0LmdldFgoKSkuYW5kU3R1YlJldHVybigxMDApOwotCQlleHBlY3QocmVjdFN0YXJ0LmdldFkoKSkuYW5kU3R1YlJldHVybigxMDApOwotCQlleHBlY3QocmVjdFN0YXJ0LmdldFdpZHRoKCkpLmFuZFN0dWJSZXR1cm4oMjAwKTsKLQkJZXhwZWN0KHJlY3RTdGFydC5nZXRIZWlnaHQoKSkuYW5kU3R1YlJldHVybigxMjApOwotCQlleHBlY3QocmVjdEVuZC5nZXRYKCkpLmFuZFN0dWJSZXR1cm4oMTAwKTsKLQkJZXhwZWN0KHJlY3RFbmQuZ2V0WSgpKS5hbmRTdHViUmV0dXJuKDgwMCk7Ci0JCWV4cGVjdChyZWN0RW5kLmdldFdpZHRoKCkpLmFuZFN0dWJSZXR1cm4oMjAwKTsKLQkJZXhwZWN0KHJlY3RFbmQuZ2V0SGVpZ2h0KCkpLmFuZFN0dWJSZXR1cm4oMTIwKTsKLQkJCi0JCUVMaXN0PENvbm5lY3Rpb24+IGNjYyA9IG5ldyBCYXNpY0ludGVybmFsRUxpc3Q8Q29ubmVjdGlvbj4oQ29ubmVjdGlvbi5jbGFzcyk7ICAKLQkJZXhwZWN0KHN0YXJ0QW5jaG9yLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKSkuYW5kU3R1YlJldHVybihjY2MpOwotCQlleHBlY3QoZW5kQW5jaG9yLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKSkuYW5kU3R1YlJldHVybihjY2MpOwotCi0JCUVhc3lNb2NrLnJlcGxheShjLCBzdGFydEFuY2hvciwgZW5kQW5jaG9yLCBzdGFydEFuY2hvckNvbnRhaW5lciwgZW5kQW5jaG9yQ29udGFpbmVyLCByZWN0U3RhcnQsIHJlY3RFbmQpOwotCQkKLQkJCi0JCQotCQlMaXN0PFBvaW50PiBsc3QgPSBKUEFFZGl0b3JVdGlsLmNyZWF0ZUJlbmRQb2ludExpc3QoYywgZmFsc2UpOwotCQlhc3NlcnRUcnVlKGxzdC5zaXplKCkgPT0gMik7Ci0JCWZvciAoUG9pbnQgcCA6IGxzdCkgewotCQkJYXNzZXJ0VHJ1ZShwLnggPj0gMCk7Ci0JCQlhc3NlcnRUcnVlKHAueSA+PSAwKTsKLQkJCQotCQkJYXNzZXJ0VHJ1ZShwLnggPD0gMTAwMDAwMCk7Ci0JCQlhc3NlcnRUcnVlKHAueSA8PSAxMDAwMDAwKTsJCQkKLQkJfQotCQkKLQl9Ci0JCi0JLy9AVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVCZW5kUG9pbnRMaXN0MigpIHsKLQkJRnJlZUZvcm1Db25uZWN0aW9uIGMgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEZyZWVGb3JtQ29ubmVjdGlvbi5jbGFzcyk7Ci0JCUFuY2hvciBzdGFydEFuY2hvciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQW5jaG9yLmNsYXNzKTsKLQkJQW5jaG9yIGVuZEFuY2hvciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQW5jaG9yLmNsYXNzKTsKLQkJQW5jaG9yQ29udGFpbmVyIHN0YXJ0QW5jaG9yQ29udGFpbmVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhBbmNob3JDb250YWluZXIuY2xhc3MpOwotCQlBbmNob3JDb250YWluZXIgZW5kQW5jaG9yQ29udGFpbmVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhBbmNob3JDb250YWluZXIuY2xhc3MpOwotCQlleHBlY3QoYy5nZXRTdGFydCgpKS5hbmRTdHViUmV0dXJuKHN0YXJ0QW5jaG9yKTsKLQkJZXhwZWN0KGMuZ2V0RW5kKCkpLmFuZFN0dWJSZXR1cm4oZW5kQW5jaG9yKTsKLQkJZXhwZWN0KHN0YXJ0QW5jaG9yLmdldFBhcmVudCgpKS5hbmRTdHViUmV0dXJuKHN0YXJ0QW5jaG9yQ29udGFpbmVyKTsKLQkJZXhwZWN0KGVuZEFuY2hvci5nZXRQYXJlbnQoKSkuYW5kU3R1YlJldHVybihlbmRBbmNob3JDb250YWluZXIpOwotCQlSb3VuZGVkUmVjdGFuZ2xlIHJlY3RTdGFydCA9IGNyZWF0ZU1vY2soUm91bmRlZFJlY3RhbmdsZS5jbGFzcyk7Ci0JCVJvdW5kZWRSZWN0YW5nbGUgcmVjdEVuZCA9IGNyZWF0ZU1vY2soUm91bmRlZFJlY3RhbmdsZS5jbGFzcyk7Ci0JCWV4cGVjdChzdGFydEFuY2hvckNvbnRhaW5lci5nZXRHcmFwaGljc0FsZ29yaXRobSgpKS5hbmRTdHViUmV0dXJuKHJlY3RTdGFydCk7Ci0JCWV4cGVjdChlbmRBbmNob3JDb250YWluZXIuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSkuYW5kU3R1YlJldHVybihyZWN0RW5kKTsKLQkJZXhwZWN0KHJlY3RTdGFydC5nZXRYKCkpLmFuZFN0dWJSZXR1cm4oMTAwKTsKLQkJZXhwZWN0KHJlY3RTdGFydC5nZXRZKCkpLmFuZFN0dWJSZXR1cm4oMTAwKTsKLQkJZXhwZWN0KHJlY3RTdGFydC5nZXRXaWR0aCgpKS5hbmRTdHViUmV0dXJuKDIwMCk7Ci0JCWV4cGVjdChyZWN0U3RhcnQuZ2V0SGVpZ2h0KCkpLmFuZFN0dWJSZXR1cm4oMTIwKTsKLQkJZXhwZWN0KHJlY3RFbmQuZ2V0WCgpKS5hbmRTdHViUmV0dXJuKDgwMCk7Ci0JCWV4cGVjdChyZWN0RW5kLmdldFkoKSkuYW5kU3R1YlJldHVybigxMDApOwotCQlleHBlY3QocmVjdEVuZC5nZXRXaWR0aCgpKS5hbmRTdHViUmV0dXJuKDIwMCk7Ci0JCWV4cGVjdChyZWN0RW5kLmdldEhlaWdodCgpKS5hbmRTdHViUmV0dXJuKDEyMCk7Ci0KLQkJRUxpc3Q8Q29ubmVjdGlvbj4gY2NjID0gbmV3IEJhc2ljSW50ZXJuYWxFTGlzdDxDb25uZWN0aW9uPihDb25uZWN0aW9uLmNsYXNzKTsgIAotCQlleHBlY3Qoc3RhcnRBbmNob3IuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpKS5hbmRTdHViUmV0dXJuKGNjYyk7CQkKLQkJZXhwZWN0KGVuZEFuY2hvci5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkpLmFuZFN0dWJSZXR1cm4oY2NjKTsJCQotCQkKLQkJRWFzeU1vY2sucmVwbGF5KGMsIHN0YXJ0QW5jaG9yLCBlbmRBbmNob3IsIHN0YXJ0QW5jaG9yQ29udGFpbmVyLCBlbmRBbmNob3JDb250YWluZXIsIHJlY3RTdGFydCwgcmVjdEVuZCk7Ci0JCQotCQlMaXN0PFBvaW50PiBsc3QgPSBKUEFFZGl0b3JVdGlsLmNyZWF0ZUJlbmRQb2ludExpc3QoYywgZmFsc2UpOwotCQlhc3NlcnRUcnVlKGxzdC5zaXplKCkgPT0gMik7Ci0JCWZvciAoUG9pbnQgcCA6IGxzdCkgewotCQkJYXNzZXJ0VHJ1ZShwLnggPj0gMCk7Ci0JCQlhc3NlcnRUcnVlKHAueSA+PSAwKTsKLQkJCQotCQkJYXNzZXJ0VHJ1ZShwLnggPD0gMTAwMDAwMCk7Ci0JCQlhc3NlcnRUcnVlKHAueSA8PSAxMDAwMDAwKTsJCQkKLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGZpbGUpOwotCX0JCi0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QXJlSGVhZGVyc0VxdWFsKCkgewotCQlhc3NlcnRUcnVlKEpQQUVkaXRvclV0aWwuYXJlSGVhZGVyc0VxdWFsKCJoZWFkZXIiLCAiaGVhZGVyIikpOwotCQlhc3NlcnRUcnVlKEpQQUVkaXRvclV0aWwuYXJlSGVhZGVyc0VxdWFsKEpQQUVkaXRvckNvbnN0YW50cy5IRUFERVJfUFJFRklYX0RJUlRZICsgImhlYWRlciIsICJoZWFkZXIiKSk7Ci0JCWFzc2VydFRydWUoSlBBRWRpdG9yVXRpbC5hcmVIZWFkZXJzRXF1YWwoImhlYWRlciIsIEpQQUVkaXRvckNvbnN0YW50cy5IRUFERVJfUFJFRklYX0RJUlRZICsgImhlYWRlciIpKTsKLQkJCi0JCWFzc2VydEZhbHNlKEpQQUVkaXRvclV0aWwuYXJlSGVhZGVyc0VxdWFsKCJoZWFkZXIiLCAiaGVhZGVycyIpKTsKLQkJYXNzZXJ0RmFsc2UoSlBBRWRpdG9yVXRpbC5hcmVIZWFkZXJzRXF1YWwoImhlYWRlcnMiLCAiaGVhZGVyIikpOwotCQkKLQkJYXNzZXJ0RmFsc2UoSlBBRWRpdG9yVXRpbC5hcmVIZWFkZXJzRXF1YWwoSlBBRWRpdG9yQ29uc3RhbnRzLkhFQURFUl9QUkVGSVhfRElSVFkgKyAiaGVhZGVycyIsICJoZWFkZXIiKSk7Ci0JCWFzc2VydEZhbHNlKEpQQUVkaXRvclV0aWwuYXJlSGVhZGVyc0VxdWFsKEpQQUVkaXRvckNvbnN0YW50cy5IRUFERVJfUFJFRklYX0RJUlRZICsgImhlYWRlciIsICJoZWFkZXJzIikpOwotCQkKLQkJYXNzZXJ0RmFsc2UoSlBBRWRpdG9yVXRpbC5hcmVIZWFkZXJzRXF1YWwoImhlYWRlcnMiLCBKUEFFZGl0b3JDb25zdGFudHMuSEVBREVSX1BSRUZJWF9ESVJUWSArICJoZWFkZXIiKSk7Ci0JCWFzc2VydEZhbHNlKEpQQUVkaXRvclV0aWwuYXJlSGVhZGVyc0VxdWFsKCJoZWFkZXIiLCBKUEFFZGl0b3JDb25zdGFudHMuSEVBREVSX1BSRUZJWF9ESVJUWSArICJoZWFkZXJzIikpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9KUEFTb2x2ZXJUZXN0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvSlBBU29sdmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTc4MjQ0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9KUEFTb2x2ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXE7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5pc0E7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBsYXk7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay52ZXJpZnk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLWltcG9ydCBvcmcuZWFzeW1vY2suRWFzeU1vY2s7Ci1pbXBvcnQgb3JnLmVhc3ltb2NrLklBcmd1bWVudE1hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlckRlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNJbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmR0LklEaWFncmFtVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbXNQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnBsYXRmb3JtLklEaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklFY2xpcHNlRmFjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFTb2x2ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi1wdWJsaWMgY2xhc3MgSlBBU29sdmVyVGVzdCB7Ci0KLQlwcml2YXRlIElFY2xpcHNlRmFjYWRlIGVjbGlwc2VGYWNhZGU7Ci0KLQkvKioKLQkgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZWNsaXBzZUZhY2FkZSA9IGNyZWF0ZUVjbGlwc2VGYWNhZGUoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUxpc3RlbmVyUmVnaXN0ZXJlZCgpIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElXb3Jrc3BhY2UuY2xhc3MpOwotCQl3b3Jrc3BhY2UuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihpc0EoSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIuY2xhc3MpLCBlcShJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFIHwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9CVUlMRCkpOwotCQlyZXBsYXkod29ya3NwYWNlKTsKLQkJSUVjbGlwc2VGYWNhZGUgZmFjYWRlID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRWNsaXBzZUZhY2FkZS5jbGFzcyk7Ci0JCWV4cGVjdChmYWNhZGUuZ2V0V29ya3NwYWNlKCkpLmFuZFN0dWJSZXR1cm4od29ya3NwYWNlKTsKLQkJcmVwbGF5KGZhY2FkZSk7Ci0JCW5ldyBKUEFTb2x2ZXIoZmFjYWRlLCBudWxsKTsKLQkJdmVyaWZ5KHdvcmtzcGFjZSwgZmFjYWRlKTsKLQl9Ci0KLQlwcml2YXRlIElGaWxlIHJlcGxheUZpbGUoKSB7Ci0JCUlGaWxlIGZpbGUgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElGaWxlLmNsYXNzKTsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGUoImZpbGU6Ly9wcm9qZWN0Ly9hYWEiKTsKLQkJZXhwZWN0KGZpbGUuZ2V0TG9jYXRpb25VUkkoKSkuYW5kU3R1YlJldHVybih1cmkpOwotCQlleHBlY3QoZmlsZS5leGlzdHMoKSkuYW5kU3R1YlJldHVybih0cnVlKTsKLQkJSVByb2plY3QgcHJvaiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSVByb2plY3QuY2xhc3MpOwotCQlleHBlY3QocHJvai5nZXRUeXBlKCkpLmFuZFN0dWJSZXR1cm4oSVJlc291cmNlLlBST0pFQ1QpOwotCQlleHBlY3QoZmlsZS5nZXRUeXBlKCkpLmFuZFN0dWJSZXR1cm4oSVJlc291cmNlLkZJTEUpOwotCQlleHBlY3QoZmlsZS5nZXRGdWxsUGF0aCgpKS5hbmRTdHViUmV0dXJuKG5ldyBQYXRoKCJDOlxccHJvamVjdFxcYWFhIikpOwotCQlJRmlsZSBjbHNQYXRoID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRmlsZS5jbGFzcyk7IAotCQlleHBlY3QocHJvai5nZXRGaWxlKCIuY2xhc3NwYXRoIikpLmFuZFN0dWJSZXR1cm4oY2xzUGF0aCk7Ci0JCXRyeSB7Ci0JCQlleHBlY3QocHJvai5oYXNOYXR1cmUoIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiKSkuYW5kU3R1YlJldHVybih0cnVlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7fQotCQlleHBlY3QoZmlsZS5nZXRQcm9qZWN0KCkpLmFuZFN0dWJSZXR1cm4ocHJvaik7Ci0JCXJlcGxheShmaWxlLCBwcm9qKTsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JcHJpdmF0ZSBKYXZhUGVyc2lzdGVudFR5cGUgY3JlYXRlSnB0Rm9yUmVzb3VyY2UoSUZpbGUgZmlsZSwgU3RyaW5nIG5hbWUpIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IEVhc3lNb2NrLmNyZWF0ZU5pY2VNb2NrKEphdmFQZXJzaXN0ZW50VHlwZS5jbGFzcyk7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IEVhc3lNb2NrLmNyZWF0ZU5pY2VNb2NrKEpwYVByb2plY3QuY2xhc3MpOwotCQlKYXZhVHlwZU1hcHBpbmcgbSA9IEVhc3lNb2NrLmNyZWF0ZU5pY2VNb2NrKEphdmFUeXBlTWFwcGluZy5jbGFzcyk7Ci0JCWV4cGVjdChqcHQuZ2V0UmVzb3VyY2UoKSkuYW5kU3R1YlJldHVybihmaWxlKTsKLQkJZXhwZWN0KGpwdC5nZXRKcGFQcm9qZWN0KCkpLmFuZFN0dWJSZXR1cm4oanBhUHJvamVjdCk7Ci0JCWV4cGVjdChqcHQuZ2V0TWFwcGluZygpKS5hbmRTdHViUmV0dXJuKG0pOwotCQlpZiAobmFtZSAhPSBudWxsKQotCQkJZXhwZWN0KGpwdC5nZXROYW1lKCkpLmFuZFN0dWJSZXR1cm4obmFtZSk7Ci0JCXJlcGxheShqcHQsIGpwYVByb2plY3QpOwotCQlyZXR1cm4ganB0OwotCX0KLQotCXByaXZhdGUgSUVjbGlwc2VGYWNhZGUgY3JlYXRlRWNsaXBzZUZhY2FkZSgpIHsKLQkJSUVjbGlwc2VGYWNhZGUgZmFjYWRlID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRWNsaXBzZUZhY2FkZS5jbGFzcyk7Ci0JCXJldHVybiBmYWNhZGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUZvcldvcmtzcGFjZShJRWNsaXBzZUZhY2FkZSBmYWNhZGUpIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElXb3Jrc3BhY2UuY2xhc3MpOwotCQl3b3Jrc3BhY2UuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihpc0EoSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIuY2xhc3MpLCBlcShJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0JVSUxEKSk7Ci0JCXJlcGxheSh3b3Jrc3BhY2UpOwotCQlleHBlY3QoZmFjYWRlLmdldFdvcmtzcGFjZSgpKS5hbmRTdHViUmV0dXJuKHdvcmtzcGFjZSk7Ci0JfQotCi0JcHJpdmF0ZSBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGNvbmZpZ3VyZVJlZnJlc2hFZGl0b3JQcm92aWRlcigpIHsKLQkJSURpYWdyYW1FZGl0b3IgZWRpdG9yID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRGlhZ3JhbUVkaXRvci5jbGFzcyk7Ci0JCWVkaXRvci5yZWZyZXNoKCk7Ci0JCXJlcGxheShlZGl0b3IpOwotCQlJRGlhZ3JhbVR5cGVQcm92aWRlciBkaWFncmFtUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElEaWFncmFtVHlwZVByb3ZpZGVyLmNsYXNzKTsKLQkJZXhwZWN0KGRpYWdyYW1Qcm92aWRlci5nZXREaWFncmFtRWRpdG9yKCkpLmFuZFN0dWJSZXR1cm4oZWRpdG9yKTsKLQkJcmVwbGF5KGRpYWdyYW1Qcm92aWRlcik7Ci0JCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgcHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlleHBlY3QocHJvdmlkZXIuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpKS5hbmRTdHViUmV0dXJuKGRpYWdyYW1Qcm92aWRlcik7Ci0JCXJldHVybiBwcm92aWRlcjsKLQl9Ci0KLQlwcml2YXRlIElNYXJrZXJEZWx0YSByZXBsYXlEZWx0YShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSU1hcmtlckRlbHRhIGRlbHRhID0gRWFzeU1vY2suY3JlYXRlTW9jayhJTWFya2VyRGVsdGEuY2xhc3MpOwotCQlleHBlY3QoZGVsdGEuZ2V0UmVzb3VyY2UoKSkuYW5kU3R1YlJldHVybihyZXNvdXJjZSk7Ci0JCXJlcGxheShkZWx0YSk7Ci0JCXJldHVybiBkZWx0YTsKLQl9Ci0KLQlwcml2YXRlIEpQQVNvbHZlciBjcmVhdGVTb2x2ZXIoSUVjbGlwc2VGYWNhZGUgZmFjYWRlLCBJSlBBRWRpdG9yVXRpbCB1dGlsKSB7Ci0JCXJldHVybiBuZXcgSlBBU29sdmVyKGZhY2FkZSwgdXRpbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBlcVJlc291cmNlTGlzdGVuZXIoSUFyZ3VtZW50TWF0Y2hlciBtYXRjaGVyKSB7Ci0JCUVhc3lNb2NrLnJlcG9ydE1hdGNoZXIobWF0Y2hlcik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlRXZlbnQgcmVwbGF5RXZlbnQoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCUlSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJUmVzb3VyY2VDaGFuZ2VFdmVudC5jbGFzcyk7Ci0JCWV4cGVjdChldmVudC5maW5kTWFya2VyRGVsdGFzKG51bGwsIHRydWUpKS5hbmRTdHViUmV0dXJuKG5ldyBJTWFya2VyRGVsdGFbXSB7IHJlcGxheURlbHRhKHJlc291cmNlKSB9KTsKLQkJcmVwbGF5KGV2ZW50KTsKLQkJcmV0dXJuIGV2ZW50OwotCX0KLQotCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlRXZlbnQgcmVwbGF5RW1wdHlFdmVudCgpIHsKLQkJSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElSZXNvdXJjZUNoYW5nZUV2ZW50LmNsYXNzKTsKLQkJZXhwZWN0KGV2ZW50LmZpbmRNYXJrZXJEZWx0YXMobnVsbCwgdHJ1ZSkpLmFuZFN0dWJSZXR1cm4obmV3IElNYXJrZXJEZWx0YVtdIHt9KTsKLQkJcmVwbGF5KGV2ZW50KTsKLQkJcmV0dXJuIGV2ZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0pwYUFydGlmYWN0RmFjdG9yeVRlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9KcGFBcnRpZmFjdEZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZTdjODYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0pwYUFydGlmYWN0RmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVwbGF5OwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JRWNsaXBzZUZhY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5KUEFDcmVhdGVGYWN0b3J5OwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBKcGFBcnRpZmFjdEZhY3RvcnlUZXN0IHsKLQkKLQlTdHJpbmcgVEVTVF9QUk9KRUNUID0gIlRlc3QiOwotCXByaXZhdGUgSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIEpQQUNyZWF0ZUZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JSUVjbGlwc2VGYWNhZGUgZWNsaXBzZUZhY2FkZSA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBpbnQgY250ID0gMDsKLQkKLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmFjdG9yeSA9IEpQQUNyZWF0ZUZhY3RvcnkuaW5zdGFuY2UoKTsKLQkJanBhUHJvamVjdCA9IGZhY3RvcnkuY3JlYXRlSlBBUHJvamVjdChURVNUX1BST0pFQ1QgKyAiXyIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0JCVRocmVhZC5zbGVlcCgyMDAwKTsKLQl9Ci0JCi0JLyoKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RKcGFBcnRpZmFjdG9yeUF0dHJpYnV0ZVJlbGF0ZWRNZXRob2RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCUlGaWxlIGN1c3RvbWVyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSIsInRlc3QifSwgIkN1c3RvbWVyIik7Ci0JCUlGaWxlIGFkZHJlc3NGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQWRkcmVzcyIpOwotCQkKLQkJanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQlhc3NlcnRUcnVlKGN1c3RvbWVyRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBjdXN0b21lclR5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS50ZXN0LkN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQkJCi0JCWFzc2VydFRydWUoYWRkcmVzc0ZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYWRkcmVzc1R5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS50ZXN0LkFkZHJlc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChhZGRyZXNzVHlwZSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDIgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0KLQkJCi0JCUNyZWF0ZU9uZVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmUgZnQgPSBuZXcgQ3JlYXRlT25lVG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZShmZWF0dXJlUHJvdmlkZXIpOwotCQlJQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQgY3R4ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQuY2xhc3MpOwotCQkKLQkJQ29udGFpbmVyU2hhcGUgY3MxID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb250YWluZXJTaGFwZS5jbGFzcyk7Ci0JCUNvbnRhaW5lclNoYXBlIGNzMiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29udGFpbmVyU2hhcGUuY2xhc3MpOwotCQkKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY3MxKSkuYW5kU3R1YlJldHVybih0MSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNzMikpLmFuZFN0dWJSZXR1cm4odDIpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdCh0MSkpLmFuZFN0dWJSZXR1cm4oY3MxKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QodDIpKS5hbmRTdHViUmV0dXJuKGNzMik7Ci0JCQotCQlBbmNob3IgYTEgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEFuY2hvci5jbGFzcyk7Ci0JCUFuY2hvciBhMiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQW5jaG9yLmNsYXNzKTsKLQkJZXhwZWN0KGExLmdldFBhcmVudCgpKS5hbmRTdHViUmV0dXJuKGNzMSk7Ci0JCWV4cGVjdChhMi5nZXRQYXJlbnQoKSkuYW5kU3R1YlJldHVybihjczIpOwotCQlleHBlY3QoY3R4LmdldFNvdXJjZUFuY2hvcigpKS5hbmRTdHViUmV0dXJuKGExKTsKLQkJZXhwZWN0KGN0eC5nZXRUYXJnZXRBbmNob3IoKSkuYW5kU3R1YlJldHVybihhMik7Ci0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTEgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGN1c3RvbWVyRmlsZSk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UyID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShhZGRyZXNzRmlsZSk7Ci0JCQotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdCh0MSkpLmFuZFN0dWJSZXR1cm4oY3UxKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQodDIpKS5hbmRTdHViUmV0dXJuKGN1Mik7Ci0JCQotCQlDb25uZWN0aW9uIGNvbm4gPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbm5lY3Rpb24uY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmFkZElmUG9zc2libGUoKElBZGRDb250ZXh0KUVhc3lNb2NrLmFueU9iamVjdCgpKSkuYW5kU3R1YlJldHVybihjb25uKTsKLQkJcmVwbGF5KGZlYXR1cmVQcm92aWRlciwgYTEsIGEyLCBjczEsIGNzMiwgY3R4KTsKLQkJZnQuY3JlYXRlKGN0eCk7Ci0JCU9uZVRvT25lQmlEaXJSZWxhdGlvbiByZWwgPSBmdC5jcmVhdGVSZWxhdGlvbihjczEsIGNzMik7Ci0JCWFzc2VydE5vdE51bGwocmVsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWwuZ2V0SWQoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWxUeXBlLk9ORV9UT19PTkUsIHJlbC5nZXRSZWxUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVsRGlyLkJJLCByZWwuZ2V0UmVsRGlyKCkpOwotCQlhc3NlcnROb3ROdWxsKHQxLmdldEF0dHJpYnV0ZU5hbWVkKHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSkpOwotCQlhc3NlcnROb3ROdWxsKHQyLmdldEF0dHJpYnV0ZU5hbWVkKHJlbC5nZXRJbnZlcnNlQXR0cmlidXRlTmFtZSgpKSk7CQkKLQkJCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSA9IHQxLmdldEF0dHJpYnV0ZU5hbWVkKHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaGFzRW50aXR5QW5ub3RhdGlvbih0MSkpOwotCQkKLQkJLy9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGExID0gIEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldFJlbGF0ZWRBdHRyaWJ1dGUodDEsIHQyKTsKLQkJLy9hc3NlcnROb3ROdWxsKGpwYTEpOwotCQkvL2Fzc2VydFNhbWUoanBhMSwgdDIuZ2V0QXR0cmlidXRlTmFtZWQocmVsLmdldEludmVyc2VBdHRyaWJ1dGVOYW1lKCkpKTsKLQkJCi0JCUxpc3Q8U3RyaW5nPiBhbnMgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uU3RyaW5ncyhqcGEpOwotCQlhc3NlcnROb3ROdWxsKGFucyk7Ci0JCWFzc2VydFRydWUoYW5zLnNpemUoKSA+IDApOwkJCi0JCWFzc2VydFRydWUoYW5zLmNvbnRhaW5zKCJAT25lVG9PbmUiKSk7CQkKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZGVsZXRlQXR0cmlidXRlKHQxLCByZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCksIGZlYXR1cmVQcm92aWRlcik7Ci0JCWpwYSA9IHQxLmdldEF0dHJpYnV0ZU5hbWVkKHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSk7Ci0JCWFzc2VydE51bGwoanBhKTsKLQl9Ci0JKi8KLQkKLQlAVGVzdCAKLQlwdWJsaWMgdm9pZCB0ZXN0RW50aXR5TGlzdGVuZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwkKLQkJSUZpbGUgY3VzdG9tZXJGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQ3VzdG9tZXIiKTsKLQkJCi0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShjdXN0b21lckZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3VzdG9tZXJUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5DdXN0b21lciIpOwotCQlhc3NlcnROb3ROdWxsKGN1c3RvbWVyVHlwZSk7Ci0JCQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQxID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1MSA9IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oY3VzdG9tZXJGaWxlKTsJCQotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdCh0MSkpLmFuZFN0dWJSZXR1cm4oY3UxKTsKLQkJcmVwbGF5KGZlYXR1cmVQcm92aWRlcik7CQkKLQotLy8JCUNhdGNoZXMgcHJvYmxlbSB3aXRoIG11bHRpcGxlIGV2ZW50cyAtIEVjbGlwc2UgYnVnemlsbGEgYnVnICMyNTkxMDMKLQkJCi0vLwkJY250ID0gMDsKLS8vCQl0MS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIobmV3IEVudGl0eUF0dHJpYnV0ZXNDaGFuZ2VMaXN0ZW5lcigpKTsKLS8vCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5kZWxldGVBdHRyaWJ1dGUodDEsICJpZCIsIGZlYXR1cmVQcm92aWRlcik7Ci0vLwkJVGhyZWFkLnNsZWVwKDEwMDAwKTsKLS8vCQlhc3NlcnRUcnVlKCJUaGUgbGlzdGVuZXIgaXMgYmVpbmcgdHJpZ2dlcmVkICIgKyBjbnQgKyAiIHRpbWVzIiwgY250ID09IDEpOwotCQkKLQl9Ci0JCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGZpbGUpOwotCX0KLQotCQotCQotCXB1YmxpYyBjbGFzcyBFbnRpdHlBdHRyaWJ1dGVzQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQkKLQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBhcmcwKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgYXJnMCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBhcmcwKSB7Ci0JCQljbnQrKzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBhcmcwKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBhcmcwKSB7Ci0JCX0KLQl9OwotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvVVJMRXNjYXBlci5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC91dGlsL1VSTEVzY2FwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE2NmJhMi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvVVJMRXNjYXBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1wdWJsaWMgY2xhc3MgVVJMRXNjYXBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNwZWNpYWxDaGFycyA9ICIgPD4jJXt9fF5+W11gOz9APSYkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXNjYXBlQ29kZXMgID0gIiUyMCUzQyUzRSUyMyUyNSU3QiU3RCU3QyU1RSU3RSU1QiU1RCU2MCUzQiUzRiU0MCUzRCUyNiUyNCI7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyBzKSB7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIHJlcyA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjaCA9IHMuY2hhckF0KGkpOwotCQkJaW50IGluZCA9IHNwZWNpYWxDaGFycy5pbmRleE9mKGNoKTsKLQkJCXJlcy5hcHBlbmQoKChpbmQgPj0gMCkgPyBlc2NhcGVDb2Rlcy5zdWJzdHJpbmcoaW5kICogMywgaW5kICogMyArIDMpIDogY2gpKTsgICAKLQkJfQotCQlyZXR1cm4gcmVzLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3Rlc3QueG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGFkMTg4Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0JPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLQk8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotCTxlY2hvIG1lc3NhZ2U9ImJhc2VkaXIgJHtiYXNlZGlyfSIgLz4KLQk8ZWNobyBtZXNzYWdlPSJlY2xpcHNlIHBsYWNlICR7ZWNsaXBzZS1ob21lfSIgLz4KLQk8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgcGx1Z2luLW5hbWUgLS0+Ci0JPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMiLz4KLQk8ZWNobyBsZXZlbD0iZGVidWciIG1lc3NhZ2U9InRlc3RSb290OiAke3Rlc3RSb290fSIgLz4KLQk8ZmFpbCBtZXNzYWdlPSJ0ZXN0Um9vdCBtdXN0IGJlIHNldCIgdW5sZXNzPSJ0ZXN0Um9vdCIgLz4KLQotCTwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLQk8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotCTwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0c3RhbXAvPgotCQk8ZGVsZXRlPgotCQkJPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotCQk8L2RlbGV0ZT4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0JPHRhcmdldCBuYW1lPSJzdWl0ZTEiPgotICAgIAk8cHJvcGVydHkgZmlsZT0iJHt0ZXN0Um9vdH0vdGVzdFNlcnZlci5wcm9wZXJ0aWVzIi8+Ci0JICAgIDxwcm9wZXJ0eSBuYW1lPSJqcGFlLWZvbGRlciIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9qcGFlX2ZvbGRlciIvPgotCSAgICA8ZGVsZXRlIGRpcj0iJHtqcGFlLWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+Ci0JCQotCQk8YW50IHRhcmdldD0idWktdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke2pwYWUtZm9sZGVyfSIvPgotCQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5BbGxKcGFFZGl0b3JUZXN0cyIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSItRG9yZy5lY2xpcHNlLmpwdC5qcGEuamFyPSR7dGVzdERpcn0vJHtqcHQtcGVyc2lzdGVuY2UtamFyfSAtRG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5qYXI9JHt0ZXN0RGlyfS8ke2pwdC1lY2xpcHNlbGluay1qYXJ9Ii8+Ci0JCTwvYW50PgotPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLQk8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0JPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotCTx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0JPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotCTx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LCBzdWl0ZTEsIGNsZWFudXAiPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0Pgo=